diff --git a/.gitignore b/.gitignore index 87bbe57..7a3c259 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .cache main compile_commands.json +vendor diff --git a/build b/build index 14372e0..e44645b 100755 --- a/build +++ b/build @@ -1,6 +1,29 @@ #!/bin/bash -bear -- clang++ -g -c -Wno-nullability-completeness -DVK_NO_PROTOTYPES -I$VULKAN_SDK/include vulkan_profiles/vulkan_profiles.cpp main.cpp -bear -a -- clang -g -c -DVK_NO_PROTOTYPES -Ivulkan_profiles -I$VULKAN_SDK/include $VULKAN_SDK/include/volk/volk.c wapp/wapp.c -bear -a -- clang++ -g -DVK_NO_PROTOTYPES -lSDL3 -lglm -ltinyobjloader -o main *.o -rm *.o +build_ktx () { + cmake ktx -B ktx/build \ + -D KTX_FEATURE_LOADTEST_APPS=ON \ + -D KTX_FEATURE_DOC=ON \ + -D CMAKE_EXPORT_COMPILE_COMMANDS=1 \ + -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_INSTALL_PREFIX=$(realpath vendor) \ + -D CMAKE_CXX_STANDARD=17 \ + -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_CXX_FLAGS="-msse4.1" + cmake --build ktx/build --config Release + cmake --install ktx/build +} + +build_app () { + bear -- clang++ -g -c -Wno-nullability-completeness -DVK_NO_PROTOTYPES -I$VULKAN_SDK/include -Ivendor/include vulkan_profiles/vulkan_profiles.cpp main.cpp + bear -a -- clang -g -c -DVK_NO_PROTOTYPES -Ivulkan_profiles -I$VULKAN_SDK/include $VULKAN_SDK/include/volk/volk.c wapp/wapp.c + bear -a -- clang++ -g -DVK_NO_PROTOTYPES -Lvendor/lib -lSDL3 -lglm -ltinyobjloader -lktx -o main *.o +} + +clean_obj () { + rm *.o +} + +build_ktx +build_app +clean_obj diff --git a/ktx/BUILDING.md b/ktx/BUILDING.md new file mode 100755 index 0000000..257cbc8 --- /dev/null +++ b/ktx/BUILDING.md @@ -0,0 +1,718 @@ + + + +Building KTX +============ + +KTX uses the the [CMake](https://cmake.org) build system. Depending on your +platform and how you configure it, it will create project/build files (e.g. an Xcode project, a Visual Studio solution or Make files) that allow you to +build the software and more (See [CMake generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html)). + +KTX consist of the following parts + +- The `libktx` main library +- Command line tools (for Linux / macOS / Windows) +- Load test applications (for [OpenGL® 3](https://www.khronos.org/opengl), [OpenGLES®](https://www.khronos.org/opengles) or [Vulkan®](https://www.khronos.org/vulkan)) +- Documentation + +Supported platforms (please see their specific requirements first) + +- [GNU/Linux](#gnulinux) +- [Apple macOS/iOS](#apple-macosios) +- [Web/Emscripten](#webemscripten) +- [Windows](#windows) +- [Android](#android) + +The minimal way to a build is to clone this repository and run the following in a terminal + +```bash +# Navigate to the root of your KTX-Software clone (replace with +# your actual path) +cd /path/to/KTX-Software + +# This generates build/project files in the sub-folder `build` +cmake . -B build + +# Compile the project +cmake --build build +``` + +This creates the `libktx` library and the command line tools. To create the complete project generate the project like this: + +```bash +cmake . -B build -D KTX_FEATURE_LOADTEST_APPS=ON -D KTX_FEATURE_DOC=ON +``` + +If you need the library to be static, add `-D BUILD_SHARED_LIBS=OFF` to the CMake configure command (always disabled on iOS and Emscripten). + +> **Note:** +> +> When linking to the static library, make sure to +> define `KHRONOS_STATIC` before including KTX header files. +> This is especially important on Windows. + +If you want to run the CTS tests (recommended only during KTX development) +add `-D KTX_FEATURE_TOOLS_CTS=ON` to the CMake configure command and fetch +the CTS submodule. For more information see [Conformance Test Suite](#conformance-test-suite). + +If you want the Basis Universal encoders in `libktx` to use OpenCL +add `-D BASISU_SUPPORT_OPENCL=ON` to the CMake configure command. + +> **Note:** +> +> There is very little advantage to using OpenCL in the context +> of `libktx`. It is disabled in the default build configuration. + +> **Note:** +> +> When building from a source `tar.gz` and not from the git repository directly, +> it is recommended to set the variable `KTX_GIT_VERSION_FULL` to the +> associated git tag (e.g `v4.3.2`) +> +> ```bash +> cmake . -G Ninja -B build -DKTX_GIT_VERSION_FULL=v4.3.2 +> ``` +> Use with caution. + +Building +-------- + +### GNU/Linux + +You need to install the following + +- [CMake](https://cmake.org) +- gcc and g++ from the [GNU Compiler Collection](https://gcc.gnu.org) +- [GNU Make](https://www.gnu.org/software/make) or [Ninja](https://ninja-build.org) (recommended) +- [Doxygen](#doxygen) and [dot](#dot-\(graphviz\)) (only if generating documentation) + +To build `libktx` such that the Basis Universal encoders will use +OpenCL you need + +- OpenCL headers +- OpenCL driver + +On Ubuntu and Debian these can be installed via + +```bash +sudo apt install build-essential cmake libzstd-dev ninja-build doxygen graphviz opencl-c-headers mesa-opencl-icd +``` + +`mesa-opencl-icd` should be replaced by the appropriate package for your GPU. + +On Fedora and RedHat these can be installed via + +```bash +sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libzstd-devel ninja-build doxygen graphviz mesa-libOpenCL +``` + + +To build the load test applications you also need to install the following + +- [vcpkg](#vcpkg) (which will automatically install the actual dependencies: [SDL3](sdl3) and [assimp](assimp)) +- OpenGL development libraries +- Vulkan development libraries +- [Vulkan SDK](#vulkan-sdk) +- zlib development library + +On Ubuntu and Debian these can be installed via + +```bash +sudo apt install libsdl3-dev libgl1-mesa-glx libgl1-mesa-dev libvulkan1 libvulkan-dev libassimp-dev +``` + +On Fedora and RedHat these can be installed via + +```bash +sudo dnf install SDL3-devel mesa-libGL mesa-libGL-devel mesa-vulkan-drivers assimp-devel +``` + +KTX requires `glslc`, which comes with [Vulkan SDK](#vulkan-sdk) (in sub- +folder `x86_64/bin/glslc`). Make sure the complete path to the tool is in +in your environment's `PATH` variable. If you've followed Vulkan SDK +install instructions for your platform this should already be set up. You +can test it by running + +```bash +# Should output version number. +glslc --version +# If it fails, try this then repeat the above. +export PATH=$PATH:/path/to/vulkansdk/x86_64/bin +``` + +You should be able then to build like this + +```bash +# First either configure a debug build of libktx and the tools +cmake . -G Ninja -B build +# ...or alternatively a release build including all targets +cmake . -G Ninja -B build -DCMAKE_BUILD_TYPE=Release -D KTX_FEATURE_LOADTEST_APPS=ON -D KTX_FEATURE_DOC=ON + +# Compile the project +cmake --build build +``` + +### Apple macOS/iOS + +You need to install the following + +- CMake +- Xcode or, if using a different build system, the Xcode command line tools. +- [Doxygen](#doxygen) and [dot](#dot-\(graphviz\)) (only if generating documentation) + +To build the load test applications you also need to install + +- [vcpkg](#vcpkg) (which will automatically install the actual dependencies: [SDL3](sdl3) and [assimp](assimp)) +- [Vulkan SDK](#vulkan-sdk) + +Other dependencies (like OpenGL) come with Xcode. + +For the load test applications you must also set these environment variables: + +- `VCPKG_ROOT` to the location where you installed [vcpkg](#vcpkg). +- `VULKAN_SDK` to the `macOS` folder in your VulkanSDK installation. This can be set with the command `. /path/to/your/vulkansdk/setenv.sh`. + +> **Note:** If using the CMake GUI or Xcode IDE you must ensure `VULKAN_SDK` is +> made available to them. + +> **Note:** `VULKAN_SDK` is essential when bulding for iOS. When building for +> macOS it is not necessary if you selected _System Global Installation_ when +> installing the SDK. + +> **Note:** the `iphoneos` or `MacOSX` SDK version gets hardwired into the +> generated projects. After installing an Xcode update that has the SDK for a +> new version of iOS, builds will fail. The only way to remedy this is to delete +> the CMake cache and reconfigure and regenerate from scratch. Use of a +> [`CMakeUserPresets.json`](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html) +> file to capture unchanging settings is recommended. + +#### macOS + +To build for macOS: + +```bash +# This creates an Xcode project at `build/mac/KTX-Software.xcodeproj` +# containing the libktx and tools targets. +mkdir build +cmake -G Xcode -B build/mac + +# If you want to build the load test apps as well, set the +# `KTX_FEATURE_LOADTEST_APPS` and `CMAKE_TOOLCHAIN_FILE` +# parameters. vcpkg will automatically install the dependencies. +cmake -GXcode -Bbuild/mac -D KTX_FEATURE_LOADTEST_APPS=ON -D CMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake + +# Compile the project +cmake --build build/mac +``` +##### Apple Silicon and Universal Binaries + +Macs are either based on Intel or the newer Apple Silicon architecture. By default CMake configures to build for your host's platform, whichever it is. If you want to cross compile universal binaries (that support both platforms), add the parameter `-DCMAKE_OSX_ARCHITECTURES="\$(ARCHS_STANDARD)"` to cmake. + +> **Known limitations:** +> - Intel Macs have support for SSE, but if you're building universal binaries, +> you have to disable SSE or the build will fail + +Example how to build universal binaries + +```bash +# Configure universal binaries and disable SSE +cmake -G Xcode -B build-macos-universal -D CMAKE_OSX_ARCHITECTURES="\$(ARCHS_STANDARD)" -D BASISU_SUPPORT_SSE=OFF +# Build +cmake --build build-macos-universal +# Easy way to check if the resulting binaries are universal + +file build-macos-universal/Debug/libktx.dylib +# outputs: +# build-macos-universal/Debug/libktx.dylib: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm64] +# build-macos-universal/Debug/libktx.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 +# build-macos-universal/Debug/libktx.dylib (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64 + +file build-macos-universal/Debug/ktx +# outputs: +# build-macos-universal/Debug/ktx: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64] +# build-macos-universal/Debug/ktx (for architecture x86_64): Mach-O 64-bit executable x86_64 +# build-macos-universal/Debug/ktx (for architecture arm64): Mach-O 64-bit executable arm64 +``` + +To explicity build for one or the other architecture use +`-D CMAKE_OSX_ARCHITECTURES=arm64` or `-D CMAKE_OSX_ARCHITECTURES=x86_64` + +##### macOS signing + +To sign the applications you need to set the following CMake variables: + +| Name | Value | +| :--: | ----- | +| XCODE\_CODE\_SIGN\_IDENTITY | Owner* of the _Developer ID Application_ certificate to use for signing. | +| XCODE\_DEVELOPMENT\_TEAM | Development team of the certificate owner. + +To sign the installation package you need to set the following variables: + +| Name | Value | +| :--: | ----- | +| PRODUCTBUILD\_IDENTITY\_NAME | Owner* of the _Developer ID Installer_ certificate to use for signing. | +| PRODUCTBUILD\_KEYCHAIN\_PATH | Path to the keychain file with the certificate. Blank if its in the default keychain. + +#### iOS + +To build for iOS: + +```bash +# This creates an Xcode project at `build/ios/KTX-Software.xcodeproj` +# containing the libktx targets. +mkdir build # if it does not exist +cmake -G Xcode -B build/ios -D CMAKE_SYSTEM_NAME=iOS + +# This creates a project to build the load test apps as well. +cmake -G Xcode -B build/ios -D KTX_FEATURE_LOADTEST_APPS=ON -D CMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake + +# Compile the project +cmake --build build -- -sdk iphoneos +``` + +If using the CMake GUI, when it asks you to specify the generator for the project, you need to check _Specify options for cross-compiling_ and on the next screen make sure _Operating System_ is set to `iOS`. + +##### iOS signing + +To sign the applications you need to set the following CMake variables: + +| Name | Value | +| :---: | ----- | +| XCODE\_CODE\_SIGN\_IDENTITY | Owner* of the _Apple Development_ certificate to use for signing. | +| XCODE\_DEVELOPMENT\_TEAM | Development team used to create the Provisioning Profile. This may not be the same as the team of the _Apple Development_ certificate owner. +| XCODE\_PROVISIONING\_PROFILE | Name of the profile to use. + +\* _Owner_ is what is formally known as the _Subject Name_ of a certificate. It +is the string displayed by the Keychain Access app in the list of installed +certificates and shown as the value of the _Common Name_ field of the _Subject +Name_ section of the details shown after double-clicking the certificate. + +### Web/Emscripten + +There are two ways to build the Web version of the software: using Docker or using your own Emscripten installation. + +#### Using Docker + +Install [Docker Desktop](https://www.docker.com/products/docker-desktop) which is available for GNU/Linux, macOS and Windows. + +In the repo root run + +```bash +scripts/build_wasm_docker.sh +``` + +This will build both Debug and Release configurations and will include the load test application. Builds are done with the official Emscripten Docker image. Output will be written to the folders `build/web-{debug,release}`. + +If you are using Windows you will need a Unix-like shell such as the one with _Git for Windows_ or one in Windows Subsystem for Linux (WSL) to run this script. + +#### Using Your Own Emscripten Installation + +Install [Emscripten](https://emscripten.org) and follow the [install instructions](https://emscripten.org/docs/getting_started/downloads.html) closely. After you've set up your emscripten environment in a terminal, run the following: + +**Debug:** + +```bash +# Configure +emcmake cmake -B build-web-debug . -D CMAKE_BUILD_TYPE=Debug + +# Build +cmake --build build-web-debug --config Debug +``` + +**Release:** + +```bash +# Configure +emcmake cmake -B build-web . + +# Build +cmake --build build-web +``` + +To include the load test application into the build add `-DKTX_FEATURE_LOADTEST_APPS=ON` to either of the above configuration steps. + +Web builds create three additional targets: + +- `ktx_js` (libktx javascript wrapper - with write support) +- `ktx_js_read` (libktx_read javascript wrapper - read-only) +- `msc_basis_transcoder_js` (transcoder wrapper) + +> **Note:** The libktx wrappers do not use the transcoder wrapper. They directly uses the underlying c++ transcoder. + +### Windows + +You need to install the following + +- CMake +- Visual Studio 2022. VS2025 will likely work but is untested. +- [Doxygen](#doxygen) and [dot](#dot\(graphviz\)) (only if generating documentation) + +To build the load test applications you also need to install + +- [vcpkg](#vcpkg) (which will automatically install the actual dependencies: [SDL3](sdl3) and [assimp](assimp)) +- [Vulkan SDK](#vulkan-sdk) + +For the load test applications you must also set these environment variables: + +- `VCPKG_ROOT` to the location where you installed [vcpkg](#vcpkg). +- `VULKAN_SDK` to the location where you installed VulkanSDK. Normally this is set during installation of the SDK. + +Additional requirement for the OpenGL ES version of the load tests application + +- [OpenGL ES emulator](#opengl-es-emulator-for-windows). + +CMake can create solutions for Microsoft Visual Studio. + +> **Note:** x86 (32-bit) Windows is not supported. + +To build for Windows + +```powershell +# This creates a solution at `build/KTX-Software.sln` +# containing the libktx and tools targets. +cmake -B build . + +# If you want to build the load test apps as well, set the +# `KTX_FEATURE_LOADTEST_APPS` and `CMAKE_TOOLCHAIN_FILE` +# parameters. vcpkg will automatically install the dependencies. +cmake -B build . -D KTX_FEATURE_LOADTEST_APPS=ON -D CMAKE_TOOLCHAIN_FILE=$env:VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake + +# Compile the project +cmake --build build +``` + +To configure for Universal Windows Platform (Windows Store) you have to + +- Set the platform to `x64`, `ARM` or `ARM64` (depending on your target device/platform) +- Set the system name to `WindowsStore` +- Provide a system version (e.g. `10.0`) + +> **Note:** Support is currently limited to `ktx` and `libktx_read` (no tools, tests or load tests apps) + +Example UWP configuration + +```powershell +cmake . -A ARM64 -B build_uwp_arm64 -D CMAKE_SYSTEM_NAME:String=WindowsStore -D CMAKE_SYSTEM_VERSION:String="10.0" +# Build `ktx.dll` only +cmake -B build_uwp_arm64 --target ktx +``` + +A `bash` shell is needed by the `mkversion` script used during the build. If you installed your `git` via the +[Git for Windows](https://gitforwindows.org/) package you are good to go. +Alternatives are +[Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install) plus a Linux distribution or [Cygwin](https://www.cygwin.com/). A contribution of a PowerShell equivalent script will be welcomed. + +The NSIS compiler is needed if you intend to build packages. + +CMake can include OpenGL ES versions of the KTX loader tests in the +generated solution. To build and run these you need to install an +OpenGL ES emulator. See [below](#opengl-es-emulator-for-windows). + +##### Windows signing + +To sign applications and the NSIS installer you need to import your certificate to an Azure Key Vault or to the Current User or Local Machine certificate store. +The latter can be done interactively with Windows' commands `certmgr` and +`certlm` respectively. You need to set the following CMake variables to +turn on signing: + +| Name | Value | +| ---: | ----- | +| CODE\_SIGN\_KEY\_VAULT | Where the signing certificate is stored. One of _Azure_, _Machine_, _User_. | +| CODE\_SIGN\_TIMESTAMP\_URL | URL of the timestamp server to use. Usually provided by the issuer of your certificate. Timestamping is required as it keeps the signatures valid even after certificate expiration. + +The following additional variables must be set if using Azure: + +| Name | Value | +| ---: | ----- | +| AZURE\_KEY\_VAULT\_CERTIFICATE | Name of the certificate in Azure Key Vault. +| AZURE\_KEY\_VAULT\_CLIENT\_ID | Id of an application (Client) registered with Azure that has permission to access the certificate. +| AZURE\_KEY\_VAULT\_CLIENT\_SECRET | Secret to authenticate access to the Client. +| AZURE\_KEY\_VAULT\_TENANT\_ID | Id of the Azure Active Directory (Tenant) holding the Client. +| AZURE\_KEY\_VAULT\_URL | URL of the key vault + +If using a local certificate store the following variables must be set instead: + +| Name | Value | +| ---: | ----- | +| LOCAL\_KEY\_VAULT\_SIGNING\_IDENTITY | Subject Name of code signing certificate. Displayed in 'Issued To' field of cert{lm,mgr}. Overriden by LOCAL\_KEY\_VAULT\_CERTIFICATE\_THUMBPRINT. +| LOCAL\_KEY\_VAULT\_CERTIFICATE\_THUMBPRINT | Thumbprint of the certificate to use. Use this instead of LOCAL\_KEY\_VAULT\_SIGNING\_IDENTITY when you have multiple certificates with the same identity. + +#### OpenGL ES Emulator for Windows + +The `es1loadtests` and `es3loadtests` targets on Windows require an +OpenGL ES emulator. +[Imagination Technologies PowerVR](https://community.imgtec.com/developers/powervr/graphics-sdk/). +emulator is recommended. Any of the other major emulators listed below could also be used: + +* [Qualcomm Adreno](https://developer.qualcomm.com/software/adreno-gpu-sdk/tools) +* [Google ANGLE](https://chromium.googlesource.com/angle/angle/)* +* [ARM Mali](http://malideveloper.arm.com/resources/tools/opengl-es-emulator/) + +If you want to run the `es1loadtests` you will need to use +Imagination Technologies' PowerVR emulator as that alone supports OpenGL ES +1.1. You must set the CMake configuration variable `OPENGL_ES_EMULATOR` to the directory containing the .lib files of your chosen emulator and ensure the .dlls are in your `$env:PATH` or co-located with `es1loadtests`. + +*You will need to build ANGLE yourself. + +#### OpenCL for Windows + +To build `libktx` such that the Basis Universal encoders will use +OpenCL you need an OpenCL driver, which is typically included in the driver for your GPU, and an OpenCL SDK. If no SDK is present, the build will use the headers and library that are included in this repo. + +### Android + +Support is currently limited to libktx and libktx_read (no tools, tests or loadtest apps) + +Requirements: + +- [CMake](https://cmake.org) +- [Android NDK](https://developer.android.com/ndk) + +The path to the NDK, a CMake toolchain file (that comes with the NDK), the desired Android ABI and minimum API level have to be provided when configuring with CMake (see [Android NDK CMake guide](https://developer.android.com/ndk/guides/cmake) for more details/settings). Example: + +```bash +export ANDROID_NDK=/path/to/Android_NDK #This is the location of Android NDK +# Configure +cmake . -B "build-android" \ +-DANDROID_PLATFORM=android-24 \ # API level 24 equals Android 7.0 +-DANDROID_ABI="arm64-v8a" \ # target platform +-DANDROID_NDK="$ANDROID_NDK" \ +-DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" \ # Toolchain file in a subfolder of the NDK +-DBASISU_SUPPORT_SSE=OFF # Disable SSE + +# Build +cmake --build "build-android" +``` + +> Note: SSE has to be disabled currently (for ABIs x86 and x86_64) due to [an issue](https://github.com/BinomialLLC/basis_universal/pull/233). + +Conformance Test Suite +------------ + +The submodule of [CTS Repository](https://github.com/KhronosGroup/KTX-Software-CTS/) is optional and +only required for running the CTS tests during KTX development. If the CTS test suit is desired it +can be fetched during cloning with the additional `--recurse-submodules` git clone flag: + +```bash +git clone --recurse-submodules git@github.com:KhronosGroup/KTX-Software.git +``` + +If the repository was already cloned or whenever the submodule ref changes the submodule has to be +updated with: + +```bash +git submodule update --init --recursive tests/cts +``` + +(For more information on submodules see the [git documentation](https://git-scm.com/book/en/v2/Git-Tools-Submodules).) + +Once the submodule is fetched the CTS tests can be enabled with the `KTX_FEATURE_TOOLS_CTS` +cmake option during cmake configuration. Please note that for `KTX_FEATURE_TOOLS_CTS` to take +effect both `KTX_FEATURE_TESTS` and `KTX_FEATURE_TOOLS` has to be also enabled. +The CTS integrates into `ctest` so running `ctest` will also execute the CTS tests too. +The test cases can be limited to the CTS tests with `ctest -R ktxToolsTest`. + +Example for development workflow with CTS testing: + +```bash +# Git clone and submodule fetch +git clone git@github.com:KhronosGroup/KTX-Software.git +cd KTX-Software/ +git submodule update --init --recursive tests/cts +# Configure +mkdir build +cmake -B build . -DKTX_FEATURE_DOC=ON -DBUILD_SHARED_LIBS=OFF -DKTX_FEATURE_TOOLS=ON -DKTX_FEATURE_TESTS=ON -DKTX_FEATURE_TOOLS_CTS=ON +# Build everything (depending on workflow its better to build the specific target like 'ktxtools'): +cmake --build build --target all +# Run every test case: +ctest --test-dir build +# Run only the CTS test cases: +ctest --test-dir build -R ktxToolsTest +``` + +To create and update CTS test cases and about their specific features and usages +see the [CTS documentation](https://github.com/KhronosGroup/KTX-Software-CTS/blob/main/README.md). + +Generated Source Files (project developers only) +------------ +All but a few project developers can ignore this section. The files discussed here only need to be re-generated when formats are added to Vulkan or errors are discovered. These will be rare occurrences. + +The following files related to the the VkFormat enum are generated from `vulkan_core.h`: + +- lib/vkformat_check.c +- lib/vkformat_enum.h +- lib/vkformat_list.inl +- lib/vkformat_str.c +- lib/vkformat_typesize.c +- lib/dfd/dfd2vk.inl +- lib/dfd/vk2dfd.inl +- interface/java\_binding/src/main/java/org/khronos/ktxVkFormat.java +- interface/python\_binding/pyktx/vk\_format.py +- interface/js\_binding/vk\_format.inl + + +The following files are generated from the mapping database in the KTX-Specification repo by `generate_format_switches.rb`: + +- lib/vkFormat2glFormat.inl +- lib/vkFormat2glInternalFormat.inl +- lib/vkFormat2glType.inl + +All are generated by the `mkvk` target which is only configured if `KTX_GENERATE_VK_FILES` is set to `ON` at the time of CMake configuration. Since this setting is labelled *Advanced* it will not be visible in the CMake GUI unless `Advanced` is set. + +Configuring this target adds some dependencies which are discussed below. + +Dependencies +------------ + +### awk + +Needed if you are [regenerating source files](#generatedsourcefiles(projectdevelopersonly)). + +Standard on GNU/Linux and macOS. Available on Windows as part of Git for +Windows, WSL (Windows Subsystem for Linux) or Cygwin. Note that no CMake +`AWK_EXECUTABLE` cache variable is used because *awk* is standard on GNU/Linux +and macOS and on Windows *awk* tends to be available when *bash* is and there +the *awk* script is invoked via *bash*. + +### bash + +Needed for the script that creates the version numbers from `git describe` output. Also needed if you are [regenerating source files](#generatedsourcefiles(projectdevelopersonly)). + +Standard on GNU/Linux and macOS. Available on Windows as part of Git for +Windows, WSL (Windows Subsystem for Linux) or Cygwin. + +#### vcpkg + +This package manager is needed to install the [SDL3](#sdl3) and [assimp](assimp) +dependencies of the KTX load test applications on macOS and Windows. Since +KTX-Software uses vcpkg's manifest mode, installation of the dependencies is +automatic. + +Clone the [vcpkg](https://github.com/microsoft/vcpkg) repo and run its +bootstrap: + +```bash + cd /place/to/clone/vcpkg + git clone https://github.com/microsoft/vcpkg + cd vcpkg + ./bootstrap-vcpkg.sh -disableMetrics + # On Windows use ./bootstrap-vcpkg.bat +``` + +For more information see the +[vcpkg with CMake](https://learn.microsoft.com/vcpkg/get_started/get-started) +Getting Started guide. Ignore all but the installation instructions. Set the +environment variable `VCPKG_ROOT` to where you have installed _vcpkg_ and set +`CMAKE_TOOLCHAIN_FILE` to `$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake` when +using CMake to configure your project. + +### SDL3 + +Simple Direct Media Layer. Needed if you want to build the KTX load tests. + +On GNU_Linx, iOS, macOS and Windows it will be automatically installed by +[vcpkg](#vcpkg). Libraries installed by other package managers are typically +not redistributable or bundle-able. + +Canonical source is at https://github.com/libsdl-org/SDL/tree/SDL3. + +### assimp + +Open Asset Import Library. Needed if you want to build the KTX load tests. + +On GNU/Linux install `libassimp-dev` using your package manager. On +iOS. macOS and Windows it will be automatically installed by [vcpkg](#vcpkg). + +Canonical source is at https://github.com/assimp/assimp. + +### Vulkan SDK + +Needed if you want to build the KTX Vulkan load tests, `vkloadtests`. The minimum required version is 1.3.283.0. + +Download the [Vulkan SDK from Lunar G](https://vulkan.lunarg.com/sdk/home). + +For Ubuntu (20.04 and 22.04) install packages are available. See [Getting +Started - Ubuntu](https://vulkan.lunarg.com/doc/sdk/1.3.290.0/linux/getting_started_ubuntu.html) for detailed instructions. + +For other GNU/Linux distributions a `.tar.gz` file is available. See +[Getting Started - Tarball](https://vulkan.lunarg.com/doc/sdk/1.3.290.0/linux/getting_started.html) for detailed instructions. + +For Windows install the Vulkan SDK via the installer. + +For iOS and macOS, install the Vulkan SDK by downloading the macOS installer and double-clicking _install_ in the mounted `.dmg`. This SDK contains MoltenVK (Vulkan Portability on Metal) for both iOS and macOS. + +### Doxygen + +Needed if you want to generate _libktx_, _ktxtools_ and other documentation. + +You need a minimum of version 1.8.14 to generate the documentation correctly. +You can download binaries and also find instructions for building it from source +at [Doxygen downloads](http://www.stack.nl/~dimitri/doxygen/download.html). Make +sure the directory containing the `doxygen` executable is in your `$PATH`. + +### dot (Graphviz) + +Needed if you want Doxygen to generate include dependency, inverse include +dependency, inheritance and other graphs in the generated documentation. + +You can download binaries from +[Graphviz downloads](https://graphviz.org/download/). + +Optional. If not present documentation will be generated minus graphs. + +### OpenCL + +Needed if you want to enable the Basis Universal encoders to use OpenCL when +building _libktx_. + +On GNU/Linux and Windows you need to install an OpenCL SDK and OpenCL driver. Drivers are standard on macOS & iOS and Xcode includes the SDK. On GNU/Linux the SDK can be installed using your package manager. On Windows, the place from which to download the SDK depends on your GPU vendor. In both cases, the GPU driver typically includes an OpenCL driver. + +### Python + +*If you are building pyktx*, review the requirements in the [pyktx](interface/python_binding/README.md) README. + +### Perl + +Needed if you are [regenerating source files](#generatedsourcefiles(projectdevelopersonly)). + +On GNU/Linux install `perl` using your package manager. On macOS Perl is still +included as of macOS Sonoma. In future you may need to install an additional +package. On Windows, you need a Perl that writes Windows line endings (CRLF). +Strawberry Perl via Chocolatey is recommended. + +```powershell + choco install strawberryperl +``` + +### Ruby + +Needed if you are [regenerating source files](#generatedsourcefiles(projectdevelopersonly)). + +Ruby version 3 or later is required. On GNU/Linux install `ruby` using your +package manager. On macOS install using a package manager such as Brew or with +[RVM (Ruby Version Manager)](https://rvm.io/rvm/install). Note that Ruby is included in the Xcode command line tools but as of Xcode 15.3 is still version +2.6. On Windows use [RubyInstaller](https://rubyinstaller.org/). + +### KTX Specification Source + +Needed if you are [regenerating source files](#generatedsourcefiles(projectdevelopersonly)). + +`git clone https://github.com/KhronosGroup/KTX-Specification` to a peer +directory of your KTX-Software workarea or set the value of the +`KTX_SPECIFICATION` CMake cache variable to the location of your specification +clone. + +Formatting +------------ + +The KTX repository is transitioning to enforcing a set of formatting guides, checked during CI. +The tool used for this is [ClangFormat](https://clang.llvm.org/docs/ClangFormat.html). +To minimize friction, it is advised that one configure their environment to run ClangFormat in an automated fashion, +minimally before committing to source control, ideally on every save. + +### Visual Studio Code + +Set the [`editor.formatOnSave`](https://code.visualstudio.com/docs/editor/codebasics#_formatting) option and use one of the C/C++ formatting extensions available, most notably [ms-vscode.cpptools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) or [llvm-vs-code-extensions.vscode-clangd](https://marketplace.visualstudio.com/items?itemName=llvm-vs-code-extensions.vscode-clangd). + + +{# vim: set ai ts=4 sts=4 sw=2 expandtab textwidth=75:} diff --git a/ktx/CMakeLists.txt b/ktx/CMakeLists.txt new file mode 100644 index 0000000..5712cf8 --- /dev/null +++ b/ktx/CMakeLists.txt @@ -0,0 +1,1645 @@ +# Copyright 2015-2023 The Khronos Group Inc. +# Copyright 2022-2023 RasterGrid Kft. +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.22) + +include(CMakePrintHelpers) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/modules/") + +find_package(Bash REQUIRED) + +include(cmake/version.cmake) + +if(POLICY CMP0149) + # Ignore CMAKE_SYSTEM_VERSION and select either latest available + # Windows SDK or that specified in WindowsSDKVersion environment + # variable Needed because OLD policy picks SDK that matches + # system version, CI uses Windows Server 2022 and its matching + # SDK lacks the arm64 glu32.lib which causes builds to fail. + # MUST be set before project() command. + cmake_policy(SET CMP0149 NEW) +endif() + +include(CMakeDependentOption) + +include(cmake/codesign.cmake) +include(cmake/cputypetest.cmake) + +# OPTIONS + +# N.B IOS and, in the Darwin case, CMAKE_SYSTEM_NAME are not set +# until after the project() command. The latter is most strange. +if(APPLE) + if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "tvOS" OR CMAKE_SYSTEM_NAME STREQUAL "visionOS") + set( APPLE_LOCKED_OS ON ) + else() + set( APPLE_MAC_OS ON ) + endif() +endif() + +option( KTX_FEATURE_DOC "Create KTX documentation." OFF ) +option( KTX_FEATURE_JNI "Create Java bindings for libktx." OFF ) +option( KTX_FEATURE_PY "Create Python source distribution." OFF ) +option( KTX_FEATURE_TESTS "Create unit tests." ON ) +option( KTX_FEATURE_TOOLS_CTS "Enable KTX CLI Tools CTS tests (requires CTS submodule)." OFF ) +option( KTX_FEATURE_ETC_UNPACK "ETC decoding support." ON ) + +if(KTX_FEATURE_TOOLS_CTS AND NOT KTX_FEATURE_TOOLS) + message(WARNING "KTX_FEATURE_TOOLS is not set -> disabling KTX_FEATURE_TOOLS_CTS.") + set(KTX_FEATURE_TOOLS_CTS "OFF") +endif() + +if(POLICY CMP0127) + # cmake_dependent_option() supports full Condition Syntax. Introduced in + # 3.22. Not all build environments have 3.22+. Set policy to avoid warning. + # Seems the parens in the match string trigger the warning. + cmake_policy(SET CMP0127 NEW) +endif() + +CMAKE_DEPENDENT_OPTION( KTX_EMBED_BITCODE + "Embed bitcode in binaries." + OFF + "APPLE AND APPLE_LOCKED_OS" + OFF +) + +option( KTX_FEATURE_KTX1 "Enable KTX 1 support." ON ) +option( KTX_FEATURE_KTX2 "Enable KTX 2 support." ON ) +option( KTX_FEATURE_VK_UPLOAD "Enable Vulkan texture upload." ON ) +option( KTX_FEATURE_GL_UPLOAD "Enable OpenGL texture upload." ON ) +# When a variable like this is set via CMakeUserPresets.json, it no longer +# shows the selectable options provided by the STRINGS property. +set( KTX_FEATURE_LOADTEST_APPS + "" + CACHE + STRING + "Load test apps test the upload feature by displaying various KTX textures. Select which to create. \"OpenGL\" includes OpenGL ES." +) +set_property( CACHE KTX_FEATURE_LOADTEST_APPS + PROPERTY STRINGS OFF OpenGL Vulkan OpenGL+Vulkan +) + +if(NOT KTX_FEATURE_LOADTEST_APPS MATCHES OFF) + set(VCPKG_MANIFEST_FEATURES loadtests) + if (KTX_FEATURE_LOADTEST_APPS MATCHES OpenGL) + list(APPEND VCPKG_MANIFEST_FEATURES glloadtests) + endif() + if(CMAKE_SYSTEM_NAME STREQUAL "iOS") + # Explicitly set the triplet to avoid potential trouble. + # Automatic triplet selection in CI, which runs on x86_64, selects + # x64-ios, which is the simulator. Works locally on arm64 so + # presumably running on an x86_64 is the reason. + set(VCPKG_TARGET_TRIPLET arm64-ios) + endif() +endif() + +option( KTX_GENERATE_VK_FILES + "Include targets for generating VkFormat related files. For project developers only." + OFF +) +mark_as_advanced(FORCE KTX_GENERATE_VK_FILES) + +# Platform specific settings + +if(APPLE) + # Signing + set(XCODE_CODE_SIGN_IDENTITY "Development" CACHE STRING "Xcode code sign ID") + set(XCODE_DEVELOPMENT_TEAM "" CACHE STRING "Xcode development team ID") + set(PRODUCTBUILD_IDENTITY_NAME "" CACHE STRING "productbuild identity name") + set(PRODUCTBUILD_KEYCHAIN_PATH "" CACHE FILEPATH "pkgbuild keychain file") + if(APPLE_LOCKED_OS) + set(XCODE_PROVISIONING_PROFILE_SPECIFIER "" CACHE STRING "Xcode provisioning profile specifier") + endif() + + # Deployment + # When changing the target you must also edit the triplet files in + # vcpkg-triplets to reflect the new target. + if(APPLE_MAC_OS) + set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING "macOS Deployment Target") + elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "tvOS") + set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0" CACHE STRING "iOS/tvOS Deployment Target") + set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH NO) + elseif(CMAKE_SYSTEM_NAME STREQUAL "visionOS") + set(CMAKE_OSX_DEPLOYMENT_TARGET "1.0" CACHE STRING "visionOS Deployment Target") + endif() +endif() + +if(WIN32) + if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.18.0") + include(KtxDependentVariable) + # Signing + set(CODE_SIGN_KEY_VAULT "" CACHE STRING "Name of the vault to search for signing certificate. Enables related code signing variables when set.") + set_property(CACHE CODE_SIGN_KEY_VAULT + PROPERTY STRINGS "" Azure Machine User) + + # Common signing variables + KTX_DEPENDENT_VARIABLE( CODE_SIGN_TIMESTAMP_URL STRING + "URL of timestamp server for code signing. Signed code should be timestamped so the signature will remain valid even after the certificate expires." + "" + "CODE_SIGN_KEY_VAULT" + "" + ) + # Variables for signing with local certificate. + KTX_DEPENDENT_VARIABLE( LOCAL_KEY_VAULT_SIGNING_IDENTITY STRING + "Subject Name of Windows code signing certificate. Displayed in 'Issued To' field of cert{lm,mgr}. Overriden by LOCAL_KEY_VAULT_CERTIFICATE_THUMBPRINT." + "" + "CODE_SIGN_KEY_VAULT;${CODE_SIGN_KEY_VAULT} MATCHES Machine OR ${CODE_SIGN_KEY_VAULT} MATCHES User" + "" + ) + KTX_DEPENDENT_VARIABLE( LOCAL_KEY_VAULT_CERTIFICATE_THUMBPRINT STRING + "Thumbprint of the certificate to use. Use this instead of LOCAL_KEY_VAULT_SIGNING_IDENTITY when you have multiple certificates with the same identity. Overrides LOCAL_KEY_VAULT_SIGNING_IDENTITY." + "" + "CODE_SIGN_KEY_VAULT;${CODE_SIGN_KEY_VAULT} MATCHES Machine OR ${CODE_SIGN_KEY_VAULT} MATCHES User" + "" + ) + + # Variables for signing with certificate from Azure + KTX_DEPENDENT_VARIABLE( AZURE_KEY_VAULT_URL STRING + "The URL of your Azure key vault." + "" + "CODE_SIGN_KEY_VAULT;${CODE_SIGN_KEY_VAULT} MATCHES Azure" + "" + ) + KTX_DEPENDENT_VARIABLE( AZURE_KEY_VAULT_CERTIFICATE STRING + "The name of the certificate in Azure Key Vault." + "" + "CODE_SIGN_KEY_VAULT;${CODE_SIGN_KEY_VAULT} MATCHES Azure" + "" + ) + KTX_DEPENDENT_VARIABLE( AZURE_KEY_VAULT_CLIENT_ID STRING + "The id of an application (Client) registered with Azure that has permission to access the certificate." + "" + "CODE_SIGN_KEY_VAULT;${CODE_SIGN_KEY_VAULT} MATCHES Azure" + "" + ) + KTX_DEPENDENT_VARIABLE( AZURE_KEY_VAULT_TENANT_ID STRING + "The id of the Azure Active Directory (Tenant) holding the Client." + "" + "CODE_SIGN_KEY_VAULT;${CODE_SIGN_KEY_VAULT} MATCHES Azure" + "" + ) + KTX_DEPENDENT_VARIABLE( AZURE_KEY_VAULT_CLIENT_SECRET STRING + "The secret to authenticate access to the Client." + "" + "CODE_SIGN_KEY_VAULT;${CODE_SIGN_KEY_VAULT} MATCHES Azure" + "" + ) + else() + # KTX_DEPENDENT_VARIABLE won't work. Force disable signing. + unset(CODE_SIGN_KEY_VAULT CACHE) + endif() +endif() + +set(bitness 64) +if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8 OR FORCE32) + set(bitness 32) +endif() + +option( KTX_WERROR "Make all warnings in KTX code into errors." OFF) + +# After most option settings so settings can be used to affect vcpkg. +project(KTX-Software + VERSION ${KTX_VERSION} + DESCRIPTION "Libraries and tools to create and read KTX image texture files." +) + +include(GNUInstallDirs) # Must be after project. +include(CTest) # " + +set_target_processor_type(CPU_ARCHITECTURE) # Must be after project. +if (CPU_ARCHITECTURE STREQUAL x86) + message(FATAL_ERROR "This project cannot be built for x86 cpu.") +endif() +CMAKE_DEPENDENT_OPTION( BASISU_SUPPORT_SSE + "Compile with SSE support so applications can choose to use it." + ON + "NOT CMAKE_OSX_ARCHITECTURES STREQUAL \"$(ARCHS_STANDARD)\"; CPU_ARCHITECTURE STREQUAL x86_64" + OFF +) + +CMAKE_DEPENDENT_OPTION( BASISU_SUPPORT_OPENCL + "Compile with OpenCL support so applications can choose to use it." + OFF + "OpenCL_FOUND OR WIN32" + OFF +) + +if(BASISU_SUPPORT_OPENCL) + find_package(OpenCL) # Must be after project as needs language defined. +endif() + +if(BASISU_SUPPORT_OPENCL AND WIN32 AND NOT OpenCL_FOUND) + # To avoid fiddly setting up of OpenCL on Windows CI VMs, use copy in repo. + set(OpenCL_INCLUDE_DIR + "${CMAKE_CURRENT_SOURCE_DIR}/external/basisu/opencl" + # FORCE to override *-NOTFOUND set by the failed find. + CACHE PATH "" FORCE + ) + set(OpenCL_LIBRARY + "${CMAKE_CURRENT_SOURCE_DIR}/external/basisu/opencl/lib/OpenCL64.lib" + CACHE FILEPATH "" FORCE + ) + set(OpenCL_INCLUDE_DIRS ${OpenCL_INCLUDE_DIR}) + set(OpenCL_LIBRARIES ${OpenCL_LIBRARY}) +endif() + +# Windows Store Compatibility. +# In this case CMAKE_SYSTEM_NAME is not set until after project. +if (${CMAKE_SYSTEM_NAME} STREQUAL "WindowsStore") + # Disable OpenGL upload on Universal Windows Platform + set(KTX_FEATURE_GL_UPLOAD OFF) +endif() + +# Uses IOS, so included after project to avoid modifying it. +if(KTX_GENERATE_VK_FILES) + include(cmake/mkvk.cmake) +endif() + +# EMSCRIPTEN is not set until project so all these must be after. +if(KTX_FEATURE_TESTS AND (APPLE_LOCKED_OS OR ANDROID OR EMSCRIPTEN)) + message(WARNING "Building unit tests for Android, Apple locked OSes or the web is not supported -> disabling KTX_FEATURE_TESTS.") + set(KTX_FEATURE_TESTS "OFF") +endif() +if(KTX_FEATURE_TOOLS_CTS AND NOT KTX_FEATURE_TESTS) + message(WARNING "KTX_FEATURE_TESTS is not set -> disabling KTX_FEATURE_TOOLS_CTS.") + set(KTX_FEATURE_TOOLS_CTS "OFF") +endif() +if(APPLE_LOCKED_OS OR EMSCRIPTEN) + set( LIB_TYPE_DEFAULT OFF ) +else() + set( LIB_TYPE_DEFAULT ON ) +endif() + +option(BUILD_SHARED_LIBS "Create shared libraries (static otherwise)." ${LIB_TYPE_DEFAULT} ) + +# Used to reset BUILD_SHARED_LIBS after forcing static builds +set(BUILD_SHARED_LIBS_RESET ${BUILD_SHARED_LIBS}) + +CMAKE_DEPENDENT_OPTION( KTX_FEATURE_TOOLS + "Create KTX tools" + ON + "NOT APPLE_LOCKED_OS;NOT ANDROID;NOT EMSCRIPTEN" + OFF +) + +if(UNIX AND NOT APPLE AND NOT EMSCRIPTEN AND NOT ANDROID) + set(LINUX TRUE) +endif() + +if(EMSCRIPTEN) + set( KTX_FEATURE_VK_UPLOAD OFF ) +endif() + +if(NOT BUILD_SHARED_LIBS) + set(LIB_TYPE STATIC) +else() + if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR EMSCRIPTEN) + message(SEND_ERROR "Library type cannot be shared for the current platform. Set BUILD_SHARED_LIBS to OFF!") + endif() + set(LIB_TYPE SHARED) +endif() + +# Global compile & link options including optimization flags +if(MSVC) + add_compile_options( /W4;$<$:/WX> ) + add_compile_options( $,/Gz,/O2> ) + # Enable UTF-8 support + add_compile_options( $<$:/utf-8> ) + add_compile_options( $<$:/utf-8> ) +elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" + OR ${CMAKE_CXX_COMPILER_ID} MATCHES "Clang") + add_compile_options( -Wall -Wextra $<$:-Werror>) + add_compile_options( $,-O0$-g,-O3> ) + if(EMSCRIPTEN) + add_link_options( $,-gsource-map,-O3> ) + else() + add_link_options( $,-g,-O3> ) + endif() +else() + message(FATAL_ERROR "${CMAKE_CXX_COMPILER_ID} not yet supported.") +endif() + +# To improve output determinism enable precise floating point operations globally +# This code was based on external/astc-encoder/Source/cmake_core.cmake + +# For Visual Studio prior to 2022 (compiler < 19.30) /fp:strict +# For Visual Studio 2022 (compiler >= 19.30) /fp:precise +# For Visual Studio 2022 ClangCL has enabled contraction by default, +# which is the same as standard clang, so behaves differently to +# CL.exe. Use the -Xclang argument to access GNU-style switch to +# control contraction and force disable. + +# On CMake 3.25 or older CXX_COMPILER_FRONTEND_VARIANT is not always set +if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "") + set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "${CMAKE_CXX_COMPILER_ID}") +endif() + +#cmake_print_variables( +# CMAKE_CXX_COMPILER_ID +# CMAKE_CXX_COMPILER_VERSION +# CMAKE_CXX_COMPILER_FRONTEND_VARIANT +#) + +# Compiler accepts MSVC-style command line options +set(is_msvc_fe "$") +# Compiler accepts GNU-style command line options +set(is_gnu_fe1 "$") +# Compiler accepts AppleClang-style command line options, which is also GNU-style +set(is_gnu_fe2 "$") +# Compiler accepts GNU-style command line options +set(is_gnu_fe "$") +#add_custom_target(debug_isgnufe1 COMMAND ${CMAKE_COMMAND} -E echo "is_gnufe1_exp = $") + +# Compiler is Visual Studio cl.exe +set(is_msvccl "$>") +# Compiler is Visual Studio clangcl.exe +set(is_clangcl "$>") +# Compiler is upstream clang with the standard frontend +set(is_clang "$>") + +add_compile_options( + $<$,19.30>>:/fp:strict> + $<$,19.30>>:/fp:precise> + $<${is_clangcl}:/fp:precise> + $<$,14.0.0>>:-Xclang$-ffp-contract=off> + $<$,10.0.0>>:-ffp-model=precise> + $<${is_gnu_fe}:-ffp-contract=off> + # Hide noise from clang and clangcl 20 warning the 2nd fp option changes + # one of the settings made the first. + $<$,20.0.0>>:-Wno-overriding-option> +) +#add_custom_target(debug_gnufe_ffpcontract COMMAND ${CMAKE_COMMAND} -E echo "ffp_contract = $<${is_gnu_fe}:-ffp-contract=off>") + +set(KTX_BUILD_DIR "${CMAKE_BINARY_DIR}") + +set(KTX_MAIN_SRC + include/KHR/khr_df.h + include/ktx.h + lib/astc_codec.cpp + lib/basis_sgd.h + lib/basis_transcode.cpp + lib/miniz_wrapper.cpp + external/basisu/transcoder/basisu_containers.h + external/basisu/transcoder/basisu_containers_impl.h + external/basisu/transcoder/basisu_file_headers.h + external/basisu/transcoder/basisu_transcoder_internal.h + external/basisu/transcoder/basisu_transcoder_uastc.h + external/basisu/transcoder/basisu_transcoder.cpp + external/basisu/transcoder/basisu_transcoder.h + external/basisu/transcoder/basisu.h + external/basisu/zstd/zstd.c + lib/checkheader.c + external/dfdutils/createdfd.c + external/dfdutils/colourspaces.c + external/dfdutils/dfd.h + external/dfdutils/interpretdfd.c + external/dfdutils/printdfd.c + external/dfdutils/queries.c + external/dfdutils/vk2dfd.c + external/dfdutils/vk2dfd.inl + external/dfdutils/vulkan/vk_platform.h + external/dfdutils/vulkan/vulkan_core.h + lib/etcunpack.cxx + lib/filestream.c + lib/filestream.h + lib/formatsize.h + lib/gl_format.h + lib/glformat_str.c + lib/hashlist.c + lib/info.c + lib/ktxint.h + lib/memstream.c + lib/memstream.h + lib/strings.c + lib/swap.c + lib/texture.c + lib/texture.h + lib/texture2.c + lib/texture2.h + lib/texture_funcs.inl + lib/uthash.h + lib/vk2gl.h + lib/vk_format.h + lib/vkFormat2glFormat.inl + lib/vkFormat2glInternalFormat.inl + lib/vkFormat2glType.inl + lib/vkformat_check.c + lib/vkformat_check_variant.c + lib/vkformat_enum.h + lib/vkformat_str.c + lib/vkformat_typesize.c + ) + +if (KTX_FEATURE_ETC_UNPACK) + list(APPEND KTX_MAIN_SRC + external/etcdec/etcdec.cxx + ) +endif() + +set(BASISU_ENCODER_CXX_SRC + external/basisu/encoder/basisu_backend.cpp + external/basisu/encoder/basisu_backend.h + external/basisu/encoder/basisu_basis_file.cpp + external/basisu/encoder/basisu_basis_file.h + external/basisu/encoder/basisu_bc7enc.cpp + external/basisu/encoder/basisu_bc7enc.h + external/basisu/encoder/basisu_comp.cpp + external/basisu/encoder/basisu_comp.h + external/basisu/encoder/basisu_enc.cpp + external/basisu/encoder/basisu_enc.h + external/basisu/encoder/basisu_etc.cpp + external/basisu/encoder/basisu_etc.h + external/basisu/encoder/basisu_frontend.cpp + external/basisu/encoder/basisu_frontend.h + external/basisu/encoder/basisu_gpu_texture.cpp + external/basisu/encoder/basisu_gpu_texture.h + external/basisu/encoder/basisu_kernels_declares.h + external/basisu/encoder/basisu_kernels_imp.h + external/basisu/encoder/basisu_kernels_sse.cpp + external/basisu/encoder/basisu_miniz.h + external/basisu/encoder/basisu_opencl.cpp + external/basisu/encoder/basisu_opencl.h + external/basisu/encoder/basisu_pvrtc1_4.cpp + external/basisu/encoder/basisu_pvrtc1_4.h + external/basisu/encoder/basisu_resample_filters.cpp + external/basisu/encoder/basisu_resampler_filters.h + external/basisu/encoder/basisu_resampler.cpp + external/basisu/encoder/basisu_resampler.h + external/basisu/encoder/basisu_ssim.cpp + external/basisu/encoder/basisu_ssim.h + external/basisu/encoder/basisu_uastc_enc.cpp + external/basisu/encoder/basisu_uastc_enc.h + external/basisu/encoder/cppspmd_flow.h + external/basisu/encoder/cppspmd_math.h + external/basisu/encoder/cppspmd_math_declares.h + external/basisu/encoder/cppspmd_sse.h + external/basisu/encoder/cppspmd_type_aliases.h + ) + +if(KTX_FEATURE_GL_UPLOAD) + list(APPEND KTX_MAIN_SRC + lib/gl_funclist.inl + lib/gl_funcs.c + lib/gl_funcs.h + lib/glloader.c + ) +endif() + +if(APPLE OR LINUX OR WIN32) + # By wrapping in generator expression we force multi configuration + # generators (like Visual Studio, Xcode or Ninja multi-config) to + # take the exact path and not change it. + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${KTX_BUILD_DIR}/$>) + if(APPLE OR LINUX) + # Use a common RUNTIME_OUTPUT_DIR and LIBRARY_OUTPUT_DIR for all + # targets so that the INSTALL RPATH we need for installed binaries + # is functional in the build directory as well. INSTALL_RPATH cannot + # be altered during install because that would break code signing + # which happens after building. Therefore BUILD_WITH_INSTALL_RPATH + # is necessary for working code signing. Although Linux code is not + # yet being signed, make it symmetrical with macOS. + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY $<1:${KTX_BUILD_DIR}/$>) + set(CMAKE_BUILD_WITH_INSTALL_RPATH ON) + + # Notes about install names, rpaths and code signing + # -------------------------------------------------- + # Changing the install name of a library by setting INSTALL_NAME_DIR + # on a library target will invalidate the signature as it causes + # cmake to run `install_name_tool` after building and signing. The + # default install name is the library target's name prefixed by + # `@rpath/`. With this, `dyld` will load the library provided it is + # in one of the directories specified by a program's INSTALL_RPATH + # or is in the directory part of a full-path name passed to `dlopen`. + # + # A bad signature in either executable or shared library is + # indicated by the executable exiting with "Killed: 9". + endif() +endif() + +set(KTX_BASISU_INCLUDE_DIRS + $ +) + +# Main library +add_library( ktx ${LIB_TYPE} + ${KTX_MAIN_SRC} + ) + +# Read-only library +add_library( ktx_read ${LIB_TYPE} + ${KTX_MAIN_SRC} + ) + +macro(common_libktx_settings target enable_write library_type) + + if(TARGET mkvk) + # Creating vulkan headers only required after Vulkan Spec/SDK updates. + add_dependencies(${target} mkvk) + endif() + + set_target_properties(${target} PROPERTIES + PUBLIC_HEADER +# "${CMAKE_CURRENT_SOURCE_DIR}/include/ktx.h;${CMAKE_CURRENT_SOURCE_DIR}/include/KHR/khr_df.h" + # Omit khr_df.h. Its installation has to be handled separately to + # workaround CMake's failure to preserve the directory hierarchy. + "${CMAKE_CURRENT_SOURCE_DIR}/include/ktx.h" + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES" + ) + if(APPLE_LOCKED_OS) + set_target_properties(${target} PROPERTIES + FRAMEWORK TRUE + ) + endif() + + if( NOT ${library_type} STREQUAL STATIC ) + # Must not call this macro for static libs on Windows. To keep + # the if test simple, never call it for static libs. On macOS + # and iOS Xcode knows libs aren't signed so it would ignore the + # settings made by this macro. + set_code_sign(${target} "NOPPS") + endif() + + target_compile_definitions( + ${target} + PUBLIC + "$<$:_DEBUG;DEBUG>" + PRIVATE + LIBKTX + SUPPORT_SOFTWARE_ETC_UNPACK=$ + ) + + # C/C++ Standard + # Need c11 for Unicode string literals + target_compile_features(${target} PUBLIC c_std_11 cxx_std_11) + + # Compiler Warning Flags + if(EMSCRIPTEN) + target_compile_options(${target} PRIVATE + -Wno-nested-anon-types + -Wno-gnu-anonymous-struct + ) + else() + target_compile_options(${target} PRIVATE + # clang options + $<$: + -Wno-nested-anon-types + -Wno-gnu-anonymous-struct + > + $<$: + -Wno-cast-function-type + > + # not clang options + $<$>: + -Wno-pedantic + > + ) + endif() + + target_include_directories( + ${target} + PUBLIC + $ + $ + PRIVATE + ${KTX_BASISU_INCLUDE_DIRS} + external + + $ + $ + + $ + $ + ) + + target_include_directories( + ${target} + SYSTEM + PRIVATE + $ + $ + ) + + if( ${library_type} STREQUAL STATIC ) + target_compile_definitions(${target} PUBLIC KHRONOS_STATIC) + endif() + + # To reduce size, don't support transcoding to ancient formats. + target_compile_definitions(${target} PRIVATE BASISD_SUPPORT_FXT1=0) + + # TODO: make options for all formats and good per-platform defaults + # - BASISD_SUPPORT_UASTC + # - BASISD_SUPPORT_DXT1 (BC1) + # - BASISD_SUPPORT_DXT5A (BC3/4/5) + # - BASISD_SUPPORT_BC7 + # - BASISD_SUPPORT_BC7_MODE5 + # - BASISD_SUPPORT_PVRTC1 + # - BASISD_SUPPORT_ETC2_EAC_A8 + # - BASISD_SUPPORT_ASTC + # - BASISD_SUPPORT_ATC + # - BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + # - BASISD_SUPPORT_ETC2_EAC_RG11 + # - BASISD_SUPPORT_FXT1 + # - BASISD_SUPPORT_PVRTC2 + + if(WIN32) + target_compile_definitions( + ${target} + PRIVATE + # Only set dllexport when building a shared library. + $<$:KTX_API=__declspec\(dllexport\)> + # Code compiled with the versions shown defaults to a constexpr + # std::mutex constructor and requires a mscvp140.dll of at least + # version 14.40.33810.00 otherwise code creating a mutex + # crashes mysteriously. Since many JVM installations bundle + # their own version of the VC++ redistributables chances are + # high they will not have a modern enough version so JNI modules + # linked with libktx will crash when multiple threads are used, + # as they are in the BasisU and ASTC encoders. + # + # To avoid this set a define to prevent the compiler using + # constexpr mutex constructors. Remove this eventually after + # in-use JVM installations have at least this VC runtime. Remove + # also from ASTCENC_LIB_TARGET settings around line 1169. + $<$,19.40.33811>>:_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR> + $<$,17.0.3>>:_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR> + PUBLIC # only for basisu_c_binding. + BASISU_NO_ITERATOR_DEBUG_LEVEL + ) + # The generator automatically sets the needed VCLinker + # option when a .def file is seen in sources. + # The def files that we add have a different syntax depending on the ABI + if(MINGW) + target_sources( + ${target} + PRIVATE + lib/internalexport_mingw.def + $<${enable_write}:lib/internalexport_write_mingw.def> + ) + # Need these flags if mingw happens to target the ucrt (new) rather + # than the legacy msvcrt. Otherwise tests will fail to run because + # the necessary dlls will be missing. If we statically link + # them instead it's fine. This does not cause any abberations if + # the mingw toolchain targets msvcrt instead. + target_link_options(${target} PUBLIC -static-libgcc -static-libstdc++) + else() + target_sources( + ${target} + PRIVATE + lib/internalexport.def + $<${enable_write}:lib/internalexport_write.def> + ) + endif() + elseif(EMSCRIPTEN) + target_compile_definitions(${target} PRIVATE + # To reduce size, don't support transcoding to formats not + # supported # by WebGL. + BASISD_SUPPORT_ATC=0 + BASISD_SUPPORT_PVRTC2=0 + # Don't support higher quality mode to avoid 64k table. + BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY=0 + KTX_OMIT_VULKAN=1 + ) + target_link_options(${target} INTERFACE +# "SHELL:-s ASSERTIONS=2" +# "SHELL:-s SAFE_HEAP=1" +# "SHELL:-s STACK_OVERFLOW_CHECK=2" + "SHELL:-s ALLOW_MEMORY_GROWTH=1" + "SHELL:-s MALLOC=emmalloc" + "SHELL:-s FULL_ES3=1" + "SHELL:-s GL_ENABLE_GET_PROC_ADDRESS=1" # For Emscripten 3.1.51+ + ) + endif() + + if(KTX_FEATURE_KTX1) + target_compile_definitions(${target} PUBLIC KTX_FEATURE_KTX1) + target_sources( + ${target} + PRIVATE + lib/texture1.c + lib/texture1.h + ) + endif() + + if(KTX_FEATURE_KTX2) + target_compile_definitions(${target} PUBLIC KTX_FEATURE_KTX2) + endif() + + if(WIN32) + if(MINGW) + # Check if the Threads package is provided; if using Mingw it MIGHT be + find_package(Threads) + if(Threads_FOUND AND CMAKE_USE_PTHREADS_INIT) + target_compile_definitions(${target} PRIVATE WIN32_HAS_PTHREADS) + target_link_libraries(${target} PRIVATE Threads::Threads) + endif() + endif() + + elseif(APPLE) + if(KTX_EMBED_BITCODE) + target_compile_options(${target} PRIVATE "-fembed-bitcode") + endif() + + elseif(LINUX) + find_package(Threads REQUIRED) + target_link_libraries( + ${target} + PRIVATE + dl + Threads::Threads + ) + endif() + + if(KTX_FEATURE_VK_UPLOAD) + target_sources( + ${target} + PRIVATE + include/ktxvulkan.h + lib/vk_funcs.c + lib/vk_funcs.h + lib/vkloader.c + ) + target_include_directories( + ${target} + PRIVATE + $ + $ + ) + + get_target_property( KTX_PUBLIC_HEADER ${target} PUBLIC_HEADER ) + list(APPEND KTX_PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/include/ktxvulkan.h) + set_target_properties(${target} PROPERTIES + PUBLIC_HEADER "${KTX_PUBLIC_HEADER}" + ) + else() + target_compile_definitions( ${target} PRIVATE KTX_OMIT_VULKAN=1 ) + endif() + + # Adding write capability to target ktx + if(${enable_write}) + target_sources( + ${target} + PRIVATE + lib/basis_encode.cpp + ${BASISU_ENCODER_CXX_SRC} + lib/writer1.c + lib/writer2.c + ) + + target_include_directories( + ${target} + PRIVATE + $ + $ + $<$:${OpenCL_INCLUDE_DIRS}> + ) + target_compile_definitions( + ${target} + PUBLIC + KTX_FEATURE_WRITE + PRIVATE + # BASISD_SUPPORT_KTX2 has to be 1 to compile the encoder. We + # don't use it. Hopefully it doesn't add too much code. We're using + # the zstd encoder in basisu by explicitly including the file in our + # source list. We don't need the related code in the encoder. + BASISD_SUPPORT_KTX2_ZSTD=0 + BASISD_SUPPORT_KTX2=1 + $<$:BASISU_SUPPORT_SSE=1> + $<$>:BASISU_SUPPORT_SSE=0> + $<$:BASISU_SUPPORT_OPENCL=1> + $<$>:BASISU_SUPPORT_OPENCL=0> + ) + target_compile_options( + ${target} + PRIVATE + $<$,$>: + -msse4.1 + > + ) + if(EMSCRIPTEN) + target_link_options( + ${target} + INTERFACE + # Default 64kb not enough for encode_uastc. + "SHELL:-s STACK_SIZE=96kb" + ) + endif() + target_link_libraries( + ${target} + PRIVATE + $<$:${OpenCL_LIBRARIES}> + ) + endif() +endmacro(common_libktx_settings) + +common_libktx_settings(ktx 1 ${LIB_TYPE}) +common_libktx_settings(ktx_read 0 ${LIB_TYPE}) + +if(KTX_FEATURE_JNI) + add_subdirectory(interface/java_binding) +endif() + +if(KTX_FEATURE_PY) + add_subdirectory(interface/python_binding) +endif() + +create_version_header(lib ktx) +create_version_file() + +target_compile_definitions( + ktx_read +PRIVATE + # We're reading the files ourselves so don't need Basis KTX v2 support. + BASISD_SUPPORT_KTX2_ZSTD=0 + BASISD_SUPPORT_KTX2=0 +) + +# helper function to append COMPILE_OPTIONS to source file properties +# !! if SRCFILES is a list, remember to quote it !! +# !! like add_source_file_compile_options("${MY_SRC_LIST}" "-Wall") !! +# !! or add_source_file_compile_options("dir/foo.cpp;dir/bar.cpp" "-Wextra") !! +function(add_source_file_compile_options SRCFILES OPTIONS) + foreach(src_file ${SRCFILES}) + get_source_file_property(cur_options + "${src_file}" + COMPILE_OPTIONS + ) + if(cur_options) + set_source_files_properties( + "${src_file}" + PROPERTIES COMPILE_OPTIONS "${cur_options};${OPTIONS}" + ) + else() # if cur_options were undefined or empty ("") + set_source_files_properties( + "${src_file}" + PROPERTIES COMPILE_OPTIONS "${OPTIONS}" + ) + endif() + endforeach() +endfunction() + +# Turn off these warnings until Rich fixes the occurences. +# It it not clear to me if generator expressions can be used here +# hence the long-winded way. +if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") +# Currently no need to disable any warnings in basisu code. Rich fixed them. +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set_source_files_properties( + # It's too much work to discriminate which files need which warnings + # disabled. + ${BASISU_ENCODER_CXX_SRC} + PROPERTIES COMPILE_OPTIONS "-fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses" + ) + set_source_files_properties( + external/basisu/transcoder/basisu_transcoder.cpp + PROPERTIES COMPILE_OPTIONS "-fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-function;-Wno-unused-variable;-Wno-class-memaccess;-Wno-maybe-uninitialized" + ) + if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL "11") + if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS "12" ) + # Version 11 raises several stringop-overflow warnings in some + # very hard to decipher code. They appear to be bogus based on + # the facts that we have never seen a crash and version 12 no + # longer raises the warnings. + add_source_file_compile_options( + external/basisu/encoder/basisu_comp.cpp + "-Wno-stringop-overflow" + ) + endif() + endif() + if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL "12.0") + # Version 12 newly raises this warning on basisu_uastc_enc.cpp. + # There seems no way for the index calculated by the code at + # line 326, where the error is raised, to be > the array length. + # Also we have never seen any crashes. + add_source_file_compile_options( + external/basisu/encoder/basisu_uastc_enc.cpp + "-Wno-stringop-overflow" + ) + endif() + if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL "14.0") + # Version 14 raises stringop-overflow on these files. + add_source_file_compile_options( + "external/basisu/transcoder/basisu_transcoder.cpp;external/basisu/encoder/basisu_bc7enc.cpp" + "-Wno-stringop-overflow" + ) + endif() +elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + # Versions equivalency from https://en.wikipedia.org/wiki/Xcode#Xcode_11.x_-_14.x_(since_SwiftUI_framework)_2 + if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL "14") + set( clang_version ${CMAKE_CXX_COMPILER_VERSION}) + elseif (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL "13.1.0") + set( clang_version "13.0.0") + elseif (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL "13.0.0") + set( clang_version "12.0.0") + elseif (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL "12.0.5") + set( clang_version "11.1.0") + elseif (${CMAKE_CXX_COMPILER_VERSION} VERSION_EQUAL "12.0.0") + set( clang_version "10.0.0") + else() + message(FATAL_ERROR "Unsupported AppleClang version") + endif() + else() + set( clang_version ${CMAKE_CXX_COMPILER_VERSION} ) + endif() + # BEWARE: set_source_files_properties is not additive; it replaces. + set_source_files_properties( + ${BASISU_ENCODER_CXX_SRC} + PROPERTIES COMPILE_OPTIONS "-fno-strict-aliasing" + ) + set_source_files_properties( + external/basisu/transcoder/basisu_transcoder.cpp + PROPERTIES COMPILE_OPTIONS "-fno-strict-aliasing" + ) + if (${clang_version} VERSION_GREATER_EQUAL "12.0.0") + add_source_file_compile_options( external/basisu/encoder/basisu_kernels_sse.cpp + "-Wno-unused-parameter;-Wno-deprecated-copy;-Wno-uninitialized-const-reference" + ) + else() + add_source_file_compile_options( external/basisu/encoder/basisu_kernels_sse.cpp + "-Wno-unused-parameter" + ) + endif() + if (${clang_version} VERSION_GREATER_EQUAL "14.0") + add_source_file_compile_options( + "${BASISU_ENCODER_CXX_SRC}" + "-Wno-sign-compare;-Wno-unused-variable;-Wno-unused-parameter;-Wno-deprecated-copy-with-user-provided-copy" + ) + add_source_file_compile_options( + external/basisu/transcoder/basisu_transcoder.cpp + "-Wno-sign-compare;-Wno-unused-function;-Wno-unused-variable" + ) + set_source_files_properties( + external/basisu/zstd/zstd.c + PROPERTIES COMPILE_OPTIONS "-Wno-unused-function" + ) + endif() +else() + message(FATAL_ERROR "${CMAKE_CXX_COMPILER_ID} not yet supported.") +endif() + +# Retrieve the final set of properties for use by the transcodetests. +# We do this because the CMake feature that would allow the transcodetests +# target to retrieve these from the ktx target is not available until +# v18 and we still need to work with v16 in the Emscripten Docker image. +get_source_file_property(transcoder_options + external/basisu/transcoder/basisu_transcoder.cpp + COMPILE_OPTIONS +) +get_source_file_property(zstd_options external/basisu/zstd/zstd.c COMPILE_OPTIONS) + +if(EMSCRIPTEN) + set( + KTX_EM_COMMON_LINK_FLAGS + --bind + "SHELL:-s MODULARIZE=1" + "SHELL:-s EXPORTED_RUNTIME_METHODS=[\'GL,HEAP8\']" + "SHELL:-s GL_PREINITIALIZED_CONTEXT=1" + ) + + set( + KTX_EM_COMMON_KTX_LINK_FLAGS + --pre-js ${CMAKE_CURRENT_SOURCE_DIR}/interface/js_binding/class_compat.js + --extern-post-js ${CMAKE_CURRENT_SOURCE_DIR}/interface/js_binding/module_create_compat.js + ${KTX_EM_COMMON_LINK_FLAGS} + ) + + set( + KTX_JS_COMMON_SOURCE + interface/js_binding/ktx_wrapper.cpp + interface/js_binding/class_compat.js + interface/js_binding/module_create_compat.js + ) + + add_executable( ktx_js + ${KTX_JS_COMMON_SOURCE} + interface/js_binding/vk_format.inl + ) + target_compile_definitions(ktx_js PUBLIC KTX_FEATURE_WRITE) + target_link_libraries( ktx_js ktx ) + target_include_directories( + ktx_js + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/other_include + ${CMAKE_CURRENT_SOURCE_DIR}/lib + $ + ) + target_link_options( + ktx_js + PUBLIC + ${KTX_EM_COMMON_KTX_LINK_FLAGS} + "SHELL:-s EXPORT_NAME=createKtxModule" + ) + set_target_properties( ktx_js PROPERTIES OUTPUT_NAME "libktx") + + add_custom_command( + TARGET ktx_js + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "$/$$.js" "${PROJECT_SOURCE_DIR}/tests/webgl" + COMMAND ${CMAKE_COMMAND} -E copy "$/$$.wasm" "${PROJECT_SOURCE_DIR}/tests/webgl" + COMMENT "Copy libktx.js and libktx.wasm to tests/webgl" + ) + + install(TARGETS ktx_js + RUNTIME + DESTINATION . + COMPONENT ktx_js + ) + install(FILES ${CMAKE_BINARY_DIR}/libktx.wasm + DESTINATION . + COMPONENT ktx_js + ) + + add_executable( ktx_js_read + ${KTX_JS_COMMON_SOURCE} + ) + target_link_libraries( ktx_js_read ktx_read ) + target_include_directories( + ktx_js_read + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/other_include + ${CMAKE_CURRENT_SOURCE_DIR}/lib + $ + ) + target_link_options( + ktx_js_read + PUBLIC + ${KTX_EM_COMMON_KTX_LINK_FLAGS} + "SHELL:-s EXPORT_NAME=createKtxReadModule" + ) + set_target_properties( ktx_js_read PROPERTIES OUTPUT_NAME "libktx_read") + + add_custom_command( + TARGET ktx_js_read + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "$/$$.js" "${PROJECT_SOURCE_DIR}/tests/webgl" + COMMAND ${CMAKE_COMMAND} -E copy "$/$$.wasm" "${PROJECT_SOURCE_DIR}/tests/webgl" + COMMENT "Copy libktx_read.js and libktx_read.wasm to tests/webgl" + ) + + install(TARGETS ktx_js_read + RUNTIME + DESTINATION . + COMPONENT ktx_js_read + ) + install(FILES ${CMAKE_BINARY_DIR}/libktx_read.wasm + DESTINATION . + COMPONENT ktx_js_read + ) + + add_executable( msc_basis_transcoder_js interface/js_binding/transcoder_wrapper.cpp ) + target_link_libraries( msc_basis_transcoder_js ktx_read ) + target_include_directories( msc_basis_transcoder_js + PRIVATE + lib + external + external/basisu/transcoder + ) + + # Re-use ktx's compile options + target_compile_options(msc_basis_transcoder_js + PRIVATE + $ + ) + + target_link_options( + msc_basis_transcoder_js + PUBLIC + ${KTX_EM_COMMON_LINK_FLAGS} + "SHELL:-s EXPORT_NAME=MSC_TRANSCODER" + # Re-use ktx's link options + $ + ) + set_target_properties( msc_basis_transcoder_js PROPERTIES OUTPUT_NAME "msc_basis_transcoder") + + add_custom_command( + TARGET msc_basis_transcoder_js + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "$/$$.js" "${PROJECT_SOURCE_DIR}/tests/webgl" + COMMAND ${CMAKE_COMMAND} -E copy "$/$$.wasm" "${PROJECT_SOURCE_DIR}/tests/webgl" + COMMENT "Copy msc_basis_transcoder.js and msc_basis_transcoder.wasm to tests/webgl" + ) + + install(TARGETS msc_basis_transcoder_js + RUNTIME + DESTINATION . + COMPONENT msc_basis_transcoder_js + ) + install(FILES ${CMAKE_BINARY_DIR}/msc_basis_transcoder.wasm + DESTINATION . + COMPONENT msc_basis_transcoder_js + ) +endif() + +add_library( objUtil STATIC + utils/argparser.cpp + utils/argparser.h + utils/ktxapp.h + utils/sbufstream.h + utils/scapp.h + utils/stdafx.h + utils/platform_utils.h + utils/unused.h + ) +target_include_directories( + objUtil +PUBLIC + utils +) +target_compile_features( + objUtil +PUBLIC + cxx_std_11 +) + +# In C++ apps that use statically linked Libraries all compilatiom units must +# be compiled with matching symbol visibility settings to avoid warnings from +# clang. Many 3rd party libraries, including libassimp which is used by the +# load test apps that statically link also to several internal libraries, use +# "hidden" to avoid conflicts with other libraries. +# +# TODO: set "hidden" as a global option. I do not want to take the time right +# now to deal with the fallout from hiding globals in libktx. Apart from +# having to mark all the public symbols of libktx for clang and gcc with +# __attribute__((visibility("default"))) there will be ramifications to +# texturetests and unittests. Marking the public symbols is easy for those +# already tagged with KTX_API. But all the symbols exported via +# internalexport.def and internalexport_write.def have to be tagged with +# KTX_API which may also require additional inclusion of ktx.h to get the +# definition. +set (STATIC_APP_LIB_SYMBOL_VISIBILITY hidden) +set_target_properties(objUtil PROPERTIES + CXX_VISIBILITY_PRESET ${STATIC_APP_LIB_SYMBOL_VISIBILITY} +) +if(NOT BUILD_SHARED_LIBS AND + (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")) + set_source_files_properties( + lib/astc_encode.cpp + PROPERTIES COMPILE_OPTIONS "-fvisibility=hidden" + ) +endif() + +add_subdirectory(interface/basisu_c_binding) + +#################################################### +# ASTC Encoder. +#################################################### + +# Determine most of the ASTC-related settings automatically. + +# On Linux and Windows only one architecture is supported at once. On +# macOS simultaneous multiple architectures are supported by the ASTC +# encoder but not by the BasisU encoder. The latter supports only SSE +# SIMD that is enabled by compile time defines which makes it not amenable +# to a standard Xcode universal binary build. To ensure BASISU_SUPPORT_SSE +# is disabled when building for multiple architectures use only the +# value of CMAKE_OSX_ARCHITECTURES to decide if a universal build +# has been requested. Do not expose the astc-encoder's +# ASTCENC_UNIVERSAL_BUILD configuration option. + +set(universal_build OFF) +if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") + # Check CMAKE_OSX_ARCHITECTURES for multiple architectures. + list(FIND CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)" archs_standard) + list(LENGTH CMAKE_OSX_ARCHITECTURES architecture_count) + if(NOT ${archs_standard} EQUAL -1 OR architecture_count GREATER 1) + set(universal_build ON) + endif() + # Set ordinary variable to override astc-encoder option's ON default + # and hide the option. + set(ASTCENC_UNIVERSAL_BUILD ${universal_build}) +endif() + +# If we detect the user is doing a universal build defer to astc-encoder +# to pick the architectures. If a universal build has not been requested, +# present options to the user to turn off SIMD and, if running on x86_64 +# to choose which SIMD ISA to use. On arm64 always use Neon. On unknown +# CPUs use None. +# +# On x86_64, if neither ASTCENC_ISA_SSE41 nor ASTCENC_ISA_SSE2 are defined, +# choose ASTCENC_ISA_AVX2. If ASTCENC_ISA_AVX2 fails to compile user must +# choose another x86_64 option. + +if(NOT ${universal_build}) + set(ASTCENC_ISA_NATIVE OFF) + set(ASTCENC_ISA_NEON OFF) + if(NOT CPU_ARCHITECTURE STREQUAL x86_64) + set(ASTCENC_ISA_AVX2 OFF) + set(ASTCENC_ISA_SSE41 OFF) + set(ASTCENC_ISA_SSE2 OFF) + endif() + + # "" in the CACHE sets causes use of the existing documentation string. + if(${ASTCENC_ISA_NONE}) + set(ASTCENC_LIB_TARGET astcenc-none-static) + if(CPU_ARCHITECTURE STREQUAL x86_64) + set(ASTCENC_ISA_AVX2 OFF CACHE BOOL "" FORCE) + set(ASTCENC_ISA_SSE41 OFF CACHE BOOL "" FORCE) + set(ASTCENC_ISA_SSE2 OFF CACHE BOOL "" FORCE) + endif() + else() + if(CPU_ARCHITECTURE STREQUAL x86_64) + if (${ASTCENC_ISA_SSE41}) + set(ASTCENC_LIB_TARGET astcenc-sse4.1-static) + set(ASTCENC_ISA_AVX2 OFF CACHE BOOL "" FORCE) + set(ASTCENC_ISA_SSE2 OFF CACHE BOOL "" FORCE) + elseif (${ASTCENC_ISA_SSE2}) + set(ASTCENC_LIB_TARGET astcenc-sse2-static) + set(ASTCENC_ISA_AVX2 OFF CACHE BOOL "" FORCE) + set(ASTCENC_ISA_SSE41 OFF CACHE BOOL "" FORCE) + else() + set(ASTCENC_LIB_TARGET astcenc-avx2-static) + set(ASTCENC_ISA_AVX2 ON CACHE BOOL "" FORCE) + set(ASTCENC_ISA_SSE41 OFF CACHE BOOL "" FORCE) + set(ASTCENC_ISA_SSE2 OFF CACHE BOOL "" FORCE) + endif() + elseif(CPU_ARCHITECTURE STREQUAL armv8 OR CPU_ARCHITECTURE STREQUAL arm64) + set(ASTCENC_LIB_TARGET astcenc-neon-static) + set(ASTCENC_ISA_NEON ON) + set(ASTCENC_ISA_NONE OFF CACHE BOOL "" FORCE) + else() + message(STATUS "Unsupported ISA for ASTC on ${CPU_ARCHITECTURE} arch, using ASTCENC_ISA_NONE.") + set(ASTCENC_ISA_NONE ON CACHE BOOL "" FORCE) + set(ASTCENC_LIB_TARGET astcenc-none-static) + endif() + endif() +endif() + +# setting ASTCENC_DECOMPRESSOR to ON breaks the build, so force it to OFF +# and hide it from cmake-gui (by using type INTERNAL) +set(ASTCENC_DECOMPRESSOR OFF CACHE INTERNAL "") +set(ASTCENC_CLI OFF) # Only build as library not the CLI astcencoder +# Force static build for astc-encoder +set(BUILD_SHARED_LIBS OFF) +add_subdirectory(external/astc-encoder) +set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_RESET}) +set_property(TARGET ${ASTCENC_LIB_TARGET} PROPERTY POSITION_INDEPENDENT_CODE ON) +target_compile_definitions( + ${ASTCENC_LIB_TARGET} +PRIVATE + # ASTC encoder uses std::mutex. For more info. see comment about + # same setting in libktx starting about line 633. To be eventually + # removed as noted in that comment. + $<$,19.40.33811>>:_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR> + $<$,17.0.3>>:_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR> +) + +macro(set_astc_dependencies target) + if(NOT BUILD_SHARED_LIBS AND APPLE) + # Make a single static library to simplify linking. + add_dependencies(${target} ${ASTCENC_LIB_TARGET}) + add_custom_command( TARGET ${target} + POST_BUILD + COMMAND libtool -static -o $ $ $ + ) + + # Don't know libtool equivalent on Windows or Emscripten. Applications + # will have to link with both ktx and ${ASTCENC_LIB_TARGET}. Static libs + # are unlikely to be used on Windows so not a problem there. For Emscripten + # everything is built into the JS module so not an issue there either. + else() + target_link_libraries(${target} PRIVATE ${ASTCENC_LIB_TARGET}) + endif() +endmacro(set_astc_dependencies) +set_astc_dependencies(ktx) +set_astc_dependencies(ktx_read) + +# Other external projects +# `NOT TARGET`s here are a precaution. They would only be exercised if +# this CMakeLists is included in another project which is unlikely +# except for building the ktx library. +if((KTX_FEATURE_TOOLS OR KTX_FEATURE_TESTS) AND NOT TARGET fmt::fmt) + # Always build fmt static + set(BUILD_SHARED_LIBS OFF) + set(FMT_INSTALL OFF) + set(FMT_SYSTEM_HEADERS ON) + add_subdirectory(external/fmt) + set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_RESET}) +endif() +if(KTX_FEATURE_TOOLS AND NOT TARGET cxxopts::cxxopts) + add_subdirectory(external/cxxopts) +endif() + +# Tools +if(KTX_FEATURE_TOOLS) + add_subdirectory(tools) +endif() + +# Tests +add_subdirectory(tests) + +# Documentation +if(KTX_FEATURE_DOC) + include(cmake/docs.cmake) +endif() + +set(KTX_INSTALL_TARGETS ktx) +if(NOT BUILD_SHARED_LIBS AND NOT APPLE) + list(APPEND KTX_INSTALL_TARGETS ${ASTCENC_LIB_TARGET}) +endif() + +# Install + +if(APPLE OR LINUX) + # Have library's name links as separate component + set(KTX_NAMELINKS ON) + install(TARGETS ${KTX_INSTALL_TARGETS} + EXPORT KTXTargets + ARCHIVE + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT library + FRAMEWORK + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT library + LIBRARY + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT library + NAMELINK_SKIP + PUBLIC_HEADER + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT dev + ) + install(TARGETS ${KTX_INSTALL_TARGETS} + LIBRARY + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT library + NAMELINK_ONLY + ) +else() + # No name links on Windows + set(KTX_NAMELINKS OFF) + install(TARGETS ${KTX_INSTALL_TARGETS} + EXPORT KTXTargets + ARCHIVE + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT dev + LIBRARY + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT library + RUNTIME + DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT library + PUBLIC_HEADER + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT dev + ) +endif() + +# Use of this to install KHR/khr_df.h is due to CMake's failure to +# preserve the include source folder hierarchy. +# See https://gitlab.kitware.com/cmake/cmake/-/issues/16739. +if (APPLE_LOCKED_OS) + set_source_files_properties( + include/KHR/khr_df.h + PROPERTIES MACOSX_PACKAGE_LOCATION Headers/KHR + ) +else() + include(GNUInstallDirs) + install(FILES include/KHR/khr_df.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/KHR + COMPONENT dev + ) +endif() + +install(EXPORT KTXTargets + FILE KtxTargets.cmake + NAMESPACE KTX:: + DESTINATION lib/cmake/ktx + COMPONENT dev +) + +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + "KtxConfigVersion.cmake" + COMPATIBILITY SameMajorVersion +) + +install( FILES + "cmake/KtxConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/KtxConfigVersion.cmake" + DESTINATION lib/cmake/ktx + COMPONENT dev +) + +# CPack + +include(CPackComponent) + +set(CPACK_PACKAGE_NAME "KTX-Software") +set(CPACK_PACKAGE_VENDOR "Khronos Group") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.khronos.org/KTX-Software") +set(CPACK_PACKAGE_CONTACT "khronos@callow.im" ) + +set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Welcome.rtf") +set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/cmake/ReadMe.rtf") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/License.rtf") + +# Custom package file name +# This does not use the ${CPU_ARCHITECTURE} set earlier because the hope is +# that the BasisU SIMD code will be changed to no longer need compile time +# definitions and we can remove the complex cputypetest.cmake. +if( APPLE AND CMAKE_OSX_ARCHITECTURES ) + # CMAKE_SYSTEM_PROCESSOR typically set to build host processor here. + # CMAKE_OSX_ARCHITECTURES governs target of build. + list(LENGTH CMAKE_OSX_ARCHITECTURES archs_len) + list(GET CMAKE_OSX_ARCHITECTURES 0 arch0) + # Cannot use CMAKE_OSX_ARCHITECTURES instead of arch0 due to if() being + # confused by potentially multiple architectures between OR and STREQUAL. + # It's okay in the else() clause but as we've already set arch0... + if( ${archs_len} GREATER 1 OR ${arch0} STREQUAL "$(ARCHS_STANDARD)" ) + set(processor_name "universal") + else() + set(processor_name ${arch0}) + endif() +elseif( CMAKE_CXX_COMPILER_ARCHITECTURE_ID ) + # When targeting Windows arm64 CMAKE_SYSTEM_PROCESSOR will incorrectly + # return AMD64. See: https://gitlab.kitware.com/cmake/cmake/-/issues/15170. + # We assume that when building for Windows arm64 that we are using MSVC + # or ClangCL so we can detect the processor arch name with + # CMAKE_CXX_COMPILER_ARCHITECTURE_ID + set(processor_name ${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}) +elseif( CMAKE_SYSTEM_PROCESSOR ) + if( ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64" ) + # Use consistent package name for all platforms. + set(processor_name "arm64") + else() + set(processor_name ${CMAKE_SYSTEM_PROCESSOR}) + endif() +elseif( APPLE_LOCKED_OS ) + # CMAKE_SYSTEM_PROCESSOR not set when building for iOS/tvOS/visionOS. + set(processor_name "arm64") +endif() +string(TOLOWER "${processor_name}" processor_name) +#message(STATUS "processor_name is ${processor_name}, CPU_ARCHITECTURE is ${CPU_ARCHITECTURE}") +set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${KTX_VERSION_FULL}-${CMAKE_SYSTEM_NAME}-${processor_name}") + +if(APPLE) + if(APPLE_MAC_OS) + install(FILES tools/package/mac/ktx-uninstall + DESTINATION ${CMAKE_INSTALL_BINDIR} + PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE + COMPONENT tools + ) + set(CPACK_GENERATOR productbuild) + # Trick the productbuild generator into creating more useful package IDs + set(CPACK_PACKAGE_NAME "ktx") + set(CPACK_PACKAGE_VENDOR "khronos") + # Install at root level + set(CPACK_PACKAGING_INSTALL_PREFIX "/usr/local") + + set(CPACK_PRODUCTBUILD_IDENTITY_NAME ${PRODUCTBUILD_IDENTITY_NAME}) + set(CPACK_PRODUCTBUILD_KEYCHAIN_PATH ${PRODUCTBUILD_KEYCHAIN_PATH}) + + # Contains the `summary.html` file, shown at end of installation + set(CPACK_PRODUCTBUILD_RESOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tools/package/mac/Resources") + set(CPACK_PRODUCTBUILD_BACKGROUND "ktx_logo_190_xp.png") + set(CPACK_PRODUCTBUILD_BACKGROUND_MIME_TYPE "image/png") + set(CPACK_PRODUCTBUILD_BACKGROUND_ALIGNMENT "bottomleft") + else() + set(CPACK_GENERATOR ZIP) + set(CPACK_ARCHIVE_KTX_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}") + set(CPACK_ARCHIVE_COMPONENT_INSTALL OFF) + set(CPACK_PACKAGE_CHECKSUM SHA1) + endif() +elseif(LINUX) + set(CPACK_GENERATOR DEB RPM TBZ2) + set(CPACK_PACKAGE_CHECKSUM SHA1) + set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/ReadMe.txt") + + # This fixes the directory permission derived from Ubuntu ${BUILD_DIR} of 0775 to 0755. + # otherwise when installing the RPM, it conflicts with the base filesystem.rpm that is + # setting the directory permissions and owns them to 0755. + # See GitHub Issue #827. + # NOTE: Alternatively It would be better build the RPM through a docker or RedHat OS in the CI + set(CPACK_RPM_DEFAULT_DIR_PERMISSIONS + OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) +elseif(WIN32) + set(CPACK_GENERATOR "NSIS") + # Add logo to top left of installer pages. Despite the installer- + # independent variable name, this does nothing for PRODUCTBUILD + # hence setting here only. Format has to be old BMP (use + # BMP3: with ImageMagick `convert`) and the final + # separator must be as shown. Recommended size is 150x57 pixels but + # to my eye on my screen 200x111 is much less aliased than the 150x83 + # proportionally scaled logo. + set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icons/win\\\\ktx_logo_200_bmp3.bmp") + # Set the icon for the installer and uninstaller + set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icons/win/ktx_app.ico") + set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}/icons/win/ktx_app.ico") + # Set icon in Windows' add/remove control panel. Must be an .exe file. + set(CPACK_NSIS_INSTALLED_ICON_NAME uninstall.exe) + set(CPACK_NSIS_MANIFEST_DPI_AWARE ON) + set(CPACK_NSIS_URL_INFO_ABOUT ${CPACK_PACKAGE_HOMEPAGE_URL}) + set(CPACK_NSIS_CONTACT ${CPACK_PACKAGE_CONTACT}) + set(CPACK_NSIS_MODIFY_PATH ON) + set(CPACK_NSIS_UNINSTALL_NAME "Uninstall") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "KTX-Software") + if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20") + set(CPACK_NSIS_BRANDING_TEXT "KTX for Windows") + endif() + ## Alternative: add major version at end + #set(CPACK_PACKAGE_INSTALL_DIRECTORY "KTX-Software-${PROJECT_VERSION_MAJOR}") + if (CODE_SIGN_KEY_VAULT) + set_nsis_installer_codesign_cmd() + else() + # We're not signing the package so provide a checksum file. + set(CPACK_PACKAGE_CHECKSUM SHA1) + endif() +elseif(EMSCRIPTEN) + set(CPACK_GENERATOR ZIP) + set(CPACK_ARCHIVE_KTX_JS_FILE_NAME "${CMAKE_PROJECT_NAME}-${KTX_VERSION_FULL}-Web-libktx") + set(CPACK_ARCHIVE_KTX_JS_READ_FILE_NAME "${CMAKE_PROJECT_NAME}-${KTX_VERSION_FULL}-Web-libktx_read") + set(CPACK_ARCHIVE_MSC_BASIS_TRANSCODER_JS_FILE_NAME "${CMAKE_PROJECT_NAME}-${KTX_VERSION_FULL}-Web-msc_basis_transcoder") + + set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) + set(CPACK_PACKAGE_CHECKSUM SHA1) +else() + set(CPACK_PACKAGE_CHECKSUM SHA1) +endif() + +cpack_add_component(library + DISPLAY_NAME "Library" + DESCRIPTION "Main KTX library." + REQUIRED +) +#cpack_add_component(Namelinks +# DEPENDS library +# HIDDEN +#) +cpack_add_component(jni + DISPLAY_NAME "Java wrapper" + DESCRIPTION "Java wrapper and native interface for KTX library." + DEPENDS library + DISABLED +) +cpack_add_component(tools + DISPLAY_NAME "Command line tools" + DESCRIPTION "Command line tools for creating, converting and inspecting KTX files." + DEPENDS library +) +cpack_add_component(dev + DISPLAY_NAME "Development" + DESCRIPTION "Additional resources for development (header files and documentation)." + DEPENDS library + DISABLED +) +cpack_add_component(GlLoadTestApps + GROUP LoadTestApps + DISPLAY_NAME "OpenGL Test Applications" + DISABLED +) +cpack_add_component(VkLoadTestApp + GROUP LoadTestApps + DISPLAY_NAME "Vulkan Test Application" + DISABLED +) +cpack_add_component_group(LoadTestApps + DISPLAY_NAME "Load Test Applications" +) + +if(EMSCRIPTEN) + set(CPACK_COMPONENTS_ALL + ktx_js + ktx_js_read + msc_basis_transcoder_js + ) +else() + set(CPACK_COMPONENTS_ALL + library + dev + ) + if(KTX_FEATURE_TOOLS) + list(APPEND CPACK_COMPONENTS_ALL + tools + ) + endif() + if(KTX_FEATURE_JNI) + list(APPEND CPACK_COMPONENTS_ALL + jni + ) + endif() +# if(${KTX_FEATURE_LOADTEST_APPS} MATCHES "OpenGL") +# list(APPEND CPACK_COMPONENTS_ALL +# GLLoadTestApps +# ) +# endif() +# if(${KTX_FEATURE_LOADTEST_APP} MATCHES "Vulkan") +# list(APPEND CPACK_COMPONENTS_ALL +# VkLoadTestApp +# ) +# endif() +endif() +# if(KTX_NAMELINKS) +# list(APPEND CPACK_COMPONENTS_ALL +# Namelinks +# ) +# endif() + +include(CPack) + +# vim:ai:ts=4:sts=2:sw=2:expandtab diff --git a/ktx/CODE_OF_CONDUCT.md b/ktx/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..9850d5b --- /dev/null +++ b/ktx/CODE_OF_CONDUCT.md @@ -0,0 +1,4 @@ +Copyright 2013-2020 Mark Callow +SPDX-License-Identifier: Apache-2.0 + +A reminder that this issue tracker is managed by the Khronos Group. Interactions here should follow the Khronos Code of Conduct (https://www.khronos.org/developers/code-of-conduct), which prohibits aggressive or derogatory language. Please keep the discussion friendly and civil. diff --git a/ktx/CONTRIBUTING.md b/ktx/CONTRIBUTING.md new file mode 100644 index 0000000..f731226 --- /dev/null +++ b/ktx/CONTRIBUTING.md @@ -0,0 +1,16 @@ + + + +## How to contribute to the KTX library and tools. + +1. Make sure you have a GitHub account. +2. Fork the repository on GitHub. +3. Make changes to your clone of the repository. +4. Update or supplement the tests as necessary in this +repository and in the [Conformance Test Suite](https://github.com/KhronosGroup/KTX-Software-CTS/). +5. Submit a pull request against _main_. + +If you will be generating documentation with or preparing +distribution archives, you **must** follow +[these instructions](README.md#kwexpansion) to install a +smudge/clean filter for expanding keywords. diff --git a/ktx/LICENSE.md b/ktx/LICENSE.md new file mode 100644 index 0000000..7b6d05f --- /dev/null +++ b/ktx/LICENSE.md @@ -0,0 +1,36 @@ +LICENSE file for the KhronosGroup/KTX-Software project {#license} +====================================================== + + + +Files unique to this repository generally fall under the Apache 2.0 license +with copyright holders including Mark Callow, the KTX-Software author; The +Khronos Group Inc., which has supported KTX development; and other +contributors to the KTX project. + +Because KTX-Software incorporates material and contributions from many other +projects, which often have their own licenses, there are many other licenses +in use in this repository. While there are many licenses in this repository, +with rare exceptions all are open source licenses that we believe to be +mutually compatible. + +The complete text of each of the licenses used in this repository is found +in LICENSES/*.txt . Additionally, we have updated the repository to pass the +REUSE compliance checker tool (see https://reuse.software/). REUSE verifies +that every file in a git repository either incorporates a license, or that +the license is present in auxiliary files such as .reuse/dep5 . To obtain a +bill of materials for the repository identifying the license for each file, +install the REUSE tool and run + + reuse spdx + +inside the repository. + +## Special Cases + +The file lib/etcdec.cxx is not open source. It is made available under the +terms of an Ericsson license, found in the file itself. diff --git a/ktx/LICENSES/Apache-2.0.txt b/ktx/LICENSES/Apache-2.0.txt new file mode 100644 index 0000000..4ed90b9 --- /dev/null +++ b/ktx/LICENSES/Apache-2.0.txt @@ -0,0 +1,208 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, +AND DISTRIBUTION + + 1. Definitions. + + + +"License" shall mean the terms and conditions for use, reproduction, and distribution +as defined by Sections 1 through 9 of this document. + + + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + + + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct +or indirect, to cause the direction or management of such entity, whether +by contract or otherwise, or (ii) ownership of fifty percent (50%) or more +of the outstanding shares, or (iii) beneficial ownership of such entity. + + + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions +granted by this License. + + + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + + + +"Object" form shall mean any form resulting from mechanical transformation +or translation of a Source form, including but not limited to compiled object +code, generated documentation, and conversions to other media types. + + + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice that +is included in or attached to the work (an example is provided in the Appendix +below). + + + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative +Works shall not include works that remain separable from, or merely link (or +bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative +Works thereof, that is intentionally submitted to Licensor for inclusion in +the Work by the copyright owner or by an individual or Legal Entity authorized +to submit on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication +sent to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor +for the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + + + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently incorporated +within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this +License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable copyright license to reproduce, prepare +Derivative Works of, publicly display, publicly perform, sublicense, and distribute +the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, +each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) patent +license to make, have made, use, offer to sell, sell, import, and otherwise +transfer the Work, where such license applies only to those patent claims +licensable by such Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work to which such +Contribution(s) was submitted. If You institute patent litigation against +any entity (including a cross-claim or counterclaim in a lawsuit) alleging +that the Work or a Contribution incorporated within the Work constitutes direct +or contributory patent infringement, then any patent licenses granted to You +under this License for that Work shall terminate as of the date such litigation +is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or +Derivative Works thereof in any medium, with or without modifications, and +in Source or Object form, provided that You meet the following conditions: + +(a) You must give any other recipients of the Work or Derivative Works a copy +of this License; and + +(b) You must cause any modified files to carry prominent notices stating that +You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source +form of the Work, excluding those notices that do not pertain to any part +of the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its distribution, +then any Derivative Works that You distribute must include a readable copy +of the attribution notices contained within such NOTICE file, excluding those +notices that do not pertain to any part of the Derivative Works, in at least +one of the following places: within a NOTICE text file distributed as part +of the Derivative Works; within the Source form or documentation, if provided +along with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works +that You distribute, alongside or as an addendum to the NOTICE text from the +Work, provided that such additional attribution notices cannot be construed +as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, +or distribution of Your modifications, or for any such Derivative Works as +a whole, provided Your use, reproduction, and distribution of the Work otherwise +complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any +Contribution intentionally submitted for inclusion in the Work by You to the +Licensor shall be under the terms and conditions of this License, without +any additional terms or conditions. Notwithstanding the above, nothing herein +shall supersede or modify the terms of any separate license agreement you +may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, +trademarks, service marks, or product names of the Licensor, except as required +for reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to +in writing, Licensor provides the Work (and each Contributor provides its +Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied, including, without limitation, any warranties +or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR +A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness +of using or redistributing the Work and assume any risks associated with Your +exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether +in tort (including negligence), contract, or otherwise, unless required by +applicable law (such as deliberate and grossly negligent acts) or agreed to +in writing, shall any Contributor be liable to You for damages, including +any direct, indirect, special, incidental, or consequential damages of any +character arising as a result of this License or out of the use or inability +to use the Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all other commercial +damages or losses), even if such Contributor has been advised of the possibility +of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work +or Derivative Works thereof, You may choose to offer, and charge a fee for, +acceptance of support, warranty, indemnity, or other liability obligations +and/or rights consistent with this License. However, in accepting such obligations, +You may act only on Your own behalf and on Your sole responsibility, not on +behalf of any other Contributor, and only if You agree to indemnify, defend, +and hold each Contributor harmless for any liability incurred by, or claims +asserted against, such Contributor by reason of your accepting any such warranty +or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own identifying +information. (Don't include the brackets!) The text should be enclosed in +the appropriate comment syntax for the file format. We also recommend that +a file or class name and description of purpose be included on the same "printed +page" as the copyright notice for easier identification within third-party +archives. + +Copyright [yyyy] [name of copyright owner] + +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. diff --git a/ktx/LICENSES/BSD-1-Clause.txt b/ktx/LICENSES/BSD-1-Clause.txt new file mode 100644 index 0000000..bff05ec --- /dev/null +++ b/ktx/LICENSES/BSD-1-Clause.txt @@ -0,0 +1,17 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ktx/LICENSES/BSD-2-Clause.txt b/ktx/LICENSES/BSD-2-Clause.txt new file mode 100644 index 0000000..cdf557b --- /dev/null +++ b/ktx/LICENSES/BSD-2-Clause.txt @@ -0,0 +1,23 @@ +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/ktx/LICENSES/BSD-3-Clause.txt b/ktx/LICENSES/BSD-3-Clause.txt new file mode 100644 index 0000000..9cc70bc --- /dev/null +++ b/ktx/LICENSES/BSD-3-Clause.txt @@ -0,0 +1,27 @@ +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its +contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/ktx/LICENSES/BSL-1.0.txt b/ktx/LICENSES/BSL-1.0.txt new file mode 100644 index 0000000..36b7cd9 --- /dev/null +++ b/ktx/LICENSES/BSL-1.0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/ktx/LICENSES/CC-BY-3.0.txt b/ktx/LICENSES/CC-BY-3.0.txt new file mode 100644 index 0000000..55be1f3 --- /dev/null +++ b/ktx/LICENSES/CC-BY-3.0.txt @@ -0,0 +1,59 @@ +Creative Commons Attribution 3.0 Unported + +CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + +"Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. +"Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. +"Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. +"Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. +"Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. +"Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. +"You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. +"Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. +"Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + +to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; +to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; +to Distribute and Publicly Perform the Work including as incorporated in Collections; and, +to Distribute and Publicly Perform Adaptations. +For the avoidance of doubt: + +Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; +Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, +Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + +You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. +If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. +Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + +This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. +Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. +8. Miscellaneous + +Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. +Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. +If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. +No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. +This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. +The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. diff --git a/ktx/LICENSES/CC-BY-4.0.txt b/ktx/LICENSES/CC-BY-4.0.txt new file mode 100644 index 0000000..ea24cac --- /dev/null +++ b/ktx/LICENSES/CC-BY-4.0.txt @@ -0,0 +1,96 @@ +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + + Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. + Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + Licensor means the individual(s) or entity(ies) granting rights under this Public License. + Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + License grant. + Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + reproduce and Share the Licensed Material, in whole or in part; and + produce, reproduce, and Share Adapted Material. + Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + Term. The term of this Public License is specified in Section 6(a). + Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + Downstream recipients. + Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + + Other rights. + Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + Patent and trademark rights are not licensed under this Public License. + To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + + Attribution. + + If You Share the Licensed Material (including in modified form), You must: + retain the following if it is supplied by the Licensor with the Licensed Material: + identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + a copyright notice; + a notice that refers to this Public License; + a notice that refers to the disclaimer of warranties; + a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + + for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; + if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and + You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + + Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. + To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. + + The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + + This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + + Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + upon express reinstatement by the Licensor. + For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + + The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. + + For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + diff --git a/ktx/LICENSES/CC0-1.0.txt b/ktx/LICENSES/CC0-1.0.txt new file mode 100644 index 0000000..730f2e5 --- /dev/null +++ b/ktx/LICENSES/CC0-1.0.txt @@ -0,0 +1,29 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + +CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: +i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; +ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; +iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; +v. rights protecting the extraction, dissemination, use and reuse of data in a Work; +vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and +vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. +2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. +3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. +4. Limitations and Disclaimers. +a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. +b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. +c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. +d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. diff --git a/ktx/LICENSES/LicenseRef-Cesium-Trademark-Terms.txt b/ktx/LICENSES/LicenseRef-Cesium-Trademark-Terms.txt new file mode 100644 index 0000000..06d1b85 --- /dev/null +++ b/ktx/LICENSES/LicenseRef-Cesium-Trademark-Terms.txt @@ -0,0 +1,39 @@ +The following text is copied and pasted from https://github.com/AnalyticalGraphicsInc/cesium/wiki/CesiumTrademark.pdf, which are the "Trademark Terms and Conditions" under which an image in this repository was contributed by AGI. Please refer to the original link as the authoritative text; this file exists only for REUSE license-checker compliance. + +Trademark Terms and Conditions + +Analytical Graphics®, Cesium®, and Cesium Pro™ are trademarks owned by AGI. AGI uses these +trademarks/logos to identify AGI as a company and also AGI’s products, services and activities. AGI maintains +control over the usage of its trademarks, and this document sets forth who may use these trademarks, and under what +terms and conditions these trademarks may be used. +Fair Use +AGI’s trademarks/logos may be used in instances when the use of such falls under a category of fair use. Examples +of fair use include research, teaching, and educational purposes. If you use AGI’s trademarks/logos for this purpose, +you must give AGI proper credit and identify AGI as the owner of the trademarks/logos. +Do not use AGI’s trademarks/logos in any of your products or services that compete with any of AGI’s products or +services. Use of AGI’s trademark/logos in your competing product or service is trademark infringement, and AGI +will take legal action against you for violating this provision. +Laymen’s Terms: You are not allowed to use the Cesium trademark to compete with AGI. If you do, AGI will take +you to court. You can use the trademark without our permission for socially productive purposes, such as presenting +Cesium in a conference. If you do so, make sure you identify AGI as the owner of the trademark. +Usage Guidelines +Avoid mistakes when reproducing AGI’s trademarks/logos. Do not separate the elements of the logo or alter the +logo in any way. Do not rotate or animate it, and do not use any part of the logo as a graphic element, background, +or pattern in any way that competes with AGI. +Do not translate or localize the logos, and do not add anything to the logos. Do not attempt to set the logotype, +change the font, or alter the size, proportions, or space between letters. You must use AGI’s trademarks/logos +exactly as they are provided by AGI. +Laymen’s Terms: When using our trademark(s), do not modify or change them in any way. +Other Uses +For any uses other than those identified in this document, you must contact AGI for express written permission. AGI +reserves the right to reject your request to use AGI’s trademarks/logos for any reason. AGI’s contact information is +below. +Laymen’s Terms: You need our permission to use our trademarks for any reasons not stated above. If you send us a +request to use our trademarks, we can say no for any reason. + +Corporate Contact Info: +Analytical Graphics, Inc. +220 Valley Creek Blvd. +Exton, Pennsylvania 19341 +1.610.981-8000 +contracts@agi.com diff --git a/ktx/LICENSES/LicenseRef-ETCSLA.txt b/ktx/LICENSES/LicenseRef-ETCSLA.txt new file mode 100644 index 0000000..d47217a --- /dev/null +++ b/ktx/LICENSES/LicenseRef-ETCSLA.txt @@ -0,0 +1,109 @@ +(C) Ericsson AB 2013. All Rights Reserved. + +Software License Agreement + +PLEASE REVIEW THE FOLLOWING TERMS AND CONDITIONS PRIOR TO USING THE +ERICSSON TEXTURE COMPRESSION CODEC SOFTWARE (THE "SOFTWARE"). THE USE +OF THE SOFTWARE IS SUBJECT TO THE TERMS AND CONDITIONS OF THE +FOLLOWING SOFTWARE LICENSE AGREEMENT (THE "SLA"). IF YOU DO NOT ACCEPT +SUCH TERMS AND CONDITIONS YOU MAY NOT USE THE SOFTWARE. + +Subject to the terms and conditions of the SLA, the licensee of the +Software (the "Licensee") hereby, receives a non-exclusive, +non-transferable, limited, free-of-charge, perpetual and worldwide +license, to copy, use, distribute and modify the Software, but only +for the purpose of developing, manufacturing, selling, using and +distributing products including the Software in binary form, which +products are used for compression and/or decompression according to +the Khronos standard specifications OpenGL, OpenGL ES and +WebGL. Notwithstanding anything of the above, Licensee may distribute +[etcdec.cxx] in source code form provided (i) it is in unmodified +form; and (ii) it is included in software owned by Licensee. + +If Licensee institutes, or threatens to institute, patent litigation +against Ericsson or Ericsson's affiliates for using the Software for +developing, having developed, manufacturing, having manufactured, +selling, offer for sale, importing, using, leasing, operating, +repairing and/or distributing products (i) within the scope of the +Khronos framework; or (ii) using software or other intellectual +property rights owned by Ericsson or its affiliates and provided under +the Khronos framework, Ericsson shall have the right to terminate this +SLA with immediate effect. Moreover, if Licensee institutes, or +threatens to institute, patent litigation against any other licensee +of the Software for using the Software in products within the scope of +the Khronos framework, Ericsson shall have the right to terminate this +SLA with immediate effect. However, should Licensee institute, or +threaten to institute, patent litigation against any other licensee of +the Software based on such other licensee's use of any other software +together with the Software, then Ericsson shall have no right to +terminate this SLA. + +This SLA does not transfer to Licensee any ownership to any Ericsson +or third party intellectual property rights. All rights not expressly +granted by Ericsson under this SLA are hereby expressly +reserved. Furthermore, nothing in this SLA shall be construed as a +right to use or sell products in a manner which conveys or purports to +convey whether explicitly, by principles of implied license, or +otherwise, any rights to any third party, under any patent of Ericsson +or of Ericsson's affiliates covering or relating to any combination of +the Software with any other software or product (not licensed +hereunder) where the right applies specifically to the combination and +not to the software or product itself. + +THE SOFTWARE IS PROVIDED "AS IS". ERICSSON MAKES NO REPRESENTATIONS OF +ANY KIND, EXTENDS NO WARRANTIES OR CONDITIONS OF ANY KIND, EITHER +EXPRESS, IMPLIED OR STATUTORY; INCLUDING, BUT NOT LIMITED TO, EXPRESS, +IMPLIED OR STATUTORY WARRANTIES OR CONDITIONS OF TITLE, +MERCHANTABILITY, SATISFACTORY QUALITY, SUITABILITY, AND FITNESS FOR A +PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE +OF THE SOFTWARE IS WITH THE LICENSEE. SHOULD THE SOFTWARE PROVE +DEFECTIVE, THE LICENSEE ASSUMES THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. ERICSSON MAKES NO WARRANTY THAT THE MANUFACTURE, +SALE, OFFERING FOR SALE, DISTRIBUTION, LEASE, USE OR IMPORTATION UNDER +THE SLA WILL BE FREE FROM INFRINGEMENT OF PATENTS, COPYRIGHTS OR OTHER +INTELLECTUAL PROPERTY RIGHTS OF OTHERS, AND THE VALIDITY OF THE +LICENSE AND THE SLA ARE SUBJECT TO LICENSEE'S SOLE RESPONSIBILITY TO +MAKE SUCH DETERMINATION AND ACQUIRE SUCH LICENSES AS MAY BE NECESSARY +WITH RESPECT TO PATENTS, COPYRIGHT AND OTHER INTELLECTUAL PROPERTY OF +THIRD PARTIES. + +THE LICENSEE ACKNOWLEDGES AND ACCEPTS THAT THE SOFTWARE (I) IS NOT +LICENSED FOR; (II) IS NOT DESIGNED FOR OR INTENDED FOR; AND (III) MAY +NOT BE USED FOR; ANY MISSION CRITICAL APPLICATIONS SUCH AS, BUT NOT +LIMITED TO OPERATION OF NUCLEAR OR HEALTHCARE COMPUTER SYSTEMS AND/OR +NETWORKS, AIRCRAFT OR TRAIN CONTROL AND/OR COMMUNICATION SYSTEMS OR +ANY OTHER COMPUTER SYSTEMS AND/OR NETWORKS OR CONTROL AND/OR +COMMUNICATION SYSTEMS ALL IN WHICH CASE THE FAILURE OF THE SOFTWARE +COULD LEAD TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL, MATERIAL OR +ENVIRONMENTAL DAMAGE. LICENSEE'S RIGHTS UNDER THIS LICENSE WILL +TERMINATE AUTOMATICALLY AND IMMEDIATELY WITHOUT NOTICE IF LICENSEE +FAILS TO COMPLY WITH THIS PARAGRAPH. + +IN NO EVENT SHALL ERICSSON BE LIABLE FOR ANY DAMAGES WHATSOEVER, +INCLUDING BUT NOT LIMITED TO PERSONAL INJURY, ANY GENERAL, SPECIAL, +INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING +BUT NOT LIMITED TO LOSS OF PROFITS, BUSINESS INTERUPTIONS, OR ANY +OTHER COMMERCIAL DAMAGES OR LOSSES, LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY THE LICENSEE OR THIRD +PARTIES OR A FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER +SOFTWARE) REGARDLESS OF THE THEORY OF LIABILITY (CONTRACT, TORT, OR +OTHERWISE), EVEN IF THE LICENSEE OR ANY OTHER PARTY HAS BEEN ADVISED +OF THE POSSIBILITY OF SUCH DAMAGES. + +Licensee acknowledges that "ERICSSON ///" is the corporate trademark +of Telefonaktiebolaget LM Ericsson and that both "Ericsson" and the +figure "///" are important features of the trade names of +Telefonaktiebolaget LM Ericsson. Nothing contained in these terms and +conditions shall be deemed to grant Licensee any right, title or +interest in the word "Ericsson" or the figure "///". No delay or +omission by Ericsson to exercise any right or power shall impair any +such right or power to be construed to be a waiver thereof. Consent by +Ericsson to, or waiver of, a breach by the Licensee shall not +constitute consent to, waiver of, or excuse for any other different or +subsequent breach. + +This SLA shall be governed by the substantive law of Sweden. Any +dispute, controversy or claim arising out of or in connection with +this SLA, or the breach, termination or invalidity thereof, shall be +submitted to the exclusive jurisdiction of the Swedish Courts. diff --git a/ktx/LICENSES/LicenseRef-HI-Trademark.txt b/ktx/LICENSES/LicenseRef-HI-Trademark.txt new file mode 100644 index 0000000..0ccddc9 --- /dev/null +++ b/ktx/LICENSES/LicenseRef-HI-Trademark.txt @@ -0,0 +1,5 @@ +The HI logo textures are copyright by & trademarks of HI Corporation and are +provided for use only in testing the KTX loader. Any other use requires +specific prior written permission from HI. Furthermore the name HI may +not be used to endorse or promote products derived from this software +without specific prior written permission. diff --git a/ktx/LICENSES/LicenseRef-Kodak.txt b/ktx/LICENSES/LicenseRef-Kodak.txt new file mode 100644 index 0000000..9a7f26b --- /dev/null +++ b/ktx/LICENSES/LicenseRef-Kodak.txt @@ -0,0 +1,7 @@ +This LICENSES file applies to images from the Kodak Lossless True Color +Image Suite, and exists only for REUSE compliance. According to +http://r0k.us/graphics/kodak/ , for such images: + +"It is my understanding they have been released by the Eastman Kodak Company +for unrestricted usage. Many sites use them as a standard test suite for +compression testing, etc." diff --git a/ktx/LICENSES/LicenseRef-PNGSuite.txt b/ktx/LICENSES/LicenseRef-PNGSuite.txt new file mode 100644 index 0000000..1bb39a9 --- /dev/null +++ b/ktx/LICENSES/LicenseRef-PNGSuite.txt @@ -0,0 +1,14 @@ +The following text is copied and pasted from +http://www.schaik.com/pngsuite/PngSuite.LICENSE , which is the license under +which an image from the PngSuite project is used. Please refer to the +original link as the authoritative text; this file exists only for REUSE +license-checker compliance. + +PngSuite +-------- + +Permission to use, copy, modify and distribute these images for any +purpose and without fee is hereby granted. + + +(c) Willem van Schaik, 1996, 2011 diff --git a/ktx/LICENSES/LicenseRef-fmt.txt b/ktx/LICENSES/LicenseRef-fmt.txt new file mode 100644 index 0000000..1cd1ef9 --- /dev/null +++ b/ktx/LICENSES/LicenseRef-fmt.txt @@ -0,0 +1,27 @@ +Copyright (c) 2012 - present, Victor Zverovich and {fmt} contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. diff --git a/ktx/LICENSES/MIT.txt b/ktx/LICENSES/MIT.txt new file mode 100644 index 0000000..204b93d --- /dev/null +++ b/ktx/LICENSES/MIT.txt @@ -0,0 +1,19 @@ +MIT License Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/ktx/LICENSES/Zlib.txt b/ktx/LICENSES/Zlib.txt new file mode 100644 index 0000000..508a9b5 --- /dev/null +++ b/ktx/LICENSES/Zlib.txt @@ -0,0 +1,20 @@ +Copyright (c) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. diff --git a/ktx/NOTICE.md b/ktx/NOTICE.md new file mode 120000 index 0000000..f0c4298 --- /dev/null +++ b/ktx/NOTICE.md @@ -0,0 +1 @@ +LICENSE.md \ No newline at end of file diff --git a/ktx/README.md b/ktx/README.md new file mode 100644 index 0000000..3ef881b --- /dev/null +++ b/ktx/README.md @@ -0,0 +1,165 @@ + + + + + +## The Official Khronos KTX Software Repository + + +| GNU/Linux | iOS, macOS | Web / wasm | Windows | Android | Mingw | +| :-------: | :--------: | :--------: | :-----: | :-----: | :---: | +| ![KTX-Software CI](https://github.com/KhronosGroup/KTX-Software/actions/workflows/linux.yml/badge.svg) | ![KTX-Software CI](https://github.com/KhronosGroup/KTX-Software/actions/workflows/macos.yml/badge.svg) | ![KTX-Software CI](https://github.com/KhronosGroup/KTX-Software/actions/workflows/web.yml/badge.svg) | ![KTX-Software CI](https://github.com/KhronosGroup/KTX-Software/actions/workflows/windows.yml/badge.svg) | ![KTX-Software CI](https://github.com/KhronosGroup/KTX-Software/actions/workflows/android.yml/badge.svg) | ![KTX-Software CI](https://github.com/KhronosGroup/KTX-Software/actions/workflows/mingw.yml/badge.svg) | + +| Documentation | Check-reuse | Check-mkvk | +| :-----------: | :---------: | :--------: | +| ![KTX-Software CI](https://github.com/KhronosGroup/KTX-Software/actions/workflows/docs.yml/badge.svg) | ![KTX-Software CI](https://github.com/KhronosGroup/KTX-Software/actions/workflows/check-reuse.yml/badge.svg) | ![KTX-Software CI](https://github.com/KhronosGroup/KTX-Software/actions/workflows/check-mkvk.yml/badge.svg) + +This is the official home of the source code for the Khronos KTX library and tools. + +KTX (Khronos Texture) is a lightweight container for textures for OpenGL®, Vulkan® and other GPU APIs. KTX files contain all the parameters needed for texture loading. A single file can contain anything from a simple base-level 2D texture through to a cubemap array texture with mipmaps. Contained textures can be in a Basis Universal format, in any of the block-compressed formats supported by OpenGL family and Vulkan APIs and extensions or in an uncompressed single-plane format. Basis Universal currently encompasses two formats that can be quickly transcoded to any GPU-supported format: LZ/ETC1S, which combines block-compression and supercompression, and UASTC, a block-compressed format. Formats other than LZ/ETC1S can be supercompressed with Zstd and ZLIB. + +Download [KTX Software Releases](https://github.com/KhronosGroup/KTX-Software/releases) +to get binary packages of the tools, library and development headers +described below. The [Releases](https://github.com/KhronosGroup/KTX-Software/releases) +page also has packages with the Javascript wrappers and .wasm binaries. + +See the Doxygen generated [live documentation](https://github.khronos.org/KTX-Software/) +for API and tool usage information. + +The software consists of: (links are to source folders in the KhronosGroup repo) + +- *libktx* - a small library of functions for writing and reading KTX +files, and instantiating OpenGL®, OpenGL ES™️ and Vulkan® textures +from them. [`lib`](https://github.com/KhronosGroup/KTX-Software/tree/main/lib) +- *libktx.{js,wasm}* - Web assembly version of libktx and +Javascript wrapper. [`interface/js_binding`](https://github.com/KhronosGroup/KTX-Software/tree/main/interface/js_binding) +- *msc\_basis\_transcoder.{js,wasm}* - Web assembly transcoder and +Javascript wrapper for Basis Universal formats. For use with KTX parsers written in Javascript. [`interface/js_binding`](https://github.com/KhronosGroup/KTX-Software/tree/main/interface/js_binding) +- *libktx.jar, libktx-jni* - Java wrapper and native interface library. +[`interface/java_binding`](https://github.com/KhronosGroup/KTX-Software/tree/main/interface/java_binding) +- *ktx* - a generic command line tool for managing KTX2 files with subcommands.[`tools/ktx`](https://github.com/KhronosGroup/KTX-Software/tree/main/tools/ktx) + - *ktx compare* - Compare two KTX2 files + - *ktx create* - Create a KTX2 file from various input files + - *ktx deflate* - Deflate a KTX2 file with zstd or ZLIB + - *ktx extract* - Export selected images from a KTX2 file + - *ktx encode* - Encode a KTX2 file + - *ktx transcode* - Transcode a KTX2 file + - *ktx info* - Prints information about a KTX2 file + - *ktx validate* - Validate a KTX2 file + - *ktx help* - Display help information about the ktx tools +- *ktx2check* - a tool for validating KTX Version 2 format files. [`tools/ktx2check`](https://github.com/KhronosGroup/KTX-Software/tree/main/tools/ktx2check) +- *ktx2ktx2* - a tool for converting a KTX Version 1 file to a KTX +Version 2 file. [`tools/ktx2ktx2`](https://github.com/KhronosGroup/KTX-Software/tree/main/tools/ktx2ktx2) +- *ktxinfo* - a tool to display information about a KTX file in +human readable form. [`tools/ktxinfo`](https://github.com/KhronosGroup/KTX-Software/tree/main/tools/ktxinfo) +- *ktxsc* - a tool to supercompress a KTX Version 2 file that +contains uncompressed images.[`tools/ktxsc`](https://github.com/KhronosGroup/KTX-Software/tree/main/tools/ktxsc) +- *pyktx* - Python wrapper +- *toktx* - a tool to create KTX files from PNG, Netpbm or JPEG format images. It supports mipmap generation, encoding to +Basis Universal formats and Zstd supercompression.[`tools/toktx`](https://github.com/KhronosGroup/KTX-Software/tree/main/tools/toktx) + +See [CONTRIBUTING](CONTRIBUTING.md) for information about contributing. + +See [LICENSE](LICENSE.md) for information about licensing. + +See [BUILDING](BUILDING.md) for information about building the code. + + + +If you need help with using the KTX library or KTX tools, please use GitHub +[Discussions](https://github.com/KhronosGroup/KTX-Software/discussions). +To report problems use GitHub [issues](https://github.com/KhronosGroup/KTX/issues). + +**IMPORTANT:** you **must** install the [Git LFS](https://github.com/github/git-lfs) +command line extension in order to fully checkout this repository after cloning. You +need at least version 1.1. If you did not have Git LFS installed at first checkout +then, after installing it, you **must** run + +```bash +git lfs checkout +``` + +### KTX-Software-CTS - Conformance Test Suite + +The tests and test files for the generic command line `ktx` tool can be found in a separate +[CTS Repository](https://github.com/KhronosGroup/KTX-Software-CTS/). To save space and bandwidth this repository +is included with git submodule and by default it is not required for building the libraries or the tools. +For more information about building, running and extending the CTS tests see [BUILDING](BUILDING.md#Conformance-Test-Suite) +and [CTS README](https://github.com/KhronosGroup/KTX-Software-CTS/blob/main/README.md). + +### $Date$ keyword expansion + +A few files have `$Date$` keywords. If you care about having the proper +dates shown or will be generating the documentation or preparing +distribution archives, you **must** follow the instructions below. + +$Date$ keywords are expanded via smudge & clean filters. To install +the filters, issue the following commands in the root of your clone. + +On Unix (Linux, Mac OS X, etc.) platforms and Windows using Git for +Windows' Git Bash or Cygwin's bash terminal: + +```bash +./install-gitconfig.sh +./scripts/smudge_date.sh + +``` + +On Windows PowerShell (requires `git.exe` in a directory +on your %PATH%): + +```ps1 +install-gitconfig.ps1 +./scripts/smudge_date.ps1 +``` + +The first command adds an [include] of the repo's `.gitconfig` to the +local git config file `.git/config`, i.e. the one in your clone of the repo. +`.gitconfig` contains the config of the "keyworder" filter. The script in +the second command forces a new checkout of the affected files to smudge them +with their last modified date. This is unnecessary if you plan to edit +these files. + +### Useful Tools + +#### scripts/gk + +For finding strings within the KTX-Software source. Type `scripts/gk -h` for help. `gk` avoids looking in any build directories, `.git`, `external` or `tests/cts`. + +#### scripts/ktx-compare-git + +Wrapper that allows use of `ktx compare` when using `git diff` on KTX2 files. +Together with this, `.gitconfig` now includes a *ktx-compare* diff command. +Those wishing to use this must run, or have run, install-gitconfig.{ps1,sh} +as described above for keyword expansion so that `.gitconfig` is +included by your local `.git/config`. + +You need to have the `ktx` command installed in a directory on your $PATH. + +You need to add the line + +``` +*.ktx2 binary diff=ktx-compare +``` + +to your repo clone's `.git/info/attributes`. This is not included in the repo's +`.gitattributes` because not everyone will have the `ktx` command installed nor have `.gitconfig` included by `.git/config`. + +*NOTE:* This line in a user-global or system-global Git attributes file will not +work because those are lower priority than `.gitattributes` so are read first +and `.gitattributes` already has an entry for *.ktx2, indicating binary, which +overrides anything from the global files. + +To set up your `tests/cts` submodule to use this, copy the *ktx-compare* diff +command to `.git/modules/tests/cts/config`. Depending on when you set up the +submodule and when you ran `install-gitconfig.sh`, it may already be there. +Add the attribute line to `.git/modules/tests/cts/info/attributes`. + +We will be happy to accept a PR to add a .ps1 equivalent script. + diff --git a/ktx/RELEASE_NOTES.md b/ktx/RELEASE_NOTES.md new file mode 100644 index 0000000..34fb40e --- /dev/null +++ b/ktx/RELEASE_NOTES.md @@ -0,0 +1,209 @@ + + +Release Notes +============= +## Version 4.4.2 +### Notice +v4.4.2 is an emergency release that replaces v4.4.1 which has been withdrawn. It +fixes the version number in the release assets. There are no other changes +compared to v4.4.1. + +### Summary + +* `ktxTexture2_DecodeAstc` now exposed in _libktx\_read_ on all platforms and in + the JS bindings. +* `ktx info` can now show info about KTX v1 files. It and the underlying _libktx_ + function now display GL type and format token names instead of hex values. +* Many bugs and robustness issues have been fixed. Many of these address changes + in CI runner images and the latest compilers. +* ASTC encoder updated to 5.3.0. +* LodePNG updated to 20250506. +* Building with Visual Studio 2019 is no longer supported. + +__The legacy tools will be removed in Release 4.5. Adjust your workflows accordingly.__ + +### New Features in v4.4.2 +#### libktx functions + +* `ktxTexture2_DecodeAstc`, which decodes an ASTC format texture to an + uncompressed format, is now available in _libktx\_read_ on all platforms and in + both the _libktx_ and _libktx\_read_ JS bindings. +* `ktxPrintKTX1InfoTextForStream`, which prints information about a KTX v1 file + and was previously internal, is now exposed. + +### Notable Fixes in v4.4.2 + +* A bug in mipmap generation in `ktx create` that led to sRGB images being + resampled without first decoding to linear has been fixed. If you have affected + KTX files you should regenerate your textures from their source images. +* _libktx\_read_ no longer includes the ASTC encode functions, only the decode + functions. +* A bug that caused a hang in `ktx create`, when the source image is an RGB PNG + file with an sBIT chunk and an alpha component is being added to the texture + being created, has been fixed. + + +### Known Issues + +* Files deflated with zlib using *libktx* compiled with GCC and run on x86\_64 may not be bit-identical with those using *libktx* compiled with GCC and run on arm64. + +* Users making Basis Universal encoded or GPU block compressed textures for WebGL must be aware of WebGL restrictions with regard to texture size and may need to resize input images appropriately before using the `ktx create` tool, or use the `--resize` feature to produce an appropriately sized texture. In general, the dimensions of block compressed textures must be a multiple of the block size in WebGL and for WebGL 1.0 textures must have power-of-two dimensions. Additional portability restrictions apply for glTF per the _KHR\_texture\_basisu_ extension which can be verified using the `--gltf-basisu` command-line option of `ktx validate`. + +* Basis Universal encoding results (both ETC1S/LZ and UASTC) are non-deterministic across platforms. Results are valid but level sizes and data will differ slightly. See [issue #60](https://github.com/BinomialLLC/basis_universal/issues/60) in the basis_universal repository. + +* UASTC RDO results differ from run to run unless multi-threading or RDO multi-threading is disabled. In `toktx` use `--threads 1` for the former or `--uastc_rdo_m` for the latter. As with the preceeding issue results are valid but level sizes will differ slightly. See [issue #151](https://github.com/BinomialLLC/basis_universal/issues/151) in the basis_universal repository. + +* Neither the Vulkan nor GL loaders support depth/stencil textures. + +### Changes since v4.4.0 (by part) +### libktx + +* 4.4.1 release prep (#1063) (0b10eb17e) (@MarkCallow) + +* Add v1 support to ktx info (#1060) (3cd9e3447) (@MarkCallow) + +* Remove mentions of retired edgewise-consulting.com. (#1058) (0306d6a61) (@MarkCallow) + +* Export ktxTexture2\_DecodeAstc in JS bindings (#1034) (64a69009b) (@MarkCallow) + +* Restore rotted bits: update vcpkg caching and pyktx to latest Python (#1033) (f753fcabe) (@MarkCallow) + +* Fix for Emscripten 4.0.9 (#1026) (1a983763c) (@MarkCallow) + +* Fix memory leaks. (#1007) (504b96247) (@MarkCallow) + +### Tools + +* Add v1 support to ktx info (#1060) (3cd9e3447) (@MarkCallow) + +* Remove mentions of retired edgewise-consulting.com. (#1058) (0306d6a61) (@MarkCallow) + +* Document that --generated-mipmap can't be used with --raw. (#1057) (1d7d44465) (@MarkCallow) + +* Update fmt to latest release (v11.2) (#1056) (f5654c2b0) (@MarkCallow) + +* Fix hang when adding alpha and PNG input has sBIT chunk. (#1054) (d9a0c2bd5) (@MarkCallow) + +* Set color space in input image prior to resample. (#1051) (1daca0cdc) (@MarkCallow) + +* Use relative rpaths to find installed library on macOS (#1046) (d47320c24) (@MarkCallow) + +* Shut up warnings clang with libstdc++ emits about non-virtual destructors (#1012) (fbb5412f5) (@DanielGibson) + +* Fix CLI error handling for --normalize. (#1016) (17d206239) (@MarkCallow) + +* Update LodePNG to version 20241228, (#1015) (6d1fc82ca) (@MarkCallow) + +### JS Bindings + +* Export ktxTexture2\_DecodeAstc in JS bindings (#1034) (64a69009b) (@MarkCallow) + +* Fix for Emscripten 4.0.9 (#1026) (1a983763c) (@MarkCallow) + +### Java Bindings + +* Use relative rpaths to find installed library on macOS (#1046) (d47320c24) (@MarkCallow) + +### Python Bindings + +* Restore rotted bits: update vcpkg caching and pyktx to latest Python (#1033) (f753fcabe) (@MarkCallow) + +* Add option to use virtual environment for Python. (#1029) (b167e968c) (@MarkCallow) + +* Bump setuptools from 70.0.0 to 78.1.1 in /interface/python\_binding (#1025) (94d0c3a81) (@dependabot[bot]) + +* Fix python deprecation warning. (#1018) (dac48df00) (@MarkCallow) + +### External Package Dependencies + +* Remove mentions of retired edgewise-consulting.com. (#1058) (0306d6a61) (@MarkCallow) + +* Update fmt to latest release (v11.2) (#1056) (f5654c2b0) (@MarkCallow) + +* Migrate loadtest apps to SDL3 (#1055) (443e12238) (@MarkCallow) + +* Update ASTC encoder to 5.3.0 (#1036) (f6f0b9a1d) (@MarkCallow) + +* Update lodepng to version 20250506 (#1035) (f9c73388a) (@MarkCallow) + +* GCC14/C++23 compatibility fix (#1014) (f3f6b3b69) (@alexge50) + +* Update LodePNG to version 20241228, (#1015) (6d1fc82ca) (@MarkCallow) + +### Tests + +* Add v1 support to ktx info (#1060) (3cd9e3447) (@MarkCallow) + +* Remove mentions of retired edgewise-consulting.com. (#1058) (0306d6a61) (@MarkCallow) + +* Update CTS ref to merged tests. (65b0031d7) (@MarkCallow) + +* Document that --generated-mipmap can't be used with --raw. (#1057) (1d7d44465) (@MarkCallow) + +* Update fmt to latest release (v11.2) (#1056) (f5654c2b0) (@MarkCallow) + +* Migrate loadtest apps to SDL3 (#1055) (443e12238) (@MarkCallow) + +* Fix hang when adding alpha and PNG input has sBIT chunk. (#1054) (d9a0c2bd5) (@MarkCallow) + +* Set color space in input image prior to resample. (#1051) (1daca0cdc) (@MarkCallow) + +* Use relative rpaths to find installed library on macOS (#1046) (d47320c24) (@MarkCallow) + +* Clarify platforms where unit tests not supported. (#1040) (f9f36940b) (@MarkCallow) + +* Minor build fixes (#1039) (8dfb89507) (@MarkCallow) + +* Update for Vulkan SDK 1.4.313. (#1037) (d72218c6a) (@MarkCallow) + +* Export ktxTexture2\_DecodeAstc in JS bindings (#1034) (64a69009b) (@MarkCallow) + +* Restore rotted bits: update vcpkg caching and pyktx to latest Python (#1033) (f753fcabe) (@MarkCallow) + +* Fix handling of multiple files with spaces in names. (#1030) (b2f4da2aa) (@MarkCallow) + +* Update CTS ref for merged test updates. (b9218bc50) (@MarkCallow) + +* Fix CLI error handling for --normalize. (#1016) (17d206239) (@MarkCallow) + +* Linux and MacOS workflows (#1004) (520dc8f89) (@MathiasMagnus) + + + +### Build Scripts and CMake files + +* Add force-fetch-provoking-tag-annotation workaround (e5c085b51) (@MarkCallow) + +* Add options. (16a24e087) (@MarkCallow) + +* Add v1 support to ktx info (#1060) (3cd9e3447) (@MarkCallow) + +* Migrate loadtest apps to SDL3 (#1055) (443e12238) (@MarkCallow) + +* Fix hang when adding alpha and PNG input has sBIT chunk. (#1054) (d9a0c2bd5) (@MarkCallow) + +* Use relative rpaths to find installed library on macOS (#1046) (d47320c24) (@MarkCallow) + +* Clarify platforms where unit tests not supported. (#1040) (f9f36940b) (@MarkCallow) + +* Minor build fixes (#1039) (8dfb89507) (@MarkCallow) + +* Update for Vulkan SDK 1.4.313. (#1037) (d72218c6a) (@MarkCallow) + +* Export ktxTexture2\_DecodeAstc in JS bindings (#1034) (64a69009b) (@MarkCallow) + +* Restore rotted bits: update vcpkg caching and pyktx to latest Python (#1033) (f753fcabe) (@MarkCallow) + +* Add option to use virtual environment for Python. (#1029) (b167e968c) (@MarkCallow) + +* Fix: Install graphviz if FEATURE\_DOCS ON (#1028) (e69101917) (@MarkCallow) + +* Fix for Emscripten 4.0.9 (#1026) (1a983763c) (@MarkCallow) + +* Enable use of Ninja Multi-Config generator for Linux builds (#1017) (161878025) (@MarkCallow) + +* Update LodePNG to version 20241228, (#1015) (6d1fc82ca) (@MarkCallow) + +* Fix issues in CMakeLists.txt (see #996) (#998) (c033ac8fa) (@DanielGibson) + +* Linux and MacOS workflows (#1004) (520dc8f89) (@MathiasMagnus) diff --git a/ktx/REUSE.toml b/ktx/REUSE.toml new file mode 100644 index 0000000..d021ca9 --- /dev/null +++ b/ktx/REUSE.toml @@ -0,0 +1,276 @@ +# SPDX-FileCopyrightText: 2024 The Khronos Group Inc. +# SPDX-License-Identifier: Apache-2.0 + +version = 1 +SPDX-PackageName = "KTX-Software" +SPDX-PackageDownloadLocation = "https://github.com/KhronosGroup/KTX-Software" + +[[annotations]] +path = ["**/**.basis", "**/**.bmp", "**/**.ico", "**/**.icns", "**/**.jpg", "**/**.ktx", "**/**.ktx2", "**/**.pam", "**/**.pgm", "**/**.ppm", "**/**.png", "**/**.pspimage", "**/**.svg"] +precedence = "aggregate" +SPDX-FileCopyrightText = "2015-2022 The Khronos Group Inc." +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = ["tests/srcimages/ccwn2c08.png", "tests/srcimages/g03n2c08.png", "tests/srcimages/tbrn2c08.png", "tests/srcimages/tbyn3p08.png", "tests/srcimages/tm3n3p02.png"] +precedence = "aggregate" +SPDX-FileCopyrightText = "1996, 2011 Willem van Schaik" +SPDX-License-Identifier = "LicenseRef-PNGSuite" + +[[annotations]] +path = "tests/srcimages/kodim17.png" +precedence = "aggregate" +SPDX-FileCopyrightText = "Eastman Kodak Company" +SPDX-License-Identifier = "LicenseRef-Kodak" + +[[annotations]] +path = "tests/srcimages/color_grid.png" +precedence = "aggregate" +SPDX-FileCopyrightText = "Unknown" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "tests/srcimages/camera_camera_BaseColor_16bit.png" +precedence = "aggregate" +SPDX-FileCopyrightText = "UX3D" +SPDX-License-Identifier = "CC0-1.0" + +[[annotations]] +path = "tests/srcimages/FlightHelmet_baseColor.png" +precedence = "aggregate" +SPDX-FileCopyrightText = "Microsoft" +SPDX-License-Identifier = "CC0-1.0" + +[[annotations]] +path = "tests/srcimages/CesiumLogoFlat_palette.png" +precedence = "aggregate" +SPDX-FileCopyrightText = "Analytical Graphics" +SPDX-License-Identifier = "CC-BY-4.0 WITH LicenseRef-Cesium-Trademark-Terms" + +[[annotations]] +path = ["tests/testimages/hi_mark.ktx", "tests/testimages/hi_mark_sq.ktx"] +precedence = "aggregate" +SPDX-FileCopyrightText = "HI Corporation" +SPDX-License-Identifier = "LicenseRef-HI-Trademark" + +[[annotations]] +path = "tests/srcimages/Iron_Bars/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "Katsuagi https://3dtextures.me" +SPDX-License-Identifier = "CC0-1.0" + +[[annotations]] +path = ["tests/srcimages/GoldenGateBridge3/**", "tests/srcimages/Yokohama3/**"] +precedence = "aggregate" +SPDX-FileCopyrightText = "Emil Persson http://www.humus.name" +SPDX-License-Identifier = "CC-BY-3.0" + +[[annotations]] +path = ["tests/testimages/skybox.ktx2", "tests/testimages/skybox_zstd.ktx2"] +precedence = "aggregate" +SPDX-FileCopyrightText = "HDRIHaven" +SPDX-License-Identifier = "CC0-1.0" + +[[annotations]] +path = "external/astc-encoder/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2020-2023 Arm Limited" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "external/etcdec/etcdec.cxx" +precedence = "aggregate" +SPDX-FileCopyrightText = "2013 Ericsson AB" +SPDX-License-Identifier = "LicenseRef-ETCSLA" + +[[annotations]] +path = "external/fmt/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2012-present Victor Zverovich and {fmt} contributors" +SPDX-License-Identifier = "LicenseRef-fmt" + +[[annotations]] +path = "**/**.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "2017-2020 Mark Callow" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = ["external/basisu/Docs/**", "external/basisu/Test/**", "external/basisu/jenkins/**", "external/basisu/.gitattributes", "external/basisu/.gitignore", "external/basisu/.gitmodules", "external/basisu/.pylintrc", "external/basisu/README.md", "external/basisu/Utils/Example/README.md"] +precedence = "aggregate" +SPDX-FileCopyrightText = "2020-2021 Arm Limited" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "external/basisu/.gitrepo" +precedence = "aggregate" +SPDX-FileCopyrightText = "2021 Mark Callow" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "external/basisu/Source/stb_image**.h" +precedence = "aggregate" +SPDX-FileCopyrightText = "2017 Sean Barrett" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "external/basisu/Source/tinyexr.h" +precedence = "aggregate" +SPDX-FileCopyrightText = "2014-2019 Syoyo Fujita and many contributors" +SPDX-License-Identifier = "BSD-3-Clause" + +[[annotations]] +path = "external/basisu/Source/wuffs-v0.3.c" +precedence = "aggregate" +SPDX-FileCopyrightText = "2022 The Wuffs Authors." +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "external/basisu/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2019-2020 Binomial LLC" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = ["external/basisu/apg_bmp.**", "external/basisu/CMakeLists.txt", "external/basisu/webgl/transcoder/CMakeLists.txt"] +precedence = "aggregate" +SPDX-FileCopyrightText = "2019 Anton Gerdelan" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "external/basisu/basisu_astc_decomp.**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2016 The Android Open Source Project" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "external/lodepng/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2005-2025 Lode Vandevenne" +SPDX-License-Identifier = "Zlib" + +[[annotations]] +path = "external/dfdutils/vulkan/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2015-2020 The Khronos Group Inc." +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "external/dfdutils/.gitrepo" +precedence = "aggregate" +SPDX-FileCopyrightText = "2019-2020 The Khronos Group Inc" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "external/SDL_gesture/SDL_gesture.h" +precedence = "aggregate" +SPDX-FileCopyrightText = "1997-2022 Sam Lantinga " +SPDX-License-Identifier = "Zlib" + +[[annotations]] +path = "cmake/modules/FindVulkan.cmake" +precedence = "aggregate" +SPDX-FileCopyrightText = ["Copyright 2000-2024 Kitware, Inc. and Contributors", "Updates for iOS Copyright (c) 2024, Holochip Inc"] +SPDX-License-Identifier = "BSD-3-Clause" + +[[annotations]] +path = ["cmake/modules/NSIS.InstallOptions.ini.in", "cmake/**.rtf"] +precedence = "aggregate" +SPDX-FileCopyrightText = "2017-2020 Andreas Atteneder" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = ["other_include/zstd**"] +precedence = "aggregate" +SPDX-FileCopyrightText = "2016-present Facebook, Inc." +SPDX-License-Identifier = "BSD-3-Clause" + +[[annotations]] +path = ["other_include/EGL/**.h", "other_include/GL**/**.h", "other_include/KHR/khrplatform.h"] +precedence = "aggregate" +SPDX-FileCopyrightText = "2007-2020 The Khronos Group Inc." +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "pkgdoc/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2018-2023 The Khronos Group Inc." +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "tests/webgl/libktx-gltf/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2020 Don McCurdy, Austin Eng, Shrek Shao, and Mark Callow" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = ["tests/webgl/libktx-webgl/**", "tests/webgl/libktx-read-webgl/**"] +precedence = "aggregate" +SPDX-FileCopyrightText = "2020 Mark Callow" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "tests/webgl/llt-three/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2020 Mark Callow" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "tests/gtest/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2008, Google Inc." +SPDX-License-Identifier = "BSD-3-Clause" + +[[annotations]] +path = "tools/package/mac/summary.rtfd/TXT.rtf" +precedence = "aggregate" +SPDX-FileCopyrightText = "2019 Mark Callow" +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "other_include/glm/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2005 G-Truc Creation" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "lib/etcdec.cxx" +precedence = "aggregate" +SPDX-FileCopyrightText = "2013 Ericsson AB 2013. All Rights Reserved." +SPDX-License-Identifier = "LicenseRef-ETCSLA" + +[[annotations]] +path = "tests/**/**loadtests.rc" +precedence = "aggregate" +SPDX-FileCopyrightText = "2020 The Khronos Group Inc." +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "other_include/stb/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2017 Sean Barrett" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "the_khronos_group_inc.p12.enc" +precedence = "aggregate" +SPDX-FileCopyrightText = "2022 The Khronos Group Inc." +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = "external/cxxopts/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "2014-2022 Jarryd Beck" +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "NOTICE.md" +precedence = "aggregate" +SPDX-FileCopyrightText = "2024 The Khronos Group Inc." +SPDX-License-Identifier = "Apache-2.0" + +[[annotations]] +path = ["vcpkg.json", "vcpkg-configuration.json"] +precedence = "aggregate" +SPDX-FileCopyrightText = "2024 The Khronos Group Inc." +SPDX-License-Identifier = "Apache-2.0" diff --git a/ktx/build/CMakeCache.txt b/ktx/build/CMakeCache.txt new file mode 100644 index 0000000..bf5b412 --- /dev/null +++ b/ktx/build/CMakeCache.txt @@ -0,0 +1,857 @@ +# This is the CMakeCache file. +# For build in directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Enable astcenc builds with address sanitizer +ASTCENC_ASAN:BOOL=OFF + +//Enable astcenc big-endian support +ASTCENC_BIG_ENDIAN:BOOL=OFF + +//Enable astcenc builds with diagnostic trace +ASTCENC_DIAGNOSTICS:BOOL=OFF + +//Enable astcenc floating point invariance +ASTCENC_INVARIANCE:BOOL=ON + +//Enable astcenc builds for AVX2 SIMD +ASTCENC_ISA_AVX2:BOOL=ON + +//Enable astcenc builds for no SIMD +ASTCENC_ISA_NONE:BOOL=OFF + +//Enable astcenc builds for SSE2 SIMD +ASTCENC_ISA_SSE2:BOOL=OFF + +//Enable astcenc builds for SSE4.1 SIMD +ASTCENC_ISA_SSE41:BOOL=OFF + +//Enable astcenc builds for 128-bit SVE SIMD +ASTCENC_ISA_SVE_128:BOOL=OFF + +//Enable astcenc builds for 256-bit SVE SIMD +ASTCENC_ISA_SVE_256:BOOL=OFF + +//Enable astcenc builds with core library shared objects +ASTCENC_SHAREDLIB:BOOL=OFF + +//Enable astcenc builds with undefined behavior sanitizer +ASTCENC_UBSAN:BOOL=OFF + +//Enable astcenc builds with unit tests +ASTCENC_UNITTEST:BOOL=OFF + +//Force builds to treat warnings as errors +ASTCENC_WERROR:BOOL=ON + +//Enable use of native x86 gathers +ASTCENC_X86_GATHERS:BOOL=ON + +//Path to a program. +BASH_EXECUTABLE:FILEPATH=/usr/bin/bash + +//Compile with SSE support so applications can choose to use it. +BASISU_SUPPORT_SSE:BOOL=ON + +//Create shared libraries (static otherwise). +BUILD_SHARED_LIBS:BOOL=ON + +//Build the testing tree. +BUILD_TESTING:BOOL=ON + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/usr/bin/addr2line + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Release + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib + +//Flags used by the CXX compiler during all build types. +CMAKE_CXX_FLAGS:STRING=-msse4.1 + +//Flags used by the CXX compiler during DEBUG builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the CXX compiler during RELEASE builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//No help, variable specified on the command line. +CMAKE_CXX_STANDARD:UNINITIALIZED=17 + +//C compiler +CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_C_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_C_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib + +//Flags used by the C compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the C compiler during DEBUG builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the C compiler during RELEASE builds. +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND + +//Flags used by the linker during all build types. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=1 + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/pkgRedirects + +//User executables (bin) +CMAKE_INSTALL_BINDIR:PATH=bin + +//Read-only architecture-independent data (DATAROOTDIR) +CMAKE_INSTALL_DATADIR:PATH= + +//Read-only architecture-independent data root (share) +CMAKE_INSTALL_DATAROOTDIR:PATH=share + +//Documentation root (DATAROOTDIR/doc/PROJECT_NAME) +CMAKE_INSTALL_DOCDIR:PATH= + +//C header files (include) +CMAKE_INSTALL_INCLUDEDIR:PATH=include + +//Info documentation (DATAROOTDIR/info) +CMAKE_INSTALL_INFODIR:PATH= + +//Object code libraries (lib) +CMAKE_INSTALL_LIBDIR:PATH=lib + +//Program executables (libexec) +CMAKE_INSTALL_LIBEXECDIR:PATH=libexec + +//Locale-dependent data (DATAROOTDIR/locale) +CMAKE_INSTALL_LOCALEDIR:PATH= + +//Modifiable single-machine data (var) +CMAKE_INSTALL_LOCALSTATEDIR:PATH=var + +//Man documentation (DATAROOTDIR/man) +CMAKE_INSTALL_MANDIR:PATH= + +//C header files for non-gcc (/usr/include) +CMAKE_INSTALL_OLDINCLUDEDIR:PATH=/usr/include + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/home/abdelrahman/Sources/programming/how-to-vulkan/vendor + +//Run-time variable data (LOCALSTATEDIR/run) +CMAKE_INSTALL_RUNSTATEDIR:PATH= + +//System admin executables (sbin) +CMAKE_INSTALL_SBINDIR:PATH=sbin + +//Modifiable architecture-independent data (com) +CMAKE_INSTALL_SHAREDSTATEDIR:PATH=com + +//Read-only single-machine data (etc) +CMAKE_INSTALL_SYSCONFDIR:PATH=etc + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules during +// all build types. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_COMPAT_VERSION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC=Libraries and tools to create and read KTX image texture files. + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=KTX-Software + +//Value Computed by CMake +CMAKE_PROJECT_SPDX_LICENSE:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_VERSION:STATIC=0.0.0 + +//Value Computed by CMake +CMAKE_PROJECT_VERSION_MAJOR:STATIC=0 + +//Value Computed by CMake +CMAKE_PROJECT_VERSION_MINOR:STATIC=0 + +//Value Computed by CMake +CMAKE_PROJECT_VERSION_PATCH:STATIC=0 + +//Value Computed by CMake +CMAKE_PROJECT_VERSION_TWEAK:STATIC= + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/usr/bin/readelf + +//Flags used by the linker during the creation of shared libraries +// during all build types. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the archiver during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the archiver during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the archiver during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the archiver during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the archiver during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Path to the coverage program that CTest uses for performing coverage +// inspection +COVERAGE_COMMAND:FILEPATH=/usr/bin/gcov + +//Extra command line flags to pass to the coverage tool +COVERAGE_EXTRA_FLAGS:STRING=-l + +//Enable to build RPM source packages +CPACK_SOURCE_RPM:BOOL=OFF + +//Enable to build TBZ2 source packages +CPACK_SOURCE_TBZ2:BOOL=ON + +//Enable to build TGZ source packages +CPACK_SOURCE_TGZ:BOOL=ON + +//Enable to build TXZ source packages +CPACK_SOURCE_TXZ:BOOL=ON + +//Enable to build TZ source packages +CPACK_SOURCE_TZ:BOOL=ON + +//Enable to build ZIP source packages +CPACK_SOURCE_ZIP:BOOL=OFF + +//How many times to retry timed-out CTest submissions. +CTEST_SUBMIT_RETRY_COUNT:STRING=3 + +//How long to wait between timed-out CTest submissions. +CTEST_SUBMIT_RETRY_DELAY:STRING=5 + +//Set to ON to build examples +CXXOPTS_BUILD_EXAMPLES:BOOL=OFF + +//Set to ON to build tests +CXXOPTS_BUILD_TESTS:BOOL=OFF + +//Generate the install target +CXXOPTS_ENABLE_INSTALL:BOOL=OFF + +//Add warnings to CMAKE_CXX_FLAGS +CXXOPTS_ENABLE_WARNINGS:BOOL=OFF + +//Use ICU Unicode library +CXXOPTS_USE_UNICODE_HELP:BOOL=OFF + +//Maximum time allowed before CTest will kill the test. +DART_TESTING_TIMEOUT:STRING=1500 + +//Dot tool for use with Doxygen +DOXYGEN_DOT_EXECUTABLE:FILEPATH=/usr/bin/dot + +//Doxygen documentation generation tool (https://www.doxygen.nl) +DOXYGEN_EXECUTABLE:FILEPATH=/usr/bin/doxygen + +//Value Computed by CMake +FMT_BINARY_DIR:STATIC=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt + +//Generate the cuda-test target. +FMT_CUDA_TEST:BOOL=OFF + +//Debug library postfix. +FMT_DEBUG_POSTFIX:STRING=d + +//Generate the doc target. +FMT_DOC:BOOL=OFF + +//Generate the fuzz target. +FMT_FUZZ:BOOL=OFF + +//Installation directory for include files, a relative path that +// will be joined with /home/abdelrahman/Sources/programming/how-to-vulkan/vendor +// or an absolute path. +FMT_INC_DIR:STRING=include + +//Value Computed by CMake +FMT_IS_TOP_LEVEL:STATIC=OFF + +//Build a module instead of a traditional library. +FMT_MODULE:BOOL=OFF + +//Include OS-specific APIs. +FMT_OS:BOOL=ON + +//Enable extra warnings and expensive tests. +FMT_PEDANTIC:BOOL=OFF + +//Value Computed by CMake +FMT_SOURCE_DIR:STATIC=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt + +//Generate the test target. +FMT_TEST:BOOL=OFF + +//Enable Unicode support. +FMT_UNICODE:BOOL=ON + +//Halt the compilation with an error on compiler warnings. +FMT_WERROR:BOOL=OFF + +//Git command line client +GIT_EXECUTABLE:FILEPATH=/usr/bin/git + +//Value Computed by CMake +KTX-Software_BINARY_DIR:STATIC=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +//Value Computed by CMake +KTX-Software_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +KTX-Software_SOURCE_DIR:STATIC=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +//Create KTX documentation. +KTX_FEATURE_DOC:BOOL=ON + +//ETC decoding support. +KTX_FEATURE_ETC_UNPACK:BOOL=ON + +//Enable OpenGL texture upload. +KTX_FEATURE_GL_UPLOAD:BOOL=ON + +//Create Java bindings for libktx. +KTX_FEATURE_JNI:BOOL=OFF + +//Enable KTX 1 support. +KTX_FEATURE_KTX1:BOOL=ON + +//Enable KTX 2 support. +KTX_FEATURE_KTX2:BOOL=ON + +//Load test apps test the upload feature by displaying various +// KTX textures. Select which to create. "OpenGL" includes OpenGL +// ES. +KTX_FEATURE_LOADTEST_APPS:STRING=ON + +//Create Python source distribution. +KTX_FEATURE_PY:BOOL=OFF + +//Create unit tests. +KTX_FEATURE_TESTS:BOOL=ON + +//Create KTX tools +KTX_FEATURE_TOOLS:BOOL=ON + +//Enable KTX CLI Tools CTS tests (requires CTS submodule). +KTX_FEATURE_TOOLS_CTS:BOOL=OFF + +//Enable Vulkan texture upload. +KTX_FEATURE_VK_UPLOAD:BOOL=ON + +//Include targets for generating VkFormat related files. For project +// developers only. +KTX_GENERATE_VK_FILES:BOOL=OFF + +//Make all warnings in KTX code into errors. +KTX_WERROR:BOOL=OFF + +//Command to build the project +MAKECOMMAND:STRING=/usr/bin/cmake --build . --config "${CTEST_CONFIGURATION_TYPE}" + +//Path to the memory checking command, used for memory error detection. +MEMORYCHECK_COMMAND:FILEPATH=/usr/bin/valgrind + +//File that contains suppressions for the memory checker +MEMORYCHECK_SUPPRESSIONS_FILE:FILEPATH= + +//Arguments to supply to pkg-config +PKG_CONFIG_ARGN:STRING= + +//pkg-config executable +PKG_CONFIG_EXECUTABLE:FILEPATH=/usr/bin/pkg-config + +//The directory containing a CMake configuration file for SDL3. +SDL3_DIR:PATH=/usr/lib/cmake/SDL3 + +//Name of the computer/site where compile is being run +SITE:STRING=wappdesktop + +//The directory containing a CMake configuration file for assimp. +assimp_DIR:PATH=/usr/lib/cmake/assimp-6.0 + +//Value Computed by CMake +astcenc-avx2_BINARY_DIR:STATIC=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source + +//Value Computed by CMake +astcenc-avx2_IS_TOP_LEVEL:STATIC=OFF + +//Value Computed by CMake +astcenc-avx2_SOURCE_DIR:STATIC=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source + +//Value Computed by CMake +astcencoder_BINARY_DIR:STATIC=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder + +//Value Computed by CMake +astcencoder_IS_TOP_LEVEL:STATIC=OFF + +//Value Computed by CMake +astcencoder_SOURCE_DIR:STATIC=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder + +//Value Computed by CMake +cxxopts_BINARY_DIR:STATIC=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts + +//Value Computed by CMake +cxxopts_IS_TOP_LEVEL:STATIC=OFF + +//Value Computed by CMake +cxxopts_SOURCE_DIR:STATIC=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts + +//Path to a library. +pkgcfg_lib_PC_LIBUNWIND_unwind:FILEPATH=/usr/lib/libunwind.so + +//Path to a library. +pkgcfg_lib_PC_LIBUNWIND_unwind-generic:FILEPATH=/usr/lib/libunwind-generic.so + + +######################## +# INTERNAL cache entries +######################## + +//Enable astcenc builds for decompression only +ASTCENC_DECOMPRESSOR:INTERNAL=OFF +//ADVANCED property for variable: BASH_EXECUTABLE +BASH_EXECUTABLE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=4 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=3 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=3 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//ADVANCED property for variable: CMAKE_CTEST_COMMAND +CMAKE_CTEST_COMMAND-ADVANCED:INTERNAL=1 +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Test CMAKE_HAVE_LIBC_PTHREAD +CMAKE_HAVE_LIBC_PTHREAD:INTERNAL=1 +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx +//ADVANCED property for variable: CMAKE_INSTALL_BINDIR +CMAKE_INSTALL_BINDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_DATADIR +CMAKE_INSTALL_DATADIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_DATAROOTDIR +CMAKE_INSTALL_DATAROOTDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_DOCDIR +CMAKE_INSTALL_DOCDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_INCLUDEDIR +CMAKE_INSTALL_INCLUDEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_INFODIR +CMAKE_INSTALL_INFODIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LIBDIR +CMAKE_INSTALL_LIBDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LIBEXECDIR +CMAKE_INSTALL_LIBEXECDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LOCALEDIR +CMAKE_INSTALL_LOCALEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LOCALSTATEDIR +CMAKE_INSTALL_LOCALSTATEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_MANDIR +CMAKE_INSTALL_MANDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_OLDINCLUDEDIR +CMAKE_INSTALL_OLDINCLUDEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_RUNSTATEDIR +CMAKE_INSTALL_RUNSTATEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_SBINDIR +CMAKE_INSTALL_SBINDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_SHAREDSTATEDIR +CMAKE_INSTALL_SHAREDSTATEDIR-ADVANCED:INTERNAL=1 +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_INSTALL_SYSCONFDIR +CMAKE_INSTALL_SYSCONFDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//Name of CMakeLists files to read +CMAKE_LIST_FILE_NAME:INTERNAL=CMakeLists.txt +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=21 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: COVERAGE_COMMAND +COVERAGE_COMMAND-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: COVERAGE_EXTRA_FLAGS +COVERAGE_EXTRA_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CPACK_SOURCE_RPM +CPACK_SOURCE_RPM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CPACK_SOURCE_TBZ2 +CPACK_SOURCE_TBZ2-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CPACK_SOURCE_TGZ +CPACK_SOURCE_TGZ-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CPACK_SOURCE_TXZ +CPACK_SOURCE_TXZ-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CPACK_SOURCE_TZ +CPACK_SOURCE_TZ-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CPACK_SOURCE_ZIP +CPACK_SOURCE_ZIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CTEST_SUBMIT_RETRY_COUNT +CTEST_SUBMIT_RETRY_COUNT-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CTEST_SUBMIT_RETRY_DELAY +CTEST_SUBMIT_RETRY_DELAY-ADVANCED:INTERNAL=1 +CXXOPTS__VERSION_MAJOR:INTERNAL=3 +CXXOPTS__VERSION_MINOR:INTERNAL=1 +CXXOPTS__VERSION_PATCH:INTERNAL=1 +//ADVANCED property for variable: DART_TESTING_TIMEOUT +DART_TESTING_TIMEOUT-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: DOXYGEN_DOT_EXECUTABLE +DOXYGEN_DOT_EXECUTABLE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: DOXYGEN_EXECUTABLE +DOXYGEN_EXECUTABLE-ADVANCED:INTERNAL=1 +//Details about finding Bash +FIND_PACKAGE_MESSAGE_DETAILS_Bash:INTERNAL=[/usr/bin/bash][v()] +//Details about finding Doxygen +FIND_PACKAGE_MESSAGE_DETAILS_Doxygen:INTERNAL=[/usr/bin/doxygen][found components: doxygen dot ][v1.16.1()] +//Details about finding PkgConfig +FIND_PACKAGE_MESSAGE_DETAILS_PkgConfig:INTERNAL=[/usr/bin/pkg-config][v2.5.1()] +//Details about finding Threads +FIND_PACKAGE_MESSAGE_DETAILS_Threads:INTERNAL=[TRUE][v()] +//ADVANCED property for variable: GIT_EXECUTABLE +GIT_EXECUTABLE-ADVANCED:INTERNAL=1 +//STRINGS property for variable: KTX_FEATURE_LOADTEST_APPS +KTX_FEATURE_LOADTEST_APPS-STRINGS:INTERNAL=OFF;OpenGL;Vulkan;OpenGL+Vulkan +//ADVANCED property for variable: KTX_GENERATE_VK_FILES +KTX_GENERATE_VK_FILES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MAKECOMMAND +MAKECOMMAND-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MEMORYCHECK_COMMAND +MEMORYCHECK_COMMAND-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MEMORYCHECK_SUPPRESSIONS_FILE +MEMORYCHECK_SUPPRESSIONS_FILE-ADVANCED:INTERNAL=1 +PC_LIBUNWIND_CFLAGS:INTERNAL=-I/usr/include +PC_LIBUNWIND_CFLAGS_I:INTERNAL= +PC_LIBUNWIND_CFLAGS_OTHER:INTERNAL= +PC_LIBUNWIND_FOUND:INTERNAL=1 +PC_LIBUNWIND_INCLUDEDIR:INTERNAL= +PC_LIBUNWIND_INCLUDE_DIRS:INTERNAL=/usr/include +PC_LIBUNWIND_LDFLAGS:INTERNAL=-L/usr/lib;-lunwind-generic;-lunwind +PC_LIBUNWIND_LDFLAGS_OTHER:INTERNAL= +PC_LIBUNWIND_LIBDIR:INTERNAL= +PC_LIBUNWIND_LIBRARIES:INTERNAL=unwind-generic;unwind +PC_LIBUNWIND_LIBRARY_DIRS:INTERNAL=/usr/lib +PC_LIBUNWIND_LIBS:INTERNAL= +PC_LIBUNWIND_LIBS_L:INTERNAL= +PC_LIBUNWIND_LIBS_OTHER:INTERNAL= +PC_LIBUNWIND_LIBS_PATHS:INTERNAL= +PC_LIBUNWIND_MODULE_NAME:INTERNAL= +PC_LIBUNWIND_PREFIX:INTERNAL= +PC_LIBUNWIND_STATIC_CFLAGS:INTERNAL=-I/usr/include +PC_LIBUNWIND_STATIC_CFLAGS_I:INTERNAL= +PC_LIBUNWIND_STATIC_CFLAGS_OTHER:INTERNAL= +PC_LIBUNWIND_STATIC_INCLUDE_DIRS:INTERNAL=/usr/include +PC_LIBUNWIND_STATIC_LDFLAGS:INTERNAL=-L/usr/lib;-lunwind-generic;-lunwind;-llzma;-lz +PC_LIBUNWIND_STATIC_LDFLAGS_OTHER:INTERNAL= +PC_LIBUNWIND_STATIC_LIBDIR:INTERNAL= +PC_LIBUNWIND_STATIC_LIBRARIES:INTERNAL=unwind-generic;unwind;lzma;z +PC_LIBUNWIND_STATIC_LIBRARY_DIRS:INTERNAL=/usr/lib +PC_LIBUNWIND_STATIC_LIBS:INTERNAL= +PC_LIBUNWIND_STATIC_LIBS_L:INTERNAL= +PC_LIBUNWIND_STATIC_LIBS_OTHER:INTERNAL= +PC_LIBUNWIND_STATIC_LIBS_PATHS:INTERNAL= +PC_LIBUNWIND_VERSION:INTERNAL= +PC_LIBUNWIND_libunwind-generic_INCLUDEDIR:INTERNAL=/usr/include +PC_LIBUNWIND_libunwind-generic_LIBDIR:INTERNAL=/usr/lib +PC_LIBUNWIND_libunwind-generic_MODULE_NAME:INTERNAL=libunwind-generic +PC_LIBUNWIND_libunwind-generic_PREFIX:INTERNAL=/usr +PC_LIBUNWIND_libunwind-generic_VERSION:INTERNAL=1.8.2 +PC_LIBUNWIND_libunwind_INCLUDEDIR:INTERNAL=/usr/include +PC_LIBUNWIND_libunwind_LIBDIR:INTERNAL=/usr/lib +PC_LIBUNWIND_libunwind_MODULE_NAME:INTERNAL=libunwind +PC_LIBUNWIND_libunwind_PREFIX:INTERNAL=/usr +PC_LIBUNWIND_libunwind_VERSION:INTERNAL=1.8.2 +//ADVANCED property for variable: PKG_CONFIG_ARGN +PKG_CONFIG_ARGN-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: PKG_CONFIG_EXECUTABLE +PKG_CONFIG_EXECUTABLE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: SITE +SITE-ADVANCED:INTERNAL=1 +//CMAKE_INSTALL_PREFIX during last run +_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX:INTERNAL=/home/abdelrahman/Sources/programming/how-to-vulkan/vendor +__pkg_config_arguments_PC_LIBUNWIND:INTERNAL=QUIET;IMPORTED_TARGET;libunwind;libunwind-generic +__pkg_config_checked_PC_LIBUNWIND:INTERNAL=1 +//ADVANCED property for variable: pkgcfg_lib_PC_LIBUNWIND_unwind +pkgcfg_lib_PC_LIBUNWIND_unwind-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: pkgcfg_lib_PC_LIBUNWIND_unwind-generic +pkgcfg_lib_PC_LIBUNWIND_unwind-generic-ADVANCED:INTERNAL=1 +prefix_result:INTERNAL=/usr/lib + diff --git a/ktx/build/CMakeDoxyfile.in b/ktx/build/CMakeDoxyfile.in new file mode 100644 index 0000000..36b8f7d --- /dev/null +++ b/ktx/build/CMakeDoxyfile.in @@ -0,0 +1,314 @@ +# +# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! +# + +DOXYFILE_ENCODING = @DOXYGEN_DOXYFILE_ENCODING@ +PROJECT_NAME = @DOXYGEN_PROJECT_NAME@ +PROJECT_NUMBER = @DOXYGEN_PROJECT_NUMBER@ +PROJECT_BRIEF = @DOXYGEN_PROJECT_BRIEF@ +PROJECT_LOGO = @DOXYGEN_PROJECT_LOGO@ +PROJECT_ICON = @DOXYGEN_PROJECT_ICON@ +OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_DIRECTORY@ +CREATE_SUBDIRS = @DOXYGEN_CREATE_SUBDIRS@ +CREATE_SUBDIRS_LEVEL = @DOXYGEN_CREATE_SUBDIRS_LEVEL@ +ALLOW_UNICODE_NAMES = @DOXYGEN_ALLOW_UNICODE_NAMES@ +OUTPUT_LANGUAGE = @DOXYGEN_OUTPUT_LANGUAGE@ +BRIEF_MEMBER_DESC = @DOXYGEN_BRIEF_MEMBER_DESC@ +REPEAT_BRIEF = @DOXYGEN_REPEAT_BRIEF@ +ABBREVIATE_BRIEF = @DOXYGEN_ABBREVIATE_BRIEF@ +ALWAYS_DETAILED_SEC = @DOXYGEN_ALWAYS_DETAILED_SEC@ +INLINE_INHERITED_MEMB = @DOXYGEN_INLINE_INHERITED_MEMB@ +FULL_PATH_NAMES = @DOXYGEN_FULL_PATH_NAMES@ +STRIP_FROM_PATH = @DOXYGEN_STRIP_FROM_PATH@ +STRIP_FROM_INC_PATH = @DOXYGEN_STRIP_FROM_INC_PATH@ +SHORT_NAMES = @DOXYGEN_SHORT_NAMES@ +JAVADOC_AUTOBRIEF = @DOXYGEN_JAVADOC_AUTOBRIEF@ +JAVADOC_BANNER = @DOXYGEN_JAVADOC_BANNER@ +QT_AUTOBRIEF = @DOXYGEN_QT_AUTOBRIEF@ +MULTILINE_CPP_IS_BRIEF = @DOXYGEN_MULTILINE_CPP_IS_BRIEF@ +PYTHON_DOCSTRING = @DOXYGEN_PYTHON_DOCSTRING@ +INHERIT_DOCS = @DOXYGEN_INHERIT_DOCS@ +SEPARATE_MEMBER_PAGES = @DOXYGEN_SEPARATE_MEMBER_PAGES@ +TAB_SIZE = @DOXYGEN_TAB_SIZE@ +ALIASES = @DOXYGEN_ALIASES@ +OPTIMIZE_OUTPUT_FOR_C = @DOXYGEN_OPTIMIZE_OUTPUT_FOR_C@ +OPTIMIZE_OUTPUT_JAVA = @DOXYGEN_OPTIMIZE_OUTPUT_JAVA@ +OPTIMIZE_FOR_FORTRAN = @DOXYGEN_OPTIMIZE_FOR_FORTRAN@ +OPTIMIZE_OUTPUT_VHDL = @DOXYGEN_OPTIMIZE_OUTPUT_VHDL@ +OPTIMIZE_OUTPUT_SLICE = @DOXYGEN_OPTIMIZE_OUTPUT_SLICE@ +EXTENSION_MAPPING = @DOXYGEN_EXTENSION_MAPPING@ +MARKDOWN_SUPPORT = @DOXYGEN_MARKDOWN_SUPPORT@ +MARKDOWN_STRICT = @DOXYGEN_MARKDOWN_STRICT@ +TOC_INCLUDE_HEADINGS = @DOXYGEN_TOC_INCLUDE_HEADINGS@ +MARKDOWN_ID_STYLE = @DOXYGEN_MARKDOWN_ID_STYLE@ +AUTOLINK_SUPPORT = @DOXYGEN_AUTOLINK_SUPPORT@ +AUTOLINK_IGNORE_WORDS = @DOXYGEN_AUTOLINK_IGNORE_WORDS@ +BUILTIN_STL_SUPPORT = @DOXYGEN_BUILTIN_STL_SUPPORT@ +CPP_CLI_SUPPORT = @DOXYGEN_CPP_CLI_SUPPORT@ +SIP_SUPPORT = @DOXYGEN_SIP_SUPPORT@ +IDL_PROPERTY_SUPPORT = @DOXYGEN_IDL_PROPERTY_SUPPORT@ +DISTRIBUTE_GROUP_DOC = @DOXYGEN_DISTRIBUTE_GROUP_DOC@ +GROUP_NESTED_COMPOUNDS = @DOXYGEN_GROUP_NESTED_COMPOUNDS@ +SUBGROUPING = @DOXYGEN_SUBGROUPING@ +INLINE_GROUPED_CLASSES = @DOXYGEN_INLINE_GROUPED_CLASSES@ +INLINE_SIMPLE_STRUCTS = @DOXYGEN_INLINE_SIMPLE_STRUCTS@ +TYPEDEF_HIDES_STRUCT = @DOXYGEN_TYPEDEF_HIDES_STRUCT@ +LOOKUP_CACHE_SIZE = @DOXYGEN_LOOKUP_CACHE_SIZE@ +NUM_PROC_THREADS = @DOXYGEN_NUM_PROC_THREADS@ +TIMESTAMP = @DOXYGEN_TIMESTAMP@ +EXTRACT_ALL = @DOXYGEN_EXTRACT_ALL@ +EXTRACT_PRIVATE = @DOXYGEN_EXTRACT_PRIVATE@ +EXTRACT_PRIV_VIRTUAL = @DOXYGEN_EXTRACT_PRIV_VIRTUAL@ +EXTRACT_PACKAGE = @DOXYGEN_EXTRACT_PACKAGE@ +EXTRACT_STATIC = @DOXYGEN_EXTRACT_STATIC@ +EXTRACT_LOCAL_CLASSES = @DOXYGEN_EXTRACT_LOCAL_CLASSES@ +EXTRACT_LOCAL_METHODS = @DOXYGEN_EXTRACT_LOCAL_METHODS@ +EXTRACT_ANON_NSPACES = @DOXYGEN_EXTRACT_ANON_NSPACES@ +RESOLVE_UNNAMED_PARAMS = @DOXYGEN_RESOLVE_UNNAMED_PARAMS@ +HIDE_UNDOC_MEMBERS = @DOXYGEN_HIDE_UNDOC_MEMBERS@ +HIDE_UNDOC_CLASSES = @DOXYGEN_HIDE_UNDOC_CLASSES@ +HIDE_UNDOC_NAMESPACES = @DOXYGEN_HIDE_UNDOC_NAMESPACES@ +HIDE_FRIEND_COMPOUNDS = @DOXYGEN_HIDE_FRIEND_COMPOUNDS@ +HIDE_IN_BODY_DOCS = @DOXYGEN_HIDE_IN_BODY_DOCS@ +INTERNAL_DOCS = @DOXYGEN_INTERNAL_DOCS@ +CASE_SENSE_NAMES = @DOXYGEN_CASE_SENSE_NAMES@ +HIDE_SCOPE_NAMES = @DOXYGEN_HIDE_SCOPE_NAMES@ +HIDE_COMPOUND_REFERENCE= @DOXYGEN_HIDE_COMPOUND_REFERENCE@ +SHOW_HEADERFILE = @DOXYGEN_SHOW_HEADERFILE@ +SHOW_INCLUDE_FILES = @DOXYGEN_SHOW_INCLUDE_FILES@ +SHOW_GROUPED_MEMB_INC = @DOXYGEN_SHOW_GROUPED_MEMB_INC@ +FORCE_LOCAL_INCLUDES = @DOXYGEN_FORCE_LOCAL_INCLUDES@ +INLINE_INFO = @DOXYGEN_INLINE_INFO@ +SORT_MEMBER_DOCS = @DOXYGEN_SORT_MEMBER_DOCS@ +SORT_BRIEF_DOCS = @DOXYGEN_SORT_BRIEF_DOCS@ +SORT_MEMBERS_CTORS_1ST = @DOXYGEN_SORT_MEMBERS_CTORS_1ST@ +SORT_GROUP_NAMES = @DOXYGEN_SORT_GROUP_NAMES@ +SORT_BY_SCOPE_NAME = @DOXYGEN_SORT_BY_SCOPE_NAME@ +STRICT_PROTO_MATCHING = @DOXYGEN_STRICT_PROTO_MATCHING@ +GENERATE_TODOLIST = @DOXYGEN_GENERATE_TODOLIST@ +GENERATE_TESTLIST = @DOXYGEN_GENERATE_TESTLIST@ +GENERATE_BUGLIST = @DOXYGEN_GENERATE_BUGLIST@ +GENERATE_DEPRECATEDLIST= @DOXYGEN_GENERATE_DEPRECATEDLIST@ +GENERATE_REQUIREMENTS = @DOXYGEN_GENERATE_REQUIREMENTS@ +REQ_TRACEABILITY_INFO = @DOXYGEN_REQ_TRACEABILITY_INFO@ +ENABLED_SECTIONS = @DOXYGEN_ENABLED_SECTIONS@ +MAX_INITIALIZER_LINES = @DOXYGEN_MAX_INITIALIZER_LINES@ +SHOW_USED_FILES = @DOXYGEN_SHOW_USED_FILES@ +SHOW_FILES = @DOXYGEN_SHOW_FILES@ +SHOW_NAMESPACES = @DOXYGEN_SHOW_NAMESPACES@ +FILE_VERSION_FILTER = @DOXYGEN_FILE_VERSION_FILTER@ +LAYOUT_FILE = @DOXYGEN_LAYOUT_FILE@ +CITE_BIB_FILES = @DOXYGEN_CITE_BIB_FILES@ +EXTERNAL_TOOL_PATH = @DOXYGEN_EXTERNAL_TOOL_PATH@ +QUIET = @DOXYGEN_QUIET@ +WARNINGS = @DOXYGEN_WARNINGS@ +WARN_IF_UNDOCUMENTED = @DOXYGEN_WARN_IF_UNDOCUMENTED@ +WARN_IF_DOC_ERROR = @DOXYGEN_WARN_IF_DOC_ERROR@ +WARN_IF_INCOMPLETE_DOC = @DOXYGEN_WARN_IF_INCOMPLETE_DOC@ +WARN_NO_PARAMDOC = @DOXYGEN_WARN_NO_PARAMDOC@ +WARN_IF_UNDOC_ENUM_VAL = @DOXYGEN_WARN_IF_UNDOC_ENUM_VAL@ +WARN_LAYOUT_FILE = @DOXYGEN_WARN_LAYOUT_FILE@ +WARN_AS_ERROR = @DOXYGEN_WARN_AS_ERROR@ +WARN_FORMAT = @DOXYGEN_WARN_FORMAT@ +WARN_LINE_FORMAT = @DOXYGEN_WARN_LINE_FORMAT@ +WARN_LOGFILE = @DOXYGEN_WARN_LOGFILE@ +INPUT = @DOXYGEN_INPUT@ +INPUT_ENCODING = @DOXYGEN_INPUT_ENCODING@ +INPUT_FILE_ENCODING = @DOXYGEN_INPUT_FILE_ENCODING@ +FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ +RECURSIVE = @DOXYGEN_RECURSIVE@ +EXCLUDE = @DOXYGEN_EXCLUDE@ +EXCLUDE_SYMLINKS = @DOXYGEN_EXCLUDE_SYMLINKS@ +EXCLUDE_PATTERNS = @DOXYGEN_EXCLUDE_PATTERNS@ +EXCLUDE_SYMBOLS = @DOXYGEN_EXCLUDE_SYMBOLS@ +EXAMPLE_PATH = @DOXYGEN_EXAMPLE_PATH@ +EXAMPLE_PATTERNS = @DOXYGEN_EXAMPLE_PATTERNS@ +EXAMPLE_RECURSIVE = @DOXYGEN_EXAMPLE_RECURSIVE@ +IMAGE_PATH = @DOXYGEN_IMAGE_PATH@ +INPUT_FILTER = @DOXYGEN_INPUT_FILTER@ +FILTER_PATTERNS = @DOXYGEN_FILTER_PATTERNS@ +FILTER_SOURCE_FILES = @DOXYGEN_FILTER_SOURCE_FILES@ +FILTER_SOURCE_PATTERNS = @DOXYGEN_FILTER_SOURCE_PATTERNS@ +USE_MDFILE_AS_MAINPAGE = @DOXYGEN_USE_MDFILE_AS_MAINPAGE@ +IMPLICIT_DIR_DOCS = @DOXYGEN_IMPLICIT_DIR_DOCS@ +FORTRAN_COMMENT_AFTER = @DOXYGEN_FORTRAN_COMMENT_AFTER@ +SOURCE_BROWSER = @DOXYGEN_SOURCE_BROWSER@ +INLINE_SOURCES = @DOXYGEN_INLINE_SOURCES@ +STRIP_CODE_COMMENTS = @DOXYGEN_STRIP_CODE_COMMENTS@ +REFERENCED_BY_RELATION = @DOXYGEN_REFERENCED_BY_RELATION@ +REFERENCES_RELATION = @DOXYGEN_REFERENCES_RELATION@ +REFERENCES_LINK_SOURCE = @DOXYGEN_REFERENCES_LINK_SOURCE@ +SOURCE_TOOLTIPS = @DOXYGEN_SOURCE_TOOLTIPS@ +USE_HTAGS = @DOXYGEN_USE_HTAGS@ +VERBATIM_HEADERS = @DOXYGEN_VERBATIM_HEADERS@ +CLANG_ASSISTED_PARSING = @DOXYGEN_CLANG_ASSISTED_PARSING@ +CLANG_ADD_INC_PATHS = @DOXYGEN_CLANG_ADD_INC_PATHS@ +CLANG_OPTIONS = @DOXYGEN_CLANG_OPTIONS@ +CLANG_DATABASE_PATH = @DOXYGEN_CLANG_DATABASE_PATH@ +ALPHABETICAL_INDEX = @DOXYGEN_ALPHABETICAL_INDEX@ +IGNORE_PREFIX = @DOXYGEN_IGNORE_PREFIX@ +GENERATE_HTML = @DOXYGEN_GENERATE_HTML@ +HTML_OUTPUT = @DOXYGEN_HTML_OUTPUT@ +HTML_FILE_EXTENSION = @DOXYGEN_HTML_FILE_EXTENSION@ +HTML_HEADER = @DOXYGEN_HTML_HEADER@ +HTML_FOOTER = @DOXYGEN_HTML_FOOTER@ +HTML_STYLESHEET = @DOXYGEN_HTML_STYLESHEET@ +HTML_EXTRA_STYLESHEET = @DOXYGEN_HTML_EXTRA_STYLESHEET@ +HTML_EXTRA_FILES = @DOXYGEN_HTML_EXTRA_FILES@ +HTML_COLORSTYLE = @DOXYGEN_HTML_COLORSTYLE@ +HTML_COLORSTYLE_HUE = @DOXYGEN_HTML_COLORSTYLE_HUE@ +HTML_COLORSTYLE_SAT = @DOXYGEN_HTML_COLORSTYLE_SAT@ +HTML_COLORSTYLE_GAMMA = @DOXYGEN_HTML_COLORSTYLE_GAMMA@ +HTML_DYNAMIC_MENUS = @DOXYGEN_HTML_DYNAMIC_MENUS@ +HTML_DYNAMIC_SECTIONS = @DOXYGEN_HTML_DYNAMIC_SECTIONS@ +HTML_CODE_FOLDING = @DOXYGEN_HTML_CODE_FOLDING@ +HTML_COPY_CLIPBOARD = @DOXYGEN_HTML_COPY_CLIPBOARD@ +HTML_PROJECT_COOKIE = @DOXYGEN_HTML_PROJECT_COOKIE@ +HTML_INDEX_NUM_ENTRIES = @DOXYGEN_HTML_INDEX_NUM_ENTRIES@ +GENERATE_DOCSET = @DOXYGEN_GENERATE_DOCSET@ +DOCSET_FEEDNAME = @DOXYGEN_DOCSET_FEEDNAME@ +DOCSET_FEEDURL = @DOXYGEN_DOCSET_FEEDURL@ +DOCSET_BUNDLE_ID = @DOXYGEN_DOCSET_BUNDLE_ID@ +DOCSET_PUBLISHER_ID = @DOXYGEN_DOCSET_PUBLISHER_ID@ +DOCSET_PUBLISHER_NAME = @DOXYGEN_DOCSET_PUBLISHER_NAME@ +GENERATE_HTMLHELP = @DOXYGEN_GENERATE_HTMLHELP@ +CHM_FILE = @DOXYGEN_CHM_FILE@ +HHC_LOCATION = @DOXYGEN_HHC_LOCATION@ +GENERATE_CHI = @DOXYGEN_GENERATE_CHI@ +CHM_INDEX_ENCODING = @DOXYGEN_CHM_INDEX_ENCODING@ +BINARY_TOC = @DOXYGEN_BINARY_TOC@ +TOC_EXPAND = @DOXYGEN_TOC_EXPAND@ +SITEMAP_URL = @DOXYGEN_SITEMAP_URL@ +GENERATE_QHP = @DOXYGEN_GENERATE_QHP@ +QCH_FILE = @DOXYGEN_QCH_FILE@ +QHP_NAMESPACE = @DOXYGEN_QHP_NAMESPACE@ +QHP_VIRTUAL_FOLDER = @DOXYGEN_QHP_VIRTUAL_FOLDER@ +QHP_CUST_FILTER_NAME = @DOXYGEN_QHP_CUST_FILTER_NAME@ +QHP_CUST_FILTER_ATTRS = @DOXYGEN_QHP_CUST_FILTER_ATTRS@ +QHP_SECT_FILTER_ATTRS = @DOXYGEN_QHP_SECT_FILTER_ATTRS@ +QHG_LOCATION = @DOXYGEN_QHG_LOCATION@ +GENERATE_ECLIPSEHELP = @DOXYGEN_GENERATE_ECLIPSEHELP@ +ECLIPSE_DOC_ID = @DOXYGEN_ECLIPSE_DOC_ID@ +DISABLE_INDEX = @DOXYGEN_DISABLE_INDEX@ +GENERATE_TREEVIEW = @DOXYGEN_GENERATE_TREEVIEW@ +PAGE_OUTLINE_PANEL = @DOXYGEN_PAGE_OUTLINE_PANEL@ +FULL_SIDEBAR = @DOXYGEN_FULL_SIDEBAR@ +ENUM_VALUES_PER_LINE = @DOXYGEN_ENUM_VALUES_PER_LINE@ +SHOW_ENUM_VALUES = @DOXYGEN_SHOW_ENUM_VALUES@ +TREEVIEW_WIDTH = @DOXYGEN_TREEVIEW_WIDTH@ +EXT_LINKS_IN_WINDOW = @DOXYGEN_EXT_LINKS_IN_WINDOW@ +OBFUSCATE_EMAILS = @DOXYGEN_OBFUSCATE_EMAILS@ +HTML_FORMULA_FORMAT = @DOXYGEN_HTML_FORMULA_FORMAT@ +FORMULA_FONTSIZE = @DOXYGEN_FORMULA_FONTSIZE@ +FORMULA_MACROFILE = @DOXYGEN_FORMULA_MACROFILE@ +USE_MATHJAX = @DOXYGEN_USE_MATHJAX@ +MATHJAX_VERSION = @DOXYGEN_MATHJAX_VERSION@ +MATHJAX_FORMAT = @DOXYGEN_MATHJAX_FORMAT@ +MATHJAX_RELPATH = @DOXYGEN_MATHJAX_RELPATH@ +MATHJAX_EXTENSIONS = @DOXYGEN_MATHJAX_EXTENSIONS@ +MATHJAX_CODEFILE = @DOXYGEN_MATHJAX_CODEFILE@ +SEARCHENGINE = @DOXYGEN_SEARCHENGINE@ +SERVER_BASED_SEARCH = @DOXYGEN_SERVER_BASED_SEARCH@ +EXTERNAL_SEARCH = @DOXYGEN_EXTERNAL_SEARCH@ +SEARCHENGINE_URL = @DOXYGEN_SEARCHENGINE_URL@ +SEARCHDATA_FILE = @DOXYGEN_SEARCHDATA_FILE@ +EXTERNAL_SEARCH_ID = @DOXYGEN_EXTERNAL_SEARCH_ID@ +EXTRA_SEARCH_MAPPINGS = @DOXYGEN_EXTRA_SEARCH_MAPPINGS@ +GENERATE_LATEX = @DOXYGEN_GENERATE_LATEX@ +LATEX_OUTPUT = @DOXYGEN_LATEX_OUTPUT@ +LATEX_CMD_NAME = @DOXYGEN_LATEX_CMD_NAME@ +MAKEINDEX_CMD_NAME = @DOXYGEN_MAKEINDEX_CMD_NAME@ +LATEX_MAKEINDEX_CMD = @DOXYGEN_LATEX_MAKEINDEX_CMD@ +COMPACT_LATEX = @DOXYGEN_COMPACT_LATEX@ +PAPER_TYPE = @DOXYGEN_PAPER_TYPE@ +EXTRA_PACKAGES = @DOXYGEN_EXTRA_PACKAGES@ +LATEX_HEADER = @DOXYGEN_LATEX_HEADER@ +LATEX_FOOTER = @DOXYGEN_LATEX_FOOTER@ +LATEX_EXTRA_STYLESHEET = @DOXYGEN_LATEX_EXTRA_STYLESHEET@ +LATEX_EXTRA_FILES = @DOXYGEN_LATEX_EXTRA_FILES@ +PDF_HYPERLINKS = @DOXYGEN_PDF_HYPERLINKS@ +USE_PDFLATEX = @DOXYGEN_USE_PDFLATEX@ +LATEX_BATCHMODE = @DOXYGEN_LATEX_BATCHMODE@ +LATEX_HIDE_INDICES = @DOXYGEN_LATEX_HIDE_INDICES@ +LATEX_BIB_STYLE = @DOXYGEN_LATEX_BIB_STYLE@ +LATEX_EMOJI_DIRECTORY = @DOXYGEN_LATEX_EMOJI_DIRECTORY@ +GENERATE_RTF = @DOXYGEN_GENERATE_RTF@ +RTF_OUTPUT = @DOXYGEN_RTF_OUTPUT@ +COMPACT_RTF = @DOXYGEN_COMPACT_RTF@ +RTF_HYPERLINKS = @DOXYGEN_RTF_HYPERLINKS@ +RTF_STYLESHEET_FILE = @DOXYGEN_RTF_STYLESHEET_FILE@ +RTF_EXTENSIONS_FILE = @DOXYGEN_RTF_EXTENSIONS_FILE@ +RTF_EXTRA_FILES = @DOXYGEN_RTF_EXTRA_FILES@ +GENERATE_MAN = @DOXYGEN_GENERATE_MAN@ +MAN_OUTPUT = @DOXYGEN_MAN_OUTPUT@ +MAN_EXTENSION = @DOXYGEN_MAN_EXTENSION@ +MAN_SUBDIR = @DOXYGEN_MAN_SUBDIR@ +MAN_LINKS = @DOXYGEN_MAN_LINKS@ +GENERATE_XML = @DOXYGEN_GENERATE_XML@ +XML_OUTPUT = @DOXYGEN_XML_OUTPUT@ +XML_PROGRAMLISTING = @DOXYGEN_XML_PROGRAMLISTING@ +XML_NS_MEMB_FILE_SCOPE = @DOXYGEN_XML_NS_MEMB_FILE_SCOPE@ +GENERATE_DOCBOOK = @DOXYGEN_GENERATE_DOCBOOK@ +DOCBOOK_OUTPUT = @DOXYGEN_DOCBOOK_OUTPUT@ +GENERATE_AUTOGEN_DEF = @DOXYGEN_GENERATE_AUTOGEN_DEF@ +GENERATE_SQLITE3 = @DOXYGEN_GENERATE_SQLITE3@ +SQLITE3_OUTPUT = @DOXYGEN_SQLITE3_OUTPUT@ +SQLITE3_RECREATE_DB = @DOXYGEN_SQLITE3_RECREATE_DB@ +GENERATE_PERLMOD = @DOXYGEN_GENERATE_PERLMOD@ +PERLMOD_LATEX = @DOXYGEN_PERLMOD_LATEX@ +PERLMOD_PRETTY = @DOXYGEN_PERLMOD_PRETTY@ +PERLMOD_MAKEVAR_PREFIX = @DOXYGEN_PERLMOD_MAKEVAR_PREFIX@ +ENABLE_PREPROCESSING = @DOXYGEN_ENABLE_PREPROCESSING@ +MACRO_EXPANSION = @DOXYGEN_MACRO_EXPANSION@ +EXPAND_ONLY_PREDEF = @DOXYGEN_EXPAND_ONLY_PREDEF@ +SEARCH_INCLUDES = @DOXYGEN_SEARCH_INCLUDES@ +INCLUDE_PATH = @DOXYGEN_INCLUDE_PATH@ +INCLUDE_FILE_PATTERNS = @DOXYGEN_INCLUDE_FILE_PATTERNS@ +PREDEFINED = @DOXYGEN_PREDEFINED@ +EXPAND_AS_DEFINED = @DOXYGEN_EXPAND_AS_DEFINED@ +SKIP_FUNCTION_MACROS = @DOXYGEN_SKIP_FUNCTION_MACROS@ +TAGFILES = @DOXYGEN_TAGFILES@ +GENERATE_TAGFILE = @DOXYGEN_GENERATE_TAGFILE@ +ALLEXTERNALS = @DOXYGEN_ALLEXTERNALS@ +EXTERNAL_GROUPS = @DOXYGEN_EXTERNAL_GROUPS@ +EXTERNAL_PAGES = @DOXYGEN_EXTERNAL_PAGES@ +HIDE_UNDOC_RELATIONS = @DOXYGEN_HIDE_UNDOC_RELATIONS@ +HAVE_DOT = @DOXYGEN_HAVE_DOT@ +DOT_NUM_THREADS = @DOXYGEN_DOT_NUM_THREADS@ +DOT_COMMON_ATTR = @DOXYGEN_DOT_COMMON_ATTR@ +DOT_EDGE_ATTR = @DOXYGEN_DOT_EDGE_ATTR@ +DOT_NODE_ATTR = @DOXYGEN_DOT_NODE_ATTR@ +DOT_FONTPATH = @DOXYGEN_DOT_FONTPATH@ +CLASS_GRAPH = @DOXYGEN_CLASS_GRAPH@ +COLLABORATION_GRAPH = @DOXYGEN_COLLABORATION_GRAPH@ +GROUP_GRAPHS = @DOXYGEN_GROUP_GRAPHS@ +UML_LOOK = @DOXYGEN_UML_LOOK@ +UML_LIMIT_NUM_FIELDS = @DOXYGEN_UML_LIMIT_NUM_FIELDS@ +UML_MAX_EDGE_LABELS = @DOXYGEN_UML_MAX_EDGE_LABELS@ +DOT_UML_DETAILS = @DOXYGEN_DOT_UML_DETAILS@ +DOT_WRAP_THRESHOLD = @DOXYGEN_DOT_WRAP_THRESHOLD@ +TEMPLATE_RELATIONS = @DOXYGEN_TEMPLATE_RELATIONS@ +INCLUDE_GRAPH = @DOXYGEN_INCLUDE_GRAPH@ +INCLUDED_BY_GRAPH = @DOXYGEN_INCLUDED_BY_GRAPH@ +CALL_GRAPH = @DOXYGEN_CALL_GRAPH@ +CALLER_GRAPH = @DOXYGEN_CALLER_GRAPH@ +GRAPHICAL_HIERARCHY = @DOXYGEN_GRAPHICAL_HIERARCHY@ +DIRECTORY_GRAPH = @DOXYGEN_DIRECTORY_GRAPH@ +DIR_GRAPH_MAX_DEPTH = @DOXYGEN_DIR_GRAPH_MAX_DEPTH@ +DOT_IMAGE_FORMAT = @DOXYGEN_DOT_IMAGE_FORMAT@ +INTERACTIVE_SVG = @DOXYGEN_INTERACTIVE_SVG@ +DOT_PATH = @DOXYGEN_DOT_PATH@ +DOTFILE_DIRS = @DOXYGEN_DOTFILE_DIRS@ +DIA_PATH = @DOXYGEN_DIA_PATH@ +DIAFILE_DIRS = @DOXYGEN_DIAFILE_DIRS@ +PLANTUML_JAR_PATH = @DOXYGEN_PLANTUML_JAR_PATH@ +PLANTUML_CFG_FILE = @DOXYGEN_PLANTUML_CFG_FILE@ +PLANTUML_INCLUDE_PATH = @DOXYGEN_PLANTUML_INCLUDE_PATH@ +PLANTUMLFILE_DIRS = @DOXYGEN_PLANTUMLFILE_DIRS@ +DOT_GRAPH_MAX_NODES = @DOXYGEN_DOT_GRAPH_MAX_NODES@ +MAX_DOT_GRAPH_DEPTH = @DOXYGEN_MAX_DOT_GRAPH_DEPTH@ +DOT_MULTI_TARGETS = @DOXYGEN_DOT_MULTI_TARGETS@ +GENERATE_LEGEND = @DOXYGEN_GENERATE_LEGEND@ +DOT_CLEANUP = @DOXYGEN_DOT_CLEANUP@ +MSCGEN_TOOL = @DOXYGEN_MSCGEN_TOOL@ +MSCFILE_DIRS = @DOXYGEN_MSCFILE_DIRS@ diff --git a/ktx/build/CMakeDoxygenDefaults.cmake b/ktx/build/CMakeDoxygenDefaults.cmake new file mode 100644 index 0000000..8b410ae --- /dev/null +++ b/ktx/build/CMakeDoxygenDefaults.cmake @@ -0,0 +1,747 @@ +# +# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! +# + +if(NOT DEFINED DOXYGEN_DOXYFILE_ENCODING) + set(DOXYGEN_DOXYFILE_ENCODING UTF-8) +endif() +if(NOT DEFINED DOXYGEN_PROJECT_NAME) + set(DOXYGEN_PROJECT_NAME "My Project") +endif() +if(NOT DEFINED DOXYGEN_CREATE_SUBDIRS) + set(DOXYGEN_CREATE_SUBDIRS NO) +endif() +if(NOT DEFINED DOXYGEN_CREATE_SUBDIRS_LEVEL) + set(DOXYGEN_CREATE_SUBDIRS_LEVEL 8) +endif() +if(NOT DEFINED DOXYGEN_ALLOW_UNICODE_NAMES) + set(DOXYGEN_ALLOW_UNICODE_NAMES NO) +endif() +if(NOT DEFINED DOXYGEN_OUTPUT_LANGUAGE) + set(DOXYGEN_OUTPUT_LANGUAGE English) +endif() +if(NOT DEFINED DOXYGEN_BRIEF_MEMBER_DESC) + set(DOXYGEN_BRIEF_MEMBER_DESC YES) +endif() +if(NOT DEFINED DOXYGEN_REPEAT_BRIEF) + set(DOXYGEN_REPEAT_BRIEF YES) +endif() +if(NOT DEFINED DOXYGEN_ABBREVIATE_BRIEF) + set(DOXYGEN_ABBREVIATE_BRIEF "The $name class" + "The $name widget" + "The $name file" + is + provides + specifies + contains + represents + a + an + the) +endif() +if(NOT DEFINED DOXYGEN_ALWAYS_DETAILED_SEC) + set(DOXYGEN_ALWAYS_DETAILED_SEC NO) +endif() +if(NOT DEFINED DOXYGEN_INLINE_INHERITED_MEMB) + set(DOXYGEN_INLINE_INHERITED_MEMB NO) +endif() +if(NOT DEFINED DOXYGEN_FULL_PATH_NAMES) + set(DOXYGEN_FULL_PATH_NAMES YES) +endif() +if(NOT DEFINED DOXYGEN_SHORT_NAMES) + set(DOXYGEN_SHORT_NAMES NO) +endif() +if(NOT DEFINED DOXYGEN_JAVADOC_AUTOBRIEF) + set(DOXYGEN_JAVADOC_AUTOBRIEF NO) +endif() +if(NOT DEFINED DOXYGEN_JAVADOC_BANNER) + set(DOXYGEN_JAVADOC_BANNER NO) +endif() +if(NOT DEFINED DOXYGEN_QT_AUTOBRIEF) + set(DOXYGEN_QT_AUTOBRIEF NO) +endif() +if(NOT DEFINED DOXYGEN_MULTILINE_CPP_IS_BRIEF) + set(DOXYGEN_MULTILINE_CPP_IS_BRIEF NO) +endif() +if(NOT DEFINED DOXYGEN_PYTHON_DOCSTRING) + set(DOXYGEN_PYTHON_DOCSTRING YES) +endif() +if(NOT DEFINED DOXYGEN_INHERIT_DOCS) + set(DOXYGEN_INHERIT_DOCS YES) +endif() +if(NOT DEFINED DOXYGEN_SEPARATE_MEMBER_PAGES) + set(DOXYGEN_SEPARATE_MEMBER_PAGES NO) +endif() +if(NOT DEFINED DOXYGEN_TAB_SIZE) + set(DOXYGEN_TAB_SIZE 4) +endif() +if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_FOR_C) + set(DOXYGEN_OPTIMIZE_OUTPUT_FOR_C NO) +endif() +if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_JAVA) + set(DOXYGEN_OPTIMIZE_OUTPUT_JAVA NO) +endif() +if(NOT DEFINED DOXYGEN_OPTIMIZE_FOR_FORTRAN) + set(DOXYGEN_OPTIMIZE_FOR_FORTRAN NO) +endif() +if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_VHDL) + set(DOXYGEN_OPTIMIZE_OUTPUT_VHDL NO) +endif() +if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_SLICE) + set(DOXYGEN_OPTIMIZE_OUTPUT_SLICE NO) +endif() +if(NOT DEFINED DOXYGEN_MARKDOWN_SUPPORT) + set(DOXYGEN_MARKDOWN_SUPPORT YES) +endif() +if(NOT DEFINED DOXYGEN_MARKDOWN_STRICT) + set(DOXYGEN_MARKDOWN_STRICT YES) +endif() +if(NOT DEFINED DOXYGEN_TOC_INCLUDE_HEADINGS) + set(DOXYGEN_TOC_INCLUDE_HEADINGS 6) +endif() +if(NOT DEFINED DOXYGEN_MARKDOWN_ID_STYLE) + set(DOXYGEN_MARKDOWN_ID_STYLE DOXYGEN) +endif() +if(NOT DEFINED DOXYGEN_AUTOLINK_SUPPORT) + set(DOXYGEN_AUTOLINK_SUPPORT YES) +endif() +if(NOT DEFINED DOXYGEN_BUILTIN_STL_SUPPORT) + set(DOXYGEN_BUILTIN_STL_SUPPORT NO) +endif() +if(NOT DEFINED DOXYGEN_CPP_CLI_SUPPORT) + set(DOXYGEN_CPP_CLI_SUPPORT NO) +endif() +if(NOT DEFINED DOXYGEN_SIP_SUPPORT) + set(DOXYGEN_SIP_SUPPORT NO) +endif() +if(NOT DEFINED DOXYGEN_IDL_PROPERTY_SUPPORT) + set(DOXYGEN_IDL_PROPERTY_SUPPORT YES) +endif() +if(NOT DEFINED DOXYGEN_DISTRIBUTE_GROUP_DOC) + set(DOXYGEN_DISTRIBUTE_GROUP_DOC NO) +endif() +if(NOT DEFINED DOXYGEN_GROUP_NESTED_COMPOUNDS) + set(DOXYGEN_GROUP_NESTED_COMPOUNDS NO) +endif() +if(NOT DEFINED DOXYGEN_SUBGROUPING) + set(DOXYGEN_SUBGROUPING YES) +endif() +if(NOT DEFINED DOXYGEN_INLINE_GROUPED_CLASSES) + set(DOXYGEN_INLINE_GROUPED_CLASSES NO) +endif() +if(NOT DEFINED DOXYGEN_INLINE_SIMPLE_STRUCTS) + set(DOXYGEN_INLINE_SIMPLE_STRUCTS NO) +endif() +if(NOT DEFINED DOXYGEN_TYPEDEF_HIDES_STRUCT) + set(DOXYGEN_TYPEDEF_HIDES_STRUCT NO) +endif() +if(NOT DEFINED DOXYGEN_LOOKUP_CACHE_SIZE) + set(DOXYGEN_LOOKUP_CACHE_SIZE 0) +endif() +if(NOT DEFINED DOXYGEN_NUM_PROC_THREADS) + set(DOXYGEN_NUM_PROC_THREADS 1) +endif() +if(NOT DEFINED DOXYGEN_TIMESTAMP) + set(DOXYGEN_TIMESTAMP NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_ALL) + set(DOXYGEN_EXTRACT_ALL NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_PRIVATE) + set(DOXYGEN_EXTRACT_PRIVATE NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_PRIV_VIRTUAL) + set(DOXYGEN_EXTRACT_PRIV_VIRTUAL NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_PACKAGE) + set(DOXYGEN_EXTRACT_PACKAGE NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_STATIC) + set(DOXYGEN_EXTRACT_STATIC NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_LOCAL_CLASSES) + set(DOXYGEN_EXTRACT_LOCAL_CLASSES YES) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_LOCAL_METHODS) + set(DOXYGEN_EXTRACT_LOCAL_METHODS NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_ANON_NSPACES) + set(DOXYGEN_EXTRACT_ANON_NSPACES NO) +endif() +if(NOT DEFINED DOXYGEN_RESOLVE_UNNAMED_PARAMS) + set(DOXYGEN_RESOLVE_UNNAMED_PARAMS YES) +endif() +if(NOT DEFINED DOXYGEN_HIDE_UNDOC_MEMBERS) + set(DOXYGEN_HIDE_UNDOC_MEMBERS NO) +endif() +if(NOT DEFINED DOXYGEN_HIDE_UNDOC_CLASSES) + set(DOXYGEN_HIDE_UNDOC_CLASSES NO) +endif() +if(NOT DEFINED DOXYGEN_HIDE_UNDOC_NAMESPACES) + set(DOXYGEN_HIDE_UNDOC_NAMESPACES YES) +endif() +if(NOT DEFINED DOXYGEN_HIDE_FRIEND_COMPOUNDS) + set(DOXYGEN_HIDE_FRIEND_COMPOUNDS NO) +endif() +if(NOT DEFINED DOXYGEN_HIDE_IN_BODY_DOCS) + set(DOXYGEN_HIDE_IN_BODY_DOCS NO) +endif() +if(NOT DEFINED DOXYGEN_INTERNAL_DOCS) + set(DOXYGEN_INTERNAL_DOCS NO) +endif() +if(NOT DEFINED DOXYGEN_CASE_SENSE_NAMES) + set(DOXYGEN_CASE_SENSE_NAMES SYSTEM) +endif() +if(NOT DEFINED DOXYGEN_HIDE_SCOPE_NAMES) + set(DOXYGEN_HIDE_SCOPE_NAMES NO) +endif() +if(NOT DEFINED DOXYGEN_HIDE_COMPOUND_REFERENCE) + set(DOXYGEN_HIDE_COMPOUND_REFERENCE NO) +endif() +if(NOT DEFINED DOXYGEN_SHOW_HEADERFILE) + set(DOXYGEN_SHOW_HEADERFILE YES) +endif() +if(NOT DEFINED DOXYGEN_SHOW_INCLUDE_FILES) + set(DOXYGEN_SHOW_INCLUDE_FILES YES) +endif() +if(NOT DEFINED DOXYGEN_SHOW_GROUPED_MEMB_INC) + set(DOXYGEN_SHOW_GROUPED_MEMB_INC NO) +endif() +if(NOT DEFINED DOXYGEN_FORCE_LOCAL_INCLUDES) + set(DOXYGEN_FORCE_LOCAL_INCLUDES NO) +endif() +if(NOT DEFINED DOXYGEN_INLINE_INFO) + set(DOXYGEN_INLINE_INFO YES) +endif() +if(NOT DEFINED DOXYGEN_SORT_MEMBER_DOCS) + set(DOXYGEN_SORT_MEMBER_DOCS YES) +endif() +if(NOT DEFINED DOXYGEN_SORT_BRIEF_DOCS) + set(DOXYGEN_SORT_BRIEF_DOCS NO) +endif() +if(NOT DEFINED DOXYGEN_SORT_MEMBERS_CTORS_1ST) + set(DOXYGEN_SORT_MEMBERS_CTORS_1ST NO) +endif() +if(NOT DEFINED DOXYGEN_SORT_GROUP_NAMES) + set(DOXYGEN_SORT_GROUP_NAMES NO) +endif() +if(NOT DEFINED DOXYGEN_SORT_BY_SCOPE_NAME) + set(DOXYGEN_SORT_BY_SCOPE_NAME NO) +endif() +if(NOT DEFINED DOXYGEN_STRICT_PROTO_MATCHING) + set(DOXYGEN_STRICT_PROTO_MATCHING NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_TODOLIST) + set(DOXYGEN_GENERATE_TODOLIST YES) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_TESTLIST) + set(DOXYGEN_GENERATE_TESTLIST YES) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_BUGLIST) + set(DOXYGEN_GENERATE_BUGLIST YES) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_DEPRECATEDLIST) + set(DOXYGEN_GENERATE_DEPRECATEDLIST YES) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_REQUIREMENTS) + set(DOXYGEN_GENERATE_REQUIREMENTS YES) +endif() +if(NOT DEFINED DOXYGEN_REQ_TRACEABILITY_INFO) + set(DOXYGEN_REQ_TRACEABILITY_INFO YES) +endif() +if(NOT DEFINED DOXYGEN_MAX_INITIALIZER_LINES) + set(DOXYGEN_MAX_INITIALIZER_LINES 30) +endif() +if(NOT DEFINED DOXYGEN_SHOW_USED_FILES) + set(DOXYGEN_SHOW_USED_FILES YES) +endif() +if(NOT DEFINED DOXYGEN_SHOW_FILES) + set(DOXYGEN_SHOW_FILES YES) +endif() +if(NOT DEFINED DOXYGEN_SHOW_NAMESPACES) + set(DOXYGEN_SHOW_NAMESPACES YES) +endif() +if(NOT DEFINED DOXYGEN_QUIET) + set(DOXYGEN_QUIET NO) +endif() +if(NOT DEFINED DOXYGEN_WARNINGS) + set(DOXYGEN_WARNINGS YES) +endif() +if(NOT DEFINED DOXYGEN_WARN_IF_UNDOCUMENTED) + set(DOXYGEN_WARN_IF_UNDOCUMENTED YES) +endif() +if(NOT DEFINED DOXYGEN_WARN_IF_DOC_ERROR) + set(DOXYGEN_WARN_IF_DOC_ERROR YES) +endif() +if(NOT DEFINED DOXYGEN_WARN_IF_INCOMPLETE_DOC) + set(DOXYGEN_WARN_IF_INCOMPLETE_DOC YES) +endif() +if(NOT DEFINED DOXYGEN_WARN_NO_PARAMDOC) + set(DOXYGEN_WARN_NO_PARAMDOC NO) +endif() +if(NOT DEFINED DOXYGEN_WARN_IF_UNDOC_ENUM_VAL) + set(DOXYGEN_WARN_IF_UNDOC_ENUM_VAL NO) +endif() +if(NOT DEFINED DOXYGEN_WARN_LAYOUT_FILE) + set(DOXYGEN_WARN_LAYOUT_FILE YES) +endif() +if(NOT DEFINED DOXYGEN_WARN_AS_ERROR) + set(DOXYGEN_WARN_AS_ERROR NO) +endif() +if(NOT DEFINED DOXYGEN_WARN_FORMAT) + set(DOXYGEN_WARN_FORMAT "$file:$line: $text") +endif() +if(NOT DEFINED DOXYGEN_WARN_LINE_FORMAT) + set(DOXYGEN_WARN_LINE_FORMAT "at line $line of file $file") +endif() +if(NOT DEFINED DOXYGEN_INPUT_ENCODING) + set(DOXYGEN_INPUT_ENCODING UTF-8) +endif() +if(NOT DEFINED DOXYGEN_FILE_PATTERNS) + set(DOXYGEN_FILE_PATTERNS *.c + *.cc + *.cxx + *.cxxm + *.cpp + *.cppm + *.ccm + *.c++ + *.c++m + *.java + *.ii + *.ixx + *.ipp + *.i++ + *.inl + *.idl + *.ddl + *.odl + *.h + *.hh + *.hxx + *.hpp + *.h++ + *.l + *.cs + *.d + *.php + *.php4 + *.php5 + *.phtml + *.inc + *.m + *.markdown + *.md + *.mm + *.dox + *.py + *.pyw + *.f90 + *.f95 + *.f03 + *.f08 + *.f18 + *.f + *.for + *.vhd + *.vhdl + *.ucf + *.qsf + *.ice) +endif() +if(NOT DEFINED DOXYGEN_RECURSIVE) + set(DOXYGEN_RECURSIVE NO) +endif() +if(NOT DEFINED DOXYGEN_EXCLUDE_SYMLINKS) + set(DOXYGEN_EXCLUDE_SYMLINKS NO) +endif() +if(NOT DEFINED DOXYGEN_EXAMPLE_PATTERNS) + set(DOXYGEN_EXAMPLE_PATTERNS *) +endif() +if(NOT DEFINED DOXYGEN_EXAMPLE_RECURSIVE) + set(DOXYGEN_EXAMPLE_RECURSIVE NO) +endif() +if(NOT DEFINED DOXYGEN_FILTER_SOURCE_FILES) + set(DOXYGEN_FILTER_SOURCE_FILES NO) +endif() +if(NOT DEFINED DOXYGEN_IMPLICIT_DIR_DOCS) + set(DOXYGEN_IMPLICIT_DIR_DOCS YES) +endif() +if(NOT DEFINED DOXYGEN_FORTRAN_COMMENT_AFTER) + set(DOXYGEN_FORTRAN_COMMENT_AFTER 72) +endif() +if(NOT DEFINED DOXYGEN_SOURCE_BROWSER) + set(DOXYGEN_SOURCE_BROWSER NO) +endif() +if(NOT DEFINED DOXYGEN_INLINE_SOURCES) + set(DOXYGEN_INLINE_SOURCES NO) +endif() +if(NOT DEFINED DOXYGEN_STRIP_CODE_COMMENTS) + set(DOXYGEN_STRIP_CODE_COMMENTS YES) +endif() +if(NOT DEFINED DOXYGEN_REFERENCED_BY_RELATION) + set(DOXYGEN_REFERENCED_BY_RELATION NO) +endif() +if(NOT DEFINED DOXYGEN_REFERENCES_RELATION) + set(DOXYGEN_REFERENCES_RELATION NO) +endif() +if(NOT DEFINED DOXYGEN_REFERENCES_LINK_SOURCE) + set(DOXYGEN_REFERENCES_LINK_SOURCE YES) +endif() +if(NOT DEFINED DOXYGEN_SOURCE_TOOLTIPS) + set(DOXYGEN_SOURCE_TOOLTIPS YES) +endif() +if(NOT DEFINED DOXYGEN_USE_HTAGS) + set(DOXYGEN_USE_HTAGS NO) +endif() +if(NOT DEFINED DOXYGEN_VERBATIM_HEADERS) + set(DOXYGEN_VERBATIM_HEADERS YES) +endif() +if(NOT DEFINED DOXYGEN_CLANG_ASSISTED_PARSING) + set(DOXYGEN_CLANG_ASSISTED_PARSING NO) +endif() +if(NOT DEFINED DOXYGEN_CLANG_ADD_INC_PATHS) + set(DOXYGEN_CLANG_ADD_INC_PATHS YES) +endif() +if(NOT DEFINED DOXYGEN_ALPHABETICAL_INDEX) + set(DOXYGEN_ALPHABETICAL_INDEX YES) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_HTML) + set(DOXYGEN_GENERATE_HTML YES) +endif() +if(NOT DEFINED DOXYGEN_HTML_OUTPUT) + set(DOXYGEN_HTML_OUTPUT html) +endif() +if(NOT DEFINED DOXYGEN_HTML_FILE_EXTENSION) + set(DOXYGEN_HTML_FILE_EXTENSION .html) +endif() +if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE) + set(DOXYGEN_HTML_COLORSTYLE AUTO_LIGHT) +endif() +if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE_HUE) + set(DOXYGEN_HTML_COLORSTYLE_HUE 220) +endif() +if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE_SAT) + set(DOXYGEN_HTML_COLORSTYLE_SAT 100) +endif() +if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE_GAMMA) + set(DOXYGEN_HTML_COLORSTYLE_GAMMA 80) +endif() +if(NOT DEFINED DOXYGEN_HTML_DYNAMIC_MENUS) + set(DOXYGEN_HTML_DYNAMIC_MENUS YES) +endif() +if(NOT DEFINED DOXYGEN_HTML_DYNAMIC_SECTIONS) + set(DOXYGEN_HTML_DYNAMIC_SECTIONS NO) +endif() +if(NOT DEFINED DOXYGEN_HTML_CODE_FOLDING) + set(DOXYGEN_HTML_CODE_FOLDING YES) +endif() +if(NOT DEFINED DOXYGEN_HTML_COPY_CLIPBOARD) + set(DOXYGEN_HTML_COPY_CLIPBOARD YES) +endif() +if(NOT DEFINED DOXYGEN_HTML_INDEX_NUM_ENTRIES) + set(DOXYGEN_HTML_INDEX_NUM_ENTRIES 100) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_DOCSET) + set(DOXYGEN_GENERATE_DOCSET NO) +endif() +if(NOT DEFINED DOXYGEN_DOCSET_FEEDNAME) + set(DOXYGEN_DOCSET_FEEDNAME "Doxygen generated docs") +endif() +if(NOT DEFINED DOXYGEN_DOCSET_BUNDLE_ID) + set(DOXYGEN_DOCSET_BUNDLE_ID org.doxygen.Project) +endif() +if(NOT DEFINED DOXYGEN_DOCSET_PUBLISHER_ID) + set(DOXYGEN_DOCSET_PUBLISHER_ID org.doxygen.Publisher) +endif() +if(NOT DEFINED DOXYGEN_DOCSET_PUBLISHER_NAME) + set(DOXYGEN_DOCSET_PUBLISHER_NAME Publisher) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_HTMLHELP) + set(DOXYGEN_GENERATE_HTMLHELP NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_CHI) + set(DOXYGEN_GENERATE_CHI NO) +endif() +if(NOT DEFINED DOXYGEN_BINARY_TOC) + set(DOXYGEN_BINARY_TOC NO) +endif() +if(NOT DEFINED DOXYGEN_TOC_EXPAND) + set(DOXYGEN_TOC_EXPAND NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_QHP) + set(DOXYGEN_GENERATE_QHP NO) +endif() +if(NOT DEFINED DOXYGEN_QHP_NAMESPACE) + set(DOXYGEN_QHP_NAMESPACE org.doxygen.Project) +endif() +if(NOT DEFINED DOXYGEN_QHP_VIRTUAL_FOLDER) + set(DOXYGEN_QHP_VIRTUAL_FOLDER doc) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_ECLIPSEHELP) + set(DOXYGEN_GENERATE_ECLIPSEHELP NO) +endif() +if(NOT DEFINED DOXYGEN_ECLIPSE_DOC_ID) + set(DOXYGEN_ECLIPSE_DOC_ID org.doxygen.Project) +endif() +if(NOT DEFINED DOXYGEN_DISABLE_INDEX) + set(DOXYGEN_DISABLE_INDEX NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_TREEVIEW) + set(DOXYGEN_GENERATE_TREEVIEW YES) +endif() +if(NOT DEFINED DOXYGEN_PAGE_OUTLINE_PANEL) + set(DOXYGEN_PAGE_OUTLINE_PANEL YES) +endif() +if(NOT DEFINED DOXYGEN_FULL_SIDEBAR) + set(DOXYGEN_FULL_SIDEBAR NO) +endif() +if(NOT DEFINED DOXYGEN_ENUM_VALUES_PER_LINE) + set(DOXYGEN_ENUM_VALUES_PER_LINE 4) +endif() +if(NOT DEFINED DOXYGEN_SHOW_ENUM_VALUES) + set(DOXYGEN_SHOW_ENUM_VALUES NO) +endif() +if(NOT DEFINED DOXYGEN_TREEVIEW_WIDTH) + set(DOXYGEN_TREEVIEW_WIDTH 250) +endif() +if(NOT DEFINED DOXYGEN_EXT_LINKS_IN_WINDOW) + set(DOXYGEN_EXT_LINKS_IN_WINDOW NO) +endif() +if(NOT DEFINED DOXYGEN_OBFUSCATE_EMAILS) + set(DOXYGEN_OBFUSCATE_EMAILS YES) +endif() +if(NOT DEFINED DOXYGEN_HTML_FORMULA_FORMAT) + set(DOXYGEN_HTML_FORMULA_FORMAT png) +endif() +if(NOT DEFINED DOXYGEN_FORMULA_FONTSIZE) + set(DOXYGEN_FORMULA_FONTSIZE 10) +endif() +if(NOT DEFINED DOXYGEN_USE_MATHJAX) + set(DOXYGEN_USE_MATHJAX NO) +endif() +if(NOT DEFINED DOXYGEN_MATHJAX_VERSION) + set(DOXYGEN_MATHJAX_VERSION MathJax_2) +endif() +if(NOT DEFINED DOXYGEN_MATHJAX_FORMAT) + set(DOXYGEN_MATHJAX_FORMAT HTML-CSS) +endif() +if(NOT DEFINED DOXYGEN_SEARCHENGINE) + set(DOXYGEN_SEARCHENGINE YES) +endif() +if(NOT DEFINED DOXYGEN_SERVER_BASED_SEARCH) + set(DOXYGEN_SERVER_BASED_SEARCH NO) +endif() +if(NOT DEFINED DOXYGEN_EXTERNAL_SEARCH) + set(DOXYGEN_EXTERNAL_SEARCH NO) +endif() +if(NOT DEFINED DOXYGEN_SEARCHDATA_FILE) + set(DOXYGEN_SEARCHDATA_FILE searchdata.xml) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_LATEX) + set(DOXYGEN_GENERATE_LATEX YES) +endif() +if(NOT DEFINED DOXYGEN_LATEX_OUTPUT) + set(DOXYGEN_LATEX_OUTPUT latex) +endif() +if(NOT DEFINED DOXYGEN_MAKEINDEX_CMD_NAME) + set(DOXYGEN_MAKEINDEX_CMD_NAME makeindex) +endif() +if(NOT DEFINED DOXYGEN_LATEX_MAKEINDEX_CMD) + set(DOXYGEN_LATEX_MAKEINDEX_CMD makeindex) +endif() +if(NOT DEFINED DOXYGEN_COMPACT_LATEX) + set(DOXYGEN_COMPACT_LATEX NO) +endif() +if(NOT DEFINED DOXYGEN_PAPER_TYPE) + set(DOXYGEN_PAPER_TYPE a4) +endif() +if(NOT DEFINED DOXYGEN_PDF_HYPERLINKS) + set(DOXYGEN_PDF_HYPERLINKS YES) +endif() +if(NOT DEFINED DOXYGEN_USE_PDFLATEX) + set(DOXYGEN_USE_PDFLATEX YES) +endif() +if(NOT DEFINED DOXYGEN_LATEX_BATCHMODE) + set(DOXYGEN_LATEX_BATCHMODE NO) +endif() +if(NOT DEFINED DOXYGEN_LATEX_HIDE_INDICES) + set(DOXYGEN_LATEX_HIDE_INDICES NO) +endif() +if(NOT DEFINED DOXYGEN_LATEX_BIB_STYLE) + set(DOXYGEN_LATEX_BIB_STYLE plainnat) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_RTF) + set(DOXYGEN_GENERATE_RTF NO) +endif() +if(NOT DEFINED DOXYGEN_RTF_OUTPUT) + set(DOXYGEN_RTF_OUTPUT rtf) +endif() +if(NOT DEFINED DOXYGEN_COMPACT_RTF) + set(DOXYGEN_COMPACT_RTF NO) +endif() +if(NOT DEFINED DOXYGEN_RTF_HYPERLINKS) + set(DOXYGEN_RTF_HYPERLINKS NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_MAN) + set(DOXYGEN_GENERATE_MAN NO) +endif() +if(NOT DEFINED DOXYGEN_MAN_OUTPUT) + set(DOXYGEN_MAN_OUTPUT man) +endif() +if(NOT DEFINED DOXYGEN_MAN_EXTENSION) + set(DOXYGEN_MAN_EXTENSION .3) +endif() +if(NOT DEFINED DOXYGEN_MAN_LINKS) + set(DOXYGEN_MAN_LINKS NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_XML) + set(DOXYGEN_GENERATE_XML NO) +endif() +if(NOT DEFINED DOXYGEN_XML_OUTPUT) + set(DOXYGEN_XML_OUTPUT xml) +endif() +if(NOT DEFINED DOXYGEN_XML_PROGRAMLISTING) + set(DOXYGEN_XML_PROGRAMLISTING YES) +endif() +if(NOT DEFINED DOXYGEN_XML_NS_MEMB_FILE_SCOPE) + set(DOXYGEN_XML_NS_MEMB_FILE_SCOPE NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_DOCBOOK) + set(DOXYGEN_GENERATE_DOCBOOK NO) +endif() +if(NOT DEFINED DOXYGEN_DOCBOOK_OUTPUT) + set(DOXYGEN_DOCBOOK_OUTPUT docbook) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_AUTOGEN_DEF) + set(DOXYGEN_GENERATE_AUTOGEN_DEF NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_SQLITE3) + set(DOXYGEN_GENERATE_SQLITE3 NO) +endif() +if(NOT DEFINED DOXYGEN_SQLITE3_OUTPUT) + set(DOXYGEN_SQLITE3_OUTPUT sqlite3) +endif() +if(NOT DEFINED DOXYGEN_SQLITE3_RECREATE_DB) + set(DOXYGEN_SQLITE3_RECREATE_DB YES) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_PERLMOD) + set(DOXYGEN_GENERATE_PERLMOD NO) +endif() +if(NOT DEFINED DOXYGEN_PERLMOD_LATEX) + set(DOXYGEN_PERLMOD_LATEX NO) +endif() +if(NOT DEFINED DOXYGEN_PERLMOD_PRETTY) + set(DOXYGEN_PERLMOD_PRETTY YES) +endif() +if(NOT DEFINED DOXYGEN_ENABLE_PREPROCESSING) + set(DOXYGEN_ENABLE_PREPROCESSING YES) +endif() +if(NOT DEFINED DOXYGEN_MACRO_EXPANSION) + set(DOXYGEN_MACRO_EXPANSION NO) +endif() +if(NOT DEFINED DOXYGEN_EXPAND_ONLY_PREDEF) + set(DOXYGEN_EXPAND_ONLY_PREDEF NO) +endif() +if(NOT DEFINED DOXYGEN_SEARCH_INCLUDES) + set(DOXYGEN_SEARCH_INCLUDES YES) +endif() +if(NOT DEFINED DOXYGEN_SKIP_FUNCTION_MACROS) + set(DOXYGEN_SKIP_FUNCTION_MACROS YES) +endif() +if(NOT DEFINED DOXYGEN_ALLEXTERNALS) + set(DOXYGEN_ALLEXTERNALS NO) +endif() +if(NOT DEFINED DOXYGEN_EXTERNAL_GROUPS) + set(DOXYGEN_EXTERNAL_GROUPS YES) +endif() +if(NOT DEFINED DOXYGEN_EXTERNAL_PAGES) + set(DOXYGEN_EXTERNAL_PAGES YES) +endif() +if(NOT DEFINED DOXYGEN_HIDE_UNDOC_RELATIONS) + set(DOXYGEN_HIDE_UNDOC_RELATIONS YES) +endif() +if(NOT DEFINED DOXYGEN_HAVE_DOT) + set(DOXYGEN_HAVE_DOT NO) +endif() +if(NOT DEFINED DOXYGEN_DOT_NUM_THREADS) + set(DOXYGEN_DOT_NUM_THREADS 0) +endif() +if(NOT DEFINED DOXYGEN_DOT_COMMON_ATTR) + set(DOXYGEN_DOT_COMMON_ATTR "fontname=Helvetica,fontsize=10") +endif() +if(NOT DEFINED DOXYGEN_DOT_EDGE_ATTR) + set(DOXYGEN_DOT_EDGE_ATTR "labelfontname=Helvetica,labelfontsize=10") +endif() +if(NOT DEFINED DOXYGEN_DOT_NODE_ATTR) + set(DOXYGEN_DOT_NODE_ATTR "shape=box,height=0.2,width=0.4") +endif() +if(NOT DEFINED DOXYGEN_CLASS_GRAPH) + set(DOXYGEN_CLASS_GRAPH YES) +endif() +if(NOT DEFINED DOXYGEN_COLLABORATION_GRAPH) + set(DOXYGEN_COLLABORATION_GRAPH YES) +endif() +if(NOT DEFINED DOXYGEN_GROUP_GRAPHS) + set(DOXYGEN_GROUP_GRAPHS YES) +endif() +if(NOT DEFINED DOXYGEN_UML_LOOK) + set(DOXYGEN_UML_LOOK NO) +endif() +if(NOT DEFINED DOXYGEN_UML_LIMIT_NUM_FIELDS) + set(DOXYGEN_UML_LIMIT_NUM_FIELDS 10) +endif() +if(NOT DEFINED DOXYGEN_UML_MAX_EDGE_LABELS) + set(DOXYGEN_UML_MAX_EDGE_LABELS 10) +endif() +if(NOT DEFINED DOXYGEN_DOT_UML_DETAILS) + set(DOXYGEN_DOT_UML_DETAILS NO) +endif() +if(NOT DEFINED DOXYGEN_DOT_WRAP_THRESHOLD) + set(DOXYGEN_DOT_WRAP_THRESHOLD 17) +endif() +if(NOT DEFINED DOXYGEN_TEMPLATE_RELATIONS) + set(DOXYGEN_TEMPLATE_RELATIONS NO) +endif() +if(NOT DEFINED DOXYGEN_INCLUDE_GRAPH) + set(DOXYGEN_INCLUDE_GRAPH YES) +endif() +if(NOT DEFINED DOXYGEN_INCLUDED_BY_GRAPH) + set(DOXYGEN_INCLUDED_BY_GRAPH YES) +endif() +if(NOT DEFINED DOXYGEN_CALL_GRAPH) + set(DOXYGEN_CALL_GRAPH NO) +endif() +if(NOT DEFINED DOXYGEN_CALLER_GRAPH) + set(DOXYGEN_CALLER_GRAPH NO) +endif() +if(NOT DEFINED DOXYGEN_GRAPHICAL_HIERARCHY) + set(DOXYGEN_GRAPHICAL_HIERARCHY YES) +endif() +if(NOT DEFINED DOXYGEN_DIRECTORY_GRAPH) + set(DOXYGEN_DIRECTORY_GRAPH YES) +endif() +if(NOT DEFINED DOXYGEN_DIR_GRAPH_MAX_DEPTH) + set(DOXYGEN_DIR_GRAPH_MAX_DEPTH 1) +endif() +if(NOT DEFINED DOXYGEN_DOT_IMAGE_FORMAT) + set(DOXYGEN_DOT_IMAGE_FORMAT png) +endif() +if(NOT DEFINED DOXYGEN_INTERACTIVE_SVG) + set(DOXYGEN_INTERACTIVE_SVG NO) +endif() +if(NOT DEFINED DOXYGEN_DOT_GRAPH_MAX_NODES) + set(DOXYGEN_DOT_GRAPH_MAX_NODES 50) +endif() +if(NOT DEFINED DOXYGEN_MAX_DOT_GRAPH_DEPTH) + set(DOXYGEN_MAX_DOT_GRAPH_DEPTH 0) +endif() +if(NOT DEFINED DOXYGEN_DOT_MULTI_TARGETS) + set(DOXYGEN_DOT_MULTI_TARGETS NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_LEGEND) + set(DOXYGEN_GENERATE_LEGEND YES) +endif() +if(NOT DEFINED DOXYGEN_DOT_CLEANUP) + set(DOXYGEN_DOT_CLEANUP YES) +endif() diff --git a/ktx/build/CMakeFiles/4.3.3/CMakeCCompiler.cmake b/ktx/build/CMakeFiles/4.3.3/CMakeCCompiler.cmake new file mode 100644 index 0000000..9a8a551 --- /dev/null +++ b/ktx/build/CMakeFiles/4.3.3/CMakeCCompiler.cmake @@ -0,0 +1,85 @@ +set(CMAKE_C_COMPILER "/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "GNU") +set(CMAKE_C_COMPILER_VERSION "16.1.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "23") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_COMPILER_APPLE_SYSROOT "") +set(CMAKE_C_SIMULATE_VERSION "") +set(CMAKE_C_COMPILER_ARCHITECTURE_ID "x86_64") + + + + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_C_COMPILER_AR "/usr/bin/gcc-ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_C_COMPILER_RANLIB "/usr/bin/gcc-ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/usr/bin/ld") +set(CMAKE_C_COMPILER_LINKER_ID "GNU") +set(CMAKE_C_COMPILER_LINKER_VERSION 2.46.0) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC 1) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED TRUE) +set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED TRUE) +set(CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED TRUE) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include;/usr/local/include;/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;gcc_s_asneeded;atomic_asneeded;c;gcc;gcc_s_asneeded") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1;/usr/lib;/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/ktx/build/CMakeFiles/4.3.3/CMakeCXXCompiler.cmake b/ktx/build/CMakeFiles/4.3.3/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..f701eb5 --- /dev/null +++ b/ktx/build/CMakeFiles/4.3.3/CMakeCXXCompiler.cmake @@ -0,0 +1,102 @@ +set(CMAKE_CXX_COMPILER "/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "16.1.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "20") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_COMPILER_APPLE_SYSROOT "") +set(CMAKE_CXX_SIMULATE_VERSION "") +set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "x86_64") + + + + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_CXX_COMPILER_AR "/usr/bin/gcc-ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/usr/bin/gcc-ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/usr/bin/ld") +set(CMAKE_CXX_COMPILER_LINKER_ID "GNU") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 2.46.0) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED TRUE) +set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED TRUE) +set(CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED TRUE) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/usr/include/c++/16.1.1;/usr/include/c++/16.1.1/x86_64-pc-linux-gnu;/usr/include/c++/16.1.1/backward;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include;/usr/local/include;/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;gcc_s;gcc;atomic_asneeded;c;gcc_s;gcc") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1;/usr/lib;/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +set(CMAKE_CXX_COMPILER_IMPORT_STD_ERROR_MESSAGE "Unsupported generator: Unix Makefiles") +set(CMAKE_CXX_STDLIB_MODULES_JSON "") diff --git a/ktx/build/CMakeFiles/4.3.3/CMakeDetermineCompilerABI_C.bin b/ktx/build/CMakeFiles/4.3.3/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..8404b88 Binary files /dev/null and b/ktx/build/CMakeFiles/4.3.3/CMakeDetermineCompilerABI_C.bin differ diff --git a/ktx/build/CMakeFiles/4.3.3/CMakeDetermineCompilerABI_CXX.bin b/ktx/build/CMakeFiles/4.3.3/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..8c9df67 Binary files /dev/null and b/ktx/build/CMakeFiles/4.3.3/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/ktx/build/CMakeFiles/4.3.3/CMakeSystem.cmake b/ktx/build/CMakeFiles/4.3.3/CMakeSystem.cmake new file mode 100644 index 0000000..20d7d55 --- /dev/null +++ b/ktx/build/CMakeFiles/4.3.3/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-7.0.12-arch1-1") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "7.0.12-arch1-1") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Linux-7.0.12-arch1-1") +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_VERSION "7.0.12-arch1-1") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/ktx/build/CMakeFiles/4.3.3/CompilerIdC/CMakeCCompilerId.c b/ktx/build/CMakeFiles/4.3.3/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..ab3c359 --- /dev/null +++ b/ktx/build/CMakeFiles/4.3.3/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,934 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__RENESAS__) +# define COMPILER_ID "Renesas" +/* __RENESAS_VERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__RENESAS_VERSION__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR HEX(__RENESAS_VERSION__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__RENESAS_VERSION__ >> 8 & 0xFF) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__DCC__) && defined(_DIAB_TOOL) +# define COMPILER_ID "Diab" + # define COMPILER_VERSION_MAJOR DEC(__VERSION_MAJOR_NUMBER__) + # define COMPILER_VERSION_MINOR DEC(__VERSION_MINOR_NUMBER__) + # define COMPILER_VERSION_PATCH DEC(__VERSION_ARCH_FEATURE_NUMBER__) + # define COMPILER_VERSION_TWEAK DEC(__VERSION_BUG_FIX_NUMBER__) + + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "ARM" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) || defined(__CPARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__RENESAS__) +# if defined(__CCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__CCRL__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__CCRH__) +# define ARCHITECTURE_ID "RH850" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) && !defined(__RENESAS__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__) || defined(__RENESAS__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#if defined(COMPILER_VERSION_INTERNAL) || defined(COMPILER_VERSION_INTERNAL_STR) + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/ktx/build/CMakeFiles/4.3.3/CompilerIdC/a.out b/ktx/build/CMakeFiles/4.3.3/CompilerIdC/a.out new file mode 100755 index 0000000..a1d3aee Binary files /dev/null and b/ktx/build/CMakeFiles/4.3.3/CompilerIdC/a.out differ diff --git a/ktx/build/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp b/ktx/build/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..b35f567 --- /dev/null +++ b/ktx/build/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,949 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__RENESAS__) +# define COMPILER_ID "Renesas" +/* __RENESAS_VERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__RENESAS_VERSION__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR HEX(__RENESAS_VERSION__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__RENESAS_VERSION__ >> 8 & 0xFF) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__DCC__) && defined(_DIAB_TOOL) +# define COMPILER_ID "Diab" + # define COMPILER_VERSION_MAJOR DEC(__VERSION_MAJOR_NUMBER__) + # define COMPILER_VERSION_MINOR DEC(__VERSION_MINOR_NUMBER__) + # define COMPILER_VERSION_PATCH DEC(__VERSION_ARCH_FEATURE_NUMBER__) + # define COMPILER_VERSION_TWEAK DEC(__VERSION_BUG_FIX_NUMBER__) + + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "ARM" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) || defined(__CPARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__RENESAS__) +# if defined(__CCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__CCRL__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__CCRH__) +# define ARCHITECTURE_ID "RH850" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__) || defined(__RENESAS__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#if defined(COMPILER_VERSION_INTERNAL) || defined(COMPILER_VERSION_INTERNAL_STR) + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/ktx/build/CMakeFiles/4.3.3/CompilerIdCXX/a.out b/ktx/build/CMakeFiles/4.3.3/CompilerIdCXX/a.out new file mode 100755 index 0000000..99396c1 Binary files /dev/null and b/ktx/build/CMakeFiles/4.3.3/CompilerIdCXX/a.out differ diff --git a/ktx/build/CMakeFiles/CMakeConfigureLog.yaml b/ktx/build/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..197cf9b --- /dev/null +++ b/ktx/build/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,8879 @@ + +--- +events: + - + kind: "find-v1" + backtrace: + - "cmake/modules/FindBash.cmake:54 (find_program)" + - "CMakeLists.txt:11 (find_package)" + mode: "program" + variable: "BASH_EXECUTABLE" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "bash" + candidate_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/" + - "C:/Program Files/Git/bin/" + searched_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/bash" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/bash" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bash" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/bash" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/bash" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bash" + - "C:/Program Files/Git/bin/bash" + found: false + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "cmake/modules/FindBash.cmake:65 (find_program)" + - "CMakeLists.txt:11 (find_package)" + mode: "program" + variable: "BASH_EXECUTABLE" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "bash" + candidate_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + searched_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/bash" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/bash" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bash" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/bash" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/bash" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bash" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/bash" + - "/home/abdelrahman/Sources/bazecor/bash" + - "/home/abdelrahman/Sources/bundletool/bash" + - "/home/abdelrahman/.yarn/bin/bash" + - "/home/abdelrahman/.cargo/bin/bash" + - "/home/abdelrahman/Sources/AndroidStudio/bin/bash" + - "/home/abdelrahman/Sources/deckboard/bash" + - "/home/abdelrahman/Sources/netbeans/bin/bash" + - "/home/abdelrahman/Sources/bin/bash" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/bash" + - "/home/abdelrahman/Sources/ffmpeg_static/bash" + - "/home/abdelrahman/.emacs.d/bin/bash" + - "/home/abdelrahman/cdtdebugger/bash" + - "/home/abdelrahman/Sources/robo3t/bin/bash" + - "/home/abdelrahman/Sources/armorpaint/bash" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/bash" + - "/home/abdelrahman/Sources/shell_scripts/bash" + - "/usr/local/go/bin/bash" + - "/opt/ArgyllCMS/bin/bash" + - "/opt/gaffer/bin/bash" + - "/home/abdelrahman/Sources/blender/latest/bash" + - "/home/abdelrahman/Sources/REAPER/bash" + - "/opt/resolve/bin/bash" + - "/home/abdelrahman/.opencode/bin/bash" + - "/home/abdelrahman/.fzf/bin/bash" + - "/home/abdelrahman/.local/share/nvim/mason/bin/bash" + - "/usr/local/sbin/bash" + - "/usr/local/bin/bash" + found: "/usr/bin/bash" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/FindGit.cmake:111 (find_program)" + - "cmake/version.cmake:29 (find_package)" + - "cmake/version.cmake:114 (git_describe_raw)" + - "CMakeLists.txt:13 (include)" + mode: "program" + variable: "GIT_EXECUTABLE" + description: "Git command line client" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "git" + candidate_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + searched_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/git" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/git" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/git" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/git" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/git" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/git" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/git" + - "/home/abdelrahman/Sources/bazecor/git" + - "/home/abdelrahman/Sources/bundletool/git" + - "/home/abdelrahman/.yarn/bin/git" + - "/home/abdelrahman/.cargo/bin/git" + - "/home/abdelrahman/Sources/AndroidStudio/bin/git" + - "/home/abdelrahman/Sources/deckboard/git" + - "/home/abdelrahman/Sources/netbeans/bin/git" + - "/home/abdelrahman/Sources/bin/git" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/git" + - "/home/abdelrahman/Sources/ffmpeg_static/git" + - "/home/abdelrahman/.emacs.d/bin/git" + - "/home/abdelrahman/cdtdebugger/git" + - "/home/abdelrahman/Sources/robo3t/bin/git" + - "/home/abdelrahman/Sources/armorpaint/git" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/git" + - "/home/abdelrahman/Sources/shell_scripts/git" + - "/usr/local/go/bin/git" + - "/opt/ArgyllCMS/bin/git" + - "/opt/gaffer/bin/git" + - "/home/abdelrahman/Sources/blender/latest/git" + - "/home/abdelrahman/Sources/REAPER/git" + - "/opt/resolve/bin/git" + - "/home/abdelrahman/.opencode/bin/git" + - "/home/abdelrahman/.fzf/bin/git" + - "/home/abdelrahman/.local/share/nvim/mason/bin/git" + - "/usr/local/sbin/git" + - "/usr/local/bin/git" + found: "/usr/bin/git" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineSystem.cmake:12 (find_program)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_UNAME" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "uname" + candidate_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + - "/bin/" + searched_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/uname" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/uname" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/uname" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/uname" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/uname" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/uname" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/uname" + - "/home/abdelrahman/Sources/bazecor/uname" + - "/home/abdelrahman/Sources/bundletool/uname" + - "/home/abdelrahman/.yarn/bin/uname" + - "/home/abdelrahman/.cargo/bin/uname" + - "/home/abdelrahman/Sources/AndroidStudio/bin/uname" + - "/home/abdelrahman/Sources/deckboard/uname" + - "/home/abdelrahman/Sources/netbeans/bin/uname" + - "/home/abdelrahman/Sources/bin/uname" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/uname" + - "/home/abdelrahman/Sources/ffmpeg_static/uname" + - "/home/abdelrahman/.emacs.d/bin/uname" + - "/home/abdelrahman/cdtdebugger/uname" + - "/home/abdelrahman/Sources/robo3t/bin/uname" + - "/home/abdelrahman/Sources/armorpaint/uname" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/uname" + - "/home/abdelrahman/Sources/shell_scripts/uname" + - "/usr/local/go/bin/uname" + - "/opt/ArgyllCMS/bin/uname" + - "/opt/gaffer/bin/uname" + - "/home/abdelrahman/Sources/blender/latest/uname" + - "/home/abdelrahman/Sources/REAPER/uname" + - "/opt/resolve/bin/uname" + - "/home/abdelrahman/.opencode/bin/uname" + - "/home/abdelrahman/.fzf/bin/uname" + - "/home/abdelrahman/.local/share/nvim/mason/bin/uname" + - "/usr/local/sbin/uname" + - "/usr/local/bin/uname" + found: "/usr/bin/uname" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineSystem.cmake:212 (message)" + - "CMakeLists.txt:203 (project)" + message: | + The system is: Linux - 7.0.12-arch1-1 - x86_64 + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeUnixFindMake.cmake:5 (find_program)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_MAKE_PROGRAM" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "gmake" + - "make" + - "smake" + candidate_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + searched_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gmake" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/gmake" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/gmake" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/gmake" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/gmake" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/gmake" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gmake" + - "/home/abdelrahman/Sources/bazecor/gmake" + - "/home/abdelrahman/Sources/bundletool/gmake" + - "/home/abdelrahman/.yarn/bin/gmake" + - "/home/abdelrahman/.cargo/bin/gmake" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gmake" + - "/home/abdelrahman/Sources/deckboard/gmake" + - "/home/abdelrahman/Sources/netbeans/bin/gmake" + - "/home/abdelrahman/Sources/bin/gmake" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gmake" + - "/home/abdelrahman/Sources/ffmpeg_static/gmake" + - "/home/abdelrahman/.emacs.d/bin/gmake" + - "/home/abdelrahman/cdtdebugger/gmake" + - "/home/abdelrahman/Sources/robo3t/bin/gmake" + - "/home/abdelrahman/Sources/armorpaint/gmake" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gmake" + - "/home/abdelrahman/Sources/shell_scripts/gmake" + - "/usr/local/go/bin/gmake" + - "/opt/ArgyllCMS/bin/gmake" + - "/opt/gaffer/bin/gmake" + - "/home/abdelrahman/Sources/blender/latest/gmake" + - "/home/abdelrahman/Sources/REAPER/gmake" + - "/opt/resolve/bin/gmake" + - "/home/abdelrahman/.opencode/bin/gmake" + - "/home/abdelrahman/.fzf/bin/gmake" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gmake" + - "/usr/local/sbin/gmake" + - "/usr/local/bin/gmake" + - "/usr/bin/gmake" + - "/var/lib/flatpak/exports/bin/gmake" + - "/usr/lib/jvm/default/bin/gmake" + - "/usr/bin/site_perl/gmake" + - "/usr/bin/vendor_perl/gmake" + - "/usr/bin/core_perl/gmake" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gmake" + - "/home/abdelrahman/.local/bin/gmake" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/make" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/make" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/make" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/make" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/make" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/make" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/make" + - "/home/abdelrahman/Sources/bazecor/make" + - "/home/abdelrahman/Sources/bundletool/make" + - "/home/abdelrahman/.yarn/bin/make" + - "/home/abdelrahman/.cargo/bin/make" + - "/home/abdelrahman/Sources/AndroidStudio/bin/make" + - "/home/abdelrahman/Sources/deckboard/make" + - "/home/abdelrahman/Sources/netbeans/bin/make" + - "/home/abdelrahman/Sources/bin/make" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/make" + - "/home/abdelrahman/Sources/ffmpeg_static/make" + - "/home/abdelrahman/.emacs.d/bin/make" + - "/home/abdelrahman/cdtdebugger/make" + - "/home/abdelrahman/Sources/robo3t/bin/make" + - "/home/abdelrahman/Sources/armorpaint/make" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/make" + - "/home/abdelrahman/Sources/shell_scripts/make" + - "/usr/local/go/bin/make" + - "/opt/ArgyllCMS/bin/make" + - "/opt/gaffer/bin/make" + - "/home/abdelrahman/Sources/blender/latest/make" + - "/home/abdelrahman/Sources/REAPER/make" + - "/opt/resolve/bin/make" + - "/home/abdelrahman/.opencode/bin/make" + - "/home/abdelrahman/.fzf/bin/make" + - "/home/abdelrahman/.local/share/nvim/mason/bin/make" + - "/usr/local/sbin/make" + - "/usr/local/bin/make" + found: "/usr/bin/make" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompiler.cmake:73 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:64 (_cmake_find_compiler)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_C_COMPILER" + description: "C compiler" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "cc" + - "gcc" + - "cl" + - "bcc" + - "xlc" + - "icx" + - "clang" + candidate_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + searched_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/cc" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/cc" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/cc" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/cc" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/cc" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/cc" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/cc" + - "/home/abdelrahman/Sources/bazecor/cc" + - "/home/abdelrahman/Sources/bundletool/cc" + - "/home/abdelrahman/.yarn/bin/cc" + - "/home/abdelrahman/.cargo/bin/cc" + - "/home/abdelrahman/Sources/AndroidStudio/bin/cc" + - "/home/abdelrahman/Sources/deckboard/cc" + - "/home/abdelrahman/Sources/netbeans/bin/cc" + - "/home/abdelrahman/Sources/bin/cc" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/cc" + - "/home/abdelrahman/Sources/ffmpeg_static/cc" + - "/home/abdelrahman/.emacs.d/bin/cc" + - "/home/abdelrahman/cdtdebugger/cc" + - "/home/abdelrahman/Sources/robo3t/bin/cc" + - "/home/abdelrahman/Sources/armorpaint/cc" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/cc" + - "/home/abdelrahman/Sources/shell_scripts/cc" + - "/usr/local/go/bin/cc" + - "/opt/ArgyllCMS/bin/cc" + - "/opt/gaffer/bin/cc" + - "/home/abdelrahman/Sources/blender/latest/cc" + - "/home/abdelrahman/Sources/REAPER/cc" + - "/opt/resolve/bin/cc" + - "/home/abdelrahman/.opencode/bin/cc" + - "/home/abdelrahman/.fzf/bin/cc" + - "/home/abdelrahman/.local/share/nvim/mason/bin/cc" + - "/usr/local/sbin/cc" + - "/usr/local/bin/cc" + found: "/usr/bin/cc" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:468 (find_file)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:506 (CMAKE_DETERMINE_COMPILER_ID_WRITE)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:8 (CMAKE_DETERMINE_COMPILER_ID_BUILD)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:122 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:203 (project)" + mode: "file" + variable: "src_in" + description: "Path to a file." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "CMakeCCompilerId.c.in" + candidate_directories: + - "/usr/share/cmake/Modules/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/modules/" + found: "/usr/share/cmake/Modules/CMakeCCompilerId.c.in" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:122 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:203 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /usr/bin/cc + Build flags: + Id flags: + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" + + The C compiler identification is GNU, found in: + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/4.3.3/CompilerIdC/a.out + + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:200 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_AR" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "ar" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + found: "/usr/bin/ar" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:200 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_RANLIB" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "ranlib" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + found: "/usr/bin/ranlib" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:200 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_STRIP" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "strip" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + found: "/usr/bin/strip" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:200 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_LINKER" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "ld" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + found: "/usr/bin/ld" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:200 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_NM" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "nm" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + found: "/usr/bin/nm" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:200 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_OBJDUMP" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "objdump" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + found: "/usr/bin/objdump" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:200 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_OBJCOPY" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "objcopy" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + found: "/usr/bin/objcopy" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:200 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_READELF" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "readelf" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + found: "/usr/bin/readelf" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:200 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_DLLTOOL" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "dlltool" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + searched_directories: + - "/usr/bin/dlltool" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/dlltool" + - "/home/abdelrahman/Sources/bazecor/dlltool" + - "/home/abdelrahman/Sources/bundletool/dlltool" + - "/home/abdelrahman/.yarn/bin/dlltool" + - "/home/abdelrahman/.cargo/bin/dlltool" + - "/home/abdelrahman/Sources/AndroidStudio/bin/dlltool" + - "/home/abdelrahman/Sources/deckboard/dlltool" + - "/home/abdelrahman/Sources/netbeans/bin/dlltool" + - "/home/abdelrahman/Sources/bin/dlltool" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/dlltool" + - "/home/abdelrahman/Sources/ffmpeg_static/dlltool" + - "/home/abdelrahman/.emacs.d/bin/dlltool" + - "/home/abdelrahman/cdtdebugger/dlltool" + - "/home/abdelrahman/Sources/robo3t/bin/dlltool" + - "/home/abdelrahman/Sources/armorpaint/dlltool" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/dlltool" + - "/home/abdelrahman/Sources/shell_scripts/dlltool" + - "/usr/local/go/bin/dlltool" + - "/opt/ArgyllCMS/bin/dlltool" + - "/opt/gaffer/bin/dlltool" + - "/home/abdelrahman/Sources/blender/latest/dlltool" + - "/home/abdelrahman/Sources/REAPER/dlltool" + - "/opt/resolve/bin/dlltool" + - "/home/abdelrahman/.opencode/bin/dlltool" + - "/home/abdelrahman/.fzf/bin/dlltool" + - "/home/abdelrahman/.local/share/nvim/mason/bin/dlltool" + - "/usr/local/sbin/dlltool" + - "/usr/local/bin/dlltool" + - "/var/lib/flatpak/exports/bin/dlltool" + - "/usr/lib/jvm/default/bin/dlltool" + - "/usr/bin/site_perl/dlltool" + - "/usr/bin/vendor_perl/dlltool" + - "/usr/bin/core_perl/dlltool" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/dlltool" + - "/home/abdelrahman/.local/bin/dlltool" + found: false + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:200 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_ADDR2LINE" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "addr2line" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + found: "/usr/bin/addr2line" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:200 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_TAPI" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "tapi" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + searched_directories: + - "/usr/bin/tapi" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/tapi" + - "/home/abdelrahman/Sources/bazecor/tapi" + - "/home/abdelrahman/Sources/bundletool/tapi" + - "/home/abdelrahman/.yarn/bin/tapi" + - "/home/abdelrahman/.cargo/bin/tapi" + - "/home/abdelrahman/Sources/AndroidStudio/bin/tapi" + - "/home/abdelrahman/Sources/deckboard/tapi" + - "/home/abdelrahman/Sources/netbeans/bin/tapi" + - "/home/abdelrahman/Sources/bin/tapi" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/tapi" + - "/home/abdelrahman/Sources/ffmpeg_static/tapi" + - "/home/abdelrahman/.emacs.d/bin/tapi" + - "/home/abdelrahman/cdtdebugger/tapi" + - "/home/abdelrahman/Sources/robo3t/bin/tapi" + - "/home/abdelrahman/Sources/armorpaint/tapi" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/tapi" + - "/home/abdelrahman/Sources/shell_scripts/tapi" + - "/usr/local/go/bin/tapi" + - "/opt/ArgyllCMS/bin/tapi" + - "/opt/gaffer/bin/tapi" + - "/home/abdelrahman/Sources/blender/latest/tapi" + - "/home/abdelrahman/Sources/REAPER/tapi" + - "/opt/resolve/bin/tapi" + - "/home/abdelrahman/.opencode/bin/tapi" + - "/home/abdelrahman/.fzf/bin/tapi" + - "/home/abdelrahman/.local/share/nvim/mason/bin/tapi" + - "/usr/local/sbin/tapi" + - "/usr/local/bin/tapi" + - "/var/lib/flatpak/exports/bin/tapi" + - "/usr/lib/jvm/default/bin/tapi" + - "/usr/bin/site_perl/tapi" + - "/usr/bin/vendor_perl/tapi" + - "/usr/bin/core_perl/tapi" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/tapi" + - "/home/abdelrahman/.local/bin/tapi" + found: false + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/Compiler/GNU-FindBinUtils.cmake:18 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:201 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_C_COMPILER_AR" + description: "A wrapper around 'ar' adding the appropriate '--plugin' option for the GCC compiler" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "gcc-ar-16.1" + - "gcc-ar-16" + - "gcc-ar16" + - "gcc-ar" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + searched_directories: + - "/usr/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/bazecor/gcc-ar-16.1" + - "/home/abdelrahman/Sources/bundletool/gcc-ar-16.1" + - "/home/abdelrahman/.yarn/bin/gcc-ar-16.1" + - "/home/abdelrahman/.cargo/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/deckboard/gcc-ar-16.1" + - "/home/abdelrahman/Sources/netbeans/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcc-ar-16.1" + - "/home/abdelrahman/Sources/ffmpeg_static/gcc-ar-16.1" + - "/home/abdelrahman/.emacs.d/bin/gcc-ar-16.1" + - "/home/abdelrahman/cdtdebugger/gcc-ar-16.1" + - "/home/abdelrahman/Sources/robo3t/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/armorpaint/gcc-ar-16.1" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcc-ar-16.1" + - "/home/abdelrahman/Sources/shell_scripts/gcc-ar-16.1" + - "/usr/local/go/bin/gcc-ar-16.1" + - "/opt/ArgyllCMS/bin/gcc-ar-16.1" + - "/opt/gaffer/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/blender/latest/gcc-ar-16.1" + - "/home/abdelrahman/Sources/REAPER/gcc-ar-16.1" + - "/opt/resolve/bin/gcc-ar-16.1" + - "/home/abdelrahman/.opencode/bin/gcc-ar-16.1" + - "/home/abdelrahman/.fzf/bin/gcc-ar-16.1" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcc-ar-16.1" + - "/usr/local/sbin/gcc-ar-16.1" + - "/usr/local/bin/gcc-ar-16.1" + - "/var/lib/flatpak/exports/bin/gcc-ar-16.1" + - "/usr/lib/jvm/default/bin/gcc-ar-16.1" + - "/usr/bin/site_perl/gcc-ar-16.1" + - "/usr/bin/vendor_perl/gcc-ar-16.1" + - "/usr/bin/core_perl/gcc-ar-16.1" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gcc-ar-16.1" + - "/home/abdelrahman/.local/bin/gcc-ar-16.1" + - "/usr/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/bazecor/gcc-ar-16" + - "/home/abdelrahman/Sources/bundletool/gcc-ar-16" + - "/home/abdelrahman/.yarn/bin/gcc-ar-16" + - "/home/abdelrahman/.cargo/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/deckboard/gcc-ar-16" + - "/home/abdelrahman/Sources/netbeans/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcc-ar-16" + - "/home/abdelrahman/Sources/ffmpeg_static/gcc-ar-16" + - "/home/abdelrahman/.emacs.d/bin/gcc-ar-16" + - "/home/abdelrahman/cdtdebugger/gcc-ar-16" + - "/home/abdelrahman/Sources/robo3t/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/armorpaint/gcc-ar-16" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcc-ar-16" + - "/home/abdelrahman/Sources/shell_scripts/gcc-ar-16" + - "/usr/local/go/bin/gcc-ar-16" + - "/opt/ArgyllCMS/bin/gcc-ar-16" + - "/opt/gaffer/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/blender/latest/gcc-ar-16" + - "/home/abdelrahman/Sources/REAPER/gcc-ar-16" + - "/opt/resolve/bin/gcc-ar-16" + - "/home/abdelrahman/.opencode/bin/gcc-ar-16" + - "/home/abdelrahman/.fzf/bin/gcc-ar-16" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcc-ar-16" + - "/usr/local/sbin/gcc-ar-16" + - "/usr/local/bin/gcc-ar-16" + - "/var/lib/flatpak/exports/bin/gcc-ar-16" + - "/usr/lib/jvm/default/bin/gcc-ar-16" + - "/usr/bin/site_perl/gcc-ar-16" + - "/usr/bin/vendor_perl/gcc-ar-16" + - "/usr/bin/core_perl/gcc-ar-16" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gcc-ar-16" + - "/home/abdelrahman/.local/bin/gcc-ar-16" + - "/usr/bin/gcc-ar16" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcc-ar16" + - "/home/abdelrahman/Sources/bazecor/gcc-ar16" + - "/home/abdelrahman/Sources/bundletool/gcc-ar16" + - "/home/abdelrahman/.yarn/bin/gcc-ar16" + - "/home/abdelrahman/.cargo/bin/gcc-ar16" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcc-ar16" + - "/home/abdelrahman/Sources/deckboard/gcc-ar16" + - "/home/abdelrahman/Sources/netbeans/bin/gcc-ar16" + - "/home/abdelrahman/Sources/bin/gcc-ar16" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcc-ar16" + - "/home/abdelrahman/Sources/ffmpeg_static/gcc-ar16" + - "/home/abdelrahman/.emacs.d/bin/gcc-ar16" + - "/home/abdelrahman/cdtdebugger/gcc-ar16" + - "/home/abdelrahman/Sources/robo3t/bin/gcc-ar16" + - "/home/abdelrahman/Sources/armorpaint/gcc-ar16" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcc-ar16" + - "/home/abdelrahman/Sources/shell_scripts/gcc-ar16" + - "/usr/local/go/bin/gcc-ar16" + - "/opt/ArgyllCMS/bin/gcc-ar16" + - "/opt/gaffer/bin/gcc-ar16" + - "/home/abdelrahman/Sources/blender/latest/gcc-ar16" + - "/home/abdelrahman/Sources/REAPER/gcc-ar16" + - "/opt/resolve/bin/gcc-ar16" + - "/home/abdelrahman/.opencode/bin/gcc-ar16" + - "/home/abdelrahman/.fzf/bin/gcc-ar16" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcc-ar16" + - "/usr/local/sbin/gcc-ar16" + - "/usr/local/bin/gcc-ar16" + - "/var/lib/flatpak/exports/bin/gcc-ar16" + - "/usr/lib/jvm/default/bin/gcc-ar16" + - "/usr/bin/site_perl/gcc-ar16" + - "/usr/bin/vendor_perl/gcc-ar16" + - "/usr/bin/core_perl/gcc-ar16" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gcc-ar16" + - "/home/abdelrahman/.local/bin/gcc-ar16" + found: "/usr/bin/gcc-ar" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/Compiler/GNU-FindBinUtils.cmake:30 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCCompiler.cmake:201 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_C_COMPILER_RANLIB" + description: "A wrapper around 'ranlib' adding the appropriate '--plugin' option for the GCC compiler" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "gcc-ranlib-16.1" + - "gcc-ranlib-16" + - "gcc-ranlib16" + - "gcc-ranlib" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + searched_directories: + - "/usr/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/bazecor/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/bundletool/gcc-ranlib-16.1" + - "/home/abdelrahman/.yarn/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/.cargo/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/deckboard/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/netbeans/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/ffmpeg_static/gcc-ranlib-16.1" + - "/home/abdelrahman/.emacs.d/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/cdtdebugger/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/robo3t/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/armorpaint/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/shell_scripts/gcc-ranlib-16.1" + - "/usr/local/go/bin/gcc-ranlib-16.1" + - "/opt/ArgyllCMS/bin/gcc-ranlib-16.1" + - "/opt/gaffer/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/blender/latest/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/REAPER/gcc-ranlib-16.1" + - "/opt/resolve/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/.opencode/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/.fzf/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcc-ranlib-16.1" + - "/usr/local/sbin/gcc-ranlib-16.1" + - "/usr/local/bin/gcc-ranlib-16.1" + - "/var/lib/flatpak/exports/bin/gcc-ranlib-16.1" + - "/usr/lib/jvm/default/bin/gcc-ranlib-16.1" + - "/usr/bin/site_perl/gcc-ranlib-16.1" + - "/usr/bin/vendor_perl/gcc-ranlib-16.1" + - "/usr/bin/core_perl/gcc-ranlib-16.1" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gcc-ranlib-16.1" + - "/home/abdelrahman/.local/bin/gcc-ranlib-16.1" + - "/usr/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/bazecor/gcc-ranlib-16" + - "/home/abdelrahman/Sources/bundletool/gcc-ranlib-16" + - "/home/abdelrahman/.yarn/bin/gcc-ranlib-16" + - "/home/abdelrahman/.cargo/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/deckboard/gcc-ranlib-16" + - "/home/abdelrahman/Sources/netbeans/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcc-ranlib-16" + - "/home/abdelrahman/Sources/ffmpeg_static/gcc-ranlib-16" + - "/home/abdelrahman/.emacs.d/bin/gcc-ranlib-16" + - "/home/abdelrahman/cdtdebugger/gcc-ranlib-16" + - "/home/abdelrahman/Sources/robo3t/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/armorpaint/gcc-ranlib-16" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcc-ranlib-16" + - "/home/abdelrahman/Sources/shell_scripts/gcc-ranlib-16" + - "/usr/local/go/bin/gcc-ranlib-16" + - "/opt/ArgyllCMS/bin/gcc-ranlib-16" + - "/opt/gaffer/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/blender/latest/gcc-ranlib-16" + - "/home/abdelrahman/Sources/REAPER/gcc-ranlib-16" + - "/opt/resolve/bin/gcc-ranlib-16" + - "/home/abdelrahman/.opencode/bin/gcc-ranlib-16" + - "/home/abdelrahman/.fzf/bin/gcc-ranlib-16" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcc-ranlib-16" + - "/usr/local/sbin/gcc-ranlib-16" + - "/usr/local/bin/gcc-ranlib-16" + - "/var/lib/flatpak/exports/bin/gcc-ranlib-16" + - "/usr/lib/jvm/default/bin/gcc-ranlib-16" + - "/usr/bin/site_perl/gcc-ranlib-16" + - "/usr/bin/vendor_perl/gcc-ranlib-16" + - "/usr/bin/core_perl/gcc-ranlib-16" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gcc-ranlib-16" + - "/home/abdelrahman/.local/bin/gcc-ranlib-16" + - "/usr/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/bazecor/gcc-ranlib16" + - "/home/abdelrahman/Sources/bundletool/gcc-ranlib16" + - "/home/abdelrahman/.yarn/bin/gcc-ranlib16" + - "/home/abdelrahman/.cargo/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/deckboard/gcc-ranlib16" + - "/home/abdelrahman/Sources/netbeans/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcc-ranlib16" + - "/home/abdelrahman/Sources/ffmpeg_static/gcc-ranlib16" + - "/home/abdelrahman/.emacs.d/bin/gcc-ranlib16" + - "/home/abdelrahman/cdtdebugger/gcc-ranlib16" + - "/home/abdelrahman/Sources/robo3t/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/armorpaint/gcc-ranlib16" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcc-ranlib16" + - "/home/abdelrahman/Sources/shell_scripts/gcc-ranlib16" + - "/usr/local/go/bin/gcc-ranlib16" + - "/opt/ArgyllCMS/bin/gcc-ranlib16" + - "/opt/gaffer/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/blender/latest/gcc-ranlib16" + - "/home/abdelrahman/Sources/REAPER/gcc-ranlib16" + - "/opt/resolve/bin/gcc-ranlib16" + - "/home/abdelrahman/.opencode/bin/gcc-ranlib16" + - "/home/abdelrahman/.fzf/bin/gcc-ranlib16" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcc-ranlib16" + - "/usr/local/sbin/gcc-ranlib16" + - "/usr/local/bin/gcc-ranlib16" + - "/var/lib/flatpak/exports/bin/gcc-ranlib16" + - "/usr/lib/jvm/default/bin/gcc-ranlib16" + - "/usr/bin/site_perl/gcc-ranlib16" + - "/usr/bin/vendor_perl/gcc-ranlib16" + - "/usr/bin/core_perl/gcc-ranlib16" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gcc-ranlib16" + - "/home/abdelrahman/.local/bin/gcc-ranlib16" + found: "/usr/bin/gcc-ranlib" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompiler.cmake:54 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:69 (_cmake_find_compiler)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_CXX_COMPILER" + description: "CXX compiler" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "c++" + - "CC" + - "g++" + - "aCC" + - "cl" + - "bcc" + - "xlC" + - "icpx" + - "icx" + - "clang++" + candidate_directories: + - "/usr/bin/" + found: "/usr/bin/c++" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:468 (find_file)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:506 (CMAKE_DETERMINE_COMPILER_ID_WRITE)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:8 (CMAKE_DETERMINE_COMPILER_ID_BUILD)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:125 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:203 (project)" + mode: "file" + variable: "src_in" + description: "Path to a file." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "CMakeCXXCompilerId.cpp.in" + candidate_directories: + - "/usr/share/cmake/Modules/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/modules/" + found: "/usr/share/cmake/Modules/CMakeCXXCompilerId.cpp.in" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:125 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:203 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /usr/bin/c++ + Build flags: -msse4.1 + Id flags: + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + + The CXX compiler identification is GNU, found in: + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/4.3.3/CompilerIdCXX/a.out + + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/Compiler/GNU-FindBinUtils.cmake:18 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:207 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_CXX_COMPILER_AR" + description: "A wrapper around 'ar' adding the appropriate '--plugin' option for the GCC compiler" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "gcc-ar-16.1" + - "gcc-ar-16" + - "gcc-ar16" + - "gcc-ar" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + searched_directories: + - "/usr/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/bazecor/gcc-ar-16.1" + - "/home/abdelrahman/Sources/bundletool/gcc-ar-16.1" + - "/home/abdelrahman/.yarn/bin/gcc-ar-16.1" + - "/home/abdelrahman/.cargo/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/deckboard/gcc-ar-16.1" + - "/home/abdelrahman/Sources/netbeans/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcc-ar-16.1" + - "/home/abdelrahman/Sources/ffmpeg_static/gcc-ar-16.1" + - "/home/abdelrahman/.emacs.d/bin/gcc-ar-16.1" + - "/home/abdelrahman/cdtdebugger/gcc-ar-16.1" + - "/home/abdelrahman/Sources/robo3t/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/armorpaint/gcc-ar-16.1" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcc-ar-16.1" + - "/home/abdelrahman/Sources/shell_scripts/gcc-ar-16.1" + - "/usr/local/go/bin/gcc-ar-16.1" + - "/opt/ArgyllCMS/bin/gcc-ar-16.1" + - "/opt/gaffer/bin/gcc-ar-16.1" + - "/home/abdelrahman/Sources/blender/latest/gcc-ar-16.1" + - "/home/abdelrahman/Sources/REAPER/gcc-ar-16.1" + - "/opt/resolve/bin/gcc-ar-16.1" + - "/home/abdelrahman/.opencode/bin/gcc-ar-16.1" + - "/home/abdelrahman/.fzf/bin/gcc-ar-16.1" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcc-ar-16.1" + - "/usr/local/sbin/gcc-ar-16.1" + - "/usr/local/bin/gcc-ar-16.1" + - "/var/lib/flatpak/exports/bin/gcc-ar-16.1" + - "/usr/lib/jvm/default/bin/gcc-ar-16.1" + - "/usr/bin/site_perl/gcc-ar-16.1" + - "/usr/bin/vendor_perl/gcc-ar-16.1" + - "/usr/bin/core_perl/gcc-ar-16.1" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gcc-ar-16.1" + - "/home/abdelrahman/.local/bin/gcc-ar-16.1" + - "/usr/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/bazecor/gcc-ar-16" + - "/home/abdelrahman/Sources/bundletool/gcc-ar-16" + - "/home/abdelrahman/.yarn/bin/gcc-ar-16" + - "/home/abdelrahman/.cargo/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/deckboard/gcc-ar-16" + - "/home/abdelrahman/Sources/netbeans/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcc-ar-16" + - "/home/abdelrahman/Sources/ffmpeg_static/gcc-ar-16" + - "/home/abdelrahman/.emacs.d/bin/gcc-ar-16" + - "/home/abdelrahman/cdtdebugger/gcc-ar-16" + - "/home/abdelrahman/Sources/robo3t/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/armorpaint/gcc-ar-16" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcc-ar-16" + - "/home/abdelrahman/Sources/shell_scripts/gcc-ar-16" + - "/usr/local/go/bin/gcc-ar-16" + - "/opt/ArgyllCMS/bin/gcc-ar-16" + - "/opt/gaffer/bin/gcc-ar-16" + - "/home/abdelrahman/Sources/blender/latest/gcc-ar-16" + - "/home/abdelrahman/Sources/REAPER/gcc-ar-16" + - "/opt/resolve/bin/gcc-ar-16" + - "/home/abdelrahman/.opencode/bin/gcc-ar-16" + - "/home/abdelrahman/.fzf/bin/gcc-ar-16" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcc-ar-16" + - "/usr/local/sbin/gcc-ar-16" + - "/usr/local/bin/gcc-ar-16" + - "/var/lib/flatpak/exports/bin/gcc-ar-16" + - "/usr/lib/jvm/default/bin/gcc-ar-16" + - "/usr/bin/site_perl/gcc-ar-16" + - "/usr/bin/vendor_perl/gcc-ar-16" + - "/usr/bin/core_perl/gcc-ar-16" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gcc-ar-16" + - "/home/abdelrahman/.local/bin/gcc-ar-16" + - "/usr/bin/gcc-ar16" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcc-ar16" + - "/home/abdelrahman/Sources/bazecor/gcc-ar16" + - "/home/abdelrahman/Sources/bundletool/gcc-ar16" + - "/home/abdelrahman/.yarn/bin/gcc-ar16" + - "/home/abdelrahman/.cargo/bin/gcc-ar16" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcc-ar16" + - "/home/abdelrahman/Sources/deckboard/gcc-ar16" + - "/home/abdelrahman/Sources/netbeans/bin/gcc-ar16" + - "/home/abdelrahman/Sources/bin/gcc-ar16" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcc-ar16" + - "/home/abdelrahman/Sources/ffmpeg_static/gcc-ar16" + - "/home/abdelrahman/.emacs.d/bin/gcc-ar16" + - "/home/abdelrahman/cdtdebugger/gcc-ar16" + - "/home/abdelrahman/Sources/robo3t/bin/gcc-ar16" + - "/home/abdelrahman/Sources/armorpaint/gcc-ar16" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcc-ar16" + - "/home/abdelrahman/Sources/shell_scripts/gcc-ar16" + - "/usr/local/go/bin/gcc-ar16" + - "/opt/ArgyllCMS/bin/gcc-ar16" + - "/opt/gaffer/bin/gcc-ar16" + - "/home/abdelrahman/Sources/blender/latest/gcc-ar16" + - "/home/abdelrahman/Sources/REAPER/gcc-ar16" + - "/opt/resolve/bin/gcc-ar16" + - "/home/abdelrahman/.opencode/bin/gcc-ar16" + - "/home/abdelrahman/.fzf/bin/gcc-ar16" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcc-ar16" + - "/usr/local/sbin/gcc-ar16" + - "/usr/local/bin/gcc-ar16" + - "/var/lib/flatpak/exports/bin/gcc-ar16" + - "/usr/lib/jvm/default/bin/gcc-ar16" + - "/usr/bin/site_perl/gcc-ar16" + - "/usr/bin/vendor_perl/gcc-ar16" + - "/usr/bin/core_perl/gcc-ar16" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gcc-ar16" + - "/home/abdelrahman/.local/bin/gcc-ar16" + found: "/usr/bin/gcc-ar" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/Compiler/GNU-FindBinUtils.cmake:30 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:207 (include)" + - "CMakeLists.txt:203 (project)" + mode: "program" + variable: "CMAKE_CXX_COMPILER_RANLIB" + description: "A wrapper around 'ranlib' adding the appropriate '--plugin' option for the GCC compiler" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "gcc-ranlib-16.1" + - "gcc-ranlib-16" + - "gcc-ranlib16" + - "gcc-ranlib" + candidate_directories: + - "/usr/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + searched_directories: + - "/usr/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/bazecor/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/bundletool/gcc-ranlib-16.1" + - "/home/abdelrahman/.yarn/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/.cargo/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/deckboard/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/netbeans/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/ffmpeg_static/gcc-ranlib-16.1" + - "/home/abdelrahman/.emacs.d/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/cdtdebugger/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/robo3t/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/armorpaint/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/shell_scripts/gcc-ranlib-16.1" + - "/usr/local/go/bin/gcc-ranlib-16.1" + - "/opt/ArgyllCMS/bin/gcc-ranlib-16.1" + - "/opt/gaffer/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/blender/latest/gcc-ranlib-16.1" + - "/home/abdelrahman/Sources/REAPER/gcc-ranlib-16.1" + - "/opt/resolve/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/.opencode/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/.fzf/bin/gcc-ranlib-16.1" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcc-ranlib-16.1" + - "/usr/local/sbin/gcc-ranlib-16.1" + - "/usr/local/bin/gcc-ranlib-16.1" + - "/var/lib/flatpak/exports/bin/gcc-ranlib-16.1" + - "/usr/lib/jvm/default/bin/gcc-ranlib-16.1" + - "/usr/bin/site_perl/gcc-ranlib-16.1" + - "/usr/bin/vendor_perl/gcc-ranlib-16.1" + - "/usr/bin/core_perl/gcc-ranlib-16.1" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gcc-ranlib-16.1" + - "/home/abdelrahman/.local/bin/gcc-ranlib-16.1" + - "/usr/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/bazecor/gcc-ranlib-16" + - "/home/abdelrahman/Sources/bundletool/gcc-ranlib-16" + - "/home/abdelrahman/.yarn/bin/gcc-ranlib-16" + - "/home/abdelrahman/.cargo/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/deckboard/gcc-ranlib-16" + - "/home/abdelrahman/Sources/netbeans/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcc-ranlib-16" + - "/home/abdelrahman/Sources/ffmpeg_static/gcc-ranlib-16" + - "/home/abdelrahman/.emacs.d/bin/gcc-ranlib-16" + - "/home/abdelrahman/cdtdebugger/gcc-ranlib-16" + - "/home/abdelrahman/Sources/robo3t/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/armorpaint/gcc-ranlib-16" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcc-ranlib-16" + - "/home/abdelrahman/Sources/shell_scripts/gcc-ranlib-16" + - "/usr/local/go/bin/gcc-ranlib-16" + - "/opt/ArgyllCMS/bin/gcc-ranlib-16" + - "/opt/gaffer/bin/gcc-ranlib-16" + - "/home/abdelrahman/Sources/blender/latest/gcc-ranlib-16" + - "/home/abdelrahman/Sources/REAPER/gcc-ranlib-16" + - "/opt/resolve/bin/gcc-ranlib-16" + - "/home/abdelrahman/.opencode/bin/gcc-ranlib-16" + - "/home/abdelrahman/.fzf/bin/gcc-ranlib-16" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcc-ranlib-16" + - "/usr/local/sbin/gcc-ranlib-16" + - "/usr/local/bin/gcc-ranlib-16" + - "/var/lib/flatpak/exports/bin/gcc-ranlib-16" + - "/usr/lib/jvm/default/bin/gcc-ranlib-16" + - "/usr/bin/site_perl/gcc-ranlib-16" + - "/usr/bin/vendor_perl/gcc-ranlib-16" + - "/usr/bin/core_perl/gcc-ranlib-16" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gcc-ranlib-16" + - "/home/abdelrahman/.local/bin/gcc-ranlib-16" + - "/usr/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/bazecor/gcc-ranlib16" + - "/home/abdelrahman/Sources/bundletool/gcc-ranlib16" + - "/home/abdelrahman/.yarn/bin/gcc-ranlib16" + - "/home/abdelrahman/.cargo/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/deckboard/gcc-ranlib16" + - "/home/abdelrahman/Sources/netbeans/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcc-ranlib16" + - "/home/abdelrahman/Sources/ffmpeg_static/gcc-ranlib16" + - "/home/abdelrahman/.emacs.d/bin/gcc-ranlib16" + - "/home/abdelrahman/cdtdebugger/gcc-ranlib16" + - "/home/abdelrahman/Sources/robo3t/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/armorpaint/gcc-ranlib16" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcc-ranlib16" + - "/home/abdelrahman/Sources/shell_scripts/gcc-ranlib16" + - "/usr/local/go/bin/gcc-ranlib16" + - "/opt/ArgyllCMS/bin/gcc-ranlib16" + - "/opt/gaffer/bin/gcc-ranlib16" + - "/home/abdelrahman/Sources/blender/latest/gcc-ranlib16" + - "/home/abdelrahman/Sources/REAPER/gcc-ranlib16" + - "/opt/resolve/bin/gcc-ranlib16" + - "/home/abdelrahman/.opencode/bin/gcc-ranlib16" + - "/home/abdelrahman/.fzf/bin/gcc-ranlib16" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcc-ranlib16" + - "/usr/local/sbin/gcc-ranlib16" + - "/usr/local/bin/gcc-ranlib16" + - "/var/lib/flatpak/exports/bin/gcc-ranlib16" + - "/usr/lib/jvm/default/bin/gcc-ranlib16" + - "/usr/bin/site_perl/gcc-ranlib16" + - "/usr/bin/vendor_perl/gcc-ranlib16" + - "/usr/bin/core_perl/gcc-ranlib16" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/gcc-ranlib16" + - "/home/abdelrahman/.local/bin/gcc-ranlib16" + found: "/usr/bin/gcc-ranlib" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - + kind: "try_compile-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:83 (try_compile)" + - "/usr/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:203 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-mwhdJY" + binary: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-mwhdJY" + cmakeVariables: + CMAKE_CXX_STDLIB_MODULES_JSON: "" + CMAKE_C_FLAGS: "" + CMAKE_C_FLAGS_DEBUG: "-g" + CMAKE_EXE_LINKER_FLAGS: "" + CMAKE_MODULE_PATH: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/modules/" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-mwhdJY' + + Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_01a41/fast + /usr/bin/make -f CMakeFiles/cmTC_01a41.dir/build.make CMakeFiles/cmTC_01a41.dir/build + make[1]: Entering directory '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-mwhdJY' + Building C object CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o + /usr/bin/cc -v -o CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake/Modules/CMakeCCompilerABI.c + Using built-in specs. + COLLECT_GCC=/usr/bin/cc + Target: x86_64-pc-linux-gnu + Configured with: /build/gcc/src/gcc/configure --enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++,rust,cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 16.1.1 20260430 (GCC) + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_01a41.dir/' + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/cc1 -quiet -v /usr/share/cmake/Modules/CMakeCCompilerABI.c -quiet -dumpdir CMakeFiles/cmTC_01a41.dir/ -dumpbase CMakeCCompilerABI.c.c -dumpbase-ext .c -mtune=generic -march=x86-64 -version -o /tmp/ccxIm9gA.s + GNU C23 (GCC) version 16.1.1 20260430 (x86_64-pc-linux-gnu) + compiled by GNU C version 16.1.1 20260430, GMP version 6.3.0, MPFR version 4.2.2, MPC version 1.4.1, isl version isl-0.27-GMP + + GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 + ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include-fixed" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../x86_64-pc-linux-gnu/include" + #include "..." search starts here: + #include <...> search starts here: + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include + /usr/local/include + /usr/include + End of search list. + Compiler executable checksum: d640c2d0cc84ebd71ee43ed7e2df63fb + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_01a41.dir/' + as -v --64 -o CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o /tmp/ccxIm9gA.s + GNU assembler version 2.46.0 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.46.0 + COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.' + Linking C executable cmTC_01a41 + /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_01a41.dir/link.txt --verbose=1 + Using built-in specs. + COLLECT_GCC=/usr/bin/cc + COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper + Target: x86_64-pc-linux-gnu + Configured with: /build/gcc/src/gcc/configure --enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++,rust,cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 16.1.1 20260430 (GCC) + COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_01a41' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_01a41.' + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cce9mBj4.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s_asneeded -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s_asneeded --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_01a41 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o -lgcc -lgcc_s_asneeded -latomic_asneeded -lc -lgcc -lgcc_s_asneeded /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o + collect2 version 16.1.1 20260430 + /usr/bin/ld -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cce9mBj4.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s_asneeded -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s_asneeded --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_01a41 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o -lgcc -lgcc_s_asneeded -latomic_asneeded -lc -lgcc -lgcc_s_asneeded /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o + GNU ld (GNU Binutils) 2.46.0 + COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_01a41' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_01a41.' + /usr/bin/cc -v -Wl,-v CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o -o cmTC_01a41 + make[1]: Leaving directory '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-mwhdJY' + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:217 (message)" + - "/usr/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:203 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] + add: [/usr/local/include] + add: [/usr/include] + end of search list found + collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] + collapse include dir [/usr/local/include] ==> [/usr/local/include] + collapse include dir [/usr/include] ==> [/usr/include] + implicit include dirs: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include;/usr/local/include;/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:253 (message)" + - "/usr/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:203 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(|\\.[a-rt-z][a-z]*|\\.s[a-np-z][a-z]*|\\.so[a-z]+)|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|"|[0-9]+>[ -]*Build:[ 0-9]+ ms[ ]*)?[ ]*(([^"]*[/\\])?(ld[0-9]*(|\\.[a-rt-z][a-z]*|\\.s[a-np-z][a-z]*|\\.so[a-z]+)))("|,| |$)] + ignore line: [Change Dir: '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-mwhdJY'] + ignore line: [] + ignore line: [Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_01a41/fast] + ignore line: [/usr/bin/make -f CMakeFiles/cmTC_01a41.dir/build.make CMakeFiles/cmTC_01a41.dir/build] + ignore line: [make[1]: Entering directory '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-mwhdJY'] + ignore line: [Building C object CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o] + ignore line: [/usr/bin/cc -v -o CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake/Modules/CMakeCCompilerABI.c] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [Target: x86_64-pc-linux-gnu] + ignore line: [Configured with: /build/gcc/src/gcc/configure --enable-languages=ada c c++ d fortran go lto m2 objc obj-c++ rust cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 16.1.1 20260430 (GCC) ] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_01a41.dir/'] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/cc1 -quiet -v /usr/share/cmake/Modules/CMakeCCompilerABI.c -quiet -dumpdir CMakeFiles/cmTC_01a41.dir/ -dumpbase CMakeCCompilerABI.c.c -dumpbase-ext .c -mtune=generic -march=x86-64 -version -o /tmp/ccxIm9gA.s] + ignore line: [GNU C23 (GCC) version 16.1.1 20260430 (x86_64-pc-linux-gnu)] + ignore line: [ compiled by GNU C version 16.1.1 20260430 GMP version 6.3.0 MPFR version 4.2.2 MPC version 1.4.1 isl version isl-0.27-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include-fixed"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../x86_64-pc-linux-gnu/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] + ignore line: [ /usr/local/include] + ignore line: [ /usr/include] + ignore line: [End of search list.] + ignore line: [Compiler executable checksum: d640c2d0cc84ebd71ee43ed7e2df63fb] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_01a41.dir/'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o /tmp/ccxIm9gA.s] + ignore line: [GNU assembler version 2.46.0 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.46.0] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.'] + ignore line: [Linking C executable cmTC_01a41] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_01a41.dir/link.txt --verbose=1] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper] + ignore line: [Target: x86_64-pc-linux-gnu] + ignore line: [Configured with: /build/gcc/src/gcc/configure --enable-languages=ada c c++ d fortran go lto m2 objc obj-c++ rust cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 16.1.1 20260430 (GCC) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_01a41' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_01a41.'] + link line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cce9mBj4.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s_asneeded -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s_asneeded --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_01a41 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o -lgcc -lgcc_s_asneeded -latomic_asneeded -lc -lgcc -lgcc_s_asneeded /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/cce9mBj4.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s_asneeded] ==> ignore + arg [-plugin-opt=-pass-through=-latomic_asneeded] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s_asneeded] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-pie] ==> ignore + arg [-o] ==> ignore + arg [cmTC_01a41] ==> ignore + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o] + arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] + arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../..] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../..] + arg [-L/lib] ==> dir [/lib] + arg [-L/usr/lib] ==> dir [/usr/lib] + arg [-v] ==> ignore + arg [CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [-lgcc_s_asneeded] ==> lib [gcc_s_asneeded] + arg [-latomic_asneeded] ==> lib [atomic_asneeded] + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [-lgcc_s_asneeded] ==> lib [gcc_s_asneeded] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] + ignore line: [collect2 version 16.1.1 20260430] + ignore line: [/usr/bin/ld -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cce9mBj4.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s_asneeded -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s_asneeded --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_01a41 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_01a41.dir/CMakeCCompilerABI.c.o -lgcc -lgcc_s_asneeded -latomic_asneeded -lc -lgcc -lgcc_s_asneeded /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] + linker tool for 'C': /usr/bin/ld + collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] ==> [/usr/lib/Scrt1.o] + collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] ==> [/usr/lib/crti.o] + collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] ==> [/usr/lib/crtn.o] + collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] + collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../..] ==> [/usr/lib] + collapse library dir [/lib] ==> [/lib] + collapse library dir [/usr/lib] ==> [/usr/lib] + implicit libs: [gcc;gcc_s_asneeded;atomic_asneeded;c;gcc;gcc_s_asneeded] + implicit objs: [/usr/lib/Scrt1.o;/usr/lib/crti.o;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o;/usr/lib/crtn.o] + implicit dirs: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1;/usr/lib;/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/Internal/CMakeDetermineLinkerId.cmake:38 (message)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:299 (cmake_determine_linker_id)" + - "/usr/share/cmake/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:203 (project)" + message: | + Running the C compiler's linker: "/usr/bin/ld" "-v" + GNU ld (GNU Binutils) 2.46.0 + - + kind: "try_compile-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:83 (try_compile)" + - "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:203 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-6flmX1" + binary: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-6flmX1" + cmakeVariables: + CMAKE_CXX_FLAGS: "-msse4.1" + CMAKE_CXX_FLAGS_DEBUG: "-g" + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_CXX_STDLIB_MODULES_JSON: "" + CMAKE_EXE_LINKER_FLAGS: "" + CMAKE_MODULE_PATH: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/modules/" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-6flmX1' + + Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_7f56c/fast + /usr/bin/make -f CMakeFiles/cmTC_7f56c.dir/build.make CMakeFiles/cmTC_7f56c.dir/build + make[1]: Entering directory '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-6flmX1' + Building CXX object CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o + /usr/bin/c++ -msse4.1 -std=gnu++17 -v -o CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp + Using built-in specs. + COLLECT_GCC=/usr/bin/c++ + Target: x86_64-pc-linux-gnu + Configured with: /build/gcc/src/gcc/configure --enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++,rust,cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 16.1.1 20260430 (GCC) + COLLECT_GCC_OPTIONS='-msse4.1' '-std=gnu++17' '-v' '-o' 'CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_7f56c.dir/' + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/cc1plus -quiet -v -D_GNU_SOURCE /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_7f56c.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -msse4.1 -mtune=generic -march=x86-64 -std=gnu++17 -version -o /tmp/cc05d9Eq.s + GNU C++17 (GCC) version 16.1.1 20260430 (x86_64-pc-linux-gnu) + compiled by GNU C version 16.1.1 20260430, GMP version 6.3.0, MPFR version 4.2.2, MPC version 1.4.1, isl version isl-0.27-GMP + + GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 + ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include-fixed" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../x86_64-pc-linux-gnu/include" + #include "..." search starts here: + #include <...> search starts here: + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1 + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/x86_64-pc-linux-gnu + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/backward + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include + /usr/local/include + /usr/include + End of search list. + Compiler executable checksum: d47d0c990a24bc0dbaf3bd00656bd5f3 + COLLECT_GCC_OPTIONS='-msse4.1' '-std=gnu++17' '-v' '-o' 'CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_7f56c.dir/' + as -v --64 -o CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o /tmp/cc05d9Eq.s + GNU assembler version 2.46.0 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.46.0 + COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-msse4.1' '-std=gnu++17' '-v' '-o' 'CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.' + Linking CXX executable cmTC_7f56c + /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_7f56c.dir/link.txt --verbose=1 + Using built-in specs. + COLLECT_GCC=/usr/bin/c++ + COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper + Target: x86_64-pc-linux-gnu + Configured with: /build/gcc/src/gcc/configure --enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++,rust,cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 16.1.1 20260430 (GCC) + COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-msse4.1' '-v' '-o' 'cmTC_7f56c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_7f56c.' + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cchfGUwC.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_7f56c /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o + collect2 version 16.1.1 20260430 + /usr/bin/ld -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cchfGUwC.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_7f56c /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o + GNU ld (GNU Binutils) 2.46.0 + COLLECT_GCC_OPTIONS='-msse4.1' '-v' '-o' 'cmTC_7f56c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_7f56c.' + /usr/bin/c++ -msse4.1 -v -Wl,-v CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_7f56c + make[1]: Leaving directory '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-6flmX1' + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:217 (message)" + - "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:203 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1] + add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/x86_64-pc-linux-gnu] + add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/backward] + add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] + add: [/usr/local/include] + add: [/usr/include] + end of search list found + collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1] ==> [/usr/include/c++/16.1.1] + collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/x86_64-pc-linux-gnu] ==> [/usr/include/c++/16.1.1/x86_64-pc-linux-gnu] + collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/backward] ==> [/usr/include/c++/16.1.1/backward] + collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] + collapse include dir [/usr/local/include] ==> [/usr/local/include] + collapse include dir [/usr/include] ==> [/usr/include] + implicit include dirs: [/usr/include/c++/16.1.1;/usr/include/c++/16.1.1/x86_64-pc-linux-gnu;/usr/include/c++/16.1.1/backward;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include;/usr/local/include;/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:253 (message)" + - "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:203 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(|\\.[a-rt-z][a-z]*|\\.s[a-np-z][a-z]*|\\.so[a-z]+)|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|"|[0-9]+>[ -]*Build:[ 0-9]+ ms[ ]*)?[ ]*(([^"]*[/\\])?(ld[0-9]*(|\\.[a-rt-z][a-z]*|\\.s[a-np-z][a-z]*|\\.so[a-z]+)))("|,| |$)] + ignore line: [Change Dir: '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-6flmX1'] + ignore line: [] + ignore line: [Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_7f56c/fast] + ignore line: [/usr/bin/make -f CMakeFiles/cmTC_7f56c.dir/build.make CMakeFiles/cmTC_7f56c.dir/build] + ignore line: [make[1]: Entering directory '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-6flmX1'] + ignore line: [Building CXX object CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/c++ -msse4.1 -std=gnu++17 -v -o CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [Target: x86_64-pc-linux-gnu] + ignore line: [Configured with: /build/gcc/src/gcc/configure --enable-languages=ada c c++ d fortran go lto m2 objc obj-c++ rust cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 16.1.1 20260430 (GCC) ] + ignore line: [COLLECT_GCC_OPTIONS='-msse4.1' '-std=gnu++17' '-v' '-o' 'CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_7f56c.dir/'] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/cc1plus -quiet -v -D_GNU_SOURCE /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_7f56c.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -msse4.1 -mtune=generic -march=x86-64 -std=gnu++17 -version -o /tmp/cc05d9Eq.s] + ignore line: [GNU C++17 (GCC) version 16.1.1 20260430 (x86_64-pc-linux-gnu)] + ignore line: [ compiled by GNU C version 16.1.1 20260430 GMP version 6.3.0 MPFR version 4.2.2 MPC version 1.4.1 isl version isl-0.27-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include-fixed"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../x86_64-pc-linux-gnu/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/x86_64-pc-linux-gnu] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/backward] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] + ignore line: [ /usr/local/include] + ignore line: [ /usr/include] + ignore line: [End of search list.] + ignore line: [Compiler executable checksum: d47d0c990a24bc0dbaf3bd00656bd5f3] + ignore line: [COLLECT_GCC_OPTIONS='-msse4.1' '-std=gnu++17' '-v' '-o' 'CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_7f56c.dir/'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o /tmp/cc05d9Eq.s] + ignore line: [GNU assembler version 2.46.0 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.46.0] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-msse4.1' '-std=gnu++17' '-v' '-o' 'CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.'] + ignore line: [Linking CXX executable cmTC_7f56c] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_7f56c.dir/link.txt --verbose=1] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper] + ignore line: [Target: x86_64-pc-linux-gnu] + ignore line: [Configured with: /build/gcc/src/gcc/configure --enable-languages=ada c c++ d fortran go lto m2 objc obj-c++ rust cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 16.1.1 20260430 (GCC) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-msse4.1' '-v' '-o' 'cmTC_7f56c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_7f56c.'] + link line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cchfGUwC.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_7f56c /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/cchfGUwC.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-latomic_asneeded] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-pie] ==> ignore + arg [-o] ==> ignore + arg [cmTC_7f56c] ==> ignore + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o] + arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] + arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../..] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../..] + arg [-L/lib] ==> dir [/lib] + arg [-L/usr/lib] ==> dir [/usr/lib] + arg [-v] ==> ignore + arg [CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-latomic_asneeded] ==> lib [atomic_asneeded] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] + ignore line: [collect2 version 16.1.1 20260430] + ignore line: [/usr/bin/ld -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cchfGUwC.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_7f56c /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_7f56c.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] + linker tool for 'CXX': /usr/bin/ld + collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] ==> [/usr/lib/Scrt1.o] + collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] ==> [/usr/lib/crti.o] + collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] ==> [/usr/lib/crtn.o] + collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] + collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../..] ==> [/usr/lib] + collapse library dir [/lib] ==> [/lib] + collapse library dir [/usr/lib] ==> [/usr/lib] + implicit libs: [stdc++;m;gcc_s;gcc;atomic_asneeded;c;gcc_s;gcc] + implicit objs: [/usr/lib/Scrt1.o;/usr/lib/crti.o;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o;/usr/lib/crtn.o] + implicit dirs: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1;/usr/lib;/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/Internal/CMakeDetermineLinkerId.cmake:38 (message)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:299 (cmake_determine_linker_id)" + - "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:203 (project)" + message: | + Running the CXX compiler's linker: "/usr/bin/ld" "-v" + GNU ld (GNU Binutils) 2.46.0 + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CTest.cmake:188 (find_program)" + - "CMakeLists.txt:209 (include)" + mode: "program" + variable: "MEMORYCHECK_COMMAND" + description: "Path to the memory checking command, used for memory error detection." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "purify" + - "valgrind" + - "boundscheck" + - "drmemory" + - "cuda-memcheck" + - "compute-sanitizer" + candidate_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + - "/usr/local/bin/" + - "/usr/local/sbin/" + - "/usr/local/" + - "/usr/bin/" + - "/usr/sbin/" + - "/usr/" + - "/bin/" + - "/sbin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/bin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/sbin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/" + - "/usr/X11R6/bin/" + - "/usr/X11R6/sbin/" + - "/usr/X11R6/" + - "/usr/pkg/bin/" + - "/usr/pkg/sbin/" + - "/usr/pkg/" + - "/opt/bin/" + - "/opt/sbin/" + - "/opt/" + searched_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/purify" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/purify" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/purify" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/purify" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/purify" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/purify" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/purify" + - "/home/abdelrahman/Sources/bazecor/purify" + - "/home/abdelrahman/Sources/bundletool/purify" + - "/home/abdelrahman/.yarn/bin/purify" + - "/home/abdelrahman/.cargo/bin/purify" + - "/home/abdelrahman/Sources/AndroidStudio/bin/purify" + - "/home/abdelrahman/Sources/deckboard/purify" + - "/home/abdelrahman/Sources/netbeans/bin/purify" + - "/home/abdelrahman/Sources/bin/purify" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/purify" + - "/home/abdelrahman/Sources/ffmpeg_static/purify" + - "/home/abdelrahman/.emacs.d/bin/purify" + - "/home/abdelrahman/cdtdebugger/purify" + - "/home/abdelrahman/Sources/robo3t/bin/purify" + - "/home/abdelrahman/Sources/armorpaint/purify" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/purify" + - "/home/abdelrahman/Sources/shell_scripts/purify" + - "/usr/local/go/bin/purify" + - "/opt/ArgyllCMS/bin/purify" + - "/opt/gaffer/bin/purify" + - "/home/abdelrahman/Sources/blender/latest/purify" + - "/home/abdelrahman/Sources/REAPER/purify" + - "/opt/resolve/bin/purify" + - "/home/abdelrahman/.opencode/bin/purify" + - "/home/abdelrahman/.fzf/bin/purify" + - "/home/abdelrahman/.local/share/nvim/mason/bin/purify" + - "/usr/local/sbin/purify" + - "/usr/local/bin/purify" + - "/usr/bin/purify" + - "/var/lib/flatpak/exports/bin/purify" + - "/usr/lib/jvm/default/bin/purify" + - "/usr/bin/site_perl/purify" + - "/usr/bin/vendor_perl/purify" + - "/usr/bin/core_perl/purify" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/purify" + - "/home/abdelrahman/.local/bin/purify" + - "/usr/local/bin/purify" + - "/usr/local/sbin/purify" + - "/usr/local/purify" + - "/usr/bin/purify" + - "/usr/sbin/purify" + - "/usr/purify" + - "/bin/purify" + - "/sbin/purify" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/bin/purify" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/sbin/purify" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/purify" + - "/usr/X11R6/bin/purify" + - "/usr/X11R6/sbin/purify" + - "/usr/X11R6/purify" + - "/usr/pkg/bin/purify" + - "/usr/pkg/sbin/purify" + - "/usr/pkg/purify" + - "/opt/bin/purify" + - "/opt/sbin/purify" + - "/opt/purify" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/valgrind" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/valgrind" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/valgrind" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/valgrind" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/valgrind" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/valgrind" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/valgrind" + - "/home/abdelrahman/Sources/bazecor/valgrind" + - "/home/abdelrahman/Sources/bundletool/valgrind" + - "/home/abdelrahman/.yarn/bin/valgrind" + - "/home/abdelrahman/.cargo/bin/valgrind" + - "/home/abdelrahman/Sources/AndroidStudio/bin/valgrind" + - "/home/abdelrahman/Sources/deckboard/valgrind" + - "/home/abdelrahman/Sources/netbeans/bin/valgrind" + - "/home/abdelrahman/Sources/bin/valgrind" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/valgrind" + - "/home/abdelrahman/Sources/ffmpeg_static/valgrind" + - "/home/abdelrahman/.emacs.d/bin/valgrind" + - "/home/abdelrahman/cdtdebugger/valgrind" + - "/home/abdelrahman/Sources/robo3t/bin/valgrind" + - "/home/abdelrahman/Sources/armorpaint/valgrind" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/valgrind" + - "/home/abdelrahman/Sources/shell_scripts/valgrind" + - "/usr/local/go/bin/valgrind" + - "/opt/ArgyllCMS/bin/valgrind" + - "/opt/gaffer/bin/valgrind" + - "/home/abdelrahman/Sources/blender/latest/valgrind" + - "/home/abdelrahman/Sources/REAPER/valgrind" + - "/opt/resolve/bin/valgrind" + - "/home/abdelrahman/.opencode/bin/valgrind" + - "/home/abdelrahman/.fzf/bin/valgrind" + - "/home/abdelrahman/.local/share/nvim/mason/bin/valgrind" + - "/usr/local/sbin/valgrind" + - "/usr/local/bin/valgrind" + found: "/usr/bin/valgrind" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + CMAKE_SYSTEM_PREFIX_PATH: + - "/usr/local" + - "/usr" + - "/" + - "/usr" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CTest.cmake:196 (find_program)" + - "CMakeLists.txt:209 (include)" + mode: "program" + variable: "COVERAGE_COMMAND" + description: "Path to the coverage program that CTest uses for performing coverage inspection" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "gcov" + candidate_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + - "/usr/local/bin/" + - "/usr/local/sbin/" + - "/usr/local/" + - "/usr/bin/" + - "/usr/sbin/" + - "/usr/" + - "/bin/" + - "/sbin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/bin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/sbin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/" + - "/usr/X11R6/bin/" + - "/usr/X11R6/sbin/" + - "/usr/X11R6/" + - "/usr/pkg/bin/" + - "/usr/pkg/sbin/" + - "/usr/pkg/" + - "/opt/bin/" + - "/opt/sbin/" + - "/opt/" + searched_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcov" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/gcov" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/gcov" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/gcov" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/gcov" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/gcov" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/gcov" + - "/home/abdelrahman/Sources/bazecor/gcov" + - "/home/abdelrahman/Sources/bundletool/gcov" + - "/home/abdelrahman/.yarn/bin/gcov" + - "/home/abdelrahman/.cargo/bin/gcov" + - "/home/abdelrahman/Sources/AndroidStudio/bin/gcov" + - "/home/abdelrahman/Sources/deckboard/gcov" + - "/home/abdelrahman/Sources/netbeans/bin/gcov" + - "/home/abdelrahman/Sources/bin/gcov" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/gcov" + - "/home/abdelrahman/Sources/ffmpeg_static/gcov" + - "/home/abdelrahman/.emacs.d/bin/gcov" + - "/home/abdelrahman/cdtdebugger/gcov" + - "/home/abdelrahman/Sources/robo3t/bin/gcov" + - "/home/abdelrahman/Sources/armorpaint/gcov" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/gcov" + - "/home/abdelrahman/Sources/shell_scripts/gcov" + - "/usr/local/go/bin/gcov" + - "/opt/ArgyllCMS/bin/gcov" + - "/opt/gaffer/bin/gcov" + - "/home/abdelrahman/Sources/blender/latest/gcov" + - "/home/abdelrahman/Sources/REAPER/gcov" + - "/opt/resolve/bin/gcov" + - "/home/abdelrahman/.opencode/bin/gcov" + - "/home/abdelrahman/.fzf/bin/gcov" + - "/home/abdelrahman/.local/share/nvim/mason/bin/gcov" + - "/usr/local/sbin/gcov" + - "/usr/local/bin/gcov" + found: "/usr/bin/gcov" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + CMAKE_SYSTEM_PREFIX_PATH: + - "/usr/local" + - "/usr" + - "/" + - "/usr" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - + kind: "try_compile-v1" + backtrace: + - "/usr/share/cmake/Modules/Internal/CheckSourceCompiles.cmake:104 (try_compile)" + - "/usr/share/cmake/Modules/CheckCSourceCompiles.cmake:103 (cmake_check_source_compiles)" + - "/usr/share/cmake/Modules/FindThreads.cmake:160 (check_c_source_compiles)" + - "/usr/share/cmake/Modules/FindThreads.cmake:226 (_threads_check_libc)" + - "CMakeLists.txt:747 (find_package)" + - "CMakeLists.txt:838 (common_libktx_settings)" + checks: + - "Performing Test CMAKE_HAVE_LIBC_PTHREAD" + directories: + source: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-RXTgAr" + binary: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-RXTgAr" + cmakeVariables: + CMAKE_CXX_STDLIB_MODULES_JSON: "" + CMAKE_C_FLAGS: "" + CMAKE_C_FLAGS_DEBUG: "-g" + CMAKE_EXE_LINKER_FLAGS: "" + CMAKE_MODULE_PATH: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/modules/" + buildResult: + variable: "CMAKE_HAVE_LIBC_PTHREAD" + cached: true + stdout: | + Change Dir: '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-RXTgAr' + + Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_d1613/fast + /usr/bin/make -f CMakeFiles/cmTC_d1613.dir/build.make CMakeFiles/cmTC_d1613.dir/build + make[1]: Entering directory '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-RXTgAr' + Building C object CMakeFiles/cmTC_d1613.dir/src.c.o + /usr/bin/cc -DCMAKE_HAVE_LIBC_PTHREAD -o CMakeFiles/cmTC_d1613.dir/src.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-RXTgAr/src.c + Linking C executable cmTC_d1613 + /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d1613.dir/link.txt --verbose=1 + /usr/bin/cc CMakeFiles/cmTC_d1613.dir/src.c.o -o cmTC_d1613 + make[1]: Leaving directory '/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/CMakeScratch/TryCompile-RXTgAr' + + exitCode: 0 + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/FindPkgConfig.cmake:517 (find_program)" + - "/usr/lib/cmake/SDL3/SDL3Config.cmake:100 (find_package)" + - "tests/loadtests/CMakeLists.txt:24 (find_package)" + mode: "program" + variable: "PKG_CONFIG_EXECUTABLE" + description: "pkg-config executable" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "pkg-config" + - "pkgconf" + candidate_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + - "/usr/local/bin/" + - "/usr/local/sbin/" + - "/usr/local/" + - "/usr/bin/" + - "/usr/sbin/" + - "/usr/" + - "/bin/" + - "/sbin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/bin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/sbin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/" + - "/usr/X11R6/bin/" + - "/usr/X11R6/sbin/" + - "/usr/X11R6/" + - "/usr/pkg/bin/" + - "/usr/pkg/sbin/" + - "/usr/pkg/" + - "/opt/bin/" + - "/opt/sbin/" + - "/opt/" + searched_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/pkg-config" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/pkgconf" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/pkg-config" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/pkgconf" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/pkg-config" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/pkgconf" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/pkg-config" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/pkgconf" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/pkg-config" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/pkgconf" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/pkg-config" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/pkgconf" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/pkg-config" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/pkgconf" + - "/home/abdelrahman/Sources/bazecor/pkg-config" + - "/home/abdelrahman/Sources/bazecor/pkgconf" + - "/home/abdelrahman/Sources/bundletool/pkg-config" + - "/home/abdelrahman/Sources/bundletool/pkgconf" + - "/home/abdelrahman/.yarn/bin/pkg-config" + - "/home/abdelrahman/.yarn/bin/pkgconf" + - "/home/abdelrahman/.cargo/bin/pkg-config" + - "/home/abdelrahman/.cargo/bin/pkgconf" + - "/home/abdelrahman/Sources/AndroidStudio/bin/pkg-config" + - "/home/abdelrahman/Sources/AndroidStudio/bin/pkgconf" + - "/home/abdelrahman/Sources/deckboard/pkg-config" + - "/home/abdelrahman/Sources/deckboard/pkgconf" + - "/home/abdelrahman/Sources/netbeans/bin/pkg-config" + - "/home/abdelrahman/Sources/netbeans/bin/pkgconf" + - "/home/abdelrahman/Sources/bin/pkg-config" + - "/home/abdelrahman/Sources/bin/pkgconf" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/pkg-config" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/pkgconf" + - "/home/abdelrahman/Sources/ffmpeg_static/pkg-config" + - "/home/abdelrahman/Sources/ffmpeg_static/pkgconf" + - "/home/abdelrahman/.emacs.d/bin/pkg-config" + - "/home/abdelrahman/.emacs.d/bin/pkgconf" + - "/home/abdelrahman/cdtdebugger/pkg-config" + - "/home/abdelrahman/cdtdebugger/pkgconf" + - "/home/abdelrahman/Sources/robo3t/bin/pkg-config" + - "/home/abdelrahman/Sources/robo3t/bin/pkgconf" + - "/home/abdelrahman/Sources/armorpaint/pkg-config" + - "/home/abdelrahman/Sources/armorpaint/pkgconf" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/pkg-config" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/pkgconf" + - "/home/abdelrahman/Sources/shell_scripts/pkg-config" + - "/home/abdelrahman/Sources/shell_scripts/pkgconf" + - "/usr/local/go/bin/pkg-config" + - "/usr/local/go/bin/pkgconf" + - "/opt/ArgyllCMS/bin/pkg-config" + - "/opt/ArgyllCMS/bin/pkgconf" + - "/opt/gaffer/bin/pkg-config" + - "/opt/gaffer/bin/pkgconf" + - "/home/abdelrahman/Sources/blender/latest/pkg-config" + - "/home/abdelrahman/Sources/blender/latest/pkgconf" + - "/home/abdelrahman/Sources/REAPER/pkg-config" + - "/home/abdelrahman/Sources/REAPER/pkgconf" + - "/opt/resolve/bin/pkg-config" + - "/opt/resolve/bin/pkgconf" + - "/home/abdelrahman/.opencode/bin/pkg-config" + - "/home/abdelrahman/.opencode/bin/pkgconf" + - "/home/abdelrahman/.fzf/bin/pkg-config" + - "/home/abdelrahman/.fzf/bin/pkgconf" + - "/home/abdelrahman/.local/share/nvim/mason/bin/pkg-config" + - "/home/abdelrahman/.local/share/nvim/mason/bin/pkgconf" + - "/usr/local/sbin/pkg-config" + - "/usr/local/sbin/pkgconf" + - "/usr/local/bin/pkg-config" + - "/usr/local/bin/pkgconf" + found: "/usr/bin/pkg-config" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + CMAKE_SYSTEM_PREFIX_PATH: + - "/usr/local" + - "/usr" + - "/" + - "/usr" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/FindPkgConfig.cmake:761 (find_library)" + - "/usr/share/cmake/Modules/FindPkgConfig.cmake:811 (_pkg_find_libs)" + - "/usr/share/cmake/Modules/FindPkgConfig.cmake:1149 (_pkg_recalculate)" + - "/usr/share/cmake/Modules/FindPkgConfig.cmake:1166 (_pkg_check_modules_internal)" + - "/usr/lib/cmake/SDL3/SDL3Config.cmake:102 (pkg_check_modules)" + - "tests/loadtests/CMakeLists.txt:24 (find_package)" + mode: "library" + variable: "pkgcfg_lib_PC_LIBUNWIND_unwind-generic" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unwind-generic" + candidate_directories: + - "/usr/lib/" + found: "/usr/lib/libunwind-generic.so" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + CMAKE_SYSTEM_PREFIX_PATH: + - "/usr/local" + - "/usr" + - "/" + - "/usr" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/FindPkgConfig.cmake:761 (find_library)" + - "/usr/share/cmake/Modules/FindPkgConfig.cmake:811 (_pkg_find_libs)" + - "/usr/share/cmake/Modules/FindPkgConfig.cmake:1149 (_pkg_recalculate)" + - "/usr/share/cmake/Modules/FindPkgConfig.cmake:1166 (_pkg_check_modules_internal)" + - "/usr/lib/cmake/SDL3/SDL3Config.cmake:102 (pkg_check_modules)" + - "tests/loadtests/CMakeLists.txt:24 (find_package)" + mode: "library" + variable: "pkgcfg_lib_PC_LIBUNWIND_unwind" + description: "Path to a library." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "unwind" + candidate_directories: + - "/usr/lib/" + found: "/usr/lib/libunwind.so" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + CMAKE_SYSTEM_PREFIX_PATH: + - "/usr/local" + - "/usr" + - "/" + - "/usr" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + CMAKE_SYSTEM_LIBRARY_PATH: + - "/usr/lib/X11" + - + kind: "find_package-v1" + backtrace: + - "tests/loadtests/CMakeLists.txt:24 (find_package)" + name: "SDL3" + components: + - + name: "SDL3" + required: true + found: true + configs: + - + filename: "SDL3.cps" + kind: "cps" + - + filename: "sdl3.cps" + kind: "cps" + - + filename: "SDL3Config.cmake" + kind: "cmake" + - + filename: "sdl3-config.cmake" + kind: "cmake" + version_request: + exact: false + settings: + required: "required_explicit" + quiet: false + global: false + policy_scope: true + bypass_provider: false + names: + - "SDL3" + path_suffixes: + - "" + paths: + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + CMAKE_FIND_USE_PACKAGE_ROOT_PATH: true + CMAKE_FIND_USE_CMAKE_PACKAGE_REGISTRY: true + CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY: true + CMAKE_FIND_ROOT_PATH_MODE: "BOTH" + candidates: + - + path: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/pkgRedirects/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/pkgRedirects/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/pkgRedirects/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/pkgRedirects/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/pkgRedirects/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/pkgRedirects/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/bazecor/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/bazecor/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/bazecor/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/bazecor/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/bazecor/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/bazecor/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.cargo/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/.cargo/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/.cargo/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.cargo/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.cargo/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.cargo/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/AndroidStudio/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/AndroidStudio/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/AndroidStudio/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/AndroidStudio/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/AndroidStudio/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/AndroidStudio/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/blender/latest/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/blender/latest/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/blender/latest/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/blender/latest/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/blender/latest/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/blender/latest/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/REAPER/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/REAPER/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/REAPER/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/REAPER/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/REAPER/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/REAPER/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/opt/resolve/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/opt/resolve/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/opt/resolve/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/opt/resolve/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/opt/resolve/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/opt/resolve/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.opencode/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/.opencode/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/.opencode/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.opencode/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.opencode/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.opencode/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.local/share/nvim/mason/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/.local/share/nvim/mason/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/.local/share/nvim/mason/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.local/share/nvim/mason/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.local/share/nvim/mason/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.local/share/nvim/mason/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/local/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/usr/local/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/usr/local/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/local/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/local/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/local/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/usr/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/usr/lib/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/lib/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/share/cps/SDL3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/share/cps/sdl3.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/lib/cmake/SDL3_ttf/SDL3Config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/usr/lib/cmake/SDL3_ttf/sdl3-config.cmake" + mode: "config" + reason: "no_exist" + found: + path: "/usr/lib/cmake/SDL3/SDL3Config.cmake" + mode: "config" + version: "3.4.10" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + CMAKE_SYSTEM_PREFIX_PATH: + - "/usr/local" + - "/usr" + - "/" + - "/usr" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - + kind: "find_package-v1" + backtrace: + - "tests/loadtests/CMakeLists.txt:30 (find_package)" + name: "assimp" + configs: + - + filename: "assimp.cps" + kind: "cps" + - + filename: "assimpConfig.cmake" + kind: "cmake" + - + filename: "assimp-config.cmake" + kind: "cmake" + version_request: + exact: false + settings: + required: "required_explicit" + quiet: false + global: false + policy_scope: true + bypass_provider: false + names: + - "assimp" + path_suffixes: + - "" + paths: + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + CMAKE_FIND_USE_PACKAGE_ROOT_PATH: true + CMAKE_FIND_USE_CMAKE_PACKAGE_REGISTRY: true + CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY: true + CMAKE_FIND_ROOT_PATH_MODE: "BOTH" + candidates: + - + path: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/pkgRedirects/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/pkgRedirects/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/pkgRedirects/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/pkgRedirects/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/bazecor/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/bazecor/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/bazecor/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/bazecor/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.cargo/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/.cargo/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/.cargo/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.cargo/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/AndroidStudio/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/AndroidStudio/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/AndroidStudio/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/AndroidStudio/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/blender/latest/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/blender/latest/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/blender/latest/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/blender/latest/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/REAPER/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/REAPER/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/REAPER/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/Sources/REAPER/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/opt/resolve/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/opt/resolve/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/opt/resolve/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/opt/resolve/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.opencode/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/.opencode/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/.opencode/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.opencode/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.local/share/nvim/mason/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/.local/share/nvim/mason/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/home/abdelrahman/.local/share/nvim/mason/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/home/abdelrahman/.local/share/nvim/mason/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/local/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/usr/local/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/usr/local/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/local/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/assimpConfig.cmake" + mode: "config" + reason: "no_exist" + - + path: "/usr/assimp-config.cmake" + mode: "config" + reason: "no_exist" + - + path: "/usr/lib/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + - + path: "/usr/share/cps/assimp.cps" + mode: "cps" + reason: "no_exist" + found: + path: "/usr/lib/cmake/assimp-6.0/assimpConfig.cmake" + mode: "config" + version: "6.0.5" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + CMAKE_SYSTEM_PREFIX_PATH: + - "/usr/local" + - "/usr" + - "/" + - "/usr" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/FindDoxygen.cmake:770 (find_program)" + - "/usr/share/cmake/Modules/FindDoxygen.cmake:955 (_Doxygen_find_doxygen)" + - "cmake/docs.cmake:7 (find_package)" + - "CMakeLists.txt:1336 (include)" + mode: "program" + variable: "DOXYGEN_EXECUTABLE" + description: "Doxygen documentation generation tool (https://www.doxygen.nl)" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "doxygen" + candidate_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + - "/usr/local/bin/" + - "/usr/local/sbin/" + - "/usr/local/" + - "/usr/bin/" + - "/usr/sbin/" + - "/usr/" + - "/bin/" + - "/sbin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/bin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/sbin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/" + - "/usr/X11R6/bin/" + - "/usr/X11R6/sbin/" + - "/usr/X11R6/" + - "/usr/pkg/bin/" + - "/usr/pkg/sbin/" + - "/usr/pkg/" + - "/opt/bin/" + - "/opt/sbin/" + - "/opt/" + - "/Applications/Doxygen.app/Contents/Resources/" + - "/Applications/Doxygen.app/Contents/MacOS/" + - "/Applications/Utilities/Doxygen.app/Contents/Resources/" + - "/Applications/Utilities/Doxygen.app/Contents/MacOS/" + searched_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/doxygen" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/doxygen" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/doxygen" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/doxygen" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/doxygen" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/doxygen" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/doxygen" + - "/home/abdelrahman/Sources/bazecor/doxygen" + - "/home/abdelrahman/Sources/bundletool/doxygen" + - "/home/abdelrahman/.yarn/bin/doxygen" + - "/home/abdelrahman/.cargo/bin/doxygen" + - "/home/abdelrahman/Sources/AndroidStudio/bin/doxygen" + - "/home/abdelrahman/Sources/deckboard/doxygen" + - "/home/abdelrahman/Sources/netbeans/bin/doxygen" + - "/home/abdelrahman/Sources/bin/doxygen" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/doxygen" + - "/home/abdelrahman/Sources/ffmpeg_static/doxygen" + - "/home/abdelrahman/.emacs.d/bin/doxygen" + - "/home/abdelrahman/cdtdebugger/doxygen" + - "/home/abdelrahman/Sources/robo3t/bin/doxygen" + - "/home/abdelrahman/Sources/armorpaint/doxygen" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/doxygen" + - "/home/abdelrahman/Sources/shell_scripts/doxygen" + - "/usr/local/go/bin/doxygen" + - "/opt/ArgyllCMS/bin/doxygen" + - "/opt/gaffer/bin/doxygen" + - "/home/abdelrahman/Sources/blender/latest/doxygen" + - "/home/abdelrahman/Sources/REAPER/doxygen" + - "/opt/resolve/bin/doxygen" + - "/home/abdelrahman/.opencode/bin/doxygen" + - "/home/abdelrahman/.fzf/bin/doxygen" + - "/home/abdelrahman/.local/share/nvim/mason/bin/doxygen" + - "/usr/local/sbin/doxygen" + - "/usr/local/bin/doxygen" + found: "/usr/bin/doxygen" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + CMAKE_SYSTEM_PREFIX_PATH: + - "/usr/local" + - "/usr" + - "/" + - "/usr" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/FindDoxygen.cmake:858 (find_program)" + - "/usr/share/cmake/Modules/FindDoxygen.cmake:959 (_Doxygen_find_dot)" + - "cmake/docs.cmake:7 (find_package)" + - "CMakeLists.txt:1336 (include)" + mode: "program" + variable: "DOXYGEN_DOT_EXECUTABLE" + description: "Dot tool for use with Doxygen" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "dot" + candidate_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin/" + - "/home/abdelrahman/.cargo/bin/" + - "/home/abdelrahman/Sources/AndroidStudio/bin/" + - "/home/abdelrahman/Sources/deckboard/" + - "/home/abdelrahman/Sources/netbeans/bin/" + - "/home/abdelrahman/Sources/bin/" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/" + - "/home/abdelrahman/Sources/ffmpeg_static/" + - "/home/abdelrahman/.emacs.d/bin/" + - "/home/abdelrahman/cdtdebugger/" + - "/home/abdelrahman/Sources/robo3t/bin/" + - "/home/abdelrahman/Sources/armorpaint/" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/" + - "/home/abdelrahman/Sources/shell_scripts/" + - "/usr/local/go/bin/" + - "/opt/ArgyllCMS/bin/" + - "/opt/gaffer/bin/" + - "/home/abdelrahman/Sources/blender/latest/" + - "/home/abdelrahman/Sources/REAPER/" + - "/opt/resolve/bin/" + - "/home/abdelrahman/.opencode/bin/" + - "/home/abdelrahman/.fzf/bin/" + - "/home/abdelrahman/.local/share/nvim/mason/bin/" + - "/usr/local/sbin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + - "/home/abdelrahman/.komodoide/12.0/XRE/state/" + - "/home/abdelrahman/.local/bin/" + - "/usr/local/bin/" + - "/usr/local/sbin/" + - "/usr/local/" + - "/usr/bin/" + - "/usr/sbin/" + - "/usr/" + - "/bin/" + - "/sbin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/bin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/sbin/" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/" + - "/usr/X11R6/bin/" + - "/usr/X11R6/sbin/" + - "/usr/X11R6/" + - "/usr/pkg/bin/" + - "/usr/pkg/sbin/" + - "/usr/pkg/" + - "/opt/bin/" + - "/opt/sbin/" + - "/opt/" + - "/ATT/Graphviz/bin/" + - "C:/Program Files/ATT/Graphviz/bin/" + - "/Applications/Graphviz.app/Contents/MacOS/" + - "/Applications/Utilities/Graphviz.app/Contents/MacOS/" + - "/Applications/Doxygen.app/Contents/Resources/" + - "/Applications/Doxygen.app/Contents/MacOS/" + - "/Applications/Utilities/Doxygen.app/Contents/Resources/" + - "/Applications/Utilities/Doxygen.app/Contents/MacOS/" + searched_directories: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/dot" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/sbin/dot" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/dot" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/bin/dot" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/sbin/dot" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader/dot" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin/dot" + - "/home/abdelrahman/Sources/bazecor/dot" + - "/home/abdelrahman/Sources/bundletool/dot" + - "/home/abdelrahman/.yarn/bin/dot" + - "/home/abdelrahman/.cargo/bin/dot" + - "/home/abdelrahman/Sources/AndroidStudio/bin/dot" + - "/home/abdelrahman/Sources/deckboard/dot" + - "/home/abdelrahman/Sources/netbeans/bin/dot" + - "/home/abdelrahman/Sources/bin/dot" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest/dot" + - "/home/abdelrahman/Sources/ffmpeg_static/dot" + - "/home/abdelrahman/.emacs.d/bin/dot" + - "/home/abdelrahman/cdtdebugger/dot" + - "/home/abdelrahman/Sources/robo3t/bin/dot" + - "/home/abdelrahman/Sources/armorpaint/dot" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader/dot" + - "/home/abdelrahman/Sources/shell_scripts/dot" + - "/usr/local/go/bin/dot" + - "/opt/ArgyllCMS/bin/dot" + - "/opt/gaffer/bin/dot" + - "/home/abdelrahman/Sources/blender/latest/dot" + - "/home/abdelrahman/Sources/REAPER/dot" + - "/opt/resolve/bin/dot" + - "/home/abdelrahman/.opencode/bin/dot" + - "/home/abdelrahman/.fzf/bin/dot" + - "/home/abdelrahman/.local/share/nvim/mason/bin/dot" + - "/usr/local/sbin/dot" + - "/usr/local/bin/dot" + found: "/usr/bin/dot" + search_context: + ENV{CMAKE_PREFIX_PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/lib/VulkanLoader" + ENV{PATH}: + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.opencode/bin" + - "/home/abdelrahman/.fzf/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.local/share/nvim/mason/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/Sources/vulkan/1.4.350.1/x86_64/bin" + - "/home/abdelrahman/Sources/bazecor/" + - "/home/abdelrahman/Sources/bundletool/" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/AndroidStudio/bin" + - "/home/abdelrahman/Sources/deckboard" + - "/home/abdelrahman/Sources/netbeans/bin" + - "/home/abdelrahman/Sources/bin" + - "/home/abdelrahman/Sources/ExifTool/ExifTool_latest" + - "/home/abdelrahman/Sources/ffmpeg_static" + - "/home/abdelrahman/.emacs.d/bin" + - "/home/abdelrahman/cdtdebugger" + - "/home/abdelrahman/.cargo/bin" + - "/home/abdelrahman/Sources/robo3t/bin" + - "/home/abdelrahman/Sources/armorpaint" + - "/home/abdelrahman/Sources/shell_scripts/image_downloader" + - "/home/abdelrahman/Sources/shell_scripts" + - "/usr/local/go/bin" + - "/opt/ArgyllCMS/bin" + - "/opt/gaffer/bin" + - "/home/abdelrahman/Sources/blender/latest" + - "/home/abdelrahman/Sources/REAPER" + - "/opt/resolve/bin" + - "/home/abdelrahman/.yarn/bin" + - "/home/abdelrahman/.cargo/bin" + - "/usr/local/sbin" + - "/usr/local/bin" + - "/usr/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - "/home/abdelrahman/.komodoide/12.0/XRE/state" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + - "/home/abdelrahman/.local/bin" + CMAKE_INSTALL_PREFIX: "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + CMAKE_SYSTEM_PREFIX_PATH: + - "/usr/local" + - "/usr" + - "/" + - "/usr" + - "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor" + - "/usr/X11R6" + - "/usr/pkg" + - "/opt" +... diff --git a/ktx/build/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/CMakeFiles/CMakeRuleHashes.txt b/ktx/build/CMakeFiles/CMakeRuleHashes.txt new file mode 100644 index 0000000..989c75a --- /dev/null +++ b/ktx/build/CMakeFiles/CMakeRuleHashes.txt @@ -0,0 +1,48 @@ +# Hashes of file build rules. +838a03ad21b8b81dde374f7bf117b88b /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h +c37a4f225a3e035e6fe67293aaf7244b /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/version.h +31d705fd88c12ace879302a4b49e61df /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/version.h +614154883c2014f6fc1830eadc83054e /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/version.h +9294fe8a8b7a8f94c24c923652469406 /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/version.h +71b7ab2f2fac320bbb4a41368b091ecb /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/version.h +c24b5ab001a3bc79b8b60ca6c32a5fef /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/version.h +c72e9780d97bba2d8afd961a19b341d3 CMakeFiles/Continuous +218504a78c91fc5ad87047c72093ab81 CMakeFiles/ContinuousBuild +42e8e93bc04880d59ffb812ea58b5f65 CMakeFiles/ContinuousConfigure +2c79fec3ca1ef51983d233800316344b CMakeFiles/ContinuousCoverage +17f4924ee63cdf5ba03ac625501e2bca CMakeFiles/ContinuousMemCheck +32baa37d7cba84ee0ea987c9a538bc99 CMakeFiles/ContinuousStart +a46251482c068ab108072601193bc531 CMakeFiles/ContinuousSubmit +b0901cf3aed2ab7f9aab36bcb59b4cfe CMakeFiles/ContinuousTest +46dacf19acb2bf39839004cd2717e51f CMakeFiles/ContinuousUpdate +f231150c81f03c700dd7a58d11473cf1 CMakeFiles/Experimental +52620739a5044a81c243968b15bbc1ae CMakeFiles/ExperimentalBuild +26a6205abb5c5e09fbe741d883e316c7 CMakeFiles/ExperimentalConfigure +95c35f950672b9dfe3e5add4fb5f2252 CMakeFiles/ExperimentalCoverage +91844f340185c1fd064e9a6bc066624f CMakeFiles/ExperimentalMemCheck +a63622b7dae514575448da5c76baf740 CMakeFiles/ExperimentalStart +ac879d7d63b596284ac55080bd023147 CMakeFiles/ExperimentalSubmit +eb066f2084d1534bc52ff59ed0b5aafb CMakeFiles/ExperimentalTest +242f515a805fdaaab9e039f9215f7709 CMakeFiles/ExperimentalUpdate +6a0016765b9d5722d7d94aae9e16abbe CMakeFiles/Nightly +3f42910386ce3e25a3c3365103f08909 CMakeFiles/NightlyBuild +a73be9a993d47161ff84b5656d4c1905 CMakeFiles/NightlyConfigure +40c1cfceec44d4d0789823faad7ac84e CMakeFiles/NightlyCoverage +7bb36dfb75c59b6c011521f6e25aa403 CMakeFiles/NightlyMemCheck +a18e970e9698f62e0e9a616bb3600cdc CMakeFiles/NightlyMemoryCheck +44d298a0faa8ca2c631bdf2a40026bfd CMakeFiles/NightlyStart +837f1ebc8f488dc0783d6304d16c6114 CMakeFiles/NightlySubmit +0c98251d9374dce62c24ea1108c4e6b8 CMakeFiles/NightlyTest +9072f69277d4618522cffab137d752db CMakeFiles/NightlyUpdate +a03adb8535f6db99ee394a1263a8ed4b CMakeFiles/all.doc +1b45672e311a9a00ec5cab898a25db2f CMakeFiles/jswrappers.doc +a03adb8535f6db99ee394a1263a8ed4b CMakeFiles/ktx_version +ed3c6d9d86fc1c0e6b4a209e67fd855e CMakeFiles/ktxpkg.doc +d5711a78b2224116af0294612d958804 CMakeFiles/libktx.doc +0a4e9e55e647c653e3292a52130e3ab9 CMakeFiles/tools.doc +4d816f355a7d522cdc67d9237f84bb9c tools/ktx/CMakeFiles/ktxtools_version +8b9870e6972392c13aca4361f7755dd6 tools/ktx2check/CMakeFiles/ktx2check_version +0bbacacc5e926547198e92a734255dc2 tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version +0e23a72cffb0ac3ae45de8b10971a470 tools/ktxinfo/CMakeFiles/ktxinfo_version +8fca666ccb2a2516fa6848c5716881d0 tools/ktxsc/CMakeFiles/ktxsc_version +f87fae7c4fc907cedab613a16e8bfa46 tools/toktx/CMakeFiles/toktx_version diff --git a/ktx/build/CMakeFiles/CTestScript.cmake b/ktx/build/CMakeFiles/CTestScript.cmake new file mode 100644 index 0000000..1aed464 --- /dev/null +++ b/ktx/build/CMakeFiles/CTestScript.cmake @@ -0,0 +1,167 @@ +# This file is configured by CMake automatically as CTestScript.cmake +# If you choose not to use CMake, this file may be hand configured, by +# filling in the required variables. + +cmake_minimum_required(VERSION 4.3.3) + +# CTest Start Step +set(CTEST_SOURCE_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CTEST_BINARY_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# CTest Update Step +set(CTEST_UPDATE_COMMAND "") +set(CTEST_UPDATE_OPTIONS "") +set(CTEST_UPDATE_VERSION_ONLY "") +set(CTEST_NIGHTLY_START_TIME "00:00:00 EDT") + +# CVS options +set(CTEST_CVS_COMMAND "") +set(CTEST_CVS_UPDATE_OPTIONS "") + +# Subversion options +set(CTEST_SVN_COMMAND "") +set(CTEST_SVN_OPTIONS "") +set(CTEST_SVN_UPDATE_OPTIONS "") + +# Git options +set(CTEST_GIT_COMMAND "") +set(CTEST_GIT_INIT_SUBMODULES "") +set(CTEST_GIT_UPDATE_CUSTOM "") +set(CTEST_GIT_UPDATE_OPTIONS "") + +# Perforce options +set(CTEST_P4_COMMAND "") +set(CTEST_P4_CLIENT "") +set(CTEST_P4_OPTIONS "") +set(CTEST_P4_UPDATE_CUSTOM "") +set(CTEST_P4_UPDATE_OPTIONS "") + +# CTest Configure Step +set(CTEST_CMAKE_GENERATOR "Unix Makefiles") +set(CTEST_LABELS_FOR_SUBPROJECTS "") + +# CTest Build Step +set(CTEST_CONFIGURATION_TYPE "Release") +set(CTEST_USE_LAUNCHERS "") + +# CTest Test Step +set(CTEST_RESOURCE_SPEC_FILE "") +set(CTEST_TEST_LOAD "") +set(CTEST_TEST_TIMEOUT "1500") + +# CTest Coverage Step +set(CTEST_COVERAGE_COMMAND "/usr/bin/gcov") +set(CTEST_COVERAGE_EXTRA_FLAGS "-l") + +# CTest MemCheck Step +set(CTEST_MEMORYCHECK_COMMAND "/usr/bin/valgrind") +set(CTEST_MEMORYCHECK_COMMAND_OPTIONS "") +set(CTEST_MEMORYCHECK_TYPE "") +set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS "") +set(CTEST_MEMORYCHECK_SUPPRESSIONS_FILE "") + +# CTest Submit Step +set(CTEST_SITE "wappdesktop") +set(CTEST_BUILD_NAME "Linux-c++") +set(CTEST_SUBMIT_URL "http://") +set(CTEST_SUBMIT_INACTIVITY_TIMEOUT "") +set(CTEST_TLS_VERIFY "") +set(CTEST_TLS_VERSION "") + +################################################################################ + +if(NOT MODEL) + set(MODEL "Experimental") +endif() + +if(MODEL STREQUAL "NightlyMemoryCheck") + set(MODEL "Nightly") + set(ACTIONS "Start;Update;Configure;Build;MemCheck;Coverage;Submit") +endif() + +if(NOT ACTIONS) + if(MODEL STREQUAL "Experimental") + set(ACTIONS "Start;Configure;Build;Test;Coverage;Submit") + else() + set(ACTIONS "Start;Update;Configure;Build;Test;Coverage;Submit") + endif() +endif() + +################################################################################ + +set(_exit_code 0) + +if("Start" IN_LIST ACTIONS OR NOT EXISTS "${CTEST_BINARY_DIRECTORY}/Testing/TAG") + ctest_start("${MODEL}") +else() + ctest_start("${MODEL}" APPEND) +endif() + +if("Update" IN_LIST ACTIONS) + ctest_update(RETURN_VALUE update_count) + if(update_count LESS 0) + math(EXPR _exit_code "${_exit_code} | 0x01") + endif() + if(MODEL STREQUAL "Continuous" AND update_count EQUAL 0) + return() + endif() +endif() + +if("Configure" IN_LIST ACTIONS) + ctest_configure(RETURN_VALUE success) + if(success LESS 0) + math(EXPR _exit_code "${_exit_code} | 0x02") + endif() +endif() + +if("Build" IN_LIST ACTIONS) + ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}") + ctest_build(RETURN_VALUE success) + if(NOT success EQUAL 0) + math(EXPR _exit_code "${_exit_code} | 0x04") + endif() +endif() + +if("Test" IN_LIST ACTIONS) + ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}") + ctest_test(RETURN_VALUE success) + if(NOT success EQUAL 0) + math(EXPR _exit_code "${_exit_code} | 0x08") + endif() +endif() + +if("Coverage" IN_LIST ACTIONS) + ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}") + ctest_coverage(RETURN_VALUE success) + if(NOT success EQUAL 0) + math(EXPR _exit_code "${_exit_code} | 0x20") + endif() +endif() + +if("MemCheck" IN_LIST ACTIONS) + ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}") + ctest_memcheck(RETURN_VALUE success) + if(NOT success EQUAL 0) + math(EXPR _exit_code "${_exit_code} | 0x10") + endif() +endif() + +file(GLOB notes_files LIST_DIRECTORIES OFF + "${CTEST_BINARY_DIRECTORY}/Testing/Notes/*") +if(notes_files) + list(APPEND CTEST_NOTES_FILES "${notes_files}") +endif() + +if("Submit" IN_LIST ACTIONS) + ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}") + ctest_submit( + RETRY_COUNT "3" + RETRY_DELAY "5" + RETURN_VALUE success + ) + if(NOT success EQUAL 0) + math(EXPR _exit_code "${_exit_code} | 0x40") + endif() +endif() + +cmake_language(EXIT "${_exit_code}") diff --git a/ktx/build/CMakeFiles/Continuous.dir/DependInfo.cmake b/ktx/build/CMakeFiles/Continuous.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/Continuous.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/Continuous.dir/build.make b/ktx/build/CMakeFiles/Continuous.dir/build.make new file mode 100644 index 0000000..b912b8d --- /dev/null +++ b/ktx/build/CMakeFiles/Continuous.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for Continuous. + +# Include any custom commands dependencies for this target. +include CMakeFiles/Continuous.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/Continuous.dir/progress.make + +CMakeFiles/Continuous: + /usr/bin/ctest -DMODEL=Continuous -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/Continuous.dir/codegen: +.PHONY : CMakeFiles/Continuous.dir/codegen + +Continuous: CMakeFiles/Continuous +Continuous: CMakeFiles/Continuous.dir/build.make +.PHONY : Continuous + +# Rule to build all files generated by this target. +CMakeFiles/Continuous.dir/build: Continuous +.PHONY : CMakeFiles/Continuous.dir/build + +CMakeFiles/Continuous.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/Continuous.dir/cmake_clean.cmake +.PHONY : CMakeFiles/Continuous.dir/clean + +CMakeFiles/Continuous.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/Continuous.dir/DependInfo.cmake "--color=$(COLOR)" Continuous +.PHONY : CMakeFiles/Continuous.dir/depend + diff --git a/ktx/build/CMakeFiles/Continuous.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/Continuous.dir/cmake_clean.cmake new file mode 100644 index 0000000..7e1791c --- /dev/null +++ b/ktx/build/CMakeFiles/Continuous.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/Continuous" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/Continuous.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/Continuous.dir/compiler_depend.make b/ktx/build/CMakeFiles/Continuous.dir/compiler_depend.make new file mode 100644 index 0000000..4e014e0 --- /dev/null +++ b/ktx/build/CMakeFiles/Continuous.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for Continuous. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/Continuous.dir/compiler_depend.ts b/ktx/build/CMakeFiles/Continuous.dir/compiler_depend.ts new file mode 100644 index 0000000..8630362 --- /dev/null +++ b/ktx/build/CMakeFiles/Continuous.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for Continuous. diff --git a/ktx/build/CMakeFiles/Continuous.dir/progress.make b/ktx/build/CMakeFiles/Continuous.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/Continuous.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ContinuousBuild.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ContinuousBuild.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousBuild.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ContinuousBuild.dir/build.make b/ktx/build/CMakeFiles/ContinuousBuild.dir/build.make new file mode 100644 index 0000000..5fddb47 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousBuild.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ContinuousBuild. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousBuild.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousBuild.dir/progress.make + +CMakeFiles/ContinuousBuild: + /usr/bin/ctest -DMODEL=Continuous -DACTIONS=Build -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ContinuousBuild.dir/codegen: +.PHONY : CMakeFiles/ContinuousBuild.dir/codegen + +ContinuousBuild: CMakeFiles/ContinuousBuild +ContinuousBuild: CMakeFiles/ContinuousBuild.dir/build.make +.PHONY : ContinuousBuild + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousBuild.dir/build: ContinuousBuild +.PHONY : CMakeFiles/ContinuousBuild.dir/build + +CMakeFiles/ContinuousBuild.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ContinuousBuild.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousBuild.dir/clean + +CMakeFiles/ContinuousBuild.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousBuild.dir/DependInfo.cmake "--color=$(COLOR)" ContinuousBuild +.PHONY : CMakeFiles/ContinuousBuild.dir/depend + diff --git a/ktx/build/CMakeFiles/ContinuousBuild.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ContinuousBuild.dir/cmake_clean.cmake new file mode 100644 index 0000000..afccd13 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousBuild.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousBuild" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousBuild.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ContinuousBuild.dir/compiler_depend.make b/ktx/build/CMakeFiles/ContinuousBuild.dir/compiler_depend.make new file mode 100644 index 0000000..00b62ad --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousBuild.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousBuild. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ContinuousBuild.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ContinuousBuild.dir/compiler_depend.ts new file mode 100644 index 0000000..1cb8618 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousBuild.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousBuild. diff --git a/ktx/build/CMakeFiles/ContinuousBuild.dir/progress.make b/ktx/build/CMakeFiles/ContinuousBuild.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousBuild.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ContinuousConfigure.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ContinuousConfigure.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousConfigure.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ContinuousConfigure.dir/build.make b/ktx/build/CMakeFiles/ContinuousConfigure.dir/build.make new file mode 100644 index 0000000..3b8a0b7 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousConfigure.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ContinuousConfigure. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousConfigure.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousConfigure.dir/progress.make + +CMakeFiles/ContinuousConfigure: + /usr/bin/ctest -DMODEL=Continuous -DACTIONS=Configure -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ContinuousConfigure.dir/codegen: +.PHONY : CMakeFiles/ContinuousConfigure.dir/codegen + +ContinuousConfigure: CMakeFiles/ContinuousConfigure +ContinuousConfigure: CMakeFiles/ContinuousConfigure.dir/build.make +.PHONY : ContinuousConfigure + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousConfigure.dir/build: ContinuousConfigure +.PHONY : CMakeFiles/ContinuousConfigure.dir/build + +CMakeFiles/ContinuousConfigure.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ContinuousConfigure.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousConfigure.dir/clean + +CMakeFiles/ContinuousConfigure.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousConfigure.dir/DependInfo.cmake "--color=$(COLOR)" ContinuousConfigure +.PHONY : CMakeFiles/ContinuousConfigure.dir/depend + diff --git a/ktx/build/CMakeFiles/ContinuousConfigure.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ContinuousConfigure.dir/cmake_clean.cmake new file mode 100644 index 0000000..eb51e20 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousConfigure.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousConfigure" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousConfigure.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.make b/ktx/build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.make new file mode 100644 index 0000000..584c8bb --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousConfigure. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.ts new file mode 100644 index 0000000..c8a3427 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousConfigure.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousConfigure. diff --git a/ktx/build/CMakeFiles/ContinuousConfigure.dir/progress.make b/ktx/build/CMakeFiles/ContinuousConfigure.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousConfigure.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ContinuousCoverage.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ContinuousCoverage.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousCoverage.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ContinuousCoverage.dir/build.make b/ktx/build/CMakeFiles/ContinuousCoverage.dir/build.make new file mode 100644 index 0000000..0f8c310 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousCoverage.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ContinuousCoverage. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousCoverage.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousCoverage.dir/progress.make + +CMakeFiles/ContinuousCoverage: + /usr/bin/ctest -DMODEL=Continuous -DACTIONS=Coverage -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ContinuousCoverage.dir/codegen: +.PHONY : CMakeFiles/ContinuousCoverage.dir/codegen + +ContinuousCoverage: CMakeFiles/ContinuousCoverage +ContinuousCoverage: CMakeFiles/ContinuousCoverage.dir/build.make +.PHONY : ContinuousCoverage + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousCoverage.dir/build: ContinuousCoverage +.PHONY : CMakeFiles/ContinuousCoverage.dir/build + +CMakeFiles/ContinuousCoverage.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ContinuousCoverage.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousCoverage.dir/clean + +CMakeFiles/ContinuousCoverage.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousCoverage.dir/DependInfo.cmake "--color=$(COLOR)" ContinuousCoverage +.PHONY : CMakeFiles/ContinuousCoverage.dir/depend + diff --git a/ktx/build/CMakeFiles/ContinuousCoverage.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ContinuousCoverage.dir/cmake_clean.cmake new file mode 100644 index 0000000..6115f89 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousCoverage.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousCoverage" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousCoverage.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.make b/ktx/build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.make new file mode 100644 index 0000000..8d1a807 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousCoverage. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.ts new file mode 100644 index 0000000..23d476b --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousCoverage.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousCoverage. diff --git a/ktx/build/CMakeFiles/ContinuousCoverage.dir/progress.make b/ktx/build/CMakeFiles/ContinuousCoverage.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousCoverage.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ContinuousMemCheck.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ContinuousMemCheck.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousMemCheck.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ContinuousMemCheck.dir/build.make b/ktx/build/CMakeFiles/ContinuousMemCheck.dir/build.make new file mode 100644 index 0000000..e8b56a6 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousMemCheck.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ContinuousMemCheck. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousMemCheck.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousMemCheck.dir/progress.make + +CMakeFiles/ContinuousMemCheck: + /usr/bin/ctest -DMODEL=Continuous -DACTIONS=MemCheck -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ContinuousMemCheck.dir/codegen: +.PHONY : CMakeFiles/ContinuousMemCheck.dir/codegen + +ContinuousMemCheck: CMakeFiles/ContinuousMemCheck +ContinuousMemCheck: CMakeFiles/ContinuousMemCheck.dir/build.make +.PHONY : ContinuousMemCheck + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousMemCheck.dir/build: ContinuousMemCheck +.PHONY : CMakeFiles/ContinuousMemCheck.dir/build + +CMakeFiles/ContinuousMemCheck.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ContinuousMemCheck.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousMemCheck.dir/clean + +CMakeFiles/ContinuousMemCheck.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousMemCheck.dir/DependInfo.cmake "--color=$(COLOR)" ContinuousMemCheck +.PHONY : CMakeFiles/ContinuousMemCheck.dir/depend + diff --git a/ktx/build/CMakeFiles/ContinuousMemCheck.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ContinuousMemCheck.dir/cmake_clean.cmake new file mode 100644 index 0000000..ad69e7f --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousMemCheck.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousMemCheck" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousMemCheck.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.make b/ktx/build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.make new file mode 100644 index 0000000..930bb61 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousMemCheck. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.ts new file mode 100644 index 0000000..4f4fc23 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousMemCheck.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousMemCheck. diff --git a/ktx/build/CMakeFiles/ContinuousMemCheck.dir/progress.make b/ktx/build/CMakeFiles/ContinuousMemCheck.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousMemCheck.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ContinuousStart.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ContinuousStart.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousStart.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ContinuousStart.dir/build.make b/ktx/build/CMakeFiles/ContinuousStart.dir/build.make new file mode 100644 index 0000000..3186a4e --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousStart.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ContinuousStart. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousStart.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousStart.dir/progress.make + +CMakeFiles/ContinuousStart: + /usr/bin/ctest -DMODEL=Continuous -DACTIONS=Start -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ContinuousStart.dir/codegen: +.PHONY : CMakeFiles/ContinuousStart.dir/codegen + +ContinuousStart: CMakeFiles/ContinuousStart +ContinuousStart: CMakeFiles/ContinuousStart.dir/build.make +.PHONY : ContinuousStart + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousStart.dir/build: ContinuousStart +.PHONY : CMakeFiles/ContinuousStart.dir/build + +CMakeFiles/ContinuousStart.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ContinuousStart.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousStart.dir/clean + +CMakeFiles/ContinuousStart.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousStart.dir/DependInfo.cmake "--color=$(COLOR)" ContinuousStart +.PHONY : CMakeFiles/ContinuousStart.dir/depend + diff --git a/ktx/build/CMakeFiles/ContinuousStart.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ContinuousStart.dir/cmake_clean.cmake new file mode 100644 index 0000000..13d5b2b --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousStart.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousStart" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousStart.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ContinuousStart.dir/compiler_depend.make b/ktx/build/CMakeFiles/ContinuousStart.dir/compiler_depend.make new file mode 100644 index 0000000..af62614 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousStart.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousStart. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ContinuousStart.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ContinuousStart.dir/compiler_depend.ts new file mode 100644 index 0000000..fcc8893 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousStart.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousStart. diff --git a/ktx/build/CMakeFiles/ContinuousStart.dir/progress.make b/ktx/build/CMakeFiles/ContinuousStart.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousStart.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ContinuousSubmit.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ContinuousSubmit.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousSubmit.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ContinuousSubmit.dir/build.make b/ktx/build/CMakeFiles/ContinuousSubmit.dir/build.make new file mode 100644 index 0000000..4efab55 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousSubmit.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ContinuousSubmit. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousSubmit.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousSubmit.dir/progress.make + +CMakeFiles/ContinuousSubmit: + /usr/bin/ctest -DMODEL=Continuous -DACTIONS=Submit -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ContinuousSubmit.dir/codegen: +.PHONY : CMakeFiles/ContinuousSubmit.dir/codegen + +ContinuousSubmit: CMakeFiles/ContinuousSubmit +ContinuousSubmit: CMakeFiles/ContinuousSubmit.dir/build.make +.PHONY : ContinuousSubmit + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousSubmit.dir/build: ContinuousSubmit +.PHONY : CMakeFiles/ContinuousSubmit.dir/build + +CMakeFiles/ContinuousSubmit.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ContinuousSubmit.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousSubmit.dir/clean + +CMakeFiles/ContinuousSubmit.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousSubmit.dir/DependInfo.cmake "--color=$(COLOR)" ContinuousSubmit +.PHONY : CMakeFiles/ContinuousSubmit.dir/depend + diff --git a/ktx/build/CMakeFiles/ContinuousSubmit.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ContinuousSubmit.dir/cmake_clean.cmake new file mode 100644 index 0000000..cc66ba3 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousSubmit.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousSubmit" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousSubmit.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.make b/ktx/build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.make new file mode 100644 index 0000000..3380916 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousSubmit. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.ts new file mode 100644 index 0000000..73d7404 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousSubmit.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousSubmit. diff --git a/ktx/build/CMakeFiles/ContinuousSubmit.dir/progress.make b/ktx/build/CMakeFiles/ContinuousSubmit.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousSubmit.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ContinuousTest.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ContinuousTest.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousTest.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ContinuousTest.dir/build.make b/ktx/build/CMakeFiles/ContinuousTest.dir/build.make new file mode 100644 index 0000000..f544e6c --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousTest.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ContinuousTest. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousTest.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousTest.dir/progress.make + +CMakeFiles/ContinuousTest: + /usr/bin/ctest -DMODEL=Continuous -DACTIONS=Test -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ContinuousTest.dir/codegen: +.PHONY : CMakeFiles/ContinuousTest.dir/codegen + +ContinuousTest: CMakeFiles/ContinuousTest +ContinuousTest: CMakeFiles/ContinuousTest.dir/build.make +.PHONY : ContinuousTest + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousTest.dir/build: ContinuousTest +.PHONY : CMakeFiles/ContinuousTest.dir/build + +CMakeFiles/ContinuousTest.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ContinuousTest.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousTest.dir/clean + +CMakeFiles/ContinuousTest.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousTest.dir/DependInfo.cmake "--color=$(COLOR)" ContinuousTest +.PHONY : CMakeFiles/ContinuousTest.dir/depend + diff --git a/ktx/build/CMakeFiles/ContinuousTest.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ContinuousTest.dir/cmake_clean.cmake new file mode 100644 index 0000000..ff11d48 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousTest.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousTest" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousTest.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ContinuousTest.dir/compiler_depend.make b/ktx/build/CMakeFiles/ContinuousTest.dir/compiler_depend.make new file mode 100644 index 0000000..24d664a --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousTest.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousTest. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ContinuousTest.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ContinuousTest.dir/compiler_depend.ts new file mode 100644 index 0000000..bd7c1d1 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousTest.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousTest. diff --git a/ktx/build/CMakeFiles/ContinuousTest.dir/progress.make b/ktx/build/CMakeFiles/ContinuousTest.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousTest.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ContinuousUpdate.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ContinuousUpdate.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousUpdate.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ContinuousUpdate.dir/build.make b/ktx/build/CMakeFiles/ContinuousUpdate.dir/build.make new file mode 100644 index 0000000..7d00d9e --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousUpdate.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ContinuousUpdate. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ContinuousUpdate.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ContinuousUpdate.dir/progress.make + +CMakeFiles/ContinuousUpdate: + /usr/bin/ctest -DMODEL=Continuous -DACTIONS=Update -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ContinuousUpdate.dir/codegen: +.PHONY : CMakeFiles/ContinuousUpdate.dir/codegen + +ContinuousUpdate: CMakeFiles/ContinuousUpdate +ContinuousUpdate: CMakeFiles/ContinuousUpdate.dir/build.make +.PHONY : ContinuousUpdate + +# Rule to build all files generated by this target. +CMakeFiles/ContinuousUpdate.dir/build: ContinuousUpdate +.PHONY : CMakeFiles/ContinuousUpdate.dir/build + +CMakeFiles/ContinuousUpdate.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ContinuousUpdate.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ContinuousUpdate.dir/clean + +CMakeFiles/ContinuousUpdate.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousUpdate.dir/DependInfo.cmake "--color=$(COLOR)" ContinuousUpdate +.PHONY : CMakeFiles/ContinuousUpdate.dir/depend + diff --git a/ktx/build/CMakeFiles/ContinuousUpdate.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ContinuousUpdate.dir/cmake_clean.cmake new file mode 100644 index 0000000..7a77a24 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousUpdate.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ContinuousUpdate" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ContinuousUpdate.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.make b/ktx/build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.make new file mode 100644 index 0000000..b373226 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ContinuousUpdate. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.ts new file mode 100644 index 0000000..ed8de92 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousUpdate.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ContinuousUpdate. diff --git a/ktx/build/CMakeFiles/ContinuousUpdate.dir/progress.make b/ktx/build/CMakeFiles/ContinuousUpdate.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ContinuousUpdate.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/Experimental.dir/DependInfo.cmake b/ktx/build/CMakeFiles/Experimental.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/Experimental.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/Experimental.dir/build.make b/ktx/build/CMakeFiles/Experimental.dir/build.make new file mode 100644 index 0000000..79831b1 --- /dev/null +++ b/ktx/build/CMakeFiles/Experimental.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for Experimental. + +# Include any custom commands dependencies for this target. +include CMakeFiles/Experimental.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/Experimental.dir/progress.make + +CMakeFiles/Experimental: + /usr/bin/ctest -DMODEL=Experimental -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/Experimental.dir/codegen: +.PHONY : CMakeFiles/Experimental.dir/codegen + +Experimental: CMakeFiles/Experimental +Experimental: CMakeFiles/Experimental.dir/build.make +.PHONY : Experimental + +# Rule to build all files generated by this target. +CMakeFiles/Experimental.dir/build: Experimental +.PHONY : CMakeFiles/Experimental.dir/build + +CMakeFiles/Experimental.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/Experimental.dir/cmake_clean.cmake +.PHONY : CMakeFiles/Experimental.dir/clean + +CMakeFiles/Experimental.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/Experimental.dir/DependInfo.cmake "--color=$(COLOR)" Experimental +.PHONY : CMakeFiles/Experimental.dir/depend + diff --git a/ktx/build/CMakeFiles/Experimental.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/Experimental.dir/cmake_clean.cmake new file mode 100644 index 0000000..799e708 --- /dev/null +++ b/ktx/build/CMakeFiles/Experimental.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/Experimental" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/Experimental.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/Experimental.dir/compiler_depend.make b/ktx/build/CMakeFiles/Experimental.dir/compiler_depend.make new file mode 100644 index 0000000..df83d58 --- /dev/null +++ b/ktx/build/CMakeFiles/Experimental.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for Experimental. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/Experimental.dir/compiler_depend.ts b/ktx/build/CMakeFiles/Experimental.dir/compiler_depend.ts new file mode 100644 index 0000000..2619b9b --- /dev/null +++ b/ktx/build/CMakeFiles/Experimental.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for Experimental. diff --git a/ktx/build/CMakeFiles/Experimental.dir/progress.make b/ktx/build/CMakeFiles/Experimental.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/Experimental.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ExperimentalBuild.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ExperimentalBuild.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalBuild.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ExperimentalBuild.dir/build.make b/ktx/build/CMakeFiles/ExperimentalBuild.dir/build.make new file mode 100644 index 0000000..8caf971 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalBuild.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ExperimentalBuild. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalBuild.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalBuild.dir/progress.make + +CMakeFiles/ExperimentalBuild: + /usr/bin/ctest -DMODEL=Experimental -DACTIONS=Build -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ExperimentalBuild.dir/codegen: +.PHONY : CMakeFiles/ExperimentalBuild.dir/codegen + +ExperimentalBuild: CMakeFiles/ExperimentalBuild +ExperimentalBuild: CMakeFiles/ExperimentalBuild.dir/build.make +.PHONY : ExperimentalBuild + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalBuild.dir/build: ExperimentalBuild +.PHONY : CMakeFiles/ExperimentalBuild.dir/build + +CMakeFiles/ExperimentalBuild.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ExperimentalBuild.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalBuild.dir/clean + +CMakeFiles/ExperimentalBuild.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalBuild.dir/DependInfo.cmake "--color=$(COLOR)" ExperimentalBuild +.PHONY : CMakeFiles/ExperimentalBuild.dir/depend + diff --git a/ktx/build/CMakeFiles/ExperimentalBuild.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ExperimentalBuild.dir/cmake_clean.cmake new file mode 100644 index 0000000..3354e3f --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalBuild.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalBuild" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalBuild.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.make b/ktx/build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.make new file mode 100644 index 0000000..7608631 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalBuild. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.ts new file mode 100644 index 0000000..34d9160 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalBuild.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalBuild. diff --git a/ktx/build/CMakeFiles/ExperimentalBuild.dir/progress.make b/ktx/build/CMakeFiles/ExperimentalBuild.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalBuild.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ExperimentalConfigure.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ExperimentalConfigure.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalConfigure.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ExperimentalConfigure.dir/build.make b/ktx/build/CMakeFiles/ExperimentalConfigure.dir/build.make new file mode 100644 index 0000000..6e41254 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalConfigure.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ExperimentalConfigure. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalConfigure.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalConfigure.dir/progress.make + +CMakeFiles/ExperimentalConfigure: + /usr/bin/ctest -DMODEL=Experimental -DACTIONS=Configure -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ExperimentalConfigure.dir/codegen: +.PHONY : CMakeFiles/ExperimentalConfigure.dir/codegen + +ExperimentalConfigure: CMakeFiles/ExperimentalConfigure +ExperimentalConfigure: CMakeFiles/ExperimentalConfigure.dir/build.make +.PHONY : ExperimentalConfigure + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalConfigure.dir/build: ExperimentalConfigure +.PHONY : CMakeFiles/ExperimentalConfigure.dir/build + +CMakeFiles/ExperimentalConfigure.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ExperimentalConfigure.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalConfigure.dir/clean + +CMakeFiles/ExperimentalConfigure.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalConfigure.dir/DependInfo.cmake "--color=$(COLOR)" ExperimentalConfigure +.PHONY : CMakeFiles/ExperimentalConfigure.dir/depend + diff --git a/ktx/build/CMakeFiles/ExperimentalConfigure.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ExperimentalConfigure.dir/cmake_clean.cmake new file mode 100644 index 0000000..69e4a71 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalConfigure.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalConfigure" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalConfigure.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.make b/ktx/build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.make new file mode 100644 index 0000000..0738796 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalConfigure. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.ts new file mode 100644 index 0000000..51fc32c --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalConfigure.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalConfigure. diff --git a/ktx/build/CMakeFiles/ExperimentalConfigure.dir/progress.make b/ktx/build/CMakeFiles/ExperimentalConfigure.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalConfigure.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ExperimentalCoverage.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ExperimentalCoverage.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalCoverage.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ExperimentalCoverage.dir/build.make b/ktx/build/CMakeFiles/ExperimentalCoverage.dir/build.make new file mode 100644 index 0000000..a1f6d1c --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalCoverage.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ExperimentalCoverage. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalCoverage.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalCoverage.dir/progress.make + +CMakeFiles/ExperimentalCoverage: + /usr/bin/ctest -DMODEL=Experimental -DACTIONS=Coverage -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ExperimentalCoverage.dir/codegen: +.PHONY : CMakeFiles/ExperimentalCoverage.dir/codegen + +ExperimentalCoverage: CMakeFiles/ExperimentalCoverage +ExperimentalCoverage: CMakeFiles/ExperimentalCoverage.dir/build.make +.PHONY : ExperimentalCoverage + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalCoverage.dir/build: ExperimentalCoverage +.PHONY : CMakeFiles/ExperimentalCoverage.dir/build + +CMakeFiles/ExperimentalCoverage.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ExperimentalCoverage.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalCoverage.dir/clean + +CMakeFiles/ExperimentalCoverage.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalCoverage.dir/DependInfo.cmake "--color=$(COLOR)" ExperimentalCoverage +.PHONY : CMakeFiles/ExperimentalCoverage.dir/depend + diff --git a/ktx/build/CMakeFiles/ExperimentalCoverage.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ExperimentalCoverage.dir/cmake_clean.cmake new file mode 100644 index 0000000..b8d6597 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalCoverage.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalCoverage" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalCoverage.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.make b/ktx/build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.make new file mode 100644 index 0000000..4c327cb --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalCoverage. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.ts new file mode 100644 index 0000000..d3bffd3 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalCoverage.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalCoverage. diff --git a/ktx/build/CMakeFiles/ExperimentalCoverage.dir/progress.make b/ktx/build/CMakeFiles/ExperimentalCoverage.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalCoverage.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/build.make b/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/build.make new file mode 100644 index 0000000..7f8dbe6 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ExperimentalMemCheck. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalMemCheck.dir/progress.make + +CMakeFiles/ExperimentalMemCheck: + /usr/bin/ctest -DMODEL=Experimental -DACTIONS=MemCheck -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ExperimentalMemCheck.dir/codegen: +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/codegen + +ExperimentalMemCheck: CMakeFiles/ExperimentalMemCheck +ExperimentalMemCheck: CMakeFiles/ExperimentalMemCheck.dir/build.make +.PHONY : ExperimentalMemCheck + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalMemCheck.dir/build: ExperimentalMemCheck +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/build + +CMakeFiles/ExperimentalMemCheck.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ExperimentalMemCheck.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/clean + +CMakeFiles/ExperimentalMemCheck.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/DependInfo.cmake "--color=$(COLOR)" ExperimentalMemCheck +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/depend + diff --git a/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/cmake_clean.cmake new file mode 100644 index 0000000..ed3f7bc --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalMemCheck" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalMemCheck.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.make b/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.make new file mode 100644 index 0000000..ab194c2 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalMemCheck. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.ts new file mode 100644 index 0000000..5d0d9ac --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalMemCheck. diff --git a/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/progress.make b/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalMemCheck.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ExperimentalStart.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ExperimentalStart.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalStart.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ExperimentalStart.dir/build.make b/ktx/build/CMakeFiles/ExperimentalStart.dir/build.make new file mode 100644 index 0000000..c2613e8 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalStart.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ExperimentalStart. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalStart.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalStart.dir/progress.make + +CMakeFiles/ExperimentalStart: + /usr/bin/ctest -DMODEL=Experimental -DACTIONS=Start -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ExperimentalStart.dir/codegen: +.PHONY : CMakeFiles/ExperimentalStart.dir/codegen + +ExperimentalStart: CMakeFiles/ExperimentalStart +ExperimentalStart: CMakeFiles/ExperimentalStart.dir/build.make +.PHONY : ExperimentalStart + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalStart.dir/build: ExperimentalStart +.PHONY : CMakeFiles/ExperimentalStart.dir/build + +CMakeFiles/ExperimentalStart.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ExperimentalStart.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalStart.dir/clean + +CMakeFiles/ExperimentalStart.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalStart.dir/DependInfo.cmake "--color=$(COLOR)" ExperimentalStart +.PHONY : CMakeFiles/ExperimentalStart.dir/depend + diff --git a/ktx/build/CMakeFiles/ExperimentalStart.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ExperimentalStart.dir/cmake_clean.cmake new file mode 100644 index 0000000..4e2736b --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalStart.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalStart" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalStart.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ExperimentalStart.dir/compiler_depend.make b/ktx/build/CMakeFiles/ExperimentalStart.dir/compiler_depend.make new file mode 100644 index 0000000..29aab51 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalStart.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalStart. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ExperimentalStart.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ExperimentalStart.dir/compiler_depend.ts new file mode 100644 index 0000000..a636e5c --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalStart.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalStart. diff --git a/ktx/build/CMakeFiles/ExperimentalStart.dir/progress.make b/ktx/build/CMakeFiles/ExperimentalStart.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalStart.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ExperimentalSubmit.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ExperimentalSubmit.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalSubmit.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ExperimentalSubmit.dir/build.make b/ktx/build/CMakeFiles/ExperimentalSubmit.dir/build.make new file mode 100644 index 0000000..356154e --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalSubmit.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ExperimentalSubmit. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalSubmit.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalSubmit.dir/progress.make + +CMakeFiles/ExperimentalSubmit: + /usr/bin/ctest -DMODEL=Experimental -DACTIONS=Submit -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ExperimentalSubmit.dir/codegen: +.PHONY : CMakeFiles/ExperimentalSubmit.dir/codegen + +ExperimentalSubmit: CMakeFiles/ExperimentalSubmit +ExperimentalSubmit: CMakeFiles/ExperimentalSubmit.dir/build.make +.PHONY : ExperimentalSubmit + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalSubmit.dir/build: ExperimentalSubmit +.PHONY : CMakeFiles/ExperimentalSubmit.dir/build + +CMakeFiles/ExperimentalSubmit.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ExperimentalSubmit.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalSubmit.dir/clean + +CMakeFiles/ExperimentalSubmit.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalSubmit.dir/DependInfo.cmake "--color=$(COLOR)" ExperimentalSubmit +.PHONY : CMakeFiles/ExperimentalSubmit.dir/depend + diff --git a/ktx/build/CMakeFiles/ExperimentalSubmit.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ExperimentalSubmit.dir/cmake_clean.cmake new file mode 100644 index 0000000..d130e45 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalSubmit.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalSubmit" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalSubmit.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.make b/ktx/build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.make new file mode 100644 index 0000000..4440172 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalSubmit. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.ts new file mode 100644 index 0000000..7fa97b1 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalSubmit.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalSubmit. diff --git a/ktx/build/CMakeFiles/ExperimentalSubmit.dir/progress.make b/ktx/build/CMakeFiles/ExperimentalSubmit.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalSubmit.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ExperimentalTest.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ExperimentalTest.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalTest.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ExperimentalTest.dir/build.make b/ktx/build/CMakeFiles/ExperimentalTest.dir/build.make new file mode 100644 index 0000000..70502fe --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalTest.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ExperimentalTest. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalTest.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalTest.dir/progress.make + +CMakeFiles/ExperimentalTest: + /usr/bin/ctest -DMODEL=Experimental -DACTIONS=Test -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ExperimentalTest.dir/codegen: +.PHONY : CMakeFiles/ExperimentalTest.dir/codegen + +ExperimentalTest: CMakeFiles/ExperimentalTest +ExperimentalTest: CMakeFiles/ExperimentalTest.dir/build.make +.PHONY : ExperimentalTest + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalTest.dir/build: ExperimentalTest +.PHONY : CMakeFiles/ExperimentalTest.dir/build + +CMakeFiles/ExperimentalTest.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ExperimentalTest.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalTest.dir/clean + +CMakeFiles/ExperimentalTest.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalTest.dir/DependInfo.cmake "--color=$(COLOR)" ExperimentalTest +.PHONY : CMakeFiles/ExperimentalTest.dir/depend + diff --git a/ktx/build/CMakeFiles/ExperimentalTest.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ExperimentalTest.dir/cmake_clean.cmake new file mode 100644 index 0000000..4348aa3 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalTest.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalTest" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalTest.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ExperimentalTest.dir/compiler_depend.make b/ktx/build/CMakeFiles/ExperimentalTest.dir/compiler_depend.make new file mode 100644 index 0000000..fab28a9 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalTest.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalTest. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ExperimentalTest.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ExperimentalTest.dir/compiler_depend.ts new file mode 100644 index 0000000..fbeb091 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalTest.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalTest. diff --git a/ktx/build/CMakeFiles/ExperimentalTest.dir/progress.make b/ktx/build/CMakeFiles/ExperimentalTest.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalTest.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/ExperimentalUpdate.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ExperimentalUpdate.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalUpdate.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ExperimentalUpdate.dir/build.make b/ktx/build/CMakeFiles/ExperimentalUpdate.dir/build.make new file mode 100644 index 0000000..28866ea --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalUpdate.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ExperimentalUpdate. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ExperimentalUpdate.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ExperimentalUpdate.dir/progress.make + +CMakeFiles/ExperimentalUpdate: + /usr/bin/ctest -DMODEL=Experimental -DACTIONS=Update -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/ExperimentalUpdate.dir/codegen: +.PHONY : CMakeFiles/ExperimentalUpdate.dir/codegen + +ExperimentalUpdate: CMakeFiles/ExperimentalUpdate +ExperimentalUpdate: CMakeFiles/ExperimentalUpdate.dir/build.make +.PHONY : ExperimentalUpdate + +# Rule to build all files generated by this target. +CMakeFiles/ExperimentalUpdate.dir/build: ExperimentalUpdate +.PHONY : CMakeFiles/ExperimentalUpdate.dir/build + +CMakeFiles/ExperimentalUpdate.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ExperimentalUpdate.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ExperimentalUpdate.dir/clean + +CMakeFiles/ExperimentalUpdate.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalUpdate.dir/DependInfo.cmake "--color=$(COLOR)" ExperimentalUpdate +.PHONY : CMakeFiles/ExperimentalUpdate.dir/depend + diff --git a/ktx/build/CMakeFiles/ExperimentalUpdate.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ExperimentalUpdate.dir/cmake_clean.cmake new file mode 100644 index 0000000..2319049 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalUpdate.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ExperimentalUpdate" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ExperimentalUpdate.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.make b/ktx/build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.make new file mode 100644 index 0000000..30e8f2c --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ExperimentalUpdate. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.ts new file mode 100644 index 0000000..aa7a97e --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalUpdate.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ExperimentalUpdate. diff --git a/ktx/build/CMakeFiles/ExperimentalUpdate.dir/progress.make b/ktx/build/CMakeFiles/ExperimentalUpdate.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/ExperimentalUpdate.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/Export/eb899b7ebdca6f1dd2b833b33a58189b/KtxTargets-release.cmake b/ktx/build/CMakeFiles/Export/eb899b7ebdca6f1dd2b833b33a58189b/KtxTargets-release.cmake new file mode 100644 index 0000000..9315506 --- /dev/null +++ b/ktx/build/CMakeFiles/Export/eb899b7ebdca6f1dd2b833b33a58189b/KtxTargets-release.cmake @@ -0,0 +1,19 @@ +#---------------------------------------------------------------- +# Generated CMake target import file for configuration "Release". +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Import target "KTX::ktx" for configuration "Release" +set_property(TARGET KTX::ktx APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) +set_target_properties(KTX::ktx PROPERTIES + IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libktx.so.0.0.0" + IMPORTED_SONAME_RELEASE "libktx.so.0" + ) + +list(APPEND _cmake_import_check_targets KTX::ktx ) +list(APPEND _cmake_import_check_files_for_KTX::ktx "${_IMPORT_PREFIX}/lib/libktx.so.0.0.0" ) + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) diff --git a/ktx/build/CMakeFiles/Export/eb899b7ebdca6f1dd2b833b33a58189b/KtxTargets.cmake b/ktx/build/CMakeFiles/Export/eb899b7ebdca6f1dd2b833b33a58189b/KtxTargets.cmake new file mode 100644 index 0000000..1ebd755 --- /dev/null +++ b/ktx/build/CMakeFiles/Export/eb899b7ebdca6f1dd2b833b33a58189b/KtxTargets.cmake @@ -0,0 +1,108 @@ +# Generated by CMake + +if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.8) + message(FATAL_ERROR "CMake >= 2.8.3 required") +endif() +if(CMAKE_VERSION VERSION_LESS "2.8.3") + message(FATAL_ERROR "CMake >= 2.8.3 required") +endif() +cmake_policy(PUSH) +cmake_policy(VERSION 2.8.3...4.1) +#---------------------------------------------------------------- +# Generated CMake target import file. +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Protect against multiple inclusion, which would fail when already imported targets are added once more. +set(_cmake_targets_defined "") +set(_cmake_targets_not_defined "") +set(_cmake_expected_targets "") +foreach(_cmake_expected_target IN ITEMS KTX::ktx) + list(APPEND _cmake_expected_targets "${_cmake_expected_target}") + if(TARGET "${_cmake_expected_target}") + list(APPEND _cmake_targets_defined "${_cmake_expected_target}") + else() + list(APPEND _cmake_targets_not_defined "${_cmake_expected_target}") + endif() +endforeach() +unset(_cmake_expected_target) +if(_cmake_targets_defined STREQUAL _cmake_expected_targets) + unset(_cmake_targets_defined) + unset(_cmake_targets_not_defined) + unset(_cmake_expected_targets) + unset(CMAKE_IMPORT_FILE_VERSION) + cmake_policy(POP) + return() +endif() +if(NOT _cmake_targets_defined STREQUAL "") + string(REPLACE ";" ", " _cmake_targets_defined_text "${_cmake_targets_defined}") + string(REPLACE ";" ", " _cmake_targets_not_defined_text "${_cmake_targets_not_defined}") + message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_cmake_targets_defined_text}\nTargets not yet defined: ${_cmake_targets_not_defined_text}\n") +endif() +unset(_cmake_targets_defined) +unset(_cmake_targets_not_defined) +unset(_cmake_expected_targets) + + +# Compute the installation prefix relative to this file. +get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +if(_IMPORT_PREFIX STREQUAL "/") + set(_IMPORT_PREFIX "") +endif() + +# Create imported target KTX::ktx +add_library(KTX::ktx SHARED IMPORTED) + +set_target_properties(KTX::ktx PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "\$<\$:_DEBUG;DEBUG>;KTX_FEATURE_KTX1;KTX_FEATURE_KTX2;KTX_FEATURE_WRITE" + INTERFACE_COMPILE_FEATURES "c_std_11;cxx_std_11" + INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include" +) + +# Load information for each installed configuration. +file(GLOB _cmake_config_files "${CMAKE_CURRENT_LIST_DIR}/KtxTargets-*.cmake") +foreach(_cmake_config_file IN LISTS _cmake_config_files) + include("${_cmake_config_file}") +endforeach() +unset(_cmake_config_file) +unset(_cmake_config_files) + +# Cleanup temporary variables. +set(_IMPORT_PREFIX) + +# Loop over all imported files and verify that they actually exist +foreach(_cmake_target IN LISTS _cmake_import_check_targets) + if(CMAKE_VERSION VERSION_LESS "3.28" + OR NOT DEFINED _cmake_import_check_xcframework_for_${_cmake_target} + OR NOT IS_DIRECTORY "${_cmake_import_check_xcframework_for_${_cmake_target}}") + foreach(_cmake_file IN LISTS "_cmake_import_check_files_for_${_cmake_target}") + if(NOT EXISTS "${_cmake_file}") + message(FATAL_ERROR "The imported target \"${_cmake_target}\" references the file + \"${_cmake_file}\" +but this file does not exist. Possible reasons include: +* The file was deleted, renamed, or moved to another location. +* An install or uninstall procedure did not complete successfully. +* The installation package was faulty and contained + \"${CMAKE_CURRENT_LIST_FILE}\" +but not all the files it references. +") + endif() + endforeach() + endif() + unset(_cmake_file) + unset("_cmake_import_check_files_for_${_cmake_target}") +endforeach() +unset(_cmake_target) +unset(_cmake_import_check_targets) + +# This file does not depend on other imported targets which have +# been exported from the same project but in a separate export set. + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) +cmake_policy(POP) diff --git a/ktx/build/CMakeFiles/InstallScripts.json b/ktx/build/CMakeFiles/InstallScripts.json new file mode 100644 index 0000000..65d2291 --- /dev/null +++ b/ktx/build/CMakeFiles/InstallScripts.json @@ -0,0 +1,27 @@ +{ + "InstallScripts" : + [ + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/cmake_install.cmake", + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/cmake_install.cmake" + ], + "Parallel" : false +} diff --git a/ktx/build/CMakeFiles/Makefile.cmake b/ktx/build/CMakeFiles/Makefile.cmake new file mode 100644 index 0000000..18ffd40 --- /dev/null +++ b/ktx/build/CMakeFiles/Makefile.cmake @@ -0,0 +1,232 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# The generator used is: +set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") + +# The top level Makefile was generated from the following files: +set(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/CMakeLists.txt" + "CMakeDoxyfile.in" + "CMakeDoxygenDefaults.cmake" + "CMakeFiles/4.3.3/CMakeCCompiler.cmake" + "CMakeFiles/4.3.3/CMakeCXXCompiler.cmake" + "CMakeFiles/4.3.3/CMakeSystem.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/codesign.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/cputypetest.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/docs.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/modules/FindBash.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/modules/GetGitRevisionDescription.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/version.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/cmake_compiler.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/cmake_core.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/cmake/cxxopts.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/support/cmake/JoinPaths.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/tests.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/CMakeLists.txt" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/CMakeLists.txt" + "/usr/lib/cmake/SDL3/SDL3Config.cmake" + "/usr/lib/cmake/SDL3/SDL3ConfigVersion.cmake" + "/usr/lib/cmake/SDL3/SDL3headersTargets.cmake" + "/usr/lib/cmake/SDL3/SDL3sharedTargets-none.cmake" + "/usr/lib/cmake/SDL3/SDL3sharedTargets.cmake" + "/usr/lib/cmake/SDL3/SDL3testTargets-none.cmake" + "/usr/lib/cmake/SDL3/SDL3testTargets.cmake" + "/usr/lib/cmake/assimp-6.0/assimpConfig.cmake" + "/usr/lib/cmake/assimp-6.0/assimpConfigVersion.cmake" + "/usr/lib/cmake/assimp-6.0/assimpTargets-release.cmake" + "/usr/lib/cmake/assimp-6.0/assimpTargets.cmake" + "/usr/share/cmake/Modules/BasicConfigVersion-SameMajorVersion.cmake.in" + "/usr/share/cmake/Modules/CMakeCInformation.cmake" + "/usr/share/cmake/Modules/CMakeCXXInformation.cmake" + "/usr/share/cmake/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake" + "/usr/share/cmake/Modules/CMakeCommonLanguageInclude.cmake" + "/usr/share/cmake/Modules/CMakeDependentOption.cmake" + "/usr/share/cmake/Modules/CMakeGenericSystem.cmake" + "/usr/share/cmake/Modules/CMakeInitializeConfigs.cmake" + "/usr/share/cmake/Modules/CMakeLanguageInformation.cmake" + "/usr/share/cmake/Modules/CMakePackageConfigHelpers.cmake" + "/usr/share/cmake/Modules/CMakeParseArguments.cmake" + "/usr/share/cmake/Modules/CMakePrintHelpers.cmake" + "/usr/share/cmake/Modules/CMakeSystemSpecificInformation.cmake" + "/usr/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake" + "/usr/share/cmake/Modules/CPack.cmake" + "/usr/share/cmake/Modules/CPackComponent.cmake" + "/usr/share/cmake/Modules/CTest.cmake" + "/usr/share/cmake/Modules/CTestTargets.cmake" + "/usr/share/cmake/Modules/CTestUseLaunchers.cmake" + "/usr/share/cmake/Modules/CheckCSourceCompiles.cmake" + "/usr/share/cmake/Modules/CheckCXXCompilerFlag.cmake" + "/usr/share/cmake/Modules/CheckCXXSourceCompiles.cmake" + "/usr/share/cmake/Modules/CheckIncludeFile.cmake" + "/usr/share/cmake/Modules/CheckLibraryExists.cmake" + "/usr/share/cmake/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + "/usr/share/cmake/Modules/Compiler/GNU-C.cmake" + "/usr/share/cmake/Modules/Compiler/GNU-CXX.cmake" + "/usr/share/cmake/Modules/Compiler/GNU.cmake" + "/usr/share/cmake/Modules/DartConfiguration.tcl.in" + "/usr/share/cmake/Modules/FeatureSummary.cmake" + "/usr/share/cmake/Modules/FindDoxygen.cmake" + "/usr/share/cmake/Modules/FindGit.cmake" + "/usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake" + "/usr/share/cmake/Modules/FindPackageMessage.cmake" + "/usr/share/cmake/Modules/FindPkgConfig.cmake" + "/usr/share/cmake/Modules/FindThreads.cmake" + "/usr/share/cmake/Modules/GNUInstallDirs.cmake" + "/usr/share/cmake/Modules/GoogleTest.cmake" + "/usr/share/cmake/Modules/Internal/CMakeCLinkerInformation.cmake" + "/usr/share/cmake/Modules/Internal/CMakeCXXLinkerInformation.cmake" + "/usr/share/cmake/Modules/Internal/CMakeCommonLinkerInformation.cmake" + "/usr/share/cmake/Modules/Internal/CheckCompilerFlag.cmake" + "/usr/share/cmake/Modules/Internal/CheckFlagCommonConfig.cmake" + "/usr/share/cmake/Modules/Internal/CheckSourceCompiles.cmake" + "/usr/share/cmake/Modules/Linker/GNU-C.cmake" + "/usr/share/cmake/Modules/Linker/GNU-CXX.cmake" + "/usr/share/cmake/Modules/Linker/GNU.cmake" + "/usr/share/cmake/Modules/Platform/Linker/GNU.cmake" + "/usr/share/cmake/Modules/Platform/Linker/Linux-GNU-C.cmake" + "/usr/share/cmake/Modules/Platform/Linker/Linux-GNU-CXX.cmake" + "/usr/share/cmake/Modules/Platform/Linker/Linux-GNU.cmake" + "/usr/share/cmake/Modules/Platform/Linux-GNU-C.cmake" + "/usr/share/cmake/Modules/Platform/Linux-GNU-CXX.cmake" + "/usr/share/cmake/Modules/Platform/Linux-GNU.cmake" + "/usr/share/cmake/Modules/Platform/Linux-Initialize.cmake" + "/usr/share/cmake/Modules/Platform/Linux.cmake" + "/usr/share/cmake/Modules/Platform/UnixPaths.cmake" + "/usr/share/cmake/Modules/WriteBasicConfigVersionFile.cmake" + "/usr/share/cmake/Templates/CPackConfig.cmake.in" + "/usr/share/cmake/Templates/CTestScript.cmake.in" + ) + +# The corresponding makefile is: +set(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +set(CMAKE_MAKEFILE_PRODUCTS + "DartConfiguration.tcl" + "CMakeFiles/CTestScript.cmake" + "Doxyfile.libktx.doc" + "Doxyfile.tools.doc" + "Doxyfile.jswrappers.doc" + "Doxyfile.ktxpkg.doc" + "KtxConfigVersion.cmake" + "CPackConfig.cmake" + "CPackSourceConfig.cmake" + "CMakeFiles/CMakeDirectoryInformation.cmake" + "interface/basisu_c_binding/CMakeFiles/CMakeDirectoryInformation.cmake" + "external/astc-encoder/DartConfiguration.tcl" + "external/astc-encoder/CMakeFiles/CTestScript.cmake" + "external/astc-encoder/CMakeFiles/CMakeDirectoryInformation.cmake" + "external/astc-encoder/Source/CMakeFiles/CMakeDirectoryInformation.cmake" + "external/fmt/CMakeFiles/CMakeDirectoryInformation.cmake" + "external/cxxopts/CMakeFiles/CMakeDirectoryInformation.cmake" + "external/cxxopts/include/CMakeFiles/CMakeDirectoryInformation.cmake" + "tools/CMakeFiles/CMakeDirectoryInformation.cmake" + "tools/imageio/CMakeFiles/CMakeDirectoryInformation.cmake" + "tools/ktx/CMakeFiles/CMakeDirectoryInformation.cmake" + "tools/ktx2check/CMakeFiles/CMakeDirectoryInformation.cmake" + "tools/ktx2ktx2/CMakeFiles/CMakeDirectoryInformation.cmake" + "tools/ktxinfo/CMakeFiles/CMakeDirectoryInformation.cmake" + "tools/ktxsc/CMakeFiles/CMakeDirectoryInformation.cmake" + "tools/toktx/CMakeFiles/CMakeDirectoryInformation.cmake" + "tests/unittests[1]_include.cmake" + "tests/texturetests[1]_include.cmake" + "tests/CMakeFiles/CMakeDirectoryInformation.cmake" + "tests/loadtests/CMakeFiles/CMakeDirectoryInformation.cmake" + "tests/ktxdiff/CMakeFiles/CMakeDirectoryInformation.cmake" + "tests/gtest/CMakeFiles/CMakeDirectoryInformation.cmake" + "tests/transcodetests/transcodetests[1]_include.cmake" + "tests/transcodetests/CMakeFiles/CMakeDirectoryInformation.cmake" + "tests/streamtests/streamtests[1]_include.cmake" + "tests/streamtests/CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +set(CMAKE_DEPEND_INFO_FILES + "CMakeFiles/Experimental.dir/DependInfo.cmake" + "CMakeFiles/Nightly.dir/DependInfo.cmake" + "CMakeFiles/Continuous.dir/DependInfo.cmake" + "CMakeFiles/NightlyMemoryCheck.dir/DependInfo.cmake" + "CMakeFiles/NightlyStart.dir/DependInfo.cmake" + "CMakeFiles/NightlyUpdate.dir/DependInfo.cmake" + "CMakeFiles/NightlyConfigure.dir/DependInfo.cmake" + "CMakeFiles/NightlyBuild.dir/DependInfo.cmake" + "CMakeFiles/NightlyTest.dir/DependInfo.cmake" + "CMakeFiles/NightlyCoverage.dir/DependInfo.cmake" + "CMakeFiles/NightlyMemCheck.dir/DependInfo.cmake" + "CMakeFiles/NightlySubmit.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalStart.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalUpdate.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalConfigure.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalBuild.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalTest.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalCoverage.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalMemCheck.dir/DependInfo.cmake" + "CMakeFiles/ExperimentalSubmit.dir/DependInfo.cmake" + "CMakeFiles/ContinuousStart.dir/DependInfo.cmake" + "CMakeFiles/ContinuousUpdate.dir/DependInfo.cmake" + "CMakeFiles/ContinuousConfigure.dir/DependInfo.cmake" + "CMakeFiles/ContinuousBuild.dir/DependInfo.cmake" + "CMakeFiles/ContinuousTest.dir/DependInfo.cmake" + "CMakeFiles/ContinuousCoverage.dir/DependInfo.cmake" + "CMakeFiles/ContinuousMemCheck.dir/DependInfo.cmake" + "CMakeFiles/ContinuousSubmit.dir/DependInfo.cmake" + "CMakeFiles/ktx.dir/DependInfo.cmake" + "CMakeFiles/ktx_read.dir/DependInfo.cmake" + "CMakeFiles/ktx_version.dir/DependInfo.cmake" + "CMakeFiles/objUtil.dir/DependInfo.cmake" + "CMakeFiles/libktx.doc.dir/DependInfo.cmake" + "CMakeFiles/tools.doc.dir/DependInfo.cmake" + "CMakeFiles/jswrappers.doc.dir/DependInfo.cmake" + "CMakeFiles/ktxpkg.doc.dir/DependInfo.cmake" + "CMakeFiles/all.doc.dir/DependInfo.cmake" + "interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/DependInfo.cmake" + "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/DependInfo.cmake" + "external/fmt/CMakeFiles/fmt.dir/DependInfo.cmake" + "tools/imageio/CMakeFiles/imageio.dir/DependInfo.cmake" + "tools/ktx/CMakeFiles/ktxtools.dir/DependInfo.cmake" + "tools/ktx/CMakeFiles/ktxtools_version.dir/DependInfo.cmake" + "tools/ktx2check/CMakeFiles/ktx2check.dir/DependInfo.cmake" + "tools/ktx2check/CMakeFiles/ktx2check_version.dir/DependInfo.cmake" + "tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/DependInfo.cmake" + "tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/DependInfo.cmake" + "tools/ktxinfo/CMakeFiles/ktxinfo.dir/DependInfo.cmake" + "tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/DependInfo.cmake" + "tools/ktxsc/CMakeFiles/ktxsc.dir/DependInfo.cmake" + "tools/ktxsc/CMakeFiles/ktxsc_version.dir/DependInfo.cmake" + "tools/toktx/CMakeFiles/toktx.dir/DependInfo.cmake" + "tools/toktx/CMakeFiles/toktx_version.dir/DependInfo.cmake" + "tests/CMakeFiles/unittests.dir/DependInfo.cmake" + "tests/CMakeFiles/texturetests.dir/DependInfo.cmake" + "tests/loadtests/CMakeFiles/appfwSDL.dir/DependInfo.cmake" + "tests/ktxdiff/CMakeFiles/ktxdiff.dir/DependInfo.cmake" + "tests/gtest/CMakeFiles/gtest.dir/DependInfo.cmake" + "tests/transcodetests/CMakeFiles/transcodetests.dir/DependInfo.cmake" + "tests/streamtests/CMakeFiles/streamtests.dir/DependInfo.cmake" + ) diff --git a/ktx/build/CMakeFiles/Makefile2 b/ktx/build/CMakeFiles/Makefile2 new file mode 100644 index 0000000..d494eb9 --- /dev/null +++ b/ktx/build/CMakeFiles/Makefile2 @@ -0,0 +1,2541 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Directory level rules for the build root directory + +# The main recursive "all" target. +all: CMakeFiles/ktx.dir/all +all: CMakeFiles/ktx_read.dir/all +all: CMakeFiles/objUtil.dir/all +all: CMakeFiles/all.doc.dir/all +all: interface/basisu_c_binding/all +all: external/astc-encoder/all +all: external/fmt/all +all: external/cxxopts/all +all: tools/all +all: tests/all +.PHONY : all + +# The main recursive "codegen" target. +codegen: CMakeFiles/ktx.dir/codegen +codegen: CMakeFiles/ktx_read.dir/codegen +codegen: CMakeFiles/objUtil.dir/codegen +codegen: CMakeFiles/all.doc.dir/codegen +codegen: interface/basisu_c_binding/codegen +codegen: external/astc-encoder/codegen +codegen: external/fmt/codegen +codegen: external/cxxopts/codegen +codegen: tools/codegen +codegen: tests/codegen +.PHONY : codegen + +# The main recursive "preinstall" target. +preinstall: interface/basisu_c_binding/preinstall +preinstall: external/astc-encoder/preinstall +preinstall: external/fmt/preinstall +preinstall: external/cxxopts/preinstall +preinstall: tools/preinstall +preinstall: tests/preinstall +.PHONY : preinstall + +# The main recursive "clean" target. +clean: CMakeFiles/Experimental.dir/clean +clean: CMakeFiles/Nightly.dir/clean +clean: CMakeFiles/Continuous.dir/clean +clean: CMakeFiles/NightlyMemoryCheck.dir/clean +clean: CMakeFiles/NightlyStart.dir/clean +clean: CMakeFiles/NightlyUpdate.dir/clean +clean: CMakeFiles/NightlyConfigure.dir/clean +clean: CMakeFiles/NightlyBuild.dir/clean +clean: CMakeFiles/NightlyTest.dir/clean +clean: CMakeFiles/NightlyCoverage.dir/clean +clean: CMakeFiles/NightlyMemCheck.dir/clean +clean: CMakeFiles/NightlySubmit.dir/clean +clean: CMakeFiles/ExperimentalStart.dir/clean +clean: CMakeFiles/ExperimentalUpdate.dir/clean +clean: CMakeFiles/ExperimentalConfigure.dir/clean +clean: CMakeFiles/ExperimentalBuild.dir/clean +clean: CMakeFiles/ExperimentalTest.dir/clean +clean: CMakeFiles/ExperimentalCoverage.dir/clean +clean: CMakeFiles/ExperimentalMemCheck.dir/clean +clean: CMakeFiles/ExperimentalSubmit.dir/clean +clean: CMakeFiles/ContinuousStart.dir/clean +clean: CMakeFiles/ContinuousUpdate.dir/clean +clean: CMakeFiles/ContinuousConfigure.dir/clean +clean: CMakeFiles/ContinuousBuild.dir/clean +clean: CMakeFiles/ContinuousTest.dir/clean +clean: CMakeFiles/ContinuousCoverage.dir/clean +clean: CMakeFiles/ContinuousMemCheck.dir/clean +clean: CMakeFiles/ContinuousSubmit.dir/clean +clean: CMakeFiles/ktx.dir/clean +clean: CMakeFiles/ktx_read.dir/clean +clean: CMakeFiles/ktx_version.dir/clean +clean: CMakeFiles/objUtil.dir/clean +clean: CMakeFiles/libktx.doc.dir/clean +clean: CMakeFiles/tools.doc.dir/clean +clean: CMakeFiles/jswrappers.doc.dir/clean +clean: CMakeFiles/ktxpkg.doc.dir/clean +clean: CMakeFiles/all.doc.dir/clean +clean: interface/basisu_c_binding/clean +clean: external/astc-encoder/clean +clean: external/fmt/clean +clean: external/cxxopts/clean +clean: tools/clean +clean: tests/clean + $(CMAKE_COMMAND) -P CMakeFiles/cmake_directory_clean.cmake +.PHONY : clean + +#============================================================================= +# Directory level rules for directory external/astc-encoder + +# Recursive "all" directory target. +external/astc-encoder/all: external/astc-encoder/Source/all +.PHONY : external/astc-encoder/all + +# Recursive "codegen" directory target. +external/astc-encoder/codegen: external/astc-encoder/Source/codegen +.PHONY : external/astc-encoder/codegen + +# Recursive "preinstall" directory target. +external/astc-encoder/preinstall: external/astc-encoder/Source/preinstall +.PHONY : external/astc-encoder/preinstall + +# Recursive "clean" directory target. +external/astc-encoder/clean: external/astc-encoder/Source/clean +.PHONY : external/astc-encoder/clean + +#============================================================================= +# Directory level rules for directory external/astc-encoder/Source + +# Recursive "all" directory target. +external/astc-encoder/Source/all: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/all +.PHONY : external/astc-encoder/Source/all + +# Recursive "codegen" directory target. +external/astc-encoder/Source/codegen: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/codegen +.PHONY : external/astc-encoder/Source/codegen + +# Recursive "preinstall" directory target. +external/astc-encoder/Source/preinstall: +.PHONY : external/astc-encoder/Source/preinstall + +# Recursive "clean" directory target. +external/astc-encoder/Source/clean: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/clean +.PHONY : external/astc-encoder/Source/clean + +#============================================================================= +# Directory level rules for directory external/cxxopts + +# Recursive "all" directory target. +external/cxxopts/all: external/cxxopts/include/all +.PHONY : external/cxxopts/all + +# Recursive "codegen" directory target. +external/cxxopts/codegen: external/cxxopts/include/codegen +.PHONY : external/cxxopts/codegen + +# Recursive "preinstall" directory target. +external/cxxopts/preinstall: external/cxxopts/include/preinstall +.PHONY : external/cxxopts/preinstall + +# Recursive "clean" directory target. +external/cxxopts/clean: external/cxxopts/include/clean +.PHONY : external/cxxopts/clean + +#============================================================================= +# Directory level rules for directory external/cxxopts/include + +# Recursive "all" directory target. +external/cxxopts/include/all: +.PHONY : external/cxxopts/include/all + +# Recursive "codegen" directory target. +external/cxxopts/include/codegen: +.PHONY : external/cxxopts/include/codegen + +# Recursive "preinstall" directory target. +external/cxxopts/include/preinstall: +.PHONY : external/cxxopts/include/preinstall + +# Recursive "clean" directory target. +external/cxxopts/include/clean: +.PHONY : external/cxxopts/include/clean + +#============================================================================= +# Directory level rules for directory external/fmt + +# Recursive "all" directory target. +external/fmt/all: external/fmt/CMakeFiles/fmt.dir/all +.PHONY : external/fmt/all + +# Recursive "codegen" directory target. +external/fmt/codegen: external/fmt/CMakeFiles/fmt.dir/codegen +.PHONY : external/fmt/codegen + +# Recursive "preinstall" directory target. +external/fmt/preinstall: +.PHONY : external/fmt/preinstall + +# Recursive "clean" directory target. +external/fmt/clean: external/fmt/CMakeFiles/fmt.dir/clean +.PHONY : external/fmt/clean + +#============================================================================= +# Directory level rules for directory interface/basisu_c_binding + +# Recursive "all" directory target. +interface/basisu_c_binding/all: interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/all +.PHONY : interface/basisu_c_binding/all + +# Recursive "codegen" directory target. +interface/basisu_c_binding/codegen: interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/codegen +.PHONY : interface/basisu_c_binding/codegen + +# Recursive "preinstall" directory target. +interface/basisu_c_binding/preinstall: +.PHONY : interface/basisu_c_binding/preinstall + +# Recursive "clean" directory target. +interface/basisu_c_binding/clean: interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/clean +.PHONY : interface/basisu_c_binding/clean + +#============================================================================= +# Directory level rules for directory tests + +# Recursive "all" directory target. +tests/all: tests/CMakeFiles/unittests.dir/all +tests/all: tests/CMakeFiles/texturetests.dir/all +tests/all: tests/loadtests/all +tests/all: tests/ktxdiff/all +tests/all: tests/gtest/all +tests/all: tests/transcodetests/all +tests/all: tests/streamtests/all +.PHONY : tests/all + +# Recursive "codegen" directory target. +tests/codegen: tests/CMakeFiles/unittests.dir/codegen +tests/codegen: tests/CMakeFiles/texturetests.dir/codegen +tests/codegen: tests/loadtests/codegen +tests/codegen: tests/ktxdiff/codegen +tests/codegen: tests/gtest/codegen +tests/codegen: tests/transcodetests/codegen +tests/codegen: tests/streamtests/codegen +.PHONY : tests/codegen + +# Recursive "preinstall" directory target. +tests/preinstall: tests/loadtests/preinstall +tests/preinstall: tests/ktxdiff/preinstall +tests/preinstall: tests/gtest/preinstall +tests/preinstall: tests/transcodetests/preinstall +tests/preinstall: tests/streamtests/preinstall +.PHONY : tests/preinstall + +# Recursive "clean" directory target. +tests/clean: tests/CMakeFiles/unittests.dir/clean +tests/clean: tests/CMakeFiles/texturetests.dir/clean +tests/clean: tests/loadtests/clean +tests/clean: tests/ktxdiff/clean +tests/clean: tests/gtest/clean +tests/clean: tests/transcodetests/clean +tests/clean: tests/streamtests/clean +.PHONY : tests/clean + +#============================================================================= +# Directory level rules for directory tests/gtest + +# Recursive "all" directory target. +tests/gtest/all: tests/gtest/CMakeFiles/gtest.dir/all +.PHONY : tests/gtest/all + +# Recursive "codegen" directory target. +tests/gtest/codegen: tests/gtest/CMakeFiles/gtest.dir/codegen +.PHONY : tests/gtest/codegen + +# Recursive "preinstall" directory target. +tests/gtest/preinstall: +.PHONY : tests/gtest/preinstall + +# Recursive "clean" directory target. +tests/gtest/clean: tests/gtest/CMakeFiles/gtest.dir/clean +.PHONY : tests/gtest/clean + +#============================================================================= +# Directory level rules for directory tests/ktxdiff + +# Recursive "all" directory target. +tests/ktxdiff/all: tests/ktxdiff/CMakeFiles/ktxdiff.dir/all +.PHONY : tests/ktxdiff/all + +# Recursive "codegen" directory target. +tests/ktxdiff/codegen: tests/ktxdiff/CMakeFiles/ktxdiff.dir/codegen +.PHONY : tests/ktxdiff/codegen + +# Recursive "preinstall" directory target. +tests/ktxdiff/preinstall: +.PHONY : tests/ktxdiff/preinstall + +# Recursive "clean" directory target. +tests/ktxdiff/clean: tests/ktxdiff/CMakeFiles/ktxdiff.dir/clean +.PHONY : tests/ktxdiff/clean + +#============================================================================= +# Directory level rules for directory tests/loadtests + +# Recursive "all" directory target. +tests/loadtests/all: tests/loadtests/CMakeFiles/appfwSDL.dir/all +.PHONY : tests/loadtests/all + +# Recursive "codegen" directory target. +tests/loadtests/codegen: tests/loadtests/CMakeFiles/appfwSDL.dir/codegen +.PHONY : tests/loadtests/codegen + +# Recursive "preinstall" directory target. +tests/loadtests/preinstall: +.PHONY : tests/loadtests/preinstall + +# Recursive "clean" directory target. +tests/loadtests/clean: tests/loadtests/CMakeFiles/appfwSDL.dir/clean +.PHONY : tests/loadtests/clean + +#============================================================================= +# Directory level rules for directory tests/streamtests + +# Recursive "all" directory target. +tests/streamtests/all: tests/streamtests/CMakeFiles/streamtests.dir/all +.PHONY : tests/streamtests/all + +# Recursive "codegen" directory target. +tests/streamtests/codegen: tests/streamtests/CMakeFiles/streamtests.dir/codegen +.PHONY : tests/streamtests/codegen + +# Recursive "preinstall" directory target. +tests/streamtests/preinstall: +.PHONY : tests/streamtests/preinstall + +# Recursive "clean" directory target. +tests/streamtests/clean: tests/streamtests/CMakeFiles/streamtests.dir/clean +.PHONY : tests/streamtests/clean + +#============================================================================= +# Directory level rules for directory tests/transcodetests + +# Recursive "all" directory target. +tests/transcodetests/all: tests/transcodetests/CMakeFiles/transcodetests.dir/all +.PHONY : tests/transcodetests/all + +# Recursive "codegen" directory target. +tests/transcodetests/codegen: tests/transcodetests/CMakeFiles/transcodetests.dir/codegen +.PHONY : tests/transcodetests/codegen + +# Recursive "preinstall" directory target. +tests/transcodetests/preinstall: +.PHONY : tests/transcodetests/preinstall + +# Recursive "clean" directory target. +tests/transcodetests/clean: tests/transcodetests/CMakeFiles/transcodetests.dir/clean +.PHONY : tests/transcodetests/clean + +#============================================================================= +# Directory level rules for directory tools + +# Recursive "all" directory target. +tools/all: tools/imageio/all +tools/all: tools/ktx/all +tools/all: tools/ktx2check/all +tools/all: tools/ktx2ktx2/all +tools/all: tools/ktxinfo/all +tools/all: tools/ktxsc/all +tools/all: tools/toktx/all +.PHONY : tools/all + +# Recursive "codegen" directory target. +tools/codegen: tools/imageio/codegen +tools/codegen: tools/ktx/codegen +tools/codegen: tools/ktx2check/codegen +tools/codegen: tools/ktx2ktx2/codegen +tools/codegen: tools/ktxinfo/codegen +tools/codegen: tools/ktxsc/codegen +tools/codegen: tools/toktx/codegen +.PHONY : tools/codegen + +# Recursive "preinstall" directory target. +tools/preinstall: tools/imageio/preinstall +tools/preinstall: tools/ktx/preinstall +tools/preinstall: tools/ktx2check/preinstall +tools/preinstall: tools/ktx2ktx2/preinstall +tools/preinstall: tools/ktxinfo/preinstall +tools/preinstall: tools/ktxsc/preinstall +tools/preinstall: tools/toktx/preinstall +.PHONY : tools/preinstall + +# Recursive "clean" directory target. +tools/clean: tools/imageio/clean +tools/clean: tools/ktx/clean +tools/clean: tools/ktx2check/clean +tools/clean: tools/ktx2ktx2/clean +tools/clean: tools/ktxinfo/clean +tools/clean: tools/ktxsc/clean +tools/clean: tools/toktx/clean +.PHONY : tools/clean + +#============================================================================= +# Directory level rules for directory tools/imageio + +# Recursive "all" directory target. +tools/imageio/all: tools/imageio/CMakeFiles/imageio.dir/all +.PHONY : tools/imageio/all + +# Recursive "codegen" directory target. +tools/imageio/codegen: tools/imageio/CMakeFiles/imageio.dir/codegen +.PHONY : tools/imageio/codegen + +# Recursive "preinstall" directory target. +tools/imageio/preinstall: +.PHONY : tools/imageio/preinstall + +# Recursive "clean" directory target. +tools/imageio/clean: tools/imageio/CMakeFiles/imageio.dir/clean +.PHONY : tools/imageio/clean + +#============================================================================= +# Directory level rules for directory tools/ktx + +# Recursive "all" directory target. +tools/ktx/all: tools/ktx/CMakeFiles/ktxtools.dir/all +.PHONY : tools/ktx/all + +# Recursive "codegen" directory target. +tools/ktx/codegen: tools/ktx/CMakeFiles/ktxtools.dir/codegen +.PHONY : tools/ktx/codegen + +# Recursive "preinstall" directory target. +tools/ktx/preinstall: +.PHONY : tools/ktx/preinstall + +# Recursive "clean" directory target. +tools/ktx/clean: tools/ktx/CMakeFiles/ktxtools.dir/clean +tools/ktx/clean: tools/ktx/CMakeFiles/ktxtools_version.dir/clean +.PHONY : tools/ktx/clean + +#============================================================================= +# Directory level rules for directory tools/ktx2check + +# Recursive "all" directory target. +tools/ktx2check/all: tools/ktx2check/CMakeFiles/ktx2check.dir/all +.PHONY : tools/ktx2check/all + +# Recursive "codegen" directory target. +tools/ktx2check/codegen: tools/ktx2check/CMakeFiles/ktx2check.dir/codegen +.PHONY : tools/ktx2check/codegen + +# Recursive "preinstall" directory target. +tools/ktx2check/preinstall: +.PHONY : tools/ktx2check/preinstall + +# Recursive "clean" directory target. +tools/ktx2check/clean: tools/ktx2check/CMakeFiles/ktx2check.dir/clean +tools/ktx2check/clean: tools/ktx2check/CMakeFiles/ktx2check_version.dir/clean +.PHONY : tools/ktx2check/clean + +#============================================================================= +# Directory level rules for directory tools/ktx2ktx2 + +# Recursive "all" directory target. +tools/ktx2ktx2/all: tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/all +.PHONY : tools/ktx2ktx2/all + +# Recursive "codegen" directory target. +tools/ktx2ktx2/codegen: tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/codegen +.PHONY : tools/ktx2ktx2/codegen + +# Recursive "preinstall" directory target. +tools/ktx2ktx2/preinstall: +.PHONY : tools/ktx2ktx2/preinstall + +# Recursive "clean" directory target. +tools/ktx2ktx2/clean: tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/clean +tools/ktx2ktx2/clean: tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/clean +.PHONY : tools/ktx2ktx2/clean + +#============================================================================= +# Directory level rules for directory tools/ktxinfo + +# Recursive "all" directory target. +tools/ktxinfo/all: tools/ktxinfo/CMakeFiles/ktxinfo.dir/all +.PHONY : tools/ktxinfo/all + +# Recursive "codegen" directory target. +tools/ktxinfo/codegen: tools/ktxinfo/CMakeFiles/ktxinfo.dir/codegen +.PHONY : tools/ktxinfo/codegen + +# Recursive "preinstall" directory target. +tools/ktxinfo/preinstall: +.PHONY : tools/ktxinfo/preinstall + +# Recursive "clean" directory target. +tools/ktxinfo/clean: tools/ktxinfo/CMakeFiles/ktxinfo.dir/clean +tools/ktxinfo/clean: tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/clean +.PHONY : tools/ktxinfo/clean + +#============================================================================= +# Directory level rules for directory tools/ktxsc + +# Recursive "all" directory target. +tools/ktxsc/all: tools/ktxsc/CMakeFiles/ktxsc.dir/all +.PHONY : tools/ktxsc/all + +# Recursive "codegen" directory target. +tools/ktxsc/codegen: tools/ktxsc/CMakeFiles/ktxsc.dir/codegen +.PHONY : tools/ktxsc/codegen + +# Recursive "preinstall" directory target. +tools/ktxsc/preinstall: +.PHONY : tools/ktxsc/preinstall + +# Recursive "clean" directory target. +tools/ktxsc/clean: tools/ktxsc/CMakeFiles/ktxsc.dir/clean +tools/ktxsc/clean: tools/ktxsc/CMakeFiles/ktxsc_version.dir/clean +.PHONY : tools/ktxsc/clean + +#============================================================================= +# Directory level rules for directory tools/toktx + +# Recursive "all" directory target. +tools/toktx/all: tools/toktx/CMakeFiles/toktx.dir/all +.PHONY : tools/toktx/all + +# Recursive "codegen" directory target. +tools/toktx/codegen: tools/toktx/CMakeFiles/toktx.dir/codegen +.PHONY : tools/toktx/codegen + +# Recursive "preinstall" directory target. +tools/toktx/preinstall: +.PHONY : tools/toktx/preinstall + +# Recursive "clean" directory target. +tools/toktx/clean: tools/toktx/CMakeFiles/toktx.dir/clean +tools/toktx/clean: tools/toktx/CMakeFiles/toktx_version.dir/clean +.PHONY : tools/toktx/clean + +#============================================================================= +# Target rules for target CMakeFiles/Experimental.dir + +# All Build rule for target. +CMakeFiles/Experimental.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Experimental.dir/build.make CMakeFiles/Experimental.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/Experimental.dir/build.make CMakeFiles/Experimental.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target Experimental" +.PHONY : CMakeFiles/Experimental.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/Experimental.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/Experimental.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/Experimental.dir/rule + +# Convenience name for target. +Experimental: CMakeFiles/Experimental.dir/rule +.PHONY : Experimental + +# codegen rule for target. +CMakeFiles/Experimental.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Experimental.dir/build.make CMakeFiles/Experimental.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target Experimental" +.PHONY : CMakeFiles/Experimental.dir/codegen + +# clean rule for target. +CMakeFiles/Experimental.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Experimental.dir/build.make CMakeFiles/Experimental.dir/clean +.PHONY : CMakeFiles/Experimental.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/Nightly.dir + +# All Build rule for target. +CMakeFiles/Nightly.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Nightly.dir/build.make CMakeFiles/Nightly.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/Nightly.dir/build.make CMakeFiles/Nightly.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target Nightly" +.PHONY : CMakeFiles/Nightly.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/Nightly.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/Nightly.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/Nightly.dir/rule + +# Convenience name for target. +Nightly: CMakeFiles/Nightly.dir/rule +.PHONY : Nightly + +# codegen rule for target. +CMakeFiles/Nightly.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Nightly.dir/build.make CMakeFiles/Nightly.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target Nightly" +.PHONY : CMakeFiles/Nightly.dir/codegen + +# clean rule for target. +CMakeFiles/Nightly.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Nightly.dir/build.make CMakeFiles/Nightly.dir/clean +.PHONY : CMakeFiles/Nightly.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/Continuous.dir + +# All Build rule for target. +CMakeFiles/Continuous.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Continuous.dir/build.make CMakeFiles/Continuous.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/Continuous.dir/build.make CMakeFiles/Continuous.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target Continuous" +.PHONY : CMakeFiles/Continuous.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/Continuous.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/Continuous.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/Continuous.dir/rule + +# Convenience name for target. +Continuous: CMakeFiles/Continuous.dir/rule +.PHONY : Continuous + +# codegen rule for target. +CMakeFiles/Continuous.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Continuous.dir/build.make CMakeFiles/Continuous.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target Continuous" +.PHONY : CMakeFiles/Continuous.dir/codegen + +# clean rule for target. +CMakeFiles/Continuous.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Continuous.dir/build.make CMakeFiles/Continuous.dir/clean +.PHONY : CMakeFiles/Continuous.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyMemoryCheck.dir + +# All Build rule for target. +CMakeFiles/NightlyMemoryCheck.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyMemoryCheck.dir/build.make CMakeFiles/NightlyMemoryCheck.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyMemoryCheck.dir/build.make CMakeFiles/NightlyMemoryCheck.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target NightlyMemoryCheck" +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyMemoryCheck.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/NightlyMemoryCheck.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/rule + +# Convenience name for target. +NightlyMemoryCheck: CMakeFiles/NightlyMemoryCheck.dir/rule +.PHONY : NightlyMemoryCheck + +# codegen rule for target. +CMakeFiles/NightlyMemoryCheck.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyMemoryCheck.dir/build.make CMakeFiles/NightlyMemoryCheck.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target NightlyMemoryCheck" +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/codegen + +# clean rule for target. +CMakeFiles/NightlyMemoryCheck.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyMemoryCheck.dir/build.make CMakeFiles/NightlyMemoryCheck.dir/clean +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyStart.dir + +# All Build rule for target. +CMakeFiles/NightlyStart.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyStart.dir/build.make CMakeFiles/NightlyStart.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyStart.dir/build.make CMakeFiles/NightlyStart.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target NightlyStart" +.PHONY : CMakeFiles/NightlyStart.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyStart.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/NightlyStart.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/NightlyStart.dir/rule + +# Convenience name for target. +NightlyStart: CMakeFiles/NightlyStart.dir/rule +.PHONY : NightlyStart + +# codegen rule for target. +CMakeFiles/NightlyStart.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyStart.dir/build.make CMakeFiles/NightlyStart.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target NightlyStart" +.PHONY : CMakeFiles/NightlyStart.dir/codegen + +# clean rule for target. +CMakeFiles/NightlyStart.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyStart.dir/build.make CMakeFiles/NightlyStart.dir/clean +.PHONY : CMakeFiles/NightlyStart.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyUpdate.dir + +# All Build rule for target. +CMakeFiles/NightlyUpdate.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyUpdate.dir/build.make CMakeFiles/NightlyUpdate.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyUpdate.dir/build.make CMakeFiles/NightlyUpdate.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target NightlyUpdate" +.PHONY : CMakeFiles/NightlyUpdate.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyUpdate.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/NightlyUpdate.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/NightlyUpdate.dir/rule + +# Convenience name for target. +NightlyUpdate: CMakeFiles/NightlyUpdate.dir/rule +.PHONY : NightlyUpdate + +# codegen rule for target. +CMakeFiles/NightlyUpdate.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyUpdate.dir/build.make CMakeFiles/NightlyUpdate.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target NightlyUpdate" +.PHONY : CMakeFiles/NightlyUpdate.dir/codegen + +# clean rule for target. +CMakeFiles/NightlyUpdate.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyUpdate.dir/build.make CMakeFiles/NightlyUpdate.dir/clean +.PHONY : CMakeFiles/NightlyUpdate.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyConfigure.dir + +# All Build rule for target. +CMakeFiles/NightlyConfigure.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyConfigure.dir/build.make CMakeFiles/NightlyConfigure.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyConfigure.dir/build.make CMakeFiles/NightlyConfigure.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target NightlyConfigure" +.PHONY : CMakeFiles/NightlyConfigure.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyConfigure.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/NightlyConfigure.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/NightlyConfigure.dir/rule + +# Convenience name for target. +NightlyConfigure: CMakeFiles/NightlyConfigure.dir/rule +.PHONY : NightlyConfigure + +# codegen rule for target. +CMakeFiles/NightlyConfigure.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyConfigure.dir/build.make CMakeFiles/NightlyConfigure.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target NightlyConfigure" +.PHONY : CMakeFiles/NightlyConfigure.dir/codegen + +# clean rule for target. +CMakeFiles/NightlyConfigure.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyConfigure.dir/build.make CMakeFiles/NightlyConfigure.dir/clean +.PHONY : CMakeFiles/NightlyConfigure.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyBuild.dir + +# All Build rule for target. +CMakeFiles/NightlyBuild.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyBuild.dir/build.make CMakeFiles/NightlyBuild.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyBuild.dir/build.make CMakeFiles/NightlyBuild.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target NightlyBuild" +.PHONY : CMakeFiles/NightlyBuild.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyBuild.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/NightlyBuild.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/NightlyBuild.dir/rule + +# Convenience name for target. +NightlyBuild: CMakeFiles/NightlyBuild.dir/rule +.PHONY : NightlyBuild + +# codegen rule for target. +CMakeFiles/NightlyBuild.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyBuild.dir/build.make CMakeFiles/NightlyBuild.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target NightlyBuild" +.PHONY : CMakeFiles/NightlyBuild.dir/codegen + +# clean rule for target. +CMakeFiles/NightlyBuild.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyBuild.dir/build.make CMakeFiles/NightlyBuild.dir/clean +.PHONY : CMakeFiles/NightlyBuild.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyTest.dir + +# All Build rule for target. +CMakeFiles/NightlyTest.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyTest.dir/build.make CMakeFiles/NightlyTest.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyTest.dir/build.make CMakeFiles/NightlyTest.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target NightlyTest" +.PHONY : CMakeFiles/NightlyTest.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyTest.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/NightlyTest.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/NightlyTest.dir/rule + +# Convenience name for target. +NightlyTest: CMakeFiles/NightlyTest.dir/rule +.PHONY : NightlyTest + +# codegen rule for target. +CMakeFiles/NightlyTest.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyTest.dir/build.make CMakeFiles/NightlyTest.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target NightlyTest" +.PHONY : CMakeFiles/NightlyTest.dir/codegen + +# clean rule for target. +CMakeFiles/NightlyTest.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyTest.dir/build.make CMakeFiles/NightlyTest.dir/clean +.PHONY : CMakeFiles/NightlyTest.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyCoverage.dir + +# All Build rule for target. +CMakeFiles/NightlyCoverage.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyCoverage.dir/build.make CMakeFiles/NightlyCoverage.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyCoverage.dir/build.make CMakeFiles/NightlyCoverage.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target NightlyCoverage" +.PHONY : CMakeFiles/NightlyCoverage.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyCoverage.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/NightlyCoverage.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/NightlyCoverage.dir/rule + +# Convenience name for target. +NightlyCoverage: CMakeFiles/NightlyCoverage.dir/rule +.PHONY : NightlyCoverage + +# codegen rule for target. +CMakeFiles/NightlyCoverage.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyCoverage.dir/build.make CMakeFiles/NightlyCoverage.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target NightlyCoverage" +.PHONY : CMakeFiles/NightlyCoverage.dir/codegen + +# clean rule for target. +CMakeFiles/NightlyCoverage.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyCoverage.dir/build.make CMakeFiles/NightlyCoverage.dir/clean +.PHONY : CMakeFiles/NightlyCoverage.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlyMemCheck.dir + +# All Build rule for target. +CMakeFiles/NightlyMemCheck.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyMemCheck.dir/build.make CMakeFiles/NightlyMemCheck.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyMemCheck.dir/build.make CMakeFiles/NightlyMemCheck.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target NightlyMemCheck" +.PHONY : CMakeFiles/NightlyMemCheck.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlyMemCheck.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/NightlyMemCheck.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/NightlyMemCheck.dir/rule + +# Convenience name for target. +NightlyMemCheck: CMakeFiles/NightlyMemCheck.dir/rule +.PHONY : NightlyMemCheck + +# codegen rule for target. +CMakeFiles/NightlyMemCheck.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyMemCheck.dir/build.make CMakeFiles/NightlyMemCheck.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target NightlyMemCheck" +.PHONY : CMakeFiles/NightlyMemCheck.dir/codegen + +# clean rule for target. +CMakeFiles/NightlyMemCheck.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyMemCheck.dir/build.make CMakeFiles/NightlyMemCheck.dir/clean +.PHONY : CMakeFiles/NightlyMemCheck.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/NightlySubmit.dir + +# All Build rule for target. +CMakeFiles/NightlySubmit.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlySubmit.dir/build.make CMakeFiles/NightlySubmit.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlySubmit.dir/build.make CMakeFiles/NightlySubmit.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target NightlySubmit" +.PHONY : CMakeFiles/NightlySubmit.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/NightlySubmit.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/NightlySubmit.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/NightlySubmit.dir/rule + +# Convenience name for target. +NightlySubmit: CMakeFiles/NightlySubmit.dir/rule +.PHONY : NightlySubmit + +# codegen rule for target. +CMakeFiles/NightlySubmit.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlySubmit.dir/build.make CMakeFiles/NightlySubmit.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target NightlySubmit" +.PHONY : CMakeFiles/NightlySubmit.dir/codegen + +# clean rule for target. +CMakeFiles/NightlySubmit.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlySubmit.dir/build.make CMakeFiles/NightlySubmit.dir/clean +.PHONY : CMakeFiles/NightlySubmit.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalStart.dir + +# All Build rule for target. +CMakeFiles/ExperimentalStart.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalStart.dir/build.make CMakeFiles/ExperimentalStart.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalStart.dir/build.make CMakeFiles/ExperimentalStart.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ExperimentalStart" +.PHONY : CMakeFiles/ExperimentalStart.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalStart.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ExperimentalStart.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalStart.dir/rule + +# Convenience name for target. +ExperimentalStart: CMakeFiles/ExperimentalStart.dir/rule +.PHONY : ExperimentalStart + +# codegen rule for target. +CMakeFiles/ExperimentalStart.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalStart.dir/build.make CMakeFiles/ExperimentalStart.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ExperimentalStart" +.PHONY : CMakeFiles/ExperimentalStart.dir/codegen + +# clean rule for target. +CMakeFiles/ExperimentalStart.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalStart.dir/build.make CMakeFiles/ExperimentalStart.dir/clean +.PHONY : CMakeFiles/ExperimentalStart.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalUpdate.dir + +# All Build rule for target. +CMakeFiles/ExperimentalUpdate.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalUpdate.dir/build.make CMakeFiles/ExperimentalUpdate.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalUpdate.dir/build.make CMakeFiles/ExperimentalUpdate.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ExperimentalUpdate" +.PHONY : CMakeFiles/ExperimentalUpdate.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalUpdate.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ExperimentalUpdate.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalUpdate.dir/rule + +# Convenience name for target. +ExperimentalUpdate: CMakeFiles/ExperimentalUpdate.dir/rule +.PHONY : ExperimentalUpdate + +# codegen rule for target. +CMakeFiles/ExperimentalUpdate.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalUpdate.dir/build.make CMakeFiles/ExperimentalUpdate.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ExperimentalUpdate" +.PHONY : CMakeFiles/ExperimentalUpdate.dir/codegen + +# clean rule for target. +CMakeFiles/ExperimentalUpdate.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalUpdate.dir/build.make CMakeFiles/ExperimentalUpdate.dir/clean +.PHONY : CMakeFiles/ExperimentalUpdate.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalConfigure.dir + +# All Build rule for target. +CMakeFiles/ExperimentalConfigure.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalConfigure.dir/build.make CMakeFiles/ExperimentalConfigure.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalConfigure.dir/build.make CMakeFiles/ExperimentalConfigure.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ExperimentalConfigure" +.PHONY : CMakeFiles/ExperimentalConfigure.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalConfigure.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ExperimentalConfigure.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalConfigure.dir/rule + +# Convenience name for target. +ExperimentalConfigure: CMakeFiles/ExperimentalConfigure.dir/rule +.PHONY : ExperimentalConfigure + +# codegen rule for target. +CMakeFiles/ExperimentalConfigure.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalConfigure.dir/build.make CMakeFiles/ExperimentalConfigure.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ExperimentalConfigure" +.PHONY : CMakeFiles/ExperimentalConfigure.dir/codegen + +# clean rule for target. +CMakeFiles/ExperimentalConfigure.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalConfigure.dir/build.make CMakeFiles/ExperimentalConfigure.dir/clean +.PHONY : CMakeFiles/ExperimentalConfigure.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalBuild.dir + +# All Build rule for target. +CMakeFiles/ExperimentalBuild.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalBuild.dir/build.make CMakeFiles/ExperimentalBuild.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalBuild.dir/build.make CMakeFiles/ExperimentalBuild.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ExperimentalBuild" +.PHONY : CMakeFiles/ExperimentalBuild.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalBuild.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ExperimentalBuild.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalBuild.dir/rule + +# Convenience name for target. +ExperimentalBuild: CMakeFiles/ExperimentalBuild.dir/rule +.PHONY : ExperimentalBuild + +# codegen rule for target. +CMakeFiles/ExperimentalBuild.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalBuild.dir/build.make CMakeFiles/ExperimentalBuild.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ExperimentalBuild" +.PHONY : CMakeFiles/ExperimentalBuild.dir/codegen + +# clean rule for target. +CMakeFiles/ExperimentalBuild.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalBuild.dir/build.make CMakeFiles/ExperimentalBuild.dir/clean +.PHONY : CMakeFiles/ExperimentalBuild.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalTest.dir + +# All Build rule for target. +CMakeFiles/ExperimentalTest.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalTest.dir/build.make CMakeFiles/ExperimentalTest.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalTest.dir/build.make CMakeFiles/ExperimentalTest.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ExperimentalTest" +.PHONY : CMakeFiles/ExperimentalTest.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalTest.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ExperimentalTest.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalTest.dir/rule + +# Convenience name for target. +ExperimentalTest: CMakeFiles/ExperimentalTest.dir/rule +.PHONY : ExperimentalTest + +# codegen rule for target. +CMakeFiles/ExperimentalTest.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalTest.dir/build.make CMakeFiles/ExperimentalTest.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ExperimentalTest" +.PHONY : CMakeFiles/ExperimentalTest.dir/codegen + +# clean rule for target. +CMakeFiles/ExperimentalTest.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalTest.dir/build.make CMakeFiles/ExperimentalTest.dir/clean +.PHONY : CMakeFiles/ExperimentalTest.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalCoverage.dir + +# All Build rule for target. +CMakeFiles/ExperimentalCoverage.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalCoverage.dir/build.make CMakeFiles/ExperimentalCoverage.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalCoverage.dir/build.make CMakeFiles/ExperimentalCoverage.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ExperimentalCoverage" +.PHONY : CMakeFiles/ExperimentalCoverage.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalCoverage.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ExperimentalCoverage.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalCoverage.dir/rule + +# Convenience name for target. +ExperimentalCoverage: CMakeFiles/ExperimentalCoverage.dir/rule +.PHONY : ExperimentalCoverage + +# codegen rule for target. +CMakeFiles/ExperimentalCoverage.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalCoverage.dir/build.make CMakeFiles/ExperimentalCoverage.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ExperimentalCoverage" +.PHONY : CMakeFiles/ExperimentalCoverage.dir/codegen + +# clean rule for target. +CMakeFiles/ExperimentalCoverage.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalCoverage.dir/build.make CMakeFiles/ExperimentalCoverage.dir/clean +.PHONY : CMakeFiles/ExperimentalCoverage.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalMemCheck.dir + +# All Build rule for target. +CMakeFiles/ExperimentalMemCheck.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalMemCheck.dir/build.make CMakeFiles/ExperimentalMemCheck.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalMemCheck.dir/build.make CMakeFiles/ExperimentalMemCheck.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ExperimentalMemCheck" +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalMemCheck.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ExperimentalMemCheck.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/rule + +# Convenience name for target. +ExperimentalMemCheck: CMakeFiles/ExperimentalMemCheck.dir/rule +.PHONY : ExperimentalMemCheck + +# codegen rule for target. +CMakeFiles/ExperimentalMemCheck.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalMemCheck.dir/build.make CMakeFiles/ExperimentalMemCheck.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ExperimentalMemCheck" +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/codegen + +# clean rule for target. +CMakeFiles/ExperimentalMemCheck.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalMemCheck.dir/build.make CMakeFiles/ExperimentalMemCheck.dir/clean +.PHONY : CMakeFiles/ExperimentalMemCheck.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ExperimentalSubmit.dir + +# All Build rule for target. +CMakeFiles/ExperimentalSubmit.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalSubmit.dir/build.make CMakeFiles/ExperimentalSubmit.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalSubmit.dir/build.make CMakeFiles/ExperimentalSubmit.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ExperimentalSubmit" +.PHONY : CMakeFiles/ExperimentalSubmit.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ExperimentalSubmit.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ExperimentalSubmit.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ExperimentalSubmit.dir/rule + +# Convenience name for target. +ExperimentalSubmit: CMakeFiles/ExperimentalSubmit.dir/rule +.PHONY : ExperimentalSubmit + +# codegen rule for target. +CMakeFiles/ExperimentalSubmit.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalSubmit.dir/build.make CMakeFiles/ExperimentalSubmit.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ExperimentalSubmit" +.PHONY : CMakeFiles/ExperimentalSubmit.dir/codegen + +# clean rule for target. +CMakeFiles/ExperimentalSubmit.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalSubmit.dir/build.make CMakeFiles/ExperimentalSubmit.dir/clean +.PHONY : CMakeFiles/ExperimentalSubmit.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousStart.dir + +# All Build rule for target. +CMakeFiles/ContinuousStart.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousStart.dir/build.make CMakeFiles/ContinuousStart.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousStart.dir/build.make CMakeFiles/ContinuousStart.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ContinuousStart" +.PHONY : CMakeFiles/ContinuousStart.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousStart.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ContinuousStart.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousStart.dir/rule + +# Convenience name for target. +ContinuousStart: CMakeFiles/ContinuousStart.dir/rule +.PHONY : ContinuousStart + +# codegen rule for target. +CMakeFiles/ContinuousStart.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousStart.dir/build.make CMakeFiles/ContinuousStart.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ContinuousStart" +.PHONY : CMakeFiles/ContinuousStart.dir/codegen + +# clean rule for target. +CMakeFiles/ContinuousStart.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousStart.dir/build.make CMakeFiles/ContinuousStart.dir/clean +.PHONY : CMakeFiles/ContinuousStart.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousUpdate.dir + +# All Build rule for target. +CMakeFiles/ContinuousUpdate.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousUpdate.dir/build.make CMakeFiles/ContinuousUpdate.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousUpdate.dir/build.make CMakeFiles/ContinuousUpdate.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ContinuousUpdate" +.PHONY : CMakeFiles/ContinuousUpdate.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousUpdate.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ContinuousUpdate.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousUpdate.dir/rule + +# Convenience name for target. +ContinuousUpdate: CMakeFiles/ContinuousUpdate.dir/rule +.PHONY : ContinuousUpdate + +# codegen rule for target. +CMakeFiles/ContinuousUpdate.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousUpdate.dir/build.make CMakeFiles/ContinuousUpdate.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ContinuousUpdate" +.PHONY : CMakeFiles/ContinuousUpdate.dir/codegen + +# clean rule for target. +CMakeFiles/ContinuousUpdate.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousUpdate.dir/build.make CMakeFiles/ContinuousUpdate.dir/clean +.PHONY : CMakeFiles/ContinuousUpdate.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousConfigure.dir + +# All Build rule for target. +CMakeFiles/ContinuousConfigure.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousConfigure.dir/build.make CMakeFiles/ContinuousConfigure.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousConfigure.dir/build.make CMakeFiles/ContinuousConfigure.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ContinuousConfigure" +.PHONY : CMakeFiles/ContinuousConfigure.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousConfigure.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ContinuousConfigure.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousConfigure.dir/rule + +# Convenience name for target. +ContinuousConfigure: CMakeFiles/ContinuousConfigure.dir/rule +.PHONY : ContinuousConfigure + +# codegen rule for target. +CMakeFiles/ContinuousConfigure.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousConfigure.dir/build.make CMakeFiles/ContinuousConfigure.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ContinuousConfigure" +.PHONY : CMakeFiles/ContinuousConfigure.dir/codegen + +# clean rule for target. +CMakeFiles/ContinuousConfigure.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousConfigure.dir/build.make CMakeFiles/ContinuousConfigure.dir/clean +.PHONY : CMakeFiles/ContinuousConfigure.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousBuild.dir + +# All Build rule for target. +CMakeFiles/ContinuousBuild.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousBuild.dir/build.make CMakeFiles/ContinuousBuild.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousBuild.dir/build.make CMakeFiles/ContinuousBuild.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ContinuousBuild" +.PHONY : CMakeFiles/ContinuousBuild.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousBuild.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ContinuousBuild.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousBuild.dir/rule + +# Convenience name for target. +ContinuousBuild: CMakeFiles/ContinuousBuild.dir/rule +.PHONY : ContinuousBuild + +# codegen rule for target. +CMakeFiles/ContinuousBuild.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousBuild.dir/build.make CMakeFiles/ContinuousBuild.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ContinuousBuild" +.PHONY : CMakeFiles/ContinuousBuild.dir/codegen + +# clean rule for target. +CMakeFiles/ContinuousBuild.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousBuild.dir/build.make CMakeFiles/ContinuousBuild.dir/clean +.PHONY : CMakeFiles/ContinuousBuild.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousTest.dir + +# All Build rule for target. +CMakeFiles/ContinuousTest.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousTest.dir/build.make CMakeFiles/ContinuousTest.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousTest.dir/build.make CMakeFiles/ContinuousTest.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ContinuousTest" +.PHONY : CMakeFiles/ContinuousTest.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousTest.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ContinuousTest.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousTest.dir/rule + +# Convenience name for target. +ContinuousTest: CMakeFiles/ContinuousTest.dir/rule +.PHONY : ContinuousTest + +# codegen rule for target. +CMakeFiles/ContinuousTest.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousTest.dir/build.make CMakeFiles/ContinuousTest.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ContinuousTest" +.PHONY : CMakeFiles/ContinuousTest.dir/codegen + +# clean rule for target. +CMakeFiles/ContinuousTest.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousTest.dir/build.make CMakeFiles/ContinuousTest.dir/clean +.PHONY : CMakeFiles/ContinuousTest.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousCoverage.dir + +# All Build rule for target. +CMakeFiles/ContinuousCoverage.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousCoverage.dir/build.make CMakeFiles/ContinuousCoverage.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousCoverage.dir/build.make CMakeFiles/ContinuousCoverage.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ContinuousCoverage" +.PHONY : CMakeFiles/ContinuousCoverage.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousCoverage.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ContinuousCoverage.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousCoverage.dir/rule + +# Convenience name for target. +ContinuousCoverage: CMakeFiles/ContinuousCoverage.dir/rule +.PHONY : ContinuousCoverage + +# codegen rule for target. +CMakeFiles/ContinuousCoverage.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousCoverage.dir/build.make CMakeFiles/ContinuousCoverage.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ContinuousCoverage" +.PHONY : CMakeFiles/ContinuousCoverage.dir/codegen + +# clean rule for target. +CMakeFiles/ContinuousCoverage.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousCoverage.dir/build.make CMakeFiles/ContinuousCoverage.dir/clean +.PHONY : CMakeFiles/ContinuousCoverage.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousMemCheck.dir + +# All Build rule for target. +CMakeFiles/ContinuousMemCheck.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousMemCheck.dir/build.make CMakeFiles/ContinuousMemCheck.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousMemCheck.dir/build.make CMakeFiles/ContinuousMemCheck.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ContinuousMemCheck" +.PHONY : CMakeFiles/ContinuousMemCheck.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousMemCheck.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ContinuousMemCheck.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousMemCheck.dir/rule + +# Convenience name for target. +ContinuousMemCheck: CMakeFiles/ContinuousMemCheck.dir/rule +.PHONY : ContinuousMemCheck + +# codegen rule for target. +CMakeFiles/ContinuousMemCheck.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousMemCheck.dir/build.make CMakeFiles/ContinuousMemCheck.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ContinuousMemCheck" +.PHONY : CMakeFiles/ContinuousMemCheck.dir/codegen + +# clean rule for target. +CMakeFiles/ContinuousMemCheck.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousMemCheck.dir/build.make CMakeFiles/ContinuousMemCheck.dir/clean +.PHONY : CMakeFiles/ContinuousMemCheck.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ContinuousSubmit.dir + +# All Build rule for target. +CMakeFiles/ContinuousSubmit.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousSubmit.dir/build.make CMakeFiles/ContinuousSubmit.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousSubmit.dir/build.make CMakeFiles/ContinuousSubmit.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ContinuousSubmit" +.PHONY : CMakeFiles/ContinuousSubmit.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ContinuousSubmit.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ContinuousSubmit.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ContinuousSubmit.dir/rule + +# Convenience name for target. +ContinuousSubmit: CMakeFiles/ContinuousSubmit.dir/rule +.PHONY : ContinuousSubmit + +# codegen rule for target. +CMakeFiles/ContinuousSubmit.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousSubmit.dir/build.make CMakeFiles/ContinuousSubmit.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ContinuousSubmit" +.PHONY : CMakeFiles/ContinuousSubmit.dir/codegen + +# clean rule for target. +CMakeFiles/ContinuousSubmit.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousSubmit.dir/build.make CMakeFiles/ContinuousSubmit.dir/clean +.PHONY : CMakeFiles/ContinuousSubmit.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ktx.dir + +# All Build rule for target. +CMakeFiles/ktx.dir/all: CMakeFiles/ktx_version.dir/all +CMakeFiles/ktx.dir/all: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/all + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53 "Built target ktx" +.PHONY : CMakeFiles/ktx.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ktx.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 42 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ktx.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ktx.dir/rule + +# Convenience name for target. +ktx: CMakeFiles/ktx.dir/rule +.PHONY : ktx + +# codegen rule for target. +CMakeFiles/ktx.dir/codegen: CMakeFiles/ktx_version.dir/all + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53 "Finished codegen for target ktx" +.PHONY : CMakeFiles/ktx.dir/codegen + +# clean rule for target. +CMakeFiles/ktx.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/clean +.PHONY : CMakeFiles/ktx.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ktx_read.dir + +# All Build rule for target. +CMakeFiles/ktx_read.dir/all: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/all + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74 "Built target ktx_read" +.PHONY : CMakeFiles/ktx_read.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ktx_read.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 31 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ktx_read.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ktx_read.dir/rule + +# Convenience name for target. +ktx_read: CMakeFiles/ktx_read.dir/rule +.PHONY : ktx_read + +# codegen rule for target. +CMakeFiles/ktx_read.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74 "Finished codegen for target ktx_read" +.PHONY : CMakeFiles/ktx_read.dir/codegen + +# clean rule for target. +CMakeFiles/ktx_read.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/clean +.PHONY : CMakeFiles/ktx_read.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ktx_version.dir + +# All Build rule for target. +CMakeFiles/ktx_version.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_version.dir/build.make CMakeFiles/ktx_version.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_version.dir/build.make CMakeFiles/ktx_version.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=75 "Built target ktx_version" +.PHONY : CMakeFiles/ktx_version.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ktx_version.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 1 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ktx_version.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ktx_version.dir/rule + +# Convenience name for target. +ktx_version: CMakeFiles/ktx_version.dir/rule +.PHONY : ktx_version + +# codegen rule for target. +CMakeFiles/ktx_version.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_version.dir/build.make CMakeFiles/ktx_version.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=75 "Finished codegen for target ktx_version" +.PHONY : CMakeFiles/ktx_version.dir/codegen + +# clean rule for target. +CMakeFiles/ktx_version.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_version.dir/build.make CMakeFiles/ktx_version.dir/clean +.PHONY : CMakeFiles/ktx_version.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/objUtil.dir + +# All Build rule for target. +CMakeFiles/objUtil.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/objUtil.dir/build.make CMakeFiles/objUtil.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/objUtil.dir/build.make CMakeFiles/objUtil.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=90 "Built target objUtil" +.PHONY : CMakeFiles/objUtil.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/objUtil.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 1 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/objUtil.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/objUtil.dir/rule + +# Convenience name for target. +objUtil: CMakeFiles/objUtil.dir/rule +.PHONY : objUtil + +# codegen rule for target. +CMakeFiles/objUtil.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/objUtil.dir/build.make CMakeFiles/objUtil.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=90 "Finished codegen for target objUtil" +.PHONY : CMakeFiles/objUtil.dir/codegen + +# clean rule for target. +CMakeFiles/objUtil.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/objUtil.dir/build.make CMakeFiles/objUtil.dir/clean +.PHONY : CMakeFiles/objUtil.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/libktx.doc.dir + +# All Build rule for target. +CMakeFiles/libktx.doc.dir/all: CMakeFiles/ktx_version.dir/all +CMakeFiles/libktx.doc.dir/all: CMakeFiles/ktxpkg.doc.dir/all + $(MAKE) $(MAKESILENT) -f CMakeFiles/libktx.doc.dir/build.make CMakeFiles/libktx.doc.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/libktx.doc.dir/build.make CMakeFiles/libktx.doc.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=89 "Built target libktx.doc" +.PHONY : CMakeFiles/libktx.doc.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/libktx.doc.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/libktx.doc.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/libktx.doc.dir/rule + +# Convenience name for target. +libktx.doc: CMakeFiles/libktx.doc.dir/rule +.PHONY : libktx.doc + +# codegen rule for target. +CMakeFiles/libktx.doc.dir/codegen: CMakeFiles/ktx_version.dir/all +CMakeFiles/libktx.doc.dir/codegen: CMakeFiles/ktxpkg.doc.dir/all + $(MAKE) $(MAKESILENT) -f CMakeFiles/libktx.doc.dir/build.make CMakeFiles/libktx.doc.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=89 "Finished codegen for target libktx.doc" +.PHONY : CMakeFiles/libktx.doc.dir/codegen + +# clean rule for target. +CMakeFiles/libktx.doc.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/libktx.doc.dir/build.make CMakeFiles/libktx.doc.dir/clean +.PHONY : CMakeFiles/libktx.doc.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/tools.doc.dir + +# All Build rule for target. +CMakeFiles/tools.doc.dir/all: CMakeFiles/ktxpkg.doc.dir/all + $(MAKE) $(MAKESILENT) -f CMakeFiles/tools.doc.dir/build.make CMakeFiles/tools.doc.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/tools.doc.dir/build.make CMakeFiles/tools.doc.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target tools.doc" +.PHONY : CMakeFiles/tools.doc.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/tools.doc.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/tools.doc.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/tools.doc.dir/rule + +# Convenience name for target. +tools.doc: CMakeFiles/tools.doc.dir/rule +.PHONY : tools.doc + +# codegen rule for target. +CMakeFiles/tools.doc.dir/codegen: CMakeFiles/ktxpkg.doc.dir/all + $(MAKE) $(MAKESILENT) -f CMakeFiles/tools.doc.dir/build.make CMakeFiles/tools.doc.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target tools.doc" +.PHONY : CMakeFiles/tools.doc.dir/codegen + +# clean rule for target. +CMakeFiles/tools.doc.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/tools.doc.dir/build.make CMakeFiles/tools.doc.dir/clean +.PHONY : CMakeFiles/tools.doc.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/jswrappers.doc.dir + +# All Build rule for target. +CMakeFiles/jswrappers.doc.dir/all: CMakeFiles/ktxpkg.doc.dir/all + $(MAKE) $(MAKESILENT) -f CMakeFiles/jswrappers.doc.dir/build.make CMakeFiles/jswrappers.doc.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/jswrappers.doc.dir/build.make CMakeFiles/jswrappers.doc.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=25 "Built target jswrappers.doc" +.PHONY : CMakeFiles/jswrappers.doc.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/jswrappers.doc.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 1 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/jswrappers.doc.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/jswrappers.doc.dir/rule + +# Convenience name for target. +jswrappers.doc: CMakeFiles/jswrappers.doc.dir/rule +.PHONY : jswrappers.doc + +# codegen rule for target. +CMakeFiles/jswrappers.doc.dir/codegen: CMakeFiles/ktxpkg.doc.dir/all + $(MAKE) $(MAKESILENT) -f CMakeFiles/jswrappers.doc.dir/build.make CMakeFiles/jswrappers.doc.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=25 "Finished codegen for target jswrappers.doc" +.PHONY : CMakeFiles/jswrappers.doc.dir/codegen + +# clean rule for target. +CMakeFiles/jswrappers.doc.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/jswrappers.doc.dir/build.make CMakeFiles/jswrappers.doc.dir/clean +.PHONY : CMakeFiles/jswrappers.doc.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/ktxpkg.doc.dir + +# All Build rule for target. +CMakeFiles/ktxpkg.doc.dir/all: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktxpkg.doc.dir/build.make CMakeFiles/ktxpkg.doc.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktxpkg.doc.dir/build.make CMakeFiles/ktxpkg.doc.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ktxpkg.doc" +.PHONY : CMakeFiles/ktxpkg.doc.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/ktxpkg.doc.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/ktxpkg.doc.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/ktxpkg.doc.dir/rule + +# Convenience name for target. +ktxpkg.doc: CMakeFiles/ktxpkg.doc.dir/rule +.PHONY : ktxpkg.doc + +# codegen rule for target. +CMakeFiles/ktxpkg.doc.dir/codegen: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktxpkg.doc.dir/build.make CMakeFiles/ktxpkg.doc.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ktxpkg.doc" +.PHONY : CMakeFiles/ktxpkg.doc.dir/codegen + +# clean rule for target. +CMakeFiles/ktxpkg.doc.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktxpkg.doc.dir/build.make CMakeFiles/ktxpkg.doc.dir/clean +.PHONY : CMakeFiles/ktxpkg.doc.dir/clean + +#============================================================================= +# Target rules for target CMakeFiles/all.doc.dir + +# All Build rule for target. +CMakeFiles/all.doc.dir/all: CMakeFiles/libktx.doc.dir/all +CMakeFiles/all.doc.dir/all: CMakeFiles/tools.doc.dir/all +CMakeFiles/all.doc.dir/all: CMakeFiles/jswrappers.doc.dir/all + $(MAKE) $(MAKESILENT) -f CMakeFiles/all.doc.dir/build.make CMakeFiles/all.doc.dir/depend + $(MAKE) $(MAKESILENT) -f CMakeFiles/all.doc.dir/build.make CMakeFiles/all.doc.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target all.doc" +.PHONY : CMakeFiles/all.doc.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/all.doc.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 3 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/all.doc.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : CMakeFiles/all.doc.dir/rule + +# Convenience name for target. +all.doc: CMakeFiles/all.doc.dir/rule +.PHONY : all.doc + +# codegen rule for target. +CMakeFiles/all.doc.dir/codegen: CMakeFiles/libktx.doc.dir/all +CMakeFiles/all.doc.dir/codegen: CMakeFiles/tools.doc.dir/all +CMakeFiles/all.doc.dir/codegen: CMakeFiles/jswrappers.doc.dir/all + $(MAKE) $(MAKESILENT) -f CMakeFiles/all.doc.dir/build.make CMakeFiles/all.doc.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target all.doc" +.PHONY : CMakeFiles/all.doc.dir/codegen + +# clean rule for target. +CMakeFiles/all.doc.dir/clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/all.doc.dir/build.make CMakeFiles/all.doc.dir/clean +.PHONY : CMakeFiles/all.doc.dir/clean + +#============================================================================= +# Target rules for target interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir + +# All Build rule for target. +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/all: + $(MAKE) $(MAKESILENT) -f interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/depend + $(MAKE) $(MAKESILENT) -f interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=91 "Built target obj_basisu_cbind" +.PHONY : interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/all + +# Build rule for subdir invocation for target. +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 1 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/rule + +# Convenience name for target. +obj_basisu_cbind: interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/rule +.PHONY : obj_basisu_cbind + +# codegen rule for target. +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/codegen: + $(MAKE) $(MAKESILENT) -f interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=91 "Finished codegen for target obj_basisu_cbind" +.PHONY : interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/codegen + +# clean rule for target. +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/clean: + $(MAKE) $(MAKESILENT) -f interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/clean +.PHONY : interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/clean + +#============================================================================= +# Target rules for target external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir + +# All Build rule for target. +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/all: + $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/depend + $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=3,4,5,6,7,8,9,10,11,12,13,14,15 "Built target astcenc-avx2-static" +.PHONY : external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/all + +# Build rule for subdir invocation for target. +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 13 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/rule + +# Convenience name for target. +astcenc-avx2-static: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/rule +.PHONY : astcenc-avx2-static + +# codegen rule for target. +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/codegen: + $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=3,4,5,6,7,8,9,10,11,12,13,14,15 "Finished codegen for target astcenc-avx2-static" +.PHONY : external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/codegen + +# clean rule for target. +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/clean: + $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/clean +.PHONY : external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/clean + +#============================================================================= +# Target rules for target external/fmt/CMakeFiles/fmt.dir + +# All Build rule for target. +external/fmt/CMakeFiles/fmt.dir/all: + $(MAKE) $(MAKESILENT) -f external/fmt/CMakeFiles/fmt.dir/build.make external/fmt/CMakeFiles/fmt.dir/depend + $(MAKE) $(MAKESILENT) -f external/fmt/CMakeFiles/fmt.dir/build.make external/fmt/CMakeFiles/fmt.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=16,17 "Built target fmt" +.PHONY : external/fmt/CMakeFiles/fmt.dir/all + +# Build rule for subdir invocation for target. +external/fmt/CMakeFiles/fmt.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/fmt/CMakeFiles/fmt.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : external/fmt/CMakeFiles/fmt.dir/rule + +# Convenience name for target. +fmt: external/fmt/CMakeFiles/fmt.dir/rule +.PHONY : fmt + +# codegen rule for target. +external/fmt/CMakeFiles/fmt.dir/codegen: + $(MAKE) $(MAKESILENT) -f external/fmt/CMakeFiles/fmt.dir/build.make external/fmt/CMakeFiles/fmt.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=16,17 "Finished codegen for target fmt" +.PHONY : external/fmt/CMakeFiles/fmt.dir/codegen + +# clean rule for target. +external/fmt/CMakeFiles/fmt.dir/clean: + $(MAKE) $(MAKESILENT) -f external/fmt/CMakeFiles/fmt.dir/build.make external/fmt/CMakeFiles/fmt.dir/clean +.PHONY : external/fmt/CMakeFiles/fmt.dir/clean + +#============================================================================= +# Target rules for target tools/imageio/CMakeFiles/imageio.dir + +# All Build rule for target. +tools/imageio/CMakeFiles/imageio.dir/all: external/fmt/CMakeFiles/fmt.dir/all + $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/depend + $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=19,20,21,22,23,24 "Built target imageio" +.PHONY : tools/imageio/CMakeFiles/imageio.dir/all + +# Build rule for subdir invocation for target. +tools/imageio/CMakeFiles/imageio.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 8 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/imageio/CMakeFiles/imageio.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/imageio/CMakeFiles/imageio.dir/rule + +# Convenience name for target. +imageio: tools/imageio/CMakeFiles/imageio.dir/rule +.PHONY : imageio + +# codegen rule for target. +tools/imageio/CMakeFiles/imageio.dir/codegen: + $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=19,20,21,22,23,24 "Finished codegen for target imageio" +.PHONY : tools/imageio/CMakeFiles/imageio.dir/codegen + +# clean rule for target. +tools/imageio/CMakeFiles/imageio.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/clean +.PHONY : tools/imageio/CMakeFiles/imageio.dir/clean + +#============================================================================= +# Target rules for target tools/ktx/CMakeFiles/ktxtools.dir + +# All Build rule for target. +tools/ktx/CMakeFiles/ktxtools.dir/all: CMakeFiles/ktx.dir/all +tools/ktx/CMakeFiles/ktxtools.dir/all: CMakeFiles/objUtil.dir/all +tools/ktx/CMakeFiles/ktxtools.dir/all: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/all +tools/ktx/CMakeFiles/ktxtools.dir/all: external/fmt/CMakeFiles/fmt.dir/all +tools/ktx/CMakeFiles/ktxtools.dir/all: tools/imageio/CMakeFiles/imageio.dir/all +tools/ktx/CMakeFiles/ktxtools.dir/all: tools/ktx/CMakeFiles/ktxtools_version.dir/all + $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/depend + $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=81,82,83,84,85,86,87 "Built target ktxtools" +.PHONY : tools/ktx/CMakeFiles/ktxtools.dir/all + +# Build rule for subdir invocation for target. +tools/ktx/CMakeFiles/ktxtools.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 59 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx/CMakeFiles/ktxtools.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/ktx/CMakeFiles/ktxtools.dir/rule + +# Convenience name for target. +ktxtools: tools/ktx/CMakeFiles/ktxtools.dir/rule +.PHONY : ktxtools + +# codegen rule for target. +tools/ktx/CMakeFiles/ktxtools.dir/codegen: tools/ktx/CMakeFiles/ktxtools_version.dir/all + $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=81,82,83,84,85,86,87 "Finished codegen for target ktxtools" +.PHONY : tools/ktx/CMakeFiles/ktxtools.dir/codegen + +# clean rule for target. +tools/ktx/CMakeFiles/ktxtools.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/clean +.PHONY : tools/ktx/CMakeFiles/ktxtools.dir/clean + +#============================================================================= +# Target rules for target tools/ktx/CMakeFiles/ktxtools_version.dir + +# All Build rule for target. +tools/ktx/CMakeFiles/ktxtools_version.dir/all: + $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools_version.dir/build.make tools/ktx/CMakeFiles/ktxtools_version.dir/depend + $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools_version.dir/build.make tools/ktx/CMakeFiles/ktxtools_version.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=88 "Built target ktxtools_version" +.PHONY : tools/ktx/CMakeFiles/ktxtools_version.dir/all + +# Build rule for subdir invocation for target. +tools/ktx/CMakeFiles/ktxtools_version.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 1 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx/CMakeFiles/ktxtools_version.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/ktx/CMakeFiles/ktxtools_version.dir/rule + +# Convenience name for target. +ktxtools_version: tools/ktx/CMakeFiles/ktxtools_version.dir/rule +.PHONY : ktxtools_version + +# codegen rule for target. +tools/ktx/CMakeFiles/ktxtools_version.dir/codegen: + $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools_version.dir/build.make tools/ktx/CMakeFiles/ktxtools_version.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=88 "Finished codegen for target ktxtools_version" +.PHONY : tools/ktx/CMakeFiles/ktxtools_version.dir/codegen + +# clean rule for target. +tools/ktx/CMakeFiles/ktxtools_version.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools_version.dir/build.make tools/ktx/CMakeFiles/ktxtools_version.dir/clean +.PHONY : tools/ktx/CMakeFiles/ktxtools_version.dir/clean + +#============================================================================= +# Target rules for target tools/ktx2check/CMakeFiles/ktx2check.dir + +# All Build rule for target. +tools/ktx2check/CMakeFiles/ktx2check.dir/all: CMakeFiles/ktx.dir/all +tools/ktx2check/CMakeFiles/ktx2check.dir/all: CMakeFiles/objUtil.dir/all +tools/ktx2check/CMakeFiles/ktx2check.dir/all: tools/ktx2check/CMakeFiles/ktx2check_version.dir/all + $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check.dir/build.make tools/ktx2check/CMakeFiles/ktx2check.dir/depend + $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check.dir/build.make tools/ktx2check/CMakeFiles/ktx2check.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=54 "Built target ktx2check" +.PHONY : tools/ktx2check/CMakeFiles/ktx2check.dir/all + +# Build rule for subdir invocation for target. +tools/ktx2check/CMakeFiles/ktx2check.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 44 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2check/CMakeFiles/ktx2check.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/ktx2check/CMakeFiles/ktx2check.dir/rule + +# Convenience name for target. +ktx2check: tools/ktx2check/CMakeFiles/ktx2check.dir/rule +.PHONY : ktx2check + +# codegen rule for target. +tools/ktx2check/CMakeFiles/ktx2check.dir/codegen: tools/ktx2check/CMakeFiles/ktx2check_version.dir/all + $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check.dir/build.make tools/ktx2check/CMakeFiles/ktx2check.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=54 "Finished codegen for target ktx2check" +.PHONY : tools/ktx2check/CMakeFiles/ktx2check.dir/codegen + +# clean rule for target. +tools/ktx2check/CMakeFiles/ktx2check.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check.dir/build.make tools/ktx2check/CMakeFiles/ktx2check.dir/clean +.PHONY : tools/ktx2check/CMakeFiles/ktx2check.dir/clean + +#============================================================================= +# Target rules for target tools/ktx2check/CMakeFiles/ktx2check_version.dir + +# All Build rule for target. +tools/ktx2check/CMakeFiles/ktx2check_version.dir/all: + $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check_version.dir/build.make tools/ktx2check/CMakeFiles/ktx2check_version.dir/depend + $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check_version.dir/build.make tools/ktx2check/CMakeFiles/ktx2check_version.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ktx2check_version" +.PHONY : tools/ktx2check/CMakeFiles/ktx2check_version.dir/all + +# Build rule for subdir invocation for target. +tools/ktx2check/CMakeFiles/ktx2check_version.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2check/CMakeFiles/ktx2check_version.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/ktx2check/CMakeFiles/ktx2check_version.dir/rule + +# Convenience name for target. +ktx2check_version: tools/ktx2check/CMakeFiles/ktx2check_version.dir/rule +.PHONY : ktx2check_version + +# codegen rule for target. +tools/ktx2check/CMakeFiles/ktx2check_version.dir/codegen: + $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check_version.dir/build.make tools/ktx2check/CMakeFiles/ktx2check_version.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ktx2check_version" +.PHONY : tools/ktx2check/CMakeFiles/ktx2check_version.dir/codegen + +# clean rule for target. +tools/ktx2check/CMakeFiles/ktx2check_version.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check_version.dir/build.make tools/ktx2check/CMakeFiles/ktx2check_version.dir/clean +.PHONY : tools/ktx2check/CMakeFiles/ktx2check_version.dir/clean + +#============================================================================= +# Target rules for target tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir + +# All Build rule for target. +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/all: CMakeFiles/ktx.dir/all +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/all: CMakeFiles/objUtil.dir/all +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/all: tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/all + $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/depend + $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=55,56 "Built target ktx2ktx2" +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/all + +# Build rule for subdir invocation for target. +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 45 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/rule + +# Convenience name for target. +ktx2ktx2: tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/rule +.PHONY : ktx2ktx2 + +# codegen rule for target. +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/codegen: tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/all + $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=55,56 "Finished codegen for target ktx2ktx2" +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/codegen + +# clean rule for target. +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/clean +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/clean + +#============================================================================= +# Target rules for target tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir + +# All Build rule for target. +tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/all: + $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/depend + $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Built target ktx2ktx2_version" +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/all + +# Build rule for subdir invocation for target. +tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/rule + +# Convenience name for target. +ktx2ktx2_version: tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/rule +.PHONY : ktx2ktx2_version + +# codegen rule for target. +tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/codegen: + $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num= "Finished codegen for target ktx2ktx2_version" +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/codegen + +# clean rule for target. +tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/clean +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/clean + +#============================================================================= +# Target rules for target tools/ktxinfo/CMakeFiles/ktxinfo.dir + +# All Build rule for target. +tools/ktxinfo/CMakeFiles/ktxinfo.dir/all: CMakeFiles/ktx.dir/all +tools/ktxinfo/CMakeFiles/ktxinfo.dir/all: CMakeFiles/objUtil.dir/all +tools/ktxinfo/CMakeFiles/ktxinfo.dir/all: tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/all + $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo.dir/depend + $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=77 "Built target ktxinfo" +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo.dir/all + +# Build rule for subdir invocation for target. +tools/ktxinfo/CMakeFiles/ktxinfo.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 45 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxinfo/CMakeFiles/ktxinfo.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo.dir/rule + +# Convenience name for target. +ktxinfo: tools/ktxinfo/CMakeFiles/ktxinfo.dir/rule +.PHONY : ktxinfo + +# codegen rule for target. +tools/ktxinfo/CMakeFiles/ktxinfo.dir/codegen: tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/all + $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=77 "Finished codegen for target ktxinfo" +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo.dir/codegen + +# clean rule for target. +tools/ktxinfo/CMakeFiles/ktxinfo.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo.dir/clean +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo.dir/clean + +#============================================================================= +# Target rules for target tools/ktxinfo/CMakeFiles/ktxinfo_version.dir + +# All Build rule for target. +tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/all: + $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/depend + $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=78 "Built target ktxinfo_version" +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/all + +# Build rule for subdir invocation for target. +tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 1 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/rule + +# Convenience name for target. +ktxinfo_version: tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/rule +.PHONY : ktxinfo_version + +# codegen rule for target. +tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/codegen: + $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=78 "Finished codegen for target ktxinfo_version" +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/codegen + +# clean rule for target. +tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/clean +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/clean + +#============================================================================= +# Target rules for target tools/ktxsc/CMakeFiles/ktxsc.dir + +# All Build rule for target. +tools/ktxsc/CMakeFiles/ktxsc.dir/all: CMakeFiles/ktx.dir/all +tools/ktxsc/CMakeFiles/ktxsc.dir/all: CMakeFiles/objUtil.dir/all +tools/ktxsc/CMakeFiles/ktxsc.dir/all: tools/ktxsc/CMakeFiles/ktxsc_version.dir/all + $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc.dir/build.make tools/ktxsc/CMakeFiles/ktxsc.dir/depend + $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc.dir/build.make tools/ktxsc/CMakeFiles/ktxsc.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=79 "Built target ktxsc" +.PHONY : tools/ktxsc/CMakeFiles/ktxsc.dir/all + +# Build rule for subdir invocation for target. +tools/ktxsc/CMakeFiles/ktxsc.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 45 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxsc/CMakeFiles/ktxsc.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/ktxsc/CMakeFiles/ktxsc.dir/rule + +# Convenience name for target. +ktxsc: tools/ktxsc/CMakeFiles/ktxsc.dir/rule +.PHONY : ktxsc + +# codegen rule for target. +tools/ktxsc/CMakeFiles/ktxsc.dir/codegen: tools/ktxsc/CMakeFiles/ktxsc_version.dir/all + $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc.dir/build.make tools/ktxsc/CMakeFiles/ktxsc.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=79 "Finished codegen for target ktxsc" +.PHONY : tools/ktxsc/CMakeFiles/ktxsc.dir/codegen + +# clean rule for target. +tools/ktxsc/CMakeFiles/ktxsc.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc.dir/build.make tools/ktxsc/CMakeFiles/ktxsc.dir/clean +.PHONY : tools/ktxsc/CMakeFiles/ktxsc.dir/clean + +#============================================================================= +# Target rules for target tools/ktxsc/CMakeFiles/ktxsc_version.dir + +# All Build rule for target. +tools/ktxsc/CMakeFiles/ktxsc_version.dir/all: + $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc_version.dir/build.make tools/ktxsc/CMakeFiles/ktxsc_version.dir/depend + $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc_version.dir/build.make tools/ktxsc/CMakeFiles/ktxsc_version.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=80 "Built target ktxsc_version" +.PHONY : tools/ktxsc/CMakeFiles/ktxsc_version.dir/all + +# Build rule for subdir invocation for target. +tools/ktxsc/CMakeFiles/ktxsc_version.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 1 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxsc/CMakeFiles/ktxsc_version.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/ktxsc/CMakeFiles/ktxsc_version.dir/rule + +# Convenience name for target. +ktxsc_version: tools/ktxsc/CMakeFiles/ktxsc_version.dir/rule +.PHONY : ktxsc_version + +# codegen rule for target. +tools/ktxsc/CMakeFiles/ktxsc_version.dir/codegen: + $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc_version.dir/build.make tools/ktxsc/CMakeFiles/ktxsc_version.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=80 "Finished codegen for target ktxsc_version" +.PHONY : tools/ktxsc/CMakeFiles/ktxsc_version.dir/codegen + +# clean rule for target. +tools/ktxsc/CMakeFiles/ktxsc_version.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc_version.dir/build.make tools/ktxsc/CMakeFiles/ktxsc_version.dir/clean +.PHONY : tools/ktxsc/CMakeFiles/ktxsc_version.dir/clean + +#============================================================================= +# Target rules for target tools/toktx/CMakeFiles/toktx.dir + +# All Build rule for target. +tools/toktx/CMakeFiles/toktx.dir/all: CMakeFiles/ktx.dir/all +tools/toktx/CMakeFiles/toktx.dir/all: CMakeFiles/objUtil.dir/all +tools/toktx/CMakeFiles/toktx.dir/all: external/fmt/CMakeFiles/fmt.dir/all +tools/toktx/CMakeFiles/toktx.dir/all: tools/imageio/CMakeFiles/imageio.dir/all +tools/toktx/CMakeFiles/toktx.dir/all: tools/toktx/CMakeFiles/toktx_version.dir/all + $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx.dir/build.make tools/toktx/CMakeFiles/toktx.dir/depend + $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx.dir/build.make tools/toktx/CMakeFiles/toktx.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=94 "Built target toktx" +.PHONY : tools/toktx/CMakeFiles/toktx.dir/all + +# Build rule for subdir invocation for target. +tools/toktx/CMakeFiles/toktx.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 53 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/toktx/CMakeFiles/toktx.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/toktx/CMakeFiles/toktx.dir/rule + +# Convenience name for target. +toktx: tools/toktx/CMakeFiles/toktx.dir/rule +.PHONY : toktx + +# codegen rule for target. +tools/toktx/CMakeFiles/toktx.dir/codegen: tools/toktx/CMakeFiles/toktx_version.dir/all + $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx.dir/build.make tools/toktx/CMakeFiles/toktx.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=94 "Finished codegen for target toktx" +.PHONY : tools/toktx/CMakeFiles/toktx.dir/codegen + +# clean rule for target. +tools/toktx/CMakeFiles/toktx.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx.dir/build.make tools/toktx/CMakeFiles/toktx.dir/clean +.PHONY : tools/toktx/CMakeFiles/toktx.dir/clean + +#============================================================================= +# Target rules for target tools/toktx/CMakeFiles/toktx_version.dir + +# All Build rule for target. +tools/toktx/CMakeFiles/toktx_version.dir/all: + $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx_version.dir/build.make tools/toktx/CMakeFiles/toktx_version.dir/depend + $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx_version.dir/build.make tools/toktx/CMakeFiles/toktx_version.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=95 "Built target toktx_version" +.PHONY : tools/toktx/CMakeFiles/toktx_version.dir/all + +# Build rule for subdir invocation for target. +tools/toktx/CMakeFiles/toktx_version.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 1 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/toktx/CMakeFiles/toktx_version.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tools/toktx/CMakeFiles/toktx_version.dir/rule + +# Convenience name for target. +toktx_version: tools/toktx/CMakeFiles/toktx_version.dir/rule +.PHONY : toktx_version + +# codegen rule for target. +tools/toktx/CMakeFiles/toktx_version.dir/codegen: + $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx_version.dir/build.make tools/toktx/CMakeFiles/toktx_version.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=95 "Finished codegen for target toktx_version" +.PHONY : tools/toktx/CMakeFiles/toktx_version.dir/codegen + +# clean rule for target. +tools/toktx/CMakeFiles/toktx_version.dir/clean: + $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx_version.dir/build.make tools/toktx/CMakeFiles/toktx_version.dir/clean +.PHONY : tools/toktx/CMakeFiles/toktx_version.dir/clean + +#============================================================================= +# Target rules for target tests/CMakeFiles/unittests.dir + +# All Build rule for target. +tests/CMakeFiles/unittests.dir/all: CMakeFiles/ktx.dir/all +tests/CMakeFiles/unittests.dir/all: external/fmt/CMakeFiles/fmt.dir/all +tests/CMakeFiles/unittests.dir/all: tests/gtest/CMakeFiles/gtest.dir/all + $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/depend + $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=97,98,99,100 "Built target unittests" +.PHONY : tests/CMakeFiles/unittests.dir/all + +# Build rule for subdir invocation for target. +tests/CMakeFiles/unittests.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 49 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/CMakeFiles/unittests.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tests/CMakeFiles/unittests.dir/rule + +# Convenience name for target. +unittests: tests/CMakeFiles/unittests.dir/rule +.PHONY : unittests + +# codegen rule for target. +tests/CMakeFiles/unittests.dir/codegen: + $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=97,98,99,100 "Finished codegen for target unittests" +.PHONY : tests/CMakeFiles/unittests.dir/codegen + +# clean rule for target. +tests/CMakeFiles/unittests.dir/clean: + $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/clean +.PHONY : tests/CMakeFiles/unittests.dir/clean + +#============================================================================= +# Target rules for target tests/CMakeFiles/texturetests.dir + +# All Build rule for target. +tests/CMakeFiles/texturetests.dir/all: CMakeFiles/ktx.dir/all +tests/CMakeFiles/texturetests.dir/all: tests/gtest/CMakeFiles/gtest.dir/all + $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/texturetests.dir/build.make tests/CMakeFiles/texturetests.dir/depend + $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/texturetests.dir/build.make tests/CMakeFiles/texturetests.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=93 "Built target texturetests" +.PHONY : tests/CMakeFiles/texturetests.dir/all + +# Build rule for subdir invocation for target. +tests/CMakeFiles/texturetests.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 44 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/CMakeFiles/texturetests.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tests/CMakeFiles/texturetests.dir/rule + +# Convenience name for target. +texturetests: tests/CMakeFiles/texturetests.dir/rule +.PHONY : texturetests + +# codegen rule for target. +tests/CMakeFiles/texturetests.dir/codegen: + $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/texturetests.dir/build.make tests/CMakeFiles/texturetests.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=93 "Finished codegen for target texturetests" +.PHONY : tests/CMakeFiles/texturetests.dir/codegen + +# clean rule for target. +tests/CMakeFiles/texturetests.dir/clean: + $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/texturetests.dir/build.make tests/CMakeFiles/texturetests.dir/clean +.PHONY : tests/CMakeFiles/texturetests.dir/clean + +#============================================================================= +# Target rules for target tests/loadtests/CMakeFiles/appfwSDL.dir + +# All Build rule for target. +tests/loadtests/CMakeFiles/appfwSDL.dir/all: + $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/depend + $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=1,2 "Built target appfwSDL" +.PHONY : tests/loadtests/CMakeFiles/appfwSDL.dir/all + +# Build rule for subdir invocation for target. +tests/loadtests/CMakeFiles/appfwSDL.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 2 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/loadtests/CMakeFiles/appfwSDL.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tests/loadtests/CMakeFiles/appfwSDL.dir/rule + +# Convenience name for target. +appfwSDL: tests/loadtests/CMakeFiles/appfwSDL.dir/rule +.PHONY : appfwSDL + +# codegen rule for target. +tests/loadtests/CMakeFiles/appfwSDL.dir/codegen: + $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=1,2 "Finished codegen for target appfwSDL" +.PHONY : tests/loadtests/CMakeFiles/appfwSDL.dir/codegen + +# clean rule for target. +tests/loadtests/CMakeFiles/appfwSDL.dir/clean: + $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/clean +.PHONY : tests/loadtests/CMakeFiles/appfwSDL.dir/clean + +#============================================================================= +# Target rules for target tests/ktxdiff/CMakeFiles/ktxdiff.dir + +# All Build rule for target. +tests/ktxdiff/CMakeFiles/ktxdiff.dir/all: CMakeFiles/ktx.dir/all +tests/ktxdiff/CMakeFiles/ktxdiff.dir/all: CMakeFiles/objUtil.dir/all +tests/ktxdiff/CMakeFiles/ktxdiff.dir/all: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/all +tests/ktxdiff/CMakeFiles/ktxdiff.dir/all: external/fmt/CMakeFiles/fmt.dir/all + $(MAKE) $(MAKESILENT) -f tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make tests/ktxdiff/CMakeFiles/ktxdiff.dir/depend + $(MAKE) $(MAKESILENT) -f tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make tests/ktxdiff/CMakeFiles/ktxdiff.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=76 "Built target ktxdiff" +.PHONY : tests/ktxdiff/CMakeFiles/ktxdiff.dir/all + +# Build rule for subdir invocation for target. +tests/ktxdiff/CMakeFiles/ktxdiff.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 46 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/ktxdiff/CMakeFiles/ktxdiff.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tests/ktxdiff/CMakeFiles/ktxdiff.dir/rule + +# Convenience name for target. +ktxdiff: tests/ktxdiff/CMakeFiles/ktxdiff.dir/rule +.PHONY : ktxdiff + +# codegen rule for target. +tests/ktxdiff/CMakeFiles/ktxdiff.dir/codegen: + $(MAKE) $(MAKESILENT) -f tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make tests/ktxdiff/CMakeFiles/ktxdiff.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=76 "Finished codegen for target ktxdiff" +.PHONY : tests/ktxdiff/CMakeFiles/ktxdiff.dir/codegen + +# clean rule for target. +tests/ktxdiff/CMakeFiles/ktxdiff.dir/clean: + $(MAKE) $(MAKESILENT) -f tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make tests/ktxdiff/CMakeFiles/ktxdiff.dir/clean +.PHONY : tests/ktxdiff/CMakeFiles/ktxdiff.dir/clean + +#============================================================================= +# Target rules for target tests/gtest/CMakeFiles/gtest.dir + +# All Build rule for target. +tests/gtest/CMakeFiles/gtest.dir/all: + $(MAKE) $(MAKESILENT) -f tests/gtest/CMakeFiles/gtest.dir/build.make tests/gtest/CMakeFiles/gtest.dir/depend + $(MAKE) $(MAKESILENT) -f tests/gtest/CMakeFiles/gtest.dir/build.make tests/gtest/CMakeFiles/gtest.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=18 "Built target gtest" +.PHONY : tests/gtest/CMakeFiles/gtest.dir/all + +# Build rule for subdir invocation for target. +tests/gtest/CMakeFiles/gtest.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 1 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/gtest/CMakeFiles/gtest.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tests/gtest/CMakeFiles/gtest.dir/rule + +# Convenience name for target. +gtest: tests/gtest/CMakeFiles/gtest.dir/rule +.PHONY : gtest + +# codegen rule for target. +tests/gtest/CMakeFiles/gtest.dir/codegen: + $(MAKE) $(MAKESILENT) -f tests/gtest/CMakeFiles/gtest.dir/build.make tests/gtest/CMakeFiles/gtest.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=18 "Finished codegen for target gtest" +.PHONY : tests/gtest/CMakeFiles/gtest.dir/codegen + +# clean rule for target. +tests/gtest/CMakeFiles/gtest.dir/clean: + $(MAKE) $(MAKESILENT) -f tests/gtest/CMakeFiles/gtest.dir/build.make tests/gtest/CMakeFiles/gtest.dir/clean +.PHONY : tests/gtest/CMakeFiles/gtest.dir/clean + +#============================================================================= +# Target rules for target tests/transcodetests/CMakeFiles/transcodetests.dir + +# All Build rule for target. +tests/transcodetests/CMakeFiles/transcodetests.dir/all: CMakeFiles/ktx.dir/all +tests/transcodetests/CMakeFiles/transcodetests.dir/all: interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/all +tests/transcodetests/CMakeFiles/transcodetests.dir/all: tests/gtest/CMakeFiles/gtest.dir/all + $(MAKE) $(MAKESILENT) -f tests/transcodetests/CMakeFiles/transcodetests.dir/build.make tests/transcodetests/CMakeFiles/transcodetests.dir/depend + $(MAKE) $(MAKESILENT) -f tests/transcodetests/CMakeFiles/transcodetests.dir/build.make tests/transcodetests/CMakeFiles/transcodetests.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=96 "Built target transcodetests" +.PHONY : tests/transcodetests/CMakeFiles/transcodetests.dir/all + +# Build rule for subdir invocation for target. +tests/transcodetests/CMakeFiles/transcodetests.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 45 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/transcodetests/CMakeFiles/transcodetests.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tests/transcodetests/CMakeFiles/transcodetests.dir/rule + +# Convenience name for target. +transcodetests: tests/transcodetests/CMakeFiles/transcodetests.dir/rule +.PHONY : transcodetests + +# codegen rule for target. +tests/transcodetests/CMakeFiles/transcodetests.dir/codegen: + $(MAKE) $(MAKESILENT) -f tests/transcodetests/CMakeFiles/transcodetests.dir/build.make tests/transcodetests/CMakeFiles/transcodetests.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=96 "Finished codegen for target transcodetests" +.PHONY : tests/transcodetests/CMakeFiles/transcodetests.dir/codegen + +# clean rule for target. +tests/transcodetests/CMakeFiles/transcodetests.dir/clean: + $(MAKE) $(MAKESILENT) -f tests/transcodetests/CMakeFiles/transcodetests.dir/build.make tests/transcodetests/CMakeFiles/transcodetests.dir/clean +.PHONY : tests/transcodetests/CMakeFiles/transcodetests.dir/clean + +#============================================================================= +# Target rules for target tests/streamtests/CMakeFiles/streamtests.dir + +# All Build rule for target. +tests/streamtests/CMakeFiles/streamtests.dir/all: CMakeFiles/ktx.dir/all +tests/streamtests/CMakeFiles/streamtests.dir/all: tests/gtest/CMakeFiles/gtest.dir/all + $(MAKE) $(MAKESILENT) -f tests/streamtests/CMakeFiles/streamtests.dir/build.make tests/streamtests/CMakeFiles/streamtests.dir/depend + $(MAKE) $(MAKESILENT) -f tests/streamtests/CMakeFiles/streamtests.dir/build.make tests/streamtests/CMakeFiles/streamtests.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=92 "Built target streamtests" +.PHONY : tests/streamtests/CMakeFiles/streamtests.dir/all + +# Build rule for subdir invocation for target. +tests/streamtests/CMakeFiles/streamtests.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 44 + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/streamtests/CMakeFiles/streamtests.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : tests/streamtests/CMakeFiles/streamtests.dir/rule + +# Convenience name for target. +streamtests: tests/streamtests/CMakeFiles/streamtests.dir/rule +.PHONY : streamtests + +# codegen rule for target. +tests/streamtests/CMakeFiles/streamtests.dir/codegen: + $(MAKE) $(MAKESILENT) -f tests/streamtests/CMakeFiles/streamtests.dir/build.make tests/streamtests/CMakeFiles/streamtests.dir/codegen + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=92 "Finished codegen for target streamtests" +.PHONY : tests/streamtests/CMakeFiles/streamtests.dir/codegen + +# clean rule for target. +tests/streamtests/CMakeFiles/streamtests.dir/clean: + $(MAKE) $(MAKESILENT) -f tests/streamtests/CMakeFiles/streamtests.dir/build.make tests/streamtests/CMakeFiles/streamtests.dir/clean +.PHONY : tests/streamtests/CMakeFiles/streamtests.dir/clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/CMakeFiles/Nightly.dir/DependInfo.cmake b/ktx/build/CMakeFiles/Nightly.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/Nightly.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/Nightly.dir/build.make b/ktx/build/CMakeFiles/Nightly.dir/build.make new file mode 100644 index 0000000..a0bbe3e --- /dev/null +++ b/ktx/build/CMakeFiles/Nightly.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for Nightly. + +# Include any custom commands dependencies for this target. +include CMakeFiles/Nightly.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/Nightly.dir/progress.make + +CMakeFiles/Nightly: + /usr/bin/ctest -DMODEL=Nightly -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/Nightly.dir/codegen: +.PHONY : CMakeFiles/Nightly.dir/codegen + +Nightly: CMakeFiles/Nightly +Nightly: CMakeFiles/Nightly.dir/build.make +.PHONY : Nightly + +# Rule to build all files generated by this target. +CMakeFiles/Nightly.dir/build: Nightly +.PHONY : CMakeFiles/Nightly.dir/build + +CMakeFiles/Nightly.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/Nightly.dir/cmake_clean.cmake +.PHONY : CMakeFiles/Nightly.dir/clean + +CMakeFiles/Nightly.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/Nightly.dir/DependInfo.cmake "--color=$(COLOR)" Nightly +.PHONY : CMakeFiles/Nightly.dir/depend + diff --git a/ktx/build/CMakeFiles/Nightly.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/Nightly.dir/cmake_clean.cmake new file mode 100644 index 0000000..99a4ac1 --- /dev/null +++ b/ktx/build/CMakeFiles/Nightly.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/Nightly" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/Nightly.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/Nightly.dir/compiler_depend.make b/ktx/build/CMakeFiles/Nightly.dir/compiler_depend.make new file mode 100644 index 0000000..b53ef7a --- /dev/null +++ b/ktx/build/CMakeFiles/Nightly.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for Nightly. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/Nightly.dir/compiler_depend.ts b/ktx/build/CMakeFiles/Nightly.dir/compiler_depend.ts new file mode 100644 index 0000000..a85d2c8 --- /dev/null +++ b/ktx/build/CMakeFiles/Nightly.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for Nightly. diff --git a/ktx/build/CMakeFiles/Nightly.dir/progress.make b/ktx/build/CMakeFiles/Nightly.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/Nightly.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/NightlyBuild.dir/DependInfo.cmake b/ktx/build/CMakeFiles/NightlyBuild.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyBuild.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/NightlyBuild.dir/build.make b/ktx/build/CMakeFiles/NightlyBuild.dir/build.make new file mode 100644 index 0000000..793b65b --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyBuild.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for NightlyBuild. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyBuild.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyBuild.dir/progress.make + +CMakeFiles/NightlyBuild: + /usr/bin/ctest -DMODEL=Nightly -DACTIONS=Build -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/NightlyBuild.dir/codegen: +.PHONY : CMakeFiles/NightlyBuild.dir/codegen + +NightlyBuild: CMakeFiles/NightlyBuild +NightlyBuild: CMakeFiles/NightlyBuild.dir/build.make +.PHONY : NightlyBuild + +# Rule to build all files generated by this target. +CMakeFiles/NightlyBuild.dir/build: NightlyBuild +.PHONY : CMakeFiles/NightlyBuild.dir/build + +CMakeFiles/NightlyBuild.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/NightlyBuild.dir/cmake_clean.cmake +.PHONY : CMakeFiles/NightlyBuild.dir/clean + +CMakeFiles/NightlyBuild.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyBuild.dir/DependInfo.cmake "--color=$(COLOR)" NightlyBuild +.PHONY : CMakeFiles/NightlyBuild.dir/depend + diff --git a/ktx/build/CMakeFiles/NightlyBuild.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/NightlyBuild.dir/cmake_clean.cmake new file mode 100644 index 0000000..7aa38a7 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyBuild.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyBuild" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyBuild.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/NightlyBuild.dir/compiler_depend.make b/ktx/build/CMakeFiles/NightlyBuild.dir/compiler_depend.make new file mode 100644 index 0000000..da2f347 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyBuild.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyBuild. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/NightlyBuild.dir/compiler_depend.ts b/ktx/build/CMakeFiles/NightlyBuild.dir/compiler_depend.ts new file mode 100644 index 0000000..89e6960 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyBuild.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyBuild. diff --git a/ktx/build/CMakeFiles/NightlyBuild.dir/progress.make b/ktx/build/CMakeFiles/NightlyBuild.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyBuild.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/NightlyConfigure.dir/DependInfo.cmake b/ktx/build/CMakeFiles/NightlyConfigure.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyConfigure.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/NightlyConfigure.dir/build.make b/ktx/build/CMakeFiles/NightlyConfigure.dir/build.make new file mode 100644 index 0000000..2f759e5 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyConfigure.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for NightlyConfigure. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyConfigure.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyConfigure.dir/progress.make + +CMakeFiles/NightlyConfigure: + /usr/bin/ctest -DMODEL=Nightly -DACTIONS=Configure -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/NightlyConfigure.dir/codegen: +.PHONY : CMakeFiles/NightlyConfigure.dir/codegen + +NightlyConfigure: CMakeFiles/NightlyConfigure +NightlyConfigure: CMakeFiles/NightlyConfigure.dir/build.make +.PHONY : NightlyConfigure + +# Rule to build all files generated by this target. +CMakeFiles/NightlyConfigure.dir/build: NightlyConfigure +.PHONY : CMakeFiles/NightlyConfigure.dir/build + +CMakeFiles/NightlyConfigure.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/NightlyConfigure.dir/cmake_clean.cmake +.PHONY : CMakeFiles/NightlyConfigure.dir/clean + +CMakeFiles/NightlyConfigure.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyConfigure.dir/DependInfo.cmake "--color=$(COLOR)" NightlyConfigure +.PHONY : CMakeFiles/NightlyConfigure.dir/depend + diff --git a/ktx/build/CMakeFiles/NightlyConfigure.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/NightlyConfigure.dir/cmake_clean.cmake new file mode 100644 index 0000000..080c729 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyConfigure.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyConfigure" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyConfigure.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/NightlyConfigure.dir/compiler_depend.make b/ktx/build/CMakeFiles/NightlyConfigure.dir/compiler_depend.make new file mode 100644 index 0000000..973bd2a --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyConfigure.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyConfigure. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/NightlyConfigure.dir/compiler_depend.ts b/ktx/build/CMakeFiles/NightlyConfigure.dir/compiler_depend.ts new file mode 100644 index 0000000..3e550da --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyConfigure.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyConfigure. diff --git a/ktx/build/CMakeFiles/NightlyConfigure.dir/progress.make b/ktx/build/CMakeFiles/NightlyConfigure.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyConfigure.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/NightlyCoverage.dir/DependInfo.cmake b/ktx/build/CMakeFiles/NightlyCoverage.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyCoverage.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/NightlyCoverage.dir/build.make b/ktx/build/CMakeFiles/NightlyCoverage.dir/build.make new file mode 100644 index 0000000..68789af --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyCoverage.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for NightlyCoverage. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyCoverage.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyCoverage.dir/progress.make + +CMakeFiles/NightlyCoverage: + /usr/bin/ctest -DMODEL=Nightly -DACTIONS=Coverage -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/NightlyCoverage.dir/codegen: +.PHONY : CMakeFiles/NightlyCoverage.dir/codegen + +NightlyCoverage: CMakeFiles/NightlyCoverage +NightlyCoverage: CMakeFiles/NightlyCoverage.dir/build.make +.PHONY : NightlyCoverage + +# Rule to build all files generated by this target. +CMakeFiles/NightlyCoverage.dir/build: NightlyCoverage +.PHONY : CMakeFiles/NightlyCoverage.dir/build + +CMakeFiles/NightlyCoverage.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/NightlyCoverage.dir/cmake_clean.cmake +.PHONY : CMakeFiles/NightlyCoverage.dir/clean + +CMakeFiles/NightlyCoverage.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyCoverage.dir/DependInfo.cmake "--color=$(COLOR)" NightlyCoverage +.PHONY : CMakeFiles/NightlyCoverage.dir/depend + diff --git a/ktx/build/CMakeFiles/NightlyCoverage.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/NightlyCoverage.dir/cmake_clean.cmake new file mode 100644 index 0000000..d6cba89 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyCoverage.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyCoverage" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyCoverage.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/NightlyCoverage.dir/compiler_depend.make b/ktx/build/CMakeFiles/NightlyCoverage.dir/compiler_depend.make new file mode 100644 index 0000000..9f188a1 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyCoverage.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyCoverage. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/NightlyCoverage.dir/compiler_depend.ts b/ktx/build/CMakeFiles/NightlyCoverage.dir/compiler_depend.ts new file mode 100644 index 0000000..3092ba3 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyCoverage.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyCoverage. diff --git a/ktx/build/CMakeFiles/NightlyCoverage.dir/progress.make b/ktx/build/CMakeFiles/NightlyCoverage.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyCoverage.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/NightlyMemCheck.dir/DependInfo.cmake b/ktx/build/CMakeFiles/NightlyMemCheck.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyMemCheck.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/NightlyMemCheck.dir/build.make b/ktx/build/CMakeFiles/NightlyMemCheck.dir/build.make new file mode 100644 index 0000000..ef2085e --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyMemCheck.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for NightlyMemCheck. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyMemCheck.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyMemCheck.dir/progress.make + +CMakeFiles/NightlyMemCheck: + /usr/bin/ctest -DMODEL=Nightly -DACTIONS=MemCheck -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/NightlyMemCheck.dir/codegen: +.PHONY : CMakeFiles/NightlyMemCheck.dir/codegen + +NightlyMemCheck: CMakeFiles/NightlyMemCheck +NightlyMemCheck: CMakeFiles/NightlyMemCheck.dir/build.make +.PHONY : NightlyMemCheck + +# Rule to build all files generated by this target. +CMakeFiles/NightlyMemCheck.dir/build: NightlyMemCheck +.PHONY : CMakeFiles/NightlyMemCheck.dir/build + +CMakeFiles/NightlyMemCheck.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/NightlyMemCheck.dir/cmake_clean.cmake +.PHONY : CMakeFiles/NightlyMemCheck.dir/clean + +CMakeFiles/NightlyMemCheck.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyMemCheck.dir/DependInfo.cmake "--color=$(COLOR)" NightlyMemCheck +.PHONY : CMakeFiles/NightlyMemCheck.dir/depend + diff --git a/ktx/build/CMakeFiles/NightlyMemCheck.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/NightlyMemCheck.dir/cmake_clean.cmake new file mode 100644 index 0000000..3c0e881 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyMemCheck.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyMemCheck" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyMemCheck.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.make b/ktx/build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.make new file mode 100644 index 0000000..6c54911 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyMemCheck. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.ts b/ktx/build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.ts new file mode 100644 index 0000000..c176eda --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyMemCheck.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyMemCheck. diff --git a/ktx/build/CMakeFiles/NightlyMemCheck.dir/progress.make b/ktx/build/CMakeFiles/NightlyMemCheck.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyMemCheck.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/DependInfo.cmake b/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/build.make b/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/build.make new file mode 100644 index 0000000..2d9d7e6 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for NightlyMemoryCheck. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyMemoryCheck.dir/progress.make + +CMakeFiles/NightlyMemoryCheck: + /usr/bin/ctest -DMODEL=NightlyMemoryCheck -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/NightlyMemoryCheck.dir/codegen: +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/codegen + +NightlyMemoryCheck: CMakeFiles/NightlyMemoryCheck +NightlyMemoryCheck: CMakeFiles/NightlyMemoryCheck.dir/build.make +.PHONY : NightlyMemoryCheck + +# Rule to build all files generated by this target. +CMakeFiles/NightlyMemoryCheck.dir/build: NightlyMemoryCheck +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/build + +CMakeFiles/NightlyMemoryCheck.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/NightlyMemoryCheck.dir/cmake_clean.cmake +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/clean + +CMakeFiles/NightlyMemoryCheck.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/DependInfo.cmake "--color=$(COLOR)" NightlyMemoryCheck +.PHONY : CMakeFiles/NightlyMemoryCheck.dir/depend + diff --git a/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/cmake_clean.cmake new file mode 100644 index 0000000..8846611 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyMemoryCheck" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyMemoryCheck.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.make b/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.make new file mode 100644 index 0000000..3aa41e7 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyMemoryCheck. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.ts b/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.ts new file mode 100644 index 0000000..38e1ae0 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyMemoryCheck. diff --git a/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/progress.make b/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyMemoryCheck.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/NightlyStart.dir/DependInfo.cmake b/ktx/build/CMakeFiles/NightlyStart.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyStart.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/NightlyStart.dir/build.make b/ktx/build/CMakeFiles/NightlyStart.dir/build.make new file mode 100644 index 0000000..425ef50 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyStart.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for NightlyStart. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyStart.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyStart.dir/progress.make + +CMakeFiles/NightlyStart: + /usr/bin/ctest -DMODEL=Nightly -DACTIONS=Start -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/NightlyStart.dir/codegen: +.PHONY : CMakeFiles/NightlyStart.dir/codegen + +NightlyStart: CMakeFiles/NightlyStart +NightlyStart: CMakeFiles/NightlyStart.dir/build.make +.PHONY : NightlyStart + +# Rule to build all files generated by this target. +CMakeFiles/NightlyStart.dir/build: NightlyStart +.PHONY : CMakeFiles/NightlyStart.dir/build + +CMakeFiles/NightlyStart.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/NightlyStart.dir/cmake_clean.cmake +.PHONY : CMakeFiles/NightlyStart.dir/clean + +CMakeFiles/NightlyStart.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyStart.dir/DependInfo.cmake "--color=$(COLOR)" NightlyStart +.PHONY : CMakeFiles/NightlyStart.dir/depend + diff --git a/ktx/build/CMakeFiles/NightlyStart.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/NightlyStart.dir/cmake_clean.cmake new file mode 100644 index 0000000..6a2c6c6 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyStart.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyStart" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyStart.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/NightlyStart.dir/compiler_depend.make b/ktx/build/CMakeFiles/NightlyStart.dir/compiler_depend.make new file mode 100644 index 0000000..b72de2d --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyStart.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyStart. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/NightlyStart.dir/compiler_depend.ts b/ktx/build/CMakeFiles/NightlyStart.dir/compiler_depend.ts new file mode 100644 index 0000000..2f7f077 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyStart.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyStart. diff --git a/ktx/build/CMakeFiles/NightlyStart.dir/progress.make b/ktx/build/CMakeFiles/NightlyStart.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyStart.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/NightlySubmit.dir/DependInfo.cmake b/ktx/build/CMakeFiles/NightlySubmit.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlySubmit.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/NightlySubmit.dir/build.make b/ktx/build/CMakeFiles/NightlySubmit.dir/build.make new file mode 100644 index 0000000..4c4b8cf --- /dev/null +++ b/ktx/build/CMakeFiles/NightlySubmit.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for NightlySubmit. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlySubmit.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlySubmit.dir/progress.make + +CMakeFiles/NightlySubmit: + /usr/bin/ctest -DMODEL=Nightly -DACTIONS=Submit -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/NightlySubmit.dir/codegen: +.PHONY : CMakeFiles/NightlySubmit.dir/codegen + +NightlySubmit: CMakeFiles/NightlySubmit +NightlySubmit: CMakeFiles/NightlySubmit.dir/build.make +.PHONY : NightlySubmit + +# Rule to build all files generated by this target. +CMakeFiles/NightlySubmit.dir/build: NightlySubmit +.PHONY : CMakeFiles/NightlySubmit.dir/build + +CMakeFiles/NightlySubmit.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/NightlySubmit.dir/cmake_clean.cmake +.PHONY : CMakeFiles/NightlySubmit.dir/clean + +CMakeFiles/NightlySubmit.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlySubmit.dir/DependInfo.cmake "--color=$(COLOR)" NightlySubmit +.PHONY : CMakeFiles/NightlySubmit.dir/depend + diff --git a/ktx/build/CMakeFiles/NightlySubmit.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/NightlySubmit.dir/cmake_clean.cmake new file mode 100644 index 0000000..6f88ccc --- /dev/null +++ b/ktx/build/CMakeFiles/NightlySubmit.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlySubmit" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlySubmit.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/NightlySubmit.dir/compiler_depend.make b/ktx/build/CMakeFiles/NightlySubmit.dir/compiler_depend.make new file mode 100644 index 0000000..d2f6748 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlySubmit.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlySubmit. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/NightlySubmit.dir/compiler_depend.ts b/ktx/build/CMakeFiles/NightlySubmit.dir/compiler_depend.ts new file mode 100644 index 0000000..773bf4b --- /dev/null +++ b/ktx/build/CMakeFiles/NightlySubmit.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlySubmit. diff --git a/ktx/build/CMakeFiles/NightlySubmit.dir/progress.make b/ktx/build/CMakeFiles/NightlySubmit.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlySubmit.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/NightlyTest.dir/DependInfo.cmake b/ktx/build/CMakeFiles/NightlyTest.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyTest.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/NightlyTest.dir/build.make b/ktx/build/CMakeFiles/NightlyTest.dir/build.make new file mode 100644 index 0000000..bf8e123 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyTest.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for NightlyTest. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyTest.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyTest.dir/progress.make + +CMakeFiles/NightlyTest: + /usr/bin/ctest -DMODEL=Nightly -DACTIONS=Test -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/NightlyTest.dir/codegen: +.PHONY : CMakeFiles/NightlyTest.dir/codegen + +NightlyTest: CMakeFiles/NightlyTest +NightlyTest: CMakeFiles/NightlyTest.dir/build.make +.PHONY : NightlyTest + +# Rule to build all files generated by this target. +CMakeFiles/NightlyTest.dir/build: NightlyTest +.PHONY : CMakeFiles/NightlyTest.dir/build + +CMakeFiles/NightlyTest.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/NightlyTest.dir/cmake_clean.cmake +.PHONY : CMakeFiles/NightlyTest.dir/clean + +CMakeFiles/NightlyTest.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyTest.dir/DependInfo.cmake "--color=$(COLOR)" NightlyTest +.PHONY : CMakeFiles/NightlyTest.dir/depend + diff --git a/ktx/build/CMakeFiles/NightlyTest.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/NightlyTest.dir/cmake_clean.cmake new file mode 100644 index 0000000..8f40bb8 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyTest.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyTest" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyTest.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/NightlyTest.dir/compiler_depend.make b/ktx/build/CMakeFiles/NightlyTest.dir/compiler_depend.make new file mode 100644 index 0000000..03d9c29 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyTest.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyTest. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/NightlyTest.dir/compiler_depend.ts b/ktx/build/CMakeFiles/NightlyTest.dir/compiler_depend.ts new file mode 100644 index 0000000..8bb891c --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyTest.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyTest. diff --git a/ktx/build/CMakeFiles/NightlyTest.dir/progress.make b/ktx/build/CMakeFiles/NightlyTest.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyTest.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/NightlyUpdate.dir/DependInfo.cmake b/ktx/build/CMakeFiles/NightlyUpdate.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyUpdate.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/NightlyUpdate.dir/build.make b/ktx/build/CMakeFiles/NightlyUpdate.dir/build.make new file mode 100644 index 0000000..42520ac --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyUpdate.dir/build.make @@ -0,0 +1,90 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for NightlyUpdate. + +# Include any custom commands dependencies for this target. +include CMakeFiles/NightlyUpdate.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/NightlyUpdate.dir/progress.make + +CMakeFiles/NightlyUpdate: + /usr/bin/ctest -DMODEL=Nightly -DACTIONS=Update -S CMakeFiles/CTestScript.cmake -V + +CMakeFiles/NightlyUpdate.dir/codegen: +.PHONY : CMakeFiles/NightlyUpdate.dir/codegen + +NightlyUpdate: CMakeFiles/NightlyUpdate +NightlyUpdate: CMakeFiles/NightlyUpdate.dir/build.make +.PHONY : NightlyUpdate + +# Rule to build all files generated by this target. +CMakeFiles/NightlyUpdate.dir/build: NightlyUpdate +.PHONY : CMakeFiles/NightlyUpdate.dir/build + +CMakeFiles/NightlyUpdate.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/NightlyUpdate.dir/cmake_clean.cmake +.PHONY : CMakeFiles/NightlyUpdate.dir/clean + +CMakeFiles/NightlyUpdate.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyUpdate.dir/DependInfo.cmake "--color=$(COLOR)" NightlyUpdate +.PHONY : CMakeFiles/NightlyUpdate.dir/depend + diff --git a/ktx/build/CMakeFiles/NightlyUpdate.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/NightlyUpdate.dir/cmake_clean.cmake new file mode 100644 index 0000000..0f10e82 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyUpdate.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/NightlyUpdate" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/NightlyUpdate.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/NightlyUpdate.dir/compiler_depend.make b/ktx/build/CMakeFiles/NightlyUpdate.dir/compiler_depend.make new file mode 100644 index 0000000..924c826 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyUpdate.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for NightlyUpdate. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/NightlyUpdate.dir/compiler_depend.ts b/ktx/build/CMakeFiles/NightlyUpdate.dir/compiler_depend.ts new file mode 100644 index 0000000..7cf66de --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyUpdate.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for NightlyUpdate. diff --git a/ktx/build/CMakeFiles/NightlyUpdate.dir/progress.make b/ktx/build/CMakeFiles/NightlyUpdate.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/NightlyUpdate.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/TargetDirectories.txt b/ktx/build/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..fad4cac --- /dev/null +++ b/ktx/build/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,249 @@ +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/Experimental.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/Nightly.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/Continuous.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyMemoryCheck.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyStart.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyUpdate.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyConfigure.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyBuild.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyTest.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyCoverage.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlyMemCheck.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/NightlySubmit.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalStart.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalUpdate.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalConfigure.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalBuild.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalTest.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalCoverage.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalMemCheck.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ExperimentalSubmit.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousStart.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousUpdate.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousConfigure.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousBuild.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousTest.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousCoverage.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousMemCheck.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ContinuousSubmit.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_version.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/objUtil.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/libktx.doc.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/tools.doc.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/jswrappers.doc.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktxpkg.doc.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/all.doc.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/CMakeFiles/fmt.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/CMakeFiles/imageio.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/toktx.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/unittests.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/texturetests.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/CMakeFiles/gtest.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/CMakeFiles/install/strip.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/CMakeFiles/package.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/CMakeFiles/package_source.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/CMakeFiles/test.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/CMakeFiles/edit_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/CMakeFiles/rebuild_cache.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/CMakeFiles/list_install_components.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/CMakeFiles/install.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/CMakeFiles/install/local.dir +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/CMakeFiles/install/strip.dir diff --git a/ktx/build/CMakeFiles/all.doc.dir/DependInfo.cmake b/ktx/build/CMakeFiles/all.doc.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/all.doc.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/all.doc.dir/build.make b/ktx/build/CMakeFiles/all.doc.dir/build.make new file mode 100644 index 0000000..5d4124b --- /dev/null +++ b/ktx/build/CMakeFiles/all.doc.dir/build.make @@ -0,0 +1,89 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for all.doc. + +# Include any custom commands dependencies for this target. +include CMakeFiles/all.doc.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/all.doc.dir/progress.make + +CMakeFiles/all.doc: + +CMakeFiles/all.doc.dir/codegen: +.PHONY : CMakeFiles/all.doc.dir/codegen + +all.doc: CMakeFiles/all.doc +all.doc: CMakeFiles/all.doc.dir/build.make +.PHONY : all.doc + +# Rule to build all files generated by this target. +CMakeFiles/all.doc.dir/build: all.doc +.PHONY : CMakeFiles/all.doc.dir/build + +CMakeFiles/all.doc.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/all.doc.dir/cmake_clean.cmake +.PHONY : CMakeFiles/all.doc.dir/clean + +CMakeFiles/all.doc.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/all.doc.dir/DependInfo.cmake "--color=$(COLOR)" all.doc +.PHONY : CMakeFiles/all.doc.dir/depend + diff --git a/ktx/build/CMakeFiles/all.doc.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/all.doc.dir/cmake_clean.cmake new file mode 100644 index 0000000..2bb9969 --- /dev/null +++ b/ktx/build/CMakeFiles/all.doc.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/all.doc" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/all.doc.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/all.doc.dir/compiler_depend.make b/ktx/build/CMakeFiles/all.doc.dir/compiler_depend.make new file mode 100644 index 0000000..f6e4178 --- /dev/null +++ b/ktx/build/CMakeFiles/all.doc.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for all.doc. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/all.doc.dir/compiler_depend.ts b/ktx/build/CMakeFiles/all.doc.dir/compiler_depend.ts new file mode 100644 index 0000000..ae23bd3 --- /dev/null +++ b/ktx/build/CMakeFiles/all.doc.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for all.doc. diff --git a/ktx/build/CMakeFiles/all.doc.dir/progress.make b/ktx/build/CMakeFiles/all.doc.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ktx/build/CMakeFiles/all.doc.dir/progress.make @@ -0,0 +1 @@ + diff --git a/ktx/build/CMakeFiles/cmake.check_cache b/ktx/build/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/ktx/build/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/ktx/build/CMakeFiles/cmake_directory_clean.cmake b/ktx/build/CMakeFiles/cmake_directory_clean.cmake new file mode 100644 index 0000000..53af1a6 --- /dev/null +++ b/ktx/build/CMakeFiles/cmake_directory_clean.cmake @@ -0,0 +1,6 @@ +file(REMOVE_RECURSE + "docs/html/libktx" + "docs/html/ktxtools" + "docs/html/ktxjswrappers" + "docs/html" +) diff --git a/ktx/build/CMakeFiles/jswrappers.doc.dir/DependInfo.cmake b/ktx/build/CMakeFiles/jswrappers.doc.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/jswrappers.doc.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/jswrappers.doc.dir/build.make b/ktx/build/CMakeFiles/jswrappers.doc.dir/build.make new file mode 100644 index 0000000..add6478 --- /dev/null +++ b/ktx/build/CMakeFiles/jswrappers.doc.dir/build.make @@ -0,0 +1,92 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for jswrappers.doc. + +# Include any custom commands dependencies for this target. +include CMakeFiles/jswrappers.doc.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/jswrappers.doc.dir/progress.make + +CMakeFiles/jswrappers.doc: Doxyfile.jswrappers.doc + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generating API documentation for jswrappers.doc" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && /usr/bin/cmake -E make_directory /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/html + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && /usr/bin/doxygen /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Doxyfile.jswrappers.doc + +CMakeFiles/jswrappers.doc.dir/codegen: +.PHONY : CMakeFiles/jswrappers.doc.dir/codegen + +jswrappers.doc: CMakeFiles/jswrappers.doc +jswrappers.doc: CMakeFiles/jswrappers.doc.dir/build.make +.PHONY : jswrappers.doc + +# Rule to build all files generated by this target. +CMakeFiles/jswrappers.doc.dir/build: jswrappers.doc +.PHONY : CMakeFiles/jswrappers.doc.dir/build + +CMakeFiles/jswrappers.doc.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/jswrappers.doc.dir/cmake_clean.cmake +.PHONY : CMakeFiles/jswrappers.doc.dir/clean + +CMakeFiles/jswrappers.doc.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/jswrappers.doc.dir/DependInfo.cmake "--color=$(COLOR)" jswrappers.doc +.PHONY : CMakeFiles/jswrappers.doc.dir/depend + diff --git a/ktx/build/CMakeFiles/jswrappers.doc.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/jswrappers.doc.dir/cmake_clean.cmake new file mode 100644 index 0000000..457d73e --- /dev/null +++ b/ktx/build/CMakeFiles/jswrappers.doc.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/jswrappers.doc" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/jswrappers.doc.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/jswrappers.doc.dir/compiler_depend.make b/ktx/build/CMakeFiles/jswrappers.doc.dir/compiler_depend.make new file mode 100644 index 0000000..a71af4a --- /dev/null +++ b/ktx/build/CMakeFiles/jswrappers.doc.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for jswrappers.doc. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/jswrappers.doc.dir/compiler_depend.ts b/ktx/build/CMakeFiles/jswrappers.doc.dir/compiler_depend.ts new file mode 100644 index 0000000..223db40 --- /dev/null +++ b/ktx/build/CMakeFiles/jswrappers.doc.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for jswrappers.doc. diff --git a/ktx/build/CMakeFiles/jswrappers.doc.dir/progress.make b/ktx/build/CMakeFiles/jswrappers.doc.dir/progress.make new file mode 100644 index 0000000..1c95e00 --- /dev/null +++ b/ktx/build/CMakeFiles/jswrappers.doc.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 25 + diff --git a/ktx/build/CMakeFiles/ktx.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ktx.dir/DependInfo.cmake new file mode 100644 index 0000000..df0f503 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/DependInfo.cmake @@ -0,0 +1,80 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c" "CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c" "CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o" "gcc" "CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c" "CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o" "gcc" "CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c" "CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o" "gcc" "CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c" "CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o" "gcc" "CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c" "CMakeFiles/ktx.dir/external/dfdutils/queries.c.o" "gcc" "CMakeFiles/ktx.dir/external/dfdutils/queries.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c" "CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o" "gcc" "CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c" "CMakeFiles/ktx.dir/lib/checkheader.c.o" "gcc" "CMakeFiles/ktx.dir/lib/checkheader.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c" "CMakeFiles/ktx.dir/lib/filestream.c.o" "gcc" "CMakeFiles/ktx.dir/lib/filestream.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c" "CMakeFiles/ktx.dir/lib/gl_funcs.c.o" "gcc" "CMakeFiles/ktx.dir/lib/gl_funcs.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c" "CMakeFiles/ktx.dir/lib/glformat_str.c.o" "gcc" "CMakeFiles/ktx.dir/lib/glformat_str.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c" "CMakeFiles/ktx.dir/lib/glloader.c.o" "gcc" "CMakeFiles/ktx.dir/lib/glloader.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c" "CMakeFiles/ktx.dir/lib/hashlist.c.o" "gcc" "CMakeFiles/ktx.dir/lib/hashlist.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c" "CMakeFiles/ktx.dir/lib/info.c.o" "gcc" "CMakeFiles/ktx.dir/lib/info.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c" "CMakeFiles/ktx.dir/lib/memstream.c.o" "gcc" "CMakeFiles/ktx.dir/lib/memstream.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c" "CMakeFiles/ktx.dir/lib/strings.c.o" "gcc" "CMakeFiles/ktx.dir/lib/strings.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c" "CMakeFiles/ktx.dir/lib/swap.c.o" "gcc" "CMakeFiles/ktx.dir/lib/swap.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c" "CMakeFiles/ktx.dir/lib/texture.c.o" "gcc" "CMakeFiles/ktx.dir/lib/texture.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c" "CMakeFiles/ktx.dir/lib/texture1.c.o" "gcc" "CMakeFiles/ktx.dir/lib/texture1.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c" "CMakeFiles/ktx.dir/lib/texture2.c.o" "gcc" "CMakeFiles/ktx.dir/lib/texture2.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c" "CMakeFiles/ktx.dir/lib/vk_funcs.c.o" "gcc" "CMakeFiles/ktx.dir/lib/vk_funcs.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c" "CMakeFiles/ktx.dir/lib/vkformat_check.c.o" "gcc" "CMakeFiles/ktx.dir/lib/vkformat_check.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c" "CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o" "gcc" "CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c" "CMakeFiles/ktx.dir/lib/vkformat_str.c.o" "gcc" "CMakeFiles/ktx.dir/lib/vkformat_str.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c" "CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o" "gcc" "CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c" "CMakeFiles/ktx.dir/lib/vkloader.c.o" "gcc" "CMakeFiles/ktx.dir/lib/vkloader.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer1.c" "CMakeFiles/ktx.dir/lib/writer1.c.o" "gcc" "CMakeFiles/ktx.dir/lib/writer1.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer2.c" "CMakeFiles/ktx.dir/lib/writer2.c.o" "gcc" "CMakeFiles/ktx.dir/lib/writer2.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_sse.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resample_filters.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.cpp" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp" "CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o" "gcc" "CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx" "CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o" "gcc" "CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp" "CMakeFiles/ktx.dir/lib/astc_codec.cpp.o" "gcc" "CMakeFiles/ktx.dir/lib/astc_codec.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_encode.cpp" "CMakeFiles/ktx.dir/lib/basis_encode.cpp.o" "gcc" "CMakeFiles/ktx.dir/lib/basis_encode.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp" "CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o" "gcc" "CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx" "CMakeFiles/ktx.dir/lib/etcunpack.cxx.o" "gcc" "CMakeFiles/ktx.dir/lib/etcunpack.cxx.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp" "CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o" "gcc" "CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o.d" + "" "Release/libktx.so" "gcc" "CMakeFiles/ktx.dir/link.d" + ) + +# Pairs of files generated by the same build rule. +set(CMAKE_MULTIPLE_OUTPUT_PAIRS + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0" + ) + + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ktx.dir/build.make b/ktx/build/CMakeFiles/ktx.dir/build.make new file mode 100644 index 0000000..35c90ef --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/build.make @@ -0,0 +1,906 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include CMakeFiles/ktx.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include CMakeFiles/ktx.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ktx.dir/progress.make + +# Include the compile flags for this target's objects. +include CMakeFiles/ktx.dir/flags.make + +CMakeFiles/ktx.dir/codegen: +.PHONY : CMakeFiles/ktx.dir/codegen + +CMakeFiles/ktx.dir/lib/astc_codec.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/astc_codec.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp +CMakeFiles/ktx.dir/lib/astc_codec.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/ktx.dir/lib/astc_codec.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/astc_codec.cpp.o -MF CMakeFiles/ktx.dir/lib/astc_codec.cpp.o.d -o CMakeFiles/ktx.dir/lib/astc_codec.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp + +CMakeFiles/ktx.dir/lib/astc_codec.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/lib/astc_codec.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp > CMakeFiles/ktx.dir/lib/astc_codec.cpp.i + +CMakeFiles/ktx.dir/lib/astc_codec.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/lib/astc_codec.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp -o CMakeFiles/ktx.dir/lib/astc_codec.cpp.s + +CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp +CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o -MF CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o.d -o CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp + +CMakeFiles/ktx.dir/lib/basis_transcode.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/lib/basis_transcode.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp > CMakeFiles/ktx.dir/lib/basis_transcode.cpp.i + +CMakeFiles/ktx.dir/lib/basis_transcode.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/lib/basis_transcode.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp -o CMakeFiles/ktx.dir/lib/basis_transcode.cpp.s + +CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp +CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o -MF CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o.d -o CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp + +CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp > CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.i + +CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp -o CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.s + +CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp +CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-function -Wno-unused-variable -Wno-class-memaccess -Wno-maybe-uninitialized -Wno-stringop-overflow -MD -MT CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp + +CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-function -Wno-unused-variable -Wno-class-memaccess -Wno-maybe-uninitialized -Wno-stringop-overflow -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp > CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.i + +CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-function -Wno-unused-variable -Wno-class-memaccess -Wno-maybe-uninitialized -Wno-stringop-overflow -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp -o CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.s + +CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c +CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building C object CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o -MF CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o.d -o CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c + +CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c > CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.i + +CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c -o CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.s + +CMakeFiles/ktx.dir/lib/checkheader.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/checkheader.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c +CMakeFiles/ktx.dir/lib/checkheader.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building C object CMakeFiles/ktx.dir/lib/checkheader.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/checkheader.c.o -MF CMakeFiles/ktx.dir/lib/checkheader.c.o.d -o CMakeFiles/ktx.dir/lib/checkheader.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c + +CMakeFiles/ktx.dir/lib/checkheader.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/checkheader.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c > CMakeFiles/ktx.dir/lib/checkheader.c.i + +CMakeFiles/ktx.dir/lib/checkheader.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/checkheader.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c -o CMakeFiles/ktx.dir/lib/checkheader.c.s + +CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c +CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building C object CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o -MF CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o.d -o CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c + +CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c > CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.i + +CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c -o CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.s + +CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c +CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building C object CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o -MF CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o.d -o CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c + +CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c > CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.i + +CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c -o CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.s + +CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c +CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building C object CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o -MF CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o.d -o CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c + +CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c > CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.i + +CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c -o CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.s + +CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c +CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building C object CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o -MF CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o.d -o CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c + +CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c > CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.i + +CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c -o CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.s + +CMakeFiles/ktx.dir/external/dfdutils/queries.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/dfdutils/queries.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c +CMakeFiles/ktx.dir/external/dfdutils/queries.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building C object CMakeFiles/ktx.dir/external/dfdutils/queries.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/external/dfdutils/queries.c.o -MF CMakeFiles/ktx.dir/external/dfdutils/queries.c.o.d -o CMakeFiles/ktx.dir/external/dfdutils/queries.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c + +CMakeFiles/ktx.dir/external/dfdutils/queries.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/external/dfdutils/queries.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c > CMakeFiles/ktx.dir/external/dfdutils/queries.c.i + +CMakeFiles/ktx.dir/external/dfdutils/queries.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/external/dfdutils/queries.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c -o CMakeFiles/ktx.dir/external/dfdutils/queries.c.s + +CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c +CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building C object CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o -MF CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o.d -o CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c + +CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c > CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.i + +CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c -o CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.s + +CMakeFiles/ktx.dir/lib/etcunpack.cxx.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/etcunpack.cxx.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx +CMakeFiles/ktx.dir/lib/etcunpack.cxx.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building CXX object CMakeFiles/ktx.dir/lib/etcunpack.cxx.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/etcunpack.cxx.o -MF CMakeFiles/ktx.dir/lib/etcunpack.cxx.o.d -o CMakeFiles/ktx.dir/lib/etcunpack.cxx.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx + +CMakeFiles/ktx.dir/lib/etcunpack.cxx.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/lib/etcunpack.cxx.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx > CMakeFiles/ktx.dir/lib/etcunpack.cxx.i + +CMakeFiles/ktx.dir/lib/etcunpack.cxx.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/lib/etcunpack.cxx.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx -o CMakeFiles/ktx.dir/lib/etcunpack.cxx.s + +CMakeFiles/ktx.dir/lib/filestream.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/filestream.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c +CMakeFiles/ktx.dir/lib/filestream.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building C object CMakeFiles/ktx.dir/lib/filestream.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/filestream.c.o -MF CMakeFiles/ktx.dir/lib/filestream.c.o.d -o CMakeFiles/ktx.dir/lib/filestream.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c + +CMakeFiles/ktx.dir/lib/filestream.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/filestream.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c > CMakeFiles/ktx.dir/lib/filestream.c.i + +CMakeFiles/ktx.dir/lib/filestream.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/filestream.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c -o CMakeFiles/ktx.dir/lib/filestream.c.s + +CMakeFiles/ktx.dir/lib/glformat_str.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/glformat_str.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c +CMakeFiles/ktx.dir/lib/glformat_str.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building C object CMakeFiles/ktx.dir/lib/glformat_str.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/glformat_str.c.o -MF CMakeFiles/ktx.dir/lib/glformat_str.c.o.d -o CMakeFiles/ktx.dir/lib/glformat_str.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c + +CMakeFiles/ktx.dir/lib/glformat_str.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/glformat_str.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c > CMakeFiles/ktx.dir/lib/glformat_str.c.i + +CMakeFiles/ktx.dir/lib/glformat_str.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/glformat_str.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c -o CMakeFiles/ktx.dir/lib/glformat_str.c.s + +CMakeFiles/ktx.dir/lib/hashlist.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/hashlist.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c +CMakeFiles/ktx.dir/lib/hashlist.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building C object CMakeFiles/ktx.dir/lib/hashlist.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/hashlist.c.o -MF CMakeFiles/ktx.dir/lib/hashlist.c.o.d -o CMakeFiles/ktx.dir/lib/hashlist.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c + +CMakeFiles/ktx.dir/lib/hashlist.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/hashlist.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c > CMakeFiles/ktx.dir/lib/hashlist.c.i + +CMakeFiles/ktx.dir/lib/hashlist.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/hashlist.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c -o CMakeFiles/ktx.dir/lib/hashlist.c.s + +CMakeFiles/ktx.dir/lib/info.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/info.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c +CMakeFiles/ktx.dir/lib/info.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building C object CMakeFiles/ktx.dir/lib/info.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/info.c.o -MF CMakeFiles/ktx.dir/lib/info.c.o.d -o CMakeFiles/ktx.dir/lib/info.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c + +CMakeFiles/ktx.dir/lib/info.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/info.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c > CMakeFiles/ktx.dir/lib/info.c.i + +CMakeFiles/ktx.dir/lib/info.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/info.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c -o CMakeFiles/ktx.dir/lib/info.c.s + +CMakeFiles/ktx.dir/lib/memstream.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/memstream.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c +CMakeFiles/ktx.dir/lib/memstream.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building C object CMakeFiles/ktx.dir/lib/memstream.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/memstream.c.o -MF CMakeFiles/ktx.dir/lib/memstream.c.o.d -o CMakeFiles/ktx.dir/lib/memstream.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c + +CMakeFiles/ktx.dir/lib/memstream.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/memstream.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c > CMakeFiles/ktx.dir/lib/memstream.c.i + +CMakeFiles/ktx.dir/lib/memstream.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/memstream.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c -o CMakeFiles/ktx.dir/lib/memstream.c.s + +CMakeFiles/ktx.dir/lib/strings.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/strings.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c +CMakeFiles/ktx.dir/lib/strings.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building C object CMakeFiles/ktx.dir/lib/strings.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/strings.c.o -MF CMakeFiles/ktx.dir/lib/strings.c.o.d -o CMakeFiles/ktx.dir/lib/strings.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c + +CMakeFiles/ktx.dir/lib/strings.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/strings.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c > CMakeFiles/ktx.dir/lib/strings.c.i + +CMakeFiles/ktx.dir/lib/strings.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/strings.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c -o CMakeFiles/ktx.dir/lib/strings.c.s + +CMakeFiles/ktx.dir/lib/swap.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/swap.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c +CMakeFiles/ktx.dir/lib/swap.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Building C object CMakeFiles/ktx.dir/lib/swap.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/swap.c.o -MF CMakeFiles/ktx.dir/lib/swap.c.o.d -o CMakeFiles/ktx.dir/lib/swap.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c + +CMakeFiles/ktx.dir/lib/swap.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/swap.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c > CMakeFiles/ktx.dir/lib/swap.c.i + +CMakeFiles/ktx.dir/lib/swap.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/swap.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c -o CMakeFiles/ktx.dir/lib/swap.c.s + +CMakeFiles/ktx.dir/lib/texture.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/texture.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c +CMakeFiles/ktx.dir/lib/texture.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_21) "Building C object CMakeFiles/ktx.dir/lib/texture.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/texture.c.o -MF CMakeFiles/ktx.dir/lib/texture.c.o.d -o CMakeFiles/ktx.dir/lib/texture.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c + +CMakeFiles/ktx.dir/lib/texture.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/texture.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c > CMakeFiles/ktx.dir/lib/texture.c.i + +CMakeFiles/ktx.dir/lib/texture.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/texture.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c -o CMakeFiles/ktx.dir/lib/texture.c.s + +CMakeFiles/ktx.dir/lib/texture2.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/texture2.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c +CMakeFiles/ktx.dir/lib/texture2.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_22) "Building C object CMakeFiles/ktx.dir/lib/texture2.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/texture2.c.o -MF CMakeFiles/ktx.dir/lib/texture2.c.o.d -o CMakeFiles/ktx.dir/lib/texture2.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c + +CMakeFiles/ktx.dir/lib/texture2.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/texture2.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c > CMakeFiles/ktx.dir/lib/texture2.c.i + +CMakeFiles/ktx.dir/lib/texture2.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/texture2.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c -o CMakeFiles/ktx.dir/lib/texture2.c.s + +CMakeFiles/ktx.dir/lib/vkformat_check.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/vkformat_check.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c +CMakeFiles/ktx.dir/lib/vkformat_check.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_23) "Building C object CMakeFiles/ktx.dir/lib/vkformat_check.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/vkformat_check.c.o -MF CMakeFiles/ktx.dir/lib/vkformat_check.c.o.d -o CMakeFiles/ktx.dir/lib/vkformat_check.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c + +CMakeFiles/ktx.dir/lib/vkformat_check.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/vkformat_check.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c > CMakeFiles/ktx.dir/lib/vkformat_check.c.i + +CMakeFiles/ktx.dir/lib/vkformat_check.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/vkformat_check.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c -o CMakeFiles/ktx.dir/lib/vkformat_check.c.s + +CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c +CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_24) "Building C object CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o -MF CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o.d -o CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c + +CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c > CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.i + +CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c -o CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.s + +CMakeFiles/ktx.dir/lib/vkformat_str.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/vkformat_str.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c +CMakeFiles/ktx.dir/lib/vkformat_str.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_25) "Building C object CMakeFiles/ktx.dir/lib/vkformat_str.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/vkformat_str.c.o -MF CMakeFiles/ktx.dir/lib/vkformat_str.c.o.d -o CMakeFiles/ktx.dir/lib/vkformat_str.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c + +CMakeFiles/ktx.dir/lib/vkformat_str.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/vkformat_str.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c > CMakeFiles/ktx.dir/lib/vkformat_str.c.i + +CMakeFiles/ktx.dir/lib/vkformat_str.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/vkformat_str.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c -o CMakeFiles/ktx.dir/lib/vkformat_str.c.s + +CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c +CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_26) "Building C object CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o -MF CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o.d -o CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c + +CMakeFiles/ktx.dir/lib/vkformat_typesize.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/vkformat_typesize.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c > CMakeFiles/ktx.dir/lib/vkformat_typesize.c.i + +CMakeFiles/ktx.dir/lib/vkformat_typesize.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/vkformat_typesize.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c -o CMakeFiles/ktx.dir/lib/vkformat_typesize.c.s + +CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx +CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_27) "Building CXX object CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o -MF CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o.d -o CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx + +CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx > CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.i + +CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx -o CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.s + +CMakeFiles/ktx.dir/lib/gl_funcs.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/gl_funcs.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c +CMakeFiles/ktx.dir/lib/gl_funcs.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_28) "Building C object CMakeFiles/ktx.dir/lib/gl_funcs.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/gl_funcs.c.o -MF CMakeFiles/ktx.dir/lib/gl_funcs.c.o.d -o CMakeFiles/ktx.dir/lib/gl_funcs.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c + +CMakeFiles/ktx.dir/lib/gl_funcs.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/gl_funcs.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c > CMakeFiles/ktx.dir/lib/gl_funcs.c.i + +CMakeFiles/ktx.dir/lib/gl_funcs.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/gl_funcs.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c -o CMakeFiles/ktx.dir/lib/gl_funcs.c.s + +CMakeFiles/ktx.dir/lib/glloader.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/glloader.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c +CMakeFiles/ktx.dir/lib/glloader.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_29) "Building C object CMakeFiles/ktx.dir/lib/glloader.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/glloader.c.o -MF CMakeFiles/ktx.dir/lib/glloader.c.o.d -o CMakeFiles/ktx.dir/lib/glloader.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c + +CMakeFiles/ktx.dir/lib/glloader.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/glloader.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c > CMakeFiles/ktx.dir/lib/glloader.c.i + +CMakeFiles/ktx.dir/lib/glloader.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/glloader.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c -o CMakeFiles/ktx.dir/lib/glloader.c.s + +CMakeFiles/ktx.dir/lib/texture1.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/texture1.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c +CMakeFiles/ktx.dir/lib/texture1.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_30) "Building C object CMakeFiles/ktx.dir/lib/texture1.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/texture1.c.o -MF CMakeFiles/ktx.dir/lib/texture1.c.o.d -o CMakeFiles/ktx.dir/lib/texture1.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c + +CMakeFiles/ktx.dir/lib/texture1.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/texture1.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c > CMakeFiles/ktx.dir/lib/texture1.c.i + +CMakeFiles/ktx.dir/lib/texture1.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/texture1.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c -o CMakeFiles/ktx.dir/lib/texture1.c.s + +CMakeFiles/ktx.dir/lib/vk_funcs.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/vk_funcs.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c +CMakeFiles/ktx.dir/lib/vk_funcs.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_31) "Building C object CMakeFiles/ktx.dir/lib/vk_funcs.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/vk_funcs.c.o -MF CMakeFiles/ktx.dir/lib/vk_funcs.c.o.d -o CMakeFiles/ktx.dir/lib/vk_funcs.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c + +CMakeFiles/ktx.dir/lib/vk_funcs.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/vk_funcs.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c > CMakeFiles/ktx.dir/lib/vk_funcs.c.i + +CMakeFiles/ktx.dir/lib/vk_funcs.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/vk_funcs.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c -o CMakeFiles/ktx.dir/lib/vk_funcs.c.s + +CMakeFiles/ktx.dir/lib/vkloader.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/vkloader.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c +CMakeFiles/ktx.dir/lib/vkloader.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_32) "Building C object CMakeFiles/ktx.dir/lib/vkloader.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/vkloader.c.o -MF CMakeFiles/ktx.dir/lib/vkloader.c.o.d -o CMakeFiles/ktx.dir/lib/vkloader.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c + +CMakeFiles/ktx.dir/lib/vkloader.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/vkloader.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c > CMakeFiles/ktx.dir/lib/vkloader.c.i + +CMakeFiles/ktx.dir/lib/vkloader.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/vkloader.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c -o CMakeFiles/ktx.dir/lib/vkloader.c.s + +CMakeFiles/ktx.dir/lib/basis_encode.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/basis_encode.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_encode.cpp +CMakeFiles/ktx.dir/lib/basis_encode.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_33) "Building CXX object CMakeFiles/ktx.dir/lib/basis_encode.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/basis_encode.cpp.o -MF CMakeFiles/ktx.dir/lib/basis_encode.cpp.o.d -o CMakeFiles/ktx.dir/lib/basis_encode.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_encode.cpp + +CMakeFiles/ktx.dir/lib/basis_encode.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/lib/basis_encode.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_encode.cpp > CMakeFiles/ktx.dir/lib/basis_encode.cpp.i + +CMakeFiles/ktx.dir/lib/basis_encode.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/lib/basis_encode.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_encode.cpp -o CMakeFiles/ktx.dir/lib/basis_encode.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_34) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_35) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_36) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -Wno-stringop-overflow -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -Wno-stringop-overflow -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -Wno-stringop-overflow -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_37) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_38) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_39) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_40) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_41) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_sse.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_42) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_sse.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_sse.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_sse.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_43) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_44) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resample_filters.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_45) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resample_filters.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resample_filters.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resample_filters.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_46) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_47) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.s + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.cpp +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_48) "Building CXX object CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -Wno-stringop-overflow -MD -MT CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o -MF CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o.d -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.cpp + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -Wno-stringop-overflow -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.cpp > CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.i + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-variable -Wno-class-memaccess -Wno-misleading-indentation -Wno-extra -Wno-deprecated-copy -Wno-parentheses -Wno-stringop-overflow -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.cpp -o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.s + +CMakeFiles/ktx.dir/lib/writer1.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/writer1.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer1.c +CMakeFiles/ktx.dir/lib/writer1.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_49) "Building C object CMakeFiles/ktx.dir/lib/writer1.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/writer1.c.o -MF CMakeFiles/ktx.dir/lib/writer1.c.o.d -o CMakeFiles/ktx.dir/lib/writer1.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer1.c + +CMakeFiles/ktx.dir/lib/writer1.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/writer1.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer1.c > CMakeFiles/ktx.dir/lib/writer1.c.i + +CMakeFiles/ktx.dir/lib/writer1.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/writer1.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer1.c -o CMakeFiles/ktx.dir/lib/writer1.c.s + +CMakeFiles/ktx.dir/lib/writer2.c.o: CMakeFiles/ktx.dir/flags.make +CMakeFiles/ktx.dir/lib/writer2.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer2.c +CMakeFiles/ktx.dir/lib/writer2.c.o: CMakeFiles/ktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_50) "Building C object CMakeFiles/ktx.dir/lib/writer2.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx.dir/lib/writer2.c.o -MF CMakeFiles/ktx.dir/lib/writer2.c.o.d -o CMakeFiles/ktx.dir/lib/writer2.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer2.c + +CMakeFiles/ktx.dir/lib/writer2.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx.dir/lib/writer2.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer2.c > CMakeFiles/ktx.dir/lib/writer2.c.i + +CMakeFiles/ktx.dir/lib/writer2.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx.dir/lib/writer2.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer2.c -o CMakeFiles/ktx.dir/lib/writer2.c.s + +# Object files for target ktx +ktx_OBJECTS = \ +"CMakeFiles/ktx.dir/lib/astc_codec.cpp.o" \ +"CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o" \ +"CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o" \ +"CMakeFiles/ktx.dir/lib/checkheader.c.o" \ +"CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o" \ +"CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o" \ +"CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o" \ +"CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o" \ +"CMakeFiles/ktx.dir/external/dfdutils/queries.c.o" \ +"CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o" \ +"CMakeFiles/ktx.dir/lib/etcunpack.cxx.o" \ +"CMakeFiles/ktx.dir/lib/filestream.c.o" \ +"CMakeFiles/ktx.dir/lib/glformat_str.c.o" \ +"CMakeFiles/ktx.dir/lib/hashlist.c.o" \ +"CMakeFiles/ktx.dir/lib/info.c.o" \ +"CMakeFiles/ktx.dir/lib/memstream.c.o" \ +"CMakeFiles/ktx.dir/lib/strings.c.o" \ +"CMakeFiles/ktx.dir/lib/swap.c.o" \ +"CMakeFiles/ktx.dir/lib/texture.c.o" \ +"CMakeFiles/ktx.dir/lib/texture2.c.o" \ +"CMakeFiles/ktx.dir/lib/vkformat_check.c.o" \ +"CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o" \ +"CMakeFiles/ktx.dir/lib/vkformat_str.c.o" \ +"CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o" \ +"CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o" \ +"CMakeFiles/ktx.dir/lib/gl_funcs.c.o" \ +"CMakeFiles/ktx.dir/lib/glloader.c.o" \ +"CMakeFiles/ktx.dir/lib/texture1.c.o" \ +"CMakeFiles/ktx.dir/lib/vk_funcs.c.o" \ +"CMakeFiles/ktx.dir/lib/vkloader.c.o" \ +"CMakeFiles/ktx.dir/lib/basis_encode.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o" \ +"CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o" \ +"CMakeFiles/ktx.dir/lib/writer1.c.o" \ +"CMakeFiles/ktx.dir/lib/writer2.c.o" + +# External object files for target ktx +ktx_EXTERNAL_OBJECTS = + +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/astc_codec.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/checkheader.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/dfdutils/queries.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/etcunpack.cxx.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/filestream.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/glformat_str.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/hashlist.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/info.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/memstream.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/strings.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/swap.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/texture.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/texture2.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/vkformat_check.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/vkformat_str.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/gl_funcs.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/glloader.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/texture1.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/vk_funcs.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/vkloader.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/basis_encode.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/writer1.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/lib/writer2.c.o +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/build.make +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/compiler_depend.ts +Release/libktx.so.0.0.0: external/astc-encoder/Source/libastcenc-avx2-static.a +Release/libktx.so.0.0.0: CMakeFiles/ktx.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_51) "Linking CXX shared library Release/libktx.so" + $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/ktx.dir/link.txt --verbose=$(VERBOSE) + $(CMAKE_COMMAND) -E cmake_symlink_library Release/libktx.so.0.0.0 Release/libktx.so.0 Release/libktx.so + +Release/libktx.so.0: Release/libktx.so.0.0.0 + @$(CMAKE_COMMAND) -E touch_nocreate Release/libktx.so.0 + +Release/libktx.so: Release/libktx.so.0.0.0 + @$(CMAKE_COMMAND) -E touch_nocreate Release/libktx.so + +# Rule to build all files generated by this target. +CMakeFiles/ktx.dir/build: Release/libktx.so +.PHONY : CMakeFiles/ktx.dir/build + +CMakeFiles/ktx.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ktx.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ktx.dir/clean + +CMakeFiles/ktx.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/DependInfo.cmake "--color=$(COLOR)" ktx +.PHONY : CMakeFiles/ktx.dir/depend + diff --git a/ktx/build/CMakeFiles/ktx.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ktx.dir/cmake_clean.cmake new file mode 100644 index 0000000..65d6c7d --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/cmake_clean.cmake @@ -0,0 +1,113 @@ +file(REMOVE_RECURSE + ".0" + "CMakeFiles/ktx.dir/link.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o" + "CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o.d" + "CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o" + "CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o.d" + "CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o" + "CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o.d" + "CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o" + "CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o.d" + "CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o" + "CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o.d" + "CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o" + "CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o.d" + "CMakeFiles/ktx.dir/external/dfdutils/queries.c.o" + "CMakeFiles/ktx.dir/external/dfdutils/queries.c.o.d" + "CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o" + "CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o.d" + "CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o" + "CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o.d" + "CMakeFiles/ktx.dir/lib/astc_codec.cpp.o" + "CMakeFiles/ktx.dir/lib/astc_codec.cpp.o.d" + "CMakeFiles/ktx.dir/lib/basis_encode.cpp.o" + "CMakeFiles/ktx.dir/lib/basis_encode.cpp.o.d" + "CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o" + "CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o.d" + "CMakeFiles/ktx.dir/lib/checkheader.c.o" + "CMakeFiles/ktx.dir/lib/checkheader.c.o.d" + "CMakeFiles/ktx.dir/lib/etcunpack.cxx.o" + "CMakeFiles/ktx.dir/lib/etcunpack.cxx.o.d" + "CMakeFiles/ktx.dir/lib/filestream.c.o" + "CMakeFiles/ktx.dir/lib/filestream.c.o.d" + "CMakeFiles/ktx.dir/lib/gl_funcs.c.o" + "CMakeFiles/ktx.dir/lib/gl_funcs.c.o.d" + "CMakeFiles/ktx.dir/lib/glformat_str.c.o" + "CMakeFiles/ktx.dir/lib/glformat_str.c.o.d" + "CMakeFiles/ktx.dir/lib/glloader.c.o" + "CMakeFiles/ktx.dir/lib/glloader.c.o.d" + "CMakeFiles/ktx.dir/lib/hashlist.c.o" + "CMakeFiles/ktx.dir/lib/hashlist.c.o.d" + "CMakeFiles/ktx.dir/lib/info.c.o" + "CMakeFiles/ktx.dir/lib/info.c.o.d" + "CMakeFiles/ktx.dir/lib/memstream.c.o" + "CMakeFiles/ktx.dir/lib/memstream.c.o.d" + "CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o" + "CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o.d" + "CMakeFiles/ktx.dir/lib/strings.c.o" + "CMakeFiles/ktx.dir/lib/strings.c.o.d" + "CMakeFiles/ktx.dir/lib/swap.c.o" + "CMakeFiles/ktx.dir/lib/swap.c.o.d" + "CMakeFiles/ktx.dir/lib/texture.c.o" + "CMakeFiles/ktx.dir/lib/texture.c.o.d" + "CMakeFiles/ktx.dir/lib/texture1.c.o" + "CMakeFiles/ktx.dir/lib/texture1.c.o.d" + "CMakeFiles/ktx.dir/lib/texture2.c.o" + "CMakeFiles/ktx.dir/lib/texture2.c.o.d" + "CMakeFiles/ktx.dir/lib/vk_funcs.c.o" + "CMakeFiles/ktx.dir/lib/vk_funcs.c.o.d" + "CMakeFiles/ktx.dir/lib/vkformat_check.c.o" + "CMakeFiles/ktx.dir/lib/vkformat_check.c.o.d" + "CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o" + "CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o.d" + "CMakeFiles/ktx.dir/lib/vkformat_str.c.o" + "CMakeFiles/ktx.dir/lib/vkformat_str.c.o.d" + "CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o" + "CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o.d" + "CMakeFiles/ktx.dir/lib/vkloader.c.o" + "CMakeFiles/ktx.dir/lib/vkloader.c.o.d" + "CMakeFiles/ktx.dir/lib/writer1.c.o" + "CMakeFiles/ktx.dir/lib/writer1.c.o.d" + "CMakeFiles/ktx.dir/lib/writer2.c.o" + "CMakeFiles/ktx.dir/lib/writer2.c.o.d" + "Release/libktx.pdb" + "Release/libktx.so" + "Release/libktx.so.0" + "Release/libktx.so.0.0.0" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C CXX) + include(CMakeFiles/ktx.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ktx.dir/compiler_depend.internal b/ktx/build/CMakeFiles/ktx.dir/compiler_depend.internal new file mode 100644 index 0000000..2c60897 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/compiler_depend.internal @@ -0,0 +1,8490 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_miniz.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_miniz.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/time.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_sse.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_imp.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_flow.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_math.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_math_declares.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_sse.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_type_aliases.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resample_filters.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers_impl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_55.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_56.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cet.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/assert.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/external/dfdutils/queries.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/alloca.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx + /usr/include/alloca.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + +CMakeFiles/ktx.dir/lib/astc_codec.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/inttypes.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/basis_encode.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_encode.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/inttypes.h + /usr/include/libgen.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/inttypes.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/lib/checkheader.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/etcunpack.cxx.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/filestream.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /usr/include/alloca.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm/errno.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/inttypes.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/stat.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/gl_funcs.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /usr/include/alloca.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/dlfcn.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/dlfcn.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/glformat_str.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glext.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GLES2/gl2ext.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/ctype.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/lib/glloader.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk2gl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glFormat.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glInternalFormat.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glType.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/hashlist.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/uthash.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/inttypes.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/info.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/inttypes.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/memstream.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/strings.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/swap.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/texture.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/texture1.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/texture2.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/zstd_errors.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/vk_funcs.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h + /usr/include/alloca.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/dlfcn.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/dlfcn.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/vkformat_check.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/lib/vkformat_str.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/ctype.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/lib/vkloader.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktxvulkan.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/writer1.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer1.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/writer2.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer2.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/zstd_errors.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +Release/libktx.so + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libdl.a + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/queries.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/astc_codec.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/basis_encode.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/checkheader.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/etcunpack.cxx.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/filestream.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/gl_funcs.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/glformat_str.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/glloader.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/hashlist.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/info.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/memstream.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/strings.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/swap.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/texture.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/texture1.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/texture2.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/vk_funcs.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_str.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/vkloader.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/writer1.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx.dir/lib/writer2.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/libastcenc-avx2-static.a + diff --git a/ktx/build/CMakeFiles/ktx.dir/compiler_depend.make b/ktx/build/CMakeFiles/ktx.dir/compiler_depend.make new file mode 100644 index 0000000..8b00165 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/compiler_depend.make @@ -0,0 +1,9493 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_miniz.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_miniz.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/time.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_sse.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_imp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_flow.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_math_declares.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_sse.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_type_aliases.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resample_filters.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_55.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_56.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cet.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/assert.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/external/dfdutils/queries.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/alloca.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx \ + /usr/include/alloca.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + +CMakeFiles/ktx.dir/lib/astc_codec.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/inttypes.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/basis_encode.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_encode.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/inttypes.h \ + /usr/include/libgen.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/inttypes.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx.dir/lib/checkheader.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/etcunpack.cxx.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/filestream.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm/errno.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/inttypes.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/stat.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/gl_funcs.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/include/alloca.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/dlfcn.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/dlfcn.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/glformat_str.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glext.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GLES2/gl2ext.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/ctype.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/lib/glloader.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk2gl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glFormat.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glInternalFormat.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glType.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/hashlist.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/uthash.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/inttypes.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/info.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/inttypes.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/memstream.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/strings.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/swap.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/texture.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/texture1.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/texture2.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/zstd_errors.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/vk_funcs.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h \ + /usr/include/alloca.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/dlfcn.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/dlfcn.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/vkformat_check.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/lib/vkformat_str.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/ctype.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx.dir/lib/vkloader.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktxvulkan.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/writer1.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer1.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx.dir/lib/writer2.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer2.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/zstd_errors.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +Release/libktx.so: /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libdl.a \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o \ + CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o \ + CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o \ + CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o \ + CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o \ + CMakeFiles/ktx.dir/external/dfdutils/queries.c.o \ + CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o \ + CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o \ + CMakeFiles/ktx.dir/lib/astc_codec.cpp.o \ + CMakeFiles/ktx.dir/lib/basis_encode.cpp.o \ + CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o \ + CMakeFiles/ktx.dir/lib/checkheader.c.o \ + CMakeFiles/ktx.dir/lib/etcunpack.cxx.o \ + CMakeFiles/ktx.dir/lib/filestream.c.o \ + CMakeFiles/ktx.dir/lib/gl_funcs.c.o \ + CMakeFiles/ktx.dir/lib/glformat_str.c.o \ + CMakeFiles/ktx.dir/lib/glloader.c.o \ + CMakeFiles/ktx.dir/lib/hashlist.c.o \ + CMakeFiles/ktx.dir/lib/info.c.o \ + CMakeFiles/ktx.dir/lib/memstream.c.o \ + CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o \ + CMakeFiles/ktx.dir/lib/strings.c.o \ + CMakeFiles/ktx.dir/lib/swap.c.o \ + CMakeFiles/ktx.dir/lib/texture.c.o \ + CMakeFiles/ktx.dir/lib/texture1.c.o \ + CMakeFiles/ktx.dir/lib/texture2.c.o \ + CMakeFiles/ktx.dir/lib/vk_funcs.c.o \ + CMakeFiles/ktx.dir/lib/vkformat_check.c.o \ + CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o \ + CMakeFiles/ktx.dir/lib/vkformat_str.c.o \ + CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o \ + CMakeFiles/ktx.dir/lib/vkloader.c.o \ + CMakeFiles/ktx.dir/lib/writer1.c.o \ + CMakeFiles/ktx.dir/lib/writer2.c.o \ + external/astc-encoder/Source/libastcenc-avx2-static.a + + +CMakeFiles/ktx.dir/lib/writer2.c.o: + +CMakeFiles/ktx.dir/lib/vkformat_str.c.o: + +CMakeFiles/ktx.dir/lib/swap.c.o: + +CMakeFiles/ktx.dir/lib/memstream.c.o: + +CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o: + +CMakeFiles/ktx.dir/lib/glloader.c.o: + +CMakeFiles/ktx.dir/lib/gl_funcs.c.o: + +CMakeFiles/ktx.dir/lib/filestream.c.o: + +CMakeFiles/ktx.dir/lib/etcunpack.cxx.o: + +CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o: + +CMakeFiles/ktx.dir/external/dfdutils/queries.c.o: + +CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o: + +CMakeFiles/ktx.dir/lib/vk_funcs.c.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o: + +/usr/lib/libgcc_s.so.1: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o: + +/usr/lib/crtn.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer2.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer1.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktxvulkan.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h: + +CMakeFiles/ktx.dir/lib/basis_encode.cpp.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp: + +CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glFormat.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk2gl.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c: + +/usr/include/dlfcn.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h: + +/usr/include/sys/stat.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h: + +/usr/include/bits/stat.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_encode.cpp: + +/usr/include/inttypes.h: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/istream: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp: + +CMakeFiles/ktx.dir/lib/vkformat_check.c.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c: + +CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cet.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc: + +CMakeFiles/ktx.dir/lib/strings.c.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc: + +/usr/lib/libm.so.6: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_56.inc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc: + +CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers_impl.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resample_filters.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.cpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h: + +/usr/include/c++/16.1.1/bits/stl_relops.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_type_aliases.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_sse.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_math_declares.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_math.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_imp.h: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.h: + +external/astc-encoder/Source/libastcenc-avx2-static.a: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_sse.cpp: + +/usr/include/sys/time.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h: + +CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.cpp: + +/usr/include/c++/16.1.1/bits/unordered_set.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/uthash.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glInternalFormat.inl: + +/usr/include/time.h: + +/usr/include/sys/types.h: + +/usr/include/c++/16.1.1/cstring: + +/usr/include/bits/types/once_flag.h: + +/usr/include/sys/select.h: + +/usr/include/sys/cdefs.h: + +/usr/include/string.h: + +CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o: + +/usr/include/stdlib.h: + +/usr/include/pthread.h: + +/usr/include/memory.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.inl: + +/usr/include/malloc.h: + +/usr/lib/libstdc++.so: + +/usr/include/c++/16.1.1/utility: + +/usr/include/locale.h: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o: + +/usr/include/linux/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/sched/types.h: + +/usr/include/linux/limits.h: + +/usr/include/limits.h: + +/usr/include/libgen.h: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h: + +/usr/include/gnu/stubs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/features-time64.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/lib/libatomic.so: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/vector: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h: + +/usr/include/c++/16.1.1/unordered_map: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c: + +/usr/include/c++/16.1.1/bits/chrono.h: + +/usr/include/strings.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_miniz.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/lib/crti.o: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/include/c++/16.1.1/atomic: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/bits/timesize.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/include/bits/waitflags.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.cpp: + +/usr/include/bits/struct_rwlock.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glType.inl: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/bits/types/clock_t.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/FILE.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glext.h: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/bits/types.h: + +/usr/include/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.cpp: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/lib/libmvec.so.1: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/include/bits/local_lim.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc.inc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h: + +/usr/include/c++/16.1.1/pstl/glue_numeric_defs.h: + +/usr/lib/libgcc_s.so: + +/usr/include/c++/16.1.1/algorithm: + +/usr/include/asm-generic/int-ll64.h: + +/usr/include/asm/posix_types_64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c: + +/usr/include/asm-generic/errno.h: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +/usr/include/bits/fp-logb.h: + +CMakeFiles/ktx.dir/lib/astc_codec.cpp.o: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/c++/16.1.1/initializer_list: + +CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/usr/include/alloca.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/asm-generic/types.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/struct_tm.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/usr/include/asm-generic/posix_types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/asm/types.h: + +CMakeFiles/ktx.dir/lib/texture1.c.o: + +/usr/include/bits/posix2_lim.h: + +/usr/include/bits/mathcalls.h: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/exception: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/c++/16.1.1/new: + +/usr/include/bits/pthreadtypes-arch.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_55.inc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/bits/utility.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h: + +/usr/include/c++/16.1.1/thread: + +/usr/include/bits/types/__locale_t.h: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp: + +/usr/include/c++/16.1.1/bits/unique_lock.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h: + +/usr/include/c++/16.1.1/mutex: + +/usr/include/bits/byteswap.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h: + +/usr/include/c++/16.1.1/system_error: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.cpp: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.h: + +/usr/include/c++/16.1.1/string: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_flow.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h: + +/usr/include/bits/endianness.h: + +/usr/include/assert.h: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/zstd_errors.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/c++/16.1.1/bits/unordered_map.h: + +CMakeFiles/ktx.dir/lib/checkheader.c.o: + +/usr/include/asm/bitsperlong.h: + +/usr/include/bits/typesizes.h: + +/usr/include/bits/dlfcn.h: + +/usr/include/bits/cpu-set.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/bits/floatn.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/bits/long-double.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/bits/iscanonical.h: + +CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +CMakeFiles/ktx.dir/lib/hashlist.c.o: + +/usr/include/bits/libc-header-start.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/bits/math-vector.h: + +/usr/lib/libm.so: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/bits/types/timer_t.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/mathcalls-narrow.h: + +/usr/include/wctype.h: + +/usr/include/sched.h: + +/usr/include/bits/fp-fast.h: + +/usr/include/wchar.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl: + +/usr/include/features.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/bits/sched.h: + +/usr/include/asm/errno.h: + +/usr/include/c++/16.1.1/bits/std_mutex.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/lib/libc.so: + +/usr/include/bits/pthreadtypes.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.cpp: + +/usr/include/c++/16.1.1/bits/stream_iterator.h: + +/usr/include/c++/16.1.1/array: + +/usr/include/bits/select.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +CMakeFiles/ktx.dir/lib/writer1.c.o: + +/usr/include/bits/setjmp.h: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o: + +/usr/include/c++/16.1.1/bit: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/bits/types/error_t.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/c++/16.1.1/unordered_set: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/c++/16.1.1/bits/hashtable.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h: + +/usr/include/c++/16.1.1/bits/hashtable_policy.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/random: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +CMakeFiles/ktx.dir/lib/texture2.c.o: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/bits/struct_stat.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.cpp: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +CMakeFiles/ktx.dir/lib/texture.c.o: + +/usr/include/c++/16.1.1/bits/random.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/c++/16.1.1/bits/random.tcc: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.cpp: + +/usr/include/c++/16.1.1/bits/std_thread.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GLES2/gl2ext.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/math.h: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/lib/libdl.a: + +/usr/include/bits/uintn-identity.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o: + +/usr/include/bits/pthread_stack_min.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/bits/mathcalls-macros.h: + +/usr/include/c++/16.1.1/condition_variable: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/c++/16.1.1/string_view: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/cerrno: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h: + +/usr/include/c++/16.1.1/clocale: + +CMakeFiles/ktx.dir/lib/glformat_str.c.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o: + +/usr/include/stdio.h: + +/usr/include/bits/wordsize.h: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/c++/16.1.1/compare: + +/usr/lib/libc.so.6: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/bits/specfun.h: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/bits/stl_numeric.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/usr/include/c++/16.1.1/functional: + +/usr/include/c++/16.1.1/ios: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/iterator: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +CMakeFiles/ktx.dir/lib/vkloader.c.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/math.h: + +/usr/include/c++/16.1.1/numeric: + +CMakeFiles/ktx.dir/lib/info.c.o: + +/usr/include/errno.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h: + +/usr/include/c++/16.1.1/ratio: + +/usr/include/c++/16.1.1/stdlib.h: + +/usr/include/c++/16.1.1/bits/this_thread_sleep.h: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: diff --git a/ktx/build/CMakeFiles/ktx.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ktx.dir/compiler_depend.ts new file mode 100644 index 0000000..3f5bf85 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for ktx. diff --git a/ktx/build/CMakeFiles/ktx.dir/depend.make b/ktx/build/CMakeFiles/ktx.dir/depend.make new file mode 100644 index 0000000..4e6fb8b --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for ktx. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o new file mode 100644 index 0000000..2c6e5d8 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o.d new file mode 100644 index 0000000..586d456 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o.d @@ -0,0 +1,246 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o new file mode 100644 index 0000000..4d75fa2 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o.d new file mode 100644 index 0000000..92dcdea --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o.d @@ -0,0 +1,246 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_uastc.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o new file mode 100644 index 0000000..55b6561 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o.d new file mode 100644 index 0000000..c54f18f --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o.d @@ -0,0 +1,240 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_uastc.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o new file mode 100644 index 0000000..88f6be2 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o.d new file mode 100644 index 0000000..7b75cce --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o.d @@ -0,0 +1,252 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.h \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_miniz.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o new file mode 100644 index 0000000..003987b Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o.d new file mode 100644 index 0000000..dcb6be5 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o.d @@ -0,0 +1,248 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_miniz.h \ + /usr/include/sys/time.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o new file mode 100644 index 0000000..0aef2cd Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o.d new file mode 100644 index 0000000..2e29287 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o.d @@ -0,0 +1,240 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o new file mode 100644 index 0000000..131c6b0 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o.d new file mode 100644 index 0000000..b162df7 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o.d @@ -0,0 +1,248 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o new file mode 100644 index 0000000..4a33036 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o.d new file mode 100644 index 0000000..3f4406b --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o.d @@ -0,0 +1,243 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_uastc.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o new file mode 100644 index 0000000..c6703e1 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o.d new file mode 100644 index 0000000..d0513c3 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o.d @@ -0,0 +1,250 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_sse.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_sse.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_math_declares.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_flow.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/cppspmd_type_aliases.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_declares.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_kernels_imp.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o new file mode 100644 index 0000000..ee20899 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o.d new file mode 100644 index 0000000..f949746 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o.d @@ -0,0 +1,240 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_opencl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o new file mode 100644 index 0000000..736a461 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o.d new file mode 100644 index 0000000..071cfa6 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o.d @@ -0,0 +1,241 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_pvrtc1_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o new file mode 100644 index 0000000..6ca74ce Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o.d new file mode 100644 index 0000000..c1541e5 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o.d @@ -0,0 +1,210 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resample_filters.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o new file mode 100644 index 0000000..5eb5af9 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o.d new file mode 100644 index 0000000..8778a90 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o.d @@ -0,0 +1,211 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o new file mode 100644 index 0000000..fe3ca4f Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o.d new file mode 100644 index 0000000..6f7ec0c --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o.d @@ -0,0 +1,239 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o new file mode 100644 index 0000000..d21a437 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o.d new file mode 100644 index 0000000..56b2716 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o.d @@ -0,0 +1,243 @@ +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_bc7enc.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o new file mode 100644 index 0000000..e402e1e Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o.d new file mode 100644 index 0000000..26205e1 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o.d @@ -0,0 +1,223 @@ +CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_55.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_56.inc diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o b/ktx/build/CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o new file mode 100644 index 0000000..ead6489 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o.d b/ktx/build/CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o.d new file mode 100644 index 0000000..e67b3fb --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o.d @@ -0,0 +1,58 @@ +CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/sys/types.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cet.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h /usr/include/assert.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o new file mode 100644 index 0000000..d06fc39 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o.d b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o.d new file mode 100644 index 0000000..ba82448 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o.d @@ -0,0 +1,17 @@ +CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o new file mode 100644 index 0000000..d24cad8 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o.d b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o.d new file mode 100644 index 0000000..2737630 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o.d @@ -0,0 +1,37 @@ +CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o new file mode 100644 index 0000000..ff626fe Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o.d b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o.d new file mode 100644 index 0000000..bb5343f --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o.d @@ -0,0 +1,25 @@ +CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o new file mode 100644 index 0000000..96561d7 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o.d b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o.d new file mode 100644 index 0000000..0c9feef --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o.d @@ -0,0 +1,28 @@ +CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/stdio.h /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/queries.c.o b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/queries.c.o new file mode 100644 index 0000000..2ac695e Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/queries.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/queries.c.o.d b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/queries.c.o.d new file mode 100644 index 0000000..d15e236 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/queries.c.o.d @@ -0,0 +1,44 @@ +CMakeFiles/ktx.dir/external/dfdutils/queries.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o new file mode 100644 index 0000000..af5cd22 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o.d b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o.d new file mode 100644 index 0000000..430cc41 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o.d @@ -0,0 +1,18 @@ +CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.inl diff --git a/ktx/build/CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o b/ktx/build/CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o new file mode 100644 index 0000000..434ae29 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o.d b/ktx/build/CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o.d new file mode 100644 index 0000000..698d300 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o.d @@ -0,0 +1,41 @@ +CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx \ + /usr/include/stdc-predef.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h diff --git a/ktx/build/CMakeFiles/ktx.dir/flags.make b/ktx/build/CMakeFiles/ktx.dir/flags.make new file mode 100644 index 0000000..4bb2237 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/flags.make @@ -0,0 +1,49 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile C with /usr/bin/cc +# compile CXX with /usr/bin/c++ +C_DEFINES = -DBASISD_SUPPORT_FXT1=0 -DBASISD_SUPPORT_KTX2=1 -DBASISD_SUPPORT_KTX2_ZSTD=0 -DBASISU_SUPPORT_OPENCL=0 -DBASISU_SUPPORT_SSE=1 -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE -DLIBKTX -DSUPPORT_SOFTWARE_ETC_UNPACK=1 -Dktx_EXPORTS + +C_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include + +C_FLAGS = -O3 -DNDEBUG -fPIC -Wall -Wextra -O3 -ffp-contract=off -Wno-cast-function-type -Wno-pedantic -msse4.1 + +CXX_DEFINES = -DBASISD_SUPPORT_FXT1=0 -DBASISD_SUPPORT_KTX2=1 -DBASISD_SUPPORT_KTX2_ZSTD=0 -DBASISU_SUPPORT_OPENCL=0 -DBASISU_SUPPORT_SSE=1 -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE -DLIBKTX -DSUPPORT_SOFTWARE_ETC_UNPACK=1 -Dktx_EXPORTS + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -fPIC -Wall -Wextra -O3 -ffp-contract=off -Wno-cast-function-type -Wno-pedantic -msse4.1 + +# Custom options: CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-function;-Wno-unused-variable;-Wno-class-memaccess;-Wno-maybe-uninitialized;-Wno-stringop-overflow + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses;-Wno-stringop-overflow + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses + +# Custom options: CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-variable;-Wno-class-memaccess;-Wno-misleading-indentation;-Wno-extra;-Wno-deprecated-copy;-Wno-parentheses;-Wno-stringop-overflow + diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/astc_codec.cpp.o b/ktx/build/CMakeFiles/ktx.dir/lib/astc_codec.cpp.o new file mode 100644 index 0000000..02c7b57 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/astc_codec.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/astc_codec.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/astc_codec.cpp.o.d new file mode 100644 index 0000000..18d19fa --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/astc_codec.cpp.o.d @@ -0,0 +1,210 @@ +CMakeFiles/ktx.dir/lib/astc_codec.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/string.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/inttypes.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/wchar.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/move.h /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/limits /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /usr/include/c++/16.1.1/cstdint diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/basis_encode.cpp.o b/ktx/build/CMakeFiles/ktx.dir/lib/basis_encode.cpp.o new file mode 100644 index 0000000..f118fb6 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/basis_encode.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/basis_encode.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/basis_encode.cpp.o.d new file mode 100644 index 0000000..a7be3db --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/basis_encode.cpp.o.d @@ -0,0 +1,265 @@ +CMakeFiles/ktx.dir/lib/basis_encode.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_encode.cpp \ + /usr/include/stdc-predef.h /usr/include/inttypes.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_comp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_frontend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/string.h /usr/include/strings.h /usr/include/memory.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_etc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_gpu_texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_backend.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_basis_file.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_uastc_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o b/ktx/build/CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o new file mode 100644 index 0000000..a3a3588 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o.d new file mode 100644 index 0000000..3639c97 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o.d @@ -0,0 +1,229 @@ +CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp \ + /usr/include/stdc-predef.h /usr/include/inttypes.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/string.h /usr/include/strings.h /usr/include/memory.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/checkheader.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/checkheader.c.o new file mode 100644 index 0000000..33ba9d3 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/checkheader.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/checkheader.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/checkheader.c.o.d new file mode 100644 index 0000000..71a9e06 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/checkheader.c.o.d @@ -0,0 +1,56 @@ +CMakeFiles/ktx.dir/lib/checkheader.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/string.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/etcunpack.cxx.o b/ktx/build/CMakeFiles/ktx.dir/lib/etcunpack.cxx.o new file mode 100644 index 0000000..ec20d82 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/etcunpack.cxx.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/etcunpack.cxx.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/etcunpack.cxx.o.d new file mode 100644 index 0000000..6c905d6 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/etcunpack.cxx.o.d @@ -0,0 +1,99 @@ +CMakeFiles/ktx.dir/lib/etcunpack.cxx.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/filestream.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/filestream.c.o new file mode 100644 index 0000000..89c1875 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/filestream.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/filestream.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/filestream.c.o.d new file mode 100644 index 0000000..5419fcc --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/filestream.c.o.d @@ -0,0 +1,62 @@ +CMakeFiles/ktx.dir/lib/filestream.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/inttypes.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/string.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/sys/stat.h \ + /usr/include/bits/stat.h /usr/include/bits/struct_stat.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/gl_funcs.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/gl_funcs.c.o new file mode 100644 index 0000000..0f6b96c Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/gl_funcs.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/gl_funcs.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/gl_funcs.c.o.d new file mode 100644 index 0000000..25cde5d --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/gl_funcs.c.o.d @@ -0,0 +1,52 @@ +CMakeFiles/ktx.dir/lib/gl_funcs.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c \ + /usr/include/stdc-predef.h /usr/include/dlfcn.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/dlfcn.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/sys/types.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/glformat_str.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/glformat_str.c.o new file mode 100644 index 0000000..43fa883 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/glformat_str.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/glformat_str.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/glformat_str.c.o.d new file mode 100644 index 0000000..4d4b3a8 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/glformat_str.c.o.d @@ -0,0 +1,28 @@ +CMakeFiles/ktx.dir/lib/glformat_str.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/ctype.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glext.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GLES2/gl2ext.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/glloader.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/glloader.c.o new file mode 100644 index 0000000..3279589 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/glloader.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/glloader.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/glloader.c.o.d new file mode 100644 index 0000000..1947937 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/glloader.c.o.d @@ -0,0 +1,70 @@ +CMakeFiles/ktx.dir/lib/glloader.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/string.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/wchar.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk2gl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glInternalFormat.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glFormat.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glType.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/hashlist.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/hashlist.c.o new file mode 100644 index 0000000..e761f25 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/hashlist.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/hashlist.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/hashlist.c.o.d new file mode 100644 index 0000000..772374d --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/hashlist.c.o.d @@ -0,0 +1,59 @@ +CMakeFiles/ktx.dir/lib/hashlist.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c \ + /usr/include/stdc-predef.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/uthash.h \ + /usr/include/inttypes.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/info.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/info.c.o new file mode 100644 index 0000000..4ec76c0 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/info.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/info.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/info.c.o.d new file mode 100644 index 0000000..caff656 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/info.c.o.d @@ -0,0 +1,63 @@ +CMakeFiles/ktx.dir/lib/info.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/inttypes.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/memstream.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/memstream.c.o new file mode 100644 index 0000000..34dd014 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/memstream.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/memstream.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/memstream.c.o.d new file mode 100644 index 0000000..e0a9a85 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/memstream.c.o.d @@ -0,0 +1,58 @@ +CMakeFiles/ktx.dir/lib/memstream.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/string.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o b/ktx/build/CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o new file mode 100644 index 0000000..43d99e4 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o.d new file mode 100644 index 0000000..eaacab4 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o.d @@ -0,0 +1,98 @@ +CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/assert.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/strings.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/strings.c.o new file mode 100644 index 0000000..ef87242 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/strings.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/strings.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/strings.c.o.d new file mode 100644 index 0000000..2919a66 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/strings.c.o.d @@ -0,0 +1,46 @@ +CMakeFiles/ktx.dir/lib/strings.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/swap.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/swap.c.o new file mode 100644 index 0000000..ef94b3b Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/swap.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/swap.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/swap.c.o.d new file mode 100644 index 0000000..e6da338 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/swap.c.o.d @@ -0,0 +1,45 @@ +CMakeFiles/ktx.dir/lib/swap.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/texture.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/texture.c.o new file mode 100644 index 0000000..236f713 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/texture.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/texture.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/texture.c.o.d new file mode 100644 index 0000000..512d322 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/texture.c.o.d @@ -0,0 +1,64 @@ +CMakeFiles/ktx.dir/lib/texture.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/math.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-logb.h /usr/include/bits/fp-fast.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/texture1.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/texture1.c.o new file mode 100644 index 0000000..9cf09e8 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/texture1.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/texture1.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/texture1.c.o.d new file mode 100644 index 0000000..f6d4b74 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/texture1.c.o.d @@ -0,0 +1,69 @@ +CMakeFiles/ktx.dir/lib/texture1.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c \ + /usr/include/stdc-predef.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/texture2.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/texture2.c.o new file mode 100644 index 0000000..0253298 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/texture2.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/texture2.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/texture2.c.o.d new file mode 100644 index 0000000..7c0f01c --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/texture2.c.o.d @@ -0,0 +1,67 @@ +CMakeFiles/ktx.dir/lib/texture2.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/zstd_errors.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/vk_funcs.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/vk_funcs.c.o new file mode 100644 index 0000000..4c3459c Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/vk_funcs.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/vk_funcs.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/vk_funcs.c.o.d new file mode 100644 index 0000000..07cc856 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/vk_funcs.c.o.d @@ -0,0 +1,52 @@ +CMakeFiles/ktx.dir/lib/vk_funcs.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/dlfcn.h /usr/include/bits/dlfcn.h /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/types/once_flag.h /usr/include/bits/stdlib-float.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check.c.o new file mode 100644 index 0000000..c015096 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check.c.o.d new file mode 100644 index 0000000..ff6d38c --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check.c.o.d @@ -0,0 +1,15 @@ +CMakeFiles/ktx.dir/lib/vkformat_check.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o new file mode 100644 index 0000000..7d90cbd Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o.d new file mode 100644 index 0000000..5ee09d2 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o.d @@ -0,0 +1,15 @@ +CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_str.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_str.c.o new file mode 100644 index 0000000..682ee6e Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_str.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_str.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_str.c.o.d new file mode 100644 index 0000000..e151d9b --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_str.c.o.d @@ -0,0 +1,16 @@ +CMakeFiles/ktx.dir/lib/vkformat_str.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/ctype.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o new file mode 100644 index 0000000..c713fb1 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o.d new file mode 100644 index 0000000..0178e84 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o.d @@ -0,0 +1,14 @@ +CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/vkloader.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/vkloader.c.o new file mode 100644 index 0000000..6d0b07e Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/vkloader.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/vkloader.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/vkloader.c.o.d new file mode 100644 index 0000000..a6c5ace --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/vkloader.c.o.d @@ -0,0 +1,70 @@ +CMakeFiles/ktx.dir/lib/vkloader.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/math.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-logb.h /usr/include/bits/fp-fast.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktxvulkan.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/writer1.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/writer1.c.o new file mode 100644 index 0000000..09aea29 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/writer1.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/writer1.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/writer1.c.o.d new file mode 100644 index 0000000..177be14 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/writer1.c.o.d @@ -0,0 +1,69 @@ +CMakeFiles/ktx.dir/lib/writer1.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer1.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/writer2.c.o b/ktx/build/CMakeFiles/ktx.dir/lib/writer2.c.o new file mode 100644 index 0000000..730d180 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx.dir/lib/writer2.c.o differ diff --git a/ktx/build/CMakeFiles/ktx.dir/lib/writer2.c.o.d b/ktx/build/CMakeFiles/ktx.dir/lib/writer2.c.o.d new file mode 100644 index 0000000..f451585 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/lib/writer2.c.o.d @@ -0,0 +1,72 @@ +CMakeFiles/ktx.dir/lib/writer2.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer2.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/zstd_errors.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h diff --git a/ktx/build/CMakeFiles/ktx.dir/link.d b/ktx/build/CMakeFiles/ktx.dir/link.d new file mode 100644 index 0000000..eaffe12 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/link.d @@ -0,0 +1,247 @@ +Release/libktx.so.0.0.0: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/ktx.dir/lib/astc_codec.cpp.o \ + CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o \ + CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o \ + CMakeFiles/ktx.dir/lib/checkheader.c.o \ + CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o \ + CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o \ + CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o \ + CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o \ + CMakeFiles/ktx.dir/external/dfdutils/queries.c.o \ + CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o \ + CMakeFiles/ktx.dir/lib/etcunpack.cxx.o \ + CMakeFiles/ktx.dir/lib/filestream.c.o \ + CMakeFiles/ktx.dir/lib/glformat_str.c.o \ + CMakeFiles/ktx.dir/lib/hashlist.c.o \ + CMakeFiles/ktx.dir/lib/info.c.o \ + CMakeFiles/ktx.dir/lib/memstream.c.o \ + CMakeFiles/ktx.dir/lib/strings.c.o \ + CMakeFiles/ktx.dir/lib/swap.c.o \ + CMakeFiles/ktx.dir/lib/texture.c.o \ + CMakeFiles/ktx.dir/lib/texture2.c.o \ + CMakeFiles/ktx.dir/lib/vkformat_check.c.o \ + CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o \ + CMakeFiles/ktx.dir/lib/vkformat_str.c.o \ + CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o \ + CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o \ + CMakeFiles/ktx.dir/lib/gl_funcs.c.o \ + CMakeFiles/ktx.dir/lib/glloader.c.o \ + CMakeFiles/ktx.dir/lib/texture1.c.o \ + CMakeFiles/ktx.dir/lib/vk_funcs.c.o \ + CMakeFiles/ktx.dir/lib/vkloader.c.o \ + CMakeFiles/ktx.dir/lib/basis_encode.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o \ + CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o \ + CMakeFiles/ktx.dir/lib/writer1.c.o \ + CMakeFiles/ktx.dir/lib/writer2.c.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libdl.a \ + external/astc-encoder/Source/libastcenc-avx2-static.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/ktx.dir/lib/astc_codec.cpp.o: + +CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o: + +CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o: + +CMakeFiles/ktx.dir/lib/checkheader.c.o: + +CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o: + +CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o: + +CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o: + +CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o: + +CMakeFiles/ktx.dir/external/dfdutils/queries.c.o: + +CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o: + +CMakeFiles/ktx.dir/lib/etcunpack.cxx.o: + +CMakeFiles/ktx.dir/lib/filestream.c.o: + +CMakeFiles/ktx.dir/lib/glformat_str.c.o: + +CMakeFiles/ktx.dir/lib/hashlist.c.o: + +CMakeFiles/ktx.dir/lib/info.c.o: + +CMakeFiles/ktx.dir/lib/memstream.c.o: + +CMakeFiles/ktx.dir/lib/strings.c.o: + +CMakeFiles/ktx.dir/lib/swap.c.o: + +CMakeFiles/ktx.dir/lib/texture.c.o: + +CMakeFiles/ktx.dir/lib/texture2.c.o: + +CMakeFiles/ktx.dir/lib/vkformat_check.c.o: + +CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o: + +CMakeFiles/ktx.dir/lib/vkformat_str.c.o: + +CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o: + +CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o: + +CMakeFiles/ktx.dir/lib/gl_funcs.c.o: + +CMakeFiles/ktx.dir/lib/glloader.c.o: + +CMakeFiles/ktx.dir/lib/texture1.c.o: + +CMakeFiles/ktx.dir/lib/vk_funcs.c.o: + +CMakeFiles/ktx.dir/lib/vkloader.c.o: + +CMakeFiles/ktx.dir/lib/basis_encode.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o: + +CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o: + +CMakeFiles/ktx.dir/lib/writer1.c.o: + +CMakeFiles/ktx.dir/lib/writer2.c.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libdl.a: + +external/astc-encoder/Source/libastcenc-avx2-static.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: diff --git a/ktx/build/CMakeFiles/ktx.dir/link.txt b/ktx/build/CMakeFiles/ktx.dir/link.txt new file mode 100644 index 0000000..3be06ad --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -fPIC -msse4.1 -O3 -DNDEBUG -shared -O3 -Wl,--dependency-file=CMakeFiles/ktx.dir/link.d -Wl,-soname,libktx.so.0 -o Release/libktx.so.0.0.0 CMakeFiles/ktx.dir/lib/astc_codec.cpp.o CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o CMakeFiles/ktx.dir/lib/checkheader.c.o CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o CMakeFiles/ktx.dir/external/dfdutils/queries.c.o CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o CMakeFiles/ktx.dir/lib/etcunpack.cxx.o CMakeFiles/ktx.dir/lib/filestream.c.o CMakeFiles/ktx.dir/lib/glformat_str.c.o CMakeFiles/ktx.dir/lib/hashlist.c.o CMakeFiles/ktx.dir/lib/info.c.o CMakeFiles/ktx.dir/lib/memstream.c.o CMakeFiles/ktx.dir/lib/strings.c.o CMakeFiles/ktx.dir/lib/swap.c.o CMakeFiles/ktx.dir/lib/texture.c.o CMakeFiles/ktx.dir/lib/texture2.c.o CMakeFiles/ktx.dir/lib/vkformat_check.c.o CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o CMakeFiles/ktx.dir/lib/vkformat_str.c.o CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o CMakeFiles/ktx.dir/lib/gl_funcs.c.o CMakeFiles/ktx.dir/lib/glloader.c.o CMakeFiles/ktx.dir/lib/texture1.c.o CMakeFiles/ktx.dir/lib/vk_funcs.c.o CMakeFiles/ktx.dir/lib/vkloader.c.o CMakeFiles/ktx.dir/lib/basis_encode.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o CMakeFiles/ktx.dir/lib/writer1.c.o CMakeFiles/ktx.dir/lib/writer2.c.o -ldl external/astc-encoder/Source/libastcenc-avx2-static.a diff --git a/ktx/build/CMakeFiles/ktx.dir/progress.make b/ktx/build/CMakeFiles/ktx.dir/progress.make new file mode 100644 index 0000000..1fa3e0f --- /dev/null +++ b/ktx/build/CMakeFiles/ktx.dir/progress.make @@ -0,0 +1,52 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 26 +CMAKE_PROGRESS_3 = +CMAKE_PROGRESS_4 = 27 +CMAKE_PROGRESS_5 = 28 +CMAKE_PROGRESS_6 = +CMAKE_PROGRESS_7 = 29 +CMAKE_PROGRESS_8 = +CMAKE_PROGRESS_9 = 30 +CMAKE_PROGRESS_10 = +CMAKE_PROGRESS_11 = 31 +CMAKE_PROGRESS_12 = +CMAKE_PROGRESS_13 = 32 +CMAKE_PROGRESS_14 = +CMAKE_PROGRESS_15 = 33 +CMAKE_PROGRESS_16 = 34 +CMAKE_PROGRESS_17 = +CMAKE_PROGRESS_18 = 35 +CMAKE_PROGRESS_19 = +CMAKE_PROGRESS_20 = 36 +CMAKE_PROGRESS_21 = +CMAKE_PROGRESS_22 = 37 +CMAKE_PROGRESS_23 = +CMAKE_PROGRESS_24 = 38 +CMAKE_PROGRESS_25 = 39 +CMAKE_PROGRESS_26 = +CMAKE_PROGRESS_27 = 40 +CMAKE_PROGRESS_28 = +CMAKE_PROGRESS_29 = 41 +CMAKE_PROGRESS_30 = +CMAKE_PROGRESS_31 = 42 +CMAKE_PROGRESS_32 = +CMAKE_PROGRESS_33 = 43 +CMAKE_PROGRESS_34 = +CMAKE_PROGRESS_35 = 44 +CMAKE_PROGRESS_36 = 45 +CMAKE_PROGRESS_37 = +CMAKE_PROGRESS_38 = 46 +CMAKE_PROGRESS_39 = +CMAKE_PROGRESS_40 = 47 +CMAKE_PROGRESS_41 = +CMAKE_PROGRESS_42 = 48 +CMAKE_PROGRESS_43 = +CMAKE_PROGRESS_44 = 49 +CMAKE_PROGRESS_45 = 50 +CMAKE_PROGRESS_46 = +CMAKE_PROGRESS_47 = 51 +CMAKE_PROGRESS_48 = +CMAKE_PROGRESS_49 = 52 +CMAKE_PROGRESS_50 = +CMAKE_PROGRESS_51 = 53 + diff --git a/ktx/build/CMakeFiles/ktx_read.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ktx_read.dir/DependInfo.cmake new file mode 100644 index 0000000..76776e2 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/DependInfo.cmake @@ -0,0 +1,62 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c" "CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o" "gcc" "CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c" "CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o" "gcc" "CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c" "CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o" "gcc" "CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c" "CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o" "gcc" "CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c" "CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o" "gcc" "CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c" "CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o" "gcc" "CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c" "CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o" "gcc" "CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c" "CMakeFiles/ktx_read.dir/lib/checkheader.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/checkheader.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c" "CMakeFiles/ktx_read.dir/lib/filestream.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/filestream.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c" "CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c" "CMakeFiles/ktx_read.dir/lib/glformat_str.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/glformat_str.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c" "CMakeFiles/ktx_read.dir/lib/glloader.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/glloader.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c" "CMakeFiles/ktx_read.dir/lib/hashlist.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/hashlist.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c" "CMakeFiles/ktx_read.dir/lib/info.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/info.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c" "CMakeFiles/ktx_read.dir/lib/memstream.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/memstream.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c" "CMakeFiles/ktx_read.dir/lib/strings.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/strings.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c" "CMakeFiles/ktx_read.dir/lib/swap.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/swap.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c" "CMakeFiles/ktx_read.dir/lib/texture.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/texture.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c" "CMakeFiles/ktx_read.dir/lib/texture1.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/texture1.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c" "CMakeFiles/ktx_read.dir/lib/texture2.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/texture2.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c" "CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c" "CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c" "CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c" "CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c" "CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c" "CMakeFiles/ktx_read.dir/lib/vkloader.c.o" "gcc" "CMakeFiles/ktx_read.dir/lib/vkloader.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp" "CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o" "gcc" "CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx" "CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o" "gcc" "CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp" "CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o" "gcc" "CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp" "CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o" "gcc" "CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx" "CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o" "gcc" "CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp" "CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o" "gcc" "CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o.d" + "" "Release/libktx_read.so" "gcc" "CMakeFiles/ktx_read.dir/link.d" + ) + +# Pairs of files generated by the same build rule. +set(CMAKE_MULTIPLE_OUTPUT_PAIRS + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx_read.so" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx_read.so.0.0.0" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx_read.so.0" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx_read.so.0.0.0" + ) + + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ktx_read.dir/build.make b/ktx/build/CMakeFiles/ktx_read.dir/build.make new file mode 100644 index 0000000..3962b4f --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/build.make @@ -0,0 +1,618 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include CMakeFiles/ktx_read.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include CMakeFiles/ktx_read.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ktx_read.dir/progress.make + +# Include the compile flags for this target's objects. +include CMakeFiles/ktx_read.dir/flags.make + +CMakeFiles/ktx_read.dir/codegen: +.PHONY : CMakeFiles/ktx_read.dir/codegen + +CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp +CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o -MF CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o.d -o CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp + +CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp > CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.i + +CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp -o CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.s + +CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp +CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o -MF CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o.d -o CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp + +CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp > CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.i + +CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp -o CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.s + +CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp +CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o -MF CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o.d -o CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp + +CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp > CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.i + +CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp -o CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.s + +CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp +CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-function -Wno-unused-variable -Wno-class-memaccess -Wno-maybe-uninitialized -Wno-stringop-overflow -MD -MT CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o -MF CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o.d -o CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp + +CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-function -Wno-unused-variable -Wno-class-memaccess -Wno-maybe-uninitialized -Wno-stringop-overflow -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp > CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.i + +CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -fno-strict-aliasing -Wno-sign-compare -Wno-unused-function -Wno-unused-variable -Wno-class-memaccess -Wno-maybe-uninitialized -Wno-stringop-overflow -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp -o CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.s + +CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c +CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building C object CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o -MF CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o.d -o CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c + +CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c > CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.i + +CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c -o CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.s + +CMakeFiles/ktx_read.dir/lib/checkheader.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/checkheader.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c +CMakeFiles/ktx_read.dir/lib/checkheader.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building C object CMakeFiles/ktx_read.dir/lib/checkheader.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/checkheader.c.o -MF CMakeFiles/ktx_read.dir/lib/checkheader.c.o.d -o CMakeFiles/ktx_read.dir/lib/checkheader.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c + +CMakeFiles/ktx_read.dir/lib/checkheader.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/checkheader.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c > CMakeFiles/ktx_read.dir/lib/checkheader.c.i + +CMakeFiles/ktx_read.dir/lib/checkheader.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/checkheader.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c -o CMakeFiles/ktx_read.dir/lib/checkheader.c.s + +CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c +CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building C object CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o -MF CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o.d -o CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c + +CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c > CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.i + +CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c -o CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.s + +CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c +CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building C object CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o -MF CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o.d -o CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c + +CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c > CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.i + +CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c -o CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.s + +CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c +CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building C object CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o -MF CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o.d -o CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c + +CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c > CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.i + +CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c -o CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.s + +CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c +CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building C object CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o -MF CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o.d -o CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c + +CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c > CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.i + +CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c -o CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.s + +CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c +CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building C object CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o -MF CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o.d -o CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c + +CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c > CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.i + +CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c -o CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.s + +CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c +CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building C object CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o -MF CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o.d -o CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c + +CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c > CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.i + +CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c -o CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.s + +CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx +CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building CXX object CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o -MF CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o.d -o CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx + +CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx > CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.i + +CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx -o CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.s + +CMakeFiles/ktx_read.dir/lib/filestream.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/filestream.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c +CMakeFiles/ktx_read.dir/lib/filestream.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building C object CMakeFiles/ktx_read.dir/lib/filestream.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/filestream.c.o -MF CMakeFiles/ktx_read.dir/lib/filestream.c.o.d -o CMakeFiles/ktx_read.dir/lib/filestream.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c + +CMakeFiles/ktx_read.dir/lib/filestream.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/filestream.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c > CMakeFiles/ktx_read.dir/lib/filestream.c.i + +CMakeFiles/ktx_read.dir/lib/filestream.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/filestream.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c -o CMakeFiles/ktx_read.dir/lib/filestream.c.s + +CMakeFiles/ktx_read.dir/lib/glformat_str.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/glformat_str.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c +CMakeFiles/ktx_read.dir/lib/glformat_str.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building C object CMakeFiles/ktx_read.dir/lib/glformat_str.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/glformat_str.c.o -MF CMakeFiles/ktx_read.dir/lib/glformat_str.c.o.d -o CMakeFiles/ktx_read.dir/lib/glformat_str.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c + +CMakeFiles/ktx_read.dir/lib/glformat_str.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/glformat_str.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c > CMakeFiles/ktx_read.dir/lib/glformat_str.c.i + +CMakeFiles/ktx_read.dir/lib/glformat_str.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/glformat_str.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c -o CMakeFiles/ktx_read.dir/lib/glformat_str.c.s + +CMakeFiles/ktx_read.dir/lib/hashlist.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/hashlist.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c +CMakeFiles/ktx_read.dir/lib/hashlist.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building C object CMakeFiles/ktx_read.dir/lib/hashlist.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/hashlist.c.o -MF CMakeFiles/ktx_read.dir/lib/hashlist.c.o.d -o CMakeFiles/ktx_read.dir/lib/hashlist.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c + +CMakeFiles/ktx_read.dir/lib/hashlist.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/hashlist.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c > CMakeFiles/ktx_read.dir/lib/hashlist.c.i + +CMakeFiles/ktx_read.dir/lib/hashlist.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/hashlist.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c -o CMakeFiles/ktx_read.dir/lib/hashlist.c.s + +CMakeFiles/ktx_read.dir/lib/info.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/info.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c +CMakeFiles/ktx_read.dir/lib/info.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building C object CMakeFiles/ktx_read.dir/lib/info.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/info.c.o -MF CMakeFiles/ktx_read.dir/lib/info.c.o.d -o CMakeFiles/ktx_read.dir/lib/info.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c + +CMakeFiles/ktx_read.dir/lib/info.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/info.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c > CMakeFiles/ktx_read.dir/lib/info.c.i + +CMakeFiles/ktx_read.dir/lib/info.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/info.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c -o CMakeFiles/ktx_read.dir/lib/info.c.s + +CMakeFiles/ktx_read.dir/lib/memstream.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/memstream.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c +CMakeFiles/ktx_read.dir/lib/memstream.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building C object CMakeFiles/ktx_read.dir/lib/memstream.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/memstream.c.o -MF CMakeFiles/ktx_read.dir/lib/memstream.c.o.d -o CMakeFiles/ktx_read.dir/lib/memstream.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c + +CMakeFiles/ktx_read.dir/lib/memstream.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/memstream.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c > CMakeFiles/ktx_read.dir/lib/memstream.c.i + +CMakeFiles/ktx_read.dir/lib/memstream.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/memstream.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c -o CMakeFiles/ktx_read.dir/lib/memstream.c.s + +CMakeFiles/ktx_read.dir/lib/strings.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/strings.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c +CMakeFiles/ktx_read.dir/lib/strings.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building C object CMakeFiles/ktx_read.dir/lib/strings.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/strings.c.o -MF CMakeFiles/ktx_read.dir/lib/strings.c.o.d -o CMakeFiles/ktx_read.dir/lib/strings.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c + +CMakeFiles/ktx_read.dir/lib/strings.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/strings.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c > CMakeFiles/ktx_read.dir/lib/strings.c.i + +CMakeFiles/ktx_read.dir/lib/strings.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/strings.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c -o CMakeFiles/ktx_read.dir/lib/strings.c.s + +CMakeFiles/ktx_read.dir/lib/swap.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/swap.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c +CMakeFiles/ktx_read.dir/lib/swap.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Building C object CMakeFiles/ktx_read.dir/lib/swap.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/swap.c.o -MF CMakeFiles/ktx_read.dir/lib/swap.c.o.d -o CMakeFiles/ktx_read.dir/lib/swap.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c + +CMakeFiles/ktx_read.dir/lib/swap.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/swap.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c > CMakeFiles/ktx_read.dir/lib/swap.c.i + +CMakeFiles/ktx_read.dir/lib/swap.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/swap.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c -o CMakeFiles/ktx_read.dir/lib/swap.c.s + +CMakeFiles/ktx_read.dir/lib/texture.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/texture.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c +CMakeFiles/ktx_read.dir/lib/texture.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_21) "Building C object CMakeFiles/ktx_read.dir/lib/texture.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/texture.c.o -MF CMakeFiles/ktx_read.dir/lib/texture.c.o.d -o CMakeFiles/ktx_read.dir/lib/texture.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c + +CMakeFiles/ktx_read.dir/lib/texture.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/texture.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c > CMakeFiles/ktx_read.dir/lib/texture.c.i + +CMakeFiles/ktx_read.dir/lib/texture.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/texture.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c -o CMakeFiles/ktx_read.dir/lib/texture.c.s + +CMakeFiles/ktx_read.dir/lib/texture2.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/texture2.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c +CMakeFiles/ktx_read.dir/lib/texture2.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_22) "Building C object CMakeFiles/ktx_read.dir/lib/texture2.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/texture2.c.o -MF CMakeFiles/ktx_read.dir/lib/texture2.c.o.d -o CMakeFiles/ktx_read.dir/lib/texture2.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c + +CMakeFiles/ktx_read.dir/lib/texture2.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/texture2.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c > CMakeFiles/ktx_read.dir/lib/texture2.c.i + +CMakeFiles/ktx_read.dir/lib/texture2.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/texture2.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c -o CMakeFiles/ktx_read.dir/lib/texture2.c.s + +CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c +CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_23) "Building C object CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o -MF CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o.d -o CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c + +CMakeFiles/ktx_read.dir/lib/vkformat_check.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/vkformat_check.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c > CMakeFiles/ktx_read.dir/lib/vkformat_check.c.i + +CMakeFiles/ktx_read.dir/lib/vkformat_check.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/vkformat_check.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c -o CMakeFiles/ktx_read.dir/lib/vkformat_check.c.s + +CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c +CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_24) "Building C object CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o -MF CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o.d -o CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c + +CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c > CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.i + +CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c -o CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.s + +CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c +CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_25) "Building C object CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o -MF CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o.d -o CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c + +CMakeFiles/ktx_read.dir/lib/vkformat_str.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/vkformat_str.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c > CMakeFiles/ktx_read.dir/lib/vkformat_str.c.i + +CMakeFiles/ktx_read.dir/lib/vkformat_str.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/vkformat_str.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c -o CMakeFiles/ktx_read.dir/lib/vkformat_str.c.s + +CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c +CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_26) "Building C object CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o -MF CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o.d -o CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c + +CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c > CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.i + +CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c -o CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.s + +CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx +CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_27) "Building CXX object CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o -MF CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o.d -o CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx + +CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx > CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.i + +CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx -o CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.s + +CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c +CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_28) "Building C object CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o -MF CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o.d -o CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c + +CMakeFiles/ktx_read.dir/lib/gl_funcs.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/gl_funcs.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c > CMakeFiles/ktx_read.dir/lib/gl_funcs.c.i + +CMakeFiles/ktx_read.dir/lib/gl_funcs.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/gl_funcs.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c -o CMakeFiles/ktx_read.dir/lib/gl_funcs.c.s + +CMakeFiles/ktx_read.dir/lib/glloader.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/glloader.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c +CMakeFiles/ktx_read.dir/lib/glloader.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_29) "Building C object CMakeFiles/ktx_read.dir/lib/glloader.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/glloader.c.o -MF CMakeFiles/ktx_read.dir/lib/glloader.c.o.d -o CMakeFiles/ktx_read.dir/lib/glloader.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c + +CMakeFiles/ktx_read.dir/lib/glloader.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/glloader.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c > CMakeFiles/ktx_read.dir/lib/glloader.c.i + +CMakeFiles/ktx_read.dir/lib/glloader.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/glloader.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c -o CMakeFiles/ktx_read.dir/lib/glloader.c.s + +CMakeFiles/ktx_read.dir/lib/texture1.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/texture1.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c +CMakeFiles/ktx_read.dir/lib/texture1.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_30) "Building C object CMakeFiles/ktx_read.dir/lib/texture1.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/texture1.c.o -MF CMakeFiles/ktx_read.dir/lib/texture1.c.o.d -o CMakeFiles/ktx_read.dir/lib/texture1.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c + +CMakeFiles/ktx_read.dir/lib/texture1.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/texture1.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c > CMakeFiles/ktx_read.dir/lib/texture1.c.i + +CMakeFiles/ktx_read.dir/lib/texture1.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/texture1.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c -o CMakeFiles/ktx_read.dir/lib/texture1.c.s + +CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c +CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_31) "Building C object CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o -MF CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o.d -o CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c + +CMakeFiles/ktx_read.dir/lib/vk_funcs.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/vk_funcs.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c > CMakeFiles/ktx_read.dir/lib/vk_funcs.c.i + +CMakeFiles/ktx_read.dir/lib/vk_funcs.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/vk_funcs.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c -o CMakeFiles/ktx_read.dir/lib/vk_funcs.c.s + +CMakeFiles/ktx_read.dir/lib/vkloader.c.o: CMakeFiles/ktx_read.dir/flags.make +CMakeFiles/ktx_read.dir/lib/vkloader.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c +CMakeFiles/ktx_read.dir/lib/vkloader.c.o: CMakeFiles/ktx_read.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_32) "Building C object CMakeFiles/ktx_read.dir/lib/vkloader.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/ktx_read.dir/lib/vkloader.c.o -MF CMakeFiles/ktx_read.dir/lib/vkloader.c.o.d -o CMakeFiles/ktx_read.dir/lib/vkloader.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c + +CMakeFiles/ktx_read.dir/lib/vkloader.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/ktx_read.dir/lib/vkloader.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c > CMakeFiles/ktx_read.dir/lib/vkloader.c.i + +CMakeFiles/ktx_read.dir/lib/vkloader.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/ktx_read.dir/lib/vkloader.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c -o CMakeFiles/ktx_read.dir/lib/vkloader.c.s + +# Object files for target ktx_read +ktx_read_OBJECTS = \ +"CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o" \ +"CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o" \ +"CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o" \ +"CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o" \ +"CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o" \ +"CMakeFiles/ktx_read.dir/lib/checkheader.c.o" \ +"CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o" \ +"CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o" \ +"CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o" \ +"CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o" \ +"CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o" \ +"CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o" \ +"CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o" \ +"CMakeFiles/ktx_read.dir/lib/filestream.c.o" \ +"CMakeFiles/ktx_read.dir/lib/glformat_str.c.o" \ +"CMakeFiles/ktx_read.dir/lib/hashlist.c.o" \ +"CMakeFiles/ktx_read.dir/lib/info.c.o" \ +"CMakeFiles/ktx_read.dir/lib/memstream.c.o" \ +"CMakeFiles/ktx_read.dir/lib/strings.c.o" \ +"CMakeFiles/ktx_read.dir/lib/swap.c.o" \ +"CMakeFiles/ktx_read.dir/lib/texture.c.o" \ +"CMakeFiles/ktx_read.dir/lib/texture2.c.o" \ +"CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o" \ +"CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o" \ +"CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o" \ +"CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o" \ +"CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o" \ +"CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o" \ +"CMakeFiles/ktx_read.dir/lib/glloader.c.o" \ +"CMakeFiles/ktx_read.dir/lib/texture1.c.o" \ +"CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o" \ +"CMakeFiles/ktx_read.dir/lib/vkloader.c.o" + +# External object files for target ktx_read +ktx_read_EXTERNAL_OBJECTS = + +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/checkheader.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/filestream.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/glformat_str.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/hashlist.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/info.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/memstream.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/strings.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/swap.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/texture.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/texture2.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/glloader.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/texture1.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/lib/vkloader.c.o +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/build.make +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/compiler_depend.ts +Release/libktx_read.so.0.0.0: external/astc-encoder/Source/libastcenc-avx2-static.a +Release/libktx_read.so.0.0.0: CMakeFiles/ktx_read.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_33) "Linking CXX shared library Release/libktx_read.so" + $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/ktx_read.dir/link.txt --verbose=$(VERBOSE) + $(CMAKE_COMMAND) -E cmake_symlink_library Release/libktx_read.so.0.0.0 Release/libktx_read.so.0 Release/libktx_read.so + +Release/libktx_read.so.0: Release/libktx_read.so.0.0.0 + @$(CMAKE_COMMAND) -E touch_nocreate Release/libktx_read.so.0 + +Release/libktx_read.so: Release/libktx_read.so.0.0.0 + @$(CMAKE_COMMAND) -E touch_nocreate Release/libktx_read.so + +# Rule to build all files generated by this target. +CMakeFiles/ktx_read.dir/build: Release/libktx_read.so +.PHONY : CMakeFiles/ktx_read.dir/build + +CMakeFiles/ktx_read.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ktx_read.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ktx_read.dir/clean + +CMakeFiles/ktx_read.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/DependInfo.cmake "--color=$(COLOR)" ktx_read +.PHONY : CMakeFiles/ktx_read.dir/depend + diff --git a/ktx/build/CMakeFiles/ktx_read.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ktx_read.dir/cmake_clean.cmake new file mode 100644 index 0000000..5c90463 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/cmake_clean.cmake @@ -0,0 +1,77 @@ +file(REMOVE_RECURSE + ".0" + "CMakeFiles/ktx_read.dir/link.d" + "CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o" + "CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o.d" + "CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o" + "CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o.d" + "CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o" + "CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o.d" + "CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o" + "CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o.d" + "CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o" + "CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o.d" + "CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o" + "CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o.d" + "CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o" + "CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o.d" + "CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o" + "CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o.d" + "CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o" + "CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o.d" + "CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o" + "CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o.d" + "CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o" + "CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o.d" + "CMakeFiles/ktx_read.dir/lib/checkheader.c.o" + "CMakeFiles/ktx_read.dir/lib/checkheader.c.o.d" + "CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o" + "CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o.d" + "CMakeFiles/ktx_read.dir/lib/filestream.c.o" + "CMakeFiles/ktx_read.dir/lib/filestream.c.o.d" + "CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o" + "CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o.d" + "CMakeFiles/ktx_read.dir/lib/glformat_str.c.o" + "CMakeFiles/ktx_read.dir/lib/glformat_str.c.o.d" + "CMakeFiles/ktx_read.dir/lib/glloader.c.o" + "CMakeFiles/ktx_read.dir/lib/glloader.c.o.d" + "CMakeFiles/ktx_read.dir/lib/hashlist.c.o" + "CMakeFiles/ktx_read.dir/lib/hashlist.c.o.d" + "CMakeFiles/ktx_read.dir/lib/info.c.o" + "CMakeFiles/ktx_read.dir/lib/info.c.o.d" + "CMakeFiles/ktx_read.dir/lib/memstream.c.o" + "CMakeFiles/ktx_read.dir/lib/memstream.c.o.d" + "CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o" + "CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o.d" + "CMakeFiles/ktx_read.dir/lib/strings.c.o" + "CMakeFiles/ktx_read.dir/lib/strings.c.o.d" + "CMakeFiles/ktx_read.dir/lib/swap.c.o" + "CMakeFiles/ktx_read.dir/lib/swap.c.o.d" + "CMakeFiles/ktx_read.dir/lib/texture.c.o" + "CMakeFiles/ktx_read.dir/lib/texture.c.o.d" + "CMakeFiles/ktx_read.dir/lib/texture1.c.o" + "CMakeFiles/ktx_read.dir/lib/texture1.c.o.d" + "CMakeFiles/ktx_read.dir/lib/texture2.c.o" + "CMakeFiles/ktx_read.dir/lib/texture2.c.o.d" + "CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o" + "CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o.d" + "CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o" + "CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o.d" + "CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o" + "CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o.d" + "CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o" + "CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o.d" + "CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o" + "CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o.d" + "CMakeFiles/ktx_read.dir/lib/vkloader.c.o" + "CMakeFiles/ktx_read.dir/lib/vkloader.c.o.d" + "Release/libktx_read.pdb" + "Release/libktx_read.so" + "Release/libktx_read.so.0" + "Release/libktx_read.so.0.0.0" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C CXX) + include(CMakeFiles/ktx_read.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ktx_read.dir/compiler_depend.internal b/ktx/build/CMakeFiles/ktx_read.dir/compiler_depend.internal new file mode 100644 index 0000000..5cc9a82 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/compiler_depend.internal @@ -0,0 +1,3125 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers_impl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_55.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_56.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cet.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/assert.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/alloca.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx + /usr/include/alloca.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + +CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/inttypes.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/inttypes.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx_read.dir/lib/checkheader.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/filestream.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /usr/include/alloca.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm/errno.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/inttypes.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/stat.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /usr/include/alloca.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/dlfcn.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/dlfcn.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/glformat_str.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glext.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GLES2/gl2ext.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/ctype.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/lib/glloader.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk2gl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glFormat.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glInternalFormat.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glType.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/hashlist.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/uthash.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/inttypes.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/info.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/inttypes.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/memstream.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_miniz.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/strings.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/swap.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/texture.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/texture1.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/texture2.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/zstd_errors.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h + /usr/include/alloca.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/dlfcn.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/dlfcn.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/ctype.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/lib/vkloader.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktxvulkan.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthread_stack_min.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/once_flag.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/limits.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +Release/libktx_read.so + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libdl.a + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/checkheader.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/filestream.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/glformat_str.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/glloader.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/hashlist.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/info.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/memstream.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/strings.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/swap.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/texture.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/texture1.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/texture2.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_read.dir/lib/vkloader.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/libastcenc-avx2-static.a + diff --git a/ktx/build/CMakeFiles/ktx_read.dir/compiler_depend.make b/ktx/build/CMakeFiles/ktx_read.dir/compiler_depend.make new file mode 100644 index 0000000..221c6eb --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/compiler_depend.make @@ -0,0 +1,3974 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_55.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_56.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cet.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/assert.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/alloca.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx \ + /usr/include/alloca.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + +CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/inttypes.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/inttypes.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + +CMakeFiles/ktx_read.dir/lib/checkheader.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/filestream.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm/errno.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/inttypes.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/stat.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/include/alloca.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/dlfcn.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/dlfcn.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/glformat_str.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glext.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GLES2/gl2ext.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/ctype.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/lib/glloader.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk2gl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glFormat.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glInternalFormat.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glType.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/hashlist.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/uthash.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/inttypes.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/info.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/inttypes.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/memstream.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_miniz.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/strings.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/swap.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/texture.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/texture1.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/texture2.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/zstd_errors.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h \ + /usr/include/alloca.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/dlfcn.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/dlfcn.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/ctype.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +CMakeFiles/ktx_read.dir/lib/vkloader.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktxvulkan.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/once_flag.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/limits.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +Release/libktx_read.so: /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libdl.a \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o \ + CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o \ + CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o \ + CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o \ + CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o \ + CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o \ + CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o \ + CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o \ + CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o \ + CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o \ + CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o \ + CMakeFiles/ktx_read.dir/lib/checkheader.c.o \ + CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o \ + CMakeFiles/ktx_read.dir/lib/filestream.c.o \ + CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o \ + CMakeFiles/ktx_read.dir/lib/glformat_str.c.o \ + CMakeFiles/ktx_read.dir/lib/glloader.c.o \ + CMakeFiles/ktx_read.dir/lib/hashlist.c.o \ + CMakeFiles/ktx_read.dir/lib/info.c.o \ + CMakeFiles/ktx_read.dir/lib/memstream.c.o \ + CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o \ + CMakeFiles/ktx_read.dir/lib/strings.c.o \ + CMakeFiles/ktx_read.dir/lib/swap.c.o \ + CMakeFiles/ktx_read.dir/lib/texture.c.o \ + CMakeFiles/ktx_read.dir/lib/texture1.c.o \ + CMakeFiles/ktx_read.dir/lib/texture2.c.o \ + CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o \ + CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o \ + CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o \ + CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o \ + CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o \ + CMakeFiles/ktx_read.dir/lib/vkloader.c.o \ + external/astc-encoder/Source/libastcenc-avx2-static.a + + +external/astc-encoder/Source/libastcenc-avx2-static.a: + +CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o: + +CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o: + +CMakeFiles/ktx_read.dir/lib/texture2.c.o: + +CMakeFiles/ktx_read.dir/lib/swap.c.o: + +CMakeFiles/ktx_read.dir/lib/memstream.c.o: + +CMakeFiles/ktx_read.dir/lib/glformat_str.c.o: + +CMakeFiles/ktx_read.dir/lib/checkheader.c.o: + +CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o: + +CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o: + +CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o: + +CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o: + +CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o: + +CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o: + +CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o: + +CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: + +CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o: + +/usr/lib/libmvec.so.1: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/libgcc_s.so.1: + +/usr/lib/crtn.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktxvulkan.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c: + +CMakeFiles/ktx_read.dir/lib/vkloader.c.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glFormat.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk2gl.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c: + +/usr/include/dlfcn.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h: + +/usr/include/sys/stat.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c: + +/usr/include/bits/stat.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h: + +/usr/include/inttypes.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/istream: + +/usr/include/c++/16.1.1/ios: + +/usr/include/c++/16.1.1/cwctype: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glType.inl: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/bits/wctype-wchar.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cet.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/uthash.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glInternalFormat.inl: + +/usr/include/time.h: + +/usr/include/sys/types.h: + +/usr/include/c++/16.1.1/cstring: + +/usr/include/bits/types/once_flag.h: + +/usr/include/sys/select.h: + +/usr/include/sys/cdefs.h: + +/usr/include/string.h: + +CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o: + +/usr/include/stdlib.h: + +/usr/include/pthread.h: + +/usr/include/memory.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.inl: + +/usr/include/malloc.h: + +/usr/lib/libstdc++.so: + +/usr/include/locale.h: + +/usr/include/linux/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/sched/types.h: + +/usr/include/linux/limits.h: + +/usr/include/limits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h: + +/usr/include/gnu/stubs.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +CMakeFiles/ktx_read.dir/lib/texture.c.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_miniz.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/lib/libm.so.6: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_56.inc: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +CMakeFiles/ktx_read.dir/lib/glloader.c.o: + +/usr/lib/crti.o: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/bits/timesize.h: + +CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o: + +/usr/include/bits/types/wint_t.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h: + +/usr/include/c++/16.1.1/unordered_map: + +/usr/include/bits/waitflags.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/types/clock_t.h: + +CMakeFiles/ktx_read.dir/lib/strings.c.o: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/FILE.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glext.h: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/bits/types.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/bits/stdio_lim.h: + +CMakeFiles/ktx_read.dir/lib/info.c.o: + +/usr/include/bits/stdint-least.h: + +CMakeFiles/ktx_read.dir/lib/texture1.c.o: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/bits/setjmp.h: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/asm/bitsperlong.h: + +/usr/lib/libgcc_s.so: + +/usr/include/c++/16.1.1/algorithm: + +/usr/include/asm-generic/int-ll64.h: + +/usr/include/bits/mathcalls-macros.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c: + +/usr/include/asm-generic/errno.h: + +CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +/usr/include/bits/fp-logb.h: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/c++/16.1.1/initializer_list: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc: + +/usr/include/bits/dlfcn.h: + +/usr/include/bits/cpu-set.h: + +/usr/include/bits/types/__locale_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/bit: + +/usr/include/bits/types/error_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/zstd_errors.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/c++/16.1.1/bits/hashtable.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/endianness.h: + +/usr/include/asm/posix_types_64.h: + +CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/bits/wchar.h: + +/usr/include/asm-generic/types.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/struct_tm.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/asm/types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_55.inc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/bits/posix2_lim.h: + +/usr/include/bits/mathcalls.h: + +/usr/include/c++/16.1.1/cwchar: + +CMakeFiles/ktx_read.dir/lib/filestream.c.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/strings.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc: + +/usr/include/bits/types/timer_t.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/mathcalls-narrow.h: + +CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o: + +/usr/include/assert.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/atomic_wide_counter.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers_impl.h: + +/usr/include/bits/local_lim.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/include/bits/byteswap.h: + +/usr/include/bits/typesizes.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/bits/floatn.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o: + +/usr/include/bits/long-double.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/bits/iscanonical.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/bits/libc-header-start.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/bits/math-vector.h: + +/usr/lib/libm.so: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/bits/types/time_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h: + +/usr/include/c++/16.1.1/pstl/glue_numeric_defs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc.inc: + +/usr/include/wctype.h: + +/usr/include/sched.h: + +/usr/include/bits/fp-fast.h: + +/usr/include/wchar.h: + +/usr/include/bits/posix1_lim.h: + +/usr/lib/libc.so: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/c++/16.1.1/bits/stream_iterator.h: + +/usr/include/alloca.h: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/usr/include/c++/16.1.1/vector: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/asm/errno.h: + +/usr/include/bits/stdint-uintn.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl: + +/usr/include/bits/types/__FILE.h: + +/usr/include/features.h: + +/usr/include/bits/sched.h: + +/usr/include/c++/16.1.1/array: + +/usr/include/bits/select.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h: + +/usr/include/c++/16.1.1/bits/hashtable_policy.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/random: + +/usr/include/c++/16.1.1/exception: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/lib/libatomic.so: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h: + +/usr/include/bits/struct_stat.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/bits/random.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/c++/16.1.1/bits/random.tcc: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GLES2/gl2ext.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/math.h: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/lib/libdl.a: + +/usr/include/bits/uintn-identity.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/bits/pthread_stack_min.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/c++/16.1.1/bits/unordered_map.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/stdio.h: + +/usr/include/bits/wordsize.h: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/c++/16.1.1/compare: + +/usr/lib/libc.so.6: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/bits/specfun.h: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/bits/stl_numeric.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +CMakeFiles/ktx_read.dir/lib/hashlist.c.o: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/usr/include/c++/16.1.1/functional: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/iterator: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/math.h: + +CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o: + +CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o: + +/usr/include/c++/16.1.1/numeric: + +/usr/include/c++/16.1.1/stdlib.h: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/usr/include/errno.h: + +/usr/include/features-time64.h: diff --git a/ktx/build/CMakeFiles/ktx_read.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ktx_read.dir/compiler_depend.ts new file mode 100644 index 0000000..ecbbbd2 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for ktx_read. diff --git a/ktx/build/CMakeFiles/ktx_read.dir/depend.make b/ktx/build/CMakeFiles/ktx_read.dir/depend.make new file mode 100644 index 0000000..c27ef94 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for ktx_read. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o b/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o new file mode 100644 index 0000000..b953cb8 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o.d b/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o.d new file mode 100644 index 0000000..8b5a261 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o.d @@ -0,0 +1,223 @@ +CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_55.inc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_56.inc diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o b/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o new file mode 100644 index 0000000..6005e0a Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o.d new file mode 100644 index 0000000..bd38dbc --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o.d @@ -0,0 +1,58 @@ +CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/sys/types.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cet.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h /usr/include/assert.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o new file mode 100644 index 0000000..d06fc39 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o.d new file mode 100644 index 0000000..13621f1 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o.d @@ -0,0 +1,17 @@ +CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/colourspaces.c \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o new file mode 100644 index 0000000..b4f89cf Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o.d new file mode 100644 index 0000000..3ecee72 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o.d @@ -0,0 +1,37 @@ +CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/createdfd.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o new file mode 100644 index 0000000..c158a11 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o.d new file mode 100644 index 0000000..6273fcb --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o.d @@ -0,0 +1,25 @@ +CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/interpretdfd.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o new file mode 100644 index 0000000..96561d7 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o.d new file mode 100644 index 0000000..df4ef96 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o.d @@ -0,0 +1,28 @@ +CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/printdfd.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/stdio.h /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o new file mode 100644 index 0000000..2ac695e Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o.d new file mode 100644 index 0000000..7f45b24 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o.d @@ -0,0 +1,44 @@ +CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/queries.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o new file mode 100644 index 0000000..af5cd22 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o.d new file mode 100644 index 0000000..f6155b2 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o.d @@ -0,0 +1,18 @@ +CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.c \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vk2dfd.inl diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o b/ktx/build/CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o new file mode 100644 index 0000000..434ae29 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o.d b/ktx/build/CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o.d new file mode 100644 index 0000000..dada908 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o.d @@ -0,0 +1,41 @@ +CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/etcdec/etcdec.cxx \ + /usr/include/stdc-predef.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/flags.make b/ktx/build/CMakeFiles/ktx_read.dir/flags.make new file mode 100644 index 0000000..57e73a1 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/flags.make @@ -0,0 +1,19 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile C with /usr/bin/cc +# compile CXX with /usr/bin/c++ +C_DEFINES = -DBASISD_SUPPORT_FXT1=0 -DBASISD_SUPPORT_KTX2=0 -DBASISD_SUPPORT_KTX2_ZSTD=0 -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DLIBKTX -DSUPPORT_SOFTWARE_ETC_UNPACK=1 -Dktx_read_EXPORTS + +C_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include + +C_FLAGS = -O3 -DNDEBUG -fPIC -Wall -Wextra -O3 -ffp-contract=off -Wno-cast-function-type -Wno-pedantic + +CXX_DEFINES = -DBASISD_SUPPORT_FXT1=0 -DBASISD_SUPPORT_KTX2=0 -DBASISD_SUPPORT_KTX2_ZSTD=0 -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DLIBKTX -DSUPPORT_SOFTWARE_ETC_UNPACK=1 -Dktx_read_EXPORTS + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -fPIC -Wall -Wextra -O3 -ffp-contract=off -Wno-cast-function-type -Wno-pedantic + +# Custom options: CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o_OPTIONS = -fno-strict-aliasing;-Wno-sign-compare;-Wno-unused-function;-Wno-unused-variable;-Wno-class-memaccess;-Wno-maybe-uninitialized;-Wno-stringop-overflow + diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o new file mode 100644 index 0000000..e542e74 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o.d new file mode 100644 index 0000000..77ef742 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o.d @@ -0,0 +1,210 @@ +CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/string.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/inttypes.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/wchar.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/move.h /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/limits /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /usr/include/c++/16.1.1/cstdint diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o new file mode 100644 index 0000000..a3a3588 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o.d new file mode 100644 index 0000000..68813f3 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o.d @@ -0,0 +1,229 @@ +CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp \ + /usr/include/stdc-predef.h /usr/include/inttypes.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/string.h /usr/include/strings.h /usr/include/memory.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/checkheader.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/checkheader.c.o new file mode 100644 index 0000000..33ba9d3 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/checkheader.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/checkheader.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/checkheader.c.o.d new file mode 100644 index 0000000..9c12e53 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/checkheader.c.o.d @@ -0,0 +1,56 @@ +CMakeFiles/ktx_read.dir/lib/checkheader.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/checkheader.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/string.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o new file mode 100644 index 0000000..ec20d82 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o.d new file mode 100644 index 0000000..69a9189 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o.d @@ -0,0 +1,99 @@ +CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/etcunpack.cxx \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/filestream.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/filestream.c.o new file mode 100644 index 0000000..bdab404 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/filestream.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/filestream.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/filestream.c.o.d new file mode 100644 index 0000000..f8b7ffa --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/filestream.c.o.d @@ -0,0 +1,62 @@ +CMakeFiles/ktx_read.dir/lib/filestream.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/inttypes.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/string.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/sys/stat.h \ + /usr/include/bits/stat.h /usr/include/bits/struct_stat.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o new file mode 100644 index 0000000..0f6b96c Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o.d new file mode 100644 index 0000000..d7c4fc5 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o.d @@ -0,0 +1,52 @@ +CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c \ + /usr/include/stdc-predef.h /usr/include/dlfcn.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/dlfcn.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/sys/types.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/glformat_str.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/glformat_str.c.o new file mode 100644 index 0000000..43fa883 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/glformat_str.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/glformat_str.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/glformat_str.c.o.d new file mode 100644 index 0000000..bd654be --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/glformat_str.c.o.d @@ -0,0 +1,28 @@ +CMakeFiles/ktx_read.dir/lib/glformat_str.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glformat_str.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/ctype.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glext.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GLES2/gl2ext.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/glloader.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/glloader.c.o new file mode 100644 index 0000000..3279589 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/glloader.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/glloader.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/glloader.c.o.d new file mode 100644 index 0000000..91cf104 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/glloader.c.o.d @@ -0,0 +1,70 @@ +CMakeFiles/ktx_read.dir/lib/glloader.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/string.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/wchar.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funclist.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk2gl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glInternalFormat.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glFormat.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkFormat2glType.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/hashlist.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/hashlist.c.o new file mode 100644 index 0000000..40b27c0 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/hashlist.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/hashlist.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/hashlist.c.o.d new file mode 100644 index 0000000..bf395d9 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/hashlist.c.o.d @@ -0,0 +1,59 @@ +CMakeFiles/ktx_read.dir/lib/hashlist.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c \ + /usr/include/stdc-predef.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/uthash.h \ + /usr/include/inttypes.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/info.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/info.c.o new file mode 100644 index 0000000..48b321e Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/info.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/info.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/info.c.o.d new file mode 100644 index 0000000..ae7b7ca --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/info.c.o.d @@ -0,0 +1,63 @@ +CMakeFiles/ktx_read.dir/lib/info.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/info.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/inttypes.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/memstream.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/memstream.c.o new file mode 100644 index 0000000..48e0c8d Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/memstream.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/memstream.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/memstream.c.o.d new file mode 100644 index 0000000..5a2a3ee --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/memstream.c.o.d @@ -0,0 +1,58 @@ +CMakeFiles/ktx_read.dir/lib/memstream.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/string.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o new file mode 100644 index 0000000..991936f Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o.d new file mode 100644 index 0000000..7954a39 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o.d @@ -0,0 +1,104 @@ +CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_miniz.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/string.h \ + /usr/include/strings.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/strings.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/strings.c.o new file mode 100644 index 0000000..ef87242 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/strings.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/strings.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/strings.c.o.d new file mode 100644 index 0000000..041064e --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/strings.c.o.d @@ -0,0 +1,46 @@ +CMakeFiles/ktx_read.dir/lib/strings.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/swap.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/swap.c.o new file mode 100644 index 0000000..b1d5044 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/swap.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/swap.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/swap.c.o.d new file mode 100644 index 0000000..74e3220 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/swap.c.o.d @@ -0,0 +1,45 @@ +CMakeFiles/ktx_read.dir/lib/swap.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/swap.c \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/texture.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/texture.c.o new file mode 100644 index 0000000..85f073e Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/texture.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/texture.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/texture.c.o.d new file mode 100644 index 0000000..410f079 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/texture.c.o.d @@ -0,0 +1,64 @@ +CMakeFiles/ktx_read.dir/lib/texture.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/math.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-logb.h /usr/include/bits/fp-fast.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/texture1.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/texture1.c.o new file mode 100644 index 0000000..e060b7a Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/texture1.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/texture1.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/texture1.c.o.d new file mode 100644 index 0000000..9bfb1ce --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/texture1.c.o.d @@ -0,0 +1,69 @@ +CMakeFiles/ktx_read.dir/lib/texture1.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c \ + /usr/include/stdc-predef.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/texture2.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/texture2.c.o new file mode 100644 index 0000000..60ab4d6 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/texture2.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/texture2.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/texture2.c.o.d new file mode 100644 index 0000000..e05c2af --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/texture2.c.o.d @@ -0,0 +1,67 @@ +CMakeFiles/ktx_read.dir/lib/texture2.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/zstd_errors.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o new file mode 100644 index 0000000..4c3459c Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o.d new file mode 100644 index 0000000..4bc5b3b --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o.d @@ -0,0 +1,52 @@ +CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.c \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/dlfcn.h /usr/include/bits/dlfcn.h /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/types/once_flag.h /usr/include/bits/stdlib-float.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o new file mode 100644 index 0000000..c015096 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o.d new file mode 100644 index 0000000..1f4a12f --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o.d @@ -0,0 +1,15 @@ +CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o new file mode 100644 index 0000000..7d90cbd Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o.d new file mode 100644 index 0000000..9845953 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o.d @@ -0,0 +1,15 @@ +CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_check_variant.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o new file mode 100644 index 0000000..682ee6e Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o.d new file mode 100644 index 0000000..f09895d --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o.d @@ -0,0 +1,16 @@ +CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_str.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/ctype.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o new file mode 100644 index 0000000..c713fb1 Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o.d new file mode 100644 index 0000000..61a116e --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o.d @@ -0,0 +1,14 @@ +CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_typesize.c \ + /usr/include/stdc-predef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/vkloader.c.o b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkloader.c.o new file mode 100644 index 0000000..288098d Binary files /dev/null and b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkloader.c.o differ diff --git a/ktx/build/CMakeFiles/ktx_read.dir/lib/vkloader.c.o.d b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkloader.c.o.d new file mode 100644 index 0000000..a630cfc --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/lib/vkloader.c.o.d @@ -0,0 +1,70 @@ +CMakeFiles/ktx_read.dir/lib/vkloader.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/math.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-logb.h /usr/include/bits/fp-fast.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/types/once_flag.h \ + /usr/include/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_funcs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthread_stack_min.h /usr/include/bits/posix2_lim.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktxvulkan.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h diff --git a/ktx/build/CMakeFiles/ktx_read.dir/link.d b/ktx/build/CMakeFiles/ktx_read.dir/link.d new file mode 100644 index 0000000..6016e4b --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/link.d @@ -0,0 +1,193 @@ +Release/libktx_read.so.0.0.0: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o \ + CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o \ + CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o \ + CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o \ + CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o \ + CMakeFiles/ktx_read.dir/lib/checkheader.c.o \ + CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o \ + CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o \ + CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o \ + CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o \ + CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o \ + CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o \ + CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o \ + CMakeFiles/ktx_read.dir/lib/filestream.c.o \ + CMakeFiles/ktx_read.dir/lib/glformat_str.c.o \ + CMakeFiles/ktx_read.dir/lib/hashlist.c.o \ + CMakeFiles/ktx_read.dir/lib/info.c.o \ + CMakeFiles/ktx_read.dir/lib/memstream.c.o \ + CMakeFiles/ktx_read.dir/lib/strings.c.o \ + CMakeFiles/ktx_read.dir/lib/swap.c.o \ + CMakeFiles/ktx_read.dir/lib/texture.c.o \ + CMakeFiles/ktx_read.dir/lib/texture2.c.o \ + CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o \ + CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o \ + CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o \ + CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o \ + CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o \ + CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o \ + CMakeFiles/ktx_read.dir/lib/glloader.c.o \ + CMakeFiles/ktx_read.dir/lib/texture1.c.o \ + CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o \ + CMakeFiles/ktx_read.dir/lib/vkloader.c.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libdl.a \ + external/astc-encoder/Source/libastcenc-avx2-static.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o: + +CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o: + +CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o: + +CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o: + +CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o: + +CMakeFiles/ktx_read.dir/lib/checkheader.c.o: + +CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o: + +CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o: + +CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o: + +CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o: + +CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o: + +CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o: + +CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o: + +CMakeFiles/ktx_read.dir/lib/filestream.c.o: + +CMakeFiles/ktx_read.dir/lib/glformat_str.c.o: + +CMakeFiles/ktx_read.dir/lib/hashlist.c.o: + +CMakeFiles/ktx_read.dir/lib/info.c.o: + +CMakeFiles/ktx_read.dir/lib/memstream.c.o: + +CMakeFiles/ktx_read.dir/lib/strings.c.o: + +CMakeFiles/ktx_read.dir/lib/swap.c.o: + +CMakeFiles/ktx_read.dir/lib/texture.c.o: + +CMakeFiles/ktx_read.dir/lib/texture2.c.o: + +CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o: + +CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o: + +CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o: + +CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o: + +CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o: + +CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o: + +CMakeFiles/ktx_read.dir/lib/glloader.c.o: + +CMakeFiles/ktx_read.dir/lib/texture1.c.o: + +CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o: + +CMakeFiles/ktx_read.dir/lib/vkloader.c.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libdl.a: + +external/astc-encoder/Source/libastcenc-avx2-static.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: diff --git a/ktx/build/CMakeFiles/ktx_read.dir/link.txt b/ktx/build/CMakeFiles/ktx_read.dir/link.txt new file mode 100644 index 0000000..98c5be1 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -fPIC -msse4.1 -O3 -DNDEBUG -shared -O3 -Wl,--dependency-file=CMakeFiles/ktx_read.dir/link.d -Wl,-soname,libktx_read.so.0 -o Release/libktx_read.so.0.0.0 CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o CMakeFiles/ktx_read.dir/lib/checkheader.c.o CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o CMakeFiles/ktx_read.dir/lib/filestream.c.o CMakeFiles/ktx_read.dir/lib/glformat_str.c.o CMakeFiles/ktx_read.dir/lib/hashlist.c.o CMakeFiles/ktx_read.dir/lib/info.c.o CMakeFiles/ktx_read.dir/lib/memstream.c.o CMakeFiles/ktx_read.dir/lib/strings.c.o CMakeFiles/ktx_read.dir/lib/swap.c.o CMakeFiles/ktx_read.dir/lib/texture.c.o CMakeFiles/ktx_read.dir/lib/texture2.c.o CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o CMakeFiles/ktx_read.dir/lib/glloader.c.o CMakeFiles/ktx_read.dir/lib/texture1.c.o CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o CMakeFiles/ktx_read.dir/lib/vkloader.c.o -ldl external/astc-encoder/Source/libastcenc-avx2-static.a diff --git a/ktx/build/CMakeFiles/ktx_read.dir/progress.make b/ktx/build/CMakeFiles/ktx_read.dir/progress.make new file mode 100644 index 0000000..b15cc11 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_read.dir/progress.make @@ -0,0 +1,34 @@ +CMAKE_PROGRESS_1 = 57 +CMAKE_PROGRESS_2 = +CMAKE_PROGRESS_3 = 58 +CMAKE_PROGRESS_4 = +CMAKE_PROGRESS_5 = 59 +CMAKE_PROGRESS_6 = +CMAKE_PROGRESS_7 = 60 +CMAKE_PROGRESS_8 = +CMAKE_PROGRESS_9 = 61 +CMAKE_PROGRESS_10 = 62 +CMAKE_PROGRESS_11 = +CMAKE_PROGRESS_12 = 63 +CMAKE_PROGRESS_13 = +CMAKE_PROGRESS_14 = 64 +CMAKE_PROGRESS_15 = +CMAKE_PROGRESS_16 = 65 +CMAKE_PROGRESS_17 = +CMAKE_PROGRESS_18 = 66 +CMAKE_PROGRESS_19 = 67 +CMAKE_PROGRESS_20 = +CMAKE_PROGRESS_21 = 68 +CMAKE_PROGRESS_22 = +CMAKE_PROGRESS_23 = 69 +CMAKE_PROGRESS_24 = +CMAKE_PROGRESS_25 = 70 +CMAKE_PROGRESS_26 = +CMAKE_PROGRESS_27 = 71 +CMAKE_PROGRESS_28 = +CMAKE_PROGRESS_29 = 72 +CMAKE_PROGRESS_30 = 73 +CMAKE_PROGRESS_31 = +CMAKE_PROGRESS_32 = 74 +CMAKE_PROGRESS_33 = + diff --git a/ktx/build/CMakeFiles/ktx_version.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ktx_version.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_version.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ktx_version.dir/build.make b/ktx/build/CMakeFiles/ktx_version.dir/build.make new file mode 100644 index 0000000..8d9dcd7 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_version.dir/build.make @@ -0,0 +1,94 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ktx_version. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ktx_version.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ktx_version.dir/progress.make + +CMakeFiles/ktx_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && scripts/mkversion -v exitcode-128-NOTFOUND -o version.h lib + +CMakeFiles/ktx_version.dir/codegen: +.PHONY : CMakeFiles/ktx_version.dir/codegen + +ktx_version: CMakeFiles/ktx_version +ktx_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h +ktx_version: CMakeFiles/ktx_version.dir/build.make +.PHONY : ktx_version + +# Rule to build all files generated by this target. +CMakeFiles/ktx_version.dir/build: ktx_version +.PHONY : CMakeFiles/ktx_version.dir/build + +CMakeFiles/ktx_version.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ktx_version.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ktx_version.dir/clean + +CMakeFiles/ktx_version.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktx_version.dir/DependInfo.cmake "--color=$(COLOR)" ktx_version +.PHONY : CMakeFiles/ktx_version.dir/depend + diff --git a/ktx/build/CMakeFiles/ktx_version.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ktx_version.dir/cmake_clean.cmake new file mode 100644 index 0000000..272a43c --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_version.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/version.h" + "CMakeFiles/ktx_version" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ktx_version.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ktx_version.dir/compiler_depend.make b/ktx/build/CMakeFiles/ktx_version.dir/compiler_depend.make new file mode 100644 index 0000000..5c00f60 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_version.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ktx_version. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ktx_version.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ktx_version.dir/compiler_depend.ts new file mode 100644 index 0000000..b7acd6b --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_version.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ktx_version. diff --git a/ktx/build/CMakeFiles/ktx_version.dir/progress.make b/ktx/build/CMakeFiles/ktx_version.dir/progress.make new file mode 100644 index 0000000..5acded2 --- /dev/null +++ b/ktx/build/CMakeFiles/ktx_version.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 75 + diff --git a/ktx/build/CMakeFiles/ktxpkg.doc.dir/DependInfo.cmake b/ktx/build/CMakeFiles/ktxpkg.doc.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/ktxpkg.doc.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/ktxpkg.doc.dir/build.make b/ktx/build/CMakeFiles/ktxpkg.doc.dir/build.make new file mode 100644 index 0000000..5e64c9b --- /dev/null +++ b/ktx/build/CMakeFiles/ktxpkg.doc.dir/build.make @@ -0,0 +1,94 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ktxpkg.doc. + +# Include any custom commands dependencies for this target. +include CMakeFiles/ktxpkg.doc.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/ktxpkg.doc.dir/progress.make + +CMakeFiles/ktxpkg.doc: Doxyfile.ktxpkg.doc +CMakeFiles/ktxpkg.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/pkgdoc/pages.md +CMakeFiles/ktxpkg.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/LICENSE.md + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generating API documentation for ktxpkg.doc" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && /usr/bin/cmake -E make_directory /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/html + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && /usr/bin/doxygen /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Doxyfile.ktxpkg.doc + +CMakeFiles/ktxpkg.doc.dir/codegen: +.PHONY : CMakeFiles/ktxpkg.doc.dir/codegen + +ktxpkg.doc: CMakeFiles/ktxpkg.doc +ktxpkg.doc: CMakeFiles/ktxpkg.doc.dir/build.make +.PHONY : ktxpkg.doc + +# Rule to build all files generated by this target. +CMakeFiles/ktxpkg.doc.dir/build: ktxpkg.doc +.PHONY : CMakeFiles/ktxpkg.doc.dir/build + +CMakeFiles/ktxpkg.doc.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/ktxpkg.doc.dir/cmake_clean.cmake +.PHONY : CMakeFiles/ktxpkg.doc.dir/clean + +CMakeFiles/ktxpkg.doc.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/ktxpkg.doc.dir/DependInfo.cmake "--color=$(COLOR)" ktxpkg.doc +.PHONY : CMakeFiles/ktxpkg.doc.dir/depend + diff --git a/ktx/build/CMakeFiles/ktxpkg.doc.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/ktxpkg.doc.dir/cmake_clean.cmake new file mode 100644 index 0000000..1fb1f7f --- /dev/null +++ b/ktx/build/CMakeFiles/ktxpkg.doc.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/ktxpkg.doc" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ktxpkg.doc.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/ktxpkg.doc.dir/compiler_depend.make b/ktx/build/CMakeFiles/ktxpkg.doc.dir/compiler_depend.make new file mode 100644 index 0000000..c0de634 --- /dev/null +++ b/ktx/build/CMakeFiles/ktxpkg.doc.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ktxpkg.doc. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/ktxpkg.doc.dir/compiler_depend.ts b/ktx/build/CMakeFiles/ktxpkg.doc.dir/compiler_depend.ts new file mode 100644 index 0000000..2fd77c3 --- /dev/null +++ b/ktx/build/CMakeFiles/ktxpkg.doc.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ktxpkg.doc. diff --git a/ktx/build/CMakeFiles/ktxpkg.doc.dir/progress.make b/ktx/build/CMakeFiles/ktxpkg.doc.dir/progress.make new file mode 100644 index 0000000..225de34 --- /dev/null +++ b/ktx/build/CMakeFiles/ktxpkg.doc.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = + diff --git a/ktx/build/CMakeFiles/libktx.doc.dir/DependInfo.cmake b/ktx/build/CMakeFiles/libktx.doc.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/libktx.doc.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/libktx.doc.dir/build.make b/ktx/build/CMakeFiles/libktx.doc.dir/build.make new file mode 100644 index 0000000..10dbaa0 --- /dev/null +++ b/ktx/build/CMakeFiles/libktx.doc.dir/build.make @@ -0,0 +1,109 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for libktx.doc. + +# Include any custom commands dependencies for this target. +include CMakeFiles/libktx.doc.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/libktx.doc.dir/progress.make + +CMakeFiles/libktx.doc: Doxyfile.libktx.doc +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/libktx_mainpage.md +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/astc_codec.cpp +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_encode.cpp +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_transcode.cpp +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/miniz_wrapper.cpp +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/strings.c +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_funcs.c +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/glloader.c +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/hashlist.c +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.c +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.c +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.c +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.c +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.c +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkloader.c +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer1.c +CMakeFiles/libktx.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/writer2.c + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generating API documentation for libktx.doc" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && /usr/bin/cmake -E make_directory /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/html + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && /usr/bin/doxygen /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Doxyfile.libktx.doc + +CMakeFiles/libktx.doc.dir/codegen: +.PHONY : CMakeFiles/libktx.doc.dir/codegen + +libktx.doc: CMakeFiles/libktx.doc +libktx.doc: CMakeFiles/libktx.doc.dir/build.make +.PHONY : libktx.doc + +# Rule to build all files generated by this target. +CMakeFiles/libktx.doc.dir/build: libktx.doc +.PHONY : CMakeFiles/libktx.doc.dir/build + +CMakeFiles/libktx.doc.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/libktx.doc.dir/cmake_clean.cmake +.PHONY : CMakeFiles/libktx.doc.dir/clean + +CMakeFiles/libktx.doc.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/libktx.doc.dir/DependInfo.cmake "--color=$(COLOR)" libktx.doc +.PHONY : CMakeFiles/libktx.doc.dir/depend + diff --git a/ktx/build/CMakeFiles/libktx.doc.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/libktx.doc.dir/cmake_clean.cmake new file mode 100644 index 0000000..a69ab93 --- /dev/null +++ b/ktx/build/CMakeFiles/libktx.doc.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/libktx.doc" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/libktx.doc.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/libktx.doc.dir/compiler_depend.make b/ktx/build/CMakeFiles/libktx.doc.dir/compiler_depend.make new file mode 100644 index 0000000..cd7e4d8 --- /dev/null +++ b/ktx/build/CMakeFiles/libktx.doc.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for libktx.doc. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/libktx.doc.dir/compiler_depend.ts b/ktx/build/CMakeFiles/libktx.doc.dir/compiler_depend.ts new file mode 100644 index 0000000..42ba5a8 --- /dev/null +++ b/ktx/build/CMakeFiles/libktx.doc.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for libktx.doc. diff --git a/ktx/build/CMakeFiles/libktx.doc.dir/progress.make b/ktx/build/CMakeFiles/libktx.doc.dir/progress.make new file mode 100644 index 0000000..690660a --- /dev/null +++ b/ktx/build/CMakeFiles/libktx.doc.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 89 + diff --git a/ktx/build/CMakeFiles/objUtil.dir/DependInfo.cmake b/ktx/build/CMakeFiles/objUtil.dir/DependInfo.cmake new file mode 100644 index 0000000..a5ffc41 --- /dev/null +++ b/ktx/build/CMakeFiles/objUtil.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.cpp" "CMakeFiles/objUtil.dir/utils/argparser.cpp.o" "gcc" "CMakeFiles/objUtil.dir/utils/argparser.cpp.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/objUtil.dir/build.make b/ktx/build/CMakeFiles/objUtil.dir/build.make new file mode 100644 index 0000000..a78e0fd --- /dev/null +++ b/ktx/build/CMakeFiles/objUtil.dir/build.make @@ -0,0 +1,114 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include CMakeFiles/objUtil.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include CMakeFiles/objUtil.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/objUtil.dir/progress.make + +# Include the compile flags for this target's objects. +include CMakeFiles/objUtil.dir/flags.make + +CMakeFiles/objUtil.dir/codegen: +.PHONY : CMakeFiles/objUtil.dir/codegen + +CMakeFiles/objUtil.dir/utils/argparser.cpp.o: CMakeFiles/objUtil.dir/flags.make +CMakeFiles/objUtil.dir/utils/argparser.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.cpp +CMakeFiles/objUtil.dir/utils/argparser.cpp.o: CMakeFiles/objUtil.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/objUtil.dir/utils/argparser.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/objUtil.dir/utils/argparser.cpp.o -MF CMakeFiles/objUtil.dir/utils/argparser.cpp.o.d -o CMakeFiles/objUtil.dir/utils/argparser.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.cpp + +CMakeFiles/objUtil.dir/utils/argparser.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/objUtil.dir/utils/argparser.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.cpp > CMakeFiles/objUtil.dir/utils/argparser.cpp.i + +CMakeFiles/objUtil.dir/utils/argparser.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/objUtil.dir/utils/argparser.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.cpp -o CMakeFiles/objUtil.dir/utils/argparser.cpp.s + +# Object files for target objUtil +objUtil_OBJECTS = \ +"CMakeFiles/objUtil.dir/utils/argparser.cpp.o" + +# External object files for target objUtil +objUtil_EXTERNAL_OBJECTS = + +libobjUtil.a: CMakeFiles/objUtil.dir/utils/argparser.cpp.o +libobjUtil.a: CMakeFiles/objUtil.dir/build.make +libobjUtil.a: CMakeFiles/objUtil.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX static library libobjUtil.a" + $(CMAKE_COMMAND) -P CMakeFiles/objUtil.dir/cmake_clean_target.cmake + $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/objUtil.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +CMakeFiles/objUtil.dir/build: libobjUtil.a +.PHONY : CMakeFiles/objUtil.dir/build + +CMakeFiles/objUtil.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/objUtil.dir/cmake_clean.cmake +.PHONY : CMakeFiles/objUtil.dir/clean + +CMakeFiles/objUtil.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/objUtil.dir/DependInfo.cmake "--color=$(COLOR)" objUtil +.PHONY : CMakeFiles/objUtil.dir/depend + diff --git a/ktx/build/CMakeFiles/objUtil.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/objUtil.dir/cmake_clean.cmake new file mode 100644 index 0000000..4a0f894 --- /dev/null +++ b/ktx/build/CMakeFiles/objUtil.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/objUtil.dir/utils/argparser.cpp.o" + "CMakeFiles/objUtil.dir/utils/argparser.cpp.o.d" + "libobjUtil.a" + "libobjUtil.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/objUtil.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/objUtil.dir/cmake_clean_target.cmake b/ktx/build/CMakeFiles/objUtil.dir/cmake_clean_target.cmake new file mode 100644 index 0000000..46dde6e --- /dev/null +++ b/ktx/build/CMakeFiles/objUtil.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libobjUtil.a" +) diff --git a/ktx/build/CMakeFiles/objUtil.dir/compiler_depend.internal b/ktx/build/CMakeFiles/objUtil.dir/compiler_depend.internal new file mode 100644 index 0000000..5bb679b --- /dev/null +++ b/ktx/build/CMakeFiles/objUtil.dir/compiler_depend.internal @@ -0,0 +1,267 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +CMakeFiles/objUtil.dir/utils/argparser.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/linux/errno.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + diff --git a/ktx/build/CMakeFiles/objUtil.dir/compiler_depend.make b/ktx/build/CMakeFiles/objUtil.dir/compiler_depend.make new file mode 100644 index 0000000..6e44d73 --- /dev/null +++ b/ktx/build/CMakeFiles/objUtil.dir/compiler_depend.make @@ -0,0 +1,790 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +CMakeFiles/objUtil.dir/utils/argparser.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/include/wchar.h: + +/usr/include/time.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/usr/include/c++/16.1.1/bits/regex_error.h: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/bits/types/clock_t.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/c++/16.1.1/istream: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/include/bits/waitflags.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/sys/types.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/bits/wordsize.h: + +/usr/include/stdio.h: + +/usr/include/bits/timesize.h: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/bits/types/timer_t.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/wchar.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/gnu/stubs.h: + +/usr/include/bits/libc-header-start.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/errno.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/bits/long-double.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/c++/16.1.1/regex: + +/usr/include/bits/typesizes.h: + +/usr/include/c++/16.1.1/bits/regex_compiler.tcc: + +/usr/include/bits/cpu-set.h: + +/usr/include/bits/byteswap.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/assert.h: + +/usr/include/c++/16.1.1/bitset: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/asm/types.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/alloca.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/asm-generic/int-ll64.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/regex_automaton.tcc: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/c++/16.1.1/bits/regex_compiler.h: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/asm/posix_types_64.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/asm-generic/types.h: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/c++/16.1.1/vector: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/c++/16.1.1/bits/regex_executor.h: + +/usr/include/bits/floatn.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/stl_stack.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/bits/select.h: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/bits/setjmp.h: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/c++/16.1.1/bits/deque.tcc: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/asm/errno.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/bit: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/bits/types/error_t.h: + +/usr/include/bits/types.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/FILE.h: + +/usr/include/features.h: + +/usr/include/bits/sched.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/bits/types/__locale_t.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/regex.h: + +/usr/include/locale.h: + +/usr/include/c++/16.1.1/bits/regex.tcc: + +/usr/include/c++/16.1.1/bits/stl_map.h: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/bits/regex_constants.h: + +/usr/include/c++/16.1.1/bits/regex_executor.tcc: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/regex_scanner.tcc: + +/usr/include/gnu/stubs-64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.cpp: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/c++/16.1.1/bits/regex_automaton.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/sys/select.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/c++/16.1.1/bits/stl_deque.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/c++/16.1.1/bits/stl_tree.h: + +/usr/include/c++/16.1.1/ios: + +/usr/include/c++/16.1.1/bits/regex_scanner.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/include/stdlib.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/exception: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/c++/16.1.1/deque: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/stack: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/pthread.h: + +/usr/include/c++/16.1.1/locale: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/errno.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/include/features-time64.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/bits/endianness.h: + +/usr/include/libintl.h: + +/usr/include/linux/sched/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/types.h: + +/usr/include/wctype.h: + +/usr/include/sched.h: + +/usr/include/sys/cdefs.h: diff --git a/ktx/build/CMakeFiles/objUtil.dir/compiler_depend.ts b/ktx/build/CMakeFiles/objUtil.dir/compiler_depend.ts new file mode 100644 index 0000000..2041a35 --- /dev/null +++ b/ktx/build/CMakeFiles/objUtil.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for objUtil. diff --git a/ktx/build/CMakeFiles/objUtil.dir/depend.make b/ktx/build/CMakeFiles/objUtil.dir/depend.make new file mode 100644 index 0000000..ae2b500 --- /dev/null +++ b/ktx/build/CMakeFiles/objUtil.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for objUtil. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/objUtil.dir/flags.make b/ktx/build/CMakeFiles/objUtil.dir/flags.make new file mode 100644 index 0000000..c120126 --- /dev/null +++ b/ktx/build/CMakeFiles/objUtil.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -fvisibility=hidden -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/CMakeFiles/objUtil.dir/link.txt b/ktx/build/CMakeFiles/objUtil.dir/link.txt new file mode 100644 index 0000000..6b0bdec --- /dev/null +++ b/ktx/build/CMakeFiles/objUtil.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libobjUtil.a CMakeFiles/objUtil.dir/utils/argparser.cpp.o +/usr/bin/ranlib libobjUtil.a diff --git a/ktx/build/CMakeFiles/objUtil.dir/progress.make b/ktx/build/CMakeFiles/objUtil.dir/progress.make new file mode 100644 index 0000000..1b0d50b --- /dev/null +++ b/ktx/build/CMakeFiles/objUtil.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 90 + diff --git a/ktx/build/CMakeFiles/objUtil.dir/utils/argparser.cpp.o b/ktx/build/CMakeFiles/objUtil.dir/utils/argparser.cpp.o new file mode 100644 index 0000000..83d21ac Binary files /dev/null and b/ktx/build/CMakeFiles/objUtil.dir/utils/argparser.cpp.o differ diff --git a/ktx/build/CMakeFiles/objUtil.dir/utils/argparser.cpp.o.d b/ktx/build/CMakeFiles/objUtil.dir/utils/argparser.cpp.o.d new file mode 100644 index 0000000..7aa0253 --- /dev/null +++ b/ktx/build/CMakeFiles/objUtil.dir/utils/argparser.cpp.o.d @@ -0,0 +1,199 @@ +CMakeFiles/objUtil.dir/utils/argparser.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.cpp \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/move.h /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc diff --git a/ktx/build/CMakeFiles/progress.marks b/ktx/build/CMakeFiles/progress.marks new file mode 100644 index 0000000..29d6383 --- /dev/null +++ b/ktx/build/CMakeFiles/progress.marks @@ -0,0 +1 @@ +100 diff --git a/ktx/build/CMakeFiles/tools.doc.dir/DependInfo.cmake b/ktx/build/CMakeFiles/tools.doc.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/CMakeFiles/tools.doc.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/CMakeFiles/tools.doc.dir/build.make b/ktx/build/CMakeFiles/tools.doc.dir/build.make new file mode 100644 index 0000000..d3896c6 --- /dev/null +++ b/ktx/build/CMakeFiles/tools.doc.dir/build.make @@ -0,0 +1,108 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for tools.doc. + +# Include any custom commands dependencies for this target. +include CMakeFiles/tools.doc.dir/compiler_depend.make + +# Include the progress variables for this target. +include CMakeFiles/tools.doc.dir/progress.make + +CMakeFiles/tools.doc: Doxyfile.tools.doc +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/ktx_main.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_compare.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_create.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_deflate.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_encode.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_extract.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_help.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_info.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_transcode.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_validate.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/ktx2check.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/ktx2ktx2.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/ktxinfo.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/ktxsc.cpp +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxtools_mainpage.md +CMakeFiles/tools.doc: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/toktx.cc + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generating API documentation for tools.doc" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && /usr/bin/cmake -E make_directory /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/html + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && /usr/bin/doxygen /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Doxyfile.tools.doc + +CMakeFiles/tools.doc.dir/codegen: +.PHONY : CMakeFiles/tools.doc.dir/codegen + +tools.doc: CMakeFiles/tools.doc +tools.doc: CMakeFiles/tools.doc.dir/build.make +.PHONY : tools.doc + +# Rule to build all files generated by this target. +CMakeFiles/tools.doc.dir/build: tools.doc +.PHONY : CMakeFiles/tools.doc.dir/build + +CMakeFiles/tools.doc.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/tools.doc.dir/cmake_clean.cmake +.PHONY : CMakeFiles/tools.doc.dir/clean + +CMakeFiles/tools.doc.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/tools.doc.dir/DependInfo.cmake "--color=$(COLOR)" tools.doc +.PHONY : CMakeFiles/tools.doc.dir/depend + diff --git a/ktx/build/CMakeFiles/tools.doc.dir/cmake_clean.cmake b/ktx/build/CMakeFiles/tools.doc.dir/cmake_clean.cmake new file mode 100644 index 0000000..8a916c0 --- /dev/null +++ b/ktx/build/CMakeFiles/tools.doc.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/tools.doc" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/tools.doc.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/CMakeFiles/tools.doc.dir/compiler_depend.make b/ktx/build/CMakeFiles/tools.doc.dir/compiler_depend.make new file mode 100644 index 0000000..16fd2db --- /dev/null +++ b/ktx/build/CMakeFiles/tools.doc.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for tools.doc. +# This may be replaced when dependencies are built. diff --git a/ktx/build/CMakeFiles/tools.doc.dir/compiler_depend.ts b/ktx/build/CMakeFiles/tools.doc.dir/compiler_depend.ts new file mode 100644 index 0000000..88e2b6e --- /dev/null +++ b/ktx/build/CMakeFiles/tools.doc.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for tools.doc. diff --git a/ktx/build/CMakeFiles/tools.doc.dir/progress.make b/ktx/build/CMakeFiles/tools.doc.dir/progress.make new file mode 100644 index 0000000..225de34 --- /dev/null +++ b/ktx/build/CMakeFiles/tools.doc.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = + diff --git a/ktx/build/CPackConfig.cmake b/ktx/build/CPackConfig.cmake new file mode 100644 index 0000000..abab7b8 --- /dev/null +++ b/ktx/build/CPackConfig.cmake @@ -0,0 +1,122 @@ +# This file will be configured to contain variables for CPack. These variables +# should be set in the CMake list file of the project before CPack module is +# included. The list of available CPACK_xxx variables and their associated +# documentation may be obtained using +# cpack --help-variable-list +# +# Some variables are common to all generators (e.g. CPACK_PACKAGE_NAME) +# and some are specific to a generator +# (e.g. CPACK_NSIS_EXTRA_INSTALL_COMMANDS). The generator specific variables +# usually begin with CPACK__xxxx. + + +set(CPACK_APP_VALUE_LEN "1") +set(CPACK_ARCHIVE_GID "-1") +set(CPACK_ARCHIVE_UID "-1") +set(CPACK_BUILD_SOURCE_DIRS "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") +set(CPACK_CMAKE_GENERATOR "Unix Makefiles") +set(CPACK_COMPONENTS_ALL "library;dev;tools") +set(CPACK_COMPONENTS_ALL_SET_BY_USER "TRUE") +set(CPACK_COMPONENT_DEV_DEPENDS "library") +set(CPACK_COMPONENT_DEV_DESCRIPTION "Additional resources for development (header files and documentation).") +set(CPACK_COMPONENT_DEV_DISABLED "TRUE") +set(CPACK_COMPONENT_DEV_DISPLAY_NAME "Development") +set(CPACK_COMPONENT_DEV_DOWNLOADED "FALSE") +set(CPACK_COMPONENT_DEV_HIDDEN "FALSE") +set(CPACK_COMPONENT_DEV_REQUIRED "FALSE") +set(CPACK_COMPONENT_GLLOADTESTAPPS_DISABLED "TRUE") +set(CPACK_COMPONENT_GLLOADTESTAPPS_DISPLAY_NAME "OpenGL Test Applications") +set(CPACK_COMPONENT_GLLOADTESTAPPS_DOWNLOADED "FALSE") +set(CPACK_COMPONENT_GLLOADTESTAPPS_GROUP "LoadTestApps") +set(CPACK_COMPONENT_GLLOADTESTAPPS_HIDDEN "FALSE") +set(CPACK_COMPONENT_GLLOADTESTAPPS_REQUIRED "FALSE") +set(CPACK_COMPONENT_GROUP_LOADTESTAPPS_BOLD_TITLE "FALSE") +set(CPACK_COMPONENT_GROUP_LOADTESTAPPS_DISPLAY_NAME "Load Test Applications") +set(CPACK_COMPONENT_GROUP_LOADTESTAPPS_EXPANDED "FALSE") +set(CPACK_COMPONENT_JNI_DEPENDS "library") +set(CPACK_COMPONENT_JNI_DESCRIPTION "Java wrapper and native interface for KTX library.") +set(CPACK_COMPONENT_JNI_DISABLED "TRUE") +set(CPACK_COMPONENT_JNI_DISPLAY_NAME "Java wrapper") +set(CPACK_COMPONENT_JNI_DOWNLOADED "FALSE") +set(CPACK_COMPONENT_JNI_HIDDEN "FALSE") +set(CPACK_COMPONENT_JNI_REQUIRED "FALSE") +set(CPACK_COMPONENT_LIBRARY_DESCRIPTION "Main KTX library.") +set(CPACK_COMPONENT_LIBRARY_DISABLED "FALSE") +set(CPACK_COMPONENT_LIBRARY_DISPLAY_NAME "Library") +set(CPACK_COMPONENT_LIBRARY_DOWNLOADED "FALSE") +set(CPACK_COMPONENT_LIBRARY_HIDDEN "FALSE") +set(CPACK_COMPONENT_LIBRARY_REQUIRED "TRUE") +set(CPACK_COMPONENT_TOOLS_DEPENDS "library") +set(CPACK_COMPONENT_TOOLS_DESCRIPTION "Command line tools for creating, converting and inspecting KTX files.") +set(CPACK_COMPONENT_TOOLS_DISABLED "FALSE") +set(CPACK_COMPONENT_TOOLS_DISPLAY_NAME "Command line tools") +set(CPACK_COMPONENT_TOOLS_DOWNLOADED "FALSE") +set(CPACK_COMPONENT_TOOLS_HIDDEN "FALSE") +set(CPACK_COMPONENT_TOOLS_REQUIRED "FALSE") +set(CPACK_COMPONENT_UNSPECIFIED_HIDDEN "TRUE") +set(CPACK_COMPONENT_UNSPECIFIED_REQUIRED "TRUE") +set(CPACK_COMPONENT_VKLOADTESTAPP_DISABLED "TRUE") +set(CPACK_COMPONENT_VKLOADTESTAPP_DISPLAY_NAME "Vulkan Test Application") +set(CPACK_COMPONENT_VKLOADTESTAPP_DOWNLOADED "FALSE") +set(CPACK_COMPONENT_VKLOADTESTAPP_GROUP "LoadTestApps") +set(CPACK_COMPONENT_VKLOADTESTAPP_HIDDEN "FALSE") +set(CPACK_COMPONENT_VKLOADTESTAPP_REQUIRED "FALSE") +set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_FILE "/usr/share/cmake/Templates/CPack.GenericDescription.txt") +set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_SUMMARY "KTX-Software built using CMake") +set(CPACK_DMG_SLA_USE_RESOURCE_FILE_LICENSE "ON") +set(CPACK_GENERATOR "DEB;RPM;TBZ2") +set(CPACK_INNOSETUP_ARCHITECTURE "x64") +set(CPACK_INSTALL_CMAKE_PROJECTS "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build;KTX-Software;ALL;/") +set(CPACK_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +set(CPACK_MODULE_PATH "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/modules/") +set(CPACK_NSIS_DISPLAY_NAME "KTX-Software 0.0.0") +set(CPACK_NSIS_INSTALLER_ICON_CODE "") +set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "") +set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES") +set(CPACK_NSIS_PACKAGE_NAME "KTX-Software 0.0.0") +set(CPACK_NSIS_UNINSTALL_NAME "Uninstall") +set(CPACK_OBJCOPY_EXECUTABLE "/usr/bin/objcopy") +set(CPACK_OBJDUMP_EXECUTABLE "/usr/bin/objdump") +set(CPACK_OUTPUT_CONFIG_FILE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CPackConfig.cmake") +set(CPACK_PACKAGE_CHECKSUM "SHA1") +set(CPACK_PACKAGE_CONTACT "khronos@callow.im") +set(CPACK_PACKAGE_DEFAULT_LOCATION "/") +set(CPACK_PACKAGE_DESCRIPTION_FILE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/ReadMe.txt") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Libraries and tools to create and read KTX image texture files.") +set(CPACK_PACKAGE_FILE_NAME "KTX-Software-0.0.0-noversion-Linux-x86_64") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.khronos.org/KTX-Software") +set(CPACK_PACKAGE_INSTALL_DIRECTORY "KTX-Software 0.0.0") +set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "KTX-Software 0.0.0") +set(CPACK_PACKAGE_NAME "KTX-Software") +set(CPACK_PACKAGE_RELOCATABLE "true") +set(CPACK_PACKAGE_VENDOR "Khronos Group") +set(CPACK_PACKAGE_VERSION "0.0.0") +set(CPACK_PACKAGE_VERSION_MAJOR "0") +set(CPACK_PACKAGE_VERSION_MINOR "0") +set(CPACK_PACKAGE_VERSION_PATCH "0") +set(CPACK_READELF_EXECUTABLE "/usr/bin/readelf") +set(CPACK_RESOURCE_FILE_LICENSE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/License.rtf") +set(CPACK_RESOURCE_FILE_README "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/ReadMe.rtf") +set(CPACK_RESOURCE_FILE_WELCOME "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/Welcome.rtf") +set(CPACK_RPM_DEFAULT_DIR_PERMISSIONS "OWNER_READ;OWNER_WRITE;OWNER_EXECUTE;GROUP_READ;GROUP_EXECUTE;WORLD_READ;WORLD_EXECUTE") +set(CPACK_SET_DESTDIR "OFF") +set(CPACK_SOURCE_GENERATOR "TBZ2;TGZ;TXZ;TZ") +set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CPackSourceConfig.cmake") +set(CPACK_SOURCE_RPM "OFF") +set(CPACK_SOURCE_TBZ2 "ON") +set(CPACK_SOURCE_TGZ "ON") +set(CPACK_SOURCE_TXZ "ON") +set(CPACK_SOURCE_TZ "ON") +set(CPACK_SOURCE_ZIP "OFF") +set(CPACK_SYSTEM_NAME "Linux") +set(CPACK_THREADS "1") +set(CPACK_TOPLEVEL_TAG "Linux") +set(CPACK_WIX_SIZEOF_VOID_P "8") + +if(NOT CPACK_PROPERTIES_FILE) + set(CPACK_PROPERTIES_FILE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CPackProperties.cmake") +endif() + +if(EXISTS ${CPACK_PROPERTIES_FILE}) + include(${CPACK_PROPERTIES_FILE}) +endif() diff --git a/ktx/build/CPackSourceConfig.cmake b/ktx/build/CPackSourceConfig.cmake new file mode 100644 index 0000000..61ea6a4 --- /dev/null +++ b/ktx/build/CPackSourceConfig.cmake @@ -0,0 +1,130 @@ +# This file will be configured to contain variables for CPack. These variables +# should be set in the CMake list file of the project before CPack module is +# included. The list of available CPACK_xxx variables and their associated +# documentation may be obtained using +# cpack --help-variable-list +# +# Some variables are common to all generators (e.g. CPACK_PACKAGE_NAME) +# and some are specific to a generator +# (e.g. CPACK_NSIS_EXTRA_INSTALL_COMMANDS). The generator specific variables +# usually begin with CPACK__xxxx. + + +set(CPACK_APP_VALUE_LEN "1") +set(CPACK_ARCHIVE_GID "-1") +set(CPACK_ARCHIVE_UID "-1") +set(CPACK_BUILD_SOURCE_DIRS "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") +set(CPACK_CMAKE_GENERATOR "Unix Makefiles") +set(CPACK_COMPONENTS_ALL "library;dev;tools") +set(CPACK_COMPONENTS_ALL_SET_BY_USER "TRUE") +set(CPACK_COMPONENT_DEV_DEPENDS "library") +set(CPACK_COMPONENT_DEV_DESCRIPTION "Additional resources for development (header files and documentation).") +set(CPACK_COMPONENT_DEV_DISABLED "TRUE") +set(CPACK_COMPONENT_DEV_DISPLAY_NAME "Development") +set(CPACK_COMPONENT_DEV_DOWNLOADED "FALSE") +set(CPACK_COMPONENT_DEV_HIDDEN "FALSE") +set(CPACK_COMPONENT_DEV_REQUIRED "FALSE") +set(CPACK_COMPONENT_GLLOADTESTAPPS_DISABLED "TRUE") +set(CPACK_COMPONENT_GLLOADTESTAPPS_DISPLAY_NAME "OpenGL Test Applications") +set(CPACK_COMPONENT_GLLOADTESTAPPS_DOWNLOADED "FALSE") +set(CPACK_COMPONENT_GLLOADTESTAPPS_GROUP "LoadTestApps") +set(CPACK_COMPONENT_GLLOADTESTAPPS_HIDDEN "FALSE") +set(CPACK_COMPONENT_GLLOADTESTAPPS_REQUIRED "FALSE") +set(CPACK_COMPONENT_GROUP_LOADTESTAPPS_BOLD_TITLE "FALSE") +set(CPACK_COMPONENT_GROUP_LOADTESTAPPS_DISPLAY_NAME "Load Test Applications") +set(CPACK_COMPONENT_GROUP_LOADTESTAPPS_EXPANDED "FALSE") +set(CPACK_COMPONENT_JNI_DEPENDS "library") +set(CPACK_COMPONENT_JNI_DESCRIPTION "Java wrapper and native interface for KTX library.") +set(CPACK_COMPONENT_JNI_DISABLED "TRUE") +set(CPACK_COMPONENT_JNI_DISPLAY_NAME "Java wrapper") +set(CPACK_COMPONENT_JNI_DOWNLOADED "FALSE") +set(CPACK_COMPONENT_JNI_HIDDEN "FALSE") +set(CPACK_COMPONENT_JNI_REQUIRED "FALSE") +set(CPACK_COMPONENT_LIBRARY_DESCRIPTION "Main KTX library.") +set(CPACK_COMPONENT_LIBRARY_DISABLED "FALSE") +set(CPACK_COMPONENT_LIBRARY_DISPLAY_NAME "Library") +set(CPACK_COMPONENT_LIBRARY_DOWNLOADED "FALSE") +set(CPACK_COMPONENT_LIBRARY_HIDDEN "FALSE") +set(CPACK_COMPONENT_LIBRARY_REQUIRED "TRUE") +set(CPACK_COMPONENT_TOOLS_DEPENDS "library") +set(CPACK_COMPONENT_TOOLS_DESCRIPTION "Command line tools for creating, converting and inspecting KTX files.") +set(CPACK_COMPONENT_TOOLS_DISABLED "FALSE") +set(CPACK_COMPONENT_TOOLS_DISPLAY_NAME "Command line tools") +set(CPACK_COMPONENT_TOOLS_DOWNLOADED "FALSE") +set(CPACK_COMPONENT_TOOLS_HIDDEN "FALSE") +set(CPACK_COMPONENT_TOOLS_REQUIRED "FALSE") +set(CPACK_COMPONENT_UNSPECIFIED_HIDDEN "TRUE") +set(CPACK_COMPONENT_UNSPECIFIED_REQUIRED "TRUE") +set(CPACK_COMPONENT_VKLOADTESTAPP_DISABLED "TRUE") +set(CPACK_COMPONENT_VKLOADTESTAPP_DISPLAY_NAME "Vulkan Test Application") +set(CPACK_COMPONENT_VKLOADTESTAPP_DOWNLOADED "FALSE") +set(CPACK_COMPONENT_VKLOADTESTAPP_GROUP "LoadTestApps") +set(CPACK_COMPONENT_VKLOADTESTAPP_HIDDEN "FALSE") +set(CPACK_COMPONENT_VKLOADTESTAPP_REQUIRED "FALSE") +set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_FILE "/usr/share/cmake/Templates/CPack.GenericDescription.txt") +set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_SUMMARY "KTX-Software built using CMake") +set(CPACK_DMG_SLA_USE_RESOURCE_FILE_LICENSE "ON") +set(CPACK_GENERATOR "TBZ2;TGZ;TXZ;TZ") +set(CPACK_IGNORE_FILES "/CVS/;/\\.svn/;/\\.bzr/;/\\.hg/;/\\.git/;\\.swp\$;\\.#;/#") +set(CPACK_INNOSETUP_ARCHITECTURE "x64") +set(CPACK_INSTALLED_DIRECTORIES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx;/") +set(CPACK_INSTALL_CMAKE_PROJECTS "") +set(CPACK_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +set(CPACK_MODULE_PATH "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/modules/") +set(CPACK_NSIS_DISPLAY_NAME "KTX-Software 0.0.0") +set(CPACK_NSIS_INSTALLER_ICON_CODE "") +set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "") +set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES") +set(CPACK_NSIS_PACKAGE_NAME "KTX-Software 0.0.0") +set(CPACK_NSIS_UNINSTALL_NAME "Uninstall") +set(CPACK_OBJCOPY_EXECUTABLE "/usr/bin/objcopy") +set(CPACK_OBJDUMP_EXECUTABLE "/usr/bin/objdump") +set(CPACK_OUTPUT_CONFIG_FILE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CPackConfig.cmake") +set(CPACK_PACKAGE_CHECKSUM "SHA1") +set(CPACK_PACKAGE_CONTACT "khronos@callow.im") +set(CPACK_PACKAGE_DEFAULT_LOCATION "/") +set(CPACK_PACKAGE_DESCRIPTION_FILE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/ReadMe.txt") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Libraries and tools to create and read KTX image texture files.") +set(CPACK_PACKAGE_FILE_NAME "KTX-Software-0.0.0-Source") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.khronos.org/KTX-Software") +set(CPACK_PACKAGE_INSTALL_DIRECTORY "KTX-Software 0.0.0") +set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "KTX-Software 0.0.0") +set(CPACK_PACKAGE_NAME "KTX-Software") +set(CPACK_PACKAGE_RELOCATABLE "true") +set(CPACK_PACKAGE_VENDOR "Khronos Group") +set(CPACK_PACKAGE_VERSION "0.0.0") +set(CPACK_PACKAGE_VERSION_MAJOR "0") +set(CPACK_PACKAGE_VERSION_MINOR "0") +set(CPACK_PACKAGE_VERSION_PATCH "0") +set(CPACK_READELF_EXECUTABLE "/usr/bin/readelf") +set(CPACK_RESOURCE_FILE_LICENSE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/License.rtf") +set(CPACK_RESOURCE_FILE_README "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/ReadMe.rtf") +set(CPACK_RESOURCE_FILE_WELCOME "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/Welcome.rtf") +set(CPACK_RPM_DEFAULT_DIR_PERMISSIONS "OWNER_READ;OWNER_WRITE;OWNER_EXECUTE;GROUP_READ;GROUP_EXECUTE;WORLD_READ;WORLD_EXECUTE") +set(CPACK_RPM_PACKAGE_SOURCES "ON") +set(CPACK_SET_DESTDIR "OFF") +set(CPACK_SOURCE_GENERATOR "TBZ2;TGZ;TXZ;TZ") +set(CPACK_SOURCE_IGNORE_FILES "/CVS/;/\\.svn/;/\\.bzr/;/\\.hg/;/\\.git/;\\.swp\$;\\.#;/#") +set(CPACK_SOURCE_INSTALLED_DIRECTORIES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx;/") +set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CPackSourceConfig.cmake") +set(CPACK_SOURCE_PACKAGE_FILE_NAME "KTX-Software-0.0.0-Source") +set(CPACK_SOURCE_RPM "OFF") +set(CPACK_SOURCE_TBZ2 "ON") +set(CPACK_SOURCE_TGZ "ON") +set(CPACK_SOURCE_TOPLEVEL_TAG "Linux-Source") +set(CPACK_SOURCE_TXZ "ON") +set(CPACK_SOURCE_TZ "ON") +set(CPACK_SOURCE_ZIP "OFF") +set(CPACK_STRIP_FILES "") +set(CPACK_SYSTEM_NAME "Linux") +set(CPACK_THREADS "1") +set(CPACK_TOPLEVEL_TAG "Linux-Source") +set(CPACK_WIX_SIZEOF_VOID_P "8") + +if(NOT CPACK_PROPERTIES_FILE) + set(CPACK_PROPERTIES_FILE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CPackProperties.cmake") +endif() + +if(EXISTS ${CPACK_PROPERTIES_FILE}) + include(${CPACK_PROPERTIES_FILE}) +endif() diff --git a/ktx/build/CTestTestfile.cmake b/ktx/build/CTestTestfile.cmake new file mode 100644 index 0000000..1a68e36 --- /dev/null +++ b/ktx/build/CTestTestfile.cmake @@ -0,0 +1,12 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs("interface/basisu_c_binding") +subdirs("external/astc-encoder") +subdirs("external/fmt") +subdirs("external/cxxopts") +subdirs("tools") +subdirs("tests") diff --git a/ktx/build/DartConfiguration.tcl b/ktx/build/DartConfiguration.tcl new file mode 100644 index 0000000..dc8f227 --- /dev/null +++ b/ktx/build/DartConfiguration.tcl @@ -0,0 +1,109 @@ +# This file is configured by CMake automatically as DartConfiguration.tcl +# If you choose not to use CMake, this file may be hand configured, by +# filling in the required variables. + + +# Configuration directories and files +SourceDirectory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx +BuildDirectory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Where to place the cost data store +CostDataFile: + +# Site is something like machine.domain, i.e. pragmatic.crd +Site: wappdesktop + +# Build name is osname-revision-compiler, i.e. Linux-2.4.2-2smp-c++ +BuildName: Linux-c++ + +# Subprojects +LabelsForSubprojects: + +# Submission information +SubmitURL: http:// +SubmitInactivityTimeout: + +# Dashboard start time +NightlyStartTime: 00:00:00 EDT + +# Commands for the build/test/submit cycle +ConfigureCommand: "/usr/bin/cmake" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx" +MakeCommand: /usr/bin/cmake --build . --config "${CTEST_CONFIGURATION_TYPE}" +DefaultCTestConfigurationType: Release + +# version control +UpdateVersionOnly: + +# CVS options +# Default is "-d -P -A" +CVSCommand: +CVSUpdateOptions: + +# Subversion options +SVNCommand: +SVNOptions: +SVNUpdateOptions: + +# Git options +GITCommand: +GITInitSubmodules: +GITUpdateOptions: +GITUpdateCustom: + +# Perforce options +P4Command: +P4Client: +P4Options: +P4UpdateOptions: +P4UpdateCustom: + +# Generic update command +UpdateCommand: +UpdateOptions: +UpdateType: + +# Compiler info +Compiler: /usr/bin/c++ +CompilerVersion: 16.1.1 + +# Dynamic analysis (MemCheck) +PurifyCommand: +ValgrindCommand: +ValgrindCommandOptions: +DrMemoryCommand: +DrMemoryCommandOptions: +CudaSanitizerCommand: +CudaSanitizerCommandOptions: +MemoryCheckType: +MemoryCheckSanitizerOptions: +MemoryCheckCommand: /usr/bin/valgrind +MemoryCheckCommandOptions: +MemoryCheckSuppressionFile: + +# Coverage +CoverageCommand: /usr/bin/gcov +CoverageExtraFlags: -l + +# Testing options +# TimeOut is the amount of time in seconds to wait for processes +# to complete during testing. After TimeOut seconds, the +# process will be summarily terminated. +# Currently set to 25 minutes +TimeOut: 1500 + +# During parallel testing CTest will not start a new test if doing +# so would cause the system load to exceed this value. +TestLoad: + +TLSVerify: +TLSVersion: + +UseLaunchers: +CurlOptions: +# warning, if you add new options here that have to do with submit, +# you have to update cmCTestSubmitCommand.cxx + +# For CTest submissions that timeout, these options +# specify behavior for retrying the submission +CTestSubmitRetryDelay: 5 +CTestSubmitRetryCount: 3 diff --git a/ktx/build/Doxyfile.jswrappers.doc b/ktx/build/Doxyfile.jswrappers.doc new file mode 100644 index 0000000..40e5983 --- /dev/null +++ b/ktx/build/Doxyfile.jswrappers.doc @@ -0,0 +1,314 @@ +# +# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! +# + +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "KTX Javascript Wrappers Reference" +PROJECT_NUMBER = 0.0.0 +PROJECT_BRIEF = "Libraries and tools to create and read KTX image texture files." +PROJECT_LOGO = icons/ktx_logo_200.png +PROJECT_ICON = +OUTPUT_DIRECTORY = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/html +CREATE_SUBDIRS = NO +CREATE_SUBDIRS_LEVEL = 8 +ALLOW_UNICODE_NAMES = NO +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" "The $name widget" "The $name file" is provides specifies contains represents a an the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +JAVADOC_BANNER = NO +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +PYTHON_DOCSTRING = YES +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 4 +ALIASES = author="\section AUTHOR\n" +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +OPTIMIZE_OUTPUT_SLICE = NO +EXTENSION_MAPPING = +MARKDOWN_SUPPORT = YES +MARKDOWN_STRICT = YES +TOC_INCLUDE_HEADINGS = 6 +MARKDOWN_ID_STYLE = DOXYGEN +AUTOLINK_SUPPORT = YES +AUTOLINK_IGNORE_WORDS = +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +GROUP_NESTED_COMPOUNDS = NO +SUBGROUPING = YES +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = NO +TYPEDEF_HIDES_STRUCT = NO +LOOKUP_CACHE_SIZE = 0 +NUM_PROC_THREADS = 1 +TIMESTAMP = YES +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_PRIV_VIRTUAL = NO +EXTRACT_PACKAGE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +RESOLVE_UNNAMED_PARAMS = YES +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = NO +HIDE_UNDOC_NAMESPACES = YES +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +HIDE_COMPOUND_REFERENCE= NO +SHOW_HEADERFILE = YES +SHOW_INCLUDE_FILES = YES +SHOW_GROUPED_MEMB_INC = NO +FORCE_LOCAL_INCLUDES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_MEMBERS_CTORS_1ST = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +GENERATE_REQUIREMENTS = YES +REQ_TRACEABILITY_INFO = YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = NO +SHOW_FILES = NO +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = pkgdoc/jswrappersDoxyLayout.xml +CITE_BIB_FILES = +EXTERNAL_TOOL_PATH = +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_IF_INCOMPLETE_DOC = YES +WARN_NO_PARAMDOC = NO +WARN_IF_UNDOC_ENUM_VAL = NO +WARN_LAYOUT_FILE = YES +WARN_AS_ERROR = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LINE_FORMAT = at line $line of file $file +WARN_LOGFILE = +INPUT = interface/js_binding +INPUT_ENCODING = UTF-8 +INPUT_FILE_ENCODING = +FILE_PATTERNS = *.c *.cc *.cxx *.cxxm *.cpp *.cppm *.ccm *.c++ *.c++m *.java *.ii *.ixx *.ipp *.i++ *.inl *.idl *.ddl *.odl *.h *.hh *.hxx *.hpp *.h++ *.l *.cs *.d *.php *.php4 *.php5 *.phtml *.inc *.m *.markdown *.md *.mm *.dox *.py *.pyw *.f90 *.f95 *.f03 *.f08 *.f18 *.f *.for *.vhd *.vhdl *.ucf *.qsf *.ice +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = */.git/* */.svn/* */.hg/* */CMakeFiles/* */_CPack_Packages/* DartConfiguration.tcl CMakeLists.txt CMakeCache.txt +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = +USE_MDFILE_AS_MAINPAGE = +IMPLICIT_DIR_DOCS = YES +FORTRAN_COMMENT_AFTER = 72 +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +SOURCE_TOOLTIPS = YES +USE_HTAGS = NO +VERBATIM_HEADERS = NO +CLANG_ASSISTED_PARSING = NO +CLANG_ADD_INC_PATHS = YES +CLANG_OPTIONS = +CLANG_DATABASE_PATH = +ALPHABETICAL_INDEX = NO +IGNORE_PREFIX = +GENERATE_HTML = YES +HTML_OUTPUT = ktxjswrappers +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_EXTRA_STYLESHEET = +HTML_EXTRA_FILES = +HTML_COLORSTYLE = AUTO_LIGHT +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 80 +HTML_DYNAMIC_MENUS = YES +HTML_DYNAMIC_SECTIONS = NO +HTML_CODE_FOLDING = YES +HTML_COPY_CLIPBOARD = YES +HTML_PROJECT_COOKIE = +HTML_INDEX_NUM_ENTRIES = 100 +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_FEEDURL = +DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_NAME = Publisher +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +CHM_INDEX_ENCODING = +BINARY_TOC = NO +TOC_EXPAND = NO +SITEMAP_URL = +GENERATE_QHP = NO +QCH_FILE = +QHP_NAMESPACE = org.doxygen.Project +QHP_VIRTUAL_FOLDER = doc +QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = +QHG_LOCATION = +GENERATE_ECLIPSEHELP = NO +ECLIPSE_DOC_ID = org.doxygen.Project +DISABLE_INDEX = NO +GENERATE_TREEVIEW = YES +PAGE_OUTLINE_PANEL = YES +FULL_SIDEBAR = NO +ENUM_VALUES_PER_LINE = 4 +SHOW_ENUM_VALUES = NO +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +OBFUSCATE_EMAILS = YES +HTML_FORMULA_FORMAT = png +FORMULA_FONTSIZE = 10 +FORMULA_MACROFILE = +USE_MATHJAX = NO +MATHJAX_VERSION = MathJax_2 +MATHJAX_FORMAT = HTML-CSS +MATHJAX_RELPATH = +MATHJAX_EXTENSIONS = +MATHJAX_CODEFILE = +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO +SEARCHENGINE_URL = +SEARCHDATA_FILE = searchdata.xml +EXTERNAL_SEARCH_ID = +EXTRA_SEARCH_MAPPINGS = +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = +MAKEINDEX_CMD_NAME = makeindex +LATEX_MAKEINDEX_CMD = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4 +EXTRA_PACKAGES = +LATEX_HEADER = +LATEX_FOOTER = +LATEX_EXTRA_STYLESHEET = +LATEX_EXTRA_FILES = +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +LATEX_BIB_STYLE = plainnat +LATEX_EMOJI_DIRECTORY = +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +RTF_EXTRA_FILES = +GENERATE_MAN = YES +MAN_OUTPUT = ../man +MAN_EXTENSION = .3 +MAN_SUBDIR = +MAN_LINKS = NO +GENERATE_XML = NO +XML_OUTPUT = xml +XML_PROGRAMLISTING = YES +XML_NS_MEMB_FILE_SCOPE = NO +GENERATE_DOCBOOK = NO +DOCBOOK_OUTPUT = docbook +GENERATE_AUTOGEN_DEF = NO +GENERATE_SQLITE3 = NO +SQLITE3_OUTPUT = sqlite3 +SQLITE3_RECREATE_DB = YES +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +TAGFILES = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/ktxpkg.tag=.. +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +EXTERNAL_PAGES = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_NUM_THREADS = 0 +DOT_COMMON_ATTR = fontname=Helvetica,fontsize=10 +DOT_EDGE_ATTR = labelfontname=Helvetica,labelfontsize=10 +DOT_NODE_ATTR = shape=box,height=0.2,width=0.4 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +UML_LIMIT_NUM_FIELDS = 10 +UML_MAX_EDGE_LABELS = 10 +DOT_UML_DETAILS = NO +DOT_WRAP_THRESHOLD = 17 +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DIR_GRAPH_MAX_DEPTH = 1 +DOT_IMAGE_FORMAT = png +INTERACTIVE_SVG = NO +DOT_PATH = /usr/bin +DOTFILE_DIRS = +DIA_PATH = +DIAFILE_DIRS = +PLANTUML_JAR_PATH = +PLANTUML_CFG_FILE = +PLANTUML_INCLUDE_PATH = +PLANTUMLFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_MULTI_TARGETS = YES +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +MSCGEN_TOOL = +MSCFILE_DIRS = diff --git a/ktx/build/Doxyfile.ktxpkg.doc b/ktx/build/Doxyfile.ktxpkg.doc new file mode 100644 index 0000000..7aa95a2 --- /dev/null +++ b/ktx/build/Doxyfile.ktxpkg.doc @@ -0,0 +1,314 @@ +# +# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! +# + +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "Khronos Texture Software" +PROJECT_NUMBER = 0.0.0 +PROJECT_BRIEF = "Libraries and tools to create and read KTX image texture files." +PROJECT_LOGO = icons/ktx_logo_200.png +PROJECT_ICON = +OUTPUT_DIRECTORY = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/html +CREATE_SUBDIRS = NO +CREATE_SUBDIRS_LEVEL = 8 +ALLOW_UNICODE_NAMES = NO +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" "The $name widget" "The $name file" is provides specifies contains represents a an the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +JAVADOC_BANNER = NO +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +PYTHON_DOCSTRING = YES +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 4 +ALIASES = pversion="\par Package Version\n" +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +OPTIMIZE_OUTPUT_SLICE = NO +EXTENSION_MAPPING = +MARKDOWN_SUPPORT = YES +MARKDOWN_STRICT = YES +TOC_INCLUDE_HEADINGS = 6 +MARKDOWN_ID_STYLE = DOXYGEN +AUTOLINK_SUPPORT = YES +AUTOLINK_IGNORE_WORDS = +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +GROUP_NESTED_COMPOUNDS = NO +SUBGROUPING = YES +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = NO +TYPEDEF_HIDES_STRUCT = NO +LOOKUP_CACHE_SIZE = 0 +NUM_PROC_THREADS = 1 +TIMESTAMP = YES +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_PRIV_VIRTUAL = NO +EXTRACT_PACKAGE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +RESOLVE_UNNAMED_PARAMS = YES +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = NO +HIDE_UNDOC_NAMESPACES = YES +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +HIDE_COMPOUND_REFERENCE= NO +SHOW_HEADERFILE = YES +SHOW_INCLUDE_FILES = YES +SHOW_GROUPED_MEMB_INC = NO +FORCE_LOCAL_INCLUDES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_MEMBERS_CTORS_1ST = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +GENERATE_REQUIREMENTS = YES +REQ_TRACEABILITY_INFO = YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = pkgdoc/packageDoxyLayout.xml +CITE_BIB_FILES = +EXTERNAL_TOOL_PATH = +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_IF_INCOMPLETE_DOC = YES +WARN_NO_PARAMDOC = NO +WARN_IF_UNDOC_ENUM_VAL = NO +WARN_LAYOUT_FILE = YES +WARN_AS_ERROR = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LINE_FORMAT = at line $line of file $file +WARN_LOGFILE = +INPUT = pkgdoc/pages.md LICENSE.md +INPUT_ENCODING = UTF-8 +INPUT_FILE_ENCODING = +FILE_PATTERNS = *.c *.cc *.cxx *.cxxm *.cpp *.cppm *.ccm *.c++ *.c++m *.java *.ii *.ixx *.ipp *.i++ *.inl *.idl *.ddl *.odl *.h *.hh *.hxx *.hpp *.h++ *.l *.cs *.d *.php *.php4 *.php5 *.phtml *.inc *.m *.markdown *.md *.mm *.dox *.py *.pyw *.f90 *.f95 *.f03 *.f08 *.f18 *.f *.for *.vhd *.vhdl *.ucf *.qsf *.ice +RECURSIVE = YES +EXCLUDE = lib/uthash.h +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = ktxint.h */.git/* */.svn/* */.hg/* */CMakeFiles/* */_CPack_Packages/* DartConfiguration.tcl CMakeLists.txt CMakeCache.txt +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = lib +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = +USE_MDFILE_AS_MAINPAGE = +IMPLICIT_DIR_DOCS = YES +FORTRAN_COMMENT_AFTER = 72 +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +SOURCE_TOOLTIPS = YES +USE_HTAGS = NO +VERBATIM_HEADERS = NO +CLANG_ASSISTED_PARSING = NO +CLANG_ADD_INC_PATHS = YES +CLANG_OPTIONS = +CLANG_DATABASE_PATH = +ALPHABETICAL_INDEX = NO +IGNORE_PREFIX = +GENERATE_HTML = YES +HTML_OUTPUT = . +HTML_FILE_EXTENSION = .html +HTML_HEADER = pkgdoc/header.html +HTML_FOOTER = +HTML_STYLESHEET = +HTML_EXTRA_STYLESHEET = +HTML_EXTRA_FILES = +HTML_COLORSTYLE = AUTO_LIGHT +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 80 +HTML_DYNAMIC_MENUS = YES +HTML_DYNAMIC_SECTIONS = NO +HTML_CODE_FOLDING = YES +HTML_COPY_CLIPBOARD = YES +HTML_PROJECT_COOKIE = +HTML_INDEX_NUM_ENTRIES = 100 +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_FEEDURL = +DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_NAME = Publisher +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +CHM_INDEX_ENCODING = +BINARY_TOC = NO +TOC_EXPAND = NO +SITEMAP_URL = +GENERATE_QHP = NO +QCH_FILE = +QHP_NAMESPACE = org.doxygen.Project +QHP_VIRTUAL_FOLDER = doc +QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = +QHG_LOCATION = +GENERATE_ECLIPSEHELP = NO +ECLIPSE_DOC_ID = org.doxygen.Project +DISABLE_INDEX = NO +GENERATE_TREEVIEW = YES +PAGE_OUTLINE_PANEL = YES +FULL_SIDEBAR = NO +ENUM_VALUES_PER_LINE = 4 +SHOW_ENUM_VALUES = NO +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +OBFUSCATE_EMAILS = YES +HTML_FORMULA_FORMAT = png +FORMULA_FONTSIZE = 10 +FORMULA_MACROFILE = +USE_MATHJAX = NO +MATHJAX_VERSION = MathJax_2 +MATHJAX_FORMAT = HTML-CSS +MATHJAX_RELPATH = +MATHJAX_EXTENSIONS = +MATHJAX_CODEFILE = +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO +SEARCHENGINE_URL = +SEARCHDATA_FILE = searchdata.xml +EXTERNAL_SEARCH_ID = +EXTRA_SEARCH_MAPPINGS = +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = +MAKEINDEX_CMD_NAME = makeindex +LATEX_MAKEINDEX_CMD = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4 +EXTRA_PACKAGES = +LATEX_HEADER = +LATEX_FOOTER = +LATEX_EXTRA_STYLESHEET = +LATEX_EXTRA_FILES = +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +LATEX_BIB_STYLE = plainnat +LATEX_EMOJI_DIRECTORY = +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +RTF_EXTRA_FILES = +GENERATE_MAN = YES +MAN_OUTPUT = ../man +MAN_EXTENSION = .3 +MAN_SUBDIR = +MAN_LINKS = YES +GENERATE_XML = NO +XML_OUTPUT = xml +XML_PROGRAMLISTING = YES +XML_NS_MEMB_FILE_SCOPE = NO +GENERATE_DOCBOOK = NO +DOCBOOK_OUTPUT = docbook +GENERATE_AUTOGEN_DEF = NO +GENERATE_SQLITE3 = NO +SQLITE3_OUTPUT = sqlite3 +SQLITE3_RECREATE_DB = YES +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +TAGFILES = +GENERATE_TAGFILE = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/ktxpkg.tag +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +EXTERNAL_PAGES = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_NUM_THREADS = 0 +DOT_COMMON_ATTR = fontname=Helvetica,fontsize=10 +DOT_EDGE_ATTR = labelfontname=Helvetica,labelfontsize=10 +DOT_NODE_ATTR = shape=box,height=0.2,width=0.4 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +UML_LIMIT_NUM_FIELDS = 10 +UML_MAX_EDGE_LABELS = 10 +DOT_UML_DETAILS = NO +DOT_WRAP_THRESHOLD = 17 +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DIR_GRAPH_MAX_DEPTH = 1 +DOT_IMAGE_FORMAT = png +INTERACTIVE_SVG = NO +DOT_PATH = /usr/bin +DOTFILE_DIRS = +DIA_PATH = +DIAFILE_DIRS = +PLANTUML_JAR_PATH = +PLANTUML_CFG_FILE = +PLANTUML_INCLUDE_PATH = +PLANTUMLFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_MULTI_TARGETS = YES +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +MSCGEN_TOOL = +MSCFILE_DIRS = diff --git a/ktx/build/Doxyfile.libktx.doc b/ktx/build/Doxyfile.libktx.doc new file mode 100644 index 0000000..b47e0a8 --- /dev/null +++ b/ktx/build/Doxyfile.libktx.doc @@ -0,0 +1,338 @@ +# +# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! +# + +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "libktx Reference" +PROJECT_NUMBER = 0.0.0 +PROJECT_BRIEF = "Libraries and tools to create and read KTX image texture files." +PROJECT_LOGO = icons/ktx_logo_200.png +PROJECT_ICON = +OUTPUT_DIRECTORY = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/html +CREATE_SUBDIRS = NO +CREATE_SUBDIRS_LEVEL = 8 +ALLOW_UNICODE_NAMES = NO +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" "The $name widget" "The $name file" is provides specifies contains represents a an the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +JAVADOC_BANNER = NO +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +PYTHON_DOCSTRING = YES +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 4 +ALIASES = error="\par Errors\n" +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +OPTIMIZE_OUTPUT_SLICE = NO +EXTENSION_MAPPING = +MARKDOWN_SUPPORT = YES +MARKDOWN_STRICT = YES +TOC_INCLUDE_HEADINGS = 6 +MARKDOWN_ID_STYLE = DOXYGEN +AUTOLINK_SUPPORT = YES +AUTOLINK_IGNORE_WORDS = +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +GROUP_NESTED_COMPOUNDS = NO +SUBGROUPING = YES +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = NO +TYPEDEF_HIDES_STRUCT = NO +LOOKUP_CACHE_SIZE = 0 +NUM_PROC_THREADS = 1 +TIMESTAMP = YES +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_PRIV_VIRTUAL = NO +EXTRACT_PACKAGE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +RESOLVE_UNNAMED_PARAMS = YES +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = NO +HIDE_UNDOC_NAMESPACES = YES +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = YES +HIDE_COMPOUND_REFERENCE= NO +SHOW_HEADERFILE = YES +SHOW_INCLUDE_FILES = YES +SHOW_GROUPED_MEMB_INC = NO +FORCE_LOCAL_INCLUDES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_MEMBERS_CTORS_1ST = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +GENERATE_REQUIREMENTS = YES +REQ_TRACEABILITY_INFO = YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = pkgdoc/libktxDoxyLayout.xml +CITE_BIB_FILES = +EXTERNAL_TOOL_PATH = +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_IF_INCOMPLETE_DOC = YES +WARN_NO_PARAMDOC = NO +WARN_IF_UNDOC_ENUM_VAL = NO +WARN_LAYOUT_FILE = YES +WARN_AS_ERROR = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LINE_FORMAT = at line $line of file $file +WARN_LOGFILE = +INPUT = lib/libktx_mainpage.md include lib/astc_codec.cpp lib/basis_encode.cpp lib/basis_transcode.cpp lib/miniz_wrapper.cpp lib/strings.c lib/gl_funcs.c lib/glloader.c lib/hashlist.c lib/filestream.c lib/memstream.c lib/texture.c lib/texture1.c lib/texture2.c lib/vkloader.c lib/writer1.c lib/writer2.c +INPUT_ENCODING = UTF-8 +INPUT_FILE_ENCODING = +FILE_PATTERNS = *.c *.cc *.cxx *.cxxm *.cpp *.cppm *.ccm *.c++ *.c++m *.java *.ii *.ixx *.ipp *.i++ *.inl *.idl *.ddl *.odl *.h *.hh *.hxx *.hpp *.h++ *.l *.cs *.d *.php *.php4 *.php5 *.phtml *.inc *.m *.markdown *.md *.mm *.dox *.py *.pyw *.f90 *.f95 *.f03 *.f08 *.f18 *.f *.for *.vhd *.vhdl *.ucf *.qsf *.ice +RECURSIVE = YES +EXCLUDE = lib/uthash.h +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = ktxint.h */.git/* */.svn/* */.hg/* */CMakeFiles/* */_CPack_Packages/* DartConfiguration.tcl CMakeLists.txt CMakeCache.txt +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = examples lib +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = +USE_MDFILE_AS_MAINPAGE = +IMPLICIT_DIR_DOCS = YES +FORTRAN_COMMENT_AFTER = 72 +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +SOURCE_TOOLTIPS = YES +USE_HTAGS = NO +VERBATIM_HEADERS = NO +CLANG_ASSISTED_PARSING = NO +CLANG_ADD_INC_PATHS = YES +CLANG_OPTIONS = +CLANG_DATABASE_PATH = +ALPHABETICAL_INDEX = NO +IGNORE_PREFIX = KTX_ ktx_ KTX ktx +GENERATE_HTML = YES +HTML_OUTPUT = libktx +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_EXTRA_STYLESHEET = +HTML_EXTRA_FILES = +HTML_COLORSTYLE = AUTO_LIGHT +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 80 +HTML_DYNAMIC_MENUS = YES +HTML_DYNAMIC_SECTIONS = NO +HTML_CODE_FOLDING = YES +HTML_COPY_CLIPBOARD = YES +HTML_PROJECT_COOKIE = +HTML_INDEX_NUM_ENTRIES = 100 +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_FEEDURL = +DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_NAME = Publisher +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +CHM_INDEX_ENCODING = +BINARY_TOC = NO +TOC_EXPAND = NO +SITEMAP_URL = +GENERATE_QHP = NO +QCH_FILE = +QHP_NAMESPACE = org.doxygen.Project +QHP_VIRTUAL_FOLDER = doc +QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = +QHG_LOCATION = +GENERATE_ECLIPSEHELP = NO +ECLIPSE_DOC_ID = org.doxygen.Project +DISABLE_INDEX = NO +GENERATE_TREEVIEW = YES +PAGE_OUTLINE_PANEL = YES +FULL_SIDEBAR = NO +ENUM_VALUES_PER_LINE = 4 +SHOW_ENUM_VALUES = NO +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +OBFUSCATE_EMAILS = YES +HTML_FORMULA_FORMAT = png +FORMULA_FONTSIZE = 10 +FORMULA_MACROFILE = +USE_MATHJAX = NO +MATHJAX_VERSION = MathJax_2 +MATHJAX_FORMAT = HTML-CSS +MATHJAX_RELPATH = +MATHJAX_EXTENSIONS = +MATHJAX_CODEFILE = +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO +SEARCHENGINE_URL = +SEARCHDATA_FILE = searchdata.xml +EXTERNAL_SEARCH_ID = +EXTRA_SEARCH_MAPPINGS = +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = +MAKEINDEX_CMD_NAME = makeindex +LATEX_MAKEINDEX_CMD = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4 +EXTRA_PACKAGES = +LATEX_HEADER = +LATEX_FOOTER = +LATEX_EXTRA_STYLESHEET = +LATEX_EXTRA_FILES = +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +LATEX_BIB_STYLE = plainnat +LATEX_EMOJI_DIRECTORY = +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +RTF_EXTRA_FILES = +GENERATE_MAN = YES +MAN_OUTPUT = ../man +MAN_EXTENSION = .3 +MAN_SUBDIR = +MAN_LINKS = YES +GENERATE_XML = NO +XML_OUTPUT = xml +XML_PROGRAMLISTING = YES +XML_NS_MEMB_FILE_SCOPE = NO +GENERATE_DOCBOOK = NO +DOCBOOK_OUTPUT = docbook +GENERATE_AUTOGEN_DEF = NO +GENERATE_SQLITE3 = NO +SQLITE3_OUTPUT = sqlite3 +SQLITE3_RECREATE_DB = YES +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = KTX_DOXYGEN_SKIP KTX_FEATURE_WRITE "KTXTEXTURECLASSDEFN=class_id classId; \ + struct ktxTexture_vtbl* vtbl; \ + struct ktxTexture_vvtbl* vvtbl; \ + struct ktxTexture_protected* _protected; \ + ktx_bool_t isArray; \ + ktx_bool_t isCubemap; \ + ktx_bool_t isCompressed; \ + ktx_bool_t generateMipmaps; \ + ktx_uint32_t baseWidth; \ + ktx_uint32_t baseHeight; \ + ktx_uint32_t baseDepth; \ + ktx_uint32_t numDimensions; \ + ktx_uint32_t numLevels; \ + ktx_uint32_t numLayers; \ + ktx_uint32_t numFaces; \ + struct { \ + ktxOrientationX x; \ + ktxOrientationY y; \ + ktxOrientationZ z; \ + } orientation; \ + ktxHashList kvDataHead; \ + ktx_uint32_t kvDataLen; \ + ktx_uint8_t* kvData; \ + ktx_size_t dataSize; \ + ktx_uint8_t* pData;" +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +EXTERNAL_PAGES = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_NUM_THREADS = 0 +DOT_COMMON_ATTR = fontname=Helvetica,fontsize=10 +DOT_EDGE_ATTR = labelfontname=Helvetica,labelfontsize=10 +DOT_NODE_ATTR = shape=box,height=0.2,width=0.4 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +UML_LIMIT_NUM_FIELDS = 10 +UML_MAX_EDGE_LABELS = 10 +DOT_UML_DETAILS = NO +DOT_WRAP_THRESHOLD = 17 +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DIR_GRAPH_MAX_DEPTH = 1 +DOT_IMAGE_FORMAT = png +INTERACTIVE_SVG = NO +DOT_PATH = /usr/bin +DOTFILE_DIRS = +DIA_PATH = +DIAFILE_DIRS = +PLANTUML_JAR_PATH = +PLANTUML_CFG_FILE = +PLANTUML_INCLUDE_PATH = +PLANTUMLFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_MULTI_TARGETS = YES +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +MSCGEN_TOOL = +MSCFILE_DIRS = diff --git a/ktx/build/Doxyfile.tools.doc b/ktx/build/Doxyfile.tools.doc new file mode 100644 index 0000000..e1324e0 --- /dev/null +++ b/ktx/build/Doxyfile.tools.doc @@ -0,0 +1,314 @@ +# +# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! +# + +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "KTX Tools Reference" +PROJECT_NUMBER = 0.0.0 +PROJECT_BRIEF = "Libraries and tools to create and read KTX image texture files." +PROJECT_LOGO = icons/ktx_logo_200.png +PROJECT_ICON = +OUTPUT_DIRECTORY = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/html +CREATE_SUBDIRS = NO +CREATE_SUBDIRS_LEVEL = 8 +ALLOW_UNICODE_NAMES = NO +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" "The $name widget" "The $name file" is provides specifies contains represents a an the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +JAVADOC_BANNER = NO +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +PYTHON_DOCSTRING = YES +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 4 +ALIASES = author="\section AUTHOR\n" +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +OPTIMIZE_OUTPUT_SLICE = NO +EXTENSION_MAPPING = +MARKDOWN_SUPPORT = YES +MARKDOWN_STRICT = YES +TOC_INCLUDE_HEADINGS = 6 +MARKDOWN_ID_STYLE = DOXYGEN +AUTOLINK_SUPPORT = YES +AUTOLINK_IGNORE_WORDS = +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +GROUP_NESTED_COMPOUNDS = NO +SUBGROUPING = YES +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = NO +TYPEDEF_HIDES_STRUCT = NO +LOOKUP_CACHE_SIZE = 0 +NUM_PROC_THREADS = 1 +TIMESTAMP = YES +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_PRIV_VIRTUAL = NO +EXTRACT_PACKAGE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +RESOLVE_UNNAMED_PARAMS = YES +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = NO +HIDE_UNDOC_NAMESPACES = YES +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +HIDE_COMPOUND_REFERENCE= NO +SHOW_HEADERFILE = YES +SHOW_INCLUDE_FILES = YES +SHOW_GROUPED_MEMB_INC = NO +FORCE_LOCAL_INCLUDES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_MEMBERS_CTORS_1ST = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +GENERATE_REQUIREMENTS = YES +REQ_TRACEABILITY_INFO = YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = NO +SHOW_FILES = NO +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = pkgdoc/toolsDoxyLayout.xml +CITE_BIB_FILES = +EXTERNAL_TOOL_PATH = +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_IF_INCOMPLETE_DOC = YES +WARN_NO_PARAMDOC = NO +WARN_IF_UNDOC_ENUM_VAL = NO +WARN_LAYOUT_FILE = YES +WARN_AS_ERROR = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LINE_FORMAT = at line $line of file $file +WARN_LOGFILE = +INPUT = tools/ktx/ktx_main.cpp tools/ktx/command_compare.cpp tools/ktx/command_create.cpp tools/ktx/command_deflate.cpp tools/ktx/command_encode.cpp tools/ktx/command_extract.cpp tools/ktx/command_help.cpp tools/ktx/command_info.cpp tools/ktx/command_transcode.cpp tools/ktx/command_validate.cpp tools/ktx2check/ktx2check.cpp tools/ktx2ktx2/ktx2ktx2.cpp tools/ktxinfo/ktxinfo.cpp tools/ktxsc/ktxsc.cpp tools/ktxtools_mainpage.md tools/toktx/toktx.cc +INPUT_ENCODING = UTF-8 +INPUT_FILE_ENCODING = +FILE_PATTERNS = *.cpp +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = */.git/* */.svn/* */.hg/* */CMakeFiles/* */_CPack_Packages/* DartConfiguration.tcl CMakeLists.txt CMakeCache.txt +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = utils tools +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = +USE_MDFILE_AS_MAINPAGE = +IMPLICIT_DIR_DOCS = YES +FORTRAN_COMMENT_AFTER = 72 +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +SOURCE_TOOLTIPS = YES +USE_HTAGS = NO +VERBATIM_HEADERS = NO +CLANG_ASSISTED_PARSING = NO +CLANG_ADD_INC_PATHS = YES +CLANG_OPTIONS = +CLANG_DATABASE_PATH = +ALPHABETICAL_INDEX = NO +IGNORE_PREFIX = +GENERATE_HTML = YES +HTML_OUTPUT = ktxtools +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_EXTRA_STYLESHEET = +HTML_EXTRA_FILES = +HTML_COLORSTYLE = AUTO_LIGHT +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 80 +HTML_DYNAMIC_MENUS = YES +HTML_DYNAMIC_SECTIONS = NO +HTML_CODE_FOLDING = YES +HTML_COPY_CLIPBOARD = YES +HTML_PROJECT_COOKIE = +HTML_INDEX_NUM_ENTRIES = 100 +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_FEEDURL = +DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_NAME = Publisher +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +CHM_INDEX_ENCODING = +BINARY_TOC = NO +TOC_EXPAND = NO +SITEMAP_URL = +GENERATE_QHP = NO +QCH_FILE = +QHP_NAMESPACE = org.doxygen.Project +QHP_VIRTUAL_FOLDER = doc +QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = +QHG_LOCATION = +GENERATE_ECLIPSEHELP = NO +ECLIPSE_DOC_ID = org.doxygen.Project +DISABLE_INDEX = NO +GENERATE_TREEVIEW = YES +PAGE_OUTLINE_PANEL = YES +FULL_SIDEBAR = NO +ENUM_VALUES_PER_LINE = 4 +SHOW_ENUM_VALUES = NO +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +OBFUSCATE_EMAILS = YES +HTML_FORMULA_FORMAT = png +FORMULA_FONTSIZE = 10 +FORMULA_MACROFILE = +USE_MATHJAX = NO +MATHJAX_VERSION = MathJax_2 +MATHJAX_FORMAT = HTML-CSS +MATHJAX_RELPATH = +MATHJAX_EXTENSIONS = +MATHJAX_CODEFILE = +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO +SEARCHENGINE_URL = +SEARCHDATA_FILE = searchdata.xml +EXTERNAL_SEARCH_ID = +EXTRA_SEARCH_MAPPINGS = +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = +MAKEINDEX_CMD_NAME = makeindex +LATEX_MAKEINDEX_CMD = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4 +EXTRA_PACKAGES = +LATEX_HEADER = +LATEX_FOOTER = +LATEX_EXTRA_STYLESHEET = +LATEX_EXTRA_FILES = +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +LATEX_BIB_STYLE = plainnat +LATEX_EMOJI_DIRECTORY = +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +RTF_EXTRA_FILES = +GENERATE_MAN = YES +MAN_OUTPUT = ../man +MAN_EXTENSION = .1 +MAN_SUBDIR = +MAN_LINKS = NO +GENERATE_XML = NO +XML_OUTPUT = xml +XML_PROGRAMLISTING = YES +XML_NS_MEMB_FILE_SCOPE = NO +GENERATE_DOCBOOK = NO +DOCBOOK_OUTPUT = docbook +GENERATE_AUTOGEN_DEF = NO +GENERATE_SQLITE3 = NO +SQLITE3_OUTPUT = sqlite3 +SQLITE3_RECREATE_DB = YES +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +TAGFILES = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/ktxpkg.tag=.. +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +EXTERNAL_PAGES = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_NUM_THREADS = 0 +DOT_COMMON_ATTR = fontname=Helvetica,fontsize=10 +DOT_EDGE_ATTR = labelfontname=Helvetica,labelfontsize=10 +DOT_NODE_ATTR = shape=box,height=0.2,width=0.4 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +UML_LIMIT_NUM_FIELDS = 10 +UML_MAX_EDGE_LABELS = 10 +DOT_UML_DETAILS = NO +DOT_WRAP_THRESHOLD = 17 +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DIR_GRAPH_MAX_DEPTH = 1 +DOT_IMAGE_FORMAT = png +INTERACTIVE_SVG = NO +DOT_PATH = /usr/bin +DOTFILE_DIRS = +DIA_PATH = +DIAFILE_DIRS = +PLANTUML_JAR_PATH = +PLANTUML_CFG_FILE = +PLANTUML_INCLUDE_PATH = +PLANTUMLFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_MULTI_TARGETS = YES +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +MSCGEN_TOOL = +MSCFILE_DIRS = diff --git a/ktx/build/KtxConfigVersion.cmake b/ktx/build/KtxConfigVersion.cmake new file mode 100644 index 0000000..5cbd38a --- /dev/null +++ b/ktx/build/KtxConfigVersion.cmake @@ -0,0 +1,65 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version, +# but only if the requested major version is the same as the current one. +# The variable CVF_VERSION must be set before calling configure_file(). + + +set(PACKAGE_VERSION "0.0.0") + +if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + + if("0.0.0" MATCHES "^([0-9]+)\\.") + set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}") + if(NOT CVF_VERSION_MAJOR VERSION_EQUAL 0) + string(REGEX REPLACE "^0+" "" CVF_VERSION_MAJOR "${CVF_VERSION_MAJOR}") + endif() + else() + set(CVF_VERSION_MAJOR "0.0.0") + endif() + + if(PACKAGE_FIND_VERSION_RANGE) + # both endpoints of the range must have the expected major version + math (EXPR CVF_VERSION_MAJOR_NEXT "${CVF_VERSION_MAJOR} + 1") + if (NOT PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR + OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX_MAJOR STREQUAL CVF_VERSION_MAJOR) + OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX VERSION_LESS_EQUAL CVF_VERSION_MAJOR_NEXT))) + set(PACKAGE_VERSION_COMPATIBLE FALSE) + elseif(PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR + AND ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS_EQUAL PACKAGE_FIND_VERSION_MAX) + OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MAX))) + set(PACKAGE_VERSION_COMPATIBLE TRUE) + else() + set(PACKAGE_VERSION_COMPATIBLE FALSE) + endif() + else() + if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR) + set(PACKAGE_VERSION_COMPATIBLE TRUE) + else() + set(PACKAGE_VERSION_COMPATIBLE FALSE) + endif() + + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() + endif() +endif() + + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8") + math(EXPR installedBits "8 * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/ktx/build/Makefile b/ktx/build/Makefile new file mode 100644 index 0000000..465f763 --- /dev/null +++ b/ktx/build/Makefile @@ -0,0 +1,2535 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build//CMakeFiles/progress.marks + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named Experimental + +# Build rule for target. +Experimental: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 Experimental +.PHONY : Experimental + +# fast build rule for target. +Experimental/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Experimental.dir/build.make CMakeFiles/Experimental.dir/build +.PHONY : Experimental/fast + +#============================================================================= +# Target rules for targets named Nightly + +# Build rule for target. +Nightly: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 Nightly +.PHONY : Nightly + +# fast build rule for target. +Nightly/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Nightly.dir/build.make CMakeFiles/Nightly.dir/build +.PHONY : Nightly/fast + +#============================================================================= +# Target rules for targets named Continuous + +# Build rule for target. +Continuous: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 Continuous +.PHONY : Continuous + +# fast build rule for target. +Continuous/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Continuous.dir/build.make CMakeFiles/Continuous.dir/build +.PHONY : Continuous/fast + +#============================================================================= +# Target rules for targets named NightlyMemoryCheck + +# Build rule for target. +NightlyMemoryCheck: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 NightlyMemoryCheck +.PHONY : NightlyMemoryCheck + +# fast build rule for target. +NightlyMemoryCheck/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyMemoryCheck.dir/build.make CMakeFiles/NightlyMemoryCheck.dir/build +.PHONY : NightlyMemoryCheck/fast + +#============================================================================= +# Target rules for targets named NightlyStart + +# Build rule for target. +NightlyStart: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 NightlyStart +.PHONY : NightlyStart + +# fast build rule for target. +NightlyStart/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyStart.dir/build.make CMakeFiles/NightlyStart.dir/build +.PHONY : NightlyStart/fast + +#============================================================================= +# Target rules for targets named NightlyUpdate + +# Build rule for target. +NightlyUpdate: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 NightlyUpdate +.PHONY : NightlyUpdate + +# fast build rule for target. +NightlyUpdate/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyUpdate.dir/build.make CMakeFiles/NightlyUpdate.dir/build +.PHONY : NightlyUpdate/fast + +#============================================================================= +# Target rules for targets named NightlyConfigure + +# Build rule for target. +NightlyConfigure: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 NightlyConfigure +.PHONY : NightlyConfigure + +# fast build rule for target. +NightlyConfigure/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyConfigure.dir/build.make CMakeFiles/NightlyConfigure.dir/build +.PHONY : NightlyConfigure/fast + +#============================================================================= +# Target rules for targets named NightlyBuild + +# Build rule for target. +NightlyBuild: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 NightlyBuild +.PHONY : NightlyBuild + +# fast build rule for target. +NightlyBuild/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyBuild.dir/build.make CMakeFiles/NightlyBuild.dir/build +.PHONY : NightlyBuild/fast + +#============================================================================= +# Target rules for targets named NightlyTest + +# Build rule for target. +NightlyTest: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 NightlyTest +.PHONY : NightlyTest + +# fast build rule for target. +NightlyTest/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyTest.dir/build.make CMakeFiles/NightlyTest.dir/build +.PHONY : NightlyTest/fast + +#============================================================================= +# Target rules for targets named NightlyCoverage + +# Build rule for target. +NightlyCoverage: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 NightlyCoverage +.PHONY : NightlyCoverage + +# fast build rule for target. +NightlyCoverage/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyCoverage.dir/build.make CMakeFiles/NightlyCoverage.dir/build +.PHONY : NightlyCoverage/fast + +#============================================================================= +# Target rules for targets named NightlyMemCheck + +# Build rule for target. +NightlyMemCheck: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 NightlyMemCheck +.PHONY : NightlyMemCheck + +# fast build rule for target. +NightlyMemCheck/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlyMemCheck.dir/build.make CMakeFiles/NightlyMemCheck.dir/build +.PHONY : NightlyMemCheck/fast + +#============================================================================= +# Target rules for targets named NightlySubmit + +# Build rule for target. +NightlySubmit: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 NightlySubmit +.PHONY : NightlySubmit + +# fast build rule for target. +NightlySubmit/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/NightlySubmit.dir/build.make CMakeFiles/NightlySubmit.dir/build +.PHONY : NightlySubmit/fast + +#============================================================================= +# Target rules for targets named ExperimentalStart + +# Build rule for target. +ExperimentalStart: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ExperimentalStart +.PHONY : ExperimentalStart + +# fast build rule for target. +ExperimentalStart/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalStart.dir/build.make CMakeFiles/ExperimentalStart.dir/build +.PHONY : ExperimentalStart/fast + +#============================================================================= +# Target rules for targets named ExperimentalUpdate + +# Build rule for target. +ExperimentalUpdate: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ExperimentalUpdate +.PHONY : ExperimentalUpdate + +# fast build rule for target. +ExperimentalUpdate/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalUpdate.dir/build.make CMakeFiles/ExperimentalUpdate.dir/build +.PHONY : ExperimentalUpdate/fast + +#============================================================================= +# Target rules for targets named ExperimentalConfigure + +# Build rule for target. +ExperimentalConfigure: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ExperimentalConfigure +.PHONY : ExperimentalConfigure + +# fast build rule for target. +ExperimentalConfigure/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalConfigure.dir/build.make CMakeFiles/ExperimentalConfigure.dir/build +.PHONY : ExperimentalConfigure/fast + +#============================================================================= +# Target rules for targets named ExperimentalBuild + +# Build rule for target. +ExperimentalBuild: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ExperimentalBuild +.PHONY : ExperimentalBuild + +# fast build rule for target. +ExperimentalBuild/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalBuild.dir/build.make CMakeFiles/ExperimentalBuild.dir/build +.PHONY : ExperimentalBuild/fast + +#============================================================================= +# Target rules for targets named ExperimentalTest + +# Build rule for target. +ExperimentalTest: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ExperimentalTest +.PHONY : ExperimentalTest + +# fast build rule for target. +ExperimentalTest/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalTest.dir/build.make CMakeFiles/ExperimentalTest.dir/build +.PHONY : ExperimentalTest/fast + +#============================================================================= +# Target rules for targets named ExperimentalCoverage + +# Build rule for target. +ExperimentalCoverage: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ExperimentalCoverage +.PHONY : ExperimentalCoverage + +# fast build rule for target. +ExperimentalCoverage/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalCoverage.dir/build.make CMakeFiles/ExperimentalCoverage.dir/build +.PHONY : ExperimentalCoverage/fast + +#============================================================================= +# Target rules for targets named ExperimentalMemCheck + +# Build rule for target. +ExperimentalMemCheck: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ExperimentalMemCheck +.PHONY : ExperimentalMemCheck + +# fast build rule for target. +ExperimentalMemCheck/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalMemCheck.dir/build.make CMakeFiles/ExperimentalMemCheck.dir/build +.PHONY : ExperimentalMemCheck/fast + +#============================================================================= +# Target rules for targets named ExperimentalSubmit + +# Build rule for target. +ExperimentalSubmit: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ExperimentalSubmit +.PHONY : ExperimentalSubmit + +# fast build rule for target. +ExperimentalSubmit/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ExperimentalSubmit.dir/build.make CMakeFiles/ExperimentalSubmit.dir/build +.PHONY : ExperimentalSubmit/fast + +#============================================================================= +# Target rules for targets named ContinuousStart + +# Build rule for target. +ContinuousStart: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ContinuousStart +.PHONY : ContinuousStart + +# fast build rule for target. +ContinuousStart/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousStart.dir/build.make CMakeFiles/ContinuousStart.dir/build +.PHONY : ContinuousStart/fast + +#============================================================================= +# Target rules for targets named ContinuousUpdate + +# Build rule for target. +ContinuousUpdate: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ContinuousUpdate +.PHONY : ContinuousUpdate + +# fast build rule for target. +ContinuousUpdate/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousUpdate.dir/build.make CMakeFiles/ContinuousUpdate.dir/build +.PHONY : ContinuousUpdate/fast + +#============================================================================= +# Target rules for targets named ContinuousConfigure + +# Build rule for target. +ContinuousConfigure: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ContinuousConfigure +.PHONY : ContinuousConfigure + +# fast build rule for target. +ContinuousConfigure/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousConfigure.dir/build.make CMakeFiles/ContinuousConfigure.dir/build +.PHONY : ContinuousConfigure/fast + +#============================================================================= +# Target rules for targets named ContinuousBuild + +# Build rule for target. +ContinuousBuild: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ContinuousBuild +.PHONY : ContinuousBuild + +# fast build rule for target. +ContinuousBuild/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousBuild.dir/build.make CMakeFiles/ContinuousBuild.dir/build +.PHONY : ContinuousBuild/fast + +#============================================================================= +# Target rules for targets named ContinuousTest + +# Build rule for target. +ContinuousTest: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ContinuousTest +.PHONY : ContinuousTest + +# fast build rule for target. +ContinuousTest/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousTest.dir/build.make CMakeFiles/ContinuousTest.dir/build +.PHONY : ContinuousTest/fast + +#============================================================================= +# Target rules for targets named ContinuousCoverage + +# Build rule for target. +ContinuousCoverage: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ContinuousCoverage +.PHONY : ContinuousCoverage + +# fast build rule for target. +ContinuousCoverage/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousCoverage.dir/build.make CMakeFiles/ContinuousCoverage.dir/build +.PHONY : ContinuousCoverage/fast + +#============================================================================= +# Target rules for targets named ContinuousMemCheck + +# Build rule for target. +ContinuousMemCheck: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ContinuousMemCheck +.PHONY : ContinuousMemCheck + +# fast build rule for target. +ContinuousMemCheck/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousMemCheck.dir/build.make CMakeFiles/ContinuousMemCheck.dir/build +.PHONY : ContinuousMemCheck/fast + +#============================================================================= +# Target rules for targets named ContinuousSubmit + +# Build rule for target. +ContinuousSubmit: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ContinuousSubmit +.PHONY : ContinuousSubmit + +# fast build rule for target. +ContinuousSubmit/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ContinuousSubmit.dir/build.make CMakeFiles/ContinuousSubmit.dir/build +.PHONY : ContinuousSubmit/fast + +#============================================================================= +# Target rules for targets named ktx + +# Build rule for target. +ktx: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktx +.PHONY : ktx + +# fast build rule for target. +ktx/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/build +.PHONY : ktx/fast + +#============================================================================= +# Target rules for targets named ktx_read + +# Build rule for target. +ktx_read: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktx_read +.PHONY : ktx_read + +# fast build rule for target. +ktx_read/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/build +.PHONY : ktx_read/fast + +#============================================================================= +# Target rules for targets named ktx_version + +# Build rule for target. +ktx_version: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktx_version +.PHONY : ktx_version + +# fast build rule for target. +ktx_version/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_version.dir/build.make CMakeFiles/ktx_version.dir/build +.PHONY : ktx_version/fast + +#============================================================================= +# Target rules for targets named objUtil + +# Build rule for target. +objUtil: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 objUtil +.PHONY : objUtil + +# fast build rule for target. +objUtil/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/objUtil.dir/build.make CMakeFiles/objUtil.dir/build +.PHONY : objUtil/fast + +#============================================================================= +# Target rules for targets named libktx.doc + +# Build rule for target. +libktx.doc: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 libktx.doc +.PHONY : libktx.doc + +# fast build rule for target. +libktx.doc/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/libktx.doc.dir/build.make CMakeFiles/libktx.doc.dir/build +.PHONY : libktx.doc/fast + +#============================================================================= +# Target rules for targets named tools.doc + +# Build rule for target. +tools.doc: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools.doc +.PHONY : tools.doc + +# fast build rule for target. +tools.doc/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/tools.doc.dir/build.make CMakeFiles/tools.doc.dir/build +.PHONY : tools.doc/fast + +#============================================================================= +# Target rules for targets named jswrappers.doc + +# Build rule for target. +jswrappers.doc: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 jswrappers.doc +.PHONY : jswrappers.doc + +# fast build rule for target. +jswrappers.doc/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/jswrappers.doc.dir/build.make CMakeFiles/jswrappers.doc.dir/build +.PHONY : jswrappers.doc/fast + +#============================================================================= +# Target rules for targets named ktxpkg.doc + +# Build rule for target. +ktxpkg.doc: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktxpkg.doc +.PHONY : ktxpkg.doc + +# fast build rule for target. +ktxpkg.doc/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktxpkg.doc.dir/build.make CMakeFiles/ktxpkg.doc.dir/build +.PHONY : ktxpkg.doc/fast + +#============================================================================= +# Target rules for targets named all.doc + +# Build rule for target. +all.doc: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all.doc +.PHONY : all.doc + +# fast build rule for target. +all.doc/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/all.doc.dir/build.make CMakeFiles/all.doc.dir/build +.PHONY : all.doc/fast + +#============================================================================= +# Target rules for targets named obj_basisu_cbind + +# Build rule for target. +obj_basisu_cbind: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 obj_basisu_cbind +.PHONY : obj_basisu_cbind + +# fast build rule for target. +obj_basisu_cbind/fast: + $(MAKE) $(MAKESILENT) -f interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build +.PHONY : obj_basisu_cbind/fast + +#============================================================================= +# Target rules for targets named astcenc-avx2-static + +# Build rule for target. +astcenc-avx2-static: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 astcenc-avx2-static +.PHONY : astcenc-avx2-static + +# fast build rule for target. +astcenc-avx2-static/fast: + $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build +.PHONY : astcenc-avx2-static/fast + +#============================================================================= +# Target rules for targets named fmt + +# Build rule for target. +fmt: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 fmt +.PHONY : fmt + +# fast build rule for target. +fmt/fast: + $(MAKE) $(MAKESILENT) -f external/fmt/CMakeFiles/fmt.dir/build.make external/fmt/CMakeFiles/fmt.dir/build +.PHONY : fmt/fast + +#============================================================================= +# Target rules for targets named imageio + +# Build rule for target. +imageio: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 imageio +.PHONY : imageio + +# fast build rule for target. +imageio/fast: + $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/build +.PHONY : imageio/fast + +#============================================================================= +# Target rules for targets named ktxtools + +# Build rule for target. +ktxtools: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktxtools +.PHONY : ktxtools + +# fast build rule for target. +ktxtools/fast: + $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/build +.PHONY : ktxtools/fast + +#============================================================================= +# Target rules for targets named ktxtools_version + +# Build rule for target. +ktxtools_version: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktxtools_version +.PHONY : ktxtools_version + +# fast build rule for target. +ktxtools_version/fast: + $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools_version.dir/build.make tools/ktx/CMakeFiles/ktxtools_version.dir/build +.PHONY : ktxtools_version/fast + +#============================================================================= +# Target rules for targets named ktx2check + +# Build rule for target. +ktx2check: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktx2check +.PHONY : ktx2check + +# fast build rule for target. +ktx2check/fast: + $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check.dir/build.make tools/ktx2check/CMakeFiles/ktx2check.dir/build +.PHONY : ktx2check/fast + +#============================================================================= +# Target rules for targets named ktx2check_version + +# Build rule for target. +ktx2check_version: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktx2check_version +.PHONY : ktx2check_version + +# fast build rule for target. +ktx2check_version/fast: + $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check_version.dir/build.make tools/ktx2check/CMakeFiles/ktx2check_version.dir/build +.PHONY : ktx2check_version/fast + +#============================================================================= +# Target rules for targets named ktx2ktx2 + +# Build rule for target. +ktx2ktx2: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktx2ktx2 +.PHONY : ktx2ktx2 + +# fast build rule for target. +ktx2ktx2/fast: + $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build +.PHONY : ktx2ktx2/fast + +#============================================================================= +# Target rules for targets named ktx2ktx2_version + +# Build rule for target. +ktx2ktx2_version: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktx2ktx2_version +.PHONY : ktx2ktx2_version + +# fast build rule for target. +ktx2ktx2_version/fast: + $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build +.PHONY : ktx2ktx2_version/fast + +#============================================================================= +# Target rules for targets named ktxinfo + +# Build rule for target. +ktxinfo: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktxinfo +.PHONY : ktxinfo + +# fast build rule for target. +ktxinfo/fast: + $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo.dir/build +.PHONY : ktxinfo/fast + +#============================================================================= +# Target rules for targets named ktxinfo_version + +# Build rule for target. +ktxinfo_version: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktxinfo_version +.PHONY : ktxinfo_version + +# fast build rule for target. +ktxinfo_version/fast: + $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build +.PHONY : ktxinfo_version/fast + +#============================================================================= +# Target rules for targets named ktxsc + +# Build rule for target. +ktxsc: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktxsc +.PHONY : ktxsc + +# fast build rule for target. +ktxsc/fast: + $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc.dir/build.make tools/ktxsc/CMakeFiles/ktxsc.dir/build +.PHONY : ktxsc/fast + +#============================================================================= +# Target rules for targets named ktxsc_version + +# Build rule for target. +ktxsc_version: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktxsc_version +.PHONY : ktxsc_version + +# fast build rule for target. +ktxsc_version/fast: + $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc_version.dir/build.make tools/ktxsc/CMakeFiles/ktxsc_version.dir/build +.PHONY : ktxsc_version/fast + +#============================================================================= +# Target rules for targets named toktx + +# Build rule for target. +toktx: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 toktx +.PHONY : toktx + +# fast build rule for target. +toktx/fast: + $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx.dir/build.make tools/toktx/CMakeFiles/toktx.dir/build +.PHONY : toktx/fast + +#============================================================================= +# Target rules for targets named toktx_version + +# Build rule for target. +toktx_version: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 toktx_version +.PHONY : toktx_version + +# fast build rule for target. +toktx_version/fast: + $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx_version.dir/build.make tools/toktx/CMakeFiles/toktx_version.dir/build +.PHONY : toktx_version/fast + +#============================================================================= +# Target rules for targets named unittests + +# Build rule for target. +unittests: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 unittests +.PHONY : unittests + +# fast build rule for target. +unittests/fast: + $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/build +.PHONY : unittests/fast + +#============================================================================= +# Target rules for targets named texturetests + +# Build rule for target. +texturetests: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 texturetests +.PHONY : texturetests + +# fast build rule for target. +texturetests/fast: + $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/texturetests.dir/build.make tests/CMakeFiles/texturetests.dir/build +.PHONY : texturetests/fast + +#============================================================================= +# Target rules for targets named appfwSDL + +# Build rule for target. +appfwSDL: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 appfwSDL +.PHONY : appfwSDL + +# fast build rule for target. +appfwSDL/fast: + $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/build +.PHONY : appfwSDL/fast + +#============================================================================= +# Target rules for targets named ktxdiff + +# Build rule for target. +ktxdiff: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ktxdiff +.PHONY : ktxdiff + +# fast build rule for target. +ktxdiff/fast: + $(MAKE) $(MAKESILENT) -f tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make tests/ktxdiff/CMakeFiles/ktxdiff.dir/build +.PHONY : ktxdiff/fast + +#============================================================================= +# Target rules for targets named gtest + +# Build rule for target. +gtest: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 gtest +.PHONY : gtest + +# fast build rule for target. +gtest/fast: + $(MAKE) $(MAKESILENT) -f tests/gtest/CMakeFiles/gtest.dir/build.make tests/gtest/CMakeFiles/gtest.dir/build +.PHONY : gtest/fast + +#============================================================================= +# Target rules for targets named transcodetests + +# Build rule for target. +transcodetests: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 transcodetests +.PHONY : transcodetests + +# fast build rule for target. +transcodetests/fast: + $(MAKE) $(MAKESILENT) -f tests/transcodetests/CMakeFiles/transcodetests.dir/build.make tests/transcodetests/CMakeFiles/transcodetests.dir/build +.PHONY : transcodetests/fast + +#============================================================================= +# Target rules for targets named streamtests + +# Build rule for target. +streamtests: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 streamtests +.PHONY : streamtests + +# fast build rule for target. +streamtests/fast: + $(MAKE) $(MAKESILENT) -f tests/streamtests/CMakeFiles/streamtests.dir/build.make tests/streamtests/CMakeFiles/streamtests.dir/build +.PHONY : streamtests/fast + +external/basisu/encoder/basisu_backend.o: external/basisu/encoder/basisu_backend.cpp.o +.PHONY : external/basisu/encoder/basisu_backend.o + +# target to build an object file +external/basisu/encoder/basisu_backend.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.o +.PHONY : external/basisu/encoder/basisu_backend.cpp.o + +external/basisu/encoder/basisu_backend.i: external/basisu/encoder/basisu_backend.cpp.i +.PHONY : external/basisu/encoder/basisu_backend.i + +# target to preprocess a source file +external/basisu/encoder/basisu_backend.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.i +.PHONY : external/basisu/encoder/basisu_backend.cpp.i + +external/basisu/encoder/basisu_backend.s: external/basisu/encoder/basisu_backend.cpp.s +.PHONY : external/basisu/encoder/basisu_backend.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_backend.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_backend.cpp.s +.PHONY : external/basisu/encoder/basisu_backend.cpp.s + +external/basisu/encoder/basisu_basis_file.o: external/basisu/encoder/basisu_basis_file.cpp.o +.PHONY : external/basisu/encoder/basisu_basis_file.o + +# target to build an object file +external/basisu/encoder/basisu_basis_file.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.o +.PHONY : external/basisu/encoder/basisu_basis_file.cpp.o + +external/basisu/encoder/basisu_basis_file.i: external/basisu/encoder/basisu_basis_file.cpp.i +.PHONY : external/basisu/encoder/basisu_basis_file.i + +# target to preprocess a source file +external/basisu/encoder/basisu_basis_file.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.i +.PHONY : external/basisu/encoder/basisu_basis_file.cpp.i + +external/basisu/encoder/basisu_basis_file.s: external/basisu/encoder/basisu_basis_file.cpp.s +.PHONY : external/basisu/encoder/basisu_basis_file.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_basis_file.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_basis_file.cpp.s +.PHONY : external/basisu/encoder/basisu_basis_file.cpp.s + +external/basisu/encoder/basisu_bc7enc.o: external/basisu/encoder/basisu_bc7enc.cpp.o +.PHONY : external/basisu/encoder/basisu_bc7enc.o + +# target to build an object file +external/basisu/encoder/basisu_bc7enc.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.o +.PHONY : external/basisu/encoder/basisu_bc7enc.cpp.o + +external/basisu/encoder/basisu_bc7enc.i: external/basisu/encoder/basisu_bc7enc.cpp.i +.PHONY : external/basisu/encoder/basisu_bc7enc.i + +# target to preprocess a source file +external/basisu/encoder/basisu_bc7enc.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.i +.PHONY : external/basisu/encoder/basisu_bc7enc.cpp.i + +external/basisu/encoder/basisu_bc7enc.s: external/basisu/encoder/basisu_bc7enc.cpp.s +.PHONY : external/basisu/encoder/basisu_bc7enc.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_bc7enc.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_bc7enc.cpp.s +.PHONY : external/basisu/encoder/basisu_bc7enc.cpp.s + +external/basisu/encoder/basisu_comp.o: external/basisu/encoder/basisu_comp.cpp.o +.PHONY : external/basisu/encoder/basisu_comp.o + +# target to build an object file +external/basisu/encoder/basisu_comp.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.o +.PHONY : external/basisu/encoder/basisu_comp.cpp.o + +external/basisu/encoder/basisu_comp.i: external/basisu/encoder/basisu_comp.cpp.i +.PHONY : external/basisu/encoder/basisu_comp.i + +# target to preprocess a source file +external/basisu/encoder/basisu_comp.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.i +.PHONY : external/basisu/encoder/basisu_comp.cpp.i + +external/basisu/encoder/basisu_comp.s: external/basisu/encoder/basisu_comp.cpp.s +.PHONY : external/basisu/encoder/basisu_comp.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_comp.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_comp.cpp.s +.PHONY : external/basisu/encoder/basisu_comp.cpp.s + +external/basisu/encoder/basisu_enc.o: external/basisu/encoder/basisu_enc.cpp.o +.PHONY : external/basisu/encoder/basisu_enc.o + +# target to build an object file +external/basisu/encoder/basisu_enc.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.o +.PHONY : external/basisu/encoder/basisu_enc.cpp.o + +external/basisu/encoder/basisu_enc.i: external/basisu/encoder/basisu_enc.cpp.i +.PHONY : external/basisu/encoder/basisu_enc.i + +# target to preprocess a source file +external/basisu/encoder/basisu_enc.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.i +.PHONY : external/basisu/encoder/basisu_enc.cpp.i + +external/basisu/encoder/basisu_enc.s: external/basisu/encoder/basisu_enc.cpp.s +.PHONY : external/basisu/encoder/basisu_enc.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_enc.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_enc.cpp.s +.PHONY : external/basisu/encoder/basisu_enc.cpp.s + +external/basisu/encoder/basisu_etc.o: external/basisu/encoder/basisu_etc.cpp.o +.PHONY : external/basisu/encoder/basisu_etc.o + +# target to build an object file +external/basisu/encoder/basisu_etc.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.o +.PHONY : external/basisu/encoder/basisu_etc.cpp.o + +external/basisu/encoder/basisu_etc.i: external/basisu/encoder/basisu_etc.cpp.i +.PHONY : external/basisu/encoder/basisu_etc.i + +# target to preprocess a source file +external/basisu/encoder/basisu_etc.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.i +.PHONY : external/basisu/encoder/basisu_etc.cpp.i + +external/basisu/encoder/basisu_etc.s: external/basisu/encoder/basisu_etc.cpp.s +.PHONY : external/basisu/encoder/basisu_etc.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_etc.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_etc.cpp.s +.PHONY : external/basisu/encoder/basisu_etc.cpp.s + +external/basisu/encoder/basisu_frontend.o: external/basisu/encoder/basisu_frontend.cpp.o +.PHONY : external/basisu/encoder/basisu_frontend.o + +# target to build an object file +external/basisu/encoder/basisu_frontend.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.o +.PHONY : external/basisu/encoder/basisu_frontend.cpp.o + +external/basisu/encoder/basisu_frontend.i: external/basisu/encoder/basisu_frontend.cpp.i +.PHONY : external/basisu/encoder/basisu_frontend.i + +# target to preprocess a source file +external/basisu/encoder/basisu_frontend.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.i +.PHONY : external/basisu/encoder/basisu_frontend.cpp.i + +external/basisu/encoder/basisu_frontend.s: external/basisu/encoder/basisu_frontend.cpp.s +.PHONY : external/basisu/encoder/basisu_frontend.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_frontend.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_frontend.cpp.s +.PHONY : external/basisu/encoder/basisu_frontend.cpp.s + +external/basisu/encoder/basisu_gpu_texture.o: external/basisu/encoder/basisu_gpu_texture.cpp.o +.PHONY : external/basisu/encoder/basisu_gpu_texture.o + +# target to build an object file +external/basisu/encoder/basisu_gpu_texture.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.o +.PHONY : external/basisu/encoder/basisu_gpu_texture.cpp.o + +external/basisu/encoder/basisu_gpu_texture.i: external/basisu/encoder/basisu_gpu_texture.cpp.i +.PHONY : external/basisu/encoder/basisu_gpu_texture.i + +# target to preprocess a source file +external/basisu/encoder/basisu_gpu_texture.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.i +.PHONY : external/basisu/encoder/basisu_gpu_texture.cpp.i + +external/basisu/encoder/basisu_gpu_texture.s: external/basisu/encoder/basisu_gpu_texture.cpp.s +.PHONY : external/basisu/encoder/basisu_gpu_texture.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_gpu_texture.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_gpu_texture.cpp.s +.PHONY : external/basisu/encoder/basisu_gpu_texture.cpp.s + +external/basisu/encoder/basisu_kernels_sse.o: external/basisu/encoder/basisu_kernels_sse.cpp.o +.PHONY : external/basisu/encoder/basisu_kernels_sse.o + +# target to build an object file +external/basisu/encoder/basisu_kernels_sse.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.o +.PHONY : external/basisu/encoder/basisu_kernels_sse.cpp.o + +external/basisu/encoder/basisu_kernels_sse.i: external/basisu/encoder/basisu_kernels_sse.cpp.i +.PHONY : external/basisu/encoder/basisu_kernels_sse.i + +# target to preprocess a source file +external/basisu/encoder/basisu_kernels_sse.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.i +.PHONY : external/basisu/encoder/basisu_kernels_sse.cpp.i + +external/basisu/encoder/basisu_kernels_sse.s: external/basisu/encoder/basisu_kernels_sse.cpp.s +.PHONY : external/basisu/encoder/basisu_kernels_sse.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_kernels_sse.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_kernels_sse.cpp.s +.PHONY : external/basisu/encoder/basisu_kernels_sse.cpp.s + +external/basisu/encoder/basisu_opencl.o: external/basisu/encoder/basisu_opencl.cpp.o +.PHONY : external/basisu/encoder/basisu_opencl.o + +# target to build an object file +external/basisu/encoder/basisu_opencl.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.o +.PHONY : external/basisu/encoder/basisu_opencl.cpp.o + +external/basisu/encoder/basisu_opencl.i: external/basisu/encoder/basisu_opencl.cpp.i +.PHONY : external/basisu/encoder/basisu_opencl.i + +# target to preprocess a source file +external/basisu/encoder/basisu_opencl.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.i +.PHONY : external/basisu/encoder/basisu_opencl.cpp.i + +external/basisu/encoder/basisu_opencl.s: external/basisu/encoder/basisu_opencl.cpp.s +.PHONY : external/basisu/encoder/basisu_opencl.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_opencl.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_opencl.cpp.s +.PHONY : external/basisu/encoder/basisu_opencl.cpp.s + +external/basisu/encoder/basisu_pvrtc1_4.o: external/basisu/encoder/basisu_pvrtc1_4.cpp.o +.PHONY : external/basisu/encoder/basisu_pvrtc1_4.o + +# target to build an object file +external/basisu/encoder/basisu_pvrtc1_4.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.o +.PHONY : external/basisu/encoder/basisu_pvrtc1_4.cpp.o + +external/basisu/encoder/basisu_pvrtc1_4.i: external/basisu/encoder/basisu_pvrtc1_4.cpp.i +.PHONY : external/basisu/encoder/basisu_pvrtc1_4.i + +# target to preprocess a source file +external/basisu/encoder/basisu_pvrtc1_4.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.i +.PHONY : external/basisu/encoder/basisu_pvrtc1_4.cpp.i + +external/basisu/encoder/basisu_pvrtc1_4.s: external/basisu/encoder/basisu_pvrtc1_4.cpp.s +.PHONY : external/basisu/encoder/basisu_pvrtc1_4.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_pvrtc1_4.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_pvrtc1_4.cpp.s +.PHONY : external/basisu/encoder/basisu_pvrtc1_4.cpp.s + +external/basisu/encoder/basisu_resample_filters.o: external/basisu/encoder/basisu_resample_filters.cpp.o +.PHONY : external/basisu/encoder/basisu_resample_filters.o + +# target to build an object file +external/basisu/encoder/basisu_resample_filters.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.o +.PHONY : external/basisu/encoder/basisu_resample_filters.cpp.o + +external/basisu/encoder/basisu_resample_filters.i: external/basisu/encoder/basisu_resample_filters.cpp.i +.PHONY : external/basisu/encoder/basisu_resample_filters.i + +# target to preprocess a source file +external/basisu/encoder/basisu_resample_filters.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.i +.PHONY : external/basisu/encoder/basisu_resample_filters.cpp.i + +external/basisu/encoder/basisu_resample_filters.s: external/basisu/encoder/basisu_resample_filters.cpp.s +.PHONY : external/basisu/encoder/basisu_resample_filters.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_resample_filters.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resample_filters.cpp.s +.PHONY : external/basisu/encoder/basisu_resample_filters.cpp.s + +external/basisu/encoder/basisu_resampler.o: external/basisu/encoder/basisu_resampler.cpp.o +.PHONY : external/basisu/encoder/basisu_resampler.o + +# target to build an object file +external/basisu/encoder/basisu_resampler.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.o +.PHONY : external/basisu/encoder/basisu_resampler.cpp.o + +external/basisu/encoder/basisu_resampler.i: external/basisu/encoder/basisu_resampler.cpp.i +.PHONY : external/basisu/encoder/basisu_resampler.i + +# target to preprocess a source file +external/basisu/encoder/basisu_resampler.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.i +.PHONY : external/basisu/encoder/basisu_resampler.cpp.i + +external/basisu/encoder/basisu_resampler.s: external/basisu/encoder/basisu_resampler.cpp.s +.PHONY : external/basisu/encoder/basisu_resampler.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_resampler.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_resampler.cpp.s +.PHONY : external/basisu/encoder/basisu_resampler.cpp.s + +external/basisu/encoder/basisu_ssim.o: external/basisu/encoder/basisu_ssim.cpp.o +.PHONY : external/basisu/encoder/basisu_ssim.o + +# target to build an object file +external/basisu/encoder/basisu_ssim.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.o +.PHONY : external/basisu/encoder/basisu_ssim.cpp.o + +external/basisu/encoder/basisu_ssim.i: external/basisu/encoder/basisu_ssim.cpp.i +.PHONY : external/basisu/encoder/basisu_ssim.i + +# target to preprocess a source file +external/basisu/encoder/basisu_ssim.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.i +.PHONY : external/basisu/encoder/basisu_ssim.cpp.i + +external/basisu/encoder/basisu_ssim.s: external/basisu/encoder/basisu_ssim.cpp.s +.PHONY : external/basisu/encoder/basisu_ssim.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_ssim.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_ssim.cpp.s +.PHONY : external/basisu/encoder/basisu_ssim.cpp.s + +external/basisu/encoder/basisu_uastc_enc.o: external/basisu/encoder/basisu_uastc_enc.cpp.o +.PHONY : external/basisu/encoder/basisu_uastc_enc.o + +# target to build an object file +external/basisu/encoder/basisu_uastc_enc.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.o +.PHONY : external/basisu/encoder/basisu_uastc_enc.cpp.o + +external/basisu/encoder/basisu_uastc_enc.i: external/basisu/encoder/basisu_uastc_enc.cpp.i +.PHONY : external/basisu/encoder/basisu_uastc_enc.i + +# target to preprocess a source file +external/basisu/encoder/basisu_uastc_enc.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.i +.PHONY : external/basisu/encoder/basisu_uastc_enc.cpp.i + +external/basisu/encoder/basisu_uastc_enc.s: external/basisu/encoder/basisu_uastc_enc.cpp.s +.PHONY : external/basisu/encoder/basisu_uastc_enc.s + +# target to generate assembly for a file +external/basisu/encoder/basisu_uastc_enc.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/encoder/basisu_uastc_enc.cpp.s +.PHONY : external/basisu/encoder/basisu_uastc_enc.cpp.s + +external/basisu/transcoder/basisu_transcoder.o: external/basisu/transcoder/basisu_transcoder.cpp.o +.PHONY : external/basisu/transcoder/basisu_transcoder.o + +# target to build an object file +external/basisu/transcoder/basisu_transcoder.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.o +.PHONY : external/basisu/transcoder/basisu_transcoder.cpp.o + +external/basisu/transcoder/basisu_transcoder.i: external/basisu/transcoder/basisu_transcoder.cpp.i +.PHONY : external/basisu/transcoder/basisu_transcoder.i + +# target to preprocess a source file +external/basisu/transcoder/basisu_transcoder.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.i +.PHONY : external/basisu/transcoder/basisu_transcoder.cpp.i + +external/basisu/transcoder/basisu_transcoder.s: external/basisu/transcoder/basisu_transcoder.cpp.s +.PHONY : external/basisu/transcoder/basisu_transcoder.s + +# target to generate assembly for a file +external/basisu/transcoder/basisu_transcoder.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/transcoder/basisu_transcoder.cpp.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/basisu/transcoder/basisu_transcoder.cpp.s +.PHONY : external/basisu/transcoder/basisu_transcoder.cpp.s + +external/basisu/zstd/zstd.o: external/basisu/zstd/zstd.c.o +.PHONY : external/basisu/zstd/zstd.o + +# target to build an object file +external/basisu/zstd/zstd.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.o +.PHONY : external/basisu/zstd/zstd.c.o + +external/basisu/zstd/zstd.i: external/basisu/zstd/zstd.c.i +.PHONY : external/basisu/zstd/zstd.i + +# target to preprocess a source file +external/basisu/zstd/zstd.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.i +.PHONY : external/basisu/zstd/zstd.c.i + +external/basisu/zstd/zstd.s: external/basisu/zstd/zstd.c.s +.PHONY : external/basisu/zstd/zstd.s + +# target to generate assembly for a file +external/basisu/zstd/zstd.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/basisu/zstd/zstd.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/basisu/zstd/zstd.c.s +.PHONY : external/basisu/zstd/zstd.c.s + +external/dfdutils/colourspaces.o: external/dfdutils/colourspaces.c.o +.PHONY : external/dfdutils/colourspaces.o + +# target to build an object file +external/dfdutils/colourspaces.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.o +.PHONY : external/dfdutils/colourspaces.c.o + +external/dfdutils/colourspaces.i: external/dfdutils/colourspaces.c.i +.PHONY : external/dfdutils/colourspaces.i + +# target to preprocess a source file +external/dfdutils/colourspaces.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.i +.PHONY : external/dfdutils/colourspaces.c.i + +external/dfdutils/colourspaces.s: external/dfdutils/colourspaces.c.s +.PHONY : external/dfdutils/colourspaces.s + +# target to generate assembly for a file +external/dfdutils/colourspaces.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/colourspaces.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/colourspaces.c.s +.PHONY : external/dfdutils/colourspaces.c.s + +external/dfdutils/createdfd.o: external/dfdutils/createdfd.c.o +.PHONY : external/dfdutils/createdfd.o + +# target to build an object file +external/dfdutils/createdfd.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.o +.PHONY : external/dfdutils/createdfd.c.o + +external/dfdutils/createdfd.i: external/dfdutils/createdfd.c.i +.PHONY : external/dfdutils/createdfd.i + +# target to preprocess a source file +external/dfdutils/createdfd.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.i +.PHONY : external/dfdutils/createdfd.c.i + +external/dfdutils/createdfd.s: external/dfdutils/createdfd.c.s +.PHONY : external/dfdutils/createdfd.s + +# target to generate assembly for a file +external/dfdutils/createdfd.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/createdfd.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/createdfd.c.s +.PHONY : external/dfdutils/createdfd.c.s + +external/dfdutils/interpretdfd.o: external/dfdutils/interpretdfd.c.o +.PHONY : external/dfdutils/interpretdfd.o + +# target to build an object file +external/dfdutils/interpretdfd.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.o +.PHONY : external/dfdutils/interpretdfd.c.o + +external/dfdutils/interpretdfd.i: external/dfdutils/interpretdfd.c.i +.PHONY : external/dfdutils/interpretdfd.i + +# target to preprocess a source file +external/dfdutils/interpretdfd.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.i +.PHONY : external/dfdutils/interpretdfd.c.i + +external/dfdutils/interpretdfd.s: external/dfdutils/interpretdfd.c.s +.PHONY : external/dfdutils/interpretdfd.s + +# target to generate assembly for a file +external/dfdutils/interpretdfd.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/interpretdfd.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/interpretdfd.c.s +.PHONY : external/dfdutils/interpretdfd.c.s + +external/dfdutils/printdfd.o: external/dfdutils/printdfd.c.o +.PHONY : external/dfdutils/printdfd.o + +# target to build an object file +external/dfdutils/printdfd.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.o +.PHONY : external/dfdutils/printdfd.c.o + +external/dfdutils/printdfd.i: external/dfdutils/printdfd.c.i +.PHONY : external/dfdutils/printdfd.i + +# target to preprocess a source file +external/dfdutils/printdfd.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.i +.PHONY : external/dfdutils/printdfd.c.i + +external/dfdutils/printdfd.s: external/dfdutils/printdfd.c.s +.PHONY : external/dfdutils/printdfd.s + +# target to generate assembly for a file +external/dfdutils/printdfd.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/printdfd.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/printdfd.c.s +.PHONY : external/dfdutils/printdfd.c.s + +external/dfdutils/queries.o: external/dfdutils/queries.c.o +.PHONY : external/dfdutils/queries.o + +# target to build an object file +external/dfdutils/queries.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/queries.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.o +.PHONY : external/dfdutils/queries.c.o + +external/dfdutils/queries.i: external/dfdutils/queries.c.i +.PHONY : external/dfdutils/queries.i + +# target to preprocess a source file +external/dfdutils/queries.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/queries.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.i +.PHONY : external/dfdutils/queries.c.i + +external/dfdutils/queries.s: external/dfdutils/queries.c.s +.PHONY : external/dfdutils/queries.s + +# target to generate assembly for a file +external/dfdutils/queries.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/queries.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/queries.c.s +.PHONY : external/dfdutils/queries.c.s + +external/dfdutils/vk2dfd.o: external/dfdutils/vk2dfd.c.o +.PHONY : external/dfdutils/vk2dfd.o + +# target to build an object file +external/dfdutils/vk2dfd.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.o +.PHONY : external/dfdutils/vk2dfd.c.o + +external/dfdutils/vk2dfd.i: external/dfdutils/vk2dfd.c.i +.PHONY : external/dfdutils/vk2dfd.i + +# target to preprocess a source file +external/dfdutils/vk2dfd.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.i +.PHONY : external/dfdutils/vk2dfd.c.i + +external/dfdutils/vk2dfd.s: external/dfdutils/vk2dfd.c.s +.PHONY : external/dfdutils/vk2dfd.s + +# target to generate assembly for a file +external/dfdutils/vk2dfd.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/dfdutils/vk2dfd.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/dfdutils/vk2dfd.c.s +.PHONY : external/dfdutils/vk2dfd.c.s + +external/etcdec/etcdec.o: external/etcdec/etcdec.cxx.o +.PHONY : external/etcdec/etcdec.o + +# target to build an object file +external/etcdec/etcdec.cxx.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.o +.PHONY : external/etcdec/etcdec.cxx.o + +external/etcdec/etcdec.i: external/etcdec/etcdec.cxx.i +.PHONY : external/etcdec/etcdec.i + +# target to preprocess a source file +external/etcdec/etcdec.cxx.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.i +.PHONY : external/etcdec/etcdec.cxx.i + +external/etcdec/etcdec.s: external/etcdec/etcdec.cxx.s +.PHONY : external/etcdec/etcdec.s + +# target to generate assembly for a file +external/etcdec/etcdec.cxx.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/external/etcdec/etcdec.cxx.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/external/etcdec/etcdec.cxx.s +.PHONY : external/etcdec/etcdec.cxx.s + +lib/astc_codec.o: lib/astc_codec.cpp.o +.PHONY : lib/astc_codec.o + +# target to build an object file +lib/astc_codec.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/astc_codec.cpp.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.o +.PHONY : lib/astc_codec.cpp.o + +lib/astc_codec.i: lib/astc_codec.cpp.i +.PHONY : lib/astc_codec.i + +# target to preprocess a source file +lib/astc_codec.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/astc_codec.cpp.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.i +.PHONY : lib/astc_codec.cpp.i + +lib/astc_codec.s: lib/astc_codec.cpp.s +.PHONY : lib/astc_codec.s + +# target to generate assembly for a file +lib/astc_codec.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/astc_codec.cpp.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/astc_codec.cpp.s +.PHONY : lib/astc_codec.cpp.s + +lib/basis_encode.o: lib/basis_encode.cpp.o +.PHONY : lib/basis_encode.o + +# target to build an object file +lib/basis_encode.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/basis_encode.cpp.o +.PHONY : lib/basis_encode.cpp.o + +lib/basis_encode.i: lib/basis_encode.cpp.i +.PHONY : lib/basis_encode.i + +# target to preprocess a source file +lib/basis_encode.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/basis_encode.cpp.i +.PHONY : lib/basis_encode.cpp.i + +lib/basis_encode.s: lib/basis_encode.cpp.s +.PHONY : lib/basis_encode.s + +# target to generate assembly for a file +lib/basis_encode.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/basis_encode.cpp.s +.PHONY : lib/basis_encode.cpp.s + +lib/basis_transcode.o: lib/basis_transcode.cpp.o +.PHONY : lib/basis_transcode.o + +# target to build an object file +lib/basis_transcode.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/basis_transcode.cpp.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.o +.PHONY : lib/basis_transcode.cpp.o + +lib/basis_transcode.i: lib/basis_transcode.cpp.i +.PHONY : lib/basis_transcode.i + +# target to preprocess a source file +lib/basis_transcode.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/basis_transcode.cpp.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.i +.PHONY : lib/basis_transcode.cpp.i + +lib/basis_transcode.s: lib/basis_transcode.cpp.s +.PHONY : lib/basis_transcode.s + +# target to generate assembly for a file +lib/basis_transcode.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/basis_transcode.cpp.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/basis_transcode.cpp.s +.PHONY : lib/basis_transcode.cpp.s + +lib/checkheader.o: lib/checkheader.c.o +.PHONY : lib/checkheader.o + +# target to build an object file +lib/checkheader.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/checkheader.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/checkheader.c.o +.PHONY : lib/checkheader.c.o + +lib/checkheader.i: lib/checkheader.c.i +.PHONY : lib/checkheader.i + +# target to preprocess a source file +lib/checkheader.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/checkheader.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/checkheader.c.i +.PHONY : lib/checkheader.c.i + +lib/checkheader.s: lib/checkheader.c.s +.PHONY : lib/checkheader.s + +# target to generate assembly for a file +lib/checkheader.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/checkheader.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/checkheader.c.s +.PHONY : lib/checkheader.c.s + +lib/etcunpack.o: lib/etcunpack.cxx.o +.PHONY : lib/etcunpack.o + +# target to build an object file +lib/etcunpack.cxx.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/etcunpack.cxx.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.o +.PHONY : lib/etcunpack.cxx.o + +lib/etcunpack.i: lib/etcunpack.cxx.i +.PHONY : lib/etcunpack.i + +# target to preprocess a source file +lib/etcunpack.cxx.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/etcunpack.cxx.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.i +.PHONY : lib/etcunpack.cxx.i + +lib/etcunpack.s: lib/etcunpack.cxx.s +.PHONY : lib/etcunpack.s + +# target to generate assembly for a file +lib/etcunpack.cxx.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/etcunpack.cxx.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/etcunpack.cxx.s +.PHONY : lib/etcunpack.cxx.s + +lib/filestream.o: lib/filestream.c.o +.PHONY : lib/filestream.o + +# target to build an object file +lib/filestream.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/filestream.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/filestream.c.o +.PHONY : lib/filestream.c.o + +lib/filestream.i: lib/filestream.c.i +.PHONY : lib/filestream.i + +# target to preprocess a source file +lib/filestream.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/filestream.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/filestream.c.i +.PHONY : lib/filestream.c.i + +lib/filestream.s: lib/filestream.c.s +.PHONY : lib/filestream.s + +# target to generate assembly for a file +lib/filestream.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/filestream.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/filestream.c.s +.PHONY : lib/filestream.c.s + +lib/gl_funcs.o: lib/gl_funcs.c.o +.PHONY : lib/gl_funcs.o + +# target to build an object file +lib/gl_funcs.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/gl_funcs.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/gl_funcs.c.o +.PHONY : lib/gl_funcs.c.o + +lib/gl_funcs.i: lib/gl_funcs.c.i +.PHONY : lib/gl_funcs.i + +# target to preprocess a source file +lib/gl_funcs.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/gl_funcs.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/gl_funcs.c.i +.PHONY : lib/gl_funcs.c.i + +lib/gl_funcs.s: lib/gl_funcs.c.s +.PHONY : lib/gl_funcs.s + +# target to generate assembly for a file +lib/gl_funcs.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/gl_funcs.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/gl_funcs.c.s +.PHONY : lib/gl_funcs.c.s + +lib/glformat_str.o: lib/glformat_str.c.o +.PHONY : lib/glformat_str.o + +# target to build an object file +lib/glformat_str.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/glformat_str.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/glformat_str.c.o +.PHONY : lib/glformat_str.c.o + +lib/glformat_str.i: lib/glformat_str.c.i +.PHONY : lib/glformat_str.i + +# target to preprocess a source file +lib/glformat_str.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/glformat_str.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/glformat_str.c.i +.PHONY : lib/glformat_str.c.i + +lib/glformat_str.s: lib/glformat_str.c.s +.PHONY : lib/glformat_str.s + +# target to generate assembly for a file +lib/glformat_str.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/glformat_str.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/glformat_str.c.s +.PHONY : lib/glformat_str.c.s + +lib/glloader.o: lib/glloader.c.o +.PHONY : lib/glloader.o + +# target to build an object file +lib/glloader.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/glloader.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/glloader.c.o +.PHONY : lib/glloader.c.o + +lib/glloader.i: lib/glloader.c.i +.PHONY : lib/glloader.i + +# target to preprocess a source file +lib/glloader.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/glloader.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/glloader.c.i +.PHONY : lib/glloader.c.i + +lib/glloader.s: lib/glloader.c.s +.PHONY : lib/glloader.s + +# target to generate assembly for a file +lib/glloader.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/glloader.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/glloader.c.s +.PHONY : lib/glloader.c.s + +lib/hashlist.o: lib/hashlist.c.o +.PHONY : lib/hashlist.o + +# target to build an object file +lib/hashlist.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/hashlist.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/hashlist.c.o +.PHONY : lib/hashlist.c.o + +lib/hashlist.i: lib/hashlist.c.i +.PHONY : lib/hashlist.i + +# target to preprocess a source file +lib/hashlist.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/hashlist.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/hashlist.c.i +.PHONY : lib/hashlist.c.i + +lib/hashlist.s: lib/hashlist.c.s +.PHONY : lib/hashlist.s + +# target to generate assembly for a file +lib/hashlist.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/hashlist.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/hashlist.c.s +.PHONY : lib/hashlist.c.s + +lib/info.o: lib/info.c.o +.PHONY : lib/info.o + +# target to build an object file +lib/info.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/info.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/info.c.o +.PHONY : lib/info.c.o + +lib/info.i: lib/info.c.i +.PHONY : lib/info.i + +# target to preprocess a source file +lib/info.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/info.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/info.c.i +.PHONY : lib/info.c.i + +lib/info.s: lib/info.c.s +.PHONY : lib/info.s + +# target to generate assembly for a file +lib/info.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/info.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/info.c.s +.PHONY : lib/info.c.s + +lib/memstream.o: lib/memstream.c.o +.PHONY : lib/memstream.o + +# target to build an object file +lib/memstream.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/memstream.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/memstream.c.o +.PHONY : lib/memstream.c.o + +lib/memstream.i: lib/memstream.c.i +.PHONY : lib/memstream.i + +# target to preprocess a source file +lib/memstream.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/memstream.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/memstream.c.i +.PHONY : lib/memstream.c.i + +lib/memstream.s: lib/memstream.c.s +.PHONY : lib/memstream.s + +# target to generate assembly for a file +lib/memstream.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/memstream.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/memstream.c.s +.PHONY : lib/memstream.c.s + +lib/miniz_wrapper.o: lib/miniz_wrapper.cpp.o +.PHONY : lib/miniz_wrapper.o + +# target to build an object file +lib/miniz_wrapper.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.o +.PHONY : lib/miniz_wrapper.cpp.o + +lib/miniz_wrapper.i: lib/miniz_wrapper.cpp.i +.PHONY : lib/miniz_wrapper.i + +# target to preprocess a source file +lib/miniz_wrapper.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.i +.PHONY : lib/miniz_wrapper.cpp.i + +lib/miniz_wrapper.s: lib/miniz_wrapper.cpp.s +.PHONY : lib/miniz_wrapper.s + +# target to generate assembly for a file +lib/miniz_wrapper.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/miniz_wrapper.cpp.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/miniz_wrapper.cpp.s +.PHONY : lib/miniz_wrapper.cpp.s + +lib/strings.o: lib/strings.c.o +.PHONY : lib/strings.o + +# target to build an object file +lib/strings.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/strings.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/strings.c.o +.PHONY : lib/strings.c.o + +lib/strings.i: lib/strings.c.i +.PHONY : lib/strings.i + +# target to preprocess a source file +lib/strings.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/strings.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/strings.c.i +.PHONY : lib/strings.c.i + +lib/strings.s: lib/strings.c.s +.PHONY : lib/strings.s + +# target to generate assembly for a file +lib/strings.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/strings.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/strings.c.s +.PHONY : lib/strings.c.s + +lib/swap.o: lib/swap.c.o +.PHONY : lib/swap.o + +# target to build an object file +lib/swap.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/swap.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/swap.c.o +.PHONY : lib/swap.c.o + +lib/swap.i: lib/swap.c.i +.PHONY : lib/swap.i + +# target to preprocess a source file +lib/swap.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/swap.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/swap.c.i +.PHONY : lib/swap.c.i + +lib/swap.s: lib/swap.c.s +.PHONY : lib/swap.s + +# target to generate assembly for a file +lib/swap.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/swap.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/swap.c.s +.PHONY : lib/swap.c.s + +lib/texture.o: lib/texture.c.o +.PHONY : lib/texture.o + +# target to build an object file +lib/texture.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/texture.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/texture.c.o +.PHONY : lib/texture.c.o + +lib/texture.i: lib/texture.c.i +.PHONY : lib/texture.i + +# target to preprocess a source file +lib/texture.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/texture.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/texture.c.i +.PHONY : lib/texture.c.i + +lib/texture.s: lib/texture.c.s +.PHONY : lib/texture.s + +# target to generate assembly for a file +lib/texture.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/texture.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/texture.c.s +.PHONY : lib/texture.c.s + +lib/texture1.o: lib/texture1.c.o +.PHONY : lib/texture1.o + +# target to build an object file +lib/texture1.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/texture1.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/texture1.c.o +.PHONY : lib/texture1.c.o + +lib/texture1.i: lib/texture1.c.i +.PHONY : lib/texture1.i + +# target to preprocess a source file +lib/texture1.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/texture1.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/texture1.c.i +.PHONY : lib/texture1.c.i + +lib/texture1.s: lib/texture1.c.s +.PHONY : lib/texture1.s + +# target to generate assembly for a file +lib/texture1.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/texture1.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/texture1.c.s +.PHONY : lib/texture1.c.s + +lib/texture2.o: lib/texture2.c.o +.PHONY : lib/texture2.o + +# target to build an object file +lib/texture2.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/texture2.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/texture2.c.o +.PHONY : lib/texture2.c.o + +lib/texture2.i: lib/texture2.c.i +.PHONY : lib/texture2.i + +# target to preprocess a source file +lib/texture2.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/texture2.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/texture2.c.i +.PHONY : lib/texture2.c.i + +lib/texture2.s: lib/texture2.c.s +.PHONY : lib/texture2.s + +# target to generate assembly for a file +lib/texture2.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/texture2.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/texture2.c.s +.PHONY : lib/texture2.c.s + +lib/vk_funcs.o: lib/vk_funcs.c.o +.PHONY : lib/vk_funcs.o + +# target to build an object file +lib/vk_funcs.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vk_funcs.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vk_funcs.c.o +.PHONY : lib/vk_funcs.c.o + +lib/vk_funcs.i: lib/vk_funcs.c.i +.PHONY : lib/vk_funcs.i + +# target to preprocess a source file +lib/vk_funcs.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vk_funcs.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vk_funcs.c.i +.PHONY : lib/vk_funcs.c.i + +lib/vk_funcs.s: lib/vk_funcs.c.s +.PHONY : lib/vk_funcs.s + +# target to generate assembly for a file +lib/vk_funcs.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vk_funcs.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vk_funcs.c.s +.PHONY : lib/vk_funcs.c.s + +lib/vkformat_check.o: lib/vkformat_check.c.o +.PHONY : lib/vkformat_check.o + +# target to build an object file +lib/vkformat_check.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkformat_check.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkformat_check.c.o +.PHONY : lib/vkformat_check.c.o + +lib/vkformat_check.i: lib/vkformat_check.c.i +.PHONY : lib/vkformat_check.i + +# target to preprocess a source file +lib/vkformat_check.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkformat_check.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkformat_check.c.i +.PHONY : lib/vkformat_check.c.i + +lib/vkformat_check.s: lib/vkformat_check.c.s +.PHONY : lib/vkformat_check.s + +# target to generate assembly for a file +lib/vkformat_check.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkformat_check.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkformat_check.c.s +.PHONY : lib/vkformat_check.c.s + +lib/vkformat_check_variant.o: lib/vkformat_check_variant.c.o +.PHONY : lib/vkformat_check_variant.o + +# target to build an object file +lib/vkformat_check_variant.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.o +.PHONY : lib/vkformat_check_variant.c.o + +lib/vkformat_check_variant.i: lib/vkformat_check_variant.c.i +.PHONY : lib/vkformat_check_variant.i + +# target to preprocess a source file +lib/vkformat_check_variant.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.i +.PHONY : lib/vkformat_check_variant.c.i + +lib/vkformat_check_variant.s: lib/vkformat_check_variant.c.s +.PHONY : lib/vkformat_check_variant.s + +# target to generate assembly for a file +lib/vkformat_check_variant.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkformat_check_variant.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkformat_check_variant.c.s +.PHONY : lib/vkformat_check_variant.c.s + +lib/vkformat_str.o: lib/vkformat_str.c.o +.PHONY : lib/vkformat_str.o + +# target to build an object file +lib/vkformat_str.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkformat_str.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkformat_str.c.o +.PHONY : lib/vkformat_str.c.o + +lib/vkformat_str.i: lib/vkformat_str.c.i +.PHONY : lib/vkformat_str.i + +# target to preprocess a source file +lib/vkformat_str.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkformat_str.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkformat_str.c.i +.PHONY : lib/vkformat_str.c.i + +lib/vkformat_str.s: lib/vkformat_str.c.s +.PHONY : lib/vkformat_str.s + +# target to generate assembly for a file +lib/vkformat_str.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkformat_str.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkformat_str.c.s +.PHONY : lib/vkformat_str.c.s + +lib/vkformat_typesize.o: lib/vkformat_typesize.c.o +.PHONY : lib/vkformat_typesize.o + +# target to build an object file +lib/vkformat_typesize.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkformat_typesize.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.o +.PHONY : lib/vkformat_typesize.c.o + +lib/vkformat_typesize.i: lib/vkformat_typesize.c.i +.PHONY : lib/vkformat_typesize.i + +# target to preprocess a source file +lib/vkformat_typesize.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkformat_typesize.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.i +.PHONY : lib/vkformat_typesize.c.i + +lib/vkformat_typesize.s: lib/vkformat_typesize.c.s +.PHONY : lib/vkformat_typesize.s + +# target to generate assembly for a file +lib/vkformat_typesize.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkformat_typesize.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkformat_typesize.c.s +.PHONY : lib/vkformat_typesize.c.s + +lib/vkloader.o: lib/vkloader.c.o +.PHONY : lib/vkloader.o + +# target to build an object file +lib/vkloader.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkloader.c.o + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkloader.c.o +.PHONY : lib/vkloader.c.o + +lib/vkloader.i: lib/vkloader.c.i +.PHONY : lib/vkloader.i + +# target to preprocess a source file +lib/vkloader.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkloader.c.i + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkloader.c.i +.PHONY : lib/vkloader.c.i + +lib/vkloader.s: lib/vkloader.c.s +.PHONY : lib/vkloader.s + +# target to generate assembly for a file +lib/vkloader.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/vkloader.c.s + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx_read.dir/build.make CMakeFiles/ktx_read.dir/lib/vkloader.c.s +.PHONY : lib/vkloader.c.s + +lib/writer1.o: lib/writer1.c.o +.PHONY : lib/writer1.o + +# target to build an object file +lib/writer1.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/writer1.c.o +.PHONY : lib/writer1.c.o + +lib/writer1.i: lib/writer1.c.i +.PHONY : lib/writer1.i + +# target to preprocess a source file +lib/writer1.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/writer1.c.i +.PHONY : lib/writer1.c.i + +lib/writer1.s: lib/writer1.c.s +.PHONY : lib/writer1.s + +# target to generate assembly for a file +lib/writer1.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/writer1.c.s +.PHONY : lib/writer1.c.s + +lib/writer2.o: lib/writer2.c.o +.PHONY : lib/writer2.o + +# target to build an object file +lib/writer2.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/writer2.c.o +.PHONY : lib/writer2.c.o + +lib/writer2.i: lib/writer2.c.i +.PHONY : lib/writer2.i + +# target to preprocess a source file +lib/writer2.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/writer2.c.i +.PHONY : lib/writer2.c.i + +lib/writer2.s: lib/writer2.c.s +.PHONY : lib/writer2.s + +# target to generate assembly for a file +lib/writer2.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/ktx.dir/build.make CMakeFiles/ktx.dir/lib/writer2.c.s +.PHONY : lib/writer2.c.s + +utils/argparser.o: utils/argparser.cpp.o +.PHONY : utils/argparser.o + +# target to build an object file +utils/argparser.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/objUtil.dir/build.make CMakeFiles/objUtil.dir/utils/argparser.cpp.o +.PHONY : utils/argparser.cpp.o + +utils/argparser.i: utils/argparser.cpp.i +.PHONY : utils/argparser.i + +# target to preprocess a source file +utils/argparser.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/objUtil.dir/build.make CMakeFiles/objUtil.dir/utils/argparser.cpp.i +.PHONY : utils/argparser.cpp.i + +utils/argparser.s: utils/argparser.cpp.s +.PHONY : utils/argparser.s + +# target to generate assembly for a file +utils/argparser.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/objUtil.dir/build.make CMakeFiles/objUtil.dir/utils/argparser.cpp.s +.PHONY : utils/argparser.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... Continuous" + @echo "... ContinuousBuild" + @echo "... ContinuousConfigure" + @echo "... ContinuousCoverage" + @echo "... ContinuousMemCheck" + @echo "... ContinuousStart" + @echo "... ContinuousSubmit" + @echo "... ContinuousTest" + @echo "... ContinuousUpdate" + @echo "... Experimental" + @echo "... ExperimentalBuild" + @echo "... ExperimentalConfigure" + @echo "... ExperimentalCoverage" + @echo "... ExperimentalMemCheck" + @echo "... ExperimentalStart" + @echo "... ExperimentalSubmit" + @echo "... ExperimentalTest" + @echo "... ExperimentalUpdate" + @echo "... Nightly" + @echo "... NightlyBuild" + @echo "... NightlyConfigure" + @echo "... NightlyCoverage" + @echo "... NightlyMemCheck" + @echo "... NightlyMemoryCheck" + @echo "... NightlyStart" + @echo "... NightlySubmit" + @echo "... NightlyTest" + @echo "... NightlyUpdate" + @echo "... all.doc" + @echo "... jswrappers.doc" + @echo "... ktx2check_version" + @echo "... ktx2ktx2_version" + @echo "... ktx_version" + @echo "... ktxinfo_version" + @echo "... ktxpkg.doc" + @echo "... ktxsc_version" + @echo "... ktxtools_version" + @echo "... libktx.doc" + @echo "... toktx_version" + @echo "... tools.doc" + @echo "... appfwSDL" + @echo "... astcenc-avx2-static" + @echo "... fmt" + @echo "... gtest" + @echo "... imageio" + @echo "... ktx" + @echo "... ktx2check" + @echo "... ktx2ktx2" + @echo "... ktx_read" + @echo "... ktxdiff" + @echo "... ktxinfo" + @echo "... ktxsc" + @echo "... ktxtools" + @echo "... objUtil" + @echo "... obj_basisu_cbind" + @echo "... streamtests" + @echo "... texturetests" + @echo "... toktx" + @echo "... transcodetests" + @echo "... unittests" + @echo "... external/basisu/encoder/basisu_backend.o" + @echo "... external/basisu/encoder/basisu_backend.i" + @echo "... external/basisu/encoder/basisu_backend.s" + @echo "... external/basisu/encoder/basisu_basis_file.o" + @echo "... external/basisu/encoder/basisu_basis_file.i" + @echo "... external/basisu/encoder/basisu_basis_file.s" + @echo "... external/basisu/encoder/basisu_bc7enc.o" + @echo "... external/basisu/encoder/basisu_bc7enc.i" + @echo "... external/basisu/encoder/basisu_bc7enc.s" + @echo "... external/basisu/encoder/basisu_comp.o" + @echo "... external/basisu/encoder/basisu_comp.i" + @echo "... external/basisu/encoder/basisu_comp.s" + @echo "... external/basisu/encoder/basisu_enc.o" + @echo "... external/basisu/encoder/basisu_enc.i" + @echo "... external/basisu/encoder/basisu_enc.s" + @echo "... external/basisu/encoder/basisu_etc.o" + @echo "... external/basisu/encoder/basisu_etc.i" + @echo "... external/basisu/encoder/basisu_etc.s" + @echo "... external/basisu/encoder/basisu_frontend.o" + @echo "... external/basisu/encoder/basisu_frontend.i" + @echo "... external/basisu/encoder/basisu_frontend.s" + @echo "... external/basisu/encoder/basisu_gpu_texture.o" + @echo "... external/basisu/encoder/basisu_gpu_texture.i" + @echo "... external/basisu/encoder/basisu_gpu_texture.s" + @echo "... external/basisu/encoder/basisu_kernels_sse.o" + @echo "... external/basisu/encoder/basisu_kernels_sse.i" + @echo "... external/basisu/encoder/basisu_kernels_sse.s" + @echo "... external/basisu/encoder/basisu_opencl.o" + @echo "... external/basisu/encoder/basisu_opencl.i" + @echo "... external/basisu/encoder/basisu_opencl.s" + @echo "... external/basisu/encoder/basisu_pvrtc1_4.o" + @echo "... external/basisu/encoder/basisu_pvrtc1_4.i" + @echo "... external/basisu/encoder/basisu_pvrtc1_4.s" + @echo "... external/basisu/encoder/basisu_resample_filters.o" + @echo "... external/basisu/encoder/basisu_resample_filters.i" + @echo "... external/basisu/encoder/basisu_resample_filters.s" + @echo "... external/basisu/encoder/basisu_resampler.o" + @echo "... external/basisu/encoder/basisu_resampler.i" + @echo "... external/basisu/encoder/basisu_resampler.s" + @echo "... external/basisu/encoder/basisu_ssim.o" + @echo "... external/basisu/encoder/basisu_ssim.i" + @echo "... external/basisu/encoder/basisu_ssim.s" + @echo "... external/basisu/encoder/basisu_uastc_enc.o" + @echo "... external/basisu/encoder/basisu_uastc_enc.i" + @echo "... external/basisu/encoder/basisu_uastc_enc.s" + @echo "... external/basisu/transcoder/basisu_transcoder.o" + @echo "... external/basisu/transcoder/basisu_transcoder.i" + @echo "... external/basisu/transcoder/basisu_transcoder.s" + @echo "... external/basisu/zstd/zstd.o" + @echo "... external/basisu/zstd/zstd.i" + @echo "... external/basisu/zstd/zstd.s" + @echo "... external/dfdutils/colourspaces.o" + @echo "... external/dfdutils/colourspaces.i" + @echo "... external/dfdutils/colourspaces.s" + @echo "... external/dfdutils/createdfd.o" + @echo "... external/dfdutils/createdfd.i" + @echo "... external/dfdutils/createdfd.s" + @echo "... external/dfdutils/interpretdfd.o" + @echo "... external/dfdutils/interpretdfd.i" + @echo "... external/dfdutils/interpretdfd.s" + @echo "... external/dfdutils/printdfd.o" + @echo "... external/dfdutils/printdfd.i" + @echo "... external/dfdutils/printdfd.s" + @echo "... external/dfdutils/queries.o" + @echo "... external/dfdutils/queries.i" + @echo "... external/dfdutils/queries.s" + @echo "... external/dfdutils/vk2dfd.o" + @echo "... external/dfdutils/vk2dfd.i" + @echo "... external/dfdutils/vk2dfd.s" + @echo "... external/etcdec/etcdec.o" + @echo "... external/etcdec/etcdec.i" + @echo "... external/etcdec/etcdec.s" + @echo "... lib/astc_codec.o" + @echo "... lib/astc_codec.i" + @echo "... lib/astc_codec.s" + @echo "... lib/basis_encode.o" + @echo "... lib/basis_encode.i" + @echo "... lib/basis_encode.s" + @echo "... lib/basis_transcode.o" + @echo "... lib/basis_transcode.i" + @echo "... lib/basis_transcode.s" + @echo "... lib/checkheader.o" + @echo "... lib/checkheader.i" + @echo "... lib/checkheader.s" + @echo "... lib/etcunpack.o" + @echo "... lib/etcunpack.i" + @echo "... lib/etcunpack.s" + @echo "... lib/filestream.o" + @echo "... lib/filestream.i" + @echo "... lib/filestream.s" + @echo "... lib/gl_funcs.o" + @echo "... lib/gl_funcs.i" + @echo "... lib/gl_funcs.s" + @echo "... lib/glformat_str.o" + @echo "... lib/glformat_str.i" + @echo "... lib/glformat_str.s" + @echo "... lib/glloader.o" + @echo "... lib/glloader.i" + @echo "... lib/glloader.s" + @echo "... lib/hashlist.o" + @echo "... lib/hashlist.i" + @echo "... lib/hashlist.s" + @echo "... lib/info.o" + @echo "... lib/info.i" + @echo "... lib/info.s" + @echo "... lib/memstream.o" + @echo "... lib/memstream.i" + @echo "... lib/memstream.s" + @echo "... lib/miniz_wrapper.o" + @echo "... lib/miniz_wrapper.i" + @echo "... lib/miniz_wrapper.s" + @echo "... lib/strings.o" + @echo "... lib/strings.i" + @echo "... lib/strings.s" + @echo "... lib/swap.o" + @echo "... lib/swap.i" + @echo "... lib/swap.s" + @echo "... lib/texture.o" + @echo "... lib/texture.i" + @echo "... lib/texture.s" + @echo "... lib/texture1.o" + @echo "... lib/texture1.i" + @echo "... lib/texture1.s" + @echo "... lib/texture2.o" + @echo "... lib/texture2.i" + @echo "... lib/texture2.s" + @echo "... lib/vk_funcs.o" + @echo "... lib/vk_funcs.i" + @echo "... lib/vk_funcs.s" + @echo "... lib/vkformat_check.o" + @echo "... lib/vkformat_check.i" + @echo "... lib/vkformat_check.s" + @echo "... lib/vkformat_check_variant.o" + @echo "... lib/vkformat_check_variant.i" + @echo "... lib/vkformat_check_variant.s" + @echo "... lib/vkformat_str.o" + @echo "... lib/vkformat_str.i" + @echo "... lib/vkformat_str.s" + @echo "... lib/vkformat_typesize.o" + @echo "... lib/vkformat_typesize.i" + @echo "... lib/vkformat_typesize.s" + @echo "... lib/vkloader.o" + @echo "... lib/vkloader.i" + @echo "... lib/vkloader.s" + @echo "... lib/writer1.o" + @echo "... lib/writer1.i" + @echo "... lib/writer1.s" + @echo "... lib/writer2.o" + @echo "... lib/writer2.i" + @echo "... lib/writer2.s" + @echo "... utils/argparser.o" + @echo "... utils/argparser.i" + @echo "... utils/argparser.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/Release/ktx b/ktx/build/Release/ktx new file mode 100755 index 0000000..20338c5 Binary files /dev/null and b/ktx/build/Release/ktx differ diff --git a/ktx/build/Release/ktx2check b/ktx/build/Release/ktx2check new file mode 100755 index 0000000..1ea540e Binary files /dev/null and b/ktx/build/Release/ktx2check differ diff --git a/ktx/build/Release/ktx2ktx2 b/ktx/build/Release/ktx2ktx2 new file mode 100755 index 0000000..9fd261d Binary files /dev/null and b/ktx/build/Release/ktx2ktx2 differ diff --git a/ktx/build/Release/ktxdiff b/ktx/build/Release/ktxdiff new file mode 100755 index 0000000..ed07dbc Binary files /dev/null and b/ktx/build/Release/ktxdiff differ diff --git a/ktx/build/Release/ktxinfo b/ktx/build/Release/ktxinfo new file mode 100755 index 0000000..d64f403 Binary files /dev/null and b/ktx/build/Release/ktxinfo differ diff --git a/ktx/build/Release/ktxsc b/ktx/build/Release/ktxsc new file mode 100755 index 0000000..fc0ddf0 Binary files /dev/null and b/ktx/build/Release/ktxsc differ diff --git a/ktx/build/Release/libktx.so b/ktx/build/Release/libktx.so new file mode 120000 index 0000000..d3b8c70 --- /dev/null +++ b/ktx/build/Release/libktx.so @@ -0,0 +1 @@ +libktx.so.0 \ No newline at end of file diff --git a/ktx/build/Release/libktx.so.0 b/ktx/build/Release/libktx.so.0 new file mode 120000 index 0000000..72a3923 --- /dev/null +++ b/ktx/build/Release/libktx.so.0 @@ -0,0 +1 @@ +libktx.so.0.0.0 \ No newline at end of file diff --git a/ktx/build/Release/libktx.so.0.0.0 b/ktx/build/Release/libktx.so.0.0.0 new file mode 100755 index 0000000..d8a368a Binary files /dev/null and b/ktx/build/Release/libktx.so.0.0.0 differ diff --git a/ktx/build/Release/libktx_read.so b/ktx/build/Release/libktx_read.so new file mode 120000 index 0000000..ed0e0ff --- /dev/null +++ b/ktx/build/Release/libktx_read.so @@ -0,0 +1 @@ +libktx_read.so.0 \ No newline at end of file diff --git a/ktx/build/Release/libktx_read.so.0 b/ktx/build/Release/libktx_read.so.0 new file mode 120000 index 0000000..2c7c289 --- /dev/null +++ b/ktx/build/Release/libktx_read.so.0 @@ -0,0 +1 @@ +libktx_read.so.0.0.0 \ No newline at end of file diff --git a/ktx/build/Release/libktx_read.so.0.0.0 b/ktx/build/Release/libktx_read.so.0.0.0 new file mode 100755 index 0000000..4b48253 Binary files /dev/null and b/ktx/build/Release/libktx_read.so.0.0.0 differ diff --git a/ktx/build/Release/streamtests b/ktx/build/Release/streamtests new file mode 100755 index 0000000..a5728fe Binary files /dev/null and b/ktx/build/Release/streamtests differ diff --git a/ktx/build/Release/texturetests b/ktx/build/Release/texturetests new file mode 100755 index 0000000..13d2678 Binary files /dev/null and b/ktx/build/Release/texturetests differ diff --git a/ktx/build/Release/toktx b/ktx/build/Release/toktx new file mode 100755 index 0000000..52ed400 Binary files /dev/null and b/ktx/build/Release/toktx differ diff --git a/ktx/build/Release/transcodetests b/ktx/build/Release/transcodetests new file mode 100755 index 0000000..823f40d Binary files /dev/null and b/ktx/build/Release/transcodetests differ diff --git a/ktx/build/Release/unittests b/ktx/build/Release/unittests new file mode 100755 index 0000000..c9ebfcd Binary files /dev/null and b/ktx/build/Release/unittests differ diff --git a/ktx/build/cmake_install.cmake b/ktx/build/cmake_install.cmake new file mode 100644 index 0000000..b809d7c --- /dev/null +++ b/ktx/build/cmake_install.cmake @@ -0,0 +1,167 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/cmake_install.cmake") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "tools" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/share/doc/KTX-Software" TYPE DIRECTORY FILES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/html") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "tools" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man" TYPE DIRECTORY FILES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/docs/man/man1") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "library" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE SHARED_LIBRARY FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0" + ) + foreach(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libktx.so.0.0.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libktx.so.0" + ) + if(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "${file}") + endif() + endif() + endforeach() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "dev" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/include" TYPE FILE FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktxvulkan.h" + ) +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "library" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE SHARED_LIBRARY FILES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "dev" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/include/KHR" TYPE FILE FILES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "dev" OR NOT CMAKE_INSTALL_COMPONENT) + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/ktx/KtxTargets.cmake") + file(DIFFERENT _cmake_export_file_changed FILES + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/ktx/KtxTargets.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/Export/eb899b7ebdca6f1dd2b833b33a58189b/KtxTargets.cmake") + if(_cmake_export_file_changed) + file(GLOB _cmake_old_config_files "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/ktx/KtxTargets-*.cmake") + if(_cmake_old_config_files) + string(REPLACE ";" ", " _cmake_old_config_files_text "${_cmake_old_config_files}") + message(STATUS "Old export file \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/ktx/KtxTargets.cmake\" will be replaced. Removing files [${_cmake_old_config_files_text}].") + unset(_cmake_old_config_files_text) + file(REMOVE ${_cmake_old_config_files}) + endif() + unset(_cmake_old_config_files) + endif() + unset(_cmake_export_file_changed) + endif() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/ktx" TYPE FILE FILES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/Export/eb899b7ebdca6f1dd2b833b33a58189b/KtxTargets.cmake") + if(CMAKE_INSTALL_CONFIG_NAME MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$") + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/ktx" TYPE FILE FILES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles/Export/eb899b7ebdca6f1dd2b833b33a58189b/KtxTargets-release.cmake") + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "dev" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/ktx" TYPE FILE FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/cmake/KtxConfig.cmake" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/KtxConfigVersion.cmake" + ) +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/cputypetest.c b/ktx/build/cputypetest.c new file mode 100644 index 0000000..c7a5e4b --- /dev/null +++ b/ktx/build/cputypetest.c @@ -0,0 +1,57 @@ + +// +// https://gist.github.com/webmaster128/e08067641df1dd784eb195282fd0912f +// +// The resulting values must not be defined as macros, which +// happens e.g. for 'i386', which is a macro in clang. +// For safety reasons, we undefine everything we output later +// +// For CMake literal compatibility, this file must have no double quotes +// + +#if defined(__x86_64__) || defined(_M_X64) +x86_64 +#elif defined(i386) || defined(__i386__) || defined(__i386) || defined(_M_IX86) +x86_32 +#elif defined(__ARM_ARCH_2__) +armv2 +#elif defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__) +armv3 +#elif defined(__ARM_ARCH_4T__) || defined(__TARGET_ARM_4T) +armv4T +#elif defined(__ARM_ARCH_5_) || defined(__ARM_ARCH_5E_) +ARM5 +#elif defined(__ARM_ARCH_6T2_) || defined(__ARM_ARCH_6T2_) +armv6T2 +#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) +armv6 +#elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) +armv7 +#elif defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) +armv7A +#elif defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) +armv7R +#elif defined(__ARM_ARCH_7M__) +armv7M +#elif defined(__ARM_ARCH_7S__) +armv7S +#elif defined(__aarch64__) || defined(_M_ARM64) +arm64 +#elif defined(mips) || defined(__mips__) || defined(__mips) +mips +#elif defined(__sh__) +superh +#elif defined(__powerpc) || defined(__powerpc__) || defined(__powerpc64__) || defined(__POWERPC__) || defined(__ppc__) || defined(__PPC__) || defined(_ARCH_PPC) +powerpc +#elif defined(__PPC64__) || defined(__ppc64__) || defined(_ARCH_PPC64) +powerpc64 +#elif defined(__sparc__) || defined(__sparc) +sparc +#elif defined(__m68k__) +m68k +#elif defined __EMSCRIPTEN__ +wasm +#else + #error Unsupported cpu +#endif + diff --git a/ktx/build/docs/html/authors.html b/ktx/build/docs/html/authors.html new file mode 100644 index 0000000..4a4a39d --- /dev/null +++ b/ktx/build/docs/html/authors.html @@ -0,0 +1,138 @@ + + + + + + + + + +Khronos Texture Software: Authors + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
Khronos Texture Software +  0.0.0 +
+
Libraries and tools to create and read KTX image texture files.
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Authors
+
+
+

libKTX is the work of Mark Callow based on work by Georg Kolling and Jacob Ström with contributions borrowed from Troy Hanson, Johannes van Waveren, Lode Vandevenne and Rich Geldreich. ASTC encoding was added by Wasim Abbas of ARM. zlib supercompression, HDR, 422 and depth/stencil format support were added by Mátyás Császár and Daniel Rákos of RasterGrid who also greatly improved the robustness of the library.

+

The libKTX tests are also the work of Mark Callow with some contributions borrowed from Sascha Willems' Vulkan examples and use Sam Lantinga's libSDL for portability.

+

ktx and all its commands and the CTS for it were developed by Mátyás Császár and Daniel Rákos of RasterGrid under contract from The Khronos Group, Inc.

+

The CLI for ktx and its commands was designed by Alexey Knyazev.

+

ktx2check, ktx2ktx2, ktxinfo, ktxsc and toktx are the work of Mark Callow.

+

The KTX application and file icons were designed by Dominic Agoro-Ombaka.

+
+
This page last modified $Date$
+
+
+
+
+ + + + diff --git a/ktx/build/docs/html/clipboard.js b/ktx/build/docs/html/clipboard.js new file mode 100644 index 0000000..9da9f3c --- /dev/null +++ b/ktx/build/docs/html/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/ktx/build/docs/html/cookie.js b/ktx/build/docs/html/cookie.js new file mode 100644 index 0000000..53ad21d --- /dev/null +++ b/ktx/build/docs/html/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/ktx/build/docs/html/dir_0eb6c3330d6cb51c55e38234f86914e8.html b/ktx/build/docs/html/dir_0eb6c3330d6cb51c55e38234f86914e8.html new file mode 100644 index 0000000..f8b4a1c --- /dev/null +++ b/ktx/build/docs/html/dir_0eb6c3330d6cb51c55e38234f86914e8.html @@ -0,0 +1,137 @@ + + + + + + + + + +Khronos Texture Software: pkgdoc Directory Reference + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
Khronos Texture Software +  0.0.0 +
+
Libraries and tools to create and read KTX image texture files.
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
pkgdoc Directory Reference
+
+
+
+
+ +
+ + + + diff --git a/ktx/build/docs/html/doxygen.css b/ktx/build/docs/html/doxygen.css new file mode 100644 index 0000000..971d91b --- /dev/null +++ b/ktx/build/docs/html/doxygen.css @@ -0,0 +1,2547 @@ +/* The standard CSS for doxygen 1.16.1*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #3D578C; +--page-external-link-color: #334975; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--group-header-separator-color: #D9E0EE; +--group-header-color: #354C7B; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 75px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #C4CFE5; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #C4CFE5; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-folder-open-fill-color: #C4CFE5; +--icon-folder-fill-color: #D8DFEE; +--icon-folder-border-color: #4665A2; +--icon-doc-fill-color: #D8DFEE; +--icon-doc-border-color: #4665A2; + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; +--memdecl-border-color: #D5DDEC; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-proto-background-color: #EEF1F7; +--memdef-proto-text-color: #253555; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-border-color: #C4CFE5; +--nav-breadcrumb-separator-color: #C4CFE5; +--nav-breadcrumb-active-bg: #EEF1F7; +--nav-breadcrumb-color: #354C7B; +--nav-splitbar-bg-color: #DCE2EF; +--nav-splitbar-handle-color: #9CAFD4; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-active-bg: #DCE2EF; +--nav-menu-active-color: #9CAFD4; +--nav-arrow-color: #B6C4DF; +--nav-arrow-selected-color: #90A5CE; + +/* sync icon */ +--sync-icon-border-color: #C4CFE5; +--sync-icon-background-color: #F9FAFC; +--sync-icon-selected-background-color: #EEF1F7; +--sync-icon-color: #C4CFE5; +--sync-icon-selected-color: #6884BD; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-active-color: black; +--search-filter-background-color: rgba(255,255,255,.7); +--search-filter-backdrop-filter: blur(4px); +--search-filter-foreground-color: black; +--search-filter-border-color: rgba(150,150,150,.4); +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: rgba(255,255,255,.8); +--search-results-backdrop-filter: blur(4px); +--search-results-border-color: rgba(150,150,150,.4); +--search-box-border-color: #B6C4DF; +--search-close-icon-bg-color: #A0A0A0; +--search-close-icon-fg-color: white; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--fragment-highlight-filter: -3; +--tooltip-foreground-color: black; +--tooltip-background-color: rgba(255,255,255,0.8); +--tooltip-arrow-background-color: white; +--tooltip-border-color: rgba(150,150,150,0.7); +--tooltip-backdrop-filter: blur(3px); +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 0 4px 8px 0 rgba(0,0,0,.25); +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; +--satisfies-color-hl: #b61825; +--satisfies-color-bg: #f8d1cc; +--verifies-color-hl: #b61825; +--verifies-color-bg: #f8d1cc; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #90A5CE; +--page-external-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--group-header-separator-color: #1D2A43; +--group-header-color: #90A5CE; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #212F4B; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #2C3F65; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-folder-open-fill-color: #4665A2; +--icon-folder-fill-color: #5373B4; +--icon-folder-border-color: #C4CFE5; +--icon-doc-fill-color: #6884BD; +--icon-doc-border-color: #C4CFE5; + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; +--memdecl-border-color: #233250; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-border-color: #212F4B; +--nav-breadcrumb-separator-color: #212F4B; +--nav-breadcrumb-active-bg: #1D2A43; +--nav-breadcrumb-color: #90A5CE; +--nav-splitbar-bg-color: #283A5D; +--nav-splitbar-handle-color: #4665A2; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-active-bg: #1D2A43; +--nav-menu-active-color: #C9D3E7; +--nav-arrow-color: #4665A2; +--nav-arrow-selected-color: #6884BD; + +/* sync icon */ +--sync-icon-border-color: #212F4B; +--sync-icon-background-color: #101826; +--sync-icon-selected-background-color: #1D2A43; +--sync-icon-color: #4665A2; +--sync-icon-selected-color: #5373B4; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-active-color: #F5F5F5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-backdrop-filter: none; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: black; +--search-results-foreground-color: #90A5CE; +--search-results-backdrop-filter: none; +--search-results-border-color: #334975; +--search-box-border-color: #334975; +--search-close-icon-bg-color: #909090; +--search-close-icon-fg-color: black; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: #090D16; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--fragment-highlight-filter: 5; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-arrow-background-color: #202020; +--tooltip-backdrop-filter: none; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; +--satisfies-color-hl: #ad2617; +--satisfies-color-bg: #2e1917; +--verifies-color-hl: #ad2617; +--verifies-color-bg: #2e1917; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +body.resizing { + user-select: none; + -webkit-user-select: none; +} + +#doc-content { + scrollbar-width: thin; +} + +/* @group Heading Levels */ + +.title { + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 160%; + font-weight: 400; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + box-shadow: 12px 0 var(--page-background-color), + -12px 0 var(--page-background-color), + 12px 1px var(--group-header-separator-color), + -12px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +td h2.groupheader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; + margin-bottom: 0px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + margin-right: 6px; + padding-right: 6px; + text-align: right; + line-height: 110%; + background-color: var(--nav-background-color); +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + padding-right: 6px; + padding-left: 6px; + border-radius: 0 6px 6px 0; + background-color: var(--nav-menu-active-bg); +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +span.label a:hover { + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.el, a.el:visited, a.code, a.code:visited, a.line, a.line:visited { + color: var(--page-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--page-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +div.embeddoc { + font-family: var(--font-family-monospace); + padding-left: 10px; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul.check { + list-style: none; + padding-left: 40px; + margin: 0; +} + +ul.check li { + position: relative; +} + +li.unchecked::before, li.checked::before { + position: absolute; + left: -18px; + top: 0; +} + +li.unchecked::before { + content: "☐"; +} + +li.checked::before { + content: "☑"; +} + +ul.check li > p { + display: inline; +} + +ul.check li > p:not(:first-child) { + display: block; +} + +ol { + text-indent: 0px; +} + +ul { + text-indent: 0px; + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +span.tt { + white-space: pre; + font-family: var(--font-family-monospace); + background-color: var(--fragment-background-color); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: hidden; + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .4; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: wrap; + word-break: break-all; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -62px; + padding-left: 62px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + display: inline-block; + width: 12px; + height: 12px; + margin-left: 4px; + margin-right: 1px; +} + +span.foldnone { + display: inline-block; + position: relative; + cursor: pointer; + user-select: none; +} + +span.fold.plus, span.fold.minus { + width: 10px; + height: 10px; + background-color: var(--fragment-background-color); + position: relative; + border: 1px solid var(--fold-line-color); + margin-right: 1px; +} + +span.fold.plus::before, span.fold.minus::before { + content: ''; + position: absolute; + background-color: var(--fold-line-color); +} + +span.fold.plus::before { + width: 2px; + height: 6px; + top: 2px; + left: 4px; +} + +span.fold.plus::after { + content: ''; + position: absolute; + width: 6px; + height: 2px; + top: 4px; + left: 2px; + background-color: var(--fold-line-color); +} + +span.fold.minus::before { + width: 6px; + height: 2px; + top: 4px; + left: 2px; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 110%; + font-weight: 500; + margin-left: 0px; + margin-top: 0em; + margin-bottom: 6px; + padding-top: 8px; + padding-bottom: 4px; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 12px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + border: none; + margin-top: 16px; + margin-bottom: 16px; + height: 1px; + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight { + padding-top: 2px; + padding-bottom: 2px; +} + +.memTemplParams { + padding-left: 10px; + padding-top: 5px; +} + +.memItemLeft, .memItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +tr[class^='memdesc'] { + box-shadow: inset 0px 1px 3px 0px rgba(0,0,0,.075); +} + +.mdescLeft { + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.mdescRight { + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; + border-left: 1px solid var(--memdecl-border-color); + border-right: 1px solid var(--memdecl-border-color); +} + +td.ititle { + border: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + padding-left: 10px; +} + +tr:not(:first-child) > td.ititle { + border-top: 0; + border-radius: 0; +} + +.memItemLeft { + white-space: nowrap; + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-left: 10px; + transition: none; + vertical-align: top; + text-align: right; +} + +.memItemRight { + width: 100%; + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-right: 10px; + transition: none; + vertical-align: bottom; +} + +tr.heading + tr[class^='memitem'] td.memItemLeft, +tr.groupHeader + tr[class^='memitem'] td.memItemLeft, +tr.inherit_header + tr[class^='memitem'] td.memItemLeft { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memItemRight, +tr.groupHeader + tr[class^='memitem'] td.memItemRight, +tr.inherit_header + tr[class^='memitem'] td.memItemRight { + border-top: 1px solid var(--memdecl-border-color); + border-top-right-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memTemplParams, +tr.heading + tr td.ititle, +tr.groupHeader + tr[class^='memitem'] td.memTemplParams, +tr.groupHeader + tr td.ititle, +tr.inherit_header + tr[class^='memitem'] td.memTemplParams { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemLeft, +table.memberdecls tr:last-child td.mdescLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescLeft { + border-bottom-left-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemRight, +table.memberdecls tr:last-child td.mdescRight, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemRight, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescRight { + border-bottom-right-radius: 4px; +} + +tr.template .memItemLeft, tr.template .memItemRight { + border-top: none; + padding-top: 0; +} + + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-color: var(--memdef-proto-background-color); + line-height: 1.25; + font-family: var(--font-family-monospace); + font-weight: 500; + font-size: 16px; + float:left; + box-shadow: 0 10px 0 -1px var(--memdef-proto-background-color), + 0 2px 8px 0 rgba(0,0,0,.075); + position: relative; +} + +.memtitle:after { + content: ''; + display: block; + background: var(--memdef-proto-background-color); + height: 10px; + bottom: -10px; + left: 0px; + right: -14px; + position: absolute; + border-top-right-radius: 6px; +} + +.permalink +{ + font-family: var(--font-family-monospace); + font-weight: 500; + line-height: 1.25; + font-size: 16px; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-family: var(--font-family-monospace); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + display: table !important; + width: 100%; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + border-radius: 4px; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-family: var(--font-family-monospace); + font-size: 13px; + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + background-color: var(--memdef-proto-background-color); + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; +} + +.paramname { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; +} + +.paramname em { + color: var(--memdef-param-name-color); + font-style: normal; + margin-right: 1px; +} + +.paramname .paramdefval { + font-family: var(--font-family-monospace); +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-background-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 14px; + transition: opacity 0.3s ease; +} + +span.arrowhead { + position: relative; + padding: 0; + margin: 0 0 0 2px; + display: inline-block; + width: 5px; + height: 5px; + border-right: 2px solid var(--nav-arrow-color); + border-bottom: 2px solid var(--nav-arrow-color); + transform: rotate(-45deg); + transition: transform 0.3s ease; +} + +span.arrowhead.opened { + transform: rotate(45deg); +} + +.selected span.arrowhead { + border-right: 2px solid var(--nav-arrow-selected-color); + border-bottom: 2px solid var(--nav-arrow-selected-color); +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfolder { + width: 24px; + height: 18px; + margin-top: 6px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.icondoc { + width: 24px; + height: 18px; + margin-top: 3px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.folder-icon { + width: 16px; + height: 11px; + background-color: var(--icon-folder-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 0 2px 2px 2px; + position: relative; + box-sizing: content-box; +} + +.folder-icon::after { + content: ''; + position: absolute; + top: 2px; + left: -1px; + width: 16px; + height: 7px; + background-color: var(--icon-folder-open-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 7px 7px 2px 2px; + transform-origin: top left; + opacity: 0; + transition: all 0.3s linear; +} + +.folder-icon::before { + content: ''; + position: absolute; + top: -3px; + left: -1px; + width: 6px; + height: 2px; + background-color: var(--icon-folder-fill-color); + border-top: 1px solid var(--icon-folder-border-color); + border-left: 1px solid var(--icon-folder-border-color); + border-right: 1px solid var(--icon-folder-border-color); + border-radius: 2px 2px 0 0; +} + +.folder-icon.open::after { + top: 3px; + opacity: 1; +} + +.doc-icon { + left: 6px; + width: 12px; + height: 16px; + background-color: var(--icon-doc-border-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: relative; + display: inline-block; +} +.doc-icon::before { + content: ""; + left: 1px; + top: 1px; + width: 10px; + height: 14px; + background-color: var(--icon-doc-fill-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: absolute; + box-sizing: border-box; +} +.doc-icon::after { + content: ""; + left: 7px; + top: 0px; + width: 3px; + height: 3px; + background-color: transparent; + position: absolute; + border: 1px solid var(--icon-doc-border-color); +} + + + + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +span.dynarrow { + position: relative; + display: inline-block; + width: 12px; + bottom: 1px; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fieldinit { + padding-top: 3px; + text-align: right; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +/* style requirements page */ + +div.req_title { + text-decoration-line: underline; + text-decoration-style: solid; + text-decoration-color: var(--table-cell-border-color); + text-decoration-thickness: 1px; + font-weight: bold; +} + +table.reqlist tr > td:first-child { + text-align: right; + font-weight: bold; +} + +div.missing_satisfies { + border-left: 8px solid var(--satisfies-color-hl); + border-radius: 4px; + background: var(--satisfies-color-bg); + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; +} + +div.missing_verifies { + border-left: 8px solid var(--verifies-color-hl); + border-radius: 4px; + background: var(--verifies-color-bg); + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; +} + +/* ----------- navigation breadcrumb styling ----------- */ + +#nav-path ul { + height: 30px; + line-height: 30px; + color: var(--nav-text-normal-color); + overflow: hidden; + margin: 0px; + padding-left: 4px; + background-image: none; + background: var(--page-background-color); + border-bottom: 1px solid var(--nav-breadcrumb-separator-color); + font-size: var(--nav-font-size-level1); + font-family: var(--font-family-nav); + position: relative; + z-index: 100; +} + +#main-nav { + border-bottom: 1px solid var(--nav-border-color); +} + +.navpath li { + list-style-type:none; + float:left; + color: var(--nav-foreground-color); +} + +.navpath li.footer { + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + font-size: 8pt; + color: var(--footer-foreground-color); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; + padding-left: 15px; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--nav-breadcrumb-color); + position: relative; + top: 0px; + height: 30px; + margin-right: -20px; +} + +#nav-path li.navelem:after { + content: ''; + display: inline-block; + position: relative; + top: 0; + right: -15px; + width: 30px; + height: 30px; + transform: scaleX(0.5) scale(0.707) rotate(45deg); + z-index: 10; + background: var(--page-background-color); + box-shadow: 2px -2px 0 2px var(--nav-breadcrumb-separator-color); + border-radius: 0 5px 0 50px; +} + +#nav-path li.navelem:first-child { + margin-left: -6px; +} + +#nav-path li.navelem:hover, +#nav-path li.navelem:hover:after { + background-color: var(--nav-breadcrumb-active-bg); +} + +/* ---------------------- */ + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + margin: 0px; + background-color: var(--header-background-color); + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl { + padding: 0 0 0 0; +} + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); +} + +dl.warning .tt, dl.attention .tt, dl.important .tt { + background-color: hsl(from var(--warning-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.note .tt, dl.remark .tt { + background-color: hsl(from var(--note-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.todo .tt { + background-color: hsl(from var(--todo-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.test .tt { + background-color: hsl(from var(--test-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug .tt { + background-color: hsl(from var(--bug-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.deprecated .tt { + background-color: hsl(from var(--deprecated-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); +} + +dl.invariant .tt, dl.pre .tt, dl.post .tt { + background-color: hsl(from var(--invariant-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0; + padding: 0; +} + +#side-nav #projectname +{ + font-size: 130%; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0 0 0 5px; + margin: 0px; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li[class^='level'] { + margin-left: 15px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.empty { + background-image: none; + margin-top: 0px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: 400; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0 2px 0; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 12px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + backdrop-filter: var(--tooltip-backdrop-filter); + -webkit-backdrop-filter: var(--tooltip-backdrop-filter); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd +{ + display: inline-block; +} +tt, code, kbd +{ + vertical-align: top; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + + +html { +--timestamp: 'Sun Jun 14 2026 18:00:57'; +} +span.timestamp { content: ' '; } +span.timestamp:before { content: var(--timestamp); } + +:root { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/ktx/build/docs/html/doxygen.svg b/ktx/build/docs/html/doxygen.svg new file mode 100644 index 0000000..79a7635 --- /dev/null +++ b/ktx/build/docs/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/doxygen_crawl.html b/ktx/build/docs/html/doxygen_crawl.html new file mode 100644 index 0000000..5737e61 --- /dev/null +++ b/ktx/build/docs/html/doxygen_crawl.html @@ -0,0 +1,25 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/dynsections.js b/ktx/build/docs/html/dynsections.js new file mode 100644 index 0000000..0e15bd4 --- /dev/null +++ b/ktx/build/docs/html/dynsections.js @@ -0,0 +1,191 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); +} + +let dynsection = { + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.slideUp('fast'); + summary.show(); + $(linkObj).find('.arrowhead').addClass('closed').removeClass('opened'); + } else { + content.slideDown('fast'); + summary.hide(); + $(linkObj).find('.arrowhead').removeClass('closed').addClass('opened'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').addClass('plus').removeClass('minus'); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/ktx/build/docs/html/graph_legend.html b/ktx/build/docs/html/graph_legend.html new file mode 100644 index 0000000..7b42b2f --- /dev/null +++ b/ktx/build/docs/html/graph_legend.html @@ -0,0 +1,189 @@ + + + + + + + + + +Khronos Texture Software: Graph Legend + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
Khronos Texture Software +  0.0.0 +
+
Libraries and tools to create and read KTX image texture files.
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a gray border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
  • +
+
+
+
+ + + + diff --git a/ktx/build/docs/html/graph_legend.md5 b/ktx/build/docs/html/graph_legend.md5 new file mode 100644 index 0000000..da515da --- /dev/null +++ b/ktx/build/docs/html/graph_legend.md5 @@ -0,0 +1 @@ +f74606a252eb303675caf37987d0b7af \ No newline at end of file diff --git a/ktx/build/docs/html/graph_legend.png b/ktx/build/docs/html/graph_legend.png new file mode 100644 index 0000000..0034e94 Binary files /dev/null and b/ktx/build/docs/html/graph_legend.png differ diff --git a/ktx/build/docs/html/index.html b/ktx/build/docs/html/index.html new file mode 100644 index 0000000..d1d9d33 --- /dev/null +++ b/ktx/build/docs/html/index.html @@ -0,0 +1,147 @@ + + + + + + + + + +Khronos Texture Software: Khronos Texture Software + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
Khronos Texture Software +  0.0.0 +
+
Libraries and tools to create and read KTX image texture files.
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Khronos Texture Software
+
+
+

The KTX software consists of

    +
  • libktx, a small library of functions for writing and reading KTX (Khronos TeXture) files, transcoding those encoded in Basis Universal format and instantiating OpenGL®, OpenGL ES™️ and Vulkan® textures from them.
  • +
  • The unified KTX tools fronted by ktx for creating KTX files from PNG or EXR files, validating, encoding and transcoding KTX files, extracting images from them and more.
  • +
  • Legacy tools including toktx for creating KTX files from PNG or Netpbm format images.
  • +
+

For information about the KTX format see the KTX Registry where you can find the formal specifications and helpful tools for implementers.

+

The software is open source software. See LICENSE file for the KhronosGroup/KTX-Software project for details.

+

+Note on Navigating the Documentation

+

This GUI provides a unified way to access the four separate KTX document projects. Due to lack of support in Doxygen for navigating such a collection, there are some rough edges including, but not limited, to:

+
    +
  • The tab ordering changes. A varying number of tabs related to the currently open project are displayed on the left. Tabs for accessing other projects follow to the right.
  • +
  • In the left pane treeview the entries for accessing other projects have the same indentation under the project's title as all the current project's pages.
  • +
+
+
This page last modified $Date$
+
+ +
+
+
+ + + + diff --git a/ktx/build/docs/html/jquery.js b/ktx/build/docs/html/jquery.js new file mode 100644 index 0000000..875ada7 --- /dev/null +++ b/ktx/build/docs/html/jquery.js @@ -0,0 +1,204 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e} +var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp( +"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType +}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c +)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){ +return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll( +":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id") +)&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push( +"\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test( +a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null, +null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne +).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for( +var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n; +return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0, +r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r] +,C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each( +function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r, +"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})} +),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each( +"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t +){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t +]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i}, +getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within, +s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t +).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split( +","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add( +this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{ +width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(), +!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){ +this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height +,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e, +i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left +)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e +){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0), +i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth( +)-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e, +function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0 +]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){ +targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se", +"n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if( +session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)} +closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if( +session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE, +function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset); +tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList, +finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight())); +return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")} +function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(), +elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight, +viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b, +"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); +/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)), +mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend( +$.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy( +this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData( +"smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id" +).indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?( +this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for( +var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){ +return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if(( +!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&( +this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0 +]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass( +"highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){ +t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]" +)||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){ +t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"), +a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i, +downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2) +)&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t +)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0), +canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}}, +rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})} +return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1, +bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); diff --git a/ktx/build/docs/html/ktx_logo_200.png b/ktx/build/docs/html/ktx_logo_200.png new file mode 100644 index 0000000..9bacd67 Binary files /dev/null and b/ktx/build/docs/html/ktx_logo_200.png differ diff --git a/ktx/build/docs/html/ktxjswrappers/clipboard.js b/ktx/build/docs/html/ktxjswrappers/clipboard.js new file mode 100644 index 0000000..9da9f3c --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/ktx/build/docs/html/ktxjswrappers/cookie.js b/ktx/build/docs/html/ktxjswrappers/cookie.js new file mode 100644 index 0000000..53ad21d --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/ktx/build/docs/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e.html b/ktx/build/docs/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e.html new file mode 100644 index 0000000..6857bcf --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e.html @@ -0,0 +1,123 @@ + + + + + + + +KTX Javascript Wrappers Reference: js_binding Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
KTX Javascript Wrappers Reference 0.0.0 +
+
Libraries and tools to create and read KTX image texture files.
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
js_binding Directory Reference
+
+
+
+Directory dependency graph for js_binding:
+
+
js_binding
+ + + + +
+
+
+ +
+ + + + diff --git a/ktx/build/docs/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e_dep.map b/ktx/build/docs/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e_dep.map new file mode 100644 index 0000000..c25fbb1 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/ktx/build/docs/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e_dep.md5 b/ktx/build/docs/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e_dep.md5 new file mode 100644 index 0000000..e8f8275 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e_dep.md5 @@ -0,0 +1 @@ +554125a1b2885e3888d53aafef93c226 \ No newline at end of file diff --git a/ktx/build/docs/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e_dep.png b/ktx/build/docs/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e_dep.png new file mode 100644 index 0000000..815e01f Binary files /dev/null and b/ktx/build/docs/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e_dep.png differ diff --git a/ktx/build/docs/html/ktxjswrappers/dir_b31d54d5631803016a26f28213a41162.html b/ktx/build/docs/html/ktxjswrappers/dir_b31d54d5631803016a26f28213a41162.html new file mode 100644 index 0000000..fd06ba6 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/dir_b31d54d5631803016a26f28213a41162.html @@ -0,0 +1,119 @@ + + + + + + + +KTX Javascript Wrappers Reference: interface Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
KTX Javascript Wrappers Reference 0.0.0 +
+
Libraries and tools to create and read KTX image texture files.
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
interface Directory Reference
+
+
+ + + +

+Directories

 
js_binding
+
+
+ +
+ + + + diff --git a/ktx/build/docs/html/ktxjswrappers/doxygen.css b/ktx/build/docs/html/ktxjswrappers/doxygen.css new file mode 100644 index 0000000..971d91b --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/doxygen.css @@ -0,0 +1,2547 @@ +/* The standard CSS for doxygen 1.16.1*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #3D578C; +--page-external-link-color: #334975; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--group-header-separator-color: #D9E0EE; +--group-header-color: #354C7B; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 75px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #C4CFE5; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #C4CFE5; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-folder-open-fill-color: #C4CFE5; +--icon-folder-fill-color: #D8DFEE; +--icon-folder-border-color: #4665A2; +--icon-doc-fill-color: #D8DFEE; +--icon-doc-border-color: #4665A2; + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; +--memdecl-border-color: #D5DDEC; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-proto-background-color: #EEF1F7; +--memdef-proto-text-color: #253555; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-border-color: #C4CFE5; +--nav-breadcrumb-separator-color: #C4CFE5; +--nav-breadcrumb-active-bg: #EEF1F7; +--nav-breadcrumb-color: #354C7B; +--nav-splitbar-bg-color: #DCE2EF; +--nav-splitbar-handle-color: #9CAFD4; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-active-bg: #DCE2EF; +--nav-menu-active-color: #9CAFD4; +--nav-arrow-color: #B6C4DF; +--nav-arrow-selected-color: #90A5CE; + +/* sync icon */ +--sync-icon-border-color: #C4CFE5; +--sync-icon-background-color: #F9FAFC; +--sync-icon-selected-background-color: #EEF1F7; +--sync-icon-color: #C4CFE5; +--sync-icon-selected-color: #6884BD; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-active-color: black; +--search-filter-background-color: rgba(255,255,255,.7); +--search-filter-backdrop-filter: blur(4px); +--search-filter-foreground-color: black; +--search-filter-border-color: rgba(150,150,150,.4); +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: rgba(255,255,255,.8); +--search-results-backdrop-filter: blur(4px); +--search-results-border-color: rgba(150,150,150,.4); +--search-box-border-color: #B6C4DF; +--search-close-icon-bg-color: #A0A0A0; +--search-close-icon-fg-color: white; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--fragment-highlight-filter: -3; +--tooltip-foreground-color: black; +--tooltip-background-color: rgba(255,255,255,0.8); +--tooltip-arrow-background-color: white; +--tooltip-border-color: rgba(150,150,150,0.7); +--tooltip-backdrop-filter: blur(3px); +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 0 4px 8px 0 rgba(0,0,0,.25); +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; +--satisfies-color-hl: #b61825; +--satisfies-color-bg: #f8d1cc; +--verifies-color-hl: #b61825; +--verifies-color-bg: #f8d1cc; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #90A5CE; +--page-external-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--group-header-separator-color: #1D2A43; +--group-header-color: #90A5CE; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #212F4B; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #2C3F65; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-folder-open-fill-color: #4665A2; +--icon-folder-fill-color: #5373B4; +--icon-folder-border-color: #C4CFE5; +--icon-doc-fill-color: #6884BD; +--icon-doc-border-color: #C4CFE5; + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; +--memdecl-border-color: #233250; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-border-color: #212F4B; +--nav-breadcrumb-separator-color: #212F4B; +--nav-breadcrumb-active-bg: #1D2A43; +--nav-breadcrumb-color: #90A5CE; +--nav-splitbar-bg-color: #283A5D; +--nav-splitbar-handle-color: #4665A2; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-active-bg: #1D2A43; +--nav-menu-active-color: #C9D3E7; +--nav-arrow-color: #4665A2; +--nav-arrow-selected-color: #6884BD; + +/* sync icon */ +--sync-icon-border-color: #212F4B; +--sync-icon-background-color: #101826; +--sync-icon-selected-background-color: #1D2A43; +--sync-icon-color: #4665A2; +--sync-icon-selected-color: #5373B4; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-active-color: #F5F5F5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-backdrop-filter: none; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: black; +--search-results-foreground-color: #90A5CE; +--search-results-backdrop-filter: none; +--search-results-border-color: #334975; +--search-box-border-color: #334975; +--search-close-icon-bg-color: #909090; +--search-close-icon-fg-color: black; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: #090D16; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--fragment-highlight-filter: 5; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-arrow-background-color: #202020; +--tooltip-backdrop-filter: none; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; +--satisfies-color-hl: #ad2617; +--satisfies-color-bg: #2e1917; +--verifies-color-hl: #ad2617; +--verifies-color-bg: #2e1917; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +body.resizing { + user-select: none; + -webkit-user-select: none; +} + +#doc-content { + scrollbar-width: thin; +} + +/* @group Heading Levels */ + +.title { + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 160%; + font-weight: 400; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + box-shadow: 12px 0 var(--page-background-color), + -12px 0 var(--page-background-color), + 12px 1px var(--group-header-separator-color), + -12px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +td h2.groupheader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; + margin-bottom: 0px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + margin-right: 6px; + padding-right: 6px; + text-align: right; + line-height: 110%; + background-color: var(--nav-background-color); +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + padding-right: 6px; + padding-left: 6px; + border-radius: 0 6px 6px 0; + background-color: var(--nav-menu-active-bg); +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +span.label a:hover { + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.el, a.el:visited, a.code, a.code:visited, a.line, a.line:visited { + color: var(--page-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--page-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +div.embeddoc { + font-family: var(--font-family-monospace); + padding-left: 10px; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul.check { + list-style: none; + padding-left: 40px; + margin: 0; +} + +ul.check li { + position: relative; +} + +li.unchecked::before, li.checked::before { + position: absolute; + left: -18px; + top: 0; +} + +li.unchecked::before { + content: "☐"; +} + +li.checked::before { + content: "☑"; +} + +ul.check li > p { + display: inline; +} + +ul.check li > p:not(:first-child) { + display: block; +} + +ol { + text-indent: 0px; +} + +ul { + text-indent: 0px; + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +span.tt { + white-space: pre; + font-family: var(--font-family-monospace); + background-color: var(--fragment-background-color); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: hidden; + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .4; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: wrap; + word-break: break-all; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -62px; + padding-left: 62px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + display: inline-block; + width: 12px; + height: 12px; + margin-left: 4px; + margin-right: 1px; +} + +span.foldnone { + display: inline-block; + position: relative; + cursor: pointer; + user-select: none; +} + +span.fold.plus, span.fold.minus { + width: 10px; + height: 10px; + background-color: var(--fragment-background-color); + position: relative; + border: 1px solid var(--fold-line-color); + margin-right: 1px; +} + +span.fold.plus::before, span.fold.minus::before { + content: ''; + position: absolute; + background-color: var(--fold-line-color); +} + +span.fold.plus::before { + width: 2px; + height: 6px; + top: 2px; + left: 4px; +} + +span.fold.plus::after { + content: ''; + position: absolute; + width: 6px; + height: 2px; + top: 4px; + left: 2px; + background-color: var(--fold-line-color); +} + +span.fold.minus::before { + width: 6px; + height: 2px; + top: 4px; + left: 2px; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 110%; + font-weight: 500; + margin-left: 0px; + margin-top: 0em; + margin-bottom: 6px; + padding-top: 8px; + padding-bottom: 4px; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 12px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + border: none; + margin-top: 16px; + margin-bottom: 16px; + height: 1px; + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight { + padding-top: 2px; + padding-bottom: 2px; +} + +.memTemplParams { + padding-left: 10px; + padding-top: 5px; +} + +.memItemLeft, .memItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +tr[class^='memdesc'] { + box-shadow: inset 0px 1px 3px 0px rgba(0,0,0,.075); +} + +.mdescLeft { + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.mdescRight { + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; + border-left: 1px solid var(--memdecl-border-color); + border-right: 1px solid var(--memdecl-border-color); +} + +td.ititle { + border: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + padding-left: 10px; +} + +tr:not(:first-child) > td.ititle { + border-top: 0; + border-radius: 0; +} + +.memItemLeft { + white-space: nowrap; + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-left: 10px; + transition: none; + vertical-align: top; + text-align: right; +} + +.memItemRight { + width: 100%; + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-right: 10px; + transition: none; + vertical-align: bottom; +} + +tr.heading + tr[class^='memitem'] td.memItemLeft, +tr.groupHeader + tr[class^='memitem'] td.memItemLeft, +tr.inherit_header + tr[class^='memitem'] td.memItemLeft { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memItemRight, +tr.groupHeader + tr[class^='memitem'] td.memItemRight, +tr.inherit_header + tr[class^='memitem'] td.memItemRight { + border-top: 1px solid var(--memdecl-border-color); + border-top-right-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memTemplParams, +tr.heading + tr td.ititle, +tr.groupHeader + tr[class^='memitem'] td.memTemplParams, +tr.groupHeader + tr td.ititle, +tr.inherit_header + tr[class^='memitem'] td.memTemplParams { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemLeft, +table.memberdecls tr:last-child td.mdescLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescLeft { + border-bottom-left-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemRight, +table.memberdecls tr:last-child td.mdescRight, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemRight, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescRight { + border-bottom-right-radius: 4px; +} + +tr.template .memItemLeft, tr.template .memItemRight { + border-top: none; + padding-top: 0; +} + + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-color: var(--memdef-proto-background-color); + line-height: 1.25; + font-family: var(--font-family-monospace); + font-weight: 500; + font-size: 16px; + float:left; + box-shadow: 0 10px 0 -1px var(--memdef-proto-background-color), + 0 2px 8px 0 rgba(0,0,0,.075); + position: relative; +} + +.memtitle:after { + content: ''; + display: block; + background: var(--memdef-proto-background-color); + height: 10px; + bottom: -10px; + left: 0px; + right: -14px; + position: absolute; + border-top-right-radius: 6px; +} + +.permalink +{ + font-family: var(--font-family-monospace); + font-weight: 500; + line-height: 1.25; + font-size: 16px; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-family: var(--font-family-monospace); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + display: table !important; + width: 100%; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + border-radius: 4px; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-family: var(--font-family-monospace); + font-size: 13px; + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + background-color: var(--memdef-proto-background-color); + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; +} + +.paramname { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; +} + +.paramname em { + color: var(--memdef-param-name-color); + font-style: normal; + margin-right: 1px; +} + +.paramname .paramdefval { + font-family: var(--font-family-monospace); +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-background-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 14px; + transition: opacity 0.3s ease; +} + +span.arrowhead { + position: relative; + padding: 0; + margin: 0 0 0 2px; + display: inline-block; + width: 5px; + height: 5px; + border-right: 2px solid var(--nav-arrow-color); + border-bottom: 2px solid var(--nav-arrow-color); + transform: rotate(-45deg); + transition: transform 0.3s ease; +} + +span.arrowhead.opened { + transform: rotate(45deg); +} + +.selected span.arrowhead { + border-right: 2px solid var(--nav-arrow-selected-color); + border-bottom: 2px solid var(--nav-arrow-selected-color); +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfolder { + width: 24px; + height: 18px; + margin-top: 6px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.icondoc { + width: 24px; + height: 18px; + margin-top: 3px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.folder-icon { + width: 16px; + height: 11px; + background-color: var(--icon-folder-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 0 2px 2px 2px; + position: relative; + box-sizing: content-box; +} + +.folder-icon::after { + content: ''; + position: absolute; + top: 2px; + left: -1px; + width: 16px; + height: 7px; + background-color: var(--icon-folder-open-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 7px 7px 2px 2px; + transform-origin: top left; + opacity: 0; + transition: all 0.3s linear; +} + +.folder-icon::before { + content: ''; + position: absolute; + top: -3px; + left: -1px; + width: 6px; + height: 2px; + background-color: var(--icon-folder-fill-color); + border-top: 1px solid var(--icon-folder-border-color); + border-left: 1px solid var(--icon-folder-border-color); + border-right: 1px solid var(--icon-folder-border-color); + border-radius: 2px 2px 0 0; +} + +.folder-icon.open::after { + top: 3px; + opacity: 1; +} + +.doc-icon { + left: 6px; + width: 12px; + height: 16px; + background-color: var(--icon-doc-border-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: relative; + display: inline-block; +} +.doc-icon::before { + content: ""; + left: 1px; + top: 1px; + width: 10px; + height: 14px; + background-color: var(--icon-doc-fill-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: absolute; + box-sizing: border-box; +} +.doc-icon::after { + content: ""; + left: 7px; + top: 0px; + width: 3px; + height: 3px; + background-color: transparent; + position: absolute; + border: 1px solid var(--icon-doc-border-color); +} + + + + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +span.dynarrow { + position: relative; + display: inline-block; + width: 12px; + bottom: 1px; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fieldinit { + padding-top: 3px; + text-align: right; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +/* style requirements page */ + +div.req_title { + text-decoration-line: underline; + text-decoration-style: solid; + text-decoration-color: var(--table-cell-border-color); + text-decoration-thickness: 1px; + font-weight: bold; +} + +table.reqlist tr > td:first-child { + text-align: right; + font-weight: bold; +} + +div.missing_satisfies { + border-left: 8px solid var(--satisfies-color-hl); + border-radius: 4px; + background: var(--satisfies-color-bg); + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; +} + +div.missing_verifies { + border-left: 8px solid var(--verifies-color-hl); + border-radius: 4px; + background: var(--verifies-color-bg); + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; +} + +/* ----------- navigation breadcrumb styling ----------- */ + +#nav-path ul { + height: 30px; + line-height: 30px; + color: var(--nav-text-normal-color); + overflow: hidden; + margin: 0px; + padding-left: 4px; + background-image: none; + background: var(--page-background-color); + border-bottom: 1px solid var(--nav-breadcrumb-separator-color); + font-size: var(--nav-font-size-level1); + font-family: var(--font-family-nav); + position: relative; + z-index: 100; +} + +#main-nav { + border-bottom: 1px solid var(--nav-border-color); +} + +.navpath li { + list-style-type:none; + float:left; + color: var(--nav-foreground-color); +} + +.navpath li.footer { + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + font-size: 8pt; + color: var(--footer-foreground-color); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; + padding-left: 15px; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--nav-breadcrumb-color); + position: relative; + top: 0px; + height: 30px; + margin-right: -20px; +} + +#nav-path li.navelem:after { + content: ''; + display: inline-block; + position: relative; + top: 0; + right: -15px; + width: 30px; + height: 30px; + transform: scaleX(0.5) scale(0.707) rotate(45deg); + z-index: 10; + background: var(--page-background-color); + box-shadow: 2px -2px 0 2px var(--nav-breadcrumb-separator-color); + border-radius: 0 5px 0 50px; +} + +#nav-path li.navelem:first-child { + margin-left: -6px; +} + +#nav-path li.navelem:hover, +#nav-path li.navelem:hover:after { + background-color: var(--nav-breadcrumb-active-bg); +} + +/* ---------------------- */ + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + margin: 0px; + background-color: var(--header-background-color); + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl { + padding: 0 0 0 0; +} + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); +} + +dl.warning .tt, dl.attention .tt, dl.important .tt { + background-color: hsl(from var(--warning-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.note .tt, dl.remark .tt { + background-color: hsl(from var(--note-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.todo .tt { + background-color: hsl(from var(--todo-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.test .tt { + background-color: hsl(from var(--test-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug .tt { + background-color: hsl(from var(--bug-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.deprecated .tt { + background-color: hsl(from var(--deprecated-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); +} + +dl.invariant .tt, dl.pre .tt, dl.post .tt { + background-color: hsl(from var(--invariant-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0; + padding: 0; +} + +#side-nav #projectname +{ + font-size: 130%; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0 0 0 5px; + margin: 0px; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li[class^='level'] { + margin-left: 15px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.empty { + background-image: none; + margin-top: 0px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: 400; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0 2px 0; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 12px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + backdrop-filter: var(--tooltip-backdrop-filter); + -webkit-backdrop-filter: var(--tooltip-backdrop-filter); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd +{ + display: inline-block; +} +tt, code, kbd +{ + vertical-align: top; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + + +html { +--timestamp: 'Sun Jun 14 2026 18:00:57'; +} +span.timestamp { content: ' '; } +span.timestamp:before { content: var(--timestamp); } + +:root { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/ktx/build/docs/html/ktxjswrappers/doxygen.svg b/ktx/build/docs/html/ktxjswrappers/doxygen.svg new file mode 100644 index 0000000..79a7635 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/ktxjswrappers/doxygen_crawl.html b/ktx/build/docs/html/ktxjswrappers/doxygen_crawl.html new file mode 100644 index 0000000..cb9a1d4 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/doxygen_crawl.html @@ -0,0 +1,34 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/ktxjswrappers/dynsections.js b/ktx/build/docs/html/ktxjswrappers/dynsections.js new file mode 100644 index 0000000..0e15bd4 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/dynsections.js @@ -0,0 +1,191 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); +} + +let dynsection = { + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.slideUp('fast'); + summary.show(); + $(linkObj).find('.arrowhead').addClass('closed').removeClass('opened'); + } else { + content.slideDown('fast'); + summary.hide(); + $(linkObj).find('.arrowhead').removeClass('closed').addClass('opened'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').addClass('plus').removeClass('minus'); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/ktx/build/docs/html/ktxjswrappers/graph_legend.html b/ktx/build/docs/html/ktxjswrappers/graph_legend.html new file mode 100644 index 0000000..c2ec102 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/graph_legend.html @@ -0,0 +1,166 @@ + + + + + + + +KTX Javascript Wrappers Reference: Graph Legend + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
KTX Javascript Wrappers Reference 0.0.0 +
+
Libraries and tools to create and read KTX image texture files.
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a gray border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
  • +
+
+
+
+ + + + diff --git a/ktx/build/docs/html/ktxjswrappers/graph_legend.md5 b/ktx/build/docs/html/ktxjswrappers/graph_legend.md5 new file mode 100644 index 0000000..da515da --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/graph_legend.md5 @@ -0,0 +1 @@ +f74606a252eb303675caf37987d0b7af \ No newline at end of file diff --git a/ktx/build/docs/html/ktxjswrappers/graph_legend.png b/ktx/build/docs/html/ktxjswrappers/graph_legend.png new file mode 100644 index 0000000..0034e94 Binary files /dev/null and b/ktx/build/docs/html/ktxjswrappers/graph_legend.png differ diff --git a/ktx/build/docs/html/ktxjswrappers/index.html b/ktx/build/docs/html/ktxjswrappers/index.html new file mode 100644 index 0000000..4e36282 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/index.html @@ -0,0 +1,113 @@ + + + + + + + +KTX Javascript Wrappers Reference: KTX Javascript Wrappers Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
KTX Javascript Wrappers Reference 0.0.0 +
+
Libraries and tools to create and read KTX image texture files.
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
KTX Javascript Wrappers Reference
+
+ + +
+
+
+ + + + diff --git a/ktx/build/docs/html/ktxjswrappers/jquery.js b/ktx/build/docs/html/ktxjswrappers/jquery.js new file mode 100644 index 0000000..875ada7 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/jquery.js @@ -0,0 +1,204 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e} +var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp( +"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType +}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c +)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){ +return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll( +":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id") +)&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push( +"\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test( +a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null, +null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne +).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for( +var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n; +return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0, +r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r] +,C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each( +function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r, +"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})} +),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each( +"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t +){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t +]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i}, +getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within, +s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t +).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split( +","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add( +this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{ +width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(), +!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){ +this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height +,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e, +i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left +)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e +){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0), +i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth( +)-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e, +function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0 +]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){ +targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se", +"n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if( +session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)} +closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if( +session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE, +function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset); +tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList, +finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight())); +return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")} +function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(), +elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight, +viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b, +"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); +/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)), +mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend( +$.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy( +this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData( +"smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id" +).indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?( +this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for( +var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){ +return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if(( +!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&( +this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0 +]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass( +"highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){ +t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]" +)||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){ +t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"), +a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i, +downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2) +)&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t +)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0), +canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}}, +rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})} +return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1, +bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); diff --git a/ktx/build/docs/html/ktxjswrappers/ktx_logo_200.png b/ktx/build/docs/html/ktxjswrappers/ktx_logo_200.png new file mode 100644 index 0000000..9bacd67 Binary files /dev/null and b/ktx/build/docs/html/ktxjswrappers/ktx_logo_200.png differ diff --git a/ktx/build/docs/html/ktxjswrappers/libktx_js.html b/ktx/build/docs/html/ktxjswrappers/libktx_js.html new file mode 100644 index 0000000..19292c9 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/libktx_js.html @@ -0,0 +1,626 @@ + + + + + + + +KTX Javascript Wrappers Reference: libktx Binding + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
KTX Javascript Wrappers Reference 0.0.0 +
+
Libraries and tools to create and read KTX image texture files.
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
libktx Binding
+
+
+

+WebIDL for the binding

+

Items marked with ** are only available in the full libktx.js wrapper. Unmarked items are available in both libktx.js and libktx_read.js.

+
interface Orientation {
+
readonly attribute OrientationX x;
+
readonly attribute OrientationY y;
+
readonly attribute OrientationZ z;
+
};
+
+
interface UploadResult {
+
readonly attribute WebGLTexture texture;
+
readonly attribute GLenum target;
+
readonly attribute GLenum error;
+
};
+
+
interface textureCreateInfo { // **
+
constructor();
+
+
attribute long vkFormat;
+
attribute long baseWidth;
+
attribute long baseHeight;
+
attribute long baseDepth;
+
attribute long numDimensions;
+
attribute long numLevels;
+
attribute long numLayers;
+
attribute long numFaces;
+
attribute boolean isArray;
+
attribute boolean generateMipmaps;
+
};
+
+
interface astcParams { // **
+
constructor();
+
+
attribute boolean verbose;
+
attribute long threadCount;
+
attribute astc_block_dimension blockDimension;
+
attribute pack_astc_encoder_mode mode;
+
attribute long qualityLevel;
+
attribute boolean normalMap;
+
attribute DOMString inputSwizzle;
+
};
+
+
interface basisParams { // **
+
constructor();
+
+
attribute boolean uastc,
+
attribute boolean verbose,
+
attribute boolean noSSE,
+
attribute long threadCount,
+
attribute DOMString inputSwizzle,
+
attribute boolean preSwizzle,
+
+
// ETC1S/Basis-LZ parameters.
+
+
attribute long compressionLevel,
+
attribute long qualityLevel,
+
attribute long maxEndpoints,
+
attribute float endpointRDOThreshold,
+
attribute long maxSelectors,
+
attribute float selectorRDOThreshold,
+
attribute boolean normalMap,
+
attribute boolean noEndpointRDO,
+
attribute boolean noSelectorRDO,
+
+
// UASTC parameters.
+
+
attribute pack_uastc_flag_bits uastcFlags,
+
attribute boolean uastcRDO,
+
attribute float uastcRDOQualityScalar,
+
attribute long uastcRDODictSize,
+
attribute float uastcRDOMaxSmoothBlockErrorScale,
+
attribute float uastcRDOMaxSmoothBlockStdDev,
+
attribute boolean uastcRDODontFavorSimplerModes,
+
attribute boolean uastcRDONoMultithreading
+
};
+
+
interface texture {
+
constructor(ArrayBufferView fileData);
+
constructor(textureCreateInfo createInfo, // **
+
CreateStorageEnum? storage);
+
+
error_code compressAstc(ktxAstcParams params); // **
+
error_code decodeAstc(ktxAstcParams params);
+
error_code compressBasis(ktxBasisParams params); // **
+
texture createCopy(); // **
+
error_code defateZLIB(); // **
+
error_code deflateZstd(); // **
+
ArrayBufferView getImage(long level, long layer, long faceSlice);
+
UploadResult glUpload();
+
error_code setImageFromMemory(long level, long layer, long faceSlice,
+
ArrayBufferView imageData); // **
+
error_code transcodeBasis(transcode_fmt? target, transcode_flag_bits
+
decodeFlags);
+
ArrayBufferView writeToMemory(); // **
+
error_code addKVPairString(DOMString key, DOMString value); // **
+
error_code addKVPairByte(DOMString key, ArrayBuffewView value); // **
+
deleteKVPair(DOMString key); // **
+
DOMString? findKeyValue(DOMString key);
+
+
readonly attribute long baseWidth;
+
readonly attribute long baseHeight;
+
readonly attribute boolean isSRGB;
+
readonly attribute boolean isPremultiplied;
+
readonly attribute boolean needsTranscoding;
+
readonly attribute long numComponents;
+
readonly attribute long vkFormat;
+
readonly attribute SupercmpScheme supercompressionScheme;
+
readonly attribute ktxOrientation orientation;
+
+
attribute khr_df_transfer OETF; // Setting available only in libktx.js.
+
attribute khr_df_primaries primaries; // Setting available only in libktx.js.
+
};
+
+
enum error_code = {
+
"SUCCESS",
+
"FILE_DATA_ERROR",
+
"FILE_ISPIPE",
+
"FILE_OPEN_FAILED",
+
"FILE_OVERFLOW",
+
"FILE_READ_ERROR",
+
"FILE_SEEK_ERROR",
+
"FILE_UNEXPECTED_ERROR",
+
"FILE_WRITE_ERROR",
+
"GL_ERROR",
+
"INVALID_OPERATION",
+
"INVALID_VALUE",
+
"NOT_FOUND",
+
"OUT_OF_MEMORY",
+
"TRANSCODE_FAILED",
+
"UNKNOWN_FILE_FORMAT",
+
"UNSUPPORTED_TEXTURE_TYPE",
+
"UNSUPPORTED_FEATURE",
+
"LIBRARY_NOT_LINKED"
+
};
+
+
enum CreateStorageEnum = {
+
"NO_STORAGE",
+
"ALLOC_STORAGE"
+
};
+
+
// Some targets may not be available depending on options used when compiling
+
// the web assembly. ktxTexture.transcodeBasis will report this.
+
enum transcode_fmt = {
+
"ETC1_RGB",
+
"BC1_RGB",
+
"BC4_R",
+
"BC5_RG",
+
"BC3_RGBA",
+
"BC1_OR_3",
+
"PVRTC1_4_RGB",
+
"PVRTC1_4_RGBA",
+
"BC7_RGBA",
+
"ETC2_RGBA",
+
"ASTC_4x4_RGBA",
+
"RGBA32",
+
"RGB565",
+
"BGR565",
+
"RGBA4444",
+
"PVRTC2_4_RGB",
+
"PVRTC2_4_RGBA",
+
"ETC",
+
"EAC_R11",
+
"EAC_RG11"
+
};
+
+
enum transcode_flag_bits {
+
"TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS"
+
};
+
+
enum OrientationX {
+
"LEFT",
+
"RIGHT"
+
};
+
enum OrientationY {
+
"UP",
+
"DOWN"
+
};
+
enum OrientationZ {
+
"IN",
+
"OUT"
+
};
+
+
enum SupercmpScheme {
+
"NONE",
+
"BASIS_LZ",
+
"ZSTD"
+
"ZLIB"
+
};
+
+
enum khr_df_primaries = {
+
// These are the values needed for KTX with HTML5/WebGL.
+
"UNSPECIFIED",
+
"BT709",
+
"SRGB"
+
"DISPLAYP3"
+
};
+
+
enum khr_df_transfer = {
+
// These are the values needed for KTX with HTML5/WebGL.
+
"UNSPECIFIED",
+
"LINEAR",
+
"SRGB",
+
// DisplayP3 uses the SRGB transfer function.
+
};
+
+
enum VkFormat = {
+
"R8G8B8A8_SRGB",
+
"R8G8B8A8_UNORM"
+
// Full list omitted as its length will distract from the documentation
+
// purpose of this IDL. Any VkFormat valid for KTX can be used. As shown
+
// here, omit the VK_FORMAT_ prefix and enclose in quotes.
+
+
enum pack_astc_quality_levels = { // **
+
"FASTEST",
+
"FAST",
+
"MEDIUM",
+
"THOROUGH",
+
"EXHAUSTIVE",
+
};
+
+
enum pack_astc_block_dimension = { // **
+
// 2D formats
+
"D4x4",
+
"D5x4",
+
"D5x5",
+
"D6x5",
+
"D6x6",
+
"D8x5",
+
"D8x6",
+
"D10x5",
+
"D10x6",
+
"D8x8",
+
"D10x8",
+
"D10x10",
+
"D12x10",
+
"D12x12",
+
// 3D formats
+
"D3x3x3",
+
"D4x3x3",
+
"D4x4x3",
+
"D4x4x4",
+
"D5x4x4",
+
"D5x5x4",
+
"D5x5x5",
+
"D6x5x5",
+
"D6x6x5",
+
"D6x6x6"
+
};
+
+
enum pack_astc_encoder_mode = { // **
+
"DEFAULT",
+
"LDR",
+
"HDR"
+
};
+
+
enum pack_uastc_flag_bits = { // **
+
"LEVEL_FASTEST",
+
"LEVEL_FASTER",
+
"LEVEL_DEFAULT",
+
"LEVEL_SLOWER",
+
"LEVEL_VERYSLOW",
+
};
+
+
const DOMString ANIMDATA_KEY = "KTXanimData";
+
const DOMStringORIENTATION_KEY = "KTXorientation";
+
const DOMString SWIZZLE_KEY = "KTXswizzle";
+
const DOMString WRITER_KEY = "KTXwriter";
+
const DOMString WRITER_SCPARAMS_KEY = "KTXwriterScParams";
+
const unsigned long FACESLICE_WHOLE_lEVEL = UINT_MAX;
+
const unsigned long ETC1S_DEFAULT_COMPRESSION_LEVEL = 2;
+

+How to use

+

Put libktx.js and libktx.wasm in a directory on your server. Create a script tag with libktx.js as the src in your .html as shown below, changing the path as necessary for the relative locations of your .html file and the script source. libktx.js will automatically load libktx.wasm.

<script src="libktx.js"></script>
+
Note
For the read-only version of the library, use libktx_read.js and libktx_read.wasm instead.
+

+Create an instance of the ktx module

+

To avoid polluting the global window name space all methods, variables and tokens related to libktx are wrapped in a function that returns a promise. The promise is fulfilled with a module instance when it is safe to run the compiled code. To use any of the features your code must call the function, wait for the promise to be fulfulled and use the returned instance. Before calling the function your code must create your WebGL context. The context is needed during module initialization so that the glUpload function can provide WebGLTexture object handles on the same context.

+

The function is called createKtxModule. In previous releases it was called LIBKTX. It has been renamed to clarify what it is actually doing. Old scripts should be updated to the new name as the old name will be removed soon.

+
Note
In libktx_read.js the function is called createKtxReadModule.
+

Add the following to the top of your script to call the function, wait for the instance of the ktx module, make it available in the window name space, make your WebGL context the current context in Emscripten's OpenGL emulation and call your main().

+

This snippet shows WebGL context creation as well.

+
const canvas = document.querySelector('#glcanvas');
+
gl = canvas.getContext('webgl2');
+
+
// If we don't have a GL context, give up now
+
if (!gl) {
+
alert('Unable to initialize WebGL. Your browser or machine may not support it.');
+
} else {
+
createKtxModule({preinitializedWebGLContext: gl}).then(instance => {
+
window.ktx = instance;
+
// Make existing WebGL context current for Emscripten OpenGL.
+
ktx.GL.makeContextCurrent(
+
ktx.GL.createContext(document.getElementById("glcanvas"),
+
{ majorVersion: 2.0 })
+
);
+
main()
+
});
+
}
+

This calls main() after the module instance has been created. Start the rest of your code there.

+

+Downloading and using an existing KTX texture.

+

To download an existing texture and create a WebGL texture from it, execute a function like loadTexture in the following:

+
var myTexture;
+
+
main() {
+
loadTexture(gl, "myTextureUrl");
+
}
+
+
function loadTexture(gl, url)
+
{
+
// Create placeholder which will be replaced once the data arrives.
+
myTexture = createPlaceholderTexture(gl, [0, 0, 255, 255]);
+
gl.bindTexture(myTexture.target, myTexture.object);
+
+
var xhr = new XMLHttpRequest();
+
xhr.open('GET', url);
+
xhr.responseType = "arraybuffer";
+
xhr.onload = function(){
+
var ktxdata = new Uint8Array(this.response);
+
ktexture = new ktx.texture(ktxdata);
+
const tex = uploadTextureToGl(gl, ktexture);
+
setTexParameters(tex, ktexture);
+
gl.bindTexture(tex.target, tex.object);
+
gl.deleteTexture(texture.object);
+
texture = tex;
+
// Use code like this to display the transcode target format.
+
// elem('format').innerText = tex.format;
+
ktexture.delete();
+
};
+
+
//xhr.onprogress = runProgress;
+
//xhr.onloadstart = openProgress;
+
xhr.send();
+
}
+

This is the function for creating the place holder texture.

+
function createPlaceholderTexture(gl, color)
+
{
+
const placeholder = gl.createTexture();
+
gl.bindTexture(gl.TEXTURE_2D, placeholder);
+
+
const level = 0;
+
const internalFormat = gl.RGBA;
+
const width = 1;
+
const height = 1;
+
const border = 0;
+
const srcFormat = gl.RGBA;
+
const srcType = gl.UNSIGNED_BYTE;
+
const pixel = new Uint8Array(color);
+
+
gl.texImage2D(gl.TEXTURE_2D, level, internalFormat,
+
width, height, border, srcFormat, srcType,
+
pixel);
+
return {
+
target: gl.TEXTURE_2D,
+
object: placeholder,
+
format: formatString,
+
};
+
}
+

Uploading the KTX texture to the WebGL context is done like this. This function returns the created WebGL texture object and matching texture target.

+
function uploadTextureToGl(gl, ktexture) {
+
const { transcode_fmt } = ktx;
+
var formatString;
+
+
if (ktexture.needsTranscoding) {
+
var format;
+
if (astcSupported) {
+
formatString = 'ASTC';
+
format = transcode_fmt.ASTC_4x4_RGBA;
+
} else if (dxtSupported) {
+
formatString = ktexture.numComponents == 4 ? 'BC3' : 'BC1';
+
format = transcode_fmt.BC1_OR_3;
+
} else if (pvrtcSupported) {
+
formatString = 'PVRTC1';
+
format = transcode_fmt.PVRTC1_4_RGBA;
+
} else if (etcSupported) {
+
formatString = 'ETC';
+
format = transcode_fmt.ETC;
+
} else {
+
formatString = 'RGBA4444';
+
format = transcode_fmt.RGBA4444;
+
}
+
if (ktexture.transcodeBasis(format, 0) != ktx.error_code.SUCCESS) {
+
alert('Texture transcode failed. See console for details.');
+
return undefined;
+
}
+
}
+
+
const result = ktexture.glUpload();
+
if (result.error != gl.NO_ERROR) {
+
alert('WebGL error when uploading texture, code = '
+
+ result.error.toString(16));
+
return undefined;
+
}
+
if (result.object === undefined) {
+
alert('Texture upload failed. See console for details.');
+
return undefined;
+
}
+
if (result.target != gl.TEXTURE_2D) {
+
alert('Loaded texture is not a TEXTURE2D.');
+
return undefined;
+
}
+
+
return {
+
target: result.target,
+
object: result.object,
+
format: formatString,
+
}
+
}
+

This is the function to correctly set the TexParameters for the loaded texture. It expects that the WebGLTexture object in the texture parameter was created from the content of the ktexture parameter.

+
function setTexParameters(texture, ktexture) {
+
gl.bindTexture(texture.target, texture.object);
+
+
if (ktexture.numLevels > 1 || ktexture.generateMipmaps) {
+
// Enable bilinear mipmapping.
+
gl.texParameteri(texture.target,
+
gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
+
} else {
+
gl.texParameteri(texture.target, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
+
}
+
gl.texParameteri(texture.target, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
+
+
gl.bindTexture(texture.target, null);
+
}
+
Note
It is not clear if glUpload can be used with, e.g. THREE.js. It may be necessary to expose the ktxTexture_IterateLevelFaces or ktxTexture_IterateLoadLevelFaces API to JS with those calling a callback in JS to upload each image to WebGL.
+

+Creating a new KTX texture

+

This function shows the main steps:

+
async function runTests(filename) {
+
const img = await loadImage(filename);
+
const imageData = await loadImageData(img);
+
const ktexture = await createTexture(imageData);
+
}
+

Step 1 is to fetch the image via code such as this:

+
async function loadImage(src){
+
return new Promise((resolve, reject) => {
+
let img = new Image();
+
div = items[origImageItem].element;
+
img.onload = () => { div.appendChild(img); resolve(img); }
+
img.onerror = reject;
+
img.src = src;
+
})
+
}
+
}
+

Step 2 is to get the image data via code such as the following. Note that to get data at the original image size you must use img.naturalWidth and img.naturalHeight as shown here. If you use img.width and img.height the image data will be rendered at whatever size your CSS is displaying the canvas.

+
async function loadImageData (img, flip = false) {
+
const canvas = document.createElement("canvas");
+
const context = canvas.getContext("2d");
+
const width = img.naturalWidth;
+
const height = img.naturalHeight;
+
canvas.width = width;
+
canvas.height = height;
+
+
if (flip) {
+
context.translate(0, height);
+
context.scale(1, -1);
+
}
+
context.drawImage(img, 0, 0, width, height);
+
+
const imageData = context.getImageData(0, 0, width, height);
+
return imageData;
+
};
+

Step 3 is to create the KTX texture object as shonw here:

+
async function createTexture(imageData) {
+
const createInfo = new ktx.textureCreateInfo();
+
const colorSpace = imageData.colorSpace;
+
+
createInfo.baseWidth = imageData.width;
+
createInfo.baseHeight = imageData.height;
+
createInfo.baseDepth = 1;
+
createInfo.numDimensions = 2;
+
createInfo.numLevels = 1;
+
createInfo.numLayers = 1;
+
createInfo.numFaces = 1;
+
createInfo.isArray = false;
+
createInfo.generateMipmaps = false;
+
+
var displayP3;
+
// Image data from 2d canvases is always 8-bit RGBA.
+
// The only possible ImageData colorSpace choices are undefined, "srgb"
+
// and "displayp3." All use the sRGB transfer function.
+
createInfo.vkFormat = ktx.VkFormat.R8G8B8A8_SRGB;
+
if ( imageData.colorSpace == "display-p3") {
+
displayP3 = true;
+
}
+
+
const ktexture = new ktx.texture(createInfo, ktx.CreateStorageEnum.ALLOC_STORAGE);
+
if (ktexture != null) {
+
if (displayP3) {
+
ktexture.primaries = ktx.khr_df_primaries.DISPLAYP3;
+
}
+
result = ktexture.setImageFromMemory(0, 0, 0, imageData.data);
+
}
+
return ktexture;
+
}
+

The texture can now be uploaded to WebGL with uploadTextureToGl, that was listed earlier, and then displayed.

+

The texture can be compressed to one of the Basis universal formats with code like the following.

+
async function testEncodeBasis(ktexture) {
+
const basisu_options = new ktx.basisParams();
+
+
basisu_options.uastc = false;
+
basisu_options.noSSE = true;
+
basisu_options.verbose = false;
+
basisu_options.qualityLevel = 200;
+
basisu_options.compressionLevel = ktx.ETC1S_DEFAULT_COMPRESSION_LEVEL;
+
+
var result = ktexture.compressBasis(basisu_options);
+
// Check result for ktx.error_code.SUCCESS.
+
}
+

Finally the texture can be written back to Javascript with this single line of code:

+
const serializedTexture = ktexture.writeToMemory();
+

serializedTexture is a TypedArray. The web client can write the data to a local file or upload it to a server.

+
+
+
+ +
+ + + + diff --git a/ktx/build/docs/html/ktxjswrappers/menu.js b/ktx/build/docs/html/ktxjswrappers/menu.js new file mode 100644 index 0000000..15f9c52 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/menu.js @@ -0,0 +1,131 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search,treeview) { + function makeTree(data,relPath) { + let result=''; + if ('children' in data) { + result+='
    '; + for (let i in data.children) { + let url; + const link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + let searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'+ + '
'+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + $('#main-menu').append('
  • '); + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; + if ($mainMenuState.length) { + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(treeview); + } + // animate mobile menu + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = () => $menu.css('display', 'block'); + $menu.hide().slideDown(options); + } else { + options['complete'] = () => $menu.css('display', 'none'); + $menu.show().slideUp(options); + } + }); + // set default menu visibility + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/ktx/build/docs/html/ktxjswrappers/menudata.js b/ktx/build/docs/html/ktxjswrappers/menudata.js new file mode 100644 index 0000000..cd2fede --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/menudata.js @@ -0,0 +1,32 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"KTX Javascript Wrappers Reference",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Package",url:"../index.html"}, +{text:"KTX Tools Reference",url:"../ktxtools/index.html"}, +{text:"libktx Reference",url:"../libktx/index.html"}, +{text:"pyktx Reference",url:"../pyktx/index.html"}, +{text:"License",url:"../license.html"}]} diff --git a/ktx/build/docs/html/ktxjswrappers/msc_basis_transcoder.html b/ktx/build/docs/html/ktxjswrappers/msc_basis_transcoder.html new file mode 100644 index 0000000..38a6923 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/msc_basis_transcoder.html @@ -0,0 +1,421 @@ + + + + + + + +KTX Javascript Wrappers Reference: Basis Universal Image Transcoder binding + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Javascript Wrappers Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Basis Universal Image Transcoder binding
    +
    +
    +
    Warning
    Deprecated. Use the container independent transcoder from the Binomial LLC repo instead: https://github.com/BinomialLLC/basis_universal. This JS wrapper was designed to use an underlying C++ API that accepted image info in a structure. The API actually added to basis_universal uses explicit parameters so users of this transcoder will be packing the info into a struct from which it will be immediately unpacked before the underlying transcoder is called.
    +

    +WebIDL for the binding

    +
    void initTranscoders();
    +
    +
    bool isFormatSupported(TranscodeTarget targetFormat, TextureFormat texFormat);
    +
    +
    interface BasisTranscoderState {
    +
    void BasisTranscoderState();
    +
    };
    +
    +
    interface TranscodedImage {
    +
    ArrayBufferView get_typed_memory_view();
    +
    };
    +
    +
    interface TranscodeResult {
    +
    TranscodedImage transcodedImage;
    +
    };
    +
    +
    interface BasisLzEtc1sImageTranscoder {
    +
    void BasisLzEtc1sImageTranscoder();
    +
    uint32_t getBytesPerBlock(TranscodeTarget format);
    +
    bool decode_palettes(uint32_t num_endpoints,
    +
    const Uint8Array endpoints,
    +
    uint32_t num_selectors,
    +
    const Uint8Array selectors);
    +
    bool decode_tables(const Uint8Array tableData);
    +
    TranscodeResult transcode_image(
    +
    TranscodeTarget targetFormat,
    +
    const Uint8Array jsInSlices,
    +
    ImageInfo imageInfo,
    +
    uint32_t decodeFlags = 0,
    +
    bool isVideo = false);
    +
    };
    +
    +
    interface BasisUastcImageTranscoder {
    +
    void BasisUastcImageTranscoder();
    +
    uint32_t getBytesPerBlock(const TranscodeTarget format);
    +
    TranscodeResult transcode_image(
    +
    TranscodeTarget targetFormat,
    +
    const Uint8Array jsInImage,
    +
    basisu_image_desc& imageDesc,
    +
    uint32_t decodeFlags = 0,
    +
    bool hasAlpha = false,
    +
    bool isVideo = false);
    +
    +
    interface ImageInfo = {
    +
    ImageInfo(TextureFormat texFormat, uint32_t width, uint32_t height,
    +
    uint32_t level);
    +
    attribute uint32_t flags;
    +
    attribute long rgbByteOffset;
    +
    attribute long rgbByteLength;
    +
    attribute long alphaByteOffset;
    +
    attribute long alphaByteLength;
    +
    attribute uint32_t width;
    +
    attribute uint32_t height;
    +
    attribute uint32_t numBlocksX;
    +
    attribute uint32_t numBlocksY;
    +
    attribute uint32_t level;
    +
    };
    +
    +
    // Some targets may not be available depending on options used when compiling
    +
    // the web assembly.
    +
    enum TranscodeTarget = {
    +
    "ETC1_RGB",
    +
    "BC1_RGB",
    +
    "BC4_R",
    +
    "BC5_RG",
    +
    "BC3_RGBA",
    +
    "PVRTC1_4_RGB",
    +
    "PVRTC1_4_RGBA",
    +
    "BC7_RGBA",
    +
    "BC7_M6_RGB", //Deprecated. Use BC7_RGBA.
    +
    "BC7_M5_RGBA", //Deprecated. Use BC7_RGBA.
    +
    "ETC2_RGBA",
    +
    "ASTC_4x4_RGBA",
    +
    "RGBA32",
    +
    "RGB565",
    +
    "BGR565",
    +
    "RGBA4444",
    +
    "PVRTC2_4_RGB",
    +
    "PVRTC2_4_RGBA",
    +
    "EAC_R11",
    +
    "EAC_RG11"
    +
    };
    +
    +
    enum TextureFormat = {
    +
    "ETC1S",
    +
    "UASTC4x4",
    +
    };
    +
    +
    enum TranscodeFlagBits =
    +
    "TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS",
    +
    "HIGH_QUALITY",
    +
    };
    +
    +
    enum TranscodeFlagBits = {
    +
    "TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS",
    +
    "HIGH_QUALITY"
    +
    };
    +

    +How to use

    +

    Put msc_basis_transcoder.js and msc_basis_transcoder.wasm in a directory on your server. Create a script tag with msc_basis_tranacoder.js as the src as shown below, changing the path as necessary for the relative locations of your .html file and the script source. msc_basis_transcoder.js will automatically load msc_basis_transcoder.wasm.

    +

    +Create an instance of the MSC_TRANSCODER module

    +

    For example, add this to the .html file to initialize the transcoder and make it available on the main window.

    &lt;script src="msc_transcoder_wrapper.js">&lt;/script>
    +
    &lt;script type="text/javascript">
    +
    MSC_TRANSCODER().then(module => {
    +
    window.MSC_TRANSCODER = module;
    +
    module.initTranscoders();
    +
    // Call a function to begin loading or transcoding..
    +
    &lt;/script>
    +

    After the module is initialized, invoke code that will directly or indirectly cause a function with code like the following to be executed.

    +

    +Somewhere in the loader/transcoder

    +

    Assume a KTX file is fetched via an XMLHttpRequest which deposits the data into a Uint8Array, "buData"...

    +
    Note
    The names of the data items used in the following code are those from the KTX2 specification but the actual data is not specific to that container format.
    +
    const {
    +
    BasisLzEtc1sImageTranscoder,
    +
    BasisUastcImageTranscoder,
    +
    TranscodeTarget
    +
    } = MSC_TRANSCODER;
    +
    +
    // Determine from the KTX2 header information in buData if
    +
    // the data format is BasisU or Uastc.
    +
    // supercompressionScheme value == 1, it's TextureFormat.ETC1S.
    +
    // DFD colorModel == 166, it's TextureFormat.UASTC4x4.
    +
    const texFormat = ...
    +
    +
    // Determine appropriate transcode format from available targets,
    +
    // info about the texture, e.g. texture.numComponents, and
    +
    // expected use. Use values from TranscodeTarget.
    +
    const targetFormat = ...
    +
    if ( !MSC_TRANSCODER.isFormatSupported(targetFormat, texFormat) {
    +
    throw new Error( ... );
    +
    }
    +
    +
    if (TextureFormat.UASTC4x4) {
    +
    var result = transcodeUastc(targetFormat);
    +
    } else {
    +
    var result = transcodeEtc1s(targetFormat);
    +
    }
    +
    if ( result.transcodedImage === undefined ) {
    +
    throw new Error( 'Unable to transcode image.' );
    +
    }
    +

    This is the function for transcoding etc1s.

    +
    transcodeEtc1s(targetFormat) {
    +
    // Locate the supercompression global data and compresssed
    +
    // mip level data within buData.
    +
    +
    var bit = new BasisLzEtc1sImageTranscoder();
    +
    +
    // Find the index of the starts of the endpoints, selectors and tables
    +
    // data within buData...
    +
    var endpointsStart = ...
    +
    var selectorsStart = ...
    +
    var tablesStart = ...
    +
    // The numbers of endpoints & selectors and their byteLengths are items
    +
    // within buData. They are in the header of a .ktx2 file's
    +
    // supercompressionGlobalData and in the header of a .basis file.
    +
    +
    var endpoints = new Uint8Array(buData, endpointsStart,
    +
    endpointsByteLength);
    +
    var selectors = new Uint8Array(buData, selectorsStart,
    +
    selectorsByteLength);
    +
    +
    bit.decodePalettes(numEndpoints, endpoints,
    +
    numSelectors, selectors);
    +
    +
    var tables = new UInt8Array(buData, tablesStart, tablesByteLength);
    +
    bit.decodeTables(tables);
    +
    +
    // Determine if the file contains a video sequence...
    +
    var isVideo = ...
    +
    +
    // Calculate the total number of images in the data
    +
    var numImages = ...
    +
    +
    // Set up a subarray pointing at the deflated image descriptions
    +
    // in buData. This is for .ktx2 containers. The image descriptions
    +
    // are located in supercompressionGlobalData. .basis containers will
    +
    // require different code to locate the slice descriptions within
    +
    // the file.
    +
    var imageDescsStart = ...:
    +
    // An imageDesc has 5 uint32 values.
    +
    var imageDescs = new Uint32Data(buData, imageDescsStart,
    +
    numImages * 5 * 4);
    +
    var curImageIndex = 0;
    +
    +
    // Pseudo code for processing the levels of a .ktx2 container...
    +
    foreach level {
    +
    var leveWidth = width of image at this level
    +
    var levelHeight = height of image at this level
    +
    imageInfo = new ImageInfo(TextureFormat::ETC1S, levelWidth, levelHeight,
    +
    level);
    +
    foreach image in level {
    +
    // In KTX2 container locate the imageDesc for this image.
    +
    var imageDesc = imageDescs[curImageIndex++];
    +
    imageInfo.flags = imageDesc.imageFlags;
    +
    imageInfo.rgbByteOffset = 0;
    +
    imageInfo.rgbByteLength = imageDesc.rgbSliceByteLength;
    +
    imageInfo.alphaByteOffset = imageDesc.alphaSliceByteOffset > 0 ? imageDesc.rgbSliceByteLength : 0;
    +
    imageInfo.alphaByteLength = imageDesc.alphaSliceByteLength;
    +
    // Determine the location in the ArrayBuffer of the start
    +
    // of the deflated data for level.
    +
    var levelOffset = ...
    +
    // Make a .subarray of the rgb slice data.
    +
    var levelData = new Uint8Array(
    +
    buData,
    +
    levelOffset + imageDesc.rgbSliceByteOffset,
    +
    imageDesc.rgbSliceByteLength + imageDesc.alphaByteLength
    +
    );
    +
    var result = bit.transcodeImage(
    +
    targetFormat,
    +
    levelData,
    +
    imageInfo,
    +
    0,
    +
    isVideo);
    +
    if ( result.transcodedImage === undefined ) {
    +
    throw new Error( ... );
    +
    }
    +
    let imgData = transcodedImage.get_typed_memory_view();
    +
    +
    // Upload data in imgData to WebGL...
    +
    +
    // Do not call delete() until data has been uploaded
    +
    // or otherwise copied.
    +
    transcodedImage.delete();
    +
    }
    +
    }
    +
    +
    // For .basis containers, it is necessary to locate the slice
    +
    // description(s) for the image and set the values in imageInfo
    +
    // from them. Use of the .basis-specific transcoder is recommended.
    +
    // The definition of the basis_slice_desc struct makes it difficult
    +
    // to create JS interface for it with embind.
    +

    This is the function for transcoding Uastc.

    +
    transcodeUastc(targetFormat) {
    +
    var uit = new UastcImageTranscoder();
    +
    +
    // Determine if the data is supercompressed.
    +
    var zstd = (supercompressionScheme == 2);
    +
    +
    // Determine if the data has alpha.
    +
    var hasAlpha = (Channel ID of sample[0] in DFD == 1);
    +
    +
    var dctx;
    +
    if (zstd) {
    +
    // Initialize the zstd decoder. Zstd JS wrapper + wasm is
    +
    // a separate package.
    +
    dctx = ZSTD_createDCtx();
    +
    }
    +
    +
    // Pseudo code for processing the levels of a .ktx2 container...
    +
    foreach level {
    +
    // Determine the location in the ArrayBuffer buData of the
    +
    // start of the deflated data for the level.
    +
    var levelData = ...
    +
    if (zstd) {
    +
    // Inflate the level data
    +
    levelData = ZSTD_decompressDCtx(dctx, levelData, ... );
    +
    }
    +
    +
    var levelWidth = width of image at this level
    +
    var levelHeight = height of image at this level
    +
    var depth = depth of texture at this level
    +
    var levelImageCount = number of layers * number of faces * depth;
    +
    var imageOffsetInLevel = 0;
    +
    +
    var imageInfo = new ImageInfo(TextureFormat::UASTC4x4,
    +
    levelWidth, levelHeight, level);
    +
    var levelImageByteLength = imageInfo.numBlocksX * imageInfo.numBlocksY * DFD bytesPlane0;
    +
    +
    foreach image in level {
    +
    inImage = Uint8Array(levelData, imageOffsetInLevel, levelImageByteLength);
    +
    imageInfo.flags = 0;
    +
    imageInfo.rgbByteOffset = 0;
    +
    imageInfo.rgbByteLength = levelImageByteLength;
    +
    imageInfo.alphaByteOffset = 0;
    +
    imageInfo.alphaByteLength = 0;
    +
    +
    const {transcodedImage} = uit.transcodeImage(
    +
    targetFormat,
    +
    inImage,
    +
    imageInfo,
    +
    0,
    +
    hasAlpha,
    +
    isVideo);
    +
    if ( result.transcodedImage === undefined ) {
    +
    throw new Error( ... );
    +
    }
    +
    let imgData = transcodedImage.get_typed_memory_view();
    +
    +
    // Upload data in imgData to WebGL...
    +
    +
    // Do not call delete() until data has been uploaded
    +
    // or otherwise copied.
    +
    transcodedImage.delete();
    +
    +
    imageOffsetInLevel += levelImageByteLength;
    +
    }
    +
    }
    +
    // For .basis containers, as with ETC1S, it is necessary to locate
    +
    // the slice description for the image and set the values in imageInfo
    +
    // from it.
    +
    }
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxjswrappers/navtree.css b/ktx/build/docs/html/ktxjswrappers/navtree.css new file mode 100644 index 0000000..0ea3a07 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/navtree.css @@ -0,0 +1,327 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0; + padding:0; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + position: relative; + background-color: var(--nav-menu-active-bg); + border-radius: 0 6px 6px 0; + /*margin-right: 5px;*/ +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); + line-height: 22px; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--page-link-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin: 0 6px 0 -5px; + padding: 0 0 0 5px; + height: 22px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; +} + +.ui-resizable-e:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +.ui-resizable-e:hover { + opacity: 1; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ + scrollbar-width: thin; + border-right: 1px solid var(--nav-border-color); + padding-left: 5px; +} + +#nav-sync { + position:absolute; + top:0px; + right:0px; + z-index:1; +} + +#nav-sync img { + opacity:0.3; +} + +div.nav-sync-icon { + position: relative; + width: 24px; + height: 17px; + left: -6px; + top: -1px; + opacity: 0.7; + display: inline-block; + background-color: var(--sync-icon-background-color); + border: 1px solid var(--sync-icon-border-color); + box-sizing: content-box; +} + +div.nav-sync-icon:hover { + background-color: var(--sync-icon-selected-background-color); + opacity: 1.0; +} + +div.nav-sync-icon.active:after { + content: ''; + background-color: var(--sync-icon-background-color); + border-top: 2px solid var(--sync-icon-color); + position: absolute; + width: 16px; + height: 0px; + top: 7px; + left: 4px; +} + +div.nav-sync-icon.active:hover:after { + border-top: 2px solid var(--sync-icon-selected-color); +} + +span.sync-icon-left { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 4px; + display: inline-block; + width: 8px; + height: 8px; + border-left: 2px solid var(--sync-icon-color); + border-top: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +span.sync-icon-right { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 10px; + display: inline-block; + width: 8px; + height: 8px; + border-right: 2px solid var(--sync-icon-color); + border-bottom: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +div.nav-sync-icon:hover span.sync-icon-left { + border-left: 2px solid var(--sync-icon-selected-color); + border-top: 2px solid var(--sync-icon-selected-color); +} + +div.nav-sync-icon:hover span.sync-icon-right { + border-right: 2px solid var(--sync-icon-selected-color); + border-bottom: 2px solid var(--sync-icon-selected-color); +} + +#nav-path ul { + border-top: 1px solid var(--nav-breadcrumb-separator-color); +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + +/*---------------------------*/ +#container { + display: grid; + grid-template-columns: auto auto; + overflow: hidden; +} + +#page-nav { + background: var(--nav-background-color); + display: block; + width: 250px; + box-sizing: content-box; + position: relative; + border-left: 1px solid var(--nav-border-color); +} + +#page-nav-tree { + display: inline-block; +} + +#page-nav-resize-handle { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; + z-index: 1; + user-select: none; +} + +#page-nav-resize-handle:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +#page-nav-resize-handle.dragging, +#page-nav-resize-handle:hover { + opacity: 1; +} + +#page-nav-contents { + padding: 0; + margin: 0; + display: block; + top: 0; + left: 0; + height: 100%; + width: 100%; + position: absolute; + overflow: auto; + scrollbar-width: thin; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +ul.page-outline, +ul.page-outline ul { + text-indent: 0; + list-style: none outside none; + padding: 0 0 0 4px; +} + +ul.page-outline { + margin: 0 4px 4px 6px; +} + +ul.page-outline div.item { + font: 12px var(--font-family-nav); + line-height: 22px; +} + +ul.page-outline li { + white-space: nowrap; +} + +ul.page-outline li.vis { + background-color: var(--nav-breadcrumb-active-bg); +} + +#container.resizing { + cursor: col-resize; + user-select: none; +} diff --git a/ktx/build/docs/html/ktxjswrappers/navtree.js b/ktx/build/docs/html/ktxjswrappers/navtree.js new file mode 100644 index 0000000..fac8d01 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/navtree.js @@ -0,0 +1,901 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initNavTree(toroot,relpath,allMembersFile) { + let navTreeSubIndices = []; + const ARROW_DOWN = ''; + const ARROW_RIGHT = ''; + const NAVPATH_COOKIE_NAME = ''+'navpath'; + const fullSidebar = typeof page_layout!=='undefined' && page_layout==1; + + function getScrollBarWidth () { + let outer = $('
    ').css({visibility: 'hidden', width: 100, overflow: 'scroll', scrollbarWidth: 'thin'}).appendTo('body'); + let widthWithScroll = $('
    ').css({width: '100%'}).appendTo(outer).outerWidth(); + outer.remove(); + return 100 - widthWithScroll; + } + const scrollbarWidth = getScrollBarWidth(); + + function adjustSyncIconPosition() { + if (!fullSidebar) { + const nt = document.getElementById("nav-tree"); + const hasVerticalScrollbar = nt.scrollHeight > nt.clientHeight; + $("#nav-sync").css({right:parseInt(hasVerticalScrollbar?scrollbarWidth:0)}); + } + } + + const getData = function(varName) { + const i = varName.lastIndexOf('/'); + const n = i>=0 ? varName.substring(i+1) : varName; + const e = n.replace(/-/g,'_'); + return window[e]; + } + + const stripPath = function(uri) { + return uri.substring(uri.lastIndexOf('/')+1); + } + + const stripPath2 = function(uri) { + const i = uri.lastIndexOf('/'); + const s = uri.substring(i+1); + const m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; + } + + const hashValue = function() { + return $(location).attr('hash').substring(1).replace(/[^\w-]/g,''); + } + + const hashUrl = function() { + return '#'+hashValue(); + } + + const pathName = function() { + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;()]/g, ''); + } + + const storeLink = function(link) { + if (!$("#nav-sync").hasClass('sync')) { + Cookie.writeSetting(NAVPATH_COOKIE_NAME,link,0); + } + } + + const deleteLink = function() { + Cookie.eraseSetting(NAVPATH_COOKIE_NAME); + } + + const cachedLink = function() { + return Cookie.readSetting(NAVPATH_COOKIE_NAME,''); + } + + const getScript = function(scriptName,func) { + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = function() { func(); adjustSyncIconPosition(); } + script.src = scriptName+'.js'; + head.appendChild(script); + } + + const createIndent = function(o,domNode,node) { + let level=-1; + let n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + const imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=ARROW_RIGHT; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).removeClass('opened').addClass('closed'); + node.expanded = false; + } else { + expandNode(o, node, false, true); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + let span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } + } + + let animationInProgress = false; + + const gotoAnchor = function(anchor,aname) { + let pos, docContent = $('#doc-content'); + let ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || + ancParent.is(':header')) { + pos = ancParent.offset().top; + } else if (anchor.position()) { + pos = anchor.offset().top; + } + if (pos) { + const dcOffset = docContent.offset().top; + const dcHeight = docContent.height(); + const dcScrHeight = docContent[0].scrollHeight + const dcScrTop = docContent.scrollTop(); + let dist = Math.abs(Math.min(pos-dcOffset,dcScrHeight-dcHeight-dcScrTop)); + animationInProgress = true; + docContent.animate({ + scrollTop: pos + dcScrTop - dcOffset + },Math.max(50,Math.min(500,dist)),function() { + animationInProgress=false; + if (anchor.parent().attr('class')=='memItemLeft') { + let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname') { + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype') { + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } + }); + } + } + + function htmlToNode(html) { + const template = document.createElement('template'); + template.innerHTML = html; + const nNodes = template.content.childNodes.length; + if (nNodes !== 1) { + throw new Error(`html parameter must represent a single node; got ${nNodes}. `); + } + return template.content.firstChild; + } + + const newNode = function(o, po, text, link, childrenData, lastNode) { + const node = { + children : [], + childrenData : childrenData, + depth : po.depth + 1, + relpath : po.relpath, + isLast : lastNode, + li : document.createElement("li"), + parentNode : po, + itemDiv : document.createElement("div"), + labelSpan : document.createElement("span"), + expanded : false, + childrenUL : null, + getChildrenUL : function() { + if (!this.childrenUL) { + this.childrenUL = document.createElement("ul"); + this.childrenUL.className = "children_ul"; + this.childrenUL.style.display = "none"; + this.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }, + }; + + node.itemDiv.className = "item"; + node.labelSpan.className = "label"; + createIndent(o,node.itemDiv,node); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + const a = document.createElement("a"); + node.labelSpan.appendChild(a); + po.getChildrenUL().appendChild(node.li); + a.appendChild(htmlToNode(''+text+'')); + if (link) { + let url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + const aname = '#'+link.split('#')[1]; + const srcPage = stripPath(pathName()); + const targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : aname; + a.onclick = function() { + storeLink(link); + aPPar = $(a).parent().parent(); + if (!aPPar.hasClass('selected')) { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + aPPar.addClass('selected'); + aPPar.attr('id','selected'); + } + const anchor = $(aname); + gotoAnchor(anchor,aname); + }; + } else { + a.href = url; + a.onclick = () => storeLink(link); + } + } else if (childrenData != null) { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + return node; + } + + const showRoot = function() { + const headerHeight = $("#top").height(); + const footerHeight = $("#nav-path").height(); + const windowHeight = $(window).height() - headerHeight - footerHeight; + (function() { // retry until we can scroll to the selected item + try { + const navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); + } + + const expandNode = function(o, node, imm, setFocus) { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + expandNode(o, node, imm, setFocus); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).addClass('opened').removeClass('closed'); + node.expanded = true; + if (setFocus) { + $(node.expandToggle).focus(); + } + } + } + } + + const glowEffect = function(n,duration) { + n.addClass('glow').delay(duration).queue(function(next) { + $(this).removeClass('glow');next(); + }); + } + + const highlightAnchor = function() { + const aname = hashUrl(); + const anchor = $(aname); + gotoAnchor(anchor,aname); + } + + const selectAndHighlight = function(hash,n) { + let a; + if (hash) { + const link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + let topOffset=5; + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + showRoot(); + } + + const showNode = function(o, node, index, hash) { + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + showNode(o,node,index,hash); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + $(node.plus_img.childNodes[0]).removeClass('closed').addClass('opened'); + node.expanded = true; + const n = node.children[o.breadcrumbs[index]]; + if (index+10) { // try root page without hash as fallback + gotoUrl(o,root,'',relpath); + } else { + o.breadcrumbs = $.extend(true, [], nti); + if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index + navTo(o,NAVTREE[0][1],"",relpath); + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + } + if (o.breadcrumbs) { + o.breadcrumbs.unshift(0); // add 0 for root node + showNode(o, o.node, 0, hash); + } + } + } + + const gotoUrl = function(o,root,hash,relpath) { + const url=root+hash; + let i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function() { + navTreeSubIndices[i] = window['NAVTREEINDEX'+i]; + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); + } + } + + const navTo = function(o,root,hash,relpath) { + const link = cachedLink(); + if (link) { + const parts = link.split('#'); + root = parts[0]; + hash = parts.length>1 ? '#'+parts[1].replace(/[^\w-]/g,'') : ''; + } + if (hash.match(/^#l\d+$/)) { + const anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + gotoUrl(o,root,hash,relpath); + } + + const showSyncOff = function(n,relpath) { + n.html(''); + } + + const showSyncOn = function(n,relpath) { + n.html(''); + } + + const o = { + toroot : toroot, + node : { + childrenData : NAVTREE, + children : [], + childrenUL : document.createElement("ul"), + getChildrenUL : function() { return this.childrenUL }, + li : document.getElementById("nav-tree-contents"), + depth : 0, + relpath : relpath, + expanded : false, + isLast : true, + plus_img : document.createElement("span"), + }, + }; + o.node.li.appendChild(o.node.childrenUL); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = ARROW_RIGHT; + + const navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + + navSync.click(() => { + const navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } + }); + + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + + $(window).bind('hashchange', () => { + if (!animationInProgress) { + if (window.location.hash && window.location.hash.length>1) { + let a; + if ($(location).attr('hash')) { + const clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ try to keep right panel width + const shrinkLeft = Math.min(deficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + const remainingDeficit = deficit - shrinkLeft; + const shrinkRight = Math.min(remainingDeficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + } else { // dragging right handle -> try to keep left panel width + const shrinkRight = Math.min(deficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + const remainingDeficit = deficit - shrinkRight; + const shrinkLeft = Math.min(remainingDeficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + } + } else { + rightPanelWidth = pagenav.length ? Math.max(minPanelWidth,rightPanelWidth) : 0; + leftPanelWidth = Math.max(minPanelWidth,leftPanelWidth); + } + return { leftPanelWidth, rightPanelWidth } + } + + function updateWidths(sidenavWidth,pagenavWidth,dragLeft) + { + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,dragLeft); + const widthStr = parseFloat(widths.leftPanelWidth)+"px"; + content.css({marginLeft:widthStr}); + if (fullSidebar) { + footer.css({marginLeft:widthStr}); + if (mainnav) { + mainnav.css({marginLeft:widthStr}); + } + } + sidenav.css({width:widthStr}); + if (pagenav.length) { + container.css({gridTemplateColumns:'auto '+parseFloat(widths.rightPanelWidth)+'px'}); + if (!dragLeft) { + pagenav.css({width:parseFloat(widths.rightPanelWidth-1)+'px'}); + } + } + return widths; + } + + function resizeWidth(dragLeft) { + const sidenavWidth = $(sidenav).outerWidth()-barWidth; + let pagenavWidth = pagenav.length ? $(pagenav).outerWidth() : 0; + const widths = updateWidths(sidenavWidth,pagenavWidth,dragLeft); + Cookie.writeSetting(RESIZE_COOKIE_NAME,widths.leftPanelWidth-barWidth); + if (pagenav.length) { + Cookie.writeSetting(PAGENAV_COOKIE_NAME,widths.rightPanelWidth); + } + } + + function restoreWidth(sidenavWidth,pagenavWidth) { + updateWidths(sidenavWidth,pagenavWidth,false); + showHideNavBar(); + } + + function resizeHeight() { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (!fullSidebar) { + contentHeight = windowHeight - headerHeight - footerHeight - 1; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (fullSidebar) { + contentHeight = windowHeight - footerHeight - 1; + navtreeHeight = windowHeight - headerHeight - 1; + sideNavHeight = windowHeight - 1; + if (mainnav) { + contentHeight -= mainnav.outerHeight(); + } + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + content.css({height:contentHeight + "px"}); + resizeWidth(false); + showHideNavBar(); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (document.getElementById('main-nav')) { + mainnav = $("#main-nav"); + } + navtree = $("#nav-tree"); + pagenav = $("#page-nav"); + container = $("#container"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(true); } }); + $(sidenav).resizable({ minWidth: 0 }); + if (pagenav.length) { + pagehandle = $("#page-nav-resize-handle"); + pagehandle.on('mousedown touchstart',function(e) { + $('body').addClass('resizing'); + pagehandle.addClass('dragging'); + $(document).on('mousemove touchmove',function(e) { + const clientX = e.clientX || e.originalEvent.touches[0].clientX; + let pagenavWidth = container[0].offsetWidth-clientX+barWidth/2; + const sidenavWidth = sidenav.width(); + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,false); + container.css({gridTemplateColumns:'auto '+parseFloat(widths.rightPanelWidth)+'px'}); + pagenav.css({width:parseFloat(widths.rightPanelWidth-1)+'px'}); + content.css({marginLeft:parseFloat(widths.leftPanelWidth)+'px'}); + Cookie.writeSetting(PAGENAV_COOKIE_NAME,pagenavWidth); + }); + $(document).on('mouseup touchend', function(e) { + $('body').removeClass('resizing'); + pagehandle.removeClass('dragging'); + $(document).off('mousemove mouseup touchmove touchend'); + }); + }); + } else { + container.css({gridTemplateColumns:'auto'}); + } + const width = parseInt(Cookie.readSetting(RESIZE_COOKIE_NAME,250)); + const pagenavWidth = parseInt(Cookie.readSetting(PAGENAV_COOKIE_NAME,250)); + if (width) { restoreWidth(width+barWidth,pagenavWidth); } else { resizeWidth(); } + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(window).ready(function() { + let lastWidth = -1; + let lastHeight = -1; + $(window).resize(function() { + const newWidth = $(this).width(), newHeight = $(this).height(); + if (newWidth!=lastWidth || newHeight!=lastHeight) { + resizeHeight(); + navtree_trampoline.updateContentTop(); + lastWidth = newWidth; + lastHeight = newHeight; + } + }); + resizeHeight(); + lastWidth = $(window).width(); + lastHeight = $(window).height(); + content.scroll(function() { + navtree_trampoline.updateContentTop(); + }); + }); + } + + + function initPageToc() { + const topMapping = []; + const toc_contents = $('#page-nav-contents'); + const content=$('
      ').addClass('page-outline'); + + var entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/', + '`': '`', + '=': '=' + }; + function escapeHtml (string) { + return String(string).replace(/[&<>"'`=\/]/g, function (s) { + return entityMap[s]; + }); + } + + // for ClassDef/GroupDef/ModuleDef/ConceptDef/DirDef + const groupSections = []; + let currentGroup = null; + $('h2.groupheader, h2.memtitle').each(function(){ + const $element = $(this); + if ($element.hasClass('groupheader')) { + currentGroup = { groupHeader: $element, memTitles: [] }; + groupSections.push(currentGroup); + } else if ($element.hasClass('memtitle') && currentGroup) { + currentGroup.memTitles.push($element); + } + }); + groupSections.forEach(function(item){ + const title = item.groupHeader.text().trim(); + let id = item.groupHeader.attr('id'); + const table = item.groupHeader.parents('table.memberdecls'); + let rows = $(); + if (table.length>0) { + rows = table.find("tr[class^='memitem:'] td.memItemRight, tr[class^='memitem:'] td.memItemLeft.anon, tr[class=groupHeader] td"); + } + function hasSubItems() { + return item.memTitles.length>0 || rows.toArray().some(function(el) { return $(el).is(':visible'); }); + } + const li = $('
    • ').attr('id','nav-'+id); + const div = $('
      ').addClass('item'); + const span = $('').addClass('arrow').css({ paddingLeft:'0' }); + if (hasSubItems()) { + span.append($('').addClass('arrowhead opened')); + } + const ahref = $('').attr('href','#'+id).append(title); + content.append(li.append(div.append(span).append(ahref))); + topMapping.push(id); + const ulStack = []; + ulStack.push(content); + if (hasSubItems()) { + let last_id = undefined; + let inMemberGroup = false; + // declaration sections have rows for items + rows.each(function(){ + let td = $(this); + let tr = $(td).parent(); + const is_anon_enum = td.contents().first().text().trim()=='{'; + if (tr.hasClass('template')) { + tr = tr.prev(); + } + id = $(tr).attr('id'); + let text = is_anon_enum ? 'anonymous enum' : $(this).find(':first-child').text(); + let isMemberGroupHeader = $(tr).hasClass('groupHeader'); + if ($(tr).is(":visible") && last_id!=id && id!==undefined) { + if (isMemberGroupHeader && inMemberGroup) { + ulStack.pop(); + inMemberGroup=false; + } + const li2 = $('
    • ').attr('id','nav-'+id); + const div2 = $('
      ').addClass('item'); + const span2 = $('').addClass('arrow').css({ paddingLeft:parseInt(ulStack.length*16)+'px' }); + const ahref = $('').attr('href','#'+id).append(escapeHtml(text)); + li2.append(div2.append(span2).append(ahref)); + topMapping.push(id); + if (isMemberGroupHeader) { + span2.append($('').addClass('arrowhead opened')); + ulStack[ulStack.length-1].append(li2); + const ul2 = $('
        '); + ulStack.push(ul2); + li2.append(div2).append(ul2); + inMemberGroup=true; + } else { + ulStack[ulStack.length-1].append(li2); + } + last_id=id; + } + }); + // detailed documentation has h2.memtitle sections for items + item.memTitles.forEach(function(data) { + const text = $(data).contents().not($(data).children().first()).text(); + const name = text.replace(/\(\)(\s*\[\d+\/\d+\])?$/, '') // func() [2/8] -> func + id = $(data).find('span.permalink a').attr('href') + if (id!==undefined && name!==undefined) { + const li2 = $('
      • ').attr('id','nav-'+id.substring(1)); + const div2 = $('
      • '); + const div = $('
        ').addClass('item'); + const span = $('').addClass('arrow').css({ paddingLeft:'0' }); + const ahref = $('').attr('href',srcBaseUrl+dstBaseUrl+pageName).addClass('noscroll'); + content.append(li.append(div.append(span).append(ahref.append(LISTOFALLMEMBERS)))); + } + + if (groupSections.length==0) { + // for PageDef + const sectionTree = [], sectionStack = []; + $('h1.doxsection, h2.doxsection, h3.doxsection, h4.doxsection, h5.doxsection, h6.doxsection').each(function(){ + const level = parseInt(this.tagName[1]); + const anchor = $(this).find('a.anchor').attr('id'); + const node = { text: $(this).html(), id: anchor, children: [] }; + while (sectionStack.length && sectionStack[sectionStack.length - 1].level >= level) sectionStack.pop(); + (sectionStack.length ? sectionStack[sectionStack.length - 1].children : sectionTree).push(node); + sectionStack.push({ ...node, level }); + }); + if (sectionTree.length>0) { + function render(nodes, level=0) { + nodes.map(n => { + const li = $('
      • ').attr('id','nav-'+n.id); + const div = $('
        ').addClass('item'); + const span = $('').addClass('arrow').attr('style','padding-left:'+parseInt(level*16)+'px;'); + if (n.children.length > 0) { span.append($('').addClass('arrowhead opened')); } + const url = $('').attr('href','#'+n.id); + content.append(li.append(div.append(span).append(url.append(n.text)))); + topMapping.push(n.id); + render(n.children,level+1); + }); + } + render(sectionTree); + } + } + + toc_contents.append(content); + + $(".page-outline a[href]:not(.noscroll)").click(function(e) { + e.preventDefault(); + const aname = $(this).attr("href"); + gotoAnchor($(aname),aname); + }); + + let lastScrollSourceOffset = -1; + let lastScrollTargetOffset = -1; + let lastScrollTargetId = ''; + + navtree_trampoline.updateContentTop = function() { + const pagenavcontents = $("#page-nav-contents"); + if (pagenavcontents.length) { + const content = $("#doc-content"); + const height = content.height(); + const navy = pagenavcontents.offset().top; + const yc = content.offset().top; + let offsets = [] + for (let i=0;imargin || ye>margin) && (yslastScrollTargetOffset) || + (!scrollDown && targetOffset { + navtree_trampoline.updateContentTop(); + },200); + } + $(document).ready(function() { initPageToc(); initResizable(); }); + +} +/* @license-end */ diff --git a/ktx/build/docs/html/ktxjswrappers/navtreedata.js b/ktx/build/docs/html/ktxjswrappers/navtreedata.js new file mode 100644 index 0000000..0136d2d --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/navtreedata.js @@ -0,0 +1,54 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var NAVTREE = +[ + [ "KTX Javascript Wrappers Reference", "index.html", [ + [ "libktx Binding", "libktx_js.html", [ + [ "WebIDL for the binding", "libktx_js.html#autotoc_md1", null ], + [ "How to use", "libktx_js.html#autotoc_md2", [ + [ "Create an instance of the ktx module", "libktx_js.html#autotoc_md3", null ] + ] ], + [ "Downloading and using an existing KTX texture.", "libktx_js.html#autotoc_md4", null ], + [ "Creating a new KTX texture", "libktx_js.html#autotoc_md5", null ] + ] ], + [ "Basis Universal Image Transcoder binding", "msc_basis_transcoder.html", null ], + [ "Authors", "../authors.html", null ], + [ "LICENSE file for the KhronosGroup/KTX-Software project", "../license.html", null ], + [ "Package", "../index.html", null ], + [ "KTX Tools Reference", "../ktxtools/index.html", null ], + [ "libktx Reference", "../libktx/index.html", null ], + [ "pyktx Reference", "../pyktx/index.html", null ], + [ "License", "../license.html", null ] + ] ] +]; + +var NAVTREEINDEX = +[ +"../index.html" +]; + +var SYNCONMSG = 'click to disable panel synchronization'; +var SYNCOFFMSG = 'click to enable panel synchronization'; +var LISTOFALLMEMBERS = 'List of all members'; \ No newline at end of file diff --git a/ktx/build/docs/html/ktxjswrappers/navtreeindex0.js b/ktx/build/docs/html/ktxjswrappers/navtreeindex0.js new file mode 100644 index 0000000..6ef725e --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/navtreeindex0.js @@ -0,0 +1,19 @@ +var NAVTREEINDEX0 = +{ +"../index.html":[4], +"../ktxtools/index.html":[5], +"../libktx/index.html":[6], +"../license.html":[8], +"../pyktx/index.html":[7], +"authors.html":[2], +"index.html":[], +"libktx_js.html":[0], +"libktx_js.html#autotoc_md1":[0,0], +"libktx_js.html#autotoc_md2":[0,1], +"libktx_js.html#autotoc_md3":[0,1,0], +"libktx_js.html#autotoc_md4":[0,2], +"libktx_js.html#autotoc_md5":[0,3], +"license.html":[3], +"msc_basis_transcoder.html":[1], +"pages.html":[] +}; diff --git a/ktx/build/docs/html/ktxjswrappers/pages.html b/ktx/build/docs/html/ktxjswrappers/pages.html new file mode 100644 index 0000000..e466fdf --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/pages.html @@ -0,0 +1,112 @@ + + + + + + + +KTX Javascript Wrappers Reference: Related Pages + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        KTX Javascript Wrappers Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Related Pages
        +
        +
        +
        Here is a list of all related documentation pages:
        +
        +
        +
        + +
        + + diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_0.js b/ktx/build/docs/html/ktxjswrappers/search/all_0.js new file mode 100644 index 0000000..a3789f0 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['a_20new_20ktx_20texture_0',['Creating a new KTX texture',['../libktx_js.html#autotoc_md5',1,'']]], + ['an_20existing_20ktx_20texture_1',['Downloading and using an existing KTX texture.',['../libktx_js.html#autotoc_md4',1,'']]], + ['an_20instance_20of_20the_20ktx_20module_2',['Create an instance of the ktx module',['../libktx_js.html#autotoc_md3',1,'']]], + ['an_20instance_20of_20the_20msc_5ftranscoder_20module_3',['Create an instance of the MSC_TRANSCODER module',['../msc_basis_transcoder.html#autotoc_md8',1,'']]], + ['and_20using_20an_20existing_20ktx_20texture_4',['Downloading and using an existing KTX texture.',['../libktx_js.html#autotoc_md4',1,'']]], + ['authors_5',['Authors',['../../authors.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_1.js b/ktx/build/docs/html/ktxjswrappers/search/all_1.js new file mode 100644 index 0000000..c0d0237 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['basis_20universal_20image_20transcoder_20binding_0',['Basis Universal Image Transcoder binding',['../msc_basis_transcoder.html',1,'index']]], + ['binding_1',['libktx Binding',['../libktx_js.html',1,'index']]], + ['binding_2',['binding',['../msc_basis_transcoder.html',1,'Basis Universal Image Transcoder binding'],['../libktx_js.html#autotoc_md1',1,'WebIDL for the binding'],['../msc_basis_transcoder.html#autotoc_md6',1,'WebIDL for the binding']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_10.js b/ktx/build/docs/html/ktxjswrappers/search/all_10.js new file mode 100644 index 0000000..dce25ec --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['somewhere_20in_20the_20loader_20transcoder_1',['Somewhere in the loader/transcoder',['../msc_basis_transcoder.html#autotoc_md9',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_11.js b/ktx/build/docs/html/ktxjswrappers/search/all_11.js new file mode 100644 index 0000000..b06ea90 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_11.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['texture_0',['texture',['../libktx_js.html#autotoc_md5',1,'Creating a new KTX texture'],['../libktx_js.html#autotoc_md4',1,'Downloading and using an existing KTX texture.']]], + ['the_20binding_1',['the binding',['../libktx_js.html#autotoc_md1',1,'WebIDL for the binding'],['../msc_basis_transcoder.html#autotoc_md6',1,'WebIDL for the binding']]], + ['the_20khronosgroup_20ktx_20software_20project_2',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['the_20ktx_20module_3',['Create an instance of the ktx module',['../libktx_js.html#autotoc_md3',1,'']]], + ['the_20loader_20transcoder_4',['Somewhere in the loader/transcoder',['../msc_basis_transcoder.html#autotoc_md9',1,'']]], + ['the_20msc_5ftranscoder_20module_5',['Create an instance of the MSC_TRANSCODER module',['../msc_basis_transcoder.html#autotoc_md8',1,'']]], + ['to_20use_6',['to use',['../libktx_js.html#autotoc_md2',1,'How to use'],['../msc_basis_transcoder.html#autotoc_md7',1,'How to use']]], + ['transcoder_7',['Somewhere in the loader/transcoder',['../msc_basis_transcoder.html#autotoc_md9',1,'']]], + ['transcoder_20binding_8',['Basis Universal Image Transcoder binding',['../msc_basis_transcoder.html',1,'index']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_12.js b/ktx/build/docs/html/ktxjswrappers/search/all_12.js new file mode 100644 index 0000000..99b0067 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_12.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['universal_20image_20transcoder_20binding_0',['Basis Universal Image Transcoder binding',['../msc_basis_transcoder.html',1,'index']]], + ['use_1',['use',['../libktx_js.html#autotoc_md2',1,'How to use'],['../msc_basis_transcoder.html#autotoc_md7',1,'How to use']]], + ['using_20an_20existing_20ktx_20texture_2',['Downloading and using an existing KTX texture.',['../libktx_js.html#autotoc_md4',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_13.js b/ktx/build/docs/html/ktxjswrappers/search/all_13.js new file mode 100644 index 0000000..fb502ef --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_13.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['webidl_20for_20the_20binding_0',['WebIDL for the binding',['../libktx_js.html#autotoc_md1',1,'WebIDL for the binding'],['../msc_basis_transcoder.html#autotoc_md6',1,'WebIDL for the binding']]], + ['wrappers_20reference_1',['KTX Javascript Wrappers Reference',['../index.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_2.js b/ktx/build/docs/html/ktxjswrappers/search/all_2.js new file mode 100644 index 0000000..999f8ec --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['create_20an_20instance_20of_20the_20ktx_20module_0',['Create an instance of the ktx module',['../libktx_js.html#autotoc_md3',1,'']]], + ['create_20an_20instance_20of_20the_20msc_5ftranscoder_20module_1',['Create an instance of the MSC_TRANSCODER module',['../msc_basis_transcoder.html#autotoc_md8',1,'']]], + ['creating_20a_20new_20ktx_20texture_2',['Creating a new KTX texture',['../libktx_js.html#autotoc_md5',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_3.js b/ktx/build/docs/html/ktxjswrappers/search/all_3.js new file mode 100644 index 0000000..f3b9243 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['downloading_20and_20using_20an_20existing_20ktx_20texture_0',['Downloading and using an existing KTX texture.',['../libktx_js.html#autotoc_md4',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_4.js b/ktx/build/docs/html/ktxjswrappers/search/all_4.js new file mode 100644 index 0000000..f5e376d --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['existing_20ktx_20texture_0',['Downloading and using an existing KTX texture.',['../libktx_js.html#autotoc_md4',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_5.js b/ktx/build/docs/html/ktxjswrappers/search/all_5.js new file mode 100644 index 0000000..4af7da9 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['file_20for_20the_20khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['for_20the_20binding_1',['for the binding',['../libktx_js.html#autotoc_md1',1,'WebIDL for the binding'],['../msc_basis_transcoder.html#autotoc_md6',1,'WebIDL for the binding']]], + ['for_20the_20khronosgroup_20ktx_20software_20project_2',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_6.js b/ktx/build/docs/html/ktxjswrappers/search/all_6.js new file mode 100644 index 0000000..cfee0d1 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['how_20to_20use_0',['How to use',['../libktx_js.html#autotoc_md2',1,'How to use'],['../msc_basis_transcoder.html#autotoc_md7',1,'How to use']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_7.js b/ktx/build/docs/html/ktxjswrappers/search/all_7.js new file mode 100644 index 0000000..cc68305 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_7.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['image_20transcoder_20binding_0',['Basis Universal Image Transcoder binding',['../msc_basis_transcoder.html',1,'index']]], + ['in_20the_20loader_20transcoder_1',['Somewhere in the loader/transcoder',['../msc_basis_transcoder.html#autotoc_md9',1,'']]], + ['instance_20of_20the_20ktx_20module_2',['Create an instance of the ktx module',['../libktx_js.html#autotoc_md3',1,'']]], + ['instance_20of_20the_20msc_5ftranscoder_20module_3',['Create an instance of the MSC_TRANSCODER module',['../msc_basis_transcoder.html#autotoc_md8',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_8.js b/ktx/build/docs/html/ktxjswrappers/search/all_8.js new file mode 100644 index 0000000..b77afa8 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['javascript_20wrappers_20reference_0',['KTX Javascript Wrappers Reference',['../index.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_9.js b/ktx/build/docs/html/ktxjswrappers/search/all_9.js new file mode 100644 index 0000000..beeb5f7 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_9.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['ktx_20javascript_20wrappers_20reference_1',['KTX Javascript Wrappers Reference',['../index.html',1,'']]], + ['ktx_20module_2',['Create an instance of the ktx module',['../libktx_js.html#autotoc_md3',1,'']]], + ['ktx_20software_20project_3',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['ktx_20texture_4',['KTX texture',['../libktx_js.html#autotoc_md5',1,'Creating a new KTX texture'],['../libktx_js.html#autotoc_md4',1,'Downloading and using an existing KTX texture.']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_a.js b/ktx/build/docs/html/ktxjswrappers/search/all_a.js new file mode 100644 index 0000000..1538017 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['libktx_20binding_0',['libktx Binding',['../libktx_js.html',1,'index']]], + ['license_20file_20for_20the_20khronosgroup_20ktx_20software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['loader_20transcoder_2',['Somewhere in the loader/transcoder',['../msc_basis_transcoder.html#autotoc_md9',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_b.js b/ktx/build/docs/html/ktxjswrappers/search/all_b.js new file mode 100644 index 0000000..75ab102 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['module_0',['module',['../libktx_js.html#autotoc_md3',1,'Create an instance of the ktx module'],['../msc_basis_transcoder.html#autotoc_md8',1,'Create an instance of the MSC_TRANSCODER module']]], + ['msc_5ftranscoder_20module_1',['Create an instance of the MSC_TRANSCODER module',['../msc_basis_transcoder.html#autotoc_md8',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_c.js b/ktx/build/docs/html/ktxjswrappers/search/all_c.js new file mode 100644 index 0000000..6f9c0ef --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['new_20ktx_20texture_0',['Creating a new KTX texture',['../libktx_js.html#autotoc_md5',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_d.js b/ktx/build/docs/html/ktxjswrappers/search/all_d.js new file mode 100644 index 0000000..1a04d2b --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_d.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['of_20the_20ktx_20module_0',['Create an instance of the ktx module',['../libktx_js.html#autotoc_md3',1,'']]], + ['of_20the_20msc_5ftranscoder_20module_1',['Create an instance of the MSC_TRANSCODER module',['../msc_basis_transcoder.html#autotoc_md8',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_e.js b/ktx/build/docs/html/ktxjswrappers/search/all_e.js new file mode 100644 index 0000000..ad8f0af --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/all_f.js b/ktx/build/docs/html/ktxjswrappers/search/all_f.js new file mode 100644 index 0000000..271b631 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/all_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['reference_0',['KTX Javascript Wrappers Reference',['../index.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_0.js b/ktx/build/docs/html/ktxjswrappers/search/pages_0.js new file mode 100644 index 0000000..a3789f0 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['a_20new_20ktx_20texture_0',['Creating a new KTX texture',['../libktx_js.html#autotoc_md5',1,'']]], + ['an_20existing_20ktx_20texture_1',['Downloading and using an existing KTX texture.',['../libktx_js.html#autotoc_md4',1,'']]], + ['an_20instance_20of_20the_20ktx_20module_2',['Create an instance of the ktx module',['../libktx_js.html#autotoc_md3',1,'']]], + ['an_20instance_20of_20the_20msc_5ftranscoder_20module_3',['Create an instance of the MSC_TRANSCODER module',['../msc_basis_transcoder.html#autotoc_md8',1,'']]], + ['and_20using_20an_20existing_20ktx_20texture_4',['Downloading and using an existing KTX texture.',['../libktx_js.html#autotoc_md4',1,'']]], + ['authors_5',['Authors',['../../authors.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_1.js b/ktx/build/docs/html/ktxjswrappers/search/pages_1.js new file mode 100644 index 0000000..c0d0237 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['basis_20universal_20image_20transcoder_20binding_0',['Basis Universal Image Transcoder binding',['../msc_basis_transcoder.html',1,'index']]], + ['binding_1',['libktx Binding',['../libktx_js.html',1,'index']]], + ['binding_2',['binding',['../msc_basis_transcoder.html',1,'Basis Universal Image Transcoder binding'],['../libktx_js.html#autotoc_md1',1,'WebIDL for the binding'],['../msc_basis_transcoder.html#autotoc_md6',1,'WebIDL for the binding']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_10.js b/ktx/build/docs/html/ktxjswrappers/search/pages_10.js new file mode 100644 index 0000000..dce25ec --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['somewhere_20in_20the_20loader_20transcoder_1',['Somewhere in the loader/transcoder',['../msc_basis_transcoder.html#autotoc_md9',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_11.js b/ktx/build/docs/html/ktxjswrappers/search/pages_11.js new file mode 100644 index 0000000..b06ea90 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_11.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['texture_0',['texture',['../libktx_js.html#autotoc_md5',1,'Creating a new KTX texture'],['../libktx_js.html#autotoc_md4',1,'Downloading and using an existing KTX texture.']]], + ['the_20binding_1',['the binding',['../libktx_js.html#autotoc_md1',1,'WebIDL for the binding'],['../msc_basis_transcoder.html#autotoc_md6',1,'WebIDL for the binding']]], + ['the_20khronosgroup_20ktx_20software_20project_2',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['the_20ktx_20module_3',['Create an instance of the ktx module',['../libktx_js.html#autotoc_md3',1,'']]], + ['the_20loader_20transcoder_4',['Somewhere in the loader/transcoder',['../msc_basis_transcoder.html#autotoc_md9',1,'']]], + ['the_20msc_5ftranscoder_20module_5',['Create an instance of the MSC_TRANSCODER module',['../msc_basis_transcoder.html#autotoc_md8',1,'']]], + ['to_20use_6',['to use',['../libktx_js.html#autotoc_md2',1,'How to use'],['../msc_basis_transcoder.html#autotoc_md7',1,'How to use']]], + ['transcoder_7',['Somewhere in the loader/transcoder',['../msc_basis_transcoder.html#autotoc_md9',1,'']]], + ['transcoder_20binding_8',['Basis Universal Image Transcoder binding',['../msc_basis_transcoder.html',1,'index']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_12.js b/ktx/build/docs/html/ktxjswrappers/search/pages_12.js new file mode 100644 index 0000000..99b0067 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_12.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['universal_20image_20transcoder_20binding_0',['Basis Universal Image Transcoder binding',['../msc_basis_transcoder.html',1,'index']]], + ['use_1',['use',['../libktx_js.html#autotoc_md2',1,'How to use'],['../msc_basis_transcoder.html#autotoc_md7',1,'How to use']]], + ['using_20an_20existing_20ktx_20texture_2',['Downloading and using an existing KTX texture.',['../libktx_js.html#autotoc_md4',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_13.js b/ktx/build/docs/html/ktxjswrappers/search/pages_13.js new file mode 100644 index 0000000..fb502ef --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_13.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['webidl_20for_20the_20binding_0',['WebIDL for the binding',['../libktx_js.html#autotoc_md1',1,'WebIDL for the binding'],['../msc_basis_transcoder.html#autotoc_md6',1,'WebIDL for the binding']]], + ['wrappers_20reference_1',['KTX Javascript Wrappers Reference',['../index.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_2.js b/ktx/build/docs/html/ktxjswrappers/search/pages_2.js new file mode 100644 index 0000000..999f8ec --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['create_20an_20instance_20of_20the_20ktx_20module_0',['Create an instance of the ktx module',['../libktx_js.html#autotoc_md3',1,'']]], + ['create_20an_20instance_20of_20the_20msc_5ftranscoder_20module_1',['Create an instance of the MSC_TRANSCODER module',['../msc_basis_transcoder.html#autotoc_md8',1,'']]], + ['creating_20a_20new_20ktx_20texture_2',['Creating a new KTX texture',['../libktx_js.html#autotoc_md5',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_3.js b/ktx/build/docs/html/ktxjswrappers/search/pages_3.js new file mode 100644 index 0000000..f3b9243 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['downloading_20and_20using_20an_20existing_20ktx_20texture_0',['Downloading and using an existing KTX texture.',['../libktx_js.html#autotoc_md4',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_4.js b/ktx/build/docs/html/ktxjswrappers/search/pages_4.js new file mode 100644 index 0000000..f5e376d --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['existing_20ktx_20texture_0',['Downloading and using an existing KTX texture.',['../libktx_js.html#autotoc_md4',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_5.js b/ktx/build/docs/html/ktxjswrappers/search/pages_5.js new file mode 100644 index 0000000..4af7da9 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['file_20for_20the_20khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['for_20the_20binding_1',['for the binding',['../libktx_js.html#autotoc_md1',1,'WebIDL for the binding'],['../msc_basis_transcoder.html#autotoc_md6',1,'WebIDL for the binding']]], + ['for_20the_20khronosgroup_20ktx_20software_20project_2',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_6.js b/ktx/build/docs/html/ktxjswrappers/search/pages_6.js new file mode 100644 index 0000000..cfee0d1 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['how_20to_20use_0',['How to use',['../libktx_js.html#autotoc_md2',1,'How to use'],['../msc_basis_transcoder.html#autotoc_md7',1,'How to use']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_7.js b/ktx/build/docs/html/ktxjswrappers/search/pages_7.js new file mode 100644 index 0000000..cc68305 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_7.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['image_20transcoder_20binding_0',['Basis Universal Image Transcoder binding',['../msc_basis_transcoder.html',1,'index']]], + ['in_20the_20loader_20transcoder_1',['Somewhere in the loader/transcoder',['../msc_basis_transcoder.html#autotoc_md9',1,'']]], + ['instance_20of_20the_20ktx_20module_2',['Create an instance of the ktx module',['../libktx_js.html#autotoc_md3',1,'']]], + ['instance_20of_20the_20msc_5ftranscoder_20module_3',['Create an instance of the MSC_TRANSCODER module',['../msc_basis_transcoder.html#autotoc_md8',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_8.js b/ktx/build/docs/html/ktxjswrappers/search/pages_8.js new file mode 100644 index 0000000..b77afa8 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['javascript_20wrappers_20reference_0',['KTX Javascript Wrappers Reference',['../index.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_9.js b/ktx/build/docs/html/ktxjswrappers/search/pages_9.js new file mode 100644 index 0000000..beeb5f7 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_9.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['ktx_20javascript_20wrappers_20reference_1',['KTX Javascript Wrappers Reference',['../index.html',1,'']]], + ['ktx_20module_2',['Create an instance of the ktx module',['../libktx_js.html#autotoc_md3',1,'']]], + ['ktx_20software_20project_3',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['ktx_20texture_4',['KTX texture',['../libktx_js.html#autotoc_md5',1,'Creating a new KTX texture'],['../libktx_js.html#autotoc_md4',1,'Downloading and using an existing KTX texture.']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_a.js b/ktx/build/docs/html/ktxjswrappers/search/pages_a.js new file mode 100644 index 0000000..1538017 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['libktx_20binding_0',['libktx Binding',['../libktx_js.html',1,'index']]], + ['license_20file_20for_20the_20khronosgroup_20ktx_20software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['loader_20transcoder_2',['Somewhere in the loader/transcoder',['../msc_basis_transcoder.html#autotoc_md9',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_b.js b/ktx/build/docs/html/ktxjswrappers/search/pages_b.js new file mode 100644 index 0000000..75ab102 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['module_0',['module',['../libktx_js.html#autotoc_md3',1,'Create an instance of the ktx module'],['../msc_basis_transcoder.html#autotoc_md8',1,'Create an instance of the MSC_TRANSCODER module']]], + ['msc_5ftranscoder_20module_1',['Create an instance of the MSC_TRANSCODER module',['../msc_basis_transcoder.html#autotoc_md8',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_c.js b/ktx/build/docs/html/ktxjswrappers/search/pages_c.js new file mode 100644 index 0000000..6f9c0ef --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['new_20ktx_20texture_0',['Creating a new KTX texture',['../libktx_js.html#autotoc_md5',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_d.js b/ktx/build/docs/html/ktxjswrappers/search/pages_d.js new file mode 100644 index 0000000..1a04d2b --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_d.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['of_20the_20ktx_20module_0',['Create an instance of the ktx module',['../libktx_js.html#autotoc_md3',1,'']]], + ['of_20the_20msc_5ftranscoder_20module_1',['Create an instance of the MSC_TRANSCODER module',['../msc_basis_transcoder.html#autotoc_md8',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_e.js b/ktx/build/docs/html/ktxjswrappers/search/pages_e.js new file mode 100644 index 0000000..ad8f0af --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/pages_f.js b/ktx/build/docs/html/ktxjswrappers/search/pages_f.js new file mode 100644 index 0000000..271b631 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/pages_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['reference_0',['KTX Javascript Wrappers Reference',['../index.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxjswrappers/search/search.css b/ktx/build/docs/html/ktxjswrappers/search/search.css new file mode 100644 index 0000000..043d32d --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/search.css @@ -0,0 +1,377 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
      • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 43px; + margin-right: 0; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + border: 1px solid var(--search-box-border-color); + z-index: 102; + margin-right: 4px; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.6em; +} + +#MSearchField { + display: inline-block; + vertical-align: top; + width: 7.5em; + height: 22px; + margin: 0 0 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.6em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + margin: 6px 0 0 4px; +} + +.close-icon { + width: 11px; + height: 11px; + background-color: var(--search-close-icon-bg-color); + border-radius: 50%; + position: relative; + display: flex; + justify-content: center; + align-items: center; + box-sizing: content-box; +} + +.close-icon:before, +.close-icon:after { + content: ''; + position: absolute; + width: 7px; + height: 1px; + background-color: var(--search-close-icon-fg-color); +} + +.close-icon:before { + transform: rotate(45deg); +} + +.close-icon:after { + transform: rotate(-45deg); +} + + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + +.search-icon { + width: 20px; + height: 20px; + display: inline-block; + position: relative; + margin-left: 3px; +} + +#MSearchSelectExt.search-icon { + width: 10px; +} + +#MSearchSelectExt + input { + margin-left: 5px; +} + +.search-icon::before, .search-icon::after { + content: ''; + position: absolute; + border: 1.5px solid var(--search-foreground-color); + box-sizing: content-box; +} + +.search-icon::before { + width: 6px; + height: 6px; + border-radius: 50%; + top: 7px; + left: 2px; + background: var(--search-background-color); +} + +.search-icon::after { + border: 1px solid var(--search-foreground-color); + width: 0px; + height: 3px; + border-radius: 2px; + top: 15px; + left: 8px; + transform: rotate(-45deg); + transform-origin: top left; +} + +.search-icon-dropdown { + content: ''; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 3px solid var(--search-foreground-color); + top: 8px; + left: 15px; + transform: translateX(-50%); + position: absolute; +} + + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + backdrop-filter: var(--search-filter-backdrop-filter); + -webkit-backdrop-filter: var(--search-filter-backdrop-filter); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + border-radius: 4px; +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: auto; + right: 4px; + top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + backdrop-filter: var(--search-results-backdrop-filter); + -webkit-backdrop-filter: var(--search-results-backdrop-filter); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; + border-radius: 8px; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResults; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); +} + + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 10pt; + padding: 2px 5px; +} + +div.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +#searchBoxPos1 dark-mode-toggle { + margin-top: 4px; +} + +/*---------------- External search page results */ + +.pages b { + color: var(--nav-foreground-color); + padding: 5px 5px 3px 5px; + background-color: var(--nav-menu-active-bg); + border-radius: 4px; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/ktx/build/docs/html/ktxjswrappers/search/search.js b/ktx/build/docs/html/ktxjswrappers/search/search.js new file mode 100644 index 0000000..dc14410 --- /dev/null +++ b/ktx/build/docs/html/ktxjswrappers/search/search.js @@ -0,0 +1,708 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const decodeHtml = (html) => { + const txt = document.createElement("textarea"); + txt.innerHTML = html; + return txt.value; + }; + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = decodeHtml(elem[1][0]); + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + if (elem[1][1][0].startsWith('http://') || elem[1][1][0].startsWith('https://')) { // absolute path + srLink.setAttribute('href',elem[1][1][0]); + } else { // relative path + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + } + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = decodeHtml(elem[1][1][2]); + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; cli>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-color:var(--nav-menu-background-color)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;line-height:36px;text-decoration:none;color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-color:var(--nav-menu-background-color);line-height:36px}.sm-dox a span.sub-arrow{top:15px;right:10px;box-sizing:content-box;padding:0;margin:0;display:inline-block;width:5px;height:5px;background-color:var(--nav-menu-background-color);border-right:2px solid var(--nav-arrow-color);border-bottom:2px solid var(--nav-arrow-color);transform:rotate(45deg);-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 6px}.sm-dox a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px !important}.sm-dox a:hover span.sub-arrow{background-color:var(--nav-menu-active-bg);border-right:2px solid var(--nav-arrow-selected-color);border-bottom:2px solid var(--nav-arrow-selected-color)}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0;padding:3px}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{transform:rotate(-45deg)}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:6px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:6px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/ktx/build/docs/html/ktxtools/clipboard.js b/ktx/build/docs/html/ktxtools/clipboard.js new file mode 100644 index 0000000..9da9f3c --- /dev/null +++ b/ktx/build/docs/html/ktxtools/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/ktx/build/docs/html/ktxtools/cookie.js b/ktx/build/docs/html/ktxtools/cookie.js new file mode 100644 index 0000000..53ad21d --- /dev/null +++ b/ktx/build/docs/html/ktxtools/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/ktx/build/docs/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8.html b/ktx/build/docs/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8.html new file mode 100644 index 0000000..96bf500 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8.html @@ -0,0 +1,123 @@ + + + + + + + +KTX Tools Reference: ktxinfo Directory Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        KTX Tools Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxinfo Directory Reference
        +
        +
        +
        +Directory dependency graph for ktxinfo:
        +
        +
        ktxinfo
        + + + + +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8_dep.map b/ktx/build/docs/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8_dep.map new file mode 100644 index 0000000..ff6c5c5 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8_dep.md5 b/ktx/build/docs/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8_dep.md5 new file mode 100644 index 0000000..54fd5df --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8_dep.md5 @@ -0,0 +1 @@ +ce8c352f96bd3948a7d651256deaf600 \ No newline at end of file diff --git a/ktx/build/docs/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8_dep.png b/ktx/build/docs/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8_dep.png new file mode 100644 index 0000000..1fdf9c8 Binary files /dev/null and b/ktx/build/docs/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8_dep.png differ diff --git a/ktx/build/docs/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b.html b/ktx/build/docs/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b.html new file mode 100644 index 0000000..e667e30 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b.html @@ -0,0 +1,123 @@ + + + + + + + +KTX Tools Reference: ktx2check Directory Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        KTX Tools Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktx2check Directory Reference
        +
        +
        +
        +Directory dependency graph for ktx2check:
        +
        +
        ktx2check
        + + + + +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b_dep.map b/ktx/build/docs/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b_dep.map new file mode 100644 index 0000000..8ed8267 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b_dep.md5 b/ktx/build/docs/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b_dep.md5 new file mode 100644 index 0000000..f0b8746 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b_dep.md5 @@ -0,0 +1 @@ +b3efd5d47f27138e50cb5364def773c1 \ No newline at end of file diff --git a/ktx/build/docs/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b_dep.png b/ktx/build/docs/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b_dep.png new file mode 100644 index 0000000..0d83d76 Binary files /dev/null and b/ktx/build/docs/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b_dep.png differ diff --git a/ktx/build/docs/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011.html b/ktx/build/docs/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011.html new file mode 100644 index 0000000..8fdd532 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011.html @@ -0,0 +1,123 @@ + + + + + + + +KTX Tools Reference: toktx Directory Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        KTX Tools Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        toktx Directory Reference
        +
        +
        +
        +Directory dependency graph for toktx:
        +
        +
        toktx
        + + + + +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011_dep.map b/ktx/build/docs/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011_dep.map new file mode 100644 index 0000000..ae2ebe4 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011_dep.md5 b/ktx/build/docs/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011_dep.md5 new file mode 100644 index 0000000..8420810 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011_dep.md5 @@ -0,0 +1 @@ +1605f7f267f1bb56ea167e3d0796d799 \ No newline at end of file diff --git a/ktx/build/docs/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011_dep.png b/ktx/build/docs/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011_dep.png new file mode 100644 index 0000000..1da5832 Binary files /dev/null and b/ktx/build/docs/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011_dep.png differ diff --git a/ktx/build/docs/html/ktxtools/dir_4eeb864c4eec08c7d6b9d3b0352cfdde.html b/ktx/build/docs/html/ktxtools/dir_4eeb864c4eec08c7d6b9d3b0352cfdde.html new file mode 100644 index 0000000..6987b36 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_4eeb864c4eec08c7d6b9d3b0352cfdde.html @@ -0,0 +1,124 @@ + + + + + + + +KTX Tools Reference: tools Directory Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        KTX Tools Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        tools Directory Reference
        +
        +
        + + + + + + + + +

        +Directories

         
        ktx
         
        ktx2check
         
        ktx2ktx2
         
        ktxinfo
         
        ktxsc
         
        toktx
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660.html b/ktx/build/docs/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660.html new file mode 100644 index 0000000..d112e2d --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660.html @@ -0,0 +1,123 @@ + + + + + + + +KTX Tools Reference: ktxsc Directory Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        KTX Tools Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxsc Directory Reference
        +
        +
        +
        +Directory dependency graph for ktxsc:
        +
        +
        ktxsc
        + + + + +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660_dep.map b/ktx/build/docs/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660_dep.map new file mode 100644 index 0000000..db23617 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660_dep.md5 b/ktx/build/docs/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660_dep.md5 new file mode 100644 index 0000000..3a9f658 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660_dep.md5 @@ -0,0 +1 @@ +a69d024dd6efc87531a251f5fc869f01 \ No newline at end of file diff --git a/ktx/build/docs/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660_dep.png b/ktx/build/docs/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660_dep.png new file mode 100644 index 0000000..f477028 Binary files /dev/null and b/ktx/build/docs/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660_dep.png differ diff --git a/ktx/build/docs/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22.html b/ktx/build/docs/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22.html new file mode 100644 index 0000000..37e1b5b --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22.html @@ -0,0 +1,123 @@ + + + + + + + +KTX Tools Reference: ktx2ktx2 Directory Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        KTX Tools Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktx2ktx2 Directory Reference
        +
        +
        +
        +Directory dependency graph for ktx2ktx2:
        +
        +
        ktx2ktx2
        + + + + +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22_dep.map b/ktx/build/docs/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22_dep.map new file mode 100644 index 0000000..5461c47 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22_dep.md5 b/ktx/build/docs/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22_dep.md5 new file mode 100644 index 0000000..54f8178 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22_dep.md5 @@ -0,0 +1 @@ +55974e449aae0000f1a16547bcf601b9 \ No newline at end of file diff --git a/ktx/build/docs/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22_dep.png b/ktx/build/docs/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22_dep.png new file mode 100644 index 0000000..5fa62df Binary files /dev/null and b/ktx/build/docs/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22_dep.png differ diff --git a/ktx/build/docs/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771.html b/ktx/build/docs/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771.html new file mode 100644 index 0000000..d57ba92 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771.html @@ -0,0 +1,123 @@ + + + + + + + +KTX Tools Reference: ktx Directory Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        KTX Tools Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktx Directory Reference
        +
        +
        +
        +Directory dependency graph for ktx:
        +
        +
        ktx
        + + + + +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771_dep.map b/ktx/build/docs/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771_dep.map new file mode 100644 index 0000000..1bb9a5d --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/ktx/build/docs/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771_dep.md5 b/ktx/build/docs/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771_dep.md5 new file mode 100644 index 0000000..e997aca --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771_dep.md5 @@ -0,0 +1 @@ +aa354c48e6ce4863fea989ac7c1ebd78 \ No newline at end of file diff --git a/ktx/build/docs/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771_dep.png b/ktx/build/docs/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771_dep.png new file mode 100644 index 0000000..3ba2df4 Binary files /dev/null and b/ktx/build/docs/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771_dep.png differ diff --git a/ktx/build/docs/html/ktxtools/doxygen.css b/ktx/build/docs/html/ktxtools/doxygen.css new file mode 100644 index 0000000..971d91b --- /dev/null +++ b/ktx/build/docs/html/ktxtools/doxygen.css @@ -0,0 +1,2547 @@ +/* The standard CSS for doxygen 1.16.1*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #3D578C; +--page-external-link-color: #334975; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--group-header-separator-color: #D9E0EE; +--group-header-color: #354C7B; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 75px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #C4CFE5; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #C4CFE5; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-folder-open-fill-color: #C4CFE5; +--icon-folder-fill-color: #D8DFEE; +--icon-folder-border-color: #4665A2; +--icon-doc-fill-color: #D8DFEE; +--icon-doc-border-color: #4665A2; + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; +--memdecl-border-color: #D5DDEC; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-proto-background-color: #EEF1F7; +--memdef-proto-text-color: #253555; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-border-color: #C4CFE5; +--nav-breadcrumb-separator-color: #C4CFE5; +--nav-breadcrumb-active-bg: #EEF1F7; +--nav-breadcrumb-color: #354C7B; +--nav-splitbar-bg-color: #DCE2EF; +--nav-splitbar-handle-color: #9CAFD4; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-active-bg: #DCE2EF; +--nav-menu-active-color: #9CAFD4; +--nav-arrow-color: #B6C4DF; +--nav-arrow-selected-color: #90A5CE; + +/* sync icon */ +--sync-icon-border-color: #C4CFE5; +--sync-icon-background-color: #F9FAFC; +--sync-icon-selected-background-color: #EEF1F7; +--sync-icon-color: #C4CFE5; +--sync-icon-selected-color: #6884BD; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-active-color: black; +--search-filter-background-color: rgba(255,255,255,.7); +--search-filter-backdrop-filter: blur(4px); +--search-filter-foreground-color: black; +--search-filter-border-color: rgba(150,150,150,.4); +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: rgba(255,255,255,.8); +--search-results-backdrop-filter: blur(4px); +--search-results-border-color: rgba(150,150,150,.4); +--search-box-border-color: #B6C4DF; +--search-close-icon-bg-color: #A0A0A0; +--search-close-icon-fg-color: white; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--fragment-highlight-filter: -3; +--tooltip-foreground-color: black; +--tooltip-background-color: rgba(255,255,255,0.8); +--tooltip-arrow-background-color: white; +--tooltip-border-color: rgba(150,150,150,0.7); +--tooltip-backdrop-filter: blur(3px); +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 0 4px 8px 0 rgba(0,0,0,.25); +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; +--satisfies-color-hl: #b61825; +--satisfies-color-bg: #f8d1cc; +--verifies-color-hl: #b61825; +--verifies-color-bg: #f8d1cc; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #90A5CE; +--page-external-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--group-header-separator-color: #1D2A43; +--group-header-color: #90A5CE; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #212F4B; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #2C3F65; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-folder-open-fill-color: #4665A2; +--icon-folder-fill-color: #5373B4; +--icon-folder-border-color: #C4CFE5; +--icon-doc-fill-color: #6884BD; +--icon-doc-border-color: #C4CFE5; + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; +--memdecl-border-color: #233250; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-border-color: #212F4B; +--nav-breadcrumb-separator-color: #212F4B; +--nav-breadcrumb-active-bg: #1D2A43; +--nav-breadcrumb-color: #90A5CE; +--nav-splitbar-bg-color: #283A5D; +--nav-splitbar-handle-color: #4665A2; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-active-bg: #1D2A43; +--nav-menu-active-color: #C9D3E7; +--nav-arrow-color: #4665A2; +--nav-arrow-selected-color: #6884BD; + +/* sync icon */ +--sync-icon-border-color: #212F4B; +--sync-icon-background-color: #101826; +--sync-icon-selected-background-color: #1D2A43; +--sync-icon-color: #4665A2; +--sync-icon-selected-color: #5373B4; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-active-color: #F5F5F5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-backdrop-filter: none; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: black; +--search-results-foreground-color: #90A5CE; +--search-results-backdrop-filter: none; +--search-results-border-color: #334975; +--search-box-border-color: #334975; +--search-close-icon-bg-color: #909090; +--search-close-icon-fg-color: black; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: #090D16; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--fragment-highlight-filter: 5; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-arrow-background-color: #202020; +--tooltip-backdrop-filter: none; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; +--satisfies-color-hl: #ad2617; +--satisfies-color-bg: #2e1917; +--verifies-color-hl: #ad2617; +--verifies-color-bg: #2e1917; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +body.resizing { + user-select: none; + -webkit-user-select: none; +} + +#doc-content { + scrollbar-width: thin; +} + +/* @group Heading Levels */ + +.title { + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 160%; + font-weight: 400; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + box-shadow: 12px 0 var(--page-background-color), + -12px 0 var(--page-background-color), + 12px 1px var(--group-header-separator-color), + -12px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +td h2.groupheader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; + margin-bottom: 0px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + margin-right: 6px; + padding-right: 6px; + text-align: right; + line-height: 110%; + background-color: var(--nav-background-color); +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + padding-right: 6px; + padding-left: 6px; + border-radius: 0 6px 6px 0; + background-color: var(--nav-menu-active-bg); +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +span.label a:hover { + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.el, a.el:visited, a.code, a.code:visited, a.line, a.line:visited { + color: var(--page-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--page-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +div.embeddoc { + font-family: var(--font-family-monospace); + padding-left: 10px; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul.check { + list-style: none; + padding-left: 40px; + margin: 0; +} + +ul.check li { + position: relative; +} + +li.unchecked::before, li.checked::before { + position: absolute; + left: -18px; + top: 0; +} + +li.unchecked::before { + content: "☐"; +} + +li.checked::before { + content: "☑"; +} + +ul.check li > p { + display: inline; +} + +ul.check li > p:not(:first-child) { + display: block; +} + +ol { + text-indent: 0px; +} + +ul { + text-indent: 0px; + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +span.tt { + white-space: pre; + font-family: var(--font-family-monospace); + background-color: var(--fragment-background-color); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: hidden; + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .4; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: wrap; + word-break: break-all; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -62px; + padding-left: 62px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + display: inline-block; + width: 12px; + height: 12px; + margin-left: 4px; + margin-right: 1px; +} + +span.foldnone { + display: inline-block; + position: relative; + cursor: pointer; + user-select: none; +} + +span.fold.plus, span.fold.minus { + width: 10px; + height: 10px; + background-color: var(--fragment-background-color); + position: relative; + border: 1px solid var(--fold-line-color); + margin-right: 1px; +} + +span.fold.plus::before, span.fold.minus::before { + content: ''; + position: absolute; + background-color: var(--fold-line-color); +} + +span.fold.plus::before { + width: 2px; + height: 6px; + top: 2px; + left: 4px; +} + +span.fold.plus::after { + content: ''; + position: absolute; + width: 6px; + height: 2px; + top: 4px; + left: 2px; + background-color: var(--fold-line-color); +} + +span.fold.minus::before { + width: 6px; + height: 2px; + top: 4px; + left: 2px; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 110%; + font-weight: 500; + margin-left: 0px; + margin-top: 0em; + margin-bottom: 6px; + padding-top: 8px; + padding-bottom: 4px; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 12px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + border: none; + margin-top: 16px; + margin-bottom: 16px; + height: 1px; + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight { + padding-top: 2px; + padding-bottom: 2px; +} + +.memTemplParams { + padding-left: 10px; + padding-top: 5px; +} + +.memItemLeft, .memItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +tr[class^='memdesc'] { + box-shadow: inset 0px 1px 3px 0px rgba(0,0,0,.075); +} + +.mdescLeft { + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.mdescRight { + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; + border-left: 1px solid var(--memdecl-border-color); + border-right: 1px solid var(--memdecl-border-color); +} + +td.ititle { + border: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + padding-left: 10px; +} + +tr:not(:first-child) > td.ititle { + border-top: 0; + border-radius: 0; +} + +.memItemLeft { + white-space: nowrap; + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-left: 10px; + transition: none; + vertical-align: top; + text-align: right; +} + +.memItemRight { + width: 100%; + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-right: 10px; + transition: none; + vertical-align: bottom; +} + +tr.heading + tr[class^='memitem'] td.memItemLeft, +tr.groupHeader + tr[class^='memitem'] td.memItemLeft, +tr.inherit_header + tr[class^='memitem'] td.memItemLeft { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memItemRight, +tr.groupHeader + tr[class^='memitem'] td.memItemRight, +tr.inherit_header + tr[class^='memitem'] td.memItemRight { + border-top: 1px solid var(--memdecl-border-color); + border-top-right-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memTemplParams, +tr.heading + tr td.ititle, +tr.groupHeader + tr[class^='memitem'] td.memTemplParams, +tr.groupHeader + tr td.ititle, +tr.inherit_header + tr[class^='memitem'] td.memTemplParams { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemLeft, +table.memberdecls tr:last-child td.mdescLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescLeft { + border-bottom-left-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemRight, +table.memberdecls tr:last-child td.mdescRight, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemRight, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescRight { + border-bottom-right-radius: 4px; +} + +tr.template .memItemLeft, tr.template .memItemRight { + border-top: none; + padding-top: 0; +} + + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-color: var(--memdef-proto-background-color); + line-height: 1.25; + font-family: var(--font-family-monospace); + font-weight: 500; + font-size: 16px; + float:left; + box-shadow: 0 10px 0 -1px var(--memdef-proto-background-color), + 0 2px 8px 0 rgba(0,0,0,.075); + position: relative; +} + +.memtitle:after { + content: ''; + display: block; + background: var(--memdef-proto-background-color); + height: 10px; + bottom: -10px; + left: 0px; + right: -14px; + position: absolute; + border-top-right-radius: 6px; +} + +.permalink +{ + font-family: var(--font-family-monospace); + font-weight: 500; + line-height: 1.25; + font-size: 16px; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-family: var(--font-family-monospace); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + display: table !important; + width: 100%; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + border-radius: 4px; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-family: var(--font-family-monospace); + font-size: 13px; + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + background-color: var(--memdef-proto-background-color); + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; +} + +.paramname { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; +} + +.paramname em { + color: var(--memdef-param-name-color); + font-style: normal; + margin-right: 1px; +} + +.paramname .paramdefval { + font-family: var(--font-family-monospace); +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-background-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 14px; + transition: opacity 0.3s ease; +} + +span.arrowhead { + position: relative; + padding: 0; + margin: 0 0 0 2px; + display: inline-block; + width: 5px; + height: 5px; + border-right: 2px solid var(--nav-arrow-color); + border-bottom: 2px solid var(--nav-arrow-color); + transform: rotate(-45deg); + transition: transform 0.3s ease; +} + +span.arrowhead.opened { + transform: rotate(45deg); +} + +.selected span.arrowhead { + border-right: 2px solid var(--nav-arrow-selected-color); + border-bottom: 2px solid var(--nav-arrow-selected-color); +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfolder { + width: 24px; + height: 18px; + margin-top: 6px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.icondoc { + width: 24px; + height: 18px; + margin-top: 3px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.folder-icon { + width: 16px; + height: 11px; + background-color: var(--icon-folder-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 0 2px 2px 2px; + position: relative; + box-sizing: content-box; +} + +.folder-icon::after { + content: ''; + position: absolute; + top: 2px; + left: -1px; + width: 16px; + height: 7px; + background-color: var(--icon-folder-open-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 7px 7px 2px 2px; + transform-origin: top left; + opacity: 0; + transition: all 0.3s linear; +} + +.folder-icon::before { + content: ''; + position: absolute; + top: -3px; + left: -1px; + width: 6px; + height: 2px; + background-color: var(--icon-folder-fill-color); + border-top: 1px solid var(--icon-folder-border-color); + border-left: 1px solid var(--icon-folder-border-color); + border-right: 1px solid var(--icon-folder-border-color); + border-radius: 2px 2px 0 0; +} + +.folder-icon.open::after { + top: 3px; + opacity: 1; +} + +.doc-icon { + left: 6px; + width: 12px; + height: 16px; + background-color: var(--icon-doc-border-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: relative; + display: inline-block; +} +.doc-icon::before { + content: ""; + left: 1px; + top: 1px; + width: 10px; + height: 14px; + background-color: var(--icon-doc-fill-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: absolute; + box-sizing: border-box; +} +.doc-icon::after { + content: ""; + left: 7px; + top: 0px; + width: 3px; + height: 3px; + background-color: transparent; + position: absolute; + border: 1px solid var(--icon-doc-border-color); +} + + + + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +span.dynarrow { + position: relative; + display: inline-block; + width: 12px; + bottom: 1px; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fieldinit { + padding-top: 3px; + text-align: right; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +/* style requirements page */ + +div.req_title { + text-decoration-line: underline; + text-decoration-style: solid; + text-decoration-color: var(--table-cell-border-color); + text-decoration-thickness: 1px; + font-weight: bold; +} + +table.reqlist tr > td:first-child { + text-align: right; + font-weight: bold; +} + +div.missing_satisfies { + border-left: 8px solid var(--satisfies-color-hl); + border-radius: 4px; + background: var(--satisfies-color-bg); + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; +} + +div.missing_verifies { + border-left: 8px solid var(--verifies-color-hl); + border-radius: 4px; + background: var(--verifies-color-bg); + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; +} + +/* ----------- navigation breadcrumb styling ----------- */ + +#nav-path ul { + height: 30px; + line-height: 30px; + color: var(--nav-text-normal-color); + overflow: hidden; + margin: 0px; + padding-left: 4px; + background-image: none; + background: var(--page-background-color); + border-bottom: 1px solid var(--nav-breadcrumb-separator-color); + font-size: var(--nav-font-size-level1); + font-family: var(--font-family-nav); + position: relative; + z-index: 100; +} + +#main-nav { + border-bottom: 1px solid var(--nav-border-color); +} + +.navpath li { + list-style-type:none; + float:left; + color: var(--nav-foreground-color); +} + +.navpath li.footer { + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + font-size: 8pt; + color: var(--footer-foreground-color); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; + padding-left: 15px; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--nav-breadcrumb-color); + position: relative; + top: 0px; + height: 30px; + margin-right: -20px; +} + +#nav-path li.navelem:after { + content: ''; + display: inline-block; + position: relative; + top: 0; + right: -15px; + width: 30px; + height: 30px; + transform: scaleX(0.5) scale(0.707) rotate(45deg); + z-index: 10; + background: var(--page-background-color); + box-shadow: 2px -2px 0 2px var(--nav-breadcrumb-separator-color); + border-radius: 0 5px 0 50px; +} + +#nav-path li.navelem:first-child { + margin-left: -6px; +} + +#nav-path li.navelem:hover, +#nav-path li.navelem:hover:after { + background-color: var(--nav-breadcrumb-active-bg); +} + +/* ---------------------- */ + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + margin: 0px; + background-color: var(--header-background-color); + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl { + padding: 0 0 0 0; +} + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); +} + +dl.warning .tt, dl.attention .tt, dl.important .tt { + background-color: hsl(from var(--warning-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.note .tt, dl.remark .tt { + background-color: hsl(from var(--note-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.todo .tt { + background-color: hsl(from var(--todo-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.test .tt { + background-color: hsl(from var(--test-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug .tt { + background-color: hsl(from var(--bug-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.deprecated .tt { + background-color: hsl(from var(--deprecated-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); +} + +dl.invariant .tt, dl.pre .tt, dl.post .tt { + background-color: hsl(from var(--invariant-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0; + padding: 0; +} + +#side-nav #projectname +{ + font-size: 130%; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0 0 0 5px; + margin: 0px; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li[class^='level'] { + margin-left: 15px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.empty { + background-image: none; + margin-top: 0px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: 400; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0 2px 0; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 12px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + backdrop-filter: var(--tooltip-backdrop-filter); + -webkit-backdrop-filter: var(--tooltip-backdrop-filter); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd +{ + display: inline-block; +} +tt, code, kbd +{ + vertical-align: top; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + + +html { +--timestamp: 'Sun Jun 14 2026 18:00:57'; +} +span.timestamp { content: ' '; } +span.timestamp:before { content: var(--timestamp); } + +:root { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/ktx/build/docs/html/ktxtools/doxygen.svg b/ktx/build/docs/html/ktxtools/doxygen.svg new file mode 100644 index 0000000..79a7635 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/ktxtools/doxygen_crawl.html b/ktx/build/docs/html/ktxtools/doxygen_crawl.html new file mode 100644 index 0000000..55c9a14 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/doxygen_crawl.html @@ -0,0 +1,136 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/ktxtools/dynsections.js b/ktx/build/docs/html/ktxtools/dynsections.js new file mode 100644 index 0000000..0e15bd4 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/dynsections.js @@ -0,0 +1,191 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); +} + +let dynsection = { + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.slideUp('fast'); + summary.show(); + $(linkObj).find('.arrowhead').addClass('closed').removeClass('opened'); + } else { + content.slideDown('fast'); + summary.hide(); + $(linkObj).find('.arrowhead').removeClass('closed').addClass('opened'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').addClass('plus').removeClass('minus'); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/ktx/build/docs/html/ktxtools/graph_legend.html b/ktx/build/docs/html/ktxtools/graph_legend.html new file mode 100644 index 0000000..45d9d20 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/graph_legend.html @@ -0,0 +1,166 @@ + + + + + + + +KTX Tools Reference: Graph Legend + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        KTX Tools Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Graph Legend
        +
        +
        +

        This page explains how to interpret the graphs that are generated by doxygen.

        +

        Consider the following example:

        /*! Invisible class because of truncation */
        +
        class Invisible { };
        +
        +
        /*! Truncated class, inheritance relation is hidden */
        +
        class Truncated : public Invisible { };
        +
        +
        /* Class not documented with doxygen comments */
        +
        class Undocumented { };
        +
        +
        /*! Class that is inherited using public inheritance */
        +
        class PublicBase : public Truncated { };
        +
        +
        /*! A template class */
        +
        template<class T> class Templ { };
        +
        +
        /*! Class that is inherited using protected inheritance */
        +
        class ProtectedBase { };
        +
        +
        /*! Class that is inherited using private inheritance */
        +
        class PrivateBase { };
        +
        +
        /*! Class that is used by the Inherited class */
        +
        class Used { };
        +
        +
        /*! Super class that inherits a number of other classes */
        +
        class Inherited : public PublicBase,
        +
        protected ProtectedBase,
        +
        private PrivateBase,
        +
        public Undocumented,
        +
        public Templ<int>
        +
        {
        +
        private:
        +
        Used *m_usedClass;
        +
        };
        +

        This will result in the following graph:

        +

        The boxes in the above graph have the following meaning:

        +
          +
        • +A filled gray box represents the struct or class for which the graph is generated.
        • +
        • +A box with a black border denotes a documented struct or class.
        • +
        • +A box with a gray border denotes an undocumented struct or class.
        • +
        • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
        • +
        +

        The arrows have the following meaning:

        +
          +
        • +A blue arrow is used to visualize a public inheritance relation between two classes.
        • +
        • +A dark green arrow is used for protected inheritance.
        • +
        • +A dark red arrow is used for private inheritance.
        • +
        • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
        • +
        • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
        • +
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/ktxtools/graph_legend.md5 b/ktx/build/docs/html/ktxtools/graph_legend.md5 new file mode 100644 index 0000000..da515da --- /dev/null +++ b/ktx/build/docs/html/ktxtools/graph_legend.md5 @@ -0,0 +1 @@ +f74606a252eb303675caf37987d0b7af \ No newline at end of file diff --git a/ktx/build/docs/html/ktxtools/graph_legend.png b/ktx/build/docs/html/ktxtools/graph_legend.png new file mode 100644 index 0000000..0034e94 Binary files /dev/null and b/ktx/build/docs/html/ktxtools/graph_legend.png differ diff --git a/ktx/build/docs/html/ktxtools/index.html b/ktx/build/docs/html/ktxtools/index.html new file mode 100644 index 0000000..050e191 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/index.html @@ -0,0 +1,159 @@ + + + + + + + +KTX Tools Reference: KTX Tools Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        KTX Tools Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        KTX Tools Reference
        +
        +
        +

        There are two sets of tools: a new set with a unified front end, ktx, and an older set of individual tools. Both are documented here.

        +

        +ktx Overview

        +

        ktx includes the following tools:

        + + + + + + + + + + + + + + + + + + + + + +
        Tool Description Equivalent old tool
        ktx compare Compare two KTX2 files.
        ktx create Create a KTX2 file from various input files toktx
        ktx deflate Deflate (supercompress) a KTX2 file. ktxsc
        ktx extract Export selected images from a KTX2 file -
        ktx encode Encode a KTX2 file ktxsc
        ktx info Prints information about a KTX2 file ktxinfo
        ktx transcode Transcode a KTX2 file -
        ktx validate Validate a KTX2 file ktx2check
        ktx help Display help information about the ktx tools -
        +

        Equivalent old tools are deprecated and will be removed soon.

        +

        Some features of old tools are not currently available in the new equivalent.

        + + + + + +
        Old Tool New Tool Missing Features
        toktx create JPEG and NBPM input.
        +

        The command-line syntax and semantics differ from the old tools including, but not limited to:

        +
          +
        • KTX 1.0 files are not supported by the new tools.
        • +
        • Words in multi-word option names are connected with - instead of _.
        • +
        • Individual option names may differ between the old and new tools.
        • +
        • The ktx validate tool may be stricter than ktx2check or otherwise differ in behavior, as the new tool enforces all rules of the KTX 2.0 specification. In addition, all new tools that accept KTX 2.0 files as input will be validated in a similar fashion as they would be with the ktx validate tool and will fail on the first specification rule violation, if there is one. It also has the option to output the validation results in human readable text format or in JSON format (both formatted and minified options are available), as controlled by the --format command-line option.
        • +
        • The ktx validate tool also supports validating KTX 2.0 files against the additional restrictions defined by the KHR_texture_basisu extension. Use the --gltf-basisu command-line option to verify glTF and WebGL compatibility.
        • +
        • The new ktx info tool produces a unified and complete output of all metadata in KTX 2.0 files and can provide output in human readable text format or in JSON format (both formatted and minified options are available), as controlled by the --format command-line option.
        • +
        • The source repository also includes the JSON schemas that the JSON outputs of the ktx info and ktx validate tools comply to.
        • +
        • The ktx create tool takes an explicit Vulkan format argument (--format) instead of inferring the format based on the provided input files as toktx, and thus doesn't perform any implicit color-space conversions except gamma 2.2 to sRGB. Use the --assign-tf, --convert-tf, --assign-primaries, and the new --convert-primaries for fine grained control over color-space interpretation and conversion.
        • +
        • The ktx create tool does not support resizing or scaling like toktx, and, in general, does not perform any image transformations except the optional color-space conversion and mipmap generation options. Users should resize input images to the appropriate resolution before converting them to KTX 2.0 files.
        • +
        • The ktx create and ktx extract tools consume and produce, respectively, image file formats that best suit the used Vulkan format. In general, barring special cases, 8-bit and 16-bit normalized integer formats are imported from and exported to PNG files, while integer and floating point formats are imported from and exported to EXR files based on predefined rules. This may be extended in the future using additional command line options and in response to support for other image file formats.
        • +
        • The new tools and updated libktx support ZLIB supercompression besides the BasisLZ and Zstd supercompression schemes supported previously.
        • +
        +

        Please refer to the manual pages or use the --help command-line option for further details on the options available and associated semantics for each individual command.

        +
        +
        This page last modified $Date$
        +
        + +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/ktxtools/jquery.js b/ktx/build/docs/html/ktxtools/jquery.js new file mode 100644 index 0000000..875ada7 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/jquery.js @@ -0,0 +1,204 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e} +var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp( +"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType +}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c +)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){ +return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll( +":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id") +)&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push( +"\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test( +a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null, +null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne +).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for( +var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
        "],col:[2,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],_default:[0,"",""]};function ve(e,t){var n; +return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0, +r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r] +,C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
        ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each( +function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r, +"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})} +),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each( +"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t +){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t +]=y.widget.extend({},this.options[t]),n=0;n
      "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i}, +getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within, +s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n
    ").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t +).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split( +","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add( +this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{ +width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(), +!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){ +this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height +,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e
    ").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e, +i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left +)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e +){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0), +i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth( +)-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e, +function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0 +]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){ +targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se", +"n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if( +session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)} +closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if( +session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE, +function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset); +tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList, +finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight())); +return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")} +function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(), +elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight, +viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b, +"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); +/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)), +mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend( +$.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy( +this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData( +"smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id" +).indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?( +this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for( +var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){ +return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if(( +!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&( +this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0 +]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass( +"highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){ +t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]" +)||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){ +t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"), +a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i, +downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2) +)&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t +)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0), +canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}}, +rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})} +return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1, +bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); diff --git a/ktx/build/docs/html/ktxtools/ktx.html b/ktx/build/docs/html/ktxtools/ktx.html new file mode 100644 index 0000000..f7b4205 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktx.html @@ -0,0 +1,173 @@ + + + + + + + +KTX Tools Reference: ktx + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx
    +
    +
    +

    Unified CLI frontend for the KTX-Software library.

    +

    +SYNOPSIS

    +

    ktx <command> [command-option...]
    + ktx [option...]

    +

    +DESCRIPTION

    +

    Unified CLI frontend for the KTX-Software library with sub-commands for specific operations for the KTX File Format Specification https://registry.khronos.org/KTX/specs/2.0/ktxspec.v2.html.

    +

    The following commands are available:

    +
    create
    +
    Create a KTX2 file from various input files.
    +
    deflate
    +
    Deflate (supercompress) a KTX2 file.
    +
    extract
    +
    Extract selected images from a KTX2 file.
    +
    encode
    +
    Encode a KTX2 file.
    +
    transcode
    +
    Transcode a KTX2 file.
    +
    info
    +
    Print information about a KTX2 file.
    +
    validate
    +
    Validate a KTX2 file.
    +
    compare
    +
    Compare two KTX2 files.
    +
    help
    +
    Display help information about the ktx tool.
    +
    +

    +OPTIONS

    +

    The following options are also available without a command:

    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +

    +EXIT STATUS

    +
      +
    • 0 - Success
    • +
    • 1 - Command line error
    • +
    • 2 - IO failure
    • +
    • 3 - Invalid input file
    • +
    • 4 - Runtime or library error
    • +
    • 5 - Not supported state or operation
    • +
    • 6 - Requested feature is not yet implemented
    • +
    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version
    • +
    +
    +

    +AUTHOR

    +
      +
    • Mátyás Császár [Vader], RasterGrid www.rastergrid.com
    • +
    • Daniel Rákos, RasterGrid www.rastergrid.com
    • +
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktx2check.html b/ktx/build/docs/html/ktxtools/ktx2check.html new file mode 100644 index 0000000..6029ae9 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktx2check.html @@ -0,0 +1,147 @@ + + + + + + + +KTX Tools Reference: ktx2check + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx2check
    +
    +
    +

    Check the validity of a KTX 2 file.

    +

    +SYNOPSIS

    +

    ktx2check [options] [infile ...]

    +

    +DESCRIPTION

    +

    ktx2check validates Khronos texture format version 2 files (KTX2). It reads each named infile and validates it writing to stdout messages about any issues found. When infile is not specified, it validates a single file from stdin.

    +

    The following options are available:

    +
    -q, --quiet
    +
    Validate silently. Indicate valid or invalid via exit code.
    +
    -m <num>, –max-issues <num>
    +
    Set the maximum number of issues to be reported per file provided -q is not set.
    +
    -w, --warn-as-error
    +
    Treat warnings as errors. Changes exit code from success to error.
    +
    +
    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +

    +EXIT STATUS

    +

    ktx2check exits 0 on success, 1 on command line errors and 2 on validation errors.

    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version.
    • +
    +
    +

    +AUTHOR

    +

    Mark Callow, github.com/MarkCallow

    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktx2ktx2.html b/ktx/build/docs/html/ktxtools/ktx2ktx2.html new file mode 100644 index 0000000..9846a82 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktx2ktx2.html @@ -0,0 +1,148 @@ + + + + + + + +KTX Tools Reference: ktx2ktx2 + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx2ktx2
    +
    +
    +

    Create a KTX 2 file from a KTX file.

    +

    +SYNOPSIS

    +

    ktx2ktx2 [options] [infile ...]

    +

    +DESCRIPTION

    +

    ktx2ktx2 creates Khronos texture format version 2 files (KTX2) from Khronos texture format version 1 files. ktx2ktx2 reads each named infile. Output files have the same name as the input but with the extension changed to .ktx2. When infile is not specified, a single file will be read from stdin and the output written to standard out.

    +

    If unrecognized metadata with keys beginning "KTX" or "ktx" is found in the input file, it is dropped and a warning is written to standard error.

    +

    The following options are available:

    +
    -b, --rewritebado
    +
    Rewrite bad orientation metadata. Some in-the-wild KTX files have orientation metadata with the key "KTXOrientation" instead of KTXorientaion. This option will rewrite such bad metadata instead of dropping it.
    +
    -o outfile, –output=outfile
    +
    Name the output file outfile. If outfile is 'stdout', output will be written to stdout. If there is more than 1 input file, the command prints its usage message and exits.
    +
    -f, --force
    +
    If the destination file already exists, remove it and create a new file, without prompting for confirmation regardless of its permissions.
    +
    +
    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +

    +EXIT STATUS

    +

    ktx2ktx2 exits 0 on success, 1 on command line errors and 2 on functional errors.

    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version.
    • +
    +
    +

    +AUTHOR

    +

    Mark Callow, github.com/MarkCallow

    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktx_compare.html b/ktx/build/docs/html/ktxtools/ktx_compare.html new file mode 100644 index 0000000..136ba03 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktx_compare.html @@ -0,0 +1,243 @@ + + + + + + + +KTX Tools Reference: ktx compare + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx compare
    +
    +
    +

    Compare two KTX2 files.

    +

    +SYNOPSIS

    +

    ktx compare [option...] input-file1 input-file2

    +

    +DESCRIPTION

    +

    ktx compare compares the two KTX2 files specified as the input-file1 and input-file2 arguments and outputs any mismatch in texture information and/or image data. The command implicitly calls validate and prints any found errors and warnings to stdout. If any of the specified input files are invalid then comparison is done based on best effort and may be incomplete.

    +

    The JSON output formats conform to the https://schema.khronos.org/ktx/compare_v0.json schema even if the input file is invalid and certain information cannot be parsed or displayed. Additionally, for JSON outputs the KTX file identifier is printed using "\u001A" instead of "\x1A" as an unescaped "\x1A" sequence inside a JSON string breaks nearly every JSON tool. Note that this does not change the value of the string only its representation.

    +
    Note
    ktx compare prints using UTF-8 encoding. If your console is not set for UTF-8 you will see incorrect characters in output of the file identifier on each side of the "KTX nn".
    +

    +OPTIONS

    +

    The following options are available:

    +
    --format text | json | mini-json
    +
    Specifies the report output format. Possible options are:
    + text - Human readable text based format.
    + json - Formatted JSON.
    + mini-json - Minified JSON.
    + The default format is text.
    +
    +
    +
    --content raw | image | ignore
    +
    Controls how image content is compared. Possible options are:
    + raw - Encoded image data is compared verbatim, as it appears in the file.
    + image - Effective image data is compared per texel block.
    + ignore - Ignore image contents.
    + The default mode is raw, meaning that the encoded image data must match exactly. Note: When the mode is set to image, the effective image data of individual mip levels, layers, and faces is compared texel block by texel block after applying one or more of the following transformations, if needed:
    + - If the texture is supercompressed (e.g. using Zstandard or ZLIB), the images are deflated before comparison.
    + - If the texture is encoded using BasisLZ, the images are transcoded to R8G8B8A_UNORM before comparison.
    + For block compressed textures and textures encoded using UASTC the texel blocks are the individual compressed blocks, while for other formats the texel blocks are the individual pixels of the image.
    + When comparing files that use different supercompression schemes, or otherwise different encoding, additional options may need to be used to avoid unexpected differences to be reported related to the meta information of the files. For example:
    + - The supercompression scheme can be ignored with –ignore-supercomp.
    + - Compressed byte length and other index section differences can be ignored with –ignore-index all or –ignore-index level.
    + - DFD section differences can be ignored with –ignore-dfd all or –ignore-dfd all-except-color-space.
    + - BDFD bytesPlane value differences can be ignored with –ignore-bdfd-bytesplane.
    + - SGD section differences can be ignored with –ignore-sgd all or –ignore-sgd payload.
    +
    +
    --per-pixel-output all | <number> | none
    +
    Controls whether per pixel / texel block difference output is generated when –content is set to image:
    + all - Every single difference is output (may result in a very large output).
    + <number> - At most the specified number of differences are output.
    + none - No per pixel / texel block differences are output.
    + The default mode is none to limit the verbosity of the output.
    +
    --allow-invalid-input
    +
    Perform best effort comparison even if any of the input files are invalid.
    +
    --ignore-format-header
    +
    +
    +
    Ignore the vkFormat and typeSize fields in the file header.
    + Note: useful when comparing textures with and without BasisLZ encoding, respectively.
    +
    --ignore-supercomp
    +
    Ignore supercompression scheme in the file header.
    + Note: use the –ignore-sgd option to also ignore the SGD section, if needed.
    +
    --ignore-index all | level | none
    +
    Controls the comparison of index entries in the file headers. Possible options are:
    + all - Ignore all index entries.
    + level - Ignore level index entries only.
    + none - Do not ignore any index entries.
    + The default mode is none, meaning that all index entries will be compared.
    +
    --ignore-dfd all | all-except-color-space | unknown | extended | none
    +
    Controls the comparison of DFD blocks. Possible options are:
    + all - Ignore all DFD blocks.
    + all-except-color-space: Ignore all DFD blocks except the color space information in the basic DFD block.
    + unknown - Ignore any unrecognized DFD blocks.
    + extended - Ignore all DFD blocks except the basic DFD block.
    + none - Do not ignore any DFD blocks.
    + The default mode is none, meaning that all DFD entries will be compared.
    +
    --ignore-bdfd-bytesplane
    +
    Ignore BDFD bytesPlane values. Useful when comparing pre-spec-2.0.4 supercompressed files with 2.0.4+ supercompressed or non-supercompressed ones, as bytesPlane is set to zero in older supercompressed files.
    +
    --ignore-metadata all | <key>[,...] | none
    +
    Controls the comparison of metadata (KVD) entries. Possible options are:
    + all - Ignore all metadata entries.
    + <key>[,...] - Ignore the specified comma separated list of metadata keys.
    + none - Do not ignore any metadata entries.
    + The default mode is none, meaning that all metadata entries will be compared.
    +
    --ignore-sgd all | unknown | payload | none
    +
    Controls the comparison of the SGD section. Possible options are:
    + all - Ignore the SGD section.
    + unknown - Ignore any unrecognized SGD section.
    + payload - Ignore any unrecognized SGD section and the payload of any known SGD section.
    + none - Do not ignore the SGD section.
    + The default mode is none, meaning that SGD sections will be always compared. Note: –ignore-sgd payload can be used to compare BasisLZ SGD headers without expecting an exact match for the individual SGD payload sections.
    +
    +
    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +
    @note Reports about image content mismatches when --content is set to @b raw or @b image
    +include the following information: <br />
    +- The level, layer, and face index of the image where the difference was found.
    +
    +@note Reports about individual texel block differences when --content is set to @b image
    +include the following additional information: <br />
    +- The texel coordinates within the image where the difference was found. These
    +  coordinates are the raw coordinates of the image and are not affected by metadata
    +  such as @b KTXorientation.
    +- The packed elements of the texel block output as an array of hexadecimal values.
    +  Each packed element has a byte size equal to the @b typeSize value of the image.
    +- The channel values of the texel block output as an array of integer (for integer
    +  and normalized formats) or floating point (for floating point formats) values.
    +  In case of floating point formats @b NaN, @b +inf, and @b -inf are used to indicate
    +  values that are not a number or represent infinities, respectively.
    +  The output order of the channels always follow the order they appear in the BDFD.
    +

    +EXIT STATUS

    +
      +
    • 0 - Success
    • +
    • 1 - Command line error
    • +
    • 2 - IO failure
    • +
    • 3 - Invalid input file
    • +
    • 4 - Runtime or library error
    • +
    • 5 - Not supported state or operation
    • +
    • 6 - Requested feature is not yet implemented
    • +
    +
      +
    • 7 - Input files are different
    • +
    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version
    • +
    +
    +

    +AUTHOR

    +
      +
    • Daniel Rákos, RasterGrid www.rastergrid.com
    • +
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktx_create.html b/ktx/build/docs/html/ktxtools/ktx_create.html new file mode 100644 index 0000000..e4eea9a --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktx_create.html @@ -0,0 +1,463 @@ + + + + + + + +KTX Tools Reference: ktx create + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx create
    +
    +
    +

    Create a KTX2 file from various input files.

    +

    +SYNOPSIS

    +

    ktx create [option...] input-file... output-file

    +

    +DESCRIPTION

    +

    ktx create can create, encode and supercompress a KTX2 file from the input images specified as the input-file... arguments and save it as the output-file. The last positional argument is treated as the output-file. If the input-file is '-' the file will be read from the stdin. If the output-path is '-' the output file will be written to the stdout.

    +

    Each input-file must be a valid EXR (.exr), PNG (.png) or Raw (.raw) file. PNG files with luminance (L) or luminance + alpha (LA) data will be converted to RGB as LLL and RGBA as LLLA before processing further. The input file formats must be compatible with the requested KTX format enum and must have at least the same level of precision and number of channels. Any unused channel will be discarded silently.

    +

    The number of input-files specified must match the expected number of input images based on the used options.

    +

    +OPTIONS

    +

    +General Options

    +

    The following are available:

    +
    --format <enum>
    +
    KTX format enum that specifies the data format for the images in the created texture. The enum names match the VkFormat names without the VK_FORMAT_ prefix. The VK_FORMAT_ prefix is ignored if present. Case insensitive. Required.
    +
    + If the format is an ASTC format a texture object with the target format R8G8B8_{SRGB,UNORM} or R8G8B8A8_{SRGB,UNORM} is created then encoded to the specified ASTC format. The latter format is chosen if alpha is present in the input. SRGB or UNORM is chosen depending on the specified ASTC format. The ASTC-specific and common encoder options listed below become valid, otherwise they are ignored. This matches the functionality of the ktx encode command when an ASTC format is specified.
    +
    + When used with --encode it specifies the target format before the encoding step. In this case it must be one of:
      +
    • +R8_UNORM
    • +
    • +R8_SRGB
    • +
    • +R8G8_UNORM
    • +
    • +R8G8_SRGB
    • +
    • +R8G8B8_UNORM
    • +
    • +R8G8B8_SRGB
    • +
    • +R8G8B8A8_UNORM
    • +
    • +R8G8B8A8_SRGB
    • +
    +The format will be used to verify and load all input files into a texture before performing any specified encoding.
    +
    +
    --encode basis-lz | uastc
    +

    Encode the texture with the specified codec before saving it. This option matches the functionality of the ktx encode command. With each choice, the specific and common encoder options listed below become valid, otherwise they are ignored. Case-insensitive.

    +
    +
    basis-lz:
    +
    Supercompress the image data with transcodable ETC1S / BasisLZ. RED images will become RGB with RED in each component (RRR). RG images will have R in the RGB part and G in the alpha part of the compressed texture (RRRG). When set, the basis-lz options become valid.
    +
    uastc:
    +
    Create a texture in high-quality transcodable UASTC format. When set the uastc options become valid.
    +
    +

    +
    +
    --1d
    +
    Create a 1D texture. If not set the texture will be a 2D or 3D texture.
    +
    --cubemap
    +
    Create a cubemap texture. If not set the texture will be a 2D or 3D texture.
    +
    --raw
    +
    Create from raw image data.
    +
    --width
    +
    Base level width in pixels. Required with --raw. For non-raw, if not set, the image width is used otherwise the image is resampled to this width and any provided mip levels are resampled proportionately. For non-raw it enables use of the 'Generate Mipmap' options listed under --generate-mipmap to tune the resampler.
    +
    --height
    +
    Base level height in pixels. Required with --raw. For non-raw, if not set, the image height is used otherwise the image is resampled to this height and any provided mip levels are resampled proportionately. For non-raw it enables use of the 'Generate Mipmap' options listed under --generate-mipmap to tune the resampler.
    +
    --depth
    +
    Base level depth in pixels. If set the texture will be a 3D texture.
    +
    --layers
    +
    Number of layers. If set the texture will be an array texture.
    +
    --levels
    +
    Number of mip levels. This is the number of level images to include in the texture being created. If --generate-mipmap is specified this number of level images will be generated otherwise this number of input images must be provided. Generates an error if the value is greater than the maximum possible for the specified dimensions of the texture or, for non-raw, the dimensions of the base level image as possibly modified by --scale.
    +
    --runtime-mipmap
    +
    Runtime mipmap generation mode. Sets up the texture to request the mipmaps to be generated by the client application at runtime.
    +
    --generate-mipmap
    +
    Causes mipmaps to be generated during texture creation. If --levels is not specified the maximum possible mip level will be generated. This option is mutually exclusive with –runtime-mipmap and cannot be used with SINT, UINT or 3D textures or --raw. When set it enables the use of the following 'Generate Mipmap' options.
    +
    --mipmap-filter <filter>
    +
    Specifies the filter to use when generating the mipmaps. Case insensitive. Ignored unless --generate-mipmap, --scale, --width or --height are specified for non-raw input.
    + Possible options are: box | tent | bell | b-spline | mitchell | blackman | lanczos3 | lanczos4 | lanczos6 | lanczos12 | kaiser | gaussian | catmullrom | quadratic_interp | quadratic_approx | quadratic_mix. Defaults to lanczos4.
    +
    --mipmap-filter-scale <float>
    +
    The filter scale to use. Defaults to 1.0. Ignored unless --generate-mipmap, --scale, --width or --height are specified for non-raw input.
    +
    --mipmap-wrap <mode>
    +
    Specify how to sample pixels near the image boundaries. Case insensitive. Ignored unless --generate-mipmap, --scale, --width or --height are specified for non-raw input.
    + Possible options are: wrap | reflect | clamp. Defaults to clamp.
    +
    +Avoid mipmap generation if the Output TF (see TRANSFER FUNCTION HANDLING below) is non-linear and is not sRGB.
    +
    --scale
    +
    Scale images as they are loaded. Cannot be used with –raw. It enables use of the 'Generate Mipmap' options listed under --generate-mipmap to tune the resampler.
    +
    --normalize
    +
    Normalize input normals to have a unit length. Only valid for linear normal textures with 2 or more components. For 2-component inputs 2D unit normals are calculated. Do not use these 2D unit normals to generate X+Y normals with --normal-mode. For 4-component inputs a 3D unit normal is calculated. 1.0 is used for the value of the 4th component. Cannot be used with --raw.
    +
    --swizzle [rgba01]{4}
    +
    KTX swizzle metadata.
    +
    --input-swizzle [rgba01]{4}
    +
    Pre-swizzle input channels.
    +
    --assign-tf <transfer function>
    +
    Force the created texture to have the specified transfer function, ignoring the transfer function of the input file(s). Possible options match the khr_df_transfer_e enumerators without the KHR_DF_TRANSFER_ prefix. The KHR_DF_TRANSFER_ prefix is ignored if present. Case nsensitive. The options are: linear | srgb | srgb_eotf | scrgb | scrgb_eotf | itu | itu_oetf | bt601 | bt601_oetf | bt709 | bt709_oetf | bt2020 | bt2020_oetf | smpte170m | smpte170m_oetf | smpte170m_eotf | ntsc | ntsc_eotf | slog | slog_oetf | slog2 | slog2_oetf | bt1886 | bt1886_eotf | hlg_oetf | hlg_eotf | pq_oetf | pg_eotf | dcip3 | dcip3_eotf | pal_oetf | pal625_eotf | st240 | st240_oetf | st240_eotf | acescc | acescc_oetf | acescct | acescct_oetf | abobergb | adobergb_eotf See TRANSFER FUNCTION HANDLING below for important information.
    +
    --assign-oetf <transfer function>
    +
    Deprecated and will be removed. Use --assign-tf instead.
    +
    --assign-primaries <primaries>
    +
    Force the created texture to have the specified color primaries, ignoring the color primaries of the input file(s). Possible options match the khr_df_primaries_e enumerators without the KHR_DF_PRIMARIES_ prefix. The KHR_DF_PRIMARIES_ prefix is ignored if present. Case insensitive. The options are: none | bt709 | srgb | bt601_ebu | bt601_smpte | bt2020 | ciexyz | aces | acescc | ntsc1953 | pal525 | displayp3 | adobergb.
    Note
    bt601-ebu and bt601-smpte, supported in previous releases, have been replaced with names consistent with khr_df_primaries_e.
    +
    +
    --assign-texcoord-origin <corner>
    +
    Force the created texture to indicate that the texture coordinate origin s=0, t=0 is at the specified corner of the logical image. Case insensitive. Possible options are top-left | bottom-left. -front | -back can be appended and one of these is required when --depth is specified. Must be top-left if --cubemap is specified. Absent —convert-texcoord-origin, the effect of this option is to cause KTXorientation metadata indicating the specified origin to be written to the output file. Example values are "rd" (top-left) and "ru" (bottom-left) or, when --depth is specified, "rdi" (top-left-front) and "rui" (bottom-left-front).
    +
    --convert-tf <transfer function>
    +
    Convert the input image(s) to the specified transfer function, if different from the transfer function of the input file(s). If both this and --assign-tf are specified, conversion will be performed from the assigned transfer function to the transfer function specified by this option, if different. Cannot be used with --raw. Case insensitive. The options are: linear | srgb. The following srgb aliases are also supported: srgb_eotf | scrgb | scrgb_eotf. See TRANSFER FUNCTION HANDLING below for more information.
    +
    --convert-oetf <transfer function>
    +
    Deprecated and will be removed. Use --convert-tf instead.
    +
    --convert-primaries <primaries>
    +
    Convert the input image(s) to the specified color primaries, if different from the color primaries of the input file(s) or the one specified by --assign-primaries. If both this and --assign-primaries are specified, conversion will be performed from the assigned primaries to the primaries specified by this option, if different. This option is not allowed to be specified when --assign-primaries is set to 'none'. Cannot be used with --raw. Possible options match the khr_df_primaries_e enumerators without the KHR_DF_PRIMARIES_ prefix. The KHR_DF_PRIMARIES_ prefix is ignored if present. Case insensitive. The options are: bt709 | srgb | bt601_ebu | bt601_smpte | bt2020 | ciexyz | aces | acescc | ntsc1953 | pal525 | displayp3 | adobergb
    Note
    bt601-ebu and bt601-smpte, supported in previous releases, have been replaced with names consistent with khr_df_primaries_e.
    +
    +
    --convert-texcoord-origin <corner>
    +
    Convert the input image(s) so the texture coordinate origin s=0, t=0, is at the specified corner of the logical image. If both this and --assign-texcoord-origin are specified, conversion will be performed from the assigned origin to the origin specified by this option, if different. The default for images in KTX files is top-left which corresponds to the origin in most image file formats. Cannot be used with --raw. Case insensitive. Possible options are: top-left | bottom-left. -front | -back can be appended and one of these is required when --depth is specified. Must be top-left if --cubemap is specified.
    +
    + Input images whose origin does not match corner will be flipped vertically. KTXorientation metadata indicating the the specified origin is written to the output file. Example values are "rd" (top-left) and "ru" (bottom-left) or, when --depth is specified, "rdi" (top-left-front) and "rui" (bottom-left-back). Generates an error if the input image origin is unknown as is the case with raw image data. Use --assign-texcoord-origin to specify the orientation.
    Note
    ktx create cannot rotate or flip incoming images, except for a y-flip, so use an an image processing tool to reorient images whose first data stream pixel is not at the logical top-left or bottom-left of the image before using as input here. Such images may be indicated by Exif-style orientation metadata in the file.
    +
    +
    --fail-on-color-conversions
    +
    Generates an error if any input images would need to be color converted.
    +
    --warn-on-color-conversions
    +
    Generates a warning if any input images are color converted. Adds warnings for explicitly requested and visually lossless implicit conversions to that generated for visually lossy conversions.
    +
    --no-warn-on-color-conversions
    +
    Disable all warnings about color conversions including that for visually lossy conversions. Overrides --warn-on-color-conversions should both be specified.
    +
    --fail-on-origin-changes
    +
    Generates an error if any of the input images would need to have their origin changed.
    +
    --warn-on-origin-changes
    +
    Generates a warning if any of the input images have their origin changed..
    +
    +
    +
    --zstd <level>
    +
    Supercompress the data with Zstandard. Cannot be used with ETC1S / BasisLZ format. Level range is [1,22]. Lower levels give faster but worse compression. Values above 20 should be used with caution as they require more memory.
    +
    --zlib <level>
    +
    Supercompress the data with ZLIB. Cannot be used with ETC1S / BasisLZ format. Level range is [1,9]. Lower levels give faster but worse compression.
    +
    +
    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +

    +Specific and Common Encoding Options

    +

    The following are available. Specific options become valid only if their encoder has been selected. Common encoder options become valid when an encoder they apply to has been selected. Otherwise they are ignored.

    +
    ASTC:
    +

    +
    +
    --astc-quality <level>
    +
    The quality level configures the quality-performance tradeoff for the compressor; more complete searches of the search space improve image quality at the expense of compression time. Default is 'medium'. The quality level can be set between fastest (0) and exhaustive (100) via the following fixed quality presets: + + + + + + + + + + + + +
    Level Quality
    fastest (equivalent to quality = 0)
    fast (equivalent to quality = 10)
    medium (equivalent to quality = 60)
    thorough (equivalent to quality = 98)
    exhaustive (equivalent to quality = 100)
    +
    +
    --astc-perceptual
    +
    The codec should optimize for perceptual error, instead of direct RMS error. This aims to improve perceived image quality, but typically lowers the measured PSNR score. Perceptual methods are currently only available for normal maps and RGB color data.
    +
    +
    +
    +
    +
    basis-lz:
    +
    +
    --clevel <level>
    +
    ETC1S / BasisLZ compression level, an encoding speed vs. quality tradeoff. Range is [0,6], default is 1. Higher values are slower but give higher quality. Use --qlevel first.
    +
    --qlevel <level>
    +

    ETC1S / BasisLZ quality level. Range is [1,255]. Lower gives better compression/lower quality/faster. Higher gives less compression/higher quality/slower. --qlevel automatically determines values for --max-endpoints, --max-selectors, --endpoint-rdo-threshold and --selector-rdo-threshold for the target quality level. Setting these options overrides the values determined by -qlevel which defaults to 128 if neither it nor --max-endpoints and --max-selectors have been set.

    +

    Note that both of --max-endpoints and --max-selectors must be set for them to have any effect. If all three options are set, a warning will be issued that --qlevel will be ignored.

    +

    Note also that --qlevel will only determine values for --endpoint-rdo-threshold and --selector-rdo-threshold when its value exceeds 128, otherwise their defaults will be used.

    +
    +
    --max-endpoints <arg>
    +
    Manually set the maximum number of color endpoint clusters. Range is [1,16128]. Default is 0, unset.
    +
    --endpoint-rdo-threshold <arg>
    +
    Set endpoint RDO quality threshold. The default is 1.25. Lower is higher quality but less quality per output bit (try [1.0,3.0]). This will override the value chosen by --qlevel.
    +
    --max-selectors <arg>
    +
    Manually set the maximum number of color selector clusters from [1,16128]. Default is 0, unset.
    +
    --selector-rdo-threshold <arg>
    +
    Set selector RDO quality threshold. The default is 1.25. Lower is higher quality but less quality per output bit (try [1.0,3.0]). This will override the value chosen by --qlevel.
    +
    --no-endpoint-rdo
    +
    Disable endpoint rate distortion optimizations. Slightly faster, less noisy output, but lower quality per output bit. Default is to do endpoint RDO.
    +
    --no-selector-rdo
    +
    Disable selector rate distortion optimizations. Slightly faster, less noisy output, but lower quality per output bit. Default is to do selector RDO.
    +
    +

    +
    +
    uastc:
    +

    +
    +
    --uastc-quality <level>
    +

    This optional parameter selects a speed vs quality tradeoff as shown in the following table:

    + + + + + + + + + + + + + +
    LevelSpeedQuality
    0 Fastest 43.45dB
    1 Faster 46.49dB
    2 Default 47.47dB
    3 Slower 48.01dB
    4 Very slow 48.24dB
    +

    You are strongly encouraged to also specify --zstd to losslessly compress the UASTC data. This and any LZ-style compression can be made more effective by conditioning the UASTC texture data using the Rate Distortion Optimization (RDO) post-process stage. When uastc encoding is set the following options become available for controlling RDO:

    +
    +
    --uastc-rdo
    +
    Enable UASTC RDO post-processing.
    +
    --uastc-rdo-l <lambda>
    +

    Set UASTC RDO quality scalar (lambda) to lambda. Lower values yield higher quality/larger LZ compressed files, higher values yield lower quality/smaller LZ compressed files. A good range to try is [.25,10]. For normal maps a good range is [.25,.75]. The full range is [.001,10.0]. Default is 1.0.

    +

    Note that previous versions used the --uastc-rdo-q option which was removed because the RDO algorithm changed.

    +
    +
    --uastc-rdo-d <dictsize>
    +
    Set UASTC RDO dictionary size in bytes. Default is 4096. Lower values=faster, but give less compression. Range is [64,65536].
    +
    --uastc-rdo-b <scale>
    +
    Set UASTC RDO max smooth block error scale. Range is [1.0,300.0]. Default is 10.0, 1.0 is disabled. Larger values suppress more artifacts (and allocate more bits) on smooth blocks.
    +
    --uastc-rdo-s <deviation>
    +
    Set UASTC RDO max smooth block standard deviation. Range is [.01,65536.0]. Default is 18.0. Larger values expand the range of blocks considered smooth.
    +
    --uastc-rdo-f
    +
    Do not favor simpler UASTC modes in RDO mode.
    +
    --uastc-rdo-m
    +
    Disable RDO multithreading (slightly higher compression, deterministic).
    +
    +
    +
    +
    +
    common:
    +
    +
    --normal-mode
    +

    Only valid for linear textures with two or more components. If the input texture has three or four linear components it is assumed to be a three component linear normal map storing unit length normals as (R=X, G=Y, B=Z). A fourth component will be ignored. The map will be converted to a two component X+Y normal map stored as (RGB=X, A=Y) prior to encoding. If unsure that your normals are unit length, use --normalize. If the input has 2 linear components it is assumed to be an X+Y map of unit normals.

    +

    The Z component can be recovered programmatically in shader code by using the equations:

    +        nml.xy = texture(...).ga;              // Load in [0,1]
    +        nml.xy = nml.xy * 2.0 - 1.0;           // Unpack to [-1,1]
    +        nml.z = sqrt(1 - dot(nml.xy, nml.xy)); // Compute Z
    +                

    For ETC1S / BasisLZ encoding, '--encode basis-lz', RDO is disabled (no selector RDO, no endpoint RDO) to provide better quality.

    +
    +
    --threads <count>
    +
    Explicitly set the number of threads to use during compression. By default, ETC1S / BasisLZ will use the number of threads reported by thread::hardware_concurrency or 1 if value returned is 0.
    +
    --no-sse
    +
    Forbid use of the SSE instruction set. Ignored if CPU does not support SSE. SSE can only be disabled for the basis-lz and uastc encoders. Ignored for other encoders..
    +
    +
    +
    +
    +
    +
    +
    --compare-ssim
    +
    Calculate encoding structural similarity index measure (SSIM) and print it to stdout. Requires Basis-LZ, UASTC or ASTC encoding.
    +
    --compare-psnr
    +
    Calculate encoding peak signal-to-noise ratio (PSNR) and print it to stdout. Requires Basis-LZ, UASTC or ASTC encoding.
    +
    +
    +
    +

    +TRANSFER FUNCTION HANDLING

    +

    The diagram below shows all assignments and conversions that can take place.

    +
    ┌──────────┐                                     ┌─────────┐
    +│          ├──────────────────1─────────────────►│         │
    +│          │  ┌───────────┐                      │         │
    +│ Input    │  │           │                      │         │
    +│ Transfer │  │ --assign- ├──────────2──────────►│Output   │
    +│ function │  │   tf      │    ┌────────────┐    │Transfer │
    +│ from     │  │           ├─3─►│            │    │Function │
    +│ file     │  │           │    │ --convert- │    │         │
    +│ metadata │  └───────────┘    │   tf       ├3,4►│         │
    +│          │                   │            │    │         │
    +│          ├────────4─────────►│            │    │         │
    +└──────────┘                   └────────────┘    └─────────┘
    +

    Processing Paths

    +
      +
    1. +Pass through. No options specified.
    2. +
    3. +--assign-tf specified.
    4. +
    5. +--assign-tf and --convert-tf specified.
    6. +
    7. +--convert-tf specified.
    8. +
    +

    +Details

    +

    Transfer function handling proceeds as follows:

      +
    • +If --format specifies one of the *_SRGB{,_*} formats and Output Transfer Function is not sRGB (a.k.a scRGB) an error is generated.
    • +
    • +If --format does not specify one of the *_SRGB{,_*} formats, an sRGB variant exists and Output Transfer Function is sRGB (a.k.a scRGB), an error is generated.
    • +
    • +Otherwise, the transfer function of the output KTX file is set to Output Transfer Function.
    • +
    • +If neither --assign-tf nor --convert-tf is specified:
        +
      • +If the Input Transfer Function is not sRGB (a.k.a scRGB) for *_SRGB{,_*} formats an implicit conversion to sRGB is done, equivalent to --convert-tf srgb.
      • +
      • +If the Input Transfer Function is not linear for formats that are not one of the *_SRGB{,_*} formats, an implicit conversion to linear is done equivalent to --convert-tf linear.
      • +
      +
    • +
    • +Supported inputs for implicit or explicit conversion are linear, sRGB, ITU (a.k.a BT601, BT.709, BT.2020 and SMPTE170M) and PQ EOTF. An error is generated if an unsupported conversion is required.
    • +
    • +Supported outputs for implicit or explicit conversion are linear and sRGB, An error is generated if an unsupported conversion is required.
    • +
    • +Output Transfer Function for a format that is not one of the *_SRGB{,_*} formats can be set to a non-linear transfer function via --assign-tf.
    • +
    • +A warning is generated if a visually lossy color-conversion is performed. sRGB to linear is considered visually lossy because there is a high chance it will introduce artifacts visible to the human eye such as banding. The warning can be suppressed with --no-warn-on-color-conversions. A warning or an error on any color conversion can be requested with --warn-on-color-conversions or --fail-on-color-conversions .
    • +
    +
    Note
    When --format does not specify one of the SRGB{,} formats and Output Transfer Function is not linear:
      +
    • the KTX file may be much less portable due to limited hardware support of such inputs.
    • +
    • avoid using --generate-mipmap as the filters can only decode sRGB.
    • +
    • avoid encoding to ASTC, BasisLz/ETC1S or UASTC. The encoders' quality metrics are designed for linear and sRGB.
    • +
    +
    +

    +Changes since last Release

    +
      +
    1. +--assign-oetf and --convert-oetf are deprecated and will be removed. Use --assign-tf and --convert-tf instead.
    2. +
    3. +The parameter value for --assign-tf can now be any of the transfer functions known to the Khronos Data Format Specification.
    4. +
    5. +A warning is now generated if a visually lossy color conversion will be performed. The warning can be suppressed with --no-warn-on-color-conversions.
    6. +
    +

    +EXIT STATUS

    +
      +
    • 0 - Success
    • +
    • 1 - Command line error
    • +
    • 2 - IO failure
    • +
    • 3 - Invalid input file
    • +
    • 4 - Runtime or library error
    • +
    • 5 - Not supported state or operation
    • +
    • 6 - Requested feature is not yet implemented
    • +
    +

    +HISTORY

    +
    Version 4.3
      +
    • Initial version
    • +
    +
    +
    Version 4.4
      +
    • Reorganize encoding options.
    • +
    • Improve explanation of use of --format with --encode.
    • +
    • Improve explanation of ASTC encoding.
    • +
    +
    +

    +AUTHOR

    +
      +
    • Mátyás Császár [Vader], RasterGrid www.rastergrid.com
    • +
    • Daniel Rákos, RasterGrid www.rastergrid.com
    • +
    • Mark Callow
    • +
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktx_deflate.html b/ktx/build/docs/html/ktxtools/ktx_deflate.html new file mode 100644 index 0000000..bfcd6ea --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktx_deflate.html @@ -0,0 +1,164 @@ + + + + + + + +KTX Tools Reference: ktx deflate + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx deflate
    +
    +
    +

    Deflate (supercompress) a KTX2 file.

    +

    +SYNOPSIS

    +

    ktx deflate [option...] input-file output-file

    +

    +DESCRIPTION

    +

    ktx deflate deflates (supercompresses) the KTX file specified as the input-file and saves it as the output-file. If the input-file is '-' the file will be read from the stdin. If the output-path is '-' the output file will be written to the stdout. If the input file is already supercompressed it will be inflated then supercompressed again using the options specified here and a warning will be issued. If the input file is invalid the first encountered validation error is displayed to the stderr and the command exits with the relevant non-zero status code.

    +

    ktx deflate cannot be applied to KTX files that have been supercompressed with BasisLZ.

    +

    +OPTIONS

    +

    The following options are available:

    +
    --zstd <level>
    +
    Supercompress the data with Zstandard. Cannot be used with ETC1S / BasisLZ format. Level range is [1,22]. Lower levels give faster but worse compression. Values above 20 should be used with caution as they require more memory.
    +
    --zlib <level>
    +
    Supercompress the data with ZLIB. Cannot be used with ETC1S / BasisLZ format. Level range is [1,9]. Lower levels give faster but worse compression.
    +
    +
    +
    -q, –quiet
    +
    Silence warning about already supercompressed input fiile.
    +
    -e, –warnings-as-errors
    +
    Treat warnings as errors.
    +
    +
    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +

    +EXIT STATUS

    +
      +
    • 0 - Success
    • +
    • 1 - Command line error
    • +
    • 2 - IO failure
    • +
    • 3 - Invalid input file
    • +
    • 4 - Runtime or library error
    • +
    • 5 - Not supported state or operation
    • +
    • 6 - Requested feature is not yet implemented
    • +
    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version
    • +
    +
    +

    +AUTHOR

    +
      +
    • Mark Callow [@MarkCallow]
    • +
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktx_encode.html b/ktx/build/docs/html/ktxtools/ktx_encode.html new file mode 100644 index 0000000..bb0354b --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktx_encode.html @@ -0,0 +1,300 @@ + + + + + + + +KTX Tools Reference: ktx encode + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx encode
    +
    +
    +

    Encode a KTX2 file.

    +

    +SYNOPSIS

    +

    ktx encode [option...] input-file output-file

    +

    +DESCRIPTION

    +

    ktx encode can encode the KTX file specified as the input-file argument to a universal format or one of the ASTC formats, optionally supercompress the result, and save it as the output-file. If the input-file is '-' the file will be read from the stdin. If the output-path is '-' the output file will be written to the stdout.

    +

    For universal and ASTC LDR formats, the input file must be R8, R8G8, R8G8B8 or R8G8B8A8 (or their sRGB variants).

    +

    If the input file is invalid the first encountered validation error is displayed to the stderr and the command exits with the relevant non-zero status code.

    +

    +OPTIONS

    +

    +General Options

    +

    The following options are available:

    +
    --codec basis-lz | uastc
    +

    Target codec followed by the codec specific options. With each choice the specific and common encoder options listed below become valid, otherwise they are ignored. Case-insensitive.

    +
    +
    basis-lz:
    +
    Supercompress the image data with transcodable ETC1S / BasisLZ. RED images will become RGB with RED in each component (RRR). RG images will have R in the RGB part and G in the alpha part of the compressed texture (RRRG). When set, the basis-lz options become valid.
    +
    uastc:
    +
    Create a texture in high-quality transcodable UASTC format. When set the uastc options become valid.
    +
    +

    +
    +
    --format
    +
    KTX format enum that specifies the target ASTC format. Non-ASTC formats are invalid. When specified the ASTC-specific and common encoder options listed below become valid, otherwise they are ignored.
    +
    +
    +
    --zstd <level>
    +
    Supercompress the data with Zstandard. Cannot be used with ETC1S / BasisLZ format. Level range is [1,22]. Lower levels give faster but worse compression. Values above 20 should be used with caution as they require more memory.
    +
    --zlib <level>
    +
    Supercompress the data with ZLIB. Cannot be used with ETC1S / BasisLZ format. Level range is [1,9]. Lower levels give faster but worse compression.
    +
    +
    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +

    +Specific and Common Encoding Options

    +

    The following specific and common encoder options are available. Specific options become valid only if their encoder has been selected. Common encoder options become valid when an encoder they apply to has been selected. Otherwise they are ignored.

    +
    ASTC:
    +

    +
    +
    --astc-quality <level>
    +
    The quality level configures the quality-performance tradeoff for the compressor; more complete searches of the search space improve image quality at the expense of compression time. Default is 'medium'. The quality level can be set between fastest (0) and exhaustive (100) via the following fixed quality presets: + + + + + + + + + + + + +
    Level Quality
    fastest (equivalent to quality = 0)
    fast (equivalent to quality = 10)
    medium (equivalent to quality = 60)
    thorough (equivalent to quality = 98)
    exhaustive (equivalent to quality = 100)
    +
    +
    --astc-perceptual
    +
    The codec should optimize for perceptual error, instead of direct RMS error. This aims to improve perceived image quality, but typically lowers the measured PSNR score. Perceptual methods are currently only available for normal maps and RGB color data.
    +
    +
    +
    +
    +
    basis-lz:
    +
    +
    --clevel <level>
    +
    ETC1S / BasisLZ compression level, an encoding speed vs. quality tradeoff. Range is [0,6], default is 1. Higher values are slower but give higher quality. Use --qlevel first.
    +
    --qlevel <level>
    +

    ETC1S / BasisLZ quality level. Range is [1,255]. Lower gives better compression/lower quality/faster. Higher gives less compression/higher quality/slower. --qlevel automatically determines values for --max-endpoints, --max-selectors, --endpoint-rdo-threshold and --selector-rdo-threshold for the target quality level. Setting these options overrides the values determined by -qlevel which defaults to 128 if neither it nor --max-endpoints and --max-selectors have been set.

    +

    Note that both of --max-endpoints and --max-selectors must be set for them to have any effect. If all three options are set, a warning will be issued that --qlevel will be ignored.

    +

    Note also that --qlevel will only determine values for --endpoint-rdo-threshold and --selector-rdo-threshold when its value exceeds 128, otherwise their defaults will be used.

    +
    +
    --max-endpoints <arg>
    +
    Manually set the maximum number of color endpoint clusters. Range is [1,16128]. Default is 0, unset.
    +
    --endpoint-rdo-threshold <arg>
    +
    Set endpoint RDO quality threshold. The default is 1.25. Lower is higher quality but less quality per output bit (try [1.0,3.0]). This will override the value chosen by --qlevel.
    +
    --max-selectors <arg>
    +
    Manually set the maximum number of color selector clusters from [1,16128]. Default is 0, unset.
    +
    --selector-rdo-threshold <arg>
    +
    Set selector RDO quality threshold. The default is 1.25. Lower is higher quality but less quality per output bit (try [1.0,3.0]). This will override the value chosen by --qlevel.
    +
    --no-endpoint-rdo
    +
    Disable endpoint rate distortion optimizations. Slightly faster, less noisy output, but lower quality per output bit. Default is to do endpoint RDO.
    +
    --no-selector-rdo
    +
    Disable selector rate distortion optimizations. Slightly faster, less noisy output, but lower quality per output bit. Default is to do selector RDO.
    +
    +

    +
    +
    uastc:
    +

    +
    +
    --uastc-quality <level>
    +

    This optional parameter selects a speed vs quality tradeoff as shown in the following table:

    + + + + + + + + + + + + + +
    LevelSpeedQuality
    0 Fastest 43.45dB
    1 Faster 46.49dB
    2 Default 47.47dB
    3 Slower 48.01dB
    4 Very slow 48.24dB
    +

    You are strongly encouraged to also specify --zstd to losslessly compress the UASTC data. This and any LZ-style compression can be made more effective by conditioning the UASTC texture data using the Rate Distortion Optimization (RDO) post-process stage. When uastc encoding is set the following options become available for controlling RDO:

    +
    +
    --uastc-rdo
    +
    Enable UASTC RDO post-processing.
    +
    --uastc-rdo-l <lambda>
    +

    Set UASTC RDO quality scalar (lambda) to lambda. Lower values yield higher quality/larger LZ compressed files, higher values yield lower quality/smaller LZ compressed files. A good range to try is [.25,10]. For normal maps a good range is [.25,.75]. The full range is [.001,10.0]. Default is 1.0.

    +

    Note that previous versions used the --uastc-rdo-q option which was removed because the RDO algorithm changed.

    +
    +
    --uastc-rdo-d <dictsize>
    +
    Set UASTC RDO dictionary size in bytes. Default is 4096. Lower values=faster, but give less compression. Range is [64,65536].
    +
    --uastc-rdo-b <scale>
    +
    Set UASTC RDO max smooth block error scale. Range is [1.0,300.0]. Default is 10.0, 1.0 is disabled. Larger values suppress more artifacts (and allocate more bits) on smooth blocks.
    +
    --uastc-rdo-s <deviation>
    +
    Set UASTC RDO max smooth block standard deviation. Range is [.01,65536.0]. Default is 18.0. Larger values expand the range of blocks considered smooth.
    +
    --uastc-rdo-f
    +
    Do not favor simpler UASTC modes in RDO mode.
    +
    --uastc-rdo-m
    +
    Disable RDO multithreading (slightly higher compression, deterministic).
    +
    +
    +
    +
    +
    common:
    +
    +
    --normal-mode
    +

    Only valid for linear textures with two or more components. If the input texture has three or four linear components it is assumed to be a three component linear normal map storing unit length normals as (R=X, G=Y, B=Z). A fourth component will be ignored. The map will be converted to a two component X+Y normal map stored as (RGB=X, A=Y) prior to encoding. If unsure that your normals are unit length, use --normalize. If the input has 2 linear components it is assumed to be an X+Y map of unit normals.

    +

    The Z component can be recovered programmatically in shader code by using the equations:

    +        nml.xy = texture(...).ga;              // Load in [0,1]
    +        nml.xy = nml.xy * 2.0 - 1.0;           // Unpack to [-1,1]
    +        nml.z = sqrt(1 - dot(nml.xy, nml.xy)); // Compute Z
    +                

    For ETC1S / BasisLZ encoding, '--encode basis-lz', RDO is disabled (no selector RDO, no endpoint RDO) to provide better quality.

    +
    +
    --threads <count>
    +
    Explicitly set the number of threads to use during compression. By default, ETC1S / BasisLZ will use the number of threads reported by thread::hardware_concurrency or 1 if value returned is 0.
    +
    --no-sse
    +
    Forbid use of the SSE instruction set. Ignored if CPU does not support SSE. SSE can only be disabled for the basis-lz and uastc encoders. Ignored for other encoders..
    +
    +
    +
    +
    +
    +
    +
    --compare-ssim
    +
    Calculate encoding structural similarity index measure (SSIM) and print it to stdout. Requires Basis-LZ, UASTC or ASTC encoding.
    +
    --compare-psnr
    +
    Calculate encoding peak signal-to-noise ratio (PSNR) and print it to stdout. Requires Basis-LZ, UASTC or ASTC encoding.
    +
    +
    +
    +

    +EXIT STATUS

    +
      +
    • 0 - Success
    • +
    • 1 - Command line error
    • +
    • 2 - IO failure
    • +
    • 3 - Invalid input file
    • +
    • 4 - Runtime or library error
    • +
    • 5 - Not supported state or operation
    • +
    • 6 - Requested feature is not yet implemented
    • +
    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version.
    • +
    +
    +
    Version 4.4
      +
    • Reorganize encoding options.
    • +
    +
    +

    +AUTHOR

    +
      +
    • Mátyás Császár [Vader], RasterGrid www.rastergrid.com
    • +
    • Daniel Rákos, RasterGrid www.rastergrid.com
    • +
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktx_extract.html b/ktx/build/docs/html/ktxtools/ktx_extract.html new file mode 100644 index 0000000..a4e18ec --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktx_extract.html @@ -0,0 +1,188 @@ + + + + + + + +KTX Tools Reference: ktx extract + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx extract
    +
    +
    +

    Extract selected images from a KTX2 file.

    +

    +SYNOPSIS

    +

    ktx extract [option...] input-file output-path

    +

    +DESCRIPTION

    +

    ktx extract can extract one or multiple images from the KTX2 file specified as the input-file argument and, based on the format, save them as Raw, EXR or PNG image files to the output-path. If the input-file is '-' the file will be read from the stdin. If the output-path is '-' the output file will be written to the stdout. If the input file is invalid the first encountered validation error is displayed to the stderr and the command exits with the relevant non-zero status code.

    +

    The output-path is interpreted as output filepath for single and output directory for multi-image extracts. When extracting multiple images with either '–all' or any of the 'all' args the following naming is used for each output file:

    output-path/output_level{}_face{}_layer{}_depth{}.extension
      +
    • Where the _level{} part is only present if the source texture has more than 1 level
    • +
    • Where the _face{} part is only present if the source texture is cubemap or cubemap array (Cubemap)
    • +
    • Where the _layer{} part is only present if the source texture is an array texture (Array)
    • +
    • Where the _depth{} part is only present if the source texture baseDepth is more than 1 (3D)
    • +
    • Where the {} is replaced with the numeric index of the given component starting from 0
    • +
    • Where the extension part is "raw", "png" or "exr" based on the export format
      + Note: The inclusion of the optional parts are determined by the source texture regardless of which images are requested.
    • +
    +

    For non-raw exports the output image format is chosen to be the smallest related lossless format:

      +
    • _UNORM formats exported as PNG with RGB/RGBA 8/16 bit
    • +
    • _SINT/_UINT formats exported as EXR with R/RG/RGB/RGBA Half/Float/UInt
    • +
    • _SFLOAT/_UFLOAT formats exported as EXR with R/RG/RGB/RGBA Half/Float/UInt
    • +
    • D16_UNORM exported as PNG with luminance (Gray) 16 bit
    • +
    • Other Depth/Stencil formats exported as EXR with D/S/DS Half/Float
    • +
    +

    +OPTIONS

    +

    The following options are available:

    +
    --transcode <target>
    +
    Transcode the texture to the target format before executing the extract. Requires the input file to be transcodable (it must be either BasisLZ supercompressed or has UASTC color model in the DFD). This option matches the functionality of the ktx transcode command. If the target option is not set the r8, rg8, rgb8 or rgba8 target will be selected based on the number of channels in the input texture. Block compressed transcode targets can only be saved in raw format. Case-insensitive. Possible options are: etc-rgb | etc-rgba | eac-r11 | eac-rg11 | bc1 | bc3 | bc4 | bc5 | bc7 | astc | r8 | rg8 | rgb8 | rgba8. etc-rgb is ETC1; etc-rgba, eac-r11 and eac-rg11 are ETC2.
    +
    +
    +
    --uri <uri>
    +
    KTX Fragment URI. https://registry.khronos.org/KTX/specs/2.0/ktx-frag.html
    +
    --level [0-9]+ | all
    +
    Level to extract. When 'all' is used every level is exported. Defaults to 0.
    +
    --layer [0-9]+ | all
    +
    Layer to extract. When 'all' is used every layer is exported. Defaults to 0.
    +
    --face [0-9]+ | all
    +
    Face to extract. When 'all' is used every face is exported. Defaults to 0.
    +
    --depth [0-9]+ | all
    +
    Depth slice to extract. When 'all' is used every depth is exported. Defaults to 0.
    +
    --all
    +
    Extract every image slice from the texture.
    +
    --raw
    +
    Extract the raw image data without any conversion.
    +
    +
    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +

    +EXIT STATUS

    +
      +
    • 0 - Success
    • +
    • 1 - Command line error
    • +
    • 2 - IO failure
    • +
    • 3 - Invalid input file
    • +
    • 4 - Runtime or library error
    • +
    • 5 - Not supported state or operation
    • +
    • 6 - Requested feature is not yet implemented
    • +
    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version
    • +
    +
    +

    +AUTHOR

    +
      +
    • Mátyás Császár [Vader], RasterGrid www.rastergrid.com
    • +
    • Daniel Rákos, RasterGrid www.rastergrid.com
    • +
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktx_help.html b/ktx/build/docs/html/ktxtools/ktx_help.html new file mode 100644 index 0000000..bdc0c6c --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktx_help.html @@ -0,0 +1,173 @@ + + + + + + + +KTX Tools Reference: ktx help + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx help
    +
    +
    +

    Display help information about the ktx tool.

    +

    +SYNOPSIS

    +

    ktx help [option...] [command]

    +

    +DESCRIPTION

    +

    ktx help displays the man page of a specific ktx command specified as the command argument. On windows systems the man pages are opened with the system default browser in html format. On systems derived from Unix the man pages are opened with the man command.

    +

    To support custom install locations the tool first tries to use the man files relative to the executable and falls back to the system man pages.

    +

    command specifies which command's man page will be displayed. If command is s missing the main ktx tool man page will be displayed. Possible choices are:
    +

    +

    +OPTIONS

    +
    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +

    +EXIT STATUS

    +
      +
    • 0 - Success
    • +
    • 1 - Command line error
    • +
    • 2 - IO failure
    • +
    • 3 - Invalid input file
    • +
    • 4 - Runtime or library error
    • +
    • 5 - Not supported state or operation
    • +
    • 6 - Requested feature is not yet implemented
    • +
    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version
    • +
    +
    +

    +AUTHOR

    +
      +
    • Mátyás Császár [Vader], RasterGrid www.rastergrid.com
    • +
    • Daniel Rákos, RasterGrid www.rastergrid.com
    • +
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktx_info.html b/ktx/build/docs/html/ktxtools/ktx_info.html new file mode 100644 index 0000000..eb57524 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktx_info.html @@ -0,0 +1,162 @@ + + + + + + + +KTX Tools Reference: ktx info + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx info
    +
    +
    +

    Print information about a KTX2 file.

    +

    +SYNOPSIS

    +

    ktx info [option...] input-file

    +

    +DESCRIPTION

    +

    ktx info prints information about the KTX v1 or v2 file specified as the input-file argument. If the input-file is '-' the file will be read from the stdin. The command implicitly calls validate for KTX v2 files and prints any found errors and warnings to stdout. If the specified input file is invalid the information is displayed based on best effort and may be incomplete.

    +

    The JSON output formats conform to the https://schema.khronos.org/ktx/info_v0.json schema even if the input file is invalid and certain information cannot be parsed or displayed. Additionally, for JSON outputs the KTX file identifier is printed using "\u001A" instead of "\x1A" as an unescaped "\x1A" sequence inside a JSON string breaks nearly every JSON tool. Note that this does not change the value of the string only its representation. JSON output is only supported for KTX v2 files. If requested for a KTX v1 file, an error is generated.

    +
    Note
    ktx info prints using UTF-8 encoding. If your console is not set for UTF-8 you will see incorrect characters in output of the file identifier on each side of the "KTX nn".
    +

    +OPTIONS

    +

    The following options are available:

    +
    --format text | json | mini-json
    +
    Specifies the report output format. Possible options are:
    + text - Human readable text based format.
    + json - Formatted JSON.
    + mini-json - Minified JSON.
    + The default format is text.
    +
    +
    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +

    +EXIT STATUS

    +
      +
    • 0 - Success
    • +
    • 1 - Command line error
    • +
    • 2 - IO failure
    • +
    • 3 - Invalid input file
    • +
    • 4 - Runtime or library error
    • +
    • 5 - Not supported state or operation
    • +
    • 6 - Requested feature is not yet implemented
    • +
    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version
    • +
    +
    +

    +AUTHOR

    +
      +
    • Mátyás Császár [Vader], RasterGrid www.rastergrid.com
    • +
    • Daniel Rákos, RasterGrid www.rastergrid.com
    • +
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktx_logo_200.png b/ktx/build/docs/html/ktxtools/ktx_logo_200.png new file mode 100644 index 0000000..9bacd67 Binary files /dev/null and b/ktx/build/docs/html/ktxtools/ktx_logo_200.png differ diff --git a/ktx/build/docs/html/ktxtools/ktx_transcode.html b/ktx/build/docs/html/ktxtools/ktx_transcode.html new file mode 100644 index 0000000..94a50ed --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktx_transcode.html @@ -0,0 +1,162 @@ + + + + + + + +KTX Tools Reference: ktx transcode + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx transcode
    +
    +
    +

    Transcode a KTX2 file.

    +

    +SYNOPSIS

    +

    ktx transcode [option...] input-file output-file

    +

    +DESCRIPTION

    +

    ktx transcode can transcode the KTX file specified as the input-file argument, optionally supercompress the result, and save it as the output-file. If the input-file is '-' the file will be read from the stdin. If the output-path is '-' the output file will be written to the stdout. The input file must be transcodable (it must be either BasisLZ supercompressed or has UASTC color model in the DFD). If the input file is invalid the first encountered validation error is displayed to the stderr and the command exits with the relevant non-zero status code.

    +

    +OPTIONS

    +

    The following options are available:

    +
    --target <target>
    +
    Target transcode format. If the target option is not set the r8, rg8, rgb8 or rgba8 target will be selected based on the number of channels in the input texture. Block compressed transcode targets can only be saved in raw format. Case-insensitive. Possible options are: etc-rgb | etc-rgba | eac-r11 | eac-rg11 | bc1 | bc3 | bc4 | bc5 | bc7 | astc | r8 | rg8 | rgb8 | rgba8. etc-rgb is ETC1; etc-rgba, eac-r11 and eac-rg11 are ETC2.
    +
    +
    +
    --zstd <level>
    +
    Supercompress the data with Zstandard. Cannot be used with ETC1S / BasisLZ format. Level range is [1,22]. Lower levels give faster but worse compression. Values above 20 should be used with caution as they require more memory.
    +
    --zlib <level>
    +
    Supercompress the data with ZLIB. Cannot be used with ETC1S / BasisLZ format. Level range is [1,9]. Lower levels give faster but worse compression.
    +
    +
    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +

    +EXIT STATUS

    +
      +
    • 0 - Success
    • +
    • 1 - Command line error
    • +
    • 2 - IO failure
    • +
    • 3 - Invalid input file
    • +
    • 4 - Runtime or library error
    • +
    • 5 - Not supported state or operation
    • +
    • 6 - Requested feature is not yet implemented
    • +
    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version
    • +
    +
    +

    +AUTHOR

    +
      +
    • Mátyás Császár [Vader], RasterGrid www.rastergrid.com
    • +
    • Daniel Rákos, RasterGrid www.rastergrid.com
    • +
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktx_validate.html b/ktx/build/docs/html/ktxtools/ktx_validate.html new file mode 100644 index 0000000..ae03ec9 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktx_validate.html @@ -0,0 +1,169 @@ + + + + + + + +KTX Tools Reference: ktx validate + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx validate
    +
    +
    +

    Validate a KTX2 file.

    +

    +SYNOPSIS

    +

    ktx validate [option...] input-file

    +

    +DESCRIPTION

    +

    ktx validate validates the Khronos texture format version 2 (KTX2) file specified as the input-file argument. It prints any found errors and warnings to stdout. If the input-file is '-' the file will be read from the stdin.

    +

    The validation rules and checks are based on the official specification: KTX File Format Specification - https://registry.khronos.org/KTX/specs/2.0/ktxspec.v2.html

    +

    The JSON output formats conform to the https://schema.khronos.org/ktx/validate_v0.json schema.

    +
    Note
    ktx validate prints using UTF-8 encoding. If your console is not set for UTF-8 you will see incorrect characters in output of the file identifier on each side of the "KTX nn".
    +

    +OPTIONS

    +

    The following options are available:

    +
    --format text | json | mini-json
    +
    Specifies the report output format. Possible options are:
    + text - Human readable text based format.
    + json - Formatted JSON.
    + mini-json - Minified JSON.
    + The default format is text.
    +
    +
    +
    -g, --gltf-basisu
    +
    Check compatibility with KHR_texture_basisu glTF extension.
    +
    -e, --warnings-as-errors
    +
    Treat warnings as errors.
    +
    +
    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +

    +EXIT STATUS

    +
      +
    • 0 - Success
    • +
    • 1 - Command line error
    • +
    • 2 - IO failure
    • +
    • 3 - Invalid input file
    • +
    • 4 - Runtime or library error
    • +
    • 5 - Not supported state or operation
    • +
    • 6 - Requested feature is not yet implemented
    • +
    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version
    • +
    +
    +

    +AUTHOR

    +
      +
    • Mátyás Császár [Vader], RasterGrid www.rastergrid.com
    • +
    • Daniel Rákos, RasterGrid www.rastergrid.com
    • +
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktxinfo.html b/ktx/build/docs/html/ktxtools/ktxinfo.html new file mode 100644 index 0000000..befcb5a --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktxinfo.html @@ -0,0 +1,140 @@ + + + + + + + +KTX Tools Reference: ktxinfo + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktxinfo
    +
    +
    +

    Print information about KTX or KTX2 files.

    +

    +SYNOPSIS

    +

    ktxinfo [options] [infile ...]

    +

    +DESCRIPTION

    +

    ktxinfo prints information about the KTX files provided as arguments. If no arguments are given, it prints information about a single file read from standard input.

    +
    Note
    ktxinfo prints using UTF-8 encoding. If your console is not set for UTF-8 you will see incorrect characters in output of the file identifier on each side of the "KTX nn".
    +

    The following options are available:

    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +

    +EXIT STATUS

    +

    ktxinfo exits 0 on success, 1 on command line errors and 2 if one of the input files is not a KTX file.

    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version
    • +
    +
    +

    +AUTHOR

    +

    Mark Callow, github.com/MarkCallow

    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/ktxsc.html b/ktx/build/docs/html/ktxtools/ktxsc.html new file mode 100644 index 0000000..4117936 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/ktxsc.html @@ -0,0 +1,323 @@ + + + + + + + +KTX Tools Reference: ktxsc + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    KTX Tools Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktxsc
    +
    +
    +

    Supercompress the images in a KTX2 file.

    +

    +SYNOPSIS

    +

    ktxsc [options] [infile ...]

    +

    +DESCRIPTION

    +

    ktxsc can encode and supercompress the images in Khronos texture format version 2 files (KTX2). Uncompressed files, i.e those whose vkFormat name does not end in _BLOCK can be encoded to ASTC, Basis Universal (encoded to ETC1S then supercompressed with an integrated LZ step) or UASTC and optionally supercompressed with Zstandard (zstd). Any image format, except Basis Universal, can be supercompressed with zstd. For best results with UASTC, the data should be conditioned for zstd by using the --uastc_rdo_q and, optionally, --uastc_rdo_d options.

    +

    ktxsc reads each named infile and compresses it in place. When infile is not specified, a single file will be read from stdin and the output written to stdout. When one or more files is specified each will be compressed in place.

    +

    The following options are available:

    +
    -o outfile, –output=outfile
    +
    Write the output to outfile. If outfile is 'stdout', output will be written to stdout. Parent directories will be created, if necessary. If there is more than 1 infile the command prints its usage message and exits.
    +
    -f, --force
    +
    If the destination file cannot be opened, remove it and create a new file, without prompting for confirmation regardless of its permissions.
    +
    --t2
    +
    Output a KTX version2 file. Always true.
    +
    +
    +
    --encode <astc | etc1s | uastc>
    +
    Compress the image data to ASTC, transcodable ETC1S / BasisLZ or high-quality transcodable UASTC format. Implies --t2. With each encoding option the following encoder specific options become valid, otherwise they are ignored.
    +
    astc:
    +
    Create a texture in high-quality ASTC format.
    +
    --astc_blk_d <XxY | XxYxZ>
    +
    Specify which block dimension to use for compressing the textures. e.g. --astc_blk_d 6x5 for 2D or --astc_blk_d 6x6x6 for 3D. 6x6 is the default for 2D. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Supported 2D block dimensions are:
    4x48.00 bpp
    5x46.40 bpp
    5x55.12 bpp
    6x54.27 bpp
    6x63.56 bpp
    8x53.20 bpp
    8x62.67 bpp
    10x52.56 bpp
    10x62.13 bpp
    8x82.00 bpp
    10x81.60 bpp
    10x101.28 bpp
    12x101.07 bpp
    12x120.89 bpp
    Supported 3D block dimensions are:
    3x3x34.74 bpp
    4x3x33.56 bpp
    4x4x32.67 bpp
    4x4x42.00 bpp
    5x4x41.60 bpp
    5x5x41.28 bpp
    5x5x51.02 bpp
    6x5x50.85 bpp
    6x6x50.71 bpp
    6x6x60.59 bpp
    +
    +
    --astc_mode <ldr | hdr>
    +
    Specify which encoding mode to use. LDR is the default unless the input image is 16-bit in which case the default is HDR.
    +
    --astc_quality <level>
    +
    The quality level configures the quality-performance tradeoff for the compressor; more complete searches of the search space improve image quality at the expense of compression time. Default is 'medium'. The quality level can be set between fastest (0) and exhaustive (100) via the following fixed quality presets: + + + + + + + + + + + + +
    Level Quality
    fastest (equivalent to quality = 0)
    fast (equivalent to quality = 10)
    medium (equivalent to quality = 60)
    thorough (equivalent to quality = 98)
    exhaustive (equivalent to quality = 100)
    +
    +
    --astc_perceptual
    +
    The codec should optimize for perceptual error, instead of direct RMS error. This aims to improve perceived image quality, but typically lowers the measured PSNR score. Perceptual methods are currently only available for normal maps and RGB color data.
    +
    +
    +
    etc1s:
    +
    Supercompress the image data with ETC1S / BasisLZ. RED images will become RGB with RED in each component. RG images will have R in the RGB part and G in the alpha part of the compressed texture. When set, the following BasisLZ-related options become valid, otherwise they are ignored.
    +
    --no_multithreading
    +
    Disable multithreading. Deprecated. For backward compatibility. Use --threads 1 instead.
    +
    --clevel <level>
    +
    ETC1S / BasisLZ compression level, an encoding speed vs. quality tradeoff. Range is [0,5], default is 1. Higher values are slower but give higher quality.
    +
    --qlevel <level>
    +

    ETC1S / BasisLZ quality level. Range is [1,255]. Lower gives better compression/lower quality/faster. Higher gives less compression/higher quality/slower. --qlevel automatically determines values for --max_endpoints, --max-selectors, --endpoint_rdo_threshold and --selector_rdo_threshold for the target quality level. Setting these options overrides the values determined by -qlevel which defaults to 128 if neither it nor both of --max_endpoints and --max_selectors have been set.

    +

    Note that both of --max_endpoints and --max_selectors must be set for them to have any effect. If all three options are set, a warning will be issued that --qlevel will be ignored.

    +

    Note also that --qlevel will only determine values for --endpoint_rdo_threshold and --selector_rdo_threshold when its value exceeds 128, otherwise their defaults will be used.

    +
    +
    --max_endpoints <arg>
    +
    Manually set the maximum number of color endpoint clusters. Range is [1,16128]. Default is 0, unset.
    +
    --endpoint_rdo_threshold <arg>
    +
    Set endpoint RDO quality threshold. The default is 1.25. Lower is higher quality but less quality per output bit (try [1.0,3.0]). This will override the value chosen by --qlevel.
    +
    --max_selectors <arg>
    +
    Manually set the maximum number of color selector clusters from [1,16128]. Default is 0, unset.
    +
    --selector_rdo_threshold <arg>
    +
    Set selector RDO quality threshold. The default is 1.25. Lower is higher quality but less quality per output bit (try [1.0,3.0]). This will override the value chosen by --qlevel.
    +
    --no_endpoint_rdo
    +
    Disable endpoint rate distortion optimizations. Slightly faster, less noisy output, but lower quality per output bit. Default is to do endpoint RDO.
    +
    --no_selector_rdo
    +
    Disable selector rate distortion optimizations. Slightly faster, less noisy output, but lower quality per output bit. Default is to do selector RDO.
    +
    +
    +
    uastc:
    +
    Create a texture in high-quality transcodable UASTC format.
    +
    --uastc_quality <level>
    +

    This optional parameter selects a speed vs quality tradeoff as shown in the following table:

    + + + + + + + + + + + + + +
    LevelSpeedQuality
    0 Fastest 43.45dB
    1 Faster 46.49dB
    2 Default 47.47dB
    3 Slower 48.01dB
    4 Very slow 48.24dB
    +

    You are strongly encouraged to also specify --zcmp to losslessly compress the UASTC data. This and any LZ-style compression can be made more effective by conditioning the UASTC texture data using the Rate Distortion Optimization (RDO) post-process stage. When uastc encoding is set the following options become available for controlling RDO:

    +
    +
    --uastc_rdo_l [<lambda>]
    +

    Enable UASTC RDO post-processing and optionally set UASTC RDO quality scalar (lambda) to lambda. Lower values yield higher quality/larger LZ compressed files, higher values yield lower quality/smaller LZ compressed files. A good range to try is [.25,10]. For normal maps a good range is [.25,.75]. The full range is [.001,10.0]. Default is 1.0.

    +

    Note that previous versions used the --uastc_rdo_q option which was removed because the RDO algorithm changed.

    +
    +
    --uastc_rdo_d <dictsize>
    +
    Set UASTC RDO dictionary size in bytes. Default is 4096. Lower values=faster, but give less compression. Range is [64,65536].
    +
    --uastc_rdo_b <scale>
    +
    Set UASTC RDO max smooth block error scale. Range is [1.0,300.0]. Default is 10.0, 1.0 is disabled. Larger values suppress more artifacts (and allocate more bits) on smooth blocks.
    +
    --uastc_rdo_s <deviation>
    +
    Set UASTC RDO max smooth block standard deviation. Range is [.01,65536.0]. Default is 18.0. Larger values expand the range of blocks considered smooth.
    +
    --uastc_rdo_f
    +
    Do not favor simpler UASTC modes in RDO mode.
    +
    --uastc_rdo_m
    +
    Disable RDO multithreading (slightly higher compression, deterministic).
    +
    +
    +
    --input_swizzle <swizzle>
    +
    Swizzle the input components according to swizzle which is an alhpanumeric sequence matching the regular expression ^[rgba01]{4}$.
    +
    --normal_mode
    +

    Only valid for linear textures with two or more components. If the input texture has three or four linear components it is assumed to be a three component linear normal map storing unit length normals as (R=X, G=Y, B=Z). A fourth component will be ignored. The map will be converted to a two component X+Y normal map stored as (RGB=X, A=Y) prior to encoding. If unsure that your normals are unit length, use --normalize. If the input has 2 linear components it is assumed to be an X+Y map of unit normals.

    +

    The Z component can be recovered programmatically in shader code by using the equations:

    +          nml.xy = texture(...).ga;              // Load in [0,1]
    +          nml.xy = nml.xy * 2.0 - 1.0;           // Unpack to [-1,1]
    +          nml.z = sqrt(1 - dot(nml.xy, nml.xy)); // Compute Z
    +                     

    For ASTC encoding, '--encode astc', encoder parameters are tuned for better quality on normal maps. For ETC1S encoding, '--encode etc1s', RDO is disabled (no selector RDO, no endpoint RDO) to provide better quality.

    +

    In toktx you can prevent conversion of the normal map to two components by specifying '--input_swizzle rgb1'.

    +
    +
    --normalize
    +
    Normalize input normals to have a unit length. Only valid for linear textures with 2 or more components. For 2-component inputs 2D unit normals are calculated. Do not use these 2D unit normals to generate X+Y normals for –normal_mode. For 4-component inputs a 3D unit normal is calculated. 1.0 is used for the value of the 4th component.
    +
    --no_sse
    +
    Forbid use of the SSE instruction set. Ignored if CPU does not support SSE. Only the Basis Universal compressor uses SSE.
    +
    --bcmp
    +
    Deprecated. Use '--encode etc1s' instead.
    +
    --uastc [<level>]
    +
    Deprecated. Use '--encode uastc' instead.
    +
    --zcmp [<compressionLevel>]
    +
    Supercompress the data with Zstandard. Implies --t2. Can be used with data in any format except ETC1S / BasisLZ. Most effective with RDO-conditioned UASTC or uncompressed formats. The optional compressionLevel range is 1 - 22 and the default is 3. Lower values=faster but give less compression. Values above 20 should be used with caution as they require more memory.
    +
    --threads <count>
    +
    Explicitly set the number of threads to use during compression. By default, ETC1S / BasisLZ and ASTC compression will use the number of threads reported by thread::hardware_concurrency or 1 if value returned is 0.
    +
    --verbose
    +
    Print encoder/compressor activity status to stdout. Currently only the astc, etc1s and uastc encoders emit status.
    +
    +
    +
    -h, --help
    +
    Print this usage message and exit.
    +
    -v, --version
    +
    Print the version number of this program and exit.
    +
    +
        In case of ambiguity, such as when the last option is one with an optional
    +    parameter, separate options from file names with " -- ".
    +
    +    Any specified ASTC, ETC1S / BasisLZ, UASTC and supercompression options are
    +    recorded in the metadata item @c KTXwriterScParams in the output file.
    +

    +EXIT STATUS

    +

    ktxsc exits 0 on success, 1 on command line errors and 2 on functional errors.

    +

    +HISTORY

    +
    Version 4.0
      +
    • Initial version.
    • +
    +
    +

    +AUTHOR

    +

    Mark Callow, github.com/MarkCallow

    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/ktxtools/menu.js b/ktx/build/docs/html/ktxtools/menu.js new file mode 100644 index 0000000..15f9c52 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/menu.js @@ -0,0 +1,131 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search,treeview) { + function makeTree(data,relPath) { + let result=''; + if ('children' in data) { + result+='
      '; + for (let i in data.children) { + let url; + const link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + let searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
    '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '+ + '
    '+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + $('#main-menu').append('
  • '); + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; + if ($mainMenuState.length) { + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(treeview); + } + // animate mobile menu + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = () => $menu.css('display', 'block'); + $menu.hide().slideDown(options); + } else { + options['complete'] = () => $menu.css('display', 'none'); + $menu.show().slideUp(options); + } + }); + // set default menu visibility + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/ktx/build/docs/html/ktxtools/menudata.js b/ktx/build/docs/html/ktxtools/menudata.js new file mode 100644 index 0000000..e4ef5b7 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/menudata.js @@ -0,0 +1,32 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"KTX Tools Reference",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Package",url:"../index.html"}, +{text:"libktx Reference",url:"../libktx/index.html"}, +{text:"KTX Javascript Wrappers Reference",url:"../ktxjswrappers/index.html"}, +{text:"pyktx Reference",url:"../pyktx/index.html"}, +{text:"License",url:"../license.html"}]} diff --git a/ktx/build/docs/html/ktxtools/navtree.css b/ktx/build/docs/html/ktxtools/navtree.css new file mode 100644 index 0000000..0ea3a07 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/navtree.css @@ -0,0 +1,327 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0; + padding:0; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + position: relative; + background-color: var(--nav-menu-active-bg); + border-radius: 0 6px 6px 0; + /*margin-right: 5px;*/ +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); + line-height: 22px; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--page-link-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin: 0 6px 0 -5px; + padding: 0 0 0 5px; + height: 22px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; +} + +.ui-resizable-e:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +.ui-resizable-e:hover { + opacity: 1; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ + scrollbar-width: thin; + border-right: 1px solid var(--nav-border-color); + padding-left: 5px; +} + +#nav-sync { + position:absolute; + top:0px; + right:0px; + z-index:1; +} + +#nav-sync img { + opacity:0.3; +} + +div.nav-sync-icon { + position: relative; + width: 24px; + height: 17px; + left: -6px; + top: -1px; + opacity: 0.7; + display: inline-block; + background-color: var(--sync-icon-background-color); + border: 1px solid var(--sync-icon-border-color); + box-sizing: content-box; +} + +div.nav-sync-icon:hover { + background-color: var(--sync-icon-selected-background-color); + opacity: 1.0; +} + +div.nav-sync-icon.active:after { + content: ''; + background-color: var(--sync-icon-background-color); + border-top: 2px solid var(--sync-icon-color); + position: absolute; + width: 16px; + height: 0px; + top: 7px; + left: 4px; +} + +div.nav-sync-icon.active:hover:after { + border-top: 2px solid var(--sync-icon-selected-color); +} + +span.sync-icon-left { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 4px; + display: inline-block; + width: 8px; + height: 8px; + border-left: 2px solid var(--sync-icon-color); + border-top: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +span.sync-icon-right { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 10px; + display: inline-block; + width: 8px; + height: 8px; + border-right: 2px solid var(--sync-icon-color); + border-bottom: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +div.nav-sync-icon:hover span.sync-icon-left { + border-left: 2px solid var(--sync-icon-selected-color); + border-top: 2px solid var(--sync-icon-selected-color); +} + +div.nav-sync-icon:hover span.sync-icon-right { + border-right: 2px solid var(--sync-icon-selected-color); + border-bottom: 2px solid var(--sync-icon-selected-color); +} + +#nav-path ul { + border-top: 1px solid var(--nav-breadcrumb-separator-color); +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + +/*---------------------------*/ +#container { + display: grid; + grid-template-columns: auto auto; + overflow: hidden; +} + +#page-nav { + background: var(--nav-background-color); + display: block; + width: 250px; + box-sizing: content-box; + position: relative; + border-left: 1px solid var(--nav-border-color); +} + +#page-nav-tree { + display: inline-block; +} + +#page-nav-resize-handle { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; + z-index: 1; + user-select: none; +} + +#page-nav-resize-handle:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +#page-nav-resize-handle.dragging, +#page-nav-resize-handle:hover { + opacity: 1; +} + +#page-nav-contents { + padding: 0; + margin: 0; + display: block; + top: 0; + left: 0; + height: 100%; + width: 100%; + position: absolute; + overflow: auto; + scrollbar-width: thin; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +ul.page-outline, +ul.page-outline ul { + text-indent: 0; + list-style: none outside none; + padding: 0 0 0 4px; +} + +ul.page-outline { + margin: 0 4px 4px 6px; +} + +ul.page-outline div.item { + font: 12px var(--font-family-nav); + line-height: 22px; +} + +ul.page-outline li { + white-space: nowrap; +} + +ul.page-outline li.vis { + background-color: var(--nav-breadcrumb-active-bg); +} + +#container.resizing { + cursor: col-resize; + user-select: none; +} diff --git a/ktx/build/docs/html/ktxtools/navtree.js b/ktx/build/docs/html/ktxtools/navtree.js new file mode 100644 index 0000000..fac8d01 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/navtree.js @@ -0,0 +1,901 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initNavTree(toroot,relpath,allMembersFile) { + let navTreeSubIndices = []; + const ARROW_DOWN = ''; + const ARROW_RIGHT = ''; + const NAVPATH_COOKIE_NAME = ''+'navpath'; + const fullSidebar = typeof page_layout!=='undefined' && page_layout==1; + + function getScrollBarWidth () { + let outer = $('
    ').css({visibility: 'hidden', width: 100, overflow: 'scroll', scrollbarWidth: 'thin'}).appendTo('body'); + let widthWithScroll = $('
    ').css({width: '100%'}).appendTo(outer).outerWidth(); + outer.remove(); + return 100 - widthWithScroll; + } + const scrollbarWidth = getScrollBarWidth(); + + function adjustSyncIconPosition() { + if (!fullSidebar) { + const nt = document.getElementById("nav-tree"); + const hasVerticalScrollbar = nt.scrollHeight > nt.clientHeight; + $("#nav-sync").css({right:parseInt(hasVerticalScrollbar?scrollbarWidth:0)}); + } + } + + const getData = function(varName) { + const i = varName.lastIndexOf('/'); + const n = i>=0 ? varName.substring(i+1) : varName; + const e = n.replace(/-/g,'_'); + return window[e]; + } + + const stripPath = function(uri) { + return uri.substring(uri.lastIndexOf('/')+1); + } + + const stripPath2 = function(uri) { + const i = uri.lastIndexOf('/'); + const s = uri.substring(i+1); + const m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; + } + + const hashValue = function() { + return $(location).attr('hash').substring(1).replace(/[^\w-]/g,''); + } + + const hashUrl = function() { + return '#'+hashValue(); + } + + const pathName = function() { + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;()]/g, ''); + } + + const storeLink = function(link) { + if (!$("#nav-sync").hasClass('sync')) { + Cookie.writeSetting(NAVPATH_COOKIE_NAME,link,0); + } + } + + const deleteLink = function() { + Cookie.eraseSetting(NAVPATH_COOKIE_NAME); + } + + const cachedLink = function() { + return Cookie.readSetting(NAVPATH_COOKIE_NAME,''); + } + + const getScript = function(scriptName,func) { + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = function() { func(); adjustSyncIconPosition(); } + script.src = scriptName+'.js'; + head.appendChild(script); + } + + const createIndent = function(o,domNode,node) { + let level=-1; + let n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + const imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=ARROW_RIGHT; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).removeClass('opened').addClass('closed'); + node.expanded = false; + } else { + expandNode(o, node, false, true); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + let span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } + } + + let animationInProgress = false; + + const gotoAnchor = function(anchor,aname) { + let pos, docContent = $('#doc-content'); + let ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || + ancParent.is(':header')) { + pos = ancParent.offset().top; + } else if (anchor.position()) { + pos = anchor.offset().top; + } + if (pos) { + const dcOffset = docContent.offset().top; + const dcHeight = docContent.height(); + const dcScrHeight = docContent[0].scrollHeight + const dcScrTop = docContent.scrollTop(); + let dist = Math.abs(Math.min(pos-dcOffset,dcScrHeight-dcHeight-dcScrTop)); + animationInProgress = true; + docContent.animate({ + scrollTop: pos + dcScrTop - dcOffset + },Math.max(50,Math.min(500,dist)),function() { + animationInProgress=false; + if (anchor.parent().attr('class')=='memItemLeft') { + let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname') { + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype') { + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } + }); + } + } + + function htmlToNode(html) { + const template = document.createElement('template'); + template.innerHTML = html; + const nNodes = template.content.childNodes.length; + if (nNodes !== 1) { + throw new Error(`html parameter must represent a single node; got ${nNodes}. `); + } + return template.content.firstChild; + } + + const newNode = function(o, po, text, link, childrenData, lastNode) { + const node = { + children : [], + childrenData : childrenData, + depth : po.depth + 1, + relpath : po.relpath, + isLast : lastNode, + li : document.createElement("li"), + parentNode : po, + itemDiv : document.createElement("div"), + labelSpan : document.createElement("span"), + expanded : false, + childrenUL : null, + getChildrenUL : function() { + if (!this.childrenUL) { + this.childrenUL = document.createElement("ul"); + this.childrenUL.className = "children_ul"; + this.childrenUL.style.display = "none"; + this.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }, + }; + + node.itemDiv.className = "item"; + node.labelSpan.className = "label"; + createIndent(o,node.itemDiv,node); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + const a = document.createElement("a"); + node.labelSpan.appendChild(a); + po.getChildrenUL().appendChild(node.li); + a.appendChild(htmlToNode(''+text+'')); + if (link) { + let url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + const aname = '#'+link.split('#')[1]; + const srcPage = stripPath(pathName()); + const targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : aname; + a.onclick = function() { + storeLink(link); + aPPar = $(a).parent().parent(); + if (!aPPar.hasClass('selected')) { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + aPPar.addClass('selected'); + aPPar.attr('id','selected'); + } + const anchor = $(aname); + gotoAnchor(anchor,aname); + }; + } else { + a.href = url; + a.onclick = () => storeLink(link); + } + } else if (childrenData != null) { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + return node; + } + + const showRoot = function() { + const headerHeight = $("#top").height(); + const footerHeight = $("#nav-path").height(); + const windowHeight = $(window).height() - headerHeight - footerHeight; + (function() { // retry until we can scroll to the selected item + try { + const navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); + } + + const expandNode = function(o, node, imm, setFocus) { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + expandNode(o, node, imm, setFocus); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).addClass('opened').removeClass('closed'); + node.expanded = true; + if (setFocus) { + $(node.expandToggle).focus(); + } + } + } + } + + const glowEffect = function(n,duration) { + n.addClass('glow').delay(duration).queue(function(next) { + $(this).removeClass('glow');next(); + }); + } + + const highlightAnchor = function() { + const aname = hashUrl(); + const anchor = $(aname); + gotoAnchor(anchor,aname); + } + + const selectAndHighlight = function(hash,n) { + let a; + if (hash) { + const link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + let topOffset=5; + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + showRoot(); + } + + const showNode = function(o, node, index, hash) { + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + showNode(o,node,index,hash); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + $(node.plus_img.childNodes[0]).removeClass('closed').addClass('opened'); + node.expanded = true; + const n = node.children[o.breadcrumbs[index]]; + if (index+10) { // try root page without hash as fallback + gotoUrl(o,root,'',relpath); + } else { + o.breadcrumbs = $.extend(true, [], nti); + if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index + navTo(o,NAVTREE[0][1],"",relpath); + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + } + if (o.breadcrumbs) { + o.breadcrumbs.unshift(0); // add 0 for root node + showNode(o, o.node, 0, hash); + } + } + } + + const gotoUrl = function(o,root,hash,relpath) { + const url=root+hash; + let i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function() { + navTreeSubIndices[i] = window['NAVTREEINDEX'+i]; + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); + } + } + + const navTo = function(o,root,hash,relpath) { + const link = cachedLink(); + if (link) { + const parts = link.split('#'); + root = parts[0]; + hash = parts.length>1 ? '#'+parts[1].replace(/[^\w-]/g,'') : ''; + } + if (hash.match(/^#l\d+$/)) { + const anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + gotoUrl(o,root,hash,relpath); + } + + const showSyncOff = function(n,relpath) { + n.html(''); + } + + const showSyncOn = function(n,relpath) { + n.html(''); + } + + const o = { + toroot : toroot, + node : { + childrenData : NAVTREE, + children : [], + childrenUL : document.createElement("ul"), + getChildrenUL : function() { return this.childrenUL }, + li : document.getElementById("nav-tree-contents"), + depth : 0, + relpath : relpath, + expanded : false, + isLast : true, + plus_img : document.createElement("span"), + }, + }; + o.node.li.appendChild(o.node.childrenUL); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = ARROW_RIGHT; + + const navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + + navSync.click(() => { + const navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } + }); + + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + + $(window).bind('hashchange', () => { + if (!animationInProgress) { + if (window.location.hash && window.location.hash.length>1) { + let a; + if ($(location).attr('hash')) { + const clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ try to keep right panel width + const shrinkLeft = Math.min(deficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + const remainingDeficit = deficit - shrinkLeft; + const shrinkRight = Math.min(remainingDeficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + } else { // dragging right handle -> try to keep left panel width + const shrinkRight = Math.min(deficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + const remainingDeficit = deficit - shrinkRight; + const shrinkLeft = Math.min(remainingDeficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + } + } else { + rightPanelWidth = pagenav.length ? Math.max(minPanelWidth,rightPanelWidth) : 0; + leftPanelWidth = Math.max(minPanelWidth,leftPanelWidth); + } + return { leftPanelWidth, rightPanelWidth } + } + + function updateWidths(sidenavWidth,pagenavWidth,dragLeft) + { + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,dragLeft); + const widthStr = parseFloat(widths.leftPanelWidth)+"px"; + content.css({marginLeft:widthStr}); + if (fullSidebar) { + footer.css({marginLeft:widthStr}); + if (mainnav) { + mainnav.css({marginLeft:widthStr}); + } + } + sidenav.css({width:widthStr}); + if (pagenav.length) { + container.css({gridTemplateColumns:'auto '+parseFloat(widths.rightPanelWidth)+'px'}); + if (!dragLeft) { + pagenav.css({width:parseFloat(widths.rightPanelWidth-1)+'px'}); + } + } + return widths; + } + + function resizeWidth(dragLeft) { + const sidenavWidth = $(sidenav).outerWidth()-barWidth; + let pagenavWidth = pagenav.length ? $(pagenav).outerWidth() : 0; + const widths = updateWidths(sidenavWidth,pagenavWidth,dragLeft); + Cookie.writeSetting(RESIZE_COOKIE_NAME,widths.leftPanelWidth-barWidth); + if (pagenav.length) { + Cookie.writeSetting(PAGENAV_COOKIE_NAME,widths.rightPanelWidth); + } + } + + function restoreWidth(sidenavWidth,pagenavWidth) { + updateWidths(sidenavWidth,pagenavWidth,false); + showHideNavBar(); + } + + function resizeHeight() { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (!fullSidebar) { + contentHeight = windowHeight - headerHeight - footerHeight - 1; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (fullSidebar) { + contentHeight = windowHeight - footerHeight - 1; + navtreeHeight = windowHeight - headerHeight - 1; + sideNavHeight = windowHeight - 1; + if (mainnav) { + contentHeight -= mainnav.outerHeight(); + } + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + content.css({height:contentHeight + "px"}); + resizeWidth(false); + showHideNavBar(); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (document.getElementById('main-nav')) { + mainnav = $("#main-nav"); + } + navtree = $("#nav-tree"); + pagenav = $("#page-nav"); + container = $("#container"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(true); } }); + $(sidenav).resizable({ minWidth: 0 }); + if (pagenav.length) { + pagehandle = $("#page-nav-resize-handle"); + pagehandle.on('mousedown touchstart',function(e) { + $('body').addClass('resizing'); + pagehandle.addClass('dragging'); + $(document).on('mousemove touchmove',function(e) { + const clientX = e.clientX || e.originalEvent.touches[0].clientX; + let pagenavWidth = container[0].offsetWidth-clientX+barWidth/2; + const sidenavWidth = sidenav.width(); + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,false); + container.css({gridTemplateColumns:'auto '+parseFloat(widths.rightPanelWidth)+'px'}); + pagenav.css({width:parseFloat(widths.rightPanelWidth-1)+'px'}); + content.css({marginLeft:parseFloat(widths.leftPanelWidth)+'px'}); + Cookie.writeSetting(PAGENAV_COOKIE_NAME,pagenavWidth); + }); + $(document).on('mouseup touchend', function(e) { + $('body').removeClass('resizing'); + pagehandle.removeClass('dragging'); + $(document).off('mousemove mouseup touchmove touchend'); + }); + }); + } else { + container.css({gridTemplateColumns:'auto'}); + } + const width = parseInt(Cookie.readSetting(RESIZE_COOKIE_NAME,250)); + const pagenavWidth = parseInt(Cookie.readSetting(PAGENAV_COOKIE_NAME,250)); + if (width) { restoreWidth(width+barWidth,pagenavWidth); } else { resizeWidth(); } + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(window).ready(function() { + let lastWidth = -1; + let lastHeight = -1; + $(window).resize(function() { + const newWidth = $(this).width(), newHeight = $(this).height(); + if (newWidth!=lastWidth || newHeight!=lastHeight) { + resizeHeight(); + navtree_trampoline.updateContentTop(); + lastWidth = newWidth; + lastHeight = newHeight; + } + }); + resizeHeight(); + lastWidth = $(window).width(); + lastHeight = $(window).height(); + content.scroll(function() { + navtree_trampoline.updateContentTop(); + }); + }); + } + + + function initPageToc() { + const topMapping = []; + const toc_contents = $('#page-nav-contents'); + const content=$('
      ').addClass('page-outline'); + + var entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/', + '`': '`', + '=': '=' + }; + function escapeHtml (string) { + return String(string).replace(/[&<>"'`=\/]/g, function (s) { + return entityMap[s]; + }); + } + + // for ClassDef/GroupDef/ModuleDef/ConceptDef/DirDef + const groupSections = []; + let currentGroup = null; + $('h2.groupheader, h2.memtitle').each(function(){ + const $element = $(this); + if ($element.hasClass('groupheader')) { + currentGroup = { groupHeader: $element, memTitles: [] }; + groupSections.push(currentGroup); + } else if ($element.hasClass('memtitle') && currentGroup) { + currentGroup.memTitles.push($element); + } + }); + groupSections.forEach(function(item){ + const title = item.groupHeader.text().trim(); + let id = item.groupHeader.attr('id'); + const table = item.groupHeader.parents('table.memberdecls'); + let rows = $(); + if (table.length>0) { + rows = table.find("tr[class^='memitem:'] td.memItemRight, tr[class^='memitem:'] td.memItemLeft.anon, tr[class=groupHeader] td"); + } + function hasSubItems() { + return item.memTitles.length>0 || rows.toArray().some(function(el) { return $(el).is(':visible'); }); + } + const li = $('
    • ').attr('id','nav-'+id); + const div = $('
      ').addClass('item'); + const span = $('').addClass('arrow').css({ paddingLeft:'0' }); + if (hasSubItems()) { + span.append($('').addClass('arrowhead opened')); + } + const ahref = $('').attr('href','#'+id).append(title); + content.append(li.append(div.append(span).append(ahref))); + topMapping.push(id); + const ulStack = []; + ulStack.push(content); + if (hasSubItems()) { + let last_id = undefined; + let inMemberGroup = false; + // declaration sections have rows for items + rows.each(function(){ + let td = $(this); + let tr = $(td).parent(); + const is_anon_enum = td.contents().first().text().trim()=='{'; + if (tr.hasClass('template')) { + tr = tr.prev(); + } + id = $(tr).attr('id'); + let text = is_anon_enum ? 'anonymous enum' : $(this).find(':first-child').text(); + let isMemberGroupHeader = $(tr).hasClass('groupHeader'); + if ($(tr).is(":visible") && last_id!=id && id!==undefined) { + if (isMemberGroupHeader && inMemberGroup) { + ulStack.pop(); + inMemberGroup=false; + } + const li2 = $('
    • ').attr('id','nav-'+id); + const div2 = $('
      ').addClass('item'); + const span2 = $('').addClass('arrow').css({ paddingLeft:parseInt(ulStack.length*16)+'px' }); + const ahref = $('').attr('href','#'+id).append(escapeHtml(text)); + li2.append(div2.append(span2).append(ahref)); + topMapping.push(id); + if (isMemberGroupHeader) { + span2.append($('').addClass('arrowhead opened')); + ulStack[ulStack.length-1].append(li2); + const ul2 = $('
        '); + ulStack.push(ul2); + li2.append(div2).append(ul2); + inMemberGroup=true; + } else { + ulStack[ulStack.length-1].append(li2); + } + last_id=id; + } + }); + // detailed documentation has h2.memtitle sections for items + item.memTitles.forEach(function(data) { + const text = $(data).contents().not($(data).children().first()).text(); + const name = text.replace(/\(\)(\s*\[\d+\/\d+\])?$/, '') // func() [2/8] -> func + id = $(data).find('span.permalink a').attr('href') + if (id!==undefined && name!==undefined) { + const li2 = $('
      • ').attr('id','nav-'+id.substring(1)); + const div2 = $('
      • '); + const div = $('
        ').addClass('item'); + const span = $('').addClass('arrow').css({ paddingLeft:'0' }); + const ahref = $('').attr('href',srcBaseUrl+dstBaseUrl+pageName).addClass('noscroll'); + content.append(li.append(div.append(span).append(ahref.append(LISTOFALLMEMBERS)))); + } + + if (groupSections.length==0) { + // for PageDef + const sectionTree = [], sectionStack = []; + $('h1.doxsection, h2.doxsection, h3.doxsection, h4.doxsection, h5.doxsection, h6.doxsection').each(function(){ + const level = parseInt(this.tagName[1]); + const anchor = $(this).find('a.anchor').attr('id'); + const node = { text: $(this).html(), id: anchor, children: [] }; + while (sectionStack.length && sectionStack[sectionStack.length - 1].level >= level) sectionStack.pop(); + (sectionStack.length ? sectionStack[sectionStack.length - 1].children : sectionTree).push(node); + sectionStack.push({ ...node, level }); + }); + if (sectionTree.length>0) { + function render(nodes, level=0) { + nodes.map(n => { + const li = $('
      • ').attr('id','nav-'+n.id); + const div = $('
        ').addClass('item'); + const span = $('').addClass('arrow').attr('style','padding-left:'+parseInt(level*16)+'px;'); + if (n.children.length > 0) { span.append($('').addClass('arrowhead opened')); } + const url = $('').attr('href','#'+n.id); + content.append(li.append(div.append(span).append(url.append(n.text)))); + topMapping.push(n.id); + render(n.children,level+1); + }); + } + render(sectionTree); + } + } + + toc_contents.append(content); + + $(".page-outline a[href]:not(.noscroll)").click(function(e) { + e.preventDefault(); + const aname = $(this).attr("href"); + gotoAnchor($(aname),aname); + }); + + let lastScrollSourceOffset = -1; + let lastScrollTargetOffset = -1; + let lastScrollTargetId = ''; + + navtree_trampoline.updateContentTop = function() { + const pagenavcontents = $("#page-nav-contents"); + if (pagenavcontents.length) { + const content = $("#doc-content"); + const height = content.height(); + const navy = pagenavcontents.offset().top; + const yc = content.offset().top; + let offsets = [] + for (let i=0;imargin || ye>margin) && (yslastScrollTargetOffset) || + (!scrollDown && targetOffset { + navtree_trampoline.updateContentTop(); + },200); + } + $(document).ready(function() { initPageToc(); initResizable(); }); + +} +/* @license-end */ diff --git a/ktx/build/docs/html/ktxtools/navtreedata.js b/ktx/build/docs/html/ktxtools/navtreedata.js new file mode 100644 index 0000000..efac753 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/navtreedata.js @@ -0,0 +1,171 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var NAVTREE = +[ + [ "KTX Tools Reference", "index.html", [ + [ "Authors", "../authors.html", null ], + [ "LICENSE file for the KhronosGroup/KTX-Software project", "../license.html", null ], + [ "ktx", "ktx.html", [ + [ "ktx Overview", "index.html#autotoc_md0", null ], + [ "SYNOPSIS", "ktx.html#ktx_synopsis", null ], + [ "DESCRIPTION", "ktx.html#ktx_description", null ], + [ "OPTIONS", "ktx.html#ktx_main_options", null ], + [ "EXIT STATUS", "ktx.html#ktx_exitstatus", null ], + [ "HISTORY", "ktx.html#ktx_history", null ], + [ "AUTHOR", "ktx.html#ktx_author", null ] + ] ], + [ "ktx compare", "ktx_compare.html", [ + [ "SYNOPSIS", "ktx_compare.html#ktx_compare_synopsis", null ], + [ "DESCRIPTION", "ktx_compare.html#ktx_compare_description", null ], + [ "OPTIONS", "ktx_compare.html#ktx_compare_options", null ], + [ "EXIT STATUS", "ktx_compare.html#ktx_compare_exitstatus", null ], + [ "HISTORY", "ktx_compare.html#ktx_compare_history", null ], + [ "AUTHOR", "ktx_compare.html#ktx_compare_author", null ] + ] ], + [ "ktx create", "ktx_create.html", [ + [ "SYNOPSIS", "ktx_create.html#ktx_create_synopsis", null ], + [ "DESCRIPTION", "ktx_create.html#ktx_create_description", null ], + [ "OPTIONS", "ktx_create.html#ktx_create_options", [ + [ "General Options", "ktx_create.html#ktx_create_options_general", null ], + [ "Specific and Common Encoding Options", "ktx_create.html#ktx_create_options_encoding", null ] + ] ], + [ "TRANSFER FUNCTION HANDLING", "ktx_create.html#ktx_create_tf_handling", [ + [ "Details", "ktx_create.html#ktx_create_tf_handling_details", null ], + [ "Changes since last Release", "ktx_create.html#ktx_create_tf_handling_changes", null ] + ] ], + [ "EXIT STATUS", "ktx_create.html#ktx_create_exitstatus", null ], + [ "HISTORY", "ktx_create.html#ktx_create_history", null ], + [ "AUTHOR", "ktx_create.html#ktx_create_author", null ] + ] ], + [ "ktx deflate", "ktx_deflate.html", [ + [ "SYNOPSIS", "ktx_deflate.html#ktx_deflate_synopsis", null ], + [ "DESCRIPTION", "ktx_deflate.html#ktx_deflate_description", null ], + [ "OPTIONS", "ktx_deflate.html#ktx_deflate_options", null ], + [ "EXIT STATUS", "ktx_deflate.html#ktx_deflate_exitstatus", null ], + [ "HISTORY", "ktx_deflate.html#ktx_deflate_history", null ], + [ "AUTHOR", "ktx_deflate.html#ktx_deflate_author", null ] + ] ], + [ "ktx encode", "ktx_encode.html", [ + [ "SYNOPSIS", "ktx_encode.html#ktx_encode_synopsis", null ], + [ "DESCRIPTION", "ktx_encode.html#ktx_encode_description", null ], + [ "OPTIONS", "ktx_encode.html#ktx_encode_options", [ + [ "General Options", "ktx_encode.html#ktx_encode_options_general", null ], + [ "Specific and Common Encoding Options", "ktx_encode.html#ktx_encode_options_encoding", null ] + ] ], + [ "EXIT STATUS", "ktx_encode.html#ktx_encode_exitstatus", null ], + [ "HISTORY", "ktx_encode.html#ktx_encode_history", null ], + [ "AUTHOR", "ktx_encode.html#ktx_encode_author", null ] + ] ], + [ "ktx extract", "ktx_extract.html", [ + [ "SYNOPSIS", "ktx_extract.html#ktx_extract_synopsis", null ], + [ "DESCRIPTION", "ktx_extract.html#ktx_extract_description", null ], + [ "OPTIONS", "ktx_extract.html#ktx_extract_options", null ], + [ "EXIT STATUS", "ktx_extract.html#ktx_extract_exitstatus", null ], + [ "HISTORY", "ktx_extract.html#ktx_extract_history", null ], + [ "AUTHOR", "ktx_extract.html#ktx_extract_author", null ] + ] ], + [ "ktx help", "ktx_help.html", [ + [ "SYNOPSIS", "ktx_help.html#ktx_help_synopsis", null ], + [ "DESCRIPTION", "ktx_help.html#ktx_help_description", null ], + [ "OPTIONS", "ktx_help.html#ktx_help_options", null ], + [ "EXIT STATUS", "ktx_help.html#ktx_help_exitstatus", null ], + [ "HISTORY", "ktx_help.html#ktx_help_history", null ], + [ "AUTHOR", "ktx_help.html#ktx_help_author", null ] + ] ], + [ "ktx info", "ktx_info.html", [ + [ "SYNOPSIS", "ktx_info.html#ktx_info_synopsis", null ], + [ "DESCRIPTION", "ktx_info.html#ktx_info_description", null ], + [ "OPTIONS", "ktx_info.html#ktx_info_options", null ], + [ "EXIT STATUS", "ktx_info.html#ktx_info_exitstatus", null ], + [ "HISTORY", "ktx_info.html#ktx_info_history", null ], + [ "AUTHOR", "ktx_info.html#ktx_info_author", null ] + ] ], + [ "ktx transcode", "ktx_transcode.html", [ + [ "SYNOPSIS", "ktx_transcode.html#ktx_transcode_synopsis", null ], + [ "DESCRIPTION", "ktx_transcode.html#ktx_transcode_description", null ], + [ "OPTIONS", "ktx_transcode.html#ktx_transcode_options", null ], + [ "EXIT STATUS", "ktx_transcode.html#ktx_transcode_exitstatus", null ], + [ "HISTORY", "ktx_transcode.html#ktx_transcode_history", null ], + [ "AUTHOR", "ktx_transcode.html#ktx_transcode_author", null ] + ] ], + [ "ktx validate", "ktx_validate.html", [ + [ "SYNOPSIS", "ktx_validate.html#ktx_validate_synopsis", null ], + [ "DESCRIPTION", "ktx_validate.html#ktx_validate_description", null ], + [ "OPTIONS", "ktx_validate.html#ktx_validate_options", null ], + [ "EXIT STATUS", "ktx_validate.html#ktx_validate_exitstatus", null ], + [ "HISTORY", "ktx_validate.html#ktx_validate_history", null ], + [ "AUTHOR", "ktx_validate.html#ktx_validate_author", null ] + ] ], + [ "ktx2check", "ktx2check.html", [ + [ "SYNOPSIS", "ktx2check.html#ktx2check_synopsis", null ], + [ "DESCRIPTION", "ktx2check.html#ktx2check_description", null ], + [ "EXIT STATUS", "ktx2check.html#ktx2check_exitstatus", null ], + [ "HISTORY", "ktx2check.html#ktx2check_history", null ], + [ "AUTHOR", "ktx2check.html#ktx2check_author", null ] + ] ], + [ "ktx2ktx2", "ktx2ktx2.html", [ + [ "SYNOPSIS", "ktx2ktx2.html#ktx2ktx2_synopsis", null ], + [ "DESCRIPTION", "ktx2ktx2.html#ktx2ktx2_description", null ], + [ "EXIT STATUS", "ktx2ktx2.html#ktx2ktx2_exitstatus", null ], + [ "HISTORY", "ktx2ktx2.html#ktx2ktx2_history", null ], + [ "AUTHOR", "ktx2ktx2.html#ktx2ktx2_author", null ] + ] ], + [ "ktxinfo", "ktxinfo.html", [ + [ "SYNOPSIS", "ktxinfo.html#ktxinfo_synopsis", null ], + [ "DESCRIPTION", "ktxinfo.html#ktxinfo_description", null ], + [ "EXIT STATUS", "ktxinfo.html#ktxinfo_exitstatus", null ], + [ "HISTORY", "ktxinfo.html#ktxinfo_history", null ], + [ "AUTHOR", "ktxinfo.html#ktxinfo_author", null ] + ] ], + [ "ktxsc", "ktxsc.html", [ + [ "SYNOPSIS", "ktxsc.html#ktxsc_synopsis", null ], + [ "DESCRIPTION", "ktxsc.html#ktxsc_description", null ], + [ "EXIT STATUS", "ktxsc.html#ktxsc_exitstatus", null ], + [ "HISTORY", "ktxsc.html#ktxsc_history", null ], + [ "AUTHOR", "ktxsc.html#ktxsc_author", null ] + ] ], + [ "toktx", "toktx.html", [ + [ "SYNOPSIS", "toktx.html#toktx_synopsis", null ], + [ "DESCRIPTION", "toktx.html#toktx_description", null ], + [ "EXIT STATUS", "toktx.html#toktx_exitstatus", null ], + [ "HISTORY", "toktx.html#toktx_history", null ], + [ "AUTHOR", "toktx.html#toktx_author", null ] + ] ], + [ "Package", "../index.html", null ], + [ "libktx Reference", "../libktx/index.html", null ], + [ "KTX Javascript Wrappers Reference", "../ktxjswrappers/index.html", null ], + [ "pyktx Reference", "../pyktx/index.html", null ], + [ "License", "../license.html", null ] + ] ] +]; + +var NAVTREEINDEX = +[ +"../index.html" +]; + +var SYNCONMSG = 'click to disable panel synchronization'; +var SYNCOFFMSG = 'click to enable panel synchronization'; +var LISTOFALLMEMBERS = 'List of all members'; \ No newline at end of file diff --git a/ktx/build/docs/html/ktxtools/navtreeindex0.js b/ktx/build/docs/html/ktxtools/navtreeindex0.js new file mode 100644 index 0000000..e1edc18 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/navtreeindex0.js @@ -0,0 +1,120 @@ +var NAVTREEINDEX0 = +{ +"../index.html":[17], +"../ktxjswrappers/index.html":[19], +"../libktx/index.html":[18], +"../license.html":[21], +"../pyktx/index.html":[20], +"authors.html":[0], +"index.html":[], +"index.html#autotoc_md0":[0], +"ktx.html":[2], +"ktx.html#ktx_author":[2,6], +"ktx.html#ktx_description":[2,2], +"ktx.html#ktx_exitstatus":[2,4], +"ktx.html#ktx_history":[2,5], +"ktx.html#ktx_main_options":[2,3], +"ktx.html#ktx_synopsis":[2,1], +"ktx2check.html":[12], +"ktx2check.html#ktx2check_author":[12,4], +"ktx2check.html#ktx2check_description":[12,1], +"ktx2check.html#ktx2check_exitstatus":[12,2], +"ktx2check.html#ktx2check_history":[12,3], +"ktx2check.html#ktx2check_synopsis":[12,0], +"ktx2ktx2.html":[13], +"ktx2ktx2.html#ktx2ktx2_author":[13,4], +"ktx2ktx2.html#ktx2ktx2_description":[13,1], +"ktx2ktx2.html#ktx2ktx2_exitstatus":[13,2], +"ktx2ktx2.html#ktx2ktx2_history":[13,3], +"ktx2ktx2.html#ktx2ktx2_synopsis":[13,0], +"ktx_compare.html":[3], +"ktx_compare.html#ktx_compare_author":[3,5], +"ktx_compare.html#ktx_compare_description":[3,1], +"ktx_compare.html#ktx_compare_exitstatus":[3,3], +"ktx_compare.html#ktx_compare_history":[3,4], +"ktx_compare.html#ktx_compare_options":[3,2], +"ktx_compare.html#ktx_compare_synopsis":[3,0], +"ktx_create.html":[4], +"ktx_create.html#ktx_create_author":[4,6], +"ktx_create.html#ktx_create_description":[4,1], +"ktx_create.html#ktx_create_exitstatus":[4,4], +"ktx_create.html#ktx_create_history":[4,5], +"ktx_create.html#ktx_create_options":[4,2], +"ktx_create.html#ktx_create_options_encoding":[4,2,1], +"ktx_create.html#ktx_create_options_general":[4,2,0], +"ktx_create.html#ktx_create_synopsis":[4,0], +"ktx_create.html#ktx_create_tf_handling":[4,3], +"ktx_create.html#ktx_create_tf_handling_changes":[4,3,1], +"ktx_create.html#ktx_create_tf_handling_details":[4,3,0], +"ktx_deflate.html":[5], +"ktx_deflate.html#ktx_deflate_author":[5,5], +"ktx_deflate.html#ktx_deflate_description":[5,1], +"ktx_deflate.html#ktx_deflate_exitstatus":[5,3], +"ktx_deflate.html#ktx_deflate_history":[5,4], +"ktx_deflate.html#ktx_deflate_options":[5,2], +"ktx_deflate.html#ktx_deflate_synopsis":[5,0], +"ktx_encode.html":[6], +"ktx_encode.html#ktx_encode_author":[6,5], +"ktx_encode.html#ktx_encode_description":[6,1], +"ktx_encode.html#ktx_encode_exitstatus":[6,3], +"ktx_encode.html#ktx_encode_history":[6,4], +"ktx_encode.html#ktx_encode_options":[6,2], +"ktx_encode.html#ktx_encode_options_encoding":[6,2,1], +"ktx_encode.html#ktx_encode_options_general":[6,2,0], +"ktx_encode.html#ktx_encode_synopsis":[6,0], +"ktx_extract.html":[7], +"ktx_extract.html#ktx_extract_author":[7,5], +"ktx_extract.html#ktx_extract_description":[7,1], +"ktx_extract.html#ktx_extract_exitstatus":[7,3], +"ktx_extract.html#ktx_extract_history":[7,4], +"ktx_extract.html#ktx_extract_options":[7,2], +"ktx_extract.html#ktx_extract_synopsis":[7,0], +"ktx_help.html":[8], +"ktx_help.html#ktx_help_author":[8,5], +"ktx_help.html#ktx_help_description":[8,1], +"ktx_help.html#ktx_help_exitstatus":[8,3], +"ktx_help.html#ktx_help_history":[8,4], +"ktx_help.html#ktx_help_options":[8,2], +"ktx_help.html#ktx_help_synopsis":[8,0], +"ktx_info.html":[9], +"ktx_info.html#ktx_info_author":[9,5], +"ktx_info.html#ktx_info_description":[9,1], +"ktx_info.html#ktx_info_exitstatus":[9,3], +"ktx_info.html#ktx_info_history":[9,4], +"ktx_info.html#ktx_info_options":[9,2], +"ktx_info.html#ktx_info_synopsis":[9,0], +"ktx_transcode.html":[10], +"ktx_transcode.html#ktx_transcode_author":[10,5], +"ktx_transcode.html#ktx_transcode_description":[10,1], +"ktx_transcode.html#ktx_transcode_exitstatus":[10,3], +"ktx_transcode.html#ktx_transcode_history":[10,4], +"ktx_transcode.html#ktx_transcode_options":[10,2], +"ktx_transcode.html#ktx_transcode_synopsis":[10,0], +"ktx_validate.html":[11], +"ktx_validate.html#ktx_validate_author":[11,5], +"ktx_validate.html#ktx_validate_description":[11,1], +"ktx_validate.html#ktx_validate_exitstatus":[11,3], +"ktx_validate.html#ktx_validate_history":[11,4], +"ktx_validate.html#ktx_validate_options":[11,2], +"ktx_validate.html#ktx_validate_synopsis":[11,0], +"ktxinfo.html":[14], +"ktxinfo.html#ktxinfo_author":[14,4], +"ktxinfo.html#ktxinfo_description":[14,1], +"ktxinfo.html#ktxinfo_exitstatus":[14,2], +"ktxinfo.html#ktxinfo_history":[14,3], +"ktxinfo.html#ktxinfo_synopsis":[14,0], +"ktxsc.html":[15], +"ktxsc.html#ktxsc_author":[15,4], +"ktxsc.html#ktxsc_description":[15,1], +"ktxsc.html#ktxsc_exitstatus":[15,2], +"ktxsc.html#ktxsc_history":[15,3], +"ktxsc.html#ktxsc_synopsis":[15,0], +"license.html":[1], +"pages.html":[], +"toktx.html":[16], +"toktx.html#toktx_author":[16,4], +"toktx.html#toktx_description":[16,1], +"toktx.html#toktx_exitstatus":[16,2], +"toktx.html#toktx_history":[16,3], +"toktx.html#toktx_synopsis":[16,0] +}; diff --git a/ktx/build/docs/html/ktxtools/pages.html b/ktx/build/docs/html/ktxtools/pages.html new file mode 100644 index 0000000..2633cc7 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/pages.html @@ -0,0 +1,127 @@ + + + + + + + +KTX Tools Reference: Related Pages + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        KTX Tools Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Related Pages
        +
        +
        +
        Here is a list of all related documentation pages:
        +
        +
        +
        + +
        + + diff --git a/ktx/build/docs/html/ktxtools/search/all_0.js b/ktx/build/docs/html/ktxtools/search/all_0.js new file mode 100644 index 0000000..7ed04a1 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['and_20common_20encoding_20options_0',['and Common Encoding Options',['../ktx_create.html#ktx_create_options_encoding',1,'Specific and Common Encoding Options'],['../ktx_encode.html#ktx_encode_options_encoding',1,'Specific and Common Encoding Options']]], + ['author_1',['AUTHOR',['../ktx.html#ktx_author',1,'AUTHOR'],['../ktx_compare.html#ktx_compare_author',1,'AUTHOR'],['../ktx_create.html#ktx_create_author',1,'AUTHOR'],['../ktx_deflate.html#ktx_deflate_author',1,'AUTHOR'],['../ktx_encode.html#ktx_encode_author',1,'AUTHOR'],['../ktx_extract.html#ktx_extract_author',1,'AUTHOR'],['../ktx_help.html#ktx_help_author',1,'AUTHOR'],['../ktx_info.html#ktx_info_author',1,'AUTHOR'],['../ktx_transcode.html#ktx_transcode_author',1,'AUTHOR'],['../ktx_validate.html#ktx_validate_author',1,'AUTHOR'],['../ktx2check.html#ktx2check_author',1,'AUTHOR'],['../ktx2ktx2.html#ktx2ktx2_author',1,'AUTHOR'],['../ktxinfo.html#ktxinfo_author',1,'AUTHOR'],['../ktxsc.html#ktxsc_author',1,'AUTHOR'],['../toktx.html#toktx_author',1,'AUTHOR']]], + ['authors_2',['Authors',['../../authors.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_1.js b/ktx/build/docs/html/ktxtools/search/all_1.js new file mode 100644 index 0000000..1d54699 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_1.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['changes_20since_20last_20release_0',['Changes since last Release',['../ktx_create.html#ktx_create_tf_handling_changes',1,'']]], + ['common_20encoding_20options_1',['Common Encoding Options',['../ktx_create.html#ktx_create_options_encoding',1,'Specific and Common Encoding Options'],['../ktx_encode.html#ktx_encode_options_encoding',1,'Specific and Common Encoding Options']]], + ['compare_2',['ktx compare',['../ktx_compare.html',1,'']]], + ['create_3',['ktx create',['../ktx_create.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_2.js b/ktx/build/docs/html/ktxtools/search/all_2.js new file mode 100644 index 0000000..932bb17 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['deflate_0',['ktx deflate',['../ktx_deflate.html',1,'']]], + ['description_1',['DESCRIPTION',['../ktx.html#ktx_description',1,'DESCRIPTION'],['../ktx_compare.html#ktx_compare_description',1,'DESCRIPTION'],['../ktx_create.html#ktx_create_description',1,'DESCRIPTION'],['../ktx_deflate.html#ktx_deflate_description',1,'DESCRIPTION'],['../ktx_encode.html#ktx_encode_description',1,'DESCRIPTION'],['../ktx_extract.html#ktx_extract_description',1,'DESCRIPTION'],['../ktx_help.html#ktx_help_description',1,'DESCRIPTION'],['../ktx_info.html#ktx_info_description',1,'DESCRIPTION'],['../ktx_transcode.html#ktx_transcode_description',1,'DESCRIPTION'],['../ktx_validate.html#ktx_validate_description',1,'DESCRIPTION'],['../ktx2check.html#ktx2check_description',1,'DESCRIPTION'],['../ktx2ktx2.html#ktx2ktx2_description',1,'DESCRIPTION'],['../ktxinfo.html#ktxinfo_description',1,'DESCRIPTION'],['../ktxsc.html#ktxsc_description',1,'DESCRIPTION'],['../toktx.html#toktx_description',1,'DESCRIPTION']]], + ['details_2',['Details',['../ktx_create.html#ktx_create_tf_handling_details',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_3.js b/ktx/build/docs/html/ktxtools/search/all_3.js new file mode 100644 index 0000000..58f39f4 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_3.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['encode_0',['ktx encode',['../ktx_encode.html',1,'']]], + ['encoding_20options_1',['Encoding Options',['../ktx_create.html#ktx_create_options_encoding',1,'Specific and Common Encoding Options'],['../ktx_encode.html#ktx_encode_options_encoding',1,'Specific and Common Encoding Options']]], + ['exit_20status_2',['EXIT STATUS',['../ktx.html#ktx_exitstatus',1,'EXIT STATUS'],['../ktx_compare.html#ktx_compare_exitstatus',1,'EXIT STATUS'],['../ktx_create.html#ktx_create_exitstatus',1,'EXIT STATUS'],['../ktx_deflate.html#ktx_deflate_exitstatus',1,'EXIT STATUS'],['../ktx_encode.html#ktx_encode_exitstatus',1,'EXIT STATUS'],['../ktx_extract.html#ktx_extract_exitstatus',1,'EXIT STATUS'],['../ktx_help.html#ktx_help_exitstatus',1,'EXIT STATUS'],['../ktx_info.html#ktx_info_exitstatus',1,'EXIT STATUS'],['../ktx_transcode.html#ktx_transcode_exitstatus',1,'EXIT STATUS'],['../ktx_validate.html#ktx_validate_exitstatus',1,'EXIT STATUS'],['../ktx2check.html#ktx2check_exitstatus',1,'EXIT STATUS'],['../ktx2ktx2.html#ktx2ktx2_exitstatus',1,'EXIT STATUS'],['../ktxinfo.html#ktxinfo_exitstatus',1,'EXIT STATUS'],['../ktxsc.html#ktxsc_exitstatus',1,'EXIT STATUS'],['../toktx.html#toktx_exitstatus',1,'EXIT STATUS']]], + ['extract_3',['ktx extract',['../ktx_extract.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_4.js b/ktx/build/docs/html/ktxtools/search/all_4.js new file mode 100644 index 0000000..3d4e650 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['file_20for_20the_20khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['for_20the_20khronosgroup_20ktx_20software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['function_20handling_2',['TRANSFER FUNCTION HANDLING',['../ktx_create.html#ktx_create_tf_handling',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_5.js b/ktx/build/docs/html/ktxtools/search/all_5.js new file mode 100644 index 0000000..f55bb3e --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['general_20options_0',['General Options',['../ktx_create.html#ktx_create_options_general',1,'General Options'],['../ktx_encode.html#ktx_encode_options_general',1,'General Options']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_6.js b/ktx/build/docs/html/ktxtools/search/all_6.js new file mode 100644 index 0000000..7609941 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['handling_0',['TRANSFER FUNCTION HANDLING',['../ktx_create.html#ktx_create_tf_handling',1,'']]], + ['help_1',['ktx help',['../ktx_help.html',1,'']]], + ['history_2',['HISTORY',['../ktx.html#ktx_history',1,'HISTORY'],['../ktx_compare.html#ktx_compare_history',1,'HISTORY'],['../ktx_create.html#ktx_create_history',1,'HISTORY'],['../ktx_deflate.html#ktx_deflate_history',1,'HISTORY'],['../ktx_encode.html#ktx_encode_history',1,'HISTORY'],['../ktx_extract.html#ktx_extract_history',1,'HISTORY'],['../ktx_help.html#ktx_help_history',1,'HISTORY'],['../ktx_info.html#ktx_info_history',1,'HISTORY'],['../ktx_transcode.html#ktx_transcode_history',1,'HISTORY'],['../ktx_validate.html#ktx_validate_history',1,'HISTORY'],['../ktx2check.html#ktx2check_history',1,'HISTORY'],['../ktx2ktx2.html#ktx2ktx2_history',1,'HISTORY'],['../ktxinfo.html#ktxinfo_history',1,'HISTORY'],['../ktxsc.html#ktxsc_history',1,'HISTORY'],['../toktx.html#toktx_history',1,'HISTORY']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_7.js b/ktx/build/docs/html/ktxtools/search/all_7.js new file mode 100644 index 0000000..cbcfbd3 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['info_0',['ktx info',['../ktx_info.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_8.js b/ktx/build/docs/html/ktxtools/search/all_8.js new file mode 100644 index 0000000..a8af004 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_8.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['ktx_1',['ktx',['../ktx.html',1,'']]], + ['ktx_20compare_2',['ktx compare',['../ktx_compare.html',1,'']]], + ['ktx_20create_3',['ktx create',['../ktx_create.html',1,'']]], + ['ktx_20deflate_4',['ktx deflate',['../ktx_deflate.html',1,'']]], + ['ktx_20encode_5',['ktx encode',['../ktx_encode.html',1,'']]], + ['ktx_20extract_6',['ktx extract',['../ktx_extract.html',1,'']]], + ['ktx_20help_7',['ktx help',['../ktx_help.html',1,'']]], + ['ktx_20info_8',['ktx info',['../ktx_info.html',1,'']]], + ['ktx_20overview_9',['ktx Overview',['../index.html#autotoc_md0',1,'']]], + ['ktx_20software_20project_10',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['ktx_20tools_20reference_11',['KTX Tools Reference',['../index.html',1,'']]], + ['ktx_20transcode_12',['ktx transcode',['../ktx_transcode.html',1,'']]], + ['ktx_20validate_13',['ktx validate',['../ktx_validate.html',1,'']]], + ['ktx2check_14',['ktx2check',['../ktx2check.html',1,'']]], + ['ktx2ktx2_15',['ktx2ktx2',['../ktx2ktx2.html',1,'']]], + ['ktxinfo_16',['ktxinfo',['../ktxinfo.html',1,'']]], + ['ktxsc_17',['ktxsc',['../ktxsc.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_9.js b/ktx/build/docs/html/ktxtools/search/all_9.js new file mode 100644 index 0000000..fdf3ed9 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['last_20release_0',['Changes since last Release',['../ktx_create.html#ktx_create_tf_handling_changes',1,'']]], + ['license_20file_20for_20the_20khronosgroup_20ktx_20software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_a.js b/ktx/build/docs/html/ktxtools/search/all_a.js new file mode 100644 index 0000000..2688474 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['options_0',['OPTIONS',['../ktx.html#ktx_main_options',1,'OPTIONS'],['../ktx_compare.html#ktx_compare_options',1,'OPTIONS'],['../ktx_create.html#ktx_create_options',1,'OPTIONS'],['../ktx_deflate.html#ktx_deflate_options',1,'OPTIONS'],['../ktx_encode.html#ktx_encode_options',1,'OPTIONS'],['../ktx_extract.html#ktx_extract_options',1,'OPTIONS'],['../ktx_help.html#ktx_help_options',1,'OPTIONS'],['../ktx_info.html#ktx_info_options',1,'OPTIONS'],['../ktx_transcode.html#ktx_transcode_options',1,'OPTIONS'],['../ktx_validate.html#ktx_validate_options',1,'OPTIONS']]], + ['options_1',['Options',['../ktx_create.html#ktx_create_options_general',1,'General Options'],['../ktx_encode.html#ktx_encode_options_general',1,'General Options'],['../ktx_create.html#ktx_create_options_encoding',1,'Specific and Common Encoding Options'],['../ktx_encode.html#ktx_encode_options_encoding',1,'Specific and Common Encoding Options']]], + ['overview_2',['ktx Overview',['../index.html#autotoc_md0',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_b.js b/ktx/build/docs/html/ktxtools/search/all_b.js new file mode 100644 index 0000000..ad8f0af --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_c.js b/ktx/build/docs/html/ktxtools/search/all_c.js new file mode 100644 index 0000000..0cf8981 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['reference_0',['KTX Tools Reference',['../index.html',1,'']]], + ['release_1',['Changes since last Release',['../ktx_create.html#ktx_create_tf_handling_changes',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_d.js b/ktx/build/docs/html/ktxtools/search/all_d.js new file mode 100644 index 0000000..4b1dc58 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_d.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['since_20last_20release_0',['Changes since last Release',['../ktx_create.html#ktx_create_tf_handling_changes',1,'']]], + ['software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['specific_20and_20common_20encoding_20options_2',['Specific and Common Encoding Options',['../ktx_create.html#ktx_create_options_encoding',1,'Specific and Common Encoding Options'],['../ktx_encode.html#ktx_encode_options_encoding',1,'Specific and Common Encoding Options']]], + ['status_3',['STATUS',['../ktx.html#ktx_exitstatus',1,'EXIT STATUS'],['../ktx_compare.html#ktx_compare_exitstatus',1,'EXIT STATUS'],['../ktx_create.html#ktx_create_exitstatus',1,'EXIT STATUS'],['../ktx_deflate.html#ktx_deflate_exitstatus',1,'EXIT STATUS'],['../ktx_encode.html#ktx_encode_exitstatus',1,'EXIT STATUS'],['../ktx_extract.html#ktx_extract_exitstatus',1,'EXIT STATUS'],['../ktx_help.html#ktx_help_exitstatus',1,'EXIT STATUS'],['../ktx_info.html#ktx_info_exitstatus',1,'EXIT STATUS'],['../ktx_transcode.html#ktx_transcode_exitstatus',1,'EXIT STATUS'],['../ktx_validate.html#ktx_validate_exitstatus',1,'EXIT STATUS'],['../ktx2check.html#ktx2check_exitstatus',1,'EXIT STATUS'],['../ktx2ktx2.html#ktx2ktx2_exitstatus',1,'EXIT STATUS'],['../ktxinfo.html#ktxinfo_exitstatus',1,'EXIT STATUS'],['../ktxsc.html#ktxsc_exitstatus',1,'EXIT STATUS'],['../toktx.html#toktx_exitstatus',1,'EXIT STATUS']]], + ['synopsis_4',['SYNOPSIS',['../ktx.html#ktx_synopsis',1,'SYNOPSIS'],['../ktx_compare.html#ktx_compare_synopsis',1,'SYNOPSIS'],['../ktx_create.html#ktx_create_synopsis',1,'SYNOPSIS'],['../ktx_deflate.html#ktx_deflate_synopsis',1,'SYNOPSIS'],['../ktx_encode.html#ktx_encode_synopsis',1,'SYNOPSIS'],['../ktx_extract.html#ktx_extract_synopsis',1,'SYNOPSIS'],['../ktx_help.html#ktx_help_synopsis',1,'SYNOPSIS'],['../ktx_info.html#ktx_info_synopsis',1,'SYNOPSIS'],['../ktx_transcode.html#ktx_transcode_synopsis',1,'SYNOPSIS'],['../ktx_validate.html#ktx_validate_synopsis',1,'SYNOPSIS'],['../ktx2check.html#ktx2check_synopsis',1,'SYNOPSIS'],['../ktx2ktx2.html#ktx2ktx2_synopsis',1,'SYNOPSIS'],['../ktxinfo.html#ktxinfo_synopsis',1,'SYNOPSIS'],['../ktxsc.html#ktxsc_synopsis',1,'SYNOPSIS'],['../toktx.html#toktx_synopsis',1,'SYNOPSIS']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_e.js b/ktx/build/docs/html/ktxtools/search/all_e.js new file mode 100644 index 0000000..2493c6a --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_e.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['the_20khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['toktx_1',['toktx',['../toktx.html',1,'']]], + ['tools_20reference_2',['KTX Tools Reference',['../index.html',1,'']]], + ['transcode_3',['ktx transcode',['../ktx_transcode.html',1,'']]], + ['transfer_20function_20handling_4',['TRANSFER FUNCTION HANDLING',['../ktx_create.html#ktx_create_tf_handling',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/all_f.js b/ktx/build/docs/html/ktxtools/search/all_f.js new file mode 100644 index 0000000..203ecda --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/all_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['validate_0',['ktx validate',['../ktx_validate.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_0.js b/ktx/build/docs/html/ktxtools/search/pages_0.js new file mode 100644 index 0000000..7ed04a1 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['and_20common_20encoding_20options_0',['and Common Encoding Options',['../ktx_create.html#ktx_create_options_encoding',1,'Specific and Common Encoding Options'],['../ktx_encode.html#ktx_encode_options_encoding',1,'Specific and Common Encoding Options']]], + ['author_1',['AUTHOR',['../ktx.html#ktx_author',1,'AUTHOR'],['../ktx_compare.html#ktx_compare_author',1,'AUTHOR'],['../ktx_create.html#ktx_create_author',1,'AUTHOR'],['../ktx_deflate.html#ktx_deflate_author',1,'AUTHOR'],['../ktx_encode.html#ktx_encode_author',1,'AUTHOR'],['../ktx_extract.html#ktx_extract_author',1,'AUTHOR'],['../ktx_help.html#ktx_help_author',1,'AUTHOR'],['../ktx_info.html#ktx_info_author',1,'AUTHOR'],['../ktx_transcode.html#ktx_transcode_author',1,'AUTHOR'],['../ktx_validate.html#ktx_validate_author',1,'AUTHOR'],['../ktx2check.html#ktx2check_author',1,'AUTHOR'],['../ktx2ktx2.html#ktx2ktx2_author',1,'AUTHOR'],['../ktxinfo.html#ktxinfo_author',1,'AUTHOR'],['../ktxsc.html#ktxsc_author',1,'AUTHOR'],['../toktx.html#toktx_author',1,'AUTHOR']]], + ['authors_2',['Authors',['../../authors.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_1.js b/ktx/build/docs/html/ktxtools/search/pages_1.js new file mode 100644 index 0000000..1d54699 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_1.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['changes_20since_20last_20release_0',['Changes since last Release',['../ktx_create.html#ktx_create_tf_handling_changes',1,'']]], + ['common_20encoding_20options_1',['Common Encoding Options',['../ktx_create.html#ktx_create_options_encoding',1,'Specific and Common Encoding Options'],['../ktx_encode.html#ktx_encode_options_encoding',1,'Specific and Common Encoding Options']]], + ['compare_2',['ktx compare',['../ktx_compare.html',1,'']]], + ['create_3',['ktx create',['../ktx_create.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_2.js b/ktx/build/docs/html/ktxtools/search/pages_2.js new file mode 100644 index 0000000..932bb17 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['deflate_0',['ktx deflate',['../ktx_deflate.html',1,'']]], + ['description_1',['DESCRIPTION',['../ktx.html#ktx_description',1,'DESCRIPTION'],['../ktx_compare.html#ktx_compare_description',1,'DESCRIPTION'],['../ktx_create.html#ktx_create_description',1,'DESCRIPTION'],['../ktx_deflate.html#ktx_deflate_description',1,'DESCRIPTION'],['../ktx_encode.html#ktx_encode_description',1,'DESCRIPTION'],['../ktx_extract.html#ktx_extract_description',1,'DESCRIPTION'],['../ktx_help.html#ktx_help_description',1,'DESCRIPTION'],['../ktx_info.html#ktx_info_description',1,'DESCRIPTION'],['../ktx_transcode.html#ktx_transcode_description',1,'DESCRIPTION'],['../ktx_validate.html#ktx_validate_description',1,'DESCRIPTION'],['../ktx2check.html#ktx2check_description',1,'DESCRIPTION'],['../ktx2ktx2.html#ktx2ktx2_description',1,'DESCRIPTION'],['../ktxinfo.html#ktxinfo_description',1,'DESCRIPTION'],['../ktxsc.html#ktxsc_description',1,'DESCRIPTION'],['../toktx.html#toktx_description',1,'DESCRIPTION']]], + ['details_2',['Details',['../ktx_create.html#ktx_create_tf_handling_details',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_3.js b/ktx/build/docs/html/ktxtools/search/pages_3.js new file mode 100644 index 0000000..58f39f4 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_3.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['encode_0',['ktx encode',['../ktx_encode.html',1,'']]], + ['encoding_20options_1',['Encoding Options',['../ktx_create.html#ktx_create_options_encoding',1,'Specific and Common Encoding Options'],['../ktx_encode.html#ktx_encode_options_encoding',1,'Specific and Common Encoding Options']]], + ['exit_20status_2',['EXIT STATUS',['../ktx.html#ktx_exitstatus',1,'EXIT STATUS'],['../ktx_compare.html#ktx_compare_exitstatus',1,'EXIT STATUS'],['../ktx_create.html#ktx_create_exitstatus',1,'EXIT STATUS'],['../ktx_deflate.html#ktx_deflate_exitstatus',1,'EXIT STATUS'],['../ktx_encode.html#ktx_encode_exitstatus',1,'EXIT STATUS'],['../ktx_extract.html#ktx_extract_exitstatus',1,'EXIT STATUS'],['../ktx_help.html#ktx_help_exitstatus',1,'EXIT STATUS'],['../ktx_info.html#ktx_info_exitstatus',1,'EXIT STATUS'],['../ktx_transcode.html#ktx_transcode_exitstatus',1,'EXIT STATUS'],['../ktx_validate.html#ktx_validate_exitstatus',1,'EXIT STATUS'],['../ktx2check.html#ktx2check_exitstatus',1,'EXIT STATUS'],['../ktx2ktx2.html#ktx2ktx2_exitstatus',1,'EXIT STATUS'],['../ktxinfo.html#ktxinfo_exitstatus',1,'EXIT STATUS'],['../ktxsc.html#ktxsc_exitstatus',1,'EXIT STATUS'],['../toktx.html#toktx_exitstatus',1,'EXIT STATUS']]], + ['extract_3',['ktx extract',['../ktx_extract.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_4.js b/ktx/build/docs/html/ktxtools/search/pages_4.js new file mode 100644 index 0000000..3d4e650 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['file_20for_20the_20khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['for_20the_20khronosgroup_20ktx_20software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['function_20handling_2',['TRANSFER FUNCTION HANDLING',['../ktx_create.html#ktx_create_tf_handling',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_5.js b/ktx/build/docs/html/ktxtools/search/pages_5.js new file mode 100644 index 0000000..f55bb3e --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['general_20options_0',['General Options',['../ktx_create.html#ktx_create_options_general',1,'General Options'],['../ktx_encode.html#ktx_encode_options_general',1,'General Options']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_6.js b/ktx/build/docs/html/ktxtools/search/pages_6.js new file mode 100644 index 0000000..7609941 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['handling_0',['TRANSFER FUNCTION HANDLING',['../ktx_create.html#ktx_create_tf_handling',1,'']]], + ['help_1',['ktx help',['../ktx_help.html',1,'']]], + ['history_2',['HISTORY',['../ktx.html#ktx_history',1,'HISTORY'],['../ktx_compare.html#ktx_compare_history',1,'HISTORY'],['../ktx_create.html#ktx_create_history',1,'HISTORY'],['../ktx_deflate.html#ktx_deflate_history',1,'HISTORY'],['../ktx_encode.html#ktx_encode_history',1,'HISTORY'],['../ktx_extract.html#ktx_extract_history',1,'HISTORY'],['../ktx_help.html#ktx_help_history',1,'HISTORY'],['../ktx_info.html#ktx_info_history',1,'HISTORY'],['../ktx_transcode.html#ktx_transcode_history',1,'HISTORY'],['../ktx_validate.html#ktx_validate_history',1,'HISTORY'],['../ktx2check.html#ktx2check_history',1,'HISTORY'],['../ktx2ktx2.html#ktx2ktx2_history',1,'HISTORY'],['../ktxinfo.html#ktxinfo_history',1,'HISTORY'],['../ktxsc.html#ktxsc_history',1,'HISTORY'],['../toktx.html#toktx_history',1,'HISTORY']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_7.js b/ktx/build/docs/html/ktxtools/search/pages_7.js new file mode 100644 index 0000000..cbcfbd3 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['info_0',['ktx info',['../ktx_info.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_8.js b/ktx/build/docs/html/ktxtools/search/pages_8.js new file mode 100644 index 0000000..a8af004 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_8.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['ktx_1',['ktx',['../ktx.html',1,'']]], + ['ktx_20compare_2',['ktx compare',['../ktx_compare.html',1,'']]], + ['ktx_20create_3',['ktx create',['../ktx_create.html',1,'']]], + ['ktx_20deflate_4',['ktx deflate',['../ktx_deflate.html',1,'']]], + ['ktx_20encode_5',['ktx encode',['../ktx_encode.html',1,'']]], + ['ktx_20extract_6',['ktx extract',['../ktx_extract.html',1,'']]], + ['ktx_20help_7',['ktx help',['../ktx_help.html',1,'']]], + ['ktx_20info_8',['ktx info',['../ktx_info.html',1,'']]], + ['ktx_20overview_9',['ktx Overview',['../index.html#autotoc_md0',1,'']]], + ['ktx_20software_20project_10',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['ktx_20tools_20reference_11',['KTX Tools Reference',['../index.html',1,'']]], + ['ktx_20transcode_12',['ktx transcode',['../ktx_transcode.html',1,'']]], + ['ktx_20validate_13',['ktx validate',['../ktx_validate.html',1,'']]], + ['ktx2check_14',['ktx2check',['../ktx2check.html',1,'']]], + ['ktx2ktx2_15',['ktx2ktx2',['../ktx2ktx2.html',1,'']]], + ['ktxinfo_16',['ktxinfo',['../ktxinfo.html',1,'']]], + ['ktxsc_17',['ktxsc',['../ktxsc.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_9.js b/ktx/build/docs/html/ktxtools/search/pages_9.js new file mode 100644 index 0000000..fdf3ed9 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['last_20release_0',['Changes since last Release',['../ktx_create.html#ktx_create_tf_handling_changes',1,'']]], + ['license_20file_20for_20the_20khronosgroup_20ktx_20software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_a.js b/ktx/build/docs/html/ktxtools/search/pages_a.js new file mode 100644 index 0000000..2688474 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['options_0',['OPTIONS',['../ktx.html#ktx_main_options',1,'OPTIONS'],['../ktx_compare.html#ktx_compare_options',1,'OPTIONS'],['../ktx_create.html#ktx_create_options',1,'OPTIONS'],['../ktx_deflate.html#ktx_deflate_options',1,'OPTIONS'],['../ktx_encode.html#ktx_encode_options',1,'OPTIONS'],['../ktx_extract.html#ktx_extract_options',1,'OPTIONS'],['../ktx_help.html#ktx_help_options',1,'OPTIONS'],['../ktx_info.html#ktx_info_options',1,'OPTIONS'],['../ktx_transcode.html#ktx_transcode_options',1,'OPTIONS'],['../ktx_validate.html#ktx_validate_options',1,'OPTIONS']]], + ['options_1',['Options',['../ktx_create.html#ktx_create_options_general',1,'General Options'],['../ktx_encode.html#ktx_encode_options_general',1,'General Options'],['../ktx_create.html#ktx_create_options_encoding',1,'Specific and Common Encoding Options'],['../ktx_encode.html#ktx_encode_options_encoding',1,'Specific and Common Encoding Options']]], + ['overview_2',['ktx Overview',['../index.html#autotoc_md0',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_b.js b/ktx/build/docs/html/ktxtools/search/pages_b.js new file mode 100644 index 0000000..ad8f0af --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_c.js b/ktx/build/docs/html/ktxtools/search/pages_c.js new file mode 100644 index 0000000..0cf8981 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['reference_0',['KTX Tools Reference',['../index.html',1,'']]], + ['release_1',['Changes since last Release',['../ktx_create.html#ktx_create_tf_handling_changes',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_d.js b/ktx/build/docs/html/ktxtools/search/pages_d.js new file mode 100644 index 0000000..4b1dc58 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_d.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['since_20last_20release_0',['Changes since last Release',['../ktx_create.html#ktx_create_tf_handling_changes',1,'']]], + ['software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['specific_20and_20common_20encoding_20options_2',['Specific and Common Encoding Options',['../ktx_create.html#ktx_create_options_encoding',1,'Specific and Common Encoding Options'],['../ktx_encode.html#ktx_encode_options_encoding',1,'Specific and Common Encoding Options']]], + ['status_3',['STATUS',['../ktx.html#ktx_exitstatus',1,'EXIT STATUS'],['../ktx_compare.html#ktx_compare_exitstatus',1,'EXIT STATUS'],['../ktx_create.html#ktx_create_exitstatus',1,'EXIT STATUS'],['../ktx_deflate.html#ktx_deflate_exitstatus',1,'EXIT STATUS'],['../ktx_encode.html#ktx_encode_exitstatus',1,'EXIT STATUS'],['../ktx_extract.html#ktx_extract_exitstatus',1,'EXIT STATUS'],['../ktx_help.html#ktx_help_exitstatus',1,'EXIT STATUS'],['../ktx_info.html#ktx_info_exitstatus',1,'EXIT STATUS'],['../ktx_transcode.html#ktx_transcode_exitstatus',1,'EXIT STATUS'],['../ktx_validate.html#ktx_validate_exitstatus',1,'EXIT STATUS'],['../ktx2check.html#ktx2check_exitstatus',1,'EXIT STATUS'],['../ktx2ktx2.html#ktx2ktx2_exitstatus',1,'EXIT STATUS'],['../ktxinfo.html#ktxinfo_exitstatus',1,'EXIT STATUS'],['../ktxsc.html#ktxsc_exitstatus',1,'EXIT STATUS'],['../toktx.html#toktx_exitstatus',1,'EXIT STATUS']]], + ['synopsis_4',['SYNOPSIS',['../ktx.html#ktx_synopsis',1,'SYNOPSIS'],['../ktx_compare.html#ktx_compare_synopsis',1,'SYNOPSIS'],['../ktx_create.html#ktx_create_synopsis',1,'SYNOPSIS'],['../ktx_deflate.html#ktx_deflate_synopsis',1,'SYNOPSIS'],['../ktx_encode.html#ktx_encode_synopsis',1,'SYNOPSIS'],['../ktx_extract.html#ktx_extract_synopsis',1,'SYNOPSIS'],['../ktx_help.html#ktx_help_synopsis',1,'SYNOPSIS'],['../ktx_info.html#ktx_info_synopsis',1,'SYNOPSIS'],['../ktx_transcode.html#ktx_transcode_synopsis',1,'SYNOPSIS'],['../ktx_validate.html#ktx_validate_synopsis',1,'SYNOPSIS'],['../ktx2check.html#ktx2check_synopsis',1,'SYNOPSIS'],['../ktx2ktx2.html#ktx2ktx2_synopsis',1,'SYNOPSIS'],['../ktxinfo.html#ktxinfo_synopsis',1,'SYNOPSIS'],['../ktxsc.html#ktxsc_synopsis',1,'SYNOPSIS'],['../toktx.html#toktx_synopsis',1,'SYNOPSIS']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_e.js b/ktx/build/docs/html/ktxtools/search/pages_e.js new file mode 100644 index 0000000..2493c6a --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_e.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['the_20khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../../license.html',1,'']]], + ['toktx_1',['toktx',['../toktx.html',1,'']]], + ['tools_20reference_2',['KTX Tools Reference',['../index.html',1,'']]], + ['transcode_3',['ktx transcode',['../ktx_transcode.html',1,'']]], + ['transfer_20function_20handling_4',['TRANSFER FUNCTION HANDLING',['../ktx_create.html#ktx_create_tf_handling',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/pages_f.js b/ktx/build/docs/html/ktxtools/search/pages_f.js new file mode 100644 index 0000000..203ecda --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/pages_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['validate_0',['ktx validate',['../ktx_validate.html',1,'']]] +]; diff --git a/ktx/build/docs/html/ktxtools/search/search.css b/ktx/build/docs/html/ktxtools/search/search.css new file mode 100644 index 0000000..043d32d --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/search.css @@ -0,0 +1,377 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
      • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 43px; + margin-right: 0; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + border: 1px solid var(--search-box-border-color); + z-index: 102; + margin-right: 4px; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.6em; +} + +#MSearchField { + display: inline-block; + vertical-align: top; + width: 7.5em; + height: 22px; + margin: 0 0 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.6em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + margin: 6px 0 0 4px; +} + +.close-icon { + width: 11px; + height: 11px; + background-color: var(--search-close-icon-bg-color); + border-radius: 50%; + position: relative; + display: flex; + justify-content: center; + align-items: center; + box-sizing: content-box; +} + +.close-icon:before, +.close-icon:after { + content: ''; + position: absolute; + width: 7px; + height: 1px; + background-color: var(--search-close-icon-fg-color); +} + +.close-icon:before { + transform: rotate(45deg); +} + +.close-icon:after { + transform: rotate(-45deg); +} + + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + +.search-icon { + width: 20px; + height: 20px; + display: inline-block; + position: relative; + margin-left: 3px; +} + +#MSearchSelectExt.search-icon { + width: 10px; +} + +#MSearchSelectExt + input { + margin-left: 5px; +} + +.search-icon::before, .search-icon::after { + content: ''; + position: absolute; + border: 1.5px solid var(--search-foreground-color); + box-sizing: content-box; +} + +.search-icon::before { + width: 6px; + height: 6px; + border-radius: 50%; + top: 7px; + left: 2px; + background: var(--search-background-color); +} + +.search-icon::after { + border: 1px solid var(--search-foreground-color); + width: 0px; + height: 3px; + border-radius: 2px; + top: 15px; + left: 8px; + transform: rotate(-45deg); + transform-origin: top left; +} + +.search-icon-dropdown { + content: ''; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 3px solid var(--search-foreground-color); + top: 8px; + left: 15px; + transform: translateX(-50%); + position: absolute; +} + + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + backdrop-filter: var(--search-filter-backdrop-filter); + -webkit-backdrop-filter: var(--search-filter-backdrop-filter); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + border-radius: 4px; +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: auto; + right: 4px; + top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + backdrop-filter: var(--search-results-backdrop-filter); + -webkit-backdrop-filter: var(--search-results-backdrop-filter); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; + border-radius: 8px; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResults; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); +} + + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 10pt; + padding: 2px 5px; +} + +div.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +#searchBoxPos1 dark-mode-toggle { + margin-top: 4px; +} + +/*---------------- External search page results */ + +.pages b { + color: var(--nav-foreground-color); + padding: 5px 5px 3px 5px; + background-color: var(--nav-menu-active-bg); + border-radius: 4px; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/ktx/build/docs/html/ktxtools/search/search.js b/ktx/build/docs/html/ktxtools/search/search.js new file mode 100644 index 0000000..dc14410 --- /dev/null +++ b/ktx/build/docs/html/ktxtools/search/search.js @@ -0,0 +1,708 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const decodeHtml = (html) => { + const txt = document.createElement("textarea"); + txt.innerHTML = html; + return txt.value; + }; + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = decodeHtml(elem[1][0]); + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + if (elem[1][1][0].startsWith('http://') || elem[1][1][0].startsWith('https://')) { // absolute path + srLink.setAttribute('href',elem[1][1][0]); + } else { // relative path + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + } + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = decodeHtml(elem[1][1][2]); + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; cli>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-color:var(--nav-menu-background-color)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;line-height:36px;text-decoration:none;color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-color:var(--nav-menu-background-color);line-height:36px}.sm-dox a span.sub-arrow{top:15px;right:10px;box-sizing:content-box;padding:0;margin:0;display:inline-block;width:5px;height:5px;background-color:var(--nav-menu-background-color);border-right:2px solid var(--nav-arrow-color);border-bottom:2px solid var(--nav-arrow-color);transform:rotate(45deg);-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 6px}.sm-dox a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px !important}.sm-dox a:hover span.sub-arrow{background-color:var(--nav-menu-active-bg);border-right:2px solid var(--nav-arrow-selected-color);border-bottom:2px solid var(--nav-arrow-selected-color)}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0;padding:3px}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{transform:rotate(-45deg)}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:6px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:6px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/ktx/build/docs/html/ktxtools/toktx.html b/ktx/build/docs/html/ktxtools/toktx.html new file mode 100644 index 0000000..4031d5a --- /dev/null +++ b/ktx/build/docs/html/ktxtools/toktx.html @@ -0,0 +1,425 @@ + + + + + + + +KTX Tools Reference: toktx + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        KTX Tools Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        toktx
        +
        +
        +

        Create a KTX file from JPEG, PNG or netpbm format files.

        +

        +SYNOPSIS

        +

        toktx [options] outfile [infile.{jpg,png,pam,pgm,ppm} ...]

        +

        +DESCRIPTION

        +

        Create a Khronos format texture file (KTX) from a set of JPEG (.jpg), PNG (.png) or Netpbm format (.pam, .pgm, .ppm) images. It writes the destination ktx file to outfile, creating parent directories and appending ".ktx{,2}" if necessary. If outfile is '-' the output will be written to stdout.

        +

        toktx reads each named infile. which must be in .jpg, .png, .pam, .ppm or .pgm format. infiles prefixed with '@' are read as text files listing actual file names to process with one file path per line. Paths must be absolute or relative to the current directory when toktx is run. If '@@' is used instead, paths must be absolute or relative to the location of the list file. File paths must be encoded in UTF-8.

        +

        The target texture type (number of components in the output texture) is chosen via --target_type. Swizzling of the components of the input file is specified with --input_swizzle and swizzzle metadata can be specified with --swizzle. Defaults, shown in the following table, are based on the components of the input file and whether the target texture format is uncompressed or block-compressed including the universal formats. Input components are arbitrarily labeled r, g, b & a.

        + + + + + + + + + + + +
        Uncompressed Formats Block-compressed formats
        Input components 1 (greyscale) 2 (greyscale alpha) 3 4 1 2 3 4
        Target type R RG RGB RGBA RGB RGBA RGB RGBA
        Input swizzle - - - - rrr1 rrrg - -
        Swizzle rrr1 rrrg - - - - - -
        +

        As can be seen from the table one- and two-component inputs are treated as luminance{,-alpha} in accordance with the JPEG and PNG specifications. For consistency Netpbm inputs are handled the same way. Use of R & RG types for uncompressed formats saves space but note that the sRGB versions of these formats are not widely supported so a warning will be issued prompting you to convert the input to linear.

        +

        The primaries, transfer function (OETF) and the texture's sRGB-ness is set based on the input file unless --assign_oetf linear or --assign_oetf srgb is specified. For .jpg files toktx always sets BT709/sRGB primaries and the sRGB OETF in the output file and creates sRGB format textures. Netpbm files always use BT.709/sRGB primaries and the BT.709 OETF. toktx tranforms these images to the sRGB OETF, sets BT709/sRGB primaries and the sRGB OETF in the output file and creates sRGB format textures.

        +

        For .png files the OETF is set as follows:

        +
        +
        No color-info chunks or sRGB chunk present:
        +
        primaries are set to BT.709 and OETF to sRGB.
        +
        sRGB chunk present:
        +
        primaries are set to BT.709 and OETF to sRGB. gAMA and cHRM chunks are ignored.
        +
        iCCP chunk present:
        +
        General ICC profiles are not yet supported by toktx or the KTX2 format. In future these images may be transformed to linear or sRGB OETF as appropriate for the profile. sRGB chunk must not be present.
        +
        gAMA and/or cHRM chunks present without sRGB or iCCP:
        +
        If gAMA is < 60000 the image is transformed to and the OETF is set to sRGB. otherwise the image is transformed to and the OETF is set to linear. The color primaries in cHRM are matched to one of the standard sets listed in the Khronos Data Format Specification (the KHR_DF_PRIMARIES values from khr_df.h) and the primaries field of the output file's DFD is set to the matched value. If no match is found the primaries field is set to UNSPECIFIED.
        +
        +

        The following options are always available:

        +
        --2d
        +
        If the image height is 1, by default a KTX file for a 1D texture is created. With this option one for a 2D texture is created instead.
        +
        --automipmap
        +
        Causes the KTX file to be marked to request generation of a mipmap pyramid when the file is loaded. This option is mutually exclusive with --genmipmap, --levels and --mipmap.
        +
        --cubemap
        +
        KTX file is for a cubemap. At least 6 infiles must be provided, more if --mipmap or --layers is also specified. Provide the images in the order +X, -X, +Y, -Y, +Z, -Z where the arrangement is a left-handed coordinate system with +Y up. So if you're facing +Z, -X will be on your left and +X on your right. If --layers > 1 is specified, provide the faces for layer 0 first then for layer 1, etc. Images must have an upper left origin so –lower_left_maps_to_s0t0 is ignored with this option.
        +
        --depth <number>
        +
        KTX file is for a 3D texture with a depth of number where number > 0. Provide the file(s) for z=0 first then those for z=1, etc. It is an error to specify this together with --layers or --cubemap.
        +
        --genmipmap
        +
        Causes mipmaps to be generated for each input file. This option is mutually exclusive with --automipmap and --mipmap. When set, the following mipmap-generation related options become valid, otherwise they are ignored.
        +
        --filter <name>
        +
        Specifies the filter to use when generating the mipmaps. name is a string. The default is lanczos4. The following names are recognized: box, tent, bell, b-spline, mitchell, lanczos3, lanczos4, lanczos6, lanczos12, blackman, kaiser, gaussian, catmullrom, quadratic_interp, quadratic_approx and quadratic_mix.
        +
        --fscale <floatVal>
        +
        The filter scale to use. The default is 1.0.
        +
        --wmode <mode>
        +
        Specify how to sample pixels near the image boundaries. Values are wrap, reflect and clamp. The default is clamp.
        +
        +
        +
        --layers <number>
        +
        KTX file is for an array texture with number of layers where number > 0. Provide the file(s) for layer 0 first then those for layer 1, etc. It is an error to specify this together with --depth.
        +
        --levels <number>
        +
        KTX file is for a mipmap pyramid with number of levels rather than a full pyramid. number must be > 1 and <= the maximum number of levels determined from the size of the base level image. Provide the base level image first, if using --mipmap. This option is mutually exclusive with --automipmap.
        +
        --mipmap
        +
        KTX file is for a mipmap pyramid with one infile being explicitly provided for each level. Provide the images in the order of layer then face or depth slice then level with the base-level image first then in order down to the 1x1 image or the level specified by --levels.
        Note
        This ordering differs from that in the created texture as it is felt to be more user-friendly.
        +This option is mutually exclusive with --automipmap and --genmipmap.
        +
        --nometadata
        +
        Do not write KTXorientation metadata into the output file. Metadata is written by default. Use of this option is not recommended.
        +
        --nowarn
        +
        Silence warnings which are issued when certain transformations are performed on input images.
        +
        --upper_left_maps_to_s0t0
        +
        Map the logical upper left corner of the image to s0,t0. Although opposite to the OpenGL convention, this is the DEFAULT BEHAVIOUR. netpbm and PNG files have an upper left origin so this option does not flip the input images. When this option is in effect, toktx writes a KTXorientation value of S=r,T=d into the output file to inform loaders of the logical orientation. If an OpenGL {,ES} loader ignores the orientation value, the image will appear upside down.
        +
        --lower_left_maps_to_s0t0
        +
        Map the logical lower left corner of the image to s0,t0. This causes the input netpbm and PNG images to be flipped vertically to a lower-left origin. When this option is in effect, toktx writes a KTXorientation value of S=r,T=u into the output file to inform loaders of the logical orientation. If a Vulkan loader ignores the orientation value, the image will appear upside down. This option is ignored with --cubemap.
        +
        --assign_oetf <linear|srgb>
        +
        Force the created texture to have the specified transfer function. If this is specified, implicit or explicit color space information from the input file(s) will be ignored and no color transformation will be performed. USE WITH CAUTION preferably only when you know the file format information is wrong.
        +
        --assign_primaries <bt709|none|srgb>
        +
        Force the created texture to have the specified primaries. If this is specified, implicit or explicit color space information from the input file(s) will be ignored and no color transformation will be performed. USE WITH CAUTION preferably only when you know the file format information is wrong.
        +
        --convert_oetf <linear|srgb>
        +
        Convert the input images to the specified transfer function, if the current transfer function is different. If both this and --assign_oetf are specified, conversion will be performed from the assigned transfer function to the transfer function specified by this option, if different.
        +
        --convert_primaries <primaries>
        +
        Convert the image images to the specified color primaries, if different from the color primaries of the input file(s) or the one specified by –assign-primaries. If both this and –assign-primaries are specified, conversion will be performed from the assigned primaries to the primaries specified by this option, if different. This option is not allowed to be specified when –assign-primaries is set to 'none'. Case insensitive. Possible options are: bt709 | srgb | bt601-ebu | bt601-smpte | bt2020 | ciexyz | aces | acescc | ntsc1953 | pal525 | displayp3 | adobergb
        +
        --linear
        +
        Deprecated. Use --assign_oetf linear.
        +
        --srgb
        +
        Deprecated. Use --assign_oetf srgb.
        +
        --resize <width>x<height>
        +
        Resize images to width X height. This should not be used with --mipmap as it would resize all the images to the same size. Resampler options can be set via --filter and --fscale.
        +
        --scale <value>
        +
        Scale images by value as they are read. Resampler options can be set via --filter and --fscale. .
        +
        --swizzle <swizzle>
        +
        Add swizzle metadata to the file being created. swizzle has the same syntax as the parameter for --input_swizzle. Not recommended for use with block-cmpressed textures, including Basis Universal formats, because something like rabb may yield drastically different error metrics if done after compression.
        +
        --target_type <type>
        +
        Specify the number of components in the created texture. type is one of the following strings: R, RG, RGB or RGBA. Excess input components will be dropped. Output components with no mapping from the input will be set to 0 or, if the alpha component, 1.0.
        +
        --t2
        +
        Output in KTX2 format. Default is KTX.
        +
        +
        +
        --encode <astc | etc1s | uastc>
        +
        Compress the image data to ASTC, transcodable ETC1S / BasisLZ or high-quality transcodable UASTC format. Implies --t2. With each encoding option the following encoder specific options become valid, otherwise they are ignored.
        +
        astc:
        +
        Create a texture in high-quality ASTC format.
        +
        --astc_blk_d <XxY | XxYxZ>
        +
        Specify which block dimension to use for compressing the textures. e.g. --astc_blk_d 6x5 for 2D or --astc_blk_d 6x6x6 for 3D. 6x6 is the default for 2D. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Supported 2D block dimensions are:
        4x48.00 bpp
        5x46.40 bpp
        5x55.12 bpp
        6x54.27 bpp
        6x63.56 bpp
        8x53.20 bpp
        8x62.67 bpp
        10x52.56 bpp
        10x62.13 bpp
        8x82.00 bpp
        10x81.60 bpp
        10x101.28 bpp
        12x101.07 bpp
        12x120.89 bpp
        Supported 3D block dimensions are:
        3x3x34.74 bpp
        4x3x33.56 bpp
        4x4x32.67 bpp
        4x4x42.00 bpp
        5x4x41.60 bpp
        5x5x41.28 bpp
        5x5x51.02 bpp
        6x5x50.85 bpp
        6x6x50.71 bpp
        6x6x60.59 bpp
        +
        +
        --astc_mode <ldr | hdr>
        +
        Specify which encoding mode to use. LDR is the default unless the input image is 16-bit in which case the default is HDR.
        +
        --astc_quality <level>
        +
        The quality level configures the quality-performance tradeoff for the compressor; more complete searches of the search space improve image quality at the expense of compression time. Default is 'medium'. The quality level can be set between fastest (0) and exhaustive (100) via the following fixed quality presets: + + + + + + + + + + + + +
        Level Quality
        fastest (equivalent to quality = 0)
        fast (equivalent to quality = 10)
        medium (equivalent to quality = 60)
        thorough (equivalent to quality = 98)
        exhaustive (equivalent to quality = 100)
        +
        +
        --astc_perceptual
        +
        The codec should optimize for perceptual error, instead of direct RMS error. This aims to improve perceived image quality, but typically lowers the measured PSNR score. Perceptual methods are currently only available for normal maps and RGB color data.
        +
        +
        +
        etc1s:
        +
        Supercompress the image data with ETC1S / BasisLZ. RED images will become RGB with RED in each component. RG images will have R in the RGB part and G in the alpha part of the compressed texture. When set, the following BasisLZ-related options become valid, otherwise they are ignored.
        +
        --no_multithreading
        +
        Disable multithreading. Deprecated. For backward compatibility. Use --threads 1 instead.
        +
        --clevel <level>
        +
        ETC1S / BasisLZ compression level, an encoding speed vs. quality tradeoff. Range is [0,5], default is 1. Higher values are slower but give higher quality.
        +
        --qlevel <level>
        +

        ETC1S / BasisLZ quality level. Range is [1,255]. Lower gives better compression/lower quality/faster. Higher gives less compression/higher quality/slower. --qlevel automatically determines values for --max_endpoints, --max-selectors, --endpoint_rdo_threshold and --selector_rdo_threshold for the target quality level. Setting these options overrides the values determined by -qlevel which defaults to 128 if neither it nor both of --max_endpoints and --max_selectors have been set.

        +

        Note that both of --max_endpoints and --max_selectors must be set for them to have any effect. If all three options are set, a warning will be issued that --qlevel will be ignored.

        +

        Note also that --qlevel will only determine values for --endpoint_rdo_threshold and --selector_rdo_threshold when its value exceeds 128, otherwise their defaults will be used.

        +
        +
        --max_endpoints <arg>
        +
        Manually set the maximum number of color endpoint clusters. Range is [1,16128]. Default is 0, unset.
        +
        --endpoint_rdo_threshold <arg>
        +
        Set endpoint RDO quality threshold. The default is 1.25. Lower is higher quality but less quality per output bit (try [1.0,3.0]). This will override the value chosen by --qlevel.
        +
        --max_selectors <arg>
        +
        Manually set the maximum number of color selector clusters from [1,16128]. Default is 0, unset.
        +
        --selector_rdo_threshold <arg>
        +
        Set selector RDO quality threshold. The default is 1.25. Lower is higher quality but less quality per output bit (try [1.0,3.0]). This will override the value chosen by --qlevel.
        +
        --no_endpoint_rdo
        +
        Disable endpoint rate distortion optimizations. Slightly faster, less noisy output, but lower quality per output bit. Default is to do endpoint RDO.
        +
        --no_selector_rdo
        +
        Disable selector rate distortion optimizations. Slightly faster, less noisy output, but lower quality per output bit. Default is to do selector RDO.
        +
        +
        +
        uastc:
        +
        Create a texture in high-quality transcodable UASTC format.
        +
        --uastc_quality <level>
        +

        This optional parameter selects a speed vs quality tradeoff as shown in the following table:

        + + + + + + + + + + + + + +
        LevelSpeedQuality
        0 Fastest 43.45dB
        1 Faster 46.49dB
        2 Default 47.47dB
        3 Slower 48.01dB
        4 Very slow 48.24dB
        +

        You are strongly encouraged to also specify --zcmp to losslessly compress the UASTC data. This and any LZ-style compression can be made more effective by conditioning the UASTC texture data using the Rate Distortion Optimization (RDO) post-process stage. When uastc encoding is set the following options become available for controlling RDO:

        +
        +
        --uastc_rdo_l [<lambda>]
        +

        Enable UASTC RDO post-processing and optionally set UASTC RDO quality scalar (lambda) to lambda. Lower values yield higher quality/larger LZ compressed files, higher values yield lower quality/smaller LZ compressed files. A good range to try is [.25,10]. For normal maps a good range is [.25,.75]. The full range is [.001,10.0]. Default is 1.0.

        +

        Note that previous versions used the --uastc_rdo_q option which was removed because the RDO algorithm changed.

        +
        +
        --uastc_rdo_d <dictsize>
        +
        Set UASTC RDO dictionary size in bytes. Default is 4096. Lower values=faster, but give less compression. Range is [64,65536].
        +
        --uastc_rdo_b <scale>
        +
        Set UASTC RDO max smooth block error scale. Range is [1.0,300.0]. Default is 10.0, 1.0 is disabled. Larger values suppress more artifacts (and allocate more bits) on smooth blocks.
        +
        --uastc_rdo_s <deviation>
        +
        Set UASTC RDO max smooth block standard deviation. Range is [.01,65536.0]. Default is 18.0. Larger values expand the range of blocks considered smooth.
        +
        --uastc_rdo_f
        +
        Do not favor simpler UASTC modes in RDO mode.
        +
        --uastc_rdo_m
        +
        Disable RDO multithreading (slightly higher compression, deterministic).
        +
        +
        +
        --input_swizzle <swizzle>
        +
        Swizzle the input components according to swizzle which is an alhpanumeric sequence matching the regular expression ^[rgba01]{4}$.
        +
        --normal_mode
        +

        Only valid for linear textures with two or more components. If the input texture has three or four linear components it is assumed to be a three component linear normal map storing unit length normals as (R=X, G=Y, B=Z). A fourth component will be ignored. The map will be converted to a two component X+Y normal map stored as (RGB=X, A=Y) prior to encoding. If unsure that your normals are unit length, use --normalize. If the input has 2 linear components it is assumed to be an X+Y map of unit normals.

        +

        The Z component can be recovered programmatically in shader code by using the equations:

        +          nml.xy = texture(...).ga;              // Load in [0,1]
        +          nml.xy = nml.xy * 2.0 - 1.0;           // Unpack to [-1,1]
        +          nml.z = sqrt(1 - dot(nml.xy, nml.xy)); // Compute Z
        +                     

        For ASTC encoding, '--encode astc', encoder parameters are tuned for better quality on normal maps. For ETC1S encoding, '--encode etc1s', RDO is disabled (no selector RDO, no endpoint RDO) to provide better quality.

        +

        In toktx you can prevent conversion of the normal map to two components by specifying '--input_swizzle rgb1'.

        +
        +
        --normalize
        +
        Normalize input normals to have a unit length. Only valid for linear textures with 2 or more components. For 2-component inputs 2D unit normals are calculated. Do not use these 2D unit normals to generate X+Y normals for –normal_mode. For 4-component inputs a 3D unit normal is calculated. 1.0 is used for the value of the 4th component.
        +
        --no_sse
        +
        Forbid use of the SSE instruction set. Ignored if CPU does not support SSE. Only the Basis Universal compressor uses SSE.
        +
        --bcmp
        +
        Deprecated. Use '--encode etc1s' instead.
        +
        --uastc [<level>]
        +
        Deprecated. Use '--encode uastc' instead.
        +
        --zcmp [<compressionLevel>]
        +
        Supercompress the data with Zstandard. Implies --t2. Can be used with data in any format except ETC1S / BasisLZ. Most effective with RDO-conditioned UASTC or uncompressed formats. The optional compressionLevel range is 1 - 22 and the default is 3. Lower values=faster but give less compression. Values above 20 should be used with caution as they require more memory.
        +
        --threads <count>
        +
        Explicitly set the number of threads to use during compression. By default, ETC1S / BasisLZ and ASTC compression will use the number of threads reported by thread::hardware_concurrency or 1 if value returned is 0.
        +
        --verbose
        +
        Print encoder/compressor activity status to stdout. Currently only the astc, etc1s and uastc encoders emit status.
        +
        +
        +
        -h, --help
        +
        Print this usage message and exit.
        +
        -v, --version
        +
        Print the version number of this program and exit.
        +
        +
            In case of ambiguity, such as when the last option is one with an optional
        +    parameter, separate options from file names with " -- ".
        +
        +    Any specified ASTC, ETC1S / BasisLZ, UASTC and supercompression options are
        +    recorded in the metadata item @c KTXwriterScParams in the output file.
        +
        +Options can also be set in the environment variable TOKTX_OPTIONS.
        +TOKTX_OPTIONS is parsed first. If conflicting options appear in
        +TOKTX_OPTIONS or the command line, the last one seen wins. However if both
        +@b --automipmap and @b --mipmap are seen, it is always flagged as an error.
        +You can, for example, set TOKTX_OPTIONS=--lower_left_maps_to_s0t0 to change
        +the default mapping of the logical image origin to match the GL convention.
        +

        +EXIT STATUS

        +

        toktx exits 0 on success, 1 on command line errors and 2 on functional errors.

        +

        +HISTORY

        +
        Version 4.0 (using new version numbering system)
          +
        • Add KTX version 2 support including Basis Universal encoding.
        • +
        • Add .png and .jpg readers.
        • +
        • Transform NetPBM input files to sRGB OETF.
        • +
        • Add mipmap generation.
        • +
        • Remove legacy items.
        • +
        +
        +
        Version 1.3
          +
        • Switch to ktxTexture API.
        • +
        • Add –levels option.
        • +
        • Add –2d option.
        • +
        +
        +
        Version 1.2
          +
        • Remove –sized; always create sized format.
        • +
        • Write metadata by default.
        • +
        • Bug fixes.
        • +
        +
        +
        Version 1.1
          +
        • Moved –alpha and –luminance to legacy.
        • +
        +
        +

        +AUTHOR

        +

        Mark Callow, github.com/MarkCallow

        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/annotated.html b/ktx/build/docs/html/libktx/annotated.html new file mode 100644 index 0000000..d7bc0a6 --- /dev/null +++ b/ktx/build/docs/html/libktx/annotated.html @@ -0,0 +1,125 @@ + + + + + + + +libktx Reference: Data Structures + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Data Structures
        +
        +
        +
        Here are the data structures with brief descriptions:
        + + + + + + + + + + + + + + + + +
         CktxAstcParamsStructure for passing extended parameters to ktxTexture_CompressAstc
         CktxBasisParamsStructure for passing extended parameters to ktxTexture2_CompressBasisEx()
         CktxHashListOpaque handle to a ktxHashList
         CktxHashListEntryOpaque handle to an entry in a ktxHashList
         CktxOrientationStruct describing the logical orientation of an image
         CktxStreamInterface of ktxStream
         CktxTextureBase class representing a texture
         CktxTexture1Class representing a KTX version 1 format texture
         CktxTexture2Class representing a KTX version 2 format texture
         CktxTexture_vtblTable of virtual ktxTexture methods
         CktxTextureCreateInfoStructure for passing texture information to ktxTexture1_Create() and ktxTexture2_Create()
         CktxVulkanDeviceInfoStruct for passing information about the Vulkan device on which to create images to the texture image loading functions
         CktxVulkanFunctionsStruct for applications to pass Vulkan function pointers to the ktxTexture_VkUpload functions via a ktxVulkanDeviceInfo struct
         CktxVulkanTextureStruct for returning information about the Vulkan texture image created by the ktxTexture_VkUpload* functions
         CktxVulkanTexture_subAllocatorCallbacksStruct that contains all callbacks necessary for suballocation
        +
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/annotated_dup.js b/ktx/build/docs/html/libktx/annotated_dup.js new file mode 100644 index 0000000..fbd3666 --- /dev/null +++ b/ktx/build/docs/html/libktx/annotated_dup.js @@ -0,0 +1,18 @@ +var annotated_dup = +[ + [ "ktxAstcParams", "structktxAstcParams.html", "structktxAstcParams" ], + [ "ktxBasisParams", "structktxBasisParams.html", "structktxBasisParams" ], + [ "ktxHashList", "classktxHashList.html", "classktxHashList" ], + [ "ktxHashListEntry", "classktxHashListEntry.html", "classktxHashListEntry" ], + [ "ktxOrientation", "structktxOrientation.html", "structktxOrientation" ], + [ "ktxStream", "structktxStream.html", "structktxStream" ], + [ "ktxTexture", "structktxTexture.html", "structktxTexture" ], + [ "ktxTexture1", "structktxTexture1.html", "structktxTexture1" ], + [ "ktxTexture2", "structktxTexture2.html", "structktxTexture2" ], + [ "ktxTexture_vtbl", "structktxTexture__vtbl.html", null ], + [ "ktxTextureCreateInfo", "structktxTextureCreateInfo.html", "structktxTextureCreateInfo" ], + [ "ktxVulkanDeviceInfo", "structktxVulkanDeviceInfo.html", "structktxVulkanDeviceInfo" ], + [ "ktxVulkanFunctions", "structktxVulkanFunctions.html", null ], + [ "ktxVulkanTexture", "structktxVulkanTexture.html", "structktxVulkanTexture" ], + [ "ktxVulkanTexture_subAllocatorCallbacks", "structktxVulkanTexture__subAllocatorCallbacks.html", "structktxVulkanTexture__subAllocatorCallbacks" ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/classes.html b/ktx/build/docs/html/libktx/classes.html new file mode 100644 index 0000000..3db8b25 --- /dev/null +++ b/ktx/build/docs/html/libktx/classes.html @@ -0,0 +1,130 @@ + + + + + + + +libktx Reference: Data Structure Index + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Data Structure Index
        +
        + +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/classktxHashList.html b/ktx/build/docs/html/libktx/classktxHashList.html new file mode 100644 index 0000000..8e2d626 --- /dev/null +++ b/ktx/build/docs/html/libktx/classktxHashList.html @@ -0,0 +1,707 @@ + + + + + + + +libktx Reference: ktxHashList Class Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxHashList Class Reference
        +
        +
        + +

        Opaque handle to a ktxHashList. + More...

        + +

        #include <ktx.h>

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

        void ktxHashList_Construct (ktxHashList *pHead)
         Construct an empty hash list for storing key-value pairs.
        void ktxHashList_ConstructCopy (ktxHashList *pHead, ktxHashList orig)
         Construct a hash list by copying another.
        void ktxHashList_Destruct (ktxHashList *pHead)
         Destruct a hash list.
        KTX_error_code ktxHashList_Create (ktxHashList **ppHl)
         Create an empty hash list for storing key-value pairs.
        KTX_error_code ktxHashList_CreateCopy (ktxHashList **ppHl, ktxHashList orig)
         Create a copy of a hash list.
        void ktxHashList_Destroy (ktxHashList *pHead)
         Destroy a hash list.
        KTX_error_code ktxHashList_AddKVPair (ktxHashList *pHead, const char *key, unsigned int valueLen, const void *value)
         Add a key value pair to a hash list.
        KTX_error_code ktxHashList_DeleteKVPair (ktxHashList *pHead, const char *key)
         Delete a key value pair in a hash list.
        KTX_error_code ktxHashList_DeleteEntry (ktxHashList *pHead, ktxHashListEntry *pEntry)
         Delete an entry from a hash list.
        KTX_error_code ktxHashList_FindEntry (ktxHashList *pHead, const char *key, ktxHashListEntry **ppEntry)
         Looks up a key in a hash list and returns the entry.
        KTX_error_code ktxHashList_FindValue (ktxHashList *pHead, const char *key, unsigned int *pValueLen, void **ppValue)
         Looks up a key in a hash list and returns the value.
        ktxHashListEntryktxHashList_Next (ktxHashListEntry *entry)
         Returns the next entry in a ktxHashList.
        KTX_error_code ktxHashList_Serialize (ktxHashList *pHead, unsigned int *pKvdLen, unsigned char **ppKvd)
         Serialize a hash list to a block of data suitable for writing to a file.
        KTX_error_code ktxHashList_Sort (ktxHashList *pHead)
         Sort a hash list in order of the UTF8 codepoints.
        KTX_error_code ktxHashList_Deserialize (ktxHashList *pHead, unsigned int kvdLen, void *pKvd)
         Construct a hash list from a block of serialized key-value data read from a file.
        +

        Detailed Description

        +

        Opaque handle to a ktxHashList.

        +

        Member Function Documentation

        + +

        ◆ ktxHashList_AddKVPair()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxHashList_AddKVPair (ktxHashList * pHead,
        const char * key,
        unsigned int valueLen,
        const void * value )
        +
        + +

        Add a key value pair to a hash list.

        +

        The value can be empty, i.e, its length can be 0.

        +
        Parameters
        + + + + + +
        [in]pHeadpointer to the head of the target hash list.
        [in]keypointer to the UTF8 NUL-terminated string to be used as the key.
        [in]valueLenthe number of bytes of data in value.
        [in]valuepointer to the bytes of data constituting the value.
        +
        +
        +
        Returns
        KTX_SUCCESS or one of the following error codes.
        +
        Exceptions
        + + +
        KTX_INVALID_VALUEif pHead, key or value are NULL, key is an empty string or valueLen == 0.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_Construct()

        + +
        +
        + + + + + + + +
        void ktxHashList_Construct (ktxHashList * pHead)
        +
        + +

        Construct an empty hash list for storing key-value pairs.

        +
        Parameters
        + + +
        [in]pHeadpointer to the location to write the list head.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_ConstructCopy()

        + +
        +
        + + + + + + + + + + + +
        void ktxHashList_ConstructCopy (ktxHashList * pHead,
        ktxHashList orig )
        +
        + +

        Construct a hash list by copying another.

        +
        Parameters
        + + + +
        [in]pHeadpointer to head of the list.
        [in]orighead of the original hash list.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_Create()

        + +
        +
        + + + + + + + +
        KTX_error_code ktxHashList_Create (ktxHashList ** ppHl)
        +
        + +

        Create an empty hash list for storing key-value pairs.

        +
        Parameters
        + + +
        [in,out]ppHladdress of a variable in which to set a pointer to the newly created hash list.
        +
        +
        +
        Returns
        KTX_SUCCESS or one of the following error codes.
        +
        Exceptions
        + + +
        KTX_OUT_OF_MEMORYif not enough memory.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_CreateCopy()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxHashList_CreateCopy (ktxHashList ** ppHl,
        ktxHashList orig )
        +
        + +

        Create a copy of a hash list.

        +
        Parameters
        + + + +
        [in,out]ppHladdress of a variable in which to set a pointer to the newly created hash list.
        [in]orighead of the ktxHashList to copy.
        +
        +
        +
        Returns
        KTX_SUCCESS or one of the following error codes.
        +
        Exceptions
        + + +
        KTX_OUT_OF_MEMORYif not enough memory.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_DeleteEntry()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxHashList_DeleteEntry (ktxHashList * pHead,
        ktxHashListEntry * pEntry )
        +
        + +

        Delete an entry from a hash list.

        +
        Parameters
        + + + +
        [in]pHeadpointer to the head of the target hash list.
        [in]pEntrypointer to the ktxHashListEntry to delete.
        +
        +
        +
        Returns
        KTX_SUCCESS or one of the following error codes.
        +
        Exceptions
        + + +
        KTX_INVALID_VALUEif pHead is NULL or key is an empty string.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_DeleteKVPair()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxHashList_DeleteKVPair (ktxHashList * pHead,
        const char * key )
        +
        + +

        Delete a key value pair in a hash list.

        +

        Is a nop if the key is not in the hash.

        +
        Parameters
        + + + +
        [in]pHeadpointer to the head of the target hash list.
        [in]keypointer to the UTF8 NUL-terminated string to be used as the key.
        +
        +
        +
        Returns
        KTX_SUCCESS or one of the following error codes.
        +
        Exceptions
        + + +
        KTX_INVALID_VALUEif pHead is NULL or key is an empty string.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_Deserialize()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxHashList_Deserialize (ktxHashList * pHead,
        unsigned int kvdLen,
        void * pKvd )
        +
        + +

        Construct a hash list from a block of serialized key-value data read from a file.

        +
        Note
        The bytes of the 32-bit key-value lengths within the serialized data are expected to be in native endianness.
        +
        Parameters
        + + + + +
        [in]pHeadpointer to the head of the target hash list.
        [in]kvdLenthe length of the serialized key-value data.
        [in]pKvdpointer to the serialized key-value data. table.
        +
        +
        +
        Returns
        KTX_SUCCESS or one of the following error codes.
        +
        Exceptions
        + + + + +
        KTX_INVALID_OPERATIONif pHead does not point to an empty list.
        KTX_INVALID_VALUEif pKvd or pHt is NULL or kvdLen == 0.
        KTX_OUT_OF_MEMORYthere was not enough memory to create the hash table.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_Destroy()

        + +
        +
        + + + + + + + +
        void ktxHashList_Destroy (ktxHashList * pHead)
        +
        + +

        Destroy a hash list.

        +

        All memory associated with the hash list's keys and values is freed. The hash list is also freed.

        +
        Parameters
        + + +
        [in]pHeadpointer to the hash list to be destroyed.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_Destruct()

        + +
        +
        + + + + + + + +
        void ktxHashList_Destruct (ktxHashList * pHead)
        +
        + +

        Destruct a hash list.

        +

        All memory associated with the hash list's keys and values is freed.

        +
        Parameters
        + + +
        [in]pHeadpointer to the hash list to be destroyed.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_FindEntry()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxHashList_FindEntry (ktxHashList * pHead,
        const char * key,
        ktxHashListEntry ** ppEntry )
        +
        + +

        Looks up a key in a hash list and returns the entry.

        +
        Parameters
        + + + + +
        [in]pHeadpointer to the head of the target hash list.
        [in]keypointer to a UTF8 NUL-terminated string to find.
        [in,out]ppEntry*ppEntry is set to the point at the ktxHashListEntry.
        +
        +
        +
        Returns
        KTX_SUCCESS or one of the following error codes.
        +
        Exceptions
        + + + +
        KTX_INVALID_VALUEif This, key or pValueLen or ppValue is NULL.
        KTX_NOT_FOUNDan entry matching key was not found.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_FindValue()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxHashList_FindValue (ktxHashList * pHead,
        const char * key,
        unsigned int * pValueLen,
        void ** ppValue )
        +
        + +

        Looks up a key in a hash list and returns the value.

        +
        Parameters
        + + + + + +
        [in]pHeadpointer to the head of the target hash list.
        [in]keypointer to a UTF8 NUL-terminated string to find.
        [in,out]pValueLen*pValueLen is set to the number of bytes of data in the returned value.
        [in,out]ppValue*ppValue is set to the point to the value for key.
        +
        +
        +
        Returns
        KTX_SUCCESS or one of the following error codes.
        +
        Exceptions
        + + + +
        KTX_INVALID_VALUEif This, key or pValueLen or ppValue is NULL.
        KTX_NOT_FOUNDan entry matching key was not found.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_Next()

        + +
        +
        + + + + + + + +
        ktxHashListEntry * ktxHashList_Next (ktxHashListEntry * entry)
        +
        + +

        Returns the next entry in a ktxHashList.

        +

        Use for iterating through the list:

        +
        for (entry = listHead; entry != NULL; entry = ktxHashList_Next(entry)) {
        +
        ...
        +
        };
        +
        Opaque handle to an entry in a ktxHashList.
        +
        ktxHashListEntry * ktxHashList_Next(ktxHashListEntry *entry)
        Returns the next entry in a ktxHashList.
        Definition hashlist.c:381
        +

        Note

        +
        Parameters
        + + +
        [in]entrypointer to a hash list entry. Note that a ktxHashList*, i.e. the list head, is also a pointer to an entry so can be passed to this function.
        +
        +
        +
        Returns
        a pointer to the next entry or NULL.
        + +
        +
        + +

        ◆ ktxHashList_Serialize()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxHashList_Serialize (ktxHashList * pHead,
        unsigned int * pKvdLen,
        unsigned char ** ppKvd )
        +
        + +

        Serialize a hash list to a block of data suitable for writing to a file.

        +

        The caller is responsible for freeing the data block returned by this function.

        +
        Parameters
        + + + + +
        [in]pHeadpointer to the head of the target hash list.
        [in,out]pKvdLen*pKvdLen is set to the number of bytes of data in the returned data block.
        [in,out]ppKvd*ppKvd is set to the point to the block of memory containing the serialized data or NULL. if the hash list is empty.
        +
        +
        +
        Returns
        KTX_SUCCESS or one of the following error codes.
        +
        Exceptions
        + + + +
        KTX_INVALID_VALUEif This, pKvdLen or ppKvd is NULL.
        KTX_OUT_OF_MEMORYthere was not enough memory to serialize the data.
        +
        +
        + +
        +
        + +

        ◆ ktxHashList_Sort()

        + +
        +
        + + + + + + + +
        KTX_error_code ktxHashList_Sort (ktxHashList * pHead)
        +
        + +

        Sort a hash list in order of the UTF8 codepoints.

        +
        Parameters
        + + +
        [in]pHeadpointer to the head of the target hash list.
        +
        +
        +
        Returns
        KTX_SUCCESS or one of the following error codes.
        +
        Exceptions
        + + +
        KTX_INVALID_VALUEif This is NULL.
        +
        +
        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/classktxHashList.js b/ktx/build/docs/html/libktx/classktxHashList.js new file mode 100644 index 0000000..0ce167a --- /dev/null +++ b/ktx/build/docs/html/libktx/classktxHashList.js @@ -0,0 +1,18 @@ +var classktxHashList = +[ + [ "ktxHashList_AddKVPair", "classktxHashList.html#ad013c9dd666f3b57e3b0a717e0186277", null ], + [ "ktxHashList_Construct", "classktxHashList.html#aaab69a1ef86c52707d0a33dcba316c60", null ], + [ "ktxHashList_ConstructCopy", "classktxHashList.html#a11f1a2ff9f574cd803803b77ec758966", null ], + [ "ktxHashList_Create", "classktxHashList.html#a13c991ecb452345d4ac2f9ca4ff71b80", null ], + [ "ktxHashList_CreateCopy", "classktxHashList.html#a50f608b84f671b23849be13254cc511e", null ], + [ "ktxHashList_DeleteEntry", "classktxHashList.html#a21e5f3318a192082258792f7f9d55400", null ], + [ "ktxHashList_DeleteKVPair", "classktxHashList.html#a71475476ba962532003472278dbe33a3", null ], + [ "ktxHashList_Deserialize", "classktxHashList.html#a3c05bb134c42ad852a4e68b6ebe057b1", null ], + [ "ktxHashList_Destroy", "classktxHashList.html#aa84d4269b0efd2fb9fb2508a371fa0ca", null ], + [ "ktxHashList_Destruct", "classktxHashList.html#a0e3349a7b71be7aaa4f8766fc8a0d437", null ], + [ "ktxHashList_FindEntry", "classktxHashList.html#a2d5939ac234d292854de5afeb786b6ae", null ], + [ "ktxHashList_FindValue", "classktxHashList.html#ab3625f19223436b718d9267f0b9a663a", null ], + [ "ktxHashList_Next", "classktxHashList.html#ad432c8d5ba733c69df496e7925e3a158", null ], + [ "ktxHashList_Serialize", "classktxHashList.html#a97ca46f361614d6cdfb59a42643f9fc2", null ], + [ "ktxHashList_Sort", "classktxHashList.html#aee36331d742259c1bb3f42e2c82e38ba", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/classktxHashListEntry.html b/ktx/build/docs/html/libktx/classktxHashListEntry.html new file mode 100644 index 0000000..f4c7569 --- /dev/null +++ b/ktx/build/docs/html/libktx/classktxHashListEntry.html @@ -0,0 +1,216 @@ + + + + + + + +libktx Reference: ktxHashListEntry Class Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxHashListEntry Class Reference
        +
        +
        + +

        Opaque handle to an entry in a ktxHashList. + More...

        + +

        #include <ktx.h>

        + + + + + + +

        +Public Member Functions

        KTX_error_code ktxHashListEntry_GetKey (ktxHashListEntry *This, unsigned int *pKeyLen, char **ppKey)
         Return the key of a ktxHashListEntry.
        KTX_error_code ktxHashListEntry_GetValue (ktxHashListEntry *This, unsigned int *pValueLen, void **ppValue)
         Return the value from a ktxHashListEntry.
        +

        Detailed Description

        +

        Opaque handle to an entry in a ktxHashList.

        +

        Member Function Documentation

        + +

        ◆ ktxHashListEntry_GetKey()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxHashListEntry_GetKey (ktxHashListEntry * This,
        unsigned int * pKeyLen,
        char ** ppKey )
        +
        + +

        Return the key of a ktxHashListEntry.

        +
        Parameters
        + + + + +
        [in]ThisThe target hash list entry.
        [in,out]pKeyLen*pKeyLen is set to the byte length of the returned key.
        [in,out]ppKey*ppKey is set to the point to the value of the key.
        +
        +
        +
        Returns
        KTX_SUCCESS or one of the following error codes.
        +
        Exceptions
        + + +
        KTX_INVALID_VALUEif pKvd or pHt is NULL or kvdLen == 0.
        +
        +
        + +
        +
        + +

        ◆ ktxHashListEntry_GetValue()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxHashListEntry_GetValue (ktxHashListEntry * This,
        unsigned int * pValueLen,
        void ** ppValue )
        +
        + +

        Return the value from a ktxHashListEntry.

        +
        Parameters
        + + + + +
        [in]ThisThe target hash list entry.
        [in,out]pValueLen*pValueLen is set to the number of bytes of data in the returned value.
        [in,out]ppValue*ppValue is set to point to the value of of the target entry.
        +
        +
        +
        Returns
        KTX_SUCCESS or one of the following error codes.
        +
        Exceptions
        + + +
        KTX_INVALID_VALUEif pKvd or pHt is NULL or kvdLen == 0.
        +
        +
        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/classktxHashListEntry.js b/ktx/build/docs/html/libktx/classktxHashListEntry.js new file mode 100644 index 0000000..b043d49 --- /dev/null +++ b/ktx/build/docs/html/libktx/classktxHashListEntry.js @@ -0,0 +1,5 @@ +var classktxHashListEntry = +[ + [ "ktxHashListEntry_GetKey", "classktxHashListEntry.html#aee9774ac793b8cc2c5955f0e88c13a2f", null ], + [ "ktxHashListEntry_GetValue", "classktxHashListEntry.html#a96c136b6470dba9bf971a8a3f9719f5e", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/clipboard.js b/ktx/build/docs/html/libktx/clipboard.js new file mode 100644 index 0000000..9da9f3c --- /dev/null +++ b/ktx/build/docs/html/libktx/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/ktx/build/docs/html/libktx/cookie.js b/ktx/build/docs/html/libktx/cookie.js new file mode 100644 index 0000000..53ad21d --- /dev/null +++ b/ktx/build/docs/html/libktx/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/ktx/build/docs/html/libktx/deprecated.html b/ktx/build/docs/html/libktx/deprecated.html new file mode 100644 index 0000000..ab9ec48 --- /dev/null +++ b/ktx/build/docs/html/libktx/deprecated.html @@ -0,0 +1,139 @@ + + + + + + + +libktx Reference: Deprecated List + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Deprecated List
        +
        +
        +
        +
        Global KTX_error_code
        +
        Use ktx_error_code_e.
        +
        Global KTX_TF_BC1
        +
        Use KTX_TTF_BC1_RGB.
        +
        Global KTX_TF_BC3
        +
        Use KTX_TTF_BC3_RGBA.
        +
        Global KTX_TF_BC4
        +
        Use KTX_TTF_BC4_R.
        +
        Global KTX_TF_BC5
        +
        Use KTX_TTF_BC5_RG.
        +
        Global KTX_TF_BC7_M6_OPAQUE_ONLY
        +
        Use KTX_TTF_BC7_RGBA
        +
        Global KTX_TF_ETC1
        +
        Use KTX_TTF_ETC1_RGB.
        +
        Global KTX_TF_ETC2
        +
        Use KTX_TTF_ETC.
        +
        Global KTX_TF_PVRTC1_4_OPAQUE_ONLY
        +
        Use KTX_TTF_PVRTC1_4_RGB.
        +
        Global KTX_TTF_BC7_M5_RGBA
        +
        Use KTX_TTF_BC7_RGBA.
        +
        Global KTX_TTF_BC7_M6_RGB
        +
        Use KTX_TTF_BC7_RGBA.
        +
        Global ktxBasisParams::separateRGToRGB_A
        +
        This was and is a no-op. 2-component inputs have always been automatically separated using an "rrrg" inputSwizzle.
        +
        Global ktxTexture2::ktxTexture2_GetOETF (ktxTexture2 *This)
        +
        Use ktxTexture2_GetTransferFunction_e.
        +
        Global ktxTexture2::ktxTexture2_GetOETF_e (ktxTexture2 *This)
        +
        Use ktxTexture2_GetTransferFunction_e. Now that the KTX specification allows setting of non-linear transfer functions other than sRGB, it is possible for the transfer function to be an EOTF so this name is no longer appropriate.
        +
        Global ktxTexture2::ktxTexture2_SetOETF (ktxTexture2 *This, khr_df_transfer_e tf)
        +
        Use ktxTexture2_SetTransferFunction.
        +
        +
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/dir_000002_000000.html b/ktx/build/docs/html/libktx/dir_000002_000000.html new file mode 100644 index 0000000..34ee0f4 --- /dev/null +++ b/ktx/build/docs/html/libktx/dir_000002_000000.html @@ -0,0 +1,111 @@ + + + + + + + +libktx Reference: lib -> include Relation + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +

        lib → include Relation

        File in libIncludes file in include
        astc_codec.cppktx.h
        basis_encode.cppktx.h
        basis_transcode.cppktx.h
        filestream.cktx.h
        glloader.cktx.h
        hashlist.cktx.h
        memstream.cktx.h
        miniz_wrapper.cppktx.h
        strings.cktx.h
        texture.cktx.h
        texture1.cktx.h
        texture2.cktx.h
        writer1.cktx.h
        writer2.cktx.h
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9.html b/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9.html new file mode 100644 index 0000000..2601afa --- /dev/null +++ b/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9.html @@ -0,0 +1,135 @@ + + + + + + + +libktx Reference: lib Directory Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        lib Directory Reference
        +
        +
        +
        +Directory dependency graph for lib:
        +
        +
        lib
        + + + + + + +
        + + + + + + + + +

        +Files

         
        filestream.c
         Implementation of ktxStream for FILE.
         
        memstream.c
         Implementation of ktxStream for memory.
         
        strings.c
         Functions to return a string corresponding to various enumerations.
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9.js b/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9.js new file mode 100644 index 0000000..b722c3b --- /dev/null +++ b/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9.js @@ -0,0 +1,6 @@ +var dir_97aefd0d527b934f1d99a682da8fe6a9 = +[ + [ "filestream.c", "filestream_8c.html", "filestream_8c" ], + [ "memstream.c", "memstream_8c.html", "memstream_8c" ], + [ "strings.c", "strings_8c.html", "strings_8c" ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9_dep.map b/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9_dep.map new file mode 100644 index 0000000..1e41fbd --- /dev/null +++ b/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9_dep.md5 b/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9_dep.md5 new file mode 100644 index 0000000..7507a15 --- /dev/null +++ b/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9_dep.md5 @@ -0,0 +1 @@ +fec7185d759361ed42ce0a5588821ec9 \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9_dep.png b/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9_dep.png new file mode 100644 index 0000000..6757f83 Binary files /dev/null and b/ktx/build/docs/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9_dep.png differ diff --git a/ktx/build/docs/html/libktx/dir_d44c64559bbebec7f509842c48db8b23.html b/ktx/build/docs/html/libktx/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 0000000..92c22cb --- /dev/null +++ b/ktx/build/docs/html/libktx/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,124 @@ + + + + + + + +libktx Reference: include Directory Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        include Directory Reference
        +
        +
        + + + +

        +Directories

         
        KHR
        + + + +

        +Files

         
        ktx.h
         Declares the public functions and structures of the KTX API.
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/dir_d44c64559bbebec7f509842c48db8b23.js b/ktx/build/docs/html/libktx/dir_d44c64559bbebec7f509842c48db8b23.js new file mode 100644 index 0000000..18dea15 --- /dev/null +++ b/ktx/build/docs/html/libktx/dir_d44c64559bbebec7f509842c48db8b23.js @@ -0,0 +1,4 @@ +var dir_d44c64559bbebec7f509842c48db8b23 = +[ + [ "ktx.h", "ktx_8h.html", "ktx_8h" ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/dir_f488c511561d1779081e43357a44a136.html b/ktx/build/docs/html/libktx/dir_f488c511561d1779081e43357a44a136.html new file mode 100644 index 0000000..425aa69 --- /dev/null +++ b/ktx/build/docs/html/libktx/dir_f488c511561d1779081e43357a44a136.html @@ -0,0 +1,123 @@ + + + + + + + +libktx Reference: include/KHR Directory Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        KHR Directory Reference
        +
        +
        +
        +Directory dependency graph for KHR:
        +
        +
        include/KHR
        + + + + +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/dir_f488c511561d1779081e43357a44a136_dep.map b/ktx/build/docs/html/libktx/dir_f488c511561d1779081e43357a44a136_dep.map new file mode 100644 index 0000000..2dd6720 --- /dev/null +++ b/ktx/build/docs/html/libktx/dir_f488c511561d1779081e43357a44a136_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/ktx/build/docs/html/libktx/dir_f488c511561d1779081e43357a44a136_dep.md5 b/ktx/build/docs/html/libktx/dir_f488c511561d1779081e43357a44a136_dep.md5 new file mode 100644 index 0000000..e21a910 --- /dev/null +++ b/ktx/build/docs/html/libktx/dir_f488c511561d1779081e43357a44a136_dep.md5 @@ -0,0 +1 @@ +336a5ab87b2eae8bc1c8322c8d833c16 \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/dir_f488c511561d1779081e43357a44a136_dep.png b/ktx/build/docs/html/libktx/dir_f488c511561d1779081e43357a44a136_dep.png new file mode 100644 index 0000000..993a2b8 Binary files /dev/null and b/ktx/build/docs/html/libktx/dir_f488c511561d1779081e43357a44a136_dep.png differ diff --git a/ktx/build/docs/html/libktx/doxygen.css b/ktx/build/docs/html/libktx/doxygen.css new file mode 100644 index 0000000..971d91b --- /dev/null +++ b/ktx/build/docs/html/libktx/doxygen.css @@ -0,0 +1,2547 @@ +/* The standard CSS for doxygen 1.16.1*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #3D578C; +--page-external-link-color: #334975; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--group-header-separator-color: #D9E0EE; +--group-header-color: #354C7B; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 75px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #C4CFE5; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #C4CFE5; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-folder-open-fill-color: #C4CFE5; +--icon-folder-fill-color: #D8DFEE; +--icon-folder-border-color: #4665A2; +--icon-doc-fill-color: #D8DFEE; +--icon-doc-border-color: #4665A2; + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; +--memdecl-border-color: #D5DDEC; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-proto-background-color: #EEF1F7; +--memdef-proto-text-color: #253555; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-border-color: #C4CFE5; +--nav-breadcrumb-separator-color: #C4CFE5; +--nav-breadcrumb-active-bg: #EEF1F7; +--nav-breadcrumb-color: #354C7B; +--nav-splitbar-bg-color: #DCE2EF; +--nav-splitbar-handle-color: #9CAFD4; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-active-bg: #DCE2EF; +--nav-menu-active-color: #9CAFD4; +--nav-arrow-color: #B6C4DF; +--nav-arrow-selected-color: #90A5CE; + +/* sync icon */ +--sync-icon-border-color: #C4CFE5; +--sync-icon-background-color: #F9FAFC; +--sync-icon-selected-background-color: #EEF1F7; +--sync-icon-color: #C4CFE5; +--sync-icon-selected-color: #6884BD; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-active-color: black; +--search-filter-background-color: rgba(255,255,255,.7); +--search-filter-backdrop-filter: blur(4px); +--search-filter-foreground-color: black; +--search-filter-border-color: rgba(150,150,150,.4); +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: rgba(255,255,255,.8); +--search-results-backdrop-filter: blur(4px); +--search-results-border-color: rgba(150,150,150,.4); +--search-box-border-color: #B6C4DF; +--search-close-icon-bg-color: #A0A0A0; +--search-close-icon-fg-color: white; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--fragment-highlight-filter: -3; +--tooltip-foreground-color: black; +--tooltip-background-color: rgba(255,255,255,0.8); +--tooltip-arrow-background-color: white; +--tooltip-border-color: rgba(150,150,150,0.7); +--tooltip-backdrop-filter: blur(3px); +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 0 4px 8px 0 rgba(0,0,0,.25); +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; +--satisfies-color-hl: #b61825; +--satisfies-color-bg: #f8d1cc; +--verifies-color-hl: #b61825; +--verifies-color-bg: #f8d1cc; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #90A5CE; +--page-external-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--group-header-separator-color: #1D2A43; +--group-header-color: #90A5CE; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #212F4B; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #2C3F65; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-folder-open-fill-color: #4665A2; +--icon-folder-fill-color: #5373B4; +--icon-folder-border-color: #C4CFE5; +--icon-doc-fill-color: #6884BD; +--icon-doc-border-color: #C4CFE5; + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; +--memdecl-border-color: #233250; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-border-color: #212F4B; +--nav-breadcrumb-separator-color: #212F4B; +--nav-breadcrumb-active-bg: #1D2A43; +--nav-breadcrumb-color: #90A5CE; +--nav-splitbar-bg-color: #283A5D; +--nav-splitbar-handle-color: #4665A2; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-active-bg: #1D2A43; +--nav-menu-active-color: #C9D3E7; +--nav-arrow-color: #4665A2; +--nav-arrow-selected-color: #6884BD; + +/* sync icon */ +--sync-icon-border-color: #212F4B; +--sync-icon-background-color: #101826; +--sync-icon-selected-background-color: #1D2A43; +--sync-icon-color: #4665A2; +--sync-icon-selected-color: #5373B4; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-active-color: #F5F5F5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-backdrop-filter: none; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: black; +--search-results-foreground-color: #90A5CE; +--search-results-backdrop-filter: none; +--search-results-border-color: #334975; +--search-box-border-color: #334975; +--search-close-icon-bg-color: #909090; +--search-close-icon-fg-color: black; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: #090D16; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--fragment-highlight-filter: 5; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-arrow-background-color: #202020; +--tooltip-backdrop-filter: none; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; +--satisfies-color-hl: #ad2617; +--satisfies-color-bg: #2e1917; +--verifies-color-hl: #ad2617; +--verifies-color-bg: #2e1917; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +body.resizing { + user-select: none; + -webkit-user-select: none; +} + +#doc-content { + scrollbar-width: thin; +} + +/* @group Heading Levels */ + +.title { + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 160%; + font-weight: 400; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + box-shadow: 12px 0 var(--page-background-color), + -12px 0 var(--page-background-color), + 12px 1px var(--group-header-separator-color), + -12px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +td h2.groupheader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; + margin-bottom: 0px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + margin-right: 6px; + padding-right: 6px; + text-align: right; + line-height: 110%; + background-color: var(--nav-background-color); +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + padding-right: 6px; + padding-left: 6px; + border-radius: 0 6px 6px 0; + background-color: var(--nav-menu-active-bg); +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +span.label a:hover { + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.el, a.el:visited, a.code, a.code:visited, a.line, a.line:visited { + color: var(--page-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--page-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +div.embeddoc { + font-family: var(--font-family-monospace); + padding-left: 10px; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul.check { + list-style: none; + padding-left: 40px; + margin: 0; +} + +ul.check li { + position: relative; +} + +li.unchecked::before, li.checked::before { + position: absolute; + left: -18px; + top: 0; +} + +li.unchecked::before { + content: "☐"; +} + +li.checked::before { + content: "☑"; +} + +ul.check li > p { + display: inline; +} + +ul.check li > p:not(:first-child) { + display: block; +} + +ol { + text-indent: 0px; +} + +ul { + text-indent: 0px; + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +span.tt { + white-space: pre; + font-family: var(--font-family-monospace); + background-color: var(--fragment-background-color); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: hidden; + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .4; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: wrap; + word-break: break-all; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -62px; + padding-left: 62px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + display: inline-block; + width: 12px; + height: 12px; + margin-left: 4px; + margin-right: 1px; +} + +span.foldnone { + display: inline-block; + position: relative; + cursor: pointer; + user-select: none; +} + +span.fold.plus, span.fold.minus { + width: 10px; + height: 10px; + background-color: var(--fragment-background-color); + position: relative; + border: 1px solid var(--fold-line-color); + margin-right: 1px; +} + +span.fold.plus::before, span.fold.minus::before { + content: ''; + position: absolute; + background-color: var(--fold-line-color); +} + +span.fold.plus::before { + width: 2px; + height: 6px; + top: 2px; + left: 4px; +} + +span.fold.plus::after { + content: ''; + position: absolute; + width: 6px; + height: 2px; + top: 4px; + left: 2px; + background-color: var(--fold-line-color); +} + +span.fold.minus::before { + width: 6px; + height: 2px; + top: 4px; + left: 2px; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 110%; + font-weight: 500; + margin-left: 0px; + margin-top: 0em; + margin-bottom: 6px; + padding-top: 8px; + padding-bottom: 4px; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 12px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + border: none; + margin-top: 16px; + margin-bottom: 16px; + height: 1px; + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight { + padding-top: 2px; + padding-bottom: 2px; +} + +.memTemplParams { + padding-left: 10px; + padding-top: 5px; +} + +.memItemLeft, .memItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +tr[class^='memdesc'] { + box-shadow: inset 0px 1px 3px 0px rgba(0,0,0,.075); +} + +.mdescLeft { + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.mdescRight { + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; + border-left: 1px solid var(--memdecl-border-color); + border-right: 1px solid var(--memdecl-border-color); +} + +td.ititle { + border: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + padding-left: 10px; +} + +tr:not(:first-child) > td.ititle { + border-top: 0; + border-radius: 0; +} + +.memItemLeft { + white-space: nowrap; + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-left: 10px; + transition: none; + vertical-align: top; + text-align: right; +} + +.memItemRight { + width: 100%; + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-right: 10px; + transition: none; + vertical-align: bottom; +} + +tr.heading + tr[class^='memitem'] td.memItemLeft, +tr.groupHeader + tr[class^='memitem'] td.memItemLeft, +tr.inherit_header + tr[class^='memitem'] td.memItemLeft { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memItemRight, +tr.groupHeader + tr[class^='memitem'] td.memItemRight, +tr.inherit_header + tr[class^='memitem'] td.memItemRight { + border-top: 1px solid var(--memdecl-border-color); + border-top-right-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memTemplParams, +tr.heading + tr td.ititle, +tr.groupHeader + tr[class^='memitem'] td.memTemplParams, +tr.groupHeader + tr td.ititle, +tr.inherit_header + tr[class^='memitem'] td.memTemplParams { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemLeft, +table.memberdecls tr:last-child td.mdescLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescLeft { + border-bottom-left-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemRight, +table.memberdecls tr:last-child td.mdescRight, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemRight, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescRight { + border-bottom-right-radius: 4px; +} + +tr.template .memItemLeft, tr.template .memItemRight { + border-top: none; + padding-top: 0; +} + + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-color: var(--memdef-proto-background-color); + line-height: 1.25; + font-family: var(--font-family-monospace); + font-weight: 500; + font-size: 16px; + float:left; + box-shadow: 0 10px 0 -1px var(--memdef-proto-background-color), + 0 2px 8px 0 rgba(0,0,0,.075); + position: relative; +} + +.memtitle:after { + content: ''; + display: block; + background: var(--memdef-proto-background-color); + height: 10px; + bottom: -10px; + left: 0px; + right: -14px; + position: absolute; + border-top-right-radius: 6px; +} + +.permalink +{ + font-family: var(--font-family-monospace); + font-weight: 500; + line-height: 1.25; + font-size: 16px; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-family: var(--font-family-monospace); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + display: table !important; + width: 100%; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + border-radius: 4px; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-family: var(--font-family-monospace); + font-size: 13px; + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + background-color: var(--memdef-proto-background-color); + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; +} + +.paramname { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; +} + +.paramname em { + color: var(--memdef-param-name-color); + font-style: normal; + margin-right: 1px; +} + +.paramname .paramdefval { + font-family: var(--font-family-monospace); +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-background-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 14px; + transition: opacity 0.3s ease; +} + +span.arrowhead { + position: relative; + padding: 0; + margin: 0 0 0 2px; + display: inline-block; + width: 5px; + height: 5px; + border-right: 2px solid var(--nav-arrow-color); + border-bottom: 2px solid var(--nav-arrow-color); + transform: rotate(-45deg); + transition: transform 0.3s ease; +} + +span.arrowhead.opened { + transform: rotate(45deg); +} + +.selected span.arrowhead { + border-right: 2px solid var(--nav-arrow-selected-color); + border-bottom: 2px solid var(--nav-arrow-selected-color); +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfolder { + width: 24px; + height: 18px; + margin-top: 6px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.icondoc { + width: 24px; + height: 18px; + margin-top: 3px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.folder-icon { + width: 16px; + height: 11px; + background-color: var(--icon-folder-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 0 2px 2px 2px; + position: relative; + box-sizing: content-box; +} + +.folder-icon::after { + content: ''; + position: absolute; + top: 2px; + left: -1px; + width: 16px; + height: 7px; + background-color: var(--icon-folder-open-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 7px 7px 2px 2px; + transform-origin: top left; + opacity: 0; + transition: all 0.3s linear; +} + +.folder-icon::before { + content: ''; + position: absolute; + top: -3px; + left: -1px; + width: 6px; + height: 2px; + background-color: var(--icon-folder-fill-color); + border-top: 1px solid var(--icon-folder-border-color); + border-left: 1px solid var(--icon-folder-border-color); + border-right: 1px solid var(--icon-folder-border-color); + border-radius: 2px 2px 0 0; +} + +.folder-icon.open::after { + top: 3px; + opacity: 1; +} + +.doc-icon { + left: 6px; + width: 12px; + height: 16px; + background-color: var(--icon-doc-border-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: relative; + display: inline-block; +} +.doc-icon::before { + content: ""; + left: 1px; + top: 1px; + width: 10px; + height: 14px; + background-color: var(--icon-doc-fill-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: absolute; + box-sizing: border-box; +} +.doc-icon::after { + content: ""; + left: 7px; + top: 0px; + width: 3px; + height: 3px; + background-color: transparent; + position: absolute; + border: 1px solid var(--icon-doc-border-color); +} + + + + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +span.dynarrow { + position: relative; + display: inline-block; + width: 12px; + bottom: 1px; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fieldinit { + padding-top: 3px; + text-align: right; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +/* style requirements page */ + +div.req_title { + text-decoration-line: underline; + text-decoration-style: solid; + text-decoration-color: var(--table-cell-border-color); + text-decoration-thickness: 1px; + font-weight: bold; +} + +table.reqlist tr > td:first-child { + text-align: right; + font-weight: bold; +} + +div.missing_satisfies { + border-left: 8px solid var(--satisfies-color-hl); + border-radius: 4px; + background: var(--satisfies-color-bg); + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; +} + +div.missing_verifies { + border-left: 8px solid var(--verifies-color-hl); + border-radius: 4px; + background: var(--verifies-color-bg); + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; +} + +/* ----------- navigation breadcrumb styling ----------- */ + +#nav-path ul { + height: 30px; + line-height: 30px; + color: var(--nav-text-normal-color); + overflow: hidden; + margin: 0px; + padding-left: 4px; + background-image: none; + background: var(--page-background-color); + border-bottom: 1px solid var(--nav-breadcrumb-separator-color); + font-size: var(--nav-font-size-level1); + font-family: var(--font-family-nav); + position: relative; + z-index: 100; +} + +#main-nav { + border-bottom: 1px solid var(--nav-border-color); +} + +.navpath li { + list-style-type:none; + float:left; + color: var(--nav-foreground-color); +} + +.navpath li.footer { + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + font-size: 8pt; + color: var(--footer-foreground-color); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; + padding-left: 15px; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--nav-breadcrumb-color); + position: relative; + top: 0px; + height: 30px; + margin-right: -20px; +} + +#nav-path li.navelem:after { + content: ''; + display: inline-block; + position: relative; + top: 0; + right: -15px; + width: 30px; + height: 30px; + transform: scaleX(0.5) scale(0.707) rotate(45deg); + z-index: 10; + background: var(--page-background-color); + box-shadow: 2px -2px 0 2px var(--nav-breadcrumb-separator-color); + border-radius: 0 5px 0 50px; +} + +#nav-path li.navelem:first-child { + margin-left: -6px; +} + +#nav-path li.navelem:hover, +#nav-path li.navelem:hover:after { + background-color: var(--nav-breadcrumb-active-bg); +} + +/* ---------------------- */ + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + margin: 0px; + background-color: var(--header-background-color); + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl { + padding: 0 0 0 0; +} + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); +} + +dl.warning .tt, dl.attention .tt, dl.important .tt { + background-color: hsl(from var(--warning-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.note .tt, dl.remark .tt { + background-color: hsl(from var(--note-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.todo .tt { + background-color: hsl(from var(--todo-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.test .tt { + background-color: hsl(from var(--test-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug .tt { + background-color: hsl(from var(--bug-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.deprecated .tt { + background-color: hsl(from var(--deprecated-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); +} + +dl.invariant .tt, dl.pre .tt, dl.post .tt { + background-color: hsl(from var(--invariant-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0; + padding: 0; +} + +#side-nav #projectname +{ + font-size: 130%; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0 0 0 5px; + margin: 0px; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li[class^='level'] { + margin-left: 15px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.empty { + background-image: none; + margin-top: 0px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: 400; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0 2px 0; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 12px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + backdrop-filter: var(--tooltip-backdrop-filter); + -webkit-backdrop-filter: var(--tooltip-backdrop-filter); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd +{ + display: inline-block; +} +tt, code, kbd +{ + vertical-align: top; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + + +html { +--timestamp: 'Sun Jun 14 2026 18:00:57'; +} +span.timestamp { content: ' '; } +span.timestamp:before { content: var(--timestamp); } + +:root { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/ktx/build/docs/html/libktx/doxygen.svg b/ktx/build/docs/html/libktx/doxygen.svg new file mode 100644 index 0000000..79a7635 --- /dev/null +++ b/ktx/build/docs/html/libktx/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/libktx/doxygen_crawl.html b/ktx/build/docs/html/libktx/doxygen_crawl.html new file mode 100644 index 0000000..7776deb --- /dev/null +++ b/ktx/build/docs/html/libktx/doxygen_crawl.html @@ -0,0 +1,533 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/libktx/dynsections.js b/ktx/build/docs/html/libktx/dynsections.js new file mode 100644 index 0000000..0e15bd4 --- /dev/null +++ b/ktx/build/docs/html/libktx/dynsections.js @@ -0,0 +1,191 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); +} + +let dynsection = { + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.slideUp('fast'); + summary.show(); + $(linkObj).find('.arrowhead').addClass('closed').removeClass('opened'); + } else { + content.slideDown('fast'); + summary.hide(); + $(linkObj).find('.arrowhead').removeClass('closed').addClass('opened'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').addClass('plus').removeClass('minus'); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/ktx/build/docs/html/libktx/examples.html b/ktx/build/docs/html/libktx/examples.html new file mode 100644 index 0000000..e87e544 --- /dev/null +++ b/ktx/build/docs/html/libktx/examples.html @@ -0,0 +1,110 @@ + + + + + + + +libktx Reference: Examples + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Examples
        +
        +
        +
        Here is a list of all examples:
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/examples.js b/ktx/build/docs/html/libktx/examples.js new file mode 100644 index 0000000..3e9db3b --- /dev/null +++ b/ktx/build/docs/html/libktx/examples.js @@ -0,0 +1,5 @@ +var examples = +[ + [ "glloader.c", "glloader_8c-example.html", null ], + [ "vkload.cpp", "vkload_8cpp-example.html", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/files.html b/ktx/build/docs/html/libktx/files.html new file mode 100644 index 0000000..c64930b --- /dev/null +++ b/ktx/build/docs/html/libktx/files.html @@ -0,0 +1,116 @@ + + + + + + + +libktx Reference: File List + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        File List
        +
        +
        +
        Here is a list of all documented files with brief descriptions:
        +
        [detail level 12]
        + + + + + + +
         
        include
         
        ktx.h
        Declares the public functions and structures of the KTX API
         
        lib
         
        filestream.c
        Implementation of ktxStream for FILE
         
        memstream.c
        Implementation of ktxStream for memory
         
        strings.c
        Functions to return a string corresponding to various enumerations
        +
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/files_dup.js b/ktx/build/docs/html/libktx/files_dup.js new file mode 100644 index 0000000..6f65f61 --- /dev/null +++ b/ktx/build/docs/html/libktx/files_dup.js @@ -0,0 +1,5 @@ +var files_dup = +[ + [ "include", "dir_d44c64559bbebec7f509842c48db8b23.html", "dir_d44c64559bbebec7f509842c48db8b23" ], + [ "lib", "dir_97aefd0d527b934f1d99a682da8fe6a9.html", "dir_97aefd0d527b934f1d99a682da8fe6a9" ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/filestream_8c.html b/ktx/build/docs/html/libktx/filestream_8c.html new file mode 100644 index 0000000..5579136 --- /dev/null +++ b/ktx/build/docs/html/libktx/filestream_8c.html @@ -0,0 +1,251 @@ + + + + + + + +libktx Reference: lib/filestream.c File Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        filestream.c File Reference
        +
        +
        + +

        Implementation of ktxStream for FILE. +More...

        +
        #include <assert.h>
        +#include <errno.h>
        +#include <inttypes.h>
        +#include <string.h>
        +#include <stdio.h>
        +#include <stdlib.h>
        +#include <sys/types.h>
        +#include <sys/stat.h>
        +#include "ktx.h"
        +#include "ktxint.h"
        +#include "filestream.h"
        +
        +Include dependency graph for filestream.c:
        +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        + + + + + +

        +Functions

        KTX_error_code ktxFileStream_construct (ktxStream *str, FILE *file, ktx_bool_t closeFileOnDestruct)
         Initialize a ktxFileStream.
        void ktxFileStream_destruct (ktxStream *str)
         Destruct the stream, potentially closing the underlying FILE.
        +

        Detailed Description

        +

        Implementation of ktxStream for FILE.

        +
        Author
        Maksim Kolesin, Under Development
        +
        +Georg Kolling, Imagination Technology
        +
        +Mark Callow, HI Corporation
        +

        Function Documentation

        + +

        ◆ ktxFileStream_construct()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxFileStream_construct (ktxStream * str,
        FILE * file,
        ktx_bool_t closeFileOnDestruct )
        +
        + +

        Initialize a ktxFileStream.

        +
        Parameters
        + + + + +
        [in]strpointer to the ktxStream to initialize.
        [in]filepointer to the underlying FILE object.
        [in]closeFileOnDestructif not false, stdio file pointer will be closed when ktxStream is destructed.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, KTX_INVALID_VALUE on error.
        +
        Exceptions
        + + +
        KTX_INVALID_VALUEstream is NULL or file is NULL.
        +
        +
        + +
        +
        + +

        ◆ ktxFileStream_destruct()

        + +
        +
        + + + + + + + +
        void ktxFileStream_destruct (ktxStream * str)
        +
        + +

        Destruct the stream, potentially closing the underlying FILE.

        +

        This only closes the underyling FILE if the closeOnDestruct parameter to ktxFileStream_construct() was not KTX_FALSE.

        +
        Parameters
        + + +
        [in]strpointer to the ktxStream whose FILE is to potentially be closed.
        +
        +
        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/filestream_8c.js b/ktx/build/docs/html/libktx/filestream_8c.js new file mode 100644 index 0000000..0d22c2c --- /dev/null +++ b/ktx/build/docs/html/libktx/filestream_8c.js @@ -0,0 +1,5 @@ +var filestream_8c = +[ + [ "ktxFileStream_construct", "filestream_8c.html#a217a544c241e80216315a50883190519", null ], + [ "ktxFileStream_destruct", "filestream_8c.html#adc6cf29b8543378ffae60e6eaa77c7fc", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/filestream_8c__incl.map b/ktx/build/docs/html/libktx/filestream_8c__incl.map new file mode 100644 index 0000000..5af3232 --- /dev/null +++ b/ktx/build/docs/html/libktx/filestream_8c__incl.map @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/libktx/filestream_8c__incl.md5 b/ktx/build/docs/html/libktx/filestream_8c__incl.md5 new file mode 100644 index 0000000..587d64e --- /dev/null +++ b/ktx/build/docs/html/libktx/filestream_8c__incl.md5 @@ -0,0 +1 @@ +b4a7fdc8d7607d14c8184cd132c2391b \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/filestream_8c__incl.png b/ktx/build/docs/html/libktx/filestream_8c__incl.png new file mode 100644 index 0000000..f268d05 Binary files /dev/null and b/ktx/build/docs/html/libktx/filestream_8c__incl.png differ diff --git a/ktx/build/docs/html/libktx/functions.html b/ktx/build/docs/html/libktx/functions.html new file mode 100644 index 0000000..3df57da --- /dev/null +++ b/ktx/build/docs/html/libktx/functions.html @@ -0,0 +1,109 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - _ -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_a.html b/ktx/build/docs/html/libktx/functions_a.html new file mode 100644 index 0000000..2568c52 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_a.html @@ -0,0 +1,111 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - a -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_b.html b/ktx/build/docs/html/libktx/functions_b.html new file mode 100644 index 0000000..9d6ddc1 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_b.html @@ -0,0 +1,113 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - b -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_c.html b/ktx/build/docs/html/libktx/functions_c.html new file mode 100644 index 0000000..e1007bd --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_c.html @@ -0,0 +1,113 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - c -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_d.html b/ktx/build/docs/html/libktx/functions_d.html new file mode 100644 index 0000000..c606f1e --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_d.html @@ -0,0 +1,114 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - d -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_dup.js b/ktx/build/docs/html/libktx/functions_dup.js new file mode 100644 index 0000000..94f0b44 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_dup.js @@ -0,0 +1,29 @@ +var functions_dup = +[ + [ "_", "functions.html", null ], + [ "a", "functions_a.html", null ], + [ "b", "functions_b.html", null ], + [ "c", "functions_c.html", null ], + [ "d", "functions_d.html", null ], + [ "e", "functions_e.html", null ], + [ "f", "functions_f.html", null ], + [ "g", "functions_g.html", null ], + [ "h", "functions_h.html", null ], + [ "i", "functions_i.html", null ], + [ "k", "functions_k.html", null ], + [ "l", "functions_l.html", null ], + [ "m", "functions_m.html", null ], + [ "n", "functions_n.html", null ], + [ "o", "functions_o.html", null ], + [ "p", "functions_p.html", null ], + [ "q", "functions_q.html", null ], + [ "r", "functions_r.html", null ], + [ "s", "functions_s.html", null ], + [ "t", "functions_t.html", null ], + [ "u", "functions_u.html", null ], + [ "v", "functions_v.html", null ], + [ "w", "functions_w.html", null ], + [ "x", "functions_x.html", null ], + [ "y", "functions_y.html", null ], + [ "z", "functions_z.html", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/functions_e.html b/ktx/build/docs/html/libktx/functions_e.html new file mode 100644 index 0000000..f709aa3 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_e.html @@ -0,0 +1,108 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - e -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_enum.html b/ktx/build/docs/html/libktx/functions_enum.html new file mode 100644 index 0000000..e40b31e --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_enum.html @@ -0,0 +1,107 @@ + + + + + + + +libktx Reference: Data Fields - Enumerations + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented enums with links to the struct/union documentation for each field:
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_f.html b/ktx/build/docs/html/libktx/functions_f.html new file mode 100644 index 0000000..8aa46c8 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_f.html @@ -0,0 +1,109 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - f -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_func.html b/ktx/build/docs/html/libktx/functions_func.html new file mode 100644 index 0000000..6cd11d5 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_func.html @@ -0,0 +1,226 @@ + + + + + + + +libktx Reference: Data Fields - Functions + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented functions with links to the struct/union documentation for each field:
        + +

        - h -

        + + +

        - t -

        + + +

        - v -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_g.html b/ktx/build/docs/html/libktx/functions_g.html new file mode 100644 index 0000000..b862c8d --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_g.html @@ -0,0 +1,114 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - g -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_h.html b/ktx/build/docs/html/libktx/functions_h.html new file mode 100644 index 0000000..fdc30ad --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_h.html @@ -0,0 +1,125 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - h -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_i.html b/ktx/build/docs/html/libktx/functions_i.html new file mode 100644 index 0000000..b870b2d --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_i.html @@ -0,0 +1,115 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - i -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_k.html b/ktx/build/docs/html/libktx/functions_k.html new file mode 100644 index 0000000..723fc45 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_k.html @@ -0,0 +1,110 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - k -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_l.html b/ktx/build/docs/html/libktx/functions_l.html new file mode 100644 index 0000000..529326d --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_l.html @@ -0,0 +1,109 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - l -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_m.html b/ktx/build/docs/html/libktx/functions_m.html new file mode 100644 index 0000000..6fe0786 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_m.html @@ -0,0 +1,113 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - m -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_n.html b/ktx/build/docs/html/libktx/functions_n.html new file mode 100644 index 0000000..5820ba6 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_n.html @@ -0,0 +1,115 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - n -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_o.html b/ktx/build/docs/html/libktx/functions_o.html new file mode 100644 index 0000000..72bac5b --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_o.html @@ -0,0 +1,108 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - o -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_p.html b/ktx/build/docs/html/libktx/functions_p.html new file mode 100644 index 0000000..a3a5fb0 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_p.html @@ -0,0 +1,114 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - p -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_q.html b/ktx/build/docs/html/libktx/functions_q.html new file mode 100644 index 0000000..3e4f4a0 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_q.html @@ -0,0 +1,109 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - q -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_r.html b/ktx/build/docs/html/libktx/functions_r.html new file mode 100644 index 0000000..0b29abd --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_r.html @@ -0,0 +1,109 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - r -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_s.html b/ktx/build/docs/html/libktx/functions_s.html new file mode 100644 index 0000000..fc93cfc --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_s.html @@ -0,0 +1,113 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - s -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_t.html b/ktx/build/docs/html/libktx/functions_t.html new file mode 100644 index 0000000..6c07ad7 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_t.html @@ -0,0 +1,197 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - t -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_type.html b/ktx/build/docs/html/libktx/functions_type.html new file mode 100644 index 0000000..21da659 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_type.html @@ -0,0 +1,107 @@ + + + + + + + +libktx Reference: Data Fields - Typedefs + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented typedefs with links to the struct/union documentation for each field:
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_u.html b/ktx/build/docs/html/libktx/functions_u.html new file mode 100644 index 0000000..e68990a --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_u.html @@ -0,0 +1,116 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - u -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_v.html b/ktx/build/docs/html/libktx/functions_v.html new file mode 100644 index 0000000..d088529 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_v.html @@ -0,0 +1,123 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - v -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_vars.html b/ktx/build/docs/html/libktx/functions_vars.html new file mode 100644 index 0000000..e0459e0 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_vars.html @@ -0,0 +1,310 @@ + + + + + + + +libktx Reference: Data Fields - Variables + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented variables with links to the struct/union documentation for each field:
        + +

        - _ -

        + + +

        - a -

        + + +

        - b -

        + + +

        - c -

        + + +

        - d -

        + + +

        - e -

        + + +

        - f -

        + + +

        - g -

        + + +

        - h -

        + + +

        - i -

        + + +

        - k -

        + + +

        - l -

        + + +

        - m -

        + + +

        - n -

        + + +

        - o -

        + + +

        - p -

        + + +

        - q -

        + + +

        - r -

        + + +

        - s -

        + + +

        - t -

        + + +

        - u -

        + + +

        - v -

        + + +

        - w -

        + + +

        - x -

        + + +

        - y -

        + + +

        - z -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_w.html b/ktx/build/docs/html/libktx/functions_w.html new file mode 100644 index 0000000..273ab60 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_w.html @@ -0,0 +1,109 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - w -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_x.html b/ktx/build/docs/html/libktx/functions_x.html new file mode 100644 index 0000000..814a84e --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_x.html @@ -0,0 +1,108 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - x -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_y.html b/ktx/build/docs/html/libktx/functions_y.html new file mode 100644 index 0000000..ce8af43 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_y.html @@ -0,0 +1,108 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - y -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/functions_z.html b/ktx/build/docs/html/libktx/functions_z.html new file mode 100644 index 0000000..711c377 --- /dev/null +++ b/ktx/build/docs/html/libktx/functions_z.html @@ -0,0 +1,108 @@ + + + + + + + +libktx Reference: Data Fields + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
        + +

        - z -

        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/glloader_8c-example.html b/ktx/build/docs/html/libktx/glloader_8c-example.html new file mode 100644 index 0000000..7c052e3 --- /dev/null +++ b/ktx/build/docs/html/libktx/glloader_8c-example.html @@ -0,0 +1,1309 @@ + + + + + + + +libktx Reference: glloader.c + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        glloader.c
        +
        +
        +

        This is an example of using the low-level ktxTexture API to create and load an OpenGL texture. It is a fragment of the code used by ktxTexture1_GLUpload and ktxTexture2_GLUpload.

        +
        #include <ktx.h>
        +
        Declares the public functions and structures of the KTX API.
        +

        This structure is used to pass to a callback function data that is uniform across all images.

        typedef struct ktx_cbdata {
        +
        GLenum glTarget;
        +
        GLenum glFormat;
        +
        GLenum glInternalformat;
        +
        GLenum glType;
        +
        GLenum glError;
        +
        GLuint numLayers;
        +
        } ktx_cbdata;
        +

        One of these callbacks, selected by ktxTexture1_GLUpload or ktxTexture2_GLUpload based on the dimensionality and arrayness of the texture, is called from ktxTexture_IterateLevelFaces to upload the texture data to OpenGL.

        + +
        texImage1DCallback(int miplevel, int face,
        +
        int width, int height,
        +
        int depth,
        +
        ktx_uint64_t faceLodSize,
        +
        void* pixels, void* userdata)
        +
        {
        +
        ktx_cbdata* cbData = (ktx_cbdata*)userdata;
        +
        UNUSED(faceLodSize);
        +
        UNUSED(depth);
        +
        UNUSED(height);
        +
        +
        assert(gl.glTexImage1D != NULL);
        +
        gl.glTexImage1D(cbData->glTarget + face, miplevel,
        +
        cbData->glInternalformat, width, 0,
        +
        cbData->glFormat, cbData->glType, pixels);
        +
        +
        if ((cbData->glError = glGetError()) == GL_NO_ERROR) {
        +
        return KTX_SUCCESS;
        +
        } else {
        +
        return KTX_GL_ERROR;
        +
        }
        +
        }
        +
        + +
        compressedTexImage1DCallback(int miplevel, int face,
        +
        int width, int height,
        +
        int depth,
        +
        ktx_uint64_t faceLodSize,
        +
        void* pixels, void* userdata)
        +
        {
        +
        ktx_cbdata* cbData = (ktx_cbdata*)userdata;
        +
        UNUSED(depth);
        +
        UNUSED(height);
        +
        +
        if (faceLodSize > UINT32_MAX)
        +
        return KTX_INVALID_OPERATION; // Too big for OpenGL {,ES}.
        +
        +
        assert(gl.glCompressedTexImage1D != NULL);
        +
        gl.glCompressedTexImage1D(cbData->glTarget + face, miplevel,
        +
        cbData->glInternalformat, width, 0,
        +
        (ktx_uint32_t)faceLodSize, pixels);
        +
        +
        if ((cbData->glError = glGetError()) == GL_NO_ERROR) {
        +
        return KTX_SUCCESS;
        +
        } else {
        +
        return KTX_GL_ERROR;
        +
        }
        +
        }
        +
        + +
        texImage2DCallback(int miplevel, int face,
        +
        int width, int height,
        +
        int depth,
        +
        ktx_uint64_t faceLodSize,
        +
        void* pixels, void* userdata)
        +
        {
        +
        ktx_cbdata* cbData = (ktx_cbdata*)userdata;
        +
        UNUSED(depth);
        +
        UNUSED(faceLodSize);
        +
        +
        glTexImage2D(cbData->glTarget + face, miplevel,
        +
        cbData->glInternalformat, width,
        +
        cbData->numLayers == 0 ? (GLuint)height : cbData->numLayers, 0,
        +
        cbData->glFormat, cbData->glType, pixels);
        +
        +
        if ((cbData->glError = glGetError()) == GL_NO_ERROR) {
        +
        return KTX_SUCCESS;
        +
        } else {
        +
        return KTX_GL_ERROR;
        +
        }
        +
        }
        +
        +
        + +
        compressedTexImage2DCallback(int miplevel, int face,
        +
        int width, int height,
        +
        int depth,
        +
        ktx_uint64_t faceLodSize,
        +
        void* pixels, void* userdata)
        +
        {
        +
        ktx_cbdata* cbData = (ktx_cbdata*)userdata;
        +
        GLenum glerror;
        + +
        UNUSED(depth);
        +
        +
        if (faceLodSize > UINT32_MAX)
        +
        return KTX_INVALID_OPERATION; // Too big for OpenGL {,ES}.
        +
        +
        // It is simpler to just attempt to load the format, rather than divine
        +
        // which formats are supported by the implementation. In the event of an
        +
        // error, software unpacking can be attempted.
        +
        glCompressedTexImage2D(cbData->glTarget + face, miplevel,
        +
        cbData->glInternalformat, width,
        +
        cbData->numLayers == 0 ? (GLuint)height : cbData->numLayers,
        +
        0,
        +
        (ktx_uint32_t)faceLodSize, pixels);
        +
        +
        glerror = glGetError();
        +
        #if SUPPORT_SOFTWARE_ETC_UNPACK
        +
        // Renderion is returning INVALID_VALUE. Oops!!
        +
        if ((glerror == GL_INVALID_ENUM || glerror == GL_INVALID_VALUE)
        +
        && (cbData->glInternalformat == GL_ETC1_RGB8_OES
        +
        || (cbData->glInternalformat >= GL_COMPRESSED_R11_EAC
        +
        && cbData->glInternalformat <= GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC)
        +
        ))
        +
        {
        +
        GLubyte* unpacked;
        +
        GLenum format, internalformat, type;
        +
        +
        result = _ktxUnpackETC((GLubyte*)pixels, cbData->glInternalformat,
        +
        width, height, &unpacked,
        +
        &format, &internalformat,
        +
        &type, R16Formats, supportsSRGB);
        +
        if (result != KTX_SUCCESS) {
        +
        return result;
        +
        }
        +
        if (!(sizedFormats & _NON_LEGACY_FORMATS)) {
        +
        if (internalformat == GL_RGB8)
        +
        internalformat = GL_RGB;
        +
        else if (internalformat == GL_RGBA8)
        +
        internalformat = GL_RGBA;
        +
        }
        +
        glTexImage2D(cbData->glTarget + face, miplevel,
        +
        internalformat, width,
        +
        cbData->numLayers == 0 ? (GLuint)height : cbData->numLayers, 0,
        +
        format, type, unpacked);
        +
        +
        free(unpacked);
        +
        glerror = glGetError();
        +
        }
        +
        #endif
        +
        +
        if ((cbData->glError = glerror) == GL_NO_ERROR) {
        +
        return KTX_SUCCESS;
        +
        } else {
        +
        return KTX_GL_ERROR;
        +
        }
        +
        }
        +
        + +
        texImage3DCallback(int miplevel, int face,
        +
        int width, int height,
        +
        int depth,
        +
        ktx_uint64_t faceLodSize,
        +
        void* pixels, void* userdata)
        +
        {
        +
        ktx_cbdata* cbData = (ktx_cbdata*)userdata;
        +
        UNUSED(faceLodSize);
        +
        +
        assert(gl.glTexImage3D != NULL);
        +
        gl.glTexImage3D(cbData->glTarget + face, miplevel,
        +
        cbData->glInternalformat,
        +
        width, height,
        +
        cbData->numLayers == 0 ? (GLuint)depth : cbData->numLayers,
        +
        0,
        +
        cbData->glFormat, cbData->glType, pixels);
        +
        +
        if ((cbData->glError = glGetError()) == GL_NO_ERROR) {
        +
        return KTX_SUCCESS;
        +
        } else {
        +
        return KTX_GL_ERROR;
        +
        }
        +
        }
        +
        + +
        compressedTexImage3DCallback(int miplevel, int face,
        +
        int width, int height,
        +
        int depth,
        +
        ktx_uint64_t faceLodSize,
        +
        void* pixels, void* userdata)
        +
        {
        +
        ktx_cbdata* cbData = (ktx_cbdata*)userdata;
        +
        +
        if (faceLodSize > UINT32_MAX)
        +
        return KTX_INVALID_OPERATION; // Too big for OpenGL {,ES}.
        +
        +
        assert(gl.glCompressedTexImage3D != NULL);
        +
        gl.glCompressedTexImage3D(cbData->glTarget + face, miplevel,
        +
        cbData->glInternalformat,
        +
        width, height,
        +
        cbData->numLayers == 0 ? (GLuint)depth : cbData->numLayers,
        +
        0,
        +
        (ktx_uint32_t)faceLodSize, pixels);
        +
        +
        if ((cbData->glError = glGetError()) == GL_NO_ERROR) {
        +
        return KTX_SUCCESS;
        +
        } else {
        +
        return KTX_GL_ERROR;
        +
        }
        +
        }
        +

        This function creates the GL texture object and sets up the callbacks to load the image data into it.

        +
        ktxTexture_GLUploadPrivate(ktxTexture* This, ktx_glformatinfo* formatInfo,
        +
        GLuint* pTexture, GLenum* pTarget, GLenum* pGlerror)
        +
        {
        +
        GLuint texname;
        +
        GLenum target = GL_TEXTURE_2D;
        +
        int texnameUser;
        + +
        ktx_cbdata cbData;
        +
        PFNKTXITERCB iterCb = NULL;
        +
        int dimensions;
        +
        +
        if (pGlerror)
        +
        *pGlerror = GL_NO_ERROR;
        +
        +
        assert(This && pTarget);
        +
        +
        if (contextProfile == 0)
        +
        discoverContextCapabilities();
        +
        +
        texnameUser = pTexture && *pTexture;
        +
        if (texnameUser) {
        +
        texname = *pTexture;
        +
        } else {
        +
        glGenTextures(1, &texname);
        +
        }
        +
        +
        cbData.glFormat = formatInfo->glFormat;
        +
        cbData.glInternalformat = formatInfo->glInternalformat;
        +
        cbData.glType = formatInfo->glType;
        +
        +
        dimensions = This->numDimensions;
        +
        if (This->isArray) {
        +
        dimensions += 1;
        +
        if (This->numFaces == 6) {
        +
        /* ktxCheckHeader1_ should have caught this. */
        +
        assert(This->numDimensions == 2);
        +
        target = GL_TEXTURE_CUBE_MAP_ARRAY;
        +
        } else {
        +
        switch (This->numDimensions) {
        +
        case 1: target = GL_TEXTURE_1D_ARRAY; break;
        +
        case 2: target = GL_TEXTURE_2D_ARRAY; break;
        +
        /* _ktxCheckHeader should have caught this. */
        +
        default: assert(KTX_TRUE);
        +
        }
        +
        }
        +
        cbData.numLayers = This->numLayers;
        +
        } else {
        +
        if (This->numFaces == 6) {
        +
        /* ktxCheckHeader1_ should have caught this. */
        +
        assert(This->numDimensions == 2);
        +
        target = GL_TEXTURE_CUBE_MAP;
        +
        } else {
        +
        switch (This->numDimensions) {
        +
        case 1: target = GL_TEXTURE_1D; break;
        +
        case 2: target = GL_TEXTURE_2D; break;
        +
        case 3: target = GL_TEXTURE_3D; break;
        +
        /* _ktxCheckHeader shold have caught this. */
        +
        default: assert(KTX_TRUE);
        +
        }
        +
        }
        +
        cbData.numLayers = 0;
        +
        }
        +
        +
        if (target == GL_TEXTURE_1D &&
        +
        ((This->isCompressed && (gl.glCompressedTexImage1D == NULL)) ||
        +
        (!This->isCompressed && (gl.glTexImage1D == NULL))))
        +
        {
        + +
        }
        +
        +
        /* Reject 3D texture if unsupported. */
        +
        if (target == GL_TEXTURE_3D &&
        +
        ((This->isCompressed && (gl.glCompressedTexImage3D == NULL)) ||
        +
        (!This->isCompressed && (gl.glTexImage3D == NULL))))
        +
        {
        + +
        }
        +
        +
        /* Reject cube map arrays if not supported. */
        +
        if (target == GL_TEXTURE_CUBE_MAP_ARRAY && !supportsCubeMapArrays) {
        + +
        }
        +
        +
        /* XXX Need to reject other array textures & cube maps if not supported. */
        +
        +
        switch (dimensions) {
        +
        case 1:
        +
        iterCb = This->isCompressed
        +
        ? compressedTexImage1DCallback : texImage1DCallback;
        +
        break;
        +
        case 2:
        +
        iterCb = This->isCompressed
        +
        ? compressedTexImage2DCallback : texImage2DCallback;
        +
        break;
        +
        case 3:
        +
        iterCb = This->isCompressed
        +
        ? compressedTexImage3DCallback : texImage3DCallback;
        +
        break;
        +
        default:
        +
        assert(KTX_TRUE);
        +
        }
        +
        +
        glBindTexture(target, texname);
        +
        +
        // Prefer glGenerateMipmaps over GL_GENERATE_MIPMAP
        +
        if (This->generateMipmaps && (gl.glGenerateMipmap == NULL)) {
        +
        glTexParameteri(target, GL_GENERATE_MIPMAP, GL_TRUE);
        +
        }
        +
        +
        if (!This->generateMipmaps && supportsMaxLevel)
        +
        glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, This->numLevels - 1);
        +
        +
        if (target == GL_TEXTURE_CUBE_MAP) {
        +
        cbData.glTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
        +
        } else {
        +
        cbData.glTarget = target;
        +
        }
        +
        +
        if (!This->isCompressed) {
        +
        #if SUPPORT_LEGACY_FORMAT_CONVERSION
        +
        // If sized legacy formats are supported there is no need to convert.
        +
        // If only unsized formats are supported, there is no point in
        +
        // converting as the modern formats aren't supported either.
        +
        if (sizedFormats == _NON_LEGACY_FORMATS && supportsSwizzle) {
        +
        convertFormat(target, &cbData.glFormat, &cbData.glInternalformat);
        +
        } else if (sizedFormats == _NO_SIZED_FORMATS)
        +
        cbData.glInternalformat = formatInfo->glBaseInternalformat;
        +
        #else
        +
        // When no sized formats are supported, or legacy sized formats are not
        +
        // supported, must change internal format.
        +
        if (sizedFormats == _NO_SIZED_FORMATS
        +
        || (!(sizedFormats & _LEGACY_FORMATS) &&
        +
        (formatInfo->glBaseInternalformat == GL_ALPHA
        +
        || formatInfo->glBaseInternalformat == GL_LUMINANCE
        +
        || formatInfo->glBaseInternalformat == GL_LUMINANCE_ALPHA
        +
        || formatInfo->glBaseInternalformat == GL_INTENSITY))) {
        +
        cbData.glInternalformat = formatInfo->glBaseInternalformat;
        +
        }
        +
        #endif
        +
        }
        +
        +
        if (ktxTexture_isActiveStream(ktxTexture(This)))
        +
        result = ktxTexture_IterateLoadLevelFaces(This, iterCb, &cbData);
        +
        else
        +
        result = ktxTexture_IterateLevelFaces(This, iterCb, &cbData);
        +
        +
        /* GL errors are the only reason for failure. */
        +
        if (result != KTX_SUCCESS && cbData.glError != GL_NO_ERROR) {
        +
        if (pGlerror)
        +
        *pGlerror = cbData.glError;
        +
        }
        +
        +
        if (result == KTX_SUCCESS)
        +
        {
        +
        // Prefer glGenerateMipmaps over GL_GENERATE_MIPMAP
        +
        if (This->generateMipmaps && gl.glGenerateMipmap) {
        +
        gl.glGenerateMipmap(target);
        +
        }
        +
        *pTarget = target;
        +
        if (pTexture) {
        +
        *pTexture = texname;
        +
        }
        +
        } else if (!texnameUser) {
        +
        glDeleteTextures(1, &texname);
        +
        }
        +
        return result;
        +
        }
        +
        /* -*- tab-width: 4; -*- */
        +
        /* vi: set sw=2 ts=4 expandtab: */
        +
        +
        /*
        +
        * Copyright 2010-2020 Mark Callow.
        +
        * SPDX-License-Identifier: Apache-2.0
        +
        */
        +
        +
        /*
        +
        * @internal
        +
        * @file
        +
        * @~English
        +
        *
        +
        * @brief Functions for instantiating GL or GLES textures from KTX files.
        +
        *
        +
        * @author Georg Kolling, Imagination Technology
        +
        * @author Mark Callow, HI Corporation & Edgewise Consulting. github.com/MarkCallow
        +
        */
        +
        +
        #ifdef _WIN32
        +
        #define _CRT_SECURE_NO_WARNINGS
        +
        #endif
        +
        +
        #include <assert.h>
        +
        #include <string.h>
        +
        #include <stdint.h>
        +
        #include <stdlib.h>
        +
        +
        #include "gl_funcs.h"
        +
        #define SUPPORT_LEGACY_FORMAT_CONVERSION 0
        +
        // Legacy formats are not supported by libktx. Consider removing format conversion code.
        +
        #if SUPPORT_LEGACY_FORMAT_CONVERSION
        +
        // For legacy formats defined only in compatibility mode and as extensions.
        +
        #include "GL/glext.h"
        +
        #endif
        +
        +
        #include "ktx.h"
        +
        #include "ktxint.h"
        +
        #include "texture.h"
        +
        #include "vk2gl.h"
        +
        #include "unused.h"
        +
        +
        +
        /*
        +
        * These are defined only in compatibility mode (gl.h) not glcorearb.h
        +
        */
        +
        #if !defined( GL_LUMINANCE )
        +
        #define GL_LUMINANCE 0x1909 // deprecated
        +
        #endif
        +
        #if !defined( GL_LUMINANCE_ALPHA )
        +
        #define GL_LUMINANCE_ALPHA 0x190A // deprecated
        +
        #endif
        +
        #if !defined( GL_INTENSITY )
        +
        #define GL_INTENSITY 0x8049 // deprecated
        +
        #endif
        +
        +
        /*
        +
        * N.B. As of Doxygen 1.9.6 non-class members must use fully qualified
        +
        * names with @ref and @copy* references to classes. This means prefixing
        +
        * a reference with the name of the (pseudo-)class of which it is a member.
        +
        * We use @memberof to improve the index and toc for the doc for our
        +
        * pseudo classes so we need to prefix. Since we don't want, e.g.,
        +
        * ktxTexture1::ktxTexture1_GLUpload appearing in the documentation we have
        +
        * to explicitly provide the link text making references very long-winded.
        +
        * Sigh!
        +
        */
        +
        +
        +
        #define GL_GENERATE_MIPMAP 0x8191
        +
        +
        #define _CONTEXT_ES_PROFILE_BIT 0x4
        +
        +
        #define _NON_LEGACY_FORMATS 0x1 /*< @internal Non-legacy sized formats are supported. */
        +
        #define _LEGACY_FORMATS 0x2 /*< @internal Legacy sized formats are supported. */
        +
        #define _ALL_SIZED_FORMATS (_NON_LEGACY_FORMATS | _LEGACY_FORMATS)
        +
        #define _NO_SIZED_FORMATS 0 /*< @internal No sized formats are supported. */
        +
        +
        static GLint contextProfile = 0;
        +
        static GLint sizedFormats = _ALL_SIZED_FORMATS;
        +
        static GLboolean supportsSwizzle = GL_TRUE;
        +
        static GLint R16Formats = _KTX_ALL_R16_FORMATS;
        +
        static GLboolean supportsSRGB = GL_TRUE;
        +
        static GLboolean supportsCubeMapArrays = GL_FALSE;
        +
        +
        static GLboolean supportsMaxLevel = GL_FALSE;
        +
        +
        static GLboolean
        +
        hasExtension(const char* extension)
        +
        {
        +
        if (gl.glGetStringi == NULL) {
        +
        if (strstr(glGetString(GL_EXTENSIONS), extension) != NULL) {
        +
        return GL_TRUE;
        +
        } else {
        +
        return GL_FALSE;
        +
        }
        +
        } else {
        +
        int i, n;
        +
        +
        glGetIntegerv(GL_NUM_EXTENSIONS, &n);
        +
        for (i = 0; i < n; i++) {
        +
        if (strcmp((const char*)gl.glGetStringi(GL_EXTENSIONS, i), extension) == 0)
        +
        return GL_TRUE;
        +
        }
        +
        return GL_FALSE;
        +
        }
        +
        }
        +
        +
        static void
        +
        discoverContextCapabilities(void)
        +
        {
        +
        GLint majorVersion = 1;
        +
        GLint minorVersion = 0;
        +
        +
        if (strstr(glGetString(GL_VERSION), "GL ES") != NULL)
        +
        contextProfile = _CONTEXT_ES_PROFILE_BIT;
        +
        // MAJOR & MINOR only introduced in GL {,ES} 3.0
        +
        glGetIntegerv(GL_MAJOR_VERSION, &majorVersion);
        +
        glGetIntegerv(GL_MINOR_VERSION, &minorVersion);
        +
        if (glGetError() != GL_NO_ERROR) {
        +
        // < v3.0; resort to the old-fashioned way.
        +
        if (contextProfile & _CONTEXT_ES_PROFILE_BIT)
        +
        sscanf(glGetString(GL_VERSION), "OpenGL ES %d.%d ",
        +
        &majorVersion, &minorVersion);
        +
        else
        +
        sscanf(glGetString(GL_VERSION), "OpenGL %d.%d ",
        +
        &majorVersion, &minorVersion);
        +
        }
        +
        if (contextProfile & _CONTEXT_ES_PROFILE_BIT) {
        +
        if (majorVersion < 3) {
        +
        supportsSwizzle = GL_FALSE;
        +
        sizedFormats = _NO_SIZED_FORMATS;
        +
        R16Formats = _KTX_NO_R16_FORMATS;
        +
        supportsSRGB = GL_FALSE;
        +
        // These things could be found by dlsym when, e.g. the same driver
        +
        // supports ES1, ES2 and ES3. For all but Tex*3D, there's no
        +
        // corresponding extension whose presence we could check. Just zero
        +
        // the pointers to prevent use.
        +
        gl.glGetStringi = NULL;
        +
        gl.glCompressedTexImage1D = NULL;
        +
        gl.glTexStorage1D = NULL;
        +
        gl.glTexStorage2D = NULL;
        +
        gl.glTexStorage3D = NULL;
        +
        if (!hasExtension("GL_OES_texture_3D")) {
        +
        gl.glCompressedTexImage3D = NULL;
        +
        gl.glCompressedTexSubImage3D = NULL;
        +
        gl.glTexImage3D = NULL;
        +
        gl.glTexSubImage3D = NULL;
        +
        }
        +
        if (majorVersion < 2)
        +
        gl.glGenerateMipmap = NULL;
        +
        +
        } else {
        +
        sizedFormats = _NON_LEGACY_FORMATS;
        +
        if (hasExtension("GL_EXT_texture_cube_map_array")) {
        +
        supportsCubeMapArrays = GL_TRUE;
        +
        }
        +
        supportsMaxLevel = GL_TRUE;
        +
        }
        +
        if (hasExtension("GL_OES_required_internalformat")) {
        +
        sizedFormats |= _ALL_SIZED_FORMATS;
        +
        }
        +
        // There are no OES extensions for sRGB textures or R16 formats.
        +
        } else {
        +
        // PROFILE_MASK was introduced in OpenGL 3.2.
        +
        // Profiles: CONTEXT_CORE_PROFILE_BIT 0x1,
        +
        // CONTEXT_COMPATIBILITY_PROFILE_BIT 0x2.
        +
        glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &contextProfile);
        +
        if (glGetError() == GL_NO_ERROR) {
        +
        // >= 3.2
        +
        if (majorVersion == 3 && minorVersion < 3)
        +
        supportsSwizzle = GL_FALSE;
        +
        if ((contextProfile & GL_CONTEXT_CORE_PROFILE_BIT))
        +
        sizedFormats &= ~_LEGACY_FORMATS;
        +
        if (majorVersion >= 4)
        +
        supportsCubeMapArrays = GL_TRUE;
        +
        supportsMaxLevel = GL_TRUE;
        +
        } else {
        +
        // < 3.2
        +
        contextProfile = GL_CONTEXT_COMPATIBILITY_PROFILE_BIT;
        +
        supportsSwizzle = GL_FALSE;
        +
        // sRGB textures introduced in 2.0
        +
        if (majorVersion < 2 && !hasExtension("GL_EXT_texture_sRGB")) {
        +
        supportsSRGB = GL_FALSE;
        +
        }
        +
        // R{,G]16 introduced in 3.0; R{,G}16_SNORM introduced in 3.1.
        +
        if (majorVersion == 3) {
        +
        if (minorVersion == 0)
        +
        R16Formats &= ~_KTX_R16_FORMATS_SNORM;
        +
        if (minorVersion < 1) {
        +
        if (hasExtension("GL_ARB_texture_query_levels"))
        +
        supportsMaxLevel = GL_TRUE;
        +
        } else {
        +
        supportsMaxLevel = GL_TRUE;
        +
        }
        +
        } else if (hasExtension("GL_ARB_texture_rg")) {
        +
        R16Formats &= ~_KTX_R16_FORMATS_SNORM;
        +
        } else {
        +
        R16Formats = _KTX_NO_R16_FORMATS;
        +
        }
        +
        }
        +
        if (!supportsCubeMapArrays) {
        +
        if (hasExtension("GL_ARB_texture_cube_map_array")) {
        +
        supportsCubeMapArrays = GL_TRUE;
        +
        }
        +
        }
        +
        }
        +
        }
        +
        +
        #if SUPPORT_LEGACY_FORMAT_CONVERSION
        +
        static void convertFormat(GLenum target, GLenum* pFormat, GLenum* pInternalformat) {
        +
        switch (*pFormat) {
        +
        case GL_ALPHA:
        +
        {
        +
        GLint swizzle[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED};
        +
        *pFormat = GL_RED;
        +
        glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
        +
        switch (*pInternalformat) {
        +
        case GL_ALPHA:
        +
        case GL_ALPHA4_EXT:
        +
        case GL_ALPHA8_EXT:
        +
        *pInternalformat = GL_R8;
        +
        break;
        +
        case GL_ALPHA12_EXT:
        +
        case GL_ALPHA16_EXT:
        +
        *pInternalformat = GL_R16;
        +
        break;
        +
        }
        +
        }
        +
        case GL_LUMINANCE:
        +
        {
        +
        GLint swizzle[] = {GL_RED, GL_RED, GL_RED, GL_ONE};
        +
        *pFormat = GL_RED;
        +
        glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
        +
        switch (*pInternalformat) {
        +
        case GL_LUMINANCE:
        +
        case GL_LUMINANCE4_EXT:
        +
        case GL_LUMINANCE8_EXT:
        +
        *pInternalformat = GL_R8;
        +
        break;
        +
        case GL_LUMINANCE12_EXT:
        +
        case GL_LUMINANCE16_EXT:
        +
        *pInternalformat = GL_R16;
        +
        break;
        +
        #if 0
        +
        // XXX Must avoid setting TEXTURE_SWIZZLE in these cases
        +
        // XXX Must manually swizzle.
        +
        case GL_SLUMINANCE:
        +
        case GL_SLUMINANCE8:
        +
        *pInternalformat = GL_SRGB8;
        +
        break;
        +
        #endif
        +
        }
        +
        break;
        +
        }
        +
        case GL_LUMINANCE_ALPHA:
        +
        {
        +
        GLint swizzle[] = {GL_RED, GL_RED, GL_RED, GL_GREEN};
        +
        *pFormat = GL_RG;
        +
        glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
        +
        switch (*pInternalformat) {
        +
        case GL_LUMINANCE_ALPHA:
        +
        case GL_LUMINANCE4_ALPHA4_EXT:
        +
        case GL_LUMINANCE6_ALPHA2_EXT:
        +
        case GL_LUMINANCE8_ALPHA8_EXT:
        +
        *pInternalformat = GL_RG8;
        +
        break;
        +
        case GL_LUMINANCE12_ALPHA4_EXT:
        +
        case GL_LUMINANCE12_ALPHA12_EXT:
        +
        case GL_LUMINANCE16_ALPHA16_EXT:
        +
        *pInternalformat = GL_RG16;
        +
        break;
        +
        #if 0
        +
        // XXX Must avoid setting TEXTURE_SWIZZLE in these cases
        +
        // XXX Must manually swizzle.
        +
        case GL_SLUMINANCE_ALPHA_EXT:
        +
        case GL_SLUMINANCE8_ALPHA8_EXT:
        +
        *pInternalformat = GL_SRGB8_ALPHA8;
        +
        break;
        +
        #endif
        +
        }
        +
        break;
        +
        }
        +
        case GL_INTENSITY:
        +
        {
        +
        GLint swizzle[] = {GL_RED, GL_RED, GL_RED, GL_RED};
        +
        *pFormat = GL_RED;
        +
        glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
        +
        switch (*pInternalformat) {
        +
        case GL_INTENSITY:
        +
        case GL_INTENSITY4_EXT:
        +
        case GL_INTENSITY8_EXT:
        +
        *pInternalformat = GL_R8;
        +
        break;
        +
        case GL_INTENSITY12_EXT:
        +
        case GL_INTENSITY16_EXT:
        +
        *pInternalformat = GL_R16;
        +
        break;
        +
        }
        +
        break;
        +
        }
        +
        default:
        +
        break;
        +
        }
        +
        }
        +
        #endif /* SUPPORT_LEGACY_FORMAT_CONVERSION */
        +
        +
        typedef struct ktx_glformatinfo {
        +
        ktx_uint32_t glFormat;
        +
        ktx_uint32_t glInternalformat;
        +
        ktx_uint32_t glBaseInternalformat;
        +
        ktx_uint32_t glType;
        +
        } ktx_glformatinfo;
        +
        +
        /* [cbdata] */
        +
        typedef struct ktx_cbdata {
        +
        GLenum glTarget;
        +
        GLenum glFormat;
        +
        GLenum glInternalformat;
        +
        GLenum glType;
        +
        GLenum glError;
        +
        GLuint numLayers;
        +
        } ktx_cbdata;
        +
        /* [cbdata] */
        +
        +
        /* [imageCallbacks] */
        +
        + +
        texImage1DCallback(int miplevel, int face,
        +
        int width, int height,
        +
        int depth,
        +
        ktx_uint64_t faceLodSize,
        +
        void* pixels, void* userdata)
        +
        {
        +
        ktx_cbdata* cbData = (ktx_cbdata*)userdata;
        +
        UNUSED(faceLodSize);
        +
        UNUSED(depth);
        +
        UNUSED(height);
        +
        +
        assert(gl.glTexImage1D != NULL);
        +
        gl.glTexImage1D(cbData->glTarget + face, miplevel,
        +
        cbData->glInternalformat, width, 0,
        +
        cbData->glFormat, cbData->glType, pixels);
        +
        +
        if ((cbData->glError = glGetError()) == GL_NO_ERROR) {
        +
        return KTX_SUCCESS;
        +
        } else {
        +
        return KTX_GL_ERROR;
        +
        }
        +
        }
        +
        + +
        compressedTexImage1DCallback(int miplevel, int face,
        +
        int width, int height,
        +
        int depth,
        +
        ktx_uint64_t faceLodSize,
        +
        void* pixels, void* userdata)
        +
        {
        +
        ktx_cbdata* cbData = (ktx_cbdata*)userdata;
        +
        UNUSED(depth);
        +
        UNUSED(height);
        +
        +
        if (faceLodSize > UINT32_MAX)
        +
        return KTX_INVALID_OPERATION; // Too big for OpenGL {,ES}.
        +
        +
        assert(gl.glCompressedTexImage1D != NULL);
        +
        gl.glCompressedTexImage1D(cbData->glTarget + face, miplevel,
        +
        cbData->glInternalformat, width, 0,
        +
        (ktx_uint32_t)faceLodSize, pixels);
        +
        +
        if ((cbData->glError = glGetError()) == GL_NO_ERROR) {
        +
        return KTX_SUCCESS;
        +
        } else {
        +
        return KTX_GL_ERROR;
        +
        }
        +
        }
        +
        + +
        texImage2DCallback(int miplevel, int face,
        +
        int width, int height,
        +
        int depth,
        +
        ktx_uint64_t faceLodSize,
        +
        void* pixels, void* userdata)
        +
        {
        +
        ktx_cbdata* cbData = (ktx_cbdata*)userdata;
        +
        UNUSED(depth);
        +
        UNUSED(faceLodSize);
        +
        +
        glTexImage2D(cbData->glTarget + face, miplevel,
        +
        cbData->glInternalformat, width,
        +
        cbData->numLayers == 0 ? (GLuint)height : cbData->numLayers, 0,
        +
        cbData->glFormat, cbData->glType, pixels);
        +
        +
        if ((cbData->glError = glGetError()) == GL_NO_ERROR) {
        +
        return KTX_SUCCESS;
        +
        } else {
        +
        return KTX_GL_ERROR;
        +
        }
        +
        }
        +
        +
        + +
        compressedTexImage2DCallback(int miplevel, int face,
        +
        int width, int height,
        +
        int depth,
        +
        ktx_uint64_t faceLodSize,
        +
        void* pixels, void* userdata)
        +
        {
        +
        ktx_cbdata* cbData = (ktx_cbdata*)userdata;
        +
        GLenum glerror;
        + +
        UNUSED(depth);
        +
        +
        if (faceLodSize > UINT32_MAX)
        +
        return KTX_INVALID_OPERATION; // Too big for OpenGL {,ES}.
        +
        +
        // It is simpler to just attempt to load the format, rather than divine
        +
        // which formats are supported by the implementation. In the event of an
        +
        // error, software unpacking can be attempted.
        +
        glCompressedTexImage2D(cbData->glTarget + face, miplevel,
        +
        cbData->glInternalformat, width,
        +
        cbData->numLayers == 0 ? (GLuint)height : cbData->numLayers,
        +
        0,
        +
        (ktx_uint32_t)faceLodSize, pixels);
        +
        +
        glerror = glGetError();
        +
        #if SUPPORT_SOFTWARE_ETC_UNPACK
        +
        // Renderion is returning INVALID_VALUE. Oops!!
        +
        if ((glerror == GL_INVALID_ENUM || glerror == GL_INVALID_VALUE)
        +
        && (cbData->glInternalformat == GL_ETC1_RGB8_OES
        +
        || (cbData->glInternalformat >= GL_COMPRESSED_R11_EAC
        +
        && cbData->glInternalformat <= GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC)
        +
        ))
        +
        {
        +
        GLubyte* unpacked;
        +
        GLenum format, internalformat, type;
        +
        +
        result = _ktxUnpackETC((GLubyte*)pixels, cbData->glInternalformat,
        +
        width, height, &unpacked,
        +
        &format, &internalformat,
        +
        &type, R16Formats, supportsSRGB);
        +
        if (result != KTX_SUCCESS) {
        +
        return result;
        +
        }
        +
        if (!(sizedFormats & _NON_LEGACY_FORMATS)) {
        +
        if (internalformat == GL_RGB8)
        +
        internalformat = GL_RGB;
        +
        else if (internalformat == GL_RGBA8)
        +
        internalformat = GL_RGBA;
        +
        }
        +
        glTexImage2D(cbData->glTarget + face, miplevel,
        +
        internalformat, width,
        +
        cbData->numLayers == 0 ? (GLuint)height : cbData->numLayers, 0,
        +
        format, type, unpacked);
        +
        +
        free(unpacked);
        +
        glerror = glGetError();
        +
        }
        +
        #endif
        +
        +
        if ((cbData->glError = glerror) == GL_NO_ERROR) {
        +
        return KTX_SUCCESS;
        +
        } else {
        +
        return KTX_GL_ERROR;
        +
        }
        +
        }
        +
        + +
        texImage3DCallback(int miplevel, int face,
        +
        int width, int height,
        +
        int depth,
        +
        ktx_uint64_t faceLodSize,
        +
        void* pixels, void* userdata)
        +
        {
        +
        ktx_cbdata* cbData = (ktx_cbdata*)userdata;
        +
        UNUSED(faceLodSize);
        +
        +
        assert(gl.glTexImage3D != NULL);
        +
        gl.glTexImage3D(cbData->glTarget + face, miplevel,
        +
        cbData->glInternalformat,
        +
        width, height,
        +
        cbData->numLayers == 0 ? (GLuint)depth : cbData->numLayers,
        +
        0,
        +
        cbData->glFormat, cbData->glType, pixels);
        +
        +
        if ((cbData->glError = glGetError()) == GL_NO_ERROR) {
        +
        return KTX_SUCCESS;
        +
        } else {
        +
        return KTX_GL_ERROR;
        +
        }
        +
        }
        +
        + +
        compressedTexImage3DCallback(int miplevel, int face,
        +
        int width, int height,
        +
        int depth,
        +
        ktx_uint64_t faceLodSize,
        +
        void* pixels, void* userdata)
        +
        {
        +
        ktx_cbdata* cbData = (ktx_cbdata*)userdata;
        +
        +
        if (faceLodSize > UINT32_MAX)
        +
        return KTX_INVALID_OPERATION; // Too big for OpenGL {,ES}.
        +
        +
        assert(gl.glCompressedTexImage3D != NULL);
        +
        gl.glCompressedTexImage3D(cbData->glTarget + face, miplevel,
        +
        cbData->glInternalformat,
        +
        width, height,
        +
        cbData->numLayers == 0 ? (GLuint)depth : cbData->numLayers,
        +
        0,
        +
        (ktx_uint32_t)faceLodSize, pixels);
        +
        +
        if ((cbData->glError = glGetError()) == GL_NO_ERROR) {
        +
        return KTX_SUCCESS;
        +
        } else {
        +
        return KTX_GL_ERROR;
        +
        }
        +
        }
        +
        /* [imageCallbacks] */
        +
        +
        /* [loadGLTexture] */
        + +
        ktxTexture_GLUploadPrivate(ktxTexture* This, ktx_glformatinfo* formatInfo,
        +
        GLuint* pTexture, GLenum* pTarget, GLenum* pGlerror)
        +
        {
        +
        GLuint texname;
        +
        GLenum target = GL_TEXTURE_2D;
        +
        int texnameUser;
        + +
        ktx_cbdata cbData;
        +
        PFNKTXITERCB iterCb = NULL;
        +
        int dimensions;
        +
        +
        if (pGlerror)
        +
        *pGlerror = GL_NO_ERROR;
        +
        +
        assert(This && pTarget);
        +
        +
        if (contextProfile == 0)
        +
        discoverContextCapabilities();
        +
        +
        texnameUser = pTexture && *pTexture;
        +
        if (texnameUser) {
        +
        texname = *pTexture;
        +
        } else {
        +
        glGenTextures(1, &texname);
        +
        }
        +
        +
        cbData.glFormat = formatInfo->glFormat;
        +
        cbData.glInternalformat = formatInfo->glInternalformat;
        +
        cbData.glType = formatInfo->glType;
        +
        +
        dimensions = This->numDimensions;
        +
        if (This->isArray) {
        +
        dimensions += 1;
        +
        if (This->numFaces == 6) {
        +
        /* ktxCheckHeader1_ should have caught this. */
        +
        assert(This->numDimensions == 2);
        +
        target = GL_TEXTURE_CUBE_MAP_ARRAY;
        +
        } else {
        +
        switch (This->numDimensions) {
        +
        case 1: target = GL_TEXTURE_1D_ARRAY; break;
        +
        case 2: target = GL_TEXTURE_2D_ARRAY; break;
        +
        /* _ktxCheckHeader should have caught this. */
        +
        default: assert(KTX_TRUE);
        +
        }
        +
        }
        +
        cbData.numLayers = This->numLayers;
        +
        } else {
        +
        if (This->numFaces == 6) {
        +
        /* ktxCheckHeader1_ should have caught this. */
        +
        assert(This->numDimensions == 2);
        +
        target = GL_TEXTURE_CUBE_MAP;
        +
        } else {
        +
        switch (This->numDimensions) {
        +
        case 1: target = GL_TEXTURE_1D; break;
        +
        case 2: target = GL_TEXTURE_2D; break;
        +
        case 3: target = GL_TEXTURE_3D; break;
        +
        /* _ktxCheckHeader shold have caught this. */
        +
        default: assert(KTX_TRUE);
        +
        }
        +
        }
        +
        cbData.numLayers = 0;
        +
        }
        +
        +
        if (target == GL_TEXTURE_1D &&
        +
        ((This->isCompressed && (gl.glCompressedTexImage1D == NULL)) ||
        +
        (!This->isCompressed && (gl.glTexImage1D == NULL))))
        +
        {
        + +
        }
        +
        +
        /* Reject 3D texture if unsupported. */
        +
        if (target == GL_TEXTURE_3D &&
        +
        ((This->isCompressed && (gl.glCompressedTexImage3D == NULL)) ||
        +
        (!This->isCompressed && (gl.glTexImage3D == NULL))))
        +
        {
        + +
        }
        +
        +
        /* Reject cube map arrays if not supported. */
        +
        if (target == GL_TEXTURE_CUBE_MAP_ARRAY && !supportsCubeMapArrays) {
        + +
        }
        +
        +
        /* XXX Need to reject other array textures & cube maps if not supported. */
        +
        +
        switch (dimensions) {
        +
        case 1:
        +
        iterCb = This->isCompressed
        +
        ? compressedTexImage1DCallback : texImage1DCallback;
        +
        break;
        +
        case 2:
        +
        iterCb = This->isCompressed
        +
        ? compressedTexImage2DCallback : texImage2DCallback;
        +
        break;
        +
        case 3:
        +
        iterCb = This->isCompressed
        +
        ? compressedTexImage3DCallback : texImage3DCallback;
        +
        break;
        +
        default:
        +
        assert(KTX_TRUE);
        +
        }
        +
        +
        glBindTexture(target, texname);
        +
        +
        // Prefer glGenerateMipmaps over GL_GENERATE_MIPMAP
        +
        if (This->generateMipmaps && (gl.glGenerateMipmap == NULL)) {
        +
        glTexParameteri(target, GL_GENERATE_MIPMAP, GL_TRUE);
        +
        }
        +
        +
        if (!This->generateMipmaps && supportsMaxLevel)
        +
        glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, This->numLevels - 1);
        +
        +
        if (target == GL_TEXTURE_CUBE_MAP) {
        +
        cbData.glTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
        +
        } else {
        +
        cbData.glTarget = target;
        +
        }
        +
        +
        if (!This->isCompressed) {
        +
        #if SUPPORT_LEGACY_FORMAT_CONVERSION
        +
        // If sized legacy formats are supported there is no need to convert.
        +
        // If only unsized formats are supported, there is no point in
        +
        // converting as the modern formats aren't supported either.
        +
        if (sizedFormats == _NON_LEGACY_FORMATS && supportsSwizzle) {
        +
        convertFormat(target, &cbData.glFormat, &cbData.glInternalformat);
        +
        } else if (sizedFormats == _NO_SIZED_FORMATS)
        +
        cbData.glInternalformat = formatInfo->glBaseInternalformat;
        +
        #else
        +
        // When no sized formats are supported, or legacy sized formats are not
        +
        // supported, must change internal format.
        +
        if (sizedFormats == _NO_SIZED_FORMATS
        +
        || (!(sizedFormats & _LEGACY_FORMATS) &&
        +
        (formatInfo->glBaseInternalformat == GL_ALPHA
        +
        || formatInfo->glBaseInternalformat == GL_LUMINANCE
        +
        || formatInfo->glBaseInternalformat == GL_LUMINANCE_ALPHA
        +
        || formatInfo->glBaseInternalformat == GL_INTENSITY))) {
        +
        cbData.glInternalformat = formatInfo->glBaseInternalformat;
        +
        }
        +
        #endif
        +
        }
        +
        +
        if (ktxTexture_isActiveStream(ktxTexture(This)))
        +
        result = ktxTexture_IterateLoadLevelFaces(This, iterCb, &cbData);
        +
        else
        +
        result = ktxTexture_IterateLevelFaces(This, iterCb, &cbData);
        +
        +
        /* GL errors are the only reason for failure. */
        +
        if (result != KTX_SUCCESS && cbData.glError != GL_NO_ERROR) {
        +
        if (pGlerror)
        +
        *pGlerror = cbData.glError;
        +
        }
        +
        +
        if (result == KTX_SUCCESS)
        +
        {
        +
        // Prefer glGenerateMipmaps over GL_GENERATE_MIPMAP
        +
        if (This->generateMipmaps && gl.glGenerateMipmap) {
        +
        gl.glGenerateMipmap(target);
        +
        }
        +
        *pTarget = target;
        +
        if (pTexture) {
        +
        *pTexture = texname;
        +
        }
        +
        } else if (!texnameUser) {
        +
        glDeleteTextures(1, &texname);
        +
        }
        +
        return result;
        +
        }
        +
        /* [loadGLTexture] */
        +
        + +
        ktxTexture1_GLUpload(ktxTexture1* This, GLuint* pTexture, GLenum* pTarget,
        +
        GLenum* pGlerror)
        +
        {
        +
        GLint previousUnpackAlignment;
        + +
        ktx_glformatinfo formatInfo;
        +
        +
        if (!This) {
        + +
        }
        +
        +
        if (!pTarget) {
        + +
        }
        +
        +
        result = ktxLoadOpenGL(NULL);
        +
        if (result != KTX_SUCCESS) {
        +
        return result;
        +
        }
        +
        /* KTX 1 files require an unpack alignment of 4 */
        +
        glGetIntegerv(GL_UNPACK_ALIGNMENT, &previousUnpackAlignment);
        +
        if (previousUnpackAlignment != KTX_GL_UNPACK_ALIGNMENT) {
        +
        glPixelStorei(GL_UNPACK_ALIGNMENT, KTX_GL_UNPACK_ALIGNMENT);
        +
        }
        +
        +
        formatInfo.glFormat = This->glFormat;
        +
        formatInfo.glInternalformat = This->glInternalformat;
        +
        formatInfo.glBaseInternalformat = This->glBaseInternalformat;
        +
        formatInfo.glType = This->glType;
        +
        +
        result = ktxTexture_GLUploadPrivate(ktxTexture(This), &formatInfo,
        +
        pTexture, pTarget, pGlerror);
        +
        +
        /* restore previous GL state */
        +
        if (previousUnpackAlignment != KTX_GL_UNPACK_ALIGNMENT) {
        +
        glPixelStorei(GL_UNPACK_ALIGNMENT, previousUnpackAlignment);
        +
        }
        +
        +
        return result;
        +
        }
        +
        + +
        ktxTexture2_GLUpload(ktxTexture2* This, GLuint* pTexture, GLenum* pTarget,
        +
        GLenum* pGlerror)
        +
        {
        +
        GLint previousUnpackAlignment;
        + +
        ktx_glformatinfo formatInfo;
        +
        +
        if (!This) {
        + +
        }
        +
        +
        if (!pTarget) {
        + +
        }
        +
        +
        result = ktxLoadOpenGL(NULL);
        +
        if (result != KTX_SUCCESS) {
        +
        return result;
        +
        }
        +
        +
        if (This->vkFormat != VK_FORMAT_UNDEFINED) {
        +
        formatInfo.glInternalformat =
        +
        vkFormat2glInternalFormat(This->vkFormat);
        +
        if (formatInfo.glInternalformat == GL_INVALID_VALUE) {
        +
        // TODO Check for mapping metadata. If none
        + +
        }
        +
        } else {
        +
        // TODO: Check DFD for ASTC HDR or 3D or RGB[DEM] and figure out format.
        +
        return KTX_INVALID_OPERATION; // BasisU textures must be transcoded
        +
        // before upload.
        +
        }
        +
        +
        if (This->isCompressed) {
        +
        /* Unused. */
        +
        formatInfo.glFormat = GL_INVALID_VALUE;
        +
        formatInfo.glType = GL_INVALID_VALUE;
        +
        formatInfo.glBaseInternalformat = GL_INVALID_VALUE;
        +
        } else {
        +
        formatInfo.glFormat = vkFormat2glFormat(This->vkFormat);
        +
        formatInfo.glType = vkFormat2glType(This->vkFormat);
        +
        formatInfo.glBaseInternalformat = formatInfo.glInternalformat;
        +
        +
        if (formatInfo.glFormat == GL_INVALID_VALUE || formatInfo.glType == GL_INVALID_VALUE)
        + +
        }
        +
        /* KTX 2 files require an unpack alignment of 1. OGL default is 4. */
        +
        glGetIntegerv(GL_UNPACK_ALIGNMENT, &previousUnpackAlignment);
        +
        if (previousUnpackAlignment != 1) {
        +
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        +
        }
        +
        +
        result = ktxTexture_GLUploadPrivate(ktxTexture(This), &formatInfo,
        +
        pTexture, pTarget, pGlerror);
        +
        +
        /* restore previous GL state */
        +
        if (previousUnpackAlignment != 1) {
        +
        glPixelStorei(GL_UNPACK_ALIGNMENT, previousUnpackAlignment);
        +
        }
        +
        +
        return result;
        +
        }
        +
        + +
        ktxTexture_GLUpload(ktxTexture* This, GLuint* pTexture, GLenum* pTarget,
        +
        GLenum* pGlerror)
        +
        {
        +
        if (This->classId == ktxTexture2_c)
        +
        return ktxTexture2_GLUpload((ktxTexture2*)This, pTexture, pTarget,
        +
        pGlerror);
        +
        else
        +
        return ktxTexture1_GLUpload((ktxTexture1*)This, pTexture, pTarget,
        +
        pGlerror);
        +
        }
        +
        +
        KTX_API KTX_error_code KTX_APIENTRY ktxLoadOpenGL(PFNGLGETPROCADDRESS pfnGLGetProcAddress)
        Load pointers for the GL functions used by the ktxTexture*_GLUpload functions.
        Definition gl_funcs.c:216
        +
        ktx_error_code_e
        Error codes returned by library functions.
        Definition ktx.h:169
        +
        @ KTX_INVALID_VALUE
        Definition ktx.h:181
        +
        @ KTX_GL_ERROR
        Definition ktx.h:179
        +
        @ KTX_UNSUPPORTED_TEXTURE_TYPE
        Definition ktx.h:186
        +
        @ KTX_INVALID_OPERATION
        Definition ktx.h:180
        +
        @ KTX_SUCCESS
        Definition ktx.h:170
        +
        #define KTX_error_code
        For backward compatibility.
        Definition ktx.h:198
        +
        #define KTX_GL_UNPACK_ALIGNMENT
        Required unpack alignment.
        Definition ktx.h:159
        +
        #define ktxTexture_IterateLoadLevelFaces(This, iterCb, userdata)
        Helper for calling the IterateLoadLevelFaces virtual method of a ktxTexture.
        Definition ktx.h:585
        +
        Class representing a KTX version 1 format texture.
        Definition ktx.h:667
        +
        ktx_uint32_t glFormat
        Definition ktx.h:669
        +
        ktx_uint32_t glInternalformat
        Definition ktx.h:670
        +
        ktx_uint32_t glBaseInternalformat
        Definition ktx.h:672
        +
        ktx_uint32_t glType
        Definition ktx.h:674
        +
        Class representing a KTX version 2 format texture.
        Definition ktx.h:706
        +
        Base class representing a texture.
        Definition ktx.h:287
        +
        class_id classId
        Identify the class type.
        Definition ktx.h:288
        +
        ktx_bool_t isCompressed
        Definition ktx.h:288
        +
        ktx_uint32_t numFaces
        Number of faces: 6 for cube maps, 1 otherwise.
        Definition ktx.h:288
        +
        ktx_uint32_t numDimensions
        Number of dimensions in the texture: 1, 2 or 3.
        Definition ktx.h:288
        +
        ktx_uint32_t numLevels
        Number of mip levels in the texture.
        Definition ktx.h:288
        +
        ktx_bool_t isArray
        Definition ktx.h:288
        +
        ktx_bool_t generateMipmaps
        Definition ktx.h:288
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/globals.html b/ktx/build/docs/html/libktx/globals.html new file mode 100644 index 0000000..9749a5a --- /dev/null +++ b/ktx/build/docs/html/libktx/globals.html @@ -0,0 +1,312 @@ + + + + + + + +libktx Reference: Globals + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
        + +

        - a -

          +
        • KTX_ANIMDATA_KEY : ktx.h
        • +
        • ktxAstcParams : ktx.h
        • +
        + + +

        - b -

          +
        • ktxBasisParams : ktx.h
        • +
        • ktxBUImageFlagsBitString() : strings.c
        • +
        + + +

        - d -

          +
        • KTX_DECOMPRESS_CHECKSUM_ERROR : ktx.h
        • +
        • KTX_DECOMPRESS_LENGTH_ERROR : ktx.h
        • +
        + + +

        - e -

        + + +

        - f -

          +
        • KTX_FILE_DATA_ERROR : ktx.h
        • +
        • KTX_FILE_ISPIPE : ktx.h
        • +
        • KTX_FILE_OPEN_FAILED : ktx.h
        • +
        • KTX_FILE_OVERFLOW : ktx.h
        • +
        • KTX_FILE_READ_ERROR : ktx.h
        • +
        • KTX_FILE_SEEK_ERROR : ktx.h
        • +
        • KTX_FILE_UNEXPECTED_EOF : ktx.h
        • +
        • KTX_FILE_WRITE_ERROR : ktx.h
        • +
        • ktxFileStream_construct() : filestream.c
        • +
        • ktxFileStream_destruct() : filestream.c
        • +
        + + +

        - g -

          +
        • KTX_GL_ERROR : ktx.h
        • +
        • KTX_GL_UNPACK_ALIGNMENT : ktx.h
        • +
        + + +

        - i -

          +
        • KTX_INVALID_OPERATION : ktx.h
        • +
        • KTX_INVALID_VALUE : ktx.h
        • +
        + + +

        - l -

          +
        • KTX_LIBRARY_NOT_LINKED : ktx.h
        • +
        • ktxLoadOpenGL() : ktx.h
        • +
        + + +

        - m -

        + + +

        - n -

          +
        • KTX_NOT_FOUND : ktx.h
        • +
        + + +

        - o -

          +
        • KTX_ORIENTATION1_FMT : ktx.h
        • +
        • KTX_ORIENTATION2_FMT : ktx.h
        • +
        • KTX_ORIENTATION3_FMT : ktx.h
        • +
        • KTX_ORIENTATION_KEY : ktx.h
        • +
        • KTX_OUT_OF_MEMORY : ktx.h
        • +
        + + +

        - p -

          +
        • ktx_pack_astc_block_dimension_e : ktx.h
        • +
        • KTX_PACK_ASTC_BLOCK_DIMENSION_MAX : ktx.h
        • +
        • KTX_PACK_ASTC_ENCODER_MODE_DEFAULT : ktx.h
        • +
        • ktx_pack_astc_encoder_mode_e : ktx.h
        • +
        • KTX_PACK_ASTC_ENCODER_MODE_HDR : ktx.h
        • +
        • KTX_PACK_ASTC_ENCODER_MODE_LDR : ktx.h
        • +
        • KTX_PACK_ASTC_ENCODER_MODE_MAX : ktx.h
        • +
        • KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE : ktx.h
        • +
        • KTX_PACK_ASTC_QUALITY_LEVEL_FAST : ktx.h
        • +
        • KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST : ktx.h
        • +
        • KTX_PACK_ASTC_QUALITY_LEVEL_MAX : ktx.h
        • +
        • KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM : ktx.h
        • +
        • KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH : ktx.h
        • +
        • ktx_pack_astc_quality_levels_e : ktx.h
        • +
        • KTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL : ktx.h
        • +
        • KTX_PACK_UASTC_ETC1_FASTER_HINTS : ktx.h
        • +
        • KTX_PACK_UASTC_ETC1_FASTEST_HINTS : ktx.h
        • +
        • KTX_PACK_UASTC_FAVOR_BC7_ERROR : ktx.h
        • +
        • KTX_PACK_UASTC_FAVOR_UASTC_ERROR : ktx.h
        • +
        • ktx_pack_uastc_flag_bits_e : ktx.h
        • +
        • KTX_PACK_UASTC_LEVEL_DEFAULT : ktx.h
        • +
        • KTX_PACK_UASTC_LEVEL_FASTER : ktx.h
        • +
        • KTX_PACK_UASTC_LEVEL_FASTEST : ktx.h
        • +
        • KTX_PACK_UASTC_LEVEL_MASK : ktx.h
        • +
        • KTX_PACK_UASTC_LEVEL_SLOWER : ktx.h
        • +
        • KTX_PACK_UASTC_LEVEL_VERYSLOW : ktx.h
        • +
        • KTX_PACK_UASTC_MAX_LEVEL : ktx.h
        • +
        • PFNGLGETPROCADDRESS : ktx.h
        • +
        • PFNVOIDFUNCTION : ktx.h
        • +
        + + +

        - r -

        + + +

        - s -

          +
        • KTX_SS_BASIS_LZ : ktx.h
        • +
        • KTX_SS_NONE : ktx.h
        • +
        • KTX_SS_ZLIB : ktx.h
        • +
        • KTX_SS_ZSTD : ktx.h
        • +
        • KTX_SUCCESS : ktx.h
        • +
        • KTX_SWIZZLE_KEY : ktx.h
        • +
        • ktxStream_destruct : ktx.h
        • +
        • ktxStream_getpos : ktx.h
        • +
        • ktxStream_getsize : ktx.h
        • +
        • ktxStream_read : ktx.h
        • +
        • ktxStream_setpos : ktx.h
        • +
        • ktxStream_skip : ktx.h
        • +
        • ktxStream_write : ktx.h
        • +
        • ktxSupercmpScheme : ktx.h
        • +
        • ktxSupercompressionSchemeString() : ktx.h, strings.c
        • +
        + + +

        - t -

          +
        • KTX_TF_BC1 : ktx.h
        • +
        • KTX_TF_BC3 : ktx.h
        • +
        • KTX_TF_BC4 : ktx.h
        • +
        • KTX_TF_BC5 : ktx.h
        • +
        • KTX_TF_BC7_M6_OPAQUE_ONLY : ktx.h
        • +
        • KTX_TF_ETC1 : ktx.h
        • +
        • KTX_TF_ETC2 : ktx.h
        • +
        • KTX_TF_HIGH_QUALITY : ktx.h
        • +
        • KTX_TF_PVRTC1_4_OPAQUE_ONLY : ktx.h
        • +
        • KTX_TF_PVRTC_DECODE_TO_NEXT_POW2 : ktx.h
        • +
        • KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS : ktx.h
        • +
        • KTX_TRANSCODE_FAILED : ktx.h
        • +
        • ktx_transcode_flag_bits_e : ktx.h
        • +
        • ktx_transcode_fmt_e : ktx.h
        • +
        • KTX_TTF_ASTC_4x4_RGBA : ktx.h
        • +
        • KTX_TTF_BC1_OR_3 : ktx.h
        • +
        • KTX_TTF_BC1_RGB : ktx.h
        • +
        • KTX_TTF_BC3_RGBA : ktx.h
        • +
        • KTX_TTF_BC4_R : ktx.h
        • +
        • KTX_TTF_BC5_RG : ktx.h
        • +
        • KTX_TTF_BC7_M5_RGBA : ktx.h
        • +
        • KTX_TTF_BC7_M6_RGB : ktx.h
        • +
        • KTX_TTF_BC7_RGBA : ktx.h
        • +
        • KTX_TTF_BGR565 : ktx.h
        • +
        • KTX_TTF_ETC : ktx.h
        • +
        • KTX_TTF_ETC1_RGB : ktx.h
        • +
        • KTX_TTF_ETC2_EAC_R11 : ktx.h
        • +
        • KTX_TTF_ETC2_EAC_RG11 : ktx.h
        • +
        • KTX_TTF_ETC2_RGBA : ktx.h
        • +
        • KTX_TTF_PVRTC1_4_RGB : ktx.h
        • +
        • KTX_TTF_PVRTC1_4_RGBA : ktx.h
        • +
        • KTX_TTF_PVRTC2_4_RGB : ktx.h
        • +
        • KTX_TTF_PVRTC2_4_RGBA : ktx.h
        • +
        • KTX_TTF_RGB565 : ktx.h
        • +
        • KTX_TTF_RGBA32 : ktx.h
        • +
        • KTX_TTF_RGBA4444 : ktx.h
        • +
        • ktxTexture2_DecodeAstc() : ktx.h
        • +
        • ktxTexture_Destroy : ktx.h
        • +
        • ktxTexture_GetDataSizeUncompressed : ktx.h
        • +
        • ktxTexture_GetImageOffset : ktx.h
        • +
        • ktxTexture_GetImageSize : ktx.h
        • +
        • ktxTexture_GetLevelSize : ktx.h
        • +
        • ktxTexture_IterateLevels : ktx.h
        • +
        • ktxTexture_IterateLoadLevelFaces : ktx.h
        • +
        • ktxTexture_LoadImageData : ktx.h
        • +
        • ktxTexture_NeedsTranscoding : ktx.h
        • +
        • ktxTexture_SetImageFromMemory : ktx.h
        • +
        • ktxTexture_SetImageFromStdioStream : ktx.h
        • +
        • ktxTexture_WriteToMemory : ktx.h
        • +
        • ktxTexture_WriteToNamedFile : ktx.h
        • +
        • ktxTexture_WriteToStdioStream : ktx.h
        • +
        • ktxTexture_WriteToStream : ktx.h
        • +
        • ktxTranscodeFormatString() : ktx.h, strings.c
        • +
        + + +

        - u -

          +
        • KTX_UNKNOWN_FILE_FORMAT : ktx.h
        • +
        • KTX_UNSUPPORTED_FEATURE : ktx.h
        • +
        • KTX_UNSUPPORTED_TEXTURE_TYPE : ktx.h
        • +
        + + +

        - w -

          +
        • KTX_WRITER_KEY : ktx.h
        • +
        • KTX_WRITER_SCPARAMS_KEY : ktx.h
        • +
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/globals_defs.html b/ktx/build/docs/html/libktx/globals_defs.html new file mode 100644 index 0000000..704f177 --- /dev/null +++ b/ktx/build/docs/html/libktx/globals_defs.html @@ -0,0 +1,131 @@ + + + + + + + +libktx Reference: Globals + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented macros with links to the documentation:
          +
        • KTX_ANIMDATA_KEY : ktx.h
        • +
        • KTX_error_code : ktx.h
        • +
        • KTX_GL_UNPACK_ALIGNMENT : ktx.h
        • +
        • KTX_MEM_DEFAULT_ALLOCATED_SIZE : memstream.c
        • +
        • KTX_ORIENTATION1_FMT : ktx.h
        • +
        • KTX_ORIENTATION2_FMT : ktx.h
        • +
        • KTX_ORIENTATION3_FMT : ktx.h
        • +
        • KTX_ORIENTATION_KEY : ktx.h
        • +
        • KTX_SWIZZLE_KEY : ktx.h
        • +
        • ktxTexture_Destroy : ktx.h
        • +
        • ktxTexture_GetDataSizeUncompressed : ktx.h
        • +
        • ktxTexture_GetImageOffset : ktx.h
        • +
        • ktxTexture_GetImageSize : ktx.h
        • +
        • ktxTexture_GetLevelSize : ktx.h
        • +
        • ktxTexture_IterateLevels : ktx.h
        • +
        • ktxTexture_IterateLoadLevelFaces : ktx.h
        • +
        • ktxTexture_LoadImageData : ktx.h
        • +
        • ktxTexture_NeedsTranscoding : ktx.h
        • +
        • ktxTexture_SetImageFromMemory : ktx.h
        • +
        • ktxTexture_SetImageFromStdioStream : ktx.h
        • +
        • ktxTexture_WriteToMemory : ktx.h
        • +
        • ktxTexture_WriteToNamedFile : ktx.h
        • +
        • ktxTexture_WriteToStdioStream : ktx.h
        • +
        • ktxTexture_WriteToStream : ktx.h
        • +
        • KTX_WRITER_KEY : ktx.h
        • +
        • KTX_WRITER_SCPARAMS_KEY : ktx.h
        • +
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/globals_enum.html b/ktx/build/docs/html/libktx/globals_enum.html new file mode 100644 index 0000000..afa1379 --- /dev/null +++ b/ktx/build/docs/html/libktx/globals_enum.html @@ -0,0 +1,113 @@ + + + + + + + +libktx Reference: Globals + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented enums with links to the documentation:
          +
        • ktx_error_code_e : ktx.h
        • +
        • ktx_pack_astc_block_dimension_e : ktx.h
        • +
        • ktx_pack_astc_encoder_mode_e : ktx.h
        • +
        • ktx_pack_astc_quality_levels_e : ktx.h
        • +
        • ktx_pack_uastc_flag_bits_e : ktx.h
        • +
        • ktxSupercmpScheme : ktx.h
        • +
        • ktx_transcode_flag_bits_e : ktx.h
        • +
        • ktx_transcode_fmt_e : ktx.h
        • +
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/globals_eval.html b/ktx/build/docs/html/libktx/globals_eval.html new file mode 100644 index 0000000..768f544 --- /dev/null +++ b/ktx/build/docs/html/libktx/globals_eval.html @@ -0,0 +1,233 @@ + + + + + + + +libktx Reference: Globals + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented enum values with links to the documentation:
        + +

        - d -

          +
        • KTX_DECOMPRESS_CHECKSUM_ERROR : ktx.h
        • +
        • KTX_DECOMPRESS_LENGTH_ERROR : ktx.h
        • +
        + + +

        - e -

          +
        • KTX_ERROR_MAX_ENUM : ktx.h
        • +
        + + +

        - f -

          +
        • KTX_FILE_DATA_ERROR : ktx.h
        • +
        • KTX_FILE_ISPIPE : ktx.h
        • +
        • KTX_FILE_OPEN_FAILED : ktx.h
        • +
        • KTX_FILE_OVERFLOW : ktx.h
        • +
        • KTX_FILE_READ_ERROR : ktx.h
        • +
        • KTX_FILE_SEEK_ERROR : ktx.h
        • +
        • KTX_FILE_UNEXPECTED_EOF : ktx.h
        • +
        • KTX_FILE_WRITE_ERROR : ktx.h
        • +
        + + +

        - g -

          +
        • KTX_GL_ERROR : ktx.h
        • +
        + + +

        - i -

          +
        • KTX_INVALID_OPERATION : ktx.h
        • +
        • KTX_INVALID_VALUE : ktx.h
        • +
        + + +

        - l -

          +
        • KTX_LIBRARY_NOT_LINKED : ktx.h
        • +
        + + +

        - n -

          +
        • KTX_NOT_FOUND : ktx.h
        • +
        + + +

        - o -

          +
        • KTX_OUT_OF_MEMORY : ktx.h
        • +
        + + +

        - p -

          +
        • KTX_PACK_ASTC_BLOCK_DIMENSION_MAX : ktx.h
        • +
        • KTX_PACK_ASTC_ENCODER_MODE_DEFAULT : ktx.h
        • +
        • KTX_PACK_ASTC_ENCODER_MODE_HDR : ktx.h
        • +
        • KTX_PACK_ASTC_ENCODER_MODE_LDR : ktx.h
        • +
        • KTX_PACK_ASTC_ENCODER_MODE_MAX : ktx.h
        • +
        • KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE : ktx.h
        • +
        • KTX_PACK_ASTC_QUALITY_LEVEL_FAST : ktx.h
        • +
        • KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST : ktx.h
        • +
        • KTX_PACK_ASTC_QUALITY_LEVEL_MAX : ktx.h
        • +
        • KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM : ktx.h
        • +
        • KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH : ktx.h
        • +
        • KTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL : ktx.h
        • +
        • KTX_PACK_UASTC_ETC1_FASTER_HINTS : ktx.h
        • +
        • KTX_PACK_UASTC_ETC1_FASTEST_HINTS : ktx.h
        • +
        • KTX_PACK_UASTC_FAVOR_BC7_ERROR : ktx.h
        • +
        • KTX_PACK_UASTC_FAVOR_UASTC_ERROR : ktx.h
        • +
        • KTX_PACK_UASTC_LEVEL_DEFAULT : ktx.h
        • +
        • KTX_PACK_UASTC_LEVEL_FASTER : ktx.h
        • +
        • KTX_PACK_UASTC_LEVEL_FASTEST : ktx.h
        • +
        • KTX_PACK_UASTC_LEVEL_MASK : ktx.h
        • +
        • KTX_PACK_UASTC_LEVEL_SLOWER : ktx.h
        • +
        • KTX_PACK_UASTC_LEVEL_VERYSLOW : ktx.h
        • +
        • KTX_PACK_UASTC_MAX_LEVEL : ktx.h
        • +
        + + +

        - s -

        + + +

        - t -

          +
        • KTX_TF_BC1 : ktx.h
        • +
        • KTX_TF_BC3 : ktx.h
        • +
        • KTX_TF_BC4 : ktx.h
        • +
        • KTX_TF_BC5 : ktx.h
        • +
        • KTX_TF_BC7_M6_OPAQUE_ONLY : ktx.h
        • +
        • KTX_TF_ETC1 : ktx.h
        • +
        • KTX_TF_ETC2 : ktx.h
        • +
        • KTX_TF_HIGH_QUALITY : ktx.h
        • +
        • KTX_TF_PVRTC1_4_OPAQUE_ONLY : ktx.h
        • +
        • KTX_TF_PVRTC_DECODE_TO_NEXT_POW2 : ktx.h
        • +
        • KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS : ktx.h
        • +
        • KTX_TRANSCODE_FAILED : ktx.h
        • +
        • KTX_TTF_ASTC_4x4_RGBA : ktx.h
        • +
        • KTX_TTF_BC1_OR_3 : ktx.h
        • +
        • KTX_TTF_BC1_RGB : ktx.h
        • +
        • KTX_TTF_BC3_RGBA : ktx.h
        • +
        • KTX_TTF_BC4_R : ktx.h
        • +
        • KTX_TTF_BC5_RG : ktx.h
        • +
        • KTX_TTF_BC7_M5_RGBA : ktx.h
        • +
        • KTX_TTF_BC7_M6_RGB : ktx.h
        • +
        • KTX_TTF_BC7_RGBA : ktx.h
        • +
        • KTX_TTF_BGR565 : ktx.h
        • +
        • KTX_TTF_ETC : ktx.h
        • +
        • KTX_TTF_ETC1_RGB : ktx.h
        • +
        • KTX_TTF_ETC2_EAC_R11 : ktx.h
        • +
        • KTX_TTF_ETC2_EAC_RG11 : ktx.h
        • +
        • KTX_TTF_ETC2_RGBA : ktx.h
        • +
        • KTX_TTF_PVRTC1_4_RGB : ktx.h
        • +
        • KTX_TTF_PVRTC1_4_RGBA : ktx.h
        • +
        • KTX_TTF_PVRTC2_4_RGB : ktx.h
        • +
        • KTX_TTF_PVRTC2_4_RGBA : ktx.h
        • +
        • KTX_TTF_RGB565 : ktx.h
        • +
        • KTX_TTF_RGBA32 : ktx.h
        • +
        • KTX_TTF_RGBA4444 : ktx.h
        • +
        + + +

        - u -

          +
        • KTX_UNKNOWN_FILE_FORMAT : ktx.h
        • +
        • KTX_UNSUPPORTED_FEATURE : ktx.h
        • +
        • KTX_UNSUPPORTED_TEXTURE_TYPE : ktx.h
        • +
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/globals_func.html b/ktx/build/docs/html/libktx/globals_func.html new file mode 100644 index 0000000..9626298 --- /dev/null +++ b/ktx/build/docs/html/libktx/globals_func.html @@ -0,0 +1,118 @@ + + + + + + + +libktx Reference: Globals + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented functions with links to the documentation:
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/globals_type.html b/ktx/build/docs/html/libktx/globals_type.html new file mode 100644 index 0000000..63c4cdb --- /dev/null +++ b/ktx/build/docs/html/libktx/globals_type.html @@ -0,0 +1,125 @@ + + + + + + + +libktx Reference: Globals + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Here is a list of all documented typedefs with links to the documentation:
          +
        • ktxAstcParams : ktx.h
        • +
        • ktxBasisParams : ktx.h
        • +
        • ktx_error_code_e : ktx.h
        • +
        • ktx_pack_astc_block_dimension_e : ktx.h
        • +
        • ktx_pack_astc_encoder_mode_e : ktx.h
        • +
        • ktx_pack_astc_quality_levels_e : ktx.h
        • +
        • ktx_pack_uastc_flag_bits_e : ktx.h
        • +
        • PFNGLGETPROCADDRESS : ktx.h
        • +
        • PFNVOIDFUNCTION : ktx.h
        • +
        • ktxResult : ktx.h
        • +
        • ktxStream_destruct : ktx.h
        • +
        • ktxStream_getpos : ktx.h
        • +
        • ktxStream_getsize : ktx.h
        • +
        • ktxStream_read : ktx.h
        • +
        • ktxStream_setpos : ktx.h
        • +
        • ktxStream_skip : ktx.h
        • +
        • ktxStream_write : ktx.h
        • +
        • ktxSupercmpScheme : ktx.h
        • +
        • ktx_transcode_flag_bits_e : ktx.h
        • +
        • ktx_transcode_fmt_e : ktx.h
        • +
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/graph_legend.html b/ktx/build/docs/html/libktx/graph_legend.html new file mode 100644 index 0000000..f6719ee --- /dev/null +++ b/ktx/build/docs/html/libktx/graph_legend.html @@ -0,0 +1,166 @@ + + + + + + + +libktx Reference: Graph Legend + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Graph Legend
        +
        +
        +

        This page explains how to interpret the graphs that are generated by doxygen.

        +

        Consider the following example:

        /*! Invisible class because of truncation */
        +
        class Invisible { };
        +
        +
        /*! Truncated class, inheritance relation is hidden */
        +
        class Truncated : public Invisible { };
        +
        +
        /* Class not documented with doxygen comments */
        +
        class Undocumented { };
        +
        +
        /*! Class that is inherited using public inheritance */
        +
        class PublicBase : public Truncated { };
        +
        +
        /*! A template class */
        +
        template<class T> class Templ { };
        +
        +
        /*! Class that is inherited using protected inheritance */
        +
        class ProtectedBase { };
        +
        +
        /*! Class that is inherited using private inheritance */
        +
        class PrivateBase { };
        +
        +
        /*! Class that is used by the Inherited class */
        +
        class Used { };
        +
        +
        /*! Super class that inherits a number of other classes */
        +
        class Inherited : public PublicBase,
        +
        protected ProtectedBase,
        +
        private PrivateBase,
        +
        public Undocumented,
        +
        public Templ<int>
        +
        {
        +
        private:
        +
        Used *m_usedClass;
        +
        };
        +

        This will result in the following graph:

        +

        The boxes in the above graph have the following meaning:

        +
          +
        • +A filled gray box represents the struct or class for which the graph is generated.
        • +
        • +A box with a black border denotes a documented struct or class.
        • +
        • +A box with a gray border denotes an undocumented struct or class.
        • +
        • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
        • +
        +

        The arrows have the following meaning:

        +
          +
        • +A blue arrow is used to visualize a public inheritance relation between two classes.
        • +
        • +A dark green arrow is used for protected inheritance.
        • +
        • +A dark red arrow is used for private inheritance.
        • +
        • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
        • +
        • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
        • +
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/graph_legend.md5 b/ktx/build/docs/html/libktx/graph_legend.md5 new file mode 100644 index 0000000..da515da --- /dev/null +++ b/ktx/build/docs/html/libktx/graph_legend.md5 @@ -0,0 +1 @@ +f74606a252eb303675caf37987d0b7af \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/graph_legend.png b/ktx/build/docs/html/libktx/graph_legend.png new file mode 100644 index 0000000..0034e94 Binary files /dev/null and b/ktx/build/docs/html/libktx/graph_legend.png differ diff --git a/ktx/build/docs/html/libktx/group__ktx__glloader.html b/ktx/build/docs/html/libktx/group__ktx__glloader.html new file mode 100644 index 0000000..a98dfc4 --- /dev/null +++ b/ktx/build/docs/html/libktx/group__ktx__glloader.html @@ -0,0 +1,322 @@ + + + + + + + +libktx Reference: OpenGL Texture Image Loader + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        OpenGL Texture Image Loader
        +
        +
        + +

        Create texture objects in current OpenGL context. +More...

        + + + + + + + + + + +

        +Functions

        ktx_error_code_e ktxLoadOpenGL (PFNGLGETPROCADDRESS pfnGLGetProcAddress)
         Load pointers for the GL functions used by the ktxTexture*_GLUpload functions.
        KTX_error_code ktxTexture1_GLUpload (ktxTexture1 *This, GLuint *pTexture, GLenum *pTarget, GLenum *pGlerror)
         Create a GL texture object from a ktxTexture1 object.
        KTX_error_code ktxTexture2_GLUpload (ktxTexture2 *This, GLuint *pTexture, GLenum *pTarget, GLenum *pGlerror)
         Create a GL texture object from a ktxTexture2 object.
        KTX_error_code ktxTexture_GLUpload (ktxTexture *This, GLuint *pTexture, GLenum *pTarget, GLenum *pGlerror)
         Create a GL texture object from a ktxTexture object.
        +

        Detailed Description

        +

        Create texture objects in current OpenGL context.

        +

        Function Documentation

        + +

        ◆ ktxLoadOpenGL()

        + +
        +
        + + + + + + + +
        ktx_error_code_e ktxLoadOpenGL (PFNGLGETPROCADDRESS pfnGLGetProcAddress)
        +
        + +

        Load pointers for the GL functions used by the ktxTexture*_GLUpload functions.

        +

        Should be called by an application before its first call to a ktxTexture*_GLUpload function, passing a pointer to the GLGetProcAddress function provided by whatever OpenGL framework it is using. For backward compatibility, the ktxTexture*_GLUpload functions call this with a NULL pointer causing an attempt to load the pointers from the program module using dlsym (GNU/Linux, macOS), wglGetProcAddr and GetProcAddr (Windows) or emscripten_GetProcAddress (Web). This works with the vast majority of OpenGL implementations but issues have been seen on Fedora systems particularly with NVIDIA hardware. For full robustness, applications should call this function.

        +
        Parameters
        + + +
        [in]pfnGLGetProcAddresspointer to function for retrieving pointers to GL functions. If NULL, retrieval is attempted using system dependent generic functions.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_GLUpload()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_GLUpload (ktxTexture1 * This,
        GLuint * pTexture,
        GLenum * pTarget,
        GLenum * pGlerror )
        +
        + +

        Create a GL texture object from a ktxTexture1 object.

        +

        Sets the texture object's GL_TEXTURE_MAX_LEVEL parameter according to the number of levels in the KTX data, provided the context supports this feature.

        +

        Unpacks compressed GL_ETC1_RGB8_OES and GL_ETC2_* format textures in software when the format is not supported by the GL context, provided the library has been compiled with SUPPORT_SOFTWARE_ETC_UNPACK defined as 1.

        +

        It will also convert textures with legacy formats to their modern equivalents when the format is not supported by the GL context, provided the library has been compiled with SUPPORT_LEGACY_FORMAT_CONVERSION defined as 1.

        +
        Parameters
        + + + + + +
        [in]Thishandle of the ktxTexture to upload.
        [in,out]pTexturename of the GL texture object to load. If NULL or if *pTexture == 0 the function will generate a texture name. The function binds either the generated name or the name given in *pTexture to the texture target returned in *pTarget, before loading the texture data. If pTexture is not NULL and a name was generated, the generated name will be returned in *pTexture.
        [out]pTarget*pTarget is set to the texture target used. The target is chosen based on the file contents.
        [out]pGlerror*pGlerror is set to the value returned by glGetError when this function returns the error KTX_GL_ERROR. pGlerror can be NULL.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + +
        KTX_GL_ERRORA GL error was raised by glBindTexture, glGenTextures or gl*TexImage*. The GL error will be returned in *glerror, if glerror is not NULL.
        KTX_INVALID_VALUEThis or target is NULL or the size of a mip level is greater than the size of the preceding level.
        KTX_NOT_FOUNDA dynamically loaded OpenGL {,ES} function required by the loader was not found.
        KTX_UNSUPPORTED_TEXTURE_TYPEThe type of texture is not supported by the current OpenGL context.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_GLUpload()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_GLUpload (ktxTexture2 * This,
        GLuint * pTexture,
        GLenum * pTarget,
        GLenum * pGlerror )
        +
        + +

        Create a GL texture object from a ktxTexture2 object.

        +

        Sets the texture object's GL_TEXTURE_MAX_LEVEL parameter according to the number of levels in the KTX data, provided the context supports this feature.

        +

        Unpacks compressed GL_ETC1_RGB8_OES and GL_ETC2_* format textures in software when the format is not supported by the GL context, provided the library has been compiled with SUPPORT_SOFTWARE_ETC_UNPACK defined as 1.

        +
        Parameters
        + + + + + +
        [in]Thishandle of the ktxTexture to upload.
        [in,out]pTexturename of the GL texture object to load. If NULL or if *pTexture == 0 the function will generate a texture name. The function binds either the generated name or the name given in *pTexture to the texture target returned in *pTarget, before loading the texture data. If pTexture is not NULL and a name was generated, the generated name will be returned in *pTexture.
        [out]pTarget*pTarget is set to the texture target used. The target is chosen based on the file contents.
        [out]pGlerror*pGlerror is set to the value returned by glGetError when this function returns the error KTX_GL_ERROR. pGlerror can be NULL.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + +
        KTX_GL_ERRORA GL error was raised by glBindTexture, glGenTextures or gl*TexImage*. The GL error will be returned in *glerror, if glerror is not NULL.
        KTX_INVALID_VALUEThis or target is NULL or the size of a mip level is greater than the size of the preceding level.
        KTX_NOT_FOUNDA dynamically loaded OpenGL {,ES} function required by the loader was not found.
        KTX_UNSUPPORTED_TEXTURE_TYPEThe type of texture is not supported by the current OpenGL context.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture_GLUpload()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture_GLUpload (ktxTexture * This,
        GLuint * pTexture,
        GLenum * pTarget,
        GLenum * pGlerror )
        +
        + +

        Create a GL texture object from a ktxTexture object.

        +

        In order to ensure that the GL uploader is not linked into an application unless explicitly called, this is not a virtual function. It determines the texture type then dispatches to the correct function.

        +

        Sets the texture object's GL_TEXTURE_MAX_LEVEL parameter according to the number of levels in the KTX data, provided the context supports this feature.

        +

        Unpacks compressed GL_ETC1_RGB8_OES and GL_ETC2_* format textures in software when the format is not supported by the GL context, provided the library has been compiled with SUPPORT_SOFTWARE_ETC_UNPACK defined as 1.

        +

        It will also convert textures with legacy formats to their modern equivalents when the format is not supported by the GL context, provided the library has been compiled with SUPPORT_LEGACY_FORMAT_CONVERSION defined as 1.

        +
        Parameters
        + + + + + +
        [in]Thishandle of the ktxTexture to upload.
        [in,out]pTexturename of the GL texture object to load. If NULL or if *pTexture == 0 the function will generate a texture name. The function binds either the generated name or the name given in *pTexture to the texture target returned in *pTarget, before loading the texture data. If pTexture is not NULL and a name was generated, the generated name will be returned in *pTexture.
        [out]pTarget*pTarget is set to the texture target used. The target is chosen based on the file contents.
        [out]pGlerror*pGlerror is set to the value returned by glGetError when this function returns the error KTX_GL_ERROR. pGlerror can be NULL.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + +
        KTX_GL_ERRORA GL error was raised by glBindTexture, glGenTextures or gl*TexImage*. The GL error will be returned in *glerror, if glerror is not NULL.
        KTX_INVALID_VALUEThis or target is NULL or the size of a mip level is greater than the size of the preceding level.
        KTX_NOT_FOUNDA dynamically loaded OpenGL {,ES} function required by the loader was not found.
        KTX_UNSUPPORTED_TEXTURE_TYPEThe type of texture is not supported by the current OpenGL context.
        +
        +
        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/group__ktx__glloader.js b/ktx/build/docs/html/libktx/group__ktx__glloader.js new file mode 100644 index 0000000..bbfdb4d --- /dev/null +++ b/ktx/build/docs/html/libktx/group__ktx__glloader.js @@ -0,0 +1,7 @@ +var group__ktx__glloader = +[ + [ "ktxLoadOpenGL", "group__ktx__glloader.html#gada67f60796793d1ed9eb1f3f2d61d4a6", null ], + [ "ktxTexture1::ktxTexture1_GLUpload", "group__ktx__glloader.html#ga058297b66c5a7fd1f1bbaf718a887b9f", null ], + [ "ktxTexture2::ktxTexture2_GLUpload", "group__ktx__glloader.html#ga7624860df8e44573862fa5754ea2976c", null ], + [ "ktxTexture::ktxTexture_GLUpload", "group__ktx__glloader.html#ga516367e94731f99a23a83fb029e9a441", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/group__ktx__vkloader.html b/ktx/build/docs/html/libktx/group__ktx__vkloader.html new file mode 100644 index 0000000..95a016f --- /dev/null +++ b/ktx/build/docs/html/libktx/group__ktx__vkloader.html @@ -0,0 +1,1063 @@ + + + + + + + +libktx Reference: Vulkan Texture Image Loader + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Vulkan Texture Image Loader
        +
        +
        + +

        Create texture images on a Vulkan device. +More...

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Functions

        ktxVulkanDeviceInfoktxVulkanDeviceInfo_Create (VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkCommandPool cmdPool, const VkAllocationCallbacks *pAllocator)
         Create a ktxVulkanDeviceInfo object.
        ktxVulkanDeviceInfoktxVulkanDeviceInfo_CreateEx (VkInstance instance, VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkCommandPool cmdPool, const VkAllocationCallbacks *pAllocator, const ktxVulkanFunctions *pFuncs)
         Create a ktxVulkanDeviceInfo object.
        KTX_error_code ktxVulkanDeviceInfo_Construct (ktxVulkanDeviceInfo *This, VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkCommandPool cmdPool, const VkAllocationCallbacks *pAllocator)
         Construct a ktxVulkanDeviceInfo object.
        KTX_error_code ktxVulkanDeviceInfo_ConstructEx (ktxVulkanDeviceInfo *This, VkInstance instance, VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkCommandPool cmdPool, const VkAllocationCallbacks *pAllocator, const ktxVulkanFunctions *pFunctions)
         Construct a ktxVulkanDeviceInfo object.
        void ktxVulkanDeviceInfo_Destruct (ktxVulkanDeviceInfo *This)
         Destruct a ktxVulkanDeviceInfo object.
        void ktxVulkanDeviceInfo_Destroy (ktxVulkanDeviceInfo *This)
         Destroy a ktxVulkanDeviceInfo object.
        KTX_error_code ktxTexture_VkUploadEx_WithSuballocator (ktxTexture *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, ktxVulkanTexture_subAllocatorCallbacks *subAllocatorCallbacks)
         Create a Vulkan image object from a ktxTexture object.
        KTX_error_code ktxTexture_VkUploadEx (ktxTexture *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)
         Create a Vulkan image object from a ktxTexture object.
        KTX_error_code ktxTexture_VkUpload (ktxTexture *texture, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture)
         Create a Vulkan image object from a ktxTexture object.
        KTX_error_code ktxTexture1_VkUploadEx_WithSuballocator (ktxTexture1 *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, ktxVulkanTexture_subAllocatorCallbacks *subAllocatorCallbacks)
         Create a Vulkan image object from a ktxTexture1 object.
        KTX_error_code ktxTexture1_VkUploadEx (ktxTexture1 *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)
         Create a Vulkan image object from a ktxTexture1 object.
        KTX_error_code ktxTexture1_VkUpload (ktxTexture1 *texture, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture)
         Create a Vulkan image object from a ktxTexture1 object.
        KTX_error_code ktxTexture2_VkUploadEx_WithSuballocator (ktxTexture2 *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, ktxVulkanTexture_subAllocatorCallbacks *subAllocatorCallbacks)
         Create a Vulkan image object from a ktxTexture2 object.
        KTX_error_code ktxTexture2_VkUploadEx (ktxTexture2 *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)
         Create a Vulkan image object from a ktxTexture2 object.
        KTX_error_code ktxTexture2_VkUpload (ktxTexture2 *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture)
         Create a Vulkan image object from a ktxTexture2 object.
        VkFormat ktxTexture1_GetVkFormat (ktxTexture1 *This)
         Return the VkFormat enum of a ktxTexture1 object.
        VkFormat ktxTexture2_GetVkFormat (ktxTexture2 *This)
         Return the VkFormat enum of a ktxTexture2 object.
        VkFormat ktxTexture_GetVkFormat (ktxTexture *This)
         Return the VkFormat enum of a ktxTexture object.
        ktx_error_code_e ktxVulkanTexture_Destruct_WithSuballocator (ktxVulkanTexture *vkTexture, VkDevice device, const VkAllocationCallbacks *pAllocator, ktxVulkanTexture_subAllocatorCallbacks *subAllocatorCallbacks)
         Destructor for the object returned when loading a texture image.
        void ktxVulkanTexture_Destruct (ktxVulkanTexture *vkTexture, VkDevice device, const VkAllocationCallbacks *pAllocator)
         Destructor for the object returned when loading a texture image.
        +

        Detailed Description

        +

        Create texture images on a Vulkan device.

        +

        Function Documentation

        + +

        ◆ ktxTexture1_GetVkFormat()

        + +
        +
        + + + + + + + +
        VkFormat ktxTexture1_GetVkFormat (ktxTexture1 * This)
        +
        + +

        Return the VkFormat enum of a ktxTexture1 object.

        +
        Returns
        The VkFormat of the texture object. May return VK_FORMAT_UNDEFINED if there is no mapping from the GL internalformat and format.
        + +
        +
        + +

        ◆ ktxTexture1_VkUpload()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_VkUpload (ktxTexture1 * texture,
        ktxVulkanDeviceInfo * vdi,
        ktxVulkanTexture * vkTexture )
        +
        + +

        Create a Vulkan image object from a ktxTexture1 object.

        +

        Calls ktxTexture_VkUploadEx() with the most commonly used options: VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT and VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL. Use that for complete control.

        + +
        +
        + +

        ◆ ktxTexture1_VkUploadEx()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_VkUploadEx (ktxTexture1 * This,
        ktxVulkanDeviceInfo * vdi,
        ktxVulkanTexture * vkTexture,
        VkImageTiling tiling,
        VkImageUsageFlags usageFlags,
        VkImageLayout finalLayout )
        +
        + +

        Create a Vulkan image object from a ktxTexture1 object.

        +

        This simply calls ktxTexture_VkUploadEx().

        + +
        +
        + +

        ◆ ktxTexture1_VkUploadEx_WithSuballocator()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_VkUploadEx_WithSuballocator (ktxTexture1 * This,
        ktxVulkanDeviceInfo * vdi,
        ktxVulkanTexture * vkTexture,
        VkImageTiling tiling,
        VkImageUsageFlags usageFlags,
        VkImageLayout finalLayout,
        ktxVulkanTexture_subAllocatorCallbacks * subAllocatorCallbacks )
        +
        + +

        Create a Vulkan image object from a ktxTexture1 object.

        +

        This simply calls ktxTexture_VkUploadEx_WithSuballocator()

        +

        Creates a VkImage with VkFormat etc. matching the KTX data and uploads the images. Mipmaps will be generated if the ktxTexture's generateMipmaps flag is set. Returns the handles of the created objects and information about the texture in the ktxVulkanTexture pointed at by vkTexture.

        +

        The created VkImage will have VK_SHARING_MODE_EXCLUSIVE set thus the resulting image will be usable only with queues of the same family as the queue in the ktxVulkanDeviceInfo pointed to by vdi.

        +

        usageFlags and thus acceptable usage of the created image may be augmented as follows:

          +
        • with VK_IMAGE_USAGE_TRANSFER_DST_BIT if tiling is VK_IMAGE_TILING_OPTIMAL
        • +
        • with VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT if generateMipmaps is set in the ktxTexture.
        • +
        +

        Most Vulkan implementations support VK_IMAGE_TILING_LINEAR only for a very limited number of formats and features. Generally VK_IMAGE_TILING_OPTIMAL is preferred. The latter requires a staging buffer so will use more memory during loading.

        +

        If a pointer to a set of suballocator callbacks is provided, they will be used instead of manual allocation of VkDeviceMemory. A 64 bit uint that references the suballocated page(s) is returned on memory procurement and saved in the allocationId field of the structure pointed to by vkTexture.

        +
        Parameters
        + + + + + + + + +
        [in]Thispointer to the ktxTexture from which to upload.
        [in]vdipointer to a ktxVulkanDeviceInfo structure providing information about the Vulkan device onto which to load the texture.
        [in,out]vkTexturepointer to a ktxVulkanTexture structure into which the function writes information about the created VkImage.
        [in]tilingtype of tiling to use in the destination image on the Vulkan device.
        [in]usageFlagsa set of VkImageUsageFlags bits indicating the intended usage of the destination image.
        [in]finalLayouta VkImageLayout value indicating the desired final layout of the created image.
        [in]subAllocatorCallbackspointer to a set of suballocator callbacks that wrap around suballocator calls: alloc, bindbuffer, bindimage, map, unmap and free. They use a uint64_t stored in the allocationId field of the structure pointed at by vkTexture to reference allocated page(s).
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + + + +
        KTX_INVALID_VALUEAn incomplete set of callbacks are provided in subAllocatorCallbacks.
        KTX_INVALID_VALUEThis, vdi or vkTexture is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture contains neither images nor an active stream from which to read them.
        KTX_INVALID_OPERATIONThe combination of the ktxTexture's format, tiling and usageFlags is not supported by the physical device.
        KTX_INVALID_OPERATIONRequested mipmap generation is not supported by the physical device for the combination of the ktxTexture's format and tiling.
        KTX_INVALID_OPERATIONNumber of mip levels or array layers exceeds the maximums supported for the ktxTexture's format and tiling.
        KTX_OUT_OF_MEMORYSufficient memory could not be allocated on either the CPU or the Vulkan device.
        KTX_UNSUPPORTED_FEATUREAttempting to sparsely bind KTX textures for the time being will report this error.
        +
        +
        +
        See also
        ktxVulkanDeviceInfo_Construct()
        + +
        +
        + +

        ◆ ktxTexture2_GetVkFormat()

        + +
        +
        + + + + + + + +
        VkFormat ktxTexture2_GetVkFormat (ktxTexture2 * This)
        +
        + +

        Return the VkFormat enum of a ktxTexture2 object.

        +
        Returns
        The VkFormat of the texture object.
        + +
        +
        + +

        ◆ ktxTexture2_VkUpload()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_VkUpload (ktxTexture2 * This,
        ktxVulkanDeviceInfo * vdi,
        ktxVulkanTexture * vkTexture )
        +
        + +

        Create a Vulkan image object from a ktxTexture2 object.

        +

        Calls ktxTexture_VkUploadEx() with the most commonly used options: VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT and VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL. Use that for complete control.

        + +
        +
        + +

        ◆ ktxTexture2_VkUploadEx()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_VkUploadEx (ktxTexture2 * This,
        ktxVulkanDeviceInfo * vdi,
        ktxVulkanTexture * vkTexture,
        VkImageTiling tiling,
        VkImageUsageFlags usageFlags,
        VkImageLayout finalLayout )
        +
        + +

        Create a Vulkan image object from a ktxTexture2 object.

        +

        This simply calls ktxTexture_VkUploadEx().

        + +
        +
        + +

        ◆ ktxTexture2_VkUploadEx_WithSuballocator()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_VkUploadEx_WithSuballocator (ktxTexture2 * This,
        ktxVulkanDeviceInfo * vdi,
        ktxVulkanTexture * vkTexture,
        VkImageTiling tiling,
        VkImageUsageFlags usageFlags,
        VkImageLayout finalLayout,
        ktxVulkanTexture_subAllocatorCallbacks * subAllocatorCallbacks )
        +
        + +

        Create a Vulkan image object from a ktxTexture2 object.

        +

        This simplly calls ktxTexture_VkUploadEx_WithSuballocator().

        +

        Creates a VkImage with VkFormat etc. matching the KTX data and uploads the images. Mipmaps will be generated if the ktxTexture's generateMipmaps flag is set. Returns the handles of the created objects and information about the texture in the ktxVulkanTexture pointed at by vkTexture.

        +

        The created VkImage will have VK_SHARING_MODE_EXCLUSIVE set thus the resulting image will be usable only with queues of the same family as the queue in the ktxVulkanDeviceInfo pointed to by vdi.

        +

        usageFlags and thus acceptable usage of the created image may be augmented as follows:

          +
        • with VK_IMAGE_USAGE_TRANSFER_DST_BIT if tiling is VK_IMAGE_TILING_OPTIMAL
        • +
        • with VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT if generateMipmaps is set in the ktxTexture.
        • +
        +

        Most Vulkan implementations support VK_IMAGE_TILING_LINEAR only for a very limited number of formats and features. Generally VK_IMAGE_TILING_OPTIMAL is preferred. The latter requires a staging buffer so will use more memory during loading.

        +

        If a pointer to a set of suballocator callbacks is provided, they will be used instead of manual allocation of VkDeviceMemory. A 64 bit uint that references the suballocated page(s) is returned on memory procurement and saved in the allocationId field of the structure pointed to by vkTexture.

        +
        Parameters
        + + + + + + + + +
        [in]Thispointer to the ktxTexture from which to upload.
        [in]vdipointer to a ktxVulkanDeviceInfo structure providing information about the Vulkan device onto which to load the texture.
        [in,out]vkTexturepointer to a ktxVulkanTexture structure into which the function writes information about the created VkImage.
        [in]tilingtype of tiling to use in the destination image on the Vulkan device.
        [in]usageFlagsa set of VkImageUsageFlags bits indicating the intended usage of the destination image.
        [in]finalLayouta VkImageLayout value indicating the desired final layout of the created image.
        [in]subAllocatorCallbackspointer to a set of suballocator callbacks that wrap around suballocator calls: alloc, bindbuffer, bindimage, map, unmap and free. They use a uint64_t stored in the allocationId field of the structure pointed at by vkTexture to reference allocated page(s).
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + + + +
        KTX_INVALID_VALUEAn incomplete set of callbacks are provided in subAllocatorCallbacks.
        KTX_INVALID_VALUEThis, vdi or vkTexture is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture contains neither images nor an active stream from which to read them.
        KTX_INVALID_OPERATIONThe combination of the ktxTexture's format, tiling and usageFlags is not supported by the physical device.
        KTX_INVALID_OPERATIONRequested mipmap generation is not supported by the physical device for the combination of the ktxTexture's format and tiling.
        KTX_INVALID_OPERATIONNumber of mip levels or array layers exceeds the maximums supported for the ktxTexture's format and tiling.
        KTX_OUT_OF_MEMORYSufficient memory could not be allocated on either the CPU or the Vulkan device.
        KTX_UNSUPPORTED_FEATUREAttempting to sparsely bind KTX textures for the time being will report this error.
        +
        +
        +
        See also
        ktxVulkanDeviceInfo_Construct()
        + +
        +
        + +

        ◆ ktxTexture_GetVkFormat()

        + +
        +
        + + + + + + + +
        VkFormat ktxTexture_GetVkFormat (ktxTexture * This)
        +
        + +

        Return the VkFormat enum of a ktxTexture object.

        +

        In ordert to ensure that the Vulkan uploader is not linked into an application unless explicitly called, this is not a virtual function. It determines the texture type then dispatches to the correct function.

        See also
        ktxTexture1_GetVkFormat()
        +
        +ktxTexture2_GetVkFormat()
        + +
        +
        + +

        ◆ ktxTexture_VkUpload()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture_VkUpload (ktxTexture * texture,
        ktxVulkanDeviceInfo * vdi,
        ktxVulkanTexture * vkTexture )
        +
        + +

        Create a Vulkan image object from a ktxTexture object.

        +

        Calls ktxTexture_VkUploadEx() with the most commonly used options: VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT and VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL. Use that for complete control.

        + +
        +
        + +

        ◆ ktxTexture_VkUploadEx()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture_VkUploadEx (ktxTexture * This,
        ktxVulkanDeviceInfo * vdi,
        ktxVulkanTexture * vkTexture,
        VkImageTiling tiling,
        VkImageUsageFlags usageFlags,
        VkImageLayout finalLayout )
        +
        + +

        Create a Vulkan image object from a ktxTexture object.

        +

        Calls ktxTexture_VkUploadEx_WithSuballocator() with no supplied suballocator callbacks. Use that for complete control.

        + +
        +
        + +

        ◆ ktxTexture_VkUploadEx_WithSuballocator()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture_VkUploadEx_WithSuballocator (ktxTexture * This,
        ktxVulkanDeviceInfo * vdi,
        ktxVulkanTexture * vkTexture,
        VkImageTiling tiling,
        VkImageUsageFlags usageFlags,
        VkImageLayout finalLayout,
        ktxVulkanTexture_subAllocatorCallbacks * subAllocatorCallbacks )
        +
        + +

        Create a Vulkan image object from a ktxTexture object.

        +

        Creates a VkImage with VkFormat etc. matching the KTX data and uploads the images. Mipmaps will be generated if the ktxTexture's generateMipmaps flag is set. Returns the handles of the created objects and information about the texture in the ktxVulkanTexture pointed at by vkTexture.

        +

        The created VkImage will have VK_SHARING_MODE_EXCLUSIVE set thus the resulting image will be usable only with queues of the same family as the queue in the ktxVulkanDeviceInfo pointed to by vdi.

        +

        usageFlags and thus acceptable usage of the created image may be augmented as follows:

          +
        • with VK_IMAGE_USAGE_TRANSFER_DST_BIT if tiling is VK_IMAGE_TILING_OPTIMAL
        • +
        • with VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT if generateMipmaps is set in the ktxTexture.
        • +
        +

        Most Vulkan implementations support VK_IMAGE_TILING_LINEAR only for a very limited number of formats and features. Generally VK_IMAGE_TILING_OPTIMAL is preferred. The latter requires a staging buffer so will use more memory during loading.

        +

        If a pointer to a set of suballocator callbacks is provided, they will be used instead of manual allocation of VkDeviceMemory. A 64 bit uint that references the suballocated page(s) is returned on memory procurement and saved in the allocationId field of the structure pointed to by vkTexture.

        +
        Parameters
        + + + + + + + + +
        [in]Thispointer to the ktxTexture from which to upload.
        [in]vdipointer to a ktxVulkanDeviceInfo structure providing information about the Vulkan device onto which to load the texture.
        [in,out]vkTexturepointer to a ktxVulkanTexture structure into which the function writes information about the created VkImage.
        [in]tilingtype of tiling to use in the destination image on the Vulkan device.
        [in]usageFlagsa set of VkImageUsageFlags bits indicating the intended usage of the destination image.
        [in]finalLayouta VkImageLayout value indicating the desired final layout of the created image.
        [in]subAllocatorCallbackspointer to a set of suballocator callbacks that wrap around suballocator calls: alloc, bindbuffer, bindimage, map, unmap and free. They use a uint64_t stored in the allocationId field of the structure pointed at by vkTexture to reference allocated page(s).
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + + + +
        KTX_INVALID_VALUEAn incomplete set of callbacks are provided in subAllocatorCallbacks.
        KTX_INVALID_VALUEThis, vdi or vkTexture is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture contains neither images nor an active stream from which to read them.
        KTX_INVALID_OPERATIONThe combination of the ktxTexture's format, tiling and usageFlags is not supported by the physical device.
        KTX_INVALID_OPERATIONRequested mipmap generation is not supported by the physical device for the combination of the ktxTexture's format and tiling.
        KTX_INVALID_OPERATIONNumber of mip levels or array layers exceeds the maximums supported for the ktxTexture's format and tiling.
        KTX_OUT_OF_MEMORYSufficient memory could not be allocated on either the CPU or the Vulkan device.
        KTX_UNSUPPORTED_FEATUREAttempting to sparsely bind KTX textures for the time being will report this error.
        +
        +
        +
        See also
        ktxVulkanDeviceInfo_Construct()
        + +
        +
        + +

        ◆ ktxVulkanDeviceInfo_Construct()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxVulkanDeviceInfo_Construct (ktxVulkanDeviceInfo * This,
        VkPhysicalDevice physicalDevice,
        VkDevice device,
        VkQueue queue,
        VkCommandPool cmdPool,
        const VkAllocationCallbacks * pAllocator )
        +
        + +

        Construct a ktxVulkanDeviceInfo object.

        +

        Records the device information, allocates a command buffer that will be used to transfer image data to the Vulkan device and retrieves the physical device memory properties for ease of use when allocating device memory for the images.

        +

        If VK_IMAGE_TILING_OPTIMAL will be passed to ktxTexture_VkUploadEx(), the family of the queue parameter must support transfers. This is true if any of VK_QUEUE_GRAPHICS_BIT, VK_QUEUE_COMPUTE_BIT or VK_QUEUE_TRANSFER_BIT is set in the queueFlags property of the queue's VkQueueFamilyProperties. If protected memory is being used, i.e queueFlags has the VK_QUEUE_PROTECTED_BIT set, then VK_IMAGE_TILING_OPTIMAL must be passed to ktxTexture_VkUploadEx().

        +

        VkImages created in ktxTexture_VkUploadEx() will have VK_SHARING_MODE_EXCLUSIVE set. Thus the resulting image will be usable only with queues of the same family as queue.

        +

        Pass a valid ktxVulkanDeviceInfo* to any Vulkan KTX image loading function to provide it with the information.

        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + +
        KTX_NOT_FOUNDA dynamically loaded Vulkan function required by the loader was not found.
        KTX_OUT_OF_MEMORYA command buffer could not be allocated.
        +
        +
        +
        See also
        ktxVulkanDeviceInfo_Destruct()
        +
        Parameters
        + + + + + + + +
        Thispointer to the ktxVulkanDeviceInfo object to initialize.
        physicalDevicehandle of the Vulkan physical device.
        devicehandle of the Vulkan logical device.
        queuehandle of the Vulkan queue.
        cmdPoolhandle of the Vulkan command pool.
        pAllocatorpointer to the allocator to use for the image memory. If NULL, the default allocator will be used.
        +
        +
        + +
        +
        + +

        ◆ ktxVulkanDeviceInfo_ConstructEx()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxVulkanDeviceInfo_ConstructEx (ktxVulkanDeviceInfo * This,
        VkInstance instance,
        VkPhysicalDevice physicalDevice,
        VkDevice device,
        VkQueue queue,
        VkCommandPool cmdPool,
        const VkAllocationCallbacks * pAllocator,
        const ktxVulkanFunctions * pFunctions )
        +
        + +

        Construct a ktxVulkanDeviceInfo object.

        +

        Records the device information, allocates a command buffer that will be used to transfer image data to the Vulkan device and retrieves the physical device memory properties for ease of use when allocating device memory for the images.

        +

        If VK_IMAGE_TILING_OPTIMAL will be passed to ktxTexture_VkUploadEx(), the family of the queue parameter must support transfers. This is true if any of VK_QUEUE_GRAPHICS_BIT, VK_QUEUE_COMPUTE_BIT or VK_QUEUE_TRANSFER_BIT is set in the queueFlags property of the queue's VkQueueFamilyProperties. If protected memory is being used, i.e queueFlags has the VK_QUEUE_PROTECTED_BIT set, then VK_IMAGE_TILING_OPTIMAL must be passed to ktxTexture_VkUploadEx().

        +

        VkImages created in ktxTexture_VkUploadEx() will have VK_SHARING_MODE_EXCLUSIVE set. Thus the resulting image will be usable only with queues of the same family as queue.

        +

        Pass a valid ktxVulkanDeviceInfo* to any Vulkan KTX image loading function to provide it with the information.

        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + +
        KTX_NOT_FOUNDA dynamically loaded Vulkan function required by the loader was not found.
        KTX_OUT_OF_MEMORYA command buffer could not be allocated.
        +
        +
        +
        See also
        ktxVulkanDeviceInfo_Destruct()
        +
        Parameters
        + + + + + + + + + +
        Thispointer to the ktxVulkanDeviceInfo object to initialize.
        physicalDevicehandle of the Vulkan physical device.
        devicehandle of the Vulkan logical device.
        queuehandle of the Vulkan queue.
        cmdPoolhandle of the Vulkan command pool.
        pAllocatorpointer to the allocator to use for the image memory. If NULL, the default allocator will be used.
        instancehandle of the Vulkan instance. If VK_NULL_HANDLE, which is not recommended, the function will attempt to initialize the instance-level functions via the platform's standard dynamic library symbol loading mechanisms.
        pFunctionspointer to the struct of functions to use for vulkan operations. Can be NULL in which case the function will retrieve the proc addresses itself.
        +
        +
        + +
        +
        + +

        ◆ ktxVulkanDeviceInfo_Create()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        ktxVulkanDeviceInfo * ktxVulkanDeviceInfo_Create (VkPhysicalDevice physicalDevice,
        VkDevice device,
        VkQueue queue,
        VkCommandPool cmdPool,
        const VkAllocationCallbacks * pAllocator )
        +
        + +

        Create a ktxVulkanDeviceInfo object.

        +

        Allocates CPU memory for a ktxVulkanDeviceInfo object then calls ktxVulkanDeviceInfo_Construct(). See it for documentation of the parameters.

        +
        Returns
        a pointer to the constructed ktxVulkanDeviceInfo.
        +
        See also
        ktxVulkanDeviceInfo_Construct()
        +
        +ktxVulkanDeviceInfo_Destroy()
        + +
        +
        + +

        ◆ ktxVulkanDeviceInfo_CreateEx()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        ktxVulkanDeviceInfo * ktxVulkanDeviceInfo_CreateEx (VkInstance instance,
        VkPhysicalDevice physicalDevice,
        VkDevice device,
        VkQueue queue,
        VkCommandPool cmdPool,
        const VkAllocationCallbacks * pAllocator,
        const ktxVulkanFunctions * pFuncs )
        +
        + +

        Create a ktxVulkanDeviceInfo object.

        +

        Allocates CPU memory for a ktxVulkanDeviceInfo object then calls ktxVulkanDeviceInfo_Construct(). See it for documentation of the parameters.

        +
        Returns
        a pointer to the constructed ktxVulkanDeviceInfo.
        +
        See also
        ktxVulkanDeviceInfo_Construct()
        +
        +ktxVulkanDeviceInfo_Destroy()
        + +
        +
        + +

        ◆ ktxVulkanDeviceInfo_Destroy()

        + +
        +
        + + + + + + + +
        void ktxVulkanDeviceInfo_Destroy (ktxVulkanDeviceInfo * This)
        +
        + +

        Destroy a ktxVulkanDeviceInfo object.

        +

        Calls ktxVulkanDeviceInfo_Destruct() then frees the ktxVulkanDeviceInfo.

        +
        Parameters
        + + +
        Thispointer to the ktxVulkanDeviceInfo to destroy.
        +
        +
        + +
        +
        + +

        ◆ ktxVulkanDeviceInfo_Destruct()

        + +
        +
        + + + + + + + +
        void ktxVulkanDeviceInfo_Destruct (ktxVulkanDeviceInfo * This)
        +
        + +

        Destruct a ktxVulkanDeviceInfo object.

        +

        Frees the command buffer.

        +
        Parameters
        + + +
        Thispointer to the ktxVulkanDeviceInfo to destruct.
        +
        +
        + +
        +
        + +

        ◆ ktxVulkanTexture_Destruct()

        + +
        +
        + + + + + + + + + + + + + + + + +
        void ktxVulkanTexture_Destruct (ktxVulkanTexture * vkTexture,
        VkDevice device,
        const VkAllocationCallbacks * pAllocator )
        +
        + +

        Destructor for the object returned when loading a texture image.

        +

        Calls ktxVulkanTexture_Destruct_WithSuballocator() without a set of suballocator callbacks.

        +
        See also
        ktxVulkanTexture_Destruct_WithSuballocator() for details and use that for complete control.
        + +
        +
        + +

        ◆ ktxVulkanTexture_Destruct_WithSuballocator()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + +
        ktx_error_code_e ktxVulkanTexture_Destruct_WithSuballocator (ktxVulkanTexture * vkTexture,
        VkDevice device,
        const VkAllocationCallbacks * pAllocator,
        ktxVulkanTexture_subAllocatorCallbacks * subAllocatorCallbacks )
        +
        + +

        Destructor for the object returned when loading a texture image.

        +

        Frees the Vulkan resources created when the texture image was loaded. If a complete set of suballocator callbacks are provided, it will use the free call from those instead.

        +
        Parameters
        + + + + + +
        vkTexturepointer to the ktxVulkanTexture to be destructed.
        devicehandle to the Vulkan logical device to which the texture was loaded.
        pAllocatorpointer to the allocator used during loading.
        subAllocatorCallbackspointer to a structure of suballocator callbacks. Pass NULL if a suballocator was not used.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, KTX_INVALID_VALUE if the supplied subAllocatorCallbacks structure is incomplete.
        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/group__ktx__vkloader.js b/ktx/build/docs/html/libktx/group__ktx__vkloader.js new file mode 100644 index 0000000..145c0b3 --- /dev/null +++ b/ktx/build/docs/html/libktx/group__ktx__vkloader.js @@ -0,0 +1,23 @@ +var group__ktx__vkloader = +[ + [ "ktxTexture1::ktxTexture1_GetVkFormat", "group__ktx__vkloader.html#ga11fb504b749453140e04ca69711633d6", null ], + [ "ktxTexture1::ktxTexture1_VkUpload", "group__ktx__vkloader.html#gac70d24bac4ac3b2586836439bbc6592a", null ], + [ "ktxTexture1::ktxTexture1_VkUploadEx", "group__ktx__vkloader.html#gad7840c1eeb618fa1a09fc5a02c07ce87", null ], + [ "ktxTexture1::ktxTexture1_VkUploadEx_WithSuballocator", "group__ktx__vkloader.html#ga4166e5853362cf136f3efe0c527c4c6d", null ], + [ "ktxTexture2::ktxTexture2_GetVkFormat", "group__ktx__vkloader.html#ga7a9baaf3aa2e114c6f6e58fe68051815", null ], + [ "ktxTexture2::ktxTexture2_VkUpload", "group__ktx__vkloader.html#gadf0fba44f518b61acd5d0ae86225ddee", null ], + [ "ktxTexture2::ktxTexture2_VkUploadEx", "group__ktx__vkloader.html#ga265926439e3f9502f248684238e5cc48", null ], + [ "ktxTexture2::ktxTexture2_VkUploadEx_WithSuballocator", "group__ktx__vkloader.html#gacb13edcb651f0a8fb26dab9594ef7dc7", null ], + [ "ktxTexture::ktxTexture_GetVkFormat", "group__ktx__vkloader.html#ga3ef2792fb0cd184636180ae0a540b872", null ], + [ "ktxTexture::ktxTexture_VkUpload", "group__ktx__vkloader.html#ga377a4a2c177956ea661549ee502d60da", null ], + [ "ktxTexture::ktxTexture_VkUploadEx", "group__ktx__vkloader.html#ga153164adbd7307ad1844c3e117faa325", null ], + [ "ktxTexture::ktxTexture_VkUploadEx_WithSuballocator", "group__ktx__vkloader.html#ga8d9b0820e70dd0239b2c1bdc0a7713f7", null ], + [ "ktxVulkanDeviceInfo::ktxVulkanDeviceInfo_Construct", "group__ktx__vkloader.html#ga4bc9f0fa9af93d588276f54fe9a6ba50", null ], + [ "ktxVulkanDeviceInfo::ktxVulkanDeviceInfo_ConstructEx", "group__ktx__vkloader.html#ga3c9d5bc5ac1d0e237ae62fd94c148764", null ], + [ "ktxVulkanDeviceInfo::ktxVulkanDeviceInfo_Create", "group__ktx__vkloader.html#ga82ac7e21e884652c519d9fe28ad5428c", null ], + [ "ktxVulkanDeviceInfo::ktxVulkanDeviceInfo_CreateEx", "group__ktx__vkloader.html#ga5137c2d7e23be51160048b3253abad3c", null ], + [ "ktxVulkanDeviceInfo::ktxVulkanDeviceInfo_Destroy", "group__ktx__vkloader.html#gaaf633943fbf201fb620c0270c6150fa8", null ], + [ "ktxVulkanDeviceInfo::ktxVulkanDeviceInfo_Destruct", "group__ktx__vkloader.html#gae58928740420d1ed3f96fd4b0f2d897e", null ], + [ "ktxVulkanTexture::ktxVulkanTexture_Destruct", "group__ktx__vkloader.html#gaf620a84f6bc59bff03b521e55a654f19", null ], + [ "ktxVulkanTexture::ktxVulkanTexture_Destruct_WithSuballocator", "group__ktx__vkloader.html#ga5a783db9431738b9b18b9fc585183490", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/group__reader.html b/ktx/build/docs/html/libktx/group__reader.html new file mode 100644 index 0000000..01d88ab --- /dev/null +++ b/ktx/build/docs/html/libktx/group__reader.html @@ -0,0 +1,1913 @@ + + + + + + + +libktx Reference: Reader + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Reader
        +
        +
        + +

        Read KTX-formatted data. +More...

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Functions

        KTX_error_code ktxTexture2_DecodeAstc (ktxTexture2 *This)
         Decodes a ktx2 texture object, if it is ASTC encoded.
        KTX_error_code ktxTexture2_TranscodeBasis (ktxTexture2 *This, ktx_transcode_fmt_e outputFormat, ktx_transcode_flags transcodeFlags)
         Transcode a KTX2 texture with BasisLZ/ETC1S or UASTC images.
        KTX_error_code ktxTexture_CreateFromStream (ktxStream *pStream, ktxTextureCreateFlags createFlags, ktxTexture **newTex)
         Create a ktx1 or ktx2 texture according to the stream data.
        KTX_error_code ktxTexture_CreateFromStdioStream (FILE *stdioStream, ktxTextureCreateFlags createFlags, ktxTexture **newTex)
         Create a ktxTexture1 or ktxTexture2 from a stdio stream according to the stream data.
        KTX_error_code ktxTexture_CreateFromNamedFile (const char *const filename, ktxTextureCreateFlags createFlags, ktxTexture **newTex)
         Create a ktxTexture1 or ktxTexture2 from a named KTX file according to the file contents.
        KTX_error_code ktxTexture_CreateFromMemory (const ktx_uint8_t *bytes, ktx_size_t size, ktxTextureCreateFlags createFlags, ktxTexture **newTex)
         Create a ktxTexture1 or ktxTexture2 from KTX-formatted data in memory according to the data contents.
        ktx_uint8_t * ktxTexture_GetData (ktxTexture *This)
         Return a pointer to the texture image data.
        ktx_size_t ktxTexture_GetDataSize (ktxTexture *This)
         Return the total size of the texture image data in bytes.
        ktx_uint32_t ktxTexture_GetElementSize (ktxTexture *This)
         Return the size in bytes of an elements of a texture's images.
        KTX_error_code ktxTexture_IterateLevelFaces (ktxTexture *This, PFNKTXITERCB iterCb, void *userdata)
         Iterate over the levels or faces in a ktxTexture object.
        ktx_uint32_t ktxTexture_GetRowPitch (ktxTexture *This, ktx_uint32_t level)
         Return pitch between rows of a texture image level in bytes.
        KTX_error_code ktxTexture1_CreateFromStdioStream (FILE *stdioStream, ktxTextureCreateFlags createFlags, ktxTexture1 **newTex)
         Create a ktxTexture1 from a stdio stream reading from a KTX source.
        KTX_error_code ktxTexture1_CreateFromNamedFile (const char *const filename, ktxTextureCreateFlags createFlags, ktxTexture1 **newTex)
         Create a ktxTexture1 from a named KTX file.
        KTX_error_code ktxTexture1_CreateFromMemory (const ktx_uint8_t *bytes, ktx_size_t size, ktxTextureCreateFlags createFlags, ktxTexture1 **newTex)
         Create a ktxTexture1 from KTX-formatted data in memory.
        KTX_error_code ktxTexture1_CreateFromStream (ktxStream *pStream, ktxTextureCreateFlags createFlags, ktxTexture1 **newTex)
         Create a ktxTexture1 from KTX-formatted data from a ktxStream.
        void ktxTexture1_Destroy (ktxTexture1 *This)
         Destroy a ktxTexture1 object.
        KTX_error_code ktxTexture1_GetImageOffset (ktxTexture1 *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, ktx_size_t *pOffset)
         Find the offset of an image within a ktxTexture's image data.
        ktx_size_t ktxTexture1_GetDataSizeUncompressed (ktxTexture1 *This)
         Return the total size in bytes of the uncompressed data of a ktxTexture1.
        ktx_size_t ktxTexture1_GetImageSize (ktxTexture1 *This, ktx_uint32_t level)
         Calculate & return the size in bytes of an image at the specified mip level.
        ktx_size_t ktxTexture1_GetLevelSize (ktxTexture1 *This, ktx_uint32_t level)
         Calculate & return the size in bytes of all the images in the specified mip level.
        KTX_error_code ktxTexture1_IterateLevels (ktxTexture1 *This, PFNKTXITERCB iterCb, void *userdata)
         Iterate over the mip levels in a ktxTexture1 object.
        KTX_error_code ktxTexture1_IterateLoadLevelFaces (ktxTexture1 *This, PFNKTXITERCB iterCb, void *userdata)
         Iterate over the images in a ktxTexture1 object while loading the image data.
        KTX_error_code ktxTexture1_LoadImageData (ktxTexture1 *This, ktx_uint8_t *pBuffer, ktx_size_t bufSize)
         Load all the image data from the ktxTexture1's source.
        KTX_error_code ktxTexture2_CreateFromStdioStream (FILE *stdioStream, ktxTextureCreateFlags createFlags, ktxTexture2 **newTex)
         Create a ktxTexture2 from a stdio stream reading from a KTX source.
        KTX_error_code ktxTexture2_CreateFromNamedFile (const char *const filename, ktxTextureCreateFlags createFlags, ktxTexture2 **newTex)
         Create a ktxTexture2 from a named KTX file.
        KTX_error_code ktxTexture2_CreateFromMemory (const ktx_uint8_t *bytes, ktx_size_t size, ktxTextureCreateFlags createFlags, ktxTexture2 **newTex)
         Create a ktxTexture2 from KTX-formatted data in memory.
        KTX_error_code ktxTexture2_CreateFromStream (ktxStream *stream, ktxTextureCreateFlags createFlags, ktxTexture2 **newTex)
         Create a ktxTexture2 from KTX-formatted data from a stream.
        void ktxTexture2_Destroy (ktxTexture2 *This)
         Destroy a ktxTexture2 object.
        void ktxTexture2_GetComponentInfo (ktxTexture2 *This, uint32_t *pNumComponents, uint32_t *pComponentByteLength)
         Return information about the components of an image in a texture.
        ktx_uint32_t ktxTexture2_GetNumComponents (ktxTexture2 *This)
         Return the number of components in an image of the texture.
        KTX_error_code ktxTexture2_GetImageOffset (ktxTexture2 *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, ktx_size_t *pOffset)
         Find the offset of an image within a ktxTexture's image data.
        khr_df_transfer_e ktxTexture2_GetTransferFunction_e (ktxTexture2 *This)
         Retrieve the transfer function of the images.
        khr_df_transfer_e ktxTexture2_GetOETF_e (ktxTexture2 *This)
         Retrieve the transfer function of the images.
        ktx_uint32_t ktxTexture2_GetOETF (ktxTexture2 *This)
         Retrieve the transfer function of the images.
        khr_df_model_e ktxTexture2_GetColorModel_e (ktxTexture2 *This)
         Retrieve the DFD color model of the images.
        ktx_bool_t ktxTexture2_GetPremultipliedAlpha (ktxTexture2 *This)
         Retrieve whether the RGB components have been premultiplied by the alpha component.
        khr_df_primaries_e ktxTexture2_GetPrimaries_e (ktxTexture2 *This)
         Retrieve the color primaries of the images.
        ktx_bool_t ktxTexture2_NeedsTranscoding (ktxTexture2 *This)
         Query if the images are in a transcodable format.
        ktx_size_t ktxTexture2_GetDataSizeUncompressed (ktxTexture2 *This)
         Return the total size in bytes of the uncompressed data of a ktxTexture2.
        ktx_size_t ktxTexture2_GetImageSize (ktxTexture2 *This, ktx_uint32_t level)
         Calculate & return the size in bytes of an image at the specified mip level.
        ktx_size_t ktxTexture2_GetLevelSize (ktxTexture2 *This, ktx_uint32_t level)
         Calculate & return the size in bytes of all the images in the specified mip level.
        KTX_error_code ktxTexture2_IterateLevels (ktxTexture2 *This, PFNKTXITERCB iterCb, void *userdata)
         Iterate over the mip levels in a ktxTexture2 object.
        KTX_error_code ktxTexture2_IterateLoadLevelFaces (ktxTexture2 *This, PFNKTXITERCB iterCb, void *userdata)
         Iterate over the images in a ktxTexture2 object while loading the image data.
        ktx_error_code_e ktxTexture2_LoadImageData (ktxTexture2 *This, ktx_uint8_t *pBuffer, ktx_size_t bufSize)
         Load all the image data from the ktxTexture2's source.
        ktx_error_code_e ktxTexture2_LoadDeflatedImageData (ktxTexture2 *This, ktx_uint8_t *pBuffer, ktx_size_t bufSize)
         Load all the image data from the ktxTexture2's source without inflatiion..
        +

        Detailed Description

        +

        Read KTX-formatted data.

        +

        Function Documentation

        + +

        ◆ ktxTexture1_CreateFromMemory()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_CreateFromMemory (const ktx_uint8_t * bytes,
        ktx_size_t size,
        ktxTextureCreateFlags createFlags,
        ktxTexture1 ** newTex )
        +
        + +

        Create a ktxTexture1 from KTX-formatted data in memory.

        +

        The address of a newly created texture reflecting the contents of the serialized KTX data is written to the location pointed at by newTex.

        +

        The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the ktxTexture1 is ultimately to be uploaded to OpenGL or Vulkan. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer.

        +

        The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used. It is provided solely to enable implementation of the libktx v1 API on top of ktxTexture1.

        +
        Parameters
        + + + + + +
        [in]bytespointer to the memory containing the serialized KTX data.
        [in]sizelength of the KTX data in bytes.
        [in]createFlagsbitmask requesting specific actions during creation.
        [in,out]newTexpointer to a location in which store the address of the newly created texture.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + +
        KTX_INVALID_VALUEEither bytes is NULL or size is 0.
        +
        +
        +

        For other exceptions, see ktxTexture1_CreateFromStdioStream().

        + +
        +
        + +

        ◆ ktxTexture1_CreateFromNamedFile()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_CreateFromNamedFile (const char *const filename,
        ktxTextureCreateFlags createFlags,
        ktxTexture1 ** newTex )
        +
        + +

        Create a ktxTexture1 from a named KTX file.

        +

        The address of a newly created texture reflecting the contents of the file is written to the location pointed at by newTex.

        +

        The file name must be encoded in utf-8. On Windows convert unicode names to utf-8 with WideCharToMultiByte(CP_UTF8, ...) before calling.

        +

        The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the ktxTexture1 is ultimately to be uploaded to OpenGL or Vulkan. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer.

        +

        The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used. It is provided solely to enable implementation of the libktx v1 API on top of ktxTexture1.

        +
        Parameters
        + + + + +
        [in]filenamepointer to a char array containing the file name.
        [in]createFlagsbitmask requesting specific actions during creation.
        [in,out]newTexpointer to a location in which store the address of the newly created texture.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + +
        KTX_FILE_OPEN_FAILEDThe file could not be opened.
        KTX_INVALID_VALUEfilename is NULL.
        +
        +
        +

        For other exceptions, see ktxTexture1_CreateFromStdioStream().

        + +
        +
        + +

        ◆ ktxTexture1_CreateFromStdioStream()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_CreateFromStdioStream (FILE * stdioStream,
        ktxTextureCreateFlags createFlags,
        ktxTexture1 ** newTex )
        +
        + +

        Create a ktxTexture1 from a stdio stream reading from a KTX source.

        +

        The address of a newly created texture reflecting the contents of the stdio stream is written to the location pointed at by newTex.

        +

        The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the ktxTexture1 is ultimately to be uploaded to OpenGL or Vulkan. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer.

        +

        The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used. It is provided solely to enable implementation of the libktx v1 API on top of ktxTexture1.

        +
        Parameters
        + + + + +
        [in]stdioStreamstdio FILE pointer created from the desired file.
        [in]createFlagsbitmask requesting specific actions during creation.
        [in,out]newTexpointer to a location in which store the address of the newly created texture.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + + +
        KTX_INVALID_VALUEnewTex is NULL.
        KTX_FILE_DATA_ERRORSource data is inconsistent with the KTX specification.
        KTX_FILE_READ_ERRORAn error occurred while reading the source.
        KTX_FILE_UNEXPECTED_EOFNot enough data in the source.
        KTX_OUT_OF_MEMORYNot enough memory to create the texture object, load the images or load the key-value data.
        KTX_UNKNOWN_FILE_FORMATThe source is not in KTX format.
        KTX_UNSUPPORTED_TEXTURE_TYPEThe source describes a texture type not supported by OpenGL or Vulkan, e.g, a 3D array.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_CreateFromStream()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_CreateFromStream (ktxStream * pStream,
        ktxTextureCreateFlags createFlags,
        ktxTexture1 ** newTex )
        +
        + +

        Create a ktxTexture1 from KTX-formatted data from a ktxStream.

        +

        The address of a newly created texture reflecting the contents of the serialized KTX data is written to the location pointed at by newTex.

        +

        The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the ktxTexture1 is ultimately to be uploaded to OpenGL or Vulkan. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer.

        +

        The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used. It is provided solely to enable implementation of the libktx v1 API on top of ktxTexture1.

        +
        Parameters
        + + + + +
        [in]pStreampointer to the stream to read KTX data from.
        [in]createFlagsbitmask requesting specific actions during creation.
        [in,out]newTexpointer to a location in which store the address of the newly created texture.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +

        For exceptions, see ktxTexture1_CreateFromStdioStream().

        + +
        +
        + +

        ◆ ktxTexture1_Destroy()

        + +
        +
        + + + + + + + +
        void ktxTexture1_Destroy (ktxTexture1 * This)
        +
        + +

        Destroy a ktxTexture1 object.

        +

        This frees the memory associated with the texture contents and the memory of the ktxTexture1 object. This does not delete any OpenGL or Vulkan texture objects created by ktxTexture1_GLUpload or ktxTexture1_VkUpload.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture1 object to destroy
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_GetDataSizeUncompressed()

        + +
        +
        + + + + + + + +
        ktx_size_t ktxTexture1_GetDataSizeUncompressed (ktxTexture1 * This)
        +
        + +

        Return the total size in bytes of the uncompressed data of a ktxTexture1.

        +

        This always returns the value of This->dataSize. The function is provided for symmetry with ktxTexture2.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture1 object of interest.
        +
        +
        +
        Returns
        The size of the data in the texture.
        + +
        +
        + +

        ◆ ktxTexture1_GetImageOffset()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_GetImageOffset (ktxTexture1 * This,
        ktx_uint32_t level,
        ktx_uint32_t layer,
        ktx_uint32_t faceSlice,
        ktx_size_t * pOffset )
        +
        + +

        Find the offset of an image within a ktxTexture's image data.

        +

        As there is no such thing as a 3D cubemap we make the 3rd location parameter do double duty.

        +
        Parameters
        + + + + + + +
        [in]Thispointer to the ktxTexture object of interest.
        [in]levelmip level of the image.
        [in]layerarray layer of the image.
        [in]faceSlicecube map face or depth slice of the image.
        [in,out]pOffsetpointer to location to store the offset.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + +
        KTX_INVALID_OPERATIONlevel, layer or faceSlice exceed the dimensions of the texture.
        KTX_INVALID_VALIDThis is NULL.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_GetImageSize()

        + +
        +
        + + + + + + + + + + + +
        ktx_size_t ktxTexture1_GetImageSize (ktxTexture1 * This,
        ktx_uint32_t level )
        +
        + +

        Calculate & return the size in bytes of an image at the specified mip level.

        +

        For arrays, this is the size of a layer, for cubemaps, the size of a face and for 3D textures, the size of a depth slice.

        +

        The size reflects the padding of each row to KTX_GL_UNPACK_ALIGNMENT.

        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture1 object of interest.
        [in]levellevel of interest.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_GetLevelSize()

        + +
        +
        + + + + + + + + + + + +
        ktx_size_t ktxTexture1_GetLevelSize (ktxTexture1 * This,
        ktx_uint32_t level )
        +
        + +

        Calculate & return the size in bytes of all the images in the specified mip level.

        +

        For arrays, this is the size of all layers in the level, for cubemaps, the size of all faces in the level and for 3D textures, the size of all depth slices in the level.

        +

        The size reflects the padding of each row to KTX_GL_UNPACK_ALIGNMENT.

        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture1 object of interest.
        [in]levellevel of interest.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_IterateLevels()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_IterateLevels (ktxTexture1 * This,
        PFNKTXITERCB iterCb,
        void * userdata )
        +
        + +

        Iterate over the mip levels in a ktxTexture1 object.

        +

        This is almost identical to ktxTexture_IterateLevelFaces. The difference is that the blocks of image data for non-array cube maps include all faces of a mip level.

        +

        This function works even if This->pData == 0 so it can be used to obtain offsets and sizes for each level by callers who have loaded the data externally.

        +
        Parameters
        + + + + +
        [in]Thishandle of the 1 opened on the data.
        [in,out]iterCbthe address of a callback function which is called with the data for each image block.
        [in,out]userdatathe address of application-specific data which is passed to the callback along with the image data.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error. The following are returned directly by this function. iterCb may return these for other causes or may return additional errors.
        +
        Exceptions
        + + + +
        KTX_FILE_DATA_ERRORMip level sizes are increasing not decreasing
        KTX_INVALID_VALUEThis is NULL or iterCb is NULL.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_IterateLoadLevelFaces()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_IterateLoadLevelFaces (ktxTexture1 * This,
        PFNKTXITERCB iterCb,
        void * userdata )
        +
        + +

        Iterate over the images in a ktxTexture1 object while loading the image data.

        +

        This operates similarly to ktxTexture_IterateLevelFaces except that it loads the images from the ktxTexture1's source to a temporary buffer while iterating. The callback function must copy the image data if it wishes to preserve it as the temporary buffer is reused for each level and is freed when this function exits.

        +

        This function is helpful for reducing memory usage when uploading the data to a graphics API.

        +
        Parameters
        + + + + +
        [in]Thispointer to the ktxTexture1 object of interest.
        [in,out]iterCbthe address of a callback function which is called with the data for each image.
        [in,out]userdatathe address of application-specific data which is passed to the callback along with the image data.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error. The following are returned directly by this function. iterCb may return these for other causes or may return additional errors.
        +
        Exceptions
        + + + + + +
        KTX_FILE_DATA_ERRORmip level sizes are increasing not decreasing
        KTX_INVALID_OPERATIONthe ktxTexture1 was not created from a stream, i.e there is no data to load, or this ktxTexture1's images have already been loaded.
        KTX_INVALID_VALUEThis is NULL or iterCb is NULL.
        KTX_OUT_OF_MEMORYnot enough memory to allocate a block to hold the base level image.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_LoadImageData()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_LoadImageData (ktxTexture1 * This,
        ktx_uint8_t * pBuffer,
        ktx_size_t bufSize )
        +
        + +

        Load all the image data from the ktxTexture1's source.

        +

        The data is loaded into the provided buffer or to an internally allocated buffer, if pBuffer is NULL.

        +
        Parameters
        + + + + +
        [in]Thispointer to the ktxTexture object of interest.
        [in]pBufferpointer to the buffer in which to load the image data.
        [in]bufSizesize of the buffer pointed at by pBuffer.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + +
        KTX_INVALID_VALUEThis is NULL.
        KTX_INVALID_VALUEbufSize is less than the the image data size.
        KTX_INVALID_OPERATIONThe data has already been loaded or the ktxTexture was not created from a KTX source.
        KTX_OUT_OF_MEMORYInsufficient memory for the image data.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_CreateFromMemory()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_CreateFromMemory (const ktx_uint8_t * bytes,
        ktx_size_t size,
        ktxTextureCreateFlags createFlags,
        ktxTexture2 ** newTex )
        +
        + +

        Create a ktxTexture2 from KTX-formatted data in memory.

        +

        The address of a newly created ktxTexture2 reflecting the contents of the serialized KTX data is written to the location pointed at by newTex.

        +

        The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the ktxTexture is ultimately to be uploaded to OpenGL or Vulkan. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer.

        +

        The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used. It is provided solely to enable implementation of the libktx v1 API on top of ktxTexture.

        +
        Parameters
        + + + + + +
        [in]bytespointer to the memory containing the serialized KTX data.
        [in]sizelength of the KTX data in bytes.
        [in]createFlagsbitmask requesting specific actions during creation.
        [in,out]newTexpointer to a location in which store the address of the newly created texture.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + +
        KTX_INVALID_VALUEEither bytes is NULL or size is 0.
        +
        +
        +

        For other exceptions, see ktxTexture2_CreateFromStdioStream().

        + +
        +
        + +

        ◆ ktxTexture2_CreateFromNamedFile()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_CreateFromNamedFile (const char *const filename,
        ktxTextureCreateFlags createFlags,
        ktxTexture2 ** newTex )
        +
        + +

        Create a ktxTexture2 from a named KTX file.

        +

        The address of a newly created ktxTexture2 reflecting the contents of the file is written to the location pointed at by newTex.

        +

        The file name must be encoded in utf-8. On Windows convert unicode names to utf-8 with WideCharToMultiByte(CP_UTF8, ...) before calling.

        +

        The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the ktxTexture is ultimately to be uploaded to OpenGL or Vulkan. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer.

        +

        The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used. It is provided solely to enable implementation of the libktx v1 API on top of ktxTexture.

        +
        Parameters
        + + + + +
        [in]filenamepointer to a char array containing the file name.
        [in]createFlagsbitmask requesting specific actions during creation.
        [in,out]newTexpointer to a location in which store the address of the newly created texture.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + +
        KTX_FILE_OPEN_FAILEDThe file could not be opened.
        KTX_INVALID_VALUEfilename is NULL.
        +
        +
        +

        For other exceptions, see ktxTexture2_CreateFromStdioStream().

        + +
        +
        + +

        ◆ ktxTexture2_CreateFromStdioStream()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_CreateFromStdioStream (FILE * stdioStream,
        ktxTextureCreateFlags createFlags,
        ktxTexture2 ** newTex )
        +
        + +

        Create a ktxTexture2 from a stdio stream reading from a KTX source.

        +

        The address of a newly created ktxTexture2 reflecting the contents of the stdio stream is written to the location pointed at by newTex.

        +

        The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the ktxTexture is ultimately to be uploaded to OpenGL or Vulkan. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer.

        +

        The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used. It is provided solely to enable implementation of the libktx v1 API on top of ktxTexture.

        +
        Parameters
        + + + + +
        [in]stdioStreamstdio FILE pointer created from the desired file.
        [in]createFlagsbitmask requesting specific actions during creation.
        [in,out]newTexpointer to a location in which store the address of the newly created texture.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + + +
        KTX_INVALID_VALUEnewTex is NULL.
        KTX_FILE_DATA_ERRORSource data is inconsistent with the KTX specification.
        KTX_FILE_READ_ERRORAn error occurred while reading the source.
        KTX_FILE_UNEXPECTED_EOFNot enough data in the source.
        KTX_OUT_OF_MEMORYNot enough memory to create the texture object, load the images or load the key-value data.
        KTX_UNKNOWN_FILE_FORMATThe source is not in KTX format.
        KTX_UNSUPPORTED_TEXTURE_TYPEThe source describes a texture type not supported by OpenGL or Vulkan, e.g, a 3D array.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_CreateFromStream()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_CreateFromStream (ktxStream * stream,
        ktxTextureCreateFlags createFlags,
        ktxTexture2 ** newTex )
        +
        + +

        Create a ktxTexture2 from KTX-formatted data from a stream.

        +

        The address of a newly created ktxTexture2 reflecting the contents of the serialized KTX data is written to the location pointed at by newTex.

        +

        The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the ktxTexture is ultimately to be uploaded to OpenGL or Vulkan. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer.

        +

        The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used. It is provided solely to enable implementation of the libktx v1 API on top of ktxTexture.

        +
        Parameters
        + + + + +
        [in]streampointer to the stream to read KTX data from.
        [in]createFlagsbitmask requesting specific actions during creation.
        [in,out]newTexpointer to a location in which store the address of the newly created texture.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + +
        KTX_INVALID_VALUEEither bytes is NULL or size is 0.
        +
        +
        +

        For other exceptions, see ktxTexture2_CreateFromStdioStream().

        + +
        +
        + +

        ◆ ktxTexture2_DecodeAstc()

        + +
        +
        + + + + + + + +
        KTX_error_code ktxTexture2_DecodeAstc (ktxTexture2 * This)
        +
        + +

        Decodes a ktx2 texture object, if it is ASTC encoded.

        +

        The decompressed format is calculated from corresponding ASTC format. There are only 3 possible options currently supported. RGBA8, SRGBA8 and RGBA32.

        Note
        3d textures are decoded to a multi-slice 3d texture.
        +

        Updates This with the decoded image.

        +
        Parameters
        + + +
        ThisThe texture to decode
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + + +
        KTX_FILE_DATA_ERRORDFD is incorrect: supercompression scheme or sample's channelId do not match ASTC colorModel.
        KTX_INVALID_OPERATIONThe texture's images are not in ASTC format.
        KTX_INVALID_OPERATIONThe texture object does not contain any data.
        KTX_INVALID_OPERATIONASTC decoder failed to decompress image. Possibly due to incorrect floating point compilation settings. Should not happen in release package.
        KTX_OUT_OF_MEMORYNot enough memory to carry out decoding.
        KTX_UNSUPPORTED_FEATUREThe texture's images are supercompressed with an unsupported scheme.
        KTX_UNSUPPORTED_FEATUREASTC encoder not compiled with enough capacity for requested block size. Should not happen in release package.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_Destroy()

        + +
        +
        + + + + + + + +
        void ktxTexture2_Destroy (ktxTexture2 * This)
        +
        + +

        Destroy a ktxTexture2 object.

        +

        This frees the memory associated with the texture contents and the memory of the ktxTexture2 object. This does not delete any OpenGL or Vulkan texture objects created by ktxTexture2_GLUpload or ktxTexture2_VkUpload.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture2 object to destroy
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_GetColorModel_e()

        + +
        +
        + + + + + + + +
        khr_df_model_e ktxTexture2_GetColorModel_e (ktxTexture2 * This)
        +
        + +

        Retrieve the DFD color model of the images.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        +
        +
        +
        Returns
        A khr_df_transfer enum value specifying the color model.
        + +
        +
        + +

        ◆ ktxTexture2_GetComponentInfo()

        + +
        +
        + + + + + + + + + + + + + + + + +
        void ktxTexture2_GetComponentInfo (ktxTexture2 * This,
        uint32_t * pNumComponents,
        uint32_t * pComponentByteLength )
        +
        + +

        Return information about the components of an image in a texture.

        +
        Parameters
        + + + + +
        [in]Thispointer to the ktxTexture object of interest.
        [in,out]pNumComponentspointer to location in which to write the number of components in the textures images.
        [in,out]pComponentByteLengthpointer to the location in which to write byte length of a component.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_GetDataSizeUncompressed()

        + +
        +
        + + + + + + + +
        ktx_size_t ktxTexture2_GetDataSizeUncompressed (ktxTexture2 * This)
        +
        + +

        Return the total size in bytes of the uncompressed data of a ktxTexture2.

        +

        If supercompressionScheme == KTX_SS_NONE or KTX_SS_BASIS_LZ, returns the value of This->dataSize else if supercompressionScheme == KTX_SS_ZSTD or KTX_SS_ZLIB, it returns the sum of the uncompressed sizes of each mip level plus space for the level padding. With no supercompression the data size and uncompressed data size are the same. For Basis supercompression the uncompressed size cannot be known until the data is transcoded so the compressed size is returned.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture1 object of interest.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_GetImageOffset()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_GetImageOffset (ktxTexture2 * This,
        ktx_uint32_t level,
        ktx_uint32_t layer,
        ktx_uint32_t faceSlice,
        ktx_size_t * pOffset )
        +
        + +

        Find the offset of an image within a ktxTexture's image data.

        +

        As there is no such thing as a 3D cubemap we make the 3rd location parameter do double duty. Only works for non-supercompressed textures as there is no way to tell where an image is for a supercompressed one.

        +
        Parameters
        + + + + + + +
        [in]Thispointer to the ktxTexture object of interest.
        [in]levelmip level of the image.
        [in]layerarray layer of the image.
        [in]faceSlicecube map face or depth slice of the image.
        [in,out]pOffsetpointer to location to store the offset.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + +
        KTX_INVALID_OPERATIONlevel, layer or faceSlice exceed the dimensions of the texture.
        KTX_INVALID_OPERATIONTexture is supercompressed.
        KTX_INVALID_VALIDThis is NULL.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_GetImageSize()

        + +
        +
        + + + + + + + + + + + +
        ktx_size_t ktxTexture2_GetImageSize (ktxTexture2 * This,
        ktx_uint32_t level )
        +
        + +

        Calculate & return the size in bytes of an image at the specified mip level.

        +

        For arrays, this is the size of a layer, for cubemaps, the size of a face and for 3D textures, the size of a depth slice.

        +

        The size reflects the padding of each row to KTX_GL_UNPACK_ALIGNMENT.

        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        [in]levellevel of interest. *
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_GetLevelSize()

        + +
        +
        + + + + + + + + + + + +
        ktx_size_t ktxTexture2_GetLevelSize (ktxTexture2 * This,
        ktx_uint32_t level )
        +
        + +

        Calculate & return the size in bytes of all the images in the specified mip level.

        +

        For arrays, this is the size of all layers in the level, for cubemaps, the size of all faces in the level and for 3D textures, the size of all depth slices in the level.

        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        [in]levellevel of interest. *
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_GetNumComponents()

        + +
        +
        + + + + + + + +
        ktx_uint32_t ktxTexture2_GetNumComponents (ktxTexture2 * This)
        +
        + +

        Return the number of components in an image of the texture.

        +

        Returns the number of components indicated by the DFD's sample information in accordance with the color model. For uncompressed formats it will be the actual number of components in the image. For block-compressed formats, it will be 1 or 2 according to the format's DFD color model. For Basis compressed textures, the function examines the ids of the channels indicated by the DFD and uses that information to determine and return the number of components in the image before encoding and deflation so it can be used to help choose a suitable transcode target format.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture object of interest.
        +
        +
        +
        Returns
        the number of components.
        + +
        +
        + +

        ◆ ktxTexture2_GetOETF()

        + +
        +
        + + + + + + + +
        ktx_uint32_t ktxTexture2_GetOETF (ktxTexture2 * This)
        +
        + +

        Retrieve the transfer function of the images.

        +
        Deprecated
        Use ktxTexture2_GetTransferFunction_e.
        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        +
        +
        +
        Returns
        A khr_df_transfer enum value specifying the transfer function, returned as ktx_uint32_t.
        + +
        +
        + +

        ◆ ktxTexture2_GetOETF_e()

        + +
        +
        + + + + + + + +
        khr_df_transfer_e ktxTexture2_GetOETF_e (ktxTexture2 * This)
        +
        + +

        Retrieve the transfer function of the images.

        +
        Deprecated
        Use ktxTexture2_GetTransferFunction_e. Now that the KTX specification allows setting of non-linear transfer functions other than sRGB, it is possible for the transfer function to be an EOTF so this name is no longer appropriate.
        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        +
        +
        +
        Returns
        A khr_df_transfer enum value specifying the transfer function.
        + +
        +
        + +

        ◆ ktxTexture2_GetPremultipliedAlpha()

        + +
        +
        + + + + + + + +
        ktx_bool_t ktxTexture2_GetPremultipliedAlpha (ktxTexture2 * This)
        +
        + +

        Retrieve whether the RGB components have been premultiplied by the alpha component.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        +
        +
        +
        Returns
        KTX_TRUE if the components are premultiplied, KTX_FALSE otherwise.
        + +
        +
        + +

        ◆ ktxTexture2_GetPrimaries_e()

        + +
        +
        + + + + + + + +
        khr_df_primaries_e ktxTexture2_GetPrimaries_e (ktxTexture2 * This)
        +
        + +

        Retrieve the color primaries of the images.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        +
        +
        +
        Returns
        A khr_df_primaries enum value specifying the primaries.
        + +
        +
        + +

        ◆ ktxTexture2_GetTransferFunction_e()

        + +
        +
        + + + + + + + +
        khr_df_transfer_e ktxTexture2_GetTransferFunction_e (ktxTexture2 * This)
        +
        + +

        Retrieve the transfer function of the images.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        +
        +
        +
        Returns
        A khr_df_transfer enum value specifying the transfer function.
        + +
        +
        + +

        ◆ ktxTexture2_IterateLevels()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_IterateLevels (ktxTexture2 * This,
        PFNKTXITERCB iterCb,
        void * userdata )
        +
        + +

        Iterate over the mip levels in a ktxTexture2 object.

        +

        This is almost identical to ktxTexture_IterateLevelFaces(). The difference is that the blocks of image data for non-array cube maps include all faces of a mip level.

        +

        This function works even if This->pData == 0 so it can be used to obtain offsets and sizes for each level by callers who have loaded the data externally.

        +

        Intended for use only when supercompressionScheme == SUPERCOMPRESSION_NONE.

        +
        Parameters
        + + + + +
        [in]Thishandle of the ktxTexture opened on the data.
        [in,out]iterCbthe address of a callback function which is called with the data for each image block.
        [in,out]userdatathe address of application-specific data which is passed to the callback along with the image data.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error. The following are returned directly by this function. iterCb may return these for other causes or may return additional errors.
        +
        Exceptions
        + + + + +
        KTX_FILE_DATA_ERRORMip level sizes are increasing not decreasing
        KTX_INVALID_OPERATIONsupercompressionScheme != SUPERCOMPRESSION_NONE.
        KTX_INVALID_VALUEThis is NULL or iterCb is NULL.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_IterateLoadLevelFaces()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_IterateLoadLevelFaces (ktxTexture2 * This,
        PFNKTXITERCB iterCb,
        void * userdata )
        +
        + +

        Iterate over the images in a ktxTexture2 object while loading the image data.

        +

        This operates similarly to ktxTexture_IterateLevelFaces() except that it loads the images from the ktxTexture2's source to a temporary buffer while iterating. If supercompressionScheme == KTX_SS_ZSTD or KTX_SS_ZLIB, it will inflate the data before passing it to the callback. The callback function must copy the image data if it wishes to preserve it as the temporary buffer is reused for each level and is freed when this function exits.

        +

        This function is helpful for reducing memory usage when uploading the data to a graphics API.

        +

        Intended for use only when supercompressionScheme == KTX_SS_NONE, KTX_SS_ZSTD or KTX_SS_ZLIB. As there is no access to the ktxTexture's data on conclusion of this function, destroying the texture on completion is recommended.

        +
        Parameters
        + + + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        [in,out]iterCbthe address of a callback function which is called with the data for each image.
        [in,out]userdatathe address of application-specific data which is passed to the callback along with the image data.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error. The following are returned directly by this function. iterCb may return these for other causes or may return additional errors.
        +
        Exceptions
        + + + + + + +
        KTX_FILE_DATA_ERRORmip level sizes are increasing not decreasing
        KTX_INVALID_OPERATIONthe ktxTexture2 was not created from a stream, i.e there is no data to load, or this ktxTexture2's images have already been loaded.
        KTX_INVALID_OPERATIONsupercompressionScheme != KTX_SS_NONE, supercompressionScheme != KTX_SS_ZSTD, and supercompressionScheme != KTX_SS_ZLIB.
        KTX_INVALID_VALUEThis is NULL or iterCb is NULL.
        KTX_OUT_OF_MEMORYnot enough memory to allocate a block to hold the base level image.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_LoadDeflatedImageData()

        + +
        +
        + + + + + + + + + + + + + + + + +
        ktx_error_code_e ktxTexture2_LoadDeflatedImageData (ktxTexture2 * This,
        ktx_uint8_t * pBuffer,
        ktx_size_t bufSize )
        +
        + +

        Load all the image data from the ktxTexture2's source without inflatiion..

        +

        The data will be not be inflated if supercompressionScheme == KTX_SS_ZSTD or KTX_SS_ZLIB. This function is provided to support some rare testing scenarios. Generally use of ktxTexture2_LoadImageData is highly recommended. For supercompressionScheme values other than those mentioned, the result of this function is the same as ktxTexture2_LoadImageData.

        +

        The data is loaded into the provided buffer or to an internally allocated buffer, if pBuffer is NULL.

        +
        Parameters
        + + + + +
        [in]Thispointer to the ktxTexture object of interest.
        [in]pBufferpointer to the buffer in which to load the image data.
        [in]bufSizesize of the buffer pointed at by pBuffer.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + +
        KTX_INVALID_VALUEThis is NULL.
        KTX_INVALID_VALUEbufSize is less than the the image data size.
        KTX_INVALID_OPERATIONThe data has already been loaded or the ktxTexture was not created from a KTX source.
        KTX_OUT_OF_MEMORYInsufficient memory for the image data.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_LoadImageData()

        + +
        +
        + + + + + + + + + + + + + + + + +
        ktx_error_code_e ktxTexture2_LoadImageData (ktxTexture2 * This,
        ktx_uint8_t * pBuffer,
        ktx_size_t bufSize )
        +
        + +

        Load all the image data from the ktxTexture2's source.

        +

        The data will be inflated if supercompressionScheme == KTX_SS_ZSTD or KTX_SS_ZLIB. The data is loaded into the provided buffer or to an internally allocated buffer, if pBuffer is NULL. Callers providing their own buffer must ensure the buffer large enough to hold the inflated data for files deflated with Zstd or ZLIB. See ktxTexture2_GetDataSizeUncompressed().

        +

        The texture's levelIndex, dataSize, DFD and supercompressionScheme will all be updated after successful inflation to reflect the inflated data.

        +
        Parameters
        + + + + +
        [in]Thispointer to the ktxTexture object of interest.
        [in]pBufferpointer to the buffer in which to load the image data.
        [in]bufSizesize of the buffer pointed at by pBuffer.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + +
        KTX_INVALID_VALUEThis is NULL.
        KTX_INVALID_VALUEbufSize is less than the the image data size.
        KTX_INVALID_OPERATIONThe data has already been loaded or the ktxTexture was not created from a KTX source.
        KTX_OUT_OF_MEMORYInsufficient memory for the image data.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_NeedsTranscoding()

        + +
        +
        + + + + + + + +
        ktx_bool_t ktxTexture2_NeedsTranscoding (ktxTexture2 * This)
        +
        + +

        Query if the images are in a transcodable format.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_TranscodeBasis()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_TranscodeBasis (ktxTexture2 * This,
        ktx_transcode_fmt_e outputFormat,
        ktx_transcode_flags transcodeFlags )
        +
        + +

        Transcode a KTX2 texture with BasisLZ/ETC1S or UASTC images.

        +

        If the texture contains BasisLZ supercompressed images, Inflates them from back to ETC1S then transcodes them to the specified block-compressed format. If the texture contains UASTC images, inflates them, if they have been supercompressed with zstd, then transcodes then to the specified format, The transcoded images replace the original images and the texture's fields including the DFD are modified to reflect the new format.

        +

        These types of textures must be transcoded to a desired target block-compressed format before they can be uploaded to a GPU via a graphics API.

        +

        The following block compressed transcode targets are available: KTX_TTF_ETC1_RGB, KTX_TTF_ETC2_RGBA, KTX_TTF_BC1_RGB, KTX_TTF_BC3_RGBA, KTX_TTF_BC4_R, KTX_TTF_BC5_RG, KTX_TTF_BC7_RGBA, KTX_TTF_PVRTC1_4_RGB, KTX_TTF_PVRTC1_4_RGBA, KTX_TTF_PVRTC2_4_RGB, KTX_TTF_PVRTC2_4_RGBA, KTX_TTF_ASTC_4x4_RGBA, KTX_TTF_ETC2_EAC_R11, KTX_TTF_ETC2_EAC_RG11, KTX_TTF_ETC and KTX_TTF_BC1_OR_3.

        +

        KTX_TTF_ETC automatically selects between KTX_TTF_ETC1_RGB and KTX_TTF_ETC2_RGBA according to whether an alpha channel is available. KTX_TTF_BC1_OR_3 does likewise between KTX_TTF_BC1_RGB and KTX_TTF_BC3_RGBA. Note that if KTX_TTF_PVRTC1_4_RGBA or KTX_TTF_PVRTC2_4_RGBA is specified and there is no alpha channel KTX_TTF_PVRTC1_4_RGB or KTX_TTF_PVRTC2_4_RGB respectively will be selected.

        +

        Transcoding to ATC & FXT1 formats is not supported by libktx as there are no equivalent Vulkan formats.

        +

        The following uncompressed transcode targets are also available: KTX_TTF_RGBA32, KTX_TTF_RGB565, KTX_TTF_BGR565 and KTX_TTF_RGBA4444.

        +

        The following transcodeFlags are available.

        +
        See also
        ktxtexture2_CompressBasis().
        +
        Parameters
        + + + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        [in]outputFormata value from the ktx_texture_transcode_fmt_e enum specifying the target format.
        [in]transcodeFlagsbitfield of flags modifying the transcode operation.
        +
        +
        +
        See also
        ktx_texture_decode_flags_e.
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + + + + +
        KTX_FILE_DATA_ERRORSupercompression global data is corrupted.
        KTX_INVALID_OPERATIONThe texture's format is not transcodable (not ETC1S/BasisLZ or UASTC).
        KTX_INVALID_OPERATIONSupercompression global data is missing, i.e., the texture object is invalid.
        KTX_INVALID_OPERATIONImage data is missing, i.e., the texture object is invalid.
        KTX_INVALID_OPERATIONoutputFormat is PVRTC1 but the texture does does not have power-of-two dimensions.
        KTX_INVALID_VALUEoutputFormat is invalid.
        KTX_TRANSCODE_FAILEDSomething went wrong during transcoding.
        KTX_UNSUPPORTED_FEATUREKTX_TF_PVRTC_DECODE_TO_NEXT_POW2 was requested or the specified transcode target has not been included in the library being used.
        KTX_OUT_OF_MEMORYNot enough memory to carry out transcoding.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture_CreateFromMemory()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture_CreateFromMemory (const ktx_uint8_t * bytes,
        ktx_size_t size,
        ktxTextureCreateFlags createFlags,
        ktxTexture ** newTex )
        +
        + +

        Create a ktxTexture1 or ktxTexture2 from KTX-formatted data in memory according to the data contents.

        +

        See ktxTexture1_CreateFromMemory or ktxTexture2_CreateFromMemory for details.

        + +
        +
        + +

        ◆ ktxTexture_CreateFromNamedFile()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture_CreateFromNamedFile (const char *const filename,
        ktxTextureCreateFlags createFlags,
        ktxTexture ** newTex )
        +
        + +

        Create a ktxTexture1 or ktxTexture2 from a named KTX file according to the file contents.

        +

        See ktxTexture1_CreateFromNamedFile or ktxTexture2_CreateFromNamedFile for details.

        + +
        +
        + +

        ◆ ktxTexture_CreateFromStdioStream()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture_CreateFromStdioStream (FILE * stdioStream,
        ktxTextureCreateFlags createFlags,
        ktxTexture ** newTex )
        +
        + +

        Create a ktxTexture1 or ktxTexture2 from a stdio stream according to the stream data.

        +

        See ktxTexture1_CreateFromStdioStream or ktxTexture2_CreateFromStdioStream for details.

        + +
        +
        + +

        ◆ ktxTexture_CreateFromStream()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture_CreateFromStream (ktxStream * pStream,
        ktxTextureCreateFlags createFlags,
        ktxTexture ** newTex )
        +
        + +

        Create a ktx1 or ktx2 texture according to the stream data.

        +

        See ktxTexture1_CreateFromStream or ktxTexture2_CreateFromStream for details.

        + +
        +
        + +

        ◆ ktxTexture_GetData()

        + +
        +
        + + + + + + + +
        ktx_uint8_t * ktxTexture_GetData (ktxTexture * This)
        +
        + +

        Return a pointer to the texture image data.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture object of interest.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture_GetDataSize()

        + +
        +
        + + + + + + + +
        ktx_size_t ktxTexture_GetDataSize (ktxTexture * This)
        +
        + +

        Return the total size of the texture image data in bytes.

        +

        For a ktxTexture2 with supercompressionScheme != KTX_SS_NONE this will return the deflated size of the data.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture object of interest.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture_GetElementSize()

        + +
        +
        + + + + + + + +
        ktx_uint32_t ktxTexture_GetElementSize (ktxTexture * This)
        +
        + +

        Return the size in bytes of an elements of a texture's images.

        +

        For uncompressed textures an element is one texel. For compressed textures it is one block.

        +
        Parameters
        + + +
        [in]Thispointer to the ktxTexture object of interest.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture_GetRowPitch()

        + +
        +
        + + + + + + + + + + + +
        ktx_uint32_t ktxTexture_GetRowPitch (ktxTexture * This,
        ktx_uint32_t level )
        +
        + +

        Return pitch between rows of a texture image level in bytes.

        +

        For uncompressed textures the pitch is the number of bytes between rows of texels. For compressed textures it is the number of bytes between rows of blocks. The value is padded to GL_UNPACK_ALIGNMENT, if necessary. For all currently known compressed formats padding will not be necessary.

        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture object of interest.
        [in]levellevel of interest.
        +
        +
        +
        Returns
        the row pitch in bytes.
        + +
        +
        + +

        ◆ ktxTexture_IterateLevelFaces()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture_IterateLevelFaces (ktxTexture * This,
        PFNKTXITERCB iterCb,
        void * userdata )
        +
        + +

        Iterate over the levels or faces in a ktxTexture object.

        +

        Blocks of image data are passed to an application-supplied callback function. This is not a strict per-image iteration. Rather it reflects how OpenGL needs the images. For most textures the block of data includes all images of a mip level which implies all layers of an array. However, for non-array cube map textures the block is a single face of the mip level, i.e the callback is called once for each face.

        +

        This function works even if This->pData == 0 so it can be used to obtain offsets and sizes for each level by callers who have loaded the data externally.

        +
        Parameters
        + + + + +
        [in]Thispointer to the ktxTexture object of interest.
        [in,out]iterCbthe address of a callback function which is called with the data for each image block.
        [in,out]userdatathe address of application-specific data which is passed to the callback along with the image data.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error. The following are returned directly by this function. iterCb may return these for other causes or may return additional errors.
        +
        Exceptions
        + + + +
        KTX_FILE_DATA_ERRORMip level sizes are increasing not decreasing
        KTX_INVALID_VALUEThis is NULL or iterCb is NULL.
        +
        +
        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/group__reader.js b/ktx/build/docs/html/libktx/group__reader.js new file mode 100644 index 0000000..7b97cc9 --- /dev/null +++ b/ktx/build/docs/html/libktx/group__reader.js @@ -0,0 +1,48 @@ +var group__reader = +[ + [ "ktxTexture1::ktxTexture1_CreateFromMemory", "group__reader.html#ga1f289eb80601208b79561804d2ec0121", null ], + [ "ktxTexture1::ktxTexture1_CreateFromNamedFile", "group__reader.html#ga0319d9a33d3ea78da2ef786205f2a956", null ], + [ "ktxTexture1::ktxTexture1_CreateFromStdioStream", "group__reader.html#ga4557b9714b41e7c575d295b65e19ed12", null ], + [ "ktxTexture1::ktxTexture1_CreateFromStream", "group__reader.html#ga2e9c9d8a1c02732c87db733d3449b337", null ], + [ "ktxTexture1::ktxTexture1_Destroy", "group__reader.html#gaa616363178ec37996459219a6925f87d", null ], + [ "ktxTexture1::ktxTexture1_GetDataSizeUncompressed", "group__reader.html#ga65cd751a3d1a6eed97cb19b7a88d736c", null ], + [ "ktxTexture1::ktxTexture1_GetImageOffset", "group__reader.html#ga2c471eb79f1ac62d63cae86ca6c519bf", null ], + [ "ktxTexture1::ktxTexture1_GetImageSize", "group__reader.html#gac1dc0703bc613180a92a8e1c5901dd50", null ], + [ "ktxTexture1::ktxTexture1_GetLevelSize", "group__reader.html#ga8a1bf5e13f88af082585a875e85dfdeb", null ], + [ "ktxTexture1::ktxTexture1_IterateLevels", "group__reader.html#ga400a2581bf935beb6c0192a6e9844914", null ], + [ "ktxTexture1::ktxTexture1_IterateLoadLevelFaces", "group__reader.html#gab56e28f79781acf2933e36c21823c0df", null ], + [ "ktxTexture1::ktxTexture1_LoadImageData", "group__reader.html#ga7334feb062f32b62159cebd6e4b28d16", null ], + [ "ktxTexture2::ktxTexture2_CreateFromMemory", "group__reader.html#ga6805a144f0bfd17b51d46fb28b0786a5", null ], + [ "ktxTexture2::ktxTexture2_CreateFromNamedFile", "group__reader.html#ga8680560274b31da6f3f07ee911055431", null ], + [ "ktxTexture2::ktxTexture2_CreateFromStdioStream", "group__reader.html#gae9de7e23ffe3ae3aeed4cc95c61699e4", null ], + [ "ktxTexture2::ktxTexture2_CreateFromStream", "group__reader.html#ga1e865473d23f82fc22a16bb3eadf60ed", null ], + [ "ktxTexture2_DecodeAstc", "group__reader.html#gaea0edab86daca9c288d4cd6b47b34e28", null ], + [ "ktxTexture2::ktxTexture2_Destroy", "group__reader.html#ga01ec49abe73b77f2f8db99b5d9cf46d9", null ], + [ "ktxTexture2::ktxTexture2_GetColorModel_e", "group__reader.html#ga7200d548b480a3abb69c206f530c0669", null ], + [ "ktxTexture2::ktxTexture2_GetComponentInfo", "group__reader.html#gad3aab08fa013c602fc055964e78c7566", null ], + [ "ktxTexture2::ktxTexture2_GetDataSizeUncompressed", "group__reader.html#gaefcaf84425830ba095eb670a275dad34", null ], + [ "ktxTexture2::ktxTexture2_GetImageOffset", "group__reader.html#gab29978f318436c009ae45b7d3c515f8e", null ], + [ "ktxTexture2::ktxTexture2_GetImageSize", "group__reader.html#gaa4b800f418f57b10737ac6533f1769d2", null ], + [ "ktxTexture2::ktxTexture2_GetLevelSize", "group__reader.html#gac344745350aff9cf5bcc2969729b7f0e", null ], + [ "ktxTexture2::ktxTexture2_GetNumComponents", "group__reader.html#gacc7762adb6ff311ca65cfe5ed89db21e", null ], + [ "ktxTexture2::ktxTexture2_GetOETF", "group__reader.html#gac1b0eccd69f541450ed88da2ad260dcc", null ], + [ "ktxTexture2::ktxTexture2_GetOETF_e", "group__reader.html#gaddf6746c18d970a238e89bb9b8e13e77", null ], + [ "ktxTexture2::ktxTexture2_GetPremultipliedAlpha", "group__reader.html#gab773b3ad45bacb6f487b62c4b0a07fcf", null ], + [ "ktxTexture2::ktxTexture2_GetPrimaries_e", "group__reader.html#gac7323c6f9fe75f442484392506b2024b", null ], + [ "ktxTexture2::ktxTexture2_GetTransferFunction_e", "group__reader.html#ga37cd5b4ae9ee373d825197dc8998d0bb", null ], + [ "ktxTexture2::ktxTexture2_IterateLevels", "group__reader.html#ga1b47270a151b67615aed9eeca5f25bf7", null ], + [ "ktxTexture2::ktxTexture2_IterateLoadLevelFaces", "group__reader.html#gaf57628ec7f9a554b46ba84ab9c214bab", null ], + [ "ktxTexture2::ktxTexture2_LoadDeflatedImageData", "group__reader.html#gaa1f681c144baa70ef9af6db4c7333b3c", null ], + [ "ktxTexture2::ktxTexture2_LoadImageData", "group__reader.html#ga032b7f1926861c8b40655527b84f5533", null ], + [ "ktxTexture2::ktxTexture2_NeedsTranscoding", "group__reader.html#gade1ffc5d31c2f9b5f1e861b59e7619ce", null ], + [ "ktxTexture2::ktxTexture2_TranscodeBasis", "group__reader.html#ga90cc33928a2dae962fb94b3fa2f6575d", null ], + [ "ktxTexture::ktxTexture_CreateFromMemory", "group__reader.html#gaf1e401967a687b40cdf7bba11e72c2b4", null ], + [ "ktxTexture::ktxTexture_CreateFromNamedFile", "group__reader.html#ga57a1ce0d3f2d66439463160d6ce9d2d0", null ], + [ "ktxTexture::ktxTexture_CreateFromStdioStream", "group__reader.html#ga180d93562cc6af30c61adf8f6a8fd827", null ], + [ "ktxTexture::ktxTexture_CreateFromStream", "group__reader.html#gaa8dfc7a981b69d26eab73c5405d7182b", null ], + [ "ktxTexture::ktxTexture_GetData", "group__reader.html#gace44d98fa78b94c282016e7cf8a88b7e", null ], + [ "ktxTexture::ktxTexture_GetDataSize", "group__reader.html#ga553c3438e75628c6d7e2280989e539c4", null ], + [ "ktxTexture::ktxTexture_GetElementSize", "group__reader.html#ga19d8786eea0e62ab55d945bff838d32c", null ], + [ "ktxTexture::ktxTexture_GetRowPitch", "group__reader.html#gacf9e393ff766982ccb79ad915975971f", null ], + [ "ktxTexture::ktxTexture_IterateLevelFaces", "group__reader.html#gae7c4b8bbe26379f2076f93050c0673c1", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/group__writer.html b/ktx/build/docs/html/libktx/group__writer.html new file mode 100644 index 0000000..ea4226a --- /dev/null +++ b/ktx/build/docs/html/libktx/group__writer.html @@ -0,0 +1,1439 @@ + + + + + + + +libktx Reference: Writer + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Writer
        +
        +
        + +

        Write KTX-formatted data. +More...

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Functions

        KTX_error_code ktxTexture2_CompressAstcEx (ktxTexture2 *This, ktxAstcParams *params)
         Encode and compress a ktx texture with uncompressed images to astc.
        KTX_error_code ktxTexture2_CompressAstc (ktxTexture2 *This, ktx_uint32_t quality)
         Encode and compress a ktx texture with uncompressed images to astc.
        KTX_error_code ktxTexture2_CompressBasisEx (ktxTexture2 *This, ktxBasisParams *params)
         Encode and possibly Supercompress a KTX2 texture with uncompressed images.
        KTX_error_code ktxTexture2_CompressBasis (ktxTexture2 *This, ktx_uint32_t quality)
         Supercompress a KTX2 texture with uncompressed images.
        KTX_error_code ktxTexture1_Create (const ktxTextureCreateInfo *const createInfo, ktxTextureCreateStorageEnum storageAllocation, ktxTexture1 **newTex)
         Create a new empty ktxTexture1.
        KTX_error_code ktxTexture2_Create (const ktxTextureCreateInfo *const createInfo, ktxTextureCreateStorageEnum storageAllocation, ktxTexture2 **newTex)
         Create a new empty ktxTexture2.
        KTX_error_code ktxTexture2_CreateCopy (ktxTexture2 *orig, ktxTexture2 **newTex)
         Create a ktxTexture2 by making a copy of a ktxTexture2.
        ktx_error_code_e ktxTexture2_SetOETF (ktxTexture2 *This, khr_df_transfer_e tf)
         Set the transfer function for the images in a texture.
        ktx_error_code_e ktxTexture2_SetPrimaries (ktxTexture2 *This, khr_df_primaries_e primaries)
         Set the primaries for the images in a texture.
        KTX_error_code ktxTexture1_SetImageFromStdioStream (ktxTexture1 *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, FILE *src, ktx_size_t srcSize)
         Set image for level, layer, faceSlice from a stdio stream source.
        KTX_error_code ktxTexture1_SetImageFromMemory (ktxTexture1 *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, const ktx_uint8_t *src, ktx_size_t srcSize)
         Set image for level, layer, faceSlice from an image in memory.
        KTX_error_code ktxTexture1_WriteToStream (ktxTexture1 *This, ktxStream *dststr)
         Write a ktxTexture object to a ktxStream in KTX format.
        KTX_error_code ktxTexture1_WriteToStdioStream (ktxTexture1 *This, FILE *dstsstr)
         Write a ktxTexture object to a stdio stream in KTX format.
        KTX_error_code ktxTexture1_WriteToNamedFile (ktxTexture1 *This, const char *const dstname)
         Write a ktxTexture object to a named file in KTX format.
        KTX_error_code ktxTexture1_WriteToMemory (ktxTexture1 *This, ktx_uint8_t **ppDstBytes, ktx_size_t *pSize)
         Write a ktxTexture object to block of memory in KTX format.
        KTX_error_code ktxTexture1_WriteKTX2ToStream (ktxTexture1 *This, ktxStream *dststr)
         Write a ktxTexture object to a ktxStream in KTX 2 format.
        KTX_error_code ktxTexture1_WriteKTX2ToStdioStream (ktxTexture1 *This, FILE *dstsstr)
         Write a ktxTexture object to a stdio stream in KTX2 format.
        KTX_error_code ktxTexture1_WriteKTX2ToNamedFile (ktxTexture1 *This, const char *const dstname)
         Write a ktxTexture object to a named file in KTX2 format.
        KTX_error_code ktxTexture1_WriteKTX2ToMemory (ktxTexture1 *This, ktx_uint8_t **ppDstBytes, ktx_size_t *pSize)
         Write a ktxTexture object to block of memory in KTX2 format.
        KTX_error_code ktxTexture2_SetImageFromStdioStream (ktxTexture2 *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, FILE *src, ktx_size_t srcSize)
         Set image for level, layer, faceSlice from a stdio stream source.
        KTX_error_code ktxTexture2_SetImageFromMemory (ktxTexture2 *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, const ktx_uint8_t *src, ktx_size_t srcSize)
         Set image for level, layer, faceSlice from an image in memory.
        KTX_error_code ktxTexture2_WriteToStream (ktxTexture2 *This, ktxStream *dststr)
         Write a ktxTexture object to a ktxStream in KTX format.
        KTX_error_code ktxTexture2_WriteToStdioStream (ktxTexture2 *This, FILE *dstsstr)
         Write a ktxTexture object to a stdio stream in KTX format.
        KTX_error_code ktxTexture2_WriteToNamedFile (ktxTexture2 *This, const char *const dstname)
         Write a ktxTexture object to a named file in KTX format.
        KTX_error_code ktxTexture2_WriteToMemory (ktxTexture2 *This, ktx_uint8_t **ppDstBytes, ktx_size_t *pSize)
         Write a ktxTexture object to block of memory in KTX format.
        KTX_error_code ktxTexture2_DeflateZstd (ktxTexture2 *This, ktx_uint32_t compressionLevel)
         Deflate the data in a ktxTexture2 object using Zstandard.
        KTX_error_code ktxTexture2_DeflateZLIB (ktxTexture2 *This, ktx_uint32_t compressionLevel)
         Deflate the data in a ktxTexture2 object using miniz (ZLIB).
        +

        Detailed Description

        +

        Write KTX-formatted data.

        +

        Function Documentation

        + +

        ◆ ktxTexture1_Create()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_Create (const ktxTextureCreateInfo *const createInfo,
        ktxTextureCreateStorageEnum storageAllocation,
        ktxTexture1 ** newTex )
        +
        + +

        Create a new empty ktxTexture1.

        +

        The address of the newly created ktxTexture1 is written to the location pointed at by newTex.

        +
        Parameters
        + + + + +
        [in]createInfopointer to a ktxTextureCreateInfo struct with information describing the texture.
        [in]storageAllocationenum indicating whether or not to allocate storage for the texture images.
        [in,out]newTexpointer to a location in which store the address of the newly created texture.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + + + + + +
        KTX_INVALID_VALUEglInternalFormat in createInfo is not a valid OpenGL internal format value.
        KTX_INVALID_VALUEnumDimensions in createInfo is not 1, 2 or 3.
        KTX_INVALID_VALUEOne of base{Width,Height,Depth} in createInfo is 0.
        KTX_INVALID_VALUEnumFaces in createInfo is not 1 or 6.
        KTX_INVALID_VALUEnumLevels in createInfo is 0.
        KTX_INVALID_OPERATIONThe base{Width,Height,Depth} specified in createInfo are inconsistent with numDimensions.
        KTX_INVALID_OPERATIONcreateInfo is requesting a 3D array or 3D cubemap texture.
        KTX_INVALID_OPERATIONcreateInfo is requesting a cubemap with non-square or non-2D images.
        KTX_INVALID_OPERATIONcreateInfo is requesting more mip levels than needed for the specified base{Width,Height,Depth}.
        KTX_OUT_OF_MEMORYNot enough memory for the texture's images.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_SetImageFromMemory()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_SetImageFromMemory (ktxTexture1 * This,
        ktx_uint32_t level,
        ktx_uint32_t layer,
        ktx_uint32_t faceSlice,
        const ktx_uint8_t * src,
        ktx_size_t srcSize )
        +
        + +

        Set image for level, layer, faceSlice from an image in memory.

        +

        Uncompressed images in memory are expected to have their rows tightly packed as is the norm for most image file formats. The copied image is padded as necessary to achieve the KTX-specified row alignment. No padding is done if the ktxTexture's isCompressed field is KTX_TRUE.

        +

        Level, layer, faceSlice rather than offset are specified to enable some validation.

        +
        Warning
        Do not use memcpy for this as it will not pad when necessary.
        +
        Note
        The caller is responsible for freeing the original image memory referred to by src.
        +
        Parameters
        + + + + + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]levelmip level of the image to set.
        [in]layerarray layer of the image to set.
        [in]faceSlicecube map face or depth slice of the image to set.
        [in]srcpointer to the image source in memory.
        [in]srcSizesize of the source image in bytes.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + +
        KTX_INVALID_VALUEThis or src is NULL.
        KTX_INVALID_VALUEsrcSize != the expected image size for the specified level, layer & faceSlice.
        KTX_INVALID_OPERATIONNo storage was allocated when the texture was created.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_SetImageFromStdioStream()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_SetImageFromStdioStream (ktxTexture1 * This,
        ktx_uint32_t level,
        ktx_uint32_t layer,
        ktx_uint32_t faceSlice,
        FILE * src,
        ktx_size_t srcSize )
        +
        + +

        Set image for level, layer, faceSlice from a stdio stream source.

        +

        Uncompressed images read from the stream are expected to have their rows tightly packed as is the norm for most image file formats. The copied image is padded as necessary to achieve the KTX-specified row alignment. No padding is done if the ktxTexture's isCompressed field is KTX_TRUE.

        +

        Level, layer, faceSlice rather than offset are specified to enable some validation.

        +
        Parameters
        + + + + + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]levelmip level of the image to set.
        [in]layerarray layer of the image to set.
        [in]faceSlicecube map face or depth slice of the image to set.
        [in]srcstdio stream pointer to the source.
        [in]srcSizesize of the source image in bytes.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + +
        KTX_INVALID_VALUEThis or src is NULL.
        KTX_INVALID_VALUEsrcSize != the expected image size for the specified level, layer & faceSlice.
        KTX_INVALID_OPERATIONNo storage was allocated when the texture was created.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_WriteKTX2ToMemory()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_WriteKTX2ToMemory (ktxTexture1 * This,
        ktx_uint8_t ** ppDstBytes,
        ktx_size_t * pSize )
        +
        + +

        Write a ktxTexture object to block of memory in KTX2 format.

        +

        Memory is allocated by the function and the caller is responsible for freeing it.

        +

        Callers are strongly urged to include a KTXwriter item in the texture's metadata. It can be added by code, similar to the following, prior to calling this function.

        char writer[100];
        +
        snprintf(writer, sizeof(writer), "%s version %s", appName, appVer);
        +
        ktxHashList_AddKVPair(&texture->kvDataHead, KTX_WRITER_KEY,
        +
        (ktx_uint32_t)strlen(writer) + 1,
        +
        writer);
        +
        #define KTX_WRITER_KEY
        Key string for standard writer metadata.
        Definition ktx.h:134
        +
        Parameters
        + + + + +
        [in]Thispointer to the target ktxTexture object.
        [in,out]ppDstBytespointer to location to write the address of the destination memory. The Application is responsible for freeing this memory.
        [in,out]pSizepointer to location to write the size in bytes of the KTX data.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + +
        KTX_INVALID_VALUEThis, ppDstBytes or pSize is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
        KTX_INVALID_OPERATIONThe ktxTexture contains unknownY KTX- or ktx- prefixed metadata keys.
        KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
        KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_WriteKTX2ToNamedFile()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture1_WriteKTX2ToNamedFile (ktxTexture1 * This,
        const char *const dstname )
        +
        + +

        Write a ktxTexture object to a named file in KTX2 format.

        +

        The file name must be encoded in utf-8. On Windows convert unicode names to utf-8 with WideCharToMultiByte(CP_UTF8, ...) before calling.

        +

        Callers are strongly urged to include a KTXwriter item in the texture's metadata. It can be added by code, similar to the following, prior to calling this function.

        char writer[100];
        +
        snprintf(writer, sizeof(writer), "%s version %s", appName, appVer);
        +
        ktxHashList_AddKVPair(&texture->kvDataHead, KTX_WRITER_KEY,
        +
        (ktx_uint32_t)strlen(writer) + 1,
        +
        writer);
        +
        Parameters
        + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]dstnamedestination file name.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + +
        KTX_INVALID_VALUEThis or dstname is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
        KTX_INVALID_OPERATIONThe ktxTexture contains unknownY KTX- or ktx- prefixed metadata keys.
        KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
        KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_WriteKTX2ToStdioStream()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture1_WriteKTX2ToStdioStream (ktxTexture1 * This,
        FILE * dstsstr )
        +
        + +

        Write a ktxTexture object to a stdio stream in KTX2 format.

        +

        Callers are strongly urged to include a KTXwriter item in the texture's metadata. It can be added by code, similar to the following, prior to calling this function.

        char writer[100];
        +
        snprintf(writer, sizeof(writer), "%s version %s", appName, appVer);
        +
        ktxHashList_AddKVPair(&texture->kvDataHead, KTX_WRITER_KEY,
        +
        (ktx_uint32_t)strlen(writer) + 1,
        +
        writer);
        +
        Parameters
        + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]dstsstrdestination stdio stream.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + +
        KTX_INVALID_VALUEThis or dstsstr is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
        KTX_INVALID_OPERATIONThe ktxTexture contains unknownY KTX- or ktx- prefixed metadata keys.
        KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
        KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_WriteKTX2ToStream()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture1_WriteKTX2ToStream (ktxTexture1 * This,
        ktxStream * dststr )
        +
        + +

        Write a ktxTexture object to a ktxStream in KTX 2 format.

        +
        Parameters
        + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]dststrdestination ktxStream.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + +
        KTX_INVALID_VALUEThis or dststr is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
        KTX_INVALID_OPERATIONThe ktxTexture contains unknownY KTX- or ktx- prefixed metadata keys.
        KTX_INVALID_OPERATIONThe length of the already set writerId metadata plus the library's version id exceeds the maximum allowed.
        KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
        KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_WriteToMemory()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture1_WriteToMemory (ktxTexture1 * This,
        ktx_uint8_t ** ppDstBytes,
        ktx_size_t * pSize )
        +
        + +

        Write a ktxTexture object to block of memory in KTX format.

        +

        Memory is allocated by the function and the caller is responsible for freeing it.

        +
        Parameters
        + + + + +
        [in]Thispointer to the target ktxTexture object.
        [in,out]ppDstBytespointer to location to write the address of the destination memory. The Application is responsible for freeing this memory.
        [in,out]pSizepointer to location to write the size in bytes of the KTX data.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + +
        KTX_INVALID_VALUEThis, ppDstBytes or pSize is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
        KTX_INVALID_OPERATIONBoth kvDataHead and kvData are set in the ktxTexture
        KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
        KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_WriteToNamedFile()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture1_WriteToNamedFile (ktxTexture1 * This,
        const char *const dstname )
        +
        + +

        Write a ktxTexture object to a named file in KTX format.

        +

        The file name must be encoded in utf-8. On Windows convert unicode names to utf-8 with WideCharToMultiByte(CP_UTF8, ...) before calling.

        +
        Parameters
        + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]dstnamedestination file name.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + +
        KTX_INVALID_VALUEThis or dstname is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
        KTX_INVALID_OPERATIONBoth kvDataHead and kvData are set in the ktxTexture
        KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
        KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_WriteToStdioStream()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture1_WriteToStdioStream (ktxTexture1 * This,
        FILE * dstsstr )
        +
        + +

        Write a ktxTexture object to a stdio stream in KTX format.

        +
        Parameters
        + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]dstsstrdestination stdio stream.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + +
        KTX_INVALID_VALUEThis or dstsstr is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
        KTX_INVALID_OPERATIONBoth kvDataHead and kvData are set in the ktxTexture
        KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
        KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture1_WriteToStream()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture1_WriteToStream (ktxTexture1 * This,
        ktxStream * dststr )
        +
        + +

        Write a ktxTexture object to a ktxStream in KTX format.

        +
        Parameters
        + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]dststrdestination ktxStream.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + +
        KTX_INVALID_VALUEThis or dststr is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
        KTX_INVALID_OPERATIONBoth kvDataHead and kvData are set in the ktxTexture
        KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
        KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_CompressAstc()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture2_CompressAstc (ktxTexture2 * This,
        ktx_uint32_t quality )
        +
        + +

        Encode and compress a ktx texture with uncompressed images to astc.

        +

        The images are either encoded to ASTC block-compressed format. The encoded images replace the original images and the texture's fields including the DFD are modified to reflect the new state.

        +

        Such textures can be directly uploaded to a GPU via a graphics API.

        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        [in]qualityCompression quality, a value from 0 - 100. Higher=higher quality/slower speed. Lower=lower quality/faster speed. Negative values for quality are considered > 100.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + +
        KTX_INVALID_OPERATIONThe texture's images are supercompressed.
        KTX_INVALID_OPERATIONThe texture's image are in a block compressed format.
        KTX_INVALID_OPERATIONThe texture image's format is a packed format (e.g. RGB565).
        KTX_INVALID_OPERATIONThe texture image format's component size is not 8-bits.
        KTX_INVALID_OPERATIONThe texture's images are 1D. Only 2D images can be supercompressed.
        KTX_OUT_OF_MEMORYNot enough memory to carry out supercompression.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_CompressAstcEx()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture2_CompressAstcEx (ktxTexture2 * This,
        ktxAstcParams * params )
        +
        + +

        Encode and compress a ktx texture with uncompressed images to astc.

        +

        The images are encoded to ASTC block-compressed format. The encoded images replace the original images and the texture's fields including the DFD are modified to reflect the new state.

        +

        Such textures can be directly uploaded to a GPU via a graphics API.

        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        [in]paramspointer to ASTC params object.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + + + + + + + +
        KTX_INVALID_OPERATIONThe texture's images are supercompressed.
        KTX_INVALID_OPERATIONThe texture's images are in a block compressed format.
        KTX_INVALID_OPERATIONThe texture image's format is a packed format (e.g. RGB565).
        KTX_INVALID_OPERATIONThe texture image format's component size is not 8-bits.
        KTX_INVALID_OPERATIONThe texture's images are 1D. Only 2D images can be supercompressed.
        KTX_INVALID_OPERATIONTransfer function of This is not sRGB or Linear.
        KTX_INVALID_OPERATIONparams->mode is HDR but transfer function of This is sRGB.
        KTX_INVALID_OPERATIONASTC encoder failed to compress image. Possibly due to incorrect floating point compilation settings. Should not happen in release package.
        KTX_INVALID_OPERATIONThis->generateMipmaps is set.
        KTX_OUT_OF_MEMORYNot enough memory to carry out compression.
        KTX_UNSUPPORTED_FEATUREparams->mode is HDR mode which is not yet implemented.
        KTX_UNSUPPORTED_FEATUREASTC encoder not compiled with enough capacity for requested block size. Should not happen in release package.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_CompressBasis()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture2_CompressBasis (ktxTexture2 * This,
        ktx_uint32_t quality )
        +
        + +

        Supercompress a KTX2 texture with uncompressed images.

        +

        The images are encoded to ETC1S block-compressed format and supercompressed with Basis Universal. The encoded images replace the original images and the texture's fields including the DFD are modified to reflect the new state.

        +

        Such textures must be transcoded to a desired target block compressed format before they can be uploaded to a GPU via a graphics API.

        +
        See also
        ktxTexture2_CompressBasisEx().
        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        [in]qualityCompression quality, a value from 1 - 255. Default is 128 which is selected if quality is 0. Lower=better compression/lower quality/faster. Higher=less compression/higher quality/slower.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + +
        KTX_INVALID_OPERATIONThe texture is already supercompressed.
        KTX_INVALID_OPERATIONThe texture's image are in a block compressed format.
        KTX_OUT_OF_MEMORYNot enough memory to carry out supercompression.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_CompressBasisEx()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture2_CompressBasisEx (ktxTexture2 * This,
        ktxBasisParams * params )
        +
        + +

        Encode and possibly Supercompress a KTX2 texture with uncompressed images.

        +

        The images are either encoded to ETC1S block-compressed format and supercompressed with Basis LZ or they are encoded to UASTC block-compressed format. UASTC format is selected by setting the uastc field of params to KTX_TRUE. The encoded images replace the original images and the texture's fields including the DFD are modified to reflect the new state.

        +

        Such textures must be transcoded to a desired target block compressed format before they can be uploaded to a GPU via a graphics API.

        +
        See also
        ktxTexture2_TranscodeBasis().
        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        [in]paramspointer to Basis params object.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + + + +
        KTX_INVALID_OPERATIONThe texture's images are supercompressed.
        KTX_INVALID_OPERATIONThe texture's images are in a block compressed format.
        KTX_INVALID_OPERATIONThe texture image's format is a packed format (e.g. RGB565).
        KTX_INVALID_OPERATIONThe texture image format's component size is not 8-bits.
        KTX_INVALID_OPERATIONnormalMode is specified but the texture has only one component.
        KTX_INVALID_OPERATIONBoth preSwizzle and and inputSwizzle are specified in params.
        KTX_INVALID_OPERATIONThis->generateMipmaps is set.
        KTX_OUT_OF_MEMORYNot enough memory to carry out compression.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_Create()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_Create (const ktxTextureCreateInfo *const createInfo,
        ktxTextureCreateStorageEnum storageAllocation,
        ktxTexture2 ** newTex )
        +
        + +

        Create a new empty ktxTexture2.

        +

        The address of the newly created ktxTexture2 is written to the location pointed at by newTex.

        +
        Parameters
        + + + + +
        [in]createInfopointer to a ktxTextureCreateInfo struct with information describing the texture.
        [in]storageAllocationenum indicating whether or not to allocate storage for the texture images.
        [in,out]newTexpointer to a location in which store the address of the newly created texture.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + + + + + +
        KTX_INVALID_VALUEglInternalFormat in createInfo is not a valid OpenGL internal format value.
        KTX_INVALID_VALUEnumDimensions in createInfo is not 1, 2 or 3.
        KTX_INVALID_VALUEOne of base{Width,Height,Depth} in createInfo is 0.
        KTX_INVALID_VALUEnumFaces in createInfo is not 1 or 6.
        KTX_INVALID_VALUEnumLevels in createInfo is 0.
        KTX_INVALID_OPERATIONThe base{Width,Height,Depth} specified in createInfo are inconsistent with numDimensions.
        KTX_INVALID_OPERATIONcreateInfo is requesting a 3D array or 3D cubemap texture.
        KTX_INVALID_OPERATIONcreateInfo is requesting a cubemap with non-square or non-2D images.
        KTX_INVALID_OPERATIONcreateInfo is requesting more mip levels than needed for the specified base{Width,Height,Depth}.
        KTX_OUT_OF_MEMORYNot enough memory for the texture's images.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_CreateCopy()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture2_CreateCopy (ktxTexture2 * orig,
        ktxTexture2 ** newTex )
        +
        + +

        Create a ktxTexture2 by making a copy of a ktxTexture2.

        +

        The address of the newly created ktxTexture2 is written to the location pointed at by newTex.

        +
        Parameters
        + + + +
        [in]origpointer to the texture to copy.
        [in,out]newTexpointer to a location in which store the address of the newly created texture.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + +
        KTX_OUT_OF_MEMORYNot enough memory for the texture data.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_DeflateZLIB()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture2_DeflateZLIB (ktxTexture2 * This,
        ktx_uint32_t compressionLevel )
        +
        + +

        Deflate the data in a ktxTexture2 object using miniz (ZLIB).

        +

        The texture's levelIndex, dataSize, DFD, data pointer, and supercompressionScheme will all be updated after successful deflation to reflect the deflated data.

        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        [in]compressionLevelset speed vs compression ratio trade-off. Values between 1 and 9 are accepted. The lower the level the faster.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_DeflateZstd()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture2_DeflateZstd (ktxTexture2 * This,
        ktx_uint32_t compressionLevel )
        +
        + +

        Deflate the data in a ktxTexture2 object using Zstandard.

        +

        The texture's levelIndex, dataSize, DFD, data pointer, and supercompressionScheme will all be updated after successful deflation to reflect the deflated data.

        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture2 object of interest.
        [in]compressionLevelset speed vs compression ratio trade-off. Values between 1 and 22 are accepted. The lower the level the faster. Values above 20 should be used with caution as they require more memory.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_SetImageFromMemory()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_SetImageFromMemory (ktxTexture2 * This,
        ktx_uint32_t level,
        ktx_uint32_t layer,
        ktx_uint32_t faceSlice,
        const ktx_uint8_t * src,
        ktx_size_t srcSize )
        +
        + +

        Set image for level, layer, faceSlice from an image in memory.

        +

        Uncompressed images in memory are expected to have their rows tightly packed as is the norm for most image file formats. KTX 2 also requires tight packing this function does not add any padding.

        +

        Level, layer, faceSlice rather than offset are specified to enable some validation.

        +
        Note
        The caller is responsible for freeing the original image memory referred to by src.
        +
        Parameters
        + + + + + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]levelmip level of the image to set.
        [in]layerarray layer of the image to set.
        [in]faceSlicecube map face or depth slice of the image to set or KTX_FACESLICE_WHOLE_LEVEL to set the entire level.
        [in]srcpointer to the image source in memory.
        [in]srcSizesize of the source image in bytes.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + +
        KTX_INVALID_VALUEThis or src is NULL.
        KTX_INVALID_VALUEsrcSize != the expected image size for the specified level, layer & faceSlice.
        KTX_INVALID_OPERATIONNo storage was allocated when the texture was created.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_SetImageFromStdioStream()

        + +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_SetImageFromStdioStream (ktxTexture2 * This,
        ktx_uint32_t level,
        ktx_uint32_t layer,
        ktx_uint32_t faceSlice,
        FILE * src,
        ktx_size_t srcSize )
        +
        + +

        Set image for level, layer, faceSlice from a stdio stream source.

        +

        Uncompressed images read from the stream are expected to have their rows tightly packed as is the norm for most image file formats. KTX 2 also requires tight packing this function does not add any padding.

        +

        Level, layer, faceSlice rather than offset are specified to enable some validation.

        +
        Parameters
        + + + + + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]levelmip level of the image to set.
        [in]layerarray layer of the image to set.
        [in]faceSlicecube map face or depth slice of the image to set or KTX_FACESLICE_WHOLE_LEVEL to set the entire level.
        [in]srcstdio stream pointer to the source.
        [in]srcSizesize of the source image in bytes.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + +
        KTX_INVALID_VALUEThis or src is NULL.
        KTX_INVALID_VALUEsrcSize != the expected image size for the specified level, layer & faceSlice.
        KTX_INVALID_OPERATIONNo storage was allocated when the texture was created.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_SetOETF()

        + +
        +
        + + + + + + + + + + + +
        ktx_error_code_e ktxTexture2_SetOETF (ktxTexture2 * This,
        khr_df_transfer_e tf )
        +
        + +

        Set the transfer function for the images in a texture.

        +
        Deprecated
        Use ktxTexture2_SetTransferFunction.
        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture2
        [in]tfenumerator of the transfer function to set
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_SetPrimaries()

        + +
        +
        + + + + + + + + + + + +
        ktx_error_code_e ktxTexture2_SetPrimaries (ktxTexture2 * This,
        khr_df_primaries_e primaries )
        +
        + +

        Set the primaries for the images in a texture.

        +
        Parameters
        + + + +
        [in]Thispointer to the ktxTexture2
        [in]primariesenumerator of the primaries to set
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_WriteToMemory()

        + +
        +
        + + + + + + + + + + + + + + + + +
        KTX_error_code ktxTexture2_WriteToMemory (ktxTexture2 * This,
        ktx_uint8_t ** ppDstBytes,
        ktx_size_t * pSize )
        +
        + +

        Write a ktxTexture object to block of memory in KTX format.

        +

        Memory is allocated by the function and the caller is responsible for freeing it.

        +

        Callers are strongly urged to include a KTXwriter item in the texture's metadata. It can be added by code, similar to the following, prior to calling this function.

        char writer[100];
        +
        snprintf(writer, sizeof(writer), "%s version %s", appName, appVer);
        +
        ktxHashList_AddKVPair(&texture->kvDataHead, KTX_WRITER_KEY,
        +
        (ktx_uint32_t)strlen(writer) + 1,
        +
        writer);
        +
        Parameters
        + + + + +
        [in]Thispointer to the target ktxTexture object.
        [in,out]ppDstBytespointer to location to write the address of the destination memory. The Application is responsible for freeing this memory.
        [in,out]pSizepointer to location to write the size in bytes of the KTX data.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + +
        KTX_INVALID_VALUEThis, ppDstBytes or pSize is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
        KTX_INVALID_OPERATIONBoth kvDataHead and kvData are set in the ktxTexture
        KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
        KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_WriteToNamedFile()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture2_WriteToNamedFile (ktxTexture2 * This,
        const char *const dstname )
        +
        + +

        Write a ktxTexture object to a named file in KTX format.

        +

        The file name must be encoded in utf-8. On Windows convert unicode names to utf-8 with WideCharToMultiByte(CP_UTF8, ...) before calling.

        +

        Callers are strongly urged to include a KTXwriter item in the texture's metadata. It can be added by code, similar to the following, prior to calling this function.

        char writer[100];
        +
        snprintf(writer, sizeof(writer), "%s version %s", appName, appVer);
        +
        ktxHashList_AddKVPair(&texture->kvDataHead, KTX_WRITER_KEY,
        +
        (ktx_uint32_t)strlen(writer) + 1,
        +
        writer);
        +
        Parameters
        + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]dstnamedestination file name.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + +
        KTX_INVALID_VALUEThis or dstname is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
        KTX_INVALID_OPERATIONBoth kvDataHead and kvData are set in the ktxTexture
        KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
        KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_WriteToStdioStream()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture2_WriteToStdioStream (ktxTexture2 * This,
        FILE * dstsstr )
        +
        + +

        Write a ktxTexture object to a stdio stream in KTX format.

        +

        Callers are strongly urged to include a KTXwriter item in the texture's metadata. It can be added by code, similar to the following, prior to calling this function.

        char writer[100];
        +
        snprintf(writer, sizeof(writer), "%s version %s", appName, appVer);
        +
        ktxHashList_AddKVPair(&texture->kvDataHead, KTX_WRITER_KEY,
        +
        (ktx_uint32_t)strlen(writer) + 1,
        +
        writer);
        +
        Parameters
        + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]dstsstrdestination stdio stream.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + +
        KTX_INVALID_VALUEThis or dstsstr is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
        KTX_INVALID_OPERATIONBoth kvDataHead and kvData are set in the ktxTexture
        KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
        KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
        +
        +
        + +
        +
        + +

        ◆ ktxTexture2_WriteToStream()

        + +
        +
        + + + + + + + + + + + +
        KTX_error_code ktxTexture2_WriteToStream (ktxTexture2 * This,
        ktxStream * dststr )
        +
        + +

        Write a ktxTexture object to a ktxStream in KTX format.

        +
        Parameters
        + + + +
        [in]Thispointer to the target ktxTexture object.
        [in]dststrdestination ktxStream.
        +
        +
        +
        Returns
        KTX_SUCCESS on success, other KTX_* enum values on error.
        +
        Exceptions
        + + + + + + + +
        KTX_INVALID_VALUEThis or dststr is NULL.
        KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
        KTX_INVALID_OPERATIONBoth kvDataHead and kvData are set in the ktxTexture
        KTX_INVALID_OPERATIONThe length of the already set writerId metadata plus the library's version id exceeds the maximum allowed.
        KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
        KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
        +
        +
        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/group__writer.js b/ktx/build/docs/html/libktx/group__writer.js new file mode 100644 index 0000000..ac86787 --- /dev/null +++ b/ktx/build/docs/html/libktx/group__writer.js @@ -0,0 +1,30 @@ +var group__writer = +[ + [ "ktxTexture1::ktxTexture1_Create", "group__writer.html#ga9ad46bface6dab07a35579c0635877d3", null ], + [ "ktxTexture1::ktxTexture1_SetImageFromMemory", "group__writer.html#gabeb1d5eb7ddcfd81405d5726a0b55ee6", null ], + [ "ktxTexture1::ktxTexture1_SetImageFromStdioStream", "group__writer.html#ga9383755c2e02a9d1aa932e75c847829c", null ], + [ "ktxTexture1::ktxTexture1_WriteKTX2ToMemory", "group__writer.html#gadbc6058afa50d4db3efd738822e6296a", null ], + [ "ktxTexture1::ktxTexture1_WriteKTX2ToNamedFile", "group__writer.html#ga3009e876fb584268241a9ba7704e8557", null ], + [ "ktxTexture1::ktxTexture1_WriteKTX2ToStdioStream", "group__writer.html#gac31b3532ed02d8cd4a7b517d4d2ab6ef", null ], + [ "ktxTexture1::ktxTexture1_WriteKTX2ToStream", "group__writer.html#gad0a6406fc9359abd5f6d9956a86ce90f", null ], + [ "ktxTexture1::ktxTexture1_WriteToMemory", "group__writer.html#ga21904a85ada4ee322b87c309566ea4d1", null ], + [ "ktxTexture1::ktxTexture1_WriteToNamedFile", "group__writer.html#gafe0d51799d92b69cdcbe30c98322340b", null ], + [ "ktxTexture1::ktxTexture1_WriteToStdioStream", "group__writer.html#ga924da3380253c85fffca8c956e00d5c0", null ], + [ "ktxTexture1::ktxTexture1_WriteToStream", "group__writer.html#gac1780ac8315f0cab9893c121481c7453", null ], + [ "ktxTexture2::ktxTexture2_CompressAstc", "group__writer.html#ga00b153dbfa1fe115c7d4322dbe07f172", null ], + [ "ktxTexture2::ktxTexture2_CompressAstcEx", "group__writer.html#gaf08421ae0893a9e9205d3e84fad66bd8", null ], + [ "ktxTexture2::ktxTexture2_CompressBasis", "group__writer.html#ga405c44d6daf8ddf83dc805810bf4f989", null ], + [ "ktxTexture2::ktxTexture2_CompressBasisEx", "group__writer.html#ga0e75755e3cc69964e57363dad82ffd77", null ], + [ "ktxTexture2::ktxTexture2_Create", "group__writer.html#gaa8e29216921eadd3c09c3a76bc286acd", null ], + [ "ktxTexture2::ktxTexture2_CreateCopy", "group__writer.html#ga5fcfdc3d237419ab65287639e1f4aeb1", null ], + [ "ktxTexture2::ktxTexture2_DeflateZLIB", "group__writer.html#gaafc3cf2c872ea75be7096b1fc70dfb2c", null ], + [ "ktxTexture2::ktxTexture2_DeflateZstd", "group__writer.html#ga08d7222fbf845f25d883ed81c14c6430", null ], + [ "ktxTexture2::ktxTexture2_SetImageFromMemory", "group__writer.html#ga01b13c38300016ce36c5b97bf4957d48", null ], + [ "ktxTexture2::ktxTexture2_SetImageFromStdioStream", "group__writer.html#ga50a5ecf22586b26977da62cf19a78518", null ], + [ "ktxTexture2::ktxTexture2_SetOETF", "group__writer.html#ga9894284fd16fed4697505353043bbeae", null ], + [ "ktxTexture2::ktxTexture2_SetPrimaries", "group__writer.html#gaa623fd7f433e3827a52cdb499f9162f9", null ], + [ "ktxTexture2::ktxTexture2_WriteToMemory", "group__writer.html#ga0113194b669b789a22d85b7ad992f117", null ], + [ "ktxTexture2::ktxTexture2_WriteToNamedFile", "group__writer.html#ga745cee3857ade59e612c533d6faa8e2a", null ], + [ "ktxTexture2::ktxTexture2_WriteToStdioStream", "group__writer.html#gadf2c2542471b7a94636216807cedd819", null ], + [ "ktxTexture2::ktxTexture2_WriteToStream", "group__writer.html#gacb722c7d0c1df7e6e3b4caa78ae729cf", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/index.html b/ktx/build/docs/html/libktx/index.html new file mode 100644 index 0000000..0ec695c --- /dev/null +++ b/ktx/build/docs/html/libktx/index.html @@ -0,0 +1,508 @@ + + + + + + + +libktx Reference: libktx Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        libktx Reference
        +
        +
        +

        libktx is a small library of functions for creating and reading KTX (Khronos TeXture) files, version 1 and 2 and instantiating OpenGL® and OpenGL® ES textures and Vulkan images from them. KTX version 2 files can contain images supercompressed with zstd or zlib. They can also contain images in the Basis Universal formats. libktx can deflate and inflate zstd and zlib compressed images, can encode and transcode the Basis Universal formats and can encode ASTC formats.

        +

        For information about the KTX format see the formal specification.

        +
        Authors
        Mark Callow, formerly at HI Corporation
        +Mátyás Császár and Daniel Rákos, RasterGrid
        +Wasim Abbas, Arm
        +Andreas Atteneder, Independent
        +Georg Kolling, Imagination Technology
        +Jacob Ström, Ericsson AB
        +
        API Version
        v4.0
        +

        $Date$

        +

        +Usage Overview

        +

        The following ktxTexture examples work for both KTX and KTX2 textures. The texture type is determined from the file contents.

        +

        +Reading a KTX file for non-GL and non-Vulkan Use

        +
        #include <ktx.h>
        +
        +
        ktxTexture* texture;
        + +
        ktx_size_t offset;
        +
        ktx_uint8_t* image;
        +
        ktx_uint32_t level, layer, faceSlice;
        +
        +
        result = ktxTexture_CreateFromNamedFile("mytex3d.ktx",
        + +
        &texture);
        +
        +
        // Retrieve information about the texture from fields in the ktxTexture
        +
        // such as:
        +
        ktx_uint32_t numLevels = texture->numLevels;
        +
        ktx_uint32_t baseWidth = texture->baseWidth;
        +
        ktx_bool_t isArray = texture->isArray;
        +
        +
        // Retrieve a pointer to the image for a specific mip level, array layer
        +
        // & face or depth slice.
        +
        level = 1; layer = 0; faceSlice = 3;
        +
        result = ktxTexture_GetImageOffset(texture, level, layer, faceSlice, &offset);
        +
        image = ktxTexture_GetData(texture) + offset;
        +
        // ...
        +
        // Do something with the texture image.
        +
        // ...
        + +
        Declares the public functions and structures of the KTX API.
        +
        #define ktxTexture_Destroy(This)
        Helper for calling the Destroy virtual method of a ktxTexture.
        Definition ktx.h:533
        +
        @ KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT
        Definition ktx.h:794
        +
        #define KTX_error_code
        For backward compatibility.
        Definition ktx.h:198
        +
        #define ktxTexture_GetImageOffset(This, level, layer, faceSlice, pOffset)
        Helper for calling the GetImageOffset virtual method of a ktxTexture.
        Definition ktx.h:541
        +
        Base class representing a texture.
        Definition ktx.h:287
        +
        ktx_uint32_t baseWidth
        Width of the texture's base level.
        Definition ktx.h:288
        +
        ktx_uint32_t numLevels
        Number of mip levels in the texture.
        Definition ktx.h:288
        +
        ktx_bool_t isArray
        Definition ktx.h:288
        +

        +Creating a GL texture object from a KTX file.

        +
        #include <ktx.h>
        +
        +
        ktxTexture* kTexture;
        + +
        ktx_size_t offset;
        +
        ktx_uint8_t* image;
        +
        ktx_uint32_t level, layer, faceSlice;
        +
        GLuint texture = 0;
        +
        GLenum target, glerror;
        +
        +
        result = ktxTexture_CreateFromNamedFile("mytex3d.ktx",
        +
        KTX_TEXTURE_CREATE_NO_FLAGS,
        +
        &kTexture);
        +
        +
        // Before the first call to ktxTexture_GLUpload make libktx load its
        +
        // function pointers for the GL functions it uses. The parameter is a
        +
        // pointer to the GLGetProcAddress function provided by whatever OpenGL
        +
        // framework the application is using. The example shown is for SDL.
        +
        //
        +
        // Note 1: This is unrelated to any GL function pointers the app may be
        +
        // using.
        +
        // Note 2: When this is not called, libktx has fallback mechanisms to
        +
        // find the pointers which work on the vast majority of
        +
        // platforms. The only known failures have occurred on Fedora.
        +
        result = ktxLoadOpenGL((PFNGLGETPROCADDRESS)SDL_GL_GetProcAddress);
        +
        +
        glGenTextures(1, &texture); // Optional. GLUpload can generate a texture.
        +
        result = ktxTexture_GLUpload(kTexture, &texture, &target, &glerror);
        + +
        // ...
        +
        // GL rendering using the texture
        +
        // ...
        +
        KTX_API KTX_error_code KTX_APIENTRY ktxLoadOpenGL(PFNGLGETPROCADDRESS pfnGLGetProcAddress)
        Load pointers for the GL functions used by the ktxTexture*_GLUpload functions.
        Definition gl_funcs.c:216
        +
        PFNVOIDFUNCTION(KTX_APIENTRY * PFNGLGETPROCADDRESS)(const char *proc)
        typedef of pointer to function for retrieving OpenGL function pointers.
        Definition ktx.h:936
        +

        +Creating a Vulkan image object from a KTX file.

        +
        #include <vulkan/vulkan.h>
        +
        #include <ktxvulkan.h>
        +
        +
        ktxTexture* kTexture;
        + +
        ktx_size_t offset;
        +
        ktx_uint8_t* image;
        +
        ktx_uint32_t level, layer, faceSlice;
        + + +
        +
        // Set up Vulkan physical device (gpu), logical device (device), queue
        +
        // and command pool. Save the handles to these in a struct called vkctx.
        +
        // ktx VulkanDeviceInfo is used to pass these with the expectation that
        +
        // apps are likely to upload a large number of textures.
        +
        ktxVulkanDeviceInfo_Construct(&vdi, vkctx.gpu, vkctx.device,
        +
        vkctx.queue, vkctx.commandPool, nullptr);
        +
        +
        ktxresult = ktxTexture_CreateFromNamedFile("mytex3d.ktx",
        +
        KTX_TEXTURE_CREATE_NO_FLAGS,
        +
        &kTexture);
        +
        +
        ktxresult = ktxTexture_VkUploadEx(kTexture, &vdi, &texture,
        +
        VK_IMAGE_TILING_OPTIMAL,
        +
        VK_IMAGE_USAGE_SAMPLED_BIT,
        +
        VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
        +
        + +
        ktxVulkanDeviceInfo_Destruct(&vdi);
        +
        // ...
        +
        // Vulkan rendering using the texture
        +
        // ...
        +
        // When done using the image in Vulkan...
        +
        ktxVulkanTexture_Destruct(&texture, vkctx.device, nullptr);
        +
        Struct for passing information about the Vulkan device on which to create images to the texture image...
        Definition ktxvulkan.h:188
        +
        Struct for returning information about the Vulkan texture image created by the ktxTexture_VkUpload* f...
        Definition ktxvulkan.h:108
        +

        +Extracting Metadata

        +

        Once a ktxTexture object has been created, metadata can be easily found and extracted. The following can be added to any of the above.

        +
        char* pValue;
        +
        uint32_t valueLen;
        +
        if (KTX_SUCCESS == ktxHashList_FindValue(&kTexture->kvDataHead,
        + +
        &valueLen, (void**)&pValue))
        +
        {
        +
        char s, t;
        +
        +
        if (sscanf(pValue, KTX_ORIENTATION2_FMT, &s, &t) == 2) {
        +
        ...
        +
        }
        +
        }
        +
        @ KTX_SUCCESS
        Definition ktx.h:170
        +
        #define KTX_ORIENTATION_KEY
        Key string for standard orientation metadata.
        Definition ktx.h:124
        +
        #define KTX_ORIENTATION2_FMT
        Standard KTX 1 format for 2D orientation value.
        Definition ktx.h:149
        +
        ktxHashList kvDataHead
        Head of the hash list of metadata.
        Definition ktx.h:288
        +

        +Writing a KTX or KTX2 file

        +
        #include <ktx.h>
        +
        #include <vkformat_enum.h>
        +
        +
        ktxTexture2* texture; // For KTX2
        +
        //ktxTexture1* texture; // For KTX
        + + +
        ktx_uint32_t level, layer, faceSlice;
        +
        FILE* src;
        +
        ktx_size_t srcSize;
        +
        +
        createInfo.glInternalformat = GL_RGB8; // Ignored if creating a ktxTexture2.
        +
        createInfo.vkFormat = VK_FORMAT_R8G8B8_UNORM; // Ignored if creating a ktxTexture1.
        +
        createInfo.baseWidth = 2048;
        +
        createInfo.baseHeight = 1024;
        +
        createInfo.baseDepth = 16;
        +
        createInfo.numDimensions = 3.
        +
        // Note: it is not necessary to provide a full mipmap pyramid.
        +
        createInfo.numLevels = log2(createInfo.baseWidth) + 1
        +
        createInfo.numLayers = 1;
        +
        createInfo.numFaces = 1;
        +
        createInfo.isArray = KTX_FALSE;
        +
        createInfo.generateMipmaps = KTX_FALSE;
        +
        +
        // Call ktxTexture1_Create to create a KTX texture.
        +
        result = ktxTexture2_Create(&createInfo,
        + +
        &texture);
        +
        +
        src = // Open a stdio FILE* on the baseLevel image, slice 0.
        +
        srcSize = // Query size of the file.
        +
        level = 0;
        +
        layer = 0;
        +
        faceSlice = 0;
        + +
        level, layer, faceSlice,
        +
        src, srcSize);
        +
        // Repeat for the other 15 slices of the base level and all other levels
        +
        // up to createInfo.numLevels.
        +
        +
        ktxTexture_WriteToNamedFile(ktxTexture(texture), "mytex3d.ktx");
        + +
        #define ktxTexture_SetImageFromMemory(This, level, layer, faceSlice, src, srcSize)
        Helper for calling the SetImageFromMemory virtual method of a ktxTexture.
        Definition ktx.h:609
        +
        @ KTX_TEXTURE_CREATE_ALLOC_STORAGE
        Definition ktx.h:782
        +
        #define ktxTexture_WriteToNamedFile(This, dstname)
        Helper for calling the WriteToNamedfile virtual method of a ktxTexture.
        Definition ktx.h:639
        +
        Class representing a KTX version 2 format texture.
        Definition ktx.h:706
        +
        Structure for passing texture information to ktxTexture1_Create() and ktxTexture2_Create().
        Definition ktx.h:747
        +
        ktx_uint32_t glInternalformat
        Definition ktx.h:748
        +
        ktx_uint32_t numFaces
        Definition ktx.h:764
        +
        ktx_uint32_t numDimensions
        Definition ktx.h:759
        +
        ktx_uint32_t baseWidth
        Definition ktx.h:756
        +
        ktx_uint32_t baseDepth
        Definition ktx.h:758
        +
        ktx_uint32_t numLevels
        Definition ktx.h:761
        +
        ktx_bool_t isArray
        Definition ktx.h:765
        +
        ktx_bool_t generateMipmaps
        Definition ktx.h:768
        +
        ktx_uint32_t vkFormat
        Definition ktx.h:751
        +
        ktx_uint32_t numLayers
        Definition ktx.h:763
        +
        ktx_uint32_t baseHeight
        Definition ktx.h:757
        +

        +Modifying a KTX file

        +
        #include <ktx.h>
        +
        +
        ktxTexture* texture;
        + +
        ktx_size_t offset;
        +
        ktx_uint8_t* image;
        +
        ktx_uint32_t level, layer, faceSlice;
        +
        +
        result = ktxTexture_CreateFromNamedFile("mytex3d.ktx",
        + +
        &texture);
        +
        // The file is closed after all the data has been read.
        +
        +
        // It is the responsibilty of the application to make sure its
        +
        // modifications are valid.
        +
        texture->generateMipmaps = KTX_TRUE;
        +
        +
        ktxTexture_WriteToNamedFile(texture, "mytex3d.ktx");
        + +
        ktx_bool_t generateMipmaps
        Definition ktx.h:288
        +

        +Writing a Basis-compressed Universal Texture

        +

        Basis compression supports two universal texture formats: BasisLZ/ETC1S and UASTC. The latter gives higher quality at a larger file size. Textures can be compressed to either format using ktxTexture2_CompressBasisEx as shown in this example.

        +
        #include <ktx.h>
        +
        #include <vkformat_enum.h>
        +
        +
        ktxTexture2* texture;
        + + +
        ktx_uint32_t level, layer, faceSlice;
        +
        FILE* src;
        +
        ktx_size_t srcSize;
        +
        ktxBasisParams params = {0};
        +
        params.structSize = sizeof(params);
        +
        +
        createInfo.glInternalformat = 0; //Ignored as we'll create a KTX2 texture.
        +
        createInfo.vkFormat = VK_FORMAT_R8G8B8A8_UNORM;
        +
        createInfo.baseWidth = 2048;
        +
        createInfo.baseHeight = 1024;
        +
        createInfo.baseDepth = 16;
        +
        createInfo.numDimensions = 3.
        +
        // Note: it is not necessary to provide a full mipmap pyramid.
        +
        createInfo.numLevels = log2(createInfo.baseWidth) + 1
        +
        createInfo.numLayers = 1;
        +
        createInfo.numFaces = 1;
        +
        createInfo.isArray = KTX_FALSE;
        +
        createInfo.generateMipmaps = KTX_FALSE;
        +
        +
        result = ktxTexture2_Create(&createInfo,
        + +
        &texture);
        +
        +
        src = // Open the file for the baseLevel image, slice 0 and
        +
        // read it into memory.
        +
        srcSize = // Query size of the file.
        +
        level = 0;
        +
        layer = 0;
        +
        faceSlice = 0;
        + +
        level, layer, faceSlice,
        +
        src, srcSize);
        +
        // Repeat for the other 15 slices of the base level and all other levels
        +
        // up to createInfo.numLevels.
        +
        +
        // For BasisLZ/ETC1S
        +
        params.compressionLevel = KTX_ETC1S_DEFAULT_COMPRESSION_LEVEL;
        +
        // For UASTC
        +
        params.uastc = KTX_TRUE;
        +
        // Set other BasisLZ/ETC1S or UASTC params to change default quality settings.
        +
        result = ktxtexture2_CompressBasisEx(texture, &params);
        +
        +
        ktxTexture_WriteToNamedFile(ktxTexture(texture), "mytex3d.ktx2");
        + +
        Structure for passing extended parameters to ktxTexture2_CompressBasisEx().
        Definition ktx.h:1379
        +
        ktx_uint32_t compressionLevel
        Definition ktx.h:1398
        +
        ktx_uint32_t structSize
        Definition ktx.h:1380
        +
        ktx_bool_t uastc
        Definition ktx.h:1384
        +

        There is a shortcut that can be used when compressing to BasisLZ/ETC1S. Remove the declaration and initialization of params in the previous example and replace ktxtexture2_CompressBasisEx with

        +
        // Quality range is 1 - 255. 0 gets the default quality, currently 128.
        +
        // The qualityLevel field in ktxBasisParams is set from this.
        +
        int quality = 0;
        +
        result = ktxTexture2_CompressBasis(texture, quality);
        +

        +Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture

        +
        #include <ktx.h>
        +
        +
        ktxTexture2* texture;
        + +
        +
        result = ktxTexture_CreateFromNamedFile("mytex3d_basis.ktx2",
        +
        KTX_TEXTURE_CREATE_NO_FLAGS,
        +
        (ktxTexture**)&kTexture);
        +
        // or
        +
        //result = ktxTexture2_CreateFromNamedFile("mytex3d_basis.ktx2",
        +
        // KTX_TEXTURE_CREATE_NO_FLAGS,
        +
        // &kTexture);
        +
        +
        if (ktxTexture2_NeedsTranscoding(texture)) {
        +
        ktx_texture_transcode_fmt_e tf;
        +
        +
        // Using VkGetPhysicalDeviceFeatures or GL_COMPRESSED_TEXTURE_FORMATS or
        +
        // extension queries, determine what compressed texture formats are
        +
        // supported and pick a format. For example
        +
        vk::PhysicalDeviceFeatures deviceFeatures;
        +
        vkctx.gpu.getFeatures(&deviceFeatures);
        +
        khr_df_model_e colorModel = ktxTexture2_GetColorModel_e(texture);
        +
        if (colorModel == KHR_DF_MODEL_UASTC
        +
        && deviceFeatures.textureCompressionASTC_LDR) {
        + +
        } else if (colorModel == KHR_DF_MODEL_ETC1S
        +
        && deviceFeatures.textureCompressionETC2) {
        + +
        } else if (deviceFeatures.textureCompressionASTC_LDR) {
        + +
        } else if (deviceFeatures.textureCompressionETC2)
        + +
        else if (deviceFeatures.textureCompressionBC)
        + +
        else {
        +
        message << "Vulkan implementation does not support any available transcode target.";
        +
        throw std::runtime_error(message.str());
        +
        }
        +
        +
        result = ktxTexture2_TranscodeBasis(texture, tf, 0);
        +
        +
        // Then use VkUpload or GLUpload to create a texture object on the GPU.
        +
        }
        +
        @ KTX_TTF_ASTC_4x4_RGBA
        Definition ktx.h:1593
        +
        @ KTX_TTF_BC3_RGBA
        Definition ktx.h:1565
        +
        @ KTX_TTF_ETC2_RGBA
        Definition ktx.h:1555
        +
        @ KTX_TTF_ETC
        Definition ktx.h:1637
        +

        +Writing an ASTC-Compressed Texture

        +
        #include <ktx.h>
        +
        #include <vkformat_enum.h>
        +
        +
        ktxTexture2* texture;
        + + +
        ktx_uint32_t level, layer, faceSlice;
        +
        FILE* src;
        +
        ktx_size_t srcSize;
        +
        ktxAstcParams params = {0};
        +
        params.structSize = sizeof(params);
        +
        +
        createInfo.glInternalformat = 0; //Ignored as we'll create a KTX2 texture.
        +
        createInfo.vkFormat = VK_FORMAT_R8G8B8A8_UNORM;
        +
        createInfo.baseWidth = 2048;
        +
        createInfo.baseHeight = 1024;
        +
        createInfo.baseDepth = 16;
        +
        createInfo.numDimensions = 3.
        +
        // Note: it is not necessary to provide a full mipmap pyramid.
        +
        createInfo.numLevels = log2(createInfo.baseWidth) + 1
        +
        createInfo.numLayers = 1;
        +
        createInfo.numFaces = 1;
        +
        createInfo.isArray = KTX_FALSE;
        +
        createInfo.generateMipmaps = KTX_FALSE;
        +
        +
        result = ktxTexture2_Create(&createInfo,
        + +
        &texture);
        +
        +
        src = // Open the file for the baseLevel image, slice 0 and
        +
        // read it into memory.
        +
        srcSize = // Query size of the file.
        +
        level = 0;
        +
        layer = 0;
        +
        faceSlice = 0;
        + +
        level, layer, faceSlice,
        +
        src, srcSize);
        +
        // Repeat for the other 15 slices of the base level and all other levels
        +
        // up to createInfo.numLevels.
        +
        +
        params.threadCount = 1;
        +
        params.blockDimension = KTX_PACK_ASTC_BLOCK_DIMENSION_6x6;
        + + +
        result = ktxtexture2_CompressAstcEx(texture, &params);
        +
        +
        ktxTexture_WriteToNamedFile(ktxTexture(texture), "mytex3d.ktx2");
        + +
        @ KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM
        Definition ktx.h:1230
        +
        @ KTX_PACK_ASTC_ENCODER_MODE_LDR
        Definition ktx.h:1282
        +
        Structure for passing extended parameters to ktxTexture_CompressAstc.
        Definition ktx.h:1302
        +
        ktx_uint32_t threadCount
        Definition ktx.h:1313
        +
        ktx_uint32_t structSize
        Definition ktx.h:1303
        +
        ktx_uint32_t blockDimension
        Definition ktx.h:1318
        +
        ktx_uint32_t mode
        Definition ktx.h:1323
        +
        ktx_uint32_t qualityLevel
        Definition ktx.h:1327
        +

        There is a shortcut that can be used when the only params field you want to modify is the qualityLevel. Remove the declaration and initialization of params in the previous example and replace ktxtexture2_CompressAstcEx with

        +
        // Quality range is 0 - 100. 0 is fastest/lowest. 100 is slowest/highest.
        + +
        result = ktxTexture2_CompressAstc(texture, quality);
        +
        + +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/jquery.js b/ktx/build/docs/html/libktx/jquery.js new file mode 100644 index 0000000..875ada7 --- /dev/null +++ b/ktx/build/docs/html/libktx/jquery.js @@ -0,0 +1,204 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e} +var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp( +"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType +}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c +)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){ +return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll( +":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id") +)&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push( +"\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test( +a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null, +null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne +).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for( +var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
        "],col:[2,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],_default:[0,"",""]};function ve(e,t){var n; +return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0, +r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r] +,C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
        ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each( +function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r, +"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})} +),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each( +"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t +){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t +]=y.widget.extend({},this.options[t]),n=0;n
      "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i}, +getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within, +s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n
    ").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t +).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split( +","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add( +this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{ +width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(), +!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){ +this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height +,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e
    ").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e, +i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left +)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e +){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0), +i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth( +)-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e, +function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0 +]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){ +targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se", +"n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if( +session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)} +closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if( +session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE, +function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset); +tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList, +finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight())); +return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")} +function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(), +elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight, +viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b, +"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); +/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)), +mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend( +$.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy( +this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData( +"smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id" +).indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?( +this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for( +var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){ +return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if(( +!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&( +this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0 +]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass( +"highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){ +t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]" +)||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){ +t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"), +a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i, +downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2) +)&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t +)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0), +canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}}, +rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})} +return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1, +bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); diff --git a/ktx/build/docs/html/libktx/ktx_8h.html b/ktx/build/docs/html/libktx/ktx_8h.html new file mode 100644 index 0000000..5d4ce08 --- /dev/null +++ b/ktx/build/docs/html/libktx/ktx_8h.html @@ -0,0 +1,1620 @@ + + + + + + + +libktx Reference: include/ktx.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    libktx Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    ktx.h File Reference
    +
    +
    + +

    Declares the public functions and structures of the KTX API. +More...

    +
    #include <limits.h>
    +#include <stdio.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <KHR/khr_df.h>
    +#include <stdint.h>
    +
    +Include dependency graph for ktx.h:
    +
    +
    + + + + + + + + + + + + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + +

    +Data Structures

    struct  ktxOrientation
     Struct describing the logical orientation of an image. More...
    class  ktxTexture
     Base class representing a texture. More...
    struct  ktxTexture_vtbl
     Table of virtual ktxTexture methods. More...
    class  ktxTexture1
     Class representing a KTX version 1 format texture. More...
    class  ktxTexture2
     Class representing a KTX version 2 format texture. More...
    struct  ktxTextureCreateInfo
     Structure for passing texture information to ktxTexture1_Create() and ktxTexture2_Create(). More...
    struct  ktxStream
     Interface of ktxStream. More...
    struct  ktxAstcParams
     Structure for passing extended parameters to ktxTexture_CompressAstc. More...
    struct  ktxBasisParams
     Structure for passing extended parameters to ktxTexture2_CompressBasisEx(). More...
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    +#define KTX_ANIMDATA_KEY   "KTXanimData"
     Key string for standard writer metadata.
    +#define KTX_ORIENTATION_KEY   "KTXorientation"
     Key string for standard orientation metadata.
    +#define KTX_SWIZZLE_KEY   "KTXswizzle"
     Key string for standard swizzle metadata.
    +#define KTX_WRITER_KEY   "KTXwriter"
     Key string for standard writer metadata.
    +#define KTX_WRITER_SCPARAMS_KEY   "KTXwriterScParams"
     Key string for standard writer supercompression parameter metadata.
    +#define KTX_ORIENTATION1_FMT   "S=%c"
     Standard KTX 1 format for 1D orientation value.
    +#define KTX_ORIENTATION2_FMT   "S=%c,T=%c"
     Standard KTX 1 format for 2D orientation value.
    +#define KTX_ORIENTATION3_FMT   "S=%c,T=%c,R=%c"
     Standard KTX 1 format for 3D orientation value.
    +#define KTX_GL_UNPACK_ALIGNMENT   4
     Required unpack alignment.
    #define KTX_error_code   ktx_error_code_e
     For backward compatibility.
    #define ktxTexture_Destroy(This)
     Helper for calling the Destroy virtual method of a ktxTexture.
    #define ktxTexture_GetImageOffset(This, level, layer, faceSlice, pOffset)
     Helper for calling the GetImageOffset virtual method of a ktxTexture.
    #define ktxTexture_GetDataSizeUncompressed(This)
     Helper for calling the GetDataSizeUncompressed virtual method of a ktxTexture.
    #define ktxTexture_GetImageSize(This, level)
     Helper for calling the GetImageSize virtual method of a ktxTexture.
    #define ktxTexture_GetLevelSize(This, level)
     Helper for calling the GetImageSize virtual method of a ktxTexture.
    #define ktxTexture_IterateLevels(This, iterCb, userdata)
     Helper for calling the IterateLevels virtual method of a ktxTexture.
    #define ktxTexture_IterateLoadLevelFaces(This, iterCb, userdata)
     Helper for calling the IterateLoadLevelFaces virtual method of a ktxTexture.
    #define ktxTexture_LoadImageData(This, pBuffer, bufSize)
     Helper for calling the LoadImageData virtual method of a ktxTexture.
    #define ktxTexture_NeedsTranscoding(This)
     Helper for calling the NeedsTranscoding virtual method of a ktxTexture.
    #define ktxTexture_SetImageFromMemory(This, level, layer, faceSlice, src, srcSize)
     Helper for calling the SetImageFromMemory virtual method of a ktxTexture.
    #define ktxTexture_SetImageFromStdioStream(This, level, layer, faceSlice, src, srcSize)
     Helper for calling the SetImageFromStdioStream virtual method of a ktxTexture.
    #define ktxTexture_WriteToStdioStream(This, dstsstr)
     Helper for calling the WriteToStdioStream virtual method of a ktxTexture.
    #define ktxTexture_WriteToNamedFile(This, dstname)
     Helper for calling the WriteToNamedfile virtual method of a ktxTexture.
    #define ktxTexture_WriteToMemory(This, ppDstBytes, pSize)
     Helper for calling the WriteToMemory virtual method of a ktxTexture.
    #define ktxTexture_WriteToStream(This, dststr)
     Helper for calling the WriteToStream virtual method of a ktxTexture.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Typedefs

    +typedef enum ktx_error_code_e ktx_error_code_e
     Error codes returned by library functions.
    +typedef enum ktx_error_code_e ktxResult
     Result codes returned by library functions.
    +typedef enum ktxSupercmpScheme ktxSupercmpScheme
     Enumerators identifying the supercompression scheme.
    +typedef KTX_error_code(* ktxStream_read) (ktxStream *str, void *dst, const ktx_size_t count)
     type for a pointer to a stream reading function
    +typedef KTX_error_code(* ktxStream_skip) (ktxStream *str, const ktx_size_t count)
     type for a pointer to a stream skipping function
    +typedef KTX_error_code(* ktxStream_write) (ktxStream *str, const void *src, const ktx_size_t size, const ktx_size_t count)
     type for a pointer to a stream writing function
    +typedef KTX_error_code(* ktxStream_getpos) (ktxStream *str, ktx_off_t *const offset)
     type for a pointer to a stream position query function
    +typedef KTX_error_code(* ktxStream_setpos) (ktxStream *str, const ktx_off_t offset)
     type for a pointer to a stream position query function
    +typedef KTX_error_code(* ktxStream_getsize) (ktxStream *str, ktx_size_t *const size)
     type for a pointer to a stream size query function
    +typedef void(* ktxStream_destruct) (ktxStream *str)
     Destruct a stream.
    +typedef void(KTX_APIENTRY * PFNVOIDFUNCTION) (void)
     typedef of function pointer returned by GLGetProcAddress functions.
    +typedef PFNVOIDFUNCTION(KTX_APIENTRY * PFNGLGETPROCADDRESS) (const char *proc)
     typedef of pointer to function for retrieving OpenGL function pointers.
    +typedef enum ktx_pack_uastc_flag_bits_e ktx_pack_uastc_flag_bits_e
     Flags specifiying UASTC encoding options.
    +typedef enum ktx_pack_astc_quality_levels_e ktx_pack_astc_quality_levels_e
     Options specifiying ASTC encoding quality levels.
    +typedef enum ktx_pack_astc_block_dimension_e ktx_pack_astc_block_dimension_e
     Options specifiying ASTC encoding block dimensions.
    +typedef enum ktx_pack_astc_encoder_mode_e ktx_pack_astc_encoder_mode_e
     Options specifying ASTC encoder mode.
    typedef struct ktxAstcParams ktxAstcParams
     Structure for passing extended parameters to ktxTexture_CompressAstc.
    typedef struct ktxBasisParams ktxBasisParams
     Structure for passing extended parameters to ktxTexture2_CompressBasisEx().
    typedef enum ktx_transcode_fmt_e ktx_transcode_fmt_e
     Enumerators for specifying the transcode target format.
    +typedef enum ktx_transcode_flag_bits_e ktx_transcode_flag_bits_e
     Flags guiding transcoding of Basis Universal compressed textures.
    + + + + + + + + + + + + + + + + + +

    +Enumerations

    enum  ktx_error_code_e {
    +  KTX_SUCCESS = 0 +, KTX_FILE_DATA_ERROR +, KTX_FILE_ISPIPE +, KTX_FILE_OPEN_FAILED +,
    +  KTX_FILE_OVERFLOW +, KTX_FILE_READ_ERROR +, KTX_FILE_SEEK_ERROR +, KTX_FILE_UNEXPECTED_EOF +,
    +  KTX_FILE_WRITE_ERROR +, KTX_GL_ERROR +, KTX_INVALID_OPERATION +, KTX_INVALID_VALUE +,
    +  KTX_NOT_FOUND +, KTX_OUT_OF_MEMORY +, KTX_TRANSCODE_FAILED +, KTX_UNKNOWN_FILE_FORMAT +,
    +  KTX_UNSUPPORTED_TEXTURE_TYPE +, KTX_UNSUPPORTED_FEATURE +, KTX_LIBRARY_NOT_LINKED +, KTX_DECOMPRESS_LENGTH_ERROR +,
    +  KTX_DECOMPRESS_CHECKSUM_ERROR +, KTX_ERROR_MAX_ENUM = KTX_DECOMPRESS_CHECKSUM_ERROR +
    + }
     Error codes returned by library functions. More...
    enum  ktxSupercmpScheme { KTX_SS_NONE = 0 +, KTX_SS_BASIS_LZ = 1 +, KTX_SS_ZSTD = 2 +, KTX_SS_ZLIB = 3 +, KTX_SS_BEGIN_RANGE = KTX_SS_NONE +, KTX_SS_END_RANGE = KTX_SS_ZLIB +, KTX_SS_BEGIN_VENDOR_RANGE = 0x10000 +, KTX_SS_END_VENDOR_RANGE = 0x1ffff +, KTX_SS_BEGIN_RESERVED = 0x20000 + }
     Enumerators identifying the supercompression scheme. More...
    enum  ktx_pack_uastc_flag_bits_e {
    +  KTX_PACK_UASTC_LEVEL_FASTEST = 0 +, KTX_PACK_UASTC_LEVEL_FASTER = 1 +, KTX_PACK_UASTC_LEVEL_DEFAULT = 2 +, KTX_PACK_UASTC_LEVEL_SLOWER = 3 +,
    +  KTX_PACK_UASTC_LEVEL_VERYSLOW = 4 +, KTX_PACK_UASTC_MAX_LEVEL = KTX_PACK_UASTC_LEVEL_VERYSLOW +, KTX_PACK_UASTC_LEVEL_MASK = 0xF +, KTX_PACK_UASTC_FAVOR_UASTC_ERROR = 8 +,
    +  KTX_PACK_UASTC_FAVOR_BC7_ERROR = 16 +, KTX_PACK_UASTC_ETC1_FASTER_HINTS = 64 +, KTX_PACK_UASTC_ETC1_FASTEST_HINTS = 128 +, KTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL = 256 +
    + }
     Flags specifiying UASTC encoding options. More...
    enum  ktx_pack_astc_quality_levels_e {
    +  KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST = 0 +, KTX_PACK_ASTC_QUALITY_LEVEL_FAST = 10 +, KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM = 60 +, KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH = 98 +,
    +  KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE = 100 +, KTX_PACK_ASTC_QUALITY_LEVEL_MAX = KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE +
    + }
     Options specifiying ASTC encoding quality levels. More...
    enum  ktx_pack_astc_block_dimension_e { }
     Options specifiying ASTC encoding block dimensions. More...
    enum  ktx_pack_astc_encoder_mode_e { KTX_PACK_ASTC_ENCODER_MODE_DEFAULT +, KTX_PACK_ASTC_ENCODER_MODE_LDR +, KTX_PACK_ASTC_ENCODER_MODE_HDR +, KTX_PACK_ASTC_ENCODER_MODE_MAX = KTX_PACK_ASTC_ENCODER_MODE_HDR + }
     Options specifying ASTC encoder mode. More...
    enum  ktx_transcode_fmt_e {
    +  KTX_TTF_ETC1_RGB = 0 +, KTX_TTF_ETC2_RGBA = 1 +, KTX_TTF_BC1_RGB = 2 +, KTX_TTF_BC3_RGBA = 3 +,
    +  KTX_TTF_BC4_R = 4 +, KTX_TTF_BC5_RG = 5 +, KTX_TTF_BC7_RGBA = 6 +, KTX_TTF_PVRTC1_4_RGB = 8 +,
    +  KTX_TTF_PVRTC1_4_RGBA = 9 +, KTX_TTF_ASTC_4x4_RGBA = 10 +, KTX_TTF_PVRTC2_4_RGB = 18 +, KTX_TTF_PVRTC2_4_RGBA = 19 +,
    +  KTX_TTF_ETC2_EAC_R11 = 20 +, KTX_TTF_ETC2_EAC_RG11 = 21 +, KTX_TTF_RGBA32 = 13 +, KTX_TTF_RGB565 = 14 +,
    +  KTX_TTF_BGR565 = 15 +, KTX_TTF_RGBA4444 = 16 +, KTX_TTF_ETC = 22 +, KTX_TTF_BC1_OR_3 = 23 +,
    +  KTX_TTF_NOSELECTION = 0x7fffffff +, KTX_TF_ETC1 = KTX_TTF_ETC1_RGB +, KTX_TF_ETC2 = KTX_TTF_ETC +, KTX_TF_BC1 = KTX_TTF_BC1_RGB +,
    +  KTX_TF_BC3 = KTX_TTF_BC3_RGBA +, KTX_TF_BC4 = KTX_TTF_BC4_R +, KTX_TF_BC5 = KTX_TTF_BC5_RG +, KTX_TTF_BC7_M6_RGB = KTX_TTF_BC7_RGBA +,
    +  KTX_TTF_BC7_M5_RGBA = KTX_TTF_BC7_RGBA +, KTX_TF_BC7_M6_OPAQUE_ONLY = KTX_TTF_BC7_RGBA +, KTX_TF_PVRTC1_4_OPAQUE_ONLY = KTX_TTF_PVRTC1_4_RGB +
    + }
     Enumerators for specifying the transcode target format. More...
    enum  ktx_transcode_flag_bits_e { KTX_TF_PVRTC_DECODE_TO_NEXT_POW2 = 2 +, KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS = 4 +, KTX_TF_HIGH_QUALITY = 32 + }
     Flags guiding transcoding of Basis Universal compressed textures. More...
    + + + + + + + + + + + +

    +Functions

    KTX_API KTX_error_code KTX_APIENTRY ktxLoadOpenGL (PFNGLGETPROCADDRESS pfnGLGetProcAddress)
     Load pointers for the GL functions used by the ktxTexture*_GLUpload functions.
    KTX_API KTX_error_code KTX_APIENTRY ktxTexture2_DecodeAstc (ktxTexture2 *This)
     Decodes a ktx2 texture object, if it is ASTC encoded.
    KTX_API const char *KTX_APIENTRY ktxErrorString (KTX_error_code error)
     Return a string corresponding to a KTX error code.
    KTX_API const char *KTX_APIENTRY ktxSupercompressionSchemeString (ktxSupercmpScheme scheme)
     Return a string corresponding to a supercompressionScheme enumeration.
    KTX_API const char *KTX_APIENTRY ktxTranscodeFormatString (ktx_transcode_fmt_e format)
     Return a string corresponding to a transcode format enumeration.
    +

    Detailed Description

    +

    Declares the public functions and structures of the KTX API.

    +
    Author
    Mark Callow, Edgewise Consulting and while at HI Corporation
    +
    +Based on original work by Georg Kolling, Imagination Technology
    +
    API Version
    v4.0
    +

    Macro Definition Documentation

    + +

    ◆ KTX_error_code

    + +
    +
    + + + + +
    #define KTX_error_code   ktx_error_code_e
    +
    + +

    For backward compatibility.

    +
    Deprecated
    Use ktx_error_code_e.
    +
    Examples
    glloader.c, and vkload.cpp.
    +
    + +
    +
    + +

    ◆ ktxTexture_Destroy

    + +
    +
    + + + + + + + +
    #define ktxTexture_Destroy( This)
    +
    +Value:
    (This)->vtbl->Destroy(This)
    +
    +

    Helper for calling the Destroy virtual method of a ktxTexture.

    +

    Destroy a ktxTexture2 object.

    +

    This frees the memory associated with the texture contents and the memory of the ktxTexture2 object. This does not delete any OpenGL or Vulkan texture objects created by ktxTexture2_GLUpload or ktxTexture2_VkUpload.

    +
    Parameters
    + + +
    [in]Thispointer to the ktxTexture2 object to destroy
    +
    +
    +
    Examples
    vkload.cpp.
    +
    + +
    +
    + +

    ◆ ktxTexture_GetDataSizeUncompressed

    + +
    +
    + + + + + + + +
    #define ktxTexture_GetDataSizeUncompressed( This)
    +
    +Value:
    (This)->vtbl->GetDataSizeUncompressed(This)
    +
    +

    Helper for calling the GetDataSizeUncompressed virtual method of a ktxTexture.

    +

    For a ktxTexture1 this will always return the value of This->dataSize.

    +

    If supercompressionScheme == KTX_SS_NONE or KTX_SS_BASIS_LZ, returns the value of This->dataSize else if supercompressionScheme == KTX_SS_ZSTD or KTX_SS_ZLIB, it returns the sum of the uncompressed sizes of each mip level plus space for the level padding. With no supercompression the data size and uncompressed data size are the same. For Basis supercompression the uncompressed size cannot be known until the data is transcoded so the compressed size is returned.

    +
    Parameters
    + + +
    [in]Thispointer to the ktxTexture1 object of interest.
    +
    +
    + +
    +
    + +

    ◆ ktxTexture_GetImageOffset

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #define ktxTexture_GetImageOffset( This,
    level,
    layer,
    faceSlice,
    pOffset )
    +
    +Value:
    (This)->vtbl->GetImageOffset(This, level, layer, faceSlice, pOffset)
    +
    +

    Helper for calling the GetImageOffset virtual method of a ktxTexture.

    +

    Find the offset of an image within a ktxTexture's image data.

    +

    As there is no such thing as a 3D cubemap we make the 3rd location parameter do double duty. Only works for non-supercompressed textures as there is no way to tell where an image is for a supercompressed one.

    +
    Parameters
    + + + + + + +
    [in]Thispointer to the ktxTexture object of interest.
    [in]levelmip level of the image.
    [in]layerarray layer of the image.
    [in]faceSlicecube map face or depth slice of the image.
    [in,out]pOffsetpointer to location to store the offset.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error.
    +
    Exceptions
    + + + + +
    KTX_INVALID_OPERATIONlevel, layer or faceSlice exceed the dimensions of the texture.
    KTX_INVALID_OPERATIONTexture is supercompressed.
    KTX_INVALID_VALIDThis is NULL.
    +
    +
    + +
    +
    + +

    ◆ ktxTexture_GetImageSize

    + +
    +
    + + + + + + + + + + + +
    #define ktxTexture_GetImageSize( This,
    level )
    +
    +Value:
    (This)->vtbl->GetImageSize(This, level)
    +
    +

    Helper for calling the GetImageSize virtual method of a ktxTexture.

    +

    Calculate & return the size in bytes of an image at the specified mip level.

    +

    For arrays, this is the size of a layer, for cubemaps, the size of a face and for 3D textures, the size of a depth slice.

    +

    The size reflects the padding of each row to KTX_GL_UNPACK_ALIGNMENT.

    +
    Parameters
    + + + +
    [in]Thispointer to the ktxTexture2 object of interest.
    [in]levellevel of interest. *
    +
    +
    + +
    +
    + +

    ◆ ktxTexture_GetLevelSize

    + +
    +
    + + + + + + + + + + + +
    #define ktxTexture_GetLevelSize( This,
    level )
    +
    +Value:
    (This)->vtbl->GetLevelSize(This, level)
    +
    +

    Helper for calling the GetImageSize virtual method of a ktxTexture.

    +

    Calculate & return the size in bytes of an image at the specified mip level.

    +

    For arrays, this is the size of a layer, for cubemaps, the size of a face and for 3D textures, the size of a depth slice.

    +

    The size reflects the padding of each row to KTX_GL_UNPACK_ALIGNMENT.

    +
    Parameters
    + + + +
    [in]Thispointer to the ktxTexture2 object of interest.
    [in]levellevel of interest. *
    +
    +
    + +
    +
    + +

    ◆ ktxTexture_IterateLevels

    + +
    +
    + + + + + + + + + + + + + + + + +
    #define ktxTexture_IterateLevels( This,
    iterCb,
    userdata )
    +
    +Value:
    (This)->vtbl->IterateLevels(This, iterCb, userdata)
    +
    +

    Helper for calling the IterateLevels virtual method of a ktxTexture.

    +

    Iterate over the mip levels in a ktxTexture2 object.

    +

    This is almost identical to ktxTexture_IterateLevelFaces(). The difference is that the blocks of image data for non-array cube maps include all faces of a mip level.

    +

    This function works even if This->pData == 0 so it can be used to obtain offsets and sizes for each level by callers who have loaded the data externally.

    +

    Intended for use only when supercompressionScheme == SUPERCOMPRESSION_NONE.

    +
    Parameters
    + + + + +
    [in]Thishandle of the ktxTexture opened on the data.
    [in,out]iterCbthe address of a callback function which is called with the data for each image block.
    [in,out]userdatathe address of application-specific data which is passed to the callback along with the image data.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error. The following are returned directly by this function. iterCb may return these for other causes or may return additional errors.
    +
    Exceptions
    + + + + +
    KTX_FILE_DATA_ERRORMip level sizes are increasing not decreasing
    KTX_INVALID_OPERATIONsupercompressionScheme != SUPERCOMPRESSION_NONE.
    KTX_INVALID_VALUEThis is NULL or iterCb is NULL.
    +
    +
    + +
    +
    + +

    ◆ ktxTexture_IterateLoadLevelFaces

    + +
    +
    + + + + + + + + + + + + + + + + +
    #define ktxTexture_IterateLoadLevelFaces( This,
    iterCb,
    userdata )
    +
    +Value:
    (This)->vtbl->IterateLoadLevelFaces(This, iterCb, userdata)
    +
    +

    Helper for calling the IterateLoadLevelFaces virtual method of a ktxTexture.

    +

    Iterate over the images in a ktxTexture2 object while loading the image data.

    +

    This operates similarly to ktxTexture_IterateLevelFaces() except that it loads the images from the ktxTexture2's source to a temporary buffer while iterating. If supercompressionScheme == KTX_SS_ZSTD or KTX_SS_ZLIB, it will inflate the data before passing it to the callback. The callback function must copy the image data if it wishes to preserve it as the temporary buffer is reused for each level and is freed when this function exits.

    +

    This function is helpful for reducing memory usage when uploading the data to a graphics API.

    +

    Intended for use only when supercompressionScheme == KTX_SS_NONE, KTX_SS_ZSTD or KTX_SS_ZLIB. As there is no access to the ktxTexture's data on conclusion of this function, destroying the texture on completion is recommended.

    +
    Parameters
    + + + + +
    [in]Thispointer to the ktxTexture2 object of interest.
    [in,out]iterCbthe address of a callback function which is called with the data for each image.
    [in,out]userdatathe address of application-specific data which is passed to the callback along with the image data.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error. The following are returned directly by this function. iterCb may return these for other causes or may return additional errors.
    +
    Exceptions
    + + + + + + +
    KTX_FILE_DATA_ERRORmip level sizes are increasing not decreasing
    KTX_INVALID_OPERATIONthe ktxTexture2 was not created from a stream, i.e there is no data to load, or this ktxTexture2's images have already been loaded.
    KTX_INVALID_OPERATIONsupercompressionScheme != KTX_SS_NONE, supercompressionScheme != KTX_SS_ZSTD, and supercompressionScheme != KTX_SS_ZLIB.
    KTX_INVALID_VALUEThis is NULL or iterCb is NULL.
    KTX_OUT_OF_MEMORYnot enough memory to allocate a block to hold the base level image.
    +
    +
    +
    Examples
    glloader.c.
    +
    + +
    +
    + +

    ◆ ktxTexture_LoadImageData

    + +
    +
    + + + + + + + + + + + + + + + + +
    #define ktxTexture_LoadImageData( This,
    pBuffer,
    bufSize )
    +
    +Value:
    (This)->vtbl->LoadImageData(This, pBuffer, bufSize)
    +
    +

    Helper for calling the LoadImageData virtual method of a ktxTexture.

    +

    Load all the image data from the ktxTexture2's source.

    +

    The data will be inflated if supercompressionScheme == KTX_SS_ZSTD or KTX_SS_ZLIB. The data is loaded into the provided buffer or to an internally allocated buffer, if pBuffer is NULL. Callers providing their own buffer must ensure the buffer large enough to hold the inflated data for files deflated with Zstd or ZLIB. See ktxTexture2_GetDataSizeUncompressed().

    +

    The texture's levelIndex, dataSize, DFD and supercompressionScheme will all be updated after successful inflation to reflect the inflated data.

    +
    Parameters
    + + + + +
    [in]Thispointer to the ktxTexture object of interest.
    [in]pBufferpointer to the buffer in which to load the image data.
    [in]bufSizesize of the buffer pointed at by pBuffer.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error.
    +
    Exceptions
    + + + + + +
    KTX_INVALID_VALUEThis is NULL.
    KTX_INVALID_VALUEbufSize is less than the the image data size.
    KTX_INVALID_OPERATIONThe data has already been loaded or the ktxTexture was not created from a KTX source.
    KTX_OUT_OF_MEMORYInsufficient memory for the image data.
    +
    +
    + +
    +
    + +

    ◆ ktxTexture_NeedsTranscoding

    + +
    +
    + + + + + + + +
    #define ktxTexture_NeedsTranscoding( This)
    +
    +Value:
    (This)->vtbl->NeedsTranscoding(This)
    +
    +

    Helper for calling the NeedsTranscoding virtual method of a ktxTexture.

    +

    Query if the images are in a transcodable format.

    +
    Parameters
    + + +
    [in]Thispointer to the ktxTexture2 object of interest.
    +
    +
    + +
    +
    + +

    ◆ ktxTexture_SetImageFromMemory

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #define ktxTexture_SetImageFromMemory( This,
    level,
    layer,
    faceSlice,
    src,
    srcSize )
    +
    +Value:
    (This)->vtbl->SetImageFromMemory(This, level, layer, faceSlice, src, srcSize)
    +
    +

    Helper for calling the SetImageFromMemory virtual method of a ktxTexture.

    +

    Set image for level, layer, faceSlice from an image in memory.

    +

    Uncompressed images in memory are expected to have their rows tightly packed as is the norm for most image file formats. KTX 2 also requires tight packing this function does not add any padding.

    +

    Level, layer, faceSlice rather than offset are specified to enable some validation.

    +
    Note
    The caller is responsible for freeing the original image memory referred to by src.
    +
    Parameters
    + + + + + + + +
    [in]Thispointer to the target ktxTexture object.
    [in]levelmip level of the image to set.
    [in]layerarray layer of the image to set.
    [in]faceSlicecube map face or depth slice of the image to set or KTX_FACESLICE_WHOLE_LEVEL to set the entire level.
    [in]srcpointer to the image source in memory.
    [in]srcSizesize of the source image in bytes.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error.
    +
    Exceptions
    + + + + +
    KTX_INVALID_VALUEThis or src is NULL.
    KTX_INVALID_VALUEsrcSize != the expected image size for the specified level, layer & faceSlice.
    KTX_INVALID_OPERATIONNo storage was allocated when the texture was created.
    +
    +
    + +
    +
    + +

    ◆ ktxTexture_SetImageFromStdioStream

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #define ktxTexture_SetImageFromStdioStream( This,
    level,
    layer,
    faceSlice,
    src,
    srcSize )
    +
    +Value:
    (This)->vtbl->SetImageFromStdioStream(This, level, layer, faceSlice, \
    +
    src, srcSize)
    +
    +

    Helper for calling the SetImageFromStdioStream virtual method of a ktxTexture.

    +

    Set image for level, layer, faceSlice from a stdio stream source.

    +

    Uncompressed images read from the stream are expected to have their rows tightly packed as is the norm for most image file formats. KTX 2 also requires tight packing this function does not add any padding.

    +

    Level, layer, faceSlice rather than offset are specified to enable some validation.

    +
    Parameters
    + + + + + + + +
    [in]Thispointer to the target ktxTexture object.
    [in]levelmip level of the image to set.
    [in]layerarray layer of the image to set.
    [in]faceSlicecube map face or depth slice of the image to set or KTX_FACESLICE_WHOLE_LEVEL to set the entire level.
    [in]srcstdio stream pointer to the source.
    [in]srcSizesize of the source image in bytes.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error.
    +
    Exceptions
    + + + + +
    KTX_INVALID_VALUEThis or src is NULL.
    KTX_INVALID_VALUEsrcSize != the expected image size for the specified level, layer & faceSlice.
    KTX_INVALID_OPERATIONNo storage was allocated when the texture was created.
    +
    +
    + +
    +
    + +

    ◆ ktxTexture_WriteToMemory

    + +
    +
    + + + + + + + + + + + + + + + + +
    #define ktxTexture_WriteToMemory( This,
    ppDstBytes,
    pSize )
    +
    +Value:
    (This)->vtbl->WriteToMemory(This, ppDstBytes, pSize)
    +
    +

    Helper for calling the WriteToMemory virtual method of a ktxTexture.

    +

    Write a ktxTexture object to block of memory in KTX format.

    +

    Memory is allocated by the function and the caller is responsible for freeing it.

    +

    Callers are strongly urged to include a KTXwriter item in the texture's metadata. It can be added by code, similar to the following, prior to calling this function.

    char writer[100];
    +
    snprintf(writer, sizeof(writer), "%s version %s", appName, appVer);
    +
    ktxHashList_AddKVPair(&texture->kvDataHead, KTX_WRITER_KEY,
    +
    (ktx_uint32_t)strlen(writer) + 1,
    +
    writer);
    +
    #define KTX_WRITER_KEY
    Key string for standard writer metadata.
    Definition ktx.h:134
    +
    Parameters
    + + + + +
    [in]Thispointer to the target ktxTexture object.
    [in,out]ppDstBytespointer to location to write the address of the destination memory. The Application is responsible for freeing this memory.
    [in,out]pSizepointer to location to write the size in bytes of the KTX data.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error.
    +
    Exceptions
    + + + + + + +
    KTX_INVALID_VALUEThis, ppDstBytes or pSize is NULL.
    KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
    KTX_INVALID_OPERATIONBoth kvDataHead and kvData are set in the ktxTexture
    KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
    KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
    +
    +
    + +
    +
    + +

    ◆ ktxTexture_WriteToNamedFile

    + +
    +
    + + + + + + + + + + + +
    #define ktxTexture_WriteToNamedFile( This,
    dstname )
    +
    +Value:
    (This)->vtbl->WriteToNamedFile(This, dstname)
    +
    +

    Helper for calling the WriteToNamedfile virtual method of a ktxTexture.

    +

    Write a ktxTexture object to a named file in KTX format.

    +

    The file name must be encoded in utf-8. On Windows convert unicode names to utf-8 with WideCharToMultiByte(CP_UTF8, ...) before calling.

    +

    Callers are strongly urged to include a KTXwriter item in the texture's metadata. It can be added by code, similar to the following, prior to calling this function.

    char writer[100];
    +
    snprintf(writer, sizeof(writer), "%s version %s", appName, appVer);
    +
    ktxHashList_AddKVPair(&texture->kvDataHead, KTX_WRITER_KEY,
    +
    (ktx_uint32_t)strlen(writer) + 1,
    +
    writer);
    +
    Parameters
    + + + +
    [in]Thispointer to the target ktxTexture object.
    [in]dstnamedestination file name.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error.
    +
    Exceptions
    + + + + + + +
    KTX_INVALID_VALUEThis or dstname is NULL.
    KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
    KTX_INVALID_OPERATIONBoth kvDataHead and kvData are set in the ktxTexture
    KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
    KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
    +
    +
    + +
    +
    + +

    ◆ ktxTexture_WriteToStdioStream

    + +
    +
    + + + + + + + + + + + +
    #define ktxTexture_WriteToStdioStream( This,
    dstsstr )
    +
    +Value:
    (This)->vtbl->WriteToStdioStream(This, dstsstr)
    +
    +

    Helper for calling the WriteToStdioStream virtual method of a ktxTexture.

    +

    Write a ktxTexture object to a stdio stream in KTX format.

    +

    Callers are strongly urged to include a KTXwriter item in the texture's metadata. It can be added by code, similar to the following, prior to calling this function.

    char writer[100];
    +
    snprintf(writer, sizeof(writer), "%s version %s", appName, appVer);
    +
    ktxHashList_AddKVPair(&texture->kvDataHead, KTX_WRITER_KEY,
    +
    (ktx_uint32_t)strlen(writer) + 1,
    +
    writer);
    +
    Parameters
    + + + +
    [in]Thispointer to the target ktxTexture object.
    [in]dstsstrdestination stdio stream.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error.
    +
    Exceptions
    + + + + + + +
    KTX_INVALID_VALUEThis or dstsstr is NULL.
    KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
    KTX_INVALID_OPERATIONBoth kvDataHead and kvData are set in the ktxTexture
    KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
    KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
    +
    +
    + +
    +
    + +

    ◆ ktxTexture_WriteToStream

    + +
    +
    + + + + + + + + + + + +
    #define ktxTexture_WriteToStream( This,
    dststr )
    +
    +Value:
    (This)->vtbl->WriteToStream(This, dststr)
    +
    +

    Helper for calling the WriteToStream virtual method of a ktxTexture.

    +

    Write a ktxTexture object to a ktxStream in KTX format.

    +
    Parameters
    + + + +
    [in]Thispointer to the target ktxTexture object.
    [in]dststrdestination ktxStream.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error.
    +
    Exceptions
    + + + + + + + +
    KTX_INVALID_VALUEThis or dststr is NULL.
    KTX_INVALID_OPERATIONThe ktxTexture does not contain any image data.
    KTX_INVALID_OPERATIONBoth kvDataHead and kvData are set in the ktxTexture
    KTX_INVALID_OPERATIONThe length of the already set writerId metadata plus the library's version id exceeds the maximum allowed.
    KTX_FILE_OVERFLOWThe file exceeded the maximum size supported by the system.
    KTX_FILE_WRITE_ERRORAn error occurred while writing the file.
    +
    +
    + +
    +
    +

    Typedef Documentation

    + +

    ◆ ktx_transcode_fmt_e

    + +
    +
    + + + + +
    typedef enum ktx_transcode_fmt_e ktx_transcode_fmt_e
    +
    + +

    Enumerators for specifying the transcode target format.

    +

    For BasisU/ETC1S format, Opaque and alpha here refer to 2 separate RGB images, a.k.a slices within the BasisU compressed data. For UASTC format they refer to the RGB and the alpha components of the UASTC data. If the original image had only 2 components, R will be in the opaque portion and G in the alpha portion. The R value will be replicated in the RGB components. In the case of BasisU the G value will be replicated in all 3 components of the alpha slice. If the original image had only 1 component it's value is replicated in all 3 components of the opaque portion and there is no alpha.

    +
    Note
    You should not transcode sRGB encoded data to KTX_TTF_BC4_R, KTX_TTF_BC5_RG, KTX_TTF_ETC2_EAC_R{,G}11, KTX_TTF_RGB565, KTX_TTF_BGR565 or KTX_TTF_RGBA4444 formats as neither OpenGL nor Vulkan support sRGB variants of these. Doing sRGB decoding in the shader will not produce correct results if any texture filtering is being used.
    + +
    +
    + +

    ◆ ktxAstcParams

    + +
    +
    + + + + +
    typedef struct ktxAstcParams ktxAstcParams
    +
    + +

    Structure for passing extended parameters to ktxTexture_CompressAstc.

    +

    Passing a struct initialized to 0 (e.g. " = {0};") will use blockDimension 4x4, mode LDR and qualityLevel FASTEST. Setting qualityLevel to KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM is recommended.

    + +
    +
    + +

    ◆ ktxBasisParams

    + +
    +
    + + + + +
    typedef struct ktxBasisParams ktxBasisParams
    +
    + +

    Structure for passing extended parameters to ktxTexture2_CompressBasisEx().

    +

    If you only want default values, use ktxTexture2_CompressBasis(). Here, at a minimum you must initialize the structure as follows:

    ktxBasisParams params = {0};
    +
    params.structSize = sizeof(params);
    +
    params.compressionLevel = KTX_ETC1S_DEFAULT_COMPRESSION_LEVEL;
    +
    Structure for passing extended parameters to ktxTexture2_CompressBasisEx().
    Definition ktx.h:1379
    +
    ktx_uint32_t compressionLevel
    Definition ktx.h:1398
    +
    ktx_uint32_t structSize
    Definition ktx.h:1380
    +

    compressionLevel has to be explicitly set because 0 is a valid compressionLevel but is not the default used by the BasisU encoder when no value is set. Only the other settings that are to be non-default must be non-zero.

    + +
    +
    +

    Enumeration Type Documentation

    + +

    ◆ ktx_error_code_e

    + +
    +
    + + + + +
    enum ktx_error_code_e
    +
    + +

    Error codes returned by library functions.

    + + + + + + + + + + + + + + + + + + + + + + + +
    Enumerator
    KTX_SUCCESS 

    Operation was successful.

    +
    KTX_FILE_DATA_ERROR 

    The data in the file is inconsistent with the spec.

    +
    KTX_FILE_ISPIPE 

    The file is a pipe or named pipe.

    +
    KTX_FILE_OPEN_FAILED 

    The target file could not be opened.

    +
    KTX_FILE_OVERFLOW 

    The operation would exceed the max file size.

    +
    KTX_FILE_READ_ERROR 

    An error occurred while reading from the file.

    +
    KTX_FILE_SEEK_ERROR 

    An error occurred while seeking in the file.

    +
    KTX_FILE_UNEXPECTED_EOF 

    File does not have enough data to satisfy request.

    +
    KTX_FILE_WRITE_ERROR 

    An error occurred while writing to the file.

    +
    KTX_GL_ERROR 

    GL operations resulted in an error.

    +
    KTX_INVALID_OPERATION 

    The operation is not allowed in the current state.

    +
    KTX_INVALID_VALUE 

    A parameter value was not valid.

    +
    KTX_NOT_FOUND 

    Requested metadata key or required dynamically loaded GPU function was not found.

    +
    KTX_OUT_OF_MEMORY 

    Not enough memory to complete the operation.

    +
    KTX_TRANSCODE_FAILED 

    Transcoding of block compressed texture failed.

    +
    KTX_UNKNOWN_FILE_FORMAT 

    The file not a KTX file

    +
    KTX_UNSUPPORTED_TEXTURE_TYPE 

    The KTX file specifies an unsupported texture type.

    +
    KTX_UNSUPPORTED_FEATURE 

    Feature not included in in-use library or not yet implemented.

    +
    KTX_LIBRARY_NOT_LINKED 

    Library dependency (OpenGL or Vulkan) not linked into application.

    +
    KTX_DECOMPRESS_LENGTH_ERROR 

    Decompressed byte count does not match expected byte size

    +
    KTX_DECOMPRESS_CHECKSUM_ERROR 

    Checksum mismatch when decompressing

    +
    KTX_ERROR_MAX_ENUM 

    For safety checks.

    +
    +
    Examples
    glloader.c.
    +
    + +
    +
    + +

    ◆ ktx_pack_astc_block_dimension_e

    + +
    +
    + +

    Options specifiying ASTC encoding block dimensions.

    + + +
    Enumerator
    KTX_PACK_ASTC_BLOCK_DIMENSION_MAX 

    Maximum supported blocks.

    +
    + +
    +
    + +

    ◆ ktx_pack_astc_encoder_mode_e

    + +
    +
    + +

    Options specifying ASTC encoder mode.

    + + + + + +
    Enumerator
    KTX_PACK_ASTC_ENCODER_MODE_DEFAULT 

    Selects LDR mode if component size is <= 8-bit, HDR otherwise.

    +
    KTX_PACK_ASTC_ENCODER_MODE_LDR 

    Always encode in low dynamic range mode.

    +
    KTX_PACK_ASTC_ENCODER_MODE_HDR 

    Always encode in high dynamic range mode.

    +
    KTX_PACK_ASTC_ENCODER_MODE_MAX 

    Indicates the maximum permissible value.

    +
    + +
    +
    + +

    ◆ ktx_pack_astc_quality_levels_e

    + +
    +
    + +

    Options specifiying ASTC encoding quality levels.

    + + + + + + + +
    Enumerator
    KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST 

    Fastest compression.

    +
    KTX_PACK_ASTC_QUALITY_LEVEL_FAST 

    Fast compression.

    +
    KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM 

    Medium compression.

    +
    KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH 

    Slower compression.

    +
    KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE 

    Very slow compression.

    +
    KTX_PACK_ASTC_QUALITY_LEVEL_MAX 

    Maximum supported quality level.

    +
    + +
    +
    + +

    ◆ ktx_pack_uastc_flag_bits_e

    + +
    +
    + + + + +
    enum ktx_pack_uastc_flag_bits_e
    +
    + +

    Flags specifiying UASTC encoding options.

    + + + + + + + + + + + + + +
    Enumerator
    KTX_PACK_UASTC_LEVEL_FASTEST 

    Fastest compression. 43.45dB.

    +
    KTX_PACK_UASTC_LEVEL_FASTER 

    Faster compression. 46.49dB.

    +
    KTX_PACK_UASTC_LEVEL_DEFAULT 

    Default compression. 47.47dB.

    +
    KTX_PACK_UASTC_LEVEL_SLOWER 

    Slower compression. 48.01dB.

    +
    KTX_PACK_UASTC_LEVEL_VERYSLOW 

    Very slow compression. 48.24dB.

    +
    KTX_PACK_UASTC_MAX_LEVEL 

    Maximum supported quality level.

    +
    KTX_PACK_UASTC_LEVEL_MASK 

    Mask to extract the level from the other bits.

    +
    KTX_PACK_UASTC_FAVOR_UASTC_ERROR 

    Optimize for lowest UASTC error.

    +
    KTX_PACK_UASTC_FAVOR_BC7_ERROR 

    Optimize for lowest BC7 error.

    +
    KTX_PACK_UASTC_ETC1_FASTER_HINTS 

    Optimize for faster transcoding to ETC1.

    +
    KTX_PACK_UASTC_ETC1_FASTEST_HINTS 

    Optimize for fastest transcoding to ETC1.

    +
    KTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL 

    Not documented in BasisU code.

    +
    + +
    +
    + +

    ◆ ktx_transcode_flag_bits_e

    + +
    +
    + + + + +
    enum ktx_transcode_flag_bits_e
    +
    + +

    Flags guiding transcoding of Basis Universal compressed textures.

    + + + + +
    Enumerator
    KTX_TF_PVRTC_DECODE_TO_NEXT_POW2 

    PVRTC1: decode non-pow2 ETC1S texture level to the next larger power of 2 (not implemented yet, but we're going to support it). Ignored if the slice's dimensions are already a power of 2.

    +
    KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS 

    When decoding to an opaque texture format, if the Basis data has alpha, decode the alpha slice instead of the color slice to the output texture format. Has no effect if there is no alpha data.

    +
    KTX_TF_HIGH_QUALITY 

    Request higher quality transcode of UASTC to BC1, BC3, ETC2_EAC_R11 and ETC2_EAC_RG11. The flag is unused by other UASTC transcoders.

    +
    + +
    +
    + +

    ◆ ktx_transcode_fmt_e

    + +
    +
    + + + + +
    enum ktx_transcode_fmt_e
    +
    + +

    Enumerators for specifying the transcode target format.

    +

    For BasisU/ETC1S format, Opaque and alpha here refer to 2 separate RGB images, a.k.a slices within the BasisU compressed data. For UASTC format they refer to the RGB and the alpha components of the UASTC data. If the original image had only 2 components, R will be in the opaque portion and G in the alpha portion. The R value will be replicated in the RGB components. In the case of BasisU the G value will be replicated in all 3 components of the alpha slice. If the original image had only 1 component it's value is replicated in all 3 components of the opaque portion and there is no alpha.

    +
    Note
    You should not transcode sRGB encoded data to KTX_TTF_BC4_R, KTX_TTF_BC5_RG, KTX_TTF_ETC2_EAC_R{,G}11, KTX_TTF_RGB565, KTX_TTF_BGR565 or KTX_TTF_RGBA4444 formats as neither OpenGL nor Vulkan support sRGB variants of these. Doing sRGB decoding in the shader will not produce correct results if any texture filtering is being used.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Enumerator
    KTX_TTF_ETC1_RGB 

    Opaque only. Returns RGB or alpha data, if KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS flag is specified.

    +
    KTX_TTF_ETC2_RGBA 

    Opaque+alpha. EAC_A8 block followed by an ETC1 block. The alpha channel will be opaque for textures without an alpha channel.

    +
    KTX_TTF_BC1_RGB 

    Opaque only, no punchthrough alpha support yet. Returns RGB or alpha data, if KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS flag is specified.

    +
    KTX_TTF_BC3_RGBA 

    Opaque+alpha. BC4 block with alpha followed by a BC1 block. The alpha channel will be opaque for textures without an alpha channel.

    +
    KTX_TTF_BC4_R 

    One BC4 block. R = opaque.g or alpha.g, if KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS flag is specified.

    +
    KTX_TTF_BC5_RG 

    Two BC4 blocks, R=opaque.g and G=alpha.g The texture should have an alpha channel (if not G will be all 255's. For tangent space normal maps.

    +
    KTX_TTF_BC7_RGBA 

    RGB or RGBA mode 5 for ETC1S, modes 1, 2, 3, 4, 5, 6, 7 for UASTC.

    +
    KTX_TTF_PVRTC1_4_RGB 

    Opaque only. Returns RGB or alpha data, if KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS flag is specified.

    +
    KTX_TTF_PVRTC1_4_RGBA 

    Opaque+alpha. Most useful for simple opacity maps. If the texture doesn't have an alpha channel KTX_TTF_PVRTC1_4_RGB will be used instead. Lowest quality of any supported texture format.

    +
    KTX_TTF_ASTC_4x4_RGBA 

    Opaque+alpha, ASTC 4x4. The alpha channel will be opaque for textures without an alpha channel. The transcoder uses RGB/RGBA/L/LA modes, void extent, and up to two ([0,47] and [0,255]) endpoint precisions.

    +
    KTX_TTF_PVRTC2_4_RGB 

    Opaque-only. Almost BC1 quality, much faster to transcode and supports arbitrary texture dimensions (unlike PVRTC1 RGB).

    +
    KTX_TTF_PVRTC2_4_RGBA 

    Opaque+alpha. Slower to transcode than cTFPVRTC2_4_RGB. Premultiplied alpha is highly recommended, otherwise the color channel can leak into the alpha channel on transparent blocks.

    +
    KTX_TTF_ETC2_EAC_R11 

    R only (ETC2 EAC R11 unsigned). R = opaque.g or alpha.g, if KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS flag is specified.

    +
    KTX_TTF_ETC2_EAC_RG11 

    RG only (ETC2 EAC RG11 unsigned), R=opaque.g, G=alpha.g. The texture should have an alpha channel (if not G will be all 255's. For tangent space normal maps.

    +
    KTX_TTF_RGBA32 

    32bpp RGBA image stored in raster (not block) order in memory, R is first byte, A is last byte.

    +
    KTX_TTF_RGB565 

    16bpp RGB image stored in raster (not block) order in memory, R at bit position 11.

    +
    KTX_TTF_BGR565 

    16bpp RGB image stored in raster (not block) order in memory, R at bit position 0.

    +
    KTX_TTF_RGBA4444 

    16bpp RGBA image stored in raster (not block) order in memory, R at bit position 12, A at bit position 0.

    +
    KTX_TTF_ETC 

    Automatically selects KTX_TTF_ETC1_RGB or KTX_TTF_ETC2_RGBA according to presence of alpha.

    +
    KTX_TTF_BC1_OR_3 

    Automatically selects KTX_TTF_BC1_RGB or KTX_TTF_BC3_RGBA according to presence of alpha.

    +
    KTX_TF_ETC1 
    Deprecated
    Use KTX_TTF_ETC1_RGB.
    +
    KTX_TF_ETC2 
    Deprecated
    Use KTX_TTF_ETC.
    +
    KTX_TF_BC1 
    Deprecated
    Use KTX_TTF_BC1_RGB.
    +
    KTX_TF_BC3 
    Deprecated
    Use KTX_TTF_BC3_RGBA.
    +
    KTX_TF_BC4 
    Deprecated
    Use KTX_TTF_BC4_R.
    +
    KTX_TF_BC5 
    Deprecated
    Use KTX_TTF_BC5_RG.
    +
    KTX_TTF_BC7_M6_RGB 
    Deprecated
    Use KTX_TTF_BC7_RGBA.
    +
    KTX_TTF_BC7_M5_RGBA 
    Deprecated
    Use KTX_TTF_BC7_RGBA.
    +
    KTX_TF_BC7_M6_OPAQUE_ONLY 
    Deprecated
    Use KTX_TTF_BC7_RGBA
    +
    KTX_TF_PVRTC1_4_OPAQUE_ONLY 
    Deprecated
    Use KTX_TTF_PVRTC1_4_RGB.
    +
    + +
    +
    + +

    ◆ ktxSupercmpScheme

    + +
    +
    + + + + +
    enum ktxSupercmpScheme
    +
    + +

    Enumerators identifying the supercompression scheme.

    + + + + + +
    Enumerator
    KTX_SS_NONE 

    No supercompression.

    +
    KTX_SS_BASIS_LZ 

    Basis LZ supercompression.

    +
    KTX_SS_ZSTD 

    ZStd supercompression.

    +
    KTX_SS_ZLIB 

    ZLIB supercompression.

    +
    + +
    +
    +

    Function Documentation

    + +

    ◆ ktxErrorString()

    + +
    +
    + + + + + + + +
    KTX_API const char *KTX_APIENTRY ktxErrorString (KTX_error_code error)
    +
    + +

    Return a string corresponding to a KTX error code.

    +
    Parameters
    + + +
    errorthe error code for which to return a string
    +
    +
    +
    Returns
    pointer to the message string.
    +
    Examples
    vkload.cpp.
    +
    + +
    +
    + +

    ◆ ktxSupercompressionSchemeString()

    + +
    +
    + + + + + + + +
    KTX_API const char *KTX_APIENTRY ktxSupercompressionSchemeString (ktxSupercmpScheme scheme)
    +
    + +

    Return a string corresponding to a supercompressionScheme enumeration.

    +
    Parameters
    + + +
    schemethe supercompression scheme for which to return a string.
    +
    +
    +
    Returns
    pointer to the message string.
    + +
    +
    + +

    ◆ ktxTranscodeFormatString()

    + +
    +
    + + + + + + + +
    KTX_API const char *KTX_APIENTRY ktxTranscodeFormatString (ktx_transcode_fmt_e format)
    +
    + +

    Return a string corresponding to a transcode format enumeration.

    +
    Parameters
    + + +
    formatthe transcode format for which to return a string.
    +
    +
    +
    Returns
    pointer to the message string.
    + +
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/libktx/ktx_8h.js b/ktx/build/docs/html/libktx/ktx_8h.js new file mode 100644 index 0000000..feda2ef --- /dev/null +++ b/ktx/build/docs/html/libktx/ktx_8h.js @@ -0,0 +1,160 @@ +var ktx_8h = +[ + [ "ktxOrientation", "structktxOrientation.html", "structktxOrientation" ], + [ "ktxTexture", "structktxTexture.html", "structktxTexture" ], + [ "ktxTexture_vtbl", "structktxTexture__vtbl.html", null ], + [ "ktxTexture1", "structktxTexture1.html", "structktxTexture1" ], + [ "ktxTexture2", "structktxTexture2.html", "structktxTexture2" ], + [ "ktxTextureCreateInfo", "structktxTextureCreateInfo.html", "structktxTextureCreateInfo" ], + [ "ktxStream", "structktxStream.html", "structktxStream" ], + [ "ktxAstcParams", "structktxAstcParams.html", "structktxAstcParams" ], + [ "ktxBasisParams", "structktxBasisParams.html", "structktxBasisParams" ], + [ "KTX_ANIMDATA_KEY", "ktx_8h.html#a8c260cc2a9b8d4ee63ccc36810779f84", null ], + [ "KTX_error_code", "ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa", null ], + [ "KTX_GL_UNPACK_ALIGNMENT", "ktx_8h.html#ad5dd0ebf8aaef8c150603bd95d61b94a", null ], + [ "KTX_ORIENTATION1_FMT", "ktx_8h.html#a9b4e1997eff4e29930d5aca784483d57", null ], + [ "KTX_ORIENTATION2_FMT", "ktx_8h.html#ad235113b0090e64ad23a0cf7097e1b7a", null ], + [ "KTX_ORIENTATION3_FMT", "ktx_8h.html#ae34c19ed0ef799a902fa50dc3a0bbb20", null ], + [ "KTX_ORIENTATION_KEY", "ktx_8h.html#a7eebf850576083e740cf1f418eed39a0", null ], + [ "KTX_SWIZZLE_KEY", "ktx_8h.html#a526ee1e695723619c057875af35c93d6", null ], + [ "KTX_WRITER_KEY", "ktx_8h.html#aa23b5bdd596b2c6a6a2891a2ac48dc2c", null ], + [ "KTX_WRITER_SCPARAMS_KEY", "ktx_8h.html#a6a0fd67c05e916710effcf59ba36f44f", null ], + [ "ktxTexture_Destroy", "ktx_8h.html#a0becd37ccf729eed8723b969bb93df3d", null ], + [ "ktxTexture_GetDataSizeUncompressed", "ktx_8h.html#a920a40b531d615e674d797fe87d87e09", null ], + [ "ktxTexture_GetImageOffset", "ktx_8h.html#afdb41471bee56cef8241060de72d6735", null ], + [ "ktxTexture_GetImageSize", "ktx_8h.html#a56402340391b57f18d8c18e477e97280", null ], + [ "ktxTexture_GetLevelSize", "ktx_8h.html#a850617576a50a67b6c21d8c8ce1158be", null ], + [ "ktxTexture_IterateLevels", "ktx_8h.html#a7ca1ab524f2161c1facbb716f4cfab00", null ], + [ "ktxTexture_IterateLoadLevelFaces", "ktx_8h.html#ae5fd56d78ae250ac5f7511d8041ec514", null ], + [ "ktxTexture_LoadImageData", "ktx_8h.html#a1410163f284e12d74ef942dd9d48c3cf", null ], + [ "ktxTexture_NeedsTranscoding", "ktx_8h.html#a294c8d220fbff767174f192fb410a621", null ], + [ "ktxTexture_SetImageFromMemory", "ktx_8h.html#a11077712b020a97507c1e22a4c9c45b6", null ], + [ "ktxTexture_SetImageFromStdioStream", "ktx_8h.html#a4213a77d1c0ef016e0ee60463a8044be", null ], + [ "ktxTexture_WriteToMemory", "ktx_8h.html#a0eeccd38a1ec981cd3d2a1b98f4ff639", null ], + [ "ktxTexture_WriteToNamedFile", "ktx_8h.html#a5a338703d7be18ef6cc97a83d5fad8fe", null ], + [ "ktxTexture_WriteToStdioStream", "ktx_8h.html#a26698d6f4c0deee564b330040213de72", null ], + [ "ktxTexture_WriteToStream", "ktx_8h.html#a8dc8bad175207b3431d409abadd251d3", null ], + [ "ktx_error_code_e", "ktx_8h.html#a73e2b01e559ccfed8cf5fe0831b33ce9", null ], + [ "ktx_pack_astc_block_dimension_e", "ktx_8h.html#a9413ce1ef7871db012b9a798bed90639", null ], + [ "ktx_pack_astc_encoder_mode_e", "ktx_8h.html#a5206479bb101cbca15184f1f215f9607", null ], + [ "ktx_pack_astc_quality_levels_e", "ktx_8h.html#a63d8010783f001c80dc9d05dd1d3bb17", null ], + [ "ktx_pack_uastc_flag_bits_e", "ktx_8h.html#a2c20092a7ccf1454c1de41fe55a54e92", null ], + [ "ktx_transcode_flag_bits_e", "ktx_8h.html#aeeccd9521857185425c9af3b5866166b", null ], + [ "ktx_transcode_fmt_e", "ktx_8h.html#ac0484f02707783e103f82961444b7b16", null ], + [ "ktxAstcParams", "ktx_8h.html#a4b1f165e42ebf946fa91b7f35248a5a6", null ], + [ "ktxBasisParams", "ktx_8h.html#aeb8baf7100f7a354c6f0fe99900cf179", null ], + [ "ktxResult", "ktx_8h.html#a6ab3f7a528fbda067855818ac8d75c87", null ], + [ "ktxStream_destruct", "ktx_8h.html#ab703620f9a5c5911d6013debf72393d6", null ], + [ "ktxStream_getpos", "ktx_8h.html#a2eacbb95ed30f1e9ae81fd6d121fd16e", null ], + [ "ktxStream_getsize", "ktx_8h.html#a261dbe3b2c1ba0d35a1bf76ad9a98ba0", null ], + [ "ktxStream_read", "ktx_8h.html#a6beb14c7c8e74de38847b6a5d9ebd171", null ], + [ "ktxStream_setpos", "ktx_8h.html#ae2022617df68fe4041c707e1693370d1", null ], + [ "ktxStream_skip", "ktx_8h.html#a0890fb8e1623b63c86883d50a0d841aa", null ], + [ "ktxStream_write", "ktx_8h.html#a3d5d2a3a413c5e549dedc54873afc668", null ], + [ "ktxSupercmpScheme", "ktx_8h.html#a5edebc0f71559845a8620cf6b1bf65ca", null ], + [ "PFNGLGETPROCADDRESS", "ktx_8h.html#aa823ce7b0db0aaefb942c4b5a07504be", null ], + [ "PFNVOIDFUNCTION", "ktx_8h.html#afc39c694986ea1dc6a81da7dc6c2776e", null ], + [ "ktx_error_code_e", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116c", [ + [ "KTX_SUCCESS", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98", null ], + [ "KTX_FILE_DATA_ERROR", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca0a3b899c794df326ebcea8dd3a679c14", null ], + [ "KTX_FILE_ISPIPE", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca2570f4138cacf052d6ff892931507851", null ], + [ "KTX_FILE_OPEN_FAILED", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cac8f2bb08408001aad4941fc7b3f45558", null ], + [ "KTX_FILE_OVERFLOW", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf1c77ba0fee3c65d49a334bec949c8a6", null ], + [ "KTX_FILE_READ_ERROR", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca1559258b3bd0f47eef28fd4839074452", null ], + [ "KTX_FILE_SEEK_ERROR", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cae5983275cc1d3d3480c5cf1275723cf1", null ], + [ "KTX_FILE_UNEXPECTED_EOF", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cab6d2090e851d9757ce32c05ec807ba4d", null ], + [ "KTX_FILE_WRITE_ERROR", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca85733279b7d3e00ad9a6d498d6686645", null ], + [ "KTX_GL_ERROR", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf", null ], + [ "KTX_INVALID_OPERATION", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a", null ], + [ "KTX_INVALID_VALUE", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca7da41bb3195d6cc93a513ac18bc91e4f", null ], + [ "KTX_NOT_FOUND", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cac9008e8d20f60f4fb67d735f287be470", null ], + [ "KTX_OUT_OF_MEMORY", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca87728a1745ea6333b6fbe041c03036f2", null ], + [ "KTX_TRANSCODE_FAILED", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad9ba6e380b7a1d44a10b6626357ee3a1", null ], + [ "KTX_UNKNOWN_FILE_FORMAT", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cadbeb98d59020ac018a4f697d068fff21", null ], + [ "KTX_UNSUPPORTED_TEXTURE_TYPE", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad3d82ba3467063bec92486a94a38d21d", null ], + [ "KTX_UNSUPPORTED_FEATURE", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca04808a4c3abddb237d2a8cf903205496", null ], + [ "KTX_LIBRARY_NOT_LINKED", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caac88f0051f9b5c217f3f53128e6960ef", null ], + [ "KTX_DECOMPRESS_LENGTH_ERROR", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca37dce54f5aefa409567d7c08e36d1d83", null ], + [ "KTX_DECOMPRESS_CHECKSUM_ERROR", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca349391a68adb9c8c4a71dd50d6e96745", null ], + [ "KTX_ERROR_MAX_ENUM", "ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cabb7ad088582cd16709a27679312363ae", null ] + ] ], + [ "ktx_pack_astc_block_dimension_e", "ktx_8h.html#a1873d492a1b1fc5fd3296192fce3e9d5", [ + [ "KTX_PACK_ASTC_BLOCK_DIMENSION_MAX", "ktx_8h.html#a1873d492a1b1fc5fd3296192fce3e9d5a8a0a5ff023478a7951bf6cef24987558", null ] + ] ], + [ "ktx_pack_astc_encoder_mode_e", "ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6", [ + [ "KTX_PACK_ASTC_ENCODER_MODE_DEFAULT", "ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6af943cccff0ab1790f5ff14ca250d7f65", null ], + [ "KTX_PACK_ASTC_ENCODER_MODE_LDR", "ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6a6971976df75bdc5aa7099b59ad345361", null ], + [ "KTX_PACK_ASTC_ENCODER_MODE_HDR", "ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6a02edf562ddcc85e6fdefb9b8304ef7ec", null ], + [ "KTX_PACK_ASTC_ENCODER_MODE_MAX", "ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6a123569090bcb7d44f26d40e365fc821a", null ] + ] ], + [ "ktx_pack_astc_quality_levels_e", "ktx_8h.html#a8f70163f537a794c472479bc5c1905e9", [ + [ "KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST", "ktx_8h.html#a8f70163f537a794c472479bc5c1905e9a8f9546d69b84dad39f540d465c00fe2f", null ], + [ "KTX_PACK_ASTC_QUALITY_LEVEL_FAST", "ktx_8h.html#a8f70163f537a794c472479bc5c1905e9aae959532601276e8e112d2cc0ae42324", null ], + [ "KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM", "ktx_8h.html#a8f70163f537a794c472479bc5c1905e9a17832137be7a8ff0b839fd41e1abb923", null ], + [ "KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH", "ktx_8h.html#a8f70163f537a794c472479bc5c1905e9aeaf5ea197d3c6f3f2b8ee70809ac60f7", null ], + [ "KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE", "ktx_8h.html#a8f70163f537a794c472479bc5c1905e9af195805d16e6875f46da8dc875b753c5", null ], + [ "KTX_PACK_ASTC_QUALITY_LEVEL_MAX", "ktx_8h.html#a8f70163f537a794c472479bc5c1905e9a3f3681d3e1feb7fb6707a5b3aa1366b1", null ] + ] ], + [ "ktx_pack_uastc_flag_bits_e", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670", [ + [ "KTX_PACK_UASTC_LEVEL_FASTEST", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a2f97075bb6e51728f82d0d51c16acc1c", null ], + [ "KTX_PACK_UASTC_LEVEL_FASTER", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a81acf28386d4eb6f184c850254d87f6f", null ], + [ "KTX_PACK_UASTC_LEVEL_DEFAULT", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a3a4df853d3a689ccde076618d013d642", null ], + [ "KTX_PACK_UASTC_LEVEL_SLOWER", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a9ac3a05c6fe72efd3a61cbdd0b244699", null ], + [ "KTX_PACK_UASTC_LEVEL_VERYSLOW", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a375bd5a1c645198196a4b536de67f276", null ], + [ "KTX_PACK_UASTC_MAX_LEVEL", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a6ee376eeb5c1b736fb5f71025b332375", null ], + [ "KTX_PACK_UASTC_LEVEL_MASK", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670abccd25d5ac984dab93df3b711712c778", null ], + [ "KTX_PACK_UASTC_FAVOR_UASTC_ERROR", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a9b456a870a596abbc95d946c1c1e681c", null ], + [ "KTX_PACK_UASTC_FAVOR_BC7_ERROR", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a2aa07cb9f618a10440c7fc0c1838d83d", null ], + [ "KTX_PACK_UASTC_ETC1_FASTER_HINTS", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670ae3abc0e230dfe7395d80ae5216f0820d", null ], + [ "KTX_PACK_UASTC_ETC1_FASTEST_HINTS", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670ac8356ccb10a6259c5483181e9158f191", null ], + [ "KTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL", "ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670ac0f60c4fb9a32fd8101eeda8a699fa0e", null ] + ] ], + [ "ktx_transcode_flag_bits_e", "ktx_8h.html#ab2288718afab080ff86e9d3250180fb6", [ + [ "KTX_TF_PVRTC_DECODE_TO_NEXT_POW2", "ktx_8h.html#ab2288718afab080ff86e9d3250180fb6a0757a22b5adb1792c54547f1d759878d", null ], + [ "KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS", "ktx_8h.html#ab2288718afab080ff86e9d3250180fb6a76abf8fba809fc617dbdf65d70320d24", null ], + [ "KTX_TF_HIGH_QUALITY", "ktx_8h.html#ab2288718afab080ff86e9d3250180fb6a1f5bb151dc8463b0a917d98cb42f3506", null ] + ] ], + [ "ktx_transcode_fmt_e", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5", [ + [ "KTX_TTF_ETC1_RGB", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a6b1967cc612417644b7ecb86bdc2de48", null ], + [ "KTX_TTF_ETC2_RGBA", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a665baafd3c1d246bf2726342a083a26b", null ], + [ "KTX_TTF_BC1_RGB", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a7b596baf4e8088b0ddda7615971e274e", null ], + [ "KTX_TTF_BC3_RGBA", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a352f7aeb953d220e0fa4abc025a6f880", null ], + [ "KTX_TTF_BC4_R", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5aebbc72211dd8662af91b2f910fda4be3", null ], + [ "KTX_TTF_BC5_RG", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5af030f0703301f830ece442aa508195b0", null ], + [ "KTX_TTF_BC7_RGBA", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5aacba582511ea35fbec2fa8fa92a900cc", null ], + [ "KTX_TTF_PVRTC1_4_RGB", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a6d129443f90dd85da21fd1fc1fd50e36", null ], + [ "KTX_TTF_PVRTC1_4_RGBA", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a14600faaff61212753946fd9b74b4064", null ], + [ "KTX_TTF_ASTC_4x4_RGBA", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a26ee2ca9dbc9384ded1c41c59a8bc3b6", null ], + [ "KTX_TTF_PVRTC2_4_RGB", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ab7dacf1384bb2f22655b9cf6064fd5e8", null ], + [ "KTX_TTF_PVRTC2_4_RGBA", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5af884679766dab49838e52c55d8304d59", null ], + [ "KTX_TTF_ETC2_EAC_R11", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a7ea42a1c24b02633a3041dcd49c11dfe", null ], + [ "KTX_TTF_ETC2_EAC_RG11", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5abeba5d59ae679316666a71c48ced66c5", null ], + [ "KTX_TTF_RGBA32", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad790151a02bcf2368e3157e180a2fdd9", null ], + [ "KTX_TTF_RGB565", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ab949b2bfc245a6d8098817954ac41290", null ], + [ "KTX_TTF_BGR565", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5acc73a45251f2fd88d3f580dee0e14108", null ], + [ "KTX_TTF_RGBA4444", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5acae08dfc76603e86b16908a8d6c46833", null ], + [ "KTX_TTF_ETC", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad5caffd2fe438bbac51f2e314a3dd7c3", null ], + [ "KTX_TTF_BC1_OR_3", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ae1906b8161119e9aca1add331ecf6de6", null ], + [ "KTX_TF_ETC1", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a4d5ff56c820f41b01ceaa7b1056fd38c", null ], + [ "KTX_TF_ETC2", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad0aacfd9b57f902f7e140a9fe4a501bd", null ], + [ "KTX_TF_BC1", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5abb672255cb647aceeb99b05e7f6d99b2", null ], + [ "KTX_TF_BC3", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a6a05289216c33a4c731e7b9670e83eab", null ], + [ "KTX_TF_BC4", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a260df90000f23f2bf1a06368304f5985", null ], + [ "KTX_TF_BC5", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a39a369e112f19db1769f6c02b26f283b", null ], + [ "KTX_TTF_BC7_M6_RGB", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad84ab9c0ac149b791721ce08a4498d74", null ], + [ "KTX_TTF_BC7_M5_RGBA", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a0725a0280faa5a362e823daa958b9e5d", null ], + [ "KTX_TF_BC7_M6_OPAQUE_ONLY", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5afcf0ab81c08710d1c1ad1a0445a4775f", null ], + [ "KTX_TF_PVRTC1_4_OPAQUE_ONLY", "ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a2117d164feecb02ba5199b4ee72d2f04", null ] + ] ], + [ "ktxSupercmpScheme", "ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daa", [ + [ "KTX_SS_NONE", "ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaa9559585b30aa7fe5d510753ceae6fcc6", null ], + [ "KTX_SS_BASIS_LZ", "ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaaf66da31ed897385538dab6c591e5bf5c", null ], + [ "KTX_SS_ZSTD", "ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaa29f7da526697257766534b667fd706ef", null ], + [ "KTX_SS_ZLIB", "ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaa01c22adc03102420ef016d614cb5e0f5", null ] + ] ], + [ "ktxErrorString", "ktx_8h.html#a829eac221b33617c15a1b5a898a0771a", null ], + [ "ktxLoadOpenGL", "group__ktx__glloader.html#gada67f60796793d1ed9eb1f3f2d61d4a6", null ], + [ "ktxSupercompressionSchemeString", "ktx_8h.html#ad54399157902016600b0543ca027c61c", null ], + [ "ktxTexture2_DecodeAstc", "group__reader.html#gaea0edab86daca9c288d4cd6b47b34e28", null ], + [ "ktxTranscodeFormatString", "ktx_8h.html#ac86f20d7858aaacef77f7eee15983470", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/ktx_8h__dep__incl.map b/ktx/build/docs/html/libktx/ktx_8h__dep__incl.map new file mode 100644 index 0000000..95babaf --- /dev/null +++ b/ktx/build/docs/html/libktx/ktx_8h__dep__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ktx/build/docs/html/libktx/ktx_8h__dep__incl.md5 b/ktx/build/docs/html/libktx/ktx_8h__dep__incl.md5 new file mode 100644 index 0000000..08b161f --- /dev/null +++ b/ktx/build/docs/html/libktx/ktx_8h__dep__incl.md5 @@ -0,0 +1 @@ +f0194d02eefba5d4dbdfbb3e0280fff7 \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/ktx_8h__dep__incl.png b/ktx/build/docs/html/libktx/ktx_8h__dep__incl.png new file mode 100644 index 0000000..2d953d2 Binary files /dev/null and b/ktx/build/docs/html/libktx/ktx_8h__dep__incl.png differ diff --git a/ktx/build/docs/html/libktx/ktx_8h__incl.map b/ktx/build/docs/html/libktx/ktx_8h__incl.map new file mode 100644 index 0000000..90ec821 --- /dev/null +++ b/ktx/build/docs/html/libktx/ktx_8h__incl.map @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/libktx/ktx_8h__incl.md5 b/ktx/build/docs/html/libktx/ktx_8h__incl.md5 new file mode 100644 index 0000000..9b78efc --- /dev/null +++ b/ktx/build/docs/html/libktx/ktx_8h__incl.md5 @@ -0,0 +1 @@ +14a0fc14e97e69b79fc9b36396d26f7f \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/ktx_8h__incl.png b/ktx/build/docs/html/libktx/ktx_8h__incl.png new file mode 100644 index 0000000..a5692ae Binary files /dev/null and b/ktx/build/docs/html/libktx/ktx_8h__incl.png differ diff --git a/ktx/build/docs/html/libktx/ktx_logo_200.png b/ktx/build/docs/html/libktx/ktx_logo_200.png new file mode 100644 index 0000000..9bacd67 Binary files /dev/null and b/ktx/build/docs/html/libktx/ktx_logo_200.png differ diff --git a/ktx/build/docs/html/libktx/libktx_history.html b/ktx/build/docs/html/libktx/libktx_history.html new file mode 100644 index 0000000..432a2d7 --- /dev/null +++ b/ktx/build/docs/html/libktx/libktx_history.html @@ -0,0 +1,199 @@ + + + + + + + +libktx Reference: Revision History + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    libktx Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Revision History
    +
    +
    +

    No longer updated. Kept to preserve ancient history. For more recent history see the repo log at https://github.com/KhronosGroup/KTX-Software. See also the Release Notes in the repo.

    +

    +Version 4.0

    +

    Added:

      +
    • Support for KTX Version 2.
    • +
    • Support for encoding and transcoding Basis Universal images in KTX Version 2 files.
    • +
    • Function to print info about a KTX file.
    • +
    +

    +Version 3.0.1

    +

    Fixed:

      +
    • GitHub issue #159: compile failure with recent Vulkan SDKs.
    • +
    • Incorrect mapping of GL DXT3 and DXT5 formats to Vulkan equivalents.
    • +
    • Incorrect BC4 blocksize.
    • +
    • Missing mapping of PVRTC formats from GL to Vulkan.
    • +
    • Incorrect block width and height calculations for sizes that are not a multiple of the block size.
    • +
    • Incorrect KTXorientation key in test images.
    • +
    +

    +Version 3.0

    +

    Added:

      +
    • new ktxTexture object based API for reading KTX files without an OpenGL context.
    • +
    • Vulkan loader. #include <ktxvulkan.h> to use it.
    • +
    +

    Changed:

      +
    • ktx.h to not depend on KHR/khrplatform.h and GL{,ES*}/gl{corearb,}.h. Applications using OpenGL must now include these files themselves.
    • +
    • ktxLoadTexture[FMN], removing the hack of loading 1D textures as 2D textures when the OpenGL context does not support 1D textures. KTX_UNSUPPORTED_TEXTURE_TYPE is now returned.
    • +
    +

    +Version 2.0.2

    +

    Added:

      +
    • Support for cubemap arrays.
    • +
    +

    Changed:

      +
    • New build system
    • +
    +

    Fixed:

      +
    • GitHub issue #40: failure to byte-swap key-value lengths.
    • +
    • GitHub issue #33: returning incorrect target when loading cubemaps.
    • +
    • GitHub PR #42: loading of texture arrays.
    • +
    • GitHub PR #41: compilation error when KTX_OPENGL_ES2=1 defined.
    • +
    • GitHub issue #39: stack-buffer-overflow in toktx
    • +
    • Don't use GL_EXTENSIONS on recent OpenGL versions.
    • +
    +

    +Version 2.0.1

    +

    Added:

      +
    • CMake build files. Thanks to Pavel Rotjberg for the initial version.
    • +
    +

    Changed:

      +
    • ktxWriteKTXF to check the validity of the type & format combinations passed to it.
    • +
    +

    Fixed:

      +
    • Public Bugzilla 999: 16-bit luminance texture cannot be written.
    • +
    • compile warnings from compilers stricter than MS Visual C++. Thanks to Pavel Rotjberg.
    • +
    +

    +Version 2.0

    +

    Added:

      +
    • support for decoding ETC2 and EAC formats in the absence of a hardware decoder.
    • +
    • support for converting textures with legacy LUMINANCE, LUMINANCE_ALPHA, etc. formats to the equivalent R, RG, etc. format with an appropriate swizzle, when loading in OpenGL Core Profile contexts.
    • +
    • ktxErrorString function to return a string corresponding to an error code.
    • +
    • tests for ktxLoadTexture[FN] that run under OpenGL ES 3.0 and OpenGL 3.3. The latter includes an EGL on WGL wrapper that makes porting apps between OpenGL ES and OpenGL easier on Windows.
    • +
    • more texture formats to ktxLoadTexture[FN] and toktx tests.
    • +
    +

    Changed:

      +
    • ktxLoadTexture[FMN] to discover the capabilities of the GL context at run time and load textures, or not, according to those capabilities.
    • +
    +

    Fixed:

      +
    • failure of ktxWriteKTXF to pad image rows to 4 bytes as required by the KTX format.
    • +
    • ktxWriteKTXF exiting with KTX_FILE_WRITE_ERROR when attempting to write more than 1 byte of face-LOD padding.
    • +
    +

    Although there is only a very minor API change, the addition of ktxErrorString, the functional changes are large enough to justify bumping the major revision number.

    +

    +Version 1.0.1

    +

    Implemented ktxLoadTextureM. Fixed the following:

      +
    • Public Bugzilla 571: crash when null passed for pIsMipmapped.
    • +
    • Public Bugzilla 572: memory leak when unpacking ETC textures.
    • +
    • Public Bugzilla 573: potential crash when unpacking ETC textures with unused padding pixels.
    • +
    • Public Bugzilla 576: various small fixes.
    • +
    +

    Thanks to Krystian Bigaj for the ktxLoadTextureM implementation and these fixes.

    +

    +Version 1.0

    +

    Initial release.

    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/libktx/memstream_8c.html b/ktx/build/docs/html/libktx/memstream_8c.html new file mode 100644 index 0000000..c984c17 --- /dev/null +++ b/ktx/build/docs/html/libktx/memstream_8c.html @@ -0,0 +1,330 @@ + + + + + + + +libktx Reference: lib/memstream.c File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    libktx Reference 0.0.0 +
    +
    Libraries and tools to create and read KTX image texture files.
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    memstream.c File Reference
    +
    +
    + +

    Implementation of ktxStream for memory. +More...

    +
    #include <assert.h>
    +#include <string.h>
    +#include <stdlib.h>
    +#include "ktx.h"
    +#include "ktxint.h"
    +#include "memstream.h"
    +
    +Include dependency graph for memstream.c:
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +

    +Macros

    +#define KTX_MEM_DEFAULT_ALLOCATED_SIZE   256
     Default allocation size for a ktxMemStream.
    + + + + + + + + + + + +

    +Functions

    KTX_error_code ktxMemStream_getdata (ktxStream *str, ktx_uint8_t **ppBytes)
     Get a pointer to a ktxMemStream's data.
    +void ktxMemStream_setup (ktxStream *str)
     Setup ktxMemStream function pointers.
    KTX_error_code ktxMemStream_construct (ktxStream *str, ktx_bool_t freeOnDestruct)
     Initialize a read-write ktxMemStream.
    KTX_error_code ktxMemStream_construct_ro (ktxStream *str, const ktx_uint8_t *bytes, const ktx_size_t numBytes)
     Initialize a read-only ktxMemStream.
    void ktxMemStream_destruct (ktxStream *str)
     Free the memory used by a ktxMemStream.
    +

    Detailed Description

    +

    Implementation of ktxStream for memory.

    +
    Author
    Maksim Kolesin, Under Development
    +
    +Georg Kolling, Imagination Technology
    +
    +Mark Callow, HI Corporation
    +

    Function Documentation

    + +

    ◆ ktxMemStream_construct()

    + +
    +
    + + + + + + + + + + + +
    KTX_error_code ktxMemStream_construct (ktxStream * str,
    ktx_bool_t freeOnDestruct )
    +
    + +

    Initialize a read-write ktxMemStream.

    +

    Memory is allocated as data is written. The caller of this is responsible for freeing this memory unless freeOnDestruct is not KTX_FALSE.

    +
    Parameters
    + + + +
    [in]strpointer to a ktxStream struct to initialize.
    [in]freeOnDestructIf not KTX_FALSE memory holding the data will be freed by the destructor.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error.
    +
    Exceptions
    + + + +
    KTX_INVALID_VALUEstr is NULL.
    KTX_OUT_OF_MEMORYsystem failed to allocate sufficient memory.
    +
    +
    + +
    +
    + +

    ◆ ktxMemStream_construct_ro()

    + +
    +
    + + + + + + + + + + + + + + + + +
    KTX_error_code ktxMemStream_construct_ro (ktxStream * str,
    const ktx_uint8_t * bytes,
    const ktx_size_t numBytes )
    +
    + +

    Initialize a read-only ktxMemStream.

    +
    Parameters
    + + + + +
    [in]strpointer to a ktxStream struct to initialize.
    [in]bytespointer to an array of bytes containing the data.
    [in]numBytessize of array of data for ktxMemStream.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error.
    +
    Exceptions
    + + + +
    KTX_INVALID_VALUEstr or mem is NULL or numBytes is 0. or size is less than 0.
    KTX_OUT_OF_MEMORYsystem failed to allocate sufficient memory.
    +
    +
    + +
    +
    + +

    ◆ ktxMemStream_destruct()

    + +
    +
    + + + + + + + +
    void ktxMemStream_destruct (ktxStream * str)
    +
    + +

    Free the memory used by a ktxMemStream.

    +

    This only frees the memory used to store the data written to the stream, if the freeOnDestruct parameter to ktxMemStream_construct() was not KTX_FALSE. Otherwise it is the responsibility of the caller of ktxMemStream_construct() and a pointer to this memory should be retrieved using ktxMemStream_getdata() before calling this function.

    +
    See also
    ktxMemStream_construct, ktxMemStream_getdata.
    +
    Parameters
    + + +
    [in]strpointer to the ktxStream whose memory is to be freed.
    +
    +
    + +
    +
    + +

    ◆ ktxMemStream_getdata()

    + +
    +
    + + + + + + + + + + + +
    KTX_error_code ktxMemStream_getdata (ktxStream * str,
    ktx_uint8_t ** ppBytes )
    +
    + +

    Get a pointer to a ktxMemStream's data.

    +

    Gets a pointer to data that has been written to the stream. Returned pointer will be 0 if stream is read-only.

    +
    Parameters
    + + + +
    [in]strpointer to the ktxStream whose data pointer is to be queried.
    [in,out]ppBytespointer to a variable in which the data pointer will be written.
    +
    +
    +
    Returns
    KTX_SUCCESS on success, other KTX_* enum values on error.
    +
    Exceptions
    + + +
    KTX_INVALID_VALUEstr or ppBytes is NULL.
    +
    +
    + +
    +
    +
    +
    + +
    + + + + diff --git a/ktx/build/docs/html/libktx/memstream_8c.js b/ktx/build/docs/html/libktx/memstream_8c.js new file mode 100644 index 0000000..795c1e1 --- /dev/null +++ b/ktx/build/docs/html/libktx/memstream_8c.js @@ -0,0 +1,9 @@ +var memstream_8c = +[ + [ "KTX_MEM_DEFAULT_ALLOCATED_SIZE", "memstream_8c.html#ad9d0c31ff64d0512e98e0b6991051b62", null ], + [ "ktxMemStream_construct", "memstream_8c.html#a899a1878ad93c797c8c2d9aacffc6365", null ], + [ "ktxMemStream_construct_ro", "memstream_8c.html#a3c0f816438f1e4412376b35fa66f9424", null ], + [ "ktxMemStream_destruct", "memstream_8c.html#a81f0db4b157134a8edf51c2936e853e4", null ], + [ "ktxMemStream_getdata", "memstream_8c.html#a3f9cc251a3604f80da67440efff21b6d", null ], + [ "ktxMemStream_setup", "memstream_8c.html#a777303765bd7d021820c90ff6ad85afa", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/memstream_8c__incl.map b/ktx/build/docs/html/libktx/memstream_8c__incl.map new file mode 100644 index 0000000..bd4f0ca --- /dev/null +++ b/ktx/build/docs/html/libktx/memstream_8c__incl.map @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/libktx/memstream_8c__incl.md5 b/ktx/build/docs/html/libktx/memstream_8c__incl.md5 new file mode 100644 index 0000000..56ee529 --- /dev/null +++ b/ktx/build/docs/html/libktx/memstream_8c__incl.md5 @@ -0,0 +1 @@ +d93ed9b7afd899cf2e2a74bac428380a \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/memstream_8c__incl.png b/ktx/build/docs/html/libktx/memstream_8c__incl.png new file mode 100644 index 0000000..31a730c Binary files /dev/null and b/ktx/build/docs/html/libktx/memstream_8c__incl.png differ diff --git a/ktx/build/docs/html/libktx/menu.js b/ktx/build/docs/html/libktx/menu.js new file mode 100644 index 0000000..15f9c52 --- /dev/null +++ b/ktx/build/docs/html/libktx/menu.js @@ -0,0 +1,131 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search,treeview) { + function makeTree(data,relPath) { + let result=''; + if ('children' in data) { + result+='
      '; + for (let i in data.children) { + let url; + const link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + let searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
    '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '+ + '
    '+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + $('#main-menu').append('
  • '); + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; + if ($mainMenuState.length) { + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(treeview); + } + // animate mobile menu + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = () => $menu.css('display', 'block'); + $menu.hide().slideDown(options); + } else { + options['complete'] = () => $menu.css('display', 'none'); + $menu.show().slideUp(options); + } + }); + // set default menu visibility + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/ktx/build/docs/html/libktx/menudata.js b/ktx/build/docs/html/libktx/menudata.js new file mode 100644 index 0000000..1a78103 --- /dev/null +++ b/ktx/build/docs/html/libktx/menudata.js @@ -0,0 +1,135 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"libktx Reference",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"_",url:"functions.html#index__5F"}, +{text:"a",url:"functions_a.html#index_a"}, +{text:"b",url:"functions_b.html#index_b"}, +{text:"c",url:"functions_c.html#index_c"}, +{text:"d",url:"functions_d.html#index_d"}, +{text:"e",url:"functions_e.html#index_e"}, +{text:"f",url:"functions_f.html#index_f"}, +{text:"g",url:"functions_g.html#index_g"}, +{text:"h",url:"functions_h.html#index_h"}, +{text:"i",url:"functions_i.html#index_i"}, +{text:"k",url:"functions_k.html#index_k"}, +{text:"l",url:"functions_l.html#index_l"}, +{text:"m",url:"functions_m.html#index_m"}, +{text:"n",url:"functions_n.html#index_n"}, +{text:"o",url:"functions_o.html#index_o"}, +{text:"p",url:"functions_p.html#index_p"}, +{text:"q",url:"functions_q.html#index_q"}, +{text:"r",url:"functions_r.html#index_r"}, +{text:"s",url:"functions_s.html#index_s"}, +{text:"t",url:"functions_t.html#index_t"}, +{text:"u",url:"functions_u.html#index_u"}, +{text:"v",url:"functions_v.html#index_v"}, +{text:"w",url:"functions_w.html#index_w"}, +{text:"x",url:"functions_x.html#index_x"}, +{text:"y",url:"functions_y.html#index_y"}, +{text:"z",url:"functions_z.html#index_z"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"h",url:"functions_func.html#index_h"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"v",url:"functions_func.html#index_v"}]}, +{text:"Variables",url:"functions_vars.html",children:[ +{text:"_",url:"functions_vars.html#index__5F"}, +{text:"a",url:"functions_vars.html#index_a"}, +{text:"b",url:"functions_vars.html#index_b"}, +{text:"c",url:"functions_vars.html#index_c"}, +{text:"d",url:"functions_vars.html#index_d"}, +{text:"e",url:"functions_vars.html#index_e"}, +{text:"f",url:"functions_vars.html#index_f"}, +{text:"g",url:"functions_vars.html#index_g"}, +{text:"h",url:"functions_vars.html#index_h"}, +{text:"i",url:"functions_vars.html#index_i"}, +{text:"k",url:"functions_vars.html#index_k"}, +{text:"l",url:"functions_vars.html#index_l"}, +{text:"m",url:"functions_vars.html#index_m"}, +{text:"n",url:"functions_vars.html#index_n"}, +{text:"o",url:"functions_vars.html#index_o"}, +{text:"p",url:"functions_vars.html#index_p"}, +{text:"q",url:"functions_vars.html#index_q"}, +{text:"r",url:"functions_vars.html#index_r"}, +{text:"s",url:"functions_vars.html#index_s"}, +{text:"t",url:"functions_vars.html#index_t"}, +{text:"u",url:"functions_vars.html#index_u"}, +{text:"v",url:"functions_vars.html#index_v"}, +{text:"w",url:"functions_vars.html#index_w"}, +{text:"x",url:"functions_vars.html#index_x"}, +{text:"y",url:"functions_vars.html#index_y"}, +{text:"z",url:"functions_vars.html#index_z"}]}, +{text:"Typedefs",url:"functions_type.html"}, +{text:"Enumerations",url:"functions_enum.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"a",url:"globals.html#index_a"}, +{text:"b",url:"globals.html#index_b"}, +{text:"d",url:"globals.html#index_d"}, +{text:"e",url:"globals.html#index_e"}, +{text:"f",url:"globals.html#index_f"}, +{text:"g",url:"globals.html#index_g"}, +{text:"i",url:"globals.html#index_i"}, +{text:"l",url:"globals.html#index_l"}, +{text:"m",url:"globals.html#index_m"}, +{text:"n",url:"globals.html#index_n"}, +{text:"o",url:"globals.html#index_o"}, +{text:"p",url:"globals.html#index_p"}, +{text:"r",url:"globals.html#index_r"}, +{text:"s",url:"globals.html#index_s"}, +{text:"t",url:"globals.html#index_t"}, +{text:"u",url:"globals.html#index_u"}, +{text:"w",url:"globals.html#index_w"}]}, +{text:"Functions",url:"globals_func.html"}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html",children:[ +{text:"d",url:"globals_eval.html#index_d"}, +{text:"e",url:"globals_eval.html#index_e"}, +{text:"f",url:"globals_eval.html#index_f"}, +{text:"g",url:"globals_eval.html#index_g"}, +{text:"i",url:"globals_eval.html#index_i"}, +{text:"l",url:"globals_eval.html#index_l"}, +{text:"n",url:"globals_eval.html#index_n"}, +{text:"o",url:"globals_eval.html#index_o"}, +{text:"p",url:"globals_eval.html#index_p"}, +{text:"s",url:"globals_eval.html#index_s"}, +{text:"t",url:"globals_eval.html#index_t"}, +{text:"u",url:"globals_eval.html#index_u"}]}, +{text:"Macros",url:"globals_defs.html"}]}]}, +{text:"Examples",url:"examples.html"}, +{text:"Package",url:"../index.html"}, +{text:"KTX Tools Reference",url:"../ktxtools/index.html"}, +{text:"KTX Javascript Wrappers Reference",url:"../ktxjswrappers/index.html"}, +{text:"pyktx Reference",url:"../pyktx/index.html"}, +{text:"License",url:"../license.html"}]} diff --git a/ktx/build/docs/html/libktx/navtree.css b/ktx/build/docs/html/libktx/navtree.css new file mode 100644 index 0000000..0ea3a07 --- /dev/null +++ b/ktx/build/docs/html/libktx/navtree.css @@ -0,0 +1,327 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0; + padding:0; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + position: relative; + background-color: var(--nav-menu-active-bg); + border-radius: 0 6px 6px 0; + /*margin-right: 5px;*/ +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); + line-height: 22px; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--page-link-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin: 0 6px 0 -5px; + padding: 0 0 0 5px; + height: 22px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; +} + +.ui-resizable-e:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +.ui-resizable-e:hover { + opacity: 1; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ + scrollbar-width: thin; + border-right: 1px solid var(--nav-border-color); + padding-left: 5px; +} + +#nav-sync { + position:absolute; + top:0px; + right:0px; + z-index:1; +} + +#nav-sync img { + opacity:0.3; +} + +div.nav-sync-icon { + position: relative; + width: 24px; + height: 17px; + left: -6px; + top: -1px; + opacity: 0.7; + display: inline-block; + background-color: var(--sync-icon-background-color); + border: 1px solid var(--sync-icon-border-color); + box-sizing: content-box; +} + +div.nav-sync-icon:hover { + background-color: var(--sync-icon-selected-background-color); + opacity: 1.0; +} + +div.nav-sync-icon.active:after { + content: ''; + background-color: var(--sync-icon-background-color); + border-top: 2px solid var(--sync-icon-color); + position: absolute; + width: 16px; + height: 0px; + top: 7px; + left: 4px; +} + +div.nav-sync-icon.active:hover:after { + border-top: 2px solid var(--sync-icon-selected-color); +} + +span.sync-icon-left { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 4px; + display: inline-block; + width: 8px; + height: 8px; + border-left: 2px solid var(--sync-icon-color); + border-top: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +span.sync-icon-right { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 10px; + display: inline-block; + width: 8px; + height: 8px; + border-right: 2px solid var(--sync-icon-color); + border-bottom: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +div.nav-sync-icon:hover span.sync-icon-left { + border-left: 2px solid var(--sync-icon-selected-color); + border-top: 2px solid var(--sync-icon-selected-color); +} + +div.nav-sync-icon:hover span.sync-icon-right { + border-right: 2px solid var(--sync-icon-selected-color); + border-bottom: 2px solid var(--sync-icon-selected-color); +} + +#nav-path ul { + border-top: 1px solid var(--nav-breadcrumb-separator-color); +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + +/*---------------------------*/ +#container { + display: grid; + grid-template-columns: auto auto; + overflow: hidden; +} + +#page-nav { + background: var(--nav-background-color); + display: block; + width: 250px; + box-sizing: content-box; + position: relative; + border-left: 1px solid var(--nav-border-color); +} + +#page-nav-tree { + display: inline-block; +} + +#page-nav-resize-handle { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; + z-index: 1; + user-select: none; +} + +#page-nav-resize-handle:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +#page-nav-resize-handle.dragging, +#page-nav-resize-handle:hover { + opacity: 1; +} + +#page-nav-contents { + padding: 0; + margin: 0; + display: block; + top: 0; + left: 0; + height: 100%; + width: 100%; + position: absolute; + overflow: auto; + scrollbar-width: thin; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +ul.page-outline, +ul.page-outline ul { + text-indent: 0; + list-style: none outside none; + padding: 0 0 0 4px; +} + +ul.page-outline { + margin: 0 4px 4px 6px; +} + +ul.page-outline div.item { + font: 12px var(--font-family-nav); + line-height: 22px; +} + +ul.page-outline li { + white-space: nowrap; +} + +ul.page-outline li.vis { + background-color: var(--nav-breadcrumb-active-bg); +} + +#container.resizing { + cursor: col-resize; + user-select: none; +} diff --git a/ktx/build/docs/html/libktx/navtree.js b/ktx/build/docs/html/libktx/navtree.js new file mode 100644 index 0000000..fac8d01 --- /dev/null +++ b/ktx/build/docs/html/libktx/navtree.js @@ -0,0 +1,901 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initNavTree(toroot,relpath,allMembersFile) { + let navTreeSubIndices = []; + const ARROW_DOWN = ''; + const ARROW_RIGHT = ''; + const NAVPATH_COOKIE_NAME = ''+'navpath'; + const fullSidebar = typeof page_layout!=='undefined' && page_layout==1; + + function getScrollBarWidth () { + let outer = $('
    ').css({visibility: 'hidden', width: 100, overflow: 'scroll', scrollbarWidth: 'thin'}).appendTo('body'); + let widthWithScroll = $('
    ').css({width: '100%'}).appendTo(outer).outerWidth(); + outer.remove(); + return 100 - widthWithScroll; + } + const scrollbarWidth = getScrollBarWidth(); + + function adjustSyncIconPosition() { + if (!fullSidebar) { + const nt = document.getElementById("nav-tree"); + const hasVerticalScrollbar = nt.scrollHeight > nt.clientHeight; + $("#nav-sync").css({right:parseInt(hasVerticalScrollbar?scrollbarWidth:0)}); + } + } + + const getData = function(varName) { + const i = varName.lastIndexOf('/'); + const n = i>=0 ? varName.substring(i+1) : varName; + const e = n.replace(/-/g,'_'); + return window[e]; + } + + const stripPath = function(uri) { + return uri.substring(uri.lastIndexOf('/')+1); + } + + const stripPath2 = function(uri) { + const i = uri.lastIndexOf('/'); + const s = uri.substring(i+1); + const m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; + } + + const hashValue = function() { + return $(location).attr('hash').substring(1).replace(/[^\w-]/g,''); + } + + const hashUrl = function() { + return '#'+hashValue(); + } + + const pathName = function() { + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;()]/g, ''); + } + + const storeLink = function(link) { + if (!$("#nav-sync").hasClass('sync')) { + Cookie.writeSetting(NAVPATH_COOKIE_NAME,link,0); + } + } + + const deleteLink = function() { + Cookie.eraseSetting(NAVPATH_COOKIE_NAME); + } + + const cachedLink = function() { + return Cookie.readSetting(NAVPATH_COOKIE_NAME,''); + } + + const getScript = function(scriptName,func) { + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = function() { func(); adjustSyncIconPosition(); } + script.src = scriptName+'.js'; + head.appendChild(script); + } + + const createIndent = function(o,domNode,node) { + let level=-1; + let n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + const imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=ARROW_RIGHT; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).removeClass('opened').addClass('closed'); + node.expanded = false; + } else { + expandNode(o, node, false, true); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + let span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } + } + + let animationInProgress = false; + + const gotoAnchor = function(anchor,aname) { + let pos, docContent = $('#doc-content'); + let ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || + ancParent.is(':header')) { + pos = ancParent.offset().top; + } else if (anchor.position()) { + pos = anchor.offset().top; + } + if (pos) { + const dcOffset = docContent.offset().top; + const dcHeight = docContent.height(); + const dcScrHeight = docContent[0].scrollHeight + const dcScrTop = docContent.scrollTop(); + let dist = Math.abs(Math.min(pos-dcOffset,dcScrHeight-dcHeight-dcScrTop)); + animationInProgress = true; + docContent.animate({ + scrollTop: pos + dcScrTop - dcOffset + },Math.max(50,Math.min(500,dist)),function() { + animationInProgress=false; + if (anchor.parent().attr('class')=='memItemLeft') { + let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname') { + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype') { + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } + }); + } + } + + function htmlToNode(html) { + const template = document.createElement('template'); + template.innerHTML = html; + const nNodes = template.content.childNodes.length; + if (nNodes !== 1) { + throw new Error(`html parameter must represent a single node; got ${nNodes}. `); + } + return template.content.firstChild; + } + + const newNode = function(o, po, text, link, childrenData, lastNode) { + const node = { + children : [], + childrenData : childrenData, + depth : po.depth + 1, + relpath : po.relpath, + isLast : lastNode, + li : document.createElement("li"), + parentNode : po, + itemDiv : document.createElement("div"), + labelSpan : document.createElement("span"), + expanded : false, + childrenUL : null, + getChildrenUL : function() { + if (!this.childrenUL) { + this.childrenUL = document.createElement("ul"); + this.childrenUL.className = "children_ul"; + this.childrenUL.style.display = "none"; + this.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }, + }; + + node.itemDiv.className = "item"; + node.labelSpan.className = "label"; + createIndent(o,node.itemDiv,node); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + const a = document.createElement("a"); + node.labelSpan.appendChild(a); + po.getChildrenUL().appendChild(node.li); + a.appendChild(htmlToNode(''+text+'')); + if (link) { + let url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + const aname = '#'+link.split('#')[1]; + const srcPage = stripPath(pathName()); + const targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : aname; + a.onclick = function() { + storeLink(link); + aPPar = $(a).parent().parent(); + if (!aPPar.hasClass('selected')) { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + aPPar.addClass('selected'); + aPPar.attr('id','selected'); + } + const anchor = $(aname); + gotoAnchor(anchor,aname); + }; + } else { + a.href = url; + a.onclick = () => storeLink(link); + } + } else if (childrenData != null) { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + return node; + } + + const showRoot = function() { + const headerHeight = $("#top").height(); + const footerHeight = $("#nav-path").height(); + const windowHeight = $(window).height() - headerHeight - footerHeight; + (function() { // retry until we can scroll to the selected item + try { + const navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); + } + + const expandNode = function(o, node, imm, setFocus) { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + expandNode(o, node, imm, setFocus); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).addClass('opened').removeClass('closed'); + node.expanded = true; + if (setFocus) { + $(node.expandToggle).focus(); + } + } + } + } + + const glowEffect = function(n,duration) { + n.addClass('glow').delay(duration).queue(function(next) { + $(this).removeClass('glow');next(); + }); + } + + const highlightAnchor = function() { + const aname = hashUrl(); + const anchor = $(aname); + gotoAnchor(anchor,aname); + } + + const selectAndHighlight = function(hash,n) { + let a; + if (hash) { + const link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + let topOffset=5; + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + showRoot(); + } + + const showNode = function(o, node, index, hash) { + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + showNode(o,node,index,hash); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + $(node.plus_img.childNodes[0]).removeClass('closed').addClass('opened'); + node.expanded = true; + const n = node.children[o.breadcrumbs[index]]; + if (index+10) { // try root page without hash as fallback + gotoUrl(o,root,'',relpath); + } else { + o.breadcrumbs = $.extend(true, [], nti); + if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index + navTo(o,NAVTREE[0][1],"",relpath); + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + } + if (o.breadcrumbs) { + o.breadcrumbs.unshift(0); // add 0 for root node + showNode(o, o.node, 0, hash); + } + } + } + + const gotoUrl = function(o,root,hash,relpath) { + const url=root+hash; + let i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function() { + navTreeSubIndices[i] = window['NAVTREEINDEX'+i]; + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); + } + } + + const navTo = function(o,root,hash,relpath) { + const link = cachedLink(); + if (link) { + const parts = link.split('#'); + root = parts[0]; + hash = parts.length>1 ? '#'+parts[1].replace(/[^\w-]/g,'') : ''; + } + if (hash.match(/^#l\d+$/)) { + const anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + gotoUrl(o,root,hash,relpath); + } + + const showSyncOff = function(n,relpath) { + n.html(''); + } + + const showSyncOn = function(n,relpath) { + n.html(''); + } + + const o = { + toroot : toroot, + node : { + childrenData : NAVTREE, + children : [], + childrenUL : document.createElement("ul"), + getChildrenUL : function() { return this.childrenUL }, + li : document.getElementById("nav-tree-contents"), + depth : 0, + relpath : relpath, + expanded : false, + isLast : true, + plus_img : document.createElement("span"), + }, + }; + o.node.li.appendChild(o.node.childrenUL); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = ARROW_RIGHT; + + const navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + + navSync.click(() => { + const navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } + }); + + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + + $(window).bind('hashchange', () => { + if (!animationInProgress) { + if (window.location.hash && window.location.hash.length>1) { + let a; + if ($(location).attr('hash')) { + const clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ try to keep right panel width + const shrinkLeft = Math.min(deficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + const remainingDeficit = deficit - shrinkLeft; + const shrinkRight = Math.min(remainingDeficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + } else { // dragging right handle -> try to keep left panel width + const shrinkRight = Math.min(deficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + const remainingDeficit = deficit - shrinkRight; + const shrinkLeft = Math.min(remainingDeficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + } + } else { + rightPanelWidth = pagenav.length ? Math.max(minPanelWidth,rightPanelWidth) : 0; + leftPanelWidth = Math.max(minPanelWidth,leftPanelWidth); + } + return { leftPanelWidth, rightPanelWidth } + } + + function updateWidths(sidenavWidth,pagenavWidth,dragLeft) + { + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,dragLeft); + const widthStr = parseFloat(widths.leftPanelWidth)+"px"; + content.css({marginLeft:widthStr}); + if (fullSidebar) { + footer.css({marginLeft:widthStr}); + if (mainnav) { + mainnav.css({marginLeft:widthStr}); + } + } + sidenav.css({width:widthStr}); + if (pagenav.length) { + container.css({gridTemplateColumns:'auto '+parseFloat(widths.rightPanelWidth)+'px'}); + if (!dragLeft) { + pagenav.css({width:parseFloat(widths.rightPanelWidth-1)+'px'}); + } + } + return widths; + } + + function resizeWidth(dragLeft) { + const sidenavWidth = $(sidenav).outerWidth()-barWidth; + let pagenavWidth = pagenav.length ? $(pagenav).outerWidth() : 0; + const widths = updateWidths(sidenavWidth,pagenavWidth,dragLeft); + Cookie.writeSetting(RESIZE_COOKIE_NAME,widths.leftPanelWidth-barWidth); + if (pagenav.length) { + Cookie.writeSetting(PAGENAV_COOKIE_NAME,widths.rightPanelWidth); + } + } + + function restoreWidth(sidenavWidth,pagenavWidth) { + updateWidths(sidenavWidth,pagenavWidth,false); + showHideNavBar(); + } + + function resizeHeight() { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (!fullSidebar) { + contentHeight = windowHeight - headerHeight - footerHeight - 1; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (fullSidebar) { + contentHeight = windowHeight - footerHeight - 1; + navtreeHeight = windowHeight - headerHeight - 1; + sideNavHeight = windowHeight - 1; + if (mainnav) { + contentHeight -= mainnav.outerHeight(); + } + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + content.css({height:contentHeight + "px"}); + resizeWidth(false); + showHideNavBar(); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (document.getElementById('main-nav')) { + mainnav = $("#main-nav"); + } + navtree = $("#nav-tree"); + pagenav = $("#page-nav"); + container = $("#container"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(true); } }); + $(sidenav).resizable({ minWidth: 0 }); + if (pagenav.length) { + pagehandle = $("#page-nav-resize-handle"); + pagehandle.on('mousedown touchstart',function(e) { + $('body').addClass('resizing'); + pagehandle.addClass('dragging'); + $(document).on('mousemove touchmove',function(e) { + const clientX = e.clientX || e.originalEvent.touches[0].clientX; + let pagenavWidth = container[0].offsetWidth-clientX+barWidth/2; + const sidenavWidth = sidenav.width(); + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,false); + container.css({gridTemplateColumns:'auto '+parseFloat(widths.rightPanelWidth)+'px'}); + pagenav.css({width:parseFloat(widths.rightPanelWidth-1)+'px'}); + content.css({marginLeft:parseFloat(widths.leftPanelWidth)+'px'}); + Cookie.writeSetting(PAGENAV_COOKIE_NAME,pagenavWidth); + }); + $(document).on('mouseup touchend', function(e) { + $('body').removeClass('resizing'); + pagehandle.removeClass('dragging'); + $(document).off('mousemove mouseup touchmove touchend'); + }); + }); + } else { + container.css({gridTemplateColumns:'auto'}); + } + const width = parseInt(Cookie.readSetting(RESIZE_COOKIE_NAME,250)); + const pagenavWidth = parseInt(Cookie.readSetting(PAGENAV_COOKIE_NAME,250)); + if (width) { restoreWidth(width+barWidth,pagenavWidth); } else { resizeWidth(); } + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(window).ready(function() { + let lastWidth = -1; + let lastHeight = -1; + $(window).resize(function() { + const newWidth = $(this).width(), newHeight = $(this).height(); + if (newWidth!=lastWidth || newHeight!=lastHeight) { + resizeHeight(); + navtree_trampoline.updateContentTop(); + lastWidth = newWidth; + lastHeight = newHeight; + } + }); + resizeHeight(); + lastWidth = $(window).width(); + lastHeight = $(window).height(); + content.scroll(function() { + navtree_trampoline.updateContentTop(); + }); + }); + } + + + function initPageToc() { + const topMapping = []; + const toc_contents = $('#page-nav-contents'); + const content=$('
      ').addClass('page-outline'); + + var entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/', + '`': '`', + '=': '=' + }; + function escapeHtml (string) { + return String(string).replace(/[&<>"'`=\/]/g, function (s) { + return entityMap[s]; + }); + } + + // for ClassDef/GroupDef/ModuleDef/ConceptDef/DirDef + const groupSections = []; + let currentGroup = null; + $('h2.groupheader, h2.memtitle').each(function(){ + const $element = $(this); + if ($element.hasClass('groupheader')) { + currentGroup = { groupHeader: $element, memTitles: [] }; + groupSections.push(currentGroup); + } else if ($element.hasClass('memtitle') && currentGroup) { + currentGroup.memTitles.push($element); + } + }); + groupSections.forEach(function(item){ + const title = item.groupHeader.text().trim(); + let id = item.groupHeader.attr('id'); + const table = item.groupHeader.parents('table.memberdecls'); + let rows = $(); + if (table.length>0) { + rows = table.find("tr[class^='memitem:'] td.memItemRight, tr[class^='memitem:'] td.memItemLeft.anon, tr[class=groupHeader] td"); + } + function hasSubItems() { + return item.memTitles.length>0 || rows.toArray().some(function(el) { return $(el).is(':visible'); }); + } + const li = $('
    • ').attr('id','nav-'+id); + const div = $('
      ').addClass('item'); + const span = $('').addClass('arrow').css({ paddingLeft:'0' }); + if (hasSubItems()) { + span.append($('').addClass('arrowhead opened')); + } + const ahref = $('').attr('href','#'+id).append(title); + content.append(li.append(div.append(span).append(ahref))); + topMapping.push(id); + const ulStack = []; + ulStack.push(content); + if (hasSubItems()) { + let last_id = undefined; + let inMemberGroup = false; + // declaration sections have rows for items + rows.each(function(){ + let td = $(this); + let tr = $(td).parent(); + const is_anon_enum = td.contents().first().text().trim()=='{'; + if (tr.hasClass('template')) { + tr = tr.prev(); + } + id = $(tr).attr('id'); + let text = is_anon_enum ? 'anonymous enum' : $(this).find(':first-child').text(); + let isMemberGroupHeader = $(tr).hasClass('groupHeader'); + if ($(tr).is(":visible") && last_id!=id && id!==undefined) { + if (isMemberGroupHeader && inMemberGroup) { + ulStack.pop(); + inMemberGroup=false; + } + const li2 = $('
    • ').attr('id','nav-'+id); + const div2 = $('
      ').addClass('item'); + const span2 = $('').addClass('arrow').css({ paddingLeft:parseInt(ulStack.length*16)+'px' }); + const ahref = $('').attr('href','#'+id).append(escapeHtml(text)); + li2.append(div2.append(span2).append(ahref)); + topMapping.push(id); + if (isMemberGroupHeader) { + span2.append($('').addClass('arrowhead opened')); + ulStack[ulStack.length-1].append(li2); + const ul2 = $('
        '); + ulStack.push(ul2); + li2.append(div2).append(ul2); + inMemberGroup=true; + } else { + ulStack[ulStack.length-1].append(li2); + } + last_id=id; + } + }); + // detailed documentation has h2.memtitle sections for items + item.memTitles.forEach(function(data) { + const text = $(data).contents().not($(data).children().first()).text(); + const name = text.replace(/\(\)(\s*\[\d+\/\d+\])?$/, '') // func() [2/8] -> func + id = $(data).find('span.permalink a').attr('href') + if (id!==undefined && name!==undefined) { + const li2 = $('
      • ').attr('id','nav-'+id.substring(1)); + const div2 = $('
      • '); + const div = $('
        ').addClass('item'); + const span = $('').addClass('arrow').css({ paddingLeft:'0' }); + const ahref = $('').attr('href',srcBaseUrl+dstBaseUrl+pageName).addClass('noscroll'); + content.append(li.append(div.append(span).append(ahref.append(LISTOFALLMEMBERS)))); + } + + if (groupSections.length==0) { + // for PageDef + const sectionTree = [], sectionStack = []; + $('h1.doxsection, h2.doxsection, h3.doxsection, h4.doxsection, h5.doxsection, h6.doxsection').each(function(){ + const level = parseInt(this.tagName[1]); + const anchor = $(this).find('a.anchor').attr('id'); + const node = { text: $(this).html(), id: anchor, children: [] }; + while (sectionStack.length && sectionStack[sectionStack.length - 1].level >= level) sectionStack.pop(); + (sectionStack.length ? sectionStack[sectionStack.length - 1].children : sectionTree).push(node); + sectionStack.push({ ...node, level }); + }); + if (sectionTree.length>0) { + function render(nodes, level=0) { + nodes.map(n => { + const li = $('
      • ').attr('id','nav-'+n.id); + const div = $('
        ').addClass('item'); + const span = $('').addClass('arrow').attr('style','padding-left:'+parseInt(level*16)+'px;'); + if (n.children.length > 0) { span.append($('').addClass('arrowhead opened')); } + const url = $('').attr('href','#'+n.id); + content.append(li.append(div.append(span).append(url.append(n.text)))); + topMapping.push(n.id); + render(n.children,level+1); + }); + } + render(sectionTree); + } + } + + toc_contents.append(content); + + $(".page-outline a[href]:not(.noscroll)").click(function(e) { + e.preventDefault(); + const aname = $(this).attr("href"); + gotoAnchor($(aname),aname); + }); + + let lastScrollSourceOffset = -1; + let lastScrollTargetOffset = -1; + let lastScrollTargetId = ''; + + navtree_trampoline.updateContentTop = function() { + const pagenavcontents = $("#page-nav-contents"); + if (pagenavcontents.length) { + const content = $("#doc-content"); + const height = content.height(); + const navy = pagenavcontents.offset().top; + const yc = content.offset().top; + let offsets = [] + for (let i=0;imargin || ye>margin) && (yslastScrollTargetOffset) || + (!scrollDown && targetOffset { + navtree_trampoline.updateContentTop(); + },200); + } + $(document).ready(function() { initPageToc(); initResizable(); }); + +} +/* @license-end */ diff --git a/ktx/build/docs/html/libktx/navtreedata.js b/ktx/build/docs/html/libktx/navtreedata.js new file mode 100644 index 0000000..5bab782 --- /dev/null +++ b/ktx/build/docs/html/libktx/navtreedata.js @@ -0,0 +1,89 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var NAVTREE = +[ + [ "libktx Reference", "index.html", [ + [ "Usage Overview", "index.html#overview", [ + [ "Reading a KTX file for non-GL and non-Vulkan Use", "index.html#readktx", null ], + [ "Creating a GL texture object from a KTX file.", "index.html#createGL", null ], + [ "Creating a Vulkan image object from a KTX file.", "index.html#createVulkan", null ], + [ "Extracting Metadata", "index.html#subsection", null ], + [ "Writing a KTX or KTX2 file", "index.html#writektx", null ], + [ "Modifying a KTX file", "index.html#modifyktx", null ], + [ "Writing a Basis-compressed Universal Texture", "index.html#autotoc_md0", null ], + [ "Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture", "index.html#autotoc_md1", null ], + [ "Writing an ASTC-Compressed Texture", "index.html#autotoc_md2", null ] + ] ], + [ "Revision History", "libktx_history.html", [ + [ "Version 4.0", "libktx_history.html#v8", null ], + [ "Version 3.0.1", "libktx_history.html#v7", null ], + [ "Version 3.0", "libktx_history.html#v6", null ], + [ "Version 2.0.2", "libktx_history.html#v5", null ], + [ "Version 2.0.1", "libktx_history.html#v4", null ], + [ "Version 2.0", "libktx_history.html#v3", null ], + [ "Version 1.0.1", "libktx_history.html#v2", null ], + [ "Version 1.0", "libktx_history.html#v1", null ] + ] ], + [ "Deprecated List", "deprecated.html", null ], + [ "Topics", "topics.html", "topics" ], + [ "Data Structures", "annotated.html", [ + [ "Data Structures", "annotated.html", "annotated_dup" ], + [ "Data Fields", "functions.html", [ + [ "All", "functions.html", "functions_dup" ], + [ "Functions", "functions_func.html", null ], + [ "Variables", "functions_vars.html", null ], + [ "Typedefs", "functions_type.html", null ], + [ "Enumerations", "functions_enum.html", null ] + ] ] + ] ], + [ "Files", "files.html", [ + [ "File List", "files.html", "files_dup" ], + [ "Globals", "globals.html", [ + [ "All", "globals.html", null ], + [ "Functions", "globals_func.html", null ], + [ "Typedefs", "globals_type.html", null ], + [ "Enumerations", "globals_enum.html", null ], + [ "Enumerator", "globals_eval.html", null ], + [ "Macros", "globals_defs.html", null ] + ] ] + ] ], + [ "Examples", "examples.html", "examples" ], + [ "Package", "../index.html", null ], + [ "KTX Tools Reference", "../ktxtools/index.html", null ], + [ "KTX Javascript Wrappers Reference", "../ktxjswrappers/index.html", null ], + [ "pyktx Reference", "../pyktx/index.html", null ], + [ "License", "../license.html", null ] + ] ] +]; + +var NAVTREEINDEX = +[ +"../index.html", +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca37dce54f5aefa409567d7c08e36d1d83" +]; + +var SYNCONMSG = 'click to disable panel synchronization'; +var SYNCOFFMSG = 'click to enable panel synchronization'; +var LISTOFALLMEMBERS = 'List of all members'; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/navtreeindex0.js b/ktx/build/docs/html/libktx/navtreeindex0.js new file mode 100644 index 0000000..6841539 --- /dev/null +++ b/ktx/build/docs/html/libktx/navtreeindex0.js @@ -0,0 +1,253 @@ +var NAVTREEINDEX0 = +{ +"../index.html":[7], +"../ktxjswrappers/index.html":[9], +"../ktxtools/index.html":[8], +"../license.html":[11], +"../pyktx/index.html":[10], +"annotated.html":[4,0], +"classktxHashList.html":[4,0,2], +"classktxHashList.html#a0e3349a7b71be7aaa4f8766fc8a0d437":[4,0,2,9], +"classktxHashList.html#a11f1a2ff9f574cd803803b77ec758966":[4,0,2,2], +"classktxHashList.html#a13c991ecb452345d4ac2f9ca4ff71b80":[4,0,2,3], +"classktxHashList.html#a21e5f3318a192082258792f7f9d55400":[4,0,2,5], +"classktxHashList.html#a2d5939ac234d292854de5afeb786b6ae":[4,0,2,10], +"classktxHashList.html#a3c05bb134c42ad852a4e68b6ebe057b1":[4,0,2,7], +"classktxHashList.html#a50f608b84f671b23849be13254cc511e":[4,0,2,4], +"classktxHashList.html#a71475476ba962532003472278dbe33a3":[4,0,2,6], +"classktxHashList.html#a97ca46f361614d6cdfb59a42643f9fc2":[4,0,2,13], +"classktxHashList.html#aa84d4269b0efd2fb9fb2508a371fa0ca":[4,0,2,8], +"classktxHashList.html#aaab69a1ef86c52707d0a33dcba316c60":[4,0,2,1], +"classktxHashList.html#ab3625f19223436b718d9267f0b9a663a":[4,0,2,11], +"classktxHashList.html#ad013c9dd666f3b57e3b0a717e0186277":[4,0,2,0], +"classktxHashList.html#ad432c8d5ba733c69df496e7925e3a158":[4,0,2,12], +"classktxHashList.html#aee36331d742259c1bb3f42e2c82e38ba":[4,0,2,14], +"classktxHashListEntry.html":[4,0,3], +"classktxHashListEntry.html#a96c136b6470dba9bf971a8a3f9719f5e":[4,0,3,1], +"classktxHashListEntry.html#aee9774ac793b8cc2c5955f0e88c13a2f":[4,0,3,0], +"deprecated.html":[2], +"dir_97aefd0d527b934f1d99a682da8fe6a9.html":[5,0,1], +"dir_d44c64559bbebec7f509842c48db8b23.html":[5,0,0], +"examples.html":[6], +"files.html":[5,0], +"filestream_8c.html":[5,0,1,0], +"filestream_8c.html#a217a544c241e80216315a50883190519":[5,0,1,0,0], +"filestream_8c.html#adc6cf29b8543378ffae60e6eaa77c7fc":[5,0,1,0,1], +"functions.html":[4,1,0], +"functions.html":[4,1,0,0], +"functions_a.html":[4,1,0,1], +"functions_b.html":[4,1,0,2], +"functions_c.html":[4,1,0,3], +"functions_d.html":[4,1,0,4], +"functions_e.html":[4,1,0,5], +"functions_enum.html":[4,1,4], +"functions_f.html":[4,1,0,6], +"functions_func.html":[4,1,1], +"functions_g.html":[4,1,0,7], +"functions_h.html":[4,1,0,8], +"functions_i.html":[4,1,0,9], +"functions_k.html":[4,1,0,10], +"functions_l.html":[4,1,0,11], +"functions_m.html":[4,1,0,12], +"functions_n.html":[4,1,0,13], +"functions_o.html":[4,1,0,14], +"functions_p.html":[4,1,0,15], +"functions_q.html":[4,1,0,16], +"functions_r.html":[4,1,0,17], +"functions_s.html":[4,1,0,18], +"functions_t.html":[4,1,0,19], +"functions_type.html":[4,1,3], +"functions_u.html":[4,1,0,20], +"functions_v.html":[4,1,0,21], +"functions_vars.html":[4,1,2], +"functions_w.html":[4,1,0,22], +"functions_x.html":[4,1,0,23], +"functions_y.html":[4,1,0,24], +"functions_z.html":[4,1,0,25], +"glloader_8c-example.html":[6,0], +"globals.html":[5,1,0], +"globals_defs.html":[5,1,5], +"globals_enum.html":[5,1,3], +"globals_eval.html":[5,1,4], +"globals_func.html":[5,1,1], +"globals_type.html":[5,1,2], +"group__ktx__glloader.html":[3,0], +"group__ktx__glloader.html#ga058297b66c5a7fd1f1bbaf718a887b9f":[3,0,1], +"group__ktx__glloader.html#ga516367e94731f99a23a83fb029e9a441":[3,0,3], +"group__ktx__glloader.html#ga7624860df8e44573862fa5754ea2976c":[3,0,2], +"group__ktx__glloader.html#gada67f60796793d1ed9eb1f3f2d61d4a6":[3,0,0], +"group__ktx__vkloader.html":[3,2], +"group__ktx__vkloader.html#ga11fb504b749453140e04ca69711633d6":[3,2,0], +"group__ktx__vkloader.html#ga153164adbd7307ad1844c3e117faa325":[3,2,10], +"group__ktx__vkloader.html#ga265926439e3f9502f248684238e5cc48":[3,2,6], +"group__ktx__vkloader.html#ga377a4a2c177956ea661549ee502d60da":[3,2,9], +"group__ktx__vkloader.html#ga3c9d5bc5ac1d0e237ae62fd94c148764":[3,2,13], +"group__ktx__vkloader.html#ga3ef2792fb0cd184636180ae0a540b872":[3,2,8], +"group__ktx__vkloader.html#ga4166e5853362cf136f3efe0c527c4c6d":[3,2,3], +"group__ktx__vkloader.html#ga4bc9f0fa9af93d588276f54fe9a6ba50":[3,2,12], +"group__ktx__vkloader.html#ga5137c2d7e23be51160048b3253abad3c":[3,2,15], +"group__ktx__vkloader.html#ga5a783db9431738b9b18b9fc585183490":[3,2,19], +"group__ktx__vkloader.html#ga7a9baaf3aa2e114c6f6e58fe68051815":[3,2,4], +"group__ktx__vkloader.html#ga82ac7e21e884652c519d9fe28ad5428c":[3,2,14], +"group__ktx__vkloader.html#ga8d9b0820e70dd0239b2c1bdc0a7713f7":[3,2,11], +"group__ktx__vkloader.html#gaaf633943fbf201fb620c0270c6150fa8":[3,2,16], +"group__ktx__vkloader.html#gac70d24bac4ac3b2586836439bbc6592a":[3,2,1], +"group__ktx__vkloader.html#gacb13edcb651f0a8fb26dab9594ef7dc7":[3,2,7], +"group__ktx__vkloader.html#gad7840c1eeb618fa1a09fc5a02c07ce87":[3,2,2], +"group__ktx__vkloader.html#gadf0fba44f518b61acd5d0ae86225ddee":[3,2,5], +"group__ktx__vkloader.html#gae58928740420d1ed3f96fd4b0f2d897e":[3,2,17], +"group__ktx__vkloader.html#gaf620a84f6bc59bff03b521e55a654f19":[3,2,18], +"group__reader.html":[3,1], +"group__reader.html#ga01ec49abe73b77f2f8db99b5d9cf46d9":[3,1,17], +"group__reader.html#ga0319d9a33d3ea78da2ef786205f2a956":[3,1,1], +"group__reader.html#ga032b7f1926861c8b40655527b84f5533":[3,1,33], +"group__reader.html#ga180d93562cc6af30c61adf8f6a8fd827":[3,1,38], +"group__reader.html#ga19d8786eea0e62ab55d945bff838d32c":[3,1,42], +"group__reader.html#ga1b47270a151b67615aed9eeca5f25bf7":[3,1,30], +"group__reader.html#ga1e865473d23f82fc22a16bb3eadf60ed":[3,1,15], +"group__reader.html#ga1f289eb80601208b79561804d2ec0121":[3,1,0], +"group__reader.html#ga2c471eb79f1ac62d63cae86ca6c519bf":[3,1,6], +"group__reader.html#ga2e9c9d8a1c02732c87db733d3449b337":[3,1,3], +"group__reader.html#ga37cd5b4ae9ee373d825197dc8998d0bb":[3,1,29], +"group__reader.html#ga400a2581bf935beb6c0192a6e9844914":[3,1,9], +"group__reader.html#ga4557b9714b41e7c575d295b65e19ed12":[3,1,2], +"group__reader.html#ga553c3438e75628c6d7e2280989e539c4":[3,1,41], +"group__reader.html#ga57a1ce0d3f2d66439463160d6ce9d2d0":[3,1,37], +"group__reader.html#ga65cd751a3d1a6eed97cb19b7a88d736c":[3,1,5], +"group__reader.html#ga6805a144f0bfd17b51d46fb28b0786a5":[3,1,12], +"group__reader.html#ga7200d548b480a3abb69c206f530c0669":[3,1,18], +"group__reader.html#ga7334feb062f32b62159cebd6e4b28d16":[3,1,11], +"group__reader.html#ga8680560274b31da6f3f07ee911055431":[3,1,13], +"group__reader.html#ga8a1bf5e13f88af082585a875e85dfdeb":[3,1,8], +"group__reader.html#ga90cc33928a2dae962fb94b3fa2f6575d":[3,1,35], +"group__reader.html#gaa1f681c144baa70ef9af6db4c7333b3c":[3,1,32], +"group__reader.html#gaa4b800f418f57b10737ac6533f1769d2":[3,1,22], +"group__reader.html#gaa616363178ec37996459219a6925f87d":[3,1,4], +"group__reader.html#gaa8dfc7a981b69d26eab73c5405d7182b":[3,1,39], +"group__reader.html#gab29978f318436c009ae45b7d3c515f8e":[3,1,21], +"group__reader.html#gab56e28f79781acf2933e36c21823c0df":[3,1,10], +"group__reader.html#gab773b3ad45bacb6f487b62c4b0a07fcf":[3,1,27], +"group__reader.html#gac1b0eccd69f541450ed88da2ad260dcc":[3,1,25], +"group__reader.html#gac1dc0703bc613180a92a8e1c5901dd50":[3,1,7], +"group__reader.html#gac344745350aff9cf5bcc2969729b7f0e":[3,1,23], +"group__reader.html#gac7323c6f9fe75f442484392506b2024b":[3,1,28], +"group__reader.html#gacc7762adb6ff311ca65cfe5ed89db21e":[3,1,24], +"group__reader.html#gace44d98fa78b94c282016e7cf8a88b7e":[3,1,40], +"group__reader.html#gacf9e393ff766982ccb79ad915975971f":[3,1,43], +"group__reader.html#gad3aab08fa013c602fc055964e78c7566":[3,1,19], +"group__reader.html#gaddf6746c18d970a238e89bb9b8e13e77":[3,1,26], +"group__reader.html#gade1ffc5d31c2f9b5f1e861b59e7619ce":[3,1,34], +"group__reader.html#gae7c4b8bbe26379f2076f93050c0673c1":[3,1,44], +"group__reader.html#gae9de7e23ffe3ae3aeed4cc95c61699e4":[3,1,14], +"group__reader.html#gaea0edab86daca9c288d4cd6b47b34e28":[3,1,16], +"group__reader.html#gaefcaf84425830ba095eb670a275dad34":[3,1,20], +"group__reader.html#gaf1e401967a687b40cdf7bba11e72c2b4":[3,1,36], +"group__reader.html#gaf57628ec7f9a554b46ba84ab9c214bab":[3,1,31], +"group__writer.html":[3,3], +"group__writer.html#ga00b153dbfa1fe115c7d4322dbe07f172":[3,3,11], +"group__writer.html#ga0113194b669b789a22d85b7ad992f117":[3,3,23], +"group__writer.html#ga01b13c38300016ce36c5b97bf4957d48":[3,3,19], +"group__writer.html#ga08d7222fbf845f25d883ed81c14c6430":[3,3,18], +"group__writer.html#ga0e75755e3cc69964e57363dad82ffd77":[3,3,14], +"group__writer.html#ga21904a85ada4ee322b87c309566ea4d1":[3,3,7], +"group__writer.html#ga3009e876fb584268241a9ba7704e8557":[3,3,4], +"group__writer.html#ga405c44d6daf8ddf83dc805810bf4f989":[3,3,13], +"group__writer.html#ga50a5ecf22586b26977da62cf19a78518":[3,3,20], +"group__writer.html#ga5fcfdc3d237419ab65287639e1f4aeb1":[3,3,16], +"group__writer.html#ga745cee3857ade59e612c533d6faa8e2a":[3,3,24], +"group__writer.html#ga924da3380253c85fffca8c956e00d5c0":[3,3,9], +"group__writer.html#ga9383755c2e02a9d1aa932e75c847829c":[3,3,2], +"group__writer.html#ga9894284fd16fed4697505353043bbeae":[3,3,21], +"group__writer.html#ga9ad46bface6dab07a35579c0635877d3":[3,3,0], +"group__writer.html#gaa623fd7f433e3827a52cdb499f9162f9":[3,3,22], +"group__writer.html#gaa8e29216921eadd3c09c3a76bc286acd":[3,3,15], +"group__writer.html#gaafc3cf2c872ea75be7096b1fc70dfb2c":[3,3,17], +"group__writer.html#gabeb1d5eb7ddcfd81405d5726a0b55ee6":[3,3,1], +"group__writer.html#gac1780ac8315f0cab9893c121481c7453":[3,3,10], +"group__writer.html#gac31b3532ed02d8cd4a7b517d4d2ab6ef":[3,3,5], +"group__writer.html#gacb722c7d0c1df7e6e3b4caa78ae729cf":[3,3,26], +"group__writer.html#gad0a6406fc9359abd5f6d9956a86ce90f":[3,3,6], +"group__writer.html#gadbc6058afa50d4db3efd738822e6296a":[3,3,3], +"group__writer.html#gadf2c2542471b7a94636216807cedd819":[3,3,25], +"group__writer.html#gaf08421ae0893a9e9205d3e84fad66bd8":[3,3,12], +"group__writer.html#gafe0d51799d92b69cdcbe30c98322340b":[3,3,8], +"index.html":[], +"index.html#autotoc_md0":[0,6], +"index.html#autotoc_md1":[0,7], +"index.html#autotoc_md2":[0,8], +"index.html#createGL":[0,1], +"index.html#createVulkan":[0,2], +"index.html#modifyktx":[0,5], +"index.html#overview":[0], +"index.html#readktx":[0,0], +"index.html#subsection":[0,3], +"index.html#writektx":[0,4], +"ktx_8h.html":[5,0,0,0], +"ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daa":[5,0,0,0,61], +"ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaa01c22adc03102420ef016d614cb5e0f5":[5,0,0,0,61,3], +"ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaa29f7da526697257766534b667fd706ef":[5,0,0,0,61,2], +"ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaa9559585b30aa7fe5d510753ceae6fcc6":[5,0,0,0,61,0], +"ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaaf66da31ed897385538dab6c591e5bf5c":[5,0,0,0,61,1], +"ktx_8h.html#a0890fb8e1623b63c86883d50a0d841aa":[5,0,0,0,49], +"ktx_8h.html#a0becd37ccf729eed8723b969bb93df3d":[5,0,0,0,19], +"ktx_8h.html#a0eeccd38a1ec981cd3d2a1b98f4ff639":[5,0,0,0,30], +"ktx_8h.html#a11077712b020a97507c1e22a4c9c45b6":[5,0,0,0,28], +"ktx_8h.html#a1410163f284e12d74ef942dd9d48c3cf":[5,0,0,0,26], +"ktx_8h.html#a1873d492a1b1fc5fd3296192fce3e9d5":[5,0,0,0,55], +"ktx_8h.html#a1873d492a1b1fc5fd3296192fce3e9d5a8a0a5ff023478a7951bf6cef24987558":[5,0,0,0,55,0], +"ktx_8h.html#a261dbe3b2c1ba0d35a1bf76ad9a98ba0":[5,0,0,0,46], +"ktx_8h.html#a26698d6f4c0deee564b330040213de72":[5,0,0,0,32], +"ktx_8h.html#a294c8d220fbff767174f192fb410a621":[5,0,0,0,27], +"ktx_8h.html#a2c20092a7ccf1454c1de41fe55a54e92":[5,0,0,0,38], +"ktx_8h.html#a2eacbb95ed30f1e9ae81fd6d121fd16e":[5,0,0,0,45], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5":[5,0,0,0,60], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a0725a0280faa5a362e823daa958b9e5d":[5,0,0,0,60,27], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a14600faaff61212753946fd9b74b4064":[5,0,0,0,60,8], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a2117d164feecb02ba5199b4ee72d2f04":[5,0,0,0,60,29], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a260df90000f23f2bf1a06368304f5985":[5,0,0,0,60,24], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a26ee2ca9dbc9384ded1c41c59a8bc3b6":[5,0,0,0,60,9], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a352f7aeb953d220e0fa4abc025a6f880":[5,0,0,0,60,3], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a39a369e112f19db1769f6c02b26f283b":[5,0,0,0,60,25], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a4d5ff56c820f41b01ceaa7b1056fd38c":[5,0,0,0,60,20], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a665baafd3c1d246bf2726342a083a26b":[5,0,0,0,60,1], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a6a05289216c33a4c731e7b9670e83eab":[5,0,0,0,60,23], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a6b1967cc612417644b7ecb86bdc2de48":[5,0,0,0,60,0], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a6d129443f90dd85da21fd1fc1fd50e36":[5,0,0,0,60,7], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a7b596baf4e8088b0ddda7615971e274e":[5,0,0,0,60,2], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a7ea42a1c24b02633a3041dcd49c11dfe":[5,0,0,0,60,12], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5aacba582511ea35fbec2fa8fa92a900cc":[5,0,0,0,60,6], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ab7dacf1384bb2f22655b9cf6064fd5e8":[5,0,0,0,60,10], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ab949b2bfc245a6d8098817954ac41290":[5,0,0,0,60,15], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5abb672255cb647aceeb99b05e7f6d99b2":[5,0,0,0,60,22], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5abeba5d59ae679316666a71c48ced66c5":[5,0,0,0,60,13], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5acae08dfc76603e86b16908a8d6c46833":[5,0,0,0,60,17], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5acc73a45251f2fd88d3f580dee0e14108":[5,0,0,0,60,16], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad0aacfd9b57f902f7e140a9fe4a501bd":[5,0,0,0,60,21], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad5caffd2fe438bbac51f2e314a3dd7c3":[5,0,0,0,60,18], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad790151a02bcf2368e3157e180a2fdd9":[5,0,0,0,60,14], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad84ab9c0ac149b791721ce08a4498d74":[5,0,0,0,60,26], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ae1906b8161119e9aca1add331ecf6de6":[5,0,0,0,60,19], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5aebbc72211dd8662af91b2f910fda4be3":[5,0,0,0,60,4], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5af030f0703301f830ece442aa508195b0":[5,0,0,0,60,5], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5af884679766dab49838e52c55d8304d59":[5,0,0,0,60,11], +"ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5afcf0ab81c08710d1c1ad1a0445a4775f":[5,0,0,0,60,28], +"ktx_8h.html#a3d5d2a3a413c5e549dedc54873afc668":[5,0,0,0,50], +"ktx_8h.html#a4213a77d1c0ef016e0ee60463a8044be":[5,0,0,0,29], +"ktx_8h.html#a4b1f165e42ebf946fa91b7f35248a5a6":[5,0,0,0,41], +"ktx_8h.html#a5206479bb101cbca15184f1f215f9607":[5,0,0,0,36], +"ktx_8h.html#a526ee1e695723619c057875af35c93d6":[5,0,0,0,16], +"ktx_8h.html#a56402340391b57f18d8c18e477e97280":[5,0,0,0,22], +"ktx_8h.html#a5a338703d7be18ef6cc97a83d5fad8fe":[5,0,0,0,31], +"ktx_8h.html#a5edebc0f71559845a8620cf6b1bf65ca":[5,0,0,0,51], +"ktx_8h.html#a63d8010783f001c80dc9d05dd1d3bb17":[5,0,0,0,37], +"ktx_8h.html#a6a0fd67c05e916710effcf59ba36f44f":[5,0,0,0,18], +"ktx_8h.html#a6ab3f7a528fbda067855818ac8d75c87":[5,0,0,0,43], +"ktx_8h.html#a6beb14c7c8e74de38847b6a5d9ebd171":[5,0,0,0,47], +"ktx_8h.html#a73e2b01e559ccfed8cf5fe0831b33ce9":[5,0,0,0,34], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116c":[5,0,0,0,54], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca04808a4c3abddb237d2a8cf903205496":[5,0,0,0,54,17], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca0a3b899c794df326ebcea8dd3a679c14":[5,0,0,0,54,1], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca1559258b3bd0f47eef28fd4839074452":[5,0,0,0,54,5], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca2570f4138cacf052d6ff892931507851":[5,0,0,0,54,2], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca349391a68adb9c8c4a71dd50d6e96745":[5,0,0,0,54,20] +}; diff --git a/ktx/build/docs/html/libktx/navtreeindex1.js b/ktx/build/docs/html/libktx/navtreeindex1.js new file mode 100644 index 0000000..e8e907d --- /dev/null +++ b/ktx/build/docs/html/libktx/navtreeindex1.js @@ -0,0 +1,234 @@ +var NAVTREEINDEX1 = +{ +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca37dce54f5aefa409567d7c08e36d1d83":[5,0,0,0,54,19], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca7da41bb3195d6cc93a513ac18bc91e4f":[5,0,0,0,54,11], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca85733279b7d3e00ad9a6d498d6686645":[5,0,0,0,54,8], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca87728a1745ea6333b6fbe041c03036f2":[5,0,0,0,54,13], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf":[5,0,0,0,54,9], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caac88f0051f9b5c217f3f53128e6960ef":[5,0,0,0,54,18], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cab6d2090e851d9757ce32c05ec807ba4d":[5,0,0,0,54,7], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cabb7ad088582cd16709a27679312363ae":[5,0,0,0,54,21], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cac8f2bb08408001aad4941fc7b3f45558":[5,0,0,0,54,3], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cac9008e8d20f60f4fb67d735f287be470":[5,0,0,0,54,12], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad3d82ba3467063bec92486a94a38d21d":[5,0,0,0,54,16], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad9ba6e380b7a1d44a10b6626357ee3a1":[5,0,0,0,54,14], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cadbeb98d59020ac018a4f697d068fff21":[5,0,0,0,54,15], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cae5983275cc1d3d3480c5cf1275723cf1":[5,0,0,0,54,6], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf1c77ba0fee3c65d49a334bec949c8a6":[5,0,0,0,54,4], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a":[5,0,0,0,54,10], +"ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98":[5,0,0,0,54,0], +"ktx_8h.html#a7ca1ab524f2161c1facbb716f4cfab00":[5,0,0,0,24], +"ktx_8h.html#a7eebf850576083e740cf1f418eed39a0":[5,0,0,0,15], +"ktx_8h.html#a829eac221b33617c15a1b5a898a0771a":[5,0,0,0,62], +"ktx_8h.html#a850617576a50a67b6c21d8c8ce1158be":[5,0,0,0,23], +"ktx_8h.html#a8c260cc2a9b8d4ee63ccc36810779f84":[5,0,0,0,9], +"ktx_8h.html#a8dc8bad175207b3431d409abadd251d3":[5,0,0,0,33], +"ktx_8h.html#a8f70163f537a794c472479bc5c1905e9":[5,0,0,0,57], +"ktx_8h.html#a8f70163f537a794c472479bc5c1905e9a17832137be7a8ff0b839fd41e1abb923":[5,0,0,0,57,2], +"ktx_8h.html#a8f70163f537a794c472479bc5c1905e9a3f3681d3e1feb7fb6707a5b3aa1366b1":[5,0,0,0,57,5], +"ktx_8h.html#a8f70163f537a794c472479bc5c1905e9a8f9546d69b84dad39f540d465c00fe2f":[5,0,0,0,57,0], +"ktx_8h.html#a8f70163f537a794c472479bc5c1905e9aae959532601276e8e112d2cc0ae42324":[5,0,0,0,57,1], +"ktx_8h.html#a8f70163f537a794c472479bc5c1905e9aeaf5ea197d3c6f3f2b8ee70809ac60f7":[5,0,0,0,57,3], +"ktx_8h.html#a8f70163f537a794c472479bc5c1905e9af195805d16e6875f46da8dc875b753c5":[5,0,0,0,57,4], +"ktx_8h.html#a920a40b531d615e674d797fe87d87e09":[5,0,0,0,20], +"ktx_8h.html#a9413ce1ef7871db012b9a798bed90639":[5,0,0,0,35], +"ktx_8h.html#a9b4e1997eff4e29930d5aca784483d57":[5,0,0,0,12], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670":[5,0,0,0,58], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a2aa07cb9f618a10440c7fc0c1838d83d":[5,0,0,0,58,8], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a2f97075bb6e51728f82d0d51c16acc1c":[5,0,0,0,58,0], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a375bd5a1c645198196a4b536de67f276":[5,0,0,0,58,4], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a3a4df853d3a689ccde076618d013d642":[5,0,0,0,58,2], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a6ee376eeb5c1b736fb5f71025b332375":[5,0,0,0,58,5], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a81acf28386d4eb6f184c850254d87f6f":[5,0,0,0,58,1], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a9ac3a05c6fe72efd3a61cbdd0b244699":[5,0,0,0,58,3], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a9b456a870a596abbc95d946c1c1e681c":[5,0,0,0,58,7], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670abccd25d5ac984dab93df3b711712c778":[5,0,0,0,58,6], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670ac0f60c4fb9a32fd8101eeda8a699fa0e":[5,0,0,0,58,11], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670ac8356ccb10a6259c5483181e9158f191":[5,0,0,0,58,10], +"ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670ae3abc0e230dfe7395d80ae5216f0820d":[5,0,0,0,58,9], +"ktx_8h.html#aa23b5bdd596b2c6a6a2891a2ac48dc2c":[5,0,0,0,17], +"ktx_8h.html#aa823ce7b0db0aaefb942c4b5a07504be":[5,0,0,0,52], +"ktx_8h.html#ab2288718afab080ff86e9d3250180fb6":[5,0,0,0,59], +"ktx_8h.html#ab2288718afab080ff86e9d3250180fb6a0757a22b5adb1792c54547f1d759878d":[5,0,0,0,59,0], +"ktx_8h.html#ab2288718afab080ff86e9d3250180fb6a1f5bb151dc8463b0a917d98cb42f3506":[5,0,0,0,59,2], +"ktx_8h.html#ab2288718afab080ff86e9d3250180fb6a76abf8fba809fc617dbdf65d70320d24":[5,0,0,0,59,1], +"ktx_8h.html#ab703620f9a5c5911d6013debf72393d6":[5,0,0,0,44], +"ktx_8h.html#ac0484f02707783e103f82961444b7b16":[5,0,0,0,40], +"ktx_8h.html#ac86f20d7858aaacef77f7eee15983470":[5,0,0,0,66], +"ktx_8h.html#ad235113b0090e64ad23a0cf7097e1b7a":[5,0,0,0,13], +"ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa":[5,0,0,0,10], +"ktx_8h.html#ad54399157902016600b0543ca027c61c":[5,0,0,0,64], +"ktx_8h.html#ad5dd0ebf8aaef8c150603bd95d61b94a":[5,0,0,0,11], +"ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6":[5,0,0,0,56], +"ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6a02edf562ddcc85e6fdefb9b8304ef7ec":[5,0,0,0,56,2], +"ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6a123569090bcb7d44f26d40e365fc821a":[5,0,0,0,56,3], +"ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6a6971976df75bdc5aa7099b59ad345361":[5,0,0,0,56,1], +"ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6af943cccff0ab1790f5ff14ca250d7f65":[5,0,0,0,56,0], +"ktx_8h.html#ae2022617df68fe4041c707e1693370d1":[5,0,0,0,48], +"ktx_8h.html#ae34c19ed0ef799a902fa50dc3a0bbb20":[5,0,0,0,14], +"ktx_8h.html#ae5fd56d78ae250ac5f7511d8041ec514":[5,0,0,0,25], +"ktx_8h.html#aeb8baf7100f7a354c6f0fe99900cf179":[5,0,0,0,42], +"ktx_8h.html#aeeccd9521857185425c9af3b5866166b":[5,0,0,0,39], +"ktx_8h.html#afc39c694986ea1dc6a81da7dc6c2776e":[5,0,0,0,53], +"ktx_8h.html#afdb41471bee56cef8241060de72d6735":[5,0,0,0,21], +"libktx_history.html":[1], +"libktx_history.html#v1":[1,7], +"libktx_history.html#v2":[1,6], +"libktx_history.html#v3":[1,5], +"libktx_history.html#v4":[1,4], +"libktx_history.html#v5":[1,3], +"libktx_history.html#v6":[1,2], +"libktx_history.html#v7":[1,1], +"libktx_history.html#v8":[1,0], +"memstream_8c.html":[5,0,1,1], +"memstream_8c.html#a3c0f816438f1e4412376b35fa66f9424":[5,0,1,1,2], +"memstream_8c.html#a3f9cc251a3604f80da67440efff21b6d":[5,0,1,1,4], +"memstream_8c.html#a777303765bd7d021820c90ff6ad85afa":[5,0,1,1,5], +"memstream_8c.html#a81f0db4b157134a8edf51c2936e853e4":[5,0,1,1,3], +"memstream_8c.html#a899a1878ad93c797c8c2d9aacffc6365":[5,0,1,1,1], +"memstream_8c.html#ad9d0c31ff64d0512e98e0b6991051b62":[5,0,1,1,0], +"pages.html":[], +"strings_8c.html":[5,0,1,2], +"strings_8c.html#a252d7741a00562fbe2fd9d91d54d873b":[5,0,1,2,1], +"strings_8c.html#a25b70a70161c149687d0ca19fc839b81":[5,0,1,2,3], +"strings_8c.html#a68c7368105d35f01b54573f22ecbe5fb":[5,0,1,2,2], +"strings_8c.html#aa9077e4635ae86d84ec8bcb025d6b373":[5,0,1,2,0], +"structktxAstcParams.html":[4,0,0], +"structktxAstcParams.html#a04aa92e2192b36b2d9701d23fd246386":[4,0,0,7], +"structktxAstcParams.html#a0d67004efa49e08a7f39f71c93286b0a":[4,0,0,1], +"structktxAstcParams.html#a51fe881fb2eae346ba017f7f55a1d642":[4,0,0,6], +"structktxAstcParams.html#a59af70a939f66dce9749174c12cc3725":[4,0,0,3], +"structktxAstcParams.html#a6ca13a756a2066f8082772b9207e4bba":[4,0,0,8], +"structktxAstcParams.html#a7a2b8fd2f04b2990c176606e45a02c22":[4,0,0,0], +"structktxAstcParams.html#aa02c398f7c7872860347560f4a33fd57":[4,0,0,2], +"structktxAstcParams.html#aac5068885c586a1454efbf2e9cf4b3ed":[4,0,0,5], +"structktxAstcParams.html#aaee2c7f8b6f18e5e44a7efc72a5099c8":[4,0,0,4], +"structktxBasisParams.html":[4,0,1], +"structktxBasisParams.html#a0024310d24bafd33ab41de3bd7dd6887":[4,0,1,8], +"structktxBasisParams.html#a04aa92e2192b36b2d9701d23fd246386":[4,0,1,14], +"structktxBasisParams.html#a0d67004efa49e08a7f39f71c93286b0a":[4,0,1,2], +"structktxBasisParams.html#a1214b8b4eca85e666bf92862e0f22aeb":[4,0,1,23], +"structktxBasisParams.html#a13bd0ffd0161a44f84482ece6b270ce7":[4,0,1,9], +"structktxBasisParams.html#a144c86b7675a79226b2e88a008078cc8":[4,0,1,20], +"structktxBasisParams.html#a24b0d409b2fbd536216196ca4e27358f":[4,0,1,5], +"structktxBasisParams.html#a27652d35542830750e195ab57dd1f3b1":[4,0,1,0], +"structktxBasisParams.html#a2800eb7a62ed740bd4e13af330058f75":[4,0,1,19], +"structktxBasisParams.html#a2b5e77802a353a04d6b8d1d848f98d47":[4,0,1,12], +"structktxBasisParams.html#a2db4d897c3dddf44f94be794f242343c":[4,0,1,18], +"structktxBasisParams.html#a47519cb97d15ade856f899023eab9960":[4,0,1,3], +"structktxBasisParams.html#a51fe881fb2eae346ba017f7f55a1d642":[4,0,1,13], +"structktxBasisParams.html#a59af70a939f66dce9749174c12cc3725":[4,0,1,6], +"structktxBasisParams.html#a6ca13a756a2066f8082772b9207e4bba":[4,0,1,24], +"structktxBasisParams.html#a740b64ff37292977ab3cf04d3fb3cd6b":[4,0,1,7], +"structktxBasisParams.html#a762083beb362fc21fc96f9fec210f2cb":[4,0,1,17], +"structktxBasisParams.html#a8de3ee72ab61a663a495f174796a7b17":[4,0,1,22], +"structktxBasisParams.html#a93a37769ec5b285051083aa8457e1d1a":[4,0,1,4], +"structktxBasisParams.html#aac5068885c586a1454efbf2e9cf4b3ed":[4,0,1,10], +"structktxBasisParams.html#aacf2963f160d1079e6abccc81e17f7c4":[4,0,1,21], +"structktxBasisParams.html#aafccbc4e43845f62cf500d4792c7cf6a":[4,0,1,1], +"structktxBasisParams.html#ac9363a20b43cebc11ab690aec5fbd38d":[4,0,1,15], +"structktxBasisParams.html#ad09ee28fdd7fcd267771deb3d11c2cee":[4,0,1,16], +"structktxBasisParams.html#aea4a4f651952b4831fdfc784f7058866":[4,0,1,11], +"structktxOrientation.html":[4,0,4], +"structktxOrientation.html#a1f9b804769fed960e686ccc4eca40b0f":[4,0,4,2], +"structktxOrientation.html#aa0c25b8b8a3e79bd0ba427da21d3a88f":[4,0,4,1], +"structktxOrientation.html#aadb7ef15109e0b085f668c34f4d90206":[4,0,4,0], +"structktxStream.html":[4,0,5], +"structktxStream.html#a01015dd5ef6b90112358effdee79a6bc":[4,0,5,4], +"structktxStream.html#a1215c8b33ba64ba53bd86134ae80c1d6":[4,0,5,5], +"structktxStream.html#a26a82a7cdf288fc1a7e2b77ecb9d1d38":[4,0,5,3], +"structktxStream.html#a2f3b4c3238e6625fb92d53b1c62389cb":[4,0,5,9], +"structktxStream.html#a6de39e2650d144d37e3f2c32081dd55f":[4,0,5,1], +"structktxStream.html#a702945180aa732857b380a007a7e2a21":[4,0,5,6], +"structktxStream.html#a723def611194cfe6570ae5b94bdee904":[4,0,5,10], +"structktxStream.html#a76bd679ca3d583cc56c524e53665e775":[4,0,5,8], +"structktxStream.html#a9d2fb0a8f4454c78013c49b914c603b6":[4,0,5,11], +"structktxStream.html#ab3d4a868dd03d0fa92cdb5e5fd99ba50":[4,0,5,13], +"structktxStream.html#ab96816d317aa5196e2ef198d9a8d621b":[4,0,5,0], +"structktxStream.html#aba03500510363a0b45025645ba4327cf":[4,0,5,12], +"structktxStream.html#abac8ddd51b8b30aee6c98a1ab2adef13":[4,0,5,2], +"structktxStream.html#ad224d1f8e4291a2e66e090b3c6df3698":[4,0,5,14], +"structktxStream.html#adcabf99e783fe9ca551ac9706372400c":[4,0,5,7], +"structktxStream.html#ae6018760261edc9387c2123395a1447a":[4,0,5,15], +"structktxTexture.html":[4,0,6], +"structktxTexture.html#a0b4f9762223cba4cae76fefcbb413f39":[4,0,6,27], +"structktxTexture.html#a150d3ff33a9fa83ecba8e3fdda7ec972":[4,0,6,22], +"structktxTexture.html#a1cce9de12eb3974a236becfd098bd057":[4,0,6,0], +"structktxTexture.html#a277853ea894444859451b1f0966be15f":[4,0,6,37], +"structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650":[4,0,6,26], +"structktxTexture.html#a3a4bc2fa2e41bcec0bdb265505af0068":[4,0,6,32], +"structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1":[4,0,6,31], +"structktxTexture.html#a3d83b122c5c492f77abe25fc59541986":[4,0,6,30], +"structktxTexture.html#a3fa51cc9001702e3f1d5a69cee65adf8":[4,0,6,21], +"structktxTexture.html#a57141753cd2eb0967c9c071d853c5d32":[4,0,6,29], +"structktxTexture.html#a71d7762f2b0dd61d57c0a7ec31ee46ac":[4,0,6,19], +"structktxTexture.html#a75c773bbc36a6adb2a884eb9fb7a709f":[4,0,6,35], +"structktxTexture.html#a782126a62c27ee8660a14565b906694c":[4,0,6,33], +"structktxTexture.html#a866e74b57ee9830a8153fb010101efdf":[4,0,6,34], +"structktxTexture.html#a9b5ca8c2e3fd76d8b427928775289078":[4,0,6,25], +"structktxTexture.html#a9c26601222e6a037f7dbae7b61b18fd0":[4,0,6,24], +"structktxTexture.html#ac184edbb9898b55efbbd80f635946545":[4,0,6,2], +"structktxTexture.html#ac5d732dd508289d1dda415f4c037c61f":[4,0,6,36], +"structktxTexture.html#aca6d87118e724ac77f17e0576e191513":[4,0,6,1], +"structktxTexture.html#ad1e7a90bd204e54ada5057631f5bdf02":[4,0,6,18], +"structktxTexture.html#ae09811d6bd833f1a7c94db9e4538ebd7":[4,0,6,28], +"structktxTexture.html#af0602c48f60fc85c4d59c1c58f624a2b":[4,0,6,3], +"structktxTexture.html#af90defa509395c58549940d3b634b3e9":[4,0,6,23], +"structktxTexture.html#afe7371a26104de3e131e82cf5cc39e9c":[4,0,6,20], +"structktxTexture1.html":[4,0,7], +"structktxTexture1.html#a05fa4fecc2735f68d34651a62493ecd9":[4,0,7,30], +"structktxTexture1.html#a1318d73f800ff61d045b740331939596":[4,0,7,31], +"structktxTexture1.html#a2113cfebb1a5e3328ce7a89d21e7cdab":[4,0,7,28], +"structktxTexture1.html#aaadefe13bf76c26cb921afa52fb29192":[4,0,7,29], +"structktxTexture1.html#ac8a870c675f1e36c456c9de2e3ac9855":[4,0,7,32], +"structktxTexture2.html":[4,0,8], +"structktxTexture2.html#a0093ccc55cbbc2d352e6e1e8d8fbc2ab":[4,0,8,44], +"structktxTextureCreateInfo.html":[4,0,10], +"structktxTextureCreateInfo.html#a1318d73f800ff61d045b740331939596":[4,0,10,4], +"structktxTextureCreateInfo.html#a3a4bc2fa2e41bcec0bdb265505af0068":[4,0,10,7], +"structktxTextureCreateInfo.html#a3c48573960eb90b1e38cc70457d2cda1":[4,0,10,6], +"structktxTextureCreateInfo.html#a3fa51cc9001702e3f1d5a69cee65adf8":[4,0,10,2], +"structktxTextureCreateInfo.html#a4bdd6bd9ddee632131ab2e371ea9d66e":[4,0,10,10], +"structktxTextureCreateInfo.html#a71d7762f2b0dd61d57c0a7ec31ee46ac":[4,0,10,0], +"structktxTextureCreateInfo.html#a782126a62c27ee8660a14565b906694c":[4,0,10,9], +"structktxTextureCreateInfo.html#a9b5ca8c2e3fd76d8b427928775289078":[4,0,10,5], +"structktxTextureCreateInfo.html#a9c26601222e6a037f7dbae7b61b18fd0":[4,0,10,3], +"structktxTextureCreateInfo.html#abc50403eebde1f027704eadc05d304c7":[4,0,10,11], +"structktxTextureCreateInfo.html#ae1412e2bd82ef1baa7cb1479735d9c86":[4,0,10,8], +"structktxTextureCreateInfo.html#afe7371a26104de3e131e82cf5cc39e9c":[4,0,10,1], +"structktxTexture__vtbl.html":[4,0,9], +"structktxVulkanDeviceInfo.html":[4,0,11], +"structktxVulkanDeviceInfo.html#a3e22f7507185cca6b31fb443453ad48e":[4,0,11,11], +"structktxVulkanDeviceInfo.html#a8adaad9220e0679d7cfc0c521d8c1736":[4,0,11,9], +"structktxVulkanDeviceInfo.html#a8aef703a0ef81f8277415b03129f44d7":[4,0,11,8], +"structktxVulkanDeviceInfo.html#a8d2064b68f606e62edad9d1a8dcab4ca":[4,0,11,6], +"structktxVulkanDeviceInfo.html#aa89ac6b3401b08de40b59bdb4863b331":[4,0,11,14], +"structktxVulkanDeviceInfo.html#ab264f628c25b3571174ecdd626526958":[4,0,11,10], +"structktxVulkanDeviceInfo.html#ab3246009ce333f50c2ca3d8187c3849e":[4,0,11,13], +"structktxVulkanDeviceInfo.html#ab3f05272e12842d5d4d29fca7baa2e50":[4,0,11,7], +"structktxVulkanDeviceInfo.html#ac2810ac3274fecd32eedb3e6af340df0":[4,0,11,12], +"structktxVulkanFunctions.html":[4,0,12], +"structktxVulkanTexture.html":[4,0,13], +"structktxVulkanTexture.html#a190ebc88642185342b8503667919d276":[4,0,13,13], +"structktxVulkanTexture.html#a325272ddd9a962f05deb905101d25cbd":[4,0,13,14], +"structktxVulkanTexture.html#a387ad43ce8155b27c8feab827f437a40":[4,0,13,9], +"structktxVulkanTexture.html#a3da1a8fe11560f0b2fa98a07e12a1fb7":[4,0,13,11], +"structktxVulkanTexture.html#a68699cf926eef628d726fe0fa402c34d":[4,0,13,4], +"structktxVulkanTexture.html#a6ad4f820ce4e75cda0686fcaad5168be":[4,0,13,5], +"structktxVulkanTexture.html#a723f84255a60631ba53e0c5d2f8f398f":[4,0,13,2], +"structktxVulkanTexture.html#ab0a61f410df5e84b033e0628354286b1":[4,0,13,12], +"structktxVulkanTexture.html#ac48af4a2f518b64b67c40aa0efa7de6b":[4,0,13,6], +"structktxVulkanTexture.html#ad2bc860aeb9a158aa37eb3e09db3638e":[4,0,13,7], +"structktxVulkanTexture.html#ad69bab0528dbcee4c8780b488670a179":[4,0,13,8], +"structktxVulkanTexture.html#af43b771026fceb9a0b28256afc08f69b":[4,0,13,3], +"structktxVulkanTexture.html#afaaf1db5d13d0299791944833b03af9c":[4,0,13,10], +"structktxVulkanTexture__subAllocatorCallbacks.html":[4,0,14], +"structktxVulkanTexture__subAllocatorCallbacks.html#a022984b3cdb46dc478d96b6b7f6f0530":[4,0,14,2], +"structktxVulkanTexture__subAllocatorCallbacks.html#a2689a954037c8baaa1edf32d2834a693":[4,0,14,1], +"structktxVulkanTexture__subAllocatorCallbacks.html#a2c66dedde7a8f263c02134ac1404e9bf":[4,0,14,4], +"structktxVulkanTexture__subAllocatorCallbacks.html#a2e43825e9413d23c3d6922395071db03":[4,0,14,0], +"structktxVulkanTexture__subAllocatorCallbacks.html#a3ada5bd5daf1344f27bdd04b803a7b5b":[4,0,14,5], +"structktxVulkanTexture__subAllocatorCallbacks.html#a729da8478ea87a7f3683b3c010f8cffc":[4,0,14,3], +"topics.html":[3], +"vkload_8cpp-example.html":[6,1] +}; diff --git a/ktx/build/docs/html/libktx/pages.html b/ktx/build/docs/html/libktx/pages.html new file mode 100644 index 0000000..6003fe2 --- /dev/null +++ b/ktx/build/docs/html/libktx/pages.html @@ -0,0 +1,112 @@ + + + + + + + +libktx Reference: Related Pages + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Related Pages
        +
        +
        +
        Here is a list of all related documentation pages:
        +
        +
        +
        + +
        + + diff --git a/ktx/build/docs/html/libktx/search/all_0.js b/ktx/build/docs/html/libktx/search/all_0.js new file mode 100644 index 0000000..1d00653 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['0_0',['0',['../libktx_history.html#v1',1,'Version 1.0'],['../libktx_history.html#v3',1,'Version 2.0'],['../libktx_history.html#v6',1,'Version 3.0'],['../libktx_history.html#v8',1,'Version 4.0']]], + ['0_201_1',['0 1',['../libktx_history.html#v2',1,'Version 1.0.1'],['../libktx_history.html#v4',1,'Version 2.0.1'],['../libktx_history.html#v7',1,'Version 3.0.1']]], + ['0_202_2',['Version 2.0.2',['../libktx_history.html#v5',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_1.js b/ktx/build/docs/html/libktx/search/all_1.js new file mode 100644 index 0000000..ac4314f --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['1_0',['1',['../libktx_history.html#v2',1,'Version 1.0.1'],['../libktx_history.html#v4',1,'Version 2.0.1'],['../libktx_history.html#v7',1,'Version 3.0.1']]], + ['1_200_1',['Version 1.0',['../libktx_history.html#v1',1,'']]], + ['1_200_201_2',['Version 1.0.1',['../libktx_history.html#v2',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_10.js b/ktx/build/docs/html/libktx/search/all_10.js new file mode 100644 index 0000000..410a890 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_10.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['layercount_0',['layerCount',['../structktxVulkanTexture.html#a387ad43ce8155b27c8feab827f437a40',1,'ktxVulkanTexture']]], + ['levelcount_1',['levelCount',['../structktxVulkanTexture.html#afaaf1db5d13d0299791944833b03af9c',1,'ktxVulkanTexture']]], + ['libktx_20reference_2',['libktx Reference',['../index.html',1,'']]], + ['list_3',['Deprecated List',['../deprecated.html',1,'']]], + ['loader_4',['Loader',['../group__ktx__glloader.html',1,'OpenGL Texture Image Loader'],['../group__ktx__vkloader.html',1,'Vulkan Texture Image Loader']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_11.js b/ktx/build/docs/html/libktx/search/all_11.js new file mode 100644 index 0000000..4eb1836 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_11.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['maxendpoints_0',['maxEndpoints',['../structktxBasisParams.html#a47519cb97d15ade856f899023eab9960',1,'ktxBasisParams']]], + ['maxselectors_1',['maxSelectors',['../structktxBasisParams.html#a93a37769ec5b285051083aa8457e1d1a',1,'ktxBasisParams']]], + ['mem_2',['mem',['../structktxStream.html#a2f3b4c3238e6625fb92d53b1c62389cb',1,'ktxStream']]], + ['memorymapfuncptr_3',['memoryMapFuncPtr',['../structktxVulkanTexture__subAllocatorCallbacks.html#a2c66dedde7a8f263c02134ac1404e9bf',1,'ktxVulkanTexture_subAllocatorCallbacks']]], + ['memoryunmapfuncptr_4',['memoryUnmapFuncPtr',['../structktxVulkanTexture__subAllocatorCallbacks.html#a3ada5bd5daf1344f27bdd04b803a7b5b',1,'ktxVulkanTexture_subAllocatorCallbacks']]], + ['memstream_2ec_5',['memstream.c',['../memstream_8c.html',1,'']]], + ['metadata_6',['Extracting Metadata',['../index.html#subsection',1,'']]], + ['mode_7',['mode',['../structktxAstcParams.html#aa02c398f7c7872860347560f4a33fd57',1,'ktxAstcParams']]], + ['modifying_20a_20ktx_20file_8',['Modifying a KTX file',['../index.html#modifyktx',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_12.js b/ktx/build/docs/html/libktx/search/all_12.js new file mode 100644 index 0000000..8ded5da --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_12.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['noendpointrdo_0',['noEndpointRDO',['../structktxBasisParams.html#a24b0d409b2fbd536216196ca4e27358f',1,'ktxBasisParams']]], + ['non_20gl_20and_20non_20vulkan_20use_1',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['non_20vulkan_20use_2',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['normalmap_3',['normalMap',['../structktxAstcParams.html#a59af70a939f66dce9749174c12cc3725',1,'ktxAstcParams::normalMap'],['../structktxBasisParams.html#a59af70a939f66dce9749174c12cc3725',1,'ktxBasisParams::normalMap']]], + ['noselectorrdo_4',['noSelectorRDO',['../structktxBasisParams.html#a740b64ff37292977ab3cf04d3fb3cd6b',1,'ktxBasisParams']]], + ['nosse_5',['noSSE',['../structktxBasisParams.html#a0024310d24bafd33ab41de3bd7dd6887',1,'ktxBasisParams']]], + ['numdimensions_6',['numDimensions',['../structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1',1,'ktxTexture::numDimensions'],['../structktxTextureCreateInfo.html#a3c48573960eb90b1e38cc70457d2cda1',1,'ktxTextureCreateInfo::numDimensions']]], + ['numfaces_7',['numFaces',['../structktxTexture.html#a3a4bc2fa2e41bcec0bdb265505af0068',1,'ktxTexture::numFaces'],['../structktxTextureCreateInfo.html#a3a4bc2fa2e41bcec0bdb265505af0068',1,'ktxTextureCreateInfo::numFaces']]], + ['numlayers_8',['numLayers',['../structktxTextureCreateInfo.html#ae1412e2bd82ef1baa7cb1479735d9c86',1,'ktxTextureCreateInfo']]], + ['numlevels_9',['numLevels',['../structktxTexture.html#a782126a62c27ee8660a14565b906694c',1,'ktxTexture::numLevels'],['../structktxTextureCreateInfo.html#a782126a62c27ee8660a14565b906694c',1,'ktxTextureCreateInfo::numLevels']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_13.js b/ktx/build/docs/html/libktx/search/all_13.js new file mode 100644 index 0000000..0b9dd05 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_13.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['object_20from_20a_20ktx_20file_0',['object from a KTX file',['../index.html#createGL',1,'Creating a GL texture object from a KTX file.'],['../index.html#createVulkan',1,'Creating a Vulkan image object from a KTX file.']]], + ['opengl_20texture_20image_20loader_1',['OpenGL Texture Image Loader',['../group__ktx__glloader.html',1,'']]], + ['or_20ktx2_20file_2',['Writing a KTX or KTX2 file',['../index.html#writektx',1,'']]], + ['or_20uastc_20compressed_20texture_3',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]], + ['orientation_4',['orientation',['../structktxTexture.html#a866e74b57ee9830a8153fb010101efdf',1,'ktxTexture']]], + ['overview_5',['Usage Overview',['../index.html#overview',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_14.js b/ktx/build/docs/html/libktx/search/all_14.js new file mode 100644 index 0000000..0827e50 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_14.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['pallocator_0',['pAllocator',['../structktxVulkanDeviceInfo.html#a3e22f7507185cca6b31fb443453ad48e',1,'ktxVulkanDeviceInfo']]], + ['pdata_1',['pData',['../structktxTexture.html#a75c773bbc36a6adb2a884eb9fb7a709f',1,'ktxTexture']]], + ['pdfd_2',['pDfd',['../structktxTextureCreateInfo.html#a4bdd6bd9ddee632131ab2e371ea9d66e',1,'ktxTextureCreateInfo']]], + ['perceptual_3',['perceptual',['../structktxAstcParams.html#aaee2c7f8b6f18e5e44a7efc72a5099c8',1,'ktxAstcParams']]], + ['pfnglgetprocaddress_4',['PFNGLGETPROCADDRESS',['../ktx_8h.html#aa823ce7b0db0aaefb942c4b5a07504be',1,'ktx.h']]], + ['pfnktxitercb_5',['PFNKTXITERCB',['../structktxTexture.html#aca6d87118e724ac77f17e0576e191513',1,'ktxTexture']]], + ['pfnvoidfunction_6',['PFNVOIDFUNCTION',['../ktx_8h.html#afc39c694986ea1dc6a81da7dc6c2776e',1,'ktx.h']]], + ['physicaldevice_7',['physicalDevice',['../structktxVulkanDeviceInfo.html#ac2810ac3274fecd32eedb3e6af340df0',1,'ktxVulkanDeviceInfo']]], + ['preswizzle_8',['preSwizzle',['../structktxBasisParams.html#a13bd0ffd0161a44f84482ece6b270ce7',1,'ktxBasisParams']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_15.js b/ktx/build/docs/html/libktx/search/all_15.js new file mode 100644 index 0000000..0a1719b --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_15.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['qualitylevel_0',['qualityLevel',['../structktxAstcParams.html#aac5068885c586a1454efbf2e9cf4b3ed',1,'ktxAstcParams::qualityLevel'],['../structktxBasisParams.html#aac5068885c586a1454efbf2e9cf4b3ed',1,'ktxBasisParams::qualityLevel']]], + ['queue_1',['queue',['../structktxVulkanDeviceInfo.html#ab3246009ce333f50c2ca3d8187c3849e',1,'ktxVulkanDeviceInfo']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_16.js b/ktx/build/docs/html/libktx/search/all_16.js new file mode 100644 index 0000000..e4b33d3 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_16.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['read_0',['read',['../structktxStream.html#a723def611194cfe6570ae5b94bdee904',1,'ktxStream']]], + ['reader_1',['Reader',['../group__reader.html',1,'']]], + ['reading_20a_20ktx_20file_20for_20non_20gl_20and_20non_20vulkan_20use_2',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['readpos_3',['readpos',['../structktxStream.html#a9d2fb0a8f4454c78013c49b914c603b6',1,'ktxStream']]], + ['reference_4',['libktx Reference',['../index.html',1,'']]], + ['revision_20history_5',['Revision History',['../libktx_history.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_17.js b/ktx/build/docs/html/libktx/search/all_17.js new file mode 100644 index 0000000..a5f80e3 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_17.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['selectorrdothreshold_0',['selectorRDOThreshold',['../structktxBasisParams.html#aea4a4f651952b4831fdfc784f7058866',1,'ktxBasisParams']]], + ['separatergtorgb_5fa_1',['separateRGToRGB_A',['../structktxBasisParams.html#a2b5e77802a353a04d6b8d1d848f98d47',1,'ktxBasisParams']]], + ['setpos_2',['setpos',['../structktxStream.html#aba03500510363a0b45025645ba4327cf',1,'ktxStream']]], + ['size_3',['size',['../structktxStream.html#ab3d4a868dd03d0fa92cdb5e5fd99ba50',1,'ktxStream']]], + ['skip_4',['skip',['../structktxStream.html#ad224d1f8e4291a2e66e090b3c6df3698',1,'ktxStream']]], + ['strings_2ec_5',['strings.c',['../strings_8c.html',1,'']]], + ['structsize_6',['structSize',['../structktxAstcParams.html#a51fe881fb2eae346ba017f7f55a1d642',1,'ktxAstcParams::structSize'],['../structktxBasisParams.html#a51fe881fb2eae346ba017f7f55a1d642',1,'ktxBasisParams::structSize']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_18.js b/ktx/build/docs/html/libktx/search/all_18.js new file mode 100644 index 0000000..4049cc3 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_18.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['texture_0',['Texture',['../index.html#autotoc_md1',1,'Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture'],['../index.html#autotoc_md0',1,'Writing a Basis-compressed Universal Texture'],['../index.html#autotoc_md2',1,'Writing an ASTC-Compressed Texture']]], + ['texture_20image_20loader_1',['Texture Image Loader',['../group__ktx__glloader.html',1,'OpenGL Texture Image Loader'],['../group__ktx__vkloader.html',1,'Vulkan Texture Image Loader']]], + ['texture_20object_20from_20a_20ktx_20file_2',['Creating a GL texture object from a KTX file.',['../index.html#createGL',1,'']]], + ['threadcount_3',['threadCount',['../structktxAstcParams.html#a04aa92e2192b36b2d9701d23fd246386',1,'ktxAstcParams::threadCount'],['../structktxBasisParams.html#a04aa92e2192b36b2d9701d23fd246386',1,'ktxBasisParams::threadCount']]], + ['transcoding_20a_20basislz_20etc1s_20or_20uastc_20compressed_20texture_4',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_19.js b/ktx/build/docs/html/libktx/search/all_19.js new file mode 100644 index 0000000..94555ce --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_19.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['uastc_0',['uastc',['../structktxBasisParams.html#ac9363a20b43cebc11ab690aec5fbd38d',1,'ktxBasisParams']]], + ['uastc_20compressed_20texture_1',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]], + ['uastcflags_2',['uastcFlags',['../structktxBasisParams.html#ad09ee28fdd7fcd267771deb3d11c2cee',1,'ktxBasisParams']]], + ['uastcrdo_3',['uastcRDO',['../structktxBasisParams.html#a762083beb362fc21fc96f9fec210f2cb',1,'ktxBasisParams']]], + ['uastcrdodictsize_4',['uastcRDODictSize',['../structktxBasisParams.html#a2db4d897c3dddf44f94be794f242343c',1,'ktxBasisParams']]], + ['uastcrdodontfavorsimplermodes_5',['uastcRDODontFavorSimplerModes',['../structktxBasisParams.html#a2800eb7a62ed740bd4e13af330058f75',1,'ktxBasisParams']]], + ['uastcrdomaxsmoothblockerrorscale_6',['uastcRDOMaxSmoothBlockErrorScale',['../structktxBasisParams.html#a144c86b7675a79226b2e88a008078cc8',1,'ktxBasisParams']]], + ['uastcrdomaxsmoothblockstddev_7',['uastcRDOMaxSmoothBlockStdDev',['../structktxBasisParams.html#aacf2963f160d1079e6abccc81e17f7c4',1,'ktxBasisParams']]], + ['uastcrdonomultithreading_8',['uastcRDONoMultithreading',['../structktxBasisParams.html#a8de3ee72ab61a663a495f174796a7b17',1,'ktxBasisParams']]], + ['uastcrdoqualityscalar_9',['uastcRDOQualityScalar',['../structktxBasisParams.html#a1214b8b4eca85e666bf92862e0f22aeb',1,'ktxBasisParams']]], + ['universal_20texture_10',['Writing a Basis-compressed Universal Texture',['../index.html#autotoc_md0',1,'']]], + ['usage_20overview_11',['Usage Overview',['../index.html#overview',1,'']]], + ['use_12',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_1a.js b/ktx/build/docs/html/libktx/search/all_1a.js new file mode 100644 index 0000000..c2007da --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_1a.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['verbose_0',['verbose',['../structktxAstcParams.html#a6ca13a756a2066f8082772b9207e4bba',1,'ktxAstcParams::verbose'],['../structktxBasisParams.html#a6ca13a756a2066f8082772b9207e4bba',1,'ktxBasisParams::verbose']]], + ['version_201_200_1',['Version 1.0',['../libktx_history.html#v1',1,'']]], + ['version_201_200_201_2',['Version 1.0.1',['../libktx_history.html#v2',1,'']]], + ['version_202_200_3',['Version 2.0',['../libktx_history.html#v3',1,'']]], + ['version_202_200_201_4',['Version 2.0.1',['../libktx_history.html#v4',1,'']]], + ['version_202_200_202_5',['Version 2.0.2',['../libktx_history.html#v5',1,'']]], + ['version_203_200_6',['Version 3.0',['../libktx_history.html#v6',1,'']]], + ['version_203_200_201_7',['Version 3.0.1',['../libktx_history.html#v7',1,'']]], + ['version_204_200_8',['Version 4.0',['../libktx_history.html#v8',1,'']]], + ['viewtype_9',['viewType',['../structktxVulkanTexture.html#a3da1a8fe11560f0b2fa98a07e12a1fb7',1,'ktxVulkanTexture']]], + ['vkdestroyimage_10',['vkDestroyImage',['../structktxVulkanTexture.html#ab0a61f410df5e84b033e0628354286b1',1,'ktxVulkanTexture']]], + ['vkformat_11',['vkFormat',['../structktxTextureCreateInfo.html#abc50403eebde1f027704eadc05d304c7',1,'ktxTextureCreateInfo']]], + ['vkfreememory_12',['vkFreeMemory',['../structktxVulkanTexture.html#a190ebc88642185342b8503667919d276',1,'ktxVulkanTexture']]], + ['vkfuncs_13',['vkFuncs',['../structktxVulkanDeviceInfo.html#aa89ac6b3401b08de40b59bdb4863b331',1,'ktxVulkanDeviceInfo']]], + ['vtbl_14',['vtbl',['../structktxTexture.html#ac5d732dd508289d1dda415f4c037c61f',1,'ktxTexture']]], + ['vulkan_20image_20object_20from_20a_20ktx_20file_15',['Creating a Vulkan image object from a KTX file.',['../index.html#createVulkan',1,'']]], + ['vulkan_20texture_20image_20loader_16',['Vulkan Texture Image Loader',['../group__ktx__vkloader.html',1,'']]], + ['vulkan_20use_17',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['vvtbl_18',['vvtbl',['../structktxTexture.html#a277853ea894444859451b1f0966be15f',1,'ktxTexture']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_1b.js b/ktx/build/docs/html/libktx/search/all_1b.js new file mode 100644 index 0000000..de21408 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_1b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['width_0',['width',['../structktxVulkanTexture.html#a325272ddd9a962f05deb905101d25cbd',1,'ktxVulkanTexture']]], + ['write_1',['write',['../structktxStream.html#ae6018760261edc9387c2123395a1447a',1,'ktxStream']]], + ['writer_2',['Writer',['../group__writer.html',1,'']]], + ['writing_20a_20basis_20compressed_20universal_20texture_3',['Writing a Basis-compressed Universal Texture',['../index.html#autotoc_md0',1,'']]], + ['writing_20a_20ktx_20or_20ktx2_20file_4',['Writing a KTX or KTX2 file',['../index.html#writektx',1,'']]], + ['writing_20an_20astc_20compressed_20texture_5',['Writing an ASTC-Compressed Texture',['../index.html#autotoc_md2',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_1c.js b/ktx/build/docs/html/libktx/search/all_1c.js new file mode 100644 index 0000000..3ced99f --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_1c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['x_0',['x',['../structktxOrientation.html#aadb7ef15109e0b085f668c34f4d90206',1,'ktxOrientation']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_1d.js b/ktx/build/docs/html/libktx/search/all_1d.js new file mode 100644 index 0000000..23da878 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_1d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['y_0',['y',['../structktxOrientation.html#aa0c25b8b8a3e79bd0ba427da21d3a88f',1,'ktxOrientation']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_1e.js b/ktx/build/docs/html/libktx/search/all_1e.js new file mode 100644 index 0000000..72e9ec3 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_1e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['z_0',['z',['../structktxOrientation.html#a1f9b804769fed960e686ccc4eca40b0f',1,'ktxOrientation']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_2.js b/ktx/build/docs/html/libktx/search/all_2.js new file mode 100644 index 0000000..b6b0d3f --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_2.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['2_0',['Version 2.0.2',['../libktx_history.html#v5',1,'']]], + ['2_200_1',['Version 2.0',['../libktx_history.html#v3',1,'']]], + ['2_200_201_2',['Version 2.0.1',['../libktx_history.html#v4',1,'']]], + ['2_200_202_3',['Version 2.0.2',['../libktx_history.html#v5',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_3.js b/ktx/build/docs/html/libktx/search/all_3.js new file mode 100644 index 0000000..8b62f3a --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['3_200_0',['Version 3.0',['../libktx_history.html#v6',1,'']]], + ['3_200_201_1',['Version 3.0.1',['../libktx_history.html#v7',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_4.js b/ktx/build/docs/html/libktx/search/all_4.js new file mode 100644 index 0000000..c2d2f44 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['4_200_0',['Version 4.0',['../libktx_history.html#v8',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_5.js b/ktx/build/docs/html/libktx/search/all_5.js new file mode 100644 index 0000000..95e06ae --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['_5fprivate_0',['_private',['../structktxTexture1.html#a2113cfebb1a5e3328ce7a89d21e7cdab',1,'ktxTexture1::_private'],['../structktxTexture2.html#a0093ccc55cbbc2d352e6e1e8d8fbc2ab',1,'ktxTexture2::_private']]], + ['_5fprotected_1',['_protected',['../structktxTexture.html#ad1e7a90bd204e54ada5057631f5bdf02',1,'ktxTexture']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_6.js b/ktx/build/docs/html/libktx/search/all_6.js new file mode 100644 index 0000000..2a19b1f --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_6.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['a_20basis_20compressed_20universal_20texture_0',['Writing a Basis-compressed Universal Texture',['../index.html#autotoc_md0',1,'']]], + ['a_20basislz_20etc1s_20or_20uastc_20compressed_20texture_1',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]], + ['a_20gl_20texture_20object_20from_20a_20ktx_20file_2',['Creating a GL texture object from a KTX file.',['../index.html#createGL',1,'']]], + ['a_20ktx_20file_3',['a KTX file',['../index.html#createGL',1,'Creating a GL texture object from a KTX file.'],['../index.html#createVulkan',1,'Creating a Vulkan image object from a KTX file.'],['../index.html#modifyktx',1,'Modifying a KTX file']]], + ['a_20ktx_20file_20for_20non_20gl_20and_20non_20vulkan_20use_4',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['a_20ktx_20or_20ktx2_20file_5',['Writing a KTX or KTX2 file',['../index.html#writektx',1,'']]], + ['a_20vulkan_20image_20object_20from_20a_20ktx_20file_6',['Creating a Vulkan image object from a KTX file.',['../index.html#createVulkan',1,'']]], + ['address_7',['address',['../structktxStream.html#ab96816d317aa5196e2ef198d9a8d621b',1,'ktxStream']]], + ['allocationid_8',['allocationId',['../structktxVulkanTexture.html#a723f84255a60631ba53e0c5d2f8f398f',1,'ktxVulkanTexture']]], + ['allocatoraddress_9',['allocatorAddress',['../structktxStream.html#a6de39e2650d144d37e3f2c32081dd55f',1,'ktxStream']]], + ['allocmemfuncptr_10',['allocMemFuncPtr',['../structktxVulkanTexture__subAllocatorCallbacks.html#a2e43825e9413d23c3d6922395071db03',1,'ktxVulkanTexture_subAllocatorCallbacks']]], + ['an_20astc_20compressed_20texture_11',['Writing an ASTC-Compressed Texture',['../index.html#autotoc_md2',1,'']]], + ['and_20non_20vulkan_20use_12',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['astc_20compressed_20texture_13',['Writing an ASTC-Compressed Texture',['../index.html#autotoc_md2',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_7.js b/ktx/build/docs/html/libktx/search/all_7.js new file mode 100644 index 0000000..4d1c73f --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_7.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['basedepth_0',['baseDepth',['../structktxTexture.html#a71d7762f2b0dd61d57c0a7ec31ee46ac',1,'ktxTexture::baseDepth'],['../structktxTextureCreateInfo.html#a71d7762f2b0dd61d57c0a7ec31ee46ac',1,'ktxTextureCreateInfo::baseDepth']]], + ['baseheight_1',['baseHeight',['../structktxTexture.html#afe7371a26104de3e131e82cf5cc39e9c',1,'ktxTexture::baseHeight'],['../structktxTextureCreateInfo.html#afe7371a26104de3e131e82cf5cc39e9c',1,'ktxTextureCreateInfo::baseHeight']]], + ['basewidth_2',['baseWidth',['../structktxTexture.html#a3fa51cc9001702e3f1d5a69cee65adf8',1,'ktxTexture::baseWidth'],['../structktxTextureCreateInfo.html#a3fa51cc9001702e3f1d5a69cee65adf8',1,'ktxTextureCreateInfo::baseWidth']]], + ['basis_20compressed_20universal_20texture_3',['Writing a Basis-compressed Universal Texture',['../index.html#autotoc_md0',1,'']]], + ['basislz_20etc1s_20or_20uastc_20compressed_20texture_4',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]], + ['bindbufferfuncptr_5',['bindBufferFuncPtr',['../structktxVulkanTexture__subAllocatorCallbacks.html#a2689a954037c8baaa1edf32d2834a693',1,'ktxVulkanTexture_subAllocatorCallbacks']]], + ['bindimagefuncptr_6',['bindImageFuncPtr',['../structktxVulkanTexture__subAllocatorCallbacks.html#a022984b3cdb46dc478d96b6b7f6f0530',1,'ktxVulkanTexture_subAllocatorCallbacks']]], + ['blockdimension_7',['blockDimension',['../structktxAstcParams.html#a7a2b8fd2f04b2990c176606e45a02c22',1,'ktxAstcParams']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_8.js b/ktx/build/docs/html/libktx/search/all_8.js new file mode 100644 index 0000000..583cdad --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_8.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['classid_0',['classId',['../structktxTexture.html#a150d3ff33a9fa83ecba8e3fdda7ec972',1,'ktxTexture']]], + ['closeondestruct_1',['closeOnDestruct',['../structktxStream.html#abac8ddd51b8b30aee6c98a1ab2adef13',1,'ktxStream']]], + ['cmdbuffer_2',['cmdBuffer',['../structktxVulkanDeviceInfo.html#a8d2064b68f606e62edad9d1a8dcab4ca',1,'ktxVulkanDeviceInfo']]], + ['cmdpool_3',['cmdPool',['../structktxVulkanDeviceInfo.html#ab3f05272e12842d5d4d29fca7baa2e50',1,'ktxVulkanDeviceInfo']]], + ['compressed_20texture_4',['Writing an ASTC-Compressed Texture',['../index.html#autotoc_md2',1,'']]], + ['compressed_20texture_5',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]], + ['compressed_20universal_20texture_6',['Writing a Basis-compressed Universal Texture',['../index.html#autotoc_md0',1,'']]], + ['compressionlevel_7',['compressionLevel',['../structktxBasisParams.html#a27652d35542830750e195ab57dd1f3b1',1,'ktxBasisParams']]], + ['creating_20a_20gl_20texture_20object_20from_20a_20ktx_20file_8',['Creating a GL texture object from a KTX file.',['../index.html#createGL',1,'']]], + ['creating_20a_20vulkan_20image_20object_20from_20a_20ktx_20file_9',['Creating a Vulkan image object from a KTX file.',['../index.html#createVulkan',1,'']]], + ['custom_5fptr_10',['custom_ptr',['../structktxStream.html#a26a82a7cdf288fc1a7e2b77ecb9d1d38',1,'ktxStream']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_9.js b/ktx/build/docs/html/libktx/search/all_9.js new file mode 100644 index 0000000..cbf7171 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_9.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['data_0',['data',['../structktxStream.html#a01015dd5ef6b90112358effdee79a6bc',1,'ktxStream']]], + ['datasize_1',['dataSize',['../structktxTexture.html#af90defa509395c58549940d3b634b3e9',1,'ktxTexture']]], + ['deprecated_20list_2',['Deprecated List',['../deprecated.html',1,'']]], + ['depth_3',['depth',['../structktxVulkanTexture.html#af43b771026fceb9a0b28256afc08f69b',1,'ktxVulkanTexture']]], + ['destruct_4',['destruct',['../structktxStream.html#a1215c8b33ba64ba53bd86134ae80c1d6',1,'ktxStream']]], + ['device_5',['device',['../structktxVulkanDeviceInfo.html#a8aef703a0ef81f8277415b03129f44d7',1,'ktxVulkanDeviceInfo']]], + ['devicememory_6',['deviceMemory',['../structktxVulkanTexture.html#a68699cf926eef628d726fe0fa402c34d',1,'ktxVulkanTexture']]], + ['devicememoryproperties_7',['deviceMemoryProperties',['../structktxVulkanDeviceInfo.html#a8adaad9220e0679d7cfc0c521d8c1736',1,'ktxVulkanDeviceInfo']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_a.js b/ktx/build/docs/html/libktx/search/all_a.js new file mode 100644 index 0000000..e0d016f --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['endpointrdothreshold_0',['endpointRDOThreshold',['../structktxBasisParams.html#aafccbc4e43845f62cf500d4792c7cf6a',1,'ktxBasisParams']]], + ['etc1s_20or_20uastc_20compressed_20texture_1',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]], + ['extracting_20metadata_2',['Extracting Metadata',['../index.html#subsection',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_b.js b/ktx/build/docs/html/libktx/search/all_b.js new file mode 100644 index 0000000..7a00906 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['file_0',['file',['../index.html#createGL',1,'Creating a GL texture object from a KTX file.'],['../index.html#createVulkan',1,'Creating a Vulkan image object from a KTX file.'],['../structktxStream.html#a702945180aa732857b380a007a7e2a21',1,'ktxStream::file'],['../index.html#modifyktx',1,'Modifying a KTX file'],['../index.html#writektx',1,'Writing a KTX or KTX2 file']]], + ['file_20for_20non_20gl_20and_20non_20vulkan_20use_1',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['filestream_2ec_2',['filestream.c',['../filestream_8c.html',1,'']]], + ['for_20non_20gl_20and_20non_20vulkan_20use_3',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['freememfuncptr_4',['freeMemFuncPtr',['../structktxVulkanTexture__subAllocatorCallbacks.html#a729da8478ea87a7f3683b3c010f8cffc',1,'ktxVulkanTexture_subAllocatorCallbacks']]], + ['from_20a_20ktx_20file_5',['from a KTX file',['../index.html#createGL',1,'Creating a GL texture object from a KTX file.'],['../index.html#createVulkan',1,'Creating a Vulkan image object from a KTX file.']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_c.js b/ktx/build/docs/html/libktx/search/all_c.js new file mode 100644 index 0000000..7177f89 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_c.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['generatemipmaps_0',['generateMipmaps',['../structktxTexture.html#a9c26601222e6a037f7dbae7b61b18fd0',1,'ktxTexture::generateMipmaps'],['../structktxTextureCreateInfo.html#a9c26601222e6a037f7dbae7b61b18fd0',1,'ktxTextureCreateInfo::generateMipmaps']]], + ['getpos_1',['getpos',['../structktxStream.html#adcabf99e783fe9ca551ac9706372400c',1,'ktxStream']]], + ['getsize_2',['getsize',['../structktxStream.html#a76bd679ca3d583cc56c524e53665e775',1,'ktxStream']]], + ['gl_20and_20non_20vulkan_20use_3',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['gl_20texture_20object_20from_20a_20ktx_20file_4',['Creating a GL texture object from a KTX file.',['../index.html#createGL',1,'']]], + ['glbaseinternalformat_5',['glBaseInternalformat',['../structktxTexture1.html#aaadefe13bf76c26cb921afa52fb29192',1,'ktxTexture1']]], + ['glformat_6',['glFormat',['../structktxTexture1.html#a05fa4fecc2735f68d34651a62493ecd9',1,'ktxTexture1']]], + ['glinternalformat_7',['glInternalformat',['../structktxTexture1.html#a1318d73f800ff61d045b740331939596',1,'ktxTexture1::glInternalformat'],['../structktxTextureCreateInfo.html#a1318d73f800ff61d045b740331939596',1,'ktxTextureCreateInfo::glInternalformat']]], + ['gltype_8',['glType',['../structktxTexture1.html#ac8a870c675f1e36c456c9de2e3ac9855',1,'ktxTexture1']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_d.js b/ktx/build/docs/html/libktx/search/all_d.js new file mode 100644 index 0000000..9487b2c --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_d.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['height_0',['height',['../structktxVulkanTexture.html#a6ad4f820ce4e75cda0686fcaad5168be',1,'ktxVulkanTexture']]], + ['history_1',['Revision History',['../libktx_history.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_e.js b/ktx/build/docs/html/libktx/search/all_e.js new file mode 100644 index 0000000..5d2ba87 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_e.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['image_0',['image',['../structktxVulkanTexture.html#ac48af4a2f518b64b67c40aa0efa7de6b',1,'ktxVulkanTexture']]], + ['image_20loader_1',['Image Loader',['../group__ktx__glloader.html',1,'OpenGL Texture Image Loader'],['../group__ktx__vkloader.html',1,'Vulkan Texture Image Loader']]], + ['image_20object_20from_20a_20ktx_20file_2',['Creating a Vulkan image object from a KTX file.',['../index.html#createVulkan',1,'']]], + ['imageformat_3',['imageFormat',['../structktxVulkanTexture.html#ad2bc860aeb9a158aa37eb3e09db3638e',1,'ktxVulkanTexture']]], + ['imagelayout_4',['imageLayout',['../structktxVulkanTexture.html#ad69bab0528dbcee4c8780b488670a179',1,'ktxVulkanTexture']]], + ['inputswizzle_5',['inputSwizzle',['../structktxAstcParams.html#a0d67004efa49e08a7f39f71c93286b0a',1,'ktxAstcParams::inputSwizzle'],['../structktxBasisParams.html#a0d67004efa49e08a7f39f71c93286b0a',1,'ktxBasisParams::inputSwizzle']]], + ['instance_6',['instance',['../structktxVulkanDeviceInfo.html#ab264f628c25b3571174ecdd626526958',1,'ktxVulkanDeviceInfo']]], + ['isarray_7',['isArray',['../structktxTexture.html#a9b5ca8c2e3fd76d8b427928775289078',1,'ktxTexture::isArray'],['../structktxTextureCreateInfo.html#a9b5ca8c2e3fd76d8b427928775289078',1,'ktxTextureCreateInfo::isArray']]], + ['iscompressed_8',['isCompressed',['../structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650',1,'ktxTexture']]], + ['iscubemap_9',['isCubemap',['../structktxTexture.html#a0b4f9762223cba4cae76fefcbb413f39',1,'ktxTexture']]] +]; diff --git a/ktx/build/docs/html/libktx/search/all_f.js b/ktx/build/docs/html/libktx/search/all_f.js new file mode 100644 index 0000000..5a7ac36 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/all_f.js @@ -0,0 +1,283 @@ +var searchData= +[ + ['ktx_20file_0',['KTX file',['../index.html#createGL',1,'Creating a GL texture object from a KTX file.'],['../index.html#createVulkan',1,'Creating a Vulkan image object from a KTX file.'],['../index.html#modifyktx',1,'Modifying a KTX file']]], + ['ktx_20file_20for_20non_20gl_20and_20non_20vulkan_20use_1',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['ktx_20or_20ktx2_20file_2',['Writing a KTX or KTX2 file',['../index.html#writektx',1,'']]], + ['ktx_2eh_3',['ktx.h',['../ktx_8h.html',1,'']]], + ['ktx2_20file_4',['Writing a KTX or KTX2 file',['../index.html#writektx',1,'']]], + ['ktx_5fanimdata_5fkey_5',['KTX_ANIMDATA_KEY',['../ktx_8h.html#a8c260cc2a9b8d4ee63ccc36810779f84',1,'ktx.h']]], + ['ktx_5fdecompress_5fchecksum_5ferror_6',['KTX_DECOMPRESS_CHECKSUM_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca349391a68adb9c8c4a71dd50d6e96745',1,'ktx.h']]], + ['ktx_5fdecompress_5flength_5ferror_7',['KTX_DECOMPRESS_LENGTH_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca37dce54f5aefa409567d7c08e36d1d83',1,'ktx.h']]], + ['ktx_5ferror_5fcode_8',['KTX_error_code',['../ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa',1,'ktx.h']]], + ['ktx_5ferror_5fcode_5fe_9',['ktx_error_code_e',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116c',1,'ktx_error_code_e: ktx.h'],['../ktx_8h.html#a73e2b01e559ccfed8cf5fe0831b33ce9',1,'ktx_error_code_e: ktx.h']]], + ['ktx_5ferror_5fmax_5fenum_10',['KTX_ERROR_MAX_ENUM',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cabb7ad088582cd16709a27679312363ae',1,'ktx.h']]], + ['ktx_5ffile_5fdata_5ferror_11',['KTX_FILE_DATA_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca0a3b899c794df326ebcea8dd3a679c14',1,'ktx.h']]], + ['ktx_5ffile_5fispipe_12',['KTX_FILE_ISPIPE',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca2570f4138cacf052d6ff892931507851',1,'ktx.h']]], + ['ktx_5ffile_5fopen_5ffailed_13',['KTX_FILE_OPEN_FAILED',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cac8f2bb08408001aad4941fc7b3f45558',1,'ktx.h']]], + ['ktx_5ffile_5foverflow_14',['KTX_FILE_OVERFLOW',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf1c77ba0fee3c65d49a334bec949c8a6',1,'ktx.h']]], + ['ktx_5ffile_5fread_5ferror_15',['KTX_FILE_READ_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca1559258b3bd0f47eef28fd4839074452',1,'ktx.h']]], + ['ktx_5ffile_5fseek_5ferror_16',['KTX_FILE_SEEK_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cae5983275cc1d3d3480c5cf1275723cf1',1,'ktx.h']]], + ['ktx_5ffile_5funexpected_5feof_17',['KTX_FILE_UNEXPECTED_EOF',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cab6d2090e851d9757ce32c05ec807ba4d',1,'ktx.h']]], + ['ktx_5ffile_5fwrite_5ferror_18',['KTX_FILE_WRITE_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca85733279b7d3e00ad9a6d498d6686645',1,'ktx.h']]], + ['ktx_5fgl_5ferror_19',['KTX_GL_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf',1,'ktx.h']]], + ['ktx_5fgl_5funpack_5falignment_20',['KTX_GL_UNPACK_ALIGNMENT',['../ktx_8h.html#ad5dd0ebf8aaef8c150603bd95d61b94a',1,'ktx.h']]], + ['ktx_5finvalid_5foperation_21',['KTX_INVALID_OPERATION',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a',1,'ktx.h']]], + ['ktx_5finvalid_5fvalue_22',['KTX_INVALID_VALUE',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca7da41bb3195d6cc93a513ac18bc91e4f',1,'ktx.h']]], + ['ktx_5flibrary_5fnot_5flinked_23',['KTX_LIBRARY_NOT_LINKED',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caac88f0051f9b5c217f3f53128e6960ef',1,'ktx.h']]], + ['ktx_5fmem_5fdefault_5fallocated_5fsize_24',['KTX_MEM_DEFAULT_ALLOCATED_SIZE',['../memstream_8c.html#ad9d0c31ff64d0512e98e0b6991051b62',1,'memstream.c']]], + ['ktx_5fnot_5ffound_25',['KTX_NOT_FOUND',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cac9008e8d20f60f4fb67d735f287be470',1,'ktx.h']]], + ['ktx_5forientation1_5ffmt_26',['KTX_ORIENTATION1_FMT',['../ktx_8h.html#a9b4e1997eff4e29930d5aca784483d57',1,'ktx.h']]], + ['ktx_5forientation2_5ffmt_27',['KTX_ORIENTATION2_FMT',['../ktx_8h.html#ad235113b0090e64ad23a0cf7097e1b7a',1,'ktx.h']]], + ['ktx_5forientation3_5ffmt_28',['KTX_ORIENTATION3_FMT',['../ktx_8h.html#ae34c19ed0ef799a902fa50dc3a0bbb20',1,'ktx.h']]], + ['ktx_5forientation_5fkey_29',['KTX_ORIENTATION_KEY',['../ktx_8h.html#a7eebf850576083e740cf1f418eed39a0',1,'ktx.h']]], + ['ktx_5fout_5fof_5fmemory_30',['KTX_OUT_OF_MEMORY',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca87728a1745ea6333b6fbe041c03036f2',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fblock_5fdimension_5fe_31',['ktx_pack_astc_block_dimension_e',['../ktx_8h.html#a1873d492a1b1fc5fd3296192fce3e9d5',1,'ktx_pack_astc_block_dimension_e: ktx.h'],['../ktx_8h.html#a9413ce1ef7871db012b9a798bed90639',1,'ktx_pack_astc_block_dimension_e: ktx.h']]], + ['ktx_5fpack_5fastc_5fblock_5fdimension_5fmax_32',['KTX_PACK_ASTC_BLOCK_DIMENSION_MAX',['../ktx_8h.html#a1873d492a1b1fc5fd3296192fce3e9d5a8a0a5ff023478a7951bf6cef24987558',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fencoder_5fmode_5fdefault_33',['KTX_PACK_ASTC_ENCODER_MODE_DEFAULT',['../ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6af943cccff0ab1790f5ff14ca250d7f65',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fencoder_5fmode_5fe_34',['ktx_pack_astc_encoder_mode_e',['../ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6',1,'ktx_pack_astc_encoder_mode_e: ktx.h'],['../ktx_8h.html#a5206479bb101cbca15184f1f215f9607',1,'ktx_pack_astc_encoder_mode_e: ktx.h']]], + ['ktx_5fpack_5fastc_5fencoder_5fmode_5fhdr_35',['KTX_PACK_ASTC_ENCODER_MODE_HDR',['../ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6a02edf562ddcc85e6fdefb9b8304ef7ec',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fencoder_5fmode_5fldr_36',['KTX_PACK_ASTC_ENCODER_MODE_LDR',['../ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6a6971976df75bdc5aa7099b59ad345361',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fencoder_5fmode_5fmax_37',['KTX_PACK_ASTC_ENCODER_MODE_MAX',['../ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6a123569090bcb7d44f26d40e365fc821a',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevel_5fexhaustive_38',['KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9af195805d16e6875f46da8dc875b753c5',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevel_5ffast_39',['KTX_PACK_ASTC_QUALITY_LEVEL_FAST',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9aae959532601276e8e112d2cc0ae42324',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevel_5ffastest_40',['KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9a8f9546d69b84dad39f540d465c00fe2f',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevel_5fmax_41',['KTX_PACK_ASTC_QUALITY_LEVEL_MAX',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9a3f3681d3e1feb7fb6707a5b3aa1366b1',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevel_5fmedium_42',['KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9a17832137be7a8ff0b839fd41e1abb923',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevel_5fthorough_43',['KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9aeaf5ea197d3c6f3f2b8ee70809ac60f7',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevels_5fe_44',['ktx_pack_astc_quality_levels_e',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9',1,'ktx_pack_astc_quality_levels_e: ktx.h'],['../ktx_8h.html#a63d8010783f001c80dc9d05dd1d3bb17',1,'ktx_pack_astc_quality_levels_e: ktx.h']]], + ['ktx_5fpack_5fuastc_5f_5fetc1_5fdisable_5fflip_5fand_5findividual_45',['KTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670ac0f60c4fb9a32fd8101eeda8a699fa0e',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5fetc1_5ffaster_5fhints_46',['KTX_PACK_UASTC_ETC1_FASTER_HINTS',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670ae3abc0e230dfe7395d80ae5216f0820d',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5fetc1_5ffastest_5fhints_47',['KTX_PACK_UASTC_ETC1_FASTEST_HINTS',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670ac8356ccb10a6259c5483181e9158f191',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5ffavor_5fbc7_5ferror_48',['KTX_PACK_UASTC_FAVOR_BC7_ERROR',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a2aa07cb9f618a10440c7fc0c1838d83d',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5ffavor_5fuastc_5ferror_49',['KTX_PACK_UASTC_FAVOR_UASTC_ERROR',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a9b456a870a596abbc95d946c1c1e681c',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5fflag_5fbits_5fe_50',['ktx_pack_uastc_flag_bits_e',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670',1,'ktx_pack_uastc_flag_bits_e: ktx.h'],['../ktx_8h.html#a2c20092a7ccf1454c1de41fe55a54e92',1,'ktx_pack_uastc_flag_bits_e: ktx.h']]], + ['ktx_5fpack_5fuastc_5flevel_5fdefault_51',['KTX_PACK_UASTC_LEVEL_DEFAULT',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a3a4df853d3a689ccde076618d013d642',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5flevel_5ffaster_52',['KTX_PACK_UASTC_LEVEL_FASTER',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a81acf28386d4eb6f184c850254d87f6f',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5flevel_5ffastest_53',['KTX_PACK_UASTC_LEVEL_FASTEST',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a2f97075bb6e51728f82d0d51c16acc1c',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5flevel_5fmask_54',['KTX_PACK_UASTC_LEVEL_MASK',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670abccd25d5ac984dab93df3b711712c778',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5flevel_5fslower_55',['KTX_PACK_UASTC_LEVEL_SLOWER',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a9ac3a05c6fe72efd3a61cbdd0b244699',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5flevel_5fveryslow_56',['KTX_PACK_UASTC_LEVEL_VERYSLOW',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a375bd5a1c645198196a4b536de67f276',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5fmax_5flevel_57',['KTX_PACK_UASTC_MAX_LEVEL',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a6ee376eeb5c1b736fb5f71025b332375',1,'ktx.h']]], + ['ktx_5fss_5fbasis_5flz_58',['KTX_SS_BASIS_LZ',['../ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaaf66da31ed897385538dab6c591e5bf5c',1,'ktx.h']]], + ['ktx_5fss_5fnone_59',['KTX_SS_NONE',['../ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaa9559585b30aa7fe5d510753ceae6fcc6',1,'ktx.h']]], + ['ktx_5fss_5fzlib_60',['KTX_SS_ZLIB',['../ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaa01c22adc03102420ef016d614cb5e0f5',1,'ktx.h']]], + ['ktx_5fss_5fzstd_61',['KTX_SS_ZSTD',['../ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaa29f7da526697257766534b667fd706ef',1,'ktx.h']]], + ['ktx_5fsuccess_62',['KTX_SUCCESS',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98',1,'ktx.h']]], + ['ktx_5fswizzle_5fkey_63',['KTX_SWIZZLE_KEY',['../ktx_8h.html#a526ee1e695723619c057875af35c93d6',1,'ktx.h']]], + ['ktx_5ftexture_5fcreate_5falloc_5fstorage_64',['KTX_TEXTURE_CREATE_ALLOC_STORAGE',['../ktx_8h.html#a2ab4b656d36abc318aed17a5f73c505c',1,'ktx.h']]], + ['ktx_5ftexture_5fcreate_5fcheck_5fgltf_5fbasisu_5fbit_65',['KTX_TEXTURE_CREATE_CHECK_GLTF_BASISU_BIT',['../ktx_8h.html#aa89ab54b6393de2a3b73838197f321a4',1,'ktx.h']]], + ['ktx_5ftexture_5fcreate_5fload_5fimage_5fdata_5fbit_66',['KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT',['../ktx_8h.html#a5d741f48293002f70546881d2394b6f6',1,'ktx.h']]], + ['ktx_5ftexture_5fcreate_5fno_5fstorage_67',['KTX_TEXTURE_CREATE_NO_STORAGE',['../ktx_8h.html#adbea2c86013d12a4825500156e0c1f60',1,'ktx.h']]], + ['ktx_5ftexture_5fcreate_5fraw_5fkvdata_5fbit_68',['KTX_TEXTURE_CREATE_RAW_KVDATA_BIT',['../ktx_8h.html#aa5a065e72ab3fffea96a320f0af415c1',1,'ktx.h']]], + ['ktx_5ftexture_5fcreate_5fskip_5fkvdata_5fbit_69',['KTX_TEXTURE_CREATE_SKIP_KVDATA_BIT',['../ktx_8h.html#a932bc39751e896edb5c48415447edc50',1,'ktx.h']]], + ['ktx_5ftf_5fbc1_70',['KTX_TF_BC1',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5abb672255cb647aceeb99b05e7f6d99b2',1,'ktx.h']]], + ['ktx_5ftf_5fbc3_71',['KTX_TF_BC3',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a6a05289216c33a4c731e7b9670e83eab',1,'ktx.h']]], + ['ktx_5ftf_5fbc4_72',['KTX_TF_BC4',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a260df90000f23f2bf1a06368304f5985',1,'ktx.h']]], + ['ktx_5ftf_5fbc5_73',['KTX_TF_BC5',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a39a369e112f19db1769f6c02b26f283b',1,'ktx.h']]], + ['ktx_5ftf_5fbc7_5fm6_5fopaque_5fonly_74',['KTX_TF_BC7_M6_OPAQUE_ONLY',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5afcf0ab81c08710d1c1ad1a0445a4775f',1,'ktx.h']]], + ['ktx_5ftf_5fetc1_75',['KTX_TF_ETC1',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a4d5ff56c820f41b01ceaa7b1056fd38c',1,'ktx.h']]], + ['ktx_5ftf_5fetc2_76',['KTX_TF_ETC2',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad0aacfd9b57f902f7e140a9fe4a501bd',1,'ktx.h']]], + ['ktx_5ftf_5fhigh_5fquality_77',['KTX_TF_HIGH_QUALITY',['../ktx_8h.html#ab2288718afab080ff86e9d3250180fb6a1f5bb151dc8463b0a917d98cb42f3506',1,'ktx.h']]], + ['ktx_5ftf_5fpvrtc1_5f4_5fopaque_5fonly_78',['KTX_TF_PVRTC1_4_OPAQUE_ONLY',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a2117d164feecb02ba5199b4ee72d2f04',1,'ktx.h']]], + ['ktx_5ftf_5fpvrtc_5fdecode_5fto_5fnext_5fpow2_79',['KTX_TF_PVRTC_DECODE_TO_NEXT_POW2',['../ktx_8h.html#ab2288718afab080ff86e9d3250180fb6a0757a22b5adb1792c54547f1d759878d',1,'ktx.h']]], + ['ktx_5ftf_5ftranscode_5falpha_5fdata_5fto_5fopaque_5fformats_80',['KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS',['../ktx_8h.html#ab2288718afab080ff86e9d3250180fb6a76abf8fba809fc617dbdf65d70320d24',1,'ktx.h']]], + ['ktx_5ftranscode_5ffailed_81',['KTX_TRANSCODE_FAILED',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad9ba6e380b7a1d44a10b6626357ee3a1',1,'ktx.h']]], + ['ktx_5ftranscode_5fflag_5fbits_5fe_82',['ktx_transcode_flag_bits_e',['../ktx_8h.html#ab2288718afab080ff86e9d3250180fb6',1,'ktx_transcode_flag_bits_e: ktx.h'],['../ktx_8h.html#aeeccd9521857185425c9af3b5866166b',1,'ktx_transcode_flag_bits_e: ktx.h']]], + ['ktx_5ftranscode_5ffmt_5fe_83',['ktx_transcode_fmt_e',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5',1,'ktx_transcode_fmt_e: ktx.h'],['../ktx_8h.html#ac0484f02707783e103f82961444b7b16',1,'ktx_transcode_fmt_e: ktx.h']]], + ['ktx_5fttf_5fastc_5f4x4_5frgba_84',['KTX_TTF_ASTC_4x4_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a26ee2ca9dbc9384ded1c41c59a8bc3b6',1,'ktx.h']]], + ['ktx_5fttf_5fbc1_5for_5f3_85',['KTX_TTF_BC1_OR_3',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ae1906b8161119e9aca1add331ecf6de6',1,'ktx.h']]], + ['ktx_5fttf_5fbc1_5frgb_86',['KTX_TTF_BC1_RGB',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a7b596baf4e8088b0ddda7615971e274e',1,'ktx.h']]], + ['ktx_5fttf_5fbc3_5frgba_87',['KTX_TTF_BC3_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a352f7aeb953d220e0fa4abc025a6f880',1,'ktx.h']]], + ['ktx_5fttf_5fbc4_5fr_88',['KTX_TTF_BC4_R',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5aebbc72211dd8662af91b2f910fda4be3',1,'ktx.h']]], + ['ktx_5fttf_5fbc5_5frg_89',['KTX_TTF_BC5_RG',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5af030f0703301f830ece442aa508195b0',1,'ktx.h']]], + ['ktx_5fttf_5fbc7_5fm5_5frgba_90',['KTX_TTF_BC7_M5_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a0725a0280faa5a362e823daa958b9e5d',1,'ktx.h']]], + ['ktx_5fttf_5fbc7_5fm6_5frgb_91',['KTX_TTF_BC7_M6_RGB',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad84ab9c0ac149b791721ce08a4498d74',1,'ktx.h']]], + ['ktx_5fttf_5fbc7_5frgba_92',['KTX_TTF_BC7_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5aacba582511ea35fbec2fa8fa92a900cc',1,'ktx.h']]], + ['ktx_5fttf_5fbgr565_93',['KTX_TTF_BGR565',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5acc73a45251f2fd88d3f580dee0e14108',1,'ktx.h']]], + ['ktx_5fttf_5fetc_94',['KTX_TTF_ETC',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad5caffd2fe438bbac51f2e314a3dd7c3',1,'ktx.h']]], + ['ktx_5fttf_5fetc1_5frgb_95',['KTX_TTF_ETC1_RGB',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a6b1967cc612417644b7ecb86bdc2de48',1,'ktx.h']]], + ['ktx_5fttf_5fetc2_5feac_5fr11_96',['KTX_TTF_ETC2_EAC_R11',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a7ea42a1c24b02633a3041dcd49c11dfe',1,'ktx.h']]], + ['ktx_5fttf_5fetc2_5feac_5frg11_97',['KTX_TTF_ETC2_EAC_RG11',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5abeba5d59ae679316666a71c48ced66c5',1,'ktx.h']]], + ['ktx_5fttf_5fetc2_5frgba_98',['KTX_TTF_ETC2_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a665baafd3c1d246bf2726342a083a26b',1,'ktx.h']]], + ['ktx_5fttf_5fpvrtc1_5f4_5frgb_99',['KTX_TTF_PVRTC1_4_RGB',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a6d129443f90dd85da21fd1fc1fd50e36',1,'ktx.h']]], + ['ktx_5fttf_5fpvrtc1_5f4_5frgba_100',['KTX_TTF_PVRTC1_4_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a14600faaff61212753946fd9b74b4064',1,'ktx.h']]], + ['ktx_5fttf_5fpvrtc2_5f4_5frgb_101',['KTX_TTF_PVRTC2_4_RGB',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ab7dacf1384bb2f22655b9cf6064fd5e8',1,'ktx.h']]], + ['ktx_5fttf_5fpvrtc2_5f4_5frgba_102',['KTX_TTF_PVRTC2_4_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5af884679766dab49838e52c55d8304d59',1,'ktx.h']]], + ['ktx_5fttf_5frgb565_103',['KTX_TTF_RGB565',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ab949b2bfc245a6d8098817954ac41290',1,'ktx.h']]], + ['ktx_5fttf_5frgba32_104',['KTX_TTF_RGBA32',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad790151a02bcf2368e3157e180a2fdd9',1,'ktx.h']]], + ['ktx_5fttf_5frgba4444_105',['KTX_TTF_RGBA4444',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5acae08dfc76603e86b16908a8d6c46833',1,'ktx.h']]], + ['ktx_5funknown_5ffile_5fformat_106',['KTX_UNKNOWN_FILE_FORMAT',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cadbeb98d59020ac018a4f697d068fff21',1,'ktx.h']]], + ['ktx_5funsupported_5ffeature_107',['KTX_UNSUPPORTED_FEATURE',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca04808a4c3abddb237d2a8cf903205496',1,'ktx.h']]], + ['ktx_5funsupported_5ftexture_5ftype_108',['KTX_UNSUPPORTED_TEXTURE_TYPE',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad3d82ba3467063bec92486a94a38d21d',1,'ktx.h']]], + ['ktx_5fwriter_5fkey_109',['KTX_WRITER_KEY',['../ktx_8h.html#aa23b5bdd596b2c6a6a2891a2ac48dc2c',1,'ktx.h']]], + ['ktx_5fwriter_5fscparams_5fkey_110',['KTX_WRITER_SCPARAMS_KEY',['../ktx_8h.html#a6a0fd67c05e916710effcf59ba36f44f',1,'ktx.h']]], + ['ktxastcparams_111',['ktxAstcParams',['../structktxAstcParams.html',1,'ktxAstcParams'],['../ktx_8h.html#a4b1f165e42ebf946fa91b7f35248a5a6',1,'ktxAstcParams: ktx.h']]], + ['ktxbasisparams_112',['ktxBasisParams',['../structktxBasisParams.html',1,'ktxBasisParams'],['../ktx_8h.html#aeb8baf7100f7a354c6f0fe99900cf179',1,'ktxBasisParams: ktx.h']]], + ['ktxbuimageflagsbitstring_113',['ktxBUImageFlagsBitString',['../strings_8c.html#aa9077e4635ae86d84ec8bcb025d6b373',1,'strings.c']]], + ['ktxerrorstring_114',['ktxErrorString',['../ktx_8h.html#a829eac221b33617c15a1b5a898a0771a',1,'ktxErrorString(KTX_error_code error): strings.c'],['../strings_8c.html#a252d7741a00562fbe2fd9d91d54d873b',1,'ktxErrorString(KTX_error_code error): strings.c']]], + ['ktxfilestream_5fconstruct_115',['ktxFileStream_construct',['../filestream_8c.html#a217a544c241e80216315a50883190519',1,'filestream.c']]], + ['ktxfilestream_5fdestruct_116',['ktxFileStream_destruct',['../filestream_8c.html#adc6cf29b8543378ffae60e6eaa77c7fc',1,'filestream.c']]], + ['ktxhashlist_117',['ktxHashList',['../classktxHashList.html',1,'']]], + ['ktxhashlist_5faddkvpair_118',['ktxHashList_AddKVPair',['../classktxHashList.html#ad013c9dd666f3b57e3b0a717e0186277',1,'ktxHashList']]], + ['ktxhashlist_5fconstruct_119',['ktxHashList_Construct',['../classktxHashList.html#aaab69a1ef86c52707d0a33dcba316c60',1,'ktxHashList']]], + ['ktxhashlist_5fconstructcopy_120',['ktxHashList_ConstructCopy',['../classktxHashList.html#a11f1a2ff9f574cd803803b77ec758966',1,'ktxHashList']]], + ['ktxhashlist_5fcreate_121',['ktxHashList_Create',['../classktxHashList.html#a13c991ecb452345d4ac2f9ca4ff71b80',1,'ktxHashList']]], + ['ktxhashlist_5fcreatecopy_122',['ktxHashList_CreateCopy',['../classktxHashList.html#a50f608b84f671b23849be13254cc511e',1,'ktxHashList']]], + ['ktxhashlist_5fdeleteentry_123',['ktxHashList_DeleteEntry',['../classktxHashList.html#a21e5f3318a192082258792f7f9d55400',1,'ktxHashList']]], + ['ktxhashlist_5fdeletekvpair_124',['ktxHashList_DeleteKVPair',['../classktxHashList.html#a71475476ba962532003472278dbe33a3',1,'ktxHashList']]], + ['ktxhashlist_5fdeserialize_125',['ktxHashList_Deserialize',['../classktxHashList.html#a3c05bb134c42ad852a4e68b6ebe057b1',1,'ktxHashList']]], + ['ktxhashlist_5fdestroy_126',['ktxHashList_Destroy',['../classktxHashList.html#aa84d4269b0efd2fb9fb2508a371fa0ca',1,'ktxHashList']]], + ['ktxhashlist_5fdestruct_127',['ktxHashList_Destruct',['../classktxHashList.html#a0e3349a7b71be7aaa4f8766fc8a0d437',1,'ktxHashList']]], + ['ktxhashlist_5ffindentry_128',['ktxHashList_FindEntry',['../classktxHashList.html#a2d5939ac234d292854de5afeb786b6ae',1,'ktxHashList']]], + ['ktxhashlist_5ffindvalue_129',['ktxHashList_FindValue',['../classktxHashList.html#ab3625f19223436b718d9267f0b9a663a',1,'ktxHashList']]], + ['ktxhashlist_5fnext_130',['ktxHashList_Next',['../classktxHashList.html#ad432c8d5ba733c69df496e7925e3a158',1,'ktxHashList']]], + ['ktxhashlist_5fserialize_131',['ktxHashList_Serialize',['../classktxHashList.html#a97ca46f361614d6cdfb59a42643f9fc2',1,'ktxHashList']]], + ['ktxhashlist_5fsort_132',['ktxHashList_Sort',['../classktxHashList.html#aee36331d742259c1bb3f42e2c82e38ba',1,'ktxHashList']]], + ['ktxhashlistentry_133',['ktxHashListEntry',['../classktxHashListEntry.html',1,'']]], + ['ktxhashlistentry_5fgetkey_134',['ktxHashListEntry_GetKey',['../classktxHashListEntry.html#aee9774ac793b8cc2c5955f0e88c13a2f',1,'ktxHashListEntry']]], + ['ktxhashlistentry_5fgetvalue_135',['ktxHashListEntry_GetValue',['../classktxHashListEntry.html#a96c136b6470dba9bf971a8a3f9719f5e',1,'ktxHashListEntry']]], + ['ktxloadopengl_136',['ktxLoadOpenGL',['../group__ktx__glloader.html#gada67f60796793d1ed9eb1f3f2d61d4a6',1,'ktxLoadOpenGL(PFNGLGETPROCADDRESS pfnGLGetProcAddress): gl_funcs.c'],['../group__ktx__glloader.html#gada67f60796793d1ed9eb1f3f2d61d4a6',1,'ktxLoadOpenGL(PFNGLGETPROCADDRESS pfnGLGetProcAddress): gl_funcs.c']]], + ['ktxmemstream_5fconstruct_137',['ktxMemStream_construct',['../memstream_8c.html#a899a1878ad93c797c8c2d9aacffc6365',1,'memstream.c']]], + ['ktxmemstream_5fconstruct_5fro_138',['ktxMemStream_construct_ro',['../memstream_8c.html#a3c0f816438f1e4412376b35fa66f9424',1,'memstream.c']]], + ['ktxmemstream_5fdestruct_139',['ktxMemStream_destruct',['../memstream_8c.html#a81f0db4b157134a8edf51c2936e853e4',1,'memstream.c']]], + ['ktxmemstream_5fgetdata_140',['ktxMemStream_getdata',['../memstream_8c.html#a3f9cc251a3604f80da67440efff21b6d',1,'memstream.c']]], + ['ktxmemstream_5fsetup_141',['ktxMemStream_setup',['../memstream_8c.html#a777303765bd7d021820c90ff6ad85afa',1,'memstream.c']]], + ['ktxorientation_142',['ktxOrientation',['../structktxOrientation.html',1,'']]], + ['ktxresult_143',['ktxResult',['../ktx_8h.html#a6ab3f7a528fbda067855818ac8d75c87',1,'ktx.h']]], + ['ktxstream_144',['ktxStream',['../structktxStream.html',1,'']]], + ['ktxstream_5fdestruct_145',['ktxStream_destruct',['../ktx_8h.html#ab703620f9a5c5911d6013debf72393d6',1,'ktx.h']]], + ['ktxstream_5fgetpos_146',['ktxStream_getpos',['../ktx_8h.html#a2eacbb95ed30f1e9ae81fd6d121fd16e',1,'ktx.h']]], + ['ktxstream_5fgetsize_147',['ktxStream_getsize',['../ktx_8h.html#a261dbe3b2c1ba0d35a1bf76ad9a98ba0',1,'ktx.h']]], + ['ktxstream_5fread_148',['ktxStream_read',['../ktx_8h.html#a6beb14c7c8e74de38847b6a5d9ebd171',1,'ktx.h']]], + ['ktxstream_5fsetpos_149',['ktxStream_setpos',['../ktx_8h.html#ae2022617df68fe4041c707e1693370d1',1,'ktx.h']]], + ['ktxstream_5fskip_150',['ktxStream_skip',['../ktx_8h.html#a0890fb8e1623b63c86883d50a0d841aa',1,'ktx.h']]], + ['ktxstream_5fwrite_151',['ktxStream_write',['../ktx_8h.html#a3d5d2a3a413c5e549dedc54873afc668',1,'ktx.h']]], + ['ktxsupercmpscheme_152',['ktxSupercmpScheme',['../ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daa',1,'ktxSupercmpScheme: ktx.h'],['../ktx_8h.html#a5edebc0f71559845a8620cf6b1bf65ca',1,'ktxSupercmpScheme: ktx.h']]], + ['ktxsupercompressionschemestring_153',['ktxSupercompressionSchemeString',['../ktx_8h.html#ad54399157902016600b0543ca027c61c',1,'ktxSupercompressionSchemeString(ktxSupercmpScheme scheme): strings.c'],['../strings_8c.html#a68c7368105d35f01b54573f22ecbe5fb',1,'ktxSupercompressionSchemeString(ktxSupercmpScheme scheme): strings.c']]], + ['ktxtexture_154',['ktxTexture',['../structktxTexture.html',1,'']]], + ['ktxtexture1_155',['ktxTexture1',['../structktxTexture1.html',1,'']]], + ['ktxtexture1_5fcreate_156',['ktxTexture1_Create',['../group__writer.html#ga9ad46bface6dab07a35579c0635877d3',1,'ktxTexture1']]], + ['ktxtexture1_5fcreatefrommemory_157',['ktxTexture1_CreateFromMemory',['../group__reader.html#ga1f289eb80601208b79561804d2ec0121',1,'ktxTexture1']]], + ['ktxtexture1_5fcreatefromnamedfile_158',['ktxTexture1_CreateFromNamedFile',['../group__reader.html#ga0319d9a33d3ea78da2ef786205f2a956',1,'ktxTexture1']]], + ['ktxtexture1_5fcreatefromstdiostream_159',['ktxTexture1_CreateFromStdioStream',['../group__reader.html#ga4557b9714b41e7c575d295b65e19ed12',1,'ktxTexture1']]], + ['ktxtexture1_5fcreatefromstream_160',['ktxTexture1_CreateFromStream',['../group__reader.html#ga2e9c9d8a1c02732c87db733d3449b337',1,'ktxTexture1']]], + ['ktxtexture1_5fdestroy_161',['ktxTexture1_Destroy',['../group__reader.html#gaa616363178ec37996459219a6925f87d',1,'ktxTexture1']]], + ['ktxtexture1_5fgetdatasizeuncompressed_162',['ktxTexture1_GetDataSizeUncompressed',['../group__reader.html#ga65cd751a3d1a6eed97cb19b7a88d736c',1,'ktxTexture1']]], + ['ktxtexture1_5fgetimageoffset_163',['ktxTexture1_GetImageOffset',['../group__reader.html#ga2c471eb79f1ac62d63cae86ca6c519bf',1,'ktxTexture1']]], + ['ktxtexture1_5fgetimagesize_164',['ktxTexture1_GetImageSize',['../group__reader.html#gac1dc0703bc613180a92a8e1c5901dd50',1,'ktxTexture1']]], + ['ktxtexture1_5fgetlevelsize_165',['ktxTexture1_GetLevelSize',['../group__reader.html#ga8a1bf5e13f88af082585a875e85dfdeb',1,'ktxTexture1']]], + ['ktxtexture1_5fgetvkformat_166',['ktxTexture1_GetVkFormat',['../group__ktx__vkloader.html#ga11fb504b749453140e04ca69711633d6',1,'ktxTexture1']]], + ['ktxtexture1_5fglupload_167',['ktxTexture1_GLUpload',['../group__ktx__glloader.html#ga058297b66c5a7fd1f1bbaf718a887b9f',1,'ktxTexture1']]], + ['ktxtexture1_5fiteratelevels_168',['ktxTexture1_IterateLevels',['../group__reader.html#ga400a2581bf935beb6c0192a6e9844914',1,'ktxTexture1']]], + ['ktxtexture1_5fiterateloadlevelfaces_169',['ktxTexture1_IterateLoadLevelFaces',['../group__reader.html#gab56e28f79781acf2933e36c21823c0df',1,'ktxTexture1']]], + ['ktxtexture1_5floadimagedata_170',['ktxTexture1_LoadImageData',['../group__reader.html#ga7334feb062f32b62159cebd6e4b28d16',1,'ktxTexture1']]], + ['ktxtexture1_5fsetimagefrommemory_171',['ktxTexture1_SetImageFromMemory',['../group__writer.html#gabeb1d5eb7ddcfd81405d5726a0b55ee6',1,'ktxTexture1']]], + ['ktxtexture1_5fsetimagefromstdiostream_172',['ktxTexture1_SetImageFromStdioStream',['../group__writer.html#ga9383755c2e02a9d1aa932e75c847829c',1,'ktxTexture1']]], + ['ktxtexture1_5fvkupload_173',['ktxTexture1_VkUpload',['../group__ktx__vkloader.html#gac70d24bac4ac3b2586836439bbc6592a',1,'ktxTexture1']]], + ['ktxtexture1_5fvkuploadex_174',['ktxTexture1_VkUploadEx',['../group__ktx__vkloader.html#gad7840c1eeb618fa1a09fc5a02c07ce87',1,'ktxTexture1']]], + ['ktxtexture1_5fvkuploadex_5fwithsuballocator_175',['ktxTexture1_VkUploadEx_WithSuballocator',['../group__ktx__vkloader.html#ga4166e5853362cf136f3efe0c527c4c6d',1,'ktxTexture1']]], + ['ktxtexture1_5fwritektx2tomemory_176',['ktxTexture1_WriteKTX2ToMemory',['../group__writer.html#gadbc6058afa50d4db3efd738822e6296a',1,'ktxTexture1']]], + ['ktxtexture1_5fwritektx2tonamedfile_177',['ktxTexture1_WriteKTX2ToNamedFile',['../group__writer.html#ga3009e876fb584268241a9ba7704e8557',1,'ktxTexture1']]], + ['ktxtexture1_5fwritektx2tostdiostream_178',['ktxTexture1_WriteKTX2ToStdioStream',['../group__writer.html#gac31b3532ed02d8cd4a7b517d4d2ab6ef',1,'ktxTexture1']]], + ['ktxtexture1_5fwritektx2tostream_179',['ktxTexture1_WriteKTX2ToStream',['../group__writer.html#gad0a6406fc9359abd5f6d9956a86ce90f',1,'ktxTexture1']]], + ['ktxtexture1_5fwritetomemory_180',['ktxTexture1_WriteToMemory',['../group__writer.html#ga21904a85ada4ee322b87c309566ea4d1',1,'ktxTexture1']]], + ['ktxtexture1_5fwritetonamedfile_181',['ktxTexture1_WriteToNamedFile',['../group__writer.html#gafe0d51799d92b69cdcbe30c98322340b',1,'ktxTexture1']]], + ['ktxtexture1_5fwritetostdiostream_182',['ktxTexture1_WriteToStdioStream',['../group__writer.html#ga924da3380253c85fffca8c956e00d5c0',1,'ktxTexture1']]], + ['ktxtexture1_5fwritetostream_183',['ktxTexture1_WriteToStream',['../group__writer.html#gac1780ac8315f0cab9893c121481c7453',1,'ktxTexture1']]], + ['ktxtexture2_184',['ktxTexture2',['../structktxTexture2.html',1,'']]], + ['ktxtexture2_5fcompressastc_185',['ktxTexture2_CompressAstc',['../group__writer.html#ga00b153dbfa1fe115c7d4322dbe07f172',1,'ktxTexture2']]], + ['ktxtexture2_5fcompressastcex_186',['ktxTexture2_CompressAstcEx',['../group__writer.html#gaf08421ae0893a9e9205d3e84fad66bd8',1,'ktxTexture2']]], + ['ktxtexture2_5fcompressbasis_187',['ktxTexture2_CompressBasis',['../group__writer.html#ga405c44d6daf8ddf83dc805810bf4f989',1,'ktxTexture2']]], + ['ktxtexture2_5fcompressbasisex_188',['ktxTexture2_CompressBasisEx',['../group__writer.html#ga0e75755e3cc69964e57363dad82ffd77',1,'ktxTexture2']]], + ['ktxtexture2_5fcreate_189',['ktxTexture2_Create',['../group__writer.html#gaa8e29216921eadd3c09c3a76bc286acd',1,'ktxTexture2']]], + ['ktxtexture2_5fcreatecopy_190',['ktxTexture2_CreateCopy',['../group__writer.html#ga5fcfdc3d237419ab65287639e1f4aeb1',1,'ktxTexture2']]], + ['ktxtexture2_5fcreatefrommemory_191',['ktxTexture2_CreateFromMemory',['../group__reader.html#ga6805a144f0bfd17b51d46fb28b0786a5',1,'ktxTexture2']]], + ['ktxtexture2_5fcreatefromnamedfile_192',['ktxTexture2_CreateFromNamedFile',['../group__reader.html#ga8680560274b31da6f3f07ee911055431',1,'ktxTexture2']]], + ['ktxtexture2_5fcreatefromstdiostream_193',['ktxTexture2_CreateFromStdioStream',['../group__reader.html#gae9de7e23ffe3ae3aeed4cc95c61699e4',1,'ktxTexture2']]], + ['ktxtexture2_5fcreatefromstream_194',['ktxTexture2_CreateFromStream',['../group__reader.html#ga1e865473d23f82fc22a16bb3eadf60ed',1,'ktxTexture2']]], + ['ktxtexture2_5fdecodeastc_195',['ktxTexture2_DecodeAstc',['../group__reader.html#gaea0edab86daca9c288d4cd6b47b34e28',1,'ktxTexture2_DecodeAstc(ktxTexture2 *This): astc_codec.cpp'],['../group__reader.html#gaea0edab86daca9c288d4cd6b47b34e28',1,'ktxTexture2_DecodeAstc(ktxTexture2 *This): astc_codec.cpp']]], + ['ktxtexture2_5fdeflatezlib_196',['ktxTexture2_DeflateZLIB',['../group__writer.html#gaafc3cf2c872ea75be7096b1fc70dfb2c',1,'ktxTexture2']]], + ['ktxtexture2_5fdeflatezstd_197',['ktxTexture2_DeflateZstd',['../group__writer.html#ga08d7222fbf845f25d883ed81c14c6430',1,'ktxTexture2']]], + ['ktxtexture2_5fdestroy_198',['ktxTexture2_Destroy',['../group__reader.html#ga01ec49abe73b77f2f8db99b5d9cf46d9',1,'ktxTexture2']]], + ['ktxtexture2_5fgetcolormodel_5fe_199',['ktxTexture2_GetColorModel_e',['../group__reader.html#ga7200d548b480a3abb69c206f530c0669',1,'ktxTexture2']]], + ['ktxtexture2_5fgetcomponentinfo_200',['ktxTexture2_GetComponentInfo',['../group__reader.html#gad3aab08fa013c602fc055964e78c7566',1,'ktxTexture2']]], + ['ktxtexture2_5fgetdatasizeuncompressed_201',['ktxTexture2_GetDataSizeUncompressed',['../group__reader.html#gaefcaf84425830ba095eb670a275dad34',1,'ktxTexture2']]], + ['ktxtexture2_5fgetimageoffset_202',['ktxTexture2_GetImageOffset',['../group__reader.html#gab29978f318436c009ae45b7d3c515f8e',1,'ktxTexture2']]], + ['ktxtexture2_5fgetimagesize_203',['ktxTexture2_GetImageSize',['../group__reader.html#gaa4b800f418f57b10737ac6533f1769d2',1,'ktxTexture2']]], + ['ktxtexture2_5fgetlevelsize_204',['ktxTexture2_GetLevelSize',['../group__reader.html#gac344745350aff9cf5bcc2969729b7f0e',1,'ktxTexture2']]], + ['ktxtexture2_5fgetnumcomponents_205',['ktxTexture2_GetNumComponents',['../group__reader.html#gacc7762adb6ff311ca65cfe5ed89db21e',1,'ktxTexture2']]], + ['ktxtexture2_5fgetoetf_206',['ktxTexture2_GetOETF',['../group__reader.html#gac1b0eccd69f541450ed88da2ad260dcc',1,'ktxTexture2']]], + ['ktxtexture2_5fgetoetf_5fe_207',['ktxTexture2_GetOETF_e',['../group__reader.html#gaddf6746c18d970a238e89bb9b8e13e77',1,'ktxTexture2']]], + ['ktxtexture2_5fgetpremultipliedalpha_208',['ktxTexture2_GetPremultipliedAlpha',['../group__reader.html#gab773b3ad45bacb6f487b62c4b0a07fcf',1,'ktxTexture2']]], + ['ktxtexture2_5fgetprimaries_5fe_209',['ktxTexture2_GetPrimaries_e',['../group__reader.html#gac7323c6f9fe75f442484392506b2024b',1,'ktxTexture2']]], + ['ktxtexture2_5fgettransferfunction_5fe_210',['ktxTexture2_GetTransferFunction_e',['../group__reader.html#ga37cd5b4ae9ee373d825197dc8998d0bb',1,'ktxTexture2']]], + ['ktxtexture2_5fgetvkformat_211',['ktxTexture2_GetVkFormat',['../group__ktx__vkloader.html#ga7a9baaf3aa2e114c6f6e58fe68051815',1,'ktxTexture2']]], + ['ktxtexture2_5fglupload_212',['ktxTexture2_GLUpload',['../group__ktx__glloader.html#ga7624860df8e44573862fa5754ea2976c',1,'ktxTexture2']]], + ['ktxtexture2_5fiteratelevels_213',['ktxTexture2_IterateLevels',['../group__reader.html#ga1b47270a151b67615aed9eeca5f25bf7',1,'ktxTexture2']]], + ['ktxtexture2_5fiterateloadlevelfaces_214',['ktxTexture2_IterateLoadLevelFaces',['../group__reader.html#gaf57628ec7f9a554b46ba84ab9c214bab',1,'ktxTexture2']]], + ['ktxtexture2_5floaddeflatedimagedata_215',['ktxTexture2_LoadDeflatedImageData',['../group__reader.html#gaa1f681c144baa70ef9af6db4c7333b3c',1,'ktxTexture2']]], + ['ktxtexture2_5floadimagedata_216',['ktxTexture2_LoadImageData',['../group__reader.html#ga032b7f1926861c8b40655527b84f5533',1,'ktxTexture2']]], + ['ktxtexture2_5fneedstranscoding_217',['ktxTexture2_NeedsTranscoding',['../group__reader.html#gade1ffc5d31c2f9b5f1e861b59e7619ce',1,'ktxTexture2']]], + ['ktxtexture2_5fsetimagefrommemory_218',['ktxTexture2_SetImageFromMemory',['../group__writer.html#ga01b13c38300016ce36c5b97bf4957d48',1,'ktxTexture2']]], + ['ktxtexture2_5fsetimagefromstdiostream_219',['ktxTexture2_SetImageFromStdioStream',['../group__writer.html#ga50a5ecf22586b26977da62cf19a78518',1,'ktxTexture2']]], + ['ktxtexture2_5fsetoetf_220',['ktxTexture2_SetOETF',['../group__writer.html#ga9894284fd16fed4697505353043bbeae',1,'ktxTexture2']]], + ['ktxtexture2_5fsetprimaries_221',['ktxTexture2_SetPrimaries',['../group__writer.html#gaa623fd7f433e3827a52cdb499f9162f9',1,'ktxTexture2']]], + ['ktxtexture2_5ftranscodebasis_222',['ktxTexture2_TranscodeBasis',['../group__reader.html#ga90cc33928a2dae962fb94b3fa2f6575d',1,'ktxTexture2']]], + ['ktxtexture2_5fvkupload_223',['ktxTexture2_VkUpload',['../group__ktx__vkloader.html#gadf0fba44f518b61acd5d0ae86225ddee',1,'ktxTexture2']]], + ['ktxtexture2_5fvkuploadex_224',['ktxTexture2_VkUploadEx',['../group__ktx__vkloader.html#ga265926439e3f9502f248684238e5cc48',1,'ktxTexture2']]], + ['ktxtexture2_5fvkuploadex_5fwithsuballocator_225',['ktxTexture2_VkUploadEx_WithSuballocator',['../group__ktx__vkloader.html#gacb13edcb651f0a8fb26dab9594ef7dc7',1,'ktxTexture2']]], + ['ktxtexture2_5fwritetomemory_226',['ktxTexture2_WriteToMemory',['../group__writer.html#ga0113194b669b789a22d85b7ad992f117',1,'ktxTexture2']]], + ['ktxtexture2_5fwritetonamedfile_227',['ktxTexture2_WriteToNamedFile',['../group__writer.html#ga745cee3857ade59e612c533d6faa8e2a',1,'ktxTexture2']]], + ['ktxtexture2_5fwritetostdiostream_228',['ktxTexture2_WriteToStdioStream',['../group__writer.html#gadf2c2542471b7a94636216807cedd819',1,'ktxTexture2']]], + ['ktxtexture2_5fwritetostream_229',['ktxTexture2_WriteToStream',['../group__writer.html#gacb722c7d0c1df7e6e3b4caa78ae729cf',1,'ktxTexture2']]], + ['ktxtexture_5fcreatefrommemory_230',['ktxTexture_CreateFromMemory',['../group__reader.html#gaf1e401967a687b40cdf7bba11e72c2b4',1,'ktxTexture']]], + ['ktxtexture_5fcreatefromnamedfile_231',['ktxTexture_CreateFromNamedFile',['../group__reader.html#ga57a1ce0d3f2d66439463160d6ce9d2d0',1,'ktxTexture']]], + ['ktxtexture_5fcreatefromstdiostream_232',['ktxTexture_CreateFromStdioStream',['../group__reader.html#ga180d93562cc6af30c61adf8f6a8fd827',1,'ktxTexture']]], + ['ktxtexture_5fcreatefromstream_233',['ktxTexture_CreateFromStream',['../group__reader.html#gaa8dfc7a981b69d26eab73c5405d7182b',1,'ktxTexture']]], + ['ktxtexture_5fdestroy_234',['ktxTexture_Destroy',['../ktx_8h.html#a0becd37ccf729eed8723b969bb93df3d',1,'ktx.h']]], + ['ktxtexture_5fgetdata_235',['ktxTexture_GetData',['../group__reader.html#gace44d98fa78b94c282016e7cf8a88b7e',1,'ktxTexture']]], + ['ktxtexture_5fgetdatasize_236',['ktxTexture_GetDataSize',['../group__reader.html#ga553c3438e75628c6d7e2280989e539c4',1,'ktxTexture']]], + ['ktxtexture_5fgetdatasizeuncompressed_237',['ktxTexture_GetDataSizeUncompressed',['../ktx_8h.html#a920a40b531d615e674d797fe87d87e09',1,'ktx.h']]], + ['ktxtexture_5fgetelementsize_238',['ktxTexture_GetElementSize',['../group__reader.html#ga19d8786eea0e62ab55d945bff838d32c',1,'ktxTexture']]], + ['ktxtexture_5fgetimageoffset_239',['ktxTexture_GetImageOffset',['../ktx_8h.html#afdb41471bee56cef8241060de72d6735',1,'ktx.h']]], + ['ktxtexture_5fgetimagesize_240',['ktxTexture_GetImageSize',['../ktx_8h.html#a56402340391b57f18d8c18e477e97280',1,'ktx.h']]], + ['ktxtexture_5fgetlevelsize_241',['ktxTexture_GetLevelSize',['../ktx_8h.html#a850617576a50a67b6c21d8c8ce1158be',1,'ktx.h']]], + ['ktxtexture_5fgetrowpitch_242',['ktxTexture_GetRowPitch',['../group__reader.html#gacf9e393ff766982ccb79ad915975971f',1,'ktxTexture']]], + ['ktxtexture_5fgetvkformat_243',['ktxTexture_GetVkFormat',['../group__ktx__vkloader.html#ga3ef2792fb0cd184636180ae0a540b872',1,'ktxTexture']]], + ['ktxtexture_5fglupload_244',['ktxTexture_GLUpload',['../group__ktx__glloader.html#ga516367e94731f99a23a83fb029e9a441',1,'ktxTexture']]], + ['ktxtexture_5fiteratelevelfaces_245',['ktxTexture_IterateLevelFaces',['../group__reader.html#gae7c4b8bbe26379f2076f93050c0673c1',1,'ktxTexture']]], + ['ktxtexture_5fiteratelevels_246',['ktxTexture_IterateLevels',['../ktx_8h.html#a7ca1ab524f2161c1facbb716f4cfab00',1,'ktx.h']]], + ['ktxtexture_5fiterateloadlevelfaces_247',['ktxTexture_IterateLoadLevelFaces',['../ktx_8h.html#ae5fd56d78ae250ac5f7511d8041ec514',1,'ktx.h']]], + ['ktxtexture_5floadimagedata_248',['ktxTexture_LoadImageData',['../ktx_8h.html#a1410163f284e12d74ef942dd9d48c3cf',1,'ktx.h']]], + ['ktxtexture_5fneedstranscoding_249',['ktxTexture_NeedsTranscoding',['../ktx_8h.html#a294c8d220fbff767174f192fb410a621',1,'ktx.h']]], + ['ktxtexture_5fsetimagefrommemory_250',['ktxTexture_SetImageFromMemory',['../ktx_8h.html#a11077712b020a97507c1e22a4c9c45b6',1,'ktx.h']]], + ['ktxtexture_5fsetimagefromstdiostream_251',['ktxTexture_SetImageFromStdioStream',['../ktx_8h.html#a4213a77d1c0ef016e0ee60463a8044be',1,'ktx.h']]], + ['ktxtexture_5fvkupload_252',['ktxTexture_VkUpload',['../group__ktx__vkloader.html#ga377a4a2c177956ea661549ee502d60da',1,'ktxTexture']]], + ['ktxtexture_5fvkuploadex_253',['ktxTexture_VkUploadEx',['../group__ktx__vkloader.html#ga153164adbd7307ad1844c3e117faa325',1,'ktxTexture']]], + ['ktxtexture_5fvkuploadex_5fwithsuballocator_254',['ktxTexture_VkUploadEx_WithSuballocator',['../group__ktx__vkloader.html#ga8d9b0820e70dd0239b2c1bdc0a7713f7',1,'ktxTexture']]], + ['ktxtexture_5fvtbl_255',['ktxTexture_vtbl',['../structktxTexture__vtbl.html',1,'']]], + ['ktxtexture_5fwritetomemory_256',['ktxTexture_WriteToMemory',['../ktx_8h.html#a0eeccd38a1ec981cd3d2a1b98f4ff639',1,'ktx.h']]], + ['ktxtexture_5fwritetonamedfile_257',['ktxTexture_WriteToNamedFile',['../ktx_8h.html#a5a338703d7be18ef6cc97a83d5fad8fe',1,'ktx.h']]], + ['ktxtexture_5fwritetostdiostream_258',['ktxTexture_WriteToStdioStream',['../ktx_8h.html#a26698d6f4c0deee564b330040213de72',1,'ktx.h']]], + ['ktxtexture_5fwritetostream_259',['ktxTexture_WriteToStream',['../ktx_8h.html#a8dc8bad175207b3431d409abadd251d3',1,'ktx.h']]], + ['ktxtexturecreateflagbits_260',['ktxTextureCreateFlagBits',['../structktxTexture.html#ac184edbb9898b55efbbd80f635946545',1,'ktxTexture']]], + ['ktxtexturecreateflags_261',['ktxTextureCreateFlags',['../structktxTexture.html#a1cce9de12eb3974a236becfd098bd057',1,'ktxTexture']]], + ['ktxtexturecreateinfo_262',['ktxTextureCreateInfo',['../structktxTextureCreateInfo.html',1,'']]], + ['ktxtexturecreatestorageenum_263',['ktxTextureCreateStorageEnum',['../structktxTexture.html#af0602c48f60fc85c4d59c1c58f624a2b',1,'ktxTexture']]], + ['ktxtranscodeformatstring_264',['ktxTranscodeFormatString',['../ktx_8h.html#ac86f20d7858aaacef77f7eee15983470',1,'ktxTranscodeFormatString(ktx_transcode_fmt_e format): strings.c'],['../strings_8c.html#a25b70a70161c149687d0ca19fc839b81',1,'ktxTranscodeFormatString(ktx_transcode_fmt_e format): strings.c']]], + ['ktxvulkandeviceinfo_265',['ktxVulkanDeviceInfo',['../structktxVulkanDeviceInfo.html',1,'']]], + ['ktxvulkandeviceinfo_5fconstruct_266',['ktxVulkanDeviceInfo_Construct',['../group__ktx__vkloader.html#ga4bc9f0fa9af93d588276f54fe9a6ba50',1,'ktxVulkanDeviceInfo']]], + ['ktxvulkandeviceinfo_5fconstructex_267',['ktxVulkanDeviceInfo_ConstructEx',['../group__ktx__vkloader.html#ga3c9d5bc5ac1d0e237ae62fd94c148764',1,'ktxVulkanDeviceInfo']]], + ['ktxvulkandeviceinfo_5fcreate_268',['ktxVulkanDeviceInfo_Create',['../group__ktx__vkloader.html#ga82ac7e21e884652c519d9fe28ad5428c',1,'ktxVulkanDeviceInfo']]], + ['ktxvulkandeviceinfo_5fcreateex_269',['ktxVulkanDeviceInfo_CreateEx',['../group__ktx__vkloader.html#ga5137c2d7e23be51160048b3253abad3c',1,'ktxVulkanDeviceInfo']]], + ['ktxvulkandeviceinfo_5fdestroy_270',['ktxVulkanDeviceInfo_Destroy',['../group__ktx__vkloader.html#gaaf633943fbf201fb620c0270c6150fa8',1,'ktxVulkanDeviceInfo']]], + ['ktxvulkandeviceinfo_5fdestruct_271',['ktxVulkanDeviceInfo_Destruct',['../group__ktx__vkloader.html#gae58928740420d1ed3f96fd4b0f2d897e',1,'ktxVulkanDeviceInfo']]], + ['ktxvulkanfunctions_272',['ktxVulkanFunctions',['../structktxVulkanFunctions.html',1,'']]], + ['ktxvulkantexture_273',['ktxVulkanTexture',['../structktxVulkanTexture.html',1,'']]], + ['ktxvulkantexture_5fdestruct_274',['ktxVulkanTexture_Destruct',['../group__ktx__vkloader.html#gaf620a84f6bc59bff03b521e55a654f19',1,'ktxVulkanTexture']]], + ['ktxvulkantexture_5fdestruct_5fwithsuballocator_275',['ktxVulkanTexture_Destruct_WithSuballocator',['../group__ktx__vkloader.html#ga5a783db9431738b9b18b9fc585183490',1,'ktxVulkanTexture']]], + ['ktxvulkantexture_5fsuballocatorcallbacks_276',['ktxVulkanTexture_subAllocatorCallbacks',['../structktxVulkanTexture__subAllocatorCallbacks.html',1,'']]], + ['kvdata_277',['kvData',['../structktxTexture.html#ae09811d6bd833f1a7c94db9e4538ebd7',1,'ktxTexture']]], + ['kvdatahead_278',['kvDataHead',['../structktxTexture.html#a57141753cd2eb0967c9c071d853c5d32',1,'ktxTexture']]], + ['kvdatalen_279',['kvDataLen',['../structktxTexture.html#a3d83b122c5c492f77abe25fc59541986',1,'ktxTexture']]] +]; diff --git a/ktx/build/docs/html/libktx/search/classes_0.js b/ktx/build/docs/html/libktx/search/classes_0.js new file mode 100644 index 0000000..2156303 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/classes_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['ktxastcparams_0',['ktxAstcParams',['../structktxAstcParams.html',1,'']]], + ['ktxbasisparams_1',['ktxBasisParams',['../structktxBasisParams.html',1,'']]], + ['ktxhashlist_2',['ktxHashList',['../classktxHashList.html',1,'']]], + ['ktxhashlistentry_3',['ktxHashListEntry',['../classktxHashListEntry.html',1,'']]], + ['ktxorientation_4',['ktxOrientation',['../structktxOrientation.html',1,'']]], + ['ktxstream_5',['ktxStream',['../structktxStream.html',1,'']]], + ['ktxtexture_6',['ktxTexture',['../structktxTexture.html',1,'']]], + ['ktxtexture1_7',['ktxTexture1',['../structktxTexture1.html',1,'']]], + ['ktxtexture2_8',['ktxTexture2',['../structktxTexture2.html',1,'']]], + ['ktxtexture_5fvtbl_9',['ktxTexture_vtbl',['../structktxTexture__vtbl.html',1,'']]], + ['ktxtexturecreateinfo_10',['ktxTextureCreateInfo',['../structktxTextureCreateInfo.html',1,'']]], + ['ktxvulkandeviceinfo_11',['ktxVulkanDeviceInfo',['../structktxVulkanDeviceInfo.html',1,'']]], + ['ktxvulkanfunctions_12',['ktxVulkanFunctions',['../structktxVulkanFunctions.html',1,'']]], + ['ktxvulkantexture_13',['ktxVulkanTexture',['../structktxVulkanTexture.html',1,'']]], + ['ktxvulkantexture_5fsuballocatorcallbacks_14',['ktxVulkanTexture_subAllocatorCallbacks',['../structktxVulkanTexture__subAllocatorCallbacks.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/defines_0.js b/ktx/build/docs/html/libktx/search/defines_0.js new file mode 100644 index 0000000..81a00bd --- /dev/null +++ b/ktx/build/docs/html/libktx/search/defines_0.js @@ -0,0 +1,29 @@ +var searchData= +[ + ['ktx_5fanimdata_5fkey_0',['KTX_ANIMDATA_KEY',['../ktx_8h.html#a8c260cc2a9b8d4ee63ccc36810779f84',1,'ktx.h']]], + ['ktx_5ferror_5fcode_1',['KTX_error_code',['../ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa',1,'ktx.h']]], + ['ktx_5fgl_5funpack_5falignment_2',['KTX_GL_UNPACK_ALIGNMENT',['../ktx_8h.html#ad5dd0ebf8aaef8c150603bd95d61b94a',1,'ktx.h']]], + ['ktx_5fmem_5fdefault_5fallocated_5fsize_3',['KTX_MEM_DEFAULT_ALLOCATED_SIZE',['../memstream_8c.html#ad9d0c31ff64d0512e98e0b6991051b62',1,'memstream.c']]], + ['ktx_5forientation1_5ffmt_4',['KTX_ORIENTATION1_FMT',['../ktx_8h.html#a9b4e1997eff4e29930d5aca784483d57',1,'ktx.h']]], + ['ktx_5forientation2_5ffmt_5',['KTX_ORIENTATION2_FMT',['../ktx_8h.html#ad235113b0090e64ad23a0cf7097e1b7a',1,'ktx.h']]], + ['ktx_5forientation3_5ffmt_6',['KTX_ORIENTATION3_FMT',['../ktx_8h.html#ae34c19ed0ef799a902fa50dc3a0bbb20',1,'ktx.h']]], + ['ktx_5forientation_5fkey_7',['KTX_ORIENTATION_KEY',['../ktx_8h.html#a7eebf850576083e740cf1f418eed39a0',1,'ktx.h']]], + ['ktx_5fswizzle_5fkey_8',['KTX_SWIZZLE_KEY',['../ktx_8h.html#a526ee1e695723619c057875af35c93d6',1,'ktx.h']]], + ['ktx_5fwriter_5fkey_9',['KTX_WRITER_KEY',['../ktx_8h.html#aa23b5bdd596b2c6a6a2891a2ac48dc2c',1,'ktx.h']]], + ['ktx_5fwriter_5fscparams_5fkey_10',['KTX_WRITER_SCPARAMS_KEY',['../ktx_8h.html#a6a0fd67c05e916710effcf59ba36f44f',1,'ktx.h']]], + ['ktxtexture_5fdestroy_11',['ktxTexture_Destroy',['../ktx_8h.html#a0becd37ccf729eed8723b969bb93df3d',1,'ktx.h']]], + ['ktxtexture_5fgetdatasizeuncompressed_12',['ktxTexture_GetDataSizeUncompressed',['../ktx_8h.html#a920a40b531d615e674d797fe87d87e09',1,'ktx.h']]], + ['ktxtexture_5fgetimageoffset_13',['ktxTexture_GetImageOffset',['../ktx_8h.html#afdb41471bee56cef8241060de72d6735',1,'ktx.h']]], + ['ktxtexture_5fgetimagesize_14',['ktxTexture_GetImageSize',['../ktx_8h.html#a56402340391b57f18d8c18e477e97280',1,'ktx.h']]], + ['ktxtexture_5fgetlevelsize_15',['ktxTexture_GetLevelSize',['../ktx_8h.html#a850617576a50a67b6c21d8c8ce1158be',1,'ktx.h']]], + ['ktxtexture_5fiteratelevels_16',['ktxTexture_IterateLevels',['../ktx_8h.html#a7ca1ab524f2161c1facbb716f4cfab00',1,'ktx.h']]], + ['ktxtexture_5fiterateloadlevelfaces_17',['ktxTexture_IterateLoadLevelFaces',['../ktx_8h.html#ae5fd56d78ae250ac5f7511d8041ec514',1,'ktx.h']]], + ['ktxtexture_5floadimagedata_18',['ktxTexture_LoadImageData',['../ktx_8h.html#a1410163f284e12d74ef942dd9d48c3cf',1,'ktx.h']]], + ['ktxtexture_5fneedstranscoding_19',['ktxTexture_NeedsTranscoding',['../ktx_8h.html#a294c8d220fbff767174f192fb410a621',1,'ktx.h']]], + ['ktxtexture_5fsetimagefrommemory_20',['ktxTexture_SetImageFromMemory',['../ktx_8h.html#a11077712b020a97507c1e22a4c9c45b6',1,'ktx.h']]], + ['ktxtexture_5fsetimagefromstdiostream_21',['ktxTexture_SetImageFromStdioStream',['../ktx_8h.html#a4213a77d1c0ef016e0ee60463a8044be',1,'ktx.h']]], + ['ktxtexture_5fwritetomemory_22',['ktxTexture_WriteToMemory',['../ktx_8h.html#a0eeccd38a1ec981cd3d2a1b98f4ff639',1,'ktx.h']]], + ['ktxtexture_5fwritetonamedfile_23',['ktxTexture_WriteToNamedFile',['../ktx_8h.html#a5a338703d7be18ef6cc97a83d5fad8fe',1,'ktx.h']]], + ['ktxtexture_5fwritetostdiostream_24',['ktxTexture_WriteToStdioStream',['../ktx_8h.html#a26698d6f4c0deee564b330040213de72',1,'ktx.h']]], + ['ktxtexture_5fwritetostream_25',['ktxTexture_WriteToStream',['../ktx_8h.html#a8dc8bad175207b3431d409abadd251d3',1,'ktx.h']]] +]; diff --git a/ktx/build/docs/html/libktx/search/enums_0.js b/ktx/build/docs/html/libktx/search/enums_0.js new file mode 100644 index 0000000..e48b36c --- /dev/null +++ b/ktx/build/docs/html/libktx/search/enums_0.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['ktx_5ferror_5fcode_5fe_0',['ktx_error_code_e',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116c',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fblock_5fdimension_5fe_1',['ktx_pack_astc_block_dimension_e',['../ktx_8h.html#a1873d492a1b1fc5fd3296192fce3e9d5',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fencoder_5fmode_5fe_2',['ktx_pack_astc_encoder_mode_e',['../ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevels_5fe_3',['ktx_pack_astc_quality_levels_e',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5fflag_5fbits_5fe_4',['ktx_pack_uastc_flag_bits_e',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670',1,'ktx.h']]], + ['ktx_5ftranscode_5fflag_5fbits_5fe_5',['ktx_transcode_flag_bits_e',['../ktx_8h.html#ab2288718afab080ff86e9d3250180fb6',1,'ktx.h']]], + ['ktx_5ftranscode_5ffmt_5fe_6',['ktx_transcode_fmt_e',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5',1,'ktx.h']]], + ['ktxsupercmpscheme_7',['ktxSupercmpScheme',['../ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daa',1,'ktx.h']]], + ['ktxtexturecreateflagbits_8',['ktxTextureCreateFlagBits',['../structktxTexture.html#ac184edbb9898b55efbbd80f635946545',1,'ktxTexture']]], + ['ktxtexturecreatestorageenum_9',['ktxTextureCreateStorageEnum',['../structktxTexture.html#af0602c48f60fc85c4d59c1c58f624a2b',1,'ktxTexture']]] +]; diff --git a/ktx/build/docs/html/libktx/search/enumvalues_0.js b/ktx/build/docs/html/libktx/search/enumvalues_0.js new file mode 100644 index 0000000..29eea16 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/enumvalues_0.js @@ -0,0 +1,91 @@ +var searchData= +[ + ['ktx_5fdecompress_5fchecksum_5ferror_0',['KTX_DECOMPRESS_CHECKSUM_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca349391a68adb9c8c4a71dd50d6e96745',1,'ktx.h']]], + ['ktx_5fdecompress_5flength_5ferror_1',['KTX_DECOMPRESS_LENGTH_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca37dce54f5aefa409567d7c08e36d1d83',1,'ktx.h']]], + ['ktx_5ferror_5fmax_5fenum_2',['KTX_ERROR_MAX_ENUM',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cabb7ad088582cd16709a27679312363ae',1,'ktx.h']]], + ['ktx_5ffile_5fdata_5ferror_3',['KTX_FILE_DATA_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca0a3b899c794df326ebcea8dd3a679c14',1,'ktx.h']]], + ['ktx_5ffile_5fispipe_4',['KTX_FILE_ISPIPE',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca2570f4138cacf052d6ff892931507851',1,'ktx.h']]], + ['ktx_5ffile_5fopen_5ffailed_5',['KTX_FILE_OPEN_FAILED',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cac8f2bb08408001aad4941fc7b3f45558',1,'ktx.h']]], + ['ktx_5ffile_5foverflow_6',['KTX_FILE_OVERFLOW',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf1c77ba0fee3c65d49a334bec949c8a6',1,'ktx.h']]], + ['ktx_5ffile_5fread_5ferror_7',['KTX_FILE_READ_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca1559258b3bd0f47eef28fd4839074452',1,'ktx.h']]], + ['ktx_5ffile_5fseek_5ferror_8',['KTX_FILE_SEEK_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cae5983275cc1d3d3480c5cf1275723cf1',1,'ktx.h']]], + ['ktx_5ffile_5funexpected_5feof_9',['KTX_FILE_UNEXPECTED_EOF',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cab6d2090e851d9757ce32c05ec807ba4d',1,'ktx.h']]], + ['ktx_5ffile_5fwrite_5ferror_10',['KTX_FILE_WRITE_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca85733279b7d3e00ad9a6d498d6686645',1,'ktx.h']]], + ['ktx_5fgl_5ferror_11',['KTX_GL_ERROR',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf',1,'ktx.h']]], + ['ktx_5finvalid_5foperation_12',['KTX_INVALID_OPERATION',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a',1,'ktx.h']]], + ['ktx_5finvalid_5fvalue_13',['KTX_INVALID_VALUE',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca7da41bb3195d6cc93a513ac18bc91e4f',1,'ktx.h']]], + ['ktx_5flibrary_5fnot_5flinked_14',['KTX_LIBRARY_NOT_LINKED',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caac88f0051f9b5c217f3f53128e6960ef',1,'ktx.h']]], + ['ktx_5fnot_5ffound_15',['KTX_NOT_FOUND',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cac9008e8d20f60f4fb67d735f287be470',1,'ktx.h']]], + ['ktx_5fout_5fof_5fmemory_16',['KTX_OUT_OF_MEMORY',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca87728a1745ea6333b6fbe041c03036f2',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fblock_5fdimension_5fmax_17',['KTX_PACK_ASTC_BLOCK_DIMENSION_MAX',['../ktx_8h.html#a1873d492a1b1fc5fd3296192fce3e9d5a8a0a5ff023478a7951bf6cef24987558',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fencoder_5fmode_5fdefault_18',['KTX_PACK_ASTC_ENCODER_MODE_DEFAULT',['../ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6af943cccff0ab1790f5ff14ca250d7f65',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fencoder_5fmode_5fhdr_19',['KTX_PACK_ASTC_ENCODER_MODE_HDR',['../ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6a02edf562ddcc85e6fdefb9b8304ef7ec',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fencoder_5fmode_5fldr_20',['KTX_PACK_ASTC_ENCODER_MODE_LDR',['../ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6a6971976df75bdc5aa7099b59ad345361',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fencoder_5fmode_5fmax_21',['KTX_PACK_ASTC_ENCODER_MODE_MAX',['../ktx_8h.html#ad9ebeed57afd9e14b6d857011cff38d6a123569090bcb7d44f26d40e365fc821a',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevel_5fexhaustive_22',['KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9af195805d16e6875f46da8dc875b753c5',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevel_5ffast_23',['KTX_PACK_ASTC_QUALITY_LEVEL_FAST',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9aae959532601276e8e112d2cc0ae42324',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevel_5ffastest_24',['KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9a8f9546d69b84dad39f540d465c00fe2f',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevel_5fmax_25',['KTX_PACK_ASTC_QUALITY_LEVEL_MAX',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9a3f3681d3e1feb7fb6707a5b3aa1366b1',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevel_5fmedium_26',['KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9a17832137be7a8ff0b839fd41e1abb923',1,'ktx.h']]], + ['ktx_5fpack_5fastc_5fquality_5flevel_5fthorough_27',['KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH',['../ktx_8h.html#a8f70163f537a794c472479bc5c1905e9aeaf5ea197d3c6f3f2b8ee70809ac60f7',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5f_5fetc1_5fdisable_5fflip_5fand_5findividual_28',['KTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670ac0f60c4fb9a32fd8101eeda8a699fa0e',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5fetc1_5ffaster_5fhints_29',['KTX_PACK_UASTC_ETC1_FASTER_HINTS',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670ae3abc0e230dfe7395d80ae5216f0820d',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5fetc1_5ffastest_5fhints_30',['KTX_PACK_UASTC_ETC1_FASTEST_HINTS',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670ac8356ccb10a6259c5483181e9158f191',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5ffavor_5fbc7_5ferror_31',['KTX_PACK_UASTC_FAVOR_BC7_ERROR',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a2aa07cb9f618a10440c7fc0c1838d83d',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5ffavor_5fuastc_5ferror_32',['KTX_PACK_UASTC_FAVOR_UASTC_ERROR',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a9b456a870a596abbc95d946c1c1e681c',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5flevel_5fdefault_33',['KTX_PACK_UASTC_LEVEL_DEFAULT',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a3a4df853d3a689ccde076618d013d642',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5flevel_5ffaster_34',['KTX_PACK_UASTC_LEVEL_FASTER',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a81acf28386d4eb6f184c850254d87f6f',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5flevel_5ffastest_35',['KTX_PACK_UASTC_LEVEL_FASTEST',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a2f97075bb6e51728f82d0d51c16acc1c',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5flevel_5fmask_36',['KTX_PACK_UASTC_LEVEL_MASK',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670abccd25d5ac984dab93df3b711712c778',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5flevel_5fslower_37',['KTX_PACK_UASTC_LEVEL_SLOWER',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a9ac3a05c6fe72efd3a61cbdd0b244699',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5flevel_5fveryslow_38',['KTX_PACK_UASTC_LEVEL_VERYSLOW',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a375bd5a1c645198196a4b536de67f276',1,'ktx.h']]], + ['ktx_5fpack_5fuastc_5fmax_5flevel_39',['KTX_PACK_UASTC_MAX_LEVEL',['../ktx_8h.html#a9cb85e48ab10ea04747de7ef12087670a6ee376eeb5c1b736fb5f71025b332375',1,'ktx.h']]], + ['ktx_5fss_5fbasis_5flz_40',['KTX_SS_BASIS_LZ',['../ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaaf66da31ed897385538dab6c591e5bf5c',1,'ktx.h']]], + ['ktx_5fss_5fnone_41',['KTX_SS_NONE',['../ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaa9559585b30aa7fe5d510753ceae6fcc6',1,'ktx.h']]], + ['ktx_5fss_5fzlib_42',['KTX_SS_ZLIB',['../ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaa01c22adc03102420ef016d614cb5e0f5',1,'ktx.h']]], + ['ktx_5fss_5fzstd_43',['KTX_SS_ZSTD',['../ktx_8h.html#a011cf6c6de4e1acd2307ec7d24ee5daaa29f7da526697257766534b667fd706ef',1,'ktx.h']]], + ['ktx_5fsuccess_44',['KTX_SUCCESS',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98',1,'ktx.h']]], + ['ktx_5ftexture_5fcreate_5falloc_5fstorage_45',['KTX_TEXTURE_CREATE_ALLOC_STORAGE',['../ktx_8h.html#a2ab4b656d36abc318aed17a5f73c505c',1,'ktx.h']]], + ['ktx_5ftexture_5fcreate_5fcheck_5fgltf_5fbasisu_5fbit_46',['KTX_TEXTURE_CREATE_CHECK_GLTF_BASISU_BIT',['../ktx_8h.html#aa89ab54b6393de2a3b73838197f321a4',1,'ktx.h']]], + ['ktx_5ftexture_5fcreate_5fload_5fimage_5fdata_5fbit_47',['KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT',['../ktx_8h.html#a5d741f48293002f70546881d2394b6f6',1,'ktx.h']]], + ['ktx_5ftexture_5fcreate_5fno_5fstorage_48',['KTX_TEXTURE_CREATE_NO_STORAGE',['../ktx_8h.html#adbea2c86013d12a4825500156e0c1f60',1,'ktx.h']]], + ['ktx_5ftexture_5fcreate_5fraw_5fkvdata_5fbit_49',['KTX_TEXTURE_CREATE_RAW_KVDATA_BIT',['../ktx_8h.html#aa5a065e72ab3fffea96a320f0af415c1',1,'ktx.h']]], + ['ktx_5ftexture_5fcreate_5fskip_5fkvdata_5fbit_50',['KTX_TEXTURE_CREATE_SKIP_KVDATA_BIT',['../ktx_8h.html#a932bc39751e896edb5c48415447edc50',1,'ktx.h']]], + ['ktx_5ftf_5fbc1_51',['KTX_TF_BC1',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5abb672255cb647aceeb99b05e7f6d99b2',1,'ktx.h']]], + ['ktx_5ftf_5fbc3_52',['KTX_TF_BC3',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a6a05289216c33a4c731e7b9670e83eab',1,'ktx.h']]], + ['ktx_5ftf_5fbc4_53',['KTX_TF_BC4',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a260df90000f23f2bf1a06368304f5985',1,'ktx.h']]], + ['ktx_5ftf_5fbc5_54',['KTX_TF_BC5',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a39a369e112f19db1769f6c02b26f283b',1,'ktx.h']]], + ['ktx_5ftf_5fbc7_5fm6_5fopaque_5fonly_55',['KTX_TF_BC7_M6_OPAQUE_ONLY',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5afcf0ab81c08710d1c1ad1a0445a4775f',1,'ktx.h']]], + ['ktx_5ftf_5fetc1_56',['KTX_TF_ETC1',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a4d5ff56c820f41b01ceaa7b1056fd38c',1,'ktx.h']]], + ['ktx_5ftf_5fetc2_57',['KTX_TF_ETC2',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad0aacfd9b57f902f7e140a9fe4a501bd',1,'ktx.h']]], + ['ktx_5ftf_5fhigh_5fquality_58',['KTX_TF_HIGH_QUALITY',['../ktx_8h.html#ab2288718afab080ff86e9d3250180fb6a1f5bb151dc8463b0a917d98cb42f3506',1,'ktx.h']]], + ['ktx_5ftf_5fpvrtc1_5f4_5fopaque_5fonly_59',['KTX_TF_PVRTC1_4_OPAQUE_ONLY',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a2117d164feecb02ba5199b4ee72d2f04',1,'ktx.h']]], + ['ktx_5ftf_5fpvrtc_5fdecode_5fto_5fnext_5fpow2_60',['KTX_TF_PVRTC_DECODE_TO_NEXT_POW2',['../ktx_8h.html#ab2288718afab080ff86e9d3250180fb6a0757a22b5adb1792c54547f1d759878d',1,'ktx.h']]], + ['ktx_5ftf_5ftranscode_5falpha_5fdata_5fto_5fopaque_5fformats_61',['KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS',['../ktx_8h.html#ab2288718afab080ff86e9d3250180fb6a76abf8fba809fc617dbdf65d70320d24',1,'ktx.h']]], + ['ktx_5ftranscode_5ffailed_62',['KTX_TRANSCODE_FAILED',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad9ba6e380b7a1d44a10b6626357ee3a1',1,'ktx.h']]], + ['ktx_5fttf_5fastc_5f4x4_5frgba_63',['KTX_TTF_ASTC_4x4_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a26ee2ca9dbc9384ded1c41c59a8bc3b6',1,'ktx.h']]], + ['ktx_5fttf_5fbc1_5for_5f3_64',['KTX_TTF_BC1_OR_3',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ae1906b8161119e9aca1add331ecf6de6',1,'ktx.h']]], + ['ktx_5fttf_5fbc1_5frgb_65',['KTX_TTF_BC1_RGB',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a7b596baf4e8088b0ddda7615971e274e',1,'ktx.h']]], + ['ktx_5fttf_5fbc3_5frgba_66',['KTX_TTF_BC3_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a352f7aeb953d220e0fa4abc025a6f880',1,'ktx.h']]], + ['ktx_5fttf_5fbc4_5fr_67',['KTX_TTF_BC4_R',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5aebbc72211dd8662af91b2f910fda4be3',1,'ktx.h']]], + ['ktx_5fttf_5fbc5_5frg_68',['KTX_TTF_BC5_RG',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5af030f0703301f830ece442aa508195b0',1,'ktx.h']]], + ['ktx_5fttf_5fbc7_5fm5_5frgba_69',['KTX_TTF_BC7_M5_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a0725a0280faa5a362e823daa958b9e5d',1,'ktx.h']]], + ['ktx_5fttf_5fbc7_5fm6_5frgb_70',['KTX_TTF_BC7_M6_RGB',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad84ab9c0ac149b791721ce08a4498d74',1,'ktx.h']]], + ['ktx_5fttf_5fbc7_5frgba_71',['KTX_TTF_BC7_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5aacba582511ea35fbec2fa8fa92a900cc',1,'ktx.h']]], + ['ktx_5fttf_5fbgr565_72',['KTX_TTF_BGR565',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5acc73a45251f2fd88d3f580dee0e14108',1,'ktx.h']]], + ['ktx_5fttf_5fetc_73',['KTX_TTF_ETC',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad5caffd2fe438bbac51f2e314a3dd7c3',1,'ktx.h']]], + ['ktx_5fttf_5fetc1_5frgb_74',['KTX_TTF_ETC1_RGB',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a6b1967cc612417644b7ecb86bdc2de48',1,'ktx.h']]], + ['ktx_5fttf_5fetc2_5feac_5fr11_75',['KTX_TTF_ETC2_EAC_R11',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a7ea42a1c24b02633a3041dcd49c11dfe',1,'ktx.h']]], + ['ktx_5fttf_5fetc2_5feac_5frg11_76',['KTX_TTF_ETC2_EAC_RG11',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5abeba5d59ae679316666a71c48ced66c5',1,'ktx.h']]], + ['ktx_5fttf_5fetc2_5frgba_77',['KTX_TTF_ETC2_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a665baafd3c1d246bf2726342a083a26b',1,'ktx.h']]], + ['ktx_5fttf_5fpvrtc1_5f4_5frgb_78',['KTX_TTF_PVRTC1_4_RGB',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a6d129443f90dd85da21fd1fc1fd50e36',1,'ktx.h']]], + ['ktx_5fttf_5fpvrtc1_5f4_5frgba_79',['KTX_TTF_PVRTC1_4_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5a14600faaff61212753946fd9b74b4064',1,'ktx.h']]], + ['ktx_5fttf_5fpvrtc2_5f4_5frgb_80',['KTX_TTF_PVRTC2_4_RGB',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ab7dacf1384bb2f22655b9cf6064fd5e8',1,'ktx.h']]], + ['ktx_5fttf_5fpvrtc2_5f4_5frgba_81',['KTX_TTF_PVRTC2_4_RGBA',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5af884679766dab49838e52c55d8304d59',1,'ktx.h']]], + ['ktx_5fttf_5frgb565_82',['KTX_TTF_RGB565',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ab949b2bfc245a6d8098817954ac41290',1,'ktx.h']]], + ['ktx_5fttf_5frgba32_83',['KTX_TTF_RGBA32',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5ad790151a02bcf2368e3157e180a2fdd9',1,'ktx.h']]], + ['ktx_5fttf_5frgba4444_84',['KTX_TTF_RGBA4444',['../ktx_8h.html#a30cc58c576392303d9a5a54b57ef29b5acae08dfc76603e86b16908a8d6c46833',1,'ktx.h']]], + ['ktx_5funknown_5ffile_5fformat_85',['KTX_UNKNOWN_FILE_FORMAT',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cadbeb98d59020ac018a4f697d068fff21',1,'ktx.h']]], + ['ktx_5funsupported_5ffeature_86',['KTX_UNSUPPORTED_FEATURE',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca04808a4c3abddb237d2a8cf903205496',1,'ktx.h']]], + ['ktx_5funsupported_5ftexture_5ftype_87',['KTX_UNSUPPORTED_TEXTURE_TYPE',['../ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad3d82ba3467063bec92486a94a38d21d',1,'ktx.h']]] +]; diff --git a/ktx/build/docs/html/libktx/search/files_0.js b/ktx/build/docs/html/libktx/search/files_0.js new file mode 100644 index 0000000..596d318 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['filestream_2ec_0',['filestream.c',['../filestream_8c.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/files_1.js b/ktx/build/docs/html/libktx/search/files_1.js new file mode 100644 index 0000000..6416818 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/files_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ktx_2eh_0',['ktx.h',['../ktx_8h.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/files_2.js b/ktx/build/docs/html/libktx/search/files_2.js new file mode 100644 index 0000000..ae6c79f --- /dev/null +++ b/ktx/build/docs/html/libktx/search/files_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['memstream_2ec_0',['memstream.c',['../memstream_8c.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/files_3.js b/ktx/build/docs/html/libktx/search/files_3.js new file mode 100644 index 0000000..ac2d57a --- /dev/null +++ b/ktx/build/docs/html/libktx/search/files_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['strings_2ec_0',['strings.c',['../strings_8c.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/functions_0.js b/ktx/build/docs/html/libktx/search/functions_0.js new file mode 100644 index 0000000..aba3274 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/functions_0.js @@ -0,0 +1,127 @@ +var searchData= +[ + ['ktxbuimageflagsbitstring_0',['ktxBUImageFlagsBitString',['../strings_8c.html#aa9077e4635ae86d84ec8bcb025d6b373',1,'strings.c']]], + ['ktxerrorstring_1',['ktxErrorString',['../ktx_8h.html#a829eac221b33617c15a1b5a898a0771a',1,'ktxErrorString(KTX_error_code error): strings.c'],['../strings_8c.html#a252d7741a00562fbe2fd9d91d54d873b',1,'ktxErrorString(KTX_error_code error): strings.c']]], + ['ktxfilestream_5fconstruct_2',['ktxFileStream_construct',['../filestream_8c.html#a217a544c241e80216315a50883190519',1,'filestream.c']]], + ['ktxfilestream_5fdestruct_3',['ktxFileStream_destruct',['../filestream_8c.html#adc6cf29b8543378ffae60e6eaa77c7fc',1,'filestream.c']]], + ['ktxhashlist_5faddkvpair_4',['ktxHashList_AddKVPair',['../classktxHashList.html#ad013c9dd666f3b57e3b0a717e0186277',1,'ktxHashList']]], + ['ktxhashlist_5fconstruct_5',['ktxHashList_Construct',['../classktxHashList.html#aaab69a1ef86c52707d0a33dcba316c60',1,'ktxHashList']]], + ['ktxhashlist_5fconstructcopy_6',['ktxHashList_ConstructCopy',['../classktxHashList.html#a11f1a2ff9f574cd803803b77ec758966',1,'ktxHashList']]], + ['ktxhashlist_5fcreate_7',['ktxHashList_Create',['../classktxHashList.html#a13c991ecb452345d4ac2f9ca4ff71b80',1,'ktxHashList']]], + ['ktxhashlist_5fcreatecopy_8',['ktxHashList_CreateCopy',['../classktxHashList.html#a50f608b84f671b23849be13254cc511e',1,'ktxHashList']]], + ['ktxhashlist_5fdeleteentry_9',['ktxHashList_DeleteEntry',['../classktxHashList.html#a21e5f3318a192082258792f7f9d55400',1,'ktxHashList']]], + ['ktxhashlist_5fdeletekvpair_10',['ktxHashList_DeleteKVPair',['../classktxHashList.html#a71475476ba962532003472278dbe33a3',1,'ktxHashList']]], + ['ktxhashlist_5fdeserialize_11',['ktxHashList_Deserialize',['../classktxHashList.html#a3c05bb134c42ad852a4e68b6ebe057b1',1,'ktxHashList']]], + ['ktxhashlist_5fdestroy_12',['ktxHashList_Destroy',['../classktxHashList.html#aa84d4269b0efd2fb9fb2508a371fa0ca',1,'ktxHashList']]], + ['ktxhashlist_5fdestruct_13',['ktxHashList_Destruct',['../classktxHashList.html#a0e3349a7b71be7aaa4f8766fc8a0d437',1,'ktxHashList']]], + ['ktxhashlist_5ffindentry_14',['ktxHashList_FindEntry',['../classktxHashList.html#a2d5939ac234d292854de5afeb786b6ae',1,'ktxHashList']]], + ['ktxhashlist_5ffindvalue_15',['ktxHashList_FindValue',['../classktxHashList.html#ab3625f19223436b718d9267f0b9a663a',1,'ktxHashList']]], + ['ktxhashlist_5fnext_16',['ktxHashList_Next',['../classktxHashList.html#ad432c8d5ba733c69df496e7925e3a158',1,'ktxHashList']]], + ['ktxhashlist_5fserialize_17',['ktxHashList_Serialize',['../classktxHashList.html#a97ca46f361614d6cdfb59a42643f9fc2',1,'ktxHashList']]], + ['ktxhashlist_5fsort_18',['ktxHashList_Sort',['../classktxHashList.html#aee36331d742259c1bb3f42e2c82e38ba',1,'ktxHashList']]], + ['ktxhashlistentry_5fgetkey_19',['ktxHashListEntry_GetKey',['../classktxHashListEntry.html#aee9774ac793b8cc2c5955f0e88c13a2f',1,'ktxHashListEntry']]], + ['ktxhashlistentry_5fgetvalue_20',['ktxHashListEntry_GetValue',['../classktxHashListEntry.html#a96c136b6470dba9bf971a8a3f9719f5e',1,'ktxHashListEntry']]], + ['ktxloadopengl_21',['ktxLoadOpenGL',['../group__ktx__glloader.html#gada67f60796793d1ed9eb1f3f2d61d4a6',1,'ktxLoadOpenGL(PFNGLGETPROCADDRESS pfnGLGetProcAddress): gl_funcs.c'],['../group__ktx__glloader.html#gada67f60796793d1ed9eb1f3f2d61d4a6',1,'ktxLoadOpenGL(PFNGLGETPROCADDRESS pfnGLGetProcAddress): gl_funcs.c']]], + ['ktxmemstream_5fconstruct_22',['ktxMemStream_construct',['../memstream_8c.html#a899a1878ad93c797c8c2d9aacffc6365',1,'memstream.c']]], + ['ktxmemstream_5fconstruct_5fro_23',['ktxMemStream_construct_ro',['../memstream_8c.html#a3c0f816438f1e4412376b35fa66f9424',1,'memstream.c']]], + ['ktxmemstream_5fdestruct_24',['ktxMemStream_destruct',['../memstream_8c.html#a81f0db4b157134a8edf51c2936e853e4',1,'memstream.c']]], + ['ktxmemstream_5fgetdata_25',['ktxMemStream_getdata',['../memstream_8c.html#a3f9cc251a3604f80da67440efff21b6d',1,'memstream.c']]], + ['ktxmemstream_5fsetup_26',['ktxMemStream_setup',['../memstream_8c.html#a777303765bd7d021820c90ff6ad85afa',1,'memstream.c']]], + ['ktxsupercompressionschemestring_27',['ktxSupercompressionSchemeString',['../ktx_8h.html#ad54399157902016600b0543ca027c61c',1,'ktxSupercompressionSchemeString(ktxSupercmpScheme scheme): strings.c'],['../strings_8c.html#a68c7368105d35f01b54573f22ecbe5fb',1,'ktxSupercompressionSchemeString(ktxSupercmpScheme scheme): strings.c']]], + ['ktxtexture1_5fcreate_28',['ktxTexture1_Create',['../group__writer.html#ga9ad46bface6dab07a35579c0635877d3',1,'ktxTexture1']]], + ['ktxtexture1_5fcreatefrommemory_29',['ktxTexture1_CreateFromMemory',['../group__reader.html#ga1f289eb80601208b79561804d2ec0121',1,'ktxTexture1']]], + ['ktxtexture1_5fcreatefromnamedfile_30',['ktxTexture1_CreateFromNamedFile',['../group__reader.html#ga0319d9a33d3ea78da2ef786205f2a956',1,'ktxTexture1']]], + ['ktxtexture1_5fcreatefromstdiostream_31',['ktxTexture1_CreateFromStdioStream',['../group__reader.html#ga4557b9714b41e7c575d295b65e19ed12',1,'ktxTexture1']]], + ['ktxtexture1_5fcreatefromstream_32',['ktxTexture1_CreateFromStream',['../group__reader.html#ga2e9c9d8a1c02732c87db733d3449b337',1,'ktxTexture1']]], + ['ktxtexture1_5fdestroy_33',['ktxTexture1_Destroy',['../group__reader.html#gaa616363178ec37996459219a6925f87d',1,'ktxTexture1']]], + ['ktxtexture1_5fgetdatasizeuncompressed_34',['ktxTexture1_GetDataSizeUncompressed',['../group__reader.html#ga65cd751a3d1a6eed97cb19b7a88d736c',1,'ktxTexture1']]], + ['ktxtexture1_5fgetimageoffset_35',['ktxTexture1_GetImageOffset',['../group__reader.html#ga2c471eb79f1ac62d63cae86ca6c519bf',1,'ktxTexture1']]], + ['ktxtexture1_5fgetimagesize_36',['ktxTexture1_GetImageSize',['../group__reader.html#gac1dc0703bc613180a92a8e1c5901dd50',1,'ktxTexture1']]], + ['ktxtexture1_5fgetlevelsize_37',['ktxTexture1_GetLevelSize',['../group__reader.html#ga8a1bf5e13f88af082585a875e85dfdeb',1,'ktxTexture1']]], + ['ktxtexture1_5fgetvkformat_38',['ktxTexture1_GetVkFormat',['../group__ktx__vkloader.html#ga11fb504b749453140e04ca69711633d6',1,'ktxTexture1']]], + ['ktxtexture1_5fglupload_39',['ktxTexture1_GLUpload',['../group__ktx__glloader.html#ga058297b66c5a7fd1f1bbaf718a887b9f',1,'ktxTexture1']]], + ['ktxtexture1_5fiteratelevels_40',['ktxTexture1_IterateLevels',['../group__reader.html#ga400a2581bf935beb6c0192a6e9844914',1,'ktxTexture1']]], + ['ktxtexture1_5fiterateloadlevelfaces_41',['ktxTexture1_IterateLoadLevelFaces',['../group__reader.html#gab56e28f79781acf2933e36c21823c0df',1,'ktxTexture1']]], + ['ktxtexture1_5floadimagedata_42',['ktxTexture1_LoadImageData',['../group__reader.html#ga7334feb062f32b62159cebd6e4b28d16',1,'ktxTexture1']]], + ['ktxtexture1_5fsetimagefrommemory_43',['ktxTexture1_SetImageFromMemory',['../group__writer.html#gabeb1d5eb7ddcfd81405d5726a0b55ee6',1,'ktxTexture1']]], + ['ktxtexture1_5fsetimagefromstdiostream_44',['ktxTexture1_SetImageFromStdioStream',['../group__writer.html#ga9383755c2e02a9d1aa932e75c847829c',1,'ktxTexture1']]], + ['ktxtexture1_5fvkupload_45',['ktxTexture1_VkUpload',['../group__ktx__vkloader.html#gac70d24bac4ac3b2586836439bbc6592a',1,'ktxTexture1']]], + ['ktxtexture1_5fvkuploadex_46',['ktxTexture1_VkUploadEx',['../group__ktx__vkloader.html#gad7840c1eeb618fa1a09fc5a02c07ce87',1,'ktxTexture1']]], + ['ktxtexture1_5fvkuploadex_5fwithsuballocator_47',['ktxTexture1_VkUploadEx_WithSuballocator',['../group__ktx__vkloader.html#ga4166e5853362cf136f3efe0c527c4c6d',1,'ktxTexture1']]], + ['ktxtexture1_5fwritektx2tomemory_48',['ktxTexture1_WriteKTX2ToMemory',['../group__writer.html#gadbc6058afa50d4db3efd738822e6296a',1,'ktxTexture1']]], + ['ktxtexture1_5fwritektx2tonamedfile_49',['ktxTexture1_WriteKTX2ToNamedFile',['../group__writer.html#ga3009e876fb584268241a9ba7704e8557',1,'ktxTexture1']]], + ['ktxtexture1_5fwritektx2tostdiostream_50',['ktxTexture1_WriteKTX2ToStdioStream',['../group__writer.html#gac31b3532ed02d8cd4a7b517d4d2ab6ef',1,'ktxTexture1']]], + ['ktxtexture1_5fwritektx2tostream_51',['ktxTexture1_WriteKTX2ToStream',['../group__writer.html#gad0a6406fc9359abd5f6d9956a86ce90f',1,'ktxTexture1']]], + ['ktxtexture1_5fwritetomemory_52',['ktxTexture1_WriteToMemory',['../group__writer.html#ga21904a85ada4ee322b87c309566ea4d1',1,'ktxTexture1']]], + ['ktxtexture1_5fwritetonamedfile_53',['ktxTexture1_WriteToNamedFile',['../group__writer.html#gafe0d51799d92b69cdcbe30c98322340b',1,'ktxTexture1']]], + ['ktxtexture1_5fwritetostdiostream_54',['ktxTexture1_WriteToStdioStream',['../group__writer.html#ga924da3380253c85fffca8c956e00d5c0',1,'ktxTexture1']]], + ['ktxtexture1_5fwritetostream_55',['ktxTexture1_WriteToStream',['../group__writer.html#gac1780ac8315f0cab9893c121481c7453',1,'ktxTexture1']]], + ['ktxtexture2_5fcompressastc_56',['ktxTexture2_CompressAstc',['../group__writer.html#ga00b153dbfa1fe115c7d4322dbe07f172',1,'ktxTexture2']]], + ['ktxtexture2_5fcompressastcex_57',['ktxTexture2_CompressAstcEx',['../group__writer.html#gaf08421ae0893a9e9205d3e84fad66bd8',1,'ktxTexture2']]], + ['ktxtexture2_5fcompressbasis_58',['ktxTexture2_CompressBasis',['../group__writer.html#ga405c44d6daf8ddf83dc805810bf4f989',1,'ktxTexture2']]], + ['ktxtexture2_5fcompressbasisex_59',['ktxTexture2_CompressBasisEx',['../group__writer.html#ga0e75755e3cc69964e57363dad82ffd77',1,'ktxTexture2']]], + ['ktxtexture2_5fcreate_60',['ktxTexture2_Create',['../group__writer.html#gaa8e29216921eadd3c09c3a76bc286acd',1,'ktxTexture2']]], + ['ktxtexture2_5fcreatecopy_61',['ktxTexture2_CreateCopy',['../group__writer.html#ga5fcfdc3d237419ab65287639e1f4aeb1',1,'ktxTexture2']]], + ['ktxtexture2_5fcreatefrommemory_62',['ktxTexture2_CreateFromMemory',['../group__reader.html#ga6805a144f0bfd17b51d46fb28b0786a5',1,'ktxTexture2']]], + ['ktxtexture2_5fcreatefromnamedfile_63',['ktxTexture2_CreateFromNamedFile',['../group__reader.html#ga8680560274b31da6f3f07ee911055431',1,'ktxTexture2']]], + ['ktxtexture2_5fcreatefromstdiostream_64',['ktxTexture2_CreateFromStdioStream',['../group__reader.html#gae9de7e23ffe3ae3aeed4cc95c61699e4',1,'ktxTexture2']]], + ['ktxtexture2_5fcreatefromstream_65',['ktxTexture2_CreateFromStream',['../group__reader.html#ga1e865473d23f82fc22a16bb3eadf60ed',1,'ktxTexture2']]], + ['ktxtexture2_5fdecodeastc_66',['ktxTexture2_DecodeAstc',['../group__reader.html#gaea0edab86daca9c288d4cd6b47b34e28',1,'ktxTexture2_DecodeAstc(ktxTexture2 *This): astc_codec.cpp'],['../group__reader.html#gaea0edab86daca9c288d4cd6b47b34e28',1,'ktxTexture2_DecodeAstc(ktxTexture2 *This): astc_codec.cpp']]], + ['ktxtexture2_5fdeflatezlib_67',['ktxTexture2_DeflateZLIB',['../group__writer.html#gaafc3cf2c872ea75be7096b1fc70dfb2c',1,'ktxTexture2']]], + ['ktxtexture2_5fdeflatezstd_68',['ktxTexture2_DeflateZstd',['../group__writer.html#ga08d7222fbf845f25d883ed81c14c6430',1,'ktxTexture2']]], + ['ktxtexture2_5fdestroy_69',['ktxTexture2_Destroy',['../group__reader.html#ga01ec49abe73b77f2f8db99b5d9cf46d9',1,'ktxTexture2']]], + ['ktxtexture2_5fgetcolormodel_5fe_70',['ktxTexture2_GetColorModel_e',['../group__reader.html#ga7200d548b480a3abb69c206f530c0669',1,'ktxTexture2']]], + ['ktxtexture2_5fgetcomponentinfo_71',['ktxTexture2_GetComponentInfo',['../group__reader.html#gad3aab08fa013c602fc055964e78c7566',1,'ktxTexture2']]], + ['ktxtexture2_5fgetdatasizeuncompressed_72',['ktxTexture2_GetDataSizeUncompressed',['../group__reader.html#gaefcaf84425830ba095eb670a275dad34',1,'ktxTexture2']]], + ['ktxtexture2_5fgetimageoffset_73',['ktxTexture2_GetImageOffset',['../group__reader.html#gab29978f318436c009ae45b7d3c515f8e',1,'ktxTexture2']]], + ['ktxtexture2_5fgetimagesize_74',['ktxTexture2_GetImageSize',['../group__reader.html#gaa4b800f418f57b10737ac6533f1769d2',1,'ktxTexture2']]], + ['ktxtexture2_5fgetlevelsize_75',['ktxTexture2_GetLevelSize',['../group__reader.html#gac344745350aff9cf5bcc2969729b7f0e',1,'ktxTexture2']]], + ['ktxtexture2_5fgetnumcomponents_76',['ktxTexture2_GetNumComponents',['../group__reader.html#gacc7762adb6ff311ca65cfe5ed89db21e',1,'ktxTexture2']]], + ['ktxtexture2_5fgetoetf_77',['ktxTexture2_GetOETF',['../group__reader.html#gac1b0eccd69f541450ed88da2ad260dcc',1,'ktxTexture2']]], + ['ktxtexture2_5fgetoetf_5fe_78',['ktxTexture2_GetOETF_e',['../group__reader.html#gaddf6746c18d970a238e89bb9b8e13e77',1,'ktxTexture2']]], + ['ktxtexture2_5fgetpremultipliedalpha_79',['ktxTexture2_GetPremultipliedAlpha',['../group__reader.html#gab773b3ad45bacb6f487b62c4b0a07fcf',1,'ktxTexture2']]], + ['ktxtexture2_5fgetprimaries_5fe_80',['ktxTexture2_GetPrimaries_e',['../group__reader.html#gac7323c6f9fe75f442484392506b2024b',1,'ktxTexture2']]], + ['ktxtexture2_5fgettransferfunction_5fe_81',['ktxTexture2_GetTransferFunction_e',['../group__reader.html#ga37cd5b4ae9ee373d825197dc8998d0bb',1,'ktxTexture2']]], + ['ktxtexture2_5fgetvkformat_82',['ktxTexture2_GetVkFormat',['../group__ktx__vkloader.html#ga7a9baaf3aa2e114c6f6e58fe68051815',1,'ktxTexture2']]], + ['ktxtexture2_5fglupload_83',['ktxTexture2_GLUpload',['../group__ktx__glloader.html#ga7624860df8e44573862fa5754ea2976c',1,'ktxTexture2']]], + ['ktxtexture2_5fiteratelevels_84',['ktxTexture2_IterateLevels',['../group__reader.html#ga1b47270a151b67615aed9eeca5f25bf7',1,'ktxTexture2']]], + ['ktxtexture2_5fiterateloadlevelfaces_85',['ktxTexture2_IterateLoadLevelFaces',['../group__reader.html#gaf57628ec7f9a554b46ba84ab9c214bab',1,'ktxTexture2']]], + ['ktxtexture2_5floaddeflatedimagedata_86',['ktxTexture2_LoadDeflatedImageData',['../group__reader.html#gaa1f681c144baa70ef9af6db4c7333b3c',1,'ktxTexture2']]], + ['ktxtexture2_5floadimagedata_87',['ktxTexture2_LoadImageData',['../group__reader.html#ga032b7f1926861c8b40655527b84f5533',1,'ktxTexture2']]], + ['ktxtexture2_5fneedstranscoding_88',['ktxTexture2_NeedsTranscoding',['../group__reader.html#gade1ffc5d31c2f9b5f1e861b59e7619ce',1,'ktxTexture2']]], + ['ktxtexture2_5fsetimagefrommemory_89',['ktxTexture2_SetImageFromMemory',['../group__writer.html#ga01b13c38300016ce36c5b97bf4957d48',1,'ktxTexture2']]], + ['ktxtexture2_5fsetimagefromstdiostream_90',['ktxTexture2_SetImageFromStdioStream',['../group__writer.html#ga50a5ecf22586b26977da62cf19a78518',1,'ktxTexture2']]], + ['ktxtexture2_5fsetoetf_91',['ktxTexture2_SetOETF',['../group__writer.html#ga9894284fd16fed4697505353043bbeae',1,'ktxTexture2']]], + ['ktxtexture2_5fsetprimaries_92',['ktxTexture2_SetPrimaries',['../group__writer.html#gaa623fd7f433e3827a52cdb499f9162f9',1,'ktxTexture2']]], + ['ktxtexture2_5ftranscodebasis_93',['ktxTexture2_TranscodeBasis',['../group__reader.html#ga90cc33928a2dae962fb94b3fa2f6575d',1,'ktxTexture2']]], + ['ktxtexture2_5fvkupload_94',['ktxTexture2_VkUpload',['../group__ktx__vkloader.html#gadf0fba44f518b61acd5d0ae86225ddee',1,'ktxTexture2']]], + ['ktxtexture2_5fvkuploadex_95',['ktxTexture2_VkUploadEx',['../group__ktx__vkloader.html#ga265926439e3f9502f248684238e5cc48',1,'ktxTexture2']]], + ['ktxtexture2_5fvkuploadex_5fwithsuballocator_96',['ktxTexture2_VkUploadEx_WithSuballocator',['../group__ktx__vkloader.html#gacb13edcb651f0a8fb26dab9594ef7dc7',1,'ktxTexture2']]], + ['ktxtexture2_5fwritetomemory_97',['ktxTexture2_WriteToMemory',['../group__writer.html#ga0113194b669b789a22d85b7ad992f117',1,'ktxTexture2']]], + ['ktxtexture2_5fwritetonamedfile_98',['ktxTexture2_WriteToNamedFile',['../group__writer.html#ga745cee3857ade59e612c533d6faa8e2a',1,'ktxTexture2']]], + ['ktxtexture2_5fwritetostdiostream_99',['ktxTexture2_WriteToStdioStream',['../group__writer.html#gadf2c2542471b7a94636216807cedd819',1,'ktxTexture2']]], + ['ktxtexture2_5fwritetostream_100',['ktxTexture2_WriteToStream',['../group__writer.html#gacb722c7d0c1df7e6e3b4caa78ae729cf',1,'ktxTexture2']]], + ['ktxtexture_5fcreatefrommemory_101',['ktxTexture_CreateFromMemory',['../group__reader.html#gaf1e401967a687b40cdf7bba11e72c2b4',1,'ktxTexture']]], + ['ktxtexture_5fcreatefromnamedfile_102',['ktxTexture_CreateFromNamedFile',['../group__reader.html#ga57a1ce0d3f2d66439463160d6ce9d2d0',1,'ktxTexture']]], + ['ktxtexture_5fcreatefromstdiostream_103',['ktxTexture_CreateFromStdioStream',['../group__reader.html#ga180d93562cc6af30c61adf8f6a8fd827',1,'ktxTexture']]], + ['ktxtexture_5fcreatefromstream_104',['ktxTexture_CreateFromStream',['../group__reader.html#gaa8dfc7a981b69d26eab73c5405d7182b',1,'ktxTexture']]], + ['ktxtexture_5fgetdata_105',['ktxTexture_GetData',['../group__reader.html#gace44d98fa78b94c282016e7cf8a88b7e',1,'ktxTexture']]], + ['ktxtexture_5fgetdatasize_106',['ktxTexture_GetDataSize',['../group__reader.html#ga553c3438e75628c6d7e2280989e539c4',1,'ktxTexture']]], + ['ktxtexture_5fgetelementsize_107',['ktxTexture_GetElementSize',['../group__reader.html#ga19d8786eea0e62ab55d945bff838d32c',1,'ktxTexture']]], + ['ktxtexture_5fgetrowpitch_108',['ktxTexture_GetRowPitch',['../group__reader.html#gacf9e393ff766982ccb79ad915975971f',1,'ktxTexture']]], + ['ktxtexture_5fgetvkformat_109',['ktxTexture_GetVkFormat',['../group__ktx__vkloader.html#ga3ef2792fb0cd184636180ae0a540b872',1,'ktxTexture']]], + ['ktxtexture_5fglupload_110',['ktxTexture_GLUpload',['../group__ktx__glloader.html#ga516367e94731f99a23a83fb029e9a441',1,'ktxTexture']]], + ['ktxtexture_5fiteratelevelfaces_111',['ktxTexture_IterateLevelFaces',['../group__reader.html#gae7c4b8bbe26379f2076f93050c0673c1',1,'ktxTexture']]], + ['ktxtexture_5fvkupload_112',['ktxTexture_VkUpload',['../group__ktx__vkloader.html#ga377a4a2c177956ea661549ee502d60da',1,'ktxTexture']]], + ['ktxtexture_5fvkuploadex_113',['ktxTexture_VkUploadEx',['../group__ktx__vkloader.html#ga153164adbd7307ad1844c3e117faa325',1,'ktxTexture']]], + ['ktxtexture_5fvkuploadex_5fwithsuballocator_114',['ktxTexture_VkUploadEx_WithSuballocator',['../group__ktx__vkloader.html#ga8d9b0820e70dd0239b2c1bdc0a7713f7',1,'ktxTexture']]], + ['ktxtranscodeformatstring_115',['ktxTranscodeFormatString',['../ktx_8h.html#ac86f20d7858aaacef77f7eee15983470',1,'ktxTranscodeFormatString(ktx_transcode_fmt_e format): strings.c'],['../strings_8c.html#a25b70a70161c149687d0ca19fc839b81',1,'ktxTranscodeFormatString(ktx_transcode_fmt_e format): strings.c']]], + ['ktxvulkandeviceinfo_5fconstruct_116',['ktxVulkanDeviceInfo_Construct',['../group__ktx__vkloader.html#ga4bc9f0fa9af93d588276f54fe9a6ba50',1,'ktxVulkanDeviceInfo']]], + ['ktxvulkandeviceinfo_5fconstructex_117',['ktxVulkanDeviceInfo_ConstructEx',['../group__ktx__vkloader.html#ga3c9d5bc5ac1d0e237ae62fd94c148764',1,'ktxVulkanDeviceInfo']]], + ['ktxvulkandeviceinfo_5fcreate_118',['ktxVulkanDeviceInfo_Create',['../group__ktx__vkloader.html#ga82ac7e21e884652c519d9fe28ad5428c',1,'ktxVulkanDeviceInfo']]], + ['ktxvulkandeviceinfo_5fcreateex_119',['ktxVulkanDeviceInfo_CreateEx',['../group__ktx__vkloader.html#ga5137c2d7e23be51160048b3253abad3c',1,'ktxVulkanDeviceInfo']]], + ['ktxvulkandeviceinfo_5fdestroy_120',['ktxVulkanDeviceInfo_Destroy',['../group__ktx__vkloader.html#gaaf633943fbf201fb620c0270c6150fa8',1,'ktxVulkanDeviceInfo']]], + ['ktxvulkandeviceinfo_5fdestruct_121',['ktxVulkanDeviceInfo_Destruct',['../group__ktx__vkloader.html#gae58928740420d1ed3f96fd4b0f2d897e',1,'ktxVulkanDeviceInfo']]], + ['ktxvulkantexture_5fdestruct_122',['ktxVulkanTexture_Destruct',['../group__ktx__vkloader.html#gaf620a84f6bc59bff03b521e55a654f19',1,'ktxVulkanTexture']]], + ['ktxvulkantexture_5fdestruct_5fwithsuballocator_123',['ktxVulkanTexture_Destruct_WithSuballocator',['../group__ktx__vkloader.html#ga5a783db9431738b9b18b9fc585183490',1,'ktxVulkanTexture']]] +]; diff --git a/ktx/build/docs/html/libktx/search/groups_0.js b/ktx/build/docs/html/libktx/search/groups_0.js new file mode 100644 index 0000000..56f284a --- /dev/null +++ b/ktx/build/docs/html/libktx/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['image_20loader_0',['Image Loader',['../group__ktx__glloader.html',1,'OpenGL Texture Image Loader'],['../group__ktx__vkloader.html',1,'Vulkan Texture Image Loader']]] +]; diff --git a/ktx/build/docs/html/libktx/search/groups_1.js b/ktx/build/docs/html/libktx/search/groups_1.js new file mode 100644 index 0000000..0b9f4f0 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['loader_0',['Loader',['../group__ktx__glloader.html',1,'OpenGL Texture Image Loader'],['../group__ktx__vkloader.html',1,'Vulkan Texture Image Loader']]] +]; diff --git a/ktx/build/docs/html/libktx/search/groups_2.js b/ktx/build/docs/html/libktx/search/groups_2.js new file mode 100644 index 0000000..218e71c --- /dev/null +++ b/ktx/build/docs/html/libktx/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['opengl_20texture_20image_20loader_0',['OpenGL Texture Image Loader',['../group__ktx__glloader.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/groups_3.js b/ktx/build/docs/html/libktx/search/groups_3.js new file mode 100644 index 0000000..b70859c --- /dev/null +++ b/ktx/build/docs/html/libktx/search/groups_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['reader_0',['Reader',['../group__reader.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/groups_4.js b/ktx/build/docs/html/libktx/search/groups_4.js new file mode 100644 index 0000000..ba6bc13 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/groups_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['texture_20image_20loader_0',['Texture Image Loader',['../group__ktx__glloader.html',1,'OpenGL Texture Image Loader'],['../group__ktx__vkloader.html',1,'Vulkan Texture Image Loader']]] +]; diff --git a/ktx/build/docs/html/libktx/search/groups_5.js b/ktx/build/docs/html/libktx/search/groups_5.js new file mode 100644 index 0000000..fb6ec15 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/groups_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['vulkan_20texture_20image_20loader_0',['Vulkan Texture Image Loader',['../group__ktx__vkloader.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/groups_6.js b/ktx/build/docs/html/libktx/search/groups_6.js new file mode 100644 index 0000000..dd8cc6a --- /dev/null +++ b/ktx/build/docs/html/libktx/search/groups_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['writer_0',['Writer',['../group__writer.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_0.js b/ktx/build/docs/html/libktx/search/pages_0.js new file mode 100644 index 0000000..1d00653 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['0_0',['0',['../libktx_history.html#v1',1,'Version 1.0'],['../libktx_history.html#v3',1,'Version 2.0'],['../libktx_history.html#v6',1,'Version 3.0'],['../libktx_history.html#v8',1,'Version 4.0']]], + ['0_201_1',['0 1',['../libktx_history.html#v2',1,'Version 1.0.1'],['../libktx_history.html#v4',1,'Version 2.0.1'],['../libktx_history.html#v7',1,'Version 3.0.1']]], + ['0_202_2',['Version 2.0.2',['../libktx_history.html#v5',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_1.js b/ktx/build/docs/html/libktx/search/pages_1.js new file mode 100644 index 0000000..ac4314f --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['1_0',['1',['../libktx_history.html#v2',1,'Version 1.0.1'],['../libktx_history.html#v4',1,'Version 2.0.1'],['../libktx_history.html#v7',1,'Version 3.0.1']]], + ['1_200_1',['Version 1.0',['../libktx_history.html#v1',1,'']]], + ['1_200_201_2',['Version 1.0.1',['../libktx_history.html#v2',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_10.js b/ktx/build/docs/html/libktx/search/pages_10.js new file mode 100644 index 0000000..b3994bf --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['metadata_0',['Extracting Metadata',['../index.html#subsection',1,'']]], + ['modifying_20a_20ktx_20file_1',['Modifying a KTX file',['../index.html#modifyktx',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_11.js b/ktx/build/docs/html/libktx/search/pages_11.js new file mode 100644 index 0000000..dc6e837 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_11.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['non_20gl_20and_20non_20vulkan_20use_0',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['non_20vulkan_20use_1',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_12.js b/ktx/build/docs/html/libktx/search/pages_12.js new file mode 100644 index 0000000..83057be --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_12.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['object_20from_20a_20ktx_20file_0',['object from a KTX file',['../index.html#createGL',1,'Creating a GL texture object from a KTX file.'],['../index.html#createVulkan',1,'Creating a Vulkan image object from a KTX file.']]], + ['or_20ktx2_20file_1',['Writing a KTX or KTX2 file',['../index.html#writektx',1,'']]], + ['or_20uastc_20compressed_20texture_2',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]], + ['overview_3',['Usage Overview',['../index.html#overview',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_13.js b/ktx/build/docs/html/libktx/search/pages_13.js new file mode 100644 index 0000000..23a15b4 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_13.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['reading_20a_20ktx_20file_20for_20non_20gl_20and_20non_20vulkan_20use_0',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['reference_1',['libktx Reference',['../index.html',1,'']]], + ['revision_20history_2',['Revision History',['../libktx_history.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_14.js b/ktx/build/docs/html/libktx/search/pages_14.js new file mode 100644 index 0000000..4f8271f --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_14.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['texture_0',['Texture',['../index.html#autotoc_md1',1,'Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture'],['../index.html#autotoc_md0',1,'Writing a Basis-compressed Universal Texture'],['../index.html#autotoc_md2',1,'Writing an ASTC-Compressed Texture']]], + ['texture_20object_20from_20a_20ktx_20file_1',['Creating a GL texture object from a KTX file.',['../index.html#createGL',1,'']]], + ['transcoding_20a_20basislz_20etc1s_20or_20uastc_20compressed_20texture_2',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_15.js b/ktx/build/docs/html/libktx/search/pages_15.js new file mode 100644 index 0000000..4c5915b --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_15.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['uastc_20compressed_20texture_0',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]], + ['universal_20texture_1',['Writing a Basis-compressed Universal Texture',['../index.html#autotoc_md0',1,'']]], + ['usage_20overview_2',['Usage Overview',['../index.html#overview',1,'']]], + ['use_3',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_16.js b/ktx/build/docs/html/libktx/search/pages_16.js new file mode 100644 index 0000000..2d083b8 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_16.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['version_201_200_0',['Version 1.0',['../libktx_history.html#v1',1,'']]], + ['version_201_200_201_1',['Version 1.0.1',['../libktx_history.html#v2',1,'']]], + ['version_202_200_2',['Version 2.0',['../libktx_history.html#v3',1,'']]], + ['version_202_200_201_3',['Version 2.0.1',['../libktx_history.html#v4',1,'']]], + ['version_202_200_202_4',['Version 2.0.2',['../libktx_history.html#v5',1,'']]], + ['version_203_200_5',['Version 3.0',['../libktx_history.html#v6',1,'']]], + ['version_203_200_201_6',['Version 3.0.1',['../libktx_history.html#v7',1,'']]], + ['version_204_200_7',['Version 4.0',['../libktx_history.html#v8',1,'']]], + ['vulkan_20image_20object_20from_20a_20ktx_20file_8',['Creating a Vulkan image object from a KTX file.',['../index.html#createVulkan',1,'']]], + ['vulkan_20use_9',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_17.js b/ktx/build/docs/html/libktx/search/pages_17.js new file mode 100644 index 0000000..9c803a7 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_17.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['writing_20a_20basis_20compressed_20universal_20texture_0',['Writing a Basis-compressed Universal Texture',['../index.html#autotoc_md0',1,'']]], + ['writing_20a_20ktx_20or_20ktx2_20file_1',['Writing a KTX or KTX2 file',['../index.html#writektx',1,'']]], + ['writing_20an_20astc_20compressed_20texture_2',['Writing an ASTC-Compressed Texture',['../index.html#autotoc_md2',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_2.js b/ktx/build/docs/html/libktx/search/pages_2.js new file mode 100644 index 0000000..b6b0d3f --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_2.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['2_0',['Version 2.0.2',['../libktx_history.html#v5',1,'']]], + ['2_200_1',['Version 2.0',['../libktx_history.html#v3',1,'']]], + ['2_200_201_2',['Version 2.0.1',['../libktx_history.html#v4',1,'']]], + ['2_200_202_3',['Version 2.0.2',['../libktx_history.html#v5',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_3.js b/ktx/build/docs/html/libktx/search/pages_3.js new file mode 100644 index 0000000..8b62f3a --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['3_200_0',['Version 3.0',['../libktx_history.html#v6',1,'']]], + ['3_200_201_1',['Version 3.0.1',['../libktx_history.html#v7',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_4.js b/ktx/build/docs/html/libktx/search/pages_4.js new file mode 100644 index 0000000..c2d2f44 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['4_200_0',['Version 4.0',['../libktx_history.html#v8',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_5.js b/ktx/build/docs/html/libktx/search/pages_5.js new file mode 100644 index 0000000..6b62a17 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_5.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['a_20basis_20compressed_20universal_20texture_0',['Writing a Basis-compressed Universal Texture',['../index.html#autotoc_md0',1,'']]], + ['a_20basislz_20etc1s_20or_20uastc_20compressed_20texture_1',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]], + ['a_20gl_20texture_20object_20from_20a_20ktx_20file_2',['Creating a GL texture object from a KTX file.',['../index.html#createGL',1,'']]], + ['a_20ktx_20file_3',['a KTX file',['../index.html#createGL',1,'Creating a GL texture object from a KTX file.'],['../index.html#createVulkan',1,'Creating a Vulkan image object from a KTX file.'],['../index.html#modifyktx',1,'Modifying a KTX file']]], + ['a_20ktx_20file_20for_20non_20gl_20and_20non_20vulkan_20use_4',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['a_20ktx_20or_20ktx2_20file_5',['Writing a KTX or KTX2 file',['../index.html#writektx',1,'']]], + ['a_20vulkan_20image_20object_20from_20a_20ktx_20file_6',['Creating a Vulkan image object from a KTX file.',['../index.html#createVulkan',1,'']]], + ['an_20astc_20compressed_20texture_7',['Writing an ASTC-Compressed Texture',['../index.html#autotoc_md2',1,'']]], + ['and_20non_20vulkan_20use_8',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['astc_20compressed_20texture_9',['Writing an ASTC-Compressed Texture',['../index.html#autotoc_md2',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_6.js b/ktx/build/docs/html/libktx/search/pages_6.js new file mode 100644 index 0000000..f6728e9 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['basis_20compressed_20universal_20texture_0',['Writing a Basis-compressed Universal Texture',['../index.html#autotoc_md0',1,'']]], + ['basislz_20etc1s_20or_20uastc_20compressed_20texture_1',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_7.js b/ktx/build/docs/html/libktx/search/pages_7.js new file mode 100644 index 0000000..0e1eef9 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_7.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['compressed_20texture_0',['Writing an ASTC-Compressed Texture',['../index.html#autotoc_md2',1,'']]], + ['compressed_20texture_1',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]], + ['compressed_20universal_20texture_2',['Writing a Basis-compressed Universal Texture',['../index.html#autotoc_md0',1,'']]], + ['creating_20a_20gl_20texture_20object_20from_20a_20ktx_20file_3',['Creating a GL texture object from a KTX file.',['../index.html#createGL',1,'']]], + ['creating_20a_20vulkan_20image_20object_20from_20a_20ktx_20file_4',['Creating a Vulkan image object from a KTX file.',['../index.html#createVulkan',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_8.js b/ktx/build/docs/html/libktx/search/pages_8.js new file mode 100644 index 0000000..4d85845 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['deprecated_20list_0',['Deprecated List',['../deprecated.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_9.js b/ktx/build/docs/html/libktx/search/pages_9.js new file mode 100644 index 0000000..f9c2fe5 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['etc1s_20or_20uastc_20compressed_20texture_0',['Transcoding a BasisLZ/ETC1S or UASTC-compressed Texture',['../index.html#autotoc_md1',1,'']]], + ['extracting_20metadata_1',['Extracting Metadata',['../index.html#subsection',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_a.js b/ktx/build/docs/html/libktx/search/pages_a.js new file mode 100644 index 0000000..77adab1 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['file_0',['file',['../index.html#createGL',1,'Creating a GL texture object from a KTX file.'],['../index.html#createVulkan',1,'Creating a Vulkan image object from a KTX file.'],['../index.html#modifyktx',1,'Modifying a KTX file'],['../index.html#writektx',1,'Writing a KTX or KTX2 file']]], + ['file_20for_20non_20gl_20and_20non_20vulkan_20use_1',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['for_20non_20gl_20and_20non_20vulkan_20use_2',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['from_20a_20ktx_20file_3',['from a KTX file',['../index.html#createGL',1,'Creating a GL texture object from a KTX file.'],['../index.html#createVulkan',1,'Creating a Vulkan image object from a KTX file.']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_b.js b/ktx/build/docs/html/libktx/search/pages_b.js new file mode 100644 index 0000000..e77a3a2 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['gl_20and_20non_20vulkan_20use_0',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['gl_20texture_20object_20from_20a_20ktx_20file_1',['Creating a GL texture object from a KTX file.',['../index.html#createGL',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_c.js b/ktx/build/docs/html/libktx/search/pages_c.js new file mode 100644 index 0000000..a531ebd --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['history_0',['Revision History',['../libktx_history.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_d.js b/ktx/build/docs/html/libktx/search/pages_d.js new file mode 100644 index 0000000..650b507 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['image_20object_20from_20a_20ktx_20file_0',['Creating a Vulkan image object from a KTX file.',['../index.html#createVulkan',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_e.js b/ktx/build/docs/html/libktx/search/pages_e.js new file mode 100644 index 0000000..6f963c3 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['ktx_20file_0',['KTX file',['../index.html#createGL',1,'Creating a GL texture object from a KTX file.'],['../index.html#createVulkan',1,'Creating a Vulkan image object from a KTX file.'],['../index.html#modifyktx',1,'Modifying a KTX file']]], + ['ktx_20file_20for_20non_20gl_20and_20non_20vulkan_20use_1',['Reading a KTX file for non-GL and non-Vulkan Use',['../index.html#readktx',1,'']]], + ['ktx_20or_20ktx2_20file_2',['Writing a KTX or KTX2 file',['../index.html#writektx',1,'']]], + ['ktx2_20file_3',['Writing a KTX or KTX2 file',['../index.html#writektx',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/pages_f.js b/ktx/build/docs/html/libktx/search/pages_f.js new file mode 100644 index 0000000..df25e42 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/pages_f.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['libktx_20reference_0',['libktx Reference',['../index.html',1,'']]], + ['list_1',['Deprecated List',['../deprecated.html',1,'']]] +]; diff --git a/ktx/build/docs/html/libktx/search/search.css b/ktx/build/docs/html/libktx/search/search.css new file mode 100644 index 0000000..043d32d --- /dev/null +++ b/ktx/build/docs/html/libktx/search/search.css @@ -0,0 +1,377 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
      • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 43px; + margin-right: 0; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + border: 1px solid var(--search-box-border-color); + z-index: 102; + margin-right: 4px; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.6em; +} + +#MSearchField { + display: inline-block; + vertical-align: top; + width: 7.5em; + height: 22px; + margin: 0 0 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.6em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + margin: 6px 0 0 4px; +} + +.close-icon { + width: 11px; + height: 11px; + background-color: var(--search-close-icon-bg-color); + border-radius: 50%; + position: relative; + display: flex; + justify-content: center; + align-items: center; + box-sizing: content-box; +} + +.close-icon:before, +.close-icon:after { + content: ''; + position: absolute; + width: 7px; + height: 1px; + background-color: var(--search-close-icon-fg-color); +} + +.close-icon:before { + transform: rotate(45deg); +} + +.close-icon:after { + transform: rotate(-45deg); +} + + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + +.search-icon { + width: 20px; + height: 20px; + display: inline-block; + position: relative; + margin-left: 3px; +} + +#MSearchSelectExt.search-icon { + width: 10px; +} + +#MSearchSelectExt + input { + margin-left: 5px; +} + +.search-icon::before, .search-icon::after { + content: ''; + position: absolute; + border: 1.5px solid var(--search-foreground-color); + box-sizing: content-box; +} + +.search-icon::before { + width: 6px; + height: 6px; + border-radius: 50%; + top: 7px; + left: 2px; + background: var(--search-background-color); +} + +.search-icon::after { + border: 1px solid var(--search-foreground-color); + width: 0px; + height: 3px; + border-radius: 2px; + top: 15px; + left: 8px; + transform: rotate(-45deg); + transform-origin: top left; +} + +.search-icon-dropdown { + content: ''; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 3px solid var(--search-foreground-color); + top: 8px; + left: 15px; + transform: translateX(-50%); + position: absolute; +} + + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + backdrop-filter: var(--search-filter-backdrop-filter); + -webkit-backdrop-filter: var(--search-filter-backdrop-filter); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + border-radius: 4px; +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: auto; + right: 4px; + top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + backdrop-filter: var(--search-results-backdrop-filter); + -webkit-backdrop-filter: var(--search-results-backdrop-filter); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; + border-radius: 8px; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResults; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); +} + + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 10pt; + padding: 2px 5px; +} + +div.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +#searchBoxPos1 dark-mode-toggle { + margin-top: 4px; +} + +/*---------------- External search page results */ + +.pages b { + color: var(--nav-foreground-color); + padding: 5px 5px 3px 5px; + background-color: var(--nav-menu-active-bg); + border-radius: 4px; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/ktx/build/docs/html/libktx/search/search.js b/ktx/build/docs/html/libktx/search/search.js new file mode 100644 index 0000000..dc14410 --- /dev/null +++ b/ktx/build/docs/html/libktx/search/search.js @@ -0,0 +1,708 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const decodeHtml = (html) => { + const txt = document.createElement("textarea"); + txt.innerHTML = html; + return txt.value; + }; + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = decodeHtml(elem[1][0]); + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + if (elem[1][1][0].startsWith('http://') || elem[1][1][0].startsWith('https://')) { // absolute path + srLink.setAttribute('href',elem[1][1][0]); + } else { // relative path + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + } + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = decodeHtml(elem[1][1][2]); + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; c + + + + + + +libktx Reference: lib/strings.c File Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        strings.c File Reference
        +
        +
        + +

        Functions to return a string corresponding to various enumerations. +More...

        +
        #include "ktx.h"
        +#include "basis_sgd.h"
        +
        +Include dependency graph for strings.c:
        +
        +
        + + + + + + + + + + + + + + + + + +
        +
        + + + + + + + + + +

        +Functions

        const char * ktxErrorString (KTX_error_code error)
         Return a string corresponding to a KTX error code.
        const char * ktxTranscodeFormatString (ktx_transcode_fmt_e format)
         Return a string corresponding to a transcode format enumeration.
        const char * ktxSupercompressionSchemeString (ktxSupercmpScheme scheme)
         Return a string corresponding to a supercompressionScheme enumeration.
        const char * ktxBUImageFlagsBitString (ktx_uint32_t bit_index, bool bit_value)
         Return a string corresponding to a bu_image_flags bit.
        +

        Detailed Description

        +

        Functions to return a string corresponding to various enumerations.

        +
        Author
        Mark Callow, HI Corporation
        +

        Function Documentation

        + +

        ◆ ktxBUImageFlagsBitString()

        + +
        +
        + + + + + + + + + + + +
        const char * ktxBUImageFlagsBitString (ktx_uint32_t bit_index,
        bool bit_value )
        +
        + +

        Return a string corresponding to a bu_image_flags bit.

        +
        Parameters
        + + + +
        bit_indexthe bu_image_flag bit to test.
        bit_valuethe bu_image_flag bit value.
        +
        +
        +
        Returns
        pointer to the message string or NULL otherwise.
        + +
        +
        + +

        ◆ ktxErrorString()

        + +
        +
        + + + + + + + +
        const char * ktxErrorString (KTX_error_code error)
        +
        + +

        Return a string corresponding to a KTX error code.

        +
        Parameters
        + + +
        errorthe error code for which to return a string
        +
        +
        +
        Returns
        pointer to the message string.
        + +
        +
        + +

        ◆ ktxSupercompressionSchemeString()

        + +
        +
        + + + + + + + +
        const char * ktxSupercompressionSchemeString (ktxSupercmpScheme scheme)
        +
        + +

        Return a string corresponding to a supercompressionScheme enumeration.

        +
        Parameters
        + + +
        schemethe supercompression scheme for which to return a string.
        +
        +
        +
        Returns
        pointer to the message string.
        + +
        +
        + +

        ◆ ktxTranscodeFormatString()

        + +
        +
        + + + + + + + +
        const char * ktxTranscodeFormatString (ktx_transcode_fmt_e format)
        +
        + +

        Return a string corresponding to a transcode format enumeration.

        +
        Parameters
        + + +
        formatthe transcode format for which to return a string.
        +
        +
        +
        Returns
        pointer to the message string.
        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/strings_8c.js b/ktx/build/docs/html/libktx/strings_8c.js new file mode 100644 index 0000000..9731752 --- /dev/null +++ b/ktx/build/docs/html/libktx/strings_8c.js @@ -0,0 +1,7 @@ +var strings_8c = +[ + [ "ktxBUImageFlagsBitString", "strings_8c.html#aa9077e4635ae86d84ec8bcb025d6b373", null ], + [ "ktxErrorString", "strings_8c.html#a252d7741a00562fbe2fd9d91d54d873b", null ], + [ "ktxSupercompressionSchemeString", "strings_8c.html#a68c7368105d35f01b54573f22ecbe5fb", null ], + [ "ktxTranscodeFormatString", "strings_8c.html#a25b70a70161c149687d0ca19fc839b81", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/strings_8c__incl.map b/ktx/build/docs/html/libktx/strings_8c__incl.map new file mode 100644 index 0000000..06ec965 --- /dev/null +++ b/ktx/build/docs/html/libktx/strings_8c__incl.map @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/libktx/strings_8c__incl.md5 b/ktx/build/docs/html/libktx/strings_8c__incl.md5 new file mode 100644 index 0000000..b65ca9a --- /dev/null +++ b/ktx/build/docs/html/libktx/strings_8c__incl.md5 @@ -0,0 +1 @@ +b501aae1b3b90d2ba102c653b08248d0 \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/strings_8c__incl.png b/ktx/build/docs/html/libktx/strings_8c__incl.png new file mode 100644 index 0000000..dd5caa1 Binary files /dev/null and b/ktx/build/docs/html/libktx/strings_8c__incl.png differ diff --git a/ktx/build/docs/html/libktx/structktxAstcParams.html b/ktx/build/docs/html/libktx/structktxAstcParams.html new file mode 100644 index 0000000..b56dc30 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxAstcParams.html @@ -0,0 +1,271 @@ + + + + + + + +libktx Reference: ktxAstcParams Struct Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxAstcParams Struct Reference
        +
        +
        + +

        Structure for passing extended parameters to ktxTexture_CompressAstc. + More...

        + +

        #include <ktx.h>

        + + + + + + + + + + + +

        +Data Fields

        ktx_uint32_t structSize
        ktx_bool_t verbose
        ktx_uint32_t threadCount
        ktx_uint32_t blockDimension
        ktx_uint32_t mode
        ktx_uint32_t qualityLevel
        ktx_bool_t normalMap
        ktx_bool_t perceptual
        char inputSwizzle [4]
        +

        Detailed Description

        +

        Structure for passing extended parameters to ktxTexture_CompressAstc.

        +

        Passing a struct initialized to 0 (e.g. " = {0};") will use blockDimension 4x4, mode LDR and qualityLevel FASTEST. Setting qualityLevel to KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM is recommended.

        +

        Field Documentation

        + +

        ◆ blockDimension

        + +
        +
        + + + + +
        ktx_uint32_t blockDimension
        +
        +

        Combinations of block dimensions that astcenc supports i.e. 6x6, 8x8, 6x5 etc

        + +
        +
        + +

        ◆ inputSwizzle

        + +
        +
        + + + + +
        char inputSwizzle[4]
        +
        +

        A swizzle to provide as input to astcenc. It must match the regular expression /^[rgba01]{4}$/.

        + +
        +
        + +

        ◆ mode

        + +
        +
        + + + + +
        ktx_uint32_t mode
        +
        +

        Can be {ldr/hdr} from astcenc

        + +
        +
        + +

        ◆ normalMap

        + +
        +
        + + + + +
        ktx_bool_t normalMap
        +
        +

        Tunes codec parameters for better quality on normal maps In this mode normals are compressed to X,Y components Discarding Z component, reader will need to generate Z component in shaders.

        + +
        +
        + +

        ◆ perceptual

        + +
        +
        + + + + +
        ktx_bool_t perceptual
        +
        +

        The codec should optimize for perceptual error, instead of direct RMS error. This aims to improves perceived image quality, but typically lowers the measured PSNR score. Perceptual methods are currently only available for normal maps and RGB color data.

        + +
        +
        + +

        ◆ qualityLevel

        + +
        +
        + + + + +
        ktx_uint32_t qualityLevel
        +
        +

        astcenc supports -fastest, -fast, -medium, -thorough, -exhaustive

        + +
        +
        + +

        ◆ structSize

        + +
        +
        + + + + +
        ktx_uint32_t structSize
        +
        +

        Size of this struct. Used so library can tell which version of struct is being passed.

        + +
        +
        + +

        ◆ threadCount

        + +
        +
        + + + + +
        ktx_uint32_t threadCount
        +
        +

        Number of threads used for compression. Default is 1.

        + +
        +
        + +

        ◆ verbose

        + +
        +
        + + + + +
        ktx_bool_t verbose
        +
        +

        If true, prints Astc encoder operation details to stdout. Not recommended for GUI apps.

        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxAstcParams.js b/ktx/build/docs/html/libktx/structktxAstcParams.js new file mode 100644 index 0000000..fd1e603 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxAstcParams.js @@ -0,0 +1,12 @@ +var structktxAstcParams = +[ + [ "blockDimension", "structktxAstcParams.html#a7a2b8fd2f04b2990c176606e45a02c22", null ], + [ "inputSwizzle", "structktxAstcParams.html#a0d67004efa49e08a7f39f71c93286b0a", null ], + [ "mode", "structktxAstcParams.html#aa02c398f7c7872860347560f4a33fd57", null ], + [ "normalMap", "structktxAstcParams.html#a59af70a939f66dce9749174c12cc3725", null ], + [ "perceptual", "structktxAstcParams.html#aaee2c7f8b6f18e5e44a7efc72a5099c8", null ], + [ "qualityLevel", "structktxAstcParams.html#aac5068885c586a1454efbf2e9cf4b3ed", null ], + [ "structSize", "structktxAstcParams.html#a51fe881fb2eae346ba017f7f55a1d642", null ], + [ "threadCount", "structktxAstcParams.html#a04aa92e2192b36b2d9701d23fd246386", null ], + [ "verbose", "structktxAstcParams.html#a6ca13a756a2066f8082772b9207e4bba", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxBasisParams.html b/ktx/build/docs/html/libktx/structktxBasisParams.html new file mode 100644 index 0000000..65baf19 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxBasisParams.html @@ -0,0 +1,550 @@ + + + + + + + +libktx Reference: ktxBasisParams Struct Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxBasisParams Struct Reference
        +
        +
        + +

        Structure for passing extended parameters to ktxTexture2_CompressBasisEx(). + More...

        + +

        #include <ktx.h>

        + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Data Fields

        ktx_uint32_t structSize
        ktx_bool_t uastc
        ktx_bool_t verbose
        ktx_bool_t noSSE
        ktx_uint32_t threadCount
        ktx_uint32_t compressionLevel
        ktx_uint32_t qualityLevel
        ktx_uint32_t maxEndpoints
        float endpointRDOThreshold
        ktx_uint32_t maxSelectors
        float selectorRDOThreshold
        char inputSwizzle [4]
        ktx_bool_t normalMap
        ktx_bool_t separateRGToRGB_A
        ktx_bool_t preSwizzle
        ktx_bool_t noEndpointRDO
        ktx_bool_t noSelectorRDO
        ktx_pack_uastc_flags uastcFlags
        ktx_bool_t uastcRDO
        float uastcRDOQualityScalar
        ktx_uint32_t uastcRDODictSize
        float uastcRDOMaxSmoothBlockErrorScale
        float uastcRDOMaxSmoothBlockStdDev
        ktx_bool_t uastcRDODontFavorSimplerModes
        ktx_bool_t uastcRDONoMultithreading
        +

        Detailed Description

        +

        Structure for passing extended parameters to ktxTexture2_CompressBasisEx().

        +

        If you only want default values, use ktxTexture2_CompressBasis(). Here, at a minimum you must initialize the structure as follows:

        ktxBasisParams params = {0};
        +
        params.structSize = sizeof(params);
        +
        params.compressionLevel = KTX_ETC1S_DEFAULT_COMPRESSION_LEVEL;
        +
        Structure for passing extended parameters to ktxTexture2_CompressBasisEx().
        Definition ktx.h:1379
        +
        ktx_uint32_t compressionLevel
        Definition ktx.h:1398
        +
        ktx_uint32_t structSize
        Definition ktx.h:1380
        +

        compressionLevel has to be explicitly set because 0 is a valid compressionLevel but is not the default used by the BasisU encoder when no value is set. Only the other settings that are to be non-default must be non-zero.

        +

        Field Documentation

        + +

        ◆ compressionLevel

        + +
        +
        + + + + +
        ktx_uint32_t compressionLevel
        +
        +

        Encoding speed vs. quality tradeoff. Range is [0,6]. Higher values are much slower, but give slightly higher quality. Higher levels are intended for video. There is no default. Callers must explicitly set this value. Callers can use KTX_ETC1S_DEFAULT_COMPRESSION_LEVEL as a default value. Currently this is 2.

        + +
        +
        + +

        ◆ endpointRDOThreshold

        + +
        +
        + + + + +
        float endpointRDOThreshold
        +
        +

        Set endpoint RDO quality threshold. The default is 1.25. Lower is higher quality but less quality per output bit (try [1.0,3.0]. This will override the value chosen by qualityLevel.

        + +
        +
        + +

        ◆ inputSwizzle

        + +
        +
        + + + + +
        char inputSwizzle[4]
        +
        +

        A swizzle to apply before encoding. It must match the regular expression /^[rgba01]{4}$/. If both this and preSwizzle are specified ktxTexture_CompressBasisEx will raise KTX_INVALID_OPERATION. Usable with both ETC1S and UASTC.

        + +
        +
        + +

        ◆ maxEndpoints

        + +
        +
        + + + + +
        ktx_uint32_t maxEndpoints
        +
        +

        Manually set the max number of color endpoint clusters. Range is [1,16128]. Default is 0, unset. If this is set, maxSelectors must also be set, otherwise the value will be ignored.

        + +
        +
        + +

        ◆ maxSelectors

        + +
        +
        + + + + +
        ktx_uint32_t maxSelectors
        +
        +

        Manually set the max number of color selector clusters. Range is [1,16128]. Default is 0, unset. If this is set, maxEndpoints must also be set, otherwise the value will be ignored.

        + +
        +
        + +

        ◆ noEndpointRDO

        + +
        +
        + + + + +
        ktx_bool_t noEndpointRDO
        +
        +

        Disable endpoint rate distortion optimizations. Slightly faster, less noisy output, but lower quality per output bit. Default is KTX_FALSE.

        + +
        +
        + +

        ◆ normalMap

        + +
        +
        + + + + +
        ktx_bool_t normalMap
        +
        +

        Tunes codec parameters for better quality on normal maps (no selector RDO, no endpoint RDO) and sets the texture's DFD appropriately. Only valid for linear textures.

        + +
        +
        + +

        ◆ noSelectorRDO

        + +
        +
        + + + + +
        ktx_bool_t noSelectorRDO
        +
        +

        Disable selector rate distortion optimizations. Slightly faster, less noisy output, but lower quality per output bit. Default is KTX_FALSE.

        + +
        +
        + +

        ◆ noSSE

        + +
        +
        + + + + +
        ktx_bool_t noSSE
        +
        +

        True to forbid use of the SSE instruction set. Ignored if CPU does not support SSE.

        + +
        +
        + +

        ◆ preSwizzle

        + +
        +
        + + + + +
        ktx_bool_t preSwizzle
        +
        +

        If the texture has KTXswizzle metadata, apply it before compressing. Swizzling, like rabb may yield drastically different error metrics if done after supercompression. Usable for both ETC1S and UASTC.

        + +
        +
        + +

        ◆ qualityLevel

        + +
        +
        + + + + +
        ktx_uint32_t qualityLevel
        +
        +

        Compression quality. Range is [1,255]. Lower gives better compression/lower quality/faster. Higher gives less compression /higher quality/slower. This automatically determines values for maxEndpoints, maxSelectors, endpointRDOThreshold and selectorRDOThreshold for the target quality level. Setting these parameters overrides the values determined by qualityLevel which defaults to 128 if neither it nor both of maxEndpoints and maxSelectors have been set.

        Note
        Both of maxEndpoints and maxSelectors must be set for them to have any effect.
        +
        +qualityLevel will only determine values for endpointRDOThreshold and selectorRDOThreshold when its value exceeds 128, otherwise their defaults will be used.
        + +
        +
        + +

        ◆ selectorRDOThreshold

        + +
        +
        + + + + +
        float selectorRDOThreshold
        +
        +

        Set selector RDO quality threshold. The default is 1.5. Lower is higher quality but less quality per output bit (try [1.0,3.0]). This will override the value chosen by qualityLevel.

        + +
        +
        + +

        ◆ separateRGToRGB_A

        + +
        +
        + + + + +
        ktx_bool_t separateRGToRGB_A
        +
        +
        Deprecated
        This was and is a no-op. 2-component inputs have always been automatically separated using an "rrrg" inputSwizzle.
        +
        See also
        inputSwizzle and normalMode.
        + +
        +
        + +

        ◆ structSize

        + +
        +
        + + + + +
        ktx_uint32_t structSize
        +
        +

        Size of this struct. Used so library can tell which version of struct is being passed.

        + +
        +
        + +

        ◆ threadCount

        + +
        +
        + + + + +
        ktx_uint32_t threadCount
        +
        +

        Number of threads used for compression. Default is 1.

        + +
        +
        + +

        ◆ uastc

        + +
        +
        + + + + +
        ktx_bool_t uastc
        +
        +

        True to use UASTC base, false to use ETC1S base.

        + +
        +
        + +

        ◆ uastcFlags

        + +
        +
        + + + + +
        ktx_pack_uastc_flags uastcFlags
        +
        +

        A set of ktx_pack_uastc_flag_bits_e controlling UASTC encoding. The most important value is the level given in the least-significant 4 bits which selects a speed vs quality tradeoff as shown in the following table:

        + + + + + + + + + + + + + +
        Level/Speed Quality
        KTX_PACK_UASTC_LEVEL_FASTEST 43.45dB
        KTX_PACK_UASTC_LEVEL_FASTER 46.49dB
        KTX_PACK_UASTC_LEVEL_DEFAULT 47.47dB
        KTX_PACK_UASTC_LEVEL_SLOWER 48.01dB
        KTX_PACK_UASTC_LEVEL_VERYSLOW 48.24dB
        + +
        +
        + +

        ◆ uastcRDO

        + +
        +
        + + + + +
        ktx_bool_t uastcRDO
        +
        +

        Enable Rate Distortion Optimization (RDO) post-processing.

        + +
        +
        + +

        ◆ uastcRDODictSize

        + +
        +
        + + + + +
        ktx_uint32_t uastcRDODictSize
        +
        +

        UASTC RDO dictionary size in bytes. Default is 4096. Lower values=faster, but give less compression. Range is [64,65536].

        + +
        +
        + +

        ◆ uastcRDODontFavorSimplerModes

        + +
        +
        + + + + +
        ktx_bool_t uastcRDODontFavorSimplerModes
        +
        +

        Do not favor simpler UASTC modes in RDO mode.

        + +
        +
        + +

        ◆ uastcRDOMaxSmoothBlockErrorScale

        + +
        +
        + + + + +
        float uastcRDOMaxSmoothBlockErrorScale
        +
        +

        UASTC RDO max smooth block error scale. Range is [1,300]. Default is 10.0, 1.0 is disabled. Larger values suppress more artifacts (and allocate more bits) on smooth blocks.

        + +
        +
        + +

        ◆ uastcRDOMaxSmoothBlockStdDev

        + +
        +
        + + + + +
        float uastcRDOMaxSmoothBlockStdDev
        +
        +

        UASTC RDO max smooth block standard deviation. Range is [.01,65536.0]. Default is 18.0. Larger values expand the range of blocks considered smooth.

        + +
        +
        + +

        ◆ uastcRDONoMultithreading

        + +
        +
        + + + + +
        ktx_bool_t uastcRDONoMultithreading
        +
        +

        Disable RDO multithreading (slightly higher compression, deterministic).

        + +
        +
        + +

        ◆ uastcRDOQualityScalar

        + +
        +
        + + + + +
        float uastcRDOQualityScalar
        +
        +

        UASTC RDO quality scalar (lambda). Lower values yield higher quality/larger LZ compressed files, higher values yield lower quality/smaller LZ compressed files. A good range to try is [.2,4]. Full range is [.001,50.0]. Default is 1.0.

        + +
        +
        + +

        ◆ verbose

        + +
        +
        + + + + +
        ktx_bool_t verbose
        +
        +

        If true, prints Basis Universal encoder operation details to stdout. Not recommended for GUI apps.

        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxBasisParams.js b/ktx/build/docs/html/libktx/structktxBasisParams.js new file mode 100644 index 0000000..cbe6b22 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxBasisParams.js @@ -0,0 +1,28 @@ +var structktxBasisParams = +[ + [ "compressionLevel", "structktxBasisParams.html#a27652d35542830750e195ab57dd1f3b1", null ], + [ "endpointRDOThreshold", "structktxBasisParams.html#aafccbc4e43845f62cf500d4792c7cf6a", null ], + [ "inputSwizzle", "structktxBasisParams.html#a0d67004efa49e08a7f39f71c93286b0a", null ], + [ "maxEndpoints", "structktxBasisParams.html#a47519cb97d15ade856f899023eab9960", null ], + [ "maxSelectors", "structktxBasisParams.html#a93a37769ec5b285051083aa8457e1d1a", null ], + [ "noEndpointRDO", "structktxBasisParams.html#a24b0d409b2fbd536216196ca4e27358f", null ], + [ "normalMap", "structktxBasisParams.html#a59af70a939f66dce9749174c12cc3725", null ], + [ "noSelectorRDO", "structktxBasisParams.html#a740b64ff37292977ab3cf04d3fb3cd6b", null ], + [ "noSSE", "structktxBasisParams.html#a0024310d24bafd33ab41de3bd7dd6887", null ], + [ "preSwizzle", "structktxBasisParams.html#a13bd0ffd0161a44f84482ece6b270ce7", null ], + [ "qualityLevel", "structktxBasisParams.html#aac5068885c586a1454efbf2e9cf4b3ed", null ], + [ "selectorRDOThreshold", "structktxBasisParams.html#aea4a4f651952b4831fdfc784f7058866", null ], + [ "separateRGToRGB_A", "structktxBasisParams.html#a2b5e77802a353a04d6b8d1d848f98d47", null ], + [ "structSize", "structktxBasisParams.html#a51fe881fb2eae346ba017f7f55a1d642", null ], + [ "threadCount", "structktxBasisParams.html#a04aa92e2192b36b2d9701d23fd246386", null ], + [ "uastc", "structktxBasisParams.html#ac9363a20b43cebc11ab690aec5fbd38d", null ], + [ "uastcFlags", "structktxBasisParams.html#ad09ee28fdd7fcd267771deb3d11c2cee", null ], + [ "uastcRDO", "structktxBasisParams.html#a762083beb362fc21fc96f9fec210f2cb", null ], + [ "uastcRDODictSize", "structktxBasisParams.html#a2db4d897c3dddf44f94be794f242343c", null ], + [ "uastcRDODontFavorSimplerModes", "structktxBasisParams.html#a2800eb7a62ed740bd4e13af330058f75", null ], + [ "uastcRDOMaxSmoothBlockErrorScale", "structktxBasisParams.html#a144c86b7675a79226b2e88a008078cc8", null ], + [ "uastcRDOMaxSmoothBlockStdDev", "structktxBasisParams.html#aacf2963f160d1079e6abccc81e17f7c4", null ], + [ "uastcRDONoMultithreading", "structktxBasisParams.html#a8de3ee72ab61a663a495f174796a7b17", null ], + [ "uastcRDOQualityScalar", "structktxBasisParams.html#a1214b8b4eca85e666bf92862e0f22aeb", null ], + [ "verbose", "structktxBasisParams.html#a6ca13a756a2066f8082772b9207e4bba", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxOrientation.html b/ktx/build/docs/html/libktx/structktxOrientation.html new file mode 100644 index 0000000..4ca88af --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxOrientation.html @@ -0,0 +1,174 @@ + + + + + + + +libktx Reference: ktxOrientation Struct Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxOrientation Struct Reference
        +
        +
        + +

        Struct describing the logical orientation of an image. + More...

        + +

        #include <ktx.h>

        + + + + + +

        +Data Fields

        ktxOrientationX x
        ktxOrientationY y
        ktxOrientationZ z
        +

        Detailed Description

        +

        Struct describing the logical orientation of an image.

        +

        Field Documentation

        + +

        ◆ x

        + +
        +
        + + + + +
        ktxOrientationX x
        +
        +

        Orientation in X

        + +
        +
        + +

        ◆ y

        + +
        +
        + + + + +
        ktxOrientationY y
        +
        +

        Orientation in Y

        + +
        +
        + +

        ◆ z

        + +
        +
        + + + + +
        ktxOrientationZ z
        +
        +

        Orientation in Z

        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxOrientation.js b/ktx/build/docs/html/libktx/structktxOrientation.js new file mode 100644 index 0000000..4eef0e8 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxOrientation.js @@ -0,0 +1,6 @@ +var structktxOrientation = +[ + [ "x", "structktxOrientation.html#aadb7ef15109e0b085f668c34f4d90206", null ], + [ "y", "structktxOrientation.html#aa0c25b8b8a3e79bd0ba427da21d3a88f", null ], + [ "z", "structktxOrientation.html#a1f9b804769fed960e686ccc4eca40b0f", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxStream.html b/ktx/build/docs/html/libktx/structktxStream.html new file mode 100644 index 0000000..de60bf0 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxStream.html @@ -0,0 +1,400 @@ + + + + + + + +libktx Reference: ktxStream Struct Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxStream Struct Reference
        +
        +
        + +

        Interface of ktxStream. + More...

        + +

        #include <ktx.h>

        +
        +Collaboration diagram for ktxStream:
        +
        +
        Collaboration graph
        + + + + + + +
        [legend]
        + + + + + + + + + + + + + + + + + + + + +

        +Data Fields

        ktxStream_read read
        ktxStream_skip skip
        ktxStream_write write
        ktxStream_getpos getpos
        ktxStream_setpos setpos
        ktxStream_getsize getsize
        ktxStream_destruct destruct
        union { 
           FILE *   file 
           ktxMem *   mem 
           struct { 
              void *   address 
              void *   allocatorAddress 
              ktx_size_t   size 
           }   custom_ptr
        data
        ktx_off_t readpos
        ktx_bool_t closeOnDestruct
        +

        Detailed Description

        +

        Interface of ktxStream.

        +
        Author
        Maksim Kolesin
        +
        +Georg Kolling, Imagination Technology
        +
        +Mark Callow, HI Corporation
        +

        Field Documentation

        + +

        ◆ address

        + +
        +
        + + + + +
        void* address
        +
        +

        pointer to the data.

        + +
        +
        + +

        ◆ allocatorAddress

        + +
        +
        + + + + +
        void* allocatorAddress
        +
        +

        pointer to a memory allocator.

        + +
        +
        + +

        ◆ closeOnDestruct

        + +
        +
        + + + + +
        ktx_bool_t closeOnDestruct
        +
        +

        Close FILE* or dispose of memory on destruct.

        + +
        +
        + +

        ◆ [struct]

        + +
        +
        + + + + +
        struct { ... } custom_ptr
        +
        +

        pointer to a struct for custom streams.

        + +
        +
        + +

        ◆ [union]

        + +
        +
        + + + + +
        union { ... } data
        +
        +

        pointer to the stream data.

        + +
        +
        + +

        ◆ destruct

        + +
        +
        + + + + +
        ktxStream_destruct destruct
        +
        +

        destruct the stream.

        + +
        +
        + +

        ◆ file

        + +
        +
        + + + + +
        FILE* file
        +
        +

        a stdio FILE pointer for a ktxFileStream.

        + +
        +
        + +

        ◆ getpos

        + +
        +
        + + + + +
        ktxStream_getpos getpos
        +
        +

        pointer to function for getting current position in stream.

        + +
        +
        + +

        ◆ getsize

        + +
        +
        + + + + +
        ktxStream_getsize getsize
        +
        +

        pointer to function for querying size.

        + +
        +
        + +

        ◆ mem

        + +
        +
        + + + + +
        ktxMem* mem
        +
        +

        a pointer to a ktxMem struct for a ktxMemStream.

        + +
        +
        + +

        ◆ read

        + +
        +
        + + + + +
        ktxStream_read read
        +
        +

        pointer to function for reading bytes.

        + +
        +
        + +

        ◆ readpos

        + +
        +
        + + + + +
        ktx_off_t readpos
        +
        +

        used by FileStream for stdin.

        + +
        +
        + +

        ◆ setpos

        + +
        +
        + + + + +
        ktxStream_setpos setpos
        +
        +

        pointer to function for setting current position in stream.

        + +
        +
        + +

        ◆ size

        + +
        +
        + + + + +
        ktx_size_t size
        +
        +

        size of the data.

        + +
        +
        + +

        ◆ skip

        + +
        +
        + + + + +
        ktxStream_skip skip
        +
        +

        pointer to function for skipping bytes.

        + +
        +
        + +

        ◆ write

        + +
        +
        + + + + +
        ktxStream_write write
        +
        +

        pointer to function for writing bytes.

        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxStream.js b/ktx/build/docs/html/libktx/structktxStream.js new file mode 100644 index 0000000..4a0c150 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxStream.js @@ -0,0 +1,19 @@ +var structktxStream = +[ + [ "address", "structktxStream.html#ab96816d317aa5196e2ef198d9a8d621b", null ], + [ "allocatorAddress", "structktxStream.html#a6de39e2650d144d37e3f2c32081dd55f", null ], + [ "closeOnDestruct", "structktxStream.html#abac8ddd51b8b30aee6c98a1ab2adef13", null ], + [ "custom_ptr", "structktxStream.html#a26a82a7cdf288fc1a7e2b77ecb9d1d38", null ], + [ "data", "structktxStream.html#a01015dd5ef6b90112358effdee79a6bc", null ], + [ "destruct", "structktxStream.html#a1215c8b33ba64ba53bd86134ae80c1d6", null ], + [ "file", "structktxStream.html#a702945180aa732857b380a007a7e2a21", null ], + [ "getpos", "structktxStream.html#adcabf99e783fe9ca551ac9706372400c", null ], + [ "getsize", "structktxStream.html#a76bd679ca3d583cc56c524e53665e775", null ], + [ "mem", "structktxStream.html#a2f3b4c3238e6625fb92d53b1c62389cb", null ], + [ "read", "structktxStream.html#a723def611194cfe6570ae5b94bdee904", null ], + [ "readpos", "structktxStream.html#a9d2fb0a8f4454c78013c49b914c603b6", null ], + [ "setpos", "structktxStream.html#aba03500510363a0b45025645ba4327cf", null ], + [ "size", "structktxStream.html#ab3d4a868dd03d0fa92cdb5e5fd99ba50", null ], + [ "skip", "structktxStream.html#ad224d1f8e4291a2e66e090b3c6df3698", null ], + [ "write", "structktxStream.html#ae6018760261edc9387c2123395a1447a", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxStream__coll__graph.map b/ktx/build/docs/html/libktx/structktxStream__coll__graph.map new file mode 100644 index 0000000..a43aef6 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxStream__coll__graph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/ktx/build/docs/html/libktx/structktxStream__coll__graph.md5 b/ktx/build/docs/html/libktx/structktxStream__coll__graph.md5 new file mode 100644 index 0000000..3a88256 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxStream__coll__graph.md5 @@ -0,0 +1 @@ +83104ef5f413b67220ea277a0054ef4a \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxStream__coll__graph.png b/ktx/build/docs/html/libktx/structktxStream__coll__graph.png new file mode 100644 index 0000000..f9f8470 Binary files /dev/null and b/ktx/build/docs/html/libktx/structktxStream__coll__graph.png differ diff --git a/ktx/build/docs/html/libktx/structktxTexture.html b/ktx/build/docs/html/libktx/structktxTexture.html new file mode 100644 index 0000000..cf75b31 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture.html @@ -0,0 +1,455 @@ + + + + + + + +libktx Reference: ktxTexture Class Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxTexture Class Reference
        +
        +
        + +

        Base class representing a texture. + More...

        + +

        #include <ktx.h>

        +
        +Collaboration diagram for ktxTexture:
        +
        +
        Collaboration graph
        + + + + + + + + +
        [legend]
        + + + + + + + + + + +

        +Public Types

        enum  ktxTextureCreateStorageEnum
         Enum for requesting, or not, allocation of storage for images. More...
        enum  ktxTextureCreateFlagBits
         Flags for requesting services during creation. More...
        typedef KTX_error_code(* PFNKTXITERCB) (int miplevel, int face, int width, int height, int depth, ktx_uint64_t faceLodSize, void *pixels, void *userdata)
         Signature of function called by the ktxTexture_Iterate* functions to receive image data.
        typedef ktx_uint32_t ktxTextureCreateFlags
         Type for TextureCreateFlags parameters.
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

        KTX_error_code ktxTexture_GLUpload (ktxTexture *This, GLuint *pTexture, GLenum *pTarget, GLenum *pGlerror)
         Create a GL texture object from a ktxTexture object.
        KTX_error_code ktxTexture_CreateFromStream (ktxStream *pStream, ktxTextureCreateFlags createFlags, ktxTexture **newTex)
         Create a ktx1 or ktx2 texture according to the stream data.
        KTX_error_code ktxTexture_CreateFromStdioStream (FILE *stdioStream, ktxTextureCreateFlags createFlags, ktxTexture **newTex)
         Create a ktxTexture1 or ktxTexture2 from a stdio stream according to the stream data.
        KTX_error_code ktxTexture_CreateFromNamedFile (const char *const filename, ktxTextureCreateFlags createFlags, ktxTexture **newTex)
         Create a ktxTexture1 or ktxTexture2 from a named KTX file according to the file contents.
        KTX_error_code ktxTexture_CreateFromMemory (const ktx_uint8_t *bytes, ktx_size_t size, ktxTextureCreateFlags createFlags, ktxTexture **newTex)
         Create a ktxTexture1 or ktxTexture2 from KTX-formatted data in memory according to the data contents.
        ktx_uint8_t * ktxTexture_GetData (ktxTexture *This)
         Return a pointer to the texture image data.
        ktx_size_t ktxTexture_GetDataSize (ktxTexture *This)
         Return the total size of the texture image data in bytes.
        ktx_uint32_t ktxTexture_GetElementSize (ktxTexture *This)
         Return the size in bytes of an elements of a texture's images.
        KTX_error_code ktxTexture_IterateLevelFaces (ktxTexture *This, PFNKTXITERCB iterCb, void *userdata)
         Iterate over the levels or faces in a ktxTexture object.
        ktx_uint32_t ktxTexture_GetRowPitch (ktxTexture *This, ktx_uint32_t level)
         Return pitch between rows of a texture image level in bytes.
        KTX_error_code ktxTexture_VkUploadEx_WithSuballocator (ktxTexture *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, ktxVulkanTexture_subAllocatorCallbacks *subAllocatorCallbacks)
         Create a Vulkan image object from a ktxTexture object.
        KTX_error_code ktxTexture_VkUploadEx (ktxTexture *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)
         Create a Vulkan image object from a ktxTexture object.
        KTX_error_code ktxTexture_VkUpload (ktxTexture *texture, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture)
         Create a Vulkan image object from a ktxTexture object.
        VkFormat ktxTexture_GetVkFormat (ktxTexture *This)
         Return the VkFormat enum of a ktxTexture object.
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Data Fields

        class_id classId
         Identify the class type.
        +struct ktxTexture_vtblvtbl
         Pointer to the class's vtble.
        struct ktxTexture_vvtbl * vvtbl
         Pointer to the class's vtble for Vulkan functions.
        +struct ktxTexture_protected * _protected
         Opaque pointer to the class's protected variables.
        ktx_bool_t isArray
        ktx_bool_t isCubemap
        ktx_bool_t isCompressed
        ktx_bool_t generateMipmaps
        +ktx_uint32_t baseWidth
         Width of the texture's base level.
        +ktx_uint32_t baseHeight
         Height of the texture's base level.
        +ktx_uint32_t baseDepth
         Depth of the texture's base level.
        +ktx_uint32_t numDimensions
         Number of dimensions in the texture: 1, 2 or 3.
        ktx_uint32_t numLevels
         Number of mip levels in the texture.
        +ktx_uint32_t numFaces
         Number of faces: 6 for cube maps, 1 otherwise.
        struct { 
        orientation
         Describes the logical orientation of the images in each dimension.
        +ktxHashList kvDataHead
         Head of the hash list of metadata.
        +ktx_uint32_t kvDataLen
         Length of the metadata, if it has been extracted in its raw form, otherwise 0.
        +ktx_uint8_t * kvData
         Pointer to the metadata, if it has been extracted in its raw form, otherwise NULL.
        +ktx_size_t dataSize
         Byte length of the texture's uncompressed image data.
        +ktx_uint8_t * pData
         Pointer to the start of the image data.
        +

        Detailed Description

        +

        Base class representing a texture.

        +

        ktxTextures should be created only by one of the provided functions and these fields should be considered read-only.

        +
        Examples
        glloader.c, and vkload.cpp.
        +
        +

        Member Typedef Documentation

        + +

        ◆ ktxTextureCreateFlags

        + +
        +
        + + + + +
        typedef ktx_uint32_t ktxTextureCreateFlags
        +
        + +

        Type for TextureCreateFlags parameters.

        +
        See also
        ktxTexture_CreateFrom*()
        + +
        +
        + +

        ◆ PFNKTXITERCB

        + +
        +
        + + + + +
        typedef KTX_error_code(* PFNKTXITERCB) (int miplevel, int face, int width, int height, int depth, ktx_uint64_t faceLodSize, void *pixels, void *userdata)
        +
        + +

        Signature of function called by the ktxTexture_Iterate* functions to receive image data.

        +

        The function parameters are used to pass values which change for each image. Obtain values which are uniform across all images from the ktxTexture object.

        +
        Parameters
        + + + + + + + + + +
        [in]miplevelMIP level from 0 to the max level which is dependent on the texture size.
        [in]faceusually 0; for cube maps, one of the 6 cube faces in the order +X, -X, +Y, -Y, +Z, -Z, 0 to 5.
        [in]widthwidth of the image.
        [in]heightheight of the image or, for 1D textures textures, 1.
        [in]depthdepth of the image or, for 1D & 2D textures, 1.
        [in]faceLodSizenumber of bytes of data pointed at by pixels.
        [in]pixelspointer to the image data.
        [in,out]userdatapointer for the application to pass data to and from the callback function.
        +
        +
        + +
        +
        +

        Member Enumeration Documentation

        + +

        ◆ ktxTextureCreateFlagBits

        + +
        +
        + + + + +
        enum ktxTextureCreateFlagBits
        +
        + +

        Flags for requesting services during creation.

        +
        See also
        ktxTexture_CreateFrom*
        + +
        +
        + +

        ◆ ktxTextureCreateStorageEnum

        + +
        +
        + + + + +
        enum ktxTextureCreateStorageEnum
        +
        + +

        Enum for requesting, or not, allocation of storage for images.

        +
        See also
        ktxTexture1_Create() and ktxTexture2_Create().
        + +
        +
        +

        Field Documentation

        + +

        ◆ classId

        + +
        +
        + + + + +
        class_id classId
        +
        + +

        Identify the class type.

        +

        Since there are no public ktxTexture constructors, this can only have values of ktxTexture1_c or ktxTexture2_c.

        +
        Examples
        glloader.c.
        +
        + +
        +
        + +

        ◆ generateMipmaps

        + +
        +
        + + + + +
        ktx_bool_t generateMipmaps
        +
        +

        KTX_TRUE if mipmaps should be generated for the texture by ktxTexture_GLUpload() or ktxTexture_VkUpload().

        +
        Examples
        glloader.c.
        +
        + +
        +
        + +

        ◆ isArray

        + +
        +
        + + + + +
        ktx_bool_t isArray
        +
        +

        KTX_TRUE if the texture is an array texture, i.e, a GL_TEXTURE_*_ARRAY target is to be used.

        +
        Examples
        glloader.c.
        +
        + +
        +
        + +

        ◆ isCompressed

        + +
        +
        + + + + +
        ktx_bool_t isCompressed
        +
        +

        KTX_TRUE if the texture's format is a block compressed format.

        +
        Examples
        glloader.c.
        +
        + +
        +
        + +

        ◆ isCubemap

        + +
        +
        + + + + +
        ktx_bool_t isCubemap
        +
        +

        KTX_TRUE if the texture is a cubemap or cubemap array.

        + +
        +
        + +

        ◆ numLevels

        + +
        +
        + + + + +
        ktx_uint32_t numLevels
        +
        + +

        Number of mip levels in the texture.

        +

        Number of array layers in the texture.

        +

        Must be 1, if generateMipmaps is KTX_TRUE. Can be less than a full pyramid but always starts at the base level.

        +
        Examples
        glloader.c.
        +
        + +
        +
        + +

        ◆ [struct]

        + +
        +
        + + + + +
        struct { ... } orientation
        +
        + +

        Describes the logical orientation of the images in each dimension.

        +

        ktxOrientationX for X, ktxOrientationY for Y and ktxOrientationZ for Z.

        + +
        +
        + +

        ◆ vvtbl

        + +
        +
        + + + + +
        struct ktxTexture_vvtbl* vvtbl
        +
        + +

        Pointer to the class's vtble for Vulkan functions.

        +

        A separate vtble is used so this header does not need to include vulkan.h.

        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxTexture.js b/ktx/build/docs/html/libktx/structktxTexture.js new file mode 100644 index 0000000..d8170a8 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture.js @@ -0,0 +1,41 @@ +var structktxTexture = +[ + [ "ktxTextureCreateFlags", "structktxTexture.html#a1cce9de12eb3974a236becfd098bd057", null ], + [ "PFNKTXITERCB", "structktxTexture.html#aca6d87118e724ac77f17e0576e191513", null ], + [ "ktxTextureCreateFlagBits", "structktxTexture.html#ac184edbb9898b55efbbd80f635946545", null ], + [ "ktxTextureCreateStorageEnum", "structktxTexture.html#af0602c48f60fc85c4d59c1c58f624a2b", null ], + [ "ktxTexture_CreateFromMemory", "group__reader.html#gaf1e401967a687b40cdf7bba11e72c2b4", null ], + [ "ktxTexture_CreateFromNamedFile", "group__reader.html#ga57a1ce0d3f2d66439463160d6ce9d2d0", null ], + [ "ktxTexture_CreateFromStdioStream", "group__reader.html#ga180d93562cc6af30c61adf8f6a8fd827", null ], + [ "ktxTexture_CreateFromStream", "group__reader.html#gaa8dfc7a981b69d26eab73c5405d7182b", null ], + [ "ktxTexture_GetData", "group__reader.html#gace44d98fa78b94c282016e7cf8a88b7e", null ], + [ "ktxTexture_GetDataSize", "group__reader.html#ga553c3438e75628c6d7e2280989e539c4", null ], + [ "ktxTexture_GetElementSize", "group__reader.html#ga19d8786eea0e62ab55d945bff838d32c", null ], + [ "ktxTexture_GetRowPitch", "group__reader.html#gacf9e393ff766982ccb79ad915975971f", null ], + [ "ktxTexture_GetVkFormat", "group__ktx__vkloader.html#ga3ef2792fb0cd184636180ae0a540b872", null ], + [ "ktxTexture_GLUpload", "group__ktx__glloader.html#ga516367e94731f99a23a83fb029e9a441", null ], + [ "ktxTexture_IterateLevelFaces", "group__reader.html#gae7c4b8bbe26379f2076f93050c0673c1", null ], + [ "ktxTexture_VkUpload", "group__ktx__vkloader.html#ga377a4a2c177956ea661549ee502d60da", null ], + [ "ktxTexture_VkUploadEx", "group__ktx__vkloader.html#ga153164adbd7307ad1844c3e117faa325", null ], + [ "ktxTexture_VkUploadEx_WithSuballocator", "group__ktx__vkloader.html#ga8d9b0820e70dd0239b2c1bdc0a7713f7", null ], + [ "_protected", "structktxTexture.html#ad1e7a90bd204e54ada5057631f5bdf02", null ], + [ "baseDepth", "structktxTexture.html#a71d7762f2b0dd61d57c0a7ec31ee46ac", null ], + [ "baseHeight", "structktxTexture.html#afe7371a26104de3e131e82cf5cc39e9c", null ], + [ "baseWidth", "structktxTexture.html#a3fa51cc9001702e3f1d5a69cee65adf8", null ], + [ "classId", "structktxTexture.html#a150d3ff33a9fa83ecba8e3fdda7ec972", null ], + [ "dataSize", "structktxTexture.html#af90defa509395c58549940d3b634b3e9", null ], + [ "generateMipmaps", "structktxTexture.html#a9c26601222e6a037f7dbae7b61b18fd0", null ], + [ "isArray", "structktxTexture.html#a9b5ca8c2e3fd76d8b427928775289078", null ], + [ "isCompressed", "structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650", null ], + [ "isCubemap", "structktxTexture.html#a0b4f9762223cba4cae76fefcbb413f39", null ], + [ "kvData", "structktxTexture.html#ae09811d6bd833f1a7c94db9e4538ebd7", null ], + [ "kvDataHead", "structktxTexture.html#a57141753cd2eb0967c9c071d853c5d32", null ], + [ "kvDataLen", "structktxTexture.html#a3d83b122c5c492f77abe25fc59541986", null ], + [ "numDimensions", "structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1", null ], + [ "numFaces", "structktxTexture.html#a3a4bc2fa2e41bcec0bdb265505af0068", null ], + [ "numLevels", "structktxTexture.html#a782126a62c27ee8660a14565b906694c", null ], + [ "orientation", "structktxTexture.html#a866e74b57ee9830a8153fb010101efdf", null ], + [ "pData", "structktxTexture.html#a75c773bbc36a6adb2a884eb9fb7a709f", null ], + [ "vtbl", "structktxTexture.html#ac5d732dd508289d1dda415f4c037c61f", null ], + [ "vvtbl", "structktxTexture.html#a277853ea894444859451b1f0966be15f", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxTexture1.html b/ktx/build/docs/html/libktx/structktxTexture1.html new file mode 100644 index 0000000..9771559 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture1.html @@ -0,0 +1,294 @@ + + + + + + + +libktx Reference: ktxTexture1 Class Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxTexture1 Class Reference
        +
        +
        + +

        Class representing a KTX version 1 format texture. + More...

        + +

        #include <ktx.h>

        +
        +Collaboration diagram for ktxTexture1:
        +
        +
        Collaboration graph
        + + + + + + + + + + + + + +
        [legend]
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

        KTX_error_code ktxTexture1_GLUpload (ktxTexture1 *This, GLuint *pTexture, GLenum *pTarget, GLenum *pGlerror)
         Create a GL texture object from a ktxTexture1 object.
        KTX_error_code ktxTexture1_Create (const ktxTextureCreateInfo *const createInfo, ktxTextureCreateStorageEnum storageAllocation, ktxTexture1 **newTex)
         Create a new empty ktxTexture1.
        KTX_error_code ktxTexture1_CreateFromStdioStream (FILE *stdioStream, ktxTextureCreateFlags createFlags, ktxTexture1 **newTex)
         Create a ktxTexture1 from a stdio stream reading from a KTX source.
        KTX_error_code ktxTexture1_CreateFromNamedFile (const char *const filename, ktxTextureCreateFlags createFlags, ktxTexture1 **newTex)
         Create a ktxTexture1 from a named KTX file.
        KTX_error_code ktxTexture1_CreateFromMemory (const ktx_uint8_t *bytes, ktx_size_t size, ktxTextureCreateFlags createFlags, ktxTexture1 **newTex)
         Create a ktxTexture1 from KTX-formatted data in memory.
        KTX_error_code ktxTexture1_CreateFromStream (ktxStream *pStream, ktxTextureCreateFlags createFlags, ktxTexture1 **newTex)
         Create a ktxTexture1 from KTX-formatted data from a ktxStream.
        void ktxTexture1_Destroy (ktxTexture1 *This)
         Destroy a ktxTexture1 object.
        KTX_error_code ktxTexture1_GetImageOffset (ktxTexture1 *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, ktx_size_t *pOffset)
         Find the offset of an image within a ktxTexture's image data.
        ktx_size_t ktxTexture1_GetDataSizeUncompressed (ktxTexture1 *This)
         Return the total size in bytes of the uncompressed data of a ktxTexture1.
        ktx_size_t ktxTexture1_GetImageSize (ktxTexture1 *This, ktx_uint32_t level)
         Calculate & return the size in bytes of an image at the specified mip level.
        ktx_size_t ktxTexture1_GetLevelSize (ktxTexture1 *This, ktx_uint32_t level)
         Calculate & return the size in bytes of all the images in the specified mip level.
        KTX_error_code ktxTexture1_IterateLevels (ktxTexture1 *This, PFNKTXITERCB iterCb, void *userdata)
         Iterate over the mip levels in a ktxTexture1 object.
        KTX_error_code ktxTexture1_IterateLoadLevelFaces (ktxTexture1 *This, PFNKTXITERCB iterCb, void *userdata)
         Iterate over the images in a ktxTexture1 object while loading the image data.
        KTX_error_code ktxTexture1_LoadImageData (ktxTexture1 *This, ktx_uint8_t *pBuffer, ktx_size_t bufSize)
         Load all the image data from the ktxTexture1's source.
        KTX_error_code ktxTexture1_VkUploadEx_WithSuballocator (ktxTexture1 *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, ktxVulkanTexture_subAllocatorCallbacks *subAllocatorCallbacks)
         Create a Vulkan image object from a ktxTexture1 object.
        KTX_error_code ktxTexture1_VkUploadEx (ktxTexture1 *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)
         Create a Vulkan image object from a ktxTexture1 object.
        KTX_error_code ktxTexture1_VkUpload (ktxTexture1 *texture, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture)
         Create a Vulkan image object from a ktxTexture1 object.
        VkFormat ktxTexture1_GetVkFormat (ktxTexture1 *This)
         Return the VkFormat enum of a ktxTexture1 object.
        KTX_error_code ktxTexture1_SetImageFromStdioStream (ktxTexture1 *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, FILE *src, ktx_size_t srcSize)
         Set image for level, layer, faceSlice from a stdio stream source.
        KTX_error_code ktxTexture1_SetImageFromMemory (ktxTexture1 *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, const ktx_uint8_t *src, ktx_size_t srcSize)
         Set image for level, layer, faceSlice from an image in memory.
        KTX_error_code ktxTexture1_WriteToStream (ktxTexture1 *This, ktxStream *dststr)
         Write a ktxTexture object to a ktxStream in KTX format.
        KTX_error_code ktxTexture1_WriteToStdioStream (ktxTexture1 *This, FILE *dstsstr)
         Write a ktxTexture object to a stdio stream in KTX format.
        KTX_error_code ktxTexture1_WriteToNamedFile (ktxTexture1 *This, const char *const dstname)
         Write a ktxTexture object to a named file in KTX format.
        KTX_error_code ktxTexture1_WriteToMemory (ktxTexture1 *This, ktx_uint8_t **ppDstBytes, ktx_size_t *pSize)
         Write a ktxTexture object to block of memory in KTX format.
        KTX_error_code ktxTexture1_WriteKTX2ToStream (ktxTexture1 *This, ktxStream *dststr)
         Write a ktxTexture object to a ktxStream in KTX 2 format.
        KTX_error_code ktxTexture1_WriteKTX2ToStdioStream (ktxTexture1 *This, FILE *dstsstr)
         Write a ktxTexture object to a stdio stream in KTX2 format.
        KTX_error_code ktxTexture1_WriteKTX2ToNamedFile (ktxTexture1 *This, const char *const dstname)
         Write a ktxTexture object to a named file in KTX2 format.
        KTX_error_code ktxTexture1_WriteKTX2ToMemory (ktxTexture1 *This, ktx_uint8_t **ppDstBytes, ktx_size_t *pSize)
         Write a ktxTexture object to block of memory in KTX2 format.
        + + + + + + +

        +Data Fields

        ktx_uint32_t glFormat
        ktx_uint32_t glInternalformat
        ktx_uint32_t glBaseInternalformat
        ktx_uint32_t glType
        struct ktxTexture1_private * _private
        +

        Detailed Description

        +

        Class representing a KTX version 1 format texture.

        +

        ktxTextures should be created only by one of the ktxTexture_Create* functions and these fields should be considered read-only.

        +
        Examples
        glloader.c.
        +
        +

        Field Documentation

        + +

        ◆ _private

        + +
        +
        + + + + +
        struct ktxTexture1_private* _private
        +
        +

        Private data.

        + +
        +
        + +

        ◆ glBaseInternalformat

        + +
        +
        + + + + +
        ktx_uint32_t glBaseInternalformat
        +
        +

        Base format of the texture data, e.g., GL_RGB.

        +
        Examples
        glloader.c.
        +
        + +
        +
        + +

        ◆ glFormat

        + +
        +
        + + + + +
        ktx_uint32_t glFormat
        +
        +

        Format of the texture data, e.g., GL_RGB.

        +
        Examples
        glloader.c.
        +
        + +
        +
        + +

        ◆ glInternalformat

        + +
        +
        + + + + +
        ktx_uint32_t glInternalformat
        +
        +

        Internal format of the texture data, e.g., GL_RGB8.

        +
        Examples
        glloader.c.
        +
        + +
        +
        + +

        ◆ glType

        + +
        +
        + + + + +
        ktx_uint32_t glType
        +
        +

        Type of the texture data, e.g, GL_UNSIGNED_BYTE.

        +
        Examples
        glloader.c.
        +
        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxTexture1.js b/ktx/build/docs/html/libktx/structktxTexture1.js new file mode 100644 index 0000000..767cb37 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture1.js @@ -0,0 +1,36 @@ +var structktxTexture1 = +[ + [ "ktxTexture1_Create", "group__writer.html#ga9ad46bface6dab07a35579c0635877d3", null ], + [ "ktxTexture1_CreateFromMemory", "group__reader.html#ga1f289eb80601208b79561804d2ec0121", null ], + [ "ktxTexture1_CreateFromNamedFile", "group__reader.html#ga0319d9a33d3ea78da2ef786205f2a956", null ], + [ "ktxTexture1_CreateFromStdioStream", "group__reader.html#ga4557b9714b41e7c575d295b65e19ed12", null ], + [ "ktxTexture1_CreateFromStream", "group__reader.html#ga2e9c9d8a1c02732c87db733d3449b337", null ], + [ "ktxTexture1_Destroy", "group__reader.html#gaa616363178ec37996459219a6925f87d", null ], + [ "ktxTexture1_GetDataSizeUncompressed", "group__reader.html#ga65cd751a3d1a6eed97cb19b7a88d736c", null ], + [ "ktxTexture1_GetImageOffset", "group__reader.html#ga2c471eb79f1ac62d63cae86ca6c519bf", null ], + [ "ktxTexture1_GetImageSize", "group__reader.html#gac1dc0703bc613180a92a8e1c5901dd50", null ], + [ "ktxTexture1_GetLevelSize", "group__reader.html#ga8a1bf5e13f88af082585a875e85dfdeb", null ], + [ "ktxTexture1_GetVkFormat", "group__ktx__vkloader.html#ga11fb504b749453140e04ca69711633d6", null ], + [ "ktxTexture1_GLUpload", "group__ktx__glloader.html#ga058297b66c5a7fd1f1bbaf718a887b9f", null ], + [ "ktxTexture1_IterateLevels", "group__reader.html#ga400a2581bf935beb6c0192a6e9844914", null ], + [ "ktxTexture1_IterateLoadLevelFaces", "group__reader.html#gab56e28f79781acf2933e36c21823c0df", null ], + [ "ktxTexture1_LoadImageData", "group__reader.html#ga7334feb062f32b62159cebd6e4b28d16", null ], + [ "ktxTexture1_SetImageFromMemory", "group__writer.html#gabeb1d5eb7ddcfd81405d5726a0b55ee6", null ], + [ "ktxTexture1_SetImageFromStdioStream", "group__writer.html#ga9383755c2e02a9d1aa932e75c847829c", null ], + [ "ktxTexture1_VkUpload", "group__ktx__vkloader.html#gac70d24bac4ac3b2586836439bbc6592a", null ], + [ "ktxTexture1_VkUploadEx", "group__ktx__vkloader.html#gad7840c1eeb618fa1a09fc5a02c07ce87", null ], + [ "ktxTexture1_VkUploadEx_WithSuballocator", "group__ktx__vkloader.html#ga4166e5853362cf136f3efe0c527c4c6d", null ], + [ "ktxTexture1_WriteKTX2ToMemory", "group__writer.html#gadbc6058afa50d4db3efd738822e6296a", null ], + [ "ktxTexture1_WriteKTX2ToNamedFile", "group__writer.html#ga3009e876fb584268241a9ba7704e8557", null ], + [ "ktxTexture1_WriteKTX2ToStdioStream", "group__writer.html#gac31b3532ed02d8cd4a7b517d4d2ab6ef", null ], + [ "ktxTexture1_WriteKTX2ToStream", "group__writer.html#gad0a6406fc9359abd5f6d9956a86ce90f", null ], + [ "ktxTexture1_WriteToMemory", "group__writer.html#ga21904a85ada4ee322b87c309566ea4d1", null ], + [ "ktxTexture1_WriteToNamedFile", "group__writer.html#gafe0d51799d92b69cdcbe30c98322340b", null ], + [ "ktxTexture1_WriteToStdioStream", "group__writer.html#ga924da3380253c85fffca8c956e00d5c0", null ], + [ "ktxTexture1_WriteToStream", "group__writer.html#gac1780ac8315f0cab9893c121481c7453", null ], + [ "_private", "structktxTexture1.html#a2113cfebb1a5e3328ce7a89d21e7cdab", null ], + [ "glBaseInternalformat", "structktxTexture1.html#aaadefe13bf76c26cb921afa52fb29192", null ], + [ "glFormat", "structktxTexture1.html#a05fa4fecc2735f68d34651a62493ecd9", null ], + [ "glInternalformat", "structktxTexture1.html#a1318d73f800ff61d045b740331939596", null ], + [ "glType", "structktxTexture1.html#ac8a870c675f1e36c456c9de2e3ac9855", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxTexture1__coll__graph.map b/ktx/build/docs/html/libktx/structktxTexture1__coll__graph.map new file mode 100644 index 0000000..406b5d0 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture1__coll__graph.map @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ktx/build/docs/html/libktx/structktxTexture1__coll__graph.md5 b/ktx/build/docs/html/libktx/structktxTexture1__coll__graph.md5 new file mode 100644 index 0000000..5ad5b31 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture1__coll__graph.md5 @@ -0,0 +1 @@ +4c0b187ae92a661315a74f15b38550ae \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxTexture1__coll__graph.png b/ktx/build/docs/html/libktx/structktxTexture1__coll__graph.png new file mode 100644 index 0000000..49cac92 Binary files /dev/null and b/ktx/build/docs/html/libktx/structktxTexture1__coll__graph.png differ diff --git a/ktx/build/docs/html/libktx/structktxTexture2.html b/ktx/build/docs/html/libktx/structktxTexture2.html new file mode 100644 index 0000000..4517aea --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture2.html @@ -0,0 +1,252 @@ + + + + + + + +libktx Reference: ktxTexture2 Class Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxTexture2 Class Reference
        +
        +
        + +

        Class representing a KTX version 2 format texture. + More...

        + +

        #include <ktx.h>

        +
        +Collaboration diagram for ktxTexture2:
        +
        +
        Collaboration graph
        + + + + + + + + + + + +
        [legend]
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

        KTX_error_code ktxTexture2_CompressAstcEx (ktxTexture2 *This, ktxAstcParams *params)
         Encode and compress a ktx texture with uncompressed images to astc.
        KTX_error_code ktxTexture2_CompressAstc (ktxTexture2 *This, ktx_uint32_t quality)
         Encode and compress a ktx texture with uncompressed images to astc.
        KTX_error_code ktxTexture2_CompressBasisEx (ktxTexture2 *This, ktxBasisParams *params)
         Encode and possibly Supercompress a KTX2 texture with uncompressed images.
        KTX_error_code ktxTexture2_CompressBasis (ktxTexture2 *This, ktx_uint32_t quality)
         Supercompress a KTX2 texture with uncompressed images.
        KTX_error_code ktxTexture2_TranscodeBasis (ktxTexture2 *This, ktx_transcode_fmt_e outputFormat, ktx_transcode_flags transcodeFlags)
         Transcode a KTX2 texture with BasisLZ/ETC1S or UASTC images.
        KTX_error_code ktxTexture2_GLUpload (ktxTexture2 *This, GLuint *pTexture, GLenum *pTarget, GLenum *pGlerror)
         Create a GL texture object from a ktxTexture2 object.
        KTX_error_code ktxTexture2_Create (const ktxTextureCreateInfo *const createInfo, ktxTextureCreateStorageEnum storageAllocation, ktxTexture2 **newTex)
         Create a new empty ktxTexture2.
        KTX_error_code ktxTexture2_CreateCopy (ktxTexture2 *orig, ktxTexture2 **newTex)
         Create a ktxTexture2 by making a copy of a ktxTexture2.
        KTX_error_code ktxTexture2_CreateFromStdioStream (FILE *stdioStream, ktxTextureCreateFlags createFlags, ktxTexture2 **newTex)
         Create a ktxTexture2 from a stdio stream reading from a KTX source.
        KTX_error_code ktxTexture2_CreateFromNamedFile (const char *const filename, ktxTextureCreateFlags createFlags, ktxTexture2 **newTex)
         Create a ktxTexture2 from a named KTX file.
        KTX_error_code ktxTexture2_CreateFromMemory (const ktx_uint8_t *bytes, ktx_size_t size, ktxTextureCreateFlags createFlags, ktxTexture2 **newTex)
         Create a ktxTexture2 from KTX-formatted data in memory.
        KTX_error_code ktxTexture2_CreateFromStream (ktxStream *stream, ktxTextureCreateFlags createFlags, ktxTexture2 **newTex)
         Create a ktxTexture2 from KTX-formatted data from a stream.
        void ktxTexture2_Destroy (ktxTexture2 *This)
         Destroy a ktxTexture2 object.
        void ktxTexture2_GetComponentInfo (ktxTexture2 *This, uint32_t *pNumComponents, uint32_t *pComponentByteLength)
         Return information about the components of an image in a texture.
        ktx_uint32_t ktxTexture2_GetNumComponents (ktxTexture2 *This)
         Return the number of components in an image of the texture.
        KTX_error_code ktxTexture2_GetImageOffset (ktxTexture2 *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, ktx_size_t *pOffset)
         Find the offset of an image within a ktxTexture's image data.
        khr_df_transfer_e ktxTexture2_GetTransferFunction_e (ktxTexture2 *This)
         Retrieve the transfer function of the images.
        khr_df_transfer_e ktxTexture2_GetOETF_e (ktxTexture2 *This)
         Retrieve the transfer function of the images.
        ktx_uint32_t ktxTexture2_GetOETF (ktxTexture2 *This)
         Retrieve the transfer function of the images.
        khr_df_model_e ktxTexture2_GetColorModel_e (ktxTexture2 *This)
         Retrieve the DFD color model of the images.
        ktx_bool_t ktxTexture2_GetPremultipliedAlpha (ktxTexture2 *This)
         Retrieve whether the RGB components have been premultiplied by the alpha component.
        khr_df_primaries_e ktxTexture2_GetPrimaries_e (ktxTexture2 *This)
         Retrieve the color primaries of the images.
        ktx_bool_t ktxTexture2_NeedsTranscoding (ktxTexture2 *This)
         Query if the images are in a transcodable format.
        ktx_error_code_e ktxTexture2_SetOETF (ktxTexture2 *This, khr_df_transfer_e tf)
         Set the transfer function for the images in a texture.
        ktx_error_code_e ktxTexture2_SetPrimaries (ktxTexture2 *This, khr_df_primaries_e primaries)
         Set the primaries for the images in a texture.
        ktx_size_t ktxTexture2_GetDataSizeUncompressed (ktxTexture2 *This)
         Return the total size in bytes of the uncompressed data of a ktxTexture2.
        ktx_size_t ktxTexture2_GetImageSize (ktxTexture2 *This, ktx_uint32_t level)
         Calculate & return the size in bytes of an image at the specified mip level.
        ktx_size_t ktxTexture2_GetLevelSize (ktxTexture2 *This, ktx_uint32_t level)
         Calculate & return the size in bytes of all the images in the specified mip level.
        KTX_error_code ktxTexture2_IterateLevels (ktxTexture2 *This, PFNKTXITERCB iterCb, void *userdata)
         Iterate over the mip levels in a ktxTexture2 object.
        KTX_error_code ktxTexture2_IterateLoadLevelFaces (ktxTexture2 *This, PFNKTXITERCB iterCb, void *userdata)
         Iterate over the images in a ktxTexture2 object while loading the image data.
        ktx_error_code_e ktxTexture2_LoadImageData (ktxTexture2 *This, ktx_uint8_t *pBuffer, ktx_size_t bufSize)
         Load all the image data from the ktxTexture2's source.
        ktx_error_code_e ktxTexture2_LoadDeflatedImageData (ktxTexture2 *This, ktx_uint8_t *pBuffer, ktx_size_t bufSize)
         Load all the image data from the ktxTexture2's source without inflatiion..
        KTX_error_code ktxTexture2_VkUploadEx_WithSuballocator (ktxTexture2 *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, ktxVulkanTexture_subAllocatorCallbacks *subAllocatorCallbacks)
         Create a Vulkan image object from a ktxTexture2 object.
        KTX_error_code ktxTexture2_VkUploadEx (ktxTexture2 *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)
         Create a Vulkan image object from a ktxTexture2 object.
        KTX_error_code ktxTexture2_VkUpload (ktxTexture2 *This, ktxVulkanDeviceInfo *vdi, ktxVulkanTexture *vkTexture)
         Create a Vulkan image object from a ktxTexture2 object.
        VkFormat ktxTexture2_GetVkFormat (ktxTexture2 *This)
         Return the VkFormat enum of a ktxTexture2 object.
        KTX_error_code ktxTexture2_SetImageFromStdioStream (ktxTexture2 *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, FILE *src, ktx_size_t srcSize)
         Set image for level, layer, faceSlice from a stdio stream source.
        KTX_error_code ktxTexture2_SetImageFromMemory (ktxTexture2 *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, const ktx_uint8_t *src, ktx_size_t srcSize)
         Set image for level, layer, faceSlice from an image in memory.
        KTX_error_code ktxTexture2_WriteToStream (ktxTexture2 *This, ktxStream *dststr)
         Write a ktxTexture object to a ktxStream in KTX format.
        KTX_error_code ktxTexture2_WriteToStdioStream (ktxTexture2 *This, FILE *dstsstr)
         Write a ktxTexture object to a stdio stream in KTX format.
        KTX_error_code ktxTexture2_WriteToNamedFile (ktxTexture2 *This, const char *const dstname)
         Write a ktxTexture object to a named file in KTX format.
        KTX_error_code ktxTexture2_WriteToMemory (ktxTexture2 *This, ktx_uint8_t **ppDstBytes, ktx_size_t *pSize)
         Write a ktxTexture object to block of memory in KTX format.
        KTX_error_code ktxTexture2_DeflateZstd (ktxTexture2 *This, ktx_uint32_t compressionLevel)
         Deflate the data in a ktxTexture2 object using Zstandard.
        KTX_error_code ktxTexture2_DeflateZLIB (ktxTexture2 *This, ktx_uint32_t compressionLevel)
         Deflate the data in a ktxTexture2 object using miniz (ZLIB).
        + + +

        +Data Fields

        struct ktxTexture2_private * _private
        +

        Detailed Description

        +

        Class representing a KTX version 2 format texture.

        +

        ktxTextures should be created only by one of the ktxTexture_Create* functions and these fields should be considered read-only.

        +
        Examples
        glloader.c.
        +
        +

        Field Documentation

        + +

        ◆ _private

        + +
        +
        + + + + +
        struct ktxTexture2_private* _private
        +
        +

        Private data.

        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxTexture2.js b/ktx/build/docs/html/libktx/structktxTexture2.js new file mode 100644 index 0000000..1c94b49 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture2.js @@ -0,0 +1,48 @@ +var structktxTexture2 = +[ + [ "ktxTexture2_CompressAstc", "group__writer.html#ga00b153dbfa1fe115c7d4322dbe07f172", null ], + [ "ktxTexture2_CompressAstcEx", "group__writer.html#gaf08421ae0893a9e9205d3e84fad66bd8", null ], + [ "ktxTexture2_CompressBasis", "group__writer.html#ga405c44d6daf8ddf83dc805810bf4f989", null ], + [ "ktxTexture2_CompressBasisEx", "group__writer.html#ga0e75755e3cc69964e57363dad82ffd77", null ], + [ "ktxTexture2_Create", "group__writer.html#gaa8e29216921eadd3c09c3a76bc286acd", null ], + [ "ktxTexture2_CreateCopy", "group__writer.html#ga5fcfdc3d237419ab65287639e1f4aeb1", null ], + [ "ktxTexture2_CreateFromMemory", "group__reader.html#ga6805a144f0bfd17b51d46fb28b0786a5", null ], + [ "ktxTexture2_CreateFromNamedFile", "group__reader.html#ga8680560274b31da6f3f07ee911055431", null ], + [ "ktxTexture2_CreateFromStdioStream", "group__reader.html#gae9de7e23ffe3ae3aeed4cc95c61699e4", null ], + [ "ktxTexture2_CreateFromStream", "group__reader.html#ga1e865473d23f82fc22a16bb3eadf60ed", null ], + [ "ktxTexture2_DeflateZLIB", "group__writer.html#gaafc3cf2c872ea75be7096b1fc70dfb2c", null ], + [ "ktxTexture2_DeflateZstd", "group__writer.html#ga08d7222fbf845f25d883ed81c14c6430", null ], + [ "ktxTexture2_Destroy", "group__reader.html#ga01ec49abe73b77f2f8db99b5d9cf46d9", null ], + [ "ktxTexture2_GetColorModel_e", "group__reader.html#ga7200d548b480a3abb69c206f530c0669", null ], + [ "ktxTexture2_GetComponentInfo", "group__reader.html#gad3aab08fa013c602fc055964e78c7566", null ], + [ "ktxTexture2_GetDataSizeUncompressed", "group__reader.html#gaefcaf84425830ba095eb670a275dad34", null ], + [ "ktxTexture2_GetImageOffset", "group__reader.html#gab29978f318436c009ae45b7d3c515f8e", null ], + [ "ktxTexture2_GetImageSize", "group__reader.html#gaa4b800f418f57b10737ac6533f1769d2", null ], + [ "ktxTexture2_GetLevelSize", "group__reader.html#gac344745350aff9cf5bcc2969729b7f0e", null ], + [ "ktxTexture2_GetNumComponents", "group__reader.html#gacc7762adb6ff311ca65cfe5ed89db21e", null ], + [ "ktxTexture2_GetOETF", "group__reader.html#gac1b0eccd69f541450ed88da2ad260dcc", null ], + [ "ktxTexture2_GetOETF_e", "group__reader.html#gaddf6746c18d970a238e89bb9b8e13e77", null ], + [ "ktxTexture2_GetPremultipliedAlpha", "group__reader.html#gab773b3ad45bacb6f487b62c4b0a07fcf", null ], + [ "ktxTexture2_GetPrimaries_e", "group__reader.html#gac7323c6f9fe75f442484392506b2024b", null ], + [ "ktxTexture2_GetTransferFunction_e", "group__reader.html#ga37cd5b4ae9ee373d825197dc8998d0bb", null ], + [ "ktxTexture2_GetVkFormat", "group__ktx__vkloader.html#ga7a9baaf3aa2e114c6f6e58fe68051815", null ], + [ "ktxTexture2_GLUpload", "group__ktx__glloader.html#ga7624860df8e44573862fa5754ea2976c", null ], + [ "ktxTexture2_IterateLevels", "group__reader.html#ga1b47270a151b67615aed9eeca5f25bf7", null ], + [ "ktxTexture2_IterateLoadLevelFaces", "group__reader.html#gaf57628ec7f9a554b46ba84ab9c214bab", null ], + [ "ktxTexture2_LoadDeflatedImageData", "group__reader.html#gaa1f681c144baa70ef9af6db4c7333b3c", null ], + [ "ktxTexture2_LoadImageData", "group__reader.html#ga032b7f1926861c8b40655527b84f5533", null ], + [ "ktxTexture2_NeedsTranscoding", "group__reader.html#gade1ffc5d31c2f9b5f1e861b59e7619ce", null ], + [ "ktxTexture2_SetImageFromMemory", "group__writer.html#ga01b13c38300016ce36c5b97bf4957d48", null ], + [ "ktxTexture2_SetImageFromStdioStream", "group__writer.html#ga50a5ecf22586b26977da62cf19a78518", null ], + [ "ktxTexture2_SetOETF", "group__writer.html#ga9894284fd16fed4697505353043bbeae", null ], + [ "ktxTexture2_SetPrimaries", "group__writer.html#gaa623fd7f433e3827a52cdb499f9162f9", null ], + [ "ktxTexture2_TranscodeBasis", "group__reader.html#ga90cc33928a2dae962fb94b3fa2f6575d", null ], + [ "ktxTexture2_VkUpload", "group__ktx__vkloader.html#gadf0fba44f518b61acd5d0ae86225ddee", null ], + [ "ktxTexture2_VkUploadEx", "group__ktx__vkloader.html#ga265926439e3f9502f248684238e5cc48", null ], + [ "ktxTexture2_VkUploadEx_WithSuballocator", "group__ktx__vkloader.html#gacb13edcb651f0a8fb26dab9594ef7dc7", null ], + [ "ktxTexture2_WriteToMemory", "group__writer.html#ga0113194b669b789a22d85b7ad992f117", null ], + [ "ktxTexture2_WriteToNamedFile", "group__writer.html#ga745cee3857ade59e612c533d6faa8e2a", null ], + [ "ktxTexture2_WriteToStdioStream", "group__writer.html#gadf2c2542471b7a94636216807cedd819", null ], + [ "ktxTexture2_WriteToStream", "group__writer.html#gacb722c7d0c1df7e6e3b4caa78ae729cf", null ], + [ "_private", "structktxTexture2.html#a0093ccc55cbbc2d352e6e1e8d8fbc2ab", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxTexture2__coll__graph.map b/ktx/build/docs/html/libktx/structktxTexture2__coll__graph.map new file mode 100644 index 0000000..ffa38f9 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture2__coll__graph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ktx/build/docs/html/libktx/structktxTexture2__coll__graph.md5 b/ktx/build/docs/html/libktx/structktxTexture2__coll__graph.md5 new file mode 100644 index 0000000..0ab02c1 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture2__coll__graph.md5 @@ -0,0 +1 @@ +9a5c0769df32d573164b8edcc9965dd6 \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxTexture2__coll__graph.png b/ktx/build/docs/html/libktx/structktxTexture2__coll__graph.png new file mode 100644 index 0000000..86a0b9e Binary files /dev/null and b/ktx/build/docs/html/libktx/structktxTexture2__coll__graph.png differ diff --git a/ktx/build/docs/html/libktx/structktxTextureCreateInfo.html b/ktx/build/docs/html/libktx/structktxTextureCreateInfo.html new file mode 100644 index 0000000..839fb7a --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTextureCreateInfo.html @@ -0,0 +1,321 @@ + + + + + + + +libktx Reference: ktxTextureCreateInfo Struct Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxTextureCreateInfo Struct Reference
        +
        +
        + +

        Structure for passing texture information to ktxTexture1_Create() and ktxTexture2_Create(). + More...

        + +

        #include <ktx.h>

        + + + + + + + + + + + + + + +

        +Data Fields

        ktx_uint32_t glInternalformat
        ktx_uint32_t vkFormat
        ktx_uint32_t * pDfd
        ktx_uint32_t baseWidth
        ktx_uint32_t baseHeight
        ktx_uint32_t baseDepth
        ktx_uint32_t numDimensions
        ktx_uint32_t numLevels
        ktx_uint32_t numLayers
        ktx_uint32_t numFaces
        ktx_bool_t isArray
        ktx_bool_t generateMipmaps
        +

        Detailed Description

        +

        Structure for passing texture information to ktxTexture1_Create() and ktxTexture2_Create().

        +
        See also
        ktxTexture1_Create()
        +
        +ktxTexture2_Create()
        +

        Field Documentation

        + +

        ◆ baseDepth

        + +
        +
        + + + + +
        ktx_uint32_t baseDepth
        +
        +

        Depth of the base level of the texture.

        + +
        +
        + +

        ◆ baseHeight

        + +
        +
        + + + + +
        ktx_uint32_t baseHeight
        +
        +

        Height of the base level of the texture.

        + +
        +
        + +

        ◆ baseWidth

        + +
        +
        + + + + +
        ktx_uint32_t baseWidth
        +
        +

        Width of the base level of the texture.

        + +
        +
        + +

        ◆ generateMipmaps

        + +
        +
        + + + + +
        ktx_bool_t generateMipmaps
        +
        +

        Set to KTX_TRUE if mipmaps should be generated for the texture when loading into a 3D API.

        + +
        +
        + +

        ◆ glInternalformat

        + +
        +
        + + + + +
        ktx_uint32_t glInternalformat
        +
        +

        Internal format for the texture, e.g., GL_RGB8. Ignored when creating a ktxTexture2.

        + +
        +
        + +

        ◆ isArray

        + +
        +
        + + + + +
        ktx_bool_t isArray
        +
        +

        Set to KTX_TRUE if the texture is to be an array texture. Means OpenGL will use a GL_TEXTURE_*_ARRAY target.

        + +
        +
        + +

        ◆ numDimensions

        + +
        +
        + + + + +
        ktx_uint32_t numDimensions
        +
        +

        Number of dimensions in the texture, 1, 2 or 3.

        + +
        +
        + +

        ◆ numFaces

        + +
        +
        + + + + +
        ktx_uint32_t numFaces
        +
        +

        Number of faces: 6 for cube maps, 1 otherwise.

        + +
        +
        + +

        ◆ numLayers

        + +
        +
        + + + + +
        ktx_uint32_t numLayers
        +
        +

        Number of array layers in the texture.

        + +
        +
        + +

        ◆ numLevels

        + +
        +
        + + + + +
        ktx_uint32_t numLevels
        +
        +

        Number of mip levels in the texture. Should be 1 if generateMipmaps is KTX_TRUE;

        + +
        +
        + +

        ◆ pDfd

        + +
        +
        + + + + +
        ktx_uint32_t* pDfd
        +
        +

        Pointer to DFD. Used only when creating a ktxTexture2 and only if vkFormat is VK_FORMAT_UNDEFINED.

        + +
        +
        + +

        ◆ vkFormat

        + +
        +
        + + + + +
        ktx_uint32_t vkFormat
        +
        +

        VkFormat for texture. Ignored when creating a ktxTexture1.

        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxTextureCreateInfo.js b/ktx/build/docs/html/libktx/structktxTextureCreateInfo.js new file mode 100644 index 0000000..dd8273a --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTextureCreateInfo.js @@ -0,0 +1,15 @@ +var structktxTextureCreateInfo = +[ + [ "baseDepth", "structktxTextureCreateInfo.html#a71d7762f2b0dd61d57c0a7ec31ee46ac", null ], + [ "baseHeight", "structktxTextureCreateInfo.html#afe7371a26104de3e131e82cf5cc39e9c", null ], + [ "baseWidth", "structktxTextureCreateInfo.html#a3fa51cc9001702e3f1d5a69cee65adf8", null ], + [ "generateMipmaps", "structktxTextureCreateInfo.html#a9c26601222e6a037f7dbae7b61b18fd0", null ], + [ "glInternalformat", "structktxTextureCreateInfo.html#a1318d73f800ff61d045b740331939596", null ], + [ "isArray", "structktxTextureCreateInfo.html#a9b5ca8c2e3fd76d8b427928775289078", null ], + [ "numDimensions", "structktxTextureCreateInfo.html#a3c48573960eb90b1e38cc70457d2cda1", null ], + [ "numFaces", "structktxTextureCreateInfo.html#a3a4bc2fa2e41bcec0bdb265505af0068", null ], + [ "numLayers", "structktxTextureCreateInfo.html#ae1412e2bd82ef1baa7cb1479735d9c86", null ], + [ "numLevels", "structktxTextureCreateInfo.html#a782126a62c27ee8660a14565b906694c", null ], + [ "pDfd", "structktxTextureCreateInfo.html#a4bdd6bd9ddee632131ab2e371ea9d66e", null ], + [ "vkFormat", "structktxTextureCreateInfo.html#abc50403eebde1f027704eadc05d304c7", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxTexture__coll__graph.map b/ktx/build/docs/html/libktx/structktxTexture__coll__graph.map new file mode 100644 index 0000000..25c4446 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture__coll__graph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ktx/build/docs/html/libktx/structktxTexture__coll__graph.md5 b/ktx/build/docs/html/libktx/structktxTexture__coll__graph.md5 new file mode 100644 index 0000000..4c1c969 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture__coll__graph.md5 @@ -0,0 +1 @@ +252abedd1e8f9627306557b077a6aa9a \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxTexture__coll__graph.png b/ktx/build/docs/html/libktx/structktxTexture__coll__graph.png new file mode 100644 index 0000000..2a9af46 Binary files /dev/null and b/ktx/build/docs/html/libktx/structktxTexture__coll__graph.png differ diff --git a/ktx/build/docs/html/libktx/structktxTexture__vtbl.html b/ktx/build/docs/html/libktx/structktxTexture__vtbl.html new file mode 100644 index 0000000..ced223f --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture__vtbl.html @@ -0,0 +1,134 @@ + + + + + + + +libktx Reference: ktxTexture_vtbl Struct Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxTexture_vtbl Struct Reference
        +
        +
        + +

        Table of virtual ktxTexture methods. + More...

        + +

        #include <ktx.h>

        +
        +Collaboration diagram for ktxTexture_vtbl:
        +
        +
        Collaboration graph
        + + + + + + + + +
        [legend]
        +

        Detailed Description

        +

        Table of virtual ktxTexture methods.

        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxTexture__vtbl__coll__graph.map b/ktx/build/docs/html/libktx/structktxTexture__vtbl__coll__graph.map new file mode 100644 index 0000000..b52bf8b --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture__vtbl__coll__graph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ktx/build/docs/html/libktx/structktxTexture__vtbl__coll__graph.md5 b/ktx/build/docs/html/libktx/structktxTexture__vtbl__coll__graph.md5 new file mode 100644 index 0000000..65f9b47 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxTexture__vtbl__coll__graph.md5 @@ -0,0 +1 @@ +435cda79337ffe24a8241eab8d1da690 \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxTexture__vtbl__coll__graph.png b/ktx/build/docs/html/libktx/structktxTexture__vtbl__coll__graph.png new file mode 100644 index 0000000..6582d78 Binary files /dev/null and b/ktx/build/docs/html/libktx/structktxTexture__vtbl__coll__graph.png differ diff --git a/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo.html b/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo.html new file mode 100644 index 0000000..91793d1 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo.html @@ -0,0 +1,316 @@ + + + + + + + +libktx Reference: ktxVulkanDeviceInfo Class Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxVulkanDeviceInfo Class Reference
        +
        +
        + +

        Struct for passing information about the Vulkan device on which to create images to the texture image loading functions. + More...

        + +

        #include <ktxvulkan.h>

        +
        +Collaboration diagram for ktxVulkanDeviceInfo:
        +
        +
        Collaboration graph
        + + + + + +
        [legend]
        + + + + + + + + + + + + + + +

        +Public Member Functions

        ktxVulkanDeviceInfoktxVulkanDeviceInfo_Create (VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkCommandPool cmdPool, const VkAllocationCallbacks *pAllocator)
         Create a ktxVulkanDeviceInfo object.
        ktxVulkanDeviceInfoktxVulkanDeviceInfo_CreateEx (VkInstance instance, VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkCommandPool cmdPool, const VkAllocationCallbacks *pAllocator, const ktxVulkanFunctions *pFuncs)
         Create a ktxVulkanDeviceInfo object.
        KTX_error_code ktxVulkanDeviceInfo_Construct (ktxVulkanDeviceInfo *This, VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkCommandPool cmdPool, const VkAllocationCallbacks *pAllocator)
         Construct a ktxVulkanDeviceInfo object.
        KTX_error_code ktxVulkanDeviceInfo_ConstructEx (ktxVulkanDeviceInfo *This, VkInstance instance, VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkCommandPool cmdPool, const VkAllocationCallbacks *pAllocator, const ktxVulkanFunctions *pFunctions)
         Construct a ktxVulkanDeviceInfo object.
        void ktxVulkanDeviceInfo_Destruct (ktxVulkanDeviceInfo *This)
         Destruct a ktxVulkanDeviceInfo object.
        void ktxVulkanDeviceInfo_Destroy (ktxVulkanDeviceInfo *This)
         Destroy a ktxVulkanDeviceInfo object.
        + + + + + + + + + + +

        +Data Fields

        VkInstance instance
        VkPhysicalDevice physicalDevice
        VkDevice device
        VkQueue queue
        VkCommandBuffer cmdBuffer
        VkCommandPool cmdPool
        const VkAllocationCallbacks * pAllocator
        VkPhysicalDeviceMemoryProperties deviceMemoryProperties
        ktxVulkanFunctions vkFuncs
        +

        Detailed Description

        +

        Struct for passing information about the Vulkan device on which to create images to the texture image loading functions.

        +

        Avoids passing a large number of parameters to each loading function. Use of ktxVulkanDeviceInfo_create() or ktxVulkanDeviceInfo_construct() to populate this structure is highly recommended.

        +
        + +
        +
        vdi = ktxVulkanDeviceInfo_create(physicalDevice,
        + + + +
        &allocator);
        +
        ktxLoadVkTextureN("texture_1.ktx", vdi, &texture, NULL, NULL);
        +
        // ...
        +
        ktxLoadVkTextureN("texture_n.ktx", vdi, &texture, NULL, NULL);
        +
        ktxVulkanDeviceInfo_destroy(vdi);
        +
        Struct for passing information about the Vulkan device on which to create images to the texture image...
        Definition ktxvulkan.h:188
        +
        VkDevice device
        Definition ktxvulkan.h:191
        +
        VkQueue queue
        Definition ktxvulkan.h:192
        +
        VkCommandPool cmdPool
        Definition ktxvulkan.h:195
        +
        VkPhysicalDevice physicalDevice
        Definition ktxvulkan.h:190
        +
        Struct for returning information about the Vulkan texture image created by the ktxTexture_VkUpload* f...
        Definition ktxvulkan.h:108
        +
        Examples
        vkload.cpp.
        +
        +

        Field Documentation

        + +

        ◆ cmdBuffer

        + +
        +
        + + + + +
        VkCommandBuffer cmdBuffer
        +
        +

        Handle of the cmdBuffer to use.

        + +
        +
        + +

        ◆ cmdPool

        + +
        +
        + + + + +
        VkCommandPool cmdPool
        +
        +

        Handle of the command pool from which to allocate the command buffer.

        + +
        +
        + +

        ◆ device

        + +
        +
        + + + + +
        VkDevice device
        +
        +

        Handle of the logical device.

        + +
        +
        + +

        ◆ deviceMemoryProperties

        + +
        +
        + + + + +
        VkPhysicalDeviceMemoryProperties deviceMemoryProperties
        +
        +

        Memory properties of the Vulkan physical device.

        + +
        +
        + +

        ◆ instance

        + +
        +
        + + + + +
        VkInstance instance
        +
        +

        Instance used to communicate with vulkan.

        + +
        +
        + +

        ◆ pAllocator

        + +
        +
        + + + + +
        const VkAllocationCallbacks* pAllocator
        +
        +

        Pointer to the allocator to use for the command buffer and created images.

        + +
        +
        + +

        ◆ physicalDevice

        + +
        +
        + + + + +
        VkPhysicalDevice physicalDevice
        +
        +

        Handle of the physical device.

        + +
        +
        + +

        ◆ queue

        + +
        +
        + + + + +
        VkQueue queue
        +
        +

        Handle to the queue to which to submit commands.

        + +
        +
        + +

        ◆ vkFuncs

        + +
        +
        + + + + +
        ktxVulkanFunctions vkFuncs
        +
        +

        The functions needed to operate functions

        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo.js b/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo.js new file mode 100644 index 0000000..cf1a617 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo.js @@ -0,0 +1,18 @@ +var structktxVulkanDeviceInfo = +[ + [ "ktxVulkanDeviceInfo_Construct", "group__ktx__vkloader.html#ga4bc9f0fa9af93d588276f54fe9a6ba50", null ], + [ "ktxVulkanDeviceInfo_ConstructEx", "group__ktx__vkloader.html#ga3c9d5bc5ac1d0e237ae62fd94c148764", null ], + [ "ktxVulkanDeviceInfo_Create", "group__ktx__vkloader.html#ga82ac7e21e884652c519d9fe28ad5428c", null ], + [ "ktxVulkanDeviceInfo_CreateEx", "group__ktx__vkloader.html#ga5137c2d7e23be51160048b3253abad3c", null ], + [ "ktxVulkanDeviceInfo_Destroy", "group__ktx__vkloader.html#gaaf633943fbf201fb620c0270c6150fa8", null ], + [ "ktxVulkanDeviceInfo_Destruct", "group__ktx__vkloader.html#gae58928740420d1ed3f96fd4b0f2d897e", null ], + [ "cmdBuffer", "structktxVulkanDeviceInfo.html#a8d2064b68f606e62edad9d1a8dcab4ca", null ], + [ "cmdPool", "structktxVulkanDeviceInfo.html#ab3f05272e12842d5d4d29fca7baa2e50", null ], + [ "device", "structktxVulkanDeviceInfo.html#a8aef703a0ef81f8277415b03129f44d7", null ], + [ "deviceMemoryProperties", "structktxVulkanDeviceInfo.html#a8adaad9220e0679d7cfc0c521d8c1736", null ], + [ "instance", "structktxVulkanDeviceInfo.html#ab264f628c25b3571174ecdd626526958", null ], + [ "pAllocator", "structktxVulkanDeviceInfo.html#a3e22f7507185cca6b31fb443453ad48e", null ], + [ "physicalDevice", "structktxVulkanDeviceInfo.html#ac2810ac3274fecd32eedb3e6af340df0", null ], + [ "queue", "structktxVulkanDeviceInfo.html#ab3246009ce333f50c2ca3d8187c3849e", null ], + [ "vkFuncs", "structktxVulkanDeviceInfo.html#aa89ac6b3401b08de40b59bdb4863b331", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo__coll__graph.map b/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo__coll__graph.map new file mode 100644 index 0000000..c495176 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo__coll__graph.md5 b/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo__coll__graph.md5 new file mode 100644 index 0000000..200ddd2 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo__coll__graph.md5 @@ -0,0 +1 @@ +fccae89c34e299dd2f52494ded169e71 \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo__coll__graph.png b/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo__coll__graph.png new file mode 100644 index 0000000..2776f22 Binary files /dev/null and b/ktx/build/docs/html/libktx/structktxVulkanDeviceInfo__coll__graph.png differ diff --git a/ktx/build/docs/html/libktx/structktxVulkanFunctions.html b/ktx/build/docs/html/libktx/structktxVulkanFunctions.html new file mode 100644 index 0000000..4455572 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxVulkanFunctions.html @@ -0,0 +1,122 @@ + + + + + + + +libktx Reference: ktxVulkanFunctions Struct Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxVulkanFunctions Struct Reference
        +
        +
        + +

        Struct for applications to pass Vulkan function pointers to the ktxTexture_VkUpload functions via a ktxVulkanDeviceInfo struct. + More...

        + +

        #include <ktxvulkan.h>

        +

        Detailed Description

        +

        Struct for applications to pass Vulkan function pointers to the ktxTexture_VkUpload functions via a ktxVulkanDeviceInfo struct.

        +

        vkGetInstanceProcAddr and vkGetDeviceProcAddr should be set, others are optional.

        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxVulkanTexture.html b/ktx/build/docs/html/libktx/structktxVulkanTexture.html new file mode 100644 index 0000000..bdb28ec --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxVulkanTexture.html @@ -0,0 +1,344 @@ + + + + + + + +libktx Reference: ktxVulkanTexture Class Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxVulkanTexture Class Reference
        +
        +
        + +

        Struct for returning information about the Vulkan texture image created by the ktxTexture_VkUpload* functions. + More...

        + +

        #include <ktxvulkan.h>

        + + + + + + +

        +Public Member Functions

        ktx_error_code_e ktxVulkanTexture_Destruct_WithSuballocator (ktxVulkanTexture *vkTexture, VkDevice device, const VkAllocationCallbacks *pAllocator, ktxVulkanTexture_subAllocatorCallbacks *subAllocatorCallbacks)
         Destructor for the object returned when loading a texture image.
        void ktxVulkanTexture_Destruct (ktxVulkanTexture *vkTexture, VkDevice device, const VkAllocationCallbacks *pAllocator)
         Destructor for the object returned when loading a texture image.
        + + + + + + + + + + + + + + +

        +Data Fields

        PFN_vkDestroyImage vkDestroyImage
        PFN_vkFreeMemory vkFreeMemory
        VkImage image
        VkFormat imageFormat
        VkImageLayout imageLayout
        VkDeviceMemory deviceMemory
        VkImageViewType viewType
        uint32_t width
        uint32_t height
        uint32_t depth
        uint32_t levelCount
        uint32_t layerCount
        uint64_t allocationId
        +

        Detailed Description

        +

        Struct for returning information about the Vulkan texture image created by the ktxTexture_VkUpload* functions.

        +

        Creation of these objects is internal to the upload functions.

        +
        Examples
        vkload.cpp.
        +
        +

        Field Documentation

        + +

        ◆ allocationId

        + +
        +
        + + + + +
        uint64_t allocationId
        +
        +

        An id referencing suballocation(s).

        + +
        +
        + +

        ◆ depth

        + +
        +
        + + + + +
        uint32_t depth
        +
        +

        The depth of the image.

        + +
        +
        + +

        ◆ deviceMemory

        + +
        +
        + + + + +
        VkDeviceMemory deviceMemory
        +
        +

        The memory (sub)allocation for the image on the Vulkan device. Will not be used with suballocators.

        + +
        +
        + +

        ◆ height

        + +
        +
        + + + + +
        uint32_t height
        +
        +

        The height of the image.

        + +
        +
        + +

        ◆ image

        + +
        +
        + + + + +
        VkImage image
        +
        +

        Handle to the Vulkan image created by the loader.

        + +
        +
        + +

        ◆ imageFormat

        + +
        +
        + + + + +
        VkFormat imageFormat
        +
        +

        Format of the image data.

        + +
        +
        + +

        ◆ imageLayout

        + +
        +
        + + + + +
        VkImageLayout imageLayout
        +
        +

        Layout of the created image. Has the same value as layout parameter passed to the loader.

        + +
        +
        + +

        ◆ layerCount

        + +
        +
        + + + + +
        uint32_t layerCount
        +
        +

        The number of array layers in the image.

        + +
        +
        + +

        ◆ levelCount

        + +
        +
        + + + + +
        uint32_t levelCount
        +
        +

        The number of MIP levels in the image.

        + +
        +
        + +

        ◆ viewType

        + +
        +
        + + + + +
        VkImageViewType viewType
        +
        +

        ViewType corresponding to image. Reflects the dimensionality, cubeness and arrayness of the image.

        + +
        +
        + +

        ◆ vkDestroyImage

        + +
        +
        + + + + +
        PFN_vkDestroyImage vkDestroyImage
        +
        +

        Pointer to vkDestroyImage function

        + +
        +
        + +

        ◆ vkFreeMemory

        + +
        +
        + + + + +
        PFN_vkFreeMemory vkFreeMemory
        +
        +

        Pointer to vkFreeMemory function

        + +
        +
        + +

        ◆ width

        + +
        +
        + + + + +
        uint32_t width
        +
        +

        The width of the image.

        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxVulkanTexture.js b/ktx/build/docs/html/libktx/structktxVulkanTexture.js new file mode 100644 index 0000000..a2805e0 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxVulkanTexture.js @@ -0,0 +1,18 @@ +var structktxVulkanTexture = +[ + [ "ktxVulkanTexture_Destruct", "group__ktx__vkloader.html#gaf620a84f6bc59bff03b521e55a654f19", null ], + [ "ktxVulkanTexture_Destruct_WithSuballocator", "group__ktx__vkloader.html#ga5a783db9431738b9b18b9fc585183490", null ], + [ "allocationId", "structktxVulkanTexture.html#a723f84255a60631ba53e0c5d2f8f398f", null ], + [ "depth", "structktxVulkanTexture.html#af43b771026fceb9a0b28256afc08f69b", null ], + [ "deviceMemory", "structktxVulkanTexture.html#a68699cf926eef628d726fe0fa402c34d", null ], + [ "height", "structktxVulkanTexture.html#a6ad4f820ce4e75cda0686fcaad5168be", null ], + [ "image", "structktxVulkanTexture.html#ac48af4a2f518b64b67c40aa0efa7de6b", null ], + [ "imageFormat", "structktxVulkanTexture.html#ad2bc860aeb9a158aa37eb3e09db3638e", null ], + [ "imageLayout", "structktxVulkanTexture.html#ad69bab0528dbcee4c8780b488670a179", null ], + [ "layerCount", "structktxVulkanTexture.html#a387ad43ce8155b27c8feab827f437a40", null ], + [ "levelCount", "structktxVulkanTexture.html#afaaf1db5d13d0299791944833b03af9c", null ], + [ "viewType", "structktxVulkanTexture.html#a3da1a8fe11560f0b2fa98a07e12a1fb7", null ], + [ "vkDestroyImage", "structktxVulkanTexture.html#ab0a61f410df5e84b033e0628354286b1", null ], + [ "vkFreeMemory", "structktxVulkanTexture.html#a190ebc88642185342b8503667919d276", null ], + [ "width", "structktxVulkanTexture.html#a325272ddd9a962f05deb905101d25cbd", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/structktxVulkanTexture__subAllocatorCallbacks.html b/ktx/build/docs/html/libktx/structktxVulkanTexture__subAllocatorCallbacks.html new file mode 100644 index 0000000..891bfca --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxVulkanTexture__subAllocatorCallbacks.html @@ -0,0 +1,223 @@ + + + + + + + +libktx Reference: ktxVulkanTexture_subAllocatorCallbacks Class Reference + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ktxVulkanTexture_subAllocatorCallbacks Class Reference
        +
        +
        + +

        Struct that contains all callbacks necessary for suballocation. + More...

        + +

        #include <ktxvulkan.h>

        + + + + + + + + +

        +Data Fields

        ktxVulkanTexture_subAllocatorAllocMemFuncPtr allocMemFuncPtr
        ktxVulkanTexture_subAllocatorBindBufferFuncPtr bindBufferFuncPtr
        ktxVulkanTexture_subAllocatorBindImageFuncPtr bindImageFuncPtr
        ktxVulkanTexture_subAllocatorMemoryMapFuncPtr memoryMapFuncPtr
        ktxVulkanTexture_subAllocatorMemoryUnmapFuncPtr memoryUnmapFuncPtr
        ktxVulkanTexture_subAllocatorFreeMemFuncPtr freeMemFuncPtr
        +

        Detailed Description

        +

        Struct that contains all callbacks necessary for suballocation.

        +

        These pointers must all be provided for upload or destroy to occur using suballocator callbacks.

        +

        Field Documentation

        + +

        ◆ allocMemFuncPtr

        + +
        +
        + + + + +
        ktxVulkanTexture_subAllocatorAllocMemFuncPtr allocMemFuncPtr
        +
        +

        Pointer to the memory procurement function. Can suballocate one or more pages.

        + +
        +
        + +

        ◆ bindBufferFuncPtr

        + +
        +
        + + + + +
        ktxVulkanTexture_subAllocatorBindBufferFuncPtr bindBufferFuncPtr
        +
        +

        Pointer to bind-buffer-to-suballocation(s) function.

        + +
        +
        + +

        ◆ bindImageFuncPtr

        + +
        +
        + + + + +
        ktxVulkanTexture_subAllocatorBindImageFuncPtr bindImageFuncPtr
        +
        +

        Pointer to bind-image-to-suballocation(s) function.

        + +
        +
        + +

        ◆ freeMemFuncPtr

        + +
        +
        + + + + +
        ktxVulkanTexture_subAllocatorFreeMemFuncPtr freeMemFuncPtr
        +
        +

        Pointer to the free procurement function.

        + +
        +
        + +

        ◆ memoryMapFuncPtr

        + +
        +
        + + + + +
        ktxVulkanTexture_subAllocatorMemoryMapFuncPtr memoryMapFuncPtr
        +
        +

        Pointer to function for mapping the memory of a specific page.

        + +
        +
        + +

        ◆ memoryUnmapFuncPtr

        + +
        +
        + + + + +
        ktxVulkanTexture_subAllocatorMemoryUnmapFuncPtr memoryUnmapFuncPtr
        +
        +

        Pointer to function for unmapping the memory of a specific page.

        + +
        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/libktx/structktxVulkanTexture__subAllocatorCallbacks.js b/ktx/build/docs/html/libktx/structktxVulkanTexture__subAllocatorCallbacks.js new file mode 100644 index 0000000..6e406f8 --- /dev/null +++ b/ktx/build/docs/html/libktx/structktxVulkanTexture__subAllocatorCallbacks.js @@ -0,0 +1,9 @@ +var structktxVulkanTexture__subAllocatorCallbacks = +[ + [ "allocMemFuncPtr", "structktxVulkanTexture__subAllocatorCallbacks.html#a2e43825e9413d23c3d6922395071db03", null ], + [ "bindBufferFuncPtr", "structktxVulkanTexture__subAllocatorCallbacks.html#a2689a954037c8baaa1edf32d2834a693", null ], + [ "bindImageFuncPtr", "structktxVulkanTexture__subAllocatorCallbacks.html#a022984b3cdb46dc478d96b6b7f6f0530", null ], + [ "freeMemFuncPtr", "structktxVulkanTexture__subAllocatorCallbacks.html#a729da8478ea87a7f3683b3c010f8cffc", null ], + [ "memoryMapFuncPtr", "structktxVulkanTexture__subAllocatorCallbacks.html#a2c66dedde7a8f263c02134ac1404e9bf", null ], + [ "memoryUnmapFuncPtr", "structktxVulkanTexture__subAllocatorCallbacks.html#a3ada5bd5daf1344f27bdd04b803a7b5b", null ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/tabs.css b/ktx/build/docs/html/libktx/tabs.css new file mode 100644 index 0000000..84f33ae --- /dev/null +++ b/ktx/build/docs/html/libktx/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-color:var(--nav-menu-background-color)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;line-height:36px;text-decoration:none;color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-color:var(--nav-menu-background-color);line-height:36px}.sm-dox a span.sub-arrow{top:15px;right:10px;box-sizing:content-box;padding:0;margin:0;display:inline-block;width:5px;height:5px;background-color:var(--nav-menu-background-color);border-right:2px solid var(--nav-arrow-color);border-bottom:2px solid var(--nav-arrow-color);transform:rotate(45deg);-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 6px}.sm-dox a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px !important}.sm-dox a:hover span.sub-arrow{background-color:var(--nav-menu-active-bg);border-right:2px solid var(--nav-arrow-selected-color);border-bottom:2px solid var(--nav-arrow-selected-color)}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0;padding:3px}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{transform:rotate(-45deg)}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:6px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:6px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/ktx/build/docs/html/libktx/topics.html b/ktx/build/docs/html/libktx/topics.html new file mode 100644 index 0000000..0c76b62 --- /dev/null +++ b/ktx/build/docs/html/libktx/topics.html @@ -0,0 +1,114 @@ + + + + + + + +libktx Reference: Topics + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Topics
        +
        +
        +
        Here is a list of all topics with brief descriptions:
        + + + + + +
         OpenGL Texture Image LoaderCreate texture objects in current OpenGL context
         ReaderRead KTX-formatted data
         Vulkan Texture Image LoaderCreate texture images on a Vulkan device
         WriterWrite KTX-formatted data
        +
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/libktx/topics.js b/ktx/build/docs/html/libktx/topics.js new file mode 100644 index 0000000..afbc262 --- /dev/null +++ b/ktx/build/docs/html/libktx/topics.js @@ -0,0 +1,7 @@ +var topics = +[ + [ "OpenGL Texture Image Loader", "group__ktx__glloader.html", "group__ktx__glloader" ], + [ "Reader", "group__reader.html", "group__reader" ], + [ "Vulkan Texture Image Loader", "group__ktx__vkloader.html", "group__ktx__vkloader" ], + [ "Writer", "group__writer.html", "group__writer" ] +]; \ No newline at end of file diff --git a/ktx/build/docs/html/libktx/vkload_8cpp-example.html b/ktx/build/docs/html/libktx/vkload_8cpp-example.html new file mode 100644 index 0000000..4c42623 --- /dev/null +++ b/ktx/build/docs/html/libktx/vkload_8cpp-example.html @@ -0,0 +1,267 @@ + + + + + + + +libktx Reference: vkload.cpp + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        libktx Reference 0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        vkload.cpp
        +
        +
        +

        This shows how to create and load a Vulkan image using the Vulkan texture image loading functions.

        +
        // Copyright 2018-2020 The Khronos Group Inc.
        +
        // SPDX-License-Identifier: Apache-2.0
        +
        +
        #include <vulkan/vulkan.h>
        +
        #include <ktxvulkan.h>
        +
        // Use c++ to keep the example short. Not required.
        +
        #include <vulkan/vulkan.hpp>
        +
        +
        class Texture {
        +
        public:
        +
        Texture(const std::string ktxfile);
        +
        ~Texture();
        +
        +
        protected:
        + +
        vk::PhysicalDevice gpu;
        +
        vk::Device device;
        +
        vk::Queue queue;
        +
        vk::CommandPool commandPool;
        +
        +
        cleanup();
        +
        prepareSamplerAndView();
        +
        };
        +
        +
        Texture::Texture(const std::string ktxfile)
        +
        {
        + +
        ktxTexture* kTexture;
        +
        KTX_error_code ktxresult;
        +
        +
        createVulkanInstance();
        +
        findVulkanGpu(); // Find a suitable physical device
        +
        createVulkanSurface();
        +
        createVulkanDevice();
        +
        prepareVulkanSwapchain();
        +
        /*
        +
        .
        +
        .
        +
        .
        +
        */
        +
        +
        // This structure is used to pass the Vulkan device information to the loader
        +
        // with the expectation that app's will typically load many textures.
        +
        ktxVulkanDeviceInfo_Construct(&kvdi, gpu, device, queue, commandPool, nullptr);
        +
        +
        ktxresult = ktxTexture_CreateFromNamedFile(
        +
        (getAssetPath() + ktxfile).c_str(),
        +
        KTX_TEXTURE_CREATE_NO_FLAGS,
        +
        &kTexture);
        +
        if (KTX_SUCCESS != ktxresult) {
        +
        std::stringstream message;
        +
        +
        message << "Creation of ktxTexture from \"" << getAssetPath()
        +
        << ktxfile << "\" failed: " << ktxErrorString(ktxresult);
        +
        throw std::runtime_error(message.str());
        +
        }
        +
        ktxresult = ktxTexture_VkUploadEx(kTexture, &kvdi, &texture,
        +
        VK_IMAGE_TILING_OPTIMAL,
        +
        VK_IMAGE_USAGE_SAMPLED_BIT,
        +
        VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
        +
        if (KTX_SUCCESS != ktxresult) {
        +
        std::stringstream message;
        +
        +
        message << "ktxTexture_VkUpload failed: " << ktxErrorString(ktxresult);
        +
        throw std::runtime_error(message.str());
        +
        }
        +
        +
        char* pValue;
        +
        uint32_t valueLen;
        +
        if (KTX_SUCCESS == ktxHashTable_FindValue(&kTexture->kvDataHead,
        + +
        &valueLen, (void**)&pValue))
        +
        {
        +
        char s, t;
        +
        +
        if (sscanf(pValue, KTX_ORIENTATION2_FMT, &s, &t) == 2) {
        +
        if (s == 'l') sign_s = -1;
        +
        if (t == 'u') sign_t = -1;
        +
        }
        +
        }
        +
        +
        ktxTexture_Destroy(kTexture);
        +
        ktxVulkanDeviceInfo_destruct(&kvdi);
        +
        +
        try {
        +
        prepareSamplerAndView(); // See below for implementation.
        +
        // Setup a layout with, e.g., a binding for a combined image-sampler.
        +
        setupDescriptorSetLayout();
        +
        // Create a descriptor set and update it with the sampler and image view handles.
        +
        setupDescriptorSet();
        +
        preparePipelines();
        +
        setupDescriptorPool();
        +
        setupDescriptorSet();
        +
        buildCommandBuffers();
        +
        } catch (std::exception&) {
        +
        cleanup();
        +
        throw;
        +
        }
        +
        }
        +
        +
        Texture::~Texture()
        +
        {
        +
        cleanup();
        +
        }
        +
        +
        Texture::cleanup()
        +
        {
        +
        destroyCommandBuffers();
        +
        destroySampler();
        +
        destroyImageview();
        +
        ktxVulkanTexture_destruct(&texture, device, nullptr);
        +
        /*
        +
        .
        +
        .
        +
        .
        +
        */
        +
        }
        +
        +
        void
        +
        Texture::prepareSamplerAndView()
        +
        {
        +
        // Create sampler.
        +
        vk::SamplerCreateInfo samplerInfo;
        +
        // Set the non-default values
        +
        samplerInfo.magFilter = vk::Filter::eLinear;
        +
        samplerInfo.minFilter = vk::Filter::eLinear;
        +
        samplerInfo.mipmapMode = vk::SamplerMipmapMode::eLinear;
        +
        samplerInfo.maxLod = texture.levelCount;
        +
        samplerInfo.anisotropyEnable = false;
        +
        samplerInfo.maxAnisotropy = 1.0;
        +
        samplerInfo.borderColor = vk::BorderColor::eFloatOpaqueWhite;
        +
        sampler = vkctx.device.createSampler(samplerInfo);
        +
        +
        // Create image view.
        +
        // Textures are not directly accessed by the shaders and are abstracted
        +
        // by image views containing additional information and sub resource
        +
        // ranges.
        +
        vk::ImageViewCreateInfo viewInfo;
        +
        // Set the non-default values.
        +
        viewInfo.image = texture.image;
        +
        viewInfo.format = static_cast<vk::Format>(texture.imageFormat);
        +
        viewInfo.viewType = static_cast<vk::ImageViewType>(texture.viewType);
        +
        viewInfo.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;
        +
        viewInfo.subresourceRange.layerCount = texture.layerCount;
        +
        viewInfo.subresourceRange.levelCount = texture.levelCount;
        +
        imageView = vkctx.device.createImageView(viewInfo);
        +
        }
        +
        +
        /* -*- tab-width: 4; -*- */
        +
        /* vi: set sw=2 ts=4 expandtab: */
        +
        #define ktxTexture_Destroy(This)
        Helper for calling the Destroy virtual method of a ktxTexture.
        Definition ktx.h:533
        +
        @ KTX_SUCCESS
        Definition ktx.h:170
        +
        #define KTX_ORIENTATION_KEY
        Key string for standard orientation metadata.
        Definition ktx.h:124
        +
        KTX_API const char *KTX_APIENTRY ktxErrorString(KTX_error_code error)
        Return a string corresponding to a KTX error code.
        Definition strings.c:59
        +
        #define KTX_ORIENTATION2_FMT
        Standard KTX 1 format for 2D orientation value.
        Definition ktx.h:149
        +
        #define KTX_error_code
        For backward compatibility.
        Definition ktx.h:198
        +
        Base class representing a texture.
        Definition ktx.h:287
        +
        ktxHashList kvDataHead
        Head of the hash list of metadata.
        Definition ktx.h:288
        +
        Struct for passing information about the Vulkan device on which to create images to the texture image...
        Definition ktxvulkan.h:188
        +
        Struct for returning information about the Vulkan texture image created by the ktxTexture_VkUpload* f...
        Definition ktxvulkan.h:108
        +
        +
        +
        + + + + diff --git a/ktx/build/docs/html/license.html b/ktx/build/docs/html/license.html new file mode 100644 index 0000000..ecb320e --- /dev/null +++ b/ktx/build/docs/html/license.html @@ -0,0 +1,145 @@ + + + + + + + + + +Khronos Texture Software: LICENSE file for the KhronosGroup/KTX-Software project + + + + + + + + + + + + + + + + + + +
        +
        + + + + + + + +
        +
        Khronos Texture Software +  0.0.0 +
        +
        Libraries and tools to create and read KTX image texture files.
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        LICENSE file for the KhronosGroup/KTX-Software project
        +
        +
        +

        +

        Files unique to this repository generally fall under the Apache 2.0 license with copyright holders including Mark Callow, the KTX-Software author; The Khronos Group Inc., which has supported KTX development; and other contributors to the KTX project.

        +

        Because KTX-Software incorporates material and contributions from many other projects, which often have their own licenses, there are many other licenses in use in this repository. While there are many licenses in this repository, with rare exceptions all are open source licenses that we believe to be mutually compatible.

        +

        The complete text of each of the licenses used in this repository is found in LICENSES/*.txt . Additionally, we have updated the repository to pass the REUSE compliance checker tool (see https://reuse.software/). REUSE verifies that every file in a git repository either incorporates a license, or that the license is present in auxiliary files such as .reuse/dep5 . To obtain a bill of materials for the repository identifying the license for each file, install the REUSE tool and run

        reuse spdx
        +

        inside the repository.

        +

        +Special Cases

        +

        The file lib/etcdec.cxx is not open source. It is made available under the terms of an Ericsson license, found in the file itself.

        +
        +
        +
        + +
        + + + + diff --git a/ktx/build/docs/html/menu.js b/ktx/build/docs/html/menu.js new file mode 100644 index 0000000..15f9c52 --- /dev/null +++ b/ktx/build/docs/html/menu.js @@ -0,0 +1,131 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search,treeview) { + function makeTree(data,relPath) { + let result=''; + if ('children' in data) { + result+='
          '; + for (let i in data.children) { + let url; + const link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
        • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
        • '; + } + result+='
        '; + } + return result; + } + let searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
        '+ + '
        '+ + '
        '+ + ''+ + '
        '+ + '
        '+ + '
        '+ + '
        '; + } else { + searchBoxHtml='
        '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
        '+ + '
        '+ + '
        '; + } + } + + $('#main-nav').before('
        '+ + ''+ + ''+ + '
        '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + $('#main-menu').append('
      • '); + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; + if ($mainMenuState.length) { + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(treeview); + } + // animate mobile menu + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = () => $menu.css('display', 'block'); + $menu.hide().slideDown(options); + } else { + options['complete'] = () => $menu.css('display', 'none'); + $menu.show().slideUp(options); + } + }); + // set default menu visibility + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/ktx/build/docs/html/menudata.js b/ktx/build/docs/html/menudata.js new file mode 100644 index 0000000..321bdcf --- /dev/null +++ b/ktx/build/docs/html/menudata.js @@ -0,0 +1,32 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Package",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"KTX Tools Reference",url:"ktxtools/index.html"}, +{text:"libktx Reference",url:"libktx/index.html"}, +{text:"KTX Javascript Wrappers Reference",url:"ktxjswrappers/index.html"}, +{text:"pyktx Reference",url:"pyktx/index.html"}, +{text:"",url:"license.html"}]} diff --git a/ktx/build/docs/html/navtree.css b/ktx/build/docs/html/navtree.css new file mode 100644 index 0000000..0ea3a07 --- /dev/null +++ b/ktx/build/docs/html/navtree.css @@ -0,0 +1,327 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0; + padding:0; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + position: relative; + background-color: var(--nav-menu-active-bg); + border-radius: 0 6px 6px 0; + /*margin-right: 5px;*/ +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); + line-height: 22px; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--page-link-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin: 0 6px 0 -5px; + padding: 0 0 0 5px; + height: 22px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; +} + +.ui-resizable-e:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +.ui-resizable-e:hover { + opacity: 1; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ + scrollbar-width: thin; + border-right: 1px solid var(--nav-border-color); + padding-left: 5px; +} + +#nav-sync { + position:absolute; + top:0px; + right:0px; + z-index:1; +} + +#nav-sync img { + opacity:0.3; +} + +div.nav-sync-icon { + position: relative; + width: 24px; + height: 17px; + left: -6px; + top: -1px; + opacity: 0.7; + display: inline-block; + background-color: var(--sync-icon-background-color); + border: 1px solid var(--sync-icon-border-color); + box-sizing: content-box; +} + +div.nav-sync-icon:hover { + background-color: var(--sync-icon-selected-background-color); + opacity: 1.0; +} + +div.nav-sync-icon.active:after { + content: ''; + background-color: var(--sync-icon-background-color); + border-top: 2px solid var(--sync-icon-color); + position: absolute; + width: 16px; + height: 0px; + top: 7px; + left: 4px; +} + +div.nav-sync-icon.active:hover:after { + border-top: 2px solid var(--sync-icon-selected-color); +} + +span.sync-icon-left { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 4px; + display: inline-block; + width: 8px; + height: 8px; + border-left: 2px solid var(--sync-icon-color); + border-top: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +span.sync-icon-right { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 10px; + display: inline-block; + width: 8px; + height: 8px; + border-right: 2px solid var(--sync-icon-color); + border-bottom: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +div.nav-sync-icon:hover span.sync-icon-left { + border-left: 2px solid var(--sync-icon-selected-color); + border-top: 2px solid var(--sync-icon-selected-color); +} + +div.nav-sync-icon:hover span.sync-icon-right { + border-right: 2px solid var(--sync-icon-selected-color); + border-bottom: 2px solid var(--sync-icon-selected-color); +} + +#nav-path ul { + border-top: 1px solid var(--nav-breadcrumb-separator-color); +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + +/*---------------------------*/ +#container { + display: grid; + grid-template-columns: auto auto; + overflow: hidden; +} + +#page-nav { + background: var(--nav-background-color); + display: block; + width: 250px; + box-sizing: content-box; + position: relative; + border-left: 1px solid var(--nav-border-color); +} + +#page-nav-tree { + display: inline-block; +} + +#page-nav-resize-handle { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; + z-index: 1; + user-select: none; +} + +#page-nav-resize-handle:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +#page-nav-resize-handle.dragging, +#page-nav-resize-handle:hover { + opacity: 1; +} + +#page-nav-contents { + padding: 0; + margin: 0; + display: block; + top: 0; + left: 0; + height: 100%; + width: 100%; + position: absolute; + overflow: auto; + scrollbar-width: thin; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +ul.page-outline, +ul.page-outline ul { + text-indent: 0; + list-style: none outside none; + padding: 0 0 0 4px; +} + +ul.page-outline { + margin: 0 4px 4px 6px; +} + +ul.page-outline div.item { + font: 12px var(--font-family-nav); + line-height: 22px; +} + +ul.page-outline li { + white-space: nowrap; +} + +ul.page-outline li.vis { + background-color: var(--nav-breadcrumb-active-bg); +} + +#container.resizing { + cursor: col-resize; + user-select: none; +} diff --git a/ktx/build/docs/html/navtree.js b/ktx/build/docs/html/navtree.js new file mode 100644 index 0000000..fac8d01 --- /dev/null +++ b/ktx/build/docs/html/navtree.js @@ -0,0 +1,901 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initNavTree(toroot,relpath,allMembersFile) { + let navTreeSubIndices = []; + const ARROW_DOWN = ''; + const ARROW_RIGHT = ''; + const NAVPATH_COOKIE_NAME = ''+'navpath'; + const fullSidebar = typeof page_layout!=='undefined' && page_layout==1; + + function getScrollBarWidth () { + let outer = $('
        ').css({visibility: 'hidden', width: 100, overflow: 'scroll', scrollbarWidth: 'thin'}).appendTo('body'); + let widthWithScroll = $('
        ').css({width: '100%'}).appendTo(outer).outerWidth(); + outer.remove(); + return 100 - widthWithScroll; + } + const scrollbarWidth = getScrollBarWidth(); + + function adjustSyncIconPosition() { + if (!fullSidebar) { + const nt = document.getElementById("nav-tree"); + const hasVerticalScrollbar = nt.scrollHeight > nt.clientHeight; + $("#nav-sync").css({right:parseInt(hasVerticalScrollbar?scrollbarWidth:0)}); + } + } + + const getData = function(varName) { + const i = varName.lastIndexOf('/'); + const n = i>=0 ? varName.substring(i+1) : varName; + const e = n.replace(/-/g,'_'); + return window[e]; + } + + const stripPath = function(uri) { + return uri.substring(uri.lastIndexOf('/')+1); + } + + const stripPath2 = function(uri) { + const i = uri.lastIndexOf('/'); + const s = uri.substring(i+1); + const m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; + } + + const hashValue = function() { + return $(location).attr('hash').substring(1).replace(/[^\w-]/g,''); + } + + const hashUrl = function() { + return '#'+hashValue(); + } + + const pathName = function() { + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;()]/g, ''); + } + + const storeLink = function(link) { + if (!$("#nav-sync").hasClass('sync')) { + Cookie.writeSetting(NAVPATH_COOKIE_NAME,link,0); + } + } + + const deleteLink = function() { + Cookie.eraseSetting(NAVPATH_COOKIE_NAME); + } + + const cachedLink = function() { + return Cookie.readSetting(NAVPATH_COOKIE_NAME,''); + } + + const getScript = function(scriptName,func) { + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = function() { func(); adjustSyncIconPosition(); } + script.src = scriptName+'.js'; + head.appendChild(script); + } + + const createIndent = function(o,domNode,node) { + let level=-1; + let n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + const imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=ARROW_RIGHT; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).removeClass('opened').addClass('closed'); + node.expanded = false; + } else { + expandNode(o, node, false, true); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + let span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } + } + + let animationInProgress = false; + + const gotoAnchor = function(anchor,aname) { + let pos, docContent = $('#doc-content'); + let ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || + ancParent.is(':header')) { + pos = ancParent.offset().top; + } else if (anchor.position()) { + pos = anchor.offset().top; + } + if (pos) { + const dcOffset = docContent.offset().top; + const dcHeight = docContent.height(); + const dcScrHeight = docContent[0].scrollHeight + const dcScrTop = docContent.scrollTop(); + let dist = Math.abs(Math.min(pos-dcOffset,dcScrHeight-dcHeight-dcScrTop)); + animationInProgress = true; + docContent.animate({ + scrollTop: pos + dcScrTop - dcOffset + },Math.max(50,Math.min(500,dist)),function() { + animationInProgress=false; + if (anchor.parent().attr('class')=='memItemLeft') { + let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname') { + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype') { + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } + }); + } + } + + function htmlToNode(html) { + const template = document.createElement('template'); + template.innerHTML = html; + const nNodes = template.content.childNodes.length; + if (nNodes !== 1) { + throw new Error(`html parameter must represent a single node; got ${nNodes}. `); + } + return template.content.firstChild; + } + + const newNode = function(o, po, text, link, childrenData, lastNode) { + const node = { + children : [], + childrenData : childrenData, + depth : po.depth + 1, + relpath : po.relpath, + isLast : lastNode, + li : document.createElement("li"), + parentNode : po, + itemDiv : document.createElement("div"), + labelSpan : document.createElement("span"), + expanded : false, + childrenUL : null, + getChildrenUL : function() { + if (!this.childrenUL) { + this.childrenUL = document.createElement("ul"); + this.childrenUL.className = "children_ul"; + this.childrenUL.style.display = "none"; + this.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }, + }; + + node.itemDiv.className = "item"; + node.labelSpan.className = "label"; + createIndent(o,node.itemDiv,node); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + const a = document.createElement("a"); + node.labelSpan.appendChild(a); + po.getChildrenUL().appendChild(node.li); + a.appendChild(htmlToNode(''+text+'')); + if (link) { + let url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + const aname = '#'+link.split('#')[1]; + const srcPage = stripPath(pathName()); + const targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : aname; + a.onclick = function() { + storeLink(link); + aPPar = $(a).parent().parent(); + if (!aPPar.hasClass('selected')) { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + aPPar.addClass('selected'); + aPPar.attr('id','selected'); + } + const anchor = $(aname); + gotoAnchor(anchor,aname); + }; + } else { + a.href = url; + a.onclick = () => storeLink(link); + } + } else if (childrenData != null) { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + return node; + } + + const showRoot = function() { + const headerHeight = $("#top").height(); + const footerHeight = $("#nav-path").height(); + const windowHeight = $(window).height() - headerHeight - footerHeight; + (function() { // retry until we can scroll to the selected item + try { + const navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); + } + + const expandNode = function(o, node, imm, setFocus) { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + expandNode(o, node, imm, setFocus); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).addClass('opened').removeClass('closed'); + node.expanded = true; + if (setFocus) { + $(node.expandToggle).focus(); + } + } + } + } + + const glowEffect = function(n,duration) { + n.addClass('glow').delay(duration).queue(function(next) { + $(this).removeClass('glow');next(); + }); + } + + const highlightAnchor = function() { + const aname = hashUrl(); + const anchor = $(aname); + gotoAnchor(anchor,aname); + } + + const selectAndHighlight = function(hash,n) { + let a; + if (hash) { + const link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + let topOffset=5; + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + showRoot(); + } + + const showNode = function(o, node, index, hash) { + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + showNode(o,node,index,hash); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + $(node.plus_img.childNodes[0]).removeClass('closed').addClass('opened'); + node.expanded = true; + const n = node.children[o.breadcrumbs[index]]; + if (index+10) { // try root page without hash as fallback + gotoUrl(o,root,'',relpath); + } else { + o.breadcrumbs = $.extend(true, [], nti); + if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index + navTo(o,NAVTREE[0][1],"",relpath); + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + } + if (o.breadcrumbs) { + o.breadcrumbs.unshift(0); // add 0 for root node + showNode(o, o.node, 0, hash); + } + } + } + + const gotoUrl = function(o,root,hash,relpath) { + const url=root+hash; + let i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function() { + navTreeSubIndices[i] = window['NAVTREEINDEX'+i]; + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); + } + } + + const navTo = function(o,root,hash,relpath) { + const link = cachedLink(); + if (link) { + const parts = link.split('#'); + root = parts[0]; + hash = parts.length>1 ? '#'+parts[1].replace(/[^\w-]/g,'') : ''; + } + if (hash.match(/^#l\d+$/)) { + const anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + gotoUrl(o,root,hash,relpath); + } + + const showSyncOff = function(n,relpath) { + n.html(''); + } + + const showSyncOn = function(n,relpath) { + n.html(''); + } + + const o = { + toroot : toroot, + node : { + childrenData : NAVTREE, + children : [], + childrenUL : document.createElement("ul"), + getChildrenUL : function() { return this.childrenUL }, + li : document.getElementById("nav-tree-contents"), + depth : 0, + relpath : relpath, + expanded : false, + isLast : true, + plus_img : document.createElement("span"), + }, + }; + o.node.li.appendChild(o.node.childrenUL); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = ARROW_RIGHT; + + const navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + + navSync.click(() => { + const navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } + }); + + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + + $(window).bind('hashchange', () => { + if (!animationInProgress) { + if (window.location.hash && window.location.hash.length>1) { + let a; + if ($(location).attr('hash')) { + const clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ try to keep right panel width + const shrinkLeft = Math.min(deficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + const remainingDeficit = deficit - shrinkLeft; + const shrinkRight = Math.min(remainingDeficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + } else { // dragging right handle -> try to keep left panel width + const shrinkRight = Math.min(deficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + const remainingDeficit = deficit - shrinkRight; + const shrinkLeft = Math.min(remainingDeficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + } + } else { + rightPanelWidth = pagenav.length ? Math.max(minPanelWidth,rightPanelWidth) : 0; + leftPanelWidth = Math.max(minPanelWidth,leftPanelWidth); + } + return { leftPanelWidth, rightPanelWidth } + } + + function updateWidths(sidenavWidth,pagenavWidth,dragLeft) + { + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,dragLeft); + const widthStr = parseFloat(widths.leftPanelWidth)+"px"; + content.css({marginLeft:widthStr}); + if (fullSidebar) { + footer.css({marginLeft:widthStr}); + if (mainnav) { + mainnav.css({marginLeft:widthStr}); + } + } + sidenav.css({width:widthStr}); + if (pagenav.length) { + container.css({gridTemplateColumns:'auto '+parseFloat(widths.rightPanelWidth)+'px'}); + if (!dragLeft) { + pagenav.css({width:parseFloat(widths.rightPanelWidth-1)+'px'}); + } + } + return widths; + } + + function resizeWidth(dragLeft) { + const sidenavWidth = $(sidenav).outerWidth()-barWidth; + let pagenavWidth = pagenav.length ? $(pagenav).outerWidth() : 0; + const widths = updateWidths(sidenavWidth,pagenavWidth,dragLeft); + Cookie.writeSetting(RESIZE_COOKIE_NAME,widths.leftPanelWidth-barWidth); + if (pagenav.length) { + Cookie.writeSetting(PAGENAV_COOKIE_NAME,widths.rightPanelWidth); + } + } + + function restoreWidth(sidenavWidth,pagenavWidth) { + updateWidths(sidenavWidth,pagenavWidth,false); + showHideNavBar(); + } + + function resizeHeight() { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (!fullSidebar) { + contentHeight = windowHeight - headerHeight - footerHeight - 1; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (fullSidebar) { + contentHeight = windowHeight - footerHeight - 1; + navtreeHeight = windowHeight - headerHeight - 1; + sideNavHeight = windowHeight - 1; + if (mainnav) { + contentHeight -= mainnav.outerHeight(); + } + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + content.css({height:contentHeight + "px"}); + resizeWidth(false); + showHideNavBar(); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (document.getElementById('main-nav')) { + mainnav = $("#main-nav"); + } + navtree = $("#nav-tree"); + pagenav = $("#page-nav"); + container = $("#container"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(true); } }); + $(sidenav).resizable({ minWidth: 0 }); + if (pagenav.length) { + pagehandle = $("#page-nav-resize-handle"); + pagehandle.on('mousedown touchstart',function(e) { + $('body').addClass('resizing'); + pagehandle.addClass('dragging'); + $(document).on('mousemove touchmove',function(e) { + const clientX = e.clientX || e.originalEvent.touches[0].clientX; + let pagenavWidth = container[0].offsetWidth-clientX+barWidth/2; + const sidenavWidth = sidenav.width(); + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,false); + container.css({gridTemplateColumns:'auto '+parseFloat(widths.rightPanelWidth)+'px'}); + pagenav.css({width:parseFloat(widths.rightPanelWidth-1)+'px'}); + content.css({marginLeft:parseFloat(widths.leftPanelWidth)+'px'}); + Cookie.writeSetting(PAGENAV_COOKIE_NAME,pagenavWidth); + }); + $(document).on('mouseup touchend', function(e) { + $('body').removeClass('resizing'); + pagehandle.removeClass('dragging'); + $(document).off('mousemove mouseup touchmove touchend'); + }); + }); + } else { + container.css({gridTemplateColumns:'auto'}); + } + const width = parseInt(Cookie.readSetting(RESIZE_COOKIE_NAME,250)); + const pagenavWidth = parseInt(Cookie.readSetting(PAGENAV_COOKIE_NAME,250)); + if (width) { restoreWidth(width+barWidth,pagenavWidth); } else { resizeWidth(); } + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(window).ready(function() { + let lastWidth = -1; + let lastHeight = -1; + $(window).resize(function() { + const newWidth = $(this).width(), newHeight = $(this).height(); + if (newWidth!=lastWidth || newHeight!=lastHeight) { + resizeHeight(); + navtree_trampoline.updateContentTop(); + lastWidth = newWidth; + lastHeight = newHeight; + } + }); + resizeHeight(); + lastWidth = $(window).width(); + lastHeight = $(window).height(); + content.scroll(function() { + navtree_trampoline.updateContentTop(); + }); + }); + } + + + function initPageToc() { + const topMapping = []; + const toc_contents = $('#page-nav-contents'); + const content=$('
          ').addClass('page-outline'); + + var entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/', + '`': '`', + '=': '=' + }; + function escapeHtml (string) { + return String(string).replace(/[&<>"'`=\/]/g, function (s) { + return entityMap[s]; + }); + } + + // for ClassDef/GroupDef/ModuleDef/ConceptDef/DirDef + const groupSections = []; + let currentGroup = null; + $('h2.groupheader, h2.memtitle').each(function(){ + const $element = $(this); + if ($element.hasClass('groupheader')) { + currentGroup = { groupHeader: $element, memTitles: [] }; + groupSections.push(currentGroup); + } else if ($element.hasClass('memtitle') && currentGroup) { + currentGroup.memTitles.push($element); + } + }); + groupSections.forEach(function(item){ + const title = item.groupHeader.text().trim(); + let id = item.groupHeader.attr('id'); + const table = item.groupHeader.parents('table.memberdecls'); + let rows = $(); + if (table.length>0) { + rows = table.find("tr[class^='memitem:'] td.memItemRight, tr[class^='memitem:'] td.memItemLeft.anon, tr[class=groupHeader] td"); + } + function hasSubItems() { + return item.memTitles.length>0 || rows.toArray().some(function(el) { return $(el).is(':visible'); }); + } + const li = $('
        • ').attr('id','nav-'+id); + const div = $('
          ').addClass('item'); + const span = $('').addClass('arrow').css({ paddingLeft:'0' }); + if (hasSubItems()) { + span.append($('').addClass('arrowhead opened')); + } + const ahref = $('').attr('href','#'+id).append(title); + content.append(li.append(div.append(span).append(ahref))); + topMapping.push(id); + const ulStack = []; + ulStack.push(content); + if (hasSubItems()) { + let last_id = undefined; + let inMemberGroup = false; + // declaration sections have rows for items + rows.each(function(){ + let td = $(this); + let tr = $(td).parent(); + const is_anon_enum = td.contents().first().text().trim()=='{'; + if (tr.hasClass('template')) { + tr = tr.prev(); + } + id = $(tr).attr('id'); + let text = is_anon_enum ? 'anonymous enum' : $(this).find(':first-child').text(); + let isMemberGroupHeader = $(tr).hasClass('groupHeader'); + if ($(tr).is(":visible") && last_id!=id && id!==undefined) { + if (isMemberGroupHeader && inMemberGroup) { + ulStack.pop(); + inMemberGroup=false; + } + const li2 = $('
        • ').attr('id','nav-'+id); + const div2 = $('
          ').addClass('item'); + const span2 = $('').addClass('arrow').css({ paddingLeft:parseInt(ulStack.length*16)+'px' }); + const ahref = $('').attr('href','#'+id).append(escapeHtml(text)); + li2.append(div2.append(span2).append(ahref)); + topMapping.push(id); + if (isMemberGroupHeader) { + span2.append($('').addClass('arrowhead opened')); + ulStack[ulStack.length-1].append(li2); + const ul2 = $('
            '); + ulStack.push(ul2); + li2.append(div2).append(ul2); + inMemberGroup=true; + } else { + ulStack[ulStack.length-1].append(li2); + } + last_id=id; + } + }); + // detailed documentation has h2.memtitle sections for items + item.memTitles.forEach(function(data) { + const text = $(data).contents().not($(data).children().first()).text(); + const name = text.replace(/\(\)(\s*\[\d+\/\d+\])?$/, '') // func() [2/8] -> func + id = $(data).find('span.permalink a').attr('href') + if (id!==undefined && name!==undefined) { + const li2 = $('
          • ').attr('id','nav-'+id.substring(1)); + const div2 = $('
          • '); + const div = $('
            ').addClass('item'); + const span = $('').addClass('arrow').css({ paddingLeft:'0' }); + const ahref = $('').attr('href',srcBaseUrl+dstBaseUrl+pageName).addClass('noscroll'); + content.append(li.append(div.append(span).append(ahref.append(LISTOFALLMEMBERS)))); + } + + if (groupSections.length==0) { + // for PageDef + const sectionTree = [], sectionStack = []; + $('h1.doxsection, h2.doxsection, h3.doxsection, h4.doxsection, h5.doxsection, h6.doxsection').each(function(){ + const level = parseInt(this.tagName[1]); + const anchor = $(this).find('a.anchor').attr('id'); + const node = { text: $(this).html(), id: anchor, children: [] }; + while (sectionStack.length && sectionStack[sectionStack.length - 1].level >= level) sectionStack.pop(); + (sectionStack.length ? sectionStack[sectionStack.length - 1].children : sectionTree).push(node); + sectionStack.push({ ...node, level }); + }); + if (sectionTree.length>0) { + function render(nodes, level=0) { + nodes.map(n => { + const li = $('
          • ').attr('id','nav-'+n.id); + const div = $('
            ').addClass('item'); + const span = $('').addClass('arrow').attr('style','padding-left:'+parseInt(level*16)+'px;'); + if (n.children.length > 0) { span.append($('').addClass('arrowhead opened')); } + const url = $('').attr('href','#'+n.id); + content.append(li.append(div.append(span).append(url.append(n.text)))); + topMapping.push(n.id); + render(n.children,level+1); + }); + } + render(sectionTree); + } + } + + toc_contents.append(content); + + $(".page-outline a[href]:not(.noscroll)").click(function(e) { + e.preventDefault(); + const aname = $(this).attr("href"); + gotoAnchor($(aname),aname); + }); + + let lastScrollSourceOffset = -1; + let lastScrollTargetOffset = -1; + let lastScrollTargetId = ''; + + navtree_trampoline.updateContentTop = function() { + const pagenavcontents = $("#page-nav-contents"); + if (pagenavcontents.length) { + const content = $("#doc-content"); + const height = content.height(); + const navy = pagenavcontents.offset().top; + const yc = content.offset().top; + let offsets = [] + for (let i=0;imargin || ye>margin) && (yslastScrollTargetOffset) || + (!scrollDown && targetOffset { + navtree_trampoline.updateContentTop(); + },200); + } + $(document).ready(function() { initPageToc(); initResizable(); }); + +} +/* @license-end */ diff --git a/ktx/build/docs/html/navtreedata.js b/ktx/build/docs/html/navtreedata.js new file mode 100644 index 0000000..4f26f91 --- /dev/null +++ b/ktx/build/docs/html/navtreedata.js @@ -0,0 +1,47 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var NAVTREE = +[ + [ "Khronos Texture Software", "index.html", [ + [ "Authors", "authors.html", null ], + [ "LICENSE file for the KhronosGroup/KTX-Software project", "license.html", [ + [ "Special Cases", "license.html#autotoc_md3", null ] + ] ], + [ "KTX Tools Reference", "ktxtools/index.html", null ], + [ "libktx Reference", "libktx/index.html", null ], + [ "KTX Javascript Wrappers Reference", "ktxjswrappers/index.html", null ], + [ "pyktx Reference", "pyktx/index.html", null ], + [ "", "license.html", null ] + ] ] +]; + +var NAVTREEINDEX = +[ +"authors.html" +]; + +var SYNCONMSG = 'click to disable panel synchronization'; +var SYNCOFFMSG = 'click to enable panel synchronization'; +var LISTOFALLMEMBERS = 'List of all members'; \ No newline at end of file diff --git a/ktx/build/docs/html/navtreeindex0.js b/ktx/build/docs/html/navtreeindex0.js new file mode 100644 index 0000000..6b1a13a --- /dev/null +++ b/ktx/build/docs/html/navtreeindex0.js @@ -0,0 +1,13 @@ +var NAVTREEINDEX0 = +{ +"authors.html":[0], +"index.html":[], +"ktxjswrappers/index.html":[4], +"ktxtools/index.html":[2], +"libktx/index.html":[3], +"license.html":[1], +"license.html":[6], +"license.html#autotoc_md3":[1,0], +"pages.html":[], +"pyktx/index.html":[5] +}; diff --git a/ktx/build/docs/html/pages.html b/ktx/build/docs/html/pages.html new file mode 100644 index 0000000..3aa97fd --- /dev/null +++ b/ktx/build/docs/html/pages.html @@ -0,0 +1,135 @@ + + + + + + + + + +Khronos Texture Software: Related Pages + + + + + + + + + + + + + + + + + + +
            +
            + + + + + + + +
            +
            Khronos Texture Software +  0.0.0 +
            +
            Libraries and tools to create and read KTX image texture files.
            +
            +
            + + + + + + + + +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            +
            Loading...
            +
            Searching...
            +
            No Matches
            +
            +
            +
            +
            + +
            +
            Related Pages
            +
            +
            +
            Here is a list of all related documentation pages:
            +
            +
            +
            + +
            + + diff --git a/ktx/build/docs/html/search/all_0.js b/ktx/build/docs/html/search/all_0.js new file mode 100644 index 0000000..83f9d80 --- /dev/null +++ b/ktx/build/docs/html/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['authors_0',['Authors',['../authors.html',1,'']]] +]; diff --git a/ktx/build/docs/html/search/all_1.js b/ktx/build/docs/html/search/all_1.js new file mode 100644 index 0000000..29c7583 --- /dev/null +++ b/ktx/build/docs/html/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['cases_0',['Special Cases',['../license.html#autotoc_md3',1,'']]] +]; diff --git a/ktx/build/docs/html/search/all_2.js b/ktx/build/docs/html/search/all_2.js new file mode 100644 index 0000000..ba0b824 --- /dev/null +++ b/ktx/build/docs/html/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['documentation_0',['Note on Navigating the Documentation',['../index.html#autotoc_md0',1,'']]] +]; diff --git a/ktx/build/docs/html/search/all_3.js b/ktx/build/docs/html/search/all_3.js new file mode 100644 index 0000000..b34f7d5 --- /dev/null +++ b/ktx/build/docs/html/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['file_20for_20the_20khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]], + ['for_20the_20khronosgroup_20ktx_20software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/search/all_4.js b/ktx/build/docs/html/search/all_4.js new file mode 100644 index 0000000..b89867c --- /dev/null +++ b/ktx/build/docs/html/search/all_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['khronos_20texture_20software_0',['Khronos Texture Software',['../index.html',1,'']]], + ['khronosgroup_20ktx_20software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]], + ['ktx_20software_20project_2',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/search/all_5.js b/ktx/build/docs/html/search/all_5.js new file mode 100644 index 0000000..56b1a6e --- /dev/null +++ b/ktx/build/docs/html/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['license_20file_20for_20the_20khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/search/all_6.js b/ktx/build/docs/html/search/all_6.js new file mode 100644 index 0000000..afa9d22 --- /dev/null +++ b/ktx/build/docs/html/search/all_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['navigating_20the_20documentation_0',['Note on Navigating the Documentation',['../index.html#autotoc_md0',1,'']]], + ['note_20on_20navigating_20the_20documentation_1',['Note on Navigating the Documentation',['../index.html#autotoc_md0',1,'']]] +]; diff --git a/ktx/build/docs/html/search/all_7.js b/ktx/build/docs/html/search/all_7.js new file mode 100644 index 0000000..00aa693 --- /dev/null +++ b/ktx/build/docs/html/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['on_20navigating_20the_20documentation_0',['Note on Navigating the Documentation',['../index.html#autotoc_md0',1,'']]] +]; diff --git a/ktx/build/docs/html/search/all_8.js b/ktx/build/docs/html/search/all_8.js new file mode 100644 index 0000000..e828a10 --- /dev/null +++ b/ktx/build/docs/html/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/search/all_9.js b/ktx/build/docs/html/search/all_9.js new file mode 100644 index 0000000..69c5b5e --- /dev/null +++ b/ktx/build/docs/html/search/all_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['software_0',['Khronos Texture Software',['../index.html',1,'']]], + ['software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]], + ['special_20cases_2',['Special Cases',['../license.html#autotoc_md3',1,'']]] +]; diff --git a/ktx/build/docs/html/search/all_a.js b/ktx/build/docs/html/search/all_a.js new file mode 100644 index 0000000..305e239 --- /dev/null +++ b/ktx/build/docs/html/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['texture_20software_0',['Khronos Texture Software',['../index.html',1,'']]], + ['the_20documentation_1',['Note on Navigating the Documentation',['../index.html#autotoc_md0',1,'']]], + ['the_20khronosgroup_20ktx_20software_20project_2',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/search/pages_0.js b/ktx/build/docs/html/search/pages_0.js new file mode 100644 index 0000000..83f9d80 --- /dev/null +++ b/ktx/build/docs/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['authors_0',['Authors',['../authors.html',1,'']]] +]; diff --git a/ktx/build/docs/html/search/pages_1.js b/ktx/build/docs/html/search/pages_1.js new file mode 100644 index 0000000..29c7583 --- /dev/null +++ b/ktx/build/docs/html/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['cases_0',['Special Cases',['../license.html#autotoc_md3',1,'']]] +]; diff --git a/ktx/build/docs/html/search/pages_2.js b/ktx/build/docs/html/search/pages_2.js new file mode 100644 index 0000000..ba0b824 --- /dev/null +++ b/ktx/build/docs/html/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['documentation_0',['Note on Navigating the Documentation',['../index.html#autotoc_md0',1,'']]] +]; diff --git a/ktx/build/docs/html/search/pages_3.js b/ktx/build/docs/html/search/pages_3.js new file mode 100644 index 0000000..b34f7d5 --- /dev/null +++ b/ktx/build/docs/html/search/pages_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['file_20for_20the_20khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]], + ['for_20the_20khronosgroup_20ktx_20software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/search/pages_4.js b/ktx/build/docs/html/search/pages_4.js new file mode 100644 index 0000000..b89867c --- /dev/null +++ b/ktx/build/docs/html/search/pages_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['khronos_20texture_20software_0',['Khronos Texture Software',['../index.html',1,'']]], + ['khronosgroup_20ktx_20software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]], + ['ktx_20software_20project_2',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/search/pages_5.js b/ktx/build/docs/html/search/pages_5.js new file mode 100644 index 0000000..56b1a6e --- /dev/null +++ b/ktx/build/docs/html/search/pages_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['license_20file_20for_20the_20khronosgroup_20ktx_20software_20project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/search/pages_6.js b/ktx/build/docs/html/search/pages_6.js new file mode 100644 index 0000000..afa9d22 --- /dev/null +++ b/ktx/build/docs/html/search/pages_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['navigating_20the_20documentation_0',['Note on Navigating the Documentation',['../index.html#autotoc_md0',1,'']]], + ['note_20on_20navigating_20the_20documentation_1',['Note on Navigating the Documentation',['../index.html#autotoc_md0',1,'']]] +]; diff --git a/ktx/build/docs/html/search/pages_7.js b/ktx/build/docs/html/search/pages_7.js new file mode 100644 index 0000000..00aa693 --- /dev/null +++ b/ktx/build/docs/html/search/pages_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['on_20navigating_20the_20documentation_0',['Note on Navigating the Documentation',['../index.html#autotoc_md0',1,'']]] +]; diff --git a/ktx/build/docs/html/search/pages_8.js b/ktx/build/docs/html/search/pages_8.js new file mode 100644 index 0000000..e828a10 --- /dev/null +++ b/ktx/build/docs/html/search/pages_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['project_0',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/search/pages_9.js b/ktx/build/docs/html/search/pages_9.js new file mode 100644 index 0000000..69c5b5e --- /dev/null +++ b/ktx/build/docs/html/search/pages_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['software_0',['Khronos Texture Software',['../index.html',1,'']]], + ['software_20project_1',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]], + ['special_20cases_2',['Special Cases',['../license.html#autotoc_md3',1,'']]] +]; diff --git a/ktx/build/docs/html/search/pages_a.js b/ktx/build/docs/html/search/pages_a.js new file mode 100644 index 0000000..305e239 --- /dev/null +++ b/ktx/build/docs/html/search/pages_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['texture_20software_0',['Khronos Texture Software',['../index.html',1,'']]], + ['the_20documentation_1',['Note on Navigating the Documentation',['../index.html#autotoc_md0',1,'']]], + ['the_20khronosgroup_20ktx_20software_20project_2',['LICENSE file for the KhronosGroup/KTX-Software project',['../license.html',1,'']]] +]; diff --git a/ktx/build/docs/html/search/search.css b/ktx/build/docs/html/search/search.css new file mode 100644 index 0000000..043d32d --- /dev/null +++ b/ktx/build/docs/html/search/search.css @@ -0,0 +1,377 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
          • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 43px; + margin-right: 0; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + border: 1px solid var(--search-box-border-color); + z-index: 102; + margin-right: 4px; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.6em; +} + +#MSearchField { + display: inline-block; + vertical-align: top; + width: 7.5em; + height: 22px; + margin: 0 0 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.6em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + margin: 6px 0 0 4px; +} + +.close-icon { + width: 11px; + height: 11px; + background-color: var(--search-close-icon-bg-color); + border-radius: 50%; + position: relative; + display: flex; + justify-content: center; + align-items: center; + box-sizing: content-box; +} + +.close-icon:before, +.close-icon:after { + content: ''; + position: absolute; + width: 7px; + height: 1px; + background-color: var(--search-close-icon-fg-color); +} + +.close-icon:before { + transform: rotate(45deg); +} + +.close-icon:after { + transform: rotate(-45deg); +} + + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + +.search-icon { + width: 20px; + height: 20px; + display: inline-block; + position: relative; + margin-left: 3px; +} + +#MSearchSelectExt.search-icon { + width: 10px; +} + +#MSearchSelectExt + input { + margin-left: 5px; +} + +.search-icon::before, .search-icon::after { + content: ''; + position: absolute; + border: 1.5px solid var(--search-foreground-color); + box-sizing: content-box; +} + +.search-icon::before { + width: 6px; + height: 6px; + border-radius: 50%; + top: 7px; + left: 2px; + background: var(--search-background-color); +} + +.search-icon::after { + border: 1px solid var(--search-foreground-color); + width: 0px; + height: 3px; + border-radius: 2px; + top: 15px; + left: 8px; + transform: rotate(-45deg); + transform-origin: top left; +} + +.search-icon-dropdown { + content: ''; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 3px solid var(--search-foreground-color); + top: 8px; + left: 15px; + transform: translateX(-50%); + position: absolute; +} + + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + backdrop-filter: var(--search-filter-backdrop-filter); + -webkit-backdrop-filter: var(--search-filter-backdrop-filter); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + border-radius: 4px; +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: auto; + right: 4px; + top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + backdrop-filter: var(--search-results-backdrop-filter); + -webkit-backdrop-filter: var(--search-results-backdrop-filter); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; + border-radius: 8px; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResults; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); +} + + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 10pt; + padding: 2px 5px; +} + +div.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +#searchBoxPos1 dark-mode-toggle { + margin-top: 4px; +} + +/*---------------- External search page results */ + +.pages b { + color: var(--nav-foreground-color); + padding: 5px 5px 3px 5px; + background-color: var(--nav-menu-active-bg); + border-radius: 4px; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/ktx/build/docs/html/search/search.js b/ktx/build/docs/html/search/search.js new file mode 100644 index 0000000..dc14410 --- /dev/null +++ b/ktx/build/docs/html/search/search.js @@ -0,0 +1,708 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const decodeHtml = (html) => { + const txt = document.createElement("textarea"); + txt.innerHTML = html; + return txt.value; + }; + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = decodeHtml(elem[1][0]); + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + if (elem[1][1][0].startsWith('http://') || elem[1][1][0].startsWith('https://')) { // absolute path + srLink.setAttribute('href',elem[1][1][0]); + } else { // relative path + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + } + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = decodeHtml(elem[1][1][2]); + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; cli>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-color:var(--nav-menu-background-color)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;line-height:36px;text-decoration:none;color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-color:var(--nav-menu-background-color);line-height:36px}.sm-dox a span.sub-arrow{top:15px;right:10px;box-sizing:content-box;padding:0;margin:0;display:inline-block;width:5px;height:5px;background-color:var(--nav-menu-background-color);border-right:2px solid var(--nav-arrow-color);border-bottom:2px solid var(--nav-arrow-color);transform:rotate(45deg);-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 6px}.sm-dox a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px !important}.sm-dox a:hover span.sub-arrow{background-color:var(--nav-menu-active-bg);border-right:2px solid var(--nav-arrow-selected-color);border-bottom:2px solid var(--nav-arrow-selected-color)}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0;padding:3px}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{transform:rotate(-45deg)}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:6px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:6px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/ktx/build/docs/ktxpkg.tag b/ktx/build/docs/ktxpkg.tag new file mode 100644 index 0000000..d89743f --- /dev/null +++ b/ktx/build/docs/ktxpkg.tag @@ -0,0 +1,19 @@ + + + + authors + Authors + authors.html + + + license + LICENSE file for the KhronosGroup/KTX-Software project + license.html + md_LICENSE + + + index + Khronos Texture Software + index.html + + diff --git a/ktx/build/docs/man/man1/ktx.1 b/ktx/build/docs/man/man1/ktx.1 new file mode 100644 index 0000000..d004eb7 --- /dev/null +++ b/ktx/build/docs/man/man1/ktx.1 @@ -0,0 +1,113 @@ +.TH "ktx" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx \- Unified CLI frontend for the KTX-Software library\&. +.SH "SYNOPSIS" +.PP +ktx [command-option\&.\&.\&.] +.br + ktx [option\&.\&.\&.] +.SH "DESCRIPTION" +.PP +Unified CLI frontend for the KTX-Software library with sub-commands for specific operations for the KTX File Format Specification https://registry.khronos.org/KTX/specs/2.0/ktxspec.v2.html\&. + +.PP +The following commands are available: + +.PP +.IP "\fB\fBcreate\fP +.IP "" 1c +Create a KTX2 file from various input files\&. + +.PP +.IP "\fB\fBdeflate\fP +.IP "" 1c +Deflate (supercompress) a KTX2 file\&. + +.PP +.IP "\fB\fBextract\fP +.IP "" 1c +Extract selected images from a KTX2 file\&. + +.PP +.IP "\fB\fBencode\fP +.IP "" 1c +Encode a KTX2 file\&. + +.PP +.IP "\fB\fBtranscode\fP +.IP "" 1c +Transcode a KTX2 file\&. + +.PP +.IP "\fB\fBinfo\fP +.IP "" 1c +Print information about a KTX2 file\&. + +.PP +.IP "\fB\fBvalidate\fP +.IP "" 1c +Validate a KTX2 file\&. + +.PP +.IP "\fB\fBcompare\fP +.IP "" 1c +Compare two KTX2 files\&. + +.PP +.IP "\fB\fBhelp\fP +.IP "" 1c +Display help information about the ktx tool\&. + +.PP +.SH "OPTIONS" +.PP +The following options are also available without a command: + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP +.SH "EXIT STATUS" +.PP +.IP "\(bu" 2 +0 - Success +.IP "\(bu" 2 +1 - Command line error +.IP "\(bu" 2 +2 - IO failure +.IP "\(bu" 2 +3 - Invalid input file +.IP "\(bu" 2 +4 - Runtime or library error +.IP "\(bu" 2 +5 - Not supported state or operation +.IP "\(bu" 2 +6 - Requested feature is not yet implemented +.PP +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version +.PP +.RE +.PP +.SH "AUTHOR" +.PP +.IP "\(bu" 2 +Mátyás Császár [Vader], RasterGrid www\&.rastergrid\&.com +.IP "\(bu" 2 +Daniel Rákos, RasterGrid www\&.rastergrid\&.com +.PP + diff --git a/ktx/build/docs/man/man1/ktx2check.1 b/ktx/build/docs/man/man1/ktx2check.1 new file mode 100644 index 0000000..23082dd --- /dev/null +++ b/ktx/build/docs/man/man1/ktx2check.1 @@ -0,0 +1,59 @@ +.TH "ktx2check" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx2check \- Check the validity of a KTX 2 file\&. +.SH "SYNOPSIS" +.PP +ktx2check [options] [\fIinfile\fP \&.\&.\&.] +.SH "DESCRIPTION" +.PP +\fBktx2check\fP validates Khronos texture format version 2 files (KTX2)\&. It reads each named \fIinfile\fP and validates it writing to stdout messages about any issues found\&. When \fBinfile\fP is not specified, it validates a single file from stdin\&. + +.PP +The following options are available: + +.PP +.IP "\fB-q, --quiet +.IP "" 1c +Validate silently\&. Indicate valid or invalid via exit code\&. + +.PP +.IP "\fB-m , --max-issues +.IP "" 1c +Set the maximum number of issues to be reported per file provided -q is not set\&. + +.PP +.IP "\fB-w, --warn-as-error +.IP "" 1c +Treat warnings as errors\&. Changes exit code from success to error\&. + +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP +.SH "EXIT STATUS" +.PP +\fBktx2check\fP exits 0 on success, 1 on command line errors and 2 on validation errors\&. +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version\&. +.PP +.RE +.PP +.SH "AUTHOR" +.PP +Mark Callow, github\&.com/MarkCallow diff --git a/ktx/build/docs/man/man1/ktx2ktx2.1 b/ktx/build/docs/man/man1/ktx2ktx2.1 new file mode 100644 index 0000000..d3bd538 --- /dev/null +++ b/ktx/build/docs/man/man1/ktx2ktx2.1 @@ -0,0 +1,62 @@ +.TH "ktx2ktx2" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx2ktx2 \- Create a KTX 2 file from a KTX file\&. +.SH "SYNOPSIS" +.PP +ktx2ktx2 [options] [\fIinfile\fP \&.\&.\&.] +.SH "DESCRIPTION" +.PP +\fBktx2ktx2\fP creates Khronos texture format version 2 files (KTX2) from Khronos texture format version 1 files\&. \fBktx2ktx2\fP reads each named \fIinfile\fP\&. Output files have the same name as the input but with the extension changed to \fR\fP\&.ktx2\&. When \fBinfile\fP is not specified, a single file will be read from stdin and the output written to standard out\&. + +.PP +If unrecognized metadata with keys beginning "KTX" or "ktx" is found in the input file, it is dropped and a warning is written to standard error\&. + +.PP +The following options are available: + +.PP +.IP "\fB-b, --rewritebado +.IP "" 1c +Rewrite bad orientation metadata\&. Some in-the-wild KTX files have orientation metadata with the key "KTXOrientation" instead of KTXorientaion\&. This option will rewrite such bad metadata instead of dropping it\&. + +.PP +.IP "\fB-o outfile, --output=outfile +.IP "" 1c +Name the output file \fIoutfile\fP\&. If \fIoutfile\fP is 'stdout', output will be written to stdout\&. If there is more than 1 input file, the command prints its usage message and exits\&. + +.PP +.IP "\fB-f, --force +.IP "" 1c +If the destination file already exists, remove it and create a new file, without prompting for confirmation regardless of its permissions\&. + +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP +.SH "EXIT STATUS" +.PP +\fBktx2ktx2\fP exits 0 on success, 1 on command line errors and 2 on functional errors\&. +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version\&. +.PP +.RE +.PP +.SH "AUTHOR" +.PP +Mark Callow, github\&.com/MarkCallow diff --git a/ktx/build/docs/man/man1/ktx_compare.1 b/ktx/build/docs/man/man1/ktx_compare.1 new file mode 100644 index 0000000..814af10 --- /dev/null +++ b/ktx/build/docs/man/man1/ktx_compare.1 @@ -0,0 +1,249 @@ +.TH "ktx_compare" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx_compare \- ktx compare +.PP +Compare two KTX2 files\&. +.SH "SYNOPSIS" +.PP +ktx compare [option\&.\&.\&.] \fIinput-file1\fP \fIinput-file2\fP +.SH "DESCRIPTION" +.PP +\fBktx\fP \fBcompare\fP compares the two KTX2 files specified as the \fIinput-file1\fP and \fIinput-file2\fP arguments and outputs any mismatch in texture information and/or image data\&. The command implicitly calls \fBvalidate\fP and prints any found errors and warnings to stdout\&. If any of the specified input files are invalid then comparison is done based on best effort and may be incomplete\&. + +.PP +The JSON output formats conform to the https://schema.khronos.org/ktx/compare_v0.json schema even if the input file is invalid and certain information cannot be parsed or displayed\&. Additionally, for JSON outputs the KTX file identifier is printed using "\\u001A" instead of "\\x1A" as an unescaped "\\x1A" sequence inside a JSON string breaks nearly every JSON tool\&. Note that this does not change the value of the string only its representation\&. + +.PP +\fBNote\fP +.RS 4 +\fBktx\fP \fBcompare\fP prints using UTF-8 encoding\&. If your console is not set for UTF-8 you will see incorrect characters in output of the file identifier on each side of the "KTX nn"\&. +.RE +.PP +.SH "OPTIONS" +.PP +The following options are available: + +.PP +.IP "\fB--format text | json | mini-json +.IP "" 1c +Specifies the report output format\&. Possible options are: +.br + \fBtext\fP - Human readable text based format\&. +.br + \fBjson\fP - Formatted JSON\&. +.br + \fBmini-json\fP - Minified JSON\&. +.br + The default format is \fBtext\fP\&. + +.PP + +.PP + +.PP +.IP "\fB--content raw | image | ignore +.IP "" 1c +Controls how image content is compared\&. Possible options are: +.br + \fBraw\fP - Encoded image data is compared verbatim, as it appears in the file\&. +.br + \fBimage\fP - Effective image data is compared per texel block\&. +.br + \fBignore\fP - Ignore image contents\&. +.br + The default mode is \fBraw\fP, meaning that the encoded image data must match exactly\&. Note: When the mode is set to \fBimage\fP, the effective image data of individual mip levels, layers, and faces is compared texel block by texel block after applying one or more of the following transformations, if needed: +.br + - If the texture is supercompressed (e\&.g\&. using Zstandard or ZLIB), the images are deflated before comparison\&. +.br + - If the texture is encoded using BasisLZ, the images are transcoded to R8G8B8A_UNORM before comparison\&. +.br + For block compressed textures and textures encoded using UASTC the texel blocks are the individual compressed blocks, while for other formats the texel blocks are the individual pixels of the image\&. +.br + When comparing files that use different supercompression schemes, or otherwise different encoding, additional options may need to be used to avoid unexpected differences to be reported related to the meta information of the files\&. For example: +.br + - The supercompression scheme can be ignored with --ignore-supercomp\&. +.br + - Compressed byte length and other index section differences can be ignored with --ignore-index all or --ignore-index level\&. +.br + - DFD section differences can be ignored with --ignore-dfd all or --ignore-dfd all-except-color-space\&. +.br + - BDFD bytesPlane value differences can be ignored with --ignore-bdfd-bytesplane\&. +.br + - SGD section differences can be ignored with --ignore-sgd all or --ignore-sgd payload\&. +.br + + +.PP +.IP "\fB--per-pixel-output all | | none +.IP "" 1c +Controls whether per pixel / texel block difference output is generated when --content is set to \fBimage:\fP +.br + \fBall\fP - Every single difference is output (may result in a very large output)\&. +.br + \fB\fP - At most the specified number of differences are output\&. +.br + \fBnone\fP - No per pixel / texel block differences are output\&. +.br + The default mode is \fBnone\fP to limit the verbosity of the output\&. + +.PP +.IP "\fB--allow-invalid-input +.IP "" 1c +Perform best effort comparison even if any of the input files are invalid\&. + +.PP +.IP "\fB--ignore-format-header +.IP "" 1c + +.PP +.IP "\fB +.IP "" 1c +Ignore the vkFormat and typeSize fields in the file header\&. +.br + Note: useful when comparing textures with and without BasisLZ encoding, respectively\&. + +.PP +.IP "\fB--ignore-supercomp +.IP "" 1c +Ignore supercompression scheme in the file header\&. +.br + Note: use the --ignore-sgd option to also ignore the SGD section, if needed\&. + +.PP +.IP "\fB--ignore-index all | level | none +.IP "" 1c +Controls the comparison of index entries in the file headers\&. Possible options are: +.br + \fBall\fP - Ignore all index entries\&. +.br + \fBlevel\fP - Ignore level index entries only\&. +.br + \fBnone\fP - Do not ignore any index entries\&. +.br + The default mode is \fBnone\fP, meaning that all index entries will be compared\&. + +.PP +.IP "\fB--ignore-dfd all | all-except-color-space | unknown | extended | none +.IP "" 1c +Controls the comparison of DFD blocks\&. Possible options are: +.br + \fBall\fP - Ignore all DFD blocks\&. +.br + \fBall-except-color-space\fP: Ignore all DFD blocks except the color space information in the basic DFD block\&. +.br + \fBunknown\fP - Ignore any unrecognized DFD blocks\&. +.br + \fBextended\fP - Ignore all DFD blocks except the basic DFD block\&. +.br + \fBnone\fP - Do not ignore any DFD blocks\&. +.br + The default mode is \fBnone\fP, meaning that all DFD entries will be compared\&. + +.PP +.IP "\fB--ignore-bdfd-bytesplane +.IP "" 1c +Ignore BDFD bytesPlane values\&. Useful when comparing pre-spec-2\&.0\&.4 supercompressed files with 2\&.0\&.4+ supercompressed or non-supercompressed ones, as bytesPlane is set to zero in older supercompressed files\&. + +.PP +.IP "\fB--ignore-metadata all | [,\&.\&.\&.] | none +.IP "" 1c +Controls the comparison of metadata (KVD) entries\&. Possible options are: +.br + \fBall\fP - Ignore all metadata entries\&. +.br + \fB\fP[,\&.\&.\&.] - Ignore the specified comma separated list of metadata keys\&. +.br + \fBnone\fP - Do not ignore any metadata entries\&. +.br + The default mode is \fBnone\fP, meaning that all metadata entries will be compared\&. + +.PP +.IP "\fB--ignore-sgd all | unknown | payload | none +.IP "" 1c +Controls the comparison of the SGD section\&. Possible options are: +.br + \fBall\fP - Ignore the SGD section\&. +.br + \fBunknown\fP - Ignore any unrecognized SGD section\&. +.br + \fBpayload\fP - Ignore any unrecognized SGD section and the payload of any known SGD section\&. +.br + \fBnone\fP - Do not ignore the SGD section\&. +.br + The default mode is \fBnone\fP, meaning that SGD sections will be always compared\&. Note: --ignore-sgd payload can be used to compare BasisLZ SGD headers without expecting an exact match for the individual SGD payload sections\&. + +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP + +.PP +.PP +.nf +@note Reports about image content mismatches when --content is set to @b raw or @b image +include the following information:
            +- The level, layer, and face index of the image where the difference was found\&. + +@note Reports about individual texel block differences when --content is set to @b image +include the following additional information:
            +- The texel coordinates within the image where the difference was found\&. These + coordinates are the raw coordinates of the image and are not affected by metadata + such as @b KTXorientation\&. +- The packed elements of the texel block output as an array of hexadecimal values\&. + Each packed element has a byte size equal to the @b typeSize value of the image\&. +- The channel values of the texel block output as an array of integer (for integer + and normalized formats) or floating point (for floating point formats) values\&. + In case of floating point formats @b NaN, @b +inf, and @b -inf are used to indicate + values that are not a number or represent infinities, respectively\&. + The output order of the channels always follow the order they appear in the BDFD\&. +.fi +.PP +.SH "EXIT STATUS" +.PP +.IP "\(bu" 2 +0 - Success +.IP "\(bu" 2 +1 - Command line error +.IP "\(bu" 2 +2 - IO failure +.IP "\(bu" 2 +3 - Invalid input file +.IP "\(bu" 2 +4 - Runtime or library error +.IP "\(bu" 2 +5 - Not supported state or operation +.IP "\(bu" 2 +6 - Requested feature is not yet implemented +.PP + +.PP +.IP "\(bu" 2 +7 - Input files are different +.PP +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version +.PP +.RE +.PP +.SH "AUTHOR" +.PP +.IP "\(bu" 2 +Daniel Rákos, RasterGrid www\&.rastergrid\&.com +.PP + diff --git a/ktx/build/docs/man/man1/ktx_create.1 b/ktx/build/docs/man/man1/ktx_create.1 new file mode 100644 index 0000000..4fb76c0 --- /dev/null +++ b/ktx/build/docs/man/man1/ktx_create.1 @@ -0,0 +1,614 @@ +.TH "ktx_create" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx_create \- ktx create +.PP +Create a KTX2 file from various input files\&. +.SH "SYNOPSIS" +.PP +ktx create [option\&.\&.\&.] \fIinput-file\fP\&.\&.\&. \fIoutput-file\fP +.SH "DESCRIPTION" +.PP +\fBktx\fP \fBcreate\fP can create, encode and supercompress a KTX2 file from the input images specified as the \fIinput-file\fP\&.\&.\&. arguments and save it as the \fIoutput-file\fP\&. The last positional argument is treated as the \fIoutput-file\fP\&. If the \fIinput-file\fP is '-' the file will be read from the stdin\&. If the \fIoutput-path\fP is '-' the output file will be written to the stdout\&. + +.PP +Each \fIinput-file\fP must be a valid EXR (\&.exr), PNG (\&.png) or Raw (\&.raw) file\&. PNG files with luminance (L) or luminance + alpha (LA) data will be converted to RGB as LLL and RGBA as LLLA before processing further\&. The input file formats must be compatible with the requested KTX format enum and must have at least the same level of precision and number of channels\&. Any unused channel will be discarded silently\&. + +.PP +The number of input-files specified must match the expected number of input images based on the used options\&. +.SH "OPTIONS" +.PP +.SS "General Options" +The following are available: + +.PP +.IP "\fB--format +.IP "" 1c +KTX format enum that specifies the data format for the images in the created texture\&. The enum names match the VkFormat names without the VK_FORMAT_ prefix\&. The VK_FORMAT_ prefix is ignored if present\&. Case insensitive\&. Required\&. +.br + +.br + If the format is an ASTC format a texture object with the target format \fRR8G8B8_{SRGB\fP,UNORM} or \fRR8G8B8A8_{SRGB\fP,UNORM} is created then encoded to the specified ASTC format\&. The latter format is chosen if alpha is present in the input\&. \fRSRGB\fP or \fRUNORM\fP is chosen depending on the specified ASTC format\&. The ASTC-specific and common encoder options listed \fBbelow\fP become valid, otherwise they are ignored\&. This matches the functionality of the \fBktx encode\fP command when an ASTC format is specified\&. +.br + +.br + When used with \fB--encode\fP it specifies the target format before the encoding step\&. In this case it must be one of: +.PD 0 +.IP " \(bu" 6 +R8_UNORM +.IP " \(bu" 6 +R8_SRGB +.IP " \(bu" 6 +R8G8_UNORM +.IP " \(bu" 6 +R8G8_SRGB +.IP " \(bu" 6 +R8G8B8_UNORM +.IP " \(bu" 6 +R8G8B8_SRGB +.IP " \(bu" 6 +R8G8B8A8_UNORM +.IP " \(bu" 6 +R8G8B8A8_SRGB +.PP +The format will be used to verify and load all input files into a texture before performing any specified encoding\&. +.br + + +.PP +.IP "\fB--encode basis-lz | uastc +.IP "" 1c +Encode the texture with the specified codec before saving it\&. This option matches the functionality of the \fBktx encode\fP command\&. With each choice, the specific and common encoder options listed \fBbelow\fP become valid, otherwise they are ignored\&. Case-insensitive\&. + +.PP + +.PP +.IP "\fBbasis-lz: +.IP "" 1c +Supercompress the image data with transcodable ETC1S / BasisLZ\&. RED images will become RGB with RED in each component (RRR)\&. RG images will have R in the RGB part and G in the alpha part of the compressed texture (RRRG)\&. When set, the \fIbasis-lz\fP options become valid\&. + +.PP +.IP "\fBuastc: +.IP "" 1c +Create a texture in high-quality transcodable UASTC format\&. When set the \fIuastc\fP options become valid\&. + +.PP + +.PP + +.PP +.IP "\fB--1d +.IP "" 1c +Create a 1D texture\&. If not set the texture will be a 2D or 3D texture\&. + +.PP +.IP "\fB--cubemap +.IP "" 1c +Create a cubemap texture\&. If not set the texture will be a 2D or 3D texture\&. + +.PP +.IP "\fB--raw +.IP "" 1c +Create from raw image data\&. + +.PP +.IP "\fB--width +.IP "" 1c +Base level width in pixels\&. Required with \fB--raw\fP\&. For non-raw, if not set, the image width is used otherwise the image is resampled to this width and any provided mip levels are resampled proportionately\&. For non-raw it enables use of the 'Generate Mipmap' options listed under \fB--generate-mipmap\fP to tune the resampler\&. + +.PP +.IP "\fB--height +.IP "" 1c +Base level height in pixels\&. Required with \fB--raw\fP\&. For non-raw, if not set, the image height is used otherwise the image is resampled to this height and any provided mip levels are resampled proportionately\&. For non-raw it enables use of the 'Generate Mipmap' options listed under \fB--generate-mipmap\fP to tune the resampler\&. + +.PP +.IP "\fB--depth +.IP "" 1c +Base level depth in pixels\&. If set the texture will be a 3D texture\&. + +.PP +.IP "\fB--layers +.IP "" 1c +Number of layers\&. If set the texture will be an array texture\&. + +.PP +.IP "\fB--levels +.IP "" 1c +Number of mip levels\&. This is the number of level images to include in the texture being created\&. If \fB--generate-mipmap\fP is specified this number of level images will be generated otherwise this number of input images must be provided\&. Generates an error if the value is greater than the maximum possible for the specified dimensions of the texture or, for non-raw, the dimensions of the base level image as possibly modified by \fB--scale\fP\&. + +.PP +.IP "\fB--runtime-mipmap +.IP "" 1c +Runtime mipmap generation mode\&. Sets up the texture to request the mipmaps to be generated by the client application at runtime\&. + +.PP +.IP "\fB--generate-mipmap +.IP "" 1c +Causes mipmaps to be generated during texture creation\&. If \fB--levels\fP is not specified the maximum possible mip level will be generated\&. This option is mutually exclusive with --runtime-mipmap and cannot be used with SINT, UINT or 3D textures or \fB--raw\fP\&. When set it enables the use of the following 'Generate Mipmap' options\&. + +.PP +.IP "\fB--mipmap-filter +.IP "" 1c +Specifies the filter to use when generating the mipmaps\&. Case insensitive\&. Ignored unless \fB--generate-mipmap\fP, \fB--scale\fP, \fB--width\fP or \fB--height\fP are specified for non-raw input\&. +.br + Possible options are: box | tent | bell | b-spline | mitchell | blackman | lanczos3 | lanczos4 | lanczos6 | lanczos12 | kaiser | gaussian | catmullrom | quadratic_interp | quadratic_approx | quadratic_mix\&. Defaults to lanczos4\&. + +.PP +.IP "\fB--mipmap-filter-scale +.IP "" 1c +The filter scale to use\&. Defaults to 1\&.0\&. Ignored unless \fB--generate-mipmap\fP, \fB--scale\fP, \fB--width\fP or \fB--height\fP are specified for non-raw input\&. + +.PP +.IP "\fB--mipmap-wrap +.IP "" 1c +Specify how to sample pixels near the image boundaries\&. Case insensitive\&. Ignored unless \fB--generate-mipmap\fP, \fB--scale\fP, \fB--width\fP or \fB--height\fP are specified for non-raw input\&. +.br + Possible options are: wrap | reflect | clamp\&. Defaults to clamp\&. + +.PP +Avoid mipmap generation if the Output TF (see \fBTRANSFER FUNCTION HANDLING\fP below) is non-linear and is not sRGB\&. + +.PP +.IP "\fB--scale +.IP "" 1c +Scale images as they are loaded\&. Cannot be used with --raw\&. It enables use of the 'Generate Mipmap' options listed under --generate-mipmap to tune the resampler\&. + +.PP +.IP "\fB--normalize +.IP "" 1c +Normalize input normals to have a unit length\&. Only valid for linear normal textures with 2 or more components\&. For 2-component inputs 2D unit normals are calculated\&. Do not use these 2D unit normals to generate X+Y normals with \fB--normal-mode\fP\&. For 4-component inputs a 3D unit normal is calculated\&. 1\&.0 is used for the value of the 4th component\&. Cannot be used with \fB--raw\fP\&. + +.PP +.IP "\fB--swizzle [rgba01]{4} +.IP "" 1c +KTX swizzle metadata\&. + +.PP +.IP "\fB--input-swizzle [rgba01]{4} +.IP "" 1c +Pre-swizzle input channels\&. + +.PP +.IP "\fB--assign-tf +.IP "" 1c +Force the created texture to have the specified transfer function, ignoring the transfer function of the input file(s)\&. Possible options match the khr_df_transfer_e enumerators without the KHR_DF_TRANSFER_ prefix\&. The KHR_DF_TRANSFER_ prefix is ignored if present\&. Case nsensitive\&. The options are: linear | srgb | srgb_eotf | scrgb | scrgb_eotf | itu | itu_oetf | bt601 | bt601_oetf | bt709 | bt709_oetf | bt2020 | bt2020_oetf | smpte170m | smpte170m_oetf | smpte170m_eotf | ntsc | ntsc_eotf | slog | slog_oetf | slog2 | slog2_oetf | bt1886 | bt1886_eotf | hlg_oetf | hlg_eotf | pq_oetf | pg_eotf | dcip3 | dcip3_eotf | pal_oetf | pal625_eotf | st240 | st240_oetf | st240_eotf | acescc | acescc_oetf | acescct | acescct_oetf | abobergb | adobergb_eotf See \fBTRANSFER FUNCTION HANDLING\fP below for important information\&. + +.PP +.IP "\fB--assign-oetf +.IP "" 1c +Deprecated and will be removed\&. Use \fB--assign-tf\fP instead\&. + +.PP +.IP "\fB--assign-primaries +.IP "" 1c +Force the created texture to have the specified color primaries, ignoring the color primaries of the input file(s)\&. Possible options match the khr_df_primaries_e enumerators without the KHR_DF_PRIMARIES_ prefix\&. The KHR_DF_PRIMARIES_ prefix is ignored if present\&. Case insensitive\&. The options are: none | bt709 | srgb | bt601_ebu | bt601_smpte | bt2020 | ciexyz | aces | acescc | ntsc1953 | pal525 | displayp3 | adobergb\&. +.PP +\fBNote\fP +.RS 4 +\fRbt601-ebu\fP and \fRbt601-smpte\fP, supported in previous releases, have been replaced with names consistent with khr_df_primaries_e\&. +.RE +.PP + +.PP +.IP "\fB--assign-texcoord-origin +.IP "" 1c +Force the created texture to indicate that the texture coordinate origin s=0, t=0 is at the specified \fIcorner\fP of the logical image\&. Case insensitive\&. Possible options are top-left | bottom-left\&. -front | -back can be appended and one of these is required when \fB--depth\fP is specified\&. Must be top-left if \fB--cubemap\fP is specified\&. Absent \fB—convert-texcoord-origin\fP, the effect of this option is to cause \fIKTXorientation\fP metadata indicating the specified origin to be written to the output file\&. Example values are "rd" (top-left) and "ru" (bottom-left) or, when \fB--depth\fP is specified, "rdi" (top-left-front) and "rui" (bottom-left-front)\&. + +.PP +.IP "\fB--convert-tf +.IP "" 1c +Convert the input image(s) to the specified transfer function, if different from the transfer function of the input file(s)\&. If both this and \fB--assign-tf\fP are specified, conversion will be performed from the assigned transfer function to the transfer function specified by this option, if different\&. Cannot be used with \fB--raw\fP\&. Case insensitive\&. The options are: linear | srgb\&. The following srgb aliases are also supported: srgb_eotf | scrgb | scrgb_eotf\&. See \fBTRANSFER FUNCTION HANDLING\fP below for more information\&. + +.PP +.IP "\fB--convert-oetf +.IP "" 1c +Deprecated and will be removed\&. Use \fB--convert-tf\fP instead\&. + +.PP +.IP "\fB--convert-primaries +.IP "" 1c +Convert the input image(s) to the specified color primaries, if different from the color primaries of the input file(s) or the one specified by \fB--assign-primaries\fP\&. If both this and \fB--assign-primaries\fP are specified, conversion will be performed from the assigned primaries to the primaries specified by this option, if different\&. This option is not allowed to be specified when \fB--assign-primaries\fP is set to 'none'\&. Cannot be used with \fB--raw\fP\&. Possible options match the khr_df_primaries_e enumerators without the KHR_DF_PRIMARIES_ prefix\&. The KHR_DF_PRIMARIES_ prefix is ignored if present\&. Case insensitive\&. The options are: bt709 | srgb | bt601_ebu | bt601_smpte | bt2020 | ciexyz | aces | acescc | ntsc1953 | pal525 | displayp3 | adobergb +.PP +\fBNote\fP +.RS 4 +\fRbt601-ebu\fP and \fRbt601-smpte\fP, supported in previous releases, have been replaced with names consistent with khr_df_primaries_e\&. +.RE +.PP + +.PP +.IP "\fB--convert-texcoord-origin +.IP "" 1c +Convert the input image(s) so the texture coordinate origin s=0, t=0, is at the specified \fIcorner\fP of the logical image\&. If both this and \fB--assign-texcoord-origin\fP are specified, conversion will be performed from the assigned origin to the origin specified by this option, if different\&. The default for images in KTX files is top-left which corresponds to the origin in most image file formats\&. Cannot be used with \fB--raw\fP\&. Case insensitive\&. Possible options are: top-left | bottom-left\&. -front | -back can be appended and one of these is required when \fB--depth\fP is specified\&. Must be top-left if \fB--cubemap\fP is specified\&. +.br + +.br + Input images whose origin does not match \fIcorner\fP will be flipped vertically\&. \fIKTXorientation\fP metadata indicating the the specified origin is written to the output file\&. Example values are "rd" (top-left) and "ru" (bottom-left) or, when \fB--depth\fP is specified, "rdi" (top-left-front) and "rui" (bottom-left-back)\&. Generates an error if the input image origin is unknown as is the case with raw image data\&. Use \fB--assign-texcoord-origin\fP to specify the orientation\&. +.PP +\fBNote\fP +.RS 4 +ktx create cannot rotate or flip incoming images, except for a y-flip, so use an an image processing tool to reorient images whose first data stream pixel is not at the logical top-left or bottom-left of the image before using as input here\&. Such images may be indicated by Exif-style orientation metadata in the file\&. +.RE +.PP + +.PP +.IP "\fB--fail-on-color-conversions +.IP "" 1c +Generates an error if any input images would need to be color converted\&. + +.PP +.IP "\fB--warn-on-color-conversions +.IP "" 1c +Generates a warning if any input images are color converted\&. Adds warnings for explicitly requested and visually lossless implicit conversions to that generated for visually lossy conversions\&. + +.PP +.IP "\fB--no-warn-on-color-conversions +.IP "" 1c +Disable all warnings about color conversions including that for visually lossy conversions\&. Overrides \fB--warn-on-color-conversions\fP should both be specified\&. + +.PP +.IP "\fB--fail-on-origin-changes +.IP "" 1c +Generates an error if any of the input images would need to have their origin changed\&. + +.PP +.IP "\fB--warn-on-origin-changes +.IP "" 1c +Generates a warning if any of the input images have their origin changed\&.\&. + +.PP + +.PP +.IP "\fB--zstd +.IP "" 1c +Supercompress the data with Zstandard\&. Cannot be used with ETC1S / BasisLZ format\&. Level range is [1,22]\&. Lower levels give faster but worse compression\&. Values above 20 should be used with caution as they require more memory\&. + +.PP +.IP "\fB--zlib +.IP "" 1c +Supercompress the data with ZLIB\&. Cannot be used with ETC1S / BasisLZ format\&. Level range is [1,9]\&. Lower levels give faster but worse compression\&. + +.PP + +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP +.SS "Specific and Common Encoding Options" +The following are available\&. Specific options become valid only if their encoder has been selected\&. Common encoder options become valid when an encoder they apply to has been selected\&. Otherwise they are ignored\&. + +.PP +.IP "\fBASTC: +.IP "" 1c + +.PP + +.PP +.IP "\fB--astc-quality +.IP "" 1c +The quality level configures the quality-performance tradeoff for the compressor; more complete searches of the search space improve image quality at the expense of compression time\&. Default is 'medium'\&. The quality level can be set between fastest (0) and exhaustive (100) via the following fixed quality presets: Level Quality fastest (equivalent to quality = 0) fast (equivalent to quality = 10) medium (equivalent to quality = 60) thorough (equivalent to quality = 98) exhaustive (equivalent to quality = 100) + +.PP +.IP "\fB--astc-perceptual +.IP "" 1c +The codec should optimize for perceptual error, instead of direct RMS error\&. This aims to improve perceived image quality, but typically lowers the measured PSNR score\&. Perceptual methods are currently only available for normal maps and RGB color data\&. + +.PP + +.PP + +.PP + +.PP +.IP "\fBbasis-lz: +.IP "" 1c + +.PP +.IP "\fB--clevel +.IP "" 1c +ETC1S / BasisLZ compression level, an encoding speed vs\&. quality tradeoff\&. Range is [0,6], default is 1\&. Higher values are slower but give higher quality\&. Use \fB--qlevel\fP first\&. + +.PP +.IP "\fB--qlevel +.IP "" 1c +ETC1S / BasisLZ quality level\&. Range is [1,255]\&. Lower gives better compression/lower quality/faster\&. Higher gives less compression/higher quality/slower\&. \fB--qlevel\fP automatically determines values for \fB--max-endpoints\fP, \fB--max-selectors\fP, \fB--endpoint-rdo-threshold\fP and \fB--selector-rdo-threshold\fP for the target quality level\&. Setting these options overrides the values determined by -qlevel which defaults to 128 if neither it nor \fB--max-endpoints\fP and \fB--max-selectors\fP have been set\&. + +.PP +Note that both of \fB--max-endpoints\fP and \fB--max-selectors\fP must be set for them to have any effect\&. If all three options are set, a warning will be issued that \fB--qlevel\fP will be ignored\&. + +.PP +Note also that \fB--qlevel\fP will only determine values for \fB--endpoint-rdo-threshold\fP and \fB--selector-rdo-threshold\fP when its value exceeds 128, otherwise their defaults will be used\&. + +.PP +.IP "\fB--max-endpoints +.IP "" 1c +Manually set the maximum number of color endpoint clusters\&. Range is [1,16128]\&. Default is 0, unset\&. + +.PP +.IP "\fB--endpoint-rdo-threshold +.IP "" 1c +Set endpoint RDO quality threshold\&. The default is 1\&.25\&. Lower is higher quality but less quality per output bit (try [1\&.0,3\&.0])\&. This will override the value chosen by \fB--qlevel\fP\&. + +.PP +.IP "\fB--max-selectors +.IP "" 1c +Manually set the maximum number of color selector clusters from [1,16128]\&. Default is 0, unset\&. + +.PP +.IP "\fB--selector-rdo-threshold +.IP "" 1c +Set selector RDO quality threshold\&. The default is 1\&.25\&. Lower is higher quality but less quality per output bit (try [1\&.0,3\&.0])\&. This will override the value chosen by \fB--qlevel\fP\&. + +.PP +.IP "\fB--no-endpoint-rdo +.IP "" 1c +Disable endpoint rate distortion optimizations\&. Slightly faster, less noisy output, but lower quality per output bit\&. Default is to do endpoint RDO\&. + +.PP +.IP "\fB--no-selector-rdo +.IP "" 1c +Disable selector rate distortion optimizations\&. Slightly faster, less noisy output, but lower quality per output bit\&. Default is to do selector RDO\&. + +.PP + +.PP + +.PP +.IP "\fBuastc: +.IP "" 1c + +.PP + +.PP +.IP "\fB--uastc-quality +.IP "" 1c +This optional parameter selects a speed vs quality tradeoff as shown in the following table: + +.PP +LevelSpeedQuality0 Fastest 43\&.45dB1 Faster 46\&.49dB2 Default 47\&.47dB3 Slower 48\&.01dB4 Very slow 48\&.24dB + +.PP +You are strongly encouraged to also specify \fB--zstd\fP to losslessly compress the UASTC data\&. This and any LZ-style compression can be made more effective by conditioning the UASTC texture data using the Rate Distortion Optimization (RDO) post-process stage\&. When uastc encoding is set the following options become available for controlling RDO: + +.PP +.IP "\fB--uastc-rdo +.IP "" 1c +Enable UASTC RDO post-processing\&. + +.PP +.IP "\fB--uastc-rdo-l +.IP "" 1c +Set UASTC RDO quality scalar (lambda) to \fIlambda\fP\&. Lower values yield higher quality/larger LZ compressed files, higher values yield lower quality/smaller LZ compressed files\&. A good range to try is [\&.25,10]\&. For normal maps a good range is [\&.25,\&.75]\&. The full range is [\&.001,10\&.0]\&. Default is 1\&.0\&. + +.PP +Note that previous versions used the \fB--uastc-rdo-q\fP option which was removed because the RDO algorithm changed\&. + +.PP +.IP "\fB--uastc-rdo-d +.IP "" 1c +Set UASTC RDO dictionary size in bytes\&. Default is 4096\&. Lower values=faster, but give less compression\&. Range is [64,65536]\&. + +.PP +.IP "\fB--uastc-rdo-b +.IP "" 1c +Set UASTC RDO max smooth block error scale\&. Range is [1\&.0,300\&.0]\&. Default is 10\&.0, 1\&.0 is disabled\&. Larger values suppress more artifacts (and allocate more bits) on smooth blocks\&. + +.PP +.IP "\fB--uastc-rdo-s +.IP "" 1c +Set UASTC RDO max smooth block standard deviation\&. Range is [\&.01,65536\&.0]\&. Default is 18\&.0\&. Larger values expand the range of blocks considered smooth\&. + +.PP +.IP "\fB--uastc-rdo-f +.IP "" 1c +Do not favor simpler UASTC modes in RDO mode\&. + +.PP +.IP "\fB--uastc-rdo-m +.IP "" 1c +Disable RDO multithreading (slightly higher compression, deterministic)\&. + +.PP + +.PP + +.PP + +.PP +.IP "\fBcommon: +.IP "" 1c + +.PP +.IP "\fB--normal-mode +.IP "" 1c +Only valid for linear textures with two or more components\&. If the input texture has three or four linear components it is assumed to be a three component linear normal map storing unit length normals as (R=X, G=Y, B=Z)\&. A fourth component will be ignored\&. The map will be converted to a two component X+Y normal map stored as (RGB=X, A=Y) prior to encoding\&. If unsure that your normals are unit length, use \fB--normalize\fP\&. If the input has 2 linear components it is assumed to be an X+Y map of unit normals\&. + +.PP +The Z component can be recovered programmatically in shader code by using the equations: +.PP +.nf + + nml\&.xy = texture(\&.\&.\&.)\&.ga; // Load in [0,1] + nml\&.xy = nml\&.xy * 2\&.0 - 1\&.0; // Unpack to [-1,1] + nml\&.z = sqrt(1 - dot(nml\&.xy, nml\&.xy)); // Compute Z + +.fi +.PP + For ETC1S / BasisLZ encoding, \fB'--encode\fP basis-lz', RDO is disabled (no selector RDO, no endpoint RDO) to provide better quality\&. + +.PP +.IP "\fB--threads +.IP "" 1c +Explicitly set the number of threads to use during compression\&. By default, ETC1S / BasisLZ will use the number of threads reported by \fRthread::hardware_concurrency\fP or 1 if value returned is 0\&. + +.PP +.IP "\fB--no-sse +.IP "" 1c +Forbid use of the SSE instruction set\&. Ignored if CPU does not support SSE\&. SSE can only be disabled for the basis-lz and uastc encoders\&. Ignored for other encoders\&.\&. + +.PP + +.PP + +.PP + +.PP +.IP "\fB +.IP "" 1c + +.PP +.IP "\fB--compare-ssim +.IP "" 1c +Calculate encoding structural similarity index measure (SSIM) and print it to stdout\&. Requires Basis-LZ, UASTC or ASTC encoding\&. + +.PP +.IP "\fB--compare-psnr +.IP "" 1c +Calculate encoding peak signal-to-noise ratio (PSNR) and print it to stdout\&. Requires Basis-LZ, UASTC or ASTC encoding\&. + +.PP + +.PP +.SH "TRANSFER FUNCTION HANDLING" +.PP +The diagram below shows all assignments and conversions that can take place\&. + +.PP +.PP +.nf +┌──────────┐ ┌─────────┐ +│ ├──────────────────1─────────────────►│ │ +│ │ ┌───────────┐ │ │ +│ Input │ │ │ │ │ +│ Transfer │ │ --assign- ├──────────2──────────►│Output │ +│ function │ │ tf │ ┌────────────┐ │Transfer │ +│ from │ │ ├─3─►│ │ │Function │ +│ file │ │ │ │ --convert- │ │ │ +│ metadata │ └───────────┘ │ tf ├3,4►│ │ +│ │ │ │ │ │ +│ ├────────4─────────►│ │ │ │ +└──────────┘ └────────────┘ └─────────┘ +.fi +.PP + +.PP +.SS "Processing Paths" + +.PP +.PD 0 +.IP "1." 4 +Pass through\&. No options specified\&. +.IP "2." 4 +\fB--assign-tf\fP specified\&. +.IP "3." 4 +\fB--assign-tf\fP and \fB--convert-tf\fP specified\&. +.IP "4." 4 +\fB--convert-tf\fP specified\&. +.PP +.SS "Details" +Transfer function handling proceeds as follows: +.PD 0 +.IP "\(bu" 2 +If \fB--format\fP specifies one of the \fR*_SRGB{\fP,_*} formats and Output Transfer Function is not sRGB (a\&.k\&.a scRGB) an error is generated\&. +.IP "\(bu" 2 +If \fB--format\fP does not specify one of the \fR*_SRGB{\fP,_*} formats, an sRGB variant exists and Output Transfer Function is sRGB (a\&.k\&.a scRGB), an error is generated\&. +.IP "\(bu" 2 +Otherwise, the transfer function of the output KTX file is set to Output Transfer Function\&. +.IP "\(bu" 2 +If neither \fB--assign-tf\fP nor \fB--convert-tf\fP is specified: +.PD 0 +.IP " \(bu" 4 +If the Input Transfer Function is not sRGB (a\&.k\&.a scRGB) for \fR*_SRGB{\fP,_*} formats an implicit conversion to sRGB is done, equivalent to \fB--convert-tf\fP srgb\&. +.IP " \(bu" 4 +If the Input Transfer Function is not linear for formats that are not one of the \fR*_SRGB{\fP,_*} formats, an implicit conversion to linear is done equivalent to \fB--convert-tf\fP linear\&. +.PP + +.IP "\(bu" 2 +Supported inputs for implicit or explicit conversion are linear, sRGB, ITU (a\&.k\&.a BT601, BT\&.709, BT\&.2020 and SMPTE170M) and PQ EOTF\&. An error is generated if an unsupported conversion is required\&. +.IP "\(bu" 2 +Supported outputs for implicit or explicit conversion are linear and sRGB, An error is generated if an unsupported conversion is required\&. +.IP "\(bu" 2 +Output Transfer Function for a format that is not one of the \fR*_SRGB{\fP,_*} formats can be set to a non-linear transfer function via \fB--assign-tf\fP\&. +.IP "\(bu" 2 +A warning is generated if a visually lossy color-conversion is performed\&. sRGB to linear is considered visually lossy because there is a high chance it will introduce artifacts visible to the human eye such as banding\&. The warning can be suppressed with \fB--no-warn-on-color-conversions\fP\&. A warning or an error on any color conversion can be requested with \fB--warn-on-color-conversions\fP or \fB--fail-on-color-conversions\fP \&. +.PP +\fBNote\fP +.RS 4 +When \fB--format\fP does not specify one of the \fI\fISRGB{,\fP\fP} formats and Output Transfer Function is not linear: +.PD 0 +.IP "\(bu" 1 +the KTX file may be much less portable due to limited hardware support of such inputs\&. +.IP "\(bu" 1 +avoid using \fB--generate-mipmap\fP as the filters can only decode sRGB\&. +.IP "\(bu" 1 +avoid encoding to ASTC, BasisLz/ETC1S or UASTC\&. The encoders' quality metrics are designed for linear and sRGB\&. +.PP +.RE +.PP +.SS "Changes since last Release" +.PD 0 +.IP "1." 4 +\fB--assign-oetf\fP and \fB--convert-oetf\fP are deprecated and will be removed\&. Use \fB--assign-tf\fP and \fB--convert-tf\fP instead\&. +.IP "2." 4 +The parameter value for \fB--assign-tf\fP can now be any of the transfer functions known to the Khronos Data Format Specification\&. +.IP "3." 4 +A warning is now generated if a visually lossy color conversion will be performed\&. The warning can be suppressed with \fB--no-warn-on-color-conversions\fP\&. +.PP +.SH "EXIT STATUS" +.PP +.IP "\(bu" 2 +0 - Success +.IP "\(bu" 2 +1 - Command line error +.IP "\(bu" 2 +2 - IO failure +.IP "\(bu" 2 +3 - Invalid input file +.IP "\(bu" 2 +4 - Runtime or library error +.IP "\(bu" 2 +5 - Not supported state or operation +.IP "\(bu" 2 +6 - Requested feature is not yet implemented +.PP +.SH "HISTORY" +.PP +\fBVersion 4\&.3\fP +.RS 4 + +.IP "\(bu" 2 +Initial version +.PP +.RE +.PP +\fBVersion 4\&.4\fP +.RS 4 + +.IP "\(bu" 2 +Reorganize encoding options\&. +.IP "\(bu" 2 +Improve explanation of use of \fB--format\fP with \fB--encode\fP\&. +.IP "\(bu" 2 +Improve explanation of ASTC encoding\&. +.PP +.RE +.PP +.SH "AUTHOR" +.PP +.IP "\(bu" 2 +Mátyás Császár [Vader], RasterGrid www\&.rastergrid\&.com +.IP "\(bu" 2 +Daniel Rákos, RasterGrid www\&.rastergrid\&.com +.IP "\(bu" 2 +Mark Callow +.PP + diff --git a/ktx/build/docs/man/man1/ktx_deflate.1 b/ktx/build/docs/man/man1/ktx_deflate.1 new file mode 100644 index 0000000..479ddfa --- /dev/null +++ b/ktx/build/docs/man/man1/ktx_deflate.1 @@ -0,0 +1,90 @@ +.TH "ktx_deflate" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx_deflate \- ktx deflate +.PP +Deflate (supercompress) a KTX2 file\&. +.SH "SYNOPSIS" +.PP +ktx deflate [option\&.\&.\&.] \fIinput-file\fP \fIoutput-file\fP +.SH "DESCRIPTION" +.PP +\fBktx\fP \fBdeflate\fP deflates (supercompresses) the KTX file specified as the \fIinput-file\fP and saves it as the \fIoutput-file\fP\&. If the \fIinput-file\fP is '-' the file will be read from the stdin\&. If the \fIoutput-path\fP is '-' the output file will be written to the stdout\&. If the input file is already supercompressed it will be inflated then supercompressed again using the options specified here and a warning will be issued\&. If the input file is invalid the first encountered validation error is displayed to the stderr and the command exits with the relevant non-zero status code\&. + +.PP +\fBktx\fP \fBdeflate\fP cannot be applied to KTX files that have been supercompressed with BasisLZ\&. +.SH "OPTIONS" +.PP +The following options are available: + +.PP +.IP "\fB--zstd +.IP "" 1c +Supercompress the data with Zstandard\&. Cannot be used with ETC1S / BasisLZ format\&. Level range is [1,22]\&. Lower levels give faster but worse compression\&. Values above 20 should be used with caution as they require more memory\&. + +.PP +.IP "\fB--zlib +.IP "" 1c +Supercompress the data with ZLIB\&. Cannot be used with ETC1S / BasisLZ format\&. Level range is [1,9]\&. Lower levels give faster but worse compression\&. + +.PP + +.PP + +.PP +.IP "\fB-q, --quiet +.IP "" 1c +Silence warning about already supercompressed input fiile\&. + +.PP +.IP "\fB-e, --warnings-as-errors +.IP "" 1c +Treat warnings as errors\&. + +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP +.SH "EXIT STATUS" +.PP +.IP "\(bu" 2 +0 - Success +.IP "\(bu" 2 +1 - Command line error +.IP "\(bu" 2 +2 - IO failure +.IP "\(bu" 2 +3 - Invalid input file +.IP "\(bu" 2 +4 - Runtime or library error +.IP "\(bu" 2 +5 - Not supported state or operation +.IP "\(bu" 2 +6 - Requested feature is not yet implemented +.PP +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version +.PP +.RE +.PP +.SH "AUTHOR" +.PP +.IP "\(bu" 2 +Mark Callow [@MarkCallow] +.PP + diff --git a/ktx/build/docs/man/man1/ktx_encode.1 b/ktx/build/docs/man/man1/ktx_encode.1 new file mode 100644 index 0000000..24bcd27 --- /dev/null +++ b/ktx/build/docs/man/man1/ktx_encode.1 @@ -0,0 +1,315 @@ +.TH "ktx_encode" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx_encode \- ktx encode +.PP +Encode a KTX2 file\&. +.SH "SYNOPSIS" +.PP +ktx encode [option\&.\&.\&.] \fIinput-file\fP \fIoutput-file\fP +.SH "DESCRIPTION" +.PP +\fBktx\fP \fBencode\fP can encode the KTX file specified as the \fIinput-file\fP argument to a universal format or one of the ASTC formats, optionally supercompress the result, and save it as the \fIoutput-file\fP\&. If the \fIinput-file\fP is '-' the file will be read from the stdin\&. If the \fIoutput-path\fP is '-' the output file will be written to the stdout\&. + +.PP +For universal and ASTC LDR formats, the input file must be R8, R8G8, R8G8B8 or R8G8B8A8 (or their sRGB variants)\&. + +.PP +If the input file is invalid the first encountered validation error is displayed to the stderr and the command exits with the relevant non-zero status code\&. +.SH "OPTIONS" +.PP +.SS "General Options" +The following options are available: + +.PP +.IP "\fB--codec basis-lz | uastc +.IP "" 1c +Target codec followed by the codec specific options\&. With each choice the specific and common encoder options listed \fBbelow\fP become valid, otherwise they are ignored\&. Case-insensitive\&. + +.PP + +.PP +.IP "\fBbasis-lz: +.IP "" 1c +Supercompress the image data with transcodable ETC1S / BasisLZ\&. RED images will become RGB with RED in each component (RRR)\&. RG images will have R in the RGB part and G in the alpha part of the compressed texture (RRRG)\&. When set, the \fIbasis-lz\fP options become valid\&. + +.PP +.IP "\fBuastc: +.IP "" 1c +Create a texture in high-quality transcodable UASTC format\&. When set the \fIuastc\fP options become valid\&. + +.PP + +.PP + +.PP +.IP "\fB--format +.IP "" 1c +KTX format enum that specifies the target ASTC format\&. Non-ASTC formats are invalid\&. When specified the ASTC-specific and common encoder options listed \fBbelow\fP become valid, otherwise they are ignored\&. + +.PP + +.PP +.IP "\fB--zstd +.IP "" 1c +Supercompress the data with Zstandard\&. Cannot be used with ETC1S / BasisLZ format\&. Level range is [1,22]\&. Lower levels give faster but worse compression\&. Values above 20 should be used with caution as they require more memory\&. + +.PP +.IP "\fB--zlib +.IP "" 1c +Supercompress the data with ZLIB\&. Cannot be used with ETC1S / BasisLZ format\&. Level range is [1,9]\&. Lower levels give faster but worse compression\&. + +.PP + +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP +.SS "Specific and Common Encoding Options" +The following specific and common encoder options are available\&. Specific options become valid only if their encoder has been selected\&. Common encoder options become valid when an encoder they apply to has been selected\&. Otherwise they are ignored\&. + +.PP +.IP "\fBASTC: +.IP "" 1c + +.PP + +.PP +.IP "\fB--astc-quality +.IP "" 1c +The quality level configures the quality-performance tradeoff for the compressor; more complete searches of the search space improve image quality at the expense of compression time\&. Default is 'medium'\&. The quality level can be set between fastest (0) and exhaustive (100) via the following fixed quality presets: Level Quality fastest (equivalent to quality = 0) fast (equivalent to quality = 10) medium (equivalent to quality = 60) thorough (equivalent to quality = 98) exhaustive (equivalent to quality = 100) + +.PP +.IP "\fB--astc-perceptual +.IP "" 1c +The codec should optimize for perceptual error, instead of direct RMS error\&. This aims to improve perceived image quality, but typically lowers the measured PSNR score\&. Perceptual methods are currently only available for normal maps and RGB color data\&. + +.PP + +.PP + +.PP + +.PP +.IP "\fBbasis-lz: +.IP "" 1c + +.PP +.IP "\fB--clevel +.IP "" 1c +ETC1S / BasisLZ compression level, an encoding speed vs\&. quality tradeoff\&. Range is [0,6], default is 1\&. Higher values are slower but give higher quality\&. Use \fB--qlevel\fP first\&. + +.PP +.IP "\fB--qlevel +.IP "" 1c +ETC1S / BasisLZ quality level\&. Range is [1,255]\&. Lower gives better compression/lower quality/faster\&. Higher gives less compression/higher quality/slower\&. \fB--qlevel\fP automatically determines values for \fB--max-endpoints\fP, \fB--max-selectors\fP, \fB--endpoint-rdo-threshold\fP and \fB--selector-rdo-threshold\fP for the target quality level\&. Setting these options overrides the values determined by -qlevel which defaults to 128 if neither it nor \fB--max-endpoints\fP and \fB--max-selectors\fP have been set\&. + +.PP +Note that both of \fB--max-endpoints\fP and \fB--max-selectors\fP must be set for them to have any effect\&. If all three options are set, a warning will be issued that \fB--qlevel\fP will be ignored\&. + +.PP +Note also that \fB--qlevel\fP will only determine values for \fB--endpoint-rdo-threshold\fP and \fB--selector-rdo-threshold\fP when its value exceeds 128, otherwise their defaults will be used\&. + +.PP +.IP "\fB--max-endpoints +.IP "" 1c +Manually set the maximum number of color endpoint clusters\&. Range is [1,16128]\&. Default is 0, unset\&. + +.PP +.IP "\fB--endpoint-rdo-threshold +.IP "" 1c +Set endpoint RDO quality threshold\&. The default is 1\&.25\&. Lower is higher quality but less quality per output bit (try [1\&.0,3\&.0])\&. This will override the value chosen by \fB--qlevel\fP\&. + +.PP +.IP "\fB--max-selectors +.IP "" 1c +Manually set the maximum number of color selector clusters from [1,16128]\&. Default is 0, unset\&. + +.PP +.IP "\fB--selector-rdo-threshold +.IP "" 1c +Set selector RDO quality threshold\&. The default is 1\&.25\&. Lower is higher quality but less quality per output bit (try [1\&.0,3\&.0])\&. This will override the value chosen by \fB--qlevel\fP\&. + +.PP +.IP "\fB--no-endpoint-rdo +.IP "" 1c +Disable endpoint rate distortion optimizations\&. Slightly faster, less noisy output, but lower quality per output bit\&. Default is to do endpoint RDO\&. + +.PP +.IP "\fB--no-selector-rdo +.IP "" 1c +Disable selector rate distortion optimizations\&. Slightly faster, less noisy output, but lower quality per output bit\&. Default is to do selector RDO\&. + +.PP + +.PP + +.PP +.IP "\fBuastc: +.IP "" 1c + +.PP + +.PP +.IP "\fB--uastc-quality +.IP "" 1c +This optional parameter selects a speed vs quality tradeoff as shown in the following table: + +.PP +LevelSpeedQuality0 Fastest 43\&.45dB1 Faster 46\&.49dB2 Default 47\&.47dB3 Slower 48\&.01dB4 Very slow 48\&.24dB + +.PP +You are strongly encouraged to also specify \fB--zstd\fP to losslessly compress the UASTC data\&. This and any LZ-style compression can be made more effective by conditioning the UASTC texture data using the Rate Distortion Optimization (RDO) post-process stage\&. When uastc encoding is set the following options become available for controlling RDO: + +.PP +.IP "\fB--uastc-rdo +.IP "" 1c +Enable UASTC RDO post-processing\&. + +.PP +.IP "\fB--uastc-rdo-l +.IP "" 1c +Set UASTC RDO quality scalar (lambda) to \fIlambda\fP\&. Lower values yield higher quality/larger LZ compressed files, higher values yield lower quality/smaller LZ compressed files\&. A good range to try is [\&.25,10]\&. For normal maps a good range is [\&.25,\&.75]\&. The full range is [\&.001,10\&.0]\&. Default is 1\&.0\&. + +.PP +Note that previous versions used the \fB--uastc-rdo-q\fP option which was removed because the RDO algorithm changed\&. + +.PP +.IP "\fB--uastc-rdo-d +.IP "" 1c +Set UASTC RDO dictionary size in bytes\&. Default is 4096\&. Lower values=faster, but give less compression\&. Range is [64,65536]\&. + +.PP +.IP "\fB--uastc-rdo-b +.IP "" 1c +Set UASTC RDO max smooth block error scale\&. Range is [1\&.0,300\&.0]\&. Default is 10\&.0, 1\&.0 is disabled\&. Larger values suppress more artifacts (and allocate more bits) on smooth blocks\&. + +.PP +.IP "\fB--uastc-rdo-s +.IP "" 1c +Set UASTC RDO max smooth block standard deviation\&. Range is [\&.01,65536\&.0]\&. Default is 18\&.0\&. Larger values expand the range of blocks considered smooth\&. + +.PP +.IP "\fB--uastc-rdo-f +.IP "" 1c +Do not favor simpler UASTC modes in RDO mode\&. + +.PP +.IP "\fB--uastc-rdo-m +.IP "" 1c +Disable RDO multithreading (slightly higher compression, deterministic)\&. + +.PP + +.PP + +.PP + +.PP +.IP "\fBcommon: +.IP "" 1c + +.PP +.IP "\fB--normal-mode +.IP "" 1c +Only valid for linear textures with two or more components\&. If the input texture has three or four linear components it is assumed to be a three component linear normal map storing unit length normals as (R=X, G=Y, B=Z)\&. A fourth component will be ignored\&. The map will be converted to a two component X+Y normal map stored as (RGB=X, A=Y) prior to encoding\&. If unsure that your normals are unit length, use \fB--normalize\fP\&. If the input has 2 linear components it is assumed to be an X+Y map of unit normals\&. + +.PP +The Z component can be recovered programmatically in shader code by using the equations: +.PP +.nf + + nml\&.xy = texture(\&.\&.\&.)\&.ga; // Load in [0,1] + nml\&.xy = nml\&.xy * 2\&.0 - 1\&.0; // Unpack to [-1,1] + nml\&.z = sqrt(1 - dot(nml\&.xy, nml\&.xy)); // Compute Z + +.fi +.PP + For ETC1S / BasisLZ encoding, \fB'--encode\fP basis-lz', RDO is disabled (no selector RDO, no endpoint RDO) to provide better quality\&. + +.PP +.IP "\fB--threads +.IP "" 1c +Explicitly set the number of threads to use during compression\&. By default, ETC1S / BasisLZ will use the number of threads reported by \fRthread::hardware_concurrency\fP or 1 if value returned is 0\&. + +.PP +.IP "\fB--no-sse +.IP "" 1c +Forbid use of the SSE instruction set\&. Ignored if CPU does not support SSE\&. SSE can only be disabled for the basis-lz and uastc encoders\&. Ignored for other encoders\&.\&. + +.PP + +.PP + +.PP + +.PP +.IP "\fB +.IP "" 1c + +.PP +.IP "\fB--compare-ssim +.IP "" 1c +Calculate encoding structural similarity index measure (SSIM) and print it to stdout\&. Requires Basis-LZ, UASTC or ASTC encoding\&. + +.PP +.IP "\fB--compare-psnr +.IP "" 1c +Calculate encoding peak signal-to-noise ratio (PSNR) and print it to stdout\&. Requires Basis-LZ, UASTC or ASTC encoding\&. + +.PP + +.PP +.SH "EXIT STATUS" +.PP +.IP "\(bu" 2 +0 - Success +.IP "\(bu" 2 +1 - Command line error +.IP "\(bu" 2 +2 - IO failure +.IP "\(bu" 2 +3 - Invalid input file +.IP "\(bu" 2 +4 - Runtime or library error +.IP "\(bu" 2 +5 - Not supported state or operation +.IP "\(bu" 2 +6 - Requested feature is not yet implemented +.PP +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version\&. +.PP +.RE +.PP +\fBVersion 4\&.4\fP +.RS 4 + +.IP "\(bu" 2 +Reorganize encoding options\&. +.PP +.RE +.PP +.SH "AUTHOR" +.PP +.IP "\(bu" 2 +Mátyás Császár [Vader], RasterGrid www\&.rastergrid\&.com +.IP "\(bu" 2 +Daniel Rákos, RasterGrid www\&.rastergrid\&.com +.PP + diff --git a/ktx/build/docs/man/man1/ktx_extract.1 b/ktx/build/docs/man/man1/ktx_extract.1 new file mode 100644 index 0000000..aa1e928 --- /dev/null +++ b/ktx/build/docs/man/man1/ktx_extract.1 @@ -0,0 +1,144 @@ +.TH "ktx_extract" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx_extract \- ktx extract +.PP +Extract selected images from a KTX2 file\&. +.SH "SYNOPSIS" +.PP +ktx extract [option\&.\&.\&.] \fIinput-file\fP \fIoutput-path\fP +.SH "DESCRIPTION" +.PP +\fBktx\fP \fBextract\fP can extract one or multiple images from the KTX2 file specified as the \fIinput-file\fP argument and, based on the format, save them as Raw, EXR or PNG image files to the \fIoutput-path\fP\&. If the \fIinput-file\fP is '-' the file will be read from the stdin\&. If the \fIoutput-path\fP is '-' the output file will be written to the stdout\&. If the input file is invalid the first encountered validation error is displayed to the stderr and the command exits with the relevant non-zero status code\&. + +.PP +The \fIoutput-path\fP is interpreted as output filepath for single and output directory for multi-image extracts\&. When extracting multiple images with either '--all' or any of the 'all' args the following naming is used for each output file: +.PP +.nf +output-path/output_level{}_face{}_layer{}_depth{}\&.extension +.fi +.PP +.IP "\(bu" 2 +Where the \fI_level{}\fP part is only present if the source texture has more than 1 level +.IP "\(bu" 2 +Where the \fI_face{}\fP part is only present if the source texture is cubemap or cubemap array (Cubemap) +.IP "\(bu" 2 +Where the \fI_layer{}\fP part is only present if the source texture is an array texture (Array) +.IP "\(bu" 2 +Where the \fI_depth{}\fP part is only present if the source texture baseDepth is more than 1 (3D) +.IP "\(bu" 2 +Where the \fI{}\fP is replaced with the numeric index of the given component starting from 0 +.IP "\(bu" 2 +Where the \fIextension\fP part is "raw", "png" or "exr" based on the export format +.br + Note: The inclusion of the optional parts are determined by the source texture regardless of which images are requested\&. +.PP + +.PP +For non-raw exports the output image format is chosen to be the smallest related lossless format: +.IP "\(bu" 2 +_UNORM formats exported as PNG with RGB/RGBA 8/16 bit +.IP "\(bu" 2 +_SINT/_UINT formats exported as EXR with R/RG/RGB/RGBA Half/Float/UInt +.IP "\(bu" 2 +_SFLOAT/_UFLOAT formats exported as EXR with R/RG/RGB/RGBA Half/Float/UInt +.IP "\(bu" 2 +D16_UNORM exported as PNG with luminance (Gray) 16 bit +.IP "\(bu" 2 +Other Depth/Stencil formats exported as EXR with D/S/DS Half/Float +.PP +.SH "OPTIONS" +.PP +The following options are available: + +.PP +.IP "\fB--transcode +.IP "" 1c +Transcode the texture to the target format before executing the extract\&. Requires the input file to be transcodable (it must be either BasisLZ supercompressed or has UASTC color model in the DFD)\&. This option matches the functionality of the \fBktx transcode\fP command\&. If the target option is not set the r8, rg8, rgb8 or rgba8 target will be selected based on the number of channels in the input texture\&. Block compressed transcode targets can only be saved in raw format\&. Case-insensitive\&. Possible options are: etc-rgb | etc-rgba | eac-r11 | eac-rg11 | bc1 | bc3 | bc4 | bc5 | bc7 | astc | r8 | rg8 | rgb8 | rgba8\&. etc-rgb is ETC1; etc-rgba, eac-r11 and eac-rg11 are ETC2\&. + +.PP + +.PP +.IP "\fB--uri +.IP "" 1c +KTX Fragment URI\&. https://registry.khronos.org/KTX/specs/2.0/ktx-frag.html + +.PP +.IP "\fB--level [0-9]+ | all +.IP "" 1c +Level to extract\&. When 'all' is used every level is exported\&. Defaults to 0\&. + +.PP +.IP "\fB--layer [0-9]+ | all +.IP "" 1c +Layer to extract\&. When 'all' is used every layer is exported\&. Defaults to 0\&. + +.PP +.IP "\fB--face [0-9]+ | all +.IP "" 1c +Face to extract\&. When 'all' is used every face is exported\&. Defaults to 0\&. + +.PP +.IP "\fB--depth [0-9]+ | all +.IP "" 1c +Depth slice to extract\&. When 'all' is used every depth is exported\&. Defaults to 0\&. + +.PP +.IP "\fB--all +.IP "" 1c +Extract every image slice from the texture\&. + +.PP +.IP "\fB--raw +.IP "" 1c +Extract the raw image data without any conversion\&. + +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP +.SH "EXIT STATUS" +.PP +.IP "\(bu" 2 +0 - Success +.IP "\(bu" 2 +1 - Command line error +.IP "\(bu" 2 +2 - IO failure +.IP "\(bu" 2 +3 - Invalid input file +.IP "\(bu" 2 +4 - Runtime or library error +.IP "\(bu" 2 +5 - Not supported state or operation +.IP "\(bu" 2 +6 - Requested feature is not yet implemented +.PP +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version +.PP +.RE +.PP +.SH "AUTHOR" +.PP +.IP "\(bu" 2 +Mátyás Császár [Vader], RasterGrid www\&.rastergrid\&.com +.IP "\(bu" 2 +Daniel Rákos, RasterGrid www\&.rastergrid\&.com +.PP + diff --git a/ktx/build/docs/man/man1/ktx_help.1 b/ktx/build/docs/man/man1/ktx_help.1 new file mode 100644 index 0000000..1d896c3 --- /dev/null +++ b/ktx/build/docs/man/man1/ktx_help.1 @@ -0,0 +1,104 @@ +.TH "ktx_help" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx_help \- ktx help +.PP +Display help information about the ktx tool\&. +.SH "SYNOPSIS" +.PP +ktx help [option\&.\&.\&.] [\fIcommand\fP] +.SH "DESCRIPTION" +.PP +\fBktx\fP \fBhelp\fP displays the man page of a specific ktx command specified as the \fIcommand\fP argument\&. On windows systems the man pages are opened with the system default browser in html format\&. On systems derived from Unix the man pages are opened with the man command\&. + +.PP +To support custom install locations the tool first tries to use the man files relative to the executable and falls back to the system man pages\&. + +.PP +\fIcommand\fP specifies which command's man page will be displayed\&. If \fIcommand\fP is s missing the main ktx tool man page will be displayed\&. Possible choices are: +.br +.IP "\(bu" 2 +\fBcompare\fP +.br + +.IP "\(bu" 2 +\fBcreate\fP +.br + +.IP "\(bu" 2 +\fBdeflate\fP +.br + +.IP "\(bu" 2 +\fBencode\fP +.br + +.IP "\(bu" 2 +\fBextract\fP +.br + +.IP "\(bu" 2 +\fBinfo\fP +.br + +.IP "\(bu" 2 +\fBtranscode\fP +.br + +.IP "\(bu" 2 +\fBvalidate\fP +.br + +.IP "\(bu" 2 +\fBhelp\fP +.PP +.SH "OPTIONS" +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP +.SH "EXIT STATUS" +.PP +.IP "\(bu" 2 +0 - Success +.IP "\(bu" 2 +1 - Command line error +.IP "\(bu" 2 +2 - IO failure +.IP "\(bu" 2 +3 - Invalid input file +.IP "\(bu" 2 +4 - Runtime or library error +.IP "\(bu" 2 +5 - Not supported state or operation +.IP "\(bu" 2 +6 - Requested feature is not yet implemented +.PP +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version +.PP +.RE +.PP +.SH "AUTHOR" +.PP +.IP "\(bu" 2 +Mátyás Császár [Vader], RasterGrid www\&.rastergrid\&.com +.IP "\(bu" 2 +Daniel Rákos, RasterGrid www\&.rastergrid\&.com +.PP + diff --git a/ktx/build/docs/man/man1/ktx_info.1 b/ktx/build/docs/man/man1/ktx_info.1 new file mode 100644 index 0000000..7c93b9f --- /dev/null +++ b/ktx/build/docs/man/man1/ktx_info.1 @@ -0,0 +1,90 @@ +.TH "ktx_info" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx_info \- ktx info +.PP +Print information about a KTX2 file\&. +.SH "SYNOPSIS" +.PP +ktx info [option\&.\&.\&.] \fIinput-file\fP +.SH "DESCRIPTION" +.PP +\fBktx\fP \fBinfo\fP prints information about the KTX v1 or v2 file specified as the \fIinput-file\fP argument\&. If the \fIinput-file\fP is '-' the file will be read from the stdin\&. The command implicitly calls \fBvalidate\fP for KTX v2 files and prints any found errors and warnings to stdout\&. If the specified input file is invalid the information is displayed based on best effort and may be incomplete\&. + +.PP +The JSON output formats conform to the https://schema.khronos.org/ktx/info_v0.json schema even if the input file is invalid and certain information cannot be parsed or displayed\&. Additionally, for JSON outputs the KTX file identifier is printed using "\\u001A" instead of "\\x1A" as an unescaped "\\x1A" sequence inside a JSON string breaks nearly every JSON tool\&. Note that this does not change the value of the string only its representation\&. JSON output is only supported for KTX v2 files\&. If requested for a KTX v1 file, an error is generated\&. + +.PP +\fBNote\fP +.RS 4 +\fBktx\fP \fBinfo\fP prints using UTF-8 encoding\&. If your console is not set for UTF-8 you will see incorrect characters in output of the file identifier on each side of the "KTX nn"\&. +.RE +.PP +.SH "OPTIONS" +.PP +The following options are available: + +.PP +.IP "\fB--format text | json | mini-json +.IP "" 1c +Specifies the report output format\&. Possible options are: +.br + \fBtext\fP - Human readable text based format\&. +.br + \fBjson\fP - Formatted JSON\&. +.br + \fBmini-json\fP - Minified JSON\&. +.br + The default format is \fBtext\fP\&. + +.PP + +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP +.SH "EXIT STATUS" +.PP +.IP "\(bu" 2 +0 - Success +.IP "\(bu" 2 +1 - Command line error +.IP "\(bu" 2 +2 - IO failure +.IP "\(bu" 2 +3 - Invalid input file +.IP "\(bu" 2 +4 - Runtime or library error +.IP "\(bu" 2 +5 - Not supported state or operation +.IP "\(bu" 2 +6 - Requested feature is not yet implemented +.PP +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version +.PP +.RE +.PP +.SH "AUTHOR" +.PP +.IP "\(bu" 2 +Mátyás Császár [Vader], RasterGrid www\&.rastergrid\&.com +.IP "\(bu" 2 +Daniel Rákos, RasterGrid www\&.rastergrid\&.com +.PP + diff --git a/ktx/build/docs/man/man1/ktx_transcode.1 b/ktx/build/docs/man/man1/ktx_transcode.1 new file mode 100644 index 0000000..140be1d --- /dev/null +++ b/ktx/build/docs/man/man1/ktx_transcode.1 @@ -0,0 +1,84 @@ +.TH "ktx_transcode" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx_transcode \- ktx transcode +.PP +Transcode a KTX2 file\&. +.SH "SYNOPSIS" +.PP +ktx transcode [option\&.\&.\&.] \fIinput-file\fP \fIoutput-file\fP +.SH "DESCRIPTION" +.PP +\fBktx\fP \fBtranscode\fP can transcode the KTX file specified as the \fIinput-file\fP argument, optionally supercompress the result, and save it as the \fIoutput-file\fP\&. If the \fIinput-file\fP is '-' the file will be read from the stdin\&. If the \fIoutput-path\fP is '-' the output file will be written to the stdout\&. The input file must be transcodable (it must be either BasisLZ supercompressed or has UASTC color model in the DFD)\&. If the input file is invalid the first encountered validation error is displayed to the stderr and the command exits with the relevant non-zero status code\&. +.SH "OPTIONS" +.PP +The following options are available: + +.PP +.IP "\fB--target +.IP "" 1c +Target transcode format\&. If the target option is not set the r8, rg8, rgb8 or rgba8 target will be selected based on the number of channels in the input texture\&. Block compressed transcode targets can only be saved in raw format\&. Case-insensitive\&. Possible options are: etc-rgb | etc-rgba | eac-r11 | eac-rg11 | bc1 | bc3 | bc4 | bc5 | bc7 | astc | r8 | rg8 | rgb8 | rgba8\&. etc-rgb is ETC1; etc-rgba, eac-r11 and eac-rg11 are ETC2\&. + +.PP + +.PP +.IP "\fB--zstd +.IP "" 1c +Supercompress the data with Zstandard\&. Cannot be used with ETC1S / BasisLZ format\&. Level range is [1,22]\&. Lower levels give faster but worse compression\&. Values above 20 should be used with caution as they require more memory\&. + +.PP +.IP "\fB--zlib +.IP "" 1c +Supercompress the data with ZLIB\&. Cannot be used with ETC1S / BasisLZ format\&. Level range is [1,9]\&. Lower levels give faster but worse compression\&. + +.PP + +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP +.SH "EXIT STATUS" +.PP +.IP "\(bu" 2 +0 - Success +.IP "\(bu" 2 +1 - Command line error +.IP "\(bu" 2 +2 - IO failure +.IP "\(bu" 2 +3 - Invalid input file +.IP "\(bu" 2 +4 - Runtime or library error +.IP "\(bu" 2 +5 - Not supported state or operation +.IP "\(bu" 2 +6 - Requested feature is not yet implemented +.PP +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version +.PP +.RE +.PP +.SH "AUTHOR" +.PP +.IP "\(bu" 2 +Mátyás Császár [Vader], RasterGrid www\&.rastergrid\&.com +.IP "\(bu" 2 +Daniel Rákos, RasterGrid www\&.rastergrid\&.com +.PP + diff --git a/ktx/build/docs/man/man1/ktx_validate.1 b/ktx/build/docs/man/man1/ktx_validate.1 new file mode 100644 index 0000000..2842b4e --- /dev/null +++ b/ktx/build/docs/man/man1/ktx_validate.1 @@ -0,0 +1,105 @@ +.TH "ktx_validate" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx_validate \- ktx validate +.PP +Validate a KTX2 file\&. +.SH "SYNOPSIS" +.PP +ktx validate [option\&.\&.\&.] \fIinput-file\fP +.SH "DESCRIPTION" +.PP +\fBktx\fP \fBvalidate\fP validates the Khronos texture format version 2 (KTX2) file specified as the \fIinput-file\fP argument\&. It prints any found errors and warnings to stdout\&. If the \fIinput-file\fP is '-' the file will be read from the stdin\&. + +.PP +The validation rules and checks are based on the official specification: KTX File Format Specification - https://registry.khronos.org/KTX/specs/2.0/ktxspec.v2.html + +.PP +The JSON output formats conform to the https://schema.khronos.org/ktx/validate_v0.json schema\&. + +.PP +\fBNote\fP +.RS 4 +\fBktx\fP \fBvalidate\fP prints using UTF-8 encoding\&. If your console is not set for UTF-8 you will see incorrect characters in output of the file identifier on each side of the "KTX nn"\&. +.RE +.PP +.SH "OPTIONS" +.PP +The following options are available: + +.PP +.IP "\fB--format text | json | mini-json +.IP "" 1c +Specifies the report output format\&. Possible options are: +.br + \fBtext\fP - Human readable text based format\&. +.br + \fBjson\fP - Formatted JSON\&. +.br + \fBmini-json\fP - Minified JSON\&. +.br + The default format is \fBtext\fP\&. + +.PP + +.PP + +.PP +.IP "\fB-g, --gltf-basisu +.IP "" 1c +Check compatibility with KHR_texture_basisu glTF extension\&. + +.PP +.IP "\fB-e, --warnings-as-errors +.IP "" 1c +Treat warnings as errors\&. + +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP +.SH "EXIT STATUS" +.PP +.IP "\(bu" 2 +0 - Success +.IP "\(bu" 2 +1 - Command line error +.IP "\(bu" 2 +2 - IO failure +.IP "\(bu" 2 +3 - Invalid input file +.IP "\(bu" 2 +4 - Runtime or library error +.IP "\(bu" 2 +5 - Not supported state or operation +.IP "\(bu" 2 +6 - Requested feature is not yet implemented +.PP +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version +.PP +.RE +.PP +.SH "AUTHOR" +.PP +.IP "\(bu" 2 +Mátyás Császár [Vader], RasterGrid www\&.rastergrid\&.com +.IP "\(bu" 2 +Daniel Rákos, RasterGrid www\&.rastergrid\&.com +.PP + diff --git a/ktx/build/docs/man/man1/ktxinfo.1 b/ktx/build/docs/man/man1/ktxinfo.1 new file mode 100644 index 0000000..8fdca6a --- /dev/null +++ b/ktx/build/docs/man/man1/ktxinfo.1 @@ -0,0 +1,47 @@ +.TH "ktxinfo" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxinfo \- Print information about KTX or KTX2 files\&. +.SH "SYNOPSIS" +.PP +ktxinfo [options] [\fIinfile\fP \&.\&.\&.] +.SH "DESCRIPTION" +.PP +\fBktxinfo\fP prints information about the KTX files provided as arguments\&. If no arguments are given, it prints information about a single file read from standard input\&. + +.PP +\fBNote\fP +.RS 4 +\fBktxinfo\fP prints using UTF-8 encoding\&. If your console is not set for UTF-8 you will see incorrect characters in output of the file identifier on each side of the "KTX nn"\&. +.RE +.PP +The following options are available: + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP +.SH "EXIT STATUS" +.PP +\fBktxinfo\fP exits 0 on success, 1 on command line errors and 2 if one of the input files is not a KTX file\&. +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version +.PP +.RE +.PP +.SH "AUTHOR" +.PP +Mark Callow, github\&.com/MarkCallow diff --git a/ktx/build/docs/man/man1/ktxsc.1 b/ktx/build/docs/man/man1/ktxsc.1 new file mode 100644 index 0000000..95b7596 --- /dev/null +++ b/ktx/build/docs/man/man1/ktxsc.1 @@ -0,0 +1,278 @@ +.TH "ktxsc" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxsc \- Supercompress the images in a KTX2 file\&. +.SH "SYNOPSIS" +.PP +ktxsc [options] [\fIinfile\fP \&.\&.\&.] +.SH "DESCRIPTION" +.PP +\fBktxsc\fP can encode and supercompress the images in Khronos texture format version 2 files (KTX2)\&. Uncompressed files, i\&.e those whose vkFormat name does not end in \fR_BLOCK\fP can be encoded to ASTC, Basis Universal (encoded to ETC1S then supercompressed with an integrated LZ step) or UASTC and optionally supercompressed with Zstandard (zstd)\&. Any image format, except Basis Universal, can be supercompressed with zstd\&. For best results with UASTC, the data should be conditioned for zstd by using the \fI--uastc_rdo_q\fP and, optionally, \fI--uastc_rdo_d\fP options\&. + +.PP +\fBktxsc\fP reads each named \fIinfile\fP and compresses it in place\&. When \fIinfile\fP is not specified, a single file will be read from \fIstdin\fP and the output written to \fIstdout\fP\&. When one or more files is specified each will be compressed in place\&. + +.PP +The following options are available: + +.PP +.IP "\fB-o outfile, --output=outfile +.IP "" 1c +Write the output to \fIoutfile\fP\&. If \fIoutfile\fP is 'stdout', output will be written to stdout\&. Parent directories will be created, if necessary\&. If there is more than 1 \fIinfile\fP the command prints its usage message and exits\&. + +.PP +.IP "\fB-f, --force +.IP "" 1c +If the destination file cannot be opened, remove it and create a new file, without prompting for confirmation regardless of its permissions\&. + +.PP +.IP "\fB--t2 +.IP "" 1c +Output a KTX version2 file\&. Always true\&. + +.PP + +.PP +.IP "\fB--encode +.IP "" 1c +Compress the image data to ASTC, transcodable ETC1S / BasisLZ or high-quality transcodable UASTC format\&. Implies \fB--t2\fP\&. With each encoding option the following encoder specific options become valid, otherwise they are ignored\&. + +.PP +.IP "\fBastc: +.IP "" 1c +Create a texture in high-quality ASTC format\&. + +.PP +.IP "\fB--astc_blk_d +.IP "" 1c +Specify which block dimension to use for compressing the textures\&. e\&.g\&. \fB--astc_blk_d\fP 6x5 for 2D or \fB--astc_blk_d\fP 6x6x6 for 3D\&. 6x6 is the default for 2D\&. Supported 2D block dimensions are:4x48\&.00 bpp5x46\&.40 bpp5x55\&.12 bpp6x54\&.27 bpp6x63\&.56 bpp8x53\&.20 bpp8x62\&.67 bpp10x52\&.56 bpp10x62\&.13 bpp8x82\&.00 bpp10x81\&.60 bpp10x101\&.28 bpp12x101\&.07 bpp12x120\&.89 bppSupported 3D block dimensions are:3x3x34\&.74 bpp4x3x33\&.56 bpp4x4x32\&.67 bpp4x4x42\&.00 bpp5x4x41\&.60 bpp5x5x41\&.28 bpp5x5x51\&.02 bpp6x5x50\&.85 bpp6x6x50\&.71 bpp6x6x60\&.59 bpp + +.PP +.IP "\fB--astc_mode +.IP "" 1c +Specify which encoding mode to use\&. LDR is the default unless the input image is 16-bit in which case the default is HDR\&. + +.PP +.IP "\fB--astc_quality +.IP "" 1c +The quality level configures the quality-performance tradeoff for the compressor; more complete searches of the search space improve image quality at the expense of compression time\&. Default is 'medium'\&. The quality level can be set between fastest (0) and exhaustive (100) via the following fixed quality presets: Level Quality fastest (equivalent to quality = 0) fast (equivalent to quality = 10) medium (equivalent to quality = 60) thorough (equivalent to quality = 98) exhaustive (equivalent to quality = 100) + +.PP +.IP "\fB--astc_perceptual +.IP "" 1c +The codec should optimize for perceptual error, instead of direct RMS error\&. This aims to improve perceived image quality, but typically lowers the measured PSNR score\&. Perceptual methods are currently only available for normal maps and RGB color data\&. + +.PP + +.PP +.IP "\fBetc1s: +.IP "" 1c +Supercompress the image data with ETC1S / BasisLZ\&. RED images will become RGB with RED in each component\&. RG images will have R in the RGB part and G in the alpha part of the compressed texture\&. When set, the following BasisLZ-related options become valid, otherwise they are ignored\&. + +.PP +.IP "\fB--no_multithreading +.IP "" 1c +Disable multithreading\&. Deprecated\&. For backward compatibility\&. Use \fB--threads\fP 1 instead\&. + +.PP +.IP "\fB--clevel +.IP "" 1c +ETC1S / BasisLZ compression level, an encoding speed vs\&. quality tradeoff\&. Range is [0,5], default is 1\&. Higher values are slower but give higher quality\&. + +.PP +.IP "\fB--qlevel +.IP "" 1c +ETC1S / BasisLZ quality level\&. Range is [1,255]\&. Lower gives better compression/lower quality/faster\&. Higher gives less compression/higher quality/slower\&. \fB--qlevel\fP automatically determines values for \fB--max_endpoints\fP, \fB--max-selectors\fP, \fB--endpoint_rdo_threshold\fP and \fB--selector_rdo_threshold\fP for the target quality level\&. Setting these options overrides the values determined by -qlevel which defaults to 128 if neither it nor both of \fB--max_endpoints\fP and \fB--max_selectors\fP have been set\&. + +.PP +Note that both of \fB--max_endpoints\fP and \fB--max_selectors\fP must be set for them to have any effect\&. If all three options are set, a warning will be issued that \fB--qlevel\fP will be ignored\&. + +.PP +Note also that \fB--qlevel\fP will only determine values for \fB--endpoint_rdo_threshold\fP and \fB--selector_rdo_threshold\fP when its value exceeds 128, otherwise their defaults will be used\&. + +.PP +.IP "\fB--max_endpoints +.IP "" 1c +Manually set the maximum number of color endpoint clusters\&. Range is [1,16128]\&. Default is 0, unset\&. + +.PP +.IP "\fB--endpoint_rdo_threshold +.IP "" 1c +Set endpoint RDO quality threshold\&. The default is 1\&.25\&. Lower is higher quality but less quality per output bit (try [1\&.0,3\&.0])\&. This will override the value chosen by \fB--qlevel\fP\&. + +.PP +.IP "\fB--max_selectors +.IP "" 1c +Manually set the maximum number of color selector clusters from [1,16128]\&. Default is 0, unset\&. + +.PP +.IP "\fB--selector_rdo_threshold +.IP "" 1c +Set selector RDO quality threshold\&. The default is 1\&.25\&. Lower is higher quality but less quality per output bit (try [1\&.0,3\&.0])\&. This will override the value chosen by \fB--qlevel\fP\&. + +.PP +.IP "\fB--no_endpoint_rdo +.IP "" 1c +Disable endpoint rate distortion optimizations\&. Slightly faster, less noisy output, but lower quality per output bit\&. Default is to do endpoint RDO\&. + +.PP +.IP "\fB--no_selector_rdo +.IP "" 1c +Disable selector rate distortion optimizations\&. Slightly faster, less noisy output, but lower quality per output bit\&. Default is to do selector RDO\&. + +.PP + +.PP +.IP "\fBuastc: +.IP "" 1c +Create a texture in high-quality transcodable UASTC format\&. + +.PP +.IP "\fB--uastc_quality +.IP "" 1c +This optional parameter selects a speed vs quality tradeoff as shown in the following table: + +.PP +LevelSpeedQuality0 Fastest 43\&.45dB1 Faster 46\&.49dB2 Default 47\&.47dB3 Slower 48\&.01dB4 Very slow 48\&.24dB + +.PP +You are strongly encouraged to also specify \fB--zcmp\fP to losslessly compress the UASTC data\&. This and any LZ-style compression can be made more effective by conditioning the UASTC texture data using the Rate Distortion Optimization (RDO) post-process stage\&. When uastc encoding is set the following options become available for controlling RDO: + +.PP +.IP "\fB--uastc_rdo_l [] +.IP "" 1c +Enable UASTC RDO post-processing and optionally set UASTC RDO quality scalar (lambda) to \fIlambda\fP\&. Lower values yield higher quality/larger LZ compressed files, higher values yield lower quality/smaller LZ compressed files\&. A good range to try is [\&.25,10]\&. For normal maps a good range is [\&.25,\&.75]\&. The full range is [\&.001,10\&.0]\&. Default is 1\&.0\&. + +.PP +Note that previous versions used the \fB--uastc_rdo_q\fP option which was removed because the RDO algorithm changed\&. + +.PP +.IP "\fB--uastc_rdo_d +.IP "" 1c +Set UASTC RDO dictionary size in bytes\&. Default is 4096\&. Lower values=faster, but give less compression\&. Range is [64,65536]\&. + +.PP +.IP "\fB--uastc_rdo_b +.IP "" 1c +Set UASTC RDO max smooth block error scale\&. Range is [1\&.0,300\&.0]\&. Default is 10\&.0, 1\&.0 is disabled\&. Larger values suppress more artifacts (and allocate more bits) on smooth blocks\&. + +.PP +.IP "\fB--uastc_rdo_s +.IP "" 1c +Set UASTC RDO max smooth block standard deviation\&. Range is [\&.01,65536\&.0]\&. Default is 18\&.0\&. Larger values expand the range of blocks considered smooth\&. + +.PP +.IP "\fB--uastc_rdo_f +.IP "" 1c +Do not favor simpler UASTC modes in RDO mode\&. + +.PP +.IP "\fB--uastc_rdo_m +.IP "" 1c +Disable RDO multithreading (slightly higher compression, deterministic)\&. + +.PP + +.PP +.IP "\fB--input_swizzle +.IP "" 1c +Swizzle the input components according to \fIswizzle\fP which is an alhpanumeric sequence matching the regular expression \fR^\fP[rgba01]{4}$\&. + +.PP +.IP "\fB--normal_mode +.IP "" 1c +Only valid for linear textures with two or more components\&. If the input texture has three or four linear components it is assumed to be a three component linear normal map storing unit length normals as (R=X, G=Y, B=Z)\&. A fourth component will be ignored\&. The map will be converted to a two component X+Y normal map stored as (RGB=X, A=Y) prior to encoding\&. If unsure that your normals are unit length, use \fB--normalize\fP\&. If the input has 2 linear components it is assumed to be an X+Y map of unit normals\&. + +.PP +The Z component can be recovered programmatically in shader code by using the equations: +.PP +.nf + + nml\&.xy = texture(\&.\&.\&.)\&.ga; // Load in [0,1] + nml\&.xy = nml\&.xy * 2\&.0 - 1\&.0; // Unpack to [-1,1] + nml\&.z = sqrt(1 - dot(nml\&.xy, nml\&.xy)); // Compute Z + +.fi +.PP + For ASTC encoding, '\fB--encode\fP astc', encoder parameters are tuned for better quality on normal maps\&. For ETC1S encoding, \fB'--encode\fP etc1s', RDO is disabled (no selector RDO, no endpoint RDO) to provide better quality\&. + +.PP +In \fItoktx\fP you can prevent conversion of the normal map to two components by specifying '\fB--input_swizzle\fP rgb1'\&. + +.PP +.IP "\fB--normalize +.IP "" 1c +Normalize input normals to have a unit length\&. Only valid for linear textures with 2 or more components\&. For 2-component inputs 2D unit normals are calculated\&. Do not use these 2D unit normals to generate X+Y normals for --normal_mode\&. For 4-component inputs a 3D unit normal is calculated\&. 1\&.0 is used for the value of the 4th component\&. + +.PP +.IP "\fB--no_sse +.IP "" 1c +Forbid use of the SSE instruction set\&. Ignored if CPU does not support SSE\&. Only the Basis Universal compressor uses SSE\&. + +.PP +.IP "\fB--bcmp +.IP "" 1c +Deprecated\&. Use '\fB--encode\fP etc1s' instead\&. + +.PP +.IP "\fB--uastc [] +.IP "" 1c +Deprecated\&. Use '\fB--encode\fP uastc' instead\&. + +.PP +.IP "\fB--zcmp [] +.IP "" 1c +Supercompress the data with Zstandard\&. Implies \fB--t2\fP\&. Can be used with data in any format except ETC1S / BasisLZ\&. Most effective with RDO-conditioned UASTC or uncompressed formats\&. The optional compressionLevel range is 1 - 22 and the default is 3\&. Lower values=faster but give less compression\&. Values above 20 should be used with caution as they require more memory\&. + +.PP +.IP "\fB--threads +.IP "" 1c +Explicitly set the number of threads to use during compression\&. By default, ETC1S / BasisLZ and ASTC compression will use the number of threads reported by thread::hardware_concurrency or 1 if value returned is 0\&. + +.PP +.IP "\fB--verbose +.IP "" 1c +Print encoder/compressor activity status to stdout\&. Currently only the astc, etc1s and uastc encoders emit status\&. + +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP + +.PP +.PP +.nf + In case of ambiguity, such as when the last option is one with an optional + parameter, separate options from file names with " -- "\&. + + Any specified ASTC, ETC1S / BasisLZ, UASTC and supercompression options are + recorded in the metadata item @c KTXwriterScParams in the output file\&. +.fi +.PP + +.SH "EXIT STATUS" +.PP +\fBktxsc\fP exits 0 on success, 1 on command line errors and 2 on functional errors\&. +.SH "HISTORY" +.PP +\fBVersion 4\&.0\fP +.RS 4 + +.IP "\(bu" 2 +Initial version\&. +.PP +.RE +.PP +.SH "AUTHOR" +.PP +Mark Callow, github\&.com/MarkCallow diff --git a/ktx/build/docs/man/man1/toktx.1 b/ktx/build/docs/man/man1/toktx.1 new file mode 100644 index 0000000..72fd87d --- /dev/null +++ b/ktx/build/docs/man/man1/toktx.1 @@ -0,0 +1,488 @@ +.TH "toktx" 1 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Tools Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +toktx \- Create a KTX file from JPEG, PNG or netpbm format files\&. +.SH "SYNOPSIS" +.PP +toktx [options] \fIoutfile\fP [\fIinfile\fP\&.{jpg,png,pam,pgm,ppm} \&.\&.\&.] +.SH "DESCRIPTION" +.PP +Create a Khronos format texture file (KTX) from a set of JPEG (\&.jpg), PNG (\&.png) or Netpbm format (\&.pam, \&.pgm, \&.ppm) images\&. It writes the destination ktx file to \fIoutfile\fP, creating parent directories and appending "\&.ktx{,2}" if necessary\&. If \fIoutfile\fP is '-' the output will be written to stdout\&. + +.PP +\fBtoktx\fP reads each named \fIinfile\fP\&. which must be in \&.jpg, \&.png, \&.pam, \&.ppm or \&.pgm format\&. \fIinfiles\fP prefixed with '@' are read as text files listing actual file names to process with one file path per line\&. Paths must be absolute or relative to the current directory when \fBtoktx\fP is run\&. If '@@' is used instead, paths must be absolute or relative to the location of the list file\&. File paths must be encoded in UTF-8\&. + +.PP +The target texture type (number of components in the output texture) is chosen via \fB--target_type\fP\&. Swizzling of the components of the input file is specified with \fB--input_swizzle\fP and swizzzle metadata can be specified with \fB--swizzle\fP\&. Defaults, shown in the following table, are based on the components of the input file and whether the target texture format is uncompressed or block-compressed including the universal formats\&. Input components are arbitrarily labeled r, g, b & a\&. + +.PP +Uncompressed Formats Block-compressed formats Input components 1 (greyscale) 2 (greyscale alpha) 3 4 1 2 3 4 Target type R RG RGB RGBA RGB RGBA RGB RGBA Input swizzle - - - - rrr1 rrrg - - Swizzle rrr1 rrrg - - - - - - + +.PP +As can be seen from the table one- and two-component inputs are treated as luminance{,-alpha} in accordance with the JPEG and PNG specifications\&. For consistency Netpbm inputs are handled the same way\&. Use of R & RG types for uncompressed formats saves space but note that the sRGB versions of these formats are not widely supported so a warning will be issued prompting you to convert the input to linear\&. + +.PP +The primaries, transfer function (OETF) and the texture's sRGB-ness is set based on the input file unless \fB--assign_oetf\fP linear or \fB--assign_oetf\fP srgb is specified\&. For \&.jpg files \fBtoktx\fP always sets BT709/sRGB primaries and the sRGB OETF in the output file and creates sRGB format textures\&. Netpbm files always use BT\&.709/sRGB primaries and the BT\&.709 OETF\&. \fBtoktx\fP tranforms these images to the sRGB OETF, sets BT709/sRGB primaries and the sRGB OETF in the output file and creates sRGB format textures\&. + +.PP +For \&.png files the OETF is set as follows: + +.PP + +.PP +.IP "\fBNo color-info chunks or sRGB chunk present: +.IP "" 1c +primaries are set to BT\&.709 and OETF to sRGB\&. + +.PP +.IP "\fBsRGB chunk present: +.IP "" 1c +primaries are set to BT\&.709 and OETF to sRGB\&. gAMA and cHRM chunks are ignored\&. + +.PP +.IP "\fBiCCP chunk present: +.IP "" 1c +General ICC profiles are not yet supported by toktx or the KTX2 format\&. In future these images may be transformed to linear or sRGB OETF as appropriate for the profile\&. sRGB chunk must not be present\&. + +.PP +.IP "\fBgAMA and/or cHRM chunks present without sRGB or iCCP: +.IP "" 1c +If gAMA is < 60000 the image is transformed to and the OETF is set to sRGB\&. otherwise the image is transformed to and the OETF is set to linear\&. The color primaries in cHRM are matched to one of the standard sets listed in the Khronos Data Format Specification (the KHR_DF_PRIMARIES values from khr_df\&.h) and the primaries field of the output file's DFD is set to the matched value\&. If no match is found the primaries field is set to UNSPECIFIED\&. + +.PP + +.PP +The following options are always available: + +.PP +.IP "\fB--2d +.IP "" 1c +If the image height is 1, by default a KTX file for a 1D texture is created\&. With this option one for a 2D texture is created instead\&. + +.PP +.IP "\fB--automipmap +.IP "" 1c +Causes the KTX file to be marked to request generation of a mipmap pyramid when the file is loaded\&. This option is mutually exclusive with \fB--genmipmap\fP, \fB--levels\fP and \fB--mipmap\fP\&. + +.PP +.IP "\fB--cubemap +.IP "" 1c +KTX file is for a cubemap\&. At least 6 \fIinfiles\fP must be provided, more if \fB--mipmap\fP or \fB--layers\fP is also specified\&. Provide the images in the order +X, -X, +Y, -Y, +Z, -Z where the arrangement is a left-handed coordinate system with +Y up\&. So if you're facing +Z, -X will be on your left and +X on your right\&. If \fB--layers\fP > 1 is specified, provide the faces for layer 0 first then for layer 1, etc\&. Images must have an upper left origin so --lower_left_maps_to_s0t0 is ignored with this option\&. + +.PP +.IP "\fB--depth +.IP "" 1c +KTX file is for a 3D texture with a depth of \fInumber\fP where \fInumber\fP > 0\&. Provide the file(s) for z=0 first then those for z=1, etc\&. It is an error to specify this together with \fB--layers\fP or \fB--cubemap\fP\&. + +.PP +.IP "\fB--genmipmap +.IP "" 1c +Causes mipmaps to be generated for each input file\&. This option is mutually exclusive with \fB--automipmap\fP and \fB--mipmap\fP\&. When set, the following mipmap-generation related options become valid, otherwise they are ignored\&. + +.PP +.IP "\fB--filter +.IP "" 1c +Specifies the filter to use when generating the mipmaps\&. \fIname\fP is a string\&. The default is \fIlanczos4\fP\&. The following names are recognized: \fIbox\fP, \fItent\fP, \fIbell\fP, \fIb-spline\fP, \fImitchell\fP, \fIlanczos3\fP, \fIlanczos4\fP, \fIlanczos6\fP, \fIlanczos12\fP, \fIblackman\fP, \fIkaiser\fP, \fIgaussian\fP, \fIcatmullrom\fP, \fIquadratic_interp\fP, \fIquadratic_approx\fP and \fIquadratic_mix\fP\&. + +.PP +.IP "\fB--fscale +.IP "" 1c +The filter scale to use\&. The default is 1\&.0\&. + +.PP +.IP "\fB--wmode +.IP "" 1c +Specify how to sample pixels near the image boundaries\&. Values are \fIwrap\fP, \fIreflect\fP and \fIclamp\fP\&. The default is \fIclamp\fP\&. + +.PP + +.PP +.IP "\fB--layers +.IP "" 1c +KTX file is for an array texture with \fInumber\fP of layers where \fInumber\fP > 0\&. Provide the file(s) for layer 0 first then those for layer 1, etc\&. It is an error to specify this together with \fB--depth\fP\&. + +.PP +.IP "\fB--levels +.IP "" 1c +KTX file is for a mipmap pyramid with \fInumber\fP of levels rather than a full pyramid\&. \fInumber\fP must be > 1 and <= the maximum number of levels determined from the size of the base level image\&. Provide the base level image first, if using \fB--mipmap\fP\&. This option is mutually exclusive with \fB--automipmap\fP\&. + +.PP +.IP "\fB--mipmap +.IP "" 1c +KTX file is for a mipmap pyramid with one \fBinfile\fP being explicitly provided for each level\&. Provide the images in the order of layer then face or depth slice then level with the base-level image first then in order down to the 1x1 image or the level specified by \fB--levels\fP\&. +.PP +\fBNote\fP +.RS 4 +This ordering differs from that in the created texture as it is felt to be more user-friendly\&. +.RE +.PP +This option is mutually exclusive with \fB--automipmap\fP and \fB--genmipmap\fP\&. + +.PP +.IP "\fB--nometadata +.IP "" 1c +Do not write KTXorientation metadata into the output file\&. Metadata is written by default\&. Use of this option is not recommended\&. + +.PP +.IP "\fB--nowarn +.IP "" 1c +Silence warnings which are issued when certain transformations are performed on input images\&. + +.PP +.IP "\fB--upper_left_maps_to_s0t0 +.IP "" 1c +Map the logical upper left corner of the image to s0,t0\&. Although opposite to the OpenGL convention, this is the DEFAULT BEHAVIOUR\&. netpbm and PNG files have an upper left origin so this option does not flip the input images\&. When this option is in effect, toktx writes a KTXorientation value of S=r,T=d into the output file to inform loaders of the logical orientation\&. If an OpenGL {,ES} loader ignores the orientation value, the image will appear upside down\&. + +.PP +.IP "\fB--lower_left_maps_to_s0t0 +.IP "" 1c +Map the logical lower left corner of the image to s0,t0\&. This causes the input netpbm and PNG images to be flipped vertically to a lower-left origin\&. When this option is in effect, toktx writes a KTXorientation value of S=r,T=u into the output file to inform loaders of the logical orientation\&. If a Vulkan loader ignores the orientation value, the image will appear upside down\&. This option is ignored with \fB--cubemap\fP\&. + +.PP +.IP "\fB--assign_oetf +.IP "" 1c +Force the created texture to have the specified transfer function\&. If this is specified, implicit or explicit color space information from the input file(s) will be ignored and no color transformation will be performed\&. USE WITH CAUTION preferably only when you know the file format information is wrong\&. + +.PP +.IP "\fB--assign_primaries +.IP "" 1c +Force the created texture to have the specified primaries\&. If this is specified, implicit or explicit color space information from the input file(s) will be ignored and no color transformation will be performed\&. USE WITH CAUTION preferably only when you know the file format information is wrong\&. + +.PP +.IP "\fB--convert_oetf +.IP "" 1c +Convert the input images to the specified transfer function, if the current transfer function is different\&. If both this and \fB--assign_oetf\fP are specified, conversion will be performed from the assigned transfer function to the transfer function specified by this option, if different\&. + +.PP +.IP "\fB--convert_primaries +.IP "" 1c +Convert the image images to the specified color primaries, if different from the color primaries of the input file(s) or the one specified by --assign-primaries\&. If both this and --assign-primaries are specified, conversion will be performed from the assigned primaries to the primaries specified by this option, if different\&. This option is not allowed to be specified when --assign-primaries is set to 'none'\&. Case insensitive\&. Possible options are: bt709 | srgb | bt601-ebu | bt601-smpte | bt2020 | ciexyz | aces | acescc | ntsc1953 | pal525 | displayp3 | adobergb + +.PP +.IP "\fB--linear +.IP "" 1c +Deprecated\&. Use \fB--assign_oetf\fP linear\&. + +.PP +.IP "\fB--srgb +.IP "" 1c +Deprecated\&. Use \fB--assign_oetf\fP srgb\&. + +.PP +.IP "\fB--resize x +.IP "" 1c +Resize images to \fIwidth\fP X \fIheight\fP\&. This should not be used with \fB--mipmap\fP as it would resize all the images to the same size\&. Resampler options can be set via \fB--filter\fP and \fB--fscale\fP\&. + +.PP +.IP "\fB--scale +.IP "" 1c +Scale images by \fIvalue\fP as they are read\&. Resampler options can be set via \fB--filter\fP and \fB--fscale\fP\&. \&. + +.PP +.IP "\fB--swizzle +.IP "" 1c +Add swizzle metadata to the file being created\&. \fIswizzle\fP has the same syntax as the parameter for \fB--input_swizzle\fP\&. Not recommended for use with block-cmpressed textures, including Basis Universal formats, because something like \fRrabb\fP may yield drastically different error metrics if done after compression\&. + +.PP +.IP "\fB--target_type +.IP "" 1c +Specify the number of components in the created texture\&. \fItype\fP is one of the following strings: \fRR\fP, \fRRG\fP, \fRRGB\fP or \fRRGBA\fP\&. Excess input components will be dropped\&. Output components with no mapping from the input will be set to 0 or, if the alpha component, 1\&.0\&. + +.PP +.IP "\fB--t2 +.IP "" 1c +Output in KTX2 format\&. Default is KTX\&. + +.PP + +.PP +.IP "\fB--encode +.IP "" 1c +Compress the image data to ASTC, transcodable ETC1S / BasisLZ or high-quality transcodable UASTC format\&. Implies \fB--t2\fP\&. With each encoding option the following encoder specific options become valid, otherwise they are ignored\&. + +.PP +.IP "\fBastc: +.IP "" 1c +Create a texture in high-quality ASTC format\&. + +.PP +.IP "\fB--astc_blk_d +.IP "" 1c +Specify which block dimension to use for compressing the textures\&. e\&.g\&. \fB--astc_blk_d\fP 6x5 for 2D or \fB--astc_blk_d\fP 6x6x6 for 3D\&. 6x6 is the default for 2D\&. Supported 2D block dimensions are:4x48\&.00 bpp5x46\&.40 bpp5x55\&.12 bpp6x54\&.27 bpp6x63\&.56 bpp8x53\&.20 bpp8x62\&.67 bpp10x52\&.56 bpp10x62\&.13 bpp8x82\&.00 bpp10x81\&.60 bpp10x101\&.28 bpp12x101\&.07 bpp12x120\&.89 bppSupported 3D block dimensions are:3x3x34\&.74 bpp4x3x33\&.56 bpp4x4x32\&.67 bpp4x4x42\&.00 bpp5x4x41\&.60 bpp5x5x41\&.28 bpp5x5x51\&.02 bpp6x5x50\&.85 bpp6x6x50\&.71 bpp6x6x60\&.59 bpp + +.PP +.IP "\fB--astc_mode +.IP "" 1c +Specify which encoding mode to use\&. LDR is the default unless the input image is 16-bit in which case the default is HDR\&. + +.PP +.IP "\fB--astc_quality +.IP "" 1c +The quality level configures the quality-performance tradeoff for the compressor; more complete searches of the search space improve image quality at the expense of compression time\&. Default is 'medium'\&. The quality level can be set between fastest (0) and exhaustive (100) via the following fixed quality presets: Level Quality fastest (equivalent to quality = 0) fast (equivalent to quality = 10) medium (equivalent to quality = 60) thorough (equivalent to quality = 98) exhaustive (equivalent to quality = 100) + +.PP +.IP "\fB--astc_perceptual +.IP "" 1c +The codec should optimize for perceptual error, instead of direct RMS error\&. This aims to improve perceived image quality, but typically lowers the measured PSNR score\&. Perceptual methods are currently only available for normal maps and RGB color data\&. + +.PP + +.PP +.IP "\fBetc1s: +.IP "" 1c +Supercompress the image data with ETC1S / BasisLZ\&. RED images will become RGB with RED in each component\&. RG images will have R in the RGB part and G in the alpha part of the compressed texture\&. When set, the following BasisLZ-related options become valid, otherwise they are ignored\&. + +.PP +.IP "\fB--no_multithreading +.IP "" 1c +Disable multithreading\&. Deprecated\&. For backward compatibility\&. Use \fB--threads\fP 1 instead\&. + +.PP +.IP "\fB--clevel +.IP "" 1c +ETC1S / BasisLZ compression level, an encoding speed vs\&. quality tradeoff\&. Range is [0,5], default is 1\&. Higher values are slower but give higher quality\&. + +.PP +.IP "\fB--qlevel +.IP "" 1c +ETC1S / BasisLZ quality level\&. Range is [1,255]\&. Lower gives better compression/lower quality/faster\&. Higher gives less compression/higher quality/slower\&. \fB--qlevel\fP automatically determines values for \fB--max_endpoints\fP, \fB--max-selectors\fP, \fB--endpoint_rdo_threshold\fP and \fB--selector_rdo_threshold\fP for the target quality level\&. Setting these options overrides the values determined by -qlevel which defaults to 128 if neither it nor both of \fB--max_endpoints\fP and \fB--max_selectors\fP have been set\&. + +.PP +Note that both of \fB--max_endpoints\fP and \fB--max_selectors\fP must be set for them to have any effect\&. If all three options are set, a warning will be issued that \fB--qlevel\fP will be ignored\&. + +.PP +Note also that \fB--qlevel\fP will only determine values for \fB--endpoint_rdo_threshold\fP and \fB--selector_rdo_threshold\fP when its value exceeds 128, otherwise their defaults will be used\&. + +.PP +.IP "\fB--max_endpoints +.IP "" 1c +Manually set the maximum number of color endpoint clusters\&. Range is [1,16128]\&. Default is 0, unset\&. + +.PP +.IP "\fB--endpoint_rdo_threshold +.IP "" 1c +Set endpoint RDO quality threshold\&. The default is 1\&.25\&. Lower is higher quality but less quality per output bit (try [1\&.0,3\&.0])\&. This will override the value chosen by \fB--qlevel\fP\&. + +.PP +.IP "\fB--max_selectors +.IP "" 1c +Manually set the maximum number of color selector clusters from [1,16128]\&. Default is 0, unset\&. + +.PP +.IP "\fB--selector_rdo_threshold +.IP "" 1c +Set selector RDO quality threshold\&. The default is 1\&.25\&. Lower is higher quality but less quality per output bit (try [1\&.0,3\&.0])\&. This will override the value chosen by \fB--qlevel\fP\&. + +.PP +.IP "\fB--no_endpoint_rdo +.IP "" 1c +Disable endpoint rate distortion optimizations\&. Slightly faster, less noisy output, but lower quality per output bit\&. Default is to do endpoint RDO\&. + +.PP +.IP "\fB--no_selector_rdo +.IP "" 1c +Disable selector rate distortion optimizations\&. Slightly faster, less noisy output, but lower quality per output bit\&. Default is to do selector RDO\&. + +.PP + +.PP +.IP "\fBuastc: +.IP "" 1c +Create a texture in high-quality transcodable UASTC format\&. + +.PP +.IP "\fB--uastc_quality +.IP "" 1c +This optional parameter selects a speed vs quality tradeoff as shown in the following table: + +.PP +LevelSpeedQuality0 Fastest 43\&.45dB1 Faster 46\&.49dB2 Default 47\&.47dB3 Slower 48\&.01dB4 Very slow 48\&.24dB + +.PP +You are strongly encouraged to also specify \fB--zcmp\fP to losslessly compress the UASTC data\&. This and any LZ-style compression can be made more effective by conditioning the UASTC texture data using the Rate Distortion Optimization (RDO) post-process stage\&. When uastc encoding is set the following options become available for controlling RDO: + +.PP +.IP "\fB--uastc_rdo_l [] +.IP "" 1c +Enable UASTC RDO post-processing and optionally set UASTC RDO quality scalar (lambda) to \fIlambda\fP\&. Lower values yield higher quality/larger LZ compressed files, higher values yield lower quality/smaller LZ compressed files\&. A good range to try is [\&.25,10]\&. For normal maps a good range is [\&.25,\&.75]\&. The full range is [\&.001,10\&.0]\&. Default is 1\&.0\&. + +.PP +Note that previous versions used the \fB--uastc_rdo_q\fP option which was removed because the RDO algorithm changed\&. + +.PP +.IP "\fB--uastc_rdo_d +.IP "" 1c +Set UASTC RDO dictionary size in bytes\&. Default is 4096\&. Lower values=faster, but give less compression\&. Range is [64,65536]\&. + +.PP +.IP "\fB--uastc_rdo_b +.IP "" 1c +Set UASTC RDO max smooth block error scale\&. Range is [1\&.0,300\&.0]\&. Default is 10\&.0, 1\&.0 is disabled\&. Larger values suppress more artifacts (and allocate more bits) on smooth blocks\&. + +.PP +.IP "\fB--uastc_rdo_s +.IP "" 1c +Set UASTC RDO max smooth block standard deviation\&. Range is [\&.01,65536\&.0]\&. Default is 18\&.0\&. Larger values expand the range of blocks considered smooth\&. + +.PP +.IP "\fB--uastc_rdo_f +.IP "" 1c +Do not favor simpler UASTC modes in RDO mode\&. + +.PP +.IP "\fB--uastc_rdo_m +.IP "" 1c +Disable RDO multithreading (slightly higher compression, deterministic)\&. + +.PP + +.PP +.IP "\fB--input_swizzle +.IP "" 1c +Swizzle the input components according to \fIswizzle\fP which is an alhpanumeric sequence matching the regular expression \fR^\fP[rgba01]{4}$\&. + +.PP +.IP "\fB--normal_mode +.IP "" 1c +Only valid for linear textures with two or more components\&. If the input texture has three or four linear components it is assumed to be a three component linear normal map storing unit length normals as (R=X, G=Y, B=Z)\&. A fourth component will be ignored\&. The map will be converted to a two component X+Y normal map stored as (RGB=X, A=Y) prior to encoding\&. If unsure that your normals are unit length, use \fB--normalize\fP\&. If the input has 2 linear components it is assumed to be an X+Y map of unit normals\&. + +.PP +The Z component can be recovered programmatically in shader code by using the equations: +.PP +.nf + + nml\&.xy = texture(\&.\&.\&.)\&.ga; // Load in [0,1] + nml\&.xy = nml\&.xy * 2\&.0 - 1\&.0; // Unpack to [-1,1] + nml\&.z = sqrt(1 - dot(nml\&.xy, nml\&.xy)); // Compute Z + +.fi +.PP + For ASTC encoding, '\fB--encode\fP astc', encoder parameters are tuned for better quality on normal maps\&. For ETC1S encoding, \fB'--encode\fP etc1s', RDO is disabled (no selector RDO, no endpoint RDO) to provide better quality\&. + +.PP +In \fItoktx\fP you can prevent conversion of the normal map to two components by specifying '\fB--input_swizzle\fP rgb1'\&. + +.PP +.IP "\fB--normalize +.IP "" 1c +Normalize input normals to have a unit length\&. Only valid for linear textures with 2 or more components\&. For 2-component inputs 2D unit normals are calculated\&. Do not use these 2D unit normals to generate X+Y normals for --normal_mode\&. For 4-component inputs a 3D unit normal is calculated\&. 1\&.0 is used for the value of the 4th component\&. + +.PP +.IP "\fB--no_sse +.IP "" 1c +Forbid use of the SSE instruction set\&. Ignored if CPU does not support SSE\&. Only the Basis Universal compressor uses SSE\&. + +.PP +.IP "\fB--bcmp +.IP "" 1c +Deprecated\&. Use '\fB--encode\fP etc1s' instead\&. + +.PP +.IP "\fB--uastc [] +.IP "" 1c +Deprecated\&. Use '\fB--encode\fP uastc' instead\&. + +.PP +.IP "\fB--zcmp [] +.IP "" 1c +Supercompress the data with Zstandard\&. Implies \fB--t2\fP\&. Can be used with data in any format except ETC1S / BasisLZ\&. Most effective with RDO-conditioned UASTC or uncompressed formats\&. The optional compressionLevel range is 1 - 22 and the default is 3\&. Lower values=faster but give less compression\&. Values above 20 should be used with caution as they require more memory\&. + +.PP +.IP "\fB--threads +.IP "" 1c +Explicitly set the number of threads to use during compression\&. By default, ETC1S / BasisLZ and ASTC compression will use the number of threads reported by thread::hardware_concurrency or 1 if value returned is 0\&. + +.PP +.IP "\fB--verbose +.IP "" 1c +Print encoder/compressor activity status to stdout\&. Currently only the astc, etc1s and uastc encoders emit status\&. + +.PP + +.PP +.IP "\fB-h, --help +.IP "" 1c +Print this usage message and exit\&. + +.PP +.IP "\fB-v, --version +.IP "" 1c +Print the version number of this program and exit\&. + +.PP + +.PP +.PP +.nf + In case of ambiguity, such as when the last option is one with an optional + parameter, separate options from file names with " -- "\&. + + Any specified ASTC, ETC1S / BasisLZ, UASTC and supercompression options are + recorded in the metadata item @c KTXwriterScParams in the output file\&. + +Options can also be set in the environment variable TOKTX_OPTIONS\&. +TOKTX_OPTIONS is parsed first\&. If conflicting options appear in +TOKTX_OPTIONS or the command line, the last one seen wins\&. However if both +@b --automipmap and @b --mipmap are seen, it is always flagged as an error\&. +You can, for example, set TOKTX_OPTIONS=--lower_left_maps_to_s0t0 to change +the default mapping of the logical image origin to match the GL convention\&. +.fi +.PP + +.SH "EXIT STATUS" +.PP +\fBtoktx\fP exits 0 on success, 1 on command line errors and 2 on functional errors\&. +.SH "HISTORY" +.PP +\fBVersion 4\&.0 (using new version numbering system)\fP +.RS 4 + +.IP "\(bu" 2 +Add KTX version 2 support including Basis Universal encoding\&. +.IP "\(bu" 2 +Add \&.png and \&.jpg readers\&. +.IP "\(bu" 2 +Transform NetPBM input files to sRGB OETF\&. +.IP "\(bu" 2 +Add mipmap generation\&. +.IP "\(bu" 2 +Remove legacy items\&. +.PP +.RE +.PP +\fBVersion 1\&.3\fP +.RS 4 + +.IP "\(bu" 2 +Switch to ktxTexture API\&. +.IP "\(bu" 2 +Add --levels option\&. +.IP "\(bu" 2 +Add --2d option\&. +.PP +.RE +.PP +\fBVersion 1\&.2\fP +.RS 4 + +.IP "\(bu" 2 +Remove --sized; always create sized format\&. +.IP "\(bu" 2 +Write metadata by default\&. +.IP "\(bu" 2 +Bug fixes\&. +.PP +.RE +.PP +\fBVersion 1\&.1\fP +.RS 4 + +.IP "\(bu" 2 +Moved --alpha and --luminance to legacy\&. +.PP +.RE +.PP +.SH "AUTHOR" +.PP +Mark Callow, github\&.com/MarkCallow diff --git a/ktx/build/docs/man/man3/KTX_ANIMDATA_KEY.3 b/ktx/build/docs/man/man3/KTX_ANIMDATA_KEY.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_ANIMDATA_KEY.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_DECOMPRESS_CHECKSUM_ERROR.3 b/ktx/build/docs/man/man3/KTX_DECOMPRESS_CHECKSUM_ERROR.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_DECOMPRESS_CHECKSUM_ERROR.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_DECOMPRESS_LENGTH_ERROR.3 b/ktx/build/docs/man/man3/KTX_DECOMPRESS_LENGTH_ERROR.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_DECOMPRESS_LENGTH_ERROR.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_ERROR_MAX_ENUM.3 b/ktx/build/docs/man/man3/KTX_ERROR_MAX_ENUM.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_ERROR_MAX_ENUM.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_FILE_DATA_ERROR.3 b/ktx/build/docs/man/man3/KTX_FILE_DATA_ERROR.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_FILE_DATA_ERROR.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_FILE_ISPIPE.3 b/ktx/build/docs/man/man3/KTX_FILE_ISPIPE.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_FILE_ISPIPE.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_FILE_OPEN_FAILED.3 b/ktx/build/docs/man/man3/KTX_FILE_OPEN_FAILED.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_FILE_OPEN_FAILED.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_FILE_OVERFLOW.3 b/ktx/build/docs/man/man3/KTX_FILE_OVERFLOW.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_FILE_OVERFLOW.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_FILE_READ_ERROR.3 b/ktx/build/docs/man/man3/KTX_FILE_READ_ERROR.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_FILE_READ_ERROR.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_FILE_SEEK_ERROR.3 b/ktx/build/docs/man/man3/KTX_FILE_SEEK_ERROR.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_FILE_SEEK_ERROR.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_FILE_UNEXPECTED_EOF.3 b/ktx/build/docs/man/man3/KTX_FILE_UNEXPECTED_EOF.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_FILE_UNEXPECTED_EOF.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_FILE_WRITE_ERROR.3 b/ktx/build/docs/man/man3/KTX_FILE_WRITE_ERROR.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_FILE_WRITE_ERROR.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_GL_ERROR.3 b/ktx/build/docs/man/man3/KTX_GL_ERROR.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_GL_ERROR.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_GL_UNPACK_ALIGNMENT.3 b/ktx/build/docs/man/man3/KTX_GL_UNPACK_ALIGNMENT.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_GL_UNPACK_ALIGNMENT.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_INVALID_OPERATION.3 b/ktx/build/docs/man/man3/KTX_INVALID_OPERATION.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_INVALID_OPERATION.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_INVALID_VALUE.3 b/ktx/build/docs/man/man3/KTX_INVALID_VALUE.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_INVALID_VALUE.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_LIBRARY_NOT_LINKED.3 b/ktx/build/docs/man/man3/KTX_LIBRARY_NOT_LINKED.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_LIBRARY_NOT_LINKED.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_MEM_DEFAULT_ALLOCATED_SIZE.3 b/ktx/build/docs/man/man3/KTX_MEM_DEFAULT_ALLOCATED_SIZE.3 new file mode 100644 index 0000000..06b1d3b --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_MEM_DEFAULT_ALLOCATED_SIZE.3 @@ -0,0 +1 @@ +.so man3/memstream.c.3 diff --git a/ktx/build/docs/man/man3/KTX_NOT_FOUND.3 b/ktx/build/docs/man/man3/KTX_NOT_FOUND.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_NOT_FOUND.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_ORIENTATION1_FMT.3 b/ktx/build/docs/man/man3/KTX_ORIENTATION1_FMT.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_ORIENTATION1_FMT.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_ORIENTATION2_FMT.3 b/ktx/build/docs/man/man3/KTX_ORIENTATION2_FMT.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_ORIENTATION2_FMT.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_ORIENTATION3_FMT.3 b/ktx/build/docs/man/man3/KTX_ORIENTATION3_FMT.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_ORIENTATION3_FMT.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_ORIENTATION_KEY.3 b/ktx/build/docs/man/man3/KTX_ORIENTATION_KEY.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_ORIENTATION_KEY.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_OUT_OF_MEMORY.3 b/ktx/build/docs/man/man3/KTX_OUT_OF_MEMORY.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_OUT_OF_MEMORY.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_ASTC_BLOCK_DIMENSION_MAX.3 b/ktx/build/docs/man/man3/KTX_PACK_ASTC_BLOCK_DIMENSION_MAX.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_ASTC_BLOCK_DIMENSION_MAX.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_ASTC_ENCODER_MODE_DEFAULT.3 b/ktx/build/docs/man/man3/KTX_PACK_ASTC_ENCODER_MODE_DEFAULT.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_ASTC_ENCODER_MODE_DEFAULT.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_ASTC_ENCODER_MODE_HDR.3 b/ktx/build/docs/man/man3/KTX_PACK_ASTC_ENCODER_MODE_HDR.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_ASTC_ENCODER_MODE_HDR.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_ASTC_ENCODER_MODE_LDR.3 b/ktx/build/docs/man/man3/KTX_PACK_ASTC_ENCODER_MODE_LDR.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_ASTC_ENCODER_MODE_LDR.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_ASTC_ENCODER_MODE_MAX.3 b/ktx/build/docs/man/man3/KTX_PACK_ASTC_ENCODER_MODE_MAX.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_ASTC_ENCODER_MODE_MAX.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE.3 b/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_FAST.3 b/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_FAST.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_FAST.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST.3 b/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_MAX.3 b/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_MAX.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_MAX.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM.3 b/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH.3 b/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_UASTC_ETC1_FASTER_HINTS.3 b/ktx/build/docs/man/man3/KTX_PACK_UASTC_ETC1_FASTER_HINTS.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_UASTC_ETC1_FASTER_HINTS.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_UASTC_ETC1_FASTEST_HINTS.3 b/ktx/build/docs/man/man3/KTX_PACK_UASTC_ETC1_FASTEST_HINTS.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_UASTC_ETC1_FASTEST_HINTS.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_UASTC_FAVOR_BC7_ERROR.3 b/ktx/build/docs/man/man3/KTX_PACK_UASTC_FAVOR_BC7_ERROR.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_UASTC_FAVOR_BC7_ERROR.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_UASTC_FAVOR_UASTC_ERROR.3 b/ktx/build/docs/man/man3/KTX_PACK_UASTC_FAVOR_UASTC_ERROR.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_UASTC_FAVOR_UASTC_ERROR.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_DEFAULT.3 b/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_DEFAULT.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_DEFAULT.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_FASTER.3 b/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_FASTER.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_FASTER.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_FASTEST.3 b/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_FASTEST.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_FASTEST.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_MASK.3 b/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_MASK.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_MASK.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_SLOWER.3 b/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_SLOWER.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_SLOWER.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_VERYSLOW.3 b/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_VERYSLOW.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_UASTC_LEVEL_VERYSLOW.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_UASTC_MAX_LEVEL.3 b/ktx/build/docs/man/man3/KTX_PACK_UASTC_MAX_LEVEL.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_UASTC_MAX_LEVEL.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL.3 b/ktx/build/docs/man/man3/KTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_SS_BASIS_LZ.3 b/ktx/build/docs/man/man3/KTX_SS_BASIS_LZ.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_SS_BASIS_LZ.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_SS_NONE.3 b/ktx/build/docs/man/man3/KTX_SS_NONE.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_SS_NONE.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_SS_ZLIB.3 b/ktx/build/docs/man/man3/KTX_SS_ZLIB.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_SS_ZLIB.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_SS_ZSTD.3 b/ktx/build/docs/man/man3/KTX_SS_ZSTD.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_SS_ZSTD.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_SUCCESS.3 b/ktx/build/docs/man/man3/KTX_SUCCESS.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_SUCCESS.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_SWIZZLE_KEY.3 b/ktx/build/docs/man/man3/KTX_SWIZZLE_KEY.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_SWIZZLE_KEY.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TF_BC1.3 b/ktx/build/docs/man/man3/KTX_TF_BC1.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TF_BC1.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TF_BC3.3 b/ktx/build/docs/man/man3/KTX_TF_BC3.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TF_BC3.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TF_BC4.3 b/ktx/build/docs/man/man3/KTX_TF_BC4.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TF_BC4.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TF_BC5.3 b/ktx/build/docs/man/man3/KTX_TF_BC5.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TF_BC5.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TF_BC7_M6_OPAQUE_ONLY.3 b/ktx/build/docs/man/man3/KTX_TF_BC7_M6_OPAQUE_ONLY.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TF_BC7_M6_OPAQUE_ONLY.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TF_ETC1.3 b/ktx/build/docs/man/man3/KTX_TF_ETC1.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TF_ETC1.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TF_ETC2.3 b/ktx/build/docs/man/man3/KTX_TF_ETC2.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TF_ETC2.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TF_HIGH_QUALITY.3 b/ktx/build/docs/man/man3/KTX_TF_HIGH_QUALITY.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TF_HIGH_QUALITY.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TF_PVRTC1_4_OPAQUE_ONLY.3 b/ktx/build/docs/man/man3/KTX_TF_PVRTC1_4_OPAQUE_ONLY.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TF_PVRTC1_4_OPAQUE_ONLY.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TF_PVRTC_DECODE_TO_NEXT_POW2.3 b/ktx/build/docs/man/man3/KTX_TF_PVRTC_DECODE_TO_NEXT_POW2.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TF_PVRTC_DECODE_TO_NEXT_POW2.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS.3 b/ktx/build/docs/man/man3/KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TRANSCODE_FAILED.3 b/ktx/build/docs/man/man3/KTX_TRANSCODE_FAILED.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TRANSCODE_FAILED.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_ASTC_4x4_RGBA.3 b/ktx/build/docs/man/man3/KTX_TTF_ASTC_4x4_RGBA.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_ASTC_4x4_RGBA.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_BC1_OR_3.3 b/ktx/build/docs/man/man3/KTX_TTF_BC1_OR_3.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_BC1_OR_3.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_BC1_RGB.3 b/ktx/build/docs/man/man3/KTX_TTF_BC1_RGB.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_BC1_RGB.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_BC3_RGBA.3 b/ktx/build/docs/man/man3/KTX_TTF_BC3_RGBA.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_BC3_RGBA.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_BC4_R.3 b/ktx/build/docs/man/man3/KTX_TTF_BC4_R.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_BC4_R.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_BC5_RG.3 b/ktx/build/docs/man/man3/KTX_TTF_BC5_RG.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_BC5_RG.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_BC7_M5_RGBA.3 b/ktx/build/docs/man/man3/KTX_TTF_BC7_M5_RGBA.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_BC7_M5_RGBA.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_BC7_M6_RGB.3 b/ktx/build/docs/man/man3/KTX_TTF_BC7_M6_RGB.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_BC7_M6_RGB.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_BC7_RGBA.3 b/ktx/build/docs/man/man3/KTX_TTF_BC7_RGBA.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_BC7_RGBA.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_BGR565.3 b/ktx/build/docs/man/man3/KTX_TTF_BGR565.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_BGR565.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_ETC.3 b/ktx/build/docs/man/man3/KTX_TTF_ETC.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_ETC.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_ETC1_RGB.3 b/ktx/build/docs/man/man3/KTX_TTF_ETC1_RGB.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_ETC1_RGB.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_ETC2_EAC_R11.3 b/ktx/build/docs/man/man3/KTX_TTF_ETC2_EAC_R11.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_ETC2_EAC_R11.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_ETC2_EAC_RG11.3 b/ktx/build/docs/man/man3/KTX_TTF_ETC2_EAC_RG11.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_ETC2_EAC_RG11.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_ETC2_RGBA.3 b/ktx/build/docs/man/man3/KTX_TTF_ETC2_RGBA.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_ETC2_RGBA.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_PVRTC1_4_RGB.3 b/ktx/build/docs/man/man3/KTX_TTF_PVRTC1_4_RGB.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_PVRTC1_4_RGB.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_PVRTC1_4_RGBA.3 b/ktx/build/docs/man/man3/KTX_TTF_PVRTC1_4_RGBA.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_PVRTC1_4_RGBA.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_PVRTC2_4_RGB.3 b/ktx/build/docs/man/man3/KTX_TTF_PVRTC2_4_RGB.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_PVRTC2_4_RGB.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_PVRTC2_4_RGBA.3 b/ktx/build/docs/man/man3/KTX_TTF_PVRTC2_4_RGBA.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_PVRTC2_4_RGBA.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_RGB565.3 b/ktx/build/docs/man/man3/KTX_TTF_RGB565.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_RGB565.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_RGBA32.3 b/ktx/build/docs/man/man3/KTX_TTF_RGBA32.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_RGBA32.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_TTF_RGBA4444.3 b/ktx/build/docs/man/man3/KTX_TTF_RGBA4444.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_TTF_RGBA4444.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_UNKNOWN_FILE_FORMAT.3 b/ktx/build/docs/man/man3/KTX_UNKNOWN_FILE_FORMAT.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_UNKNOWN_FILE_FORMAT.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_UNSUPPORTED_FEATURE.3 b/ktx/build/docs/man/man3/KTX_UNSUPPORTED_FEATURE.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_UNSUPPORTED_FEATURE.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_UNSUPPORTED_TEXTURE_TYPE.3 b/ktx/build/docs/man/man3/KTX_UNSUPPORTED_TEXTURE_TYPE.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_UNSUPPORTED_TEXTURE_TYPE.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_WRITER_KEY.3 b/ktx/build/docs/man/man3/KTX_WRITER_KEY.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_WRITER_KEY.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_WRITER_SCPARAMS_KEY.3 b/ktx/build/docs/man/man3/KTX_WRITER_SCPARAMS_KEY.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_WRITER_SCPARAMS_KEY.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/KTX_error_code.3 b/ktx/build/docs/man/man3/KTX_error_code.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/KTX_error_code.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/PFNGLGETPROCADDRESS.3 b/ktx/build/docs/man/man3/PFNGLGETPROCADDRESS.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/PFNGLGETPROCADDRESS.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/PFNKTXITERCB.3 b/ktx/build/docs/man/man3/PFNKTXITERCB.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/PFNKTXITERCB.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/PFNVOIDFUNCTION.3 b/ktx/build/docs/man/man3/PFNVOIDFUNCTION.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/PFNVOIDFUNCTION.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/_private.3 b/ktx/build/docs/man/man3/_private.3 new file mode 100644 index 0000000..144b254 --- /dev/null +++ b/ktx/build/docs/man/man3/_private.3 @@ -0,0 +1 @@ +.so man3/ktxTexture1.3 diff --git a/ktx/build/docs/man/man3/_protected.3 b/ktx/build/docs/man/man3/_protected.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/_protected.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/address.3 b/ktx/build/docs/man/man3/address.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/address.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/allocMemFuncPtr.3 b/ktx/build/docs/man/man3/allocMemFuncPtr.3 new file mode 100644 index 0000000..c4bd4c2 --- /dev/null +++ b/ktx/build/docs/man/man3/allocMemFuncPtr.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture_subAllocatorCallbacks.3 diff --git a/ktx/build/docs/man/man3/allocationId.3 b/ktx/build/docs/man/man3/allocationId.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/allocationId.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/allocatorAddress.3 b/ktx/build/docs/man/man3/allocatorAddress.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/allocatorAddress.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/authors.3 b/ktx/build/docs/man/man3/authors.3 new file mode 100644 index 0000000..6946102 --- /dev/null +++ b/ktx/build/docs/man/man3/authors.3 @@ -0,0 +1,33 @@ +.TH "authors" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "Khronos Texture Software" \" -*- nroff -*- +.ad l +.nh +.SH NAME +authors \- Authors +.PP +libKTX is the work of Mark Callow based on work by Georg Kolling and Jacob Ström with contributions borrowed from Troy Hanson, Johannes van Waveren, Lode Vandevenne and Rich Geldreich\&. ASTC encoding was added by Wasim Abbas of ARM\&. zlib supercompression, HDR, 422 and depth/stencil format support were added by Mátyás Császár and Daniel Rákos of RasterGrid who also greatly improved the robustness of the library\&. + +.PP +The libKTX tests are also the work of Mark Callow with some contributions borrowed from Sascha Willems' Vulkan examples and use Sam Lantinga's libSDL for portability\&. + +.PP +\fRktx\fP and all its commands and the CTS for it were developed by Mátyás Császár and Daniel Rákos of RasterGrid under contract from The Khronos Group, Inc\&. + +.PP +The CLI for \fRktx\fP and its commands was designed by Alexey Knyazev\&. + +.PP +\fRktx2check\fP, \fRktx2ktx2\fP, \fRktxinfo\fP, \fRktxsc\fP and \fRtoktx\fP are the work of Mark Callow\&. + +.PP +The KTX application and file icons were designed by Dominic Agoro-Ombaka\&. + +.PP +.PP + +.PP +\fBThis page last modified $Date$\fP +.RS 4 + +.RE +.PP + diff --git a/ktx/build/docs/man/man3/baseDepth.3 b/ktx/build/docs/man/man3/baseDepth.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/baseDepth.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/baseHeight.3 b/ktx/build/docs/man/man3/baseHeight.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/baseHeight.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/baseWidth.3 b/ktx/build/docs/man/man3/baseWidth.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/baseWidth.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/bindBufferFuncPtr.3 b/ktx/build/docs/man/man3/bindBufferFuncPtr.3 new file mode 100644 index 0000000..c4bd4c2 --- /dev/null +++ b/ktx/build/docs/man/man3/bindBufferFuncPtr.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture_subAllocatorCallbacks.3 diff --git a/ktx/build/docs/man/man3/bindImageFuncPtr.3 b/ktx/build/docs/man/man3/bindImageFuncPtr.3 new file mode 100644 index 0000000..c4bd4c2 --- /dev/null +++ b/ktx/build/docs/man/man3/bindImageFuncPtr.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture_subAllocatorCallbacks.3 diff --git a/ktx/build/docs/man/man3/blockDimension.3 b/ktx/build/docs/man/man3/blockDimension.3 new file mode 100644 index 0000000..562d74c --- /dev/null +++ b/ktx/build/docs/man/man3/blockDimension.3 @@ -0,0 +1 @@ +.so man3/ktxAstcParams.3 diff --git a/ktx/build/docs/man/man3/classId.3 b/ktx/build/docs/man/man3/classId.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/classId.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/closeOnDestruct.3 b/ktx/build/docs/man/man3/closeOnDestruct.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/closeOnDestruct.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/cmdBuffer.3 b/ktx/build/docs/man/man3/cmdBuffer.3 new file mode 100644 index 0000000..caa90a4 --- /dev/null +++ b/ktx/build/docs/man/man3/cmdBuffer.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanDeviceInfo.3 diff --git a/ktx/build/docs/man/man3/cmdPool.3 b/ktx/build/docs/man/man3/cmdPool.3 new file mode 100644 index 0000000..caa90a4 --- /dev/null +++ b/ktx/build/docs/man/man3/cmdPool.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanDeviceInfo.3 diff --git a/ktx/build/docs/man/man3/compressionLevel.3 b/ktx/build/docs/man/man3/compressionLevel.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/compressionLevel.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/custom_ptr.3 b/ktx/build/docs/man/man3/custom_ptr.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/custom_ptr.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/data.3 b/ktx/build/docs/man/man3/data.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/data.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/dataSize.3 b/ktx/build/docs/man/man3/dataSize.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/dataSize.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/deprecated.3 b/ktx/build/docs/man/man3/deprecated.3 new file mode 100644 index 0000000..44ddac9 --- /dev/null +++ b/ktx/build/docs/man/man3/deprecated.3 @@ -0,0 +1,85 @@ +.TH "deprecated" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +deprecated \- Deprecated List +.PP + + +.PP +.IP "\fBGlobal \fBKTX_error_code\fP +.IP "" 1c +Use \fBktx_error_code_e\fP\&. + +.PP +.IP "\fBGlobal \fBKTX_TF_BC1\fP +.IP "" 1c +Use \fBKTX_TTF_BC1_RGB\fP\&. + +.PP +.IP "\fBGlobal \fBKTX_TF_BC3\fP +.IP "" 1c +Use \fBKTX_TTF_BC3_RGBA\fP\&. + +.PP +.IP "\fBGlobal \fBKTX_TF_BC4\fP +.IP "" 1c +Use \fBKTX_TTF_BC4_R\fP\&. + +.PP +.IP "\fBGlobal \fBKTX_TF_BC5\fP +.IP "" 1c +Use \fBKTX_TTF_BC5_RG\fP\&. + +.PP +.IP "\fBGlobal \fBKTX_TF_BC7_M6_OPAQUE_ONLY\fP +.IP "" 1c +Use \fBKTX_TTF_BC7_RGBA\fP + +.PP +.IP "\fBGlobal \fBKTX_TF_ETC1\fP +.IP "" 1c +Use \fBKTX_TTF_ETC1_RGB\fP\&. + +.PP +.IP "\fBGlobal \fBKTX_TF_ETC2\fP +.IP "" 1c +Use \fBKTX_TTF_ETC\fP\&. + +.PP +.IP "\fBGlobal \fBKTX_TF_PVRTC1_4_OPAQUE_ONLY\fP +.IP "" 1c +Use \fBKTX_TTF_PVRTC1_4_RGB\fP\&. + +.PP +.IP "\fBGlobal \fBKTX_TTF_BC7_M5_RGBA\fP +.IP "" 1c +Use \fBKTX_TTF_BC7_RGBA\fP\&. + +.PP +.IP "\fBGlobal \fBKTX_TTF_BC7_M6_RGB\fP +.IP "" 1c +Use \fBKTX_TTF_BC7_RGBA\fP\&. + +.PP +.IP "\fBGlobal \fBktxBasisParams::separateRGToRGB_A\fP +.IP "" 1c +This was and is a no-op\&. 2-component inputs have always been automatically separated using an "rrrg" inputSwizzle\&. + +.PP +.IP "\fBGlobal \fBktxTexture2::ktxTexture2_GetOETF\fP (\fBktxTexture2\fP *This) +.IP "" 1c +Use ktxTexture2_GetTransferFunction_e\&. + +.PP +.IP "\fBGlobal \fBktxTexture2::ktxTexture2_GetOETF_e\fP (\fBktxTexture2\fP *This) +.IP "" 1c +Use ktxTexture2_GetTransferFunction_e\&. Now that the KTX specification allows setting of non-linear transfer functions other than sRGB, it is possible for the transfer function to be an EOTF so this name is no longer appropriate\&. + +.PP +.IP "\fBGlobal \fBktxTexture2::ktxTexture2_SetOETF\fP (\fBktxTexture2\fP *This, khr_df_transfer_e tf) +.IP "" 1c +Use ktxTexture2_SetTransferFunction\&. + +.PP + diff --git a/ktx/build/docs/man/man3/depth.3 b/ktx/build/docs/man/man3/depth.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/depth.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/destruct.3 b/ktx/build/docs/man/man3/destruct.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/destruct.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/device.3 b/ktx/build/docs/man/man3/device.3 new file mode 100644 index 0000000..caa90a4 --- /dev/null +++ b/ktx/build/docs/man/man3/device.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanDeviceInfo.3 diff --git a/ktx/build/docs/man/man3/deviceMemory.3 b/ktx/build/docs/man/man3/deviceMemory.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/deviceMemory.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/deviceMemoryProperties.3 b/ktx/build/docs/man/man3/deviceMemoryProperties.3 new file mode 100644 index 0000000..caa90a4 --- /dev/null +++ b/ktx/build/docs/man/man3/deviceMemoryProperties.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanDeviceInfo.3 diff --git a/ktx/build/docs/man/man3/endpointRDOThreshold.3 b/ktx/build/docs/man/man3/endpointRDOThreshold.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/endpointRDOThreshold.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/file.3 b/ktx/build/docs/man/man3/file.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/file.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/filestream.c.3 b/ktx/build/docs/man/man3/filestream.c.3 new file mode 100644 index 0000000..f18f19d --- /dev/null +++ b/ktx/build/docs/man/man3/filestream.c.3 @@ -0,0 +1,104 @@ +.TH "lib/filestream.c" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +lib/filestream.c \- Implementation of \fBktxStream\fP for FILE\&. + +.SH SYNOPSIS +.br +.PP +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include 'ktx\&.h'\fP +.br +\fR#include 'ktxint\&.h'\fP +.br +\fR#include 'filestream\&.h'\fP +.br + +.SS "Functions" + +.in +1c +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxFileStream_construct\fP (\fBktxStream\fP *str, FILE *file, ktx_bool_t closeFileOnDestruct)" +.br +.RI "Initialize a ktxFileStream\&. " +.ti -1c +.RI "void \fBktxFileStream_destruct\fP (\fBktxStream\fP *str)" +.br +.RI "Destruct the stream, potentially closing the underlying FILE\&. " +.in -1c +.SH "Detailed Description" +.PP +Implementation of \fBktxStream\fP for FILE\&. + + +.PP +\fBAuthor\fP +.RS 4 +Maksim Kolesin, Under Development + +.PP +Georg Kolling, Imagination Technology + +.PP +Mark Callow, HI Corporation +.RE +.PP + +.SH "Function Documentation" +.PP +.SS "\fBKTX_error_code\fP ktxFileStream_construct (\fBktxStream\fP * str, FILE * file, ktx_bool_t closeFileOnDestruct)" + +.PP +Initialize a ktxFileStream\&. +.PP +\fBParameters\fP +.RS 4 +\fIstr\fP pointer to the \fBktxStream\fP to initialize\&. +.br +\fIfile\fP pointer to the underlying FILE object\&. +.br +\fIcloseFileOnDestruct\fP if not false, stdio file pointer will be closed when \fBktxStream\fP is destructed\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, KTX_INVALID_VALUE on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRstream\fP is \fRNULL\fP or \fRfile\fP is \fRNULL\fP\&. +.RE +.PP + +.SS "void ktxFileStream_destruct (\fBktxStream\fP * str)" + +.PP +Destruct the stream, potentially closing the underlying FILE\&. This only closes the underyling FILE if the \fRcloseOnDestruct\fP parameter to \fBktxFileStream_construct()\fP was not \fRKTX_FALSE\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIstr\fP pointer to the \fBktxStream\fP whose FILE is to potentially be closed\&. +.RE +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/freeMemFuncPtr.3 b/ktx/build/docs/man/man3/freeMemFuncPtr.3 new file mode 100644 index 0000000..c4bd4c2 --- /dev/null +++ b/ktx/build/docs/man/man3/freeMemFuncPtr.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture_subAllocatorCallbacks.3 diff --git a/ktx/build/docs/man/man3/generateMipmaps.3 b/ktx/build/docs/man/man3/generateMipmaps.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/generateMipmaps.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/getpos.3 b/ktx/build/docs/man/man3/getpos.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/getpos.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/getsize.3 b/ktx/build/docs/man/man3/getsize.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/getsize.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/glBaseInternalformat.3 b/ktx/build/docs/man/man3/glBaseInternalformat.3 new file mode 100644 index 0000000..144b254 --- /dev/null +++ b/ktx/build/docs/man/man3/glBaseInternalformat.3 @@ -0,0 +1 @@ +.so man3/ktxTexture1.3 diff --git a/ktx/build/docs/man/man3/glFormat.3 b/ktx/build/docs/man/man3/glFormat.3 new file mode 100644 index 0000000..144b254 --- /dev/null +++ b/ktx/build/docs/man/man3/glFormat.3 @@ -0,0 +1 @@ +.so man3/ktxTexture1.3 diff --git a/ktx/build/docs/man/man3/glInternalformat.3 b/ktx/build/docs/man/man3/glInternalformat.3 new file mode 100644 index 0000000..144b254 --- /dev/null +++ b/ktx/build/docs/man/man3/glInternalformat.3 @@ -0,0 +1 @@ +.so man3/ktxTexture1.3 diff --git a/ktx/build/docs/man/man3/glType.3 b/ktx/build/docs/man/man3/glType.3 new file mode 100644 index 0000000..144b254 --- /dev/null +++ b/ktx/build/docs/man/man3/glType.3 @@ -0,0 +1 @@ +.so man3/ktxTexture1.3 diff --git a/ktx/build/docs/man/man3/height.3 b/ktx/build/docs/man/man3/height.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/height.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/image.3 b/ktx/build/docs/man/man3/image.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/image.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/imageFormat.3 b/ktx/build/docs/man/man3/imageFormat.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/imageFormat.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/imageLayout.3 b/ktx/build/docs/man/man3/imageLayout.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/imageLayout.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/inputSwizzle.3 b/ktx/build/docs/man/man3/inputSwizzle.3 new file mode 100644 index 0000000..562d74c --- /dev/null +++ b/ktx/build/docs/man/man3/inputSwizzle.3 @@ -0,0 +1 @@ +.so man3/ktxAstcParams.3 diff --git a/ktx/build/docs/man/man3/instance.3 b/ktx/build/docs/man/man3/instance.3 new file mode 100644 index 0000000..caa90a4 --- /dev/null +++ b/ktx/build/docs/man/man3/instance.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanDeviceInfo.3 diff --git a/ktx/build/docs/man/man3/isArray.3 b/ktx/build/docs/man/man3/isArray.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/isArray.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/isCompressed.3 b/ktx/build/docs/man/man3/isCompressed.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/isCompressed.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/isCubemap.3 b/ktx/build/docs/man/man3/isCubemap.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/isCubemap.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/ktx.h.3 b/ktx/build/docs/man/man3/ktx.h.3 new file mode 100644 index 0000000..604d755 --- /dev/null +++ b/ktx/build/docs/man/man3/ktx.h.3 @@ -0,0 +1,1412 @@ +.TH "include/ktx.h" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +include/ktx.h \- Declares the public functions and structures of the KTX API\&. + +.SH SYNOPSIS +.br +.PP +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include \fP +.br + +.SS "Data Structures" + +.in +1c +.ti -1c +.RI "struct \fBktxOrientation\fP" +.br +.RI "Struct describing the logical orientation of an image\&. " +.ti -1c +.RI "class \fBktxTexture\fP" +.br +.RI "Base class representing a texture\&. " +.ti -1c +.RI "struct \fBktxTexture_vtbl\fP" +.br +.RI "Table of virtual \fBktxTexture\fP methods\&. " +.ti -1c +.RI "class \fBktxTexture1\fP" +.br +.RI "Class representing a KTX version 1 format texture\&. " +.ti -1c +.RI "class \fBktxTexture2\fP" +.br +.RI "Class representing a KTX version 2 format texture\&. " +.ti -1c +.RI "struct \fBktxTextureCreateInfo\fP" +.br +.RI "Structure for passing texture information to ktxTexture1_Create() and ktxTexture2_Create()\&. " +.ti -1c +.RI "struct \fBktxStream\fP" +.br +.RI "Interface of \fBktxStream\fP\&. " +.ti -1c +.RI "struct \fBktxAstcParams\fP" +.br +.RI "Structure for passing extended parameters to ktxTexture_CompressAstc\&. " +.ti -1c +.RI "struct \fBktxBasisParams\fP" +.br +.RI "Structure for passing extended parameters to ktxTexture2_CompressBasisEx()\&. " +.in -1c +.SS "Macros" + +.in +1c +.ti -1c +.RI "#define \fBKTX_ANIMDATA_KEY\fP 'KTXanimData'" +.br +.RI "Key string for standard writer metadata\&. " +.ti -1c +.RI "#define \fBKTX_ORIENTATION_KEY\fP 'KTXorientation'" +.br +.RI "Key string for standard orientation metadata\&. " +.ti -1c +.RI "#define \fBKTX_SWIZZLE_KEY\fP 'KTXswizzle'" +.br +.RI "Key string for standard swizzle metadata\&. " +.ti -1c +.RI "#define \fBKTX_WRITER_KEY\fP 'KTXwriter'" +.br +.RI "Key string for standard writer metadata\&. " +.ti -1c +.RI "#define \fBKTX_WRITER_SCPARAMS_KEY\fP 'KTXwriterScParams'" +.br +.RI "Key string for standard writer supercompression parameter metadata\&. " +.ti -1c +.RI "#define \fBKTX_ORIENTATION1_FMT\fP 'S=%c'" +.br +.RI "Standard KTX 1 format for 1D orientation value\&. " +.ti -1c +.RI "#define \fBKTX_ORIENTATION2_FMT\fP 'S=%c,T=%c'" +.br +.RI "Standard KTX 1 format for 2D orientation value\&. " +.ti -1c +.RI "#define \fBKTX_ORIENTATION3_FMT\fP 'S=%c,T=%c,R=%c'" +.br +.RI "Standard KTX 1 format for 3D orientation value\&. " +.ti -1c +.RI "#define \fBKTX_GL_UNPACK_ALIGNMENT\fP 4" +.br +.RI "Required unpack alignment\&. " +.ti -1c +.RI "#define \fBKTX_error_code\fP \fBktx_error_code_e\fP" +.br +.RI "For backward compatibility\&. " +.ti -1c +.RI "#define \fBktxTexture_Destroy\fP(This)" +.br +.RI "Helper for calling the Destroy virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_GetImageOffset\fP(This, level, layer, faceSlice, pOffset)" +.br +.RI "Helper for calling the GetImageOffset virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_GetDataSizeUncompressed\fP(This)" +.br +.RI "Helper for calling the GetDataSizeUncompressed virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_GetImageSize\fP(This, level)" +.br +.RI "Helper for calling the GetImageSize virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_GetLevelSize\fP(This, level)" +.br +.RI "Helper for calling the GetImageSize virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_IterateLevels\fP(This, iterCb, userdata)" +.br +.RI "Helper for calling the IterateLevels virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_IterateLoadLevelFaces\fP(This, iterCb, userdata)" +.br +.RI "Helper for calling the IterateLoadLevelFaces virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_LoadImageData\fP(This, pBuffer, bufSize)" +.br +.RI "Helper for calling the LoadImageData virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_NeedsTranscoding\fP(This)" +.br +.RI "Helper for calling the NeedsTranscoding virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_SetImageFromMemory\fP(This, level, layer, faceSlice, src, srcSize)" +.br +.RI "Helper for calling the SetImageFromMemory virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_SetImageFromStdioStream\fP(This, level, layer, faceSlice, src, srcSize)" +.br +.RI "Helper for calling the SetImageFromStdioStream virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_WriteToStdioStream\fP(This, dstsstr)" +.br +.RI "Helper for calling the WriteToStdioStream virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_WriteToNamedFile\fP(This, dstname)" +.br +.RI "Helper for calling the WriteToNamedfile virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_WriteToMemory\fP(This, ppDstBytes, pSize)" +.br +.RI "Helper for calling the WriteToMemory virtual method of a \fBktxTexture\fP\&. " +.ti -1c +.RI "#define \fBktxTexture_WriteToStream\fP(This, dststr)" +.br +.RI "Helper for calling the WriteToStream virtual method of a \fBktxTexture\fP\&. " +.in -1c +.SS "Typedefs" + +.in +1c +.ti -1c +.RI "typedef enum \fBktx_error_code_e\fP \fBktx_error_code_e\fP" +.br +.RI "Error codes returned by library functions\&. " +.ti -1c +.RI "typedef enum \fBktx_error_code_e\fP \fBktxResult\fP" +.br +.RI "Result codes returned by library functions\&. " +.ti -1c +.RI "typedef enum \fBktxSupercmpScheme\fP \fBktxSupercmpScheme\fP" +.br +.RI "Enumerators identifying the supercompression scheme\&. " +.ti -1c +.RI "typedef \fBKTX_error_code\fP(* \fBktxStream_read\fP) (\fBktxStream\fP *str, void *dst, const ktx_size_t count)" +.br +.RI "type for a pointer to a stream reading function " +.ti -1c +.RI "typedef \fBKTX_error_code\fP(* \fBktxStream_skip\fP) (\fBktxStream\fP *str, const ktx_size_t count)" +.br +.RI "type for a pointer to a stream skipping function " +.ti -1c +.RI "typedef \fBKTX_error_code\fP(* \fBktxStream_write\fP) (\fBktxStream\fP *str, const void *src, const ktx_size_t size, const ktx_size_t count)" +.br +.RI "type for a pointer to a stream writing function " +.ti -1c +.RI "typedef \fBKTX_error_code\fP(* \fBktxStream_getpos\fP) (\fBktxStream\fP *str, ktx_off_t *const offset)" +.br +.RI "type for a pointer to a stream position query function " +.ti -1c +.RI "typedef \fBKTX_error_code\fP(* \fBktxStream_setpos\fP) (\fBktxStream\fP *str, const ktx_off_t offset)" +.br +.RI "type for a pointer to a stream position query function " +.ti -1c +.RI "typedef \fBKTX_error_code\fP(* \fBktxStream_getsize\fP) (\fBktxStream\fP *str, ktx_size_t *const size)" +.br +.RI "type for a pointer to a stream size query function " +.ti -1c +.RI "typedef void(* \fBktxStream_destruct\fP) (\fBktxStream\fP *str)" +.br +.RI "Destruct a stream\&. " +.ti -1c +.RI "typedef void(KTX_APIENTRY * \fBPFNVOIDFUNCTION\fP) (void)" +.br +.RI "typedef of function pointer returned by GLGetProcAddress functions\&. " +.ti -1c +.RI "typedef \fBPFNVOIDFUNCTION\fP(KTX_APIENTRY * \fBPFNGLGETPROCADDRESS\fP) (const char *proc)" +.br +.RI "typedef of pointer to function for retrieving OpenGL function pointers\&. " +.ti -1c +.RI "typedef enum \fBktx_pack_uastc_flag_bits_e\fP \fBktx_pack_uastc_flag_bits_e\fP" +.br +.RI "Flags specifiying UASTC encoding options\&. " +.ti -1c +.RI "typedef enum \fBktx_pack_astc_quality_levels_e\fP \fBktx_pack_astc_quality_levels_e\fP" +.br +.RI "Options specifiying ASTC encoding quality levels\&. " +.ti -1c +.RI "typedef enum \fBktx_pack_astc_block_dimension_e\fP \fBktx_pack_astc_block_dimension_e\fP" +.br +.RI "Options specifiying ASTC encoding block dimensions\&. " +.ti -1c +.RI "typedef enum \fBktx_pack_astc_encoder_mode_e\fP \fBktx_pack_astc_encoder_mode_e\fP" +.br +.RI "Options specifying ASTC encoder mode\&. " +.ti -1c +.RI "typedef struct ktxAstcParams \fBktxAstcParams\fP" +.br +.RI "Structure for passing extended parameters to ktxTexture_CompressAstc\&. " +.ti -1c +.RI "typedef struct ktxBasisParams \fBktxBasisParams\fP" +.br +.RI "Structure for passing extended parameters to ktxTexture2_CompressBasisEx()\&. " +.ti -1c +.RI "typedef enum \fBktx_transcode_fmt_e\fP \fBktx_transcode_fmt_e\fP" +.br +.RI "Enumerators for specifying the transcode target format\&. " +.ti -1c +.RI "typedef enum \fBktx_transcode_flag_bits_e\fP \fBktx_transcode_flag_bits_e\fP" +.br +.RI "Flags guiding transcoding of Basis Universal compressed textures\&. " +.in -1c +.SS "Enumerations" + +.in +1c +.ti -1c +.RI "enum \fBktx_error_code_e\fP { \fBKTX_SUCCESS\fP = 0, \fBKTX_FILE_DATA_ERROR\fP, \fBKTX_FILE_ISPIPE\fP, \fBKTX_FILE_OPEN_FAILED\fP, \fBKTX_FILE_OVERFLOW\fP, \fBKTX_FILE_READ_ERROR\fP, \fBKTX_FILE_SEEK_ERROR\fP, \fBKTX_FILE_UNEXPECTED_EOF\fP, \fBKTX_FILE_WRITE_ERROR\fP, \fBKTX_GL_ERROR\fP, \fBKTX_INVALID_OPERATION\fP, \fBKTX_INVALID_VALUE\fP, \fBKTX_NOT_FOUND\fP, \fBKTX_OUT_OF_MEMORY\fP, \fBKTX_TRANSCODE_FAILED\fP, \fBKTX_UNKNOWN_FILE_FORMAT\fP, \fBKTX_UNSUPPORTED_TEXTURE_TYPE\fP, \fBKTX_UNSUPPORTED_FEATURE\fP, \fBKTX_LIBRARY_NOT_LINKED\fP, \fBKTX_DECOMPRESS_LENGTH_ERROR\fP, \fBKTX_DECOMPRESS_CHECKSUM_ERROR\fP, \fBKTX_ERROR_MAX_ENUM\fP = KTX_DECOMPRESS_CHECKSUM_ERROR }" +.br +.RI "Error codes returned by library functions\&. " +.ti -1c +.RI "enum \fBktxSupercmpScheme\fP { \fBKTX_SS_NONE\fP = 0, \fBKTX_SS_BASIS_LZ\fP = 1, \fBKTX_SS_ZSTD\fP = 2, \fBKTX_SS_ZLIB\fP = 3, \fBKTX_SS_BEGIN_RANGE\fP = KTX_SS_NONE, \fBKTX_SS_END_RANGE\fP = KTX_SS_ZLIB, \fBKTX_SS_BEGIN_VENDOR_RANGE\fP = 0x10000, \fBKTX_SS_END_VENDOR_RANGE\fP = 0x1ffff, \fBKTX_SS_BEGIN_RESERVED\fP = 0x20000 }" +.br +.RI "Enumerators identifying the supercompression scheme\&. " +.ti -1c +.RI "enum \fBktx_pack_uastc_flag_bits_e\fP { \fBKTX_PACK_UASTC_LEVEL_FASTEST\fP = 0, \fBKTX_PACK_UASTC_LEVEL_FASTER\fP = 1, \fBKTX_PACK_UASTC_LEVEL_DEFAULT\fP = 2, \fBKTX_PACK_UASTC_LEVEL_SLOWER\fP = 3, \fBKTX_PACK_UASTC_LEVEL_VERYSLOW\fP = 4, \fBKTX_PACK_UASTC_MAX_LEVEL\fP = KTX_PACK_UASTC_LEVEL_VERYSLOW, \fBKTX_PACK_UASTC_LEVEL_MASK\fP = 0xF, \fBKTX_PACK_UASTC_FAVOR_UASTC_ERROR\fP = 8, \fBKTX_PACK_UASTC_FAVOR_BC7_ERROR\fP = 16, \fBKTX_PACK_UASTC_ETC1_FASTER_HINTS\fP = 64, \fBKTX_PACK_UASTC_ETC1_FASTEST_HINTS\fP = 128, \fBKTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL\fP = 256 }" +.br +.RI "Flags specifiying UASTC encoding options\&. " +.ti -1c +.RI "enum \fBktx_pack_astc_quality_levels_e\fP { \fBKTX_PACK_ASTC_QUALITY_LEVEL_FASTEST\fP = 0, \fBKTX_PACK_ASTC_QUALITY_LEVEL_FAST\fP = 10, \fBKTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM\fP = 60, \fBKTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH\fP = 98, \fBKTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE\fP = 100, \fBKTX_PACK_ASTC_QUALITY_LEVEL_MAX\fP = KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE }" +.br +.RI "Options specifiying ASTC encoding quality levels\&. " +.ti -1c +.RI "enum \fBktx_pack_astc_block_dimension_e\fP { }" +.br +.RI "Options specifiying ASTC encoding block dimensions\&. " +.ti -1c +.RI "enum \fBktx_pack_astc_encoder_mode_e\fP { \fBKTX_PACK_ASTC_ENCODER_MODE_DEFAULT\fP, \fBKTX_PACK_ASTC_ENCODER_MODE_LDR\fP, \fBKTX_PACK_ASTC_ENCODER_MODE_HDR\fP, \fBKTX_PACK_ASTC_ENCODER_MODE_MAX\fP = KTX_PACK_ASTC_ENCODER_MODE_HDR }" +.br +.RI "Options specifying ASTC encoder mode\&. " +.ti -1c +.RI "enum \fBktx_transcode_fmt_e\fP { \fBKTX_TTF_ETC1_RGB\fP = 0, \fBKTX_TTF_ETC2_RGBA\fP = 1, \fBKTX_TTF_BC1_RGB\fP = 2, \fBKTX_TTF_BC3_RGBA\fP = 3, \fBKTX_TTF_BC4_R\fP = 4, \fBKTX_TTF_BC5_RG\fP = 5, \fBKTX_TTF_BC7_RGBA\fP = 6, \fBKTX_TTF_PVRTC1_4_RGB\fP = 8, \fBKTX_TTF_PVRTC1_4_RGBA\fP = 9, \fBKTX_TTF_ASTC_4x4_RGBA\fP = 10, \fBKTX_TTF_PVRTC2_4_RGB\fP = 18, \fBKTX_TTF_PVRTC2_4_RGBA\fP = 19, \fBKTX_TTF_ETC2_EAC_R11\fP = 20, \fBKTX_TTF_ETC2_EAC_RG11\fP = 21, \fBKTX_TTF_RGBA32\fP = 13, \fBKTX_TTF_RGB565\fP = 14, \fBKTX_TTF_BGR565\fP = 15, \fBKTX_TTF_RGBA4444\fP = 16, \fBKTX_TTF_ETC\fP = 22, \fBKTX_TTF_BC1_OR_3\fP = 23, \fBKTX_TTF_NOSELECTION\fP = 0x7fffffff, \fBKTX_TF_ETC1\fP = KTX_TTF_ETC1_RGB, \fBKTX_TF_ETC2\fP = KTX_TTF_ETC, \fBKTX_TF_BC1\fP = KTX_TTF_BC1_RGB, \fBKTX_TF_BC3\fP = KTX_TTF_BC3_RGBA, \fBKTX_TF_BC4\fP = KTX_TTF_BC4_R, \fBKTX_TF_BC5\fP = KTX_TTF_BC5_RG, \fBKTX_TTF_BC7_M6_RGB\fP = KTX_TTF_BC7_RGBA, \fBKTX_TTF_BC7_M5_RGBA\fP = KTX_TTF_BC7_RGBA, \fBKTX_TF_BC7_M6_OPAQUE_ONLY\fP = KTX_TTF_BC7_RGBA, \fBKTX_TF_PVRTC1_4_OPAQUE_ONLY\fP = KTX_TTF_PVRTC1_4_RGB }" +.br +.RI "Enumerators for specifying the transcode target format\&. " +.ti -1c +.RI "enum \fBktx_transcode_flag_bits_e\fP { \fBKTX_TF_PVRTC_DECODE_TO_NEXT_POW2\fP = 2, \fBKTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS\fP = 4, \fBKTX_TF_HIGH_QUALITY\fP = 32 }" +.br +.RI "Flags guiding transcoding of Basis Universal compressed textures\&. " +.in -1c +.SS "Functions" + +.in +1c +.ti -1c +.RI "KTX_API \fBKTX_error_code\fP KTX_APIENTRY \fBktxLoadOpenGL\fP (\fBPFNGLGETPROCADDRESS\fP pfnGLGetProcAddress)" +.br +.RI "Load pointers for the GL functions used by the ktxTexture*_GLUpload functions\&. " +.ti -1c +.RI "KTX_API \fBKTX_error_code\fP KTX_APIENTRY \fBktxTexture2_DecodeAstc\fP (\fBktxTexture2\fP *This)" +.br +.RI "Decodes a ktx2 texture object, if it is ASTC encoded\&. " +.ti -1c +.RI "KTX_API const char *KTX_APIENTRY \fBktxErrorString\fP (\fBKTX_error_code\fP error)" +.br +.RI "Return a string corresponding to a KTX error code\&. " +.ti -1c +.RI "KTX_API const char *KTX_APIENTRY \fBktxSupercompressionSchemeString\fP (\fBktxSupercmpScheme\fP scheme)" +.br +.RI "Return a string corresponding to a supercompressionScheme enumeration\&. " +.ti -1c +.RI "KTX_API const char *KTX_APIENTRY \fBktxTranscodeFormatString\fP (\fBktx_transcode_fmt_e\fP format)" +.br +.RI "Return a string corresponding to a transcode format enumeration\&. " +.in -1c +.SH "Detailed Description" +.PP +Declares the public functions and structures of the KTX API\&. + + +.PP +\fBAuthor\fP +.RS 4 +Mark Callow, Edgewise Consulting and while at HI Corporation + +.PP +Based on original work by Georg Kolling, Imagination Technology +.RE +.PP +\fBAPI Version\fP +.RS 4 +v4\&.0 +.RE +.PP + +.SH "Macro Definition Documentation" +.PP +.SS "#define KTX_error_code \fBktx_error_code_e\fP" + +.PP +For backward compatibility\&. +.PP +\fBDeprecated\fP +.RS 4 +Use \fBktx_error_code_e\fP\&. +.RE +.PP + +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP, and \fBvkload\&.cpp\fP\&. +.SS "#define ktxTexture_Destroy( This)" +\fBValue:\fP +.nf +(This)\->vtbl\->Destroy(This) +.PP +.fi + +.PP +Helper for calling the Destroy virtual method of a \fBktxTexture\fP\&. Destroy a \fBktxTexture2\fP object\&. + +.PP +This frees the memory associated with the texture contents and the memory of the \fBktxTexture2\fP object\&. This does \fInot\fP delete any OpenGL or Vulkan texture objects created by ktxTexture2_GLUpload or ktxTexture2_VkUpload\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object to destroy +.RE +.PP + +.PP +\fBExamples\fP +.in +1c +\fBvkload\&.cpp\fP\&. +.SS "#define ktxTexture_GetDataSizeUncompressed( This)" +\fBValue:\fP +.nf +(This)\->vtbl\->GetDataSizeUncompressed(This) +.PP +.fi + +.PP +Helper for calling the GetDataSizeUncompressed virtual method of a \fBktxTexture\fP\&. For a \fBktxTexture1\fP this will always return the value of This->dataSize\&. + +.PP +If supercompressionScheme == \fRKTX_SS_NONE\fP or \fRKTX_SS_BASIS_LZ\fP, returns the value of \fRThis->dataSize\fP else if supercompressionScheme == \fRKTX_SS_ZSTD\fP or \fRKTX_SS_ZLIB\fP, it returns the sum of the uncompressed sizes of each mip level plus space for the level padding\&. With no supercompression the data size and uncompressed data size are the same\&. For Basis supercompression the uncompressed size cannot be known until the data is transcoded so the compressed size is returned\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture1\fP object of interest\&. +.RE +.PP + +.SS "#define ktxTexture_GetImageOffset( This, level, layer, faceSlice, pOffset)" +\fBValue:\fP +.nf +(This)\->vtbl\->GetImageOffset(This, level, layer, faceSlice, pOffset) +.PP +.fi + +.PP +Helper for calling the GetImageOffset virtual method of a \fBktxTexture\fP\&. Find the offset of an image within a \fBktxTexture\fP's image data\&. + +.PP +As there is no such thing as a 3D cubemap we make the 3rd location parameter do double duty\&. Only works for non-supercompressed textures as there is no way to tell where an image is for a supercompressed one\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.br +\fIlevel\fP mip level of the image\&. +.br +\fIlayer\fP array layer of the image\&. +.br +\fIfaceSlice\fP cube map face or depth slice of the image\&. +.br +\fIpOffset\fP pointer to location to store the offset\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_OPERATION\fP\fP \fRlevel\fP, \fRlayer\fP or \fRfaceSlice\fP exceed the dimensions of the texture\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Texture is supercompressed\&. +.br +\fIKTX_INVALID_VALID\fP \fRThis\fP is NULL\&. +.RE +.PP + +.SS "#define ktxTexture_GetImageSize( This, level)" +\fBValue:\fP +.nf +(This)\->vtbl\->GetImageSize(This, level) +.PP +.fi + +.PP +Helper for calling the GetImageSize virtual method of a \fBktxTexture\fP\&. Calculate & return the size in bytes of an image at the specified mip level\&. + +.PP +For arrays, this is the size of a layer, for cubemaps, the size of a face and for 3D textures, the size of a depth slice\&. + +.PP +The size reflects the padding of each row to KTX_GL_UNPACK_ALIGNMENT\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIlevel\fP level of interest\&. * +.RE +.PP + +.SS "#define ktxTexture_GetLevelSize( This, level)" +\fBValue:\fP +.nf +(This)\->vtbl\->GetLevelSize(This, level) +.PP +.fi + +.PP +Helper for calling the GetImageSize virtual method of a \fBktxTexture\fP\&. Calculate & return the size in bytes of an image at the specified mip level\&. + +.PP +For arrays, this is the size of a layer, for cubemaps, the size of a face and for 3D textures, the size of a depth slice\&. + +.PP +The size reflects the padding of each row to KTX_GL_UNPACK_ALIGNMENT\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIlevel\fP level of interest\&. * +.RE +.PP + +.SS "#define ktxTexture_IterateLevels( This, iterCb, userdata)" +\fBValue:\fP +.nf +(This)\->vtbl\->IterateLevels(This, iterCb, userdata) +.PP +.fi + +.PP +Helper for calling the IterateLevels virtual method of a \fBktxTexture\fP\&. Iterate over the mip levels in a \fBktxTexture2\fP object\&. + +.PP +This is almost identical to ktxTexture_IterateLevelFaces()\&. The difference is that the blocks of image data for non-array cube maps include all faces of a mip level\&. + +.PP +This function works even if \fRThis->pData\fP == 0 so it can be used to obtain offsets and sizes for each level by callers who have loaded the data externally\&. + +.PP +Intended for use only when supercompressionScheme == SUPERCOMPRESSION_NONE\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP handle of the \fBktxTexture\fP opened on the data\&. +.br +\fIiterCb\fP the address of a callback function which is called with the data for each image block\&. +.br +\fIuserdata\fP the address of application-specific data which is passed to the callback along with the image data\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. The following are returned directly by this function\&. \fRiterCb\fP may return these for other causes or may return additional errors\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_FILE_DATA_ERROR\fP\fP Mip level sizes are increasing not decreasing +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP supercompressionScheme != SUPERCOMPRESSION_NONE\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP is \fRNULL\fP or \fRiterCb\fP is \fRNULL\fP\&. +.RE +.PP + +.SS "#define ktxTexture_IterateLoadLevelFaces( This, iterCb, userdata)" +\fBValue:\fP +.nf +(This)\->vtbl\->IterateLoadLevelFaces(This, iterCb, userdata) +.PP +.fi + +.PP +Helper for calling the IterateLoadLevelFaces virtual method of a \fBktxTexture\fP\&. Iterate over the images in a \fBktxTexture2\fP object while loading the image data\&. + +.PP +This operates similarly to ktxTexture_IterateLevelFaces() except that it loads the images from the \fBktxTexture2\fP's source to a temporary buffer while iterating\&. If supercompressionScheme == KTX_SS_ZSTD or KTX_SS_ZLIB, it will inflate the data before passing it to the callback\&. The callback function must copy the image data if it wishes to preserve it as the temporary buffer is reused for each level and is freed when this function exits\&. + +.PP +This function is helpful for reducing memory usage when uploading the data to a graphics API\&. + +.PP +Intended for use only when supercompressionScheme == KTX_SS_NONE, KTX_SS_ZSTD or KTX_SS_ZLIB\&. As there is no access to the \fBktxTexture\fP's data on conclusion of this function, destroying the texture on completion is recommended\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIiterCb\fP the address of a callback function which is called with the data for each image\&. +.br +\fIuserdata\fP the address of application-specific data which is passed to the callback along with the image data\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. The following are returned directly by this function\&. \fRiterCb\fP may return these for other causes or may return additional errors\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_FILE_DATA_ERROR\fP\fP mip level sizes are increasing not decreasing +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP the \fBktxTexture2\fP was not created from a stream, i\&.e there is no data to load, or this \fBktxTexture2\fP's images have already been loaded\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP supercompressionScheme != KTX_SS_NONE, supercompressionScheme != KTX_SS_ZSTD, and supercompressionScheme != KTX_SS_ZLIB\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP is \fRNULL\fP or \fRiterCb\fP is \fRNULL\fP\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP not enough memory to allocate a block to hold the base level image\&. +.RE +.PP + +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. +.SS "#define ktxTexture_LoadImageData( This, pBuffer, bufSize)" +\fBValue:\fP +.nf +(This)\->vtbl\->LoadImageData(This, pBuffer, bufSize) +.PP +.fi + +.PP +Helper for calling the LoadImageData virtual method of a \fBktxTexture\fP\&. Load all the image data from the \fBktxTexture2\fP's source\&. + +.PP +The data will be inflated if supercompressionScheme == \fRKTX_SS_ZSTD\fP or \fRKTX_SS_ZLIB\fP\&. The data is loaded into the provided buffer or to an internally allocated buffer, if \fRpBuffer\fP is \fRNULL\fP\&. Callers providing their own buffer must ensure the buffer large enough to hold the inflated data for files deflated with Zstd or ZLIB\&. See ktxTexture2_GetDataSizeUncompressed()\&. + +.PP +The texture's levelIndex, dataSize, DFD and supercompressionScheme will all be updated after successful inflation to reflect the inflated data\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.br +\fIpBuffer\fP pointer to the buffer in which to load the image data\&. +.br +\fIbufSize\fP size of the buffer pointed at by \fRpBuffer\fP\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP is NULL\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRbufSize\fP is less than the the image data size\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The data has already been loaded or the \fBktxTexture\fP was not created from a KTX source\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Insufficient memory for the image data\&. +.RE +.PP + +.SS "#define ktxTexture_NeedsTranscoding( This)" +\fBValue:\fP +.nf +(This)\->vtbl\->NeedsTranscoding(This) +.PP +.fi + +.PP +Helper for calling the NeedsTranscoding virtual method of a \fBktxTexture\fP\&. Query if the images are in a transcodable format\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.RE +.PP + +.SS "#define ktxTexture_SetImageFromMemory( This, level, layer, faceSlice, src, srcSize)" +\fBValue:\fP +.nf +(This)\->vtbl\->SetImageFromMemory(This, level, layer, faceSlice, src, srcSize) +.PP +.fi + +.PP +Helper for calling the SetImageFromMemory virtual method of a \fBktxTexture\fP\&. Set image for level, layer, faceSlice from an image in memory\&. + +.PP +Uncompressed images in memory are expected to have their rows tightly packed as is the norm for most image file formats\&. KTX 2 also requires tight packing this function does not add any padding\&. + +.PP +Level, layer, faceSlice rather than offset are specified to enable some validation\&. + +.PP +\fBNote\fP +.RS 4 +The caller is responsible for freeing the original image memory referred to by \fRsrc\fP\&. +.RE +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIlevel\fP mip level of the image to set\&. +.br +\fIlayer\fP array layer of the image to set\&. +.br +\fIfaceSlice\fP cube map face or depth slice of the image to set or KTX_FACESLICE_WHOLE_LEVEL to set the entire level\&. +.br +\fIsrc\fP pointer to the image source in memory\&. +.br +\fIsrcSize\fP size of the source image in bytes\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRsrc\fP is NULL\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRsrcSize\fP != the expected image size for the specified level, layer & faceSlice\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP No storage was allocated when the texture was created\&. +.RE +.PP + +.SS "#define ktxTexture_SetImageFromStdioStream( This, level, layer, faceSlice, src, srcSize)" +\fBValue:\fP +.nf +(This)\->vtbl\->SetImageFromStdioStream(This, level, layer, faceSlice, \\ + src, srcSize) +.PP +.fi + +.PP +Helper for calling the SetImageFromStdioStream virtual method of a \fBktxTexture\fP\&. Set image for level, layer, faceSlice from a stdio stream source\&. + +.PP +Uncompressed images read from the stream are expected to have their rows tightly packed as is the norm for most image file formats\&. KTX 2 also requires tight packing this function does not add any padding\&. + +.PP +Level, layer, faceSlice rather than offset are specified to enable some validation\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIlevel\fP mip level of the image to set\&. +.br +\fIlayer\fP array layer of the image to set\&. +.br +\fIfaceSlice\fP cube map face or depth slice of the image to set or KTX_FACESLICE_WHOLE_LEVEL to set the entire level\&. +.br +\fIsrc\fP stdio stream pointer to the source\&. +.br +\fIsrcSize\fP size of the source image in bytes\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRsrc\fP is NULL\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRsrcSize\fP != the expected image size for the specified level, layer & faceSlice\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP No storage was allocated when the texture was created\&. +.RE +.PP + +.SS "#define ktxTexture_WriteToMemory( This, ppDstBytes, pSize)" +\fBValue:\fP +.nf +(This)\->vtbl\->WriteToMemory(This, ppDstBytes, pSize) +.PP +.fi + +.PP +Helper for calling the WriteToMemory virtual method of a \fBktxTexture\fP\&. Write a \fBktxTexture\fP object to block of memory in KTX format\&. + +.PP +Memory is allocated by the function and the caller is responsible for freeing it\&. + +.PP +Callers are strongly urged to include a KTXwriter item in the texture's metadata\&. It can be added by code, similar to the following, prior to calling this function\&. +.PP +.nf +char writer[100]; +snprintf(writer, sizeof(writer), "%s version %s", appName, appVer); +ktxHashList_AddKVPair(&texture\->kvDataHead, KTX_WRITER_KEY, + (ktx_uint32_t)strlen(writer) + 1, + writer); + +.fi +.PP + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIppDstBytes\fP pointer to location to write the address of the destination memory\&. The Application is responsible for freeing this memory\&. +.br +\fIpSize\fP pointer to location to write the size in bytes of the KTX data\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP, \fRppDstBytes\fP or \fRpSize\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both kvDataHead and kvData are set in the \fBktxTexture\fP +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "#define ktxTexture_WriteToNamedFile( This, dstname)" +\fBValue:\fP +.nf +(This)\->vtbl\->WriteToNamedFile(This, dstname) +.PP +.fi + +.PP +Helper for calling the WriteToNamedfile virtual method of a \fBktxTexture\fP\&. Write a \fBktxTexture\fP object to a named file in KTX format\&. + +.PP +The file name must be encoded in utf-8\&. On Windows convert unicode names to utf-8 with \fRWideCharToMultiByte(CP_UTF8, \&.\&.\&.)\fP before calling\&. + +.PP +Callers are strongly urged to include a KTXwriter item in the texture's metadata\&. It can be added by code, similar to the following, prior to calling this function\&. +.PP +.nf +char writer[100]; +snprintf(writer, sizeof(writer), "%s version %s", appName, appVer); +ktxHashList_AddKVPair(&texture\->kvDataHead, KTX_WRITER_KEY, + (ktx_uint32_t)strlen(writer) + 1, + writer); + +.fi +.PP + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIdstname\fP destination file name\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRdstname\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both kvDataHead and kvData are set in the \fBktxTexture\fP +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "#define ktxTexture_WriteToStdioStream( This, dstsstr)" +\fBValue:\fP +.nf +(This)\->vtbl\->WriteToStdioStream(This, dstsstr) +.PP +.fi + +.PP +Helper for calling the WriteToStdioStream virtual method of a \fBktxTexture\fP\&. Write a \fBktxTexture\fP object to a stdio stream in KTX format\&. + +.PP +Callers are strongly urged to include a KTXwriter item in the texture's metadata\&. It can be added by code, similar to the following, prior to calling this function\&. +.PP +.nf +char writer[100]; +snprintf(writer, sizeof(writer), "%s version %s", appName, appVer); +ktxHashList_AddKVPair(&texture\->kvDataHead, KTX_WRITER_KEY, + (ktx_uint32_t)strlen(writer) + 1, + writer); + +.fi +.PP + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIdstsstr\fP destination stdio stream\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRdstsstr\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both kvDataHead and kvData are set in the \fBktxTexture\fP +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "#define ktxTexture_WriteToStream( This, dststr)" +\fBValue:\fP +.nf +(This)\->vtbl\->WriteToStream(This, dststr) +.PP +.fi + +.PP +Helper for calling the WriteToStream virtual method of a \fBktxTexture\fP\&. Write a \fBktxTexture\fP object to a \fBktxStream\fP in KTX format\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIdststr\fP destination \fBktxStream\fP\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRdststr\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both kvDataHead and kvData are set in the \fBktxTexture\fP +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The length of the already set writerId metadata plus the library's version id exceeds the maximum allowed\&. +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SH "Typedef Documentation" +.PP +.SS "typedef enum \fBktx_transcode_fmt_e\fP \fBktx_transcode_fmt_e\fP" + +.PP +Enumerators for specifying the transcode target format\&. For BasisU/ETC1S format, \fIOpaque\fP and \fIalpha\fP here refer to 2 separate RGB images, a\&.k\&.a slices within the BasisU compressed data\&. For UASTC format they refer to the RGB and the alpha components of the UASTC data\&. If the original image had only 2 components, R will be in the opaque portion and G in the alpha portion\&. The R value will be replicated in the RGB components\&. In the case of BasisU the G value will be replicated in all 3 components of the alpha slice\&. If the original image had only 1 component it's value is replicated in all 3 components of the opaque portion and there is no alpha\&. + +.PP +\fBNote\fP +.RS 4 +You should not transcode sRGB encoded data to \fRKTX_TTF_BC4_R\fP, \fRKTX_TTF_BC5_RG\fP, \fRKTX_TTF_ETC2_EAC_R{\fP,G}11, \fRKTX_TTF_RGB565\fP, \fRKTX_TTF_BGR565\fP or \fRKTX_TTF_RGBA4444\fP formats as neither OpenGL nor Vulkan support sRGB variants of these\&. Doing sRGB decoding in the shader will not produce correct results if any texture filtering is being used\&. +.RE +.PP + +.SS "typedef struct ktxAstcParams ktxAstcParams" + +.PP +Structure for passing extended parameters to ktxTexture_CompressAstc\&. Passing a struct initialized to 0 (e\&.g\&. " = {0};") will use blockDimension 4x4, mode LDR and qualityLevel FASTEST\&. Setting qualityLevel to KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM is recommended\&. +.SS "typedef struct ktxBasisParams ktxBasisParams" + +.PP +Structure for passing extended parameters to ktxTexture2_CompressBasisEx()\&. If you only want default values, use ktxTexture2_CompressBasis()\&. Here, at a minimum you must initialize the structure as follows: +.PP +.nf +ktxBasisParams params = {0}; +params\&.structSize = sizeof(params); +params\&.compressionLevel = KTX_ETC1S_DEFAULT_COMPRESSION_LEVEL; + +.fi +.PP + +.PP +\fIcompressionLevel\fP has to be explicitly set because 0 is a valid \fIcompressionLevel\fP but is not the default used by the BasisU encoder when no value is set\&. Only the other settings that are to be non-default must be non-zero\&. +.SH "Enumeration Type Documentation" +.PP +.SS "enum \fBktx_error_code_e\fP" + +.PP +Error codes returned by library functions\&. +.PP +\fBEnumerator\fP +.in +1c +.TP +\f(BIKTX_SUCCESS \fP +Operation was successful\&. +.TP +\f(BIKTX_FILE_DATA_ERROR \fP +The data in the file is inconsistent with the spec\&. +.TP +\f(BIKTX_FILE_ISPIPE \fP +The file is a pipe or named pipe\&. +.TP +\f(BIKTX_FILE_OPEN_FAILED \fP +The target file could not be opened\&. +.TP +\f(BIKTX_FILE_OVERFLOW \fP +The operation would exceed the max file size\&. +.TP +\f(BIKTX_FILE_READ_ERROR \fP +An error occurred while reading from the file\&. +.TP +\f(BIKTX_FILE_SEEK_ERROR \fP +An error occurred while seeking in the file\&. +.TP +\f(BIKTX_FILE_UNEXPECTED_EOF \fP +File does not have enough data to satisfy request\&. +.TP +\f(BIKTX_FILE_WRITE_ERROR \fP +An error occurred while writing to the file\&. +.TP +\f(BIKTX_GL_ERROR \fP +GL operations resulted in an error\&. +.TP +\f(BIKTX_INVALID_OPERATION \fP +The operation is not allowed in the current state\&. +.TP +\f(BIKTX_INVALID_VALUE \fP +A parameter value was not valid\&. +.TP +\f(BIKTX_NOT_FOUND \fP +Requested metadata key or required dynamically loaded GPU function was not found\&. +.TP +\f(BIKTX_OUT_OF_MEMORY \fP +Not enough memory to complete the operation\&. +.TP +\f(BIKTX_TRANSCODE_FAILED \fP +Transcoding of block compressed texture failed\&. +.TP +\f(BIKTX_UNKNOWN_FILE_FORMAT \fP +The file not a KTX file +.TP +\f(BIKTX_UNSUPPORTED_TEXTURE_TYPE \fP +The KTX file specifies an unsupported texture type\&. +.TP +\f(BIKTX_UNSUPPORTED_FEATURE \fP +Feature not included in in-use library or not yet implemented\&. +.TP +\f(BIKTX_LIBRARY_NOT_LINKED \fP +Library dependency (OpenGL or Vulkan) not linked into application\&. +.TP +\f(BIKTX_DECOMPRESS_LENGTH_ERROR \fP +Decompressed byte count does not match expected byte size +.TP +\f(BIKTX_DECOMPRESS_CHECKSUM_ERROR \fP +Checksum mismatch when decompressing +.TP +\f(BIKTX_ERROR_MAX_ENUM \fP +For safety checks\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. +.SS "enum \fBktx_pack_astc_block_dimension_e\fP" + +.PP +Options specifiying ASTC encoding block dimensions\&. +.PP +\fBEnumerator\fP +.in +1c +.TP +\f(BIKTX_PACK_ASTC_BLOCK_DIMENSION_MAX \fP +Maximum supported blocks\&. +.SS "enum \fBktx_pack_astc_encoder_mode_e\fP" + +.PP +Options specifying ASTC encoder mode\&. +.PP +\fBEnumerator\fP +.in +1c +.TP +\f(BIKTX_PACK_ASTC_ENCODER_MODE_DEFAULT \fP +Selects LDR mode if component size is <= 8-bit, HDR otherwise\&. +.TP +\f(BIKTX_PACK_ASTC_ENCODER_MODE_LDR \fP +Always encode in low dynamic range mode\&. +.TP +\f(BIKTX_PACK_ASTC_ENCODER_MODE_HDR \fP +Always encode in high dynamic range mode\&. +.TP +\f(BIKTX_PACK_ASTC_ENCODER_MODE_MAX \fP +Indicates the maximum permissible value\&. +.SS "enum \fBktx_pack_astc_quality_levels_e\fP" + +.PP +Options specifiying ASTC encoding quality levels\&. +.PP +\fBEnumerator\fP +.in +1c +.TP +\f(BIKTX_PACK_ASTC_QUALITY_LEVEL_FASTEST \fP +Fastest compression\&. +.TP +\f(BIKTX_PACK_ASTC_QUALITY_LEVEL_FAST \fP +Fast compression\&. +.TP +\f(BIKTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM \fP +Medium compression\&. +.TP +\f(BIKTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH \fP +Slower compression\&. +.TP +\f(BIKTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE \fP +Very slow compression\&. +.TP +\f(BIKTX_PACK_ASTC_QUALITY_LEVEL_MAX \fP +Maximum supported quality level\&. +.SS "enum \fBktx_pack_uastc_flag_bits_e\fP" + +.PP +Flags specifiying UASTC encoding options\&. +.PP +\fBEnumerator\fP +.in +1c +.TP +\f(BIKTX_PACK_UASTC_LEVEL_FASTEST \fP +Fastest compression\&. 43\&.45dB\&. +.TP +\f(BIKTX_PACK_UASTC_LEVEL_FASTER \fP +Faster compression\&. 46\&.49dB\&. +.TP +\f(BIKTX_PACK_UASTC_LEVEL_DEFAULT \fP +Default compression\&. 47\&.47dB\&. +.TP +\f(BIKTX_PACK_UASTC_LEVEL_SLOWER \fP +Slower compression\&. 48\&.01dB\&. +.TP +\f(BIKTX_PACK_UASTC_LEVEL_VERYSLOW \fP +Very slow compression\&. 48\&.24dB\&. +.TP +\f(BIKTX_PACK_UASTC_MAX_LEVEL \fP +Maximum supported quality level\&. +.TP +\f(BIKTX_PACK_UASTC_LEVEL_MASK \fP +Mask to extract the level from the other bits\&. +.TP +\f(BIKTX_PACK_UASTC_FAVOR_UASTC_ERROR \fP +Optimize for lowest UASTC error\&. +.TP +\f(BIKTX_PACK_UASTC_FAVOR_BC7_ERROR \fP +Optimize for lowest BC7 error\&. +.TP +\f(BIKTX_PACK_UASTC_ETC1_FASTER_HINTS \fP +Optimize for faster transcoding to ETC1\&. +.TP +\f(BIKTX_PACK_UASTC_ETC1_FASTEST_HINTS \fP +Optimize for fastest transcoding to ETC1\&. +.TP +\f(BIKTX_PACK_UASTC__ETC1_DISABLE_FLIP_AND_INDIVIDUAL \fP +Not documented in BasisU code\&. +.SS "enum \fBktx_transcode_flag_bits_e\fP" + +.PP +Flags guiding transcoding of Basis Universal compressed textures\&. +.PP +\fBEnumerator\fP +.in +1c +.TP +\f(BIKTX_TF_PVRTC_DECODE_TO_NEXT_POW2 \fP +PVRTC1: decode non-pow2 ETC1S texture level to the next larger power of 2 (not implemented yet, but we're going to support it)\&. Ignored if the slice's dimensions are already a power of 2\&. +.TP +\f(BIKTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS \fP +When decoding to an opaque texture format, if the Basis data has alpha, decode the alpha slice instead of the color slice to the output texture format\&. Has no effect if there is no alpha data\&. +.TP +\f(BIKTX_TF_HIGH_QUALITY \fP +Request higher quality transcode of UASTC to BC1, BC3, ETC2_EAC_R11 and ETC2_EAC_RG11\&. The flag is unused by other UASTC transcoders\&. +.SS "enum \fBktx_transcode_fmt_e\fP" + +.PP +Enumerators for specifying the transcode target format\&. For BasisU/ETC1S format, \fIOpaque\fP and \fIalpha\fP here refer to 2 separate RGB images, a\&.k\&.a slices within the BasisU compressed data\&. For UASTC format they refer to the RGB and the alpha components of the UASTC data\&. If the original image had only 2 components, R will be in the opaque portion and G in the alpha portion\&. The R value will be replicated in the RGB components\&. In the case of BasisU the G value will be replicated in all 3 components of the alpha slice\&. If the original image had only 1 component it's value is replicated in all 3 components of the opaque portion and there is no alpha\&. + +.PP +\fBNote\fP +.RS 4 +You should not transcode sRGB encoded data to \fRKTX_TTF_BC4_R\fP, \fRKTX_TTF_BC5_RG\fP, \fRKTX_TTF_ETC2_EAC_R{\fP,G}11, \fRKTX_TTF_RGB565\fP, \fRKTX_TTF_BGR565\fP or \fRKTX_TTF_RGBA4444\fP formats as neither OpenGL nor Vulkan support sRGB variants of these\&. Doing sRGB decoding in the shader will not produce correct results if any texture filtering is being used\&. +.RE +.PP + +.PP +\fBEnumerator\fP +.in +1c +.TP +\f(BIKTX_TTF_ETC1_RGB \fP +Opaque only\&. Returns RGB or alpha data, if KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS flag is specified\&. +.TP +\f(BIKTX_TTF_ETC2_RGBA \fP +Opaque+alpha\&. EAC_A8 block followed by an ETC1 block\&. The alpha channel will be opaque for textures without an alpha channel\&. +.TP +\f(BIKTX_TTF_BC1_RGB \fP +Opaque only, no punchthrough alpha support yet\&. Returns RGB or alpha data, if KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS flag is specified\&. +.TP +\f(BIKTX_TTF_BC3_RGBA \fP +Opaque+alpha\&. BC4 block with alpha followed by a BC1 block\&. The alpha channel will be opaque for textures without an alpha channel\&. +.TP +\f(BIKTX_TTF_BC4_R \fP +One BC4 block\&. R = opaque\&.g or alpha\&.g, if KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS flag is specified\&. +.TP +\f(BIKTX_TTF_BC5_RG \fP +Two BC4 blocks, R=opaque\&.g and G=alpha\&.g The texture should have an alpha channel (if not G will be all 255's\&. For tangent space normal maps\&. +.TP +\f(BIKTX_TTF_BC7_RGBA \fP +RGB or RGBA mode 5 for ETC1S, modes 1, 2, 3, 4, 5, 6, 7 for UASTC\&. +.TP +\f(BIKTX_TTF_PVRTC1_4_RGB \fP +Opaque only\&. Returns RGB or alpha data, if KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS flag is specified\&. +.TP +\f(BIKTX_TTF_PVRTC1_4_RGBA \fP +Opaque+alpha\&. Most useful for simple opacity maps\&. If the texture doesn't have an alpha channel KTX_TTF_PVRTC1_4_RGB will be used instead\&. Lowest quality of any supported texture format\&. +.TP +\f(BIKTX_TTF_ASTC_4x4_RGBA \fP +Opaque+alpha, ASTC 4x4\&. The alpha channel will be opaque for textures without an alpha channel\&. The transcoder uses RGB/RGBA/L/LA modes, void extent, and up to two ([0,47] and [0,255]) endpoint precisions\&. +.TP +\f(BIKTX_TTF_PVRTC2_4_RGB \fP +Opaque-only\&. Almost BC1 quality, much faster to transcode and supports arbitrary texture dimensions (unlike PVRTC1 RGB)\&. +.TP +\f(BIKTX_TTF_PVRTC2_4_RGBA \fP +Opaque+alpha\&. Slower to transcode than cTFPVRTC2_4_RGB\&. Premultiplied alpha is highly recommended, otherwise the color channel can leak into the alpha channel on transparent blocks\&. +.TP +\f(BIKTX_TTF_ETC2_EAC_R11 \fP +R only (ETC2 EAC R11 unsigned)\&. R = opaque\&.g or alpha\&.g, if KTX_TF_TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS flag is specified\&. +.TP +\f(BIKTX_TTF_ETC2_EAC_RG11 \fP +RG only (ETC2 EAC RG11 unsigned), R=opaque\&.g, G=alpha\&.g\&. The texture should have an alpha channel (if not G will be all 255's\&. For tangent space normal maps\&. +.TP +\f(BIKTX_TTF_RGBA32 \fP +32bpp RGBA image stored in raster (not block) order in memory, R is first byte, A is last byte\&. +.TP +\f(BIKTX_TTF_RGB565 \fP +16bpp RGB image stored in raster (not block) order in memory, R at bit position 11\&. +.TP +\f(BIKTX_TTF_BGR565 \fP +16bpp RGB image stored in raster (not block) order in memory, R at bit position 0\&. +.TP +\f(BIKTX_TTF_RGBA4444 \fP +16bpp RGBA image stored in raster (not block) order in memory, R at bit position 12, A at bit position 0\&. +.TP +\f(BIKTX_TTF_ETC \fP +Automatically selects \fRKTX_TTF_ETC1_RGB\fP or \fRKTX_TTF_ETC2_RGBA\fP according to presence of alpha\&. +.TP +\f(BIKTX_TTF_BC1_OR_3 \fP +Automatically selects \fRKTX_TTF_BC1_RGB\fP or \fRKTX_TTF_BC3_RGBA\fP according to presence of alpha\&. +.TP +\f(BIKTX_TF_ETC1 \fP + +.PP +\fBDeprecated\fP +.RS 4 +Use \fBKTX_TTF_ETC1_RGB\fP\&. +.RE +.PP + +.TP +\f(BIKTX_TF_ETC2 \fP + +.PP +\fBDeprecated\fP +.RS 4 +Use \fBKTX_TTF_ETC\fP\&. +.RE +.PP + +.TP +\f(BIKTX_TF_BC1 \fP + +.PP +\fBDeprecated\fP +.RS 4 +Use \fBKTX_TTF_BC1_RGB\fP\&. +.RE +.PP + +.TP +\f(BIKTX_TF_BC3 \fP + +.PP +\fBDeprecated\fP +.RS 4 +Use \fBKTX_TTF_BC3_RGBA\fP\&. +.RE +.PP + +.TP +\f(BIKTX_TF_BC4 \fP + +.PP +\fBDeprecated\fP +.RS 4 +Use \fBKTX_TTF_BC4_R\fP\&. +.RE +.PP + +.TP +\f(BIKTX_TF_BC5 \fP + +.PP +\fBDeprecated\fP +.RS 4 +Use \fBKTX_TTF_BC5_RG\fP\&. +.RE +.PP + +.TP +\f(BIKTX_TTF_BC7_M6_RGB \fP + +.PP +\fBDeprecated\fP +.RS 4 +Use \fBKTX_TTF_BC7_RGBA\fP\&. +.RE +.PP + +.TP +\f(BIKTX_TTF_BC7_M5_RGBA \fP + +.PP +\fBDeprecated\fP +.RS 4 +Use \fBKTX_TTF_BC7_RGBA\fP\&. +.RE +.PP + +.TP +\f(BIKTX_TF_BC7_M6_OPAQUE_ONLY \fP + +.PP +\fBDeprecated\fP +.RS 4 +Use \fBKTX_TTF_BC7_RGBA\fP +.RE +.PP + +.TP +\f(BIKTX_TF_PVRTC1_4_OPAQUE_ONLY \fP + +.PP +\fBDeprecated\fP +.RS 4 +Use \fBKTX_TTF_PVRTC1_4_RGB\fP\&. +.RE +.PP + +.SS "enum \fBktxSupercmpScheme\fP" + +.PP +Enumerators identifying the supercompression scheme\&. +.PP +\fBEnumerator\fP +.in +1c +.TP +\f(BIKTX_SS_NONE \fP +No supercompression\&. +.TP +\f(BIKTX_SS_BASIS_LZ \fP +Basis LZ supercompression\&. +.TP +\f(BIKTX_SS_ZSTD \fP +ZStd supercompression\&. +.TP +\f(BIKTX_SS_ZLIB \fP +ZLIB supercompression\&. +.SH "Function Documentation" +.PP +.SS "KTX_API const char *KTX_APIENTRY ktxErrorString (\fBKTX_error_code\fP error)" + +.PP +Return a string corresponding to a KTX error code\&. +.PP +\fBParameters\fP +.RS 4 +\fIerror\fP the error code for which to return a string +.RE +.PP +\fBReturns\fP +.RS 4 +pointer to the message string\&. +.RE +.PP + +.PP +\fBExamples\fP +.in +1c +\fBvkload\&.cpp\fP\&. +.SS "KTX_API const char *KTX_APIENTRY ktxSupercompressionSchemeString (\fBktxSupercmpScheme\fP scheme)" + +.PP +Return a string corresponding to a supercompressionScheme enumeration\&. +.PP +\fBParameters\fP +.RS 4 +\fIscheme\fP the supercompression scheme for which to return a string\&. +.RE +.PP +\fBReturns\fP +.RS 4 +pointer to the message string\&. +.RE +.PP + +.SS "KTX_API const char *KTX_APIENTRY ktxTranscodeFormatString (\fBktx_transcode_fmt_e\fP format)" + +.PP +Return a string corresponding to a transcode format enumeration\&. +.PP +\fBParameters\fP +.RS 4 +\fIformat\fP the transcode format for which to return a string\&. +.RE +.PP +\fBReturns\fP +.RS 4 +pointer to the message string\&. +.RE +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxAstcParams.3 b/ktx/build/docs/man/man3/ktxAstcParams.3 new file mode 100644 index 0000000..ef61c57 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxAstcParams.3 @@ -0,0 +1,71 @@ +.TH "ktxAstcParams" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxAstcParams \- Structure for passing extended parameters to ktxTexture_CompressAstc\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Data Fields" + +.in +1c +.ti -1c +.RI "ktx_uint32_t \fBstructSize\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBverbose\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBthreadCount\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBblockDimension\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBmode\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBqualityLevel\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBnormalMap\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBperceptual\fP" +.br +.ti -1c +.RI "char \fBinputSwizzle\fP [4]" +.br +.in -1c +.SH "Detailed Description" +.PP +Structure for passing extended parameters to ktxTexture_CompressAstc\&. + +Passing a struct initialized to 0 (e\&.g\&. " = {0};") will use blockDimension 4x4, mode LDR and qualityLevel FASTEST\&. Setting qualityLevel to KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM is recommended\&. +.SH "Field Documentation" +.PP +.SS "ktx_uint32_t blockDimension" +Combinations of block dimensions that astcenc supports i\&.e\&. 6x6, 8x8, 6x5 etc +.SS "char inputSwizzle[4]" +A swizzle to provide as input to astcenc\&. It must match the regular expression /^[rgba01]{4}$/\&. +.SS "ktx_uint32_t mode" +Can be {ldr/hdr} from astcenc +.SS "ktx_bool_t normalMap" +Tunes codec parameters for better quality on normal maps In this mode normals are compressed to X,Y components Discarding Z component, reader will need to generate Z component in shaders\&. +.SS "ktx_bool_t perceptual" +The codec should optimize for perceptual error, instead of direct RMS error\&. This aims to improves perceived image quality, but typically lowers the measured PSNR score\&. Perceptual methods are currently only available for normal maps and RGB color data\&. +.SS "ktx_uint32_t qualityLevel" +astcenc supports -fastest, -fast, -medium, -thorough, -exhaustive +.SS "ktx_uint32_t structSize" +Size of this struct\&. Used so library can tell which version of struct is being passed\&. +.SS "ktx_uint32_t threadCount" +Number of threads used for compression\&. Default is 1\&. +.SS "ktx_bool_t verbose" +If true, prints Astc encoder operation details to \fRstdout\fP\&. Not recommended for GUI apps\&. + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxBUImageFlagsBitString.3 b/ktx/build/docs/man/man3/ktxBUImageFlagsBitString.3 new file mode 100644 index 0000000..71a32bc --- /dev/null +++ b/ktx/build/docs/man/man3/ktxBUImageFlagsBitString.3 @@ -0,0 +1 @@ +.so man3/strings.c.3 diff --git a/ktx/build/docs/man/man3/ktxBasisParams.3 b/ktx/build/docs/man/man3/ktxBasisParams.3 new file mode 100644 index 0000000..829b96b --- /dev/null +++ b/ktx/build/docs/man/man3/ktxBasisParams.3 @@ -0,0 +1,187 @@ +.TH "ktxBasisParams" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxBasisParams \- Structure for passing extended parameters to ktxTexture2_CompressBasisEx()\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Data Fields" + +.in +1c +.ti -1c +.RI "ktx_uint32_t \fBstructSize\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBuastc\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBverbose\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBnoSSE\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBthreadCount\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBcompressionLevel\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBqualityLevel\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBmaxEndpoints\fP" +.br +.ti -1c +.RI "float \fBendpointRDOThreshold\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBmaxSelectors\fP" +.br +.ti -1c +.RI "float \fBselectorRDOThreshold\fP" +.br +.ti -1c +.RI "char \fBinputSwizzle\fP [4]" +.br +.ti -1c +.RI "ktx_bool_t \fBnormalMap\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBseparateRGToRGB_A\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBpreSwizzle\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBnoEndpointRDO\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBnoSelectorRDO\fP" +.br +.ti -1c +.RI "ktx_pack_uastc_flags \fBuastcFlags\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBuastcRDO\fP" +.br +.ti -1c +.RI "float \fBuastcRDOQualityScalar\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBuastcRDODictSize\fP" +.br +.ti -1c +.RI "float \fBuastcRDOMaxSmoothBlockErrorScale\fP" +.br +.ti -1c +.RI "float \fBuastcRDOMaxSmoothBlockStdDev\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBuastcRDODontFavorSimplerModes\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBuastcRDONoMultithreading\fP" +.br +.in -1c +.SH "Detailed Description" +.PP +Structure for passing extended parameters to ktxTexture2_CompressBasisEx()\&. + +If you only want default values, use ktxTexture2_CompressBasis()\&. Here, at a minimum you must initialize the structure as follows: +.PP +.nf +ktxBasisParams params = {0}; +params\&.structSize = sizeof(params); +params\&.compressionLevel = KTX_ETC1S_DEFAULT_COMPRESSION_LEVEL; + +.fi +.PP + +.PP +\fIcompressionLevel\fP has to be explicitly set because 0 is a valid \fIcompressionLevel\fP but is not the default used by the BasisU encoder when no value is set\&. Only the other settings that are to be non-default must be non-zero\&. +.SH "Field Documentation" +.PP +.SS "ktx_uint32_t compressionLevel" +Encoding speed vs\&. quality tradeoff\&. Range is [0,6]\&. Higher values are much slower, but give slightly higher quality\&. Higher levels are intended for video\&. There is no default\&. Callers must explicitly set this value\&. Callers can use KTX_ETC1S_DEFAULT_COMPRESSION_LEVEL as a default value\&. Currently this is 2\&. +.SS "float endpointRDOThreshold" +Set endpoint RDO quality threshold\&. The default is 1\&.25\&. Lower is higher quality but less quality per output bit (try [1\&.0,3\&.0]\&. This will override the value chosen by \fRqualityLevel\fP\&. +.SS "char inputSwizzle[4]" +A swizzle to apply before encoding\&. It must match the regular expression /^[rgba01]{4}$/\&. If both this and preSwizzle are specified ktxTexture_CompressBasisEx will raise KTX_INVALID_OPERATION\&. Usable with both ETC1S and UASTC\&. +.SS "ktx_uint32_t maxEndpoints" +Manually set the max number of color endpoint clusters\&. Range is [1,16128]\&. Default is 0, unset\&. If this is set, maxSelectors must also be set, otherwise the value will be ignored\&. +.SS "ktx_uint32_t maxSelectors" +Manually set the max number of color selector clusters\&. Range is [1,16128]\&. Default is 0, unset\&. If this is set, maxEndpoints must also be set, otherwise the value will be ignored\&. +.SS "ktx_bool_t noEndpointRDO" +Disable endpoint rate distortion optimizations\&. Slightly faster, less noisy output, but lower quality per output bit\&. Default is KTX_FALSE\&. +.SS "ktx_bool_t normalMap" +Tunes codec parameters for better quality on normal maps (no selector RDO, no endpoint RDO) and sets the texture's DFD appropriately\&. Only valid for linear textures\&. +.SS "ktx_bool_t noSelectorRDO" +Disable selector rate distortion optimizations\&. Slightly faster, less noisy output, but lower quality per output bit\&. Default is KTX_FALSE\&. +.SS "ktx_bool_t noSSE" +True to forbid use of the SSE instruction set\&. Ignored if CPU does not support SSE\&. +.SS "ktx_bool_t preSwizzle" +If the texture has \fRKTXswizzle\fP metadata, apply it before compressing\&. Swizzling, like \fRrabb\fP may yield drastically different error metrics if done after supercompression\&. Usable for both ETC1S and UASTC\&. +.SS "ktx_uint32_t qualityLevel" +Compression quality\&. Range is [1,255]\&. Lower gives better compression/lower quality/faster\&. Higher gives less compression /higher quality/slower\&. This automatically determines values for \fRmaxEndpoints\fP, \fRmaxSelectors\fP, \fRendpointRDOThreshold\fP and \fRselectorRDOThreshold\fP for the target quality level\&. Setting these parameters overrides the values determined by \fRqualityLevel\fP which defaults to 128 if neither it nor both of \fRmaxEndpoints\fP and \fRmaxSelectors\fP have been set\&. +.PP +\fBNote\fP +.RS 4 +\fIBoth\fP of \fRmaxEndpoints\fP and \fRmaxSelectors\fP must be set for them to have any effect\&. + +.PP +qualityLevel will only determine values for \fRendpointRDOThreshold\fP and \fRselectorRDOThreshold\fP when its value exceeds 128, otherwise their defaults will be used\&. +.RE +.PP + +.SS "float selectorRDOThreshold" +Set selector RDO quality threshold\&. The default is 1\&.5\&. Lower is higher quality but less quality per output bit (try [1\&.0,3\&.0])\&. This will override the value chosen by \fRqualityLevel\fP\&. +.SS "ktx_bool_t separateRGToRGB_A" + +.PP +\fBDeprecated\fP +.RS 4 +This was and is a no-op\&. 2-component inputs have always been automatically separated using an "rrrg" inputSwizzle\&. +.RE +.PP +\fBSee also\fP +.RS 4 +\fBinputSwizzle\fP and normalMode\&. +.RE +.PP + +.SS "ktx_uint32_t structSize" +Size of this struct\&. Used so library can tell which version of struct is being passed\&. +.SS "ktx_uint32_t threadCount" +Number of threads used for compression\&. Default is 1\&. +.SS "ktx_bool_t uastc" +True to use UASTC base, false to use ETC1S base\&. +.SS "ktx_pack_uastc_flags uastcFlags" +A set of \fBktx_pack_uastc_flag_bits_e\fP controlling UASTC encoding\&. The most important value is the level given in the least-significant 4 bits which selects a speed vs quality tradeoff as shown in the following table: + +.PP +Level/Speed Quality KTX_PACK_UASTC_LEVEL_FASTEST 43\&.45dB KTX_PACK_UASTC_LEVEL_FASTER 46\&.49dB KTX_PACK_UASTC_LEVEL_DEFAULT 47\&.47dB KTX_PACK_UASTC_LEVEL_SLOWER 48\&.01dB KTX_PACK_UASTC_LEVEL_VERYSLOW 48\&.24dB +.SS "ktx_bool_t uastcRDO" +Enable Rate Distortion Optimization (RDO) post-processing\&. +.SS "ktx_uint32_t uastcRDODictSize" +UASTC RDO dictionary size in bytes\&. Default is 4096\&. Lower values=faster, but give less compression\&. Range is [64,65536]\&. +.SS "ktx_bool_t uastcRDODontFavorSimplerModes" +Do not favor simpler UASTC modes in RDO mode\&. +.SS "float uastcRDOMaxSmoothBlockErrorScale" +UASTC RDO max smooth block error scale\&. Range is [1,300]\&. Default is 10\&.0, 1\&.0 is disabled\&. Larger values suppress more artifacts (and allocate more bits) on smooth blocks\&. +.SS "float uastcRDOMaxSmoothBlockStdDev" +UASTC RDO max smooth block standard deviation\&. Range is [\&.01,65536\&.0]\&. Default is 18\&.0\&. Larger values expand the range of blocks considered smooth\&. +.SS "ktx_bool_t uastcRDONoMultithreading" +Disable RDO multithreading (slightly higher compression, deterministic)\&. +.SS "float uastcRDOQualityScalar" +UASTC RDO quality scalar (lambda)\&. Lower values yield higher quality/larger LZ compressed files, higher values yield lower quality/smaller LZ compressed files\&. A good range to try is [\&.2,4]\&. Full range is [\&.001,50\&.0]\&. Default is 1\&.0\&. +.SS "ktx_bool_t verbose" +If true, prints Basis Universal encoder operation details to \fRstdout\fP\&. Not recommended for GUI apps\&. + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxErrorString.3 b/ktx/build/docs/man/man3/ktxErrorString.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxErrorString.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxFileStream_construct.3 b/ktx/build/docs/man/man3/ktxFileStream_construct.3 new file mode 100644 index 0000000..9bc581b --- /dev/null +++ b/ktx/build/docs/man/man3/ktxFileStream_construct.3 @@ -0,0 +1 @@ +.so man3/filestream.c.3 diff --git a/ktx/build/docs/man/man3/ktxFileStream_destruct.3 b/ktx/build/docs/man/man3/ktxFileStream_destruct.3 new file mode 100644 index 0000000..9bc581b --- /dev/null +++ b/ktx/build/docs/man/man3/ktxFileStream_destruct.3 @@ -0,0 +1 @@ +.so man3/filestream.c.3 diff --git a/ktx/build/docs/man/man3/ktxHashList.3 b/ktx/build/docs/man/man3/ktxHashList.3 new file mode 100644 index 0000000..f7e9629 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList.3 @@ -0,0 +1,419 @@ +.TH "ktxHashList" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxHashList \- Opaque handle to a \fBktxHashList\fP\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "void \fBktxHashList_Construct\fP (\fBktxHashList\fP *pHead)" +.br +.RI "Construct an empty hash list for storing key-value pairs\&. " +.ti -1c +.RI "void \fBktxHashList_ConstructCopy\fP (\fBktxHashList\fP *pHead, \fBktxHashList\fP orig)" +.br +.RI "Construct a hash list by copying another\&. " +.ti -1c +.RI "void \fBktxHashList_Destruct\fP (\fBktxHashList\fP *pHead)" +.br +.RI "Destruct a hash list\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxHashList_Create\fP (\fBktxHashList\fP **ppHl)" +.br +.RI "Create an empty hash list for storing key-value pairs\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxHashList_CreateCopy\fP (\fBktxHashList\fP **ppHl, \fBktxHashList\fP orig)" +.br +.RI "Create a copy of a hash list\&. " +.ti -1c +.RI "void \fBktxHashList_Destroy\fP (\fBktxHashList\fP *pHead)" +.br +.RI "Destroy a hash list\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxHashList_AddKVPair\fP (\fBktxHashList\fP *pHead, const char *key, unsigned int valueLen, const void *value)" +.br +.RI "Add a key value pair to a hash list\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxHashList_DeleteKVPair\fP (\fBktxHashList\fP *pHead, const char *key)" +.br +.RI "Delete a key value pair in a hash list\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxHashList_DeleteEntry\fP (\fBktxHashList\fP *pHead, \fBktxHashListEntry\fP *pEntry)" +.br +.RI "Delete an entry from a hash list\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxHashList_FindEntry\fP (\fBktxHashList\fP *pHead, const char *key, \fBktxHashListEntry\fP **ppEntry)" +.br +.RI "Looks up a key in a hash list and returns the entry\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxHashList_FindValue\fP (\fBktxHashList\fP *pHead, const char *key, unsigned int *pValueLen, void **ppValue)" +.br +.RI "Looks up a key in a hash list and returns the value\&. " +.ti -1c +.RI "\fBktxHashListEntry\fP * \fBktxHashList_Next\fP (\fBktxHashListEntry\fP *entry)" +.br +.RI "Returns the next entry in a \fBktxHashList\fP\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxHashList_Serialize\fP (\fBktxHashList\fP *pHead, unsigned int *pKvdLen, unsigned char **ppKvd)" +.br +.RI "Serialize a hash list to a block of data suitable for writing to a file\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxHashList_Sort\fP (\fBktxHashList\fP *pHead)" +.br +.RI "Sort a hash list in order of the UTF8 codepoints\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxHashList_Deserialize\fP (\fBktxHashList\fP *pHead, unsigned int kvdLen, void *pKvd)" +.br +.RI "Construct a hash list from a block of serialized key-value data read from a file\&. " +.in -1c +.SH "Detailed Description" +.PP +Opaque handle to a \fBktxHashList\fP\&. +.SH "Member Function Documentation" +.PP +.SS "\fBKTX_error_code\fP ktxHashList_AddKVPair (\fBktxHashList\fP * pHead, const char * key, unsigned int valueLen, const void * value)" + +.PP +Add a key value pair to a hash list\&. The value can be empty, i\&.e, its length can be 0\&. + +.PP +\fBParameters\fP +.RS 4 +\fIpHead\fP pointer to the head of the target hash list\&. +.br +\fIkey\fP pointer to the UTF8 NUL-terminated string to be used as the key\&. +.br +\fIvalueLen\fP the number of bytes of data in \fRvalue\fP\&. +.br +\fIvalue\fP pointer to the bytes of data constituting the value\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS or one of the following error codes\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP if \fRpHead\fP, \fRkey\fP or \fRvalue\fP are NULL, \fRkey\fP is an empty string or \fRvalueLen\fP == 0\&. +.RE +.PP + +.SS "void ktxHashList_Construct (\fBktxHashList\fP * pHead)" + +.PP +Construct an empty hash list for storing key-value pairs\&. +.PP +\fBParameters\fP +.RS 4 +\fIpHead\fP pointer to the location to write the list head\&. +.RE +.PP + +.SS "void ktxHashList_ConstructCopy (\fBktxHashList\fP * pHead, \fBktxHashList\fP orig)" + +.PP +Construct a hash list by copying another\&. +.PP +\fBParameters\fP +.RS 4 +\fIpHead\fP pointer to head of the list\&. +.br +\fIorig\fP head of the original hash list\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxHashList_Create (\fBktxHashList\fP ** ppHl)" + +.PP +Create an empty hash list for storing key-value pairs\&. +.PP +\fBParameters\fP +.RS 4 +\fIppHl\fP address of a variable in which to set a pointer to the newly created hash list\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS or one of the following error codes\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_OUT_OF_MEMORY\fP\fP if not enough memory\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxHashList_CreateCopy (\fBktxHashList\fP ** ppHl, \fBktxHashList\fP orig)" + +.PP +Create a copy of a hash list\&. +.PP +\fBParameters\fP +.RS 4 +\fIppHl\fP address of a variable in which to set a pointer to the newly created hash list\&. +.br +\fIorig\fP head of the \fBktxHashList\fP to copy\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS or one of the following error codes\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_OUT_OF_MEMORY\fP\fP if not enough memory\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxHashList_DeleteEntry (\fBktxHashList\fP * pHead, \fBktxHashListEntry\fP * pEntry)" + +.PP +Delete an entry from a hash list\&. +.PP +\fBParameters\fP +.RS 4 +\fIpHead\fP pointer to the head of the target hash list\&. +.br +\fIpEntry\fP pointer to the \fBktxHashListEntry\fP to delete\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS or one of the following error codes\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP if \fRpHead\fP is NULL or \fRkey\fP is an empty string\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxHashList_DeleteKVPair (\fBktxHashList\fP * pHead, const char * key)" + +.PP +Delete a key value pair in a hash list\&. Is a nop if the key is not in the hash\&. + +.PP +\fBParameters\fP +.RS 4 +\fIpHead\fP pointer to the head of the target hash list\&. +.br +\fIkey\fP pointer to the UTF8 NUL-terminated string to be used as the key\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS or one of the following error codes\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP if \fRpHead\fP is NULL or \fRkey\fP is an empty string\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxHashList_Deserialize (\fBktxHashList\fP * pHead, unsigned int kvdLen, void * pKvd)" + +.PP +Construct a hash list from a block of serialized key-value data read from a file\&. +.PP +\fBNote\fP +.RS 4 +The bytes of the 32-bit key-value lengths within the serialized data are expected to be in native endianness\&. +.RE +.PP +\fBParameters\fP +.RS 4 +\fIpHead\fP pointer to the head of the target hash list\&. +.br +\fIkvdLen\fP the length of the serialized key-value data\&. +.br +\fIpKvd\fP pointer to the serialized key-value data\&. table\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS or one of the following error codes\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_OPERATION\fP\fP if \fRpHead\fP does not point to an empty list\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP if \fRpKvd\fP or \fRpHt\fP is NULL or kvdLen == 0\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP there was not enough memory to create the hash table\&. +.RE +.PP + +.SS "void ktxHashList_Destroy (\fBktxHashList\fP * pHead)" + +.PP +Destroy a hash list\&. All memory associated with the hash list's keys and values is freed\&. The hash list is also freed\&. + +.PP +\fBParameters\fP +.RS 4 +\fIpHead\fP pointer to the hash list to be destroyed\&. +.RE +.PP + +.SS "void ktxHashList_Destruct (\fBktxHashList\fP * pHead)" + +.PP +Destruct a hash list\&. All memory associated with the hash list's keys and values is freed\&. + +.PP +\fBParameters\fP +.RS 4 +\fIpHead\fP pointer to the hash list to be destroyed\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxHashList_FindEntry (\fBktxHashList\fP * pHead, const char * key, \fBktxHashListEntry\fP ** ppEntry)" + +.PP +Looks up a key in a hash list and returns the entry\&. +.PP +\fBParameters\fP +.RS 4 +\fIpHead\fP pointer to the head of the target hash list\&. +.br +\fIkey\fP pointer to a UTF8 NUL-terminated string to find\&. +.br +\fIppEntry\fP \fR*ppEntry\fP is set to the point at the \fBktxHashListEntry\fP\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS or one of the following error codes\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP if \fRThis\fP, \fRkey\fP or \fRpValueLen\fP or \fRppValue\fP is NULL\&. +.br +\fI\fBKTX_NOT_FOUND\fP\fP an entry matching \fRkey\fP was not found\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxHashList_FindValue (\fBktxHashList\fP * pHead, const char * key, unsigned int * pValueLen, void ** ppValue)" + +.PP +Looks up a key in a hash list and returns the value\&. +.PP +\fBParameters\fP +.RS 4 +\fIpHead\fP pointer to the head of the target hash list\&. +.br +\fIkey\fP pointer to a UTF8 NUL-terminated string to find\&. +.br +\fIpValueLen\fP \fR*pValueLen\fP is set to the number of bytes of data in the returned value\&. +.br +\fIppValue\fP \fR*ppValue\fP is set to the point to the value for \fRkey\fP\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS or one of the following error codes\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP if \fRThis\fP, \fRkey\fP or \fRpValueLen\fP or \fRppValue\fP is NULL\&. +.br +\fI\fBKTX_NOT_FOUND\fP\fP an entry matching \fRkey\fP was not found\&. +.RE +.PP + +.SS "\fBktxHashListEntry\fP * ktxHashList_Next (\fBktxHashListEntry\fP * entry)" + +.PP +Returns the next entry in a \fBktxHashList\fP\&. Use for iterating through the list: +.PP +.nf +ktxHashListEntry* entry; +for (entry = listHead; entry != NULL; entry = ktxHashList_Next(entry)) { + \&.\&.\&. +}; + +.fi +.PP + +.PP +Note + +.PP +\fBParameters\fP +.RS 4 +\fIentry\fP pointer to a hash list entry\&. Note that a ktxHashList*, i\&.e\&. the list head, is also a pointer to an entry so can be passed to this function\&. +.RE +.PP +\fBReturns\fP +.RS 4 +a pointer to the next entry or NULL\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxHashList_Serialize (\fBktxHashList\fP * pHead, unsigned int * pKvdLen, unsigned char ** ppKvd)" + +.PP +Serialize a hash list to a block of data suitable for writing to a file\&. The caller is responsible for freeing the data block returned by this function\&. + +.PP +\fBParameters\fP +.RS 4 +\fIpHead\fP pointer to the head of the target hash list\&. +.br +\fIpKvdLen\fP \fR*pKvdLen\fP is set to the number of bytes of data in the returned data block\&. +.br +\fIppKvd\fP \fR*ppKvd\fP is set to the point to the block of memory containing the serialized data or NULL\&. if the hash list is empty\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS or one of the following error codes\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP if \fRThis\fP, \fRpKvdLen\fP or \fRppKvd\fP is NULL\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP there was not enough memory to serialize the data\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxHashList_Sort (\fBktxHashList\fP * pHead)" + +.PP +Sort a hash list in order of the UTF8 codepoints\&. +.PP +\fBParameters\fP +.RS 4 +\fIpHead\fP pointer to the head of the target hash list\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS or one of the following error codes\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP if \fRThis\fP is NULL\&. +.RE +.PP + + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxHashListEntry.3 b/ktx/build/docs/man/man3/ktxHashListEntry.3 new file mode 100644 index 0000000..7e5bb32 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashListEntry.3 @@ -0,0 +1,82 @@ +.TH "ktxHashListEntry" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxHashListEntry \- Opaque handle to an entry in a \fBktxHashList\fP\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxHashListEntry_GetKey\fP (\fBktxHashListEntry\fP *This, unsigned int *pKeyLen, char **ppKey)" +.br +.RI "Return the key of a \fBktxHashListEntry\fP\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxHashListEntry_GetValue\fP (\fBktxHashListEntry\fP *This, unsigned int *pValueLen, void **ppValue)" +.br +.RI "Return the value from a \fBktxHashListEntry\fP\&. " +.in -1c +.SH "Detailed Description" +.PP +Opaque handle to an entry in a \fBktxHashList\fP\&. +.SH "Member Function Documentation" +.PP +.SS "\fBKTX_error_code\fP ktxHashListEntry_GetKey (\fBktxHashListEntry\fP * This, unsigned int * pKeyLen, char ** ppKey)" + +.PP +Return the key of a \fBktxHashListEntry\fP\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP The target hash list entry\&. +.br +\fIpKeyLen\fP \fR*pKeyLen\fP is set to the byte length of the returned key\&. +.br +\fIppKey\fP \fR*ppKey\fP is set to the point to the value of \fRthe\fP key\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS or one of the following error codes\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP if \fRpKvd\fP or \fRpHt\fP is NULL or kvdLen == 0\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxHashListEntry_GetValue (\fBktxHashListEntry\fP * This, unsigned int * pValueLen, void ** ppValue)" + +.PP +Return the value from a \fBktxHashListEntry\fP\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP The target hash list entry\&. +.br +\fIpValueLen\fP \fR*pValueLen\fP is set to the number of bytes of data in the returned value\&. +.br +\fIppValue\fP \fR*ppValue\fP is set to point to the value of of the target entry\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS or one of the following error codes\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP if \fRpKvd\fP or \fRpHt\fP is NULL or kvdLen == 0\&. +.RE +.PP + + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxHashListEntry_GetKey.3 b/ktx/build/docs/man/man3/ktxHashListEntry_GetKey.3 new file mode 100644 index 0000000..36e80dd --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashListEntry_GetKey.3 @@ -0,0 +1 @@ +.so man3/ktxHashListEntry.3 diff --git a/ktx/build/docs/man/man3/ktxHashListEntry_GetValue.3 b/ktx/build/docs/man/man3/ktxHashListEntry_GetValue.3 new file mode 100644 index 0000000..36e80dd --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashListEntry_GetValue.3 @@ -0,0 +1 @@ +.so man3/ktxHashListEntry.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_AddKVPair.3 b/ktx/build/docs/man/man3/ktxHashList_AddKVPair.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_AddKVPair.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_Construct.3 b/ktx/build/docs/man/man3/ktxHashList_Construct.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_Construct.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_ConstructCopy.3 b/ktx/build/docs/man/man3/ktxHashList_ConstructCopy.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_ConstructCopy.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_Create.3 b/ktx/build/docs/man/man3/ktxHashList_Create.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_Create.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_CreateCopy.3 b/ktx/build/docs/man/man3/ktxHashList_CreateCopy.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_CreateCopy.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_DeleteEntry.3 b/ktx/build/docs/man/man3/ktxHashList_DeleteEntry.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_DeleteEntry.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_DeleteKVPair.3 b/ktx/build/docs/man/man3/ktxHashList_DeleteKVPair.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_DeleteKVPair.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_Deserialize.3 b/ktx/build/docs/man/man3/ktxHashList_Deserialize.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_Deserialize.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_Destroy.3 b/ktx/build/docs/man/man3/ktxHashList_Destroy.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_Destroy.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_Destruct.3 b/ktx/build/docs/man/man3/ktxHashList_Destruct.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_Destruct.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_FindEntry.3 b/ktx/build/docs/man/man3/ktxHashList_FindEntry.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_FindEntry.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_FindValue.3 b/ktx/build/docs/man/man3/ktxHashList_FindValue.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_FindValue.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_Next.3 b/ktx/build/docs/man/man3/ktxHashList_Next.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_Next.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_Serialize.3 b/ktx/build/docs/man/man3/ktxHashList_Serialize.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_Serialize.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxHashList_Sort.3 b/ktx/build/docs/man/man3/ktxHashList_Sort.3 new file mode 100644 index 0000000..c72f45d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxHashList_Sort.3 @@ -0,0 +1 @@ +.so man3/ktxHashList.3 diff --git a/ktx/build/docs/man/man3/ktxLoadOpenGL.3 b/ktx/build/docs/man/man3/ktxLoadOpenGL.3 new file mode 100644 index 0000000..2427121 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxLoadOpenGL.3 @@ -0,0 +1 @@ +.so man3/ktx_glloader.3 diff --git a/ktx/build/docs/man/man3/ktxMemStream_construct.3 b/ktx/build/docs/man/man3/ktxMemStream_construct.3 new file mode 100644 index 0000000..06b1d3b --- /dev/null +++ b/ktx/build/docs/man/man3/ktxMemStream_construct.3 @@ -0,0 +1 @@ +.so man3/memstream.c.3 diff --git a/ktx/build/docs/man/man3/ktxMemStream_construct_ro.3 b/ktx/build/docs/man/man3/ktxMemStream_construct_ro.3 new file mode 100644 index 0000000..06b1d3b --- /dev/null +++ b/ktx/build/docs/man/man3/ktxMemStream_construct_ro.3 @@ -0,0 +1 @@ +.so man3/memstream.c.3 diff --git a/ktx/build/docs/man/man3/ktxMemStream_destruct.3 b/ktx/build/docs/man/man3/ktxMemStream_destruct.3 new file mode 100644 index 0000000..06b1d3b --- /dev/null +++ b/ktx/build/docs/man/man3/ktxMemStream_destruct.3 @@ -0,0 +1 @@ +.so man3/memstream.c.3 diff --git a/ktx/build/docs/man/man3/ktxMemStream_getdata.3 b/ktx/build/docs/man/man3/ktxMemStream_getdata.3 new file mode 100644 index 0000000..06b1d3b --- /dev/null +++ b/ktx/build/docs/man/man3/ktxMemStream_getdata.3 @@ -0,0 +1 @@ +.so man3/memstream.c.3 diff --git a/ktx/build/docs/man/man3/ktxMemStream_setup.3 b/ktx/build/docs/man/man3/ktxMemStream_setup.3 new file mode 100644 index 0000000..06b1d3b --- /dev/null +++ b/ktx/build/docs/man/man3/ktxMemStream_setup.3 @@ -0,0 +1 @@ +.so man3/memstream.c.3 diff --git a/ktx/build/docs/man/man3/ktxOrientation.3 b/ktx/build/docs/man/man3/ktxOrientation.3 new file mode 100644 index 0000000..0a9f0ac --- /dev/null +++ b/ktx/build/docs/man/man3/ktxOrientation.3 @@ -0,0 +1,39 @@ +.TH "ktxOrientation" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxOrientation \- Struct describing the logical orientation of an image\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Data Fields" + +.in +1c +.ti -1c +.RI "ktxOrientationX \fBx\fP" +.br +.ti -1c +.RI "ktxOrientationY \fBy\fP" +.br +.ti -1c +.RI "ktxOrientationZ \fBz\fP" +.br +.in -1c +.SH "Detailed Description" +.PP +Struct describing the logical orientation of an image\&. +.SH "Field Documentation" +.PP +.SS "ktxOrientationX x" +Orientation in X +.SS "ktxOrientationY y" +Orientation in Y +.SS "ktxOrientationZ z" +Orientation in Z + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxResult.3 b/ktx/build/docs/man/man3/ktxResult.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxResult.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxStream.3 b/ktx/build/docs/man/man3/ktxStream.3 new file mode 100644 index 0000000..4a34f8c --- /dev/null +++ b/ktx/build/docs/man/man3/ktxStream.3 @@ -0,0 +1,125 @@ +.TH "ktxStream" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxStream \- Interface of \fBktxStream\fP\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Data Fields" + +.in +1c +.ti -1c +.RI "\fBktxStream_read\fP \fBread\fP" +.br +.ti -1c +.RI "\fBktxStream_skip\fP \fBskip\fP" +.br +.ti -1c +.RI "\fBktxStream_write\fP \fBwrite\fP" +.br +.ti -1c +.RI "\fBktxStream_getpos\fP \fBgetpos\fP" +.br +.ti -1c +.RI "\fBktxStream_setpos\fP \fBsetpos\fP" +.br +.ti -1c +.RI "\fBktxStream_getsize\fP \fBgetsize\fP" +.br +.ti -1c +.RI "\fBktxStream_destruct\fP \fBdestruct\fP" +.br +.ti -1c +.RI "union {" +.br +.ti -1c +.RI " FILE * \fBfile\fP" +.br +.ti -1c +.RI " ktxMem * \fBmem\fP" +.br +.ti -1c +.RI " struct {" +.br +.ti -1c +.RI " void * \fBaddress\fP" +.br +.ti -1c +.RI " void * \fBallocatorAddress\fP" +.br +.ti -1c +.RI " ktx_size_t \fBsize\fP" +.br +.ti -1c +.RI " } \fBcustom_ptr\fP" +.br +.ti -1c +.RI "} \fBdata\fP" +.br +.ti -1c +.RI "ktx_off_t \fBreadpos\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBcloseOnDestruct\fP" +.br +.in -1c +.SH "Detailed Description" +.PP +Interface of \fBktxStream\fP\&. + + +.PP +\fBAuthor\fP +.RS 4 +Maksim Kolesin + +.PP +Georg Kolling, Imagination Technology + +.PP +Mark Callow, HI Corporation +.RE +.PP + +.SH "Field Documentation" +.PP +.SS "void* address" +pointer to the data\&. +.SS "void* allocatorAddress" +pointer to a memory allocator\&. +.SS "ktx_bool_t closeOnDestruct" +Close FILE* or dispose of memory on destruct\&. +.SS "struct { \&.\&.\&. } custom_ptr" +pointer to a struct for custom streams\&. +.SS "union { \&.\&.\&. } data" +pointer to the stream data\&. +.SS "\fBktxStream_destruct\fP destruct" +destruct the stream\&. +.SS "FILE* file" +a stdio FILE pointer for a ktxFileStream\&. +.SS "\fBktxStream_getpos\fP getpos" +pointer to function for getting current position in stream\&. +.SS "\fBktxStream_getsize\fP getsize" +pointer to function for querying size\&. +.SS "ktxMem* mem" +a pointer to a ktxMem struct for a ktxMemStream\&. +.SS "\fBktxStream_read\fP read" +pointer to function for reading bytes\&. +.SS "ktx_off_t readpos" +used by FileStream for stdin\&. +.SS "\fBktxStream_setpos\fP setpos" +pointer to function for setting current position in stream\&. +.SS "ktx_size_t size" +size of the data\&. +.SS "\fBktxStream_skip\fP skip" +pointer to function for skipping bytes\&. +.SS "\fBktxStream_write\fP write" +pointer to function for writing bytes\&. + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxStream_destruct.3 b/ktx/build/docs/man/man3/ktxStream_destruct.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxStream_destruct.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxStream_getpos.3 b/ktx/build/docs/man/man3/ktxStream_getpos.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxStream_getpos.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxStream_getsize.3 b/ktx/build/docs/man/man3/ktxStream_getsize.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxStream_getsize.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxStream_read.3 b/ktx/build/docs/man/man3/ktxStream_read.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxStream_read.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxStream_setpos.3 b/ktx/build/docs/man/man3/ktxStream_setpos.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxStream_setpos.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxStream_skip.3 b/ktx/build/docs/man/man3/ktxStream_skip.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxStream_skip.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxStream_write.3 b/ktx/build/docs/man/man3/ktxStream_write.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxStream_write.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxSupercmpScheme.3 b/ktx/build/docs/man/man3/ktxSupercmpScheme.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxSupercmpScheme.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxSupercompressionSchemeString.3 b/ktx/build/docs/man/man3/ktxSupercompressionSchemeString.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxSupercompressionSchemeString.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture.3 b/ktx/build/docs/man/man3/ktxTexture.3 new file mode 100644 index 0000000..6425e40 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture.3 @@ -0,0 +1,299 @@ +.TH "ktxTexture" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxTexture \- Base class representing a texture\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "enum \fBktxTextureCreateStorageEnum\fP " +.br +.RI "Enum for requesting, or not, allocation of storage for images\&. " +.ti -1c +.RI "enum \fBktxTextureCreateFlagBits\fP " +.br +.RI "Flags for requesting services during creation\&. " +.ti -1c +.RI "typedef \fBKTX_error_code\fP(* \fBPFNKTXITERCB\fP) (int miplevel, int face, int width, int height, int depth, ktx_uint64_t faceLodSize, void *pixels, void *userdata)" +.br +.RI "Signature of function called by the \fRktxTexture_Iterate*\fP functions to receive image data\&. " +.ti -1c +.RI "typedef ktx_uint32_t \fBktxTextureCreateFlags\fP" +.br +.RI "Type for TextureCreateFlags parameters\&. " +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_GLUpload\fP (\fBktxTexture\fP *This, GLuint *pTexture, GLenum *pTarget, GLenum *pGlerror)" +.br +.RI "Create a GL texture object from a \fBktxTexture\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_CreateFromStream\fP (\fBktxStream\fP *pStream, \fBktxTextureCreateFlags\fP createFlags, \fBktxTexture\fP **newTex)" +.br +.RI "Create a ktx1 or ktx2 texture according to the stream data\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_CreateFromStdioStream\fP (FILE *stdioStream, \fBktxTextureCreateFlags\fP createFlags, \fBktxTexture\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP or \fBktxTexture2\fP from a stdio stream according to the stream data\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_CreateFromNamedFile\fP (const char *const filename, \fBktxTextureCreateFlags\fP createFlags, \fBktxTexture\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP or \fBktxTexture2\fP from a named KTX file according to the file contents\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_CreateFromMemory\fP (const ktx_uint8_t *bytes, ktx_size_t size, \fBktxTextureCreateFlags\fP createFlags, \fBktxTexture\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP or \fBktxTexture2\fP from KTX-formatted data in memory according to the data contents\&. " +.ti -1c +.RI "ktx_uint8_t * \fBktxTexture_GetData\fP (\fBktxTexture\fP *This)" +.br +.RI "Return a pointer to the texture image data\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture_GetDataSize\fP (\fBktxTexture\fP *This)" +.br +.RI "Return the total size of the texture image data in bytes\&. " +.ti -1c +.RI "ktx_uint32_t \fBktxTexture_GetElementSize\fP (\fBktxTexture\fP *This)" +.br +.RI "Return the size in bytes of an elements of a texture's images\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_IterateLevelFaces\fP (\fBktxTexture\fP *This, \fBPFNKTXITERCB\fP iterCb, void *userdata)" +.br +.RI "Iterate over the levels or faces in a \fBktxTexture\fP object\&. " +.ti -1c +.RI "ktx_uint32_t \fBktxTexture_GetRowPitch\fP (\fBktxTexture\fP *This, ktx_uint32_t level)" +.br +.RI "Return pitch between rows of a texture image level in bytes\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_VkUploadEx_WithSuballocator\fP (\fBktxTexture\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, \fBktxVulkanTexture_subAllocatorCallbacks\fP *subAllocatorCallbacks)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_VkUploadEx\fP (\fBktxTexture\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_VkUpload\fP (\fBktxTexture\fP *texture, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture\fP object\&. " +.ti -1c +.RI "VkFormat \fBktxTexture_GetVkFormat\fP (\fBktxTexture\fP *This)" +.br +.RI "Return the VkFormat enum of a \fBktxTexture\fP object\&. " +.in -1c +.SS "Data Fields" + +.in +1c +.ti -1c +.RI "class_id \fBclassId\fP" +.br +.RI "Identify the class type\&. " +.ti -1c +.RI "struct \fBktxTexture_vtbl\fP * \fBvtbl\fP" +.br +.RI "Pointer to the class's vtble\&. " +.ti -1c +.RI "struct ktxTexture_vvtbl * \fBvvtbl\fP" +.br +.RI "Pointer to the class's vtble for Vulkan functions\&. " +.ti -1c +.RI "struct ktxTexture_protected * \fB_protected\fP" +.br +.RI "Opaque pointer to the class's protected variables\&. " +.ti -1c +.RI "ktx_bool_t \fBisArray\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBisCubemap\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBisCompressed\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBgenerateMipmaps\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBbaseWidth\fP" +.br +.RI "Width of the texture's base level\&. " +.ti -1c +.RI "ktx_uint32_t \fBbaseHeight\fP" +.br +.RI "Height of the texture's base level\&. " +.ti -1c +.RI "ktx_uint32_t \fBbaseDepth\fP" +.br +.RI "Depth of the texture's base level\&. " +.ti -1c +.RI "ktx_uint32_t \fBnumDimensions\fP" +.br +.RI "Number of dimensions in the texture: 1, 2 or 3\&. " +.ti -1c +.RI "ktx_uint32_t \fBnumLevels\fP" +.br +.RI "Number of mip levels in the texture\&. " +.ti -1c +.RI "ktx_uint32_t \fBnumFaces\fP" +.br +.RI "Number of faces: 6 for cube maps, 1 otherwise\&. " +.ti -1c +.RI "struct {" +.br +.ti -1c +.RI "} \fBorientation\fP" +.br +.RI "Describes the logical orientation of the images in each dimension\&. " +.ti -1c +.RI "\fBktxHashList\fP \fBkvDataHead\fP" +.br +.RI "Head of the hash list of metadata\&. " +.ti -1c +.RI "ktx_uint32_t \fBkvDataLen\fP" +.br +.RI "Length of the metadata, if it has been extracted in its raw form, otherwise 0\&. " +.ti -1c +.RI "ktx_uint8_t * \fBkvData\fP" +.br +.RI "Pointer to the metadata, if it has been extracted in its raw form, otherwise NULL\&. " +.ti -1c +.RI "ktx_size_t \fBdataSize\fP" +.br +.RI "Byte length of the texture's uncompressed image data\&. " +.ti -1c +.RI "ktx_uint8_t * \fBpData\fP" +.br +.RI "Pointer to the start of the image data\&. " +.in -1c +.SH "Detailed Description" +.PP +Base class representing a texture\&. + +ktxTextures should be created only by one of the provided functions and these fields should be considered read-only\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP, and \fBvkload\&.cpp\fP\&. +.SH "Member Typedef Documentation" +.PP +.SS "typedef ktx_uint32_t \fBktxTextureCreateFlags\fP" + +.PP +Type for TextureCreateFlags parameters\&. +.PP +\fBSee also\fP +.RS 4 +ktxTexture_CreateFrom*() +.RE +.PP + +.SS "typedef \fBKTX_error_code\fP(* PFNKTXITERCB) (int miplevel, int face, int width, int height, int depth, ktx_uint64_t faceLodSize, void *pixels, void *userdata)" + +.PP +Signature of function called by the \fRktxTexture_Iterate*\fP functions to receive image data\&. The function parameters are used to pass values which change for each image\&. Obtain values which are uniform across all images from the \fR\fBktxTexture\fP\fP object\&. + +.PP +\fBParameters\fP +.RS 4 +\fImiplevel\fP MIP level from 0 to the max level which is dependent on the texture size\&. +.br +\fIface\fP usually 0; for cube maps, one of the 6 cube faces in the order +X, -X, +Y, -Y, +Z, -Z, 0 to 5\&. +.br +\fIwidth\fP width of the image\&. +.br +\fIheight\fP height of the image or, for 1D textures textures, 1\&. +.br +\fIdepth\fP depth of the image or, for 1D & 2D textures, 1\&. +.br +\fIfaceLodSize\fP number of bytes of data pointed at by \fRpixels\fP\&. +.br +\fIpixels\fP pointer to the image data\&. +.br +\fIuserdata\fP pointer for the application to pass data to and from the callback function\&. +.RE +.PP + +.SH "Member Enumeration Documentation" +.PP +.SS "enum \fBktxTextureCreateFlagBits\fP" + +.PP +Flags for requesting services during creation\&. +.PP +\fBSee also\fP +.RS 4 +ktxTexture_CreateFrom* +.RE +.PP + +.SS "enum \fBktxTextureCreateStorageEnum\fP" + +.PP +Enum for requesting, or not, allocation of storage for images\&. +.PP +\fBSee also\fP +.RS 4 +ktxTexture1_Create() and ktxTexture2_Create()\&. +.RE +.PP + +.SH "Field Documentation" +.PP +.SS "class_id classId" + +.PP +Identify the class type\&. Since there are no public \fBktxTexture\fP constructors, this can only have values of ktxTexture1_c or ktxTexture2_c\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. +.SS "ktx_bool_t generateMipmaps" +KTX_TRUE if mipmaps should be generated for the texture by \fBktxTexture_GLUpload()\fP or \fBktxTexture_VkUpload()\fP\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. +.SS "ktx_bool_t isArray" +KTX_TRUE if the texture is an array texture, i\&.e, a GL_TEXTURE_*_ARRAY target is to be used\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. +.SS "ktx_bool_t isCompressed" +KTX_TRUE if the texture's format is a block compressed format\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. +.SS "ktx_bool_t isCubemap" +KTX_TRUE if the texture is a cubemap or cubemap array\&. +.SS "ktx_uint32_t numLevels" + +.PP +Number of mip levels in the texture\&. Number of array layers in the texture\&. + +.PP +Must be 1, if \fRgenerateMipmaps\fP is KTX_TRUE\&. Can be less than a full pyramid but always starts at the base level\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. +.SS "struct { \&.\&.\&. } orientation" + +.PP +Describes the logical orientation of the images in each dimension\&. ktxOrientationX for X, ktxOrientationY for Y and ktxOrientationZ for Z\&. +.SS "struct ktxTexture_vvtbl* vvtbl" + +.PP +Pointer to the class's vtble for Vulkan functions\&. A separate vtble is used so this header does not need to include vulkan\&.h\&. + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxTexture1.3 b/ktx/build/docs/man/man3/ktxTexture1.3 new file mode 100644 index 0000000..909fbdc --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1.3 @@ -0,0 +1,187 @@ +.TH "ktxTexture1" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxTexture1 \- Class representing a KTX version 1 format texture\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_GLUpload\fP (\fBktxTexture1\fP *This, GLuint *pTexture, GLenum *pTarget, GLenum *pGlerror)" +.br +.RI "Create a GL texture object from a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_Create\fP (const \fBktxTextureCreateInfo\fP *const createInfo, ktxTextureCreateStorageEnum storageAllocation, \fBktxTexture1\fP **newTex)" +.br +.RI "Create a new empty \fBktxTexture1\fP\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_CreateFromStdioStream\fP (FILE *stdioStream, ktxTextureCreateFlags createFlags, \fBktxTexture1\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP from a stdio stream reading from a KTX source\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_CreateFromNamedFile\fP (const char *const filename, ktxTextureCreateFlags createFlags, \fBktxTexture1\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP from a named KTX file\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_CreateFromMemory\fP (const ktx_uint8_t *bytes, ktx_size_t size, ktxTextureCreateFlags createFlags, \fBktxTexture1\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP from KTX-formatted data in memory\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_CreateFromStream\fP (\fBktxStream\fP *pStream, ktxTextureCreateFlags createFlags, \fBktxTexture1\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP from KTX-formatted data from a \fR\fBktxStream\fP\fP\&. " +.ti -1c +.RI "void \fBktxTexture1_Destroy\fP (\fBktxTexture1\fP *This)" +.br +.RI "Destroy a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_GetImageOffset\fP (\fBktxTexture1\fP *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, ktx_size_t *pOffset)" +.br +.RI "Find the offset of an image within a \fBktxTexture\fP's image data\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture1_GetDataSizeUncompressed\fP (\fBktxTexture1\fP *This)" +.br +.RI "Return the total size in bytes of the uncompressed data of a \fBktxTexture1\fP\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture1_GetImageSize\fP (\fBktxTexture1\fP *This, ktx_uint32_t level)" +.br +.RI "Calculate & return the size in bytes of an image at the specified mip level\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture1_GetLevelSize\fP (\fBktxTexture1\fP *This, ktx_uint32_t level)" +.br +.RI "Calculate & return the size in bytes of all the images in the specified mip level\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_IterateLevels\fP (\fBktxTexture1\fP *This, PFNKTXITERCB iterCb, void *userdata)" +.br +.RI "Iterate over the mip levels in a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_IterateLoadLevelFaces\fP (\fBktxTexture1\fP *This, PFNKTXITERCB iterCb, void *userdata)" +.br +.RI "Iterate over the images in a \fBktxTexture1\fP object while loading the image data\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_LoadImageData\fP (\fBktxTexture1\fP *This, ktx_uint8_t *pBuffer, ktx_size_t bufSize)" +.br +.RI "Load all the image data from the \fBktxTexture1\fP's source\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_VkUploadEx_WithSuballocator\fP (\fBktxTexture1\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, \fBktxVulkanTexture_subAllocatorCallbacks\fP *subAllocatorCallbacks)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_VkUploadEx\fP (\fBktxTexture1\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_VkUpload\fP (\fBktxTexture1\fP *texture, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "VkFormat \fBktxTexture1_GetVkFormat\fP (\fBktxTexture1\fP *This)" +.br +.RI "Return the VkFormat enum of a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_SetImageFromStdioStream\fP (\fBktxTexture1\fP *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, FILE *src, ktx_size_t srcSize)" +.br +.RI "Set image for level, layer, faceSlice from a stdio stream source\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_SetImageFromMemory\fP (\fBktxTexture1\fP *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, const ktx_uint8_t *src, ktx_size_t srcSize)" +.br +.RI "Set image for level, layer, faceSlice from an image in memory\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteToStream\fP (\fBktxTexture1\fP *This, \fBktxStream\fP *dststr)" +.br +.RI "Write a \fBktxTexture\fP object to a \fBktxStream\fP in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteToStdioStream\fP (\fBktxTexture1\fP *This, FILE *dstsstr)" +.br +.RI "Write a \fBktxTexture\fP object to a stdio stream in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteToNamedFile\fP (\fBktxTexture1\fP *This, const char *const dstname)" +.br +.RI "Write a \fBktxTexture\fP object to a named file in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteToMemory\fP (\fBktxTexture1\fP *This, ktx_uint8_t **ppDstBytes, ktx_size_t *pSize)" +.br +.RI "Write a \fBktxTexture\fP object to block of memory in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteKTX2ToStream\fP (\fBktxTexture1\fP *This, \fBktxStream\fP *dststr)" +.br +.RI "Write a \fBktxTexture\fP object to a \fBktxStream\fP in KTX 2 format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteKTX2ToStdioStream\fP (\fBktxTexture1\fP *This, FILE *dstsstr)" +.br +.RI "Write a \fBktxTexture\fP object to a stdio stream in KTX2 format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteKTX2ToNamedFile\fP (\fBktxTexture1\fP *This, const char *const dstname)" +.br +.RI "Write a \fBktxTexture\fP object to a named file in KTX2 format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteKTX2ToMemory\fP (\fBktxTexture1\fP *This, ktx_uint8_t **ppDstBytes, ktx_size_t *pSize)" +.br +.RI "Write a \fBktxTexture\fP object to block of memory in KTX2 format\&. " +.in -1c +.SS "Data Fields" + +.in +1c +.ti -1c +.RI "ktx_uint32_t \fBglFormat\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBglInternalformat\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBglBaseInternalformat\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBglType\fP" +.br +.ti -1c +.RI "struct ktxTexture1_private * \fB_private\fP" +.br +.in -1c +.SH "Detailed Description" +.PP +Class representing a KTX version 1 format texture\&. + +ktxTextures should be created only by one of the ktxTexture_Create* functions and these fields should be considered read-only\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. +.SH "Field Documentation" +.PP +.SS "struct ktxTexture1_private* _private" +Private data\&. +.SS "ktx_uint32_t glBaseInternalformat" +Base format of the texture data, e\&.g\&., GL_RGB\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. +.SS "ktx_uint32_t glFormat" +Format of the texture data, e\&.g\&., GL_RGB\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. +.SS "ktx_uint32_t glInternalformat" +Internal format of the texture data, e\&.g\&., GL_RGB8\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. +.SS "ktx_uint32_t glType" +Type of the texture data, e\&.g, GL_UNSIGNED_BYTE\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxTexture1_Create.3 b/ktx/build/docs/man/man3/ktxTexture1_Create.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_Create.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_CreateFromMemory.3 b/ktx/build/docs/man/man3/ktxTexture1_CreateFromMemory.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_CreateFromMemory.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_CreateFromNamedFile.3 b/ktx/build/docs/man/man3/ktxTexture1_CreateFromNamedFile.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_CreateFromNamedFile.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_CreateFromStdioStream.3 b/ktx/build/docs/man/man3/ktxTexture1_CreateFromStdioStream.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_CreateFromStdioStream.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_CreateFromStream.3 b/ktx/build/docs/man/man3/ktxTexture1_CreateFromStream.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_CreateFromStream.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_Destroy.3 b/ktx/build/docs/man/man3/ktxTexture1_Destroy.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_Destroy.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_GLUpload.3 b/ktx/build/docs/man/man3/ktxTexture1_GLUpload.3 new file mode 100644 index 0000000..2427121 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_GLUpload.3 @@ -0,0 +1 @@ +.so man3/ktx_glloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_GetDataSizeUncompressed.3 b/ktx/build/docs/man/man3/ktxTexture1_GetDataSizeUncompressed.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_GetDataSizeUncompressed.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_GetImageOffset.3 b/ktx/build/docs/man/man3/ktxTexture1_GetImageOffset.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_GetImageOffset.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_GetImageSize.3 b/ktx/build/docs/man/man3/ktxTexture1_GetImageSize.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_GetImageSize.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_GetLevelSize.3 b/ktx/build/docs/man/man3/ktxTexture1_GetLevelSize.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_GetLevelSize.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_GetVkFormat.3 b/ktx/build/docs/man/man3/ktxTexture1_GetVkFormat.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_GetVkFormat.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_IterateLevels.3 b/ktx/build/docs/man/man3/ktxTexture1_IterateLevels.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_IterateLevels.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_IterateLoadLevelFaces.3 b/ktx/build/docs/man/man3/ktxTexture1_IterateLoadLevelFaces.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_IterateLoadLevelFaces.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_LoadImageData.3 b/ktx/build/docs/man/man3/ktxTexture1_LoadImageData.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_LoadImageData.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_SetImageFromMemory.3 b/ktx/build/docs/man/man3/ktxTexture1_SetImageFromMemory.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_SetImageFromMemory.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_SetImageFromStdioStream.3 b/ktx/build/docs/man/man3/ktxTexture1_SetImageFromStdioStream.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_SetImageFromStdioStream.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_VkUpload.3 b/ktx/build/docs/man/man3/ktxTexture1_VkUpload.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_VkUpload.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_VkUploadEx.3 b/ktx/build/docs/man/man3/ktxTexture1_VkUploadEx.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_VkUploadEx.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_VkUploadEx_WithSuballocator.3 b/ktx/build/docs/man/man3/ktxTexture1_VkUploadEx_WithSuballocator.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_VkUploadEx_WithSuballocator.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_WriteKTX2ToMemory.3 b/ktx/build/docs/man/man3/ktxTexture1_WriteKTX2ToMemory.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_WriteKTX2ToMemory.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_WriteKTX2ToNamedFile.3 b/ktx/build/docs/man/man3/ktxTexture1_WriteKTX2ToNamedFile.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_WriteKTX2ToNamedFile.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_WriteKTX2ToStdioStream.3 b/ktx/build/docs/man/man3/ktxTexture1_WriteKTX2ToStdioStream.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_WriteKTX2ToStdioStream.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_WriteKTX2ToStream.3 b/ktx/build/docs/man/man3/ktxTexture1_WriteKTX2ToStream.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_WriteKTX2ToStream.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_WriteToMemory.3 b/ktx/build/docs/man/man3/ktxTexture1_WriteToMemory.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_WriteToMemory.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_WriteToNamedFile.3 b/ktx/build/docs/man/man3/ktxTexture1_WriteToNamedFile.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_WriteToNamedFile.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_WriteToStdioStream.3 b/ktx/build/docs/man/man3/ktxTexture1_WriteToStdioStream.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_WriteToStdioStream.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture1_WriteToStream.3 b/ktx/build/docs/man/man3/ktxTexture1_WriteToStream.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture1_WriteToStream.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2.3 b/ktx/build/docs/man/man3/ktxTexture2.3 new file mode 100644 index 0000000..c80df40 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2.3 @@ -0,0 +1,215 @@ +.TH "ktxTexture2" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxTexture2 \- Class representing a KTX version 2 format texture\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CompressAstcEx\fP (\fBktxTexture2\fP *This, \fBktxAstcParams\fP *params)" +.br +.RI "Encode and compress a ktx texture with uncompressed images to astc\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CompressAstc\fP (\fBktxTexture2\fP *This, ktx_uint32_t quality)" +.br +.RI "Encode and compress a ktx texture with uncompressed images to astc\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CompressBasisEx\fP (\fBktxTexture2\fP *This, \fBktxBasisParams\fP *params)" +.br +.RI "Encode and possibly Supercompress a KTX2 texture with uncompressed images\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CompressBasis\fP (\fBktxTexture2\fP *This, ktx_uint32_t quality)" +.br +.RI "Supercompress a KTX2 texture with uncompressed images\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_TranscodeBasis\fP (\fBktxTexture2\fP *This, \fBktx_transcode_fmt_e\fP outputFormat, ktx_transcode_flags transcodeFlags)" +.br +.RI "Transcode a KTX2 texture with BasisLZ/ETC1S or UASTC images\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_GLUpload\fP (\fBktxTexture2\fP *This, GLuint *pTexture, GLenum *pTarget, GLenum *pGlerror)" +.br +.RI "Create a GL texture object from a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_Create\fP (const \fBktxTextureCreateInfo\fP *const createInfo, ktxTextureCreateStorageEnum storageAllocation, \fBktxTexture2\fP **newTex)" +.br +.RI "Create a new empty \fBktxTexture2\fP\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CreateCopy\fP (\fBktxTexture2\fP *orig, \fBktxTexture2\fP **newTex)" +.br +.RI "Create a \fBktxTexture2\fP by making a copy of a \fBktxTexture2\fP\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CreateFromStdioStream\fP (FILE *stdioStream, ktxTextureCreateFlags createFlags, \fBktxTexture2\fP **newTex)" +.br +.RI "Create a \fBktxTexture2\fP from a stdio stream reading from a KTX source\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CreateFromNamedFile\fP (const char *const filename, ktxTextureCreateFlags createFlags, \fBktxTexture2\fP **newTex)" +.br +.RI "Create a \fBktxTexture2\fP from a named KTX file\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CreateFromMemory\fP (const ktx_uint8_t *bytes, ktx_size_t size, ktxTextureCreateFlags createFlags, \fBktxTexture2\fP **newTex)" +.br +.RI "Create a \fBktxTexture2\fP from KTX-formatted data in memory\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CreateFromStream\fP (\fBktxStream\fP *stream, ktxTextureCreateFlags createFlags, \fBktxTexture2\fP **newTex)" +.br +.RI "Create a \fBktxTexture2\fP from KTX-formatted data from a stream\&. " +.ti -1c +.RI "void \fBktxTexture2_Destroy\fP (\fBktxTexture2\fP *This)" +.br +.RI "Destroy a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "void \fBktxTexture2_GetComponentInfo\fP (\fBktxTexture2\fP *This, uint32_t *pNumComponents, uint32_t *pComponentByteLength)" +.br +.RI "Return information about the components of an image in a texture\&. " +.ti -1c +.RI "ktx_uint32_t \fBktxTexture2_GetNumComponents\fP (\fBktxTexture2\fP *This)" +.br +.RI "Return the number of components in an image of the texture\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_GetImageOffset\fP (\fBktxTexture2\fP *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, ktx_size_t *pOffset)" +.br +.RI "Find the offset of an image within a \fBktxTexture\fP's image data\&. " +.ti -1c +.RI "khr_df_transfer_e \fBktxTexture2_GetTransferFunction_e\fP (\fBktxTexture2\fP *This)" +.br +.RI "Retrieve the transfer function of the images\&. " +.ti -1c +.RI "khr_df_transfer_e \fBktxTexture2_GetOETF_e\fP (\fBktxTexture2\fP *This)" +.br +.RI "Retrieve the transfer function of the images\&. " +.ti -1c +.RI "ktx_uint32_t \fBktxTexture2_GetOETF\fP (\fBktxTexture2\fP *This)" +.br +.RI "Retrieve the transfer function of the images\&. " +.ti -1c +.RI "khr_df_model_e \fBktxTexture2_GetColorModel_e\fP (\fBktxTexture2\fP *This)" +.br +.RI "Retrieve the DFD color model of the images\&. " +.ti -1c +.RI "ktx_bool_t \fBktxTexture2_GetPremultipliedAlpha\fP (\fBktxTexture2\fP *This)" +.br +.RI "Retrieve whether the RGB components have been premultiplied by the alpha component\&. " +.ti -1c +.RI "khr_df_primaries_e \fBktxTexture2_GetPrimaries_e\fP (\fBktxTexture2\fP *This)" +.br +.RI "Retrieve the color primaries of the images\&. " +.ti -1c +.RI "ktx_bool_t \fBktxTexture2_NeedsTranscoding\fP (\fBktxTexture2\fP *This)" +.br +.RI "Query if the images are in a transcodable format\&. " +.ti -1c +.RI "\fBktx_error_code_e\fP \fBktxTexture2_SetOETF\fP (\fBktxTexture2\fP *This, khr_df_transfer_e tf)" +.br +.RI "Set the transfer function for the images in a texture\&. " +.ti -1c +.RI "\fBktx_error_code_e\fP \fBktxTexture2_SetPrimaries\fP (\fBktxTexture2\fP *This, khr_df_primaries_e primaries)" +.br +.RI "Set the primaries for the images in a texture\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture2_GetDataSizeUncompressed\fP (\fBktxTexture2\fP *This)" +.br +.RI "Return the total size in bytes of the uncompressed data of a \fBktxTexture2\fP\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture2_GetImageSize\fP (\fBktxTexture2\fP *This, ktx_uint32_t level)" +.br +.RI "Calculate & return the size in bytes of an image at the specified mip level\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture2_GetLevelSize\fP (\fBktxTexture2\fP *This, ktx_uint32_t level)" +.br +.RI "Calculate & return the size in bytes of all the images in the specified mip level\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_IterateLevels\fP (\fBktxTexture2\fP *This, PFNKTXITERCB iterCb, void *userdata)" +.br +.RI "Iterate over the mip levels in a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_IterateLoadLevelFaces\fP (\fBktxTexture2\fP *This, PFNKTXITERCB iterCb, void *userdata)" +.br +.RI "Iterate over the images in a \fBktxTexture2\fP object while loading the image data\&. " +.ti -1c +.RI "\fBktx_error_code_e\fP \fBktxTexture2_LoadImageData\fP (\fBktxTexture2\fP *This, ktx_uint8_t *pBuffer, ktx_size_t bufSize)" +.br +.RI "Load all the image data from the \fBktxTexture2\fP's source\&. " +.ti -1c +.RI "\fBktx_error_code_e\fP \fBktxTexture2_LoadDeflatedImageData\fP (\fBktxTexture2\fP *This, ktx_uint8_t *pBuffer, ktx_size_t bufSize)" +.br +.RI "Load all the image data from the \fBktxTexture2\fP's source without inflatiion\&.\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_VkUploadEx_WithSuballocator\fP (\fBktxTexture2\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, \fBktxVulkanTexture_subAllocatorCallbacks\fP *subAllocatorCallbacks)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_VkUploadEx\fP (\fBktxTexture2\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_VkUpload\fP (\fBktxTexture2\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "VkFormat \fBktxTexture2_GetVkFormat\fP (\fBktxTexture2\fP *This)" +.br +.RI "Return the VkFormat enum of a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_SetImageFromStdioStream\fP (\fBktxTexture2\fP *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, FILE *src, ktx_size_t srcSize)" +.br +.RI "Set image for level, layer, faceSlice from a stdio stream source\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_SetImageFromMemory\fP (\fBktxTexture2\fP *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, const ktx_uint8_t *src, ktx_size_t srcSize)" +.br +.RI "Set image for level, layer, faceSlice from an image in memory\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_WriteToStream\fP (\fBktxTexture2\fP *This, \fBktxStream\fP *dststr)" +.br +.RI "Write a \fBktxTexture\fP object to a \fBktxStream\fP in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_WriteToStdioStream\fP (\fBktxTexture2\fP *This, FILE *dstsstr)" +.br +.RI "Write a \fBktxTexture\fP object to a stdio stream in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_WriteToNamedFile\fP (\fBktxTexture2\fP *This, const char *const dstname)" +.br +.RI "Write a \fBktxTexture\fP object to a named file in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_WriteToMemory\fP (\fBktxTexture2\fP *This, ktx_uint8_t **ppDstBytes, ktx_size_t *pSize)" +.br +.RI "Write a \fBktxTexture\fP object to block of memory in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_DeflateZstd\fP (\fBktxTexture2\fP *This, ktx_uint32_t compressionLevel)" +.br +.RI "Deflate the data in a \fBktxTexture2\fP object using Zstandard\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_DeflateZLIB\fP (\fBktxTexture2\fP *This, ktx_uint32_t compressionLevel)" +.br +.RI "Deflate the data in a \fBktxTexture2\fP object using miniz (ZLIB)\&. " +.in -1c +.SS "Data Fields" + +.in +1c +.ti -1c +.RI "struct ktxTexture2_private * \fB_private\fP" +.br +.in -1c +.SH "Detailed Description" +.PP +Class representing a KTX version 2 format texture\&. + +ktxTextures should be created only by one of the ktxTexture_Create* functions and these fields should be considered read-only\&. +.PP +\fBExamples\fP +.in +1c +\fBglloader\&.c\fP\&. +.SH "Field Documentation" +.PP +.SS "struct ktxTexture2_private* _private" +Private data\&. + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxTexture2_CompressAstc.3 b/ktx/build/docs/man/man3/ktxTexture2_CompressAstc.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_CompressAstc.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_CompressAstcEx.3 b/ktx/build/docs/man/man3/ktxTexture2_CompressAstcEx.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_CompressAstcEx.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_CompressBasis.3 b/ktx/build/docs/man/man3/ktxTexture2_CompressBasis.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_CompressBasis.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_CompressBasisEx.3 b/ktx/build/docs/man/man3/ktxTexture2_CompressBasisEx.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_CompressBasisEx.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_Create.3 b/ktx/build/docs/man/man3/ktxTexture2_Create.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_Create.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_CreateCopy.3 b/ktx/build/docs/man/man3/ktxTexture2_CreateCopy.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_CreateCopy.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_CreateFromMemory.3 b/ktx/build/docs/man/man3/ktxTexture2_CreateFromMemory.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_CreateFromMemory.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_CreateFromNamedFile.3 b/ktx/build/docs/man/man3/ktxTexture2_CreateFromNamedFile.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_CreateFromNamedFile.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_CreateFromStdioStream.3 b/ktx/build/docs/man/man3/ktxTexture2_CreateFromStdioStream.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_CreateFromStdioStream.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_CreateFromStream.3 b/ktx/build/docs/man/man3/ktxTexture2_CreateFromStream.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_CreateFromStream.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_DecodeAstc.3 b/ktx/build/docs/man/man3/ktxTexture2_DecodeAstc.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_DecodeAstc.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_DeflateZLIB.3 b/ktx/build/docs/man/man3/ktxTexture2_DeflateZLIB.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_DeflateZLIB.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_DeflateZstd.3 b/ktx/build/docs/man/man3/ktxTexture2_DeflateZstd.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_DeflateZstd.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_Destroy.3 b/ktx/build/docs/man/man3/ktxTexture2_Destroy.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_Destroy.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GLUpload.3 b/ktx/build/docs/man/man3/ktxTexture2_GLUpload.3 new file mode 100644 index 0000000..2427121 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GLUpload.3 @@ -0,0 +1 @@ +.so man3/ktx_glloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetColorModel_e.3 b/ktx/build/docs/man/man3/ktxTexture2_GetColorModel_e.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetColorModel_e.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetComponentInfo.3 b/ktx/build/docs/man/man3/ktxTexture2_GetComponentInfo.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetComponentInfo.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetDataSizeUncompressed.3 b/ktx/build/docs/man/man3/ktxTexture2_GetDataSizeUncompressed.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetDataSizeUncompressed.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetImageOffset.3 b/ktx/build/docs/man/man3/ktxTexture2_GetImageOffset.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetImageOffset.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetImageSize.3 b/ktx/build/docs/man/man3/ktxTexture2_GetImageSize.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetImageSize.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetLevelSize.3 b/ktx/build/docs/man/man3/ktxTexture2_GetLevelSize.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetLevelSize.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetNumComponents.3 b/ktx/build/docs/man/man3/ktxTexture2_GetNumComponents.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetNumComponents.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetOETF.3 b/ktx/build/docs/man/man3/ktxTexture2_GetOETF.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetOETF.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetOETF_e.3 b/ktx/build/docs/man/man3/ktxTexture2_GetOETF_e.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetOETF_e.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetPremultipliedAlpha.3 b/ktx/build/docs/man/man3/ktxTexture2_GetPremultipliedAlpha.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetPremultipliedAlpha.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetPrimaries_e.3 b/ktx/build/docs/man/man3/ktxTexture2_GetPrimaries_e.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetPrimaries_e.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetTransferFunction_e.3 b/ktx/build/docs/man/man3/ktxTexture2_GetTransferFunction_e.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetTransferFunction_e.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_GetVkFormat.3 b/ktx/build/docs/man/man3/ktxTexture2_GetVkFormat.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_GetVkFormat.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_IterateLevels.3 b/ktx/build/docs/man/man3/ktxTexture2_IterateLevels.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_IterateLevels.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_IterateLoadLevelFaces.3 b/ktx/build/docs/man/man3/ktxTexture2_IterateLoadLevelFaces.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_IterateLoadLevelFaces.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_LoadDeflatedImageData.3 b/ktx/build/docs/man/man3/ktxTexture2_LoadDeflatedImageData.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_LoadDeflatedImageData.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_LoadImageData.3 b/ktx/build/docs/man/man3/ktxTexture2_LoadImageData.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_LoadImageData.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_NeedsTranscoding.3 b/ktx/build/docs/man/man3/ktxTexture2_NeedsTranscoding.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_NeedsTranscoding.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_SetImageFromMemory.3 b/ktx/build/docs/man/man3/ktxTexture2_SetImageFromMemory.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_SetImageFromMemory.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_SetImageFromStdioStream.3 b/ktx/build/docs/man/man3/ktxTexture2_SetImageFromStdioStream.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_SetImageFromStdioStream.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_SetOETF.3 b/ktx/build/docs/man/man3/ktxTexture2_SetOETF.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_SetOETF.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_SetPrimaries.3 b/ktx/build/docs/man/man3/ktxTexture2_SetPrimaries.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_SetPrimaries.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_TranscodeBasis.3 b/ktx/build/docs/man/man3/ktxTexture2_TranscodeBasis.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_TranscodeBasis.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_VkUpload.3 b/ktx/build/docs/man/man3/ktxTexture2_VkUpload.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_VkUpload.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_VkUploadEx.3 b/ktx/build/docs/man/man3/ktxTexture2_VkUploadEx.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_VkUploadEx.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_VkUploadEx_WithSuballocator.3 b/ktx/build/docs/man/man3/ktxTexture2_VkUploadEx_WithSuballocator.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_VkUploadEx_WithSuballocator.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_WriteToMemory.3 b/ktx/build/docs/man/man3/ktxTexture2_WriteToMemory.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_WriteToMemory.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_WriteToNamedFile.3 b/ktx/build/docs/man/man3/ktxTexture2_WriteToNamedFile.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_WriteToNamedFile.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_WriteToStdioStream.3 b/ktx/build/docs/man/man3/ktxTexture2_WriteToStdioStream.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_WriteToStdioStream.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTexture2_WriteToStream.3 b/ktx/build/docs/man/man3/ktxTexture2_WriteToStream.3 new file mode 100644 index 0000000..83c8aaf --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture2_WriteToStream.3 @@ -0,0 +1 @@ +.so man3/writer.3 diff --git a/ktx/build/docs/man/man3/ktxTextureCreateFlagBits.3 b/ktx/build/docs/man/man3/ktxTextureCreateFlagBits.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTextureCreateFlagBits.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/ktxTextureCreateFlags.3 b/ktx/build/docs/man/man3/ktxTextureCreateFlags.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTextureCreateFlags.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/ktxTextureCreateInfo.3 b/ktx/build/docs/man/man3/ktxTextureCreateInfo.3 new file mode 100644 index 0000000..6f5fea6 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTextureCreateInfo.3 @@ -0,0 +1,96 @@ +.TH "ktxTextureCreateInfo" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxTextureCreateInfo \- Structure for passing texture information to ktxTexture1_Create() and ktxTexture2_Create()\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Data Fields" + +.in +1c +.ti -1c +.RI "ktx_uint32_t \fBglInternalformat\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBvkFormat\fP" +.br +.ti -1c +.RI "ktx_uint32_t * \fBpDfd\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBbaseWidth\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBbaseHeight\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBbaseDepth\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBnumDimensions\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBnumLevels\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBnumLayers\fP" +.br +.ti -1c +.RI "ktx_uint32_t \fBnumFaces\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBisArray\fP" +.br +.ti -1c +.RI "ktx_bool_t \fBgenerateMipmaps\fP" +.br +.in -1c +.SH "Detailed Description" +.PP +Structure for passing texture information to ktxTexture1_Create() and ktxTexture2_Create()\&. + + +.PP +\fBSee also\fP +.RS 4 +\fBktxTexture1_Create()\fP + +.PP +\fBktxTexture2_Create()\fP +.RE +.PP + +.SH "Field Documentation" +.PP +.SS "ktx_uint32_t baseDepth" +Depth of the base level of the texture\&. +.SS "ktx_uint32_t baseHeight" +Height of the base level of the texture\&. +.SS "ktx_uint32_t baseWidth" +Width of the base level of the texture\&. +.SS "ktx_bool_t generateMipmaps" +Set to KTX_TRUE if mipmaps should be generated for the texture when loading into a 3D API\&. +.SS "ktx_uint32_t glInternalformat" +Internal format for the texture, e\&.g\&., GL_RGB8\&. Ignored when creating a \fBktxTexture2\fP\&. +.SS "ktx_bool_t isArray" +Set to KTX_TRUE if the texture is to be an array texture\&. Means OpenGL will use a GL_TEXTURE_*_ARRAY target\&. +.SS "ktx_uint32_t numDimensions" +Number of dimensions in the texture, 1, 2 or 3\&. +.SS "ktx_uint32_t numFaces" +Number of faces: 6 for cube maps, 1 otherwise\&. +.SS "ktx_uint32_t numLayers" +Number of array layers in the texture\&. +.SS "ktx_uint32_t numLevels" +Number of mip levels in the texture\&. Should be 1 if \fRgenerateMipmaps\fP is KTX_TRUE; +.SS "ktx_uint32_t* pDfd" +Pointer to DFD\&. Used only when creating a \fBktxTexture2\fP and only if vkFormat is VK_FORMAT_UNDEFINED\&. +.SS "ktx_uint32_t vkFormat" +VkFormat for texture\&. Ignored when creating a \fBktxTexture1\fP\&. + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxTextureCreateStorageEnum.3 b/ktx/build/docs/man/man3/ktxTextureCreateStorageEnum.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTextureCreateStorageEnum.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_CreateFromMemory.3 b/ktx/build/docs/man/man3/ktxTexture_CreateFromMemory.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_CreateFromMemory.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_CreateFromNamedFile.3 b/ktx/build/docs/man/man3/ktxTexture_CreateFromNamedFile.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_CreateFromNamedFile.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_CreateFromStdioStream.3 b/ktx/build/docs/man/man3/ktxTexture_CreateFromStdioStream.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_CreateFromStdioStream.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_CreateFromStream.3 b/ktx/build/docs/man/man3/ktxTexture_CreateFromStream.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_CreateFromStream.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_Destroy.3 b/ktx/build/docs/man/man3/ktxTexture_Destroy.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_Destroy.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_GLUpload.3 b/ktx/build/docs/man/man3/ktxTexture_GLUpload.3 new file mode 100644 index 0000000..2427121 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_GLUpload.3 @@ -0,0 +1 @@ +.so man3/ktx_glloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_GetData.3 b/ktx/build/docs/man/man3/ktxTexture_GetData.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_GetData.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_GetDataSize.3 b/ktx/build/docs/man/man3/ktxTexture_GetDataSize.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_GetDataSize.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_GetDataSizeUncompressed.3 b/ktx/build/docs/man/man3/ktxTexture_GetDataSizeUncompressed.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_GetDataSizeUncompressed.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_GetElementSize.3 b/ktx/build/docs/man/man3/ktxTexture_GetElementSize.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_GetElementSize.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_GetImageOffset.3 b/ktx/build/docs/man/man3/ktxTexture_GetImageOffset.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_GetImageOffset.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_GetImageSize.3 b/ktx/build/docs/man/man3/ktxTexture_GetImageSize.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_GetImageSize.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_GetLevelSize.3 b/ktx/build/docs/man/man3/ktxTexture_GetLevelSize.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_GetLevelSize.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_GetRowPitch.3 b/ktx/build/docs/man/man3/ktxTexture_GetRowPitch.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_GetRowPitch.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_GetVkFormat.3 b/ktx/build/docs/man/man3/ktxTexture_GetVkFormat.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_GetVkFormat.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_IterateLevelFaces.3 b/ktx/build/docs/man/man3/ktxTexture_IterateLevelFaces.3 new file mode 100644 index 0000000..24b07f5 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_IterateLevelFaces.3 @@ -0,0 +1 @@ +.so man3/reader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_IterateLevels.3 b/ktx/build/docs/man/man3/ktxTexture_IterateLevels.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_IterateLevels.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_IterateLoadLevelFaces.3 b/ktx/build/docs/man/man3/ktxTexture_IterateLoadLevelFaces.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_IterateLoadLevelFaces.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_LoadImageData.3 b/ktx/build/docs/man/man3/ktxTexture_LoadImageData.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_LoadImageData.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_NeedsTranscoding.3 b/ktx/build/docs/man/man3/ktxTexture_NeedsTranscoding.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_NeedsTranscoding.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_SetImageFromMemory.3 b/ktx/build/docs/man/man3/ktxTexture_SetImageFromMemory.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_SetImageFromMemory.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_SetImageFromStdioStream.3 b/ktx/build/docs/man/man3/ktxTexture_SetImageFromStdioStream.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_SetImageFromStdioStream.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_VkUpload.3 b/ktx/build/docs/man/man3/ktxTexture_VkUpload.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_VkUpload.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_VkUploadEx.3 b/ktx/build/docs/man/man3/ktxTexture_VkUploadEx.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_VkUploadEx.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_VkUploadEx_WithSuballocator.3 b/ktx/build/docs/man/man3/ktxTexture_VkUploadEx_WithSuballocator.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_VkUploadEx_WithSuballocator.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_WriteToMemory.3 b/ktx/build/docs/man/man3/ktxTexture_WriteToMemory.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_WriteToMemory.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_WriteToNamedFile.3 b/ktx/build/docs/man/man3/ktxTexture_WriteToNamedFile.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_WriteToNamedFile.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_WriteToStdioStream.3 b/ktx/build/docs/man/man3/ktxTexture_WriteToStdioStream.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_WriteToStdioStream.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_WriteToStream.3 b/ktx/build/docs/man/man3/ktxTexture_WriteToStream.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_WriteToStream.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxTexture_vtbl.3 b/ktx/build/docs/man/man3/ktxTexture_vtbl.3 new file mode 100644 index 0000000..2d88110 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTexture_vtbl.3 @@ -0,0 +1,18 @@ +.TH "ktxTexture_vtbl" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxTexture_vtbl \- Table of virtual \fBktxTexture\fP methods\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SH "Detailed Description" +.PP +Table of virtual \fBktxTexture\fP methods\&. + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxTranscodeFormatString.3 b/ktx/build/docs/man/man3/ktxTranscodeFormatString.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktxTranscodeFormatString.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktxVulkanDeviceInfo.3 b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo.3 new file mode 100644 index 0000000..91e15eb --- /dev/null +++ b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo.3 @@ -0,0 +1,122 @@ +.TH "ktxVulkanDeviceInfo" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxVulkanDeviceInfo \- Struct for passing information about the Vulkan device on which to create images to the texture image loading functions\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBktxVulkanDeviceInfo\fP * \fBktxVulkanDeviceInfo_Create\fP (VkPhysicalDevice \fBphysicalDevice\fP, VkDevice \fBdevice\fP, VkQueue \fBqueue\fP, VkCommandPool \fBcmdPool\fP, const VkAllocationCallbacks *\fBpAllocator\fP)" +.br +.RI "Create a \fBktxVulkanDeviceInfo\fP object\&. " +.ti -1c +.RI "\fBktxVulkanDeviceInfo\fP * \fBktxVulkanDeviceInfo_CreateEx\fP (VkInstance \fBinstance\fP, VkPhysicalDevice \fBphysicalDevice\fP, VkDevice \fBdevice\fP, VkQueue \fBqueue\fP, VkCommandPool \fBcmdPool\fP, const VkAllocationCallbacks *\fBpAllocator\fP, const \fBktxVulkanFunctions\fP *pFuncs)" +.br +.RI "Create a \fBktxVulkanDeviceInfo\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxVulkanDeviceInfo_Construct\fP (\fBktxVulkanDeviceInfo\fP *This, VkPhysicalDevice \fBphysicalDevice\fP, VkDevice \fBdevice\fP, VkQueue \fBqueue\fP, VkCommandPool \fBcmdPool\fP, const VkAllocationCallbacks *\fBpAllocator\fP)" +.br +.RI "Construct a \fBktxVulkanDeviceInfo\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxVulkanDeviceInfo_ConstructEx\fP (\fBktxVulkanDeviceInfo\fP *This, VkInstance \fBinstance\fP, VkPhysicalDevice \fBphysicalDevice\fP, VkDevice \fBdevice\fP, VkQueue \fBqueue\fP, VkCommandPool \fBcmdPool\fP, const VkAllocationCallbacks *\fBpAllocator\fP, const \fBktxVulkanFunctions\fP *pFunctions)" +.br +.RI "Construct a \fBktxVulkanDeviceInfo\fP object\&. " +.ti -1c +.RI "void \fBktxVulkanDeviceInfo_Destruct\fP (\fBktxVulkanDeviceInfo\fP *This)" +.br +.RI "Destruct a \fBktxVulkanDeviceInfo\fP object\&. " +.ti -1c +.RI "void \fBktxVulkanDeviceInfo_Destroy\fP (\fBktxVulkanDeviceInfo\fP *This)" +.br +.RI "Destroy a \fBktxVulkanDeviceInfo\fP object\&. " +.in -1c +.SS "Data Fields" + +.in +1c +.ti -1c +.RI "VkInstance \fBinstance\fP" +.br +.ti -1c +.RI "VkPhysicalDevice \fBphysicalDevice\fP" +.br +.ti -1c +.RI "VkDevice \fBdevice\fP" +.br +.ti -1c +.RI "VkQueue \fBqueue\fP" +.br +.ti -1c +.RI "VkCommandBuffer \fBcmdBuffer\fP" +.br +.ti -1c +.RI "VkCommandPool \fBcmdPool\fP" +.br +.ti -1c +.RI "const VkAllocationCallbacks * \fBpAllocator\fP" +.br +.ti -1c +.RI "VkPhysicalDeviceMemoryProperties \fBdeviceMemoryProperties\fP" +.br +.ti -1c +.RI "\fBktxVulkanFunctions\fP \fBvkFuncs\fP" +.br +.in -1c +.SH "Detailed Description" +.PP +Struct for passing information about the Vulkan device on which to create images to the texture image loading functions\&. + +Avoids passing a large number of parameters to each loading function\&. Use of ktxVulkanDeviceInfo_create() or ktxVulkanDeviceInfo_construct() to populate this structure is highly recommended\&. + +.PP +.PP +.nf +ktxVulkanDeviceInfo vdi; +ktxVulkanTexture texture; + +vdi = ktxVulkanDeviceInfo_create(physicalDevice, + device, + queue, + cmdPool, + &allocator); +ktxLoadVkTextureN("texture_1\&.ktx", vdi, &texture, NULL, NULL); +// \&.\&.\&. +ktxLoadVkTextureN("texture_n\&.ktx", vdi, &texture, NULL, NULL); +ktxVulkanDeviceInfo_destroy(vdi); +.fi +.PP + +.PP +\fBExamples\fP +.in +1c +\fBvkload\&.cpp\fP\&. +.SH "Field Documentation" +.PP +.SS "VkCommandBuffer cmdBuffer" +Handle of the cmdBuffer to use\&. +.SS "VkCommandPool cmdPool" +Handle of the command pool from which to allocate the command buffer\&. +.SS "VkDevice device" +Handle of the logical device\&. +.SS "VkPhysicalDeviceMemoryProperties deviceMemoryProperties" +Memory properties of the Vulkan physical device\&. +.SS "VkInstance instance" +Instance used to communicate with vulkan\&. +.SS "const VkAllocationCallbacks* pAllocator" +Pointer to the allocator to use for the command buffer and created images\&. +.SS "VkPhysicalDevice physicalDevice" +Handle of the physical device\&. +.SS "VkQueue queue" +Handle to the queue to which to submit commands\&. +.SS "\fBktxVulkanFunctions\fP vkFuncs" +The functions needed to operate functions + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_Construct.3 b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_Construct.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_Construct.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_ConstructEx.3 b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_ConstructEx.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_ConstructEx.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_Create.3 b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_Create.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_Create.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_CreateEx.3 b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_CreateEx.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_CreateEx.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_Destroy.3 b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_Destroy.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_Destroy.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_Destruct.3 b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_Destruct.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxVulkanDeviceInfo_Destruct.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxVulkanFunctions.3 b/ktx/build/docs/man/man3/ktxVulkanFunctions.3 new file mode 100644 index 0000000..0e1076b --- /dev/null +++ b/ktx/build/docs/man/man3/ktxVulkanFunctions.3 @@ -0,0 +1,20 @@ +.TH "ktxVulkanFunctions" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxVulkanFunctions \- Struct for applications to pass Vulkan function pointers to the ktxTexture_VkUpload functions via a \fBktxVulkanDeviceInfo\fP struct\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SH "Detailed Description" +.PP +Struct for applications to pass Vulkan function pointers to the ktxTexture_VkUpload functions via a \fBktxVulkanDeviceInfo\fP struct\&. + +\fRvkGetInstanceProcAddr\fP and \fRvkGetDeviceProcAddr\fP should be set, others are optional\&. + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxVulkanTexture.3 b/ktx/build/docs/man/man3/ktxVulkanTexture.3 new file mode 100644 index 0000000..516b8ee --- /dev/null +++ b/ktx/build/docs/man/man3/ktxVulkanTexture.3 @@ -0,0 +1,107 @@ +.TH "ktxVulkanTexture" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxVulkanTexture \- Struct for returning information about the Vulkan texture image created by the ktxTexture_VkUpload* functions\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBktx_error_code_e\fP \fBktxVulkanTexture_Destruct_WithSuballocator\fP (\fBktxVulkanTexture\fP *vkTexture, VkDevice device, const VkAllocationCallbacks *pAllocator, \fBktxVulkanTexture_subAllocatorCallbacks\fP *subAllocatorCallbacks)" +.br +.RI "Destructor for the object returned when loading a texture image\&. " +.ti -1c +.RI "void \fBktxVulkanTexture_Destruct\fP (\fBktxVulkanTexture\fP *vkTexture, VkDevice device, const VkAllocationCallbacks *pAllocator)" +.br +.RI "Destructor for the object returned when loading a texture image\&. " +.in -1c +.SS "Data Fields" + +.in +1c +.ti -1c +.RI "PFN_vkDestroyImage \fBvkDestroyImage\fP" +.br +.ti -1c +.RI "PFN_vkFreeMemory \fBvkFreeMemory\fP" +.br +.ti -1c +.RI "VkImage \fBimage\fP" +.br +.ti -1c +.RI "VkFormat \fBimageFormat\fP" +.br +.ti -1c +.RI "VkImageLayout \fBimageLayout\fP" +.br +.ti -1c +.RI "VkDeviceMemory \fBdeviceMemory\fP" +.br +.ti -1c +.RI "VkImageViewType \fBviewType\fP" +.br +.ti -1c +.RI "uint32_t \fBwidth\fP" +.br +.ti -1c +.RI "uint32_t \fBheight\fP" +.br +.ti -1c +.RI "uint32_t \fBdepth\fP" +.br +.ti -1c +.RI "uint32_t \fBlevelCount\fP" +.br +.ti -1c +.RI "uint32_t \fBlayerCount\fP" +.br +.ti -1c +.RI "uint64_t \fBallocationId\fP" +.br +.in -1c +.SH "Detailed Description" +.PP +Struct for returning information about the Vulkan texture image created by the ktxTexture_VkUpload* functions\&. + +Creation of these objects is internal to the upload functions\&. +.PP +\fBExamples\fP +.in +1c +\fBvkload\&.cpp\fP\&. +.SH "Field Documentation" +.PP +.SS "uint64_t allocationId" +An id referencing suballocation(s)\&. +.SS "uint32_t depth" +The depth of the image\&. +.SS "VkDeviceMemory deviceMemory" +The memory (sub)allocation for the image on the Vulkan device\&. Will not be used with suballocators\&. +.SS "uint32_t height" +The height of the image\&. +.SS "VkImage image" +Handle to the Vulkan image created by the loader\&. +.SS "VkFormat imageFormat" +Format of the image data\&. +.SS "VkImageLayout imageLayout" +Layout of the created image\&. Has the same value as \fRlayout\fP parameter passed to the loader\&. +.SS "uint32_t layerCount" +The number of array layers in the image\&. +.SS "uint32_t levelCount" +The number of MIP levels in the image\&. +.SS "VkImageViewType viewType" +ViewType corresponding to \fRimage\fP\&. Reflects the dimensionality, cubeness and arrayness of the image\&. +.SS "PFN_vkDestroyImage vkDestroyImage" +Pointer to vkDestroyImage function +.SS "PFN_vkFreeMemory vkFreeMemory" +Pointer to vkFreeMemory function +.SS "uint32_t width" +The width of the image\&. + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktxVulkanTexture_Destruct.3 b/ktx/build/docs/man/man3/ktxVulkanTexture_Destruct.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxVulkanTexture_Destruct.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxVulkanTexture_Destruct_WithSuballocator.3 b/ktx/build/docs/man/man3/ktxVulkanTexture_Destruct_WithSuballocator.3 new file mode 100644 index 0000000..d5b3589 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxVulkanTexture_Destruct_WithSuballocator.3 @@ -0,0 +1 @@ +.so man3/ktx_vkloader.3 diff --git a/ktx/build/docs/man/man3/ktxVulkanTexture_subAllocatorCallbacks.3 b/ktx/build/docs/man/man3/ktxVulkanTexture_subAllocatorCallbacks.3 new file mode 100644 index 0000000..d91c2e1 --- /dev/null +++ b/ktx/build/docs/man/man3/ktxVulkanTexture_subAllocatorCallbacks.3 @@ -0,0 +1,56 @@ +.TH "ktxVulkanTexture_subAllocatorCallbacks" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktxVulkanTexture_subAllocatorCallbacks \- Struct that contains all callbacks necessary for suballocation\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fR#include \fP +.SS "Data Fields" + +.in +1c +.ti -1c +.RI "ktxVulkanTexture_subAllocatorAllocMemFuncPtr \fBallocMemFuncPtr\fP" +.br +.ti -1c +.RI "ktxVulkanTexture_subAllocatorBindBufferFuncPtr \fBbindBufferFuncPtr\fP" +.br +.ti -1c +.RI "ktxVulkanTexture_subAllocatorBindImageFuncPtr \fBbindImageFuncPtr\fP" +.br +.ti -1c +.RI "ktxVulkanTexture_subAllocatorMemoryMapFuncPtr \fBmemoryMapFuncPtr\fP" +.br +.ti -1c +.RI "ktxVulkanTexture_subAllocatorMemoryUnmapFuncPtr \fBmemoryUnmapFuncPtr\fP" +.br +.ti -1c +.RI "ktxVulkanTexture_subAllocatorFreeMemFuncPtr \fBfreeMemFuncPtr\fP" +.br +.in -1c +.SH "Detailed Description" +.PP +Struct that contains all callbacks necessary for suballocation\&. + +These pointers must all be provided for upload or destroy to occur using suballocator callbacks\&. +.SH "Field Documentation" +.PP +.SS "ktxVulkanTexture_subAllocatorAllocMemFuncPtr allocMemFuncPtr" +Pointer to the memory procurement function\&. Can suballocate one or more pages\&. +.SS "ktxVulkanTexture_subAllocatorBindBufferFuncPtr bindBufferFuncPtr" +Pointer to bind-buffer-to-suballocation(s) function\&. +.SS "ktxVulkanTexture_subAllocatorBindImageFuncPtr bindImageFuncPtr" +Pointer to bind-image-to-suballocation(s) function\&. +.SS "ktxVulkanTexture_subAllocatorFreeMemFuncPtr freeMemFuncPtr" +Pointer to the free procurement function\&. +.SS "ktxVulkanTexture_subAllocatorMemoryMapFuncPtr memoryMapFuncPtr" +Pointer to function for mapping the memory of a specific page\&. +.SS "ktxVulkanTexture_subAllocatorMemoryUnmapFuncPtr memoryUnmapFuncPtr" +Pointer to function for unmapping the memory of a specific page\&. + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktx_error_code_e.3 b/ktx/build/docs/man/man3/ktx_error_code_e.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktx_error_code_e.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktx_glloader.3 b/ktx/build/docs/man/man3/ktx_glloader.3 new file mode 100644 index 0000000..52dfa90 --- /dev/null +++ b/ktx/build/docs/man/man3/ktx_glloader.3 @@ -0,0 +1,173 @@ +.TH "ktx_glloader" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx_glloader \- OpenGL Texture Image Loader +.PP + \- Create texture objects in current OpenGL context\&. + +.SH SYNOPSIS +.br +.PP +.SS "Functions" + +.in +1c +.ti -1c +.RI "\fBktx_error_code_e\fP \fBktxLoadOpenGL\fP (\fBPFNGLGETPROCADDRESS\fP pfnGLGetProcAddress)" +.br +.RI "Load pointers for the GL functions used by the ktxTexture*_GLUpload functions\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_GLUpload\fP (\fBktxTexture1\fP *This, GLuint *pTexture, GLenum *pTarget, GLenum *pGlerror)" +.br +.RI "Create a GL texture object from a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_GLUpload\fP (\fBktxTexture2\fP *This, GLuint *pTexture, GLenum *pTarget, GLenum *pGlerror)" +.br +.RI "Create a GL texture object from a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_GLUpload\fP (\fBktxTexture\fP *This, GLuint *pTexture, GLenum *pTarget, GLenum *pGlerror)" +.br +.RI "Create a GL texture object from a \fBktxTexture\fP object\&. " +.in -1c +.SH "Detailed Description" +.PP +Create texture objects in current OpenGL context\&. + + +.SH "Function Documentation" +.PP +.SS "\fBktx_error_code_e\fP ktxLoadOpenGL (\fBPFNGLGETPROCADDRESS\fP pfnGLGetProcAddress)" + +.PP +Load pointers for the GL functions used by the ktxTexture*_GLUpload functions\&. Should be called by an application before its first call to a ktxTexture*_GLUpload function, passing a pointer to the GLGetProcAddress function provided by whatever OpenGL framework it is using\&. For backward compatibility, the ktxTexture*_GLUpload functions call this with a NULL pointer causing an attempt to load the pointers from the program module using \fRdlsym\fP (GNU/Linux, macOS), \fRwglGetProcAddr\fP and \fRGetProcAddr\fP (Windows) or \fRemscripten_GetProcAddress\fP (Web)\&. This works with the vast majority of OpenGL implementations but issues have been seen on Fedora systems particularly with NVIDIA hardware\&. For full robustness, applications should call this function\&. + +.PP +\fBParameters\fP +.RS 4 +\fIpfnGLGetProcAddress\fP pointer to function for retrieving pointers to GL functions\&. If NULL, retrieval is attempted using system dependent generic functions\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_GLUpload (\fBktxTexture1\fP * This, GLuint * pTexture, GLenum * pTarget, GLenum * pGlerror)" + +.PP +Create a GL texture object from a \fBktxTexture1\fP object\&. Sets the texture object's GL_TEXTURE_MAX_LEVEL parameter according to the number of levels in the KTX data, provided the context supports this feature\&. + +.PP +Unpacks compressed GL_ETC1_RGB8_OES and GL_ETC2_* format textures in software when the format is not supported by the GL context, provided the library has been compiled with \fRSUPPORT_SOFTWARE_ETC_UNPACK\fP defined as 1\&. + +.PP +It will also convert textures with legacy formats to their modern equivalents when the format is not supported by the GL context, provided the library has been compiled with \fRSUPPORT_LEGACY_FORMAT_CONVERSION\fP defined as 1\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP handle of the \fBktxTexture\fP to upload\&. +.br +\fIpTexture\fP name of the GL texture object to load\&. If NULL or if \fR*pTexture == 0\fP the function will generate a texture name\&. The function binds either the generated name or the name given in \fR*pTexture\fP to the texture target returned in \fR*pTarget\fP, before loading the texture data\&. If \fRpTexture\fP is not NULL and a name was generated, the generated name will be returned in *pTexture\&. +.br +\fIpTarget\fP \fR*pTarget\fP is set to the texture target used\&. The target is chosen based on the file contents\&. +.br +\fIpGlerror\fP \fR*pGlerror\fP is set to the value returned by glGetError when this function returns the error KTX_GL_ERROR\&. pGlerror can be NULL\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_GL_ERROR\fP\fP A GL error was raised by glBindTexture, glGenTextures or gl*TexImage*\&. The GL error will be returned in \fR*glerror\fP, if glerror is not \fRNULL\fP\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRtarget\fP is \fRNULL\fP or the size of a mip level is greater than the size of the preceding level\&. +.br +\fI\fBKTX_NOT_FOUND\fP\fP A dynamically loaded OpenGL {,ES} function required by the loader was not found\&. +.br +\fI\fBKTX_UNSUPPORTED_TEXTURE_TYPE\fP\fP The type of texture is not supported by the current OpenGL context\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_GLUpload (\fBktxTexture2\fP * This, GLuint * pTexture, GLenum * pTarget, GLenum * pGlerror)" + +.PP +Create a GL texture object from a \fBktxTexture2\fP object\&. Sets the texture object's GL_TEXTURE_MAX_LEVEL parameter according to the number of levels in the KTX data, provided the context supports this feature\&. + +.PP +Unpacks compressed GL_ETC1_RGB8_OES and GL_ETC2_* format textures in software when the format is not supported by the GL context, provided the library has been compiled with \fRSUPPORT_SOFTWARE_ETC_UNPACK\fP defined as 1\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP handle of the \fBktxTexture\fP to upload\&. +.br +\fIpTexture\fP name of the GL texture object to load\&. If NULL or if \fR*pTexture == 0\fP the function will generate a texture name\&. The function binds either the generated name or the name given in \fR*pTexture\fP to the texture target returned in \fR*pTarget\fP, before loading the texture data\&. If \fRpTexture\fP is not NULL and a name was generated, the generated name will be returned in *pTexture\&. +.br +\fIpTarget\fP \fR*pTarget\fP is set to the texture target used\&. The target is chosen based on the file contents\&. +.br +\fIpGlerror\fP \fR*pGlerror\fP is set to the value returned by glGetError when this function returns the error KTX_GL_ERROR\&. pGlerror can be NULL\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_GL_ERROR\fP\fP A GL error was raised by glBindTexture, glGenTextures or gl*TexImage*\&. The GL error will be returned in \fR*glerror\fP, if glerror is not \fRNULL\fP\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRtarget\fP is \fRNULL\fP or the size of a mip level is greater than the size of the preceding level\&. +.br +\fI\fBKTX_NOT_FOUND\fP\fP A dynamically loaded OpenGL {,ES} function required by the loader was not found\&. +.br +\fI\fBKTX_UNSUPPORTED_TEXTURE_TYPE\fP\fP The type of texture is not supported by the current OpenGL context\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture_GLUpload (\fBktxTexture\fP * This, GLuint * pTexture, GLenum * pTarget, GLenum * pGlerror)" + +.PP +Create a GL texture object from a \fBktxTexture\fP object\&. In order to ensure that the GL uploader is not linked into an application unless explicitly called, this is not a virtual function\&. It determines the texture type then dispatches to the correct function\&. + +.PP +Sets the texture object's GL_TEXTURE_MAX_LEVEL parameter according to the number of levels in the KTX data, provided the context supports this feature\&. + +.PP +Unpacks compressed GL_ETC1_RGB8_OES and GL_ETC2_* format textures in software when the format is not supported by the GL context, provided the library has been compiled with \fRSUPPORT_SOFTWARE_ETC_UNPACK\fP defined as 1\&. + +.PP +It will also convert textures with legacy formats to their modern equivalents when the format is not supported by the GL context, provided the library has been compiled with \fRSUPPORT_LEGACY_FORMAT_CONVERSION\fP defined as 1\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP handle of the \fBktxTexture\fP to upload\&. +.br +\fIpTexture\fP name of the GL texture object to load\&. If NULL or if \fR*pTexture == 0\fP the function will generate a texture name\&. The function binds either the generated name or the name given in \fR*pTexture\fP to the texture target returned in \fR*pTarget\fP, before loading the texture data\&. If \fRpTexture\fP is not NULL and a name was generated, the generated name will be returned in *pTexture\&. +.br +\fIpTarget\fP \fR*pTarget\fP is set to the texture target used\&. The target is chosen based on the file contents\&. +.br +\fIpGlerror\fP \fR*pGlerror\fP is set to the value returned by glGetError when this function returns the error KTX_GL_ERROR\&. pGlerror can be NULL\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_GL_ERROR\fP\fP A GL error was raised by glBindTexture, glGenTextures or gl*TexImage*\&. The GL error will be returned in \fR*glerror\fP, if glerror is not \fRNULL\fP\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRtarget\fP is \fRNULL\fP or the size of a mip level is greater than the size of the preceding level\&. +.br +\fI\fBKTX_NOT_FOUND\fP\fP A dynamically loaded OpenGL {,ES} function required by the loader was not found\&. +.br +\fI\fBKTX_UNSUPPORTED_TEXTURE_TYPE\fP\fP The type of texture is not supported by the current OpenGL context\&. +.RE +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/ktx_pack_astc_block_dimension_e.3 b/ktx/build/docs/man/man3/ktx_pack_astc_block_dimension_e.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktx_pack_astc_block_dimension_e.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktx_pack_astc_encoder_mode_e.3 b/ktx/build/docs/man/man3/ktx_pack_astc_encoder_mode_e.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktx_pack_astc_encoder_mode_e.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktx_pack_astc_quality_levels_e.3 b/ktx/build/docs/man/man3/ktx_pack_astc_quality_levels_e.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktx_pack_astc_quality_levels_e.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktx_pack_uastc_flag_bits_e.3 b/ktx/build/docs/man/man3/ktx_pack_uastc_flag_bits_e.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktx_pack_uastc_flag_bits_e.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktx_transcode_flag_bits_e.3 b/ktx/build/docs/man/man3/ktx_transcode_flag_bits_e.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktx_transcode_flag_bits_e.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktx_transcode_fmt_e.3 b/ktx/build/docs/man/man3/ktx_transcode_fmt_e.3 new file mode 100644 index 0000000..656f32d --- /dev/null +++ b/ktx/build/docs/man/man3/ktx_transcode_fmt_e.3 @@ -0,0 +1 @@ +.so man3/ktx.h.3 diff --git a/ktx/build/docs/man/man3/ktx_vkloader.3 b/ktx/build/docs/man/man3/ktx_vkloader.3 new file mode 100644 index 0000000..8eaa383 --- /dev/null +++ b/ktx/build/docs/man/man3/ktx_vkloader.3 @@ -0,0 +1,580 @@ +.TH "ktx_vkloader" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +ktx_vkloader \- Vulkan Texture Image Loader +.PP + \- Create texture images on a Vulkan device\&. + +.SH SYNOPSIS +.br +.PP +.SS "Functions" + +.in +1c +.ti -1c +.RI "\fBktxVulkanDeviceInfo\fP * \fBktxVulkanDeviceInfo_Create\fP (VkPhysicalDevice \fBphysicalDevice\fP, VkDevice \fBdevice\fP, VkQueue \fBqueue\fP, VkCommandPool \fBcmdPool\fP, const VkAllocationCallbacks *\fBpAllocator\fP)" +.br +.RI "Create a \fBktxVulkanDeviceInfo\fP object\&. " +.ti -1c +.RI "\fBktxVulkanDeviceInfo\fP * \fBktxVulkanDeviceInfo_CreateEx\fP (VkInstance \fBinstance\fP, VkPhysicalDevice \fBphysicalDevice\fP, VkDevice \fBdevice\fP, VkQueue \fBqueue\fP, VkCommandPool \fBcmdPool\fP, const VkAllocationCallbacks *\fBpAllocator\fP, const \fBktxVulkanFunctions\fP *pFuncs)" +.br +.RI "Create a \fBktxVulkanDeviceInfo\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxVulkanDeviceInfo_Construct\fP (\fBktxVulkanDeviceInfo\fP *This, VkPhysicalDevice \fBphysicalDevice\fP, VkDevice \fBdevice\fP, VkQueue \fBqueue\fP, VkCommandPool \fBcmdPool\fP, const VkAllocationCallbacks *\fBpAllocator\fP)" +.br +.RI "Construct a \fBktxVulkanDeviceInfo\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxVulkanDeviceInfo_ConstructEx\fP (\fBktxVulkanDeviceInfo\fP *This, VkInstance \fBinstance\fP, VkPhysicalDevice \fBphysicalDevice\fP, VkDevice \fBdevice\fP, VkQueue \fBqueue\fP, VkCommandPool \fBcmdPool\fP, const VkAllocationCallbacks *\fBpAllocator\fP, const \fBktxVulkanFunctions\fP *pFunctions)" +.br +.RI "Construct a \fBktxVulkanDeviceInfo\fP object\&. " +.ti -1c +.RI "void \fBktxVulkanDeviceInfo_Destruct\fP (\fBktxVulkanDeviceInfo\fP *This)" +.br +.RI "Destruct a \fBktxVulkanDeviceInfo\fP object\&. " +.ti -1c +.RI "void \fBktxVulkanDeviceInfo_Destroy\fP (\fBktxVulkanDeviceInfo\fP *This)" +.br +.RI "Destroy a \fBktxVulkanDeviceInfo\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_VkUploadEx_WithSuballocator\fP (\fBktxTexture\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, \fBktxVulkanTexture_subAllocatorCallbacks\fP *subAllocatorCallbacks)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_VkUploadEx\fP (\fBktxTexture\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_VkUpload\fP (\fBktxTexture\fP *texture, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_VkUploadEx_WithSuballocator\fP (\fBktxTexture1\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, \fBktxVulkanTexture_subAllocatorCallbacks\fP *subAllocatorCallbacks)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_VkUploadEx\fP (\fBktxTexture1\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_VkUpload\fP (\fBktxTexture1\fP *texture, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_VkUploadEx_WithSuballocator\fP (\fBktxTexture2\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, \fBktxVulkanTexture_subAllocatorCallbacks\fP *subAllocatorCallbacks)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_VkUploadEx\fP (\fBktxTexture2\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_VkUpload\fP (\fBktxTexture2\fP *This, \fBktxVulkanDeviceInfo\fP *vdi, \fBktxVulkanTexture\fP *vkTexture)" +.br +.RI "Create a Vulkan image object from a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "VkFormat \fBktxTexture1_GetVkFormat\fP (\fBktxTexture1\fP *This)" +.br +.RI "Return the VkFormat enum of a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "VkFormat \fBktxTexture2_GetVkFormat\fP (\fBktxTexture2\fP *This)" +.br +.RI "Return the VkFormat enum of a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "VkFormat \fBktxTexture_GetVkFormat\fP (\fBktxTexture\fP *This)" +.br +.RI "Return the VkFormat enum of a \fBktxTexture\fP object\&. " +.ti -1c +.RI "\fBktx_error_code_e\fP \fBktxVulkanTexture_Destruct_WithSuballocator\fP (\fBktxVulkanTexture\fP *vkTexture, VkDevice device, const VkAllocationCallbacks *pAllocator, \fBktxVulkanTexture_subAllocatorCallbacks\fP *subAllocatorCallbacks)" +.br +.RI "Destructor for the object returned when loading a texture image\&. " +.ti -1c +.RI "void \fBktxVulkanTexture_Destruct\fP (\fBktxVulkanTexture\fP *vkTexture, VkDevice device, const VkAllocationCallbacks *pAllocator)" +.br +.RI "Destructor for the object returned when loading a texture image\&. " +.in -1c +.SH "Detailed Description" +.PP +Create texture images on a Vulkan device\&. + + +.SH "Function Documentation" +.PP +.SS "VkFormat ktxTexture1_GetVkFormat (\fBktxTexture1\fP * This)" + +.PP +Return the VkFormat enum of a \fBktxTexture1\fP object\&. +.PP +\fBReturns\fP +.RS 4 +The VkFormat of the texture object\&. May return VK_FORMAT_UNDEFINED if there is no mapping from the GL internalformat and format\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_VkUpload (\fBktxTexture1\fP * texture, \fBktxVulkanDeviceInfo\fP * vdi, \fBktxVulkanTexture\fP * vkTexture)" + +.PP +Create a Vulkan image object from a \fBktxTexture1\fP object\&. Calls \fBktxTexture_VkUploadEx()\fP with the most commonly used options: \fRVK_IMAGE_TILING_OPTIMAL\fP, \fRVK_IMAGE_USAGE_SAMPLED_BIT\fP and \fRVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL\fP\&. Use that for complete control\&. +.SS "\fBKTX_error_code\fP ktxTexture1_VkUploadEx (\fBktxTexture1\fP * This, \fBktxVulkanDeviceInfo\fP * vdi, \fBktxVulkanTexture\fP * vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)" + +.PP +Create a Vulkan image object from a \fBktxTexture1\fP object\&. This simply calls \fBktxTexture_VkUploadEx()\fP\&. +.SS "\fBKTX_error_code\fP ktxTexture1_VkUploadEx_WithSuballocator (\fBktxTexture1\fP * This, \fBktxVulkanDeviceInfo\fP * vdi, \fBktxVulkanTexture\fP * vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, \fBktxVulkanTexture_subAllocatorCallbacks\fP * subAllocatorCallbacks)" + +.PP +Create a Vulkan image object from a \fBktxTexture1\fP object\&. This simply calls \fBktxTexture_VkUploadEx_WithSuballocator()\fP + +.PP +Creates a VkImage with \fRVkFormat\fP etc\&. matching the KTX data and uploads the images\&. Mipmaps will be generated if the \fR\fBktxTexture\fP's\fP \fRgenerateMipmaps\fP flag is set\&. Returns the handles of the created objects and information about the texture in the \fR\fBktxVulkanTexture\fP\fP pointed at by \fRvkTexture\fP\&. + +.PP +The created VkImage will have \fRVK_SHARING_MODE_EXCLUSIVE\fP set thus the resulting image will be usable only with queues of the same family as the \fRqueue\fP in the \fBktxVulkanDeviceInfo\fP pointed to by \fIvdi\fP\&. + +.PP +\fRusageFlags\fP and thus acceptable usage of the created image may be augmented as follows: +.IP "\(bu" 2 +with \fRVK_IMAGE_USAGE_TRANSFER_DST_BIT\fP if \fRtiling\fP is \fRVK_IMAGE_TILING_OPTIMAL\fP +.IP "\(bu" 2 +with \fRVK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT\fP if \fRgenerateMipmaps\fP is set in the \fR\fBktxTexture\fP\fP\&. +.PP + +.PP +Most Vulkan implementations support \fRVK_IMAGE_TILING_LINEAR\fP only for a very limited number of formats and features\&. Generally \fRVK_IMAGE_TILING_OPTIMAL\fP is preferred\&. The latter requires a staging buffer so will use more memory during loading\&. + +.PP +If a pointer to a set of suballocator callbacks is provided, they will be used instead of manual allocation of VkDeviceMemory\&. A 64 bit uint that references the suballocated page(s) is returned on memory procurement and saved in the \fRallocationId\fP field of the structure pointed to by \fIvkTexture\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP from which to upload\&. +.br +\fIvdi\fP pointer to a \fBktxVulkanDeviceInfo\fP structure providing information about the Vulkan device onto which to load the texture\&. +.br +\fIvkTexture\fP pointer to a \fBktxVulkanTexture\fP structure into which the function writes information about the created VkImage\&. +.br +\fItiling\fP type of tiling to use in the destination image on the Vulkan device\&. +.br +\fIusageFlags\fP a set of VkImageUsageFlags bits indicating the intended usage of the destination image\&. +.br +\fIfinalLayout\fP a VkImageLayout value indicating the desired final layout of the created image\&. +.br +\fIsubAllocatorCallbacks\fP pointer to a set of suballocator callbacks that wrap around suballocator calls: alloc, bindbuffer, bindimage, map, unmap and free\&. They use a uint64_t stored in the \fRallocationId\fP field of the structure pointed at by \fIvkTexture\fP to reference allocated page(s)\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP An incomplete set of callbacks are provided in subAllocatorCallbacks\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP, \fRvdi\fP or \fRvkTexture\fP is \fRNULL\fP\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP contains neither images nor an active stream from which to read them\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The combination of the \fBktxTexture\fP's format, \fRtiling\fP and \fRusageFlags\fP is not supported by the physical device\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Requested mipmap generation is not supported by the physical device for the combination of the \fBktxTexture\fP's format and \fRtiling\fP\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Number of mip levels or array layers exceeds the maximums supported for the \fBktxTexture\fP's format and \fRtiling\fP\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Sufficient memory could not be allocated on either the CPU or the Vulkan device\&. +.br +\fI\fBKTX_UNSUPPORTED_FEATURE\fP\fP Attempting to sparsely bind KTX textures for the time being will report this error\&. +.RE +.PP +\fBSee also\fP +.RS 4 +\fBktxVulkanDeviceInfo_Construct()\fP +.RE +.PP + +.SS "VkFormat ktxTexture2_GetVkFormat (\fBktxTexture2\fP * This)" + +.PP +Return the VkFormat enum of a \fBktxTexture2\fP object\&. +.PP +\fBReturns\fP +.RS 4 +The VkFormat of the texture object\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_VkUpload (\fBktxTexture2\fP * This, \fBktxVulkanDeviceInfo\fP * vdi, \fBktxVulkanTexture\fP * vkTexture)" + +.PP +Create a Vulkan image object from a \fBktxTexture2\fP object\&. Calls \fBktxTexture_VkUploadEx()\fP with the most commonly used options: \fRVK_IMAGE_TILING_OPTIMAL\fP, \fRVK_IMAGE_USAGE_SAMPLED_BIT\fP and \fRVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL\fP\&. Use that for complete control\&. +.SS "\fBKTX_error_code\fP ktxTexture2_VkUploadEx (\fBktxTexture2\fP * This, \fBktxVulkanDeviceInfo\fP * vdi, \fBktxVulkanTexture\fP * vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)" + +.PP +Create a Vulkan image object from a \fBktxTexture2\fP object\&. This simply calls \fBktxTexture_VkUploadEx()\fP\&. +.SS "\fBKTX_error_code\fP ktxTexture2_VkUploadEx_WithSuballocator (\fBktxTexture2\fP * This, \fBktxVulkanDeviceInfo\fP * vdi, \fBktxVulkanTexture\fP * vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, \fBktxVulkanTexture_subAllocatorCallbacks\fP * subAllocatorCallbacks)" + +.PP +Create a Vulkan image object from a \fBktxTexture2\fP object\&. This simplly calls \fBktxTexture_VkUploadEx_WithSuballocator()\fP\&. + +.PP +Creates a VkImage with \fRVkFormat\fP etc\&. matching the KTX data and uploads the images\&. Mipmaps will be generated if the \fR\fBktxTexture\fP's\fP \fRgenerateMipmaps\fP flag is set\&. Returns the handles of the created objects and information about the texture in the \fR\fBktxVulkanTexture\fP\fP pointed at by \fRvkTexture\fP\&. + +.PP +The created VkImage will have \fRVK_SHARING_MODE_EXCLUSIVE\fP set thus the resulting image will be usable only with queues of the same family as the \fRqueue\fP in the \fBktxVulkanDeviceInfo\fP pointed to by \fIvdi\fP\&. + +.PP +\fRusageFlags\fP and thus acceptable usage of the created image may be augmented as follows: +.IP "\(bu" 2 +with \fRVK_IMAGE_USAGE_TRANSFER_DST_BIT\fP if \fRtiling\fP is \fRVK_IMAGE_TILING_OPTIMAL\fP +.IP "\(bu" 2 +with \fRVK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT\fP if \fRgenerateMipmaps\fP is set in the \fR\fBktxTexture\fP\fP\&. +.PP + +.PP +Most Vulkan implementations support \fRVK_IMAGE_TILING_LINEAR\fP only for a very limited number of formats and features\&. Generally \fRVK_IMAGE_TILING_OPTIMAL\fP is preferred\&. The latter requires a staging buffer so will use more memory during loading\&. + +.PP +If a pointer to a set of suballocator callbacks is provided, they will be used instead of manual allocation of VkDeviceMemory\&. A 64 bit uint that references the suballocated page(s) is returned on memory procurement and saved in the \fRallocationId\fP field of the structure pointed to by \fIvkTexture\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP from which to upload\&. +.br +\fIvdi\fP pointer to a \fBktxVulkanDeviceInfo\fP structure providing information about the Vulkan device onto which to load the texture\&. +.br +\fIvkTexture\fP pointer to a \fBktxVulkanTexture\fP structure into which the function writes information about the created VkImage\&. +.br +\fItiling\fP type of tiling to use in the destination image on the Vulkan device\&. +.br +\fIusageFlags\fP a set of VkImageUsageFlags bits indicating the intended usage of the destination image\&. +.br +\fIfinalLayout\fP a VkImageLayout value indicating the desired final layout of the created image\&. +.br +\fIsubAllocatorCallbacks\fP pointer to a set of suballocator callbacks that wrap around suballocator calls: alloc, bindbuffer, bindimage, map, unmap and free\&. They use a uint64_t stored in the \fRallocationId\fP field of the structure pointed at by \fIvkTexture\fP to reference allocated page(s)\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP An incomplete set of callbacks are provided in subAllocatorCallbacks\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP, \fRvdi\fP or \fRvkTexture\fP is \fRNULL\fP\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP contains neither images nor an active stream from which to read them\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The combination of the \fBktxTexture\fP's format, \fRtiling\fP and \fRusageFlags\fP is not supported by the physical device\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Requested mipmap generation is not supported by the physical device for the combination of the \fBktxTexture\fP's format and \fRtiling\fP\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Number of mip levels or array layers exceeds the maximums supported for the \fBktxTexture\fP's format and \fRtiling\fP\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Sufficient memory could not be allocated on either the CPU or the Vulkan device\&. +.br +\fI\fBKTX_UNSUPPORTED_FEATURE\fP\fP Attempting to sparsely bind KTX textures for the time being will report this error\&. +.RE +.PP +\fBSee also\fP +.RS 4 +\fBktxVulkanDeviceInfo_Construct()\fP +.RE +.PP + +.SS "VkFormat ktxTexture_GetVkFormat (\fBktxTexture\fP * This)" + +.PP +Return the VkFormat enum of a \fBktxTexture\fP object\&. In ordert to ensure that the Vulkan uploader is not linked into an application unless explicitly called, this is not a virtual function\&. It determines the texture type then dispatches to the correct function\&. +.PP +\fBSee also\fP +.RS 4 +\fBktxTexture1_GetVkFormat()\fP + +.PP +\fBktxTexture2_GetVkFormat()\fP +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture_VkUpload (\fBktxTexture\fP * texture, \fBktxVulkanDeviceInfo\fP * vdi, \fBktxVulkanTexture\fP * vkTexture)" + +.PP +Create a Vulkan image object from a \fBktxTexture\fP object\&. Calls \fBktxTexture_VkUploadEx()\fP with the most commonly used options: \fRVK_IMAGE_TILING_OPTIMAL\fP, \fRVK_IMAGE_USAGE_SAMPLED_BIT\fP and \fRVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL\fP\&. Use that for complete control\&. +.SS "\fBKTX_error_code\fP ktxTexture_VkUploadEx (\fBktxTexture\fP * This, \fBktxVulkanDeviceInfo\fP * vdi, \fBktxVulkanTexture\fP * vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout)" + +.PP +Create a Vulkan image object from a \fBktxTexture\fP object\&. Calls \fBktxTexture_VkUploadEx_WithSuballocator()\fP with no supplied suballocator callbacks\&. Use that for complete control\&. +.SS "\fBKTX_error_code\fP ktxTexture_VkUploadEx_WithSuballocator (\fBktxTexture\fP * This, \fBktxVulkanDeviceInfo\fP * vdi, \fBktxVulkanTexture\fP * vkTexture, VkImageTiling tiling, VkImageUsageFlags usageFlags, VkImageLayout finalLayout, \fBktxVulkanTexture_subAllocatorCallbacks\fP * subAllocatorCallbacks)" + +.PP +Create a Vulkan image object from a \fBktxTexture\fP object\&. Creates a VkImage with \fRVkFormat\fP etc\&. matching the KTX data and uploads the images\&. Mipmaps will be generated if the \fR\fBktxTexture\fP's\fP \fRgenerateMipmaps\fP flag is set\&. Returns the handles of the created objects and information about the texture in the \fR\fBktxVulkanTexture\fP\fP pointed at by \fRvkTexture\fP\&. + +.PP +The created VkImage will have \fRVK_SHARING_MODE_EXCLUSIVE\fP set thus the resulting image will be usable only with queues of the same family as the \fRqueue\fP in the \fBktxVulkanDeviceInfo\fP pointed to by \fIvdi\fP\&. + +.PP +\fRusageFlags\fP and thus acceptable usage of the created image may be augmented as follows: +.IP "\(bu" 2 +with \fRVK_IMAGE_USAGE_TRANSFER_DST_BIT\fP if \fRtiling\fP is \fRVK_IMAGE_TILING_OPTIMAL\fP +.IP "\(bu" 2 +with \fRVK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT\fP if \fRgenerateMipmaps\fP is set in the \fR\fBktxTexture\fP\fP\&. +.PP + +.PP +Most Vulkan implementations support \fRVK_IMAGE_TILING_LINEAR\fP only for a very limited number of formats and features\&. Generally \fRVK_IMAGE_TILING_OPTIMAL\fP is preferred\&. The latter requires a staging buffer so will use more memory during loading\&. + +.PP +If a pointer to a set of suballocator callbacks is provided, they will be used instead of manual allocation of VkDeviceMemory\&. A 64 bit uint that references the suballocated page(s) is returned on memory procurement and saved in the \fRallocationId\fP field of the structure pointed to by \fIvkTexture\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP from which to upload\&. +.br +\fIvdi\fP pointer to a \fBktxVulkanDeviceInfo\fP structure providing information about the Vulkan device onto which to load the texture\&. +.br +\fIvkTexture\fP pointer to a \fBktxVulkanTexture\fP structure into which the function writes information about the created VkImage\&. +.br +\fItiling\fP type of tiling to use in the destination image on the Vulkan device\&. +.br +\fIusageFlags\fP a set of VkImageUsageFlags bits indicating the intended usage of the destination image\&. +.br +\fIfinalLayout\fP a VkImageLayout value indicating the desired final layout of the created image\&. +.br +\fIsubAllocatorCallbacks\fP pointer to a set of suballocator callbacks that wrap around suballocator calls: alloc, bindbuffer, bindimage, map, unmap and free\&. They use a uint64_t stored in the \fRallocationId\fP field of the structure pointed at by \fIvkTexture\fP to reference allocated page(s)\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP An incomplete set of callbacks are provided in subAllocatorCallbacks\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP, \fRvdi\fP or \fRvkTexture\fP is \fRNULL\fP\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP contains neither images nor an active stream from which to read them\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The combination of the \fBktxTexture\fP's format, \fRtiling\fP and \fRusageFlags\fP is not supported by the physical device\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Requested mipmap generation is not supported by the physical device for the combination of the \fBktxTexture\fP's format and \fRtiling\fP\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Number of mip levels or array layers exceeds the maximums supported for the \fBktxTexture\fP's format and \fRtiling\fP\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Sufficient memory could not be allocated on either the CPU or the Vulkan device\&. +.br +\fI\fBKTX_UNSUPPORTED_FEATURE\fP\fP Attempting to sparsely bind KTX textures for the time being will report this error\&. +.RE +.PP +\fBSee also\fP +.RS 4 +\fBktxVulkanDeviceInfo_Construct()\fP +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxVulkanDeviceInfo_Construct (\fBktxVulkanDeviceInfo\fP * This, VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkCommandPool cmdPool, const VkAllocationCallbacks * pAllocator)" + +.PP +Construct a \fBktxVulkanDeviceInfo\fP object\&. Records the device information, allocates a command buffer that will be used to transfer image data to the Vulkan device and retrieves the physical device memory properties for ease of use when allocating device memory for the images\&. + +.PP +If \fRVK_IMAGE_TILING_OPTIMAL\fP will be passed to ktxTexture_VkUploadEx(), the family of the \fIqueue\fP parameter must support transfers\&. This is true if any of \fRVK_QUEUE_GRAPHICS_BIT\fP, \fRVK_QUEUE_COMPUTE_BIT\fP or \fRVK_QUEUE_TRANSFER_BIT\fP is set in the \fRqueueFlags\fP property of the queue's \fRVkQueueFamilyProperties\fP\&. If protected memory is being used, i\&.e \fRqueueFlags\fP has the \fRVK_QUEUE_PROTECTED_BIT\fP set, then \fRVK_IMAGE_TILING_OPTIMAL\fP must be passed to ktxTexture_VkUploadEx()\&. + +.PP +VkImages created in \fBktxTexture_VkUploadEx()\fP will have \fRVK_SHARING_MODE_EXCLUSIVE\fP set\&. Thus the resulting image will be usable only with queues of the same family as \fIqueue\fP\&. + +.PP +Pass a valid ktxVulkanDeviceInfo* to any Vulkan KTX image loading function to provide it with the information\&. + +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_NOT_FOUND\fP\fP A dynamically loaded Vulkan function required by the loader was not found\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP A command buffer could not be allocated\&. +.RE +.PP +\fBSee also\fP +.RS 4 +\fBktxVulkanDeviceInfo_Destruct()\fP +.RE +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxVulkanDeviceInfo\fP object to initialize\&. +.br +\fI\fBphysicalDevice\fP\fP handle of the Vulkan physical device\&. +.br +\fI\fBdevice\fP\fP handle of the Vulkan logical device\&. +.br +\fI\fBqueue\fP\fP handle of the Vulkan queue\&. +.br +\fI\fBcmdPool\fP\fP handle of the Vulkan command pool\&. +.br +\fI\fBpAllocator\fP\fP pointer to the allocator to use for the image memory\&. If NULL, the default allocator will be used\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxVulkanDeviceInfo_ConstructEx (\fBktxVulkanDeviceInfo\fP * This, VkInstance instance, VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkCommandPool cmdPool, const VkAllocationCallbacks * pAllocator, const \fBktxVulkanFunctions\fP * pFunctions)" + +.PP +Construct a \fBktxVulkanDeviceInfo\fP object\&. Records the device information, allocates a command buffer that will be used to transfer image data to the Vulkan device and retrieves the physical device memory properties for ease of use when allocating device memory for the images\&. + +.PP +If \fRVK_IMAGE_TILING_OPTIMAL\fP will be passed to ktxTexture_VkUploadEx(), the family of the \fIqueue\fP parameter must support transfers\&. This is true if any of \fRVK_QUEUE_GRAPHICS_BIT\fP, \fRVK_QUEUE_COMPUTE_BIT\fP or \fRVK_QUEUE_TRANSFER_BIT\fP is set in the \fRqueueFlags\fP property of the queue's \fRVkQueueFamilyProperties\fP\&. If protected memory is being used, i\&.e \fRqueueFlags\fP has the \fRVK_QUEUE_PROTECTED_BIT\fP set, then \fRVK_IMAGE_TILING_OPTIMAL\fP must be passed to ktxTexture_VkUploadEx()\&. + +.PP +VkImages created in \fBktxTexture_VkUploadEx()\fP will have \fRVK_SHARING_MODE_EXCLUSIVE\fP set\&. Thus the resulting image will be usable only with queues of the same family as \fIqueue\fP\&. + +.PP +Pass a valid ktxVulkanDeviceInfo* to any Vulkan KTX image loading function to provide it with the information\&. + +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_NOT_FOUND\fP\fP A dynamically loaded Vulkan function required by the loader was not found\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP A command buffer could not be allocated\&. +.RE +.PP +\fBSee also\fP +.RS 4 +\fBktxVulkanDeviceInfo_Destruct()\fP +.RE +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxVulkanDeviceInfo\fP object to initialize\&. +.br +\fI\fBphysicalDevice\fP\fP handle of the Vulkan physical device\&. +.br +\fI\fBdevice\fP\fP handle of the Vulkan logical device\&. +.br +\fI\fBqueue\fP\fP handle of the Vulkan queue\&. +.br +\fI\fBcmdPool\fP\fP handle of the Vulkan command pool\&. +.br +\fI\fBpAllocator\fP\fP pointer to the allocator to use for the image memory\&. If NULL, the default allocator will be used\&. +.br +\fI\fBinstance\fP\fP handle of the Vulkan instance\&. If \fRVK_NULL_HANDLE\fP, which is not recommended, the function will attempt to initialize the instance-level functions via the platform's standard dynamic library symbol loading mechanisms\&. +.br +\fIpFunctions\fP pointer to the struct of functions to use for vulkan operations\&. Can be NULL in which case the function will retrieve the proc addresses itself\&. +.RE +.PP + +.SS "\fBktxVulkanDeviceInfo\fP * ktxVulkanDeviceInfo_Create (VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkCommandPool cmdPool, const VkAllocationCallbacks * pAllocator)" + +.PP +Create a \fBktxVulkanDeviceInfo\fP object\&. Allocates CPU memory for a \fBktxVulkanDeviceInfo\fP object then calls \fBktxVulkanDeviceInfo_Construct()\fP\&. See it for documentation of the parameters\&. + +.PP +\fBReturns\fP +.RS 4 +a pointer to the constructed \fBktxVulkanDeviceInfo\fP\&. +.RE +.PP +\fBSee also\fP +.RS 4 +\fBktxVulkanDeviceInfo_Construct()\fP + +.PP +\fBktxVulkanDeviceInfo_Destroy()\fP +.RE +.PP + +.SS "\fBktxVulkanDeviceInfo\fP * ktxVulkanDeviceInfo_CreateEx (VkInstance instance, VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkCommandPool cmdPool, const VkAllocationCallbacks * pAllocator, const \fBktxVulkanFunctions\fP * pFuncs)" + +.PP +Create a \fBktxVulkanDeviceInfo\fP object\&. Allocates CPU memory for a \fBktxVulkanDeviceInfo\fP object then calls \fBktxVulkanDeviceInfo_Construct()\fP\&. See it for documentation of the parameters\&. + +.PP +\fBReturns\fP +.RS 4 +a pointer to the constructed \fBktxVulkanDeviceInfo\fP\&. +.RE +.PP +\fBSee also\fP +.RS 4 +\fBktxVulkanDeviceInfo_Construct()\fP + +.PP +\fBktxVulkanDeviceInfo_Destroy()\fP +.RE +.PP + +.SS "void ktxVulkanDeviceInfo_Destroy (\fBktxVulkanDeviceInfo\fP * This)" + +.PP +Destroy a \fBktxVulkanDeviceInfo\fP object\&. Calls \fBktxVulkanDeviceInfo_Destruct()\fP then frees the \fBktxVulkanDeviceInfo\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxVulkanDeviceInfo\fP to destroy\&. +.RE +.PP + +.SS "void ktxVulkanDeviceInfo_Destruct (\fBktxVulkanDeviceInfo\fP * This)" + +.PP +Destruct a \fBktxVulkanDeviceInfo\fP object\&. Frees the command buffer\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxVulkanDeviceInfo\fP to destruct\&. +.RE +.PP + +.SS "void ktxVulkanTexture_Destruct (\fBktxVulkanTexture\fP * vkTexture, VkDevice device, const VkAllocationCallbacks * pAllocator)" + +.PP +Destructor for the object returned when loading a texture image\&. Calls \fBktxVulkanTexture_Destruct_WithSuballocator()\fP without a set of suballocator callbacks\&. + +.PP +\fBSee also\fP +.RS 4 +\fBktxVulkanTexture_Destruct_WithSuballocator()\fP for details and use that for complete control\&. +.RE +.PP + +.SS "\fBktx_error_code_e\fP ktxVulkanTexture_Destruct_WithSuballocator (\fBktxVulkanTexture\fP * vkTexture, VkDevice device, const VkAllocationCallbacks * pAllocator, \fBktxVulkanTexture_subAllocatorCallbacks\fP * subAllocatorCallbacks)" + +.PP +Destructor for the object returned when loading a texture image\&. Frees the Vulkan resources created when the texture image was loaded\&. If a complete set of suballocator callbacks are provided, it will use the free call from those instead\&. + +.PP +\fBParameters\fP +.RS 4 +\fIvkTexture\fP pointer to the \fBktxVulkanTexture\fP to be destructed\&. +.br +\fIdevice\fP handle to the Vulkan logical device to which the texture was loaded\&. +.br +\fIpAllocator\fP pointer to the allocator used during loading\&. +.br +\fIsubAllocatorCallbacks\fP pointer to a structure of suballocator callbacks\&. Pass NULL if a suballocator was not used\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, KTX_INVALID_VALUE if the supplied subAllocatorCallbacks structure is incomplete\&. +.RE +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/kvData.3 b/ktx/build/docs/man/man3/kvData.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/kvData.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/kvDataHead.3 b/ktx/build/docs/man/man3/kvDataHead.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/kvDataHead.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/kvDataLen.3 b/ktx/build/docs/man/man3/kvDataLen.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/kvDataLen.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/layerCount.3 b/ktx/build/docs/man/man3/layerCount.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/layerCount.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/levelCount.3 b/ktx/build/docs/man/man3/levelCount.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/levelCount.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/libktx_history.3 b/ktx/build/docs/man/man3/libktx_history.3 new file mode 100644 index 0000000..727d259 --- /dev/null +++ b/ktx/build/docs/man/man3/libktx_history.3 @@ -0,0 +1,142 @@ +.TH "libktx_history" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +libktx_history \- Revision History +.PP +No longer updated\&. Kept to preserve ancient history\&. For more recent history see the repo log at https://github.com/KhronosGroup/KTX-Software\&. See also the Release Notes in the repo\&. +.SH "Version 4\&.0" +.PP +Added: +.PD 0 +.IP "\(bu" 1 +Support for KTX Version 2\&. +.IP "\(bu" 1 +Support for encoding and transcoding Basis Universal images in KTX Version 2 files\&. +.IP "\(bu" 1 +Function to print info about a KTX file\&. +.PP +.SH "Version 3\&.0\&.1" +.PP +Fixed: +.PD 0 +.IP "\(bu" 1 +GitHub issue #159: compile failure with recent Vulkan SDKs\&. +.IP "\(bu" 1 +Incorrect mapping of GL DXT3 and DXT5 formats to Vulkan equivalents\&. +.IP "\(bu" 1 +Incorrect BC4 blocksize\&. +.IP "\(bu" 1 +Missing mapping of PVRTC formats from GL to Vulkan\&. +.IP "\(bu" 1 +Incorrect block width and height calculations for sizes that are not a multiple of the block size\&. +.IP "\(bu" 1 +Incorrect KTXorientation key in test images\&. +.PP +.SH "Version 3\&.0" +.PP +Added: +.PD 0 +.IP "\(bu" 1 +new \fBktxTexture\fP object based API for reading KTX files without an OpenGL context\&. +.IP "\(bu" 1 +Vulkan loader\&. #include to use it\&. +.PP +Changed: +.PD 0 +.IP "\(bu" 1 +\fBktx\&.h\fP to not depend on KHR/khrplatform\&.h and GL{,ES*}/gl{corearb,}\&.h\&. Applications using OpenGL must now include these files themselves\&. +.IP "\(bu" 1 +ktxLoadTexture[FMN], removing the hack of loading 1D textures as 2D textures when the OpenGL context does not support 1D textures\&. KTX_UNSUPPORTED_TEXTURE_TYPE is now returned\&. +.PP +.SH "Version 2\&.0\&.2" +.PP +Added: +.PD 0 +.IP "\(bu" 1 +Support for cubemap arrays\&. +.PP +Changed: +.PD 0 +.IP "\(bu" 1 +New build system +.PP +Fixed: +.PD 0 +.IP "\(bu" 1 +GitHub issue #40: failure to byte-swap key-value lengths\&. +.IP "\(bu" 1 +GitHub issue #33: returning incorrect target when loading cubemaps\&. +.IP "\(bu" 1 +GitHub PR #42: loading of texture arrays\&. +.IP "\(bu" 1 +GitHub PR #41: compilation error when KTX_OPENGL_ES2=1 defined\&. +.IP "\(bu" 1 +GitHub issue #39: stack-buffer-overflow in toktx +.IP "\(bu" 1 +Don't use GL_EXTENSIONS on recent OpenGL versions\&. +.PP +.SH "Version 2\&.0\&.1" +.PP +Added: +.PD 0 +.IP "\(bu" 1 +CMake build files\&. Thanks to Pavel Rotjberg for the initial version\&. +.PP +Changed: +.PD 0 +.IP "\(bu" 1 +ktxWriteKTXF to check the validity of the type & format combinations passed to it\&. +.PP +Fixed: +.PD 0 +.IP "\(bu" 1 +Public Bugzilla \fR999\fP: 16-bit luminance texture cannot be written\&. +.IP "\(bu" 1 +compile warnings from compilers stricter than MS Visual C++\&. Thanks to Pavel Rotjberg\&. +.PP +.SH "Version 2\&.0" +.PP +Added: +.PD 0 +.IP "\(bu" 1 +support for decoding ETC2 and EAC formats in the absence of a hardware decoder\&. +.IP "\(bu" 1 +support for converting textures with legacy LUMINANCE, LUMINANCE_ALPHA, etc\&. formats to the equivalent R, RG, etc\&. format with an appropriate swizzle, when loading in OpenGL Core Profile contexts\&. +.IP "\(bu" 1 +ktxErrorString function to return a string corresponding to an error code\&. +.IP "\(bu" 1 +tests for ktxLoadTexture[FN] that run under OpenGL ES 3\&.0 and OpenGL 3\&.3\&. The latter includes an EGL on WGL wrapper that makes porting apps between OpenGL ES and OpenGL easier on Windows\&. +.IP "\(bu" 1 +more texture formats to ktxLoadTexture[FN] and toktx tests\&. +.PP +Changed: +.PD 0 +.IP "\(bu" 1 +ktxLoadTexture[FMN] to discover the capabilities of the GL context at run time and load textures, or not, according to those capabilities\&. +.PP +Fixed: +.PD 0 +.IP "\(bu" 1 +failure of ktxWriteKTXF to pad image rows to 4 bytes as required by the KTX format\&. +.IP "\(bu" 1 +ktxWriteKTXF exiting with KTX_FILE_WRITE_ERROR when attempting to write more than 1 byte of face-LOD padding\&. +.PP +Although there is only a very minor API change, the addition of ktxErrorString, the functional changes are large enough to justify bumping the major revision number\&. +.SH "Version 1\&.0\&.1" +.PP +Implemented ktxLoadTextureM\&. Fixed the following: +.PD 0 +.IP "\(bu" 1 +Public Bugzilla \fR571\fP: crash when null passed for pIsMipmapped\&. +.IP "\(bu" 1 +Public Bugzilla \fR572\fP: memory leak when unpacking ETC textures\&. +.IP "\(bu" 1 +Public Bugzilla \fR573\fP: potential crash when unpacking ETC textures with unused padding pixels\&. +.IP "\(bu" 1 +Public Bugzilla \fR576\fP: various small fixes\&. +.PP +Thanks to Krystian Bigaj for the ktxLoadTextureM implementation and these fixes\&. +.SH "Version 1\&.0" +.PP +Initial release\&. diff --git a/ktx/build/docs/man/man3/libktx_js.3 b/ktx/build/docs/man/man3/libktx_js.3 new file mode 100644 index 0000000..1f13379 --- /dev/null +++ b/ktx/build/docs/man/man3/libktx_js.3 @@ -0,0 +1,639 @@ +.TH "libktx_js" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Javascript Wrappers Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +libktx_js \- libktx Binding +.PP + +.SH "WebIDL for the binding" +.PP +Items marked with ** are only available in the full \fIlibktx\&.js\fP wrapper\&. Unmarked items are available in both \fIlibktx\&.js\fP and \fIlibktx_read\&.js\fP\&. + +.PP +.PP +.nf +interface Orientation { + readonly attribute OrientationX x; + readonly attribute OrientationY y; + readonly attribute OrientationZ z; +}; + +interface UploadResult { + readonly attribute WebGLTexture texture; + readonly attribute GLenum target; + readonly attribute GLenum error; +}; + +interface textureCreateInfo { // ** + constructor(); + + attribute long vkFormat; + attribute long baseWidth; + attribute long baseHeight; + attribute long baseDepth; + attribute long numDimensions; + attribute long numLevels; + attribute long numLayers; + attribute long numFaces; + attribute boolean isArray; + attribute boolean generateMipmaps; +}; + +interface astcParams { // ** + constructor(); + + attribute boolean verbose; + attribute long threadCount; + attribute astc_block_dimension blockDimension; + attribute pack_astc_encoder_mode mode; + attribute long qualityLevel; + attribute boolean normalMap; + attribute DOMString inputSwizzle; +}; + +interface basisParams { // ** + constructor(); + + attribute boolean uastc, + attribute boolean verbose, + attribute boolean noSSE, + attribute long threadCount, + attribute DOMString inputSwizzle, + attribute boolean preSwizzle, + + // ETC1S/Basis\-LZ parameters\&. + + attribute long compressionLevel, + attribute long qualityLevel, + attribute long maxEndpoints, + attribute float endpointRDOThreshold, + attribute long maxSelectors, + attribute float selectorRDOThreshold, + attribute boolean normalMap, + attribute boolean noEndpointRDO, + attribute boolean noSelectorRDO, + + // UASTC parameters\&. + + attribute pack_uastc_flag_bits uastcFlags, + attribute boolean uastcRDO, + attribute float uastcRDOQualityScalar, + attribute long uastcRDODictSize, + attribute float uastcRDOMaxSmoothBlockErrorScale, + attribute float uastcRDOMaxSmoothBlockStdDev, + attribute boolean uastcRDODontFavorSimplerModes, + attribute boolean uastcRDONoMultithreading +}; + +interface texture { + constructor(ArrayBufferView fileData); + constructor(textureCreateInfo createInfo, // ** + CreateStorageEnum? storage); + + error_code compressAstc(ktxAstcParams params); // ** + error_code decodeAstc(ktxAstcParams params); + error_code compressBasis(ktxBasisParams params); // ** + texture createCopy(); // ** + error_code defateZLIB(); // ** + error_code deflateZstd(); // ** + ArrayBufferView getImage(long level, long layer, long faceSlice); + UploadResult glUpload(); + error_code setImageFromMemory(long level, long layer, long faceSlice, + ArrayBufferView imageData); // ** + error_code transcodeBasis(transcode_fmt? target, transcode_flag_bits + decodeFlags); + ArrayBufferView writeToMemory(); // ** + error_code addKVPairString(DOMString key, DOMString value); // ** + error_code addKVPairByte(DOMString key, ArrayBuffewView value); // ** + deleteKVPair(DOMString key); // ** + DOMString? findKeyValue(DOMString key); + + readonly attribute long baseWidth; + readonly attribute long baseHeight; + readonly attribute boolean isSRGB; + readonly attribute boolean isPremultiplied; + readonly attribute boolean needsTranscoding; + readonly attribute long numComponents; + readonly attribute long vkFormat; + readonly attribute SupercmpScheme supercompressionScheme; + readonly attribute ktxOrientation orientation; + + attribute khr_df_transfer OETF; // Setting available only in libktx\&.js\&. + attribute khr_df_primaries primaries; // Setting available only in libktx\&.js\&. +}; + +enum error_code = { + "SUCCESS", + "FILE_DATA_ERROR", + "FILE_ISPIPE", + "FILE_OPEN_FAILED", + "FILE_OVERFLOW", + "FILE_READ_ERROR", + "FILE_SEEK_ERROR", + "FILE_UNEXPECTED_ERROR", + "FILE_WRITE_ERROR", + "GL_ERROR", + "INVALID_OPERATION", + "INVALID_VALUE", + "NOT_FOUND", + "OUT_OF_MEMORY", + "TRANSCODE_FAILED", + "UNKNOWN_FILE_FORMAT", + "UNSUPPORTED_TEXTURE_TYPE", + "UNSUPPORTED_FEATURE", + "LIBRARY_NOT_LINKED" +}; + +enum CreateStorageEnum = { + "NO_STORAGE", + "ALLOC_STORAGE" +}; + +// Some targets may not be available depending on options used when compiling +// the web assembly\&. ktxTexture\&.transcodeBasis will report this\&. +enum transcode_fmt = { + "ETC1_RGB", + "BC1_RGB", + "BC4_R", + "BC5_RG", + "BC3_RGBA", + "BC1_OR_3", + "PVRTC1_4_RGB", + "PVRTC1_4_RGBA", + "BC7_RGBA", + "ETC2_RGBA", + "ASTC_4x4_RGBA", + "RGBA32", + "RGB565", + "BGR565", + "RGBA4444", + "PVRTC2_4_RGB", + "PVRTC2_4_RGBA", + "ETC", + "EAC_R11", + "EAC_RG11" +}; + +enum transcode_flag_bits { + "TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS" +}; + +enum OrientationX { + "LEFT", + "RIGHT" +}; +enum OrientationY { + "UP", + "DOWN" +}; +enum OrientationZ { + "IN", + "OUT" +}; + +enum SupercmpScheme { + "NONE", + "BASIS_LZ", + "ZSTD" + "ZLIB" +}; + +enum khr_df_primaries = { + // These are the values needed for KTX with HTML5/WebGL\&. + "UNSPECIFIED", + "BT709", + "SRGB" + "DISPLAYP3" +}; + +enum khr_df_transfer = { + // These are the values needed for KTX with HTML5/WebGL\&. + "UNSPECIFIED", + "LINEAR", + "SRGB", + // DisplayP3 uses the SRGB transfer function\&. +}; + +enum VkFormat = { + "R8G8B8A8_SRGB", + "R8G8B8A8_UNORM" + // Full list omitted as its length will distract from the documentation + // purpose of this IDL\&. Any VkFormat valid for KTX can be used\&. As shown + // here, omit the VK_FORMAT_ prefix and enclose in quotes\&. + +enum pack_astc_quality_levels = { // ** + "FASTEST", + "FAST", + "MEDIUM", + "THOROUGH", + "EXHAUSTIVE", +}; + +enum pack_astc_block_dimension = { // ** + // 2D formats + "D4x4", + "D5x4", + "D5x5", + "D6x5", + "D6x6", + "D8x5", + "D8x6", + "D10x5", + "D10x6", + "D8x8", + "D10x8", + "D10x10", + "D12x10", + "D12x12", + // 3D formats + "D3x3x3", + "D4x3x3", + "D4x4x3", + "D4x4x4", + "D5x4x4", + "D5x5x4", + "D5x5x5", + "D6x5x5", + "D6x6x5", + "D6x6x6" +}; + +enum pack_astc_encoder_mode = { // ** + "DEFAULT", + "LDR", + "HDR" +}; + +enum pack_uastc_flag_bits = { // ** + "LEVEL_FASTEST", + "LEVEL_FASTER", + "LEVEL_DEFAULT", + "LEVEL_SLOWER", + "LEVEL_VERYSLOW", +}; + +const DOMString ANIMDATA_KEY = "KTXanimData"; +const DOMStringORIENTATION_KEY = "KTXorientation"; +const DOMString SWIZZLE_KEY = "KTXswizzle"; +const DOMString WRITER_KEY = "KTXwriter"; +const DOMString WRITER_SCPARAMS_KEY = "KTXwriterScParams"; +const unsigned long FACESLICE_WHOLE_lEVEL = UINT_MAX; +const unsigned long ETC1S_DEFAULT_COMPRESSION_LEVEL = 2; +.fi +.PP +.SH "How to use" +.PP +Put libktx\&.js and libktx\&.wasm in a directory on your server\&. Create a script tag with libktx\&.js as the \fRsrc\fP in your \&.html as shown below, changing the path as necessary for the relative locations of your \&.html file and the script source\&. libktx\&.js will automatically load libktx\&.wasm\&. +.PP +.nf + + +.fi +.PP + +.PP +\fBNote\fP +.RS 4 +For the read-only version of the library, use libktx_read\&.js and libktx_read\&.wasm instead\&. +.RE +.PP +.SS "Create an instance of the ktx module" +To avoid polluting the global \fRwindow\fP name space all methods, variables and tokens related to libktx are wrapped in a function that returns a promise\&. The promise is fulfilled with a module instance when it is safe to run the compiled code\&. To use any of the features your code must call the function, wait for the promise to be fulfulled and use the returned instance\&. Before calling the function your code must create your WebGL context\&. The context is needed during module initialization so that the \fRglUpload\fP function can provide WebGLTexture object handles on the same context\&. + +.PP +The function is called \fIcreateKtxModule\fP\&. In previous releases it was called \fILIBKTX\fP\&. It has been renamed to clarify what it is actually doing\&. Old scripts should be updated to the new name as the old name will be removed soon\&. + +.PP +\fBNote\fP +.RS 4 +In libktx_read\&.js the function is called \fIcreateKtxReadModule\fP\&. +.RE +.PP +Add the following to the top of your script to call the function, wait for the instance of the ktx module, make it available in the window name space, make your WebGL context the current context in Emscripten's OpenGL emulation and call your \fRmain()\fP\&. + +.PP +This snippet shows WebGL context creation as well\&. + +.PP +.PP +.nf +const canvas = document\&.querySelector('#glcanvas'); +gl = canvas\&.getContext('webgl2'); + +// If we don't have a GL context, give up now +if (!gl) { + alert('Unable to initialize WebGL\&. Your browser or machine may not support it\&.'); +} else { + createKtxModule({preinitializedWebGLContext: gl})\&.then(instance => { + window\&.ktx = instance; + // Make existing WebGL context current for Emscripten OpenGL\&. + ktx\&.GL\&.makeContextCurrent( + ktx\&.GL\&.createContext(document\&.getElementById("glcanvas"), + { majorVersion: 2\&.0 }) + ); + main() + }); +} +.fi +.PP + +.PP +This calls \fRmain()\fP after the module instance has been created\&. Start the rest of your code there\&. +.SH "Downloading and using an existing KTX texture\&." +.PP +To download an existing texture and create a WebGL texture from it, execute a function like \fRloadTexture\fP in the following: + +.PP +.PP +.nf +var myTexture; + +main() { + loadTexture(gl, "myTextureUrl"); +} + +function loadTexture(gl, url) +{ + // Create placeholder which will be replaced once the data arrives\&. + myTexture = createPlaceholderTexture(gl, [0, 0, 255, 255]); + gl\&.bindTexture(myTexture\&.target, myTexture\&.object); + + var xhr = new XMLHttpRequest(); + xhr\&.open('GET', url); + xhr\&.responseType = "arraybuffer"; + xhr\&.onload = function(){ + var ktxdata = new Uint8Array(this\&.response); + ktexture = new ktx\&.texture(ktxdata); + const tex = uploadTextureToGl(gl, ktexture); + setTexParameters(tex, ktexture); + gl\&.bindTexture(tex\&.target, tex\&.object); + gl\&.deleteTexture(texture\&.object); + texture = tex; + // Use code like this to display the transcode target format\&. + // elem('format')\&.innerText = tex\&.format; + ktexture\&.delete(); + }; + + //xhr\&.onprogress = runProgress; + //xhr\&.onloadstart = openProgress; + xhr\&.send(); +} +.fi +.PP + +.PP +This is the function for creating the place holder texture\&. + +.PP +.PP +.nf +function createPlaceholderTexture(gl, color) +{ + const placeholder = gl\&.createTexture(); + gl\&.bindTexture(gl\&.TEXTURE_2D, placeholder); + + const level = 0; + const internalFormat = gl\&.RGBA; + const width = 1; + const height = 1; + const border = 0; + const srcFormat = gl\&.RGBA; + const srcType = gl\&.UNSIGNED_BYTE; + const pixel = new Uint8Array(color); + + gl\&.texImage2D(gl\&.TEXTURE_2D, level, internalFormat, + width, height, border, srcFormat, srcType, + pixel); + return { + target: gl\&.TEXTURE_2D, + object: placeholder, + format: formatString, + }; +} +.fi +.PP + +.PP +Uploading the KTX texture to the WebGL context is done like this\&. This function returns the created WebGL texture object and matching texture target\&. + +.PP +.PP +.nf +function uploadTextureToGl(gl, ktexture) { + const { transcode_fmt } = ktx; + var formatString; + + if (ktexture\&.needsTranscoding) { + var format; + if (astcSupported) { + formatString = 'ASTC'; + format = transcode_fmt\&.ASTC_4x4_RGBA; + } else if (dxtSupported) { + formatString = ktexture\&.numComponents == 4 ? 'BC3' : 'BC1'; + format = transcode_fmt\&.BC1_OR_3; + } else if (pvrtcSupported) { + formatString = 'PVRTC1'; + format = transcode_fmt\&.PVRTC1_4_RGBA; + } else if (etcSupported) { + formatString = 'ETC'; + format = transcode_fmt\&.ETC; + } else { + formatString = 'RGBA4444'; + format = transcode_fmt\&.RGBA4444; + } + if (ktexture\&.transcodeBasis(format, 0) != ktx\&.error_code\&.SUCCESS) { + alert('Texture transcode failed\&. See console for details\&.'); + return undefined; + } + } + + const result = ktexture\&.glUpload(); + if (result\&.error != gl\&.NO_ERROR) { + alert('WebGL error when uploading texture, code = ' + + result\&.error\&.toString(16)); + return undefined; + } + if (result\&.object === undefined) { + alert('Texture upload failed\&. See console for details\&.'); + return undefined; + } + if (result\&.target != gl\&.TEXTURE_2D) { + alert('Loaded texture is not a TEXTURE2D\&.'); + return undefined; + } + + return { + target: result\&.target, + object: result\&.object, + format: formatString, + } +} +.fi +.PP + +.PP +This is the function to correctly set the TexParameters for the loaded texture\&. It expects that the WebGLTexture object in the \fRtexture\fP parameter was created from the content of the ktexture parameter\&. + +.PP +.PP +.nf +function setTexParameters(texture, ktexture) { + gl\&.bindTexture(texture\&.target, texture\&.object); + + if (ktexture\&.numLevels > 1 || ktexture\&.generateMipmaps) { + // Enable bilinear mipmapping\&. + gl\&.texParameteri(texture\&.target, + gl\&.TEXTURE_MIN_FILTER, gl\&.LINEAR_MIPMAP_NEAREST); + } else { + gl\&.texParameteri(texture\&.target, gl\&.TEXTURE_MIN_FILTER, gl\&.LINEAR); + } + gl\&.texParameteri(texture\&.target, gl\&.TEXTURE_MAG_FILTER, gl\&.LINEAR); + + gl\&.bindTexture(texture\&.target, null); +} +.fi +.PP + +.PP +\fBNote\fP +.RS 4 +It is not clear if glUpload can be used with, e\&.g\&. THREE\&.js\&. It may be necessary to expose the ktxTexture_IterateLevelFaces or ktxTexture_IterateLoadLevelFaces API to JS with those calling a callback in JS to upload each image to WebGL\&. +.RE +.PP +.SH "Creating a new KTX texture" +.PP +This function shows the main steps: + +.PP +.PP +.nf +async function runTests(filename) { + const img = await loadImage(filename); + const imageData = await loadImageData(img); + const ktexture = await createTexture(imageData); +} +.fi +.PP + +.PP +Step 1 is to fetch the image via code such as this: + +.PP +.PP +.nf + async function loadImage(src){ + return new Promise((resolve, reject) => { + let img = new Image(); + div = items[origImageItem]\&.element; + img\&.onload = () => { div\&.appendChild(img); resolve(img); } + img\&.onerror = reject; + img\&.src = src; + }) + } +} +.fi +.PP + +.PP +Step 2 is to get the image data via code such as the following\&. Note that to get data at the original image size you must use \fRimg\&.naturalWidth\fP and \fRimg\&.naturalHeight\fP as shown here\&. If you use \fRimg\&.width\fP and \fRimg\&.height\fP the image data will be rendered at whatever size your CSS is displaying the canvas\&. + +.PP +.PP +.nf +async function loadImageData (img, flip = false) { + const canvas = document\&.createElement("canvas"); + const context = canvas\&.getContext("2d"); + const width = img\&.naturalWidth; + const height = img\&.naturalHeight; + canvas\&.width = width; + canvas\&.height = height; + + if (flip) { + context\&.translate(0, height); + context\&.scale(1, \-1); + } + context\&.drawImage(img, 0, 0, width, height); + + const imageData = context\&.getImageData(0, 0, width, height); + return imageData; +}; +.fi +.PP + +.PP +Step 3 is to create the KTX texture object as shonw here: + +.PP +.PP +.nf +async function createTexture(imageData) { + const createInfo = new ktx\&.textureCreateInfo(); + const colorSpace = imageData\&.colorSpace; + + createInfo\&.baseWidth = imageData\&.width; + createInfo\&.baseHeight = imageData\&.height; + createInfo\&.baseDepth = 1; + createInfo\&.numDimensions = 2; + createInfo\&.numLevels = 1; + createInfo\&.numLayers = 1; + createInfo\&.numFaces = 1; + createInfo\&.isArray = false; + createInfo\&.generateMipmaps = false; + + var displayP3; + // Image data from 2d canvases is always 8\-bit RGBA\&. + // The only possible ImageData colorSpace choices are undefined, "srgb" + // and "displayp3\&." All use the sRGB transfer function\&. + createInfo\&.vkFormat = ktx\&.VkFormat\&.R8G8B8A8_SRGB; + if ( imageData\&.colorSpace == "display\-p3") { + displayP3 = true; + } + + const ktexture = new ktx\&.texture(createInfo, ktx\&.CreateStorageEnum\&.ALLOC_STORAGE); + if (ktexture != null) { + if (displayP3) { + ktexture\&.primaries = ktx\&.khr_df_primaries\&.DISPLAYP3; + } + result = ktexture\&.setImageFromMemory(0, 0, 0, imageData\&.data); + } + return ktexture; +} +.fi +.PP + +.PP +The texture can now be uploaded to WebGL with \fRuploadTextureToGl\fP, that was listed earlier, and then displayed\&. + +.PP +The texture can be compressed to one of the Basis universal formats with code like the following\&. + +.PP +.PP +.nf +async function testEncodeBasis(ktexture) { + const basisu_options = new ktx\&.basisParams(); + + basisu_options\&.uastc = false; + basisu_options\&.noSSE = true; + basisu_options\&.verbose = false; + basisu_options\&.qualityLevel = 200; + basisu_options\&.compressionLevel = ktx\&.ETC1S_DEFAULT_COMPRESSION_LEVEL; + + var result = ktexture\&.compressBasis(basisu_options); + // Check result for ktx\&.error_code\&.SUCCESS\&. +} +.fi +.PP + +.PP +Finally the texture can be written back to Javascript with this single line of code: + +.PP +.PP +.nf +const serializedTexture = ktexture\&.writeToMemory(); +.fi +.PP + +.PP +\fRserializedTexture\fP is a TypedArray\&. The web client can write the data to a local file or upload it to a server\&. diff --git a/ktx/build/docs/man/man3/license.3 b/ktx/build/docs/man/man3/license.3 new file mode 100644 index 0000000..d85252a --- /dev/null +++ b/ktx/build/docs/man/man3/license.3 @@ -0,0 +1,28 @@ +.TH "license" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "Khronos Texture Software" \" -*- nroff -*- +.ad l +.nh +.SH NAME +license \- LICENSE file for the KhronosGroup/KTX-Software project +.PP + + +.PP +Files unique to this repository generally fall under the Apache 2\&.0 license with copyright holders including Mark Callow, the KTX-Software author; The Khronos Group Inc\&., which has supported KTX development; and other contributors to the KTX project\&. + +.PP +Because KTX-Software incorporates material and contributions from many other projects, which often have their own licenses, there are many other licenses in use in this repository\&. While there are many licenses in this repository, with rare exceptions all are open source licenses that we believe to be mutually compatible\&. + +.PP +The complete text of each of the licenses used in this repository is found in LICENSES/*\&.txt \&. Additionally, we have updated the repository to pass the REUSE compliance checker tool (see https://reuse.software/)\&. REUSE verifies that every file in a git repository either incorporates a license, or that the license is present in auxiliary files such as \&.reuse/dep5 \&. To obtain a bill of materials for the repository identifying the license for each file, install the REUSE tool and run +.PP +.nf +reuse spdx + +.fi +.PP + +.PP +inside the repository\&. +.SH "Special Cases" +.PP +The file lib/etcdec\&.cxx is not open source\&. It is made available under the terms of an Ericsson license, found in the file itself\&. diff --git a/ktx/build/docs/man/man3/maxEndpoints.3 b/ktx/build/docs/man/man3/maxEndpoints.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/maxEndpoints.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/maxSelectors.3 b/ktx/build/docs/man/man3/maxSelectors.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/maxSelectors.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/mem.3 b/ktx/build/docs/man/man3/mem.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/mem.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/memoryMapFuncPtr.3 b/ktx/build/docs/man/man3/memoryMapFuncPtr.3 new file mode 100644 index 0000000..c4bd4c2 --- /dev/null +++ b/ktx/build/docs/man/man3/memoryMapFuncPtr.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture_subAllocatorCallbacks.3 diff --git a/ktx/build/docs/man/man3/memoryUnmapFuncPtr.3 b/ktx/build/docs/man/man3/memoryUnmapFuncPtr.3 new file mode 100644 index 0000000..c4bd4c2 --- /dev/null +++ b/ktx/build/docs/man/man3/memoryUnmapFuncPtr.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture_subAllocatorCallbacks.3 diff --git a/ktx/build/docs/man/man3/memstream.c.3 b/ktx/build/docs/man/man3/memstream.c.3 new file mode 100644 index 0000000..0a79e23 --- /dev/null +++ b/ktx/build/docs/man/man3/memstream.c.3 @@ -0,0 +1,171 @@ +.TH "lib/memstream.c" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +lib/memstream.c \- Implementation of \fBktxStream\fP for memory\&. + +.SH SYNOPSIS +.br +.PP +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include \fP +.br +\fR#include 'ktx\&.h'\fP +.br +\fR#include 'ktxint\&.h'\fP +.br +\fR#include 'memstream\&.h'\fP +.br + +.SS "Macros" + +.in +1c +.ti -1c +.RI "#define \fBKTX_MEM_DEFAULT_ALLOCATED_SIZE\fP 256" +.br +.RI "Default allocation size for a ktxMemStream\&. " +.in -1c +.SS "Functions" + +.in +1c +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxMemStream_getdata\fP (\fBktxStream\fP *str, ktx_uint8_t **ppBytes)" +.br +.RI "Get a pointer to a ktxMemStream's data\&. " +.ti -1c +.RI "void \fBktxMemStream_setup\fP (\fBktxStream\fP *str)" +.br +.RI "Setup ktxMemStream function pointers\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxMemStream_construct\fP (\fBktxStream\fP *str, ktx_bool_t freeOnDestruct)" +.br +.RI "Initialize a read-write ktxMemStream\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxMemStream_construct_ro\fP (\fBktxStream\fP *str, const ktx_uint8_t *bytes, const ktx_size_t numBytes)" +.br +.RI "Initialize a read-only ktxMemStream\&. " +.ti -1c +.RI "void \fBktxMemStream_destruct\fP (\fBktxStream\fP *str)" +.br +.RI "Free the memory used by a ktxMemStream\&. " +.in -1c +.SH "Detailed Description" +.PP +Implementation of \fBktxStream\fP for memory\&. + + +.PP +\fBAuthor\fP +.RS 4 +Maksim Kolesin, Under Development + +.PP +Georg Kolling, Imagination Technology + +.PP +Mark Callow, HI Corporation +.RE +.PP + +.SH "Function Documentation" +.PP +.SS "\fBKTX_error_code\fP ktxMemStream_construct (\fBktxStream\fP * str, ktx_bool_t freeOnDestruct)" + +.PP +Initialize a read-write ktxMemStream\&. Memory is allocated as data is written\&. The caller of this is responsible for freeing this memory unless \fIfreeOnDestruct\fP is not KTX_FALSE\&. + +.PP +\fBParameters\fP +.RS 4 +\fIstr\fP pointer to a \fBktxStream\fP struct to initialize\&. +.br +\fIfreeOnDestruct\fP If not KTX_FALSE memory holding the data will be freed by the destructor\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRstr\fP is \fRNULL\fP\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP system failed to allocate sufficient memory\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxMemStream_construct_ro (\fBktxStream\fP * str, const ktx_uint8_t * bytes, const ktx_size_t numBytes)" + +.PP +Initialize a read-only ktxMemStream\&. +.PP +\fBParameters\fP +.RS 4 +\fIstr\fP pointer to a \fBktxStream\fP struct to initialize\&. +.br +\fIbytes\fP pointer to an array of bytes containing the data\&. +.br +\fInumBytes\fP size of array of data for ktxMemStream\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRstr\fP or \fRmem\fP is \fRNULL\fP or \fRnumBytes\fP is 0\&. or \fRsize\fP is less than 0\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP system failed to allocate sufficient memory\&. +.RE +.PP + +.SS "void ktxMemStream_destruct (\fBktxStream\fP * str)" + +.PP +Free the memory used by a ktxMemStream\&. This only frees the memory used to store the data written to the stream, if the \fRfreeOnDestruct\fP parameter to \fBktxMemStream_construct()\fP was not \fRKTX_FALSE\fP\&. Otherwise it is the responsibility of the caller of \fBktxMemStream_construct()\fP and a pointer to this memory should be retrieved using \fBktxMemStream_getdata()\fP before calling this function\&. + +.PP +\fBSee also\fP +.RS 4 +\fBktxMemStream_construct\fP, \fBktxMemStream_getdata\fP\&. +.RE +.PP +\fBParameters\fP +.RS 4 +\fIstr\fP pointer to the \fBktxStream\fP whose memory is to be freed\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxMemStream_getdata (\fBktxStream\fP * str, ktx_uint8_t ** ppBytes)" + +.PP +Get a pointer to a ktxMemStream's data\&. Gets a pointer to data that has been written to the stream\&. Returned pointer will be 0 if stream is read-only\&. + +.PP +\fBParameters\fP +.RS 4 +\fIstr\fP pointer to the \fBktxStream\fP whose data pointer is to be queried\&. +.br +\fIppBytes\fP pointer to a variable in which the data pointer will be written\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRstr\fP or \fRppBytes\fP is \fRNULL\fP\&. +.RE +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/mode.3 b/ktx/build/docs/man/man3/mode.3 new file mode 100644 index 0000000..562d74c --- /dev/null +++ b/ktx/build/docs/man/man3/mode.3 @@ -0,0 +1 @@ +.so man3/ktxAstcParams.3 diff --git a/ktx/build/docs/man/man3/msc_basis_transcoder.3 b/ktx/build/docs/man/man3/msc_basis_transcoder.3 new file mode 100644 index 0000000..8d9a45d --- /dev/null +++ b/ktx/build/docs/man/man3/msc_basis_transcoder.3 @@ -0,0 +1,353 @@ +.TH "msc_basis_transcoder" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "KTX Javascript Wrappers Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +msc_basis_transcoder \- Basis Universal Image Transcoder binding +.PP + +.PP +\fBWarning\fP +.RS 4 +Deprecated\&. Use the container independent transcoder from the Binomial LLC repo instead: https://github.com/BinomialLLC/basis_universal\&. This JS wrapper was designed to use an underlying C++ API that accepted image info in a structure\&. The API actually added to basis_universal uses explicit parameters so users of this transcoder will be packing the info into a struct from which it will be immediately unpacked before the underlying transcoder is called\&. +.RE +.PP +.SS "WebIDL for the binding" +.PP +.nf +void initTranscoders(); + +bool isFormatSupported(TranscodeTarget targetFormat, TextureFormat texFormat); + +interface BasisTranscoderState { + void BasisTranscoderState(); +}; + +interface TranscodedImage { + ArrayBufferView get_typed_memory_view(); +}; + +interface TranscodeResult { + TranscodedImage transcodedImage; +}; + +interface BasisLzEtc1sImageTranscoder { + void BasisLzEtc1sImageTranscoder(); + uint32_t getBytesPerBlock(TranscodeTarget format); + bool decode_palettes(uint32_t num_endpoints, + const Uint8Array endpoints, + uint32_t num_selectors, + const Uint8Array selectors); + bool decode_tables(const Uint8Array tableData); + TranscodeResult transcode_image( + TranscodeTarget targetFormat, + const Uint8Array jsInSlices, + ImageInfo imageInfo, + uint32_t decodeFlags = 0, + bool isVideo = false); +}; + +interface BasisUastcImageTranscoder { + void BasisUastcImageTranscoder(); + uint32_t getBytesPerBlock(const TranscodeTarget format); + TranscodeResult transcode_image( + TranscodeTarget targetFormat, + const Uint8Array jsInImage, + basisu_image_desc& imageDesc, + uint32_t decodeFlags = 0, + bool hasAlpha = false, + bool isVideo = false); + +interface ImageInfo = { + ImageInfo(TextureFormat texFormat, uint32_t width, uint32_t height, + uint32_t level); + attribute uint32_t flags; + attribute long rgbByteOffset; + attribute long rgbByteLength; + attribute long alphaByteOffset; + attribute long alphaByteLength; + attribute uint32_t width; + attribute uint32_t height; + attribute uint32_t numBlocksX; + attribute uint32_t numBlocksY; + attribute uint32_t level; +}; + +// Some targets may not be available depending on options used when compiling +// the web assembly\&. +enum TranscodeTarget = { + "ETC1_RGB", + "BC1_RGB", + "BC4_R", + "BC5_RG", + "BC3_RGBA", + "PVRTC1_4_RGB", + "PVRTC1_4_RGBA", + "BC7_RGBA", + "BC7_M6_RGB", //Deprecated\&. Use BC7_RGBA\&. + "BC7_M5_RGBA", //Deprecated\&. Use BC7_RGBA\&. + "ETC2_RGBA", + "ASTC_4x4_RGBA", + "RGBA32", + "RGB565", + "BGR565", + "RGBA4444", + "PVRTC2_4_RGB", + "PVRTC2_4_RGBA", + "EAC_R11", + "EAC_RG11" +}; + +enum TextureFormat = { + "ETC1S", + "UASTC4x4", +}; + +enum TranscodeFlagBits = + "TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS", + "HIGH_QUALITY", +}; + +enum TranscodeFlagBits = { + "TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS", + "HIGH_QUALITY" +}; +.fi +.PP +.SS "How to use" +Put msc_basis_transcoder\&.js and msc_basis_transcoder\&.wasm in a directory on your server\&. Create a script tag with msc_basis_tranacoder\&.js as the \fRsrc\fP as shown below, changing the path as necessary for the relative locations of your \&.html file and the script source\&. msc_basis_transcoder\&.js will automatically load msc_basis_transcoder\&.wasm\&. +.SS "Create an instance of the MSC_TRANSCODER module" +For example, add this to the \&.html file to initialize the transcoder and make it available on the main window\&. +.PP +.nf +<script src="msc_transcoder_wrapper\&.js"></script> +<script type="text/javascript"> + MSC_TRANSCODER()\&.then(module => { + window\&.MSC_TRANSCODER = module; + module\&.initTranscoders(); + // Call a function to begin loading or transcoding\&.\&. +</script> + +.fi +.PP + +.PP +\fIAfter\fP the module is initialized, invoke code that will directly or indirectly cause a function with code like the following to be executed\&. +.SS "Somewhere in the loader/transcoder" +Assume a KTX file is fetched via an XMLHttpRequest which deposits the data into a Uint8Array, "buData"\&.\&.\&. + +.PP +\fBNote\fP +.RS 4 +The names of the data items used in the following code are those from the KTX2 specification but the actual data is not specific to that container format\&. +.RE +.PP +.PP +.nf +const { + BasisLzEtc1sImageTranscoder, + BasisUastcImageTranscoder, + TranscodeTarget +} = MSC_TRANSCODER; + +// Determine from the KTX2 header information in buData if +// the data format is BasisU or Uastc\&. +// supercompressionScheme value == 1, it's TextureFormat\&.ETC1S\&. +// DFD colorModel == 166, it's TextureFormat\&.UASTC4x4\&. +const texFormat = \&.\&.\&. + +// Determine appropriate transcode format from available targets, +// info about the texture, e\&.g\&. texture\&.numComponents, and +// expected use\&. Use values from TranscodeTarget\&. +const targetFormat = \&.\&.\&. +if ( !MSC_TRANSCODER\&.isFormatSupported(targetFormat, texFormat) { + throw new Error( \&.\&.\&. ); +} + +if (TextureFormat\&.UASTC4x4) { + var result = transcodeUastc(targetFormat); +} else { + var result = transcodeEtc1s(targetFormat); +} +if ( result\&.transcodedImage === undefined ) { + throw new Error( 'Unable to transcode image\&.' ); +} +.fi +.PP + +.PP +This is the function for transcoding etc1s\&. + +.PP +.PP +.nf +transcodeEtc1s(targetFormat) { + // Locate the supercompression global data and compresssed + // mip level data within buData\&. + + var bit = new BasisLzEtc1sImageTranscoder(); + + // Find the index of the starts of the endpoints, selectors and tables + // data within buData\&.\&.\&. + var endpointsStart = \&.\&.\&. + var selectorsStart = \&.\&.\&. + var tablesStart = \&.\&.\&. + // The numbers of endpoints & selectors and their byteLengths are items + // within buData\&. They are in the header of a \&.ktx2 file's + // supercompressionGlobalData and in the header of a \&.basis file\&. + + var endpoints = new Uint8Array(buData, endpointsStart, + endpointsByteLength); + var selectors = new Uint8Array(buData, selectorsStart, + selectorsByteLength); + + bit\&.decodePalettes(numEndpoints, endpoints, + numSelectors, selectors); + + var tables = new UInt8Array(buData, tablesStart, tablesByteLength); + bit\&.decodeTables(tables); + + // Determine if the file contains a video sequence\&.\&.\&. + var isVideo = \&.\&.\&. + + // Calculate the total number of images in the data + var numImages = \&.\&.\&. + + // Set up a subarray pointing at the deflated image descriptions + // in buData\&. This is for \&.ktx2 containers\&. The image descriptions + // are located in supercompressionGlobalData\&. \&.basis containers will + // require different code to locate the slice descriptions within + // the file\&. + var imageDescsStart = \&.\&.\&.: + // An imageDesc has 5 uint32 values\&. + var imageDescs = new Uint32Data(buData, imageDescsStart, + numImages * 5 * 4); + var curImageIndex = 0; + + // Pseudo code for processing the levels of a \&.ktx2 container\&.\&.\&. + foreach level { + var leveWidth = width of image at this level + var levelHeight = height of image at this level + imageInfo = new ImageInfo(TextureFormat::ETC1S, levelWidth, levelHeight, + level); + foreach image in level { + // In KTX2 container locate the imageDesc for this image\&. + var imageDesc = imageDescs[curImageIndex++]; + imageInfo\&.flags = imageDesc\&.imageFlags; + imageInfo\&.rgbByteOffset = 0; + imageInfo\&.rgbByteLength = imageDesc\&.rgbSliceByteLength; + imageInfo\&.alphaByteOffset = imageDesc\&.alphaSliceByteOffset > 0 ? imageDesc\&.rgbSliceByteLength : 0; + imageInfo\&.alphaByteLength = imageDesc\&.alphaSliceByteLength; + // Determine the location in the ArrayBuffer of the start + // of the deflated data for level\&. + var levelOffset = \&.\&.\&. + // Make a \&.subarray of the rgb slice data\&. + var levelData = new Uint8Array( + buData, + levelOffset + imageDesc\&.rgbSliceByteOffset, + imageDesc\&.rgbSliceByteLength + imageDesc\&.alphaByteLength + ); + var result = bit\&.transcodeImage( + targetFormat, + levelData, + imageInfo, + 0, + isVideo); + if ( result\&.transcodedImage === undefined ) { + throw new Error( \&.\&.\&. ); + } + let imgData = transcodedImage\&.get_typed_memory_view(); + + // Upload data in imgData to WebGL\&.\&.\&. + + // Do not call delete() until data has been uploaded + // or otherwise copied\&. + transcodedImage\&.delete(); + } + } + + // For \&.basis containers, it is necessary to locate the slice + // description(s) for the image and set the values in imageInfo + // from them\&. Use of the \&.basis\-specific transcoder is recommended\&. + // The definition of the basis_slice_desc struct makes it difficult + // to create JS interface for it with embind\&. +.fi +.PP + +.PP +This is the function for transcoding Uastc\&. + +.PP +.PP +.nf +transcodeUastc(targetFormat) { + var uit = new UastcImageTranscoder(); + + // Determine if the data is supercompressed\&. + var zstd = (supercompressionScheme == 2); + + // Determine if the data has alpha\&. + var hasAlpha = (Channel ID of sample[0] in DFD == 1); + + var dctx; + if (zstd) { + // Initialize the zstd decoder\&. Zstd JS wrapper + wasm is + // a separate package\&. + dctx = ZSTD_createDCtx(); + } + + // Pseudo code for processing the levels of a \&.ktx2 container\&.\&.\&. + foreach level { + // Determine the location in the ArrayBuffer buData of the + // start of the deflated data for the level\&. + var levelData = \&.\&.\&. + if (zstd) { + // Inflate the level data + levelData = ZSTD_decompressDCtx(dctx, levelData, \&.\&.\&. ); + } + + var levelWidth = width of image at this level + var levelHeight = height of image at this level + var depth = depth of texture at this level + var levelImageCount = number of layers * number of faces * depth; + var imageOffsetInLevel = 0; + + var imageInfo = new ImageInfo(TextureFormat::UASTC4x4, + levelWidth, levelHeight, level); + var levelImageByteLength = imageInfo\&.numBlocksX * imageInfo\&.numBlocksY * DFD bytesPlane0; + + foreach image in level { + inImage = Uint8Array(levelData, imageOffsetInLevel, levelImageByteLength); + imageInfo\&.flags = 0; + imageInfo\&.rgbByteOffset = 0; + imageInfo\&.rgbByteLength = levelImageByteLength; + imageInfo\&.alphaByteOffset = 0; + imageInfo\&.alphaByteLength = 0; + + const {transcodedImage} = uit\&.transcodeImage( + targetFormat, + inImage, + imageInfo, + 0, + hasAlpha, + isVideo); + if ( result\&.transcodedImage === undefined ) { + throw new Error( \&.\&.\&. ); + } + let imgData = transcodedImage\&.get_typed_memory_view(); + + // Upload data in imgData to WebGL\&.\&.\&. + + // Do not call delete() until data has been uploaded + // or otherwise copied\&. + transcodedImage\&.delete(); + + imageOffsetInLevel += levelImageByteLength; + } + } + // For \&.basis containers, as with ETC1S, it is necessary to locate + // the slice description for the image and set the values in imageInfo + // from it\&. +} +.fi +.PP + diff --git a/ktx/build/docs/man/man3/noEndpointRDO.3 b/ktx/build/docs/man/man3/noEndpointRDO.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/noEndpointRDO.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/noSSE.3 b/ktx/build/docs/man/man3/noSSE.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/noSSE.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/noSelectorRDO.3 b/ktx/build/docs/man/man3/noSelectorRDO.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/noSelectorRDO.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/normalMap.3 b/ktx/build/docs/man/man3/normalMap.3 new file mode 100644 index 0000000..562d74c --- /dev/null +++ b/ktx/build/docs/man/man3/normalMap.3 @@ -0,0 +1 @@ +.so man3/ktxAstcParams.3 diff --git a/ktx/build/docs/man/man3/numDimensions.3 b/ktx/build/docs/man/man3/numDimensions.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/numDimensions.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/numFaces.3 b/ktx/build/docs/man/man3/numFaces.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/numFaces.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/numLayers.3 b/ktx/build/docs/man/man3/numLayers.3 new file mode 100644 index 0000000..fbd3161 --- /dev/null +++ b/ktx/build/docs/man/man3/numLayers.3 @@ -0,0 +1 @@ +.so man3/ktxTextureCreateInfo.3 diff --git a/ktx/build/docs/man/man3/numLevels.3 b/ktx/build/docs/man/man3/numLevels.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/numLevels.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/orientation.3 b/ktx/build/docs/man/man3/orientation.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/orientation.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/pAllocator.3 b/ktx/build/docs/man/man3/pAllocator.3 new file mode 100644 index 0000000..caa90a4 --- /dev/null +++ b/ktx/build/docs/man/man3/pAllocator.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanDeviceInfo.3 diff --git a/ktx/build/docs/man/man3/pData.3 b/ktx/build/docs/man/man3/pData.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/pData.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/pDfd.3 b/ktx/build/docs/man/man3/pDfd.3 new file mode 100644 index 0000000..fbd3161 --- /dev/null +++ b/ktx/build/docs/man/man3/pDfd.3 @@ -0,0 +1 @@ +.so man3/ktxTextureCreateInfo.3 diff --git a/ktx/build/docs/man/man3/perceptual.3 b/ktx/build/docs/man/man3/perceptual.3 new file mode 100644 index 0000000..562d74c --- /dev/null +++ b/ktx/build/docs/man/man3/perceptual.3 @@ -0,0 +1 @@ +.so man3/ktxAstcParams.3 diff --git a/ktx/build/docs/man/man3/physicalDevice.3 b/ktx/build/docs/man/man3/physicalDevice.3 new file mode 100644 index 0000000..caa90a4 --- /dev/null +++ b/ktx/build/docs/man/man3/physicalDevice.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanDeviceInfo.3 diff --git a/ktx/build/docs/man/man3/preSwizzle.3 b/ktx/build/docs/man/man3/preSwizzle.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/preSwizzle.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/qualityLevel.3 b/ktx/build/docs/man/man3/qualityLevel.3 new file mode 100644 index 0000000..562d74c --- /dev/null +++ b/ktx/build/docs/man/man3/qualityLevel.3 @@ -0,0 +1 @@ +.so man3/ktxAstcParams.3 diff --git a/ktx/build/docs/man/man3/queue.3 b/ktx/build/docs/man/man3/queue.3 new file mode 100644 index 0000000..caa90a4 --- /dev/null +++ b/ktx/build/docs/man/man3/queue.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanDeviceInfo.3 diff --git a/ktx/build/docs/man/man3/read.3 b/ktx/build/docs/man/man3/read.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/read.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/reader.3 b/ktx/build/docs/man/man3/reader.3 new file mode 100644 index 0000000..09a0d52 --- /dev/null +++ b/ktx/build/docs/man/man3/reader.3 @@ -0,0 +1,1287 @@ +.TH "reader" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +reader \- Reader +.PP + \- Read KTX-formatted data\&. + +.SH SYNOPSIS +.br +.PP +.SS "Functions" + +.in +1c +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_DecodeAstc\fP (\fBktxTexture2\fP *This)" +.br +.RI "Decodes a ktx2 texture object, if it is ASTC encoded\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_TranscodeBasis\fP (\fBktxTexture2\fP *This, \fBktx_transcode_fmt_e\fP outputFormat, ktx_transcode_flags transcodeFlags)" +.br +.RI "Transcode a KTX2 texture with BasisLZ/ETC1S or UASTC images\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_CreateFromStream\fP (\fBktxStream\fP *pStream, \fBktxTextureCreateFlags\fP createFlags, \fBktxTexture\fP **newTex)" +.br +.RI "Create a ktx1 or ktx2 texture according to the stream data\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_CreateFromStdioStream\fP (FILE *stdioStream, \fBktxTextureCreateFlags\fP createFlags, \fBktxTexture\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP or \fBktxTexture2\fP from a stdio stream according to the stream data\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_CreateFromNamedFile\fP (const char *const filename, \fBktxTextureCreateFlags\fP createFlags, \fBktxTexture\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP or \fBktxTexture2\fP from a named KTX file according to the file contents\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_CreateFromMemory\fP (const ktx_uint8_t *bytes, ktx_size_t size, \fBktxTextureCreateFlags\fP createFlags, \fBktxTexture\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP or \fBktxTexture2\fP from KTX-formatted data in memory according to the data contents\&. " +.ti -1c +.RI "ktx_uint8_t * \fBktxTexture_GetData\fP (\fBktxTexture\fP *This)" +.br +.RI "Return a pointer to the texture image data\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture_GetDataSize\fP (\fBktxTexture\fP *This)" +.br +.RI "Return the total size of the texture image data in bytes\&. " +.ti -1c +.RI "ktx_uint32_t \fBktxTexture_GetElementSize\fP (\fBktxTexture\fP *This)" +.br +.RI "Return the size in bytes of an elements of a texture's images\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture_IterateLevelFaces\fP (\fBktxTexture\fP *This, \fBPFNKTXITERCB\fP iterCb, void *userdata)" +.br +.RI "Iterate over the levels or faces in a \fBktxTexture\fP object\&. " +.ti -1c +.RI "ktx_uint32_t \fBktxTexture_GetRowPitch\fP (\fBktxTexture\fP *This, ktx_uint32_t level)" +.br +.RI "Return pitch between rows of a texture image level in bytes\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_CreateFromStdioStream\fP (FILE *stdioStream, ktxTextureCreateFlags createFlags, \fBktxTexture1\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP from a stdio stream reading from a KTX source\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_CreateFromNamedFile\fP (const char *const filename, ktxTextureCreateFlags createFlags, \fBktxTexture1\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP from a named KTX file\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_CreateFromMemory\fP (const ktx_uint8_t *bytes, ktx_size_t size, ktxTextureCreateFlags createFlags, \fBktxTexture1\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP from KTX-formatted data in memory\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_CreateFromStream\fP (\fBktxStream\fP *pStream, ktxTextureCreateFlags createFlags, \fBktxTexture1\fP **newTex)" +.br +.RI "Create a \fBktxTexture1\fP from KTX-formatted data from a \fR\fBktxStream\fP\fP\&. " +.ti -1c +.RI "void \fBktxTexture1_Destroy\fP (\fBktxTexture1\fP *This)" +.br +.RI "Destroy a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_GetImageOffset\fP (\fBktxTexture1\fP *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, ktx_size_t *pOffset)" +.br +.RI "Find the offset of an image within a \fBktxTexture\fP's image data\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture1_GetDataSizeUncompressed\fP (\fBktxTexture1\fP *This)" +.br +.RI "Return the total size in bytes of the uncompressed data of a \fBktxTexture1\fP\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture1_GetImageSize\fP (\fBktxTexture1\fP *This, ktx_uint32_t level)" +.br +.RI "Calculate & return the size in bytes of an image at the specified mip level\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture1_GetLevelSize\fP (\fBktxTexture1\fP *This, ktx_uint32_t level)" +.br +.RI "Calculate & return the size in bytes of all the images in the specified mip level\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_IterateLevels\fP (\fBktxTexture1\fP *This, PFNKTXITERCB iterCb, void *userdata)" +.br +.RI "Iterate over the mip levels in a \fBktxTexture1\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_IterateLoadLevelFaces\fP (\fBktxTexture1\fP *This, PFNKTXITERCB iterCb, void *userdata)" +.br +.RI "Iterate over the images in a \fBktxTexture1\fP object while loading the image data\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_LoadImageData\fP (\fBktxTexture1\fP *This, ktx_uint8_t *pBuffer, ktx_size_t bufSize)" +.br +.RI "Load all the image data from the \fBktxTexture1\fP's source\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CreateFromStdioStream\fP (FILE *stdioStream, ktxTextureCreateFlags createFlags, \fBktxTexture2\fP **newTex)" +.br +.RI "Create a \fBktxTexture2\fP from a stdio stream reading from a KTX source\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CreateFromNamedFile\fP (const char *const filename, ktxTextureCreateFlags createFlags, \fBktxTexture2\fP **newTex)" +.br +.RI "Create a \fBktxTexture2\fP from a named KTX file\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CreateFromMemory\fP (const ktx_uint8_t *bytes, ktx_size_t size, ktxTextureCreateFlags createFlags, \fBktxTexture2\fP **newTex)" +.br +.RI "Create a \fBktxTexture2\fP from KTX-formatted data in memory\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CreateFromStream\fP (\fBktxStream\fP *stream, ktxTextureCreateFlags createFlags, \fBktxTexture2\fP **newTex)" +.br +.RI "Create a \fBktxTexture2\fP from KTX-formatted data from a stream\&. " +.ti -1c +.RI "void \fBktxTexture2_Destroy\fP (\fBktxTexture2\fP *This)" +.br +.RI "Destroy a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "void \fBktxTexture2_GetComponentInfo\fP (\fBktxTexture2\fP *This, uint32_t *pNumComponents, uint32_t *pComponentByteLength)" +.br +.RI "Return information about the components of an image in a texture\&. " +.ti -1c +.RI "ktx_uint32_t \fBktxTexture2_GetNumComponents\fP (\fBktxTexture2\fP *This)" +.br +.RI "Return the number of components in an image of the texture\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_GetImageOffset\fP (\fBktxTexture2\fP *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, ktx_size_t *pOffset)" +.br +.RI "Find the offset of an image within a \fBktxTexture\fP's image data\&. " +.ti -1c +.RI "khr_df_transfer_e \fBktxTexture2_GetTransferFunction_e\fP (\fBktxTexture2\fP *This)" +.br +.RI "Retrieve the transfer function of the images\&. " +.ti -1c +.RI "khr_df_transfer_e \fBktxTexture2_GetOETF_e\fP (\fBktxTexture2\fP *This)" +.br +.RI "Retrieve the transfer function of the images\&. " +.ti -1c +.RI "ktx_uint32_t \fBktxTexture2_GetOETF\fP (\fBktxTexture2\fP *This)" +.br +.RI "Retrieve the transfer function of the images\&. " +.ti -1c +.RI "khr_df_model_e \fBktxTexture2_GetColorModel_e\fP (\fBktxTexture2\fP *This)" +.br +.RI "Retrieve the DFD color model of the images\&. " +.ti -1c +.RI "ktx_bool_t \fBktxTexture2_GetPremultipliedAlpha\fP (\fBktxTexture2\fP *This)" +.br +.RI "Retrieve whether the RGB components have been premultiplied by the alpha component\&. " +.ti -1c +.RI "khr_df_primaries_e \fBktxTexture2_GetPrimaries_e\fP (\fBktxTexture2\fP *This)" +.br +.RI "Retrieve the color primaries of the images\&. " +.ti -1c +.RI "ktx_bool_t \fBktxTexture2_NeedsTranscoding\fP (\fBktxTexture2\fP *This)" +.br +.RI "Query if the images are in a transcodable format\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture2_GetDataSizeUncompressed\fP (\fBktxTexture2\fP *This)" +.br +.RI "Return the total size in bytes of the uncompressed data of a \fBktxTexture2\fP\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture2_GetImageSize\fP (\fBktxTexture2\fP *This, ktx_uint32_t level)" +.br +.RI "Calculate & return the size in bytes of an image at the specified mip level\&. " +.ti -1c +.RI "ktx_size_t \fBktxTexture2_GetLevelSize\fP (\fBktxTexture2\fP *This, ktx_uint32_t level)" +.br +.RI "Calculate & return the size in bytes of all the images in the specified mip level\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_IterateLevels\fP (\fBktxTexture2\fP *This, PFNKTXITERCB iterCb, void *userdata)" +.br +.RI "Iterate over the mip levels in a \fBktxTexture2\fP object\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_IterateLoadLevelFaces\fP (\fBktxTexture2\fP *This, PFNKTXITERCB iterCb, void *userdata)" +.br +.RI "Iterate over the images in a \fBktxTexture2\fP object while loading the image data\&. " +.ti -1c +.RI "\fBktx_error_code_e\fP \fBktxTexture2_LoadImageData\fP (\fBktxTexture2\fP *This, ktx_uint8_t *pBuffer, ktx_size_t bufSize)" +.br +.RI "Load all the image data from the \fBktxTexture2\fP's source\&. " +.ti -1c +.RI "\fBktx_error_code_e\fP \fBktxTexture2_LoadDeflatedImageData\fP (\fBktxTexture2\fP *This, ktx_uint8_t *pBuffer, ktx_size_t bufSize)" +.br +.RI "Load all the image data from the \fBktxTexture2\fP's source without inflatiion\&.\&. " +.in -1c +.SH "Detailed Description" +.PP +Read KTX-formatted data\&. + + +.SH "Function Documentation" +.PP +.SS "\fBKTX_error_code\fP ktxTexture1_CreateFromMemory (const ktx_uint8_t * bytes, ktx_size_t size, ktxTextureCreateFlags createFlags, \fBktxTexture1\fP ** newTex)" + +.PP +Create a \fBktxTexture1\fP from KTX-formatted data in memory\&. The address of a newly created texture reflecting the contents of the serialized KTX data is written to the location pointed at by \fRnewTex\fP\&. + +.PP +The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the \fBktxTexture1\fP is ultimately to be uploaded to OpenGL or Vulkan\&. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer\&. + +.PP +The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used\&. It is provided solely to enable implementation of the \fIlibktx\fP v1 API on top of \fBktxTexture1\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIbytes\fP pointer to the memory containing the serialized KTX data\&. +.br +\fIsize\fP length of the KTX data in bytes\&. +.br +\fIcreateFlags\fP bitmask requesting specific actions during creation\&. +.br +\fInewTex\fP pointer to a location in which store the address of the newly created texture\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP Either \fRbytes\fP is NULL or \fRsize\fP is 0\&. +.RE +.PP +For other exceptions, see \fBktxTexture1_CreateFromStdioStream()\fP\&. +.SS "\fBKTX_error_code\fP ktxTexture1_CreateFromNamedFile (const char *const filename, ktxTextureCreateFlags createFlags, \fBktxTexture1\fP ** newTex)" + +.PP +Create a \fBktxTexture1\fP from a named KTX file\&. The address of a newly created texture reflecting the contents of the file is written to the location pointed at by \fRnewTex\fP\&. + +.PP +The file name must be encoded in utf-8\&. On Windows convert unicode names to utf-8 with \fRWideCharToMultiByte(CP_UTF8, \&.\&.\&.)\fP before calling\&. + +.PP +The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the \fBktxTexture1\fP is ultimately to be uploaded to OpenGL or Vulkan\&. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer\&. + +.PP +The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used\&. It is provided solely to enable implementation of the \fIlibktx\fP v1 API on top of \fBktxTexture1\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIfilename\fP pointer to a char array containing the file name\&. +.br +\fIcreateFlags\fP bitmask requesting specific actions during creation\&. +.br +\fInewTex\fP pointer to a location in which store the address of the newly created texture\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_FILE_OPEN_FAILED\fP\fP The file could not be opened\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRfilename\fP is \fRNULL\fP\&. +.RE +.PP +For other exceptions, see \fBktxTexture1_CreateFromStdioStream()\fP\&. +.SS "\fBKTX_error_code\fP ktxTexture1_CreateFromStdioStream (FILE * stdioStream, ktxTextureCreateFlags createFlags, \fBktxTexture1\fP ** newTex)" + +.PP +Create a \fBktxTexture1\fP from a stdio stream reading from a KTX source\&. The address of a newly created texture reflecting the contents of the stdio stream is written to the location pointed at by \fRnewTex\fP\&. + +.PP +The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the \fBktxTexture1\fP is ultimately to be uploaded to OpenGL or Vulkan\&. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer\&. + +.PP +The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used\&. It is provided solely to enable implementation of the \fIlibktx\fP v1 API on top of \fBktxTexture1\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIstdioStream\fP stdio FILE pointer created from the desired file\&. +.br +\fIcreateFlags\fP bitmask requesting specific actions during creation\&. +.br +\fInewTex\fP pointer to a location in which store the address of the newly created texture\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRnewTex\fP is \fRNULL\fP\&. +.br +\fI\fBKTX_FILE_DATA_ERROR\fP\fP Source data is inconsistent with the KTX specification\&. +.br +\fI\fBKTX_FILE_READ_ERROR\fP\fP An error occurred while reading the source\&. +.br +\fI\fBKTX_FILE_UNEXPECTED_EOF\fP\fP Not enough data in the source\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Not enough memory to create the texture object, load the images or load the key-value data\&. +.br +\fI\fBKTX_UNKNOWN_FILE_FORMAT\fP\fP The source is not in KTX format\&. +.br +\fI\fBKTX_UNSUPPORTED_TEXTURE_TYPE\fP\fP The source describes a texture type not supported by OpenGL or Vulkan, e\&.g, a 3D array\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_CreateFromStream (\fBktxStream\fP * pStream, ktxTextureCreateFlags createFlags, \fBktxTexture1\fP ** newTex)" + +.PP +Create a \fBktxTexture1\fP from KTX-formatted data from a \fR\fBktxStream\fP\fP\&. The address of a newly created texture reflecting the contents of the serialized KTX data is written to the location pointed at by \fRnewTex\fP\&. + +.PP +The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the \fBktxTexture1\fP is ultimately to be uploaded to OpenGL or Vulkan\&. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer\&. + +.PP +The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used\&. It is provided solely to enable implementation of the \fIlibktx\fP v1 API on top of \fBktxTexture1\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIpStream\fP pointer to the stream to read KTX data from\&. +.br +\fIcreateFlags\fP bitmask requesting specific actions during creation\&. +.br +\fInewTex\fP pointer to a location in which store the address of the newly created texture\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +For exceptions, see \fBktxTexture1_CreateFromStdioStream()\fP\&. +.SS "void ktxTexture1_Destroy (\fBktxTexture1\fP * This)" + +.PP +Destroy a \fBktxTexture1\fP object\&. This frees the memory associated with the texture contents and the memory of the \fBktxTexture1\fP object\&. This does \fInot\fP delete any OpenGL or Vulkan texture objects created by ktxTexture1_GLUpload or ktxTexture1_VkUpload\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture1\fP object to destroy +.RE +.PP + +.SS "ktx_size_t ktxTexture1_GetDataSizeUncompressed (\fBktxTexture1\fP * This)" + +.PP +Return the total size in bytes of the uncompressed data of a \fBktxTexture1\fP\&. This always returns the value of \fRThis->dataSize\fP\&. The function is provided for symmetry with \fBktxTexture2\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture1\fP object of interest\&. +.RE +.PP +\fBReturns\fP +.RS 4 +The size of the data in the texture\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_GetImageOffset (\fBktxTexture1\fP * This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, ktx_size_t * pOffset)" + +.PP +Find the offset of an image within a \fBktxTexture\fP's image data\&. As there is no such thing as a 3D cubemap we make the 3rd location parameter do double duty\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.br +\fIlevel\fP mip level of the image\&. +.br +\fIlayer\fP array layer of the image\&. +.br +\fIfaceSlice\fP cube map face or depth slice of the image\&. +.br +\fIpOffset\fP pointer to location to store the offset\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_OPERATION\fP\fP \fRlevel\fP, \fRlayer\fP or \fRfaceSlice\fP exceed the dimensions of the texture\&. +.br +\fIKTX_INVALID_VALID\fP \fRThis\fP is NULL\&. +.RE +.PP + +.SS "ktx_size_t ktxTexture1_GetImageSize (\fBktxTexture1\fP * This, ktx_uint32_t level)" + +.PP +Calculate & return the size in bytes of an image at the specified mip level\&. For arrays, this is the size of a layer, for cubemaps, the size of a face and for 3D textures, the size of a depth slice\&. + +.PP +The size reflects the padding of each row to KTX_GL_UNPACK_ALIGNMENT\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture1\fP object of interest\&. +.br +\fIlevel\fP level of interest\&. +.RE +.PP + +.SS "ktx_size_t ktxTexture1_GetLevelSize (\fBktxTexture1\fP * This, ktx_uint32_t level)" + +.PP +Calculate & return the size in bytes of all the images in the specified mip level\&. For arrays, this is the size of all layers in the level, for cubemaps, the size of all faces in the level and for 3D textures, the size of all depth slices in the level\&. + +.PP +The size reflects the padding of each row to KTX_GL_UNPACK_ALIGNMENT\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture1\fP object of interest\&. +.br +\fIlevel\fP level of interest\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_IterateLevels (\fBktxTexture1\fP * This, PFNKTXITERCB iterCb, void * userdata)" + +.PP +Iterate over the mip levels in a \fBktxTexture1\fP object\&. This is almost identical to \fBktxTexture_IterateLevelFaces\fP\&. The difference is that the blocks of image data for non-array cube maps include all faces of a mip level\&. + +.PP +This function works even if \fRThis->pData\fP == 0 so it can be used to obtain offsets and sizes for each level by callers who have loaded the data externally\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP handle of the 1 opened on the data\&. +.br +\fIiterCb\fP the address of a callback function which is called with the data for each image block\&. +.br +\fIuserdata\fP the address of application-specific data which is passed to the callback along with the image data\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. The following are returned directly by this function\&. \fRiterCb\fP may return these for other causes or may return additional errors\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_FILE_DATA_ERROR\fP\fP Mip level sizes are increasing not decreasing +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP is \fRNULL\fP or \fRiterCb\fP is \fRNULL\fP\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_IterateLoadLevelFaces (\fBktxTexture1\fP * This, PFNKTXITERCB iterCb, void * userdata)" + +.PP +Iterate over the images in a \fBktxTexture1\fP object while loading the image data\&. This operates similarly to \fBktxTexture_IterateLevelFaces\fP except that it loads the images from the \fBktxTexture1\fP's source to a temporary buffer while iterating\&. The callback function must copy the image data if it wishes to preserve it as the temporary buffer is reused for each level and is freed when this function exits\&. + +.PP +This function is helpful for reducing memory usage when uploading the data to a graphics API\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture1\fP object of interest\&. +.br +\fIiterCb\fP the address of a callback function which is called with the data for each image\&. +.br +\fIuserdata\fP the address of application-specific data which is passed to the callback along with the image data\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. The following are returned directly by this function\&. \fRiterCb\fP may return these for other causes or may return additional errors\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_FILE_DATA_ERROR\fP\fP mip level sizes are increasing not decreasing +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP the \fBktxTexture1\fP was not created from a stream, i\&.e there is no data to load, or this \fBktxTexture1\fP's images have already been loaded\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP is \fRNULL\fP or \fRiterCb\fP is \fRNULL\fP\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP not enough memory to allocate a block to hold the base level image\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_LoadImageData (\fBktxTexture1\fP * This, ktx_uint8_t * pBuffer, ktx_size_t bufSize)" + +.PP +Load all the image data from the \fBktxTexture1\fP's source\&. The data is loaded into the provided buffer or to an internally allocated buffer, if \fRpBuffer\fP is \fRNULL\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.br +\fIpBuffer\fP pointer to the buffer in which to load the image data\&. +.br +\fIbufSize\fP size of the buffer pointed at by \fRpBuffer\fP\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP is NULL\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRbufSize\fP is less than the the image data size\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The data has already been loaded or the \fBktxTexture\fP was not created from a KTX source\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Insufficient memory for the image data\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_CreateFromMemory (const ktx_uint8_t * bytes, ktx_size_t size, ktxTextureCreateFlags createFlags, \fBktxTexture2\fP ** newTex)" + +.PP +Create a \fBktxTexture2\fP from KTX-formatted data in memory\&. The address of a newly created \fBktxTexture2\fP reflecting the contents of the serialized KTX data is written to the location pointed at by \fRnewTex\fP\&. + +.PP +The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the \fBktxTexture\fP is ultimately to be uploaded to OpenGL or Vulkan\&. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer\&. + +.PP +The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used\&. It is provided solely to enable implementation of the \fIlibktx\fP v1 API on top of \fBktxTexture\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIbytes\fP pointer to the memory containing the serialized KTX data\&. +.br +\fIsize\fP length of the KTX data in bytes\&. +.br +\fIcreateFlags\fP bitmask requesting specific actions during creation\&. +.br +\fInewTex\fP pointer to a location in which store the address of the newly created texture\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP Either \fRbytes\fP is NULL or \fRsize\fP is 0\&. +.RE +.PP +For other exceptions, see \fBktxTexture2_CreateFromStdioStream()\fP\&. +.SS "\fBKTX_error_code\fP ktxTexture2_CreateFromNamedFile (const char *const filename, ktxTextureCreateFlags createFlags, \fBktxTexture2\fP ** newTex)" + +.PP +Create a \fBktxTexture2\fP from a named KTX file\&. The address of a newly created \fBktxTexture2\fP reflecting the contents of the file is written to the location pointed at by \fRnewTex\fP\&. + +.PP +The file name must be encoded in utf-8\&. On Windows convert unicode names to utf-8 with \fRWideCharToMultiByte(CP_UTF8, \&.\&.\&.)\fP before calling\&. + +.PP +The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the \fBktxTexture\fP is ultimately to be uploaded to OpenGL or Vulkan\&. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer\&. + +.PP +The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used\&. It is provided solely to enable implementation of the \fIlibktx\fP v1 API on top of \fBktxTexture\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIfilename\fP pointer to a char array containing the file name\&. +.br +\fIcreateFlags\fP bitmask requesting specific actions during creation\&. +.br +\fInewTex\fP pointer to a location in which store the address of the newly created texture\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_FILE_OPEN_FAILED\fP\fP The file could not be opened\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRfilename\fP is \fRNULL\fP\&. +.RE +.PP +For other exceptions, see \fBktxTexture2_CreateFromStdioStream()\fP\&. +.SS "\fBKTX_error_code\fP ktxTexture2_CreateFromStdioStream (FILE * stdioStream, ktxTextureCreateFlags createFlags, \fBktxTexture2\fP ** newTex)" + +.PP +Create a \fBktxTexture2\fP from a stdio stream reading from a KTX source\&. The address of a newly created \fBktxTexture2\fP reflecting the contents of the stdio stream is written to the location pointed at by \fRnewTex\fP\&. + +.PP +The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the \fBktxTexture\fP is ultimately to be uploaded to OpenGL or Vulkan\&. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer\&. + +.PP +The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used\&. It is provided solely to enable implementation of the \fIlibktx\fP v1 API on top of \fBktxTexture\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIstdioStream\fP stdio FILE pointer created from the desired file\&. +.br +\fIcreateFlags\fP bitmask requesting specific actions during creation\&. +.br +\fInewTex\fP pointer to a location in which store the address of the newly created texture\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRnewTex\fP is \fRNULL\fP\&. +.br +\fI\fBKTX_FILE_DATA_ERROR\fP\fP Source data is inconsistent with the KTX specification\&. +.br +\fI\fBKTX_FILE_READ_ERROR\fP\fP An error occurred while reading the source\&. +.br +\fI\fBKTX_FILE_UNEXPECTED_EOF\fP\fP Not enough data in the source\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Not enough memory to create the texture object, load the images or load the key-value data\&. +.br +\fI\fBKTX_UNKNOWN_FILE_FORMAT\fP\fP The source is not in KTX format\&. +.br +\fI\fBKTX_UNSUPPORTED_TEXTURE_TYPE\fP\fP The source describes a texture type not supported by OpenGL or Vulkan, e\&.g, a 3D array\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_CreateFromStream (\fBktxStream\fP * stream, ktxTextureCreateFlags createFlags, \fBktxTexture2\fP ** newTex)" + +.PP +Create a \fBktxTexture2\fP from KTX-formatted data from a stream\&. The address of a newly created \fBktxTexture2\fP reflecting the contents of the serialized KTX data is written to the location pointed at by \fRnewTex\fP\&. + +.PP +The create flag KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT should not be set, if the \fBktxTexture\fP is ultimately to be uploaded to OpenGL or Vulkan\&. This will minimize memory usage by allowing, for example, loading the images directly from the source into a Vulkan staging buffer\&. + +.PP +The create flag KTX_TEXTURE_CREATE_RAW_KVDATA_BIT should not be used\&. It is provided solely to enable implementation of the \fIlibktx\fP v1 API on top of \fBktxTexture\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIstream\fP pointer to the stream to read KTX data from\&. +.br +\fIcreateFlags\fP bitmask requesting specific actions during creation\&. +.br +\fInewTex\fP pointer to a location in which store the address of the newly created texture\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP Either \fRbytes\fP is NULL or \fRsize\fP is 0\&. +.RE +.PP +For other exceptions, see \fBktxTexture2_CreateFromStdioStream()\fP\&. +.SS "\fBKTX_error_code\fP ktxTexture2_DecodeAstc (\fBktxTexture2\fP * This)" + +.PP +Decodes a ktx2 texture object, if it is ASTC encoded\&. The decompressed format is calculated from corresponding ASTC format\&. There are only 3 possible options currently supported\&. RGBA8, SRGBA8 and RGBA32\&. +.PP +\fBNote\fP +.RS 4 +3d textures are decoded to a multi-slice 3d texture\&. +.RE +.PP +Updates \fRThis\fP with the decoded image\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP The texture to decode +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_FILE_DATA_ERROR\fP\fP DFD is incorrect: supercompression scheme or sample's channelId do not match ASTC colorModel\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture's images are not in ASTC format\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture object does not contain any data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP ASTC decoder failed to decompress image\&. Possibly due to incorrect floating point compilation settings\&. Should not happen in release package\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Not enough memory to carry out decoding\&. +.br +\fI\fBKTX_UNSUPPORTED_FEATURE\fP\fP The texture's images are supercompressed with an unsupported scheme\&. +.br +\fI\fBKTX_UNSUPPORTED_FEATURE\fP\fP ASTC encoder not compiled with enough capacity for requested block size\&. Should not happen in release package\&. +.RE +.PP + +.SS "void ktxTexture2_Destroy (\fBktxTexture2\fP * This)" + +.PP +Destroy a \fBktxTexture2\fP object\&. This frees the memory associated with the texture contents and the memory of the \fBktxTexture2\fP object\&. This does \fInot\fP delete any OpenGL or Vulkan texture objects created by ktxTexture2_GLUpload or ktxTexture2_VkUpload\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object to destroy +.RE +.PP + +.SS "khr_df_model_e ktxTexture2_GetColorModel_e (\fBktxTexture2\fP * This)" + +.PP +Retrieve the DFD color model of the images\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.RE +.PP +\fBReturns\fP +.RS 4 +A \fRkhr_df_transfer\fP enum value specifying the color model\&. +.RE +.PP + +.SS "void ktxTexture2_GetComponentInfo (\fBktxTexture2\fP * This, uint32_t * pNumComponents, uint32_t * pComponentByteLength)" + +.PP +Return information about the components of an image in a texture\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.br +\fIpNumComponents\fP pointer to location in which to write the number of components in the textures images\&. +.br +\fIpComponentByteLength\fP pointer to the location in which to write byte length of a component\&. +.RE +.PP + +.SS "ktx_size_t ktxTexture2_GetDataSizeUncompressed (\fBktxTexture2\fP * This)" + +.PP +Return the total size in bytes of the uncompressed data of a \fBktxTexture2\fP\&. If supercompressionScheme == \fRKTX_SS_NONE\fP or \fRKTX_SS_BASIS_LZ\fP, returns the value of \fRThis->dataSize\fP else if supercompressionScheme == \fRKTX_SS_ZSTD\fP or \fRKTX_SS_ZLIB\fP, it returns the sum of the uncompressed sizes of each mip level plus space for the level padding\&. With no supercompression the data size and uncompressed data size are the same\&. For Basis supercompression the uncompressed size cannot be known until the data is transcoded so the compressed size is returned\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture1\fP object of interest\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_GetImageOffset (\fBktxTexture2\fP * This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, ktx_size_t * pOffset)" + +.PP +Find the offset of an image within a \fBktxTexture\fP's image data\&. As there is no such thing as a 3D cubemap we make the 3rd location parameter do double duty\&. Only works for non-supercompressed textures as there is no way to tell where an image is for a supercompressed one\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.br +\fIlevel\fP mip level of the image\&. +.br +\fIlayer\fP array layer of the image\&. +.br +\fIfaceSlice\fP cube map face or depth slice of the image\&. +.br +\fIpOffset\fP pointer to location to store the offset\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_OPERATION\fP\fP \fRlevel\fP, \fRlayer\fP or \fRfaceSlice\fP exceed the dimensions of the texture\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Texture is supercompressed\&. +.br +\fIKTX_INVALID_VALID\fP \fRThis\fP is NULL\&. +.RE +.PP + +.SS "ktx_size_t ktxTexture2_GetImageSize (\fBktxTexture2\fP * This, ktx_uint32_t level)" + +.PP +Calculate & return the size in bytes of an image at the specified mip level\&. For arrays, this is the size of a layer, for cubemaps, the size of a face and for 3D textures, the size of a depth slice\&. + +.PP +The size reflects the padding of each row to KTX_GL_UNPACK_ALIGNMENT\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIlevel\fP level of interest\&. * +.RE +.PP + +.SS "ktx_size_t ktxTexture2_GetLevelSize (\fBktxTexture2\fP * This, ktx_uint32_t level)" + +.PP +Calculate & return the size in bytes of all the images in the specified mip level\&. For arrays, this is the size of all layers in the level, for cubemaps, the size of all faces in the level and for 3D textures, the size of all depth slices in the level\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIlevel\fP level of interest\&. * +.RE +.PP + +.SS "ktx_uint32_t ktxTexture2_GetNumComponents (\fBktxTexture2\fP * This)" + +.PP +Return the number of components in an image of the texture\&. Returns the number of components indicated by the DFD's sample information in accordance with the color model\&. For uncompressed formats it will be the actual number of components in the image\&. For block-compressed formats, it will be 1 or 2 according to the format's DFD color model\&. For Basis compressed textures, the function examines the ids of the channels indicated by the DFD and uses that information to determine and return the number of components in the image \fIbefore\fP encoding and deflation so it can be used to help choose a suitable transcode target format\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.RE +.PP +\fBReturns\fP +.RS 4 +the number of components\&. +.RE +.PP + +.SS "ktx_uint32_t ktxTexture2_GetOETF (\fBktxTexture2\fP * This)" + +.PP +Retrieve the transfer function of the images\&. +.PP +\fBDeprecated\fP +.RS 4 +Use ktxTexture2_GetTransferFunction_e\&. +.RE +.PP + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.RE +.PP +\fBReturns\fP +.RS 4 +A \fRkhr_df_transfer\fP enum value specifying the transfer function, returned as \fRktx_uint32_t\fP\&. +.RE +.PP + +.SS "khr_df_transfer_e ktxTexture2_GetOETF_e (\fBktxTexture2\fP * This)" + +.PP +Retrieve the transfer function of the images\&. +.PP +\fBDeprecated\fP +.RS 4 +Use ktxTexture2_GetTransferFunction_e\&. Now that the KTX specification allows setting of non-linear transfer functions other than sRGB, it is possible for the transfer function to be an EOTF so this name is no longer appropriate\&. +.RE +.PP + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.RE +.PP +\fBReturns\fP +.RS 4 +A \fRkhr_df_transfer\fP enum value specifying the transfer function\&. +.RE +.PP + +.SS "ktx_bool_t ktxTexture2_GetPremultipliedAlpha (\fBktxTexture2\fP * This)" + +.PP +Retrieve whether the RGB components have been premultiplied by the alpha component\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_TRUE if the components are premultiplied, KTX_FALSE otherwise\&. +.RE +.PP + +.SS "khr_df_primaries_e ktxTexture2_GetPrimaries_e (\fBktxTexture2\fP * This)" + +.PP +Retrieve the color primaries of the images\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.RE +.PP +\fBReturns\fP +.RS 4 +A \fRkhr_df_primaries\fP enum value specifying the primaries\&. +.RE +.PP + +.SS "khr_df_transfer_e ktxTexture2_GetTransferFunction_e (\fBktxTexture2\fP * This)" + +.PP +Retrieve the transfer function of the images\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.RE +.PP +\fBReturns\fP +.RS 4 +A \fRkhr_df_transfer\fP enum value specifying the transfer function\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_IterateLevels (\fBktxTexture2\fP * This, PFNKTXITERCB iterCb, void * userdata)" + +.PP +Iterate over the mip levels in a \fBktxTexture2\fP object\&. This is almost identical to ktxTexture_IterateLevelFaces()\&. The difference is that the blocks of image data for non-array cube maps include all faces of a mip level\&. + +.PP +This function works even if \fRThis->pData\fP == 0 so it can be used to obtain offsets and sizes for each level by callers who have loaded the data externally\&. + +.PP +Intended for use only when supercompressionScheme == SUPERCOMPRESSION_NONE\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP handle of the \fBktxTexture\fP opened on the data\&. +.br +\fIiterCb\fP the address of a callback function which is called with the data for each image block\&. +.br +\fIuserdata\fP the address of application-specific data which is passed to the callback along with the image data\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. The following are returned directly by this function\&. \fRiterCb\fP may return these for other causes or may return additional errors\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_FILE_DATA_ERROR\fP\fP Mip level sizes are increasing not decreasing +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP supercompressionScheme != SUPERCOMPRESSION_NONE\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP is \fRNULL\fP or \fRiterCb\fP is \fRNULL\fP\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_IterateLoadLevelFaces (\fBktxTexture2\fP * This, PFNKTXITERCB iterCb, void * userdata)" + +.PP +Iterate over the images in a \fBktxTexture2\fP object while loading the image data\&. This operates similarly to ktxTexture_IterateLevelFaces() except that it loads the images from the \fBktxTexture2\fP's source to a temporary buffer while iterating\&. If supercompressionScheme == KTX_SS_ZSTD or KTX_SS_ZLIB, it will inflate the data before passing it to the callback\&. The callback function must copy the image data if it wishes to preserve it as the temporary buffer is reused for each level and is freed when this function exits\&. + +.PP +This function is helpful for reducing memory usage when uploading the data to a graphics API\&. + +.PP +Intended for use only when supercompressionScheme == KTX_SS_NONE, KTX_SS_ZSTD or KTX_SS_ZLIB\&. As there is no access to the \fBktxTexture\fP's data on conclusion of this function, destroying the texture on completion is recommended\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIiterCb\fP the address of a callback function which is called with the data for each image\&. +.br +\fIuserdata\fP the address of application-specific data which is passed to the callback along with the image data\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. The following are returned directly by this function\&. \fRiterCb\fP may return these for other causes or may return additional errors\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_FILE_DATA_ERROR\fP\fP mip level sizes are increasing not decreasing +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP the \fBktxTexture2\fP was not created from a stream, i\&.e there is no data to load, or this \fBktxTexture2\fP's images have already been loaded\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP supercompressionScheme != KTX_SS_NONE, supercompressionScheme != KTX_SS_ZSTD, and supercompressionScheme != KTX_SS_ZLIB\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP is \fRNULL\fP or \fRiterCb\fP is \fRNULL\fP\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP not enough memory to allocate a block to hold the base level image\&. +.RE +.PP + +.SS "\fBktx_error_code_e\fP ktxTexture2_LoadDeflatedImageData (\fBktxTexture2\fP * This, ktx_uint8_t * pBuffer, ktx_size_t bufSize)" + +.PP +Load all the image data from the \fBktxTexture2\fP's source without inflatiion\&.\&. The data will be not be inflated if supercompressionScheme == \fRKTX_SS_ZSTD\fP or \fRKTX_SS_ZLIB\fP\&. This function is provided to support some rare testing scenarios\&. Generally use of ktxTexture2_LoadImageData is highly recommended\&. For supercompressionScheme values other than those mentioned, the result of this function is the same as ktxTexture2_LoadImageData\&. + +.PP +The data is loaded into the provided buffer or to an internally allocated buffer, if \fRpBuffer\fP is \fRNULL\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.br +\fIpBuffer\fP pointer to the buffer in which to load the image data\&. +.br +\fIbufSize\fP size of the buffer pointed at by \fRpBuffer\fP\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP is NULL\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRbufSize\fP is less than the the image data size\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The data has already been loaded or the \fBktxTexture\fP was not created from a KTX source\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Insufficient memory for the image data\&. +.RE +.PP + +.SS "\fBktx_error_code_e\fP ktxTexture2_LoadImageData (\fBktxTexture2\fP * This, ktx_uint8_t * pBuffer, ktx_size_t bufSize)" + +.PP +Load all the image data from the \fBktxTexture2\fP's source\&. The data will be inflated if supercompressionScheme == \fRKTX_SS_ZSTD\fP or \fRKTX_SS_ZLIB\fP\&. The data is loaded into the provided buffer or to an internally allocated buffer, if \fRpBuffer\fP is \fRNULL\fP\&. Callers providing their own buffer must ensure the buffer large enough to hold the inflated data for files deflated with Zstd or ZLIB\&. See \fBktxTexture2_GetDataSizeUncompressed()\fP\&. + +.PP +The texture's levelIndex, dataSize, DFD and supercompressionScheme will all be updated after successful inflation to reflect the inflated data\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.br +\fIpBuffer\fP pointer to the buffer in which to load the image data\&. +.br +\fIbufSize\fP size of the buffer pointed at by \fRpBuffer\fP\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP is NULL\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRbufSize\fP is less than the the image data size\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The data has already been loaded or the \fBktxTexture\fP was not created from a KTX source\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Insufficient memory for the image data\&. +.RE +.PP + +.SS "ktx_bool_t ktxTexture2_NeedsTranscoding (\fBktxTexture2\fP * This)" + +.PP +Query if the images are in a transcodable format\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_TranscodeBasis (\fBktxTexture2\fP * This, \fBktx_transcode_fmt_e\fP outputFormat, ktx_transcode_flags transcodeFlags)" + +.PP +Transcode a KTX2 texture with BasisLZ/ETC1S or UASTC images\&. If the texture contains BasisLZ supercompressed images, Inflates them from back to ETC1S then transcodes them to the specified block-compressed format\&. If the texture contains UASTC images, inflates them, if they have been supercompressed with zstd, then transcodes then to the specified format, The transcoded images replace the original images and the texture's fields including the DFD are modified to reflect the new format\&. + +.PP +These types of textures must be transcoded to a desired target block-compressed format before they can be uploaded to a GPU via a graphics API\&. + +.PP +The following block compressed transcode targets are available: \fRKTX_TTF_ETC1_RGB\fP, \fRKTX_TTF_ETC2_RGBA\fP, \fRKTX_TTF_BC1_RGB\fP, \fRKTX_TTF_BC3_RGBA\fP, \fRKTX_TTF_BC4_R\fP, \fRKTX_TTF_BC5_RG\fP, \fRKTX_TTF_BC7_RGBA\fP, \fR\fRKTX_TTF_PVRTC1_4_RGB\fP,\fP \fRKTX_TTF_PVRTC1_4_RGBA\fP, \fRKTX_TTF_PVRTC2_4_RGB\fP, \fRKTX_TTF_PVRTC2_4_RGBA\fP, \fRKTX_TTF_ASTC_4x4_RGBA\fP, \fRKTX_TTF_ETC2_EAC_R11\fP, \fRKTX_TTF_ETC2_EAC_RG11\fP, \fRKTX_TTF_ETC\fP and \fRKTX_TTF_BC1_OR_3\fP\&. + +.PP +\fRKTX_TTF_ETC\fP automatically selects between \fRKTX_TTF_ETC1_RGB\fP and \fRKTX_TTF_ETC2_RGBA\fP according to whether an alpha channel is available\&. \fRKTX_TTF_BC1_OR_3\fP does likewise between \fRKTX_TTF_BC1_RGB\fP and \fRKTX_TTF_BC3_RGBA\fP\&. Note that if \fRKTX_TTF_PVRTC1_4_RGBA\fP or \fRKTX_TTF_PVRTC2_4_RGBA\fP is specified and there is no alpha channel \fRKTX_TTF_PVRTC1_4_RGB\fP or \fRKTX_TTF_PVRTC2_4_RGB\fP respectively will be selected\&. + +.PP +Transcoding to ATC & FXT1 formats is not supported by libktx as there are no equivalent Vulkan formats\&. + +.PP +The following uncompressed transcode targets are also available: \fRKTX_TTF_RGBA32\fP, \fRKTX_TTF_RGB565\fP, KTX_TTF_BGR565 and KTX_TTF_RGBA4444\&. + +.PP +The following \fRtranscodeFlags\fP are available\&. + +.PP +\fBSee also\fP +.RS 4 +ktxtexture2_CompressBasis()\&. +.RE +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIoutputFormat\fP a value from the ktx_texture_transcode_fmt_e enum specifying the target format\&. +.br +\fItranscodeFlags\fP bitfield of flags modifying the transcode operation\&. +.RE +.PP +\fBSee also\fP +.RS 4 +ktx_texture_decode_flags_e\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_FILE_DATA_ERROR\fP\fP Supercompression global data is corrupted\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture's format is not transcodable (not ETC1S/BasisLZ or UASTC)\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Supercompression global data is missing, i\&.e\&., the texture object is invalid\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Image data is missing, i\&.e\&., the texture object is invalid\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP \fRoutputFormat\fP is PVRTC1 but the texture does does not have power-of-two dimensions\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRoutputFormat\fP is invalid\&. +.br +\fI\fBKTX_TRANSCODE_FAILED\fP\fP Something went wrong during transcoding\&. +.br +\fI\fBKTX_UNSUPPORTED_FEATURE\fP\fP KTX_TF_PVRTC_DECODE_TO_NEXT_POW2 was requested or the specified transcode target has not been included in the library being used\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Not enough memory to carry out transcoding\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture_CreateFromMemory (const ktx_uint8_t * bytes, ktx_size_t size, \fBktxTextureCreateFlags\fP createFlags, \fBktxTexture\fP ** newTex)" + +.PP +Create a \fBktxTexture1\fP or \fBktxTexture2\fP from KTX-formatted data in memory according to the data contents\&. See \fBktxTexture1_CreateFromMemory\fP or \fBktxTexture2_CreateFromMemory\fP for details\&. +.SS "\fBKTX_error_code\fP ktxTexture_CreateFromNamedFile (const char *const filename, \fBktxTextureCreateFlags\fP createFlags, \fBktxTexture\fP ** newTex)" + +.PP +Create a \fBktxTexture1\fP or \fBktxTexture2\fP from a named KTX file according to the file contents\&. See \fBktxTexture1_CreateFromNamedFile\fP or \fBktxTexture2_CreateFromNamedFile\fP for details\&. +.SS "\fBKTX_error_code\fP ktxTexture_CreateFromStdioStream (FILE * stdioStream, \fBktxTextureCreateFlags\fP createFlags, \fBktxTexture\fP ** newTex)" + +.PP +Create a \fBktxTexture1\fP or \fBktxTexture2\fP from a stdio stream according to the stream data\&. See \fBktxTexture1_CreateFromStdioStream\fP or \fBktxTexture2_CreateFromStdioStream\fP for details\&. +.SS "\fBKTX_error_code\fP ktxTexture_CreateFromStream (\fBktxStream\fP * pStream, \fBktxTextureCreateFlags\fP createFlags, \fBktxTexture\fP ** newTex)" + +.PP +Create a ktx1 or ktx2 texture according to the stream data\&. See \fBktxTexture1_CreateFromStream\fP or \fBktxTexture2_CreateFromStream\fP for details\&. +.SS "ktx_uint8_t * ktxTexture_GetData (\fBktxTexture\fP * This)" + +.PP +Return a pointer to the texture image data\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.RE +.PP + +.SS "ktx_size_t ktxTexture_GetDataSize (\fBktxTexture\fP * This)" + +.PP +Return the total size of the texture image data in bytes\&. For a \fBktxTexture2\fP with supercompressionScheme != KTX_SS_NONE this will return the deflated size of the data\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.RE +.PP + +.SS "ktx_uint32_t ktxTexture_GetElementSize (\fBktxTexture\fP * This)" + +.PP +Return the size in bytes of an elements of a texture's images\&. For uncompressed textures an element is one texel\&. For compressed textures it is one block\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.RE +.PP + +.SS "ktx_uint32_t ktxTexture_GetRowPitch (\fBktxTexture\fP * This, ktx_uint32_t level)" + +.PP +Return pitch between rows of a texture image level in bytes\&. For uncompressed textures the pitch is the number of bytes between rows of texels\&. For compressed textures it is the number of bytes between rows of blocks\&. The value is padded to GL_UNPACK_ALIGNMENT, if necessary\&. For all currently known compressed formats padding will not be necessary\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.br +\fIlevel\fP level of interest\&. +.RE +.PP +\fBReturns\fP +.RS 4 +the row pitch in bytes\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture_IterateLevelFaces (\fBktxTexture\fP * This, \fBPFNKTXITERCB\fP iterCb, void * userdata)" + +.PP +Iterate over the levels or faces in a \fBktxTexture\fP object\&. Blocks of image data are passed to an application-supplied callback function\&. This is not a strict per-image iteration\&. Rather it reflects how OpenGL needs the images\&. For most textures the block of data includes all images of a mip level which implies all layers of an array\&. However, for non-array cube map textures the block is a single face of the mip level, i\&.e the callback is called once for each face\&. + +.PP +This function works even if \fRThis->pData\fP == 0 so it can be used to obtain offsets and sizes for each level by callers who have loaded the data externally\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture\fP object of interest\&. +.br +\fIiterCb\fP the address of a callback function which is called with the data for each image block\&. +.br +\fIuserdata\fP the address of application-specific data which is passed to the callback along with the image data\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. The following are returned directly by this function\&. \fRiterCb\fP may return these for other causes or may return additional errors\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_FILE_DATA_ERROR\fP\fP Mip level sizes are increasing not decreasing +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP is \fRNULL\fP or \fRiterCb\fP is \fRNULL\fP\&. +.RE +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/readpos.3 b/ktx/build/docs/man/man3/readpos.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/readpos.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/selectorRDOThreshold.3 b/ktx/build/docs/man/man3/selectorRDOThreshold.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/selectorRDOThreshold.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/separateRGToRGB_A.3 b/ktx/build/docs/man/man3/separateRGToRGB_A.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/separateRGToRGB_A.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/setpos.3 b/ktx/build/docs/man/man3/setpos.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/setpos.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/size.3 b/ktx/build/docs/man/man3/size.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/size.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/skip.3 b/ktx/build/docs/man/man3/skip.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/skip.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/strings.c.3 b/ktx/build/docs/man/man3/strings.c.3 new file mode 100644 index 0000000..38595d6 --- /dev/null +++ b/ktx/build/docs/man/man3/strings.c.3 @@ -0,0 +1,117 @@ +.TH "lib/strings.c" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +lib/strings.c \- Functions to return a string corresponding to various enumerations\&. + +.SH SYNOPSIS +.br +.PP +\fR#include 'ktx\&.h'\fP +.br +\fR#include 'basis_sgd\&.h'\fP +.br + +.SS "Functions" + +.in +1c +.ti -1c +.RI "const char * \fBktxErrorString\fP (\fBKTX_error_code\fP error)" +.br +.RI "Return a string corresponding to a KTX error code\&. " +.ti -1c +.RI "const char * \fBktxTranscodeFormatString\fP (\fBktx_transcode_fmt_e\fP format)" +.br +.RI "Return a string corresponding to a transcode format enumeration\&. " +.ti -1c +.RI "const char * \fBktxSupercompressionSchemeString\fP (\fBktxSupercmpScheme\fP scheme)" +.br +.RI "Return a string corresponding to a supercompressionScheme enumeration\&. " +.ti -1c +.RI "const char * \fBktxBUImageFlagsBitString\fP (ktx_uint32_t bit_index, bool bit_value)" +.br +.RI "Return a string corresponding to a bu_image_flags bit\&. " +.in -1c +.SH "Detailed Description" +.PP +Functions to return a string corresponding to various enumerations\&. + + +.PP +\fBAuthor\fP +.RS 4 +Mark Callow, HI Corporation +.RE +.PP + +.SH "Function Documentation" +.PP +.SS "const char * ktxBUImageFlagsBitString (ktx_uint32_t bit_index, bool bit_value)" + +.PP +Return a string corresponding to a bu_image_flags bit\&. +.PP +\fBParameters\fP +.RS 4 +\fIbit_index\fP the bu_image_flag bit to test\&. +.br +\fIbit_value\fP the bu_image_flag bit value\&. +.RE +.PP +\fBReturns\fP +.RS 4 +pointer to the message string or NULL otherwise\&. +.RE +.PP + +.SS "const char * ktxErrorString (\fBKTX_error_code\fP error)" + +.PP +Return a string corresponding to a KTX error code\&. +.PP +\fBParameters\fP +.RS 4 +\fIerror\fP the error code for which to return a string +.RE +.PP +\fBReturns\fP +.RS 4 +pointer to the message string\&. +.RE +.PP + +.SS "const char * ktxSupercompressionSchemeString (\fBktxSupercmpScheme\fP scheme)" + +.PP +Return a string corresponding to a supercompressionScheme enumeration\&. +.PP +\fBParameters\fP +.RS 4 +\fIscheme\fP the supercompression scheme for which to return a string\&. +.RE +.PP +\fBReturns\fP +.RS 4 +pointer to the message string\&. +.RE +.PP + +.SS "const char * ktxTranscodeFormatString (\fBktx_transcode_fmt_e\fP format)" + +.PP +Return a string corresponding to a transcode format enumeration\&. +.PP +\fBParameters\fP +.RS 4 +\fIformat\fP the transcode format for which to return a string\&. +.RE +.PP +\fBReturns\fP +.RS 4 +pointer to the message string\&. +.RE +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/structSize.3 b/ktx/build/docs/man/man3/structSize.3 new file mode 100644 index 0000000..562d74c --- /dev/null +++ b/ktx/build/docs/man/man3/structSize.3 @@ -0,0 +1 @@ +.so man3/ktxAstcParams.3 diff --git a/ktx/build/docs/man/man3/threadCount.3 b/ktx/build/docs/man/man3/threadCount.3 new file mode 100644 index 0000000..562d74c --- /dev/null +++ b/ktx/build/docs/man/man3/threadCount.3 @@ -0,0 +1 @@ +.so man3/ktxAstcParams.3 diff --git a/ktx/build/docs/man/man3/uastc.3 b/ktx/build/docs/man/man3/uastc.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/uastc.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/uastcFlags.3 b/ktx/build/docs/man/man3/uastcFlags.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/uastcFlags.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/uastcRDO.3 b/ktx/build/docs/man/man3/uastcRDO.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/uastcRDO.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/uastcRDODictSize.3 b/ktx/build/docs/man/man3/uastcRDODictSize.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/uastcRDODictSize.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/uastcRDODontFavorSimplerModes.3 b/ktx/build/docs/man/man3/uastcRDODontFavorSimplerModes.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/uastcRDODontFavorSimplerModes.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/uastcRDOMaxSmoothBlockErrorScale.3 b/ktx/build/docs/man/man3/uastcRDOMaxSmoothBlockErrorScale.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/uastcRDOMaxSmoothBlockErrorScale.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/uastcRDOMaxSmoothBlockStdDev.3 b/ktx/build/docs/man/man3/uastcRDOMaxSmoothBlockStdDev.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/uastcRDOMaxSmoothBlockStdDev.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/uastcRDONoMultithreading.3 b/ktx/build/docs/man/man3/uastcRDONoMultithreading.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/uastcRDONoMultithreading.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/uastcRDOQualityScalar.3 b/ktx/build/docs/man/man3/uastcRDOQualityScalar.3 new file mode 100644 index 0000000..532b0f1 --- /dev/null +++ b/ktx/build/docs/man/man3/uastcRDOQualityScalar.3 @@ -0,0 +1 @@ +.so man3/ktxBasisParams.3 diff --git a/ktx/build/docs/man/man3/verbose.3 b/ktx/build/docs/man/man3/verbose.3 new file mode 100644 index 0000000..562d74c --- /dev/null +++ b/ktx/build/docs/man/man3/verbose.3 @@ -0,0 +1 @@ +.so man3/ktxAstcParams.3 diff --git a/ktx/build/docs/man/man3/viewType.3 b/ktx/build/docs/man/man3/viewType.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/viewType.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/vkDestroyImage.3 b/ktx/build/docs/man/man3/vkDestroyImage.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/vkDestroyImage.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/vkFormat.3 b/ktx/build/docs/man/man3/vkFormat.3 new file mode 100644 index 0000000..fbd3161 --- /dev/null +++ b/ktx/build/docs/man/man3/vkFormat.3 @@ -0,0 +1 @@ +.so man3/ktxTextureCreateInfo.3 diff --git a/ktx/build/docs/man/man3/vkFreeMemory.3 b/ktx/build/docs/man/man3/vkFreeMemory.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/vkFreeMemory.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/vkFuncs.3 b/ktx/build/docs/man/man3/vkFuncs.3 new file mode 100644 index 0000000..caa90a4 --- /dev/null +++ b/ktx/build/docs/man/man3/vkFuncs.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanDeviceInfo.3 diff --git a/ktx/build/docs/man/man3/vtbl.3 b/ktx/build/docs/man/man3/vtbl.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/vtbl.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/vvtbl.3 b/ktx/build/docs/man/man3/vvtbl.3 new file mode 100644 index 0000000..5668951 --- /dev/null +++ b/ktx/build/docs/man/man3/vvtbl.3 @@ -0,0 +1 @@ +.so man3/ktxTexture.3 diff --git a/ktx/build/docs/man/man3/width.3 b/ktx/build/docs/man/man3/width.3 new file mode 100644 index 0000000..dd864b2 --- /dev/null +++ b/ktx/build/docs/man/man3/width.3 @@ -0,0 +1 @@ +.so man3/ktxVulkanTexture.3 diff --git a/ktx/build/docs/man/man3/write.3 b/ktx/build/docs/man/man3/write.3 new file mode 100644 index 0000000..2d77db9 --- /dev/null +++ b/ktx/build/docs/man/man3/write.3 @@ -0,0 +1 @@ +.so man3/ktxStream.3 diff --git a/ktx/build/docs/man/man3/writer.3 b/ktx/build/docs/man/man3/writer.3 new file mode 100644 index 0000000..e0b23ee --- /dev/null +++ b/ktx/build/docs/man/man3/writer.3 @@ -0,0 +1,1107 @@ +.TH "writer" 3 "Sun Jun 14 2026 18:00:57" "Version 0.0.0" "libktx Reference" \" -*- nroff -*- +.ad l +.nh +.SH NAME +writer \- Writer +.PP + \- Write KTX-formatted data\&. + +.SH SYNOPSIS +.br +.PP +.SS "Functions" + +.in +1c +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CompressAstcEx\fP (\fBktxTexture2\fP *This, \fBktxAstcParams\fP *params)" +.br +.RI "Encode and compress a ktx texture with uncompressed images to astc\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CompressAstc\fP (\fBktxTexture2\fP *This, ktx_uint32_t quality)" +.br +.RI "Encode and compress a ktx texture with uncompressed images to astc\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CompressBasisEx\fP (\fBktxTexture2\fP *This, \fBktxBasisParams\fP *params)" +.br +.RI "Encode and possibly Supercompress a KTX2 texture with uncompressed images\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CompressBasis\fP (\fBktxTexture2\fP *This, ktx_uint32_t quality)" +.br +.RI "Supercompress a KTX2 texture with uncompressed images\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_Create\fP (const \fBktxTextureCreateInfo\fP *const createInfo, ktxTextureCreateStorageEnum storageAllocation, \fBktxTexture1\fP **newTex)" +.br +.RI "Create a new empty \fBktxTexture1\fP\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_Create\fP (const \fBktxTextureCreateInfo\fP *const createInfo, ktxTextureCreateStorageEnum storageAllocation, \fBktxTexture2\fP **newTex)" +.br +.RI "Create a new empty \fBktxTexture2\fP\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_CreateCopy\fP (\fBktxTexture2\fP *orig, \fBktxTexture2\fP **newTex)" +.br +.RI "Create a \fBktxTexture2\fP by making a copy of a \fBktxTexture2\fP\&. " +.ti -1c +.RI "\fBktx_error_code_e\fP \fBktxTexture2_SetOETF\fP (\fBktxTexture2\fP *This, khr_df_transfer_e tf)" +.br +.RI "Set the transfer function for the images in a texture\&. " +.ti -1c +.RI "\fBktx_error_code_e\fP \fBktxTexture2_SetPrimaries\fP (\fBktxTexture2\fP *This, khr_df_primaries_e primaries)" +.br +.RI "Set the primaries for the images in a texture\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_SetImageFromStdioStream\fP (\fBktxTexture1\fP *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, FILE *src, ktx_size_t srcSize)" +.br +.RI "Set image for level, layer, faceSlice from a stdio stream source\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_SetImageFromMemory\fP (\fBktxTexture1\fP *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, const ktx_uint8_t *src, ktx_size_t srcSize)" +.br +.RI "Set image for level, layer, faceSlice from an image in memory\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteToStream\fP (\fBktxTexture1\fP *This, \fBktxStream\fP *dststr)" +.br +.RI "Write a \fBktxTexture\fP object to a \fBktxStream\fP in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteToStdioStream\fP (\fBktxTexture1\fP *This, FILE *dstsstr)" +.br +.RI "Write a \fBktxTexture\fP object to a stdio stream in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteToNamedFile\fP (\fBktxTexture1\fP *This, const char *const dstname)" +.br +.RI "Write a \fBktxTexture\fP object to a named file in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteToMemory\fP (\fBktxTexture1\fP *This, ktx_uint8_t **ppDstBytes, ktx_size_t *pSize)" +.br +.RI "Write a \fBktxTexture\fP object to block of memory in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteKTX2ToStream\fP (\fBktxTexture1\fP *This, \fBktxStream\fP *dststr)" +.br +.RI "Write a \fBktxTexture\fP object to a \fBktxStream\fP in KTX 2 format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteKTX2ToStdioStream\fP (\fBktxTexture1\fP *This, FILE *dstsstr)" +.br +.RI "Write a \fBktxTexture\fP object to a stdio stream in KTX2 format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteKTX2ToNamedFile\fP (\fBktxTexture1\fP *This, const char *const dstname)" +.br +.RI "Write a \fBktxTexture\fP object to a named file in KTX2 format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture1_WriteKTX2ToMemory\fP (\fBktxTexture1\fP *This, ktx_uint8_t **ppDstBytes, ktx_size_t *pSize)" +.br +.RI "Write a \fBktxTexture\fP object to block of memory in KTX2 format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_SetImageFromStdioStream\fP (\fBktxTexture2\fP *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, FILE *src, ktx_size_t srcSize)" +.br +.RI "Set image for level, layer, faceSlice from a stdio stream source\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_SetImageFromMemory\fP (\fBktxTexture2\fP *This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, const ktx_uint8_t *src, ktx_size_t srcSize)" +.br +.RI "Set image for level, layer, faceSlice from an image in memory\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_WriteToStream\fP (\fBktxTexture2\fP *This, \fBktxStream\fP *dststr)" +.br +.RI "Write a \fBktxTexture\fP object to a \fBktxStream\fP in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_WriteToStdioStream\fP (\fBktxTexture2\fP *This, FILE *dstsstr)" +.br +.RI "Write a \fBktxTexture\fP object to a stdio stream in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_WriteToNamedFile\fP (\fBktxTexture2\fP *This, const char *const dstname)" +.br +.RI "Write a \fBktxTexture\fP object to a named file in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_WriteToMemory\fP (\fBktxTexture2\fP *This, ktx_uint8_t **ppDstBytes, ktx_size_t *pSize)" +.br +.RI "Write a \fBktxTexture\fP object to block of memory in KTX format\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_DeflateZstd\fP (\fBktxTexture2\fP *This, ktx_uint32_t compressionLevel)" +.br +.RI "Deflate the data in a \fBktxTexture2\fP object using Zstandard\&. " +.ti -1c +.RI "\fBKTX_error_code\fP \fBktxTexture2_DeflateZLIB\fP (\fBktxTexture2\fP *This, ktx_uint32_t compressionLevel)" +.br +.RI "Deflate the data in a \fBktxTexture2\fP object using miniz (ZLIB)\&. " +.in -1c +.SH "Detailed Description" +.PP +Write KTX-formatted data\&. + + +.SH "Function Documentation" +.PP +.SS "\fBKTX_error_code\fP ktxTexture1_Create (const \fBktxTextureCreateInfo\fP *const createInfo, ktxTextureCreateStorageEnum storageAllocation, \fBktxTexture1\fP ** newTex)" + +.PP +Create a new empty \fBktxTexture1\fP\&. The address of the newly created \fBktxTexture1\fP is written to the location pointed at by \fRnewTex\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIcreateInfo\fP pointer to a \fBktxTextureCreateInfo\fP struct with information describing the texture\&. +.br +\fIstorageAllocation\fP enum indicating whether or not to allocate storage for the texture images\&. +.br +\fInewTex\fP pointer to a location in which store the address of the newly created texture\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRglInternalFormat\fP in \fRcreateInfo\fP is not a valid OpenGL internal format value\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRnumDimensions\fP in \fRcreateInfo\fP is not 1, 2 or 3\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP One of \fRbase{Width,Height,Depth}\fP in \fRcreateInfo\fP is 0\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRnumFaces\fP in \fRcreateInfo\fP is not 1 or 6\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRnumLevels\fP in \fRcreateInfo\fP is 0\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fRbase{Width,Height,Depth}\fP specified in \fRcreateInfo\fP are inconsistent with \fRnumDimensions\fP\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP \fRcreateInfo\fP is requesting a 3D array or 3D cubemap texture\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP \fRcreateInfo\fP is requesting a cubemap with non-square or non-2D images\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP \fRcreateInfo\fP is requesting more mip levels than needed for the specified \fRbase{Width,Height,Depth}\fP\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Not enough memory for the texture's images\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_SetImageFromMemory (\fBktxTexture1\fP * This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, const ktx_uint8_t * src, ktx_size_t srcSize)" + +.PP +Set image for level, layer, faceSlice from an image in memory\&. Uncompressed images in memory are expected to have their rows tightly packed as is the norm for most image file formats\&. The copied image is padded as necessary to achieve the KTX-specified row alignment\&. No padding is done if the \fBktxTexture\fP's \fRisCompressed\fP field is \fRKTX_TRUE\fP\&. + +.PP +Level, layer, faceSlice rather than offset are specified to enable some validation\&. + +.PP +\fBWarning\fP +.RS 4 +Do not use \fRmemcpy\fP for this as it will not pad when necessary\&. +.RE +.PP +\fBNote\fP +.RS 4 +The caller is responsible for freeing the original image memory referred to by \fRsrc\fP\&. +.RE +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIlevel\fP mip level of the image to set\&. +.br +\fIlayer\fP array layer of the image to set\&. +.br +\fIfaceSlice\fP cube map face or depth slice of the image to set\&. +.br +\fIsrc\fP pointer to the image source in memory\&. +.br +\fIsrcSize\fP size of the source image in bytes\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRsrc\fP is NULL\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRsrcSize\fP != the expected image size for the specified level, layer & faceSlice\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP No storage was allocated when the texture was created\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_SetImageFromStdioStream (\fBktxTexture1\fP * This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, FILE * src, ktx_size_t srcSize)" + +.PP +Set image for level, layer, faceSlice from a stdio stream source\&. Uncompressed images read from the stream are expected to have their rows tightly packed as is the norm for most image file formats\&. The copied image is padded as necessary to achieve the KTX-specified row alignment\&. No padding is done if the \fBktxTexture\fP's \fRisCompressed\fP field is \fRKTX_TRUE\fP\&. + +.PP +Level, layer, faceSlice rather than offset are specified to enable some validation\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIlevel\fP mip level of the image to set\&. +.br +\fIlayer\fP array layer of the image to set\&. +.br +\fIfaceSlice\fP cube map face or depth slice of the image to set\&. +.br +\fIsrc\fP stdio stream pointer to the source\&. +.br +\fIsrcSize\fP size of the source image in bytes\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRsrc\fP is NULL\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRsrcSize\fP != the expected image size for the specified level, layer & faceSlice\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP No storage was allocated when the texture was created\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_WriteKTX2ToMemory (\fBktxTexture1\fP * This, ktx_uint8_t ** ppDstBytes, ktx_size_t * pSize)" + +.PP +Write a \fBktxTexture\fP object to block of memory in KTX2 format\&. Memory is allocated by the function and the caller is responsible for freeing it\&. + +.PP +Callers are strongly urged to include a KTXwriter item in the texture's metadata\&. It can be added by code, similar to the following, prior to calling this function\&. +.PP +.nf +char writer[100]; +snprintf(writer, sizeof(writer), "%s version %s", appName, appVer); +ktxHashList_AddKVPair(&texture\->kvDataHead, KTX_WRITER_KEY, + (ktx_uint32_t)strlen(writer) + 1, + writer); + +.fi +.PP + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIppDstBytes\fP pointer to location to write the address of the destination memory\&. The Application is responsible for freeing this memory\&. +.br +\fIpSize\fP pointer to location to write the size in bytes of the KTX data\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP, \fRppDstBytes\fP or \fRpSize\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP contains unknownY KTX- or ktx- prefixed metadata keys\&. +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_WriteKTX2ToNamedFile (\fBktxTexture1\fP * This, const char *const dstname)" + +.PP +Write a \fBktxTexture\fP object to a named file in KTX2 format\&. The file name must be encoded in utf-8\&. On Windows convert unicode names to utf-8 with \fRWideCharToMultiByte(CP_UTF8, \&.\&.\&.)\fP before calling\&. + +.PP +Callers are strongly urged to include a KTXwriter item in the texture's metadata\&. It can be added by code, similar to the following, prior to calling this function\&. +.PP +.nf +char writer[100]; +snprintf(writer, sizeof(writer), "%s version %s", appName, appVer); +ktxHashList_AddKVPair(&texture\->kvDataHead, KTX_WRITER_KEY, + (ktx_uint32_t)strlen(writer) + 1, + writer); + +.fi +.PP + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIdstname\fP destination file name\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRdstname\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP contains unknownY KTX- or ktx- prefixed metadata keys\&. +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_WriteKTX2ToStdioStream (\fBktxTexture1\fP * This, FILE * dstsstr)" + +.PP +Write a \fBktxTexture\fP object to a stdio stream in KTX2 format\&. Callers are strongly urged to include a KTXwriter item in the texture's metadata\&. It can be added by code, similar to the following, prior to calling this function\&. +.PP +.nf +char writer[100]; +snprintf(writer, sizeof(writer), "%s version %s", appName, appVer); +ktxHashList_AddKVPair(&texture\->kvDataHead, KTX_WRITER_KEY, + (ktx_uint32_t)strlen(writer) + 1, + writer); + +.fi +.PP + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIdstsstr\fP destination stdio stream\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRdstsstr\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP contains unknownY KTX- or ktx- prefixed metadata keys\&. +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_WriteKTX2ToStream (\fBktxTexture1\fP * This, \fBktxStream\fP * dststr)" + +.PP +Write a \fBktxTexture\fP object to a \fBktxStream\fP in KTX 2 format\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIdststr\fP destination \fBktxStream\fP\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRdststr\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP contains unknownY KTX- or ktx- prefixed metadata keys\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The length of the already set writerId metadata plus the library's version id exceeds the maximum allowed\&. +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_WriteToMemory (\fBktxTexture1\fP * This, ktx_uint8_t ** ppDstBytes, ktx_size_t * pSize)" + +.PP +Write a \fBktxTexture\fP object to block of memory in KTX format\&. Memory is allocated by the function and the caller is responsible for freeing it\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIppDstBytes\fP pointer to location to write the address of the destination memory\&. The Application is responsible for freeing this memory\&. +.br +\fIpSize\fP pointer to location to write the size in bytes of the KTX data\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP, \fRppDstBytes\fP or \fRpSize\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both kvDataHead and kvData are set in the \fBktxTexture\fP +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_WriteToNamedFile (\fBktxTexture1\fP * This, const char *const dstname)" + +.PP +Write a \fBktxTexture\fP object to a named file in KTX format\&. The file name must be encoded in utf-8\&. On Windows convert unicode names to utf-8 with \fRWideCharToMultiByte(CP_UTF8, \&.\&.\&.)\fP before calling\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIdstname\fP destination file name\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRdstname\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both kvDataHead and kvData are set in the \fBktxTexture\fP +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_WriteToStdioStream (\fBktxTexture1\fP * This, FILE * dstsstr)" + +.PP +Write a \fBktxTexture\fP object to a stdio stream in KTX format\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIdstsstr\fP destination stdio stream\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRdstsstr\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both kvDataHead and kvData are set in the \fBktxTexture\fP +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture1_WriteToStream (\fBktxTexture1\fP * This, \fBktxStream\fP * dststr)" + +.PP +Write a \fBktxTexture\fP object to a \fBktxStream\fP in KTX format\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIdststr\fP destination \fBktxStream\fP\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRdststr\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both kvDataHead and kvData are set in the \fBktxTexture\fP +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_CompressAstc (\fBktxTexture2\fP * This, ktx_uint32_t quality)" + +.PP +Encode and compress a ktx texture with uncompressed images to astc\&. The images are either encoded to ASTC block-compressed format\&. The encoded images replace the original images and the texture's fields including the DFD are modified to reflect the new state\&. + +.PP +Such textures can be directly uploaded to a GPU via a graphics API\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIquality\fP Compression quality, a value from 0 - 100\&. Higher=higher quality/slower speed\&. Lower=lower quality/faster speed\&. Negative values for quality are considered > 100\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture's images are supercompressed\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture's image are in a block compressed format\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture image's format is a packed format (e\&.g\&. RGB565)\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture image format's component size is not 8-bits\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture's images are 1D\&. Only 2D images can be supercompressed\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Not enough memory to carry out supercompression\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_CompressAstcEx (\fBktxTexture2\fP * This, \fBktxAstcParams\fP * params)" + +.PP +Encode and compress a ktx texture with uncompressed images to astc\&. The images are encoded to ASTC block-compressed format\&. The encoded images replace the original images and the texture's fields including the DFD are modified to reflect the new state\&. + +.PP +Such textures can be directly uploaded to a GPU via a graphics API\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIparams\fP pointer to ASTC params object\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture's images are supercompressed\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture's images are in a block compressed format\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture image's format is a packed format (e\&.g\&. RGB565)\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture image format's component size is not 8-bits\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture's images are 1D\&. Only 2D images can be supercompressed\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Transfer function of \fRThis\fP is not sRGB or Linear\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP \fRparams->mode\fP is HDR but transfer function of \fRThis\fP is sRGB\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP ASTC encoder failed to compress image\&. Possibly due to incorrect floating point compilation settings\&. Should not happen in release package\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP This->generateMipmaps is set\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Not enough memory to carry out compression\&. +.br +\fI\fBKTX_UNSUPPORTED_FEATURE\fP\fP \fRparams->mode\fP is HDR mode which is not yet implemented\&. +.br +\fI\fBKTX_UNSUPPORTED_FEATURE\fP\fP ASTC encoder not compiled with enough capacity for requested block size\&. Should not happen in release package\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_CompressBasis (\fBktxTexture2\fP * This, ktx_uint32_t quality)" + +.PP +Supercompress a KTX2 texture with uncompressed images\&. The images are encoded to ETC1S block-compressed format and supercompressed with Basis Universal\&. The encoded images replace the original images and the texture's fields including the DFD are modified to reflect the new state\&. + +.PP +Such textures must be transcoded to a desired target block compressed format before they can be uploaded to a GPU via a graphics API\&. + +.PP +\fBSee also\fP +.RS 4 +\fBktxTexture2_CompressBasisEx()\fP\&. +.RE +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIquality\fP Compression quality, a value from 1 - 255\&. Default is 128 which is selected if \fRquality\fP is 0\&. Lower=better compression/lower quality/faster\&. Higher=less compression/higher quality/slower\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture is already supercompressed\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture's image are in a block compressed format\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Not enough memory to carry out supercompression\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_CompressBasisEx (\fBktxTexture2\fP * This, \fBktxBasisParams\fP * params)" + +.PP +Encode and possibly Supercompress a KTX2 texture with uncompressed images\&. The images are either encoded to ETC1S block-compressed format and supercompressed with Basis LZ or they are encoded to UASTC block-compressed format\&. UASTC format is selected by setting the \fRuastc\fP field of \fIparams\fP to \fRKTX_TRUE\fP\&. The encoded images replace the original images and the texture's fields including the DFD are modified to reflect the new state\&. + +.PP +Such textures must be transcoded to a desired target block compressed format before they can be uploaded to a GPU via a graphics API\&. + +.PP +\fBSee also\fP +.RS 4 +\fBktxTexture2_TranscodeBasis()\fP\&. +.RE +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIparams\fP pointer to Basis params object\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture's images are supercompressed\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture's images are in a block compressed format\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture image's format is a packed format (e\&.g\&. RGB565)\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The texture image format's component size is not 8-bits\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP \fRnormalMode\fP is specified but the texture has only one component\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both preSwizzle and and inputSwizzle are specified in \fIparams\fP\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP This->generateMipmaps is set\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Not enough memory to carry out compression\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_Create (const \fBktxTextureCreateInfo\fP *const createInfo, ktxTextureCreateStorageEnum storageAllocation, \fBktxTexture2\fP ** newTex)" + +.PP +Create a new empty \fBktxTexture2\fP\&. The address of the newly created \fBktxTexture2\fP is written to the location pointed at by \fRnewTex\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIcreateInfo\fP pointer to a \fBktxTextureCreateInfo\fP struct with information describing the texture\&. +.br +\fIstorageAllocation\fP enum indicating whether or not to allocate storage for the texture images\&. +.br +\fInewTex\fP pointer to a location in which store the address of the newly created texture\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRglInternalFormat\fP in \fRcreateInfo\fP is not a valid OpenGL internal format value\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRnumDimensions\fP in \fRcreateInfo\fP is not 1, 2 or 3\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP One of \fRbase{Width,Height,Depth}\fP in \fRcreateInfo\fP is 0\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRnumFaces\fP in \fRcreateInfo\fP is not 1 or 6\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRnumLevels\fP in \fRcreateInfo\fP is 0\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fRbase{Width,Height,Depth}\fP specified in \fRcreateInfo\fP are inconsistent with \fRnumDimensions\fP\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP \fRcreateInfo\fP is requesting a 3D array or 3D cubemap texture\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP \fRcreateInfo\fP is requesting a cubemap with non-square or non-2D images\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP \fRcreateInfo\fP is requesting more mip levels than needed for the specified \fRbase{Width,Height,Depth}\fP\&. +.br +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Not enough memory for the texture's images\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_CreateCopy (\fBktxTexture2\fP * orig, \fBktxTexture2\fP ** newTex)" + +.PP +Create a \fBktxTexture2\fP by making a copy of a \fBktxTexture2\fP\&. The address of the newly created \fBktxTexture2\fP is written to the location pointed at by \fRnewTex\fP\&. + +.PP +\fBParameters\fP +.RS 4 +\fIorig\fP pointer to the texture to copy\&. +.br +\fInewTex\fP pointer to a location in which store the address of the newly created texture\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_OUT_OF_MEMORY\fP\fP Not enough memory for the texture data\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_DeflateZLIB (\fBktxTexture2\fP * This, ktx_uint32_t compressionLevel)" + +.PP +Deflate the data in a \fBktxTexture2\fP object using miniz (ZLIB)\&. The texture's levelIndex, dataSize, DFD, data pointer, and supercompressionScheme will all be updated after successful deflation to reflect the deflated data\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIcompressionLevel\fP set speed vs compression ratio trade-off\&. Values between 1 and 9 are accepted\&. The lower the level the faster\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_DeflateZstd (\fBktxTexture2\fP * This, ktx_uint32_t compressionLevel)" + +.PP +Deflate the data in a \fBktxTexture2\fP object using Zstandard\&. The texture's levelIndex, dataSize, DFD, data pointer, and supercompressionScheme will all be updated after successful deflation to reflect the deflated data\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP object of interest\&. +.br +\fIcompressionLevel\fP set speed vs compression ratio trade-off\&. Values between 1 and 22 are accepted\&. The lower the level the faster\&. Values above 20 should be used with caution as they require more memory\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_SetImageFromMemory (\fBktxTexture2\fP * This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, const ktx_uint8_t * src, ktx_size_t srcSize)" + +.PP +Set image for level, layer, faceSlice from an image in memory\&. Uncompressed images in memory are expected to have their rows tightly packed as is the norm for most image file formats\&. KTX 2 also requires tight packing this function does not add any padding\&. + +.PP +Level, layer, faceSlice rather than offset are specified to enable some validation\&. + +.PP +\fBNote\fP +.RS 4 +The caller is responsible for freeing the original image memory referred to by \fRsrc\fP\&. +.RE +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIlevel\fP mip level of the image to set\&. +.br +\fIlayer\fP array layer of the image to set\&. +.br +\fIfaceSlice\fP cube map face or depth slice of the image to set or KTX_FACESLICE_WHOLE_LEVEL to set the entire level\&. +.br +\fIsrc\fP pointer to the image source in memory\&. +.br +\fIsrcSize\fP size of the source image in bytes\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRsrc\fP is NULL\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRsrcSize\fP != the expected image size for the specified level, layer & faceSlice\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP No storage was allocated when the texture was created\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_SetImageFromStdioStream (\fBktxTexture2\fP * This, ktx_uint32_t level, ktx_uint32_t layer, ktx_uint32_t faceSlice, FILE * src, ktx_size_t srcSize)" + +.PP +Set image for level, layer, faceSlice from a stdio stream source\&. Uncompressed images read from the stream are expected to have their rows tightly packed as is the norm for most image file formats\&. KTX 2 also requires tight packing this function does not add any padding\&. + +.PP +Level, layer, faceSlice rather than offset are specified to enable some validation\&. + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIlevel\fP mip level of the image to set\&. +.br +\fIlayer\fP array layer of the image to set\&. +.br +\fIfaceSlice\fP cube map face or depth slice of the image to set or KTX_FACESLICE_WHOLE_LEVEL to set the entire level\&. +.br +\fIsrc\fP stdio stream pointer to the source\&. +.br +\fIsrcSize\fP size of the source image in bytes\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRsrc\fP is NULL\&. +.br +\fI\fBKTX_INVALID_VALUE\fP\fP \fRsrcSize\fP != the expected image size for the specified level, layer & faceSlice\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP No storage was allocated when the texture was created\&. +.RE +.PP + +.SS "\fBktx_error_code_e\fP ktxTexture2_SetOETF (\fBktxTexture2\fP * This, khr_df_transfer_e tf)" + +.PP +Set the transfer function for the images in a texture\&. +.PP +\fBDeprecated\fP +.RS 4 +Use ktxTexture2_SetTransferFunction\&. +.RE +.PP + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP +.br +\fItf\fP enumerator of the transfer function to set +.RE +.PP + +.SS "\fBktx_error_code_e\fP ktxTexture2_SetPrimaries (\fBktxTexture2\fP * This, khr_df_primaries_e primaries)" + +.PP +Set the primaries for the images in a texture\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the \fBktxTexture2\fP +.br +\fIprimaries\fP enumerator of the primaries to set +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_WriteToMemory (\fBktxTexture2\fP * This, ktx_uint8_t ** ppDstBytes, ktx_size_t * pSize)" + +.PP +Write a \fBktxTexture\fP object to block of memory in KTX format\&. Memory is allocated by the function and the caller is responsible for freeing it\&. + +.PP +Callers are strongly urged to include a KTXwriter item in the texture's metadata\&. It can be added by code, similar to the following, prior to calling this function\&. +.PP +.nf +char writer[100]; +snprintf(writer, sizeof(writer), "%s version %s", appName, appVer); +ktxHashList_AddKVPair(&texture\->kvDataHead, KTX_WRITER_KEY, + (ktx_uint32_t)strlen(writer) + 1, + writer); + +.fi +.PP + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIppDstBytes\fP pointer to location to write the address of the destination memory\&. The Application is responsible for freeing this memory\&. +.br +\fIpSize\fP pointer to location to write the size in bytes of the KTX data\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP, \fRppDstBytes\fP or \fRpSize\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both kvDataHead and kvData are set in the \fBktxTexture\fP +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_WriteToNamedFile (\fBktxTexture2\fP * This, const char *const dstname)" + +.PP +Write a \fBktxTexture\fP object to a named file in KTX format\&. The file name must be encoded in utf-8\&. On Windows convert unicode names to utf-8 with \fRWideCharToMultiByte(CP_UTF8, \&.\&.\&.)\fP before calling\&. + +.PP +Callers are strongly urged to include a KTXwriter item in the texture's metadata\&. It can be added by code, similar to the following, prior to calling this function\&. +.PP +.nf +char writer[100]; +snprintf(writer, sizeof(writer), "%s version %s", appName, appVer); +ktxHashList_AddKVPair(&texture\->kvDataHead, KTX_WRITER_KEY, + (ktx_uint32_t)strlen(writer) + 1, + writer); + +.fi +.PP + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIdstname\fP destination file name\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRdstname\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both kvDataHead and kvData are set in the \fBktxTexture\fP +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_WriteToStdioStream (\fBktxTexture2\fP * This, FILE * dstsstr)" + +.PP +Write a \fBktxTexture\fP object to a stdio stream in KTX format\&. Callers are strongly urged to include a KTXwriter item in the texture's metadata\&. It can be added by code, similar to the following, prior to calling this function\&. +.PP +.nf +char writer[100]; +snprintf(writer, sizeof(writer), "%s version %s", appName, appVer); +ktxHashList_AddKVPair(&texture\->kvDataHead, KTX_WRITER_KEY, + (ktx_uint32_t)strlen(writer) + 1, + writer); + +.fi +.PP + +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIdstsstr\fP destination stdio stream\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRdstsstr\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both kvDataHead and kvData are set in the \fBktxTexture\fP +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SS "\fBKTX_error_code\fP ktxTexture2_WriteToStream (\fBktxTexture2\fP * This, \fBktxStream\fP * dststr)" + +.PP +Write a \fBktxTexture\fP object to a \fBktxStream\fP in KTX format\&. +.PP +\fBParameters\fP +.RS 4 +\fIThis\fP pointer to the target \fBktxTexture\fP object\&. +.br +\fIdststr\fP destination \fBktxStream\fP\&. +.RE +.PP +\fBReturns\fP +.RS 4 +KTX_SUCCESS on success, other KTX_* enum values on error\&. +.RE +.PP +\fBExceptions\fP +.RS 4 +\fI\fBKTX_INVALID_VALUE\fP\fP \fRThis\fP or \fRdststr\fP is NULL\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The \fBktxTexture\fP does not contain any image data\&. +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP Both kvDataHead and kvData are set in the \fBktxTexture\fP +.br +\fI\fBKTX_INVALID_OPERATION\fP\fP The length of the already set writerId metadata plus the library's version id exceeds the maximum allowed\&. +.br +\fI\fBKTX_FILE_OVERFLOW\fP\fP The file exceeded the maximum size supported by the system\&. +.br +\fI\fBKTX_FILE_WRITE_ERROR\fP\fP An error occurred while writing the file\&. +.RE +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for libktx Reference from the source code\&. diff --git a/ktx/build/docs/man/man3/x.3 b/ktx/build/docs/man/man3/x.3 new file mode 100644 index 0000000..555c05d --- /dev/null +++ b/ktx/build/docs/man/man3/x.3 @@ -0,0 +1 @@ +.so man3/ktxOrientation.3 diff --git a/ktx/build/docs/man/man3/y.3 b/ktx/build/docs/man/man3/y.3 new file mode 100644 index 0000000..555c05d --- /dev/null +++ b/ktx/build/docs/man/man3/y.3 @@ -0,0 +1 @@ +.so man3/ktxOrientation.3 diff --git a/ktx/build/docs/man/man3/z.3 b/ktx/build/docs/man/man3/z.3 new file mode 100644 index 0000000..555c05d --- /dev/null +++ b/ktx/build/docs/man/man3/z.3 @@ -0,0 +1 @@ +.so man3/ktxOrientation.3 diff --git a/ktx/build/external/astc-encoder/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/external/astc-encoder/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/external/astc-encoder/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/external/astc-encoder/CMakeFiles/CTestScript.cmake b/ktx/build/external/astc-encoder/CMakeFiles/CTestScript.cmake new file mode 100644 index 0000000..8b6c90a --- /dev/null +++ b/ktx/build/external/astc-encoder/CMakeFiles/CTestScript.cmake @@ -0,0 +1,167 @@ +# This file is configured by CMake automatically as CTestScript.cmake +# If you choose not to use CMake, this file may be hand configured, by +# filling in the required variables. + +cmake_minimum_required(VERSION 4.3.3) + +# CTest Start Step +set(CTEST_SOURCE_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder") +set(CTEST_BINARY_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder") + +# CTest Update Step +set(CTEST_UPDATE_COMMAND "") +set(CTEST_UPDATE_OPTIONS "") +set(CTEST_UPDATE_VERSION_ONLY "") +set(CTEST_NIGHTLY_START_TIME "00:00:00 EDT") + +# CVS options +set(CTEST_CVS_COMMAND "") +set(CTEST_CVS_UPDATE_OPTIONS "") + +# Subversion options +set(CTEST_SVN_COMMAND "") +set(CTEST_SVN_OPTIONS "") +set(CTEST_SVN_UPDATE_OPTIONS "") + +# Git options +set(CTEST_GIT_COMMAND "") +set(CTEST_GIT_INIT_SUBMODULES "") +set(CTEST_GIT_UPDATE_CUSTOM "") +set(CTEST_GIT_UPDATE_OPTIONS "") + +# Perforce options +set(CTEST_P4_COMMAND "") +set(CTEST_P4_CLIENT "") +set(CTEST_P4_OPTIONS "") +set(CTEST_P4_UPDATE_CUSTOM "") +set(CTEST_P4_UPDATE_OPTIONS "") + +# CTest Configure Step +set(CTEST_CMAKE_GENERATOR "Unix Makefiles") +set(CTEST_LABELS_FOR_SUBPROJECTS "") + +# CTest Build Step +set(CTEST_CONFIGURATION_TYPE "Release") +set(CTEST_USE_LAUNCHERS "") + +# CTest Test Step +set(CTEST_RESOURCE_SPEC_FILE "") +set(CTEST_TEST_LOAD "") +set(CTEST_TEST_TIMEOUT "1500") + +# CTest Coverage Step +set(CTEST_COVERAGE_COMMAND "/usr/bin/gcov") +set(CTEST_COVERAGE_EXTRA_FLAGS "-l") + +# CTest MemCheck Step +set(CTEST_MEMORYCHECK_COMMAND "/usr/bin/valgrind") +set(CTEST_MEMORYCHECK_COMMAND_OPTIONS "") +set(CTEST_MEMORYCHECK_TYPE "") +set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS "") +set(CTEST_MEMORYCHECK_SUPPRESSIONS_FILE "") + +# CTest Submit Step +set(CTEST_SITE "wappdesktop") +set(CTEST_BUILD_NAME "Linux-c++") +set(CTEST_SUBMIT_URL "http://") +set(CTEST_SUBMIT_INACTIVITY_TIMEOUT "") +set(CTEST_TLS_VERIFY "") +set(CTEST_TLS_VERSION "") + +################################################################################ + +if(NOT MODEL) + set(MODEL "Experimental") +endif() + +if(MODEL STREQUAL "NightlyMemoryCheck") + set(MODEL "Nightly") + set(ACTIONS "Start;Update;Configure;Build;MemCheck;Coverage;Submit") +endif() + +if(NOT ACTIONS) + if(MODEL STREQUAL "Experimental") + set(ACTIONS "Start;Configure;Build;Test;Coverage;Submit") + else() + set(ACTIONS "Start;Update;Configure;Build;Test;Coverage;Submit") + endif() +endif() + +################################################################################ + +set(_exit_code 0) + +if("Start" IN_LIST ACTIONS OR NOT EXISTS "${CTEST_BINARY_DIRECTORY}/Testing/TAG") + ctest_start("${MODEL}") +else() + ctest_start("${MODEL}" APPEND) +endif() + +if("Update" IN_LIST ACTIONS) + ctest_update(RETURN_VALUE update_count) + if(update_count LESS 0) + math(EXPR _exit_code "${_exit_code} | 0x01") + endif() + if(MODEL STREQUAL "Continuous" AND update_count EQUAL 0) + return() + endif() +endif() + +if("Configure" IN_LIST ACTIONS) + ctest_configure(RETURN_VALUE success) + if(success LESS 0) + math(EXPR _exit_code "${_exit_code} | 0x02") + endif() +endif() + +if("Build" IN_LIST ACTIONS) + ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}") + ctest_build(RETURN_VALUE success) + if(NOT success EQUAL 0) + math(EXPR _exit_code "${_exit_code} | 0x04") + endif() +endif() + +if("Test" IN_LIST ACTIONS) + ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}") + ctest_test(RETURN_VALUE success) + if(NOT success EQUAL 0) + math(EXPR _exit_code "${_exit_code} | 0x08") + endif() +endif() + +if("Coverage" IN_LIST ACTIONS) + ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}") + ctest_coverage(RETURN_VALUE success) + if(NOT success EQUAL 0) + math(EXPR _exit_code "${_exit_code} | 0x20") + endif() +endif() + +if("MemCheck" IN_LIST ACTIONS) + ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}") + ctest_memcheck(RETURN_VALUE success) + if(NOT success EQUAL 0) + math(EXPR _exit_code "${_exit_code} | 0x10") + endif() +endif() + +file(GLOB notes_files LIST_DIRECTORIES OFF + "${CTEST_BINARY_DIRECTORY}/Testing/Notes/*") +if(notes_files) + list(APPEND CTEST_NOTES_FILES "${notes_files}") +endif() + +if("Submit" IN_LIST ACTIONS) + ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}") + ctest_submit( + RETRY_COUNT "3" + RETRY_DELAY "5" + RETURN_VALUE success + ) + if(NOT success EQUAL 0) + math(EXPR _exit_code "${_exit_code} | 0x40") + endif() +endif() + +cmake_language(EXIT "${_exit_code}") diff --git a/ktx/build/external/astc-encoder/CMakeFiles/progress.marks b/ktx/build/external/astc-encoder/CMakeFiles/progress.marks new file mode 100644 index 0000000..b1bd38b --- /dev/null +++ b/ktx/build/external/astc-encoder/CMakeFiles/progress.marks @@ -0,0 +1 @@ +13 diff --git a/ktx/build/external/astc-encoder/CTestTestfile.cmake b/ktx/build/external/astc-encoder/CTestTestfile.cmake new file mode 100644 index 0000000..e3b8ac4 --- /dev/null +++ b/ktx/build/external/astc-encoder/CTestTestfile.cmake @@ -0,0 +1,7 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs("Source") diff --git a/ktx/build/external/astc-encoder/DartConfiguration.tcl b/ktx/build/external/astc-encoder/DartConfiguration.tcl new file mode 100644 index 0000000..d620cde --- /dev/null +++ b/ktx/build/external/astc-encoder/DartConfiguration.tcl @@ -0,0 +1,109 @@ +# This file is configured by CMake automatically as DartConfiguration.tcl +# If you choose not to use CMake, this file may be hand configured, by +# filling in the required variables. + + +# Configuration directories and files +SourceDirectory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder +BuildDirectory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder + +# Where to place the cost data store +CostDataFile: + +# Site is something like machine.domain, i.e. pragmatic.crd +Site: wappdesktop + +# Build name is osname-revision-compiler, i.e. Linux-2.4.2-2smp-c++ +BuildName: Linux-c++ + +# Subprojects +LabelsForSubprojects: + +# Submission information +SubmitURL: http:// +SubmitInactivityTimeout: + +# Dashboard start time +NightlyStartTime: 00:00:00 EDT + +# Commands for the build/test/submit cycle +ConfigureCommand: "/usr/bin/cmake" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder" +MakeCommand: /usr/bin/cmake --build . --config "${CTEST_CONFIGURATION_TYPE}" +DefaultCTestConfigurationType: Release + +# version control +UpdateVersionOnly: + +# CVS options +# Default is "-d -P -A" +CVSCommand: +CVSUpdateOptions: + +# Subversion options +SVNCommand: +SVNOptions: +SVNUpdateOptions: + +# Git options +GITCommand: +GITInitSubmodules: +GITUpdateOptions: +GITUpdateCustom: + +# Perforce options +P4Command: +P4Client: +P4Options: +P4UpdateOptions: +P4UpdateCustom: + +# Generic update command +UpdateCommand: +UpdateOptions: +UpdateType: + +# Compiler info +Compiler: /usr/bin/c++ +CompilerVersion: 16.1.1 + +# Dynamic analysis (MemCheck) +PurifyCommand: +ValgrindCommand: +ValgrindCommandOptions: +DrMemoryCommand: +DrMemoryCommandOptions: +CudaSanitizerCommand: +CudaSanitizerCommandOptions: +MemoryCheckType: +MemoryCheckSanitizerOptions: +MemoryCheckCommand: /usr/bin/valgrind +MemoryCheckCommandOptions: +MemoryCheckSuppressionFile: + +# Coverage +CoverageCommand: /usr/bin/gcov +CoverageExtraFlags: -l + +# Testing options +# TimeOut is the amount of time in seconds to wait for processes +# to complete during testing. After TimeOut seconds, the +# process will be summarily terminated. +# Currently set to 25 minutes +TimeOut: 1500 + +# During parallel testing CTest will not start a new test if doing +# so would cause the system load to exceed this value. +TestLoad: + +TLSVerify: +TLSVersion: + +UseLaunchers: +CurlOptions: +# warning, if you add new options here that have to do with submit, +# you have to update cmCTestSubmitCommand.cxx + +# For CTest submissions that timeout, these options +# specify behavior for retrying the submission +CTestSubmitRetryDelay: 5 +CTestSubmitRetryCount: 3 diff --git a/ktx/build/external/astc-encoder/Makefile b/ktx/build/external/astc-encoder/Makefile new file mode 100644 index 0000000..f8c9a0f --- /dev/null +++ b/ktx/build/external/astc-encoder/Makefile @@ -0,0 +1,222 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/astc-encoder/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/astc-encoder/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/astc-encoder/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/astc-encoder/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/external/astc-encoder/Source/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/DependInfo.cmake b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/DependInfo.cmake new file mode 100644 index 0000000..903da32 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/DependInfo.cmake @@ -0,0 +1,44 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_averages_and_directions.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_block_sizes.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_quantize.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_unquantize.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compress_symbolic.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compute_variance.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_decompress_symbolic.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_entry.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_find_best_partitioning.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_image.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_integer_sequence.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib_softfloat.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_partition_tables.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_percentile_tables.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_quantization.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_symbolic_physical.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_align.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o" "gcc" "external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o new file mode 100644 index 0000000..a58c5ac Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o.d new file mode 100644 index 0000000..3904dec --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o.d @@ -0,0 +1,202 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_averages_and_directions.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o new file mode 100644 index 0000000..2ca193f Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o.d new file mode 100644 index 0000000..d878e86 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o.d @@ -0,0 +1,202 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_block_sizes.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o new file mode 100644 index 0000000..176d888 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o.d new file mode 100644 index 0000000..23ca107 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o.d @@ -0,0 +1,202 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_quantize.cpp \ + /usr/include/stdc-predef.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cstring \ + /usr/include/string.h /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o new file mode 100644 index 0000000..a100dd2 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o.d new file mode 100644 index 0000000..0fc2d94 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o.d @@ -0,0 +1,204 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_unquantize.cpp \ + /usr/include/stdc-predef.h /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/initializer_list \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o new file mode 100644 index 0000000..468f3a8 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o.d new file mode 100644 index 0000000..228e2ee --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o.d @@ -0,0 +1,203 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compress_symbolic.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o new file mode 100644 index 0000000..347ca1f Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o.d new file mode 100644 index 0000000..583afef --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o.d @@ -0,0 +1,202 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compute_variance.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o new file mode 100644 index 0000000..b47f672 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o.d new file mode 100644 index 0000000..6e130b5 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o.d @@ -0,0 +1,202 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_decompress_symbolic.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o new file mode 100644 index 0000000..8660883 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o.d new file mode 100644 index 0000000..f629e79 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o.d @@ -0,0 +1,3 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.cpp \ + /usr/include/stdc-predef.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o new file mode 100644 index 0000000..48516ab Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o.d new file mode 100644 index 0000000..a47148c --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o.d @@ -0,0 +1,273 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_entry.cpp \ + /usr/include/stdc-predef.h /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /usr/include/c++/16.1.1/cstddef /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/wchar.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal_entry.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/chrono.h /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/limits /usr/include/c++/16.1.1/ctime \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/mutex \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o new file mode 100644 index 0000000..7744c2f Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o.d new file mode 100644 index 0000000..0b4b170 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o.d @@ -0,0 +1,201 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_find_best_partitioning.cpp \ + /usr/include/stdc-predef.h /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o new file mode 100644 index 0000000..fc28ec1 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o.d new file mode 100644 index 0000000..99dc53d --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o.d @@ -0,0 +1,202 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp \ + /usr/include/stdc-predef.h /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o new file mode 100644 index 0000000..4483c16 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o.d new file mode 100644 index 0000000..50a1890 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o.d @@ -0,0 +1,201 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_image.cpp \ + /usr/include/stdc-predef.h /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/assert.h /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/bits/version.h /usr/include/string.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o new file mode 100644 index 0000000..6799026 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o.d new file mode 100644 index 0000000..df7534e --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o.d @@ -0,0 +1,206 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_integer_sequence.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o new file mode 100644 index 0000000..c194646 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o.d new file mode 100644 index 0000000..45d07f5 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o.d @@ -0,0 +1,172 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/assert.h /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o new file mode 100644 index 0000000..d2a092d Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o.d new file mode 100644 index 0000000..b5e2caf --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o.d @@ -0,0 +1,3 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib_softfloat.cpp \ + /usr/include/stdc-predef.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o new file mode 100644 index 0000000..6c9e6f9 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o.d new file mode 100644 index 0000000..1144255 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o.d @@ -0,0 +1,202 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_partition_tables.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o new file mode 100644 index 0000000..2903006 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o.d new file mode 100644 index 0000000..97eab82 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o.d @@ -0,0 +1,202 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_percentile_tables.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o new file mode 100644 index 0000000..dca09b6 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o.d new file mode 100644 index 0000000..ff88dd3 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o.d @@ -0,0 +1,202 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o new file mode 100644 index 0000000..1cfb90f Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o.d new file mode 100644 index 0000000..a52c0a1 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o.d @@ -0,0 +1,202 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_quantization.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o new file mode 100644 index 0000000..777a125 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o.d new file mode 100644 index 0000000..8d8fdd8 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o.d @@ -0,0 +1,202 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_symbolic_physical.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o new file mode 100644 index 0000000..cca6d57 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o.d new file mode 100644 index 0000000..66f4002 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o.d @@ -0,0 +1,204 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_align.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o new file mode 100644 index 0000000..388d02a Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o differ diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o.d b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o.d new file mode 100644 index 0000000..bedb388 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o.d @@ -0,0 +1,202 @@ +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cstring /usr/include/string.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make new file mode 100644 index 0000000..e058b28 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make @@ -0,0 +1,450 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.make + +# Include the progress variables for this target. +include external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/progress.make + +# Include the compile flags for this target's objects. +include external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/codegen: +.PHONY : external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/codegen + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_averages_and_directions.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_averages_and_directions.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_averages_and_directions.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_averages_and_directions.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_block_sizes.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_block_sizes.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_block_sizes.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_block_sizes.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_quantize.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_quantize.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_quantize.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_quantize.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_unquantize.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_unquantize.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_unquantize.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_unquantize.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compress_symbolic.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compress_symbolic.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compress_symbolic.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compress_symbolic.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compute_variance.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compute_variance.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compute_variance.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compute_variance.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_decompress_symbolic.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_decompress_symbolic.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_decompress_symbolic.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_decompress_symbolic.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_entry.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_entry.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_entry.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_entry.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_find_best_partitioning.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_find_best_partitioning.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_find_best_partitioning.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_find_best_partitioning.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_image.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_image.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_image.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_image.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_integer_sequence.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_integer_sequence.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_integer_sequence.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_integer_sequence.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib_softfloat.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib_softfloat.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib_softfloat.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib_softfloat.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_partition_tables.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_partition_tables.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_partition_tables.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_partition_tables.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_percentile_tables.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_percentile_tables.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_percentile_tables.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_percentile_tables.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_quantization.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_quantization.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_quantization.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_quantization.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_symbolic_physical.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_symbolic_physical.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_symbolic_physical.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_symbolic_physical.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_align.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_21) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_align.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_align.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_align.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.s + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_22) "Building CXX object external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o -MF CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o.d -o CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp > CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.i + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp -o CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.s + +# Object files for target astcenc-avx2-static +astcenc__avx2__static_OBJECTS = \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o" \ +"CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o" + +# External object files for target astcenc-avx2-static +astcenc__avx2__static_EXTERNAL_OBJECTS = + +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make +external/astc-encoder/Source/libastcenc-avx2-static.a: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_23) "Linking CXX static library libastcenc-avx2-static.a" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && $(CMAKE_COMMAND) -P CMakeFiles/astcenc-avx2-static.dir/cmake_clean_target.cmake + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/astcenc-avx2-static.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build: external/astc-encoder/Source/libastcenc-avx2-static.a +.PHONY : external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source && $(CMAKE_COMMAND) -P CMakeFiles/astcenc-avx2-static.dir/cmake_clean.cmake +.PHONY : external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/clean + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/DependInfo.cmake "--color=$(COLOR)" astcenc-avx2-static +.PHONY : external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/depend + diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/cmake_clean.cmake b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/cmake_clean.cmake new file mode 100644 index 0000000..859b44a --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/cmake_clean.cmake @@ -0,0 +1,53 @@ +file(REMOVE_RECURSE + "CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o.d" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o" + "CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o.d" + "libastcenc-avx2-static.a" + "libastcenc-avx2-static.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/astcenc-avx2-static.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/cmake_clean_target.cmake b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/cmake_clean_target.cmake new file mode 100644 index 0000000..ac28c0c --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libastcenc-avx2-static.a" +) diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.internal b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.internal new file mode 100644 index 0000000..a096cdf --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.internal @@ -0,0 +1,4939 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_averages_and_directions.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_block_sizes.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_quantize.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_unquantize.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compress_symbolic.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compute_variance.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_decompress_symbolic.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.cpp + /usr/include/stdc-predef.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_entry.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal_entry.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/linux/errno.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_find_best_partitioning.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_image.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_integer_sequence.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib_softfloat.cpp + /usr/include/stdc-predef.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_partition_tables.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_percentile_tables.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_quantization.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_symbolic_physical.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_align.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.make b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.make new file mode 100644 index 0000000..3765ed0 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.make @@ -0,0 +1,5631 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_averages_and_directions.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_block_sizes.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_quantize.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_unquantize.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compress_symbolic.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compute_variance.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_decompress_symbolic.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.cpp \ + /usr/include/stdc-predef.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_entry.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal_entry.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_find_best_partitioning.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_image.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_integer_sequence.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib_softfloat.cpp \ + /usr/include/stdc-predef.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_partition_tables.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_percentile_tables.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_quantization.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_symbolic_physical.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_align.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_symbolic_physical.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_percentile_tables.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_partition_tables.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_integer_sequence.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_image.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp: + +/usr/include/pthread.h: + +/usr/include/linux/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/sched/types.h: + +/usr/include/errno.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/mutex: + +/usr/include/c++/16.1.1/functional: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/c++/16.1.1/bits/unique_lock.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/bits/chrono.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_quantization.cpp: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/include/c++/16.1.1/atomic: + +/usr/include/bits/types/wint_t.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/bits/setjmp.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/include/bits/cpu-set.h: + +/usr/include/asm/types.h: + +/usr/include/asm/posix_types_64.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/sys/cdefs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib_softfloat.cpp: + +/usr/include/stdlib.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/bits/floatn.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/exception: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/features-time64.h: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/bits/endianness.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_weight_align.cpp: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/cstring: + +/usr/include/sys/select.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/types/timer_t.h: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/algorithm: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/cassert: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h: + +/usr/include/bits/waitflags.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h: + +/usr/include/bits/long-double.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h: + +/usr/include/c++/16.1.1/ratio: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h: + +/usr/include/bits/fp-logb.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/c++/16.1.1/condition_variable: + +/usr/include/bits/mathcalls-macros.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h: + +/usr/include/asm-generic/int-ll64.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h: + +/usr/include/bits/types/clock_t.h: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/bits/mathcalls.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/libc-header-start.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.cpp: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/math.h: + +/usr/include/gnu/stubs.h: + +/usr/include/c++/16.1.1/stdlib.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/bits/iscanonical.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/bits/typesizes.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h: + +/usr/include/sched.h: + +/usr/include/bits/fp-fast.h: + +/usr/include/bits/types/error_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/FILE.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/bits/types.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/stdc-predef.h: + +/usr/include/strings.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/bits/wordsize.h: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/stdio.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h: + +/usr/include/c++/16.1.1/bits/stl_relops.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h: + +/usr/include/c++/16.1.1/compare: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_averages_and_directions.cpp: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/string.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/bits/stdio_lim.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h: + +/usr/include/alloca.h: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_mathlib.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_entry.cpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h: + +/usr/include/c++/16.1.1/array: + +/usr/include/bits/select.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/thread-shared-types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.h: + +/usr/include/bits/endian.h: + +/usr/include/bits/sched.h: + +/usr/include/features.h: + +/usr/include/bits/types/__FILE.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/c++/16.1.1/bits/std_mutex.h: + +/usr/include/asm/errno.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/types/struct_timeval.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h: + +/usr/include/sys/types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h: + +/usr/include/c++/16.1.1/concepts: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h: + +/usr/include/time.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h: + +/usr/include/bits/types/__locale_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_find_best_partitioning.cpp: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h: + +/usr/include/asm-generic/types.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h: + +/usr/include/c++/16.1.1/utility: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compute_variance.cpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h: + +/usr/include/bits/math-vector.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h: + +/usr/include/bits/timesize.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h: + +/usr/include/bits/mathcalls-narrow.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h: + +/usr/include/c++/16.1.1/cfloat: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/waitstatus.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h: + +/usr/include/bits/byteswap.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_quantize.cpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_compress_symbolic.cpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_block_sizes.cpp: + +/usr/include/wchar.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_color_unquantize.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_decompress_symbolic.cpp: + +/usr/include/bits/errno.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_internal_entry.h: + +/usr/include/assert.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.cpp: diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts new file mode 100644 index 0000000..a488c84 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for astcenc-avx2-static. diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/depend.make b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/depend.make new file mode 100644 index 0000000..3428ac2 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for astcenc-avx2-static. +# This may be replaced when dependencies are built. diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make new file mode 100644 index 0000000..5d258b8 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DASTCENC_AVX=2 -DASTCENC_F16C=1 -DASTCENC_NEON=0 -DASTCENC_POPCNT=1 -DASTCENC_SSE=41 -DASTCENC_SVE=0 -DASTCENC_X86_GATHERS=1 + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=c++14 -fPIC -Wall -Wextra -O3 -ffp-contract=off -pthread -Wpedantic -Werror -Wshadow -Wdouble-promotion -Wno-unknown-warning-option -Wno-c++98-compat-pedantic -Wno-c++98-c++11-compat-pedantic -Wno-float-equal -Wno-deprecated-declarations -Wno-atomic-implicit-seq-cst -Wno-cast-align -Wno-sign-conversion -Wno-implicit-int-conversion -Wno-shift-sign-overflow -Wno-format-nonliteral -Wno-reserved-identifier -Wno-cast-function-type -mavx2 -mpopcnt -mf16c -Wno-unused-command-line-argument + diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/link.txt b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/link.txt new file mode 100644 index 0000000..f9e693b --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libastcenc-avx2-static.a "CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o" "CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o" +/usr/bin/ranlib libastcenc-avx2-static.a diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/progress.make b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/progress.make new file mode 100644 index 0000000..3a9dba9 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/progress.make @@ -0,0 +1,24 @@ +CMAKE_PROGRESS_1 = 3 +CMAKE_PROGRESS_2 = +CMAKE_PROGRESS_3 = 4 +CMAKE_PROGRESS_4 = +CMAKE_PROGRESS_5 = 5 +CMAKE_PROGRESS_6 = 6 +CMAKE_PROGRESS_7 = +CMAKE_PROGRESS_8 = 7 +CMAKE_PROGRESS_9 = +CMAKE_PROGRESS_10 = 8 +CMAKE_PROGRESS_11 = +CMAKE_PROGRESS_12 = 9 +CMAKE_PROGRESS_13 = +CMAKE_PROGRESS_14 = 10 +CMAKE_PROGRESS_15 = +CMAKE_PROGRESS_16 = 11 +CMAKE_PROGRESS_17 = 12 +CMAKE_PROGRESS_18 = +CMAKE_PROGRESS_19 = 13 +CMAKE_PROGRESS_20 = +CMAKE_PROGRESS_21 = 14 +CMAKE_PROGRESS_22 = +CMAKE_PROGRESS_23 = 15 + diff --git a/ktx/build/external/astc-encoder/Source/CMakeFiles/progress.marks b/ktx/build/external/astc-encoder/Source/CMakeFiles/progress.marks new file mode 100644 index 0000000..b1bd38b --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CMakeFiles/progress.marks @@ -0,0 +1 @@ +13 diff --git a/ktx/build/external/astc-encoder/Source/CTestTestfile.cmake b/ktx/build/external/astc-encoder/Source/CTestTestfile.cmake new file mode 100644 index 0000000..55900b3 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/external/astc-encoder/Source/Makefile b/ktx/build/external/astc-encoder/Source/Makefile new file mode 100644 index 0000000..0a2ad96 --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/Makefile @@ -0,0 +1,831 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/astc-encoder/Source/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/astc-encoder/Source/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/astc-encoder/Source/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/astc-encoder/Source/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/rule +.PHONY : external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/rule + +# Convenience name for target. +astcenc-avx2-static: external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/rule +.PHONY : astcenc-avx2-static + +# fast build rule for target. +astcenc-avx2-static/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build +.PHONY : astcenc-avx2-static/fast + +astcenc_averages_and_directions.o: astcenc_averages_and_directions.cpp.o +.PHONY : astcenc_averages_and_directions.o + +# target to build an object file +astcenc_averages_and_directions.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.o +.PHONY : astcenc_averages_and_directions.cpp.o + +astcenc_averages_and_directions.i: astcenc_averages_and_directions.cpp.i +.PHONY : astcenc_averages_and_directions.i + +# target to preprocess a source file +astcenc_averages_and_directions.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.i +.PHONY : astcenc_averages_and_directions.cpp.i + +astcenc_averages_and_directions.s: astcenc_averages_and_directions.cpp.s +.PHONY : astcenc_averages_and_directions.s + +# target to generate assembly for a file +astcenc_averages_and_directions.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_averages_and_directions.cpp.s +.PHONY : astcenc_averages_and_directions.cpp.s + +astcenc_block_sizes.o: astcenc_block_sizes.cpp.o +.PHONY : astcenc_block_sizes.o + +# target to build an object file +astcenc_block_sizes.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.o +.PHONY : astcenc_block_sizes.cpp.o + +astcenc_block_sizes.i: astcenc_block_sizes.cpp.i +.PHONY : astcenc_block_sizes.i + +# target to preprocess a source file +astcenc_block_sizes.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.i +.PHONY : astcenc_block_sizes.cpp.i + +astcenc_block_sizes.s: astcenc_block_sizes.cpp.s +.PHONY : astcenc_block_sizes.s + +# target to generate assembly for a file +astcenc_block_sizes.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_block_sizes.cpp.s +.PHONY : astcenc_block_sizes.cpp.s + +astcenc_color_quantize.o: astcenc_color_quantize.cpp.o +.PHONY : astcenc_color_quantize.o + +# target to build an object file +astcenc_color_quantize.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.o +.PHONY : astcenc_color_quantize.cpp.o + +astcenc_color_quantize.i: astcenc_color_quantize.cpp.i +.PHONY : astcenc_color_quantize.i + +# target to preprocess a source file +astcenc_color_quantize.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.i +.PHONY : astcenc_color_quantize.cpp.i + +astcenc_color_quantize.s: astcenc_color_quantize.cpp.s +.PHONY : astcenc_color_quantize.s + +# target to generate assembly for a file +astcenc_color_quantize.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_quantize.cpp.s +.PHONY : astcenc_color_quantize.cpp.s + +astcenc_color_unquantize.o: astcenc_color_unquantize.cpp.o +.PHONY : astcenc_color_unquantize.o + +# target to build an object file +astcenc_color_unquantize.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.o +.PHONY : astcenc_color_unquantize.cpp.o + +astcenc_color_unquantize.i: astcenc_color_unquantize.cpp.i +.PHONY : astcenc_color_unquantize.i + +# target to preprocess a source file +astcenc_color_unquantize.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.i +.PHONY : astcenc_color_unquantize.cpp.i + +astcenc_color_unquantize.s: astcenc_color_unquantize.cpp.s +.PHONY : astcenc_color_unquantize.s + +# target to generate assembly for a file +astcenc_color_unquantize.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_color_unquantize.cpp.s +.PHONY : astcenc_color_unquantize.cpp.s + +astcenc_compress_symbolic.o: astcenc_compress_symbolic.cpp.o +.PHONY : astcenc_compress_symbolic.o + +# target to build an object file +astcenc_compress_symbolic.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.o +.PHONY : astcenc_compress_symbolic.cpp.o + +astcenc_compress_symbolic.i: astcenc_compress_symbolic.cpp.i +.PHONY : astcenc_compress_symbolic.i + +# target to preprocess a source file +astcenc_compress_symbolic.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.i +.PHONY : astcenc_compress_symbolic.cpp.i + +astcenc_compress_symbolic.s: astcenc_compress_symbolic.cpp.s +.PHONY : astcenc_compress_symbolic.s + +# target to generate assembly for a file +astcenc_compress_symbolic.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compress_symbolic.cpp.s +.PHONY : astcenc_compress_symbolic.cpp.s + +astcenc_compute_variance.o: astcenc_compute_variance.cpp.o +.PHONY : astcenc_compute_variance.o + +# target to build an object file +astcenc_compute_variance.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.o +.PHONY : astcenc_compute_variance.cpp.o + +astcenc_compute_variance.i: astcenc_compute_variance.cpp.i +.PHONY : astcenc_compute_variance.i + +# target to preprocess a source file +astcenc_compute_variance.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.i +.PHONY : astcenc_compute_variance.cpp.i + +astcenc_compute_variance.s: astcenc_compute_variance.cpp.s +.PHONY : astcenc_compute_variance.s + +# target to generate assembly for a file +astcenc_compute_variance.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_compute_variance.cpp.s +.PHONY : astcenc_compute_variance.cpp.s + +astcenc_decompress_symbolic.o: astcenc_decompress_symbolic.cpp.o +.PHONY : astcenc_decompress_symbolic.o + +# target to build an object file +astcenc_decompress_symbolic.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.o +.PHONY : astcenc_decompress_symbolic.cpp.o + +astcenc_decompress_symbolic.i: astcenc_decompress_symbolic.cpp.i +.PHONY : astcenc_decompress_symbolic.i + +# target to preprocess a source file +astcenc_decompress_symbolic.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.i +.PHONY : astcenc_decompress_symbolic.cpp.i + +astcenc_decompress_symbolic.s: astcenc_decompress_symbolic.cpp.s +.PHONY : astcenc_decompress_symbolic.s + +# target to generate assembly for a file +astcenc_decompress_symbolic.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_decompress_symbolic.cpp.s +.PHONY : astcenc_decompress_symbolic.cpp.s + +astcenc_diagnostic_trace.o: astcenc_diagnostic_trace.cpp.o +.PHONY : astcenc_diagnostic_trace.o + +# target to build an object file +astcenc_diagnostic_trace.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.o +.PHONY : astcenc_diagnostic_trace.cpp.o + +astcenc_diagnostic_trace.i: astcenc_diagnostic_trace.cpp.i +.PHONY : astcenc_diagnostic_trace.i + +# target to preprocess a source file +astcenc_diagnostic_trace.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.i +.PHONY : astcenc_diagnostic_trace.cpp.i + +astcenc_diagnostic_trace.s: astcenc_diagnostic_trace.cpp.s +.PHONY : astcenc_diagnostic_trace.s + +# target to generate assembly for a file +astcenc_diagnostic_trace.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_diagnostic_trace.cpp.s +.PHONY : astcenc_diagnostic_trace.cpp.s + +astcenc_entry.o: astcenc_entry.cpp.o +.PHONY : astcenc_entry.o + +# target to build an object file +astcenc_entry.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.o +.PHONY : astcenc_entry.cpp.o + +astcenc_entry.i: astcenc_entry.cpp.i +.PHONY : astcenc_entry.i + +# target to preprocess a source file +astcenc_entry.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.i +.PHONY : astcenc_entry.cpp.i + +astcenc_entry.s: astcenc_entry.cpp.s +.PHONY : astcenc_entry.s + +# target to generate assembly for a file +astcenc_entry.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_entry.cpp.s +.PHONY : astcenc_entry.cpp.s + +astcenc_find_best_partitioning.o: astcenc_find_best_partitioning.cpp.o +.PHONY : astcenc_find_best_partitioning.o + +# target to build an object file +astcenc_find_best_partitioning.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.o +.PHONY : astcenc_find_best_partitioning.cpp.o + +astcenc_find_best_partitioning.i: astcenc_find_best_partitioning.cpp.i +.PHONY : astcenc_find_best_partitioning.i + +# target to preprocess a source file +astcenc_find_best_partitioning.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.i +.PHONY : astcenc_find_best_partitioning.cpp.i + +astcenc_find_best_partitioning.s: astcenc_find_best_partitioning.cpp.s +.PHONY : astcenc_find_best_partitioning.s + +# target to generate assembly for a file +astcenc_find_best_partitioning.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_find_best_partitioning.cpp.s +.PHONY : astcenc_find_best_partitioning.cpp.s + +astcenc_ideal_endpoints_and_weights.o: astcenc_ideal_endpoints_and_weights.cpp.o +.PHONY : astcenc_ideal_endpoints_and_weights.o + +# target to build an object file +astcenc_ideal_endpoints_and_weights.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.o +.PHONY : astcenc_ideal_endpoints_and_weights.cpp.o + +astcenc_ideal_endpoints_and_weights.i: astcenc_ideal_endpoints_and_weights.cpp.i +.PHONY : astcenc_ideal_endpoints_and_weights.i + +# target to preprocess a source file +astcenc_ideal_endpoints_and_weights.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.i +.PHONY : astcenc_ideal_endpoints_and_weights.cpp.i + +astcenc_ideal_endpoints_and_weights.s: astcenc_ideal_endpoints_and_weights.cpp.s +.PHONY : astcenc_ideal_endpoints_and_weights.s + +# target to generate assembly for a file +astcenc_ideal_endpoints_and_weights.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_ideal_endpoints_and_weights.cpp.s +.PHONY : astcenc_ideal_endpoints_and_weights.cpp.s + +astcenc_image.o: astcenc_image.cpp.o +.PHONY : astcenc_image.o + +# target to build an object file +astcenc_image.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.o +.PHONY : astcenc_image.cpp.o + +astcenc_image.i: astcenc_image.cpp.i +.PHONY : astcenc_image.i + +# target to preprocess a source file +astcenc_image.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.i +.PHONY : astcenc_image.cpp.i + +astcenc_image.s: astcenc_image.cpp.s +.PHONY : astcenc_image.s + +# target to generate assembly for a file +astcenc_image.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_image.cpp.s +.PHONY : astcenc_image.cpp.s + +astcenc_integer_sequence.o: astcenc_integer_sequence.cpp.o +.PHONY : astcenc_integer_sequence.o + +# target to build an object file +astcenc_integer_sequence.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.o +.PHONY : astcenc_integer_sequence.cpp.o + +astcenc_integer_sequence.i: astcenc_integer_sequence.cpp.i +.PHONY : astcenc_integer_sequence.i + +# target to preprocess a source file +astcenc_integer_sequence.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.i +.PHONY : astcenc_integer_sequence.cpp.i + +astcenc_integer_sequence.s: astcenc_integer_sequence.cpp.s +.PHONY : astcenc_integer_sequence.s + +# target to generate assembly for a file +astcenc_integer_sequence.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_integer_sequence.cpp.s +.PHONY : astcenc_integer_sequence.cpp.s + +astcenc_mathlib.o: astcenc_mathlib.cpp.o +.PHONY : astcenc_mathlib.o + +# target to build an object file +astcenc_mathlib.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.o +.PHONY : astcenc_mathlib.cpp.o + +astcenc_mathlib.i: astcenc_mathlib.cpp.i +.PHONY : astcenc_mathlib.i + +# target to preprocess a source file +astcenc_mathlib.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.i +.PHONY : astcenc_mathlib.cpp.i + +astcenc_mathlib.s: astcenc_mathlib.cpp.s +.PHONY : astcenc_mathlib.s + +# target to generate assembly for a file +astcenc_mathlib.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib.cpp.s +.PHONY : astcenc_mathlib.cpp.s + +astcenc_mathlib_softfloat.o: astcenc_mathlib_softfloat.cpp.o +.PHONY : astcenc_mathlib_softfloat.o + +# target to build an object file +astcenc_mathlib_softfloat.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.o +.PHONY : astcenc_mathlib_softfloat.cpp.o + +astcenc_mathlib_softfloat.i: astcenc_mathlib_softfloat.cpp.i +.PHONY : astcenc_mathlib_softfloat.i + +# target to preprocess a source file +astcenc_mathlib_softfloat.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.i +.PHONY : astcenc_mathlib_softfloat.cpp.i + +astcenc_mathlib_softfloat.s: astcenc_mathlib_softfloat.cpp.s +.PHONY : astcenc_mathlib_softfloat.s + +# target to generate assembly for a file +astcenc_mathlib_softfloat.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_mathlib_softfloat.cpp.s +.PHONY : astcenc_mathlib_softfloat.cpp.s + +astcenc_partition_tables.o: astcenc_partition_tables.cpp.o +.PHONY : astcenc_partition_tables.o + +# target to build an object file +astcenc_partition_tables.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.o +.PHONY : astcenc_partition_tables.cpp.o + +astcenc_partition_tables.i: astcenc_partition_tables.cpp.i +.PHONY : astcenc_partition_tables.i + +# target to preprocess a source file +astcenc_partition_tables.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.i +.PHONY : astcenc_partition_tables.cpp.i + +astcenc_partition_tables.s: astcenc_partition_tables.cpp.s +.PHONY : astcenc_partition_tables.s + +# target to generate assembly for a file +astcenc_partition_tables.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_partition_tables.cpp.s +.PHONY : astcenc_partition_tables.cpp.s + +astcenc_percentile_tables.o: astcenc_percentile_tables.cpp.o +.PHONY : astcenc_percentile_tables.o + +# target to build an object file +astcenc_percentile_tables.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.o +.PHONY : astcenc_percentile_tables.cpp.o + +astcenc_percentile_tables.i: astcenc_percentile_tables.cpp.i +.PHONY : astcenc_percentile_tables.i + +# target to preprocess a source file +astcenc_percentile_tables.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.i +.PHONY : astcenc_percentile_tables.cpp.i + +astcenc_percentile_tables.s: astcenc_percentile_tables.cpp.s +.PHONY : astcenc_percentile_tables.s + +# target to generate assembly for a file +astcenc_percentile_tables.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_percentile_tables.cpp.s +.PHONY : astcenc_percentile_tables.cpp.s + +astcenc_pick_best_endpoint_format.o: astcenc_pick_best_endpoint_format.cpp.o +.PHONY : astcenc_pick_best_endpoint_format.o + +# target to build an object file +astcenc_pick_best_endpoint_format.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.o +.PHONY : astcenc_pick_best_endpoint_format.cpp.o + +astcenc_pick_best_endpoint_format.i: astcenc_pick_best_endpoint_format.cpp.i +.PHONY : astcenc_pick_best_endpoint_format.i + +# target to preprocess a source file +astcenc_pick_best_endpoint_format.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.i +.PHONY : astcenc_pick_best_endpoint_format.cpp.i + +astcenc_pick_best_endpoint_format.s: astcenc_pick_best_endpoint_format.cpp.s +.PHONY : astcenc_pick_best_endpoint_format.s + +# target to generate assembly for a file +astcenc_pick_best_endpoint_format.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_pick_best_endpoint_format.cpp.s +.PHONY : astcenc_pick_best_endpoint_format.cpp.s + +astcenc_quantization.o: astcenc_quantization.cpp.o +.PHONY : astcenc_quantization.o + +# target to build an object file +astcenc_quantization.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.o +.PHONY : astcenc_quantization.cpp.o + +astcenc_quantization.i: astcenc_quantization.cpp.i +.PHONY : astcenc_quantization.i + +# target to preprocess a source file +astcenc_quantization.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.i +.PHONY : astcenc_quantization.cpp.i + +astcenc_quantization.s: astcenc_quantization.cpp.s +.PHONY : astcenc_quantization.s + +# target to generate assembly for a file +astcenc_quantization.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_quantization.cpp.s +.PHONY : astcenc_quantization.cpp.s + +astcenc_symbolic_physical.o: astcenc_symbolic_physical.cpp.o +.PHONY : astcenc_symbolic_physical.o + +# target to build an object file +astcenc_symbolic_physical.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.o +.PHONY : astcenc_symbolic_physical.cpp.o + +astcenc_symbolic_physical.i: astcenc_symbolic_physical.cpp.i +.PHONY : astcenc_symbolic_physical.i + +# target to preprocess a source file +astcenc_symbolic_physical.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.i +.PHONY : astcenc_symbolic_physical.cpp.i + +astcenc_symbolic_physical.s: astcenc_symbolic_physical.cpp.s +.PHONY : astcenc_symbolic_physical.s + +# target to generate assembly for a file +astcenc_symbolic_physical.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_symbolic_physical.cpp.s +.PHONY : astcenc_symbolic_physical.cpp.s + +astcenc_weight_align.o: astcenc_weight_align.cpp.o +.PHONY : astcenc_weight_align.o + +# target to build an object file +astcenc_weight_align.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.o +.PHONY : astcenc_weight_align.cpp.o + +astcenc_weight_align.i: astcenc_weight_align.cpp.i +.PHONY : astcenc_weight_align.i + +# target to preprocess a source file +astcenc_weight_align.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.i +.PHONY : astcenc_weight_align.cpp.i + +astcenc_weight_align.s: astcenc_weight_align.cpp.s +.PHONY : astcenc_weight_align.s + +# target to generate assembly for a file +astcenc_weight_align.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_align.cpp.s +.PHONY : astcenc_weight_align.cpp.s + +astcenc_weight_quant_xfer_tables.o: astcenc_weight_quant_xfer_tables.cpp.o +.PHONY : astcenc_weight_quant_xfer_tables.o + +# target to build an object file +astcenc_weight_quant_xfer_tables.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.o +.PHONY : astcenc_weight_quant_xfer_tables.cpp.o + +astcenc_weight_quant_xfer_tables.i: astcenc_weight_quant_xfer_tables.cpp.i +.PHONY : astcenc_weight_quant_xfer_tables.i + +# target to preprocess a source file +astcenc_weight_quant_xfer_tables.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.i +.PHONY : astcenc_weight_quant_xfer_tables.cpp.i + +astcenc_weight_quant_xfer_tables.s: astcenc_weight_quant_xfer_tables.cpp.s +.PHONY : astcenc_weight_quant_xfer_tables.s + +# target to generate assembly for a file +astcenc_weight_quant_xfer_tables.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/build.make external/astc-encoder/Source/CMakeFiles/astcenc-avx2-static.dir/astcenc_weight_quant_xfer_tables.cpp.s +.PHONY : astcenc_weight_quant_xfer_tables.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... astcenc-avx2-static" + @echo "... astcenc_averages_and_directions.o" + @echo "... astcenc_averages_and_directions.i" + @echo "... astcenc_averages_and_directions.s" + @echo "... astcenc_block_sizes.o" + @echo "... astcenc_block_sizes.i" + @echo "... astcenc_block_sizes.s" + @echo "... astcenc_color_quantize.o" + @echo "... astcenc_color_quantize.i" + @echo "... astcenc_color_quantize.s" + @echo "... astcenc_color_unquantize.o" + @echo "... astcenc_color_unquantize.i" + @echo "... astcenc_color_unquantize.s" + @echo "... astcenc_compress_symbolic.o" + @echo "... astcenc_compress_symbolic.i" + @echo "... astcenc_compress_symbolic.s" + @echo "... astcenc_compute_variance.o" + @echo "... astcenc_compute_variance.i" + @echo "... astcenc_compute_variance.s" + @echo "... astcenc_decompress_symbolic.o" + @echo "... astcenc_decompress_symbolic.i" + @echo "... astcenc_decompress_symbolic.s" + @echo "... astcenc_diagnostic_trace.o" + @echo "... astcenc_diagnostic_trace.i" + @echo "... astcenc_diagnostic_trace.s" + @echo "... astcenc_entry.o" + @echo "... astcenc_entry.i" + @echo "... astcenc_entry.s" + @echo "... astcenc_find_best_partitioning.o" + @echo "... astcenc_find_best_partitioning.i" + @echo "... astcenc_find_best_partitioning.s" + @echo "... astcenc_ideal_endpoints_and_weights.o" + @echo "... astcenc_ideal_endpoints_and_weights.i" + @echo "... astcenc_ideal_endpoints_and_weights.s" + @echo "... astcenc_image.o" + @echo "... astcenc_image.i" + @echo "... astcenc_image.s" + @echo "... astcenc_integer_sequence.o" + @echo "... astcenc_integer_sequence.i" + @echo "... astcenc_integer_sequence.s" + @echo "... astcenc_mathlib.o" + @echo "... astcenc_mathlib.i" + @echo "... astcenc_mathlib.s" + @echo "... astcenc_mathlib_softfloat.o" + @echo "... astcenc_mathlib_softfloat.i" + @echo "... astcenc_mathlib_softfloat.s" + @echo "... astcenc_partition_tables.o" + @echo "... astcenc_partition_tables.i" + @echo "... astcenc_partition_tables.s" + @echo "... astcenc_percentile_tables.o" + @echo "... astcenc_percentile_tables.i" + @echo "... astcenc_percentile_tables.s" + @echo "... astcenc_pick_best_endpoint_format.o" + @echo "... astcenc_pick_best_endpoint_format.i" + @echo "... astcenc_pick_best_endpoint_format.s" + @echo "... astcenc_quantization.o" + @echo "... astcenc_quantization.i" + @echo "... astcenc_quantization.s" + @echo "... astcenc_symbolic_physical.o" + @echo "... astcenc_symbolic_physical.i" + @echo "... astcenc_symbolic_physical.s" + @echo "... astcenc_weight_align.o" + @echo "... astcenc_weight_align.i" + @echo "... astcenc_weight_align.s" + @echo "... astcenc_weight_quant_xfer_tables.o" + @echo "... astcenc_weight_quant_xfer_tables.i" + @echo "... astcenc_weight_quant_xfer_tables.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/external/astc-encoder/Source/cmake_install.cmake b/ktx/build/external/astc-encoder/Source/cmake_install.cmake new file mode 100644 index 0000000..133ca4d --- /dev/null +++ b/ktx/build/external/astc-encoder/Source/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/external/astc-encoder/Source/libastcenc-avx2-static.a b/ktx/build/external/astc-encoder/Source/libastcenc-avx2-static.a new file mode 100644 index 0000000..eeb8e59 Binary files /dev/null and b/ktx/build/external/astc-encoder/Source/libastcenc-avx2-static.a differ diff --git a/ktx/build/external/astc-encoder/cmake_install.cmake b/ktx/build/external/astc-encoder/cmake_install.cmake new file mode 100644 index 0000000..085404d --- /dev/null +++ b/ktx/build/external/astc-encoder/cmake_install.cmake @@ -0,0 +1,55 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/cmake_install.cmake") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/external/cxxopts/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/external/cxxopts/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/external/cxxopts/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/external/cxxopts/CMakeFiles/progress.marks b/ktx/build/external/cxxopts/CMakeFiles/progress.marks new file mode 100644 index 0000000..573541a --- /dev/null +++ b/ktx/build/external/cxxopts/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/ktx/build/external/cxxopts/CTestTestfile.cmake b/ktx/build/external/cxxopts/CTestTestfile.cmake new file mode 100644 index 0000000..9ba6cdd --- /dev/null +++ b/ktx/build/external/cxxopts/CTestTestfile.cmake @@ -0,0 +1,7 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs("include") diff --git a/ktx/build/external/cxxopts/Makefile b/ktx/build/external/cxxopts/Makefile new file mode 100644 index 0000000..5f91091 --- /dev/null +++ b/ktx/build/external/cxxopts/Makefile @@ -0,0 +1,222 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/cxxopts/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/cxxopts/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/cxxopts/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/cxxopts/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/external/cxxopts/cmake_install.cmake b/ktx/build/external/cxxopts/cmake_install.cmake new file mode 100644 index 0000000..4945c3a --- /dev/null +++ b/ktx/build/external/cxxopts/cmake_install.cmake @@ -0,0 +1,55 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include/cmake_install.cmake") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/external/cxxopts/include/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/external/cxxopts/include/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/external/cxxopts/include/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/external/cxxopts/include/CMakeFiles/progress.marks b/ktx/build/external/cxxopts/include/CMakeFiles/progress.marks new file mode 100644 index 0000000..573541a --- /dev/null +++ b/ktx/build/external/cxxopts/include/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/ktx/build/external/cxxopts/include/CTestTestfile.cmake b/ktx/build/external/cxxopts/include/CTestTestfile.cmake new file mode 100644 index 0000000..b798628 --- /dev/null +++ b/ktx/build/external/cxxopts/include/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/external/cxxopts/include/Makefile b/ktx/build/external/cxxopts/include/Makefile new file mode 100644 index 0000000..9090611 --- /dev/null +++ b/ktx/build/external/cxxopts/include/Makefile @@ -0,0 +1,222 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/cxxopts/include/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/cxxopts/include/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/cxxopts/include/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/cxxopts/include/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/external/cxxopts/include/cmake_install.cmake b/ktx/build/external/cxxopts/include/cmake_install.cmake new file mode 100644 index 0000000..ff18fc8 --- /dev/null +++ b/ktx/build/external/cxxopts/include/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/cxxopts/include/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/external/fmt/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/external/fmt/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/DependInfo.cmake b/ktx/build/external/fmt/CMakeFiles/fmt.dir/DependInfo.cmake new file mode 100644 index 0000000..99c1c9f --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/DependInfo.cmake @@ -0,0 +1,24 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/format.cc" "external/fmt/CMakeFiles/fmt.dir/src/format.cc.o" "gcc" "external/fmt/CMakeFiles/fmt.dir/src/format.cc.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/os.cc" "external/fmt/CMakeFiles/fmt.dir/src/os.cc.o" "gcc" "external/fmt/CMakeFiles/fmt.dir/src/os.cc.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/build.make b/ktx/build/external/fmt/CMakeFiles/fmt.dir/build.make new file mode 100644 index 0000000..9ad32c0 --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/build.make @@ -0,0 +1,130 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include external/fmt/CMakeFiles/fmt.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include external/fmt/CMakeFiles/fmt.dir/compiler_depend.make + +# Include the progress variables for this target. +include external/fmt/CMakeFiles/fmt.dir/progress.make + +# Include the compile flags for this target's objects. +include external/fmt/CMakeFiles/fmt.dir/flags.make + +external/fmt/CMakeFiles/fmt.dir/codegen: +.PHONY : external/fmt/CMakeFiles/fmt.dir/codegen + +external/fmt/CMakeFiles/fmt.dir/src/format.cc.o: external/fmt/CMakeFiles/fmt.dir/flags.make +external/fmt/CMakeFiles/fmt.dir/src/format.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/format.cc +external/fmt/CMakeFiles/fmt.dir/src/format.cc.o: external/fmt/CMakeFiles/fmt.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object external/fmt/CMakeFiles/fmt.dir/src/format.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/fmt/CMakeFiles/fmt.dir/src/format.cc.o -MF CMakeFiles/fmt.dir/src/format.cc.o.d -o CMakeFiles/fmt.dir/src/format.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/format.cc + +external/fmt/CMakeFiles/fmt.dir/src/format.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/fmt.dir/src/format.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/format.cc > CMakeFiles/fmt.dir/src/format.cc.i + +external/fmt/CMakeFiles/fmt.dir/src/format.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/fmt.dir/src/format.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/format.cc -o CMakeFiles/fmt.dir/src/format.cc.s + +external/fmt/CMakeFiles/fmt.dir/src/os.cc.o: external/fmt/CMakeFiles/fmt.dir/flags.make +external/fmt/CMakeFiles/fmt.dir/src/os.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/os.cc +external/fmt/CMakeFiles/fmt.dir/src/os.cc.o: external/fmt/CMakeFiles/fmt.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object external/fmt/CMakeFiles/fmt.dir/src/os.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT external/fmt/CMakeFiles/fmt.dir/src/os.cc.o -MF CMakeFiles/fmt.dir/src/os.cc.o.d -o CMakeFiles/fmt.dir/src/os.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/os.cc + +external/fmt/CMakeFiles/fmt.dir/src/os.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/fmt.dir/src/os.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/os.cc > CMakeFiles/fmt.dir/src/os.cc.i + +external/fmt/CMakeFiles/fmt.dir/src/os.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/fmt.dir/src/os.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/os.cc -o CMakeFiles/fmt.dir/src/os.cc.s + +# Object files for target fmt +fmt_OBJECTS = \ +"CMakeFiles/fmt.dir/src/format.cc.o" \ +"CMakeFiles/fmt.dir/src/os.cc.o" + +# External object files for target fmt +fmt_EXTERNAL_OBJECTS = + +external/fmt/libfmt.a: external/fmt/CMakeFiles/fmt.dir/src/format.cc.o +external/fmt/libfmt.a: external/fmt/CMakeFiles/fmt.dir/src/os.cc.o +external/fmt/libfmt.a: external/fmt/CMakeFiles/fmt.dir/build.make +external/fmt/libfmt.a: external/fmt/CMakeFiles/fmt.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Linking CXX static library libfmt.a" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt && $(CMAKE_COMMAND) -P CMakeFiles/fmt.dir/cmake_clean_target.cmake + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/fmt.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +external/fmt/CMakeFiles/fmt.dir/build: external/fmt/libfmt.a +.PHONY : external/fmt/CMakeFiles/fmt.dir/build + +external/fmt/CMakeFiles/fmt.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt && $(CMAKE_COMMAND) -P CMakeFiles/fmt.dir/cmake_clean.cmake +.PHONY : external/fmt/CMakeFiles/fmt.dir/clean + +external/fmt/CMakeFiles/fmt.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/CMakeFiles/fmt.dir/DependInfo.cmake "--color=$(COLOR)" fmt +.PHONY : external/fmt/CMakeFiles/fmt.dir/depend + diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/cmake_clean.cmake b/ktx/build/external/fmt/CMakeFiles/fmt.dir/cmake_clean.cmake new file mode 100644 index 0000000..73e5979 --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/cmake_clean.cmake @@ -0,0 +1,13 @@ +file(REMOVE_RECURSE + "CMakeFiles/fmt.dir/src/format.cc.o" + "CMakeFiles/fmt.dir/src/format.cc.o.d" + "CMakeFiles/fmt.dir/src/os.cc.o" + "CMakeFiles/fmt.dir/src/os.cc.o.d" + "libfmt.a" + "libfmt.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/fmt.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/cmake_clean_target.cmake b/ktx/build/external/fmt/CMakeFiles/fmt.dir/cmake_clean_target.cmake new file mode 100644 index 0000000..b975c95 --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libfmt.a" +) diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/compiler_depend.internal b/ktx/build/external/fmt/CMakeFiles/fmt.dir/compiler_depend.internal new file mode 100644 index 0000000..f51136f --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/compiler_depend.internal @@ -0,0 +1,508 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +external/fmt/CMakeFiles/fmt.dir/src/format.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/format.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format-inl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +external/fmt/CMakeFiles/fmt.dir/src/os.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/os.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/os.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stat.h + /usr/include/bits/statx-generic.h + /usr/include/bits/statx.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_statx.h + /usr/include/bits/types/struct_statx_timestamp.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/stat.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/stat.h + /usr/include/sys/types.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/compiler_depend.make b/ktx/build/external/fmt/CMakeFiles/fmt.dir/compiler_depend.make new file mode 100644 index 0000000..39b0161 --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/compiler_depend.make @@ -0,0 +1,1084 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +external/fmt/CMakeFiles/fmt.dir/src/format.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/format.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format-inl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +external/fmt/CMakeFiles/fmt.dir/src/os.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/os.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/os.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/statx.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_statx.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/stat.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/stat.h \ + /usr/include/sys/types.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + + +/usr/include/unistd.h: + +/usr/include/sys/stat.h: + +/usr/include/linux/stat.h: + +/usr/include/fcntl.h: + +/usr/include/linux/falloc.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/bits/types/struct_statx_timestamp.h: + +/usr/include/bits/types/struct_statx.h: + +/usr/include/bits/types/struct_iovec.h: + +/usr/include/bits/statx.h: + +/usr/include/bits/stat.h: + +/usr/include/bits/posix_opt.h: + +/usr/include/bits/openat2.h: + +/usr/include/bits/getopt_core.h: + +/usr/include/bits/fcntl-linux.h: + +/usr/include/bits/confname.h: + +/usr/include/bits/cloexec.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/os.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/bits/types/clock_t.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/statx-generic.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/sys/types.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/include/bits/timesize.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/wchar.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h: + +/usr/include/bits/waitflags.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/types/__locale_t.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/gnu/stubs.h: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/bits/types.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/bits/errno.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/bits/local_lim.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/linux/openat2.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/bits/typesizes.h: + +/usr/include/bits/cpu-set.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/bits/byteswap.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/asm/posix_types_64.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/bits/fp-logb.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/bits/long-double.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/usr/include/bits/mathcalls-macros.h: + +/usr/include/asm-generic/int-ll64.h: + +/usr/include/bits/posix2_lim.h: + +/usr/include/bits/mathcalls.h: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/exception: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/bits/endianness.h: + +/usr/include/libintl.h: + +/usr/include/bits/libc-header-start.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/bits/math-vector.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/bits/environments.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/asm/types.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/format.cc: + +/usr/include/bits/stdint-least.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/asm-generic/types.h: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/bits/floatn.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/bits/iscanonical.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/c++/16.1.1/algorithm: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/include/string.h: + +/usr/include/bits/types/timer_t.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/mathcalls-narrow.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/alloca.h: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/bits/select.h: + +/usr/include/bits/setjmp.h: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/bit: + +/usr/include/bits/types/FILE.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format-inl.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/error_t.h: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/features.h: + +/usr/include/bits/sched.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/asm/errno.h: + +/usr/include/bits/endian.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/bits/struct_stat.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/bits/fcntl.h: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/strings.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/usr/include/c++/16.1.1/cstring: + +/usr/include/sys/select.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/climits: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/bits/wordsize.h: + +/usr/include/stdio.h: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/bits/specfun.h: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/locale: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/limits.h: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/usr/include/linux/sched/types.h: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/time.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/bits/getopt_posix.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/usr/include/errno.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/include/features-time64.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/usr/include/linux/limits.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/stdint.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/types.h: + +/usr/include/locale.h: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/math.h: + +/usr/include/pthread.h: + +/usr/include/wctype.h: + +/usr/include/bits/fp-fast.h: + +/usr/include/sched.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/os.cc: + +/usr/include/stdlib.h: + +/usr/include/sys/cdefs.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/wchar.h: diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/compiler_depend.ts b/ktx/build/external/fmt/CMakeFiles/fmt.dir/compiler_depend.ts new file mode 100644 index 0000000..4f74151 --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for fmt. diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/depend.make b/ktx/build/external/fmt/CMakeFiles/fmt.dir/depend.make new file mode 100644 index 0000000..012503b --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for fmt. +# This may be replaced when dependencies are built. diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/flags.make b/ktx/build/external/fmt/CMakeFiles/fmt.dir/flags.make new file mode 100644 index 0000000..0f06337 --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = + +CXX_INCLUDES = -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/link.txt b/ktx/build/external/fmt/CMakeFiles/fmt.dir/link.txt new file mode 100644 index 0000000..7f9b909 --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libfmt.a CMakeFiles/fmt.dir/src/format.cc.o CMakeFiles/fmt.dir/src/os.cc.o +/usr/bin/ranlib libfmt.a diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/progress.make b/ktx/build/external/fmt/CMakeFiles/fmt.dir/progress.make new file mode 100644 index 0000000..592d9c8 --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/progress.make @@ -0,0 +1,4 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 16 +CMAKE_PROGRESS_3 = 17 + diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/src/format.cc.o b/ktx/build/external/fmt/CMakeFiles/fmt.dir/src/format.cc.o new file mode 100644 index 0000000..5980237 Binary files /dev/null and b/ktx/build/external/fmt/CMakeFiles/fmt.dir/src/format.cc.o differ diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/src/format.cc.o.d b/ktx/build/external/fmt/CMakeFiles/fmt.dir/src/format.cc.o.d new file mode 100644 index 0000000..0e4384b --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/src/format.cc.o.d @@ -0,0 +1,194 @@ +external/fmt/CMakeFiles/fmt.dir/src/format.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/format.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format-inl.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/climits \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/limits /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/string.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/cstddef /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/cstring /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/src/os.cc.o b/ktx/build/external/fmt/CMakeFiles/fmt.dir/src/os.cc.o new file mode 100644 index 0000000..1b5c0d2 Binary files /dev/null and b/ktx/build/external/fmt/CMakeFiles/fmt.dir/src/os.cc.o differ diff --git a/ktx/build/external/fmt/CMakeFiles/fmt.dir/src/os.cc.o.d b/ktx/build/external/fmt/CMakeFiles/fmt.dir/src/os.cc.o.d new file mode 100644 index 0000000..f3b5f97 --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/fmt.dir/src/os.cc.o.d @@ -0,0 +1,167 @@ +external/fmt/CMakeFiles/fmt.dir/src/os.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/src/os.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/os.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/version.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/cstddef /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/cstring /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/c++/16.1.1/climits \ + /usr/include/sys/stat.h /usr/include/bits/statx.h \ + /usr/include/linux/stat.h /usr/include/bits/statx-generic.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_statx.h /usr/include/unistd.h \ + /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \ + /usr/include/bits/confname.h /usr/include/bits/getopt_posix.h \ + /usr/include/bits/getopt_core.h /usr/include/bits/unistd_ext.h \ + /usr/include/linux/close_range.h diff --git a/ktx/build/external/fmt/CMakeFiles/progress.marks b/ktx/build/external/fmt/CMakeFiles/progress.marks new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/ktx/build/external/fmt/CMakeFiles/progress.marks @@ -0,0 +1 @@ +2 diff --git a/ktx/build/external/fmt/CTestTestfile.cmake b/ktx/build/external/fmt/CTestTestfile.cmake new file mode 100644 index 0000000..63f0d9e --- /dev/null +++ b/ktx/build/external/fmt/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/external/fmt/Makefile b/ktx/build/external/fmt/Makefile new file mode 100644 index 0000000..c5224c0 --- /dev/null +++ b/ktx/build/external/fmt/Makefile @@ -0,0 +1,291 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/fmt/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/fmt/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/fmt/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/fmt/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +external/fmt/CMakeFiles/fmt.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 external/fmt/CMakeFiles/fmt.dir/rule +.PHONY : external/fmt/CMakeFiles/fmt.dir/rule + +# Convenience name for target. +fmt: external/fmt/CMakeFiles/fmt.dir/rule +.PHONY : fmt + +# fast build rule for target. +fmt/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/fmt/CMakeFiles/fmt.dir/build.make external/fmt/CMakeFiles/fmt.dir/build +.PHONY : fmt/fast + +src/format.o: src/format.cc.o +.PHONY : src/format.o + +# target to build an object file +src/format.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/fmt/CMakeFiles/fmt.dir/build.make external/fmt/CMakeFiles/fmt.dir/src/format.cc.o +.PHONY : src/format.cc.o + +src/format.i: src/format.cc.i +.PHONY : src/format.i + +# target to preprocess a source file +src/format.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/fmt/CMakeFiles/fmt.dir/build.make external/fmt/CMakeFiles/fmt.dir/src/format.cc.i +.PHONY : src/format.cc.i + +src/format.s: src/format.cc.s +.PHONY : src/format.s + +# target to generate assembly for a file +src/format.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/fmt/CMakeFiles/fmt.dir/build.make external/fmt/CMakeFiles/fmt.dir/src/format.cc.s +.PHONY : src/format.cc.s + +src/os.o: src/os.cc.o +.PHONY : src/os.o + +# target to build an object file +src/os.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/fmt/CMakeFiles/fmt.dir/build.make external/fmt/CMakeFiles/fmt.dir/src/os.cc.o +.PHONY : src/os.cc.o + +src/os.i: src/os.cc.i +.PHONY : src/os.i + +# target to preprocess a source file +src/os.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/fmt/CMakeFiles/fmt.dir/build.make external/fmt/CMakeFiles/fmt.dir/src/os.cc.i +.PHONY : src/os.cc.i + +src/os.s: src/os.cc.s +.PHONY : src/os.s + +# target to generate assembly for a file +src/os.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f external/fmt/CMakeFiles/fmt.dir/build.make external/fmt/CMakeFiles/fmt.dir/src/os.cc.s +.PHONY : src/os.cc.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... fmt" + @echo "... src/format.o" + @echo "... src/format.i" + @echo "... src/format.s" + @echo "... src/os.o" + @echo "... src/os.i" + @echo "... src/os.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/external/fmt/cmake_install.cmake b/ktx/build/external/fmt/cmake_install.cmake new file mode 100644 index 0000000..2a3e154 --- /dev/null +++ b/ktx/build/external/fmt/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/external/fmt/libfmt.a b/ktx/build/external/fmt/libfmt.a new file mode 100644 index 0000000..f80b86a Binary files /dev/null and b/ktx/build/external/fmt/libfmt.a differ diff --git a/ktx/build/install_manifest.txt b/ktx/build/install_manifest.txt new file mode 100644 index 0000000..9f0f6e6 --- /dev/null +++ b/ktx/build/install_manifest.txt @@ -0,0 +1,506 @@ +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/bin/ktx +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/bin/ktx2check +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/bin/ktx2ktx2 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/bin/ktxinfo +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/bin/ktxsc +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/bin/toktx +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/doxygen_crawl.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/pages.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/navtree.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/menudata.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/navtreedata.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/navtreeindex0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/graph_legend.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/cookie.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/dynsections.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/navtree.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/graph_legend.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/authors.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/doxygen.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_b.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/ktx_8h__dep__incl.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_w.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/ktx_8h__dep__incl.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/doxygen_crawl.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/filestream_8c__incl.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture1.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/ktx_8h__incl.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/pages.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/memstream_8c.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/examples.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/navtree.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/menudata.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/classktxHashList.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_o.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/navtreedata.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/glloader_8c-example.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture__vtbl__coll__graph.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture2.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_c.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxVulkanTexture__subAllocatorCallbacks.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_k.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_func.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/navtreeindex0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxStream__coll__graph.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/globals_type.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9_dep.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/memstream_8c__incl.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxBasisParams.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/graph_legend.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxAstcParams.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxVulkanTexture.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dir_000002_000000.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/group__writer.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_a.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxOrientation.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_s.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/strings_8c__incl.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/cookie.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dynsections.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/navtree.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxVulkanFunctions.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/globals_defs.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/libktx_history.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/group__reader.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/files_dup.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_d.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_dup.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/ktx_8h.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_v.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dir_f488c511561d1779081e43357a44a136_dep.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_h.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_p.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/group__ktx__vkloader.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_f.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/filestream_8c__incl.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTextureCreateInfo.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_q.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture1__coll__graph.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture__coll__graph.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/filestream_8c.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_type.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/filestream_8c.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/files.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/annotated.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9_dep.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/topics.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture1__coll__graph.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_e.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_l.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture2__coll__graph.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/vkload_8cpp-example.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/graph_legend.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture2__coll__graph.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/doxygen.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/group__ktx__glloader.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture2.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTextureCreateInfo.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_x.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/examples.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/strings_8c.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/topics.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxVulkanDeviceInfo__coll__graph.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxVulkanDeviceInfo.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/globals_eval.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/jquery.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/group__writer.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/classktxHashList.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/memstream_8c__incl.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture2__coll__graph.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_vars.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_z.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxStream__coll__graph.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxStream.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_m.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dir_f488c511561d1779081e43357a44a136_dep.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/classktxHashListEntry.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxVulkanDeviceInfo__coll__graph.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/globals.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/strings_8c.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dir_d44c64559bbebec7f509842c48db8b23.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/globals_func.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/ktx_8h__incl.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/filestream_8c__incl.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/memstream_8c__incl.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/tabs.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/doxygen.svg +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxBasisParams.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dir_97aefd0d527b934f1d99a682da8fe6a9_dep.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/memstream_8c.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/classktxHashListEntry.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dir_d44c64559bbebec7f509842c48db8b23.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/ktx_8h.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/group__ktx__vkloader.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/globals_enum.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/navtreeindex1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxVulkanTexture__subAllocatorCallbacks.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dir_f488c511561d1779081e43357a44a136_dep.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/graph_legend.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxVulkanDeviceInfo.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/index.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/classes.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxVulkanTexture.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxStream.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/ktx_8h__dep__incl.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_i.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture__vtbl.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/group__reader.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_g.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture__coll__graph.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_t.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/menu.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/ktx_logo_200.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_y.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/clipboard.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/ktx_8h__incl.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/deprecated.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxAstcParams.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture1__coll__graph.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture__coll__graph.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/strings_8c__incl.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_n.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_r.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/group__ktx__glloader.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxOrientation.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture__vtbl__coll__graph.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/strings_8c__incl.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxStream__coll__graph.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_enum.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/functions_u.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/dir_f488c511561d1779081e43357a44a136.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxTexture__vtbl__coll__graph.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/groups_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_c.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_17.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/groups_4.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_a.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_13.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_11.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_12.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_f.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/typedefs_1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_11.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_3.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_e.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_13.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/classes_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_13.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_4.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_9.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_5.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_16.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_10.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_f.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_7.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_12.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_19.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_17.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_5.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_6.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_1e.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/groups_3.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_c.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_e.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/search.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/enumvalues_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_14.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_10.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_e.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/files_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_1d.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/typedefs_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_8.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/groups_1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_8.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/enums_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_d.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_d.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_14.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_b.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_6.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/files_1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_8.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_14.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_f.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_18.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_c.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_d.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_a.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_b.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_3.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/searchdata.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_6.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_7.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_1b.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_5.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/files_3.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_b.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_4.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_18.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_11.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_1a.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/groups_5.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_3.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_15.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_16.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/files_2.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/defines_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_2.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_2.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_9.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_7.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_19.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_17.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_15.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/search.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_a.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/groups_6.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_16.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_9.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_15.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/functions_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/groups_2.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_1c.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_10.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/variables_12.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/all_2.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/search/pages_4.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/annotated_dup.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/libktx/structktxVulkanDeviceInfo__coll__graph.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/jquery.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771_dep.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx2ktx2.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660_dep.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/doxygen_crawl.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx_transcode.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011_dep.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/pages.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx_deflate.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/navtree.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/menudata.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/navtreedata.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22_dep.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/navtreeindex0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx_help.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771_dep.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/graph_legend.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/cookie.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dynsections.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_f7a03f9c08c5442ecdb55dc480809771_dep.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/navtree.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_4eeb864c4eec08c7d6b9d3b0352cfdde.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8_dep.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660_dep.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/graph_legend.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/doxygen.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx_info.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011_dep.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/jquery.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_a33ac96fab323650bfd87b7a47549660_dep.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktxsc.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8_dep.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx_compare.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/toktx.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx2check.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/tabs.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/doxygen.svg +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx_encode.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/graph_legend.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx_validate.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/index.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22_dep.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b_dep.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktxinfo.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/menu.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx_logo_200.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/clipboard.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx_extract.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_e326a70ec4ca1fd26ce6fd35942b1c22_dep.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_09422af9f6e39cd219a538ae2d9ff0a8_dep.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b_dep.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_49c59200b1838f4c537a92200e5de011_dep.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/ktx_create.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/dir_21a04a93d00272cf501aa9cc1b9ece4b_dep.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_c.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_a.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_f.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_e.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_4.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_9.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_5.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_5.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_c.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/search.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_e.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_8.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_8.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_d.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_b.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_6.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_f.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_d.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_b.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_3.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/searchdata.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_6.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_7.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_3.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_2.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_7.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/search.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_a.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_9.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/all_2.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxtools/search/pages_4.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/tabs.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/doxygen.svg +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/doxygen_crawl.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/pages.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/navtree.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/menudata.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/navtreedata.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/navtreeindex0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/graph_legend.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/cookie.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/dynsections.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e_dep.map +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/navtree.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/msc_basis_transcoder.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/dir_b31d54d5631803016a26f28213a41162.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/graph_legend.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/doxygen.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/jquery.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e_dep.md5 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/tabs.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/doxygen.svg +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/dir_2d084546ff008293419e5a6cd32fb27e_dep.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/graph_legend.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/index.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/libktx_js.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/menu.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/ktx_logo_200.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/clipboard.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_c.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_a.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_13.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_12.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_f.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_11.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_e.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_13.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_4.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_9.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_5.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_12.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_5.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_c.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/search.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_10.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_e.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_8.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_8.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_d.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_b.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_6.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_f.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_d.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_b.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_3.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/searchdata.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_6.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_7.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_11.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_3.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_2.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_7.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/search.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_a.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_9.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_10.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/all_2.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktxjswrappers/search/pages_4.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/graph_legend.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/index.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/menu.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/ktx_logo_200.png +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/clipboard.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/license.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/dir_0eb6c3330d6cb51c55e38234f86914e8.html +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/pages_a.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/all_4.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/all_9.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/all_5.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/pages_1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/pages_5.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/pages_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/search.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/all_8.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/pages_8.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/all_0.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/all_6.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/pages_3.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/searchdata.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/pages_6.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/all_7.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/all_3.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/pages_2.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/pages_7.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/search.css +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/all_a.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/pages_9.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/all_1.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/all_2.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/doc/KTX-Software/html/search/pages_4.js +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/toktx.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktx_help.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktx_transcode.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktx2check.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktxinfo.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktx_validate.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktx_extract.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktx_encode.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktx_deflate.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktx2ktx2.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktx_create.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktx_info.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktx.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktx_compare.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/share/man/man1/ktxsc.1 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/lib/libktx.so.0.0.0 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/lib/libktx.so.0 +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/include/ktx.h +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/include/ktxvulkan.h +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/lib/libktx.so +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/include/KHR/khr_df.h +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/lib/cmake/ktx/KtxTargets.cmake +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/lib/cmake/ktx/KtxTargets-release.cmake +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/lib/cmake/ktx/KtxConfig.cmake +/home/abdelrahman/Sources/programming/how-to-vulkan/vendor/lib/cmake/ktx/KtxConfigVersion.cmake \ No newline at end of file diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/interface/basisu_c_binding/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/DependInfo.cmake b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/DependInfo.cmake new file mode 100644 index 0000000..850ee74 --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/DependInfo.cmake @@ -0,0 +1,23 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/src/basisu_c_binding.cpp" "interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o" "gcc" "interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make new file mode 100644 index 0000000..7d90cac --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make @@ -0,0 +1,114 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/compiler_depend.make + +# Include the progress variables for this target. +include interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/progress.make + +# Include the compile flags for this target's objects. +include interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/flags.make + +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/codegen: +.PHONY : interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/codegen + +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o: interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/flags.make +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/src/basisu_c_binding.cpp +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o: interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o -MF CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o.d -o CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/src/basisu_c_binding.cpp + +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/src/basisu_c_binding.cpp > CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.i + +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/src/basisu_c_binding.cpp -o CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.s + +# Object files for target obj_basisu_cbind +obj_basisu_cbind_OBJECTS = \ +"CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o" + +# External object files for target obj_basisu_cbind +obj_basisu_cbind_EXTERNAL_OBJECTS = + +interface/basisu_c_binding/libobj_basisu_cbind.a: interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o +interface/basisu_c_binding/libobj_basisu_cbind.a: interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make +interface/basisu_c_binding/libobj_basisu_cbind.a: interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX static library libobj_basisu_cbind.a" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding && $(CMAKE_COMMAND) -P CMakeFiles/obj_basisu_cbind.dir/cmake_clean_target.cmake + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/obj_basisu_cbind.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build: interface/basisu_c_binding/libobj_basisu_cbind.a +.PHONY : interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build + +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding && $(CMAKE_COMMAND) -P CMakeFiles/obj_basisu_cbind.dir/cmake_clean.cmake +.PHONY : interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/clean + +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/DependInfo.cmake "--color=$(COLOR)" obj_basisu_cbind +.PHONY : interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/depend + diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/cmake_clean.cmake b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/cmake_clean.cmake new file mode 100644 index 0000000..c46e756 --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o" + "CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o.d" + "libobj_basisu_cbind.a" + "libobj_basisu_cbind.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/obj_basisu_cbind.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/cmake_clean_target.cmake b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/cmake_clean_target.cmake new file mode 100644 index 0000000..0c3bb47 --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libobj_basisu_cbind.a" +) diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/compiler_depend.internal b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/compiler_depend.internal new file mode 100644 index 0000000..81f2275 --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/compiler_depend.internal @@ -0,0 +1,292 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/src/basisu_c_binding.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/inc/basisu_c_binding.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/compiler_depend.make b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/compiler_depend.make new file mode 100644 index 0000000..066b265 --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/compiler_depend.make @@ -0,0 +1,865 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/src/basisu_c_binding.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/inc/basisu_c_binding.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/include/time.h: + +/usr/include/sys/types.h: + +/usr/include/sys/select.h: + +/usr/include/sys/cdefs.h: + +/usr/include/string.h: + +/usr/include/stdlib.h: + +/usr/include/pthread.h: + +/usr/include/memory.h: + +/usr/include/malloc.h: + +/usr/include/locale.h: + +/usr/include/linux/types.h: + +/usr/include/bits/types/clock_t.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/random: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/bits/timesize.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/bits/waitflags.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/gnu/stubs.h: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/bits/types.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/bits/errno.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/c++/16.1.1/bits/hashtable.h: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/bits/local_lim.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h: + +/usr/include/c++/16.1.1/pstl/glue_numeric_defs.h: + +/usr/include/bits/typesizes.h: + +/usr/include/bits/cpu-set.h: + +/usr/include/bits/byteswap.h: + +/usr/include/c++/16.1.1/algorithm: + +/usr/include/asm-generic/int-ll64.h: + +/usr/include/bits/mathcalls-macros.h: + +/usr/include/asm/posix_types_64.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/struct_tm.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h: + +/usr/include/bits/types/__locale_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/asm-generic/types.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/c++/16.1.1/initializer_list: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/src/basisu_c_binding.cpp: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/include/c++/16.1.1/unordered_map: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/inc/basisu_c_binding.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/c++/16.1.1/bits/stream_iterator.h: + +/usr/include/c++/16.1.1/vector: + +/usr/include/bits/endianness.h: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/assert.h: + +/usr/include/bits/posix2_lim.h: + +/usr/include/bits/mathcalls.h: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/exception: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/bits/endian.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/c++/16.1.1/bits/hashtable_policy.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h: + +/usr/include/asm/types.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/usr/include/alloca.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/strings.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +/usr/include/bits/fp-logb.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/bits/floatn.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/bits/long-double.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/bits/iscanonical.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/bits/libc-header-start.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/bits/math-vector.h: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/bits/types/timer_t.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/mathcalls-narrow.h: + +/usr/include/sched.h: + +/usr/include/bits/fp-fast.h: + +/usr/include/wchar.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/asm/errno.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/c++/16.1.1/array: + +/usr/include/bits/select.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/bits/setjmp.h: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/bits/types/FILE.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/error_t.h: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/features.h: + +/usr/include/bits/sched.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/bits/random.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/c++/16.1.1/bits/random.tcc: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/usr/include/math.h: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/c++/16.1.1/bits/unordered_map.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/stdio.h: + +/usr/include/bits/wordsize.h: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/c++/16.1.1/compare: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/bits/specfun.h: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/bits/stl_numeric.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/functional: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/iterator: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/math.h: + +/usr/include/c++/16.1.1/numeric: + +/usr/include/c++/16.1.1/stdlib.h: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/limits.h: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/usr/include/linux/sched/types.h: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/usr/include/errno.h: + +/usr/include/features-time64.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/linux/limits.h: + +/usr/include/linux/stddef.h: diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/compiler_depend.ts b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/compiler_depend.ts new file mode 100644 index 0000000..71ca22c --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for obj_basisu_cbind. diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/depend.make b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/depend.make new file mode 100644 index 0000000..e4a3219 --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for obj_basisu_cbind. +# This may be replaced when dependencies are built. diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/flags.make b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/flags.make new file mode 100644 index 0000000..2f922ff --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DBASISD_SUPPORT_KTX2=0 -DBASISD_SUPPORT_KTX2_ZSTD=0 -DKTX_BASISU_C_BINDINGS -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/inc -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/link.txt b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/link.txt new file mode 100644 index 0000000..65ae9f1 --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libobj_basisu_cbind.a CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o +/usr/bin/ranlib libobj_basisu_cbind.a diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/progress.make b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/progress.make new file mode 100644 index 0000000..7ce86b0 --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 91 + diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o new file mode 100644 index 0000000..3b3c9c8 Binary files /dev/null and b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o differ diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o.d b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o.d new file mode 100644 index 0000000..a08279a --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o.d @@ -0,0 +1,215 @@ +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/src/basisu_c_binding.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/string.h \ + /usr/include/strings.h /usr/include/memory.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/functional /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc /usr/include/assert.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/inc/basisu_c_binding.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h diff --git a/ktx/build/interface/basisu_c_binding/CMakeFiles/progress.marks b/ktx/build/interface/basisu_c_binding/CMakeFiles/progress.marks new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CMakeFiles/progress.marks @@ -0,0 +1 @@ +1 diff --git a/ktx/build/interface/basisu_c_binding/CTestTestfile.cmake b/ktx/build/interface/basisu_c_binding/CTestTestfile.cmake new file mode 100644 index 0000000..c2131c5 --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/interface/basisu_c_binding/Makefile b/ktx/build/interface/basisu_c_binding/Makefile new file mode 100644 index 0000000..1f9a379 --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/Makefile @@ -0,0 +1,264 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 interface/basisu_c_binding/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 interface/basisu_c_binding/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 interface/basisu_c_binding/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 interface/basisu_c_binding/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/rule +.PHONY : interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/rule + +# Convenience name for target. +obj_basisu_cbind: interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/rule +.PHONY : obj_basisu_cbind + +# fast build rule for target. +obj_basisu_cbind/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build +.PHONY : obj_basisu_cbind/fast + +src/basisu_c_binding.o: src/basisu_c_binding.cpp.o +.PHONY : src/basisu_c_binding.o + +# target to build an object file +src/basisu_c_binding.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.o +.PHONY : src/basisu_c_binding.cpp.o + +src/basisu_c_binding.i: src/basisu_c_binding.cpp.i +.PHONY : src/basisu_c_binding.i + +# target to preprocess a source file +src/basisu_c_binding.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.i +.PHONY : src/basisu_c_binding.cpp.i + +src/basisu_c_binding.s: src/basisu_c_binding.cpp.s +.PHONY : src/basisu_c_binding.s + +# target to generate assembly for a file +src/basisu_c_binding.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/build.make interface/basisu_c_binding/CMakeFiles/obj_basisu_cbind.dir/src/basisu_c_binding.cpp.s +.PHONY : src/basisu_c_binding.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... obj_basisu_cbind" + @echo "... src/basisu_c_binding.o" + @echo "... src/basisu_c_binding.i" + @echo "... src/basisu_c_binding.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/interface/basisu_c_binding/cmake_install.cmake b/ktx/build/interface/basisu_c_binding/cmake_install.cmake new file mode 100644 index 0000000..ee80ecb --- /dev/null +++ b/ktx/build/interface/basisu_c_binding/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/interface/basisu_c_binding/libobj_basisu_cbind.a b/ktx/build/interface/basisu_c_binding/libobj_basisu_cbind.a new file mode 100644 index 0000000..c3ab049 Binary files /dev/null and b/ktx/build/interface/basisu_c_binding/libobj_basisu_cbind.a differ diff --git a/ktx/build/ktx.version b/ktx/build/ktx.version new file mode 100644 index 0000000..19e482f --- /dev/null +++ b/ktx/build/ktx.version @@ -0,0 +1 @@ +0.0.0-noversion \ No newline at end of file diff --git a/ktx/build/libobjUtil.a b/ktx/build/libobjUtil.a new file mode 100644 index 0000000..14024cf Binary files /dev/null and b/ktx/build/libobjUtil.a differ diff --git a/ktx/build/tests/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tests/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tests/CMakeFiles/progress.marks b/ktx/build/tests/CMakeFiles/progress.marks new file mode 100644 index 0000000..e1617e8 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/progress.marks @@ -0,0 +1 @@ +57 diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/DependInfo.cmake b/ktx/build/tests/CMakeFiles/texturetests.dir/DependInfo.cmake new file mode 100644 index 0000000..beea229 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/texturetests.dir/DependInfo.cmake @@ -0,0 +1,24 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/texturetests/texturetests.cc" "tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o" "gcc" "tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o.d" + "" "Release/texturetests" "gcc" "tests/CMakeFiles/texturetests.dir/link.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/build.make b/ktx/build/tests/CMakeFiles/texturetests.dir/build.make new file mode 100644 index 0000000..82c2641 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/texturetests.dir/build.make @@ -0,0 +1,116 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tests/CMakeFiles/texturetests.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tests/CMakeFiles/texturetests.dir/compiler_depend.make + +# Include the progress variables for this target. +include tests/CMakeFiles/texturetests.dir/progress.make + +# Include the compile flags for this target's objects. +include tests/CMakeFiles/texturetests.dir/flags.make + +tests/CMakeFiles/texturetests.dir/codegen: +.PHONY : tests/CMakeFiles/texturetests.dir/codegen + +tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o: tests/CMakeFiles/texturetests.dir/flags.make +tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/texturetests/texturetests.cc +tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o: tests/CMakeFiles/texturetests.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o -MF CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o.d -o CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/texturetests/texturetests.cc + +tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/texturetests.dir/texturetests/texturetests.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/texturetests/texturetests.cc > CMakeFiles/texturetests.dir/texturetests/texturetests.cc.i + +tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/texturetests.dir/texturetests/texturetests.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/texturetests/texturetests.cc -o CMakeFiles/texturetests.dir/texturetests/texturetests.cc.s + +# Object files for target texturetests +texturetests_OBJECTS = \ +"CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o" + +# External object files for target texturetests +texturetests_EXTERNAL_OBJECTS = + +Release/texturetests: tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o +Release/texturetests: tests/CMakeFiles/texturetests.dir/build.make +Release/texturetests: tests/CMakeFiles/texturetests.dir/compiler_depend.ts +Release/texturetests: tests/gtest/libgtest.a +Release/texturetests: Release/libktx.so.0.0.0 +Release/texturetests: tests/CMakeFiles/texturetests.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../Release/texturetests" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/texturetests.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tests/CMakeFiles/texturetests.dir/build: Release/texturetests +.PHONY : tests/CMakeFiles/texturetests.dir/build + +tests/CMakeFiles/texturetests.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && $(CMAKE_COMMAND) -P CMakeFiles/texturetests.dir/cmake_clean.cmake +.PHONY : tests/CMakeFiles/texturetests.dir/clean + +tests/CMakeFiles/texturetests.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/texturetests.dir/DependInfo.cmake "--color=$(COLOR)" texturetests +.PHONY : tests/CMakeFiles/texturetests.dir/depend + diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/cmake_clean.cmake b/ktx/build/tests/CMakeFiles/texturetests.dir/cmake_clean.cmake new file mode 100644 index 0000000..011771a --- /dev/null +++ b/ktx/build/tests/CMakeFiles/texturetests.dir/cmake_clean.cmake @@ -0,0 +1,12 @@ +file(REMOVE_RECURSE + "../Release/texturetests" + "../Release/texturetests.pdb" + "CMakeFiles/texturetests.dir/link.d" + "CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o" + "CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o.d" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/texturetests.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/compiler_depend.internal b/ktx/build/tests/CMakeFiles/texturetests.dir/compiler_depend.internal new file mode 100644 index 0000000..241fa4e --- /dev/null +++ b/ktx/build/tests/CMakeFiles/texturetests.dir/compiler_depend.internal @@ -0,0 +1,439 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/texturetests + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0 + /usr/lib/Scrt1.o + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/libgtest.a + +tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/texturetests/texturetests.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/wthelper.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/sigaction.h + /usr/include/bits/sigcontext.h + /usr/include/bits/sigevent-consts.h + /usr/include/bits/siginfo-arch.h + /usr/include/bits/siginfo-consts-arch.h + /usr/include/bits/siginfo-consts.h + /usr/include/bits/signal_ext.h + /usr/include/bits/signum-arch.h + /usr/include/bits/signum-generic.h + /usr/include/bits/sigstack.h + /usr/include/bits/sigstksz.h + /usr/include/bits/sigthread.h + /usr/include/bits/ss_flags.h + /usr/include/bits/stat.h + /usr/include/bits/statx-generic.h + /usr/include/bits/statx.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/__sigval_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/idtype_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sig_atomic_t.h + /usr/include/bits/types/sigevent_t.h + /usr/include/bits/types/siginfo_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/sigval_t.h + /usr/include/bits/types/stack_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_sigstack.h + /usr/include/bits/types/struct_statx.h + /usr/include/bits/types/struct_statx_timestamp.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/any + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fs_dir.h + /usr/include/c++/16.1.1/bits/fs_fwd.h + /usr/include/c++/16.1.1/bits/fs_ops.h + /usr/include/c++/16.1.1/bits/fs_path.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/monostate.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_multiset.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_set.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/codecvt + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/cxxabi.h + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/filesystem + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/set + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/variant + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stat.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/regex.h + /usr/include/sched.h + /usr/include/signal.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/stat.h + /usr/include/sys/types.h + /usr/include/sys/ucontext.h + /usr/include/sys/wait.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/compiler_depend.make b/ktx/build/tests/CMakeFiles/texturetests.dir/compiler_depend.make new file mode 100644 index 0000000..0a2844c --- /dev/null +++ b/ktx/build/tests/CMakeFiles/texturetests.dir/compiler_depend.make @@ -0,0 +1,1299 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/texturetests: Release/libktx.so.0.0.0 \ + /usr/lib/Scrt1.o \ + /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o \ + tests/gtest/libgtest.a + +tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/texturetests/texturetests.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/wthelper.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h \ + /usr/include/bits/sigevent-consts.h \ + /usr/include/bits/siginfo-arch.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/signal_ext.h \ + /usr/include/bits/signum-arch.h \ + /usr/include/bits/signum-generic.h \ + /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h \ + /usr/include/bits/sigthread.h \ + /usr/include/bits/ss_flags.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/statx.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/idtype_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/types/siginfo_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/sigval_t.h \ + /usr/include/bits/types/stack_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_sigstack.h \ + /usr/include/bits/types/struct_statx.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /usr/include/c++/16.1.1/bits/fs_path.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/variant \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stat.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/regex.h \ + /usr/include/sched.h \ + /usr/include/signal.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/stat.h \ + /usr/include/sys/types.h \ + /usr/include/sys/ucontext.h \ + /usr/include/sys/wait.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/types.h: + +/usr/include/sys/stat.h: + +/usr/include/sys/select.h: + +/usr/include/sys/cdefs.h: + +/usr/include/string.h: + +/usr/include/stdlib.h: + +/usr/include/sys/ucontext.h: + +/usr/include/stdc-predef.h: + +/usr/include/pthread.h: + +/usr/include/linux/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/stat.h: + +/usr/include/linux/sched/types.h: + +/usr/include/limits.h: + +/usr/include/features-time64.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/vector: + +/usr/include/c++/16.1.1/variant: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/ratio: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/c++/16.1.1/memory: + +/usr/include/c++/16.1.1/map: + +/usr/include/c++/16.1.1/iterator: + +/usr/include/c++/16.1.1/ios: + +/usr/include/regex.h: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/include/c++/16.1.1/fstream: + +/usr/include/c++/16.1.1/filesystem: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/exception: + +/usr/include/time.h: + +/usr/include/c++/16.1.1/cxxabi.h: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h: + +/usr/include/c++/16.1.1/compare: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/c++/16.1.1/bits/unordered_map.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/bits/stream_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/c++/16.1.1/bits/stl_relops.h: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_multiset.h: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/bits/stl_multimap.h: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_map.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/math.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/bits/stdio_lim.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/bits/signum-generic.h: + +/usr/include/bits/signum-arch.h: + +/usr/include/bits/sigevent-consts.h: + +/usr/include/bits/posix2_lim.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/bits/types/stack_t.h: + +/usr/include/bits/setjmp.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h: + +/usr/include/bits/types/siginfo_t.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/include/c++/16.1.1/codecvt: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/bits/locale.h: + +/usr/include/bits/siginfo-consts-arch.h: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/usr/include/bits/sigstack.h: + +/usr/include/bits/getopt_core.h: + +/usr/include/bits/local_lim.h: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/usr/include/bits/siginfo-consts.h: + +/usr/include/c++/16.1.1/functional: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/usr/include/bits/libc-header-start.h: + +/usr/include/bits/sigaction.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/bits/iscanonical.h: + +/usr/include/c++/16.1.1/bits/fs_ops.h: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/FILE.h: + +/usr/include/bits/floatn.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/bits/confname.h: + +/usr/lib/libgcc_s.so.1: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/bits/posix_opt.h: + +/usr/include/asm/types.h: + +/usr/include/assert.h: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/include/bits/ss_flags.h: + +/usr/include/asm/posix_types_64.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/bits/endian.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/asm/errno.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h: + +/usr/include/c++/16.1.1/locale: + +/usr/include/bits/sigcontext.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/c++/16.1.1/cassert: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/bits/statx.h: + +/usr/include/asm-generic/int-ll64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h: + +/usr/include/bits/types/idtype_t.h: + +/usr/include/asm-generic/types.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/gnu/stubs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h: + +/usr/include/bits/mathcalls-narrow.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h: + +/usr/include/bits/errno.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/bits/quoted_string.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/bits/siginfo-arch.h: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h: + +/usr/include/c++/16.1.1/istream: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/lib/libmvec.so.1: + +/usr/include/asm-generic/errno.h: + +tests/gtest/libgtest.a: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/bits/environments.h: + +/usr/lib/libm.so.6: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/bits/sigthread.h: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/usr/include/c++/16.1.1/set: + +/usr/include/alloca.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/bits/sigstksz.h: + +/usr/include/c++/16.1.1/bits/stl_tree.h: + +/usr/lib/crtn.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h: + +/usr/include/c++/16.1.1/stdlib.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h: + +/usr/lib/libatomic.so: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h: + +/usr/include/bits/stat.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/bits/mathcalls.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h: + +/usr/include/bits/types/clock_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/lib/crti.o: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/types/sig_atomic_t.h: + +/usr/include/bits/typesizes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/texturetests/texturetests.cc: + +/usr/include/c++/16.1.1/bits/fs_path.h: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h: + +/usr/lib/libc.so.6: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/c++/16.1.1/bits/hashtable.h: + +/usr/include/c++/16.1.1/unordered_map: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h: + +/usr/include/bits/byteswap.h: + +/usr/include/c++/16.1.1/optional: + +Release/libktx.so.0.0.0: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/include/c++/16.1.1/iomanip: + +tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o: + +/usr/include/wchar.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/wctype.h: + +/usr/include/sched.h: + +/usr/include/bits/fp-fast.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/lib/libc.so: + +/usr/lib/libgcc_s.so: + +/usr/include/locale.h: + +/usr/include/c++/16.1.1/utility: + +/usr/lib/libstdc++.so: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/bits/math-vector.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h: + +/usr/include/stdio.h: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/bits/wordsize.h: + +/usr/include/bits/long-double.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/lib/Scrt1.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h: + +/usr/include/bits/types/timer_t.h: + +/usr/include/c++/16.1.1/cstdint: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h: + +/usr/include/bits/types/error_t.h: + +/usr/include/errno.h: + +/usr/include/bits/getopt_posix.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/wthelper.h: + +/usr/include/bits/cpu-set.h: + +/usr/include/c++/16.1.1/bits/stl_set.h: + +/usr/include/bits/stdint-least.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/linux/limits.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/bits/stdlib-float.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/bits/types/time_t.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/bits/timesize.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/types.h: + +/usr/include/features.h: + +/usr/include/bits/sched.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/bits/types/__locale_t.h: + +/usr/include/gnu/stubs-64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h: + +/usr/include/bits/types/__sigval_t.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/signal_ext.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/sigevent_t.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/bits/types/sigval_t.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/bits/types/struct_sigstack.h: + +/usr/include/bits/types/struct_statx.h: + +/usr/include/bits/types/struct_statx_timestamp.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/bits/waitflags.h: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/lib/libm.so: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/include/c++/16.1.1/any: + +/usr/include/bits/select.h: + +/usr/include/c++/16.1.1/array: + +/usr/include/c++/16.1.1/atomic: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/math.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/bits/chrono.h: + +/usr/include/strings.h: + +/usr/include/signal.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/bits/fp-logb.h: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/c++/16.1.1/bits/fs_dir.h: + +/usr/include/bits/mathcalls-macros.h: + +/usr/include/c++/16.1.1/bits/fs_fwd.h: + +/usr/include/c++/16.1.1/bits/fstream.tcc: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/c++/16.1.1/bits/hashtable_policy.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/bits/statx-generic.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/libintl.h: + +/usr/include/bits/endianness.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/usr/include/unistd.h: + +/usr/include/c++/16.1.1/bits/monostate.h: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h: + +/usr/include/bits/struct_stat.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/c++/16.1.1/bits/specfun.h: diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/compiler_depend.ts b/ktx/build/tests/CMakeFiles/texturetests.dir/compiler_depend.ts new file mode 100644 index 0000000..cee7a1e --- /dev/null +++ b/ktx/build/tests/CMakeFiles/texturetests.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for texturetests. diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/depend.make b/ktx/build/tests/CMakeFiles/texturetests.dir/depend.make new file mode 100644 index 0000000..cb834c1 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/texturetests.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for texturetests. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/flags.make b/ktx/build/tests/CMakeFiles/texturetests.dir/flags.make new file mode 100644 index 0000000..aca8d17 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/texturetests.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/. + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/link.d b/ktx/build/tests/CMakeFiles/texturetests.dir/link.d new file mode 100644 index 0000000..6c3cd13 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/texturetests.dir/link.d @@ -0,0 +1,112 @@ +../Release/texturetests: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o \ + gtest/libgtest.a \ + ../Release/libktx.so.0.0.0 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o \ + /usr/lib/ld-linux-x86-64.so.2 + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o: + +gtest/libgtest.a: + +../Release/libktx.so.0.0.0: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: + +/usr/lib/ld-linux-x86-64.so.2: diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/link.txt b/ktx/build/tests/CMakeFiles/texturetests.dir/link.txt new file mode 100644 index 0000000..3c140f6 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/texturetests.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -msse4.1 -O3 -DNDEBUG -O3 -Wl,--dependency-file=CMakeFiles/texturetests.dir/link.d CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o -o ../Release/texturetests -Wl,-rpath,"\$ORIGIN:\$ORIGIN/../lib" gtest/libgtest.a ../Release/libktx.so.0.0.0 diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/progress.make b/ktx/build/tests/CMakeFiles/texturetests.dir/progress.make new file mode 100644 index 0000000..7614da1 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/texturetests.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 93 + diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o b/ktx/build/tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o new file mode 100644 index 0000000..7c9ce56 Binary files /dev/null and b/ktx/build/tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o differ diff --git a/ktx/build/tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o.d b/ktx/build/tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o.d new file mode 100644 index 0000000..c578637 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o.d @@ -0,0 +1,316 @@ +tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/texturetests/texturetests.cc \ + /usr/include/stdc-predef.h /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/iosfwd /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/move.h /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/ctime /usr/include/time.h \ + /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/fs_path.h /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/sstream.tcc /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/iostream /usr/include/sys/stat.h \ + /usr/include/bits/stat.h /usr/include/bits/struct_stat.h \ + /usr/include/bits/statx.h /usr/include/linux/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_statx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/string.h /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture1.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/vector /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/regex.h /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/variant /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/sys/wait.h /usr/include/signal.h \ + /usr/include/bits/signum-generic.h /usr/include/bits/signum-arch.h \ + /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/siginfo_t.h /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/siginfo-arch.h /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/types/sigval_t.h /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/sigevent-consts.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/bits/types/stack_t.h \ + /usr/include/sys/ucontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h /usr/include/bits/ss_flags.h \ + /usr/include/bits/types/struct_sigstack.h /usr/include/bits/sigthread.h \ + /usr/include/bits/signal_ext.h /usr/include/bits/types/idtype_t.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /usr/include/c++/16.1.1/atomic \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/wthelper.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/DependInfo.cmake b/ktx/build/tests/CMakeFiles/unittests.dir/DependInfo.cmake new file mode 100644 index 0000000..2ee3ed9 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/DependInfo.cmake @@ -0,0 +1,28 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.c" "tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o" "gcc" "tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/image_unittests.cc" "tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o" "gcc" "tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_fragment_uri.cc" "tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o" "gcc" "tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_string_to_vkformat.cc" "tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o" "gcc" "tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/unittests.cc" "tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o" "gcc" "tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o.d" + "" "Release/unittests" "gcc" "tests/CMakeFiles/unittests.dir/link.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o b/ktx/build/tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o new file mode 100644 index 0000000..615cfa0 Binary files /dev/null and b/ktx/build/tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o differ diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o.d b/ktx/build/tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o.d new file mode 100644 index 0000000..2db52f6 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o.d @@ -0,0 +1,20 @@ +tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.c \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.inl diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/build.make b/ktx/build/tests/CMakeFiles/unittests.dir/build.make new file mode 100644 index 0000000..aaafcdb --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/build.make @@ -0,0 +1,181 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tests/CMakeFiles/unittests.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tests/CMakeFiles/unittests.dir/compiler_depend.make + +# Include the progress variables for this target. +include tests/CMakeFiles/unittests.dir/progress.make + +# Include the compile flags for this target's objects. +include tests/CMakeFiles/unittests.dir/flags.make + +tests/CMakeFiles/unittests.dir/codegen: +.PHONY : tests/CMakeFiles/unittests.dir/codegen + +tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o: tests/CMakeFiles/unittests.dir/flags.make +tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.c +tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o: tests/CMakeFiles/unittests.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o -MF CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o.d -o CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.c + +tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.c > CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.i + +tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.c -o CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.s + +tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o: tests/CMakeFiles/unittests.dir/flags.make +tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/image_unittests.cc +tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o: tests/CMakeFiles/unittests.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o -MF CMakeFiles/unittests.dir/unittests/image_unittests.cc.o.d -o CMakeFiles/unittests.dir/unittests/image_unittests.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/image_unittests.cc + +tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/unittests.dir/unittests/image_unittests.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/image_unittests.cc > CMakeFiles/unittests.dir/unittests/image_unittests.cc.i + +tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/unittests.dir/unittests/image_unittests.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/image_unittests.cc -o CMakeFiles/unittests.dir/unittests/image_unittests.cc.s + +tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o: tests/CMakeFiles/unittests.dir/flags.make +tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_fragment_uri.cc +tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o: tests/CMakeFiles/unittests.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o -MF CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o.d -o CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_fragment_uri.cc + +tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_fragment_uri.cc > CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.i + +tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_fragment_uri.cc -o CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.s + +tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o: tests/CMakeFiles/unittests.dir/flags.make +tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_string_to_vkformat.cc +tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o: tests/CMakeFiles/unittests.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o -MF CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o.d -o CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_string_to_vkformat.cc + +tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_string_to_vkformat.cc > CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.i + +tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_string_to_vkformat.cc -o CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.s + +tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o: tests/CMakeFiles/unittests.dir/flags.make +tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/unittests.cc +tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o: tests/CMakeFiles/unittests.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o -MF CMakeFiles/unittests.dir/unittests/unittests.cc.o.d -o CMakeFiles/unittests.dir/unittests/unittests.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/unittests.cc + +tests/CMakeFiles/unittests.dir/unittests/unittests.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/unittests.dir/unittests/unittests.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/unittests.cc > CMakeFiles/unittests.dir/unittests/unittests.cc.i + +tests/CMakeFiles/unittests.dir/unittests/unittests.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/unittests.dir/unittests/unittests.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/unittests.cc -o CMakeFiles/unittests.dir/unittests/unittests.cc.s + +# Object files for target unittests +unittests_OBJECTS = \ +"CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o" \ +"CMakeFiles/unittests.dir/unittests/image_unittests.cc.o" \ +"CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o" \ +"CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o" \ +"CMakeFiles/unittests.dir/unittests/unittests.cc.o" + +# External object files for target unittests +unittests_EXTERNAL_OBJECTS = + +Release/unittests: tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o +Release/unittests: tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o +Release/unittests: tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o +Release/unittests: tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o +Release/unittests: tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o +Release/unittests: tests/CMakeFiles/unittests.dir/build.make +Release/unittests: tests/CMakeFiles/unittests.dir/compiler_depend.ts +Release/unittests: tests/gtest/libgtest.a +Release/unittests: Release/libktx.so.0.0.0 +Release/unittests: external/fmt/libfmt.a +Release/unittests: tests/CMakeFiles/unittests.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Linking CXX executable ../Release/unittests" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/unittests.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tests/CMakeFiles/unittests.dir/build: Release/unittests +.PHONY : tests/CMakeFiles/unittests.dir/build + +tests/CMakeFiles/unittests.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests && $(CMAKE_COMMAND) -P CMakeFiles/unittests.dir/cmake_clean.cmake +.PHONY : tests/CMakeFiles/unittests.dir/clean + +tests/CMakeFiles/unittests.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/unittests.dir/DependInfo.cmake "--color=$(COLOR)" unittests +.PHONY : tests/CMakeFiles/unittests.dir/depend + diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/cmake_clean.cmake b/ktx/build/tests/CMakeFiles/unittests.dir/cmake_clean.cmake new file mode 100644 index 0000000..da26096 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/cmake_clean.cmake @@ -0,0 +1,20 @@ +file(REMOVE_RECURSE + "../Release/unittests" + "../Release/unittests.pdb" + "CMakeFiles/unittests.dir/link.d" + "CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o" + "CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o.d" + "CMakeFiles/unittests.dir/unittests/image_unittests.cc.o" + "CMakeFiles/unittests.dir/unittests/image_unittests.cc.o.d" + "CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o" + "CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o.d" + "CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o" + "CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o.d" + "CMakeFiles/unittests.dir/unittests/unittests.cc.o" + "CMakeFiles/unittests.dir/unittests/unittests.cc.o.d" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C CXX) + include(CMakeFiles/unittests.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/compiler_depend.internal b/ktx/build/tests/CMakeFiles/unittests.dir/compiler_depend.internal new file mode 100644 index 0000000..845098d --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/compiler_depend.internal @@ -0,0 +1,1820 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/unittests + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/libfmt.a + /usr/lib/Scrt1.o + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/libgtest.a + +tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.c + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/typesizes.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/sys/cdefs.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/image_unittests.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/sigaction.h + /usr/include/bits/sigcontext.h + /usr/include/bits/sigevent-consts.h + /usr/include/bits/siginfo-arch.h + /usr/include/bits/siginfo-consts-arch.h + /usr/include/bits/siginfo-consts.h + /usr/include/bits/signal_ext.h + /usr/include/bits/signum-arch.h + /usr/include/bits/signum-generic.h + /usr/include/bits/sigstack.h + /usr/include/bits/sigstksz.h + /usr/include/bits/sigthread.h + /usr/include/bits/ss_flags.h + /usr/include/bits/stat.h + /usr/include/bits/statx-generic.h + /usr/include/bits/statx.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/__sigval_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/idtype_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sig_atomic_t.h + /usr/include/bits/types/sigevent_t.h + /usr/include/bits/types/siginfo_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/sigval_t.h + /usr/include/bits/types/stack_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_sigstack.h + /usr/include/bits/types/struct_statx.h + /usr/include/bits/types/struct_statx_timestamp.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/any + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/monostate.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_multiset.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_set.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/cxxabi.h + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/set + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/variant + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stat.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/regex.h + /usr/include/sched.h + /usr/include/signal.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/stat.h + /usr/include/sys/types.h + /usr/include/sys/ucontext.h + /usr/include/sys/wait.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_fragment_uri.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/fragment_uri.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/sigaction.h + /usr/include/bits/sigcontext.h + /usr/include/bits/sigevent-consts.h + /usr/include/bits/siginfo-arch.h + /usr/include/bits/siginfo-consts-arch.h + /usr/include/bits/siginfo-consts.h + /usr/include/bits/signal_ext.h + /usr/include/bits/signum-arch.h + /usr/include/bits/signum-generic.h + /usr/include/bits/sigstack.h + /usr/include/bits/sigstksz.h + /usr/include/bits/sigthread.h + /usr/include/bits/ss_flags.h + /usr/include/bits/stat.h + /usr/include/bits/statx-generic.h + /usr/include/bits/statx.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/__sigval_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/idtype_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sig_atomic_t.h + /usr/include/bits/types/sigevent_t.h + /usr/include/bits/types/siginfo_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/sigval_t.h + /usr/include/bits/types/stack_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_sigstack.h + /usr/include/bits/types/struct_statx.h + /usr/include/bits/types/struct_statx_timestamp.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/any + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/monostate.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_multiset.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_set.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/cxxabi.h + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/set + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/variant + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stat.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/regex.h + /usr/include/sched.h + /usr/include/signal.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/stat.h + /usr/include/sys/types.h + /usr/include/sys/ucontext.h + /usr/include/sys/wait.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_string_to_vkformat.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/sigaction.h + /usr/include/bits/sigcontext.h + /usr/include/bits/sigevent-consts.h + /usr/include/bits/siginfo-arch.h + /usr/include/bits/siginfo-consts-arch.h + /usr/include/bits/siginfo-consts.h + /usr/include/bits/signal_ext.h + /usr/include/bits/signum-arch.h + /usr/include/bits/signum-generic.h + /usr/include/bits/sigstack.h + /usr/include/bits/sigstksz.h + /usr/include/bits/sigthread.h + /usr/include/bits/ss_flags.h + /usr/include/bits/stat.h + /usr/include/bits/statx-generic.h + /usr/include/bits/statx.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/__sigval_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/idtype_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sig_atomic_t.h + /usr/include/bits/types/sigevent_t.h + /usr/include/bits/types/siginfo_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/sigval_t.h + /usr/include/bits/types/stack_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_sigstack.h + /usr/include/bits/types/struct_statx.h + /usr/include/bits/types/struct_statx_timestamp.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/any + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/monostate.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_multiset.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_set.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/cxxabi.h + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/set + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/variant + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stat.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/pthread.h + /usr/include/regex.h + /usr/include/sched.h + /usr/include/signal.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/stat.h + /usr/include/sys/types.h + /usr/include/sys/ucontext.h + /usr/include/sys/wait.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/unittests.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/ltexceptions.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/vkformat_list.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/wthelper.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/sigaction.h + /usr/include/bits/sigcontext.h + /usr/include/bits/sigevent-consts.h + /usr/include/bits/siginfo-arch.h + /usr/include/bits/siginfo-consts-arch.h + /usr/include/bits/siginfo-consts.h + /usr/include/bits/signal_ext.h + /usr/include/bits/signum-arch.h + /usr/include/bits/signum-generic.h + /usr/include/bits/sigstack.h + /usr/include/bits/sigstksz.h + /usr/include/bits/sigthread.h + /usr/include/bits/ss_flags.h + /usr/include/bits/stat.h + /usr/include/bits/statx-generic.h + /usr/include/bits/statx.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/__sigval_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/idtype_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sig_atomic_t.h + /usr/include/bits/types/sigevent_t.h + /usr/include/bits/types/siginfo_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/sigval_t.h + /usr/include/bits/types/stack_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_sigstack.h + /usr/include/bits/types/struct_statx.h + /usr/include/bits/types/struct_statx_timestamp.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/any + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/monostate.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_multiset.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_set.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/cxxabi.h + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/set + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/variant + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stat.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/regex.h + /usr/include/sched.h + /usr/include/signal.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/stat.h + /usr/include/sys/types.h + /usr/include/sys/ucontext.h + /usr/include/sys/wait.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/compiler_depend.make b/ktx/build/tests/CMakeFiles/unittests.dir/compiler_depend.make new file mode 100644 index 0000000..2f777c8 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/compiler_depend.make @@ -0,0 +1,3156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/unittests: Release/libktx.so.0.0.0 \ + external/fmt/libfmt.a \ + /usr/lib/Scrt1.o \ + /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o \ + tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o \ + tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o \ + tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o \ + tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o \ + tests/gtest/libgtest.a + +tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.c \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/sys/cdefs.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/image_unittests.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h \ + /usr/include/bits/sigevent-consts.h \ + /usr/include/bits/siginfo-arch.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/signal_ext.h \ + /usr/include/bits/signum-arch.h \ + /usr/include/bits/signum-generic.h \ + /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h \ + /usr/include/bits/sigthread.h \ + /usr/include/bits/ss_flags.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/statx.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/idtype_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/types/siginfo_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/sigval_t.h \ + /usr/include/bits/types/stack_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_sigstack.h \ + /usr/include/bits/types/struct_statx.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/variant \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stat.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/regex.h \ + /usr/include/sched.h \ + /usr/include/signal.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/stat.h \ + /usr/include/sys/types.h \ + /usr/include/sys/ucontext.h \ + /usr/include/sys/wait.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_fragment_uri.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/fragment_uri.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h \ + /usr/include/bits/sigevent-consts.h \ + /usr/include/bits/siginfo-arch.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/signal_ext.h \ + /usr/include/bits/signum-arch.h \ + /usr/include/bits/signum-generic.h \ + /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h \ + /usr/include/bits/sigthread.h \ + /usr/include/bits/ss_flags.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/statx.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/idtype_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/types/siginfo_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/sigval_t.h \ + /usr/include/bits/types/stack_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_sigstack.h \ + /usr/include/bits/types/struct_statx.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/variant \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stat.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/regex.h \ + /usr/include/sched.h \ + /usr/include/signal.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/stat.h \ + /usr/include/sys/types.h \ + /usr/include/sys/ucontext.h \ + /usr/include/sys/wait.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_string_to_vkformat.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h \ + /usr/include/bits/sigevent-consts.h \ + /usr/include/bits/siginfo-arch.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/signal_ext.h \ + /usr/include/bits/signum-arch.h \ + /usr/include/bits/signum-generic.h \ + /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h \ + /usr/include/bits/sigthread.h \ + /usr/include/bits/ss_flags.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/statx.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/idtype_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/types/siginfo_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/sigval_t.h \ + /usr/include/bits/types/stack_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_sigstack.h \ + /usr/include/bits/types/struct_statx.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/variant \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stat.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/pthread.h \ + /usr/include/regex.h \ + /usr/include/sched.h \ + /usr/include/signal.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/stat.h \ + /usr/include/sys/types.h \ + /usr/include/sys/ucontext.h \ + /usr/include/sys/wait.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/unittests.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/ltexceptions.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/vkformat_list.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/wthelper.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h \ + /usr/include/bits/sigevent-consts.h \ + /usr/include/bits/siginfo-arch.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/signal_ext.h \ + /usr/include/bits/signum-arch.h \ + /usr/include/bits/signum-generic.h \ + /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h \ + /usr/include/bits/sigthread.h \ + /usr/include/bits/ss_flags.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/statx.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/idtype_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/types/siginfo_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/sigval_t.h \ + /usr/include/bits/types/stack_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_sigstack.h \ + /usr/include/bits/types/struct_statx.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/variant \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stat.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/regex.h \ + /usr/include/sched.h \ + /usr/include/signal.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/stat.h \ + /usr/include/sys/types.h \ + /usr/include/sys/ucontext.h \ + /usr/include/sys/wait.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/wthelper.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/ltexceptions.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/unittests.cc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_string_to_vkformat.cc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_fragment_uri.cc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl: + +/usr/include/c++/16.1.1/debug/debug.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/usr/include/bits/signum-generic.h: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/bits/sigcontext.h: + +/usr/include/c++/16.1.1/locale: + +/usr/include/bits/sigaction.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/bits/sched.h: + +/usr/include/features.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/bits/mathcalls.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/bits/mathcalls-narrow.h: + +/usr/include/bits/math-vector.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/bits/local_lim.h: + +/usr/include/sched.h: + +/usr/include/wctype.h: + +/usr/include/bits/floatn.h: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/bits/errno.h: + +/usr/include/bits/environments.h: + +/usr/include/bits/endian.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp: + +/usr/include/bits/posix_opt.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h: + +/usr/include/asm/posix_types_64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +tests/gtest/libgtest.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp: + +/usr/include/asm-generic/bitsperlong.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/image_unittests.cc: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/c++/16.1.1/cassert: + +/usr/include/c++/16.1.1/set: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h: + +/usr/include/bits/stdint-uintn.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h: + +/usr/include/bits/struct_stat.h: + +/usr/include/bits/setjmp.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h: + +/usr/include/bits/fp-fast.h: + +/usr/lib/libc.so.6: + +/usr/include/c++/16.1.1/cstdio: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h: + +/usr/include/bits/types/time_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h: + +/usr/include/asm/types.h: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h: + +/usr/include/c++/16.1.1/sstream: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/fragment_uri.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp: + +/usr/include/asm-generic/types.h: + +/usr/lib/libc.so: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/c++/16.1.1/cfloat: + +/usr/include/bits/sigstack.h: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/bits/siginfo-consts-arch.h: + +/usr/include/bits/getopt_core.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h: + +/usr/include/bits/types/__fpos_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h: + +/usr/include/bits/stat.h: + +/usr/include/assert.h: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h: + +/usr/include/sys/ucontext.h: + +tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o: + +/usr/include/bits/wchar.h: + +/usr/include/asm-generic/posix_types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/bits/waitstatus.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h: + +/usr/include/gnu/stubs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/vkformat_list.inl: + +/usr/include/gnu/stubs-64.h: + +/usr/include/bits/select.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl: + +/usr/include/bits/wordsize.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp: + +/usr/include/stdio.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +external/fmt/libfmt.a: + +/usr/include/bits/types.h: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/istream: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h: + +/usr/include/bits/getopt_posix.h: + +/usr/include/errno.h: + +/usr/include/sys/cdefs.h: + +/usr/include/bits/timesize.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl: + +/usr/include/bits/statx.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp: + +/usr/include/c++/16.1.1/initializer_list: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h: + +/usr/include/bits/long-double.h: + +/usr/include/asm-generic/int-ll64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/bits/ss_flags.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h: + +/usr/include/c++/16.1.1/random: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o: + +/usr/include/c++/16.1.1/bit: + +/usr/include/bits/iscanonical.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl: + +/usr/include/regex.h: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/bits/siginfo-consts.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp: + +/usr/include/c++/16.1.1/functional: + +/usr/include/bits/typesizes.h: + +/usr/include/c++/16.1.1/array: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h: + +/usr/include/bits/endianness.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/lib/libatomic.so: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h: + +tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/lib/libgcc_s.so: + +/usr/include/c++/16.1.1/algorithm: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl: + +/usr/lib/Scrt1.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/bits/time64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp: + +tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.c: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl: + +/usr/include/bits/types/error_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/include/bits/siginfo-arch.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp: + +/usr/include/stdc-predef.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/libm.so.6: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/bits/struct_mutex.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp: + +/usr/include/bits/signal_ext.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/pstl/glue_numeric_defs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl: + +/usr/include/bits/types/siginfo_t.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/c++/16.1.1/memory: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h: + +/usr/include/bits/waitflags.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp: + +/usr/include/stdint.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/usr/include/c++/16.1.1/bits/stl_set.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/bits/signum-arch.h: + +/usr/lib/crti.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h: + +/usr/include/bits/types/clock_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp: + +/usr/lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/bits/floatn-common.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl: + +/usr/include/linux/posix_types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/lib/libstdc++.so: + +/usr/include/c++/16.1.1/utility: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/locale.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/bits/byteswap.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +Release/libktx.so.0.0.0: + +/usr/include/asm/bitsperlong.h: + +/usr/include/malloc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp: + +/usr/include/bits/types/FILE.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/bits/cpu-set.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h: + +/usr/include/alloca.h: + +/usr/include/bits/sigstksz.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/bits/types/__sigval_t.h: + +/usr/include/c++/16.1.1/bits/stl_tree.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h: + +/usr/include/features-time64.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h: + +/usr/include/c++/16.1.1/bits/quoted_string.h: + +/usr/include/bits/sigevent-consts.h: + +/usr/include/bits/posix2_lim.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp: + +/usr/include/c++/16.1.1/new: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h: + +/usr/include/bits/posix1_lim.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp: + +/usr/include/bits/types/struct_itimerspec.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h: + +/usr/include/bits/libc-header-start.h: + +/usr/include/c++/16.1.1/stdlib.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp: + +/usr/include/bits/types/__locale_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/bits/statx-generic.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/bits/types/idtype_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/types/sigevent_t.h: + +/usr/include/bits/types/sigval_t.h: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/bits/types/stack_t.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/types/struct_sigstack.h: + +/usr/include/bits/types/struct_statx.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd2vk.inl: + +/usr/include/bits/types/struct_statx_timestamp.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/c++/16.1.1/bits/stl_numeric.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/bits/xopen_lim.h: + +tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o: + +/usr/include/c++/16.1.1/any: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/c++/16.1.1/atomic: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/math.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/usr/include/c++/16.1.1/optional: + +/usr/lib/crtn.o: + +/usr/include/linux/limits.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/bits/atomic_wide_counter.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl: + +/usr/include/signal.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp: + +/usr/include/strings.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/bits/confname.h: + +/usr/include/c++/16.1.1/bits/hashtable_policy.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/include/wchar.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp: + +/usr/include/c++/16.1.1/bits/monostate.h: + +/usr/include/unistd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h: + +/usr/lib/libm.so: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/include/c++/16.1.1/bits/random.tcc: + +/usr/include/ctype.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/linux/close_range.h: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp: + +/usr/include/c++/16.1.1/bits/random.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/include/c++/16.1.1/bits/specfun.h: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/asm/errno.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/math.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_map.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/c++/16.1.1/limits: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl: + +/usr/include/c++/16.1.1/bits/stl_multimap.h: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/bits/stl_multiset.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/usr/include/c++/16.1.1/bits/stl_relops.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/c++/16.1.1/bits/stream_iterator.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/bits/mathcalls-macros.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/include/libintl.h: + +/usr/include/c++/16.1.1/bits/unordered_map.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/include/bits/types/sig_atomic_t.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/c++/16.1.1/climits: + +/usr/include/bits/types/timer_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/c++/16.1.1/compare: + +/usr/include/memory.h: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/cstring: + +/usr/include/sys/select.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/c++/16.1.1/cwctype: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h: + +/usr/include/time.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/c++/16.1.1/bits/hashtable.h: + +/usr/include/c++/16.1.1/exception: + +/usr/include/bits/stdio_lim.h: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/c++/16.1.1/iomanip: + +/usr/include/c++/16.1.1/ios: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h: + +/usr/include/c++/16.1.1/iterator: + +/usr/include/c++/16.1.1/map: + +/usr/include/c++/16.1.1/numeric: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/string_view: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h: + +/usr/include/c++/16.1.1/unordered_map: + +/usr/include/bits/sigthread.h: + +/usr/include/c++/16.1.1/variant: + +/usr/include/c++/16.1.1/vector: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/cxxabi.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/include/limits.h: + +/usr/include/linux/sched/types.h: + +/usr/include/linux/stat.h: + +/usr/include/bits/fp-logb.h: + +/usr/lib/libmvec.so.1: + +/usr/include/linux/stddef.h: + +/usr/include/linux/types.h: + +/usr/include/pthread.h: + +/usr/include/stdlib.h: + +/usr/include/string.h: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/sys/stat.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/sys/types.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/sys/wait.h: diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/compiler_depend.ts b/ktx/build/tests/CMakeFiles/unittests.dir/compiler_depend.ts new file mode 100644 index 0000000..23a9340 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for unittests. diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/depend.make b/ktx/build/tests/CMakeFiles/unittests.dir/depend.make new file mode 100644 index 0000000..d45d114 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for unittests. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/flags.make b/ktx/build/tests/CMakeFiles/unittests.dir/flags.make new file mode 100644 index 0000000..ecde3a8 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/flags.make @@ -0,0 +1,17 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile C with /usr/bin/cc +# compile CXX with /usr/bin/c++ +C_DEFINES = -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +C_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/. -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include + +C_FLAGS = -O3 -DNDEBUG -Wall -Wextra -O3 -ffp-contract=off + +CXX_DEFINES = -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/. -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/link.d b/ktx/build/tests/CMakeFiles/unittests.dir/link.d new file mode 100644 index 0000000..7a702f7 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/link.d @@ -0,0 +1,127 @@ +../Release/unittests: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o \ + CMakeFiles/unittests.dir/unittests/image_unittests.cc.o \ + CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o \ + CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o \ + CMakeFiles/unittests.dir/unittests/unittests.cc.o \ + gtest/libgtest.a \ + ../Release/libktx.so.0.0.0 \ + ../external/fmt/libfmt.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o \ + /usr/lib/ld-linux-x86-64.so.2 + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o: + +CMakeFiles/unittests.dir/unittests/image_unittests.cc.o: + +CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o: + +CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o: + +CMakeFiles/unittests.dir/unittests/unittests.cc.o: + +gtest/libgtest.a: + +../Release/libktx.so.0.0.0: + +../external/fmt/libfmt.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: + +/usr/lib/ld-linux-x86-64.so.2: diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/link.txt b/ktx/build/tests/CMakeFiles/unittests.dir/link.txt new file mode 100644 index 0000000..905fa9c --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -msse4.1 -O3 -DNDEBUG -O3 -Wl,--dependency-file=CMakeFiles/unittests.dir/link.d CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o CMakeFiles/unittests.dir/unittests/image_unittests.cc.o CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o CMakeFiles/unittests.dir/unittests/unittests.cc.o -o ../Release/unittests -Wl,-rpath,"\$ORIGIN:\$ORIGIN/../lib" gtest/libgtest.a ../Release/libktx.so.0.0.0 ../external/fmt/libfmt.a diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/progress.make b/ktx/build/tests/CMakeFiles/unittests.dir/progress.make new file mode 100644 index 0000000..3e05419 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/progress.make @@ -0,0 +1,7 @@ +CMAKE_PROGRESS_1 = 97 +CMAKE_PROGRESS_2 = +CMAKE_PROGRESS_3 = 98 +CMAKE_PROGRESS_4 = +CMAKE_PROGRESS_5 = 99 +CMAKE_PROGRESS_6 = 100 + diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o new file mode 100644 index 0000000..8247f2a Binary files /dev/null and b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o differ diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o.d b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o.d new file mode 100644 index 0000000..eb23615 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o.d @@ -0,0 +1,517 @@ +tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/image_unittests.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/c++/16.1.1/bits/version.h /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/memory /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/string.h \ + /usr/include/strings.h /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/sys/stat.h \ + /usr/include/bits/stat.h /usr/include/bits/struct_stat.h \ + /usr/include/bits/statx.h /usr/include/linux/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_statx.h /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/regex.h /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/variant /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h /usr/include/sys/wait.h \ + /usr/include/signal.h /usr/include/bits/signum-generic.h \ + /usr/include/bits/signum-arch.h /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/siginfo_t.h /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/siginfo-arch.h /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/types/sigval_t.h /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/sigevent-consts.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/bits/types/stack_t.h \ + /usr/include/sys/ucontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h /usr/include/bits/ss_flags.h \ + /usr/include/bits/types/struct_sigstack.h /usr/include/bits/sigthread.h \ + /usr/include/bits/signal_ext.h /usr/include/bits/types/idtype_t.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /usr/include/c++/16.1.1/atomic \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/math.h /usr/include/memory.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o new file mode 100644 index 0000000..e9ba590 Binary files /dev/null and b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o differ diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o.d b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o.d new file mode 100644 index 0000000..ece8c15 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o.d @@ -0,0 +1,286 @@ +tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_fragment_uri.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/fragment_uri.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/version.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/cstddef /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/c++/16.1.1/cstring /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/sys/stat.h \ + /usr/include/bits/stat.h /usr/include/bits/struct_stat.h \ + /usr/include/bits/statx.h /usr/include/linux/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_statx.h /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/regex.h /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/variant /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h /usr/include/sys/wait.h \ + /usr/include/signal.h /usr/include/bits/signum-generic.h \ + /usr/include/bits/signum-arch.h /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/siginfo_t.h /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/siginfo-arch.h /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/types/sigval_t.h /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/sigevent-consts.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/bits/types/stack_t.h \ + /usr/include/sys/ucontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h /usr/include/bits/ss_flags.h \ + /usr/include/bits/types/struct_sigstack.h /usr/include/bits/sigthread.h \ + /usr/include/bits/signal_ext.h /usr/include/bits/types/idtype_t.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /usr/include/c++/16.1.1/atomic \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o new file mode 100644 index 0000000..efdf4ee Binary files /dev/null and b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o differ diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o.d b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o.d new file mode 100644 index 0000000..a1d819a --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o.d @@ -0,0 +1,259 @@ +tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/test_string_to_vkformat.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/c++/16.1.1/bits/version.h /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/memory /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/string.h \ + /usr/include/strings.h /usr/include/c++/16.1.1/cstdint \ + /usr/include/sys/stat.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/bits/statx.h \ + /usr/include/linux/stat.h /usr/include/bits/statx-generic.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_statx.h /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/regex.h /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/variant /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h /usr/include/sys/wait.h \ + /usr/include/signal.h /usr/include/bits/signum-generic.h \ + /usr/include/bits/signum-arch.h /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/siginfo_t.h /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/siginfo-arch.h /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/types/sigval_t.h /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/sigevent-consts.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/bits/types/stack_t.h \ + /usr/include/sys/ucontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h /usr/include/bits/ss_flags.h \ + /usr/include/bits/types/struct_sigstack.h /usr/include/bits/sigthread.h \ + /usr/include/bits/signal_ext.h /usr/include/bits/types/idtype_t.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /usr/include/c++/16.1.1/atomic \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o new file mode 100644 index 0000000..5d6f162 Binary files /dev/null and b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o differ diff --git a/ktx/build/tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o.d b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o.d new file mode 100644 index 0000000..42fc361 --- /dev/null +++ b/ktx/build/tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o.d @@ -0,0 +1,306 @@ +tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/unittests.cc \ + /usr/include/stdc-predef.h /usr/include/string.h \ + /usr/include/bits/libc-header-start.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/wchar.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /usr/include/c++/16.1.1/cstddef /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdint \ + /usr/include/sys/stat.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/bits/statx.h \ + /usr/include/linux/stat.h /usr/include/bits/statx-generic.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_statx.h /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/regex.h /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/variant /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h /usr/include/sys/wait.h \ + /usr/include/signal.h /usr/include/bits/signum-generic.h \ + /usr/include/bits/signum-arch.h /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/siginfo_t.h /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/siginfo-arch.h /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/types/sigval_t.h /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/sigevent-consts.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/bits/types/stack_t.h \ + /usr/include/sys/ucontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h /usr/include/bits/ss_flags.h \ + /usr/include/bits/types/struct_sigstack.h /usr/include/bits/sigthread.h \ + /usr/include/bits/signal_ext.h /usr/include/bits/types/idtype_t.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /usr/include/c++/16.1.1/atomic \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/wthelper.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vk_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/ltexceptions.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/unittests/vkformat_list.inl diff --git a/ktx/build/tests/CTestTestfile.cmake b/ktx/build/tests/CTestTestfile.cmake new file mode 100644 index 0000000..364aac1 --- /dev/null +++ b/ktx/build/tests/CTestTestfile.cmake @@ -0,0 +1,312 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/unittests[1]_include.cmake") +include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/texturetests[1]_include.cmake") +add_test([=[ktx2check-test.help]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "--help") +set_tests_properties([=[ktx2check-test.help]=] PROPERTIES PASS_REGULAR_EXPRESSION "^Usage: ktx2check" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;7;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.version]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "--version") +set_tests_properties([=[ktx2check-test.version]=] PROPERTIES PASS_REGULAR_EXPRESSION "^ktx2check v[0-9][0-9\\.]+" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;16;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.foobar]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "--foobar") +set_tests_properties([=[ktx2check-test.foobar]=] PROPERTIES PASS_REGULAR_EXPRESSION "^Usage: ktx2check" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;44;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.foobar-exit-code]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "--foobar") +set_tests_properties([=[ktx2check-test.foobar-exit-code]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;52;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.fail-when-last-file-valid]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "../badktx2/bad_typesize.ktx2" "astc_ldr_6x6_arraytex_7.ktx2") +set_tests_properties([=[ktx2check-test.fail-when-last-file-valid]=] PROPERTIES WILL_FAIL "TRUE" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;61;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.all]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check *.ktx2") +set_tests_properties([=[ktx2check-test.all]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;71;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.all-quiet]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check --quiet *.ktx2") +set_tests_properties([=[ktx2check-test.all-quiet]=] PROPERTIES PASS_REGULAR_EXPRESSION "^\$" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;79;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.stdin-read]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check < color_grid_uastc_zstd.ktx2 +") +set_tests_properties([=[ktx2check-test.stdin-read]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;92;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.pipe-read]=] "/usr/bin/bash" "-c" "cat color_grid_uastc_zstd.ktx2 | /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check") +set_tests_properties([=[ktx2check-test.pipe-read]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.invalid-face-count-and-padding]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "invalid_face_count_and_padding.ktx2") +set_tests_properties([=[ktx2check-test.invalid-face-count-and-padding]=] PROPERTIES WILL_FAIL "TRUE" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/badktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;103;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.invalid-face-count-and-padding-quiet]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "--quiet" "invalid_face_count_and_padding.ktx2") +set_tests_properties([=[ktx2check-test.invalid-face-count-and-padding-quiet]=] PROPERTIES PASS_REGULAR_EXPRESSION "^\$" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/badktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;108;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.invalid-face-count-and-padding-quiet-exit-code]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "--quiet" "invalid_face_count_and_padding.ktx2") +set_tests_properties([=[ktx2check-test.invalid-face-count-and-padding-quiet-exit-code]=] PROPERTIES WILL_FAIL "TRUE" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/badktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;112;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.incorrect-mip-layout-and-padding]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "incorrect_mip_layout_and_padding.ktx2") +set_tests_properties([=[ktx2check-test.incorrect-mip-layout-and-padding]=] PROPERTIES WILL_FAIL "TRUE" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/badktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;117;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.incorrect-mip-layout-and-padding-quiet]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "--quiet" "incorrect_mip_layout_and_padding.ktx2") +set_tests_properties([=[ktx2check-test.incorrect-mip-layout-and-padding-quiet]=] PROPERTIES PASS_REGULAR_EXPRESSION "^\$" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/badktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;122;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.incorrect-mip-layout-and-padding-quiet-exit-code]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "incorrect_mip_layout_and_padding.ktx2") +set_tests_properties([=[ktx2check-test.incorrect-mip-layout-and-padding-quiet-exit-code]=] PROPERTIES WILL_FAIL "TRUE" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/badktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;126;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.bad-typesize]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "bad_typesize.ktx2") +set_tests_properties([=[ktx2check-test.bad-typesize]=] PROPERTIES PASS_REGULAR_EXPRESSION "ERROR: typeSize, 1, does not match data described by the DFD." WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/badktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;131;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.bad-typesize-exit-code]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "bad_typesize.ktx2") +set_tests_properties([=[ktx2check-test.bad-typesize-exit-code]=] PROPERTIES WILL_FAIL "TRUE" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/badktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;140;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.no-nul-on-value]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "no_nul_on_kvd_val.ktx2") +set_tests_properties([=[ktx2check-test.no-nul-on-value]=] PROPERTIES PASS_REGULAR_EXPRESSION "WARNING: KTXswizzle value missing encouraged NUL termination." WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/badktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;145;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.no-nul-on-value-exit-code]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "no_nul_on_kvd_val.ktx2") +set_tests_properties([=[ktx2check-test.no-nul-on-value-exit-code]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/badktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;154;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2check-test.no-nul-on-value-warn-as-error-exit-code]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check" "-w" "no_nul_on_kvd_val.ktx2") +set_tests_properties([=[ktx2check-test.no-nul-on-value-warn-as-error-exit-code]=] PROPERTIES WILL_FAIL "TRUE" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/badktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;158;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2check-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;32;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.help]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2" "--help") +set_tests_properties([=[ktx2ktx2-test.help]=] PROPERTIES PASS_REGULAR_EXPRESSION "^Usage: ktx2ktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;7;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.version]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2" "--version") +set_tests_properties([=[ktx2ktx2-test.version]=] PROPERTIES PASS_REGULAR_EXPRESSION "^ktx2ktx2 v[0-9][0-9\\.]+" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;16;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.foobar]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2" "--foobar") +set_tests_properties([=[ktx2ktx2-test.foobar]=] PROPERTIES PASS_REGULAR_EXPRESSION "^Usage: ktx2ktx2" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;29;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.foobar-exit-code]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2" "--foobar") +set_tests_properties([=[ktx2ktx2-test.foobar-exit-code]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;37;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.many-in-one-out]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2" "-o" "foo" "a.ktx" "b.ktx" "c.ktx") +set_tests_properties([=[ktx2ktx2-test.many-in-one-out]=] PROPERTIES PASS_REGULAR_EXPRESSION "^Can't use -o when there are multiple infiles." _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;46;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.many-in-one-out-exit-code]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2" "-o" "foo" "a.ktx" "b.ktx" "c.ktx") +set_tests_properties([=[ktx2ktx2-test.many-in-one-out-exit-code]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;55;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.ktx2-in]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2" "-o" "foo" "CesiumLogoFlat.ktx2") +set_tests_properties([=[ktx2ktx2-test.ktx2-in]=] PROPERTIES PASS_REGULAR_EXPRESSION ".* is not a KTX v1 file." WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;66;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.ktx2-in-exit-code]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2" "-o" "foo" "CesiumLogoFlat.ktx2") +set_tests_properties([=[ktx2ktx2-test.ktx2-in-exit-code]=] PROPERTIES WILL_FAIL "TRUE" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;75;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-2d-uncompressed]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f -o ktx2ktx2.orient-down-metadata-u.ktx2 orient-down-metadata.ktx && diff orient-down-metadata-u.ktx2 ktx2ktx2.orient-down-metadata-u.ktx2 && rm ktx2ktx2.orient-down-metadata-u.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-2d-uncompressed]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;87;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;104;cnvrtcmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-2d-bc2]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f -o ktx2ktx2.pattern_02_bc2.ktx2 pattern_02_bc2.ktx && diff pattern_02_bc2.ktx2 ktx2ktx2.pattern_02_bc2.ktx2 && rm ktx2ktx2.pattern_02_bc2.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-2d-bc2]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;87;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;105;cnvrtcmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-2d-array-astc]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f -o ktx2ktx2.texturearray_astc_8x8_unorm.ktx2 texturearray_astc_8x8_unorm.ktx && diff texturearray_astc_8x8_unorm.ktx2 ktx2ktx2.texturearray_astc_8x8_unorm.ktx2 && rm ktx2ktx2.texturearray_astc_8x8_unorm.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-2d-array-astc]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;87;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;106;cnvrtcmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-implied-out-2d-bc2]=] "/usr/bin/bash" "-c" "cp pattern_02_bc2.ktx ktx2ktx2.ip.pattern_02_bc2.ktx && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f ktx2ktx2.ip.pattern_02_bc2.ktx && rm ktx2ktx2.ip.pattern_02_bc2.ktx && diff pattern_02_bc2.ktx2 ktx2ktx2.ip.pattern_02_bc2.ktx2 && rm ktx2ktx2.ip.pattern_02_bc2.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-implied-out-2d-bc2]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;108;cnvrtcmpktx_implied_out;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-unicode-file-hu]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f -o ktx2ktx2.hűtő.ktx2 hűtő.ktx && diff hűtő.ktx2 ktx2ktx2.hűtő.ktx2 && rm ktx2ktx2.hűtő.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-unicode-file-hu]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;87;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;110;cnvrtcmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-unicode-file-jp]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f -o ktx2ktx2.テクスチャ.ktx2 テクスチャ.ktx && diff テクスチャ.ktx2 ktx2ktx2.テクスチャ.ktx2 && rm ktx2ktx2.テクスチャ.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-unicode-file-jp]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;87;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;111;cnvrtcmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-unicode-file-ar]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f -o ktx2ktx2.نَسِيج.ktx2 نَسِيج.ktx && diff نَسِيج.ktx2 ktx2ktx2.نَسِيج.ktx2 && rm ktx2ktx2.نَسِيج.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-unicode-file-ar]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;87;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;112;cnvrtcmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-unicode-file-zh]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f -o ktx2ktx2.质地.ktx2 质地.ktx && diff 质地.ktx2 ktx2ktx2.质地.ktx2 && rm ktx2ktx2.质地.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-unicode-file-zh]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;87;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;113;cnvrtcmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-unicode-file-ko]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f -o ktx2ktx2.조직.ktx2 조직.ktx && diff 조직.ktx2 ktx2ktx2.조직.ktx2 && rm ktx2ktx2.조직.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-unicode-file-ko]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;87;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;114;cnvrtcmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-implied-out-unicode-file-hu]=] "/usr/bin/bash" "-c" "cp hűtő.ktx ktx2ktx2.ip.hűtő.ktx && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f ktx2ktx2.ip.hűtő.ktx && rm ktx2ktx2.ip.hűtő.ktx && diff hűtő.ktx2 ktx2ktx2.ip.hűtő.ktx2 && rm ktx2ktx2.ip.hűtő.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-implied-out-unicode-file-hu]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;116;cnvrtcmpktx_implied_out;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-implied-out-unicode-file-jp]=] "/usr/bin/bash" "-c" "cp テクスチャ.ktx ktx2ktx2.ip.テクスチャ.ktx && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f ktx2ktx2.ip.テクスチャ.ktx && rm ktx2ktx2.ip.テクスチャ.ktx && diff テクスチャ.ktx2 ktx2ktx2.ip.テクスチャ.ktx2 && rm ktx2ktx2.ip.テクスチャ.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-implied-out-unicode-file-jp]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;117;cnvrtcmpktx_implied_out;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-implied-out-unicode-file-ar]=] "/usr/bin/bash" "-c" "cp نَسِيج.ktx ktx2ktx2.ip.نَسِيج.ktx && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f ktx2ktx2.ip.نَسِيج.ktx && rm ktx2ktx2.ip.نَسِيج.ktx && diff نَسِيج.ktx2 ktx2ktx2.ip.نَسِيج.ktx2 && rm ktx2ktx2.ip.نَسِيج.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-implied-out-unicode-file-ar]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;118;cnvrtcmpktx_implied_out;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-implied-out-unicode-file-zh]=] "/usr/bin/bash" "-c" "cp 质地.ktx ktx2ktx2.ip.质地.ktx && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f ktx2ktx2.ip.质地.ktx && rm ktx2ktx2.ip.质地.ktx && diff 质地.ktx2 ktx2ktx2.ip.质地.ktx2 && rm ktx2ktx2.ip.质地.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-implied-out-unicode-file-zh]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;119;cnvrtcmpktx_implied_out;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktx2ktx2-test.cnvrt-implied-out-unicode-file-ko]=] "/usr/bin/bash" "-c" "cp 조직.ktx ktx2ktx2.ip.조직.ktx && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2 --test -f ktx2ktx2.ip.조직.ktx && rm ktx2ktx2.ip.조직.ktx && diff 조직.ktx2 ktx2ktx2.ip.조직.ktx2 && rm ktx2ktx2.ip.조직.ktx2") +set_tests_properties([=[ktx2ktx2-test.cnvrt-implied-out-unicode-file-ko]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;120;cnvrtcmpktx_implied_out;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktx2ktx2-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;33;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.help]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc" "--help") +set_tests_properties([=[ktxsc-test.help]=] PROPERTIES PASS_REGULAR_EXPRESSION "^Usage: ktxsc" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;10;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.version]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc" "--version") +set_tests_properties([=[ktxsc-test.version]=] PROPERTIES PASS_REGULAR_EXPRESSION "^ktxsc v[0-9][0-9\\.]+" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;19;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.foobar]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc" "--foobar") +set_tests_properties([=[ktxsc-test.foobar]=] PROPERTIES PASS_REGULAR_EXPRESSION "^Usage: ktxsc" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;32;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.foobar-exit-code]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc" "--foobar") +set_tests_properties([=[ktxsc-test.foobar-exit-code]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;40;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.many-in-one-out]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc" "-o" "foo" "a.ktx2" "b.ktx2" "c.ktx2") +set_tests_properties([=[ktxsc-test.many-in-one-out]=] PROPERTIES PASS_REGULAR_EXPRESSION "^Can't use -o when there are multiple infiles." _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;49;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.many-in-one-out-exit-code]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc" "-o" "foo" "a.ktx2" "b.ktx2" "c.ktx2") +set_tests_properties([=[ktxsc-test.many-in-one-out-exit-code]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;58;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.ktx1-in]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc" "--zcmp" "5" "-o" "foo" "orient-up-metadata.ktx") +set_tests_properties([=[ktxsc-test.ktx1-in]=] PROPERTIES PASS_REGULAR_EXPRESSION ".* is not a KTX v2 file." WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;69;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.ktx1-in-exit-code]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc" "--zcmp" "5" "-o" "foo" "orient-up-metadata.ktx") +set_tests_properties([=[ktxsc-test.ktx1-in-exit-code]=] PROPERTIES WILL_FAIL "TRUE" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;78;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.zcmp-cubemap]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 -o ktxsc.skybox_zstd.ktx2 skybox.ktx2 && diff skybox_zstd.ktx2 ktxsc.skybox_zstd.ktx2 && rm ktxsc.skybox_zstd.ktx2") +set_tests_properties([=[ktxsc-test.zcmp-cubemap]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;90;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;112;sccmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.inplace-curdir-zcmp-cubemap]=] "/usr/bin/bash" "-c" "cp skybox.ktx2 ktxsc.ip1.skybox_zstd.ktx2 && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 ktxsc.ip1.skybox_zstd.ktx2 && diff skybox_zstd.ktx2 ktxsc.ip1.skybox_zstd.ktx2 && rm ktxsc.ip1.skybox_zstd.ktx2") +set_tests_properties([=[ktxsc-test.inplace-curdir-zcmp-cubemap]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;113;sccmpktxinplacecurdir;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.inplace-diffdir-zcmp_cubemap]=] "/usr/bin/bash" "-c" "cp skybox.ktx2 ktxsc.ip2.skybox_zstd.ktx2 && pushd ../.. && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages/ktxsc.ip2.skybox_zstd.ktx2 && popd && diff skybox_zstd.ktx2 ktxsc.ip2.skybox_zstd.ktx2 && rm ktxsc.ip2.skybox_zstd.ktx2") +set_tests_properties([=[ktxsc-test.inplace-diffdir-zcmp_cubemap]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;106;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;114;sccmpktxinplacediffdir;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.inplace-curdir-unicode-file-hu]=] "/usr/bin/bash" "-c" "cp hűtő.ktx2 ktxsc.ip1.hűtő_zstd.ktx2 && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 ktxsc.ip1.hűtő_zstd.ktx2 && diff hűtő_zstd.ktx2 ktxsc.ip1.hűtő_zstd.ktx2 && rm ktxsc.ip1.hűtő_zstd.ktx2") +set_tests_properties([=[ktxsc-test.inplace-curdir-unicode-file-hu]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;115;sccmpktxinplacecurdir;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.inplace-curdir-unicode-file-jp]=] "/usr/bin/bash" "-c" "cp テクスチャ.ktx2 ktxsc.ip1.テクスチャ_zstd.ktx2 && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 ktxsc.ip1.テクスチャ_zstd.ktx2 && diff テクスチャ_zstd.ktx2 ktxsc.ip1.テクスチャ_zstd.ktx2 && rm ktxsc.ip1.テクスチャ_zstd.ktx2") +set_tests_properties([=[ktxsc-test.inplace-curdir-unicode-file-jp]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;116;sccmpktxinplacecurdir;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.inplace-curdir-unicode-file-ar]=] "/usr/bin/bash" "-c" "cp نَسِيج.ktx2 ktxsc.ip1.نَسِيج_zstd.ktx2 && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 ktxsc.ip1.نَسِيج_zstd.ktx2 && diff نَسِيج_zstd.ktx2 ktxsc.ip1.نَسِيج_zstd.ktx2 && rm ktxsc.ip1.نَسِيج_zstd.ktx2") +set_tests_properties([=[ktxsc-test.inplace-curdir-unicode-file-ar]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;117;sccmpktxinplacecurdir;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.inplace-curdir-unicode-file-zh]=] "/usr/bin/bash" "-c" "cp 质地.ktx2 ktxsc.ip1.质地_zstd.ktx2 && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 ktxsc.ip1.质地_zstd.ktx2 && diff 质地_zstd.ktx2 ktxsc.ip1.质地_zstd.ktx2 && rm ktxsc.ip1.质地_zstd.ktx2") +set_tests_properties([=[ktxsc-test.inplace-curdir-unicode-file-zh]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;118;sccmpktxinplacecurdir;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.inplace-curdir-unicode-file-ko]=] "/usr/bin/bash" "-c" "cp 조직.ktx2 ktxsc.ip1.조직_zstd.ktx2 && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 ktxsc.ip1.조직_zstd.ktx2 && diff 조직_zstd.ktx2 ktxsc.ip1.조직_zstd.ktx2 && rm ktxsc.ip1.조직_zstd.ktx2") +set_tests_properties([=[ktxsc-test.inplace-curdir-unicode-file-ko]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;98;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;119;sccmpktxinplacecurdir;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.inplace-diffdir-unicode-file-hu]=] "/usr/bin/bash" "-c" "cp hűtő.ktx2 ktxsc.ip2.hűtő_zstd.ktx2 && pushd ../.. && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages/ktxsc.ip2.hűtő_zstd.ktx2 && popd && diff hűtő_zstd.ktx2 ktxsc.ip2.hűtő_zstd.ktx2 && rm ktxsc.ip2.hűtő_zstd.ktx2") +set_tests_properties([=[ktxsc-test.inplace-diffdir-unicode-file-hu]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;106;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;120;sccmpktxinplacediffdir;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.inplace-diffdir-unicode-file-jp]=] "/usr/bin/bash" "-c" "cp テクスチャ.ktx2 ktxsc.ip2.テクスチャ_zstd.ktx2 && pushd ../.. && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages/ktxsc.ip2.テクスチャ_zstd.ktx2 && popd && diff テクスチャ_zstd.ktx2 ktxsc.ip2.テクスチャ_zstd.ktx2 && rm ktxsc.ip2.テクスチャ_zstd.ktx2") +set_tests_properties([=[ktxsc-test.inplace-diffdir-unicode-file-jp]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;106;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;121;sccmpktxinplacediffdir;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.inplace-diffdir-unicode-file-ar]=] "/usr/bin/bash" "-c" "cp نَسِيج.ktx2 ktxsc.ip2.نَسِيج_zstd.ktx2 && pushd ../.. && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages/ktxsc.ip2.نَسِيج_zstd.ktx2 && popd && diff نَسِيج_zstd.ktx2 ktxsc.ip2.نَسِيج_zstd.ktx2 && rm ktxsc.ip2.نَسِيج_zstd.ktx2") +set_tests_properties([=[ktxsc-test.inplace-diffdir-unicode-file-ar]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;106;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;122;sccmpktxinplacediffdir;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.inplace-diffdir-unicode-file-zh]=] "/usr/bin/bash" "-c" "cp 质地.ktx2 ktxsc.ip2.质地_zstd.ktx2 && pushd ../.. && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages/ktxsc.ip2.质地_zstd.ktx2 && popd && diff 质地_zstd.ktx2 ktxsc.ip2.质地_zstd.ktx2 && rm ktxsc.ip2.质地_zstd.ktx2") +set_tests_properties([=[ktxsc-test.inplace-diffdir-unicode-file-zh]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;106;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;123;sccmpktxinplacediffdir;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[ktxsc-test.inplace-diffdir-unicode-file-ko]=] "/usr/bin/bash" "-c" "cp 조직.ktx2 ktxsc.ip2.조직_zstd.ktx2 && pushd ../.. && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc --test --zcmp 5 /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages/ktxsc.ip2.조직_zstd.ktx2 && popd && diff 조직_zstd.ktx2 ktxsc.ip2.조직_zstd.ktx2 && rm ktxsc.ip2.조직_zstd.ktx2") +set_tests_properties([=[ktxsc-test.inplace-diffdir-unicode-file-ko]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;106;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;124;sccmpktxinplacediffdir;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxsc-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;34;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.help]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--help") +set_tests_properties([=[toktx-test.help]=] PROPERTIES _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;4;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.version]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--version") +set_tests_properties([=[toktx-test.version]=] PROPERTIES PASS_REGULAR_EXPRESSION "^toktx v[0-9\\.]+" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;8;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.foobar]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--foobar") +set_tests_properties([=[toktx-test.foobar]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;17;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.automipmap-mipmaps]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--automipmap" "--mipmaps" "a" "b") +set_tests_properties([=[toktx-test.automipmap-mipmaps]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;21;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.alpha]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--alpha" "a" "b") +set_tests_properties([=[toktx-test.alpha]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;24;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.luminance]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--luminance" "a" "b") +set_tests_properties([=[toktx-test.luminance]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;27;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.zcmp-bcmp]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--zcmp" "--bcmp" "a" "b") +set_tests_properties([=[toktx-test.zcmp-bcmp]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;30;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.bcmp-uastc]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--bcmp" "--uastc" "a" "b") +set_tests_properties([=[toktx-test.bcmp-uastc]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;33;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.scale-resize]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--scale" "0.5" "--resize" "10x40" "a" "b") +set_tests_properties([=[toktx-test.scale-resize]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;36;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.mipmap-resize]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--mipmap" "--resize" "10x40" "a" "b" "c") +set_tests_properties([=[toktx-test.mipmap-resize]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;39;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.only-max-endpoints]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--max_endpoints" "5000" "a" "b") +set_tests_properties([=[toktx-test.only-max-endpoints]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;42;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.only-max-selectors]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--max_selectors" "6000" "a" "b") +set_tests_properties([=[toktx-test.only-max-selectors]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;45;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.swizzle-gt-4]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--swizzle" "rgbargba" "a" "b") +set_tests_properties([=[toktx-test.swizzle-gt-4]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;49;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.invalid-swizzle-char]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--swizzle" "rrrh" "a" "b") +set_tests_properties([=[toktx-test.invalid-swizzle-char]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;53;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.invalid-target-type]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--target_type" "RGBH" "a" "b") +set_tests_properties([=[toktx-test.invalid-target-type]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;57;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.set-oetf-second-file-no-error]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--lower_left_maps_to_s0t0" "--mipmap" "--nometadata" "--assign_oetf" "linear" "--" "-" "../srcimages/level0.ppm" "../srcimages/level1.ppm" "../srcimages/level2.ppm" "../srcimages/level3.ppm" "../srcimages/level4.ppm" "../srcimages/level5.ppm" "../srcimages/level6.ppm") +set_tests_properties([=[toktx-test.set-oetf-second-file-no-error]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;61;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.convert-oetf-second-file-no-error]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--lower_left_maps_to_s0t0" "--mipmap" "--nometadata" "--convert_oetf" "linear" "--" "-" "../srcimages/level0.ppm" "../srcimages/level1.ppm" "../srcimages/level2.ppm" "../srcimages/level3.ppm" "../srcimages/level4.ppm" "../srcimages/level5.ppm" "../srcimages/level6.ppm") +set_tests_properties([=[toktx-test.convert-oetf-second-file-no-error]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;66;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.change-target-type-second-file-no-error]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--lower_left_maps_to_s0t0" "--mipmap" "--nometadata" "--target_type" "RGBA" "--" "-" "../srcimages/level0.ppm" "../srcimages/level1.ppm" "../srcimages/level2.ppm" "../srcimages/level3.ppm" "../srcimages/level4.ppm" "../srcimages/level5.ppm" "../srcimages/level6.ppm") +set_tests_properties([=[toktx-test.change-target-type-second-file-no-error]=] PROPERTIES WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;71;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.different-colortype-second-file-error]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--lower_left_maps_to_s0t0" "--mipmap" "--nometadata" "--" "-" "../srcimages/level0.ppm" "../srcimages/level1-alpha.pam" "../srcimages/level2.ppm" "../srcimages/level3.ppm" "../srcimages/level4.ppm" "../srcimages/level5.ppm" "../srcimages/level6.ppm") +set_tests_properties([=[toktx-test.different-colortype-second-file-error]=] PROPERTIES WILL_FAIL "TRUE" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;76;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.different-colortype-second-file-warning]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--lower_left_maps_to_s0t0" "--mipmap" "--nometadata" "--target_type" "RGBA" "--" "-" "../srcimages/level0.ppm" "../srcimages/level1-alpha.pam" "../srcimages/level2.ppm" "../srcimages/level3.ppm" "../srcimages/level4.ppm" "../srcimages/level5.ppm" "../srcimages/level6.ppm") +set_tests_properties([=[toktx-test.different-colortype-second-file-warning]=] PROPERTIES PASS_REGULAR_EXPRESSION "^toktx warning! Image in ../srcimages/level1-alpha.pam\\(0,0\\) has a different component count" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;81;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.depth-layers]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--depth" "4" "--layers" "4" "a" "b" "c" "d" "e") +set_tests_properties([=[toktx-test.depth-layers]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;86;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.depth-genmipmap]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--test" "--depth" "7" "--genmipmap" "--t2" "3dtex_7_mipmap_reference_u.ktx2" "../srcimages/red16.png" "../srcimages/orange16.png" "../srcimages/yellow16.png" "../srcimages/green16.png" "../srcimages/blue16.png" "../srcimages/indigo16.png" "../srcimages/violet16.png") +set_tests_properties([=[toktx-test.depth-genmipmap]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;90;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.layers-lt-one]=] "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx" "--layers" "0" "a" "b") +set_tests_properties([=[toktx-test.layers-lt-one]=] PROPERTIES WILL_FAIL "TRUE" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;94;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-rgb-reference]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --lower_left_maps_to_s0t0 --nometadata toktx.rgb-reference.ktx ../srcimages/rgb.ppm && diff rgb-reference.ktx toktx.rgb-reference.ktx && rm toktx.rgb-reference.ktx") +set_tests_properties([=[toktx-test.cmp-rgb-reference]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;147;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-rgb-amg-reference]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --automipmap --lower_left_maps_to_s0t0 --linear --nometadata toktx.rgb-amg-reference.ktx ../srcimages/rgb.ppm && diff rgb-amg-reference.ktx toktx.rgb-amg-reference.ktx && rm toktx.rgb-amg-reference.ktx") +set_tests_properties([=[toktx-test.cmp-rgb-amg-reference]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;148;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-orient-up]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test toktx.orient-up.ktx ../srcimages/up.ppm && diff orient-up.ktx toktx.orient-up.ktx && rm toktx.orient-up.ktx") +set_tests_properties([=[toktx-test.cmp-orient-up]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=--lower_left_maps_to_s0t0 --nometadata" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;149;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-orient-up-metadata]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --lower_left_maps_to_s0t0 toktx.orient-up-metadata.ktx ../srcimages/up.ppm && diff orient-up-metadata.ktx toktx.orient-up-metadata.ktx && rm toktx.orient-up-metadata.ktx") +set_tests_properties([=[toktx-test.cmp-orient-up-metadata]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;150;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-orient-down-metadata]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test toktx.orient-down-metadata.ktx ../srcimages/up.ppm && diff orient-down-metadata.ktx toktx.orient-down-metadata.ktx && rm toktx.orient-down-metadata.ktx") +set_tests_properties([=[toktx-test.cmp-orient-down-metadata]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;152;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-rgba-reference]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --lower_left_maps_to_s0t0 --nometadata toktx.rgba-reference.ktx ../srcimages/rgba.pam && diff rgba-reference.ktx toktx.rgba-reference.ktx && rm toktx.rgba-reference.ktx") +set_tests_properties([=[toktx-test.cmp-rgba-reference]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;153;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-rgb-mipmap-reference]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --lower_left_maps_to_s0t0 --mipmap --nometadata toktx.rgb-mipmap-reference.ktx ../srcimages/level0.ppm ../srcimages/level1.ppm ../srcimages/level2.ppm ../srcimages/level3.ppm ../srcimages/level4.ppm ../srcimages/level5.ppm ../srcimages/level6.ppm && diff rgb-mipmap-reference.ktx toktx.rgb-mipmap-reference.ktx && rm toktx.rgb-mipmap-reference.ktx") +set_tests_properties([=[toktx-test.cmp-rgb-mipmap-reference]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;154;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-rgb-mipmap-reference-u]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 --mipmap toktx.rgb-mipmap-reference-u.ktx2 ../srcimages/level0.ppm ../srcimages/level1.ppm ../srcimages/level2.ppm ../srcimages/level3.ppm ../srcimages/level4.ppm ../srcimages/level5.ppm ../srcimages/level6.ppm && diff rgb-mipmap-reference-u.ktx2 toktx.rgb-mipmap-reference-u.ktx2 && rm toktx.rgb-mipmap-reference-u.ktx2") +set_tests_properties([=[toktx-test.cmp-rgb-mipmap-reference-u]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;155;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-cimg5293_uastc]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --uastc --genmipmap --test toktx.cimg5293_uastc.ktx2 ../srcimages/CIMG5293.jpg && diff cimg5293_uastc.ktx2 toktx.cimg5293_uastc.ktx2 && rm toktx.cimg5293_uastc.ktx2") +set_tests_properties([=[toktx-test.cmp-cimg5293_uastc]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;168;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-cimg5293_uastc_zstd]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --zcmp --uastc --genmipmap --test toktx.cimg5293_uastc_zstd.ktx2 ../srcimages/CIMG5293.jpg && diff cimg5293_uastc_zstd.ktx2 toktx.cimg5293_uastc_zstd.ktx2 && rm toktx.cimg5293_uastc_zstd.ktx2") +set_tests_properties([=[toktx-test.cmp-cimg5293_uastc_zstd]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;169;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-16bit_png_uastc]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --uastc 1 --nowarn toktx.camera_camera_BaseColor_uastc.ktx2 ../srcimages/camera_camera_BaseColor_16bit.png && diff camera_camera_BaseColor_uastc.ktx2 toktx.camera_camera_BaseColor_uastc.ktx2 && rm toktx.camera_camera_BaseColor_uastc.ktx2") +set_tests_properties([=[toktx-test.cmp-16bit_png_uastc]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;170;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-luminance_reference_u]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 --convert_oetf linear toktx.luminance_reference_u.ktx2 ../srcimages/luminance.pgm && diff luminance_reference_u.ktx2 toktx.luminance_reference_u.ktx2 && rm toktx.luminance_reference_u.ktx2") +set_tests_properties([=[toktx-test.cmp-luminance_reference_u]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;173;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-luminance_reference_uastc]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 --uastc -- toktx.luminance_reference_uastc.ktx2 ../srcimages/luminance.pgm && diff luminance_reference_uastc.ktx2 toktx.luminance_reference_uastc.ktx2 && rm toktx.luminance_reference_uastc.ktx2") +set_tests_properties([=[toktx-test.cmp-luminance_reference_uastc]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;174;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-luminance_alpha_reference_u]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 toktx.luminance_alpha_reference_u.ktx2 ../srcimages/basn4a08.png && diff luminance_alpha_reference_u.ktx2 toktx.luminance_alpha_reference_u.ktx2 && rm toktx.luminance_alpha_reference_u.ktx2") +set_tests_properties([=[toktx-test.cmp-luminance_alpha_reference_u]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;179;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-luminance_alpha_reference_uastc]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 --uastc -- toktx.luminance_alpha_reference_uastc.ktx2 ../srcimages/basn4a08.png && diff luminance_alpha_reference_uastc.ktx2 toktx.luminance_alpha_reference_uastc.ktx2 && rm toktx.luminance_alpha_reference_uastc.ktx2") +set_tests_properties([=[toktx-test.cmp-luminance_alpha_reference_uastc]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;180;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-r_reference_u]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 --convert_oetf linear --target_type R toktx.r_reference_u.ktx2 ../srcimages/luminance.pgm && diff r_reference_u.ktx2 toktx.r_reference_u.ktx2 && rm toktx.r_reference_u.ktx2") +set_tests_properties([=[toktx-test.cmp-r_reference_u]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;184;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-r_reference_uastc]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 --uastc --target_type R --swizzle r001 -- toktx.r_reference_uastc.ktx2 ../srcimages/luminance.pgm && diff r_reference_uastc.ktx2 toktx.r_reference_uastc.ktx2 && rm toktx.r_reference_uastc.ktx2") +set_tests_properties([=[toktx-test.cmp-r_reference_uastc]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;185;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-rg_reference_u]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 --convert_oetf linear --target_type RG toktx.rg_reference_u.ktx2 ../srcimages/basn4a08.png && diff rg_reference_u.ktx2 toktx.rg_reference_u.ktx2 && rm toktx.rg_reference_u.ktx2") +set_tests_properties([=[toktx-test.cmp-rg_reference_u]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;190;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-rg_reference_uastc]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 --uastc --target_type RG --swizzle rg01 -- toktx.rg_reference_uastc.ktx2 ../srcimages/basn4a08.png && diff rg_reference_uastc.ktx2 toktx.rg_reference_uastc.ktx2 && rm toktx.rg_reference_uastc.ktx2") +set_tests_properties([=[toktx-test.cmp-rg_reference_uastc]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;191;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-swizzle_r_to_g_u]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --nowarn --t2 --input_swizzle 0r01 toktx.green_rgb_reference_u.ktx2 ../srcimages/level0.ppm && diff green_rgb_reference_u.ktx2 toktx.green_rgb_reference_u.ktx2 && rm toktx.green_rgb_reference_u.ktx2") +set_tests_properties([=[toktx-test.cmp-swizzle_r_to_g_u]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;197;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-swizzle_r_to_gb_convert_to_rgba_u]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --nowarn --t2 --input_swizzle 0rr1 --target_type RGBA toktx.cyan_rgba_reference_u.ktx2 ../srcimages/level0.ppm && diff cyan_rgba_reference_u.ktx2 toktx.cyan_rgba_reference_u.ktx2 && rm toktx.cyan_rgba_reference_u.ktx2") +set_tests_properties([=[toktx-test.cmp-swizzle_r_to_gb_convert_to_rgba_u]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;198;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-swizzle_r_to_gb_convert_to_rgba_basis]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --nowarn --t2 --input_swizzle 0rr1 --target_type RGBA --bcmp toktx.cyan_rgb_reference_basis.ktx2 ../srcimages/level0.ppm && diff cyan_rgb_reference_basis.ktx2 toktx.cyan_rgb_reference_basis.ktx2 && rm toktx.cyan_rgb_reference_basis.ktx2") +set_tests_properties([=[toktx-test.cmp-swizzle_r_to_gb_convert_to_rgba_basis]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;200;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-swizzle_r_to_gb_convert_to_rgba_uastc]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --nowarn --t2 --input_swizzle 0rr1 --target_type RGBA --uastc -- toktx.cyan_rgb_reference_uastc.ktx2 ../srcimages/level0.ppm && diff cyan_rgb_reference_uastc.ktx2 toktx.cyan_rgb_reference_uastc.ktx2 && rm toktx.cyan_rgb_reference_uastc.ktx2") +set_tests_properties([=[toktx-test.cmp-swizzle_r_to_gb_convert_to_rgba_uastc]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;201;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-uastc_Iron_Bars_001_normal]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --assign_oetf linear --genmipmap --normalize --normal_mode --encode uastc --zcmp 5 toktx.uastc_Iron_Bars_001_normal.ktx2 ../srcimages/Iron_Bars/Iron_Bars_001_normal_unnormalized.png && diff uastc_Iron_Bars_001_normal.ktx2 toktx.uastc_Iron_Bars_001_normal.ktx2 && rm toktx.uastc_Iron_Bars_001_normal.ktx2") +set_tests_properties([=[toktx-test.cmp-uastc_Iron_Bars_001_normal]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;204;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-gAMA_chunk_png]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 --convert_oetf srgb toktx.g03n2c08.ktx2 ../srcimages/g03n2c08.png && diff g03n2c08.ktx2 toktx.g03n2c08.ktx2 && rm toktx.g03n2c08.ktx2") +set_tests_properties([=[toktx-test.cmp-gAMA_chunk_png]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;210;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-cHRM_chunk_png]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 toktx.ccwn2c08.ktx2 ../srcimages/ccwn2c08.png && diff ccwn2c08.ktx2 toktx.ccwn2c08.ktx2 && rm toktx.ccwn2c08.ktx2") +set_tests_properties([=[toktx-test.cmp-cHRM_chunk_png]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;211;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-tRNS_chunk_rgb_png]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 toktx.tbrn2c08.ktx2 ../srcimages/tbrn2c08.png && diff tbrn2c08.ktx2 toktx.tbrn2c08.ktx2 && rm toktx.tbrn2c08.ktx2") +set_tests_properties([=[toktx-test.cmp-tRNS_chunk_rgb_png]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;212;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-tRNS_chunk_palette_8-bit_png]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 toktx.tbyn3p08.ktx2 ../srcimages/tbyn3p08.png && diff tbyn3p08.ktx2 toktx.tbyn3p08.ktx2 && rm toktx.tbyn3p08.ktx2") +set_tests_properties([=[toktx-test.cmp-tRNS_chunk_palette_8-bit_png]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;213;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-tRNS_chunk_palette_2-bit_png]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --t2 toktx.tm3n3p02.ktx2 ../srcimages/tm3n3p02.png && diff tm3n3p02.ktx2 toktx.tm3n3p02.ktx2 && rm toktx.tm3n3p02.ktx2") +set_tests_properties([=[toktx-test.cmp-tRNS_chunk_palette_2-bit_png]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;214;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-rgb-mipmap-reference-list]=] "/usr/bin/bash" "-c" "printf \"../srcimages/level0.ppm\\n../srcimages/level1.ppm\\n../srcimages/level2.ppm\\n../srcimages/level3.ppm\\n../srcimages/level4.ppm\\n../srcimages/level5.ppm\\n../srcimages/level6.ppm\" > toktx.filelist.txt && /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --lower_left_maps_to_s0t0 --mipmap --nometadata toktx.rgb-mipmap-reference.ktx @toktx.filelist.txt && diff rgb-mipmap-reference.ktx toktx.rgb-mipmap-reference.ktx && rm toktx.rgb-mipmap-reference.ktx; rm toktx.filelist.txt") +set_tests_properties([=[toktx-test.cmp-rgb-mipmap-reference-list]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;128;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;215;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-rgb-reference-2]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --nometadata - ../srcimages/rgb.ppm > toktx-test.cmp-rgb-reference-2.ktx && diff rgb-reference.ktx toktx-test.cmp-rgb-reference-2.ktx; rm toktx-test.cmp-rgb-reference-2.ktx") +set_tests_properties([=[toktx-test.cmp-rgb-reference-2]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=--lower_left_maps_to_s0t0" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;224;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_cubemap_6x6]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 6x6 --genmipmap --cubemap toktx.astc_mipmap_ldr_cubemap_6x6.ktx2 ../srcimages/Yokohama3/posx.jpg ../srcimages/Yokohama3/negx.jpg ../srcimages/Yokohama3/posy.jpg ../srcimages/Yokohama3/negy.jpg ../srcimages/Yokohama3/posz.jpg ../srcimages/Yokohama3/negz.jpg && diff astc_mipmap_ldr_cubemap_6x6.ktx2 toktx.astc_mipmap_ldr_cubemap_6x6.ktx2 && rm toktx.astc_mipmap_ldr_cubemap_6x6.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_cubemap_6x6]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;239;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_cubemap_6x6]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 6x6 --cubemap toktx.astc_ldr_cubemap_6x6.ktx2 ../srcimages/Yokohama3/posx.jpg ../srcimages/Yokohama3/negx.jpg ../srcimages/Yokohama3/posy.jpg ../srcimages/Yokohama3/negy.jpg ../srcimages/Yokohama3/posz.jpg ../srcimages/Yokohama3/negz.jpg && diff astc_ldr_cubemap_6x6.ktx2 toktx.astc_ldr_cubemap_6x6.ktx2 && rm toktx.astc_ldr_cubemap_6x6.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_cubemap_6x6]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;241;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_6x6_posx]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 6x6 toktx.astc_ldr_6x6_posx.ktx2 ../srcimages/Yokohama3/posx.jpg && diff astc_ldr_6x6_posx.ktx2 toktx.astc_ldr_6x6_posx.ktx2 && rm toktx.astc_ldr_6x6_posx.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_6x6_posx]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;243;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_6x6_posx]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 6x6 --genmipmap toktx.astc_mipmap_ldr_6x6_posx.ktx2 ../srcimages/Yokohama3/posx.jpg && diff astc_mipmap_ldr_6x6_posx.ktx2 toktx.astc_mipmap_ldr_6x6_posx.ktx2 && rm toktx.astc_mipmap_ldr_6x6_posx.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_6x6_posx]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;245;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_6x6_posz]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 6x6 --genmipmap toktx.astc_mipmap_ldr_6x6_posz.ktx2 ../srcimages/Yokohama3/posz.jpg && diff astc_mipmap_ldr_6x6_posz.ktx2 toktx.astc_mipmap_ldr_6x6_posz.ktx2 && rm toktx.astc_mipmap_ldr_6x6_posz.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_6x6_posz]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;246;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_6x6_posy]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 6x6 --genmipmap toktx.astc_mipmap_ldr_6x6_posy.ktx2 ../srcimages/Yokohama3/posy.jpg && diff astc_mipmap_ldr_6x6_posy.ktx2 toktx.astc_mipmap_ldr_6x6_posy.ktx2 && rm toktx.astc_mipmap_ldr_6x6_posy.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_6x6_posy]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;247;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_6x6_kodim17_fastest]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 6x6 --genmipmap --astc_quality fastest toktx.astc_mipmap_ldr_6x6_kodim17_fastest.ktx2 ../srcimages/kodim17.png && diff astc_mipmap_ldr_6x6_kodim17_fastest.ktx2 toktx.astc_mipmap_ldr_6x6_kodim17_fastest.ktx2 && rm toktx.astc_mipmap_ldr_6x6_kodim17_fastest.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_6x6_kodim17_fastest]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;248;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_6x6_kodim17_fast]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 6x6 --genmipmap --astc_quality fast toktx.astc_mipmap_ldr_6x6_kodim17_fast.ktx2 ../srcimages/kodim17.png && diff astc_mipmap_ldr_6x6_kodim17_fast.ktx2 toktx.astc_mipmap_ldr_6x6_kodim17_fast.ktx2 && rm toktx.astc_mipmap_ldr_6x6_kodim17_fast.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_6x6_kodim17_fast]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;249;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_6x6_kodim17_medium]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 6x6 --genmipmap --astc_quality medium toktx.astc_mipmap_ldr_6x6_kodim17_medium.ktx2 ../srcimages/kodim17.png && diff astc_mipmap_ldr_6x6_kodim17_medium.ktx2 toktx.astc_mipmap_ldr_6x6_kodim17_medium.ktx2 && rm toktx.astc_mipmap_ldr_6x6_kodim17_medium.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_6x6_kodim17_medium]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;251;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_6x5_posx]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 6x5 --genmipmap toktx.astc_mipmap_ldr_6x5_posx.ktx2 ../srcimages/Yokohama3/posx.jpg && diff astc_mipmap_ldr_6x5_posx.ktx2 toktx.astc_mipmap_ldr_6x5_posx.ktx2 && rm toktx.astc_mipmap_ldr_6x5_posx.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_6x5_posx]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;263;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_8x6_posx]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 8x6 --genmipmap toktx.astc_mipmap_ldr_8x6_posx.ktx2 ../srcimages/Yokohama3/posx.jpg && diff astc_mipmap_ldr_8x6_posx.ktx2 toktx.astc_mipmap_ldr_8x6_posx.ktx2 && rm toktx.astc_mipmap_ldr_8x6_posx.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_8x6_posx]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;264;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_10x5_posx]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 10x5 --genmipmap toktx.astc_mipmap_ldr_10x5_posx.ktx2 ../srcimages/Yokohama3/posx.jpg && diff astc_mipmap_ldr_10x5_posx.ktx2 toktx.astc_mipmap_ldr_10x5_posx.ktx2 && rm toktx.astc_mipmap_ldr_10x5_posx.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_10x5_posx]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;265;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_8x8_posx]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 8x8 --genmipmap toktx.astc_mipmap_ldr_8x8_posx.ktx2 ../srcimages/Yokohama3/posx.jpg && diff astc_mipmap_ldr_8x8_posx.ktx2 toktx.astc_mipmap_ldr_8x8_posx.ktx2 && rm toktx.astc_mipmap_ldr_8x8_posx.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_8x8_posx]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;266;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_12x10_posx]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 12x10 --genmipmap toktx.astc_mipmap_ldr_12x10_posx.ktx2 ../srcimages/Yokohama3/posx.jpg && diff astc_mipmap_ldr_12x10_posx.ktx2 toktx.astc_mipmap_ldr_12x10_posx.ktx2 && rm toktx.astc_mipmap_ldr_12x10_posx.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_12x10_posx]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;267;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_mipmap_ldr_12x12_posx]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 12x12 --genmipmap toktx.astc_mipmap_ldr_12x12_posx.ktx2 ../srcimages/Yokohama3/posx.jpg && diff astc_mipmap_ldr_12x12_posx.ktx2 toktx.astc_mipmap_ldr_12x12_posx.ktx2 && rm toktx.astc_mipmap_ldr_12x12_posx.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_mipmap_ldr_12x12_posx]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;268;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_4x4_FlightHelmet_baseColor]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 4x4 toktx.astc_ldr_4x4_FlightHelmet_baseColor.ktx2 ../srcimages/FlightHelmet_baseColor.png && diff astc_ldr_4x4_FlightHelmet_baseColor.ktx2 toktx.astc_ldr_4x4_FlightHelmet_baseColor.ktx2 && rm toktx.astc_ldr_4x4_FlightHelmet_baseColor.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_4x4_FlightHelmet_baseColor]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;271;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_6x5_FlightHelmet_baseColor]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 6x5 toktx.astc_ldr_6x5_FlightHelmet_baseColor.ktx2 ../srcimages/FlightHelmet_baseColor.png && diff astc_ldr_6x5_FlightHelmet_baseColor.ktx2 toktx.astc_ldr_6x5_FlightHelmet_baseColor.ktx2 && rm toktx.astc_ldr_6x5_FlightHelmet_baseColor.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_6x5_FlightHelmet_baseColor]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;272;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_8x6_FlightHelmet_baseColor]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 8x6 toktx.astc_ldr_8x6_FlightHelmet_baseColor.ktx2 ../srcimages/FlightHelmet_baseColor.png && diff astc_ldr_8x6_FlightHelmet_baseColor.ktx2 toktx.astc_ldr_8x6_FlightHelmet_baseColor.ktx2 && rm toktx.astc_ldr_8x6_FlightHelmet_baseColor.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_8x6_FlightHelmet_baseColor]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;273;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_10x5_FlightHelmet_baseColor]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 10x5 toktx.astc_ldr_10x5_FlightHelmet_baseColor.ktx2 ../srcimages/FlightHelmet_baseColor.png && diff astc_ldr_10x5_FlightHelmet_baseColor.ktx2 toktx.astc_ldr_10x5_FlightHelmet_baseColor.ktx2 && rm toktx.astc_ldr_10x5_FlightHelmet_baseColor.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_10x5_FlightHelmet_baseColor]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;274;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_8x8_FlightHelmet_baseColor]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 8x8 toktx.astc_ldr_8x8_FlightHelmet_baseColor.ktx2 ../srcimages/FlightHelmet_baseColor.png && diff astc_ldr_8x8_FlightHelmet_baseColor.ktx2 toktx.astc_ldr_8x8_FlightHelmet_baseColor.ktx2 && rm toktx.astc_ldr_8x8_FlightHelmet_baseColor.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_8x8_FlightHelmet_baseColor]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;275;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_12x10_FlightHelmet_baseColor]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 12x10 toktx.astc_ldr_12x10_FlightHelmet_baseColor.ktx2 ../srcimages/FlightHelmet_baseColor.png && diff astc_ldr_12x10_FlightHelmet_baseColor.ktx2 toktx.astc_ldr_12x10_FlightHelmet_baseColor.ktx2 && rm toktx.astc_ldr_12x10_FlightHelmet_baseColor.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_12x10_FlightHelmet_baseColor]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;276;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_12x12_FlightHelmet_baseColor]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --encode astc --astc_blk_d 12x12 toktx.astc_ldr_12x12_FlightHelmet_baseColor.ktx2 ../srcimages/FlightHelmet_baseColor.png && diff astc_ldr_12x12_FlightHelmet_baseColor.ktx2 toktx.astc_ldr_12x12_FlightHelmet_baseColor.ktx2 && rm toktx.astc_ldr_12x12_FlightHelmet_baseColor.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_12x12_FlightHelmet_baseColor]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;277;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_6x6_Iron_Bars_001_normal]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --assign_oetf linear --normalize --normal_mode --encode astc --astc_blk_d 6x6 toktx.astc_ldr_6x6_Iron_Bars_001_normal.ktx2 ../srcimages/Iron_Bars/Iron_Bars_001_normal_unnormalized.png && diff astc_ldr_6x6_Iron_Bars_001_normal.ktx2 toktx.astc_ldr_6x6_Iron_Bars_001_normal.ktx2 && rm toktx.astc_ldr_6x6_Iron_Bars_001_normal.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_6x6_Iron_Bars_001_normal]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;278;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_5x4_Iron_Bars_001_normal]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --assign_oetf linear --normalize --normal_mode --encode astc --astc_blk_d 5x4 toktx.astc_ldr_5x4_Iron_Bars_001_normal.ktx2 ../srcimages/Iron_Bars/Iron_Bars_001_normal_unnormalized.png && diff astc_ldr_5x4_Iron_Bars_001_normal.ktx2 toktx.astc_ldr_5x4_Iron_Bars_001_normal.ktx2 && rm toktx.astc_ldr_5x4_Iron_Bars_001_normal.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_5x4_Iron_Bars_001_normal]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;279;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_6x6_arraytex_7]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --layers 7 --encode astc --astc_blk_d 6x6 toktx.astc_ldr_6x6_arraytex_7.ktx2 ../srcimages/red16.png ../srcimages/orange16.png ../srcimages/yellow16.png ../srcimages/green16.png ../srcimages/blue16.png ../srcimages/indigo16.png ../srcimages/violet16.png && diff astc_ldr_6x6_arraytex_7.ktx2 toktx.astc_ldr_6x6_arraytex_7.ktx2 && rm toktx.astc_ldr_6x6_arraytex_7.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_6x6_arraytex_7]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;281;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_6x6_arraytex_7_mipmap]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --layers 7 --encode astc --astc_blk_d 6x6 --genmipmap toktx.astc_ldr_6x6_arraytex_7_mipmap.ktx2 ../srcimages/red16.png ../srcimages/orange16.png ../srcimages/yellow16.png ../srcimages/green16.png ../srcimages/blue16.png ../srcimages/indigo16.png ../srcimages/violet16.png && diff astc_ldr_6x6_arraytex_7_mipmap.ktx2 toktx.astc_ldr_6x6_arraytex_7_mipmap.ktx2 && rm toktx.astc_ldr_6x6_arraytex_7_mipmap.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_6x6_arraytex_7_mipmap]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;282;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-astc_ldr_6x6_3dtex_7]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --depth 7 --encode astc --astc_blk_d 6x6 toktx.astc_ldr_6x6_3dtex_7.ktx2 ../srcimages/red16.png ../srcimages/orange16.png ../srcimages/yellow16.png ../srcimages/green16.png ../srcimages/blue16.png ../srcimages/indigo16.png ../srcimages/violet16.png && diff astc_ldr_6x6_3dtex_7.ktx2 toktx.astc_ldr_6x6_3dtex_7.ktx2 && rm toktx.astc_ldr_6x6_3dtex_7.ktx2") +set_tests_properties([=[toktx-test.cmp-astc_ldr_6x6_3dtex_7]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;283;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-3dtex_1_reference_u]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --t2 --depth 1 toktx.3dtex_1_reference_u.ktx2 ../srcimages/red16.png && diff 3dtex_1_reference_u.ktx2 toktx.3dtex_1_reference_u.ktx2 && rm toktx.3dtex_1_reference_u.ktx2") +set_tests_properties([=[toktx-test.cmp-3dtex_1_reference_u]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;285;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-3dtex_7_reference_u]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --t2 --depth 7 toktx.3dtex_7_reference_u.ktx2 ../srcimages/red16.png ../srcimages/orange16.png ../srcimages/yellow16.png ../srcimages/green16.png ../srcimages/blue16.png ../srcimages/indigo16.png ../srcimages/violet16.png && diff 3dtex_7_reference_u.ktx2 toktx.3dtex_7_reference_u.ktx2 && rm toktx.3dtex_7_reference_u.ktx2") +set_tests_properties([=[toktx-test.cmp-3dtex_7_reference_u]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;286;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-arraytex_1_reference_u]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --t2 --layers 1 toktx.arraytex_1_reference_u.ktx2 ../srcimages/red16.png && diff arraytex_1_reference_u.ktx2 toktx.arraytex_1_reference_u.ktx2 && rm toktx.arraytex_1_reference_u.ktx2") +set_tests_properties([=[toktx-test.cmp-arraytex_1_reference_u]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;287;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-arraytex_7_reference_u]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --t2 --layers 7 toktx.arraytex_7_reference_u.ktx2 ../srcimages/red16.png ../srcimages/orange16.png ../srcimages/yellow16.png ../srcimages/green16.png ../srcimages/blue16.png ../srcimages/indigo16.png ../srcimages/violet16.png && diff arraytex_7_reference_u.ktx2 toktx.arraytex_7_reference_u.ktx2 && rm toktx.arraytex_7_reference_u.ktx2") +set_tests_properties([=[toktx-test.cmp-arraytex_7_reference_u]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;288;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +add_test([=[toktx-test.cmp-arraytex_7_mipmap_reference_u]=] "/usr/bin/bash" "-c" "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx --test --test --t2 --layers 7 --genmipmap toktx.arraytex_7_mipmap_reference_u.ktx2 ../srcimages/red16.png ../srcimages/orange16.png ../srcimages/yellow16.png ../srcimages/green16.png ../srcimages/blue16.png ../srcimages/indigo16.png ../srcimages/violet16.png && diff arraytex_7_mipmap_reference_u.ktx2 toktx.arraytex_7_mipmap_reference_u.ktx2 && rm toktx.arraytex_7_mipmap_reference_u.ktx2") +set_tests_properties([=[toktx-test.cmp-arraytex_7_mipmap_reference_u]=] PROPERTIES ENVIRONMENT "TOKTX_OPTIONS=" WORKING_DIRECTORY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages" _BACKTRACE_TRIPLES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;133;add_test;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;289;gencmpktx;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/toktx-tests.cmake;0;;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;35;include;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/CMakeLists.txt;0;") +subdirs("loadtests") +subdirs("ktxdiff") +subdirs("gtest") +subdirs("transcodetests") +subdirs("streamtests") diff --git a/ktx/build/tests/Makefile b/ktx/build/tests/Makefile new file mode 100644 index 0000000..65e9d46 --- /dev/null +++ b/ktx/build/tests/Makefile @@ -0,0 +1,414 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tests/CMakeFiles/unittests.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/CMakeFiles/unittests.dir/rule +.PHONY : tests/CMakeFiles/unittests.dir/rule + +# Convenience name for target. +unittests: tests/CMakeFiles/unittests.dir/rule +.PHONY : unittests + +# fast build rule for target. +unittests/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/build +.PHONY : unittests/fast + +# Convenience name for target. +tests/CMakeFiles/texturetests.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/CMakeFiles/texturetests.dir/rule +.PHONY : tests/CMakeFiles/texturetests.dir/rule + +# Convenience name for target. +texturetests: tests/CMakeFiles/texturetests.dir/rule +.PHONY : texturetests + +# fast build rule for target. +texturetests/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/texturetests.dir/build.make tests/CMakeFiles/texturetests.dir/build +.PHONY : texturetests/fast + +__/external/dfdutils/dfd2vk.o: __/external/dfdutils/dfd2vk.c.o +.PHONY : __/external/dfdutils/dfd2vk.o + +# target to build an object file +__/external/dfdutils/dfd2vk.c.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.o +.PHONY : __/external/dfdutils/dfd2vk.c.o + +__/external/dfdutils/dfd2vk.i: __/external/dfdutils/dfd2vk.c.i +.PHONY : __/external/dfdutils/dfd2vk.i + +# target to preprocess a source file +__/external/dfdutils/dfd2vk.c.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.i +.PHONY : __/external/dfdutils/dfd2vk.c.i + +__/external/dfdutils/dfd2vk.s: __/external/dfdutils/dfd2vk.c.s +.PHONY : __/external/dfdutils/dfd2vk.s + +# target to generate assembly for a file +__/external/dfdutils/dfd2vk.c.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/__/external/dfdutils/dfd2vk.c.s +.PHONY : __/external/dfdutils/dfd2vk.c.s + +texturetests/texturetests.o: texturetests/texturetests.cc.o +.PHONY : texturetests/texturetests.o + +# target to build an object file +texturetests/texturetests.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/texturetests.dir/build.make tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.o +.PHONY : texturetests/texturetests.cc.o + +texturetests/texturetests.i: texturetests/texturetests.cc.i +.PHONY : texturetests/texturetests.i + +# target to preprocess a source file +texturetests/texturetests.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/texturetests.dir/build.make tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.i +.PHONY : texturetests/texturetests.cc.i + +texturetests/texturetests.s: texturetests/texturetests.cc.s +.PHONY : texturetests/texturetests.s + +# target to generate assembly for a file +texturetests/texturetests.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/texturetests.dir/build.make tests/CMakeFiles/texturetests.dir/texturetests/texturetests.cc.s +.PHONY : texturetests/texturetests.cc.s + +unittests/image_unittests.o: unittests/image_unittests.cc.o +.PHONY : unittests/image_unittests.o + +# target to build an object file +unittests/image_unittests.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.o +.PHONY : unittests/image_unittests.cc.o + +unittests/image_unittests.i: unittests/image_unittests.cc.i +.PHONY : unittests/image_unittests.i + +# target to preprocess a source file +unittests/image_unittests.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.i +.PHONY : unittests/image_unittests.cc.i + +unittests/image_unittests.s: unittests/image_unittests.cc.s +.PHONY : unittests/image_unittests.s + +# target to generate assembly for a file +unittests/image_unittests.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/unittests/image_unittests.cc.s +.PHONY : unittests/image_unittests.cc.s + +unittests/test_fragment_uri.o: unittests/test_fragment_uri.cc.o +.PHONY : unittests/test_fragment_uri.o + +# target to build an object file +unittests/test_fragment_uri.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.o +.PHONY : unittests/test_fragment_uri.cc.o + +unittests/test_fragment_uri.i: unittests/test_fragment_uri.cc.i +.PHONY : unittests/test_fragment_uri.i + +# target to preprocess a source file +unittests/test_fragment_uri.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.i +.PHONY : unittests/test_fragment_uri.cc.i + +unittests/test_fragment_uri.s: unittests/test_fragment_uri.cc.s +.PHONY : unittests/test_fragment_uri.s + +# target to generate assembly for a file +unittests/test_fragment_uri.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/unittests/test_fragment_uri.cc.s +.PHONY : unittests/test_fragment_uri.cc.s + +unittests/test_string_to_vkformat.o: unittests/test_string_to_vkformat.cc.o +.PHONY : unittests/test_string_to_vkformat.o + +# target to build an object file +unittests/test_string_to_vkformat.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.o +.PHONY : unittests/test_string_to_vkformat.cc.o + +unittests/test_string_to_vkformat.i: unittests/test_string_to_vkformat.cc.i +.PHONY : unittests/test_string_to_vkformat.i + +# target to preprocess a source file +unittests/test_string_to_vkformat.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.i +.PHONY : unittests/test_string_to_vkformat.cc.i + +unittests/test_string_to_vkformat.s: unittests/test_string_to_vkformat.cc.s +.PHONY : unittests/test_string_to_vkformat.s + +# target to generate assembly for a file +unittests/test_string_to_vkformat.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/unittests/test_string_to_vkformat.cc.s +.PHONY : unittests/test_string_to_vkformat.cc.s + +unittests/unittests.o: unittests/unittests.cc.o +.PHONY : unittests/unittests.o + +# target to build an object file +unittests/unittests.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/unittests/unittests.cc.o +.PHONY : unittests/unittests.cc.o + +unittests/unittests.i: unittests/unittests.cc.i +.PHONY : unittests/unittests.i + +# target to preprocess a source file +unittests/unittests.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/unittests/unittests.cc.i +.PHONY : unittests/unittests.cc.i + +unittests/unittests.s: unittests/unittests.cc.s +.PHONY : unittests/unittests.s + +# target to generate assembly for a file +unittests/unittests.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/unittests.dir/build.make tests/CMakeFiles/unittests.dir/unittests/unittests.cc.s +.PHONY : unittests/unittests.cc.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... texturetests" + @echo "... unittests" + @echo "... __/external/dfdutils/dfd2vk.o" + @echo "... __/external/dfdutils/dfd2vk.i" + @echo "... __/external/dfdutils/dfd2vk.s" + @echo "... texturetests/texturetests.o" + @echo "... texturetests/texturetests.i" + @echo "... texturetests/texturetests.s" + @echo "... unittests/image_unittests.o" + @echo "... unittests/image_unittests.i" + @echo "... unittests/image_unittests.s" + @echo "... unittests/test_fragment_uri.o" + @echo "... unittests/test_fragment_uri.i" + @echo "... unittests/test_fragment_uri.s" + @echo "... unittests/test_string_to_vkformat.o" + @echo "... unittests/test_string_to_vkformat.i" + @echo "... unittests/test_string_to_vkformat.s" + @echo "... unittests/unittests.o" + @echo "... unittests/unittests.i" + @echo "... unittests/unittests.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tests/cmake_install.cmake b/ktx/build/tests/cmake_install.cmake new file mode 100644 index 0000000..37a03e7 --- /dev/null +++ b/ktx/build/tests/cmake_install.cmake @@ -0,0 +1,75 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/cmake_install.cmake") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tests/gtest/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tests/gtest/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/DependInfo.cmake b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/DependInfo.cmake new file mode 100644 index 0000000..8883235 --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/DependInfo.cmake @@ -0,0 +1,24 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-all.cc" "tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o" "gcc" "tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest_main.cc" "tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o" "gcc" "tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/build.make b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/build.make new file mode 100644 index 0000000..6fbefb1 --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/build.make @@ -0,0 +1,130 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tests/gtest/CMakeFiles/gtest.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tests/gtest/CMakeFiles/gtest.dir/compiler_depend.make + +# Include the progress variables for this target. +include tests/gtest/CMakeFiles/gtest.dir/progress.make + +# Include the compile flags for this target's objects. +include tests/gtest/CMakeFiles/gtest.dir/flags.make + +tests/gtest/CMakeFiles/gtest.dir/codegen: +.PHONY : tests/gtest/CMakeFiles/gtest.dir/codegen + +tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o: tests/gtest/CMakeFiles/gtest.dir/flags.make +tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-all.cc +tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o: tests/gtest/CMakeFiles/gtest.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -Wno-missing-field-initializers -MD -MT tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o -MF CMakeFiles/gtest.dir/src/gtest-all.cc.o.d -o CMakeFiles/gtest.dir/src/gtest-all.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-all.cc + +tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/gtest.dir/src/gtest-all.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -Wno-missing-field-initializers -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-all.cc > CMakeFiles/gtest.dir/src/gtest-all.cc.i + +tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/gtest.dir/src/gtest-all.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -Wno-missing-field-initializers -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-all.cc -o CMakeFiles/gtest.dir/src/gtest-all.cc.s + +tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o: tests/gtest/CMakeFiles/gtest.dir/flags.make +tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest_main.cc +tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o: tests/gtest/CMakeFiles/gtest.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o -MF CMakeFiles/gtest.dir/src/gtest_main.cc.o.d -o CMakeFiles/gtest.dir/src/gtest_main.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest_main.cc + +tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/gtest.dir/src/gtest_main.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest_main.cc > CMakeFiles/gtest.dir/src/gtest_main.cc.i + +tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/gtest.dir/src/gtest_main.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest_main.cc -o CMakeFiles/gtest.dir/src/gtest_main.cc.s + +# Object files for target gtest +gtest_OBJECTS = \ +"CMakeFiles/gtest.dir/src/gtest-all.cc.o" \ +"CMakeFiles/gtest.dir/src/gtest_main.cc.o" + +# External object files for target gtest +gtest_EXTERNAL_OBJECTS = + +tests/gtest/libgtest.a: tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o +tests/gtest/libgtest.a: tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o +tests/gtest/libgtest.a: tests/gtest/CMakeFiles/gtest.dir/build.make +tests/gtest/libgtest.a: tests/gtest/CMakeFiles/gtest.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Linking CXX static library libgtest.a" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest && $(CMAKE_COMMAND) -P CMakeFiles/gtest.dir/cmake_clean_target.cmake + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/gtest.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tests/gtest/CMakeFiles/gtest.dir/build: tests/gtest/libgtest.a +.PHONY : tests/gtest/CMakeFiles/gtest.dir/build + +tests/gtest/CMakeFiles/gtest.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest && $(CMAKE_COMMAND) -P CMakeFiles/gtest.dir/cmake_clean.cmake +.PHONY : tests/gtest/CMakeFiles/gtest.dir/clean + +tests/gtest/CMakeFiles/gtest.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/CMakeFiles/gtest.dir/DependInfo.cmake "--color=$(COLOR)" gtest +.PHONY : tests/gtest/CMakeFiles/gtest.dir/depend + diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/cmake_clean.cmake b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/cmake_clean.cmake new file mode 100644 index 0000000..8634738 --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/cmake_clean.cmake @@ -0,0 +1,13 @@ +file(REMOVE_RECURSE + "CMakeFiles/gtest.dir/src/gtest-all.cc.o" + "CMakeFiles/gtest.dir/src/gtest-all.cc.o.d" + "CMakeFiles/gtest.dir/src/gtest_main.cc.o" + "CMakeFiles/gtest.dir/src/gtest_main.cc.o.d" + "libgtest.a" + "libgtest.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/gtest.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/cmake_clean_target.cmake b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/cmake_clean_target.cmake new file mode 100644 index 0000000..0668ce3 --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libgtest.a" +) diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/compiler_depend.internal b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/compiler_depend.internal new file mode 100644 index 0000000..134fe73 --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/compiler_depend.internal @@ -0,0 +1,791 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-all.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-death-test.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-filepath.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-internal-inl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-matchers.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-port.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-printers.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-test-part.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-typed-test.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-spi.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h + /usr/include/alloca.h + /usr/include/arpa/inet.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/socket.h + /usr/include/asm-generic/sockios.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/socket.h + /usr/include/asm/sockios.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/in.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/mman-linux.h + /usr/include/bits/mman-map-flags-generic.h + /usr/include/bits/mman-shared.h + /usr/include/bits/mman.h + /usr/include/bits/mman_ext.h + /usr/include/bits/netdb.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/sigaction.h + /usr/include/bits/sigcontext.h + /usr/include/bits/sigevent-consts.h + /usr/include/bits/siginfo-arch.h + /usr/include/bits/siginfo-consts-arch.h + /usr/include/bits/siginfo-consts.h + /usr/include/bits/signal_ext.h + /usr/include/bits/signum-arch.h + /usr/include/bits/signum-generic.h + /usr/include/bits/sigstack.h + /usr/include/bits/sigstksz.h + /usr/include/bits/sigthread.h + /usr/include/bits/sockaddr.h + /usr/include/bits/socket.h + /usr/include/bits/socket_type.h + /usr/include/bits/ss_flags.h + /usr/include/bits/stat.h + /usr/include/bits/statx-generic.h + /usr/include/bits/statx.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/__sigval_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/idtype_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sig_atomic_t.h + /usr/include/bits/types/sigevent_t.h + /usr/include/bits/types/siginfo_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/sigval_t.h + /usr/include/bits/types/stack_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_osockaddr.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_sigstack.h + /usr/include/bits/types/struct_statx.h + /usr/include/bits/types/struct_statx_timestamp.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/any + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/list.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/monostate.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_list.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_multiset.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_set.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/cxxabi.h + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/list + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/set + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/variant + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stat.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/netdb.h + /usr/include/netinet/in.h + /usr/include/pthread.h + /usr/include/regex.h + /usr/include/rpc/netdb.h + /usr/include/sched.h + /usr/include/signal.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/mman.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/socket.h + /usr/include/sys/stat.h + /usr/include/sys/time.h + /usr/include/sys/types.h + /usr/include/sys/ucontext.h + /usr/include/sys/wait.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest_main.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/sigaction.h + /usr/include/bits/sigcontext.h + /usr/include/bits/sigevent-consts.h + /usr/include/bits/siginfo-arch.h + /usr/include/bits/siginfo-consts-arch.h + /usr/include/bits/siginfo-consts.h + /usr/include/bits/signal_ext.h + /usr/include/bits/signum-arch.h + /usr/include/bits/signum-generic.h + /usr/include/bits/sigstack.h + /usr/include/bits/sigstksz.h + /usr/include/bits/sigthread.h + /usr/include/bits/ss_flags.h + /usr/include/bits/stat.h + /usr/include/bits/statx-generic.h + /usr/include/bits/statx.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/__sigval_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/idtype_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sig_atomic_t.h + /usr/include/bits/types/sigevent_t.h + /usr/include/bits/types/siginfo_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/sigval_t.h + /usr/include/bits/types/stack_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_sigstack.h + /usr/include/bits/types/struct_statx.h + /usr/include/bits/types/struct_statx_timestamp.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/any + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/monostate.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_multiset.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_set.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/cxxabi.h + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/set + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/variant + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stat.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/pthread.h + /usr/include/regex.h + /usr/include/sched.h + /usr/include/signal.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/stat.h + /usr/include/sys/types.h + /usr/include/sys/ucontext.h + /usr/include/sys/wait.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/compiler_depend.make b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/compiler_depend.make new file mode 100644 index 0000000..fbfcd97 --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/compiler_depend.make @@ -0,0 +1,1667 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-all.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-death-test.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-filepath.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-internal-inl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-matchers.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-port.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-printers.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-test-part.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-typed-test.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-spi.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/alloca.h \ + /usr/include/arpa/inet.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/socket.h \ + /usr/include/asm-generic/sockios.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/socket.h \ + /usr/include/asm/sockios.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/in.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/mman-linux.h \ + /usr/include/bits/mman-map-flags-generic.h \ + /usr/include/bits/mman-shared.h \ + /usr/include/bits/mman.h \ + /usr/include/bits/mman_ext.h \ + /usr/include/bits/netdb.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h \ + /usr/include/bits/sigevent-consts.h \ + /usr/include/bits/siginfo-arch.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/signal_ext.h \ + /usr/include/bits/signum-arch.h \ + /usr/include/bits/signum-generic.h \ + /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h \ + /usr/include/bits/sigthread.h \ + /usr/include/bits/sockaddr.h \ + /usr/include/bits/socket.h \ + /usr/include/bits/socket_type.h \ + /usr/include/bits/ss_flags.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/statx.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/idtype_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/types/siginfo_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/sigval_t.h \ + /usr/include/bits/types/stack_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_osockaddr.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_sigstack.h \ + /usr/include/bits/types/struct_statx.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/list.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_list.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/list \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/variant \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stat.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/netdb.h \ + /usr/include/netinet/in.h \ + /usr/include/pthread.h \ + /usr/include/regex.h \ + /usr/include/rpc/netdb.h \ + /usr/include/sched.h \ + /usr/include/signal.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/mman.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/socket.h \ + /usr/include/sys/stat.h \ + /usr/include/sys/time.h \ + /usr/include/sys/types.h \ + /usr/include/sys/ucontext.h \ + /usr/include/sys/wait.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest_main.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h \ + /usr/include/bits/sigevent-consts.h \ + /usr/include/bits/siginfo-arch.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/signal_ext.h \ + /usr/include/bits/signum-arch.h \ + /usr/include/bits/signum-generic.h \ + /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h \ + /usr/include/bits/sigthread.h \ + /usr/include/bits/ss_flags.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/statx.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/idtype_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/types/siginfo_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/sigval_t.h \ + /usr/include/bits/types/stack_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_sigstack.h \ + /usr/include/bits/types/struct_statx.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/variant \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stat.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/pthread.h \ + /usr/include/regex.h \ + /usr/include/sched.h \ + /usr/include/signal.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/stat.h \ + /usr/include/sys/types.h \ + /usr/include/sys/ucontext.h \ + /usr/include/sys/wait.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest_main.cc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/include/sys/types.h: + +/usr/include/sys/time.h: + +/usr/include/sys/stat.h: + +/usr/include/sys/select.h: + +/usr/include/sys/mman.h: + +/usr/include/sys/cdefs.h: + +/usr/include/stdlib.h: + +/usr/include/rpc/netdb.h: + +/usr/include/pthread.h: + +/usr/include/linux/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/stat.h: + +/usr/include/linux/sched/types.h: + +/usr/include/limits.h: + +/usr/include/gnu/stubs.h: + +/usr/include/features-time64.h: + +/usr/include/sys/wait.h: + +/usr/include/fcntl.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h: + +/usr/include/netdb.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/c++/16.1.1/vector: + +/usr/include/c++/16.1.1/variant: + +/usr/include/locale.h: + +/usr/include/c++/16.1.1/utility: + +/usr/include/c++/16.1.1/unordered_map: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/ratio: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/c++/16.1.1/optional: + +/usr/include/c++/16.1.1/memory: + +/usr/include/c++/16.1.1/map: + +/usr/include/c++/16.1.1/iterator: + +/usr/include/c++/16.1.1/istream: + +/usr/include/c++/16.1.1/iomanip: + +/usr/include/regex.h: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/include/c++/16.1.1/functional: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/exception: + +/usr/include/time.h: + +/usr/include/c++/16.1.1/cxxabi.h: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h: + +/usr/include/c++/16.1.1/compare: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/c++/16.1.1/climits: + +/usr/include/c++/16.1.1/chrono: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/linux/openat2.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/c++/16.1.1/bits/unordered_map.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/include/sys/ucontext.h: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/bits/stream_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/c++/16.1.1/bits/stl_tree.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/c++/16.1.1/bits/stl_relops.h: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/usr/include/c++/16.1.1/bits/stl_multiset.h: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/bits/stl_multimap.h: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_map.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/include/math.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/bits/signum-generic.h: + +/usr/include/bits/signum-arch.h: + +/usr/include/bits/sigevent-consts.h: + +/usr/include/bits/posix2_lim.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/bits/types/stack_t.h: + +/usr/include/bits/socket.h: + +/usr/include/bits/types/siginfo_t.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/bits/sigstksz.h: + +/usr/include/asm/socket.h: + +/usr/include/c++/16.1.1/stdlib.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h: + +/usr/include/bits/mman.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/bits/mman-shared.h: + +/usr/include/bits/struct_stat.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/sys/socket.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/bits/mathcalls-helper-functions.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/bits/long-double.h: + +/usr/include/bits/siginfo-consts-arch.h: + +/usr/include/bits/getopt_core.h: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/usr/include/bits/sigstack.h: + +/usr/include/bits/netdb.h: + +/usr/include/bits/local_lim.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/usr/include/bits/libc-header-start.h: + +/usr/include/bits/cloexec.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/bits/siginfo-arch.h: + +/usr/include/string.h: + +/usr/include/bits/socket_type.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/wchar.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/wctype.h: + +/usr/include/sched.h: + +/usr/include/bits/fp-fast.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-typed-test.cc: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/mman-map-flags-generic.h: + +/usr/include/bits/types/FILE.h: + +/usr/include/bits/floatn.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/bits/stdio.h: + +/usr/include/bits/fcntl-linux.h: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/c++/16.1.1/bits/specfun.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-matchers.cc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/asm/errno.h: + +/usr/include/bits/types/struct_osockaddr.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/errno.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/usr/include/bits/getopt_posix.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h: + +/usr/include/bits/setjmp.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h: + +/usr/include/bits/confname.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h: + +/usr/include/bits/types/timer_t.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/usr/include/c++/16.1.1/set: + +/usr/include/alloca.h: + +/usr/include/bits/in.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/bits/openat2.h: + +/usr/include/c++/16.1.1/atomic: + +/usr/include/assert.h: + +/usr/include/bits/stat.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h: + +/usr/include/bits/sigaction.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/bits/iscanonical.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/include/c++/16.1.1/ios: + +/usr/include/asm/sockios.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h: + +/usr/include/c++/16.1.1/bit: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-port.cc: + +/usr/include/c++/16.1.1/any: + +/usr/include/bits/siginfo-consts.h: + +/usr/include/bits/sockaddr.h: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h: + +/usr/include/arpa/inet.h: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/bits/mathcalls.h: + +/usr/include/bits/stdlib-bsearch.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-death-test.cc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-internal-inl.h: + +/usr/include/bits/mathcalls-macros.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest.h: + +/usr/include/asm-generic/int-ll64.h: + +/usr/include/bits/types/idtype_t.h: + +/usr/include/bits/types/clock_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/bits/locale.h: + +/usr/include/bits/posix_opt.h: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/include/c++/16.1.1/cstdint: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-test-part.cc: + +/usr/include/c++/16.1.1/bits/stl_list.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/bits/mathcalls-narrow.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-printers.cc: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/usr/include/asm-generic/socket.h: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/bits/types/sigval_t.h: + +/usr/include/linux/limits.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/bits/sigthread.h: + +/usr/include/c++/16.1.1/fstream: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-spi.h: + +/usr/include/gnu/stubs-64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h: + +/usr/include/bits/types/__sigval_t.h: + +/usr/include/c++/16.1.1/cassert: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/asm-generic/types.h: + +/usr/include/bits/statx.h: + +/usr/include/c++/16.1.1/locale: + +/usr/include/bits/sigcontext.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/bits/ss_flags.h: + +/usr/include/asm/posix_types_64.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/asm/types.h: + +/usr/include/bits/errno.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/bits/byteswap.h: + +/usr/include/c++/16.1.1/bits/stl_set.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/bits/mman_ext.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest.cc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/bits/cpu-set.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/bits/environments.h: + +/usr/include/bits/timesize.h: + +/usr/include/bits/types.h: + +/usr/include/features.h: + +/usr/include/bits/sched.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/c++/16.1.1/list: + +/usr/include/bits/types/__fpos64_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-all.cc: + +/usr/include/bits/types/__locale_t.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/types/error_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/signal_ext.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/types/sig_atomic_t.h: + +/usr/include/bits/typesizes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/include/bits/types/sigevent_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/bits/types/struct_iovec.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/bits/types/struct_sigstack.h: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/usr/include/bits/types/struct_statx.h: + +/usr/include/bits/types/struct_statx_timestamp.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/bits/math-vector.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/asm-generic/sockios.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/usr/include/linux/falloc.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/netinet/in.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/bits/waitflags.h: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/stdio.h: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/bits/wordsize.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/include/c++/16.1.1/algorithm: + +/usr/include/bits/select.h: + +/usr/include/c++/16.1.1/array: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/bits/mman-linux.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/bits/chrono.h: + +/usr/include/strings.h: + +/usr/include/signal.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/bits/fp-logb.h: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-filepath.cc: + +/usr/include/c++/16.1.1/bits/fstream.tcc: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/c++/16.1.1/bits/hashtable.h: + +/usr/include/c++/16.1.1/bits/hashtable_policy.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/bits/statx-generic.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/libintl.h: + +/usr/include/bits/endianness.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/unistd.h: + +/usr/include/c++/16.1.1/bits/monostate.h: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/list.tcc: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/bits/fcntl.h: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/quoted_string.h: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/compiler_depend.ts b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/compiler_depend.ts new file mode 100644 index 0000000..32ab1fb --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for gtest. diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/depend.make b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/depend.make new file mode 100644 index 0000000..37ac348 --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for gtest. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/flags.make b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/flags.make new file mode 100644 index 0000000..18b53ce --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/flags.make @@ -0,0 +1,12 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/. + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + +# Custom options: tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o_OPTIONS = -Wno-missing-field-initializers + diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/link.txt b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/link.txt new file mode 100644 index 0000000..8bd7b91 --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libgtest.a "CMakeFiles/gtest.dir/src/gtest-all.cc.o" CMakeFiles/gtest.dir/src/gtest_main.cc.o +/usr/bin/ranlib libgtest.a diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/progress.make b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/progress.make new file mode 100644 index 0000000..cede38a --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/progress.make @@ -0,0 +1,4 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 18 +CMAKE_PROGRESS_3 = + diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o new file mode 100644 index 0000000..ce600e1 Binary files /dev/null and b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o differ diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o.d b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o.d new file mode 100644 index 0000000..525de44 --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o.d @@ -0,0 +1,322 @@ +tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest-all.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/c++/16.1.1/bits/version.h /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/memory /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/string.h \ + /usr/include/strings.h /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/sys/stat.h \ + /usr/include/bits/stat.h /usr/include/bits/struct_stat.h \ + /usr/include/bits/statx.h /usr/include/linux/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_statx.h /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/regex.h /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/variant /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h /usr/include/sys/wait.h \ + /usr/include/signal.h /usr/include/bits/signum-generic.h \ + /usr/include/bits/signum-arch.h /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/siginfo_t.h /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/siginfo-arch.h /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/types/sigval_t.h /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/sigevent-consts.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/bits/types/stack_t.h \ + /usr/include/sys/ucontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h /usr/include/bits/ss_flags.h \ + /usr/include/bits/types/struct_sigstack.h /usr/include/bits/sigthread.h \ + /usr/include/bits/signal_ext.h /usr/include/bits/types/idtype_t.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /usr/include/c++/16.1.1/atomic \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/./src/gtest.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-spi.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/list /usr/include/c++/16.1.1/bits/stl_list.h \ + /usr/include/c++/16.1.1/bits/list.tcc /usr/include/fcntl.h \ + /usr/include/bits/fcntl.h /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/types/struct_iovec.h /usr/include/bits/cloexec.h \ + /usr/include/linux/falloc.h /usr/include/linux/openat2.h \ + /usr/include/bits/openat2.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/sys/mman.h \ + /usr/include/bits/mman.h /usr/include/bits/mman-map-flags-generic.h \ + /usr/include/bits/mman-linux.h /usr/include/bits/mman-shared.h \ + /usr/include/bits/mman_ext.h /usr/include/sys/time.h \ + /usr/include/arpa/inet.h /usr/include/netinet/in.h \ + /usr/include/sys/socket.h /usr/include/bits/socket.h \ + /usr/include/bits/socket_type.h /usr/include/bits/sockaddr.h \ + /usr/include/asm/socket.h /usr/include/asm-generic/socket.h \ + /usr/include/asm/sockios.h /usr/include/asm-generic/sockios.h \ + /usr/include/bits/types/struct_osockaddr.h /usr/include/bits/in.h \ + /usr/include/netdb.h /usr/include/rpc/netdb.h /usr/include/bits/netdb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/./src/gtest-internal-inl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/./src/gtest-death-test.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/./src/gtest-filepath.cc \ + /usr/include/c++/16.1.1/climits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/./src/gtest-matchers.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/./src/gtest-port.cc \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/./src/gtest-printers.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/./src/gtest-test-part.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/./src/gtest-typed-test.cc diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o new file mode 100644 index 0000000..0e0fa34 Binary files /dev/null and b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o differ diff --git a/ktx/build/tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o.d b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o.d new file mode 100644 index 0000000..81f2148 --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o.d @@ -0,0 +1,256 @@ +tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/src/gtest_main.cc \ + /usr/include/stdc-predef.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /usr/include/c++/16.1.1/cstddef /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/limits /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/string.h \ + /usr/include/strings.h /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/sys/stat.h \ + /usr/include/bits/stat.h /usr/include/bits/struct_stat.h \ + /usr/include/bits/statx.h /usr/include/linux/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_statx.h /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/regex.h /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/variant /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h /usr/include/sys/wait.h \ + /usr/include/signal.h /usr/include/bits/signum-generic.h \ + /usr/include/bits/signum-arch.h /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/siginfo_t.h /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/siginfo-arch.h /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/types/sigval_t.h /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/sigevent-consts.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/bits/types/stack_t.h \ + /usr/include/sys/ucontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h /usr/include/bits/ss_flags.h \ + /usr/include/bits/types/struct_sigstack.h /usr/include/bits/sigthread.h \ + /usr/include/bits/signal_ext.h /usr/include/bits/types/idtype_t.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /usr/include/c++/16.1.1/atomic \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h diff --git a/ktx/build/tests/gtest/CMakeFiles/progress.marks b/ktx/build/tests/gtest/CMakeFiles/progress.marks new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/ktx/build/tests/gtest/CMakeFiles/progress.marks @@ -0,0 +1 @@ +1 diff --git a/ktx/build/tests/gtest/CTestTestfile.cmake b/ktx/build/tests/gtest/CTestTestfile.cmake new file mode 100644 index 0000000..4013153 --- /dev/null +++ b/ktx/build/tests/gtest/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/tests/gtest/Makefile b/ktx/build/tests/gtest/Makefile new file mode 100644 index 0000000..5ab657d --- /dev/null +++ b/ktx/build/tests/gtest/Makefile @@ -0,0 +1,291 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/gtest/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/gtest/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/gtest/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/gtest/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tests/gtest/CMakeFiles/gtest.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/gtest/CMakeFiles/gtest.dir/rule +.PHONY : tests/gtest/CMakeFiles/gtest.dir/rule + +# Convenience name for target. +gtest: tests/gtest/CMakeFiles/gtest.dir/rule +.PHONY : gtest + +# fast build rule for target. +gtest/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/gtest/CMakeFiles/gtest.dir/build.make tests/gtest/CMakeFiles/gtest.dir/build +.PHONY : gtest/fast + +src/gtest-all.o: src/gtest-all.cc.o +.PHONY : src/gtest-all.o + +# target to build an object file +src/gtest-all.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/gtest/CMakeFiles/gtest.dir/build.make tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o +.PHONY : src/gtest-all.cc.o + +src/gtest-all.i: src/gtest-all.cc.i +.PHONY : src/gtest-all.i + +# target to preprocess a source file +src/gtest-all.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/gtest/CMakeFiles/gtest.dir/build.make tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.i +.PHONY : src/gtest-all.cc.i + +src/gtest-all.s: src/gtest-all.cc.s +.PHONY : src/gtest-all.s + +# target to generate assembly for a file +src/gtest-all.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/gtest/CMakeFiles/gtest.dir/build.make tests/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.s +.PHONY : src/gtest-all.cc.s + +src/gtest_main.o: src/gtest_main.cc.o +.PHONY : src/gtest_main.o + +# target to build an object file +src/gtest_main.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/gtest/CMakeFiles/gtest.dir/build.make tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.o +.PHONY : src/gtest_main.cc.o + +src/gtest_main.i: src/gtest_main.cc.i +.PHONY : src/gtest_main.i + +# target to preprocess a source file +src/gtest_main.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/gtest/CMakeFiles/gtest.dir/build.make tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.i +.PHONY : src/gtest_main.cc.i + +src/gtest_main.s: src/gtest_main.cc.s +.PHONY : src/gtest_main.s + +# target to generate assembly for a file +src/gtest_main.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/gtest/CMakeFiles/gtest.dir/build.make tests/gtest/CMakeFiles/gtest.dir/src/gtest_main.cc.s +.PHONY : src/gtest_main.cc.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... gtest" + @echo "... src/gtest-all.o" + @echo "... src/gtest-all.i" + @echo "... src/gtest-all.s" + @echo "... src/gtest_main.o" + @echo "... src/gtest_main.i" + @echo "... src/gtest_main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tests/gtest/cmake_install.cmake b/ktx/build/tests/gtest/cmake_install.cmake new file mode 100644 index 0000000..d187c78 --- /dev/null +++ b/ktx/build/tests/gtest/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tests/gtest/libgtest.a b/ktx/build/tests/gtest/libgtest.a new file mode 100644 index 0000000..3f6ce5d Binary files /dev/null and b/ktx/build/tests/gtest/libgtest.a differ diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tests/ktxdiff/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/DependInfo.cmake b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/DependInfo.cmake new file mode 100644 index 0000000..cf1e647 --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/DependInfo.cmake @@ -0,0 +1,24 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff/ktxdiff_main.cpp" "tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o" "gcc" "tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o.d" + "" "Release/ktxdiff" "gcc" "tests/ktxdiff/CMakeFiles/ktxdiff.dir/link.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make new file mode 100644 index 0000000..0a33de1 --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make @@ -0,0 +1,118 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tests/ktxdiff/CMakeFiles/ktxdiff.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tests/ktxdiff/CMakeFiles/ktxdiff.dir/compiler_depend.make + +# Include the progress variables for this target. +include tests/ktxdiff/CMakeFiles/ktxdiff.dir/progress.make + +# Include the compile flags for this target's objects. +include tests/ktxdiff/CMakeFiles/ktxdiff.dir/flags.make + +tests/ktxdiff/CMakeFiles/ktxdiff.dir/codegen: +.PHONY : tests/ktxdiff/CMakeFiles/ktxdiff.dir/codegen + +tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o: tests/ktxdiff/CMakeFiles/ktxdiff.dir/flags.make +tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff/ktxdiff_main.cpp +tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o: tests/ktxdiff/CMakeFiles/ktxdiff.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o -MF CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o.d -o CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff/ktxdiff_main.cpp + +tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff/ktxdiff_main.cpp > CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.i + +tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff/ktxdiff_main.cpp -o CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.s + +# Object files for target ktxdiff +ktxdiff_OBJECTS = \ +"CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o" + +# External object files for target ktxdiff +ktxdiff_EXTERNAL_OBJECTS = + +Release/ktxdiff: tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o +Release/ktxdiff: tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make +Release/ktxdiff: tests/ktxdiff/CMakeFiles/ktxdiff.dir/compiler_depend.ts +Release/ktxdiff: Release/libktx.so.0.0.0 +Release/ktxdiff: external/astc-encoder/Source/libastcenc-avx2-static.a +Release/ktxdiff: external/fmt/libfmt.a +Release/ktxdiff: libobjUtil.a +Release/ktxdiff: tests/ktxdiff/CMakeFiles/ktxdiff.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../../Release/ktxdiff" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/ktxdiff.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tests/ktxdiff/CMakeFiles/ktxdiff.dir/build: Release/ktxdiff +.PHONY : tests/ktxdiff/CMakeFiles/ktxdiff.dir/build + +tests/ktxdiff/CMakeFiles/ktxdiff.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff && $(CMAKE_COMMAND) -P CMakeFiles/ktxdiff.dir/cmake_clean.cmake +.PHONY : tests/ktxdiff/CMakeFiles/ktxdiff.dir/clean + +tests/ktxdiff/CMakeFiles/ktxdiff.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/DependInfo.cmake "--color=$(COLOR)" ktxdiff +.PHONY : tests/ktxdiff/CMakeFiles/ktxdiff.dir/depend + diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/cmake_clean.cmake b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/cmake_clean.cmake new file mode 100644 index 0000000..d7fbf81 --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/cmake_clean.cmake @@ -0,0 +1,12 @@ +file(REMOVE_RECURSE + "../../Release/ktxdiff" + "../../Release/ktxdiff.pdb" + "CMakeFiles/ktxdiff.dir/link.d" + "CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o" + "CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o.d" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/ktxdiff.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/compiler_depend.internal b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/compiler_depend.internal new file mode 100644 index 0000000..efdf7fb --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/compiler_depend.internal @@ -0,0 +1,368 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/ktxdiff + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/libastcenc-avx2-static.a + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/libfmt.a + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/libobjUtil.a + /usr/lib/Scrt1.o + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o + +tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff/ktxdiff_main.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/os.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/compiler_depend.make b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/compiler_depend.make new file mode 100644 index 0000000..72587aa --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/compiler_depend.make @@ -0,0 +1,1088 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/ktxdiff: Release/libktx.so.0.0.0 \ + external/astc-encoder/Source/libastcenc-avx2-static.a \ + external/fmt/libfmt.a \ + libobjUtil.a \ + /usr/lib/Scrt1.o \ + /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o + +tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff/ktxdiff_main.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/os.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/include/unistd.h: + +/usr/include/time.h: + +/usr/include/sys/types.h: + +/usr/include/sys/cdefs.h: + +/usr/include/string.h: + +/usr/include/stdlib.h: + +/usr/include/pthread.h: + +/usr/include/linux/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/sched/types.h: + +/usr/include/limits.h: + +/usr/include/gnu/stubs.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/features-time64.h: + +/usr/include/fcntl.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/vector: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/c++/16.1.1/ratio: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/c++/16.1.1/memory: + +/usr/include/c++/16.1.1/locale: + +/usr/include/c++/16.1.1/iterator: + +/usr/include/c++/16.1.1/ios: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/include/c++/16.1.1/fstream: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/types/clock_t.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/types/__locale_t.h: + +external/fmt/libfmt.a: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/FILE.h: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/bits/setjmp.h: + +/usr/include/features.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/bits/sched.h: + +/usr/include/c++/16.1.1/bits/stream_iterator.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/bits/posix_opt.h: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/bits/posix2_lim.h: + +/usr/include/bits/mathcalls.h: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/exception: + +/usr/include/bits/mathcalls-macros.h: + +/usr/include/asm-generic/int-ll64.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/linux/openat2.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/bits/iscanonical.h: + +/usr/include/errno.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/usr/include/bits/getopt_posix.h: + +/usr/include/bits/cloexec.h: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/bits/fp-logb.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/bits/floatn.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/bits/fcntl-linux.h: + +/usr/lib/libatomic.so: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/lib/libgcc_s.so.1: + +/usr/include/bits/confname.h: + +/usr/include/bits/select.h: + +tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/lib/libmvec.so.1: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/lib/libm.so.6: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/include/assert.h: + +/usr/include/bits/stat.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/usr/include/bits/mathcalls-narrow.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/os.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/usr/include/alloca.h: + +external/astc-encoder/Source/libastcenc-avx2-static.a: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/lib/Scrt1.o: + +/usr/include/bits/types/timer_t.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/libc-header-start.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/bits/local_lim.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/bits/typesizes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/include/bits/types.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/bits/getopt_core.h: + +/usr/include/c++/16.1.1/istream: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/lib/crtn.o: + +/usr/include/bits/types/error_t.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/bits/stdint-intn.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h: + +/usr/include/locale.h: + +/usr/lib/libstdc++.so: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/bits/math-vector.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/usr/include/bits/environments.h: + +/usr/include/bits/types/struct_FILE.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h: + +/usr/include/asm/types.h: + +/usr/include/bits/types/time_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/lib/libc.so: + +/usr/include/wchar.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/wctype.h: + +/usr/include/sched.h: + +/usr/include/bits/fp-fast.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h: + +Release/libktx.so.0.0.0: + +/usr/include/bits/byteswap.h: + +/usr/include/sys/select.h: + +/usr/include/c++/16.1.1/cstring: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h: + +/usr/include/bits/types/struct_iovec.h: + +libobjUtil.a: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/asm/posix_types_64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h: + +/usr/include/bits/long-double.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl: + +/usr/include/c++/16.1.1/cassert: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/asm-generic/types.h: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/bits/timesize.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/asm/errno.h: + +/usr/include/bits/cpu-set.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/linux/falloc.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h: + +/usr/include/bits/waitflags.h: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/lib/libm.so: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff/ktxdiff_main.cpp: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/lib/libgcc_s.so: + +/usr/include/c++/16.1.1/algorithm: + +/usr/lib/crti.o: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/c++/16.1.1/math.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/bits/chrono.h: + +/usr/include/strings.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/linux/limits.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/c++/16.1.1/bits/fstream.tcc: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/libintl.h: + +/usr/include/bits/endianness.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/bits/struct_stat.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/bits/fcntl.h: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/math.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/bits/openat2.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/c++/16.1.1/chrono: + +/usr/include/stdio.h: + +/usr/include/bits/wordsize.h: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/lib/libc.so.6: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/bits/specfun.h: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/debug/debug.h: diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/compiler_depend.ts b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/compiler_depend.ts new file mode 100644 index 0000000..ea2e9bc --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for ktxdiff. diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/depend.make b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/depend.make new file mode 100644 index 0000000..4ab97b9 --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for ktxdiff. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/flags.make b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/flags.make new file mode 100644 index 0000000..564e47d --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff/. -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o new file mode 100644 index 0000000..210b482 Binary files /dev/null and b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o differ diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o.d b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o.d new file mode 100644 index 0000000..f601e98 --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o.d @@ -0,0 +1,256 @@ +tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff/ktxdiff_main.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h \ + /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/unistd.h \ + /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \ + /usr/include/bits/confname.h /usr/include/bits/getopt_posix.h \ + /usr/include/bits/getopt_core.h /usr/include/bits/unistd_ext.h \ + /usr/include/linux/close_range.h /usr/include/fcntl.h \ + /usr/include/bits/fcntl.h /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/types/struct_iovec.h /usr/include/bits/cloexec.h \ + /usr/include/linux/falloc.h /usr/include/linux/openat2.h \ + /usr/include/linux/types.h /usr/include/asm/types.h \ + /usr/include/asm-generic/types.h /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm/bitsperlong.h /usr/include/asm-generic/bitsperlong.h \ + /usr/include/linux/posix_types.h /usr/include/linux/stddef.h \ + /usr/include/asm/posix_types.h /usr/include/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h /usr/include/bits/openat2.h \ + /usr/include/bits/stat.h /usr/include/bits/struct_stat.h \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/string.h \ + /usr/include/strings.h /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/iostream /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/bits/ostream.h /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/vector /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /usr/include/c++/16.1.1/cstdint /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/os.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/link.d b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/link.d new file mode 100644 index 0000000..56c63a3 --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/link.d @@ -0,0 +1,118 @@ +../../Release/ktxdiff: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o \ + ../../Release/libktx.so.0.0.0 \ + ../../external/astc-encoder/Source/libastcenc-avx2-static.a \ + ../../external/fmt/libfmt.a \ + ../../libobjUtil.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o \ + /usr/lib/ld-linux-x86-64.so.2 + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o: + +../../Release/libktx.so.0.0.0: + +../../external/astc-encoder/Source/libastcenc-avx2-static.a: + +../../external/fmt/libfmt.a: + +../../libobjUtil.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: + +/usr/lib/ld-linux-x86-64.so.2: diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/link.txt b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/link.txt new file mode 100644 index 0000000..51a219f --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -msse4.1 -O3 -DNDEBUG -O3 -Wl,--dependency-file=CMakeFiles/ktxdiff.dir/link.d CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o -o ../../Release/ktxdiff -Wl,-rpath,"\$ORIGIN:\$ORIGIN/../lib" ../../Release/libktx.so.0.0.0 ../../external/astc-encoder/Source/libastcenc-avx2-static.a ../../external/fmt/libfmt.a ../../libobjUtil.a diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/progress.make b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/progress.make new file mode 100644 index 0000000..938a393 --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/ktxdiff.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 76 + diff --git a/ktx/build/tests/ktxdiff/CMakeFiles/progress.marks b/ktx/build/tests/ktxdiff/CMakeFiles/progress.marks new file mode 100644 index 0000000..9e5feb5 --- /dev/null +++ b/ktx/build/tests/ktxdiff/CMakeFiles/progress.marks @@ -0,0 +1 @@ +46 diff --git a/ktx/build/tests/ktxdiff/CTestTestfile.cmake b/ktx/build/tests/ktxdiff/CTestTestfile.cmake new file mode 100644 index 0000000..56b1e51 --- /dev/null +++ b/ktx/build/tests/ktxdiff/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/tests/ktxdiff/Makefile b/ktx/build/tests/ktxdiff/Makefile new file mode 100644 index 0000000..2307f74 --- /dev/null +++ b/ktx/build/tests/ktxdiff/Makefile @@ -0,0 +1,264 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/ktxdiff/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/ktxdiff/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/ktxdiff/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/ktxdiff/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tests/ktxdiff/CMakeFiles/ktxdiff.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/ktxdiff/CMakeFiles/ktxdiff.dir/rule +.PHONY : tests/ktxdiff/CMakeFiles/ktxdiff.dir/rule + +# Convenience name for target. +ktxdiff: tests/ktxdiff/CMakeFiles/ktxdiff.dir/rule +.PHONY : ktxdiff + +# fast build rule for target. +ktxdiff/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make tests/ktxdiff/CMakeFiles/ktxdiff.dir/build +.PHONY : ktxdiff/fast + +ktxdiff_main.o: ktxdiff_main.cpp.o +.PHONY : ktxdiff_main.o + +# target to build an object file +ktxdiff_main.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.o +.PHONY : ktxdiff_main.cpp.o + +ktxdiff_main.i: ktxdiff_main.cpp.i +.PHONY : ktxdiff_main.i + +# target to preprocess a source file +ktxdiff_main.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.i +.PHONY : ktxdiff_main.cpp.i + +ktxdiff_main.s: ktxdiff_main.cpp.s +.PHONY : ktxdiff_main.s + +# target to generate assembly for a file +ktxdiff_main.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/ktxdiff/CMakeFiles/ktxdiff.dir/build.make tests/ktxdiff/CMakeFiles/ktxdiff.dir/ktxdiff_main.cpp.s +.PHONY : ktxdiff_main.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... ktxdiff" + @echo "... ktxdiff_main.o" + @echo "... ktxdiff_main.i" + @echo "... ktxdiff_main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tests/ktxdiff/cmake_install.cmake b/ktx/build/tests/ktxdiff/cmake_install.cmake new file mode 100644 index 0000000..b400d58 --- /dev/null +++ b/ktx/build/tests/ktxdiff/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/ktxdiff + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/ktxdiff/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tests/loadtests/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tests/loadtests/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/DependInfo.cmake b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/DependInfo.cmake new file mode 100644 index 0000000..4fc580a --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/DependInfo.cmake @@ -0,0 +1,26 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.cpp" "tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o" "gcc" "tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/main.cpp" "tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o" "gcc" "tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.cpp" "tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o" "gcc" "tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.cpp" "tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o" "gcc" "tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o new file mode 100644 index 0000000..a46fbfc Binary files /dev/null and b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o differ diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o.d b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o.d new file mode 100644 index 0000000..d96975a --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o.d @@ -0,0 +1,205 @@ +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.h \ + /usr/include/SDL3/SDL.h /usr/include/SDL3/SDL_stdinc.h \ + /usr/include/SDL3/SDL_platform_defines.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/string.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/wchar.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/SDL3/SDL_begin_code.h \ + /usr/include/SDL3/SDL_close_code.h /usr/include/SDL3/SDL_assert.h \ + /usr/include/SDL3/SDL_asyncio.h /usr/include/SDL3/SDL_atomic.h \ + /usr/include/SDL3/SDL_audio.h /usr/include/SDL3/SDL_endian.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/SDL3/SDL_error.h \ + /usr/include/SDL3/SDL_mutex.h /usr/include/SDL3/SDL_thread.h \ + /usr/include/SDL3/SDL_properties.h /usr/include/SDL3/SDL_iostream.h \ + /usr/include/SDL3/SDL_bits.h /usr/include/SDL3/SDL_blendmode.h \ + /usr/include/SDL3/SDL_camera.h /usr/include/SDL3/SDL_pixels.h \ + /usr/include/SDL3/SDL_surface.h /usr/include/SDL3/SDL_rect.h \ + /usr/include/SDL3/SDL_clipboard.h /usr/include/SDL3/SDL_cpuinfo.h \ + /usr/include/SDL3/SDL_dialog.h /usr/include/SDL3/SDL_video.h \ + /usr/include/SDL3/SDL_dlopennote.h /usr/include/SDL3/SDL_events.h \ + /usr/include/SDL3/SDL_gamepad.h /usr/include/SDL3/SDL_guid.h \ + /usr/include/SDL3/SDL_joystick.h /usr/include/SDL3/SDL_power.h \ + /usr/include/SDL3/SDL_sensor.h /usr/include/SDL3/SDL_keyboard.h \ + /usr/include/SDL3/SDL_keycode.h /usr/include/SDL3/SDL_scancode.h \ + /usr/include/SDL3/SDL_mouse.h /usr/include/SDL3/SDL_pen.h \ + /usr/include/SDL3/SDL_touch.h /usr/include/SDL3/SDL_filesystem.h \ + /usr/include/SDL3/SDL_gpu.h /usr/include/SDL3/SDL_haptic.h \ + /usr/include/SDL3/SDL_hidapi.h /usr/include/SDL3/SDL_hints.h \ + /usr/include/SDL3/SDL_init.h /usr/include/SDL3/SDL_loadso.h \ + /usr/include/SDL3/SDL_locale.h /usr/include/SDL3/SDL_log.h \ + /usr/include/SDL3/SDL_messagebox.h /usr/include/SDL3/SDL_metal.h \ + /usr/include/SDL3/SDL_misc.h /usr/include/SDL3/SDL_platform.h \ + /usr/include/SDL3/SDL_process.h /usr/include/SDL3/SDL_render.h \ + /usr/include/SDL3/SDL_storage.h /usr/include/SDL3/SDL_system.h \ + /usr/include/SDL3/SDL_time.h /usr/include/SDL3/SDL_timer.h \ + /usr/include/SDL3/SDL_tray.h /usr/include/SDL3/SDL_version.h \ + /usr/include/SDL3/SDL_oldnames.h /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/iostream diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o new file mode 100644 index 0000000..a8c2ced Binary files /dev/null and b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o differ diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o.d b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o.d new file mode 100644 index 0000000..e37e86f --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o.d @@ -0,0 +1,244 @@ +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/main.cpp \ + /usr/include/stdc-predef.h /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.h \ + /usr/include/SDL3/SDL.h /usr/include/SDL3/SDL_stdinc.h \ + /usr/include/SDL3/SDL_platform_defines.h /usr/include/string.h \ + /usr/include/strings.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/SDL3/SDL_begin_code.h \ + /usr/include/SDL3/SDL_close_code.h /usr/include/SDL3/SDL_assert.h \ + /usr/include/SDL3/SDL_asyncio.h /usr/include/SDL3/SDL_atomic.h \ + /usr/include/SDL3/SDL_audio.h /usr/include/SDL3/SDL_endian.h \ + /usr/include/SDL3/SDL_error.h /usr/include/SDL3/SDL_mutex.h \ + /usr/include/SDL3/SDL_thread.h /usr/include/SDL3/SDL_properties.h \ + /usr/include/SDL3/SDL_iostream.h /usr/include/SDL3/SDL_bits.h \ + /usr/include/SDL3/SDL_blendmode.h /usr/include/SDL3/SDL_camera.h \ + /usr/include/SDL3/SDL_pixels.h /usr/include/SDL3/SDL_surface.h \ + /usr/include/SDL3/SDL_rect.h /usr/include/SDL3/SDL_clipboard.h \ + /usr/include/SDL3/SDL_cpuinfo.h /usr/include/SDL3/SDL_dialog.h \ + /usr/include/SDL3/SDL_video.h /usr/include/SDL3/SDL_dlopennote.h \ + /usr/include/SDL3/SDL_events.h /usr/include/SDL3/SDL_gamepad.h \ + /usr/include/SDL3/SDL_guid.h /usr/include/SDL3/SDL_joystick.h \ + /usr/include/SDL3/SDL_power.h /usr/include/SDL3/SDL_sensor.h \ + /usr/include/SDL3/SDL_keyboard.h /usr/include/SDL3/SDL_keycode.h \ + /usr/include/SDL3/SDL_scancode.h /usr/include/SDL3/SDL_mouse.h \ + /usr/include/SDL3/SDL_pen.h /usr/include/SDL3/SDL_touch.h \ + /usr/include/SDL3/SDL_filesystem.h /usr/include/SDL3/SDL_gpu.h \ + /usr/include/SDL3/SDL_haptic.h /usr/include/SDL3/SDL_hidapi.h \ + /usr/include/SDL3/SDL_hints.h /usr/include/SDL3/SDL_init.h \ + /usr/include/SDL3/SDL_loadso.h /usr/include/SDL3/SDL_locale.h \ + /usr/include/SDL3/SDL_log.h /usr/include/SDL3/SDL_messagebox.h \ + /usr/include/SDL3/SDL_metal.h /usr/include/SDL3/SDL_misc.h \ + /usr/include/SDL3/SDL_platform.h /usr/include/SDL3/SDL_process.h \ + /usr/include/SDL3/SDL_render.h /usr/include/SDL3/SDL_storage.h \ + /usr/include/SDL3/SDL_system.h /usr/include/SDL3/SDL_time.h \ + /usr/include/SDL3/SDL_timer.h /usr/include/SDL3/SDL_tray.h \ + /usr/include/SDL3/SDL_version.h /usr/include/SDL3/SDL_oldnames.h \ + /usr/include/SDL3/SDL_main.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/unistd.h \ + /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \ + /usr/include/bits/confname.h /usr/include/bits/getopt_posix.h \ + /usr/include/bits/getopt_core.h /usr/include/bits/unistd_ext.h \ + /usr/include/linux/close_range.h /usr/include/fcntl.h \ + /usr/include/bits/fcntl.h /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/types/struct_iovec.h /usr/include/bits/cloexec.h \ + /usr/include/linux/falloc.h /usr/include/linux/openat2.h \ + /usr/include/linux/types.h /usr/include/asm/types.h \ + /usr/include/asm-generic/types.h /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm/bitsperlong.h /usr/include/asm-generic/bitsperlong.h \ + /usr/include/linux/posix_types.h /usr/include/linux/stddef.h \ + /usr/include/asm/posix_types.h /usr/include/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h /usr/include/bits/openat2.h \ + /usr/include/bits/stat.h /usr/include/bits/struct_stat.h \ + /usr/include/c++/16.1.1/iostream /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/bits/ostream.h /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/SDL_gesture/SDL_gesture.h \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/limits /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/build.make b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/build.make new file mode 100644 index 0000000..7893044 --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/build.make @@ -0,0 +1,162 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tests/loadtests/CMakeFiles/appfwSDL.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.make + +# Include the progress variables for this target. +include tests/loadtests/CMakeFiles/appfwSDL.dir/progress.make + +# Include the compile flags for this target's objects. +include tests/loadtests/CMakeFiles/appfwSDL.dir/flags.make + +tests/loadtests/CMakeFiles/appfwSDL.dir/codegen: +.PHONY : tests/loadtests/CMakeFiles/appfwSDL.dir/codegen + +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o: tests/loadtests/CMakeFiles/appfwSDL.dir/flags.make +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.cpp +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o: tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o -MF CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o.d -o CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.cpp + +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.cpp > CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.i + +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.cpp -o CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.s + +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o: tests/loadtests/CMakeFiles/appfwSDL.dir/flags.make +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/main.cpp +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o: tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o -MF CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o.d -o CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/main.cpp + +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/main.cpp > CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.i + +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/main.cpp -o CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.s + +tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o: tests/loadtests/CMakeFiles/appfwSDL.dir/flags.make +tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.cpp +tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o: tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o -MF CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o.d -o CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.cpp + +tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.cpp > CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.i + +tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.cpp -o CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.s + +tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o: tests/loadtests/CMakeFiles/appfwSDL.dir/flags.make +tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.cpp +tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o: tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o -MF CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o.d -o CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.cpp + +tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.cpp > CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.i + +tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.cpp -o CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.s + +# Object files for target appfwSDL +appfwSDL_OBJECTS = \ +"CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o" \ +"CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o" \ +"CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o" \ +"CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o" + +# External object files for target appfwSDL +appfwSDL_EXTERNAL_OBJECTS = + +tests/loadtests/libappfwSDL.a: tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o +tests/loadtests/libappfwSDL.a: tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o +tests/loadtests/libappfwSDL.a: tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o +tests/loadtests/libappfwSDL.a: tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o +tests/loadtests/libappfwSDL.a: tests/loadtests/CMakeFiles/appfwSDL.dir/build.make +tests/loadtests/libappfwSDL.a: tests/loadtests/CMakeFiles/appfwSDL.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Linking CXX static library libappfwSDL.a" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && $(CMAKE_COMMAND) -P CMakeFiles/appfwSDL.dir/cmake_clean_target.cmake + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/appfwSDL.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tests/loadtests/CMakeFiles/appfwSDL.dir/build: tests/loadtests/libappfwSDL.a +.PHONY : tests/loadtests/CMakeFiles/appfwSDL.dir/build + +tests/loadtests/CMakeFiles/appfwSDL.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests && $(CMAKE_COMMAND) -P CMakeFiles/appfwSDL.dir/cmake_clean.cmake +.PHONY : tests/loadtests/CMakeFiles/appfwSDL.dir/clean + +tests/loadtests/CMakeFiles/appfwSDL.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/DependInfo.cmake "--color=$(COLOR)" appfwSDL +.PHONY : tests/loadtests/CMakeFiles/appfwSDL.dir/depend + diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/cmake_clean.cmake b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/cmake_clean.cmake new file mode 100644 index 0000000..f41d1b1 --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/cmake_clean.cmake @@ -0,0 +1,17 @@ +file(REMOVE_RECURSE + "CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o" + "CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o.d" + "CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o" + "CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o.d" + "CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o" + "CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o.d" + "CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o" + "CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o.d" + "libappfwSDL.a" + "libappfwSDL.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/appfwSDL.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/cmake_clean_target.cmake b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/cmake_clean_target.cmake new file mode 100644 index 0000000..f40758e --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libappfwSDL.a" +) diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o new file mode 100644 index 0000000..2ce7c98 Binary files /dev/null and b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o differ diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o.d b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o.d new file mode 100644 index 0000000..cb633c6 --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o.d @@ -0,0 +1,396 @@ +tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/SDL3/SDL.h /usr/include/SDL3/SDL_stdinc.h \ + /usr/include/SDL3/SDL_platform_defines.h /usr/include/string.h \ + /usr/include/strings.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/SDL3/SDL_begin_code.h \ + /usr/include/SDL3/SDL_close_code.h /usr/include/SDL3/SDL_assert.h \ + /usr/include/SDL3/SDL_asyncio.h /usr/include/SDL3/SDL_atomic.h \ + /usr/include/SDL3/SDL_audio.h /usr/include/SDL3/SDL_endian.h \ + /usr/include/SDL3/SDL_error.h /usr/include/SDL3/SDL_mutex.h \ + /usr/include/SDL3/SDL_thread.h /usr/include/SDL3/SDL_properties.h \ + /usr/include/SDL3/SDL_iostream.h /usr/include/SDL3/SDL_bits.h \ + /usr/include/SDL3/SDL_blendmode.h /usr/include/SDL3/SDL_camera.h \ + /usr/include/SDL3/SDL_pixels.h /usr/include/SDL3/SDL_surface.h \ + /usr/include/SDL3/SDL_rect.h /usr/include/SDL3/SDL_clipboard.h \ + /usr/include/SDL3/SDL_cpuinfo.h /usr/include/SDL3/SDL_dialog.h \ + /usr/include/SDL3/SDL_video.h /usr/include/SDL3/SDL_dlopennote.h \ + /usr/include/SDL3/SDL_events.h /usr/include/SDL3/SDL_gamepad.h \ + /usr/include/SDL3/SDL_guid.h /usr/include/SDL3/SDL_joystick.h \ + /usr/include/SDL3/SDL_power.h /usr/include/SDL3/SDL_sensor.h \ + /usr/include/SDL3/SDL_keyboard.h /usr/include/SDL3/SDL_keycode.h \ + /usr/include/SDL3/SDL_scancode.h /usr/include/SDL3/SDL_mouse.h \ + /usr/include/SDL3/SDL_pen.h /usr/include/SDL3/SDL_touch.h \ + /usr/include/SDL3/SDL_filesystem.h /usr/include/SDL3/SDL_gpu.h \ + /usr/include/SDL3/SDL_haptic.h /usr/include/SDL3/SDL_hidapi.h \ + /usr/include/SDL3/SDL_hints.h /usr/include/SDL3/SDL_init.h \ + /usr/include/SDL3/SDL_loadso.h /usr/include/SDL3/SDL_locale.h \ + /usr/include/SDL3/SDL_log.h /usr/include/SDL3/SDL_messagebox.h \ + /usr/include/SDL3/SDL_metal.h /usr/include/SDL3/SDL_misc.h \ + /usr/include/SDL3/SDL_platform.h /usr/include/SDL3/SDL_process.h \ + /usr/include/SDL3/SDL_render.h /usr/include/SDL3/SDL_storage.h \ + /usr/include/SDL3/SDL_system.h /usr/include/SDL3/SDL_time.h \ + /usr/include/SDL3/SDL_timer.h /usr/include/SDL3/SDL_tray.h \ + /usr/include/SDL3/SDL_version.h /usr/include/SDL3/SDL_oldnames.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/disable_glm_warnings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/limits /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/climits \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/reenable_warnings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/vector_angle.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/epsilon.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/epsilon.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/norm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/norm.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/rotate_vector.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/transform.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/matrix_transform.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/matrix_transform.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/transform.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/rotate_vector.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/vector_angle.inl diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o new file mode 100644 index 0000000..6948bbd Binary files /dev/null and b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o differ diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o.d b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o.d new file mode 100644 index 0000000..1c7b635 --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o.d @@ -0,0 +1,169 @@ +tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.cpp \ + /usr/include/stdc-predef.h /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.h \ + /usr/include/c++/16.1.1/optional /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/type_traits /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/utility.h /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/limits /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc /usr/include/SDL3/SDL.h \ + /usr/include/SDL3/SDL_stdinc.h /usr/include/SDL3/SDL_platform_defines.h \ + /usr/include/string.h /usr/include/strings.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/SDL3/SDL_begin_code.h \ + /usr/include/SDL3/SDL_close_code.h /usr/include/SDL3/SDL_assert.h \ + /usr/include/SDL3/SDL_asyncio.h /usr/include/SDL3/SDL_atomic.h \ + /usr/include/SDL3/SDL_audio.h /usr/include/SDL3/SDL_endian.h \ + /usr/include/SDL3/SDL_error.h /usr/include/SDL3/SDL_mutex.h \ + /usr/include/SDL3/SDL_thread.h /usr/include/SDL3/SDL_properties.h \ + /usr/include/SDL3/SDL_iostream.h /usr/include/SDL3/SDL_bits.h \ + /usr/include/SDL3/SDL_blendmode.h /usr/include/SDL3/SDL_camera.h \ + /usr/include/SDL3/SDL_pixels.h /usr/include/SDL3/SDL_surface.h \ + /usr/include/SDL3/SDL_rect.h /usr/include/SDL3/SDL_clipboard.h \ + /usr/include/SDL3/SDL_cpuinfo.h /usr/include/SDL3/SDL_dialog.h \ + /usr/include/SDL3/SDL_video.h /usr/include/SDL3/SDL_dlopennote.h \ + /usr/include/SDL3/SDL_events.h /usr/include/SDL3/SDL_gamepad.h \ + /usr/include/SDL3/SDL_guid.h /usr/include/SDL3/SDL_joystick.h \ + /usr/include/SDL3/SDL_power.h /usr/include/SDL3/SDL_sensor.h \ + /usr/include/SDL3/SDL_keyboard.h /usr/include/SDL3/SDL_keycode.h \ + /usr/include/SDL3/SDL_scancode.h /usr/include/SDL3/SDL_mouse.h \ + /usr/include/SDL3/SDL_pen.h /usr/include/SDL3/SDL_touch.h \ + /usr/include/SDL3/SDL_filesystem.h /usr/include/SDL3/SDL_gpu.h \ + /usr/include/SDL3/SDL_haptic.h /usr/include/SDL3/SDL_hidapi.h \ + /usr/include/SDL3/SDL_hints.h /usr/include/SDL3/SDL_init.h \ + /usr/include/SDL3/SDL_loadso.h /usr/include/SDL3/SDL_locale.h \ + /usr/include/SDL3/SDL_log.h /usr/include/SDL3/SDL_messagebox.h \ + /usr/include/SDL3/SDL_metal.h /usr/include/SDL3/SDL_misc.h \ + /usr/include/SDL3/SDL_platform.h /usr/include/SDL3/SDL_process.h \ + /usr/include/SDL3/SDL_render.h /usr/include/SDL3/SDL_storage.h \ + /usr/include/SDL3/SDL_system.h /usr/include/SDL3/SDL_time.h \ + /usr/include/SDL3/SDL_timer.h /usr/include/SDL3/SDL_tray.h \ + /usr/include/SDL3/SDL_version.h /usr/include/SDL3/SDL_oldnames.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/SDL_gesture/SDL_gesture.h diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.internal b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.internal new file mode 100644 index 0000000..805e686 --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.internal @@ -0,0 +1,1377 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.h + /usr/include/SDL3/SDL.h + /usr/include/SDL3/SDL_assert.h + /usr/include/SDL3/SDL_asyncio.h + /usr/include/SDL3/SDL_atomic.h + /usr/include/SDL3/SDL_audio.h + /usr/include/SDL3/SDL_begin_code.h + /usr/include/SDL3/SDL_bits.h + /usr/include/SDL3/SDL_blendmode.h + /usr/include/SDL3/SDL_camera.h + /usr/include/SDL3/SDL_clipboard.h + /usr/include/SDL3/SDL_close_code.h + /usr/include/SDL3/SDL_cpuinfo.h + /usr/include/SDL3/SDL_dialog.h + /usr/include/SDL3/SDL_dlopennote.h + /usr/include/SDL3/SDL_endian.h + /usr/include/SDL3/SDL_error.h + /usr/include/SDL3/SDL_events.h + /usr/include/SDL3/SDL_filesystem.h + /usr/include/SDL3/SDL_gamepad.h + /usr/include/SDL3/SDL_gpu.h + /usr/include/SDL3/SDL_guid.h + /usr/include/SDL3/SDL_haptic.h + /usr/include/SDL3/SDL_hidapi.h + /usr/include/SDL3/SDL_hints.h + /usr/include/SDL3/SDL_init.h + /usr/include/SDL3/SDL_iostream.h + /usr/include/SDL3/SDL_joystick.h + /usr/include/SDL3/SDL_keyboard.h + /usr/include/SDL3/SDL_keycode.h + /usr/include/SDL3/SDL_loadso.h + /usr/include/SDL3/SDL_locale.h + /usr/include/SDL3/SDL_log.h + /usr/include/SDL3/SDL_messagebox.h + /usr/include/SDL3/SDL_metal.h + /usr/include/SDL3/SDL_misc.h + /usr/include/SDL3/SDL_mouse.h + /usr/include/SDL3/SDL_mutex.h + /usr/include/SDL3/SDL_oldnames.h + /usr/include/SDL3/SDL_pen.h + /usr/include/SDL3/SDL_pixels.h + /usr/include/SDL3/SDL_platform.h + /usr/include/SDL3/SDL_platform_defines.h + /usr/include/SDL3/SDL_power.h + /usr/include/SDL3/SDL_process.h + /usr/include/SDL3/SDL_properties.h + /usr/include/SDL3/SDL_rect.h + /usr/include/SDL3/SDL_render.h + /usr/include/SDL3/SDL_scancode.h + /usr/include/SDL3/SDL_sensor.h + /usr/include/SDL3/SDL_stdinc.h + /usr/include/SDL3/SDL_storage.h + /usr/include/SDL3/SDL_surface.h + /usr/include/SDL3/SDL_system.h + /usr/include/SDL3/SDL_thread.h + /usr/include/SDL3/SDL_time.h + /usr/include/SDL3/SDL_timer.h + /usr/include/SDL3/SDL_touch.h + /usr/include/SDL3/SDL_tray.h + /usr/include/SDL3/SDL_version.h + /usr/include/SDL3/SDL_video.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/linux/errno.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/main.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/SDL_gesture/SDL_gesture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/SDL3/SDL.h + /usr/include/SDL3/SDL_assert.h + /usr/include/SDL3/SDL_asyncio.h + /usr/include/SDL3/SDL_atomic.h + /usr/include/SDL3/SDL_audio.h + /usr/include/SDL3/SDL_begin_code.h + /usr/include/SDL3/SDL_bits.h + /usr/include/SDL3/SDL_blendmode.h + /usr/include/SDL3/SDL_camera.h + /usr/include/SDL3/SDL_clipboard.h + /usr/include/SDL3/SDL_close_code.h + /usr/include/SDL3/SDL_cpuinfo.h + /usr/include/SDL3/SDL_dialog.h + /usr/include/SDL3/SDL_dlopennote.h + /usr/include/SDL3/SDL_endian.h + /usr/include/SDL3/SDL_error.h + /usr/include/SDL3/SDL_events.h + /usr/include/SDL3/SDL_filesystem.h + /usr/include/SDL3/SDL_gamepad.h + /usr/include/SDL3/SDL_gpu.h + /usr/include/SDL3/SDL_guid.h + /usr/include/SDL3/SDL_haptic.h + /usr/include/SDL3/SDL_hidapi.h + /usr/include/SDL3/SDL_hints.h + /usr/include/SDL3/SDL_init.h + /usr/include/SDL3/SDL_iostream.h + /usr/include/SDL3/SDL_joystick.h + /usr/include/SDL3/SDL_keyboard.h + /usr/include/SDL3/SDL_keycode.h + /usr/include/SDL3/SDL_loadso.h + /usr/include/SDL3/SDL_locale.h + /usr/include/SDL3/SDL_log.h + /usr/include/SDL3/SDL_main.h + /usr/include/SDL3/SDL_messagebox.h + /usr/include/SDL3/SDL_metal.h + /usr/include/SDL3/SDL_misc.h + /usr/include/SDL3/SDL_mouse.h + /usr/include/SDL3/SDL_mutex.h + /usr/include/SDL3/SDL_oldnames.h + /usr/include/SDL3/SDL_pen.h + /usr/include/SDL3/SDL_pixels.h + /usr/include/SDL3/SDL_platform.h + /usr/include/SDL3/SDL_platform_defines.h + /usr/include/SDL3/SDL_power.h + /usr/include/SDL3/SDL_process.h + /usr/include/SDL3/SDL_properties.h + /usr/include/SDL3/SDL_rect.h + /usr/include/SDL3/SDL_render.h + /usr/include/SDL3/SDL_scancode.h + /usr/include/SDL3/SDL_sensor.h + /usr/include/SDL3/SDL_stdinc.h + /usr/include/SDL3/SDL_storage.h + /usr/include/SDL3/SDL_surface.h + /usr/include/SDL3/SDL_system.h + /usr/include/SDL3/SDL_thread.h + /usr/include/SDL3/SDL_time.h + /usr/include/SDL3/SDL_timer.h + /usr/include/SDL3/SDL_touch.h + /usr/include/SDL3/SDL_tray.h + /usr/include/SDL3/SDL_version.h + /usr/include/SDL3/SDL_video.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/epsilon.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/epsilon.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/matrix_transform.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/matrix_transform.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/norm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/norm.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/rotate_vector.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/rotate_vector.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/transform.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/transform.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/vector_angle.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/vector_angle.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/disable_glm_warnings.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/reenable_warnings.h + /usr/include/SDL3/SDL.h + /usr/include/SDL3/SDL_assert.h + /usr/include/SDL3/SDL_asyncio.h + /usr/include/SDL3/SDL_atomic.h + /usr/include/SDL3/SDL_audio.h + /usr/include/SDL3/SDL_begin_code.h + /usr/include/SDL3/SDL_bits.h + /usr/include/SDL3/SDL_blendmode.h + /usr/include/SDL3/SDL_camera.h + /usr/include/SDL3/SDL_clipboard.h + /usr/include/SDL3/SDL_close_code.h + /usr/include/SDL3/SDL_cpuinfo.h + /usr/include/SDL3/SDL_dialog.h + /usr/include/SDL3/SDL_dlopennote.h + /usr/include/SDL3/SDL_endian.h + /usr/include/SDL3/SDL_error.h + /usr/include/SDL3/SDL_events.h + /usr/include/SDL3/SDL_filesystem.h + /usr/include/SDL3/SDL_gamepad.h + /usr/include/SDL3/SDL_gpu.h + /usr/include/SDL3/SDL_guid.h + /usr/include/SDL3/SDL_haptic.h + /usr/include/SDL3/SDL_hidapi.h + /usr/include/SDL3/SDL_hints.h + /usr/include/SDL3/SDL_init.h + /usr/include/SDL3/SDL_iostream.h + /usr/include/SDL3/SDL_joystick.h + /usr/include/SDL3/SDL_keyboard.h + /usr/include/SDL3/SDL_keycode.h + /usr/include/SDL3/SDL_loadso.h + /usr/include/SDL3/SDL_locale.h + /usr/include/SDL3/SDL_log.h + /usr/include/SDL3/SDL_messagebox.h + /usr/include/SDL3/SDL_metal.h + /usr/include/SDL3/SDL_misc.h + /usr/include/SDL3/SDL_mouse.h + /usr/include/SDL3/SDL_mutex.h + /usr/include/SDL3/SDL_oldnames.h + /usr/include/SDL3/SDL_pen.h + /usr/include/SDL3/SDL_pixels.h + /usr/include/SDL3/SDL_platform.h + /usr/include/SDL3/SDL_platform_defines.h + /usr/include/SDL3/SDL_power.h + /usr/include/SDL3/SDL_process.h + /usr/include/SDL3/SDL_properties.h + /usr/include/SDL3/SDL_rect.h + /usr/include/SDL3/SDL_render.h + /usr/include/SDL3/SDL_scancode.h + /usr/include/SDL3/SDL_sensor.h + /usr/include/SDL3/SDL_stdinc.h + /usr/include/SDL3/SDL_storage.h + /usr/include/SDL3/SDL_surface.h + /usr/include/SDL3/SDL_system.h + /usr/include/SDL3/SDL_thread.h + /usr/include/SDL3/SDL_time.h + /usr/include/SDL3/SDL_timer.h + /usr/include/SDL3/SDL_touch.h + /usr/include/SDL3/SDL_tray.h + /usr/include/SDL3/SDL_version.h + /usr/include/SDL3/SDL_video.h + /usr/include/alloca.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm/errno.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/include/wchar.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/SDL_gesture/SDL_gesture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.h + /usr/include/SDL3/SDL.h + /usr/include/SDL3/SDL_assert.h + /usr/include/SDL3/SDL_asyncio.h + /usr/include/SDL3/SDL_atomic.h + /usr/include/SDL3/SDL_audio.h + /usr/include/SDL3/SDL_begin_code.h + /usr/include/SDL3/SDL_bits.h + /usr/include/SDL3/SDL_blendmode.h + /usr/include/SDL3/SDL_camera.h + /usr/include/SDL3/SDL_clipboard.h + /usr/include/SDL3/SDL_close_code.h + /usr/include/SDL3/SDL_cpuinfo.h + /usr/include/SDL3/SDL_dialog.h + /usr/include/SDL3/SDL_dlopennote.h + /usr/include/SDL3/SDL_endian.h + /usr/include/SDL3/SDL_error.h + /usr/include/SDL3/SDL_events.h + /usr/include/SDL3/SDL_filesystem.h + /usr/include/SDL3/SDL_gamepad.h + /usr/include/SDL3/SDL_gpu.h + /usr/include/SDL3/SDL_guid.h + /usr/include/SDL3/SDL_haptic.h + /usr/include/SDL3/SDL_hidapi.h + /usr/include/SDL3/SDL_hints.h + /usr/include/SDL3/SDL_init.h + /usr/include/SDL3/SDL_iostream.h + /usr/include/SDL3/SDL_joystick.h + /usr/include/SDL3/SDL_keyboard.h + /usr/include/SDL3/SDL_keycode.h + /usr/include/SDL3/SDL_loadso.h + /usr/include/SDL3/SDL_locale.h + /usr/include/SDL3/SDL_log.h + /usr/include/SDL3/SDL_messagebox.h + /usr/include/SDL3/SDL_metal.h + /usr/include/SDL3/SDL_misc.h + /usr/include/SDL3/SDL_mouse.h + /usr/include/SDL3/SDL_mutex.h + /usr/include/SDL3/SDL_oldnames.h + /usr/include/SDL3/SDL_pen.h + /usr/include/SDL3/SDL_pixels.h + /usr/include/SDL3/SDL_platform.h + /usr/include/SDL3/SDL_platform_defines.h + /usr/include/SDL3/SDL_power.h + /usr/include/SDL3/SDL_process.h + /usr/include/SDL3/SDL_properties.h + /usr/include/SDL3/SDL_rect.h + /usr/include/SDL3/SDL_render.h + /usr/include/SDL3/SDL_scancode.h + /usr/include/SDL3/SDL_sensor.h + /usr/include/SDL3/SDL_stdinc.h + /usr/include/SDL3/SDL_storage.h + /usr/include/SDL3/SDL_surface.h + /usr/include/SDL3/SDL_system.h + /usr/include/SDL3/SDL_thread.h + /usr/include/SDL3/SDL_time.h + /usr/include/SDL3/SDL_timer.h + /usr/include/SDL3/SDL_touch.h + /usr/include/SDL3/SDL_tray.h + /usr/include/SDL3/SDL_version.h + /usr/include/SDL3/SDL_video.h + /usr/include/alloca.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm/errno.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/linux/errno.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/include/wchar.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.make b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.make new file mode 100644 index 0000000..ac63474 --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.make @@ -0,0 +1,2579 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.h \ + /usr/include/SDL3/SDL.h \ + /usr/include/SDL3/SDL_assert.h \ + /usr/include/SDL3/SDL_asyncio.h \ + /usr/include/SDL3/SDL_atomic.h \ + /usr/include/SDL3/SDL_audio.h \ + /usr/include/SDL3/SDL_begin_code.h \ + /usr/include/SDL3/SDL_bits.h \ + /usr/include/SDL3/SDL_blendmode.h \ + /usr/include/SDL3/SDL_camera.h \ + /usr/include/SDL3/SDL_clipboard.h \ + /usr/include/SDL3/SDL_close_code.h \ + /usr/include/SDL3/SDL_cpuinfo.h \ + /usr/include/SDL3/SDL_dialog.h \ + /usr/include/SDL3/SDL_dlopennote.h \ + /usr/include/SDL3/SDL_endian.h \ + /usr/include/SDL3/SDL_error.h \ + /usr/include/SDL3/SDL_events.h \ + /usr/include/SDL3/SDL_filesystem.h \ + /usr/include/SDL3/SDL_gamepad.h \ + /usr/include/SDL3/SDL_gpu.h \ + /usr/include/SDL3/SDL_guid.h \ + /usr/include/SDL3/SDL_haptic.h \ + /usr/include/SDL3/SDL_hidapi.h \ + /usr/include/SDL3/SDL_hints.h \ + /usr/include/SDL3/SDL_init.h \ + /usr/include/SDL3/SDL_iostream.h \ + /usr/include/SDL3/SDL_joystick.h \ + /usr/include/SDL3/SDL_keyboard.h \ + /usr/include/SDL3/SDL_keycode.h \ + /usr/include/SDL3/SDL_loadso.h \ + /usr/include/SDL3/SDL_locale.h \ + /usr/include/SDL3/SDL_log.h \ + /usr/include/SDL3/SDL_messagebox.h \ + /usr/include/SDL3/SDL_metal.h \ + /usr/include/SDL3/SDL_misc.h \ + /usr/include/SDL3/SDL_mouse.h \ + /usr/include/SDL3/SDL_mutex.h \ + /usr/include/SDL3/SDL_oldnames.h \ + /usr/include/SDL3/SDL_pen.h \ + /usr/include/SDL3/SDL_pixels.h \ + /usr/include/SDL3/SDL_platform.h \ + /usr/include/SDL3/SDL_platform_defines.h \ + /usr/include/SDL3/SDL_power.h \ + /usr/include/SDL3/SDL_process.h \ + /usr/include/SDL3/SDL_properties.h \ + /usr/include/SDL3/SDL_rect.h \ + /usr/include/SDL3/SDL_render.h \ + /usr/include/SDL3/SDL_scancode.h \ + /usr/include/SDL3/SDL_sensor.h \ + /usr/include/SDL3/SDL_stdinc.h \ + /usr/include/SDL3/SDL_storage.h \ + /usr/include/SDL3/SDL_surface.h \ + /usr/include/SDL3/SDL_system.h \ + /usr/include/SDL3/SDL_thread.h \ + /usr/include/SDL3/SDL_time.h \ + /usr/include/SDL3/SDL_timer.h \ + /usr/include/SDL3/SDL_touch.h \ + /usr/include/SDL3/SDL_tray.h \ + /usr/include/SDL3/SDL_version.h \ + /usr/include/SDL3/SDL_video.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/main.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/SDL_gesture/SDL_gesture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/SDL3/SDL.h \ + /usr/include/SDL3/SDL_assert.h \ + /usr/include/SDL3/SDL_asyncio.h \ + /usr/include/SDL3/SDL_atomic.h \ + /usr/include/SDL3/SDL_audio.h \ + /usr/include/SDL3/SDL_begin_code.h \ + /usr/include/SDL3/SDL_bits.h \ + /usr/include/SDL3/SDL_blendmode.h \ + /usr/include/SDL3/SDL_camera.h \ + /usr/include/SDL3/SDL_clipboard.h \ + /usr/include/SDL3/SDL_close_code.h \ + /usr/include/SDL3/SDL_cpuinfo.h \ + /usr/include/SDL3/SDL_dialog.h \ + /usr/include/SDL3/SDL_dlopennote.h \ + /usr/include/SDL3/SDL_endian.h \ + /usr/include/SDL3/SDL_error.h \ + /usr/include/SDL3/SDL_events.h \ + /usr/include/SDL3/SDL_filesystem.h \ + /usr/include/SDL3/SDL_gamepad.h \ + /usr/include/SDL3/SDL_gpu.h \ + /usr/include/SDL3/SDL_guid.h \ + /usr/include/SDL3/SDL_haptic.h \ + /usr/include/SDL3/SDL_hidapi.h \ + /usr/include/SDL3/SDL_hints.h \ + /usr/include/SDL3/SDL_init.h \ + /usr/include/SDL3/SDL_iostream.h \ + /usr/include/SDL3/SDL_joystick.h \ + /usr/include/SDL3/SDL_keyboard.h \ + /usr/include/SDL3/SDL_keycode.h \ + /usr/include/SDL3/SDL_loadso.h \ + /usr/include/SDL3/SDL_locale.h \ + /usr/include/SDL3/SDL_log.h \ + /usr/include/SDL3/SDL_main.h \ + /usr/include/SDL3/SDL_messagebox.h \ + /usr/include/SDL3/SDL_metal.h \ + /usr/include/SDL3/SDL_misc.h \ + /usr/include/SDL3/SDL_mouse.h \ + /usr/include/SDL3/SDL_mutex.h \ + /usr/include/SDL3/SDL_oldnames.h \ + /usr/include/SDL3/SDL_pen.h \ + /usr/include/SDL3/SDL_pixels.h \ + /usr/include/SDL3/SDL_platform.h \ + /usr/include/SDL3/SDL_platform_defines.h \ + /usr/include/SDL3/SDL_power.h \ + /usr/include/SDL3/SDL_process.h \ + /usr/include/SDL3/SDL_properties.h \ + /usr/include/SDL3/SDL_rect.h \ + /usr/include/SDL3/SDL_render.h \ + /usr/include/SDL3/SDL_scancode.h \ + /usr/include/SDL3/SDL_sensor.h \ + /usr/include/SDL3/SDL_stdinc.h \ + /usr/include/SDL3/SDL_storage.h \ + /usr/include/SDL3/SDL_surface.h \ + /usr/include/SDL3/SDL_system.h \ + /usr/include/SDL3/SDL_thread.h \ + /usr/include/SDL3/SDL_time.h \ + /usr/include/SDL3/SDL_timer.h \ + /usr/include/SDL3/SDL_touch.h \ + /usr/include/SDL3/SDL_tray.h \ + /usr/include/SDL3/SDL_version.h \ + /usr/include/SDL3/SDL_video.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/epsilon.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/epsilon.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/matrix_transform.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/matrix_transform.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/norm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/norm.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/rotate_vector.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/rotate_vector.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/transform.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/transform.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/vector_angle.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/vector_angle.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/disable_glm_warnings.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/reenable_warnings.h \ + /usr/include/SDL3/SDL.h \ + /usr/include/SDL3/SDL_assert.h \ + /usr/include/SDL3/SDL_asyncio.h \ + /usr/include/SDL3/SDL_atomic.h \ + /usr/include/SDL3/SDL_audio.h \ + /usr/include/SDL3/SDL_begin_code.h \ + /usr/include/SDL3/SDL_bits.h \ + /usr/include/SDL3/SDL_blendmode.h \ + /usr/include/SDL3/SDL_camera.h \ + /usr/include/SDL3/SDL_clipboard.h \ + /usr/include/SDL3/SDL_close_code.h \ + /usr/include/SDL3/SDL_cpuinfo.h \ + /usr/include/SDL3/SDL_dialog.h \ + /usr/include/SDL3/SDL_dlopennote.h \ + /usr/include/SDL3/SDL_endian.h \ + /usr/include/SDL3/SDL_error.h \ + /usr/include/SDL3/SDL_events.h \ + /usr/include/SDL3/SDL_filesystem.h \ + /usr/include/SDL3/SDL_gamepad.h \ + /usr/include/SDL3/SDL_gpu.h \ + /usr/include/SDL3/SDL_guid.h \ + /usr/include/SDL3/SDL_haptic.h \ + /usr/include/SDL3/SDL_hidapi.h \ + /usr/include/SDL3/SDL_hints.h \ + /usr/include/SDL3/SDL_init.h \ + /usr/include/SDL3/SDL_iostream.h \ + /usr/include/SDL3/SDL_joystick.h \ + /usr/include/SDL3/SDL_keyboard.h \ + /usr/include/SDL3/SDL_keycode.h \ + /usr/include/SDL3/SDL_loadso.h \ + /usr/include/SDL3/SDL_locale.h \ + /usr/include/SDL3/SDL_log.h \ + /usr/include/SDL3/SDL_messagebox.h \ + /usr/include/SDL3/SDL_metal.h \ + /usr/include/SDL3/SDL_misc.h \ + /usr/include/SDL3/SDL_mouse.h \ + /usr/include/SDL3/SDL_mutex.h \ + /usr/include/SDL3/SDL_oldnames.h \ + /usr/include/SDL3/SDL_pen.h \ + /usr/include/SDL3/SDL_pixels.h \ + /usr/include/SDL3/SDL_platform.h \ + /usr/include/SDL3/SDL_platform_defines.h \ + /usr/include/SDL3/SDL_power.h \ + /usr/include/SDL3/SDL_process.h \ + /usr/include/SDL3/SDL_properties.h \ + /usr/include/SDL3/SDL_rect.h \ + /usr/include/SDL3/SDL_render.h \ + /usr/include/SDL3/SDL_scancode.h \ + /usr/include/SDL3/SDL_sensor.h \ + /usr/include/SDL3/SDL_stdinc.h \ + /usr/include/SDL3/SDL_storage.h \ + /usr/include/SDL3/SDL_surface.h \ + /usr/include/SDL3/SDL_system.h \ + /usr/include/SDL3/SDL_thread.h \ + /usr/include/SDL3/SDL_time.h \ + /usr/include/SDL3/SDL_timer.h \ + /usr/include/SDL3/SDL_touch.h \ + /usr/include/SDL3/SDL_tray.h \ + /usr/include/SDL3/SDL_version.h \ + /usr/include/SDL3/SDL_video.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm/errno.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/SDL_gesture/SDL_gesture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.h \ + /usr/include/SDL3/SDL.h \ + /usr/include/SDL3/SDL_assert.h \ + /usr/include/SDL3/SDL_asyncio.h \ + /usr/include/SDL3/SDL_atomic.h \ + /usr/include/SDL3/SDL_audio.h \ + /usr/include/SDL3/SDL_begin_code.h \ + /usr/include/SDL3/SDL_bits.h \ + /usr/include/SDL3/SDL_blendmode.h \ + /usr/include/SDL3/SDL_camera.h \ + /usr/include/SDL3/SDL_clipboard.h \ + /usr/include/SDL3/SDL_close_code.h \ + /usr/include/SDL3/SDL_cpuinfo.h \ + /usr/include/SDL3/SDL_dialog.h \ + /usr/include/SDL3/SDL_dlopennote.h \ + /usr/include/SDL3/SDL_endian.h \ + /usr/include/SDL3/SDL_error.h \ + /usr/include/SDL3/SDL_events.h \ + /usr/include/SDL3/SDL_filesystem.h \ + /usr/include/SDL3/SDL_gamepad.h \ + /usr/include/SDL3/SDL_gpu.h \ + /usr/include/SDL3/SDL_guid.h \ + /usr/include/SDL3/SDL_haptic.h \ + /usr/include/SDL3/SDL_hidapi.h \ + /usr/include/SDL3/SDL_hints.h \ + /usr/include/SDL3/SDL_init.h \ + /usr/include/SDL3/SDL_iostream.h \ + /usr/include/SDL3/SDL_joystick.h \ + /usr/include/SDL3/SDL_keyboard.h \ + /usr/include/SDL3/SDL_keycode.h \ + /usr/include/SDL3/SDL_loadso.h \ + /usr/include/SDL3/SDL_locale.h \ + /usr/include/SDL3/SDL_log.h \ + /usr/include/SDL3/SDL_messagebox.h \ + /usr/include/SDL3/SDL_metal.h \ + /usr/include/SDL3/SDL_misc.h \ + /usr/include/SDL3/SDL_mouse.h \ + /usr/include/SDL3/SDL_mutex.h \ + /usr/include/SDL3/SDL_oldnames.h \ + /usr/include/SDL3/SDL_pen.h \ + /usr/include/SDL3/SDL_pixels.h \ + /usr/include/SDL3/SDL_platform.h \ + /usr/include/SDL3/SDL_platform_defines.h \ + /usr/include/SDL3/SDL_power.h \ + /usr/include/SDL3/SDL_process.h \ + /usr/include/SDL3/SDL_properties.h \ + /usr/include/SDL3/SDL_rect.h \ + /usr/include/SDL3/SDL_render.h \ + /usr/include/SDL3/SDL_scancode.h \ + /usr/include/SDL3/SDL_sensor.h \ + /usr/include/SDL3/SDL_stdinc.h \ + /usr/include/SDL3/SDL_storage.h \ + /usr/include/SDL3/SDL_surface.h \ + /usr/include/SDL3/SDL_system.h \ + /usr/include/SDL3/SDL_thread.h \ + /usr/include/SDL3/SDL_time.h \ + /usr/include/SDL3/SDL_timer.h \ + /usr/include/SDL3/SDL_touch.h \ + /usr/include/SDL3/SDL_tray.h \ + /usr/include/SDL3/SDL_version.h \ + /usr/include/SDL3/SDL_video.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm/errno.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/linux/errno.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + + +/usr/include/c++/16.1.1/math.h: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/wchar.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp: + +/usr/include/c++/16.1.1/tuple: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.h: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/locale: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/bits/mathcalls.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl: + +/usr/include/SDL3/SDL_misc.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/SDL3/SDL_stdinc.h: + +/usr/include/bits/openat2.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/SDL3/SDL.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/linux/openat2.h: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/math.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/SDL3/SDL_mouse.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/SDL3/SDL_timer.h: + +/usr/include/c++/16.1.1/bits/quoted_string.h: + +/usr/include/SDL3/SDL_time.h: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/bits/fcntl.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/norm.hpp: + +/usr/include/bits/struct_stat.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/usr/include/endian.h: + +/usr/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/norm.inl: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h: + +/usr/include/c++/16.1.1/istream: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/usr/include/c++/16.1.1/optional: + +/usr/include/linux/limits.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/c++/16.1.1/cfloat: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/include/bits/wordsize.h: + +/usr/include/stdio.h: + +/usr/include/c++/16.1.1/cmath: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp: + +/usr/include/bits/typesizes.h: + +/usr/include/bits/types/wint_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h: + +/usr/include/SDL3/SDL_filesystem.h: + +/usr/include/SDL3/SDL_touch.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/SDL3/SDL_thread.h: + +/usr/include/bits/local_lim.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/SDL3/SDL_sensor.h: + +/usr/include/SDL3/SDL_scancode.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h: + +/usr/include/bits/setjmp.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/SDL3/SDL_rect.h: + +/usr/include/bits/fcntl-linux.h: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/SDL3/SDL_platform_defines.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h: + +/usr/include/SDL3/SDL_pixels.h: + +/usr/include/SDL3/SDL_init.h: + +/usr/include/SDL3/SDL_pen.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h: + +/usr/include/SDL3/SDL_oldnames.h: + +/usr/include/bits/types/__locale_t.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/SDL3/SDL_platform.h: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/bits/byteswap.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/SDL3/SDL_metal.h: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/SDL3/SDL_storage.h: + +/usr/include/errno.h: + +/usr/include/bits/getopt_posix.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/vector_angle.inl: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/SDL3/SDL_atomic.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/disable_glm_warnings.h: + +/usr/include/c++/16.1.1/exception: + +/usr/include/bits/stdint-least.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/bits/endianness.h: + +/usr/include/libintl.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h: + +/usr/include/SDL3/SDL_dialog.h: + +/usr/include/c++/16.1.1/limits: + +/usr/include/SDL3/SDL_assert.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h: + +/usr/include/strings.h: + +/usr/include/SDL3/SDL_gpu.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h: + +/usr/include/bits/types/time_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp: + +/usr/include/SDL3/SDL_keycode.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/SDL3/SDL_iostream.h: + +/usr/include/SDL3/SDL_begin_code.h: + +/usr/include/bits/types/clock_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h: + +/usr/include/asm/posix_types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h: + +/usr/include/asm/posix_types_64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h: + +/usr/include/SDL3/SDL_hints.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/usr/include/SDL3/SDL_render.h: + +/usr/include/SDL3/SDL_error.h: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/c++/16.1.1/bits/specfun.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/asm/errno.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h: + +/usr/include/bits/stdint-uintn.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/SwipeDetector.cpp: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/bits/endian.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp: + +/usr/include/bits/timesize.h: + +/usr/include/SDL3/SDL_events.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/SDL3/SDL_asyncio.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl: + +/usr/include/SDL3/SDL_bits.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/bits/cpu-set.h: + +/usr/include/SDL3/SDL_cpuinfo.h: + +/usr/include/SDL3/SDL_dlopennote.h: + +/usr/include/linux/sched/types.h: + +/usr/include/bits/waitflags.h: + +/usr/include/SDL3/SDL_camera.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.cpp: + +/usr/include/stdc-predef.h: + +/usr/include/bits/confname.h: + +/usr/include/SDL3/SDL_gamepad.h: + +/usr/include/SDL3/SDL_audio.h: + +/usr/include/SDL3/SDL_endian.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/features.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/SDL3/SDL_properties.h: + +/usr/include/bits/cloexec.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/SDL3/SDL_surface.h: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/SDL3/SDL_locale.h: + +/usr/include/asm-generic/types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h: + +/usr/include/c++/16.1.1/initializer_list: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl: + +/usr/include/SDL3/SDL_power.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/rotate_vector.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/c++/16.1.1/cassert: + +/usr/include/sys/single_threaded.h: + +/usr/include/asm-generic/errno.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp: + +/usr/include/asm-generic/int-ll64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/iomanip: + +/usr/include/stdlib.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/bits/environments.h: + +/usr/include/SDL3/SDL_close_code.h: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/SDL3/SDL_tray.h: + +/usr/include/bits/floatn-common.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/SDL3/SDL_version.h: + +/usr/include/bits/iscanonical.h: + +/usr/include/bits/floatn.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/bits/long-double.h: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/vector: + +/usr/include/bits/select.h: + +/usr/include/SDL3/SDL_loadso.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/bits/stdio_lim.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/SDL3/SDL_messagebox.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/bits/time64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/linux/errno.h: + +/usr/include/bits/errno.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/vector_angle.hpp: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/bits/types.h: + +/usr/include/bits/types/error_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/bits/math-vector.h: + +/usr/include/bits/uio_lim.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h: + +/usr/include/features-time64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/reenable_warnings.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/linux/types.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/locale.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h: + +/usr/include/pthread.h: + +/usr/include/sched.h: + +/usr/include/wctype.h: + +/usr/include/bits/fp-fast.h: + +/usr/include/string.h: + +/usr/include/sys/cdefs.h: + +/usr/include/sys/select.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/sys/types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/SDL_gesture/SDL_gesture.h: + +/usr/include/gnu/stubs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/SDL3/SDL_main.h: + +/usr/include/SDL3/SDL_log.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h: + +/usr/include/assert.h: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/linux/stddef.h: + +/usr/include/bits/fp-logb.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp: + +/usr/include/bits/getopt_core.h: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/AppBaseSDL.h: + +/usr/include/bits/mathcalls-narrow.h: + +/usr/include/SDL3/SDL_haptic.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h: + +/usr/include/bits/posix_opt.h: + +/usr/include/SDL3/SDL_clipboard.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h: + +/usr/include/bits/stat.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h: + +/usr/include/bits/types/struct_iovec.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/include/c++/16.1.1/ios: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/quaternion.inl: + +/usr/include/SDL3/SDL_hidapi.h: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/linux/falloc.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/bits/mathcalls-macros.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/c++/16.1.1/memory: + +/usr/include/SDL3/SDL_process.h: + +/usr/include/bits/types/__mbstate_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp: + +/usr/include/SDL3/SDL_guid.h: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/fcntl.h: + +/usr/include/unistd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl: + +/usr/include/SDL3/SDL_keyboard.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp: + +/usr/include/linux/posix_types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp: + +/usr/include/bits/types/FILE.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl: + +/usr/include/c++/16.1.1/system_error: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common/LoadTestSample.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h: + +/usr/include/c++/16.1.1/new: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp: + +/usr/include/SDL3/SDL_video.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/transform.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/epsilon.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/matrix_transform.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/epsilon.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/matrix_transform.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/SDL3/SDL_system.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/quaternion.hpp: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/transform.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h: + +/usr/include/SDL3/SDL_blendmode.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL/main.cpp: + +/usr/include/time.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h: + +/usr/include/SDL3/SDL_mutex.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp: + +/usr/include/c++/16.1.1/ctime: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp: + +/usr/include/bits/posix2_lim.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/c++/16.1.1/climits: + +/usr/include/bits/types/timer_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtx/rotate_vector.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h: + +/usr/include/asm/types.h: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/bits/libc-header-start.h: + +/usr/include/c++/16.1.1/stdlib.h: + +/usr/include/limits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h: + +/usr/include/alloca.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h: + +/usr/include/SDL3/SDL_joystick.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h: + +/usr/include/bits/time.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h: + +/usr/include/bits/sched.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h: + +/usr/include/c++/16.1.1/cstddef: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h: diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.ts b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.ts new file mode 100644 index 0000000..a9c6594 --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for appfwSDL. diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/depend.make b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/depend.make new file mode 100644 index 0000000..29a34cc --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for appfwSDL. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/flags.make b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/flags.make new file mode 100644 index 0000000..63b1a9d --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/appfwSDL -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/SDL_gesture -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/common -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/geom -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests/SDL3::Headers -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -fvisibility=hidden -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/link.txt b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/link.txt new file mode 100644 index 0000000..1dac40f --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libappfwSDL.a CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o +/usr/bin/ranlib libappfwSDL.a diff --git a/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/progress.make b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/progress.make new file mode 100644 index 0000000..642dbfc --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/appfwSDL.dir/progress.make @@ -0,0 +1,6 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 1 +CMAKE_PROGRESS_3 = +CMAKE_PROGRESS_4 = 2 +CMAKE_PROGRESS_5 = + diff --git a/ktx/build/tests/loadtests/CMakeFiles/progress.marks b/ktx/build/tests/loadtests/CMakeFiles/progress.marks new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/ktx/build/tests/loadtests/CMakeFiles/progress.marks @@ -0,0 +1 @@ +2 diff --git a/ktx/build/tests/loadtests/CTestTestfile.cmake b/ktx/build/tests/loadtests/CTestTestfile.cmake new file mode 100644 index 0000000..05445be --- /dev/null +++ b/ktx/build/tests/loadtests/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/tests/loadtests/Makefile b/ktx/build/tests/loadtests/Makefile new file mode 100644 index 0000000..436bbaf --- /dev/null +++ b/ktx/build/tests/loadtests/Makefile @@ -0,0 +1,345 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/loadtests/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/loadtests/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/loadtests/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/loadtests/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tests/loadtests/CMakeFiles/appfwSDL.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/loadtests/CMakeFiles/appfwSDL.dir/rule +.PHONY : tests/loadtests/CMakeFiles/appfwSDL.dir/rule + +# Convenience name for target. +appfwSDL: tests/loadtests/CMakeFiles/appfwSDL.dir/rule +.PHONY : appfwSDL + +# fast build rule for target. +appfwSDL/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/build +.PHONY : appfwSDL/fast + +appfwSDL/AppBaseSDL.o: appfwSDL/AppBaseSDL.cpp.o +.PHONY : appfwSDL/AppBaseSDL.o + +# target to build an object file +appfwSDL/AppBaseSDL.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.o +.PHONY : appfwSDL/AppBaseSDL.cpp.o + +appfwSDL/AppBaseSDL.i: appfwSDL/AppBaseSDL.cpp.i +.PHONY : appfwSDL/AppBaseSDL.i + +# target to preprocess a source file +appfwSDL/AppBaseSDL.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.i +.PHONY : appfwSDL/AppBaseSDL.cpp.i + +appfwSDL/AppBaseSDL.s: appfwSDL/AppBaseSDL.cpp.s +.PHONY : appfwSDL/AppBaseSDL.s + +# target to generate assembly for a file +appfwSDL/AppBaseSDL.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/AppBaseSDL.cpp.s +.PHONY : appfwSDL/AppBaseSDL.cpp.s + +appfwSDL/main.o: appfwSDL/main.cpp.o +.PHONY : appfwSDL/main.o + +# target to build an object file +appfwSDL/main.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.o +.PHONY : appfwSDL/main.cpp.o + +appfwSDL/main.i: appfwSDL/main.cpp.i +.PHONY : appfwSDL/main.i + +# target to preprocess a source file +appfwSDL/main.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.i +.PHONY : appfwSDL/main.cpp.i + +appfwSDL/main.s: appfwSDL/main.cpp.s +.PHONY : appfwSDL/main.s + +# target to generate assembly for a file +appfwSDL/main.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/appfwSDL/main.cpp.s +.PHONY : appfwSDL/main.cpp.s + +common/LoadTestSample.o: common/LoadTestSample.cpp.o +.PHONY : common/LoadTestSample.o + +# target to build an object file +common/LoadTestSample.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.o +.PHONY : common/LoadTestSample.cpp.o + +common/LoadTestSample.i: common/LoadTestSample.cpp.i +.PHONY : common/LoadTestSample.i + +# target to preprocess a source file +common/LoadTestSample.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.i +.PHONY : common/LoadTestSample.cpp.i + +common/LoadTestSample.s: common/LoadTestSample.cpp.s +.PHONY : common/LoadTestSample.s + +# target to generate assembly for a file +common/LoadTestSample.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/common/LoadTestSample.cpp.s +.PHONY : common/LoadTestSample.cpp.s + +common/SwipeDetector.o: common/SwipeDetector.cpp.o +.PHONY : common/SwipeDetector.o + +# target to build an object file +common/SwipeDetector.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.o +.PHONY : common/SwipeDetector.cpp.o + +common/SwipeDetector.i: common/SwipeDetector.cpp.i +.PHONY : common/SwipeDetector.i + +# target to preprocess a source file +common/SwipeDetector.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.i +.PHONY : common/SwipeDetector.cpp.i + +common/SwipeDetector.s: common/SwipeDetector.cpp.s +.PHONY : common/SwipeDetector.s + +# target to generate assembly for a file +common/SwipeDetector.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/loadtests/CMakeFiles/appfwSDL.dir/build.make tests/loadtests/CMakeFiles/appfwSDL.dir/common/SwipeDetector.cpp.s +.PHONY : common/SwipeDetector.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... appfwSDL" + @echo "... appfwSDL/AppBaseSDL.o" + @echo "... appfwSDL/AppBaseSDL.i" + @echo "... appfwSDL/AppBaseSDL.s" + @echo "... appfwSDL/main.o" + @echo "... appfwSDL/main.i" + @echo "... appfwSDL/main.s" + @echo "... common/LoadTestSample.o" + @echo "... common/LoadTestSample.i" + @echo "... common/LoadTestSample.s" + @echo "... common/SwipeDetector.o" + @echo "... common/SwipeDetector.i" + @echo "... common/SwipeDetector.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tests/loadtests/cmake_install.cmake b/ktx/build/tests/loadtests/cmake_install.cmake new file mode 100644 index 0000000..820723b --- /dev/null +++ b/ktx/build/tests/loadtests/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/loadtests + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/loadtests/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tests/loadtests/libappfwSDL.a b/ktx/build/tests/loadtests/libappfwSDL.a new file mode 100644 index 0000000..f1215df Binary files /dev/null and b/ktx/build/tests/loadtests/libappfwSDL.a differ diff --git a/ktx/build/tests/streamtests/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tests/streamtests/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tests/streamtests/CMakeFiles/progress.marks b/ktx/build/tests/streamtests/CMakeFiles/progress.marks new file mode 100644 index 0000000..c739b42 --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/progress.marks @@ -0,0 +1 @@ +44 diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/DependInfo.cmake b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/DependInfo.cmake new file mode 100644 index 0000000..a9d104f --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/DependInfo.cmake @@ -0,0 +1,24 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/streamtests.cc" "tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o" "gcc" "tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o.d" + "" "Release/streamtests" "gcc" "tests/streamtests/CMakeFiles/streamtests.dir/link.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/build.make b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/build.make new file mode 100644 index 0000000..cec0f28 --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/build.make @@ -0,0 +1,116 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tests/streamtests/CMakeFiles/streamtests.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tests/streamtests/CMakeFiles/streamtests.dir/compiler_depend.make + +# Include the progress variables for this target. +include tests/streamtests/CMakeFiles/streamtests.dir/progress.make + +# Include the compile flags for this target's objects. +include tests/streamtests/CMakeFiles/streamtests.dir/flags.make + +tests/streamtests/CMakeFiles/streamtests.dir/codegen: +.PHONY : tests/streamtests/CMakeFiles/streamtests.dir/codegen + +tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o: tests/streamtests/CMakeFiles/streamtests.dir/flags.make +tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/streamtests.cc +tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o: tests/streamtests/CMakeFiles/streamtests.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o -MF CMakeFiles/streamtests.dir/streamtests.cc.o.d -o CMakeFiles/streamtests.dir/streamtests.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/streamtests.cc + +tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/streamtests.dir/streamtests.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/streamtests.cc > CMakeFiles/streamtests.dir/streamtests.cc.i + +tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/streamtests.dir/streamtests.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/streamtests.cc -o CMakeFiles/streamtests.dir/streamtests.cc.s + +# Object files for target streamtests +streamtests_OBJECTS = \ +"CMakeFiles/streamtests.dir/streamtests.cc.o" + +# External object files for target streamtests +streamtests_EXTERNAL_OBJECTS = + +Release/streamtests: tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o +Release/streamtests: tests/streamtests/CMakeFiles/streamtests.dir/build.make +Release/streamtests: tests/streamtests/CMakeFiles/streamtests.dir/compiler_depend.ts +Release/streamtests: tests/gtest/libgtest.a +Release/streamtests: Release/libktx.so.0.0.0 +Release/streamtests: tests/streamtests/CMakeFiles/streamtests.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../../Release/streamtests" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/streamtests.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tests/streamtests/CMakeFiles/streamtests.dir/build: Release/streamtests +.PHONY : tests/streamtests/CMakeFiles/streamtests.dir/build + +tests/streamtests/CMakeFiles/streamtests.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests && $(CMAKE_COMMAND) -P CMakeFiles/streamtests.dir/cmake_clean.cmake +.PHONY : tests/streamtests/CMakeFiles/streamtests.dir/clean + +tests/streamtests/CMakeFiles/streamtests.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/DependInfo.cmake "--color=$(COLOR)" streamtests +.PHONY : tests/streamtests/CMakeFiles/streamtests.dir/depend + diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/cmake_clean.cmake b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/cmake_clean.cmake new file mode 100644 index 0000000..9dc484f --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/cmake_clean.cmake @@ -0,0 +1,12 @@ +file(REMOVE_RECURSE + "../../Release/streamtests" + "../../Release/streamtests.pdb" + "CMakeFiles/streamtests.dir/link.d" + "CMakeFiles/streamtests.dir/streamtests.cc.o" + "CMakeFiles/streamtests.dir/streamtests.cc.o.d" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/streamtests.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/compiler_depend.internal b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/compiler_depend.internal new file mode 100644 index 0000000..ae900f7 --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/compiler_depend.internal @@ -0,0 +1,400 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/streamtests + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/libgtest.a + /usr/lib/Scrt1.o + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o + +tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/streamtests.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/sigaction.h + /usr/include/bits/sigcontext.h + /usr/include/bits/sigevent-consts.h + /usr/include/bits/siginfo-arch.h + /usr/include/bits/siginfo-consts-arch.h + /usr/include/bits/siginfo-consts.h + /usr/include/bits/signal_ext.h + /usr/include/bits/signum-arch.h + /usr/include/bits/signum-generic.h + /usr/include/bits/sigstack.h + /usr/include/bits/sigstksz.h + /usr/include/bits/sigthread.h + /usr/include/bits/ss_flags.h + /usr/include/bits/stat.h + /usr/include/bits/statx-generic.h + /usr/include/bits/statx.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/__sigval_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/idtype_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sig_atomic_t.h + /usr/include/bits/types/sigevent_t.h + /usr/include/bits/types/siginfo_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/sigval_t.h + /usr/include/bits/types/stack_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_sigstack.h + /usr/include/bits/types/struct_statx.h + /usr/include/bits/types/struct_statx_timestamp.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/any + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/monostate.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_multiset.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_set.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/cxxabi.h + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/set + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/variant + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stat.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/pthread.h + /usr/include/regex.h + /usr/include/sched.h + /usr/include/signal.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/stat.h + /usr/include/sys/types.h + /usr/include/sys/ucontext.h + /usr/include/sys/wait.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/compiler_depend.make b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/compiler_depend.make new file mode 100644 index 0000000..22c76f2 --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/compiler_depend.make @@ -0,0 +1,1184 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/streamtests: Release/libktx.so.0.0.0 \ + tests/gtest/libgtest.a \ + /usr/lib/Scrt1.o \ + /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o + +tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/streamtests.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h \ + /usr/include/bits/sigevent-consts.h \ + /usr/include/bits/siginfo-arch.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/signal_ext.h \ + /usr/include/bits/signum-arch.h \ + /usr/include/bits/signum-generic.h \ + /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h \ + /usr/include/bits/sigthread.h \ + /usr/include/bits/ss_flags.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/statx.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/idtype_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/types/siginfo_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/sigval_t.h \ + /usr/include/bits/types/stack_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_sigstack.h \ + /usr/include/bits/types/struct_statx.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/variant \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stat.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/pthread.h \ + /usr/include/regex.h \ + /usr/include/sched.h \ + /usr/include/signal.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/stat.h \ + /usr/include/sys/types.h \ + /usr/include/sys/ucontext.h \ + /usr/include/sys/wait.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/types.h: + +/usr/include/sys/stat.h: + +/usr/include/sys/cdefs.h: + +/usr/include/string.h: + +/usr/include/stdlib.h: + +/usr/include/wctype.h: + +/usr/include/sched.h: + +/usr/include/pthread.h: + +/usr/include/linux/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/stat.h: + +/usr/include/linux/sched/types.h: + +/usr/include/limits.h: + +/usr/include/features-time64.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/vector: + +/usr/include/c++/16.1.1/variant: + +/usr/include/c++/16.1.1/unordered_map: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/c++/16.1.1/memory: + +/usr/include/c++/16.1.1/map: + +/usr/include/c++/16.1.1/iterator: + +/usr/include/c++/16.1.1/ios: + +/usr/include/c++/16.1.1/iomanip: + +/usr/include/regex.h: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/include/c++/16.1.1/fstream: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/exception: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/time.h: + +/usr/include/c++/16.1.1/cxxabi.h: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/sys/select.h: + +/usr/include/c++/16.1.1/cstring: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h: + +/usr/include/c++/16.1.1/compare: + +/usr/include/c++/16.1.1/clocale: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/c++/16.1.1/bits/unordered_map.h: + +/usr/include/sys/ucontext.h: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/bits/stream_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/FILE.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/bits/sigstksz.h: + +/usr/include/bits/signum-generic.h: + +/usr/include/bits/signum-arch.h: + +/usr/include/bits/sigevent-consts.h: + +/usr/include/bits/posix2_lim.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/bits/types/stack_t.h: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/bits/sigstack.h: + +/usr/include/bits/siginfo-consts-arch.h: + +/usr/include/bits/getopt_core.h: + +/usr/include/bits/sigaction.h: + +/usr/include/bits/setjmp.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h: + +/usr/include/features.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/bits/sched.h: + +/usr/include/bits/types/siginfo_t.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/bits/long-double.h: + +/usr/include/bits/local_lim.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/bits/siginfo-consts.h: + +/usr/include/c++/16.1.1/functional: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/usr/include/bits/libc-header-start.h: + +/usr/include/bits/floatn.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/bits/errno.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h: + +/usr/include/bits/confname.h: + +/usr/lib/libgcc_s.so.1: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/bits/posix_opt.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h: + +/usr/include/bits/types/clock_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h: + +/usr/include/c++/16.1.1/bits/quoted_string.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/gnu/stubs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/include/c++/16.1.1/locale: + +/usr/include/bits/sigcontext.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/bits/sigthread.h: + +/usr/include/c++/16.1.1/set: + +/usr/include/alloca.h: + +/usr/lib/libm.so.6: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/asm-generic/types.h: + +/usr/include/c++/16.1.1/cassert: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/asm-generic/errno-base.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/bits/statx.h: + +/usr/include/asm-generic/int-ll64.h: + +/usr/include/bits/types/idtype_t.h: + +/usr/include/bits/stat.h: + +/usr/include/assert.h: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/include/bits/ss_flags.h: + +/usr/include/bits/environments.h: + +/usr/include/bits/types/struct_FILE.h: + +tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o: + +/usr/lib/Scrt1.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h: + +/usr/include/bits/types/timer_t.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/asm/posix_types_64.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/types/sig_atomic_t.h: + +/usr/include/bits/typesizes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/streamtests.cc: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h: + +/usr/include/bits/types.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/bits/siginfo-arch.h: + +/usr/include/c++/16.1.1/istream: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h: + +/usr/lib/libc.so.6: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/c++/16.1.1/bits/hashtable.h: + +/usr/include/bits/byteswap.h: + +/usr/include/c++/16.1.1/optional: + +Release/libktx.so.0.0.0: + +/usr/include/c++/16.1.1/stdlib.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h: + +/usr/lib/libatomic.so: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/wchar.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/lib/libc.so: + +/usr/include/locale.h: + +/usr/include/c++/16.1.1/utility: + +/usr/lib/libstdc++.so: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/usr/include/asm/types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/asm/errno.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/c++/16.1.1/cstdint: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h: + +/usr/include/errno.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/usr/include/bits/getopt_posix.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h: + +/usr/include/bits/types/__locale_t.h: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/bits/cpu-set.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/linux/limits.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +tests/gtest/libgtest.a: + +/usr/include/asm-generic/errno.h: + +/usr/include/gnu/stubs-64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h: + +/usr/include/bits/types/__sigval_t.h: + +/usr/include/bits/timesize.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/bits/types/error_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/signal_ext.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/sigevent_t.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/bits/types/sigval_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/bits/types/struct_sigstack.h: + +/usr/include/bits/types/struct_statx.h: + +/usr/include/bits/types/struct_statx_timestamp.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/c++/16.1.1/bits/stl_multiset.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/bits/waitflags.h: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/lib/libm.so: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/stdio.h: + +/usr/include/bits/wordsize.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/lib/libgcc_s.so: + +/usr/include/c++/16.1.1/algorithm: + +/usr/include/c++/16.1.1/any: + +/usr/include/bits/select.h: + +/usr/include/c++/16.1.1/array: + +/usr/include/c++/16.1.1/atomic: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/bits/stl_multimap.h: + +/usr/lib/crti.o: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/strings.h: + +/usr/include/signal.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_map.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/c++/16.1.1/bits/fstream.tcc: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/c++/16.1.1/bits/hashtable_policy.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/bits/statx-generic.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/libintl.h: + +/usr/include/bits/endianness.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/usr/include/unistd.h: + +/usr/include/c++/16.1.1/bits/monostate.h: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/bits/struct_stat.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_relops.h: + +/usr/include/bits/stdint-least.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h: + +/usr/include/c++/16.1.1/bits/stl_set.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/lib/crtn.o: + +/usr/include/c++/16.1.1/bits/stl_tree.h: diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/compiler_depend.ts b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/compiler_depend.ts new file mode 100644 index 0000000..65a1de5 --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for streamtests. diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/depend.make b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/depend.make new file mode 100644 index 0000000..57c7595 --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for streamtests. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/flags.make b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/flags.make new file mode 100644 index 0000000..d757359 --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/../../other_include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/../../lib -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/. + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/link.d b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/link.d new file mode 100644 index 0000000..2ba24b9 --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/link.d @@ -0,0 +1,112 @@ +../../Release/streamtests: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/streamtests.dir/streamtests.cc.o \ + ../gtest/libgtest.a \ + ../../Release/libktx.so.0.0.0 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o \ + /usr/lib/ld-linux-x86-64.so.2 + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/streamtests.dir/streamtests.cc.o: + +../gtest/libgtest.a: + +../../Release/libktx.so.0.0.0: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: + +/usr/lib/ld-linux-x86-64.so.2: diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/link.txt b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/link.txt new file mode 100644 index 0000000..f65132b --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -msse4.1 -O3 -DNDEBUG -O3 -Wl,--dependency-file=CMakeFiles/streamtests.dir/link.d CMakeFiles/streamtests.dir/streamtests.cc.o -o ../../Release/streamtests -Wl,-rpath,"\$ORIGIN:\$ORIGIN/../lib" ../gtest/libgtest.a ../../Release/libktx.so.0.0.0 diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/progress.make b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/progress.make new file mode 100644 index 0000000..9063d23 --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 92 + diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o new file mode 100644 index 0000000..b40f698 Binary files /dev/null and b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o differ diff --git a/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o.d b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o.d new file mode 100644 index 0000000..e49b401 --- /dev/null +++ b/ktx/build/tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o.d @@ -0,0 +1,282 @@ +tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/streamtests.cc \ + /usr/include/stdc-predef.h /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/string.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/sys/types.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/sys/stat.h \ + /usr/include/bits/stat.h /usr/include/bits/struct_stat.h \ + /usr/include/bits/statx.h /usr/include/linux/stat.h \ + /usr/include/linux/types.h /usr/include/asm/types.h \ + /usr/include/asm-generic/types.h /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm/bitsperlong.h /usr/include/asm-generic/bitsperlong.h \ + /usr/include/linux/posix_types.h /usr/include/linux/stddef.h \ + /usr/include/asm/posix_types.h /usr/include/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h /usr/include/bits/statx-generic.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_statx.h /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/memory /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/iostream /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/bits/ostream.h /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/stdio.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/../../lib/gl_format.h \ + /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/../../lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/regex.h /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/variant /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h /usr/include/sys/wait.h \ + /usr/include/signal.h /usr/include/bits/signum-generic.h \ + /usr/include/bits/signum-arch.h /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/siginfo_t.h /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/siginfo-arch.h /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/types/sigval_t.h /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/sigevent-consts.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/bits/types/stack_t.h \ + /usr/include/sys/ucontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h /usr/include/bits/ss_flags.h \ + /usr/include/bits/types/struct_sigstack.h /usr/include/bits/sigthread.h \ + /usr/include/bits/signal_ext.h /usr/include/bits/types/idtype_t.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /usr/include/c++/16.1.1/atomic \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h diff --git a/ktx/build/tests/streamtests/CTestTestfile.cmake b/ktx/build/tests/streamtests/CTestTestfile.cmake new file mode 100644 index 0000000..7498a50 --- /dev/null +++ b/ktx/build/tests/streamtests/CTestTestfile.cmake @@ -0,0 +1,7 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/streamtests[1]_include.cmake") diff --git a/ktx/build/tests/streamtests/Makefile b/ktx/build/tests/streamtests/Makefile new file mode 100644 index 0000000..f848741 --- /dev/null +++ b/ktx/build/tests/streamtests/Makefile @@ -0,0 +1,264 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/streamtests/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/streamtests/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/streamtests/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/streamtests/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tests/streamtests/CMakeFiles/streamtests.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/streamtests/CMakeFiles/streamtests.dir/rule +.PHONY : tests/streamtests/CMakeFiles/streamtests.dir/rule + +# Convenience name for target. +streamtests: tests/streamtests/CMakeFiles/streamtests.dir/rule +.PHONY : streamtests + +# fast build rule for target. +streamtests/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/streamtests/CMakeFiles/streamtests.dir/build.make tests/streamtests/CMakeFiles/streamtests.dir/build +.PHONY : streamtests/fast + +streamtests.o: streamtests.cc.o +.PHONY : streamtests.o + +# target to build an object file +streamtests.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/streamtests/CMakeFiles/streamtests.dir/build.make tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.o +.PHONY : streamtests.cc.o + +streamtests.i: streamtests.cc.i +.PHONY : streamtests.i + +# target to preprocess a source file +streamtests.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/streamtests/CMakeFiles/streamtests.dir/build.make tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.i +.PHONY : streamtests.cc.i + +streamtests.s: streamtests.cc.s +.PHONY : streamtests.s + +# target to generate assembly for a file +streamtests.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/streamtests/CMakeFiles/streamtests.dir/build.make tests/streamtests/CMakeFiles/streamtests.dir/streamtests.cc.s +.PHONY : streamtests.cc.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... streamtests" + @echo "... streamtests.o" + @echo "... streamtests.i" + @echo "... streamtests.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tests/streamtests/cmake_install.cmake b/ktx/build/tests/streamtests/cmake_install.cmake new file mode 100644 index 0000000..2bb0431 --- /dev/null +++ b/ktx/build/tests/streamtests/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/streamtests + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tests/streamtests/streamtests[1]_include.cmake b/ktx/build/tests/streamtests/streamtests[1]_include.cmake new file mode 100644 index 0000000..4dc98d7 --- /dev/null +++ b/ktx/build/tests/streamtests/streamtests[1]_include.cmake @@ -0,0 +1,27 @@ +if(EXISTS "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/streamtests") + if(NOT EXISTS "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/streamtests[1]_tests.cmake" OR + NOT "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/streamtests[1]_tests.cmake" IS_NEWER_THAN "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/streamtests" OR + NOT "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/streamtests[1]_tests.cmake" IS_NEWER_THAN "${CMAKE_CURRENT_LIST_FILE}") + include("/usr/share/cmake/Modules/GoogleTestAddTests.cmake") + gtest_discover_tests_impl( + TEST_EXECUTABLE [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/streamtests]==] + TEST_EXECUTOR [==[]==] + TEST_WORKING_DIR [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests]==] + TEST_EXTRA_ARGS [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages/]==] + TEST_PROPERTIES [==[]==] + TEST_PREFIX [==[streamtest.]==] + TEST_SUFFIX [==[]==] + TEST_FILTER [==[]==] + NO_PRETTY_TYPES [==[FALSE]==] + NO_PRETTY_VALUES [==[FALSE]==] + TEST_LIST [==[streamtests_TESTS]==] + CTEST_FILE [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/streamtests[1]_tests.cmake]==] + TEST_DISCOVERY_TIMEOUT [==[20]==] + TEST_DISCOVERY_EXTRA_ARGS [==[]==] + TEST_XML_OUTPUT_DIR [==[]==] + ) + endif() + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/streamtests/streamtests[1]_tests.cmake") +else() + add_test(streamtests_NOT_BUILT streamtests_NOT_BUILT) +endif() diff --git a/ktx/build/tests/texturetests[1]_include.cmake b/ktx/build/tests/texturetests[1]_include.cmake new file mode 100644 index 0000000..c936fdc --- /dev/null +++ b/ktx/build/tests/texturetests[1]_include.cmake @@ -0,0 +1,27 @@ +if(EXISTS "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/texturetests") + if(NOT EXISTS "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/texturetests[1]_tests.cmake" OR + NOT "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/texturetests[1]_tests.cmake" IS_NEWER_THAN "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/texturetests" OR + NOT "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/texturetests[1]_tests.cmake" IS_NEWER_THAN "${CMAKE_CURRENT_LIST_FILE}") + include("/usr/share/cmake/Modules/GoogleTestAddTests.cmake") + gtest_discover_tests_impl( + TEST_EXECUTABLE [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/texturetests]==] + TEST_EXECUTOR [==[]==] + TEST_WORKING_DIR [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests]==] + TEST_EXTRA_ARGS [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages/;/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxdiff]==] + TEST_PROPERTIES [==[]==] + TEST_PREFIX [==[texturetest.]==] + TEST_SUFFIX [==[]==] + TEST_FILTER [==[]==] + NO_PRETTY_TYPES [==[FALSE]==] + NO_PRETTY_VALUES [==[FALSE]==] + TEST_LIST [==[texturetests_TESTS]==] + CTEST_FILE [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/texturetests[1]_tests.cmake]==] + TEST_DISCOVERY_TIMEOUT [==[20]==] + TEST_DISCOVERY_EXTRA_ARGS [==[]==] + TEST_XML_OUTPUT_DIR [==[]==] + ) + endif() + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/texturetests[1]_tests.cmake") +else() + add_test(texturetests_NOT_BUILT texturetests_NOT_BUILT) +endif() diff --git a/ktx/build/tests/transcodetests/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tests/transcodetests/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tests/transcodetests/CMakeFiles/progress.marks b/ktx/build/tests/transcodetests/CMakeFiles/progress.marks new file mode 100644 index 0000000..ea90ee3 --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/progress.marks @@ -0,0 +1 @@ +45 diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/DependInfo.cmake b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/DependInfo.cmake new file mode 100644 index 0000000..cb68f90 --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/DependInfo.cmake @@ -0,0 +1,24 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests/transcodetests.cc" "tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o" "gcc" "tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o.d" + "" "Release/transcodetests" "gcc" "tests/transcodetests/CMakeFiles/transcodetests.dir/link.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/build.make b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/build.make new file mode 100644 index 0000000..8e34300 --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/build.make @@ -0,0 +1,117 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tests/transcodetests/CMakeFiles/transcodetests.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tests/transcodetests/CMakeFiles/transcodetests.dir/compiler_depend.make + +# Include the progress variables for this target. +include tests/transcodetests/CMakeFiles/transcodetests.dir/progress.make + +# Include the compile flags for this target's objects. +include tests/transcodetests/CMakeFiles/transcodetests.dir/flags.make + +tests/transcodetests/CMakeFiles/transcodetests.dir/codegen: +.PHONY : tests/transcodetests/CMakeFiles/transcodetests.dir/codegen + +tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o: tests/transcodetests/CMakeFiles/transcodetests.dir/flags.make +tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests/transcodetests.cc +tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o: tests/transcodetests/CMakeFiles/transcodetests.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o -MF CMakeFiles/transcodetests.dir/transcodetests.cc.o.d -o CMakeFiles/transcodetests.dir/transcodetests.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests/transcodetests.cc + +tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/transcodetests.dir/transcodetests.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests/transcodetests.cc > CMakeFiles/transcodetests.dir/transcodetests.cc.i + +tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/transcodetests.dir/transcodetests.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests/transcodetests.cc -o CMakeFiles/transcodetests.dir/transcodetests.cc.s + +# Object files for target transcodetests +transcodetests_OBJECTS = \ +"CMakeFiles/transcodetests.dir/transcodetests.cc.o" + +# External object files for target transcodetests +transcodetests_EXTERNAL_OBJECTS = + +Release/transcodetests: tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o +Release/transcodetests: tests/transcodetests/CMakeFiles/transcodetests.dir/build.make +Release/transcodetests: tests/transcodetests/CMakeFiles/transcodetests.dir/compiler_depend.ts +Release/transcodetests: tests/gtest/libgtest.a +Release/transcodetests: Release/libktx.so.0.0.0 +Release/transcodetests: interface/basisu_c_binding/libobj_basisu_cbind.a +Release/transcodetests: tests/transcodetests/CMakeFiles/transcodetests.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../../Release/transcodetests" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/transcodetests.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tests/transcodetests/CMakeFiles/transcodetests.dir/build: Release/transcodetests +.PHONY : tests/transcodetests/CMakeFiles/transcodetests.dir/build + +tests/transcodetests/CMakeFiles/transcodetests.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests && $(CMAKE_COMMAND) -P CMakeFiles/transcodetests.dir/cmake_clean.cmake +.PHONY : tests/transcodetests/CMakeFiles/transcodetests.dir/clean + +tests/transcodetests/CMakeFiles/transcodetests.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/DependInfo.cmake "--color=$(COLOR)" transcodetests +.PHONY : tests/transcodetests/CMakeFiles/transcodetests.dir/depend + diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/cmake_clean.cmake b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/cmake_clean.cmake new file mode 100644 index 0000000..80bd63d --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/cmake_clean.cmake @@ -0,0 +1,12 @@ +file(REMOVE_RECURSE + "../../Release/transcodetests" + "../../Release/transcodetests.pdb" + "CMakeFiles/transcodetests.dir/link.d" + "CMakeFiles/transcodetests.dir/transcodetests.cc.o" + "CMakeFiles/transcodetests.dir/transcodetests.cc.o.d" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/transcodetests.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/compiler_depend.internal b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/compiler_depend.internal new file mode 100644 index 0000000..b3a1898 --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/compiler_depend.internal @@ -0,0 +1,448 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/transcodetests + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/interface/basisu_c_binding/libobj_basisu_cbind.a + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/gtest/libgtest.a + /usr/lib/Scrt1.o + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o + +tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests/transcodetests.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/inc/basisu_c_binding.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/sigaction.h + /usr/include/bits/sigcontext.h + /usr/include/bits/sigevent-consts.h + /usr/include/bits/siginfo-arch.h + /usr/include/bits/siginfo-consts-arch.h + /usr/include/bits/siginfo-consts.h + /usr/include/bits/signal_ext.h + /usr/include/bits/signum-arch.h + /usr/include/bits/signum-generic.h + /usr/include/bits/sigstack.h + /usr/include/bits/sigstksz.h + /usr/include/bits/sigthread.h + /usr/include/bits/ss_flags.h + /usr/include/bits/stat.h + /usr/include/bits/statx-generic.h + /usr/include/bits/statx.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/__sigval_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/idtype_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sig_atomic_t.h + /usr/include/bits/types/sigevent_t.h + /usr/include/bits/types/siginfo_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/sigval_t.h + /usr/include/bits/types/stack_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_sigstack.h + /usr/include/bits/types/struct_statx.h + /usr/include/bits/types/struct_statx_timestamp.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/any + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/monostate.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_multiset.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_set.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/cxxabi.h + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/set + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/variant + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stat.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/regex.h + /usr/include/sched.h + /usr/include/signal.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/stat.h + /usr/include/sys/types.h + /usr/include/sys/ucontext.h + /usr/include/sys/wait.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/compiler_depend.make b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/compiler_depend.make new file mode 100644 index 0000000..d5a385d --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/compiler_depend.make @@ -0,0 +1,1328 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/transcodetests: Release/libktx.so.0.0.0 \ + interface/basisu_c_binding/libobj_basisu_cbind.a \ + tests/gtest/libgtest.a \ + /usr/lib/Scrt1.o \ + /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o + +tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests/transcodetests.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/inc/basisu_c_binding.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h \ + /usr/include/bits/sigevent-consts.h \ + /usr/include/bits/siginfo-arch.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/signal_ext.h \ + /usr/include/bits/signum-arch.h \ + /usr/include/bits/signum-generic.h \ + /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h \ + /usr/include/bits/sigthread.h \ + /usr/include/bits/ss_flags.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/statx-generic.h \ + /usr/include/bits/statx.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/idtype_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/types/siginfo_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/sigval_t.h \ + /usr/include/bits/types/stack_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_sigstack.h \ + /usr/include/bits/types/struct_statx.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/variant \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stat.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/regex.h \ + /usr/include/sched.h \ + /usr/include/signal.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/stat.h \ + /usr/include/sys/types.h \ + /usr/include/sys/ucontext.h \ + /usr/include/sys/wait.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/include/sys/wait.h: + +/usr/include/sys/types.h: + +/usr/include/sys/stat.h: + +/usr/include/sys/cdefs.h: + +/usr/include/string.h: + +/usr/include/stdlib.h: + +/usr/include/pthread.h: + +/usr/include/memory.h: + +/usr/include/linux/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/stat.h: + +/usr/include/linux/sched/types.h: + +/usr/include/limits.h: + +/usr/include/features-time64.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/vector: + +/usr/include/c++/16.1.1/variant: + +/usr/include/c++/16.1.1/unordered_map: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/streambuf: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h: + +/usr/include/c++/16.1.1/pstl/glue_numeric_defs.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/c++/16.1.1/numeric: + +/usr/include/c++/16.1.1/memory: + +/usr/include/c++/16.1.1/map: + +/usr/include/c++/16.1.1/iterator: + +/usr/include/c++/16.1.1/ios: + +/usr/include/c++/16.1.1/iomanip: + +/usr/include/regex.h: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/exception: + +/usr/include/time.h: + +/usr/include/c++/16.1.1/cxxabi.h: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/sys/select.h: + +/usr/include/c++/16.1.1/cstring: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/compare: + +/usr/include/c++/16.1.1/clocale: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/c++/16.1.1/bits/unordered_map.h: + +/usr/include/sys/ucontext.h: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/bits/stream_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/c++/16.1.1/bits/stl_relops.h: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/usr/include/c++/16.1.1/bits/stl_multiset.h: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/bits/stl_multimap.h: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_map.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/math.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/c++/16.1.1/bits/stl_numeric.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/bits/signum-generic.h: + +/usr/include/bits/signum-arch.h: + +/usr/include/bits/setjmp.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h: + +/usr/include/bits/types/siginfo_t.h: + +/usr/include/bits/posix2_lim.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h: + +/usr/include/bits/sigevent-consts.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/bits/types/stack_t.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/bits/mathcalls-helper-functions.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/bits/long-double.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/bits/locale.h: + +/usr/include/bits/siginfo-consts-arch.h: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/usr/include/bits/sigstack.h: + +/usr/include/bits/getopt_core.h: + +/usr/include/bits/local_lim.h: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/usr/include/bits/siginfo-consts.h: + +/usr/include/c++/16.1.1/functional: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/usr/include/bits/libc-header-start.h: + +/usr/include/bits/sigaction.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/bits/iscanonical.h: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/FILE.h: + +/usr/include/bits/floatn.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/bits/errno.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h: + +/usr/include/bits/confname.h: + +/usr/lib/libgcc_s.so.1: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/bits/posix_opt.h: + +/usr/include/bits/stat.h: + +/usr/include/assert.h: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/include/c++/16.1.1/random: + +/usr/include/bits/ss_flags.h: + +/usr/include/asm/posix_types_64.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/bits/endian.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/asm/errno.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h: + +/usr/include/c++/16.1.1/locale: + +/usr/include/bits/sigcontext.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/c++/16.1.1/cassert: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/bits/statx.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h: + +/usr/include/asm-generic/int-ll64.h: + +/usr/include/bits/mathcalls-macros.h: + +/usr/include/bits/types/idtype_t.h: + +/usr/include/asm-generic/types.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/gnu/stubs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests/transcodetests.cc: + +/usr/include/asm/types.h: + +/usr/include/bits/mathcalls-narrow.h: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/bits/sigthread.h: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/usr/include/c++/16.1.1/set: + +/usr/include/alloca.h: + +interface/basisu_c_binding/libobj_basisu_cbind.a: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/inc/basisu_c_binding.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/asm-generic/errno.h: + +tests/gtest/libgtest.a: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/lib/crti.o: + +/usr/include/bits/typesizes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/bits/siginfo-arch.h: + +/usr/include/c++/16.1.1/istream: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h: + +/usr/lib/libc.so.6: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/c++/16.1.1/bits/hashtable.h: + +/usr/include/c++/16.1.1/bits/stl_tree.h: + +/usr/lib/crtn.o: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/bits/sigstksz.h: + +/usr/include/bits/byteswap.h: + +/usr/include/malloc.h: + +/usr/include/c++/16.1.1/optional: + +Release/libktx.so.0.0.0: + +/usr/include/c++/16.1.1/stdlib.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h: + +/usr/lib/libatomic.so: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h: + +/usr/include/c++/16.1.1/bits/quoted_string.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/bits/statx-generic.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h: + +/usr/include/wchar.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/wctype.h: + +/usr/include/sched.h: + +/usr/include/bits/fp-fast.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/lib/libc.so: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/bits/mathcalls.h: + +/usr/include/bits/types/sig_atomic_t.h: + +/usr/include/bits/types/__fpos_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h: + +/usr/include/bits/types/clock_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/locale.h: + +/usr/include/c++/16.1.1/utility: + +/usr/lib/libstdc++.so: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/bits/math-vector.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/lib/libm.so.6: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/bits/environments.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/lib/Scrt1.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h: + +/usr/include/bits/types/timer_t.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h: + +/usr/include/c++/16.1.1/cstdint: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h: + +/usr/include/errno.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/usr/include/bits/getopt_posix.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/bits/types/__sigval_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h: + +/usr/include/bits/cpu-set.h: + +/usr/include/c++/16.1.1/bits/stl_set.h: + +/usr/include/bits/stdint-least.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/linux/limits.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/bits/timesize.h: + +/usr/include/bits/types.h: + +/usr/include/features.h: + +/usr/include/bits/sched.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/bits/types/__locale_t.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/types/error_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/signal_ext.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/sigevent_t.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/bits/types/sigval_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/bits/types/struct_sigstack.h: + +/usr/include/bits/types/struct_statx.h: + +/usr/include/bits/types/struct_statx_timestamp.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/bits/waitflags.h: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/lib/libm.so: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/stdio.h: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/bits/wordsize.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/lib/libgcc_s.so: + +/usr/include/c++/16.1.1/algorithm: + +/usr/include/c++/16.1.1/any: + +/usr/include/bits/select.h: + +/usr/include/c++/16.1.1/array: + +tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o: + +/usr/include/c++/16.1.1/atomic: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/math.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/bits/fp-logb.h: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/strings.h: + +/usr/include/signal.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h: + +/usr/include/c++/16.1.1/bits/hashtable_policy.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/libintl.h: + +/usr/include/bits/endianness.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/unistd.h: + +/usr/include/c++/16.1.1/bits/monostate.h: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/bits/struct_stat.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/random.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/c++/16.1.1/bits/random.tcc: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/c++/16.1.1/bits/specfun.h: diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/compiler_depend.ts b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/compiler_depend.ts new file mode 100644 index 0000000..bf685a8 --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for transcodetests. diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/depend.make b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/depend.make new file mode 100644 index 0000000..b2a7e91 --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for transcodetests. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/flags.make b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/flags.make new file mode 100644 index 0000000..3c2e16d --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DKTX_BASISU_C_BINDINGS -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/. -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/inc -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/link.d b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/link.d new file mode 100644 index 0000000..f9aeeaa --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/link.d @@ -0,0 +1,115 @@ +../../Release/transcodetests: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/transcodetests.dir/transcodetests.cc.o \ + ../gtest/libgtest.a \ + ../../Release/libktx.so.0.0.0 \ + ../../interface/basisu_c_binding/libobj_basisu_cbind.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o \ + /usr/lib/ld-linux-x86-64.so.2 + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/transcodetests.dir/transcodetests.cc.o: + +../gtest/libgtest.a: + +../../Release/libktx.so.0.0.0: + +../../interface/basisu_c_binding/libobj_basisu_cbind.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: + +/usr/lib/ld-linux-x86-64.so.2: diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/link.txt b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/link.txt new file mode 100644 index 0000000..62c2217 --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -msse4.1 -O3 -DNDEBUG -O3 -Wl,--dependency-file=CMakeFiles/transcodetests.dir/link.d CMakeFiles/transcodetests.dir/transcodetests.cc.o -o ../../Release/transcodetests -Wl,-rpath,"\$ORIGIN:\$ORIGIN/../lib" ../gtest/libgtest.a ../../Release/libktx.so.0.0.0 ../../interface/basisu_c_binding/libobj_basisu_cbind.a diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/progress.make b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/progress.make new file mode 100644 index 0000000..761d6c5 --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 96 +CMAKE_PROGRESS_2 = + diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o new file mode 100644 index 0000000..3befff4 Binary files /dev/null and b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o differ diff --git a/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o.d b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o.d new file mode 100644 index 0000000..6e367a6 --- /dev/null +++ b/ktx/build/tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o.d @@ -0,0 +1,318 @@ +tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests/transcodetests.cc \ + /usr/include/stdc-predef.h /usr/include/string.h \ + /usr/include/bits/libc-header-start.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/sys/types.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/sys/stat.h \ + /usr/include/bits/stat.h /usr/include/bits/struct_stat.h \ + /usr/include/bits/statx.h /usr/include/linux/stat.h \ + /usr/include/linux/types.h /usr/include/asm/types.h \ + /usr/include/asm-generic/types.h /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm/bitsperlong.h /usr/include/asm-generic/bitsperlong.h \ + /usr/include/linux/posix_types.h /usr/include/linux/stddef.h \ + /usr/include/asm/posix_types.h /usr/include/asm/posix_types_64.h \ + /usr/include/asm-generic/posix_types.h /usr/include/bits/statx-generic.h \ + /usr/include/bits/types/struct_statx_timestamp.h \ + /usr/include/bits/types/struct_statx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/gl_format.h \ + /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/filestream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/memstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest.h \ + /usr/include/c++/16.1.1/cstddef /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/iostream /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-port.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-port-arch.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/regex.h /usr/include/c++/16.1.1/any \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/variant /usr/include/c++/16.1.1/bits/monostate.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h /usr/include/sys/wait.h \ + /usr/include/signal.h /usr/include/bits/signum-generic.h \ + /usr/include/bits/signum-arch.h /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/siginfo_t.h /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/siginfo-arch.h /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/types/sigval_t.h /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/sigevent-consts.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/bits/types/stack_t.h \ + /usr/include/sys/ucontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h /usr/include/bits/ss_flags.h \ + /usr/include/bits/types/struct_sigstack.h /usr/include/bits/sigthread.h \ + /usr/include/bits/signal_ext.h /usr/include/bits/types/idtype_t.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h /usr/include/c++/16.1.1/set \ + /usr/include/c++/16.1.1/bits/stl_set.h \ + /usr/include/c++/16.1.1/bits/stl_multiset.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-message.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-filepath.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-type-util.h \ + /usr/include/c++/16.1.1/cxxabi.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cxxabi_tweaks.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-death-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-death-test-internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-matchers.h \ + /usr/include/c++/16.1.1/atomic \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-printers.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/custom/gtest-printers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-param-test.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/internal/gtest-param-util.h \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-test-part.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_prod.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest-typed-test.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/gtest/include/gtest/gtest_pred_impl.h \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/interface/basisu_c_binding/inc/basisu_c_binding.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /usr/include/memory.h /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_file_headers.h diff --git a/ktx/build/tests/transcodetests/CTestTestfile.cmake b/ktx/build/tests/transcodetests/CTestTestfile.cmake new file mode 100644 index 0000000..363fab6 --- /dev/null +++ b/ktx/build/tests/transcodetests/CTestTestfile.cmake @@ -0,0 +1,7 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/transcodetests[1]_include.cmake") diff --git a/ktx/build/tests/transcodetests/Makefile b/ktx/build/tests/transcodetests/Makefile new file mode 100644 index 0000000..ddeb317 --- /dev/null +++ b/ktx/build/tests/transcodetests/Makefile @@ -0,0 +1,264 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/transcodetests/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/transcodetests/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/transcodetests/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/transcodetests/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tests/transcodetests/CMakeFiles/transcodetests.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/transcodetests/CMakeFiles/transcodetests.dir/rule +.PHONY : tests/transcodetests/CMakeFiles/transcodetests.dir/rule + +# Convenience name for target. +transcodetests: tests/transcodetests/CMakeFiles/transcodetests.dir/rule +.PHONY : transcodetests + +# fast build rule for target. +transcodetests/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/transcodetests/CMakeFiles/transcodetests.dir/build.make tests/transcodetests/CMakeFiles/transcodetests.dir/build +.PHONY : transcodetests/fast + +transcodetests.o: transcodetests.cc.o +.PHONY : transcodetests.o + +# target to build an object file +transcodetests.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/transcodetests/CMakeFiles/transcodetests.dir/build.make tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.o +.PHONY : transcodetests.cc.o + +transcodetests.i: transcodetests.cc.i +.PHONY : transcodetests.i + +# target to preprocess a source file +transcodetests.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/transcodetests/CMakeFiles/transcodetests.dir/build.make tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.i +.PHONY : transcodetests.cc.i + +transcodetests.s: transcodetests.cc.s +.PHONY : transcodetests.s + +# target to generate assembly for a file +transcodetests.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tests/transcodetests/CMakeFiles/transcodetests.dir/build.make tests/transcodetests/CMakeFiles/transcodetests.dir/transcodetests.cc.s +.PHONY : transcodetests.cc.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... transcodetests" + @echo "... transcodetests.o" + @echo "... transcodetests.i" + @echo "... transcodetests.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tests/transcodetests/cmake_install.cmake b/ktx/build/tests/transcodetests/cmake_install.cmake new file mode 100644 index 0000000..df4e698 --- /dev/null +++ b/ktx/build/tests/transcodetests/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/transcodetests + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tests/transcodetests/transcodetests[1]_include.cmake b/ktx/build/tests/transcodetests/transcodetests[1]_include.cmake new file mode 100644 index 0000000..175ef07 --- /dev/null +++ b/ktx/build/tests/transcodetests/transcodetests[1]_include.cmake @@ -0,0 +1,27 @@ +if(EXISTS "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/transcodetests") + if(NOT EXISTS "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/transcodetests[1]_tests.cmake" OR + NOT "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/transcodetests[1]_tests.cmake" IS_NEWER_THAN "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/transcodetests" OR + NOT "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/transcodetests[1]_tests.cmake" IS_NEWER_THAN "${CMAKE_CURRENT_LIST_FILE}") + include("/usr/share/cmake/Modules/GoogleTestAddTests.cmake") + gtest_discover_tests_impl( + TEST_EXECUTABLE [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/transcodetests]==] + TEST_EXECUTOR [==[]==] + TEST_WORKING_DIR [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests]==] + TEST_EXTRA_ARGS [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tests/testimages/]==] + TEST_PROPERTIES [==[]==] + TEST_PREFIX [==[transcodetest.]==] + TEST_SUFFIX [==[]==] + TEST_FILTER [==[]==] + NO_PRETTY_TYPES [==[FALSE]==] + NO_PRETTY_VALUES [==[FALSE]==] + TEST_LIST [==[transcodetests_TESTS]==] + CTEST_FILE [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/transcodetests[1]_tests.cmake]==] + TEST_DISCOVERY_TIMEOUT [==[15]==] + TEST_DISCOVERY_EXTRA_ARGS [==[]==] + TEST_XML_OUTPUT_DIR [==[]==] + ) + endif() + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/transcodetests/transcodetests[1]_tests.cmake") +else() + add_test(transcodetests_NOT_BUILT transcodetests_NOT_BUILT) +endif() diff --git a/ktx/build/tests/unittests[1]_include.cmake b/ktx/build/tests/unittests[1]_include.cmake new file mode 100644 index 0000000..e1605b8 --- /dev/null +++ b/ktx/build/tests/unittests[1]_include.cmake @@ -0,0 +1,27 @@ +if(EXISTS "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/unittests") + if(NOT EXISTS "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/unittests[1]_tests.cmake" OR + NOT "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/unittests[1]_tests.cmake" IS_NEWER_THAN "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/unittests" OR + NOT "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/unittests[1]_tests.cmake" IS_NEWER_THAN "${CMAKE_CURRENT_LIST_FILE}") + include("/usr/share/cmake/Modules/GoogleTestAddTests.cmake") + gtest_discover_tests_impl( + TEST_EXECUTABLE [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/unittests]==] + TEST_EXECUTOR [==[]==] + TEST_WORKING_DIR [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests]==] + TEST_EXTRA_ARGS [==[]==] + TEST_PROPERTIES [==[]==] + TEST_PREFIX [==[unittest.]==] + TEST_SUFFIX [==[]==] + TEST_FILTER [==[]==] + NO_PRETTY_TYPES [==[FALSE]==] + NO_PRETTY_VALUES [==[FALSE]==] + TEST_LIST [==[unittests_TESTS]==] + CTEST_FILE [==[/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/unittests[1]_tests.cmake]==] + TEST_DISCOVERY_TIMEOUT [==[20]==] + TEST_DISCOVERY_EXTRA_ARGS [==[]==] + TEST_XML_OUTPUT_DIR [==[]==] + ) + endif() + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tests/unittests[1]_tests.cmake") +else() + add_test(unittests_NOT_BUILT unittests_NOT_BUILT) +endif() diff --git a/ktx/build/tools/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tools/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tools/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tools/CMakeFiles/progress.marks b/ktx/build/tools/CMakeFiles/progress.marks new file mode 100644 index 0000000..38b10c1 --- /dev/null +++ b/ktx/build/tools/CMakeFiles/progress.marks @@ -0,0 +1 @@ +68 diff --git a/ktx/build/tools/CTestTestfile.cmake b/ktx/build/tools/CTestTestfile.cmake new file mode 100644 index 0000000..ebc123c --- /dev/null +++ b/ktx/build/tools/CTestTestfile.cmake @@ -0,0 +1,13 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs("imageio") +subdirs("ktx") +subdirs("ktx2check") +subdirs("ktx2ktx2") +subdirs("ktxinfo") +subdirs("ktxsc") +subdirs("toktx") diff --git a/ktx/build/tools/Makefile b/ktx/build/tools/Makefile new file mode 100644 index 0000000..172e3c8 --- /dev/null +++ b/ktx/build/tools/Makefile @@ -0,0 +1,222 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tools/cmake_install.cmake b/ktx/build/tools/cmake_install.cmake new file mode 100644 index 0000000..a991c5c --- /dev/null +++ b/ktx/build/tools/cmake_install.cmake @@ -0,0 +1,145 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/cmake_install.cmake") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for the subdirectory. + include("/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/cmake_install.cmake") +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "tools" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktx" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktx") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktx") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "tools" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2check") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktx2check" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktx2check") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktx2check") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "tools" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktx2ktx2") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktx2ktx2" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktx2ktx2") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktx2ktx2") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "tools" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxinfo") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktxinfo" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktxinfo") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktxinfo") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "tools" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/ktxsc") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktxsc" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktxsc") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/ktxsc") + endif() + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT STREQUAL "tools" OR NOT CMAKE_INSTALL_COMPONENT) + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/toktx") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/toktx" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/toktx") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/toktx") + endif() + endif() +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tools/imageio/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tools/imageio/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/DependInfo.cmake b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/DependInfo.cmake new file mode 100644 index 0000000..9870286 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/DependInfo.cmake @@ -0,0 +1,32 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.cpp" "tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o" "gcc" "tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.cpp" "tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o" "gcc" "tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/exr.imageio/exrinput.cc" "tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o" "gcc" "tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageinput.cc" "tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o" "gcc" "tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.cc" "tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o" "gcc" "tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageoutput.cc" "tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o" "gcc" "tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/jpg.imageio/jpginput.cc" "tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o" "gcc" "tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/npbm.imageio/npbminput.cc" "tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o" "gcc" "tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pnginput.cc" "tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o" "gcc" "tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pngoutput.cc" "tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o" "gcc" "tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o new file mode 100644 index 0000000..b9c924b Binary files /dev/null and b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o differ diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o.d b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o.d new file mode 100644 index 0000000..31e2774 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o.d @@ -0,0 +1,79 @@ +tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h /usr/include/stdlib.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/bits/floatn.h /usr/include/bits/floatn-common.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/typesizes.h /usr/include/bits/time64.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/__fpos_t.h /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/setjmp.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h /usr/include/assert.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-uintn.h /usr/include/bits/stdint-least.h \ + /usr/include/string.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o new file mode 100644 index 0000000..8a3ea9f Binary files /dev/null and b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o differ diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o.d b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o.d new file mode 100644 index 0000000..32830f7 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o.d @@ -0,0 +1,122 @@ +tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h \ + /usr/include/string.h /usr/include/bits/libc-header-start.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/bits/types/locale_t.h /usr/include/bits/types/__locale_t.h \ + /usr/include/strings.h /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/bits/stdint-intn.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/c++/16.1.1/stdlib.h diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/build.make b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/build.make new file mode 100644 index 0000000..9c8ea65 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/build.make @@ -0,0 +1,258 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tools/imageio/CMakeFiles/imageio.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tools/imageio/CMakeFiles/imageio.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/imageio/CMakeFiles/imageio.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/imageio/CMakeFiles/imageio.dir/flags.make + +tools/imageio/CMakeFiles/imageio.dir/codegen: +.PHONY : tools/imageio/CMakeFiles/imageio.dir/codegen + +tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o: tools/imageio/CMakeFiles/imageio.dir/flags.make +tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageinput.cc +tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o: tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o -MF CMakeFiles/imageio.dir/imageinput.cc.o.d -o CMakeFiles/imageio.dir/imageinput.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageinput.cc + +tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/imageio.dir/imageinput.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageinput.cc > CMakeFiles/imageio.dir/imageinput.cc.i + +tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/imageio.dir/imageinput.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageinput.cc -o CMakeFiles/imageio.dir/imageinput.cc.s + +tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o: tools/imageio/CMakeFiles/imageio.dir/flags.make +tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.cc +tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o: tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o -MF CMakeFiles/imageio.dir/imageio.cc.o.d -o CMakeFiles/imageio.dir/imageio.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.cc + +tools/imageio/CMakeFiles/imageio.dir/imageio.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/imageio.dir/imageio.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.cc > CMakeFiles/imageio.dir/imageio.cc.i + +tools/imageio/CMakeFiles/imageio.dir/imageio.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/imageio.dir/imageio.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.cc -o CMakeFiles/imageio.dir/imageio.cc.s + +tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o: tools/imageio/CMakeFiles/imageio.dir/flags.make +tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageoutput.cc +tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o: tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o -MF CMakeFiles/imageio.dir/imageoutput.cc.o.d -o CMakeFiles/imageio.dir/imageoutput.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageoutput.cc + +tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/imageio.dir/imageoutput.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageoutput.cc > CMakeFiles/imageio.dir/imageoutput.cc.i + +tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/imageio.dir/imageoutput.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageoutput.cc -o CMakeFiles/imageio.dir/imageoutput.cc.s + +tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o: tools/imageio/CMakeFiles/imageio.dir/flags.make +tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/exr.imageio/exrinput.cc +tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o: tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o -MF CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o.d -o CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/exr.imageio/exrinput.cc + +tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/exr.imageio/exrinput.cc > CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.i + +tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/exr.imageio/exrinput.cc -o CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.s + +tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o: tools/imageio/CMakeFiles/imageio.dir/flags.make +tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/jpg.imageio/jpginput.cc +tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o: tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o -MF CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o.d -o CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/jpg.imageio/jpginput.cc + +tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/jpg.imageio/jpginput.cc > CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.i + +tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/jpg.imageio/jpginput.cc -o CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.s + +tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o: tools/imageio/CMakeFiles/imageio.dir/flags.make +tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/npbm.imageio/npbminput.cc +tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o: tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o -MF CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o.d -o CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/npbm.imageio/npbminput.cc + +tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/npbm.imageio/npbminput.cc > CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.i + +tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/npbm.imageio/npbminput.cc -o CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.s + +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o: tools/imageio/CMakeFiles/imageio.dir/flags.make +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pnginput.cc +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o: tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o -MF CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o.d -o CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pnginput.cc + +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/imageio.dir/png.imageio/pnginput.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pnginput.cc > CMakeFiles/imageio.dir/png.imageio/pnginput.cc.i + +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/imageio.dir/png.imageio/pnginput.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pnginput.cc -o CMakeFiles/imageio.dir/png.imageio/pnginput.cc.s + +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o: tools/imageio/CMakeFiles/imageio.dir/flags.make +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pngoutput.cc +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o: tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o -MF CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o.d -o CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pngoutput.cc + +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pngoutput.cc > CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.i + +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pngoutput.cc -o CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.s + +tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o: tools/imageio/CMakeFiles/imageio.dir/flags.make +tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.cpp +tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o: tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building CXX object tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o -MF CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o.d -o CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.cpp + +tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.cpp > CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.i + +tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.cpp -o CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.s + +tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o: tools/imageio/CMakeFiles/imageio.dir/flags.make +tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.cpp +tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o: tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o -MF CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o.d -o CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.cpp + +tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.cpp > CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.i + +tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.cpp -o CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.s + +# Object files for target imageio +imageio_OBJECTS = \ +"CMakeFiles/imageio.dir/imageinput.cc.o" \ +"CMakeFiles/imageio.dir/imageio.cc.o" \ +"CMakeFiles/imageio.dir/imageoutput.cc.o" \ +"CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o" \ +"CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o" \ +"CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o" \ +"CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o" \ +"CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o" \ +"CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o" \ +"CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o" + +# External object files for target imageio +imageio_EXTERNAL_OBJECTS = + +tools/imageio/libimageio.a: tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o +tools/imageio/libimageio.a: tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o +tools/imageio/libimageio.a: tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o +tools/imageio/libimageio.a: tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o +tools/imageio/libimageio.a: tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o +tools/imageio/libimageio.a: tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o +tools/imageio/libimageio.a: tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o +tools/imageio/libimageio.a: tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o +tools/imageio/libimageio.a: tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o +tools/imageio/libimageio.a: tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o +tools/imageio/libimageio.a: tools/imageio/CMakeFiles/imageio.dir/build.make +tools/imageio/libimageio.a: tools/imageio/CMakeFiles/imageio.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Linking CXX static library libimageio.a" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && $(CMAKE_COMMAND) -P CMakeFiles/imageio.dir/cmake_clean_target.cmake + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/imageio.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/imageio/CMakeFiles/imageio.dir/build: tools/imageio/libimageio.a +.PHONY : tools/imageio/CMakeFiles/imageio.dir/build + +tools/imageio/CMakeFiles/imageio.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio && $(CMAKE_COMMAND) -P CMakeFiles/imageio.dir/cmake_clean.cmake +.PHONY : tools/imageio/CMakeFiles/imageio.dir/clean + +tools/imageio/CMakeFiles/imageio.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/CMakeFiles/imageio.dir/DependInfo.cmake "--color=$(COLOR)" imageio +.PHONY : tools/imageio/CMakeFiles/imageio.dir/depend + diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/cmake_clean.cmake b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/cmake_clean.cmake new file mode 100644 index 0000000..b8b7c0a --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/cmake_clean.cmake @@ -0,0 +1,29 @@ +file(REMOVE_RECURSE + "CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o" + "CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o.d" + "CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o" + "CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o.d" + "CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o" + "CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o.d" + "CMakeFiles/imageio.dir/imageinput.cc.o" + "CMakeFiles/imageio.dir/imageinput.cc.o.d" + "CMakeFiles/imageio.dir/imageio.cc.o" + "CMakeFiles/imageio.dir/imageio.cc.o.d" + "CMakeFiles/imageio.dir/imageoutput.cc.o" + "CMakeFiles/imageio.dir/imageoutput.cc.o.d" + "CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o" + "CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o.d" + "CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o" + "CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o.d" + "CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o" + "CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o.d" + "CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o" + "CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o.d" + "libimageio.a" + "libimageio.pdb" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/imageio.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/cmake_clean_target.cmake b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/cmake_clean_target.cmake new file mode 100644 index 0000000..7e8d0c4 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libimageio.a" +) diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/compiler_depend.internal b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/compiler_depend.internal new file mode 100644 index 0000000..093bf95 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/compiler_depend.internal @@ -0,0 +1,3425 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.h + /usr/include/alloca.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/long-double.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/endian.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/setjmp.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h + /usr/include/alloca.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm/errno.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/errno.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/select.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/errno.h + /usr/include/linux/limits.h + /usr/include/locale.h + /usr/include/stdc-predef.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/types.h + /usr/include/wchar.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/exr.imageio/exrinput.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/ThirdParty/tinyexr.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageinput.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fs_dir.h + /usr/include/c++/16.1.1/bits/fs_fwd.h + /usr/include/c++/16.1.1/bits/fs_ops.h + /usr/include/c++/16.1.1/bits/fs_path.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/codecvt + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/filesystem + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageoutput.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/jpg.imageio/jpginput.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/setjmp.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/npbm.imageio/npbminput.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pnginput.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pngoutput.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/compiler_depend.make b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/compiler_depend.make new file mode 100644 index 0000000..94912d1 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/compiler_depend.make @@ -0,0 +1,4581 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.h \ + /usr/include/alloca.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/endian.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/setjmp.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + +tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm/errno.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/select.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/locale.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/types.h \ + /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/exr.imageio/exrinput.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/ThirdParty/tinyexr.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageinput.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /usr/include/c++/16.1.1/bits/fs_path.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageoutput.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/jpg.imageio/jpginput.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/setjmp.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/npbm.imageio/npbminput.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pnginput.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pngoutput.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pngoutput.cc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/npbm.imageio/npbminput.cc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageoutput.cc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.cc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/usr/include/endian.h: + +/usr/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h: + +/usr/include/bits/types/struct_iovec.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/features.h: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/include/bits/math-vector.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h: + +/usr/include/bits/iscanonical.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/bits/fp-fast.h: + +/usr/include/sched.h: + +/usr/include/wctype.h: + +/usr/include/bits/fcntl.h: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/bits/environments.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/bits/cpu-set.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/asm-generic/int-ll64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h: + +/usr/include/bits/mathcalls-narrow.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h: + +/usr/include/bits/select.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/exr.imageio/exrinput.cc: + +/usr/include/stdio.h: + +/usr/include/bits/wordsize.h: + +/usr/include/c++/16.1.1/cmath: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp: + +/usr/include/c++/16.1.1/bits/hashtable_policy.h: + +/usr/include/bits/confname.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/limits.h: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/cstdio: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl: + +/usr/include/bits/getopt_posix.h: + +/usr/include/errno.h: + +/usr/include/bits/cloexec.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp: + +/usr/include/c++/16.1.1/bits/fstream.tcc: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/linux/close_range.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/ThirdParty/tinyexr.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/bits/openat2.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h: + +/usr/include/bits/struct_stat.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/math.h: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/jpg.imageio/jpginput.cc: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/bits/waitflags.h: + +/usr/include/locale.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/wchar.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.cpp: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/bits/types/clockid_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h: + +/usr/include/bits/types/time_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp: + +/usr/include/bits/types/struct_itimerspec.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/c++/16.1.1/algorithm: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/typesizes.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/include/bits/posix_opt.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/asm/posix_types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/asm/errno.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/bits/local_lim.h: + +/usr/include/bits/types/__locale_t.h: + +/usr/include/c++/16.1.1/array: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/bits/flt-eval-method.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp: + +/usr/include/asm-generic/posix_types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/c++/16.1.1/vector: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/bits/getopt_core.h: + +/usr/include/bits/floatn-common.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp: + +/usr/include/bits/long-double.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/bits/endian.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp: + +/usr/include/bits/timesize.h: + +/usr/include/bits/stat.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h: + +/usr/include/assert.h: + +/usr/include/bits/unistd_ext.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.cpp: + +/usr/include/bits/mathcalls.h: + +/usr/include/c++/16.1.1/cwchar: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp: + +/usr/include/bits/types/clock_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/asm-generic/types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/bits/types.h: + +/usr/include/bits/types/error_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl: + +/usr/include/bits/stdlib-float.h: + +/usr/include/bits/time64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp: + +/usr/include/string.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h: + +/usr/include/strings.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/c++/16.1.1/cfloat: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/linux/openat2.h: + +/usr/include/bits/endianness.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/bits/byteswap.h: + +/usr/include/c++/16.1.1/concepts: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/c++/16.1.1/bits/specfun.h: + +/usr/include/bits/setjmp.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/sys/select.h: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/cstring: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/bits/libc-header-start.h: + +/usr/include/c++/16.1.1/stdlib.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/bits/hashtable.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/c++/16.1.1/exception: + +/usr/include/bits/fcntl-linux.h: + +/usr/include/bits/floatn.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h: + +/usr/include/features-time64.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/math.h: + +/usr/include/setjmp.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp: + +/usr/include/stdlib.h: + +/usr/include/sys/cdefs.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/sys/types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h: + +/usr/include/bits/posix1_lim.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h: + +/usr/include/c++/16.1.1/initializer_list: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pnginput.cc: + +/usr/include/c++/16.1.1/cassert: + +/usr/include/sys/single_threaded.h: + +/usr/include/asm-generic/errno.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp: + +/usr/include/bits/errno.h: + +/usr/include/bits/posix2_lim.h: + +/usr/include/c++/16.1.1/string: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl: + +/usr/include/c++/16.1.1/bits/stl_multimap.h: + +/usr/include/bits/types/wint_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/linux/falloc.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl: + +/usr/include/c++/16.1.1/bits/stl_map.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/bits/stl_tree.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/c++/16.1.1/bits/stream_iterator.h: + +/usr/include/bits/mathcalls-macros.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h: + +/usr/include/libintl.h: + +/usr/include/c++/16.1.1/bits/unordered_map.h: + +/usr/include/c++/16.1.1/compare: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h: + +/usr/include/asm/types.h: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/c++/16.1.1/cwctype: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/c++/16.1.1/fstream: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl: + +/usr/include/c++/16.1.1/ios: + +/usr/include/c++/16.1.1/istream: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h: + +/usr/include/c++/16.1.1/iterator: + +/usr/include/c++/16.1.1/map: + +/usr/include/c++/16.1.1/memory: + +/usr/include/bits/types/__mbstate_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp: + +/usr/include/linux/limits.h: + +/usr/include/c++/16.1.1/optional: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/linux/sched/types.h: + +/usr/include/bits/fp-logb.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/types.h: + +/usr/include/pthread.h: + +/usr/include/unistd.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageinput.cc: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl: + +/usr/include/c++/16.1.1/unordered_map: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl: + +/usr/include/c++/16.1.1/bits/chrono.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl: + +/usr/include/c++/16.1.1/functional: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp: + +/usr/include/linux/posix_types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl: + +/usr/include/bits/types/FILE.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp: + +/usr/include/c++/16.1.1/bits/quoted_string.h: + +/usr/include/c++/16.1.1/system_error: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h: + +/usr/include/c++/16.1.1/new: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h: + +/usr/include/time.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h: + +/usr/include/gnu/stubs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h: + +/usr/include/c++/16.1.1/bits/fs_dir.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h: + +/usr/include/c++/16.1.1/bits/fs_ops.h: + +/usr/include/c++/16.1.1/bits/fs_path.h: + +/usr/include/wchar.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/include/c++/16.1.1/bits/fs_fwd.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/usr/include/c++/16.1.1/climits: + +/usr/include/bits/types/timer_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/fcntl.h: + +/usr/include/c++/16.1.1/codecvt: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/c++/16.1.1/filesystem: + +/usr/include/c++/16.1.1/iomanip: + +/usr/include/c++/16.1.1/locale: + +/usr/include/c++/16.1.1/ratio: + +/usr/include/bits/sched.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h: + +/usr/include/alloca.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h: + +/usr/include/bits/time.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h: + +/usr/include/c++/16.1.1/cstddef: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h: + +/usr/include/asm/posix_types_64.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h: diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts new file mode 100644 index 0000000..c8cd6b3 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for imageio. diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/depend.make b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/depend.make new file mode 100644 index 0000000..0a998bb --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for imageio. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o new file mode 100644 index 0000000..55d9813 Binary files /dev/null and b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o differ diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o.d b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o.d new file mode 100644 index 0000000..2a45fc0 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o.d @@ -0,0 +1,253 @@ +tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/exr.imageio/exrinput.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./formatdesc.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/include/c++/16.1.1/cassert /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/ThirdParty/tinyexr.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/flags.make b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/flags.make new file mode 100644 index 0000000..d1cb7ce --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/. -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/ThirdParty -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -fvisibility=hidden -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o new file mode 100644 index 0000000..cc4db91 Binary files /dev/null and b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o differ diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o.d b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o.d new file mode 100644 index 0000000..ad61a7d --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o.d @@ -0,0 +1,479 @@ +tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageinput.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /usr/include/c++/16.1.1/iomanip /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/filesystem /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/chrono.h /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/fs_path.h /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o new file mode 100644 index 0000000..9d9df4b Binary files /dev/null and b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o differ diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o.d b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o.d new file mode 100644 index 0000000..60e2f64 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o.d @@ -0,0 +1,256 @@ +tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/include/c++/16.1.1/iomanip /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o new file mode 100644 index 0000000..c9eea38 Binary files /dev/null and b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o differ diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o.d b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o.d new file mode 100644 index 0000000..804064c --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o.d @@ -0,0 +1,256 @@ +tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageoutput.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/include/c++/16.1.1/iomanip /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o new file mode 100644 index 0000000..6e68bb6 Binary files /dev/null and b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o differ diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o.d b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o.d new file mode 100644 index 0000000..efc5545 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o.d @@ -0,0 +1,249 @@ +tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/jpg.imageio/jpginput.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./formatdesc.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/jpgd.h \ + /usr/include/c++/16.1.1/stdlib.h /usr/include/setjmp.h diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/link.txt b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/link.txt new file mode 100644 index 0000000..2f7f220 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libimageio.a CMakeFiles/imageio.dir/imageinput.cc.o CMakeFiles/imageio.dir/imageio.cc.o CMakeFiles/imageio.dir/imageoutput.cc.o CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o +/usr/bin/ranlib libimageio.a diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o new file mode 100644 index 0000000..f6ea12c Binary files /dev/null and b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o differ diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o.d b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o.d new file mode 100644 index 0000000..b6f3974 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o.d @@ -0,0 +1,247 @@ +tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/npbm.imageio/npbminput.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./formatdesc.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o new file mode 100644 index 0000000..c6bc41a Binary files /dev/null and b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o differ diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o.d b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o.d new file mode 100644 index 0000000..d34ae5b --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o.d @@ -0,0 +1,468 @@ +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pnginput.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./formatdesc.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o new file mode 100644 index 0000000..ebe7777 Binary files /dev/null and b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o differ diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o.d b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o.d new file mode 100644 index 0000000..20bd2e2 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o.d @@ -0,0 +1,252 @@ +tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/png.imageio/pngoutput.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/cstdint \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./formatdesc.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vulkan_core.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/vulkan/vk_platform.h diff --git a/ktx/build/tools/imageio/CMakeFiles/imageio.dir/progress.make b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/progress.make new file mode 100644 index 0000000..a14142b --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/imageio.dir/progress.make @@ -0,0 +1,12 @@ +CMAKE_PROGRESS_1 = 19 +CMAKE_PROGRESS_2 = +CMAKE_PROGRESS_3 = 20 +CMAKE_PROGRESS_4 = +CMAKE_PROGRESS_5 = 21 +CMAKE_PROGRESS_6 = +CMAKE_PROGRESS_7 = 22 +CMAKE_PROGRESS_8 = 23 +CMAKE_PROGRESS_9 = +CMAKE_PROGRESS_10 = 24 +CMAKE_PROGRESS_11 = + diff --git a/ktx/build/tools/imageio/CMakeFiles/progress.marks b/ktx/build/tools/imageio/CMakeFiles/progress.marks new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/ktx/build/tools/imageio/CMakeFiles/progress.marks @@ -0,0 +1 @@ +8 diff --git a/ktx/build/tools/imageio/CTestTestfile.cmake b/ktx/build/tools/imageio/CTestTestfile.cmake new file mode 100644 index 0000000..ff21871 --- /dev/null +++ b/ktx/build/tools/imageio/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/tools/imageio/Makefile b/ktx/build/tools/imageio/Makefile new file mode 100644 index 0000000..8907749 --- /dev/null +++ b/ktx/build/tools/imageio/Makefile @@ -0,0 +1,507 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/imageio/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/imageio/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/imageio/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/imageio/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tools/imageio/CMakeFiles/imageio.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/imageio/CMakeFiles/imageio.dir/rule +.PHONY : tools/imageio/CMakeFiles/imageio.dir/rule + +# Convenience name for target. +imageio: tools/imageio/CMakeFiles/imageio.dir/rule +.PHONY : imageio + +# fast build rule for target. +imageio/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/build +.PHONY : imageio/fast + +__/__/external/basisu/encoder/jpgd.o: __/__/external/basisu/encoder/jpgd.cpp.o +.PHONY : __/__/external/basisu/encoder/jpgd.o + +# target to build an object file +__/__/external/basisu/encoder/jpgd.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.o +.PHONY : __/__/external/basisu/encoder/jpgd.cpp.o + +__/__/external/basisu/encoder/jpgd.i: __/__/external/basisu/encoder/jpgd.cpp.i +.PHONY : __/__/external/basisu/encoder/jpgd.i + +# target to preprocess a source file +__/__/external/basisu/encoder/jpgd.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.i +.PHONY : __/__/external/basisu/encoder/jpgd.cpp.i + +__/__/external/basisu/encoder/jpgd.s: __/__/external/basisu/encoder/jpgd.cpp.s +.PHONY : __/__/external/basisu/encoder/jpgd.s + +# target to generate assembly for a file +__/__/external/basisu/encoder/jpgd.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/__/__/external/basisu/encoder/jpgd.cpp.s +.PHONY : __/__/external/basisu/encoder/jpgd.cpp.s + +__/__/external/lodepng/lodepng.o: __/__/external/lodepng/lodepng.cpp.o +.PHONY : __/__/external/lodepng/lodepng.o + +# target to build an object file +__/__/external/lodepng/lodepng.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.o +.PHONY : __/__/external/lodepng/lodepng.cpp.o + +__/__/external/lodepng/lodepng.i: __/__/external/lodepng/lodepng.cpp.i +.PHONY : __/__/external/lodepng/lodepng.i + +# target to preprocess a source file +__/__/external/lodepng/lodepng.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.i +.PHONY : __/__/external/lodepng/lodepng.cpp.i + +__/__/external/lodepng/lodepng.s: __/__/external/lodepng/lodepng.cpp.s +.PHONY : __/__/external/lodepng/lodepng.s + +# target to generate assembly for a file +__/__/external/lodepng/lodepng.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/__/__/external/lodepng/lodepng.cpp.s +.PHONY : __/__/external/lodepng/lodepng.cpp.s + +exr.imageio/exrinput.o: exr.imageio/exrinput.cc.o +.PHONY : exr.imageio/exrinput.o + +# target to build an object file +exr.imageio/exrinput.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.o +.PHONY : exr.imageio/exrinput.cc.o + +exr.imageio/exrinput.i: exr.imageio/exrinput.cc.i +.PHONY : exr.imageio/exrinput.i + +# target to preprocess a source file +exr.imageio/exrinput.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.i +.PHONY : exr.imageio/exrinput.cc.i + +exr.imageio/exrinput.s: exr.imageio/exrinput.cc.s +.PHONY : exr.imageio/exrinput.s + +# target to generate assembly for a file +exr.imageio/exrinput.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/exr.imageio/exrinput.cc.s +.PHONY : exr.imageio/exrinput.cc.s + +imageinput.o: imageinput.cc.o +.PHONY : imageinput.o + +# target to build an object file +imageinput.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.o +.PHONY : imageinput.cc.o + +imageinput.i: imageinput.cc.i +.PHONY : imageinput.i + +# target to preprocess a source file +imageinput.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.i +.PHONY : imageinput.cc.i + +imageinput.s: imageinput.cc.s +.PHONY : imageinput.s + +# target to generate assembly for a file +imageinput.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/imageinput.cc.s +.PHONY : imageinput.cc.s + +imageio.o: imageio.cc.o +.PHONY : imageio.o + +# target to build an object file +imageio.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/imageio.cc.o +.PHONY : imageio.cc.o + +imageio.i: imageio.cc.i +.PHONY : imageio.i + +# target to preprocess a source file +imageio.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/imageio.cc.i +.PHONY : imageio.cc.i + +imageio.s: imageio.cc.s +.PHONY : imageio.s + +# target to generate assembly for a file +imageio.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/imageio.cc.s +.PHONY : imageio.cc.s + +imageoutput.o: imageoutput.cc.o +.PHONY : imageoutput.o + +# target to build an object file +imageoutput.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.o +.PHONY : imageoutput.cc.o + +imageoutput.i: imageoutput.cc.i +.PHONY : imageoutput.i + +# target to preprocess a source file +imageoutput.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.i +.PHONY : imageoutput.cc.i + +imageoutput.s: imageoutput.cc.s +.PHONY : imageoutput.s + +# target to generate assembly for a file +imageoutput.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/imageoutput.cc.s +.PHONY : imageoutput.cc.s + +jpg.imageio/jpginput.o: jpg.imageio/jpginput.cc.o +.PHONY : jpg.imageio/jpginput.o + +# target to build an object file +jpg.imageio/jpginput.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.o +.PHONY : jpg.imageio/jpginput.cc.o + +jpg.imageio/jpginput.i: jpg.imageio/jpginput.cc.i +.PHONY : jpg.imageio/jpginput.i + +# target to preprocess a source file +jpg.imageio/jpginput.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.i +.PHONY : jpg.imageio/jpginput.cc.i + +jpg.imageio/jpginput.s: jpg.imageio/jpginput.cc.s +.PHONY : jpg.imageio/jpginput.s + +# target to generate assembly for a file +jpg.imageio/jpginput.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/jpg.imageio/jpginput.cc.s +.PHONY : jpg.imageio/jpginput.cc.s + +npbm.imageio/npbminput.o: npbm.imageio/npbminput.cc.o +.PHONY : npbm.imageio/npbminput.o + +# target to build an object file +npbm.imageio/npbminput.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.o +.PHONY : npbm.imageio/npbminput.cc.o + +npbm.imageio/npbminput.i: npbm.imageio/npbminput.cc.i +.PHONY : npbm.imageio/npbminput.i + +# target to preprocess a source file +npbm.imageio/npbminput.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.i +.PHONY : npbm.imageio/npbminput.cc.i + +npbm.imageio/npbminput.s: npbm.imageio/npbminput.cc.s +.PHONY : npbm.imageio/npbminput.s + +# target to generate assembly for a file +npbm.imageio/npbminput.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/npbm.imageio/npbminput.cc.s +.PHONY : npbm.imageio/npbminput.cc.s + +png.imageio/pnginput.o: png.imageio/pnginput.cc.o +.PHONY : png.imageio/pnginput.o + +# target to build an object file +png.imageio/pnginput.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.o +.PHONY : png.imageio/pnginput.cc.o + +png.imageio/pnginput.i: png.imageio/pnginput.cc.i +.PHONY : png.imageio/pnginput.i + +# target to preprocess a source file +png.imageio/pnginput.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.i +.PHONY : png.imageio/pnginput.cc.i + +png.imageio/pnginput.s: png.imageio/pnginput.cc.s +.PHONY : png.imageio/pnginput.s + +# target to generate assembly for a file +png.imageio/pnginput.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/png.imageio/pnginput.cc.s +.PHONY : png.imageio/pnginput.cc.s + +png.imageio/pngoutput.o: png.imageio/pngoutput.cc.o +.PHONY : png.imageio/pngoutput.o + +# target to build an object file +png.imageio/pngoutput.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.o +.PHONY : png.imageio/pngoutput.cc.o + +png.imageio/pngoutput.i: png.imageio/pngoutput.cc.i +.PHONY : png.imageio/pngoutput.i + +# target to preprocess a source file +png.imageio/pngoutput.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.i +.PHONY : png.imageio/pngoutput.cc.i + +png.imageio/pngoutput.s: png.imageio/pngoutput.cc.s +.PHONY : png.imageio/pngoutput.s + +# target to generate assembly for a file +png.imageio/pngoutput.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/imageio/CMakeFiles/imageio.dir/build.make tools/imageio/CMakeFiles/imageio.dir/png.imageio/pngoutput.cc.s +.PHONY : png.imageio/pngoutput.cc.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... imageio" + @echo "... __/__/external/basisu/encoder/jpgd.o" + @echo "... __/__/external/basisu/encoder/jpgd.i" + @echo "... __/__/external/basisu/encoder/jpgd.s" + @echo "... __/__/external/lodepng/lodepng.o" + @echo "... __/__/external/lodepng/lodepng.i" + @echo "... __/__/external/lodepng/lodepng.s" + @echo "... exr.imageio/exrinput.o" + @echo "... exr.imageio/exrinput.i" + @echo "... exr.imageio/exrinput.s" + @echo "... imageinput.o" + @echo "... imageinput.i" + @echo "... imageinput.s" + @echo "... imageio.o" + @echo "... imageio.i" + @echo "... imageio.s" + @echo "... imageoutput.o" + @echo "... imageoutput.i" + @echo "... imageoutput.s" + @echo "... jpg.imageio/jpginput.o" + @echo "... jpg.imageio/jpginput.i" + @echo "... jpg.imageio/jpginput.s" + @echo "... npbm.imageio/npbminput.o" + @echo "... npbm.imageio/npbminput.i" + @echo "... npbm.imageio/npbminput.s" + @echo "... png.imageio/pnginput.o" + @echo "... png.imageio/pnginput.i" + @echo "... png.imageio/pnginput.s" + @echo "... png.imageio/pngoutput.o" + @echo "... png.imageio/pngoutput.i" + @echo "... png.imageio/pngoutput.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tools/imageio/cmake_install.cmake b/ktx/build/tools/imageio/cmake_install.cmake new file mode 100644 index 0000000..a2ded50 --- /dev/null +++ b/ktx/build/tools/imageio/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tools/imageio/libimageio.a b/ktx/build/tools/imageio/libimageio.a new file mode 100644 index 0000000..7bb2378 Binary files /dev/null and b/ktx/build/tools/imageio/libimageio.a differ diff --git a/ktx/build/tools/ktx/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tools/ktx/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/DependInfo.cmake b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/DependInfo.cmake new file mode 100644 index 0000000..66923b9 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/DependInfo.cmake @@ -0,0 +1,36 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_compare.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_create.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_deflate.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_encode.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_extract.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_help.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_info.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_transcode.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_validate.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/ktx_main.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o.d" + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.cpp" "tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o.d" + "" "Release/ktx" "gcc" "tools/ktx/CMakeFiles/ktxtools.dir/link.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/build.make b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/build.make new file mode 100644 index 0000000..178c4a3 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/build.make @@ -0,0 +1,311 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tools/ktx/CMakeFiles/ktxtools.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/ktx/CMakeFiles/ktxtools.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/ktx/CMakeFiles/ktxtools.dir/flags.make + +tools/ktx/CMakeFiles/ktxtools.dir/codegen: +.PHONY : tools/ktx/CMakeFiles/ktxtools.dir/codegen + +tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.cpp +tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o -MF CMakeFiles/ktxtools.dir/command.cpp.o.d -o CMakeFiles/ktxtools.dir/command.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/command.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.cpp > CMakeFiles/ktxtools.dir/command.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/command.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.cpp -o CMakeFiles/ktxtools.dir/command.cpp.s + +tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_compare.cpp +tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o -MF CMakeFiles/ktxtools.dir/command_compare.cpp.o.d -o CMakeFiles/ktxtools.dir/command_compare.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_compare.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/command_compare.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_compare.cpp > CMakeFiles/ktxtools.dir/command_compare.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/command_compare.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_compare.cpp -o CMakeFiles/ktxtools.dir/command_compare.cpp.s + +tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_create.cpp +tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o -MF CMakeFiles/ktxtools.dir/command_create.cpp.o.d -o CMakeFiles/ktxtools.dir/command_create.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_create.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/command_create.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_create.cpp > CMakeFiles/ktxtools.dir/command_create.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/command_create.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_create.cpp -o CMakeFiles/ktxtools.dir/command_create.cpp.s + +tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_deflate.cpp +tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o -MF CMakeFiles/ktxtools.dir/command_deflate.cpp.o.d -o CMakeFiles/ktxtools.dir/command_deflate.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_deflate.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/command_deflate.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_deflate.cpp > CMakeFiles/ktxtools.dir/command_deflate.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/command_deflate.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_deflate.cpp -o CMakeFiles/ktxtools.dir/command_deflate.cpp.s + +tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_encode.cpp +tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o -MF CMakeFiles/ktxtools.dir/command_encode.cpp.o.d -o CMakeFiles/ktxtools.dir/command_encode.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_encode.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/command_encode.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_encode.cpp > CMakeFiles/ktxtools.dir/command_encode.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/command_encode.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_encode.cpp -o CMakeFiles/ktxtools.dir/command_encode.cpp.s + +tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_extract.cpp +tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o -MF CMakeFiles/ktxtools.dir/command_extract.cpp.o.d -o CMakeFiles/ktxtools.dir/command_extract.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_extract.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/command_extract.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_extract.cpp > CMakeFiles/ktxtools.dir/command_extract.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/command_extract.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_extract.cpp -o CMakeFiles/ktxtools.dir/command_extract.cpp.s + +tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_help.cpp +tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o -MF CMakeFiles/ktxtools.dir/command_help.cpp.o.d -o CMakeFiles/ktxtools.dir/command_help.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_help.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/command_help.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_help.cpp > CMakeFiles/ktxtools.dir/command_help.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/command_help.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_help.cpp -o CMakeFiles/ktxtools.dir/command_help.cpp.s + +tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_info.cpp +tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o -MF CMakeFiles/ktxtools.dir/command_info.cpp.o.d -o CMakeFiles/ktxtools.dir/command_info.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_info.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/command_info.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_info.cpp > CMakeFiles/ktxtools.dir/command_info.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/command_info.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_info.cpp -o CMakeFiles/ktxtools.dir/command_info.cpp.s + +tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_transcode.cpp +tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o -MF CMakeFiles/ktxtools.dir/command_transcode.cpp.o.d -o CMakeFiles/ktxtools.dir/command_transcode.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_transcode.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/command_transcode.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_transcode.cpp > CMakeFiles/ktxtools.dir/command_transcode.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/command_transcode.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_transcode.cpp -o CMakeFiles/ktxtools.dir/command_transcode.cpp.s + +tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_validate.cpp +tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o -MF CMakeFiles/ktxtools.dir/command_validate.cpp.o.d -o CMakeFiles/ktxtools.dir/command_validate.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_validate.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/command_validate.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_validate.cpp > CMakeFiles/ktxtools.dir/command_validate.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/command_validate.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_validate.cpp -o CMakeFiles/ktxtools.dir/command_validate.cpp.s + +tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/ktx_main.cpp +tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o -MF CMakeFiles/ktxtools.dir/ktx_main.cpp.o.d -o CMakeFiles/ktxtools.dir/ktx_main.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/ktx_main.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/ktx_main.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/ktx_main.cpp > CMakeFiles/ktxtools.dir/ktx_main.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/ktx_main.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/ktx_main.cpp -o CMakeFiles/ktxtools.dir/ktx_main.cpp.s + +tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.cpp +tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o -MF CMakeFiles/ktxtools.dir/transcode_utils.cpp.o.d -o CMakeFiles/ktxtools.dir/transcode_utils.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/transcode_utils.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.cpp > CMakeFiles/ktxtools.dir/transcode_utils.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/transcode_utils.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.cpp -o CMakeFiles/ktxtools.dir/transcode_utils.cpp.s + +tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/flags.make +tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.cpp +tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building CXX object tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o -MF CMakeFiles/ktxtools.dir/validate.cpp.o.d -o CMakeFiles/ktxtools.dir/validate.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.cpp + +tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxtools.dir/validate.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.cpp > CMakeFiles/ktxtools.dir/validate.cpp.i + +tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxtools.dir/validate.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.cpp -o CMakeFiles/ktxtools.dir/validate.cpp.s + +# Object files for target ktxtools +ktxtools_OBJECTS = \ +"CMakeFiles/ktxtools.dir/command.cpp.o" \ +"CMakeFiles/ktxtools.dir/command_compare.cpp.o" \ +"CMakeFiles/ktxtools.dir/command_create.cpp.o" \ +"CMakeFiles/ktxtools.dir/command_deflate.cpp.o" \ +"CMakeFiles/ktxtools.dir/command_encode.cpp.o" \ +"CMakeFiles/ktxtools.dir/command_extract.cpp.o" \ +"CMakeFiles/ktxtools.dir/command_help.cpp.o" \ +"CMakeFiles/ktxtools.dir/command_info.cpp.o" \ +"CMakeFiles/ktxtools.dir/command_transcode.cpp.o" \ +"CMakeFiles/ktxtools.dir/command_validate.cpp.o" \ +"CMakeFiles/ktxtools.dir/ktx_main.cpp.o" \ +"CMakeFiles/ktxtools.dir/transcode_utils.cpp.o" \ +"CMakeFiles/ktxtools.dir/validate.cpp.o" + +# External object files for target ktxtools +ktxtools_EXTERNAL_OBJECTS = + +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/build.make +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts +Release/ktx: tools/imageio/libimageio.a +Release/ktx: libobjUtil.a +Release/ktx: Release/libktx.so.0.0.0 +Release/ktx: external/astc-encoder/Source/libastcenc-avx2-static.a +Release/ktx: external/fmt/libfmt.a +Release/ktx: tools/ktx/CMakeFiles/ktxtools.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Linking CXX executable ../../Release/ktx" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/ktxtools.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/ktx/CMakeFiles/ktxtools.dir/build: Release/ktx +.PHONY : tools/ktx/CMakeFiles/ktxtools.dir/build + +tools/ktx/CMakeFiles/ktxtools.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && $(CMAKE_COMMAND) -P CMakeFiles/ktxtools.dir/cmake_clean.cmake +.PHONY : tools/ktx/CMakeFiles/ktxtools.dir/clean + +tools/ktx/CMakeFiles/ktxtools.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/DependInfo.cmake "--color=$(COLOR)" ktxtools +.PHONY : tools/ktx/CMakeFiles/ktxtools.dir/depend + diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/cmake_clean.cmake b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/cmake_clean.cmake new file mode 100644 index 0000000..5f73cd9 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/cmake_clean.cmake @@ -0,0 +1,36 @@ +file(REMOVE_RECURSE + "../../Release/ktx" + "../../Release/ktxtools.pdb" + "CMakeFiles/ktxtools.dir/link.d" + "CMakeFiles/ktxtools.dir/command.cpp.o" + "CMakeFiles/ktxtools.dir/command.cpp.o.d" + "CMakeFiles/ktxtools.dir/command_compare.cpp.o" + "CMakeFiles/ktxtools.dir/command_compare.cpp.o.d" + "CMakeFiles/ktxtools.dir/command_create.cpp.o" + "CMakeFiles/ktxtools.dir/command_create.cpp.o.d" + "CMakeFiles/ktxtools.dir/command_deflate.cpp.o" + "CMakeFiles/ktxtools.dir/command_deflate.cpp.o.d" + "CMakeFiles/ktxtools.dir/command_encode.cpp.o" + "CMakeFiles/ktxtools.dir/command_encode.cpp.o.d" + "CMakeFiles/ktxtools.dir/command_extract.cpp.o" + "CMakeFiles/ktxtools.dir/command_extract.cpp.o.d" + "CMakeFiles/ktxtools.dir/command_help.cpp.o" + "CMakeFiles/ktxtools.dir/command_help.cpp.o.d" + "CMakeFiles/ktxtools.dir/command_info.cpp.o" + "CMakeFiles/ktxtools.dir/command_info.cpp.o.d" + "CMakeFiles/ktxtools.dir/command_transcode.cpp.o" + "CMakeFiles/ktxtools.dir/command_transcode.cpp.o.d" + "CMakeFiles/ktxtools.dir/command_validate.cpp.o" + "CMakeFiles/ktxtools.dir/command_validate.cpp.o.d" + "CMakeFiles/ktxtools.dir/ktx_main.cpp.o" + "CMakeFiles/ktxtools.dir/ktx_main.cpp.o.d" + "CMakeFiles/ktxtools.dir/transcode_utils.cpp.o" + "CMakeFiles/ktxtools.dir/transcode_utils.cpp.o.d" + "CMakeFiles/ktxtools.dir/validate.cpp.o" + "CMakeFiles/ktxtools.dir/validate.cpp.o.d" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/ktxtools.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o new file mode 100644 index 0000000..f528eae Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o.d new file mode 100644 index 0000000..56140c4 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o.d @@ -0,0 +1,509 @@ +tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/version.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /usr/include/c++/16.1.1/filesystem /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_path.h /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/codecvt /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o new file mode 100644 index 0000000..f1aabf1 Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o.d new file mode 100644 index 0000000..0b7c95f --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o.d @@ -0,0 +1,519 @@ +tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_compare.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/format_descriptor.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio.h \ + /usr/include/c++/16.1.1/math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imagecodec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imagespan.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o new file mode 100644 index 0000000..4be9533 Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o.d new file mode 100644 index 0000000..ba7c92d --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o.d @@ -0,0 +1,548 @@ +tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_create.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_common.h \ + /usr/include/c++/16.1.1/thread /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/metrics_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./image.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/math.h /usr/include/memory.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/condition_variable /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_basis.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_astc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/format_descriptor.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./formatdesc.h \ + /usr/include/c++/16.1.1/filesystem /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_path.h /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/codecvt /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o new file mode 100644 index 0000000..655a825 Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o.d new file mode 100644 index 0000000..23fd828 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o.d @@ -0,0 +1,516 @@ +tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_deflate.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /usr/include/c++/16.1.1/filesystem /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_path.h /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/codecvt /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o new file mode 100644 index 0000000..c38a943 Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o.d new file mode 100644 index 0000000..a4c1f4c --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o.d @@ -0,0 +1,548 @@ +tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_encode.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_astc.h \ + /usr/include/c++/16.1.1/thread /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/metrics_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./image.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/math.h /usr/include/memory.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_transcoder_internal.h \ + /usr/include/c++/16.1.1/mutex /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/condition_variable /usr/include/libgen.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_basis.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /usr/include/c++/16.1.1/filesystem /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_path.h /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/codecvt /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o new file mode 100644 index 0000000..f2d81b7 Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o.d new file mode 100644 index 0000000..8bcf3e9 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o.d @@ -0,0 +1,537 @@ +tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_extract.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/format_descriptor.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio.h \ + /usr/include/c++/16.1.1/math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/fragment_uri.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./image.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/memory.h /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /usr/include/c++/16.1.1/filesystem /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_path.h /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/codecvt /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/ThirdParty/tinyexr.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o new file mode 100644 index 0000000..1e1d92e Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o.d new file mode 100644 index 0000000..eb4a0b3 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o.d @@ -0,0 +1,507 @@ +tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_help.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/filesystem /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_path.h /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/codecvt /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o new file mode 100644 index 0000000..608b52e Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o.d new file mode 100644 index 0000000..5402a75 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o.d @@ -0,0 +1,506 @@ +tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_info.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o new file mode 100644 index 0000000..061afd5 Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o.d new file mode 100644 index 0000000..cfcdb37 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o.d @@ -0,0 +1,530 @@ +tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_transcode.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./image.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/math.h /usr/include/memory.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /usr/include/c++/16.1.1/filesystem /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_path.h /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/codecvt /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o new file mode 100644 index 0000000..b973cb7 Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o.d new file mode 100644 index 0000000..f1d02dc --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o.d @@ -0,0 +1,503 @@ +tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_validate.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.internal b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.internal new file mode 100644 index 0000000..241dfad --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.internal @@ -0,0 +1,7964 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/ktx + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/astc-encoder/Source/libastcenc-avx2-static.a + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/libfmt.a + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/libobjUtil.a + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/libimageio.a + /usr/lib/Scrt1.o + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o + +tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/version.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fs_dir.h + /usr/include/c++/16.1.1/bits/fs_fwd.h + /usr/include/c++/16.1.1/bits/fs_ops.h + /usr/include/c++/16.1.1/bits/fs_path.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/codecvt + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/filesystem + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_compare.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imagecodec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imagespan.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/format_descriptor.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_create.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_astc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_basis.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/format_descriptor.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/metrics_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fs_dir.h + /usr/include/c++/16.1.1/bits/fs_fwd.h + /usr/include/c++/16.1.1/bits/fs_ops.h + /usr/include/c++/16.1.1/bits/fs_path.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/codecvt + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/filesystem + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_deflate.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fs_dir.h + /usr/include/c++/16.1.1/bits/fs_fwd.h + /usr/include/c++/16.1.1/bits/fs_ops.h + /usr/include/c++/16.1.1/bits/fs_path.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/codecvt + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/filesystem + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_encode.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_astc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_basis.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/metrics_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/atomic + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fs_dir.h + /usr/include/c++/16.1.1/bits/fs_fwd.h + /usr/include/c++/16.1.1/bits/fs_ops.h + /usr/include/c++/16.1.1/bits/fs_path.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_mutex.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_lock.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/codecvt + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/condition_variable + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/filesystem + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/mutex + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libgen.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_extract.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/ThirdParty/tinyexr.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/format_descriptor.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/fragment_uri.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fs_dir.h + /usr/include/c++/16.1.1/bits/fs_fwd.h + /usr/include/c++/16.1.1/bits/fs_ops.h + /usr/include/c++/16.1.1/bits/fs_path.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/codecvt + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/filesystem + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_help.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fs_dir.h + /usr/include/c++/16.1.1/bits/fs_fwd.h + /usr/include/c++/16.1.1/bits/fs_ops.h + /usr/include/c++/16.1.1/bits/fs_path.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/codecvt + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/filesystem + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_info.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_transcode.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fs_dir.h + /usr/include/c++/16.1.1/bits/fs_fwd.h + /usr/include/c++/16.1.1/bits/fs_ops.h + /usr/include/c++/16.1.1/bits/fs_path.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/codecvt + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/filesystem + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_validate.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/ktx_main.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_relops.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/unordered_set.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/chrono + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/optional + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/unordered_set + /usr/include/c++/16.1.1/utility + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.make b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.make new file mode 100644 index 0000000..5453dbc --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.make @@ -0,0 +1,9348 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/ktx: Release/libktx.so.0.0.0 \ + external/astc-encoder/Source/libastcenc-avx2-static.a \ + external/fmt/libfmt.a \ + libobjUtil.a \ + tools/imageio/libimageio.a \ + /usr/lib/Scrt1.o \ + /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o \ + tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o \ + tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o \ + tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o \ + tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o \ + tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o \ + tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o \ + tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o \ + tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o \ + tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o \ + tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o \ + tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o \ + tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o + +tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/version.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /usr/include/c++/16.1.1/bits/fs_path.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_compare.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imagecodec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imagespan.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/format_descriptor.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_create.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_astc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_basis.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/format_descriptor.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/metrics_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /usr/include/c++/16.1.1/bits/fs_path.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_deflate.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /usr/include/c++/16.1.1/bits/fs_path.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_encode.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_astc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_basis.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/metrics_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/atomic \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /usr/include/c++/16.1.1/bits/fs_path.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_mutex.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_lock.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/condition_variable \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/mutex \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libgen.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_extract.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/ThirdParty/tinyexr.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/format_descriptor.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/fragment_uri.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /usr/include/c++/16.1.1/bits/fs_path.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_help.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /usr/include/c++/16.1.1/bits/fs_path.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_info.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_transcode.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /usr/include/c++/16.1.1/bits/fs_path.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_validate.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/ktx_main.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + +tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_relops.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/chrono \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/optional \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/ktx_main.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_info.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_help.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng/lodepng.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/astcenc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/ThirdParty/tinyexr.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_extract.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_encode.cpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_deflate.cpp: + +/usr/include/libgen.h: + +/usr/include/c++/16.1.1/numeric: + +/usr/include/c++/16.1.1/bits/this_thread_sleep.h: + +/usr/include/c++/16.1.1/bits/std_thread.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/metrics_utils.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_astc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture_funcs.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_enc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_transcoder_internal.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_create.cpp: + +/usr/include/c++/16.1.1/math.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/format_descriptor.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imagespan.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imagecodec.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_common.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h: + +/usr/include/c++/16.1.1/random: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h: + +/usr/include/c++/16.1.1/mutex: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp: + +/usr/include/c++/16.1.1/atomic: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/stdio.h: + +/usr/include/bits/waitflags.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/c++/16.1.1/bits/regex_scanner.tcc: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/c++/16.1.1/bits/stl_numeric.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/bits/stdint-intn.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/features.h: + +/usr/include/bits/types.h: + +/usr/include/bits/timesize.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h: + +/usr/include/bits/sched.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h: + +/usr/include/bits/time64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture2.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/c++/16.1.1/bits/regex_compiler.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl: + +/usr/include/c++/16.1.1/debug/debug.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h: + +/usr/include/c++/16.1.1/bits/regex.h: + +/usr/include/bits/setjmp.h: + +/usr/include/bits/types/clock_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/mathcalls.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp: + +/usr/include/c++/16.1.1/cwchar: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/bits/math-vector.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/version.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/bits/local_lim.h: + +/usr/include/sched.h: + +/usr/include/wctype.h: + +/usr/include/bits/floatn.h: + +/usr/include/bits/fcntl.h: + +tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o: + +tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/c++/16.1.1/pstl/glue_numeric_defs.h: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/bits/errno.h: + +/usr/include/bits/environments.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/c++/16.1.1/bits/std_mutex.h: + +/usr/include/bits/endian.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp: + +/usr/include/bits/posix_opt.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h: + +/usr/include/asm/posix_types_64.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/malloc.h: + +/usr/include/asm/bitsperlong.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp: + +/usr/include/asm-generic/posix_types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/usr/include/asm-generic/int-ll64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/c++/16.1.1/cassert: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/bits/openat2.h: + +/usr/include/c++/16.1.1/bits/regex_scanner.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/bits/long-double.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h: + +/usr/include/bits/types/locale_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp: + +/usr/include/c++/16.1.1/locale: + +/usr/include/bits/mathcalls-narrow.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl: + +/usr/include/bits/types/error_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl: + +/usr/include/bits/types/__locale_t.h: + +external/fmt/libfmt.a: + +/usr/include/bits/getopt_core.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/bits/types/struct_sched_param.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/bits/posix2_lim.h: + +tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp: + +/usr/include/bits/cloexec.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.cpp: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/istream: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/c++/16.1.1/bits/random.h: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp: + +tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o: + +/usr/include/asm-generic/types.h: + +/usr/lib/libc.so: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h: + +tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp: + +/usr/include/bits/iscanonical.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp: + +/usr/include/bits/wordsize.h: + +/usr/include/c++/16.1.1/chrono: + +/usr/include/bits/endianness.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp: + +/usr/lib/libatomic.so: + +/usr/include/bits/flt-eval-method.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl: + +/usr/include/c++/16.1.1/bits/regex_automaton.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp: + +/usr/include/bits/atomic_wide_counter.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +libobjUtil.a: + +/usr/include/bits/types/struct_iovec.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl: + +/usr/include/bits/typesizes.h: + +/usr/lib/crti.o: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl: + +/usr/include/bits/struct_stat.h: + +tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/lib/libgcc_s.so.1: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_validate.cpp: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp: + +/usr/lib/Scrt1.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp: + +/usr/include/bits/unistd_ext.h: + +/usr/lib/libm.so.6: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/usr/include/c++/16.1.1/bits/random.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/c++/16.1.1/cfloat: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h: + +/usr/include/bits/stat.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h: + +/usr/include/assert.h: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/bits/types/__mbstate_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp: + +/usr/include/c++/16.1.1/memory: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp: + +/usr/include/bits/struct_mutex.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp: + +/usr/include/c++/16.1.1/bits/regex_executor.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp: + +/usr/include/c++/16.1.1/functional: + +tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/encode_utils_basis.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h: + +tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/bits/floatn-common.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp: + +/usr/lib/libgcc_s.so: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/deflate_utils.h: + +/usr/include/bits/select.h: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/include/c++/16.1.1/array: + +/usr/include/c++/16.1.1/thread: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl: + +/usr/include/c++/16.1.1/bits/chrono.h: + +/usr/include/bits/fcntl-linux.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl: + +/usr/include/linux/posix_types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.cpp: + +/usr/include/bits/getopt_posix.h: + +/usr/include/errno.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h: + +/usr/include/c++/16.1.1/bits/regex_compiler.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl: + +tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h: + +/usr/lib/libstdc++.so: + +/usr/include/c++/16.1.1/utility: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/locale.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp: + +/usr/include/bits/types/FILE.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/bits/cpu-set.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h: + +Release/libktx.so.0.0.0: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/c++/16.1.1/bits/stl_tree.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp: + +/usr/include/bits/byteswap.h: + +/usr/include/c++/16.1.1/concepts: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h: + +/usr/include/c++/16.1.1/bits/quoted_string.h: + +/usr/include/bits/xopen_lim.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h: + +external/astc-encoder/Source/libastcenc-avx2-static.a: + +/usr/include/c++/16.1.1/new: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp: + +tools/imageio/libimageio.a: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h: + +/usr/include/c++/16.1.1/cstddef: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp: + +/usr/include/bits/fp-fast.h: + +/usr/lib/libc.so.6: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_compare.cpp: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/endian.h: + +/usr/include/stdint.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h: + +/usr/include/c++/16.1.1/optional: + +/usr/lib/crtn.o: + +/usr/include/linux/limits.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/linux/falloc.h: + +tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp: + +/usr/include/strings.h: + +/usr/include/c++/16.1.1/bits/fs_dir.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h: + +/usr/include/c++/16.1.1/bits/fs_ops.h: + +/usr/include/c++/16.1.1/bits/fs_path.h: + +/usr/include/c++/16.1.1/bits/fstream.tcc: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/unordered_set: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/bits/confname.h: + +/usr/include/c++/16.1.1/bits/hashtable_policy.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/include/wchar.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/include/c++/16.1.1/bits/fs_fwd.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h: + +/usr/lib/libm.so: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/ctype.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp: + +/usr/include/c++/16.1.1/bits/ostream.h: + +tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o: + +/usr/include/c++/16.1.1/bits/regex_error.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_ssim.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h: + +/usr/include/c++/16.1.1/bits/regex_automaton.tcc: + +/usr/include/c++/16.1.1/algorithm: + +/usr/include/c++/16.1.1/bits/regex_constants.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/include/c++/16.1.1/bits/regex_executor.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/c++/16.1.1/bits/specfun.h: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/asm/errno.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/math.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/c++/16.1.1/bits/stl_deque.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_map.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/c++/16.1.1/limits: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl: + +/usr/include/c++/16.1.1/bits/stl_multimap.h: + +/usr/include/c++/16.1.1/string: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/usr/include/c++/16.1.1/bits/stl_relops.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl: + +/usr/include/c++/16.1.1/bits/regex.tcc: + +/usr/include/c++/16.1.1/bits/stl_stack.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/c++/16.1.1/bits/stream_iterator.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h: + +/usr/include/stdc-predef.h: + +/usr/include/bits/mathcalls-macros.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h: + +/usr/include/libintl.h: + +/usr/include/c++/16.1.1/bits/unordered_map.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/fragment_uri.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/c++/16.1.1/bits/unordered_set.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/linux/openat2.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bitset: + +/usr/include/c++/16.1.1/climits: + +/usr/include/bits/types/timer_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/c++/16.1.1/compare: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h: + +/usr/include/asm/types.h: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/memory.h: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/cstring: + +/usr/include/sys/select.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/c++/16.1.1/cwctype: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/deque: + +/usr/include/c++/16.1.1/bits/hashtable.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/c++/16.1.1/exception: + +/usr/include/bits/stdio_lim.h: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h: + +/usr/include/c++/16.1.1/filesystem: + +/usr/include/c++/16.1.1/condition_variable: + +/usr/include/c++/16.1.1/fstream: + +/usr/include/c++/16.1.1/iomanip: + +/usr/include/c++/16.1.1/ios: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h: + +/usr/include/c++/16.1.1/iterator: + +/usr/include/c++/16.1.1/map: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/ratio: + +/usr/include/c++/16.1.1/regex: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/bits/libc-header-start.h: + +/usr/include/c++/16.1.1/stdlib.h: + +/usr/include/c++/16.1.1/bits/deque.tcc: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/string_view: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command_transcode.cpp: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h: + +/usr/include/c++/16.1.1/unordered_map: + +/usr/include/c++/16.1.1/vector: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/codecvt: + +/usr/include/fcntl.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h: + +/usr/include/c++/16.1.1/stack: + +/usr/include/features-time64.h: + +/usr/include/gnu/stubs-64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h: + +/usr/include/gnu/stubs.h: + +/usr/include/limits.h: + +/usr/include/linux/sched/types.h: + +/usr/include/bits/fp-logb.h: + +/usr/lib/libmvec.so.1: + +/usr/include/linux/stddef.h: + +/usr/include/linux/types.h: + +/usr/include/pthread.h: + +/usr/include/stdlib.h: + +/usr/include/string.h: + +/usr/include/sys/cdefs.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/sys/types.h: + +/usr/include/c++/16.1.1/bits/unique_lock.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h: + +/usr/include/time.h: + +/usr/include/unistd.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h: + +/usr/include/alloca.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h: diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts new file mode 100644 index 0000000..763c730 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for ktxtools. diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/depend.make b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/depend.make new file mode 100644 index 0000000..40476af --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for ktxtools. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/flags.make b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/flags.make new file mode 100644 index 0000000..e83e067 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/. -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/. -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source/ThirdParty -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/lodepng -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o new file mode 100644 index 0000000..7136e6c Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o.d new file mode 100644 index 0000000..bc49835 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o.d @@ -0,0 +1,502 @@ +tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/ktx_main.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/link.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/link.d new file mode 100644 index 0000000..ff9b888 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/link.d @@ -0,0 +1,157 @@ +../../Release/ktx: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/ktxtools.dir/command.cpp.o \ + CMakeFiles/ktxtools.dir/command_compare.cpp.o \ + CMakeFiles/ktxtools.dir/command_create.cpp.o \ + CMakeFiles/ktxtools.dir/command_deflate.cpp.o \ + CMakeFiles/ktxtools.dir/command_encode.cpp.o \ + CMakeFiles/ktxtools.dir/command_extract.cpp.o \ + CMakeFiles/ktxtools.dir/command_help.cpp.o \ + CMakeFiles/ktxtools.dir/command_info.cpp.o \ + CMakeFiles/ktxtools.dir/command_transcode.cpp.o \ + CMakeFiles/ktxtools.dir/command_validate.cpp.o \ + CMakeFiles/ktxtools.dir/ktx_main.cpp.o \ + CMakeFiles/ktxtools.dir/transcode_utils.cpp.o \ + CMakeFiles/ktxtools.dir/validate.cpp.o \ + ../imageio/libimageio.a \ + ../../libobjUtil.a \ + ../../Release/libktx.so.0.0.0 \ + ../../external/astc-encoder/Source/libastcenc-avx2-static.a \ + ../../external/fmt/libfmt.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o \ + /usr/lib/ld-linux-x86-64.so.2 + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/ktxtools.dir/command.cpp.o: + +CMakeFiles/ktxtools.dir/command_compare.cpp.o: + +CMakeFiles/ktxtools.dir/command_create.cpp.o: + +CMakeFiles/ktxtools.dir/command_deflate.cpp.o: + +CMakeFiles/ktxtools.dir/command_encode.cpp.o: + +CMakeFiles/ktxtools.dir/command_extract.cpp.o: + +CMakeFiles/ktxtools.dir/command_help.cpp.o: + +CMakeFiles/ktxtools.dir/command_info.cpp.o: + +CMakeFiles/ktxtools.dir/command_transcode.cpp.o: + +CMakeFiles/ktxtools.dir/command_validate.cpp.o: + +CMakeFiles/ktxtools.dir/ktx_main.cpp.o: + +CMakeFiles/ktxtools.dir/transcode_utils.cpp.o: + +CMakeFiles/ktxtools.dir/validate.cpp.o: + +../imageio/libimageio.a: + +../../libobjUtil.a: + +../../Release/libktx.so.0.0.0: + +../../external/astc-encoder/Source/libastcenc-avx2-static.a: + +../../external/fmt/libfmt.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: + +/usr/lib/ld-linux-x86-64.so.2: diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/link.txt b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/link.txt new file mode 100644 index 0000000..655ef7e --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -msse4.1 -O3 -DNDEBUG -O3 -Wl,--dependency-file=CMakeFiles/ktxtools.dir/link.d CMakeFiles/ktxtools.dir/command.cpp.o CMakeFiles/ktxtools.dir/command_compare.cpp.o CMakeFiles/ktxtools.dir/command_create.cpp.o CMakeFiles/ktxtools.dir/command_deflate.cpp.o CMakeFiles/ktxtools.dir/command_encode.cpp.o CMakeFiles/ktxtools.dir/command_extract.cpp.o CMakeFiles/ktxtools.dir/command_help.cpp.o CMakeFiles/ktxtools.dir/command_info.cpp.o CMakeFiles/ktxtools.dir/command_transcode.cpp.o CMakeFiles/ktxtools.dir/command_validate.cpp.o CMakeFiles/ktxtools.dir/ktx_main.cpp.o CMakeFiles/ktxtools.dir/transcode_utils.cpp.o CMakeFiles/ktxtools.dir/validate.cpp.o -o ../../Release/ktx -Wl,-rpath,"\$ORIGIN:\$ORIGIN/../lib" ../imageio/libimageio.a ../../libobjUtil.a ../../Release/libktx.so.0.0.0 ../../external/astc-encoder/Source/libastcenc-avx2-static.a ../../external/fmt/libfmt.a diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/progress.make b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/progress.make new file mode 100644 index 0000000..2c51fb9 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/progress.make @@ -0,0 +1,15 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 81 +CMAKE_PROGRESS_3 = +CMAKE_PROGRESS_4 = 82 +CMAKE_PROGRESS_5 = +CMAKE_PROGRESS_6 = 83 +CMAKE_PROGRESS_7 = 84 +CMAKE_PROGRESS_8 = +CMAKE_PROGRESS_9 = 85 +CMAKE_PROGRESS_10 = +CMAKE_PROGRESS_11 = 86 +CMAKE_PROGRESS_12 = +CMAKE_PROGRESS_13 = 87 +CMAKE_PROGRESS_14 = + diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o new file mode 100644 index 0000000..7d6dbf2 Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o.d new file mode 100644 index 0000000..7887018 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o.d @@ -0,0 +1,520 @@ +tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/transcode_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cerrno /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/include/c++/16.1.1/cstdint \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./image.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/math.h /usr/include/memory.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o new file mode 100644 index 0000000..b55b2d3 Binary files /dev/null and b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o differ diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o.d b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o.d new file mode 100644 index 0000000..4d1aa36 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o.d @@ -0,0 +1,514 @@ +tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validate.h \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/libc-header-start.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/wchar.h \ + /usr/include/bits/stdint-intn.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/move.h /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/std_function.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bit /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/compare /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/cctype /usr/include/ctype.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h /usr/include/c++/16.1.1/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/stdio.h \ + /usr/include/c++/16.1.1/cerrno /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/validation_messages.h \ + /usr/include/c++/16.1.1/cassert /usr/include/assert.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/command.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/string.h \ + /usr/include/strings.h /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /usr/include/c++/16.1.1/limits \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /usr/include/c++/16.1.1/cstring \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/ostream.h \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/chrono.h \ + /usr/include/c++/16.1.1/chrono /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/ratio /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/printf.h \ + /usr/include/c++/16.1.1/optional \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/cxxopts/include/cxxopts.hpp \ + /usr/include/c++/16.1.1/map /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/unordered_set \ + /usr/include/c++/16.1.1/bits/unordered_set.h \ + /usr/include/c++/16.1.1/utility \ + /usr/include/c++/16.1.1/bits/stl_relops.h /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/bitset /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/deque /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /usr/include/c++/16.1.1/math.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/formats.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/DependInfo.cmake b/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/build.make b/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/build.make new file mode 100644 index 0000000..119b658 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/build.make @@ -0,0 +1,94 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ktxtools_version. + +# Include any custom commands dependencies for this target. +include tools/ktx/CMakeFiles/ktxtools_version.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/ktx/CMakeFiles/ktxtools_version.dir/progress.make + +tools/ktx/CMakeFiles/ktxtools_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/version.h + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/version.h: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/version.h" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && scripts/mkversion -v exitcode-128-NOTFOUND -o version.h tools/ktx + +tools/ktx/CMakeFiles/ktxtools_version.dir/codegen: +.PHONY : tools/ktx/CMakeFiles/ktxtools_version.dir/codegen + +ktxtools_version: tools/ktx/CMakeFiles/ktxtools_version +ktxtools_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/version.h +ktxtools_version: tools/ktx/CMakeFiles/ktxtools_version.dir/build.make +.PHONY : ktxtools_version + +# Rule to build all files generated by this target. +tools/ktx/CMakeFiles/ktxtools_version.dir/build: ktxtools_version +.PHONY : tools/ktx/CMakeFiles/ktxtools_version.dir/build + +tools/ktx/CMakeFiles/ktxtools_version.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx && $(CMAKE_COMMAND) -P CMakeFiles/ktxtools_version.dir/cmake_clean.cmake +.PHONY : tools/ktx/CMakeFiles/ktxtools_version.dir/clean + +tools/ktx/CMakeFiles/ktxtools_version.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/DependInfo.cmake "--color=$(COLOR)" ktxtools_version +.PHONY : tools/ktx/CMakeFiles/ktxtools_version.dir/depend + diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/cmake_clean.cmake b/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/cmake_clean.cmake new file mode 100644 index 0000000..52f9251 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx/version.h" + "CMakeFiles/ktxtools_version" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ktxtools_version.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/compiler_depend.make b/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/compiler_depend.make new file mode 100644 index 0000000..11a06c9 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ktxtools_version. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/compiler_depend.ts b/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/compiler_depend.ts new file mode 100644 index 0000000..8af619f --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ktxtools_version. diff --git a/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/progress.make b/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/progress.make new file mode 100644 index 0000000..c7f6218 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/ktxtools_version.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 88 + diff --git a/ktx/build/tools/ktx/CMakeFiles/progress.marks b/ktx/build/tools/ktx/CMakeFiles/progress.marks new file mode 100644 index 0000000..04f9fe4 --- /dev/null +++ b/ktx/build/tools/ktx/CMakeFiles/progress.marks @@ -0,0 +1 @@ +59 diff --git a/ktx/build/tools/ktx/CTestTestfile.cmake b/ktx/build/tools/ktx/CTestTestfile.cmake new file mode 100644 index 0000000..cce400f --- /dev/null +++ b/ktx/build/tools/ktx/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/tools/ktx/Makefile b/ktx/build/tools/ktx/Makefile new file mode 100644 index 0000000..784cc27 --- /dev/null +++ b/ktx/build/tools/ktx/Makefile @@ -0,0 +1,603 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tools/ktx/CMakeFiles/ktxtools.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx/CMakeFiles/ktxtools.dir/rule +.PHONY : tools/ktx/CMakeFiles/ktxtools.dir/rule + +# Convenience name for target. +ktxtools: tools/ktx/CMakeFiles/ktxtools.dir/rule +.PHONY : ktxtools + +# fast build rule for target. +ktxtools/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/build +.PHONY : ktxtools/fast + +# Convenience name for target. +tools/ktx/CMakeFiles/ktxtools_version.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx/CMakeFiles/ktxtools_version.dir/rule +.PHONY : tools/ktx/CMakeFiles/ktxtools_version.dir/rule + +# Convenience name for target. +ktxtools_version: tools/ktx/CMakeFiles/ktxtools_version.dir/rule +.PHONY : ktxtools_version + +# fast build rule for target. +ktxtools_version/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools_version.dir/build.make tools/ktx/CMakeFiles/ktxtools_version.dir/build +.PHONY : ktxtools_version/fast + +command.o: command.cpp.o +.PHONY : command.o + +# target to build an object file +command.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.o +.PHONY : command.cpp.o + +command.i: command.cpp.i +.PHONY : command.i + +# target to preprocess a source file +command.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.i +.PHONY : command.cpp.i + +command.s: command.cpp.s +.PHONY : command.s + +# target to generate assembly for a file +command.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command.cpp.s +.PHONY : command.cpp.s + +command_compare.o: command_compare.cpp.o +.PHONY : command_compare.o + +# target to build an object file +command_compare.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.o +.PHONY : command_compare.cpp.o + +command_compare.i: command_compare.cpp.i +.PHONY : command_compare.i + +# target to preprocess a source file +command_compare.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.i +.PHONY : command_compare.cpp.i + +command_compare.s: command_compare.cpp.s +.PHONY : command_compare.s + +# target to generate assembly for a file +command_compare.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_compare.cpp.s +.PHONY : command_compare.cpp.s + +command_create.o: command_create.cpp.o +.PHONY : command_create.o + +# target to build an object file +command_create.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.o +.PHONY : command_create.cpp.o + +command_create.i: command_create.cpp.i +.PHONY : command_create.i + +# target to preprocess a source file +command_create.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.i +.PHONY : command_create.cpp.i + +command_create.s: command_create.cpp.s +.PHONY : command_create.s + +# target to generate assembly for a file +command_create.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_create.cpp.s +.PHONY : command_create.cpp.s + +command_deflate.o: command_deflate.cpp.o +.PHONY : command_deflate.o + +# target to build an object file +command_deflate.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.o +.PHONY : command_deflate.cpp.o + +command_deflate.i: command_deflate.cpp.i +.PHONY : command_deflate.i + +# target to preprocess a source file +command_deflate.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.i +.PHONY : command_deflate.cpp.i + +command_deflate.s: command_deflate.cpp.s +.PHONY : command_deflate.s + +# target to generate assembly for a file +command_deflate.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_deflate.cpp.s +.PHONY : command_deflate.cpp.s + +command_encode.o: command_encode.cpp.o +.PHONY : command_encode.o + +# target to build an object file +command_encode.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.o +.PHONY : command_encode.cpp.o + +command_encode.i: command_encode.cpp.i +.PHONY : command_encode.i + +# target to preprocess a source file +command_encode.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.i +.PHONY : command_encode.cpp.i + +command_encode.s: command_encode.cpp.s +.PHONY : command_encode.s + +# target to generate assembly for a file +command_encode.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_encode.cpp.s +.PHONY : command_encode.cpp.s + +command_extract.o: command_extract.cpp.o +.PHONY : command_extract.o + +# target to build an object file +command_extract.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.o +.PHONY : command_extract.cpp.o + +command_extract.i: command_extract.cpp.i +.PHONY : command_extract.i + +# target to preprocess a source file +command_extract.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.i +.PHONY : command_extract.cpp.i + +command_extract.s: command_extract.cpp.s +.PHONY : command_extract.s + +# target to generate assembly for a file +command_extract.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_extract.cpp.s +.PHONY : command_extract.cpp.s + +command_help.o: command_help.cpp.o +.PHONY : command_help.o + +# target to build an object file +command_help.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.o +.PHONY : command_help.cpp.o + +command_help.i: command_help.cpp.i +.PHONY : command_help.i + +# target to preprocess a source file +command_help.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.i +.PHONY : command_help.cpp.i + +command_help.s: command_help.cpp.s +.PHONY : command_help.s + +# target to generate assembly for a file +command_help.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_help.cpp.s +.PHONY : command_help.cpp.s + +command_info.o: command_info.cpp.o +.PHONY : command_info.o + +# target to build an object file +command_info.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.o +.PHONY : command_info.cpp.o + +command_info.i: command_info.cpp.i +.PHONY : command_info.i + +# target to preprocess a source file +command_info.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.i +.PHONY : command_info.cpp.i + +command_info.s: command_info.cpp.s +.PHONY : command_info.s + +# target to generate assembly for a file +command_info.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_info.cpp.s +.PHONY : command_info.cpp.s + +command_transcode.o: command_transcode.cpp.o +.PHONY : command_transcode.o + +# target to build an object file +command_transcode.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.o +.PHONY : command_transcode.cpp.o + +command_transcode.i: command_transcode.cpp.i +.PHONY : command_transcode.i + +# target to preprocess a source file +command_transcode.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.i +.PHONY : command_transcode.cpp.i + +command_transcode.s: command_transcode.cpp.s +.PHONY : command_transcode.s + +# target to generate assembly for a file +command_transcode.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_transcode.cpp.s +.PHONY : command_transcode.cpp.s + +command_validate.o: command_validate.cpp.o +.PHONY : command_validate.o + +# target to build an object file +command_validate.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.o +.PHONY : command_validate.cpp.o + +command_validate.i: command_validate.cpp.i +.PHONY : command_validate.i + +# target to preprocess a source file +command_validate.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.i +.PHONY : command_validate.cpp.i + +command_validate.s: command_validate.cpp.s +.PHONY : command_validate.s + +# target to generate assembly for a file +command_validate.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/command_validate.cpp.s +.PHONY : command_validate.cpp.s + +ktx_main.o: ktx_main.cpp.o +.PHONY : ktx_main.o + +# target to build an object file +ktx_main.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.o +.PHONY : ktx_main.cpp.o + +ktx_main.i: ktx_main.cpp.i +.PHONY : ktx_main.i + +# target to preprocess a source file +ktx_main.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.i +.PHONY : ktx_main.cpp.i + +ktx_main.s: ktx_main.cpp.s +.PHONY : ktx_main.s + +# target to generate assembly for a file +ktx_main.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/ktx_main.cpp.s +.PHONY : ktx_main.cpp.s + +transcode_utils.o: transcode_utils.cpp.o +.PHONY : transcode_utils.o + +# target to build an object file +transcode_utils.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.o +.PHONY : transcode_utils.cpp.o + +transcode_utils.i: transcode_utils.cpp.i +.PHONY : transcode_utils.i + +# target to preprocess a source file +transcode_utils.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.i +.PHONY : transcode_utils.cpp.i + +transcode_utils.s: transcode_utils.cpp.s +.PHONY : transcode_utils.s + +# target to generate assembly for a file +transcode_utils.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/transcode_utils.cpp.s +.PHONY : transcode_utils.cpp.s + +validate.o: validate.cpp.o +.PHONY : validate.o + +# target to build an object file +validate.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.o +.PHONY : validate.cpp.o + +validate.i: validate.cpp.i +.PHONY : validate.i + +# target to preprocess a source file +validate.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.i +.PHONY : validate.cpp.i + +validate.s: validate.cpp.s +.PHONY : validate.s + +# target to generate assembly for a file +validate.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx/CMakeFiles/ktxtools.dir/build.make tools/ktx/CMakeFiles/ktxtools.dir/validate.cpp.s +.PHONY : validate.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... ktxtools_version" + @echo "... ktxtools" + @echo "... command.o" + @echo "... command.i" + @echo "... command.s" + @echo "... command_compare.o" + @echo "... command_compare.i" + @echo "... command_compare.s" + @echo "... command_create.o" + @echo "... command_create.i" + @echo "... command_create.s" + @echo "... command_deflate.o" + @echo "... command_deflate.i" + @echo "... command_deflate.s" + @echo "... command_encode.o" + @echo "... command_encode.i" + @echo "... command_encode.s" + @echo "... command_extract.o" + @echo "... command_extract.i" + @echo "... command_extract.s" + @echo "... command_help.o" + @echo "... command_help.i" + @echo "... command_help.s" + @echo "... command_info.o" + @echo "... command_info.i" + @echo "... command_info.s" + @echo "... command_transcode.o" + @echo "... command_transcode.i" + @echo "... command_transcode.s" + @echo "... command_validate.o" + @echo "... command_validate.i" + @echo "... command_validate.s" + @echo "... ktx_main.o" + @echo "... ktx_main.i" + @echo "... ktx_main.s" + @echo "... transcode_utils.o" + @echo "... transcode_utils.i" + @echo "... transcode_utils.s" + @echo "... validate.o" + @echo "... validate.i" + @echo "... validate.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tools/ktx/cmake_install.cmake b/ktx/build/tools/ktx/cmake_install.cmake new file mode 100644 index 0000000..cd25ce6 --- /dev/null +++ b/ktx/build/tools/ktx/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tools/ktx2check/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tools/ktx2check/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/DependInfo.cmake b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/DependInfo.cmake new file mode 100644 index 0000000..e779a0f --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/DependInfo.cmake @@ -0,0 +1,24 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/ktx2check.cpp" "tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o" "gcc" "tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o.d" + "" "Release/ktx2check" "gcc" "tools/ktx2check/CMakeFiles/ktx2check.dir/link.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/build.make b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/build.make new file mode 100644 index 0000000..d4a7dbe --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/build.make @@ -0,0 +1,116 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tools/ktx2check/CMakeFiles/ktx2check.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tools/ktx2check/CMakeFiles/ktx2check.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/ktx2check/CMakeFiles/ktx2check.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/ktx2check/CMakeFiles/ktx2check.dir/flags.make + +tools/ktx2check/CMakeFiles/ktx2check.dir/codegen: +.PHONY : tools/ktx2check/CMakeFiles/ktx2check.dir/codegen + +tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o: tools/ktx2check/CMakeFiles/ktx2check.dir/flags.make +tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/ktx2check.cpp +tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o: tools/ktx2check/CMakeFiles/ktx2check.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o -MF CMakeFiles/ktx2check.dir/ktx2check.cpp.o.d -o CMakeFiles/ktx2check.dir/ktx2check.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/ktx2check.cpp + +tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx2check.dir/ktx2check.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/ktx2check.cpp > CMakeFiles/ktx2check.dir/ktx2check.cpp.i + +tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx2check.dir/ktx2check.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/ktx2check.cpp -o CMakeFiles/ktx2check.dir/ktx2check.cpp.s + +# Object files for target ktx2check +ktx2check_OBJECTS = \ +"CMakeFiles/ktx2check.dir/ktx2check.cpp.o" + +# External object files for target ktx2check +ktx2check_EXTERNAL_OBJECTS = + +Release/ktx2check: tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o +Release/ktx2check: tools/ktx2check/CMakeFiles/ktx2check.dir/build.make +Release/ktx2check: tools/ktx2check/CMakeFiles/ktx2check.dir/compiler_depend.ts +Release/ktx2check: Release/libktx.so.0.0.0 +Release/ktx2check: libobjUtil.a +Release/ktx2check: tools/ktx2check/CMakeFiles/ktx2check.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../../Release/ktx2check" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/ktx2check.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/ktx2check/CMakeFiles/ktx2check.dir/build: Release/ktx2check +.PHONY : tools/ktx2check/CMakeFiles/ktx2check.dir/build + +tools/ktx2check/CMakeFiles/ktx2check.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check && $(CMAKE_COMMAND) -P CMakeFiles/ktx2check.dir/cmake_clean.cmake +.PHONY : tools/ktx2check/CMakeFiles/ktx2check.dir/clean + +tools/ktx2check/CMakeFiles/ktx2check.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/DependInfo.cmake "--color=$(COLOR)" ktx2check +.PHONY : tools/ktx2check/CMakeFiles/ktx2check.dir/depend + diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/cmake_clean.cmake b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/cmake_clean.cmake new file mode 100644 index 0000000..0036ecb --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/cmake_clean.cmake @@ -0,0 +1,12 @@ +file(REMOVE_RECURSE + "../../Release/ktx2check" + "../../Release/ktx2check.pdb" + "CMakeFiles/ktx2check.dir/link.d" + "CMakeFiles/ktx2check.dir/ktx2check.cpp.o" + "CMakeFiles/ktx2check.dir/ktx2check.cpp.o.d" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/ktx2check.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/compiler_depend.internal b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/compiler_depend.internal new file mode 100644 index 0000000..2b87dd3 --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/compiler_depend.internal @@ -0,0 +1,389 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/ktx2check + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/libobjUtil.a + /usr/lib/Scrt1.o + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o + +tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/ktx2check.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/version.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/deque.tcc + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/regex.h + /usr/include/c++/16.1.1/bits/regex.tcc + /usr/include/c++/16.1.1/bits/regex_automaton.h + /usr/include/c++/16.1.1/bits/regex_automaton.tcc + /usr/include/c++/16.1.1/bits/regex_compiler.h + /usr/include/c++/16.1.1/bits/regex_compiler.tcc + /usr/include/c++/16.1.1/bits/regex_constants.h + /usr/include/c++/16.1.1/bits/regex_error.h + /usr/include/c++/16.1.1/bits/regex_executor.h + /usr/include/c++/16.1.1/bits/regex_executor.tcc + /usr/include/c++/16.1.1/bits/regex_scanner.h + /usr/include/c++/16.1.1/bits/regex_scanner.tcc + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_deque.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_stack.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/bitset + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/deque + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/regex + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stack + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/math.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/compiler_depend.make b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/compiler_depend.make new file mode 100644 index 0000000..ec95bd3 --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/compiler_depend.make @@ -0,0 +1,1149 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/ktx2check: Release/libktx.so.0.0.0 \ + libobjUtil.a \ + /usr/lib/Scrt1.o \ + /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o + +tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/ktx2check.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/version.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/regex \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stack \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/math.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/include/unistd.h: + +/usr/include/time.h: + +/usr/include/sys/types.h: + +/usr/include/sys/select.h: + +/usr/include/sys/cdefs.h: + +/usr/include/string.h: + +/usr/include/stdlib.h: + +/usr/include/pthread.h: + +/usr/include/linux/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/sched/types.h: + +/usr/include/limits.h: + +/usr/include/gnu/stubs.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/features-time64.h: + +/usr/include/fcntl.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/vector: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/c++/16.1.1/thread: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/c++/16.1.1/stack: + +/usr/include/c++/16.1.1/regex: + +/usr/include/c++/16.1.1/ratio: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/c++/16.1.1/memory: + +/usr/include/c++/16.1.1/locale: + +/usr/include/c++/16.1.1/ios: + +/usr/include/c++/16.1.1/iomanip: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/include/c++/16.1.1/fstream: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/exception: + +/usr/include/c++/16.1.1/deque: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/clocale: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/bits/types/sigset_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/types/clock_t.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/bits/mathcalls.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/FILE.h: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/c++/16.1.1/cstdlib: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/ktx2check.cpp: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/bits/stdio_lim.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/bits/setjmp.h: + +/usr/include/bits/select.h: + +/usr/include/features.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/bits/sched.h: + +/usr/include/c++/16.1.1/bits/stl_stack.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/bits/posix2_lim.h: + +tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o: + +/usr/include/bits/mathcalls-macros.h: + +/usr/include/asm-generic/int-ll64.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/bits/long-double.h: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/linux/openat2.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/bits/libc-header-start.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/bits/iscanonical.h: + +/usr/include/errno.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/usr/include/bits/getopt_posix.h: + +/usr/include/bits/cloexec.h: + +/usr/include/bits/fp-logb.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/bits/floatn.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/bits/mathcalls-narrow.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/bits/errno.h: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/c++/16.1.1/bits/regex_compiler.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/usr/include/bits/types/time_t.h: + +/usr/include/bits/types/struct_timeval.h: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/c++/16.1.1/bits/quoted_string.h: + +/usr/include/bits/confname.h: + +/usr/lib/libgcc_s.so.1: + +/usr/include/bits/types/__locale_t.h: + +/usr/include/bits/types.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/bits/getopt_core.h: + +/usr/include/c++/16.1.1/istream: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/bits/stat.h: + +/usr/include/assert.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/usr/include/alloca.h: + +/usr/lib/libatomic.so: + +/usr/include/c++/16.1.1/bitset: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/asm/posix_types_64.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/lib/Scrt1.o: + +/usr/include/bits/types/timer_t.h: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/local_lim.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/bits/stdio.h: + +/usr/include/bits/fcntl-linux.h: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/c++/16.1.1/bits/specfun.h: + +/usr/include/bits/typesizes.h: + +/usr/include/c++/16.1.1/bits/regex_compiler.tcc: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/lib/libc.so.6: + +/usr/lib/libm.so.6: + +/usr/include/wchar.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/wctype.h: + +/usr/include/sched.h: + +/usr/include/bits/fp-fast.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/lib/libc.so: + +Release/libktx.so.0.0.0: + +/usr/include/bits/byteswap.h: + +/usr/include/bits/environments.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/asm/types.h: + +/usr/include/locale.h: + +/usr/lib/libstdc++.so: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/bits/math-vector.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/usr/include/c++/16.1.1/bits/regex_error.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h: + +/usr/include/stdio.h: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/bits/wordsize.h: + +/usr/include/bits/types/struct_iovec.h: + +libobjUtil.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/lib/libmvec.so.1: + +/usr/include/bits/types/error_t.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/bits/stdint-intn.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h: + +/usr/include/bits/posix_opt.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/asm-generic/types.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/bits/cpu-set.h: + +/usr/include/bits/timesize.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/asm/errno.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/linux/falloc.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/bits/waitflags.h: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/lib/libm.so: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/lib/libgcc_s.so: + +/usr/include/c++/16.1.1/algorithm: + +/usr/lib/crti.o: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/regex_scanner.tcc: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/math.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/bits/chrono.h: + +/usr/include/strings.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/linux/limits.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/include/c++/16.1.1/bits/deque.tcc: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/c++/16.1.1/bits/regex_executor.h: + +/usr/include/c++/16.1.1/bits/fstream.tcc: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/version.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/libintl.h: + +/usr/include/bits/endianness.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/bits/struct_stat.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/regex_automaton.tcc: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/bits/fcntl.h: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/c++/16.1.1/bits/regex.h: + +/usr/include/c++/16.1.1/bits/std_thread.h: + +/usr/include/c++/16.1.1/bits/regex.tcc: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/bits/stl_map.h: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/c++/16.1.1/bits/regex_constants.h: + +/usr/include/c++/16.1.1/bits/regex_executor.tcc: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/c++/16.1.1/bits/regex_automaton.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/math.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/c++/16.1.1/bits/stl_deque.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/lib/crtn.o: + +/usr/include/c++/16.1.1/bits/stl_tree.h: + +/usr/include/bits/openat2.h: + +/usr/include/c++/16.1.1/bits/regex_scanner.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/bits/this_thread_sleep.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/compiler_depend.ts b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/compiler_depend.ts new file mode 100644 index 0000000..a4cefbf --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for ktx2check. diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/depend.make b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/depend.make new file mode 100644 index 0000000..7bd294e --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for ktx2check. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/flags.make b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/flags.make new file mode 100644 index 0000000..a92d43e --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/. -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -fvisibility=hidden -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o new file mode 100644 index 0000000..3641c85 Binary files /dev/null and b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o differ diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o.d b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o.d new file mode 100644 index 0000000..358475a --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o.d @@ -0,0 +1,276 @@ +tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/ktx2check.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/math.h /usr/include/c++/16.1.1/cmath \ + /usr/include/math.h /usr/include/bits/math-vector.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/limits /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/fstream /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/regex /usr/include/c++/16.1.1/bitset \ + /usr/include/c++/16.1.1/stack /usr/include/c++/16.1.1/deque \ + /usr/include/c++/16.1.1/bits/stl_deque.h \ + /usr/include/c++/16.1.1/bits/deque.tcc \ + /usr/include/c++/16.1.1/bits/stl_stack.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/regex_constants.h \ + /usr/include/c++/16.1.1/bits/regex_error.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.h \ + /usr/include/c++/16.1.1/bits/regex_automaton.tcc \ + /usr/include/c++/16.1.1/bits/regex_scanner.h \ + /usr/include/c++/16.1.1/bits/regex_scanner.tcc \ + /usr/include/c++/16.1.1/bits/regex_compiler.h \ + /usr/include/c++/16.1.1/bits/regex_compiler.tcc \ + /usr/include/c++/16.1.1/bits/regex.h \ + /usr/include/c++/16.1.1/bits/regex.tcc \ + /usr/include/c++/16.1.1/bits/regex_executor.h \ + /usr/include/c++/16.1.1/bits/regex_executor.tcc \ + /usr/include/c++/16.1.1/thread /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/chrono.h /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/ktxint.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/dfd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/texture.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/formatsize.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/basis_sgd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/sbufstream.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/version.h diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/link.d b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/link.d new file mode 100644 index 0000000..5290c51 --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/link.d @@ -0,0 +1,112 @@ +../../Release/ktx2check: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/ktx2check.dir/ktx2check.cpp.o \ + ../../Release/libktx.so.0.0.0 \ + ../../libobjUtil.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o \ + /usr/lib/ld-linux-x86-64.so.2 + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/ktx2check.dir/ktx2check.cpp.o: + +../../Release/libktx.so.0.0.0: + +../../libobjUtil.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: + +/usr/lib/ld-linux-x86-64.so.2: diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/link.txt b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/link.txt new file mode 100644 index 0000000..f556204 --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -msse4.1 -O3 -DNDEBUG -O3 -Wl,--dependency-file=CMakeFiles/ktx2check.dir/link.d CMakeFiles/ktx2check.dir/ktx2check.cpp.o -o ../../Release/ktx2check -Wl,-rpath,"\$ORIGIN:\$ORIGIN/../lib" ../../Release/libktx.so.0.0.0 ../../libobjUtil.a diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/progress.make b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/progress.make new file mode 100644 index 0000000..3ac26ef --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 54 + diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/DependInfo.cmake b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/build.make b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/build.make new file mode 100644 index 0000000..e09c13b --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/build.make @@ -0,0 +1,94 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ktx2check_version. + +# Include any custom commands dependencies for this target. +include tools/ktx2check/CMakeFiles/ktx2check_version.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/ktx2check/CMakeFiles/ktx2check_version.dir/progress.make + +tools/ktx2check/CMakeFiles/ktx2check_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/version.h + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/version.h: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/version.h" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && scripts/mkversion -v exitcode-128-NOTFOUND -o version.h tools/ktx2check + +tools/ktx2check/CMakeFiles/ktx2check_version.dir/codegen: +.PHONY : tools/ktx2check/CMakeFiles/ktx2check_version.dir/codegen + +ktx2check_version: tools/ktx2check/CMakeFiles/ktx2check_version +ktx2check_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/version.h +ktx2check_version: tools/ktx2check/CMakeFiles/ktx2check_version.dir/build.make +.PHONY : ktx2check_version + +# Rule to build all files generated by this target. +tools/ktx2check/CMakeFiles/ktx2check_version.dir/build: ktx2check_version +.PHONY : tools/ktx2check/CMakeFiles/ktx2check_version.dir/build + +tools/ktx2check/CMakeFiles/ktx2check_version.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check && $(CMAKE_COMMAND) -P CMakeFiles/ktx2check_version.dir/cmake_clean.cmake +.PHONY : tools/ktx2check/CMakeFiles/ktx2check_version.dir/clean + +tools/ktx2check/CMakeFiles/ktx2check_version.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/DependInfo.cmake "--color=$(COLOR)" ktx2check_version +.PHONY : tools/ktx2check/CMakeFiles/ktx2check_version.dir/depend + diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/cmake_clean.cmake b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/cmake_clean.cmake new file mode 100644 index 0000000..94a260d --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check/version.h" + "CMakeFiles/ktx2check_version" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ktx2check_version.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/compiler_depend.make b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/compiler_depend.make new file mode 100644 index 0000000..0dd09a2 --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ktx2check_version. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/compiler_depend.ts b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/compiler_depend.ts new file mode 100644 index 0000000..6d2a2b2 --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ktx2check_version. diff --git a/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/progress.make b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/progress.make new file mode 100644 index 0000000..225de34 --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/ktx2check_version.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = + diff --git a/ktx/build/tools/ktx2check/CMakeFiles/progress.marks b/ktx/build/tools/ktx2check/CMakeFiles/progress.marks new file mode 100644 index 0000000..c739b42 --- /dev/null +++ b/ktx/build/tools/ktx2check/CMakeFiles/progress.marks @@ -0,0 +1 @@ +44 diff --git a/ktx/build/tools/ktx2check/CTestTestfile.cmake b/ktx/build/tools/ktx2check/CTestTestfile.cmake new file mode 100644 index 0000000..d7748f3 --- /dev/null +++ b/ktx/build/tools/ktx2check/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/tools/ktx2check/Makefile b/ktx/build/tools/ktx2check/Makefile new file mode 100644 index 0000000..3471163 --- /dev/null +++ b/ktx/build/tools/ktx2check/Makefile @@ -0,0 +1,279 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2check/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2check/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2check/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2check/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tools/ktx2check/CMakeFiles/ktx2check.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2check/CMakeFiles/ktx2check.dir/rule +.PHONY : tools/ktx2check/CMakeFiles/ktx2check.dir/rule + +# Convenience name for target. +ktx2check: tools/ktx2check/CMakeFiles/ktx2check.dir/rule +.PHONY : ktx2check + +# fast build rule for target. +ktx2check/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check.dir/build.make tools/ktx2check/CMakeFiles/ktx2check.dir/build +.PHONY : ktx2check/fast + +# Convenience name for target. +tools/ktx2check/CMakeFiles/ktx2check_version.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2check/CMakeFiles/ktx2check_version.dir/rule +.PHONY : tools/ktx2check/CMakeFiles/ktx2check_version.dir/rule + +# Convenience name for target. +ktx2check_version: tools/ktx2check/CMakeFiles/ktx2check_version.dir/rule +.PHONY : ktx2check_version + +# fast build rule for target. +ktx2check_version/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check_version.dir/build.make tools/ktx2check/CMakeFiles/ktx2check_version.dir/build +.PHONY : ktx2check_version/fast + +ktx2check.o: ktx2check.cpp.o +.PHONY : ktx2check.o + +# target to build an object file +ktx2check.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check.dir/build.make tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.o +.PHONY : ktx2check.cpp.o + +ktx2check.i: ktx2check.cpp.i +.PHONY : ktx2check.i + +# target to preprocess a source file +ktx2check.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check.dir/build.make tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.i +.PHONY : ktx2check.cpp.i + +ktx2check.s: ktx2check.cpp.s +.PHONY : ktx2check.s + +# target to generate assembly for a file +ktx2check.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx2check/CMakeFiles/ktx2check.dir/build.make tools/ktx2check/CMakeFiles/ktx2check.dir/ktx2check.cpp.s +.PHONY : ktx2check.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... ktx2check_version" + @echo "... ktx2check" + @echo "... ktx2check.o" + @echo "... ktx2check.i" + @echo "... ktx2check.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tools/ktx2check/cmake_install.cmake b/ktx/build/tools/ktx2check/cmake_install.cmake new file mode 100644 index 0000000..aec9506 --- /dev/null +++ b/ktx/build/tools/ktx2check/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2check + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2check/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tools/ktx2ktx2/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/DependInfo.cmake b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/DependInfo.cmake new file mode 100644 index 0000000..809062b --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/DependInfo.cmake @@ -0,0 +1,24 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/ktx2ktx2.cpp" "tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o" "gcc" "tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o.d" + "" "Release/ktx2ktx2" "gcc" "tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/link.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make new file mode 100644 index 0000000..9e98468 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make @@ -0,0 +1,116 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/flags.make + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/codegen: +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/codegen + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o: tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/flags.make +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/ktx2ktx2.cpp +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o: tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2 && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o -MF CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o.d -o CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/ktx2ktx2.cpp + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2 && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/ktx2ktx2.cpp > CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.i + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2 && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/ktx2ktx2.cpp -o CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.s + +# Object files for target ktx2ktx2 +ktx2ktx2_OBJECTS = \ +"CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o" + +# External object files for target ktx2ktx2 +ktx2ktx2_EXTERNAL_OBJECTS = + +Release/ktx2ktx2: tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o +Release/ktx2ktx2: tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make +Release/ktx2ktx2: tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/compiler_depend.ts +Release/ktx2ktx2: Release/libktx.so.0.0.0 +Release/ktx2ktx2: libobjUtil.a +Release/ktx2ktx2: tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../../Release/ktx2ktx2" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2 && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/ktx2ktx2.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build: Release/ktx2ktx2 +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2 && $(CMAKE_COMMAND) -P CMakeFiles/ktx2ktx2.dir/cmake_clean.cmake +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/clean + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2 /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2 /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/DependInfo.cmake "--color=$(COLOR)" ktx2ktx2 +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/depend + diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/cmake_clean.cmake b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/cmake_clean.cmake new file mode 100644 index 0000000..53ac787 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/cmake_clean.cmake @@ -0,0 +1,12 @@ +file(REMOVE_RECURSE + "../../Release/ktx2ktx2" + "../../Release/ktx2ktx2.pdb" + "CMakeFiles/ktx2ktx2.dir/link.d" + "CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o" + "CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o.d" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/ktx2ktx2.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/compiler_depend.internal b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/compiler_depend.internal new file mode 100644 index 0000000..6ebd083 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/compiler_depend.internal @@ -0,0 +1,309 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/ktx2ktx2 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/libobjUtil.a + /usr/lib/Scrt1.o + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/ktx2ktx2.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/version.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/compiler_depend.make b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/compiler_depend.make new file mode 100644 index 0000000..772b411 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/compiler_depend.make @@ -0,0 +1,911 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/ktx2ktx2: Release/libktx.so.0.0.0 \ + libobjUtil.a \ + /usr/lib/Scrt1.o \ + /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/ktx2ktx2.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/version.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/include/unistd.h: + +/usr/include/time.h: + +/usr/include/sys/types.h: + +/usr/include/sys/select.h: + +/usr/include/sys/cdefs.h: + +/usr/include/string.h: + +/usr/include/stdlib.h: + +/usr/include/wctype.h: + +/usr/include/sched.h: + +/usr/include/pthread.h: + +/usr/include/linux/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/sched/types.h: + +/usr/include/linux/limits.h: + +/usr/include/limits.h: + +/usr/include/gnu/stubs.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/features-time64.h: + +/usr/include/fcntl.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/stdio.h: + +/usr/include/bits/wordsize.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/bits/timesize.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/bits/types/timer_t.h: + +/usr/lib/Scrt1.o: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/waitflags.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/bits/types/sigset_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/types/clock_t.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/__locale_t.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/FILE.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/bits/types/error_t.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/bits/setjmp.h: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/bits/select.h: + +/usr/include/features.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/bits/sched.h: + +/usr/include/c++/16.1.1/vector: + +/usr/include/bits/posix2_lim.h: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/bits/long-double.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/include/c++/16.1.1/string: + +/usr/include/linux/falloc.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/bits/fcntl-linux.h: + +/usr/include/asm/types.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/asm-generic/types.h: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/lib/libatomic.so: + +/usr/include/bits/endianness.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/include/bits/stat.h: + +/usr/include/assert.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/version.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/bits/libc-header-start.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/atomic_wide_counter.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h: + +/usr/include/bits/posix_opt.h: + +/usr/lib/libmvec.so.1: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/include/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/bits/local_lim.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/alloca.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/locale.h: + +/usr/lib/libstdc++.so: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/asm-generic/int-ll64.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/asm/posix_types_64.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/lib/crti.o: + +/usr/include/bits/typesizes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/usr/include/bits/types.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/bits/getopt_core.h: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/errno.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/usr/include/bits/getopt_posix.h: + +/usr/include/bits/cloexec.h: + +/usr/include/c++/16.1.1/clocale: + +/usr/lib/libm.so.6: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/bits/environments.h: + +/usr/lib/crtn.o: + +/usr/include/bits/types/struct_iovec.h: + +libobjUtil.a: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/wchar.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/lib/libc.so: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +Release/libktx.so.0.0.0: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/ktx2ktx2.cpp: + +/usr/include/bits/byteswap.h: + +/usr/include/c++/16.1.1/algorithm: + +/usr/lib/libgcc_s.so: + +/usr/include/bits/types/struct_timeval.h: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/bits/confname.h: + +/usr/lib/libgcc_s.so.1: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/bits/cpu-set.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/asm/errno.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/bits/floatn-common.h: + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o: + +/usr/include/bits/floatn.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/istream: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/strings.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/c++/16.1.1/memory: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/exception: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/lib/libm.so: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/bits/struct_stat.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/bits/fcntl.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/linux/openat2.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/bits/openat2.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/lib/libc.so.6: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/ios: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/compiler_depend.ts b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/compiler_depend.ts new file mode 100644 index 0000000..4299c39 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for ktx2ktx2. diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/depend.make b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/depend.make new file mode 100644 index 0000000..abfc9d0 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for ktx2ktx2. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/flags.make b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/flags.make new file mode 100644 index 0000000..e0cd54c --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/. -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o new file mode 100644 index 0000000..2dd1e85 Binary files /dev/null and b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o differ diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o.d b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o.d new file mode 100644 index 0000000..faae9b8 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o.d @@ -0,0 +1,210 @@ +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/ktx2ktx2.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/version.h diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/link.d b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/link.d new file mode 100644 index 0000000..106138e --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/link.d @@ -0,0 +1,112 @@ +../../Release/ktx2ktx2: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o \ + ../../Release/libktx.so.0.0.0 \ + ../../libobjUtil.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o \ + /usr/lib/ld-linux-x86-64.so.2 + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o: + +../../Release/libktx.so.0.0.0: + +../../libobjUtil.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: + +/usr/lib/ld-linux-x86-64.so.2: diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/link.txt b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/link.txt new file mode 100644 index 0000000..792bef1 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -msse4.1 -O3 -DNDEBUG -O3 -Wl,--dependency-file=CMakeFiles/ktx2ktx2.dir/link.d CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o -o ../../Release/ktx2ktx2 -Wl,-rpath,"\$ORIGIN:\$ORIGIN/../lib" ../../Release/libktx.so.0.0.0 ../../libobjUtil.a diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/progress.make b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/progress.make new file mode 100644 index 0000000..b26c156 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 55 +CMAKE_PROGRESS_2 = 56 + diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/DependInfo.cmake b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build.make b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build.make new file mode 100644 index 0000000..f479645 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build.make @@ -0,0 +1,94 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ktx2ktx2_version. + +# Include any custom commands dependencies for this target. +include tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/progress.make + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/version.h + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/version.h: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/version.h" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && scripts/mkversion -v exitcode-128-NOTFOUND -o version.h tools/ktx2ktx2 + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/codegen: +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/codegen + +ktx2ktx2_version: tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version +ktx2ktx2_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/version.h +ktx2ktx2_version: tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build.make +.PHONY : ktx2ktx2_version + +# Rule to build all files generated by this target. +tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build: ktx2ktx2_version +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2 && $(CMAKE_COMMAND) -P CMakeFiles/ktx2ktx2_version.dir/cmake_clean.cmake +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/clean + +tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2 /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2 /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/DependInfo.cmake "--color=$(COLOR)" ktx2ktx2_version +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/depend + diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/cmake_clean.cmake b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/cmake_clean.cmake new file mode 100644 index 0000000..81e57ee --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2/version.h" + "CMakeFiles/ktx2ktx2_version" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ktx2ktx2_version.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/compiler_depend.make b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/compiler_depend.make new file mode 100644 index 0000000..23c6023 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ktx2ktx2_version. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/compiler_depend.ts b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/compiler_depend.ts new file mode 100644 index 0000000..9bf24f9 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ktx2ktx2_version. diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/progress.make b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/progress.make new file mode 100644 index 0000000..225de34 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = + diff --git a/ktx/build/tools/ktx2ktx2/CMakeFiles/progress.marks b/ktx/build/tools/ktx2ktx2/CMakeFiles/progress.marks new file mode 100644 index 0000000..ea90ee3 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CMakeFiles/progress.marks @@ -0,0 +1 @@ +45 diff --git a/ktx/build/tools/ktx2ktx2/CTestTestfile.cmake b/ktx/build/tools/ktx2ktx2/CTestTestfile.cmake new file mode 100644 index 0000000..c9fc917 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2 +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2 +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/tools/ktx2ktx2/Makefile b/ktx/build/tools/ktx2ktx2/Makefile new file mode 100644 index 0000000..f6a09f3 --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/Makefile @@ -0,0 +1,279 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2ktx2/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2ktx2/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2ktx2/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2ktx2/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/rule +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/rule + +# Convenience name for target. +ktx2ktx2: tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/rule +.PHONY : ktx2ktx2 + +# fast build rule for target. +ktx2ktx2/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build +.PHONY : ktx2ktx2/fast + +# Convenience name for target. +tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/rule +.PHONY : tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/rule + +# Convenience name for target. +ktx2ktx2_version: tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/rule +.PHONY : ktx2ktx2_version + +# fast build rule for target. +ktx2ktx2_version/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2_version.dir/build +.PHONY : ktx2ktx2_version/fast + +ktx2ktx2.o: ktx2ktx2.cpp.o +.PHONY : ktx2ktx2.o + +# target to build an object file +ktx2ktx2.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.o +.PHONY : ktx2ktx2.cpp.o + +ktx2ktx2.i: ktx2ktx2.cpp.i +.PHONY : ktx2ktx2.i + +# target to preprocess a source file +ktx2ktx2.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.i +.PHONY : ktx2ktx2.cpp.i + +ktx2ktx2.s: ktx2ktx2.cpp.s +.PHONY : ktx2ktx2.s + +# target to generate assembly for a file +ktx2ktx2.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/build.make tools/ktx2ktx2/CMakeFiles/ktx2ktx2.dir/ktx2ktx2.cpp.s +.PHONY : ktx2ktx2.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... ktx2ktx2_version" + @echo "... ktx2ktx2" + @echo "... ktx2ktx2.o" + @echo "... ktx2ktx2.i" + @echo "... ktx2ktx2.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tools/ktx2ktx2/cmake_install.cmake b/ktx/build/tools/ktx2ktx2/cmake_install.cmake new file mode 100644 index 0000000..8bffbaf --- /dev/null +++ b/ktx/build/tools/ktx2ktx2/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktx2ktx2 + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktx2ktx2/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tools/ktxinfo/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/DependInfo.cmake b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/DependInfo.cmake new file mode 100644 index 0000000..181c723 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/DependInfo.cmake @@ -0,0 +1,24 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/ktxinfo.cpp" "tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o" "gcc" "tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o.d" + "" "Release/ktxinfo" "gcc" "tools/ktxinfo/CMakeFiles/ktxinfo.dir/link.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make new file mode 100644 index 0000000..220a213 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make @@ -0,0 +1,116 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tools/ktxinfo/CMakeFiles/ktxinfo.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tools/ktxinfo/CMakeFiles/ktxinfo.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/ktxinfo/CMakeFiles/ktxinfo.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/ktxinfo/CMakeFiles/ktxinfo.dir/flags.make + +tools/ktxinfo/CMakeFiles/ktxinfo.dir/codegen: +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo.dir/codegen + +tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o: tools/ktxinfo/CMakeFiles/ktxinfo.dir/flags.make +tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/ktxinfo.cpp +tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o: tools/ktxinfo/CMakeFiles/ktxinfo.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o -MF CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o.d -o CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/ktxinfo.cpp + +tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxinfo.dir/ktxinfo.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/ktxinfo.cpp > CMakeFiles/ktxinfo.dir/ktxinfo.cpp.i + +tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxinfo.dir/ktxinfo.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/ktxinfo.cpp -o CMakeFiles/ktxinfo.dir/ktxinfo.cpp.s + +# Object files for target ktxinfo +ktxinfo_OBJECTS = \ +"CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o" + +# External object files for target ktxinfo +ktxinfo_EXTERNAL_OBJECTS = + +Release/ktxinfo: tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o +Release/ktxinfo: tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make +Release/ktxinfo: tools/ktxinfo/CMakeFiles/ktxinfo.dir/compiler_depend.ts +Release/ktxinfo: Release/libktx.so.0.0.0 +Release/ktxinfo: libobjUtil.a +Release/ktxinfo: tools/ktxinfo/CMakeFiles/ktxinfo.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../../Release/ktxinfo" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/ktxinfo.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/ktxinfo/CMakeFiles/ktxinfo.dir/build: Release/ktxinfo +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo.dir/build + +tools/ktxinfo/CMakeFiles/ktxinfo.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo && $(CMAKE_COMMAND) -P CMakeFiles/ktxinfo.dir/cmake_clean.cmake +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo.dir/clean + +tools/ktxinfo/CMakeFiles/ktxinfo.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/DependInfo.cmake "--color=$(COLOR)" ktxinfo +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo.dir/depend + diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/cmake_clean.cmake b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/cmake_clean.cmake new file mode 100644 index 0000000..5c2305e --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/cmake_clean.cmake @@ -0,0 +1,12 @@ +file(REMOVE_RECURSE + "../../Release/ktxinfo" + "../../Release/ktxinfo.pdb" + "CMakeFiles/ktxinfo.dir/link.d" + "CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o" + "CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o.d" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/ktxinfo.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/compiler_depend.internal b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/compiler_depend.internal new file mode 100644 index 0000000..66661d1 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/compiler_depend.internal @@ -0,0 +1,309 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/ktxinfo + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/libobjUtil.a + /usr/lib/Scrt1.o + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o + +tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/ktxinfo.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/version.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/compiler_depend.make b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/compiler_depend.make new file mode 100644 index 0000000..5578644 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/compiler_depend.make @@ -0,0 +1,911 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/ktxinfo: Release/libktx.so.0.0.0 \ + libobjUtil.a \ + /usr/lib/Scrt1.o \ + /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o + +tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/ktxinfo.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/version.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/include/unistd.h: + +/usr/include/time.h: + +/usr/include/sys/types.h: + +/usr/include/sys/select.h: + +/usr/include/sys/cdefs.h: + +/usr/include/string.h: + +/usr/include/stdlib.h: + +/usr/include/wctype.h: + +/usr/include/sched.h: + +/usr/include/pthread.h: + +/usr/include/linux/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/sched/types.h: + +/usr/include/linux/limits.h: + +/usr/include/limits.h: + +/usr/include/gnu/stubs.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/features-time64.h: + +/usr/include/fcntl.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/stdio.h: + +/usr/include/bits/wordsize.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/bits/timesize.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/bits/types/timer_t.h: + +/usr/lib/Scrt1.o: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/include/bits/waitflags.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/bits/types/sigset_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/types/clock_t.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/__locale_t.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/FILE.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/bits/types/error_t.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/bits/setjmp.h: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/bits/select.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/ktxinfo.cpp: + +/usr/include/c++/16.1.1/vector: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/bits/posix2_lim.h: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/bits/long-double.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/include/c++/16.1.1/string: + +/usr/include/linux/falloc.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/bits/fcntl-linux.h: + +/usr/include/asm/types.h: + +/usr/include/bits/posix_opt.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/bits/libc-header-start.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/bits/local_lim.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/alloca.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/locale.h: + +/usr/lib/libstdc++.so: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/asm-generic/int-ll64.h: + +/usr/include/bits/stat.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/include/assert.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/asm/posix_types_64.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/lib/crti.o: + +/usr/include/bits/typesizes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/usr/include/bits/cloexec.h: + +/usr/include/c++/16.1.1/clocale: + +/usr/lib/libm.so.6: + +/usr/include/features.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/bits/sched.h: + +tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/bits/environments.h: + +/usr/lib/crtn.o: + +/usr/lib/libatomic.so: + +/usr/include/bits/endianness.h: + +/usr/include/bits/types.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/bits/getopt_core.h: + +/usr/include/bits/types/struct_iovec.h: + +libobjUtil.a: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/wchar.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/lib/libc.so: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/version.h: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/asm-generic/types.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/initializer_list: + +Release/libktx.so.0.0.0: + +/usr/include/bits/byteswap.h: + +/usr/include/c++/16.1.1/algorithm: + +/usr/lib/libgcc_s.so: + +/usr/include/bits/types/struct_timeval.h: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/bits/confname.h: + +/usr/lib/libgcc_s.so.1: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/asm-generic/errno.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/bits/cpu-set.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/asm/errno.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/bits/floatn.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/istream: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/strings.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/c++/16.1.1/memory: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/exception: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/lib/libm.so: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/bits/struct_stat.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/bits/fcntl.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/linux/openat2.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/bits/openat2.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/lib/libc.so.6: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/ios: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/errno.h: + +/usr/include/bits/getopt_posix.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/compiler_depend.ts b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/compiler_depend.ts new file mode 100644 index 0000000..0c9b2cd --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for ktxinfo. diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/depend.make b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/depend.make new file mode 100644 index 0000000..23d0a92 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for ktxinfo. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/flags.make b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/flags.make new file mode 100644 index 0000000..6bf25f5 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/. -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o new file mode 100644 index 0000000..78e8d39 Binary files /dev/null and b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o differ diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o.d b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o.d new file mode 100644 index 0000000..03d7cc5 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o.d @@ -0,0 +1,210 @@ +tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/ktxinfo.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/version.h diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/link.d b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/link.d new file mode 100644 index 0000000..c706e9c --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/link.d @@ -0,0 +1,112 @@ +../../Release/ktxinfo: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o \ + ../../Release/libktx.so.0.0.0 \ + ../../libobjUtil.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o \ + /usr/lib/ld-linux-x86-64.so.2 + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o: + +../../Release/libktx.so.0.0.0: + +../../libobjUtil.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: + +/usr/lib/ld-linux-x86-64.so.2: diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/link.txt b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/link.txt new file mode 100644 index 0000000..9c8a730 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -msse4.1 -O3 -DNDEBUG -O3 -Wl,--dependency-file=CMakeFiles/ktxinfo.dir/link.d CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o -o ../../Release/ktxinfo -Wl,-rpath,"\$ORIGIN:\$ORIGIN/../lib" ../../Release/libktx.so.0.0.0 ../../libobjUtil.a diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/progress.make b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/progress.make new file mode 100644 index 0000000..85e5e31 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 77 + diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/DependInfo.cmake b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build.make b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build.make new file mode 100644 index 0000000..c21be94 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build.make @@ -0,0 +1,94 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ktxinfo_version. + +# Include any custom commands dependencies for this target. +include tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/progress.make + +tools/ktxinfo/CMakeFiles/ktxinfo_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/version.h + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/version.h: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/version.h" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && scripts/mkversion -v exitcode-128-NOTFOUND -o version.h tools/ktxinfo + +tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/codegen: +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/codegen + +ktxinfo_version: tools/ktxinfo/CMakeFiles/ktxinfo_version +ktxinfo_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/version.h +ktxinfo_version: tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build.make +.PHONY : ktxinfo_version + +# Rule to build all files generated by this target. +tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build: ktxinfo_version +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build + +tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo && $(CMAKE_COMMAND) -P CMakeFiles/ktxinfo_version.dir/cmake_clean.cmake +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/clean + +tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/DependInfo.cmake "--color=$(COLOR)" ktxinfo_version +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/depend + diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/cmake_clean.cmake b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/cmake_clean.cmake new file mode 100644 index 0000000..dfe771b --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo/version.h" + "CMakeFiles/ktxinfo_version" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ktxinfo_version.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/compiler_depend.make b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/compiler_depend.make new file mode 100644 index 0000000..d80face --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ktxinfo_version. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/compiler_depend.ts b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/compiler_depend.ts new file mode 100644 index 0000000..ec79e69 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ktxinfo_version. diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/progress.make b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/progress.make new file mode 100644 index 0000000..6137385 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 78 + diff --git a/ktx/build/tools/ktxinfo/CMakeFiles/progress.marks b/ktx/build/tools/ktxinfo/CMakeFiles/progress.marks new file mode 100644 index 0000000..ea90ee3 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CMakeFiles/progress.marks @@ -0,0 +1 @@ +45 diff --git a/ktx/build/tools/ktxinfo/CTestTestfile.cmake b/ktx/build/tools/ktxinfo/CTestTestfile.cmake new file mode 100644 index 0000000..b682d54 --- /dev/null +++ b/ktx/build/tools/ktxinfo/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/tools/ktxinfo/Makefile b/ktx/build/tools/ktxinfo/Makefile new file mode 100644 index 0000000..10e1ddf --- /dev/null +++ b/ktx/build/tools/ktxinfo/Makefile @@ -0,0 +1,279 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxinfo/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxinfo/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxinfo/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxinfo/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tools/ktxinfo/CMakeFiles/ktxinfo.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxinfo/CMakeFiles/ktxinfo.dir/rule +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo.dir/rule + +# Convenience name for target. +ktxinfo: tools/ktxinfo/CMakeFiles/ktxinfo.dir/rule +.PHONY : ktxinfo + +# fast build rule for target. +ktxinfo/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo.dir/build +.PHONY : ktxinfo/fast + +# Convenience name for target. +tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/rule +.PHONY : tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/rule + +# Convenience name for target. +ktxinfo_version: tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/rule +.PHONY : ktxinfo_version + +# fast build rule for target. +ktxinfo_version/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo_version.dir/build +.PHONY : ktxinfo_version/fast + +ktxinfo.o: ktxinfo.cpp.o +.PHONY : ktxinfo.o + +# target to build an object file +ktxinfo.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.o +.PHONY : ktxinfo.cpp.o + +ktxinfo.i: ktxinfo.cpp.i +.PHONY : ktxinfo.i + +# target to preprocess a source file +ktxinfo.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.i +.PHONY : ktxinfo.cpp.i + +ktxinfo.s: ktxinfo.cpp.s +.PHONY : ktxinfo.s + +# target to generate assembly for a file +ktxinfo.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktxinfo/CMakeFiles/ktxinfo.dir/build.make tools/ktxinfo/CMakeFiles/ktxinfo.dir/ktxinfo.cpp.s +.PHONY : ktxinfo.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... ktxinfo_version" + @echo "... ktxinfo" + @echo "... ktxinfo.o" + @echo "... ktxinfo.i" + @echo "... ktxinfo.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tools/ktxinfo/cmake_install.cmake b/ktx/build/tools/ktxinfo/cmake_install.cmake new file mode 100644 index 0000000..964dfd6 --- /dev/null +++ b/ktx/build/tools/ktxinfo/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxinfo + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxinfo/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tools/ktxsc/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tools/ktxsc/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/DependInfo.cmake b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/DependInfo.cmake new file mode 100644 index 0000000..14b3f3a --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/DependInfo.cmake @@ -0,0 +1,24 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/ktxsc.cpp" "tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o" "gcc" "tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o.d" + "" "Release/ktxsc" "gcc" "tools/ktxsc/CMakeFiles/ktxsc.dir/link.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/build.make b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/build.make new file mode 100644 index 0000000..96fdcd5 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/build.make @@ -0,0 +1,116 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tools/ktxsc/CMakeFiles/ktxsc.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tools/ktxsc/CMakeFiles/ktxsc.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/ktxsc/CMakeFiles/ktxsc.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/ktxsc/CMakeFiles/ktxsc.dir/flags.make + +tools/ktxsc/CMakeFiles/ktxsc.dir/codegen: +.PHONY : tools/ktxsc/CMakeFiles/ktxsc.dir/codegen + +tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o: tools/ktxsc/CMakeFiles/ktxsc.dir/flags.make +tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/ktxsc.cpp +tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o: tools/ktxsc/CMakeFiles/ktxsc.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o -MF CMakeFiles/ktxsc.dir/ktxsc.cpp.o.d -o CMakeFiles/ktxsc.dir/ktxsc.cpp.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/ktxsc.cpp + +tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/ktxsc.dir/ktxsc.cpp.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/ktxsc.cpp > CMakeFiles/ktxsc.dir/ktxsc.cpp.i + +tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/ktxsc.dir/ktxsc.cpp.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/ktxsc.cpp -o CMakeFiles/ktxsc.dir/ktxsc.cpp.s + +# Object files for target ktxsc +ktxsc_OBJECTS = \ +"CMakeFiles/ktxsc.dir/ktxsc.cpp.o" + +# External object files for target ktxsc +ktxsc_EXTERNAL_OBJECTS = + +Release/ktxsc: tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o +Release/ktxsc: tools/ktxsc/CMakeFiles/ktxsc.dir/build.make +Release/ktxsc: tools/ktxsc/CMakeFiles/ktxsc.dir/compiler_depend.ts +Release/ktxsc: Release/libktx.so.0.0.0 +Release/ktxsc: libobjUtil.a +Release/ktxsc: tools/ktxsc/CMakeFiles/ktxsc.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../../Release/ktxsc" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/ktxsc.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/ktxsc/CMakeFiles/ktxsc.dir/build: Release/ktxsc +.PHONY : tools/ktxsc/CMakeFiles/ktxsc.dir/build + +tools/ktxsc/CMakeFiles/ktxsc.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc && $(CMAKE_COMMAND) -P CMakeFiles/ktxsc.dir/cmake_clean.cmake +.PHONY : tools/ktxsc/CMakeFiles/ktxsc.dir/clean + +tools/ktxsc/CMakeFiles/ktxsc.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/DependInfo.cmake "--color=$(COLOR)" ktxsc +.PHONY : tools/ktxsc/CMakeFiles/ktxsc.dir/depend + diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/cmake_clean.cmake b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/cmake_clean.cmake new file mode 100644 index 0000000..fe93274 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/cmake_clean.cmake @@ -0,0 +1,12 @@ +file(REMOVE_RECURSE + "../../Release/ktxsc" + "../../Release/ktxsc.pdb" + "CMakeFiles/ktxsc.dir/link.d" + "CMakeFiles/ktxsc.dir/ktxsc.cpp.o" + "CMakeFiles/ktxsc.dir/ktxsc.cpp.o.d" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/ktxsc.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/compiler_depend.internal b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/compiler_depend.internal new file mode 100644 index 0000000..d4d8b0e --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/compiler_depend.internal @@ -0,0 +1,342 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/ktxsc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/libobjUtil.a + /usr/lib/Scrt1.o + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o + +tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/ktxsc.cpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/version.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/scapp.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fs_dir.h + /usr/include/c++/16.1.1/bits/fs_fwd.h + /usr/include/c++/16.1.1/bits/fs_ops.h + /usr/include/c++/16.1.1/bits/fs_path.h + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/codecvt + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/filesystem + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/compiler_depend.make b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/compiler_depend.make new file mode 100644 index 0000000..0e76c85 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/compiler_depend.make @@ -0,0 +1,1010 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/ktxsc: Release/libktx.so.0.0.0 \ + libobjUtil.a \ + /usr/lib/Scrt1.o \ + /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o + +tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/ktxsc.cpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/version.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/scapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /usr/include/c++/16.1.1/bits/fs_path.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/include/unistd.h: + +/usr/include/time.h: + +/usr/include/sys/types.h: + +/usr/include/sys/select.h: + +/usr/include/sys/cdefs.h: + +/usr/include/string.h: + +/usr/include/stdlib.h: + +/usr/include/wctype.h: + +/usr/include/sched.h: + +/usr/include/pthread.h: + +/usr/include/linux/types.h: + +/usr/include/linux/stddef.h: + +/usr/include/linux/sched/types.h: + +/usr/include/limits.h: + +/usr/include/gnu/stubs.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/features-time64.h: + +/usr/include/fcntl.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/vector: + +/usr/include/c++/16.1.1/unordered_map: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/include/c++/16.1.1/thread: + +/usr/include/c++/16.1.1/system_error: + +/usr/include/c++/16.1.1/string_view: + +/usr/include/c++/16.1.1/string: + +/usr/include/c++/16.1.1/stdexcept: + +/usr/include/c++/16.1.1/ratio: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/c++/16.1.1/memory: + +/usr/include/c++/16.1.1/locale: + +/usr/include/stdio.h: + +/usr/include/bits/wordsize.h: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/bits/timesize.h: + +/usr/include/c++/16.1.1/filesystem: + +/usr/include/bits/types/timer_t.h: + +/usr/lib/Scrt1.o: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/include/bits/waitflags.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/include/bits/types/sigset_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/types/clock_t.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/__locale_t.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/types/FILE.h: + +/usr/include/bits/time64.h: + +/usr/include/bits/stdlib-float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/bits/struct_mutex.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/bits/types/error_t.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/usr/include/bits/setjmp.h: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/include/bits/select.h: + +/usr/include/features.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/bits/sched.h: + +/usr/include/c++/16.1.1/new: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/include/bits/posix2_lim.h: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/c++/16.1.1/exception: + +/usr/include/bits/long-double.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/usr/include/bits/libc-header-start.h: + +/usr/include/c++/16.1.1/iomanip: + +/usr/include/asm/types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h: + +/usr/include/asm-generic/int-ll64.h: + +/usr/lib/libatomic.so: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/ktxsc.cpp: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/include/asm-generic/types.h: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/include/bits/posix_opt.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/lib/libmvec.so.1: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/include/bits/stat.h: + +/usr/include/assert.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/bits/stdint-intn.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/bits/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/alloca.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/locale.h: + +/usr/lib/libstdc++.so: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/ctype.h: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/include/asm/posix_types_64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/version.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/bits/local_lim.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +/usr/include/linux/falloc.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/bits/fcntl-linux.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/include/bits/typesizes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/usr/include/bits/types/mbstate_t.h: + +tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o: + +/usr/include/errno.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/usr/include/bits/getopt_posix.h: + +/usr/include/bits/cloexec.h: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/bits/types/__mbstate_t.h: + +/usr/include/c++/16.1.1/bits/hashtable.h: + +/usr/lib/libm.so.6: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/bits/environments.h: + +/usr/lib/crtn.o: + +/usr/include/bits/types.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/usr/include/c++/16.1.1/istream: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/bits/getopt_core.h: + +/usr/include/bits/types/struct_iovec.h: + +libobjUtil.a: + +/usr/include/wchar.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/bits/pthreadtypes.h: + +/usr/lib/libc.so: + +Release/libktx.so.0.0.0: + +/usr/include/bits/byteswap.h: + +/usr/include/c++/16.1.1/algorithm: + +/usr/lib/libgcc_s.so: + +/usr/include/bits/types/struct_timeval.h: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/c++/16.1.1/bits/quoted_string.h: + +/usr/include/bits/confname.h: + +/usr/lib/libgcc_s.so.1: + +/usr/include/bits/types/wint_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/scapp.h: + +/usr/include/asm/bitsperlong.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/c++/16.1.1/bits/fs_ops.h: + +/usr/include/asm-generic/posix_types.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/bits/cpu-set.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/asm/errno.h: + +/usr/include/bits/endian.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/bits/floatn-common.h: + +/usr/include/bits/floatn.h: + +/usr/lib/crti.o: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/c++/16.1.1/backward/binders.h: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/c++/16.1.1/bits/unordered_map.h: + +/usr/include/stdint.h: + +/usr/include/endian.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/bits/chrono.h: + +/usr/include/strings.h: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/include/linux/limits.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/concepts: + +/usr/include/c++/16.1.1/bits/exception.h: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/c++/16.1.1/bits/fs_dir.h: + +/usr/include/c++/16.1.1/bits/fs_fwd.h: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/usr/include/c++/16.1.1/bits/fs_path.h: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/c++/16.1.1/bits/hashtable_policy.h: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/lib/libm.so: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/include/libintl.h: + +/usr/include/bits/endianness.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/bits/struct_stat.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/bits/fcntl.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/c++/16.1.1/bits/std_thread.h: + +/usr/include/c++/16.1.1/codecvt: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/linux/openat2.h: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/include/bits/openat2.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/cstddef: + +/usr/include/c++/16.1.1/limits: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/stdc-predef.h: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/bits/this_thread_sleep.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/lib/libc.so.6: + +/usr/include/c++/16.1.1/cstdio: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/ios: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/iostream: diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/compiler_depend.ts b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/compiler_depend.ts new file mode 100644 index 0000000..79701a3 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for ktxsc. diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/depend.make b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/depend.make new file mode 100644 index 0000000..f98dce1 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for ktxsc. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/flags.make b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/flags.make new file mode 100644 index 0000000..b4656c1 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/. -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o new file mode 100644 index 0000000..99e4463 Binary files /dev/null and b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o differ diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o.d b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o.d new file mode 100644 index 0000000..d35a0ad --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o.d @@ -0,0 +1,236 @@ +tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/ktxsc.cpp \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/scapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/thread /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/chrono.h /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/cstdint /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /usr/include/c++/16.1.1/filesystem /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_path.h /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/codecvt /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/version.h diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/link.d b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/link.d new file mode 100644 index 0000000..39591b3 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/link.d @@ -0,0 +1,112 @@ +../../Release/ktxsc: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/ktxsc.dir/ktxsc.cpp.o \ + ../../Release/libktx.so.0.0.0 \ + ../../libobjUtil.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o \ + /usr/lib/ld-linux-x86-64.so.2 + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/ktxsc.dir/ktxsc.cpp.o: + +../../Release/libktx.so.0.0.0: + +../../libobjUtil.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: + +/usr/lib/ld-linux-x86-64.so.2: diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/link.txt b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/link.txt new file mode 100644 index 0000000..d0176ac --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -msse4.1 -O3 -DNDEBUG -O3 -Wl,--dependency-file=CMakeFiles/ktxsc.dir/link.d CMakeFiles/ktxsc.dir/ktxsc.cpp.o -o ../../Release/ktxsc -Wl,-rpath,"\$ORIGIN:\$ORIGIN/../lib" ../../Release/libktx.so.0.0.0 ../../libobjUtil.a diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/progress.make b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/progress.make new file mode 100644 index 0000000..fe2bd68 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 79 +CMAKE_PROGRESS_2 = + diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/DependInfo.cmake b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/build.make b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/build.make new file mode 100644 index 0000000..0bd6e9d --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/build.make @@ -0,0 +1,94 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for ktxsc_version. + +# Include any custom commands dependencies for this target. +include tools/ktxsc/CMakeFiles/ktxsc_version.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/ktxsc/CMakeFiles/ktxsc_version.dir/progress.make + +tools/ktxsc/CMakeFiles/ktxsc_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/version.h + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/version.h: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/version.h" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && scripts/mkversion -v exitcode-128-NOTFOUND -o version.h tools/ktxsc + +tools/ktxsc/CMakeFiles/ktxsc_version.dir/codegen: +.PHONY : tools/ktxsc/CMakeFiles/ktxsc_version.dir/codegen + +ktxsc_version: tools/ktxsc/CMakeFiles/ktxsc_version +ktxsc_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/version.h +ktxsc_version: tools/ktxsc/CMakeFiles/ktxsc_version.dir/build.make +.PHONY : ktxsc_version + +# Rule to build all files generated by this target. +tools/ktxsc/CMakeFiles/ktxsc_version.dir/build: ktxsc_version +.PHONY : tools/ktxsc/CMakeFiles/ktxsc_version.dir/build + +tools/ktxsc/CMakeFiles/ktxsc_version.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc && $(CMAKE_COMMAND) -P CMakeFiles/ktxsc_version.dir/cmake_clean.cmake +.PHONY : tools/ktxsc/CMakeFiles/ktxsc_version.dir/clean + +tools/ktxsc/CMakeFiles/ktxsc_version.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/DependInfo.cmake "--color=$(COLOR)" ktxsc_version +.PHONY : tools/ktxsc/CMakeFiles/ktxsc_version.dir/depend + diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/cmake_clean.cmake b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/cmake_clean.cmake new file mode 100644 index 0000000..2ceb924 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc/version.h" + "CMakeFiles/ktxsc_version" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/ktxsc_version.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/compiler_depend.make b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/compiler_depend.make new file mode 100644 index 0000000..e7e6c79 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for ktxsc_version. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/compiler_depend.ts b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/compiler_depend.ts new file mode 100644 index 0000000..81089a1 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for ktxsc_version. diff --git a/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/progress.make b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/progress.make new file mode 100644 index 0000000..e12baea --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/ktxsc_version.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 80 + diff --git a/ktx/build/tools/ktxsc/CMakeFiles/progress.marks b/ktx/build/tools/ktxsc/CMakeFiles/progress.marks new file mode 100644 index 0000000..ea90ee3 --- /dev/null +++ b/ktx/build/tools/ktxsc/CMakeFiles/progress.marks @@ -0,0 +1 @@ +45 diff --git a/ktx/build/tools/ktxsc/CTestTestfile.cmake b/ktx/build/tools/ktxsc/CTestTestfile.cmake new file mode 100644 index 0000000..125ea46 --- /dev/null +++ b/ktx/build/tools/ktxsc/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/tools/ktxsc/Makefile b/ktx/build/tools/ktxsc/Makefile new file mode 100644 index 0000000..77d5ef1 --- /dev/null +++ b/ktx/build/tools/ktxsc/Makefile @@ -0,0 +1,279 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxsc/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxsc/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxsc/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxsc/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tools/ktxsc/CMakeFiles/ktxsc.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxsc/CMakeFiles/ktxsc.dir/rule +.PHONY : tools/ktxsc/CMakeFiles/ktxsc.dir/rule + +# Convenience name for target. +ktxsc: tools/ktxsc/CMakeFiles/ktxsc.dir/rule +.PHONY : ktxsc + +# fast build rule for target. +ktxsc/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc.dir/build.make tools/ktxsc/CMakeFiles/ktxsc.dir/build +.PHONY : ktxsc/fast + +# Convenience name for target. +tools/ktxsc/CMakeFiles/ktxsc_version.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/ktxsc/CMakeFiles/ktxsc_version.dir/rule +.PHONY : tools/ktxsc/CMakeFiles/ktxsc_version.dir/rule + +# Convenience name for target. +ktxsc_version: tools/ktxsc/CMakeFiles/ktxsc_version.dir/rule +.PHONY : ktxsc_version + +# fast build rule for target. +ktxsc_version/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc_version.dir/build.make tools/ktxsc/CMakeFiles/ktxsc_version.dir/build +.PHONY : ktxsc_version/fast + +ktxsc.o: ktxsc.cpp.o +.PHONY : ktxsc.o + +# target to build an object file +ktxsc.cpp.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc.dir/build.make tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.o +.PHONY : ktxsc.cpp.o + +ktxsc.i: ktxsc.cpp.i +.PHONY : ktxsc.i + +# target to preprocess a source file +ktxsc.cpp.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc.dir/build.make tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.i +.PHONY : ktxsc.cpp.i + +ktxsc.s: ktxsc.cpp.s +.PHONY : ktxsc.s + +# target to generate assembly for a file +ktxsc.cpp.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/ktxsc/CMakeFiles/ktxsc.dir/build.make tools/ktxsc/CMakeFiles/ktxsc.dir/ktxsc.cpp.s +.PHONY : ktxsc.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... ktxsc_version" + @echo "... ktxsc" + @echo "... ktxsc.o" + @echo "... ktxsc.i" + @echo "... ktxsc.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tools/ktxsc/cmake_install.cmake b/ktx/build/tools/ktxsc/cmake_install.cmake new file mode 100644 index 0000000..2e870f0 --- /dev/null +++ b/ktx/build/tools/ktxsc/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/ktxsc + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/ktxsc/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/build/tools/toktx/CMakeFiles/CMakeDirectoryInformation.cmake b/ktx/build/tools/toktx/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..c280ab4 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/ktx/build/tools/toktx/CMakeFiles/progress.marks b/ktx/build/tools/toktx/CMakeFiles/progress.marks new file mode 100644 index 0000000..59343b0 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/progress.marks @@ -0,0 +1 @@ +53 diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/DependInfo.cmake b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/DependInfo.cmake new file mode 100644 index 0000000..84d9fbd --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/DependInfo.cmake @@ -0,0 +1,24 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/toktx.cc" "tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o" "gcc" "tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o.d" + "" "Release/toktx" "gcc" "tools/toktx/CMakeFiles/toktx.dir/link.d" + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/build.make b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/build.make new file mode 100644 index 0000000..e1bfba1 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/build.make @@ -0,0 +1,118 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Include any dependencies generated for this target. +include tools/toktx/CMakeFiles/toktx.dir/depend.make +# Include any dependencies generated by the compiler for this target. +include tools/toktx/CMakeFiles/toktx.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/toktx/CMakeFiles/toktx.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/toktx/CMakeFiles/toktx.dir/flags.make + +tools/toktx/CMakeFiles/toktx.dir/codegen: +.PHONY : tools/toktx/CMakeFiles/toktx.dir/codegen + +tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o: tools/toktx/CMakeFiles/toktx.dir/flags.make +tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/toktx.cc +tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o: tools/toktx/CMakeFiles/toktx.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o -MF CMakeFiles/toktx.dir/toktx.cc.o.d -o CMakeFiles/toktx.dir/toktx.cc.o -c /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/toktx.cc + +tools/toktx/CMakeFiles/toktx.dir/toktx.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/toktx.dir/toktx.cc.i" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/toktx.cc > CMakeFiles/toktx.dir/toktx.cc.i + +tools/toktx/CMakeFiles/toktx.dir/toktx.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/toktx.dir/toktx.cc.s" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/toktx.cc -o CMakeFiles/toktx.dir/toktx.cc.s + +# Object files for target toktx +toktx_OBJECTS = \ +"CMakeFiles/toktx.dir/toktx.cc.o" + +# External object files for target toktx +toktx_EXTERNAL_OBJECTS = + +Release/toktx: tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o +Release/toktx: tools/toktx/CMakeFiles/toktx.dir/build.make +Release/toktx: tools/toktx/CMakeFiles/toktx.dir/compiler_depend.ts +Release/toktx: tools/imageio/libimageio.a +Release/toktx: Release/libktx.so.0.0.0 +Release/toktx: libobjUtil.a +Release/toktx: external/fmt/libfmt.a +Release/toktx: tools/toktx/CMakeFiles/toktx.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../../Release/toktx" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/toktx.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/toktx/CMakeFiles/toktx.dir/build: Release/toktx +.PHONY : tools/toktx/CMakeFiles/toktx.dir/build + +tools/toktx/CMakeFiles/toktx.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx && $(CMAKE_COMMAND) -P CMakeFiles/toktx.dir/cmake_clean.cmake +.PHONY : tools/toktx/CMakeFiles/toktx.dir/clean + +tools/toktx/CMakeFiles/toktx.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/toktx.dir/DependInfo.cmake "--color=$(COLOR)" toktx +.PHONY : tools/toktx/CMakeFiles/toktx.dir/depend + diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/cmake_clean.cmake b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/cmake_clean.cmake new file mode 100644 index 0000000..a64644f --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/cmake_clean.cmake @@ -0,0 +1,12 @@ +file(REMOVE_RECURSE + "../../Release/toktx" + "../../Release/toktx.pdb" + "CMakeFiles/toktx.dir/link.d" + "CMakeFiles/toktx.dir/toktx.cc.o" + "CMakeFiles/toktx.dir/toktx.cc.o.d" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/toktx.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/compiler_depend.internal b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/compiler_depend.internal new file mode 100644 index 0000000..121ec76 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/compiler_depend.internal @@ -0,0 +1,624 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/toktx + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/Release/libktx.so.0.0.0 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/external/fmt/libfmt.a + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/libobjUtil.a + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/imageio/libimageio.a + /usr/lib/Scrt1.o + /usr/lib/crti.o + /usr/lib/crtn.o + /usr/lib/libatomic.so + /usr/lib/libatomic_asneeded.so + /usr/lib/libc.so + /usr/lib/libgcc_s.so + /usr/lib/libgcc_s.so.1 + /usr/lib/libm.so + /usr/lib/libstdc++.so + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a + /usr/lib/ld-linux-x86-64.so.2 + /usr/lib/libc.so.6 + /usr/lib/libc_nonshared.a + /usr/lib/libm.so.6 + /usr/lib/libmvec.so.1 + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o + +tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/toktx.cc + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/version.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/scapp.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h + /usr/include/alloca.h + /usr/include/asm-generic/bitsperlong.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/asm-generic/int-ll64.h + /usr/include/asm-generic/posix_types.h + /usr/include/asm-generic/types.h + /usr/include/asm/bitsperlong.h + /usr/include/asm/errno.h + /usr/include/asm/posix_types.h + /usr/include/asm/posix_types_64.h + /usr/include/asm/types.h + /usr/include/assert.h + /usr/include/bits/atomic_wide_counter.h + /usr/include/bits/byteswap.h + /usr/include/bits/cloexec.h + /usr/include/bits/confname.h + /usr/include/bits/cpu-set.h + /usr/include/bits/endian.h + /usr/include/bits/endianness.h + /usr/include/bits/environments.h + /usr/include/bits/errno.h + /usr/include/bits/fcntl-linux.h + /usr/include/bits/fcntl.h + /usr/include/bits/floatn-common.h + /usr/include/bits/floatn.h + /usr/include/bits/flt-eval-method.h + /usr/include/bits/fp-fast.h + /usr/include/bits/fp-logb.h + /usr/include/bits/getopt_core.h + /usr/include/bits/getopt_posix.h + /usr/include/bits/iscanonical.h + /usr/include/bits/libc-header-start.h + /usr/include/bits/libm-simd-decl-stubs.h + /usr/include/bits/local_lim.h + /usr/include/bits/locale.h + /usr/include/bits/long-double.h + /usr/include/bits/math-vector.h + /usr/include/bits/mathcalls-helper-functions.h + /usr/include/bits/mathcalls-macros.h + /usr/include/bits/mathcalls-narrow.h + /usr/include/bits/mathcalls.h + /usr/include/bits/openat2.h + /usr/include/bits/posix1_lim.h + /usr/include/bits/posix2_lim.h + /usr/include/bits/posix_opt.h + /usr/include/bits/pthread_stack_min-dynamic.h + /usr/include/bits/pthreadtypes-arch.h + /usr/include/bits/pthreadtypes.h + /usr/include/bits/sched.h + /usr/include/bits/select.h + /usr/include/bits/setjmp.h + /usr/include/bits/stat.h + /usr/include/bits/stdint-intn.h + /usr/include/bits/stdint-least.h + /usr/include/bits/stdint-uintn.h + /usr/include/bits/stdio.h + /usr/include/bits/stdio_lim.h + /usr/include/bits/stdlib-bsearch.h + /usr/include/bits/stdlib-float.h + /usr/include/bits/struct_mutex.h + /usr/include/bits/struct_rwlock.h + /usr/include/bits/struct_stat.h + /usr/include/bits/thread-shared-types.h + /usr/include/bits/time.h + /usr/include/bits/time64.h + /usr/include/bits/timesize.h + /usr/include/bits/timex.h + /usr/include/bits/types.h + /usr/include/bits/types/FILE.h + /usr/include/bits/types/__FILE.h + /usr/include/bits/types/__fpos64_t.h + /usr/include/bits/types/__fpos_t.h + /usr/include/bits/types/__locale_t.h + /usr/include/bits/types/__mbstate_t.h + /usr/include/bits/types/__sigset_t.h + /usr/include/bits/types/clock_t.h + /usr/include/bits/types/clockid_t.h + /usr/include/bits/types/cookie_io_functions_t.h + /usr/include/bits/types/error_t.h + /usr/include/bits/types/locale_t.h + /usr/include/bits/types/mbstate_t.h + /usr/include/bits/types/sigset_t.h + /usr/include/bits/types/struct_FILE.h + /usr/include/bits/types/struct___jmp_buf_tag.h + /usr/include/bits/types/struct_iovec.h + /usr/include/bits/types/struct_itimerspec.h + /usr/include/bits/types/struct_sched_param.h + /usr/include/bits/types/struct_timespec.h + /usr/include/bits/types/struct_timeval.h + /usr/include/bits/types/struct_tm.h + /usr/include/bits/types/time_t.h + /usr/include/bits/types/timer_t.h + /usr/include/bits/types/wint_t.h + /usr/include/bits/typesizes.h + /usr/include/bits/uintn-identity.h + /usr/include/bits/uio_lim.h + /usr/include/bits/unistd_ext.h + /usr/include/bits/waitflags.h + /usr/include/bits/waitstatus.h + /usr/include/bits/wchar.h + /usr/include/bits/wctype-wchar.h + /usr/include/bits/wordsize.h + /usr/include/bits/xopen_lim.h + /usr/include/c++/16.1.1/algorithm + /usr/include/c++/16.1.1/array + /usr/include/c++/16.1.1/backward/auto_ptr.h + /usr/include/c++/16.1.1/backward/binders.h + /usr/include/c++/16.1.1/bit + /usr/include/c++/16.1.1/bits/algorithmfwd.h + /usr/include/c++/16.1.1/bits/align.h + /usr/include/c++/16.1.1/bits/alloc_traits.h + /usr/include/c++/16.1.1/bits/allocated_ptr.h + /usr/include/c++/16.1.1/bits/allocator.h + /usr/include/c++/16.1.1/bits/atomic_base.h + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h + /usr/include/c++/16.1.1/bits/basic_ios.h + /usr/include/c++/16.1.1/bits/basic_ios.tcc + /usr/include/c++/16.1.1/bits/basic_string.h + /usr/include/c++/16.1.1/bits/basic_string.tcc + /usr/include/c++/16.1.1/bits/char_traits.h + /usr/include/c++/16.1.1/bits/charconv.h + /usr/include/c++/16.1.1/bits/chrono.h + /usr/include/c++/16.1.1/bits/codecvt.h + /usr/include/c++/16.1.1/bits/concept_check.h + /usr/include/c++/16.1.1/bits/cpp_type_traits.h + /usr/include/c++/16.1.1/bits/cxxabi_forced.h + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h + /usr/include/c++/16.1.1/bits/enable_special_members.h + /usr/include/c++/16.1.1/bits/erase_if.h + /usr/include/c++/16.1.1/bits/exception.h + /usr/include/c++/16.1.1/bits/exception_defines.h + /usr/include/c++/16.1.1/bits/exception_ptr.h + /usr/include/c++/16.1.1/bits/fs_dir.h + /usr/include/c++/16.1.1/bits/fs_fwd.h + /usr/include/c++/16.1.1/bits/fs_ops.h + /usr/include/c++/16.1.1/bits/fs_path.h + /usr/include/c++/16.1.1/bits/fstream.tcc + /usr/include/c++/16.1.1/bits/functexcept.h + /usr/include/c++/16.1.1/bits/functional_hash.h + /usr/include/c++/16.1.1/bits/hash_bytes.h + /usr/include/c++/16.1.1/bits/hashtable.h + /usr/include/c++/16.1.1/bits/hashtable_policy.h + /usr/include/c++/16.1.1/bits/invoke.h + /usr/include/c++/16.1.1/bits/ios_base.h + /usr/include/c++/16.1.1/bits/istream.tcc + /usr/include/c++/16.1.1/bits/locale_classes.h + /usr/include/c++/16.1.1/bits/locale_classes.tcc + /usr/include/c++/16.1.1/bits/locale_conv.h + /usr/include/c++/16.1.1/bits/locale_facets.h + /usr/include/c++/16.1.1/bits/locale_facets.tcc + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc + /usr/include/c++/16.1.1/bits/localefwd.h + /usr/include/c++/16.1.1/bits/memory_resource.h + /usr/include/c++/16.1.1/bits/memoryfwd.h + /usr/include/c++/16.1.1/bits/move.h + /usr/include/c++/16.1.1/bits/nested_exception.h + /usr/include/c++/16.1.1/bits/new_allocator.h + /usr/include/c++/16.1.1/bits/new_except.h + /usr/include/c++/16.1.1/bits/new_throw.h + /usr/include/c++/16.1.1/bits/node_handle.h + /usr/include/c++/16.1.1/bits/ostream.h + /usr/include/c++/16.1.1/bits/ostream.tcc + /usr/include/c++/16.1.1/bits/ostream_insert.h + /usr/include/c++/16.1.1/bits/ostream_print.h + /usr/include/c++/16.1.1/bits/parse_numbers.h + /usr/include/c++/16.1.1/bits/postypes.h + /usr/include/c++/16.1.1/bits/predefined_ops.h + /usr/include/c++/16.1.1/bits/ptr_traits.h + /usr/include/c++/16.1.1/bits/quoted_string.h + /usr/include/c++/16.1.1/bits/random.h + /usr/include/c++/16.1.1/bits/random.tcc + /usr/include/c++/16.1.1/bits/range_access.h + /usr/include/c++/16.1.1/bits/refwrap.h + /usr/include/c++/16.1.1/bits/requires_hosted.h + /usr/include/c++/16.1.1/bits/shared_ptr.h + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h + /usr/include/c++/16.1.1/bits/shared_ptr_base.h + /usr/include/c++/16.1.1/bits/specfun.h + /usr/include/c++/16.1.1/bits/sstream.tcc + /usr/include/c++/16.1.1/bits/std_abs.h + /usr/include/c++/16.1.1/bits/std_function.h + /usr/include/c++/16.1.1/bits/std_thread.h + /usr/include/c++/16.1.1/bits/stdexcept_except.h + /usr/include/c++/16.1.1/bits/stdexcept_throw.h + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h + /usr/include/c++/16.1.1/bits/stl_algo.h + /usr/include/c++/16.1.1/bits/stl_algobase.h + /usr/include/c++/16.1.1/bits/stl_bvector.h + /usr/include/c++/16.1.1/bits/stl_construct.h + /usr/include/c++/16.1.1/bits/stl_function.h + /usr/include/c++/16.1.1/bits/stl_heap.h + /usr/include/c++/16.1.1/bits/stl_iterator.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h + /usr/include/c++/16.1.1/bits/stl_map.h + /usr/include/c++/16.1.1/bits/stl_multimap.h + /usr/include/c++/16.1.1/bits/stl_numeric.h + /usr/include/c++/16.1.1/bits/stl_pair.h + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h + /usr/include/c++/16.1.1/bits/stl_tempbuf.h + /usr/include/c++/16.1.1/bits/stl_tree.h + /usr/include/c++/16.1.1/bits/stl_uninitialized.h + /usr/include/c++/16.1.1/bits/stl_vector.h + /usr/include/c++/16.1.1/bits/stream_iterator.h + /usr/include/c++/16.1.1/bits/streambuf.tcc + /usr/include/c++/16.1.1/bits/streambuf_iterator.h + /usr/include/c++/16.1.1/bits/string_view.tcc + /usr/include/c++/16.1.1/bits/stringfwd.h + /usr/include/c++/16.1.1/bits/this_thread_sleep.h + /usr/include/c++/16.1.1/bits/uniform_int_dist.h + /usr/include/c++/16.1.1/bits/unique_ptr.h + /usr/include/c++/16.1.1/bits/unordered_map.h + /usr/include/c++/16.1.1/bits/uses_allocator.h + /usr/include/c++/16.1.1/bits/uses_allocator_args.h + /usr/include/c++/16.1.1/bits/utility.h + /usr/include/c++/16.1.1/bits/vector.tcc + /usr/include/c++/16.1.1/bits/version.h + /usr/include/c++/16.1.1/cassert + /usr/include/c++/16.1.1/cctype + /usr/include/c++/16.1.1/cerrno + /usr/include/c++/16.1.1/cfloat + /usr/include/c++/16.1.1/climits + /usr/include/c++/16.1.1/clocale + /usr/include/c++/16.1.1/cmath + /usr/include/c++/16.1.1/codecvt + /usr/include/c++/16.1.1/compare + /usr/include/c++/16.1.1/concepts + /usr/include/c++/16.1.1/cstddef + /usr/include/c++/16.1.1/cstdint + /usr/include/c++/16.1.1/cstdio + /usr/include/c++/16.1.1/cstdlib + /usr/include/c++/16.1.1/cstring + /usr/include/c++/16.1.1/ctime + /usr/include/c++/16.1.1/cwchar + /usr/include/c++/16.1.1/cwctype + /usr/include/c++/16.1.1/debug/assertions.h + /usr/include/c++/16.1.1/debug/debug.h + /usr/include/c++/16.1.1/exception + /usr/include/c++/16.1.1/ext/aligned_buffer.h + /usr/include/c++/16.1.1/ext/alloc_traits.h + /usr/include/c++/16.1.1/ext/atomicity.h + /usr/include/c++/16.1.1/ext/concurrence.h + /usr/include/c++/16.1.1/ext/numeric_traits.h + /usr/include/c++/16.1.1/ext/string_conversions.h + /usr/include/c++/16.1.1/ext/type_traits.h + /usr/include/c++/16.1.1/filesystem + /usr/include/c++/16.1.1/fstream + /usr/include/c++/16.1.1/functional + /usr/include/c++/16.1.1/initializer_list + /usr/include/c++/16.1.1/iomanip + /usr/include/c++/16.1.1/ios + /usr/include/c++/16.1.1/iosfwd + /usr/include/c++/16.1.1/iostream + /usr/include/c++/16.1.1/istream + /usr/include/c++/16.1.1/iterator + /usr/include/c++/16.1.1/limits + /usr/include/c++/16.1.1/locale + /usr/include/c++/16.1.1/map + /usr/include/c++/16.1.1/math.h + /usr/include/c++/16.1.1/memory + /usr/include/c++/16.1.1/new + /usr/include/c++/16.1.1/numeric + /usr/include/c++/16.1.1/ostream + /usr/include/c++/16.1.1/pstl/execution_defs.h + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h + /usr/include/c++/16.1.1/pstl/pstl_config.h + /usr/include/c++/16.1.1/random + /usr/include/c++/16.1.1/ratio + /usr/include/c++/16.1.1/sstream + /usr/include/c++/16.1.1/stdexcept + /usr/include/c++/16.1.1/stdlib.h + /usr/include/c++/16.1.1/streambuf + /usr/include/c++/16.1.1/string + /usr/include/c++/16.1.1/string_view + /usr/include/c++/16.1.1/system_error + /usr/include/c++/16.1.1/thread + /usr/include/c++/16.1.1/tr1/bessel_function.tcc + /usr/include/c++/16.1.1/tr1/beta_function.tcc + /usr/include/c++/16.1.1/tr1/ell_integral.tcc + /usr/include/c++/16.1.1/tr1/exp_integral.tcc + /usr/include/c++/16.1.1/tr1/gamma.tcc + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc + /usr/include/c++/16.1.1/tr1/legendre_function.tcc + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc + /usr/include/c++/16.1.1/tr1/special_function_util.h + /usr/include/c++/16.1.1/tuple + /usr/include/c++/16.1.1/type_traits + /usr/include/c++/16.1.1/typeinfo + /usr/include/c++/16.1.1/unordered_map + /usr/include/c++/16.1.1/vector + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h + /usr/include/ctype.h + /usr/include/endian.h + /usr/include/errno.h + /usr/include/fcntl.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/gnu/stubs-64.h + /usr/include/gnu/stubs.h + /usr/include/inttypes.h + /usr/include/libintl.h + /usr/include/limits.h + /usr/include/linux/close_range.h + /usr/include/linux/errno.h + /usr/include/linux/falloc.h + /usr/include/linux/limits.h + /usr/include/linux/openat2.h + /usr/include/linux/posix_types.h + /usr/include/linux/sched/types.h + /usr/include/linux/stddef.h + /usr/include/linux/types.h + /usr/include/locale.h + /usr/include/malloc.h + /usr/include/math.h + /usr/include/memory.h + /usr/include/pthread.h + /usr/include/sched.h + /usr/include/stdc-predef.h + /usr/include/stdint.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/strings.h + /usr/include/sys/cdefs.h + /usr/include/sys/select.h + /usr/include/sys/single_threaded.h + /usr/include/sys/types.h + /usr/include/time.h + /usr/include/unistd.h + /usr/include/wchar.h + /usr/include/wctype.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/compiler_depend.make b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/compiler_depend.make new file mode 100644 index 0000000..43de8c5 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/compiler_depend.make @@ -0,0 +1,1856 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +Release/toktx: Release/libktx.so.0.0.0 \ + external/fmt/libfmt.a \ + libobjUtil.a \ + tools/imageio/libimageio.a \ + /usr/lib/Scrt1.o \ + /usr/lib/crti.o \ + /usr/lib/crtn.o \ + /usr/lib/libatomic.so \ + /usr/lib/libatomic_asneeded.so \ + /usr/lib/libc.so \ + /usr/lib/libgcc_s.so \ + /usr/lib/libgcc_s.so.1 \ + /usr/lib/libm.so \ + /usr/lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o + +tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/toktx.cc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/version.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/scapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /usr/include/alloca.h \ + /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/int-ll64.h \ + /usr/include/asm-generic/posix_types.h \ + /usr/include/asm-generic/types.h \ + /usr/include/asm/bitsperlong.h \ + /usr/include/asm/errno.h \ + /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h \ + /usr/include/asm/types.h \ + /usr/include/assert.h \ + /usr/include/bits/atomic_wide_counter.h \ + /usr/include/bits/byteswap.h \ + /usr/include/bits/cloexec.h \ + /usr/include/bits/confname.h \ + /usr/include/bits/cpu-set.h \ + /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h \ + /usr/include/bits/environments.h \ + /usr/include/bits/errno.h \ + /usr/include/bits/fcntl-linux.h \ + /usr/include/bits/fcntl.h \ + /usr/include/bits/floatn-common.h \ + /usr/include/bits/floatn.h \ + /usr/include/bits/flt-eval-method.h \ + /usr/include/bits/fp-fast.h \ + /usr/include/bits/fp-logb.h \ + /usr/include/bits/getopt_core.h \ + /usr/include/bits/getopt_posix.h \ + /usr/include/bits/iscanonical.h \ + /usr/include/bits/libc-header-start.h \ + /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/local_lim.h \ + /usr/include/bits/locale.h \ + /usr/include/bits/long-double.h \ + /usr/include/bits/math-vector.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/mathcalls.h \ + /usr/include/bits/openat2.h \ + /usr/include/bits/posix1_lim.h \ + /usr/include/bits/posix2_lim.h \ + /usr/include/bits/posix_opt.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/pthreadtypes.h \ + /usr/include/bits/sched.h \ + /usr/include/bits/select.h \ + /usr/include/bits/setjmp.h \ + /usr/include/bits/stat.h \ + /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-least.h \ + /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdio.h \ + /usr/include/bits/stdio_lim.h \ + /usr/include/bits/stdlib-bsearch.h \ + /usr/include/bits/stdlib-float.h \ + /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h \ + /usr/include/bits/struct_stat.h \ + /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/time.h \ + /usr/include/bits/time64.h \ + /usr/include/bits/timesize.h \ + /usr/include/bits/timex.h \ + /usr/include/bits/types.h \ + /usr/include/bits/types/FILE.h \ + /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__locale_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/types/error_t.h \ + /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/sigset_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/types/struct_sched_param.h \ + /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/wint_t.h \ + /usr/include/bits/typesizes.h \ + /usr/include/bits/uintn-identity.h \ + /usr/include/bits/uio_lim.h \ + /usr/include/bits/unistd_ext.h \ + /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h \ + /usr/include/bits/wchar.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/bits/wordsize.h \ + /usr/include/bits/xopen_lim.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/array \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/backward/binders.h \ + /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/chrono.h \ + /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h \ + /usr/include/c++/16.1.1/bits/fs_path.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/bits/istream.tcc \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/bits/postypes.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/bits/random.tcc \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/bits/sstream.tcc \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/cassert \ + /usr/include/c++/16.1.1/cctype \ + /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/cfloat \ + /usr/include/c++/16.1.1/climits \ + /usr/include/c++/16.1.1/clocale \ + /usr/include/c++/16.1.1/cmath \ + /usr/include/c++/16.1.1/codecvt \ + /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/concepts \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/cstdint \ + /usr/include/c++/16.1.1/cstdio \ + /usr/include/c++/16.1.1/cstdlib \ + /usr/include/c++/16.1.1/cstring \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/cwchar \ + /usr/include/c++/16.1.1/cwctype \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/ios \ + /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/math.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/ostream \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/random \ + /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/sstream \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/string \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/thread \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tuple \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/ctype.h \ + /usr/include/endian.h \ + /usr/include/errno.h \ + /usr/include/fcntl.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/gnu/stubs-64.h \ + /usr/include/gnu/stubs.h \ + /usr/include/inttypes.h \ + /usr/include/libintl.h \ + /usr/include/limits.h \ + /usr/include/linux/close_range.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/falloc.h \ + /usr/include/linux/limits.h \ + /usr/include/linux/openat2.h \ + /usr/include/linux/posix_types.h \ + /usr/include/linux/sched/types.h \ + /usr/include/linux/stddef.h \ + /usr/include/linux/types.h \ + /usr/include/locale.h \ + /usr/include/malloc.h \ + /usr/include/math.h \ + /usr/include/memory.h \ + /usr/include/pthread.h \ + /usr/include/sched.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdint.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/strings.h \ + /usr/include/sys/cdefs.h \ + /usr/include/sys/select.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/sys/types.h \ + /usr/include/time.h \ + /usr/include/unistd.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h + + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h: + +/usr/include/c++/16.1.1/bit: + +/usr/include/c++/16.1.1/backward/binders.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl: + +/usr/include/c++/16.1.1/bits/allocator.h: + +/usr/include/c++/16.1.1/backward/auto_ptr.h: + +/usr/include/c++/16.1.1/bits/erase_if.h: + +/usr/include/bits/select.h: + +/usr/include/c++/16.1.1/algorithm: + +/usr/lib/libgcc_s.so: + +/usr/include/bits/wordsize.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp: + +/usr/include/c++/16.1.1/cmath: + +/usr/include/stdio.h: + +/usr/include/bits/unistd_ext.h: + +/usr/include/bits/types/wint_t.h: + +/usr/include/c++/16.1.1/bits/locale_classes.h: + +/usr/include/bits/types/struct___jmp_buf_tag.h: + +/usr/include/bits/waitstatus.h: + +/usr/include/bits/wchar.h: + +/usr/include/bits/types/mbstate_t.h: + +/usr/include/bits/types/cookie_io_functions_t.h: + +/usr/include/c++/16.1.1/bits/atomic_base.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h: + +/usr/include/bits/types/__FILE.h: + +/usr/include/features.h: + +/usr/include/bits/types.h: + +/usr/include/bits/timesize.h: + +/usr/include/bits/thread-shared-types.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h: + +/usr/include/bits/types/struct_itimerspec.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h: + +/usr/include/bits/sched.h: + +/usr/include/bits/struct_rwlock.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h: + +/usr/include/bits/time64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp: + +/usr/include/bits/stdlib-float.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h: + +/usr/include/bits/time.h: + +/usr/include/asm/posix_types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl: + +/usr/include/bits/wctype-wchar.h: + +/usr/include/bits/stdint-intn.h: + +/usr/include/c++/16.1.1/bits/stl_numeric.h: + +/usr/include/c++/16.1.1/debug/debug.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h: + +/usr/include/bits/setjmp.h: + +/usr/include/bits/types/clock_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h: + +/usr/include/bits/types/__fpos_t.h: + +/usr/include/bits/mathcalls.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp: + +/usr/include/c++/16.1.1/cwchar: + +/usr/include/bits/mathcalls-narrow.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp: + +/usr/include/c++/16.1.1/bits/stringfwd.h: + +/usr/include/bits/math-vector.h: + +/usr/include/bits/uio_lim.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h: + +/usr/include/bits/local_lim.h: + +/usr/include/sched.h: + +/usr/include/wctype.h: + +/usr/include/bits/floatn.h: + +/usr/include/bits/fcntl.h: + +/usr/include/c++/16.1.1/bits/memoryfwd.h: + +/usr/include/c++/16.1.1/sstream: + +/usr/include/c++/16.1.1/bits/functexcept.h: + +/usr/include/c++/16.1.1/iosfwd: + +/usr/include/bits/errno.h: + +/usr/include/bits/environments.h: + +/usr/include/bits/types/struct_FILE.h: + +/usr/include/bits/endian.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp: + +/usr/include/bits/posix_opt.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp: + +/usr/include/bits/atomic_wide_counter.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h: + +/usr/include/asm/posix_types_64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp: + +/usr/include/asm-generic/posix_types.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h: + +/usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp: + +/usr/include/c++/16.1.1/bits/enable_special_members.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp: + +/usr/include/asm-generic/bitsperlong.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h: + +/usr/include/asm-generic/errno-base.h: + +/usr/include/c++/16.1.1/bits/uses_allocator_args.h: + +/usr/include/c++/16.1.1/cassert: + +/usr/include/c++/16.1.1/tr1/legendre_function.tcc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio_utility.h: + +/usr/include/bits/waitflags.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h: + +/usr/include/bits/types/time_t.h: + +/usr/include/bits/openat2.h: + +/usr/include/c++/16.1.1/bits/stl_uninitialized.h: + +/usr/include/bits/long-double.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h: + +/usr/include/bits/types/locale_t.h: + +/usr/include/bits/fcntl-linux.h: + +/usr/include/bits/endianness.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp: + +/usr/lib/libatomic.so: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl: + +/usr/include/linux/posix_types.h: + +/usr/include/bits/flt-eval-method.h: + +/usr/include/bits/typesizes.h: + +/usr/lib/crti.o: + +/usr/include/c++/16.1.1/array: + +/usr/include/c++/16.1.1/bits/stl_bvector.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/formatdesc.h: + +/usr/lib/libc_nonshared.a: + +/usr/include/c++/16.1.1/istream: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h: + +/usr/include/c++/16.1.1/bits/predefined_ops.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl: + +/usr/include/bits/types/error_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h: + +/usr/include/c++/16.1.1/bits/basic_string.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl: + +/usr/include/bits/types/__locale_t.h: + +external/fmt/libfmt.a: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl: + +/usr/include/c++/16.1.1/bits/exception_ptr.h: + +/usr/include/bits/types/struct_sched_param.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp: + +/usr/include/bits/types/__sigset_t.h: + +/usr/include/c++/16.1.1/tuple: + +/usr/include/asm-generic/types.h: + +/usr/lib/libc.so: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl: + +/usr/include/bits/getopt_posix.h: + +/usr/include/errno.h: + +/usr/include/bits/cloexec.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h: + +/usr/include/bits/stdint-uintn.h: + +/usr/include/bits/floatn-common.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h: + +/usr/include/bits/stat.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu_containers.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl: + +/usr/include/c++/16.1.1/bits/stdexcept_except.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp: + +libobjUtil.a: + +/usr/include/bits/types/struct_iovec.h: + +/usr/include/bits/libm-simd-decl-stubs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp: + +/usr/include/c++/16.1.1/bits/random.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl: + +/usr/include/c++/16.1.1/bits/concept_check.h: + +/usr/include/bits/locale.h: + +/usr/include/c++/16.1.1/bits/stl_function.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/imageio.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl: + +/usr/include/bits/struct_stat.h: + +/usr/lib/libgcc_s.so.1: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp: + +/usr/include/c++/16.1.1/bits/locale_classes.tcc: + +/usr/include/c++/16.1.1/bits/ostream_print.h: + +/usr/lib/Scrt1.o: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp: + +/usr/lib/libm.so.6: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp: + +/usr/include/c++/16.1.1/pstl/execution_defs.h: + +/usr/include/c++/16.1.1/tr1/hypergeometric.tcc: + +/usr/include/bits/iscanonical.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp: + +/usr/include/c++/16.1.1/functional: + +/usr/include/c++/16.1.1/bits/memory_resource.h: + +/usr/include/c++/16.1.1/cfloat: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl: + +/usr/include/c++/16.1.1/initializer_list: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h: + +/usr/include/assert.h: + +/usr/lib/ld-linux-x86-64.so.2: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h: + +/usr/include/c++/16.1.1/fstream: + +/usr/lib/libatomic_asneeded.so: + +/usr/include/bits/types/struct_timeval.h: + +/usr/include/bits/types/__mbstate_t.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp: + +/usr/include/c++/16.1.1/memory: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp: + +/usr/include/bits/struct_mutex.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h: + +/usr/include/bits/timex.h: + +/usr/include/c++/16.1.1/pstl/glue_numeric_defs.h: + +/usr/include/c++/16.1.1/bits/allocated_ptr.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp: + +/usr/include/c++/16.1.1/bits/locale_facets.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/version.h: + +/usr/include/c++/16.1.1/bits/basic_ios.h: + +/usr/include/bits/types/clockid_t.h: + +/usr/include/c++/16.1.1/bits/new_throw.h: + +/usr/include/endian.h: + +/usr/include/stdint.h: + +/usr/include/c++/16.1.1/bits/algorithmfwd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp: + +/usr/include/asm-generic/int-ll64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl: + +/usr/include/c++/16.1.1/bits/std_thread.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl: + +/usr/include/c++/16.1.1/bits/invoke.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h: + +/usr/lib/libstdc++.so: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h: + +/usr/include/locale.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp: + +/usr/include/asm/bitsperlong.h: + +/usr/include/malloc.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp: + +/usr/include/bits/types/FILE.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp: + +/usr/include/c++/16.1.1/bits/basic_ios.tcc: + +/usr/include/bits/cpu-set.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h: + +Release/libktx.so.0.0.0: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h: + +/usr/include/c++/16.1.1/bits/stl_tree.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp: + +/usr/include/c++/16.1.1/bits/quoted_string.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib/vkformat_enum.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder/basisu.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h: + +/usr/include/bits/getopt_core.h: + +/usr/include/bits/xopen_lim.h: + +/usr/include/bits/posix2_lim.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h: + +/usr/include/c++/16.1.1/new: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp: + +tools/imageio/libimageio.a: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp: + +/usr/include/bits/fp-fast.h: + +/usr/lib/libc.so.6: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_types.h: + +/usr/include/c++/16.1.1/cstdio: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h: + +/usr/include/c++/16.1.1/cstddef: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp: + +/usr/include/bits/byteswap.h: + +/usr/include/c++/16.1.1/concepts: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h: + +/usr/include/c++/16.1.1/bits/chrono.h: + +/usr/include/c++/16.1.1/bits/alloc_traits.h: + +/usr/include/c++/16.1.1/bits/new_except.h: + +/usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h: + +/usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h: + +/usr/include/c++/16.1.1/bits/basic_string.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h: + +/usr/include/c++/16.1.1/bits/char_traits.h: + +/usr/include/bits/mathcalls-macros.h: + +/usr/include/c++/16.1.1/bits/unique_ptr.h: + +/usr/include/c++/16.1.1/bits/charconv.h: + +/usr/include/c++/16.1.1/ext/string_conversions.h: + +/usr/include/c++/16.1.1/math.h: + +/usr/include/c++/16.1.1/bits/codecvt.h: + +/usr/lib/crtn.o: + +/usr/include/linux/limits.h: + +/usr/include/c++/16.1.1/bits/cpp_type_traits.h: + +/usr/include/c++/16.1.1/bits/cxxabi_forced.h: + +/usr/include/c++/16.1.1/bits/move.h: + +/usr/include/c++/16.1.1/bits/cxxabi_init_exception.h: + +/usr/include/c++/16.1.1/bits/exception.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl: + +/usr/include/c++/16.1.1/bits/exception_defines.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp: + +/usr/include/strings.h: + +/usr/include/c++/16.1.1/bits/fs_dir.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h: + +/usr/include/c++/16.1.1/bits/fs_ops.h: + +/usr/include/c++/16.1.1/bits/fs_path.h: + +/usr/include/c++/16.1.1/bits/fstream.tcc: + +/usr/include/c++/16.1.1/bits/functional_hash.h: + +/usr/include/bits/types/struct_tm.h: + +/usr/include/c++/16.1.1/bits/hash_bytes.h: + +/usr/include/bits/confname.h: + +/usr/include/c++/16.1.1/bits/hashtable_policy.h: + +/usr/include/c++/16.1.1/bits/ios_base.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h: + +/usr/include/c++/16.1.1/bits/istream.tcc: + +/usr/include/wchar.h: + +/usr/include/c++/16.1.1/bits/locale_conv.h: + +/usr/include/c++/16.1.1/bits/fs_fwd.h: + +/usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc: + +/usr/include/c++/16.1.1/bits/localefwd.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/scapp.h: + +/usr/lib/libm.so: + +/usr/include/c++/16.1.1/bits/nested_exception.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp: + +/usr/include/c++/16.1.1/bits/new_allocator.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/include/c++/16.1.1/bits/random.tcc: + +/usr/include/ctype.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp: + +/usr/include/c++/16.1.1/bits/node_handle.h: + +/usr/include/bits/pthread_stack_min-dynamic.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp: + +/usr/include/c++/16.1.1/bits/ostream.h: + +/usr/include/c++/16.1.1/ostream: + +/usr/include/c++/16.1.1/bits/ostream.tcc: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h: + +/usr/include/c++/16.1.1/bits/parse_numbers.h: + +/usr/include/c++/16.1.1/bits/ptr_traits.h: + +/usr/include/c++/16.1.1/cerrno: + +/usr/include/linux/close_range.h: + +/usr/include/c++/16.1.1/bits/range_access.h: + +/usr/include/c++/16.1.1/bits/refwrap.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_base.h: + +/usr/include/bits/types/__fpos64_t.h: + +/usr/include/c++/16.1.1/bits/requires_hosted.h: + +/usr/include/c++/16.1.1/bits/postypes.h: + +/usr/include/c++/16.1.1/bits/shared_ptr.h: + +/usr/include/linux/falloc.h: + +/usr/include/c++/16.1.1/bits/shared_ptr_atomic.h: + +/usr/include/c++/16.1.1/bits/specfun.h: + +/usr/include/c++/16.1.1/debug/assertions.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h: + +/usr/include/c++/16.1.1/bits/sstream.tcc: + +/usr/include/c++/16.1.1/bits/std_abs.h: + +/usr/include/c++/16.1.1/bits/std_function.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throw.h: + +/usr/include/asm-generic/errno.h: + +/usr/include/sys/single_threaded.h: + +/usr/include/asm/errno.h: + +/usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h: + +/usr/include/c++/16.1.1/bits/stl_algo.h: + +/usr/include/c++/16.1.1/bits/stl_pair.h: + +/usr/include/c++/16.1.1/bits/stl_algobase.h: + +/usr/include/c++/16.1.1/iostream: + +/usr/include/math.h: + +/usr/include/c++/16.1.1/bits/locale_facets.tcc: + +/usr/include/c++/16.1.1/bits/stl_construct.h: + +/usr/include/c++/16.1.1/bits/stl_heap.h: + +/usr/include/c++/16.1.1/bits/stl_iterator.h: + +/usr/include/c++/16.1.1/bits/stl_map.h: + +/usr/include/bits/types/struct_timespec.h: + +/usr/include/c++/16.1.1/bits/streambuf_iterator.h: + +/usr/include/c++/16.1.1/limits: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl: + +/usr/include/c++/16.1.1/bits/stl_multimap.h: + +/usr/include/c++/16.1.1/string: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl: + +/usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl: + +/usr/include/c++/16.1.1/bits/stl_tempbuf.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h: + +/usr/include/bits/uintn-identity.h: + +/usr/include/c++/16.1.1/bits/stl_vector.h: + +/usr/include/bits/types/sigset_t.h: + +/usr/include/c++/16.1.1/bits/stream_iterator.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h: + +/usr/include/c++/16.1.1/bits/string_view.tcc: + +/usr/include/c++/16.1.1/bits/this_thread_sleep.h: + +/usr/include/c++/16.1.1/streambuf: + +/usr/include/c++/16.1.1/bits/uniform_int_dist.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h: + +/usr/include/stdc-predef.h: + +/usr/include/libintl.h: + +/usr/include/c++/16.1.1/bits/unordered_map.h: + +/usr/include/c++/16.1.1/bits/uses_allocator.h: + +/usr/include/linux/errno.h: + +/usr/include/c++/16.1.1/bits/utility.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h: + +/usr/include/c++/16.1.1/bits/vector.tcc: + +/usr/include/c++/16.1.1/bits/version.h: + +/usr/include/linux/openat2.h: + +/usr/include/c++/16.1.1/climits: + +/usr/include/bits/types/timer_t.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h: + +/usr/include/bits/stdlib-bsearch.h: + +/usr/include/c++/16.1.1/clocale: + +/usr/include/c++/16.1.1/compare: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h: + +/usr/include/asm/types.h: + +/usr/include/c++/16.1.1/cstdint: + +/usr/include/memory.h: + +/usr/include/c++/16.1.1/cstdlib: + +/usr/include/c++/16.1.1/bits/align.h: + +/usr/include/c++/16.1.1/cstring: + +/usr/include/sys/select.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp: + +/usr/include/c++/16.1.1/ctime: + +/usr/include/c++/16.1.1/cwctype: + +/usr/include/c++/16.1.1/bits/hashtable.h: + +/usr/include/bits/stdint-least.h: + +/usr/include/c++/16.1.1/exception: + +/usr/include/bits/stdio_lim.h: + +/usr/include/c++/16.1.1/type_traits: + +/usr/include/bits/stdio.h: + +/usr/include/c++/16.1.1/ext/aligned_buffer.h: + +/usr/include/c++/16.1.1/ext/alloc_traits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h: + +/usr/include/c++/16.1.1/ext/atomicity.h: + +/usr/include/c++/16.1.1/ext/concurrence.h: + +/usr/include/c++/16.1.1/ext/numeric_traits.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h: + +/usr/include/c++/16.1.1/ext/type_traits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h: + +/usr/include/c++/16.1.1/filesystem: + +/usr/include/c++/16.1.1/iomanip: + +/usr/include/c++/16.1.1/ios: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h: + +/usr/include/c++/16.1.1/iterator: + +/usr/include/c++/16.1.1/locale: + +/usr/include/c++/16.1.1/map: + +/usr/include/c++/16.1.1/numeric: + +/usr/include/bits/pthreadtypes.h: + +/usr/include/c++/16.1.1/pstl/glue_memory_defs.h: + +/usr/include/c++/16.1.1/pstl/pstl_config.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h: + +/usr/include/c++/16.1.1/random: + +/usr/include/c++/16.1.1/ratio: + +/usr/include/c++/16.1.1/stdexcept: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h: + +/usr/include/bits/libc-header-start.h: + +/usr/include/c++/16.1.1/stdlib.h: + +/usr/include/c++/16.1.1/string_view: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl: + +/usr/include/c++/16.1.1/system_error: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/toktx.cc: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl: + +/usr/include/c++/16.1.1/thread: + +/usr/include/c++/16.1.1/tr1/bessel_function.tcc: + +/usr/include/c++/16.1.1/tr1/riemann_zeta.tcc: + +/usr/include/c++/16.1.1/tr1/beta_function.tcc: + +/usr/include/c++/16.1.1/tr1/ell_integral.tcc: + +/usr/include/c++/16.1.1/tr1/gamma.tcc: + +/usr/include/bits/pthreadtypes-arch.h: + +/usr/include/c++/16.1.1/tr1/poly_hermite.tcc: + +/usr/include/c++/16.1.1/tr1/poly_laguerre.tcc: + +/usr/include/c++/16.1.1/typeinfo: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h: + +/usr/include/c++/16.1.1/tr1/exp_integral.tcc: + +/usr/include/c++/16.1.1/tr1/special_function_util.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h: + +/usr/include/c++/16.1.1/unordered_map: + +/usr/include/c++/16.1.1/vector: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h: + +/usr/include/bits/mathcalls-helper-functions.h: + +/usr/include/c++/16.1.1/cctype: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h: + +/usr/include/c++/16.1.1/bits/streambuf.tcc: + +/usr/include/c++/16.1.1/codecvt: + +/usr/include/fcntl.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h: + +/usr/include/features-time64.h: + +/usr/include/gnu/stubs-64.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h: + +/usr/include/gnu/stubs.h: + +tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o: + +/usr/include/inttypes.h: + +/usr/include/limits.h: + +/usr/include/linux/sched/types.h: + +/usr/include/bits/fp-logb.h: + +/usr/lib/libmvec.so.1: + +/usr/include/linux/stddef.h: + +/usr/include/linux/types.h: + +/usr/include/pthread.h: + +/usr/include/stdlib.h: + +/usr/include/string.h: + +/usr/include/sys/cdefs.h: + +/usr/include/c++/16.1.1/bits/ostream_insert.h: + +/usr/include/sys/types.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h: + +/usr/include/time.h: + +/usr/include/unistd.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h: + +/usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h: + +/usr/include/alloca.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/image.hpp: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h: + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h: diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/compiler_depend.ts b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/compiler_depend.ts new file mode 100644 index 0000000..179a9cb --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for compiler generated dependencies management for toktx. diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/depend.make b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/depend.make new file mode 100644 index 0000000..5b33520 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for toktx. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/flags.make b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/flags.make new file mode 100644 index 0000000..1610981 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# compile CXX with /usr/bin/c++ +CXX_DEFINES = -DKTX_FEATURE_KTX1 -DKTX_FEATURE_KTX2 -DKTX_FEATURE_WRITE + +CXX_INCLUDES = -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/. -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/. -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/transcoder -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu -I/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/astc-encoder/Source -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/dfdutils -isystem /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/lib + +CXX_FLAGS = -msse4.1 -O3 -DNDEBUG -std=gnu++17 -Wall -Wextra -O3 -ffp-contract=off + diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/link.d b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/link.d new file mode 100644 index 0000000..9845ede --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/link.d @@ -0,0 +1,118 @@ +../../Release/toktx: \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o \ + CMakeFiles/toktx.dir/toktx.cc.o \ + ../imageio/libimageio.a \ + ../../Release/libktx.so.0.0.0 \ + ../../libobjUtil.a \ + ../../external/fmt/libfmt.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so \ + /usr/lib/libm.so.6 \ + /usr/lib/libmvec.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so \ + /usr/lib/libc.so.6 \ + /usr/lib/libc_nonshared.a \ + /usr/lib/ld-linux-x86-64.so.2 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1 \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o \ + /usr/lib/ld-linux-x86-64.so.2 + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o: + +CMakeFiles/toktx.dir/toktx.cc.o: + +../imageio/libimageio.a: + +../../Release/libktx.so.0.0.0: + +../../libobjUtil.a: + +../../external/fmt/libfmt.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libstdc++.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libm.so: + +/usr/lib/libm.so.6: + +/usr/lib/libmvec.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic_asneeded.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libatomic.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libc.so: + +/usr/lib/libc.so.6: + +/usr/lib/libc_nonshared.a: + +/usr/lib/ld-linux-x86-64.so.2: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/libgcc_s.so.1: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/libgcc.a: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o: + +/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o: + +/usr/lib/ld-linux-x86-64.so.2: diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/link.txt b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/link.txt new file mode 100644 index 0000000..9613460 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -msse4.1 -O3 -DNDEBUG -O3 -Wl,--dependency-file=CMakeFiles/toktx.dir/link.d CMakeFiles/toktx.dir/toktx.cc.o -o ../../Release/toktx -Wl,-rpath,"\$ORIGIN:\$ORIGIN/../lib" ../imageio/libimageio.a ../../Release/libktx.so.0.0.0 ../../libobjUtil.a ../../external/fmt/libfmt.a diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/progress.make b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/progress.make new file mode 100644 index 0000000..2c3143a --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 94 + diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o new file mode 100644 index 0000000..3fc7e90 Binary files /dev/null and b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o differ diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o.d b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o.d new file mode 100644 index 0000000..0a37359 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o.d @@ -0,0 +1,504 @@ +tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o: \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/toktx.cc \ + /usr/include/stdc-predef.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/scapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/ktxapp.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/stdafx.h \ + /usr/include/assert.h /usr/include/features.h \ + /usr/include/features-time64.h /usr/include/bits/wordsize.h \ + /usr/include/bits/timesize.h /usr/include/sys/cdefs.h \ + /usr/include/bits/long-double.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/stdio.h \ + /usr/include/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stddef.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdarg.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__mbstate_t.h \ + /usr/include/bits/types/__fpos64_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h /usr/include/bits/stdio.h \ + /usr/include/unistd.h /usr/include/bits/posix_opt.h \ + /usr/include/bits/environments.h /usr/include/bits/confname.h \ + /usr/include/bits/getopt_posix.h /usr/include/bits/getopt_core.h \ + /usr/include/bits/unistd_ext.h /usr/include/linux/close_range.h \ + /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/bits/cloexec.h /usr/include/linux/falloc.h \ + /usr/include/linux/openat2.h /usr/include/linux/types.h \ + /usr/include/asm/types.h /usr/include/asm-generic/types.h \ + /usr/include/asm-generic/int-ll64.h /usr/include/asm/bitsperlong.h \ + /usr/include/asm-generic/bitsperlong.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_64.h /usr/include/asm-generic/posix_types.h \ + /usr/include/bits/openat2.h /usr/include/bits/types/struct_timespec.h \ + /usr/include/bits/endian.h /usr/include/bits/endianness.h \ + /usr/include/bits/types/time_t.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/errno.h \ + /usr/include/bits/errno.h /usr/include/linux/errno.h \ + /usr/include/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/bits/types/error_t.h \ + /usr/include/string.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/strings.h \ + /usr/include/c++/16.1.1/algorithm \ + /usr/include/c++/16.1.1/bits/stl_algobase.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++config.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/os_defines.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/cpu_defines.h \ + /usr/include/c++/16.1.1/pstl/pstl_config.h \ + /usr/include/c++/16.1.1/bits/cpp_type_traits.h \ + /usr/include/c++/16.1.1/bits/version.h \ + /usr/include/c++/16.1.1/type_traits \ + /usr/include/c++/16.1.1/ext/type_traits.h \ + /usr/include/c++/16.1.1/ext/numeric_traits.h \ + /usr/include/c++/16.1.1/bits/stl_pair.h \ + /usr/include/c++/16.1.1/bits/move.h \ + /usr/include/c++/16.1.1/bits/utility.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_types.h \ + /usr/include/c++/16.1.1/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/16.1.1/bits/concept_check.h \ + /usr/include/c++/16.1.1/debug/assertions.h \ + /usr/include/c++/16.1.1/bits/stl_iterator.h \ + /usr/include/c++/16.1.1/bits/ptr_traits.h \ + /usr/include/c++/16.1.1/debug/debug.h \ + /usr/include/c++/16.1.1/bits/predefined_ops.h \ + /usr/include/c++/16.1.1/bits/stl_function.h \ + /usr/include/c++/16.1.1/backward/binders.h /usr/include/c++/16.1.1/bit \ + /usr/include/c++/16.1.1/concepts /usr/include/c++/16.1.1/bits/stl_algo.h \ + /usr/include/c++/16.1.1/bits/algorithmfwd.h \ + /usr/include/c++/16.1.1/initializer_list \ + /usr/include/c++/16.1.1/bits/stl_heap.h \ + /usr/include/c++/16.1.1/bits/uniform_int_dist.h \ + /usr/include/c++/16.1.1/bits/stl_tempbuf.h /usr/include/c++/16.1.1/new \ + /usr/include/c++/16.1.1/bits/exception.h \ + /usr/include/c++/16.1.1/bits/new_except.h \ + /usr/include/c++/16.1.1/bits/exception_defines.h \ + /usr/include/c++/16.1.1/bits/stl_construct.h \ + /usr/include/c++/16.1.1/cstdlib /usr/include/stdlib.h \ + /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ + /usr/include/sys/types.h /usr/include/bits/types/clock_t.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/stdint-intn.h /usr/include/endian.h \ + /usr/include/bits/byteswap.h /usr/include/bits/uintn-identity.h \ + /usr/include/sys/select.h /usr/include/bits/select.h \ + /usr/include/bits/types/sigset_t.h /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/alloca.h \ + /usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/16.1.1/bits/std_abs.h \ + /usr/include/c++/16.1.1/pstl/glue_algorithm_defs.h \ + /usr/include/c++/16.1.1/pstl/execution_defs.h \ + /usr/include/c++/16.1.1/iostream \ + /usr/include/c++/16.1.1/bits/requires_hosted.h \ + /usr/include/c++/16.1.1/ostream /usr/include/c++/16.1.1/bits/ostream.h \ + /usr/include/c++/16.1.1/ios /usr/include/c++/16.1.1/iosfwd \ + /usr/include/c++/16.1.1/bits/stringfwd.h \ + /usr/include/c++/16.1.1/bits/memoryfwd.h \ + /usr/include/c++/16.1.1/bits/postypes.h /usr/include/c++/16.1.1/cwchar \ + /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/bits/types/wint_t.h /usr/include/bits/types/mbstate_t.h \ + /usr/include/c++/16.1.1/exception \ + /usr/include/c++/16.1.1/bits/exception_ptr.h \ + /usr/include/c++/16.1.1/bits/cxxabi_init_exception.h \ + /usr/include/c++/16.1.1/typeinfo \ + /usr/include/c++/16.1.1/bits/hash_bytes.h \ + /usr/include/c++/16.1.1/bits/nested_exception.h \ + /usr/include/c++/16.1.1/bits/char_traits.h \ + /usr/include/c++/16.1.1/bits/localefwd.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++locale.h \ + /usr/include/c++/16.1.1/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/16.1.1/cctype \ + /usr/include/ctype.h /usr/include/c++/16.1.1/bits/ios_base.h \ + /usr/include/c++/16.1.1/ext/atomicity.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h /usr/include/bits/sched.h \ + /usr/include/linux/sched/types.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/struct_itimerspec.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/16.1.1/bits/locale_classes.h \ + /usr/include/c++/16.1.1/bits/functexcept.h \ + /usr/include/c++/16.1.1/string /usr/include/c++/16.1.1/bits/allocator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++allocator.h \ + /usr/include/c++/16.1.1/bits/new_allocator.h \ + /usr/include/c++/16.1.1/bits/new_throw.h \ + /usr/include/c++/16.1.1/bits/ostream_insert.h \ + /usr/include/c++/16.1.1/bits/cxxabi_forced.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throw.h \ + /usr/include/c++/16.1.1/bits/stdexcept_throwfwd.h \ + /usr/include/c++/16.1.1/bits/range_access.h \ + /usr/include/c++/16.1.1/bits/erase_if.h \ + /usr/include/c++/16.1.1/bits/basic_string.h \ + /usr/include/c++/16.1.1/ext/alloc_traits.h \ + /usr/include/c++/16.1.1/bits/alloc_traits.h \ + /usr/include/c++/16.1.1/string_view \ + /usr/include/c++/16.1.1/bits/functional_hash.h \ + /usr/include/c++/16.1.1/bits/string_view.tcc \ + /usr/include/c++/16.1.1/ext/string_conversions.h \ + /usr/include/c++/16.1.1/cstdio /usr/include/c++/16.1.1/cerrno \ + /usr/include/c++/16.1.1/bits/charconv.h \ + /usr/include/c++/16.1.1/bits/basic_string.tcc \ + /usr/include/c++/16.1.1/bits/memory_resource.h \ + /usr/include/c++/16.1.1/cstddef \ + /usr/include/c++/16.1.1/bits/uses_allocator.h \ + /usr/include/c++/16.1.1/bits/uses_allocator_args.h \ + /usr/include/c++/16.1.1/tuple /usr/include/c++/16.1.1/bits/invoke.h \ + /usr/include/c++/16.1.1/bits/locale_classes.tcc \ + /usr/include/c++/16.1.1/system_error \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/error_constants.h \ + /usr/include/c++/16.1.1/stdexcept \ + /usr/include/c++/16.1.1/bits/stdexcept_except.h \ + /usr/include/c++/16.1.1/streambuf \ + /usr/include/c++/16.1.1/bits/streambuf.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.h \ + /usr/include/c++/16.1.1/bits/locale_facets.h \ + /usr/include/c++/16.1.1/cwctype /usr/include/wctype.h \ + /usr/include/bits/wctype-wchar.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_base.h \ + /usr/include/c++/16.1.1/bits/streambuf_iterator.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/ctype_inline.h \ + /usr/include/c++/16.1.1/bits/locale_facets.tcc \ + /usr/include/c++/16.1.1/bits/basic_ios.tcc \ + /usr/include/c++/16.1.1/bits/ostream_print.h \ + /usr/include/c++/16.1.1/bits/ostream.tcc /usr/include/c++/16.1.1/istream \ + /usr/include/c++/16.1.1/bits/istream.tcc /usr/include/c++/16.1.1/vector \ + /usr/include/c++/16.1.1/bits/stl_uninitialized.h \ + /usr/include/c++/16.1.1/bits/stl_vector.h \ + /usr/include/c++/16.1.1/bits/stl_bvector.h \ + /usr/include/c++/16.1.1/bits/vector.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/ktx.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/limits.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ + /usr/include/bits/uio_lim.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdbool.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/include/KHR/khr_df.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/stdint.h \ + /usr/include/stdint.h /usr/include/bits/stdint-uintn.h \ + /usr/include/bits/stdint-least.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /usr/include/c++/16.1.1/sstream /usr/include/c++/16.1.1/bits/sstream.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/platform_utils.h \ + /usr/include/c++/16.1.1/memory \ + /usr/include/c++/16.1.1/bits/stl_raw_storage_iter.h \ + /usr/include/c++/16.1.1/bits/align.h \ + /usr/include/c++/16.1.1/bits/unique_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_base.h \ + /usr/include/c++/16.1.1/bits/allocated_ptr.h \ + /usr/include/c++/16.1.1/bits/refwrap.h \ + /usr/include/c++/16.1.1/ext/aligned_buffer.h \ + /usr/include/c++/16.1.1/ext/concurrence.h \ + /usr/include/c++/16.1.1/bits/shared_ptr_atomic.h \ + /usr/include/c++/16.1.1/bits/atomic_base.h \ + /usr/include/c++/16.1.1/bits/atomic_lockfree_defines.h \ + /usr/include/c++/16.1.1/backward/auto_ptr.h \ + /usr/include/c++/16.1.1/pstl/glue_memory_defs.h \ + /usr/include/c++/16.1.1/thread /usr/include/c++/16.1.1/bits/std_thread.h \ + /usr/include/c++/16.1.1/bits/this_thread_sleep.h \ + /usr/include/c++/16.1.1/bits/chrono.h /usr/include/c++/16.1.1/ratio \ + /usr/include/c++/16.1.1/cstdint /usr/include/c++/16.1.1/limits \ + /usr/include/c++/16.1.1/ctime \ + /usr/include/c++/16.1.1/bits/parse_numbers.h \ + /usr/include/c++/16.1.1/unordered_map \ + /usr/include/c++/16.1.1/bits/unordered_map.h \ + /usr/include/c++/16.1.1/bits/hashtable.h \ + /usr/include/c++/16.1.1/bits/hashtable_policy.h \ + /usr/include/c++/16.1.1/bits/enable_special_members.h \ + /usr/include/c++/16.1.1/bits/node_handle.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/zstd/zstd.h \ + /usr/include/c++/16.1.1/cstring /usr/include/c++/16.1.1/filesystem \ + /usr/include/c++/16.1.1/bits/fs_fwd.h \ + /usr/include/c++/16.1.1/bits/fs_path.h /usr/include/c++/16.1.1/locale \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/time_members.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/messages_members.h \ + /usr/include/libintl.h /usr/include/c++/16.1.1/bits/codecvt.h \ + /usr/include/c++/16.1.1/bits/locale_facets_nonio.tcc \ + /usr/include/c++/16.1.1/bits/locale_conv.h \ + /usr/include/c++/16.1.1/iomanip \ + /usr/include/c++/16.1.1/bits/quoted_string.h \ + /usr/include/c++/16.1.1/codecvt /usr/include/c++/16.1.1/bits/fs_dir.h \ + /usr/include/c++/16.1.1/bits/fs_ops.h /usr/include/inttypes.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/GL/glcorearb.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/KHR/khrplatform.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/../../lib/vkformat_enum.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/argparser.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/version.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./image.hpp \ + /usr/include/c++/16.1.1/array /usr/include/c++/16.1.1/compare \ + /usr/include/c++/16.1.1/cmath /usr/include/math.h \ + /usr/include/bits/math-vector.h /usr/include/bits/libm-simd-decl-stubs.h \ + /usr/include/bits/flt-eval-method.h /usr/include/bits/fp-logb.h \ + /usr/include/bits/fp-fast.h /usr/include/bits/mathcalls-macros.h \ + /usr/include/bits/mathcalls-helper-functions.h \ + /usr/include/bits/mathcalls.h /usr/include/bits/mathcalls-narrow.h \ + /usr/include/bits/iscanonical.h /usr/include/c++/16.1.1/bits/specfun.h \ + /usr/include/c++/16.1.1/tr1/gamma.tcc \ + /usr/include/c++/16.1.1/tr1/special_function_util.h \ + /usr/include/c++/16.1.1/tr1/bessel_function.tcc \ + /usr/include/c++/16.1.1/tr1/beta_function.tcc \ + /usr/include/c++/16.1.1/tr1/ell_integral.tcc \ + /usr/include/c++/16.1.1/tr1/exp_integral.tcc \ + /usr/include/c++/16.1.1/tr1/hypergeometric.tcc \ + /usr/include/c++/16.1.1/tr1/legendre_function.tcc \ + /usr/include/c++/16.1.1/tr1/modified_bessel_func.tcc \ + /usr/include/c++/16.1.1/tr1/poly_hermite.tcc \ + /usr/include/c++/16.1.1/tr1/poly_laguerre.tcc \ + /usr/include/c++/16.1.1/tr1/riemann_zeta.tcc \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/format.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/fmt/include/fmt/base.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/fwd.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_int.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/setup.hpp \ + /usr/include/c++/16.1.1/cassert \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/platform.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/smmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/emmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mm_malloc.h \ + /usr/include/c++/16.1.1/stdlib.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/popcntintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_float.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/precision.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat2x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat3x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x2.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x3.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_mat4x4_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_vector_relational_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_vectorize.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_exponential_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/exponential.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_common_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/common.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/immintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/x86gprintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/ia32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/adxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/bmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cldemoteintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clflushoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clwbintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/clzerointrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/cmpccxaddintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/enqcmdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fxsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lzcntintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/lwpintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movdirintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/mwaitxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pconfigintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/pkuintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/raointintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rdseedintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/rtmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/serializeintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sgxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tbmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/tsxldtrkintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/uintrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/waitpkgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wbnoinvdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavecintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsaveoptintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xsavesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/xtestintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/hresetintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/usermsrintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/wmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxvnniint16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512cdintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512dqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vlbwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vldqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512ifmavlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmiintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vbmi2vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vnnivlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vpopcntdqvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bitalgvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512vp2intersectvlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512fp16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/shaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm3intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sha512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/sm4intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/fmaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/f16cintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/gfniintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vaesintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/vpclmulqdqintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16vlintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avxneconvertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtileintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxint8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxbf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxcomplexintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxavx512intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxtf32intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp8intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/prfchwintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/keylockerintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxfp16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2mediaintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2convertintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2bf16intrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2satcvtintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2minmaxintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx10_2copyintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/movrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/amxmovrsintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmintrin.h \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/avx512bmmvlintrin.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_geometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/geometric.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_matrix_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/matrix.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/constants.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_trigonometric_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/exponential.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/quaternion_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/glm.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/_fixes.hpp \ + /usr/include/c++/16.1.1/climits /usr/include/c++/16.1.1/cfloat \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include/float.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/common.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/type_half.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_packing_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/matrix.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/vector_relational.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.hpp \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/detail/func_integer_simd.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/simd/integer.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/vec1.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/type_precision.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/other_include/glm/gtc/packing.inl \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio_utility.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/utils/unused.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu.h \ + /usr/include/c++/16.1.1/math.h /usr/include/memory.h \ + /usr/include/c++/16.1.1/functional \ + /usr/include/c++/16.1.1/bits/std_function.h \ + /usr/include/c++/16.1.1/iterator \ + /usr/include/c++/16.1.1/bits/stream_iterator.h \ + /usr/include/c++/16.1.1/random /usr/include/c++/16.1.1/bits/random.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/opt_random.h \ + /usr/include/c++/16.1.1/bits/random.tcc /usr/include/c++/16.1.1/numeric \ + /usr/include/c++/16.1.1/bits/stl_numeric.h \ + /usr/include/c++/16.1.1/pstl/glue_numeric_defs.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/../transcoder/basisu_containers.h \ + /usr/include/malloc.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/external/basisu/encoder/basisu_resampler_filters.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./imageio.h \ + /usr/include/c++/16.1.1/fstream \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/basic_file.h \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu/bits/c++io.h \ + /usr/include/c++/16.1.1/bits/fstream.tcc /usr/include/c++/16.1.1/map \ + /usr/include/c++/16.1.1/bits/stl_tree.h \ + /usr/include/c++/16.1.1/bits/stl_map.h \ + /usr/include/c++/16.1.1/bits/stl_multimap.h \ + /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/imageio/./formatdesc.h diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/DependInfo.cmake b/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/DependInfo.cmake new file mode 100644 index 0000000..29b95a5 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/DependInfo.cmake @@ -0,0 +1,22 @@ + +# Consider dependencies only in project. +set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF) + +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) + +# The set of dependency files which are needed: +set(CMAKE_DEPENDS_DEPENDENCY_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES + ) + +# Targets to which this target links which contain Fortran sources. +set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/build.make b/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/build.make new file mode 100644 index 0000000..19864b2 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/build.make @@ -0,0 +1,94 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +# Utility rule file for toktx_version. + +# Include any custom commands dependencies for this target. +include tools/toktx/CMakeFiles/toktx_version.dir/compiler_depend.make + +# Include the progress variables for this target. +include tools/toktx/CMakeFiles/toktx_version.dir/progress.make + +tools/toktx/CMakeFiles/toktx_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/version.h + +/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/version.h: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --blue --bold --progress-dir=/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/version.h" + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx && scripts/mkversion -v exitcode-128-NOTFOUND -o version.h tools/toktx + +tools/toktx/CMakeFiles/toktx_version.dir/codegen: +.PHONY : tools/toktx/CMakeFiles/toktx_version.dir/codegen + +toktx_version: tools/toktx/CMakeFiles/toktx_version +toktx_version: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/version.h +toktx_version: tools/toktx/CMakeFiles/toktx_version.dir/build.make +.PHONY : toktx_version + +# Rule to build all files generated by this target. +tools/toktx/CMakeFiles/toktx_version.dir/build: toktx_version +.PHONY : tools/toktx/CMakeFiles/toktx_version.dir/build + +tools/toktx/CMakeFiles/toktx_version.dir/clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx && $(CMAKE_COMMAND) -P CMakeFiles/toktx_version.dir/cmake_clean.cmake +.PHONY : tools/toktx/CMakeFiles/toktx_version.dir/clean + +tools/toktx/CMakeFiles/toktx_version.dir/depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/abdelrahman/Sources/programming/how-to-vulkan/ktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/DependInfo.cmake "--color=$(COLOR)" toktx_version +.PHONY : tools/toktx/CMakeFiles/toktx_version.dir/depend + diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/cmake_clean.cmake b/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/cmake_clean.cmake new file mode 100644 index 0000000..0de3758 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx/version.h" + "CMakeFiles/toktx_version" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/toktx_version.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/compiler_depend.make b/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/compiler_depend.make new file mode 100644 index 0000000..f7016d0 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/compiler_depend.make @@ -0,0 +1,2 @@ +# Empty custom commands generated dependencies file for toktx_version. +# This may be replaced when dependencies are built. diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/compiler_depend.ts b/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/compiler_depend.ts new file mode 100644 index 0000000..6e1131f --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/compiler_depend.ts @@ -0,0 +1,2 @@ +# CMAKE generated file: DO NOT EDIT! +# Timestamp file for custom commands dependencies management for toktx_version. diff --git a/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/progress.make b/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/progress.make new file mode 100644 index 0000000..e7ca302 --- /dev/null +++ b/ktx/build/tools/toktx/CMakeFiles/toktx_version.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 95 + diff --git a/ktx/build/tools/toktx/CTestTestfile.cmake b/ktx/build/tools/toktx/CTestTestfile.cmake new file mode 100644 index 0000000..fd458e8 --- /dev/null +++ b/ktx/build/tools/toktx/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx +# Build directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/ktx/build/tools/toktx/Makefile b/ktx/build/tools/toktx/Makefile new file mode 100644 index 0000000..b6cef03 --- /dev/null +++ b/ktx/build/tools/toktx/Makefile @@ -0,0 +1,279 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 4.3 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Run CPack packaging tool for source..." + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && /usr/bin/cpack --config ./CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..." + /usr/bin/ctest $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..." + /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"dev\" \"library\" \"tools\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx//CMakeFiles/progress.marks + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/toktx/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/toktx/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/toktx/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/toktx/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tools/toktx/CMakeFiles/toktx.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/toktx/CMakeFiles/toktx.dir/rule +.PHONY : tools/toktx/CMakeFiles/toktx.dir/rule + +# Convenience name for target. +toktx: tools/toktx/CMakeFiles/toktx.dir/rule +.PHONY : toktx + +# fast build rule for target. +toktx/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx.dir/build.make tools/toktx/CMakeFiles/toktx.dir/build +.PHONY : toktx/fast + +# Convenience name for target. +tools/toktx/CMakeFiles/toktx_version.dir/rule: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tools/toktx/CMakeFiles/toktx_version.dir/rule +.PHONY : tools/toktx/CMakeFiles/toktx_version.dir/rule + +# Convenience name for target. +toktx_version: tools/toktx/CMakeFiles/toktx_version.dir/rule +.PHONY : toktx_version + +# fast build rule for target. +toktx_version/fast: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx_version.dir/build.make tools/toktx/CMakeFiles/toktx_version.dir/build +.PHONY : toktx_version/fast + +toktx.o: toktx.cc.o +.PHONY : toktx.o + +# target to build an object file +toktx.cc.o: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx.dir/build.make tools/toktx/CMakeFiles/toktx.dir/toktx.cc.o +.PHONY : toktx.cc.o + +toktx.i: toktx.cc.i +.PHONY : toktx.i + +# target to preprocess a source file +toktx.cc.i: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx.dir/build.make tools/toktx/CMakeFiles/toktx.dir/toktx.cc.i +.PHONY : toktx.cc.i + +toktx.s: toktx.cc.s +.PHONY : toktx.s + +# target to generate assembly for a file +toktx.cc.s: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(MAKE) $(MAKESILENT) -f tools/toktx/CMakeFiles/toktx.dir/build.make tools/toktx/CMakeFiles/toktx.dir/toktx.cc.s +.PHONY : toktx.cc.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... toktx_version" + @echo "... toktx" + @echo "... toktx.o" + @echo "... toktx.i" + @echo "... toktx.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ktx/build/tools/toktx/cmake_install.cmake b/ktx/build/tools/toktx/cmake_install.cmake new file mode 100644 index 0000000..02f52be --- /dev/null +++ b/ktx/build/tools/toktx/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/abdelrahman/Sources/programming/how-to-vulkan/ktx/tools/toktx + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/home/abdelrahman/Sources/programming/how-to-vulkan/vendor") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/abdelrahman/Sources/programming/how-to-vulkan/ktx/build/tools/toktx/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/ktx/cmake/KtxConfig.cmake b/ktx/cmake/KtxConfig.cmake new file mode 100644 index 0000000..6386ba2 --- /dev/null +++ b/ktx/cmake/KtxConfig.cmake @@ -0,0 +1,7 @@ +# Copyright 2015-2020 The Khronos Group Inc. +# SPDX-License-Identifier: Apache-2.0 + +# include(CMakeFindDependencyMacro) +# find_dependency() + +include("${CMAKE_CURRENT_LIST_DIR}/KtxTargets.cmake") diff --git a/ktx/cmake/License.rtf b/ktx/cmake/License.rtf new file mode 100644 index 0000000..bbb8a5c --- /dev/null +++ b/ktx/cmake/License.rtf @@ -0,0 +1,19 @@ +{\rtf1\ansi\ansicpg1252\cocoartf2822 +\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +{\*\expandedcolortbl;;\cssrgb\c0\c0\c0;} +\paperw11900\paperh16840\margl1440\margr1440\vieww10020\viewh19580\viewkind0 +\deftab720 +\pard\pardeftab720\partightenfactor0 + +\f0\fs26 \cf2 \expnd0\expndtw0\kerning0 +Copyright 2010-2020 The Khronos Group Inc.\ +SPDX-License-Identifier: Apache-2.0\ +\ +This is open source software. The majority of the source is licensed under {\field{\*\fldinst{HYPERLINK "http://www.apache.org/licenses/LICENSE-2.0"}}{\fldrslt Apache 2.0.}} Follow the link for the full license text. Exceptions and full details of contributors are listed in {\field{\*\fldinst{HYPERLINK "https://github.com/KhronosGroup/KTX-Software/blob/master/LICENSE.md"}}{\fldrslt LICENSE.md}} in the KTX-Software repository.\ +\ +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 {\field{\*\fldinst{HYPERLINK "http://www.apache.org/licenses/LICENSE-2.0"}}{\fldrslt License}} for the specific language governing permissions and limitations under the License.\ +\pard\pardeftab720\sa140\partightenfactor0 +\cf2 \ +\pard\pardeftab720\sa280\partightenfactor0 +\cf2 libktx is the work of Mark Callow based on work by Georg Kolling and Jacob Str\'f6m with contributions borrowed from Troy Hanson, Johannes van Waveren, Lode Vandevenne and Rich Geldreich. The KTX tool suite is the work of RasterGrid Kft. The legacy tools are the work of Mark Callow. The CMake-based build setup used to produce this installer is the work of Andreas Atteneder.} \ No newline at end of file diff --git a/ktx/cmake/License.rtf.license b/ktx/cmake/License.rtf.license new file mode 100644 index 0000000..e2a95f9 --- /dev/null +++ b/ktx/cmake/License.rtf.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2010-2020 The Khronos Group Inc. +SPDX-License-Identifier: Apache-2.0 diff --git a/ktx/cmake/ReadMe.rtf b/ktx/cmake/ReadMe.rtf new file mode 100644 index 0000000..7e8266a --- /dev/null +++ b/ktx/cmake/ReadMe.rtf @@ -0,0 +1,43 @@ +{\rtf1\ansi\ansicpg1252\cocoartf2822 +\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;\f1\fnil\fcharset0 LucidaGrande;\f2\fnil\fcharset0 HelveticaNeue-Italic; +\f3\fnil\fcharset0 HelveticaNeue-Bold;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +{\*\expandedcolortbl;;\cssrgb\c0\c0\c0\cname textColor;} +{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid1\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid2\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid1} +{\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{square\}}{\leveltext\leveltemplateid101\'01\uc0\u9642 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid102\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid2}} +{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}} +\paperw11900\paperh16840\margl1440\margr1440\vieww19120\viewh13180\viewkind0 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 + +\f0\fs26 \cf2 This will install the following:\ +\ +\pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\pardirnatural\partightenfactor0 + +\f1 \cf2 \uc0\u9642 +\f0 ktx - Unified front end for the KTX tool suite:\ +\pard\tx940\tx1440\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li1440\fi-1440\pardirnatural\partightenfactor0 +\ls1\ilvl1\cf2 {\listtext \uc0\u8259 }create - Create KTX v2 files.\ +{\listtext \uc0\u8259 }compare - Compare KTX v2 files.\ +{\listtext \uc0\u8259 }deflate - Apply Zstd or ZLIB compression to a KTX v2 file.\ +{\listtext \uc0\u8259 }encode - Encode a KTX v2 file to Basis Universal or ASTC.\ +{\listtext \uc0\u8259 }extract - Extract an image from a KTX v2 file.\ +{\listtext \uc0\u8259 }info - Display info about a KTX file.\ +{\listtext \uc0\u8259 }transcode - Transcode a KTX v2 file.\ +{\listtext \uc0\u8259 }validate - Validate a KTX v2 file.\ +\pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\pardirnatural\partightenfactor0 + +\f1 \cf2 \uc0\u9642 +\f0 Legacy tools which will be removed in the next release:\ +\pard\tx940\tx1440\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li1440\fi-1440\pardirnatural\partightenfactor0 +\ls2\ilvl1\cf2 {\listtext \uc0\u8259 }ktx2check - Check KTX v2 files for validity.\ +{\listtext \uc0\u8259 }ktxinfo - Print info about a KTX file in human-readable form.\ +{\listtext \uc0\u8259 }ktx2ktx2 - Convert a KTX v1 file to a KTX v2 file.\ +{\listtext \uc0\u8259 }ktxsc - Supercompress a KTX v2 file.\ +{\listtext \uc0\u8259 }toktx - Create a KTX v1 or v2 file from .jpg, .png or Netpbm images.\ +\pard\tx566\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 +\cf2 \ +By clicking the +\f2\i Customize +\f0\i0 button at the bottom of the +\f3\b Installation Type +\f0\b0 screen you can add installation of the resources needed for developing applications using the KTX library.} \ No newline at end of file diff --git a/ktx/cmake/ReadMe.txt b/ktx/cmake/ReadMe.txt new file mode 100644 index 0000000..e34b90f --- /dev/null +++ b/ktx/cmake/ReadMe.txt @@ -0,0 +1,12 @@ +Copyright 2015-2020 The Khronos Group Inc. +SPDX-License-Identifier: Apache-2.0 + +This will install the following KTX tools along with libktx: + +- ktx2check - Check KTX v2 files for validity. +- ktxinfo - Print info about a KTX file in human-readable form. +- ktx2ktx2 - Convert a KTX v1 file to a KTX v2 file. +- ktxsc - Supercompress a KTX v2 file. +- toktx - Create a KTX v1 or v2 file from .jpg, .png or Netpbm images. + +It also installs the header files for development. diff --git a/ktx/cmake/Welcome.rtf b/ktx/cmake/Welcome.rtf new file mode 100644 index 0000000..d4bd946 --- /dev/null +++ b/ktx/cmake/Welcome.rtf @@ -0,0 +1,8 @@ +{\rtf1\ansi\ansicpg1252\cocoartf2513 +\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0 +\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 + +\f0\fs26 \cf0 This program will guide you through installation of the KTX tools and the optional KTX development resources on your system.} \ No newline at end of file diff --git a/ktx/cmake/codesign.cmake b/ktx/cmake/codesign.cmake new file mode 100644 index 0000000..4d72ff6 --- /dev/null +++ b/ktx/cmake/codesign.cmake @@ -0,0 +1,160 @@ +# Copyright 2020 Andreas Atteneder +# SPDX-License-Identifier: Apache-2.0 + +# Macro for setting up code signing on targets +macro (set_code_sign target) + if(APPLE) + set_target_properties(${target} PROPERTIES + XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${XCODE_CODE_SIGN_IDENTITY}" + XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "${XCODE_DEVELOPMENT_TEAM}" + XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--timestamp" + XCODE_ATTRIBUTE_CODE_SIGN_INJECT_BASE_ENTITLEMENTS $,YES,NO> + ) + if(IOS) + set(set_pps FALSE) + if(${ARGC} EQUAL 1) + set(set_pps TRUE) + elseif (NOT ${ARGV1} STREQUAL "NOPPS") + set(set_pps TRUE) + endif() + if (${set_pps}) + set_property(TARGET ${target} + PROPERTY XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER ${XCODE_PROVISIONING_PROFILE_SPECIFIER} + ) + endif() + unset(set_pps) + endif() + endif() + + if(WIN32 AND CODE_SIGN_KEY_VAULT) + configure_windows_sign_params() + if(SIGN_PARAMS) + add_custom_command( TARGET ${target} + POST_BUILD + COMMAND ${signtool_EXECUTABLE} sign ${SIGN_PARAMS} $ + VERBATIM + ) + endif() + endif() +endmacro (set_code_sign) + +function(configure_windows_sign_params) + if(NOT SIGN_PARAMS) + if(CODE_SIGN_KEY_VAULT STREQUAL "Azure") + # Use EV certificate in Azure key vault + find_program(signtool_EXECUTABLE azuresigntool REQUIRED) + if(signtool_EXECUTABLE) + configure_azuresigntool_params() + endif() + else() + # Use standard OV certificate in local certificate store. + find_package(signtool REQUIRED) + if(signtool_EXECUTABLE) + configure_signtool_params() + endif() + endif() + set(SIGN_PARAMS ${SIGN_PARAMS} PARENT_SCOPE) + endif() +endfunction() + +function(configure_azuresigntool_params) + if(NOT SIGN_PARAMS) + foreach(param AZURE_KEY_VAULT_CERTIFICATE AZURE_KEY_VAULT_URL AZURE_KEY_VAULT_CLIENT_ID AZURE_KEY_VAULT_CLIENT_SECRET AZURE_KEY_VAULT_TENANT_ID) + if(NOT ${param}) + message(SEND_ERROR "CODE_SIGN_KEY_VAULT set to \"Azure\" but necessary parameter ${param} is not set.") + endif() + endforeach() + configure_common_params() + set(SIGN_PARAMS ${SIGN_PARAMS} + --azure-key-vault-url ${AZURE_KEY_VAULT_URL} + --azure-key-vault-client-id ${AZURE_KEY_VAULT_CLIENT_ID} + --azure-key-vault-client-secret ${AZURE_KEY_VAULT_CLIENT_SECRET} + --azure-key-vault-tenant-id ${AZURE_KEY_VAULT_TENANT_ID} + --azure-key-vault-certificate ${AZURE_KEY_VAULT_CERTIFICATE} + #--verbose # Include additional output. + #--quiet # Do not print any output to the console. + PARENT_SCOPE) + endif() +endfunction() + +function(configure_signtool_params) + if(NOT SIGN_PARAMS) + # User store is preferred because importing the cert. does not need + # admin elevation. However problems were encountered on Appveyor, + # see comment at begin_build phase in .appveyor.yml, so use of local + # machine store is also supported. + if(CODE_SIGN_KEY_VAULT STREQUAL Machine) + # Search in local machine certificate store + set(store "/sm") + elseif(CODE_SIGN_KEY_VAULT STREQUAL User) + # Search in user's certificate store. + unset(store) + else() + message(FATAL_ERROR "Unrecognized CODE_SIGN_KEY_VAULT value \"${CODE_SIGN_KEY_VAULT}\"") + endif() + if(LOCAL_KEY_VAULT_CERTIFICATE_THUMBPRINT) + set(certopt /sha1) + set(certid ${LOCAL_KEY_VAULT_CERTIFICATE_THUMBPRINT}) + elseif(LOCAL_KEY_VAULT_SIGNING_IDENTITY) + set(certopt /n) + set(certid ${LOCAL_KEY_VAULT_SIGNING_IDENTITY}) + else() + message(FATAL_ERROR "CODE_SIGN_KEY_VAULT set to ${CODE_SIGN_KEY_VAULT} but neither LOCAL_KEY_VAULT_CERTIFICATE_THUMBPRINT nor LOCAL_KEY_VAULT_SIGNING_IDENTITY is set.") + endif() + configure_common_params() + set(SIGN_PARAMS ${SIGN_PARAMS} ${store} ${certopt} ${certid} + #/debug + PARENT_SCOPE) + endif() +endfunction() + +function(configure_common_params) + if (CODE_SIGN_TIMESTAMP_URL) + set(SIGN_PARAMS ${SIGN_PARAMS} + -fd sha256 + -td sha256 -tr ${CODE_SIGN_TIMESTAMP_URL} + -d KTX-Software -du https://github.com/KhronosGroup/KTX-Software + PARENT_SCOPE) + else() + message(FATAL_ERROR "CODE_SIGN_KEY_VAULT is set but CODE_SIGN_TIMESTAMP_URL is not set.") + endif() +endfunction() + +function(set_nsis_installer_codesign_cmd) + # To make calls to the above macro and this order independent ... + if(WIN32 AND CODE_SIGN_KEY_VAULT) + if(NOT SIGN_PARAMS) + configure_windows_sign_params() + endif() + if(SIGN_PARAMS) + # CPACK_NSIS_FINALIZE_CMD is a variable whose value is to be substituted + # into the !finalize and !uninstfinalize commands in + # cmake/modules/NSIS.template.in. This variable is ours. It is not a + # standard CPACK variable. The name MUST start with CPACK otherwise + # it will not be defined when cpack runs its configure_file step. + foreach(param IN LISTS SIGN_PARAMS) + # Quote the parameters because at least one of them, + # WIN_CODE_SIGN_IDENTITY, has spaces. It is easier to quote + # all of them than determine which have spaces. + # + # Insane escaping is needed due to the 2-step process used to + # configure the final output. First cpack creates CPackConfig.cmake + # in which the value set here appears, inside quotes, as the + # argument to a cmake `set` command. That variable's value + # is then substituted into the output. + string(APPEND NSIS_SIGN_PARAMS "\\\"${param}\\\" ") + endforeach() + + # Note 1: cpack/NSIS does not show any output when running signtool, + # whether it succeeds or fails. + # + # Note 2: Do not move the %1 to NSIS.template.in. We need an empty + # command there when we aren't signing. %1 is replaced by the name + # of the installer or uninstaller during NSIS compilation. + set(CPACK_NSIS_FINALIZE_CMD "\\\"${signtool_EXECUTABLE}\\\" sign ${NSIS_SIGN_PARAMS} %1" + PARENT_SCOPE + ) + unset(NSIS_SIGN_PARAMS) + endif() + endif() +endfunction() diff --git a/ktx/cmake/cputypetest.cmake b/ktx/cmake/cputypetest.cmake new file mode 100644 index 0000000..d839d2d --- /dev/null +++ b/ktx/cmake/cputypetest.cmake @@ -0,0 +1,170 @@ +# Copyright 2016, Simon Werta (@webmaster128). +# SPDX-License-Identifier: Apache-2.0 + +set(cputypetest_code " +// +// https://gist.github.com/webmaster128/e08067641df1dd784eb195282fd0912f +// +// The resulting values must not be defined as macros, which +// happens e.g. for 'i386', which is a macro in clang. +// For safety reasons, we undefine everything we output later +// +// For CMake literal compatibility, this file must have no double quotes +// + +#if defined(__x86_64__) || defined(_M_X64) +x86_64 +#elif defined(i386) || defined(__i386__) || defined(__i386) || defined(_M_IX86) +x86_32 +#elif defined(__ARM_ARCH_2__) +armv2 +#elif defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__) +armv3 +#elif defined(__ARM_ARCH_4T__) || defined(__TARGET_ARM_4T) +armv4T +#elif defined(__ARM_ARCH_5_) || defined(__ARM_ARCH_5E_) +ARM5 +#elif defined(__ARM_ARCH_6T2_) || defined(__ARM_ARCH_6T2_) +armv6T2 +#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) +armv6 +#elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) +armv7 +#elif defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) +armv7A +#elif defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) +armv7R +#elif defined(__ARM_ARCH_7M__) +armv7M +#elif defined(__ARM_ARCH_7S__) +armv7S +#elif defined(__aarch64__) || defined(_M_ARM64) +arm64 +#elif defined(mips) || defined(__mips__) || defined(__mips) +mips +#elif defined(__sh__) +superh +#elif defined(__powerpc) || defined(__powerpc__) || defined(__powerpc64__) || defined(__POWERPC__) || defined(__ppc__) || defined(__PPC__) || defined(_ARCH_PPC) +powerpc +#elif defined(__PPC64__) || defined(__ppc64__) || defined(_ARCH_PPC64) +powerpc64 +#elif defined(__sparc__) || defined(__sparc) +sparc +#elif defined(__m68k__) +m68k +#elif defined __EMSCRIPTEN__ +wasm +#else + #error Unsupported cpu +#endif + +") + +file(WRITE "${CMAKE_BINARY_DIR}/cputypetest.c" "${cputypetest_code}") + +cmake_policy(SET CMP0054 NEW) + +function(set_target_processor_type out) + if(ANDROID_ABI AND "${ANDROID_ABI}" STREQUAL "armeabi-v7a") + set(${out} armv7 PARENT_SCOPE) + elseif(ANDROID_ABI AND "${ANDROID_ABI}" STREQUAL "arm64-v8a") + set(${out} arm64 PARENT_SCOPE) + elseif(ANDROID_ABI AND "${ANDROID_ABI}" STREQUAL "x86") + set(${out} x86 PARENT_SCOPE) + elseif(ANDROID_ABI AND "${ANDROID_ABI}" STREQUAL "x86_64") + set(${out} x86_64 PARENT_SCOPE) + + else() + if(MSVC) # MSVC is true for all msvc-style compilers, including clang-cl + if("${CMAKE_GENERATOR_PLATFORM}" STREQUAL "ARM" OR "${CMAKE_GENERATOR_PLATFORM}" STREQUAL "arm") + set(processor "arm") + elseif("${CMAKE_GENERATOR_PLATFORM}" STREQUAL "ARM64" OR "${CMAKE_GENERATOR_PLATFORM}" STREQUAL "arm64") + set(processor "arm64") + else() + set(C_PREPROCESS ${CMAKE_C_COMPILER} /EP /nologo) + # Versions of MSVC prior to VS2019 have a supporting dll which + # must be found along the search path. MSVC in VS 2019 just + # works. Whether due to not having this supporting dll or using + # a different way to locate it, is unknown. To make earlier + # versions work set the WORKING_DIR to the location of the + # support dll to ensure it is found. + string(REGEX REPLACE "/VC/.*$" "/Common7/IDE" + compiler_support_dir + ${CMAKE_C_COMPILER}) + execute_process( + COMMAND ${C_PREPROCESS} "${CMAKE_BINARY_DIR}/cputypetest.c" + WORKING_DIRECTORY ${compiler_support_dir} + OUTPUT_VARIABLE processor + OUTPUT_STRIP_TRAILING_WHITESPACE + # Specify this to block MSVC's output of the source file name + # so as not to trigger PowerShell's stop-on-error in CI. + # Unfortunately it suppresses all compile errors too hence + # the special case for MSVC. Which was convenient to have + # when we found the issue with earlier versions of VS. + ERROR_QUIET + ) + endif() + else() + # Apple's clang is a single compiler whose target is determined by + # its -arch or --target= options + # defaulting to the processor of the Mac it is running on. CMake does + # not set this directly when generating for Xcode. (I don't know what + # it does when generating makefiles. Therefore, in the Xcode case, + # compiling cputypetest.c with CMAKE_{C,CXX}_COMPILER results in + # processor being set to x86_86 or arm64 depending on the Mac it is + # running on. + # + # When building for iOS, only CMAKE_SYSTEN_NAME is specified during + # configuration. CMake leaves it up to Xcode or to the user passing + # a -sdk argument to xcbuild to make sure the correct + # is set when calling the compiler. + # + # When building for macOS (and possibly for iOS, not tested) the + # user can specify CMAKE_OSX_ARCHITECTURES if they want to compile + # for something different than the current processor. This could be + # set to $(ARCHS_STANDARD) an Xcode build setting whose value in + # recent Xcode versions is "x86_64 arm64" to create universal binaries. + # This is passed to Xcode which calls the compiler twice passing the + # same set of target_definitions each time so in this case we have + # to choose BASISU_SUPPORT_SSE=OFF or the arm64 compile will fail. + # + # The following code reflects all this. + if(APPLE AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") + # Building for iOS, iPadOS, etc. Since we don't care what + # type of ARM processor, arbitrarily set armv8. + # It should be arm64 but there is a check in tests/CMakeLists.txt + # that is dropping loadtests for Apple Silicon arm64. + set(processor armv8) + elseif(APPLE AND CMAKE_OSX_ARCHITECTURES) + string(STRIP "${CMAKE_OSX_ARCHITECTURES}" architectures) + if("${architectures}" STREQUAL "$(ARCHS_STANDARD)") + # Choose arm64 so SSE support is disabled. + set(processor arm64) + elseif("${architectures}" MATCHES "[^ ]+[ ]+[^ ]+") + # Multiple words, choose arm64 so SSE support is disabled. + set(processor arm64) + elseif(APPLE AND "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64") + set(processor x86_64) + elseif(APPLE AND "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") + set(processor arm64) + else() + # Choose arm64 so SSE support is disabled. + set(processor arm64) + endif() + unset(architectures) + else() + # This will distinguish between M1 and Intel Macs + set(C_PREPROCESS ${CMAKE_C_COMPILER} -E -P) + execute_process( + COMMAND ${C_PREPROCESS} "${CMAKE_BINARY_DIR}/cputypetest.c" + OUTPUT_VARIABLE processor + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + endif() + endif() + + string(STRIP "${processor}" processor) + #message(STATUS "*** set_target_processor_type ***: processor is ${processor}") + set(${out} ${processor} PARENT_SCOPE) + endif() +endfunction(set_target_processor_type) diff --git a/ktx/cmake/docs.cmake b/ktx/cmake/docs.cmake new file mode 100644 index 0000000..51be7c0 --- /dev/null +++ b/ktx/cmake/docs.cmake @@ -0,0 +1,275 @@ +# Copyright 2015-2020 The Khronos Group Inc. +# SPDX-License-Identifier: Apache-2.0 + +# dot is optional as missing include dependency graphs and +# inheritance graphs is not a big enough deal to justify +# forcing people to install Graphviz. +find_package(Doxygen REQUIRED OPTIONAL_COMPONENTS dot) +if(NOT DOXYGEN_DOT_EXECUTABLE) + message(NOTICE "dot executable not found so Doxygen will not generate\n" + "include dependency or inheritance graphs in the documentation.\n" + "If you want these graphs, install Graphviz.") +endif() + +set(docdest "${CMAKE_CURRENT_BINARY_DIR}/docs") + +# The torturous Doxygen output settings are a hack +# to workaround a doxygen limitation where it will +# only create the trailing directory of the path +# given in, e.g DOXYGEN_HTML_OUTPUT while enabling +# us to put each sub-document in its own directory of +# the html output. + +# Global +set( DOXYGEN_PROJECT_LOGO icons/ktx_logo_200.png ) +set( DOXYGEN_OUTPUT_DIRECTORY ${docdest}/html) +set( DOXYGEN_OPTIMIZE_OUTPUT_FOR_C YES ) +set( DOXYGEN_EXTRACT_LOCAL_CLASSES NO ) +set( DOXYGEN_HIDE_UNDOC_MEMBERS YES ) +set( DOXYGEN_CASE_SENSE_NAMES YES ) +set( DOXYGEN_SHOW_USED_FILES NO ) +set( DOXYGEN_VERBATIM_HEADERS NO ) +set( DOXYGEN_CLANG_ASSISTED_PARSING NO ) +set( DOXYGEN_ALPHABETICAL_INDEX NO ) +set( DOXYGEN_DISABLE_INDEX YES ) +set( DOXYGEN_DISABLE_INDEX NO ) +set( DOXYGEN_GENERATE_TREEVIEW YES ) +set( DOXYGEN_GENERATE_LATEX NO ) +set( DOXYGEN_GENERATE_HTML YES ) +set( DOXYGEN_GENERATE_MAN YES ) +set( DOXYGEN_MAN_OUTPUT ../man ) +# This is to get timestamps with older versions of doxygen. +# older +set( DOXYGEN_HTML_TIMESTAMP YES ) +set( DOXYGEN_TIMESTAMP YES ) + +function( add_sources target sources ) + # Make ${sources} show up in IDE/project + get_target_property( doc_sources ${target} SOURCES ) + if( NOT doc_sources ) + set( doc_sources "" ) # Clear doc_sources-NOTFOUND value. + endif() + set_target_properties( + ${target} + PROPERTIES + SOURCES "${doc_sources};${sources}" + ) +endfunction() + +function( add_docs_cmake target ) + # Make `docs.cmake` show up in IDE/project + add_sources( ${target} "cmake/docs.cmake" ) +endfunction() + +function( add_docs_cmake_plus target sources ) + # Make `docs.cmake` plus ${sources} show up in IDE/project + add_sources( ${target} "cmake/docs.cmake;${sources}" ) +endfunction() + +# Note very well +# +# These projects and accompanying DOXYGEN_LAYOUT_FILES are carefully crafted +# to provide the illusion of a consistent GUI across all the projects. +# Likely this will be fragile in the face of Doxygen changes. + +# ktx.doc +function( CreateDocLibKTX ) + set( DOXYGEN_PROJECT_NAME "libktx Reference" ) + set( DOXYGEN_ALIASES error=\"\\par Errors\\n\" ) + set( DOXYGEN_LAYOUT_FILE pkgdoc/libktxDoxyLayout.xml ) + set( DOXYGEN_TYPEDEF_HIDES_STRUCT NO ) + set( DOXYGEN_EXCLUDE lib/uthash.h ) + set( DOXYGEN_EXCLUDE_PATTERNS ktxint.h ) + set( DOXYGEN_EXAMPLE_PATH examples lib ) + # This does not hide the scope (class) names in the Modules list + # in the ToC. See https://github.com/doxygen/doxygen/issues/9921. + set( DOXYGEN_HIDE_SCOPE_NAMES YES ) + set( DOXYGEN_HTML_OUTPUT libktx ) + # Order is important here. '_' suffixed prefices must come first + # otherwise the non-suffixed is stripped first leaving just '_'. + set( DOXYGEN_IGNORE_PREFIX KTX_;ktx_;KTX;ktx ) + set( DOXYGEN_MAN_LINKS YES ) + set( DOXYGEN_MACRO_EXPANSION YES ) + set( DOXYGEN_EXPAND_ONLY_PREDEF YES ) + + set( DOXYGEN_PREDEFINED + KTX_DOXYGEN_SKIP + KTX_FEATURE_WRITE + "KTXTEXTURECLASSDEFN=class_id classId\; \\ + struct ktxTexture_vtbl* vtbl\; \\ + struct ktxTexture_vvtbl* vvtbl\; \\ + struct ktxTexture_protected* _protected\; \\ + ktx_bool_t isArray\; \\ + ktx_bool_t isCubemap\; \\ + ktx_bool_t isCompressed\; \\ + ktx_bool_t generateMipmaps\; \\ + ktx_uint32_t baseWidth\; \\ + ktx_uint32_t baseHeight\; \\ + ktx_uint32_t baseDepth\; \\ + ktx_uint32_t numDimensions\; \\ + ktx_uint32_t numLevels\; \\ + ktx_uint32_t numLayers\; \\ + ktx_uint32_t numFaces\; \\ + struct { \\ + ktxOrientationX x\; \\ + ktxOrientationY y\; \\ + ktxOrientationZ z\; \\ + } orientation\; \\ + ktxHashList kvDataHead\; \\ + ktx_uint32_t kvDataLen\; \\ + ktx_uint8_t* kvData\; \\ + ktx_size_t dataSize\; \\ + ktx_uint8_t* pData\;" + ) + #set( DOXYGEN_GENERATE_TAGFILE ${docdest}/libktx.tag ) + + doxygen_add_docs( + libktx.doc + lib/libktx_mainpage.md + include + lib/astc_codec.cpp + lib/basis_encode.cpp + lib/basis_transcode.cpp + lib/miniz_wrapper.cpp + lib/strings.c + lib/gl_funcs.c + lib/glloader.c + lib/hashlist.c + lib/filestream.c + lib/memstream.c + lib/texture.c + lib/texture1.c + lib/texture2.c + lib/vkloader.c + lib/writer1.c + lib/writer2.c + ) + add_docs_cmake_plus( libktx.doc pkgdoc/libktxDoxyLayout.xml ) +endfunction() + +# ktxtools.doc +function( CreateDocTools ) + set( DOXYGEN_PROJECT_NAME "KTX Tools Reference" ) + set( DOXYGEN_FULL_PATH_NAMES NO ) + set( DOXYGEN_ALIASES author=\"\\section AUTHOR\\n\" ) + set( DOXYGEN_LAYOUT_FILE pkgdoc/toolsDoxyLayout.xml ) + set( DOXYGEN_SHOW_FILES NO ) + set( DOXYGEN_FILE_PATTERNS *.cpp ) + set( DOXYGEN_RECURSIVE YES ) + set( DOXYGEN_EXAMPLE_PATH utils tools ) + set( DOXYGEN_HTML_OUTPUT ktxtools ) + set( DOXYGEN_MAN_EXTENSION .1 ) + #set( DOXYGEN_GENERATE_TAGFILE ${docdest}/ktxtools.tag ) + set( DOXYGEN_TAGFILES ${docdest}/ktxpkg.tag=.. ) + + doxygen_add_docs( + tools.doc + tools/ktx/ktx_main.cpp + tools/ktx/command_compare.cpp + tools/ktx/command_create.cpp + tools/ktx/command_deflate.cpp + tools/ktx/command_encode.cpp + tools/ktx/command_extract.cpp + tools/ktx/command_help.cpp + tools/ktx/command_info.cpp + tools/ktx/command_transcode.cpp + tools/ktx/command_validate.cpp + tools/ktx2check/ktx2check.cpp + tools/ktx2ktx2/ktx2ktx2.cpp + tools/ktxinfo/ktxinfo.cpp + tools/ktxsc/ktxsc.cpp + tools/ktxtools_mainpage.md + tools/toktx/toktx.cc + ) + add_docs_cmake_plus( tools.doc pkgdoc/toolsDoxyLayout.xml ) +endfunction() + +# ktxjswrappers.doc +function( CreateDocJSWrappers ) + set( DOXYGEN_PROJECT_NAME "KTX Javascript Wrappers Reference" ) + set( DOXYGEN_FULL_PATH_NAMES NO ) + set( DOXYGEN_ALIASES author=\"\\section AUTHOR\\n\" ) + set( DOXYGEN_LAYOUT_FILE pkgdoc/jswrappersDoxyLayout.xml ) + set( DOXYGEN_SHOW_FILES NO ) + set( DOXYGEN_HTML_OUTPUT ktxjswrappers ) + #set( DOXYGEN_GENERATE_TAGFILE ${docdest}/ktxjswrappers.tag ) + set( DOXYGEN_TAGFILES ${docdest}/ktxpkg.tag=.. ) + + doxygen_add_docs( + jswrappers.doc + interface/js_binding + ) + add_docs_cmake_plus( jswrappers.doc pkgdoc/jswrappersDoxyLayout.xml ) +endfunction() + +# pyktxwrappers.doc +function( CreateDocPyktxWrappers ) + add_custom_command( + TARGET libktx.doc + POST_BUILD + COMMAND + ${CMAKE_COMMAND} -E copy_directory ${KTX_BUILD_DIR}/interface/python_binding/docs/html/pyktx/html ${KTX_BUILD_DIR}/docs/html/pyktx + ) + add_dependencies( libktx.doc pyktx.doc ) +endfunction() + +# ktxpkg.doc +function( CreateDocKTX ) + set( DOXYGEN_PROJECT_NAME "Khronos Texture Software" ) + set( DOXYGEN_ALIASES pversion=\"\\par Package Version\\n\" ) + set( DOXYGEN_LAYOUT_FILE pkgdoc/packageDoxyLayout.xml ) + set( DOXYGEN_EXCLUDE lib/uthash.h ) + set( DOXYGEN_EXCLUDE_PATTERNS ktxint.h ) + set( DOXYGEN_EXAMPLE_PATH lib ) + set( DOXYGEN_GENERATE_TAGFILE ${docdest}/ktxpkg.tag ) + set( DOXYGEN_HTML_HEADER pkgdoc/header.html ) + set( DOXYGEN_HTML_OUTPUT . ) + set( DOXYGEN_MAN_LINKS YES ) + #set( DOXYGEN_TAGFILES ${docdest}/libktx.tag=libktx ${docdest}/ktxtools.tag=ktxtools ) + + doxygen_add_docs( + ktxpkg.doc + pkgdoc/pages.md + LICENSE.md + #RELEASE_NOTES.md + ) + add_docs_cmake_plus( ktxpkg.doc pkgdoc/packageDoxyLayout.xml ) +endfunction() + +CreateDocLibKTX() +CreateDocTools() +CreateDocJSWrappers() +if (KTX_FEATURE_PY) + CreateDocPyktxWrappers() +endif() +CreateDocKTX() + +add_dependencies( libktx.doc ktxpkg.doc ktx_version ) +add_dependencies( jswrappers.doc ktxpkg.doc ) +add_dependencies( tools.doc ktxpkg.doc ) + +# I want to add a dependency on the "package" built-in target. +# Unfortunately CMake does not support adding dependencies to +# built-in targets. See https://gitlab.kitware.com/cmake/cmake/-/issues/8438. +# +# There also seems to be no way to add a dependency for the install commands +# below. Presumably "install(TARGETS ...)" adds a dependency on each target +# but the rest of that command is simply not appropriate for this case. +add_custom_target( all.doc ALL + DEPENDS tools.doc libktx.doc jswrappers.doc +) + +install( + DIRECTORY ${docdest}/html + DESTINATION "${CMAKE_INSTALL_DOCDIR}" + COMPONENT tools +) + +install( + DIRECTORY ${docdest}/man/man1 + ## Omit those, since at the moment they contain a lot of undesired files generated by Doxygen + # ${docdest}/man/man3 + # ${docdest}/man/ktx/man3 + DESTINATION "${CMAKE_INSTALL_MANDIR}" + COMPONENT tools +) diff --git a/ktx/cmake/linux-aarch64-toolchain.cmake b/ktx/cmake/linux-aarch64-toolchain.cmake new file mode 100644 index 0000000..f74153f --- /dev/null +++ b/ktx/cmake/linux-aarch64-toolchain.cmake @@ -0,0 +1,39 @@ +# Copyright 2023 The Khronos Group Inc. +# SPDX-License-Identifier: Apache-2.0 + +# CMake Toolchain file for cross-compiling to aarch64 (arm64) on +# a non-arm64 device running Linux (Ubuntu). +# +# This following packages must be installed for compiling to ARM64: +# sudo apt-get -qq install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu + +###################################################################### +# Nota Bene +# +# Untested. Was under development when Travis-CI made arm64 Ubuntu +# runners available rendering it unneeded. Kept here to preserve the +# learning and in case it becomes useful. +###################################################################### + +# Target operating system name. +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +# Name of C compiler. +set(CMAKE_C_COMPILER "/usr/bin/aarch64-linux-gnu-gcc") +set(CMAKE_CXX_COMPILER "/usr/bin/aarch64-linux-gnu-g++") + +# Where to look for the target environment. (More paths can be added here) +set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu) +#set(CMAKE_SYSROOT /usr/aarch64-linux-gnu) + +# Adjust the default behavior of the FIND_XXX() commands: +# search programs in the host environment only. +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + +# Search headers and libraries in the target environment only. +#set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +#set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +#set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE arm64) diff --git a/ktx/cmake/linux-x86_64-toolchain.cmake b/ktx/cmake/linux-x86_64-toolchain.cmake new file mode 100644 index 0000000..3502496 --- /dev/null +++ b/ktx/cmake/linux-x86_64-toolchain.cmake @@ -0,0 +1,48 @@ +# Copyright 2023 The Khronos Group Inc. +# SPDX-License-Identifier: Apache-2.0 + +# CMake Toolchain file for cross-compiling to x86_64 (amd64) on +# a non-x86_64 device running Linux (Ubuntu). +# +# The following packages must be installed for compiling to x86_64. +# sudo apt-get -qq install gcc-x86-64-linux-gnu g++-x86-64-linux-gnu binutils-x86-64-linux-gnu + +###################################################################### +# Nota Bene +# +# Untested. Was under development when Travis-CI made arm64 Ubuntu +# runners available rendering it unneeded. Kept here to preserve the +# learning and in case it becomes useful. +###################################################################### + +# A note about the platform/architecture naming. +# +# The Ubuntu/Deb packages with the compiler and tools use "x64-64" as +# you can see above. The compiler and tools are named with "x86_64" +# as you will see in the macro settings below. Probably this is done +# to maintain consistency with existing naming conventions for +# packages (no underscores) and tools (use the offical architecture +# name). + +# Target operating system name. +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR x86_64) + +# Name of C compiler. +set(CMAKE_C_COMPILER "/usr/bin/x86_64-linux-gnu-gcc") +set(CMAKE_CXX_COMPILER "/usr/bin/x86_64-linux-gnu-g++") + +# Where to look for the target environment. (More paths can be added here) +set(CMAKE_FIND_ROOT_PATH /usr/x86_64-linux-gnu) +#set(CMAKE_SYSROOT /usr/x86_64-linux-gnu) + +# Adjust the default behavior of the FIND_XXX() commands: +# search programs in the host environment only. +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + +# Search headers and libraries in the target environment only. +#set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +#set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +#set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE amd64) diff --git a/ktx/cmake/mkvk.cmake b/ktx/cmake/mkvk.cmake new file mode 100644 index 0000000..333a784 --- /dev/null +++ b/ktx/cmake/mkvk.cmake @@ -0,0 +1,202 @@ +# Copyright 2015-2020 The Khronos Group Inc. +# SPDX-License-Identifier: Apache-2.0 + +# Code generation scripts that require a Vulkan SDK installation + +# TODO: Rewrite scripts to generate the files from the Vulkan +# registry, vk.xml, in the Vulkan-Docs repo. + +# NOTE: Since this must be explicitly included by setting an option, +# require sought packages. However, in order to give an informative +# error, REQUIRED is not used in the find_* commands. +# +# CAUTION: Outputs of custom commands are deleted during a clean +# operation so these targets result in clean deleting what are normally +# considered source files. There appears to be no easy way to avoid +# this. Since only project developers need to use these targets, and +# only occasionally, this misfeature can be tolerated. + +if (NOT IOS AND NOT ANDROID) +# Not needed as local custom vulkan_core.h is used. Keeping +# in case we go back to the standard one. +# # find_package doesn't find the Vulkan SDK when building for IOS. +# # I haven't investigated why. +# find_package(Vulkan REQUIRED) + + # This cmake file is included from its parent so has the same scope as + # the including file. If we change Vulkan_INCLUDE_DIR, other parts will + # be affected. + set(mkvk_vulkan_include_dir external/dfdutils) +else() + # Skip mkvk. There is no need to use iOS or Android to regenerate + # the files. + return() +endif() + +set(vulkan_header "${mkvk_vulkan_include_dir}/vulkan/vulkan_core.h") + +# CAUTION: On Windows use a version of Perl built for Windows, i.e. not +# one found in Cygwin or MSYS (Git for Windows). This is needed so the +# generated files have the correct the correct CRLF line endings. The ones +# mentioned write LF line endings (possibly related to some Cygwin or MSYS +# installation setting for handling of text files). The Perl scripts, +# unlike the Awk scripts, have not been modified to always write CRLF +# on Windows. +# +# Strawberry Perl via Chocolatey is recommended. +# choco install strawberryperl + +#if(CMAKE_HOST_WIN32 AND NOT CYGWIN_INSTALL_PATH) +# # Git for Windows comes with Perl +# # Trick FindPerl into considering default Git location +# set(CYGWIN_INSTALL_PATH "C:\\Program Files\\Git\\usr") +#endif() + +string(APPEND not_found_error + "not found. " + "This is only needed by project maintainers when regenerating source files. " + "To silence, set KTX_GENERATE_VK_FILES OFF.") +find_package(Perl QUIET) +# Painful. Oh for a way to provide custom error messages for failures. +if(NOT PERL_EXECUTABLE) + message(FATAL_ERROR "Perl executable ${not_found_error}") +endif() + +set(Ruby_FIND_VIRTUALENV FIRST) +find_package(Ruby 3 QUIET) +if(NOT Ruby_EXECUTABLE) + message(FATAL_ERROR "Ruby v3 executable ${not_found_error}") +endif() + +find_path(KTX_SPECIFICATION + NAMES formats.json + PATHS ${PROJECT_SOURCE_DIR}/../KTX-Specification + NO_DEFAULT_PATH) +if(NOT KTX_SPECIFICATION) + message(FATAL_ERROR "KTX-Specification repo clone ${not_found_error}") +endif() + +list(APPEND mkvkformatfiles_input + ${vulkan_header} + scripts/mkvkformatfiles) +list(APPEND mkvkformatfiles_output + "${PROJECT_SOURCE_DIR}/interface/java_binding/src/main/java/org/khronos/ktx/VkFormat.java" + "${PROJECT_SOURCE_DIR}/interface/js_binding/vk_format.inl" + "${PROJECT_SOURCE_DIR}/interface/python_binding/pyktx/vk_format.py" + "${PROJECT_SOURCE_DIR}/lib/vkformat_enum.h" + "${PROJECT_SOURCE_DIR}/lib/vkformat_typesize.c" + "${PROJECT_SOURCE_DIR}/lib/vkformat_check.c" + "${PROJECT_SOURCE_DIR}/lib/vkformat_str.c" + "${PROJECT_SOURCE_DIR}tests/unittests/vkformat_list.inl") + +# CAUTION: When a COMMAND contains VAR="Value" CMake messes up the escaping +# for Bash. With or without VERBATIM, if Value has no spaces CMake changes it +# to VAR=\"Value\". If it has spaces CMake changes it to "VAR=\"Value\"". +# The first causes the quotes to leak into the command that is reading VAR +# breaking, e.g. opening a file that has VAR's value as part of its name. +# The second causes Bash to look for the command 'VAR="Value"' causing it +# to exit with error. +# +# The only workaround I've found is to put the command in a string and invoke +# it with bash -c. This is what we'd have to do on Windows anyway as COMMAND +# defaults to cmd or powershell (not sure which). In this case CMake passes +# to bash a string of the form '"VAR=\"Value\" command arg ..."' which bash +# parses successfully. + +list(APPEND mvffc_as_list + scripts/mkvkformatfiles ./ ${vulkan_header}) +list(JOIN mvffc_as_list " " mvffc_as_string) + set(mkvkformatfiles_command "${BASH_EXECUTABLE}" -c "${mvffc_as_string}") + +add_custom_command(OUTPUT ${mkvkformatfiles_output} + COMMAND ${mkvkformatfiles_command} + DEPENDS ${mkvkformatfiles_input} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + COMMENT "Generating VkFormat-related source files" + VERBATIM +) + +add_custom_target(mkvkformatfiles + DEPENDS ${mkvkformatfiles_output} + SOURCES ${mkvkformatfiles_input} +) + +list(APPEND makevk2dfd_input + ${vulkan_header} + external/dfdutils/makevk2dfd.pl) +set(makevk2dfd_output + "${PROJECT_SOURCE_DIR}/external/dfdutils/vk2dfd.inl") + +add_custom_command( + OUTPUT ${makevk2dfd_output} + COMMAND "${PERL_EXECUTABLE}" external/dfdutils/makevk2dfd.pl ${vulkan_header} external/dfdutils/vk2dfd.inl + DEPENDS ${makevk2dfd_input} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + COMMENT "Generating VkFormat/DFD switch body" + VERBATIM +) + +add_custom_target(makevk2dfd + DEPENDS ${makevk2dfd_output} + SOURCES ${makevk2dfd_input} +) + + +list(APPEND makedfd2vk_input + ${vulkan_header} + external/dfdutils/makedfd2vk.pl) +list(APPEND makedfd2vk_output + "${PROJECT_SOURCE_DIR}/external/dfdutils/dfd2vk.inl") + +add_custom_command( + OUTPUT ${makedfd2vk_output} + COMMAND ${CMAKE_COMMAND} -E make_directory external/dfdutils + COMMAND "${PERL_EXECUTABLE}" external/dfdutils/makedfd2vk.pl ${vulkan_header} external/dfdutils/dfd2vk.inl + DEPENDS ${makedfd2vk_input} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + COMMENT "Generating DFD/VkFormat switch body" + VERBATIM +) + +add_custom_target(makedfd2vk + DEPENDS ${makedfd2vk_output} + SOURCES ${makedfd2vk_input} +) + +list(APPEND makevk2gl_input + ${KTX_SPECIFICATION}/generate_format_switches.rb + ${KTX_SPECIFICATION}/formats.json) +list(APPEND makevk2gl_output + "${PROJECT_SOURCE_DIR}/lib/vkFormat2glFormat.inl" + "${PROJECT_SOURCE_DIR}/lib/vkFormat2glInternalFormat.inl" + "${PROJECT_SOURCE_DIR}/lib/vkFormat2glType.inl") +# Until we have D3D or Metal loaders these outputs of +# generate_format_switches.rb are unneeded. +list(APPEND makevk2gl_extraneous_files + "${PROJECT_SOURCE_DIR}/lib/vkFormat2dxgiFormat.inl" + "${PROJECT_SOURCE_DIR}/lib/vkFormat2mtlFormat.inl" +) + +add_custom_command( + OUTPUT ${makevk2gl_output} + COMMAND "${RUBY_EXECUTABLE}" ${KTX_SPECIFICATION}/generate_format_switches.rb ${PROJECT_SOURCE_DIR}/lib + COMMAND ${CMAKE_COMMAND} -E rm -f ${makevk2gl_extraneous_files} + DEPENDS ${makevk2gl_input} + WORKING_DIRECTORY ${KTX_SPECIFICATION} + COMMENT "Generating VkFormat to OpenGL internal format, format and type switches" + VERBATIM +) + +add_custom_target(makevk2gl + DEPENDS ${makevk2gl_output} + SOURCES ${makedvk2gl_input} +) + +add_custom_target(mkvk SOURCES ${CMAKE_CURRENT_LIST_FILE}) + +add_dependencies(mkvk + mkvkformatfiles + makevk2dfd + makedfd2vk + makevk2gl +) diff --git a/ktx/cmake/modules/CPack.distribution.dist.in b/ktx/cmake/modules/CPack.distribution.dist.in new file mode 100644 index 0000000..146e80a --- /dev/null +++ b/ktx/cmake/modules/CPack.distribution.dist.in @@ -0,0 +1,15 @@ + + + + KTX-Software + + + + + + @CPACK_PACKAGEMAKER_CHOICES@ + + diff --git a/ktx/cmake/modules/FindBash.cmake b/ktx/cmake/modules/FindBash.cmake new file mode 100644 index 0000000..a825ac0 --- /dev/null +++ b/ktx/cmake/modules/FindBash.cmake @@ -0,0 +1,100 @@ +############################################################################## +# @file FindBASH.cmake +# @brief Find BASH interpreter. +# +# Sets the CMake variables @c BASH_FOUND, @c BASH_EXECUTABLE, +# @c BASH_VERSION_STRING, @c BASH_VERSION_MAJOR, @c BASH_VERSION_MINOR, and +# @c BASH_VERSION_PATCH. +# +# @ingroup CMakeFindModules +############################################################################## + +#============================================================================= +# Copyright 2011-2012 University of Pennsylvania +# Copyright 2013-2016 Andreas Schuh +# Copyright 2013-2020 Andreas Atteneder +# SPDX-License-Identifier: BSD-2-Clause +# +# Distributed under the OSI-approved BSD License (the "License"); + +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. + +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= + +# ---------------------------------------------------------------------------- +# find BASH executable + +# First, look if GIT bash is installed +find_program ( + BASH_EXECUTABLE + bash +PATHS + # Additional paths for Windows + "C:\\Program Files\\Git\\bin" +NO_SYSTEM_ENVIRONMENT_PATH +) + +if(NOT BASH_EXECUTABLE) + # Fallback search in default locations + find_program ( + BASH_EXECUTABLE + bash + ) +endif() + +mark_as_advanced (BASH_EXECUTABLE) + +# ---------------------------------------------------------------------------- +# Get version of found BASH executable. +if (BASH_EXECUTABLE) + # Set LANG to en because match looks for English "version". + set(ENV{LANG} "en_US.UTF-8") + execute_process (COMMAND "${BASH_EXECUTABLE}" --version OUTPUT_VARIABLE _BASH_STDOUT ERROR_VARIABLE _BASH_STDERR) + if (_BASH_STDOUT MATCHES "version ([0-9]+)\\.([0-9]+)\\.([0-9]+)") + set (BASH_VERSION_MAJOR "${CMAKE_MATCH_1}") + set (BASH_VERSION_MINOR "${CMAKE_MATCH_2}") + set (BASH_VERSION_PATCH "${CMAKE_MATCH_3}") + set (BASH_VERSION_STRING "${BASH_VERSION_MAJOR}.${BASH_VERSION_MINOR}.${BASH_VERSION_PATCH}") + else () + message (WARNING "Failed to determine version of Bash interpreter (${BASH_EXECUTABLE})! Error:\n${_BASH_STDERR}") + endif () + unset (_BASH_STDOUT) + unset (_BASH_STDERR) +endif () + +# ---------------------------------------------------------------------------- +# Handle the QUIET and REQUIRED arguments and set *_FOUND to TRUE +# if all listed variables are found or TRUE +include (FindPackageHandleStandardArgs) + +find_package_handle_standard_args ( + Bash + REQUIRED_VARS + BASH_EXECUTABLE +) diff --git a/ktx/cmake/modules/FindSDL2.cmake b/ktx/cmake/modules/FindSDL2.cmake new file mode 100644 index 0000000..0a9f4fe --- /dev/null +++ b/ktx/cmake/modules/FindSDL2.cmake @@ -0,0 +1,210 @@ +# A version of cmake's FindSDL module modified to find SDL2. + +# Copyright 2000-2020 Kitware, Inc. and Contributors +# SPDX-License-Identifier: BSD-3-Clause + +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +# Modifled for SDL2 by Mark Callow. (khronos at callow.im) + +#[=======================================================================[.rst: +FindSDL2 +-------- + +Locate SDL2 library + +This module defines + +:: + + SDL2_LIBRARY, the name of the library to link against + SDL2_FOUND, if false, do not try to link to SDL + SDL2_INCLUDE_DIR, where to find SDL.h + SDL2_VERSION_STRING, human-readable string containing the version of SDL + + + +This module responds to the flag: + +:: + + SDL2_BUILDING_LIBRARY + If this is defined, then no SDL2_main will be linked in because + only applications need main(). + Otherwise, it is assumed you are building an application and this + module will attempt to locate and set the proper link flags + as part of the returned SDL2_LIBRARY variable. + + + +Don't forget to include SDLmain.h and SDLmain.m your project for the +OS X framework based version. (Other versions link to -lSDLmain which +this module will try to find on your behalf.) Also for OS X, this +module will automatically add the -framework Cocoa on your behalf. + + + +Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your +configuration and no SDL2_LIBRARY, it means CMake did not find your SDL +library (SDL.dll, libsdl.so, SDL.framework, etc). Set +SDL2_LIBRARY_TEMP to point to your SDL library, and configure again. +Similarly, if you see an empty SDLMAIN_LIBRARY, you should set this +value as appropriate. These values are used to generate the final +SDL2_LIBRARY variable, but when these values are unset, SDL2_LIBRARY +does not get created. + + + +$SDL2DIR is an environment variable that would correspond to the +./configure --prefix=$SDL2DIR used in building SDL. l.e.galup 9-20-02 + +Modified by Eric Wing. Added code to assist with automated building +by using environmental variables and providing a more +controlled/consistent search behavior. Added new modifications to +recognize OS X frameworks and additional Unix paths (FreeBSD, etc). +Also corrected the header search path to follow "proper" SDL +guidelines. Added a search for SDLmain which is needed by some +platforms. Added a search for threads which is needed by some +platforms. Added needed compile switches for MinGW. + +On OSX, this will prefer the Framework version (if found) over others. +People will have to manually change the cache values of SDL2_LIBRARY to +override this selection or set the CMake environment +CMAKE_INCLUDE_PATH to modify the search paths. + +Note that the header path has changed from SDL/SDL.h to just SDL.h +This needed to change because "proper" SDL convention is #include +"SDL.h", not . This is done for portability reasons +because not all systems place things in SDL/ (see FreeBSD). +#]=======================================================================] + +if(NOT SDL2_DIR) + set(SDL2_DIR "" CACHE PATH "SDL2 directory") +endif() + +find_path(SDL2_INCLUDE_DIR SDL.h + HINTS + ENV SDL2DIR + ${SDL2_DIR} + PATH_SUFFIXES SDL2 + # path suffixes to search inside ENV{SDL2DIR} + include/SDL2 include +) + +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(VC_LIB_PATH_SUFFIX lib/x64) +else() + set(VC_LIB_PATH_SUFFIX lib/x86) +endif() + +find_library(SDL2_LIBRARY_TEMP + NAMES SDL2 + HINTS + ENV SDL2DIR + ${SDL2_DIR} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} +) + +# Hide this cache variable from the user, it's an internal implementation +# detail. The documented library variable for the user is SDL2_LIBRARY +# which is derived from SDL2_LIBRARY_TEMP further below. +set_property(CACHE SDL2_LIBRARY_TEMP PROPERTY TYPE INTERNAL) + +if(NOT SDL2_BUILDING_LIBRARY) + if(NOT SDL2_INCLUDE_DIR MATCHES ".framework") + # Non-OS X framework versions expect you to also dynamically link to + # SDLmain. This is mainly for Windows and OS X. Other (Unix) platforms + # seem to provide SDLmain for compatibility even though they don't + # necessarily need it. + find_library(SDL2MAIN_LIBRARY + NAMES SDL2main + HINTS + ENV SDL2DIR + ${SDL2_DIR} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} + PATHS + /sw + /opt/local + /opt/csw + /opt + ) + endif() +endif() + +# SDL may require threads on your system. +# The Apple build may not need an explicit flag because one of the +# frameworks may already provide it. +# But for non-OSX systems, I will use the CMake Threads package. +if(NOT APPLE) + find_package(Threads) +endif() + +# MinGW needs an additional link flag, -mwindows +# It's total link flags should look like -lmingw32 -lSDLmain -lSDL -mwindows +if(MINGW) + set(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "link flags for MinGW") +endif() + +if(SDL2_LIBRARY_TEMP) + # For SDLmain + if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY) + list(FIND SDL2_LIBRARY_TEMP "${SDLMAIN_LIBRARY}" _SDL2_MAIN_INDEX) + if(_SDL2_MAIN_INDEX EQUAL -1) + set(SDL2_LIBRARY_TEMP "${SDLMAIN_LIBRARY}" ${SDL2_LIBRARY_TEMP}) + endif() + unset(_SDL2_MAIN_INDEX) + endif() + + # For OS X, SDL uses Cocoa as a backend so it must link to Cocoa. + # CMake doesn't display the -framework Cocoa string in the UI even + # though it actually is there if I modify a pre-used variable. + # I think it has something to do with the CACHE STRING. + # So I use a temporary variable until the end so I can set the + # "real" variable in one-shot. + if(APPLE) + set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa") + endif() + + # For threads, as mentioned Apple doesn't need this. + # In fact, there seems to be a problem if I used the Threads package + # and try using this line, so I'm just skipping it entirely for OS X. + if(NOT APPLE) + set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT}) + endif() + + # For MinGW library + if(MINGW) + set(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP}) + endif() + + # Set the final string here so the GUI reflects the final state. + set(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL Library can be found") +endif() + +if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL2_version.h") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}") + set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH}) + unset(SDL2_VERSION_MAJOR_LINE) + unset(SDL2_VERSION_MINOR_LINE) + unset(SDL2_VERSION_PATCH_LINE) + unset(SDL2_VERSION_MAJOR) + unset(SDL2_VERSION_MINOR) + unset(SDL2_VERSION_PATCH) +endif() + +set(SDL2_LIBRARIES ${SDL2_LIBRARY} ${SDL2MAIN_LIBRARY}) +set(SDL2_INCLUDE_DIRS ${SDL2_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 + REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR + VERSION_VAR SDL2_VERSION_STRING) + +# vim:ai:ts=4:sts=4:sw=2:expandtab:textwidth=70 diff --git a/ktx/cmake/modules/FindVulkan.cmake b/ktx/cmake/modules/FindVulkan.cmake new file mode 100644 index 0000000..03f46be --- /dev/null +++ b/ktx/cmake/modules/FindVulkan.cmake @@ -0,0 +1,983 @@ +# Updates for iOS Copyright (c) 2024, Holochip Inc. +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindVulkan +---------- + +.. versionadded:: 3.7 + +Find Vulkan, which is a low-overhead, cross-platform 3D graphics +and computing API. + +Optional COMPONENTS +^^^^^^^^^^^^^^^^^^^ + +.. versionadded:: 3.24 + +This module respects several optional COMPONENTS. +There are corresponding imported targets for each of these. + +``glslc`` + The SPIR-V compiler. + +``glslangValidator`` + The ``glslangValidator`` tool. + +``glslang`` + The SPIR-V generator library. + +``shaderc_combined`` + The static library for Vulkan shader compilation. + +``SPIRV-Tools`` + Tools to process SPIR-V modules. + +``MoltenVK`` + On macOS, an additional component ``MoltenVK`` is available. + +``dxc`` + .. versionadded:: 3.25 + + The DirectX Shader Compiler. + +The ``glslc`` and ``glslangValidator`` components are provided even +if not explicitly requested (for backward compatibility). + +IMPORTED Targets +^^^^^^^^^^^^^^^^ + +This module defines :prop_tgt:`IMPORTED` targets if Vulkan has been found: + +``Vulkan::Vulkan`` + The main Vulkan library. + +``Vulkan::glslc`` + .. versionadded:: 3.19 + + The GLSLC SPIR-V compiler, if it has been found. + +``Vulkan::Headers`` + .. versionadded:: 3.21 + + Provides just Vulkan headers include paths, if found. No library is + included in this target. This can be useful for applications that + load Vulkan library dynamically. + +``Vulkan::glslangValidator`` + .. versionadded:: 3.21 + + The glslangValidator tool, if found. It is used to compile GLSL and + HLSL shaders into SPIR-V. + +``Vulkan::glslang`` + .. versionadded:: 3.24 + + Defined if SDK has the Khronos-reference front-end shader parser and SPIR-V + generator library (glslang). + +``Vulkan::shaderc_combined`` + .. versionadded:: 3.24 + + Defined if SDK has the Google static library for Vulkan shader compilation + (shaderc_combined). + +``Vulkan::SPIRV-Tools`` + .. versionadded:: 3.24 + + Defined if SDK has the Khronos library to process SPIR-V modules + (SPIRV-Tools). + +``Vulkan::MoltenVK`` + .. versionadded:: 3.24 + + Defined if SDK has the Khronos library which implement a subset of Vulkan API + over Apple Metal graphics framework. (MoltenVK). + +``Vulkan::volk`` + .. versionadded:: 3.25 + + Defined if SDK has the Vulkan meta-loader (volk). + +``Vulkan::dxc_lib`` + .. versionadded:: 3.25 + + Defined if SDK has the DirectX shader compiler library. + +``Vulkan::dxc_exe`` + .. versionadded:: 3.25 + + Defined if SDK has the DirectX shader compiler CLI tool. + +Result Variables +^^^^^^^^^^^^^^^^ + +This module defines the following variables: + +``Vulkan_FOUND`` + set to true if Vulkan was found +``Vulkan_INCLUDE_DIRS`` + include directories for Vulkan +``Vulkan_LIBRARIES`` + link against this library to use Vulkan +``Vulkan_VERSION`` + .. versionadded:: 3.23 + + value from ``vulkan/vulkan_core.h`` +``Vulkan_glslc_FOUND`` + .. versionadded:: 3.24 + + True, if the SDK has the glslc executable. +``Vulkan_glslangValidator_FOUND`` + .. versionadded:: 3.24 + + True, if the SDK has the glslangValidator executable. +``Vulkan_glslang_FOUND`` + .. versionadded:: 3.24 + + True, if the SDK has the glslang library. +``Vulkan_shaderc_combined_FOUND`` + .. versionadded:: 3.24 + + True, if the SDK has the shaderc_combined library. +``Vulkan_SPIRV-Tools_FOUND`` + .. versionadded:: 3.24 + + True, if the SDK has the SPIRV-Tools library. +``Vulkan_MoltenVK_FOUND`` + .. versionadded:: 3.24 + + True, if the SDK has the MoltenVK library. +``Vulkan_volk_FOUND`` + .. versionadded:: 3.25 + + True, if the SDK has the volk library. + +``Vulkan_dxc_lib_FOUND`` + .. versionadded:: 3.25 + + True, if the SDK has the DirectX shader compiler library. + +``Vulkan_dxc_exe_FOUND`` + .. versionadded:: 3.25 + + True, if the SDK has the DirectX shader compiler CLI tool. + + +The module will also defines these cache variables: + +``Vulkan_INCLUDE_DIR`` + the Vulkan include directory +``Vulkan_LIBRARY`` + the path to the Vulkan library +``Vulkan_GLSLC_EXECUTABLE`` + the path to the GLSL SPIR-V compiler +``Vulkan_GLSLANG_VALIDATOR_EXECUTABLE`` + the path to the glslangValidator tool +``Vulkan_glslang_LIBRARY`` + .. versionadded:: 3.24 + + Path to the glslang library. +``Vulkan_shaderc_combined_LIBRARY`` + .. versionadded:: 3.24 + + Path to the shaderc_combined library. +``Vulkan_SPIRV-Tools_LIBRARY`` + .. versionadded:: 3.24 + + Path to the SPIRV-Tools library. +``Vulkan_MoltenVK_LIBRARY`` + .. versionadded:: 3.24 + + Path to the MoltenVK library. + +``Vulkan_volk_LIBRARY`` + .. versionadded:: 3.25 + + Path to the volk library. + +``Vulkan_dxc_LIBRARY`` + .. versionadded:: 3.25 + + Path to the DirectX shader compiler library. + +``Vulkan_dxc_EXECUTABLE`` + .. versionadded:: 3.25 + + Path to the DirectX shader compiler CLI tool. + +Hints +^^^^^ + +.. versionadded:: 3.18 + +The ``VULKAN_SDK`` environment variable optionally specifies the +location of the Vulkan SDK root directory for the given +architecture. It is typically set by sourcing the toplevel +``setup-env.sh`` script of the Vulkan SDK directory into the shell +environment. + +#]=======================================================================] + +cmake_policy(PUSH) +cmake_policy(SET CMP0057 NEW) + +# Provide compatibility with a common invalid component request that +# was silently ignored prior to CMake 3.24. +if("FATAL_ERROR" IN_LIST Vulkan_FIND_COMPONENTS) + message(AUTHOR_WARNING + "Ignoring unknown component 'FATAL_ERROR'.\n" + "The find_package() command documents no such argument." + ) + list(REMOVE_ITEM Vulkan_FIND_COMPONENTS "FATAL_ERROR") +endif() + +# FindVulkan only works correctly for iOS with CMAKE_FIND_FRAMEWORK set to +# FIRST or ALWAYS. If LAST or NEVER it will find the macOS dylibs instead +# of the iOS frameworks because the macOS lib directory has to be added to +# the search path so libraries for various tools can be found. +# +# For macOS there is a MoltenVK.xcframework which contains a static library. +# To find the MoltenVK.dylib, which is needed when building bundles we need +# to LAST or NEVER. LAST appears to be default value. +# +# If frameworks are ever included in the SDK for macOS, the search mechanism +# will need revisiting. +if(APPLE) + if(IOS) + if (NOT ${CMAKE_FIND_FRAMEWORK} STREQUAL "FIRST" AND NOT ${CMAKE_FIND_FRAMEWORK} STREQUAL "ALWAYS") + message(NOTICE "Temporarily setting CMAKE_FIND_FRAMEWORK to FIRST to find Vulkan iOS frameworks.") + set(_Vulkan_saved_cmake_find_framework ${CMAKE_FIND_FRAMEWORK}) + set(CMAKE_FIND_FRAMEWORK FIRST) + endif() + else() + if (NOT ${CMAKE_FIND_FRAMEWORK} STREQUAL "LAST" AND NOT ${CMAKE_FIND_FRAMEWORK} STREQUAL "NEVER") + message(NOTICE "Temporarily setting CMAKE_FIND_FRAMEWORK to LAST to find Vulkan macOS dylibs.") + endif() + endif() +endif() + +if(APPLE) + # Make robust against different ways VULKAN_SDK may be set. + get_filename_component(_Vulkan_SDK_dirname "$ENV{VULKAN_SDK}" NAME) + if(${_Vulkan_SDK_dirname} STREQUAL "macOS" OR ${_Vulkan_SDK_dirname} STREQUAL "iOS") + get_filename_component(Vulkan_SDK_Base "$ENV{VULKAN_SDK}/.." REALPATH) + else() + get_filename_component(Vulkan_SDK_Base "$ENV{VULKAN_SDK}" REALPATH) + endif() + set(_Vulkan_SDK ${Vulkan_SDK_Base}/macOS) + if(IOS) + list(APPEND CMAKE_FRAMEWORK_PATH "${Vulkan_SDK_Base}/iOS/lib") + set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH) + set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) + set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) + endif() +else() + set(_Vulkan_SDK "$ENV{VULKAN_SDK}") +endif() + +# For backward compatibility as `FindVulkan` in previous CMake versions allow to retrieve `glslc` +# and `glslangValidator` without requesting the corresponding component. +if(NOT glslc IN_LIST Vulkan_FIND_COMPONENTS) + list(APPEND Vulkan_FIND_COMPONENTS glslc) +endif() +if(NOT glslangValidator IN_LIST Vulkan_FIND_COMPONENTS) + list(APPEND Vulkan_FIND_COMPONENTS glslangValidator) +endif() + +if(WIN32) + set(_Vulkan_library_name vulkan-1) + set(_Vulkan_hint_include_search_paths + ${_Vulkan_SDK}/include + ) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_Vulkan_hint_executable_search_paths + ${_Vulkan_SDK}/bin + ) + set(_Vulkan_hint_library_search_paths + ${_Vulkan_SDK}/lib + ${_Vulkan_SDK}/bin + ) + else() + set(_Vulkan_hint_executable_search_paths + ${_Vulkan_SDK}/bin32 + ${_Vulkan_SDK}/bin + ) + set(_Vulkan_hint_library_search_paths + ${_Vulkan_SDK}/lib32 + ${_Vulkan_SDK}/bin32 + ${_Vulkan_SDK}/lib + ${_Vulkan_SDK}/bin + ) + endif() +else() + set(_Vulkan_library_name vulkan) + set(_Vulkan_hint_include_search_paths + ${_Vulkan_SDK}/include + ) + set(_Vulkan_hint_executable_search_paths + ${_Vulkan_SDK}/bin + ) + set(_Vulkan_hint_library_search_paths + ${_Vulkan_SDK}/lib + ) +endif() +if(APPLE AND IOS) + if(CMAKE_SYSTEM_NAME STREQUAL "iOS") + list(APPEND _Vulkan_hint_library_search_paths + ${Vulkan_SDK_Base}/iOS/lib + ) + elseif(CMAKE_SYSTEM_NAME STREQUAL "tvOS") + list(APPEND _Vulkan_hint_library_search_paths + ${Vulkan_SDK_Base}/tvOS/lib + ) + endif() +endif() + +find_path(Vulkan_INCLUDE_DIR + NAMES vulkan/vulkan.h + HINTS + ${_Vulkan_hint_include_search_paths} +) +mark_as_advanced(Vulkan_INCLUDE_DIR) + +find_library(Vulkan_LIBRARY + NAMES ${_Vulkan_library_name} + HINTS + ${_Vulkan_hint_library_search_paths} +) +message(STATUS "Vulkan_LIBRARY ${Vulkan_LIBRARY} search paths ${_Vulkan_hint_library_search_paths}") +mark_as_advanced(Vulkan_LIBRARY) + +find_library(Vulkan_Layer_API_DUMP + NAMES VkLayer_api_dump + HINTS + ${_Vulkan_hint_library_search_paths} +) +mark_as_advanced(Vulkan_Layer_API_DUMP) + +find_library(Vulkan_Layer_SHADER_OBJECT + NAMES VkLayer_khronos_shader_object + HINTS + ${_Vulkan_hint_library_search_paths} +) +mark_as_advanced(VkLayer_khronos_shader_object) + +find_library(Vulkan_Layer_SYNC2 + NAMES VkLayer_khronos_synchronization2 + HINTS + ${_Vulkan_hint_library_search_paths} +) +mark_as_advanced(Vulkan_Layer_SYNC2) + +find_library(Vulkan_Layer_VALIDATION + NAMES VkLayer_khronos_validation + HINTS + ${_Vulkan_hint_library_search_paths} +) +mark_as_advanced(Vulkan_Layer_VALIDATION) + +if(glslc IN_LIST Vulkan_FIND_COMPONENTS) + find_program(Vulkan_GLSLC_EXECUTABLE + NAMES glslc + HINTS + ${_Vulkan_hint_executable_search_paths} + ) + mark_as_advanced(Vulkan_GLSLC_EXECUTABLE) +endif() +if(glslangValidator IN_LIST Vulkan_FIND_COMPONENTS) + find_program(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE + NAMES glslangValidator + HINTS + ${_Vulkan_hint_executable_search_paths} + ) + mark_as_advanced(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE) +endif() +if(glslang IN_LIST Vulkan_FIND_COMPONENTS) + find_library(Vulkan_glslang-spirv_LIBRARY + NAMES SPIRV + HINTS + ${_Vulkan_hint_library_search_paths} + ) + mark_as_advanced(Vulkan_glslang-spirv_LIBRARY) + + find_library(Vulkan_glslang-spirv_DEBUG_LIBRARY + NAMES SPIRVd + HINTS + ${_Vulkan_hint_library_search_paths} + ) + mark_as_advanced(Vulkan_glslang-spirv_DEBUG_LIBRARY) + + find_library(Vulkan_glslang-oglcompiler_LIBRARY + NAMES OGLCompiler + HINTS + ${_Vulkan_hint_library_search_paths} + ) + mark_as_advanced(Vulkan_glslang-oglcompiler_LIBRARY) + + find_library(Vulkan_glslang-oglcompiler_DEBUG_LIBRARY + NAMES OGLCompilerd + HINTS + ${_Vulkan_hint_library_search_paths} + ) + mark_as_advanced(Vulkan_glslang-oglcompiler_DEBUG_LIBRARY) + + find_library(Vulkan_glslang-osdependent_LIBRARY + NAMES OSDependent + HINTS + ${_Vulkan_hint_library_search_paths} + ) + mark_as_advanced(Vulkan_glslang-osdependent_LIBRARY) + + find_library(Vulkan_glslang-osdependent_DEBUG_LIBRARY + NAMES OSDependentd + HINTS + ${_Vulkan_hint_library_search_paths} + ) + mark_as_advanced(Vulkan_glslang-osdependent_DEBUG_LIBRARY) + + find_library(Vulkan_glslang-machineindependent_LIBRARY + NAMES MachineIndependent + HINTS + ${_Vulkan_hint_library_search_paths} + ) + mark_as_advanced(Vulkan_glslang-machineindependent_LIBRARY) + + find_library(Vulkan_glslang-machineindependent_DEBUG_LIBRARY + NAMES MachineIndependentd + HINTS + ${_Vulkan_hint_library_search_paths} + ) + mark_as_advanced(Vulkan_glslang-machineindependent_DEBUG_LIBRARY) + + find_library(Vulkan_glslang-genericcodegen_LIBRARY + NAMES GenericCodeGen + HINTS + ${_Vulkan_hint_library_search_paths} + ) + mark_as_advanced(Vulkan_glslang-genericcodegen_LIBRARY) + + find_library(Vulkan_glslang-genericcodegen_DEBUG_LIBRARY + NAMES GenericCodeGend + HINTS + ${_Vulkan_hint_library_search_paths} + ) + mark_as_advanced(Vulkan_glslang-genericcodegen_DEBUG_LIBRARY) + + find_library(Vulkan_glslang_LIBRARY + NAMES glslang + HINTS + ${_Vulkan_hint_library_search_paths} + ) + mark_as_advanced(Vulkan_glslang_LIBRARY) + + find_library(Vulkan_glslang_DEBUG_LIBRARY + NAMES glslangd + HINTS + ${_Vulkan_hint_library_search_paths} + ) + mark_as_advanced(Vulkan_glslang_DEBUG_LIBRARY) +endif() +if(shaderc_combined IN_LIST Vulkan_FIND_COMPONENTS) + find_library(Vulkan_shaderc_combined_LIBRARY + NAMES shaderc_combined + HINTS + ${_Vulkan_hint_library_search_paths}) + mark_as_advanced(Vulkan_shaderc_combined_LIBRARY) + + find_library(Vulkan_shaderc_combined_DEBUG_LIBRARY + NAMES shaderc_combinedd + HINTS + ${_Vulkan_hint_library_search_paths}) + mark_as_advanced(Vulkan_shaderc_combined_DEBUG_LIBRARY) +endif() +if(SPIRV-Tools IN_LIST Vulkan_FIND_COMPONENTS) + find_library(Vulkan_SPIRV-Tools_LIBRARY + NAMES SPIRV-Tools + HINTS + ${_Vulkan_hint_library_search_paths}) + mark_as_advanced(Vulkan_SPIRV-Tools_LIBRARY) + + find_library(Vulkan_SPIRV-Tools_DEBUG_LIBRARY + NAMES SPIRV-Toolsd + HINTS + ${_Vulkan_hint_library_search_paths}) + mark_as_advanced(Vulkan_SPIRV-Tools_DEBUG_LIBRARY) +endif() +if(MoltenVK IN_LIST Vulkan_FIND_COMPONENTS) + # CMake has a bug in 3.28 that doesn't handle xcframeworks. Do it by hand for now. + if(CMAKE_SYSTEM_NAME STREQUAL "iOS") + if(CMAKE_VERSION VERSION_LESS 3.29) + set( _Vulkan_hint_library_search_paths ${Vulkan_SDK_Base}/ios/lib/MoltenVK.xcframework/ios-arm64) + else () + set( _Vulkan_hint_library_search_paths ${Vulkan_SDK_Base}/ios/lib/) + endif () + endif () + find_library(Vulkan_MoltenVK_LIBRARY + NAMES MoltenVK + NO_DEFAULT_PATH + HINTS + ${_Vulkan_hint_library_search_paths} + ) + message(STATUS "MoltenVK_LIBRARY ${Vulkan_MoltenVK_LIBRARY} search paths ${_Vulkan_hint_library_search_paths}") + mark_as_advanced(Vulkan_MoltenVK_LIBRARY) + + find_path(Vulkan_MoltenVK_INCLUDE_DIR + NAMES MoltenVK/mvk_vulkan.h + HINTS + ${_Vulkan_hint_include_search_paths} + ) + mark_as_advanced(Vulkan_MoltenVK_INCLUDE_DIR) +endif() +if(volk IN_LIST Vulkan_FIND_COMPONENTS) + find_library(Vulkan_volk_LIBRARY + NAMES volk + HINTS + ${_Vulkan_hint_library_search_paths}) + mark_as_advanced(Vulkan_Volk_LIBRARY) +endif() + +if (dxc IN_LIST Vulkan_FIND_COMPONENTS) + find_library(Vulkan_dxc_LIBRARY + NAMES dxcompiler + HINTS + ${_Vulkan_hint_library_search_paths}) + mark_as_advanced(Vulkan_dxc_LIBRARY) + + find_program(Vulkan_dxc_EXECUTABLE + NAMES dxc + HINTS + ${_Vulkan_hint_executable_search_paths}) + mark_as_advanced(Vulkan_dxc_EXECUTABLE) +endif() + +if(DEFINED _Vulkan_saved_cmake_find_framework) + set(CMAKE_FIND_FRAMEWORK ${_Vulkan_saved_cmake_find_framework}) + unset(_Vulkan_saved_cmake_find_framework) +endif() + +if(Vulkan_GLSLC_EXECUTABLE) + set(Vulkan_glslc_FOUND TRUE) +else() + set(Vulkan_glslc_FOUND FALSE) +endif() + +if(Vulkan_GLSLANG_VALIDATOR_EXECUTABLE) + set(Vulkan_glslangValidator_FOUND TRUE) +else() + set(Vulkan_glslangValidator_FOUND FALSE) +endif() + +if (Vulkan_dxc_EXECUTABLE) + set(Vulkan_dxc_exe_FOUND TRUE) +else() + set(Vulkan_dxc_exe_FOUND FALSE) +endif() + +function(_Vulkan_set_library_component_found component) + cmake_parse_arguments(PARSE_ARGV 1 _ARG + "NO_WARNING" + "" + "DEPENDENT_COMPONENTS") + + set(all_dependent_component_found TRUE) + foreach(dependent_component IN LISTS _ARG_DEPENDENT_COMPONENTS) + if(NOT Vulkan_${dependent_component}_FOUND) + set(all_dependent_component_found FALSE) + break() + endif() + endforeach() + + if(all_dependent_component_found AND (Vulkan_${component}_LIBRARY OR Vulkan_${component}_DEBUG_LIBRARY)) + set(Vulkan_${component}_FOUND TRUE PARENT_SCOPE) + + # For Windows Vulkan SDK, third party tools binaries are provided with different MSVC ABI: + # - Release binaries uses a runtime library + # - Debug binaries uses a debug runtime library + # This lead to incompatibilities in linking for some configuration types due to CMake-default or project-configured selected MSVC ABI. + if(WIN32 AND NOT _ARG_NO_WARNING) + if(NOT Vulkan_${component}_LIBRARY) + message(WARNING + "Library ${component} for Release configuration is missing, imported target Vulkan::${component} may not be able to link when targeting this build configuration due to incompatible MSVC ABI.") + endif() + if(NOT Vulkan_${component}_DEBUG_LIBRARY) + message(WARNING + "Library ${component} for Debug configuration is missing, imported target Vulkan::${component} may not be able to link when targeting this build configuration due to incompatible MSVC ABI. Consider re-installing the Vulkan SDK and request debug libraries to fix this warning.") + endif() + endif() + else() + set(Vulkan_${component}_FOUND FALSE PARENT_SCOPE) + endif() +endfunction() + +_Vulkan_set_library_component_found(glslang-spirv NO_WARNING) +_Vulkan_set_library_component_found(glslang-oglcompiler NO_WARNING) +_Vulkan_set_library_component_found(glslang-osdependent NO_WARNING) +_Vulkan_set_library_component_found(glslang-machineindependent NO_WARNING) +_Vulkan_set_library_component_found(glslang-genericcodegen NO_WARNING) +_Vulkan_set_library_component_found(glslang + DEPENDENT_COMPONENTS + glslang-spirv + glslang-oglcompiler + glslang-osdependent + glslang-machineindependent + glslang-genericcodegen) +_Vulkan_set_library_component_found(shaderc_combined) +_Vulkan_set_library_component_found(SPIRV-Tools) +_Vulkan_set_library_component_found(volk) +_Vulkan_set_library_component_found(dxc) + +if(Vulkan_MoltenVK_INCLUDE_DIR AND Vulkan_MoltenVK_LIBRARY) + set(Vulkan_MoltenVK_FOUND TRUE) +else() + set(Vulkan_MoltenVK_FOUND FALSE) +endif() + +set(Vulkan_LIBRARIES ${Vulkan_LIBRARY}) +set(Vulkan_INCLUDE_DIRS ${Vulkan_INCLUDE_DIR}) + +# detect version e.g 1.2.189 +set(Vulkan_VERSION "") +if(Vulkan_INCLUDE_DIR) + set(VULKAN_CORE_H ${Vulkan_INCLUDE_DIR}/vulkan/vulkan_core.h) + if(EXISTS ${VULKAN_CORE_H}) + file(STRINGS ${VULKAN_CORE_H} VulkanHeaderVersionLine REGEX "^#define VK_HEADER_VERSION ") + string(REGEX MATCHALL "[0-9]+" VulkanHeaderVersion "${VulkanHeaderVersionLine}") + file(STRINGS ${VULKAN_CORE_H} VulkanHeaderVersionLine2 REGEX "^#define VK_HEADER_VERSION_COMPLETE ") + string(REGEX MATCHALL "[0-9]+" VulkanHeaderVersion2 "${VulkanHeaderVersionLine2}") + list(LENGTH VulkanHeaderVersion2 _len) + # versions >= 1.2.175 have an additional numbers in front of e.g. '0, 1, 2' instead of '1, 2' + if(_len EQUAL 3) + list(REMOVE_AT VulkanHeaderVersion2 0) + endif() + list(APPEND VulkanHeaderVersion2 ${VulkanHeaderVersion}) + list(JOIN VulkanHeaderVersion2 "." Vulkan_VERSION) + endif() +endif() + +if(Vulkan_MoltenVK_FOUND) + set(Vulkan_MoltenVK_VERSION "") + if(Vulkan_MoltenVK_INCLUDE_DIR) + set(VK_MVK_MOLTENVK_H ${Vulkan_MoltenVK_INCLUDE_DIR}/MoltenVK/vk_mvk_moltenvk.h) + if(EXISTS ${VK_MVK_MOLTENVK_H}) + file(STRINGS ${VK_MVK_MOLTENVK_H} _Vulkan_MoltenVK_VERSION_MAJOR REGEX "^#define MVK_VERSION_MAJOR ") + string(REGEX MATCHALL "[0-9]+" _Vulkan_MoltenVK_VERSION_MAJOR "${_Vulkan_MoltenVK_VERSION_MAJOR}") + file(STRINGS ${VK_MVK_MOLTENVK_H} _Vulkan_MoltenVK_VERSION_MINOR REGEX "^#define MVK_VERSION_MINOR ") + string(REGEX MATCHALL "[0-9]+" _Vulkan_MoltenVK_VERSION_MINOR "${_Vulkan_MoltenVK_VERSION_MINOR}") + file(STRINGS ${VK_MVK_MOLTENVK_H} _Vulkan_MoltenVK_VERSION_PATCH REGEX "^#define MVK_VERSION_PATCH ") + string(REGEX MATCHALL "[0-9]+" _Vulkan_MoltenVK_VERSION_PATCH "${_Vulkan_MoltenVK_VERSION_PATCH}") + set(Vulkan_MoltenVK_VERSION "${_Vulkan_MoltenVK_VERSION_MAJOR}.${_Vulkan_MoltenVK_VERSION_MINOR}.${_Vulkan_MoltenVK_VERSION_PATCH}") + unset(_Vulkan_MoltenVK_VERSION_MAJOR) + unset(_Vulkan_MoltenVK_VERSION_MINOR) + unset(_Vulkan_MoltenVK_VERSION_PATCH) + endif() + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Vulkan + REQUIRED_VARS + Vulkan_LIBRARY + Vulkan_INCLUDE_DIR + VERSION_VAR + Vulkan_VERSION + HANDLE_COMPONENTS +) + +if(Vulkan_FOUND AND NOT TARGET Vulkan::Vulkan) + add_library(Vulkan::Vulkan UNKNOWN IMPORTED) + get_filename_component(_Vulkan_lib_extension ${Vulkan_LIBRARIES} LAST_EXT) + if(_Vulkan_lib_extension STREQUAL ".framework" AND CMAKE_VERSION VERSION_LESS 3.28) + set_target_properties(Vulkan::Vulkan PROPERTIES + # Prior to 3.28 must reference library just inside the framework. + IMPORTED_LOCATION "${Vulkan_LIBRARIES}/vulkan") + else() + set_target_properties(Vulkan::Vulkan PROPERTIES + IMPORTED_LOCATION "${Vulkan_LIBRARIES}") + endif() + set_target_properties(Vulkan::Vulkan PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}") + unset(_Vulkan_lib_extension) +endif() + +if(Vulkan_FOUND AND NOT TARGET Vulkan::Headers) + add_library(Vulkan::Headers INTERFACE IMPORTED) + set_target_properties(Vulkan::Headers PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}") +endif() + +if(Vulkan_FOUND AND Vulkan_GLSLC_EXECUTABLE AND NOT TARGET Vulkan::glslc) + add_executable(Vulkan::glslc IMPORTED) + set_property(TARGET Vulkan::glslc PROPERTY IMPORTED_LOCATION "${Vulkan_GLSLC_EXECUTABLE}") +endif() + +if(Vulkan_FOUND AND Vulkan_GLSLANG_VALIDATOR_EXECUTABLE AND NOT TARGET Vulkan::glslangValidator) + add_executable(Vulkan::glslangValidator IMPORTED) + set_property(TARGET Vulkan::glslangValidator PROPERTY IMPORTED_LOCATION "${Vulkan_GLSLANG_VALIDATOR_EXECUTABLE}") +endif() + +if(Vulkan_FOUND) + if((Vulkan_glslang-spirv_LIBRARY OR Vulkan_glslang-spirv_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-spirv) + add_library(Vulkan::glslang-spirv STATIC IMPORTED) + set_property(TARGET Vulkan::glslang-spirv + PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}") + if(Vulkan_glslang-spirv_LIBRARY) + set_property(TARGET Vulkan::glslang-spirv APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Release) + set_property(TARGET Vulkan::glslang-spirv + PROPERTY + IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-spirv_LIBRARY}") + endif() + if(Vulkan_glslang-spirv_DEBUG_LIBRARY) + set_property(TARGET Vulkan::glslang-spirv APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Debug) + set_property(TARGET Vulkan::glslang-spirv + PROPERTY + IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-spirv_DEBUG_LIBRARY}") + endif() + endif() + + if((Vulkan_glslang-oglcompiler_LIBRARY OR Vulkan_glslang-oglcompiler_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-oglcompiler) + add_library(Vulkan::glslang-oglcompiler STATIC IMPORTED) + set_property(TARGET Vulkan::glslang-oglcompiler + PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}") + if(Vulkan_glslang-oglcompiler_LIBRARY) + set_property(TARGET Vulkan::glslang-oglcompiler APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Release) + set_property(TARGET Vulkan::glslang-oglcompiler + PROPERTY + IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-oglcompiler_LIBRARY}") + endif() + if(Vulkan_glslang-oglcompiler_DEBUG_LIBRARY) + set_property(TARGET Vulkan::glslang-oglcompiler APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Debug) + set_property(TARGET Vulkan::glslang-oglcompiler + PROPERTY + IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-oglcompiler_DEBUG_LIBRARY}") + endif() + endif() + + if((Vulkan_glslang-osdependent_LIBRARY OR Vulkan_glslang-osdependent_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-osdependent) + add_library(Vulkan::glslang-osdependent STATIC IMPORTED) + set_property(TARGET Vulkan::glslang-osdependent + PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}") + if(Vulkan_glslang-osdependent_LIBRARY) + set_property(TARGET Vulkan::glslang-osdependent APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Release) + set_property(TARGET Vulkan::glslang-osdependent + PROPERTY + IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-osdependent_LIBRARY}") + endif() + if(Vulkan_glslang-osdependent_DEBUG_LIBRARY) + set_property(TARGET Vulkan::glslang-osdependent APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Debug) + set_property(TARGET Vulkan::glslang-osdependent + PROPERTY + IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-osdependent_DEBUG_LIBRARY}") + endif() + endif() + + if((Vulkan_glslang-machineindependent_LIBRARY OR Vulkan_glslang-machineindependent_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-machineindependent) + add_library(Vulkan::glslang-machineindependent STATIC IMPORTED) + set_property(TARGET Vulkan::glslang-machineindependent + PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}") + if(Vulkan_glslang-machineindependent_LIBRARY) + set_property(TARGET Vulkan::glslang-machineindependent APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Release) + set_property(TARGET Vulkan::glslang-machineindependent + PROPERTY + IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-machineindependent_LIBRARY}") + endif() + if(Vulkan_glslang-machineindependent_DEBUG_LIBRARY) + set_property(TARGET Vulkan::glslang-machineindependent APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Debug) + set_property(TARGET Vulkan::glslang-machineindependent + PROPERTY + IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-machineindependent_DEBUG_LIBRARY}") + endif() + endif() + + if((Vulkan_glslang-genericcodegen_LIBRARY OR Vulkan_glslang-genericcodegen_DEBUG_LIBRARY) AND NOT TARGET Vulkan::glslang-genericcodegen) + add_library(Vulkan::glslang-genericcodegen STATIC IMPORTED) + set_property(TARGET Vulkan::glslang-genericcodegen + PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}") + if(Vulkan_glslang-genericcodegen_LIBRARY) + set_property(TARGET Vulkan::glslang-genericcodegen APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Release) + set_property(TARGET Vulkan::glslang-genericcodegen + PROPERTY + IMPORTED_LOCATION_RELEASE "${Vulkan_glslang-genericcodegen_LIBRARY}") + endif() + if(Vulkan_glslang-genericcodegen_DEBUG_LIBRARY) + set_property(TARGET Vulkan::glslang-genericcodegen APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Debug) + set_property(TARGET Vulkan::glslang-genericcodegen + PROPERTY + IMPORTED_LOCATION_DEBUG "${Vulkan_glslang-genericcodegen_DEBUG_LIBRARY}") + endif() + endif() + + if((Vulkan_glslang_LIBRARY OR Vulkan_glslang_DEBUG_LIBRARY) + AND TARGET Vulkan::glslang-spirv + AND TARGET Vulkan::glslang-oglcompiler + AND TARGET Vulkan::glslang-osdependent + AND TARGET Vulkan::glslang-machineindependent + AND TARGET Vulkan::glslang-genericcodegen + AND NOT TARGET Vulkan::glslang) + add_library(Vulkan::glslang STATIC IMPORTED) + set_property(TARGET Vulkan::glslang + PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}") + if(Vulkan_glslang_LIBRARY) + set_property(TARGET Vulkan::glslang APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Release) + set_property(TARGET Vulkan::glslang + PROPERTY + IMPORTED_LOCATION_RELEASE "${Vulkan_glslang_LIBRARY}") + endif() + if(Vulkan_glslang_DEBUG_LIBRARY) + set_property(TARGET Vulkan::glslang APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Debug) + set_property(TARGET Vulkan::glslang + PROPERTY + IMPORTED_LOCATION_DEBUG "${Vulkan_glslang_DEBUG_LIBRARY}") + endif() + target_link_libraries(Vulkan::glslang + INTERFACE + Vulkan::glslang-spirv + Vulkan::glslang-oglcompiler + Vulkan::glslang-osdependent + Vulkan::glslang-machineindependent + Vulkan::glslang-genericcodegen + ) + endif() + + if((Vulkan_shaderc_combined_LIBRARY OR Vulkan_shaderc_combined_DEBUG_LIBRARY) AND NOT TARGET Vulkan::shaderc_combined) + add_library(Vulkan::shaderc_combined STATIC IMPORTED) + set_property(TARGET Vulkan::shaderc_combined + PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}") + if(Vulkan_shaderc_combined_LIBRARY) + set_property(TARGET Vulkan::shaderc_combined APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Release) + set_property(TARGET Vulkan::shaderc_combined + PROPERTY + IMPORTED_LOCATION_RELEASE "${Vulkan_shaderc_combined_LIBRARY}") + endif() + if(Vulkan_shaderc_combined_DEBUG_LIBRARY) + set_property(TARGET Vulkan::shaderc_combined APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Debug) + set_property(TARGET Vulkan::shaderc_combined + PROPERTY + IMPORTED_LOCATION_DEBUG "${Vulkan_shaderc_combined_DEBUG_LIBRARY}") + endif() + + if(UNIX) + find_package(Threads REQUIRED) + target_link_libraries(Vulkan::shaderc_combined + INTERFACE + Threads::Threads) + endif() + endif() + + if((Vulkan_SPIRV-Tools_LIBRARY OR Vulkan_SPIRV-Tools_DEBUG_LIBRARY) AND NOT TARGET Vulkan::SPIRV-Tools) + add_library(Vulkan::SPIRV-Tools STATIC IMPORTED) + set_property(TARGET Vulkan::SPIRV-Tools + PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}") + if(Vulkan_SPIRV-Tools_LIBRARY) + set_property(TARGET Vulkan::SPIRV-Tools APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Release) + set_property(TARGET Vulkan::SPIRV-Tools + PROPERTY + IMPORTED_LOCATION_RELEASE "${Vulkan_SPIRV-Tools_LIBRARY}") + endif() + if(Vulkan_SPIRV-Tools_DEBUG_LIBRARY) + set_property(TARGET Vulkan::SPIRV-Tools APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Debug) + set_property(TARGET Vulkan::SPIRV-Tools + PROPERTY + IMPORTED_LOCATION_DEBUG "${Vulkan_SPIRV-Tools_DEBUG_LIBRARY}") + endif() + endif() + + if(Vulkan_volk_LIBRARY AND NOT TARGET Vulkan::volk) + add_library(Vulkan::volk STATIC IMPORTED) + set_property(TARGET Vulkan::volk + PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}") + set_property(TARGET Vulkan::volk APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Release) + set_property(TARGET Vulkan::volk APPEND + PROPERTY + IMPORTED_LOCATION_RELEASE "${Vulkan_volk_LIBRARY}") + + if (NOT WIN32) + set_property(TARGET Vulkan::volk APPEND + PROPERTY + IMPORTED_LINK_INTERFACE_LIBRARIES dl) + endif() + endif() + + if (Vulkan_dxc_LIBRARY AND NOT TARGET Vulkan::dxc_lib) + add_library(Vulkan::dxc_lib STATIC IMPORTED) + set_property(TARGET Vulkan::dxc_lib + PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}") + set_property(TARGET Vulkan::dxc_lib APPEND + PROPERTY + IMPORTED_CONFIGURATIONS Release) + set_property(TARGET Vulkan::dxc_lib APPEND + PROPERTY + IMPORTED_LOCATION_RELEASE "${Vulkan_dxc_LIBRARY}") + endif() + + if(Vulkan_dxc_EXECUTABLE AND NOT TARGET Vulkan::dxc_exe) + add_executable(Vulkan::dxc_exe IMPORTED) + set_property(TARGET Vulkan::dxc_exe PROPERTY IMPORTED_LOCATION "${Vulkan_dxc_EXECUTABLE}") + endif() + +endif() + +if(Vulkan_MoltenVK_FOUND) + if(Vulkan_MoltenVK_LIBRARY AND NOT TARGET Vulkan::MoltenVK) + add_library(Vulkan::MoltenVK SHARED IMPORTED) + set_target_properties(Vulkan::MoltenVK + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_MoltenVK_INCLUDE_DIR}" + IMPORTED_LOCATION "${Vulkan_MoltenVK_LIBRARY}" + ) + endif() +endif() + +unset(_Vulkan_library_name) +unset(_Vulkan_SDK) +unset(_Vulkan_SDK_dirname) +unset(_Vulkan_hint_include_search_paths) +unset(_Vulkan_hint_executable_search_paths) +unset(_Vulkan_hint_library_search_paths) + +cmake_policy(POP) diff --git a/ktx/cmake/modules/Findassimp.cmake b/ktx/cmake/modules/Findassimp.cmake new file mode 100644 index 0000000..6a7fd3c --- /dev/null +++ b/ktx/cmake/modules/Findassimp.cmake @@ -0,0 +1,89 @@ +# Copyright 2020 Andreas Atteneder +# SPDX-License-Identifier: Apache-2.0 + +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(ASSIMP_ARCHITECTURE "64") +elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(ASSIMP_ARCHITECTURE "32") +endif(CMAKE_SIZEOF_VOID_P EQUAL 8) + +if(WIN32) + set(ASSIMP_ROOT_DIR CACHE PATH "ASSIMP root directory") + + # Find path of each library + find_path(ASSIMP_INCLUDE_DIR + NAMES + assimp/anim.h + HINTS + ${ASSIMP_ROOT_DIR}/include + ) + + if(MSVC12) + set(ASSIMP_MSVC_VERSION "vc120") + elseif(MSVC14) + set(ASSIMP_MSVC_VERSION "vc140") + endif(MSVC12) + + if(MSVC12 OR MSVC14) + + find_path(ASSIMP_LIBRARY_DIR + NAMES + assimp-${ASSIMP_MSVC_VERSION}-mt.lib + HINTS + ${ASSIMP_ROOT_DIR}/lib${ASSIMP_ARCHITECTURE} + ) + + find_library(ASSIMP_LIBRARY_RELEASE assimp-${ASSIMP_MSVC_VERSION}-mt.lib PATHS ${ASSIMP_LIBRARY_DIR}) + find_library(ASSIMP_LIBRARY_DEBUG assimp-${ASSIMP_MSVC_VERSION}-mtd.lib PATHS ${ASSIMP_LIBRARY_DIR}) + + set(ASSIMP_LIBRARY + optimized ${ASSIMP_LIBRARY_RELEASE} + debug ${ASSIMP_LIBRARY_DEBUG} + ) + + set(ASSIMP_LIBRARIES "ASSIMP_LIBRARY_RELEASE" "ASSIMP_LIBRARY_DEBUG") + + FUNCTION(ASSIMP_COPY_BINARIES TargetDirectory) + ADD_CUSTOM_TARGET(AssimpCopyBinaries + COMMAND ${CMAKE_COMMAND} -E copy ${ASSIMP_ROOT_DIR}/bin${ASSIMP_ARCHITECTURE}/assimp-${ASSIMP_MSVC_VERSION}-mtd.dll ${TargetDirectory}/Debug/assimp-${ASSIMP_MSVC_VERSION}-mtd.dll + COMMAND ${CMAKE_COMMAND} -E copy ${ASSIMP_ROOT_DIR}/bin${ASSIMP_ARCHITECTURE}/assimp-${ASSIMP_MSVC_VERSION}-mt.dll ${TargetDirectory}/Release/assimp-${ASSIMP_MSVC_VERSION}-mt.dll + COMMENT "Copying Assimp binaries to '${TargetDirectory}'" + VERBATIM) + ENDFUNCTION(ASSIMP_COPY_BINARIES) + + endif() + +else(WIN32) + + find_path( + assimp_INCLUDE_DIRS + NAMES assimp/postprocess.h assimp/scene.h assimp/version.h assimp/config.h assimp/cimport.h + PATHS /usr/local/include + PATHS /usr/include/ + + ) + + find_library( + assimp_LIBRARIES + NAMES assimp + PATHS /usr/local/lib/ + PATHS /usr/lib64/ + PATHS /usr/lib/ + ) + + if (assimp_INCLUDE_DIRS AND assimp_LIBRARIES) + SET(assimp_FOUND TRUE) + ENDIF (assimp_INCLUDE_DIRS AND assimp_LIBRARIES) + + if (assimp_FOUND) + if (NOT assimp_FIND_QUIETLY) + message(STATUS "Found asset importer library: ${assimp_LIBRARIES}") + endif (NOT assimp_FIND_QUIETLY) + else (assimp_FOUND) + if (assimp_FIND_REQUIRED) + message(FATAL_ERROR "Could not find asset importer library") + endif (assimp_FIND_REQUIRED) + endif (assimp_FOUND) + +endif(WIN32) + diff --git a/ktx/cmake/modules/Findsigntool.cmake b/ktx/cmake/modules/Findsigntool.cmake new file mode 100644 index 0000000..2ecafb4 --- /dev/null +++ b/ktx/cmake/modules/Findsigntool.cmake @@ -0,0 +1,135 @@ +#[============================================================================ +# Copyright 2022, Khronos Group, Inc. +# SPDX-License-Identifier: Apache-2.0 +#============================================================================] + +# Functions to convert unix-style paths into paths useable by cmake on windows. +#[=======================================================================[.rst: +Findsigntool +------- + +Finds the signtool executable used for codesigning on Windows. + +Note that signtool does not offer a way to make it print its version +so version selection and reporting is not possible. + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``signtool_FOUND`` + True if the system has the signtool executable. +``signtool_EXECUTABLE`` + The signtool command executable. + +#]=======================================================================] + +if (WIN32 AND CMAKE_HOST_SYSTEM_NAME MATCHES "CYGWIN.*") + find_program(CYGPATH + NAMES cygpath + HINTS [HKEY_LOCAL_MACHINE\\Software\\Cygwin\\setup;rootdir]/bin + PATHS C:/cygwin64/bin + C:/cygwin/bin + ) +endif () + +function(convert_cygwin_path _pathvar) + if (WIN32 AND CYGPATH) + execute_process( + COMMAND "${CYGPATH}" -m "${${_pathvar}}" + OUTPUT_VARIABLE ${_pathvar} + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + set(${_pathvar} "${${_pathvar}}" PARENT_SCOPE) + endif () +endfunction() + +function(convert_windows_path _pathvar) + if (CYGPATH) + execute_process( + COMMAND "${CYGPATH}" "${${_pathvar}}" + OUTPUT_VARIABLE ${_pathvar} + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + set(${_pathvar} "${${_pathvar}}" PARENT_SCOPE) + endif () +endfunction() + +# Make a list of Windows Kit versions with newer versions first. +# +# _root string KitsRoot for the Windows version whose kits to find. +# _versions variable name Variable in which to return the list of versions. +# +function(find_kits _winver _kit_versions) + set(${_kit_versions}) + set(_kit_root "KitsRoot${_winver}") + set(regkey "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots") + set(regval ${_kit_root}) + if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows") + # Note: must be a cache operation in order to read from the registry. + get_filename_component(_kits_path "[${regkey};${regval}]" + ABSOLUTE CACHE + ) + elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "CYGWIN.*") + # On Cygwin, CMake's built-in registry query won't work. + # Use Cygwin utility "regtool" instead. + execute_process(COMMAND regtool get "\\${regkey}\\${regval}" + OUTPUT_VARIABLE _kits_path} + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if (_kits_path) + convert_windows_path(_kits_path) + endif () + endif() + if (_kits_path) + file(GLOB ${_kit_versions} "${_kits_path}/bin/${_winver}.*") + # Reverse list, so newer versions (higher-numbered) appear first. + list(REVERSE ${_kit_versions}) + endif () + unset(_kits_path CACHE) + set(${_kit_versions} ${${_kit_versions}} PARENT_SCOPE) +endfunction() + +if (WIN32 AND NOT signtool_EXECUTABLE) + if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "AMD64") + set(arch "x64") + else() + set(arch ${CMAKE_HOST_SYSTEM_PROCESSOR}) + endif() + + # Look for latest signtool + foreach(winver 11 10) + find_kits(${winver} kit_versions) + if (kit_versions) + find_program(signtool_EXECUTABLE + NAMES signtool + PATHS ${kit_versions} + PATH_SUFFIXES ${arch} + bin/${arch} + bin + NO_DEFAULT_PATH + ) + if (signtool_EXECUTABLE) + break() + endif() + endif() + endforeach() + + if (signtool_EXECUTABLE) + mark_as_advanced (signtool_EXECUTABLE) + endif () + + # handle the QUIETLY and REQUIRED arguments and set *_FOUND to TRUE + # if all listed variables are found or TRUE + include (FindPackageHandleStandardArgs) + + find_package_handle_standard_args ( + signtool + REQUIRED_VARS + signtool_EXECUTABLE + FAIL_MESSAGE + "Could NOT find signtool. Will be unable to sign Windows binaries." + ) +endif() diff --git a/ktx/cmake/modules/Findzstd.cmake b/ktx/cmake/modules/Findzstd.cmake new file mode 100644 index 0000000..c4b8294 --- /dev/null +++ b/ktx/cmake/modules/Findzstd.cmake @@ -0,0 +1,33 @@ +# Copyright 2020 Andreas Atteneder +# SPDX-License-Identifier: Apache-2.0 + +# - Find zstd +# Find the zstd compression library and includes +# +# zstd_INCLUDE_DIRS - where to find zstd.h, etc. +# zstd_LIBRARIES - List of libraries when using zstd. +# zstd_FOUND - True if zstd found. + +find_path(zstd_INCLUDE_DIRS + NAMES zstd.h + HINTS ${zstd_ROOT_DIR}/include) + +find_library(zstd_LIBRARIES + NAMES zstd + HINTS ${zstd_ROOT_DIR}/lib) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(zstd DEFAULT_MSG zstd_LIBRARIES zstd_INCLUDE_DIRS) + +mark_as_advanced( + zstd_LIBRARIES + zstd_INCLUDE_DIRS) + +if(zstd_FOUND AND NOT (TARGET zstd::zstd)) + add_library (zstd::zstd UNKNOWN IMPORTED) + set_target_properties(zstd::zstd + PROPERTIES + IMPORTED_LOCATION ${zstd_LIBRARIES} + INTERFACE_INCLUDE_DIRECTORIES ${zstd_INCLUDE_DIRS}) +endif() + diff --git a/ktx/cmake/modules/GetGitRevisionDescription.cmake b/ktx/cmake/modules/GetGitRevisionDescription.cmake new file mode 100644 index 0000000..75d60b9 --- /dev/null +++ b/ktx/cmake/modules/GetGitRevisionDescription.cmake @@ -0,0 +1,175 @@ +# Copyright 2009-2010 Iowa State University +# SPDX-License-Identifier: BSL-1.0 + +# - Returns a version string from Git +# +# These functions force a re-configure on each git commit so that you can +# trust the values of the variables in your build system. +# +# get_git_head_revision( [ ...]) +# +# Returns the refspec and sha hash of the current head revision +# +# git_describe( [ ...]) +# +# Returns the results of git describe on the source tree, and adjusting +# the output so that it tests false if an error occurs. +# +# git_get_exact_tag( [ ...]) +# +# Returns the results of git describe --exact-match on the source tree, +# and adjusting the output so that it tests false if there was no exact +# matching tag. +# +# git_local_changes() +# +# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes. +# Uses the return code of "git diff-index --quiet HEAD --". +# Does not regard untracked files. +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +if(__get_git_revision_description) + return() +endif() +set(__get_git_revision_description YES) + +# We must run the following at "include" time, not at function call time, +# to find the path to this module rather than the path to a calling list file +get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) + +function(get_git_head_revision _refspecvar _hashvar) + set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories + set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") + get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) + if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) + # We have reached the root directory, we are not in git + set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + return() + endif() + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + endwhile() + # check if this is a submodule + if(NOT IS_DIRECTORY ${GIT_DIR}) + file(READ ${GIT_DIR} submodule) + string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) + get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) + get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) + endif() + if(NOT IS_DIRECTORY "${GIT_DIR}") + file(READ ${GIT_DIR} worktree) + string(REGEX REPLACE "gitdir: (.*)worktrees(.*)\n$" "\\1" GIT_DIR ${worktree}) + endif() + set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") + if(NOT EXISTS "${GIT_DATA}") + file(MAKE_DIRECTORY "${GIT_DATA}") + endif() + + if(NOT EXISTS "${GIT_DIR}/HEAD") + return() + endif() + set(HEAD_FILE "${GIT_DATA}/HEAD") + configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) + + configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" + "${GIT_DATA}/grabRef.cmake" + @ONLY) + include("${GIT_DATA}/grabRef.cmake") + + set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) + set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) +endfunction() + +function(git_describe _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) + return() + endif() + + # TODO sanitize + #if((${ARGN}" MATCHES "&&") OR + # (ARGN MATCHES "||") OR + # (ARGN MATCHES "\\;")) + # message("Please report the following error to the project!") + # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") + #endif() + + #message(STATUS "Arguments to execute_process: ${ARGN}") + + execute_process(COMMAND + "${GIT_EXECUTABLE}" + describe + ${hash} + ${ARGN} + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "${out}-${res}-NOTFOUND") + endif() + + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_get_exact_tag _var) + git_describe(out --exact-match ${ARGN}) + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_local_changes _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) + return() + endif() + + execute_process(COMMAND + "${GIT_EXECUTABLE}" + diff-index --quiet HEAD -- + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(res EQUAL 0) + set(${_var} "CLEAN" PARENT_SCOPE) + else() + set(${_var} "DIRTY" PARENT_SCOPE) + endif() +endfunction() diff --git a/ktx/cmake/modules/GetGitRevisionDescription.cmake.in b/ktx/cmake/modules/GetGitRevisionDescription.cmake.in new file mode 100644 index 0000000..f96dacf --- /dev/null +++ b/ktx/cmake/modules/GetGitRevisionDescription.cmake.in @@ -0,0 +1,44 @@ +# Copyright 2009-2010 Iowa State University +# SPDX-License-Identifier: BSL-1.0 + +# +# Internal file for GetGitRevisionDescription.cmake +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +set(HEAD_HASH) + +file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) + +string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +if(HEAD_CONTENTS MATCHES "ref") + # named branch + string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") + if(EXISTS "@GIT_DIR@/${HEAD_REF}") + configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) + else() + configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY) + file(READ "@GIT_DATA@/packed-refs" PACKED_REFS) + if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") + set(HEAD_HASH "${CMAKE_MATCH_1}") + endif() + endif() +else() + # detached HEAD + configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) +endif() + +if(NOT HEAD_HASH) + file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) + string(STRIP "${HEAD_HASH}" HEAD_HASH) +endif() diff --git a/ktx/cmake/modules/KtxDependentVariable.cmake b/ktx/cmake/modules/KtxDependentVariable.cmake new file mode 100644 index 0000000..2819afa --- /dev/null +++ b/ktx/cmake/modules/KtxDependentVariable.cmake @@ -0,0 +1,79 @@ +#[============================================================================ +# Copyright 2022, Khronos Group, Inc. +# SPDX-License-Identifier: Apache-2.0 +#============================================================================] + +#[=======================================================================[.rst: +KtxDependentVariable +-------------------- + +Macro to provide a cache variable dependent on other options. + +This macro presents the variable to the user only if a set of other +conditions are true. + +.. command:: dependent_variable + + .. code-block:: cmake + + KTX_DEPENDENT_VARIABLE( type "" ) + + Makes ```` available to the user if the + :ref:`semicolon-separated list ` of conditions in + ```` are all true. Otherwise, a local variable named ```` + is set to ````. + + When ```` is available, the given ```` and initial + ```` are used. Otherwise, any value set by the user is preserved for + when ```` is satisfied in the future. + + Note that the ```` variable only has a value which satisfies the + ```` condition within the scope of the caller because it is a local + variable. + +Example invocation: + +.. code-block:: cmake + + KTX_DEPENDENT_VARIABLE(USE_FOO STRING "Use Foo" "Default" "USE_BAR;NOT USE_ZOT" "") + +If ``USE_BAR`` is true and ``USE_ZOT`` is false, this provides an var called +``USE_FOO`` that defaults to Default. Otherwise, it sets ``USE_FOO`` to OFF and +hides the var from the user. If the status of ``USE_BAR`` or ``USE_ZOT`` +ever changes, any value for the ``USE_FOO`` var is saved so that when the +var is re-enabled it retains its old value. + +An important difference to CMakeDependentOption is that this does an early +out on false when processing the list of dependencies. This is so expressions +of dependencies based on a potentially unset variable do not fail when it +is unset. + +#]=======================================================================] + +macro(KTX_DEPENDENT_VARIABLE var type doc default depends force) + if(${var}_ISSET MATCHES "^${var}_ISSET$") + set(${var}_AVAILABLE 1) + foreach(d ${depends}) + cmake_language(EVAL CODE " + if (${d}) + else() + set(${var}_AVAILABLE 0) + endif()" + ) + if(NOT ${${var}_AVAILABLE}) + break() + endif() + endforeach() + if(${var}_AVAILABLE) + set(${var} "${${var}}" CACHE ${type} "${doc}" FORCE) + else() + if(${var} MATCHES "^${var}$") + else() + set(${var} "${${var}}" CACHE INTERNAL "${doc}") + endif() + set(${var} ${force}) + endif() + else() + set(${var} "${${var}_ISSET}") + endif() +endmacro() diff --git a/ktx/cmake/modules/NSIS.InstallOptions.ini.in b/ktx/cmake/modules/NSIS.InstallOptions.ini.in new file mode 100644 index 0000000..aed2df9 --- /dev/null +++ b/ktx/cmake/modules/NSIS.InstallOptions.ini.in @@ -0,0 +1,37 @@ +[Settings] +NumFields=4 + +[Field 1] +Type=label +Text=By default @CPACK_PACKAGE_INSTALL_DIRECTORY@ does not add its directory to the system PATH. +Left=0 +Right=-1 +Top=0 +Bottom=20 + +[Field 2] +Type=radiobutton +Text=Do not add @CPACK_PACKAGE_NAME@ to the system PATH +Left=0 +Right=-1 +Top=30 +Bottom=40 +State=1 + +[Field 3] +Type=radiobutton +Text=Add @CPACK_PACKAGE_NAME@ to the system PATH for all users +Left=0 +Right=-1 +Top=40 +Bottom=50 +State=0 + +[Field 4] +Type=radiobutton +Text=Add @CPACK_PACKAGE_NAME@ to the system PATH for current user +Left=0 +Right=-1 +Top=50 +Bottom=60 +State=0 diff --git a/ktx/cmake/modules/NSIS.template.in b/ktx/cmake/modules/NSIS.template.in new file mode 100644 index 0000000..c56cda1 --- /dev/null +++ b/ktx/cmake/modules/NSIS.template.in @@ -0,0 +1,987 @@ +; Copyright 2020 Andreas Atteneder +; SPDX-License-Identifier: Apache-2.0 + +; CPack install script designed for a nmake build + +;-------------------------------- +; You must define these values + + !define VERSION "@CPACK_PACKAGE_VERSION@" + !define PATCH "@CPACK_PACKAGE_VERSION_PATCH@" + !define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@" + +;-------------------------------- +;Variables + + Var MUI_TEMP + ;Var STARTMENU_FOLDER + Var SV_ALLUSERS + ;Var START_MENU + Var DO_NOT_ADD_TO_PATH + Var ADD_TO_PATH_ALL_USERS + Var ADD_TO_PATH_CURRENT_USER + Var INSTALL_DESKTOP + Var IS_DEFAULT_INSTALLDIR +;-------------------------------- +;Include Modern UI + + !include "MUI.nsh" + + ;Default installation folder + InstallDir "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" + +;-------------------------------- +;Signing + + !finalize '@CPACK_NSIS_FINALIZE_CMD@' + !uninstfinalize '@CPACK_NSIS_FINALIZE_CMD@' + +;-------------------------------- +;General + + ;Name and file + Name "@CPACK_NSIS_PACKAGE_NAME@" + OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@" + + ;Set compression + SetCompressor @CPACK_NSIS_COMPRESSOR@ + + ;Require administrator access + RequestExecutionLevel admin + +@CPACK_NSIS_DEFINES@ + + !include Sections.nsh + +;--- Component support macros: --- +; The code for the add/remove functionality is from: +; http://nsis.sourceforge.net/Add/Remove_Functionality +; It has been modified slightly and extended to provide +; inter-component dependencies. +Var AR_SecFlags +Var AR_RegFlags +@CPACK_NSIS_SECTION_SELECTED_VARS@ + +; Loads the "selected" flag for the section named SecName into the +; variable VarName. +!macro LoadSectionSelectedIntoVar SecName VarName + SectionGetFlags ${${SecName}} $${VarName} + IntOp $${VarName} $${VarName} & ${SF_SELECTED} ;Turn off all other bits +!macroend + +; Loads the value of a variable... can we get around this? +!macro LoadVar VarName + IntOp $R0 0 + $${VarName} +!macroend + +; Sets the value of a variable +!macro StoreVar VarName IntValue + IntOp $${VarName} 0 + ${IntValue} +!macroend + +!macro InitSection SecName + ; This macro reads component installed flag from the registry and + ;changes checked state of the section on the components page. + ;Input: section index constant name specified in Section command. + + ClearErrors + ;Reading component status from registry + ReadRegDWORD $AR_RegFlags HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" "Installed" + IfErrors "default_${SecName}" + ;Status will stay default if registry value not found + ;(component was never installed) + IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits + SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading default section flags + IntOp $AR_SecFlags $AR_SecFlags & 0xFFFE ;Turn lowest (enabled) bit off + IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags ;Change lowest bit + + ; Note whether this component was installed before + !insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags + IntOp $R0 $AR_RegFlags & $AR_RegFlags + + ;Writing modified flags + SectionSetFlags ${${SecName}} $AR_SecFlags + + "default_${SecName}:" + !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected +!macroend + +!macro FinishSection SecName + ; This macro reads section flag set by user and removes the section + ;if it is not selected. + ;Then it writes component installed flag to registry + ;Input: section index constant name specified in Section command. + + SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading section flags + ;Checking lowest bit: + IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED} + IntCmp $AR_SecFlags 1 "leave_${SecName}" + ;Section is not selected: + ;Calling Section uninstall macro and writing zero installed flag + !insertmacro "Remove_${${SecName}}" + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \ + "Installed" 0 + Goto "exit_${SecName}" + + "leave_${SecName}:" + ;Section is selected: + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \ + "Installed" 1 + + "exit_${SecName}:" +!macroend + +!macro RemoveSection_CPack SecName + ; This macro is used to call section's Remove_... macro + ;from the uninstaller. + ;Input: section index constant name specified in Section command. + + !insertmacro "Remove_${${SecName}}" +!macroend + +; Determine whether the selection of SecName changed +!macro MaybeSelectionChanged SecName + !insertmacro LoadVar ${SecName}_selected + SectionGetFlags ${${SecName}} $R1 + IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits + + ; See if the status has changed: + IntCmp $R0 $R1 "${SecName}_unchanged" + !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected + + IntCmp $R1 ${SF_SELECTED} "${SecName}_was_selected" + !insertmacro "Deselect_required_by_${SecName}" + goto "${SecName}_unchanged" + + "${SecName}_was_selected:" + !insertmacro "Select_${SecName}_depends" + + "${SecName}_unchanged:" +!macroend +;--- End of Add/Remove macros --- + +;-------------------------------- +;Interface Settings + + !define MUI_HEADERIMAGE + !define MUI_ABORTWARNING + +;---------------------------------------- +; based upon a script of "Written by KiCHiK 2003-01-18 05:57:02" +;---------------------------------------- +!verbose 3 +!include "WinMessages.NSH" +!verbose 4 +;==================================================== +; get_NT_environment +; Returns: the selected environment +; Output : head of the stack +;==================================================== +!macro select_NT_profile UN +Function ${UN}select_NT_profile + StrCmp $ADD_TO_PATH_ALL_USERS "1" 0 environment_single + DetailPrint "Selected environment for all users" + Push "all" + Return + environment_single: + DetailPrint "Selected environment for current user only." + Push "current" + Return +FunctionEnd +!macroend +!insertmacro select_NT_profile "" +!insertmacro select_NT_profile "un." +;---------------------------------------------------- +!define NT_current_env 'HKCU "Environment"' +!define NT_all_env 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' + +!ifndef WriteEnvStr_RegKey + !ifdef ALL_USERS + !define WriteEnvStr_RegKey \ + 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' + !else + !define WriteEnvStr_RegKey 'HKCU "Environment"' + !endif +!endif + +; AddToPath - Adds the given dir to the search path. +; Input - head of the stack +; Note - Win9x systems requires reboot + +Function AddToPath + Exch $0 + Push $1 + Push $2 + Push $3 + + # don't add if the path doesn't exist + IfFileExists "$0\*.*" "" AddToPath_done + + ReadEnvStr $1 PATH + ; if the path is too long for a NSIS variable NSIS will return a 0 + ; length string. If we find that, then warn and skip any path + ; modification as it will trash the existing path. + StrLen $2 $1 + IntCmp $2 0 CheckPathLength_ShowPathWarning CheckPathLength_Done CheckPathLength_Done + CheckPathLength_ShowPathWarning: + Messagebox MB_OK|MB_ICONEXCLAMATION "Warning! PATH too long installer unable to modify PATH!" + Goto AddToPath_done + CheckPathLength_Done: + Push "$1;" + Push "$0;" + Call StrStr + Pop $2 + StrCmp $2 "" "" AddToPath_done + Push "$1;" + Push "$0\;" + Call StrStr + Pop $2 + StrCmp $2 "" "" AddToPath_done + GetFullPathName /SHORT $3 $0 + Push "$1;" + Push "$3;" + Call StrStr + Pop $2 + StrCmp $2 "" "" AddToPath_done + Push "$1;" + Push "$3\;" + Call StrStr + Pop $2 + StrCmp $2 "" "" AddToPath_done + + Call IsNT + Pop $1 + StrCmp $1 1 AddToPath_NT + ; Not on NT + StrCpy $1 $WINDIR 2 + FileOpen $1 "$1\autoexec.bat" a + FileSeek $1 -1 END + FileReadByte $1 $2 + IntCmp $2 26 0 +2 +2 # DOS EOF + FileSeek $1 -1 END # write over EOF + FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n" + FileClose $1 + SetRebootFlag true + Goto AddToPath_done + + AddToPath_NT: + StrCmp $ADD_TO_PATH_ALL_USERS "1" ReadAllKey + ReadRegStr $1 ${NT_current_env} "PATH" + Goto DoTrim + ReadAllKey: + ReadRegStr $1 ${NT_all_env} "PATH" + DoTrim: + StrCmp $1 "" AddToPath_NTdoIt + Push $1 + Call Trim + Pop $1 + StrCpy $0 "$1;$0" + AddToPath_NTdoIt: + StrCmp $ADD_TO_PATH_ALL_USERS "1" WriteAllKey + WriteRegExpandStr ${NT_current_env} "PATH" $0 + Goto DoSend + WriteAllKey: + WriteRegExpandStr ${NT_all_env} "PATH" $0 + DoSend: + SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 + + AddToPath_done: + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + + +; RemoveFromPath - Remove a given dir from the path +; Input: head of the stack + +Function un.RemoveFromPath + Exch $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + + IntFmt $6 "%c" 26 # DOS EOF + + Call un.IsNT + Pop $1 + StrCmp $1 1 unRemoveFromPath_NT + ; Not on NT + StrCpy $1 $WINDIR 2 + FileOpen $1 "$1\autoexec.bat" r + GetTempFileName $4 + FileOpen $2 $4 w + GetFullPathName /SHORT $0 $0 + StrCpy $0 "SET PATH=%PATH%;$0" + Goto unRemoveFromPath_dosLoop + + unRemoveFromPath_dosLoop: + FileRead $1 $3 + StrCpy $5 $3 1 -1 # read last char + StrCmp $5 $6 0 +2 # if DOS EOF + StrCpy $3 $3 -1 # remove DOS EOF so we can compare + StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine + StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine + StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine + StrCmp $3 "" unRemoveFromPath_dosLoopEnd + FileWrite $2 $3 + Goto unRemoveFromPath_dosLoop + unRemoveFromPath_dosLoopRemoveLine: + SetRebootFlag true + Goto unRemoveFromPath_dosLoop + + unRemoveFromPath_dosLoopEnd: + FileClose $2 + FileClose $1 + StrCpy $1 $WINDIR 2 + Delete "$1\autoexec.bat" + CopyFiles /SILENT $4 "$1\autoexec.bat" + Delete $4 + Goto unRemoveFromPath_done + + unRemoveFromPath_NT: + StrCmp $ADD_TO_PATH_ALL_USERS "1" unReadAllKey + ReadRegStr $1 ${NT_current_env} "PATH" + Goto unDoTrim + unReadAllKey: + ReadRegStr $1 ${NT_all_env} "PATH" + unDoTrim: + StrCpy $5 $1 1 -1 # copy last char + StrCmp $5 ";" +2 # if last char != ; + StrCpy $1 "$1;" # append ; + Push $1 + Push "$0;" + Call un.StrStr ; Find `$0;` in $1 + Pop $2 ; pos of our dir + StrCmp $2 "" unRemoveFromPath_done + ; else, it is in path + # $0 - path to add + # $1 - path var + StrLen $3 "$0;" + StrLen $4 $2 + StrCpy $5 $1 -$4 # $5 is now the part before the path to remove + StrCpy $6 $2 "" $3 # $6 is now the part after the path to remove + StrCpy $3 $5$6 + + StrCpy $5 $3 1 -1 # copy last char + StrCmp $5 ";" 0 +2 # if last char == ; + StrCpy $3 $3 -1 # remove last char + + StrCmp $ADD_TO_PATH_ALL_USERS "1" unWriteAllKey + WriteRegExpandStr ${NT_current_env} "PATH" $3 + Goto unDoSend + unWriteAllKey: + WriteRegExpandStr ${NT_all_env} "PATH" $3 + unDoSend: + SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 + + unRemoveFromPath_done: + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Uninstall sutff +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +########################################### +# Utility Functions # +########################################### + +;==================================================== +; IsNT - Returns 1 if the current system is NT, 0 +; otherwise. +; Output: head of the stack +;==================================================== +; IsNT +; no input +; output, top of the stack = 1 if NT or 0 if not +; +; Usage: +; Call IsNT +; Pop $R0 +; ($R0 at this point is 1 or 0) + +!macro IsNT un +Function ${un}IsNT + Push $0 + ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion + StrCmp $0 "" 0 IsNT_yes + ; we are not NT. + Pop $0 + Push 0 + Return + + IsNT_yes: + ; NT!!! + Pop $0 + Push 1 +FunctionEnd +!macroend +!insertmacro IsNT "" +!insertmacro IsNT "un." + +; StrStr +; input, top of stack = string to search for +; top of stack-1 = string to search in +; output, top of stack (replaces with the portion of the string remaining) +; modifies no other variables. +; +; Usage: +; Push "this is a long ass string" +; Push "ass" +; Call StrStr +; Pop $R0 +; ($R0 at this point is "ass string") + +!macro StrStr un +Function ${un}StrStr +Exch $R1 ; st=haystack,old$R1, $R1=needle + Exch ; st=old$R1,haystack + Exch $R2 ; st=old$R1,old$R2, $R2=haystack + Push $R3 + Push $R4 + Push $R5 + StrLen $R3 $R1 + StrCpy $R4 0 + ; $R1=needle + ; $R2=haystack + ; $R3=len(needle) + ; $R4=cnt + ; $R5=tmp + loop: + StrCpy $R5 $R2 $R3 $R4 + StrCmp $R5 $R1 done + StrCmp $R5 "" done + IntOp $R4 $R4 + 1 + Goto loop +done: + StrCpy $R1 $R2 "" $R4 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Exch $R1 +FunctionEnd +!macroend +!insertmacro StrStr "" +!insertmacro StrStr "un." + +Function Trim ; Added by Pelaca + Exch $R1 + Push $R2 +Loop: + StrCpy $R2 "$R1" 1 -1 + StrCmp "$R2" " " RTrim + StrCmp "$R2" "$\n" RTrim + StrCmp "$R2" "$\r" RTrim + StrCmp "$R2" ";" RTrim + GoTo Done +RTrim: + StrCpy $R1 "$R1" -1 + Goto Loop +Done: + Pop $R2 + Exch $R1 +FunctionEnd + +Function ConditionalAddToRegisty + Pop $0 + Pop $1 + StrCmp "$0" "" ConditionalAddToRegisty_EmptyString + WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \ + "$1" "$0" + ;MessageBox MB_OK "Set Registry: '$1' to '$0'" + DetailPrint "Set install registry entry: '$1' to '$0'" + ConditionalAddToRegisty_EmptyString: +FunctionEnd + +;-------------------------------- + +!ifdef CPACK_USES_DOWNLOAD +Function DownloadFile + IfFileExists $INSTDIR\* +2 + CreateDirectory $INSTDIR + Pop $0 + + ; Skip if already downloaded + IfFileExists $INSTDIR\$0 0 +2 + Return + + StrCpy $1 "@CPACK_DOWNLOAD_SITE@" + + try_again: + NSISdl::download "$1/$0" "$INSTDIR\$0" + + Pop $1 + StrCmp $1 "success" success + StrCmp $1 "Cancelled" cancel + MessageBox MB_OK "Download failed: $1" + cancel: + Return + success: +FunctionEnd +!endif + +;-------------------------------- +; Define some macro setting for the gui +@CPACK_NSIS_INSTALLER_MUI_ICON_CODE@ +@CPACK_NSIS_INSTALLER_ICON_CODE@ +@CPACK_NSIS_INSTALLER_MUI_WELCOMEFINISH_CODE@ +@CPACK_NSIS_INSTALLER_MUI_UNWELCOMEFINISH_CODE@ +@CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@ +@CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE@ + +;-------------------------------- +;Pages + @CPACK_NSIS_INSTALLER_WELCOME_TITLE_CODE@ + @CPACK_NSIS_INSTALLER_WELCOME_TITLE_3LINES_CODE@ + !insertmacro MUI_PAGE_WELCOME + + !insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@" + Page custom InstallOptionsPage + !insertmacro MUI_PAGE_DIRECTORY + + ;Start Menu Folder Page Configuration + ;!define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX" + ;!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" + ;!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" + ;!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER + + @CPACK_NSIS_PAGE_COMPONENTS@ + + !insertmacro MUI_PAGE_INSTFILES + @CPACK_NSIS_INSTALLER_FINISH_TITLE_CODE@ + @CPACK_NSIS_INSTALLER_FINISH_TITLE_3LINES_CODE@ + !insertmacro MUI_PAGE_FINISH + + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + +;-------------------------------- +;Languages + + !insertmacro MUI_LANGUAGE "English" ;first language is the default language + !insertmacro MUI_LANGUAGE "Albanian" + !insertmacro MUI_LANGUAGE "Arabic" + !insertmacro MUI_LANGUAGE "Basque" + !insertmacro MUI_LANGUAGE "Belarusian" + !insertmacro MUI_LANGUAGE "Bosnian" + !insertmacro MUI_LANGUAGE "Breton" + !insertmacro MUI_LANGUAGE "Bulgarian" + !insertmacro MUI_LANGUAGE "Croatian" + !insertmacro MUI_LANGUAGE "Czech" + !insertmacro MUI_LANGUAGE "Danish" + !insertmacro MUI_LANGUAGE "Dutch" + !insertmacro MUI_LANGUAGE "Estonian" + !insertmacro MUI_LANGUAGE "Farsi" + !insertmacro MUI_LANGUAGE "Finnish" + !insertmacro MUI_LANGUAGE "French" + !insertmacro MUI_LANGUAGE "German" + !insertmacro MUI_LANGUAGE "Greek" + !insertmacro MUI_LANGUAGE "Hebrew" + !insertmacro MUI_LANGUAGE "Hungarian" + !insertmacro MUI_LANGUAGE "Icelandic" + !insertmacro MUI_LANGUAGE "Indonesian" + !insertmacro MUI_LANGUAGE "Irish" + !insertmacro MUI_LANGUAGE "Italian" + !insertmacro MUI_LANGUAGE "Japanese" + !insertmacro MUI_LANGUAGE "Korean" + !insertmacro MUI_LANGUAGE "Kurdish" + !insertmacro MUI_LANGUAGE "Latvian" + !insertmacro MUI_LANGUAGE "Lithuanian" + !insertmacro MUI_LANGUAGE "Luxembourgish" + !insertmacro MUI_LANGUAGE "Macedonian" + !insertmacro MUI_LANGUAGE "Malay" + !insertmacro MUI_LANGUAGE "Mongolian" + !insertmacro MUI_LANGUAGE "Norwegian" + !insertmacro MUI_LANGUAGE "Polish" + !insertmacro MUI_LANGUAGE "Portuguese" + !insertmacro MUI_LANGUAGE "PortugueseBR" + !insertmacro MUI_LANGUAGE "Romanian" + !insertmacro MUI_LANGUAGE "Russian" + !insertmacro MUI_LANGUAGE "Serbian" + !insertmacro MUI_LANGUAGE "SerbianLatin" + !insertmacro MUI_LANGUAGE "SimpChinese" + !insertmacro MUI_LANGUAGE "Slovak" + !insertmacro MUI_LANGUAGE "Slovenian" + !insertmacro MUI_LANGUAGE "Spanish" + !insertmacro MUI_LANGUAGE "Swedish" + !insertmacro MUI_LANGUAGE "Thai" + !insertmacro MUI_LANGUAGE "TradChinese" + !insertmacro MUI_LANGUAGE "Turkish" + !insertmacro MUI_LANGUAGE "Ukrainian" + !insertmacro MUI_LANGUAGE "Welsh" + +;-------------------------------- +;Reserve Files + + ;These files should be inserted before other files in the data block + ;Keep these lines before any File command + ;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA) + + ReserveFile "NSIS.InstallOptions.ini" + !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS + + ; for UserInfo::GetName and UserInfo::GetAccountType + ReserveFile /plugin 'UserInfo.dll' + +;-------------------------------- +; Installation types +@CPACK_NSIS_INSTALLATION_TYPES@ + +;-------------------------------- +; Component sections +@CPACK_NSIS_COMPONENT_SECTIONS@ + +;-------------------------------- +;Installer Sections + +Section "-Core installation" + ;Use the entire tree produced by the INSTALL target. Keep the + ;list of directories here in sync with the RMDir commands below. + SetOutPath "$INSTDIR" + @CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS@ + @CPACK_NSIS_FULL_INSTALL@ + + ;Store installation folder + WriteRegStr SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "" $INSTDIR + + ;Create uninstaller + WriteUninstaller "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe" + Push "DisplayName" + Push "@CPACK_NSIS_DISPLAY_NAME@" + Call ConditionalAddToRegisty + Push "DisplayVersion" + Push "@CPACK_PACKAGE_VERSION@" + Call ConditionalAddToRegisty + Push "Publisher" + Push "@CPACK_PACKAGE_VENDOR@" + Call ConditionalAddToRegisty + Push "UninstallString" + Push "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe" + Call ConditionalAddToRegisty + Push "NoRepair" + Push "1" + Call ConditionalAddToRegisty + + !ifdef CPACK_NSIS_ADD_REMOVE + ;Create add/remove functionality + Push "ModifyPath" + Push "$INSTDIR\AddRemove.exe" + Call ConditionalAddToRegisty + !else + Push "NoModify" + Push "1" + Call ConditionalAddToRegisty + !endif + + ; Optional registration + Push "DisplayIcon" + Push "$INSTDIR\@CPACK_NSIS_INSTALLED_ICON_NAME@" + Call ConditionalAddToRegisty + Push "HelpLink" + Push "@CPACK_NSIS_HELP_LINK@" + Call ConditionalAddToRegisty + Push "URLInfoAbout" + Push "@CPACK_NSIS_URL_INFO_ABOUT@" + Call ConditionalAddToRegisty + Push "Contact" + Push "@CPACK_NSIS_CONTACT@" + Call ConditionalAddToRegisty + ;!insertmacro MUI_INSTALLOPTIONS_READ $INSTALL_DESKTOP "NSIS.InstallOptions.ini" "Field 5" "State" + ;!insertmacro MUI_STARTMENU_WRITE_BEGIN Application + + ;Create shortcuts + ;CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" +;@CPACK_NSIS_CREATE_ICONS@ +;@CPACK_NSIS_CREATE_ICONS_EXTRA@ + ;CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe" + + ;Read a value from an InstallOptions INI file + !insertmacro MUI_INSTALLOPTIONS_READ $DO_NOT_ADD_TO_PATH "NSIS.InstallOptions.ini" "Field 2" "State" + !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_ALL_USERS "NSIS.InstallOptions.ini" "Field 3" "State" + !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_CURRENT_USER "NSIS.InstallOptions.ini" "Field 4" "State" + + ; Write special uninstall registry entries + ;Push "StartMenu" + ;Push "$STARTMENU_FOLDER" + ;Call ConditionalAddToRegisty + ;Push "DoNotAddToPath" + ;Push "$DO_NOT_ADD_TO_PATH" + ;Call ConditionalAddToRegisty + ;Push "AddToPathAllUsers" + ;Push "$ADD_TO_PATH_ALL_USERS" + ;Call ConditionalAddToRegisty + ;Push "AddToPathCurrentUser" + ;Push "$ADD_TO_PATH_CURRENT_USER" + ;Call ConditionalAddToRegisty + ;Push "InstallToDesktop" + ;Push "$INSTALL_DESKTOP" + ;Call ConditionalAddToRegisty + + !insertmacro MUI_STARTMENU_WRITE_END + +@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@ + +SectionEnd + +Section "-Add to path" + Push $INSTDIR\bin + StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 doNotAddToPath + StrCmp $DO_NOT_ADD_TO_PATH "1" doNotAddToPath 0 + Call AddToPath + doNotAddToPath: +SectionEnd + +;-------------------------------- +; Create custom pages +Function InstallOptionsPage + !insertmacro MUI_HEADER_TEXT "Install Options" "Choose options for installing @CPACK_NSIS_PACKAGE_NAME@" + !insertmacro MUI_INSTALLOPTIONS_DISPLAY "NSIS.InstallOptions.ini" + +FunctionEnd + +;-------------------------------- +; determine admin versus local install +Function un.onInit + + ClearErrors + UserInfo::GetName + IfErrors noLM + Pop $0 + UserInfo::GetAccountType + Pop $1 + StrCmp $1 "Admin" 0 +3 + SetShellVarContext all + ;MessageBox MB_OK 'User "$0" is in the Admin group' + Goto done + StrCmp $1 "Power" 0 +3 + SetShellVarContext all + ;MessageBox MB_OK 'User "$0" is in the Power Users group' + Goto done + + noLM: + ;Get installation folder from registry if available + + done: + +FunctionEnd + +;--- Add/Remove callback functions: --- +!macro SectionList MacroName + ;This macro used to perform operation on multiple sections. + ;List all of your components in following manner here. +@CPACK_NSIS_COMPONENT_SECTION_LIST@ +!macroend + +Section -FinishComponents + ;Removes unselected components and writes component status to registry + !insertmacro SectionList "FinishSection" + +!ifdef CPACK_NSIS_ADD_REMOVE + ; Get the name of the installer executable + System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1' + StrCpy $R3 $R0 + + ; Strip off the last 13 characters, to see if we have AddRemove.exe + StrLen $R1 $R0 + IntOp $R1 $R0 - 13 + StrCpy $R2 $R0 13 $R1 + StrCmp $R2 "AddRemove.exe" addremove_installed + + ; We're not running AddRemove.exe, so install it + CopyFiles $R3 $INSTDIR\AddRemove.exe + + addremove_installed: +!endif +SectionEnd +;--- End of Add/Remove callback functions --- + +;-------------------------------- +; Component dependencies +Function .onSelChange + !insertmacro SectionList MaybeSelectionChanged +FunctionEnd + +;-------------------------------- +;Uninstaller Section + +Section "Uninstall" + ;ReadRegStr $START_MENU SHCTX \ + ; "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "StartMenu" + ;MessageBox MB_OK "Start menu is in: $START_MENU" + ReadRegStr $DO_NOT_ADD_TO_PATH SHCTX \ + "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "DoNotAddToPath" + ReadRegStr $ADD_TO_PATH_ALL_USERS SHCTX \ + "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathAllUsers" + ReadRegStr $ADD_TO_PATH_CURRENT_USER SHCTX \ + "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathCurrentUser" + ;MessageBox MB_OK "Add to path: $DO_NOT_ADD_TO_PATH all users: $ADD_TO_PATH_ALL_USERS" + ;ReadRegStr $INSTALL_DESKTOP SHCTX \ + ; "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "InstallToDesktop" + ;MessageBox MB_OK "Install to desktop: $INSTALL_DESKTOP " + +@CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@ + + ;Remove files we installed. + ;Keep the list of directories here in sync with the File commands above. +@CPACK_NSIS_DELETE_FILES@ +@CPACK_NSIS_DELETE_DIRECTORIES@ + +!ifdef CPACK_NSIS_ADD_REMOVE + ;Remove the add/remove program + Delete "$INSTDIR\AddRemove.exe" +!endif + + ;Remove the uninstaller itself. + Delete "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe" + DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" + + ;Remove the installation directory if it is empty. + RMDir "$INSTDIR" + + ; Remove the registry entries. + DeleteRegKey SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" + + ; Removes all optional components + !insertmacro SectionList "RemoveSection_CPack" + + ;!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP + + Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk" +@CPACK_NSIS_DELETE_ICONS@ +@CPACK_NSIS_DELETE_ICONS_EXTRA@ + + ;Delete empty start menu parent directories + StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" + +; startMenuDeleteLoop: +; ClearErrors +; RMDir $MUI_TEMP +; GetFullPathName $MUI_TEMP "$MUI_TEMP\.." +; +; IfErrors startMenuDeleteLoopDone +; +; StrCmp "$MUI_TEMP" "$SMPROGRAMS" startMenuDeleteLoopDone startMenuDeleteLoop +; startMenuDeleteLoopDone: + + ; If the user changed the shortcut, then untinstall may not work. This should + ; try to fix it. + ;StrCpy $MUI_TEMP "$START_MENU" + ;Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk" +@CPACK_NSIS_DELETE_ICONS_EXTRA@ + + ;Delete empty start menu parent directories + StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" + +; secondStartMenuDeleteLoop: +; ClearErrors +; RMDir $MUI_TEMP +; GetFullPathName $MUI_TEMP "$MUI_TEMP\.." +; +; IfErrors secondStartMenuDeleteLoopDone +; +; StrCmp "$MUI_TEMP" "$SMPROGRAMS" secondStartMenuDeleteLoopDone secondStartMenuDeleteLoop +; secondStartMenuDeleteLoopDone: + + DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" + + Push $INSTDIR\bin + StrCmp $DO_NOT_ADD_TO_PATH_ "1" doNotRemoveFromPath 0 + Call un.RemoveFromPath + doNotRemoveFromPath: +SectionEnd + +;-------------------------------- +; determine admin versus local install +; Is install for "AllUsers" or "JustMe"? +; Default to "JustMe" - set to "AllUsers" if admin or on Win9x +; This function is used for the very first "custom page" of the installer. +; This custom page does not show up visibly, but it executes prior to the +; first visible page and sets up $INSTDIR properly... +; Choose different default installation folder based on SV_ALLUSERS... +; "Program Files" for AllUsers, "My Documents" for JustMe... + +Function .onInit + StrCmp "@CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL@" "ON" 0 inst + + ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "UninstallString" + StrCmp $0 "" inst + + MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \ + "@CPACK_NSIS_PACKAGE_NAME@ is already installed. $\n$\nDo you want to uninstall the old version before installing the new one?" \ + /SD IDYES IDYES uninst IDNO inst + Abort + +;Run the uninstaller +uninst: + ClearErrors + StrLen $2 "\Uninstall.exe" + StrCpy $3 $0 -$2 # remove "\Uninstall.exe" from UninstallString to get path + ExecWait '"$0" /S _?=$3' ;Do not copy the uninstaller to a temp file + + IfErrors uninst_failed inst +uninst_failed: + MessageBox MB_OK|MB_ICONSTOP "Uninstall failed." + Abort + + +inst: + ; Reads components status for registry + !insertmacro SectionList "InitSection" + + ; check to see if /D has been used to change + ; the install directory by comparing it to the + ; install directory that is expected to be the + ; default + StrCpy $IS_DEFAULT_INSTALLDIR 0 + StrCmp "$INSTDIR" "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" 0 +2 + StrCpy $IS_DEFAULT_INSTALLDIR 1 + + StrCpy $SV_ALLUSERS "JustMe" + ; if default install dir then change the default + ; if it is installed for JustMe + StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2 + StrCpy $INSTDIR "$DOCUMENTS\@CPACK_PACKAGE_INSTALL_DIRECTORY@" + + ClearErrors + UserInfo::GetName + IfErrors noLM + Pop $0 + UserInfo::GetAccountType + Pop $1 + StrCmp $1 "Admin" 0 +4 + SetShellVarContext all + ;MessageBox MB_OK 'User "$0" is in the Admin group' + StrCpy $SV_ALLUSERS "AllUsers" + Goto done + StrCmp $1 "Power" 0 +4 + SetShellVarContext all + ;MessageBox MB_OK 'User "$0" is in the Power Users group' + StrCpy $SV_ALLUSERS "AllUsers" + Goto done + + noLM: + StrCpy $SV_ALLUSERS "AllUsers" + ;Get installation folder from registry if available + + done: + StrCmp $SV_ALLUSERS "AllUsers" 0 +3 + StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2 + StrCpy $INSTDIR "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" + + StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 noOptionsPage + !insertmacro MUI_INSTALLOPTIONS_EXTRACT "NSIS.InstallOptions.ini" + + noOptionsPage: +FunctionEnd diff --git a/ktx/cmake/version.cmake b/ktx/cmake/version.cmake new file mode 100644 index 0000000..b349b75 --- /dev/null +++ b/ktx/cmake/version.cmake @@ -0,0 +1,209 @@ +# Copyright 2020 Andreas Atteneder +# SPDX-License-Identifier: Apache-2.0 + +# +# Retrieving the current version from GIT tags +# + +include(GetGitRevisionDescription) + +function(git_update_index) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + execute_process(COMMAND + "${GIT_EXECUTABLE}" + update-index -q --refresh + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + ) + if(NOT res EQUAL 0) + message(SEND_ERROR "git update-index not successful") + endif() +endfunction() + +function(git_describe_raw _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + + execute_process(COMMAND + "${GIT_EXECUTABLE}" + describe + ${ARGN} + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + #ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "exitcode-${res}-NOTFOUND") + endif() + + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_rev_list target_path _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + execute_process(COMMAND + "${GIT_EXECUTABLE}" + rev-list -1 HEAD ${target_path} + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(NOT res EQUAL 0) + message(SEND_ERROR "git update-index not successful") + endif() + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_dirty _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + execute_process(COMMAND + diff-index --name-only HEAD -- + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + ) + set(${_var} "${res}" PARENT_SCOPE) +endfunction() + + +function(generate_version _var ) + if(${ARGC} GREATER 1) + set(target_path ${ARGN}) + git_rev_list(${target_path} KTX_REV) + git_describe_raw(KTX_VERSION --contains --match v[0-9]* ${KTX_REV}) + if(NOT KTX_VERSION) + git_describe_raw(KTX_VERSION "--match" "v[0-9]*" ${KTX_REV}) + endif() + else() + git_describe_raw(KTX_VERSION "--match" "v[0-9]*" "HEAD" ) + endif() + + git_update_index() + git_dirty(GIT_DIRTY) + if(GIT_DIRTY) + set(KTX_VERSION ${KTX_VERSION}-dirty) + endif() + set(${_var} "${KTX_VERSION}" PARENT_SCOPE) +endfunction() + +# Get latest tag from git if not passed to cmake +# This property can be passed to cmake when building from tar.gz +if(NOT KTX_GIT_VERSION_FULL) + git_describe_raw(KTX_GIT_VERSION_FULL --abbrev=0 --match v[0-9]*) +endif() +#message("KTX git full version: ${KTX_GIT_VERSION_FULL}") + +# generate_version(TOKTX_VERSION tools/toktx) +# message("TOKTX_VERSION: ${TOKTX_VERSION}") + +# First try a full regex ( vMAJOR.MINOR.PATCH-TWEAK ) +string(REGEX MATCH "^v([0-9]*)\.([0-9]*)\.([0-9]*)(-[^\.]*)" + KTX_VERSION ${KTX_GIT_VERSION_FULL}) + +if(KTX_VERSION) + set(KTX_VERSION_MAJOR ${CMAKE_MATCH_1}) + set(KTX_VERSION_MINOR ${CMAKE_MATCH_2}) + set(KTX_VERSION_PATCH ${CMAKE_MATCH_3}) + set(KTX_VERSION_TWEAK ${CMAKE_MATCH_4}) +else() + # If full regex failed, go for vMAJOR.MINOR.PATCH + string(REGEX MATCH "^v([0-9]*)\.([0-9]*)\.([^\.]*)" + KTX_VERSION ${KTX_GIT_VERSION_FULL}) + + if(KTX_VERSION) + set(KTX_VERSION_MAJOR ${CMAKE_MATCH_1}) + set(KTX_VERSION_MINOR ${CMAKE_MATCH_2}) + set(KTX_VERSION_PATCH ${CMAKE_MATCH_3}) + + string(REGEX MATCH "^[0-9]*$" + KTX_VERSION_PATCH_INT ${KTX_VERSION_PATCH}) + + if(KTX_VERSION_PATCH_INT) + set(KTX_VERSION_TWEAK "") + else() + if(KTX_VERSION_PATCH) + set(KTX_VERSION_TWEAK "-${KTX_VERSION_PATCH}") + else() + set(KTX_VERSION_TWEAK "") + endif() + set(KTX_VERSION_PATCH "0") + endif() + else() + message(WARNING "Error retrieving version from GIT tag. Falling back to 0.0.0-noversion ") + set(KTX_VERSION_MAJOR "0" ) + set(KTX_VERSION_MINOR "0" ) + set(KTX_VERSION_PATCH "0" ) + set(KTX_VERSION_TWEAK "-noversion" ) + endif() +endif() + +set(KTX_VERSION ${KTX_VERSION_MAJOR}.${KTX_VERSION_MINOR}.${KTX_VERSION_PATCH}) +set(KTX_VERSION_FULL ${KTX_VERSION}${KTX_VERSION_TWEAK}) + +#message("KTX version: ${KTX_VERSION} major:${KTX_VERSION_MAJOR} minor:${KTX_VERSION_MINOR} patch:${KTX_VERSION_PATCH} tweak:${KTX_VERSION_TWEAK}") + + +# +# Create a version.h header file using the mkversion shell script. +# Dignum memoria (worth remembering): you need to run CMake config +# after adding a new tag or making a software change in order for the +# version to be updated. +# + +function( create_version_header dest_path target ) + + set( version_h_output ${PROJECT_SOURCE_DIR}/${dest_path}/version.h) + + if(CMAKE_HOST_WIN32) + add_custom_command( + OUTPUT ${version_h_output} + # On Windows this command has to be invoked by a shell in order to work + COMMAND ${BASH_EXECUTABLE} -c "\"scripts/mkversion\" \"-v\" \"${KTX_GIT_VERSION_FULL}\" \"-o\" \"version.h\" \"${dest_path}\"" + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + COMMENT "Generate ${version_h_output}" + VERBATIM + ) + else() + add_custom_command( + OUTPUT ${version_h_output} + COMMAND scripts/mkversion -v ${KTX_GIT_VERSION_FULL} -o version.h ${dest_path} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + COMMENT "Generate ${version_h_output}" + VERBATIM + ) + endif() + + set( version_target ${target}_version ) + add_custom_target( ${version_target} DEPENDS ${version_h_output} ) + add_dependencies( ${target} ${version_target} ) + target_sources( ${target} PRIVATE ${version_h_output} ) + +endfunction() + +function( create_version_file ) + file(WRITE ${PROJECT_BINARY_DIR}/ktx.version "${KTX_VERSION_FULL}") +endfunction() + +# vim:ai:ts=4:sts=4:sw=2:expandtab:textwidth=70 diff --git a/ktx/examples/vkload.cpp b/ktx/examples/vkload.cpp new file mode 100644 index 0000000..a9f77f6 --- /dev/null +++ b/ktx/examples/vkload.cpp @@ -0,0 +1,150 @@ +// Copyright 2018-2020 The Khronos Group Inc. +// SPDX-License-Identifier: Apache-2.0 + +#include +#include +// Use c++ to keep the example short. Not required. +#include + +class Texture { + public: + Texture(const std::string ktxfile); + ~Texture(); + + protected: + ktxVulkanTexture texture; + vk::PhysicalDevice gpu; + vk::Device device; + vk::Queue queue; + vk::CommandPool commandPool; + + cleanup(); + prepareSamplerAndView(); +}; + +Texture::Texture(const std::string ktxfile) +{ + ktxVulkanDeviceInfo kvdi; + ktxTexture* kTexture; + KTX_error_code ktxresult; + + createVulkanInstance(); + findVulkanGpu(); // Find a suitable physical device + createVulkanSurface(); + createVulkanDevice(); + prepareVulkanSwapchain(); + /* + . + . + . + */ + + // This structure is used to pass the Vulkan device information to the loader + // with the expectation that app's will typically load many textures. + ktxVulkanDeviceInfo_Construct(&kvdi, gpu, device, queue, commandPool, nullptr); + + ktxresult = ktxTexture_CreateFromNamedFile( + (getAssetPath() + ktxfile).c_str(), + KTX_TEXTURE_CREATE_NO_FLAGS, + &kTexture); + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "Creation of ktxTexture from \"" << getAssetPath() + << ktxfile << "\" failed: " << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } + ktxresult = ktxTexture_VkUploadEx(kTexture, &kvdi, &texture, + VK_IMAGE_TILING_OPTIMAL, + VK_IMAGE_USAGE_SAMPLED_BIT, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "ktxTexture_VkUpload failed: " << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } + + char* pValue; + uint32_t valueLen; + if (KTX_SUCCESS == ktxHashTable_FindValue(&kTexture->kvDataHead, + KTX_ORIENTATION_KEY, + &valueLen, (void**)&pValue)) + { + char s, t; + + if (sscanf(pValue, KTX_ORIENTATION2_FMT, &s, &t) == 2) { + if (s == 'l') sign_s = -1; + if (t == 'u') sign_t = -1; + } + } + + ktxTexture_Destroy(kTexture); + ktxVulkanDeviceInfo_destruct(&kvdi); + + try { + prepareSamplerAndView(); // See below for implementation. + // Setup a layout with, e.g., a binding for a combined image-sampler. + setupDescriptorSetLayout(); + // Create a descriptor set and update it with the sampler and image view handles. + setupDescriptorSet(); + preparePipelines(); + setupDescriptorPool(); + setupDescriptorSet(); + buildCommandBuffers(); + } catch (std::exception&) { + cleanup(); + throw; + } +} + +Texture::~Texture() +{ + cleanup(); +} + +Texture::cleanup() +{ + destroyCommandBuffers(); + destroySampler(); + destroyImageview(); + ktxVulkanTexture_destruct(&texture, device, nullptr); + /* + . + . + . + */ +} + +void +Texture::prepareSamplerAndView() +{ + // Create sampler. + vk::SamplerCreateInfo samplerInfo; + // Set the non-default values + samplerInfo.magFilter = vk::Filter::eLinear; + samplerInfo.minFilter = vk::Filter::eLinear; + samplerInfo.mipmapMode = vk::SamplerMipmapMode::eLinear; + samplerInfo.maxLod = texture.levelCount; + samplerInfo.anisotropyEnable = false; + samplerInfo.maxAnisotropy = 1.0; + samplerInfo.borderColor = vk::BorderColor::eFloatOpaqueWhite; + sampler = vkctx.device.createSampler(samplerInfo); + + // Create image view. + // Textures are not directly accessed by the shaders and are abstracted + // by image views containing additional information and sub resource + // ranges. + vk::ImageViewCreateInfo viewInfo; + // Set the non-default values. + viewInfo.image = texture.image; + viewInfo.format = static_cast(texture.imageFormat); + viewInfo.viewType = static_cast(texture.viewType); + viewInfo.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor; + viewInfo.subresourceRange.layerCount = texture.layerCount; + viewInfo.subresourceRange.levelCount = texture.levelCount; + imageView = vkctx.device.createImageView(viewInfo); +} + +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ diff --git a/ktx/external/.clang-format b/ktx/external/.clang-format new file mode 100644 index 0000000..ca48a56 --- /dev/null +++ b/ktx/external/.clang-format @@ -0,0 +1,7 @@ +# Copyright 2024 The Khronos Group Inc. +# SPDX-License-Identifier: Apache-2.0 +--- +# Disable clang-format in this directory +DisableFormat: true +SortIncludes: false +... diff --git a/ktx/external/SDL_gesture/README.md b/ktx/external/SDL_gesture/README.md new file mode 100644 index 0000000..3acb7fe --- /dev/null +++ b/ktx/external/SDL_gesture/README.md @@ -0,0 +1,12 @@ + + + +SDL_gesture.h +------------- + +The Gesture API was removed from SDL3. As a migration path they provided an equivalent single-header library `SDL_gesture.h` that can be dropped into an SDL3-based project. + +They do not make formal releases of this code; they say "just grab the latest and drop it into your project!" + +The origin of this file is fork https://github.com/MarkCallow/SDL_gesture.git whose upstream is +https://github.com/libsdl-org/SDL_gesture. It includes modifications for robustness to prevent production of spurious GESTURE\_MULTIGESTURE events. diff --git a/ktx/external/SDL_gesture/SDL_gesture.h b/ktx/external/SDL_gesture/SDL_gesture.h new file mode 100644 index 0000000..221658c --- /dev/null +++ b/ktx/external/SDL_gesture/SDL_gesture.h @@ -0,0 +1,966 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2022 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/* Touch gestures were removed from SDL3, so this is the SDL2 implementation copied in here, and tweaked a little. */ + +#ifndef INCL_SDL_GESTURE_H +#define INCL_SDL_GESTURE_H + +#if !defined(SDL_MAJOR_VERSION) +#error Please include SDL.h before including this header. +#elif SDL_MAJOR_VERSION < 2 +#error This header requires SDL2 or later. +#elif SDL_MAJOR_VERSION == 2 +/* building against SDL2? Just use the built-in SDL2 implementation. */ +#define Gesture_Init() (0) +#define Gesture_Quit() +#define Gesture_ID SDL_GestureID +#define Gesture_LoadDollarTemplates SDL_LoadDollarTemplates +#define Gesture_RecordGesture SDL_RecordGesture +#define Gesture_SaveAllDollarTemplates SDL_SaveAllDollarTemplates +#define Gesture_SaveDollarTemplate SDL_SaveDollarTemplate +#define GESTURE_DOLLARGESTURE SDL_DOLLARGESTURE +#define GESTURE_DOLLARRECORD SDL_DOLLARRECORD +#define GESTURE_MULTIGESTURE SDL_MULTIGESTURE +#define Gesture_MultiGestureEvent SDL_MultiGestureEvent +#define Gesture_DollarGestureEvent SDL_DollarGestureEvent +#else + +#include + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef Sint64 Gesture_ID; + +/* events... */ + +/* generally you shouldn't hardcode event type numbers--and doubly so in + the reserved range!--but these match SDL2 and SDL3 promises to preserve + these values to help sdl2-compat. */ +#define GESTURE_DOLLARGESTURE 0x800 +#define GESTURE_DOLLARRECORD 0x801 +#define GESTURE_MULTIGESTURE 0x802 + +typedef struct Gesture_MultiGestureEvent +{ + Uint32 type; + Uint32 reserved; + Uint64 timestamp; + SDL_TouchID touchID; + float dTheta; + float dDist; + float x; + float y; + Uint16 numFingers; + Uint16 padding; +} Gesture_MultiGestureEvent; + +typedef struct Gesture_DollarGestureEvent +{ + Uint32 type; + Uint32 reserved; + Uint64 timestamp; + SDL_TouchID touchID; + Gesture_ID gestureId; + Uint32 numFingers; + float error; + float x; + float y; +} Gesture_DollarGestureEvent; + + +/* Function prototypes */ + +/** + * Call this once, AFTER SDL_Init, to set up the Gesture API. + * + * \returns 0 on success, -1 on error. Call SDL_GetError() for specifics. + */ +extern int SDLCALL Gesture_Init(void); + +/** + * Call this once, BEFORE SDL_Quit, to clean up the Gesture API. + */ +extern void SDLCALL Gesture_Quit(void); + +/** + * Begin recording a gesture on a specified touch device or all touch devices. + * + * If the parameter `touchID` is -1 (i.e., all devices), this function will + * always return 1, regardless of whether there actually are any devices. + * + * \param touchID the touch device id, or -1 for all touch devices + * \returns 1 on success or 0 if the specified device could not be found. + */ +extern int SDLCALL Gesture_RecordGesture(SDL_TouchID touchID); + +/** + * Save all currently loaded Dollar Gesture templates. + * + * \param dst a SDL_IOStream to save to + * \returns the number of saved templates on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa Gesture_LoadDollarTemplates + * \sa Gesture_SaveDollarTemplate + */ +extern int SDLCALL Gesture_SaveAllDollarTemplates(SDL_IOStream *dst); + +/** + * Save a currently loaded Dollar Gesture template. + * + * \param gestureId a gesture id + * \param dst a SDL_IOStream to save to + * \returns 1 on success or 0 on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadDollarTemplates + * \sa SDL_SaveAllDollarTemplates + */ +extern int SDLCALL Gesture_SaveDollarTemplate(Gesture_ID gestureId, SDL_IOStream *dst); + +/** + * Load Dollar Gesture templates from a file. + * + * \param touchID a touch id + * \param src a SDL_IOStream to load from + * \returns the number of loaded templates on success or a negative error code + * (or 0) on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SaveAllDollarTemplates + * \sa SDL_SaveDollarTemplate + */ +extern int SDLCALL Gesture_LoadDollarTemplates(SDL_TouchID touchID, SDL_IOStream *src); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif + +#if defined(SDL_GESTURE_IMPLEMENTATION) + +#define GESTURE_MAX_DOLLAR_PATH_SIZE 1024 +#define GESTURE_DOLLARNPOINTS 64 +#define GESTURE_DOLLARSIZE 256 +#define GESTURE_PHI 0.618033989 + +typedef struct +{ + float length; + int numPoints; + SDL_FPoint p[GESTURE_MAX_DOLLAR_PATH_SIZE]; +} GestureDollarPath; + +typedef struct +{ + SDL_FPoint path[GESTURE_DOLLARNPOINTS]; + Sint64 hash; +} GestureDollarTemplate; + +typedef struct +{ + SDL_TouchID touchID; + SDL_FPoint centroid; + GestureDollarPath dollarPath; + int numDownFingers; + int numDollarTemplates; + GestureDollarTemplate *dollarTemplate; + bool recording; +} GestureTouch; + +static GestureTouch *GestureTouches = NULL; +static int GestureNumTouches = 0; +static bool GestureRecordAll = false; + +static void GestureProcessEvent(const SDL_Event *event); + +static bool SDLCALL GestureEventWatch(void *, SDL_Event *event) +{ + GestureProcessEvent(event); + return true; +} + +int Gesture_Init(void) +{ + Gesture_Quit(); + SDL_AddEventWatch(GestureEventWatch, NULL); + return 0; +} + + +static GestureTouch *GestureAddTouch(const SDL_TouchID touchID) +{ + GestureTouch *gestureTouch = (GestureTouch *)SDL_realloc(GestureTouches, (GestureNumTouches + 1) * sizeof(GestureTouch)); + if (gestureTouch == NULL) { + SDL_OutOfMemory(); + return NULL; + } + + GestureTouches = gestureTouch; + SDL_zero(GestureTouches[GestureNumTouches]); + GestureTouches[GestureNumTouches].touchID = touchID; + return &GestureTouches[GestureNumTouches++]; +} + +#if 0 +static int GestureDelTouch(const SDL_TouchID touchID) +{ + int i; + for (i = 0; i < GestureNumTouches; i++) { + if (GestureTouches[i].touchID == touchID) { + break; + } + } + + if (i == GestureNumTouches) { + /* not found */ + return -1; + } + + SDL_free(GestureTouches[i].dollarTemplate); + SDL_zero(GestureTouches[i]); + + GestureNumTouches--; + if (i != GestureNumTouches) { + SDL_copyp(&GestureTouches[i], &GestureTouches[GestureNumTouches]); + } + return 0; +} +#endif + +static GestureTouch *GestureGetTouch(const SDL_TouchID touchID) +{ + int i; + for (i = 0; i < GestureNumTouches; i++) { + /* printf("%i ?= %i\n",GestureTouches[i].touchID,touchID); */ + if (GestureTouches[i].touchID == touchID) { + return &GestureTouches[i]; + } + } + return NULL; +} + +int Gesture_RecordGesture(SDL_TouchID touchID) +{ + SDL_TouchID *devices; + int i; + + devices = SDL_GetTouchDevices(NULL); + if (devices) { + /* make sure we know about all the devices SDL3 knows about, since we aren't connected as tightly as we were in SDL2. */ + for (i = 0; devices[i]; i++) { + if (!GestureGetTouch(devices[i])) { + GestureAddTouch(devices[i]); + } + } + SDL_free(devices); + } + + if (touchID != 0) { + GestureRecordAll = true; /* !!! FIXME: this is never set back to false anywhere, that's probably a bug. */ + for (i = 0; i < GestureNumTouches; i++) { + GestureTouches[i].recording = true; + } + } else { + GestureTouch *touch = GestureGetTouch(touchID); + if (!touch) { + return 0; /* bogus touchid */ + } + touch->recording = true; + } + + return 1; +} + +void Gesture_Quit(void) +{ + SDL_RemoveEventWatch(GestureEventWatch, NULL); + SDL_free(GestureTouches); + GestureTouches = NULL; + GestureNumTouches = 0; + GestureRecordAll = false; +} + +static unsigned long GestureHashDollar(SDL_FPoint *points) +{ + unsigned long hash = 5381; + int i; + for (i = 0; i < GESTURE_DOLLARNPOINTS; i++) { + hash = ((hash << 5) + hash) + (unsigned long)points[i].x; + hash = ((hash << 5) + hash) + (unsigned long)points[i].y; + } + return hash; +} + +static int GestureSaveTemplate(GestureDollarTemplate *templ, SDL_IOStream *dst) +{ + const size_t bytes = sizeof(templ->path[0]) * GESTURE_DOLLARNPOINTS; + + if (dst == NULL) { + return 0; + } + + /* No Longer storing the Hash, rehash on load */ + /* if (SDL_IOWrite(dst, &(templ->hash), sizeof(templ->hash)) != sizeof(templ->hash)) return 0; */ + +#if SDL_BYTEORDER == SDL_LIL_ENDIAN + if (SDL_WriteIO(dst, templ->path, bytes) != bytes) { + return 0; + } +#else + { + GestureDollarTemplate copy = *templ; + SDL_FPoint *p = copy.path; + int i; + for (i = 0; i < GESTURE_DOLLARNPOINTS; i++, p++) { + p->x = SDL_SwapFloatLE(p->x); + p->y = SDL_SwapFloatLE(p->y); + } + + if (SDL_WriteIO(dst, copy.path, bytes) != bytes) { + return 0; + } + } +#endif + + return 1; +} + +SDL_DECLSPEC int SDLCALL +Gesture_SaveAllDollarTemplates(SDL_IOStream *dst) +{ + int i, j, rtrn = 0; + for (i = 0; i < GestureNumTouches; i++) { + GestureTouch *touch = &GestureTouches[i]; + for (j = 0; j < touch->numDollarTemplates; j++) { + rtrn += GestureSaveTemplate(&touch->dollarTemplate[j], dst); + } + } + return rtrn; +} + +SDL_DECLSPEC int SDLCALL +Gesture_SaveDollarTemplate(Gesture_ID gestureId, SDL_IOStream *dst) +{ + int i, j; + for (i = 0; i < GestureNumTouches; i++) { + GestureTouch *touch = &GestureTouches[i]; + for (j = 0; j < touch->numDollarTemplates; j++) { + if (touch->dollarTemplate[j].hash == gestureId) { + return GestureSaveTemplate(&touch->dollarTemplate[j], dst); + } + } + } + return SDL_SetError("Unknown gestureId"); +} + +/* path is an already sampled set of points +Returns the index of the gesture on success, or -1 */ +static int GestureAddDollar_one(GestureTouch *inTouch, SDL_FPoint *path) +{ + GestureDollarTemplate *dollarTemplate; + GestureDollarTemplate *templ; + int index; + + index = inTouch->numDollarTemplates; + dollarTemplate = (GestureDollarTemplate *)SDL_realloc(inTouch->dollarTemplate, (index + 1) * sizeof(GestureDollarTemplate)); + if (dollarTemplate == NULL) { + return SDL_OutOfMemory(); + } + inTouch->dollarTemplate = dollarTemplate; + + templ = &inTouch->dollarTemplate[index]; + SDL_memcpy(templ->path, path, GESTURE_DOLLARNPOINTS * sizeof(SDL_FPoint)); + templ->hash = GestureHashDollar(templ->path); + inTouch->numDollarTemplates++; + + return index; +} + +static int GestureAddDollar(GestureTouch *inTouch, SDL_FPoint *path) +{ + int index = -1; + int i = 0; + if (inTouch == NULL) { + if (GestureNumTouches == 0) { + return SDL_SetError("no gesture touch devices registered"); + } + for (i = 0; i < GestureNumTouches; i++) { + inTouch = &GestureTouches[i]; + index = GestureAddDollar_one(inTouch, path); + if (index < 0) { + return -1; + } + } + /* Use the index of the last one added. */ + return index; + } + return GestureAddDollar_one(inTouch, path); +} + +SDL_DECLSPEC int SDLCALL +Gesture_LoadDollarTemplates(SDL_TouchID touchID, SDL_IOStream *src) +{ + int i, loaded = 0; + GestureTouch *touch = NULL; + if (src == NULL) { + return 0; + } + /* In SDL2 this test was `touchID >= 0` leading to warnings from gcc + because SDL_TouchId is now Uint64. In SDL2 it was Sint64. The + documentation does not say what < 0 means here but the only defined + negative touchID was SDL_MOUSE_TOUCHID (-1). In SDL3 SDL_PEN_TOUCHID (-2) + has been added hence this test. Given the lack of documentation + it is impossible to say if this updated test is correct. */ + if (touchID < SDL_PEN_TOUCHID) { + for (i = 0; i < GestureNumTouches; i++) { + if (GestureTouches[i].touchID == touchID) { + touch = &GestureTouches[i]; + } + } + if (touch == NULL) { + return SDL_SetError("given touch id not found"); + } + } + + while (1) { + GestureDollarTemplate templ; + const size_t bytes = sizeof(templ.path[0]) * GESTURE_DOLLARNPOINTS; + + if (SDL_ReadIO(src, templ.path, bytes) < bytes) { + if (loaded == 0) { + return SDL_SetError("could not read any dollar gesture from rwops"); + } + break; + } + +#if SDL_BYTEORDER != SDL_LIL_ENDIAN + for (i = 0; i < GESTURE_DOLLARNPOINTS; i++) { + SDL_FPoint *p = &templ.path[i]; + p->x = SDL_SwapFloatLE(p->x); + p->y = SDL_SwapFloatLE(p->y); + } +#endif + + // See comment at line 436. + if (touchID < SDL_PEN_TOUCHID) { + /* printf("Adding loaded gesture to 1 touch\n"); */ + if (GestureAddDollar(touch, templ.path) >= 0) { + loaded++; + } + } else { + /* printf("Adding to: %i touches\n",GestureNumTouches); */ + for (i = 0; i < GestureNumTouches; i++) { + touch = &GestureTouches[i]; + /* printf("Adding loaded gesture to + touches\n"); */ + /* TODO: What if this fails? */ + GestureAddDollar(touch, templ.path); + } + loaded++; + } + } + + return loaded; +} + +static float GestureDollarDifference(SDL_FPoint *points, SDL_FPoint *templ, float ang) +{ + /* SDL_FPoint p[GESTURE_DOLLARNPOINTS]; */ + float dist = 0; + SDL_FPoint p; + int i; + for (i = 0; i < GESTURE_DOLLARNPOINTS; i++) { + p.x = points[i].x * SDL_cosf(ang) - points[i].y * SDL_sinf(ang); + p.y = points[i].x * SDL_sinf(ang) + points[i].y * SDL_cosf(ang); + dist += SDL_sqrtf((p.x - templ[i].x) * (p.x - templ[i].x) + (p.y - templ[i].y) * (p.y - templ[i].y)); + } + return dist / GESTURE_DOLLARNPOINTS; +} + +static float GestureBestDollarDifference(SDL_FPoint *points, SDL_FPoint *templ) +{ + /*------------BEGIN DOLLAR BLACKBOX------------------ + -TRANSLATED DIRECTLY FROM PSUDEO-CODE AVAILABLE AT- + -"http://depts.washington.edu/aimgroup/proj/dollar/" + */ + double ta = -SDL_PI_D / 4; + double tb = SDL_PI_D / 4; + double dt = SDL_PI_D / 90; + float x1 = (float)(GESTURE_PHI * ta + (1 - GESTURE_PHI) * tb); + float f1 = GestureDollarDifference(points, templ, x1); + float x2 = (float)((1 - GESTURE_PHI) * ta + GESTURE_PHI * tb); + float f2 = GestureDollarDifference(points, templ, x2); + while (SDL_fabs(ta - tb) > dt) { + if (f1 < f2) { + tb = x2; + x2 = x1; + f2 = f1; + x1 = (float)(GESTURE_PHI * ta + (1 - GESTURE_PHI) * tb); + f1 = GestureDollarDifference(points, templ, x1); + } else { + ta = x1; + x1 = x2; + f1 = f2; + x2 = (float)((1 - GESTURE_PHI) * ta + GESTURE_PHI * tb); + f2 = GestureDollarDifference(points, templ, x2); + } + } + /* + if (f1 <= f2) + printf("Min angle (x1): %f\n",x1); + else if (f1 > f2) + printf("Min angle (x2): %f\n",x2); + */ + return SDL_min(f1, f2); +} + +/* `path` contains raw points, plus (possibly) the calculated length */ +static int GestureDollarNormalize(const GestureDollarPath *path, SDL_FPoint *points, bool is_recording) +{ + int i; + float interval; + float dist; + int numPoints = 0; + SDL_FPoint centroid; + float xmin, xmax, ymin, ymax; + float ang; + float w, h; + float length = path->length; + + /* Calculate length if it hasn't already been done */ + if (length <= 0) { + for (i = 1; i < path->numPoints; i++) { + const float dx = path->p[i].x - path->p[i - 1].x; + const float dy = path->p[i].y - path->p[i - 1].y; + length += SDL_sqrtf(dx * dx + dy * dy); + } + } + + /* Resample */ + interval = length / (GESTURE_DOLLARNPOINTS - 1); + dist = interval; + + centroid.x = 0; + centroid.y = 0; + + /* printf("(%f,%f)\n",path->p[path->numPoints-1].x,path->p[path->numPoints-1].y); */ + for (i = 1; i < path->numPoints; i++) { + const float d = SDL_sqrtf((path->p[i - 1].x - path->p[i].x) * (path->p[i - 1].x - path->p[i].x) + (path->p[i - 1].y - path->p[i].y) * (path->p[i - 1].y - path->p[i].y)); + /* printf("d = %f dist = %f/%f\n",d,dist,interval); */ + while (dist + d > interval) { + points[numPoints].x = path->p[i - 1].x + + ((interval - dist) / d) * (path->p[i].x - path->p[i - 1].x); + points[numPoints].y = path->p[i - 1].y + + ((interval - dist) / d) * (path->p[i].y - path->p[i - 1].y); + centroid.x += points[numPoints].x; + centroid.y += points[numPoints].y; + numPoints++; + + dist -= interval; + } + dist += d; + } + if (numPoints < GESTURE_DOLLARNPOINTS - 1) { + if (is_recording) { + SDL_SetError("ERROR: NumPoints = %i", numPoints); + } + return 0; + } + /* copy the last point */ + points[GESTURE_DOLLARNPOINTS - 1] = path->p[path->numPoints - 1]; + numPoints = GESTURE_DOLLARNPOINTS; + + centroid.x /= numPoints; + centroid.y /= numPoints; + + /* printf("Centroid (%f,%f)",centroid.x,centroid.y); */ + /* Rotate Points so point 0 is left of centroid and solve for the bounding box */ + xmin = centroid.x; + xmax = centroid.x; + ymin = centroid.y; + ymax = centroid.y; + + ang = SDL_atan2f(centroid.y - points[0].y, centroid.x - points[0].x); + + for (i = 0; i < numPoints; i++) { + const float px = points[i].x; + const float py = points[i].y; + points[i].x = (px - centroid.x) * SDL_cosf(ang) - (py - centroid.y) * SDL_sinf(ang) + centroid.x; + points[i].y = (px - centroid.x) * SDL_sinf(ang) + (py - centroid.y) * SDL_cosf(ang) + centroid.y; + + if (points[i].x < xmin) { + xmin = points[i].x; + } + if (points[i].x > xmax) { + xmax = points[i].x; + } + if (points[i].y < ymin) { + ymin = points[i].y; + } + if (points[i].y > ymax) { + ymax = points[i].y; + } + } + + /* Scale points to GESTURE_DOLLARSIZE, and translate to the origin */ + w = xmax - xmin; + h = ymax - ymin; + + for (i = 0; i < numPoints; i++) { + points[i].x = (points[i].x - centroid.x) * GESTURE_DOLLARSIZE / w; + points[i].y = (points[i].y - centroid.y) * GESTURE_DOLLARSIZE / h; + } + return numPoints; +} + +static float GestureDollarRecognize(const GestureDollarPath *path, int *bestTempl, GestureTouch *touch) +{ + SDL_FPoint points[GESTURE_DOLLARNPOINTS]; + int i; + float bestDiff = 10000; + + SDL_memset(points, 0, sizeof(points)); + + GestureDollarNormalize(path, points, false); + + /* PrintPath(points); */ + *bestTempl = -1; + for (i = 0; i < touch->numDollarTemplates; i++) { + const float diff = GestureBestDollarDifference(points, touch->dollarTemplate[i].path); + if (diff < bestDiff) { + bestDiff = diff; + *bestTempl = i; + } + } + return bestDiff; +} + +static void GestureSendMulti(GestureTouch *touch, float dTheta, float dDist) +{ + if (SDL_EventEnabled(GESTURE_MULTIGESTURE)) { + Gesture_MultiGestureEvent mgesture; + mgesture.type = GESTURE_MULTIGESTURE; + mgesture.timestamp = 0; + mgesture.touchID = touch->touchID; + mgesture.x = touch->centroid.x; + mgesture.y = touch->centroid.y; + mgesture.dTheta = dTheta; + mgesture.dDist = dDist; + mgesture.numFingers = (Uint16)touch->numDownFingers; + SDL_PushEvent((SDL_Event*)&mgesture); + } +} + +static void GestureSendDollar(GestureTouch *touch, Gesture_ID gestureId, float error) +{ + if (SDL_EventEnabled(GESTURE_DOLLARGESTURE)) { + Gesture_DollarGestureEvent dgesture; + dgesture.type = GESTURE_DOLLARGESTURE; + dgesture.timestamp = 0; + dgesture.touchID = touch->touchID; + dgesture.x = touch->centroid.x; + dgesture.y = touch->centroid.y; + dgesture.gestureId = gestureId; + dgesture.error = error; + /* A finger came up to trigger this event. */ + dgesture.numFingers = touch->numDownFingers + 1; + SDL_PushEvent((SDL_Event*)&dgesture); + } +} + +static void GestureSendDollarRecord(GestureTouch *touch, Gesture_ID gestureId) +{ + if (SDL_EventEnabled(GESTURE_DOLLARRECORD)) { + Gesture_DollarGestureEvent dgesture; + dgesture.type = GESTURE_DOLLARRECORD; + dgesture.timestamp = 0; + dgesture.touchID = touch->touchID; + dgesture.gestureId = gestureId; + SDL_PushEvent((SDL_Event*)&dgesture); + } +} + +#if !defined(GESTURE_LOG_UP_DOWN_EVENTS) + #define GESTURE_LOG_UP_DOWN_EVENTS 0 +#endif +#if !defined(GESTURE_LOG_MOTION_EVENTS) + #define GESTURE_LOG_MOTION_EVENTS 0 +#endif + +static void GestureProcessEvent(const SDL_Event *event) +{ + float x, y; + int index; + int i; + float pathDx, pathDy; + SDL_FPoint lastP; + SDL_FPoint lastCentroid; + float lDist; + float Dist; + float dtheta; + float dDist; + + if (event->type == SDL_EVENT_FINGER_MOTION || event->type == SDL_EVENT_FINGER_DOWN || event->type == SDL_EVENT_FINGER_UP) { + GestureTouch *inTouch = GestureGetTouch(event->tfinger.touchID); + if (inTouch == NULL) { /* we maybe didn't see this one before. */ + inTouch = GestureAddTouch(event->tfinger.touchID); + if (!inTouch) { + return; /* oh well. */ + } + } + int numDownFingersReported; + SDL_Finger** fingers = SDL_GetTouchFingers(event->tfinger.touchID, &numDownFingersReported); + + x = event->tfinger.x; + y = event->tfinger.y; + + /* Finger Up */ + if (event->type == SDL_EVENT_FINGER_UP) { +#if GESTURE_LOG_UP_DOWN_EVENTS + SDL_Log("GPE: Finger: %#" SDL_PRIx64 " UP. Device: %#" SDL_PRIx64 ", fingers: %i, x: %f, y: %f, press: %f", + event->tfinger.fingerID, event->tfinger.touchID, numDownFingersReported, + event->tfinger.x, event->tfinger.y, event->tfinger.pressure); +#endif + SDL_FPoint path[GESTURE_DOLLARNPOINTS]; + +#if SDL_PLATFORM_MACOS + /* Workaround issue https://github.com/libsdl-org/SDL/issues/13428, + Extra SDL_EVENT_FINGER_{UP,DOWN} with mouse button press, by + ignoring events with fingerID of SDL_BUTTON_LEFT. + + N.B. If SDL_HINT_MOUSE_TOUCH_EVENTS is set to 0 no touch + events are received from the trackpad. */ + if (event->tfinger.fingerID == SDL_BUTTON_LEFT) return; +#endif + /* Using the number of fingers returned by SDL_GetTouchFingers + is much more robust than counting finger up and down events. + With counting it is easy for the counted number to be higher + than the actual number. Unfortunately it has not been possible + to identify a sequence of actions that reliably reproduces + this but asserts have shown it happens often. Perhaps + sometimes a single UP or DOWN event is received for multiple + fingers. + + Using the reported number is independent of how many events + are actually received. But, and this is a big one, in the + case of FINGER_UP SDL_GetTouchFingers reports the number of + fingers down *before* the up event. + + N.B. In the case of a left button press on macOS, + SDL_GetTouchFingers reports 1 for the event that is not + ignored. + */ + inTouch->numDownFingers = numDownFingersReported - 1; + assert(inTouch->numDownFingers >= 0); +#if (GESTURE_LOG_UP_DOWN_EVENTS) + SDL_Log("GPE FINGER_UP, numDownFingers now = %i", inTouch->numDownFingers); +#endif + + if (inTouch->recording) { + inTouch->recording = false; + GestureDollarNormalize(&inTouch->dollarPath, path, true); + /* PrintPath(path); */ + if (GestureRecordAll) { + index = GestureAddDollar(NULL, path); + for (i = 0; i < GestureNumTouches; i++) { + GestureTouches[i].recording = false; + } + } else { + index = GestureAddDollar(inTouch, path); + } + + if (index >= 0) { + GestureSendDollarRecord(inTouch, inTouch->dollarTemplate[index].hash); + } else { + GestureSendDollarRecord(inTouch, -1); + } + } else { + int bestTempl = -1; + const float error = GestureDollarRecognize(&inTouch->dollarPath, &bestTempl, inTouch); + if (bestTempl >= 0) { + /* Send Event */ + const Gesture_ID gestureId = inTouch->dollarTemplate[bestTempl].hash; + GestureSendDollar(inTouch, gestureId, error); + /* printf ("%s\n",);("Dollar error: %f\n",error); */ + } + } + + /* inTouch->gestureLast[j] = inTouch->gestureLast[inTouch->numDownFingers]; */ + if (inTouch->numDownFingers > 0) { + inTouch->centroid.x = (inTouch->centroid.x * (inTouch->numDownFingers + 1) - x) / inTouch->numDownFingers; + inTouch->centroid.y = (inTouch->centroid.y * (inTouch->numDownFingers + 1) - y) / inTouch->numDownFingers; + } else { + inTouch->centroid.x = inTouch->centroid.y = 0.0f; + } + } else if (event->type == SDL_EVENT_FINGER_MOTION) { + /* There is one FINGER_MOTION event per down finger. x,y gives + the position of the finger whose id is in the event. */ + const float dx = event->tfinger.dx; + const float dy = event->tfinger.dy; + GestureDollarPath *path = &inTouch->dollarPath; + +#if GESTURE_LOG_MOTION_EVENTS + SDL_Log("GPE: Finger: %#" SDL_PRIx64 " MOTION: device: %#" SDL_PRIx64 ", timestamp = %" + SDL_PRIu64 ", fingers: %i, x: %f, y: %f, press: %f, numDownFingers: %i", + event->tfinger.fingerID, event->tfinger.touchID, event->tfinger.timestamp, + numDownFingersReported, event->tfinger.x, event->tfinger.y, event->tfinger.pressure, + inTouch->numDownFingers); +#endif + assert(numDownFingersReported > 0); +#if SDL_PLATFORM_MACOS + /* Workaround issue https://github.com/libsdl-org/SDL/issues/13428. + See comment at line 753 for more details. */ + if (event->tfinger.fingerID == SDL_BUTTON_LEFT) return; + /* SDL_GetTouchFingers reports 2 fingers down in the motion event + for the other finger during button press. Fix up the number of + fingers. */ + uint32_t reportedNumFingers = numDownFingersReported; + for (uint32_t i = 0; i < reportedNumFingers; i++) { + if (fingers[i]->id == SDL_BUTTON_LEFT) { + numDownFingersReported--; + break; + } + } +#endif + /* See comment at line 762. One case where the count reliably + differs from reported is on iOS. When touching, dragging and + releasing 2 fingers, iOS sends a BUTTON_DOWN and BUTTON_UP + for one of the fingers. When the finger corresponding to the + button is raised, it sends the BUTTON_UP followed by the + FINGER_UP but FINGER_MOTION events can come before the + FINGER_UP and those events have only one finger down. */ + inTouch->numDownFingers = numDownFingersReported; + if (path->numPoints < GESTURE_MAX_DOLLAR_PATH_SIZE) { + path->p[path->numPoints].x = inTouch->centroid.x; + path->p[path->numPoints].y = inTouch->centroid.y; + pathDx = (path->p[path->numPoints].x - path->p[path->numPoints - 1].x); + pathDy = (path->p[path->numPoints].y - path->p[path->numPoints - 1].y); + path->length += (float)SDL_sqrt(pathDx * pathDx + pathDy * pathDy); + path->numPoints++; + } + + lastP.x = x - dx; + lastP.y = y - dy; + lastCentroid = inTouch->centroid; + + inTouch->centroid.x += dx / inTouch->numDownFingers; + inTouch->centroid.y += dy / inTouch->numDownFingers; + /* printf("Centroid : (%f,%f)\n",inTouch->centroid.x,inTouch->centroid.y); */ + if (inTouch->numDownFingers > 1) { + SDL_FPoint lv; /* Vector from centroid to last x,y position */ + SDL_FPoint v; /* Vector from centroid to current x,y position */ + /* lv = inTouch->gestureLast[j].cv; */ + lv.x = lastP.x - lastCentroid.x; + lv.y = lastP.y - lastCentroid.y; + lDist = SDL_sqrtf(lv.x * lv.x + lv.y * lv.y); + /* printf("lDist = %f\n",lDist); */ + v.x = x - inTouch->centroid.x; + v.y = y - inTouch->centroid.y; + /* inTouch->gestureLast[j].cv = v; */ + Dist = SDL_sqrtf(v.x * v.x + v.y * v.y); + /* SDL_cosf(dTheta) = (v . lv)/(|v| * |lv|) */ + + /* Normalize Vectors to simplify angle calculation */ + lv.x /= lDist; + lv.y /= lDist; + v.x /= Dist; + v.y /= Dist; + dtheta = SDL_atan2f(lv.x * v.y - lv.y * v.x, lv.x * v.x + lv.y * v.y); + + dDist = (Dist - lDist); + if (lDist == 0) { + /* To avoid impossible values */ + dDist = 0; + dtheta = 0; + } + + /* inTouch->gestureLast[j].dDist = dDist; + inTouch->gestureLast[j].dtheta = dtheta; + + printf("dDist = %f, dTheta = %f\n",dDist,dtheta); + gdtheta = gdtheta*.9 + dtheta*.1; + gdDist = gdDist*.9 + dDist*.1 + knob.r += dDist/numDownFingers; + knob.ang += dtheta; + printf("thetaSum = %f, distSum = %f\n",gdtheta,gdDist); + printf("id: %i dTheta = %f, dDist = %f\n",j,dtheta,dDist); */ + GestureSendMulti(inTouch, dtheta, dDist); + } else { + /* inTouch->gestureLast[j].dDist = 0; + inTouch->gestureLast[j].dtheta = 0; + inTouch->gestureLast[j].cv.x = 0; + inTouch->gestureLast[j].cv.y = 0; */ + } + /* inTouch->gestureLast[j].f.p.x = x; + inTouch->gestureLast[j].f.p.y = y; + break; + pressure? */ + } else if (event->type == SDL_EVENT_FINGER_DOWN) { +#if (GESTURE_LOG_UP_DOWN_EVENTS) + SDL_Log("GPE: Finger: %#" SDL_PRIx64 " DOWN. Device: %#" SDL_PRIx64 ", fingers: %i, x: %f, y: %f, press: %f", + event->tfinger.fingerID, event->tfinger.touchID, numDownFingersReported, + event->tfinger.x, event->tfinger.y, event->tfinger.pressure); +#endif +#if SDL_PLATFORM_MACOS + /* See comment starting at line 753. */ + if (event->tfinger.fingerID == SDL_BUTTON_LEFT) return; +#endif + /* Using the number of fingers returned by SDL_GetTouchFingers + is much more robust than counting finger up and down events. + With counting it is easy for the counted number to be higher + than the actual number. Unfortunately it has not been possible + to identify a sequence of actions that reliably reproduces + this. Using the reported number is independent of how many + events are actually received. */ + inTouch->numDownFingers = numDownFingersReported; + inTouch->centroid.x = inTouch->centroid.y = 0.0; + for (i = 0; i < numDownFingersReported; i++) { + inTouch->centroid.x += fingers[i]->x; + inTouch->centroid.y += fingers[i]->y; + } + inTouch->centroid.x /= numDownFingersReported; + inTouch->centroid.y /= numDownFingersReported; + //printf("Finger Down: (%f,%f). Centroid: (%f,%f\n",x,y, + // inTouch->centroid.x,inTouch->centroid.y); + + inTouch->dollarPath.length = 0; + inTouch->dollarPath.p[0].x = x; + inTouch->dollarPath.p[0].y = y; + inTouch->dollarPath.numPoints = 1; + } + SDL_free(fingers); + } +} + +#endif /* defined(SDL_GESTURE_IMPLEMENTATION) */ +#endif /* SDL version > 2 */ +#endif /* INCL_SDL_GESTURE_H */ + +/* vi: set sts=4 ts=4 sw=4 expandtab: */ diff --git a/ktx/external/astc-encoder/.gitattributes b/ktx/external/astc-encoder/.gitattributes new file mode 100644 index 0000000..0fc74d7 --- /dev/null +++ b/ktx/external/astc-encoder/.gitattributes @@ -0,0 +1,21 @@ +# Text type files use auto line endings +* text=auto + +# Explicitly declare text file types for this repo +*.c text +*.cpp text +*.h text +*.md text +Jenkinsfile text + +# VS solutions always use Windows line endings +*.sln text eol=crlf +*.vcxproj text eol=crlf + +# Bash scripts always use *nux line endings +*.sh text eol=lf + +# Denote all files that are truly binary and should not be modified. +*.png binary +*.hdr binary +*.exe binary diff --git a/ktx/external/astc-encoder/.github/workflows/post_weekly_release.yaml b/ktx/external/astc-encoder/.github/workflows/post_weekly_release.yaml new file mode 100644 index 0000000..95d7cfd --- /dev/null +++ b/ktx/external/astc-encoder/.github/workflows/post_weekly_release.yaml @@ -0,0 +1,385 @@ +name: post-weekly-release +run-name: Build, test, generate signed artifacts and optionally prepare release + +on: + workflow_dispatch: + push: + branches: + - main + tags: + - '*' + schedule: + - cron: '17 2 * * 1' + +jobs: + + coverity: + if: ${{ (!startsWith(github.event.ref, 'refs/tags/')) && (github.repository_owner == 'Arm-software') }} + name: Run Coverity static analysis + runs-on: [self-hosted-ubuntu-latest-x64] + steps: + - name: Clean workspace + uses: AutoModality/action-clean@v1 + + - name: Git checkout + uses: actions/checkout@v4 + with: + submodules: 'true' + + - name: Coverity preparation + run: | + export PATH=$PATH:/usr/local/cov-analysis/bin + mkdir build_cov + cd build_cov + cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../ -DASTCENC_ISA_AVX2=ON .. + cov-configure --config ${GITHUB_WORKSPACE}/coverity.conf --template --compiler cc --comptype gcc + cov-configure --config ${GITHUB_WORKSPACE}/coverity.conf --template --compiler c++ --comptype g++ + + - name: Coverity build + run: | + export PATH=$PATH:/usr/local/cov-analysis/bin + cd build_cov + cov-build --config ${GITHUB_WORKSPACE}/coverity.conf --dir ${GITHUB_WORKSPACE}/intermediate make install + + - name: Coverity analyze + run: | + export PATH=$PATH:/usr/local/cov-analysis/bin + cd build_cov + cov-analyze --dir ${GITHUB_WORKSPACE}/intermediate + + - name: Coverity upload + env: + COVERITY_KEY: ${{ secrets.COVERITY_KEY }} + run: | + export PATH=$PATH:/usr/local/cov-analysis/bin + echo "${COVERITY_KEY}" > coverity.key + chmod 400 coverity.key + cd build_cov + cov-commit-defects \ + --dir ${GITHUB_WORKSPACE}/intermediate \ + --stream astcenc-master \ + --url https://coverity.cambridge.arm.com \ + --auth-key-file ../coverity.key \ + --strip-path ${GITHUB_WORKSPACE} + + build-ubuntu-arm64: + name: Ubuntu arm64 + runs-on: ubuntu-24.04-arm + steps: + - name: Git checkout + uses: actions/checkout@v4 + with: + submodules: 'true' + + - name: Update apt packages + run: sudo apt-get update + + - name: Install ImageMagick + run: sudo apt-get install imagemagick + + - name: Build release + run: | + export CXX=clang++ + mkdir build_rel + cd build_rel + cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../ -DASTCENC_ISA_NEON=ON -DASTCENC_ISA_SVE_128=ON -DASTCENC_ISA_SVE_256=ON -DASTCENC_PACKAGE=arm64 .. + make install package -j4 + + - name: Upload binaries + uses: actions/upload-artifact@v4 + with: + name: astcenc-linux-arm64 + path: | + build_rel/*.zip + build_rel/*.zip.sha256 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Get Python modules + run: | + python -m pip install --upgrade pip + pip install numpy Pillow + + - name: Run system tests + # Disable SVE testing for now + run: | + python ./Test/astc_test_functional.py --encoder neon + python ./Test/astc_test_image.py --encoder neon --test-set Small + + build-ubuntu-x64: + name: Ubuntu x64 + runs-on: ubuntu-22.04 + steps: + - name: Git checkout + uses: actions/checkout@v4 + with: + submodules: 'true' + + - name: Build release + run: | + export CXX=clang++ + mkdir build_rel + cd build_rel + cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../ -DASTCENC_ISA_AVX2=ON -DASTCENC_ISA_SSE41=ON -DASTCENC_ISA_SSE2=ON -DASTCENC_PACKAGE=x64 .. + make install package -j4 + + - name: Upload binaries + uses: actions/upload-artifact@v4 + with: + name: astcenc-linux-x86_64 + path: | + build_rel/*.zip + build_rel/*.zip.sha256 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Get Python modules + run: | + python -m pip install --upgrade pip + pip install numpy Pillow + + - name: Run system tests + run: | + python ./Test/astc_test_functional.py + python ./Test/astc_test_image.py --encoder all-x86 --test-set Small + + build-macos-universal: + name: macOS universal + runs-on: macos-14 + steps: + - name: Git checkout + uses: actions/checkout@v4 + with: + submodules: 'true' + + - name: Build release + run: | + mkdir build_rel + cd build_rel + cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../ -DASTCENC_PACKAGE=universal .. + make install package -j4 + + - name: Upload binaries + uses: actions/upload-artifact@v4 + with: + name: astcenc-macos-universal + path: | + build_rel/*.zip + build_rel/*.zip.sha256 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Get Python modules + run: | + python -m pip install --upgrade pip + pip install numpy Pillow + + - name: Run system tests + run: | + python ./Test/astc_test_image.py --test-set Small --encoder universal + + build-windows-multi: + name: Windows multi + runs-on: windows-2022 + steps: + - name: Git checkout + uses: actions/checkout@v4 + with: + submodules: 'true' + + - name: Setup Visual Studio x86_64 + uses: ilammy/msvc-dev-cmd@v1 + + - name: Build release x64 + run: | + mkdir build_rel + cd build_rel + cmake -G "Visual Studio 17 2022" -T ClangCL -DCMAKE_INSTALL_PREFIX=../ -DASTCENC_ISA_AVX2=ON -DASTCENC_ISA_SSE41=ON -DASTCENC_ISA_SSE2=ON -DASTCENC_PACKAGE=x64 .. + msbuild astcencoder.sln -property:Configuration=Release + msbuild PACKAGE.vcxproj -property:Configuration=Release + msbuild INSTALL.vcxproj -property:Configuration=Release + shell: cmd + + - name: Setup Visual Studio arm64 + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: x86_arm64 + + - name: Build release arm64 + run: | + mkdir build_rel_arm64 + cd build_rel_arm64 + cmake -G "Visual Studio 17 2022" -A ARM64 -T ClangCL -DCMAKE_INSTALL_PREFIX=../ -DASTCENC_ISA_NEON=ON -DASTCENC_PACKAGE=arm64 .. + msbuild astcencoder.sln -property:Configuration=Release + msbuild PACKAGE.vcxproj -property:Configuration=Release + msbuild INSTALL.vcxproj -property:Configuration=Release + shell: cmd + + - name: Upload binaries + uses: actions/upload-artifact@v4 + with: + name: astcenc-windows-multi-cl + path: | + build_rel/*.zip + build_rel/*.zip.sha256 + build_rel_arm64/*.zip + build_rel_arm64/*.zip.sha256 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Get Python modules + run: | + python -m pip install --upgrade pip + pip install numpy Pillow + shell: cmd + + - name: Run system tests + run: | + python ./Test/astc_test_image.py --test-set Small + shell: cmd + + sign-binaries: + if: github.repository_owner == 'Arm-software' + name: Sign Windows and macOS + runs-on: [self-hosted-ubuntu-latest-x64] + needs: [build-macos-universal, build-windows-multi] + steps: + - name: Clean workspace + uses: AutoModality/action-clean@v1 + + - name: Checkout signing code + env: + SIGNING_REPO_URL: ${{ secrets.SIGNING_REPO_URL }} + run: | + git clone --depth 1 ${SIGNING_REPO_URL} + + - name: Install code sign v2 client + env: + ARTIFACTORY_USER: ${{ secrets.ARTIFACTORY_USER }} + ARTIFACTORY_APIKEY: ${{ secrets.ARTIFACTORY_APIKEY }} + ARTIFACTORY_FQDN: ${{ secrets.ARTIFACTORY_FQDN }} + run: | + python3.11 -m venv cs + . ./cs/bin/activate + pip install -i https://${ARTIFACTORY_USER}:${ARTIFACTORY_APIKEY}@${ARTIFACTORY_FQDN}/artifactory/api/pypi/dsgcore.pypi/simple code-signer-client + + - name: Download macOS binaries + uses: actions/download-artifact@v4 + with: + name: astcenc-macos-universal + path: mac + + - name: Download Windows binaries + uses: actions/download-artifact@v4 + with: + name: astcenc-windows-multi-cl + path: windows + + - name: Sign macOS binaries + env: + CODESIGNER_USER: ${{ secrets.CODESIGNER_USER }} + run: | + . ./cs/bin/activate + cd mac + python3 ${GITHUB_WORKSPACE}/signing/macos-client-wrapper.py ${CODESIGNER_USER} *.zip + + - name: Sign Windows binaries + env: + ARTIFACTORY_APIKEY: ${{ secrets.ARTIFACTORY_APIKEY }} + run: | + . ./cs/bin/activate + cd windows + for FILENAME in */*; do mv ${FILENAME} .; done + for ZIPFILE in *.zip; do python3 ../signing/windows-client-wrapper.py -b ${GITHUB_RUN_NUMBER} -t ${ARTIFACTORY_APIKEY} ${ZIPFILE}; done + + - name: Upload signed binaries + uses: actions/upload-artifact@v4 + with: + name: signed-binaries + path: | + windows/* + mac/* + + - name: Tidy intermediate artifacts + uses: geekyeggo/delete-artifact@v5 + with: + name: | + astcenc-windows-multi-cl + astcenc-macos-universal + + prepare-release: + if: ${{ (startsWith(github.event.ref, 'refs/tags/')) && (github.repository_owner == 'Arm-software') }} + name: Prepare release + runs-on: ubuntu-22.04 + needs: [sign-binaries, build-ubuntu-x64] + steps: + - name: Git checkout + uses: actions/checkout@v4 + + - name: Download signed binaries + uses: actions/download-artifact@v4 + with: + name: signed-binaries + path: prepare-release + + - name: Download Linux x86_64 binaries + uses: actions/download-artifact@v4 + with: + name: astcenc-linux-x86_64 + path: prepare-release + + - name: Download Linux arm64 binaries + uses: actions/download-artifact@v4 + with: + name: astcenc-linux-arm64 + path: prepare-release + + - name: Flatten file structure + run: | + cd prepare-release + for FILENAME in */*; do mv ${FILENAME} .; done + rmdir windows + rmdir mac + + - name: Create checksum file + run: | + cd prepare-release + cat *.sha256 > release-sha256.txt + rm *.sha256 + + - name: Create release body + run: | + export STATUS_DATE=$(date "+%B %Y") + GITHUB_REF=${{ github.ref }} ; export RELEASE_VERSION=${GITHUB_REF##*/} + export SHA_CHECKSUMS=$(cat prepare-release/release-sha256.txt) + envsubst < .github/workflows/release_body_template.md > prepare-release/release_body.md + + - name: Create release + id: create_release + uses: comnoco/create-release-action@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: ${{ github.ref }} + body_path: prepare-release/release_body.md + draft: true + + - name: Attach artifacts + uses: AButler/upload-release-assets@v3.0 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + release-id: ${{ steps.create_release.outputs.id }} + files: "prepare-release/astcenc-*-*-*.zip;prepare-release/release-sha256.txt" diff --git a/ktx/external/astc-encoder/.github/workflows/release_body_template.md b/ktx/external/astc-encoder/.github/workflows/release_body_template.md new file mode 100644 index 0000000..0f81edc --- /dev/null +++ b/ktx/external/astc-encoder/.github/workflows/release_body_template.md @@ -0,0 +1,13 @@ +**Status:** ${STATUS_DATE} + +The ${RELEASE_VERSION} release is a minor/major maintenance release. + +* **General:** + * **Bug fix:** Text here + * **Feature:** Text here + +## Binary release sha256 checksums + +``` +${SHA_CHECKSUMS} +``` diff --git a/ktx/external/astc-encoder/.gitignore b/ktx/external/astc-encoder/.gitignore new file mode 100644 index 0000000..09a7327 --- /dev/null +++ b/ktx/external/astc-encoder/.gitignore @@ -0,0 +1,47 @@ +# Editor and engineering scratch files +.cache +.vs +.vscode +.DS_Store +*.log +*.diff +*.user +*.o +*.a +__pycache__ +Scratch +Proto + +# Precompiled reference binaries for comparison tests +bin +lib +Binaries + +# Build artifacts +astcenc +build* + +# General build artifacts +Test/DocOut + +# Test images we download from other sources +Test/Images/Kodak*/**/*.png +Test/Images/Scratch* + +# Test output +TestOutput +/*.xlsx +/*.jpg +/*.json +/*.log +/*.txt +/*.hdr +/*.png +/*.exr +/*.astc +astc_reference-main* +Docs/Profiling.md +Source/astcenccli_version.h + +# Do not ignore workflows +!.github/workflows/ diff --git a/ktx/external/astc-encoder/.gitrepo b/ktx/external/astc-encoder/.gitrepo new file mode 100644 index 0000000..538719c --- /dev/null +++ b/ktx/external/astc-encoder/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme +; +[subrepo] + remote = https://github.com/ARM-software/astc-encoder.git + branch = 5.3.0 + commit = 30aabb3f42406df45a910d8496f9bee17eeba9bb + parent = f9c73388a58de9b83f260f11008b043d8f7c0954 + method = merge + cmdver = 0.4.9 diff --git a/ktx/external/astc-encoder/.pylintrc b/ktx/external/astc-encoder/.pylintrc new file mode 100644 index 0000000..775f163 --- /dev/null +++ b/ktx/external/astc-encoder/.pylintrc @@ -0,0 +1,532 @@ +[MASTER] + +# Control the amount of potential inferred values when inferring a single +# object. This can help the performance when dealing with large functions or +# complex, nested conditions. +limit-inference-results=100 + +# List of plugins (as comma separated values of python module names) to load, +# usually to register additional checkers. +load-plugins=pylint.extensions.docparams + +# Pickle collected data for later comparisons. +persistent=yes + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages. +suggestion-mode=yes + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + +# Ignore specific directories we don't author ourselves +ignore=Test/DocSource + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. +confidence= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once). You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use "--disable=all --enable=classes +# --disable=W". +disable=print-statement, + parameter-unpacking, + unpacking-in-except, + old-raise-syntax, + backtick, + long-suffix, + old-ne-operator, + old-octal-literal, + import-star-module-level, + non-ascii-bytes-literal, + raw-checker-failed, + bad-inline-option, + locally-disabled, + file-ignored, + suppressed-message, + useless-suppression, + deprecated-pragma, + use-symbolic-message-instead, + apply-builtin, + basestring-builtin, + buffer-builtin, + cmp-builtin, + coerce-builtin, + execfile-builtin, + file-builtin, + long-builtin, + raw_input-builtin, + reduce-builtin, + standarderror-builtin, + unicode-builtin, + xrange-builtin, + coerce-method, + delslice-method, + getslice-method, + setslice-method, + no-absolute-import, + old-division, + dict-iter-method, + dict-view-method, + next-method-called, + metaclass-assignment, + indexing-exception, + raising-string, + reload-builtin, + oct-method, + hex-method, + nonzero-method, + cmp-method, + input-builtin, + round-builtin, + intern-builtin, + unichr-builtin, + map-builtin-not-iterating, + zip-builtin-not-iterating, + range-builtin-not-iterating, + filter-builtin-not-iterating, + using-cmp-argument, + eq-without-hash, + div-method, + idiv-method, + rdiv-method, + exception-message-attribute, + invalid-str-codec, + sys-max-int, + bad-python3-import, + deprecated-string-function, + deprecated-str-translate-call, + deprecated-itertools-function, + deprecated-types-field, + next-method-defined, + dict-items-not-iterating, + dict-keys-not-iterating, + dict-values-not-iterating, + deprecated-operator-function, + deprecated-urllib-function, + xreadlines-attribute, + deprecated-sys-function, + exception-escape, + comprehension-escape + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable=c-extension-no-member + + +[REPORTS] + +# Python expression which should return a score less than or equal to 10. You +# have access to the variables 'error', 'warning', 'refactor', and 'convention' +# which contain the number of messages in each category, as well as 'statement' +# which is the total number of statements analyzed. This score is used by the +# global evaluation report (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio). You can also give a reporter class, e.g. +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Tells whether to display a full report or only the messages. +reports=no + +# Activate the evaluation score. +score=yes + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. +never-returning-functions=sys.exit + + +[BASIC] + +# Naming style matching correct argument names. +argument-naming-style=camelCase + +# Regular expression matching correct argument names. Overrides argument- +# naming-style. +#argument-rgx= + +# Naming style matching correct attribute names. +attr-naming-style=camelCase + +# Regular expression matching correct attribute names. Overrides attr-naming- +# style. +#attr-rgx= + +# Bad variable names which should always be refused, separated by a comma. +bad-names=foo, + bar, + baz, + toto, + tutu, + tata + +# Naming style matching correct class attribute names. +class-attribute-naming-style=any + +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style. +#class-attribute-rgx= + +# Naming style matching correct class names. +class-naming-style=PascalCase + +# Regular expression matching correct class names. Overrides class-naming- +# style. +#class-rgx= + +# Naming style matching correct constant names. +const-naming-style=UPPER_CASE + +# Regular expression matching correct constant names. Overrides const-naming- +# style. +#const-rgx= + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + +# Naming style matching correct function names. +function-naming-style=snake_case + +# Regular expression matching correct function names. Overrides function- +# naming-style. +#function-rgx= + +# Good variable names which should always be accepted, separated by a comma. +good-names=i,j,k,x,y,z,w,r,g,b,a,ex,Run,_ + +# Include a hint for the correct naming format with invalid-name. +include-naming-hint=no + +# Naming style matching correct inline iteration names. +inlinevar-naming-style=any + +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style. +#inlinevar-rgx= + +# Naming style matching correct method names. +method-naming-style=snake_case + +# Regular expression matching correct method names. Overrides method-naming- +# style. +#method-rgx= + +# Naming style matching correct module names. +module-naming-style=snake_case + +# Regular expression matching correct module names. Overrides module-naming- +# style. +#module-rgx= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +# These decorators are taken in consideration only for invalid-name. +property-classes=abc.abstractproperty + +# Naming style matching correct variable names. +variable-naming-style=camelCase + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=79 + +# Maximum number of lines in a module. +max-module-lines=1000 + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[LOGGING] + +# Format style used to check logging format string. `old` means using % +# formatting, `new` is for `{}` formatting,and `fstr` is for f-strings. +logging-format-style=old + +# Logging modules to check that the string format arguments are in logging +# function parameter format. +logging-modules=logging + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +[SIMILARITIES] + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[SPELLING] + +# Limits count of emitted suggestions for spelling mistakes. +max-spelling-suggestions=4 + +# Spelling dictionary name. Available dictionaries: none. To make it work, +# install the python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains the private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to the private dictionary (see the +# --spelling-private-dict-file option) instead of raising a message. +spelling-store-unknown-words=no + + +[STRING] + +# This flag controls whether the implicit-str-concat-in-sequence should +# generate a warning on implicit string concatenation in sequences defined over +# several lines. +check-str-concat-over-line-jumps=no + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# Tells whether to warn about missing members when the owner of the attribute +# is inferred to be None. +ignore-none=yes + +# This flag controls whether pylint should warn about no-member and similar +# checks whenever an opaque object is returned when inferring. The inference +# can return multiple potential results while evaluating a Python object, but +# some branches might not be evaluated, which results in partial inference. In +# that case, it might be useful to still emit no-member and other checks for +# the rest of the inferred objects. +ignore-on-opaque-inference=yes + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis). It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules=signal + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + +# List of decorators that change the signature of a decorated function. +signature-mutators= + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid defining new builtins when possible. +additional-builtins= + +# Tells whether unused global variables should be treated as a violation. +allow-global-unused-variables=yes + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + +# A regular expression matching the name of dummy variables (i.e. expected to +# not be used). +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore. +ignored-argument-names=_.*|^ignored_|^unused_ + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp, + __post_init__ + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=cls + + +[DESIGN] + +# Maximum number of arguments for function / method. +max-args=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=16 + +# Maximum number of boolean expressions in an if statement (see R0916). +max-bool-expr=5 + +# Maximum number of branch for function / method body. +max-branches=12 + +# Maximum number of locals for function / method body. +max-locals=16 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body. +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=0 + + +[IMPORTS] + +# List of modules that can be imported at any level, not just the top level +# one. +allow-any-import-level= + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules=optparse,tkinter.tix + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled). +ext-import-graph= + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled). +import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled). +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Couples of modules and preferred modules, separated by a comma. +preferred-modules= + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "BaseException, Exception". +overgeneral-exceptions=BaseException, + Exception diff --git a/ktx/external/astc-encoder/Docs/Building.md b/ktx/external/astc-encoder/Docs/Building.md new file mode 100644 index 0000000..475226e --- /dev/null +++ b/ktx/external/astc-encoder/Docs/Building.md @@ -0,0 +1,315 @@ +# Building ASTC Encoder + +This page provides instructions for building `astcenc` from the sources in +this repository. + +Builds must use CMake 3.15 or higher as the build system generator. The +examples on this page show how to use it to generate build systems for NMake +(Windows) and Make (Linux and macOS), but CMake supports other build system +backends. + +## Windows + +Builds for Windows are tested with CMake 3.17, and Visual Studio 2019 or newer. + +### Configuring the build + +To use CMake you must first configure the build. Create a build directory in +the root of the `astcenc` checkout, and then run `cmake` inside that directory +to generate the build system. + +```shell +# Create a build directory +mkdir build +cd build + +# Configure your build of choice, for example: + +# x86-64 using a Visual Studio solution +cmake -G "Visual Studio 16 2019" -T ClangCL -DCMAKE_INSTALL_PREFIX=..\ ^ + -DASTCENC_ISA_AVX2=ON -DASTCENC_ISA_SSE41=ON -DASTCENC_ISA_SSE2=ON .. + +# x86-64 using NMake +cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=..\ ^ + -DASTCENC_ISA_AVX2=ON -DASTCENC_ISA_SSE41=ON -DASTCENC_ISA_SSE2=ON .. +``` + +A single CMake configure can build multiple binaries for a single target CPU +architecture, for example building x64 for both SSE2 and AVX2. Each binary name +will include the build variant as a postfix. It is possible to build any set of +the supported SIMD variants by enabling only the ones you require. + +Using the Visual Studio Clang-CL LLVM toolchain (`-T ClangCL`) is optional but +produces significantly faster binaries than the default toolchain. The C++ LLVM +toolchain component must be installed via the Visual Studio installer. + +### Building + +Once you have configured the build you can use NMake to compile the project +from your build dir, and install to your target install directory. + +```shell +# Run a build and install build outputs in `${CMAKE_INSTALL_PREFIX}/bin/` +cd build +nmake install +``` + +## macOS and Linux using Make + +Builds for macOS and Linux are tested with CMake 3.17, and clang++ 9.0 or +newer. + +> Compiling using g++ is supported, but clang++ builds are faster by ~15%. + +### Configuring the build + +To use CMake you must first configure the build. Create a build directory +in the root of the astcenc checkout, and then run `cmake` inside that directory +to generate the build system. + +```shell +# Select your compiler (clang++ recommended, but g++ works) +export CXX=clang++ + +# Create a build directory +mkdir build +cd build + +# Configure your build of choice, for example: + +# Arm arch64 +cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../ \ + -DASTCENC_ISA_NEON=ON .. + +# x86-64 +cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../ \ + -DASTCENC_ISA_AVX2=ON -DASTCENC_ISA_SSE41=ON -DASTCENC_ISA_SSE2=ON .. + +# macOS universal binary build +cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../ .. +``` + +A single CMake configure can build multiple binaries for a single target CPU +architecture, for example building x64 for both SSE2 and AVX2. Each binary name +will include the build variant as a postfix. It is possible to build any set of +the supported SIMD variants by enabling only the ones you require. + +For macOS, we additionally support the ability to build a universal binary. +This build includes SSE4.1 (`x86_64`), AVX2 (`x86_64h`), and NEON (`arm64`) +build slices in a single output binary. The OS will select the correct variant +to run for the machine being used. This is the default build target for a macOS +build, but single-target binaries can still be built by setting +`-DASTCENC_UNIVERSAL_BINARY=OFF` and then manually selecting the specific ISA +variants that are required. + +### Building + +Once you have configured the build you can use Make to compile the project from +your build dir, and install to your target install directory. + +```shell +# Run a build and install build outputs in `${CMAKE_INSTALL_PREFIX}/bin/` +# for executable binaries and `${CMAKE_INSTALL_PREFIX}/lib/` for libraries +cd build +make install -j16 +``` + +## macOS using XCode + +Builds for macOS and Linux are tested with CMake 3.17, and XCode 14.0 or +newer. + +### Configuring the build + +To use CMake you must first configure the build. Create a build directory +in the root of the astcenc checkout, and then run `cmake` inside that directory +to generate the build system. + +```shell +# Create a build directory +mkdir build +cd build + +# Configure a universal build +cmake -G Xcode -DCMAKE_INSTALL_PREFIX=../ .. +``` + +### Building + +Once you have configured the build you can use CMake to compile the project +from your build dir, and install to your target install directory. + +```shell +cmake --build . --config Release + +# Optionally install the binaries to the installation directory +cmake --install . --config Release +``` + +## Advanced build options + +For codec developers and power users there are a number of useful features in +the build system. + +### Build Types + +We support and test the following `CMAKE_BUILD_TYPE` options. + +| Value | Description | +| ---------------- | -------------------------------------------------------- | +| Release | Optimized release build | +| RelWithDebInfo | Optimized release build with debug info | +| Debug | Unoptimized debug build with debug info | + +Note that optimized release builds are compiled with link-time optimization, +which can make profiling more challenging ... + +### Shared Libraries + +We support building the core library as a shared object by setting the CMake +option `-DASTCENC_SHAREDLIB=ON` at configure time. For macOS build targets the +shared library supports the same universal build configuration as the command +line utility. + +Note that the command line tool is always statically linked; the shared objects +are an extra build output that are not currently used by the command line tool. + +### Constrained block size builds + +All normal builds will support all ASTC block sizes, including the worst case +6x6x6 3D block size (216 texels per block). Compressor memory footprint and +performance can be improved by limiting the block sizes supported in the build +by adding `-DASTCENC_BLOCK_MAX_TEXELS=` to to CMake command line +when configuring. Legal block sizes that are unavailable in a restricted build +will return the error `ASTCENC_ERR_NOT_IMPLEMENTED` during context creation. + +### Non-invariant builds + +All normal builds are designed to be invariant, so any build from the same git +revision will produce bit-identical results for all compilers and CPU +architectures. To achieve this we sacrifice some performance, so if this is +not required you can specify `-DASTCENC_INVARIANCE=OFF` to enable additional +optimizations. This has most benefit for AVX2 builds where we are able to +enable use of the FMA instruction set extensions. + +### No intrinsics builds + +All normal builds will use SIMD accelerated code paths using intrinsics, as all +supported target architectures (x86 and arm64) guarantee SIMD availability. For +development purposes it is possible to build an intrinsic-free build which uses +no explicit SIMD acceleration (the compiler may still auto-vectorize). + +To enable this binary variant add `-DASTCENC_ISA_NONE=ON` to the CMake command +line when configuring. It is NOT recommended to use this for production; it is +significantly slower than the vectorized SIMD builds. + +### No x86 gather instruction builds + +On many x86 microarchitectures the native AVX gather instructions are slower +than simply performing manual scalar loads and combining the results. Gathers +are enabled by default, but can be disabled by setting the CMake option +`-DASTCENC_X86_GATHERS=OFF` on the command line when configuring. + +Note that we have seen mixed results when compiling the scalar fallback path, +so we would recommend testing which option works best for the compiler and +microarchitecture pairing that you are targeting. + +### Test builds + +We support building unit tests. These use the `googletest` framework, which is +pulled in though a git submodule. On first use, you must fetch the submodule +dependency: + +```shell +git submodule init +git submodule update +``` + +To build unit tests add `-DASTCENC_UNITTEST=ON` to the CMake command line when +configuring. + +To run unit tests use the CMake `ctest` utility from your build directory after +you have built the tests. + +```shell +cd build +ctest --verbose +``` + +### Sanitizer builds + +We support building with sanitizers on Linux and macOS when using Clang. + +To build binaries with ASAN checking enabled add `-DASTCENC_ASAN=ON` to the +CMake command line when configuring. + +To build binaries with UBSAN checking enabled add `-DASTCENC_UBSAN=ON` to the +CMake command line when configuring. + +### Android builds + +Builds of the command line utility for Android are not officially supported, but can be a useful +development build for testing on e.g. different Arm CPU microarchitectures. + +The build script below shows one possible route to building the command line tool for Android. Once +built the application can be pushed to e.g. `/data/local/tmp` and executed from an Android shell +terminal over `adb`. + +```shell +ANDROID_ABI=arm64-v8a +ANDROID_NDK=/work/tools/android/ndk/22.1.7171670 + +BUILD_TYPE=RelWithDebInfo + +BUILD_DIR=build + +mkdir -p ${BUILD_DIR} +cd ${BUILD_DIR} + +cmake \ + -DCMAKE_INSTALL_PREFIX=./ \ + -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \ + -DANDROID_ABI=${ANDROID_ABI} \ + -DANDROID_ARM_NEON=ON \ + -DANDROID_PLATFORM=android-21 \ + -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang \ + -DANDROID_TOOLCHAIN=clang \ + -DANDROID_STL=c++_static \ + -DARCH=aarch64 \ + -DASTCENC_ISA_NEON=ON \ + .. + +make -j16 +``` + +## Packaging a release bundle + +We support building a release bundle of all enabled binary configurations in +the current CMake configuration using the `package` build target + +Configure CMake with: + +* `-DASTCENC_PACAKGE=` to set the package architecture/variant name used +to name the package archive (not set by default). + +```shell +# Run a build and package build outputs in `./astcenc---.` +cd build +make package -j16 +``` + +Windows packages will use the `.zip` format, other packages will use the +`.tar.gz` format. + +## Integrating as a library into another project + +The core codec of `astcenc` is built as a library, and so can be easily +integrated into other projects using CMake. An example of the CMake integration +and the codec API usage can be found in the `./Utils/Example` directory in the +repository. See the [Example Readme](../Utils/Example/README.md) for more +details. + +- - - + +_Copyright © 2019-2024, Arm Limited and contributors. All rights reserved._ diff --git a/ktx/external/astc-encoder/Docs/ChangeLog-2x.md b/ktx/external/astc-encoder/Docs/ChangeLog-2x.md new file mode 100644 index 0000000..0c1ccdc --- /dev/null +++ b/ktx/external/astc-encoder/Docs/ChangeLog-2x.md @@ -0,0 +1,328 @@ +# 2.x series change log + +This page summarizes the major functional and performance changes in each +release of the 2.x series. + +All performance data on this page is measured on an Intel Core i5-9600K +clocked at 4.2 GHz, running astcenc using 6 threads. + + +## 2.5 + +**Status:** Released, March 2021 + +The 2.5 release is the last major release in the 2.x series. After this release +a `2.x` branch will provide stable long-term support, and the `main` branch +will switch to focusing on more radical changes for the 3.x series. + +Reminder for users of the library interface - the API is not designed to be +stable across versions, and this release is not compatible with earlier 2.x +releases. Please update and rebuild your client-side code using the updated +`astcenc.h` header. + +**General:** + * **Feature:** The `ISA_INVARIANCE` build option is no longer supported, as + there is no longer any performance benefit from the variant paths. All + builds are now using the equivalent of the `ISA_INVARIANCE=ON` setting, and + all builds (except Armv7) are now believed to be invariant across operating + systems, compilers, CPU architectures, and SIMD instruction sets. + * **Feature:** Armv8 32-bit builds with NEON are now supported, with + out-of-the-box support for Arm Linux soft-float and hard-float ABIs. There + are no pre-built binaries for these targets; support is included for + library users targeting older 32-bit Android and iOS devices. + * **Feature:** A compressor mode for encoding HDR textures that have been + encoded into LDR RGBM wrapper format is now supported. Note that this + encoding has some strong recommendations for how the RGBM encoding is + implemented to avoid block artifacts in the compressed image. +* **Core API:** + * **API Change:** The core API has been changed to be a pure C API, making it + easier to wrap the codec in a stable shared library ABI. Some entry points + that used to accept references now expect pointers. + * **API Change:** The decompression functionality in the core API has been + changed to allow use of multiple threads. The design pattern matches the + compression functionality, requiring the caller to create the threads, + synchronize them between images, and to call the new + `astcenc_decompress_reset()` function between images. +* **API Feature:** Defines to support exporting public API entry point + symbols from a shared object are provided, but not exposed off-the-shelf by + the CMake provided by the project. + * **API Feature:** New `astcenc_get_block_info()` function added to the core + API to allow users to perform high level analysis of compressed data. This + API is not implemented in decompressor-only builds. + * **API Feature:** Codec configuration structure has been extended to expose + the new RGBM compression mode. See the API header for details. + + +## 2.4 + +**Status:** Released, February 2021 + +The 2.4 release is the fifth release in the 2.x series. It is primarily a bug +fix release for HDR image handling, which impacts all earlier 2.x series +releases. + +**General:** + * **Feature:** When using the `-a` option, or the equivalent config option + for the API, any 2D blocks that are entirely zero alpha after the alpha + filter radius is taken into account are replaced by transparent black + constant color blocks. This is an RDO-like technique to improve compression + ratios of any additional application packaging compression that is applied. +**Command Line:** + * **Bug fix:** The command line wrapper now correctly loads HDR images that + have a non-square aspect ratio. + + +## 2.3 + +**Status:** Released, January 2021 + +The 2.3 release is the fourth release in the 2.x series. It includes a number +of performance improvements and new features. + +Reminder for users of the library interface - the API is not designed to be +stable across versions, and this release is not compatible with 2.2. Please +recompile your client-side code using the updated `astcenc.h` header. + +* **General:** + * **Feature:** Decompressor-only builds of the codec are supported again. + While this is primarily a feature for library users who want to shrink + binary size, a variant command line tool `astcdec` can be built by + specifying `DECOMPRESSOR=ON` on the CMake configure command line. + * **Feature:** Diagnostic builds of the codec can now be built. These builds + generate a JSON file containing a trace of the compressor execution. + Diagnostic builds are only suitable for codec development; they are slower + and JSON generation cannot be disabled. Build by setting `DIAGNOSTICS=ON` + on the CMake configure command line. + * **Feature:** Code compatibility improved with older versions of GCC, + earliest compiler now tested is GCC 7.5 (was GCC 9.3). + * **Feature:** Code compatibility improved with newer versions of LLVM, + latest compiler now tested is Clang 12.0 (was Clang 9.0). + * **Feature:** Code compatibility improved with the Visual Studio 2019 LLVM + toolset (`clang-cl`). Using the LLVM toolset gives 25% performance + improvements and is recommended. +* **Command Line:** + * **Feature:** Quality level now accepts either a preset (`-fast`, etc) or a + float value between 0 and 100, allowing more control over the compression + quality vs performance trade-off. The presets are not evenly spaced in the + float range; they have been spaced to give the best distribution of points + between the fast and thorough presets. + * `-fastest`: 0.0 + * `-fast`: 10.0 + * `-medium`: 60.0 + * `-thorough`: 98.0 + * `-exhaustive`: 100.0 +* **Core API:** + * **API Change:** Quality level preset enum replaced with a float value + between 0 (`-fastest`) and 100 (`-exhaustive`). See above for more info. + +### Performance + +This release includes a number of optimizations to improve performance. + +* New compressor algorithm for handling encoding candidates and refinement. +* Vectorized implementation of `compute_error_of_weight_set()`. +* Unrolled implementation of `encode_ise()`. +* Many other small improvements! + +The most significant change is the change to the compressor path, which now +uses an adaptive approach to candidate trials and block refinement. + +In earlier releases the quality level will determine the number of encoding +candidates and the number of iterative refinement passes that are used for each +major encoding trial. This is a fixed behavior; it will always try the full N +candidates and M refinement iterations specified by the quality level for each +encoding trial. + +The new approach implements two optimizations for this: + +* Compression will complete when a block candidate hits the specified target + quality, after its M refinement iterations have been applied. Later block + candidates are simply abandoned. +* Block candidates will predict how much refinement can improve them, and + abandon refinement if they are unlikely to improve upon the best known + encoding already in-hand. + +This pair of optimizations provides significant performance improvement to the +high quality modes which use the most block candidates and refinement +iterations. A minor loss of image quality is expected, as the blocks we no +longer test or refine may have been better coding choices. + +**Absolute performance vs 2.2 release:** + +![Absolute scores 2.3 vs 2.2](./ChangeLogImg/absolute-2.2-to-2.3.png) + +**Relative performance vs 2.2 release:** + +![Relative scores 2.3 vs 2.2](./ChangeLogImg/relative-2.2-to-2.3.png) + + +## 2.2 + +**Status:** Released, January 2021 + +The 2.2 release is the third release in the 2.x series. It includes a number +of performance improvements and new features. + +Reminder for users of the library interface - the API is not designed to be +stable across versions, and this release is not compatible with 2.1. Please +recompile your client-side code using the updated `astcenc.h` header. + +* **General:** + * **Feature:** New Arm aarch64 NEON accelerated vector library support. + * **Improvement:** New CMake build system for all platforms. + * **Improvement:** SSE4.2 feature profile changed to SSE4.1, which more + accurately reflects the feature set used. +* **Binary releases:** + * **Improvement:** Linux binaries changed to use Clang 9.0, which gives + up to 15% performance improvement. + * **Improvement:** Windows binaries are now code signed. + * **Improvement:** macOS binaries for Apple silicon platforms now provided. + * **Improvement:** macOS binaries are now code signed and notarized. +* **Command Line:** + * **Feature:** New image preprocess `-pp-normalize` option added. This forces + normal vectors to be unit length, which is useful when compressing source + textures that use normal length to encode an NDF, which is incompatible + with ASTC's two channel encoding. + * **Feature:** New image preprocess `-pp-premultiply` option added. This + scales RGB values by the alpha value. This can be useful to minimize + cross-channel color bleed caused by GPU post-multiply filtering/blending. + * **Improvements:** Command line tool cleanly traps and reports errors for + corrupt input images rather than relying on standard library `assert()` + calls in release builds. +* **Core API:** + * **API Change:** Images using region-based metrics no longer need to include + padding; all input images should be tightly packed and `dim_pad` is removed + from the `astcenc_image` structure. This makes it easier to directly use + images loaded from other libraries. + * **API Change:** Image `data` is no longer a 3D array accessed using + `data[z][y][x]` indexing, it's an array of 2D slices. This makes it easier + to directly use images loaded from other libraries. + * **API Change:** New `ASTCENC_FLG_SELF_DECOMPRESS_ONLY` flag added to the + codec config. Using this flag enables additional optimizations that + aggressively exploit implementation- and configuration-specific, behavior + to gain performance. When using this flag the codec can only reliably + decompress images that were compressed in the same context session. Images + produced via other means may fail to decompress correctly, even if they are + otherwise valid ASTC files. + +### Performance + +There is one major set of optimizations in this release, related to the new +`ASTCENC_FLG_SELF_DECOMPRESS_ONLY` mode. These allow the compressor to only +create data tables it knows that it is going to use, based on its current set +of heuristics, rather than needing the full set the format allows. + +The first benefit of these changes is a reduced context creation time, which +can be reduced by up to 250ms on our test machine. This is a significant +percentage of the command line utility runtime for a small image when using a +quick search preset. Compressing the whole Kodak test suite using the command +line utility and the `-fastest` preset is ~30% faster with this release, which +is mostly due to faster startup. + +The reduction in the data table size in this mode also improve the core codec +speed. Our test sets show an average of 12% improvement in the codec for +`-fastest` mode, and an average of 3% for `-medium` mode. + +Key for performance charts: + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Absolute performance vs 2.1 release:** + +![Absolute scores 2.2 vs 2.1](./ChangeLogImg/absolute-2.1-to-2.2.png) + +**Relative performance vs 2.1 release:** + +![Relative scores 2.2 vs 2.1](./ChangeLogImg/relative-2.1-to-2.2.png) + + + +## 2.1 + +**Status:** Released, November 2020 + +The 2.1 release is the second release in the 2.x series. It includes a number +of performance optimizations and new features. + +Reminder for users of the library interface - the API is not designed to be +stable across versions, and this release is not compatible with 2.0. Please +recompile your client-side code using the updated `astcenc.h` header. + +### Features: + +* **Command line:** + * **Bug fix:** The meaning of the `-tH\cH\dH` and `-th\ch\dh` compression + modes was inverted. They now match the documentation; use `-*H` for HDR + RGBA, and `-*h` for HDR RGB with LDR alpha. + * **Feature:** A new `-fastest` quality preset is now available. This is + designed for fast "roughing out" of new content, and sacrifices significant + image quality compared to `-fast`. We do not recommend its use for + production builds. + * **Feature:** A new `-candidatelimit` compression tuning option is now + available. This is a power-user control to determine how many candidates + are returned for each block mode encoding trial. This feature is used + automatically by the search presets; see `-help` for details. + * **Improvement:** The compression test modes (`-tl\ts\th\tH`) now emit a + MTex/s performance metric, in addition to coding time. +* **Core API:** + * **Feature:** A new quality preset `ASTCENC_PRE_FASTEST` is available. See + `-fastest` above for details. + * **Feature:** A new tuning option `tune_candidate_limit` is available in + the config structure. See `-candidatelimit` above for details. + * **Feature:** Image input/output can now use `ASTCENC_TYPE_F32` data types. +* **Stability:** + * **Feature:** The SSE2, SSE4.2, and AVX2 variants now produce identical + compressed output when run on the same CPU when compiled with the + preprocessor define `ASTCENC_ISA_INVARIANCE=1`. For Make builds this can + be set on the command line by setting `ISA_INV=1`. ISA invariance is off + by default; it reduces performance by 1-3%. + +### Performance + +Key for performance charts: + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Absolute performance vs 2.0 release:** + +![Absolute scores 2.1 vs 2.0](./ChangeLogImg/absolute-2.0-to-2.1.png) + +**Relative performance vs 2.0 release:** + +![Relative scores 2.1 vs 2.0](./ChangeLogImg/relative-2.0-to-2.1.png) + + + +## 2.0 + +**Status:** Released, August 2020 + +The 2.0 release is first release in the 2.x series. It includes a number of +major changes over the earlier 1.7 series, and is not command-line compatible. + +### Features: + +* The core codec can be built as a library, exposed via a new codec API. +* The core codec supports accelerated SIMD paths for SSE2, SSE4.2, and AVX2. +* The command line syntax has a clearer mapping to Khronos feature profiles. + +### Performance: + +Key for performance charts + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Absolute performance vs 1.7 release:** + +![Absolute scores 2.0 vs 1.7](./ChangeLogImg/absolute-1.7-to-2.0.png) + +**Relative performance vs 1.7 release:** + +![Relative scores 2.0 vs 1.7](./ChangeLogImg/relative-1.7-to-2.0.png) + +- - - + +_Copyright © 2020-2022, Arm Limited and contributors. All rights reserved._ diff --git a/ktx/external/astc-encoder/Docs/ChangeLog-3x.md b/ktx/external/astc-encoder/Docs/ChangeLog-3x.md new file mode 100644 index 0000000..2bb022f --- /dev/null +++ b/ktx/external/astc-encoder/Docs/ChangeLog-3x.md @@ -0,0 +1,308 @@ +# 3.x series change log + +This page summarizes the major functional and performance changes in each +release of the 3.x series. + +All performance data on this page is measured on an Intel Core i5-9600K +clocked at 4.2 GHz, running `astcenc` using AVX2 and 6 threads. + + +## 3.7 + +**Status:** April 2022 + +The 3.7 release contains another round of performance optimizations, including +significant improvements to the command line front-end (faster PNG loader) and +the arm64 build of the codec (faster NEON implementation). + +* **General:** + * **Feature:** The command line tool PNG loader has been switched to use + the Wuffs library, which is robust and significantly faster than the + current stb_image implementation. + * **Feature:** Support for non-invariant builds returns. Opt-in to slightly + faster, but not bit-exact, builds by setting `-DNO_INVARIANCE=ON` for the + CMake configuration. This improves performance by around 2%. + * **Optimization:** Changed SIMD `select()` so that it matches the default + NEON behavior (bitwise select), rather than the default x86-64 behavior + (lane select on MSB). Specialization `select_msb()` added for the one case + we want to select on a sign-bit, where NEON needs a different + implementation. This provides a significant (>25%) performance uplift on + NEON implementations. + +### Performance: + +Key for charts: + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Relative performance vs 3.5 release:** + +![Relative scores 3.7 vs 3.6](./ChangeLogImg/relative-3.6-to-3.7.png) + + +## 3.6 + +**Status:** April 2022 + +The 3.6 release contains another round of performance optimizations. + +There are no interface changes in this release, but in general the API is not +designed to be binary compatible across versions. We always recommend +rebuilding your client-side code using the updated `astcenc.h` header. + +* **General:** + * **Feature:** Data tables are now optimized for contexts without the + `SELF_DECOMPRESS_ONLY` flag set. The flag therefore no longer improves + compression performance, but still reduces context creation time and + context data table memory footprint. + * **Feature:** Image quality for 4x4 `-fastest` configuration has been + improved. + * **Optimization:** Decimation modes are reliably excluded from processing + when they are only partially selected in the compressor configuration (e.g. + if used for single plane, but not dual plane modes). This is a significant + performance optimization for all quality levels. + * **Optimization:** Fast-path block load function variant added for 2D LDR + images with no swizzle. This is a moderate performance optimization for the + fast and fastest quality levels. + +### Performance: + +Key for charts: + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Relative performance vs 3.5 release:** + +![Relative scores 3.6 vs 3.5](./ChangeLogImg/relative-3.5-to-3.6.png) + + +## 3.5 + +**Status:** March 2022 + +The 3.5 release contains another round of performance optimizations. + +There are no interface changes in this release, but in general the API is not +designed to be binary compatible across versions. We always recommend +rebuilding your client-side code using the updated `astcenc.h` header. + +* **General:** + * **Feature:** Compressor configurations using `SELF_DECOMPRESS_ONLY` mode + store compacted partition tables, which significantly improves both + context create time and runtime performance. + * **Feature:** Bilinear infill for decimated weight grids supports a new + variant for half-decimated grids which are only decimated in one axis. + +### Performance: + +Key for charts: + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Relative performance vs 3.4 release:** + +![Relative scores 3.5 vs 3.4](./ChangeLogImg/relative-3.4-to-3.5.png) + + + +## 3.4 + +**Status:** February 2022 + +The 3.4 release introduces another round of optimizations, removing a number +of power-user configuration options to simplify the core compressor data path. + +Reminder for users of the library interface - the API is not designed to be +binary compatible across versions, and this release is not compatible with +earlier releases. Please update and rebuild your client-side code using the +updated `astcenc.h` header. + +* **General:** + * **Feature:** Many memory allocations have been moved off the stack into + dynamically allocated working memory. This significantly reduces the peak + stack usage, allowing the compressor to run in systems with 128KB stack + limits. + * **Feature:** Builds now support `-DBLOCK_MAX_TEXELS=` to allow a + compressor to support a subset of block sizes. This can reduce binary size + and runtime memory footprint, and improve performance. + * **Feature:** The `-v` and `-va` options to set a per-texel error weight + function are no longer supported. + * **Feature:** The `-b` option to set a per-texel error weight boost for + block border texels is no longer supported. + * **Feature:** The `-a` option to set a per-texel error weight based on texel + alpha value is no longer supported as an error weighting tool, but is still + supported for providing sprite-sheet RDO. + * **Feature:** The `-mask` option to set an error metric for mask map + textures is still supported, but is currently a no-op in the compressor. + * **Feature:** The `-perceptual` option to set a perceptual error metric is + still supported, but is currently a no-op in the compressor for mask map + and normal map textures. + * **Bug-fix:** Corrected decompression of error blocks in some cases, so now + returning the expected error color (magenta for LDR, NaN for HDR). Note + that astcenc determines the error color to use based on the output image + data type not the decoder profile. +* **Binary releases:** + * **Improvement:** Windows binaries changed to use ClangCL 12.0, which gives + up to 10% performance improvement. + +### Performance: + +Key for charts: + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Relative performance vs 3.3 release:** + +![Relative scores 3.4 vs 3.3](./ChangeLogImg/relative-3.3-to-3.4.png) + + + +## 3.3 + +**Status:** November 2021 + +The 3.3 release improves image quality for normal maps, and two component +textures. Normal maps are expected to compress 25% slower than the 3.2 +release, although it should be noted that they are still faster to compress +in 3.3 than when using the 2.5 series. This release also fixes one reported +stability issue. + +* **General:** + * **Feature:** Normal map image quality has been improved. + * **Feature:** Two component image quality has been improved, provided + that unused components are correctly zero-weighted using e.g. `-cw` on the + command line. + * **Bug-fix:** Improved stability when trying to compress complex blocks that + could not beat even the starting quality threshold. These will now always + compress in to a constant color blocks. + + +## 3.2 + +**Status:** August 2021 + +The 3.2 release is a bugfix release; no significant image quality or +performance differences are expected. + +* **General:** + * **Bug-fix:** Improved stability when new contexts were created while other + contexts were compressing or decompressing an image. + * **Bug-fix:** Improved stability when decompressing blocks with invalid + block encodings. + + +## 3.1 + +**Status:** July 2021 + +The 3.1 release gives another performance boost, typically between 5 and 20% +faster than the 3.0 release, as well as further incremental improvements to +image quality. A number of build system improvements make astcenc easier and +faster to integrate into other projects as a library, including support for +building universal binaries on macOS. Full change list is shown below. + +Reminder for users of the library interface - the API is not designed to be +binary compatible across versions, and this release is not compatible with +earlier releases. Please update and rebuild your client-side code using the +updated `astcenc.h` header. + +* **General:** + * **Feature:** RGB color data now supports `-perceptual` operation. The + current implementation is simple, weighting color channel errors by their + contribution to perceived luminance. This mimics the behavior of the human + visual system, which is most sensitive to green, then red, then blue. + * **Feature:** Codec supports a new low weight search mode, which is a + simpler weight assignment for encodings with a low number of weights in the + weight grid. The weight threshold can be overridden using the new + `-lowweightmodelimit` command line option. + * **Feature:** All platform builds now support building a native binary. + Native binaries automatically select the SIMD level based on the default + configuration of the compiler in use. Native binaries built on one machine + may use different SIMD options than native binaries build on another. + * **Feature:** macOS platform builds now support building universal binaries + containing both `x86_64` and `arm64` target support. + * **Feature:** Building the command line can be disabled when using as a + library in another project. Set `-DCLI=OFF` during the CMake configure + step. + * **Feature:** A standalone minimal example of the core codec API usage has + been added in the `./Utils/Example/` directory. +* **Core API:** + * **Feature:** Config flag `ASTCENC_FLG_USE_PERCEPTUAL` works for color data. + * **Feature:** Config option `tune_low_weight_count_limit` added. + * **Feature:** New heuristic added which prunes dual weight plane searches if + they are unlikely to help. This heuristic is not user controllable. + * **Feature:** Image quality has been improved. In general we see significant + improvements (up to 0.2dB) for high bitrate encodings (4x4, 5x4), and a + smaller improvement (up to 0.1dB) for lower bitrate encodings. + * **Bug fix:** Arm "none" SIMD builds could be invariant with other builds. + This fix has also been back-ported to the 2.x LTS branch. + +### Performance: + +Key for charts: + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Relative performance vs 3.0 release:** + +![Relative scores 3.1 vs 3.0](./ChangeLogImg/relative-3.0-to-3.1.png) + + +## 3.0 + +**Status:** June 2021 + +The 3.0 release is the first in a series of updates to the compressor that are +making more radical changes than we felt we could make with the 2.x series. +The primary goals of the 3.x series are to keep the image quality ~static or +better compared to the 2.5 release, but continue to improve performance. + +Reminder for users of the library interface - the API is not designed to be +binary compatible across versions, and this release is not compatible with +earlier releases. Please update and rebuild your client-side code using the +updated `astcenc.h` header. + +* **General:** + * **Feature:** The code has been significantly cleaned up, with improved + comments, API documentation, function naming, and variable naming. +* **Core API:** + * **API Change:** The core APIs for `astcenc_compress_image()` and for + `astcenc_decompress_image()` now accept swizzle structures by `const` + pointer, instead of pass-by-value. + * **API Change:** Calling the `astcenc_compress_reset()` and the + `astcenc_decompress_reset()` functions between images is no longer required + if the context was created for use by a single thread. + * **Feature:** New heuristics have been added for controlling when to search + beyond 2 partitions and 1 plane, and when to search beyond 3 partitions and + 1 plane. The previous `tune_partition_early_out_limit` config option has + been removed, and replaced with two new options + `tune_2_partition_early_out_limit_factor` and + `tune_3_partition_early_out_limit_factor`. See command line help for more + detailed documentation. + * **Feature:** New heuristics have been added for controlling when to use + dual weight planes. The previous `tune_two_plane_early_out_limit` has been + renamed to`tune_2_plane_early_out_limit_correlation`. See command line help + for more detailed documentation. + * **Feature:** Support for using dual weight planes has been restricted to + single partition blocks; it rarely helps blocks with 2 or more partitions + and takes considerable compression search time. + +### Performance: + +Key for charts: + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Relative performance vs 2.5 release:** + +![Relative scores 3.0 vs 2.5](./ChangeLogImg/relative-2.5-to-3.0.png) + +- - - + +_Copyright © 2021-2022, Arm Limited and contributors. All rights reserved._ diff --git a/ktx/external/astc-encoder/Docs/ChangeLog-4x.md b/ktx/external/astc-encoder/Docs/ChangeLog-4x.md new file mode 100644 index 0000000..0e8216b --- /dev/null +++ b/ktx/external/astc-encoder/Docs/ChangeLog-4x.md @@ -0,0 +1,416 @@ +# 4.x series change log + +This page summarizes the major functional and performance changes in each +release of the 4.x series. + +All performance data on this page is measured on an Intel Core i5-9600K +clocked at 4.2 GHz, running `astcenc` using AVX2 and 6 threads. + + +## 4.8.0 + +**Status:** May 2024 + +The 4.8.0 release is a minor maintenance release. + +* **General:** + * **Bug fix:** Native builds on macOS will now correctly build for arm64 when + run outside of Rosetta on an Apple silicon device. + * **Bug fix:** Multiple small improvements to remove use of undefined + language behavior, to improve support for deployment using Emscripten. + * **Feature:** Builds using Clang can now build with undefined behavior + sanitizer by setting `-DASTCENC_UBSAN=ON` on the CMake configure line. + * **Feature:** Updated to Wuffs library 0.3.4, which ignores tRNS alpha + chunks for type 4 (LA) and 6 (RGBA) PNGs, to improve compatibility with + libpng. + + +## 4.7.0 + +**Status:** January 2024 + +The 4.7.0 release is a major maintenance release, fixing rounding behavior in +the decompressor to match the Khronos specification. This fix includes the +addition of explicit support for optimizing for `decode_unorm8` rounding. + +Reminder - the codec library API is not designed to be binary compatible across +versions. We always recommend rebuilding your client-side code using the +updated `astcenc.h` header. + +* **General:** + * **Bug fix:** sRGB LDR decompression now uses the correct endpoint expansion + method to create the 16-bit RGB endpoint colors, and removes the previous + correction code from the interpolation function. This bug could result in + LSB bit flips relative to the standard specification. + * **Bug fix:** Decompressing to an 8-bit per component output image now + matches the `decode_unorm8` extension rounding rules. This bug could result + in LSB bit flips relative to the standard specification. + * **Bug fix:** Code now avoids using `alignas()` in the reference C + implementation, as the default `alignas(16)` is narrower than the + native minimum alignment requirement on some CPUs. + * **Feature:** Library configuration supports a new flag, + `ASTCENC_FLG_USE_DECODE_UNORM8`. This flag indicates that the image will be + used with the `decode_unorm8` decode mode. When set during compression + this allows the compressor to use the correct rounding when determining the + best encoding. + * **Feature:** Command line tool supports a new option, `-decode_unorm8`. + This option indicates that the image will be used with the `decode_unorm8` + decode mode. This option will automatically be set for decompression + (`-d*`) and trial (`-t*`) tool operation if the decompressed output image + is stored to an 8-bit per component file format. This option must be set + manually for compression (`-c*`) tool operation, as the desired decode mode + cannot be reliably determined. + * **Feature:** Library configuration supports a new optional progress + reporting callback to be specified. This is called during compression to + to allow interactive tooling use cases to display incremental progress. The + command line tool uses this feature to show compression progress unless + `-silent` is used. + + +## 4.6.1 + +**Status:** November 2023 + +The 4.6.1 release is a minor maintenance release to fix a scaling bug on +large core count Windows systems. + +* **General:** + * **Optimization:** Windows builds of the `astcenc` command line tool can now + use more than 64 cores on large core count systems. This change doubled + command line performance for `-exhaustive` compression when testing on an + 96 core/192 thread system. + * **Feature:** Windows Arm64 native builds of the `astcenc` command line tool + are now included in the prebuilt release binaries. + + +## 4.6.0 + +**Status:** November 2023 + +The 4.6.0 release retunes the compressor heuristics to give improvements to +performance for trivial losses to image quality. It also includes some minor +bug fixes and code quality improvements. + +Reminder - the codec library API is not designed to be binary compatible across +versions. We always recommend rebuilding your client-side code using the updated +`astcenc.h` header. + +* **General:** + * **Bug-fix:** Fixed context allocation for contexts allocated with the + `ASTCENC_FLG_DECOMPRESS_ONLY` flag. + * **Bug-fix:** Reduced use of `reinterpret_cast` in the core codec to + avoid strict aliasing violations. + * **Optimization:** `-medium` search quality no longer tests 4 partition + encodings for block sizes between 25 and 83 texels (inclusive). This + improves performance for a tiny drop in image quality. + * **Optimization:** `-thorough` and higher search qualities no longer test the + mode0 first search for block sizes between 25 and 83 texels (inclusive). + This improves performance for a tiny drop in image quality. + * **Optimization:** `TUNE_MAX_PARTITIONING_CANDIDATES` reduced from 32 to 8 + to reduce the size of stack allocated data structures. This causes a tiny + drop in image quality for the `-verythorough` and `-exhaustive` presets. + + +## 4.5.0 + +**Status:** June 2023 + +The 4.5.0 release is a maintenance release with small image quality +improvements, and a number of build system quality of life improvements. + +* **General:** + * **Bug-fix:** Improved handling compiler arguments in CMake, including + consistent use of MSVC-style command line arguments for ClangCL. + * **Bug-fix:** Invariant Clang builds now use `-ffp-model=precise` with + `-ffp-contract=off` which is needed to restore invariance due to recent + changes in compiler defaults. + * **Change:** macOS binary releases are now distributed as a single universal + binary for all platforms. + * **Change:** Windows binary releases are now compiled with VS2022. + * **Change:** Invariant MSVC builds for VS2022 now use `/fp:precise` instead + of `/fp:strict`, which is is now possible because precise no longer implies + contraction. This should improve performance for MSVC builds. + * **Change:** Non-invariant Clang builds now use `-ffp-model=precise` with + `-ffp-contract=on`. This should improve performance on older Clang + versions which defaulted to no contraction. + * **Change:** Non-invariant MSVC builds for VS2022 now use `/fp:precise` + with `/fp:contract`. This should improve performance for MSVC builds. + * **Change:** CMake config variables now use an `ASTCENC_` prefix to add a + namespace and group options when the library is used in a larger project. + * **Change:** CMake config `ASTCENC_UNIVERSAL_BUILD` for building macOS + universal binaries has been improved to include the `x86_64h` slice for + AVX2 builds. Universal builds are now on by default for macOS, and always + include NEON (arm64), SSE4.1 (x86_64), and AVX2 (x86_64h) variants. + * **Change:** CMake config `ASTCENC_NO_INVARIANCE` has been inverted to + remove the negated option, and is now `ASTCENC_INVARIANCE` with a default + of `ON`. Disabling this option can substantially improve performance, but + images can different across platforms and compilers. + * **Optimization:** Color quantization and packing for LDR RGB and RGBA has + been vectorized to improve performance. + * **Change:** Color quantization for LDR RGB and RGBA endpoints will now try + multiple quantization packing methods, and pick the one with the lowest + endpoint encoding error. This gives a minor image quality improvement, for + no significant performance impact when combined with the vectorization + optimizations. + + +## 4.4.0 + +**Status:** March 2023 + +The 4.4.0 release is a minor release with image quality improvements, a small +performance boost, and a few new quality-of-life features. + +* **General:** + * **Change:** Core library no longer checks availability of required + instruction set extensions, such as SSE4.1 or AVX2. Checking compatibility + is now the responsibility of the caller. See `astcenccli_entry.cpp` for + an example of code performing this check. + * **Change:** Core library can be built as a shared object by setting the + `-DSHAREDLIB=ON` CMake option, resulting in e.g. `libastcenc-avx2-shared.so`. + Note that the command line tool is always statically linked. + * **Change:** Decompressed 3D images will now write one output file per + slice, if the target format is a 2D image format. + * **Change:** Command line errors print to stderr instead of stdout. + * **Change:** Color encoding uses new quantization tables, that now factor + in floating-point rounding if a distance tie is found when using the + integer quant256 value. This improves image quality for 4x4 and 5x5 block + sizes. + * **Optimization:** Partition selection uses a simplified line calculation + with a faster approximation. This improves performance for all block sizes. + * **Bug-fix:** Fixed missing symbol error in decompressor-only builds. + * **Bug-fix:** Fixed infinity handling in debug trace JSON files. + +### Performance: + +Key for charts: + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Relative performance vs 4.3 release:** + +![Relative scores 4.4 vs 4.3](./ChangeLogImg/relative-4.3-to-4.4.png) + + +## 4.3.1 + +**Status:** January 2023 + +The 4.3.1 release is a minor maintenance release. No performance or image +quality changes are expected. + +* **General:** + * **Bug-fix:** Fixed typo in `-2/3/4partitioncandidatelimit` CLI options. + * **Bug-fix:** Fixed handling for `-3/4partitionindexlimit` CLI options. + * **Bug-fix:** Updated to `stb_image.h` v2.28, which includes multiple fixes + and improvements for image loading. + + +## 4.3.0 + +**Status:** January 2023 + +The 4.3.0 release is an optimization release. There are minor performance +and image quality improvements in this release. + +Reminder - the codec library API is not designed to be binary compatible across +versions. We always recommend rebuilding your client-side code using the updated +`astcenc.h` header. + +* **General:** + * **Bug-fix:** Use lower case `windows.h` include for MinGW compatibility. + * **Change:** The `-mask` command line option, `ASTCENC_FLG_MAP_MASK` in the + library API, has been removed. + * **Optimization:** Always skip blue-contraction for `QUANT_256` encodings. + This gives a small image quality improvement for the 4x4 block size. + * **Optimization:** Always skip RGBO vector calculation for LDR encodings. + * **Optimization:** Defer color packing and scrambling to physical layer. + * **Optimization:** Remove folded `decimation_info` lookup tables. This + significantly reduces compressor memory footprint and improves context + creation time. Impact increases with the active block size. + * **Optimization:** Increased trial and refinement pruning by using stricter + target errors when determining whether to skip iterations. + +### Performance: + +Key for charts: + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Relative performance vs 4.2 release:** + +![Relative scores 4.3 vs 4.2](./ChangeLogImg/relative-4.2-to-4.3.png) + + + +## 4.2.0 + +**Status:** November 2022 + +The 4.2.0 release is an optimization release. There are significant performance +improvements, minor image quality improvements, and library interface changes in +this release. + +Reminder - the codec library API is not designed to be binary compatible across +versions. We always recommend rebuilding your client-side code using the updated +`astcenc.h` header. + +* **General:** + * **Bug-fix:** Compression for RGB and RGBA base+offset encodings no + longer generate endpoints with the incorrect blue-contract behavior. + * **Bug-fix:** Lowest channel correlation calculation now correctly ignores + constant color channels for the purposes of filtering 2 plane encodings. + On average this improves both performance and image quality. + * **Bug-fix:** ISA compatibility now checked in `config_init()` as well as + in `context_alloc()`. + * **Change:** Removed the low-weight count optimization, as more recent + changes had significantly reduced its performance benefit. Option removed + from both command line and configuration structure. + * **Feature:** The `-exhaustive` mode now runs full trials on more + partitioning candidates and block candidates. This improves image quality + by 0.1 to 0.25 dB, but slows down compression by 3x. The `-verythorough` + and `-thorough` modes also test more candidates. + * **Feature:** A new preset, `-verythorough`, has been introduced to provide + a standard performance point between `-thorough` and the re-tuned + `-exhaustive` mode. This new mode is faster and higher quality than the + `-exhaustive` preset in the 4.1 release. + * **Feature:** The compressor can now independently vary the number of + partitionings considered for error estimation for 2/3/4 partitions. This + allows heuristics to put more effort into 2 partitions, and less in to + 3/4 partitions. + * **Feature:** The compressor can now run trials on a variable number of + candidate partitionings, allowing high quality modes to explore more of the + search space at the expense of slower compression. The number of trials is + independently configurable for 2/3/4 partition cases. + * **Optimization:** Introduce early-out threshold for 2/3/4 partition + searches based on the results after 1 of 2 trials. This significantly + improves performance for `-medium` and `-thorough` searches, for a minor + loss in image quality. + * **Optimization:** Reduce early-out threshold for 3/4 partition searches + based on 2/3 partition results. This significantly improves performance, + especially for `-thorough` searches, for a minor loss in image quality. + * **Optimization:** Use direct vector compare to create a SIMD mask instead + of a scalar compare that is broadcast to a vector mask. + * **Optimization:** Remove obsolete partition validity masks from the + partition selection algorithm. + * **Optimization:** Removed obsolete channel scaling from partition + `avgs_and_dirs()` calculation. + +### Performance: + +Key for charts: + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Relative performance vs 4.0 and 4.1 release:** + +![Relative scores 4.2 vs 4.0](./ChangeLogImg/relative-4.0-to-4.2.png) + + + +## 4.1.0 + +**Status:** August 2022 + +The 4.1.0 release is a maintenance release. There is no performance or image +quality change in this release. + +* **General:** + * **Change:** Command line decompressor no longer uses the legacy + `GL_LUMINANCE` or `GL_LUMINANCE_ALPHA` format enums when writing KTX + output files. Luminance textures now use the `GL_RED` format and + luminance_alpha textures now use the `GL_RG` format. + * **Change:** Command line tool gains a new `-dimage` option to generate + diagnostic images showing aspects of the compression encoding. The output + file name with its extension stripped is used as the stem of the diagnostic + image file names. + * **Bug-fix:** Library decompressor builds for SSE no longer use masked store + `maskmovdqu` instructions, as they can generate faults on masked lanes. + * **Bug-fix:** Command line decompressor now correctly uses sized type enums + for the internal format when writing output KTX files. + * **Bug-fix:** Command line compressor now correctly loads 16 and 32-bit per + component input KTX files. + * **Bug-fix:** Fixed GCC9 compiler warnings on Arm aarch64. + + +## 4.0.0 + +**Status:** July 2022 + +The 4.0.0 release introduces some major performance enhancement, and a number +of larger changes to the heuristics used in the codec to find a more effective +cost:quality trade off. + +* **General:** + * **Change:** The `-array` option for specifying the number of image planes + for ASTC 3D volumetric block compression been renamed to `-zdim`. + * **Change:** The build root package directory is now `bin` instead of + `astcenc`, allowing the CMake install step to write binaries into + `/usr/local/bin` if the user wishes to do so. + * **Feature:** A new `-ssw` option for specifying the shader sampling swizzle + has been added as convenience alternative to the `-cw` option. This is + needed to correct error weighting during compression if not all components + are read in the shader. For example, to extract and compress two components + from an RGBA input image, weighting the two components equally when + sampling through .ra in the shader, use `-esw ggga -ssw ra`. In this + example `-ssw ra` is equivalent to the alternative `-cw 1 0 0 1` encoding. + * **Feature:** The `-a` alpha weighting option has been re-enabled in the + backend, and now again applies alpha scaling to the RGB error metrics when + encoding. This is based on the maximum alpha in each block, not the + individual texel alpha values used in the earlier implementation. + * **Feature:** The command line tool now has `-repeats ` for testing, + which will iterate around compression and decompression `count` times. + Reported performance metrics also now separate compression and + decompression scores. + * **Feature:** The core codec is now warning clean up to /W4 for both MSVC + `cl.exe` and `clangcl.exe` compilers. + * **Feature:** The core codec now supports arm64 for both MSVC `cl.exe` and + `clangcl.exe` compilers. + * **Feature:** `NO_INVARIANCE` builds will enable the `-ffp-contract=fast` + option for all targets when using Clang or GCC. In addition AVX2 targets + will also set the `-mfma` option. This reduces image quality by up to 0.2dB + (normally much less), but improves performance by up to 5-20%. + * **Optimization:** Angular endpoint min/max weight selection is restricted + to weight `QUANT_11` or lower. Higher quantization levels assume default + 0-1 range, which is less accurate but much faster. + * **Optimization:** Maximum weight quantization for later trials is selected + based on the weight quantization of the best encoding from the 1 plane 1 + partition trial. This significantly reduces the search space for the later + trials with more planes or partitions. + * **Optimization:** Small data tables now use in-register SIMD permutes + rather than gathers (AVX2) or unrolled scalar lookups (SSE/NEON). This can + be a significant optimization for paths that are load unit limited. + * **Optimization:** Decompressed image block writes in the decompressor now + use a vectorized approach to writing each row of texels in the block, + including to ability to exploit masked stores if the target supports them. + * **Optimization:** Weight scrambling has been moved into the physical layer; + the rest of the codec now uses linear order weights. + * **Optimization:** Weight packing has been moved into the physical layer; + the rest of the codec now uses unpacked weights in the 0-64 range. + * **Optimization:** Consistently vectorize the creation of unquantized weight + grids when they are needed. + * **Optimization:** Remove redundant per-decimation mode copies of endpoint + and weight structures, which were really read-only duplicates. + * **Optimization:** Early-out the same endpoint mode color calculation if it + cannot be applied. + * **Optimization:** Numerous type size reductions applied to arrays to reduce + both context working buffer size usage and stack usage. + +### Performance: + +Key for charts: + +* Color = block size (see legend). +* Letter = image format (N = normal map, G = grayscale, L = LDR, H = HDR). + +**Relative performance vs 3.7 release:** + +![Relative scores 4.0 vs 3.7](./ChangeLogImg/relative-3.7-to-4.0.png) + + +- - - + +_Copyright © 2022-2024, Arm Limited and contributors. All rights reserved._ diff --git a/ktx/external/astc-encoder/Docs/ChangeLog-5x.md b/ktx/external/astc-encoder/Docs/ChangeLog-5x.md new file mode 100644 index 0000000..a6556a2 --- /dev/null +++ b/ktx/external/astc-encoder/Docs/ChangeLog-5x.md @@ -0,0 +1,105 @@ +# 5.x series change log + +This page summarizes the major functional and performance changes in each +release of the 5.x series. + +All performance data on this page is measured on an Intel Core i5-9600K +clocked at 4.2 GHz, running `astcenc` using AVX2 and 6 threads. + + +## 5.3.0 + +**Status:** March 2025 + +The 5.3.0 release is a minor maintenance release. + +* **General:** + * **Feature:** Reference C builds (`ASTCENC_ISA_NONE`) now support compiling + for big-endian CPUs. Compile with `-DASTCENC_BIG_ENDIAN=ON` when compiling + for a big-endian target; it is not auto-detected. + * **Improvement:** Builds using GCC now specify `-flto=auto` to allow + parallel link steps, and remove the log warnings about not setting a CPU + count parameter value. + * **Bug fix:** Builds using MSVC `cl.exe` that do not specify an explicit + ISA using the preprocessor configuration defines will now correctly + default to the SSE2 backend on x86-64 and the NEON backend on Arm64. Previously they would have defaulted to the reference C implementation, + which is around 3.25 times slower. + + + +## 5.2.0 + +**Status:** February 2025 + +The 5.2.0 release is a minor maintenance release. + +This release includes changes to the public interface in the `astcenc.h` +header. We always recommend rebuilding your client-side code using the +header from the same release to avoid compatibility issues. + +* **General:** + * **Change:** Changed sRGB alpha channel endpoint expansion to match the + revised Khronos Data Format Specification (v1.4.0), which reverts an + unintended specification change. Compared to previous releases, this change + can cause LSB bit differences in the alpha channel of compressed images. + * **Feature:** Arm64 builds for Linux added to the GitHub Actions builds, and + Arm64 binaries for NEON, 128-bit SVE 128 and 256-bit SVE added to release + builds. + * **Feature:** Added a new codec API, `astcenc_compress_cancel()`, which can + be used to cancel an in-flight compression. This is designed to help make + it easier to integrate the codec into an interactive user interface that + can respond to user events with low latency. + * **Bug fix:** Removed incorrect `static` variable qualifier, which could + result in an incorrect `tune_mse_overshoot` heuristic threshold being used + if a user ran multiple concurrent compressions with different settings. + + +## 5.1.0 + +**Status:** November 2024 + +The 5.1.0 release is an optimization release, giving moderate performance +improvements on all platforms. There are no image quality differences. + +* **General:** + * **Feature:** Added a new CMake build option to control use of native + gathers, as they can be slower than scalar loads on some common x86 + microarchitectures. Build with `-DASTCENC_X86_GATHERS=OFF` to disable use + of native gathers in AVX2 builds. + * **Optimization:** Added new `gather()` abstraction for gathers using byte + indices, allowing implementations without gather hardware to skip the + byte-to-int index conversion. + * **Optimization:** Optimized `compute_lowest_and_highest_weight()` to + pre-compute min/max outside of the main loop. + * **Optimization:** Added improved intrinsics sequence for SSE and AVX2 + integer `hmin()` and `hmax()`. + * **Optimization:** Added improved intrinsics sequence for `vint4(uint8_t*)` + on systems implementing Arm SVE. + + +## 5.0.0 + +**Status:** November 2024 + +The 5.0.0 release is the first stable release in the 5.x series. The main new +feature is support for the Arm Scalable Vector Extensions (SVE) SIMD instruction +set. + +* **General:** + * **Bug fix:** Fixed incorrect return type in "None" vector library + reference implementation. + * **Bug fix:** Fixed sincos table index under/overflow. + * **Feature:** Changed `ASTCENC_ISA_NATIVE` builds to use `-march=native` and + `-mcpu=native`. + * **Feature:** Added backend for Arm SVE fixed-width 256-bit builds. These + can only run on hardware implementing 256-bit SVE. + * **Feature:** Added backend for Arm SVE 128-bit builds. These are portable + builds and can run on hardware implementing any SVE vector length, but the + explicit SVE use is augmented NEON and will only use the bottom 128-bits of + each SVE vector. + * **Feature:** Optimized NEON mask `any()` and `all()` functions. + * **Feature:** Migrated build and test to GitHub Actions pipelines. + +- - - + +_Copyright © 2022-2025, Arm Limited and contributors. All rights reserved._ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-1.7-to-2.0.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-1.7-to-2.0.png new file mode 100644 index 0000000..9458f71 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-1.7-to-2.0.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-2.0-to-2.1.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-2.0-to-2.1.png new file mode 100644 index 0000000..6e943e4 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-2.0-to-2.1.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-2.1-to-2.2.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-2.1-to-2.2.png new file mode 100644 index 0000000..c5067b4 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-2.1-to-2.2.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-2.2-to-2.3.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-2.2-to-2.3.png new file mode 100644 index 0000000..c507896 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-2.2-to-2.3.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-2.5-to-3.0.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-2.5-to-3.0.png new file mode 100644 index 0000000..b3f7023 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/absolute-2.5-to-3.0.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-1.7-to-2.0.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-1.7-to-2.0.png new file mode 100644 index 0000000..65fe4a4 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-1.7-to-2.0.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-2.0-to-2.1.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-2.0-to-2.1.png new file mode 100644 index 0000000..40f55fe Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-2.0-to-2.1.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-2.1-to-2.2.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-2.1-to-2.2.png new file mode 100644 index 0000000..428db0e Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-2.1-to-2.2.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-2.2-to-2.3.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-2.2-to-2.3.png new file mode 100644 index 0000000..21eef9d Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-2.2-to-2.3.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-2.5-to-3.0.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-2.5-to-3.0.png new file mode 100644 index 0000000..98e04bc Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-2.5-to-3.0.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.0-to-3.1.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.0-to-3.1.png new file mode 100644 index 0000000..6ec271e Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.0-to-3.1.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.3-to-3.4.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.3-to-3.4.png new file mode 100644 index 0000000..d714f3e Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.3-to-3.4.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.4-to-3.5.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.4-to-3.5.png new file mode 100644 index 0000000..3878e90 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.4-to-3.5.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.5-to-3.6.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.5-to-3.6.png new file mode 100644 index 0000000..0c0c9bf Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.5-to-3.6.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.6-to-3.7.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.6-to-3.7.png new file mode 100644 index 0000000..71f2385 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.6-to-3.7.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.7-to-4.0.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.7-to-4.0.png new file mode 100644 index 0000000..2c373b0 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-3.7-to-4.0.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-4.0-to-4.2.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-4.0-to-4.2.png new file mode 100644 index 0000000..b65dbf4 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-4.0-to-4.2.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-4.2-to-4.3.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-4.2-to-4.3.png new file mode 100644 index 0000000..ee6db03 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-4.2-to-4.3.png differ diff --git a/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-4.3-to-4.4.png b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-4.3-to-4.4.png new file mode 100644 index 0000000..7dde3dd Binary files /dev/null and b/ktx/external/astc-encoder/Docs/ChangeLogImg/relative-4.3-to-4.4.png differ diff --git a/ktx/external/astc-encoder/Docs/Encoding.md b/ktx/external/astc-encoder/Docs/Encoding.md new file mode 100644 index 0000000..f08c08d --- /dev/null +++ b/ktx/external/astc-encoder/Docs/Encoding.md @@ -0,0 +1,235 @@ +# Effective ASTC Encoding + +Most texture compression schemes encode a single color format at single +bitrate, so there are relatively few configuration options available to content +creators beyond selecting which compressed format to use. + +ASTC on the other hand is an extremely flexible container format which can +compress multiple color formats at multiple bit rates. Inevitably this +flexibility gives rise to questions about how to best use ASTC to encode a +specific color format, or what the equivalent settings are to get a close +match to another compression format. + +This page aims to give some guidelines, but note that they are only guidelines +and are not exhaustive so please deviate from them as needed. + +## Traditional format reference + +The most commonly used non-ASTC compressed formats, their color format, and +their compressed bitrate are shown in the table below. + +| Name | Color Format | Bits/Pixel | Notes | +| -------- | ------------ | ---------- | ---------------- | +| BC1 | RGB+A | 4 | RGB565 + 1-bit A | +| BC3 | RGB+A | 8 | BC1 RGB + BC4 A | +| BC3nm | G+R | 8 | BC1 G + BC4 R | +| BC4 | R | 4 | L8 | +| BC5 | R+G | 8 | BC1 R + BC1 G | +| BC6H | RGB (HDR) | 8 | | +| BC7 | RGB / RGBA | 8 | | +| EAC_R11 | R | 4 | R11 | +| EAC_RG11 | RG | 8 | RG11 | +| ETC1 | RGB | 4 | RGB565 | +| ETC2 | RGB+A | 4 | RGB565 + 1-bit A | +| ETC2+EAC | RGB+A | 8 | RGB565 + EAC A | +| PVRTC | RGBA | 2 or 4 | | + +**Note:** BC2 (RGB+A) is not included in the table because it's rarely used in +practice due to poor quality alpha encoding; BC3 is nearly always used instead. + +**Note:** Color representations shown with a `+` symbol indicate non-correlated +compression groups; e.g. an `RGB + A` format compresses `RGB` and `A` +independently and does not assume the two signals are correlated. This can be +a strength (it improves quality when compressing non-correlated signals), but +also a weakness (it reduces quality when compressing correlated signals). + +# ASTC Format Mapping + +The main question which arises with the mapping of another format on to ASTC +is how to handle cases where the input isn't a 4 component RGBA input. ASTC is +a container format which always decompresses in to a 4 component RGBA result. +However, the internal compressed representation is very flexible and can store +1-4 components as needed on a per-block basis. + +To get the best quality for a given bitrate, or the lowest bitrate for a given +quality, it is important that as few components as possible are stored in the +internal representation to avoid wasting coding space. + +Specific optimizations in the ASTC coding scheme exist for: + +* Encoding the RGB components as a single luminance component, so only a single + value needs to be stored in the coding instead of three. +* Encoding the A component as a constant 1.0 value, so the coding doesn't + actually need to store a per-pixel alpha value at all. + +... so mapping your inputs given to the compressor to hit these paths is +really important if you want to get the best output quality for your chosen +bitrate. + +## Encoding 1-4 component data + +The table below shows the recommended component usage for data with different +numbers of color components present in the data. + +The coding swizzle should be applied when compressing an image. This can be +handled by the compressor when reading an uncompressed input image by +specifying the swizzle using the `-esw` command line option. + +The sampling swizzle is what you should use in your shader programs to read +the data from the compressed texture, assuming no additional API-level +component swizzling is specified by the application. + +| Input components | ASTC Endpoint | Coding Swizzle | Sampling Swizzle | +| -------------- | ------------- | -------------- | ------------------ | +| 1 | L + 1 | `rrr1` | `.g` 1 | +| 2 | L + A | `rrrg` | `.ga` 1 | +| 3 | RGB + 1 | `rgb1` | `.rgb` | +| 4 | RGB + A | `rgba` | `.rgba` | + +**1:** Sampling from `g` is preferred to sampling from `r` because it allows a +single shader to be compatible with ASTC, BC1, or ETC formats. BC1 and ETC1 +store color endpoints as RGB565 data, so the `g` component will have higher +precision. For ASTC it doesn't actually make any difference; the same single +component luminance will be returned for all three of the `.rgb` components. + +## Equivalence with other formats + +Based on these component encoding requirements we can now derive the the ASTC +coding equivalents for most of the other texture compression formats in common +use today. + +| Formant | ASTC Coding Swizzle | ASTC Sampling Swizzle | Notes | +| -------- | ------------------- | --------------------- | ---------------- | +| BC1 | `rgba` 1 | `.rgba` | | +| BC3 | `rgba` | `.rgba` | | +| BC3nm | `gggr` | `.ag` | | +| BC4 | `rrr1` | `.r` | | +| BC5 | `rrrg` | `.ra` 2 | | +| BC6H | `rgb1` | `.rgb` 3 | HDR profile only | +| BC7 | `rgba` | `.rgba` | | +| EAC_R11 | `rrr1` | `.r` | | +| EAC_RG11 | `rrrg` | `.ra` 2 | | +| ETC1 | `rgb1` | `.rgb` | | +| ETC2 | `rgba` 1 | `.rgba` | | +| ETC2+EAC | `rgba` | `.rgba` | | +| ETC2+EAC | `rgba` | `.rgba` | | + +**1:** ASTC has no equivalent of the 1-bit punch-through alpha encoding +supported by BC1 or ETC2; if alpha is present it will be a full alpha +component. + +**2:** ASTC relies on using the L+A color endpoint type for coding efficiency +for two component data. It therefore has no direct equivalent of a two-plane +format sampled though the `.rg` components such as BC5 or EAC_RG11. This can +be emulated by setting texture component swizzles in the runtime API - e.g. via +`glTexParameteri()` for OpenGL ES - although it has been noted that API +controlled swizzles are not available in WebGL. + +**3:** ASTC can only store unsigned values, and has no equivalent of the BC6 +signed endpoint mode. + +# Other Considerations + +This section outlines some of the other things to consider when encoding +textures using ASTC. + +## Decode mode extensions + +ASTC is specified to decompress into a 16-bit per component RGBA output by +default, with the exception of the sRGB format which uses an 8-bit value for the +RGB components. + +Decompressing in to a 16-bit per component output format is often higher than +many use cases require, especially for LDR textures which originally came from +an 8-bit per component source image. Most implementations of ASTC support the +decode mode extensions, which allow an application to opt-in to a lower +precision decompressed format (RGBA8 for LDR, RGB9E5 for HDR). Using these +extensions can improve GPU texture cache efficiency, and even improve texturing +filtering throughput, for use cases that do not need the higher precision. + +The ASTC format uses different data rounding rules when the decode mode +extensions are used. To ensure that the compressor chooses the best encodings +for the RGBA8 rounding rules, you can specify `-decode_unorm8` when compressing +textures that will be decompressed into the RGBA8 intermediate. This gives a +small image quality boost. + +**Note:** This mode is automatically enabled if you use the `astcenc` +decompressor to write an 8-bit per component output image. + +## Encoding non-correlated components + +Most other texture compression formats have a static component assignment in +terms of the expected data correlation. For example, ETC2+EAC assumes that RGB +are always correlated and that alpha is non-correlated. ASTC can automatically +encode data as either fully correlated across all 4 components, or with any one +component assigned to a separate non-correlated partition to the other three. + +The non-correlated component can be changed on a block-by-block basis, so the +compressor can dynamically adjust the coding based on the data present in the +image. This means that there is no need for non-correlated data to be stored +in a specific component in the input image. + +It is however worth noting that the alpha component is treated differently to +the RGB color components in some circumstances: + +* When coding for sRGB the alpha component will always be stored in linear + space. +* When coding for HDR the alpha component can optionally be kept as LDR data. + +## Encoding normal maps + +The best way to store normal maps using ASTC is similar to the scheme used by +BC5; store the X and Y components of a unit-length normal. The Z component of +the normal can be reconstructed in shader code based on the knowledge that the +vector is unit length. + +To encode this we need to store only two input components in the compressed +data, and therefore use the `rrrg` coding swizzle to align the data with the +ASTC luminance+alpha endpoint. We can sample this in shader code using the +`.ga` sampling swizzle, and reconstruct the Z value with: + + vec3 nml; + nml.xy = texture(...).ga; // Load normals (range 0 to 1) + nml.xy = nml.xy * 2.0 - 1.0; // Unpack normals (range -1 to +1) + nml.z = sqrt(1 - dot(nml.xy, nml.xy)); // Compute Z, given unit length + +The encoding swizzle and appropriate component weighting is enabled by using +the `-normal` command line option. If you wish to use a different pair of +components you can specify a custom swizzle after setting the `-normal` +parameter. For example, to match BC5n component ordering use +`-normal -esw gggr` for compression and `-normal -dsw arz1` for decompression. + +## Encoding sRGB data + +The ASTC LDR profile can compress sRGB encoded color, which is a more +efficient use of bits than storing linear encoded color because the gamma +corrected value distribution more closely matches human perception of +luminance. + +For color data it is nearly always a perceptual quality win to use sRGB input +source textures that are then compressed using the ASTC sRGB compression mode +(compress using the `-cs` command line option rather than the `-cl` command +line option). Note that sRGB gamma correction is only applied to the RGB +components during decode; the alpha component is always treated as linear +encoded data. + +*Important:* The uncompressed input texture provided on the command line must +be stored in the sRGB color space for `-cs` to function correctly. + +## Encoding HDR data + +HDR data can be encoded just like LDR data, but with some caveats around +handling the alpha component. + +For many use cases the alpha component is an actual alpha opacity component and +is therefore used for storing an LDR value between 0 and 1. For these cases use +the `-ch` compressor option which will treat the RGB components as HDR, but the +A component as LDR. + +For other use cases the alpha component is simply a fourth data component which +is also storing an HDR value. For these cases use the `-cH` compressor option +which will treat all components as HDR data. + +- - - + +_Copyright © 2019-2024, Arm Limited and contributors. All rights reserved._ diff --git a/ktx/external/astc-encoder/Docs/FileFormat.md b/ktx/external/astc-encoder/Docs/FileFormat.md new file mode 100644 index 0000000..4ee84fe --- /dev/null +++ b/ktx/external/astc-encoder/Docs/FileFormat.md @@ -0,0 +1,71 @@ +# The .astc File Format + +The default file format for compressed textures generated by `astcenc`, as well +as from many other ASTC compressors, is the `.astc` format. This is a very +simple format consisting of a small header followed immediately by the binary +payload for a single image surface. + +Header +====== + +The header is a fixed 16 byte structure, defined as storing only bytes to avoid +any endianness issues or incur any padding overhead. + +``` +struct astc_header +{ + uint8_t magic[4]; + uint8_t block_x; + uint8_t block_y; + uint8_t block_z; + uint8_t dim_x[3]; + uint8_t dim_y[3]; + uint8_t dim_z[3]; +}; +``` + +Magic number +------------ + +The 4 byte magic number at the start of the file acts as a format identifier. + +``` + magic[0] = 0x13; + magic[1] = 0xAB; + magic[2] = 0xA1; + magic[3] = 0x5C; +``` + +Block size +---------- + +The `block_*` fields store the ASTC block dimensions in texels. For 2D images +the Z dimension must be set to 1. + +Image dimensions +---------------- + +The `dim_*` fields store the image dimensions in texels. For 2D images the +Z dimension must be set to 1. + +Note that the image is not required to be an exact multiple of the compressed +block size; the compressed data may include padding that is discarded during +decompression. + +Each dimension is a 24 bit unsigned value that is reconstructed from the stored +byte values as: + +``` +decoded_dim = dim[0] + (dim[1] << 8) + (dim[2] << 16); +``` + +Binary payload +============== + +The binary payload is a byte stream that immediately follows the header. It +contains 16 bytes per compressed block. The number of compressed blocks is +determined from the header information. + +- - - + +_Copyright © 2020-2022, Arm Limited and contributors. All rights reserved._ diff --git a/ktx/external/astc-encoder/Docs/FormatOverview.md b/ktx/external/astc-encoder/Docs/FormatOverview.md new file mode 100644 index 0000000..00dd861 --- /dev/null +++ b/ktx/external/astc-encoder/Docs/FormatOverview.md @@ -0,0 +1,488 @@ +# ASTC Format Overview + +Adaptive Scalable Texture Compression (ASTC) is an advanced lossy texture +compression technology developed by Arm and AMD. It has been adopted as an +official Khronos extension to the OpenGL and OpenGL ES APIs, and as a standard +optional feature for the Vulkan API. + +ASTC offers a number of advantages over earlier texture compression formats: + +* **Format flexibility:** ASTC supports compressing between 1 and 4 channels of + data, including support for one non-correlated channel such as RGB+A + (correlated RGB, non-correlated alpha). +* **Bit rate flexibility:** ASTC supports compressing images with a fine + grained choice of bit rates between 0.89 and 8 bits per texel (bpt). The bit + rate choice is independent to the color format choice. +* **Advanced format support:** ASTC supports compressing images in either low + dynamic range (LDR), LDR sRGB, or high dynamic range (HDR) color spaces, as + well as support for compressing 3D volumetric textures. +* **Improved image quality:** Despite the high degree of format flexibility, + ASTC manages to beat nearly all legacy texture compression formats -- such as + ETC2, PVRCT, and the BC formats -- on image quality at equivalent bit + rates. + +This article explores the ASTC format, and how it manages to generate the +flexibility and quality improvements that it achieves. + + +Why ASTC? +========= + +Before the creation of ASTC, the format and bit rate coverage of the available +formats was very sparse: + +![Legacy texture compression formats and bit rates](./FormatOverviewImg/coverage-legacy.svg) + +In reality the situation is even worse than this diagram shows, as many of +these formats are proprietary or simply not available on some operating +systems, so any single platform will have very limited compression choices. + +For developers this situation makes developing content which is portable across +multiple platforms a tricky proposition. It's almost certain that differently +compressed assets will be needed for different platforms. Each asset pack would +likely then need to use different levels of compression, and may even have to +fall back to no compression for some assets on some platforms, which leaves +either some image quality or some memory bandwidth efficiency untapped. + +It was clear a better way was needed, so the Khronos group asked members to +submit proposals for a new compression algorithm to be adopted in the same +manner that the earlier ETC algorithm was adopted for OpenGL ES. ASTC was the +result of this, and has been adopted as an official algorithm for OpenGL, +OpenGL ES, and Vulkan. + + +Format overview +=============== + +Given the fragmentation issues with the existing compression formats, it should +be no surprise that the high level design objectives for ASTC were to have +something which could be used across the whole range of art assets found in +modern content, and which allows artists to have more control over the quality +to bit rate tradeoff. + +There are quite a few technical components which make up the ASTC format, so +before we dive into detail it will be useful to give an overview of how ASTC +works at a higher level. + + +Block compression +----------------- + +Compression formats for real-time graphics need the ability to quickly and +efficiently make random samples into a texture. This places two technical +requirements on any compression format: + +* It must be possible to compute the address of data in memory given only a + sample coordinate. +* It must be possible to decompress random samples without decompressing too + much surrounding data. + +The standard solution for this used by all contemporary real-time formats, +including ASTC, is to divide the image into fixed-size blocks of texels, each +of which is compressed into a fixed number of output bits. This feature makes +it possible to access texels quickly, in any order, and with a well-bounded +decompression cost. + +The 2D block footprints in ASTC range from 4x4 texels up to 12x12 texels, which +all compress into 128-bit output blocks. By dividing 128 bits by the number of +texels in the footprint, we derive the format bit rates which range from 8 bpt +(`128/(4*4)`) down to 0.89 bpt (`128/(12*12)`). + + +Color encoding +-------------- + +ASTC uses gradients to assign the color values of each texel. Each compressed +block stores the end-point colors for a gradient, and an interpolation weight +for each texel which defines the texel's location along that gradient. During +decompression the color value for each texel is generated by interpolating +between the two end-point colors, based on the per-texel weight. + +![One partition gradient storage](./FormatOverviewImg/gradient-1p.svg) + +In many cases a block will contain a complex distribution of colors, for +example a red ball sitting on green grass. In these scenarios a single color +gradient will not be able to accurately represent all of the texels' values. To +support this ASTC allows a block to define up to four distinct color gradients, +known as partitions, and can assign each texel to a single partition. For our +example we require two partitions, one for our ball texels and one for our +grass texels. + +![Two partition gradient storage](./FormatOverviewImg/gradient-2p.svg) + +Now that you know the high level operation of the format, we can dive into more +detail. + + +Integer encoding +================ + +Initially the idea of fractional bits per texel sounds implausible, or even +impossible, because we're so used to storing numbers as a whole number of bits. +However, it's not quite as strange as it sounds. ASTC uses an encoding +technique called Bounded Integer Sequence Encoding (BISE), which makes heavy +use of storing numbers with a fractional number of bits to pack information +more efficiently. + + +Storing alphabets +----------------- + +Even though color and weight values per texel are notionally floating-point +values, we have far too few bits available to directly store the actual values, +so they must be quantized during compression to reduce the storage size. For +example, if we have a floating-point weight for each texel in the range 0.0 to +1.0 we could choose to quantize it to five values - 0.0, 0.25, 0.5, 0.75, and +1.0 - which we can then represent in storage using the integer values 0 to 4. + +In the general case we need to be able to efficiently store characters of an +alphabet containing N symbols if we choose quantize to N levels. An N symbol +alphabet contains `log2(N)` bits of information per character. If we have an +alphabet of 5 possible symbols then each character contains ~2.32 bits of +information, but simple binary storage would require us to round up to 3 bits. +This wastes 22.3% of our storage capacity. The chart below shows the percentage +of our bit-space wasted when using simple binary encoding to store an arbitrary +N symbol alphabet: + +![Binary encoding efficiency](./FormatOverviewImg/binary.png) + +... which shows for most alphabet sizes we waste a lot of our storage capacity +when using an integer number of bits per character. Efficiency is of critical +importance to a compression format, so this is something we needed to be able +to improve. + +**Note:** We could have chosen to round-up the quantization level to the next +power of two, and at least use the bits we're spending. However, this forces +the encoder to spend bits which could be used elsewhere for a bigger benefit, +so it will reduce image quality and is a sub-optimal solution. + + +Quints +------ + +Instead of rounding up a 5 symbol alphabet - called a "quint" in BISE - to +three bits, we could choose to instead pack three quint characters together. +Three characters in a 5-symbol alphabet have 53 (125) combinations, +and contain 6.97 bits of information. We can store this in 7 bits and have a +storage waste of only 0.5%. + + +Trits +----- + +We can similarly construct a 3-symbol alphabet - called a "trit" in BISE - and +pack trit characters in groups of five. Each character group has 35 +(243) combinations, and contains 7.92 bits of information. We can store this in +8 bits and have a storage waste of only 1%. + + +BISE +---- + +The BISE encoding used by ASTC allows storage of character sequences using +arbitrary alphabets of up to 256 symbols, encoding each alphabet size in the +most space-efficient choice of bits, trits, and quints. + +* Alphabets with up to (2n - 1) symbols can be encoded using n bits + per character. +* Alphabets with up (3 * 2n - 1) symbols can be encoded using n bits + (m) and a trit (t) per character, and reconstructed using the equation + (t * 2n + m). +* Alphabets with up to (5 * 2n - 1) symbols can be encoded using n + bits (m) and a quint (q) per character, and reconstructed using the equation + (q * 2n + m). + +When the number of characters in a sequence is not a multiple of three or five +we need to avoid wasting storage at the end of the sequence, so we add another +constraint on the encoding. If the last few values in the sequence to encode +are zero, the last few bits in the encoded bit string must also be zero. +Ideally, the number of non-zero bits should be easily calculated and not depend +on the magnitudes of the previous encoded values. This is a little tricky to +arrange during compression, but it is possible. This means that we do not need +to store any padding after the end of the bit sequence, as we can safely assume +that they are zero bits. + +With this constraint in place - and by some smart packing the bits, trits, and +quints - BISE encodes an string of S characters in an N symbol alphabet using a +fixed number of bits: + +* S values up to (2n - 1) uses (NS) bits. +* S values up to (3 * 2n - 1) uses (NS + ceil(8S / 5)) bits. +* S values up to (5 * 2n - 1) uses (NS + ceil(7S / 3)) bits. + +... and the compressor will choose the one of these which produces the smallest +storage for the alphabet size being stored; some will use binary, some will use +bits and a trit, and some will use bits and a quint. If we compare the storage +efficiency of BISE against simple binary for the range of possible alphabet +sizes we might want to encode we can see that it is much more efficient. + +![BISE encoding efficiency](./FormatOverviewImg/bise.png) + + +Block sizes +=========== + +ASTC always compresses blocks of texels into 128-bit outputs, but allows the +developer to select from a range of block sizes to enable a fine-grained +tradeoff between image quality and size. + +| Block footprint | Bits/texel | | Block footprint | Bits/texel | +| --------------- | ---------- | --- | --------------- | ---------- | +| 4x4 | 8.00 | | 10x5 | 2.56 | +| 5x4 | 6.40 | | 10x6 | 2.13 | +| 5x5 | 5.12 | | 8x8 | 2.00 | +| 6x5 | 4.27 | | 10x8 | 1.60 | +| 6x6 | 3.56 | | 10x10 | 1.28 | +| 8x5 | 3.20 | | 12x10 | 1.07 | +| 8x6 | 2.67 | | 12x12 | 0.89 | + + + +Color endpoints +=============== + +The color data for a block is encoded as a gradient between two color +endpoints, with each texel selecting a position along that gradient which is +then interpolated during decompression. ASTC supports 16 color endpoint +encoding schemes, known as "endpoint modes". Options for endpoint modes +include: + +* Varying the number of color channels: e.g. luminance, luminance + alpha, rgb, + and rgba. +* Varying the encoding method: e.g. direct, base+offset, base+scale, + quantization level. +* Varying the data range: e.g. low dynamic range, or high dynamic range + +The endpoint modes, and the endpoint color BISE quantization level, can be +chosen on a per-block basis. + + +Color partitions +================ + +Colors within a block are often complex, and cannot be accurately captured by a +single color gradient, as discussed earlier with our example of a red ball +lying on green grass. ASTC allows up to four color gradients - known as +"partitions" - to be assigned to a single block. Each texel is then assigned to +a single partition for the purposes of decompression. + +Rather then directly storing the partition assignment for each texel, which +would need a lot of decompressor hardware to store it for all block sizes, we +generate it procedurally. Each block only needs to store the partition index - +which is the seed for the procedural generator - and the per texel assignment +can then be generated on-the-fly during decompression. The image below shows +the generated texel assignments for two (top), three (middle), and four +(bottom) partitions for the 8x8 block size. + +![ASTC partition table](./FormatOverviewImg/hash.png) + +The number of partitions and the partition index can be chosen on a per-block +basis, and a different color endpoint mode can be chosen per partition. + +**Note:** ASTC uses a 10-bit seed to drive the partition assignments. The hash +used will introduce horizontal bias in a third of the partitions, vertical bias +in a third, and no bias in the rest. As they are procedurally generated not all +of the partitions are useful, in particular with the smaller block sizes. + +* Many partitions are duplicates. +* Many partitions are degenerate (an N partition hash results in at least one + partition assignment that contains no texels). + + +Texel weights +============= + +Each texel requires a weight, which defines the relative contribution of each +color endpoint when interpolating the color gradient. + +For smaller block sizes we can choose to store the weight directly, with one +weight per texel, but for the larger block sizes we simply do not have enough +bits of storage to do this. To work around this ASTC allows the weight grid to +be stored at a lower resolution than the texel grid. The per-texel weights are +interpolated from the stored weight grid during decompression using a bilinear +interpolation. + +The number of texel weights, and the weight value BISE quantization level, can +be chosen on a per-block basis. + + +Dual-plane weights +------------------ + +Using a single weight for all color channels works well when there is good +correlation across the channels, but this is not always the case. Common +examples where we would expect to get low correlation at least some of the time +are textures storing RGBA data - alpha masks are not usually closely +correlated with the color value - or normal data - the X and Y normal values +often change independently. + +ASTC allows a dual-plane mode, which uses two separate weight grids for each +texel. A single channel can be assigned to a second plane of weights, while +the other three use the first plane of weights. + +The use of dual-plane mode can be chosen on a per-block basis, but its use +prevents the use of four color partitions as we do not have enough bits to +concurrently store both an extra plane of weights and an extra set of color +endpoints. + + +End results +=========== + +So, if we pull all of this together what do we end up with? + + +Adaptive +-------- + +The first word in the name of ASTC is "adaptive", and it should now hopefully +be clear why. Each block always compresses into 128-bits of storage, but the +developer can choose from a wide range of texel block sizes and the compressor +gets a huge amount of latitude to determine how those 128 bits are used. + +The compressor can trade off the number of bits assigned to colors (number of +partitions, endpoint mode, and stored quantization level) and weights (number +of weights per block, use of dual-plane, and stored quantization level) on a +per-block basis to get the best image quality possible. + +![ASTC compressed parrot at various bit rates](./FormatOverviewImg/astc-quality.png) + + +Format support +-------------- + +The compression scheme used by ASTC effectively compresses arbitrary sequences +of floating point numbers, with a flexible number of channels, across any of +the supported block sizes. There is no real notion of "color format" in the +format itself at all, beyond the color endpoint mode selection, although a +sensible compressor will want to use some format-specific heuristics to drive +an efficient state-space search. + +The orthogonal encoding design allows ASTC to provide almost complete coverage +of our desirable format matrix from earlier, across a wide range of bit rates: + +![ASTC 2D formats and bit rates](./FormatOverviewImg/coverage-astc.svg) + +The only significant omission is the absence of a dedicated two channel +encoding for HDR textures. We simply ran out of entries in the space we had for +encoding color endpoint modes, and this one didn't make the cut. + +The flexibility allowed by ASTC ticks the requirement that almost any asset can +be compressed to some degree, at an appropriate bitrate for its quality needs. +This is a powerful enabler for a compression format, because it puts control in +the hands of content creators and not arbitrary format restrictions. + + +Image quality +------------- + +The normal expectation would be that this level of format flexibility would +come at a cost of image quality; it has to cost something, right? Luckily this +isn't true. The high packing efficiency allowed by BISE encoding, and the +ability to dynamically choose where to spend encoding space on a per-block +basis, means that an ASTC compressor is not forced to spend bits on things that +don't help image quality. + +This gives some significant improvements in image quality compared to the older +texture formats, even though ASTC also handles a much wider range of options. + +* ASTC at 2 bpt outperforms PVRTC at 2 bpt by ~2.0dB. +* ASTC at 3.56 bpt outperforms PVRTC and BC1 at 4 bpt by ~1.5dB, and ETC2 by + ~0.7dB, despite a 10% bit rate disadvantage. +* ASTC at 8 bpt for LDR formats is comparable in quality to BC7 at 8 bpt. +* ASTC at 8 bpt for HDR formats is comparable in quality to BC6H at 8 bpt. + +Differences as small as 0.25dB are visible to the human eye, and remember that +dB uses a logarithmic scale, so these are significant image quality +improvements. + + +3D compression +-------------- + +One of the nice bonus features of ASTC is that the techniques which underpin +the format generalize to compressing volumetric texture data without needing +very much additional decompression hardware. + +ASTC is therefore also able to optionally support compression of 3D textures, +which is a unique feature not found in any earlier format, at the following +bit rates: + +| Block footprint | Bits/texel | | Block footprint | Bits/texel | +| --------------- | ---------- | --- | --------------- | ---------- | +| 3x3x3 | 4.74 | | 5x5x4 | 1.28 | +| 4x3x3 | 3.56 | | 5x5x5 | 1.02 | +| 4x4x3 | 2.67 | | 6x5x5 | 0.85 | +| 4x4x4 | 2.00 | | 6x6x5 | 0.71 | +| 5x4x4 | 1.60 | | 6x6x6 | 0.59 | + + +Availability +============ + +The ASTC functionality is specified as a set of feature profiles, allowing +GPU hardware manufacturers to select which parts of the standard they +implement. There are four commonly seen profiles: + +* "LDR": + * 2D blocks. + * LDR and sRGB color space. + * [KHR_texture_compression_astc_ldr][astc_ldr]: KHR OpenGL ES extension. +* "LDR + Sliced 3D": + * 2D blocks and sliced 3D blocks. + * LDR and sRGB color space. + * [KHR_texture_compression_astc_sliced_3d][astc_3d]: KHR OpenGL ES extension. +* "HDR": + * 2D and sliced 3D blocks. + * LDR, sRGB, and HDR color spaces. + * [KHR_texture_compression_astc_hdr][astc_ldr]: KHR OpenGL ES extension. +* "Full": + * 2D, sliced 3D, and volumetric 3D blocks. + * LDR, sRGB, and HDR color spaces. + * [OES_texture_compression_astc][astc_full]: OES OpenGL ES extension. + +The LDR profile is mandatory in OpenGL ES 3.2 and a standardized optional +feature for Vulkan, and therefore widely supported on contemporary mobile +devices. The 2D HDR profile is not mandatory, but is widely supported. + +3D texturing +------------ + +The APIs expose 3D textures in two flavors. + +The sliced 3D texture support builds a 3D texture from an array of 2D image +slices that have each been individually compressed using 2D ASTC compression. +This is required for the HDR profile, so is also widely supported. + +The volumetric 3D texture support uses the native 3D block sizes provided by +ASTC to implement true volumetric compression. This enables a wider choice of +low bitrate options than the 2D blocks, which is particularly important for 3D +textures of any non-trivial size. Volumetric formats are not widely supported, +but are supported on all of the Arm Mali GPUs that support ASTC. + +ASTC decode mode +---------------- + +ASTC is specified to decompress texels into fp16 intermediate values, except +for sRGB which always decompresses into 8-bit UNORM intermediates. For many use +cases this gives more dynamic range and precision than required. This can cause +a reduction in both texture cache efficiency and texture filtering performance +due to the larger decompressed data size. + +A pair of extensions exist, and are widely supported on recent mobile GPUs, +which allow applications to reduce the intermediate precision to either UNORM8 +(recommended for LDR textures) or RGB9e5 (recommended for HDR textures). + +* [OES_texture_compression_astc_decode_mode][astc_decode]: Allow UNORM8 + intermediates +* [OES_texture_compression_astc_decode_mode_rgb9e5][astc_decode]: Allow RGB9e5 + intermediates + +[astc_ldr]: https://www.khronos.org/registry/OpenGL/extensions/KHR/KHR_texture_compression_astc_hdr.txt +[astc_3d]: https://www.khronos.org/registry/OpenGL/extensions/KHR/KHR_texture_compression_astc_sliced_3d.txt +[astc_full]: https://www.khronos.org/registry/OpenGL/extensions/OES/OES_texture_compression_astc.txt +[astc_decode]: https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_astc_decode_mode.txt + +- - - + +_Copyright © 2019-2022, Arm Limited and contributors. All rights reserved._ diff --git a/ktx/external/astc-encoder/Docs/FormatOverviewImg/astc-quality.png b/ktx/external/astc-encoder/Docs/FormatOverviewImg/astc-quality.png new file mode 100644 index 0000000..5bac343 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/FormatOverviewImg/astc-quality.png differ diff --git a/ktx/external/astc-encoder/Docs/FormatOverviewImg/binary.png b/ktx/external/astc-encoder/Docs/FormatOverviewImg/binary.png new file mode 100644 index 0000000..f2d09c3 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/FormatOverviewImg/binary.png differ diff --git a/ktx/external/astc-encoder/Docs/FormatOverviewImg/bise.png b/ktx/external/astc-encoder/Docs/FormatOverviewImg/bise.png new file mode 100644 index 0000000..ccf0ae4 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/FormatOverviewImg/bise.png differ diff --git a/ktx/external/astc-encoder/Docs/FormatOverviewImg/coverage-astc.svg b/ktx/external/astc-encoder/Docs/FormatOverviewImg/coverage-astc.svg new file mode 100644 index 0000000..7ea088a --- /dev/null +++ b/ktx/external/astc-encoder/Docs/FormatOverviewImg/coverage-astc.svg @@ -0,0 +1,2176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + HDR RGB+A + HDR RGBA + HDR XY+Z + HDR RGB + HDR X+Y + RGB+A + RGBA + XY+Z + RGB + HDR L + X+Y + LA + L + + + + + + + + + + + + + + + + + + + + + + + + 64 + 64 + 48 + 48 + 32 + 24 + 24 + 16 + 16 + 16 + 8 + + 1 + 2 + 3 + 5 + 6 + 7 + 8 + Compressed bits/texel + Input color format + Uncompressed bits/texel + + + + + + 4 + 32 + 32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ktx/external/astc-encoder/Docs/FormatOverviewImg/coverage-legacy.svg b/ktx/external/astc-encoder/Docs/FormatOverviewImg/coverage-legacy.svg new file mode 100644 index 0000000..36cdc61 --- /dev/null +++ b/ktx/external/astc-encoder/Docs/FormatOverviewImg/coverage-legacy.svg @@ -0,0 +1,1210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + HDR RGB+A + HDR RGBA + HDR XY+Z + HDR RGB + HDR X+Y + RGB+A + RGBA + XY+Z + RGB + HDR L + X+Y + LA + L + + + + + + + + + + + + + + + + + + + + + + + + 64 + 64 + 48 + 48 + 32 + 24 + 24 + 16 + 16 + 16 + 8 + + 1 + 2 + 3 + 5 + 6 + 7 + 8 + Compressed bits/texel + Input color format + Uncompressed bits/texel + + + + + + + + + + + PVRTC + + PVRTC + + 4 + ETC, BC1 + + + ETC, BC4 + + BC6H + + 32 + 32 + ETC, BC2, + BC3, BC7 + + BC7 + + ETC, BC5 + + diff --git a/ktx/external/astc-encoder/Docs/FormatOverviewImg/gradient-1p.svg b/ktx/external/astc-encoder/Docs/FormatOverviewImg/gradient-1p.svg new file mode 100644 index 0000000..7d941ef --- /dev/null +++ b/ktx/external/astc-encoder/Docs/FormatOverviewImg/gradient-1p.svg @@ -0,0 +1,1053 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + Endpoint 1 + Endpoint 2 + + Color Gradient + + + Sample Interpolated Colors + + W=0.0 + W=1.0 + W=0.5 + W=0.75 + W=0.25 + + + Texel Weights + + + + + + + + + + + + + + + + + 0.0 + 0.0 + 0.0 + 0.0 + 0.25 + 0.25 + 0.75 + 0.75 + 0.25 + 0.25 + 0.5 + 1.0 + 0.75 + 0.75 + 1.0 + 1.0 + + diff --git a/ktx/external/astc-encoder/Docs/FormatOverviewImg/gradient-2p.svg b/ktx/external/astc-encoder/Docs/FormatOverviewImg/gradient-2p.svg new file mode 100644 index 0000000..154df1e --- /dev/null +++ b/ktx/external/astc-encoder/Docs/FormatOverviewImg/gradient-2p.svg @@ -0,0 +1,1419 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + Partition 0 + + + Color Gradients + + + Partition Index + + + + + + + + + + + Partition 1 + + + Texel Weights + + + + + + + + + + + + + + + + + + + 0.0 + 0.0 + 0.0 + 0.0 + 0.25 + 0.25 + 0.75 + 1.0 + 0.25 + 0.25 + 0.5 + 1.0 + 0.5 + 0.75 + 1.0 + 1.0 + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + + + diff --git a/ktx/external/astc-encoder/Docs/FormatOverviewImg/hash.png b/ktx/external/astc-encoder/Docs/FormatOverviewImg/hash.png new file mode 100644 index 0000000..9778eb9 Binary files /dev/null and b/ktx/external/astc-encoder/Docs/FormatOverviewImg/hash.png differ diff --git a/ktx/external/astc-encoder/Docs/Terminology.md b/ktx/external/astc-encoder/Docs/Terminology.md new file mode 100644 index 0000000..bf1dd0c --- /dev/null +++ b/ktx/external/astc-encoder/Docs/Terminology.md @@ -0,0 +1,79 @@ +# Terminology for the ASTC Encoder + +Like most software, the `astcenc` code base has a set of naming conventions +for variables which are used to ensure both accuracy and reasonable brevity. + +:construction: These conventions are being used for new patches, so new code +will conform to this, but older code is still being cleaned up to follow +these conventions. + +## Counts + +For counts of things prefer `_count` rather than `s`. For example: + +* `plane_count` +* `weight_count` +* `texel_count` + +Where possible aim for descriptive loop variables, as these are more literate +than simple `i` or `j` variables. For example: + +* `plane_index` +* `weight_index` +* `texel_index` + +## Ideal, Unpacked Quantized, vs Packed Quantized + +Variables that are quantized, such as endpoint colors and weights, have +multiple states depending on how they are being used. + +**Ideal values** represent arbitrary numeric values that can take any value. +These are often used during compression to work out the best value before +any quantization is applied. For example, integer weights in the 0-64 range can +take any of the 65 values available. + +**Quant uvalues** represent the unpacked numeric value after any quantization +rounding has been applied. These are often used during compression to work out +the error for the quantized value compared to the ideal value. For example, +`QUANT_3` weights in the 0-64 range can only take one of `[0, 32, 64]`. + +**Quant pvalues** represent the packed numeric value in the quantized alphabet. +This is what ends up encoded in the ASTC data, although note that the encoded +ordering is scrambled to simplify hardware. For example, `QUANT_3` weights +originally in the 0-64 range can only take one of `[0, 1, 2]`. + +For example: + +* `weights_ideal_value` +* `weights_quant_uvalue` +* `weights_quant_pvalue` + +## Full vs Decimated interpolation weights + +Weight grids have multiple states depending on how they are being used. + +**full_weights** represent per texel weight grids, storing one weight per texel. + +**decimated_weights** represent reduced weight grids, which can store fewer +weights and which are bilinear interpolated to generate the full weight grid. + +Full weights have no variable prefix,but decimated weights are stored with +a `dec_` prefix. + +* `dec_weights_ideal_value` +* `dec_weights_quant_uvalue` +* `dec_weights_quant_pvalue` + +## Weight vs Significance + +The original encoder used "weight" for multiple purposes - texel significance +(weight the error), color channel significance (weight the error), and endpoint +interpolation weights. This gets very confusing in functions using all three! + +We are slowly refactoring the code to only use "weight" to mean the endpoint +interpolation weights. The error weighting factors used for other purposes are +being updated to use the using the term "significance". + +- - - + +_Copyright © 2020-2022, Arm Limited and contributors. All rights reserved._ diff --git a/ktx/external/astc-encoder/Docs/Testing.md b/ktx/external/astc-encoder/Docs/Testing.md new file mode 100644 index 0000000..da197fc --- /dev/null +++ b/ktx/external/astc-encoder/Docs/Testing.md @@ -0,0 +1,120 @@ +# Testing astcenc + +The repository contains a small suite of tests which can be used to sanity +check source code changes to the compressor. It must be noted that this test +suite is relatively limited in scope and does not cover every feature or +bitrate of the standard. + +# Required software + +Running the tests requires Python 3.7 to be installed on the host machine, and +an `astcenc-avx2` release build to have been previously compiled and installed +into an directory called `astcenc` in the root of the git checkout. This +can be achieved by configuring the CMake build using the install prefix +`-DCMAKE_INSTALL_PREFIX=../` and then running a build with the `install` build +target. + +# Running C++ unit tests + +We support a small (but growing) number of C++ unit tests, which are written +using the `googletest` framework and integrated in the CMake "CTest" test +framework. + +To build unit tests pull the `googletest` git submodule and add +`-DASTCENC_UNITTEST=ON` to the CMake command line when configuring. + +To run unit tests use the CMake `ctest` utility from your build directory after +you have built the tests. + +```shell +cd build +ctest --verbose +``` + +# Running command line tests + +To run the command line tests, which aim to get coverage of the command line +options and core codec stability without testing the compression quality +itself, run the command line: + + python3 -m unittest discover -s Test -p astc_test*.py -v + +# Running image tests + +To run the image test suite run the following command from the root directory +of the repository: + + python3 ./Test/astc_test_image.py + +This will run though a series of image compression tests, comparing the image +PSNR against a set of reference results from the last stable baseline. The test +will fail if any reduction in PSNR above a set threshold is detected. Note that +performance information is reported, but regressions will not flag a failure. + +For debug purposes, all decompressed test output images and result CSV files +are stored in the `TestOutput` directory, using the same test set structure as +the `Test/Images` folder. + +## Test selection + +The runner supports a number of options to filter down what is run, enabling +developers to focus local testing on the parts of the code they are working on. + +* `--encoder` selects which encoder to run. By default the `avx2` encoder is + selected. Note that some out-of-tree reference encoders (older encoders, and + some third-party encoders) are supported for comparison purposes. These will + not work without the binaries being manually provided; they are not + distributed here. +* `--test-set` selects which image set to run. By default the `Small` image + test set is selected, which aims to provide basic coverage of many different + color formats and color profiles. +* `--block-size` selects which block size to run. By default a range of + block sizes (2D and 3D) are used. +* `--color-profile` selects which color profiles from the standard should be + used (LDR, LDR sRGB, or HDR) to select images. By default all are selected. +* `--color-format` selects which color formats should be used (L, XY, RGB, + RGBA) to select images. By default all are selected. + +## Performance tests + +To provide less noisy performance results the test suite supports compressing +each image multiple times and returning the best measured performance. To +enable this mode use the following options: + +* `--repeats ` : Run M test compression passes which are timed. + +**Note:** The reference CSV contains performance results measured on an Intel +Core i5 9600K running at 4.3GHz, running each test 5 times. + +## Updating reference data + +The reference PSNR and performance scores are stored in CSVs committed to the +repository. This data is created by running the tests using the last stable +release on a standard test machine we use for performance testing builds. + +It can be useful for developers to rebuild the reference results for their +local machine, in particular for measuring performance improvements. To build +new reference CSVs, download the current reference `astcenc` binary (1.7) from +GitHub for your host OS and place it in to the `./Binaries/1.7/` directory. +Once this is done, run the command: + + python3 ./Test/astc_test_image.py --encoder 1.7 --test-set all --repeats 5 + +... to regenerate the reference CSV files. + +**WARNING:** This can take some hours to complete, and it is best done when the +test suite gets exclusive use of the machine to avoid other processing slowing +down the compression and disturbing the performance data. It is recommended to +shutdown or disable any background applications that are running. + +## Valgrind memcheck + +It is always worth running the Valgrind memcheck tool to validate that we have +not introduced any obvious memory errors. Build a release build with symbols +information with `-DCMAKE_BUILD_TYPE=RelWithDebInfo` and then run: + + valgrind --tool=memcheck --track-origins=yes + +- - - + +_Copyright © 2019-2022, Arm Limited and contributors. All rights reserved._ diff --git a/ktx/external/astc-encoder/README.md b/ktx/external/astc-encoder/README.md new file mode 100644 index 0000000..a3ec030 --- /dev/null +++ b/ktx/external/astc-encoder/README.md @@ -0,0 +1,250 @@ +# About + +The Arm® Adaptive Scalable Texture Compression (ASTC) Encoder, `astcenc`, is +a command-line tool for compressing and decompressing images using the ASTC +texture compression standard. + +## The ASTC format + +The ASTC compressed data format, developed by Arm® and AMD, has been adopted as +an official extension to the OpenGL®, OpenGL ES, and Vulkan® graphics APIs. It +provides a major step forward in terms of both the image quality at a given +bitrate, and the format and bitrate flexibility available to content creators. +This allows more assets to use compression, often at a reduced bitrate compared +to other formats, reducing memory storage and bandwidth requirements. + +Read the [ASTC Format Overview][1] for a quick introduction to the format, or +read the full [Khronos Data Format Specification][2] for all the details. + +## License + +This project is licensed under the Apache 2.0 license. By downloading any +component from this repository you acknowledge that you accept terms specified +in the [LICENSE.txt](LICENSE.txt) file. + +# Encoder feature support + +The encoder supports compression of low dynamic range (BMP, JPEG, PNG, TGA) and +high dynamic range (EXR, HDR) images, as well as a subset of image data wrapped +in the DDS and KTX container formats, into ASTC or KTX format output images. + +The decoder supports decompression of ASTC or KTX format input images into low +dynamic range (BMP, PNG, TGA), high dynamic range (EXR, HDR), or DDS and KTX +wrapped output images. + +The encoder allows control over the compression time/quality tradeoff with +`exhaustive`, `verythorough`, `thorough`, `medium`, `fast`, and `fastest` +encoding quality presets. + +The encoder allows compression time and quality analysis by reporting the +compression time, and the Peak Signal-to-Noise Ratio (PSNR) between the input +image and the compressed output. + +## ASTC format support + +The `astcenc` compressor supports generation of images for all three profiles +allowed by the ASTC specification: + +* 2D Low Dynamic Range (LDR profile) +* 2D LDR and High Dynamic Range (HDR profile) +* 2D and 3D, LDR and HDR (Full profile) + +It also supports all of the ASTC block sizes and compression modes, allowing +content creators to use the full spectrum of quality-to-bitrate options ranging +from 0.89 bits/pixel up to 8 bits/pixel. + +# Prebuilt binaries + +Release build binaries for the `astcenc` stable releases are provided in the +[GitHub Releases page][3]. + +* Change log: [5.x series](./Docs/ChangeLog-5x.md) + +Binaries are provided for 64-bit builds on Windows, macOS, and Linux. + +## Windows and Linux + +For Windows and Linux the builds of the astcenc are provided as multiple +binaries, each tuned for a specific SIMD instruction set. + +For x86-64 we provide, in order of increasing performance: + +* `astcenc-sse2` - uses SSE2 +* `astcenc-sse4.1` - uses SSE4.1 and POPCNT +* `astcenc-avx2` - uses AVX2, SSE4.2, POPCNT, and F16C + +The x86-64 SSE2 builds will work on all x86-64 machines, but it is the slowest +of the three. The other two require extended CPU instruction set support which +is not universally available, but each step gains ~15% more performance. + +For Arm we provide, in order of increasing performance: + +* `astcenc-sve_256` - uses 256-bit SVE +* `astcenc-sve_128` - uses 128-bit SVE +* `astcenc-neon` - uses NEON + +Note: The Arm Scalable Vector Extensions (SVE) allow CPUs to have a variable +vector length. The astcenc implementation is not written in a length-agnostic +style and requires the binary to match the vector length on the host CPU. + +## macOS + +For macOS devices we provide a single universal binary `astcenc`, which allows +the OS to automatically use the correct binary variant for the current host +machine. Support is provided for three architecture slices: + +* `x86_64` - uses the `astcenc-sse4.1` build defined above. +* `x86_64h` - uses the `astcenc-avx2` build defined above. +* `arm64` - uses the `astcenc-neon` build defined above. + +## Repository branches + +The `main` branch is an active development branch for the compressor. It aims +to be a stable branch for the latest major release series, but as it is used +for ongoing development expect it to have some volatility. We recommend using +the latest stable release tag for production development. + +The `4.x` branch is a stable branch for the older 4.x release series. It is no +longer under active development, but is a supported branch that continues to +get back-ported bug fixes. + +The `1.x`, `2.x`, and `3.x` branches are stable branches for older releases. +They are no longer under active development or getting bug fixes. + +Any other branches you might find are development branches for new features or +optimizations, so might be interesting to play with but should be considered +transient and unstable. + + +# Getting started + +Open a terminal, change to the appropriate directory for your system, and run +the astcenc encoder program, like this on Linux or macOS: + + ./astcenc + +... or like this on Windows: + + astcenc + +Invoking `astcenc -help` gives an extensive help message, including usage +instructions and details of all available command line options. A summary of +the main encoder options are shown below. + +## Compressing an image + +Compress an image using the `-cl` \ `-cs` \ `-ch` \ `-cH` modes. For example: + + astcenc -cl example.png example.astc 6x6 -medium + +This compresses `example.png` using the LDR color profile and a 6x6 block +footprint (3.56 bits/pixel). The `-medium` quality preset gives a reasonable +image quality for a relatively fast compression speed, so is a good starting +point for compression. The output is stored to a linear color space compressed +image, `example.astc`. + +The modes available are: + +* `-cl` : use the linear LDR color profile. +* `-cs` : use the sRGB LDR color profile. +* `-ch` : use the HDR color profile, tuned for HDR RGB and LDR A. +* `-cH` : use the HDR color profile, tuned for HDR RGBA. + +If you intend to use the resulting image with the decode mode extensions to +limit the decompressed precision to UNORM8, it is recommended that you also +specify the `-decode_unorm8` flag. This will ensure that the compressor uses +the correct rounding rules when choosing encodings. + +## Decompressing an image + +Decompress an image using the `-dl` \ `-ds` \ `-dh` \ `-dH` modes. For example: + + astcenc -dh example.astc example.tga + +This decompresses `example.astc` using the full HDR feature profile, storing +the decompressed output to `example.tga`. + +The modes available mirror the options used for compression, but use a `d` +prefix. Note that for decompression there is no difference between the two HDR +modes, they are both provided simply to maintain symmetry across operations. + +## Measuring image quality + +Review the compression quality using the `-tl` \ `-ts` \ `-th` \ `-tH` modes. +For example: + + astcenc -tl example.png example.tga 5x5 -thorough + +This is equivalent to using using the LDR color profile and a 5x5 block size +to compress the image, using the `-thorough` quality preset, and then +immediately decompressing the image and saving the result. This can be used +to enable a visual inspection of the compressed image quality. In addition +this mode also prints out some image quality metrics to the console. + +The modes available mirror the options used for compression, but use a `t` +prefix. + +## Experimenting + +Efficient real-time graphics benefits from minimizing compressed texture size, +as it reduces memory footprint, reduces memory bandwidth, saves energy, and can +improve texture cache efficiency. However, like any lossy compression format +there will come a point where the compressed image quality is unacceptable +because there are simply not enough bits to represent the output with the +precision needed. We recommend experimenting with the block footprint to find +the optimum balance between size and quality, as the finely adjustable +compression ratio is one of major strengths of the ASTC format. + +The compression speed can be controlled from `-fastest`, through `-fast`, +`-medium` and `-thorough`, up to `-exhaustive`. In general, the more time the +encoder has to spend looking for good encodings the better the results, but it +does result in increasingly small improvements for the amount of time required. + +There are many other command line options for tuning the encoder parameters +which can be used to fine tune the compression algorithm. See the command line +help message for more details. + +# Documentation + +The [ASTC Format Overview](./Docs/FormatOverview.md) page provides a high level +introduction to the ASTC texture format, how it encodes data, and why it is +both flexible and efficient. + +The [Effective ASTC Encoding](./Docs/Encoding.md) page looks at some of the +guidelines that should be followed when compressing data using `astcenc`. +It covers: + +* How to efficiently encode data with fewer than 4 channels. +* How to efficiently encode normal maps, sRGB data, and HDR data. +* Coding equivalents to other compression formats. + +The [ASTC Developer Guide][5] document (external link) provides a more detailed +guide for developers using the `astcenc` compressor. + +The [.astc File Format](./Docs/FileFormat.md) page provides a light-weight +specification for the `.astc` file format and how to read or write it. + +The [Building ASTC Encoder](./Docs/Building.md) page provides instructions on +how to build `astcenc` from the sources in this repository. + +The [Testing ASTC Encoder](./Docs/Testing.md) page provides instructions on +how to test any modifications to the source code in this repository. + +# Support + +If you have issues with the `astcenc` encoder, or questions about the ASTC +texture format itself, please raise them in the GitHub issue tracker. + +If you have any questions about Arm GPUs, application development for Arm GPUs, +or general mobile graphics development or technology please submit them on the +[Arm Community graphics forums][4]. + +- - - + +_Copyright © 2013-2025, Arm Limited and contributors. All rights reserved._ + +[1]: ./Docs/FormatOverview.md +[2]: https://www.khronos.org/registry/DataFormat/specs/1.4/dataformat.1.4.html#ASTC +[3]: https://github.com/ARM-software/astc-encoder/releases +[4]: https://community.arm.com/support-forums/f/graphics-gaming-and-vr-forum/ +[5]: https://developer.arm.com/documentation/102162/latest/?lang=en diff --git a/ktx/external/astc-encoder/Source/CMakeLists.txt b/ktx/external/astc-encoder/Source/CMakeLists.txt new file mode 100644 index 0000000..89a1d00 --- /dev/null +++ b/ktx/external/astc-encoder/Source/CMakeLists.txt @@ -0,0 +1,126 @@ +# SPDX-License-Identifier: Apache-2.0 +# ---------------------------------------------------------------------------- +# Copyright 2020-2025 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. +# ---------------------------------------------------------------------------- + +# Overwrite the LTO flags to force fat LTO; worth 3-4% performance +# See https://gitlab.kitware.com/cmake/cmake/-/issues/16808 +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND ${ASTCENC_CLI}) + set(CMAKE_CXX_COMPILE_OPTIONS_IPO "-flto") +endif() + +if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND ${ASTCENC_CLI}) + set(CMAKE_CXX_COMPILE_OPTIONS_IPO "-flto=auto") +endif() + +if(${ASTCENC_DECOMPRESSOR}) + set(ASTCENC_CODEC dec) +else() + set(ASTCENC_CODEC enc) +endif() + +set(ASTCENC_ARTIFACTS native none sve_256 sve_128 neon avx2 sse4.1 sse2) +set(ASTCENC_CONFIGS ${ASTCENC_ISA_NATIVE} ${ASTCENC_ISA_NONE} ${ASTCENC_ISA_SVE_256} ${ASTCENC_ISA_SVE_128} ${ASTCENC_ISA_NEON} ${ASTCENC_ISA_AVX2} ${ASTCENC_ISA_SSE41} ${ASTCENC_ISA_SSE2}) +list(LENGTH ASTCENC_ARTIFACTS ASTCENC_ARTIFACTS_LEN) +math(EXPR ASTCENC_ARTIFACTS_LEN "${ASTCENC_ARTIFACTS_LEN} - 1") + +foreach(INDEX RANGE ${ASTCENC_ARTIFACTS_LEN}) + list(GET ASTCENC_ARTIFACTS ${INDEX} ASTCENC_ARTIFACT) + list(GET ASTCENC_CONFIGS ${INDEX} ASTCENC_CONFIG) + if(${ASTCENC_CONFIG}) + set(ASTCENC_ISA_SIMD ${ASTCENC_ARTIFACT}) + + if(${ASTCENC_ISA_SIMD} MATCHES "sve_256") + # Not suported on macOS + elseif(${ASTCENC_ISA_SIMD} MATCHES "sve_128") + # Not suported on macOS + elseif(${ASTCENC_ISA_SIMD} MATCHES "neon") + set(CMAKE_OSX_ARCHITECTURES arm64) + elseif(${ASTCENC_ISA_SIMD} MATCHES "sse2") + set(CMAKE_OSX_ARCHITECTURES x86_64) + elseif(${ASTCENC_ISA_SIMD} MATCHES "sse4.1") + set(CMAKE_OSX_ARCHITECTURES x86_64) + elseif(${ASTCENC_ISA_SIMD} MATCHES "avx2") + set(CMAKE_OSX_ARCHITECTURES x86_64h) + elseif(${ASTCENC_ISA_SIMD} MATCHES "none") + # Using "none" uses implicit architecture + elseif(${ASTCENC_ISA_SIMD} MATCHES "native") + # Using "native" uses implicit architecture + else() + message(FATAL_ERROR "'${ASTCENC_ISA_SIMD}' is unknown ISA") + endif() + + include(cmake_core.cmake) + endif() +endforeach() + +if(${ASTCENC_CLI} AND ${ASTCENC_UNIVERSAL_BUILD}) + add_custom_target( + astc${ASTCENC_CODEC} + ALL + COMMAND + lipo -create -output $/astc${ASTCENC_CODEC} -arch x86_64 $ -arch x86_64h $ -arch arm64 $ + VERBATIM) + + add_dependencies( + astc${ASTCENC_CODEC} + astc${ASTCENC_CODEC}-sse4.1 + astc${ASTCENC_CODEC}-avx2 + astc${ASTCENC_CODEC}-neon) + + install(PROGRAMS $/astc${ASTCENC_CODEC} + DESTINATION bin) +endif() + +if(${ASTCENC_SHAREDLIB} AND ${ASTCENC_UNIVERSAL_BUILD}) + add_custom_target( + astc${ASTCENC_CODEC}-shared + ALL + COMMAND + lipo -create -output $/libastc${ASTCENC_CODEC}-shared.dylib -arch x86_64 $ -arch x86_64h $ -arch arm64 $ + VERBATIM) + + add_dependencies( + astc${ASTCENC_CODEC}-shared + astc${ASTCENC_CODEC}-sse4.1-shared + astc${ASTCENC_CODEC}-avx2-shared + astc${ASTCENC_CODEC}-neon-shared) + + install(PROGRAMS $/libastc${ASTCENC_CODEC}-shared.dylib + DESTINATION lib) +endif() + +# - - - - - - - - - - - - - - - - - - +# Unit testing +if(${ASTCENC_UNITTEST}) + set(INSTALL_GTEST OFF CACHE BOOL "" FORCE) + set(CMAKE_OSX_ARCHITECTURES x86_64;arm64) + add_subdirectory(GoogleTest) + + # Workaround GoogleTest CRT selection issue issue + # See https://github.com/google/googletest/issues/4067 + set_property( + TARGET gtest + PROPERTY + MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + + set_property( + TARGET gtest_main + PROPERTY + MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + + enable_testing() + add_subdirectory(UnitTest) +endif() diff --git a/ktx/external/astc-encoder/Source/Fuzzers/fuzz_astc_physical_to_symbolic.cpp b/ktx/external/astc-encoder/Source/Fuzzers/fuzz_astc_physical_to_symbolic.cpp new file mode 100644 index 0000000..e387108 --- /dev/null +++ b/ktx/external/astc-encoder/Source/Fuzzers/fuzz_astc_physical_to_symbolic.cpp @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2020-2021 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Fuzz target for physical_to_symbolic(). + * + * This function is the first entrypoint for decompressing a 16 byte block of + * input ASTC data from disk. The 16 bytes can contain arbitrary data; they + * are read from an external source, but the block size used must be a valid + * ASTC block footprint. + */ + + +#include "astcenc_internal.h" + +#include +#include +#include + +struct BlockSizes +{ + int x; + int y; + int z; +}; + +std::array testSz {{ + { 4, 4, 1}, // Highest bitrate + {12, 12, 1}, // Largest 2D block + {6, 6, 6} // Largest 3D block +}}; + +std::array testBSD; + +/** + * @brief Utility function to create all of the block size descriptors needed. + * + * This is triggered once via a static initializer. + * + * Triggering once is important so that we only create a single BSD per block + * size we need, rather than one per fuzzer iteration (it's expensive). This + * improves fuzzer throughput by ~ 1000x! + * + * Triggering via a static initializer, rather than a lazy init in the fuzzer + * function, is important because is means that the BSD is allocated before + * fuzzing starts. This means that leaksanitizer will ignore the fact that we + * "leak" the dynamic allocations inside the BSD (we never call term()). + */ +bool bsd_initializer() +{ + for (int i = 0; i < testSz.size(); i++) + { + init_block_size_descriptor( + testSz[i].x, + testSz[i].y, + testSz[i].z, + false, + 4, + 1.0f, + testBSD[i]); + } + + return true; +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + // Preinitialize the block size descriptors we need + static bool init = bsd_initializer(); + + // Must have 4 (select block size) and 16 (payload) bytes + if (size < 4 + 16) + { + return 0; + } + + FuzzedDataProvider stream(data, size); + + // Select a block size to test + int i = stream.ConsumeIntegralInRange(0, testSz.size() - 1); + + // Populate the physical block + uint8_t pcb[16]; + std::vector buffer = stream.ConsumeBytes(16); + std::memcpy(pcb, buffer.data(), 16); + + // Call the function under test + symbolic_compressed_block scb; + physical_to_symbolic(testBSD[i], pcb, scb); + + return 0; +} diff --git a/ktx/external/astc-encoder/Source/ThirdParty/stb_image.h b/ktx/external/astc-encoder/Source/ThirdParty/stb_image.h new file mode 100644 index 0000000..5e807a0 --- /dev/null +++ b/ktx/external/astc-encoder/Source/ThirdParty/stb_image.h @@ -0,0 +1,7987 @@ +/* stb_image - v2.28 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff + 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes + 2.26 (2020-07-13) many minor fixes + 2.25 (2020-02-02) fix warnings + 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically + 2.23 (2019-08-11) fix clang static analysis warning + 2.22 (2019-03-04) gif fixes, fix warnings + 2.21 (2019-02-25) fix typo in comment + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine Simon Breuss (16-bit PNM) + John-Mark Allen + Carmelo J Fdez-Aguera + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski + Phil Jordan Dave Moore Roy Eltham + Hayaki Saito Nathan Reed Won Chun + Luke Graham Johan Duparc Nick Verigakis the Horde3D community + Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Eugene Golushkov Laurent Gomila Cort Stratton github:snagar + Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex + Cass Everitt Ryamond Barbiero github:grim210 + Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw + Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus + Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo + Julian Raschke Gregory Mullen Christian Floisand github:darealshinji + Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 + Brad Weinberger Matvey Cherevko github:mosra + Luca Sas Alexander Veselov Zack Middleton [reserved] + Ryan C. Gordon [reserved] [reserved] + DO NOT ADD YOUR NAME HERE + + Jacko Dirks + + To add your name to the credits, pick a random blank space in the middle and fill it. + 80% of merge conflicts on stb PRs are due to people adding their name at the end + of the credits. +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data); +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// To query the width, height and component count of an image without having to +// decode the full file, you can use the stbi_info family of functions: +// +// int x,y,n,ok; +// ok = stbi_info(filename, &x, &y, &n); +// // returns ok=1 and sets x, y, n if image is a supported format, +// // 0 otherwise. +// +// Note that stb_image pervasively uses ints in its public API for sizes, +// including sizes of memory buffers. This is now part of the API and thus +// hard to change without causing breakage. As a result, the various image +// loaders all have certain limits on image size; these differ somewhat +// by format but generally boil down to either just under 2GB or just under +// 1GB. When the decoded image would be larger than this, stb_image decoding +// will fail. +// +// Additionally, stb_image will reject image files that have any of their +// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, +// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, +// the only way to have an image with such dimensions load correctly +// is for it to have a rather extreme aspect ratio. Either way, the +// assumption here is that such larger images are likely to be malformed +// or malicious. If you do need to load an image with individual dimensions +// larger than that, and it still fits in the overall size limit, you can +// #define STBI_MAX_DIMENSIONS on your own to be something larger. +// +// =========================================================================== +// +// UNICODE: +// +// If compiling for Windows and you wish to use Unicode filenames, compile +// with +// #define STBI_WINDOWS_UTF8 +// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert +// Windows wchar_t filenames to utf8. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy-to-use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// provide more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image supports loading HDR images in general, and currently the Radiance +// .HDR file format specifically. You can still load any file through the existing +// interface; if you attempt to load an HDR file, it will be automatically remapped +// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// We optionally support converting iPhone-formatted PNGs (which store +// premultiplied BGRA) back to RGB, even though they're internally encoded +// differently. To enable this conversion, call +// stbi_convert_iphone_png_to_rgb(1). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// +// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater +// than that size (in either width or height) without further processing. +// This is to let programs in the wild set an upper bound to prevent +// denial-of-service attacks on untrusted data, as one could generate a +// valid image of gigantic dimensions and force stb_image to allocate a +// huge block of memory and spend disproportionate time decoding it. By +// default this is set to (1 << 24), which is 16777216, but that's still +// very big. + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +#include +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef STBIDEF +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + +#ifdef STBI_WINDOWS_UTF8 +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// on most compilers (and ALL modern mainstream compilers) this is threadsafe +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit (char const *filename); +STBIDEF int stbi_is_16_bit_from_file(FILE *f); +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// as above, but only applies to images loaded on the thread that calls the function +// this function is only available if your compiler supports thread-local variables; +// calling it will fail to link if your compiler doesn't +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + +#ifdef __cplusplus +#define STBI_EXTERN extern "C" +#else +#define STBI_EXTERN extern +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + +#ifndef STBI_NO_THREAD_LOCALS + #if defined(__cplusplus) && __cplusplus >= 201103L + #define STBI_THREAD_LOCAL thread_local + #elif defined(__GNUC__) && __GNUC__ < 5 + #define STBI_THREAD_LOCAL __thread + #elif defined(_MSC_VER) + #define STBI_THREAD_LOCAL __declspec(thread) + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) + #define STBI_THREAD_LOCAL _Thread_local + #endif + + #ifndef STBI_THREAD_LOCAL + #if defined(__GNUC__) + #define STBI_THREAD_LOCAL __thread + #endif + #endif +#endif + +#if defined(_MSC_VER) || defined(__SYMBIAN32__) +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#endif + +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif + +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +#ifdef _MSC_VER +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name +#else +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +#ifndef STBI_MAX_DIMENSIONS +#define STBI_MAX_DIMENSIONS (1 << 24) +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + int callback_already_read; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + int ch; + fseek((FILE*) user, n, SEEK_CUR); + ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ + if (ch != EOF) { + ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ + } +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user) || ferror((FILE *) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__pnm_is16(stbi__context *s); +#endif + +static +#ifdef STBI_THREAD_LOCAL +STBI_THREAD_LOCAL +#endif +const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +#ifndef STBI_NO_FAILURE_STRINGS +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} +#endif + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} +#endif + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} +#endif + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + +// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. +static int stbi__addints_valid(int a, int b) +{ + if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow + if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. + return a <= INT_MAX - b; +} + +// returns 1 if the product of two signed shorts is valid, 0 on overflow. +static int stbi__mul2shorts_valid(short a, short b) +{ + if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow + if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid + if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN + return a >= SHRT_MIN / b; +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load_global = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_global = flag_true_if_should_flip; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global +#else +static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; + +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_local = flag_true_if_should_flip; + stbi__vertically_flip_on_load_set = 1; +} + +#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ + ? stbi__vertically_flip_on_load_local \ + : stbi__vertically_flip_on_load_global) +#endif // STBI_THREAD_LOCAL + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + // test the formats with a very explicit header first (at least a FOURCC + // or distinctive magic number first) + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); + #else + STBI_NOTUSED(bpc); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); + #endif + + // then the formats that can end up attempting to load with just 1 or 2 + // bytes matching expectations; these are prone to false positives, so + // try them later + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp, ri); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +#ifndef STBI_NO_GIF +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} +#endif + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 8) { + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 16) { + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); +#endif + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s,f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; + #else + STBI_NOTUSED(f); + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; + #endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) +// nothing +#else +static void stbi__skip(stbi__context *s, int n) +{ + if (n == 0) return; // already there! + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) +// nothing +#else +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} +#endif + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + z += (stbi__uint32)stbi__get16le(s) << 16; + return z; +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + } + if (n < comp) { + for (i=0; i < x*y; ++i) { + output[i*comp + n] = data[i*comp + n]/255.0f; + } + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) { + for (j=0; j < count[i]; ++j) { + h->size[k++] = (stbi_uc) (i+1); + if(k >= 257) return stbi__err("bad size list","Corrupt JPEG"); + } + } + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + if(c < 0 || c >= 256) // symbol id out of bounds! + return -1; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + + sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & (sgn - 1)); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + diff = t ? stbi__extend_receive(j, t) : 0; + + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * (1 << j->succ_low)); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * (1 << shift)); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift)); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) * 4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0]*4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values! + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios + // and I've never seen a non-corrupted JPEG file actually use them + for (i=0; i < s->img_n; ++i) { + if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); + if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +static int stbi__skip_jpeg_junk_at_end(stbi__jpeg *j) +{ + // some JPEGs have junk at end, skip over it but if we find what looks + // like a valid marker, resume there + while (!stbi__at_eof(j->s)) { + int x = stbi__get8(j->s); + while (x == 255) { // might be a marker + if (stbi__at_eof(j->s)) return STBI__MARKER_none; + x = stbi__get8(j->s); + if (x != 0x00 && x != 0xff) { + // not a stuffed zero or lead-in to another marker, looks + // like an actual marker, return it + return x; + } + // stuffed zero has x=0 now which ends the loop, meaning we go + // back to regular scan loop. + // repeated 0xff keeps trying to read the next byte of the marker. + } + } + return STBI__MARKER_none; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + j->marker = stbi__skip_jpeg_junk_at_end(j); + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + m = stbi__get_marker(j); + if (STBI__RESTART(m)) + m = stbi__get_marker(j); + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + m = stbi__get_marker(j); + } else { + if (!stbi__process_marker(j, m)) return 1; + m = stbi__get_marker(j); + } + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // nothing to do if no components requested; check this now to avoid + // accessing uninitialized coutput[0] later + if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__errpuc("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) +#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[STBI__ZNSYMS]; + stbi__uint16 value[STBI__ZNSYMS]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static int stbi__zeof(stbi__zbuf *z) +{ + return (z->zbuffer >= z->zbuffer_end); +} + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + return stbi__zeof(z) ? 0 : *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + if (z->code_buffer >= (1U << z->num_bits)) { + z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ + return; + } + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s >= 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! + if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) { + if (stbi__zeof(a)) { + return -1; /* report error for unexpected end of data. */ + } + stbi__fill_bits(a); + } + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + unsigned int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (unsigned int) (z->zout - z->zout_start); + limit = old_limit = (unsigned) (z->zout_end - z->zout_start); + if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); + while (cur + n > limit) { + if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); + limit *= 2; + } + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static const int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static const int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + return 1; + } + if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) { + c = stbi__zreceive(a,3)+3; + } else if (c == 18) { + c = stbi__zreceive(a,7)+11; + } else { + return stbi__err("bad codelengths", "Corrupt PNG"); + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int stbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *prior; + int filter = *raw++; + + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + if (img_width_bytes > x) return stbi__err("invalid width","Corrupt PNG"); + cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // handle first byte explicitly + for (k=0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes+1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + // this is a little gross, so that we don't switch per-pixel or per-component + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*filter_bytes; + #define STBI__CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch (filter) { + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy(cur, raw, nk); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; + } + #undef STBI__CASE + raw += nk; + } else { + STBI_ASSERT(img_n+1 == out_n); + #define STBI__CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) + switch (filter) { + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; + } + #undef STBI__CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if (depth == 16) { + cur = a->out + stride*j; // start at the beginning of the row again + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } + } + } + } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit + // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + int q; + // insert alpha = 255 + cur = a->out + stride*j; + if (img_n == 1) { + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; + } + } else { + STBI_ASSERT(img_n == 3); + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; + } + } + } + } + } else if (depth == 16) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc *cur = a->out; + stbi__uint16 *cur16 = (stbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } + } + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + if (!final) return stbi__err("outofmem", "Out of memory"); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load_global = 0; +static int stbi__de_iphone_flag_global = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_global = flag_true_if_should_convert; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global +#define stbi__de_iphone_flag stbi__de_iphone_flag_global +#else +static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; +static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; + +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; + stbi__unpremultiply_on_load_set = 1; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_local = flag_true_if_should_convert; + stbi__de_iphone_flag_set = 1; +} + +#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ + ? stbi__unpremultiply_on_load_local \ + : stbi__unpremultiply_on_load_global) +#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ + ? stbi__de_iphone_flag_local \ + : stbi__de_iphone_flag_global) +#endif // STBI_THREAD_LOCAL + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]={0}; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); + s->img_y = stbi__get32be(s); + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + } + // even with SCAN_header, have to scan to see if we have a tRNS + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. + if (scan == STBI__SCAN_header) { ++s->img_n; return 1; } + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { + // header scan definitely stops at first IDAT + if (pal_img_n) + s->img_n = pal_img_n; + return 1; + } + if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth <= 8) + ri->bits_per_channel = 8; + else if (p->depth == 16) + ri->bits_per_channel = 16; + else + return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) { n += 16; z >>= 16; } + if (z >= 0x00100) { n += 8; z >>= 8; } + if (z >= 0x00010) { n += 4; z >>= 4; } + if (z >= 0x00004) { n += 2; z >>= 2; } + if (z >= 0x00002) { n += 1;/* >>= 1;*/ } + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(unsigned int v, int shift, int bits) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; + int extra_read; +} stbi__bmp_data; + +static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) +{ + // BI_BITFIELDS specifies masks explicitly, don't override + if (compress == 3) + return 1; + + if (compress == 0) { + if (info->bpp == 16) { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } else if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + // otherwise, use defaults, which is all-0 + info->mr = info->mg = info->mb = info->ma = 0; + } + return 1; + } + return 0; // error +} + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + info->extra_read = 14; + + if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes + if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + stbi__bmp_set_mask_defaults(info, compress); + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->extra_read += 12; + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + // V4/V5 header + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs + stbi__bmp_set_mask_defaults(info, compress); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - info.extra_read - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - info.extra_read - info.hsz) >> 2; + } + if (psize == 0) { + // accept some number of extra bytes after the header, but if the offset points either to before + // the header ends or implies a large amount of extra data, reject the file as malformed + int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); + int header_limit = 1024; // max we actually read is below 256 bytes currently. + int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. + if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { + return stbi__errpuc("bad header", "Corrupt BMP"); + } + // we established that bytes_read_so_far is positive and sensible. + // the first half of this test rejects offsets that are either too small positives, or + // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn + // ensures the number computed in the second half of the test can't overflow. + if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { + return stbi__errpuc("bad offset", "Corrupt BMP"); + } else { + stbi__skip(s, info.offset - bytes_read_so_far); + } + } + + if (info.bpp == 24 && ma == 0xff000000) + s->img_n = 3; + else + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } else { + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - info.extra_read - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + unsigned int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i]; p1[i] = p2[i]; p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + STBI_NOTUSED(tga_x_origin); // @TODO + STBI_NOTUSED(tga_y_origin); // @TODO + + if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + if (tga_palette_len == 0) { /* you have to have at least one entry! */ + STBI_FREE(tga_data); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + STBI_NOTUSED(tga_palette_start); + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + + if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + if (!result) return stbi__errpuc("outofmem", "Out of memory"); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!g) return stbi__err("outofmem", "Out of memory"); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) +{ + int dispose; + int first_frame; + int pi; + int pcount; + STBI_NOTUSED(req_comp); + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) + return stbi__errpuc("too large", "GIF image is too large"); + pcount = g->w * g->h; + g->out = (stbi_uc *) stbi__malloc(4 * pcount); + g->background = (stbi_uc *) stbi__malloc(4 * pcount); + g->history = (stbi_uc *) stbi__malloc(pcount); + if (!g->out || !g->background || !g->history) + return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "transparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to the color that was there the previous frame. + memset(g->out, 0x00, 4 * pcount); + memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) + memset(g->history, 0x00, pcount); // pixels that were affected previous frame + first_frame = 1; + } else { + // second frame - how do we dispose of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); + } + + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + + for (;;) { + int tag = stbi__get8(s); + switch (tag) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + // if the width of the specified rectangle is 0, that means + // we may not see *any* pixels or the image is malformed; + // to make sure this is caught, move the current y down to + // max_y (which is what out_gif_code checks). + if (w == 0) + g->cur_y = g->max_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (!o) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) +{ + STBI_FREE(g->out); + STBI_FREE(g->history); + STBI_FREE(g->background); + + if (out) STBI_FREE(out); + if (delays && *delays) STBI_FREE(*delays); + return stbi__errpuc("outofmem", "Out of memory"); +} + +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + int out_size = 0; + int delays_size = 0; + + STBI_NOTUSED(out_size); + STBI_NOTUSED(delays_size); + + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); + if (!tmp) + return stbi__load_gif_main_outofmem(&g, out, delays); + else { + out = (stbi_uc*) tmp; + out_size = layers * stride; + } + + if (delays) { + int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); + if (!new_delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + *delays = new_delays; + delays_size = layers * sizeof(int); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if (!out) + return stbi__load_gif_main_outofmem(&g, out, delays); + out_size = layers * stride; + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + if (!*delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + delays_size = layers * sizeof(int); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } else if (g.out) { + // if there was an error and we allocated an image buffer, free it! + STBI_FREE(g.out); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s, const char *signature) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + if (p == NULL) { + stbi__rewind( s ); + return 0; + } + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) { + if (info.bpp == 24 && info.ma == 0xff000000) + *comp = 3; + else + *comp = info.ma ? 4 : 3; + } + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + STBI_NOTUSED(stbi__get32be(s)); + STBI_NOTUSED(stbi__get32be(s)); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); + if (ri->bits_per_channel == 0) + return 0; + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { + STBI_FREE(out); + return stbi__errpuc("bad PNM", "PNM file truncated"); + } + + if (req_comp && req_comp != s->img_n) { + if (ri->bits_per_channel == 16) { + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y); + } else { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + } + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + if((value > 214748364) || (value == 214748364 && *c > '7')) + return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + if(*x == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + if (*y == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + if (maxv > 65535) + return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); + else if (maxv > 255) + return 16; + else + return 8; +} + +static int stbi__pnm_is16(stbi__context *s) +{ + if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) + return 1; + return 0; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +static int stbi__is_16_main(stbi__context *s) +{ + #ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_is16(s)) return 1; + #endif + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/ktx/external/astc-encoder/Source/ThirdParty/stb_image_write.h b/ktx/external/astc-encoder/Source/ThirdParty/stb_image_write.h new file mode 100644 index 0000000..e4b32ed --- /dev/null +++ b/ktx/external/astc-encoder/Source/ThirdParty/stb_image_write.h @@ -0,0 +1,1724 @@ +/* stb_image_write - v1.16 - public domain - http://nothings.org/stb + writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015 + no warranty implied; use at your own risk + + Before #including, + + #define STB_IMAGE_WRITE_IMPLEMENTATION + + in the file that you want to have the implementation. + + Will probably not work correctly with strict-aliasing optimizations. + +ABOUT: + + This header file is a library for writing images to C stdio or a callback. + + The PNG output is not optimal; it is 20-50% larger than the file + written by a decent optimizing implementation; though providing a custom + zlib compress function (see STBIW_ZLIB_COMPRESS) can mitigate that. + This library is designed for source code compactness and simplicity, + not optimal image file size or run-time performance. + +BUILDING: + + You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h. + You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace + malloc,realloc,free. + You can #define STBIW_MEMMOVE() to replace memmove() + You can #define STBIW_ZLIB_COMPRESS to use a custom zlib-style compress function + for PNG compression (instead of the builtin one), it must have the following signature: + unsigned char * my_compress(unsigned char *data, int data_len, int *out_len, int quality); + The returned data will be freed with STBIW_FREE() (free() by default), + so it must be heap allocated with STBIW_MALLOC() (malloc() by default), + +UNICODE: + + If compiling for Windows and you wish to use Unicode filenames, compile + with + #define STBIW_WINDOWS_UTF8 + and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert + Windows wchar_t filenames to utf8. + +USAGE: + + There are five functions, one for each image file format: + + int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_jpg(char const *filename, int w, int h, int comp, const void *data, int quality); + int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); + + void stbi_flip_vertically_on_write(int flag); // flag is non-zero to flip data vertically + + There are also five equivalent functions that use an arbitrary write function. You are + expected to open/close your file-equivalent before and after calling these: + + int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); + int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + + where the callback is: + void stbi_write_func(void *context, void *data, int size); + + You can configure it with these global variables: + int stbi_write_tga_with_rle; // defaults to true; set to 0 to disable RLE + int stbi_write_png_compression_level; // defaults to 8; set to higher for more compression + int stbi_write_force_png_filter; // defaults to -1; set to 0..5 to force a filter mode + + + You can define STBI_WRITE_NO_STDIO to disable the file variant of these + functions, so the library will not use stdio.h at all. However, this will + also disable HDR writing, because it requires stdio for formatted output. + + Each function returns 0 on failure and non-0 on success. + + The functions create an image file defined by the parameters. The image + is a rectangle of pixels stored from left-to-right, top-to-bottom. + Each pixel contains 'comp' channels of data stored interleaved with 8-bits + per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is + monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall. + The *data pointer points to the first byte of the top-left-most pixel. + For PNG, "stride_in_bytes" is the distance in bytes from the first byte of + a row of pixels to the first byte of the next row of pixels. + + PNG creates output files with the same number of components as the input. + The BMP format expands Y to RGB in the file format and does not + output alpha. + + PNG supports writing rectangles of data even when the bytes storing rows of + data are not consecutive in memory (e.g. sub-rectangles of a larger image), + by supplying the stride between the beginning of adjacent rows. The other + formats do not. (Thus you cannot write a native-format BMP through the BMP + writer, both because it is in BGR order and because it may have padding + at the end of the line.) + + PNG allows you to set the deflate compression level by setting the global + variable 'stbi_write_png_compression_level' (it defaults to 8). + + HDR expects linear float data. Since the format is always 32-bit rgb(e) + data, alpha (if provided) is discarded, and for monochrome data it is + replicated across all three channels. + + TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed + data, set the global variable 'stbi_write_tga_with_rle' to 0. + + JPEG does ignore alpha channels in input data; quality is between 1 and 100. + Higher quality looks better but results in a bigger image. + JPEG baseline (no JPEG progressive). + +CREDITS: + + + Sean Barrett - PNG/BMP/TGA + Baldur Karlsson - HDR + Jean-Sebastien Guay - TGA monochrome + Tim Kelsey - misc enhancements + Alan Hickman - TGA RLE + Emmanuel Julien - initial file IO callback implementation + Jon Olick - original jo_jpeg.cpp code + Daniel Gibson - integrate JPEG, allow external zlib + Aarni Koskela - allow choosing PNG filter + + bugfixes: + github:Chribba + Guillaume Chereau + github:jry2 + github:romigrou + Sergio Gonzalez + Jonas Karlsson + Filip Wasil + Thatcher Ulrich + github:poppolopoppo + Patrick Boettcher + github:xeekworx + Cap Petschulat + Simon Rodriguez + Ivan Tikhonov + github:ignotion + Adam Schackart + Andrew Kensler + +LICENSE + + See end of file for license information. + +*/ + +#ifndef INCLUDE_STB_IMAGE_WRITE_H +#define INCLUDE_STB_IMAGE_WRITE_H + +#include + +// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline' +#ifndef STBIWDEF +#ifdef STB_IMAGE_WRITE_STATIC +#define STBIWDEF static +#else +#ifdef __cplusplus +#define STBIWDEF extern "C" +#else +#define STBIWDEF extern +#endif +#endif +#endif + +#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations +STBIWDEF int stbi_write_tga_with_rle; +STBIWDEF int stbi_write_png_compression_level; +STBIWDEF int stbi_write_force_png_filter; +#endif + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); + +#ifdef STBIW_WINDOWS_UTF8 +STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif +#endif + +typedef void stbi_write_func(void *context, void *data, int size); + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + +STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean); + +#endif//INCLUDE_STB_IMAGE_WRITE_H + +#ifdef STB_IMAGE_WRITE_IMPLEMENTATION + +#ifdef _WIN32 + #ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS + #endif + #ifndef _CRT_NONSTDC_NO_DEPRECATE + #define _CRT_NONSTDC_NO_DEPRECATE + #endif +#endif + +#ifndef STBI_WRITE_NO_STDIO +#include +#endif // STBI_WRITE_NO_STDIO + +#include +#include +#include +#include + +#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED)) +// ok +#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)." +#endif + +#ifndef STBIW_MALLOC +#define STBIW_MALLOC(sz) malloc(sz) +#define STBIW_REALLOC(p,newsz) realloc(p,newsz) +#define STBIW_FREE(p) free(p) +#endif + +#ifndef STBIW_REALLOC_SIZED +#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) +#endif + + +#ifndef STBIW_MEMMOVE +#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz) +#endif + + +#ifndef STBIW_ASSERT +#include +#define STBIW_ASSERT(x) assert(x) +#endif + +#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) + +#ifdef STB_IMAGE_WRITE_STATIC +static int stbi_write_png_compression_level = 8; +static int stbi_write_tga_with_rle = 1; +static int stbi_write_force_png_filter = -1; +#else +int stbi_write_png_compression_level = 8; +int stbi_write_tga_with_rle = 1; +int stbi_write_force_png_filter = -1; +#endif + +static int stbi__flip_vertically_on_write = 0; + +STBIWDEF void stbi_flip_vertically_on_write(int flag) +{ + stbi__flip_vertically_on_write = flag; +} + +typedef struct +{ + stbi_write_func *func; + void *context; + unsigned char buffer[64]; + int buf_used; +} stbi__write_context; + +// initialize a callback-based context +static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context) +{ + s->func = c; + s->context = context; +} + +#ifndef STBI_WRITE_NO_STDIO + +static void stbi__stdio_write(void *context, void *data, int size) +{ + fwrite(data,1,size,(FILE*) context); +} + +#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8) +#ifdef __cplusplus +#define STBIW_EXTERN extern "C" +#else +#define STBIW_EXTERN extern +#endif +STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBIW_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); + +STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbiw__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + +static int stbi__start_write_file(stbi__write_context *s, const char *filename) +{ + FILE *f = stbiw__fopen(filename, "wb"); + stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); + return f != NULL; +} + +static void stbi__end_write_file(stbi__write_context *s) +{ + fclose((FILE *)s->context); +} + +#endif // !STBI_WRITE_NO_STDIO + +typedef unsigned int stbiw_uint32; +typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; + +static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v) +{ + while (*fmt) { + switch (*fmt++) { + case ' ': break; + case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int)); + s->func(s->context,&x,1); + break; } + case '2': { int x = va_arg(v,int); + unsigned char b[2]; + b[0] = STBIW_UCHAR(x); + b[1] = STBIW_UCHAR(x>>8); + s->func(s->context,b,2); + break; } + case '4': { stbiw_uint32 x = va_arg(v,int); + unsigned char b[4]; + b[0]=STBIW_UCHAR(x); + b[1]=STBIW_UCHAR(x>>8); + b[2]=STBIW_UCHAR(x>>16); + b[3]=STBIW_UCHAR(x>>24); + s->func(s->context,b,4); + break; } + default: + STBIW_ASSERT(0); + return; + } + } +} + +static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) +{ + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); +} + +static void stbiw__write_flush(stbi__write_context *s) +{ + if (s->buf_used) { + s->func(s->context, &s->buffer, s->buf_used); + s->buf_used = 0; + } +} + +static void stbiw__putc(stbi__write_context *s, unsigned char c) +{ + s->func(s->context, &c, 1); +} + +static void stbiw__write1(stbi__write_context *s, unsigned char a) +{ + if ((size_t)s->buf_used + 1 > sizeof(s->buffer)) + stbiw__write_flush(s); + s->buffer[s->buf_used++] = a; +} + +static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) +{ + int n; + if ((size_t)s->buf_used + 3 > sizeof(s->buffer)) + stbiw__write_flush(s); + n = s->buf_used; + s->buf_used = n+3; + s->buffer[n+0] = a; + s->buffer[n+1] = b; + s->buffer[n+2] = c; +} + +static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) +{ + unsigned char bg[3] = { 255, 0, 255}, px[3]; + int k; + + if (write_alpha < 0) + stbiw__write1(s, d[comp - 1]); + + switch (comp) { + case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case + case 1: + if (expand_mono) + stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp + else + stbiw__write1(s, d[0]); // monochrome TGA + break; + case 4: + if (!write_alpha) { + // composite against pink background + for (k = 0; k < 3; ++k) + px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255; + stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]); + break; + } + /* FALLTHROUGH */ + case 3: + stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]); + break; + } + if (write_alpha > 0) + stbiw__write1(s, d[comp - 1]); +} + +static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) +{ + stbiw_uint32 zero = 0; + int i,j, j_end; + + if (y <= 0) + return; + + if (stbi__flip_vertically_on_write) + vdir *= -1; + + if (vdir < 0) { + j_end = -1; j = y-1; + } else { + j_end = y; j = 0; + } + + for (; j != j_end; j += vdir) { + for (i=0; i < x; ++i) { + unsigned char *d = (unsigned char *) data + (j*x+i)*comp; + stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); + } + stbiw__write_flush(s); + s->func(s->context, &zero, scanline_pad); + } +} + +static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) +{ + if (y < 0 || x < 0) { + return 0; + } else { + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); + stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono); + return 1; + } +} + +static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) +{ + if (comp != 4) { + // write RGB bitmap + int pad = (-x*3) & 3; + return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, + "11 4 22 4" "4 44 22 444444", + 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header + 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header + } else { + // RGBA bitmaps need a v4 header + // use BI_BITFIELDS mode with 32bpp and alpha mask + // (straight BI_RGB with alpha mask doesn't work in most readers) + return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *)data,1,0, + "11 4 22 4" "4 44 22 444444 4444 4 444 444 444 444", + 'B', 'M', 14+108+x*y*4, 0, 0, 14+108, // file header + 108, x,y, 1,32, 3,0,0,0,0,0, 0xff0000,0xff00,0xff,0xff000000u, 0, 0,0,0, 0,0,0, 0,0,0, 0,0,0); // bitmap V4 header + } +} + +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_bmp_core(&s, x, y, comp, data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_bmp_core(&s, x, y, comp, data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif //!STBI_WRITE_NO_STDIO + +static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data) +{ + int has_alpha = (comp == 2 || comp == 4); + int colorbytes = has_alpha ? comp-1 : comp; + int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3 + + if (y < 0 || x < 0) + return 0; + + if (!stbi_write_tga_with_rle) { + return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0, + "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8); + } else { + int i,j,k; + int jend, jdir; + + stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8); + + if (stbi__flip_vertically_on_write) { + j = 0; + jend = y; + jdir = 1; + } else { + j = y-1; + jend = -1; + jdir = -1; + } + for (; j != jend; j += jdir) { + unsigned char *row = (unsigned char *) data + j * x * comp; + int len; + + for (i = 0; i < x; i += len) { + unsigned char *begin = row + i * comp; + int diff = 1; + len = 1; + + if (i < x - 1) { + ++len; + diff = memcmp(begin, row + (i + 1) * comp, comp); + if (diff) { + const unsigned char *prev = begin; + for (k = i + 2; k < x && len < 128; ++k) { + if (memcmp(prev, row + k * comp, comp)) { + prev += comp; + ++len; + } else { + --len; + break; + } + } + } else { + for (k = i + 2; k < x && len < 128; ++k) { + if (!memcmp(begin, row + k * comp, comp)) { + ++len; + } else { + break; + } + } + } + } + + if (diff) { + unsigned char header = STBIW_UCHAR(len - 1); + stbiw__write1(s, header); + for (k = 0; k < len; ++k) { + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); + } + } else { + unsigned char header = STBIW_UCHAR(len - 129); + stbiw__write1(s, header); + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); + } + } + } + stbiw__write_flush(s); + } + return 1; +} + +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_tga_core(&s, x, y, comp, (void *) data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR writer +// by Baldur Karlsson + +#define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) + +#ifndef STBI_WRITE_NO_STDIO + +static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) +{ + int exponent; + float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); + + if (maxcomp < 1e-32f) { + rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; + } else { + float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; + + rgbe[0] = (unsigned char)(linear[0] * normalize); + rgbe[1] = (unsigned char)(linear[1] * normalize); + rgbe[2] = (unsigned char)(linear[2] * normalize); + rgbe[3] = (unsigned char)(exponent + 128); + } +} + +static void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) +{ + unsigned char lengthbyte = STBIW_UCHAR(length+128); + STBIW_ASSERT(length+128 <= 255); + s->func(s->context, &lengthbyte, 1); + s->func(s->context, &databyte, 1); +} + +static void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) +{ + unsigned char lengthbyte = STBIW_UCHAR(length); + STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code + s->func(s->context, &lengthbyte, 1); + s->func(s->context, data, length); +} + +static void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) +{ + unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; + unsigned char rgbe[4]; + float linear[3]; + int x; + + scanlineheader[2] = (width&0xff00)>>8; + scanlineheader[3] = (width&0x00ff); + + /* skip RLE for images too small or large */ + if (width < 8 || width >= 32768) { + for (x=0; x < width; x++) { + switch (ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + s->func(s->context, rgbe, 4); + } + } else { + int c,r; + /* encode into scratch buffer */ + for (x=0; x < width; x++) { + switch(ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + scratch[x + width*0] = rgbe[0]; + scratch[x + width*1] = rgbe[1]; + scratch[x + width*2] = rgbe[2]; + scratch[x + width*3] = rgbe[3]; + } + + s->func(s->context, scanlineheader, 4); + + /* RLE each component separately */ + for (c=0; c < 4; c++) { + unsigned char *comp = &scratch[width*c]; + + x = 0; + while (x < width) { + // find first run + r = x; + while (r+2 < width) { + if (comp[r] == comp[r+1] && comp[r] == comp[r+2]) + break; + ++r; + } + if (r+2 >= width) + r = width; + // dump up to first run + while (x < r) { + int len = r-x; + if (len > 128) len = 128; + stbiw__write_dump_data(s, len, &comp[x]); + x += len; + } + // if there's a run, output it + if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd + // find next byte after run + while (r < width && comp[r] == comp[x]) + ++r; + // output run up to r + while (x < r) { + int len = r-x; + if (len > 127) len = 127; + stbiw__write_run_data(s, len, comp[x]); + x += len; + } + } + } + } + } +} + +static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data) +{ + if (y <= 0 || x <= 0 || data == NULL) + return 0; + else { + // Each component is stored separately. Allocate scratch space for full output scanline. + unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4); + int i, len; + char buffer[128]; + char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; + s->func(s->context, header, sizeof(header)-1); + +#ifdef __STDC_LIB_EXT1__ + len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#else + len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#endif + s->func(s->context, buffer, len); + + for(i=0; i < y; i++) + stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)); + STBIW_FREE(scratch); + return 1; + } +} + +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_hdr_core(&s, x, y, comp, (float *) data); +} + +STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif // STBI_WRITE_NO_STDIO + + +////////////////////////////////////////////////////////////////////////////// +// +// PNG writer +// + +#ifndef STBIW_ZLIB_COMPRESS +// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() +#define stbiw__sbraw(a) ((int *) (void *) (a) - 2) +#define stbiw__sbm(a) stbiw__sbraw(a)[0] +#define stbiw__sbn(a) stbiw__sbraw(a)[1] + +#define stbiw__sbneedgrow(a,n) ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a)) +#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0) +#define stbiw__sbgrow(a,n) stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a))) + +#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v)) +#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0) +#define stbiw__sbfree(a) ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0) + +static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) +{ + int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1; + void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); + STBIW_ASSERT(p); + if (p) { + if (!*arr) ((int *) p)[1] = 0; + *arr = (void *) ((int *) p + 2); + stbiw__sbm(*arr) = m; + } + return *arr; +} + +static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) +{ + while (*bitcount >= 8) { + stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer)); + *bitbuffer >>= 8; + *bitcount -= 8; + } + return data; +} + +static int stbiw__zlib_bitrev(int code, int codebits) +{ + int res=0; + while (codebits--) { + res = (res << 1) | (code & 1); + code >>= 1; + } + return res; +} + +static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit) +{ + int i; + for (i=0; i < limit && i < 258; ++i) + if (a[i] != b[i]) break; + return i; +} + +static unsigned int stbiw__zhash(unsigned char *data) +{ + stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + return hash; +} + +#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount)) +#define stbiw__zlib_add(code,codebits) \ + (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush()) +#define stbiw__zlib_huffa(b,c) stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c) +// default huffman tables +#define stbiw__zlib_huff1(n) stbiw__zlib_huffa(0x30 + (n), 8) +#define stbiw__zlib_huff2(n) stbiw__zlib_huffa(0x190 + (n)-144, 9) +#define stbiw__zlib_huff3(n) stbiw__zlib_huffa(0 + (n)-256,7) +#define stbiw__zlib_huff4(n) stbiw__zlib_huffa(0xc0 + (n)-280,8) +#define stbiw__zlib_huff(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n)) +#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n)) + +#define stbiw__ZHASH 16384 + +#endif // STBIW_ZLIB_COMPRESS + +STBIWDEF unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) +{ +#ifdef STBIW_ZLIB_COMPRESS + // user provided a zlib compress implementation, use that + return STBIW_ZLIB_COMPRESS(data, data_len, out_len, quality); +#else // use builtin + static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; + static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; + static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; + static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; + unsigned int bitbuf=0; + int i,j, bitcount=0; + unsigned char *out = NULL; + unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(unsigned char**)); + if (hash_table == NULL) + return NULL; + if (quality < 5) quality = 5; + + stbiw__sbpush(out, 0x78); // DEFLATE 32K window + stbiw__sbpush(out, 0x5e); // FLEVEL = 1 + stbiw__zlib_add(1,1); // BFINAL = 1 + stbiw__zlib_add(1,2); // BTYPE = 1 -- fixed huffman + + for (i=0; i < stbiw__ZHASH; ++i) + hash_table[i] = NULL; + + i=0; + while (i < data_len-3) { + // hash next 3 bytes of data to be compressed + int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3; + unsigned char *bestloc = 0; + unsigned char **hlist = hash_table[h]; + int n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32768) { // if entry lies within window + int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i); + if (d >= best) { best=d; bestloc=hlist[j]; } + } + } + // when hash table entry is too long, delete half the entries + if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) { + STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); + stbiw__sbn(hash_table[h]) = quality; + } + stbiw__sbpush(hash_table[h],data+i); + + if (bestloc) { + // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal + h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1); + hlist = hash_table[h]; + n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32767) { + int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1); + if (e > best) { // if next match is better, bail on current match + bestloc = NULL; + break; + } + } + } + } + + if (bestloc) { + int d = (int) (data+i - bestloc); // distance back + STBIW_ASSERT(d <= 32767 && best <= 258); + for (j=0; best > lengthc[j+1]-1; ++j); + stbiw__zlib_huff(j+257); + if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]); + for (j=0; d > distc[j+1]-1; ++j); + stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5); + if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]); + i += best; + } else { + stbiw__zlib_huffb(data[i]); + ++i; + } + } + // write out final bytes + for (;i < data_len; ++i) + stbiw__zlib_huffb(data[i]); + stbiw__zlib_huff(256); // end of block + // pad with 0 bits to byte boundary + while (bitcount) + stbiw__zlib_add(0,1); + + for (i=0; i < stbiw__ZHASH; ++i) + (void) stbiw__sbfree(hash_table[i]); + STBIW_FREE(hash_table); + + // store uncompressed instead if compression was worse + if (stbiw__sbn(out) > data_len + 2 + ((data_len+32766)/32767)*5) { + stbiw__sbn(out) = 2; // truncate to DEFLATE 32K window and FLEVEL = 1 + for (j = 0; j < data_len;) { + int blocklen = data_len - j; + if (blocklen > 32767) blocklen = 32767; + stbiw__sbpush(out, data_len - j == blocklen); // BFINAL = ?, BTYPE = 0 -- no compression + stbiw__sbpush(out, STBIW_UCHAR(blocklen)); // LEN + stbiw__sbpush(out, STBIW_UCHAR(blocklen >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(~blocklen)); // NLEN + stbiw__sbpush(out, STBIW_UCHAR(~blocklen >> 8)); + memcpy(out+stbiw__sbn(out), data+j, blocklen); + stbiw__sbn(out) += blocklen; + j += blocklen; + } + } + + { + // compute adler32 on input + unsigned int s1=1, s2=0; + int blocklen = (int) (data_len % 5552); + j=0; + while (j < data_len) { + for (i=0; i < blocklen; ++i) { s1 += data[j+i]; s2 += s1; } + s1 %= 65521; s2 %= 65521; + j += blocklen; + blocklen = 5552; + } + stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s2)); + stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s1)); + } + *out_len = stbiw__sbn(out); + // make returned pointer freeable + STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len); + return (unsigned char *) stbiw__sbraw(out); +#endif // STBIW_ZLIB_COMPRESS +} + +static unsigned int stbiw__crc32(unsigned char *buffer, int len) +{ +#ifdef STBIW_CRC32 + return STBIW_CRC32(buffer, len); +#else + static unsigned int crc_table[256] = + { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D + }; + + unsigned int crc = ~0u; + int i; + for (i=0; i < len; ++i) + crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; + return ~crc; +#endif +} + +#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) +#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); +#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) + +static void stbiw__wpcrc(unsigned char **data, int len) +{ + unsigned int crc = stbiw__crc32(*data - len - 4, len+4); + stbiw__wp32(*data, crc); +} + +static unsigned char stbiw__paeth(int a, int b, int c) +{ + int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); + if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); + if (pb <= pc) return STBIW_UCHAR(b); + return STBIW_UCHAR(c); +} + +// @OPTIMIZE: provide an option that always forces left-predict or paeth predict +static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) +{ + static int mapping[] = { 0,1,2,3,4 }; + static int firstmap[] = { 0,1,0,5,6 }; + int *mymap = (y != 0) ? mapping : firstmap; + int i; + int type = mymap[filter_type]; + unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); + int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; + + if (type==0) { + memcpy(line_buffer, z, width*n); + return; + } + + // first loop isn't optimized since it's just one pixel + for (i = 0; i < n; ++i) { + switch (type) { + case 1: line_buffer[i] = z[i]; break; + case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; + case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break; + case 5: line_buffer[i] = z[i]; break; + case 6: line_buffer[i] = z[i]; break; + } + } + switch (type) { + case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break; + case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; + case 4: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; + case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break; + case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; + } +} + +STBIWDEF unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) +{ + int force_filter = stbi_write_force_png_filter; + int ctype[5] = { -1, 0, 4, 2, 6 }; + unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; + unsigned char *out,*o, *filt, *zlib; + signed char *line_buffer; + int j,zlen; + + if (stride_bytes == 0) + stride_bytes = x * n; + + if (force_filter >= 5) { + force_filter = -1; + } + + filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; + line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } + for (j=0; j < y; ++j) { + int filter_type; + if (force_filter > -1) { + filter_type = force_filter; + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer); + } else { // Estimate the best filter by running through all of them: + int best_filter = 0, best_filter_val = 0x7fffffff, est, i; + for (filter_type = 0; filter_type < 5; filter_type++) { + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer); + + // Estimate the entropy of the line using this filter; the less, the better. + est = 0; + for (i = 0; i < x*n; ++i) { + est += abs((signed char) line_buffer[i]); + } + if (est < best_filter_val) { + best_filter_val = est; + best_filter = filter_type; + } + } + if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer); + filter_type = best_filter; + } + } + // when we get here, filter_type contains the filter type, and line_buffer contains the data + filt[j*(x*n+1)] = (unsigned char) filter_type; + STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); + } + STBIW_FREE(line_buffer); + zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, stbi_write_png_compression_level); + STBIW_FREE(filt); + if (!zlib) return 0; + + // each tag requires 12 bytes of overhead + out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12); + if (!out) return 0; + *out_len = 8 + 12+13 + 12+zlen + 12; + + o=out; + STBIW_MEMMOVE(o,sig,8); o+= 8; + stbiw__wp32(o, 13); // header length + stbiw__wptag(o, "IHDR"); + stbiw__wp32(o, x); + stbiw__wp32(o, y); + *o++ = 8; + *o++ = STBIW_UCHAR(ctype[n]); + *o++ = 0; + *o++ = 0; + *o++ = 0; + stbiw__wpcrc(&o,13); + + stbiw__wp32(o, zlen); + stbiw__wptag(o, "IDAT"); + STBIW_MEMMOVE(o, zlib, zlen); + o += zlen; + STBIW_FREE(zlib); + stbiw__wpcrc(&o, zlen); + + stbiw__wp32(o,0); + stbiw__wptag(o, "IEND"); + stbiw__wpcrc(&o,0); + + STBIW_ASSERT(o == out + *out_len); + + return out; +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) +{ + FILE *f; + int len; + unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + + f = stbiw__fopen(filename, "wb"); + if (!f) { STBIW_FREE(png); return 0; } + fwrite(png, 1, len, f); + fclose(f); + STBIW_FREE(png); + return 1; +} +#endif + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) +{ + int len; + unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + func(context, png, len); + STBIW_FREE(png); + return 1; +} + + +/* *************************************************************************** + * + * JPEG writer + * + * This is based on Jon Olick's jo_jpeg.cpp: + * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html + */ + +static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18, + 24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 }; + +static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) { + int bitBuf = *bitBufP, bitCnt = *bitCntP; + bitCnt += bs[1]; + bitBuf |= bs[0] << (24 - bitCnt); + while(bitCnt >= 8) { + unsigned char c = (bitBuf >> 16) & 255; + stbiw__putc(s, c); + if(c == 255) { + stbiw__putc(s, 0); + } + bitBuf <<= 8; + bitCnt -= 8; + } + *bitBufP = bitBuf; + *bitCntP = bitCnt; +} + +static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) { + float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p; + float z1, z2, z3, z4, z5, z11, z13; + + float tmp0 = d0 + d7; + float tmp7 = d0 - d7; + float tmp1 = d1 + d6; + float tmp6 = d1 - d6; + float tmp2 = d2 + d5; + float tmp5 = d2 - d5; + float tmp3 = d3 + d4; + float tmp4 = d3 - d4; + + // Even part + float tmp10 = tmp0 + tmp3; // phase 2 + float tmp13 = tmp0 - tmp3; + float tmp11 = tmp1 + tmp2; + float tmp12 = tmp1 - tmp2; + + d0 = tmp10 + tmp11; // phase 3 + d4 = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * 0.707106781f; // c4 + d2 = tmp13 + z1; // phase 5 + d6 = tmp13 - z1; + + // Odd part + tmp10 = tmp4 + tmp5; // phase 2 + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + // The rotator is modified from fig 4-8 to avoid extra negations. + z5 = (tmp10 - tmp12) * 0.382683433f; // c6 + z2 = tmp10 * 0.541196100f + z5; // c2-c6 + z4 = tmp12 * 1.306562965f + z5; // c2+c6 + z3 = tmp11 * 0.707106781f; // c4 + + z11 = tmp7 + z3; // phase 5 + z13 = tmp7 - z3; + + *d5p = z13 + z2; // phase 6 + *d3p = z13 - z2; + *d1p = z11 + z4; + *d7p = z11 - z4; + + *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6; +} + +static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { + int tmp1 = val < 0 ? -val : val; + val = val < 0 ? val-1 : val; + bits[1] = 1; + while(tmp1 >>= 1) { + ++bits[1]; + } + bits[0] = val & ((1<0)&&(DU[end0pos]==0); --end0pos) { + } + // end0pos = first element in reverse order !=0 + if(end0pos == 0) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + return DU[0]; + } + for(i = 1; i <= end0pos; ++i) { + int startpos = i; + int nrzeroes; + unsigned short bits[2]; + for (; DU[i]==0 && i<=end0pos; ++i) { + } + nrzeroes = i-startpos; + if ( nrzeroes >= 16 ) { + int lng = nrzeroes>>4; + int nrmarker; + for (nrmarker=1; nrmarker <= lng; ++nrmarker) + stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes); + nrzeroes &= 15; + } + stbiw__jpg_calcBits(DU[i], bits); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits); + } + if(end0pos != 63) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + } + return DU[0]; +} + +static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) { + // Constants that don't pollute global namespace + static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0}; + static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d}; + static const unsigned char std_ac_luminance_values[] = { + 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, + 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, + 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, + 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, + 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, + 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, + 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; + static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77}; + static const unsigned char std_ac_chrominance_values[] = { + 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, + 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, + 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, + 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, + 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + // Huffman tables + static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}}; + static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}}; + static const unsigned short YAC_HT[256][2] = { + {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const unsigned short UVAC_HT[256][2] = { + {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22, + 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; + static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}; + static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, + 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f }; + + int row, col, i, k, subsample; + float fdtbl_Y[64], fdtbl_UV[64]; + unsigned char YTable[64], UVTable[64]; + + if(!data || !width || !height || comp > 4 || comp < 1) { + return 0; + } + + quality = quality ? quality : 90; + subsample = quality <= 90 ? 1 : 0; + quality = quality < 1 ? 1 : quality > 100 ? 100 : quality; + quality = quality < 50 ? 5000 / quality : 200 - quality * 2; + + for(i = 0; i < 64; ++i) { + int uvti, yti = (YQT[i]*quality+50)/100; + YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti); + uvti = (UVQT[i]*quality+50)/100; + UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti); + } + + for(row = 0, k = 0; row < 8; ++row) { + for(col = 0; col < 8; ++col, ++k) { + fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + } + } + + // Write Headers + { + static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; + static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; + const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), + 3,1,(unsigned char)(subsample?0x22:0x11),0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; + s->func(s->context, (void*)head0, sizeof(head0)); + s->func(s->context, (void*)YTable, sizeof(YTable)); + stbiw__putc(s, 1); + s->func(s->context, UVTable, sizeof(UVTable)); + s->func(s->context, (void*)head1, sizeof(head1)); + s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1); + s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values)); + stbiw__putc(s, 0x10); // HTYACinfo + s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1); + s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values)); + stbiw__putc(s, 1); // HTUDCinfo + s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values)); + stbiw__putc(s, 0x11); // HTUACinfo + s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values)); + s->func(s->context, (void*)head2, sizeof(head2)); + } + + // Encode 8x8 macroblocks + { + static const unsigned short fillBits[] = {0x7F, 7}; + int DCY=0, DCU=0, DCV=0; + int bitBuf=0, bitCnt=0; + // comp == 2 is grey+alpha (alpha is ignored) + int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; + const unsigned char *dataR = (const unsigned char *)data; + const unsigned char *dataG = dataR + ofsG; + const unsigned char *dataB = dataR + ofsB; + int x, y, pos; + if(subsample) { + for(y = 0; y < height; y += 16) { + for(x = 0; x < width; x += 16) { + float Y[256], U[256], V[256]; + for(row = y, pos = 0; row < y+16; ++row) { + // row >= height => use last input row + int clamped_row = (row < height) ? row : height - 1; + int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; + for(col = x; col < x+16; ++col, ++pos) { + // if col >= width => use pixel from last input column + int p = base_p + ((col < width) ? col : (width-1))*comp; + float r = dataR[p], g = dataG[p], b = dataB[p]; + Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; + U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; + V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; + } + } + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+0, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+8, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+128, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+136, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + + // subsample U,V + { + float subU[64], subV[64]; + int yy, xx; + for(yy = 0, pos = 0; yy < 8; ++yy) { + for(xx = 0; xx < 8; ++xx, ++pos) { + int j = yy*32+xx*2; + subU[pos] = (U[j+0] + U[j+1] + U[j+16] + U[j+17]) * 0.25f; + subV[pos] = (V[j+0] + V[j+1] + V[j+16] + V[j+17]) * 0.25f; + } + } + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subU, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subV, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + } + } else { + for(y = 0; y < height; y += 8) { + for(x = 0; x < width; x += 8) { + float Y[64], U[64], V[64]; + for(row = y, pos = 0; row < y+8; ++row) { + // row >= height => use last input row + int clamped_row = (row < height) ? row : height - 1; + int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; + for(col = x; col < x+8; ++col, ++pos) { + // if col >= width => use pixel from last input column + int p = base_p + ((col < width) ? col : (width-1))*comp; + float r = dataR[p], g = dataG[p], b = dataB[p]; + Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; + U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; + V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; + } + } + + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y, 8, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, U, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, V, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + } + + // Do the bit alignment of the EOI marker + stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits); + } + + // EOI + stbiw__putc(s, 0xFF); + stbiw__putc(s, 0xD9); + + return 1; +} + +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); +} + + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +#endif // STB_IMAGE_WRITE_IMPLEMENTATION + +/* Revision history + 1.16 (2021-07-11) + make Deflate code emit uncompressed blocks when it would otherwise expand + support writing BMPs with alpha channel + 1.15 (2020-07-13) unknown + 1.14 (2020-02-02) updated JPEG writer to downsample chroma channels + 1.13 + 1.12 + 1.11 (2019-08-11) + + 1.10 (2019-02-07) + support utf8 filenames in Windows; fix warnings and platform ifdefs + 1.09 (2018-02-11) + fix typo in zlib quality API, improve STB_I_W_STATIC in C++ + 1.08 (2018-01-29) + add stbi__flip_vertically_on_write, external zlib, zlib quality, choose PNG filter + 1.07 (2017-07-24) + doc fix + 1.06 (2017-07-23) + writing JPEG (using Jon Olick's code) + 1.05 ??? + 1.04 (2017-03-03) + monochrome BMP expansion + 1.03 ??? + 1.02 (2016-04-02) + avoid allocating large structures on the stack + 1.01 (2016-01-16) + STBIW_REALLOC_SIZED: support allocators with no realloc support + avoid race-condition in crc initialization + minor compile issues + 1.00 (2015-09-14) + installable file IO function + 0.99 (2015-09-13) + warning fixes; TGA rle support + 0.98 (2015-04-08) + added STBIW_MALLOC, STBIW_ASSERT etc + 0.97 (2015-01-18) + fixed HDR asserts, rewrote HDR rle logic + 0.96 (2015-01-17) + add HDR output + fix monochrome BMP + 0.95 (2014-08-17) + add monochrome TGA output + 0.94 (2014-05-31) + rename private functions to avoid conflicts with stb_image.h + 0.93 (2014-05-27) + warning fixes + 0.92 (2010-08-01) + casts to unsigned char to fix warnings + 0.91 (2010-07-17) + first public release + 0.90 first internal release +*/ + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/ktx/external/astc-encoder/Source/ThirdParty/tinyexr.h b/ktx/external/astc-encoder/Source/ThirdParty/tinyexr.h new file mode 100644 index 0000000..6d14d48 --- /dev/null +++ b/ktx/external/astc-encoder/Source/ThirdParty/tinyexr.h @@ -0,0 +1,13581 @@ +/* +Copyright (c) 2014 - 2019, Syoyo Fujita and many contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Syoyo Fujita nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +// TinyEXR contains some OpenEXR code, which is licensed under ------------ + +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +// End of OpenEXR license ------------------------------------------------- + +#ifndef TINYEXR_H_ +#define TINYEXR_H_ + +// +// +// Do this: +// #define TINYEXR_IMPLEMENTATION +// before you include this file in *one* C or C++ file to create the +// implementation. +// +// // i.e. it should look like this: +// #include ... +// #include ... +// #include ... +// #define TINYEXR_IMPLEMENTATION +// #include "tinyexr.h" +// +// + +#include // for size_t +#include // guess stdint.h is available(C99) + +#ifdef __cplusplus +extern "C" { +#endif + +// Use embedded miniz or not to decode ZIP format pixel. Linking with zlib +// required if this flas is 0. +#ifndef TINYEXR_USE_MINIZ +#define TINYEXR_USE_MINIZ (1) +#endif + +// Disable PIZ comporession when applying cpplint. +#ifndef TINYEXR_USE_PIZ +#define TINYEXR_USE_PIZ (1) +#endif + +#ifndef TINYEXR_USE_ZFP +#define TINYEXR_USE_ZFP (0) // TinyEXR extension. +// http://computation.llnl.gov/projects/floating-point-compression +#endif + +#ifndef TINYEXR_USE_THREAD +#define TINYEXR_USE_THREAD (0) // No threaded loading. +// http://computation.llnl.gov/projects/floating-point-compression +#endif + +#ifndef TINYEXR_USE_OPENMP +#ifdef _OPENMP +#define TINYEXR_USE_OPENMP (1) +#else +#define TINYEXR_USE_OPENMP (0) +#endif +#endif + +#define TINYEXR_SUCCESS (0) +#define TINYEXR_ERROR_INVALID_MAGIC_NUMBER (-1) +#define TINYEXR_ERROR_INVALID_EXR_VERSION (-2) +#define TINYEXR_ERROR_INVALID_ARGUMENT (-3) +#define TINYEXR_ERROR_INVALID_DATA (-4) +#define TINYEXR_ERROR_INVALID_FILE (-5) +#define TINYEXR_ERROR_INVALID_PARAMETER (-6) +#define TINYEXR_ERROR_CANT_OPEN_FILE (-7) +#define TINYEXR_ERROR_UNSUPPORTED_FORMAT (-8) +#define TINYEXR_ERROR_INVALID_HEADER (-9) +#define TINYEXR_ERROR_UNSUPPORTED_FEATURE (-10) +#define TINYEXR_ERROR_CANT_WRITE_FILE (-11) +#define TINYEXR_ERROR_SERIALZATION_FAILED (-12) +#define TINYEXR_ERROR_LAYER_NOT_FOUND (-13) + +// @note { OpenEXR file format: http://www.openexr.com/openexrfilelayout.pdf } + +// pixel type: possible values are: UINT = 0 HALF = 1 FLOAT = 2 +#define TINYEXR_PIXELTYPE_UINT (0) +#define TINYEXR_PIXELTYPE_HALF (1) +#define TINYEXR_PIXELTYPE_FLOAT (2) + +#define TINYEXR_MAX_HEADER_ATTRIBUTES (1024) +#define TINYEXR_MAX_CUSTOM_ATTRIBUTES (128) + +#define TINYEXR_COMPRESSIONTYPE_NONE (0) +#define TINYEXR_COMPRESSIONTYPE_RLE (1) +#define TINYEXR_COMPRESSIONTYPE_ZIPS (2) +#define TINYEXR_COMPRESSIONTYPE_ZIP (3) +#define TINYEXR_COMPRESSIONTYPE_PIZ (4) +#define TINYEXR_COMPRESSIONTYPE_ZFP (128) // TinyEXR extension + +#define TINYEXR_ZFP_COMPRESSIONTYPE_RATE (0) +#define TINYEXR_ZFP_COMPRESSIONTYPE_PRECISION (1) +#define TINYEXR_ZFP_COMPRESSIONTYPE_ACCURACY (2) + +#define TINYEXR_TILE_ONE_LEVEL (0) +#define TINYEXR_TILE_MIPMAP_LEVELS (1) +#define TINYEXR_TILE_RIPMAP_LEVELS (2) + +#define TINYEXR_TILE_ROUND_DOWN (0) +#define TINYEXR_TILE_ROUND_UP (1) + +typedef struct _EXRVersion { + int version; // this must be 2 + int tiled; // tile format image + int long_name; // long name attribute + int non_image; // deep image(EXR 2.0) + int multipart; // multi-part(EXR 2.0) +} EXRVersion; + +typedef struct _EXRAttribute { + char name[256]; // name and type are up to 255 chars long. + char type[256]; + unsigned char *value; // uint8_t* + int size; + int pad0; +} EXRAttribute; + +typedef struct _EXRChannelInfo { + char name[256]; // less than 255 bytes long + int pixel_type; + int x_sampling; + int y_sampling; + unsigned char p_linear; + unsigned char pad[3]; +} EXRChannelInfo; + +typedef struct _EXRTile { + int offset_x; + int offset_y; + int level_x; + int level_y; + + int width; // actual width in a tile. + int height; // actual height int a tile. + + unsigned char **images; // image[channels][pixels] +} EXRTile; + +typedef struct _EXRHeader { + float pixel_aspect_ratio; + int line_order; + int data_window[4]; + int display_window[4]; + float screen_window_center[2]; + float screen_window_width; + + int chunk_count; + + // Properties for tiled format(`tiledesc`). + int tiled; + int tile_size_x; + int tile_size_y; + int tile_level_mode; + int tile_rounding_mode; + + int long_name; + int non_image; + int multipart; + unsigned int header_len; + + // Custom attributes(exludes required attributes(e.g. `channels`, + // `compression`, etc) + int num_custom_attributes; + EXRAttribute *custom_attributes; // array of EXRAttribute. size = + // `num_custom_attributes`. + + EXRChannelInfo *channels; // [num_channels] + + int *pixel_types; // Loaded pixel type(TINYEXR_PIXELTYPE_*) of `images` for + // each channel. This is overwritten with `requested_pixel_types` when + // loading. + int num_channels; + + int compression_type; // compression type(TINYEXR_COMPRESSIONTYPE_*) + int *requested_pixel_types; // Filled initially by + // ParseEXRHeaderFrom(Meomory|File), then users + // can edit it(only valid for HALF pixel type + // channel) + +} EXRHeader; + +typedef struct _EXRMultiPartHeader { + int num_headers; + EXRHeader *headers; + +} EXRMultiPartHeader; + +typedef struct _EXRImage { + EXRTile *tiles; // Tiled pixel data. The application must reconstruct image + // from tiles manually. NULL if scanline format. + unsigned char **images; // image[channels][pixels]. NULL if tiled format. + + int width; + int height; + int num_channels; + + // Properties for tile format. + int num_tiles; + +} EXRImage; + +typedef struct _EXRMultiPartImage { + int num_images; + EXRImage *images; + +} EXRMultiPartImage; + +typedef struct _DeepImage { + const char **channel_names; + float ***image; // image[channels][scanlines][samples] + int **offset_table; // offset_table[scanline][offsets] + int num_channels; + int width; + int height; + int pad0; +} DeepImage; + +// @deprecated { For backward compatibility. Not recommended to use. } +// Loads single-frame OpenEXR image. Assume EXR image contains A(single channel +// alpha) or RGB(A) channels. +// Application must free image data as returned by `out_rgba` +// Result image format is: float x RGBA x width x hight +// Returns negative value and may set error string in `err` when there's an +// error +extern int LoadEXR(float **out_rgba, int *width, int *height, + const char *filename, const char **err); + +// Loads single-frame OpenEXR image by specifing layer name. Assume EXR image contains A(single channel +// alpha) or RGB(A) channels. +// Application must free image data as returned by `out_rgba` +// Result image format is: float x RGBA x width x hight +// Returns negative value and may set error string in `err` when there's an +// error +// When the specified layer name is not found in the EXR file, the function will return `TINYEXR_ERROR_LAYER_NOT_FOUND`. +extern int LoadEXRWithLayer(float **out_rgba, int *width, int *height, + const char *filename, const char *layer_name, const char **err); + +// +// Get layer infos from EXR file. +// +// @param[out] layer_names List of layer names. Application must free memory after using this. +// @param[out] num_layers The number of layers +// @param[out] err Error string(wll be filled when the function returns error code). Free it using FreeEXRErrorMessage after using this value. +// +// @return TINYEXR_SUCCEES upon success. +// +extern int EXRLayers(const char *filename, const char **layer_names[], int *num_layers, const char **err); + +// @deprecated { to be removed. } +// Simple wrapper API for ParseEXRHeaderFromFile. +// checking given file is a EXR file(by just look up header) +// @return TINYEXR_SUCCEES for EXR image, TINYEXR_ERROR_INVALID_HEADER for +// others +extern int IsEXR(const char *filename); + +// @deprecated { to be removed. } +// Saves single-frame OpenEXR image. Assume EXR image contains RGB(A) channels. +// components must be 1(Grayscale), 3(RGB) or 4(RGBA). +// Input image format is: `float x width x height`, or `float x RGB(A) x width x +// hight` +// Save image as fp16(HALF) format when `save_as_fp16` is positive non-zero +// value. +// Save image as fp32(FLOAT) format when `save_as_fp16` is 0. +// Use ZIP compression by default. +// Returns negative value and may set error string in `err` when there's an +// error +extern int SaveEXR(const float *data, const int width, const int height, + const int components, const int save_as_fp16, + const char *filename, const char **err); + +// Initialize EXRHeader struct +extern void InitEXRHeader(EXRHeader *exr_header); + +// Initialize EXRImage struct +extern void InitEXRImage(EXRImage *exr_image); + +// Free's internal data of EXRHeader struct +extern int FreeEXRHeader(EXRHeader *exr_header); + +// Free's internal data of EXRImage struct +extern int FreeEXRImage(EXRImage *exr_image); + +// Free's error message +extern void FreeEXRErrorMessage(const char *msg); + +// Parse EXR version header of a file. +extern int ParseEXRVersionFromFile(EXRVersion *version, const char *filename); + +// Parse EXR version header from memory-mapped EXR data. +extern int ParseEXRVersionFromMemory(EXRVersion *version, + const unsigned char *memory, size_t size); + +// Parse single-part OpenEXR header from a file and initialize `EXRHeader`. +// When there was an error message, Application must free `err` with +// FreeEXRErrorMessage() +extern int ParseEXRHeaderFromFile(EXRHeader *header, const EXRVersion *version, + const char *filename, const char **err); + +// Parse single-part OpenEXR header from a memory and initialize `EXRHeader`. +// When there was an error message, Application must free `err` with +// FreeEXRErrorMessage() +extern int ParseEXRHeaderFromMemory(EXRHeader *header, + const EXRVersion *version, + const unsigned char *memory, size_t size, + const char **err); + +// Parse multi-part OpenEXR headers from a file and initialize `EXRHeader*` +// array. +// When there was an error message, Application must free `err` with +// FreeEXRErrorMessage() +extern int ParseEXRMultipartHeaderFromFile(EXRHeader ***headers, + int *num_headers, + const EXRVersion *version, + const char *filename, + const char **err); + +// Parse multi-part OpenEXR headers from a memory and initialize `EXRHeader*` +// array +// When there was an error message, Application must free `err` with +// FreeEXRErrorMessage() +extern int ParseEXRMultipartHeaderFromMemory(EXRHeader ***headers, + int *num_headers, + const EXRVersion *version, + const unsigned char *memory, + size_t size, const char **err); + +// Loads single-part OpenEXR image from a file. +// Application must setup `ParseEXRHeaderFromFile` before calling this function. +// Application can free EXRImage using `FreeEXRImage` +// Returns negative value and may set error string in `err` when there's an +// error +// When there was an error message, Application must free `err` with +// FreeEXRErrorMessage() +extern int LoadEXRImageFromFile(EXRImage *image, const EXRHeader *header, + const char *filename, const char **err); + +// Loads single-part OpenEXR image from a memory. +// Application must setup `EXRHeader` with +// `ParseEXRHeaderFromMemory` before calling this function. +// Application can free EXRImage using `FreeEXRImage` +// Returns negative value and may set error string in `err` when there's an +// error +// When there was an error message, Application must free `err` with +// FreeEXRErrorMessage() +extern int LoadEXRImageFromMemory(EXRImage *image, const EXRHeader *header, + const unsigned char *memory, + const size_t size, const char **err); + +// Loads multi-part OpenEXR image from a file. +// Application must setup `ParseEXRMultipartHeaderFromFile` before calling this +// function. +// Application can free EXRImage using `FreeEXRImage` +// Returns negative value and may set error string in `err` when there's an +// error +// When there was an error message, Application must free `err` with +// FreeEXRErrorMessage() +extern int LoadEXRMultipartImageFromFile(EXRImage *images, + const EXRHeader **headers, + unsigned int num_parts, + const char *filename, + const char **err); + +// Loads multi-part OpenEXR image from a memory. +// Application must setup `EXRHeader*` array with +// `ParseEXRMultipartHeaderFromMemory` before calling this function. +// Application can free EXRImage using `FreeEXRImage` +// Returns negative value and may set error string in `err` when there's an +// error +// When there was an error message, Application must free `err` with +// FreeEXRErrorMessage() +extern int LoadEXRMultipartImageFromMemory(EXRImage *images, + const EXRHeader **headers, + unsigned int num_parts, + const unsigned char *memory, + const size_t size, const char **err); + +// Saves multi-channel, single-frame OpenEXR image to a file. +// Returns negative value and may set error string in `err` when there's an +// error +// When there was an error message, Application must free `err` with +// FreeEXRErrorMessage() +extern int SaveEXRImageToFile(const EXRImage *image, + const EXRHeader *exr_header, const char *filename, + const char **err); + +// Saves multi-channel, single-frame OpenEXR image to a memory. +// Image is compressed using EXRImage.compression value. +// Return the number of bytes if success. +// Return zero and will set error string in `err` when there's an +// error. +// When there was an error message, Application must free `err` with +// FreeEXRErrorMessage() +extern size_t SaveEXRImageToMemory(const EXRImage *image, + const EXRHeader *exr_header, + unsigned char **memory, const char **err); + +// Loads single-frame OpenEXR deep image. +// Application must free memory of variables in DeepImage(image, offset_table) +// Returns negative value and may set error string in `err` when there's an +// error +// When there was an error message, Application must free `err` with +// FreeEXRErrorMessage() +extern int LoadDeepEXR(DeepImage *out_image, const char *filename, + const char **err); + +// NOT YET IMPLEMENTED: +// Saves single-frame OpenEXR deep image. +// Returns negative value and may set error string in `err` when there's an +// error +// extern int SaveDeepEXR(const DeepImage *in_image, const char *filename, +// const char **err); + +// NOT YET IMPLEMENTED: +// Loads multi-part OpenEXR deep image. +// Application must free memory of variables in DeepImage(image, offset_table) +// extern int LoadMultiPartDeepEXR(DeepImage **out_image, int num_parts, const +// char *filename, +// const char **err); + +// For emscripten. +// Loads single-frame OpenEXR image from memory. Assume EXR image contains +// RGB(A) channels. +// Returns negative value and may set error string in `err` when there's an +// error +// When there was an error message, Application must free `err` with +// FreeEXRErrorMessage() +extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height, + const unsigned char *memory, size_t size, + const char **err); + +#ifdef __cplusplus +} +#endif + +#endif // TINYEXR_H_ + +#ifdef TINYEXR_IMPLEMENTATION +#ifndef TINYEXR_IMPLEMENTATION_DEIFNED +#define TINYEXR_IMPLEMENTATION_DEIFNED + +#include +#include +#include +#include +#include + +// #include // debug + +#include +#include +#include + +#if __cplusplus > 199711L +// C++11 +#include + +#if TINYEXR_USE_THREAD +#include +#include +#endif + +#endif // __cplusplus > 199711L + +#if TINYEXR_USE_OPENMP +#include +#endif + +#if TINYEXR_USE_MINIZ +#else +// Issue #46. Please include your own zlib-compatible API header before +// including `tinyexr.h` +//#include "zlib.h" +#endif + +#if TINYEXR_USE_ZFP +#include "zfp.h" +#endif + +namespace tinyexr { + +#if __cplusplus > 199711L +// C++11 +typedef uint64_t tinyexr_uint64; +typedef int64_t tinyexr_int64; +#else +// Although `long long` is not a standard type pre C++11, assume it is defined +// as a compiler's extension. +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wc++11-long-long" +#endif +typedef unsigned long long tinyexr_uint64; +typedef long long tinyexr_int64; +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#endif + +#if TINYEXR_USE_MINIZ + +namespace miniz { + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wc++11-long-long" +#pragma clang diagnostic ignored "-Wold-style-cast" +#pragma clang diagnostic ignored "-Wpadded" +#pragma clang diagnostic ignored "-Wsign-conversion" +#pragma clang diagnostic ignored "-Wc++11-extensions" +#pragma clang diagnostic ignored "-Wconversion" +#pragma clang diagnostic ignored "-Wunused-function" +#pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#pragma clang diagnostic ignored "-Wundef" + +#if __has_warning("-Wcomma") +#pragma clang diagnostic ignored "-Wcomma" +#endif + +#if __has_warning("-Wmacro-redefined") +#pragma clang diagnostic ignored "-Wmacro-redefined" +#endif + +#if __has_warning("-Wcast-qual") +#pragma clang diagnostic ignored "-Wcast-qual" +#endif + +#if __has_warning("-Wzero-as-null-pointer-constant") +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#endif + +#if __has_warning("-Wtautological-constant-compare") +#pragma clang diagnostic ignored "-Wtautological-constant-compare" +#endif + +#if __has_warning("-Wextra-semi-stmt") +#pragma clang diagnostic ignored "-Wextra-semi-stmt" +#endif + +#endif + +/* miniz.c v1.15 - public domain deflate/inflate, zlib-subset, ZIP + reading/writing/appending, PNG writing + See "unlicense" statement at the end of this file. + Rich Geldreich , last updated Oct. 13, 2013 + Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: + http://www.ietf.org/rfc/rfc1951.txt + + Most API's defined in miniz.c are optional. For example, to disable the + archive related functions just define + MINIZ_NO_ARCHIVE_APIS, or to get rid of all stdio usage define MINIZ_NO_STDIO + (see the list below for more macros). + + * Change History + 10/13/13 v1.15 r4 - Interim bugfix release while I work on the next major + release with Zip64 support (almost there!): + - Critical fix for the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY bug + (thanks kahmyong.moon@hp.com) which could cause locate files to not find + files. This bug + would only have occured in earlier versions if you explicitly used this + flag, OR if you used mz_zip_extract_archive_file_to_heap() or + mz_zip_add_mem_to_archive_file_in_place() + (which used this flag). If you can't switch to v1.15 but want to fix + this bug, just remove the uses of this flag from both helper funcs (and of + course don't use the flag). + - Bugfix in mz_zip_reader_extract_to_mem_no_alloc() from kymoon when + pUser_read_buf is not NULL and compressed size is > uncompressed size + - Fixing mz_zip_reader_extract_*() funcs so they don't try to extract + compressed data from directory entries, to account for weird zipfiles which + contain zero-size compressed data on dir entries. + Hopefully this fix won't cause any issues on weird zip archives, + because it assumes the low 16-bits of zip external attributes are DOS + attributes (which I believe they always are in practice). + - Fixing mz_zip_reader_is_file_a_directory() so it doesn't check the + internal attributes, just the filename and external attributes + - mz_zip_reader_init_file() - missing MZ_FCLOSE() call if the seek failed + - Added cmake support for Linux builds which builds all the examples, + tested with clang v3.3 and gcc v4.6. + - Clang fix for tdefl_write_image_to_png_file_in_memory() from toffaletti + - Merged MZ_FORCEINLINE fix from hdeanclark + - Fix include before config #ifdef, thanks emil.brink + - Added tdefl_write_image_to_png_file_in_memory_ex(): supports Y flipping + (super useful for OpenGL apps), and explicit control over the compression + level (so you can + set it to 1 for real-time compression). + - Merged in some compiler fixes from paulharris's github repro. + - Retested this build under Windows (VS 2010, including static analysis), + tcc 0.9.26, gcc v4.6 and clang v3.3. + - Added example6.c, which dumps an image of the mandelbrot set to a PNG + file. + - Modified example2 to help test the + MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY flag more. + - In r3: Bugfix to mz_zip_writer_add_file() found during merge: Fix + possible src file fclose() leak if alignment bytes+local header file write + faiiled + - In r4: Minor bugfix to mz_zip_writer_add_from_zip_reader(): + Was pushing the wrong central dir header offset, appears harmless in this + release, but it became a problem in the zip64 branch + 5/20/12 v1.14 - MinGW32/64 GCC 4.6.1 compiler fixes: added MZ_FORCEINLINE, + #include (thanks fermtect). + 5/19/12 v1.13 - From jason@cornsyrup.org and kelwert@mtu.edu - Fix + mz_crc32() so it doesn't compute the wrong CRC-32's when mz_ulong is 64-bit. + - Temporarily/locally slammed in "typedef unsigned long mz_ulong" and + re-ran a randomized regression test on ~500k files. + - Eliminated a bunch of warnings when compiling with GCC 32-bit/64. + - Ran all examples, miniz.c, and tinfl.c through MSVC 2008's /analyze + (static analysis) option and fixed all warnings (except for the silly + "Use of the comma-operator in a tested expression.." analysis warning, + which I purposely use to work around a MSVC compiler warning). + - Created 32-bit and 64-bit Codeblocks projects/workspace. Built and + tested Linux executables. The codeblocks workspace is compatible with + Linux+Win32/x64. + - Added miniz_tester solution/project, which is a useful little app + derived from LZHAM's tester app that I use as part of the regression test. + - Ran miniz.c and tinfl.c through another series of regression testing on + ~500,000 files and archives. + - Modified example5.c so it purposely disables a bunch of high-level + functionality (MINIZ_NO_STDIO, etc.). (Thanks to corysama for the + MINIZ_NO_STDIO bug report.) + - Fix ftell() usage in examples so they exit with an error on files which + are too large (a limitation of the examples, not miniz itself). + 4/12/12 v1.12 - More comments, added low-level example5.c, fixed a couple + minor level_and_flags issues in the archive API's. + level_and_flags can now be set to MZ_DEFAULT_COMPRESSION. Thanks to Bruce + Dawson for the feedback/bug report. + 5/28/11 v1.11 - Added statement from unlicense.org + 5/27/11 v1.10 - Substantial compressor optimizations: + - Level 1 is now ~4x faster than before. The L1 compressor's throughput + now varies between 70-110MB/sec. on a + - Core i7 (actual throughput varies depending on the type of data, and x64 + vs. x86). + - Improved baseline L2-L9 compression perf. Also, greatly improved + compression perf. issues on some file types. + - Refactored the compression code for better readability and + maintainability. + - Added level 10 compression level (L10 has slightly better ratio than + level 9, but could have a potentially large + drop in throughput on some files). + 5/15/11 v1.09 - Initial stable release. + + * Low-level Deflate/Inflate implementation notes: + + Compression: Use the "tdefl" API's. The compressor supports raw, static, + and dynamic blocks, lazy or + greedy parsing, match length filtering, RLE-only, and Huffman-only streams. + It performs and compresses + approximately as well as zlib. + + Decompression: Use the "tinfl" API's. The entire decompressor is + implemented as a single function + coroutine: see tinfl_decompress(). It supports decompression into a 32KB + (or larger power of 2) wrapping buffer, or into a memory + block large enough to hold the entire file. + + The low-level tdefl/tinfl API's do not make any use of dynamic memory + allocation. + + * zlib-style API notes: + + miniz.c implements a fairly large subset of zlib. There's enough + functionality present for it to be a drop-in + zlib replacement in many apps: + The z_stream struct, optional memory allocation callbacks + deflateInit/deflateInit2/deflate/deflateReset/deflateEnd/deflateBound + inflateInit/inflateInit2/inflate/inflateEnd + compress, compress2, compressBound, uncompress + CRC-32, Adler-32 - Using modern, minimal code size, CPU cache friendly + routines. + Supports raw deflate streams or standard zlib streams with adler-32 + checking. + + Limitations: + The callback API's are not implemented yet. No support for gzip headers or + zlib static dictionaries. + I've tried to closely emulate zlib's various flavors of stream flushing + and return status codes, but + there are no guarantees that miniz.c pulls this off perfectly. + + * PNG writing: See the tdefl_write_image_to_png_file_in_memory() function, + originally written by + Alex Evans. Supports 1-4 bytes/pixel images. + + * ZIP archive API notes: + + The ZIP archive API's where designed with simplicity and efficiency in + mind, with just enough abstraction to + get the job done with minimal fuss. There are simple API's to retrieve file + information, read files from + existing archives, create new archives, append new files to existing + archives, or clone archive data from + one archive to another. It supports archives located in memory or the heap, + on disk (using stdio.h), + or you can specify custom file read/write callbacks. + + - Archive reading: Just call this function to read a single file from a + disk archive: + + void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const + char *pArchive_name, + size_t *pSize, mz_uint zip_flags); + + For more complex cases, use the "mz_zip_reader" functions. Upon opening an + archive, the entire central + directory is located and read as-is into memory, and subsequent file access + only occurs when reading individual files. + + - Archives file scanning: The simple way is to use this function to scan a + loaded archive for a specific file: + + int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, + const char *pComment, mz_uint flags); + + The locate operation can optionally check file comments too, which (as one + example) can be used to identify + multiple versions of the same file in an archive. This function uses a + simple linear search through the central + directory, so it's not very fast. + + Alternately, you can iterate through all the files in an archive (using + mz_zip_reader_get_num_files()) and + retrieve detailed info on each file by calling mz_zip_reader_file_stat(). + + - Archive creation: Use the "mz_zip_writer" functions. The ZIP writer + immediately writes compressed file data + to disk and builds an exact image of the central directory in memory. The + central directory image is written + all at once at the end of the archive file when the archive is finalized. + + The archive writer can optionally align each file's local header and file + data to any power of 2 alignment, + which can be useful when the archive will be read from optical media. Also, + the writer supports placing + arbitrary data blobs at the very beginning of ZIP archives. Archives + written using either feature are still + readable by any ZIP tool. + + - Archive appending: The simple way to add a single file to an archive is + to call this function: + + mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, + const char *pArchive_name, + const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 + comment_size, mz_uint level_and_flags); + + The archive will be created if it doesn't already exist, otherwise it'll be + appended to. + Note the appending is done in-place and is not an atomic operation, so if + something goes wrong + during the operation it's possible the archive could be left without a + central directory (although the local + file headers and file data will be fine, so the archive will be + recoverable). + + For more complex archive modification scenarios: + 1. The safest way is to use a mz_zip_reader to read the existing archive, + cloning only those bits you want to + preserve into a new archive using using the + mz_zip_writer_add_from_zip_reader() function (which compiles the + compressed file data as-is). When you're done, delete the old archive and + rename the newly written archive, and + you're done. This is safe but requires a bunch of temporary disk space or + heap memory. + + 2. Or, you can convert an mz_zip_reader in-place to an mz_zip_writer using + mz_zip_writer_init_from_reader(), + append new files as needed, then finalize the archive which will write an + updated central directory to the + original archive. (This is basically what + mz_zip_add_mem_to_archive_file_in_place() does.) There's a + possibility that the archive's central directory could be lost with this + method if anything goes wrong, though. + + - ZIP archive support limitations: + No zip64 or spanning support. Extraction functions can only handle + unencrypted, stored or deflated files. + Requires streams capable of seeking. + + * This is a header file library, like stb_image.c. To get only a header file, + either cut and paste the + below header, or create miniz.h, #define MINIZ_HEADER_FILE_ONLY, and then + include miniz.c from it. + + * Important: For best perf. be sure to customize the below macros for your + target platform: + #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 + #define MINIZ_LITTLE_ENDIAN 1 + #define MINIZ_HAS_64BIT_REGISTERS 1 + + * On platforms using glibc, Be sure to "#define _LARGEFILE64_SOURCE 1" before + including miniz.c to ensure miniz + uses the 64-bit variants: fopen64(), stat64(), etc. Otherwise you won't be + able to process large files + (i.e. 32-bit stat() fails for me on files > 0x7FFFFFFF bytes). +*/ + +#ifndef MINIZ_HEADER_INCLUDED +#define MINIZ_HEADER_INCLUDED + +//#include + +// Defines to completely disable specific portions of miniz.c: +// If all macros here are defined the only functionality remaining will be +// CRC-32, adler-32, tinfl, and tdefl. + +// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on +// stdio for file I/O. +//#define MINIZ_NO_STDIO + +// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able +// to get the current time, or +// get/set file times, and the C run-time funcs that get/set times won't be +// called. +// The current downside is the times written to your archives will be from 1979. +#define MINIZ_NO_TIME + +// Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's. +#define MINIZ_NO_ARCHIVE_APIS + +// Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive +// API's. +//#define MINIZ_NO_ARCHIVE_WRITING_APIS + +// Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression +// API's. +//#define MINIZ_NO_ZLIB_APIS + +// Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent +// conflicts against stock zlib. +//#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES + +// Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc. +// Note if MINIZ_NO_MALLOC is defined then the user must always provide custom +// user alloc/free/realloc +// callbacks to the zlib and archive API's, and a few stand-alone helper API's +// which don't provide custom user +// functions (such as tdefl_compress_mem_to_heap() and +// tinfl_decompress_mem_to_heap()) won't work. +//#define MINIZ_NO_MALLOC + +#if defined(__TINYC__) && (defined(__linux) || defined(__linux__)) +// TODO: Work around "error: include file 'sys\utime.h' when compiling with tcc +// on Linux +#define MINIZ_NO_TIME +#endif + +#if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS) +//#include +#endif + +#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || \ + defined(__i386) || defined(__i486__) || defined(__i486) || \ + defined(i386) || defined(__ia64__) || defined(__x86_64__) +// MINIZ_X86_OR_X64_CPU is only used to help set the below macros. +#define MINIZ_X86_OR_X64_CPU 1 +#endif + +#if defined(__sparcv9) +// Big endian +#else +#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU +// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. +#define MINIZ_LITTLE_ENDIAN 1 +#endif +#endif + +#if MINIZ_X86_OR_X64_CPU +// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient +// integer loads and stores from unaligned addresses. +//#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 +#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES \ + 0 // disable to suppress compiler warnings +#endif + +#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || \ + defined(_LP64) || defined(__LP64__) || defined(__ia64__) || \ + defined(__x86_64__) +// Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are +// reasonably fast (and don't involve compiler generated calls to helper +// functions). +#define MINIZ_HAS_64BIT_REGISTERS 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// ------------------- zlib-style API Definitions. + +// For more compatibility with zlib, miniz.c uses unsigned long for some +// parameters/struct members. Beware: mz_ulong can be either 32 or 64-bits! +typedef unsigned long mz_ulong; + +// mz_free() internally uses the MZ_FREE() macro (which by default calls free() +// unless you've modified the MZ_MALLOC macro) to release a block allocated from +// the heap. +void mz_free(void *p); + +#define MZ_ADLER32_INIT (1) +// mz_adler32() returns the initial adler-32 value to use when called with +// ptr==NULL. +mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len); + +#define MZ_CRC32_INIT (0) +// mz_crc32() returns the initial CRC-32 value to use when called with +// ptr==NULL. +mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len); + +// Compression strategies. +enum { + MZ_DEFAULT_STRATEGY = 0, + MZ_FILTERED = 1, + MZ_HUFFMAN_ONLY = 2, + MZ_RLE = 3, + MZ_FIXED = 4 +}; + +// Method +#define MZ_DEFLATED 8 + +#ifndef MINIZ_NO_ZLIB_APIS + +// Heap allocation callbacks. +// Note that mz_alloc_func parameter types purpsosely differ from zlib's: +// items/size is size_t, not unsigned long. +typedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size); +typedef void (*mz_free_func)(void *opaque, void *address); +typedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items, + size_t size); + +#define MZ_VERSION "9.1.15" +#define MZ_VERNUM 0x91F0 +#define MZ_VER_MAJOR 9 +#define MZ_VER_MINOR 1 +#define MZ_VER_REVISION 15 +#define MZ_VER_SUBREVISION 0 + +// Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The +// other values are for advanced use (refer to the zlib docs). +enum { + MZ_NO_FLUSH = 0, + MZ_PARTIAL_FLUSH = 1, + MZ_SYNC_FLUSH = 2, + MZ_FULL_FLUSH = 3, + MZ_FINISH = 4, + MZ_BLOCK = 5 +}; + +// Return status codes. MZ_PARAM_ERROR is non-standard. +enum { + MZ_OK = 0, + MZ_STREAM_END = 1, + MZ_NEED_DICT = 2, + MZ_ERRNO = -1, + MZ_STREAM_ERROR = -2, + MZ_DATA_ERROR = -3, + MZ_MEM_ERROR = -4, + MZ_BUF_ERROR = -5, + MZ_VERSION_ERROR = -6, + MZ_PARAM_ERROR = -10000 +}; + +// Compression levels: 0-9 are the standard zlib-style levels, 10 is best +// possible compression (not zlib compatible, and may be very slow), +// MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL. +enum { + MZ_NO_COMPRESSION = 0, + MZ_BEST_SPEED = 1, + MZ_BEST_COMPRESSION = 9, + MZ_UBER_COMPRESSION = 10, + MZ_DEFAULT_LEVEL = 6, + MZ_DEFAULT_COMPRESSION = -1 +}; + +// Window bits +#define MZ_DEFAULT_WINDOW_BITS 15 + +struct mz_internal_state; + +// Compression/decompression stream struct. +typedef struct mz_stream_s { + const unsigned char *next_in; // pointer to next byte to read + unsigned int avail_in; // number of bytes available at next_in + mz_ulong total_in; // total number of bytes consumed so far + + unsigned char *next_out; // pointer to next byte to write + unsigned int avail_out; // number of bytes that can be written to next_out + mz_ulong total_out; // total number of bytes produced so far + + char *msg; // error msg (unused) + struct mz_internal_state *state; // internal state, allocated by zalloc/zfree + + mz_alloc_func + zalloc; // optional heap allocation function (defaults to malloc) + mz_free_func zfree; // optional heap free function (defaults to free) + void *opaque; // heap alloc function user pointer + + int data_type; // data_type (unused) + mz_ulong adler; // adler32 of the source or uncompressed data + mz_ulong reserved; // not used +} mz_stream; + +typedef mz_stream *mz_streamp; + +// Returns the version string of miniz.c. +const char *mz_version(void); + +// mz_deflateInit() initializes a compressor with default options: +// Parameters: +// pStream must point to an initialized mz_stream struct. +// level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION]. +// level 1 enables a specially optimized compression function that's been +// optimized purely for performance, not ratio. +// (This special func. is currently only enabled when +// MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.) +// Return values: +// MZ_OK on success. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_PARAM_ERROR if the input parameters are bogus. +// MZ_MEM_ERROR on out of memory. +int mz_deflateInit(mz_streamp pStream, int level); + +// mz_deflateInit2() is like mz_deflate(), except with more control: +// Additional parameters: +// method must be MZ_DEFLATED +// window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with +// zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no +// header or footer) +// mem_level must be between [1, 9] (it's checked but ignored by miniz.c) +int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, + int mem_level, int strategy); + +// Quickly resets a compressor without having to reallocate anything. Same as +// calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2(). +int mz_deflateReset(mz_streamp pStream); + +// mz_deflate() compresses the input to output, consuming as much of the input +// and producing as much output as possible. +// Parameters: +// pStream is the stream to read from and write to. You must initialize/update +// the next_in, avail_in, next_out, and avail_out members. +// flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or +// MZ_FINISH. +// Return values: +// MZ_OK on success (when flushing, or if more input is needed but not +// available, and/or there's more output to be written but the output buffer +// is full). +// MZ_STREAM_END if all input has been consumed and all output bytes have been +// written. Don't call mz_deflate() on the stream anymore. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_PARAM_ERROR if one of the parameters is invalid. +// MZ_BUF_ERROR if no forward progress is possible because the input and/or +// output buffers are empty. (Fill up the input buffer or free up some output +// space and try again.) +int mz_deflate(mz_streamp pStream, int flush); + +// mz_deflateEnd() deinitializes a compressor: +// Return values: +// MZ_OK on success. +// MZ_STREAM_ERROR if the stream is bogus. +int mz_deflateEnd(mz_streamp pStream); + +// mz_deflateBound() returns a (very) conservative upper bound on the amount of +// data that could be generated by deflate(), assuming flush is set to only +// MZ_NO_FLUSH or MZ_FINISH. +mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len); + +// Single-call compression functions mz_compress() and mz_compress2(): +// Returns MZ_OK on success, or one of the error codes from mz_deflate() on +// failure. +int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, + const unsigned char *pSource, mz_ulong source_len); +int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, + const unsigned char *pSource, mz_ulong source_len, int level); + +// mz_compressBound() returns a (very) conservative upper bound on the amount of +// data that could be generated by calling mz_compress(). +mz_ulong mz_compressBound(mz_ulong source_len); + +// Initializes a decompressor. +int mz_inflateInit(mz_streamp pStream); + +// mz_inflateInit2() is like mz_inflateInit() with an additional option that +// controls the window size and whether or not the stream has been wrapped with +// a zlib header/footer: +// window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or +// -MZ_DEFAULT_WINDOW_BITS (raw deflate). +int mz_inflateInit2(mz_streamp pStream, int window_bits); + +// Decompresses the input stream to the output, consuming only as much of the +// input as needed, and writing as much to the output as possible. +// Parameters: +// pStream is the stream to read from and write to. You must initialize/update +// the next_in, avail_in, next_out, and avail_out members. +// flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH. +// On the first call, if flush is MZ_FINISH it's assumed the input and output +// buffers are both sized large enough to decompress the entire stream in a +// single call (this is slightly faster). +// MZ_FINISH implies that there are no more source bytes available beside +// what's already in the input buffer, and that the output buffer is large +// enough to hold the rest of the decompressed data. +// Return values: +// MZ_OK on success. Either more input is needed but not available, and/or +// there's more output to be written but the output buffer is full. +// MZ_STREAM_END if all needed input has been consumed and all output bytes +// have been written. For zlib streams, the adler-32 of the decompressed data +// has also been verified. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_DATA_ERROR if the deflate stream is invalid. +// MZ_PARAM_ERROR if one of the parameters is invalid. +// MZ_BUF_ERROR if no forward progress is possible because the input buffer is +// empty but the inflater needs more input to continue, or if the output +// buffer is not large enough. Call mz_inflate() again +// with more input data, or with more room in the output buffer (except when +// using single call decompression, described above). +int mz_inflate(mz_streamp pStream, int flush); + +// Deinitializes a decompressor. +int mz_inflateEnd(mz_streamp pStream); + +// Single-call decompression. +// Returns MZ_OK on success, or one of the error codes from mz_inflate() on +// failure. +int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, + const unsigned char *pSource, mz_ulong source_len); + +// Returns a string description of the specified error code, or NULL if the +// error code is invalid. +const char *mz_error(int err); + +// Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used +// as a drop-in replacement for the subset of zlib that miniz.c supports. +// Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you +// use zlib in the same project. +#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES +typedef unsigned char Byte; +typedef unsigned int uInt; +typedef mz_ulong uLong; +typedef Byte Bytef; +typedef uInt uIntf; +typedef char charf; +typedef int intf; +typedef void *voidpf; +typedef uLong uLongf; +typedef void *voidp; +typedef void *const voidpc; +#define Z_NULL 0 +#define Z_NO_FLUSH MZ_NO_FLUSH +#define Z_PARTIAL_FLUSH MZ_PARTIAL_FLUSH +#define Z_SYNC_FLUSH MZ_SYNC_FLUSH +#define Z_FULL_FLUSH MZ_FULL_FLUSH +#define Z_FINISH MZ_FINISH +#define Z_BLOCK MZ_BLOCK +#define Z_OK MZ_OK +#define Z_STREAM_END MZ_STREAM_END +#define Z_NEED_DICT MZ_NEED_DICT +#define Z_ERRNO MZ_ERRNO +#define Z_STREAM_ERROR MZ_STREAM_ERROR +#define Z_DATA_ERROR MZ_DATA_ERROR +#define Z_MEM_ERROR MZ_MEM_ERROR +#define Z_BUF_ERROR MZ_BUF_ERROR +#define Z_VERSION_ERROR MZ_VERSION_ERROR +#define Z_PARAM_ERROR MZ_PARAM_ERROR +#define Z_NO_COMPRESSION MZ_NO_COMPRESSION +#define Z_BEST_SPEED MZ_BEST_SPEED +#define Z_BEST_COMPRESSION MZ_BEST_COMPRESSION +#define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION +#define Z_DEFAULT_STRATEGY MZ_DEFAULT_STRATEGY +#define Z_FILTERED MZ_FILTERED +#define Z_HUFFMAN_ONLY MZ_HUFFMAN_ONLY +#define Z_RLE MZ_RLE +#define Z_FIXED MZ_FIXED +#define Z_DEFLATED MZ_DEFLATED +#define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS +#define alloc_func mz_alloc_func +#define free_func mz_free_func +#define internal_state mz_internal_state +#define z_stream mz_stream +#define deflateInit mz_deflateInit +#define deflateInit2 mz_deflateInit2 +#define deflateReset mz_deflateReset +#define deflate mz_deflate +#define deflateEnd mz_deflateEnd +#define deflateBound mz_deflateBound +#define compress mz_compress +#define compress2 mz_compress2 +#define compressBound mz_compressBound +#define inflateInit mz_inflateInit +#define inflateInit2 mz_inflateInit2 +#define inflate mz_inflate +#define inflateEnd mz_inflateEnd +#define uncompress mz_uncompress +#define crc32 mz_crc32 +#define adler32 mz_adler32 +#define MAX_WBITS 15 +#define MAX_MEM_LEVEL 9 +#define zError mz_error +#define ZLIB_VERSION MZ_VERSION +#define ZLIB_VERNUM MZ_VERNUM +#define ZLIB_VER_MAJOR MZ_VER_MAJOR +#define ZLIB_VER_MINOR MZ_VER_MINOR +#define ZLIB_VER_REVISION MZ_VER_REVISION +#define ZLIB_VER_SUBREVISION MZ_VER_SUBREVISION +#define zlibVersion mz_version +#define zlib_version mz_version() +#endif // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES + +#endif // MINIZ_NO_ZLIB_APIS + +// ------------------- Types and macros + +typedef unsigned char mz_uint8; +typedef signed short mz_int16; +typedef unsigned short mz_uint16; +typedef unsigned int mz_uint32; +typedef unsigned int mz_uint; +typedef long long mz_int64; +typedef unsigned long long mz_uint64; +typedef int mz_bool; + +#define MZ_FALSE (0) +#define MZ_TRUE (1) + +// An attempt to work around MSVC's spammy "warning C4127: conditional +// expression is constant" message. +#ifdef _MSC_VER +#define MZ_MACRO_END while (0, 0) +#else +#define MZ_MACRO_END while (0) +#endif + +// ------------------- ZIP archive reading/writing + +#ifndef MINIZ_NO_ARCHIVE_APIS + +enum { + MZ_ZIP_MAX_IO_BUF_SIZE = 64 * 1024, + MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 260, + MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 256 +}; + +typedef struct { + mz_uint32 m_file_index; + mz_uint32 m_central_dir_ofs; + mz_uint16 m_version_made_by; + mz_uint16 m_version_needed; + mz_uint16 m_bit_flag; + mz_uint16 m_method; +#ifndef MINIZ_NO_TIME + time_t m_time; +#endif + mz_uint32 m_crc32; + mz_uint64 m_comp_size; + mz_uint64 m_uncomp_size; + mz_uint16 m_internal_attr; + mz_uint32 m_external_attr; + mz_uint64 m_local_header_ofs; + mz_uint32 m_comment_size; + char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE]; + char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE]; +} mz_zip_archive_file_stat; + +typedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, + void *pBuf, size_t n); +typedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs, + const void *pBuf, size_t n); + +struct mz_zip_internal_state_tag; +typedef struct mz_zip_internal_state_tag mz_zip_internal_state; + +typedef enum { + MZ_ZIP_MODE_INVALID = 0, + MZ_ZIP_MODE_READING = 1, + MZ_ZIP_MODE_WRITING = 2, + MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3 +} mz_zip_mode; + +typedef struct mz_zip_archive_tag { + mz_uint64 m_archive_size; + mz_uint64 m_central_directory_file_ofs; + mz_uint m_total_files; + mz_zip_mode m_zip_mode; + + mz_uint m_file_offset_alignment; + + mz_alloc_func m_pAlloc; + mz_free_func m_pFree; + mz_realloc_func m_pRealloc; + void *m_pAlloc_opaque; + + mz_file_read_func m_pRead; + mz_file_write_func m_pWrite; + void *m_pIO_opaque; + + mz_zip_internal_state *m_pState; + +} mz_zip_archive; + +typedef enum { + MZ_ZIP_FLAG_CASE_SENSITIVE = 0x0100, + MZ_ZIP_FLAG_IGNORE_PATH = 0x0200, + MZ_ZIP_FLAG_COMPRESSED_DATA = 0x0400, + MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800 +} mz_zip_flags; + +// ZIP archive reading + +// Inits a ZIP archive reader. +// These functions read and validate the archive's central directory. +mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, + mz_uint32 flags); +mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, + size_t size, mz_uint32 flags); + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, + mz_uint32 flags); +#endif + +// Returns the total number of files in the archive. +mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip); + +// Returns detailed information about an archive file entry. +mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, + mz_zip_archive_file_stat *pStat); + +// Determines if an archive file entry is a directory entry. +mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, + mz_uint file_index); +mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, + mz_uint file_index); + +// Retrieves the filename of an archive file entry. +// Returns the number of bytes written to pFilename, or if filename_buf_size is +// 0 this function returns the number of bytes needed to fully store the +// filename. +mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, + char *pFilename, mz_uint filename_buf_size); + +// Attempts to locates a file in the archive's central directory. +// Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH +// Returns -1 if the file cannot be found. +int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, + const char *pComment, mz_uint flags); + +// Extracts a archive file to a memory buffer using no memory allocation. +mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, + mz_uint file_index, void *pBuf, + size_t buf_size, mz_uint flags, + void *pUser_read_buf, + size_t user_read_buf_size); +mz_bool mz_zip_reader_extract_file_to_mem_no_alloc( + mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, + mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size); + +// Extracts a archive file to a memory buffer. +mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, + void *pBuf, size_t buf_size, + mz_uint flags); +mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, + const char *pFilename, void *pBuf, + size_t buf_size, mz_uint flags); + +// Extracts a archive file to a dynamically allocated heap buffer. +void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, + size_t *pSize, mz_uint flags); +void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, + const char *pFilename, size_t *pSize, + mz_uint flags); + +// Extracts a archive file using a callback function to output the file's data. +mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, + mz_uint file_index, + mz_file_write_func pCallback, + void *pOpaque, mz_uint flags); +mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, + const char *pFilename, + mz_file_write_func pCallback, + void *pOpaque, mz_uint flags); + +#ifndef MINIZ_NO_STDIO +// Extracts a archive file to a disk file and sets its last accessed and +// modified times. +// This function only extracts files, not archive directory records. +mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, + const char *pDst_filename, mz_uint flags); +mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, + const char *pArchive_filename, + const char *pDst_filename, + mz_uint flags); +#endif + +// Ends archive reading, freeing all allocations, and closing the input archive +// file if mz_zip_reader_init_file() was used. +mz_bool mz_zip_reader_end(mz_zip_archive *pZip); + +// ZIP archive writing + +#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +// Inits a ZIP archive writer. +mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size); +mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, + size_t size_to_reserve_at_beginning, + size_t initial_allocation_size); + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, + mz_uint64 size_to_reserve_at_beginning); +#endif + +// Converts a ZIP archive reader object into a writer object, to allow efficient +// in-place file appends to occur on an existing archive. +// For archives opened using mz_zip_reader_init_file, pFilename must be the +// archive's filename so it can be reopened for writing. If the file can't be +// reopened, mz_zip_reader_end() will be called. +// For archives opened using mz_zip_reader_init_mem, the memory block must be +// growable using the realloc callback (which defaults to realloc unless you've +// overridden it). +// Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's +// user provided m_pWrite function cannot be NULL. +// Note: In-place archive modification is not recommended unless you know what +// you're doing, because if execution stops or something goes wrong before +// the archive is finalized the file's central directory will be hosed. +mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, + const char *pFilename); + +// Adds the contents of a memory buffer to an archive. These functions record +// the current local time into the archive. +// To add a directory entry, call this method with an archive name ending in a +// forwardslash with empty buffer. +// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, +// MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or +// just set to MZ_DEFAULT_COMPRESSION. +mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, + const void *pBuf, size_t buf_size, + mz_uint level_and_flags); +mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, + const char *pArchive_name, const void *pBuf, + size_t buf_size, const void *pComment, + mz_uint16 comment_size, + mz_uint level_and_flags, mz_uint64 uncomp_size, + mz_uint32 uncomp_crc32); + +#ifndef MINIZ_NO_STDIO +// Adds the contents of a disk file to an archive. This function also records +// the disk file's modified time into the archive. +// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, +// MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or +// just set to MZ_DEFAULT_COMPRESSION. +mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, + const char *pSrc_filename, const void *pComment, + mz_uint16 comment_size, mz_uint level_and_flags); +#endif + +// Adds a file to an archive by fully cloning the data from another archive. +// This function fully clones the source file's compressed data (no +// recompression), along with its full filename, extra data, and comment fields. +mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, + mz_zip_archive *pSource_zip, + mz_uint file_index); + +// Finalizes the archive by writing the central directory records followed by +// the end of central directory record. +// After an archive is finalized, the only valid call on the mz_zip_archive +// struct is mz_zip_writer_end(). +// An archive must be manually finalized by calling this function for it to be +// valid. +mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip); +mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, + size_t *pSize); + +// Ends archive writing, freeing all allocations, and closing the output file if +// mz_zip_writer_init_file() was used. +// Note for the archive to be valid, it must have been finalized before ending. +mz_bool mz_zip_writer_end(mz_zip_archive *pZip); + +// Misc. high-level helper functions: + +// mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically) +// appends a memory blob to a ZIP archive. +// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, +// MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or +// just set to MZ_DEFAULT_COMPRESSION. +mz_bool mz_zip_add_mem_to_archive_file_in_place( + const char *pZip_filename, const char *pArchive_name, const void *pBuf, + size_t buf_size, const void *pComment, mz_uint16 comment_size, + mz_uint level_and_flags); + +// Reads a single file from an archive into a heap block. +// Returns NULL on failure. +void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, + const char *pArchive_name, + size_t *pSize, mz_uint zip_flags); + +#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +#endif // #ifndef MINIZ_NO_ARCHIVE_APIS + +// ------------------- Low-level Decompression API Definitions + +// Decompression flags used by tinfl_decompress(). +// TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and +// ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the +// input is a raw deflate stream. +// TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available +// beyond the end of the supplied input buffer. If clear, the input buffer +// contains all remaining input. +// TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large +// enough to hold the entire decompressed stream. If clear, the output buffer is +// at least the size of the dictionary (typically 32KB). +// TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the +// decompressed bytes. +enum { + TINFL_FLAG_PARSE_ZLIB_HEADER = 1, + TINFL_FLAG_HAS_MORE_INPUT = 2, + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4, + TINFL_FLAG_COMPUTE_ADLER32 = 8 +}; + +// High level decompression functions: +// tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block +// allocated via malloc(). +// On entry: +// pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data +// to decompress. +// On return: +// Function returns a pointer to the decompressed data, or NULL on failure. +// *pOut_len will be set to the decompressed data's size, which could be larger +// than src_buf_len on uncompressible data. +// The caller must call mz_free() on the returned block when it's no longer +// needed. +void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, + size_t *pOut_len, int flags); + +// tinfl_decompress_mem_to_mem() decompresses a block in memory to another block +// in memory. +// Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes +// written on success. +#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1)) +size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, + const void *pSrc_buf, size_t src_buf_len, + int flags); + +// tinfl_decompress_mem_to_callback() decompresses a block in memory to an +// internal 32KB buffer, and a user provided callback function will be called to +// flush the buffer. +// Returns 1 on success or 0 on failure. +typedef int (*tinfl_put_buf_func_ptr)(const void *pBuf, int len, void *pUser); +int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, + tinfl_put_buf_func_ptr pPut_buf_func, + void *pPut_buf_user, int flags); + +struct tinfl_decompressor_tag; +typedef struct tinfl_decompressor_tag tinfl_decompressor; + +// Max size of LZ dictionary. +#define TINFL_LZ_DICT_SIZE 32768 + +// Return status. +typedef enum { + TINFL_STATUS_BAD_PARAM = -3, + TINFL_STATUS_ADLER32_MISMATCH = -2, + TINFL_STATUS_FAILED = -1, + TINFL_STATUS_DONE = 0, + TINFL_STATUS_NEEDS_MORE_INPUT = 1, + TINFL_STATUS_HAS_MORE_OUTPUT = 2 +} tinfl_status; + +// Initializes the decompressor to its initial state. +#define tinfl_init(r) \ + do { \ + (r)->m_state = 0; \ + } \ + MZ_MACRO_END +#define tinfl_get_adler32(r) (r)->m_check_adler32 + +// Main low-level decompressor coroutine function. This is the only function +// actually needed for decompression. All the other functions are just +// high-level helpers for improved usability. +// This is a universal API, i.e. it can be used as a building block to build any +// desired higher level decompression API. In the limit case, it can be called +// once per every byte input or output. +tinfl_status tinfl_decompress(tinfl_decompressor *r, + const mz_uint8 *pIn_buf_next, + size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, + mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, + const mz_uint32 decomp_flags); + +// Internal/private bits follow. +enum { + TINFL_MAX_HUFF_TABLES = 3, + TINFL_MAX_HUFF_SYMBOLS_0 = 288, + TINFL_MAX_HUFF_SYMBOLS_1 = 32, + TINFL_MAX_HUFF_SYMBOLS_2 = 19, + TINFL_FAST_LOOKUP_BITS = 10, + TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS +}; + +typedef struct { + mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0]; + mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], + m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2]; +} tinfl_huff_table; + +#if MINIZ_HAS_64BIT_REGISTERS +#define TINFL_USE_64BIT_BITBUF 1 +#endif + +#if TINFL_USE_64BIT_BITBUF +typedef mz_uint64 tinfl_bit_buf_t; +#define TINFL_BITBUF_SIZE (64) +#else +typedef mz_uint32 tinfl_bit_buf_t; +#define TINFL_BITBUF_SIZE (32) +#endif + +struct tinfl_decompressor_tag { + mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, + m_check_adler32, m_dist, m_counter, m_num_extra, + m_table_sizes[TINFL_MAX_HUFF_TABLES]; + tinfl_bit_buf_t m_bit_buf; + size_t m_dist_from_out_buf_start; + tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES]; + mz_uint8 m_raw_header[4], + m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137]; +}; + +// ------------------- Low-level Compression API Definitions + +// Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly +// slower, and raw/dynamic blocks will be output more frequently). +#define TDEFL_LESS_MEMORY 0 + +// tdefl_init() compression flags logically OR'd together (low 12 bits contain +// the max. number of probes per dictionary search): +// TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes +// per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap +// compression), 4095=Huffman+LZ (slowest/best compression). +enum { + TDEFL_HUFFMAN_ONLY = 0, + TDEFL_DEFAULT_MAX_PROBES = 128, + TDEFL_MAX_PROBES_MASK = 0xFFF +}; + +// TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before +// the deflate data, and the Adler-32 of the source data at the end. Otherwise, +// you'll get raw deflate data. +// TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even +// when not writing zlib headers). +// TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more +// efficient lazy parsing. +// TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's +// initialization time to the minimum, but the output may vary from run to run +// given the same input (depending on the contents of memory). +// TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1) +// TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled. +// TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables. +// TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks. +// The low 12 bits are reserved to control the max # of hash probes per +// dictionary lookup (see TDEFL_MAX_PROBES_MASK). +enum { + TDEFL_WRITE_ZLIB_HEADER = 0x01000, + TDEFL_COMPUTE_ADLER32 = 0x02000, + TDEFL_GREEDY_PARSING_FLAG = 0x04000, + TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000, + TDEFL_RLE_MATCHES = 0x10000, + TDEFL_FILTER_MATCHES = 0x20000, + TDEFL_FORCE_ALL_STATIC_BLOCKS = 0x40000, + TDEFL_FORCE_ALL_RAW_BLOCKS = 0x80000 +}; + +// High level compression functions: +// tdefl_compress_mem_to_heap() compresses a block in memory to a heap block +// allocated via malloc(). +// On entry: +// pSrc_buf, src_buf_len: Pointer and size of source block to compress. +// flags: The max match finder probes (default is 128) logically OR'd against +// the above flags. Higher probes are slower but improve compression. +// On return: +// Function returns a pointer to the compressed data, or NULL on failure. +// *pOut_len will be set to the compressed data's size, which could be larger +// than src_buf_len on uncompressible data. +// The caller must free() the returned block when it's no longer needed. +void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, + size_t *pOut_len, int flags); + +// tdefl_compress_mem_to_mem() compresses a block in memory to another block in +// memory. +// Returns 0 on failure. +size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, + const void *pSrc_buf, size_t src_buf_len, + int flags); + +// Compresses an image to a compressed PNG file in memory. +// On entry: +// pImage, w, h, and num_chans describe the image to compress. num_chans may be +// 1, 2, 3, or 4. +// The image pitch in bytes per scanline will be w*num_chans. The leftmost +// pixel on the top scanline is stored first in memory. +// level may range from [0,10], use MZ_NO_COMPRESSION, MZ_BEST_SPEED, +// MZ_BEST_COMPRESSION, etc. or a decent default is MZ_DEFAULT_LEVEL +// If flip is true, the image will be flipped on the Y axis (useful for OpenGL +// apps). +// On return: +// Function returns a pointer to the compressed data, or NULL on failure. +// *pLen_out will be set to the size of the PNG image file. +// The caller must mz_free() the returned heap block (which will typically be +// larger than *pLen_out) when it's no longer needed. +void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, + int h, int num_chans, + size_t *pLen_out, + mz_uint level, mz_bool flip); +void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, + int num_chans, size_t *pLen_out); + +// Output stream interface. The compressor uses this interface to write +// compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time. +typedef mz_bool (*tdefl_put_buf_func_ptr)(const void *pBuf, int len, + void *pUser); + +// tdefl_compress_mem_to_output() compresses a block to an output stream. The +// above helpers use this function internally. +mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, + tdefl_put_buf_func_ptr pPut_buf_func, + void *pPut_buf_user, int flags); + +enum { + TDEFL_MAX_HUFF_TABLES = 3, + TDEFL_MAX_HUFF_SYMBOLS_0 = 288, + TDEFL_MAX_HUFF_SYMBOLS_1 = 32, + TDEFL_MAX_HUFF_SYMBOLS_2 = 19, + TDEFL_LZ_DICT_SIZE = 32768, + TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1, + TDEFL_MIN_MATCH_LEN = 3, + TDEFL_MAX_MATCH_LEN = 258 +}; + +// TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed +// output block (using static/fixed Huffman codes). +#if TDEFL_LESS_MEMORY +enum { + TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024, + TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13) / 10, + TDEFL_MAX_HUFF_SYMBOLS = 288, + TDEFL_LZ_HASH_BITS = 12, + TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, + TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, + TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS +}; +#else +enum { + TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024, + TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13) / 10, + TDEFL_MAX_HUFF_SYMBOLS = 288, + TDEFL_LZ_HASH_BITS = 15, + TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, + TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, + TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS +}; +#endif + +// The low-level tdefl functions below may be used directly if the above helper +// functions aren't flexible enough. The low-level functions don't make any heap +// allocations, unlike the above helper functions. +typedef enum { + TDEFL_STATUS_BAD_PARAM = -2, + TDEFL_STATUS_PUT_BUF_FAILED = -1, + TDEFL_STATUS_OKAY = 0, + TDEFL_STATUS_DONE = 1 +} tdefl_status; + +// Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums +typedef enum { + TDEFL_NO_FLUSH = 0, + TDEFL_SYNC_FLUSH = 2, + TDEFL_FULL_FLUSH = 3, + TDEFL_FINISH = 4 +} tdefl_flush; + +// tdefl's compression state structure. +typedef struct { + tdefl_put_buf_func_ptr m_pPut_buf_func; + void *m_pPut_buf_user; + mz_uint m_flags, m_max_probes[2]; + int m_greedy_parsing; + mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size; + mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end; + mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in, + m_bit_buffer; + mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, + m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index, + m_wants_to_finish; + tdefl_status m_prev_return_status; + const void *m_pIn_buf; + void *m_pOut_buf; + size_t *m_pIn_buf_size, *m_pOut_buf_size; + tdefl_flush m_flush; + const mz_uint8 *m_pSrc; + size_t m_src_buf_left, m_out_buf_ofs; + mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1]; + mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE]; + mz_uint16 m_next[TDEFL_LZ_DICT_SIZE]; + mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE]; + mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE]; +} tdefl_compressor; + +// Initializes the compressor. +// There is no corresponding deinit() function because the tdefl API's do not +// dynamically allocate memory. +// pBut_buf_func: If NULL, output data will be supplied to the specified +// callback. In this case, the user should call the tdefl_compress_buffer() API +// for compression. +// If pBut_buf_func is NULL the user should always call the tdefl_compress() +// API. +// flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER, +// etc.) +tdefl_status tdefl_init(tdefl_compressor *d, + tdefl_put_buf_func_ptr pPut_buf_func, + void *pPut_buf_user, int flags); + +// Compresses a block of data, consuming as much of the specified input buffer +// as possible, and writing as much compressed data to the specified output +// buffer as possible. +tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, + size_t *pIn_buf_size, void *pOut_buf, + size_t *pOut_buf_size, tdefl_flush flush); + +// tdefl_compress_buffer() is only usable when the tdefl_init() is called with a +// non-NULL tdefl_put_buf_func_ptr. +// tdefl_compress_buffer() always consumes the entire input buffer. +tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, + size_t in_buf_size, tdefl_flush flush); + +tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d); +mz_uint32 tdefl_get_adler32(tdefl_compressor *d); + +// Can't use tdefl_create_comp_flags_from_zip_params if MINIZ_NO_ZLIB_APIS isn't +// defined, because it uses some of its macros. +#ifndef MINIZ_NO_ZLIB_APIS +// Create tdefl_compress() flags given zlib-style compression parameters. +// level may range from [0,10] (where 10 is absolute max compression, but may be +// much slower on some files) +// window_bits may be -15 (raw deflate) or 15 (zlib) +// strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, +// MZ_RLE, or MZ_FIXED +mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, + int strategy); +#endif // #ifndef MINIZ_NO_ZLIB_APIS + +#ifdef __cplusplus +} +#endif + +#endif // MINIZ_HEADER_INCLUDED + +// ------------------- End of Header: Implementation follows. (If you only want +// the header, define MINIZ_HEADER_FILE_ONLY.) + +#ifndef MINIZ_HEADER_FILE_ONLY + +typedef unsigned char mz_validate_uint16[sizeof(mz_uint16) == 2 ? 1 : -1]; +typedef unsigned char mz_validate_uint32[sizeof(mz_uint32) == 4 ? 1 : -1]; +typedef unsigned char mz_validate_uint64[sizeof(mz_uint64) == 8 ? 1 : -1]; + +#define MZ_ASSERT(x) TEXR_ASSERT(x) + +#ifdef MINIZ_NO_MALLOC +#define MZ_MALLOC(x) NULL +#define MZ_FREE(x) (void)x, ((void)0) +#define MZ_REALLOC(p, x) NULL +#else +#define MZ_MALLOC(x) malloc(x) +#define MZ_FREE(x) free(x) +#define MZ_REALLOC(p, x) realloc(p, x) +#endif + +#define MZ_MAX(a, b) (((a) > (b)) ? (a) : (b)) +#define MZ_MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj)) + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN +#define MZ_READ_LE16(p) *((const mz_uint16 *)(p)) +#define MZ_READ_LE32(p) *((const mz_uint32 *)(p)) +#else +#define MZ_READ_LE16(p) \ + ((mz_uint32)(((const mz_uint8 *)(p))[0]) | \ + ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U)) +#define MZ_READ_LE32(p) \ + ((mz_uint32)(((const mz_uint8 *)(p))[0]) | \ + ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | \ + ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | \ + ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U)) +#endif + +#ifdef _MSC_VER +#define MZ_FORCEINLINE __forceinline +#elif defined(__GNUC__) +#define MZ_FORCEINLINE inline __attribute__((__always_inline__)) +#else +#define MZ_FORCEINLINE inline +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// ------------------- zlib-style API's + +mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len) { + mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16); + size_t block_len = buf_len % 5552; + if (!ptr) return MZ_ADLER32_INIT; + while (buf_len) { + for (i = 0; i + 7 < block_len; i += 8, ptr += 8) { + s1 += ptr[0], s2 += s1; + s1 += ptr[1], s2 += s1; + s1 += ptr[2], s2 += s1; + s1 += ptr[3], s2 += s1; + s1 += ptr[4], s2 += s1; + s1 += ptr[5], s2 += s1; + s1 += ptr[6], s2 += s1; + s1 += ptr[7], s2 += s1; + } + for (; i < block_len; ++i) s1 += *ptr++, s2 += s1; + s1 %= 65521U, s2 %= 65521U; + buf_len -= block_len; + block_len = 5552; + } + return (s2 << 16) + s1; +} + +// Karl Malbrain's compact CRC-32. See "A compact CCITT crc16 and crc32 C +// implementation that balances processor cache usage against speed": +// http://www.geocities.com/malbrain/ +mz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len) { + static const mz_uint32 s_crc32[16] = { + 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, + 0x4db26158, 0x5005713c, 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, + 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c}; + mz_uint32 crcu32 = (mz_uint32)crc; + if (!ptr) return MZ_CRC32_INIT; + crcu32 = ~crcu32; + while (buf_len--) { + mz_uint8 b = *ptr++; + crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)]; + crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)]; + } + return ~crcu32; +} + +void mz_free(void *p) { MZ_FREE(p); } + +#ifndef MINIZ_NO_ZLIB_APIS + +static void *def_alloc_func(void *opaque, size_t items, size_t size) { + (void)opaque, (void)items, (void)size; + return MZ_MALLOC(items * size); +} +static void def_free_func(void *opaque, void *address) { + (void)opaque, (void)address; + MZ_FREE(address); +} +// static void *def_realloc_func(void *opaque, void *address, size_t items, +// size_t size) { +// (void)opaque, (void)address, (void)items, (void)size; +// return MZ_REALLOC(address, items * size); +//} + +const char *mz_version(void) { return MZ_VERSION; } + +int mz_deflateInit(mz_streamp pStream, int level) { + return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9, + MZ_DEFAULT_STRATEGY); +} + +int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, + int mem_level, int strategy) { + tdefl_compressor *pComp; + mz_uint comp_flags = + TDEFL_COMPUTE_ADLER32 | + tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy); + + if (!pStream) return MZ_STREAM_ERROR; + if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) || + ((window_bits != MZ_DEFAULT_WINDOW_BITS) && + (-window_bits != MZ_DEFAULT_WINDOW_BITS))) + return MZ_PARAM_ERROR; + + pStream->data_type = 0; + pStream->adler = MZ_ADLER32_INIT; + pStream->msg = NULL; + pStream->reserved = 0; + pStream->total_in = 0; + pStream->total_out = 0; + if (!pStream->zalloc) pStream->zalloc = def_alloc_func; + if (!pStream->zfree) pStream->zfree = def_free_func; + + pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1, + sizeof(tdefl_compressor)); + if (!pComp) return MZ_MEM_ERROR; + + pStream->state = (struct mz_internal_state *)pComp; + + if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY) { + mz_deflateEnd(pStream); + return MZ_PARAM_ERROR; + } + + return MZ_OK; +} + +int mz_deflateReset(mz_streamp pStream) { + if ((!pStream) || (!pStream->state) || (!pStream->zalloc) || + (!pStream->zfree)) + return MZ_STREAM_ERROR; + pStream->total_in = pStream->total_out = 0; + tdefl_init((tdefl_compressor *)pStream->state, NULL, NULL, + ((tdefl_compressor *)pStream->state)->m_flags); + return MZ_OK; +} + +int mz_deflate(mz_streamp pStream, int flush) { + size_t in_bytes, out_bytes; + mz_ulong orig_total_in, orig_total_out; + int mz_status = MZ_OK; + + if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) || + (!pStream->next_out)) + return MZ_STREAM_ERROR; + if (!pStream->avail_out) return MZ_BUF_ERROR; + + if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH; + + if (((tdefl_compressor *)pStream->state)->m_prev_return_status == + TDEFL_STATUS_DONE) + return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR; + + orig_total_in = pStream->total_in; + orig_total_out = pStream->total_out; + for (;;) { + tdefl_status defl_status; + in_bytes = pStream->avail_in; + out_bytes = pStream->avail_out; + + defl_status = tdefl_compress((tdefl_compressor *)pStream->state, + pStream->next_in, &in_bytes, pStream->next_out, + &out_bytes, (tdefl_flush)flush); + pStream->next_in += (mz_uint)in_bytes; + pStream->avail_in -= (mz_uint)in_bytes; + pStream->total_in += (mz_uint)in_bytes; + pStream->adler = tdefl_get_adler32((tdefl_compressor *)pStream->state); + + pStream->next_out += (mz_uint)out_bytes; + pStream->avail_out -= (mz_uint)out_bytes; + pStream->total_out += (mz_uint)out_bytes; + + if (defl_status < 0) { + mz_status = MZ_STREAM_ERROR; + break; + } else if (defl_status == TDEFL_STATUS_DONE) { + mz_status = MZ_STREAM_END; + break; + } else if (!pStream->avail_out) + break; + else if ((!pStream->avail_in) && (flush != MZ_FINISH)) { + if ((flush) || (pStream->total_in != orig_total_in) || + (pStream->total_out != orig_total_out)) + break; + return MZ_BUF_ERROR; // Can't make forward progress without some input. + } + } + return mz_status; +} + +int mz_deflateEnd(mz_streamp pStream) { + if (!pStream) return MZ_STREAM_ERROR; + if (pStream->state) { + pStream->zfree(pStream->opaque, pStream->state); + pStream->state = NULL; + } + return MZ_OK; +} + +mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len) { + (void)pStream; + // This is really over conservative. (And lame, but it's actually pretty + // tricky to compute a true upper bound given the way tdefl's blocking works.) + return MZ_MAX(128 + (source_len * 110) / 100, + 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5); +} + +int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, + const unsigned char *pSource, mz_ulong source_len, int level) { + int status; + mz_stream stream; + memset(&stream, 0, sizeof(stream)); + + // In case mz_ulong is 64-bits (argh I hate longs). + if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR; + + stream.next_in = pSource; + stream.avail_in = (mz_uint32)source_len; + stream.next_out = pDest; + stream.avail_out = (mz_uint32)*pDest_len; + + status = mz_deflateInit(&stream, level); + if (status != MZ_OK) return status; + + status = mz_deflate(&stream, MZ_FINISH); + if (status != MZ_STREAM_END) { + mz_deflateEnd(&stream); + return (status == MZ_OK) ? MZ_BUF_ERROR : status; + } + + *pDest_len = stream.total_out; + return mz_deflateEnd(&stream); +} + +int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, + const unsigned char *pSource, mz_ulong source_len) { + return mz_compress2(pDest, pDest_len, pSource, source_len, + MZ_DEFAULT_COMPRESSION); +} + +mz_ulong mz_compressBound(mz_ulong source_len) { + return mz_deflateBound(NULL, source_len); +} + +typedef struct { + tinfl_decompressor m_decomp; + mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; + int m_window_bits; + mz_uint8 m_dict[TINFL_LZ_DICT_SIZE]; + tinfl_status m_last_status; +} inflate_state; + +int mz_inflateInit2(mz_streamp pStream, int window_bits) { + inflate_state *pDecomp; + if (!pStream) return MZ_STREAM_ERROR; + if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && + (-window_bits != MZ_DEFAULT_WINDOW_BITS)) + return MZ_PARAM_ERROR; + + pStream->data_type = 0; + pStream->adler = 0; + pStream->msg = NULL; + pStream->total_in = 0; + pStream->total_out = 0; + pStream->reserved = 0; + if (!pStream->zalloc) pStream->zalloc = def_alloc_func; + if (!pStream->zfree) pStream->zfree = def_free_func; + + pDecomp = (inflate_state *)pStream->zalloc(pStream->opaque, 1, + sizeof(inflate_state)); + if (!pDecomp) return MZ_MEM_ERROR; + + pStream->state = (struct mz_internal_state *)pDecomp; + + tinfl_init(&pDecomp->m_decomp); + pDecomp->m_dict_ofs = 0; + pDecomp->m_dict_avail = 0; + pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT; + pDecomp->m_first_call = 1; + pDecomp->m_has_flushed = 0; + pDecomp->m_window_bits = window_bits; + + return MZ_OK; +} + +int mz_inflateInit(mz_streamp pStream) { + return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS); +} + +int mz_inflate(mz_streamp pStream, int flush) { + inflate_state *pState; + mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32; + size_t in_bytes, out_bytes, orig_avail_in; + tinfl_status status; + + if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR; + if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH; + if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) + return MZ_STREAM_ERROR; + + pState = (inflate_state *)pStream->state; + if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER; + orig_avail_in = pStream->avail_in; + + first_call = pState->m_first_call; + pState->m_first_call = 0; + if (pState->m_last_status < 0) return MZ_DATA_ERROR; + + if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR; + pState->m_has_flushed |= (flush == MZ_FINISH); + + if ((flush == MZ_FINISH) && (first_call)) { + // MZ_FINISH on the first call implies that the input and output buffers are + // large enough to hold the entire compressed/decompressed file. + decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF; + in_bytes = pStream->avail_in; + out_bytes = pStream->avail_out; + status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, + pStream->next_out, pStream->next_out, &out_bytes, + decomp_flags); + pState->m_last_status = status; + pStream->next_in += (mz_uint)in_bytes; + pStream->avail_in -= (mz_uint)in_bytes; + pStream->total_in += (mz_uint)in_bytes; + pStream->adler = tinfl_get_adler32(&pState->m_decomp); + pStream->next_out += (mz_uint)out_bytes; + pStream->avail_out -= (mz_uint)out_bytes; + pStream->total_out += (mz_uint)out_bytes; + + if (status < 0) + return MZ_DATA_ERROR; + else if (status != TINFL_STATUS_DONE) { + pState->m_last_status = TINFL_STATUS_FAILED; + return MZ_BUF_ERROR; + } + return MZ_STREAM_END; + } + // flush != MZ_FINISH then we must assume there's more input. + if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT; + + if (pState->m_dict_avail) { + n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); + memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); + pStream->next_out += n; + pStream->avail_out -= n; + pStream->total_out += n; + pState->m_dict_avail -= n; + pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); + return ((pState->m_last_status == TINFL_STATUS_DONE) && + (!pState->m_dict_avail)) + ? MZ_STREAM_END + : MZ_OK; + } + + for (;;) { + in_bytes = pStream->avail_in; + out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs; + + status = tinfl_decompress( + &pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, + pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags); + pState->m_last_status = status; + + pStream->next_in += (mz_uint)in_bytes; + pStream->avail_in -= (mz_uint)in_bytes; + pStream->total_in += (mz_uint)in_bytes; + pStream->adler = tinfl_get_adler32(&pState->m_decomp); + + pState->m_dict_avail = (mz_uint)out_bytes; + + n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); + memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); + pStream->next_out += n; + pStream->avail_out -= n; + pStream->total_out += n; + pState->m_dict_avail -= n; + pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); + + if (status < 0) + return MZ_DATA_ERROR; // Stream is corrupted (there could be some + // uncompressed data left in the output dictionary - + // oh well). + else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in)) + return MZ_BUF_ERROR; // Signal caller that we can't make forward progress + // without supplying more input or by setting flush + // to MZ_FINISH. + else if (flush == MZ_FINISH) { + // The output buffer MUST be large to hold the remaining uncompressed data + // when flush==MZ_FINISH. + if (status == TINFL_STATUS_DONE) + return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END; + // status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's + // at least 1 more byte on the way. If there's no more room left in the + // output buffer then something is wrong. + else if (!pStream->avail_out) + return MZ_BUF_ERROR; + } else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || + (!pStream->avail_out) || (pState->m_dict_avail)) + break; + } + + return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) + ? MZ_STREAM_END + : MZ_OK; +} + +int mz_inflateEnd(mz_streamp pStream) { + if (!pStream) return MZ_STREAM_ERROR; + if (pStream->state) { + pStream->zfree(pStream->opaque, pStream->state); + pStream->state = NULL; + } + return MZ_OK; +} + +int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, + const unsigned char *pSource, mz_ulong source_len) { + mz_stream stream; + int status; + memset(&stream, 0, sizeof(stream)); + + // In case mz_ulong is 64-bits (argh I hate longs). + if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR; + + stream.next_in = pSource; + stream.avail_in = (mz_uint32)source_len; + stream.next_out = pDest; + stream.avail_out = (mz_uint32)*pDest_len; + + status = mz_inflateInit(&stream); + if (status != MZ_OK) return status; + + status = mz_inflate(&stream, MZ_FINISH); + if (status != MZ_STREAM_END) { + mz_inflateEnd(&stream); + return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR + : status; + } + *pDest_len = stream.total_out; + + return mz_inflateEnd(&stream); +} + +const char *mz_error(int err) { + static struct { + int m_err; + const char *m_pDesc; + } s_error_descs[] = {{MZ_OK, ""}, + {MZ_STREAM_END, "stream end"}, + {MZ_NEED_DICT, "need dictionary"}, + {MZ_ERRNO, "file error"}, + {MZ_STREAM_ERROR, "stream error"}, + {MZ_DATA_ERROR, "data error"}, + {MZ_MEM_ERROR, "out of memory"}, + {MZ_BUF_ERROR, "buf error"}, + {MZ_VERSION_ERROR, "version error"}, + {MZ_PARAM_ERROR, "parameter error"}}; + mz_uint i; + for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) + if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc; + return NULL; +} + +#endif // MINIZ_NO_ZLIB_APIS + +// ------------------- Low-level Decompression (completely independent from all +// compression API's) + +#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l) +#define TINFL_MEMSET(p, c, l) memset(p, c, l) + +#define TINFL_CR_BEGIN \ + switch (r->m_state) { \ + case 0: +#define TINFL_CR_RETURN(state_index, result) \ + do { \ + status = result; \ + r->m_state = state_index; \ + goto common_exit; \ + case state_index:; \ + } \ + MZ_MACRO_END +#define TINFL_CR_RETURN_FOREVER(state_index, result) \ + do { \ + for (;;) { \ + TINFL_CR_RETURN(state_index, result); \ + } \ + } \ + MZ_MACRO_END +#define TINFL_CR_FINISH } + +// TODO: If the caller has indicated that there's no more input, and we attempt +// to read beyond the input buf, then something is wrong with the input because +// the inflator never +// reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of +// the stream with 0's in this scenario. +#define TINFL_GET_BYTE(state_index, c) \ + do { \ + if (pIn_buf_cur >= pIn_buf_end) { \ + for (;;) { \ + if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \ + TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \ + if (pIn_buf_cur < pIn_buf_end) { \ + c = *pIn_buf_cur++; \ + break; \ + } \ + } else { \ + c = 0; \ + break; \ + } \ + } \ + } else \ + c = *pIn_buf_cur++; \ + } \ + MZ_MACRO_END + +#define TINFL_NEED_BITS(state_index, n) \ + do { \ + mz_uint c; \ + TINFL_GET_BYTE(state_index, c); \ + bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); \ + num_bits += 8; \ + } while (num_bits < (mz_uint)(n)) +#define TINFL_SKIP_BITS(state_index, n) \ + do { \ + if (num_bits < (mz_uint)(n)) { \ + TINFL_NEED_BITS(state_index, n); \ + } \ + bit_buf >>= (n); \ + num_bits -= (n); \ + } \ + MZ_MACRO_END +#define TINFL_GET_BITS(state_index, b, n) \ + do { \ + if (num_bits < (mz_uint)(n)) { \ + TINFL_NEED_BITS(state_index, n); \ + } \ + b = bit_buf & ((1 << (n)) - 1); \ + bit_buf >>= (n); \ + num_bits -= (n); \ + } \ + MZ_MACRO_END + +// TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes +// remaining in the input buffer falls below 2. +// It reads just enough bytes from the input stream that are needed to decode +// the next Huffman code (and absolutely no more). It works by trying to fully +// decode a +// Huffman code by using whatever bits are currently present in the bit buffer. +// If this fails, it reads another byte, and tries again until it succeeds or +// until the +// bit buffer contains >=15 bits (deflate's max. Huffman code size). +#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \ + do { \ + temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \ + if (temp >= 0) { \ + code_len = temp >> 9; \ + if ((code_len) && (num_bits >= code_len)) break; \ + } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \ + code_len = TINFL_FAST_LOOKUP_BITS; \ + do { \ + temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \ + } while ((temp < 0) && (num_bits >= (code_len + 1))); \ + if (temp >= 0) break; \ + } \ + TINFL_GET_BYTE(state_index, c); \ + bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); \ + num_bits += 8; \ + } while (num_bits < 15); + +// TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex +// than you would initially expect because the zlib API expects the decompressor +// to never read +// beyond the final byte of the deflate stream. (In other words, when this macro +// wants to read another byte from the input, it REALLY needs another byte in +// order to fully +// decode the next Huffman code.) Handling this properly is particularly +// important on raw deflate (non-zlib) streams, which aren't followed by a byte +// aligned adler-32. +// The slow path is only executed at the very end of the input buffer. +#define TINFL_HUFF_DECODE(state_index, sym, pHuff) \ + do { \ + int temp; \ + mz_uint code_len, c; \ + if (num_bits < 15) { \ + if ((pIn_buf_end - pIn_buf_cur) < 2) { \ + TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \ + } else { \ + bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | \ + (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); \ + pIn_buf_cur += 2; \ + num_bits += 16; \ + } \ + } \ + if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= \ + 0) \ + code_len = temp >> 9, temp &= 511; \ + else { \ + code_len = TINFL_FAST_LOOKUP_BITS; \ + do { \ + temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \ + } while (temp < 0); \ + } \ + sym = temp; \ + bit_buf >>= code_len; \ + num_bits -= code_len; \ + } \ + MZ_MACRO_END + +tinfl_status tinfl_decompress(tinfl_decompressor *r, + const mz_uint8 *pIn_buf_next, + size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, + mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, + const mz_uint32 decomp_flags) { + static const int s_length_base[31] = { + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const int s_length_extra[31] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, + 4, 4, 5, 5, 5, 5, 0, 0, 0}; + static const int s_dist_base[32] = { + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, + 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, + 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0}; + static const int s_dist_extra[32] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, + 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, + 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + static const mz_uint8 s_length_dezigzag[19] = { + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + static const int s_min_table_sizes[3] = {257, 1, 4}; + + tinfl_status status = TINFL_STATUS_FAILED; + mz_uint32 num_bits, dist, counter, num_extra; + tinfl_bit_buf_t bit_buf; + const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = + pIn_buf_next + *pIn_buf_size; + mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = + pOut_buf_next + *pOut_buf_size; + size_t out_buf_size_mask = + (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) + ? (size_t)-1 + : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, + dist_from_out_buf_start; + + // Ensure the output buffer's size is a power of 2, unless the output buffer + // is large enough to hold the entire output file (in which case it doesn't + // matter). + if (((out_buf_size_mask + 1) & out_buf_size_mask) || + (pOut_buf_next < pOut_buf_start)) { + *pIn_buf_size = *pOut_buf_size = 0; + return TINFL_STATUS_BAD_PARAM; + } + + num_bits = r->m_num_bits; + bit_buf = r->m_bit_buf; + dist = r->m_dist; + counter = r->m_counter; + num_extra = r->m_num_extra; + dist_from_out_buf_start = r->m_dist_from_out_buf_start; + TINFL_CR_BEGIN + + bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; + r->m_z_adler32 = r->m_check_adler32 = 1; + if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) { + TINFL_GET_BYTE(1, r->m_zhdr0); + TINFL_GET_BYTE(2, r->m_zhdr1); + counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || + (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8)); + if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) + counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || + ((out_buf_size_mask + 1) < + (size_t)(1ULL << (8U + (r->m_zhdr0 >> 4))))); + if (counter) { + TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); + } + } + + do { + TINFL_GET_BITS(3, r->m_final, 3); + r->m_type = r->m_final >> 1; + if (r->m_type == 0) { + TINFL_SKIP_BITS(5, num_bits & 7); + for (counter = 0; counter < 4; ++counter) { + if (num_bits) + TINFL_GET_BITS(6, r->m_raw_header[counter], 8); + else + TINFL_GET_BYTE(7, r->m_raw_header[counter]); + } + if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != + (mz_uint)(0xFFFF ^ + (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { + TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); + } + while ((counter) && (num_bits)) { + TINFL_GET_BITS(51, dist, 8); + while (pOut_buf_cur >= pOut_buf_end) { + TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); + } + *pOut_buf_cur++ = (mz_uint8)dist; + counter--; + } + while (counter) { + size_t n; + while (pOut_buf_cur >= pOut_buf_end) { + TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); + } + while (pIn_buf_cur >= pIn_buf_end) { + if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { + TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT); + } else { + TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED); + } + } + n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), + (size_t)(pIn_buf_end - pIn_buf_cur)), + counter); + TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); + pIn_buf_cur += n; + pOut_buf_cur += n; + counter -= (mz_uint)n; + } + } else if (r->m_type == 3) { + TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED); + } else { + if (r->m_type == 1) { + mz_uint8 *p = r->m_tables[0].m_code_size; + mz_uint i; + r->m_table_sizes[0] = 288; + r->m_table_sizes[1] = 32; + TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32); + for (i = 0; i <= 143; ++i) *p++ = 8; + for (; i <= 255; ++i) *p++ = 9; + for (; i <= 279; ++i) *p++ = 7; + for (; i <= 287; ++i) *p++ = 8; + } else { + for (counter = 0; counter < 3; counter++) { + TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); + r->m_table_sizes[counter] += s_min_table_sizes[counter]; + } + MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); + for (counter = 0; counter < r->m_table_sizes[2]; counter++) { + mz_uint s; + TINFL_GET_BITS(14, s, 3); + r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; + } + r->m_table_sizes[2] = 19; + } + for (; (int)r->m_type >= 0; r->m_type--) { + int tree_next, tree_cur; + tinfl_huff_table *pTable; + mz_uint i, j, used_syms, total, sym_index, next_code[17], + total_syms[16]; + pTable = &r->m_tables[r->m_type]; + MZ_CLEAR_OBJ(total_syms); + MZ_CLEAR_OBJ(pTable->m_look_up); + MZ_CLEAR_OBJ(pTable->m_tree); + for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) + total_syms[pTable->m_code_size[i]]++; + used_syms = 0, total = 0; + next_code[0] = next_code[1] = 0; + for (i = 1; i <= 15; ++i) { + used_syms += total_syms[i]; + next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); + } + if ((65536 != total) && (used_syms > 1)) { + TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED); + } + for (tree_next = -1, sym_index = 0; + sym_index < r->m_table_sizes[r->m_type]; ++sym_index) { + mz_uint rev_code = 0, l, cur_code, + code_size = pTable->m_code_size[sym_index]; + if (!code_size) continue; + cur_code = next_code[code_size]++; + for (l = code_size; l > 0; l--, cur_code >>= 1) + rev_code = (rev_code << 1) | (cur_code & 1); + if (code_size <= TINFL_FAST_LOOKUP_BITS) { + mz_int16 k = (mz_int16)((code_size << 9) | sym_index); + while (rev_code < TINFL_FAST_LOOKUP_SIZE) { + pTable->m_look_up[rev_code] = k; + rev_code += (1 << code_size); + } + continue; + } + if (0 == + (tree_cur = pTable->m_look_up[rev_code & + (TINFL_FAST_LOOKUP_SIZE - 1)])) { + pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = + (mz_int16)tree_next; + tree_cur = tree_next; + tree_next -= 2; + } + rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1); + for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--) { + tree_cur -= ((rev_code >>= 1) & 1); + if (!pTable->m_tree[-tree_cur - 1]) { + pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; + tree_cur = tree_next; + tree_next -= 2; + } else + tree_cur = pTable->m_tree[-tree_cur - 1]; + } + tree_cur -= ((rev_code >>= 1) & 1); + pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index; + } + if (r->m_type == 2) { + for (counter = 0; + counter < (r->m_table_sizes[0] + r->m_table_sizes[1]);) { + mz_uint s; + TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); + if (dist < 16) { + r->m_len_codes[counter++] = (mz_uint8)dist; + continue; + } + if ((dist == 16) && (!counter)) { + TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED); + } + num_extra = "\02\03\07"[dist - 16]; + TINFL_GET_BITS(18, s, num_extra); + s += "\03\03\013"[dist - 16]; + TINFL_MEMSET(r->m_len_codes + counter, + (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); + counter += s; + } + if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter) { + TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED); + } + TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, + r->m_table_sizes[0]); + TINFL_MEMCPY(r->m_tables[1].m_code_size, + r->m_len_codes + r->m_table_sizes[0], + r->m_table_sizes[1]); + } + } + for (;;) { + mz_uint8 *pSrc; + for (;;) { + if (((pIn_buf_end - pIn_buf_cur) < 4) || + ((pOut_buf_end - pOut_buf_cur) < 2)) { + TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]); + if (counter >= 256) break; + while (pOut_buf_cur >= pOut_buf_end) { + TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); + } + *pOut_buf_cur++ = (mz_uint8)counter; + } else { + int sym2; + mz_uint code_len; +#if TINFL_USE_64BIT_BITBUF + if (num_bits < 30) { + bit_buf |= + (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); + pIn_buf_cur += 4; + num_bits += 32; + } +#else + if (num_bits < 15) { + bit_buf |= + (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); + pIn_buf_cur += 2; + num_bits += 16; + } +#endif + if ((sym2 = + r->m_tables[0] + .m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= + 0) + code_len = sym2 >> 9; + else { + code_len = TINFL_FAST_LOOKUP_BITS; + do { + sym2 = r->m_tables[0] + .m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; + } while (sym2 < 0); + } + counter = sym2; + bit_buf >>= code_len; + num_bits -= code_len; + if (counter & 256) break; + +#if !TINFL_USE_64BIT_BITBUF + if (num_bits < 15) { + bit_buf |= + (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); + pIn_buf_cur += 2; + num_bits += 16; + } +#endif + if ((sym2 = + r->m_tables[0] + .m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= + 0) + code_len = sym2 >> 9; + else { + code_len = TINFL_FAST_LOOKUP_BITS; + do { + sym2 = r->m_tables[0] + .m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; + } while (sym2 < 0); + } + bit_buf >>= code_len; + num_bits -= code_len; + + pOut_buf_cur[0] = (mz_uint8)counter; + if (sym2 & 256) { + pOut_buf_cur++; + counter = sym2; + break; + } + pOut_buf_cur[1] = (mz_uint8)sym2; + pOut_buf_cur += 2; + } + } + if ((counter &= 511) == 256) break; + + num_extra = s_length_extra[counter - 257]; + counter = s_length_base[counter - 257]; + if (num_extra) { + mz_uint extra_bits; + TINFL_GET_BITS(25, extra_bits, num_extra); + counter += extra_bits; + } + + TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]); + num_extra = s_dist_extra[dist]; + dist = s_dist_base[dist]; + if (num_extra) { + mz_uint extra_bits; + TINFL_GET_BITS(27, extra_bits, num_extra); + dist += extra_bits; + } + + dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start; + if ((dist > dist_from_out_buf_start) && + (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) { + TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED); + } + + pSrc = pOut_buf_start + + ((dist_from_out_buf_start - dist) & out_buf_size_mask); + + if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end) { + while (counter--) { + while (pOut_buf_cur >= pOut_buf_end) { + TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); + } + *pOut_buf_cur++ = + pOut_buf_start[(dist_from_out_buf_start++ - dist) & + out_buf_size_mask]; + } + continue; + } +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES + else if ((counter >= 9) && (counter <= dist)) { + const mz_uint8 *pSrc_end = pSrc + (counter & ~7); + do { + ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0]; + ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1]; + pOut_buf_cur += 8; + } while ((pSrc += 8) < pSrc_end); + if ((counter &= 7) < 3) { + if (counter) { + pOut_buf_cur[0] = pSrc[0]; + if (counter > 1) pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur += counter; + } + continue; + } + } +#endif + do { + pOut_buf_cur[0] = pSrc[0]; + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur[2] = pSrc[2]; + pOut_buf_cur += 3; + pSrc += 3; + } while ((int)(counter -= 3) > 2); + if ((int)counter > 0) { + pOut_buf_cur[0] = pSrc[0]; + if ((int)counter > 1) pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur += counter; + } + } + } + } while (!(r->m_final & 1)); + if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) { + TINFL_SKIP_BITS(32, num_bits & 7); + for (counter = 0; counter < 4; ++counter) { + mz_uint s; + if (num_bits) + TINFL_GET_BITS(41, s, 8); + else + TINFL_GET_BYTE(42, s); + r->m_z_adler32 = (r->m_z_adler32 << 8) | s; + } + } + TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE); + TINFL_CR_FINISH + +common_exit: + r->m_num_bits = num_bits; + r->m_bit_buf = bit_buf; + r->m_dist = dist; + r->m_counter = counter; + r->m_num_extra = num_extra; + r->m_dist_from_out_buf_start = dist_from_out_buf_start; + *pIn_buf_size = pIn_buf_cur - pIn_buf_next; + *pOut_buf_size = pOut_buf_cur - pOut_buf_next; + if ((decomp_flags & + (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && + (status >= 0)) { + const mz_uint8 *ptr = pOut_buf_next; + size_t buf_len = *pOut_buf_size; + mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, + s2 = r->m_check_adler32 >> 16; + size_t block_len = buf_len % 5552; + while (buf_len) { + for (i = 0; i + 7 < block_len; i += 8, ptr += 8) { + s1 += ptr[0], s2 += s1; + s1 += ptr[1], s2 += s1; + s1 += ptr[2], s2 += s1; + s1 += ptr[3], s2 += s1; + s1 += ptr[4], s2 += s1; + s1 += ptr[5], s2 += s1; + s1 += ptr[6], s2 += s1; + s1 += ptr[7], s2 += s1; + } + for (; i < block_len; ++i) s1 += *ptr++, s2 += s1; + s1 %= 65521U, s2 %= 65521U; + buf_len -= block_len; + block_len = 5552; + } + r->m_check_adler32 = (s2 << 16) + s1; + if ((status == TINFL_STATUS_DONE) && + (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && + (r->m_check_adler32 != r->m_z_adler32)) + status = TINFL_STATUS_ADLER32_MISMATCH; + } + return status; +} + +// Higher level helper functions. +void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, + size_t *pOut_len, int flags) { + tinfl_decompressor decomp; + void *pBuf = NULL, *pNew_buf; + size_t src_buf_ofs = 0, out_buf_capacity = 0; + *pOut_len = 0; + tinfl_init(&decomp); + for (;;) { + size_t src_buf_size = src_buf_len - src_buf_ofs, + dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity; + tinfl_status status = tinfl_decompress( + &decomp, (const mz_uint8 *)pSrc_buf + src_buf_ofs, &src_buf_size, + (mz_uint8 *)pBuf, pBuf ? (mz_uint8 *)pBuf + *pOut_len : NULL, + &dst_buf_size, + (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) { + MZ_FREE(pBuf); + *pOut_len = 0; + return NULL; + } + src_buf_ofs += src_buf_size; + *pOut_len += dst_buf_size; + if (status == TINFL_STATUS_DONE) break; + new_out_buf_capacity = out_buf_capacity * 2; + if (new_out_buf_capacity < 128) new_out_buf_capacity = 128; + pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity); + if (!pNew_buf) { + MZ_FREE(pBuf); + *pOut_len = 0; + return NULL; + } + pBuf = pNew_buf; + out_buf_capacity = new_out_buf_capacity; + } + return pBuf; +} + +size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, + const void *pSrc_buf, size_t src_buf_len, + int flags) { + tinfl_decompressor decomp; + tinfl_status status; + tinfl_init(&decomp); + status = + tinfl_decompress(&decomp, (const mz_uint8 *)pSrc_buf, &src_buf_len, + (mz_uint8 *)pOut_buf, (mz_uint8 *)pOut_buf, &out_buf_len, + (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED + : out_buf_len; +} + +int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, + tinfl_put_buf_func_ptr pPut_buf_func, + void *pPut_buf_user, int flags) { + int result = 0; + tinfl_decompressor decomp; + mz_uint8 *pDict = (mz_uint8 *)MZ_MALLOC(TINFL_LZ_DICT_SIZE); + size_t in_buf_ofs = 0, dict_ofs = 0; + if (!pDict) return TINFL_STATUS_FAILED; + tinfl_init(&decomp); + for (;;) { + size_t in_buf_size = *pIn_buf_size - in_buf_ofs, + dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs; + tinfl_status status = + tinfl_decompress(&decomp, (const mz_uint8 *)pIn_buf + in_buf_ofs, + &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size, + (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))); + in_buf_ofs += in_buf_size; + if ((dst_buf_size) && + (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user))) + break; + if (status != TINFL_STATUS_HAS_MORE_OUTPUT) { + result = (status == TINFL_STATUS_DONE); + break; + } + dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1); + } + MZ_FREE(pDict); + *pIn_buf_size = in_buf_ofs; + return result; +} + +// ------------------- Low-level Compression (independent from all decompression +// API's) + +// Purposely making these tables static for faster init and thread safety. +static const mz_uint16 s_tdefl_len_sym[256] = { + 257, 258, 259, 260, 261, 262, 263, 264, 265, 265, 266, 266, 267, 267, 268, + 268, 269, 269, 269, 269, 270, 270, 270, 270, 271, 271, 271, 271, 272, 272, + 272, 272, 273, 273, 273, 273, 273, 273, 273, 273, 274, 274, 274, 274, 274, + 274, 274, 274, 275, 275, 275, 275, 275, 275, 275, 275, 276, 276, 276, 276, + 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 279, 279, 279, 279, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 284, + 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, + 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, + 285}; + +static const mz_uint8 s_tdefl_len_extra[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0}; + +static const mz_uint8 s_tdefl_small_dist_sym[512] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, + 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}; + +static const mz_uint8 s_tdefl_small_dist_extra[512] = { + 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; + +static const mz_uint8 s_tdefl_large_dist_sym[128] = { + 0, 0, 18, 19, 20, 20, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, + 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}; + +static const mz_uint8 s_tdefl_large_dist_extra[128] = { + 0, 0, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}; + +// Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted +// values. +typedef struct { + mz_uint16 m_key, m_sym_index; +} tdefl_sym_freq; +static tdefl_sym_freq *tdefl_radix_sort_syms(mz_uint num_syms, + tdefl_sym_freq *pSyms0, + tdefl_sym_freq *pSyms1) { + mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2]; + tdefl_sym_freq *pCur_syms = pSyms0, *pNew_syms = pSyms1; + MZ_CLEAR_OBJ(hist); + for (i = 0; i < num_syms; i++) { + mz_uint freq = pSyms0[i].m_key; + hist[freq & 0xFF]++; + hist[256 + ((freq >> 8) & 0xFF)]++; + } + while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) + total_passes--; + for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8) { + const mz_uint32 *pHist = &hist[pass << 8]; + mz_uint offsets[256], cur_ofs = 0; + for (i = 0; i < 256; i++) { + offsets[i] = cur_ofs; + cur_ofs += pHist[i]; + } + for (i = 0; i < num_syms; i++) + pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = + pCur_syms[i]; + { + tdefl_sym_freq *t = pCur_syms; + pCur_syms = pNew_syms; + pNew_syms = t; + } + } + return pCur_syms; +} + +// tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat, +// alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996. +static void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n) { + int root, leaf, next, avbl, used, dpth; + if (n == 0) + return; + else if (n == 1) { + A[0].m_key = 1; + return; + } + A[0].m_key += A[1].m_key; + root = 0; + leaf = 2; + for (next = 1; next < n - 1; next++) { + if (leaf >= n || A[root].m_key < A[leaf].m_key) { + A[next].m_key = A[root].m_key; + A[root++].m_key = (mz_uint16)next; + } else + A[next].m_key = A[leaf++].m_key; + if (leaf >= n || (root < next && A[root].m_key < A[leaf].m_key)) { + A[next].m_key = (mz_uint16)(A[next].m_key + A[root].m_key); + A[root++].m_key = (mz_uint16)next; + } else + A[next].m_key = (mz_uint16)(A[next].m_key + A[leaf++].m_key); + } + A[n - 2].m_key = 0; + for (next = n - 3; next >= 0; next--) + A[next].m_key = A[A[next].m_key].m_key + 1; + avbl = 1; + used = dpth = 0; + root = n - 2; + next = n - 1; + while (avbl > 0) { + while (root >= 0 && (int)A[root].m_key == dpth) { + used++; + root--; + } + while (avbl > used) { + A[next--].m_key = (mz_uint16)(dpth); + avbl--; + } + avbl = 2 * used; + dpth++; + used = 0; + } +} + +// Limits canonical Huffman code table's max code size. +enum { TDEFL_MAX_SUPPORTED_HUFF_CODESIZE = 32 }; +static void tdefl_huffman_enforce_max_code_size(int *pNum_codes, + int code_list_len, + int max_code_size) { + int i; + mz_uint32 total = 0; + if (code_list_len <= 1) return; + for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; i++) + pNum_codes[max_code_size] += pNum_codes[i]; + for (i = max_code_size; i > 0; i--) + total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i)); + while (total != (1UL << max_code_size)) { + pNum_codes[max_code_size]--; + for (i = max_code_size - 1; i > 0; i--) + if (pNum_codes[i]) { + pNum_codes[i]--; + pNum_codes[i + 1] += 2; + break; + } + total--; + } +} + +static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, + int table_len, int code_size_limit, + int static_table) { + int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE]; + mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1]; + MZ_CLEAR_OBJ(num_codes); + if (static_table) { + for (i = 0; i < table_len; i++) + num_codes[d->m_huff_code_sizes[table_num][i]]++; + } else { + tdefl_sym_freq syms0[TDEFL_MAX_HUFF_SYMBOLS], syms1[TDEFL_MAX_HUFF_SYMBOLS], + *pSyms; + int num_used_syms = 0; + const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0]; + for (i = 0; i < table_len; i++) + if (pSym_count[i]) { + syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i]; + syms0[num_used_syms++].m_sym_index = (mz_uint16)i; + } + + pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1); + tdefl_calculate_minimum_redundancy(pSyms, num_used_syms); + + for (i = 0; i < num_used_syms; i++) num_codes[pSyms[i].m_key]++; + + tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, + code_size_limit); + + MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]); + MZ_CLEAR_OBJ(d->m_huff_codes[table_num]); + for (i = 1, j = num_used_syms; i <= code_size_limit; i++) + for (l = num_codes[i]; l > 0; l--) + d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i); + } + + next_code[1] = 0; + for (j = 0, i = 2; i <= code_size_limit; i++) + next_code[i] = j = ((j + num_codes[i - 1]) << 1); + + for (i = 0; i < table_len; i++) { + mz_uint rev_code = 0, code, code_size; + if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0) continue; + code = next_code[code_size]++; + for (l = code_size; l > 0; l--, code >>= 1) + rev_code = (rev_code << 1) | (code & 1); + d->m_huff_codes[table_num][i] = (mz_uint16)rev_code; + } +} + +#define TDEFL_PUT_BITS(b, l) \ + do { \ + mz_uint bits = b; \ + mz_uint len = l; \ + MZ_ASSERT(bits <= ((1U << len) - 1U)); \ + d->m_bit_buffer |= (bits << d->m_bits_in); \ + d->m_bits_in += len; \ + while (d->m_bits_in >= 8) { \ + if (d->m_pOutput_buf < d->m_pOutput_buf_end) \ + *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \ + d->m_bit_buffer >>= 8; \ + d->m_bits_in -= 8; \ + } \ + } \ + MZ_MACRO_END + +#define TDEFL_RLE_PREV_CODE_SIZE() \ + { \ + if (rle_repeat_count) { \ + if (rle_repeat_count < 3) { \ + d->m_huff_count[2][prev_code_size] = (mz_uint16)( \ + d->m_huff_count[2][prev_code_size] + rle_repeat_count); \ + while (rle_repeat_count--) \ + packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \ + } else { \ + d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); \ + packed_code_sizes[num_packed_code_sizes++] = 16; \ + packed_code_sizes[num_packed_code_sizes++] = \ + (mz_uint8)(rle_repeat_count - 3); \ + } \ + rle_repeat_count = 0; \ + } \ + } + +#define TDEFL_RLE_ZERO_CODE_SIZE() \ + { \ + if (rle_z_count) { \ + if (rle_z_count < 3) { \ + d->m_huff_count[2][0] = \ + (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); \ + while (rle_z_count--) packed_code_sizes[num_packed_code_sizes++] = 0; \ + } else if (rle_z_count <= 10) { \ + d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); \ + packed_code_sizes[num_packed_code_sizes++] = 17; \ + packed_code_sizes[num_packed_code_sizes++] = \ + (mz_uint8)(rle_z_count - 3); \ + } else { \ + d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); \ + packed_code_sizes[num_packed_code_sizes++] = 18; \ + packed_code_sizes[num_packed_code_sizes++] = \ + (mz_uint8)(rle_z_count - 11); \ + } \ + rle_z_count = 0; \ + } \ + } + +static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +static void tdefl_start_dynamic_block(tdefl_compressor *d) { + int num_lit_codes, num_dist_codes, num_bit_lengths; + mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count, + rle_repeat_count, packed_code_sizes_index; + mz_uint8 + code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], + packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], + prev_code_size = 0xFF; + + d->m_huff_count[0][256] = 1; + + tdefl_optimize_huffman_table(d, 0, TDEFL_MAX_HUFF_SYMBOLS_0, 15, MZ_FALSE); + tdefl_optimize_huffman_table(d, 1, TDEFL_MAX_HUFF_SYMBOLS_1, 15, MZ_FALSE); + + for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--) + if (d->m_huff_code_sizes[0][num_lit_codes - 1]) break; + for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--) + if (d->m_huff_code_sizes[1][num_dist_codes - 1]) break; + + memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes); + memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0], + num_dist_codes); + total_code_sizes_to_pack = num_lit_codes + num_dist_codes; + num_packed_code_sizes = 0; + rle_z_count = 0; + rle_repeat_count = 0; + + memset(&d->m_huff_count[2][0], 0, + sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2); + for (i = 0; i < total_code_sizes_to_pack; i++) { + mz_uint8 code_size = code_sizes_to_pack[i]; + if (!code_size) { + TDEFL_RLE_PREV_CODE_SIZE(); + if (++rle_z_count == 138) { + TDEFL_RLE_ZERO_CODE_SIZE(); + } + } else { + TDEFL_RLE_ZERO_CODE_SIZE(); + if (code_size != prev_code_size) { + TDEFL_RLE_PREV_CODE_SIZE(); + d->m_huff_count[2][code_size] = + (mz_uint16)(d->m_huff_count[2][code_size] + 1); + packed_code_sizes[num_packed_code_sizes++] = code_size; + } else if (++rle_repeat_count == 6) { + TDEFL_RLE_PREV_CODE_SIZE(); + } + } + prev_code_size = code_size; + } + if (rle_repeat_count) { + TDEFL_RLE_PREV_CODE_SIZE(); + } else { + TDEFL_RLE_ZERO_CODE_SIZE(); + } + + tdefl_optimize_huffman_table(d, 2, TDEFL_MAX_HUFF_SYMBOLS_2, 7, MZ_FALSE); + + TDEFL_PUT_BITS(2, 2); + + TDEFL_PUT_BITS(num_lit_codes - 257, 5); + TDEFL_PUT_BITS(num_dist_codes - 1, 5); + + for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--) + if (d->m_huff_code_sizes + [2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]]) + break; + num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1)); + TDEFL_PUT_BITS(num_bit_lengths - 4, 4); + for (i = 0; (int)i < num_bit_lengths; i++) + TDEFL_PUT_BITS( + d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3); + + for (packed_code_sizes_index = 0; + packed_code_sizes_index < num_packed_code_sizes;) { + mz_uint code = packed_code_sizes[packed_code_sizes_index++]; + MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2); + TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]); + if (code >= 16) + TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++], + "\02\03\07"[code - 16]); + } +} + +static void tdefl_start_static_block(tdefl_compressor *d) { + mz_uint i; + mz_uint8 *p = &d->m_huff_code_sizes[0][0]; + + for (i = 0; i <= 143; ++i) *p++ = 8; + for (; i <= 255; ++i) *p++ = 9; + for (; i <= 279; ++i) *p++ = 7; + for (; i <= 287; ++i) *p++ = 8; + + memset(d->m_huff_code_sizes[1], 5, 32); + + tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE); + tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE); + + TDEFL_PUT_BITS(1, 2); +} + +static const mz_uint mz_bitmasks[17] = { + 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, + 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF}; + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && \ + MINIZ_HAS_64BIT_REGISTERS +static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) { + mz_uint flags; + mz_uint8 *pLZ_codes; + mz_uint8 *pOutput_buf = d->m_pOutput_buf; + mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf; + mz_uint64 bit_buffer = d->m_bit_buffer; + mz_uint bits_in = d->m_bits_in; + +#define TDEFL_PUT_BITS_FAST(b, l) \ + { \ + bit_buffer |= (((mz_uint64)(b)) << bits_in); \ + bits_in += (l); \ + } + + flags = 1; + for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end; + flags >>= 1) { + if (flags == 1) flags = *pLZ_codes++ | 0x100; + + if (flags & 1) { + mz_uint s0, s1, n0, n1, sym, num_extra_bits; + mz_uint match_len = pLZ_codes[0], + match_dist = *(const mz_uint16 *)(pLZ_codes + 1); + pLZ_codes += 3; + + MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], + d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], + s_tdefl_len_extra[match_len]); + + // This sequence coaxes MSVC into using cmov's vs. jmp's. + s0 = s_tdefl_small_dist_sym[match_dist & 511]; + n0 = s_tdefl_small_dist_extra[match_dist & 511]; + s1 = s_tdefl_large_dist_sym[match_dist >> 8]; + n1 = s_tdefl_large_dist_extra[match_dist >> 8]; + sym = (match_dist < 512) ? s0 : s1; + num_extra_bits = (match_dist < 512) ? n0 : n1; + + MZ_ASSERT(d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym], + d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits], + num_extra_bits); + } else { + mz_uint lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], + d->m_huff_code_sizes[0][lit]); + + if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) { + flags >>= 1; + lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], + d->m_huff_code_sizes[0][lit]); + + if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) { + flags >>= 1; + lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], + d->m_huff_code_sizes[0][lit]); + } + } + } + + if (pOutput_buf >= d->m_pOutput_buf_end) return MZ_FALSE; + + *(mz_uint64 *)pOutput_buf = bit_buffer; + pOutput_buf += (bits_in >> 3); + bit_buffer >>= (bits_in & ~7); + bits_in &= 7; + } + +#undef TDEFL_PUT_BITS_FAST + + d->m_pOutput_buf = pOutput_buf; + d->m_bits_in = 0; + d->m_bit_buffer = 0; + + while (bits_in) { + mz_uint32 n = MZ_MIN(bits_in, 16); + TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n); + bit_buffer >>= n; + bits_in -= n; + } + + TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); + + return (d->m_pOutput_buf < d->m_pOutput_buf_end); +} +#else +static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) { + mz_uint flags; + mz_uint8 *pLZ_codes; + + flags = 1; + for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf; + flags >>= 1) { + if (flags == 1) flags = *pLZ_codes++ | 0x100; + if (flags & 1) { + mz_uint sym, num_extra_bits; + mz_uint match_len = pLZ_codes[0], + match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8)); + pLZ_codes += 3; + + MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], + d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], + s_tdefl_len_extra[match_len]); + + if (match_dist < 512) { + sym = s_tdefl_small_dist_sym[match_dist]; + num_extra_bits = s_tdefl_small_dist_extra[match_dist]; + } else { + sym = s_tdefl_large_dist_sym[match_dist >> 8]; + num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8]; + } + MZ_ASSERT(d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); + } else { + mz_uint lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + } + } + + TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); + + return (d->m_pOutput_buf < d->m_pOutput_buf_end); +} +#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && + // MINIZ_HAS_64BIT_REGISTERS + +static mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block) { + if (static_block) + tdefl_start_static_block(d); + else + tdefl_start_dynamic_block(d); + return tdefl_compress_lz_codes(d); +} + +static int tdefl_flush_block(tdefl_compressor *d, int flush) { + mz_uint saved_bit_buf, saved_bits_in; + mz_uint8 *pSaved_output_buf; + mz_bool comp_block_succeeded = MZ_FALSE; + int n, use_raw_block = + ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && + (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size; + mz_uint8 *pOutput_buf_start = + ((d->m_pPut_buf_func == NULL) && + ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE)) + ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs) + : d->m_output_buf; + + d->m_pOutput_buf = pOutput_buf_start; + d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16; + + MZ_ASSERT(!d->m_output_flush_remaining); + d->m_output_flush_ofs = 0; + d->m_output_flush_remaining = 0; + + *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left); + d->m_pLZ_code_buf -= (d->m_num_flags_left == 8); + + if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index)) { + TDEFL_PUT_BITS(0x78, 8); + TDEFL_PUT_BITS(0x01, 8); + } + + TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1); + + pSaved_output_buf = d->m_pOutput_buf; + saved_bit_buf = d->m_bit_buffer; + saved_bits_in = d->m_bits_in; + + if (!use_raw_block) + comp_block_succeeded = + tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || + (d->m_total_lz_bytes < 48)); + + // If the block gets expanded, forget the current contents of the output + // buffer and send a raw block instead. + if (((use_raw_block) || + ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >= + d->m_total_lz_bytes))) && + ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size)) { + mz_uint i; + d->m_pOutput_buf = pSaved_output_buf; + d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; + TDEFL_PUT_BITS(0, 2); + if (d->m_bits_in) { + TDEFL_PUT_BITS(0, 8 - d->m_bits_in); + } + for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF) { + TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16); + } + for (i = 0; i < d->m_total_lz_bytes; ++i) { + TDEFL_PUT_BITS( + d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK], + 8); + } + } + // Check for the extremely unlikely (if not impossible) case of the compressed + // block not fitting into the output buffer when using dynamic codes. + else if (!comp_block_succeeded) { + d->m_pOutput_buf = pSaved_output_buf; + d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; + tdefl_compress_block(d, MZ_TRUE); + } + + if (flush) { + if (flush == TDEFL_FINISH) { + if (d->m_bits_in) { + TDEFL_PUT_BITS(0, 8 - d->m_bits_in); + } + if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) { + mz_uint i, a = d->m_adler32; + for (i = 0; i < 4; i++) { + TDEFL_PUT_BITS((a >> 24) & 0xFF, 8); + a <<= 8; + } + } + } else { + mz_uint i, z = 0; + TDEFL_PUT_BITS(0, 3); + if (d->m_bits_in) { + TDEFL_PUT_BITS(0, 8 - d->m_bits_in); + } + for (i = 2; i; --i, z ^= 0xFFFF) { + TDEFL_PUT_BITS(z & 0xFFFF, 16); + } + } + } + + MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end); + + memset(&d->m_huff_count[0][0], 0, + sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); + memset(&d->m_huff_count[1][0], 0, + sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); + + d->m_pLZ_code_buf = d->m_lz_code_buf + 1; + d->m_pLZ_flags = d->m_lz_code_buf; + d->m_num_flags_left = 8; + d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes; + d->m_total_lz_bytes = 0; + d->m_block_index++; + + if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0) { + if (d->m_pPut_buf_func) { + *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; + if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user)) + return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED); + } else if (pOutput_buf_start == d->m_output_buf) { + int bytes_to_copy = (int)MZ_MIN( + (size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs)); + memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf, + bytes_to_copy); + d->m_out_buf_ofs += bytes_to_copy; + if ((n -= bytes_to_copy) != 0) { + d->m_output_flush_ofs = bytes_to_copy; + d->m_output_flush_remaining = n; + } + } else { + d->m_out_buf_ofs += n; + } + } + + return d->m_output_flush_remaining; +} + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES +#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16 *)(p) +static MZ_FORCEINLINE void tdefl_find_match( + tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, + mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) { + mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, + match_len = *pMatch_len, probe_pos = pos, next_probe_pos, + probe_len; + mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; + const mz_uint16 *s = (const mz_uint16 *)(d->m_dict + pos), *p, *q; + mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), + s01 = TDEFL_READ_UNALIGNED_WORD(s); + MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); + if (max_match_len <= match_len) return; + for (;;) { + for (;;) { + if (--num_probes_left == 0) return; +#define TDEFL_PROBE \ + next_probe_pos = d->m_next[probe_pos]; \ + if ((!next_probe_pos) || \ + ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) \ + return; \ + probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ + if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) \ + break; + TDEFL_PROBE; + TDEFL_PROBE; + TDEFL_PROBE; + } + if (!dist) break; + q = (const mz_uint16 *)(d->m_dict + probe_pos); + if (TDEFL_READ_UNALIGNED_WORD(q) != s01) continue; + p = s; + probe_len = 32; + do { + } while ( + (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && + (--probe_len > 0)); + if (!probe_len) { + *pMatch_dist = dist; + *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN); + break; + } else if ((probe_len = ((mz_uint)(p - s) * 2) + + (mz_uint)(*(const mz_uint8 *)p == + *(const mz_uint8 *)q)) > match_len) { + *pMatch_dist = dist; + if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) == + max_match_len) + break; + c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]); + } + } +} +#else +static MZ_FORCEINLINE void tdefl_find_match( + tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, + mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) { + mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, + match_len = *pMatch_len, probe_pos = pos, next_probe_pos, + probe_len; + mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; + const mz_uint8 *s = d->m_dict + pos, *p, *q; + mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1]; + MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); + if (max_match_len <= match_len) return; + for (;;) { + for (;;) { + if (--num_probes_left == 0) return; +#define TDEFL_PROBE \ + next_probe_pos = d->m_next[probe_pos]; \ + if ((!next_probe_pos) || \ + ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) \ + return; \ + probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ + if ((d->m_dict[probe_pos + match_len] == c0) && \ + (d->m_dict[probe_pos + match_len - 1] == c1)) \ + break; + TDEFL_PROBE; + TDEFL_PROBE; + TDEFL_PROBE; + } + if (!dist) break; + p = s; + q = d->m_dict + probe_pos; + for (probe_len = 0; probe_len < max_match_len; probe_len++) + if (*p++ != *q++) break; + if (probe_len > match_len) { + *pMatch_dist = dist; + if ((*pMatch_len = match_len = probe_len) == max_match_len) return; + c0 = d->m_dict[pos + match_len]; + c1 = d->m_dict[pos + match_len - 1]; + } + } +} +#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN +static mz_bool tdefl_compress_fast(tdefl_compressor *d) { + // Faster, minimally featured LZRW1-style match+parse loop with better + // register utilization. Intended for applications where raw throughput is + // valued more highly than ratio. + mz_uint lookahead_pos = d->m_lookahead_pos, + lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size, + total_lz_bytes = d->m_total_lz_bytes, + num_flags_left = d->m_num_flags_left; + mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags; + mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; + + while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size))) { + const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096; + mz_uint dst_pos = + (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; + mz_uint num_bytes_to_process = (mz_uint)MZ_MIN( + d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size); + d->m_src_buf_left -= num_bytes_to_process; + lookahead_size += num_bytes_to_process; + + while (num_bytes_to_process) { + mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process); + memcpy(d->m_dict + dst_pos, d->m_pSrc, n); + if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) + memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc, + MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos)); + d->m_pSrc += n; + dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK; + num_bytes_to_process -= n; + } + + dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size); + if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE)) + break; + + while (lookahead_size >= 4) { + mz_uint cur_match_dist, cur_match_len = 1; + mz_uint8 *pCur_dict = d->m_dict + cur_pos; + mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF; + mz_uint hash = + (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) & + TDEFL_LEVEL1_HASH_SIZE_MASK; + mz_uint probe_pos = d->m_hash[hash]; + d->m_hash[hash] = (mz_uint16)lookahead_pos; + + if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= + dict_size) && + ((*(const mz_uint32 *)(d->m_dict + + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & + 0xFFFFFF) == first_trigram)) { + const mz_uint16 *p = (const mz_uint16 *)pCur_dict; + const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos); + mz_uint32 probe_len = 32; + do { + } while ((TDEFL_READ_UNALIGNED_WORD(++p) == + TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == + TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == + TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == + TDEFL_READ_UNALIGNED_WORD(++q)) && + (--probe_len > 0)); + cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q); + if (!probe_len) + cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0; + + if ((cur_match_len < TDEFL_MIN_MATCH_LEN) || + ((cur_match_len == TDEFL_MIN_MATCH_LEN) && + (cur_match_dist >= 8U * 1024U))) { + cur_match_len = 1; + *pLZ_code_buf++ = (mz_uint8)first_trigram; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + d->m_huff_count[0][(mz_uint8)first_trigram]++; + } else { + mz_uint32 s0, s1; + cur_match_len = MZ_MIN(cur_match_len, lookahead_size); + + MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) && + (cur_match_dist >= 1) && + (cur_match_dist <= TDEFL_LZ_DICT_SIZE)); + + cur_match_dist--; + + pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN); + *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist; + pLZ_code_buf += 3; + *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80); + + s0 = s_tdefl_small_dist_sym[cur_match_dist & 511]; + s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8]; + d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++; + + d->m_huff_count[0][s_tdefl_len_sym[cur_match_len - + TDEFL_MIN_MATCH_LEN]]++; + } + } else { + *pLZ_code_buf++ = (mz_uint8)first_trigram; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + d->m_huff_count[0][(mz_uint8)first_trigram]++; + } + + if (--num_flags_left == 0) { + num_flags_left = 8; + pLZ_flags = pLZ_code_buf++; + } + + total_lz_bytes += cur_match_len; + lookahead_pos += cur_match_len; + dict_size = MZ_MIN(dict_size + cur_match_len, TDEFL_LZ_DICT_SIZE); + cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK; + MZ_ASSERT(lookahead_size >= cur_match_len); + lookahead_size -= cur_match_len; + + if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) { + int n; + d->m_lookahead_pos = lookahead_pos; + d->m_lookahead_size = lookahead_size; + d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; + d->m_pLZ_code_buf = pLZ_code_buf; + d->m_pLZ_flags = pLZ_flags; + d->m_num_flags_left = num_flags_left; + if ((n = tdefl_flush_block(d, 0)) != 0) + return (n < 0) ? MZ_FALSE : MZ_TRUE; + total_lz_bytes = d->m_total_lz_bytes; + pLZ_code_buf = d->m_pLZ_code_buf; + pLZ_flags = d->m_pLZ_flags; + num_flags_left = d->m_num_flags_left; + } + } + + while (lookahead_size) { + mz_uint8 lit = d->m_dict[cur_pos]; + + total_lz_bytes++; + *pLZ_code_buf++ = lit; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + if (--num_flags_left == 0) { + num_flags_left = 8; + pLZ_flags = pLZ_code_buf++; + } + + d->m_huff_count[0][lit]++; + + lookahead_pos++; + dict_size = MZ_MIN(dict_size + 1, TDEFL_LZ_DICT_SIZE); + cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; + lookahead_size--; + + if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) { + int n; + d->m_lookahead_pos = lookahead_pos; + d->m_lookahead_size = lookahead_size; + d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; + d->m_pLZ_code_buf = pLZ_code_buf; + d->m_pLZ_flags = pLZ_flags; + d->m_num_flags_left = num_flags_left; + if ((n = tdefl_flush_block(d, 0)) != 0) + return (n < 0) ? MZ_FALSE : MZ_TRUE; + total_lz_bytes = d->m_total_lz_bytes; + pLZ_code_buf = d->m_pLZ_code_buf; + pLZ_flags = d->m_pLZ_flags; + num_flags_left = d->m_num_flags_left; + } + } + } + + d->m_lookahead_pos = lookahead_pos; + d->m_lookahead_size = lookahead_size; + d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; + d->m_pLZ_code_buf = pLZ_code_buf; + d->m_pLZ_flags = pLZ_flags; + d->m_num_flags_left = num_flags_left; + return MZ_TRUE; +} +#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + +static MZ_FORCEINLINE void tdefl_record_literal(tdefl_compressor *d, + mz_uint8 lit) { + d->m_total_lz_bytes++; + *d->m_pLZ_code_buf++ = lit; + *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1); + if (--d->m_num_flags_left == 0) { + d->m_num_flags_left = 8; + d->m_pLZ_flags = d->m_pLZ_code_buf++; + } + d->m_huff_count[0][lit]++; +} + +static MZ_FORCEINLINE void tdefl_record_match(tdefl_compressor *d, + mz_uint match_len, + mz_uint match_dist) { + mz_uint32 s0, s1; + + MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) && + (match_dist <= TDEFL_LZ_DICT_SIZE)); + + d->m_total_lz_bytes += match_len; + + d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN); + + match_dist -= 1; + d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF); + d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8); + d->m_pLZ_code_buf += 3; + + *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80); + if (--d->m_num_flags_left == 0) { + d->m_num_flags_left = 8; + d->m_pLZ_flags = d->m_pLZ_code_buf++; + } + + s0 = s_tdefl_small_dist_sym[match_dist & 511]; + s1 = s_tdefl_large_dist_sym[(match_dist >> 8) & 127]; + d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++; + + if (match_len >= TDEFL_MIN_MATCH_LEN) + d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++; +} + +static mz_bool tdefl_compress_normal(tdefl_compressor *d) { + const mz_uint8 *pSrc = d->m_pSrc; + size_t src_buf_left = d->m_src_buf_left; + tdefl_flush flush = d->m_flush; + + while ((src_buf_left) || ((flush) && (d->m_lookahead_size))) { + mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos; + // Update dictionary and hash chains. Keeps the lookahead size equal to + // TDEFL_MAX_MATCH_LEN. + if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1)) { + mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & + TDEFL_LZ_DICT_SIZE_MASK, + ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2; + mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] + << TDEFL_LZ_HASH_SHIFT) ^ + d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK]; + mz_uint num_bytes_to_process = (mz_uint)MZ_MIN( + src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size); + const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process; + src_buf_left -= num_bytes_to_process; + d->m_lookahead_size += num_bytes_to_process; + while (pSrc != pSrc_end) { + mz_uint8 c = *pSrc++; + d->m_dict[dst_pos] = c; + if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) + d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; + hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); + d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; + d->m_hash[hash] = (mz_uint16)(ins_pos); + dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; + ins_pos++; + } + } else { + while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) { + mz_uint8 c = *pSrc++; + mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & + TDEFL_LZ_DICT_SIZE_MASK; + src_buf_left--; + d->m_dict[dst_pos] = c; + if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) + d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; + if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN) { + mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2; + mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] + << (TDEFL_LZ_HASH_SHIFT * 2)) ^ + (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK] + << TDEFL_LZ_HASH_SHIFT) ^ + c) & + (TDEFL_LZ_HASH_SIZE - 1); + d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; + d->m_hash[hash] = (mz_uint16)(ins_pos); + } + } + } + d->m_dict_size = + MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size); + if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) break; + + // Simple lazy/greedy parsing state machine. + len_to_move = 1; + cur_match_dist = 0; + cur_match_len = + d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1); + cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; + if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS)) { + if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) { + mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK]; + cur_match_len = 0; + while (cur_match_len < d->m_lookahead_size) { + if (d->m_dict[cur_pos + cur_match_len] != c) break; + cur_match_len++; + } + if (cur_match_len < TDEFL_MIN_MATCH_LEN) + cur_match_len = 0; + else + cur_match_dist = 1; + } + } else { + tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size, + d->m_lookahead_size, &cur_match_dist, &cur_match_len); + } + if (((cur_match_len == TDEFL_MIN_MATCH_LEN) && + (cur_match_dist >= 8U * 1024U)) || + (cur_pos == cur_match_dist) || + ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5))) { + cur_match_dist = cur_match_len = 0; + } + if (d->m_saved_match_len) { + if (cur_match_len > d->m_saved_match_len) { + tdefl_record_literal(d, (mz_uint8)d->m_saved_lit); + if (cur_match_len >= 128) { + tdefl_record_match(d, cur_match_len, cur_match_dist); + d->m_saved_match_len = 0; + len_to_move = cur_match_len; + } else { + d->m_saved_lit = d->m_dict[cur_pos]; + d->m_saved_match_dist = cur_match_dist; + d->m_saved_match_len = cur_match_len; + } + } else { + tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist); + len_to_move = d->m_saved_match_len - 1; + d->m_saved_match_len = 0; + } + } else if (!cur_match_dist) + tdefl_record_literal(d, + d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]); + else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) || + (cur_match_len >= 128)) { + tdefl_record_match(d, cur_match_len, cur_match_dist); + len_to_move = cur_match_len; + } else { + d->m_saved_lit = d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]; + d->m_saved_match_dist = cur_match_dist; + d->m_saved_match_len = cur_match_len; + } + // Move the lookahead forward by len_to_move bytes. + d->m_lookahead_pos += len_to_move; + MZ_ASSERT(d->m_lookahead_size >= len_to_move); + d->m_lookahead_size -= len_to_move; + d->m_dict_size = + MZ_MIN(d->m_dict_size + len_to_move, (mz_uint)TDEFL_LZ_DICT_SIZE); + // Check if it's time to flush the current LZ codes to the internal output + // buffer. + if ((d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) || + ((d->m_total_lz_bytes > 31 * 1024) && + (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >= + d->m_total_lz_bytes) || + (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS)))) { + int n; + d->m_pSrc = pSrc; + d->m_src_buf_left = src_buf_left; + if ((n = tdefl_flush_block(d, 0)) != 0) + return (n < 0) ? MZ_FALSE : MZ_TRUE; + } + } + + d->m_pSrc = pSrc; + d->m_src_buf_left = src_buf_left; + return MZ_TRUE; +} + +static tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d) { + if (d->m_pIn_buf_size) { + *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; + } + + if (d->m_pOut_buf_size) { + size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs, + d->m_output_flush_remaining); + memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, + d->m_output_buf + d->m_output_flush_ofs, n); + d->m_output_flush_ofs += (mz_uint)n; + d->m_output_flush_remaining -= (mz_uint)n; + d->m_out_buf_ofs += n; + + *d->m_pOut_buf_size = d->m_out_buf_ofs; + } + + return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE + : TDEFL_STATUS_OKAY; +} + +tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, + size_t *pIn_buf_size, void *pOut_buf, + size_t *pOut_buf_size, tdefl_flush flush) { + if (!d) { + if (pIn_buf_size) *pIn_buf_size = 0; + if (pOut_buf_size) *pOut_buf_size = 0; + return TDEFL_STATUS_BAD_PARAM; + } + + d->m_pIn_buf = pIn_buf; + d->m_pIn_buf_size = pIn_buf_size; + d->m_pOut_buf = pOut_buf; + d->m_pOut_buf_size = pOut_buf_size; + d->m_pSrc = (const mz_uint8 *)(pIn_buf); + d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0; + d->m_out_buf_ofs = 0; + d->m_flush = flush; + + if (((d->m_pPut_buf_func != NULL) == + ((pOut_buf != NULL) || (pOut_buf_size != NULL))) || + (d->m_prev_return_status != TDEFL_STATUS_OKAY) || + (d->m_wants_to_finish && (flush != TDEFL_FINISH)) || + (pIn_buf_size && *pIn_buf_size && !pIn_buf) || + (pOut_buf_size && *pOut_buf_size && !pOut_buf)) { + if (pIn_buf_size) *pIn_buf_size = 0; + if (pOut_buf_size) *pOut_buf_size = 0; + return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM); + } + d->m_wants_to_finish |= (flush == TDEFL_FINISH); + + if ((d->m_output_flush_remaining) || (d->m_finished)) + return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) && + ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) && + ((d->m_flags & (TDEFL_FILTER_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS | + TDEFL_RLE_MATCHES)) == 0)) { + if (!tdefl_compress_fast(d)) return d->m_prev_return_status; + } else +#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + { + if (!tdefl_compress_normal(d)) return d->m_prev_return_status; + } + + if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) && + (pIn_buf)) + d->m_adler32 = + (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf, + d->m_pSrc - (const mz_uint8 *)pIn_buf); + + if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) && + (!d->m_output_flush_remaining)) { + if (tdefl_flush_block(d, flush) < 0) return d->m_prev_return_status; + d->m_finished = (flush == TDEFL_FINISH); + if (flush == TDEFL_FULL_FLUSH) { + MZ_CLEAR_OBJ(d->m_hash); + MZ_CLEAR_OBJ(d->m_next); + d->m_dict_size = 0; + } + } + + return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); +} + +tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, + size_t in_buf_size, tdefl_flush flush) { + MZ_ASSERT(d->m_pPut_buf_func); + return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush); +} + +tdefl_status tdefl_init(tdefl_compressor *d, + tdefl_put_buf_func_ptr pPut_buf_func, + void *pPut_buf_user, int flags) { + d->m_pPut_buf_func = pPut_buf_func; + d->m_pPut_buf_user = pPut_buf_user; + d->m_flags = (mz_uint)(flags); + d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3; + d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0; + d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3; + if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) MZ_CLEAR_OBJ(d->m_hash); + d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size = + d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0; + d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished = + d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0; + d->m_pLZ_code_buf = d->m_lz_code_buf + 1; + d->m_pLZ_flags = d->m_lz_code_buf; + d->m_num_flags_left = 8; + d->m_pOutput_buf = d->m_output_buf; + d->m_pOutput_buf_end = d->m_output_buf; + d->m_prev_return_status = TDEFL_STATUS_OKAY; + d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0; + d->m_adler32 = 1; + d->m_pIn_buf = NULL; + d->m_pOut_buf = NULL; + d->m_pIn_buf_size = NULL; + d->m_pOut_buf_size = NULL; + d->m_flush = TDEFL_NO_FLUSH; + d->m_pSrc = NULL; + d->m_src_buf_left = 0; + d->m_out_buf_ofs = 0; + memset(&d->m_huff_count[0][0], 0, + sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); + memset(&d->m_huff_count[1][0], 0, + sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); + return TDEFL_STATUS_OKAY; +} + +tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d) { + return d->m_prev_return_status; +} + +mz_uint32 tdefl_get_adler32(tdefl_compressor *d) { return d->m_adler32; } + +mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, + tdefl_put_buf_func_ptr pPut_buf_func, + void *pPut_buf_user, int flags) { + tdefl_compressor *pComp; + mz_bool succeeded; + if (((buf_len) && (!pBuf)) || (!pPut_buf_func)) return MZ_FALSE; + pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); + if (!pComp) return MZ_FALSE; + succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) == + TDEFL_STATUS_OKAY); + succeeded = + succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) == + TDEFL_STATUS_DONE); + MZ_FREE(pComp); + return succeeded; +} + +typedef struct { + size_t m_size, m_capacity; + mz_uint8 *m_pBuf; + mz_bool m_expandable; +} tdefl_output_buffer; + +static mz_bool tdefl_output_buffer_putter(const void *pBuf, int len, + void *pUser) { + tdefl_output_buffer *p = (tdefl_output_buffer *)pUser; + size_t new_size = p->m_size + len; + if (new_size > p->m_capacity) { + size_t new_capacity = p->m_capacity; + mz_uint8 *pNew_buf; + if (!p->m_expandable) return MZ_FALSE; + do { + new_capacity = MZ_MAX(128U, new_capacity << 1U); + } while (new_size > new_capacity); + pNew_buf = (mz_uint8 *)MZ_REALLOC(p->m_pBuf, new_capacity); + if (!pNew_buf) return MZ_FALSE; + p->m_pBuf = pNew_buf; + p->m_capacity = new_capacity; + } + memcpy((mz_uint8 *)p->m_pBuf + p->m_size, pBuf, len); + p->m_size = new_size; + return MZ_TRUE; +} + +void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, + size_t *pOut_len, int flags) { + tdefl_output_buffer out_buf; + MZ_CLEAR_OBJ(out_buf); + if (!pOut_len) + return MZ_FALSE; + else + *pOut_len = 0; + out_buf.m_expandable = MZ_TRUE; + if (!tdefl_compress_mem_to_output( + pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) + return NULL; + *pOut_len = out_buf.m_size; + return out_buf.m_pBuf; +} + +size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, + const void *pSrc_buf, size_t src_buf_len, + int flags) { + tdefl_output_buffer out_buf; + MZ_CLEAR_OBJ(out_buf); + if (!pOut_buf) return 0; + out_buf.m_pBuf = (mz_uint8 *)pOut_buf; + out_buf.m_capacity = out_buf_len; + if (!tdefl_compress_mem_to_output( + pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) + return 0; + return out_buf.m_size; +} + +#ifndef MINIZ_NO_ZLIB_APIS +static const mz_uint s_tdefl_num_probes[11] = {0, 1, 6, 32, 16, 32, + 128, 256, 512, 768, 1500}; + +// level may actually range from [0,10] (10 is a "hidden" max level, where we +// want a bit more compression and it's fine if throughput to fall off a cliff +// on some files). +mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, + int strategy) { + mz_uint comp_flags = + s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] | + ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0); + if (window_bits > 0) comp_flags |= TDEFL_WRITE_ZLIB_HEADER; + + if (!level) + comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS; + else if (strategy == MZ_FILTERED) + comp_flags |= TDEFL_FILTER_MATCHES; + else if (strategy == MZ_HUFFMAN_ONLY) + comp_flags &= ~TDEFL_MAX_PROBES_MASK; + else if (strategy == MZ_FIXED) + comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS; + else if (strategy == MZ_RLE) + comp_flags |= TDEFL_RLE_MATCHES; + + return comp_flags; +} +#endif // MINIZ_NO_ZLIB_APIS + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4204) // nonstandard extension used : non-constant + // aggregate initializer (also supported by GNU + // C and C99, so no big deal) +#pragma warning(disable : 4244) // 'initializing': conversion from '__int64' to + // 'int', possible loss of data +#pragma warning(disable : 4267) // 'argument': conversion from '__int64' to + // 'int', possible loss of data +#pragma warning(disable : 4996) // 'strdup': The POSIX name for this item is + // deprecated. Instead, use the ISO C and C++ + // conformant name: _strdup. +#endif + +// Simple PNG writer function by Alex Evans, 2011. Released into the public +// domain: https://gist.github.com/908299, more context at +// http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/. +// This is actually a modification of Alex's original code so PNG files +// generated by this function pass pngcheck. +void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, + int h, int num_chans, + size_t *pLen_out, + mz_uint level, mz_bool flip) { + // Using a local copy of this array here in case MINIZ_NO_ZLIB_APIS was + // defined. + static const mz_uint s_tdefl_png_num_probes[11] = { + 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500}; + tdefl_compressor *pComp = + (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); + tdefl_output_buffer out_buf; + int i, bpl = w * num_chans, y, z; + mz_uint32 c; + *pLen_out = 0; + if (!pComp) return NULL; + MZ_CLEAR_OBJ(out_buf); + out_buf.m_expandable = MZ_TRUE; + out_buf.m_capacity = 57 + MZ_MAX(64, (1 + bpl) * h); + if (NULL == (out_buf.m_pBuf = (mz_uint8 *)MZ_MALLOC(out_buf.m_capacity))) { + MZ_FREE(pComp); + return NULL; + } + // write dummy header + for (z = 41; z; --z) tdefl_output_buffer_putter(&z, 1, &out_buf); + // compress image data + tdefl_init( + pComp, tdefl_output_buffer_putter, &out_buf, + s_tdefl_png_num_probes[MZ_MIN(10, level)] | TDEFL_WRITE_ZLIB_HEADER); + for (y = 0; y < h; ++y) { + tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH); + tdefl_compress_buffer(pComp, + (mz_uint8 *)pImage + (flip ? (h - 1 - y) : y) * bpl, + bpl, TDEFL_NO_FLUSH); + } + if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) != + TDEFL_STATUS_DONE) { + MZ_FREE(pComp); + MZ_FREE(out_buf.m_pBuf); + return NULL; + } + // write real header + *pLen_out = out_buf.m_size - 41; + { + static const mz_uint8 chans[] = {0x00, 0x00, 0x04, 0x02, 0x06}; + mz_uint8 pnghdr[41] = {0x89, + 0x50, + 0x4e, + 0x47, + 0x0d, + 0x0a, + 0x1a, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x49, + 0x48, + 0x44, + 0x52, + 0, + 0, + (mz_uint8)(w >> 8), + (mz_uint8)w, + 0, + 0, + (mz_uint8)(h >> 8), + (mz_uint8)h, + 8, + chans[num_chans], + 0, + 0, + 0, + 0, + 0, + 0, + 0, + (mz_uint8)(*pLen_out >> 24), + (mz_uint8)(*pLen_out >> 16), + (mz_uint8)(*pLen_out >> 8), + (mz_uint8)*pLen_out, + 0x49, + 0x44, + 0x41, + 0x54}; + c = (mz_uint32)mz_crc32(MZ_CRC32_INIT, pnghdr + 12, 17); + for (i = 0; i < 4; ++i, c <<= 8) + ((mz_uint8 *)(pnghdr + 29))[i] = (mz_uint8)(c >> 24); + memcpy(out_buf.m_pBuf, pnghdr, 41); + } + // write footer (IDAT CRC-32, followed by IEND chunk) + if (!tdefl_output_buffer_putter( + "\0\0\0\0\0\0\0\0\x49\x45\x4e\x44\xae\x42\x60\x82", 16, &out_buf)) { + *pLen_out = 0; + MZ_FREE(pComp); + MZ_FREE(out_buf.m_pBuf); + return NULL; + } + c = (mz_uint32)mz_crc32(MZ_CRC32_INIT, out_buf.m_pBuf + 41 - 4, + *pLen_out + 4); + for (i = 0; i < 4; ++i, c <<= 8) + (out_buf.m_pBuf + out_buf.m_size - 16)[i] = (mz_uint8)(c >> 24); + // compute final size of file, grab compressed data buffer and return + *pLen_out += 57; + MZ_FREE(pComp); + return out_buf.m_pBuf; +} +void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, + int num_chans, size_t *pLen_out) { + // Level 6 corresponds to TDEFL_DEFAULT_MAX_PROBES or MZ_DEFAULT_LEVEL (but we + // can't depend on MZ_DEFAULT_LEVEL being available in case the zlib API's + // where #defined out) + return tdefl_write_image_to_png_file_in_memory_ex(pImage, w, h, num_chans, + pLen_out, 6, MZ_FALSE); +} + +// ------------------- .ZIP archive reading + +#ifndef MINIZ_NO_ARCHIVE_APIS +#error "No arvhive APIs" + +#ifdef MINIZ_NO_STDIO +#define MZ_FILE void * +#else +#include +#include + +#if defined(_MSC_VER) || defined(__MINGW64__) +static FILE *mz_fopen(const char *pFilename, const char *pMode) { + FILE *pFile = NULL; + fopen_s(&pFile, pFilename, pMode); + return pFile; +} +static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream) { + FILE *pFile = NULL; + if (freopen_s(&pFile, pPath, pMode, pStream)) return NULL; + return pFile; +} +#ifndef MINIZ_NO_TIME +#include +#endif +#define MZ_FILE FILE +#define MZ_FOPEN mz_fopen +#define MZ_FCLOSE fclose +#define MZ_FREAD fread +#define MZ_FWRITE fwrite +#define MZ_FTELL64 _ftelli64 +#define MZ_FSEEK64 _fseeki64 +#define MZ_FILE_STAT_STRUCT _stat +#define MZ_FILE_STAT _stat +#define MZ_FFLUSH fflush +#define MZ_FREOPEN mz_freopen +#define MZ_DELETE_FILE remove +#elif defined(__MINGW32__) +#ifndef MINIZ_NO_TIME +#include +#endif +#define MZ_FILE FILE +#define MZ_FOPEN(f, m) fopen(f, m) +#define MZ_FCLOSE fclose +#define MZ_FREAD fread +#define MZ_FWRITE fwrite +#define MZ_FTELL64 ftello64 +#define MZ_FSEEK64 fseeko64 +#define MZ_FILE_STAT_STRUCT _stat +#define MZ_FILE_STAT _stat +#define MZ_FFLUSH fflush +#define MZ_FREOPEN(f, m, s) freopen(f, m, s) +#define MZ_DELETE_FILE remove +#elif defined(__TINYC__) +#ifndef MINIZ_NO_TIME +#include +#endif +#define MZ_FILE FILE +#define MZ_FOPEN(f, m) fopen(f, m) +#define MZ_FCLOSE fclose +#define MZ_FREAD fread +#define MZ_FWRITE fwrite +#define MZ_FTELL64 ftell +#define MZ_FSEEK64 fseek +#define MZ_FILE_STAT_STRUCT stat +#define MZ_FILE_STAT stat +#define MZ_FFLUSH fflush +#define MZ_FREOPEN(f, m, s) freopen(f, m, s) +#define MZ_DELETE_FILE remove +#elif defined(__GNUC__) && defined(_LARGEFILE64_SOURCE) && _LARGEFILE64_SOURCE +#ifndef MINIZ_NO_TIME +#include +#endif +#define MZ_FILE FILE +#define MZ_FOPEN(f, m) fopen64(f, m) +#define MZ_FCLOSE fclose +#define MZ_FREAD fread +#define MZ_FWRITE fwrite +#define MZ_FTELL64 ftello64 +#define MZ_FSEEK64 fseeko64 +#define MZ_FILE_STAT_STRUCT stat64 +#define MZ_FILE_STAT stat64 +#define MZ_FFLUSH fflush +#define MZ_FREOPEN(p, m, s) freopen64(p, m, s) +#define MZ_DELETE_FILE remove +#else +#ifndef MINIZ_NO_TIME +#include +#endif +#define MZ_FILE FILE +#define MZ_FOPEN(f, m) fopen(f, m) +#define MZ_FCLOSE fclose +#define MZ_FREAD fread +#define MZ_FWRITE fwrite +#define MZ_FTELL64 ftello +#define MZ_FSEEK64 fseeko +#define MZ_FILE_STAT_STRUCT stat +#define MZ_FILE_STAT stat +#define MZ_FFLUSH fflush +#define MZ_FREOPEN(f, m, s) freopen(f, m, s) +#define MZ_DELETE_FILE remove +#endif // #ifdef _MSC_VER +#endif // #ifdef MINIZ_NO_STDIO + +#define MZ_TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a') : (c)) + +// Various ZIP archive enums. To completely avoid cross platform compiler +// alignment and platform endian issues, miniz.c doesn't use structs for any of +// this stuff. +enum { + // ZIP archive identifiers and record sizes + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06054b50, + MZ_ZIP_CENTRAL_DIR_HEADER_SIG = 0x02014b50, + MZ_ZIP_LOCAL_DIR_HEADER_SIG = 0x04034b50, + MZ_ZIP_LOCAL_DIR_HEADER_SIZE = 30, + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE = 46, + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE = 22, + // Central directory header record offsets + MZ_ZIP_CDH_SIG_OFS = 0, + MZ_ZIP_CDH_VERSION_MADE_BY_OFS = 4, + MZ_ZIP_CDH_VERSION_NEEDED_OFS = 6, + MZ_ZIP_CDH_BIT_FLAG_OFS = 8, + MZ_ZIP_CDH_METHOD_OFS = 10, + MZ_ZIP_CDH_FILE_TIME_OFS = 12, + MZ_ZIP_CDH_FILE_DATE_OFS = 14, + MZ_ZIP_CDH_CRC32_OFS = 16, + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS = 20, + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS = 24, + MZ_ZIP_CDH_FILENAME_LEN_OFS = 28, + MZ_ZIP_CDH_EXTRA_LEN_OFS = 30, + MZ_ZIP_CDH_COMMENT_LEN_OFS = 32, + MZ_ZIP_CDH_DISK_START_OFS = 34, + MZ_ZIP_CDH_INTERNAL_ATTR_OFS = 36, + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS = 38, + MZ_ZIP_CDH_LOCAL_HEADER_OFS = 42, + // Local directory header offsets + MZ_ZIP_LDH_SIG_OFS = 0, + MZ_ZIP_LDH_VERSION_NEEDED_OFS = 4, + MZ_ZIP_LDH_BIT_FLAG_OFS = 6, + MZ_ZIP_LDH_METHOD_OFS = 8, + MZ_ZIP_LDH_FILE_TIME_OFS = 10, + MZ_ZIP_LDH_FILE_DATE_OFS = 12, + MZ_ZIP_LDH_CRC32_OFS = 14, + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS = 18, + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS = 22, + MZ_ZIP_LDH_FILENAME_LEN_OFS = 26, + MZ_ZIP_LDH_EXTRA_LEN_OFS = 28, + // End of central directory offsets + MZ_ZIP_ECDH_SIG_OFS = 0, + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS = 4, + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS = 6, + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 8, + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS = 10, + MZ_ZIP_ECDH_CDIR_SIZE_OFS = 12, + MZ_ZIP_ECDH_CDIR_OFS_OFS = 16, + MZ_ZIP_ECDH_COMMENT_SIZE_OFS = 20, +}; + +typedef struct { + void *m_p; + size_t m_size, m_capacity; + mz_uint m_element_size; +} mz_zip_array; + +struct mz_zip_internal_state_tag { + mz_zip_array m_central_dir; + mz_zip_array m_central_dir_offsets; + mz_zip_array m_sorted_central_dir_offsets; + MZ_FILE *m_pFile; + void *m_pMem; + size_t m_mem_size; + size_t m_mem_capacity; +}; + +#define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size) \ + (array_ptr)->m_element_size = element_size +#define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) \ + ((element_type *)((array_ptr)->m_p))[index] + +static MZ_FORCEINLINE void mz_zip_array_clear(mz_zip_archive *pZip, + mz_zip_array *pArray) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pArray->m_p); + memset(pArray, 0, sizeof(mz_zip_array)); +} + +static mz_bool mz_zip_array_ensure_capacity(mz_zip_archive *pZip, + mz_zip_array *pArray, + size_t min_new_capacity, + mz_uint growing) { + void *pNew_p; + size_t new_capacity = min_new_capacity; + MZ_ASSERT(pArray->m_element_size); + if (pArray->m_capacity >= min_new_capacity) return MZ_TRUE; + if (growing) { + new_capacity = MZ_MAX(1, pArray->m_capacity); + while (new_capacity < min_new_capacity) new_capacity *= 2; + } + if (NULL == (pNew_p = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pArray->m_p, + pArray->m_element_size, new_capacity))) + return MZ_FALSE; + pArray->m_p = pNew_p; + pArray->m_capacity = new_capacity; + return MZ_TRUE; +} + +static MZ_FORCEINLINE mz_bool mz_zip_array_reserve(mz_zip_archive *pZip, + mz_zip_array *pArray, + size_t new_capacity, + mz_uint growing) { + if (new_capacity > pArray->m_capacity) { + if (!mz_zip_array_ensure_capacity(pZip, pArray, new_capacity, growing)) + return MZ_FALSE; + } + return MZ_TRUE; +} + +static MZ_FORCEINLINE mz_bool mz_zip_array_resize(mz_zip_archive *pZip, + mz_zip_array *pArray, + size_t new_size, + mz_uint growing) { + if (new_size > pArray->m_capacity) { + if (!mz_zip_array_ensure_capacity(pZip, pArray, new_size, growing)) + return MZ_FALSE; + } + pArray->m_size = new_size; + return MZ_TRUE; +} + +static MZ_FORCEINLINE mz_bool mz_zip_array_ensure_room(mz_zip_archive *pZip, + mz_zip_array *pArray, + size_t n) { + return mz_zip_array_reserve(pZip, pArray, pArray->m_size + n, MZ_TRUE); +} + +static MZ_FORCEINLINE mz_bool mz_zip_array_push_back(mz_zip_archive *pZip, + mz_zip_array *pArray, + const void *pElements, + size_t n) { + size_t orig_size = pArray->m_size; + if (!mz_zip_array_resize(pZip, pArray, orig_size + n, MZ_TRUE)) + return MZ_FALSE; + memcpy((mz_uint8 *)pArray->m_p + orig_size * pArray->m_element_size, + pElements, n * pArray->m_element_size); + return MZ_TRUE; +} + +#ifndef MINIZ_NO_TIME +static time_t mz_zip_dos_to_time_t(int dos_time, int dos_date) { + struct tm tm; + memset(&tm, 0, sizeof(tm)); + tm.tm_isdst = -1; + tm.tm_year = ((dos_date >> 9) & 127) + 1980 - 1900; + tm.tm_mon = ((dos_date >> 5) & 15) - 1; + tm.tm_mday = dos_date & 31; + tm.tm_hour = (dos_time >> 11) & 31; + tm.tm_min = (dos_time >> 5) & 63; + tm.tm_sec = (dos_time << 1) & 62; + return mktime(&tm); +} + +static void mz_zip_time_to_dos_time(time_t time, mz_uint16 *pDOS_time, + mz_uint16 *pDOS_date) { +#ifdef _MSC_VER + struct tm tm_struct; + struct tm *tm = &tm_struct; + errno_t err = localtime_s(tm, &time); + if (err) { + *pDOS_date = 0; + *pDOS_time = 0; + return; + } +#else + struct tm *tm = localtime(&time); +#endif + *pDOS_time = (mz_uint16)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) + + ((tm->tm_sec) >> 1)); + *pDOS_date = (mz_uint16)(((tm->tm_year + 1900 - 1980) << 9) + + ((tm->tm_mon + 1) << 5) + tm->tm_mday); +} +#endif + +#ifndef MINIZ_NO_STDIO +static mz_bool mz_zip_get_file_modified_time(const char *pFilename, + mz_uint16 *pDOS_time, + mz_uint16 *pDOS_date) { +#ifdef MINIZ_NO_TIME + (void)pFilename; + *pDOS_date = *pDOS_time = 0; +#else + struct MZ_FILE_STAT_STRUCT file_stat; + // On Linux with x86 glibc, this call will fail on large files (>= 0x80000000 + // bytes) unless you compiled with _LARGEFILE64_SOURCE. Argh. + if (MZ_FILE_STAT(pFilename, &file_stat) != 0) return MZ_FALSE; + mz_zip_time_to_dos_time(file_stat.st_mtime, pDOS_time, pDOS_date); +#endif // #ifdef MINIZ_NO_TIME + return MZ_TRUE; +} + +#ifndef MINIZ_NO_TIME +static mz_bool mz_zip_set_file_times(const char *pFilename, time_t access_time, + time_t modified_time) { + struct utimbuf t; + t.actime = access_time; + t.modtime = modified_time; + return !utime(pFilename, &t); +} +#endif // #ifndef MINIZ_NO_TIME +#endif // #ifndef MINIZ_NO_STDIO + +static mz_bool mz_zip_reader_init_internal(mz_zip_archive *pZip, + mz_uint32 flags) { + (void)flags; + if ((!pZip) || (pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID)) + return MZ_FALSE; + + if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func; + if (!pZip->m_pFree) pZip->m_pFree = def_free_func; + if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func; + + pZip->m_zip_mode = MZ_ZIP_MODE_READING; + pZip->m_archive_size = 0; + pZip->m_central_directory_file_ofs = 0; + pZip->m_total_files = 0; + + if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc( + pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state)))) + return MZ_FALSE; + memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, + sizeof(mz_uint8)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, + sizeof(mz_uint32)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, + sizeof(mz_uint32)); + return MZ_TRUE; +} + +static MZ_FORCEINLINE mz_bool +mz_zip_reader_filename_less(const mz_zip_array *pCentral_dir_array, + const mz_zip_array *pCentral_dir_offsets, + mz_uint l_index, mz_uint r_index) { + const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT( + pCentral_dir_array, mz_uint8, + MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, + l_index)), + *pE; + const mz_uint8 *pR = &MZ_ZIP_ARRAY_ELEMENT( + pCentral_dir_array, mz_uint8, + MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, r_index)); + mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS), + r_len = MZ_READ_LE16(pR + MZ_ZIP_CDH_FILENAME_LEN_OFS); + mz_uint8 l = 0, r = 0; + pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + pR += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + pE = pL + MZ_MIN(l_len, r_len); + while (pL < pE) { + if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) break; + pL++; + pR++; + } + return (pL == pE) ? (l_len < r_len) : (l < r); +} + +#define MZ_SWAP_UINT32(a, b) \ + do { \ + mz_uint32 t = a; \ + a = b; \ + b = t; \ + } \ + MZ_MACRO_END + +// Heap sort of lowercased filenames, used to help accelerate plain central +// directory searches by mz_zip_reader_locate_file(). (Could also use qsort(), +// but it could allocate memory.) +static void mz_zip_reader_sort_central_dir_offsets_by_filename( + mz_zip_archive *pZip) { + mz_zip_internal_state *pState = pZip->m_pState; + const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets; + const mz_zip_array *pCentral_dir = &pState->m_central_dir; + mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT( + &pState->m_sorted_central_dir_offsets, mz_uint32, 0); + const int size = pZip->m_total_files; + int start = (size - 2) >> 1, end; + while (start >= 0) { + int child, root = start; + for (;;) { + if ((child = (root << 1) + 1) >= size) break; + child += + (((child + 1) < size) && + (mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, + pIndices[child], pIndices[child + 1]))); + if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, + pIndices[root], pIndices[child])) + break; + MZ_SWAP_UINT32(pIndices[root], pIndices[child]); + root = child; + } + start--; + } + + end = size - 1; + while (end > 0) { + int child, root = 0; + MZ_SWAP_UINT32(pIndices[end], pIndices[0]); + for (;;) { + if ((child = (root << 1) + 1) >= end) break; + child += + (((child + 1) < end) && + mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, + pIndices[child], pIndices[child + 1])); + if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, + pIndices[root], pIndices[child])) + break; + MZ_SWAP_UINT32(pIndices[root], pIndices[child]); + root = child; + } + end--; + } +} + +static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, + mz_uint32 flags) { + mz_uint cdir_size, num_this_disk, cdir_disk_index; + mz_uint64 cdir_ofs; + mz_int64 cur_file_ofs; + const mz_uint8 *p; + mz_uint32 buf_u32[4096 / sizeof(mz_uint32)]; + mz_uint8 *pBuf = (mz_uint8 *)buf_u32; + mz_bool sort_central_dir = + ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0); + // Basic sanity checks - reject files which are too small, and check the first + // 4 bytes of the file to make sure a local header is there. + if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) + return MZ_FALSE; + // Find the end of central directory record by scanning the file from the end + // towards the beginning. + cur_file_ofs = + MZ_MAX((mz_int64)pZip->m_archive_size - (mz_int64)sizeof(buf_u32), 0); + for (;;) { + int i, + n = (int)MZ_MIN(sizeof(buf_u32), pZip->m_archive_size - cur_file_ofs); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, n) != (mz_uint)n) + return MZ_FALSE; + for (i = n - 4; i >= 0; --i) + if (MZ_READ_LE32(pBuf + i) == MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) break; + if (i >= 0) { + cur_file_ofs += i; + break; + } + if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >= + (0xFFFF + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE))) + return MZ_FALSE; + cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0); + } + // Read and verify the end of central directory record. + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) != + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) + return MZ_FALSE; + if ((MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) != + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) || + ((pZip->m_total_files = + MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS)) != + MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS))) + return MZ_FALSE; + + num_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS); + cdir_disk_index = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS); + if (((num_this_disk | cdir_disk_index) != 0) && + ((num_this_disk != 1) || (cdir_disk_index != 1))) + return MZ_FALSE; + + if ((cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS)) < + pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) + return MZ_FALSE; + + cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS); + if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size) return MZ_FALSE; + + pZip->m_central_directory_file_ofs = cdir_ofs; + + if (pZip->m_total_files) { + mz_uint i, n; + + // Read the entire central directory into a heap block, and allocate another + // heap block to hold the unsorted central dir file record offsets, and + // another to hold the sorted indices. + if ((!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir, cdir_size, + MZ_FALSE)) || + (!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir_offsets, + pZip->m_total_files, MZ_FALSE))) + return MZ_FALSE; + + if (sort_central_dir) { + if (!mz_zip_array_resize(pZip, + &pZip->m_pState->m_sorted_central_dir_offsets, + pZip->m_total_files, MZ_FALSE)) + return MZ_FALSE; + } + + if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs, + pZip->m_pState->m_central_dir.m_p, + cdir_size) != cdir_size) + return MZ_FALSE; + + // Now create an index into the central directory file records, do some + // basic sanity checking on each record, and check for zip64 entries (which + // are not yet supported). + p = (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p; + for (n = cdir_size, i = 0; i < pZip->m_total_files; ++i) { + mz_uint total_header_size, comp_size, decomp_size, disk_index; + if ((n < MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) || + (MZ_READ_LE32(p) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG)) + return MZ_FALSE; + MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, + i) = + (mz_uint32)(p - (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p); + if (sort_central_dir) + MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_sorted_central_dir_offsets, + mz_uint32, i) = i; + comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + decomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); + if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) && + (decomp_size != comp_size)) || + (decomp_size && !comp_size) || (decomp_size == 0xFFFFFFFF) || + (comp_size == 0xFFFFFFFF)) + return MZ_FALSE; + disk_index = MZ_READ_LE16(p + MZ_ZIP_CDH_DISK_START_OFS); + if ((disk_index != num_this_disk) && (disk_index != 1)) return MZ_FALSE; + if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) + + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size) + return MZ_FALSE; + if ((total_header_size = MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS) + + MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS)) > + n) + return MZ_FALSE; + n -= total_header_size; + p += total_header_size; + } + } + + if (sort_central_dir) + mz_zip_reader_sort_central_dir_offsets_by_filename(pZip); + + return MZ_TRUE; +} + +mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, + mz_uint32 flags) { + if ((!pZip) || (!pZip->m_pRead)) return MZ_FALSE; + if (!mz_zip_reader_init_internal(pZip, flags)) return MZ_FALSE; + pZip->m_archive_size = size; + if (!mz_zip_reader_read_central_dir(pZip, flags)) { + mz_zip_reader_end(pZip); + return MZ_FALSE; + } + return MZ_TRUE; +} + +static size_t mz_zip_mem_read_func(void *pOpaque, mz_uint64 file_ofs, + void *pBuf, size_t n) { + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + size_t s = (file_ofs >= pZip->m_archive_size) + ? 0 + : (size_t)MZ_MIN(pZip->m_archive_size - file_ofs, n); + memcpy(pBuf, (const mz_uint8 *)pZip->m_pState->m_pMem + file_ofs, s); + return s; +} + +mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, + size_t size, mz_uint32 flags) { + if (!mz_zip_reader_init_internal(pZip, flags)) return MZ_FALSE; + pZip->m_archive_size = size; + pZip->m_pRead = mz_zip_mem_read_func; + pZip->m_pIO_opaque = pZip; +#ifdef __cplusplus + pZip->m_pState->m_pMem = const_cast(pMem); +#else + pZip->m_pState->m_pMem = (void *)pMem; +#endif + pZip->m_pState->m_mem_size = size; + if (!mz_zip_reader_read_central_dir(pZip, flags)) { + mz_zip_reader_end(pZip); + return MZ_FALSE; + } + return MZ_TRUE; +} + +#ifndef MINIZ_NO_STDIO +static size_t mz_zip_file_read_func(void *pOpaque, mz_uint64 file_ofs, + void *pBuf, size_t n) { + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); + if (((mz_int64)file_ofs < 0) || + (((cur_ofs != (mz_int64)file_ofs)) && + (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET)))) + return 0; + return MZ_FREAD(pBuf, 1, n, pZip->m_pState->m_pFile); +} + +mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, + mz_uint32 flags) { + mz_uint64 file_size; + MZ_FILE *pFile = MZ_FOPEN(pFilename, "rb"); + if (!pFile) return MZ_FALSE; + if (MZ_FSEEK64(pFile, 0, SEEK_END)) { + MZ_FCLOSE(pFile); + return MZ_FALSE; + } + file_size = MZ_FTELL64(pFile); + if (!mz_zip_reader_init_internal(pZip, flags)) { + MZ_FCLOSE(pFile); + return MZ_FALSE; + } + pZip->m_pRead = mz_zip_file_read_func; + pZip->m_pIO_opaque = pZip; + pZip->m_pState->m_pFile = pFile; + pZip->m_archive_size = file_size; + if (!mz_zip_reader_read_central_dir(pZip, flags)) { + mz_zip_reader_end(pZip); + return MZ_FALSE; + } + return MZ_TRUE; +} +#endif // #ifndef MINIZ_NO_STDIO + +mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip) { + return pZip ? pZip->m_total_files : 0; +} + +static MZ_FORCEINLINE const mz_uint8 *mz_zip_reader_get_cdh( + mz_zip_archive *pZip, mz_uint file_index) { + if ((!pZip) || (!pZip->m_pState) || (file_index >= pZip->m_total_files) || + (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) + return NULL; + return &MZ_ZIP_ARRAY_ELEMENT( + &pZip->m_pState->m_central_dir, mz_uint8, + MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, + file_index)); +} + +mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, + mz_uint file_index) { + mz_uint m_bit_flag; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if (!p) return MZ_FALSE; + m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); + return (m_bit_flag & 1); +} + +mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, + mz_uint file_index) { + mz_uint filename_len, external_attr; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if (!p) return MZ_FALSE; + + // First see if the filename ends with a '/' character. + filename_len = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); + if (filename_len) { + if (*(p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_len - 1) == '/') + return MZ_TRUE; + } + + // Bugfix: This code was also checking if the internal attribute was non-zero, + // which wasn't correct. + // Most/all zip writers (hopefully) set DOS file/directory attributes in the + // low 16-bits, so check for the DOS directory flag and ignore the source OS + // ID in the created by field. + // FIXME: Remove this check? Is it necessary - we already check the filename. + external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); + if ((external_attr & 0x10) != 0) return MZ_TRUE; + + return MZ_FALSE; +} + +mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, + mz_zip_archive_file_stat *pStat) { + mz_uint n; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if ((!p) || (!pStat)) return MZ_FALSE; + + // Unpack the central directory record. + pStat->m_file_index = file_index; + pStat->m_central_dir_ofs = MZ_ZIP_ARRAY_ELEMENT( + &pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index); + pStat->m_version_made_by = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS); + pStat->m_version_needed = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_NEEDED_OFS); + pStat->m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); + pStat->m_method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS); +#ifndef MINIZ_NO_TIME + pStat->m_time = + mz_zip_dos_to_time_t(MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_TIME_OFS), + MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_DATE_OFS)); +#endif + pStat->m_crc32 = MZ_READ_LE32(p + MZ_ZIP_CDH_CRC32_OFS); + pStat->m_comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + pStat->m_uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); + pStat->m_internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS); + pStat->m_external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); + pStat->m_local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS); + + // Copy as much of the filename and comment as possible. + n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); + n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE - 1); + memcpy(pStat->m_filename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); + pStat->m_filename[n] = '\0'; + + n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS); + n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1); + pStat->m_comment_size = n; + memcpy(pStat->m_comment, + p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), + n); + pStat->m_comment[n] = '\0'; + + return MZ_TRUE; +} + +mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, + char *pFilename, mz_uint filename_buf_size) { + mz_uint n; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if (!p) { + if (filename_buf_size) pFilename[0] = '\0'; + return 0; + } + n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); + if (filename_buf_size) { + n = MZ_MIN(n, filename_buf_size - 1); + memcpy(pFilename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); + pFilename[n] = '\0'; + } + return n + 1; +} + +static MZ_FORCEINLINE mz_bool mz_zip_reader_string_equal(const char *pA, + const char *pB, + mz_uint len, + mz_uint flags) { + mz_uint i; + if (flags & MZ_ZIP_FLAG_CASE_SENSITIVE) return 0 == memcmp(pA, pB, len); + for (i = 0; i < len; ++i) + if (MZ_TOLOWER(pA[i]) != MZ_TOLOWER(pB[i])) return MZ_FALSE; + return MZ_TRUE; +} + +static MZ_FORCEINLINE int mz_zip_reader_filename_compare( + const mz_zip_array *pCentral_dir_array, + const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, const char *pR, + mz_uint r_len) { + const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT( + pCentral_dir_array, mz_uint8, + MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, + l_index)), + *pE; + mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS); + mz_uint8 l = 0, r = 0; + pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + pE = pL + MZ_MIN(l_len, r_len); + while (pL < pE) { + if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) break; + pL++; + pR++; + } + return (pL == pE) ? (int)(l_len - r_len) : (l - r); +} + +static int mz_zip_reader_locate_file_binary_search(mz_zip_archive *pZip, + const char *pFilename) { + mz_zip_internal_state *pState = pZip->m_pState; + const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets; + const mz_zip_array *pCentral_dir = &pState->m_central_dir; + mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT( + &pState->m_sorted_central_dir_offsets, mz_uint32, 0); + const int size = pZip->m_total_files; + const mz_uint filename_len = (mz_uint)strlen(pFilename); + int l = 0, h = size - 1; + while (l <= h) { + int m = (l + h) >> 1, file_index = pIndices[m], + comp = + mz_zip_reader_filename_compare(pCentral_dir, pCentral_dir_offsets, + file_index, pFilename, filename_len); + if (!comp) + return file_index; + else if (comp < 0) + l = m + 1; + else + h = m - 1; + } + return -1; +} + +int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, + const char *pComment, mz_uint flags) { + mz_uint file_index; + size_t name_len, comment_len; + if ((!pZip) || (!pZip->m_pState) || (!pName) || + (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) + return -1; + if (((flags & (MZ_ZIP_FLAG_IGNORE_PATH | MZ_ZIP_FLAG_CASE_SENSITIVE)) == 0) && + (!pComment) && (pZip->m_pState->m_sorted_central_dir_offsets.m_size)) + return mz_zip_reader_locate_file_binary_search(pZip, pName); + name_len = strlen(pName); + if (name_len > 0xFFFF) return -1; + comment_len = pComment ? strlen(pComment) : 0; + if (comment_len > 0xFFFF) return -1; + for (file_index = 0; file_index < pZip->m_total_files; file_index++) { + const mz_uint8 *pHeader = &MZ_ZIP_ARRAY_ELEMENT( + &pZip->m_pState->m_central_dir, mz_uint8, + MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, + file_index)); + mz_uint filename_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_FILENAME_LEN_OFS); + const char *pFilename = + (const char *)pHeader + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + if (filename_len < name_len) continue; + if (comment_len) { + mz_uint file_extra_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_EXTRA_LEN_OFS), + file_comment_len = + MZ_READ_LE16(pHeader + MZ_ZIP_CDH_COMMENT_LEN_OFS); + const char *pFile_comment = pFilename + filename_len + file_extra_len; + if ((file_comment_len != comment_len) || + (!mz_zip_reader_string_equal(pComment, pFile_comment, + file_comment_len, flags))) + continue; + } + if ((flags & MZ_ZIP_FLAG_IGNORE_PATH) && (filename_len)) { + int ofs = filename_len - 1; + do { + if ((pFilename[ofs] == '/') || (pFilename[ofs] == '\\') || + (pFilename[ofs] == ':')) + break; + } while (--ofs >= 0); + ofs++; + pFilename += ofs; + filename_len -= ofs; + } + if ((filename_len == name_len) && + (mz_zip_reader_string_equal(pName, pFilename, filename_len, flags))) + return file_index; + } + return -1; +} + +mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, + mz_uint file_index, void *pBuf, + size_t buf_size, mz_uint flags, + void *pUser_read_buf, + size_t user_read_buf_size) { + int status = TINFL_STATUS_DONE; + mz_uint64 needed_size, cur_file_ofs, comp_remaining, + out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail; + mz_zip_archive_file_stat file_stat; + void *pRead_buf; + mz_uint32 + local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / + sizeof(mz_uint32)]; + mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; + tinfl_decompressor inflator; + + if ((buf_size) && (!pBuf)) return MZ_FALSE; + + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) return MZ_FALSE; + + // Empty file, or a directory (but not always a directory - I've seen odd zips + // with directories that have compressed data which inflates to 0 bytes) + if (!file_stat.m_comp_size) return MZ_TRUE; + + // Entry is a subdirectory (I've seen old zips with dir entries which have + // compressed deflate data which inflates to 0 bytes, but these entries claim + // to uncompress to 512 bytes in the headers). + // I'm torn how to handle this case - should it fail instead? + if (mz_zip_reader_is_file_a_directory(pZip, file_index)) return MZ_TRUE; + + // Encryption and patch files are not supported. + if (file_stat.m_bit_flag & (1 | 32)) return MZ_FALSE; + + // This function only supports stored and deflate. + if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && + (file_stat.m_method != MZ_DEFLATED)) + return MZ_FALSE; + + // Ensure supplied output buffer is large enough. + needed_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? file_stat.m_comp_size + : file_stat.m_uncomp_size; + if (buf_size < needed_size) return MZ_FALSE; + + // Read and parse the local directory entry. + cur_file_ofs = file_stat.m_local_header_ofs; + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + return MZ_FALSE; + if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) + return MZ_FALSE; + + cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); + if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size) + return MZ_FALSE; + + if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) { + // The file is stored or the caller has requested the compressed data. + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, + (size_t)needed_size) != needed_size) + return MZ_FALSE; + return ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) != 0) || + (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, + (size_t)file_stat.m_uncomp_size) == file_stat.m_crc32); + } + + // Decompress the file either directly from memory or from a file input + // buffer. + tinfl_init(&inflator); + + if (pZip->m_pState->m_pMem) { + // Read directly from the archive in memory. + pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs; + read_buf_size = read_buf_avail = file_stat.m_comp_size; + comp_remaining = 0; + } else if (pUser_read_buf) { + // Use a user provided read buffer. + if (!user_read_buf_size) return MZ_FALSE; + pRead_buf = (mz_uint8 *)pUser_read_buf; + read_buf_size = user_read_buf_size; + read_buf_avail = 0; + comp_remaining = file_stat.m_comp_size; + } else { + // Temporarily allocate a read buffer. + read_buf_size = + MZ_MIN(file_stat.m_comp_size, (mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE); +#ifdef _MSC_VER + if (((0, sizeof(size_t) == sizeof(mz_uint32))) && + (read_buf_size > 0x7FFFFFFF)) +#else + if (((sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF)) +#endif + return MZ_FALSE; + if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, + (size_t)read_buf_size))) + return MZ_FALSE; + read_buf_avail = 0; + comp_remaining = file_stat.m_comp_size; + } + + do { + size_t in_buf_size, + out_buf_size = (size_t)(file_stat.m_uncomp_size - out_buf_ofs); + if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) { + read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, + (size_t)read_buf_avail) != read_buf_avail) { + status = TINFL_STATUS_FAILED; + break; + } + cur_file_ofs += read_buf_avail; + comp_remaining -= read_buf_avail; + read_buf_ofs = 0; + } + in_buf_size = (size_t)read_buf_avail; + status = tinfl_decompress( + &inflator, (mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, + (mz_uint8 *)pBuf, (mz_uint8 *)pBuf + out_buf_ofs, &out_buf_size, + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF | + (comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0)); + read_buf_avail -= in_buf_size; + read_buf_ofs += in_buf_size; + out_buf_ofs += out_buf_size; + } while (status == TINFL_STATUS_NEEDS_MORE_INPUT); + + if (status == TINFL_STATUS_DONE) { + // Make sure the entire file was decompressed, and check its CRC. + if ((out_buf_ofs != file_stat.m_uncomp_size) || + (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, + (size_t)file_stat.m_uncomp_size) != file_stat.m_crc32)) + status = TINFL_STATUS_FAILED; + } + + if ((!pZip->m_pState->m_pMem) && (!pUser_read_buf)) + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + + return status == TINFL_STATUS_DONE; +} + +mz_bool mz_zip_reader_extract_file_to_mem_no_alloc( + mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, + mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) { + int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); + if (file_index < 0) return MZ_FALSE; + return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, + flags, pUser_read_buf, + user_read_buf_size); +} + +mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, + void *pBuf, size_t buf_size, + mz_uint flags) { + return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, + flags, NULL, 0); +} + +mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, + const char *pFilename, void *pBuf, + size_t buf_size, mz_uint flags) { + return mz_zip_reader_extract_file_to_mem_no_alloc(pZip, pFilename, pBuf, + buf_size, flags, NULL, 0); +} + +void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, + size_t *pSize, mz_uint flags) { + mz_uint64 comp_size, uncomp_size, alloc_size; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + void *pBuf; + + if (pSize) *pSize = 0; + if (!p) return NULL; + + comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); + + alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size; +#ifdef _MSC_VER + if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF)) +#else + if (((sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF)) +#endif + return NULL; + if (NULL == + (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)alloc_size))) + return NULL; + + if (!mz_zip_reader_extract_to_mem(pZip, file_index, pBuf, (size_t)alloc_size, + flags)) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return NULL; + } + + if (pSize) *pSize = (size_t)alloc_size; + return pBuf; +} + +void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, + const char *pFilename, size_t *pSize, + mz_uint flags) { + int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); + if (file_index < 0) { + if (pSize) *pSize = 0; + return MZ_FALSE; + } + return mz_zip_reader_extract_to_heap(pZip, file_index, pSize, flags); +} + +mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, + mz_uint file_index, + mz_file_write_func pCallback, + void *pOpaque, mz_uint flags) { + int status = TINFL_STATUS_DONE; + mz_uint file_crc32 = MZ_CRC32_INIT; + mz_uint64 read_buf_size, read_buf_ofs = 0, read_buf_avail, comp_remaining, + out_buf_ofs = 0, cur_file_ofs; + mz_zip_archive_file_stat file_stat; + void *pRead_buf = NULL; + void *pWrite_buf = NULL; + mz_uint32 + local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / + sizeof(mz_uint32)]; + mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; + + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) return MZ_FALSE; + + // Empty file, or a directory (but not always a directory - I've seen odd zips + // with directories that have compressed data which inflates to 0 bytes) + if (!file_stat.m_comp_size) return MZ_TRUE; + + // Entry is a subdirectory (I've seen old zips with dir entries which have + // compressed deflate data which inflates to 0 bytes, but these entries claim + // to uncompress to 512 bytes in the headers). + // I'm torn how to handle this case - should it fail instead? + if (mz_zip_reader_is_file_a_directory(pZip, file_index)) return MZ_TRUE; + + // Encryption and patch files are not supported. + if (file_stat.m_bit_flag & (1 | 32)) return MZ_FALSE; + + // This function only supports stored and deflate. + if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && + (file_stat.m_method != MZ_DEFLATED)) + return MZ_FALSE; + + // Read and parse the local directory entry. + cur_file_ofs = file_stat.m_local_header_ofs; + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + return MZ_FALSE; + if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) + return MZ_FALSE; + + cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); + if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size) + return MZ_FALSE; + + // Decompress the file either directly from memory or from a file input + // buffer. + if (pZip->m_pState->m_pMem) { + pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs; + read_buf_size = read_buf_avail = file_stat.m_comp_size; + comp_remaining = 0; + } else { + read_buf_size = + MZ_MIN(file_stat.m_comp_size, (mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE); + if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, + (size_t)read_buf_size))) + return MZ_FALSE; + read_buf_avail = 0; + comp_remaining = file_stat.m_comp_size; + } + + if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) { + // The file is stored or the caller has requested the compressed data. + if (pZip->m_pState->m_pMem) { +#ifdef _MSC_VER + if (((0, sizeof(size_t) == sizeof(mz_uint32))) && + (file_stat.m_comp_size > 0xFFFFFFFF)) +#else + if (((sizeof(size_t) == sizeof(mz_uint32))) && + (file_stat.m_comp_size > 0xFFFFFFFF)) +#endif + return MZ_FALSE; + if (pCallback(pOpaque, out_buf_ofs, pRead_buf, + (size_t)file_stat.m_comp_size) != file_stat.m_comp_size) + status = TINFL_STATUS_FAILED; + else if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) + file_crc32 = + (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, + (size_t)file_stat.m_comp_size); + cur_file_ofs += file_stat.m_comp_size; + out_buf_ofs += file_stat.m_comp_size; + comp_remaining = 0; + } else { + while (comp_remaining) { + read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, + (size_t)read_buf_avail) != read_buf_avail) { + status = TINFL_STATUS_FAILED; + break; + } + + if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) + file_crc32 = (mz_uint32)mz_crc32( + file_crc32, (const mz_uint8 *)pRead_buf, (size_t)read_buf_avail); + + if (pCallback(pOpaque, out_buf_ofs, pRead_buf, + (size_t)read_buf_avail) != read_buf_avail) { + status = TINFL_STATUS_FAILED; + break; + } + cur_file_ofs += read_buf_avail; + out_buf_ofs += read_buf_avail; + comp_remaining -= read_buf_avail; + } + } + } else { + tinfl_decompressor inflator; + tinfl_init(&inflator); + + if (NULL == (pWrite_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, + TINFL_LZ_DICT_SIZE))) + status = TINFL_STATUS_FAILED; + else { + do { + mz_uint8 *pWrite_buf_cur = + (mz_uint8 *)pWrite_buf + (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); + size_t in_buf_size, + out_buf_size = + TINFL_LZ_DICT_SIZE - (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); + if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) { + read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, + (size_t)read_buf_avail) != read_buf_avail) { + status = TINFL_STATUS_FAILED; + break; + } + cur_file_ofs += read_buf_avail; + comp_remaining -= read_buf_avail; + read_buf_ofs = 0; + } + + in_buf_size = (size_t)read_buf_avail; + status = tinfl_decompress( + &inflator, (const mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, + (mz_uint8 *)pWrite_buf, pWrite_buf_cur, &out_buf_size, + comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0); + read_buf_avail -= in_buf_size; + read_buf_ofs += in_buf_size; + + if (out_buf_size) { + if (pCallback(pOpaque, out_buf_ofs, pWrite_buf_cur, out_buf_size) != + out_buf_size) { + status = TINFL_STATUS_FAILED; + break; + } + file_crc32 = + (mz_uint32)mz_crc32(file_crc32, pWrite_buf_cur, out_buf_size); + if ((out_buf_ofs += out_buf_size) > file_stat.m_uncomp_size) { + status = TINFL_STATUS_FAILED; + break; + } + } + } while ((status == TINFL_STATUS_NEEDS_MORE_INPUT) || + (status == TINFL_STATUS_HAS_MORE_OUTPUT)); + } + } + + if ((status == TINFL_STATUS_DONE) && + (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))) { + // Make sure the entire file was decompressed, and check its CRC. + if ((out_buf_ofs != file_stat.m_uncomp_size) || + (file_crc32 != file_stat.m_crc32)) + status = TINFL_STATUS_FAILED; + } + + if (!pZip->m_pState->m_pMem) pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + if (pWrite_buf) pZip->m_pFree(pZip->m_pAlloc_opaque, pWrite_buf); + + return status == TINFL_STATUS_DONE; +} + +mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, + const char *pFilename, + mz_file_write_func pCallback, + void *pOpaque, mz_uint flags) { + int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); + if (file_index < 0) return MZ_FALSE; + return mz_zip_reader_extract_to_callback(pZip, file_index, pCallback, pOpaque, + flags); +} + +#ifndef MINIZ_NO_STDIO +static size_t mz_zip_file_write_callback(void *pOpaque, mz_uint64 ofs, + const void *pBuf, size_t n) { + (void)ofs; + return MZ_FWRITE(pBuf, 1, n, (MZ_FILE *)pOpaque); +} + +mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, + const char *pDst_filename, + mz_uint flags) { + mz_bool status; + mz_zip_archive_file_stat file_stat; + MZ_FILE *pFile; + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) return MZ_FALSE; + pFile = MZ_FOPEN(pDst_filename, "wb"); + if (!pFile) return MZ_FALSE; + status = mz_zip_reader_extract_to_callback( + pZip, file_index, mz_zip_file_write_callback, pFile, flags); + if (MZ_FCLOSE(pFile) == EOF) return MZ_FALSE; +#ifndef MINIZ_NO_TIME + if (status) + mz_zip_set_file_times(pDst_filename, file_stat.m_time, file_stat.m_time); +#endif + return status; +} +#endif // #ifndef MINIZ_NO_STDIO + +mz_bool mz_zip_reader_end(mz_zip_archive *pZip) { + if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || + (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) + return MZ_FALSE; + + if (pZip->m_pState) { + mz_zip_internal_state *pState = pZip->m_pState; + pZip->m_pState = NULL; + mz_zip_array_clear(pZip, &pState->m_central_dir); + mz_zip_array_clear(pZip, &pState->m_central_dir_offsets); + mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets); + +#ifndef MINIZ_NO_STDIO + if (pState->m_pFile) { + MZ_FCLOSE(pState->m_pFile); + pState->m_pFile = NULL; + } +#endif // #ifndef MINIZ_NO_STDIO + + pZip->m_pFree(pZip->m_pAlloc_opaque, pState); + } + pZip->m_zip_mode = MZ_ZIP_MODE_INVALID; + + return MZ_TRUE; +} + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, + const char *pArchive_filename, + const char *pDst_filename, + mz_uint flags) { + int file_index = + mz_zip_reader_locate_file(pZip, pArchive_filename, NULL, flags); + if (file_index < 0) return MZ_FALSE; + return mz_zip_reader_extract_to_file(pZip, file_index, pDst_filename, flags); +} +#endif + +// ------------------- .ZIP archive writing + +#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +static void mz_write_le16(mz_uint8 *p, mz_uint16 v) { + p[0] = (mz_uint8)v; + p[1] = (mz_uint8)(v >> 8); +} +static void mz_write_le32(mz_uint8 *p, mz_uint32 v) { + p[0] = (mz_uint8)v; + p[1] = (mz_uint8)(v >> 8); + p[2] = (mz_uint8)(v >> 16); + p[3] = (mz_uint8)(v >> 24); +} +#define MZ_WRITE_LE16(p, v) mz_write_le16((mz_uint8 *)(p), (mz_uint16)(v)) +#define MZ_WRITE_LE32(p, v) mz_write_le32((mz_uint8 *)(p), (mz_uint32)(v)) + +mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size) { + if ((!pZip) || (pZip->m_pState) || (!pZip->m_pWrite) || + (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID)) + return MZ_FALSE; + + if (pZip->m_file_offset_alignment) { + // Ensure user specified file offset alignment is a power of 2. + if (pZip->m_file_offset_alignment & (pZip->m_file_offset_alignment - 1)) + return MZ_FALSE; + } + + if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func; + if (!pZip->m_pFree) pZip->m_pFree = def_free_func; + if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func; + + pZip->m_zip_mode = MZ_ZIP_MODE_WRITING; + pZip->m_archive_size = existing_size; + pZip->m_central_directory_file_ofs = 0; + pZip->m_total_files = 0; + + if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc( + pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state)))) + return MZ_FALSE; + memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, + sizeof(mz_uint8)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, + sizeof(mz_uint32)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, + sizeof(mz_uint32)); + return MZ_TRUE; +} + +static size_t mz_zip_heap_write_func(void *pOpaque, mz_uint64 file_ofs, + const void *pBuf, size_t n) { + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + mz_zip_internal_state *pState = pZip->m_pState; + mz_uint64 new_size = MZ_MAX(file_ofs + n, pState->m_mem_size); +#ifdef _MSC_VER + if ((!n) || + ((0, sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF))) +#else + if ((!n) || + ((sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF))) +#endif + return 0; + if (new_size > pState->m_mem_capacity) { + void *pNew_block; + size_t new_capacity = MZ_MAX(64, pState->m_mem_capacity); + while (new_capacity < new_size) new_capacity *= 2; + if (NULL == (pNew_block = pZip->m_pRealloc( + pZip->m_pAlloc_opaque, pState->m_pMem, 1, new_capacity))) + return 0; + pState->m_pMem = pNew_block; + pState->m_mem_capacity = new_capacity; + } + memcpy((mz_uint8 *)pState->m_pMem + file_ofs, pBuf, n); + pState->m_mem_size = (size_t)new_size; + return n; +} + +mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, + size_t size_to_reserve_at_beginning, + size_t initial_allocation_size) { + pZip->m_pWrite = mz_zip_heap_write_func; + pZip->m_pIO_opaque = pZip; + if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning)) return MZ_FALSE; + if (0 != (initial_allocation_size = MZ_MAX(initial_allocation_size, + size_to_reserve_at_beginning))) { + if (NULL == (pZip->m_pState->m_pMem = pZip->m_pAlloc( + pZip->m_pAlloc_opaque, 1, initial_allocation_size))) { + mz_zip_writer_end(pZip); + return MZ_FALSE; + } + pZip->m_pState->m_mem_capacity = initial_allocation_size; + } + return MZ_TRUE; +} + +#ifndef MINIZ_NO_STDIO +static size_t mz_zip_file_write_func(void *pOpaque, mz_uint64 file_ofs, + const void *pBuf, size_t n) { + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); + if (((mz_int64)file_ofs < 0) || + (((cur_ofs != (mz_int64)file_ofs)) && + (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET)))) + return 0; + return MZ_FWRITE(pBuf, 1, n, pZip->m_pState->m_pFile); +} + +mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, + mz_uint64 size_to_reserve_at_beginning) { + MZ_FILE *pFile; + pZip->m_pWrite = mz_zip_file_write_func; + pZip->m_pIO_opaque = pZip; + if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning)) return MZ_FALSE; + if (NULL == (pFile = MZ_FOPEN(pFilename, "wb"))) { + mz_zip_writer_end(pZip); + return MZ_FALSE; + } + pZip->m_pState->m_pFile = pFile; + if (size_to_reserve_at_beginning) { + mz_uint64 cur_ofs = 0; + char buf[4096]; + MZ_CLEAR_OBJ(buf); + do { + size_t n = (size_t)MZ_MIN(sizeof(buf), size_to_reserve_at_beginning); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_ofs, buf, n) != n) { + mz_zip_writer_end(pZip); + return MZ_FALSE; + } + cur_ofs += n; + size_to_reserve_at_beginning -= n; + } while (size_to_reserve_at_beginning); + } + return MZ_TRUE; +} +#endif // #ifndef MINIZ_NO_STDIO + +mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, + const char *pFilename) { + mz_zip_internal_state *pState; + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) + return MZ_FALSE; + // No sense in trying to write to an archive that's already at the support max + // size + if ((pZip->m_total_files == 0xFFFF) || + ((pZip->m_archive_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) + return MZ_FALSE; + + pState = pZip->m_pState; + + if (pState->m_pFile) { +#ifdef MINIZ_NO_STDIO + pFilename; + return MZ_FALSE; +#else + // Archive is being read from stdio - try to reopen as writable. + if (pZip->m_pIO_opaque != pZip) return MZ_FALSE; + if (!pFilename) return MZ_FALSE; + pZip->m_pWrite = mz_zip_file_write_func; + if (NULL == + (pState->m_pFile = MZ_FREOPEN(pFilename, "r+b", pState->m_pFile))) { + // The mz_zip_archive is now in a bogus state because pState->m_pFile is + // NULL, so just close it. + mz_zip_reader_end(pZip); + return MZ_FALSE; + } +#endif // #ifdef MINIZ_NO_STDIO + } else if (pState->m_pMem) { + // Archive lives in a memory block. Assume it's from the heap that we can + // resize using the realloc callback. + if (pZip->m_pIO_opaque != pZip) return MZ_FALSE; + pState->m_mem_capacity = pState->m_mem_size; + pZip->m_pWrite = mz_zip_heap_write_func; + } + // Archive is being read via a user provided read function - make sure the + // user has specified a write function too. + else if (!pZip->m_pWrite) + return MZ_FALSE; + + // Start writing new files at the archive's current central directory + // location. + pZip->m_archive_size = pZip->m_central_directory_file_ofs; + pZip->m_zip_mode = MZ_ZIP_MODE_WRITING; + pZip->m_central_directory_file_ofs = 0; + + return MZ_TRUE; +} + +mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, + const void *pBuf, size_t buf_size, + mz_uint level_and_flags) { + return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0, + level_and_flags, 0, 0); +} + +typedef struct { + mz_zip_archive *m_pZip; + mz_uint64 m_cur_archive_file_ofs; + mz_uint64 m_comp_size; +} mz_zip_writer_add_state; + +static mz_bool mz_zip_writer_add_put_buf_callback(const void *pBuf, int len, + void *pUser) { + mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser; + if ((int)pState->m_pZip->m_pWrite(pState->m_pZip->m_pIO_opaque, + pState->m_cur_archive_file_ofs, pBuf, + len) != len) + return MZ_FALSE; + pState->m_cur_archive_file_ofs += len; + pState->m_comp_size += len; + return MZ_TRUE; +} + +static mz_bool mz_zip_writer_create_local_dir_header( + mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, + mz_uint16 extra_size, mz_uint64 uncomp_size, mz_uint64 comp_size, + mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, + mz_uint16 dos_time, mz_uint16 dos_date) { + (void)pZip; + memset(pDst, 0, MZ_ZIP_LOCAL_DIR_HEADER_SIZE); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_SIG_OFS, MZ_ZIP_LOCAL_DIR_HEADER_SIG); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_VERSION_NEEDED_OFS, method ? 20 : 0); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_BIT_FLAG_OFS, bit_flags); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_METHOD_OFS, method); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_TIME_OFS, dos_time); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_DATE_OFS, dos_date); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_CRC32_OFS, uncomp_crc32); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS, comp_size); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS, uncomp_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILENAME_LEN_OFS, filename_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_EXTRA_LEN_OFS, extra_size); + return MZ_TRUE; +} + +static mz_bool mz_zip_writer_create_central_dir_header( + mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, + mz_uint16 extra_size, mz_uint16 comment_size, mz_uint64 uncomp_size, + mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, + mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, + mz_uint64 local_header_ofs, mz_uint32 ext_attributes) { + (void)pZip; + memset(pDst, 0, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_SIG_OFS, MZ_ZIP_CENTRAL_DIR_HEADER_SIG); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_VERSION_NEEDED_OFS, method ? 20 : 0); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_BIT_FLAG_OFS, bit_flags); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_METHOD_OFS, method); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_TIME_OFS, dos_time); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_DATE_OFS, dos_date); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_CRC32_OFS, uncomp_crc32); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS, comp_size); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS, uncomp_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILENAME_LEN_OFS, filename_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_EXTRA_LEN_OFS, extra_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_COMMENT_LEN_OFS, comment_size); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS, ext_attributes); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_header_ofs); + return MZ_TRUE; +} + +static mz_bool mz_zip_writer_add_to_central_dir( + mz_zip_archive *pZip, const char *pFilename, mz_uint16 filename_size, + const void *pExtra, mz_uint16 extra_size, const void *pComment, + mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, + mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, + mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, + mz_uint32 ext_attributes) { + mz_zip_internal_state *pState = pZip->m_pState; + mz_uint32 central_dir_ofs = (mz_uint32)pState->m_central_dir.m_size; + size_t orig_central_dir_size = pState->m_central_dir.m_size; + mz_uint8 central_dir_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE]; + + // No zip64 support yet + if ((local_header_ofs > 0xFFFFFFFF) || + (((mz_uint64)pState->m_central_dir.m_size + + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + extra_size + + comment_size) > 0xFFFFFFFF)) + return MZ_FALSE; + + if (!mz_zip_writer_create_central_dir_header( + pZip, central_dir_header, filename_size, extra_size, comment_size, + uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, + dos_date, local_header_ofs, ext_attributes)) + return MZ_FALSE; + + if ((!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_dir_header, + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pFilename, + filename_size)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pExtra, + extra_size)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pComment, + comment_size)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, + ¢ral_dir_ofs, 1))) { + // Try to push the central directory array back into its original state. + mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, + MZ_FALSE); + return MZ_FALSE; + } + + return MZ_TRUE; +} + +static mz_bool mz_zip_writer_validate_archive_name(const char *pArchive_name) { + // Basic ZIP archive filename validity checks: Valid filenames cannot start + // with a forward slash, cannot contain a drive letter, and cannot use + // DOS-style backward slashes. + if (*pArchive_name == '/') return MZ_FALSE; + while (*pArchive_name) { + if ((*pArchive_name == '\\') || (*pArchive_name == ':')) return MZ_FALSE; + pArchive_name++; + } + return MZ_TRUE; +} + +static mz_uint mz_zip_writer_compute_padding_needed_for_file_alignment( + mz_zip_archive *pZip) { + mz_uint32 n; + if (!pZip->m_file_offset_alignment) return 0; + n = (mz_uint32)(pZip->m_archive_size & (pZip->m_file_offset_alignment - 1)); + return (pZip->m_file_offset_alignment - n) & + (pZip->m_file_offset_alignment - 1); +} + +static mz_bool mz_zip_writer_write_zeros(mz_zip_archive *pZip, + mz_uint64 cur_file_ofs, mz_uint32 n) { + char buf[4096]; + memset(buf, 0, MZ_MIN(sizeof(buf), n)); + while (n) { + mz_uint32 s = MZ_MIN(sizeof(buf), n); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_file_ofs, buf, s) != s) + return MZ_FALSE; + cur_file_ofs += s; + n -= s; + } + return MZ_TRUE; +} + +mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, + const char *pArchive_name, const void *pBuf, + size_t buf_size, const void *pComment, + mz_uint16 comment_size, + mz_uint level_and_flags, mz_uint64 uncomp_size, + mz_uint32 uncomp_crc32) { + mz_uint16 method = 0, dos_time = 0, dos_date = 0; + mz_uint level, ext_attributes = 0, num_alignment_padding_bytes; + mz_uint64 local_dir_header_ofs = pZip->m_archive_size, + cur_archive_file_ofs = pZip->m_archive_size, comp_size = 0; + size_t archive_name_size; + mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; + tdefl_compressor *pComp = NULL; + mz_bool store_data_uncompressed; + mz_zip_internal_state *pState; + + if ((int)level_and_flags < 0) level_and_flags = MZ_DEFAULT_LEVEL; + level = level_and_flags & 0xF; + store_data_uncompressed = + ((!level) || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)); + + if ((!pZip) || (!pZip->m_pState) || + (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || ((buf_size) && (!pBuf)) || + (!pArchive_name) || ((comment_size) && (!pComment)) || + (pZip->m_total_files == 0xFFFF) || (level > MZ_UBER_COMPRESSION)) + return MZ_FALSE; + + pState = pZip->m_pState; + + if ((!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (uncomp_size)) + return MZ_FALSE; + // No zip64 support yet + if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF)) return MZ_FALSE; + if (!mz_zip_writer_validate_archive_name(pArchive_name)) return MZ_FALSE; + +#ifndef MINIZ_NO_TIME + { + time_t cur_time; + time(&cur_time); + mz_zip_time_to_dos_time(cur_time, &dos_time, &dos_date); + } +#endif // #ifndef MINIZ_NO_TIME + + archive_name_size = strlen(pArchive_name); + if (archive_name_size > 0xFFFF) return MZ_FALSE; + + num_alignment_padding_bytes = + mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + + // no zip64 support yet + if ((pZip->m_total_files == 0xFFFF) || + ((pZip->m_archive_size + num_alignment_padding_bytes + + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + + comment_size + archive_name_size) > 0xFFFFFFFF)) + return MZ_FALSE; + + if ((archive_name_size) && (pArchive_name[archive_name_size - 1] == '/')) { + // Set DOS Subdirectory attribute bit. + ext_attributes |= 0x10; + // Subdirectories cannot contain data. + if ((buf_size) || (uncomp_size)) return MZ_FALSE; + } + + // Try to do any allocations before writing to the archive, so if an + // allocation fails the file remains unmodified. (A good idea if we're doing + // an in-place modification.) + if ((!mz_zip_array_ensure_room( + pZip, &pState->m_central_dir, + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + comment_size)) || + (!mz_zip_array_ensure_room(pZip, &pState->m_central_dir_offsets, 1))) + return MZ_FALSE; + + if ((!store_data_uncompressed) && (buf_size)) { + if (NULL == (pComp = (tdefl_compressor *)pZip->m_pAlloc( + pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)))) + return MZ_FALSE; + } + + if (!mz_zip_writer_write_zeros( + pZip, cur_archive_file_ofs, + num_alignment_padding_bytes + sizeof(local_dir_header))) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + local_dir_header_ofs += num_alignment_padding_bytes; + if (pZip->m_file_offset_alignment) { + MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == + 0); + } + cur_archive_file_ofs += + num_alignment_padding_bytes + sizeof(local_dir_header); + + MZ_CLEAR_OBJ(local_dir_header); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, + archive_name_size) != archive_name_size) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + cur_archive_file_ofs += archive_name_size; + + if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) { + uncomp_crc32 = + (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, buf_size); + uncomp_size = buf_size; + if (uncomp_size <= 3) { + level = 0; + store_data_uncompressed = MZ_TRUE; + } + } + + if (store_data_uncompressed) { + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pBuf, + buf_size) != buf_size) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + + cur_archive_file_ofs += buf_size; + comp_size = buf_size; + + if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) method = MZ_DEFLATED; + } else if (buf_size) { + mz_zip_writer_add_state state; + + state.m_pZip = pZip; + state.m_cur_archive_file_ofs = cur_archive_file_ofs; + state.m_comp_size = 0; + + if ((tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, + tdefl_create_comp_flags_from_zip_params( + level, -15, MZ_DEFAULT_STRATEGY)) != + TDEFL_STATUS_OKAY) || + (tdefl_compress_buffer(pComp, pBuf, buf_size, TDEFL_FINISH) != + TDEFL_STATUS_DONE)) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + + comp_size = state.m_comp_size; + cur_archive_file_ofs = state.m_cur_archive_file_ofs; + + method = MZ_DEFLATED; + } + + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + pComp = NULL; + + // no zip64 support yet + if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF)) + return MZ_FALSE; + + if (!mz_zip_writer_create_local_dir_header( + pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, + comp_size, uncomp_crc32, method, 0, dos_time, dos_date)) + return MZ_FALSE; + + if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, + sizeof(local_dir_header)) != sizeof(local_dir_header)) + return MZ_FALSE; + + if (!mz_zip_writer_add_to_central_dir( + pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, + comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, + dos_time, dos_date, local_dir_header_ofs, ext_attributes)) + return MZ_FALSE; + + pZip->m_total_files++; + pZip->m_archive_size = cur_archive_file_ofs; + + return MZ_TRUE; +} + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, + const char *pSrc_filename, const void *pComment, + mz_uint16 comment_size, + mz_uint level_and_flags) { + mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes; + mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0; + mz_uint64 local_dir_header_ofs = pZip->m_archive_size, + cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, + comp_size = 0; + size_t archive_name_size; + mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; + MZ_FILE *pSrc_file = NULL; + + if ((int)level_and_flags < 0) level_and_flags = MZ_DEFAULT_LEVEL; + level = level_and_flags & 0xF; + + if ((!pZip) || (!pZip->m_pState) || + (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) || + ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION)) + return MZ_FALSE; + if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) return MZ_FALSE; + if (!mz_zip_writer_validate_archive_name(pArchive_name)) return MZ_FALSE; + + archive_name_size = strlen(pArchive_name); + if (archive_name_size > 0xFFFF) return MZ_FALSE; + + num_alignment_padding_bytes = + mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + + // no zip64 support yet + if ((pZip->m_total_files == 0xFFFF) || + ((pZip->m_archive_size + num_alignment_padding_bytes + + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + + comment_size + archive_name_size) > 0xFFFFFFFF)) + return MZ_FALSE; + + if (!mz_zip_get_file_modified_time(pSrc_filename, &dos_time, &dos_date)) + return MZ_FALSE; + + pSrc_file = MZ_FOPEN(pSrc_filename, "rb"); + if (!pSrc_file) return MZ_FALSE; + MZ_FSEEK64(pSrc_file, 0, SEEK_END); + uncomp_size = MZ_FTELL64(pSrc_file); + MZ_FSEEK64(pSrc_file, 0, SEEK_SET); + + if (uncomp_size > 0xFFFFFFFF) { + // No zip64 support yet + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + if (uncomp_size <= 3) level = 0; + + if (!mz_zip_writer_write_zeros( + pZip, cur_archive_file_ofs, + num_alignment_padding_bytes + sizeof(local_dir_header))) { + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + local_dir_header_ofs += num_alignment_padding_bytes; + if (pZip->m_file_offset_alignment) { + MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == + 0); + } + cur_archive_file_ofs += + num_alignment_padding_bytes + sizeof(local_dir_header); + + MZ_CLEAR_OBJ(local_dir_header); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, + archive_name_size) != archive_name_size) { + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + cur_archive_file_ofs += archive_name_size; + + if (uncomp_size) { + mz_uint64 uncomp_remaining = uncomp_size; + void *pRead_buf = + pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE); + if (!pRead_buf) { + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + + if (!level) { + while (uncomp_remaining) { + mz_uint n = + (mz_uint)MZ_MIN((mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining); + if ((MZ_FREAD(pRead_buf, 1, n, pSrc_file) != n) || + (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, + n) != n)) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + uncomp_crc32 = + (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n); + uncomp_remaining -= n; + cur_archive_file_ofs += n; + } + comp_size = uncomp_size; + } else { + mz_bool result = MZ_FALSE; + mz_zip_writer_add_state state; + tdefl_compressor *pComp = (tdefl_compressor *)pZip->m_pAlloc( + pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)); + if (!pComp) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + + state.m_pZip = pZip; + state.m_cur_archive_file_ofs = cur_archive_file_ofs; + state.m_comp_size = 0; + + if (tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, + tdefl_create_comp_flags_from_zip_params( + level, -15, MZ_DEFAULT_STRATEGY)) != + TDEFL_STATUS_OKAY) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + + for (;;) { + size_t in_buf_size = (mz_uint32)MZ_MIN(uncomp_remaining, + (mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE); + tdefl_status status; + + if (MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size) + break; + + uncomp_crc32 = (mz_uint32)mz_crc32( + uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size); + uncomp_remaining -= in_buf_size; + + status = tdefl_compress_buffer( + pComp, pRead_buf, in_buf_size, + uncomp_remaining ? TDEFL_NO_FLUSH : TDEFL_FINISH); + if (status == TDEFL_STATUS_DONE) { + result = MZ_TRUE; + break; + } else if (status != TDEFL_STATUS_OKAY) + break; + } + + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + + if (!result) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + + comp_size = state.m_comp_size; + cur_archive_file_ofs = state.m_cur_archive_file_ofs; + + method = MZ_DEFLATED; + } + + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + } + + MZ_FCLOSE(pSrc_file); + pSrc_file = NULL; + + // no zip64 support yet + if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF)) + return MZ_FALSE; + + if (!mz_zip_writer_create_local_dir_header( + pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, + comp_size, uncomp_crc32, method, 0, dos_time, dos_date)) + return MZ_FALSE; + + if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, + sizeof(local_dir_header)) != sizeof(local_dir_header)) + return MZ_FALSE; + + if (!mz_zip_writer_add_to_central_dir( + pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, + comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, + dos_time, dos_date, local_dir_header_ofs, ext_attributes)) + return MZ_FALSE; + + pZip->m_total_files++; + pZip->m_archive_size = cur_archive_file_ofs; + + return MZ_TRUE; +} +#endif // #ifndef MINIZ_NO_STDIO + +mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, + mz_zip_archive *pSource_zip, + mz_uint file_index) { + mz_uint n, bit_flags, num_alignment_padding_bytes; + mz_uint64 comp_bytes_remaining, local_dir_header_ofs; + mz_uint64 cur_src_file_ofs, cur_dst_file_ofs; + mz_uint32 + local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / + sizeof(mz_uint32)]; + mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; + mz_uint8 central_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE]; + size_t orig_central_dir_size; + mz_zip_internal_state *pState; + void *pBuf; + const mz_uint8 *pSrc_central_header; + + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING)) + return MZ_FALSE; + if (NULL == + (pSrc_central_header = mz_zip_reader_get_cdh(pSource_zip, file_index))) + return MZ_FALSE; + pState = pZip->m_pState; + + num_alignment_padding_bytes = + mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + + // no zip64 support yet + if ((pZip->m_total_files == 0xFFFF) || + ((pZip->m_archive_size + num_alignment_padding_bytes + + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) > + 0xFFFFFFFF)) + return MZ_FALSE; + + cur_src_file_ofs = + MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS); + cur_dst_file_ofs = pZip->m_archive_size; + + if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, + pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + return MZ_FALSE; + if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) + return MZ_FALSE; + cur_src_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE; + + if (!mz_zip_writer_write_zeros(pZip, cur_dst_file_ofs, + num_alignment_padding_bytes)) + return MZ_FALSE; + cur_dst_file_ofs += num_alignment_padding_bytes; + local_dir_header_ofs = cur_dst_file_ofs; + if (pZip->m_file_offset_alignment) { + MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == + 0); + } + + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pLocal_header, + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + return MZ_FALSE; + cur_dst_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE; + + n = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); + comp_bytes_remaining = + n + MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + + if (NULL == (pBuf = pZip->m_pAlloc( + pZip->m_pAlloc_opaque, 1, + (size_t)MZ_MAX(sizeof(mz_uint32) * 4, + MZ_MIN((mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE, + comp_bytes_remaining))))) + return MZ_FALSE; + + while (comp_bytes_remaining) { + n = (mz_uint)MZ_MIN((mz_uint)MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining); + if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, + n) != n) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + cur_src_file_ofs += n; + + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + cur_dst_file_ofs += n; + + comp_bytes_remaining -= n; + } + + bit_flags = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_BIT_FLAG_OFS); + if (bit_flags & 8) { + // Copy data descriptor + if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, + sizeof(mz_uint32) * 4) != sizeof(mz_uint32) * 4) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + + n = sizeof(mz_uint32) * ((MZ_READ_LE32(pBuf) == 0x08074b50) ? 4 : 3); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + + cur_src_file_ofs += n; + cur_dst_file_ofs += n; + } + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + + // no zip64 support yet + if (cur_dst_file_ofs > 0xFFFFFFFF) return MZ_FALSE; + + orig_central_dir_size = pState->m_central_dir.m_size; + + memcpy(central_header, pSrc_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE); + MZ_WRITE_LE32(central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS, + local_dir_header_ofs); + if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_header, + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) + return MZ_FALSE; + + n = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_FILENAME_LEN_OFS) + + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_EXTRA_LEN_OFS) + + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_COMMENT_LEN_OFS); + if (!mz_zip_array_push_back( + pZip, &pState->m_central_dir, + pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n)) { + mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, + MZ_FALSE); + return MZ_FALSE; + } + + if (pState->m_central_dir.m_size > 0xFFFFFFFF) return MZ_FALSE; + n = (mz_uint32)orig_central_dir_size; + if (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &n, 1)) { + mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, + MZ_FALSE); + return MZ_FALSE; + } + + pZip->m_total_files++; + pZip->m_archive_size = cur_dst_file_ofs; + + return MZ_TRUE; +} + +mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip) { + mz_zip_internal_state *pState; + mz_uint64 central_dir_ofs, central_dir_size; + mz_uint8 hdr[MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE]; + + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING)) + return MZ_FALSE; + + pState = pZip->m_pState; + + // no zip64 support yet + if ((pZip->m_total_files > 0xFFFF) || + ((pZip->m_archive_size + pState->m_central_dir.m_size + + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) + return MZ_FALSE; + + central_dir_ofs = 0; + central_dir_size = 0; + if (pZip->m_total_files) { + // Write central directory + central_dir_ofs = pZip->m_archive_size; + central_dir_size = pState->m_central_dir.m_size; + pZip->m_central_directory_file_ofs = central_dir_ofs; + if (pZip->m_pWrite(pZip->m_pIO_opaque, central_dir_ofs, + pState->m_central_dir.m_p, + (size_t)central_dir_size) != central_dir_size) + return MZ_FALSE; + pZip->m_archive_size += central_dir_size; + } + + // Write end of central directory record + MZ_CLEAR_OBJ(hdr); + MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_SIG_OFS, + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG); + MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS, + pZip->m_total_files); + MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS, pZip->m_total_files); + MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_SIZE_OFS, central_dir_size); + MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_OFS_OFS, central_dir_ofs); + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr, + sizeof(hdr)) != sizeof(hdr)) + return MZ_FALSE; +#ifndef MINIZ_NO_STDIO + if ((pState->m_pFile) && (MZ_FFLUSH(pState->m_pFile) == EOF)) return MZ_FALSE; +#endif // #ifndef MINIZ_NO_STDIO + + pZip->m_archive_size += sizeof(hdr); + + pZip->m_zip_mode = MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED; + return MZ_TRUE; +} + +mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, + size_t *pSize) { + if ((!pZip) || (!pZip->m_pState) || (!pBuf) || (!pSize)) return MZ_FALSE; + if (pZip->m_pWrite != mz_zip_heap_write_func) return MZ_FALSE; + if (!mz_zip_writer_finalize_archive(pZip)) return MZ_FALSE; + + *pBuf = pZip->m_pState->m_pMem; + *pSize = pZip->m_pState->m_mem_size; + pZip->m_pState->m_pMem = NULL; + pZip->m_pState->m_mem_size = pZip->m_pState->m_mem_capacity = 0; + return MZ_TRUE; +} + +mz_bool mz_zip_writer_end(mz_zip_archive *pZip) { + mz_zip_internal_state *pState; + mz_bool status = MZ_TRUE; + if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || + ((pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) && + (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED))) + return MZ_FALSE; + + pState = pZip->m_pState; + pZip->m_pState = NULL; + mz_zip_array_clear(pZip, &pState->m_central_dir); + mz_zip_array_clear(pZip, &pState->m_central_dir_offsets); + mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets); + +#ifndef MINIZ_NO_STDIO + if (pState->m_pFile) { + MZ_FCLOSE(pState->m_pFile); + pState->m_pFile = NULL; + } +#endif // #ifndef MINIZ_NO_STDIO + + if ((pZip->m_pWrite == mz_zip_heap_write_func) && (pState->m_pMem)) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pState->m_pMem); + pState->m_pMem = NULL; + } + + pZip->m_pFree(pZip->m_pAlloc_opaque, pState); + pZip->m_zip_mode = MZ_ZIP_MODE_INVALID; + return status; +} + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_add_mem_to_archive_file_in_place( + const char *pZip_filename, const char *pArchive_name, const void *pBuf, + size_t buf_size, const void *pComment, mz_uint16 comment_size, + mz_uint level_and_flags) { + mz_bool status, created_new_archive = MZ_FALSE; + mz_zip_archive zip_archive; + struct MZ_FILE_STAT_STRUCT file_stat; + MZ_CLEAR_OBJ(zip_archive); + if ((int)level_and_flags < 0) level_and_flags = MZ_DEFAULT_LEVEL; + if ((!pZip_filename) || (!pArchive_name) || ((buf_size) && (!pBuf)) || + ((comment_size) && (!pComment)) || + ((level_and_flags & 0xF) > MZ_UBER_COMPRESSION)) + return MZ_FALSE; + if (!mz_zip_writer_validate_archive_name(pArchive_name)) return MZ_FALSE; + if (MZ_FILE_STAT(pZip_filename, &file_stat) != 0) { + // Create a new archive. + if (!mz_zip_writer_init_file(&zip_archive, pZip_filename, 0)) + return MZ_FALSE; + created_new_archive = MZ_TRUE; + } else { + // Append to an existing archive. + if (!mz_zip_reader_init_file( + &zip_archive, pZip_filename, + level_and_flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY)) + return MZ_FALSE; + if (!mz_zip_writer_init_from_reader(&zip_archive, pZip_filename)) { + mz_zip_reader_end(&zip_archive); + return MZ_FALSE; + } + } + status = + mz_zip_writer_add_mem_ex(&zip_archive, pArchive_name, pBuf, buf_size, + pComment, comment_size, level_and_flags, 0, 0); + // Always finalize, even if adding failed for some reason, so we have a valid + // central directory. (This may not always succeed, but we can try.) + if (!mz_zip_writer_finalize_archive(&zip_archive)) status = MZ_FALSE; + if (!mz_zip_writer_end(&zip_archive)) status = MZ_FALSE; + if ((!status) && (created_new_archive)) { + // It's a new archive and something went wrong, so just delete it. + int ignoredStatus = MZ_DELETE_FILE(pZip_filename); + (void)ignoredStatus; + } + return status; +} + +void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, + const char *pArchive_name, + size_t *pSize, mz_uint flags) { + int file_index; + mz_zip_archive zip_archive; + void *p = NULL; + + if (pSize) *pSize = 0; + + if ((!pZip_filename) || (!pArchive_name)) return NULL; + + MZ_CLEAR_OBJ(zip_archive); + if (!mz_zip_reader_init_file( + &zip_archive, pZip_filename, + flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY)) + return NULL; + + if ((file_index = mz_zip_reader_locate_file(&zip_archive, pArchive_name, NULL, + flags)) >= 0) + p = mz_zip_reader_extract_to_heap(&zip_archive, file_index, pSize, flags); + + mz_zip_reader_end(&zip_archive); + return p; +} + +#endif // #ifndef MINIZ_NO_STDIO + +#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +#endif // #ifndef MINIZ_NO_ARCHIVE_APIS + +#ifdef __cplusplus +} +#endif + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#endif // MINIZ_HEADER_FILE_ONLY + +/* + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + For more information, please refer to +*/ + +// ---------------------- end of miniz ---------------------------------------- + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +} // namespace miniz +#else + +// Reuse MINIZ_LITTE_ENDIAN macro + +#if defined(__sparcv9) +// Big endian +#else +#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU +// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. +#define MINIZ_LITTLE_ENDIAN 1 +#endif +#endif + +#endif // TINYEXR_USE_MINIZ + +// static bool IsBigEndian(void) { +// union { +// unsigned int i; +// char c[4]; +// } bint = {0x01020304}; +// +// return bint.c[0] == 1; +//} + +static void SetErrorMessage(const std::string &msg, const char **err) { + if (err) { +#ifdef _WIN32 + (*err) = _strdup(msg.c_str()); +#else + (*err) = strdup(msg.c_str()); +#endif + } +} + +static const int kEXRVersionSize = 8; + +static void cpy2(unsigned short *dst_val, const unsigned short *src_val) { + unsigned char *dst = reinterpret_cast(dst_val); + const unsigned char *src = reinterpret_cast(src_val); + + dst[0] = src[0]; + dst[1] = src[1]; +} + +static void swap2(unsigned short *val) { +#ifdef MINIZ_LITTLE_ENDIAN + (void)val; +#else + unsigned short tmp = *val; + unsigned char *dst = reinterpret_cast(val); + unsigned char *src = reinterpret_cast(&tmp); + + dst[0] = src[1]; + dst[1] = src[0]; +#endif +} + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-function" +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif +static void cpy4(int *dst_val, const int *src_val) { + unsigned char *dst = reinterpret_cast(dst_val); + const unsigned char *src = reinterpret_cast(src_val); + + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; +} + +static void cpy4(unsigned int *dst_val, const unsigned int *src_val) { + unsigned char *dst = reinterpret_cast(dst_val); + const unsigned char *src = reinterpret_cast(src_val); + + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; +} + +static void cpy4(float *dst_val, const float *src_val) { + unsigned char *dst = reinterpret_cast(dst_val); + const unsigned char *src = reinterpret_cast(src_val); + + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; +} +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + +static void swap4(unsigned int *val) { +#ifdef MINIZ_LITTLE_ENDIAN + (void)val; +#else + unsigned int tmp = *val; + unsigned char *dst = reinterpret_cast(val); + unsigned char *src = reinterpret_cast(&tmp); + + dst[0] = src[3]; + dst[1] = src[2]; + dst[2] = src[1]; + dst[3] = src[0]; +#endif +} + +#if 0 +static void cpy8(tinyexr::tinyexr_uint64 *dst_val, const tinyexr::tinyexr_uint64 *src_val) { + unsigned char *dst = reinterpret_cast(dst_val); + const unsigned char *src = reinterpret_cast(src_val); + + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + dst[4] = src[4]; + dst[5] = src[5]; + dst[6] = src[6]; + dst[7] = src[7]; +} +#endif + +static void swap8(tinyexr::tinyexr_uint64 *val) { +#ifdef MINIZ_LITTLE_ENDIAN + (void)val; +#else + tinyexr::tinyexr_uint64 tmp = (*val); + unsigned char *dst = reinterpret_cast(val); + unsigned char *src = reinterpret_cast(&tmp); + + dst[0] = src[7]; + dst[1] = src[6]; + dst[2] = src[5]; + dst[3] = src[4]; + dst[4] = src[3]; + dst[5] = src[2]; + dst[6] = src[1]; + dst[7] = src[0]; +#endif +} + +// https://gist.github.com/rygorous/2156668 +// Reuse MINIZ_LITTLE_ENDIAN flag from miniz. +union FP32 { + unsigned int u; + float f; + struct { +#if MINIZ_LITTLE_ENDIAN + unsigned int Mantissa : 23; + unsigned int Exponent : 8; + unsigned int Sign : 1; +#else + unsigned int Sign : 1; + unsigned int Exponent : 8; + unsigned int Mantissa : 23; +#endif + } s; +}; + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +union FP16 { + unsigned short u; + struct { +#if MINIZ_LITTLE_ENDIAN + unsigned int Mantissa : 10; + unsigned int Exponent : 5; + unsigned int Sign : 1; +#else + unsigned int Sign : 1; + unsigned int Exponent : 5; + unsigned int Mantissa : 10; +#endif + } s; +}; + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +static FP32 half_to_float(FP16 h) { + static const FP32 magic = {113 << 23}; + static const unsigned int shifted_exp = 0x7c00 + << 13; // exponent mask after shift + FP32 o; + + o.u = (h.u & 0x7fffU) << 13U; // exponent/mantissa bits + unsigned int exp_ = shifted_exp & o.u; // just the exponent + o.u += (127 - 15) << 23; // exponent adjust + + // handle exponent special cases + if (exp_ == shifted_exp) // Inf/NaN? + o.u += (128 - 16) << 23; // extra exp adjust + else if (exp_ == 0) // Zero/Denormal? + { + o.u += 1 << 23; // extra exp adjust + o.f -= magic.f; // renormalize + } + + o.u |= (h.u & 0x8000U) << 16U; // sign bit + return o; +} + +static FP16 float_to_half_full(FP32 f) { + FP16 o = {0}; + + // Based on ISPC reference code (with minor modifications) + if (f.s.Exponent == 0) // Signed zero/denormal (which will underflow) + o.s.Exponent = 0; + else if (f.s.Exponent == 255) // Inf or NaN (all exponent bits set) + { + o.s.Exponent = 31; + o.s.Mantissa = f.s.Mantissa ? 0x200 : 0; // NaN->qNaN and Inf->Inf + } else // Normalized number + { + // Exponent unbias the single, then bias the halfp + int newexp = f.s.Exponent - 127 + 15; + if (newexp >= 31) // Overflow, return signed infinity + o.s.Exponent = 31; + else if (newexp <= 0) // Underflow + { + if ((14 - newexp) <= 24) // Mantissa might be non-zero + { + unsigned int mant = f.s.Mantissa | 0x800000; // Hidden 1 bit + o.s.Mantissa = mant >> (14 - newexp); + if ((mant >> (13 - newexp)) & 1) // Check for rounding + o.u++; // Round, might overflow into exp bit, but this is OK + } + } else { + o.s.Exponent = static_cast(newexp); + o.s.Mantissa = f.s.Mantissa >> 13; + if (f.s.Mantissa & 0x1000) // Check for rounding + o.u++; // Round, might overflow to inf, this is OK + } + } + + o.s.Sign = f.s.Sign; + return o; +} + +// NOTE: From OpenEXR code +// #define IMF_INCREASING_Y 0 +// #define IMF_DECREASING_Y 1 +// #define IMF_RAMDOM_Y 2 +// +// #define IMF_NO_COMPRESSION 0 +// #define IMF_RLE_COMPRESSION 1 +// #define IMF_ZIPS_COMPRESSION 2 +// #define IMF_ZIP_COMPRESSION 3 +// #define IMF_PIZ_COMPRESSION 4 +// #define IMF_PXR24_COMPRESSION 5 +// #define IMF_B44_COMPRESSION 6 +// #define IMF_B44A_COMPRESSION 7 + +#ifdef __clang__ +#pragma clang diagnostic push + +#if __has_warning("-Wzero-as-null-pointer-constant") +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#endif + +#endif + +static const char *ReadString(std::string *s, const char *ptr, size_t len) { + // Read untile NULL(\0). + const char *p = ptr; + const char *q = ptr; + while ((size_t(q - ptr) < len) && (*q) != 0) { + q++; + } + + if (size_t(q - ptr) >= len) { + (*s) = std::string(); + return NULL; + } + + (*s) = std::string(p, q); + + return q + 1; // skip '\0' +} + +static bool ReadAttribute(std::string *name, std::string *type, + std::vector *data, size_t *marker_size, + const char *marker, size_t size) { + size_t name_len = strnlen(marker, size); + if (name_len == size) { + // String does not have a terminating character. + return false; + } + *name = std::string(marker, name_len); + + marker += name_len + 1; + size -= name_len + 1; + + size_t type_len = strnlen(marker, size); + if (type_len == size) { + return false; + } + *type = std::string(marker, type_len); + + marker += type_len + 1; + size -= type_len + 1; + + if (size < sizeof(uint32_t)) { + return false; + } + + uint32_t data_len; + memcpy(&data_len, marker, sizeof(uint32_t)); + tinyexr::swap4(reinterpret_cast(&data_len)); + + if (data_len == 0) { + if ((*type).compare("string") == 0) { + // Accept empty string attribute. + + marker += sizeof(uint32_t); + size -= sizeof(uint32_t); + + *marker_size = name_len + 1 + type_len + 1 + sizeof(uint32_t); + + data->resize(1); + (*data)[0] = '\0'; + + return true; + } else { + return false; + } + } + + marker += sizeof(uint32_t); + size -= sizeof(uint32_t); + + if (size < data_len) { + return false; + } + + data->resize(static_cast(data_len)); + memcpy(&data->at(0), marker, static_cast(data_len)); + + *marker_size = name_len + 1 + type_len + 1 + sizeof(uint32_t) + data_len; + return true; +} + +static void WriteAttributeToMemory(std::vector *out, + const char *name, const char *type, + const unsigned char *data, int len) { + out->insert(out->end(), name, name + strlen(name) + 1); + out->insert(out->end(), type, type + strlen(type) + 1); + + int outLen = len; + tinyexr::swap4(reinterpret_cast(&outLen)); + out->insert(out->end(), reinterpret_cast(&outLen), + reinterpret_cast(&outLen) + sizeof(int)); + out->insert(out->end(), data, data + len); +} + +struct ChannelInfo { + std::string name; // less than 255 bytes long + int pixel_type; + int x_sampling; + int y_sampling; + unsigned char p_linear; + unsigned char pad[3]; +}; + +struct HeaderInfo { + std::vector channels; + std::vector attributes; + + int data_window[4]; + int line_order; + int display_window[4]; + float screen_window_center[2]; + float screen_window_width; + float pixel_aspect_ratio; + + int chunk_count; + + // Tiled format + int tile_size_x; + int tile_size_y; + int tile_level_mode; + int tile_rounding_mode; + + unsigned int header_len; + + int compression_type; + + void clear() { + channels.clear(); + attributes.clear(); + + data_window[0] = 0; + data_window[1] = 0; + data_window[2] = 0; + data_window[3] = 0; + line_order = 0; + display_window[0] = 0; + display_window[1] = 0; + display_window[2] = 0; + display_window[3] = 0; + screen_window_center[0] = 0.0f; + screen_window_center[1] = 0.0f; + screen_window_width = 0.0f; + pixel_aspect_ratio = 0.0f; + + chunk_count = 0; + + // Tiled format + tile_size_x = 0; + tile_size_y = 0; + tile_level_mode = 0; + tile_rounding_mode = 0; + + header_len = 0; + compression_type = 0; + } +}; + +static bool ReadChannelInfo(std::vector &channels, + const std::vector &data) { + const char *p = reinterpret_cast(&data.at(0)); + + for (;;) { + if ((*p) == 0) { + break; + } + ChannelInfo info; + + tinyexr_int64 data_len = static_cast(data.size()) - + (p - reinterpret_cast(data.data())); + if (data_len < 0) { + return false; + } + + p = ReadString(&info.name, p, size_t(data_len)); + if ((p == NULL) && (info.name.empty())) { + // Buffer overrun. Issue #51. + return false; + } + + const unsigned char *data_end = + reinterpret_cast(p) + 16; + if (data_end >= (data.data() + data.size())) { + return false; + } + + memcpy(&info.pixel_type, p, sizeof(int)); + p += 4; + info.p_linear = static_cast(p[0]); // uchar + p += 1 + 3; // reserved: uchar[3] + memcpy(&info.x_sampling, p, sizeof(int)); // int + p += 4; + memcpy(&info.y_sampling, p, sizeof(int)); // int + p += 4; + + tinyexr::swap4(reinterpret_cast(&info.pixel_type)); + tinyexr::swap4(reinterpret_cast(&info.x_sampling)); + tinyexr::swap4(reinterpret_cast(&info.y_sampling)); + + channels.push_back(info); + } + + return true; +} + +static void WriteChannelInfo(std::vector &data, + const std::vector &channels) { + size_t sz = 0; + + // Calculate total size. + for (size_t c = 0; c < channels.size(); c++) { + sz += strlen(channels[c].name.c_str()) + 1; // +1 for \0 + sz += 16; // 4 * int + } + data.resize(sz + 1); + + unsigned char *p = &data.at(0); + + for (size_t c = 0; c < channels.size(); c++) { + memcpy(p, channels[c].name.c_str(), strlen(channels[c].name.c_str())); + p += strlen(channels[c].name.c_str()); + (*p) = '\0'; + p++; + + int pixel_type = channels[c].pixel_type; + int x_sampling = channels[c].x_sampling; + int y_sampling = channels[c].y_sampling; + tinyexr::swap4(reinterpret_cast(&pixel_type)); + tinyexr::swap4(reinterpret_cast(&x_sampling)); + tinyexr::swap4(reinterpret_cast(&y_sampling)); + + memcpy(p, &pixel_type, sizeof(int)); + p += sizeof(int); + + (*p) = channels[c].p_linear; + p += 4; + + memcpy(p, &x_sampling, sizeof(int)); + p += sizeof(int); + + memcpy(p, &y_sampling, sizeof(int)); + p += sizeof(int); + } + + (*p) = '\0'; +} + +static void CompressZip(unsigned char *dst, + tinyexr::tinyexr_uint64 &compressedSize, + const unsigned char *src, unsigned long src_size) { + std::vector tmpBuf(src_size); + + // + // Apply EXR-specific? postprocess. Grabbed from OpenEXR's + // ImfZipCompressor.cpp + // + + // + // Reorder the pixel data. + // + + const char *srcPtr = reinterpret_cast(src); + + { + char *t1 = reinterpret_cast(&tmpBuf.at(0)); + char *t2 = reinterpret_cast(&tmpBuf.at(0)) + (src_size + 1) / 2; + const char *stop = srcPtr + src_size; + + for (;;) { + if (srcPtr < stop) + *(t1++) = *(srcPtr++); + else + break; + + if (srcPtr < stop) + *(t2++) = *(srcPtr++); + else + break; + } + } + + // + // Predictor. + // + + { + unsigned char *t = &tmpBuf.at(0) + 1; + unsigned char *stop = &tmpBuf.at(0) + src_size; + int p = t[-1]; + + while (t < stop) { + int d = int(t[0]) - p + (128 + 256); + p = t[0]; + t[0] = static_cast(d); + ++t; + } + } + +#if TINYEXR_USE_MINIZ + // + // Compress the data using miniz + // + + miniz::mz_ulong outSize = miniz::mz_compressBound(src_size); + int ret = miniz::mz_compress( + dst, &outSize, static_cast(&tmpBuf.at(0)), + src_size); + TEXR_ASSERT(ret == miniz::MZ_OK); + (void)ret; + + compressedSize = outSize; +#else + uLong outSize = compressBound(static_cast(src_size)); + int ret = compress(dst, &outSize, static_cast(&tmpBuf.at(0)), + src_size); + TEXR_ASSERT(ret == Z_OK); + + compressedSize = outSize; +#endif + + // Use uncompressed data when compressed data is larger than uncompressed. + // (Issue 40) + if (compressedSize >= src_size) { + compressedSize = src_size; + memcpy(dst, src, src_size); + } +} + +static bool DecompressZip(unsigned char *dst, + unsigned long *uncompressed_size /* inout */, + const unsigned char *src, unsigned long src_size) { + if ((*uncompressed_size) == src_size) { + // Data is not compressed(Issue 40). + memcpy(dst, src, src_size); + return true; + } + std::vector tmpBuf(*uncompressed_size); + +#if TINYEXR_USE_MINIZ + int ret = + miniz::mz_uncompress(&tmpBuf.at(0), uncompressed_size, src, src_size); + if (miniz::MZ_OK != ret) { + return false; + } +#else + int ret = uncompress(&tmpBuf.at(0), uncompressed_size, src, src_size); + if (Z_OK != ret) { + return false; + } +#endif + + // + // Apply EXR-specific? postprocess. Grabbed from OpenEXR's + // ImfZipCompressor.cpp + // + + // Predictor. + { + unsigned char *t = &tmpBuf.at(0) + 1; + unsigned char *stop = &tmpBuf.at(0) + (*uncompressed_size); + + while (t < stop) { + int d = int(t[-1]) + int(t[0]) - 128; + t[0] = static_cast(d); + ++t; + } + } + + // Reorder the pixel data. + { + const char *t1 = reinterpret_cast(&tmpBuf.at(0)); + const char *t2 = reinterpret_cast(&tmpBuf.at(0)) + + (*uncompressed_size + 1) / 2; + char *s = reinterpret_cast(dst); + char *stop = s + (*uncompressed_size); + + for (;;) { + if (s < stop) + *(s++) = *(t1++); + else + break; + + if (s < stop) + *(s++) = *(t2++); + else + break; + } + } + + return true; +} + +// RLE code from OpenEXR -------------------------------------- + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wsign-conversion" +#if __has_warning("-Wextra-semi-stmt") +#pragma clang diagnostic ignored "-Wextra-semi-stmt" +#endif +#endif + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4204) // nonstandard extension used : non-constant + // aggregate initializer (also supported by GNU + // C and C99, so no big deal) +#pragma warning(disable : 4244) // 'initializing': conversion from '__int64' to + // 'int', possible loss of data +#pragma warning(disable : 4267) // 'argument': conversion from '__int64' to + // 'int', possible loss of data +#pragma warning(disable : 4996) // 'strdup': The POSIX name for this item is + // deprecated. Instead, use the ISO C and C++ + // conformant name: _strdup. +#endif + +const int MIN_RUN_LENGTH = 3; +const int MAX_RUN_LENGTH = 127; + +// +// Compress an array of bytes, using run-length encoding, +// and return the length of the compressed data. +// + +static int rleCompress(int inLength, const char in[], signed char out[]) { + const char *inEnd = in + inLength; + const char *runStart = in; + const char *runEnd = in + 1; + signed char *outWrite = out; + + while (runStart < inEnd) { + while (runEnd < inEnd && *runStart == *runEnd && + runEnd - runStart - 1 < MAX_RUN_LENGTH) { + ++runEnd; + } + + if (runEnd - runStart >= MIN_RUN_LENGTH) { + // + // Compressable run + // + + *outWrite++ = static_cast(runEnd - runStart) - 1; + *outWrite++ = *(reinterpret_cast(runStart)); + runStart = runEnd; + } else { + // + // Uncompressable run + // + + while (runEnd < inEnd && + ((runEnd + 1 >= inEnd || *runEnd != *(runEnd + 1)) || + (runEnd + 2 >= inEnd || *(runEnd + 1) != *(runEnd + 2))) && + runEnd - runStart < MAX_RUN_LENGTH) { + ++runEnd; + } + + *outWrite++ = static_cast(runStart - runEnd); + + while (runStart < runEnd) { + *outWrite++ = *(reinterpret_cast(runStart++)); + } + } + + ++runEnd; + } + + return static_cast(outWrite - out); +} + +// +// Uncompress an array of bytes compressed with rleCompress(). +// Returns the length of the oncompressed data, or 0 if the +// length of the uncompressed data would be more than maxLength. +// + +static int rleUncompress(int inLength, int maxLength, const signed char in[], + char out[]) { + char *outStart = out; + + while (inLength > 0) { + if (*in < 0) { + int count = -(static_cast(*in++)); + inLength -= count + 1; + + // Fixes #116: Add bounds check to in buffer. + if ((0 > (maxLength -= count)) || (inLength < 0)) return 0; + + memcpy(out, in, count); + out += count; + in += count; + } else { + int count = *in++; + inLength -= 2; + + if (0 > (maxLength -= count + 1)) return 0; + + memset(out, *reinterpret_cast(in), count + 1); + out += count + 1; + + in++; + } + } + + return static_cast(out - outStart); +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// End of RLE code from OpenEXR ----------------------------------- + +static void CompressRle(unsigned char *dst, + tinyexr::tinyexr_uint64 &compressedSize, + const unsigned char *src, unsigned long src_size) { + std::vector tmpBuf(src_size); + + // + // Apply EXR-specific? postprocess. Grabbed from OpenEXR's + // ImfRleCompressor.cpp + // + + // + // Reorder the pixel data. + // + + const char *srcPtr = reinterpret_cast(src); + + { + char *t1 = reinterpret_cast(&tmpBuf.at(0)); + char *t2 = reinterpret_cast(&tmpBuf.at(0)) + (src_size + 1) / 2; + const char *stop = srcPtr + src_size; + + for (;;) { + if (srcPtr < stop) + *(t1++) = *(srcPtr++); + else + break; + + if (srcPtr < stop) + *(t2++) = *(srcPtr++); + else + break; + } + } + + // + // Predictor. + // + + { + unsigned char *t = &tmpBuf.at(0) + 1; + unsigned char *stop = &tmpBuf.at(0) + src_size; + int p = t[-1]; + + while (t < stop) { + int d = int(t[0]) - p + (128 + 256); + p = t[0]; + t[0] = static_cast(d); + ++t; + } + } + + // outSize will be (srcSiz * 3) / 2 at max. + int outSize = rleCompress(static_cast(src_size), + reinterpret_cast(&tmpBuf.at(0)), + reinterpret_cast(dst)); + TEXR_ASSERT(outSize > 0); + + compressedSize = static_cast(outSize); + + // Use uncompressed data when compressed data is larger than uncompressed. + // (Issue 40) + if (compressedSize >= src_size) { + compressedSize = src_size; + memcpy(dst, src, src_size); + } +} + +static bool DecompressRle(unsigned char *dst, + const unsigned long uncompressed_size, + const unsigned char *src, unsigned long src_size) { + if (uncompressed_size == src_size) { + // Data is not compressed(Issue 40). + memcpy(dst, src, src_size); + return true; + } + + // Workaround for issue #112. + // TODO(syoyo): Add more robust out-of-bounds check in `rleUncompress`. + if (src_size <= 2) { + return false; + } + + std::vector tmpBuf(uncompressed_size); + + int ret = rleUncompress(static_cast(src_size), + static_cast(uncompressed_size), + reinterpret_cast(src), + reinterpret_cast(&tmpBuf.at(0))); + if (ret != static_cast(uncompressed_size)) { + return false; + } + + // + // Apply EXR-specific? postprocess. Grabbed from OpenEXR's + // ImfRleCompressor.cpp + // + + // Predictor. + { + unsigned char *t = &tmpBuf.at(0) + 1; + unsigned char *stop = &tmpBuf.at(0) + uncompressed_size; + + while (t < stop) { + int d = int(t[-1]) + int(t[0]) - 128; + t[0] = static_cast(d); + ++t; + } + } + + // Reorder the pixel data. + { + const char *t1 = reinterpret_cast(&tmpBuf.at(0)); + const char *t2 = reinterpret_cast(&tmpBuf.at(0)) + + (uncompressed_size + 1) / 2; + char *s = reinterpret_cast(dst); + char *stop = s + uncompressed_size; + + for (;;) { + if (s < stop) + *(s++) = *(t1++); + else + break; + + if (s < stop) + *(s++) = *(t2++); + else + break; + } + } + + return true; +} + +#if TINYEXR_USE_PIZ + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wc++11-long-long" +#pragma clang diagnostic ignored "-Wold-style-cast" +#pragma clang diagnostic ignored "-Wpadded" +#pragma clang diagnostic ignored "-Wsign-conversion" +#pragma clang diagnostic ignored "-Wc++11-extensions" +#pragma clang diagnostic ignored "-Wconversion" +#pragma clang diagnostic ignored "-Wc++98-compat-pedantic" + +#if __has_warning("-Wcast-qual") +#pragma clang diagnostic ignored "-Wcast-qual" +#endif + +#if __has_warning("-Wextra-semi-stmt") +#pragma clang diagnostic ignored "-Wextra-semi-stmt" +#endif + +#endif + +// +// PIZ compress/uncompress, based on OpenEXR's ImfPizCompressor.cpp +// +// ----------------------------------------------------------------- +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC) +// (3 clause BSD license) +// + +struct PIZChannelData { + unsigned short *start; + unsigned short *end; + int nx; + int ny; + int ys; + int size; +}; + +//----------------------------------------------------------------------------- +// +// 16-bit Haar Wavelet encoding and decoding +// +// The source code in this file is derived from the encoding +// and decoding routines written by Christian Rouet for his +// PIZ image file format. +// +//----------------------------------------------------------------------------- + +// +// Wavelet basis functions without modulo arithmetic; they produce +// the best compression ratios when the wavelet-transformed data are +// Huffman-encoded, but the wavelet transform works only for 14-bit +// data (untransformed data values must be less than (1 << 14)). +// + +inline void wenc14(unsigned short a, unsigned short b, unsigned short &l, + unsigned short &h) { + short as = static_cast(a); + short bs = static_cast(b); + + short ms = (as + bs) >> 1; + short ds = as - bs; + + l = static_cast(ms); + h = static_cast(ds); +} + +inline void wdec14(unsigned short l, unsigned short h, unsigned short &a, + unsigned short &b) { + short ls = static_cast(l); + short hs = static_cast(h); + + int hi = hs; + int ai = ls + (hi & 1) + (hi >> 1); + + short as = static_cast(ai); + short bs = static_cast(ai - hi); + + a = static_cast(as); + b = static_cast(bs); +} + +// +// Wavelet basis functions with modulo arithmetic; they work with full +// 16-bit data, but Huffman-encoding the wavelet-transformed data doesn't +// compress the data quite as well. +// + +const int NBITS = 16; +const int A_OFFSET = 1 << (NBITS - 1); +const int M_OFFSET = 1 << (NBITS - 1); +const int MOD_MASK = (1 << NBITS) - 1; + +inline void wenc16(unsigned short a, unsigned short b, unsigned short &l, + unsigned short &h) { + int ao = (a + A_OFFSET) & MOD_MASK; + int m = ((ao + b) >> 1); + int d = ao - b; + + if (d < 0) m = (m + M_OFFSET) & MOD_MASK; + + d &= MOD_MASK; + + l = static_cast(m); + h = static_cast(d); +} + +inline void wdec16(unsigned short l, unsigned short h, unsigned short &a, + unsigned short &b) { + int m = l; + int d = h; + int bb = (m - (d >> 1)) & MOD_MASK; + int aa = (d + bb - A_OFFSET) & MOD_MASK; + b = static_cast(bb); + a = static_cast(aa); +} + +// +// 2D Wavelet encoding: +// + +static void wav2Encode( + unsigned short *in, // io: values are transformed in place + int nx, // i : x size + int ox, // i : x offset + int ny, // i : y size + int oy, // i : y offset + unsigned short mx) // i : maximum in[x][y] value +{ + bool w14 = (mx < (1 << 14)); + int n = (nx > ny) ? ny : nx; + int p = 1; // == 1 << level + int p2 = 2; // == 1 << (level+1) + + // + // Hierachical loop on smaller dimension n + // + + while (p2 <= n) { + unsigned short *py = in; + unsigned short *ey = in + oy * (ny - p2); + int oy1 = oy * p; + int oy2 = oy * p2; + int ox1 = ox * p; + int ox2 = ox * p2; + unsigned short i00, i01, i10, i11; + + // + // Y loop + // + + for (; py <= ey; py += oy2) { + unsigned short *px = py; + unsigned short *ex = py + ox * (nx - p2); + + // + // X loop + // + + for (; px <= ex; px += ox2) { + unsigned short *p01 = px + ox1; + unsigned short *p10 = px + oy1; + unsigned short *p11 = p10 + ox1; + + // + // 2D wavelet encoding + // + + if (w14) { + wenc14(*px, *p01, i00, i01); + wenc14(*p10, *p11, i10, i11); + wenc14(i00, i10, *px, *p10); + wenc14(i01, i11, *p01, *p11); + } else { + wenc16(*px, *p01, i00, i01); + wenc16(*p10, *p11, i10, i11); + wenc16(i00, i10, *px, *p10); + wenc16(i01, i11, *p01, *p11); + } + } + + // + // Encode (1D) odd column (still in Y loop) + // + + if (nx & p) { + unsigned short *p10 = px + oy1; + + if (w14) + wenc14(*px, *p10, i00, *p10); + else + wenc16(*px, *p10, i00, *p10); + + *px = i00; + } + } + + // + // Encode (1D) odd line (must loop in X) + // + + if (ny & p) { + unsigned short *px = py; + unsigned short *ex = py + ox * (nx - p2); + + for (; px <= ex; px += ox2) { + unsigned short *p01 = px + ox1; + + if (w14) + wenc14(*px, *p01, i00, *p01); + else + wenc16(*px, *p01, i00, *p01); + + *px = i00; + } + } + + // + // Next level + // + + p = p2; + p2 <<= 1; + } +} + +// +// 2D Wavelet decoding: +// + +static void wav2Decode( + unsigned short *in, // io: values are transformed in place + int nx, // i : x size + int ox, // i : x offset + int ny, // i : y size + int oy, // i : y offset + unsigned short mx) // i : maximum in[x][y] value +{ + bool w14 = (mx < (1 << 14)); + int n = (nx > ny) ? ny : nx; + int p = 1; + int p2; + + // + // Search max level + // + + while (p <= n) p <<= 1; + + p >>= 1; + p2 = p; + p >>= 1; + + // + // Hierarchical loop on smaller dimension n + // + + while (p >= 1) { + unsigned short *py = in; + unsigned short *ey = in + oy * (ny - p2); + int oy1 = oy * p; + int oy2 = oy * p2; + int ox1 = ox * p; + int ox2 = ox * p2; + unsigned short i00, i01, i10, i11; + + // + // Y loop + // + + for (; py <= ey; py += oy2) { + unsigned short *px = py; + unsigned short *ex = py + ox * (nx - p2); + + // + // X loop + // + + for (; px <= ex; px += ox2) { + unsigned short *p01 = px + ox1; + unsigned short *p10 = px + oy1; + unsigned short *p11 = p10 + ox1; + + // + // 2D wavelet decoding + // + + if (w14) { + wdec14(*px, *p10, i00, i10); + wdec14(*p01, *p11, i01, i11); + wdec14(i00, i01, *px, *p01); + wdec14(i10, i11, *p10, *p11); + } else { + wdec16(*px, *p10, i00, i10); + wdec16(*p01, *p11, i01, i11); + wdec16(i00, i01, *px, *p01); + wdec16(i10, i11, *p10, *p11); + } + } + + // + // Decode (1D) odd column (still in Y loop) + // + + if (nx & p) { + unsigned short *p10 = px + oy1; + + if (w14) + wdec14(*px, *p10, i00, *p10); + else + wdec16(*px, *p10, i00, *p10); + + *px = i00; + } + } + + // + // Decode (1D) odd line (must loop in X) + // + + if (ny & p) { + unsigned short *px = py; + unsigned short *ex = py + ox * (nx - p2); + + for (; px <= ex; px += ox2) { + unsigned short *p01 = px + ox1; + + if (w14) + wdec14(*px, *p01, i00, *p01); + else + wdec16(*px, *p01, i00, *p01); + + *px = i00; + } + } + + // + // Next level + // + + p2 = p; + p >>= 1; + } +} + +//----------------------------------------------------------------------------- +// +// 16-bit Huffman compression and decompression. +// +// The source code in this file is derived from the 8-bit +// Huffman compression and decompression routines written +// by Christian Rouet for his PIZ image file format. +// +//----------------------------------------------------------------------------- + +// Adds some modification for tinyexr. + +const int HUF_ENCBITS = 16; // literal (value) bit length +const int HUF_DECBITS = 14; // decoding bit size (>= 8) + +const int HUF_ENCSIZE = (1 << HUF_ENCBITS) + 1; // encoding table size +const int HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size +const int HUF_DECMASK = HUF_DECSIZE - 1; + +struct HufDec { // short code long code + //------------------------------- + int len : 8; // code length 0 + int lit : 24; // lit p size + int *p; // 0 lits +}; + +inline long long hufLength(long long code) { return code & 63; } + +inline long long hufCode(long long code) { return code >> 6; } + +inline void outputBits(int nBits, long long bits, long long &c, int &lc, + char *&out) { + c <<= nBits; + lc += nBits; + + c |= bits; + + while (lc >= 8) *out++ = static_cast((c >> (lc -= 8))); +} + +inline long long getBits(int nBits, long long &c, int &lc, const char *&in) { + while (lc < nBits) { + c = (c << 8) | *(reinterpret_cast(in++)); + lc += 8; + } + + lc -= nBits; + return (c >> lc) & ((1 << nBits) - 1); +} + +// +// ENCODING TABLE BUILDING & (UN)PACKING +// + +// +// Build a "canonical" Huffman code table: +// - for each (uncompressed) symbol, hcode contains the length +// of the corresponding code (in the compressed data) +// - canonical codes are computed and stored in hcode +// - the rules for constructing canonical codes are as follows: +// * shorter codes (if filled with zeroes to the right) +// have a numerically higher value than longer codes +// * for codes with the same length, numerical values +// increase with numerical symbol values +// - because the canonical code table can be constructed from +// symbol lengths alone, the code table can be transmitted +// without sending the actual code values +// - see http://www.compressconsult.com/huffman/ +// + +static void hufCanonicalCodeTable(long long hcode[HUF_ENCSIZE]) { + long long n[59]; + + // + // For each i from 0 through 58, count the + // number of different codes of length i, and + // store the count in n[i]. + // + + for (int i = 0; i <= 58; ++i) n[i] = 0; + + for (int i = 0; i < HUF_ENCSIZE; ++i) n[hcode[i]] += 1; + + // + // For each i from 58 through 1, compute the + // numerically lowest code with length i, and + // store that code in n[i]. + // + + long long c = 0; + + for (int i = 58; i > 0; --i) { + long long nc = ((c + n[i]) >> 1); + n[i] = c; + c = nc; + } + + // + // hcode[i] contains the length, l, of the + // code for symbol i. Assign the next available + // code of length l to the symbol and store both + // l and the code in hcode[i]. + // + + for (int i = 0; i < HUF_ENCSIZE; ++i) { + int l = static_cast(hcode[i]); + + if (l > 0) hcode[i] = l | (n[l]++ << 6); + } +} + +// +// Compute Huffman codes (based on frq input) and store them in frq: +// - code structure is : [63:lsb - 6:msb] | [5-0: bit length]; +// - max code length is 58 bits; +// - codes outside the range [im-iM] have a null length (unused values); +// - original frequencies are destroyed; +// - encoding tables are used by hufEncode() and hufBuildDecTable(); +// + +struct FHeapCompare { + bool operator()(long long *a, long long *b) { return *a > *b; } +}; + +static void hufBuildEncTable( + long long *frq, // io: input frequencies [HUF_ENCSIZE], output table + int *im, // o: min frq index + int *iM) // o: max frq index +{ + // + // This function assumes that when it is called, array frq + // indicates the frequency of all possible symbols in the data + // that are to be Huffman-encoded. (frq[i] contains the number + // of occurrences of symbol i in the data.) + // + // The loop below does three things: + // + // 1) Finds the minimum and maximum indices that point + // to non-zero entries in frq: + // + // frq[im] != 0, and frq[i] == 0 for all i < im + // frq[iM] != 0, and frq[i] == 0 for all i > iM + // + // 2) Fills array fHeap with pointers to all non-zero + // entries in frq. + // + // 3) Initializes array hlink such that hlink[i] == i + // for all array entries. + // + + std::vector hlink(HUF_ENCSIZE); + std::vector fHeap(HUF_ENCSIZE); + + *im = 0; + + while (!frq[*im]) (*im)++; + + int nf = 0; + + for (int i = *im; i < HUF_ENCSIZE; i++) { + hlink[i] = i; + + if (frq[i]) { + fHeap[nf] = &frq[i]; + nf++; + *iM = i; + } + } + + // + // Add a pseudo-symbol, with a frequency count of 1, to frq; + // adjust the fHeap and hlink array accordingly. Function + // hufEncode() uses the pseudo-symbol for run-length encoding. + // + + (*iM)++; + frq[*iM] = 1; + fHeap[nf] = &frq[*iM]; + nf++; + + // + // Build an array, scode, such that scode[i] contains the number + // of bits assigned to symbol i. Conceptually this is done by + // constructing a tree whose leaves are the symbols with non-zero + // frequency: + // + // Make a heap that contains all symbols with a non-zero frequency, + // with the least frequent symbol on top. + // + // Repeat until only one symbol is left on the heap: + // + // Take the two least frequent symbols off the top of the heap. + // Create a new node that has first two nodes as children, and + // whose frequency is the sum of the frequencies of the first + // two nodes. Put the new node back into the heap. + // + // The last node left on the heap is the root of the tree. For each + // leaf node, the distance between the root and the leaf is the length + // of the code for the corresponding symbol. + // + // The loop below doesn't actually build the tree; instead we compute + // the distances of the leaves from the root on the fly. When a new + // node is added to the heap, then that node's descendants are linked + // into a single linear list that starts at the new node, and the code + // lengths of the descendants (that is, their distance from the root + // of the tree) are incremented by one. + // + + std::make_heap(&fHeap[0], &fHeap[nf], FHeapCompare()); + + std::vector scode(HUF_ENCSIZE); + memset(scode.data(), 0, sizeof(long long) * HUF_ENCSIZE); + + while (nf > 1) { + // + // Find the indices, mm and m, of the two smallest non-zero frq + // values in fHeap, add the smallest frq to the second-smallest + // frq, and remove the smallest frq value from fHeap. + // + + int mm = fHeap[0] - frq; + std::pop_heap(&fHeap[0], &fHeap[nf], FHeapCompare()); + --nf; + + int m = fHeap[0] - frq; + std::pop_heap(&fHeap[0], &fHeap[nf], FHeapCompare()); + + frq[m] += frq[mm]; + std::push_heap(&fHeap[0], &fHeap[nf], FHeapCompare()); + + // + // The entries in scode are linked into lists with the + // entries in hlink serving as "next" pointers and with + // the end of a list marked by hlink[j] == j. + // + // Traverse the lists that start at scode[m] and scode[mm]. + // For each element visited, increment the length of the + // corresponding code by one bit. (If we visit scode[j] + // during the traversal, then the code for symbol j becomes + // one bit longer.) + // + // Merge the lists that start at scode[m] and scode[mm] + // into a single list that starts at scode[m]. + // + + // + // Add a bit to all codes in the first list. + // + + for (int j = m;; j = hlink[j]) { + scode[j]++; + + TEXR_ASSERT(scode[j] <= 58); + + if (hlink[j] == j) { + // + // Merge the two lists. + // + + hlink[j] = mm; + break; + } + } + + // + // Add a bit to all codes in the second list + // + + for (int j = mm;; j = hlink[j]) { + scode[j]++; + + TEXR_ASSERT(scode[j] <= 58); + + if (hlink[j] == j) break; + } + } + + // + // Build a canonical Huffman code table, replacing the code + // lengths in scode with (code, code length) pairs. Copy the + // code table from scode into frq. + // + + hufCanonicalCodeTable(scode.data()); + memcpy(frq, scode.data(), sizeof(long long) * HUF_ENCSIZE); +} + +// +// Pack an encoding table: +// - only code lengths, not actual codes, are stored +// - runs of zeroes are compressed as follows: +// +// unpacked packed +// -------------------------------- +// 1 zero 0 (6 bits) +// 2 zeroes 59 +// 3 zeroes 60 +// 4 zeroes 61 +// 5 zeroes 62 +// n zeroes (6 or more) 63 n-6 (6 + 8 bits) +// + +const int SHORT_ZEROCODE_RUN = 59; +const int LONG_ZEROCODE_RUN = 63; +const int SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN; +const int LONGEST_LONG_RUN = 255 + SHORTEST_LONG_RUN; + +static void hufPackEncTable( + const long long *hcode, // i : encoding table [HUF_ENCSIZE] + int im, // i : min hcode index + int iM, // i : max hcode index + char **pcode) // o: ptr to packed table (updated) +{ + char *p = *pcode; + long long c = 0; + int lc = 0; + + for (; im <= iM; im++) { + int l = hufLength(hcode[im]); + + if (l == 0) { + int zerun = 1; + + while ((im < iM) && (zerun < LONGEST_LONG_RUN)) { + if (hufLength(hcode[im + 1]) > 0) break; + im++; + zerun++; + } + + if (zerun >= 2) { + if (zerun >= SHORTEST_LONG_RUN) { + outputBits(6, LONG_ZEROCODE_RUN, c, lc, p); + outputBits(8, zerun - SHORTEST_LONG_RUN, c, lc, p); + } else { + outputBits(6, SHORT_ZEROCODE_RUN + zerun - 2, c, lc, p); + } + continue; + } + } + + outputBits(6, l, c, lc, p); + } + + if (lc > 0) *p++ = (unsigned char)(c << (8 - lc)); + + *pcode = p; +} + +// +// Unpack an encoding table packed by hufPackEncTable(): +// + +static bool hufUnpackEncTable( + const char **pcode, // io: ptr to packed table (updated) + int ni, // i : input size (in bytes) + int im, // i : min hcode index + int iM, // i : max hcode index + long long *hcode) // o: encoding table [HUF_ENCSIZE] +{ + memset(hcode, 0, sizeof(long long) * HUF_ENCSIZE); + + const char *p = *pcode; + long long c = 0; + int lc = 0; + + for (; im <= iM; im++) { + if (p - *pcode >= ni) { + return false; + } + + long long l = hcode[im] = getBits(6, c, lc, p); // code length + + if (l == (long long)LONG_ZEROCODE_RUN) { + if (p - *pcode > ni) { + return false; + } + + int zerun = getBits(8, c, lc, p) + SHORTEST_LONG_RUN; + + if (im + zerun > iM + 1) { + return false; + } + + while (zerun--) hcode[im++] = 0; + + im--; + } else if (l >= (long long)SHORT_ZEROCODE_RUN) { + int zerun = l - SHORT_ZEROCODE_RUN + 2; + + if (im + zerun > iM + 1) { + return false; + } + + while (zerun--) hcode[im++] = 0; + + im--; + } + } + + *pcode = const_cast(p); + + hufCanonicalCodeTable(hcode); + + return true; +} + +// +// DECODING TABLE BUILDING +// + +// +// Clear a newly allocated decoding table so that it contains only zeroes. +// + +static void hufClearDecTable(HufDec *hdecod) // io: (allocated by caller) +// decoding table [HUF_DECSIZE] +{ + for (int i = 0; i < HUF_DECSIZE; i++) { + hdecod[i].len = 0; + hdecod[i].lit = 0; + hdecod[i].p = NULL; + } + // memset(hdecod, 0, sizeof(HufDec) * HUF_DECSIZE); +} + +// +// Build a decoding hash table based on the encoding table hcode: +// - short codes (<= HUF_DECBITS) are resolved with a single table access; +// - long code entry allocations are not optimized, because long codes are +// unfrequent; +// - decoding tables are used by hufDecode(); +// + +static bool hufBuildDecTable(const long long *hcode, // i : encoding table + int im, // i : min index in hcode + int iM, // i : max index in hcode + HufDec *hdecod) // o: (allocated by caller) +// decoding table [HUF_DECSIZE] +{ + // + // Init hashtable & loop on all codes. + // Assumes that hufClearDecTable(hdecod) has already been called. + // + + for (; im <= iM; im++) { + long long c = hufCode(hcode[im]); + int l = hufLength(hcode[im]); + + if (c >> l) { + // + // Error: c is supposed to be an l-bit code, + // but c contains a value that is greater + // than the largest l-bit number. + // + + // invalidTableEntry(); + return false; + } + + if (l > HUF_DECBITS) { + // + // Long code: add a secondary entry + // + + HufDec *pl = hdecod + (c >> (l - HUF_DECBITS)); + + if (pl->len) { + // + // Error: a short code has already + // been stored in table entry *pl. + // + + // invalidTableEntry(); + return false; + } + + pl->lit++; + + if (pl->p) { + int *p = pl->p; + pl->p = new int[pl->lit]; + + for (int i = 0; i < pl->lit - 1; ++i) pl->p[i] = p[i]; + + delete[] p; + } else { + pl->p = new int[1]; + } + + pl->p[pl->lit - 1] = im; + } else if (l) { + // + // Short code: init all primary entries + // + + HufDec *pl = hdecod + (c << (HUF_DECBITS - l)); + + for (long long i = 1ULL << (HUF_DECBITS - l); i > 0; i--, pl++) { + if (pl->len || pl->p) { + // + // Error: a short code or a long code has + // already been stored in table entry *pl. + // + + // invalidTableEntry(); + return false; + } + + pl->len = l; + pl->lit = im; + } + } + } + + return true; +} + +// +// Free the long code entries of a decoding table built by hufBuildDecTable() +// + +static void hufFreeDecTable(HufDec *hdecod) // io: Decoding table +{ + for (int i = 0; i < HUF_DECSIZE; i++) { + if (hdecod[i].p) { + delete[] hdecod[i].p; + hdecod[i].p = 0; + } + } +} + +// +// ENCODING +// + +inline void outputCode(long long code, long long &c, int &lc, char *&out) { + outputBits(hufLength(code), hufCode(code), c, lc, out); +} + +inline void sendCode(long long sCode, int runCount, long long runCode, + long long &c, int &lc, char *&out) { + // + // Output a run of runCount instances of the symbol sCount. + // Output the symbols explicitly, or if that is shorter, output + // the sCode symbol once followed by a runCode symbol and runCount + // expressed as an 8-bit number. + // + + if (hufLength(sCode) + hufLength(runCode) + 8 < hufLength(sCode) * runCount) { + outputCode(sCode, c, lc, out); + outputCode(runCode, c, lc, out); + outputBits(8, runCount, c, lc, out); + } else { + while (runCount-- >= 0) outputCode(sCode, c, lc, out); + } +} + +// +// Encode (compress) ni values based on the Huffman encoding table hcode: +// + +static int hufEncode // return: output size (in bits) + (const long long *hcode, // i : encoding table + const unsigned short *in, // i : uncompressed input buffer + const int ni, // i : input buffer size (in bytes) + int rlc, // i : rl code + char *out) // o: compressed output buffer +{ + char *outStart = out; + long long c = 0; // bits not yet written to out + int lc = 0; // number of valid bits in c (LSB) + int s = in[0]; + int cs = 0; + + // + // Loop on input values + // + + for (int i = 1; i < ni; i++) { + // + // Count same values or send code + // + + if (s == in[i] && cs < 255) { + cs++; + } else { + sendCode(hcode[s], cs, hcode[rlc], c, lc, out); + cs = 0; + } + + s = in[i]; + } + + // + // Send remaining code + // + + sendCode(hcode[s], cs, hcode[rlc], c, lc, out); + + if (lc) *out = (c << (8 - lc)) & 0xff; + + return (out - outStart) * 8 + lc; +} + +// +// DECODING +// + +// +// In order to force the compiler to inline them, +// getChar() and getCode() are implemented as macros +// instead of "inline" functions. +// + +#define getChar(c, lc, in) \ + { \ + c = (c << 8) | *(unsigned char *)(in++); \ + lc += 8; \ + } + +#if 0 +#define getCode(po, rlc, c, lc, in, out, ob, oe) \ + { \ + if (po == rlc) { \ + if (lc < 8) getChar(c, lc, in); \ + \ + lc -= 8; \ + \ + unsigned char cs = (c >> lc); \ + \ + if (out + cs > oe) return false; \ + \ + /* TinyEXR issue 78 */ \ + unsigned short s = out[-1]; \ + \ + while (cs-- > 0) *out++ = s; \ + } else if (out < oe) { \ + *out++ = po; \ + } else { \ + return false; \ + } \ + } +#else +static bool getCode(int po, int rlc, long long &c, int &lc, const char *&in, + const char *in_end, unsigned short *&out, + const unsigned short *ob, const unsigned short *oe) { + (void)ob; + if (po == rlc) { + if (lc < 8) { + /* TinyEXR issue 78 */ + if ((in + 1) >= in_end) { + return false; + } + + getChar(c, lc, in); + } + + lc -= 8; + + unsigned char cs = (c >> lc); + + if (out + cs > oe) return false; + + // Bounds check for safety + // Issue 100. + if ((out - 1) < ob) return false; + unsigned short s = out[-1]; + + while (cs-- > 0) *out++ = s; + } else if (out < oe) { + *out++ = po; + } else { + return false; + } + return true; +} +#endif + +// +// Decode (uncompress) ni bits based on encoding & decoding tables: +// + +static bool hufDecode(const long long *hcode, // i : encoding table + const HufDec *hdecod, // i : decoding table + const char *in, // i : compressed input buffer + int ni, // i : input size (in bits) + int rlc, // i : run-length code + int no, // i : expected output size (in bytes) + unsigned short *out) // o: uncompressed output buffer +{ + long long c = 0; + int lc = 0; + unsigned short *outb = out; // begin + unsigned short *oe = out + no; // end + const char *ie = in + (ni + 7) / 8; // input byte size + + // + // Loop on input bytes + // + + while (in < ie) { + getChar(c, lc, in); + + // + // Access decoding table + // + + while (lc >= HUF_DECBITS) { + const HufDec pl = hdecod[(c >> (lc - HUF_DECBITS)) & HUF_DECMASK]; + + if (pl.len) { + // + // Get short code + // + + lc -= pl.len; + // std::cout << "lit = " << pl.lit << std::endl; + // std::cout << "rlc = " << rlc << std::endl; + // std::cout << "c = " << c << std::endl; + // std::cout << "lc = " << lc << std::endl; + // std::cout << "in = " << in << std::endl; + // std::cout << "out = " << out << std::endl; + // std::cout << "oe = " << oe << std::endl; + if (!getCode(pl.lit, rlc, c, lc, in, ie, out, outb, oe)) { + return false; + } + } else { + if (!pl.p) { + return false; + } + // invalidCode(); // wrong code + + // + // Search long code + // + + int j; + + for (j = 0; j < pl.lit; j++) { + int l = hufLength(hcode[pl.p[j]]); + + while (lc < l && in < ie) // get more bits + getChar(c, lc, in); + + if (lc >= l) { + if (hufCode(hcode[pl.p[j]]) == + ((c >> (lc - l)) & (((long long)(1) << l) - 1))) { + // + // Found : get long code + // + + lc -= l; + if (!getCode(pl.p[j], rlc, c, lc, in, ie, out, outb, oe)) { + return false; + } + break; + } + } + } + + if (j == pl.lit) { + return false; + // invalidCode(); // Not found + } + } + } + } + + // + // Get remaining (short) codes + // + + int i = (8 - ni) & 7; + c >>= i; + lc -= i; + + while (lc > 0) { + const HufDec pl = hdecod[(c << (HUF_DECBITS - lc)) & HUF_DECMASK]; + + if (pl.len) { + lc -= pl.len; + if (!getCode(pl.lit, rlc, c, lc, in, ie, out, outb, oe)) { + return false; + } + } else { + return false; + // invalidCode(); // wrong (long) code + } + } + + if (out - outb != no) { + return false; + } + // notEnoughData (); + + return true; +} + +static void countFrequencies(std::vector &freq, + const unsigned short data[/*n*/], int n) { + for (int i = 0; i < HUF_ENCSIZE; ++i) freq[i] = 0; + + for (int i = 0; i < n; ++i) ++freq[data[i]]; +} + +static void writeUInt(char buf[4], unsigned int i) { + unsigned char *b = (unsigned char *)buf; + + b[0] = i; + b[1] = i >> 8; + b[2] = i >> 16; + b[3] = i >> 24; +} + +static unsigned int readUInt(const char buf[4]) { + const unsigned char *b = (const unsigned char *)buf; + + return (b[0] & 0x000000ff) | ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | ((b[3] << 24) & 0xff000000); +} + +// +// EXTERNAL INTERFACE +// + +static int hufCompress(const unsigned short raw[], int nRaw, + char compressed[]) { + if (nRaw == 0) return 0; + + std::vector freq(HUF_ENCSIZE); + + countFrequencies(freq, raw, nRaw); + + int im = 0; + int iM = 0; + hufBuildEncTable(freq.data(), &im, &iM); + + char *tableStart = compressed + 20; + char *tableEnd = tableStart; + hufPackEncTable(freq.data(), im, iM, &tableEnd); + int tableLength = tableEnd - tableStart; + + char *dataStart = tableEnd; + int nBits = hufEncode(freq.data(), raw, nRaw, iM, dataStart); + int data_length = (nBits + 7) / 8; + + writeUInt(compressed, im); + writeUInt(compressed + 4, iM); + writeUInt(compressed + 8, tableLength); + writeUInt(compressed + 12, nBits); + writeUInt(compressed + 16, 0); // room for future extensions + + return dataStart + data_length - compressed; +} + +static bool hufUncompress(const char compressed[], int nCompressed, + std::vector *raw) { + if (nCompressed == 0) { + if (raw->size() != 0) return false; + + return false; + } + + int im = readUInt(compressed); + int iM = readUInt(compressed + 4); + // int tableLength = readUInt (compressed + 8); + int nBits = readUInt(compressed + 12); + + if (im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE) return false; + + const char *ptr = compressed + 20; + + // + // Fast decoder needs at least 2x64-bits of compressed data, and + // needs to be run-able on this platform. Otherwise, fall back + // to the original decoder + // + + // if (FastHufDecoder::enabled() && nBits > 128) + //{ + // FastHufDecoder fhd (ptr, nCompressed - (ptr - compressed), im, iM, iM); + // fhd.decode ((unsigned char*)ptr, nBits, raw, nRaw); + //} + // else + { + std::vector freq(HUF_ENCSIZE); + std::vector hdec(HUF_DECSIZE); + + hufClearDecTable(&hdec.at(0)); + + hufUnpackEncTable(&ptr, nCompressed - (ptr - compressed), im, iM, + &freq.at(0)); + + { + if (nBits > 8 * (nCompressed - (ptr - compressed))) { + return false; + } + + hufBuildDecTable(&freq.at(0), im, iM, &hdec.at(0)); + hufDecode(&freq.at(0), &hdec.at(0), ptr, nBits, iM, raw->size(), + raw->data()); + } + // catch (...) + //{ + // hufFreeDecTable (hdec); + // throw; + //} + + hufFreeDecTable(&hdec.at(0)); + } + + return true; +} + +// +// Functions to compress the range of values in the pixel data +// + +const int USHORT_RANGE = (1 << 16); +const int BITMAP_SIZE = (USHORT_RANGE >> 3); + +static void bitmapFromData(const unsigned short data[/*nData*/], int nData, + unsigned char bitmap[BITMAP_SIZE], + unsigned short &minNonZero, + unsigned short &maxNonZero) { + for (int i = 0; i < BITMAP_SIZE; ++i) bitmap[i] = 0; + + for (int i = 0; i < nData; ++i) bitmap[data[i] >> 3] |= (1 << (data[i] & 7)); + + bitmap[0] &= ~1; // zero is not explicitly stored in + // the bitmap; we assume that the + // data always contain zeroes + minNonZero = BITMAP_SIZE - 1; + maxNonZero = 0; + + for (int i = 0; i < BITMAP_SIZE; ++i) { + if (bitmap[i]) { + if (minNonZero > i) minNonZero = i; + if (maxNonZero < i) maxNonZero = i; + } + } +} + +static unsigned short forwardLutFromBitmap( + const unsigned char bitmap[BITMAP_SIZE], unsigned short lut[USHORT_RANGE]) { + int k = 0; + + for (int i = 0; i < USHORT_RANGE; ++i) { + if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7)))) + lut[i] = k++; + else + lut[i] = 0; + } + + return k - 1; // maximum value stored in lut[], +} // i.e. number of ones in bitmap minus 1 + +static unsigned short reverseLutFromBitmap( + const unsigned char bitmap[BITMAP_SIZE], unsigned short lut[USHORT_RANGE]) { + int k = 0; + + for (int i = 0; i < USHORT_RANGE; ++i) { + if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7)))) lut[k++] = i; + } + + int n = k - 1; + + while (k < USHORT_RANGE) lut[k++] = 0; + + return n; // maximum k where lut[k] is non-zero, +} // i.e. number of ones in bitmap minus 1 + +static void applyLut(const unsigned short lut[USHORT_RANGE], + unsigned short data[/*nData*/], int nData) { + for (int i = 0; i < nData; ++i) data[i] = lut[data[i]]; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif // __clang__ + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +static bool CompressPiz(unsigned char *outPtr, unsigned int *outSize, + const unsigned char *inPtr, size_t inSize, + const std::vector &channelInfo, + int data_width, int num_lines) { + std::vector bitmap(BITMAP_SIZE); + unsigned short minNonZero; + unsigned short maxNonZero; + +#if !MINIZ_LITTLE_ENDIAN + // @todo { PIZ compression on BigEndian architecture. } + TEXR_ASSERT(0); + return false; +#endif + + // Assume `inSize` is multiple of 2 or 4. + std::vector tmpBuffer(inSize / sizeof(unsigned short)); + + std::vector channelData(channelInfo.size()); + unsigned short *tmpBufferEnd = &tmpBuffer.at(0); + + for (size_t c = 0; c < channelData.size(); c++) { + PIZChannelData &cd = channelData[c]; + + cd.start = tmpBufferEnd; + cd.end = cd.start; + + cd.nx = data_width; + cd.ny = num_lines; + // cd.ys = c.channel().ySampling; + + size_t pixelSize = sizeof(int); // UINT and FLOAT + if (channelInfo[c].pixel_type == TINYEXR_PIXELTYPE_HALF) { + pixelSize = sizeof(short); + } + + cd.size = static_cast(pixelSize / sizeof(short)); + + tmpBufferEnd += cd.nx * cd.ny * cd.size; + } + + const unsigned char *ptr = inPtr; + for (int y = 0; y < num_lines; ++y) { + for (size_t i = 0; i < channelData.size(); ++i) { + PIZChannelData &cd = channelData[i]; + + // if (modp (y, cd.ys) != 0) + // continue; + + size_t n = static_cast(cd.nx * cd.size); + memcpy(cd.end, ptr, n * sizeof(unsigned short)); + ptr += n * sizeof(unsigned short); + cd.end += n; + } + } + + bitmapFromData(&tmpBuffer.at(0), static_cast(tmpBuffer.size()), + bitmap.data(), minNonZero, maxNonZero); + + std::vector lut(USHORT_RANGE); + unsigned short maxValue = forwardLutFromBitmap(bitmap.data(), lut.data()); + applyLut(lut.data(), &tmpBuffer.at(0), static_cast(tmpBuffer.size())); + + // + // Store range compression info in _outBuffer + // + + char *buf = reinterpret_cast(outPtr); + + memcpy(buf, &minNonZero, sizeof(unsigned short)); + buf += sizeof(unsigned short); + memcpy(buf, &maxNonZero, sizeof(unsigned short)); + buf += sizeof(unsigned short); + + if (minNonZero <= maxNonZero) { + memcpy(buf, reinterpret_cast(&bitmap[0] + minNonZero), + maxNonZero - minNonZero + 1); + buf += maxNonZero - minNonZero + 1; + } + + // + // Apply wavelet encoding + // + + for (size_t i = 0; i < channelData.size(); ++i) { + PIZChannelData &cd = channelData[i]; + + for (int j = 0; j < cd.size; ++j) { + wav2Encode(cd.start + j, cd.nx, cd.size, cd.ny, cd.nx * cd.size, + maxValue); + } + } + + // + // Apply Huffman encoding; append the result to _outBuffer + // + + // length header(4byte), then huff data. Initialize length header with zero, + // then later fill it by `length`. + char *lengthPtr = buf; + int zero = 0; + memcpy(buf, &zero, sizeof(int)); + buf += sizeof(int); + + int length = + hufCompress(&tmpBuffer.at(0), static_cast(tmpBuffer.size()), buf); + memcpy(lengthPtr, &length, sizeof(int)); + + (*outSize) = static_cast( + (reinterpret_cast(buf) - outPtr) + + static_cast(length)); + + // Use uncompressed data when compressed data is larger than uncompressed. + // (Issue 40) + if ((*outSize) >= inSize) { + (*outSize) = static_cast(inSize); + memcpy(outPtr, inPtr, inSize); + } + return true; +} + +static bool DecompressPiz(unsigned char *outPtr, const unsigned char *inPtr, + size_t tmpBufSize, size_t inLen, int num_channels, + const EXRChannelInfo *channels, int data_width, + int num_lines) { + if (inLen == tmpBufSize) { + // Data is not compressed(Issue 40). + memcpy(outPtr, inPtr, inLen); + return true; + } + + std::vector bitmap(BITMAP_SIZE); + unsigned short minNonZero; + unsigned short maxNonZero; + +#if !MINIZ_LITTLE_ENDIAN + // @todo { PIZ compression on BigEndian architecture. } + TEXR_ASSERT(0); + return false; +#endif + + memset(bitmap.data(), 0, BITMAP_SIZE); + + const unsigned char *ptr = inPtr; + // minNonZero = *(reinterpret_cast(ptr)); + tinyexr::cpy2(&minNonZero, reinterpret_cast(ptr)); + // maxNonZero = *(reinterpret_cast(ptr + 2)); + tinyexr::cpy2(&maxNonZero, reinterpret_cast(ptr + 2)); + ptr += 4; + + if (maxNonZero >= BITMAP_SIZE) { + return false; + } + + if (minNonZero <= maxNonZero) { + memcpy(reinterpret_cast(&bitmap[0] + minNonZero), ptr, + maxNonZero - minNonZero + 1); + ptr += maxNonZero - minNonZero + 1; + } + + std::vector lut(USHORT_RANGE); + memset(lut.data(), 0, sizeof(unsigned short) * USHORT_RANGE); + unsigned short maxValue = reverseLutFromBitmap(bitmap.data(), lut.data()); + + // + // Huffman decoding + // + + int length; + + // length = *(reinterpret_cast(ptr)); + tinyexr::cpy4(&length, reinterpret_cast(ptr)); + ptr += sizeof(int); + + if (size_t((ptr - inPtr) + length) > inLen) { + return false; + } + + std::vector tmpBuffer(tmpBufSize); + hufUncompress(reinterpret_cast(ptr), length, &tmpBuffer); + + // + // Wavelet decoding + // + + std::vector channelData(static_cast(num_channels)); + + unsigned short *tmpBufferEnd = &tmpBuffer.at(0); + + for (size_t i = 0; i < static_cast(num_channels); ++i) { + const EXRChannelInfo &chan = channels[i]; + + size_t pixelSize = sizeof(int); // UINT and FLOAT + if (chan.pixel_type == TINYEXR_PIXELTYPE_HALF) { + pixelSize = sizeof(short); + } + + channelData[i].start = tmpBufferEnd; + channelData[i].end = channelData[i].start; + channelData[i].nx = data_width; + channelData[i].ny = num_lines; + // channelData[i].ys = 1; + channelData[i].size = static_cast(pixelSize / sizeof(short)); + + tmpBufferEnd += channelData[i].nx * channelData[i].ny * channelData[i].size; + } + + for (size_t i = 0; i < channelData.size(); ++i) { + PIZChannelData &cd = channelData[i]; + + for (int j = 0; j < cd.size; ++j) { + wav2Decode(cd.start + j, cd.nx, cd.size, cd.ny, cd.nx * cd.size, + maxValue); + } + } + + // + // Expand the pixel data to their original range + // + + applyLut(lut.data(), &tmpBuffer.at(0), static_cast(tmpBufSize)); + + for (int y = 0; y < num_lines; y++) { + for (size_t i = 0; i < channelData.size(); ++i) { + PIZChannelData &cd = channelData[i]; + + // if (modp (y, cd.ys) != 0) + // continue; + + size_t n = static_cast(cd.nx * cd.size); + memcpy(outPtr, cd.end, static_cast(n * sizeof(unsigned short))); + outPtr += n * sizeof(unsigned short); + cd.end += n; + } + } + + return true; +} +#endif // TINYEXR_USE_PIZ + +#if TINYEXR_USE_ZFP +struct ZFPCompressionParam { + double rate; + int precision; + double tolerance; + int type; // TINYEXR_ZFP_COMPRESSIONTYPE_* + + ZFPCompressionParam() { + type = TINYEXR_ZFP_COMPRESSIONTYPE_RATE; + rate = 2.0; + precision = 0; + tolerance = 0.0f; + } +}; + +bool FindZFPCompressionParam(ZFPCompressionParam *param, + const EXRAttribute *attributes, + int num_attributes) { + bool foundType = false; + + for (int i = 0; i < num_attributes; i++) { + if ((strcmp(attributes[i].name, "zfpCompressionType") == 0) && + (attributes[i].size == 1)) { + param->type = static_cast(attributes[i].value[0]); + + foundType = true; + } + } + + if (!foundType) { + return false; + } + + if (param->type == TINYEXR_ZFP_COMPRESSIONTYPE_RATE) { + for (int i = 0; i < num_attributes; i++) { + if ((strcmp(attributes[i].name, "zfpCompressionRate") == 0) && + (attributes[i].size == 8)) { + param->rate = *(reinterpret_cast(attributes[i].value)); + return true; + } + } + } else if (param->type == TINYEXR_ZFP_COMPRESSIONTYPE_PRECISION) { + for (int i = 0; i < num_attributes; i++) { + if ((strcmp(attributes[i].name, "zfpCompressionPrecision") == 0) && + (attributes[i].size == 4)) { + param->rate = *(reinterpret_cast(attributes[i].value)); + return true; + } + } + } else if (param->type == TINYEXR_ZFP_COMPRESSIONTYPE_ACCURACY) { + for (int i = 0; i < num_attributes; i++) { + if ((strcmp(attributes[i].name, "zfpCompressionTolerance") == 0) && + (attributes[i].size == 8)) { + param->tolerance = *(reinterpret_cast(attributes[i].value)); + return true; + } + } + } else { + TEXR_ASSERT(0); + } + + return false; +} + +// Assume pixel format is FLOAT for all channels. +static bool DecompressZfp(float *dst, int dst_width, int dst_num_lines, + int num_channels, const unsigned char *src, + unsigned long src_size, + const ZFPCompressionParam ¶m) { + size_t uncompressed_size = dst_width * dst_num_lines * num_channels; + + if (uncompressed_size == src_size) { + // Data is not compressed(Issue 40). + memcpy(dst, src, src_size); + } + + zfp_stream *zfp = NULL; + zfp_field *field = NULL; + + TEXR_ASSERT((dst_width % 4) == 0); + TEXR_ASSERT((dst_num_lines % 4) == 0); + + if ((dst_width & 3U) || (dst_num_lines & 3U)) { + return false; + } + + field = + zfp_field_2d(reinterpret_cast(const_cast(src)), + zfp_type_float, dst_width, dst_num_lines * num_channels); + zfp = zfp_stream_open(NULL); + + if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_RATE) { + zfp_stream_set_rate(zfp, param.rate, zfp_type_float, /* dimention */ 2, + /* write random access */ 0); + } else if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_PRECISION) { + zfp_stream_set_precision(zfp, param.precision, zfp_type_float); + } else if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_ACCURACY) { + zfp_stream_set_accuracy(zfp, param.tolerance, zfp_type_float); + } else { + TEXR_ASSERT(0); + } + + size_t buf_size = zfp_stream_maximum_size(zfp, field); + std::vector buf(buf_size); + memcpy(&buf.at(0), src, src_size); + + bitstream *stream = stream_open(&buf.at(0), buf_size); + zfp_stream_set_bit_stream(zfp, stream); + zfp_stream_rewind(zfp); + + size_t image_size = dst_width * dst_num_lines; + + for (int c = 0; c < num_channels; c++) { + // decompress 4x4 pixel block. + for (int y = 0; y < dst_num_lines; y += 4) { + for (int x = 0; x < dst_width; x += 4) { + float fblock[16]; + zfp_decode_block_float_2(zfp, fblock); + for (int j = 0; j < 4; j++) { + for (int i = 0; i < 4; i++) { + dst[c * image_size + ((y + j) * dst_width + (x + i))] = + fblock[j * 4 + i]; + } + } + } + } + } + + zfp_field_free(field); + zfp_stream_close(zfp); + stream_close(stream); + + return true; +} + +// Assume pixel format is FLOAT for all channels. +bool CompressZfp(std::vector *outBuf, unsigned int *outSize, + const float *inPtr, int width, int num_lines, int num_channels, + const ZFPCompressionParam ¶m) { + zfp_stream *zfp = NULL; + zfp_field *field = NULL; + + TEXR_ASSERT((width % 4) == 0); + TEXR_ASSERT((num_lines % 4) == 0); + + if ((width & 3U) || (num_lines & 3U)) { + return false; + } + + // create input array. + field = zfp_field_2d(reinterpret_cast(const_cast(inPtr)), + zfp_type_float, width, num_lines * num_channels); + + zfp = zfp_stream_open(NULL); + + if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_RATE) { + zfp_stream_set_rate(zfp, param.rate, zfp_type_float, 2, 0); + } else if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_PRECISION) { + zfp_stream_set_precision(zfp, param.precision, zfp_type_float); + } else if (param.type == TINYEXR_ZFP_COMPRESSIONTYPE_ACCURACY) { + zfp_stream_set_accuracy(zfp, param.tolerance, zfp_type_float); + } else { + TEXR_ASSERT(0); + } + + size_t buf_size = zfp_stream_maximum_size(zfp, field); + + outBuf->resize(buf_size); + + bitstream *stream = stream_open(&outBuf->at(0), buf_size); + zfp_stream_set_bit_stream(zfp, stream); + zfp_field_free(field); + + size_t image_size = width * num_lines; + + for (int c = 0; c < num_channels; c++) { + // compress 4x4 pixel block. + for (int y = 0; y < num_lines; y += 4) { + for (int x = 0; x < width; x += 4) { + float fblock[16]; + for (int j = 0; j < 4; j++) { + for (int i = 0; i < 4; i++) { + fblock[j * 4 + i] = + inPtr[c * image_size + ((y + j) * width + (x + i))]; + } + } + zfp_encode_block_float_2(zfp, fblock); + } + } + } + + zfp_stream_flush(zfp); + (*outSize) = zfp_stream_compressed_size(zfp); + + zfp_stream_close(zfp); + + return true; +} + +#endif + +// +// ----------------------------------------------------------------- +// + +// TODO(syoyo): Refactor function arguments. +static bool DecodePixelData(/* out */ unsigned char **out_images, + const int *requested_pixel_types, + const unsigned char *data_ptr, size_t data_len, + int compression_type, int line_order, int width, + int height, int x_stride, int y, int line_no, + int num_lines, size_t pixel_data_size, + size_t num_attributes, + const EXRAttribute *attributes, size_t num_channels, + const EXRChannelInfo *channels, + const std::vector &channel_offset_list) { + if (compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) { // PIZ +#if TINYEXR_USE_PIZ + if ((width == 0) || (num_lines == 0) || (pixel_data_size == 0)) { + // Invalid input #90 + return false; + } + + // Allocate original data size. + std::vector outBuf(static_cast( + static_cast(width * num_lines) * pixel_data_size)); + size_t tmpBufLen = outBuf.size(); + + bool ret = tinyexr::DecompressPiz( + reinterpret_cast(&outBuf.at(0)), data_ptr, tmpBufLen, + data_len, static_cast(num_channels), channels, width, num_lines); + + if (!ret) { + return false; + } + + // For PIZ_COMPRESSION: + // pixel sample data for channel 0 for scanline 0 + // pixel sample data for channel 1 for scanline 0 + // pixel sample data for channel ... for scanline 0 + // pixel sample data for channel n for scanline 0 + // pixel sample data for channel 0 for scanline 1 + // pixel sample data for channel 1 for scanline 1 + // pixel sample data for channel ... for scanline 1 + // pixel sample data for channel n for scanline 1 + // ... + for (size_t c = 0; c < static_cast(num_channels); c++) { + if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) { + for (size_t v = 0; v < static_cast(num_lines); v++) { + const unsigned short *line_ptr = reinterpret_cast( + &outBuf.at(v * pixel_data_size * static_cast(width) + + channel_offset_list[c] * static_cast(width))); + for (size_t u = 0; u < static_cast(width); u++) { + FP16 hf; + + // hf.u = line_ptr[u]; + // use `cpy` to avoid unaligned memory access when compiler's + // optimization is on. + tinyexr::cpy2(&(hf.u), line_ptr + u); + + tinyexr::swap2(reinterpret_cast(&hf.u)); + + if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) { + unsigned short *image = + reinterpret_cast(out_images)[c]; + if (line_order == 0) { + image += (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + image += static_cast( + (height - 1 - (line_no + static_cast(v)))) * + static_cast(x_stride) + + u; + } + *image = hf.u; + } else { // HALF -> FLOAT + FP32 f32 = half_to_float(hf); + float *image = reinterpret_cast(out_images)[c]; + size_t offset = 0; + if (line_order == 0) { + offset = (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + offset = static_cast( + (height - 1 - (line_no + static_cast(v)))) * + static_cast(x_stride) + + u; + } + image += offset; + *image = f32.f; + } + } + } + } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) { + TEXR_ASSERT(requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT); + + for (size_t v = 0; v < static_cast(num_lines); v++) { + const unsigned int *line_ptr = reinterpret_cast( + &outBuf.at(v * pixel_data_size * static_cast(width) + + channel_offset_list[c] * static_cast(width))); + for (size_t u = 0; u < static_cast(width); u++) { + unsigned int val; + // val = line_ptr[u]; + tinyexr::cpy4(&val, line_ptr + u); + + tinyexr::swap4(&val); + + unsigned int *image = + reinterpret_cast(out_images)[c]; + if (line_order == 0) { + image += (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + image += static_cast( + (height - 1 - (line_no + static_cast(v)))) * + static_cast(x_stride) + + u; + } + *image = val; + } + } + } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) { + TEXR_ASSERT(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT); + for (size_t v = 0; v < static_cast(num_lines); v++) { + const float *line_ptr = reinterpret_cast(&outBuf.at( + v * pixel_data_size * static_cast(x_stride) + + channel_offset_list[c] * static_cast(x_stride))); + for (size_t u = 0; u < static_cast(width); u++) { + float val; + // val = line_ptr[u]; + tinyexr::cpy4(&val, line_ptr + u); + + tinyexr::swap4(reinterpret_cast(&val)); + + float *image = reinterpret_cast(out_images)[c]; + if (line_order == 0) { + image += (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + image += static_cast( + (height - 1 - (line_no + static_cast(v)))) * + static_cast(x_stride) + + u; + } + *image = val; + } + } + } else { + TEXR_ASSERT(0); + } + } +#else + TEXR_ASSERT(0 && "PIZ is enabled in this build"); + return false; +#endif + + } else if (compression_type == TINYEXR_COMPRESSIONTYPE_ZIPS || + compression_type == TINYEXR_COMPRESSIONTYPE_ZIP) { + // Allocate original data size. + std::vector outBuf(static_cast(width) * + static_cast(num_lines) * + pixel_data_size); + + unsigned long dstLen = static_cast(outBuf.size()); + TEXR_ASSERT(dstLen > 0); + if (!tinyexr::DecompressZip( + reinterpret_cast(&outBuf.at(0)), &dstLen, data_ptr, + static_cast(data_len))) { + return false; + } + + // For ZIP_COMPRESSION: + // pixel sample data for channel 0 for scanline 0 + // pixel sample data for channel 1 for scanline 0 + // pixel sample data for channel ... for scanline 0 + // pixel sample data for channel n for scanline 0 + // pixel sample data for channel 0 for scanline 1 + // pixel sample data for channel 1 for scanline 1 + // pixel sample data for channel ... for scanline 1 + // pixel sample data for channel n for scanline 1 + // ... + for (size_t c = 0; c < static_cast(num_channels); c++) { + if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) { + for (size_t v = 0; v < static_cast(num_lines); v++) { + const unsigned short *line_ptr = reinterpret_cast( + &outBuf.at(v * static_cast(pixel_data_size) * + static_cast(width) + + channel_offset_list[c] * static_cast(width))); + for (size_t u = 0; u < static_cast(width); u++) { + tinyexr::FP16 hf; + + // hf.u = line_ptr[u]; + tinyexr::cpy2(&(hf.u), line_ptr + u); + + tinyexr::swap2(reinterpret_cast(&hf.u)); + + if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) { + unsigned short *image = + reinterpret_cast(out_images)[c]; + if (line_order == 0) { + image += (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + image += (static_cast(height) - 1U - + (static_cast(line_no) + v)) * + static_cast(x_stride) + + u; + } + *image = hf.u; + } else { // HALF -> FLOAT + tinyexr::FP32 f32 = half_to_float(hf); + float *image = reinterpret_cast(out_images)[c]; + size_t offset = 0; + if (line_order == 0) { + offset = (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + offset = (static_cast(height) - 1U - + (static_cast(line_no) + v)) * + static_cast(x_stride) + + u; + } + image += offset; + + *image = f32.f; + } + } + } + } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) { + TEXR_ASSERT(requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT); + + for (size_t v = 0; v < static_cast(num_lines); v++) { + const unsigned int *line_ptr = reinterpret_cast( + &outBuf.at(v * pixel_data_size * static_cast(width) + + channel_offset_list[c] * static_cast(width))); + for (size_t u = 0; u < static_cast(width); u++) { + unsigned int val; + // val = line_ptr[u]; + tinyexr::cpy4(&val, line_ptr + u); + + tinyexr::swap4(&val); + + unsigned int *image = + reinterpret_cast(out_images)[c]; + if (line_order == 0) { + image += (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + image += (static_cast(height) - 1U - + (static_cast(line_no) + v)) * + static_cast(x_stride) + + u; + } + *image = val; + } + } + } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) { + TEXR_ASSERT(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT); + for (size_t v = 0; v < static_cast(num_lines); v++) { + const float *line_ptr = reinterpret_cast( + &outBuf.at(v * pixel_data_size * static_cast(width) + + channel_offset_list[c] * static_cast(width))); + for (size_t u = 0; u < static_cast(width); u++) { + float val; + // val = line_ptr[u]; + tinyexr::cpy4(&val, line_ptr + u); + + tinyexr::swap4(reinterpret_cast(&val)); + + float *image = reinterpret_cast(out_images)[c]; + if (line_order == 0) { + image += (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + image += (static_cast(height) - 1U - + (static_cast(line_no) + v)) * + static_cast(x_stride) + + u; + } + *image = val; + } + } + } else { + TEXR_ASSERT(0); + return false; + } + } + } else if (compression_type == TINYEXR_COMPRESSIONTYPE_RLE) { + // Allocate original data size. + std::vector outBuf(static_cast(width) * + static_cast(num_lines) * + pixel_data_size); + + unsigned long dstLen = static_cast(outBuf.size()); + if (dstLen == 0) { + return false; + } + + if (!tinyexr::DecompressRle( + reinterpret_cast(&outBuf.at(0)), dstLen, data_ptr, + static_cast(data_len))) { + return false; + } + + // For RLE_COMPRESSION: + // pixel sample data for channel 0 for scanline 0 + // pixel sample data for channel 1 for scanline 0 + // pixel sample data for channel ... for scanline 0 + // pixel sample data for channel n for scanline 0 + // pixel sample data for channel 0 for scanline 1 + // pixel sample data for channel 1 for scanline 1 + // pixel sample data for channel ... for scanline 1 + // pixel sample data for channel n for scanline 1 + // ... + for (size_t c = 0; c < static_cast(num_channels); c++) { + if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) { + for (size_t v = 0; v < static_cast(num_lines); v++) { + const unsigned short *line_ptr = reinterpret_cast( + &outBuf.at(v * static_cast(pixel_data_size) * + static_cast(width) + + channel_offset_list[c] * static_cast(width))); + for (size_t u = 0; u < static_cast(width); u++) { + tinyexr::FP16 hf; + + // hf.u = line_ptr[u]; + tinyexr::cpy2(&(hf.u), line_ptr + u); + + tinyexr::swap2(reinterpret_cast(&hf.u)); + + if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) { + unsigned short *image = + reinterpret_cast(out_images)[c]; + if (line_order == 0) { + image += (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + image += (static_cast(height) - 1U - + (static_cast(line_no) + v)) * + static_cast(x_stride) + + u; + } + *image = hf.u; + } else { // HALF -> FLOAT + tinyexr::FP32 f32 = half_to_float(hf); + float *image = reinterpret_cast(out_images)[c]; + if (line_order == 0) { + image += (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + image += (static_cast(height) - 1U - + (static_cast(line_no) + v)) * + static_cast(x_stride) + + u; + } + *image = f32.f; + } + } + } + } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) { + TEXR_ASSERT(requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT); + + for (size_t v = 0; v < static_cast(num_lines); v++) { + const unsigned int *line_ptr = reinterpret_cast( + &outBuf.at(v * pixel_data_size * static_cast(width) + + channel_offset_list[c] * static_cast(width))); + for (size_t u = 0; u < static_cast(width); u++) { + unsigned int val; + // val = line_ptr[u]; + tinyexr::cpy4(&val, line_ptr + u); + + tinyexr::swap4(&val); + + unsigned int *image = + reinterpret_cast(out_images)[c]; + if (line_order == 0) { + image += (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + image += (static_cast(height) - 1U - + (static_cast(line_no) + v)) * + static_cast(x_stride) + + u; + } + *image = val; + } + } + } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) { + TEXR_ASSERT(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT); + for (size_t v = 0; v < static_cast(num_lines); v++) { + const float *line_ptr = reinterpret_cast( + &outBuf.at(v * pixel_data_size * static_cast(width) + + channel_offset_list[c] * static_cast(width))); + for (size_t u = 0; u < static_cast(width); u++) { + float val; + // val = line_ptr[u]; + tinyexr::cpy4(&val, line_ptr + u); + + tinyexr::swap4(reinterpret_cast(&val)); + + float *image = reinterpret_cast(out_images)[c]; + if (line_order == 0) { + image += (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + image += (static_cast(height) - 1U - + (static_cast(line_no) + v)) * + static_cast(x_stride) + + u; + } + *image = val; + } + } + } else { + TEXR_ASSERT(0); + return false; + } + } + } else if (compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) { +#if TINYEXR_USE_ZFP + tinyexr::ZFPCompressionParam zfp_compression_param; + if (!FindZFPCompressionParam(&zfp_compression_param, attributes, + num_attributes)) { + TEXR_ASSERT(0); + return false; + } + + // Allocate original data size. + std::vector outBuf(static_cast(width) * + static_cast(num_lines) * + pixel_data_size); + + unsigned long dstLen = outBuf.size(); + TEXR_ASSERT(dstLen > 0); + tinyexr::DecompressZfp(reinterpret_cast(&outBuf.at(0)), width, + num_lines, num_channels, data_ptr, + static_cast(data_len), + zfp_compression_param); + + // For ZFP_COMPRESSION: + // pixel sample data for channel 0 for scanline 0 + // pixel sample data for channel 1 for scanline 0 + // pixel sample data for channel ... for scanline 0 + // pixel sample data for channel n for scanline 0 + // pixel sample data for channel 0 for scanline 1 + // pixel sample data for channel 1 for scanline 1 + // pixel sample data for channel ... for scanline 1 + // pixel sample data for channel n for scanline 1 + // ... + for (size_t c = 0; c < static_cast(num_channels); c++) { + TEXR_ASSERT(channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT); + if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) { + TEXR_ASSERT(requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT); + for (size_t v = 0; v < static_cast(num_lines); v++) { + const float *line_ptr = reinterpret_cast( + &outBuf.at(v * pixel_data_size * static_cast(width) + + channel_offset_list[c] * static_cast(width))); + for (size_t u = 0; u < static_cast(width); u++) { + float val; + tinyexr::cpy4(&val, line_ptr + u); + + tinyexr::swap4(reinterpret_cast(&val)); + + float *image = reinterpret_cast(out_images)[c]; + if (line_order == 0) { + image += (static_cast(line_no) + v) * + static_cast(x_stride) + + u; + } else { + image += (static_cast(height) - 1U - + (static_cast(line_no) + v)) * + static_cast(x_stride) + + u; + } + *image = val; + } + } + } else { + TEXR_ASSERT(0); + return false; + } + } +#else + (void)attributes; + (void)num_attributes; + (void)num_channels; + TEXR_ASSERT(0); + return false; +#endif + } else if (compression_type == TINYEXR_COMPRESSIONTYPE_NONE) { + for (size_t c = 0; c < num_channels; c++) { + for (size_t v = 0; v < static_cast(num_lines); v++) { + if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) { + const unsigned short *line_ptr = + reinterpret_cast( + data_ptr + v * pixel_data_size * size_t(width) + + channel_offset_list[c] * static_cast(width)); + + if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) { + unsigned short *outLine = + reinterpret_cast(out_images[c]); + if (line_order == 0) { + outLine += (size_t(y) + v) * size_t(x_stride); + } else { + outLine += + (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride); + } + + for (int u = 0; u < width; u++) { + tinyexr::FP16 hf; + + // hf.u = line_ptr[u]; + tinyexr::cpy2(&(hf.u), line_ptr + u); + + tinyexr::swap2(reinterpret_cast(&hf.u)); + + outLine[u] = hf.u; + } + } else if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) { + float *outLine = reinterpret_cast(out_images[c]); + if (line_order == 0) { + outLine += (size_t(y) + v) * size_t(x_stride); + } else { + outLine += + (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride); + } + + if (reinterpret_cast(line_ptr + width) > + (data_ptr + data_len)) { + // Insufficient data size + return false; + } + + for (int u = 0; u < width; u++) { + tinyexr::FP16 hf; + + // address may not be aliged. use byte-wise copy for safety.#76 + // hf.u = line_ptr[u]; + tinyexr::cpy2(&(hf.u), line_ptr + u); + + tinyexr::swap2(reinterpret_cast(&hf.u)); + + tinyexr::FP32 f32 = half_to_float(hf); + + outLine[u] = f32.f; + } + } else { + TEXR_ASSERT(0); + return false; + } + } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) { + const float *line_ptr = reinterpret_cast( + data_ptr + v * pixel_data_size * size_t(width) + + channel_offset_list[c] * static_cast(width)); + + float *outLine = reinterpret_cast(out_images[c]); + if (line_order == 0) { + outLine += (size_t(y) + v) * size_t(x_stride); + } else { + outLine += + (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride); + } + + if (reinterpret_cast(line_ptr + width) > + (data_ptr + data_len)) { + // Insufficient data size + return false; + } + + for (int u = 0; u < width; u++) { + float val; + tinyexr::cpy4(&val, line_ptr + u); + + tinyexr::swap4(reinterpret_cast(&val)); + + outLine[u] = val; + } + } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) { + const unsigned int *line_ptr = reinterpret_cast( + data_ptr + v * pixel_data_size * size_t(width) + + channel_offset_list[c] * static_cast(width)); + + unsigned int *outLine = + reinterpret_cast(out_images[c]); + if (line_order == 0) { + outLine += (size_t(y) + v) * size_t(x_stride); + } else { + outLine += + (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride); + } + + for (int u = 0; u < width; u++) { + if (reinterpret_cast(line_ptr + u) >= + (data_ptr + data_len)) { + // Corrupsed data? + return false; + } + + unsigned int val; + tinyexr::cpy4(&val, line_ptr + u); + + tinyexr::swap4(reinterpret_cast(&val)); + + outLine[u] = val; + } + } + } + } + } + + return true; +} + +static bool DecodeTiledPixelData( + unsigned char **out_images, int *width, int *height, + const int *requested_pixel_types, const unsigned char *data_ptr, + size_t data_len, int compression_type, int line_order, int data_width, + int data_height, int tile_offset_x, int tile_offset_y, int tile_size_x, + int tile_size_y, size_t pixel_data_size, size_t num_attributes, + const EXRAttribute *attributes, size_t num_channels, + const EXRChannelInfo *channels, + const std::vector &channel_offset_list) { + TEXR_ASSERT(tile_offset_x * tile_size_x < data_width); + TEXR_ASSERT(tile_offset_y * tile_size_y < data_height); + + // Compute actual image size in a tile. + if ((tile_offset_x + 1) * tile_size_x >= data_width) { + (*width) = data_width - (tile_offset_x * tile_size_x); + } else { + (*width) = tile_size_x; + } + + if ((tile_offset_y + 1) * tile_size_y >= data_height) { + (*height) = data_height - (tile_offset_y * tile_size_y); + } else { + (*height) = tile_size_y; + } + + // Image size = tile size. + return DecodePixelData(out_images, requested_pixel_types, data_ptr, data_len, + compression_type, line_order, (*width), tile_size_y, + /* stride */ tile_size_x, /* y */ 0, /* line_no */ 0, + (*height), pixel_data_size, num_attributes, attributes, + num_channels, channels, channel_offset_list); +} + +static bool ComputeChannelLayout(std::vector *channel_offset_list, + int *pixel_data_size, size_t *channel_offset, + int num_channels, + const EXRChannelInfo *channels) { + channel_offset_list->resize(static_cast(num_channels)); + + (*pixel_data_size) = 0; + (*channel_offset) = 0; + + for (size_t c = 0; c < static_cast(num_channels); c++) { + (*channel_offset_list)[c] = (*channel_offset); + if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) { + (*pixel_data_size) += sizeof(unsigned short); + (*channel_offset) += sizeof(unsigned short); + } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) { + (*pixel_data_size) += sizeof(float); + (*channel_offset) += sizeof(float); + } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) { + (*pixel_data_size) += sizeof(unsigned int); + (*channel_offset) += sizeof(unsigned int); + } else { + // ??? + return false; + } + } + return true; +} + +static unsigned char **AllocateImage(int num_channels, + const EXRChannelInfo *channels, + const int *requested_pixel_types, + int data_width, int data_height) { + unsigned char **images = + reinterpret_cast(static_cast( + malloc(sizeof(float *) * static_cast(num_channels)))); + + for (size_t c = 0; c < static_cast(num_channels); c++) { + size_t data_len = + static_cast(data_width) * static_cast(data_height); + if (channels[c].pixel_type == TINYEXR_PIXELTYPE_HALF) { + // pixel_data_size += sizeof(unsigned short); + // channel_offset += sizeof(unsigned short); + // Alloc internal image for half type. + if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) { + images[c] = + reinterpret_cast(static_cast( + malloc(sizeof(unsigned short) * data_len))); + } else if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) { + images[c] = reinterpret_cast( + static_cast(malloc(sizeof(float) * data_len))); + } else { + TEXR_ASSERT(0); + } + } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_FLOAT) { + // pixel_data_size += sizeof(float); + // channel_offset += sizeof(float); + images[c] = reinterpret_cast( + static_cast(malloc(sizeof(float) * data_len))); + } else if (channels[c].pixel_type == TINYEXR_PIXELTYPE_UINT) { + // pixel_data_size += sizeof(unsigned int); + // channel_offset += sizeof(unsigned int); + images[c] = reinterpret_cast( + static_cast(malloc(sizeof(unsigned int) * data_len))); + } else { + TEXR_ASSERT(0); + } + } + + return images; +} + +static int ParseEXRHeader(HeaderInfo *info, bool *empty_header, + const EXRVersion *version, std::string *err, + const unsigned char *buf, size_t size) { + const char *marker = reinterpret_cast(&buf[0]); + + if (empty_header) { + (*empty_header) = false; + } + + if (version->multipart) { + if (size > 0 && marker[0] == '\0') { + // End of header list. + if (empty_header) { + (*empty_header) = true; + } + return TINYEXR_SUCCESS; + } + } + + // According to the spec, the header of every OpenEXR file must contain at + // least the following attributes: + // + // channels chlist + // compression compression + // dataWindow box2i + // displayWindow box2i + // lineOrder lineOrder + // pixelAspectRatio float + // screenWindowCenter v2f + // screenWindowWidth float + bool has_channels = false; + bool has_compression = false; + bool has_data_window = false; + bool has_display_window = false; + bool has_line_order = false; + bool has_pixel_aspect_ratio = false; + bool has_screen_window_center = false; + bool has_screen_window_width = false; + + info->data_window[0] = 0; + info->data_window[1] = 0; + info->data_window[2] = 0; + info->data_window[3] = 0; + info->line_order = 0; // @fixme + info->display_window[0] = 0; + info->display_window[1] = 0; + info->display_window[2] = 0; + info->display_window[3] = 0; + info->screen_window_center[0] = 0.0f; + info->screen_window_center[1] = 0.0f; + info->screen_window_width = -1.0f; + info->pixel_aspect_ratio = -1.0f; + + info->tile_size_x = -1; + info->tile_size_y = -1; + info->tile_level_mode = -1; + info->tile_rounding_mode = -1; + + info->attributes.clear(); + + // Read attributes + size_t orig_size = size; + for (size_t nattr = 0; nattr < TINYEXR_MAX_HEADER_ATTRIBUTES; nattr++) { + if (0 == size) { + if (err) { + (*err) += "Insufficient data size for attributes.\n"; + } + return TINYEXR_ERROR_INVALID_DATA; + } else if (marker[0] == '\0') { + size--; + break; + } + + std::string attr_name; + std::string attr_type; + std::vector data; + size_t marker_size; + if (!tinyexr::ReadAttribute(&attr_name, &attr_type, &data, &marker_size, + marker, size)) { + if (err) { + (*err) += "Failed to read attribute.\n"; + } + return TINYEXR_ERROR_INVALID_DATA; + } + marker += marker_size; + size -= marker_size; + + if (version->tiled && attr_name.compare("tiles") == 0) { + unsigned int x_size, y_size; + unsigned char tile_mode; + TEXR_ASSERT(data.size() == 9); + memcpy(&x_size, &data.at(0), sizeof(int)); + memcpy(&y_size, &data.at(4), sizeof(int)); + tile_mode = data[8]; + tinyexr::swap4(&x_size); + tinyexr::swap4(&y_size); + + info->tile_size_x = static_cast(x_size); + info->tile_size_y = static_cast(y_size); + + // mode = levelMode + roundingMode * 16 + info->tile_level_mode = tile_mode & 0x3; + info->tile_rounding_mode = (tile_mode >> 4) & 0x1; + + } else if (attr_name.compare("compression") == 0) { + bool ok = false; + if (data[0] < TINYEXR_COMPRESSIONTYPE_PIZ) { + ok = true; + } + + if (data[0] == TINYEXR_COMPRESSIONTYPE_PIZ) { +#if TINYEXR_USE_PIZ + ok = true; +#else + if (err) { + (*err) = "PIZ compression is not supported."; + } + return TINYEXR_ERROR_UNSUPPORTED_FORMAT; +#endif + } + + if (data[0] == TINYEXR_COMPRESSIONTYPE_ZFP) { +#if TINYEXR_USE_ZFP + ok = true; +#else + if (err) { + (*err) = "ZFP compression is not supported."; + } + return TINYEXR_ERROR_UNSUPPORTED_FORMAT; +#endif + } + + if (!ok) { + if (err) { + (*err) = "Unknown compression type."; + } + return TINYEXR_ERROR_UNSUPPORTED_FORMAT; + } + + info->compression_type = static_cast(data[0]); + has_compression = true; + + } else if (attr_name.compare("channels") == 0) { + // name: zero-terminated string, from 1 to 255 bytes long + // pixel type: int, possible values are: UINT = 0 HALF = 1 FLOAT = 2 + // pLinear: unsigned char, possible values are 0 and 1 + // reserved: three chars, should be zero + // xSampling: int + // ySampling: int + + if (!ReadChannelInfo(info->channels, data)) { + if (err) { + (*err) += "Failed to parse channel info.\n"; + } + return TINYEXR_ERROR_INVALID_DATA; + } + + if (info->channels.size() < 1) { + if (err) { + (*err) += "# of channels is zero.\n"; + } + return TINYEXR_ERROR_INVALID_DATA; + } + + has_channels = true; + + } else if (attr_name.compare("dataWindow") == 0) { + if (data.size() >= 16) { + memcpy(&info->data_window[0], &data.at(0), sizeof(int)); + memcpy(&info->data_window[1], &data.at(4), sizeof(int)); + memcpy(&info->data_window[2], &data.at(8), sizeof(int)); + memcpy(&info->data_window[3], &data.at(12), sizeof(int)); + tinyexr::swap4(reinterpret_cast(&info->data_window[0])); + tinyexr::swap4(reinterpret_cast(&info->data_window[1])); + tinyexr::swap4(reinterpret_cast(&info->data_window[2])); + tinyexr::swap4(reinterpret_cast(&info->data_window[3])); + has_data_window = true; + } + } else if (attr_name.compare("displayWindow") == 0) { + if (data.size() >= 16) { + memcpy(&info->display_window[0], &data.at(0), sizeof(int)); + memcpy(&info->display_window[1], &data.at(4), sizeof(int)); + memcpy(&info->display_window[2], &data.at(8), sizeof(int)); + memcpy(&info->display_window[3], &data.at(12), sizeof(int)); + tinyexr::swap4( + reinterpret_cast(&info->display_window[0])); + tinyexr::swap4( + reinterpret_cast(&info->display_window[1])); + tinyexr::swap4( + reinterpret_cast(&info->display_window[2])); + tinyexr::swap4( + reinterpret_cast(&info->display_window[3])); + + has_display_window = true; + } + } else if (attr_name.compare("lineOrder") == 0) { + if (data.size() >= 1) { + info->line_order = static_cast(data[0]); + has_line_order = true; + } + } else if (attr_name.compare("pixelAspectRatio") == 0) { + if (data.size() >= sizeof(float)) { + memcpy(&info->pixel_aspect_ratio, &data.at(0), sizeof(float)); + tinyexr::swap4( + reinterpret_cast(&info->pixel_aspect_ratio)); + has_pixel_aspect_ratio = true; + } + } else if (attr_name.compare("screenWindowCenter") == 0) { + if (data.size() >= 8) { + memcpy(&info->screen_window_center[0], &data.at(0), sizeof(float)); + memcpy(&info->screen_window_center[1], &data.at(4), sizeof(float)); + tinyexr::swap4( + reinterpret_cast(&info->screen_window_center[0])); + tinyexr::swap4( + reinterpret_cast(&info->screen_window_center[1])); + has_screen_window_center = true; + } + } else if (attr_name.compare("screenWindowWidth") == 0) { + if (data.size() >= sizeof(float)) { + memcpy(&info->screen_window_width, &data.at(0), sizeof(float)); + tinyexr::swap4( + reinterpret_cast(&info->screen_window_width)); + + has_screen_window_width = true; + } + } else if (attr_name.compare("chunkCount") == 0) { + if (data.size() >= sizeof(int)) { + memcpy(&info->chunk_count, &data.at(0), sizeof(int)); + tinyexr::swap4(reinterpret_cast(&info->chunk_count)); + } + } else { + // Custom attribute(up to TINYEXR_MAX_CUSTOM_ATTRIBUTES) + if (info->attributes.size() < TINYEXR_MAX_CUSTOM_ATTRIBUTES) { + EXRAttribute attrib; +#ifdef _MSC_VER + strncpy_s(attrib.name, attr_name.c_str(), 255); + strncpy_s(attrib.type, attr_type.c_str(), 255); +#else + strncpy(attrib.name, attr_name.c_str(), 255); + strncpy(attrib.type, attr_type.c_str(), 255); +#endif + attrib.name[255] = '\0'; + attrib.type[255] = '\0'; + attrib.size = static_cast(data.size()); + attrib.value = static_cast(malloc(data.size())); + memcpy(reinterpret_cast(attrib.value), &data.at(0), + data.size()); + info->attributes.push_back(attrib); + } + } + } + + // Check if required attributes exist + { + std::stringstream ss_err; + + if (!has_compression) { + ss_err << "\"compression\" attribute not found in the header." + << std::endl; + } + + if (!has_channels) { + ss_err << "\"channels\" attribute not found in the header." << std::endl; + } + + if (!has_line_order) { + ss_err << "\"lineOrder\" attribute not found in the header." << std::endl; + } + + if (!has_display_window) { + ss_err << "\"displayWindow\" attribute not found in the header." + << std::endl; + } + + if (!has_data_window) { + ss_err << "\"dataWindow\" attribute not found in the header or invalid." + << std::endl; + } + + if (!has_pixel_aspect_ratio) { + ss_err << "\"pixelAspectRatio\" attribute not found in the header." + << std::endl; + } + + if (!has_screen_window_width) { + ss_err << "\"screenWindowWidth\" attribute not found in the header." + << std::endl; + } + + if (!has_screen_window_center) { + ss_err << "\"screenWindowCenter\" attribute not found in the header." + << std::endl; + } + + if (!(ss_err.str().empty())) { + if (err) { + (*err) += ss_err.str(); + } + return TINYEXR_ERROR_INVALID_HEADER; + } + } + + info->header_len = static_cast(orig_size - size); + + return TINYEXR_SUCCESS; +} + +// C++ HeaderInfo to C EXRHeader conversion. +static void ConvertHeader(EXRHeader *exr_header, const HeaderInfo &info) { + exr_header->pixel_aspect_ratio = info.pixel_aspect_ratio; + exr_header->screen_window_center[0] = info.screen_window_center[0]; + exr_header->screen_window_center[1] = info.screen_window_center[1]; + exr_header->screen_window_width = info.screen_window_width; + exr_header->chunk_count = info.chunk_count; + exr_header->display_window[0] = info.display_window[0]; + exr_header->display_window[1] = info.display_window[1]; + exr_header->display_window[2] = info.display_window[2]; + exr_header->display_window[3] = info.display_window[3]; + exr_header->data_window[0] = info.data_window[0]; + exr_header->data_window[1] = info.data_window[1]; + exr_header->data_window[2] = info.data_window[2]; + exr_header->data_window[3] = info.data_window[3]; + exr_header->line_order = info.line_order; + exr_header->compression_type = info.compression_type; + + exr_header->tile_size_x = info.tile_size_x; + exr_header->tile_size_y = info.tile_size_y; + exr_header->tile_level_mode = info.tile_level_mode; + exr_header->tile_rounding_mode = info.tile_rounding_mode; + + exr_header->num_channels = static_cast(info.channels.size()); + + exr_header->channels = static_cast(malloc( + sizeof(EXRChannelInfo) * static_cast(exr_header->num_channels))); + for (size_t c = 0; c < static_cast(exr_header->num_channels); c++) { +#ifdef _MSC_VER + strncpy_s(exr_header->channels[c].name, info.channels[c].name.c_str(), 255); +#else + strncpy(exr_header->channels[c].name, info.channels[c].name.c_str(), 255); +#endif + // manually add '\0' for safety. + exr_header->channels[c].name[255] = '\0'; + + exr_header->channels[c].pixel_type = info.channels[c].pixel_type; + exr_header->channels[c].p_linear = info.channels[c].p_linear; + exr_header->channels[c].x_sampling = info.channels[c].x_sampling; + exr_header->channels[c].y_sampling = info.channels[c].y_sampling; + } + + exr_header->pixel_types = static_cast( + malloc(sizeof(int) * static_cast(exr_header->num_channels))); + for (size_t c = 0; c < static_cast(exr_header->num_channels); c++) { + exr_header->pixel_types[c] = info.channels[c].pixel_type; + } + + // Initially fill with values of `pixel_types` + exr_header->requested_pixel_types = static_cast( + malloc(sizeof(int) * static_cast(exr_header->num_channels))); + for (size_t c = 0; c < static_cast(exr_header->num_channels); c++) { + exr_header->requested_pixel_types[c] = info.channels[c].pixel_type; + } + + exr_header->num_custom_attributes = static_cast(info.attributes.size()); + + if (exr_header->num_custom_attributes > 0) { + // TODO(syoyo): Report warning when # of attributes exceeds + // `TINYEXR_MAX_CUSTOM_ATTRIBUTES` + if (exr_header->num_custom_attributes > TINYEXR_MAX_CUSTOM_ATTRIBUTES) { + exr_header->num_custom_attributes = TINYEXR_MAX_CUSTOM_ATTRIBUTES; + } + + exr_header->custom_attributes = static_cast(malloc( + sizeof(EXRAttribute) * size_t(exr_header->num_custom_attributes))); + + for (size_t i = 0; i < info.attributes.size(); i++) { + memcpy(exr_header->custom_attributes[i].name, info.attributes[i].name, + 256); + memcpy(exr_header->custom_attributes[i].type, info.attributes[i].type, + 256); + exr_header->custom_attributes[i].size = info.attributes[i].size; + // Just copy poiner + exr_header->custom_attributes[i].value = info.attributes[i].value; + } + + } else { + exr_header->custom_attributes = NULL; + } + + exr_header->header_len = info.header_len; +} + +static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header, + const std::vector &offsets, + const unsigned char *head, const size_t size, + std::string *err) { + int num_channels = exr_header->num_channels; + + int num_scanline_blocks = 1; + if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZIP) { + num_scanline_blocks = 16; + } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) { + num_scanline_blocks = 32; + } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) { + num_scanline_blocks = 16; + } + + int data_width = exr_header->data_window[2] - exr_header->data_window[0] + 1; + int data_height = exr_header->data_window[3] - exr_header->data_window[1] + 1; + + if ((data_width < 0) || (data_height < 0)) { + if (err) { + std::stringstream ss; + ss << "Invalid data width or data height: " << data_width << ", " + << data_height << std::endl; + (*err) += ss.str(); + } + return TINYEXR_ERROR_INVALID_DATA; + } + + // Do not allow too large data_width and data_height. header invalid? + { + const int threshold = 1024 * 8192; // heuristics + if ((data_width > threshold) || (data_height > threshold)) { + if (err) { + std::stringstream ss; + ss << "data_with or data_height too large. data_width: " << data_width + << ", " + << "data_height = " << data_height << std::endl; + (*err) += ss.str(); + } + return TINYEXR_ERROR_INVALID_DATA; + } + } + + size_t num_blocks = offsets.size(); + + std::vector channel_offset_list; + int pixel_data_size = 0; + size_t channel_offset = 0; + if (!tinyexr::ComputeChannelLayout(&channel_offset_list, &pixel_data_size, + &channel_offset, num_channels, + exr_header->channels)) { + if (err) { + (*err) += "Failed to compute channel layout.\n"; + } + return TINYEXR_ERROR_INVALID_DATA; + } + + bool invalid_data = false; // TODO(LTE): Use atomic lock for MT safety. + + if (exr_header->tiled) { + // value check + if (exr_header->tile_size_x < 0) { + if (err) { + std::stringstream ss; + ss << "Invalid tile size x : " << exr_header->tile_size_x << "\n"; + (*err) += ss.str(); + } + return TINYEXR_ERROR_INVALID_HEADER; + } + + if (exr_header->tile_size_y < 0) { + if (err) { + std::stringstream ss; + ss << "Invalid tile size y : " << exr_header->tile_size_y << "\n"; + (*err) += ss.str(); + } + return TINYEXR_ERROR_INVALID_HEADER; + } + + size_t num_tiles = offsets.size(); // = # of blocks + + exr_image->tiles = static_cast( + calloc(static_cast(num_tiles), sizeof(EXRTile))); + + int err_code = TINYEXR_SUCCESS; + +#if (__cplusplus > 199711L) && (TINYEXR_USE_THREAD > 0) + + std::vector workers; + std::atomic tile_count(0); + + int num_threads = std::max(1, int(std::thread::hardware_concurrency())); + if (num_threads > int(num_tiles)) { + num_threads = int(num_tiles); + } + + for (int t = 0; t < num_threads; t++) { + workers.emplace_back(std::thread([&]() { + size_t tile_idx = 0; + while ((tile_idx = tile_count++) < num_tiles) { + +#else + for (size_t tile_idx = 0; tile_idx < num_tiles; tile_idx++) { +#endif + // Allocate memory for each tile. + exr_image->tiles[tile_idx].images = tinyexr::AllocateImage( + num_channels, exr_header->channels, + exr_header->requested_pixel_types, exr_header->tile_size_x, + exr_header->tile_size_y); + + // 16 byte: tile coordinates + // 4 byte : data size + // ~ : data(uncompressed or compressed) + if (offsets[tile_idx] + sizeof(int) * 5 > size) { + // TODO(LTE): atomic + if (err) { + (*err) += "Insufficient data size.\n"; + } + err_code = TINYEXR_ERROR_INVALID_DATA; + break; + } + + size_t data_size = + size_t(size - (offsets[tile_idx] + sizeof(int) * 5)); + const unsigned char *data_ptr = + reinterpret_cast(head + offsets[tile_idx]); + + int tile_coordinates[4]; + memcpy(tile_coordinates, data_ptr, sizeof(int) * 4); + tinyexr::swap4( + reinterpret_cast(&tile_coordinates[0])); + tinyexr::swap4( + reinterpret_cast(&tile_coordinates[1])); + tinyexr::swap4( + reinterpret_cast(&tile_coordinates[2])); + tinyexr::swap4( + reinterpret_cast(&tile_coordinates[3])); + + // @todo{ LoD } + if (tile_coordinates[2] != 0) { + err_code = TINYEXR_ERROR_UNSUPPORTED_FEATURE; + break; + } + if (tile_coordinates[3] != 0) { + err_code = TINYEXR_ERROR_UNSUPPORTED_FEATURE; + break; + } + + int data_len; + memcpy(&data_len, data_ptr + 16, + sizeof(int)); // 16 = sizeof(tile_coordinates) + tinyexr::swap4(reinterpret_cast(&data_len)); + + if (data_len < 4 || size_t(data_len) > data_size) { + // TODO(LTE): atomic + if (err) { + (*err) += "Insufficient data length.\n"; + } + err_code = TINYEXR_ERROR_INVALID_DATA; + break; + } + + // Move to data addr: 20 = 16 + 4; + data_ptr += 20; + + bool ret = tinyexr::DecodeTiledPixelData( + exr_image->tiles[tile_idx].images, + &(exr_image->tiles[tile_idx].width), + &(exr_image->tiles[tile_idx].height), + exr_header->requested_pixel_types, data_ptr, + static_cast(data_len), exr_header->compression_type, + exr_header->line_order, data_width, data_height, + tile_coordinates[0], tile_coordinates[1], exr_header->tile_size_x, + exr_header->tile_size_y, static_cast(pixel_data_size), + static_cast(exr_header->num_custom_attributes), + exr_header->custom_attributes, + static_cast(exr_header->num_channels), + exr_header->channels, channel_offset_list); + + if (!ret) { + // TODO(LTE): atomic + if (err) { + (*err) += "Failed to decode tile data.\n"; + } + err_code = TINYEXR_ERROR_INVALID_DATA; + } + + exr_image->tiles[tile_idx].offset_x = tile_coordinates[0]; + exr_image->tiles[tile_idx].offset_y = tile_coordinates[1]; + exr_image->tiles[tile_idx].level_x = tile_coordinates[2]; + exr_image->tiles[tile_idx].level_y = tile_coordinates[3]; + +#if (__cplusplus > 199711L) && (TINYEXR_USE_THREAD > 0) + } + })); + } // num_thread loop + + for (auto &t : workers) { + t.join(); + } + +#else + } +#endif + + if (err_code != TINYEXR_SUCCESS) { + return err_code; + } + + exr_image->num_tiles = static_cast(num_tiles); + } else { // scanline format + + // Don't allow too large image(256GB * pixel_data_size or more). Workaround + // for #104. + size_t total_data_len = + size_t(data_width) * size_t(data_height) * size_t(num_channels); + const bool total_data_len_overflown = + sizeof(void *) == 8 ? (total_data_len >= 0x4000000000) : false; + if ((total_data_len == 0) || total_data_len_overflown) { + if (err) { + std::stringstream ss; + ss << "Image data size is zero or too large: width = " << data_width + << ", height = " << data_height << ", channels = " << num_channels + << std::endl; + (*err) += ss.str(); + } + return TINYEXR_ERROR_INVALID_DATA; + } + + exr_image->images = tinyexr::AllocateImage( + num_channels, exr_header->channels, exr_header->requested_pixel_types, + data_width, data_height); + +#if (__cplusplus > 199711L) && (TINYEXR_USE_THREAD > 0) + std::vector workers; + std::atomic y_count(0); + + int num_threads = std::max(1, int(std::thread::hardware_concurrency())); + if (num_threads > int(num_blocks)) { + num_threads = int(num_blocks); + } + + for (int t = 0; t < num_threads; t++) { + workers.emplace_back(std::thread([&]() { + int y = 0; + while ((y = y_count++) < int(num_blocks)) { + +#else + +#if TINYEXR_USE_OPENMP +#pragma omp parallel for +#endif + for (int y = 0; y < static_cast(num_blocks); y++) { + +#endif + size_t y_idx = static_cast(y); + + if (offsets[y_idx] + sizeof(int) * 2 > size) { + invalid_data = true; + } else { + // 4 byte: scan line + // 4 byte: data size + // ~ : pixel data(uncompressed or compressed) + size_t data_size = + size_t(size - (offsets[y_idx] + sizeof(int) * 2)); + const unsigned char *data_ptr = + reinterpret_cast(head + offsets[y_idx]); + + int line_no; + memcpy(&line_no, data_ptr, sizeof(int)); + int data_len; + memcpy(&data_len, data_ptr + 4, sizeof(int)); + tinyexr::swap4(reinterpret_cast(&line_no)); + tinyexr::swap4(reinterpret_cast(&data_len)); + + if (size_t(data_len) > data_size) { + invalid_data = true; + + } else if ((line_no > (2 << 20)) || (line_no < -(2 << 20))) { + // Too large value. Assume this is invalid + // 2**20 = 1048576 = heuristic value. + invalid_data = true; + } else if (data_len == 0) { + // TODO(syoyo): May be ok to raise the threshold for example + // `data_len < 4` + invalid_data = true; + } else { + // line_no may be negative. + int end_line_no = (std::min)(line_no + num_scanline_blocks, + (exr_header->data_window[3] + 1)); + + int num_lines = end_line_no - line_no; + + if (num_lines <= 0) { + invalid_data = true; + } else { + // Move to data addr: 8 = 4 + 4; + data_ptr += 8; + + // Adjust line_no with data_window.bmin.y + + // overflow check + tinyexr_int64 lno = + static_cast(line_no) - + static_cast(exr_header->data_window[1]); + if (lno > std::numeric_limits::max()) { + line_no = -1; // invalid + } else if (lno < -std::numeric_limits::max()) { + line_no = -1; // invalid + } else { + line_no -= exr_header->data_window[1]; + } + + if (line_no < 0) { + invalid_data = true; + } else { + if (!tinyexr::DecodePixelData( + exr_image->images, exr_header->requested_pixel_types, + data_ptr, static_cast(data_len), + exr_header->compression_type, exr_header->line_order, + data_width, data_height, data_width, y, line_no, + num_lines, static_cast(pixel_data_size), + static_cast( + exr_header->num_custom_attributes), + exr_header->custom_attributes, + static_cast(exr_header->num_channels), + exr_header->channels, channel_offset_list)) { + invalid_data = true; + } + } + } + } + } + +#if (__cplusplus > 199711L) && (TINYEXR_USE_THREAD > 0) + } + })); + } + + for (auto &t : workers) { + t.join(); + } +#else + } // omp parallel +#endif + } + + if (invalid_data) { + if (err) { + std::stringstream ss; + (*err) += "Invalid data found when decoding pixels.\n"; + } + return TINYEXR_ERROR_INVALID_DATA; + } + + // Overwrite `pixel_type` with `requested_pixel_type`. + { + for (int c = 0; c < exr_header->num_channels; c++) { + exr_header->pixel_types[c] = exr_header->requested_pixel_types[c]; + } + } + + { + exr_image->num_channels = num_channels; + + exr_image->width = data_width; + exr_image->height = data_height; + } + + return TINYEXR_SUCCESS; +} + +static bool ReconstructLineOffsets( + std::vector *offsets, size_t n, + const unsigned char *head, const unsigned char *marker, const size_t size) { + TEXR_ASSERT(head < marker); + TEXR_ASSERT(offsets->size() == n); + + for (size_t i = 0; i < n; i++) { + size_t offset = static_cast(marker - head); + // Offset should not exceed whole EXR file/data size. + if ((offset + sizeof(tinyexr::tinyexr_uint64)) >= size) { + return false; + } + + int y; + unsigned int data_len; + + memcpy(&y, marker, sizeof(int)); + memcpy(&data_len, marker + 4, sizeof(unsigned int)); + + if (data_len >= size) { + return false; + } + + tinyexr::swap4(reinterpret_cast(&y)); + tinyexr::swap4(reinterpret_cast(&data_len)); + + (*offsets)[i] = offset; + + marker += data_len + 8; // 8 = 4 bytes(y) + 4 bytes(data_len) + } + + return true; +} + +static int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header, + const unsigned char *head, + const unsigned char *marker, const size_t size, + const char **err) { + if (exr_image == NULL || exr_header == NULL || head == NULL || + marker == NULL || (size <= tinyexr::kEXRVersionSize)) { + tinyexr::SetErrorMessage("Invalid argument for DecodeEXRImage().", err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + int num_scanline_blocks = 1; + if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZIP) { + num_scanline_blocks = 16; + } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) { + num_scanline_blocks = 32; + } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) { + num_scanline_blocks = 16; + } + + int data_width = exr_header->data_window[2] - exr_header->data_window[0]; + if (data_width >= std::numeric_limits::max()) { + // Issue 63 + tinyexr::SetErrorMessage("Invalid data width value", err); + return TINYEXR_ERROR_INVALID_DATA; + } + data_width++; + + int data_height = exr_header->data_window[3] - exr_header->data_window[1]; + if (data_height >= std::numeric_limits::max()) { + tinyexr::SetErrorMessage("Invalid data height value", err); + return TINYEXR_ERROR_INVALID_DATA; + } + data_height++; + + if ((data_width < 0) || (data_height < 0)) { + tinyexr::SetErrorMessage("data width or data height is negative.", err); + return TINYEXR_ERROR_INVALID_DATA; + } + + // Do not allow too large data_width and data_height. header invalid? + { + const int threshold = 1024 * 8192; // heuristics + if (data_width > threshold) { + tinyexr::SetErrorMessage("data width too large.", err); + return TINYEXR_ERROR_INVALID_DATA; + } + if (data_height > threshold) { + tinyexr::SetErrorMessage("data height too large.", err); + return TINYEXR_ERROR_INVALID_DATA; + } + } + + // Read offset tables. + size_t num_blocks = 0; + + if (exr_header->chunk_count > 0) { + // Use `chunkCount` attribute. + num_blocks = static_cast(exr_header->chunk_count); + } else if (exr_header->tiled) { + // @todo { LoD } + size_t num_x_tiles = static_cast(data_width) / + static_cast(exr_header->tile_size_x); + if (num_x_tiles * static_cast(exr_header->tile_size_x) < + static_cast(data_width)) { + num_x_tiles++; + } + size_t num_y_tiles = static_cast(data_height) / + static_cast(exr_header->tile_size_y); + if (num_y_tiles * static_cast(exr_header->tile_size_y) < + static_cast(data_height)) { + num_y_tiles++; + } + + num_blocks = num_x_tiles * num_y_tiles; + } else { + num_blocks = static_cast(data_height) / + static_cast(num_scanline_blocks); + if (num_blocks * static_cast(num_scanline_blocks) < + static_cast(data_height)) { + num_blocks++; + } + } + + std::vector offsets(num_blocks); + + for (size_t y = 0; y < num_blocks; y++) { + tinyexr::tinyexr_uint64 offset; + // Issue #81 + if ((marker + sizeof(tinyexr_uint64)) >= (head + size)) { + tinyexr::SetErrorMessage("Insufficient data size in offset table.", err); + return TINYEXR_ERROR_INVALID_DATA; + } + + memcpy(&offset, marker, sizeof(tinyexr::tinyexr_uint64)); + tinyexr::swap8(&offset); + if (offset >= size) { + tinyexr::SetErrorMessage("Invalid offset value in DecodeEXRImage.", err); + return TINYEXR_ERROR_INVALID_DATA; + } + marker += sizeof(tinyexr::tinyexr_uint64); // = 8 + offsets[y] = offset; + } + + // If line offsets are invalid, we try to reconstruct it. + // See OpenEXR/IlmImf/ImfScanLineInputFile.cpp::readLineOffsets() for details. + for (size_t y = 0; y < num_blocks; y++) { + if (offsets[y] <= 0) { + // TODO(syoyo) Report as warning? + // if (err) { + // stringstream ss; + // ss << "Incomplete lineOffsets." << std::endl; + // (*err) += ss.str(); + //} + bool ret = + ReconstructLineOffsets(&offsets, num_blocks, head, marker, size); + if (ret) { + // OK + break; + } else { + tinyexr::SetErrorMessage( + "Cannot reconstruct lineOffset table in DecodeEXRImage.", err); + return TINYEXR_ERROR_INVALID_DATA; + } + } + } + + { + std::string e; + int ret = DecodeChunk(exr_image, exr_header, offsets, head, size, &e); + + if (ret != TINYEXR_SUCCESS) { + if (!e.empty()) { + tinyexr::SetErrorMessage(e, err); + } + +#if 1 + FreeEXRImage(exr_image); +#else + // release memory(if exists) + if ((exr_header->num_channels > 0) && exr_image && exr_image->images) { + for (size_t c = 0; c < size_t(exr_header->num_channels); c++) { + if (exr_image->images[c]) { + free(exr_image->images[c]); + exr_image->images[c] = NULL; + } + } + free(exr_image->images); + exr_image->images = NULL; + } +#endif + } + + return ret; + } +} + +static void GetLayers(const EXRHeader& exr_header, std::vector& layer_names) { + // Naive implementation + // Group channels by layers + // go over all channel names, split by periods + // collect unique names + layer_names.clear(); + for (int c = 0; c < exr_header.num_channels; c++) { + std::string full_name(exr_header.channels[c].name); + const size_t pos = full_name.find_last_of('.'); + if (pos != std::string::npos && pos != 0 && pos + 1 < full_name.size()) { + full_name.erase(pos); + if (std::find(layer_names.begin(), layer_names.end(), full_name) == layer_names.end()) + layer_names.push_back(full_name); + } + } +} + +struct LayerChannel { + explicit LayerChannel (size_t i, std::string n) + : index(i) + , name(n) + {} + size_t index; + std::string name; +}; + +static void ChannelsInLayer(const EXRHeader& exr_header, const std::string layer_name, std::vector& channels) { + channels.clear(); + for (int c = 0; c < exr_header.num_channels; c++) { + std::string ch_name(exr_header.channels[c].name); + if (layer_name.empty()) { + const size_t pos = ch_name.find_last_of('.'); + if (pos != std::string::npos && pos < ch_name.size()) { + ch_name = ch_name.substr(pos + 1); + } + } else { + const size_t pos = ch_name.find(layer_name + '.'); + if (pos == std::string::npos) + continue; + if (pos == 0) { + ch_name = ch_name.substr(layer_name.size() + 1); + } + } + LayerChannel ch(size_t(c), ch_name); + channels.push_back(ch); + } +} + +} // namespace tinyexr + +int EXRLayers(const char *filename, const char **layer_names[], int *num_layers, const char **err) { + EXRVersion exr_version; + EXRHeader exr_header; + InitEXRHeader(&exr_header); + + { + int ret = ParseEXRVersionFromFile(&exr_version, filename); + if (ret != TINYEXR_SUCCESS) { + tinyexr::SetErrorMessage("Invalid EXR header.", err); + return ret; + } + + if (exr_version.multipart || exr_version.non_image) { + tinyexr::SetErrorMessage( + "Loading multipart or DeepImage is not supported in LoadEXR() API", + err); + return TINYEXR_ERROR_INVALID_DATA; // @fixme. + } + } + + int ret = ParseEXRHeaderFromFile(&exr_header, &exr_version, filename, err); + if (ret != TINYEXR_SUCCESS) { + FreeEXRHeader(&exr_header); + return ret; + } + + std::vector layer_vec; + tinyexr::GetLayers(exr_header, layer_vec); + + (*num_layers) = int(layer_vec.size()); + (*layer_names) = static_cast( + malloc(sizeof(const char *) * static_cast(layer_vec.size()))); + for (size_t c = 0; c < static_cast(layer_vec.size()); c++) { +#ifdef _MSC_VER + (*layer_names)[c] = _strdup(layer_vec[c].c_str()); +#else + (*layer_names)[c] = strdup(layer_vec[c].c_str()); +#endif + } + + FreeEXRHeader(&exr_header); + return TINYEXR_SUCCESS; +} + +int LoadEXR(float **out_rgba, int *width, int *height, const char *filename, + const char **err) { + return LoadEXRWithLayer(out_rgba, width, height, filename, /* layername */NULL, err); +} + +int LoadEXRWithLayer(float **out_rgba, int *width, int *height, const char *filename, const char *layername, + const char **err) { + if (out_rgba == NULL) { + tinyexr::SetErrorMessage("Invalid argument for LoadEXR()", err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + EXRVersion exr_version; + EXRImage exr_image; + EXRHeader exr_header; + InitEXRHeader(&exr_header); + InitEXRImage(&exr_image); + + { + int ret = ParseEXRVersionFromFile(&exr_version, filename); + if (ret != TINYEXR_SUCCESS) { + std::stringstream ss; + ss << "Failed to open EXR file or read version info from EXR file. code(" << ret << ")"; + tinyexr::SetErrorMessage(ss.str(), err); + return ret; + } + + if (exr_version.multipart || exr_version.non_image) { + tinyexr::SetErrorMessage( + "Loading multipart or DeepImage is not supported in LoadEXR() API", + err); + return TINYEXR_ERROR_INVALID_DATA; // @fixme. + } + } + + { + int ret = ParseEXRHeaderFromFile(&exr_header, &exr_version, filename, err); + if (ret != TINYEXR_SUCCESS) { + FreeEXRHeader(&exr_header); + return ret; + } + } + + // Read HALF channel as FLOAT. + for (int i = 0; i < exr_header.num_channels; i++) { + if (exr_header.pixel_types[i] == TINYEXR_PIXELTYPE_HALF) { + exr_header.requested_pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT; + } + } + + // TODO: Probably limit loading to layers (channels) selected by layer index + { + int ret = LoadEXRImageFromFile(&exr_image, &exr_header, filename, err); + if (ret != TINYEXR_SUCCESS) { + FreeEXRHeader(&exr_header); + return ret; + } + } + + // RGBA + int idxR = -1; + int idxG = -1; + int idxB = -1; + int idxA = -1; + + std::vector layer_names; + tinyexr::GetLayers(exr_header, layer_names); + + std::vector channels; + tinyexr::ChannelsInLayer(exr_header, layername == NULL ? "" : std::string(layername), channels); + + if (channels.size() < 1) { + tinyexr::SetErrorMessage("Layer Not Found", err); + FreeEXRHeader(&exr_header); + FreeEXRImage(&exr_image); + return TINYEXR_ERROR_LAYER_NOT_FOUND; + } + + size_t ch_count = channels.size() < 4 ? channels.size() : 4; + for (size_t c = 0; c < ch_count; c++) { + const tinyexr::LayerChannel &ch = channels[c]; + + if (ch.name == "R") { + idxR = int(ch.index); + } + else if (ch.name == "G") { + idxG = int(ch.index); + } + else if (ch.name == "B") { + idxB = int(ch.index); + } + else if (ch.name == "A") { + idxA = int(ch.index); + } + } + + if (channels.size() == 1) { + int chIdx = int(channels.front().index); + // Grayscale channel only. + + (*out_rgba) = reinterpret_cast( + malloc(4 * sizeof(float) * static_cast(exr_image.width) * + static_cast(exr_image.height))); + + if (exr_header.tiled) { + for (int it = 0; it < exr_image.num_tiles; it++) { + for (int j = 0; j < exr_header.tile_size_y; j++) { + for (int i = 0; i < exr_header.tile_size_x; i++) { + const int ii = + exr_image.tiles[it].offset_x * exr_header.tile_size_x + i; + const int jj = + exr_image.tiles[it].offset_y * exr_header.tile_size_y + j; + const int idx = ii + jj * exr_image.width; + + // out of region check. + if (ii >= exr_image.width) { + continue; + } + if (jj >= exr_image.height) { + continue; + } + const int srcIdx = i + j * exr_header.tile_size_x; + unsigned char **src = exr_image.tiles[it].images; + (*out_rgba)[4 * idx + 0] = + reinterpret_cast(src)[chIdx][srcIdx]; + (*out_rgba)[4 * idx + 1] = + reinterpret_cast(src)[chIdx][srcIdx]; + (*out_rgba)[4 * idx + 2] = + reinterpret_cast(src)[chIdx][srcIdx]; + (*out_rgba)[4 * idx + 3] = + reinterpret_cast(src)[chIdx][srcIdx]; + } + } + } + } else { + for (int i = 0; i < exr_image.width * exr_image.height; i++) { + const float val = reinterpret_cast(exr_image.images)[chIdx][i]; + (*out_rgba)[4 * i + 0] = val; + (*out_rgba)[4 * i + 1] = val; + (*out_rgba)[4 * i + 2] = val; + (*out_rgba)[4 * i + 3] = val; + } + } + } else { + // Assume RGB(A) + + if (idxR == -1) { + tinyexr::SetErrorMessage("R channel not found", err); + + FreeEXRHeader(&exr_header); + FreeEXRImage(&exr_image); + return TINYEXR_ERROR_INVALID_DATA; + } + + if (idxG == -1) { + tinyexr::SetErrorMessage("G channel not found", err); + FreeEXRHeader(&exr_header); + FreeEXRImage(&exr_image); + return TINYEXR_ERROR_INVALID_DATA; + } + + if (idxB == -1) { + tinyexr::SetErrorMessage("B channel not found", err); + FreeEXRHeader(&exr_header); + FreeEXRImage(&exr_image); + return TINYEXR_ERROR_INVALID_DATA; + } + + (*out_rgba) = reinterpret_cast( + malloc(4 * sizeof(float) * static_cast(exr_image.width) * + static_cast(exr_image.height))); + if (exr_header.tiled) { + for (int it = 0; it < exr_image.num_tiles; it++) { + for (int j = 0; j < exr_header.tile_size_y; j++) { + for (int i = 0; i < exr_header.tile_size_x; i++) { + const int ii = + exr_image.tiles[it].offset_x * exr_header.tile_size_x + i; + const int jj = + exr_image.tiles[it].offset_y * exr_header.tile_size_y + j; + const int idx = ii + jj * exr_image.width; + + // out of region check. + if (ii >= exr_image.width) { + continue; + } + if (jj >= exr_image.height) { + continue; + } + const int srcIdx = i + j * exr_header.tile_size_x; + unsigned char **src = exr_image.tiles[it].images; + (*out_rgba)[4 * idx + 0] = + reinterpret_cast(src)[idxR][srcIdx]; + (*out_rgba)[4 * idx + 1] = + reinterpret_cast(src)[idxG][srcIdx]; + (*out_rgba)[4 * idx + 2] = + reinterpret_cast(src)[idxB][srcIdx]; + if (idxA != -1) { + (*out_rgba)[4 * idx + 3] = + reinterpret_cast(src)[idxA][srcIdx]; + } else { + (*out_rgba)[4 * idx + 3] = 1.0; + } + } + } + } + } else { + for (int i = 0; i < exr_image.width * exr_image.height; i++) { + (*out_rgba)[4 * i + 0] = + reinterpret_cast(exr_image.images)[idxR][i]; + (*out_rgba)[4 * i + 1] = + reinterpret_cast(exr_image.images)[idxG][i]; + (*out_rgba)[4 * i + 2] = + reinterpret_cast(exr_image.images)[idxB][i]; + if (idxA != -1) { + (*out_rgba)[4 * i + 3] = + reinterpret_cast(exr_image.images)[idxA][i]; + } else { + (*out_rgba)[4 * i + 3] = 1.0; + } + } + } + } + + (*width) = exr_image.width; + (*height) = exr_image.height; + + FreeEXRHeader(&exr_header); + FreeEXRImage(&exr_image); + + return TINYEXR_SUCCESS; +} + +int IsEXR(const char *filename) { + EXRVersion exr_version; + + int ret = ParseEXRVersionFromFile(&exr_version, filename); + if (ret != TINYEXR_SUCCESS) { + return ret; + } + + return TINYEXR_SUCCESS; +} + +int ParseEXRHeaderFromMemory(EXRHeader *exr_header, const EXRVersion *version, + const unsigned char *memory, size_t size, + const char **err) { + if (memory == NULL || exr_header == NULL) { + tinyexr::SetErrorMessage( + "Invalid argument. `memory` or `exr_header` argument is null in " + "ParseEXRHeaderFromMemory()", + err); + + // Invalid argument + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + if (size < tinyexr::kEXRVersionSize) { + tinyexr::SetErrorMessage("Insufficient header/data size.\n", err); + return TINYEXR_ERROR_INVALID_DATA; + } + + const unsigned char *marker = memory + tinyexr::kEXRVersionSize; + size_t marker_size = size - tinyexr::kEXRVersionSize; + + tinyexr::HeaderInfo info; + info.clear(); + + std::string err_str; + int ret = ParseEXRHeader(&info, NULL, version, &err_str, marker, marker_size); + + if (ret != TINYEXR_SUCCESS) { + if (err && !err_str.empty()) { + tinyexr::SetErrorMessage(err_str, err); + } + } + + ConvertHeader(exr_header, info); + + // transfoer `tiled` from version. + exr_header->tiled = version->tiled; + + return ret; +} + +int LoadEXRFromMemory(float **out_rgba, int *width, int *height, + const unsigned char *memory, size_t size, + const char **err) { + if (out_rgba == NULL || memory == NULL) { + tinyexr::SetErrorMessage("Invalid argument for LoadEXRFromMemory", err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + EXRVersion exr_version; + EXRImage exr_image; + EXRHeader exr_header; + + InitEXRHeader(&exr_header); + + int ret = ParseEXRVersionFromMemory(&exr_version, memory, size); + if (ret != TINYEXR_SUCCESS) { + std::stringstream ss; + ss << "Failed to parse EXR version. code(" << ret << ")"; + tinyexr::SetErrorMessage(ss.str(), err); + return ret; + } + + ret = ParseEXRHeaderFromMemory(&exr_header, &exr_version, memory, size, err); + if (ret != TINYEXR_SUCCESS) { + return ret; + } + + // Read HALF channel as FLOAT. + for (int i = 0; i < exr_header.num_channels; i++) { + if (exr_header.pixel_types[i] == TINYEXR_PIXELTYPE_HALF) { + exr_header.requested_pixel_types[i] = TINYEXR_PIXELTYPE_FLOAT; + } + } + + InitEXRImage(&exr_image); + ret = LoadEXRImageFromMemory(&exr_image, &exr_header, memory, size, err); + if (ret != TINYEXR_SUCCESS) { + return ret; + } + + // RGBA + int idxR = -1; + int idxG = -1; + int idxB = -1; + int idxA = -1; + for (int c = 0; c < exr_header.num_channels; c++) { + if (strcmp(exr_header.channels[c].name, "R") == 0) { + idxR = c; + } else if (strcmp(exr_header.channels[c].name, "G") == 0) { + idxG = c; + } else if (strcmp(exr_header.channels[c].name, "B") == 0) { + idxB = c; + } else if (strcmp(exr_header.channels[c].name, "A") == 0) { + idxA = c; + } + } + + // TODO(syoyo): Refactor removing same code as used in LoadEXR(). + if (exr_header.num_channels == 1) { + // Grayscale channel only. + + (*out_rgba) = reinterpret_cast( + malloc(4 * sizeof(float) * static_cast(exr_image.width) * + static_cast(exr_image.height))); + + if (exr_header.tiled) { + for (int it = 0; it < exr_image.num_tiles; it++) { + for (int j = 0; j < exr_header.tile_size_y; j++) { + for (int i = 0; i < exr_header.tile_size_x; i++) { + const int ii = + exr_image.tiles[it].offset_x * exr_header.tile_size_x + i; + const int jj = + exr_image.tiles[it].offset_y * exr_header.tile_size_y + j; + const int idx = ii + jj * exr_image.width; + + // out of region check. + if (ii >= exr_image.width) { + continue; + } + if (jj >= exr_image.height) { + continue; + } + const int srcIdx = i + j * exr_header.tile_size_x; + unsigned char **src = exr_image.tiles[it].images; + (*out_rgba)[4 * idx + 0] = + reinterpret_cast(src)[0][srcIdx]; + (*out_rgba)[4 * idx + 1] = + reinterpret_cast(src)[0][srcIdx]; + (*out_rgba)[4 * idx + 2] = + reinterpret_cast(src)[0][srcIdx]; + (*out_rgba)[4 * idx + 3] = + reinterpret_cast(src)[0][srcIdx]; + } + } + } + } else { + for (int i = 0; i < exr_image.width * exr_image.height; i++) { + const float val = reinterpret_cast(exr_image.images)[0][i]; + (*out_rgba)[4 * i + 0] = val; + (*out_rgba)[4 * i + 1] = val; + (*out_rgba)[4 * i + 2] = val; + (*out_rgba)[4 * i + 3] = val; + } + } + + } else { + // TODO(syoyo): Support non RGBA image. + + if (idxR == -1) { + tinyexr::SetErrorMessage("R channel not found", err); + + // @todo { free exr_image } + return TINYEXR_ERROR_INVALID_DATA; + } + + if (idxG == -1) { + tinyexr::SetErrorMessage("G channel not found", err); + // @todo { free exr_image } + return TINYEXR_ERROR_INVALID_DATA; + } + + if (idxB == -1) { + tinyexr::SetErrorMessage("B channel not found", err); + // @todo { free exr_image } + return TINYEXR_ERROR_INVALID_DATA; + } + + (*out_rgba) = reinterpret_cast( + malloc(4 * sizeof(float) * static_cast(exr_image.width) * + static_cast(exr_image.height))); + + if (exr_header.tiled) { + for (int it = 0; it < exr_image.num_tiles; it++) { + for (int j = 0; j < exr_header.tile_size_y; j++) + for (int i = 0; i < exr_header.tile_size_x; i++) { + const int ii = + exr_image.tiles[it].offset_x * exr_header.tile_size_x + i; + const int jj = + exr_image.tiles[it].offset_y * exr_header.tile_size_y + j; + const int idx = ii + jj * exr_image.width; + + // out of region check. + if (ii >= exr_image.width) { + continue; + } + if (jj >= exr_image.height) { + continue; + } + const int srcIdx = i + j * exr_header.tile_size_x; + unsigned char **src = exr_image.tiles[it].images; + (*out_rgba)[4 * idx + 0] = + reinterpret_cast(src)[idxR][srcIdx]; + (*out_rgba)[4 * idx + 1] = + reinterpret_cast(src)[idxG][srcIdx]; + (*out_rgba)[4 * idx + 2] = + reinterpret_cast(src)[idxB][srcIdx]; + if (idxA != -1) { + (*out_rgba)[4 * idx + 3] = + reinterpret_cast(src)[idxA][srcIdx]; + } else { + (*out_rgba)[4 * idx + 3] = 1.0; + } + } + } + } else { + for (int i = 0; i < exr_image.width * exr_image.height; i++) { + (*out_rgba)[4 * i + 0] = + reinterpret_cast(exr_image.images)[idxR][i]; + (*out_rgba)[4 * i + 1] = + reinterpret_cast(exr_image.images)[idxG][i]; + (*out_rgba)[4 * i + 2] = + reinterpret_cast(exr_image.images)[idxB][i]; + if (idxA != -1) { + (*out_rgba)[4 * i + 3] = + reinterpret_cast(exr_image.images)[idxA][i]; + } else { + (*out_rgba)[4 * i + 3] = 1.0; + } + } + } + } + + (*width) = exr_image.width; + (*height) = exr_image.height; + + FreeEXRHeader(&exr_header); + FreeEXRImage(&exr_image); + + return TINYEXR_SUCCESS; +} + +int LoadEXRImageFromFile(EXRImage *exr_image, const EXRHeader *exr_header, + const char *filename, const char **err) { + if (exr_image == NULL) { + tinyexr::SetErrorMessage("Invalid argument for LoadEXRImageFromFile", err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + +#ifdef _WIN32 + FILE *fp = NULL; + fopen_s(&fp, filename, "rb"); +#else + FILE *fp = fopen(filename, "rb"); +#endif + if (!fp) { + tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err); + return TINYEXR_ERROR_CANT_OPEN_FILE; + } + + size_t filesize; + // Compute size + fseek(fp, 0, SEEK_END); + filesize = static_cast(ftell(fp)); + fseek(fp, 0, SEEK_SET); + + if (filesize < 16) { + fclose(fp); + tinyexr::SetErrorMessage("File size too short " + std::string(filename), + err); + return TINYEXR_ERROR_INVALID_FILE; + } + + std::vector buf(filesize); // @todo { use mmap } + { + size_t ret; + ret = fread(&buf[0], 1, filesize, fp); + TEXR_ASSERT(ret == filesize); + fclose(fp); + (void)ret; + } + + return LoadEXRImageFromMemory(exr_image, exr_header, &buf.at(0), filesize, + err); +} + +int LoadEXRImageFromMemory(EXRImage *exr_image, const EXRHeader *exr_header, + const unsigned char *memory, const size_t size, + const char **err) { + if (exr_image == NULL || memory == NULL || + (size < tinyexr::kEXRVersionSize)) { + tinyexr::SetErrorMessage("Invalid argument for LoadEXRImageFromMemory", + err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + if (exr_header->header_len == 0) { + tinyexr::SetErrorMessage("EXRHeader variable is not initialized.", err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + const unsigned char *head = memory; + const unsigned char *marker = reinterpret_cast( + memory + exr_header->header_len + + 8); // +8 for magic number + version header. + return tinyexr::DecodeEXRImage(exr_image, exr_header, head, marker, size, + err); +} + +size_t SaveEXRImageToMemory(const EXRImage *exr_image, + const EXRHeader *exr_header, + unsigned char **memory_out, const char **err) { + if (exr_image == NULL || memory_out == NULL || + exr_header->compression_type < 0) { + tinyexr::SetErrorMessage("Invalid argument for SaveEXRImageToMemory", err); + return 0; + } + +#if !TINYEXR_USE_PIZ + if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) { + tinyexr::SetErrorMessage("PIZ compression is not supported in this build", + err); + return 0; + } +#endif + +#if !TINYEXR_USE_ZFP + if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) { + tinyexr::SetErrorMessage("ZFP compression is not supported in this build", + err); + return 0; + } +#endif + +#if TINYEXR_USE_ZFP + for (size_t i = 0; i < static_cast(exr_header->num_channels); i++) { + if (exr_header->requested_pixel_types[i] != TINYEXR_PIXELTYPE_FLOAT) { + tinyexr::SetErrorMessage("Pixel type must be FLOAT for ZFP compression", + err); + return 0; + } + } +#endif + + std::vector memory; + + // Header + { + const char header[] = {0x76, 0x2f, 0x31, 0x01}; + memory.insert(memory.end(), header, header + 4); + } + + // Version, scanline. + { + char marker[] = {2, 0, 0, 0}; + /* @todo + if (exr_header->tiled) { + marker[1] |= 0x2; + } + if (exr_header->long_name) { + marker[1] |= 0x4; + } + if (exr_header->non_image) { + marker[1] |= 0x8; + } + if (exr_header->multipart) { + marker[1] |= 0x10; + } + */ + memory.insert(memory.end(), marker, marker + 4); + } + + int num_scanlines = 1; + if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZIP) { + num_scanlines = 16; + } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) { + num_scanlines = 32; + } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) { + num_scanlines = 16; + } + + // Write attributes. + std::vector channels; + { + std::vector data; + + for (int c = 0; c < exr_header->num_channels; c++) { + tinyexr::ChannelInfo info; + info.p_linear = 0; + info.pixel_type = exr_header->requested_pixel_types[c]; + info.x_sampling = 1; + info.y_sampling = 1; + info.name = std::string(exr_header->channels[c].name); + channels.push_back(info); + } + + tinyexr::WriteChannelInfo(data, channels); + + tinyexr::WriteAttributeToMemory(&memory, "channels", "chlist", &data.at(0), + static_cast(data.size())); + } + + { + int comp = exr_header->compression_type; + tinyexr::swap4(reinterpret_cast(&comp)); + tinyexr::WriteAttributeToMemory( + &memory, "compression", "compression", + reinterpret_cast(&comp), 1); + } + + { + int data[4] = {0, 0, exr_image->width - 1, exr_image->height - 1}; + tinyexr::swap4(reinterpret_cast(&data[0])); + tinyexr::swap4(reinterpret_cast(&data[1])); + tinyexr::swap4(reinterpret_cast(&data[2])); + tinyexr::swap4(reinterpret_cast(&data[3])); + tinyexr::WriteAttributeToMemory( + &memory, "dataWindow", "box2i", + reinterpret_cast(data), sizeof(int) * 4); + tinyexr::WriteAttributeToMemory( + &memory, "displayWindow", "box2i", + reinterpret_cast(data), sizeof(int) * 4); + } + + { + unsigned char line_order = 0; // @fixme { read line_order from EXRHeader } + tinyexr::WriteAttributeToMemory(&memory, "lineOrder", "lineOrder", + &line_order, 1); + } + + { + float aspectRatio = 1.0f; + tinyexr::swap4(reinterpret_cast(&aspectRatio)); + tinyexr::WriteAttributeToMemory( + &memory, "pixelAspectRatio", "float", + reinterpret_cast(&aspectRatio), sizeof(float)); + } + + { + float center[2] = {0.0f, 0.0f}; + tinyexr::swap4(reinterpret_cast(¢er[0])); + tinyexr::swap4(reinterpret_cast(¢er[1])); + tinyexr::WriteAttributeToMemory( + &memory, "screenWindowCenter", "v2f", + reinterpret_cast(center), 2 * sizeof(float)); + } + + { + float w = static_cast(exr_image->width); + tinyexr::swap4(reinterpret_cast(&w)); + tinyexr::WriteAttributeToMemory(&memory, "screenWindowWidth", "float", + reinterpret_cast(&w), + sizeof(float)); + } + + // Custom attributes + if (exr_header->num_custom_attributes > 0) { + for (int i = 0; i < exr_header->num_custom_attributes; i++) { + tinyexr::WriteAttributeToMemory( + &memory, exr_header->custom_attributes[i].name, + exr_header->custom_attributes[i].type, + reinterpret_cast( + exr_header->custom_attributes[i].value), + exr_header->custom_attributes[i].size); + } + } + + { // end of header + unsigned char e = 0; + memory.push_back(e); + } + + int num_blocks = exr_image->height / num_scanlines; + if (num_blocks * num_scanlines < exr_image->height) { + num_blocks++; + } + + std::vector offsets(static_cast(num_blocks)); + + size_t headerSize = memory.size(); + tinyexr::tinyexr_uint64 offset = + headerSize + + static_cast(num_blocks) * + sizeof( + tinyexr::tinyexr_int64); // sizeof(header) + sizeof(offsetTable) + + std::vector > data_list( + static_cast(num_blocks)); + std::vector channel_offset_list( + static_cast(exr_header->num_channels)); + + int pixel_data_size = 0; + size_t channel_offset = 0; + for (size_t c = 0; c < static_cast(exr_header->num_channels); c++) { + channel_offset_list[c] = channel_offset; + if (exr_header->requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) { + pixel_data_size += sizeof(unsigned short); + channel_offset += sizeof(unsigned short); + } else if (exr_header->requested_pixel_types[c] == + TINYEXR_PIXELTYPE_FLOAT) { + pixel_data_size += sizeof(float); + channel_offset += sizeof(float); + } else if (exr_header->requested_pixel_types[c] == TINYEXR_PIXELTYPE_UINT) { + pixel_data_size += sizeof(unsigned int); + channel_offset += sizeof(unsigned int); + } else { + TEXR_ASSERT(0); + } + } + +#if TINYEXR_USE_ZFP + tinyexr::ZFPCompressionParam zfp_compression_param; + + // Use ZFP compression parameter from custom attributes(if such a parameter + // exists) + { + bool ret = tinyexr::FindZFPCompressionParam( + &zfp_compression_param, exr_header->custom_attributes, + exr_header->num_custom_attributes); + + if (!ret) { + // Use predefined compression parameter. + zfp_compression_param.type = 0; + zfp_compression_param.rate = 2; + } + } +#endif + + // TOOD(LTE): C++11 thread + +// Use signed int since some OpenMP compiler doesn't allow unsigned type for +// `parallel for` +#if TINYEXR_USE_OPENMP +#pragma omp parallel for +#endif + for (int i = 0; i < num_blocks; i++) { + size_t ii = static_cast(i); + int start_y = num_scanlines * i; + int endY = (std::min)(num_scanlines * (i + 1), exr_image->height); + int h = endY - start_y; + + std::vector buf( + static_cast(exr_image->width * h * pixel_data_size)); + + for (size_t c = 0; c < static_cast(exr_header->num_channels); c++) { + if (exr_header->pixel_types[c] == TINYEXR_PIXELTYPE_HALF) { + if (exr_header->requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) { + for (int y = 0; y < h; y++) { + // Assume increasing Y + float *line_ptr = reinterpret_cast(&buf.at( + static_cast(pixel_data_size * y * exr_image->width) + + channel_offset_list[c] * + static_cast(exr_image->width))); + for (int x = 0; x < exr_image->width; x++) { + tinyexr::FP16 h16; + h16.u = reinterpret_cast( + exr_image->images)[c][(y + start_y) * exr_image->width + x]; + + tinyexr::FP32 f32 = half_to_float(h16); + + tinyexr::swap4(reinterpret_cast(&f32.f)); + + // line_ptr[x] = f32.f; + tinyexr::cpy4(line_ptr + x, &(f32.f)); + } + } + } else if (exr_header->requested_pixel_types[c] == + TINYEXR_PIXELTYPE_HALF) { + for (int y = 0; y < h; y++) { + // Assume increasing Y + unsigned short *line_ptr = reinterpret_cast( + &buf.at(static_cast(pixel_data_size * y * + exr_image->width) + + channel_offset_list[c] * + static_cast(exr_image->width))); + for (int x = 0; x < exr_image->width; x++) { + unsigned short val = reinterpret_cast( + exr_image->images)[c][(y + start_y) * exr_image->width + x]; + + tinyexr::swap2(&val); + + // line_ptr[x] = val; + tinyexr::cpy2(line_ptr + x, &val); + } + } + } else { + TEXR_ASSERT(0); + } + + } else if (exr_header->pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) { + if (exr_header->requested_pixel_types[c] == TINYEXR_PIXELTYPE_HALF) { + for (int y = 0; y < h; y++) { + // Assume increasing Y + unsigned short *line_ptr = reinterpret_cast( + &buf.at(static_cast(pixel_data_size * y * + exr_image->width) + + channel_offset_list[c] * + static_cast(exr_image->width))); + for (int x = 0; x < exr_image->width; x++) { + tinyexr::FP32 f32; + f32.f = reinterpret_cast( + exr_image->images)[c][(y + start_y) * exr_image->width + x]; + + tinyexr::FP16 h16; + h16 = float_to_half_full(f32); + + tinyexr::swap2(reinterpret_cast(&h16.u)); + + // line_ptr[x] = h16.u; + tinyexr::cpy2(line_ptr + x, &(h16.u)); + } + } + } else if (exr_header->requested_pixel_types[c] == + TINYEXR_PIXELTYPE_FLOAT) { + for (int y = 0; y < h; y++) { + // Assume increasing Y + float *line_ptr = reinterpret_cast(&buf.at( + static_cast(pixel_data_size * y * exr_image->width) + + channel_offset_list[c] * + static_cast(exr_image->width))); + for (int x = 0; x < exr_image->width; x++) { + float val = reinterpret_cast( + exr_image->images)[c][(y + start_y) * exr_image->width + x]; + + tinyexr::swap4(reinterpret_cast(&val)); + + // line_ptr[x] = val; + tinyexr::cpy4(line_ptr + x, &val); + } + } + } else { + TEXR_ASSERT(0); + } + } else if (exr_header->pixel_types[c] == TINYEXR_PIXELTYPE_UINT) { + for (int y = 0; y < h; y++) { + // Assume increasing Y + unsigned int *line_ptr = reinterpret_cast(&buf.at( + static_cast(pixel_data_size * y * exr_image->width) + + channel_offset_list[c] * static_cast(exr_image->width))); + for (int x = 0; x < exr_image->width; x++) { + unsigned int val = reinterpret_cast( + exr_image->images)[c][(y + start_y) * exr_image->width + x]; + + tinyexr::swap4(&val); + + // line_ptr[x] = val; + tinyexr::cpy4(line_ptr + x, &val); + } + } + } + } + + if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_NONE) { + // 4 byte: scan line + // 4 byte: data size + // ~ : pixel data(uncompressed) + std::vector header(8); + unsigned int data_len = static_cast(buf.size()); + memcpy(&header.at(0), &start_y, sizeof(int)); + memcpy(&header.at(4), &data_len, sizeof(unsigned int)); + + tinyexr::swap4(reinterpret_cast(&header.at(0))); + tinyexr::swap4(reinterpret_cast(&header.at(4))); + + data_list[ii].insert(data_list[ii].end(), header.begin(), header.end()); + data_list[ii].insert(data_list[ii].end(), buf.begin(), + buf.begin() + data_len); + + } else if ((exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZIPS) || + (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZIP)) { +#if TINYEXR_USE_MINIZ + std::vector block(tinyexr::miniz::mz_compressBound( + static_cast(buf.size()))); +#else + std::vector block( + compressBound(static_cast(buf.size()))); +#endif + tinyexr::tinyexr_uint64 outSize = block.size(); + + tinyexr::CompressZip(&block.at(0), outSize, + reinterpret_cast(&buf.at(0)), + static_cast(buf.size())); + + // 4 byte: scan line + // 4 byte: data size + // ~ : pixel data(compressed) + std::vector header(8); + unsigned int data_len = static_cast(outSize); // truncate + memcpy(&header.at(0), &start_y, sizeof(int)); + memcpy(&header.at(4), &data_len, sizeof(unsigned int)); + + tinyexr::swap4(reinterpret_cast(&header.at(0))); + tinyexr::swap4(reinterpret_cast(&header.at(4))); + + data_list[ii].insert(data_list[ii].end(), header.begin(), header.end()); + data_list[ii].insert(data_list[ii].end(), block.begin(), + block.begin() + data_len); + + } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_RLE) { + // (buf.size() * 3) / 2 would be enough. + std::vector block((buf.size() * 3) / 2); + + tinyexr::tinyexr_uint64 outSize = block.size(); + + tinyexr::CompressRle(&block.at(0), outSize, + reinterpret_cast(&buf.at(0)), + static_cast(buf.size())); + + // 4 byte: scan line + // 4 byte: data size + // ~ : pixel data(compressed) + std::vector header(8); + unsigned int data_len = static_cast(outSize); // truncate + memcpy(&header.at(0), &start_y, sizeof(int)); + memcpy(&header.at(4), &data_len, sizeof(unsigned int)); + + tinyexr::swap4(reinterpret_cast(&header.at(0))); + tinyexr::swap4(reinterpret_cast(&header.at(4))); + + data_list[ii].insert(data_list[ii].end(), header.begin(), header.end()); + data_list[ii].insert(data_list[ii].end(), block.begin(), + block.begin() + data_len); + + } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) { +#if TINYEXR_USE_PIZ + unsigned int bufLen = + 8192 + static_cast( + 2 * static_cast( + buf.size())); // @fixme { compute good bound. } + std::vector block(bufLen); + unsigned int outSize = static_cast(block.size()); + + CompressPiz(&block.at(0), &outSize, + reinterpret_cast(&buf.at(0)), + buf.size(), channels, exr_image->width, h); + + // 4 byte: scan line + // 4 byte: data size + // ~ : pixel data(compressed) + std::vector header(8); + unsigned int data_len = outSize; + memcpy(&header.at(0), &start_y, sizeof(int)); + memcpy(&header.at(4), &data_len, sizeof(unsigned int)); + + tinyexr::swap4(reinterpret_cast(&header.at(0))); + tinyexr::swap4(reinterpret_cast(&header.at(4))); + + data_list[ii].insert(data_list[ii].end(), header.begin(), header.end()); + data_list[ii].insert(data_list[ii].end(), block.begin(), + block.begin() + data_len); + +#else + TEXR_ASSERT(0); +#endif + } else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) { +#if TINYEXR_USE_ZFP + std::vector block; + unsigned int outSize; + + tinyexr::CompressZfp( + &block, &outSize, reinterpret_cast(&buf.at(0)), + exr_image->width, h, exr_header->num_channels, zfp_compression_param); + + // 4 byte: scan line + // 4 byte: data size + // ~ : pixel data(compressed) + std::vector header(8); + unsigned int data_len = outSize; + memcpy(&header.at(0), &start_y, sizeof(int)); + memcpy(&header.at(4), &data_len, sizeof(unsigned int)); + + tinyexr::swap4(reinterpret_cast(&header.at(0))); + tinyexr::swap4(reinterpret_cast(&header.at(4))); + + data_list[ii].insert(data_list[ii].end(), header.begin(), header.end()); + data_list[ii].insert(data_list[ii].end(), block.begin(), + block.begin() + data_len); + +#else + TEXR_ASSERT(0); +#endif + } else { + TEXR_ASSERT(0); + } + } // omp parallel + + for (size_t i = 0; i < static_cast(num_blocks); i++) { + offsets[i] = offset; + tinyexr::swap8(reinterpret_cast(&offsets[i])); + offset += data_list[i].size(); + } + + size_t totalSize = static_cast(offset); + { + memory.insert( + memory.end(), reinterpret_cast(&offsets.at(0)), + reinterpret_cast(&offsets.at(0)) + + sizeof(tinyexr::tinyexr_uint64) * static_cast(num_blocks)); + } + + if (memory.size() == 0) { + tinyexr::SetErrorMessage("Output memory size is zero", err); + return 0; + } + + (*memory_out) = static_cast(malloc(totalSize)); + memcpy((*memory_out), &memory.at(0), memory.size()); + unsigned char *memory_ptr = *memory_out + memory.size(); + + for (size_t i = 0; i < static_cast(num_blocks); i++) { + memcpy(memory_ptr, &data_list[i].at(0), data_list[i].size()); + memory_ptr += data_list[i].size(); + } + + return totalSize; // OK +} + +int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header, + const char *filename, const char **err) { + if (exr_image == NULL || filename == NULL || + exr_header->compression_type < 0) { + tinyexr::SetErrorMessage("Invalid argument for SaveEXRImageToFile", err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + +#if !TINYEXR_USE_PIZ + if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) { + tinyexr::SetErrorMessage("PIZ compression is not supported in this build", + err); + return TINYEXR_ERROR_UNSUPPORTED_FEATURE; + } +#endif + +#if !TINYEXR_USE_ZFP + if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) { + tinyexr::SetErrorMessage("ZFP compression is not supported in this build", + err); + return TINYEXR_ERROR_UNSUPPORTED_FEATURE; + } +#endif + +#ifdef _WIN32 + FILE *fp = NULL; + fopen_s(&fp, filename, "wb"); +#else + FILE *fp = fopen(filename, "wb"); +#endif + if (!fp) { + tinyexr::SetErrorMessage("Cannot write a file", err); + return TINYEXR_ERROR_CANT_WRITE_FILE; + } + + unsigned char *mem = NULL; + size_t mem_size = SaveEXRImageToMemory(exr_image, exr_header, &mem, err); + if (mem_size == 0) { + fclose(fp); + return TINYEXR_ERROR_SERIALZATION_FAILED; + } + + size_t written_size = 0; + if ((mem_size > 0) && mem) { + written_size = fwrite(mem, 1, mem_size, fp); + } + free(mem); + + fclose(fp); + + if (written_size != mem_size) { + tinyexr::SetErrorMessage("Cannot write a file", err); + return TINYEXR_ERROR_CANT_WRITE_FILE; + } + + return TINYEXR_SUCCESS; +} + +int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) { + if (deep_image == NULL) { + tinyexr::SetErrorMessage("Invalid argument for LoadDeepEXR", err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + +#ifdef _MSC_VER + FILE *fp = NULL; + errno_t errcode = fopen_s(&fp, filename, "rb"); + if ((0 != errcode) || (!fp)) { + tinyexr::SetErrorMessage("Cannot read a file " + std::string(filename), + err); + return TINYEXR_ERROR_CANT_OPEN_FILE; + } +#else + FILE *fp = fopen(filename, "rb"); + if (!fp) { + tinyexr::SetErrorMessage("Cannot read a file " + std::string(filename), + err); + return TINYEXR_ERROR_CANT_OPEN_FILE; + } +#endif + + size_t filesize; + // Compute size + fseek(fp, 0, SEEK_END); + filesize = static_cast(ftell(fp)); + fseek(fp, 0, SEEK_SET); + + if (filesize == 0) { + fclose(fp); + tinyexr::SetErrorMessage("File size is zero : " + std::string(filename), + err); + return TINYEXR_ERROR_INVALID_FILE; + } + + std::vector buf(filesize); // @todo { use mmap } + { + size_t ret; + ret = fread(&buf[0], 1, filesize, fp); + TEXR_ASSERT(ret == filesize); + (void)ret; + } + fclose(fp); + + const char *head = &buf[0]; + const char *marker = &buf[0]; + + // Header check. + { + const char header[] = {0x76, 0x2f, 0x31, 0x01}; + + if (memcmp(marker, header, 4) != 0) { + tinyexr::SetErrorMessage("Invalid magic number", err); + return TINYEXR_ERROR_INVALID_MAGIC_NUMBER; + } + marker += 4; + } + + // Version, scanline. + { + // ver 2.0, scanline, deep bit on(0x800) + // must be [2, 0, 0, 0] + if (marker[0] != 2 || marker[1] != 8 || marker[2] != 0 || marker[3] != 0) { + tinyexr::SetErrorMessage("Unsupported version or scanline", err); + return TINYEXR_ERROR_UNSUPPORTED_FORMAT; + } + + marker += 4; + } + + int dx = -1; + int dy = -1; + int dw = -1; + int dh = -1; + int num_scanline_blocks = 1; // 16 for ZIP compression. + int compression_type = -1; + int num_channels = -1; + std::vector channels; + + // Read attributes + size_t size = filesize - tinyexr::kEXRVersionSize; + for (;;) { + if (0 == size) { + return TINYEXR_ERROR_INVALID_DATA; + } else if (marker[0] == '\0') { + marker++; + size--; + break; + } + + std::string attr_name; + std::string attr_type; + std::vector data; + size_t marker_size; + if (!tinyexr::ReadAttribute(&attr_name, &attr_type, &data, &marker_size, + marker, size)) { + std::stringstream ss; + ss << "Failed to parse attribute\n"; + tinyexr::SetErrorMessage(ss.str(), err); + return TINYEXR_ERROR_INVALID_DATA; + } + marker += marker_size; + size -= marker_size; + + if (attr_name.compare("compression") == 0) { + compression_type = data[0]; + if (compression_type > TINYEXR_COMPRESSIONTYPE_PIZ) { + std::stringstream ss; + ss << "Unsupported compression type : " << compression_type; + tinyexr::SetErrorMessage(ss.str(), err); + return TINYEXR_ERROR_UNSUPPORTED_FORMAT; + } + + if (compression_type == TINYEXR_COMPRESSIONTYPE_ZIP) { + num_scanline_blocks = 16; + } + + } else if (attr_name.compare("channels") == 0) { + // name: zero-terminated string, from 1 to 255 bytes long + // pixel type: int, possible values are: UINT = 0 HALF = 1 FLOAT = 2 + // pLinear: unsigned char, possible values are 0 and 1 + // reserved: three chars, should be zero + // xSampling: int + // ySampling: int + + if (!tinyexr::ReadChannelInfo(channels, data)) { + tinyexr::SetErrorMessage("Failed to parse channel info", err); + return TINYEXR_ERROR_INVALID_DATA; + } + + num_channels = static_cast(channels.size()); + + if (num_channels < 1) { + tinyexr::SetErrorMessage("Invalid channels format", err); + return TINYEXR_ERROR_INVALID_DATA; + } + + } else if (attr_name.compare("dataWindow") == 0) { + memcpy(&dx, &data.at(0), sizeof(int)); + memcpy(&dy, &data.at(4), sizeof(int)); + memcpy(&dw, &data.at(8), sizeof(int)); + memcpy(&dh, &data.at(12), sizeof(int)); + tinyexr::swap4(reinterpret_cast(&dx)); + tinyexr::swap4(reinterpret_cast(&dy)); + tinyexr::swap4(reinterpret_cast(&dw)); + tinyexr::swap4(reinterpret_cast(&dh)); + + } else if (attr_name.compare("displayWindow") == 0) { + int x; + int y; + int w; + int h; + memcpy(&x, &data.at(0), sizeof(int)); + memcpy(&y, &data.at(4), sizeof(int)); + memcpy(&w, &data.at(8), sizeof(int)); + memcpy(&h, &data.at(12), sizeof(int)); + tinyexr::swap4(reinterpret_cast(&x)); + tinyexr::swap4(reinterpret_cast(&y)); + tinyexr::swap4(reinterpret_cast(&w)); + tinyexr::swap4(reinterpret_cast(&h)); + } + } + + TEXR_ASSERT(dx >= 0); + TEXR_ASSERT(dy >= 0); + TEXR_ASSERT(dw >= 0); + TEXR_ASSERT(dh >= 0); + TEXR_ASSERT(num_channels >= 1); + + int data_width = dw - dx + 1; + int data_height = dh - dy + 1; + + std::vector image( + static_cast(data_width * data_height * 4)); // 4 = RGBA + + // Read offset tables. + int num_blocks = data_height / num_scanline_blocks; + if (num_blocks * num_scanline_blocks < data_height) { + num_blocks++; + } + + std::vector offsets(static_cast(num_blocks)); + + for (size_t y = 0; y < static_cast(num_blocks); y++) { + tinyexr::tinyexr_int64 offset; + memcpy(&offset, marker, sizeof(tinyexr::tinyexr_int64)); + tinyexr::swap8(reinterpret_cast(&offset)); + marker += sizeof(tinyexr::tinyexr_int64); // = 8 + offsets[y] = offset; + } + +#if TINYEXR_USE_PIZ + if ((compression_type == TINYEXR_COMPRESSIONTYPE_NONE) || + (compression_type == TINYEXR_COMPRESSIONTYPE_RLE) || + (compression_type == TINYEXR_COMPRESSIONTYPE_ZIPS) || + (compression_type == TINYEXR_COMPRESSIONTYPE_ZIP) || + (compression_type == TINYEXR_COMPRESSIONTYPE_PIZ)) { +#else + if ((compression_type == TINYEXR_COMPRESSIONTYPE_NONE) || + (compression_type == TINYEXR_COMPRESSIONTYPE_RLE) || + (compression_type == TINYEXR_COMPRESSIONTYPE_ZIPS) || + (compression_type == TINYEXR_COMPRESSIONTYPE_ZIP)) { +#endif + // OK + } else { + tinyexr::SetErrorMessage("Unsupported compression format", err); + return TINYEXR_ERROR_UNSUPPORTED_FORMAT; + } + + deep_image->image = static_cast( + malloc(sizeof(float **) * static_cast(num_channels))); + for (int c = 0; c < num_channels; c++) { + deep_image->image[c] = static_cast( + malloc(sizeof(float *) * static_cast(data_height))); + for (int y = 0; y < data_height; y++) { + } + } + + deep_image->offset_table = static_cast( + malloc(sizeof(int *) * static_cast(data_height))); + for (int y = 0; y < data_height; y++) { + deep_image->offset_table[y] = static_cast( + malloc(sizeof(int) * static_cast(data_width))); + } + + for (size_t y = 0; y < static_cast(num_blocks); y++) { + const unsigned char *data_ptr = + reinterpret_cast(head + offsets[y]); + + // int: y coordinate + // int64: packed size of pixel offset table + // int64: packed size of sample data + // int64: unpacked size of sample data + // compressed pixel offset table + // compressed sample data + int line_no; + tinyexr::tinyexr_int64 packedOffsetTableSize; + tinyexr::tinyexr_int64 packedSampleDataSize; + tinyexr::tinyexr_int64 unpackedSampleDataSize; + memcpy(&line_no, data_ptr, sizeof(int)); + memcpy(&packedOffsetTableSize, data_ptr + 4, + sizeof(tinyexr::tinyexr_int64)); + memcpy(&packedSampleDataSize, data_ptr + 12, + sizeof(tinyexr::tinyexr_int64)); + memcpy(&unpackedSampleDataSize, data_ptr + 20, + sizeof(tinyexr::tinyexr_int64)); + + tinyexr::swap4(reinterpret_cast(&line_no)); + tinyexr::swap8( + reinterpret_cast(&packedOffsetTableSize)); + tinyexr::swap8( + reinterpret_cast(&packedSampleDataSize)); + tinyexr::swap8( + reinterpret_cast(&unpackedSampleDataSize)); + + std::vector pixelOffsetTable(static_cast(data_width)); + + // decode pixel offset table. + { + unsigned long dstLen = + static_cast(pixelOffsetTable.size() * sizeof(int)); + if (!tinyexr::DecompressZip( + reinterpret_cast(&pixelOffsetTable.at(0)), + &dstLen, data_ptr + 28, + static_cast(packedOffsetTableSize))) { + return false; + } + + TEXR_ASSERT(dstLen == pixelOffsetTable.size() * sizeof(int)); + for (size_t i = 0; i < static_cast(data_width); i++) { + deep_image->offset_table[y][i] = pixelOffsetTable[i]; + } + } + + std::vector sample_data( + static_cast(unpackedSampleDataSize)); + + // decode sample data. + { + unsigned long dstLen = static_cast(unpackedSampleDataSize); + if (dstLen) { + if (!tinyexr::DecompressZip( + reinterpret_cast(&sample_data.at(0)), &dstLen, + data_ptr + 28 + packedOffsetTableSize, + static_cast(packedSampleDataSize))) { + return false; + } + TEXR_ASSERT(dstLen == static_cast(unpackedSampleDataSize)); + } + } + + // decode sample + int sampleSize = -1; + std::vector channel_offset_list(static_cast(num_channels)); + { + int channel_offset = 0; + for (size_t i = 0; i < static_cast(num_channels); i++) { + channel_offset_list[i] = channel_offset; + if (channels[i].pixel_type == TINYEXR_PIXELTYPE_UINT) { // UINT + channel_offset += 4; + } else if (channels[i].pixel_type == TINYEXR_PIXELTYPE_HALF) { // half + channel_offset += 2; + } else if (channels[i].pixel_type == + TINYEXR_PIXELTYPE_FLOAT) { // float + channel_offset += 4; + } else { + TEXR_ASSERT(0); + } + } + sampleSize = channel_offset; + } + TEXR_ASSERT(sampleSize >= 2); + + TEXR_ASSERT(static_cast( + pixelOffsetTable[static_cast(data_width - 1)] * + sampleSize) == sample_data.size()); + int samples_per_line = static_cast(sample_data.size()) / sampleSize; + + // + // Alloc memory + // + + // + // pixel data is stored as image[channels][pixel_samples] + // + { + tinyexr::tinyexr_uint64 data_offset = 0; + for (size_t c = 0; c < static_cast(num_channels); c++) { + deep_image->image[c][y] = static_cast( + malloc(sizeof(float) * static_cast(samples_per_line))); + + if (channels[c].pixel_type == 0) { // UINT + for (size_t x = 0; x < static_cast(samples_per_line); x++) { + unsigned int ui; + unsigned int *src_ptr = reinterpret_cast( + &sample_data.at(size_t(data_offset) + x * sizeof(int))); + tinyexr::cpy4(&ui, src_ptr); + deep_image->image[c][y][x] = static_cast(ui); // @fixme + } + data_offset += + sizeof(unsigned int) * static_cast(samples_per_line); + } else if (channels[c].pixel_type == 1) { // half + for (size_t x = 0; x < static_cast(samples_per_line); x++) { + tinyexr::FP16 f16; + const unsigned short *src_ptr = reinterpret_cast( + &sample_data.at(size_t(data_offset) + x * sizeof(short))); + tinyexr::cpy2(&(f16.u), src_ptr); + tinyexr::FP32 f32 = half_to_float(f16); + deep_image->image[c][y][x] = f32.f; + } + data_offset += sizeof(short) * static_cast(samples_per_line); + } else { // float + for (size_t x = 0; x < static_cast(samples_per_line); x++) { + float f; + const float *src_ptr = reinterpret_cast( + &sample_data.at(size_t(data_offset) + x * sizeof(float))); + tinyexr::cpy4(&f, src_ptr); + deep_image->image[c][y][x] = f; + } + data_offset += sizeof(float) * static_cast(samples_per_line); + } + } + } + } // y + + deep_image->width = data_width; + deep_image->height = data_height; + + deep_image->channel_names = static_cast( + malloc(sizeof(const char *) * static_cast(num_channels))); + for (size_t c = 0; c < static_cast(num_channels); c++) { +#ifdef _WIN32 + deep_image->channel_names[c] = _strdup(channels[c].name.c_str()); +#else + deep_image->channel_names[c] = strdup(channels[c].name.c_str()); +#endif + } + deep_image->num_channels = num_channels; + + return TINYEXR_SUCCESS; +} + +void InitEXRImage(EXRImage *exr_image) { + if (exr_image == NULL) { + return; + } + + exr_image->width = 0; + exr_image->height = 0; + exr_image->num_channels = 0; + + exr_image->images = NULL; + exr_image->tiles = NULL; + + exr_image->num_tiles = 0; +} + +void FreeEXRErrorMessage(const char *msg) { + if (msg) { + free(reinterpret_cast(const_cast(msg))); + } + return; +} + +void InitEXRHeader(EXRHeader *exr_header) { + if (exr_header == NULL) { + return; + } + + memset(exr_header, 0, sizeof(EXRHeader)); +} + +int FreeEXRHeader(EXRHeader *exr_header) { + if (exr_header == NULL) { + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + if (exr_header->channels) { + free(exr_header->channels); + } + + if (exr_header->pixel_types) { + free(exr_header->pixel_types); + } + + if (exr_header->requested_pixel_types) { + free(exr_header->requested_pixel_types); + } + + for (int i = 0; i < exr_header->num_custom_attributes; i++) { + if (exr_header->custom_attributes[i].value) { + free(exr_header->custom_attributes[i].value); + } + } + + if (exr_header->custom_attributes) { + free(exr_header->custom_attributes); + } + + return TINYEXR_SUCCESS; +} + +int FreeEXRImage(EXRImage *exr_image) { + if (exr_image == NULL) { + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + for (int i = 0; i < exr_image->num_channels; i++) { + if (exr_image->images && exr_image->images[i]) { + free(exr_image->images[i]); + } + } + + if (exr_image->images) { + free(exr_image->images); + } + + if (exr_image->tiles) { + for (int tid = 0; tid < exr_image->num_tiles; tid++) { + for (int i = 0; i < exr_image->num_channels; i++) { + if (exr_image->tiles[tid].images && exr_image->tiles[tid].images[i]) { + free(exr_image->tiles[tid].images[i]); + } + } + if (exr_image->tiles[tid].images) { + free(exr_image->tiles[tid].images); + } + } + free(exr_image->tiles); + } + + return TINYEXR_SUCCESS; +} + +int ParseEXRHeaderFromFile(EXRHeader *exr_header, const EXRVersion *exr_version, + const char *filename, const char **err) { + if (exr_header == NULL || exr_version == NULL || filename == NULL) { + tinyexr::SetErrorMessage("Invalid argument for ParseEXRHeaderFromFile", + err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + +#ifdef _WIN32 + FILE *fp = NULL; + fopen_s(&fp, filename, "rb"); +#else + FILE *fp = fopen(filename, "rb"); +#endif + if (!fp) { + tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err); + return TINYEXR_ERROR_CANT_OPEN_FILE; + } + + size_t filesize; + // Compute size + fseek(fp, 0, SEEK_END); + filesize = static_cast(ftell(fp)); + fseek(fp, 0, SEEK_SET); + + std::vector buf(filesize); // @todo { use mmap } + { + size_t ret; + ret = fread(&buf[0], 1, filesize, fp); + TEXR_ASSERT(ret == filesize); + fclose(fp); + + if (ret != filesize) { + tinyexr::SetErrorMessage("fread() error on " + std::string(filename), + err); + return TINYEXR_ERROR_INVALID_FILE; + } + } + + return ParseEXRHeaderFromMemory(exr_header, exr_version, &buf.at(0), filesize, + err); +} + +int ParseEXRMultipartHeaderFromMemory(EXRHeader ***exr_headers, + int *num_headers, + const EXRVersion *exr_version, + const unsigned char *memory, size_t size, + const char **err) { + if (memory == NULL || exr_headers == NULL || num_headers == NULL || + exr_version == NULL) { + // Invalid argument + tinyexr::SetErrorMessage( + "Invalid argument for ParseEXRMultipartHeaderFromMemory", err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + if (size < tinyexr::kEXRVersionSize) { + tinyexr::SetErrorMessage("Data size too short", err); + return TINYEXR_ERROR_INVALID_DATA; + } + + const unsigned char *marker = memory + tinyexr::kEXRVersionSize; + size_t marker_size = size - tinyexr::kEXRVersionSize; + + std::vector infos; + + for (;;) { + tinyexr::HeaderInfo info; + info.clear(); + + std::string err_str; + bool empty_header = false; + int ret = ParseEXRHeader(&info, &empty_header, exr_version, &err_str, + marker, marker_size); + + if (ret != TINYEXR_SUCCESS) { + tinyexr::SetErrorMessage(err_str, err); + return ret; + } + + if (empty_header) { + marker += 1; // skip '\0' + break; + } + + // `chunkCount` must exist in the header. + if (info.chunk_count == 0) { + tinyexr::SetErrorMessage( + "`chunkCount' attribute is not found in the header.", err); + return TINYEXR_ERROR_INVALID_DATA; + } + + infos.push_back(info); + + // move to next header. + marker += info.header_len; + size -= info.header_len; + } + + // allocate memory for EXRHeader and create array of EXRHeader pointers. + (*exr_headers) = + static_cast(malloc(sizeof(EXRHeader *) * infos.size())); + for (size_t i = 0; i < infos.size(); i++) { + EXRHeader *exr_header = static_cast(malloc(sizeof(EXRHeader))); + + ConvertHeader(exr_header, infos[i]); + + // transfoer `tiled` from version. + exr_header->tiled = exr_version->tiled; + + (*exr_headers)[i] = exr_header; + } + + (*num_headers) = static_cast(infos.size()); + + return TINYEXR_SUCCESS; +} + +int ParseEXRMultipartHeaderFromFile(EXRHeader ***exr_headers, int *num_headers, + const EXRVersion *exr_version, + const char *filename, const char **err) { + if (exr_headers == NULL || num_headers == NULL || exr_version == NULL || + filename == NULL) { + tinyexr::SetErrorMessage( + "Invalid argument for ParseEXRMultipartHeaderFromFile()", err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + +#ifdef _WIN32 + FILE *fp = NULL; + fopen_s(&fp, filename, "rb"); +#else + FILE *fp = fopen(filename, "rb"); +#endif + if (!fp) { + tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err); + return TINYEXR_ERROR_CANT_OPEN_FILE; + } + + size_t filesize; + // Compute size + fseek(fp, 0, SEEK_END); + filesize = static_cast(ftell(fp)); + fseek(fp, 0, SEEK_SET); + + std::vector buf(filesize); // @todo { use mmap } + { + size_t ret; + ret = fread(&buf[0], 1, filesize, fp); + TEXR_ASSERT(ret == filesize); + fclose(fp); + + if (ret != filesize) { + tinyexr::SetErrorMessage("`fread' error. file may be corrupted.", err); + return TINYEXR_ERROR_INVALID_FILE; + } + } + + return ParseEXRMultipartHeaderFromMemory( + exr_headers, num_headers, exr_version, &buf.at(0), filesize, err); +} + +int ParseEXRVersionFromMemory(EXRVersion *version, const unsigned char *memory, + size_t size) { + if (version == NULL || memory == NULL) { + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + if (size < tinyexr::kEXRVersionSize) { + return TINYEXR_ERROR_INVALID_DATA; + } + + const unsigned char *marker = memory; + + // Header check. + { + const char header[] = {0x76, 0x2f, 0x31, 0x01}; + + if (memcmp(marker, header, 4) != 0) { + return TINYEXR_ERROR_INVALID_MAGIC_NUMBER; + } + marker += 4; + } + + version->tiled = false; + version->long_name = false; + version->non_image = false; + version->multipart = false; + + // Parse version header. + { + // must be 2 + if (marker[0] != 2) { + return TINYEXR_ERROR_INVALID_EXR_VERSION; + } + + version->version = 2; + + if (marker[1] & 0x2) { // 9th bit + version->tiled = true; + } + if (marker[1] & 0x4) { // 10th bit + version->long_name = true; + } + if (marker[1] & 0x8) { // 11th bit + version->non_image = true; // (deep image) + } + if (marker[1] & 0x10) { // 12th bit + version->multipart = true; + } + } + + return TINYEXR_SUCCESS; +} + +int ParseEXRVersionFromFile(EXRVersion *version, const char *filename) { + if (filename == NULL) { + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + +#ifdef _WIN32 + FILE *fp = NULL; + fopen_s(&fp, filename, "rb"); +#else + FILE *fp = fopen(filename, "rb"); +#endif + if (!fp) { + return TINYEXR_ERROR_CANT_OPEN_FILE; + } + + size_t file_size; + // Compute size + fseek(fp, 0, SEEK_END); + file_size = static_cast(ftell(fp)); + fseek(fp, 0, SEEK_SET); + + if (file_size < tinyexr::kEXRVersionSize) { + fclose(fp); + return TINYEXR_ERROR_INVALID_FILE; + } + + unsigned char buf[tinyexr::kEXRVersionSize]; + size_t ret = fread(&buf[0], 1, tinyexr::kEXRVersionSize, fp); + fclose(fp); + + if (ret != tinyexr::kEXRVersionSize) { + return TINYEXR_ERROR_INVALID_FILE; + } + + return ParseEXRVersionFromMemory(version, buf, tinyexr::kEXRVersionSize); +} + +int LoadEXRMultipartImageFromMemory(EXRImage *exr_images, + const EXRHeader **exr_headers, + unsigned int num_parts, + const unsigned char *memory, + const size_t size, const char **err) { + if (exr_images == NULL || exr_headers == NULL || num_parts == 0 || + memory == NULL || (size <= tinyexr::kEXRVersionSize)) { + tinyexr::SetErrorMessage( + "Invalid argument for LoadEXRMultipartImageFromMemory()", err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + // compute total header size. + size_t total_header_size = 0; + for (unsigned int i = 0; i < num_parts; i++) { + if (exr_headers[i]->header_len == 0) { + tinyexr::SetErrorMessage("EXRHeader variable is not initialized.", err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + total_header_size += exr_headers[i]->header_len; + } + + const char *marker = reinterpret_cast( + memory + total_header_size + 4 + + 4); // +8 for magic number and version header. + + marker += 1; // Skip empty header. + + // NOTE 1: + // In multipart image, There is 'part number' before chunk data. + // 4 byte : part number + // 4+ : chunk + // + // NOTE 2: + // EXR spec says 'part number' is 'unsigned long' but actually this is + // 'unsigned int(4 bytes)' in OpenEXR implementation... + // http://www.openexr.com/openexrfilelayout.pdf + + // Load chunk offset table. + std::vector > chunk_offset_table_list; + for (size_t i = 0; i < static_cast(num_parts); i++) { + std::vector offset_table( + static_cast(exr_headers[i]->chunk_count)); + + for (size_t c = 0; c < offset_table.size(); c++) { + tinyexr::tinyexr_uint64 offset; + memcpy(&offset, marker, 8); + tinyexr::swap8(&offset); + + if (offset >= size) { + tinyexr::SetErrorMessage("Invalid offset size in EXR header chunks.", + err); + return TINYEXR_ERROR_INVALID_DATA; + } + + offset_table[c] = offset + 4; // +4 to skip 'part number' + marker += 8; + } + + chunk_offset_table_list.push_back(offset_table); + } + + // Decode image. + for (size_t i = 0; i < static_cast(num_parts); i++) { + std::vector &offset_table = + chunk_offset_table_list[i]; + + // First check 'part number' is identitical to 'i' + for (size_t c = 0; c < offset_table.size(); c++) { + const unsigned char *part_number_addr = + memory + offset_table[c] - 4; // -4 to move to 'part number' field. + unsigned int part_no; + memcpy(&part_no, part_number_addr, sizeof(unsigned int)); // 4 + tinyexr::swap4(&part_no); + + if (part_no != i) { + tinyexr::SetErrorMessage("Invalid `part number' in EXR header chunks.", + err); + return TINYEXR_ERROR_INVALID_DATA; + } + } + + std::string e; + int ret = tinyexr::DecodeChunk(&exr_images[i], exr_headers[i], offset_table, + memory, size, &e); + if (ret != TINYEXR_SUCCESS) { + if (!e.empty()) { + tinyexr::SetErrorMessage(e, err); + } + return ret; + } + } + + return TINYEXR_SUCCESS; +} + +int LoadEXRMultipartImageFromFile(EXRImage *exr_images, + const EXRHeader **exr_headers, + unsigned int num_parts, const char *filename, + const char **err) { + if (exr_images == NULL || exr_headers == NULL || num_parts == 0) { + tinyexr::SetErrorMessage( + "Invalid argument for LoadEXRMultipartImageFromFile", err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + +#ifdef _WIN32 + FILE *fp = NULL; + fopen_s(&fp, filename, "rb"); +#else + FILE *fp = fopen(filename, "rb"); +#endif + if (!fp) { + tinyexr::SetErrorMessage("Cannot read file " + std::string(filename), err); + return TINYEXR_ERROR_CANT_OPEN_FILE; + } + + size_t filesize; + // Compute size + fseek(fp, 0, SEEK_END); + filesize = static_cast(ftell(fp)); + fseek(fp, 0, SEEK_SET); + + std::vector buf(filesize); // @todo { use mmap } + { + size_t ret; + ret = fread(&buf[0], 1, filesize, fp); + TEXR_ASSERT(ret == filesize); + fclose(fp); + (void)ret; + } + + return LoadEXRMultipartImageFromMemory(exr_images, exr_headers, num_parts, + &buf.at(0), filesize, err); +} + +int SaveEXR(const float *data, int width, int height, int components, + const int save_as_fp16, const char *outfilename, const char **err) { + if ((components == 1) || components == 3 || components == 4) { + // OK + } else { + std::stringstream ss; + ss << "Unsupported component value : " << components << std::endl; + + tinyexr::SetErrorMessage(ss.str(), err); + return TINYEXR_ERROR_INVALID_ARGUMENT; + } + + EXRHeader header; + InitEXRHeader(&header); + + if ((width < 16) && (height < 16)) { + // No compression for small image. + header.compression_type = TINYEXR_COMPRESSIONTYPE_NONE; + } else { + header.compression_type = TINYEXR_COMPRESSIONTYPE_ZIP; + } + + EXRImage image; + InitEXRImage(&image); + + image.num_channels = components; + + std::vector images[4]; + + if (components == 1) { + images[0].resize(static_cast(width * height)); + memcpy(images[0].data(), data, sizeof(float) * size_t(width * height)); + } else { + images[0].resize(static_cast(width * height)); + images[1].resize(static_cast(width * height)); + images[2].resize(static_cast(width * height)); + images[3].resize(static_cast(width * height)); + + // Split RGB(A)RGB(A)RGB(A)... into R, G and B(and A) layers + for (size_t i = 0; i < static_cast(width * height); i++) { + images[0][i] = data[static_cast(components) * i + 0]; + images[1][i] = data[static_cast(components) * i + 1]; + images[2][i] = data[static_cast(components) * i + 2]; + if (components == 4) { + images[3][i] = data[static_cast(components) * i + 3]; + } + } + } + + float *image_ptr[4] = {0, 0, 0, 0}; + if (components == 4) { + image_ptr[0] = &(images[3].at(0)); // A + image_ptr[1] = &(images[2].at(0)); // B + image_ptr[2] = &(images[1].at(0)); // G + image_ptr[3] = &(images[0].at(0)); // R + } else if (components == 3) { + image_ptr[0] = &(images[2].at(0)); // B + image_ptr[1] = &(images[1].at(0)); // G + image_ptr[2] = &(images[0].at(0)); // R + } else if (components == 1) { + image_ptr[0] = &(images[0].at(0)); // A + } + + image.images = reinterpret_cast(image_ptr); + image.width = width; + image.height = height; + + header.num_channels = components; + header.channels = static_cast(malloc( + sizeof(EXRChannelInfo) * static_cast(header.num_channels))); + // Must be (A)BGR order, since most of EXR viewers expect this channel order. + if (components == 4) { +#ifdef _MSC_VER + strncpy_s(header.channels[0].name, "A", 255); + strncpy_s(header.channels[1].name, "B", 255); + strncpy_s(header.channels[2].name, "G", 255); + strncpy_s(header.channels[3].name, "R", 255); +#else + strncpy(header.channels[0].name, "A", 255); + strncpy(header.channels[1].name, "B", 255); + strncpy(header.channels[2].name, "G", 255); + strncpy(header.channels[3].name, "R", 255); +#endif + header.channels[0].name[strlen("A")] = '\0'; + header.channels[1].name[strlen("B")] = '\0'; + header.channels[2].name[strlen("G")] = '\0'; + header.channels[3].name[strlen("R")] = '\0'; + } else if (components == 3) { +#ifdef _MSC_VER + strncpy_s(header.channels[0].name, "B", 255); + strncpy_s(header.channels[1].name, "G", 255); + strncpy_s(header.channels[2].name, "R", 255); +#else + strncpy(header.channels[0].name, "B", 255); + strncpy(header.channels[1].name, "G", 255); + strncpy(header.channels[2].name, "R", 255); +#endif + header.channels[0].name[strlen("B")] = '\0'; + header.channels[1].name[strlen("G")] = '\0'; + header.channels[2].name[strlen("R")] = '\0'; + } else { +#ifdef _MSC_VER + strncpy_s(header.channels[0].name, "A", 255); +#else + strncpy(header.channels[0].name, "A", 255); +#endif + header.channels[0].name[strlen("A")] = '\0'; + } + + header.pixel_types = static_cast( + malloc(sizeof(int) * static_cast(header.num_channels))); + header.requested_pixel_types = static_cast( + malloc(sizeof(int) * static_cast(header.num_channels))); + for (int i = 0; i < header.num_channels; i++) { + header.pixel_types[i] = + TINYEXR_PIXELTYPE_FLOAT; // pixel type of input image + + if (save_as_fp16 > 0) { + header.requested_pixel_types[i] = + TINYEXR_PIXELTYPE_HALF; // save with half(fp16) pixel format + } else { + header.requested_pixel_types[i] = + TINYEXR_PIXELTYPE_FLOAT; // save with float(fp32) pixel format(i.e. + // no precision reduction) + } + } + + int ret = SaveEXRImageToFile(&image, &header, outfilename, err); + if (ret != TINYEXR_SUCCESS) { + return ret; + } + + free(header.channels); + free(header.pixel_types); + free(header.requested_pixel_types); + + return ret; +} + +#ifdef __clang__ +// zero-as-null-ppinter-constant +#pragma clang diagnostic pop +#endif + +#endif // TINYEXR_IMPLEMENTATION_DEIFNED +#endif // TINYEXR_IMPLEMENTATION diff --git a/ktx/external/astc-encoder/Source/UnitTest/CMakeLists.txt b/ktx/external/astc-encoder/Source/UnitTest/CMakeLists.txt new file mode 100644 index 0000000..9e41356 --- /dev/null +++ b/ktx/external/astc-encoder/Source/UnitTest/CMakeLists.txt @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: Apache-2.0 +# ---------------------------------------------------------------------------- +# Copyright 2020-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. +# ---------------------------------------------------------------------------- + +set(ASTCENC_ARTIFACTS native none sve_256 sve_128 neon avx2 sse4.1 sse2) +set(ASTCENC_CONFIGS ${ASTCENC_ISA_NATIVE} ${ASTCENC_ISA_NONE} ${ASTCENC_ISA_SVE_256} ${ASTCENC_ISA_SVE_128} ${ASTCENC_ISA_NEON} ${ASTCENC_ISA_AVX2} ${ASTCENC_ISA_SSE41} ${ASTCENC_ISA_SSE2}) +list(LENGTH ASTCENC_ARTIFACTS ASTCENC_ARTIFACTS_LEN) +math(EXPR ASTCENC_ARTIFACTS_LEN "${ASTCENC_ARTIFACTS_LEN} - 1") + +foreach(INDEX RANGE ${ASTCENC_ARTIFACTS_LEN}) + list(GET ASTCENC_ARTIFACTS ${INDEX} ASTCENC_ARTIFACT) + list(GET ASTCENC_CONFIGS ${INDEX} ASTCENC_CONFIG) + if(${ASTCENC_CONFIG}) + set(ASTCENC_ISA_SIMD ${ASTCENC_ARTIFACT}) + + if(${ASTCENC_ISA_SIMD} MATCHES "sve_256") + # Not supported on macOS + elseif(${ASTCENC_ISA_SIMD} MATCHES "sve_128") + # Not supported on macOS + elseif(${ASTCENC_ISA_SIMD} MATCHES "neon") + set(CMAKE_OSX_ARCHITECTURES arm64) + elseif(${ASTCENC_ISA_SIMD} MATCHES "sse2") + set(CMAKE_OSX_ARCHITECTURES x86_64) + elseif(${ASTCENC_ISA_SIMD} MATCHES "sse4.1") + set(CMAKE_OSX_ARCHITECTURES x86_64) + elseif(${ASTCENC_ISA_SIMD} MATCHES "avx2") + set(CMAKE_OSX_ARCHITECTURES x86_64h) + elseif(${ASTCENC_ISA_SIMD} MATCHES "none") + # Using "none" uses implicit architecture + elseif(${ASTCENC_ISA_SIMD} MATCHES "native") + # Using "native" uses implicit architecture + else() + message(FATAL_ERROR "'${ASTCENC_ISA_SIMD}' is unknown ISA") + endif() + + include(cmake_core.cmake) + endif() +endforeach() diff --git a/ktx/external/astc-encoder/Source/UnitTest/cmake_core.cmake b/ktx/external/astc-encoder/Source/UnitTest/cmake_core.cmake new file mode 100644 index 0000000..a467354 --- /dev/null +++ b/ktx/external/astc-encoder/Source/UnitTest/cmake_core.cmake @@ -0,0 +1,198 @@ +# SPDX-License-Identifier: Apache-2.0 +# ---------------------------------------------------------------------------- +# Copyright 2020-2025 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. +# ---------------------------------------------------------------------------- + +include(../cmake_compiler.cmake) + +set(ASTCENC_TEST test-unit-${ASTCENC_ISA_SIMD}) + +add_executable(${ASTCENC_TEST}) + +set_property(TARGET ${ASTCENC_TEST} + PROPERTY + CXX_STANDARD 17) + +# Enable LTO under the conditions where the codec library will use LTO. +# The library link will fail if the settings don't match +if(${ASTCENC_CLI}) + set_property(TARGET ${ASTCENC_TEST} + PROPERTY + INTERPROCEDURAL_OPTIMIZATION_RELEASE True) +endif() + +# Use a static runtime on MSVC builds (ignored on non-MSVC compilers) +set_property(TARGET ${ASTCENC_TEST} + PROPERTY + MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + + +target_sources(${ASTCENC_TEST} + PRIVATE + test_simd.cpp + test_softfloat.cpp + test_decode.cpp) + +target_include_directories(${ASTCENC_TEST} + PRIVATE + ${gtest_SOURCE_DIR}/include) + +target_link_libraries(${ASTCENC_TEST} + PRIVATE + astcenc-${ASTCENC_ISA_SIMD}-static) + +target_compile_options(${ASTCENC_TEST} + PRIVATE + # Use pthreads on Linux/macOS + $<$:-pthread> + + # MSVC compiler defines + $<${is_msvc_fe}:/EHsc> + $<$,${is_msvc_fe}>:/WX> + $<${is_msvccl}:/wd4324> + + # G++ and Clang++ compiler defines + $<${is_gnu_fe}:-Wall> + $<${is_gnu_fe}:-Wextra> + $<${is_gnu_fe}:-Wpedantic> + $<$,${is_gnu_fe}>:-Werror> + $<${is_gnu_fe}:-Wshadow> + $<${is_gnu_fe}:-Wdouble-promotion> + $<${is_clang}:-Wdocumentation> + + # Hide noise thrown up by Clang 10 and clang-cl + $<${is_gnu_fe}:-Wno-unknown-warning-option> + $<${is_gnu_fe}:-Wno-c++98-compat-pedantic> + $<${is_gnu_fe}:-Wno-c++98-c++11-compat-pedantic> + $<${is_gnu_fe}:-Wno-float-equal> + $<${is_gnu_fe}:-Wno-overriding-option> + $<${is_gnu_fe}:-Wno-unsafe-buffer-usage> + $<${is_clang}:-Wno-switch-default> + + # Ignore things that the googletest build triggers + $<${is_gnu_fe}:-Wno-unknown-warning-option> + $<${is_gnu_fe}:-Wno-double-promotion> + $<${is_gnu_fe}:-Wno-undef> + $<${is_gnu_fe}:-Wno-reserved-identifier> + $<${is_gnu_fe}:-Wno-global-constructors>) + +# Set up configuration for SIMD ISA builds +if(${ASTCENC_ISA_SIMD} MATCHES "none") + target_compile_definitions(${ASTCENC_TEST} + PRIVATE + ASTCENC_NEON=0 + ASTCENC_SVE=0 + ASTCENC_SSE=0 + ASTCENC_AVX=0 + ASTCENC_POPCNT=0 + ASTCENC_F16C=0) + + if(${ASTCENC_BIG_ENDIAN}) + target_compile_definitions(${ASTCENC_TEST} + PRIVATE + ASTCENC_BIG_ENDIAN=1) + endif() + +elseif(${ASTCENC_ISA_SIMD} MATCHES "neon") + target_compile_definitions(${ASTCENC_TEST} + PRIVATE + ASTCENC_NEON=1 + ASTCENC_SVE=0 + ASTCENC_SSE=0 + ASTCENC_AVX=0 + ASTCENC_POPCNT=0 + ASTCENC_F16C=0) + +elseif(${ASTCENC_ISA_SIMD} MATCHES "sve_256") + target_compile_definitions(${ASTCENC_TEST} + PRIVATE + ASTCENC_NEON=1 + ASTCENC_SVE=8 + ASTCENC_SSE=0 + ASTCENC_AVX=0 + ASTCENC_POPCNT=0 + ASTCENC_F16C=0) + + # Enable SVE + target_compile_options(${ASTCENC_TEST} + PRIVATE + -march=armv8-a+sve -msve-vector-bits=256) + +elseif(${ASTCENC_ISA_SIMD} MATCHES "sve_128") + target_compile_definitions(${ASTCENC_TEST} + PRIVATE + ASTCENC_NEON=1 + ASTCENC_SVE=4 + ASTCENC_SSE=0 + ASTCENC_AVX=0 + ASTCENC_POPCNT=0 + ASTCENC_F16C=0) + + # Enable SVE + target_compile_options(${ASTCENC_TEST} + PRIVATE + -march=armv8-a+sve) + +elseif(${ASTCENC_ISA_SIMD} MATCHES "sse2") + target_compile_definitions(${ASTCENC_TEST} + PRIVATE + ASTCENC_NEON=0 + ASTCENC_SVE=0 + ASTCENC_SSE=20 + ASTCENC_AVX=0 + ASTCENC_POPCNT=0 + ASTCENC_F16C=0) + + target_compile_options(${ASTCENC_TEST} + PRIVATE + $<$:-msse2>) + +elseif(${ASTCENC_ISA_SIMD} MATCHES "sse4.1") + target_compile_definitions(${ASTCENC_TEST} + PRIVATE + ASTCENC_NEON=0 + ASTCENC_SVE=0 + ASTCENC_SSE=41 + ASTCENC_AVX=0 + ASTCENC_POPCNT=1 + ASTCENC_F16C=0) + + target_compile_options(${ASTCENC_TEST} + PRIVATE + $<$>:-msse4.1 -mpopcnt>) + +elseif(${ASTCENC_ISA_SIMD} MATCHES "avx2") + target_compile_definitions(${ASTCENC_TEST} + PRIVATE + ASTCENC_NEON=0 + ASTCENC_SVE=0 + ASTCENC_SSE=41 + ASTCENC_AVX=2 + ASTCENC_POPCNT=1 + ASTCENC_F16C=1) + + target_compile_options(${ASTCENC_TEST} + PRIVATE + $<$>:-mavx2 -mpopcnt -mf16c> + $<$:/arch:AVX2>) + +endif() + +target_link_libraries(${ASTCENC_TEST} + PRIVATE + gtest_main) + +add_test(NAME ${ASTCENC_TEST} + COMMAND ${ASTCENC_TEST}) diff --git a/ktx/external/astc-encoder/Source/UnitTest/test_decode.cpp b/ktx/external/astc-encoder/Source/UnitTest/test_decode.cpp new file mode 100644 index 0000000..923c412 --- /dev/null +++ b/ktx/external/astc-encoder/Source/UnitTest/test_decode.cpp @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2023 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Unit tests for the vectorized SIMD functionality. + */ + +#include + +#include "gtest/gtest.h" + +#include "../astcenc.h" + +namespace astcenc +{ + +/** @brief Test harness for exploring issue #447. */ +TEST(decode, decode12x12) +{ + astcenc_error status; + astcenc_config config; + astcenc_context* context; + + static const astcenc_swizzle swizzle { + ASTCENC_SWZ_R, ASTCENC_SWZ_G, ASTCENC_SWZ_B, ASTCENC_SWZ_A + }; + + uint8_t data[16] { +#if 0 + 0x84,0x00,0x38,0xC8,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xB3,0x4D,0x78 +#else + 0x29,0x00,0x1A,0x97,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xCF,0x97,0x86 +#endif + }; + + uint8_t output[12*12*4]; + astcenc_config_init(ASTCENC_PRF_LDR, 12, 12, 1, ASTCENC_PRE_MEDIUM, 0, &config); + + status = astcenc_context_alloc(&config, 1, &context); + EXPECT_EQ(status, ASTCENC_SUCCESS); + + astcenc_image image; + image.dim_x = 12; + image.dim_y = 12; + image.dim_z = 1; + image.data_type = ASTCENC_TYPE_U8; + uint8_t* slices = output; + image.data = reinterpret_cast(&slices); + + status = astcenc_decompress_image(context, data, 16, &image, &swizzle, 0); + EXPECT_EQ(status, ASTCENC_SUCCESS); +#if 0 + for (int y = 0; y < 12; y++) + { + for (int x = 0; x < 12; x++) + { + uint8_t* pixel = output + (12 * 4 * y) + (4 * x); + printf("[%2dx%2d] = %03d, %03d, %03d, %03d\n", x, y, pixel[0], pixel[1], pixel[2], pixel[3]); + } + } +#endif +} + +} diff --git a/ktx/external/astc-encoder/Source/UnitTest/test_simd.cpp b/ktx/external/astc-encoder/Source/UnitTest/test_simd.cpp new file mode 100644 index 0000000..49b6f8c --- /dev/null +++ b/ktx/external/astc-encoder/Source/UnitTest/test_simd.cpp @@ -0,0 +1,3779 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2020-2025 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Unit tests for the vectorized SIMD functionality. + */ + +#include + +#include "gtest/gtest.h" + +#include "../astcenc_internal.h" +#include "../astcenc_vecmathlib.h" + +namespace astcenc +{ + +// Misc utility tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +#if ASTCENC_SIMD_WIDTH == 8 +/** + * @brief Construct from 8 scalar values. + * + * The value of @c a is stored to lane 0 (LSB) in the SIMD register. + */ +static vfloat8 vfloat8_lit( + float a, float b, float c, float d, + float e, float f, float g, float h +) { + alignas(32) float data[8] { + a, b, c, d, e, f, g, h + }; + + return vfloat8(data); +} + +/** + * @brief Construct from 8 scalar values. + * + * The value of @c a is stored to lane 0 (LSB) in the SIMD register. + */ +static vint8 vint8_lit( + int a, int b, int c, int d, + int e, int f, int g, int h +) { + alignas(32) int data[8] { + a, b, c, d, e, f, g, h + }; + + return vint8(data); +} + +#endif + +static unsigned int round_down(unsigned int x) +{ + unsigned int remainder = x % ASTCENC_SIMD_WIDTH; + return x - remainder; +} + +static unsigned int round_up(unsigned int x) +{ + unsigned int remainder = x % ASTCENC_SIMD_WIDTH; + if (!remainder) + { + return x; + } + + return x - remainder + ASTCENC_SIMD_WIDTH; +} + +/** @brief Test VLA loop limit round down. */ +TEST(SuiteMisc, RoundDownVLA) +{ + // Static ones which are valid for all VLA widths + EXPECT_EQ(round_down_to_simd_multiple_vla(0), 0u); + EXPECT_EQ(round_down_to_simd_multiple_vla(8), 8u); + EXPECT_EQ(round_down_to_simd_multiple_vla(16), 16u); + + // Variable ones which depend on VLA width + EXPECT_EQ(round_down_to_simd_multiple_vla(3), round_down(3)); + EXPECT_EQ(round_down_to_simd_multiple_vla(5), round_down(5)); + EXPECT_EQ(round_down_to_simd_multiple_vla(7), round_down(7)); + EXPECT_EQ(round_down_to_simd_multiple_vla(231), round_down(231)); +} + +/** @brief Test VLA loop limit round up. */ +TEST(SuiteMisc, RoundUpVLA) +{ + // Static ones which are valid for all VLA widths + EXPECT_EQ(round_up_to_simd_multiple_vla(0), 0u); + EXPECT_EQ(round_up_to_simd_multiple_vla(8), 8u); + EXPECT_EQ(round_up_to_simd_multiple_vla(16), 16u); + + // Variable ones which depend on VLA width + EXPECT_EQ(round_up_to_simd_multiple_vla(3), round_up(3)); + EXPECT_EQ(round_up_to_simd_multiple_vla(5), round_up(5)); + EXPECT_EQ(round_up_to_simd_multiple_vla(7), round_up(7)); + EXPECT_EQ(round_up_to_simd_multiple_vla(231), round_up(231)); +} + +#if ASTCENC_SIMD_WIDTH == 1 + +// VLA (1-wide) tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +/** @brief Test VLA change_sign. */ +TEST(SuiteVfloat, ChangeSign) +{ + vfloat a0(-1.0f); + vfloat b0(-1.0f); + vfloat r0 = change_sign(a0, b0); + EXPECT_EQ(r0.lane<0>(), 1.0f); + + vfloat a1( 1.0f); + vfloat b1(-1.0f); + vfloat r1 = change_sign(a1, b1); + EXPECT_EQ(r1.lane<0>(), -1.0f); + + vfloat a2(-3.12f); + vfloat b2( 3.12f); + vfloat r2 = change_sign(a2, b2); + EXPECT_EQ(r2.lane<0>(), -3.12f); + + vfloat a3( 3.12f); + vfloat b3( 3.12f); + vfloat r3 = change_sign(a3, b3); + EXPECT_EQ(r3.lane<0>(), 3.12f); +} + +/** @brief Test VLA atan. */ +TEST(SuiteVfloat, Atan) +{ + vfloat a0(-0.15f); + vfloat r0 = atan(a0); + EXPECT_NEAR(r0.lane<0>(), -0.149061f, 0.005f); + + vfloat a1(0.0f); + vfloat r1 = atan(a1); + EXPECT_NEAR(r1.lane<0>(), 0.000000f, 0.005f); + + vfloat a2(0.9f); + vfloat r2 = atan(a2); + EXPECT_NEAR(r2.lane<0>(), 0.733616f, 0.005f); + + vfloat a3(2.1f); + vfloat r3 = atan(a3); + EXPECT_NEAR(r3.lane<0>(), 1.123040f, 0.005f); +} + +/** @brief Test VLA atan2. */ +TEST(SuiteVfloat, Atan2) +{ + vfloat a0(-0.15f); + vfloat b0( 1.15f); + vfloat r0 = atan2(a0, b0); + EXPECT_NEAR(r0.lane<0>(), -0.129816f, 0.005f); + + vfloat a1( 0.0f); + vfloat b1(-3.0f); + vfloat r1 = atan2(a1, b1); + EXPECT_NEAR(r1.lane<0>(), 3.141592f, 0.005f); + + vfloat a2( 0.9f); + vfloat b2(-0.9f); + vfloat r2 = atan2(a2, b2); + EXPECT_NEAR(r2.lane<0>(), 2.360342f, 0.005f); + + vfloat a3( 2.1f); + vfloat b3( 1.1f); + vfloat r3 = atan2(a3, b3); + EXPECT_NEAR(r3.lane<0>(), 1.084357f, 0.005f); +} + +#elif ASTCENC_SIMD_WIDTH == 4 + +// VLA (4-wide) tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +/** @brief Test VLA change_sign. */ +TEST(SuiteVfloat, ChangeSign) +{ + vfloat4 a(-1.0f, 1.0f, -3.12f, 3.12f); + vfloat4 b(-1.0f, -1.0f, 3.12f, 3.12f); + vfloat4 r = change_sign(a, b); + + EXPECT_EQ(r.lane<0>(), 1.0f); + EXPECT_EQ(r.lane<1>(), -1.0f); + EXPECT_EQ(r.lane<2>(), -3.12f); + EXPECT_EQ(r.lane<3>(), 3.12f); +} + +/** @brief Test VLA atan. */ +TEST(SuiteVfloat, Atan) +{ + vfloat4 a(-0.15f, 0.0f, 0.9f, 2.1f); + vfloat4 r = atan(a); + + EXPECT_NEAR(r.lane<0>(), -0.149061f, 0.005f); + EXPECT_NEAR(r.lane<1>(), 0.000000f, 0.005f); + EXPECT_NEAR(r.lane<2>(), 0.733616f, 0.005f); + EXPECT_NEAR(r.lane<3>(), 1.123040f, 0.005f); +} + +/** @brief Test VLA atan2. */ +TEST(SuiteVfloat, Atan2) +{ + vfloat4 a(-0.15f, 0.0f, 0.9f, 2.1f); + vfloat4 b(1.15f, -3.0f, -0.9f, 1.1f); + vfloat4 r = atan2(a, b); + + EXPECT_NEAR(r.lane<0>(), -0.129816f, 0.005f); + EXPECT_NEAR(r.lane<1>(), 3.141592f, 0.005f); + EXPECT_NEAR(r.lane<2>(), 2.360342f, 0.005f); + EXPECT_NEAR(r.lane<3>(), 1.084357f, 0.005f); +} + +#elif ASTCENC_SIMD_WIDTH == 8 + +// VLA (8-wide) tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +/** @brief Test VLA change_sign. */ +TEST(SuiteVfloat, ChangeSign) +{ + vfloat8 a = vfloat8_lit(-1.0f, 1.0f, -3.12f, 3.12f, -1.0f, 1.0f, -3.12f, 3.12f); + vfloat8 b = vfloat8_lit(-1.0f, -1.0f, 3.12f, 3.12f, -1.0f, -1.0f, 3.12f, 3.12f); + vfloat8 r = change_sign(a, b); + + alignas(32) float ra[8]; + storea(r, ra); + + EXPECT_EQ(ra[0], 1.0f); + EXPECT_EQ(ra[1], -1.0f); + EXPECT_EQ(ra[2], -3.12f); + EXPECT_EQ(ra[3], 3.12f); + EXPECT_EQ(ra[4], 1.0f); + EXPECT_EQ(ra[5], -1.0f); + EXPECT_EQ(ra[6], -3.12f); + EXPECT_EQ(ra[7], 3.12f); +} + +/** @brief Test VLA atan. */ +TEST(SuiteVfloat, Atan) +{ + vfloat8 a = vfloat8_lit(-0.15f, 0.0f, 0.9f, 2.1f, -0.15f, 0.0f, 0.9f, 2.1f); + vfloat8 r = atan(a); + + alignas(32) float ra[8]; + storea(r, ra); + + EXPECT_NEAR(ra[0], -0.149061f, 0.005f); + EXPECT_NEAR(ra[1], 0.000000f, 0.005f); + EXPECT_NEAR(ra[2], 0.733616f, 0.005f); + EXPECT_NEAR(ra[3], 1.123040f, 0.005f); + EXPECT_NEAR(ra[4], -0.149061f, 0.005f); + EXPECT_NEAR(ra[5], 0.000000f, 0.005f); + EXPECT_NEAR(ra[6], 0.733616f, 0.005f); + EXPECT_NEAR(ra[7], 1.123040f, 0.005f); +} + +/** @brief Test VLA atan2. */ +TEST(SuiteVfloat, Atan2) +{ + vfloat8 a = vfloat8_lit(-0.15f, 0.0f, 0.9f, 2.1f, -0.15f, 0.0f, 0.9f, 2.1f); + vfloat8 b = vfloat8_lit(1.15f, -3.0f, -0.9f, 1.1f, 1.15f, -3.0f, -0.9f, 1.1f); + vfloat8 r = atan2(a, b); + + alignas(32) float ra[8]; + storea(r, ra); + + EXPECT_NEAR(ra[0], -0.129816f, 0.005f); + EXPECT_NEAR(ra[1], 3.141592f, 0.005f); + EXPECT_NEAR(ra[2], 2.360342f, 0.005f); + EXPECT_NEAR(ra[3], 1.084357f, 0.005f); + EXPECT_NEAR(ra[4], -0.129816f, 0.005f); + EXPECT_NEAR(ra[5], 3.141592f, 0.005f); + EXPECT_NEAR(ra[6], 2.360342f, 0.005f); + EXPECT_NEAR(ra[7], 1.084357f, 0.005f); +} + +#endif + +static const float qnan = std::numeric_limits::quiet_NaN(); + +alignas(32) static const float f32_data[9] { + 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f +}; + +alignas(32) static const int s32_data[9] { + 0, 1, 2, 3, 4, 5 , 6, 7, 8 +}; + +alignas(32) static const uint8_t u8_data[9] { + 0, 1, 2, 3, 4, 5 , 6, 7, 8 +}; + +// VFLOAT4 tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +/** @brief Test unaligned vfloat4 data load. */ +TEST(SuiteVfloat4, UnalignedLoad) +{ + vfloat4 a(&(f32_data[1])); + EXPECT_EQ(a.lane<0>(), 1.0f); + EXPECT_EQ(a.lane<1>(), 2.0f); + EXPECT_EQ(a.lane<2>(), 3.0f); + EXPECT_EQ(a.lane<3>(), 4.0f); +} + +/** @brief Test scalar duplicated vfloat4 load. */ +TEST(SuiteVfloat4, ScalarDupLoad) +{ + vfloat4 a(1.1f); + EXPECT_EQ(a.lane<0>(), 1.1f); + EXPECT_EQ(a.lane<1>(), 1.1f); + EXPECT_EQ(a.lane<2>(), 1.1f); + EXPECT_EQ(a.lane<3>(), 1.1f); +} + +/** @brief Test scalar vfloat4 load. */ +TEST(SuiteVfloat4, ScalarLoad) +{ + vfloat4 a(1.1f, 2.2f, 3.3f, 4.4f); + EXPECT_EQ(a.lane<0>(), 1.1f); + EXPECT_EQ(a.lane<1>(), 2.2f); + EXPECT_EQ(a.lane<2>(), 3.3f); + EXPECT_EQ(a.lane<3>(), 4.4f); +} + +/** @brief Test copy vfloat4 load. */ +TEST(SuiteVfloat4, CopyLoad) +{ + vfloat4 s(1.1f, 2.2f, 3.3f, 4.4f); + vfloat4 a(s.m); + EXPECT_EQ(a.lane<0>(), 1.1f); + EXPECT_EQ(a.lane<1>(), 2.2f); + EXPECT_EQ(a.lane<2>(), 3.3f); + EXPECT_EQ(a.lane<3>(), 4.4f); +} + +/** @brief Test vfloat4 scalar lane set. */ +TEST(SuiteVfloat4, SetLane) +{ + vfloat4 a(0.0f); + + a.set_lane<0>(1.0f); + EXPECT_EQ(a.lane<0>(), 1.0f); + EXPECT_EQ(a.lane<1>(), 0.0f); + EXPECT_EQ(a.lane<2>(), 0.0f); + EXPECT_EQ(a.lane<3>(), 0.0f); + + a.set_lane<1>(2.0f); + EXPECT_EQ(a.lane<0>(), 1.0f); + EXPECT_EQ(a.lane<1>(), 2.0f); + EXPECT_EQ(a.lane<2>(), 0.0f); + EXPECT_EQ(a.lane<3>(), 0.0f); + + a.set_lane<2>(3.0f); + EXPECT_EQ(a.lane<0>(), 1.0f); + EXPECT_EQ(a.lane<1>(), 2.0f); + EXPECT_EQ(a.lane<2>(), 3.0f); + EXPECT_EQ(a.lane<3>(), 0.0f); + + a.set_lane<3>(4.0f); + EXPECT_EQ(a.lane<0>(), 1.0f); + EXPECT_EQ(a.lane<1>(), 2.0f); + EXPECT_EQ(a.lane<2>(), 3.0f); + EXPECT_EQ(a.lane<3>(), 4.0f); +} + +/** @brief Test vfloat4 zero. */ +TEST(SuiteVfloat4, Zero) +{ + vfloat4 a = vfloat4::zero(); + EXPECT_EQ(a.lane<0>(), 0.0f); + EXPECT_EQ(a.lane<1>(), 0.0f); + EXPECT_EQ(a.lane<2>(), 0.0f); + EXPECT_EQ(a.lane<3>(), 0.0f); +} + +/** @brief Test vfloat4 load1. */ +TEST(SuiteVfloat4, Load1) +{ + float s = 3.14f; + vfloat4 a = vfloat4::load1(&s); + EXPECT_EQ(a.lane<0>(), 3.14f); + EXPECT_EQ(a.lane<1>(), 3.14f); + EXPECT_EQ(a.lane<2>(), 3.14f); + EXPECT_EQ(a.lane<3>(), 3.14f); +} + +/** @brief Test vfloat4 loada. */ +TEST(SuiteVfloat4, Loada) +{ + vfloat4 a = vfloat4::loada(&(f32_data[0])); + EXPECT_EQ(a.lane<0>(), 0.0f); + EXPECT_EQ(a.lane<1>(), 1.0f); + EXPECT_EQ(a.lane<2>(), 2.0f); + EXPECT_EQ(a.lane<3>(), 3.0f); +} + +/** @brief Test vfloat4 swz to float4. */ +TEST(SuiteVfloat4, swz4) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 r = a.swz<0, 3, 2, 1>(); + EXPECT_EQ(r.lane<0>(), 1.0f); + EXPECT_EQ(r.lane<1>(), 4.0f); + EXPECT_EQ(r.lane<2>(), 3.0f); + EXPECT_EQ(r.lane<3>(), 2.0f); + + r = a.swz<3, 1, 1, 0>(); + EXPECT_EQ(r.lane<0>(), 4.0f); + EXPECT_EQ(r.lane<1>(), 2.0f); + EXPECT_EQ(r.lane<2>(), 2.0f); + EXPECT_EQ(r.lane<3>(), 1.0f); +} + +/** @brief Test vfloat4 swz to float3. */ +TEST(SuiteVfloat4, swz3) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 r = a.swz<0, 3, 2>(); + EXPECT_EQ(r.lane<0>(), 1.0f); + EXPECT_EQ(r.lane<1>(), 4.0f); + EXPECT_EQ(r.lane<2>(), 3.0f); + EXPECT_EQ(r.lane<3>(), 0.0f); + + r = a.swz<3, 1, 1>(); + EXPECT_EQ(r.lane<0>(), 4.0f); + EXPECT_EQ(r.lane<1>(), 2.0f); + EXPECT_EQ(r.lane<2>(), 2.0f); + EXPECT_EQ(r.lane<3>(), 0.0f); +} + +/** @brief Test vfloat4 swz to float2. */ +TEST(SuiteVfloat4, swz2) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 r = a.swz<0, 3>(); + EXPECT_EQ(r.lane<0>(), 1.0f); + EXPECT_EQ(r.lane<1>(), 4.0f); + + r = a.swz<2, 1>(); + EXPECT_EQ(r.lane<0>(), 3.0f); + EXPECT_EQ(r.lane<1>(), 2.0f); +} + +/** @brief Test vfloat4 add. */ +TEST(SuiteVfloat4, vadd) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b(0.1f, 0.2f, 0.3f, 0.4f); + a = a + b; + EXPECT_EQ(a.lane<0>(), 1.0f + 0.1f); + EXPECT_EQ(a.lane<1>(), 2.0f + 0.2f); + EXPECT_EQ(a.lane<2>(), 3.0f + 0.3f); + EXPECT_EQ(a.lane<3>(), 4.0f + 0.4f); +} + +/** @brief Test vfloat4 self-add. */ +TEST(SuiteVfloat4, vselfadd1) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b(0.1f, 0.2f, 0.3f, 0.4f); + + // Test increment by another variable + a += b; + EXPECT_EQ(a.lane<0>(), 1.0f + 0.1f); + EXPECT_EQ(a.lane<1>(), 2.0f + 0.2f); + EXPECT_EQ(a.lane<2>(), 3.0f + 0.3f); + EXPECT_EQ(a.lane<3>(), 4.0f + 0.4f); + + // Test increment by an expression + a += b + b; + EXPECT_NEAR(a.lane<0>(), 1.0f + 0.3f, 0.001f); + EXPECT_NEAR(a.lane<1>(), 2.0f + 0.6f, 0.001f); + EXPECT_NEAR(a.lane<2>(), 3.0f + 0.9f, 0.001f); + EXPECT_NEAR(a.lane<3>(), 4.0f + 1.2f, 0.001f); +} + +/** @brief Test vfloat4 sub. */ +TEST(SuiteVfloat4, vsub) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b(0.1f, 0.2f, 0.3f, 0.4f); + a = a - b; + EXPECT_EQ(a.lane<0>(), 1.0f - 0.1f); + EXPECT_EQ(a.lane<1>(), 2.0f - 0.2f); + EXPECT_EQ(a.lane<2>(), 3.0f - 0.3f); + EXPECT_EQ(a.lane<3>(), 4.0f - 0.4f); +} + +/** @brief Test vfloat4 mul. */ +TEST(SuiteVfloat4, vmul) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b(0.1f, 0.2f, 0.3f, 0.4f); + a = a * b; + EXPECT_EQ(a.lane<0>(), 1.0f * 0.1f); + EXPECT_EQ(a.lane<1>(), 2.0f * 0.2f); + EXPECT_EQ(a.lane<2>(), 3.0f * 0.3f); + EXPECT_EQ(a.lane<3>(), 4.0f * 0.4f); +} + +/** @brief Test vfloat4 mul. */ +TEST(SuiteVfloat4, vsmul) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + float b = 3.14f; + a = a * b; + EXPECT_EQ(a.lane<0>(), 1.0f * 3.14f); + EXPECT_EQ(a.lane<1>(), 2.0f * 3.14f); + EXPECT_EQ(a.lane<2>(), 3.0f * 3.14f); + EXPECT_EQ(a.lane<3>(), 4.0f * 3.14f); +} + +/** @brief Test vfloat4 mul. */ +TEST(SuiteVfloat4, svmul) +{ + float a = 3.14f; + vfloat4 b(1.0f, 2.0f, 3.0f, 4.0f); + b = a * b; + EXPECT_EQ(b.lane<0>(), 3.14f * 1.0f); + EXPECT_EQ(b.lane<1>(), 3.14f * 2.0f); + EXPECT_EQ(b.lane<2>(), 3.14f * 3.0f); + EXPECT_EQ(b.lane<3>(), 3.14f * 4.0f); +} + +/** @brief Test vfloat4 div. */ +TEST(SuiteVfloat4, vdiv) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b(0.1f, 0.2f, 0.3f, 0.4f); + a = a / b; + EXPECT_EQ(a.lane<0>(), 1.0f / 0.1f); + EXPECT_EQ(a.lane<1>(), 2.0f / 0.2f); + EXPECT_EQ(a.lane<2>(), 3.0f / 0.3f); + EXPECT_EQ(a.lane<3>(), 4.0f / 0.4f); +} + +/** @brief Test vfloat4 div. */ +TEST(SuiteVfloat4, vsdiv) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + float b = 0.3f; + a = a / b; + EXPECT_EQ(a.lane<0>(), 1.0f / 0.3f); + EXPECT_EQ(a.lane<1>(), 2.0f / 0.3f); + EXPECT_EQ(a.lane<2>(), 3.0f / 0.3f); + EXPECT_EQ(a.lane<3>(), 4.0f / 0.3f); +} + +/** @brief Test vfloat4 div. */ +TEST(SuiteVfloat4, svdiv) +{ + float a = 3.0f; + vfloat4 b(0.1f, 0.2f, 0.3f, 0.4f); + b = a / b; + EXPECT_EQ(b.lane<0>(), 3.0f / 0.1f); + EXPECT_EQ(b.lane<1>(), 3.0f / 0.2f); + EXPECT_EQ(b.lane<2>(), 3.0f / 0.3f); + EXPECT_EQ(b.lane<3>(), 3.0f / 0.4f); +} + +/** @brief Test vfloat4 ceq. */ +TEST(SuiteVfloat4, ceq) +{ + vfloat4 a1(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b1(0.1f, 0.2f, 0.3f, 0.4f); + vmask4 r1 = a1 == b1; + EXPECT_EQ(0u, mask(r1)); + EXPECT_EQ(false, any(r1)); + EXPECT_EQ(false, all(r1)); + + vfloat4 a2(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b2(1.0f, 0.2f, 0.3f, 0.4f); + vmask4 r2 = a2 == b2; + EXPECT_EQ(0x1u, mask(r2)); + EXPECT_EQ(true, any(r2)); + EXPECT_EQ(false, all(r2)); + + vfloat4 a3(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b3(1.0f, 0.2f, 3.0f, 0.4f); + vmask4 r3 = a3 == b3; + EXPECT_EQ(0x5u, mask(r3)); + EXPECT_EQ(true, any(r3)); + EXPECT_EQ(false, all(r3)); + + vfloat4 a4(1.0f, 2.0f, 3.0f, 4.0f); + vmask4 r4 = a4 == a4; + EXPECT_EQ(0xFu, mask(r4)); + EXPECT_EQ(true, any(r4)); + EXPECT_EQ(true, all(r4)); +} + +/** @brief Test vfloat4 cne. */ +TEST(SuiteVfloat4, cne) +{ + vfloat4 a1(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b1(0.1f, 0.2f, 0.3f, 0.4f); + vmask4 r1 = a1 != b1; + EXPECT_EQ(0xFu, mask(r1)); + EXPECT_EQ(true, any(r1)); + EXPECT_EQ(true, all(r1)); + + vfloat4 a2(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b2(1.0f, 0.2f, 0.3f, 0.4f); + vmask4 r2 = a2 != b2; + EXPECT_EQ(0xEu, mask(r2)); + EXPECT_EQ(true, any(r2)); + EXPECT_EQ(false, all(r2)); + + vfloat4 a3(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b3(1.0f, 0.2f, 3.0f, 0.4f); + vmask4 r3 = a3 != b3; + EXPECT_EQ(0xAu, mask(r3)); + EXPECT_EQ(true, any(r3)); + EXPECT_EQ(false, all(r3)); + + vfloat4 a4(1.0f, 2.0f, 3.0f, 4.0f); + vmask4 r4 = a4 != a4; + EXPECT_EQ(0u, mask(r4)); + EXPECT_EQ(false, any(r4)); + EXPECT_EQ(false, all(r4)); +} + +/** @brief Test vfloat4 clt. */ +TEST(SuiteVfloat4, clt) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b(0.9f, 2.1f, 3.0f, 4.1f); + vmask4 r = a < b; + EXPECT_EQ(0xAu, mask(r)); +} + +/** @brief Test vfloat4 cle. */ +TEST(SuiteVfloat4, cle) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b(0.9f, 2.1f, 3.0f, 4.1f); + vmask4 r = a <= b; + EXPECT_EQ(0xEu, mask(r)); +} + +/** @brief Test vfloat4 cgt. */ +TEST(SuiteVfloat4, cgt) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b(0.9f, 2.1f, 3.0f, 4.1f); + vmask4 r = a > b; + EXPECT_EQ(0x1u, mask(r)); +} + +/** @brief Test vfloat4 cge. */ +TEST(SuiteVfloat4, cge) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b(0.9f, 2.1f, 3.0f, 4.1f); + vmask4 r = a >= b; + EXPECT_EQ(0x5u, mask(r)); +} + +/** @brief Test vfloat4 min. */ +TEST(SuiteVfloat4, min) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b(0.9f, 2.1f, 3.0f, 4.1f); + vfloat4 r = min(a, b); + EXPECT_EQ(r.lane<0>(), 0.9f); + EXPECT_EQ(r.lane<1>(), 2.0f); + EXPECT_EQ(r.lane<2>(), 3.0f); + EXPECT_EQ(r.lane<3>(), 4.0f); + + float c = 0.3f; + r = min(a, c); + EXPECT_EQ(r.lane<0>(), 0.3f); + EXPECT_EQ(r.lane<1>(), 0.3f); + EXPECT_EQ(r.lane<2>(), 0.3f); + EXPECT_EQ(r.lane<3>(), 0.3f); + + float d = 1.5f; + r = min(a, d); + EXPECT_EQ(r.lane<0>(), 1.0f); + EXPECT_EQ(r.lane<1>(), 1.5f); + EXPECT_EQ(r.lane<2>(), 1.5f); + EXPECT_EQ(r.lane<3>(), 1.5f); +} + +/** @brief Test vfloat4 max. */ +TEST(SuiteVfloat4, max) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 b(0.9f, 2.1f, 3.0f, 4.1f); + vfloat4 r = max(a, b); + EXPECT_EQ(r.lane<0>(), 1.0f); + EXPECT_EQ(r.lane<1>(), 2.1f); + EXPECT_EQ(r.lane<2>(), 3.0f); + EXPECT_EQ(r.lane<3>(), 4.1f); + + float c = 4.3f; + r = max(a, c); + EXPECT_EQ(r.lane<0>(), 4.3f); + EXPECT_EQ(r.lane<1>(), 4.3f); + EXPECT_EQ(r.lane<2>(), 4.3f); + EXPECT_EQ(r.lane<3>(), 4.3f); + + float d = 1.5f; + r = max(a, d); + EXPECT_EQ(r.lane<0>(), 1.5f); + EXPECT_EQ(r.lane<1>(), 2.0f); + EXPECT_EQ(r.lane<2>(), 3.0f); + EXPECT_EQ(r.lane<3>(), 4.0f); +} + +/** @brief Test vfloat4 clamp. */ +TEST(SuiteVfloat4, clamp) +{ + vfloat4 a1(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 r1 = clamp(2.1f, 3.0f, a1); + EXPECT_EQ(r1.lane<0>(), 2.1f); + EXPECT_EQ(r1.lane<1>(), 2.1f); + EXPECT_EQ(r1.lane<2>(), 3.0f); + EXPECT_EQ(r1.lane<3>(), 3.0f); + + vfloat4 a2(1.0f, 2.0f, qnan, 4.0f); + vfloat4 r2 = clamp(2.1f, 3.0f, a2); + EXPECT_EQ(r2.lane<0>(), 2.1f); + EXPECT_EQ(r2.lane<1>(), 2.1f); + EXPECT_EQ(r2.lane<2>(), 2.1f); + EXPECT_EQ(r2.lane<3>(), 3.0f); +} + +/** @brief Test vfloat4 clampz. */ +TEST(SuiteVfloat4, clampzo) +{ + vfloat4 a1(-1.0f, 0.0f, 0.1f, 4.0f); + vfloat4 r1 = clampzo(a1); + EXPECT_EQ(r1.lane<0>(), 0.0f); + EXPECT_EQ(r1.lane<1>(), 0.0f); + EXPECT_EQ(r1.lane<2>(), 0.1f); + EXPECT_EQ(r1.lane<3>(), 1.0f); + + vfloat4 a2(-1.0f, 0.0f, qnan, 4.0f); + vfloat4 r2 = clampzo(a2); + EXPECT_EQ(r2.lane<0>(), 0.0f); + EXPECT_EQ(r2.lane<1>(), 0.0f); + EXPECT_EQ(r2.lane<2>(), 0.0f); + EXPECT_EQ(r2.lane<3>(), 1.0f); +} + +/** @brief Test vfloat4 abs. */ +TEST(SuiteVfloat4, abs) +{ + vfloat4 a(-1.0f, 0.0f, 0.1f, 4.0f); + vfloat4 r = abs(a); + EXPECT_EQ(r.lane<0>(), 1.0f); + EXPECT_EQ(r.lane<1>(), 0.0f); + EXPECT_EQ(r.lane<2>(), 0.1f); + EXPECT_EQ(r.lane<3>(), 4.0f); +} + +/** @brief Test vfloat4 round. */ +TEST(SuiteVfloat4, round) +{ + vfloat4 a1(1.1f, 1.5f, 1.6f, 4.0f); + vfloat4 r1 = round(a1); + EXPECT_EQ(r1.lane<0>(), 1.0f); + EXPECT_EQ(r1.lane<1>(), 2.0f); + EXPECT_EQ(r1.lane<2>(), 2.0f); + EXPECT_EQ(r1.lane<3>(), 4.0f); + + vfloat4 a2(-2.5f, -2.5f, -3.5f, -3.5f); + vfloat4 r2 = round(a2); + EXPECT_EQ(r2.lane<0>(), -2.0f); + EXPECT_EQ(r2.lane<2>(), -4.0f); +} + +/** @brief Test vfloat4 hmin. */ +TEST(SuiteVfloat4, hmin) +{ + vfloat4 a1(1.1f, 1.5f, 1.6f, 4.0f); + vfloat4 r1 = hmin(a1); + EXPECT_EQ(r1.lane<0>(), 1.1f); + EXPECT_EQ(r1.lane<1>(), 1.1f); + EXPECT_EQ(r1.lane<2>(), 1.1f); + EXPECT_EQ(r1.lane<3>(), 1.1f); + + vfloat4 a2(1.1f, 1.5f, 1.6f, 0.2f); + vfloat4 r2 = hmin(a2); + EXPECT_EQ(r2.lane<0>(), 0.2f); + EXPECT_EQ(r2.lane<1>(), 0.2f); + EXPECT_EQ(r2.lane<2>(), 0.2f); + EXPECT_EQ(r2.lane<3>(), 0.2f); +} + +/** @brief Test vfloat4 hmin_s. */ +TEST(SuiteVfloat4, hmin_s) +{ + vfloat4 a1(1.1f, 1.5f, 1.6f, 4.0f); + float r1 = hmin_s(a1); + EXPECT_EQ(r1, 1.1f); + + vfloat4 a2(1.1f, 1.5f, 1.6f, 0.2f); + float r2 = hmin_s(a2); + EXPECT_EQ(r2, 0.2f); +} + +/** @brief Test vfloat4 hmin_rgb_s. */ +TEST(SuiteVfloat4, hmin_rgb_s) +{ + vfloat4 a1(1.1f, 1.5f, 1.6f, 0.2f); + float r1 = hmin_rgb_s(a1); + EXPECT_EQ(r1, 1.1f); + + vfloat4 a2(1.5f, 0.9f, 1.6f, 1.2f); + float r2 = hmin_rgb_s(a2); + EXPECT_EQ(r2, 0.9f); +} + +/** @brief Test vfloat4 hmax. */ +TEST(SuiteVfloat4, hmax) +{ + vfloat4 a1(1.1f, 1.5f, 1.6f, 4.0f); + vfloat4 r1 = hmax(a1); + EXPECT_EQ(r1.lane<0>(), 4.0f); + EXPECT_EQ(r1.lane<1>(), 4.0f); + EXPECT_EQ(r1.lane<2>(), 4.0f); + EXPECT_EQ(r1.lane<3>(), 4.0f); + + vfloat4 a2(1.1f, 1.5f, 1.6f, 0.2f); + vfloat4 r2 = hmax(a2); + EXPECT_EQ(r2.lane<0>(), 1.6f); + EXPECT_EQ(r2.lane<1>(), 1.6f); + EXPECT_EQ(r2.lane<2>(), 1.6f); + EXPECT_EQ(r2.lane<3>(), 1.6f); +} + +/** @brief Test vfloat4 hmax_s. */ +TEST(SuiteVfloat4, hmax_s) +{ + vfloat4 a1(1.1f, 1.5f, 1.6f, 4.0f); + float r1 = hmax_s(a1); + EXPECT_EQ(r1, 4.0f); + + vfloat4 a2(1.1f, 1.5f, 1.6f, 0.2f); + float r2 = hmax_s(a2); + EXPECT_EQ(r2, 1.6f); +} + +/** @brief Test vfloat4 hadd_s. */ +TEST(SuiteVfloat4, hadd_s) +{ + vfloat4 a1(1.1f, 1.5f, 1.6f, 4.0f); + float sum = 1.1f + 1.5f + 1.6f + 4.0f; + float r = hadd_s(a1); + EXPECT_NEAR(r, sum, 0.005f); +} + +/** @brief Test vfloat4 hadd_rgb_s. */ +TEST(SuiteVfloat4, hadd_rgb_s) +{ + vfloat4 a1(1.1f, 1.5f, 1.6f, 4.0f); + float sum = 1.1f + 1.5f + 1.6f; + float r = hadd_rgb_s(a1); + EXPECT_NEAR(r, sum, 0.005f); +} + +/** @brief Test vfloat4 sqrt. */ +TEST(SuiteVfloat4, sqrt) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 r = sqrt(a); + EXPECT_EQ(r.lane<0>(), std::sqrt(1.0f)); + EXPECT_EQ(r.lane<1>(), std::sqrt(2.0f)); + EXPECT_EQ(r.lane<2>(), std::sqrt(3.0f)); + EXPECT_EQ(r.lane<3>(), std::sqrt(4.0f)); +} + +/** @brief Test vfloat4 select. */ +TEST(SuiteVfloat4, select) +{ + vfloat4 m1(1.0f, 1.0f, 1.0f, 1.0f); + vfloat4 m2(1.0f, 2.0f, 1.0f, 2.0f); + vmask4 cond = m1 == m2; + + vfloat4 a(1.0f, 3.0f, 3.0f, 1.0f); + vfloat4 b(4.0f, 2.0f, 2.0f, 4.0f); + + // Select in one direction + vfloat4 r1 = select(a, b, cond); + EXPECT_EQ(r1.lane<0>(), 4.0f); + EXPECT_EQ(r1.lane<1>(), 3.0f); + EXPECT_EQ(r1.lane<2>(), 2.0f); + EXPECT_EQ(r1.lane<3>(), 1.0f); + + // Select in the other + vfloat4 r2 = select(b, a, cond); + EXPECT_EQ(r2.lane<0>(), 1.0f); + EXPECT_EQ(r2.lane<1>(), 2.0f); + EXPECT_EQ(r2.lane<2>(), 3.0f); + EXPECT_EQ(r2.lane<3>(), 4.0f); +} + +/** @brief Test vfloat4 gatherf. */ +TEST(SuiteVfloat4, gatherf) +{ + vint4 indices(0, 4, 3, 2); + vfloat4 r = gatherf(f32_data, indices); + EXPECT_EQ(r.lane<0>(), 0.0f); + EXPECT_EQ(r.lane<1>(), 4.0f); + EXPECT_EQ(r.lane<2>(), 3.0f); + EXPECT_EQ(r.lane<3>(), 2.0f); +} + +/** @brief Test vfloat4 storea. */ +TEST(SuiteVfloat4, storea) +{ + ASTCENC_ALIGNAS float out[4]; + vfloat4 a(f32_data); + storea(a, out); + EXPECT_EQ(out[0], 0.0f); + EXPECT_EQ(out[1], 1.0f); + EXPECT_EQ(out[2], 2.0f); + EXPECT_EQ(out[3], 3.0f); +} + +/** @brief Test vfloat4 store. */ +TEST(SuiteVfloat4, store) +{ + ASTCENC_ALIGNAS float out[5]; + vfloat4 a(f32_data); + store(a, &(out[1])); + EXPECT_EQ(out[1], 0.0f); + EXPECT_EQ(out[2], 1.0f); + EXPECT_EQ(out[3], 2.0f); + EXPECT_EQ(out[4], 3.0f); +} + +/** @brief Test vfloat4 dot. */ +TEST(SuiteVfloat4, dot) +{ + vfloat4 a1(1.0f, 2.0f, 4.0f, 8.0f); + vfloat4 b1(1.0f, 0.5f, 0.25f, 0.125f); + vfloat4 r1 = dot(a1, b1); + EXPECT_EQ(r1.lane<0>(), 4.0f); + EXPECT_EQ(r1.lane<1>(), 4.0f); + EXPECT_EQ(r1.lane<2>(), 4.0f); + EXPECT_EQ(r1.lane<3>(), 4.0f); + + // These values will fail to add to the same value if reassociated + float l0 = 141.2540435791015625f; + float l1 = 5345345.5000000000000000f; + float l2 = 234234.7031250000000000f; + float l3 = 124353454080.0000000000000000f; + + vfloat4 a2(1.0f, 1.0f, 1.0f, 1.0f); + vfloat4 b2(l0, l1, l2, l3); + vfloat4 r2 = dot(a2, b2); + + // Test that reassociation causes a failure with the numbers we chose + EXPECT_FALSE(any(r2 == vfloat4(l0 + l1 + l2 + l3))); + + // Test that the sum works, for the association pattern we want used + EXPECT_TRUE(all(r2 == vfloat4((l0 + l2) + (l1 + l3)))); +} + +/** @brief Test vfloat4 dot_s. */ +TEST(SuiteVfloat4, dot_s) +{ + vfloat4 a1(1.0f, 2.0f, 4.0f, 8.0f); + vfloat4 b1(1.0f, 0.5f, 0.25f, 0.125f); + float r1 = dot_s(a1, b1); + EXPECT_EQ(r1, 4.0f); + + // These values will fail to add to the same value if reassociated + float l0 = 141.2540435791015625f; + float l1 = 5345345.5000000000000000f; + float l2 = 234234.7031250000000000f; + float l3 = 124353454080.0000000000000000f; + + vfloat4 a2(1.0f, 1.0f, 1.0f, 1.0f); + vfloat4 b2(l0, l1, l2, l3); + float r2 = dot_s(a2, b2); + + // Test that reassociation causes a failure with the numbers we chose + EXPECT_NE(r2, l0 + l1 + l2 + l3); + + // Test that the sum works, for the association pattern we want used + EXPECT_EQ(r2, (l0 + l2) + (l1 + l3)); +} + +/** @brief Test vfloat4 dot3. */ +TEST(SuiteVfloat4, dot3) +{ + vfloat4 a(1.0f, 2.0f, 4.0f, 8.0f); + vfloat4 b(1.0f, 0.5f, 0.25f, 0.125f); + vfloat4 r = dot3(a, b); + EXPECT_EQ(r.lane<0>(), 3.0f); + EXPECT_EQ(r.lane<1>(), 3.0f); + EXPECT_EQ(r.lane<2>(), 3.0f); + EXPECT_EQ(r.lane<3>(), 0.0f); +} + +/** @brief Test vfloat4 dot3_s. */ +TEST(SuiteVfloat4, dot3_s) +{ + vfloat4 a(1.0f, 2.0f, 4.0f, 8.0f); + vfloat4 b(1.0f, 0.5f, 0.25f, 0.125f); + float r = dot3_s(a, b); + EXPECT_EQ(r, 3.0f); +} + +/** @brief Test vfloat4 normalize. */ +TEST(SuiteVfloat4, normalize) +{ + vfloat4 a(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 r = normalize(a); + EXPECT_NEAR(r.lane<0>(), 1.0f / astc::sqrt(30.0f), 0.0005f); + EXPECT_NEAR(r.lane<1>(), 2.0f / astc::sqrt(30.0f), 0.0005f); + EXPECT_NEAR(r.lane<2>(), 3.0f / astc::sqrt(30.0f), 0.0005f); + EXPECT_NEAR(r.lane<3>(), 4.0f / astc::sqrt(30.0f), 0.0005f); +} + +/** @brief Test vfloat4 normalize_safe. */ +TEST(SuiteVfloat4, normalize_safe) +{ + vfloat4 s(-1.0f, -1.0f, -1.0f, -1.0f); + + vfloat4 a1(1.0f, 2.0f, 3.0f, 4.0f); + vfloat4 r1 = normalize_safe(a1, s); + EXPECT_NEAR(r1.lane<0>(), 1.0f / astc::sqrt(30.0f), 0.0005f); + EXPECT_NEAR(r1.lane<1>(), 2.0f / astc::sqrt(30.0f), 0.0005f); + EXPECT_NEAR(r1.lane<2>(), 3.0f / astc::sqrt(30.0f), 0.0005f); + EXPECT_NEAR(r1.lane<3>(), 4.0f / astc::sqrt(30.0f), 0.0005f); + + vfloat4 a2(0.0f, 0.0f, 0.0f, 0.0f); + vfloat4 r2 = normalize_safe(a2, s); + EXPECT_EQ(r2.lane<0>(), -1.0f); + EXPECT_EQ(r2.lane<1>(), -1.0f); + EXPECT_EQ(r2.lane<2>(), -1.0f); + EXPECT_EQ(r2.lane<3>(), -1.0f); +} + +/** @brief Test vfloat4 float_to_int. */ +TEST(SuiteVfloat4, float_to_int) +{ + vfloat4 a(1.1f, 1.5f, -1.6f, 4.0f); + vint4 r = float_to_int(a); + EXPECT_EQ(r.lane<0>(), 1); + EXPECT_EQ(r.lane<1>(), 1); + EXPECT_EQ(r.lane<2>(), -1); + EXPECT_EQ(r.lane<3>(), 4); +} + +/** @brief Test vfloat4 round. */ +TEST(SuiteVfloat4, float_to_int_rtn) +{ + vfloat4 a(1.1f, 1.5f, 1.6f, 4.0f); + vint4 r = float_to_int_rtn(a); + EXPECT_EQ(r.lane<0>(), 1); + EXPECT_EQ(r.lane<1>(), 2); + EXPECT_EQ(r.lane<2>(), 2); + EXPECT_EQ(r.lane<3>(), 4); +} + +/** @brief Test vfloat4 round. */ +TEST(SuiteVfloat4, int_to_float) +{ + vint4 a(1, 2, 3, 4); + vfloat4 r = int_to_float(a); + EXPECT_EQ(r.lane<0>(), 1.0f); + EXPECT_EQ(r.lane<1>(), 2.0f); + EXPECT_EQ(r.lane<2>(), 3.0f); + EXPECT_EQ(r.lane<3>(), 4.0f); +} + +/** @brief Test vfloat4 float to fp16 conversion. */ +TEST(SuiteVfloat4, float_to_float16) +{ + vfloat4 a(1.5, 234.5, 345345.0, qnan); + vint4 r = float_to_float16(a); + + // Normal numbers + EXPECT_EQ(r.lane<0>(), 0x3E00); + EXPECT_EQ(r.lane<1>(), 0x5B54); + + // Large numbers convert to infinity + EXPECT_EQ(r.lane<2>(), 0x7C00); + + // NaN must convert to any valid NaN encoding + EXPECT_EQ((r.lane<3>() >> 10) & 0x1F, 0x1F); // Exponent must be all 1s + EXPECT_NE(r.lane<3>() & (0x3FF), 0); // Mantissa must be non-zero +} + +/** @brief Test float to fp16 conversion. */ +TEST(sfloat, float_to_float16) +{ + int r = float_to_float16(234.5); + EXPECT_EQ(r, 0x5B54); +} + +/** @brief Test vfloat4 fp16 to float conversion. */ +TEST(SuiteVfloat4, float16_to_float) +{ vint4 a(0x3E00, 0x5B54, 0x7C00, 0xFFFF); + vfloat4 r = float16_to_float(a); + + // Normal numbers + EXPECT_EQ(r.lane<0>(), 1.5); + EXPECT_EQ(r.lane<1>(), 234.5); + + // Infinities must be preserved + EXPECT_NE(std::isinf(r.lane<2>()), 0); + + // NaNs must be preserved + EXPECT_NE(std::isnan(r.lane<3>()), 0); +} + +/** @brief Test fp16 to float conversion. */ +TEST(sfloat, float16_to_float) +{ + float r = float16_to_float(0x5B54); + EXPECT_EQ(r, 234.5); +} + +// VINT4 tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +/** @brief Test unaligned vint4 data load. */ +TEST(SuiteVint4, UnalignedLoad) +{ + vint4 a(&(s32_data[1])); + EXPECT_EQ(a.lane<0>(), 1); + EXPECT_EQ(a.lane<1>(), 2); + EXPECT_EQ(a.lane<2>(), 3); + EXPECT_EQ(a.lane<3>(), 4); +} + +/** @brief Test unaligned vint4 data load. */ +TEST(SuiteVint4, UnalignedLoad8) +{ + vint4 a(&(u8_data[1])); + EXPECT_EQ(a.lane<0>(), 1); + EXPECT_EQ(a.lane<1>(), 2); + EXPECT_EQ(a.lane<2>(), 3); + EXPECT_EQ(a.lane<3>(), 4); +} + +/** @brief Test scalar duplicated vint4 load. */ +TEST(SuiteVint4, ScalarDupLoad) +{ + vint4 a(42); + EXPECT_EQ(a.lane<0>(), 42); + EXPECT_EQ(a.lane<1>(), 42); + EXPECT_EQ(a.lane<2>(), 42); + EXPECT_EQ(a.lane<3>(), 42); +} + +/** @brief Test scalar vint4 load. */ +TEST(SuiteVint4, ScalarLoad) +{ + vint4 a(11, 22, 33, 44); + EXPECT_EQ(a.lane<0>(), 11); + EXPECT_EQ(a.lane<1>(), 22); + EXPECT_EQ(a.lane<2>(), 33); + EXPECT_EQ(a.lane<3>(), 44); +} + +/** @brief Test copy vint4 load. */ +TEST(SuiteVint4, CopyLoad) +{ + vint4 s(11, 22, 33, 44); + vint4 a(s.m); + EXPECT_EQ(a.lane<0>(), 11); + EXPECT_EQ(a.lane<1>(), 22); + EXPECT_EQ(a.lane<2>(), 33); + EXPECT_EQ(a.lane<3>(), 44); +} + +/** @brief Test vint4 scalar lane set. */ +TEST(int4, SetLane) +{ + vint4 a(0); + + a.set_lane<0>(1); + EXPECT_EQ(a.lane<0>(), 1); + EXPECT_EQ(a.lane<1>(), 0); + EXPECT_EQ(a.lane<2>(), 0); + EXPECT_EQ(a.lane<3>(), 0); + + a.set_lane<1>(2); + EXPECT_EQ(a.lane<0>(), 1); + EXPECT_EQ(a.lane<1>(), 2); + EXPECT_EQ(a.lane<2>(), 0); + EXPECT_EQ(a.lane<3>(), 0); + + a.set_lane<2>(3); + EXPECT_EQ(a.lane<0>(), 1); + EXPECT_EQ(a.lane<1>(), 2); + EXPECT_EQ(a.lane<2>(), 3); + EXPECT_EQ(a.lane<3>(), 0); + + a.set_lane<3>(4); + EXPECT_EQ(a.lane<0>(), 1); + EXPECT_EQ(a.lane<1>(), 2); + EXPECT_EQ(a.lane<2>(), 3); + EXPECT_EQ(a.lane<3>(), 4); +} + +/** @brief Test vint4 zero. */ +TEST(SuiteVint4, Zero) +{ + vint4 a = vint4::zero(); + EXPECT_EQ(a.lane<0>(), 0); + EXPECT_EQ(a.lane<1>(), 0); + EXPECT_EQ(a.lane<2>(), 0); + EXPECT_EQ(a.lane<3>(), 0); +} + +/** @brief Test vint4 load1. */ +TEST(SuiteVint4, Load1) +{ + int s = 42; + vint4 a = vint4::load1(&s); + EXPECT_EQ(a.lane<0>(), 42); + EXPECT_EQ(a.lane<1>(), 42); + EXPECT_EQ(a.lane<2>(), 42); + EXPECT_EQ(a.lane<3>(), 42); +} + +/** @brief Test vint4 loada. */ +TEST(SuiteVint4, Loada) +{ + vint4 a = vint4::loada(&(s32_data[0])); + EXPECT_EQ(a.lane<0>(), 0); + EXPECT_EQ(a.lane<1>(), 1); + EXPECT_EQ(a.lane<2>(), 2); + EXPECT_EQ(a.lane<3>(), 3); +} + +/** @brief Test vint4 lane_id. */ +TEST(SuiteVint4, LaneID) +{ + vint4 a = vint4::lane_id(); + EXPECT_EQ(a.lane<0>(), 0); + EXPECT_EQ(a.lane<1>(), 1); + EXPECT_EQ(a.lane<2>(), 2); + EXPECT_EQ(a.lane<3>(), 3); +} + +/** @brief Test vint4 add. */ +TEST(SuiteVint4, vadd) +{ + vint4 a(1, 2, 3, 4); + vint4 b(2, 3, 4, 5); + a = a + b; + EXPECT_EQ(a.lane<0>(), 1 + 2); + EXPECT_EQ(a.lane<1>(), 2 + 3); + EXPECT_EQ(a.lane<2>(), 3 + 4); + EXPECT_EQ(a.lane<3>(), 4 + 5); +} + +/** @brief Test vint4 self-add. */ +TEST(SuiteVint4, vselfadd) +{ + vint4 a(1, 2, 3, 4); + vint4 b(2, 3, 4, 5); + a += b; + + EXPECT_EQ(a.lane<0>(), 1 + 2); + EXPECT_EQ(a.lane<1>(), 2 + 3); + EXPECT_EQ(a.lane<2>(), 3 + 4); + EXPECT_EQ(a.lane<3>(), 4 + 5); +} + +/** @brief Test vint4 add. */ +TEST(SuiteVint4, vsadd) +{ + vint4 a(1, 2, 3, 4); + int b = 5; + a = a + b; + EXPECT_EQ(a.lane<0>(), 1 + 5); + EXPECT_EQ(a.lane<1>(), 2 + 5); + EXPECT_EQ(a.lane<2>(), 3 + 5); + EXPECT_EQ(a.lane<3>(), 4 + 5); +} + +/** @brief Test vint4 sub. */ +TEST(SuiteVint4, vsub) +{ + vint4 a(1, 2, 4, 4); + vint4 b(2, 3, 3, 5); + a = a - b; + EXPECT_EQ(a.lane<0>(), 1 - 2); + EXPECT_EQ(a.lane<1>(), 2 - 3); + EXPECT_EQ(a.lane<2>(), 4 - 3); + EXPECT_EQ(a.lane<3>(), 4 - 5); +} + +/** @brief Test vint4 sub. */ +TEST(SuiteVint4, vssub) +{ + vint4 a(1, 2, 4, 4); + int b = 5; + a = a - b; + EXPECT_EQ(a.lane<0>(), 1 - 5); + EXPECT_EQ(a.lane<1>(), 2 - 5); + EXPECT_EQ(a.lane<2>(), 4 - 5); + EXPECT_EQ(a.lane<3>(), 4 - 5); +} + +/** @brief Test vint4 mul. */ +TEST(SuiteVint4, vmul) +{ + vint4 a(1, 2, 4, 4); + vint4 b(2, 3, 3, 5); + a = a * b; + EXPECT_EQ(a.lane<0>(), 1 * 2); + EXPECT_EQ(a.lane<1>(), 2 * 3); + EXPECT_EQ(a.lane<2>(), 4 * 3); + EXPECT_EQ(a.lane<3>(), 4 * 5); +} + +/** @brief Test vint4 mul. */ +TEST(SuiteVint4, vsmul) +{ + vint4 a(1, 2, 4, 4); + a = a * 3; + EXPECT_EQ(a.lane<0>(), 1 * 3); + EXPECT_EQ(a.lane<1>(), 2 * 3); + EXPECT_EQ(a.lane<2>(), 4 * 3); + EXPECT_EQ(a.lane<3>(), 4 * 3); + + vint4 b(1, 2, -4, 4); + b = b * -3; + EXPECT_EQ(b.lane<0>(), 1 * -3); + EXPECT_EQ(b.lane<1>(), 2 * -3); + EXPECT_EQ(b.lane<2>(), -4 * -3); + EXPECT_EQ(b.lane<3>(), 4 * -3); +} + +/** @brief Test vint4 bitwise invert. */ +TEST(SuiteVint4, bit_invert) +{ + vint4 a(-1, 0, 1, 2); + a = ~a; + EXPECT_EQ(a.lane<0>(), ~-1); + EXPECT_EQ(a.lane<1>(), ~0); + EXPECT_EQ(a.lane<2>(), ~1); + EXPECT_EQ(a.lane<3>(), ~2); +} + +/** @brief Test vint4 bitwise or. */ +TEST(SuiteVint4, bit_vor) +{ + vint4 a(1, 2, 3, 4); + vint4 b(2, 3, 4, 5); + a = a | b; + EXPECT_EQ(a.lane<0>(), 3); + EXPECT_EQ(a.lane<1>(), 3); + EXPECT_EQ(a.lane<2>(), 7); + EXPECT_EQ(a.lane<3>(), 5); +} + +TEST(SuiteVint4, bit_vsor) +{ + vint4 a(1, 2, 3, 4); + int b = 2; + a = a | b; + EXPECT_EQ(a.lane<0>(), 3); + EXPECT_EQ(a.lane<1>(), 2); + EXPECT_EQ(a.lane<2>(), 3); + EXPECT_EQ(a.lane<3>(), 6); +} + +/** @brief Test vint4 bitwise and. */ +TEST(SuiteVint4, bit_vand) +{ + vint4 a(1, 2, 3, 4); + vint4 b(2, 3, 4, 5); + a = a & b; + EXPECT_EQ(a.lane<0>(), 0); + EXPECT_EQ(a.lane<1>(), 2); + EXPECT_EQ(a.lane<2>(), 0); + EXPECT_EQ(a.lane<3>(), 4); +} + +/** @brief Test vint4 bitwise and. */ +TEST(SuiteVint4, bit_vsand) +{ + vint4 a(1, 2, 3, 4); + int b = 2; + a = a & b; + EXPECT_EQ(a.lane<0>(), 0); + EXPECT_EQ(a.lane<1>(), 2); + EXPECT_EQ(a.lane<2>(), 2); + EXPECT_EQ(a.lane<3>(), 0); +} + +/** @brief Test vint4 bitwise xor. */ +TEST(SuiteVint4, bit_vxor) +{ + vint4 a(1, 2, 3, 4); + vint4 b(2, 3, 4, 5); + a = a ^ b; + EXPECT_EQ(a.lane<0>(), 3); + EXPECT_EQ(a.lane<1>(), 1); + EXPECT_EQ(a.lane<2>(), 7); + EXPECT_EQ(a.lane<3>(), 1); +} + +/** @brief Test vint4 bitwise xor. */ +TEST(SuiteVint4, bit_vsxor) +{ + vint4 a(1, 2, 3, 4); + int b = 2; + a = a ^ b; + EXPECT_EQ(a.lane<0>(), 3); + EXPECT_EQ(a.lane<1>(), 0); + EXPECT_EQ(a.lane<2>(), 1); + EXPECT_EQ(a.lane<3>(), 6); +} + +/** @brief Test vint4 ceq. */ +TEST(SuiteVint4, ceq) +{ + vint4 a1(1, 2, 3, 4); + vint4 b1(0, 1, 2, 3); + vmask4 r1 = a1 == b1; + EXPECT_EQ(0u, mask(r1)); + EXPECT_EQ(false, any(r1)); + EXPECT_EQ(false, all(r1)); + + vint4 a2(1, 2, 3, 4); + vint4 b2(1, 0, 0, 0); + vmask4 r2 = a2 == b2; + EXPECT_EQ(0x1u, mask(r2)); + EXPECT_EQ(true, any(r2)); + EXPECT_EQ(false, all(r2)); + + vint4 a3(1, 2, 3, 4); + vint4 b3(1, 0, 3, 0); + vmask4 r3 = a3 == b3; + EXPECT_EQ(0x5u, mask(r3)); + EXPECT_EQ(true, any(r3)); + EXPECT_EQ(false, all(r3)); + + vint4 a4(1, 2, 3, 4); + vmask4 r4 = a4 == a4; + EXPECT_EQ(0xFu, mask(r4)); + EXPECT_EQ(true, any(r4)); + EXPECT_EQ(true, all(r4)); +} + +/** @brief Test vint4 cne. */ +TEST(SuiteVint4, cne) +{ + vint4 a1(1, 2, 3, 4); + vint4 b1(0, 1, 2, 3); + vmask4 r1 = a1 != b1; + EXPECT_EQ(0xFu, mask(r1)); + EXPECT_EQ(true, any(r1)); + EXPECT_EQ(true, all(r1)); + + vint4 a2(1, 2, 3, 4); + vint4 b2(1, 0, 0, 0); + vmask4 r2 = a2 != b2; + EXPECT_EQ(0xEu, mask(r2)); + EXPECT_EQ(true, any(r2)); + EXPECT_EQ(false, all(r2)); + + vint4 a3(1, 2, 3, 4); + vint4 b3(1, 0, 3, 0); + vmask4 r3 = a3 != b3; + EXPECT_EQ(0xAu, mask(r3)); + EXPECT_EQ(true, any(r3)); + EXPECT_EQ(false, all(r3)); + + vint4 a4(1, 2, 3, 4); + vmask4 r4 = a4 != a4; + EXPECT_EQ(0u, mask(r4)); + EXPECT_EQ(false, any(r4)); + EXPECT_EQ(false, all(r4)); +} + +/** @brief Test vint4 clt. */ +TEST(SuiteVint4, clt) +{ + vint4 a(1, 2, 3, 4); + vint4 b(0, 3, 3, 5); + vmask4 r = a < b; + EXPECT_EQ(0xAu, mask(r)); +} + +/** @brief Test vint4 cgt. */ +TEST(SuiteVint4, cle) +{ + vint4 a(1, 2, 3, 4); + vint4 b(0, 3, 3, 5); + vmask4 r = a > b; + EXPECT_EQ(0x1u, mask(r)); +} + +/** @brief Test vint4 lsl. */ +TEST(SuiteVint4, lsl) +{ + vint4 a(1, 2, 4, 4); + a = lsl<0>(a); + EXPECT_EQ(a.lane<0>(), 1); + EXPECT_EQ(a.lane<1>(), 2); + EXPECT_EQ(a.lane<2>(), 4); + EXPECT_EQ(a.lane<3>(), 4); + + a = lsl<1>(a); + EXPECT_EQ(a.lane<0>(), 2); + EXPECT_EQ(a.lane<1>(), 4); + EXPECT_EQ(a.lane<2>(), 8); + EXPECT_EQ(a.lane<3>(), 8); + + a = lsl<2>(a); + EXPECT_EQ(a.lane<0>(), 8); + EXPECT_EQ(a.lane<1>(), 16); + EXPECT_EQ(a.lane<2>(), 32); + EXPECT_EQ(a.lane<3>(), 32); +} + +/** @brief Test vint4 lsr. */ +TEST(SuiteVint4, lsr) +{ + vint4 a(1, 2, 4, -4); + a = lsr<0>(a); + EXPECT_EQ(a.lane<0>(), 1); + EXPECT_EQ(a.lane<1>(), 2); + EXPECT_EQ(a.lane<2>(), 4); + EXPECT_EQ(a.lane<3>(), static_cast(0xFFFFFFFC)); + + a = lsr<1>(a); + EXPECT_EQ(a.lane<0>(), 0); + EXPECT_EQ(a.lane<1>(), 1); + EXPECT_EQ(a.lane<2>(), 2); + EXPECT_EQ(a.lane<3>(), 0x7FFFFFFE); + + a = lsr<2>(a); + EXPECT_EQ(a.lane<0>(), 0); + EXPECT_EQ(a.lane<1>(), 0); + EXPECT_EQ(a.lane<2>(), 0); + EXPECT_EQ(a.lane<3>(), 0x1FFFFFFF); +} + +/** @brief Test vint4 asr. */ +TEST(SuiteVint4, asr) +{ + vint4 a(1, 2, 4, -4); + a = asr<0>(a); + EXPECT_EQ(a.lane<0>(), 1); + EXPECT_EQ(a.lane<1>(), 2); + EXPECT_EQ(a.lane<2>(), 4); + EXPECT_EQ(a.lane<3>(), -4); + + a = asr<1>(a); + EXPECT_EQ(a.lane<0>(), 0); + EXPECT_EQ(a.lane<1>(), 1); + EXPECT_EQ(a.lane<2>(), 2); + EXPECT_EQ(a.lane<3>(), -2); + + // Note - quirk of asr is that you will get "stuck" at -1 + a = asr<2>(a); + EXPECT_EQ(a.lane<0>(), 0); + EXPECT_EQ(a.lane<1>(), 0); + EXPECT_EQ(a.lane<2>(), 0); + EXPECT_EQ(a.lane<3>(), -1); +} + +/** @brief Test vint4 min. */ +TEST(SuiteVint4, min) +{ + vint4 a(1, 2, 3, 4); + vint4 b(0, 3, 3, 5); + vint4 r = min(a, b); + EXPECT_EQ(r.lane<0>(), 0); + EXPECT_EQ(r.lane<1>(), 2); + EXPECT_EQ(r.lane<2>(), 3); + EXPECT_EQ(r.lane<3>(), 4); +} + +/** @brief Test vint4 max. */ +TEST(SuiteVint4, max) +{ + vint4 a(1, 2, 3, 4); + vint4 b(0, 3, 3, 5); + vint4 r = max(a, b); + EXPECT_EQ(r.lane<0>(), 1); + EXPECT_EQ(r.lane<1>(), 3); + EXPECT_EQ(r.lane<2>(), 3); + EXPECT_EQ(r.lane<3>(), 5); +} + +/** @brief Test vint4 clamp. */ +TEST(SuiteVint4, clamp) +{ + vint4 a(1, 2, 3, 4); + vint4 r = clamp(2, 3, a); + EXPECT_EQ(r.lane<0>(), 2); + EXPECT_EQ(r.lane<1>(), 2); + EXPECT_EQ(r.lane<2>(), 3); + EXPECT_EQ(r.lane<3>(), 3); +} + +/** @brief Test vint4 hmin. */ +TEST(SuiteVint4, hmin) +{ + vint4 a1(1, 2, 1, 2); + vint4 r1 = hmin(a1); + EXPECT_EQ(r1.lane<0>(), 1); + EXPECT_EQ(r1.lane<1>(), 1); + EXPECT_EQ(r1.lane<2>(), 1); + EXPECT_EQ(r1.lane<3>(), 1); + + vint4 a2(1, 2, -1, 5); + vint4 r2 = hmin(a2); + EXPECT_EQ(r2.lane<0>(), -1); + EXPECT_EQ(r2.lane<1>(), -1); + EXPECT_EQ(r2.lane<2>(), -1); + EXPECT_EQ(r2.lane<3>(), -1); +} + +/** @brief Test vint4 hmax. */ +TEST(SuiteVint4, hmax) +{ + vint4 a1(1, 3, 1, 2); + vint4 r1 = hmax(a1); + EXPECT_EQ(r1.lane<0>(), 3); + EXPECT_EQ(r1.lane<1>(), 3); + EXPECT_EQ(r1.lane<2>(), 3); + EXPECT_EQ(r1.lane<3>(), 3); + + vint4 a2(1, 2, -1, 5); + vint4 r2 = hmax(a2); + EXPECT_EQ(r2.lane<0>(), 5); + EXPECT_EQ(r2.lane<1>(), 5); + EXPECT_EQ(r2.lane<2>(), 5); + EXPECT_EQ(r2.lane<3>(), 5); +} + +/** @brief Test vint4 hadd_rgb_s. */ +TEST(SuiteVint4, hadd_rgb_s) +{ + vint4 a1(1, 3, 5, 7); + int r1 = hadd_rgb_s(a1); + EXPECT_EQ(r1, 9); + + vint4 a2(1, 2, -1, 5); + int r2 = hadd_rgb_s(a2); + EXPECT_EQ(r2, 2); +} + +/** @brief Test vint4 clz. */ +TEST(SuiteVint4, clz) +{ + int msb_set = static_cast(0x80000000); + vint4 a1(msb_set, 0x40000000, 0x20000000, 0x10000000); + vint4 r1 = clz(a1); + EXPECT_EQ(r1.lane<0>(), 0); + EXPECT_EQ(r1.lane<1>(), 1); + EXPECT_EQ(r1.lane<2>(), 2); + EXPECT_EQ(r1.lane<3>(), 3); + + vint4 a2(0x0, 0x1, 0x2, 0x4); + vint4 r2 = clz(a2); + EXPECT_EQ(r2.lane<0>(), 32); + EXPECT_EQ(r2.lane<1>(), 31); + EXPECT_EQ(r2.lane<2>(), 30); + EXPECT_EQ(r2.lane<3>(), 29); +} + +/** @brief Test vint4 two_to_the_n. */ +TEST(SuiteVint4, two_to_the_n) +{ + vint4 a1(0, 1, 2, 3); + vint4 r1 = two_to_the_n(a1); + EXPECT_EQ(r1.lane<0>(), 1 << 0); + EXPECT_EQ(r1.lane<1>(), 1 << 1); + EXPECT_EQ(r1.lane<2>(), 1 << 2); + EXPECT_EQ(r1.lane<3>(), 1 << 3); + + vint4 a2(27, 28, 29, 30); + vint4 r2 = two_to_the_n(a2); + EXPECT_EQ(r2.lane<0>(), 1 << 27); + EXPECT_EQ(r2.lane<1>(), 1 << 28); + EXPECT_EQ(r2.lane<2>(), 1 << 29); + EXPECT_EQ(r2.lane<3>(), 1 << 30); + + // Shifts higher than 30 are not allowed as it overflows the int type; + // and results in implementation-defined behavior because of how we + // generate the shifted result in two_to_the_n(). + // - Shift by 31 shifts into sign bit + // - Shift by 32 shifts off the end +} + +/** @brief Test vint4 storea. */ +TEST(SuiteVint4, storea) +{ + ASTCENC_ALIGNAS int out[4]; + vint4 a(s32_data); + storea(a, out); + EXPECT_EQ(out[0], 0); + EXPECT_EQ(out[1], 1); + EXPECT_EQ(out[2], 2); + EXPECT_EQ(out[3], 3); +} + +/** @brief Test vint4 store. */ +TEST(SuiteVint4, store) +{ + ASTCENC_ALIGNAS int out[5]; + vint4 a(s32_data); + store(a, &(out[1])); + EXPECT_EQ(out[1], 0); + EXPECT_EQ(out[2], 1); + EXPECT_EQ(out[3], 2); + EXPECT_EQ(out[4], 3); +} + +/** @brief Test vint4 store_nbytes. */ +TEST(SuiteVint4, store_nbytes) +{ + ASTCENC_ALIGNAS int out; + vint4 a(42, 314, 75, 90); + store_nbytes(a, reinterpret_cast(&out)); + EXPECT_EQ(out, 42); +} + +/** @brief Test vint4 store_lanes_masked. */ +TEST(SuiteVint4, store_lanes_masked) +{ + uint8_t resulta[16] { 0 }; + + // Store nothing + vmask4 mask1 = vint4(0) == vint4(1); + vint4 data1 = vint4(1); + + store_lanes_masked(resulta, data1, mask1); + vint4 result1v = vint4::load(resulta); + vint4 expect1v = vint4::zero(); + EXPECT_TRUE(all(result1v == expect1v)); + + // Store half + vmask4 mask2 = vint4(1, 1, 0, 0) == vint4(1); + vint4 data2 = vint4(2); + + store_lanes_masked(resulta, data2, mask2); + vint4 result2v = vint4::load(resulta); + vint4 expect2v = vint4(2, 2, 0, 0); + EXPECT_TRUE(all(result2v == expect2v)); + + // Store all + vmask4 mask3 = vint4(1) == vint4(1); + vint4 data3 = vint4(3); + + store_lanes_masked(resulta, data3, mask3); + vint4 result3v = vint4::load(resulta); + vint4 expect3v = vint4(3); + EXPECT_TRUE(all(result3v == expect3v)); +} + +/** @brief Test vint4 store_lanes_masked to unaligned address. */ +TEST(SuiteVint4, store_lanes_masked_unaligned) +{ + uint8_t resulta[17] { 0 }; + + // Store nothing + vmask4 mask1 = vint4(0) == vint4(1); + vint4 data1 = vint4(1); + + store_lanes_masked(resulta + 1, data1, mask1); + vint4 result1v = vint4::load(resulta + 1); + vint4 expect1v = vint4::zero(); + EXPECT_TRUE(all(result1v == expect1v)); + + // Store half + vmask4 mask2 = vint4(1, 1, 0, 0) == vint4(1); + vint4 data2 = vint4(2); + + store_lanes_masked(resulta + 1, data2, mask2); + vint4 result2v = vint4::load(resulta + 1); + vint4 expect2v = vint4(2, 2, 0, 0); + EXPECT_TRUE(all(result2v == expect2v)); + + // Store all + vmask4 mask3 = vint4(1) == vint4(1); + vint4 data3 = vint4(3); + + store_lanes_masked(resulta + 1, data3, mask3); + vint4 result3v = vint4::load(resulta + 1); + vint4 expect3v = vint4(3); + EXPECT_TRUE(all(result3v == expect3v)); +} + +/** @brief Test vint4 pack_and_store_low_bytes. */ +TEST(SuiteVint4, pack_and_store_low_bytes) +{ + vint4 a(1, 2, 3, 4); + uint8_t bytes[4] { 0 }; + pack_and_store_low_bytes(a, bytes); + + EXPECT_EQ(bytes[0], 1); + EXPECT_EQ(bytes[1], 2); + EXPECT_EQ(bytes[2], 3); + EXPECT_EQ(bytes[3], 4); +} + +/** @brief Test vint4 select. */ +TEST(SuiteVint4, select) +{ + vint4 m1(1, 1, 1, 1); + vint4 m2(1, 2, 1, 2); + vmask4 cond = m1 == m2; + + vint4 a(1, 3, 3, 1); + vint4 b(4, 2, 2, 4); + + vint4 r1 = select(a, b, cond); + EXPECT_EQ(r1.lane<0>(), 4); + EXPECT_EQ(r1.lane<1>(), 3); + EXPECT_EQ(r1.lane<2>(), 2); + EXPECT_EQ(r1.lane<3>(), 1); + + vint4 r2 = select(b, a, cond); + EXPECT_EQ(r2.lane<0>(), 1); + EXPECT_EQ(r2.lane<1>(), 2); + EXPECT_EQ(r2.lane<2>(), 3); + EXPECT_EQ(r2.lane<3>(), 4); +} + +// VMASK4 tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +/** @brief Test vmask4 scalar literal constructor. */ +TEST(SuiteVmask4, scalar_literal_construct) +{ + vfloat4 m1a(0.0f, 0.0f, 0.0f, 0.0f); + vfloat4 m1b(1.0f, 1.0f, 1.0f, 1.0f); + vmask4 m1(true); + + vfloat4 r = select(m1a, m1b, m1); + + EXPECT_EQ(r.lane<0>(), 1.0f); + EXPECT_EQ(r.lane<1>(), 1.0f); + EXPECT_EQ(r.lane<2>(), 1.0f); + EXPECT_EQ(r.lane<3>(), 1.0f); + + r = select(m1b, m1a, m1); + + EXPECT_EQ(r.lane<0>(), 0.0f); + EXPECT_EQ(r.lane<1>(), 0.0f); + EXPECT_EQ(r.lane<2>(), 0.0f); + EXPECT_EQ(r.lane<3>(), 0.0f); +} + +/** @brief Test vmask4 literal constructor. */ +TEST(SuiteVmask4, literal_construct) +{ + vfloat4 m1a(0.0f, 0.0f, 0.0f, 0.0f); + vfloat4 m1b(1.0f, 1.0f, 1.0f, 1.0f); + vmask4 m1(true, false, true, false); + + vfloat4 r = select(m1a, m1b, m1); + + EXPECT_EQ(r.lane<0>(), 1.0f); + EXPECT_EQ(r.lane<1>(), 0.0f); + EXPECT_EQ(r.lane<2>(), 1.0f); + EXPECT_EQ(r.lane<3>(), 0.0f); +} + +/** @brief Test vmask4 or. */ +TEST(SuiteVmask4, TestOr) +{ + vfloat4 m1a(0, 1, 0, 1); + vfloat4 m1b(1, 1, 1, 1); + vmask4 m1 = m1a == m1b; + + vfloat4 m2a(1, 1, 0, 0); + vfloat4 m2b(1, 1, 1, 1); + vmask4 m2 = m2a == m2b; + + vmask4 r = m1 | m2; + EXPECT_EQ(mask(r), 0xBu); +} + +/** @brief Test vmask4 and. */ +TEST(SuiteVmask4, TestAnd) +{ + vfloat4 m1a(0, 1, 0, 1); + vfloat4 m1b(1, 1, 1, 1); + vmask4 m1 = m1a == m1b; + + vfloat4 m2a(1, 1, 0, 0); + vfloat4 m2b(1, 1, 1, 1); + vmask4 m2 = m2a == m2b; + + vmask4 r = m1 & m2; + EXPECT_EQ(mask(r), 0x2u); +} + +/** @brief Test vmask4 xor. */ +TEST(SuiteVmask4, TestXor) +{ + vfloat4 m1a(0, 1, 0, 1); + vfloat4 m1b(1, 1, 1, 1); + vmask4 m1 = m1a == m1b; + + vfloat4 m2a(1, 1, 0, 0); + vfloat4 m2b(1, 1, 1, 1); + vmask4 m2 = m2a == m2b; + + vmask4 r = m1 ^ m2; + EXPECT_EQ(mask(r), 0x9u); +} + +/** @brief Test vmask4 not. */ +TEST(SuiteVmask4, TestNot) +{ + vfloat4 m1a(0, 1, 0, 1); + vfloat4 m1b(1, 1, 1, 1); + vmask4 m1 = m1a == m1b; + vmask4 r = ~m1; + EXPECT_EQ(mask(r), 0x5u); +} + +/** @brief Test vint4 table permute. */ +TEST(SuiteVint4, vtable4_16x8) +{ + uint8_t data[16] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f + }; + + vtable4_16x8 table; + vtable_prepare(table, data); + + vint4 index(0, 7, 4, 15); + + vint4 result = vtable_lookup_32bit(table, index); + + EXPECT_EQ(result.lane<0>(), 0); + EXPECT_EQ(result.lane<1>(), 7); + EXPECT_EQ(result.lane<2>(), 4); + EXPECT_EQ(result.lane<3>(), 15); +} + +/** @brief Test vint4 table permute. */ +TEST(SuiteVint4, vtable4_32x8) +{ + uint8_t data[32] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f + }; + + vtable4_32x8 table; + vtable_prepare(table, data); + + vint4 index(0, 7, 4, 31); + + vint4 result = vtable_lookup_32bit(table, index); + + EXPECT_EQ(result.lane<0>(), 0); + EXPECT_EQ(result.lane<1>(), 7); + EXPECT_EQ(result.lane<2>(), 4); + EXPECT_EQ(result.lane<3>(), 31); +} + +/** @brief Test vint4 table permute. */ +TEST(SuiteVint4, vtable4_64x8) +{ + uint8_t data[64] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f + }; + + vtable4_64x8 table; + vtable_prepare(table, data); + + vint4 index(0, 7, 38, 63); + + vint4 result = vtable_lookup_32bit(table, index); + + EXPECT_EQ(result.lane<0>(), 0); + EXPECT_EQ(result.lane<1>(), 7); + EXPECT_EQ(result.lane<2>(), 38); + EXPECT_EQ(result.lane<3>(), 63); +} + +/** @brief Test vint4 rgba byte interleave. */ +TEST(SuiteVint4, interleave_rgba8) +{ + vint4 r(0x01, 0x11, 0x21, 0x31); + vint4 g(0x02, 0x12, 0x22, 0x32); + vint4 b(0x03, 0x13, 0x23, 0x33); + vint4 a(0x04, 0x14, 0x24, 0x34); + + vint4 result = interleave_rgba8(r, g, b, a); + +#if !defined(ASTCENC_BIG_ENDIAN) + EXPECT_EQ(result.lane<0>(), 0x04030201); + EXPECT_EQ(result.lane<1>(), 0x14131211); + EXPECT_EQ(result.lane<2>(), 0x24232221); + EXPECT_EQ(result.lane<3>(), 0x34333231); +#else + EXPECT_EQ(result.lane<0>(), 0x01020304); + EXPECT_EQ(result.lane<1>(), 0x11121314); + EXPECT_EQ(result.lane<2>(), 0x21222324); + EXPECT_EQ(result.lane<3>(), 0x31323334); +#endif +} + +# if ASTCENC_SIMD_WIDTH == 8 + +// VFLOAT8 tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +/** @brief Test unaligned vfloat8 data load. */ +TEST(SuiteVfloat8, UnalignedLoad) +{ + vfloat8 a(&(f32_data[1])); + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 1.0f); + EXPECT_EQ(ra[1], 2.0f); + EXPECT_EQ(ra[2], 3.0f); + EXPECT_EQ(ra[3], 4.0f); + EXPECT_EQ(ra[4], 5.0f); + EXPECT_EQ(ra[5], 6.0f); + EXPECT_EQ(ra[6], 7.0f); + EXPECT_EQ(ra[7], 8.0f); +} + +/** @brief Test scalar duplicated vfloat8 load. */ +TEST(SuiteVfloat8, ScalarDupLoad) +{ + vfloat8 a(1.1f); + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 1.1f); + EXPECT_EQ(ra[1], 1.1f); + EXPECT_EQ(ra[2], 1.1f); + EXPECT_EQ(ra[3], 1.1f); + EXPECT_EQ(ra[4], 1.1f); + EXPECT_EQ(ra[5], 1.1f); + EXPECT_EQ(ra[6], 1.1f); + EXPECT_EQ(ra[7], 1.1f); +} + +/** @brief Test scalar vfloat8 load. */ +TEST(SuiteVfloat8, ScalarLoad) +{ + vfloat8 a = vfloat8_lit(1.1f, 2.2f, 3.3f, 4.4f, 5.5f, 6.6f, 7.7f, 8.8f); + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 1.1f); + EXPECT_EQ(ra[1], 2.2f); + EXPECT_EQ(ra[2], 3.3f); + EXPECT_EQ(ra[3], 4.4f); + EXPECT_EQ(ra[4], 5.5f); + EXPECT_EQ(ra[5], 6.6f); + EXPECT_EQ(ra[6], 7.7f); + EXPECT_EQ(ra[7], 8.8f); +} + +/** @brief Test copy vfloat8 load. */ +TEST(SuiteVfloat8, CopyLoad) +{ + vfloat8 s = vfloat8_lit(1.1f, 2.2f, 3.3f, 4.4f, 5.5f, 6.6f, 7.7f, 8.8f); + vfloat8 a(s.m); + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 1.1f); + EXPECT_EQ(ra[1], 2.2f); + EXPECT_EQ(ra[2], 3.3f); + EXPECT_EQ(ra[3], 4.4f); + EXPECT_EQ(ra[4], 5.5f); + EXPECT_EQ(ra[5], 6.6f); + EXPECT_EQ(ra[6], 7.7f); + EXPECT_EQ(ra[7], 8.8f); +} + +/** @brief Test vfloat8 zero. */ +TEST(SuiteVfloat8, Zero) +{ + vfloat8 a = vfloat8::zero(); + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 0.0f); + EXPECT_EQ(ra[1], 0.0f); + EXPECT_EQ(ra[2], 0.0f); + EXPECT_EQ(ra[3], 0.0f); + EXPECT_EQ(ra[4], 0.0f); + EXPECT_EQ(ra[5], 0.0f); + EXPECT_EQ(ra[6], 0.0f); + EXPECT_EQ(ra[7], 0.0f); +} + +/** @brief Test vfloat8 load1. */ +TEST(SuiteVfloat8, Load1) +{ + float s = 3.14f; + vfloat8 a = vfloat8::load1(&s); + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 3.14f); + EXPECT_EQ(ra[1], 3.14f); + EXPECT_EQ(ra[2], 3.14f); + EXPECT_EQ(ra[3], 3.14f); + EXPECT_EQ(ra[4], 3.14f); + EXPECT_EQ(ra[5], 3.14f); + EXPECT_EQ(ra[6], 3.14f); + EXPECT_EQ(ra[7], 3.14f); +} + +/** @brief Test vfloat8 loada. */ +TEST(SuiteVfloat8, Loada) +{ + vfloat8 a = vfloat8::loada(&(f32_data[0])); + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 0.0f); + EXPECT_EQ(ra[1], 1.0f); + EXPECT_EQ(ra[2], 2.0f); + EXPECT_EQ(ra[3], 3.0f); + EXPECT_EQ(ra[4], 4.0f); + EXPECT_EQ(ra[5], 5.0f); + EXPECT_EQ(ra[6], 6.0f); + EXPECT_EQ(ra[7], 7.0f); +} + +/** @brief Test vfloat8 add. */ +TEST(SuiteVfloat8, vadd) +{ + vfloat8 a = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + vfloat8 b = vfloat8_lit(0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); + a = a + b; + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 1.0f + 0.1f); + EXPECT_EQ(ra[1], 2.0f + 0.2f); + EXPECT_EQ(ra[2], 3.0f + 0.3f); + EXPECT_EQ(ra[3], 4.0f + 0.4f); + EXPECT_EQ(ra[4], 5.0f + 0.5f); + EXPECT_EQ(ra[5], 6.0f + 0.6f); + EXPECT_EQ(ra[6], 7.0f + 0.7f); + EXPECT_EQ(ra[7], 8.0f + 0.8f); +} + +/** @brief Test vfloat8 sub. */ +TEST(SuiteVfloat8, vsub) +{ + vfloat8 a = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + vfloat8 b = vfloat8_lit(0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); + a = a - b; + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 1.0f - 0.1f); + EXPECT_EQ(ra[1], 2.0f - 0.2f); + EXPECT_EQ(ra[2], 3.0f - 0.3f); + EXPECT_EQ(ra[3], 4.0f - 0.4f); + EXPECT_EQ(ra[4], 5.0f - 0.5f); + EXPECT_EQ(ra[5], 6.0f - 0.6f); + EXPECT_EQ(ra[6], 7.0f - 0.7f); + EXPECT_EQ(ra[7], 8.0f - 0.8f); +} + +/** @brief Test vfloat8 mul. */ +TEST(SuiteVfloat8, vmul) +{ + vfloat8 a = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + vfloat8 b = vfloat8_lit(0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); + a = a * b; + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 1.0f * 0.1f); + EXPECT_EQ(ra[1], 2.0f * 0.2f); + EXPECT_EQ(ra[2], 3.0f * 0.3f); + EXPECT_EQ(ra[3], 4.0f * 0.4f); + EXPECT_EQ(ra[4], 5.0f * 0.5f); + EXPECT_EQ(ra[5], 6.0f * 0.6f); + EXPECT_EQ(ra[6], 7.0f * 0.7f); + EXPECT_EQ(ra[7], 8.0f * 0.8f); +} + +/** @brief Test vfloat8 mul. */ +TEST(SuiteVfloat8, vsmul) +{ + vfloat8 a = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + float b = 3.14f; + a = a * b; + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 1.0f * 3.14f); + EXPECT_EQ(ra[1], 2.0f * 3.14f); + EXPECT_EQ(ra[2], 3.0f * 3.14f); + EXPECT_EQ(ra[3], 4.0f * 3.14f); + EXPECT_EQ(ra[4], 5.0f * 3.14f); + EXPECT_EQ(ra[5], 6.0f * 3.14f); + EXPECT_EQ(ra[6], 7.0f * 3.14f); + EXPECT_EQ(ra[7], 8.0f * 3.14f); +} + +/** @brief Test vfloat8 mul. */ +TEST(SuiteVfloat8, svmul) +{ + float a = 3.14f; + vfloat8 b = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + b = a * b; + + alignas(32) float ra[8]; + storea(b, ra); + + EXPECT_EQ(ra[0], 3.14f * 1.0f); + EXPECT_EQ(ra[1], 3.14f * 2.0f); + EXPECT_EQ(ra[2], 3.14f * 3.0f); + EXPECT_EQ(ra[3], 3.14f * 4.0f); + EXPECT_EQ(ra[4], 3.14f * 5.0f); + EXPECT_EQ(ra[5], 3.14f * 6.0f); + EXPECT_EQ(ra[6], 3.14f * 7.0f); + EXPECT_EQ(ra[7], 3.14f * 8.0f); +} + +/** @brief Test vfloat8 div. */ +TEST(SuiteVfloat8, vdiv) +{ + vfloat8 a = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + vfloat8 b = vfloat8_lit(0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); + a = a / b; + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 1.0f / 0.1f); + EXPECT_EQ(ra[1], 2.0f / 0.2f); + EXPECT_EQ(ra[2], 3.0f / 0.3f); + EXPECT_EQ(ra[3], 4.0f / 0.4f); + EXPECT_EQ(ra[4], 5.0f / 0.5f); + EXPECT_EQ(ra[5], 6.0f / 0.6f); + EXPECT_EQ(ra[6], 7.0f / 0.7f); + EXPECT_EQ(ra[7], 8.0f / 0.8f); +} + +/** @brief Test vfloat8 div. */ +TEST(SuiteVfloat8, vsdiv) +{ + vfloat8 a = vfloat8_lit(0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); + float b = 3.14f; + vfloat8 r = a / b; + + alignas(32) float ra[8]; + storea(r, ra); + + EXPECT_EQ(ra[0], 0.1f / 3.14f); + EXPECT_EQ(ra[1], 0.2f / 3.14f); + EXPECT_EQ(ra[2], 0.3f / 3.14f); + EXPECT_EQ(ra[3], 0.4f / 3.14f); + EXPECT_EQ(ra[4], 0.5f / 3.14f); + EXPECT_EQ(ra[5], 0.6f / 3.14f); + EXPECT_EQ(ra[6], 0.7f / 3.14f); + EXPECT_EQ(ra[7], 0.8f / 3.14f); +} + +/** @brief Test vfloat8 div. */ +TEST(SuiteVfloat8, svdiv) +{ + float a = 3.14f; + vfloat8 b = vfloat8_lit(0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); + vfloat8 r = a / b; + + alignas(32) float ra[8]; + storea(r, ra); + + EXPECT_EQ(ra[0], 3.14f / 0.1f); + EXPECT_EQ(ra[1], 3.14f / 0.2f); + EXPECT_EQ(ra[2], 3.14f / 0.3f); + EXPECT_EQ(ra[3], 3.14f / 0.4f); + EXPECT_EQ(ra[4], 3.14f / 0.5f); + EXPECT_EQ(ra[5], 3.14f / 0.6f); + EXPECT_EQ(ra[6], 3.14f / 0.7f); + EXPECT_EQ(ra[7], 3.14f / 0.8f); +} + +/** @brief Test vfloat8 ceq. */ +TEST(SuiteVfloat8, ceq) +{ + vfloat8 a1 = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + vfloat8 b1 = vfloat8_lit(0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); + vmask8 r1 = a1 == b1; + EXPECT_EQ(0u, mask(r1)); + EXPECT_EQ(false, any(r1)); + EXPECT_EQ(false, all(r1)); + + vfloat8 a2 = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + vfloat8 b2 = vfloat8_lit(1.0f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); + vmask8 r2 = a2 == b2; + EXPECT_EQ(0x1u, mask(r2)); + EXPECT_EQ(true, any(r2)); + EXPECT_EQ(false, all(r2)); + + vfloat8 a3 = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + vfloat8 b3 = vfloat8_lit(1.0f, 0.2f, 3.0f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); + vmask8 r3 = a3 == b3; + EXPECT_EQ(0x5u, mask(r3)); + EXPECT_EQ(true, any(r3)); + EXPECT_EQ(false, all(r3)); + + vfloat8 a4 = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + vmask8 r4 = a4 == a4; + EXPECT_EQ(0xFFu, mask(r4)); + EXPECT_EQ(true, any(r4)); + EXPECT_EQ(true, all(r4)); +} + +/** @brief Test vfloat8 cne. */ +TEST(SuiteVfloat8, cne) +{ + vfloat8 a1 = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + vfloat8 b1 = vfloat8_lit(0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); + vmask8 r1 = a1 != b1; + EXPECT_EQ(0xFFu, mask(r1)); + EXPECT_EQ(true, any(r1)); + EXPECT_EQ(true, all(r1)); + + vfloat8 a2 = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + vfloat8 b2 = vfloat8_lit(1.0f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); + vmask8 r2 = a2 != b2; + EXPECT_EQ(0xFEu, mask(r2)); + EXPECT_EQ(true, any(r2)); + EXPECT_EQ(false, all(r2)); + + vfloat8 a3 = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + vfloat8 b3 = vfloat8_lit(1.0f, 0.2f, 3.0f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); + vmask8 r3 = a3 != b3; + EXPECT_EQ(0xFAu, mask(r3)); + EXPECT_EQ(true, any(r3)); + EXPECT_EQ(false, all(r3)); + + vfloat8 a4 = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); + vmask8 r4 = a4 != a4; + EXPECT_EQ(0u, mask(r4)); + EXPECT_EQ(false, any(r4)); + EXPECT_EQ(false, all(r4)); +} + +/** @brief Test vfloat8 clt. */ +TEST(SuiteVfloat8, clt) +{ + vfloat8 a = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f); + vfloat8 b = vfloat8_lit(0.9f, 2.1f, 3.0f, 4.1f, 0.9f, 2.1f, 3.0f, 4.1f); + vmask8 r = a < b; + EXPECT_EQ(0xAAu, mask(r)); +} + +/** @brief Test vfloat8 cle. */ +TEST(SuiteVfloat8, cle) +{ + vfloat8 a = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f); + vfloat8 b = vfloat8_lit(0.9f, 2.1f, 3.0f, 4.1f, 0.9f, 2.1f, 3.0f, 4.1f); + vmask8 r = a <= b; + EXPECT_EQ(0xEEu, mask(r)); +} + +/** @brief Test vfloat8 cgt. */ +TEST(SuiteVfloat8, cgt) +{ + vfloat8 a = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f); + vfloat8 b = vfloat8_lit(0.9f, 2.1f, 3.0f, 4.1f, 0.9f, 2.1f, 3.0f, 4.1f); + vmask8 r = a > b; + EXPECT_EQ(0x11u, mask(r)); +} + +/** @brief Test vfloat8 cge. */ +TEST(SuiteVfloat8, cge) +{ + vfloat8 a = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f); + vfloat8 b = vfloat8_lit(0.9f, 2.1f, 3.0f, 4.1f, 0.9f, 2.1f, 3.0f, 4.1f); + vmask8 r = a >= b; + EXPECT_EQ(0x55u, mask(r)); +} + +/** @brief Test vfloat8 min. */ +TEST(SuiteVfloat8, min) +{ + vfloat8 a = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f); + vfloat8 b = vfloat8_lit(0.9f, 2.1f, 3.0f, 4.1f, 0.9f, 2.1f, 3.0f, 4.1f); + vfloat8 r = min(a, b); + + alignas(32) float ra[8]; + storea(r, ra); + + EXPECT_EQ(ra[0], 0.9f); + EXPECT_EQ(ra[1], 2.0f); + EXPECT_EQ(ra[2], 3.0f); + EXPECT_EQ(ra[3], 4.0f); + EXPECT_EQ(ra[4], 0.9f); + EXPECT_EQ(ra[5], 2.0f); + EXPECT_EQ(ra[6], 3.0f); + EXPECT_EQ(ra[7], 4.0f); +} + +/** @brief Test vfloat8 max. */ +TEST(SuiteVfloat8, max) +{ + vfloat8 a = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f); + vfloat8 b = vfloat8_lit(0.9f, 2.1f, 3.0f, 4.1f, 0.9f, 2.1f, 3.0f, 4.1f); + vfloat8 r = max(a, b); + + alignas(32) float ra[8]; + storea(r, ra); + + EXPECT_EQ(ra[0], 1.0f); + EXPECT_EQ(ra[1], 2.1f); + EXPECT_EQ(ra[2], 3.0f); + EXPECT_EQ(ra[3], 4.1f); + EXPECT_EQ(ra[4], 1.0f); + EXPECT_EQ(ra[5], 2.1f); + EXPECT_EQ(ra[6], 3.0f); + EXPECT_EQ(ra[7], 4.1f); +} + +/** @brief Test vfloat8 clamp. */ +TEST(SuiteVfloat8, clamp) +{ + vfloat8 a1 = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f); + vfloat8 r1 = clamp(2.1f, 3.0f, a1); + + alignas(32) float ra[8]; + storea(r1, ra); + + EXPECT_EQ(ra[0], 2.1f); + EXPECT_EQ(ra[1], 2.1f); + EXPECT_EQ(ra[2], 3.0f); + EXPECT_EQ(ra[3], 3.0f); + EXPECT_EQ(ra[4], 2.1f); + EXPECT_EQ(ra[5], 2.1f); + EXPECT_EQ(ra[6], 3.0f); + EXPECT_EQ(ra[7], 3.0f); + + vfloat8 a2 = vfloat8_lit(1.0f, 2.0f, qnan, 4.0f, 1.0f, 2.0f, qnan, 4.0f); + vfloat8 r2 = clamp(2.1f, 3.0f, a2); + + storea(r2, ra); + + EXPECT_EQ(ra[0], 2.1f); + EXPECT_EQ(ra[1], 2.1f); + EXPECT_EQ(ra[2], 2.1f); + EXPECT_EQ(ra[3], 3.0f); + EXPECT_EQ(ra[4], 2.1f); + EXPECT_EQ(ra[5], 2.1f); + EXPECT_EQ(ra[6], 2.1f); + EXPECT_EQ(ra[7], 3.0f); +} + +/** @brief Test vfloat8 clampz. */ +TEST(SuiteVfloat8, clampzo) +{ + vfloat8 a1 = vfloat8_lit(-1.0f, 0.0f, 0.1f, 4.0f, -1.0f, 0.0f, 0.1f, 4.0f); + vfloat8 r1 = clampzo(a1); + + alignas(32) float ra[8]; + storea(r1, ra); + + EXPECT_EQ(ra[0], 0.0f); + EXPECT_EQ(ra[1], 0.0f); + EXPECT_EQ(ra[2], 0.1f); + EXPECT_EQ(ra[3], 1.0f); + EXPECT_EQ(ra[4], 0.0f); + EXPECT_EQ(ra[5], 0.0f); + EXPECT_EQ(ra[6], 0.1f); + EXPECT_EQ(ra[7], 1.0f); + + vfloat8 a2 = vfloat8_lit(-1.0f, 0.0f, qnan, 4.0f, -1.0f, 0.0f, qnan, 4.0f); + vfloat8 r2 = clampzo(a2); + + storea(r2, ra); + + EXPECT_EQ(ra[0], 0.0f); + EXPECT_EQ(ra[1], 0.0f); + EXPECT_EQ(ra[2], 0.0f); + EXPECT_EQ(ra[3], 1.0f); + EXPECT_EQ(ra[4], 0.0f); + EXPECT_EQ(ra[5], 0.0f); + EXPECT_EQ(ra[6], 0.0f); + EXPECT_EQ(ra[7], 1.0f); +} + +/** @brief Test vfloat8 abs. */ +TEST(SuiteVfloat8, abs) +{ + vfloat8 a = vfloat8_lit(-1.0f, 0.0f, 0.1f, 4.0f, -1.0f, 0.0f, 0.1f, 4.0f); + vfloat8 r = abs(a); + + alignas(32) float ra[8]; + storea(r, ra); + + EXPECT_EQ(ra[0], 1.0f); + EXPECT_EQ(ra[1], 0.0f); + EXPECT_EQ(ra[2], 0.1f); + EXPECT_EQ(ra[3], 4.0f); + EXPECT_EQ(ra[4], 1.0f); + EXPECT_EQ(ra[5], 0.0f); + EXPECT_EQ(ra[6], 0.1f); + EXPECT_EQ(ra[7], 4.0f); +} + +/** @brief Test vfloat8 round. */ +TEST(SuiteVfloat8, round) +{ + vfloat8 a = vfloat8_lit(1.1f, 1.5f, 1.6f, 4.0f, 1.1f, 1.5f, 1.6f, 4.0f); + vfloat8 r = round(a); + + alignas(32) float ra[8]; + storea(r, ra); + + EXPECT_EQ(ra[0], 1.0f); + EXPECT_EQ(ra[1], 2.0f); + EXPECT_EQ(ra[2], 2.0f); + EXPECT_EQ(ra[3], 4.0f); + EXPECT_EQ(ra[4], 1.0f); + EXPECT_EQ(ra[5], 2.0f); + EXPECT_EQ(ra[6], 2.0f); + EXPECT_EQ(ra[7], 4.0f); +} + +/** @brief Test vfloat8 hmin. */ +TEST(SuiteVfloat8, hmin) +{ + vfloat8 a1 = vfloat8_lit(1.1f, 1.5f, 1.6f, 4.0f, 1.1f, 1.5f, 1.6f, 4.0f); + vfloat8 r1 = hmin(a1); + + alignas(32) float ra[8]; + storea(r1, ra); + + EXPECT_EQ(ra[0], 1.1f); + EXPECT_EQ(ra[1], 1.1f); + EXPECT_EQ(ra[2], 1.1f); + EXPECT_EQ(ra[3], 1.1f); + EXPECT_EQ(ra[4], 1.1f); + EXPECT_EQ(ra[5], 1.1f); + EXPECT_EQ(ra[6], 1.1f); + EXPECT_EQ(ra[7], 1.1f); + + vfloat8 a2 = vfloat8_lit(1.1f, 1.5f, 1.6f, 0.2f, 1.1f, 1.5f, 1.6f, 0.2f); + vfloat8 r2 = hmin(a2); + + storea(r2, ra); + + EXPECT_EQ(ra[0], 0.2f); + EXPECT_EQ(ra[1], 0.2f); + EXPECT_EQ(ra[2], 0.2f); + EXPECT_EQ(ra[3], 0.2f); + EXPECT_EQ(ra[4], 0.2f); + EXPECT_EQ(ra[5], 0.2f); + EXPECT_EQ(ra[6], 0.2f); + EXPECT_EQ(ra[7], 0.2f); +} + +/** @brief Test vfloat8 hmin_s. */ +TEST(SuiteVfloat8, hmin_s) +{ + vfloat8 a1 = vfloat8_lit(1.1f, 1.5f, 1.6f, 4.0f, 1.1f, 1.5f, 1.6f, 4.0f); + float r1 = hmin_s(a1); + EXPECT_EQ(r1, 1.1f); + + vfloat8 a2 = vfloat8_lit(1.1f, 1.5f, 1.6f, 0.2f, 1.1f, 1.5f, 1.6f, 0.2f); + float r2 = hmin_s(a2); + EXPECT_EQ(r2, 0.2f); +} + +/** @brief Test vfloat8 hmax. */ +TEST(SuiteVfloat8, hmax) +{ + vfloat8 a1 = vfloat8_lit(1.1f, 1.5f, 1.6f, 4.0f, 1.1f, 1.5f, 1.6f, 4.0f); + vfloat8 r1 = hmax(a1); + + alignas(32) float ra[8]; + storea(r1, ra); + + EXPECT_EQ(ra[0], 4.0f); + EXPECT_EQ(ra[1], 4.0f); + EXPECT_EQ(ra[2], 4.0f); + EXPECT_EQ(ra[3], 4.0f); + EXPECT_EQ(ra[4], 4.0f); + EXPECT_EQ(ra[5], 4.0f); + EXPECT_EQ(ra[6], 4.0f); + EXPECT_EQ(ra[7], 4.0f); + + vfloat8 a2 = vfloat8_lit(1.1f, 1.5f, 1.6f, 0.2f, 1.1f, 1.5f, 1.6f, 0.2f); + vfloat8 r2 = hmax(a2); + + storea(r2, ra); + + EXPECT_EQ(ra[0], 1.6f); + EXPECT_EQ(ra[1], 1.6f); + EXPECT_EQ(ra[2], 1.6f); + EXPECT_EQ(ra[3], 1.6f); + EXPECT_EQ(ra[4], 1.6f); + EXPECT_EQ(ra[5], 1.6f); + EXPECT_EQ(ra[6], 1.6f); + EXPECT_EQ(ra[7], 1.6f); +} + +/** @brief Test vfloat8 hmax_s. */ +TEST(SuiteVfloat8, hmax_s) +{ + vfloat8 a1 = vfloat8_lit(1.1f, 1.5f, 1.6f, 4.0f, 1.1f, 1.5f, 1.6f, 4.0f); + float r1 = hmax_s(a1); + EXPECT_EQ(r1, 4.0f); + + vfloat8 a2 = vfloat8_lit(1.1f, 1.5f, 1.6f, 0.2f, 1.1f, 1.5f, 1.6f, 0.2f); + float r2 = hmax_s(a2); + EXPECT_EQ(r2, 1.6f); +} + +/** @brief Test vfloat8 hadd_s. */ +TEST(SuiteVfloat8, hadd_s) +{ + vfloat8 a1 = vfloat8_lit(1.1f, 1.5f, 1.6f, 4.0f, 1.1f, 1.5f, 1.6f, 4.0f); + float sum = 1.1f + 1.5f + 1.6f + 4.0f + 1.1f + 1.5f + 1.6f + 4.0f; + float r = hadd_s(a1); + EXPECT_NEAR(r, sum, 0.005f); +} + +/** @brief Test vfloat8 sqrt. */ +TEST(SuiteVfloat8, sqrt) +{ + vfloat8 a = vfloat8_lit(1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f); + vfloat8 r = sqrt(a); + + alignas(32) float ra[8]; + storea(r, ra); + + EXPECT_EQ(ra[0], std::sqrt(1.0f)); + EXPECT_EQ(ra[1], std::sqrt(2.0f)); + EXPECT_EQ(ra[2], std::sqrt(3.0f)); + EXPECT_EQ(ra[3], std::sqrt(4.0f)); + EXPECT_EQ(ra[4], std::sqrt(1.0f)); + EXPECT_EQ(ra[5], std::sqrt(2.0f)); + EXPECT_EQ(ra[6], std::sqrt(3.0f)); + EXPECT_EQ(ra[7], std::sqrt(4.0f)); +} + +/** @brief Test vfloat8 select. */ +TEST(SuiteVfloat8, select) +{ + vfloat8 m1 = vfloat8_lit(1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + vfloat8 m2 = vfloat8_lit(1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f); + vmask8 cond = m1 == m2; + + vfloat8 a = vfloat8_lit(1.0f, 3.0f, 3.0f, 1.0f, 1.0f, 3.0f, 3.0f, 1.0); + vfloat8 b = vfloat8_lit(4.0f, 2.0f, 2.0f, 4.0f, 4.0f, 2.0f, 2.0f, 4.0); + + // Select in one direction + vfloat8 r1 = select(a, b, cond); + + alignas(32) float ra[8]; + storea(r1, ra); + + EXPECT_EQ(ra[0], 4.0f); + EXPECT_EQ(ra[1], 3.0f); + EXPECT_EQ(ra[2], 2.0f); + EXPECT_EQ(ra[3], 1.0f); + EXPECT_EQ(ra[4], 4.0f); + EXPECT_EQ(ra[5], 3.0f); + EXPECT_EQ(ra[6], 2.0f); + EXPECT_EQ(ra[7], 1.0f); + + // Select in the other + vfloat8 r2 = select(b, a, cond); + + storea(r2, ra); + + EXPECT_EQ(ra[0], 1.0f); + EXPECT_EQ(ra[1], 2.0f); + EXPECT_EQ(ra[2], 3.0f); + EXPECT_EQ(ra[3], 4.0f); + EXPECT_EQ(ra[4], 1.0f); + EXPECT_EQ(ra[5], 2.0f); + EXPECT_EQ(ra[6], 3.0f); + EXPECT_EQ(ra[7], 4.0f); +} + +/** @brief Test vfloat8 gatherf. */ +TEST(SuiteVfloat8, gatherf) +{ + vint8 indices = vint8_lit(0, 4, 3, 2, 7, 4, 3, 2); + vfloat8 r = gatherf(f32_data, indices); + + alignas(32) float ra[8]; + storea(r, ra); + + EXPECT_EQ(ra[0], 0.0f); + EXPECT_EQ(ra[1], 4.0f); + EXPECT_EQ(ra[2], 3.0f); + EXPECT_EQ(ra[3], 2.0f); + EXPECT_EQ(ra[4], 7.0f); + EXPECT_EQ(ra[5], 4.0f); + EXPECT_EQ(ra[6], 3.0f); + EXPECT_EQ(ra[7], 2.0f); +} + +/** @brief Test vfloat8 store. */ +TEST(SuiteVfloat8, store) +{ + vfloat8 a(f32_data); + + alignas(32) float ra[9]; + store(a, ra + 1); + + EXPECT_EQ(ra[1], 0.0f); + EXPECT_EQ(ra[2], 1.0f); + EXPECT_EQ(ra[3], 2.0f); + EXPECT_EQ(ra[4], 3.0f); + EXPECT_EQ(ra[5], 4.0f); + EXPECT_EQ(ra[6], 5.0f); + EXPECT_EQ(ra[7], 6.0f); + EXPECT_EQ(ra[8], 7.0f); +} + +/** @brief Test vfloat8 storea. */ +TEST(SuiteVfloat8, storea) +{ + vfloat8 a(f32_data); + + alignas(32) float ra[8]; + storea(a, ra); + + EXPECT_EQ(ra[0], 0.0f); + EXPECT_EQ(ra[1], 1.0f); + EXPECT_EQ(ra[2], 2.0f); + EXPECT_EQ(ra[3], 3.0f); + EXPECT_EQ(ra[4], 4.0f); + EXPECT_EQ(ra[5], 5.0f); + EXPECT_EQ(ra[6], 6.0f); + EXPECT_EQ(ra[7], 7.0f); +} + +/** @brief Test vfloat8 float_to_int. */ +TEST(SuiteVfloat8, float_to_int) +{ + vfloat8 a = vfloat8_lit(1.1f, 1.5f, 1.6f, 4.0f, 1.1f, 1.5f, 1.6f, 4.0f); + vint8 r = float_to_int(a); + + alignas(32) int ra[8]; + store(r, ra); + + EXPECT_EQ(ra[0], 1); + EXPECT_EQ(ra[1], 1); + EXPECT_EQ(ra[2], 1); + EXPECT_EQ(ra[3], 4); + EXPECT_EQ(ra[4], 1); + EXPECT_EQ(ra[5], 1); + EXPECT_EQ(ra[6], 1); + EXPECT_EQ(ra[7], 4); +} + +// vint8 tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +/** @brief Test unaligned vint8 data load. */ +TEST(SuiteVint8, UnalignedLoad) +{ + vint8 a(&(s32_data[1])); + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 1); + EXPECT_EQ(ra[1], 2); + EXPECT_EQ(ra[2], 3); + EXPECT_EQ(ra[3], 4); + EXPECT_EQ(ra[4], 5); + EXPECT_EQ(ra[5], 6); + EXPECT_EQ(ra[6], 7); + EXPECT_EQ(ra[7], 8); +} + +/** @brief Test unaligned vint8 data load. */ +TEST(SuiteVint8, UnalignedLoad8) +{ + vint8 a(&(u8_data[1])); + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 1); + EXPECT_EQ(ra[1], 2); + EXPECT_EQ(ra[2], 3); + EXPECT_EQ(ra[3], 4); + EXPECT_EQ(ra[4], 5); + EXPECT_EQ(ra[5], 6); + EXPECT_EQ(ra[6], 7); + EXPECT_EQ(ra[7], 8); +} + +/** @brief Test scalar duplicated vint8 load. */ +TEST(SuiteVint8, ScalarDupLoad) +{ + vint8 a(42); + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 42); + EXPECT_EQ(ra[1], 42); + EXPECT_EQ(ra[2], 42); + EXPECT_EQ(ra[3], 42); + EXPECT_EQ(ra[4], 42); + EXPECT_EQ(ra[5], 42); + EXPECT_EQ(ra[6], 42); + EXPECT_EQ(ra[7], 42); +} + +/** @brief Test scalar vint8 load. */ +TEST(SuiteVint8, ScalarLoad) +{ + vint8 a = vint8_lit(11, 22, 33, 44, 55, 66, 77, 88); + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 11); + EXPECT_EQ(ra[1], 22); + EXPECT_EQ(ra[2], 33); + EXPECT_EQ(ra[3], 44); + EXPECT_EQ(ra[4], 55); + EXPECT_EQ(ra[5], 66); + EXPECT_EQ(ra[6], 77); + EXPECT_EQ(ra[7], 88); +} + +/** @brief Test copy vint8 load. */ +TEST(SuiteVint8, CopyLoad) +{ + vint8 s = vint8_lit(11, 22, 33, 44, 55, 66, 77, 88); + vint8 a(s.m); + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 11); + EXPECT_EQ(ra[1], 22); + EXPECT_EQ(ra[2], 33); + EXPECT_EQ(ra[3], 44); + EXPECT_EQ(ra[4], 55); + EXPECT_EQ(ra[5], 66); + EXPECT_EQ(ra[6], 77); + EXPECT_EQ(ra[7], 88); +} + +/** @brief Test vint8 zero. */ +TEST(SuiteVint8, Zero) +{ + vint8 a = vint8::zero(); + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 0); + EXPECT_EQ(ra[1], 0); + EXPECT_EQ(ra[2], 0); + EXPECT_EQ(ra[3], 0); + EXPECT_EQ(ra[4], 0); + EXPECT_EQ(ra[5], 0); + EXPECT_EQ(ra[6], 0); + EXPECT_EQ(ra[7], 0); +} + +/** @brief Test vint8 load1. */ +TEST(SuiteVint8, Load1) +{ + int s = 42; + vint8 a = vint8::load1(&s); + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 42); + EXPECT_EQ(ra[1], 42); + EXPECT_EQ(ra[2], 42); + EXPECT_EQ(ra[3], 42); + EXPECT_EQ(ra[4], 42); + EXPECT_EQ(ra[5], 42); + EXPECT_EQ(ra[6], 42); + EXPECT_EQ(ra[7], 42); +} + +/** @brief Test vint8 loada. */ +TEST(SuiteVint8, Loada) +{ + vint8 a = vint8::loada(&(s32_data[0])); + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 0); + EXPECT_EQ(ra[1], 1); + EXPECT_EQ(ra[2], 2); + EXPECT_EQ(ra[3], 3); + EXPECT_EQ(ra[4], 4); + EXPECT_EQ(ra[5], 5); + EXPECT_EQ(ra[6], 6); + EXPECT_EQ(ra[7], 7); +} + +/** @brief Test vint8 lane_id. */ +TEST(SuiteVint8, LaneID) +{ + vint8 a = vint8::lane_id(); + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 0); + EXPECT_EQ(ra[1], 1); + EXPECT_EQ(ra[2], 2); + EXPECT_EQ(ra[3], 3); + EXPECT_EQ(ra[4], 4); + EXPECT_EQ(ra[5], 5); + EXPECT_EQ(ra[6], 6); + EXPECT_EQ(ra[7], 7); +} + +/** @brief Test vint8 add. */ +TEST(SuiteVint8, vadd) +{ + vint8 a = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b = vint8_lit(2, 3, 4, 5, 2, 3, 4, 5); + a = a + b; + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 1 + 2); + EXPECT_EQ(ra[1], 2 + 3); + EXPECT_EQ(ra[2], 3 + 4); + EXPECT_EQ(ra[3], 4 + 5); + EXPECT_EQ(ra[4], 1 + 2); + EXPECT_EQ(ra[5], 2 + 3); + EXPECT_EQ(ra[6], 3 + 4); + EXPECT_EQ(ra[7], 4 + 5); +} + + +/** @brief Test vint8 self-add. */ +TEST(SuiteVint8, vselfadd1) +{ + vint8 a = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b = vint8_lit(2, 3, 4, 5, 2, 3, 4, 5); + a += b; + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 1 + 2); + EXPECT_EQ(ra[1], 2 + 3); + EXPECT_EQ(ra[2], 3 + 4); + EXPECT_EQ(ra[3], 4 + 5); + EXPECT_EQ(ra[4], 1 + 2); + EXPECT_EQ(ra[5], 2 + 3); + EXPECT_EQ(ra[6], 3 + 4); + EXPECT_EQ(ra[7], 4 + 5); +} + +/** @brief Test vint8 sub. */ +TEST(SuiteVint8, vsub) +{ + vint8 a = vint8_lit(1, 2, 4, 4, 1, 2, 4, 4); + vint8 b = vint8_lit(2, 3, 3, 5, 2, 3, 3, 5); + a = a - b; + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 1 - 2); + EXPECT_EQ(ra[1], 2 - 3); + EXPECT_EQ(ra[2], 4 - 3); + EXPECT_EQ(ra[3], 4 - 5); + EXPECT_EQ(ra[4], 1 - 2); + EXPECT_EQ(ra[5], 2 - 3); + EXPECT_EQ(ra[6], 4 - 3); + EXPECT_EQ(ra[7], 4 - 5); +} + +/** @brief Test vint8 mul. */ +TEST(SuiteVint8, vmul) +{ + vint8 a = vint8_lit(1, 2, 4, 4, 1, 2, 4, 4); + vint8 b = vint8_lit(2, 3, 3, 5, 2, 3, 3, 5); + a = a * b; + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 1 * 2); + EXPECT_EQ(ra[1], 2 * 3); + EXPECT_EQ(ra[2], 4 * 3); + EXPECT_EQ(ra[3], 4 * 5); + EXPECT_EQ(ra[4], 1 * 2); + EXPECT_EQ(ra[5], 2 * 3); + EXPECT_EQ(ra[6], 4 * 3); + EXPECT_EQ(ra[7], 4 * 5); +} + +/** @brief Test vint8 bitwise invert. */ +TEST(SuiteVint8, bit_invert) +{ + vint8 a = vint8_lit(-1, 0, 1, 2, -1, 0, 1, 2); + a = ~a; + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], ~-1); + EXPECT_EQ(ra[1], ~0); + EXPECT_EQ(ra[2], ~1); + EXPECT_EQ(ra[3], ~2); + EXPECT_EQ(ra[4], ~-1); + EXPECT_EQ(ra[5], ~0); + EXPECT_EQ(ra[6], ~1); + EXPECT_EQ(ra[7], ~2); +} + +/** @brief Test vint8 bitwise or. */ +TEST(SuiteVint8, bit_vor) +{ + vint8 a = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b = vint8_lit(2, 3, 4, 5, 2, 3, 4, 5); + a = a | b; + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 3); + EXPECT_EQ(ra[1], 3); + EXPECT_EQ(ra[2], 7); + EXPECT_EQ(ra[3], 5); + EXPECT_EQ(ra[4], 3); + EXPECT_EQ(ra[5], 3); + EXPECT_EQ(ra[6], 7); + EXPECT_EQ(ra[7], 5); +} + +/** @brief Test vint8 bitwise and. */ +TEST(SuiteVint8, bit_vand) +{ + vint8 a = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b = vint8_lit(2, 3, 4, 5, 2, 3, 4, 5); + a = a & b; + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 0); + EXPECT_EQ(ra[1], 2); + EXPECT_EQ(ra[2], 0); + EXPECT_EQ(ra[3], 4); + EXPECT_EQ(ra[4], 0); + EXPECT_EQ(ra[5], 2); + EXPECT_EQ(ra[6], 0); + EXPECT_EQ(ra[7], 4); +} + +/** @brief Test vint8 bitwise xor. */ +TEST(SuiteVint8, bit_vxor) +{ + vint8 a = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b = vint8_lit(2, 3, 4, 5, 2, 3, 4, 5); + a = a ^ b; + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 3); + EXPECT_EQ(ra[1], 1); + EXPECT_EQ(ra[2], 7); + EXPECT_EQ(ra[3], 1); + EXPECT_EQ(ra[4], 3); + EXPECT_EQ(ra[5], 1); + EXPECT_EQ(ra[6], 7); + EXPECT_EQ(ra[7], 1); +} + +/** @brief Test vint8 ceq. */ +TEST(SuiteVint8, ceq) +{ + vint8 a1 = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b1 = vint8_lit(0, 1, 2, 3, 0, 1, 2, 3); + vmask8 r1 = a1 == b1; + EXPECT_EQ(0u, mask(r1)); + EXPECT_EQ(false, any(r1)); + EXPECT_EQ(false, all(r1)); + + vint8 a2 = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b2 = vint8_lit(1, 0, 0, 0, 1, 0, 0, 0); + vmask8 r2 = a2 == b2; + EXPECT_EQ(0x11u, mask(r2)); + EXPECT_EQ(true, any(r2)); + EXPECT_EQ(false, all(r2)); + + vint8 a3 = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b3 = vint8_lit(1, 0, 3, 0, 1, 0, 3, 0); + vmask8 r3 = a3 == b3; + EXPECT_EQ(0x55u, mask(r3)); + EXPECT_EQ(true, any(r3)); + EXPECT_EQ(false, all(r3)); + + vint8 a4 = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vmask8 r4 = a4 == a4; + EXPECT_EQ(0xFFu, mask(r4)); + EXPECT_EQ(true, any(r4)); + EXPECT_EQ(true, all(r4)); +} + +/** @brief Test vint8 cne. */ +TEST(SuiteVint8, cne) +{ + vint8 a1 = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b1 = vint8_lit(0, 1, 2, 3, 0, 1, 2, 3); + vmask8 r1 = a1 != b1; + EXPECT_EQ(0xFFu, mask(r1)); + EXPECT_EQ(true, any(r1)); + EXPECT_EQ(true, all(r1)); + + vint8 a2 = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b2 = vint8_lit(1, 0, 0, 0, 1, 0, 0, 0); + vmask8 r2 = a2 != b2; + EXPECT_EQ(0xEEu, mask(r2)); + EXPECT_EQ(true, any(r2)); + EXPECT_EQ(false, all(r2)); + + vint8 a3 = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b3 = vint8_lit(1, 0, 3, 0, 1, 0, 3, 0); + vmask8 r3 = a3 != b3; + EXPECT_EQ(0xAAu, mask(r3)); + EXPECT_EQ(true, any(r3)); + EXPECT_EQ(false, all(r3)); + + vint8 a4 = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vmask8 r4 = a4 != a4; + EXPECT_EQ(0u, mask(r4)); + EXPECT_EQ(false, any(r4)); + EXPECT_EQ(false, all(r4)); +} + +/** @brief Test vint8 clt. */ +TEST(SuiteVint8, clt) +{ + vint8 a = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b = vint8_lit(0, 3, 3, 5, 0, 3, 3, 5); + vmask8 r = a < b; + EXPECT_EQ(0xAAu, mask(r)); +} + +/** @brief Test vint8 cgt. */ +TEST(SuiteVint8, cgt) +{ + vint8 a = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b = vint8_lit(0, 3, 3, 5, 0, 3, 3, 5); + vmask8 r = a > b; + EXPECT_EQ(0x11u, mask(r)); +} + +/** @brief Test vint8 min. */ +TEST(SuiteVint8, min) +{ + vint8 a = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b = vint8_lit(0, 3, 3, 5, 0, 3, 3, 5); + vint8 r = min(a, b); + + alignas(32) int ra[8]; + store(r, ra); + + EXPECT_EQ(ra[0], 0); + EXPECT_EQ(ra[1], 2); + EXPECT_EQ(ra[2], 3); + EXPECT_EQ(ra[3], 4); + EXPECT_EQ(ra[4], 0); + EXPECT_EQ(ra[5], 2); + EXPECT_EQ(ra[6], 3); + EXPECT_EQ(ra[7], 4); +} + +/** @brief Test vint8 max. */ +TEST(SuiteVint8, max) +{ + vint8 a = vint8_lit(1, 2, 3, 4, 1, 2, 3, 4); + vint8 b = vint8_lit(0, 3, 3, 5, 0, 3, 3, 5); + vint8 r = max(a, b); + + alignas(32) int ra[8]; + store(r, ra); + + EXPECT_EQ(ra[0], 1); + EXPECT_EQ(ra[1], 3); + EXPECT_EQ(ra[2], 3); + EXPECT_EQ(ra[3], 5); + EXPECT_EQ(ra[4], 1); + EXPECT_EQ(ra[5], 3); + EXPECT_EQ(ra[6], 3); + EXPECT_EQ(ra[7], 5); +} + +/** @brief Test vint8 lsl. */ +TEST(SuiteVint8, lsl) +{ + vint8 a = vint8_lit(1, 2, 4, -4, 1, 2, 4, -4); + a = lsl<0>(a); + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 1); + EXPECT_EQ(ra[1], 2); + EXPECT_EQ(ra[2], 4); + EXPECT_EQ(ra[3], static_cast(0xFFFFFFFC)); + EXPECT_EQ(ra[4], 1); + EXPECT_EQ(ra[5], 2); + EXPECT_EQ(ra[6], 4); + EXPECT_EQ(ra[7], static_cast(0xFFFFFFFC)); + + a = lsl<1>(a); + + store(a, ra); + + EXPECT_EQ(ra[0], 2); + EXPECT_EQ(ra[1], 4); + EXPECT_EQ(ra[2], 8); + EXPECT_EQ(ra[3], static_cast(0xFFFFFFF8)); + EXPECT_EQ(ra[4], 2); + EXPECT_EQ(ra[5], 4); + EXPECT_EQ(ra[6], 8); + EXPECT_EQ(ra[7], static_cast(0xFFFFFFF8)); + + a = lsl<2>(a); + + store(a, ra); + + EXPECT_EQ(ra[0], 8); + EXPECT_EQ(ra[1], 16); + EXPECT_EQ(ra[2], 32); + EXPECT_EQ(ra[3], static_cast(0xFFFFFFE0)); + EXPECT_EQ(ra[4], 8); + EXPECT_EQ(ra[5], 16); + EXPECT_EQ(ra[6], 32); + EXPECT_EQ(ra[7], static_cast(0xFFFFFFE0)); +} + +/** @brief Test vint8 lsr. */ +TEST(SuiteVint8, lsr) +{ + vint8 a = vint8_lit(1, 2, 4, -4, 1, 2, 4, -4); + a = lsr<0>(a); + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 1); + EXPECT_EQ(ra[1], 2); + EXPECT_EQ(ra[2], 4); + EXPECT_EQ(ra[3], static_cast(0xFFFFFFFC)); + EXPECT_EQ(ra[4], 1); + EXPECT_EQ(ra[5], 2); + EXPECT_EQ(ra[6], 4); + EXPECT_EQ(ra[7], static_cast(0xFFFFFFFC)); + + a = lsr<1>(a); + + store(a, ra); + + EXPECT_EQ(ra[0], 0); + EXPECT_EQ(ra[1], 1); + EXPECT_EQ(ra[2], 2); + EXPECT_EQ(ra[3], 0x7FFFFFFE); + EXPECT_EQ(ra[4], 0); + EXPECT_EQ(ra[5], 1); + EXPECT_EQ(ra[6], 2); + EXPECT_EQ(ra[7], 0x7FFFFFFE); + + a = lsr<2>(a); + + store(a, ra); + + EXPECT_EQ(ra[0], 0); + EXPECT_EQ(ra[1], 0); + EXPECT_EQ(ra[2], 0); + EXPECT_EQ(ra[3], 0x1FFFFFFF); + EXPECT_EQ(ra[4], 0); + EXPECT_EQ(ra[5], 0); + EXPECT_EQ(ra[6], 0); + EXPECT_EQ(ra[7], 0x1FFFFFFF); +} + +/** @brief Test vint8 asr. */ +TEST(SuiteVint8, asr) +{ + vint8 a = vint8_lit(1, 2, 4, -4, 1, 2, 4, -4); + a = asr<0>(a); + + alignas(32) int ra[8]; + store(a, ra); + + EXPECT_EQ(ra[0], 1); + EXPECT_EQ(ra[1], 2); + EXPECT_EQ(ra[2], 4); + EXPECT_EQ(ra[3], -4); + EXPECT_EQ(ra[4], 1); + EXPECT_EQ(ra[5], 2); + EXPECT_EQ(ra[6], 4); + EXPECT_EQ(ra[7], -4); + + a = asr<1>(a); + + store(a, ra); + + EXPECT_EQ(ra[0], 0); + EXPECT_EQ(ra[1], 1); + EXPECT_EQ(ra[2], 2); + EXPECT_EQ(ra[3], -2); + EXPECT_EQ(ra[4], 0); + EXPECT_EQ(ra[5], 1); + EXPECT_EQ(ra[6], 2); + EXPECT_EQ(ra[7], -2); + + // Note - quirk of asr is that you will get "stuck" at -1 + a = asr<2>(a); + + store(a, ra); + + EXPECT_EQ(ra[0], 0); + EXPECT_EQ(ra[1], 0); + EXPECT_EQ(ra[2], 0); + EXPECT_EQ(ra[3], -1); + EXPECT_EQ(ra[4], 0); + EXPECT_EQ(ra[5], 0); + EXPECT_EQ(ra[6], 0); + EXPECT_EQ(ra[7], -1); +} + +/** @brief Test vint8 hmin. */ +TEST(SuiteVint8, hmin) +{ + vint8 a1 = vint8_lit(1, 2, 1, 2, 1, 2, 1, 2); + vint8 r1 = hmin(a1); + + alignas(32) int ra[8]; + store(r1, ra); + + EXPECT_EQ(ra[0], 1); + EXPECT_EQ(ra[1], 1); + EXPECT_EQ(ra[2], 1); + EXPECT_EQ(ra[3], 1); + EXPECT_EQ(ra[4], 1); + EXPECT_EQ(ra[5], 1); + EXPECT_EQ(ra[6], 1); + EXPECT_EQ(ra[7], 1); + + vint8 a2 = vint8_lit(1, 2, -1, 5, 1, 2, -1, 5); + vint8 r2 = hmin(a2); + + store(r2, ra); + + EXPECT_EQ(ra[0], -1); + EXPECT_EQ(ra[1], -1); + EXPECT_EQ(ra[2], -1); + EXPECT_EQ(ra[3], -1); + EXPECT_EQ(ra[4], -1); + EXPECT_EQ(ra[5], -1); + EXPECT_EQ(ra[6], -1); + EXPECT_EQ(ra[7], -1); +} + +/** @brief Test vint8 hmax. */ +TEST(SuiteVint8, hmax) +{ + vint8 a1 = vint8_lit(1, 2, 1, 2, 1, 3, 1, 2); + vint8 r1 = hmax(a1); + + alignas(32) int ra[8]; + store(r1, ra); + + EXPECT_EQ(ra[0], 3); + EXPECT_EQ(ra[1], 3); + EXPECT_EQ(ra[2], 3); + EXPECT_EQ(ra[3], 3); + EXPECT_EQ(ra[4], 3); + EXPECT_EQ(ra[5], 3); + EXPECT_EQ(ra[6], 3); + EXPECT_EQ(ra[7], 3); + + vint8 a2 = vint8_lit(1, 2, -1, 5, 1, 2, -1, 5); + vint8 r2 = hmax(a2); + + store(r2, ra); + + EXPECT_EQ(ra[0], 5); + EXPECT_EQ(ra[1], 5); + EXPECT_EQ(ra[2], 5); + EXPECT_EQ(ra[3], 5); + EXPECT_EQ(ra[4], 5); + EXPECT_EQ(ra[5], 5); + EXPECT_EQ(ra[6], 5); + EXPECT_EQ(ra[7], 5); +} + +/** @brief Test vint8 storea. */ +TEST(SuiteVint8, storea) +{ + alignas(32) int out[8]; + vint8 a(s32_data); + storea(a, out); + EXPECT_EQ(out[0], 0); + EXPECT_EQ(out[1], 1); + EXPECT_EQ(out[2], 2); + EXPECT_EQ(out[3], 3); + EXPECT_EQ(out[4], 4); + EXPECT_EQ(out[5], 5); + EXPECT_EQ(out[6], 6); + EXPECT_EQ(out[7], 7); +} + +/** @brief Test vint8 store. */ +TEST(SuiteVint8, store) +{ + vint8 a(s32_data); + + alignas(32) int ra[9]; + store(a, ra + 1); + + EXPECT_EQ(ra[1], 0); + EXPECT_EQ(ra[2], 1); + EXPECT_EQ(ra[3], 2); + EXPECT_EQ(ra[4], 3); + EXPECT_EQ(ra[5], 4); + EXPECT_EQ(ra[6], 5); + EXPECT_EQ(ra[7], 6); + EXPECT_EQ(ra[8], 7); +} + +/** @brief Test vint8 store_nbytes. */ +TEST(SuiteVint8, store_nbytes) +{ + alignas(32) int out[2]; + vint8 a = vint8_lit(42, 314, 75, 90, 42, 314, 75, 90); + store_nbytes(a, reinterpret_cast(&out)); + EXPECT_EQ(out[0], 42); + EXPECT_EQ(out[1], 314); +} + +/** @brief Test vint8 store_lanes_masked. */ +TEST(SuiteVint8, store_lanes_masked) +{ + uint8_t resulta[32] { 0 }; + + // Store nothing + vmask8 mask1 = vint8(0) == vint8(1); + vint8 data1 = vint8(1); + + store_lanes_masked(resulta, data1, mask1); + vint8 result1v = vint8::load(resulta); + vint8 expect1v = vint8::zero(); + EXPECT_TRUE(all(result1v == expect1v)); + + // Store half + vmask8 mask2 = vint8_lit(1, 1, 1, 1, 0, 0, 0, 0) == vint8(1); + vint8 data2 = vint8(2); + + store_lanes_masked(resulta, data2, mask2); + vint8 result2v = vint8::load(resulta); + vint8 expect2v = vint8_lit(2, 2, 2, 2, 0, 0, 0, 0); + EXPECT_TRUE(all(result2v == expect2v)); + + // Store all + vmask8 mask3 = vint8(1) == vint8(1); + vint8 data3 = vint8(3); + + store_lanes_masked(resulta, data3, mask3); + vint8 result3v = vint8::load(resulta); + vint8 expect3v = vint8(3); + EXPECT_TRUE(all(result3v == expect3v)); +} + +/** @brief Test vint8 store_lanes_masked to unaligned address. */ +TEST(SuiteVint8, store_lanes_masked_unaligned) +{ + uint8_t resulta[33] { 0 }; + + // Store nothing + vmask8 mask1 = vint8(0) == vint8(1); + vint8 data1 = vint8(1); + + store_lanes_masked(resulta + 1, data1, mask1); + vint8 result1v = vint8::load(resulta + 1); + vint8 expect1v = vint8::zero(); + EXPECT_TRUE(all(result1v == expect1v)); + + // Store half + vmask8 mask2 = vint8_lit(1, 1, 1, 1, 0, 0, 0, 0) == vint8(1); + vint8 data2 = vint8(2); + + store_lanes_masked(resulta + 1, data2, mask2); + vint8 result2v = vint8::load(resulta + 1); + vint8 expect2v = vint8_lit(2, 2, 2, 2, 0, 0, 0, 0); + EXPECT_TRUE(all(result2v == expect2v)); + + // Store all + vmask8 mask3 = vint8(1) == vint8(1); + vint8 data3 = vint8(3); + + store_lanes_masked(resulta + 1, data3, mask3); + vint8 result3v = vint8::load(resulta + 1); + vint8 expect3v = vint8(3); + EXPECT_TRUE(all(result3v == expect3v)); +} + +/** @brief Test vint8 pack_and_store_low_bytes. */ +TEST(SuiteVint8, pack_and_store_low_bytes) +{ + vint8 a = vint8_lit(1, 2, 3, 4, 2, 3, 4, 5); + uint8_t bytes[8] { 0 }; + + pack_and_store_low_bytes(a, bytes); + + EXPECT_EQ(bytes[0], 1); + EXPECT_EQ(bytes[1], 2); + EXPECT_EQ(bytes[2], 3); + EXPECT_EQ(bytes[3], 4); + EXPECT_EQ(bytes[4], 2); + EXPECT_EQ(bytes[5], 3); + EXPECT_EQ(bytes[6], 4); + EXPECT_EQ(bytes[7], 5); +} + +/** @brief Test vint8 select. */ +TEST(SuiteVint8, select) +{ + vint8 m1 = vint8_lit(1, 1, 1, 1, 1, 1, 1, 1); + vint8 m2 = vint8_lit(1, 2, 1, 2, 1, 2, 1, 2); + vmask8 cond = m1 == m2; + + vint8 a = vint8_lit(1, 3, 3, 1, 1, 3, 3, 1); + vint8 b = vint8_lit(4, 2, 2, 4, 4, 2, 2, 4); + + vint8 r1 = select(a, b, cond); + + alignas(32) int ra[8]; + store(r1, ra); + + EXPECT_EQ(ra[0], 4); + EXPECT_EQ(ra[1], 3); + EXPECT_EQ(ra[2], 2); + EXPECT_EQ(ra[3], 1); + EXPECT_EQ(ra[4], 4); + EXPECT_EQ(ra[5], 3); + EXPECT_EQ(ra[6], 2); + EXPECT_EQ(ra[7], 1); + + vint8 r2 = select(b, a, cond); + + store(r2, ra); + + EXPECT_EQ(ra[0], 1); + EXPECT_EQ(ra[1], 2); + EXPECT_EQ(ra[2], 3); + EXPECT_EQ(ra[3], 4); + EXPECT_EQ(ra[4], 1); + EXPECT_EQ(ra[5], 2); + EXPECT_EQ(ra[6], 3); + EXPECT_EQ(ra[7], 4); +} + +// vmask8 tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +/** @brief Test vmask8 scalar literal constructor. */ +TEST(SuiteVmask8, scalar_literal_construct) +{ + vfloat8 ma(0.0f); + vfloat8 mb(1.0f); + + vmask8 m1(true); + vfloat8 r1 = select(ma, mb, m1); + vmask8 rm1 = r1 == mb; + EXPECT_EQ(all(rm1), true); + + vmask8 m2(false); + vfloat8 r2 = select(ma, mb, m2); + vmask8 rm2 = r2 == mb; + EXPECT_EQ(any(rm2), false); +} + +/** @brief Test vmask8 or. */ +TEST(SuiteVmask8, TestOr) +{ + vfloat8 m1a = vfloat8_lit(0, 1, 0, 1, 0, 1, 0, 1); + vfloat8 m1b = vfloat8_lit(1, 1, 1, 1, 1, 1, 1, 1); + vmask8 m1 = m1a == m1b; + + vfloat8 m2a = vfloat8_lit(1, 1, 0, 0, 1, 1, 0, 0); + vfloat8 m2b = vfloat8_lit(1, 1, 1, 1, 1, 1, 1, 1); + vmask8 m2 = m2a == m2b; + + vmask8 r = m1 | m2; + EXPECT_EQ(mask(r), 0xBBu); +} + +/** @brief Test vmask8 and. */ +TEST(SuiteVmask8, TestAnd) +{ + vfloat8 m1a = vfloat8_lit(0, 1, 0, 1, 0, 1, 0, 1); + vfloat8 m1b = vfloat8_lit(1, 1, 1, 1, 1, 1, 1, 1); + vmask8 m1 = m1a == m1b; + + vfloat8 m2a = vfloat8_lit(1, 1, 0, 0, 1, 1, 0, 0); + vfloat8 m2b = vfloat8_lit(1, 1, 1, 1, 1, 1, 1, 1); + vmask8 m2 = m2a == m2b; + + vmask8 r = m1 & m2; + EXPECT_EQ(mask(r), 0x22u); +} + +/** @brief Test vmask8 xor. */ +TEST(SuiteVmask8, TestXor) +{ + vfloat8 m1a = vfloat8_lit(0, 1, 0, 1, 0, 1, 0, 1); + vfloat8 m1b = vfloat8_lit(1, 1, 1, 1, 1, 1, 1, 1); + vmask8 m1 = m1a == m1b; + + vfloat8 m2a = vfloat8_lit(1, 1, 0, 0, 1, 1, 0, 0); + vfloat8 m2b = vfloat8_lit(1, 1, 1, 1, 1, 1, 1, 1); + vmask8 m2 = m2a == m2b; + + vmask8 r = m1 ^ m2; + EXPECT_EQ(mask(r), 0x99u); +} + +/** @brief Test vmask8 not. */ +TEST(SuiteVmask8, TestNot) +{ + vfloat8 m1a = vfloat8_lit(0, 1, 0, 1, 0, 1, 0, 1); + vfloat8 m1b = vfloat8_lit(1, 1, 1, 1, 1, 1, 1, 1); + vmask8 m1 = m1a == m1b; + vmask8 r = ~m1; + EXPECT_EQ(mask(r), 0x55u); +} + +/** @brief Test vint8 table permute. */ +TEST(SuiteVint8, vtable8_16x8) +{ + uint8_t data[16] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f + }; + + vtable8_16x8 table; + vtable_prepare(table, data); + + vint8 index = vint8_lit(0, 7, 4, 15, 1, 2, 14, 4); + + vint8 result = vtable_lookup_32bit(table, index); + + alignas(32) int ra[8]; + store(result, ra); + + EXPECT_EQ(ra[0], 0); + EXPECT_EQ(ra[1], 7); + EXPECT_EQ(ra[2], 4); + EXPECT_EQ(ra[3], 15); + EXPECT_EQ(ra[4], 1); + EXPECT_EQ(ra[5], 2); + EXPECT_EQ(ra[6], 14); + EXPECT_EQ(ra[7], 4); +} + +/** @brief Test vint8 table permute. */ +TEST(SuiteVint8, vtable8_32x8) +{ + uint8_t data[32] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f + }; + + vtable8_32x8 table; + vtable_prepare(table, data); + + vint8 index = vint8_lit(0, 7, 4, 15, 16, 20, 23, 31); + + vint8 result = vtable_lookup_32bit(table, index); + + alignas(32) int ra[8]; + store(result, ra); + + EXPECT_EQ(ra[0], 0); + EXPECT_EQ(ra[1], 7); + EXPECT_EQ(ra[2], 4); + EXPECT_EQ(ra[3], 15); + EXPECT_EQ(ra[4], 16); + EXPECT_EQ(ra[5], 20); + EXPECT_EQ(ra[6], 23); + EXPECT_EQ(ra[7], 31); +} + +/** @brief Test vint8 table permute. */ +TEST(SuiteVint8, vtable8_64x8) +{ + uint8_t data[64] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f + }; + + vtable8_64x8 table; + vtable_prepare(table, data); + + vint8 index = vint8_lit(0, 7, 4, 15, 16, 20, 38, 63); + + vint8 result = vtable_lookup_32bit(table, index); + + alignas(32) int ra[8]; + store(result, ra); + + EXPECT_EQ(ra[0], 0); + EXPECT_EQ(ra[1], 7); + EXPECT_EQ(ra[2], 4); + EXPECT_EQ(ra[3], 15); + EXPECT_EQ(ra[4], 16); + EXPECT_EQ(ra[5], 20); + EXPECT_EQ(ra[6], 38); + EXPECT_EQ(ra[7], 63); +} + +#endif + +} diff --git a/ktx/external/astc-encoder/Source/UnitTest/test_softfloat.cpp b/ktx/external/astc-encoder/Source/UnitTest/test_softfloat.cpp new file mode 100644 index 0000000..6e37616 --- /dev/null +++ b/ktx/external/astc-encoder/Source/UnitTest/test_softfloat.cpp @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2021 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Unit tests for the software half-float library. + */ + +#include "gtest/gtest.h" + +#include "../astcenc_internal.h" + +namespace astcenc +{ + +#if (ASTCENC_F16C == 0) && (ASTCENC_NEON == 0) + +/** @brief Test normal numbers. */ +TEST(softfloat, FP16NormalNumbers) +{ + float result = sf16_to_float((15 << 10) + 1); + EXPECT_NEAR(result, 1.00098f, 0.00005f); +} + +/** @brief Test denormal numbers. */ +TEST(softfloat, FP16DenormalNumbers) +{ + float result = sf16_to_float((0 << 10) + 1); + EXPECT_NEAR(result, 5.96046e-08f, 0.00005f); +} + +/** @brief Test zero. */ +TEST(softfloat, FP16Zero) +{ + float result = sf16_to_float(0x0000); + EXPECT_EQ(result, 0.0f); +} + +/** @brief Test infinity. */ +TEST(softfloat, FP16Infinity) +{ + float result = sf16_to_float((31 << 10) + 0); + EXPECT_TRUE(std::isinf(result)); +} + +/** @brief Test NaN. */ +TEST(softfloat, FP16NaN) +{ + float result = sf16_to_float(0xFFFF); + EXPECT_TRUE(std::isnan(result)); +} + +#endif + +} diff --git a/ktx/external/astc-encoder/Source/astcenc.h b/ktx/external/astc-encoder/Source/astcenc.h new file mode 100644 index 0000000..8ecdc16 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc.h @@ -0,0 +1,874 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2020-2025 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. +// ---------------------------------------------------------------------------- + +/** + * @brief The core astcenc codec library interface. + * + * This interface is the entry point to the core astcenc codec. It aims to be easy to use for + * non-experts, but also to allow experts to have fine control over the compressor heuristics if + * needed. The core codec only handles compression and decompression, transferring all inputs and + * outputs via memory buffers. To catch obvious input/output buffer sizing issues, which can cause + * security and stability problems, all transfer buffers are explicitly sized. + * + * While the aim is that we keep this interface mostly stable, it should be viewed as a mutable + * interface tied to a specific source version. We are not trying to maintain backwards + * compatibility across codec versions. + * + * The API state management is based around an explicit context object, which is the context for all + * allocated memory resources needed to compress and decompress a single image. A context can be + * used to sequentially compress multiple images using the same configuration, allowing setup + * overheads to be amortized over multiple images, which is particularly important when images are + * small. + * + * Multi-threading can be used two ways. + * + * * An application wishing to process multiple images in parallel can allocate multiple + * contexts and assign each context to a thread. + * * An application wishing to process a single image in using multiple threads can configure + * contexts for multi-threaded use, and invoke astcenc_compress/decompress() once per thread + * for faster processing. The caller is responsible for creating the worker threads, and + * synchronizing between images. + * + * Extended instruction set support + * ================================ + * + * This library supports use of extended instruction sets, such as SSE4.1 and AVX2. These are + * enabled at compile time when building the library. There is no runtime checking in the core + * library that the instruction sets used are actually available. Checking compatibility is the + * responsibility of the calling code. + * + * Threading + * ========= + * + * In pseudo-code, the usage for manual user threading looks like this: + * + * // Configure the compressor run + * astcenc_config my_config; + * astcenc_config_init(..., &my_config); + * + * // Power users can tweak settings here ... + * + * // Allocate working state given config and thread_count + * astcenc_context* my_context; + * astcenc_context_alloc(&my_config, thread_count, &my_context); + * + * // Compress each image using these config settings + * foreach image: + * // For each thread in the thread pool + * for i in range(0, thread_count): + * astcenc_compress_image(my_context, &my_input, my_output, i); + * + * astcenc_compress_reset(my_context); + * + * // Clean up + * astcenc_context_free(my_context); + * + * Images + * ====== + * + * The codec supports compressing single images, which can be either 2D images or volumetric 3D + * images. Calling code is responsible for any handling of aggregate types, such as mipmap chains, + * texture arrays, or sliced 3D textures. + * + * Images are passed in as an astcenc_image structure. Inputs can be either 8-bit unorm, 16-bit + * half-float, or 32-bit float, as indicated by the data_type field. + * + * Images can be any dimension; there is no requirement to be a multiple of the ASTC block size. + * + * Data is always passed in as 4 color components, and accessed as an array of 2D image slices. Data + * within an image slice is always tightly packed without padding. Addressing looks like this: + * + * data[z_coord][y_coord * x_dim * 4 + x_coord * 4 ] // Red + * data[z_coord][y_coord * x_dim * 4 + x_coord * 4 + 1] // Green + * data[z_coord][y_coord * x_dim * 4 + x_coord * 4 + 2] // Blue + * data[z_coord][y_coord * x_dim * 4 + x_coord * 4 + 3] // Alpha + * + * Common compressor usage + * ======================= + * + * One of the most important things for coding image quality is to align the input data component + * count with the ASTC color endpoint mode. This avoids wasting bits encoding components you don't + * actually need in the endpoint colors. + * + * | Input data | Encoding swizzle | Sampling swizzle | + * | ------------ | ---------------- | ---------------- | + * | 1 component | RRR1 | .[rgb] | + * | 2 components | RRRG | .[rgb]a | + * | 3 components | RGB1 | .rgb | + * | 4 components | RGBA | .rgba | + * + * The 1 and 2 component modes recommend sampling from "g" to recover the luminance value as this + * provide best compatibility with other texture formats where the green component may be stored at + * higher precision than the others, such as RGB565. For ASTC any of the RGB components can be used; + * the luminance endpoint component will be returned for all three. + * + * When using the normal map compression mode ASTC will store normals as a two component X+Y map. + * Input images must contain unit-length normalized and should be passed in using a two component + * swizzle. The astcenc command line tool defaults to an RRRG swizzle, but some developers prefer + * to use GGGR for compatability with BC5n which will work just as well. The Z component can be + * recovered programmatically in shader code, using knowledge that the vector is unit length and + * that Z must be positive for a tangent-space normal map. + * + * Decompress-only usage + * ===================== + * + * For some use cases it is useful to have a cut-down context and/or library which supports + * decompression but not compression. + * + * A context can be made decompress-only using the ASTCENC_FLG_DECOMPRESS_ONLY flag when the context + * is allocated. These contexts have lower dynamic memory footprint than a full context. + * + * The entire library can be made decompress-only by building the files with the define + * ASTCENC_DECOMPRESS_ONLY set. In this build the context will be smaller, and the library will + * exclude the functionality which is only needed for compression. This reduces the binary size by + * ~180KB. For these builds contexts must be created with the ASTCENC_FLG_DECOMPRESS_ONLY flag. + * + * Note that context structures returned by a library built as decompress-only are incompatible with + * a library built with compression included, and visa versa, as they have different sizes and + * memory layout. + * + * Self-decompress-only usage + * ========================== + * + * ASTC is a complex format with a large search space. The parts of this search space that are + * searched is determined by heuristics that are, in part, tied to the quality level used when + * creating the context. + * + * A normal context is capable of decompressing any ASTC texture, including those generated by other + * compressors with unknown heuristics. This is the most flexible implementation, but forces the + * data tables used by the codec to include entries that are not needed during compression. This + * can slow down context creation by a significant amount, especially for the faster compression + * modes where few data table entries are actually used. To optimize this use case the context can + * be created with the ASTCENC_FLG_SELF_DECOMPRESS_ONLY flag. This tells the compressor that it will + * only be asked to decompress images that it compressed itself, allowing the data tables to + * exclude entries that are not needed by the current compression configuration. This reduces the + * size of the context data tables in memory and improves context creation performance. Note that, + * as of the 3.6 release, this flag no longer affects compression performance. + * + * Using this flag while attempting to decompress an valid image which was created by another + * compressor, or even another astcenc compressor version or configuration, may result in blocks + * returning as solid magenta or NaN value error blocks. + */ + +#ifndef ASTCENC_INCLUDED +#define ASTCENC_INCLUDED + +#include +#include + +#if defined(ASTCENC_DYNAMIC_LIBRARY) + #if defined(_MSC_VER) + #define ASTCENC_PUBLIC extern "C" __declspec(dllexport) + #else + #define ASTCENC_PUBLIC extern "C" __attribute__ ((visibility ("default"))) + #endif +#else + #define ASTCENC_PUBLIC +#endif + +/* ============================================================================ + Data declarations +============================================================================ */ + +/** + * @brief An opaque structure; see astcenc_internal.h for definition. + */ +struct astcenc_context; + +/** + * @brief A codec API error code. + */ +enum astcenc_error { + /** @brief The call was successful. */ + ASTCENC_SUCCESS = 0, + /** @brief The call failed due to low memory, or undersized I/O buffers. */ + ASTCENC_ERR_OUT_OF_MEM, + /** @brief The call failed due to the build using fast math. */ + ASTCENC_ERR_BAD_CPU_FLOAT, + /** @brief The call failed due to an out-of-spec parameter. */ + ASTCENC_ERR_BAD_PARAM, + /** @brief The call failed due to an out-of-spec block size. */ + ASTCENC_ERR_BAD_BLOCK_SIZE, + /** @brief The call failed due to an out-of-spec color profile. */ + ASTCENC_ERR_BAD_PROFILE, + /** @brief The call failed due to an out-of-spec quality value. */ + ASTCENC_ERR_BAD_QUALITY, + /** @brief The call failed due to an out-of-spec component swizzle. */ + ASTCENC_ERR_BAD_SWIZZLE, + /** @brief The call failed due to an out-of-spec flag set. */ + ASTCENC_ERR_BAD_FLAGS, + /** @brief The call failed due to the context not supporting the operation. */ + ASTCENC_ERR_BAD_CONTEXT, + /** @brief The call failed due to unimplemented functionality. */ + ASTCENC_ERR_NOT_IMPLEMENTED, + /** @brief The call failed due to an out-of-spec decode mode flag set. */ + ASTCENC_ERR_BAD_DECODE_MODE, +#if defined(ASTCENC_DIAGNOSTICS) + /** @brief The call failed due to an issue with diagnostic tracing. */ + ASTCENC_ERR_DTRACE_FAILURE, +#endif +}; + +/** + * @brief A codec color profile. + */ +enum astcenc_profile { + /** @brief The LDR sRGB color profile. */ + ASTCENC_PRF_LDR_SRGB = 0, + /** @brief The LDR linear color profile. */ + ASTCENC_PRF_LDR, + /** @brief The HDR RGB with LDR alpha color profile. */ + ASTCENC_PRF_HDR_RGB_LDR_A, + /** @brief The HDR RGBA color profile. */ + ASTCENC_PRF_HDR +}; + +/** @brief The fastest, lowest quality, search preset. */ +static const float ASTCENC_PRE_FASTEST = 0.0f; + +/** @brief The fast search preset. */ +static const float ASTCENC_PRE_FAST = 10.0f; + +/** @brief The medium quality search preset. */ +static const float ASTCENC_PRE_MEDIUM = 60.0f; + +/** @brief The thorough quality search preset. */ +static const float ASTCENC_PRE_THOROUGH = 98.0f; + +/** @brief The thorough quality search preset. */ +static const float ASTCENC_PRE_VERYTHOROUGH = 99.0f; + +/** @brief The exhaustive, highest quality, search preset. */ +static const float ASTCENC_PRE_EXHAUSTIVE = 100.0f; + +/** + * @brief A codec component swizzle selector. + */ +enum astcenc_swz +{ + /** @brief Select the red component. */ + ASTCENC_SWZ_R = 0, + /** @brief Select the green component. */ + ASTCENC_SWZ_G = 1, + /** @brief Select the blue component. */ + ASTCENC_SWZ_B = 2, + /** @brief Select the alpha component. */ + ASTCENC_SWZ_A = 3, + /** @brief Use a constant zero component. */ + ASTCENC_SWZ_0 = 4, + /** @brief Use a constant one component. */ + ASTCENC_SWZ_1 = 5, + /** @brief Use a reconstructed normal vector Z component. */ + ASTCENC_SWZ_Z = 6 +}; + +/** + * @brief A texel component swizzle. + */ +struct astcenc_swizzle +{ + /** @brief The red component selector. */ + astcenc_swz r; + /** @brief The green component selector. */ + astcenc_swz g; + /** @brief The blue component selector. */ + astcenc_swz b; + /** @brief The alpha component selector. */ + astcenc_swz a; +}; + +/** + * @brief A texel component data format. + */ +enum astcenc_type +{ + /** @brief Unorm 8-bit data per component. */ + ASTCENC_TYPE_U8 = 0, + /** @brief 16-bit float per component. */ + ASTCENC_TYPE_F16 = 1, + /** @brief 32-bit float per component. */ + ASTCENC_TYPE_F32 = 2 +}; + +/** + * @brief Function pointer type for compression progress reporting callback. + */ +extern "C" typedef void (*astcenc_progress_callback)(float); + +/** + * @brief Enable normal map compression. + * + * Input data will be treated a two component normal map, storing X and Y, and the codec will + * optimize for angular error rather than simple linear PSNR. In this mode the input swizzle should + * be e.g. rrrg (the default ordering for ASTC normals on the command line) or gggr (the ordering + * used by BC5n). + */ +static const unsigned int ASTCENC_FLG_MAP_NORMAL = 1 << 0; + +/** + * @brief Enable compression heuristics that assume use of decode_unorm8 decode mode. + * + * The decode_unorm8 decode mode rounds differently to the decode_fp16 decode mode, so enabling this + * flag during compression will allow the compressor to use the correct rounding when selecting + * encodings. This will improve the compressed image quality if your application is using the + * decode_unorm8 decode mode, but will reduce image quality if using decode_fp16. + * + * Note that LDR_SRGB images will always use decode_unorm8 for the RGB channels, irrespective of + * this setting. + */ +static const unsigned int ASTCENC_FLG_USE_DECODE_UNORM8 = 1 << 1; + +/** + * @brief Enable alpha weighting. + * + * The input alpha value is used for transparency, so errors in the RGB components are weighted by + * the transparency level. This allows the codec to more accurately encode the alpha value in areas + * where the color value is less significant. + */ +static const unsigned int ASTCENC_FLG_USE_ALPHA_WEIGHT = 1 << 2; + +/** + * @brief Enable perceptual error metrics. + * + * This mode enables perceptual compression mode, which will optimize for perceptual error rather + * than best PSNR. Only some input modes support perceptual error metrics. + */ +static const unsigned int ASTCENC_FLG_USE_PERCEPTUAL = 1 << 3; + +/** + * @brief Create a decompression-only context. + * + * This mode disables support for compression. This enables context allocation to skip some + * transient buffer allocation, resulting in lower memory usage. + */ +static const unsigned int ASTCENC_FLG_DECOMPRESS_ONLY = 1 << 4; + +/** + * @brief Create a self-decompression context. + * + * This mode configures the compressor so that it is only guaranteed to be able to decompress images + * that were actually created using the current context. This is the common case for compression use + * cases, and setting this flag enables additional optimizations, but does mean that the context + * cannot reliably decompress arbitrary ASTC images. + */ +static const unsigned int ASTCENC_FLG_SELF_DECOMPRESS_ONLY = 1 << 5; + +/** + * @brief Enable RGBM map compression. + * + * Input data will be treated as HDR data that has been stored in an LDR RGBM-encoded wrapper + * format. Data must be preprocessed by the user to be in LDR RGBM format before calling the + * compression function, this flag is only used to control the use of RGBM-specific heuristics and + * error metrics. + * + * IMPORTANT: The ASTC format is prone to bad failure modes with unconstrained RGBM data; very small + * M values can round to zero due to quantization and result in black or white pixels. It is highly + * recommended that the minimum value of M used in the encoding is kept above a lower threshold (try + * 16 or 32). Applying this threshold reduces the number of very dark colors that can be + * represented, but is still higher precision than 8-bit LDR. + * + * When this flag is set the value of @c rgbm_m_scale in the context must be set to the RGBM scale + * factor used during reconstruction. This defaults to 5 when in RGBM mode. + * + * It is recommended that the value of @c cw_a_weight is set to twice the value of the multiplier + * scale, ensuring that the M value is accurately encoded. This defaults to 10 when in RGBM mode, + * matching the default scale factor. + */ +static const unsigned int ASTCENC_FLG_MAP_RGBM = 1 << 6; + +/** + * @brief The bit mask of all valid flags. + */ +static const unsigned int ASTCENC_ALL_FLAGS = + ASTCENC_FLG_MAP_NORMAL | + ASTCENC_FLG_MAP_RGBM | + ASTCENC_FLG_USE_ALPHA_WEIGHT | + ASTCENC_FLG_USE_PERCEPTUAL | + ASTCENC_FLG_USE_DECODE_UNORM8 | + ASTCENC_FLG_DECOMPRESS_ONLY | + ASTCENC_FLG_SELF_DECOMPRESS_ONLY; + +/** + * @brief The config structure. + * + * This structure will initially be populated by a call to astcenc_config_init, but power users may + * modify it before calling astcenc_context_alloc. See astcenccli_toplevel_help.cpp for full user + * documentation of the power-user settings. + * + * Note for any settings which are associated with a specific color component, the value in the + * config applies to the component that exists after any compression data swizzle is applied. + */ +struct astcenc_config +{ + /** @brief The color profile. */ + astcenc_profile profile; + + /** @brief The set of set flags. */ + unsigned int flags; + + /** @brief The ASTC block size X dimension. */ + unsigned int block_x; + + /** @brief The ASTC block size Y dimension. */ + unsigned int block_y; + + /** @brief The ASTC block size Z dimension. */ + unsigned int block_z; + + /** @brief The red component weight scale for error weighting (-cw). */ + float cw_r_weight; + + /** @brief The green component weight scale for error weighting (-cw). */ + float cw_g_weight; + + /** @brief The blue component weight scale for error weighting (-cw). */ + float cw_b_weight; + + /** @brief The alpha component weight scale for error weighting (-cw). */ + float cw_a_weight; + + /** + * @brief The radius for any alpha-weight scaling (-a). + * + * It is recommended that this is set to 1 when using FLG_USE_ALPHA_WEIGHT on a texture that + * will be sampled using linear texture filtering to minimize color bleed out of transparent + * texels that are adjacent to non-transparent texels. + */ + unsigned int a_scale_radius; + + /** @brief The RGBM scale factor for the shared multiplier (-rgbm). */ + float rgbm_m_scale; + + /** + * @brief The maximum number of partitions searched (-partitioncountlimit). + * + * Valid values are between 1 and 4. + */ + unsigned int tune_partition_count_limit; + + /** + * @brief The maximum number of partitions searched (-2partitionindexlimit). + * + * Valid values are between 1 and 1024. + */ + unsigned int tune_2partition_index_limit; + + /** + * @brief The maximum number of partitions searched (-3partitionindexlimit). + * + * Valid values are between 1 and 1024. + */ + unsigned int tune_3partition_index_limit; + + /** + * @brief The maximum number of partitions searched (-4partitionindexlimit). + * + * Valid values are between 1 and 1024. + */ + unsigned int tune_4partition_index_limit; + + /** + * @brief The maximum centile for block modes searched (-blockmodelimit). + * + * Valid values are between 1 and 100. + */ + unsigned int tune_block_mode_limit; + + /** + * @brief The maximum iterative refinements applied (-refinementlimit). + * + * Valid values are between 1 and N; there is no technical upper limit + * but little benefit is expected after N=4. + */ + unsigned int tune_refinement_limit; + + /** + * @brief The number of trial candidates per mode search (-candidatelimit). + * + * Valid values are between 1 and TUNE_MAX_TRIAL_CANDIDATES. + */ + unsigned int tune_candidate_limit; + + /** + * @brief The number of trial partitionings per search (-2partitioncandidatelimit). + * + * Valid values are between 1 and TUNE_MAX_PARTITIONING_CANDIDATES. + */ + unsigned int tune_2partitioning_candidate_limit; + + /** + * @brief The number of trial partitionings per search (-3partitioncandidatelimit). + * + * Valid values are between 1 and TUNE_MAX_PARTITIONING_CANDIDATES. + */ + unsigned int tune_3partitioning_candidate_limit; + + /** + * @brief The number of trial partitionings per search (-4partitioncandidatelimit). + * + * Valid values are between 1 and TUNE_MAX_PARTITIONING_CANDIDATES. + */ + unsigned int tune_4partitioning_candidate_limit; + + /** + * @brief The dB threshold for stopping block search (-dblimit). + * + * This option is ineffective for HDR textures. + */ + float tune_db_limit; + + /** + * @brief The amount of MSE overshoot needed to early-out trials. + * + * The first early-out is for 1 partition, 1 plane trials, where we try a minimal encode using + * the high probability block modes. This can short-cut compression for simple blocks. + * + * The second early-out is for refinement trials, where we can exit refinement once quality is + * reached. + */ + float tune_mse_overshoot; + + /** + * @brief The threshold for skipping 3.1/4.1 trials (-2partitionlimitfactor). + * + * This option is further scaled for normal maps, so it skips less often. + */ + float tune_2partition_early_out_limit_factor; + + /** + * @brief The threshold for skipping 4.1 trials (-3partitionlimitfactor). + * + * This option is further scaled for normal maps, so it skips less often. + */ + float tune_3partition_early_out_limit_factor; + + /** + * @brief The threshold for skipping two weight planes (-2planelimitcorrelation). + * + * This option is ineffective for normal maps. + */ + float tune_2plane_early_out_limit_correlation; + + /** + * @brief The config enable for the mode0 fast-path search. + * + * If this is set to TUNE_MIN_TEXELS_MODE0 or higher then the early-out fast mode0 + * search is enabled. This option is ineffective for 3D block sizes. + */ + float tune_search_mode0_enable; + + /** + * @brief The progress callback, can be @c nullptr. + * + * If this is specified the codec will peridocially report progress for + * compression as a percentage between 0 and 100. The callback is called from one + * of the compressor threads, so doing significant work in the callback will + * reduce compression performance. + */ + astcenc_progress_callback progress_callback; + +#if defined(ASTCENC_DIAGNOSTICS) + /** + * @brief The path to save the diagnostic trace data to. + * + * This option is not part of the public API, and requires special builds + * of the library. + */ + const char* trace_file_path; +#endif +}; + +/** + * @brief An uncompressed 2D or 3D image. + * + * 3D image are passed in as an array of 2D slices. Each slice has identical + * size and color format. + */ +struct astcenc_image +{ + /** @brief The X dimension of the image, in texels. */ + unsigned int dim_x; + + /** @brief The Y dimension of the image, in texels. */ + unsigned int dim_y; + + /** @brief The Z dimension of the image, in texels. */ + unsigned int dim_z; + + /** @brief The data type per component. */ + astcenc_type data_type; + + /** @brief The array of 2D slices, of length @c dim_z. */ + void** data; +}; + +/** + * @brief A block encoding metadata query result. + * + * If the block is an error block or a constant color block or an error block all fields other than + * the profile, block dimensions, and error/constant indicator will be zero. + */ +struct astcenc_block_info +{ + /** @brief The block encoding color profile. */ + astcenc_profile profile; + + /** @brief The number of texels in the X dimension. */ + unsigned int block_x; + + /** @brief The number of texels in the Y dimension. */ + unsigned int block_y; + + /** @brief The number of texel in the Z dimension. */ + unsigned int block_z; + + /** @brief The number of texels in the block. */ + unsigned int texel_count; + + /** @brief True if this block is an error block. */ + bool is_error_block; + + /** @brief True if this block is a constant color block. */ + bool is_constant_block; + + /** @brief True if this block is an HDR block. */ + bool is_hdr_block; + + /** @brief True if this block uses two weight planes. */ + bool is_dual_plane_block; + + /** @brief The number of partitions if not constant color. */ + unsigned int partition_count; + + /** @brief The partition index if 2 - 4 partitions used. */ + unsigned int partition_index; + + /** @brief The component index of the second plane if dual plane. */ + unsigned int dual_plane_component; + + /** @brief The color endpoint encoding mode for each partition. */ + unsigned int color_endpoint_modes[4]; + + /** @brief The number of color endpoint quantization levels. */ + unsigned int color_level_count; + + /** @brief The number of weight quantization levels. */ + unsigned int weight_level_count; + + /** @brief The number of weights in the X dimension. */ + unsigned int weight_x; + + /** @brief The number of weights in the Y dimension. */ + unsigned int weight_y; + + /** @brief The number of weights in the Z dimension. */ + unsigned int weight_z; + + /** @brief The unpacked color endpoints for each partition. */ + float color_endpoints[4][2][4]; + + /** @brief The per-texel interpolation weights for the block. */ + float weight_values_plane1[216]; + + /** @brief The per-texel interpolation weights for the block. */ + float weight_values_plane2[216]; + + /** @brief The per-texel partition assignments for the block. */ + uint8_t partition_assignment[216]; +}; + +/** + * Populate a codec config based on default settings. + * + * Power users can edit the returned config struct to fine tune before allocating the context. + * + * @param profile Color profile. + * @param block_x ASTC block size X dimension. + * @param block_y ASTC block size Y dimension. + * @param block_z ASTC block size Z dimension. + * @param quality Search quality preset / effort level. Either an + * @c ASTCENC_PRE_* value, or a effort level between 0 + * and 100. Performance is not linear between 0 and 100. + + * @param flags A valid set of @c ASTCENC_FLG_* flag bits. + * @param[out] config Output config struct to populate. + * + * @return @c ASTCENC_SUCCESS on success, or an error if the inputs are invalid + * either individually, or in combination. + */ +ASTCENC_PUBLIC astcenc_error astcenc_config_init( + astcenc_profile profile, + unsigned int block_x, + unsigned int block_y, + unsigned int block_z, + float quality, + unsigned int flags, + astcenc_config* config); + +/** + * @brief Allocate a new codec context based on a config. + * + * This function allocates all of the memory resources and threads needed by the codec. This can be + * slow, so it is recommended that contexts are reused to serially compress or decompress multiple + * images to amortize setup cost. + * + * Contexts can be allocated to support only decompression using the @c ASTCENC_FLG_DECOMPRESS_ONLY + * flag when creating the configuration. The compression functions will fail if invoked. For a + * decompress-only library build the @c ASTCENC_FLG_DECOMPRESS_ONLY flag must be set when creating + * any context. + * + * @param[in] config Codec config. + * @param thread_count Thread count to configure for. + * @param[out] context Location to store an opaque context pointer. + * + * @return @c ASTCENC_SUCCESS on success, or an error if context creation failed. + */ +ASTCENC_PUBLIC astcenc_error astcenc_context_alloc( + const astcenc_config* config, + unsigned int thread_count, + astcenc_context** context); + +/** + * @brief Compress an image. + * + * A single context can only compress or decompress a single image at a time. + * + * For a context configured for multi-threading, any set of the N threads can call this function. + * Work will be dynamically scheduled across the threads available. Each thread must have a unique + * @c thread_index. + * + * @param context Codec context. + * @param[in,out] image An input image, in 2D slices. + * @param swizzle Compression data swizzle, applied before compression. + * @param[out] data_out Pointer to output data array. + * @param data_len Length of the output data array. + * @param thread_index Thread index [0..N-1] of calling thread. + * + * @return @c ASTCENC_SUCCESS on success, or an error if compression failed. + */ +ASTCENC_PUBLIC astcenc_error astcenc_compress_image( + astcenc_context* context, + astcenc_image* image, + const astcenc_swizzle* swizzle, + uint8_t* data_out, + size_t data_len, + unsigned int thread_index); + +/** + * @brief Reset the codec state for a new compression. + * + * The caller is responsible for synchronizing threads in the worker thread pool. This function must + * only be called when all threads have exited the @c astcenc_compress_image() function for image N, + * but before any thread enters it for image N + 1. + * + * Calling this is not required (but won't hurt), if the context is created for single threaded use. + * + * @param context Codec context. + * + * @return @c ASTCENC_SUCCESS on success, or an error if reset failed. + */ +ASTCENC_PUBLIC astcenc_error astcenc_compress_reset( + astcenc_context* context); + +/** + * @brief Cancel any pending compression operation. + * + * The caller must behave as if the compression completed normally, even though the data will be + * undefined. They are still responsible for synchronizing threads in the worker thread pool, and + * must call reset before starting another compression. + * + * @param context Codec context. + * + * @return @c ASTCENC_SUCCESS on success, or an error if cancellation failed. + */ +ASTCENC_PUBLIC astcenc_error astcenc_compress_cancel( + astcenc_context* context); + +/** + * @brief Decompress an image. + * + * @param context Codec context. + * @param[in] data Pointer to compressed data. + * @param data_len Length of the compressed data, in bytes. + * @param[in,out] image_out Output image. + * @param swizzle Decompression data swizzle, applied after decompression. + * @param thread_index Thread index [0..N-1] of calling thread. + * + * @return @c ASTCENC_SUCCESS on success, or an error if decompression failed. + */ +ASTCENC_PUBLIC astcenc_error astcenc_decompress_image( + astcenc_context* context, + const uint8_t* data, + size_t data_len, + astcenc_image* image_out, + const astcenc_swizzle* swizzle, + unsigned int thread_index); + +/** + * @brief Reset the codec state for a new decompression. + * + * The caller is responsible for synchronizing threads in the worker thread pool. This function must + * only be called when all threads have exited the @c astcenc_decompress_image() function for image + * N, but before any thread enters it for image N + 1. + * + * Calling this is not required (but won't hurt), if the context is created for single threaded use. + * + * @param context Codec context. + * + * @return @c ASTCENC_SUCCESS on success, or an error if reset failed. + */ +ASTCENC_PUBLIC astcenc_error astcenc_decompress_reset( + astcenc_context* context); + +/** + * Free the compressor context. + * + * @param context The codec context. + */ +ASTCENC_PUBLIC void astcenc_context_free( + astcenc_context* context); + +/** + * @brief Provide a high level summary of a block's encoding. + * + * This feature is primarily useful for codec developers but may be useful for developers building + * advanced content packaging pipelines. + * + * @param context Codec context. + * @param data One block of compressed ASTC data. + * @param info The output info structure to populate. + * + * @return @c ASTCENC_SUCCESS if the block was decoded, or an error otherwise. Note that this + * function will return success even if the block itself was an error block encoding, as the + * decode was correctly handled. + */ +ASTCENC_PUBLIC astcenc_error astcenc_get_block_info( + astcenc_context* context, + const uint8_t data[16], + astcenc_block_info* info); + +/** + * @brief Get a printable string for specific status code. + * + * @param status The status value. + * + * @return A human readable nul-terminated string. + */ +ASTCENC_PUBLIC const char* astcenc_get_error_string( + astcenc_error status); + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_averages_and_directions.cpp b/ktx/external/astc-encoder/Source/astcenc_averages_and_directions.cpp new file mode 100644 index 0000000..d1dea24 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_averages_and_directions.cpp @@ -0,0 +1,948 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2025 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for finding dominant direction of a set of colors. + */ +#if !defined(ASTCENC_DECOMPRESS_ONLY) + +#include "astcenc_internal.h" + +#include + +/** + * @brief Compute the average RGB color of each partition. + * + * The algorithm here uses a vectorized sequential scan and per-partition + * color accumulators, using select() to mask texel lanes in other partitions. + * + * We only accumulate sums for N-1 partitions during the scan; the value for + * the last partition can be computed given that we know the block-wide average + * already. + * + * Because of this we could reduce the loop iteration count so it "just" spans + * the max texel index needed for the N-1 partitions, which could need fewer + * iterations than the full block texel count. However, this makes the loop + * count erratic and causes more branch mispredictions so is a net loss. + * + * @param pi The partitioning to use. + * @param blk The block data to process. + * @param[out] averages The output averages. Unused partition indices will + * not be initialized, and lane<3> will be zero. + */ +static void compute_partition_averages_rgb( + const partition_info& pi, + const image_block& blk, + vfloat4 averages[BLOCK_MAX_PARTITIONS] +) { + unsigned int partition_count = pi.partition_count; + size_t texel_count = blk.texel_count; + promise(texel_count > 0); + + // For 1 partition just use the precomputed mean + if (partition_count == 1) + { + averages[0] = blk.data_mean.swz<0, 1, 2>(); + } + // For 2 partitions scan results for partition 0, compute partition 1 + else if (partition_count == 2) + { + vfloatacc pp_avg_rgb[3] {}; + + vint lane_id = vint::lane_id(); + for (size_t i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + vint texel_partition(pi.partition_of_texel + i); + + vmask lane_mask = lane_id < vint_from_size(texel_count); + lane_id += vint(ASTCENC_SIMD_WIDTH); + + vmask p0_mask = lane_mask & (texel_partition == vint(0)); + + vfloat data_r = loada(blk.data_r + i); + haccumulate(pp_avg_rgb[0], data_r, p0_mask); + + vfloat data_g = loada(blk.data_g + i); + haccumulate(pp_avg_rgb[1], data_g, p0_mask); + + vfloat data_b = loada(blk.data_b + i); + haccumulate(pp_avg_rgb[2], data_b, p0_mask); + } + + vfloat4 block_total = blk.data_mean.swz<0, 1, 2>() * static_cast(blk.texel_count); + + vfloat4 p0_total = vfloat3(hadd_s(pp_avg_rgb[0]), + hadd_s(pp_avg_rgb[1]), + hadd_s(pp_avg_rgb[2])); + + vfloat4 p1_total = block_total - p0_total; + + averages[0] = p0_total / static_cast(pi.partition_texel_count[0]); + averages[1] = p1_total / static_cast(pi.partition_texel_count[1]); + } + // For 3 partitions scan results for partition 0/1, compute partition 2 + else if (partition_count == 3) + { + vfloatacc pp_avg_rgb[2][3] {}; + + vint lane_id = vint::lane_id(); + for (size_t i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + vint texel_partition(pi.partition_of_texel + i); + + vmask lane_mask = lane_id < vint_from_size(texel_count); + lane_id += vint(ASTCENC_SIMD_WIDTH); + + vmask p0_mask = lane_mask & (texel_partition == vint(0)); + vmask p1_mask = lane_mask & (texel_partition == vint(1)); + + vfloat data_r = loada(blk.data_r + i); + haccumulate(pp_avg_rgb[0][0], data_r, p0_mask); + haccumulate(pp_avg_rgb[1][0], data_r, p1_mask); + + vfloat data_g = loada(blk.data_g + i); + haccumulate(pp_avg_rgb[0][1], data_g, p0_mask); + haccumulate(pp_avg_rgb[1][1], data_g, p1_mask); + + vfloat data_b = loada(blk.data_b + i); + haccumulate(pp_avg_rgb[0][2], data_b, p0_mask); + haccumulate(pp_avg_rgb[1][2], data_b, p1_mask); + } + + vfloat4 block_total = blk.data_mean.swz<0, 1, 2>() * static_cast(blk.texel_count); + + vfloat4 p0_total = vfloat3(hadd_s(pp_avg_rgb[0][0]), + hadd_s(pp_avg_rgb[0][1]), + hadd_s(pp_avg_rgb[0][2])); + + vfloat4 p1_total = vfloat3(hadd_s(pp_avg_rgb[1][0]), + hadd_s(pp_avg_rgb[1][1]), + hadd_s(pp_avg_rgb[1][2])); + + vfloat4 p2_total = block_total - p0_total - p1_total; + + averages[0] = p0_total / static_cast(pi.partition_texel_count[0]); + averages[1] = p1_total / static_cast(pi.partition_texel_count[1]); + averages[2] = p2_total / static_cast(pi.partition_texel_count[2]); + } + else + { + // For 4 partitions scan results for partition 0/1/2, compute partition 3 + vfloatacc pp_avg_rgb[3][3] {}; + + vint lane_id = vint::lane_id(); + for (size_t i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + vint texel_partition(pi.partition_of_texel + i); + + vmask lane_mask = lane_id < vint_from_size(texel_count); + lane_id += vint(ASTCENC_SIMD_WIDTH); + + vmask p0_mask = lane_mask & (texel_partition == vint(0)); + vmask p1_mask = lane_mask & (texel_partition == vint(1)); + vmask p2_mask = lane_mask & (texel_partition == vint(2)); + + vfloat data_r = loada(blk.data_r + i); + haccumulate(pp_avg_rgb[0][0], data_r, p0_mask); + haccumulate(pp_avg_rgb[1][0], data_r, p1_mask); + haccumulate(pp_avg_rgb[2][0], data_r, p2_mask); + + vfloat data_g = loada(blk.data_g + i); + haccumulate(pp_avg_rgb[0][1], data_g, p0_mask); + haccumulate(pp_avg_rgb[1][1], data_g, p1_mask); + haccumulate(pp_avg_rgb[2][1], data_g, p2_mask); + + vfloat data_b = loada(blk.data_b + i); + haccumulate(pp_avg_rgb[0][2], data_b, p0_mask); + haccumulate(pp_avg_rgb[1][2], data_b, p1_mask); + haccumulate(pp_avg_rgb[2][2], data_b, p2_mask); + } + + vfloat4 block_total = blk.data_mean.swz<0, 1, 2>() * static_cast(blk.texel_count); + + vfloat4 p0_total = vfloat3(hadd_s(pp_avg_rgb[0][0]), + hadd_s(pp_avg_rgb[0][1]), + hadd_s(pp_avg_rgb[0][2])); + + vfloat4 p1_total = vfloat3(hadd_s(pp_avg_rgb[1][0]), + hadd_s(pp_avg_rgb[1][1]), + hadd_s(pp_avg_rgb[1][2])); + + vfloat4 p2_total = vfloat3(hadd_s(pp_avg_rgb[2][0]), + hadd_s(pp_avg_rgb[2][1]), + hadd_s(pp_avg_rgb[2][2])); + + vfloat4 p3_total = block_total - p0_total - p1_total- p2_total; + + averages[0] = p0_total / static_cast(pi.partition_texel_count[0]); + averages[1] = p1_total / static_cast(pi.partition_texel_count[1]); + averages[2] = p2_total / static_cast(pi.partition_texel_count[2]); + averages[3] = p3_total / static_cast(pi.partition_texel_count[3]); + } +} + +/** + * @brief Compute the average RGBA color of each partition. + * + * The algorithm here uses a vectorized sequential scan and per-partition + * color accumulators, using select() to mask texel lanes in other partitions. + * + * We only accumulate sums for N-1 partitions during the scan; the value for + * the last partition can be computed given that we know the block-wide average + * already. + * + * Because of this we could reduce the loop iteration count so it "just" spans + * the max texel index needed for the N-1 partitions, which could need fewer + * iterations than the full block texel count. However, this makes the loop + * count erratic and causes more branch mispredictions so is a net loss. + * + * @param pi The partitioning to use. + * @param blk The block data to process. + * @param[out] averages The output averages. Unused partition indices will + * not be initialized. + */ +static void compute_partition_averages_rgba( + const partition_info& pi, + const image_block& blk, + vfloat4 averages[BLOCK_MAX_PARTITIONS] +) { + unsigned int partition_count = pi.partition_count; + size_t texel_count = blk.texel_count; + promise(texel_count > 0); + + // For 1 partition just use the precomputed mean + if (partition_count == 1) + { + averages[0] = blk.data_mean; + } + // For 2 partitions scan results for partition 0, compute partition 1 + else if (partition_count == 2) + { + vfloat4 pp_avg_rgba[4] {}; + + vint lane_id = vint::lane_id(); + for (size_t i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + vint texel_partition(pi.partition_of_texel + i); + + vmask lane_mask = lane_id < vint_from_size(texel_count); + lane_id += vint(ASTCENC_SIMD_WIDTH); + + vmask p0_mask = lane_mask & (texel_partition == vint(0)); + + vfloat data_r = loada(blk.data_r + i); + haccumulate(pp_avg_rgba[0], data_r, p0_mask); + + vfloat data_g = loada(blk.data_g + i); + haccumulate(pp_avg_rgba[1], data_g, p0_mask); + + vfloat data_b = loada(blk.data_b + i); + haccumulate(pp_avg_rgba[2], data_b, p0_mask); + + vfloat data_a = loada(blk.data_a + i); + haccumulate(pp_avg_rgba[3], data_a, p0_mask); + } + + vfloat4 block_total = blk.data_mean * static_cast(blk.texel_count); + + vfloat4 p0_total = vfloat4(hadd_s(pp_avg_rgba[0]), + hadd_s(pp_avg_rgba[1]), + hadd_s(pp_avg_rgba[2]), + hadd_s(pp_avg_rgba[3])); + + vfloat4 p1_total = block_total - p0_total; + + averages[0] = p0_total / static_cast(pi.partition_texel_count[0]); + averages[1] = p1_total / static_cast(pi.partition_texel_count[1]); + } + // For 3 partitions scan results for partition 0/1, compute partition 2 + else if (partition_count == 3) + { + vfloat4 pp_avg_rgba[2][4] {}; + + vint lane_id = vint::lane_id(); + for (size_t i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + vint texel_partition(pi.partition_of_texel + i); + + vmask lane_mask = lane_id < vint_from_size(texel_count); + lane_id += vint(ASTCENC_SIMD_WIDTH); + + vmask p0_mask = lane_mask & (texel_partition == vint(0)); + vmask p1_mask = lane_mask & (texel_partition == vint(1)); + + vfloat data_r = loada(blk.data_r + i); + haccumulate(pp_avg_rgba[0][0], data_r, p0_mask); + haccumulate(pp_avg_rgba[1][0], data_r, p1_mask); + + vfloat data_g = loada(blk.data_g + i); + haccumulate(pp_avg_rgba[0][1], data_g, p0_mask); + haccumulate(pp_avg_rgba[1][1], data_g, p1_mask); + + vfloat data_b = loada(blk.data_b + i); + haccumulate(pp_avg_rgba[0][2], data_b, p0_mask); + haccumulate(pp_avg_rgba[1][2], data_b, p1_mask); + + vfloat data_a = loada(blk.data_a + i); + haccumulate(pp_avg_rgba[0][3], data_a, p0_mask); + haccumulate(pp_avg_rgba[1][3], data_a, p1_mask); + } + + vfloat4 block_total = blk.data_mean * static_cast(blk.texel_count); + + vfloat4 p0_total = vfloat4(hadd_s(pp_avg_rgba[0][0]), + hadd_s(pp_avg_rgba[0][1]), + hadd_s(pp_avg_rgba[0][2]), + hadd_s(pp_avg_rgba[0][3])); + + vfloat4 p1_total = vfloat4(hadd_s(pp_avg_rgba[1][0]), + hadd_s(pp_avg_rgba[1][1]), + hadd_s(pp_avg_rgba[1][2]), + hadd_s(pp_avg_rgba[1][3])); + + vfloat4 p2_total = block_total - p0_total - p1_total; + + averages[0] = p0_total / static_cast(pi.partition_texel_count[0]); + averages[1] = p1_total / static_cast(pi.partition_texel_count[1]); + averages[2] = p2_total / static_cast(pi.partition_texel_count[2]); + } + else + { + // For 4 partitions scan results for partition 0/1/2, compute partition 3 + vfloat4 pp_avg_rgba[3][4] {}; + + vint lane_id = vint::lane_id(); + for (size_t i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + vint texel_partition(pi.partition_of_texel + i); + + vmask lane_mask = lane_id < vint_from_size(texel_count); + lane_id += vint(ASTCENC_SIMD_WIDTH); + + vmask p0_mask = lane_mask & (texel_partition == vint(0)); + vmask p1_mask = lane_mask & (texel_partition == vint(1)); + vmask p2_mask = lane_mask & (texel_partition == vint(2)); + + vfloat data_r = loada(blk.data_r + i); + haccumulate(pp_avg_rgba[0][0], data_r, p0_mask); + haccumulate(pp_avg_rgba[1][0], data_r, p1_mask); + haccumulate(pp_avg_rgba[2][0], data_r, p2_mask); + + vfloat data_g = loada(blk.data_g + i); + haccumulate(pp_avg_rgba[0][1], data_g, p0_mask); + haccumulate(pp_avg_rgba[1][1], data_g, p1_mask); + haccumulate(pp_avg_rgba[2][1], data_g, p2_mask); + + vfloat data_b = loada(blk.data_b + i); + haccumulate(pp_avg_rgba[0][2], data_b, p0_mask); + haccumulate(pp_avg_rgba[1][2], data_b, p1_mask); + haccumulate(pp_avg_rgba[2][2], data_b, p2_mask); + + vfloat data_a = loada(blk.data_a + i); + haccumulate(pp_avg_rgba[0][3], data_a, p0_mask); + haccumulate(pp_avg_rgba[1][3], data_a, p1_mask); + haccumulate(pp_avg_rgba[2][3], data_a, p2_mask); + } + + vfloat4 block_total = blk.data_mean * static_cast(blk.texel_count); + + vfloat4 p0_total = vfloat4(hadd_s(pp_avg_rgba[0][0]), + hadd_s(pp_avg_rgba[0][1]), + hadd_s(pp_avg_rgba[0][2]), + hadd_s(pp_avg_rgba[0][3])); + + vfloat4 p1_total = vfloat4(hadd_s(pp_avg_rgba[1][0]), + hadd_s(pp_avg_rgba[1][1]), + hadd_s(pp_avg_rgba[1][2]), + hadd_s(pp_avg_rgba[1][3])); + + vfloat4 p2_total = vfloat4(hadd_s(pp_avg_rgba[2][0]), + hadd_s(pp_avg_rgba[2][1]), + hadd_s(pp_avg_rgba[2][2]), + hadd_s(pp_avg_rgba[2][3])); + + vfloat4 p3_total = block_total - p0_total - p1_total- p2_total; + + averages[0] = p0_total / static_cast(pi.partition_texel_count[0]); + averages[1] = p1_total / static_cast(pi.partition_texel_count[1]); + averages[2] = p2_total / static_cast(pi.partition_texel_count[2]); + averages[3] = p3_total / static_cast(pi.partition_texel_count[3]); + } +} + +/* See header for documentation. */ +void compute_avgs_and_dirs_4_comp( + const partition_info& pi, + const image_block& blk, + partition_metrics pm[BLOCK_MAX_PARTITIONS] +) { + size_t partition_count = pi.partition_count; + promise(partition_count > 0); + + // Pre-compute partition_averages + vfloat4 partition_averages[BLOCK_MAX_PARTITIONS]; + compute_partition_averages_rgba(pi, blk, partition_averages); + + for (size_t partition = 0; partition < partition_count; partition++) + { + const uint8_t *texel_indexes = pi.texels_of_partition[partition]; + size_t texel_count = pi.partition_texel_count[partition]; + promise(texel_count > 0); + + vfloat4 average = partition_averages[partition]; + pm[partition].avg = average; + + vfloat4 sum_xp = vfloat4::zero(); + vfloat4 sum_yp = vfloat4::zero(); + vfloat4 sum_zp = vfloat4::zero(); + vfloat4 sum_wp = vfloat4::zero(); + + for (size_t i = 0; i < texel_count; i++) + { + unsigned int iwt = texel_indexes[i]; + vfloat4 texel_datum = blk.texel(iwt); + texel_datum = texel_datum - average; + + vfloat4 zero = vfloat4::zero(); + + vmask4 tdm0 = texel_datum.swz<0,0,0,0>() > zero; + sum_xp += select(zero, texel_datum, tdm0); + + vmask4 tdm1 = texel_datum.swz<1,1,1,1>() > zero; + sum_yp += select(zero, texel_datum, tdm1); + + vmask4 tdm2 = texel_datum.swz<2,2,2,2>() > zero; + sum_zp += select(zero, texel_datum, tdm2); + + vmask4 tdm3 = texel_datum.swz<3,3,3,3>() > zero; + sum_wp += select(zero, texel_datum, tdm3); + } + + vfloat4 prod_xp = dot(sum_xp, sum_xp); + vfloat4 prod_yp = dot(sum_yp, sum_yp); + vfloat4 prod_zp = dot(sum_zp, sum_zp); + vfloat4 prod_wp = dot(sum_wp, sum_wp); + + vfloat4 best_vector = sum_xp; + vfloat4 best_sum = prod_xp; + + vmask4 mask = prod_yp > best_sum; + best_vector = select(best_vector, sum_yp, mask); + best_sum = select(best_sum, prod_yp, mask); + + mask = prod_zp > best_sum; + best_vector = select(best_vector, sum_zp, mask); + best_sum = select(best_sum, prod_zp, mask); + + mask = prod_wp > best_sum; + best_vector = select(best_vector, sum_wp, mask); + + pm[partition].dir = best_vector; + } +} + +/* See header for documentation. */ +void compute_avgs_and_dirs_3_comp( + const partition_info& pi, + const image_block& blk, + unsigned int omitted_component, + partition_metrics pm[BLOCK_MAX_PARTITIONS] +) { + // Pre-compute partition_averages + vfloat4 partition_averages[BLOCK_MAX_PARTITIONS]; + compute_partition_averages_rgba(pi, blk, partition_averages); + + const float* data_vr = blk.data_r; + const float* data_vg = blk.data_g; + const float* data_vb = blk.data_b; + + // TODO: Data-driven permute would be useful to avoid this ... + if (omitted_component == 0) + { + partition_averages[0] = partition_averages[0].swz<1, 2, 3>(); + partition_averages[1] = partition_averages[1].swz<1, 2, 3>(); + partition_averages[2] = partition_averages[2].swz<1, 2, 3>(); + partition_averages[3] = partition_averages[3].swz<1, 2, 3>(); + + data_vr = blk.data_g; + data_vg = blk.data_b; + data_vb = blk.data_a; + } + else if (omitted_component == 1) + { + partition_averages[0] = partition_averages[0].swz<0, 2, 3>(); + partition_averages[1] = partition_averages[1].swz<0, 2, 3>(); + partition_averages[2] = partition_averages[2].swz<0, 2, 3>(); + partition_averages[3] = partition_averages[3].swz<0, 2, 3>(); + + data_vg = blk.data_b; + data_vb = blk.data_a; + } + else if (omitted_component == 2) + { + partition_averages[0] = partition_averages[0].swz<0, 1, 3>(); + partition_averages[1] = partition_averages[1].swz<0, 1, 3>(); + partition_averages[2] = partition_averages[2].swz<0, 1, 3>(); + partition_averages[3] = partition_averages[3].swz<0, 1, 3>(); + + data_vb = blk.data_a; + } + else + { + partition_averages[0] = partition_averages[0].swz<0, 1, 2>(); + partition_averages[1] = partition_averages[1].swz<0, 1, 2>(); + partition_averages[2] = partition_averages[2].swz<0, 1, 2>(); + partition_averages[3] = partition_averages[3].swz<0, 1, 2>(); + } + + size_t partition_count = pi.partition_count; + promise(partition_count > 0); + + for (size_t partition = 0; partition < partition_count; partition++) + { + const uint8_t *texel_indexes = pi.texels_of_partition[partition]; + size_t texel_count = pi.partition_texel_count[partition]; + promise(texel_count > 0); + + vfloat4 average = partition_averages[partition]; + pm[partition].avg = average; + + vfloat4 sum_xp = vfloat4::zero(); + vfloat4 sum_yp = vfloat4::zero(); + vfloat4 sum_zp = vfloat4::zero(); + + for (size_t i = 0; i < texel_count; i++) + { + unsigned int iwt = texel_indexes[i]; + + vfloat4 texel_datum = vfloat3(data_vr[iwt], + data_vg[iwt], + data_vb[iwt]); + texel_datum = texel_datum - average; + + vfloat4 zero = vfloat4::zero(); + + vmask4 tdm0 = texel_datum.swz<0,0,0,0>() > zero; + sum_xp += select(zero, texel_datum, tdm0); + + vmask4 tdm1 = texel_datum.swz<1,1,1,1>() > zero; + sum_yp += select(zero, texel_datum, tdm1); + + vmask4 tdm2 = texel_datum.swz<2,2,2,2>() > zero; + sum_zp += select(zero, texel_datum, tdm2); + } + + vfloat4 prod_xp = dot(sum_xp, sum_xp); + vfloat4 prod_yp = dot(sum_yp, sum_yp); + vfloat4 prod_zp = dot(sum_zp, sum_zp); + + vfloat4 best_vector = sum_xp; + vfloat4 best_sum = prod_xp; + + vmask4 mask = prod_yp > best_sum; + best_vector = select(best_vector, sum_yp, mask); + best_sum = select(best_sum, prod_yp, mask); + + mask = prod_zp > best_sum; + best_vector = select(best_vector, sum_zp, mask); + + pm[partition].dir = best_vector; + } +} + +/* See header for documentation. */ +void compute_avgs_and_dirs_3_comp_rgb( + const partition_info& pi, + const image_block& blk, + partition_metrics pm[BLOCK_MAX_PARTITIONS] +) { + size_t partition_count = pi.partition_count; + promise(partition_count > 0); + + // Pre-compute partition_averages + vfloat4 partition_averages[BLOCK_MAX_PARTITIONS]; + compute_partition_averages_rgb(pi, blk, partition_averages); + + for (size_t partition = 0; partition < partition_count; partition++) + { + const uint8_t *texel_indexes = pi.texels_of_partition[partition]; + size_t texel_count = pi.partition_texel_count[partition]; + promise(texel_count > 0); + + vfloat4 average = partition_averages[partition]; + pm[partition].avg = average; + + vfloat4 sum_xp = vfloat4::zero(); + vfloat4 sum_yp = vfloat4::zero(); + vfloat4 sum_zp = vfloat4::zero(); + + for (size_t i = 0; i < texel_count; i++) + { + unsigned int iwt = texel_indexes[i]; + + vfloat4 texel_datum = blk.texel3(iwt); + texel_datum = texel_datum - average; + + vfloat4 zero = vfloat4::zero(); + + vmask4 tdm0 = texel_datum.swz<0,0,0,0>() > zero; + sum_xp += select(zero, texel_datum, tdm0); + + vmask4 tdm1 = texel_datum.swz<1,1,1,1>() > zero; + sum_yp += select(zero, texel_datum, tdm1); + + vmask4 tdm2 = texel_datum.swz<2,2,2,2>() > zero; + sum_zp += select(zero, texel_datum, tdm2); + } + + vfloat4 prod_xp = dot(sum_xp, sum_xp); + vfloat4 prod_yp = dot(sum_yp, sum_yp); + vfloat4 prod_zp = dot(sum_zp, sum_zp); + + vfloat4 best_vector = sum_xp; + vfloat4 best_sum = prod_xp; + + vmask4 mask = prod_yp > best_sum; + best_vector = select(best_vector, sum_yp, mask); + best_sum = select(best_sum, prod_yp, mask); + + mask = prod_zp > best_sum; + best_vector = select(best_vector, sum_zp, mask); + + pm[partition].dir = best_vector; + } +} + +/* See header for documentation. */ +void compute_avgs_and_dirs_2_comp( + const partition_info& pt, + const image_block& blk, + unsigned int component1, + unsigned int component2, + partition_metrics pm[BLOCK_MAX_PARTITIONS] +) { + vfloat4 average; + + const float* data_vr = nullptr; + const float* data_vg = nullptr; + + if (component1 == 0 && component2 == 1) + { + average = blk.data_mean.swz<0, 1>(); + + data_vr = blk.data_r; + data_vg = blk.data_g; + } + else if (component1 == 0 && component2 == 2) + { + average = blk.data_mean.swz<0, 2>(); + + data_vr = blk.data_r; + data_vg = blk.data_b; + } + else // (component1 == 1 && component2 == 2) + { + assert(component1 == 1 && component2 == 2); + + average = blk.data_mean.swz<1, 2>(); + + data_vr = blk.data_g; + data_vg = blk.data_b; + } + + size_t partition_count = pt.partition_count; + promise(partition_count > 0); + + for (size_t partition = 0; partition < partition_count; partition++) + { + const uint8_t *texel_indexes = pt.texels_of_partition[partition]; + size_t texel_count = pt.partition_texel_count[partition]; + promise(texel_count > 0); + + // Only compute a partition mean if more than one partition + if (partition_count > 1) + { + average = vfloat4::zero(); + for (size_t i = 0; i < texel_count; i++) + { + unsigned int iwt = texel_indexes[i]; + average += vfloat2(data_vr[iwt], data_vg[iwt]); + } + + average = average / static_cast(texel_count); + } + + pm[partition].avg = average; + + vfloat4 sum_xp = vfloat4::zero(); + vfloat4 sum_yp = vfloat4::zero(); + + for (size_t i = 0; i < texel_count; i++) + { + unsigned int iwt = texel_indexes[i]; + vfloat4 texel_datum = vfloat2(data_vr[iwt], data_vg[iwt]); + texel_datum = texel_datum - average; + + vfloat4 zero = vfloat4::zero(); + + vmask4 tdm0 = texel_datum.swz<0,0,0,0>() > zero; + sum_xp += select(zero, texel_datum, tdm0); + + vmask4 tdm1 = texel_datum.swz<1,1,1,1>() > zero; + sum_yp += select(zero, texel_datum, tdm1); + } + + vfloat4 prod_xp = dot(sum_xp, sum_xp); + vfloat4 prod_yp = dot(sum_yp, sum_yp); + + vfloat4 best_vector = sum_xp; + vfloat4 best_sum = prod_xp; + + vmask4 mask = prod_yp > best_sum; + best_vector = select(best_vector, sum_yp, mask); + + pm[partition].dir = best_vector; + } +} + +/* See header for documentation. */ +void compute_error_squared_rgba( + const partition_info& pi, + const image_block& blk, + const processed_line4 uncor_plines[BLOCK_MAX_PARTITIONS], + const processed_line4 samec_plines[BLOCK_MAX_PARTITIONS], + float line_lengths[BLOCK_MAX_PARTITIONS], + float& uncor_error, + float& samec_error +) { + size_t partition_count = pi.partition_count; + promise(partition_count > 0); + + vfloatacc uncor_errorsumv = vfloatacc::zero(); + vfloatacc samec_errorsumv = vfloatacc::zero(); + + for (size_t partition = 0; partition < partition_count; partition++) + { + const uint8_t *texel_indexes = pi.texels_of_partition[partition]; + + processed_line4 l_uncor = uncor_plines[partition]; + processed_line4 l_samec = samec_plines[partition]; + + size_t texel_count = pi.partition_texel_count[partition]; + promise(texel_count > 0); + + // Vectorize some useful scalar inputs + vfloat l_uncor_bs0(l_uncor.bs.lane<0>()); + vfloat l_uncor_bs1(l_uncor.bs.lane<1>()); + vfloat l_uncor_bs2(l_uncor.bs.lane<2>()); + vfloat l_uncor_bs3(l_uncor.bs.lane<3>()); + + vfloat l_uncor_amod0(l_uncor.amod.lane<0>()); + vfloat l_uncor_amod1(l_uncor.amod.lane<1>()); + vfloat l_uncor_amod2(l_uncor.amod.lane<2>()); + vfloat l_uncor_amod3(l_uncor.amod.lane<3>()); + + vfloat l_samec_bs0(l_samec.bs.lane<0>()); + vfloat l_samec_bs1(l_samec.bs.lane<1>()); + vfloat l_samec_bs2(l_samec.bs.lane<2>()); + vfloat l_samec_bs3(l_samec.bs.lane<3>()); + + assert(all(l_samec.amod == vfloat4(0.0f))); + + vfloat uncor_loparamv(1e10f); + vfloat uncor_hiparamv(-1e10f); + + vfloat ew_r(blk.channel_weight.lane<0>()); + vfloat ew_g(blk.channel_weight.lane<1>()); + vfloat ew_b(blk.channel_weight.lane<2>()); + vfloat ew_a(blk.channel_weight.lane<3>()); + + // This implementation over-shoots, but this is safe as we initialize the texel_indexes + // array to extend the last value. This means min/max are not impacted, but we need to mask + // out the dummy values when we compute the line weighting. + vint lane_ids = vint::lane_id(); + for (size_t i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + vmask mask = lane_ids < vint_from_size(texel_count); + const uint8_t* texel_idxs = texel_indexes + i; + + vfloat data_r = gatherf_byte_inds(blk.data_r, texel_idxs); + vfloat data_g = gatherf_byte_inds(blk.data_g, texel_idxs); + vfloat data_b = gatherf_byte_inds(blk.data_b, texel_idxs); + vfloat data_a = gatherf_byte_inds(blk.data_a, texel_idxs); + + vfloat uncor_param = (data_r * l_uncor_bs0) + + (data_g * l_uncor_bs1) + + (data_b * l_uncor_bs2) + + (data_a * l_uncor_bs3); + + uncor_loparamv = min(uncor_param, uncor_loparamv); + uncor_hiparamv = max(uncor_param, uncor_hiparamv); + + vfloat uncor_dist0 = (l_uncor_amod0 - data_r) + + (uncor_param * l_uncor_bs0); + vfloat uncor_dist1 = (l_uncor_amod1 - data_g) + + (uncor_param * l_uncor_bs1); + vfloat uncor_dist2 = (l_uncor_amod2 - data_b) + + (uncor_param * l_uncor_bs2); + vfloat uncor_dist3 = (l_uncor_amod3 - data_a) + + (uncor_param * l_uncor_bs3); + + vfloat uncor_err = (ew_r * uncor_dist0 * uncor_dist0) + + (ew_g * uncor_dist1 * uncor_dist1) + + (ew_b * uncor_dist2 * uncor_dist2) + + (ew_a * uncor_dist3 * uncor_dist3); + + haccumulate(uncor_errorsumv, uncor_err, mask); + + // Process samechroma data + vfloat samec_param = (data_r * l_samec_bs0) + + (data_g * l_samec_bs1) + + (data_b * l_samec_bs2) + + (data_a * l_samec_bs3); + + vfloat samec_dist0 = samec_param * l_samec_bs0 - data_r; + vfloat samec_dist1 = samec_param * l_samec_bs1 - data_g; + vfloat samec_dist2 = samec_param * l_samec_bs2 - data_b; + vfloat samec_dist3 = samec_param * l_samec_bs3 - data_a; + + vfloat samec_err = (ew_r * samec_dist0 * samec_dist0) + + (ew_g * samec_dist1 * samec_dist1) + + (ew_b * samec_dist2 * samec_dist2) + + (ew_a * samec_dist3 * samec_dist3); + + haccumulate(samec_errorsumv, samec_err, mask); + + lane_ids += vint(ASTCENC_SIMD_WIDTH); + } + + // Turn very small numbers and NaNs into a small number + float uncor_linelen = hmax_s(uncor_hiparamv) - hmin_s(uncor_loparamv); + line_lengths[partition] = astc::max(uncor_linelen, 1e-7f); + } + + uncor_error = hadd_s(uncor_errorsumv); + samec_error = hadd_s(samec_errorsumv); +} + +/* See header for documentation. */ +void compute_error_squared_rgb( + const partition_info& pi, + const image_block& blk, + partition_lines3 plines[BLOCK_MAX_PARTITIONS], + float& uncor_error, + float& samec_error +) { + size_t partition_count = pi.partition_count; + promise(partition_count > 0); + + vfloatacc uncor_errorsumv = vfloatacc::zero(); + vfloatacc samec_errorsumv = vfloatacc::zero(); + + for (size_t partition = 0; partition < partition_count; partition++) + { + partition_lines3& pl = plines[partition]; + const uint8_t *texel_indexes = pi.texels_of_partition[partition]; + size_t texel_count = pi.partition_texel_count[partition]; + promise(texel_count > 0); + + processed_line3 l_uncor = pl.uncor_pline; + processed_line3 l_samec = pl.samec_pline; + + // Vectorize some useful scalar inputs + vfloat l_uncor_bs0(l_uncor.bs.lane<0>()); + vfloat l_uncor_bs1(l_uncor.bs.lane<1>()); + vfloat l_uncor_bs2(l_uncor.bs.lane<2>()); + + vfloat l_uncor_amod0(l_uncor.amod.lane<0>()); + vfloat l_uncor_amod1(l_uncor.amod.lane<1>()); + vfloat l_uncor_amod2(l_uncor.amod.lane<2>()); + + vfloat l_samec_bs0(l_samec.bs.lane<0>()); + vfloat l_samec_bs1(l_samec.bs.lane<1>()); + vfloat l_samec_bs2(l_samec.bs.lane<2>()); + + assert(all(l_samec.amod == vfloat4(0.0f))); + + vfloat uncor_loparamv(1e10f); + vfloat uncor_hiparamv(-1e10f); + + vfloat ew_r(blk.channel_weight.lane<0>()); + vfloat ew_g(blk.channel_weight.lane<1>()); + vfloat ew_b(blk.channel_weight.lane<2>()); + + // This implementation over-shoots, but this is safe as we initialize the weights array + // to extend the last value. This means min/max are not impacted, but we need to mask + // out the dummy values when we compute the line weighting. + vint lane_ids = vint::lane_id(); + for (size_t i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + vmask mask = lane_ids < vint_from_size(texel_count); + const uint8_t* texel_idxs = texel_indexes + i; + + vfloat data_r = gatherf_byte_inds(blk.data_r, texel_idxs); + vfloat data_g = gatherf_byte_inds(blk.data_g, texel_idxs); + vfloat data_b = gatherf_byte_inds(blk.data_b, texel_idxs); + + vfloat uncor_param = (data_r * l_uncor_bs0) + + (data_g * l_uncor_bs1) + + (data_b * l_uncor_bs2); + + uncor_loparamv = min(uncor_param, uncor_loparamv); + uncor_hiparamv = max(uncor_param, uncor_hiparamv); + + vfloat uncor_dist0 = (l_uncor_amod0 - data_r) + + (uncor_param * l_uncor_bs0); + vfloat uncor_dist1 = (l_uncor_amod1 - data_g) + + (uncor_param * l_uncor_bs1); + vfloat uncor_dist2 = (l_uncor_amod2 - data_b) + + (uncor_param * l_uncor_bs2); + + vfloat uncor_err = (ew_r * uncor_dist0 * uncor_dist0) + + (ew_g * uncor_dist1 * uncor_dist1) + + (ew_b * uncor_dist2 * uncor_dist2); + + haccumulate(uncor_errorsumv, uncor_err, mask); + + // Process samechroma data + vfloat samec_param = (data_r * l_samec_bs0) + + (data_g * l_samec_bs1) + + (data_b * l_samec_bs2); + + vfloat samec_dist0 = samec_param * l_samec_bs0 - data_r; + vfloat samec_dist1 = samec_param * l_samec_bs1 - data_g; + vfloat samec_dist2 = samec_param * l_samec_bs2 - data_b; + + vfloat samec_err = (ew_r * samec_dist0 * samec_dist0) + + (ew_g * samec_dist1 * samec_dist1) + + (ew_b * samec_dist2 * samec_dist2); + + haccumulate(samec_errorsumv, samec_err, mask); + + lane_ids += vint(ASTCENC_SIMD_WIDTH); + } + + // Turn very small numbers and NaNs into a small number + float uncor_linelen = hmax_s(uncor_hiparamv) - hmin_s(uncor_loparamv); + pl.line_length = astc::max(uncor_linelen, 1e-7f); + } + + uncor_error = hadd_s(uncor_errorsumv); + samec_error = hadd_s(samec_errorsumv); +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_block_sizes.cpp b/ktx/external/astc-encoder/Source/astcenc_block_sizes.cpp new file mode 100644 index 0000000..399e693 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_block_sizes.cpp @@ -0,0 +1,1184 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2025 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions to generate block size descriptor and decimation tables. + */ + +#include "astcenc_internal.h" + +/** + * @brief Decode the properties of an encoded 2D block mode. + * + * @param block_mode The encoded block mode. + * @param[out] x_weights The number of weights in the X dimension. + * @param[out] y_weights The number of weights in the Y dimension. + * @param[out] is_dual_plane True if this block mode has two weight planes. + * @param[out] quant_mode The quantization level for the weights. + * @param[out] weight_bits The storage bit count for the weights. + * + * @return Returns true if a valid mode, false otherwise. + */ +static bool decode_block_mode_2d( + unsigned int block_mode, + unsigned int& x_weights, + unsigned int& y_weights, + bool& is_dual_plane, + unsigned int& quant_mode, + unsigned int& weight_bits +) { + unsigned int base_quant_mode = (block_mode >> 4) & 1; + unsigned int H = (block_mode >> 9) & 1; + unsigned int D = (block_mode >> 10) & 1; + unsigned int A = (block_mode >> 5) & 0x3; + + x_weights = 0; + y_weights = 0; + + if ((block_mode & 3) != 0) + { + base_quant_mode |= (block_mode & 3) << 1; + unsigned int B = (block_mode >> 7) & 3; + switch ((block_mode >> 2) & 3) + { + case 0: + x_weights = B + 4; + y_weights = A + 2; + break; + case 1: + x_weights = B + 8; + y_weights = A + 2; + break; + case 2: + x_weights = A + 2; + y_weights = B + 8; + break; + case 3: + B &= 1; + if (block_mode & 0x100) + { + x_weights = B + 2; + y_weights = A + 2; + } + else + { + x_weights = A + 2; + y_weights = B + 6; + } + break; + } + } + else + { + base_quant_mode |= ((block_mode >> 2) & 3) << 1; + if (((block_mode >> 2) & 3) == 0) + { + return false; + } + + unsigned int B = (block_mode >> 9) & 3; + switch ((block_mode >> 7) & 3) + { + case 0: + x_weights = 12; + y_weights = A + 2; + break; + case 1: + x_weights = A + 2; + y_weights = 12; + break; + case 2: + x_weights = A + 6; + y_weights = B + 6; + D = 0; + H = 0; + break; + case 3: + switch ((block_mode >> 5) & 3) + { + case 0: + x_weights = 6; + y_weights = 10; + break; + case 1: + x_weights = 10; + y_weights = 6; + break; + case 2: + case 3: + return false; + } + break; + } + } + + unsigned int weight_count = x_weights * y_weights * (D + 1); + quant_mode = (base_quant_mode - 2) + 6 * H; + is_dual_plane = D != 0; + + weight_bits = get_ise_sequence_bitcount(weight_count, static_cast(quant_mode)); + return (weight_count <= BLOCK_MAX_WEIGHTS && + weight_bits >= BLOCK_MIN_WEIGHT_BITS && + weight_bits <= BLOCK_MAX_WEIGHT_BITS); +} + +/** + * @brief Decode the properties of an encoded 3D block mode. + * + * @param block_mode The encoded block mode. + * @param[out] x_weights The number of weights in the X dimension. + * @param[out] y_weights The number of weights in the Y dimension. + * @param[out] z_weights The number of weights in the Z dimension. + * @param[out] is_dual_plane True if this block mode has two weight planes. + * @param[out] quant_mode The quantization level for the weights. + * @param[out] weight_bits The storage bit count for the weights. + * + * @return Returns true if a valid mode, false otherwise. + */ +static bool decode_block_mode_3d( + unsigned int block_mode, + unsigned int& x_weights, + unsigned int& y_weights, + unsigned int& z_weights, + bool& is_dual_plane, + unsigned int& quant_mode, + unsigned int& weight_bits +) { + unsigned int base_quant_mode = (block_mode >> 4) & 1; + unsigned int H = (block_mode >> 9) & 1; + unsigned int D = (block_mode >> 10) & 1; + unsigned int A = (block_mode >> 5) & 0x3; + + x_weights = 0; + y_weights = 0; + z_weights = 0; + + if ((block_mode & 3) != 0) + { + base_quant_mode |= (block_mode & 3) << 1; + unsigned int B = (block_mode >> 7) & 3; + unsigned int C = (block_mode >> 2) & 0x3; + x_weights = A + 2; + y_weights = B + 2; + z_weights = C + 2; + } + else + { + base_quant_mode |= ((block_mode >> 2) & 3) << 1; + if (((block_mode >> 2) & 3) == 0) + { + return false; + } + + int B = (block_mode >> 9) & 3; + if (((block_mode >> 7) & 3) != 3) + { + D = 0; + H = 0; + } + switch ((block_mode >> 7) & 3) + { + case 0: + x_weights = 6; + y_weights = B + 2; + z_weights = A + 2; + break; + case 1: + x_weights = A + 2; + y_weights = 6; + z_weights = B + 2; + break; + case 2: + x_weights = A + 2; + y_weights = B + 2; + z_weights = 6; + break; + case 3: + x_weights = 2; + y_weights = 2; + z_weights = 2; + switch ((block_mode >> 5) & 3) + { + case 0: + x_weights = 6; + break; + case 1: + y_weights = 6; + break; + case 2: + z_weights = 6; + break; + case 3: + return false; + } + break; + } + } + + unsigned int weight_count = x_weights * y_weights * z_weights * (D + 1); + quant_mode = (base_quant_mode - 2) + 6 * H; + is_dual_plane = D != 0; + + weight_bits = get_ise_sequence_bitcount(weight_count, static_cast(quant_mode)); + return (weight_count <= BLOCK_MAX_WEIGHTS && + weight_bits >= BLOCK_MIN_WEIGHT_BITS && + weight_bits <= BLOCK_MAX_WEIGHT_BITS); +} + +/** + * @brief Create a 2D decimation entry for a block-size and weight-decimation pair. + * + * @param x_texels The number of texels in the X dimension. + * @param y_texels The number of texels in the Y dimension. + * @param x_weights The number of weights in the X dimension. + * @param y_weights The number of weights in the Y dimension. + * @param[out] di The decimation info structure to populate. + * @param[out] wb The decimation table init scratch working buffers. + */ +static void init_decimation_info_2d( + unsigned int x_texels, + unsigned int y_texels, + unsigned int x_weights, + unsigned int y_weights, + decimation_info& di, + dt_init_working_buffers& wb +) { + unsigned int texels_per_block = x_texels * y_texels; + unsigned int weights_per_block = x_weights * y_weights; + + uint8_t max_texel_count_of_weight = 0; + + promise(weights_per_block > 0); + promise(texels_per_block > 0); + promise(x_texels > 0); + promise(y_texels > 0); + + for (unsigned int i = 0; i < weights_per_block; i++) + { + wb.texel_count_of_weight[i] = 0; + } + + for (unsigned int i = 0; i < texels_per_block; i++) + { + wb.weight_count_of_texel[i] = 0; + } + + for (unsigned int y = 0; y < y_texels; y++) + { + for (unsigned int x = 0; x < x_texels; x++) + { + unsigned int texel = y * x_texels + x; + + unsigned int x_weight = (((1024 + x_texels / 2) / (x_texels - 1)) * x * (x_weights - 1) + 32) >> 6; + unsigned int y_weight = (((1024 + y_texels / 2) / (y_texels - 1)) * y * (y_weights - 1) + 32) >> 6; + + unsigned int x_weight_frac = x_weight & 0xF; + unsigned int y_weight_frac = y_weight & 0xF; + unsigned int x_weight_int = x_weight >> 4; + unsigned int y_weight_int = y_weight >> 4; + + unsigned int qweight[4]; + qweight[0] = x_weight_int + y_weight_int * x_weights; + qweight[1] = qweight[0] + 1; + qweight[2] = qweight[0] + x_weights; + qweight[3] = qweight[2] + 1; + + // Truncated-precision bilinear interpolation + unsigned int prod = x_weight_frac * y_weight_frac; + + unsigned int weight[4]; + weight[3] = (prod + 8) >> 4; + weight[1] = x_weight_frac - weight[3]; + weight[2] = y_weight_frac - weight[3]; + weight[0] = 16 - x_weight_frac - y_weight_frac + weight[3]; + + for (unsigned int i = 0; i < 4; i++) + { + if (weight[i] != 0) + { + wb.grid_weights_of_texel[texel][wb.weight_count_of_texel[texel]] = static_cast(qweight[i]); + wb.weights_of_texel[texel][wb.weight_count_of_texel[texel]] = static_cast(weight[i]); + wb.weight_count_of_texel[texel]++; + wb.texels_of_weight[qweight[i]][wb.texel_count_of_weight[qweight[i]]] = static_cast(texel); + wb.texel_weights_of_weight[qweight[i]][wb.texel_count_of_weight[qweight[i]]] = static_cast(weight[i]); + wb.texel_count_of_weight[qweight[i]]++; + max_texel_count_of_weight = astc::max(max_texel_count_of_weight, wb.texel_count_of_weight[qweight[i]]); + } + } + } + } + + uint8_t max_texel_weight_count = 0; + for (unsigned int i = 0; i < texels_per_block; i++) + { + di.texel_weight_count[i] = wb.weight_count_of_texel[i]; + max_texel_weight_count = astc::max(max_texel_weight_count, di.texel_weight_count[i]); + + for (unsigned int j = 0; j < wb.weight_count_of_texel[i]; j++) + { + di.texel_weight_contribs_int_tr[j][i] = wb.weights_of_texel[i][j]; + di.texel_weight_contribs_float_tr[j][i] = static_cast(wb.weights_of_texel[i][j]) * (1.0f / WEIGHTS_TEXEL_SUM); + di.texel_weights_tr[j][i] = wb.grid_weights_of_texel[i][j]; + } + + // Init all 4 entries so we can rely on zeros for vectorization + for (unsigned int j = wb.weight_count_of_texel[i]; j < 4; j++) + { + di.texel_weight_contribs_int_tr[j][i] = 0; + di.texel_weight_contribs_float_tr[j][i] = 0.0f; + di.texel_weights_tr[j][i] = 0; + } + } + + di.max_texel_weight_count = max_texel_weight_count; + + for (unsigned int i = 0; i < weights_per_block; i++) + { + unsigned int texel_count_wt = wb.texel_count_of_weight[i]; + di.weight_texel_count[i] = static_cast(texel_count_wt); + + for (unsigned int j = 0; j < texel_count_wt; j++) + { + uint8_t texel = wb.texels_of_weight[i][j]; + + // Create transposed versions of these for better vectorization + di.weight_texels_tr[j][i] = texel; + di.weights_texel_contribs_tr[j][i] = static_cast(wb.texel_weights_of_weight[i][j]); + + // Store the per-texel contribution of this weight for each texel it contributes to + di.texel_contrib_for_weight[j][i] = 0.0f; + for (unsigned int k = 0; k < 4; k++) + { + uint8_t dttw = di.texel_weights_tr[k][texel]; + float dttwf = di.texel_weight_contribs_float_tr[k][texel]; + if (dttw == i && dttwf != 0.0f) + { + di.texel_contrib_for_weight[j][i] = di.texel_weight_contribs_float_tr[k][texel]; + break; + } + } + } + + // Initialize array tail so we can over-fetch with SIMD later to avoid loop tails + // Match last texel in active lane in SIMD group, for better gathers + uint8_t last_texel = di.weight_texels_tr[texel_count_wt - 1][i]; + for (unsigned int j = texel_count_wt; j < max_texel_count_of_weight; j++) + { + di.weight_texels_tr[j][i] = last_texel; + di.weights_texel_contribs_tr[j][i] = 0.0f; + } + } + + // Initialize array tail so we can over-fetch with SIMD later to avoid loop tails + size_t texels_per_block_simd = round_up_to_simd_multiple_vla(texels_per_block); + for (size_t i = texels_per_block; i < texels_per_block_simd; i++) + { + di.texel_weight_count[i] = 0; + + for (size_t j = 0; j < 4; j++) + { + di.texel_weight_contribs_float_tr[j][i] = 0; + di.texel_weights_tr[j][i] = 0; + di.texel_weight_contribs_int_tr[j][i] = 0; + } + } + + // Initialize array tail so we can over-fetch with SIMD later to avoid loop tails + // Match last texel in active lane in SIMD group, for better gathers + unsigned int last_texel_count_wt = wb.texel_count_of_weight[weights_per_block - 1]; + uint8_t last_texel = di.weight_texels_tr[last_texel_count_wt - 1][weights_per_block - 1]; + + size_t weights_per_block_simd = round_up_to_simd_multiple_vla(weights_per_block); + for (size_t i = weights_per_block; i < weights_per_block_simd; i++) + { + di.weight_texel_count[i] = 0; + + for (size_t j = 0; j < max_texel_count_of_weight; j++) + { + di.weight_texels_tr[j][i] = last_texel; + di.weights_texel_contribs_tr[j][i] = 0.0f; + } + } + + di.texel_count = static_cast(texels_per_block); + di.weight_count = static_cast(weights_per_block); + di.weight_x = static_cast(x_weights); + di.weight_y = static_cast(y_weights); + di.weight_z = 1; +} + +/** + * @brief Create a 3D decimation entry for a block-size and weight-decimation pair. + * + * @param x_texels The number of texels in the X dimension. + * @param y_texels The number of texels in the Y dimension. + * @param z_texels The number of texels in the Z dimension. + * @param x_weights The number of weights in the X dimension. + * @param y_weights The number of weights in the Y dimension. + * @param z_weights The number of weights in the Z dimension. + * @param[out] di The decimation info structure to populate. + @param[out] wb The decimation table init scratch working buffers. + */ +static void init_decimation_info_3d( + unsigned int x_texels, + unsigned int y_texels, + unsigned int z_texels, + unsigned int x_weights, + unsigned int y_weights, + unsigned int z_weights, + decimation_info& di, + dt_init_working_buffers& wb +) { + unsigned int texels_per_block = x_texels * y_texels * z_texels; + unsigned int weights_per_block = x_weights * y_weights * z_weights; + + uint8_t max_texel_count_of_weight = 0; + + promise(weights_per_block > 0); + promise(texels_per_block > 0); + + for (unsigned int i = 0; i < weights_per_block; i++) + { + wb.texel_count_of_weight[i] = 0; + } + + for (unsigned int i = 0; i < texels_per_block; i++) + { + wb.weight_count_of_texel[i] = 0; + } + + for (unsigned int z = 0; z < z_texels; z++) + { + for (unsigned int y = 0; y < y_texels; y++) + { + for (unsigned int x = 0; x < x_texels; x++) + { + int texel = (z * y_texels + y) * x_texels + x; + + int x_weight = (((1024 + x_texels / 2) / (x_texels - 1)) * x * (x_weights - 1) + 32) >> 6; + int y_weight = (((1024 + y_texels / 2) / (y_texels - 1)) * y * (y_weights - 1) + 32) >> 6; + int z_weight = (((1024 + z_texels / 2) / (z_texels - 1)) * z * (z_weights - 1) + 32) >> 6; + + int x_weight_frac = x_weight & 0xF; + int y_weight_frac = y_weight & 0xF; + int z_weight_frac = z_weight & 0xF; + int x_weight_int = x_weight >> 4; + int y_weight_int = y_weight >> 4; + int z_weight_int = z_weight >> 4; + int qweight[4]; + int weight[4]; + qweight[0] = (z_weight_int * y_weights + y_weight_int) * x_weights + x_weight_int; + qweight[3] = ((z_weight_int + 1) * y_weights + (y_weight_int + 1)) * x_weights + (x_weight_int + 1); + + // simplex interpolation + int fs = x_weight_frac; + int ft = y_weight_frac; + int fp = z_weight_frac; + + int cas = ((fs > ft) << 2) + ((ft > fp) << 1) + ((fs > fp)); + int N = x_weights; + int NM = x_weights * y_weights; + + int s1, s2, w0, w1, w2, w3; + switch (cas) + { + case 7: + s1 = 1; + s2 = N; + w0 = 16 - fs; + w1 = fs - ft; + w2 = ft - fp; + w3 = fp; + break; + case 3: + s1 = N; + s2 = 1; + w0 = 16 - ft; + w1 = ft - fs; + w2 = fs - fp; + w3 = fp; + break; + case 5: + s1 = 1; + s2 = NM; + w0 = 16 - fs; + w1 = fs - fp; + w2 = fp - ft; + w3 = ft; + break; + case 4: + s1 = NM; + s2 = 1; + w0 = 16 - fp; + w1 = fp - fs; + w2 = fs - ft; + w3 = ft; + break; + case 2: + s1 = N; + s2 = NM; + w0 = 16 - ft; + w1 = ft - fp; + w2 = fp - fs; + w3 = fs; + break; + case 0: + s1 = NM; + s2 = N; + w0 = 16 - fp; + w1 = fp - ft; + w2 = ft - fs; + w3 = fs; + break; + default: + s1 = NM; + s2 = N; + w0 = 16 - fp; + w1 = fp - ft; + w2 = ft - fs; + w3 = fs; + break; + } + + qweight[1] = qweight[0] + s1; + qweight[2] = qweight[1] + s2; + weight[0] = w0; + weight[1] = w1; + weight[2] = w2; + weight[3] = w3; + + for (unsigned int i = 0; i < 4; i++) + { + if (weight[i] != 0) + { + wb.grid_weights_of_texel[texel][wb.weight_count_of_texel[texel]] = static_cast(qweight[i]); + wb.weights_of_texel[texel][wb.weight_count_of_texel[texel]] = static_cast(weight[i]); + wb.weight_count_of_texel[texel]++; + wb.texels_of_weight[qweight[i]][wb.texel_count_of_weight[qweight[i]]] = static_cast(texel); + wb.texel_weights_of_weight[qweight[i]][wb.texel_count_of_weight[qweight[i]]] = static_cast(weight[i]); + wb.texel_count_of_weight[qweight[i]]++; + max_texel_count_of_weight = astc::max(max_texel_count_of_weight, wb.texel_count_of_weight[qweight[i]]); + } + } + } + } + } + + uint8_t max_texel_weight_count = 0; + for (unsigned int i = 0; i < texels_per_block; i++) + { + di.texel_weight_count[i] = wb.weight_count_of_texel[i]; + max_texel_weight_count = astc::max(max_texel_weight_count, di.texel_weight_count[i]); + + // Init all 4 entries so we can rely on zeros for vectorization + for (unsigned int j = 0; j < 4; j++) + { + di.texel_weight_contribs_int_tr[j][i] = 0; + di.texel_weight_contribs_float_tr[j][i] = 0.0f; + di.texel_weights_tr[j][i] = 0; + } + + for (unsigned int j = 0; j < wb.weight_count_of_texel[i]; j++) + { + di.texel_weight_contribs_int_tr[j][i] = wb.weights_of_texel[i][j]; + di.texel_weight_contribs_float_tr[j][i] = static_cast(wb.weights_of_texel[i][j]) * (1.0f / WEIGHTS_TEXEL_SUM); + di.texel_weights_tr[j][i] = wb.grid_weights_of_texel[i][j]; + } + } + + di.max_texel_weight_count = max_texel_weight_count; + + for (unsigned int i = 0; i < weights_per_block; i++) + { + unsigned int texel_count_wt = wb.texel_count_of_weight[i]; + di.weight_texel_count[i] = static_cast(texel_count_wt); + + for (unsigned int j = 0; j < texel_count_wt; j++) + { + unsigned int texel = wb.texels_of_weight[i][j]; + + // Create transposed versions of these for better vectorization + di.weight_texels_tr[j][i] = static_cast(texel); + di.weights_texel_contribs_tr[j][i] = static_cast(wb.texel_weights_of_weight[i][j]); + + // Store the per-texel contribution of this weight for each texel it contributes to + di.texel_contrib_for_weight[j][i] = 0.0f; + for (unsigned int k = 0; k < 4; k++) + { + uint8_t dttw = di.texel_weights_tr[k][texel]; + float dttwf = di.texel_weight_contribs_float_tr[k][texel]; + if (dttw == i && dttwf != 0.0f) + { + di.texel_contrib_for_weight[j][i] = di.texel_weight_contribs_float_tr[k][texel]; + break; + } + } + } + + // Initialize array tail so we can over-fetch with SIMD later to avoid loop tails + // Match last texel in active lane in SIMD group, for better gathers + uint8_t last_texel = di.weight_texels_tr[texel_count_wt - 1][i]; + for (unsigned int j = texel_count_wt; j < max_texel_count_of_weight; j++) + { + di.weight_texels_tr[j][i] = last_texel; + di.weights_texel_contribs_tr[j][i] = 0.0f; + } + } + + // Initialize array tail so we can over-fetch with SIMD later to avoid loop tails + size_t texels_per_block_simd = round_up_to_simd_multiple_vla(texels_per_block); + for (size_t i = texels_per_block; i < texels_per_block_simd; i++) + { + di.texel_weight_count[i] = 0; + + for (size_t j = 0; j < 4; j++) + { + di.texel_weight_contribs_float_tr[j][i] = 0; + di.texel_weights_tr[j][i] = 0; + di.texel_weight_contribs_int_tr[j][i] = 0; + } + } + + // Initialize array tail so we can over-fetch with SIMD later to avoid loop tails + // Match last texel in active lane in SIMD group, for better gathers + int last_texel_count_wt = wb.texel_count_of_weight[weights_per_block - 1]; + uint8_t last_texel = di.weight_texels_tr[last_texel_count_wt - 1][weights_per_block - 1]; + + size_t weights_per_block_simd = round_up_to_simd_multiple_vla(weights_per_block); + for (size_t i = weights_per_block; i < weights_per_block_simd; i++) + { + di.weight_texel_count[i] = 0; + + for (size_t j = 0; j < max_texel_count_of_weight; j++) + { + di.weight_texels_tr[j][i] = last_texel; + di.weights_texel_contribs_tr[j][i] = 0.0f; + } + } + + di.texel_count = static_cast(texels_per_block); + di.weight_count = static_cast(weights_per_block); + di.weight_x = static_cast(x_weights); + di.weight_y = static_cast(y_weights); + di.weight_z = static_cast(z_weights); +} + +/** + * @brief Assign the texels to use for kmeans clustering. + * + * The max limit is @c BLOCK_MAX_KMEANS_TEXELS; above this a random selection is used. + * The @c bsd.texel_count is an input and must be populated beforehand. + * + * @param[in,out] bsd The block size descriptor to populate. + */ +static void assign_kmeans_texels( + block_size_descriptor& bsd +) { + // Use all texels for kmeans on a small block + if (bsd.texel_count <= BLOCK_MAX_KMEANS_TEXELS) + { + for (uint8_t i = 0; i < bsd.texel_count; i++) + { + bsd.kmeans_texels[i] = i; + } + + return; + } + + // Select a random subset of BLOCK_MAX_KMEANS_TEXELS for kmeans on a large block + uint64_t rng_state[2]; + astc::rand_init(rng_state); + + // Initialize array used for tracking used indices + bool seen[BLOCK_MAX_TEXELS]; + for (uint8_t i = 0; i < bsd.texel_count; i++) + { + seen[i] = false; + } + + // Assign 64 random indices, retrying if we see repeats + unsigned int arr_elements_set = 0; + while (arr_elements_set < BLOCK_MAX_KMEANS_TEXELS) + { + uint8_t texel = static_cast(astc::rand(rng_state)); + texel = texel % bsd.texel_count; + if (!seen[texel]) + { + bsd.kmeans_texels[arr_elements_set++] = texel; + seen[texel] = true; + } + } +} + +/** + * @brief Allocate a single 2D decimation table entry. + * + * @param x_texels The number of texels in the X dimension. + * @param y_texels The number of texels in the Y dimension. + * @param x_weights The number of weights in the X dimension. + * @param y_weights The number of weights in the Y dimension. + * @param bsd The block size descriptor we are populating. + * @param wb The decimation table init scratch working buffers. + * @param index The packed array index to populate. + */ +static void construct_dt_entry_2d( + unsigned int x_texels, + unsigned int y_texels, + unsigned int x_weights, + unsigned int y_weights, + block_size_descriptor& bsd, + dt_init_working_buffers& wb, + unsigned int index +) { + unsigned int weight_count = x_weights * y_weights; + assert(weight_count <= BLOCK_MAX_WEIGHTS); + + bool try_2planes = (2 * weight_count) <= BLOCK_MAX_WEIGHTS; + + decimation_info& di = bsd.decimation_tables[index]; + init_decimation_info_2d(x_texels, y_texels, x_weights, y_weights, di, wb); + + int maxprec_1plane = -1; + int maxprec_2planes = -1; + for (int i = 0; i < 12; i++) + { + unsigned int bits_1plane = get_ise_sequence_bitcount(weight_count, static_cast(i)); + if (bits_1plane >= BLOCK_MIN_WEIGHT_BITS && bits_1plane <= BLOCK_MAX_WEIGHT_BITS) + { + maxprec_1plane = i; + } + + if (try_2planes) + { + unsigned int bits_2planes = get_ise_sequence_bitcount(2 * weight_count, static_cast(i)); + if (bits_2planes >= BLOCK_MIN_WEIGHT_BITS && bits_2planes <= BLOCK_MAX_WEIGHT_BITS) + { + maxprec_2planes = i; + } + } + } + + // At least one of the two should be valid ... + assert(maxprec_1plane >= 0 || maxprec_2planes >= 0); + bsd.decimation_modes[index].maxprec_1plane = static_cast(maxprec_1plane); + bsd.decimation_modes[index].maxprec_2planes = static_cast(maxprec_2planes); + bsd.decimation_modes[index].refprec_1plane = 0; + bsd.decimation_modes[index].refprec_2planes = 0; +} + +/** + * @brief Allocate block modes and decimation tables for a single 2D block size. + * + * @param x_texels The number of texels in the X dimension. + * @param y_texels The number of texels in the Y dimension. + * @param can_omit_modes Can we discard modes that astcenc won't use, even if legal? + * @param mode_cutoff Percentile cutoff in range [0,1]. Low values more likely to be used. + * @param[out] bsd The block size descriptor to populate. + */ +static void construct_block_size_descriptor_2d( + unsigned int x_texels, + unsigned int y_texels, + bool can_omit_modes, + float mode_cutoff, + block_size_descriptor& bsd +) { + // Store a remap table for storing packed decimation modes. + // Indexing uses [Y * 16 + X] and max size for each axis is 12. + static const unsigned int MAX_DMI = 12 * 16 + 12; + int decimation_mode_index[MAX_DMI]; + + dt_init_working_buffers* wb = new dt_init_working_buffers; + + bsd.xdim = static_cast(x_texels); + bsd.ydim = static_cast(y_texels); + bsd.zdim = 1; + bsd.texel_count = static_cast(x_texels * y_texels); + + for (unsigned int i = 0; i < MAX_DMI; i++) + { + decimation_mode_index[i] = -1; + } + + // Gather all the decimation grids that can be used with the current block +#if !defined(ASTCENC_DECOMPRESS_ONLY) + const float *percentiles = get_2d_percentile_table(x_texels, y_texels); + float always_cutoff = 0.0f; +#else + // Unused in decompress-only builds + (void)can_omit_modes; + (void)mode_cutoff; +#endif + + // Construct the list of block formats referencing the decimation tables + unsigned int packed_bm_idx = 0; + unsigned int packed_dm_idx = 0; + + // Trackers + unsigned int bm_counts[4] { 0 }; + unsigned int dm_counts[4] { 0 }; + + // Clear the list to a known-bad value + for (unsigned int i = 0; i < WEIGHTS_MAX_BLOCK_MODES; i++) + { + bsd.block_mode_packed_index[i] = BLOCK_BAD_BLOCK_MODE; + } + + // Iterate four times to build a usefully ordered list: + // - Pass 0 - keep selected single plane "always" block modes + // - Pass 1 - keep selected single plane "non-always" block modes + // - Pass 2 - keep select dual plane block modes + // - Pass 3 - keep everything else that's legal + unsigned int limit = can_omit_modes ? 3 : 4; + for (unsigned int j = 0; j < limit; j ++) + { + for (unsigned int i = 0; i < WEIGHTS_MAX_BLOCK_MODES; i++) + { + // Skip modes we've already included in a previous pass + if (bsd.block_mode_packed_index[i] != BLOCK_BAD_BLOCK_MODE) + { + continue; + } + + // Decode parameters + unsigned int x_weights; + unsigned int y_weights; + bool is_dual_plane; + unsigned int quant_mode; + unsigned int weight_bits; + bool valid = decode_block_mode_2d(i, x_weights, y_weights, is_dual_plane, quant_mode, weight_bits); + + // Always skip invalid encodings for the current block size + if (!valid || (x_weights > x_texels) || (y_weights > y_texels)) + { + continue; + } + + // Selectively skip dual plane encodings + if (((j <= 1) && is_dual_plane) || (j == 2 && !is_dual_plane)) + { + continue; + } + + // Always skip encodings we can't physically encode based on + // generic encoding bit availability + if (is_dual_plane) + { + // This is the only check we need as only support 1 partition + if ((109 - weight_bits) <= 0) + { + continue; + } + } + else + { + // This is conservative - fewer bits may be available for > 1 partition + if ((111 - weight_bits) <= 0) + { + continue; + } + } + + // Selectively skip encodings based on percentile + bool percentile_hit = false; + #if !defined(ASTCENC_DECOMPRESS_ONLY) + if (j == 0) + { + percentile_hit = percentiles[i] <= always_cutoff; + } + else + { + percentile_hit = percentiles[i] <= mode_cutoff; + } + #endif + + if (j != 3 && !percentile_hit) + { + continue; + } + + // Allocate and initialize the decimation table entry if we've not used it yet + int decimation_mode = decimation_mode_index[y_weights * 16 + x_weights]; + if (decimation_mode < 0) + { + construct_dt_entry_2d(x_texels, y_texels, x_weights, y_weights, bsd, *wb, packed_dm_idx); + decimation_mode_index[y_weights * 16 + x_weights] = packed_dm_idx; + decimation_mode = packed_dm_idx; + + dm_counts[j]++; + packed_dm_idx++; + } + + auto& bm = bsd.block_modes[packed_bm_idx]; + + bm.decimation_mode = static_cast(decimation_mode); + bm.quant_mode = static_cast(quant_mode); + bm.is_dual_plane = static_cast(is_dual_plane); + bm.weight_bits = static_cast(weight_bits); + bm.mode_index = static_cast(i); + + auto& dm = bsd.decimation_modes[decimation_mode]; + + if (is_dual_plane) + { + dm.set_ref_2plane(bm.get_weight_quant_mode()); + } + else + { + dm.set_ref_1plane(bm.get_weight_quant_mode()); + } + + bsd.block_mode_packed_index[i] = static_cast(packed_bm_idx); + + packed_bm_idx++; + bm_counts[j]++; + } + } + + bsd.block_mode_count_1plane_always = bm_counts[0]; + bsd.block_mode_count_1plane_selected = bm_counts[0] + bm_counts[1]; + bsd.block_mode_count_1plane_2plane_selected = bm_counts[0] + bm_counts[1] + bm_counts[2]; + bsd.block_mode_count_all = bm_counts[0] + bm_counts[1] + bm_counts[2] + bm_counts[3]; + + bsd.decimation_mode_count_always = dm_counts[0]; + bsd.decimation_mode_count_selected = dm_counts[0] + dm_counts[1] + dm_counts[2]; + bsd.decimation_mode_count_all = dm_counts[0] + dm_counts[1] + dm_counts[2] + dm_counts[3]; + +#if !defined(ASTCENC_DECOMPRESS_ONLY) + assert(bsd.block_mode_count_1plane_always > 0); + assert(bsd.decimation_mode_count_always > 0); + + delete[] percentiles; +#endif + + // Ensure the end of the array contains valid data (should never get read) + for (unsigned int i = bsd.decimation_mode_count_all; i < WEIGHTS_MAX_DECIMATION_MODES; i++) + { + bsd.decimation_modes[i].maxprec_1plane = -1; + bsd.decimation_modes[i].maxprec_2planes = -1; + bsd.decimation_modes[i].refprec_1plane = 0; + bsd.decimation_modes[i].refprec_2planes = 0; + } + + // Determine the texels to use for kmeans clustering. + assign_kmeans_texels(bsd); + + delete wb; +} + +/** + * @brief Allocate block modes and decimation tables for a single 3D block size. + * + * TODO: This function doesn't include all of the heuristics that we use for 2D block sizes such as + * the percentile mode cutoffs. If 3D becomes more widely used we should look at this. + * + * @param x_texels The number of texels in the X dimension. + * @param y_texels The number of texels in the Y dimension. + * @param z_texels The number of texels in the Z dimension. + * @param[out] bsd The block size descriptor to populate. + */ +static void construct_block_size_descriptor_3d( + unsigned int x_texels, + unsigned int y_texels, + unsigned int z_texels, + block_size_descriptor& bsd +) { + // Store a remap table for storing packed decimation modes. + // Indexing uses [Z * 64 + Y * 8 + X] and max size for each axis is 6. + static constexpr unsigned int MAX_DMI = 6 * 64 + 6 * 8 + 6; + int decimation_mode_index[MAX_DMI]; + unsigned int decimation_mode_count = 0; + + dt_init_working_buffers* wb = new dt_init_working_buffers; + + bsd.xdim = static_cast(x_texels); + bsd.ydim = static_cast(y_texels); + bsd.zdim = static_cast(z_texels); + bsd.texel_count = static_cast(x_texels * y_texels * z_texels); + + for (unsigned int i = 0; i < MAX_DMI; i++) + { + decimation_mode_index[i] = -1; + } + + // gather all the infill-modes that can be used with the current block size + for (unsigned int x_weights = 2; x_weights <= x_texels; x_weights++) + { + for (unsigned int y_weights = 2; y_weights <= y_texels; y_weights++) + { + for (unsigned int z_weights = 2; z_weights <= z_texels; z_weights++) + { + unsigned int weight_count = x_weights * y_weights * z_weights; + if (weight_count > BLOCK_MAX_WEIGHTS) + { + continue; + } + + decimation_info& di = bsd.decimation_tables[decimation_mode_count]; + decimation_mode_index[z_weights * 64 + y_weights * 8 + x_weights] = decimation_mode_count; + init_decimation_info_3d(x_texels, y_texels, z_texels, x_weights, y_weights, z_weights, di, *wb); + + int maxprec_1plane = -1; + int maxprec_2planes = -1; + for (unsigned int i = 0; i < 12; i++) + { + unsigned int bits_1plane = get_ise_sequence_bitcount(weight_count, static_cast(i)); + if (bits_1plane >= BLOCK_MIN_WEIGHT_BITS && bits_1plane <= BLOCK_MAX_WEIGHT_BITS) + { + maxprec_1plane = i; + } + + unsigned int bits_2planes = get_ise_sequence_bitcount(2 * weight_count, static_cast(i)); + if (bits_2planes >= BLOCK_MIN_WEIGHT_BITS && bits_2planes <= BLOCK_MAX_WEIGHT_BITS) + { + maxprec_2planes = i; + } + } + + if ((2 * weight_count) > BLOCK_MAX_WEIGHTS) + { + maxprec_2planes = -1; + } + + bsd.decimation_modes[decimation_mode_count].maxprec_1plane = static_cast(maxprec_1plane); + bsd.decimation_modes[decimation_mode_count].maxprec_2planes = static_cast(maxprec_2planes); + bsd.decimation_modes[decimation_mode_count].refprec_1plane = maxprec_1plane == -1 ? 0 : 0xFFFF; + bsd.decimation_modes[decimation_mode_count].refprec_2planes = maxprec_2planes == -1 ? 0 : 0xFFFF; + decimation_mode_count++; + } + } + } + + // Ensure the end of the array contains valid data (should never get read) + for (unsigned int i = decimation_mode_count; i < WEIGHTS_MAX_DECIMATION_MODES; i++) + { + bsd.decimation_modes[i].maxprec_1plane = -1; + bsd.decimation_modes[i].maxprec_2planes = -1; + bsd.decimation_modes[i].refprec_1plane = 0; + bsd.decimation_modes[i].refprec_2planes = 0; + } + + bsd.decimation_mode_count_always = 0; // Skipped for 3D modes + bsd.decimation_mode_count_selected = decimation_mode_count; + bsd.decimation_mode_count_all = decimation_mode_count; + + // Construct the list of block formats referencing the decimation tables + + // Clear the list to a known-bad value + for (unsigned int i = 0; i < WEIGHTS_MAX_BLOCK_MODES; i++) + { + bsd.block_mode_packed_index[i] = BLOCK_BAD_BLOCK_MODE; + } + + unsigned int packed_idx = 0; + unsigned int bm_counts[2] { 0 }; + + // Iterate two times to build a usefully ordered list: + // - Pass 0 - keep valid single plane block modes + // - Pass 1 - keep valid dual plane block modes + for (unsigned int j = 0; j < 2; j++) + { + for (unsigned int i = 0; i < WEIGHTS_MAX_BLOCK_MODES; i++) + { + // Skip modes we've already included in a previous pass + if (bsd.block_mode_packed_index[i] != BLOCK_BAD_BLOCK_MODE) + { + continue; + } + + unsigned int x_weights; + unsigned int y_weights; + unsigned int z_weights; + bool is_dual_plane; + unsigned int quant_mode; + unsigned int weight_bits; + + bool valid = decode_block_mode_3d(i, x_weights, y_weights, z_weights, is_dual_plane, quant_mode, weight_bits); + // Skip invalid encodings + if (!valid || x_weights > x_texels || y_weights > y_texels || z_weights > z_texels) + { + continue; + } + + // Skip encodings in the wrong iteration + if ((j == 0 && is_dual_plane) || (j == 1 && !is_dual_plane)) + { + continue; + } + + // Always skip encodings we can't physically encode based on bit availability + if (is_dual_plane) + { + // This is the only check we need as only support 1 partition + if ((109 - weight_bits) <= 0) + { + continue; + } + } + else + { + // This is conservative - fewer bits may be available for > 1 partition + if ((111 - weight_bits) <= 0) + { + continue; + } + } + + int decimation_mode = decimation_mode_index[z_weights * 64 + y_weights * 8 + x_weights]; + bsd.block_modes[packed_idx].decimation_mode = static_cast(decimation_mode); + bsd.block_modes[packed_idx].quant_mode = static_cast(quant_mode); + bsd.block_modes[packed_idx].weight_bits = static_cast(weight_bits); + bsd.block_modes[packed_idx].is_dual_plane = static_cast(is_dual_plane); + bsd.block_modes[packed_idx].mode_index = static_cast(i); + + bsd.block_mode_packed_index[i] = static_cast(packed_idx); + bm_counts[j]++; + packed_idx++; + } + } + + bsd.block_mode_count_1plane_always = 0; // Skipped for 3D modes + bsd.block_mode_count_1plane_selected = bm_counts[0]; + bsd.block_mode_count_1plane_2plane_selected = bm_counts[0] + bm_counts[1]; + bsd.block_mode_count_all = bm_counts[0] + bm_counts[1]; + + // Determine the texels to use for kmeans clustering. + assign_kmeans_texels(bsd); + + delete wb; +} + +/* See header for documentation. */ +void init_block_size_descriptor( + unsigned int x_texels, + unsigned int y_texels, + unsigned int z_texels, + bool can_omit_modes, + unsigned int partition_count_cutoff, + float mode_cutoff, + block_size_descriptor& bsd +) { + if (z_texels > 1) + { + construct_block_size_descriptor_3d(x_texels, y_texels, z_texels, bsd); + } + else + { + construct_block_size_descriptor_2d(x_texels, y_texels, can_omit_modes, mode_cutoff, bsd); + } + + init_partition_tables(bsd, can_omit_modes, partition_count_cutoff); +} diff --git a/ktx/external/astc-encoder/Source/astcenc_color_quantize.cpp b/ktx/external/astc-encoder/Source/astcenc_color_quantize.cpp new file mode 100644 index 0000000..df17cac --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_color_quantize.cpp @@ -0,0 +1,2149 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2023 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 for color quantization. + * + * The design of the color quantization functionality requires the caller to use higher level error + * analysis to determine the base encoding that should be used. This earlier analysis will select + * the basic type of the endpoint that should be used: + * + * * Mode: LDR or HDR + * * Quantization level + * * Channel count: L, LA, RGB, or RGBA + * * Endpoint 2 type: Direct color endcode, or scaled from endpoint 1. + * + * However, this leaves a number of decisions about exactly how to pack the endpoints open. In + * particular we need to determine if blue contraction can be used, or/and if delta encoding can be + * used. If they can be applied these will allow us to maintain higher precision in the endpoints + * without needing additional storage. + */ + +#include +#include + +#include "astcenc_internal.h" + +/** + * @brief Compute the error of an LDR RGB or RGBA encoding. + * + * @param uquant0 The original endpoint 0 color. + * @param uquant1 The original endpoint 1 color. + * @param quant0 The unpacked quantized endpoint 0 color. + * @param quant1 The unpacked quantized endpoint 1 color. + * + * @return The MSE of the encoding. + */ +static float get_rgba_encoding_error( + vfloat4 uquant0, + vfloat4 uquant1, + vint4 quant0, + vint4 quant1 +) { + vfloat4 error0 = uquant0 - int_to_float(quant0); + vfloat4 error1 = uquant1 - int_to_float(quant1); + return hadd_s(error0 * error0 + error1 * error1); +} + +/** + * @brief Determine the quantized value given a quantization level. + * + * @param quant_level The quantization level to use. + * @param value The value to convert. This must be in the 0-255 range. + * + * @return The unpacked quantized value, returned in 0-255 range. + */ +static inline uint8_t quant_color( + quant_method quant_level, + int value +) { + int index = value * 2 + 1; + return color_unquant_to_uquant_tables[quant_level - QUANT_6][index]; +} + +/** + * @brief Determine the quantized value given a quantization level. + * + * @param quant_level The quantization level to use. + * @param value The value to convert. This must be in the 0-255 range. + * + * @return The unpacked quantized value, returned in 0-255 range. + */ +static inline vint4 quant_color3( + quant_method quant_level, + vint4 value +) { + vint4 index = value * 2 + 1; + return vint4( + color_unquant_to_uquant_tables[quant_level - QUANT_6][index.lane<0>()], + color_unquant_to_uquant_tables[quant_level - QUANT_6][index.lane<1>()], + color_unquant_to_uquant_tables[quant_level - QUANT_6][index.lane<2>()], + 0); +} + +/** + * @brief Determine the quantized value given a quantization level and residual. + * + * @param quant_level The quantization level to use. + * @param value The value to convert. This must be in the 0-255 range. + * @param valuef The original value before rounding, used to compute a residual. + * + * @return The unpacked quantized value, returned in 0-255 range. + */ +static inline uint8_t quant_color( + quant_method quant_level, + int value, + float valuef +) { + int index = value * 2; + + // Compute the residual to determine if we should round down or up ties. + // Test should be residual >= 0, but empirical testing shows small bias helps. + float residual = valuef - static_cast(value); + if (residual >= -0.1f) + { + index++; + } + + return color_unquant_to_uquant_tables[quant_level - QUANT_6][index]; +} + +/** + * @brief Determine the quantized value given a quantization level and residual. + * + * @param quant_level The quantization level to use. + * @param value The value to convert. This must be in the 0-255 range. + * @param valuef The original value before rounding, used to compute a residual. + * + * @return The unpacked quantized value, returned in 0-255 range. + */ +static inline vint4 quant_color3( + quant_method quant_level, + vint4 value, + vfloat4 valuef +) { + vint4 index = value * 2; + + // Compute the residual to determine if we should round down or up ties. + // Test should be residual >= 0, but empirical testing shows small bias helps. + vfloat4 residual = valuef - int_to_float(value); + vmask4 mask = residual >= vfloat4(-0.1f); + index = select(index, index + 1, mask); + + return vint4( + color_unquant_to_uquant_tables[quant_level - QUANT_6][index.lane<0>()], + color_unquant_to_uquant_tables[quant_level - QUANT_6][index.lane<1>()], + color_unquant_to_uquant_tables[quant_level - QUANT_6][index.lane<2>()], + 0); +} + +/** + * @brief Quantize an LDR RGB color. + * + * Since this is a fall-back encoding, we cannot actually fail but must produce a sensible result. + * For this encoding @c color0 cannot be larger than @c color1. If @c color0 is actually larger + * than @c color1, @c color0 is reduced and @c color1 is increased until the constraint is met. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] color0_out The output quantized color0 endpoint. + * @param[out] color1_out The output quantized color1 endpoint. + * @param quant_level The quantization level to use. + */ +static void quantize_rgb( + vfloat4 color0, + vfloat4 color1, + vint4& color0_out, + vint4& color1_out, + quant_method quant_level +) { + vint4 color0i, color1i; + vfloat4 nudge(0.2f); + + do + { + vint4 color0q = max(float_to_int_rtn(color0), vint4(0)); + color0i = quant_color3(quant_level, color0q, color0); + color0 = color0 - nudge; + + vint4 color1q = min(float_to_int_rtn(color1), vint4(255)); + color1i = quant_color3(quant_level, color1q, color1); + color1 = color1 + nudge; + } while (hadd_rgb_s(color0i) > hadd_rgb_s(color1i)); + + color0_out = color0i; + color1_out = color1i; +} + +/** + * @brief Quantize an LDR RGBA color. + * + * Since this is a fall-back encoding, we cannot actually fail but must produce a sensible result. + * For this encoding @c color0.rgb cannot be larger than @c color1.rgb (this indicates blue + * contraction). If @c color0.rgb is actually larger than @c color1.rgb, @c color0.rgb is reduced + * and @c color1.rgb is increased until the constraint is met. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] color0_out The output quantized color0 endpoint. + * @param[out] color1_out The output quantized color1 endpoint. + * @param quant_level The quantization level to use. + */ +static void quantize_rgba( + vfloat4 color0, + vfloat4 color1, + vint4& color0_out, + vint4& color1_out, + quant_method quant_level +) { + quantize_rgb(color0, color1, color0_out, color1_out, quant_level); + + float a0 = color0.lane<3>(); + float a1 = color1.lane<3>(); + + color0_out.set_lane<3>(quant_color(quant_level, astc::flt2int_rtn(a0), a0)); + color1_out.set_lane<3>(quant_color(quant_level, astc::flt2int_rtn(a1), a1)); +} + +/** + * @brief Try to quantize an LDR RGB color using blue-contraction. + * + * Blue-contraction is only usable if encoded color 1 is larger than color 0. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] color0_out The output quantized color0 endpoint. + * @param[out] color1_out The output quantized color1 endpoint. + * @param quant_level The quantization level to use. + * + * @return Returns @c false on failure, @c true on success. + */ +static bool try_quantize_rgb_blue_contract( + vfloat4 color0, + vfloat4 color1, + vint4& color0_out, + vint4& color1_out, + quant_method quant_level +) { + // Apply inverse blue-contraction + color0 += color0 - color0.swz<2, 2, 2, 3>(); + color1 += color1 - color1.swz<2, 2, 2, 3>(); + + // If anything overflows BC cannot be used + vmask4 color0_error = (color0 < vfloat4(0.0f)) | (color0 > vfloat4(255.0f)); + vmask4 color1_error = (color1 < vfloat4(0.0f)) | (color1 > vfloat4(255.0f)); + if (any(color0_error | color1_error)) + { + return false; + } + + // Quantize the inverse blue-contracted color + vint4 color0i = quant_color3(quant_level, float_to_int_rtn(color0), color0); + vint4 color1i = quant_color3(quant_level, float_to_int_rtn(color1), color1); + + // If color #1 is not larger than color #0 then blue-contraction cannot be used + // We must test afterwards because quantization can change the order + if (hadd_rgb_s(color1i) <= hadd_rgb_s(color0i)) + { + return false; + } + + color0_out = color1i; + color1_out = color0i; + return true; +} + +/** + * @brief Try to quantize an LDR RGBA color using blue-contraction. + * + * Blue-contraction is only usable if encoded color 1 RGB is larger than color 0 RGB. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] color0_out The output quantized color0 endpoint. + * @param[out] color1_out The output quantized color1 endpoint. + * @param quant_level The quantization level to use. + * + * @return Returns @c false on failure, @c true on success. + */ +static bool try_quantize_rgba_blue_contract( + vfloat4 color0, + vfloat4 color1, + vint4& color0_out, + vint4& color1_out, + quant_method quant_level +) { + if (try_quantize_rgb_blue_contract(color0, color1, color0_out, color1_out, quant_level)) + { + float a0 = color0.lane<3>(); + float a1 = color1.lane<3>(); + + color0_out.set_lane<3>(quant_color(quant_level, astc::flt2int_rtn(a1), a1)); + color1_out.set_lane<3>(quant_color(quant_level, astc::flt2int_rtn(a0), a0)); + + return true; + } + + return false; +} + +/** + * @brief Try to quantize an LDR RGB color using delta encoding. + * + * At decode time we move one bit from the offset to the base and seize another bit as a sign bit; + * we then unquantize both values as if they contain one extra bit. If the sum of the offsets is + * non-negative, then we encode a regular delta. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] color0_out The output quantized color0 endpoint. + * @param[out] color1_out The output quantized color1 endpoint. + * @param quant_level The quantization level to use. + * + * @return Returns @c false on failure, @c true on success. + */ +static bool try_quantize_rgb_delta( + vfloat4 color0, + vfloat4 color1, + vint4& color0_out, + vint4& color1_out, + quant_method quant_level +) { + // Transform color0 to unorm9 + vint4 color0a = float_to_int_rtn(color0); + color0.set_lane<3>(0.0f); + color0a = lsl<1>(color0a); + + // Mask off the top bit + vint4 color0b = color0a & 0xFF; + + // Quantize then unquantize in order to get a value that we take differences against + vint4 color0be = quant_color3(quant_level, color0b); + color0b = color0be | (color0a & 0x100); + + // Get hold of the second value + vint4 color1d = float_to_int_rtn(color1); + color1d = lsl<1>(color1d); + + // ... and take differences + color1d = color1d - color0b; + color1d.set_lane<3>(0); + + // Check if the difference is too large to be encodable + if (any((color1d > vint4(63)) | (color1d < vint4(-64)))) + { + return false; + } + + // Insert top bit of the base into the offset + color1d = color1d & 0x7F; + color1d = color1d | lsr<1>(color0b & 0x100); + + // Then quantize and unquantize; if this causes either top two bits to flip, then encoding fails + // since we have then corrupted either the top bit of the base or the sign bit of the offset + vint4 color1de = quant_color3(quant_level, color1d); + + vint4 color_flips = (color1d ^ color1de) & 0xC0; + color_flips.set_lane<3>(0); + if (any(color_flips != vint4::zero())) + { + return false; + } + + // If the sum of offsets triggers blue-contraction then encoding fails + vint4 ep0 = color0be; + vint4 ep1 = color1de; + bit_transfer_signed(ep1, ep0); + if (hadd_rgb_s(ep1) < 0) + { + return false; + } + + // Check that the offsets produce legitimate sums as well + ep0 = ep0 + ep1; + if (any((ep0 < vint4(0)) | (ep0 > vint4(0xFF)))) + { + return false; + } + + color0_out = color0be; + color1_out = color1de; + return true; +} + +/** + * @brief Try to quantize an LDR RGB color using delta encoding and blue-contraction. + * + * Blue-contraction is only usable if encoded color 1 RGB is larger than color 0 RGB. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] color0_out The output quantized color0 endpoint. + * @param[out] color1_out The output quantized color1 endpoint. + * @param quant_level The quantization level to use. + * + * @return Returns @c false on failure, @c true on success. + */ +static bool try_quantize_rgb_delta_blue_contract( + vfloat4 color0, + vfloat4 color1, + vint4& color0_out, + vint4& color1_out, + quant_method quant_level +) { + // Note: Switch around endpoint colors already at start + std::swap(color0, color1); + + // Apply inverse blue-contraction + color0 += color0 - color0.swz<2, 2, 2, 3>(); + color1 += color1 - color1.swz<2, 2, 2, 3>(); + + // If anything overflows BC cannot be used + vmask4 color0_error = (color0 < vfloat4(0.0f)) | (color0 > vfloat4(255.0f)); + vmask4 color1_error = (color1 < vfloat4(0.0f)) | (color1 > vfloat4(255.0f)); + if (any(color0_error | color1_error)) + { + return false; + } + + // Transform color0 to unorm9 + vint4 color0a = float_to_int_rtn(color0); + color0.set_lane<3>(0.0f); + color0a = lsl<1>(color0a); + + // Mask off the top bit + vint4 color0b = color0a & 0xFF; + + // Quantize then unquantize in order to get a value that we take differences against + vint4 color0be = quant_color3(quant_level, color0b); + color0b = color0be | (color0a & 0x100); + + // Get hold of the second value + vint4 color1d = float_to_int_rtn(color1); + color1d = lsl<1>(color1d); + + // ... and take differences + color1d = color1d - color0b; + color1d.set_lane<3>(0); + + // Check if the difference is too large to be encodable + if (any((color1d > vint4(63)) | (color1d < vint4(-64)))) + { + return false; + } + + // Insert top bit of the base into the offset + color1d = color1d & 0x7F; + color1d = color1d | lsr<1>(color0b & 0x100); + + // Then quantize and unquantize; if this causes either top two bits to flip, then encoding fails + // since we have then corrupted either the top bit of the base or the sign bit of the offset + vint4 color1de = quant_color3(quant_level, color1d); + + vint4 color_flips = (color1d ^ color1de) & 0xC0; + color_flips.set_lane<3>(0); + if (any(color_flips != vint4::zero())) + { + return false; + } + + // If the sum of offsets does not trigger blue-contraction then encoding fails + vint4 ep0 = color0be; + vint4 ep1 = color1de; + bit_transfer_signed(ep1, ep0); + if (hadd_rgb_s(ep1) >= 0) + { + return false; + } + + // Check that the offsets produce legitimate sums as well + ep0 = ep0 + ep1; + if (any((ep0 < vint4(0)) | (ep0 > vint4(0xFF)))) + { + return false; + } + + color0_out = color0be; + color1_out = color1de; + return true; +} + +/** + * @brief Try to quantize an LDR A color using delta encoding. + * + * At decode time we move one bit from the offset to the base and seize another bit as a sign bit; + * we then unquantize both values as if they contain one extra bit. If the sum of the offsets is + * non-negative, then we encode a regular delta. + * + * This function only compressed the alpha - the other elements in the output array are not touched. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] color0_out The output quantized color0 endpoint; must preserve lane 0/1/2. + * @param[out] color1_out The output quantized color1 endpoint; must preserve lane 0/1/2. + * @param quant_level The quantization level to use. + * + * @return Returns @c false on failure, @c true on success. + */ +static bool try_quantize_alpha_delta( + vfloat4 color0, + vfloat4 color1, + vint4& color0_out, + vint4& color1_out, + quant_method quant_level +) { + float a0 = color0.lane<3>(); + float a1 = color1.lane<3>(); + + int a0a = astc::flt2int_rtn(a0); + a0a <<= 1; + int a0b = a0a & 0xFF; + int a0be = quant_color(quant_level, a0b); + a0b = a0be; + a0b |= a0a & 0x100; + int a1d = astc::flt2int_rtn(a1); + a1d <<= 1; + a1d -= a0b; + + if (a1d > 63 || a1d < -64) + { + return false; + } + + a1d &= 0x7F; + a1d |= (a0b & 0x100) >> 1; + + int a1de = quant_color(quant_level, a1d); + int a1du = a1de; + if ((a1d ^ a1du) & 0xC0) + { + return false; + } + + a1du &= 0x7F; + if (a1du & 0x40) + { + a1du -= 0x80; + } + + a1du += a0b; + if (a1du < 0 || a1du > 0x1FF) + { + return false; + } + + color0_out.set_lane<3>(a0be); + color1_out.set_lane<3>(a1de); + + return true; +} + +/** + * @brief Try to quantize an LDR LA color using delta encoding. + * + * At decode time we move one bit from the offset to the base and seize another bit as a sign bit; + * we then unquantize both values as if they contain one extra bit. If the sum of the offsets is + * non-negative, then we encode a regular delta. + * + * This function only compressed the alpha - the other elements in the output array are not touched. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] output The output endpoints, returned as (l0, l1, a0, a1). + * @param quant_level The quantization level to use. + * + * @return Returns @c false on failure, @c true on success. + */ +static bool try_quantize_luminance_alpha_delta( + vfloat4 color0, + vfloat4 color1, + uint8_t output[4], + quant_method quant_level +) { + float l0 = hadd_rgb_s(color0) * (1.0f / 3.0f); + float l1 = hadd_rgb_s(color1) * (1.0f / 3.0f); + + float a0 = color0.lane<3>(); + float a1 = color1.lane<3>(); + + int l0a = astc::flt2int_rtn(l0); + int a0a = astc::flt2int_rtn(a0); + l0a <<= 1; + a0a <<= 1; + + int l0b = l0a & 0xFF; + int a0b = a0a & 0xFF; + int l0be = quant_color(quant_level, l0b); + int a0be = quant_color(quant_level, a0b); + l0b = l0be; + a0b = a0be; + l0b |= l0a & 0x100; + a0b |= a0a & 0x100; + + int l1d = astc::flt2int_rtn(l1); + int a1d = astc::flt2int_rtn(a1); + l1d <<= 1; + a1d <<= 1; + l1d -= l0b; + a1d -= a0b; + + if (l1d > 63 || l1d < -64) + { + return false; + } + + if (a1d > 63 || a1d < -64) + { + return false; + } + + l1d &= 0x7F; + a1d &= 0x7F; + l1d |= (l0b & 0x100) >> 1; + a1d |= (a0b & 0x100) >> 1; + + int l1de = quant_color(quant_level, l1d); + int a1de = quant_color(quant_level, a1d); + int l1du = l1de; + int a1du = a1de; + + if ((l1d ^ l1du) & 0xC0) + { + return false; + } + + if ((a1d ^ a1du) & 0xC0) + { + return false; + } + + l1du &= 0x7F; + a1du &= 0x7F; + + if (l1du & 0x40) + { + l1du -= 0x80; + } + + if (a1du & 0x40) + { + a1du -= 0x80; + } + + l1du += l0b; + a1du += a0b; + + if (l1du < 0 || l1du > 0x1FF) + { + return false; + } + + if (a1du < 0 || a1du > 0x1FF) + { + return false; + } + + output[0] = static_cast(l0be); + output[1] = static_cast(l1de); + output[2] = static_cast(a0be); + output[3] = static_cast(a1de); + + return true; +} + +/** + * @brief Try to quantize an LDR RGBA color using delta encoding. + * + * At decode time we move one bit from the offset to the base and seize another bit as a sign bit; + * we then unquantize both values as if they contain one extra bit. If the sum of the offsets is + * non-negative, then we encode a regular delta. + * + * This function only compressed the alpha - the other elements in the output array are not touched. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] color0_out The output quantized color0 endpoint + * @param[out] color1_out The output quantized color1 endpoint + * @param quant_level The quantization level to use. + * + * @return Returns @c false on failure, @c true on success. + */ +static bool try_quantize_rgba_delta( + vfloat4 color0, + vfloat4 color1, + vint4& color0_out, + vint4& color1_out, + quant_method quant_level +) { + return try_quantize_rgb_delta(color0, color1, color0_out, color1_out, quant_level) && + try_quantize_alpha_delta(color0, color1, color0_out, color1_out, quant_level); +} + +/** + * @brief Try to quantize an LDR RGBA color using delta and blue contract encoding. + * + * At decode time we move one bit from the offset to the base and seize another bit as a sign bit; + * we then unquantize both values as if they contain one extra bit. If the sum of the offsets is + * non-negative, then we encode a regular delta. + * + * This function only compressed the alpha - the other elements in the output array are not touched. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] color0_out The output quantized color0 endpoint + * @param[out] color1_out The output quantized color1 endpoint + * @param quant_level The quantization level to use. + * + * @return Returns @c false on failure, @c true on success. + */ +static bool try_quantize_rgba_delta_blue_contract( + vfloat4 color0, + vfloat4 color1, + vint4& color0_out, + vint4& color1_out, + quant_method quant_level +) { + // Note that we swap the color0 and color1 ordering for alpha to match RGB blue-contract + return try_quantize_rgb_delta_blue_contract(color0, color1, color0_out, color1_out, quant_level) && + try_quantize_alpha_delta(color1, color0, color0_out, color1_out, quant_level); +} + +/** + * @brief Quantize an LDR RGB color using scale encoding. + * + * @param color The input unquantized color endpoint and scale factor. + * @param[out] output The output endpoints, returned as (r0, g0, b0, s). + * @param quant_level The quantization level to use. + */ +static void quantize_rgbs( + vfloat4 color, + uint8_t output[4], + quant_method quant_level +) { + float scale = 1.0f / 257.0f; + + float r = astc::clamp255f(color.lane<0>() * scale); + float g = astc::clamp255f(color.lane<1>() * scale); + float b = astc::clamp255f(color.lane<2>() * scale); + + int ri = quant_color(quant_level, astc::flt2int_rtn(r), r); + int gi = quant_color(quant_level, astc::flt2int_rtn(g), g); + int bi = quant_color(quant_level, astc::flt2int_rtn(b), b); + + float oldcolorsum = hadd_rgb_s(color) * scale; + float newcolorsum = static_cast(ri + gi + bi); + + float scalea = astc::clamp1f(color.lane<3>() * (oldcolorsum + 1e-10f) / (newcolorsum + 1e-10f)); + int scale_idx = astc::flt2int_rtn(scalea * 256.0f); + scale_idx = astc::clamp(scale_idx, 0, 255); + + output[0] = static_cast(ri); + output[1] = static_cast(gi); + output[2] = static_cast(bi); + output[3] = quant_color(quant_level, scale_idx); +} + +/** + * @brief Quantize an LDR RGBA color using scale encoding. + * + * @param color0 The input unquantized color0 alpha endpoint. + * @param color1 The input unquantized color1 alpha endpoint. + * @param color The input unquantized color endpoint and scale factor. + * @param[out] output The output endpoints, returned as (r0, g0, b0, s, a0, a1). + * @param quant_level The quantization level to use. + */ +static void quantize_rgbs_alpha( + vfloat4 color0, + vfloat4 color1, + vfloat4 color, + uint8_t output[6], + quant_method quant_level +) { + float a0 = color0.lane<3>(); + float a1 = color1.lane<3>(); + + output[4] = quant_color(quant_level, astc::flt2int_rtn(a0), a0); + output[5] = quant_color(quant_level, astc::flt2int_rtn(a1), a1); + + quantize_rgbs(color, output, quant_level); +} + +/** + * @brief Quantize a LDR L color. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] output The output endpoints, returned as (l0, l1). + * @param quant_level The quantization level to use. + */ +static void quantize_luminance( + vfloat4 color0, + vfloat4 color1, + uint8_t output[2], + quant_method quant_level +) { + float lum0 = hadd_rgb_s(color0) * (1.0f / 3.0f); + float lum1 = hadd_rgb_s(color1) * (1.0f / 3.0f); + + if (lum0 > lum1) + { + float avg = (lum0 + lum1) * 0.5f; + lum0 = avg; + lum1 = avg; + } + + output[0] = quant_color(quant_level, astc::flt2int_rtn(lum0), lum0); + output[1] = quant_color(quant_level, astc::flt2int_rtn(lum1), lum1); +} + +/** + * @brief Quantize a LDR LA color. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] output The output endpoints, returned as (l0, l1, a0, a1). + * @param quant_level The quantization level to use. + */ +static void quantize_luminance_alpha( + vfloat4 color0, + vfloat4 color1, + uint8_t output[4], + quant_method quant_level +) { + float lum0 = hadd_rgb_s(color0) * (1.0f / 3.0f); + float lum1 = hadd_rgb_s(color1) * (1.0f / 3.0f); + + float a0 = color0.lane<3>(); + float a1 = color1.lane<3>(); + + output[0] = quant_color(quant_level, astc::flt2int_rtn(lum0), lum0); + output[1] = quant_color(quant_level, astc::flt2int_rtn(lum1), lum1); + output[2] = quant_color(quant_level, astc::flt2int_rtn(a0), a0); + output[3] = quant_color(quant_level, astc::flt2int_rtn(a1), a1); +} + +/** + * @brief Quantize and unquantize a value ensuring top two bits are the same. + * + * @param quant_level The quantization level to use. + * @param value The input unquantized value. + * @param[out] quant_value The quantized value. + */ +static inline void quantize_and_unquantize_retain_top_two_bits( + quant_method quant_level, + uint8_t value, + uint8_t& quant_value +) { + int perform_loop; + uint8_t quantval; + + do + { + quantval = quant_color(quant_level, value); + + // Perform looping if the top two bits were modified by quant/unquant + perform_loop = (value & 0xC0) != (quantval & 0xC0); + + if ((quantval & 0xC0) > (value & 0xC0)) + { + // Quant/unquant rounded UP so that the top two bits changed; + // decrement the input in hopes that this will avoid rounding up. + value--; + } + else if ((quantval & 0xC0) < (value & 0xC0)) + { + // Quant/unquant rounded DOWN so that the top two bits changed; + // decrement the input in hopes that this will avoid rounding down. + value--; + } + } while (perform_loop); + + quant_value = quantval; +} + +/** + * @brief Quantize and unquantize a value ensuring top four bits are the same. + * + * @param quant_level The quantization level to use. + * @param value The input unquantized value. + * @param[out] quant_value The quantized value in 0-255 range. + */ +static inline void quantize_and_unquantize_retain_top_four_bits( + quant_method quant_level, + uint8_t value, + uint8_t& quant_value +) { + uint8_t perform_loop; + uint8_t quantval; + + do + { + quantval = quant_color(quant_level, value); + // Perform looping if the top four bits were modified by quant/unquant + perform_loop = (value & 0xF0) != (quantval & 0xF0); + + if ((quantval & 0xF0) > (value & 0xF0)) + { + // Quant/unquant rounded UP so that the top four bits changed; + // decrement the input value in hopes that this will avoid rounding up. + value--; + } + else if ((quantval & 0xF0) < (value & 0xF0)) + { + // Quant/unquant rounded DOWN so that the top four bits changed; + // decrement the input value in hopes that this will avoid rounding down. + value--; + } + } while (perform_loop); + + quant_value = quantval; +} + +/** + * @brief Quantize a HDR RGB color using RGB + offset. + * + * @param color The input unquantized color endpoint and offset. + * @param[out] output The output endpoints, returned as packed RGBS with some mode bits. + * @param quant_level The quantization level to use. + */ +static void quantize_hdr_rgbo( + vfloat4 color, + uint8_t output[4], + quant_method quant_level +) { + color.set_lane<0>(color.lane<0>() + color.lane<3>()); + color.set_lane<1>(color.lane<1>() + color.lane<3>()); + color.set_lane<2>(color.lane<2>() + color.lane<3>()); + + color = clamp(0.0f, 65535.0f, color); + + vfloat4 color_bak = color; + + int majcomp; + if (color.lane<0>() > color.lane<1>() && color.lane<0>() > color.lane<2>()) + { + majcomp = 0; // red is largest component + } + else if (color.lane<1>() > color.lane<2>()) + { + majcomp = 1; // green is largest component + } + else + { + majcomp = 2; // blue is largest component + } + + // swap around the red component and the largest component. + switch (majcomp) + { + case 1: + color = color.swz<1, 0, 2, 3>(); + break; + case 2: + color = color.swz<2, 1, 0, 3>(); + break; + default: + break; + } + + static const int mode_bits[5][3] { + {11, 5, 7}, + {11, 6, 5}, + {10, 5, 8}, + {9, 6, 7}, + {8, 7, 6} + }; + + static const float mode_cutoffs[5][2] { + {1024, 4096}, + {2048, 1024}, + {2048, 16384}, + {8192, 16384}, + {32768, 16384} + }; + + static const float mode_rscales[5] { + 32.0f, + 32.0f, + 64.0f, + 128.0f, + 256.0f, + }; + + static const float mode_scales[5] { + 1.0f / 32.0f, + 1.0f / 32.0f, + 1.0f / 64.0f, + 1.0f / 128.0f, + 1.0f / 256.0f, + }; + + float r_base = color.lane<0>(); + float g_base = color.lane<0>() - color.lane<1>() ; + float b_base = color.lane<0>() - color.lane<2>() ; + float s_base = color.lane<3>() ; + + for (int mode = 0; mode < 5; mode++) + { + if (g_base > mode_cutoffs[mode][0] || b_base > mode_cutoffs[mode][0] || s_base > mode_cutoffs[mode][1]) + { + continue; + } + + // Encode the mode into a 4-bit vector + int mode_enc = mode < 4 ? (mode | (majcomp << 2)) : (majcomp | 0xC); + + float mode_scale = mode_scales[mode]; + float mode_rscale = mode_rscales[mode]; + + int gb_intcutoff = 1 << mode_bits[mode][1]; + int s_intcutoff = 1 << mode_bits[mode][2]; + + // Quantize and unquantize R + int r_intval = astc::flt2int_rtn(r_base * mode_scale); + + int r_lowbits = r_intval & 0x3f; + + r_lowbits |= (mode_enc & 3) << 6; + + uint8_t r_quantval; + quantize_and_unquantize_retain_top_two_bits( + quant_level, static_cast(r_lowbits), r_quantval); + + r_intval = (r_intval & ~0x3f) | (r_quantval & 0x3f); + float r_fval = static_cast(r_intval) * mode_rscale; + + // Recompute G and B, then quantize and unquantize them + float g_fval = r_fval - color.lane<1>() ; + float b_fval = r_fval - color.lane<2>() ; + + g_fval = astc::clamp(g_fval, 0.0f, 65535.0f); + b_fval = astc::clamp(b_fval, 0.0f, 65535.0f); + + int g_intval = astc::flt2int_rtn(g_fval * mode_scale); + int b_intval = astc::flt2int_rtn(b_fval * mode_scale); + + if (g_intval >= gb_intcutoff || b_intval >= gb_intcutoff) + { + continue; + } + + int g_lowbits = g_intval & 0x1f; + int b_lowbits = b_intval & 0x1f; + + int bit0 = 0; + int bit1 = 0; + int bit2 = 0; + int bit3 = 0; + + switch (mode) + { + case 0: + case 2: + bit0 = (r_intval >> 9) & 1; + break; + case 1: + case 3: + bit0 = (r_intval >> 8) & 1; + break; + case 4: + case 5: + bit0 = (g_intval >> 6) & 1; + break; + } + + switch (mode) + { + case 0: + case 1: + case 2: + case 3: + bit2 = (r_intval >> 7) & 1; + break; + case 4: + case 5: + bit2 = (b_intval >> 6) & 1; + break; + } + + switch (mode) + { + case 0: + case 2: + bit1 = (r_intval >> 8) & 1; + break; + case 1: + case 3: + case 4: + case 5: + bit1 = (g_intval >> 5) & 1; + break; + } + + switch (mode) + { + case 0: + bit3 = (r_intval >> 10) & 1; + break; + case 2: + bit3 = (r_intval >> 6) & 1; + break; + case 1: + case 3: + case 4: + case 5: + bit3 = (b_intval >> 5) & 1; + break; + } + + g_lowbits |= (mode_enc & 0x4) << 5; + b_lowbits |= (mode_enc & 0x8) << 4; + + g_lowbits |= bit0 << 6; + g_lowbits |= bit1 << 5; + b_lowbits |= bit2 << 6; + b_lowbits |= bit3 << 5; + + uint8_t g_quantval; + uint8_t b_quantval; + + quantize_and_unquantize_retain_top_four_bits( + quant_level, static_cast(g_lowbits), g_quantval); + quantize_and_unquantize_retain_top_four_bits( + quant_level, static_cast(b_lowbits), b_quantval); + + g_intval = (g_intval & ~0x1f) | (g_quantval & 0x1f); + b_intval = (b_intval & ~0x1f) | (b_quantval & 0x1f); + + g_fval = static_cast(g_intval) * mode_rscale; + b_fval = static_cast(b_intval) * mode_rscale; + + // Recompute the scale value, based on the errors introduced to red, green and blue + + // If the error is positive, then the R,G,B errors combined have raised the color + // value overall; as such, the scale value needs to be increased. + float rgb_errorsum = (r_fval - color.lane<0>() ) + (r_fval - g_fval - color.lane<1>() ) + (r_fval - b_fval - color.lane<2>() ); + + float s_fval = s_base + rgb_errorsum * (1.0f / 3.0f); + s_fval = astc::clamp(s_fval, 0.0f, 1e9f); + + int s_intval = astc::flt2int_rtn(s_fval * mode_scale); + + if (s_intval >= s_intcutoff) + { + continue; + } + + int s_lowbits = s_intval & 0x1f; + + int bit4; + int bit5; + int bit6; + switch (mode) + { + case 1: + bit6 = (r_intval >> 9) & 1; + break; + default: + bit6 = (s_intval >> 5) & 1; + break; + } + + switch (mode) + { + case 4: + bit5 = (r_intval >> 7) & 1; + break; + case 1: + bit5 = (r_intval >> 10) & 1; + break; + default: + bit5 = (s_intval >> 6) & 1; + break; + } + + switch (mode) + { + case 2: + bit4 = (s_intval >> 7) & 1; + break; + default: + bit4 = (r_intval >> 6) & 1; + break; + } + + s_lowbits |= bit6 << 5; + s_lowbits |= bit5 << 6; + s_lowbits |= bit4 << 7; + + uint8_t s_quantval; + + quantize_and_unquantize_retain_top_four_bits( + quant_level, static_cast(s_lowbits), s_quantval); + + output[0] = r_quantval; + output[1] = g_quantval; + output[2] = b_quantval; + output[3] = s_quantval; + return; + } + + // Failed to encode any of the modes above? In that case encode using mode #5 + float vals[4]; + vals[0] = color_bak.lane<0>(); + vals[1] = color_bak.lane<1>(); + vals[2] = color_bak.lane<2>(); + vals[3] = color_bak.lane<3>(); + + int ivals[4]; + float cvals[3]; + + for (int i = 0; i < 3; i++) + { + vals[i] = astc::clamp(vals[i], 0.0f, 65020.0f); + ivals[i] = astc::flt2int_rtn(vals[i] * (1.0f / 512.0f)); + cvals[i] = static_cast(ivals[i]) * 512.0f; + } + + float rgb_errorsum = (cvals[0] - vals[0]) + (cvals[1] - vals[1]) + (cvals[2] - vals[2]); + vals[3] += rgb_errorsum * (1.0f / 3.0f); + + vals[3] = astc::clamp(vals[3], 0.0f, 65020.0f); + ivals[3] = astc::flt2int_rtn(vals[3] * (1.0f / 512.0f)); + + int encvals[4]; + encvals[0] = (ivals[0] & 0x3f) | 0xC0; + encvals[1] = (ivals[1] & 0x7f) | 0x80; + encvals[2] = (ivals[2] & 0x7f) | 0x80; + encvals[3] = (ivals[3] & 0x7f) | ((ivals[0] & 0x40) << 1); + + for (uint8_t i = 0; i < 4; i++) + { + quantize_and_unquantize_retain_top_four_bits( + quant_level, static_cast(encvals[i]), output[i]); + } + + return; +} + +/** + * @brief Quantize a HDR RGB color using direct RGB encoding. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] output The output endpoints, returned as packed RGB+RGB pairs with mode bits. + * @param quant_level The quantization level to use. + */ +static void quantize_hdr_rgb( + vfloat4 color0, + vfloat4 color1, + uint8_t output[6], + quant_method quant_level +) { + // Note: color*.lane<3> is not used so we can ignore it + color0 = clamp(0.0f, 65535.0f, color0); + color1 = clamp(0.0f, 65535.0f, color1); + + vfloat4 color0_bak = color0; + vfloat4 color1_bak = color1; + + int majcomp; + if (color1.lane<0>() > color1.lane<1>() && color1.lane<0>() > color1.lane<2>()) + { + majcomp = 0; + } + else if (color1.lane<1>() > color1.lane<2>()) + { + majcomp = 1; + } + else + { + majcomp = 2; + } + + // Swizzle the components + switch (majcomp) + { + case 1: // red-green swap + color0 = color0.swz<1, 0, 2, 3>(); + color1 = color1.swz<1, 0, 2, 3>(); + break; + case 2: // red-blue swap + color0 = color0.swz<2, 1, 0, 3>(); + color1 = color1.swz<2, 1, 0, 3>(); + break; + default: + break; + } + + float a_base = color1.lane<0>(); + a_base = astc::clamp(a_base, 0.0f, 65535.0f); + + float b0_base = a_base - color1.lane<1>(); + float b1_base = a_base - color1.lane<2>(); + float c_base = a_base - color0.lane<0>(); + float d0_base = a_base - b0_base - c_base - color0.lane<1>(); + float d1_base = a_base - b1_base - c_base - color0.lane<2>(); + + // Number of bits in the various fields in the various modes + static const int mode_bits[8][4] { + {9, 7, 6, 7}, + {9, 8, 6, 6}, + {10, 6, 7, 7}, + {10, 7, 7, 6}, + {11, 8, 6, 5}, + {11, 6, 8, 6}, + {12, 7, 7, 5}, + {12, 6, 7, 6} + }; + + // Cutoffs to use for the computed values of a,b,c,d, assuming the + // range 0..65535 are LNS values corresponding to fp16. + static const float mode_cutoffs[8][4] { + {16384, 8192, 8192, 8}, // mode 0: 9,7,6,7 + {32768, 8192, 4096, 8}, // mode 1: 9,8,6,6 + {4096, 8192, 4096, 4}, // mode 2: 10,6,7,7 + {8192, 8192, 2048, 4}, // mode 3: 10,7,7,6 + {8192, 2048, 512, 2}, // mode 4: 11,8,6,5 + {2048, 8192, 1024, 2}, // mode 5: 11,6,8,6 + {2048, 2048, 256, 1}, // mode 6: 12,7,7,5 + {1024, 2048, 512, 1}, // mode 7: 12,6,7,6 + }; + + static const float mode_scales[8] { + 1.0f / 128.0f, + 1.0f / 128.0f, + 1.0f / 64.0f, + 1.0f / 64.0f, + 1.0f / 32.0f, + 1.0f / 32.0f, + 1.0f / 16.0f, + 1.0f / 16.0f, + }; + + // Scaling factors when going from what was encoded in the mode to 16 bits. + static const float mode_rscales[8] { + 128.0f, + 128.0f, + 64.0f, + 64.0f, + 32.0f, + 32.0f, + 16.0f, + 16.0f + }; + + // Try modes one by one, with the highest-precision mode first. + for (int mode = 7; mode >= 0; mode--) + { + // For each mode, test if we can in fact accommodate the computed b, c, and d values. + // If we clearly can't, then we skip to the next mode. + + float b_cutoff = mode_cutoffs[mode][0]; + float c_cutoff = mode_cutoffs[mode][1]; + float d_cutoff = mode_cutoffs[mode][2]; + + if (b0_base > b_cutoff || b1_base > b_cutoff || c_base > c_cutoff || fabsf(d0_base) > d_cutoff || fabsf(d1_base) > d_cutoff) + { + continue; + } + + float mode_scale = mode_scales[mode]; + float mode_rscale = mode_rscales[mode]; + + int b_intcutoff = 1 << mode_bits[mode][1]; + int c_intcutoff = 1 << mode_bits[mode][2]; + int d_intcutoff = 1 << (mode_bits[mode][3] - 1); + + // Quantize and unquantize A, with the assumption that its high bits can be handled safely. + int a_intval = astc::flt2int_rtn(a_base * mode_scale); + int a_lowbits = a_intval & 0xFF; + + int a_quantval = quant_color(quant_level, a_lowbits); + int a_uquantval = a_quantval; + a_intval = (a_intval & ~0xFF) | a_uquantval; + float a_fval = static_cast(a_intval) * mode_rscale; + + // Recompute C, then quantize and unquantize it + float c_fval = a_fval - color0.lane<0>(); + c_fval = astc::clamp(c_fval, 0.0f, 65535.0f); + + int c_intval = astc::flt2int_rtn(c_fval * mode_scale); + + if (c_intval >= c_intcutoff) + { + continue; + } + + int c_lowbits = c_intval & 0x3f; + + c_lowbits |= (mode & 1) << 7; + c_lowbits |= (a_intval & 0x100) >> 2; + + uint8_t c_quantval; + + quantize_and_unquantize_retain_top_two_bits( + quant_level, static_cast(c_lowbits), c_quantval); + + c_intval = (c_intval & ~0x3F) | (c_quantval & 0x3F); + c_fval = static_cast(c_intval) * mode_rscale; + + // Recompute B0 and B1, then quantize and unquantize them + float b0_fval = a_fval - color1.lane<1>(); + float b1_fval = a_fval - color1.lane<2>(); + + b0_fval = astc::clamp(b0_fval, 0.0f, 65535.0f); + b1_fval = astc::clamp(b1_fval, 0.0f, 65535.0f); + int b0_intval = astc::flt2int_rtn(b0_fval * mode_scale); + int b1_intval = astc::flt2int_rtn(b1_fval * mode_scale); + + if (b0_intval >= b_intcutoff || b1_intval >= b_intcutoff) + { + continue; + } + + int b0_lowbits = b0_intval & 0x3f; + int b1_lowbits = b1_intval & 0x3f; + + int bit0 = 0; + int bit1 = 0; + switch (mode) + { + case 0: + case 1: + case 3: + case 4: + case 6: + bit0 = (b0_intval >> 6) & 1; + break; + case 2: + case 5: + case 7: + bit0 = (a_intval >> 9) & 1; + break; + } + + switch (mode) + { + case 0: + case 1: + case 3: + case 4: + case 6: + bit1 = (b1_intval >> 6) & 1; + break; + case 2: + bit1 = (c_intval >> 6) & 1; + break; + case 5: + case 7: + bit1 = (a_intval >> 10) & 1; + break; + } + + b0_lowbits |= bit0 << 6; + b1_lowbits |= bit1 << 6; + + b0_lowbits |= ((mode >> 1) & 1) << 7; + b1_lowbits |= ((mode >> 2) & 1) << 7; + + uint8_t b0_quantval; + uint8_t b1_quantval; + + quantize_and_unquantize_retain_top_two_bits( + quant_level, static_cast(b0_lowbits), b0_quantval); + quantize_and_unquantize_retain_top_two_bits( + quant_level, static_cast(b1_lowbits), b1_quantval); + + b0_intval = (b0_intval & ~0x3f) | (b0_quantval & 0x3f); + b1_intval = (b1_intval & ~0x3f) | (b1_quantval & 0x3f); + b0_fval = static_cast(b0_intval) * mode_rscale; + b1_fval = static_cast(b1_intval) * mode_rscale; + + // Recompute D0 and D1, then quantize and unquantize them + float d0_fval = a_fval - b0_fval - c_fval - color0.lane<1>(); + float d1_fval = a_fval - b1_fval - c_fval - color0.lane<2>(); + + d0_fval = astc::clamp(d0_fval, -65535.0f, 65535.0f); + d1_fval = astc::clamp(d1_fval, -65535.0f, 65535.0f); + + int d0_intval = astc::flt2int_rtn(d0_fval * mode_scale); + int d1_intval = astc::flt2int_rtn(d1_fval * mode_scale); + + if (abs(d0_intval) >= d_intcutoff || abs(d1_intval) >= d_intcutoff) + { + continue; + } + + int d0_lowbits = d0_intval & 0x1f; + int d1_lowbits = d1_intval & 0x1f; + + int bit2 = 0; + int bit3 = 0; + int bit4; + int bit5; + switch (mode) + { + case 0: + case 2: + bit2 = (d0_intval >> 6) & 1; + break; + case 1: + case 4: + bit2 = (b0_intval >> 7) & 1; + break; + case 3: + bit2 = (a_intval >> 9) & 1; + break; + case 5: + bit2 = (c_intval >> 7) & 1; + break; + case 6: + case 7: + bit2 = (a_intval >> 11) & 1; + break; + } + switch (mode) + { + case 0: + case 2: + bit3 = (d1_intval >> 6) & 1; + break; + case 1: + case 4: + bit3 = (b1_intval >> 7) & 1; + break; + case 3: + case 5: + case 6: + case 7: + bit3 = (c_intval >> 6) & 1; + break; + } + + switch (mode) + { + case 4: + case 6: + bit4 = (a_intval >> 9) & 1; + bit5 = (a_intval >> 10) & 1; + break; + default: + bit4 = (d0_intval >> 5) & 1; + bit5 = (d1_intval >> 5) & 1; + break; + } + + d0_lowbits |= bit2 << 6; + d1_lowbits |= bit3 << 6; + d0_lowbits |= bit4 << 5; + d1_lowbits |= bit5 << 5; + + d0_lowbits |= (majcomp & 1) << 7; + d1_lowbits |= ((majcomp >> 1) & 1) << 7; + + uint8_t d0_quantval; + uint8_t d1_quantval; + + quantize_and_unquantize_retain_top_four_bits( + quant_level, static_cast(d0_lowbits), d0_quantval); + quantize_and_unquantize_retain_top_four_bits( + quant_level, static_cast(d1_lowbits), d1_quantval); + + output[0] = static_cast(a_quantval); + output[1] = c_quantval; + output[2] = b0_quantval; + output[3] = b1_quantval; + output[4] = d0_quantval; + output[5] = d1_quantval; + return; + } + + // If neither of the modes fit we will use a flat representation for storing data, using 8 bits + // for red and green, and 7 bits for blue. This gives color accuracy roughly similar to LDR + // 4:4:3 which is not at all great but usable. This representation is used if the light color is + // more than 4x the color value of the dark color. + float vals[6]; + vals[0] = color0_bak.lane<0>(); + vals[1] = color1_bak.lane<0>(); + vals[2] = color0_bak.lane<1>(); + vals[3] = color1_bak.lane<1>(); + vals[4] = color0_bak.lane<2>(); + vals[5] = color1_bak.lane<2>(); + + for (int i = 0; i < 6; i++) + { + vals[i] = astc::clamp(vals[i], 0.0f, 65020.0f); + } + + for (int i = 0; i < 4; i++) + { + int idx = astc::flt2int_rtn(vals[i] * 1.0f / 256.0f); + output[i] = quant_color(quant_level, idx); + } + + for (int i = 4; i < 6; i++) + { + int idx = astc::flt2int_rtn(vals[i] * 1.0f / 512.0f) + 128; + quantize_and_unquantize_retain_top_two_bits( + quant_level, static_cast(idx), output[i]); + } + + return; +} + +/** + * @brief Quantize a HDR RGB + LDR A color using direct RGBA encoding. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] output The output endpoints, returned as packed RGBA+RGBA pairs with mode bits. + * @param quant_level The quantization level to use. + */ +static void quantize_hdr_rgb_ldr_alpha( + vfloat4 color0, + vfloat4 color1, + uint8_t output[8], + quant_method quant_level +) { + float scale = 1.0f / 257.0f; + + float a0 = astc::clamp255f(color0.lane<3>() * scale); + float a1 = astc::clamp255f(color1.lane<3>() * scale); + + output[6] = quant_color(quant_level, astc::flt2int_rtn(a0), a0); + output[7] = quant_color(quant_level, astc::flt2int_rtn(a1), a1); + + quantize_hdr_rgb(color0, color1, output, quant_level); +} + +/** + * @brief Quantize a HDR L color using the large range encoding. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] output The output endpoints, returned as packed (l0, l1). + * @param quant_level The quantization level to use. + */ +static void quantize_hdr_luminance_large_range( + vfloat4 color0, + vfloat4 color1, + uint8_t output[2], + quant_method quant_level +) { + float lum0 = hadd_rgb_s(color0) * (1.0f / 3.0f); + float lum1 = hadd_rgb_s(color1) * (1.0f / 3.0f); + + if (lum1 < lum0) + { + float avg = (lum0 + lum1) * 0.5f; + lum0 = avg; + lum1 = avg; + } + + int ilum1 = astc::flt2int_rtn(lum1); + int ilum0 = astc::flt2int_rtn(lum0); + + // Find the closest encodable point in the upper half of the code-point space + int upper_v0 = (ilum0 + 128) >> 8; + int upper_v1 = (ilum1 + 128) >> 8; + + upper_v0 = astc::clamp(upper_v0, 0, 255); + upper_v1 = astc::clamp(upper_v1, 0, 255); + + // Find the closest encodable point in the lower half of the code-point space + int lower_v0 = (ilum1 + 256) >> 8; + int lower_v1 = ilum0 >> 8; + + lower_v0 = astc::clamp(lower_v0, 0, 255); + lower_v1 = astc::clamp(lower_v1, 0, 255); + + // Determine the distance between the point in code-point space and the input value + int upper0_dec = upper_v0 << 8; + int upper1_dec = upper_v1 << 8; + int lower0_dec = (lower_v1 << 8) + 128; + int lower1_dec = (lower_v0 << 8) - 128; + + int upper0_diff = upper0_dec - ilum0; + int upper1_diff = upper1_dec - ilum1; + int lower0_diff = lower0_dec - ilum0; + int lower1_diff = lower1_dec - ilum1; + + int upper_error = (upper0_diff * upper0_diff) + (upper1_diff * upper1_diff); + int lower_error = (lower0_diff * lower0_diff) + (lower1_diff * lower1_diff); + + int v0, v1; + if (upper_error < lower_error) + { + v0 = upper_v0; + v1 = upper_v1; + } + else + { + v0 = lower_v0; + v1 = lower_v1; + } + + // OK; encode + output[0] = quant_color(quant_level, v0); + output[1] = quant_color(quant_level, v1); +} + +/** + * @brief Quantize a HDR L color using the small range encoding. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] output The output endpoints, returned as packed (l0, l1) with mode bits. + * @param quant_level The quantization level to use. + * + * @return Returns @c false on failure, @c true on success. + */ +static bool try_quantize_hdr_luminance_small_range( + vfloat4 color0, + vfloat4 color1, + uint8_t output[2], + quant_method quant_level +) { + float lum0 = hadd_rgb_s(color0) * (1.0f / 3.0f); + float lum1 = hadd_rgb_s(color1) * (1.0f / 3.0f); + + if (lum1 < lum0) + { + float avg = (lum0 + lum1) * 0.5f; + lum0 = avg; + lum1 = avg; + } + + int ilum1 = astc::flt2int_rtn(lum1); + int ilum0 = astc::flt2int_rtn(lum0); + + // Difference of more than a factor-of-2 results in immediate failure + if (ilum1 - ilum0 > 2048) + { + return false; + } + + int lowval, highval, diffval; + int v0, v1; + int v0e, v1e; + int v0d, v1d; + + // Try to encode the high-precision submode + lowval = (ilum0 + 16) >> 5; + highval = (ilum1 + 16) >> 5; + + lowval = astc::clamp(lowval, 0, 2047); + highval = astc::clamp(highval, 0, 2047); + + v0 = lowval & 0x7F; + v0e = quant_color(quant_level, v0); + v0d = v0e; + + if (v0d < 0x80) + { + lowval = (lowval & ~0x7F) | v0d; + diffval = highval - lowval; + if (diffval >= 0 && diffval <= 15) + { + v1 = ((lowval >> 3) & 0xF0) | diffval; + v1e = quant_color(quant_level, v1); + v1d = v1e; + if ((v1d & 0xF0) == (v1 & 0xF0)) + { + output[0] = static_cast(v0e); + output[1] = static_cast(v1e); + return true; + } + } + } + + // Try to encode the low-precision submode + lowval = (ilum0 + 32) >> 6; + highval = (ilum1 + 32) >> 6; + + lowval = astc::clamp(lowval, 0, 1023); + highval = astc::clamp(highval, 0, 1023); + + v0 = (lowval & 0x7F) | 0x80; + v0e = quant_color(quant_level, v0); + v0d = v0e; + if ((v0d & 0x80) == 0) + { + return false; + } + + lowval = (lowval & ~0x7F) | (v0d & 0x7F); + diffval = highval - lowval; + if (diffval < 0 || diffval > 31) + { + return false; + } + + v1 = ((lowval >> 2) & 0xE0) | diffval; + v1e = quant_color(quant_level, v1); + v1d = v1e; + if ((v1d & 0xE0) != (v1 & 0xE0)) + { + return false; + } + + output[0] = static_cast(v0e); + output[1] = static_cast(v1e); + return true; +} + +/** + * @brief Quantize a HDR A color using either delta or direct RGBA encoding. + * + * @param alpha0 The input unquantized color0 endpoint. + * @param alpha1 The input unquantized color1 endpoint. + * @param[out] output The output endpoints, returned as packed RGBA+RGBA pairs with mode bits. + * @param quant_level The quantization level to use. + */ +static void quantize_hdr_alpha( + float alpha0, + float alpha1, + uint8_t output[2], + quant_method quant_level +) { + alpha0 = astc::clamp(alpha0, 0.0f, 65280.0f); + alpha1 = astc::clamp(alpha1, 0.0f, 65280.0f); + + int ialpha0 = astc::flt2int_rtn(alpha0); + int ialpha1 = astc::flt2int_rtn(alpha1); + + int val0, val1, diffval; + int v6, v7; + int v6e, v7e; + int v6d, v7d; + + // Try to encode one of the delta submodes, in decreasing-precision order + for (int i = 2; i >= 0; i--) + { + val0 = (ialpha0 + (128 >> i)) >> (8 - i); + val1 = (ialpha1 + (128 >> i)) >> (8 - i); + + v6 = (val0 & 0x7F) | ((i & 1) << 7); + v6e = quant_color(quant_level, v6); + v6d = v6e; + + if ((v6 ^ v6d) & 0x80) + { + continue; + } + + val0 = (val0 & ~0x7f) | (v6d & 0x7f); + diffval = val1 - val0; + int cutoff = 32 >> i; + int mask = 2 * cutoff - 1; + + if (diffval < -cutoff || diffval >= cutoff) + { + continue; + } + + v7 = ((i & 2) << 6) | ((val0 >> 7) << (6 - i)) | (diffval & mask); + v7e = quant_color(quant_level, v7); + v7d = v7e; + + static const int testbits[3] { 0xE0, 0xF0, 0xF8 }; + + if ((v7 ^ v7d) & testbits[i]) + { + continue; + } + + output[0] = static_cast(v6e); + output[1] = static_cast(v7e); + return; + } + + // Could not encode any of the delta modes; instead encode a flat value + val0 = (ialpha0 + 256) >> 9; + val1 = (ialpha1 + 256) >> 9; + v6 = val0 | 0x80; + v7 = val1 | 0x80; + + output[0] = quant_color(quant_level, v6); + output[1] = quant_color(quant_level, v7); + + return; +} + +/** + * @brief Quantize a HDR RGBA color using either delta or direct RGBA encoding. + * + * @param color0 The input unquantized color0 endpoint. + * @param color1 The input unquantized color1 endpoint. + * @param[out] output The output endpoints, returned as packed RGBA+RGBA pairs with mode bits. + * @param quant_level The quantization level to use. + */ +static void quantize_hdr_rgb_alpha( + vfloat4 color0, + vfloat4 color1, + uint8_t output[8], + quant_method quant_level +) { + quantize_hdr_rgb(color0, color1, output, quant_level); + quantize_hdr_alpha(color0.lane<3>(), color1.lane<3>(), output + 6, quant_level); +} + +/* See header for documentation. */ +uint8_t pack_color_endpoints( + vfloat4 color0, + vfloat4 color1, + vfloat4 rgbs_color, + vfloat4 rgbo_color, + int format, + uint8_t* output, + quant_method quant_level +) { + assert(QUANT_6 <= quant_level && quant_level <= QUANT_256); + + // Clamp colors to a valid LDR range + // Note that HDR has a lower max, handled in the conversion functions + color0 = clamp(0.0f, 65535.0f, color0); + color1 = clamp(0.0f, 65535.0f, color1); + + // Pre-scale the LDR value we need to the 0-255 quantizable range + vfloat4 color0_ldr = color0 * (1.0f / 257.0f); + vfloat4 color1_ldr = color1 * (1.0f / 257.0f); + + uint8_t retval = 0; + float best_error = ERROR_CALC_DEFAULT; + vint4 color0_out, color1_out; + vint4 color0_out2, color1_out2; + + switch (format) + { + case FMT_RGB: + if (quant_level <= QUANT_160) + { + if (try_quantize_rgb_delta_blue_contract(color0_ldr, color1_ldr, color0_out, color1_out, quant_level)) + { + vint4 color0_unpack; + vint4 color1_unpack; + rgba_delta_unpack(color0_out, color1_out, color0_unpack, color1_unpack); + + retval = FMT_RGB_DELTA; + best_error = get_rgba_encoding_error(color0_ldr, color1_ldr, color0_unpack, color1_unpack); + } + + if (try_quantize_rgb_delta(color0_ldr, color1_ldr, color0_out2, color1_out2, quant_level)) + { + vint4 color0_unpack; + vint4 color1_unpack; + rgba_delta_unpack(color0_out2, color1_out2, color0_unpack, color1_unpack); + + float error = get_rgba_encoding_error(color0_ldr, color1_ldr, color0_unpack, color1_unpack); + if (error < best_error) + { + retval = FMT_RGB_DELTA; + best_error = error; + color0_out = color0_out2; + color1_out = color1_out2; + } + } + } + + if (quant_level < QUANT_256) + { + if (try_quantize_rgb_blue_contract(color0_ldr, color1_ldr, color0_out2, color1_out2, quant_level)) + { + vint4 color0_unpack; + vint4 color1_unpack; + rgba_unpack(color0_out2, color1_out2, color0_unpack, color1_unpack); + + float error = get_rgba_encoding_error(color0_ldr, color1_ldr, color0_unpack, color1_unpack); + if (error < best_error) + { + retval = FMT_RGB; + best_error = error; + color0_out = color0_out2; + color1_out = color1_out2; + } + } + } + + { + quantize_rgb(color0_ldr, color1_ldr, color0_out2, color1_out2, quant_level); + + vint4 color0_unpack; + vint4 color1_unpack; + rgba_unpack(color0_out2, color1_out2, color0_unpack, color1_unpack); + + float error = get_rgba_encoding_error(color0_ldr, color1_ldr, color0_unpack, color1_unpack); + if (error < best_error) + { + retval = FMT_RGB; + color0_out = color0_out2; + color1_out = color1_out2; + } + } + + // TODO: Can we vectorize this? + output[0] = static_cast(color0_out.lane<0>()); + output[1] = static_cast(color1_out.lane<0>()); + output[2] = static_cast(color0_out.lane<1>()); + output[3] = static_cast(color1_out.lane<1>()); + output[4] = static_cast(color0_out.lane<2>()); + output[5] = static_cast(color1_out.lane<2>()); + break; + + case FMT_RGBA: + if (quant_level <= QUANT_160) + { + if (try_quantize_rgba_delta_blue_contract(color0_ldr, color1_ldr, color0_out, color1_out, quant_level)) + { + vint4 color0_unpack; + vint4 color1_unpack; + rgba_delta_unpack(color0_out, color1_out, color0_unpack, color1_unpack); + + retval = FMT_RGBA_DELTA; + best_error = get_rgba_encoding_error(color0_ldr, color1_ldr, color0_unpack, color1_unpack); + } + + if (try_quantize_rgba_delta(color0_ldr, color1_ldr, color0_out2, color1_out2, quant_level)) + { + vint4 color0_unpack; + vint4 color1_unpack; + rgba_delta_unpack(color0_out2, color1_out2, color0_unpack, color1_unpack); + + float error = get_rgba_encoding_error(color0_ldr, color1_ldr, color0_unpack, color1_unpack); + if (error < best_error) + { + retval = FMT_RGBA_DELTA; + best_error = error; + color0_out = color0_out2; + color1_out = color1_out2; + } + } + } + + if (quant_level < QUANT_256) + { + if (try_quantize_rgba_blue_contract(color0_ldr, color1_ldr, color0_out2, color1_out2, quant_level)) + { + vint4 color0_unpack; + vint4 color1_unpack; + rgba_unpack(color0_out2, color1_out2, color0_unpack, color1_unpack); + + float error = get_rgba_encoding_error(color0_ldr, color1_ldr, color0_unpack, color1_unpack); + if (error < best_error) + { + retval = FMT_RGBA; + best_error = error; + color0_out = color0_out2; + color1_out = color1_out2; + } + } + } + + { + quantize_rgba(color0_ldr, color1_ldr, color0_out2, color1_out2, quant_level); + + vint4 color0_unpack; + vint4 color1_unpack; + rgba_unpack(color0_out2, color1_out2, color0_unpack, color1_unpack); + + float error = get_rgba_encoding_error(color0_ldr, color1_ldr, color0_unpack, color1_unpack); + if (error < best_error) + { + retval = FMT_RGBA; + color0_out = color0_out2; + color1_out = color1_out2; + } + } + + // TODO: Can we vectorize this? + output[0] = static_cast(color0_out.lane<0>()); + output[1] = static_cast(color1_out.lane<0>()); + output[2] = static_cast(color0_out.lane<1>()); + output[3] = static_cast(color1_out.lane<1>()); + output[4] = static_cast(color0_out.lane<2>()); + output[5] = static_cast(color1_out.lane<2>()); + output[6] = static_cast(color0_out.lane<3>()); + output[7] = static_cast(color1_out.lane<3>()); + break; + + case FMT_RGB_SCALE: + quantize_rgbs(rgbs_color, output, quant_level); + retval = FMT_RGB_SCALE; + break; + + case FMT_HDR_RGB_SCALE: + quantize_hdr_rgbo(rgbo_color, output, quant_level); + retval = FMT_HDR_RGB_SCALE; + break; + + case FMT_HDR_RGB: + quantize_hdr_rgb(color0, color1, output, quant_level); + retval = FMT_HDR_RGB; + break; + + case FMT_RGB_SCALE_ALPHA: + quantize_rgbs_alpha(color0_ldr, color1_ldr, rgbs_color, output, quant_level); + retval = FMT_RGB_SCALE_ALPHA; + break; + + case FMT_HDR_LUMINANCE_SMALL_RANGE: + case FMT_HDR_LUMINANCE_LARGE_RANGE: + if (try_quantize_hdr_luminance_small_range(color0, color1, output, quant_level)) + { + retval = FMT_HDR_LUMINANCE_SMALL_RANGE; + break; + } + quantize_hdr_luminance_large_range(color0, color1, output, quant_level); + retval = FMT_HDR_LUMINANCE_LARGE_RANGE; + break; + + case FMT_LUMINANCE: + quantize_luminance(color0_ldr, color1_ldr, output, quant_level); + retval = FMT_LUMINANCE; + break; + + case FMT_LUMINANCE_ALPHA: + if (quant_level <= 18) + { + if (try_quantize_luminance_alpha_delta(color0_ldr, color1_ldr, output, quant_level)) + { + retval = FMT_LUMINANCE_ALPHA_DELTA; + break; + } + } + quantize_luminance_alpha(color0_ldr, color1_ldr, output, quant_level); + retval = FMT_LUMINANCE_ALPHA; + break; + + case FMT_HDR_RGB_LDR_ALPHA: + quantize_hdr_rgb_ldr_alpha(color0, color1, output, quant_level); + retval = FMT_HDR_RGB_LDR_ALPHA; + break; + + case FMT_HDR_RGBA: + quantize_hdr_rgb_alpha(color0, color1, output, quant_level); + retval = FMT_HDR_RGBA; + break; + } + + return retval; +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_color_unquantize.cpp b/ktx/external/astc-encoder/Source/astcenc_color_unquantize.cpp new file mode 100644 index 0000000..11eda72 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_color_unquantize.cpp @@ -0,0 +1,941 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2023 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. +// ---------------------------------------------------------------------------- + +#include + +/** + * @brief Functions for color unquantization. + */ + +#include "astcenc_internal.h" + +/** + * @brief Un-blue-contract a color. + * + * This function reverses any applied blue contraction. + * + * @param input The input color that has been blue-contracted. + * + * @return The uncontracted color. + */ +static ASTCENC_SIMD_INLINE vint4 uncontract_color( + vint4 input +) { + vmask4 mask(true, true, false, false); + vint4 bc0 = asr<1>(input + input.lane<2>()); + return select(input, bc0, mask); +} + +void rgba_delta_unpack( + vint4 input0, + vint4 input1, + vint4& output0, + vint4& output1 +) { + // Apply bit transfer + bit_transfer_signed(input1, input0); + + // Apply blue-uncontraction if needed + int rgb_sum = hadd_rgb_s(input1); + input1 = input1 + input0; + if (rgb_sum < 0) + { + input0 = uncontract_color(input0); + input1 = uncontract_color(input1); + std::swap(input0, input1); + } + + output0 = clamp(0, 255, input0); + output1 = clamp(0, 255, input1); +} + +/** + * @brief Unpack an LDR RGB color that uses delta encoding. + * + * Output alpha set to 255. + * + * @param input0 The packed endpoint 0 color. + * @param input1 The packed endpoint 1 color deltas. + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void rgb_delta_unpack( + vint4 input0, + vint4 input1, + vint4& output0, + vint4& output1 +) { + rgba_delta_unpack(input0, input1, output0, output1); + output0.set_lane<3>(255); + output1.set_lane<3>(255); +} + +void rgba_unpack( + vint4 input0, + vint4 input1, + vint4& output0, + vint4& output1 +) { + // Apply blue-uncontraction if needed + if (hadd_rgb_s(input0) > hadd_rgb_s(input1)) + { + input0 = uncontract_color(input0); + input1 = uncontract_color(input1); + std::swap(input0, input1); + } + + output0 = input0; + output1 = input1; +} + +/** + * @brief Unpack an LDR RGB color that uses direct encoding. + * + * Output alpha set to 255. + * + * @param input0 The packed endpoint 0 color. + * @param input1 The packed endpoint 1 color. + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void rgb_unpack( + vint4 input0, + vint4 input1, + vint4& output0, + vint4& output1 +) { + rgba_unpack(input0, input1, output0, output1); + output0.set_lane<3>(255); + output1.set_lane<3>(255); +} + +/** + * @brief Unpack an LDR RGBA color that uses scaled encoding. + * + * Note only the RGB channels use the scaled encoding, alpha uses direct. + * + * @param input0 The packed endpoint 0 color. + * @param alpha1 The packed endpoint 1 alpha value. + * @param scale The packed quantized scale. + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void rgb_scale_alpha_unpack( + vint4 input0, + uint8_t alpha1, + uint8_t scale, + vint4& output0, + vint4& output1 +) { + output1 = input0; + output1.set_lane<3>(alpha1); + + output0 = asr<8>(input0 * scale); + output0.set_lane<3>(input0.lane<3>()); +} + +/** + * @brief Unpack an LDR RGB color that uses scaled encoding. + * + * Output alpha is 255. + * + * @param input0 The packed endpoint 0 color. + * @param scale The packed scale. + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void rgb_scale_unpack( + vint4 input0, + int scale, + vint4& output0, + vint4& output1 +) { + output1 = input0; + output1.set_lane<3>(255); + + output0 = asr<8>(input0 * scale); + output0.set_lane<3>(255); +} + +/** + * @brief Unpack an LDR L color that uses direct encoding. + * + * Output alpha is 255. + * + * @param input The packed endpoints. + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void luminance_unpack( + const uint8_t input[2], + vint4& output0, + vint4& output1 +) { + int lum0 = input[0]; + int lum1 = input[1]; + output0 = vint4(lum0, lum0, lum0, 255); + output1 = vint4(lum1, lum1, lum1, 255); +} + +/** + * @brief Unpack an LDR L color that uses delta encoding. + * + * Output alpha is 255. + * + * @param input The packed endpoints (L0, L1). + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void luminance_delta_unpack( + const uint8_t input[2], + vint4& output0, + vint4& output1 +) { + int v0 = input[0]; + int v1 = input[1]; + int l0 = (v0 >> 2) | (v1 & 0xC0); + int l1 = l0 + (v1 & 0x3F); + + l1 = astc::min(l1, 255); + + output0 = vint4(l0, l0, l0, 255); + output1 = vint4(l1, l1, l1, 255); +} + +/** + * @brief Unpack an LDR LA color that uses direct encoding. + * + * @param input The packed endpoints (L0, L1, A0, A1). + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void luminance_alpha_unpack( + const uint8_t input[4], + vint4& output0, + vint4& output1 +) { + int lum0 = input[0]; + int lum1 = input[1]; + int alpha0 = input[2]; + int alpha1 = input[3]; + output0 = vint4(lum0, lum0, lum0, alpha0); + output1 = vint4(lum1, lum1, lum1, alpha1); +} + +/** + * @brief Unpack an LDR LA color that uses delta encoding. + * + * @param input The packed endpoints (L0, L1, A0, A1). + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void luminance_alpha_delta_unpack( + const uint8_t input[4], + vint4& output0, + vint4& output1 +) { + int lum0 = input[0]; + int lum1 = input[1]; + int alpha0 = input[2]; + int alpha1 = input[3]; + + lum0 |= (lum1 & 0x80) << 1; + alpha0 |= (alpha1 & 0x80) << 1; + lum1 &= 0x7F; + alpha1 &= 0x7F; + + if (lum1 & 0x40) + { + lum1 -= 0x80; + } + + if (alpha1 & 0x40) + { + alpha1 -= 0x80; + } + + lum0 >>= 1; + lum1 >>= 1; + alpha0 >>= 1; + alpha1 >>= 1; + lum1 += lum0; + alpha1 += alpha0; + + lum1 = astc::clamp(lum1, 0, 255); + alpha1 = astc::clamp(alpha1, 0, 255); + + output0 = vint4(lum0, lum0, lum0, alpha0); + output1 = vint4(lum1, lum1, lum1, alpha1); +} + +/** + * @brief Unpack an HDR RGB + offset encoding. + * + * @param input The packed endpoints (packed and modal). + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void hdr_rgbo_unpack( + const uint8_t input[4], + vint4& output0, + vint4& output1 +) { + int v0 = input[0]; + int v1 = input[1]; + int v2 = input[2]; + int v3 = input[3]; + + int modeval = ((v0 & 0xC0) >> 6) | (((v1 & 0x80) >> 7) << 2) | (((v2 & 0x80) >> 7) << 3); + + int majcomp; + int mode; + if ((modeval & 0xC) != 0xC) + { + majcomp = modeval >> 2; + mode = modeval & 3; + } + else if (modeval != 0xF) + { + majcomp = modeval & 3; + mode = 4; + } + else + { + majcomp = 0; + mode = 5; + } + + int red = v0 & 0x3F; + int green = v1 & 0x1F; + int blue = v2 & 0x1F; + int scale = v3 & 0x1F; + + int bit0 = (v1 >> 6) & 1; + int bit1 = (v1 >> 5) & 1; + int bit2 = (v2 >> 6) & 1; + int bit3 = (v2 >> 5) & 1; + int bit4 = (v3 >> 7) & 1; + int bit5 = (v3 >> 6) & 1; + int bit6 = (v3 >> 5) & 1; + + int ohcomp = 1 << mode; + + if (ohcomp & 0x30) + green |= bit0 << 6; + if (ohcomp & 0x3A) + green |= bit1 << 5; + if (ohcomp & 0x30) + blue |= bit2 << 6; + if (ohcomp & 0x3A) + blue |= bit3 << 5; + + if (ohcomp & 0x3D) + scale |= bit6 << 5; + if (ohcomp & 0x2D) + scale |= bit5 << 6; + if (ohcomp & 0x04) + scale |= bit4 << 7; + + if (ohcomp & 0x3B) + red |= bit4 << 6; + if (ohcomp & 0x04) + red |= bit3 << 6; + + if (ohcomp & 0x10) + red |= bit5 << 7; + if (ohcomp & 0x0F) + red |= bit2 << 7; + + if (ohcomp & 0x05) + red |= bit1 << 8; + if (ohcomp & 0x0A) + red |= bit0 << 8; + + if (ohcomp & 0x05) + red |= bit0 << 9; + if (ohcomp & 0x02) + red |= bit6 << 9; + + if (ohcomp & 0x01) + red |= bit3 << 10; + if (ohcomp & 0x02) + red |= bit5 << 10; + + // expand to 12 bits. + static const int shamts[6] { 1, 1, 2, 3, 4, 5 }; + int shamt = shamts[mode]; + red <<= shamt; + green <<= shamt; + blue <<= shamt; + scale <<= shamt; + + // on modes 0 to 4, the values stored for "green" and "blue" are differentials, + // not absolute values. + if (mode != 5) + { + green = red - green; + blue = red - blue; + } + + // switch around components. + int temp; + switch (majcomp) + { + case 1: + temp = red; + red = green; + green = temp; + break; + case 2: + temp = red; + red = blue; + blue = temp; + break; + default: + break; + } + + int red0 = red - scale; + int green0 = green - scale; + int blue0 = blue - scale; + + // clamp to [0,0xFFF]. + if (red < 0) + red = 0; + if (green < 0) + green = 0; + if (blue < 0) + blue = 0; + + if (red0 < 0) + red0 = 0; + if (green0 < 0) + green0 = 0; + if (blue0 < 0) + blue0 = 0; + + output0 = vint4(red0 << 4, green0 << 4, blue0 << 4, 0x7800); + output1 = vint4(red << 4, green << 4, blue << 4, 0x7800); +} + +/** + * @brief Unpack an HDR RGB direct encoding. + * + * @param input The packed endpoints (packed and modal). + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void hdr_rgb_unpack( + const uint8_t input[6], + vint4& output0, + vint4& output1 +) { + + int v0 = input[0]; + int v1 = input[1]; + int v2 = input[2]; + int v3 = input[3]; + int v4 = input[4]; + int v5 = input[5]; + + // extract all the fixed-placement bitfields + int modeval = ((v1 & 0x80) >> 7) | (((v2 & 0x80) >> 7) << 1) | (((v3 & 0x80) >> 7) << 2); + + int majcomp = ((v4 & 0x80) >> 7) | (((v5 & 0x80) >> 7) << 1); + + if (majcomp == 3) + { + output0 = vint4(v0 << 8, v2 << 8, (v4 & 0x7F) << 9, 0x7800); + output1 = vint4(v1 << 8, v3 << 8, (v5 & 0x7F) << 9, 0x7800); + return; + } + + int a = v0 | ((v1 & 0x40) << 2); + int b0 = v2 & 0x3f; + int b1 = v3 & 0x3f; + int c = v1 & 0x3f; + int d0 = v4 & 0x7f; + int d1 = v5 & 0x7f; + + // get hold of the number of bits in 'd0' and 'd1' + static const int dbits_tab[8] { 7, 6, 7, 6, 5, 6, 5, 6 }; + int dbits = dbits_tab[modeval]; + + // extract six variable-placement bits + int bit0 = (v2 >> 6) & 1; + int bit1 = (v3 >> 6) & 1; + int bit2 = (v4 >> 6) & 1; + int bit3 = (v5 >> 6) & 1; + int bit4 = (v4 >> 5) & 1; + int bit5 = (v5 >> 5) & 1; + + // and prepend the variable-placement bits depending on mode. + int ohmod = 1 << modeval; // one-hot-mode + if (ohmod & 0xA4) + a |= bit0 << 9; + if (ohmod & 0x8) + a |= bit2 << 9; + if (ohmod & 0x50) + a |= bit4 << 9; + + if (ohmod & 0x50) + a |= bit5 << 10; + if (ohmod & 0xA0) + a |= bit1 << 10; + + if (ohmod & 0xC0) + a |= bit2 << 11; + + if (ohmod & 0x4) + c |= bit1 << 6; + if (ohmod & 0xE8) + c |= bit3 << 6; + + if (ohmod & 0x20) + c |= bit2 << 7; + + if (ohmod & 0x5B) + { + b0 |= bit0 << 6; + b1 |= bit1 << 6; + } + + if (ohmod & 0x12) + { + b0 |= bit2 << 7; + b1 |= bit3 << 7; + } + + if (ohmod & 0xAF) + { + d0 |= bit4 << 5; + d1 |= bit5 << 5; + } + + if (ohmod & 0x5) + { + d0 |= bit2 << 6; + d1 |= bit3 << 6; + } + + // sign-extend 'd0' and 'd1' + // note: this code assumes that signed right-shift actually sign-fills, not zero-fills. + int32_t d0x = d0; + int32_t d1x = d1; + int sx_shamt = 32 - dbits; + d0x <<= sx_shamt; + d0x >>= sx_shamt; + d1x <<= sx_shamt; + d1x >>= sx_shamt; + d0 = d0x; + d1 = d1x; + + // expand all values to 12 bits, with left-shift as needed. + int val_shamt = (modeval >> 1) ^ 3; + a <<= val_shamt; + b0 <<= val_shamt; + b1 <<= val_shamt; + c <<= val_shamt; + d0 <<= val_shamt; + d1 <<= val_shamt; + + // then compute the actual color values. + int red1 = a; + int green1 = a - b0; + int blue1 = a - b1; + int red0 = a - c; + int green0 = a - b0 - c - d0; + int blue0 = a - b1 - c - d1; + + // clamp the color components to [0,2^12 - 1] + red0 = astc::clamp(red0, 0, 4095); + green0 = astc::clamp(green0, 0, 4095); + blue0 = astc::clamp(blue0, 0, 4095); + + red1 = astc::clamp(red1, 0, 4095); + green1 = astc::clamp(green1, 0, 4095); + blue1 = astc::clamp(blue1, 0, 4095); + + // switch around the color components + int temp0, temp1; + switch (majcomp) + { + case 1: // switch around red and green + temp0 = red0; + temp1 = red1; + red0 = green0; + red1 = green1; + green0 = temp0; + green1 = temp1; + break; + case 2: // switch around red and blue + temp0 = red0; + temp1 = red1; + red0 = blue0; + red1 = blue1; + blue0 = temp0; + blue1 = temp1; + break; + case 0: // no switch + break; + } + + output0 = vint4(red0 << 4, green0 << 4, blue0 << 4, 0x7800); + output1 = vint4(red1 << 4, green1 << 4, blue1 << 4, 0x7800); +} + +/** + * @brief Unpack an HDR RGB + LDR A direct encoding. + * + * @param input The packed endpoints (packed and modal). + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void hdr_rgb_ldr_alpha_unpack( + const uint8_t input[8], + vint4& output0, + vint4& output1 +) { + hdr_rgb_unpack(input, output0, output1); + + int v6 = input[6]; + int v7 = input[7]; + output0.set_lane<3>(v6); + output1.set_lane<3>(v7); +} + +/** + * @brief Unpack an HDR L (small range) direct encoding. + * + * @param input The packed endpoints (packed and modal). + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void hdr_luminance_small_range_unpack( + const uint8_t input[2], + vint4& output0, + vint4& output1 +) { + int v0 = input[0]; + int v1 = input[1]; + + int y0, y1; + if (v0 & 0x80) + { + y0 = ((v1 & 0xE0) << 4) | ((v0 & 0x7F) << 2); + y1 = (v1 & 0x1F) << 2; + } + else + { + y0 = ((v1 & 0xF0) << 4) | ((v0 & 0x7F) << 1); + y1 = (v1 & 0xF) << 1; + } + + y1 += y0; + if (y1 > 0xFFF) + { + y1 = 0xFFF; + } + + output0 = vint4(y0 << 4, y0 << 4, y0 << 4, 0x7800); + output1 = vint4(y1 << 4, y1 << 4, y1 << 4, 0x7800); +} + +/** + * @brief Unpack an HDR L (large range) direct encoding. + * + * @param input The packed endpoints (packed and modal). + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void hdr_luminance_large_range_unpack( + const uint8_t input[2], + vint4& output0, + vint4& output1 +) { + int v0 = input[0]; + int v1 = input[1]; + + int y0, y1; + if (v1 >= v0) + { + y0 = v0 << 4; + y1 = v1 << 4; + } + else + { + y0 = (v1 << 4) + 8; + y1 = (v0 << 4) - 8; + } + + output0 = vint4(y0 << 4, y0 << 4, y0 << 4, 0x7800); + output1 = vint4(y1 << 4, y1 << 4, y1 << 4, 0x7800); +} + +/** + * @brief Unpack an HDR A direct encoding. + * + * @param input The packed endpoints (packed and modal). + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void hdr_alpha_unpack( + const uint8_t input[2], + int& output0, + int& output1 +) { + + int v6 = input[0]; + int v7 = input[1]; + + int selector = ((v6 >> 7) & 1) | ((v7 >> 6) & 2); + v6 &= 0x7F; + v7 &= 0x7F; + if (selector == 3) + { + output0 = v6 << 5; + output1 = v7 << 5; + } + else + { + v6 |= (v7 << (selector + 1)) & 0x780; + v7 &= (0x3f >> selector); + v7 ^= 32 >> selector; + v7 -= 32 >> selector; + v6 <<= (4 - selector); + v7 <<= (4 - selector); + v7 += v6; + + if (v7 < 0) + { + v7 = 0; + } + else if (v7 > 0xFFF) + { + v7 = 0xFFF; + } + + output0 = v6; + output1 = v7; + } + + output0 <<= 4; + output1 <<= 4; +} + +/** + * @brief Unpack an HDR RGBA direct encoding. + * + * @param input The packed endpoints (packed and modal). + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +static void hdr_rgb_hdr_alpha_unpack( + const uint8_t input[8], + vint4& output0, + vint4& output1 +) { + hdr_rgb_unpack(input, output0, output1); + + int alpha0, alpha1; + hdr_alpha_unpack(input + 6, alpha0, alpha1); + + output0.set_lane<3>(alpha0); + output1.set_lane<3>(alpha1); +} + +/* See header for documentation. */ +void unpack_color_endpoints( + astcenc_profile decode_mode, + int format, + const uint8_t* input, + bool& rgb_hdr, + bool& alpha_hdr, + vint4& output0, + vint4& output1 +) { + // Assume no NaNs and LDR endpoints unless set later + rgb_hdr = false; + alpha_hdr = false; + + bool alpha_hdr_default = false; + + switch (format) + { + case FMT_LUMINANCE: + luminance_unpack(input, output0, output1); + break; + + case FMT_LUMINANCE_DELTA: + luminance_delta_unpack(input, output0, output1); + break; + + case FMT_HDR_LUMINANCE_SMALL_RANGE: + rgb_hdr = true; + alpha_hdr_default = true; + hdr_luminance_small_range_unpack(input, output0, output1); + break; + + case FMT_HDR_LUMINANCE_LARGE_RANGE: + rgb_hdr = true; + alpha_hdr_default = true; + hdr_luminance_large_range_unpack(input, output0, output1); + break; + + case FMT_LUMINANCE_ALPHA: + luminance_alpha_unpack(input, output0, output1); + break; + + case FMT_LUMINANCE_ALPHA_DELTA: + luminance_alpha_delta_unpack(input, output0, output1); + break; + + case FMT_RGB_SCALE: + { + vint4 input0q(input[0], input[1], input[2], 0); + uint8_t scale = input[3]; + rgb_scale_unpack(input0q, scale, output0, output1); + } + break; + + case FMT_RGB_SCALE_ALPHA: + { + vint4 input0q(input[0], input[1], input[2], input[4]); + uint8_t alpha1q = input[5]; + uint8_t scaleq = input[3]; + rgb_scale_alpha_unpack(input0q, alpha1q, scaleq, output0, output1); + } + break; + + case FMT_HDR_RGB_SCALE: + rgb_hdr = true; + alpha_hdr_default = true; + hdr_rgbo_unpack(input, output0, output1); + break; + + case FMT_RGB: + { + vint4 input0q(input[0], input[2], input[4], 0); + vint4 input1q(input[1], input[3], input[5], 0); + rgb_unpack(input0q, input1q, output0, output1); + } + break; + + case FMT_RGB_DELTA: + { + vint4 input0q(input[0], input[2], input[4], 0); + vint4 input1q(input[1], input[3], input[5], 0); + rgb_delta_unpack(input0q, input1q, output0, output1); + } + break; + + case FMT_HDR_RGB: + rgb_hdr = true; + alpha_hdr_default = true; + hdr_rgb_unpack(input, output0, output1); + break; + + case FMT_RGBA: + { + vint4 input0q(input[0], input[2], input[4], input[6]); + vint4 input1q(input[1], input[3], input[5], input[7]); + rgba_unpack(input0q, input1q, output0, output1); + } + break; + + case FMT_RGBA_DELTA: + { + vint4 input0q(input[0], input[2], input[4], input[6]); + vint4 input1q(input[1], input[3], input[5], input[7]); + rgba_delta_unpack(input0q, input1q, output0, output1); + } + break; + + case FMT_HDR_RGB_LDR_ALPHA: + rgb_hdr = true; + hdr_rgb_ldr_alpha_unpack(input, output0, output1); + break; + + case FMT_HDR_RGBA: + rgb_hdr = true; + alpha_hdr = true; + hdr_rgb_hdr_alpha_unpack(input, output0, output1); + break; + } + + // Assign a correct default alpha + if (alpha_hdr_default) + { + if (decode_mode == ASTCENC_PRF_HDR) + { + output0.set_lane<3>(0x7800); + output1.set_lane<3>(0x7800); + alpha_hdr = true; + } + else + { + output0.set_lane<3>(0x00FF); + output1.set_lane<3>(0x00FF); + alpha_hdr = false; + } + } + + // Handle endpoint errors and expansion + + // Linear LDR 8-bit endpoints are expanded to 16-bit by replication + if (decode_mode == ASTCENC_PRF_LDR) + { + // Error color - HDR endpoint in an LDR encoding + if (rgb_hdr || alpha_hdr) + { + output0 = vint4(0xFF, 0x00, 0xFF, 0xFF); + output1 = vint4(0xFF, 0x00, 0xFF, 0xFF); + rgb_hdr = false; + alpha_hdr = false; + } + + output0 = output0 * 257; + output1 = output1 * 257; + } + // sRGB LDR 8-bit endpoints are expanded to 16 bit by: + // - RGB = shift left by 8 bits and OR with 0x80 + // - A = replication + else if (decode_mode == ASTCENC_PRF_LDR_SRGB) + { + // Error color - HDR endpoint in an LDR encoding + if (rgb_hdr || alpha_hdr) + { + output0 = vint4(0xFF, 0x00, 0xFF, 0xFF); + output1 = vint4(0xFF, 0x00, 0xFF, 0xFF); + rgb_hdr = false; + alpha_hdr = false; + } + + output0 = lsl<8>(output0) | vint4(0x80); + output1 = lsl<8>(output1) | vint4(0x80); + } + // An HDR profile decode, but may be using linear LDR endpoints + // Linear LDR 8-bit endpoints are expanded to 16-bit by replication + // HDR endpoints are already 16-bit + else + { + vmask4 hdr_lanes(rgb_hdr, rgb_hdr, rgb_hdr, alpha_hdr); + vint4 output_scale = select(vint4(257), vint4(1), hdr_lanes); + output0 = output0 * output_scale; + output1 = output1 * output_scale; + } +} diff --git a/ktx/external/astc-encoder/Source/astcenc_compress_symbolic.cpp b/ktx/external/astc-encoder/Source/astcenc_compress_symbolic.cpp new file mode 100644 index 0000000..789eac1 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_compress_symbolic.cpp @@ -0,0 +1,1456 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2025 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 + +/** + * @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 +) { + unsigned int partition_count = ep_plane1.partition_count; + assert(partition_count == 1); + + vmask4 sep_mask = vint4::lane_id() == vint4(component_plane2); + + result.partition_count = partition_count; + result.endpt0[0] = select(ep_plane1.endpt0[0], ep_plane2.endpt0[0], sep_mask); + result.endpt1[0] = select(ep_plane1.endpt1[0], ep_plane2.endpt1[0], sep_mask); +} + +/** + * @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 +) { + // Get the partition descriptor + unsigned int partition_count = scb.partition_count; + const auto& pi = bsd.get_partition_info(partition_count, scb.partition_index); + + // Get the quantization table + const block_mode& bm = bsd.get_block_mode(scb.block_mode); + unsigned int weight_quant_level = bm.quant_mode; + const quant_and_transfer_table& qat = quant_and_xfer_tables[weight_quant_level]; + + unsigned int max_plane = bm.is_dual_plane; + int plane2_component = scb.plane2_component; + vmask4 plane_mask = vint4::lane_id() == vint4(plane2_component); + + // Decode the color endpoints + bool rgb_hdr; + bool alpha_hdr; + vint4 endpnt0[BLOCK_MAX_PARTITIONS]; + vint4 endpnt1[BLOCK_MAX_PARTITIONS]; + vfloat4 endpnt0f[BLOCK_MAX_PARTITIONS]; + vfloat4 offset[BLOCK_MAX_PARTITIONS]; + + promise(partition_count > 0); + + for (unsigned int pa_idx = 0; pa_idx < partition_count; pa_idx++) + { + unpack_color_endpoints(decode_mode, + scb.color_formats[pa_idx], + scb.color_values[pa_idx], + rgb_hdr, alpha_hdr, + endpnt0[pa_idx], + endpnt1[pa_idx]); + } + + uint8_t* dec_weights_uquant = scb.weights; + bool adjustments = false; + + // For each plane and partition ... + for (unsigned int pl_idx = 0; pl_idx <= max_plane; pl_idx++) + { + for (unsigned int pa_idx = 0; pa_idx < partition_count; pa_idx++) + { + // Compute the endpoint delta for all components in current plane + vint4 epd = endpnt1[pa_idx] - endpnt0[pa_idx]; + epd = select(epd, vint4::zero(), plane_mask); + + endpnt0f[pa_idx] = int_to_float(endpnt0[pa_idx]); + offset[pa_idx] = int_to_float(epd) * (1.0f / 64.0f); + } + + // For each weight compute previous, current, and next errors + promise(bsd.texel_count > 0); + for (unsigned int texel = 0; texel < bsd.texel_count; texel++) + { + int uqw = dec_weights_uquant[texel]; + + uint32_t prev_and_next = qat.prev_next_values[uqw]; + int uqw_down = prev_and_next & 0xFF; + int uqw_up = (prev_and_next >> 8) & 0xFF; + + // Interpolate the colors to create the diffs + float weight_base = static_cast(uqw); + float weight_down = static_cast(uqw_down - uqw); + float weight_up = static_cast(uqw_up - uqw); + + unsigned int partition = pi.partition_of_texel[texel]; + vfloat4 color_offset = offset[partition]; + vfloat4 color_base = endpnt0f[partition]; + + vfloat4 color = color_base + color_offset * weight_base; + vfloat4 orig_color = blk.texel(texel); + vfloat4 error_weight = blk.channel_weight; + + vfloat4 color_diff = color - orig_color; + vfloat4 color_diff_down = color_diff + color_offset * weight_down; + vfloat4 color_diff_up = color_diff + color_offset * weight_up; + + float error_base = dot_s(color_diff * color_diff, error_weight); + float error_down = dot_s(color_diff_down * color_diff_down, error_weight); + float error_up = dot_s(color_diff_up * color_diff_up, error_weight); + + // Check if the prev or next error is better, and if so use it + if ((error_up < error_base) && (error_up < error_down) && (uqw < 64)) + { + dec_weights_uquant[texel] = static_cast(uqw_up); + adjustments = true; + } + else if ((error_down < error_base) && (uqw > 0)) + { + dec_weights_uquant[texel] = static_cast(uqw_down); + adjustments = true; + } + } + + // Prepare iteration for plane 2 + dec_weights_uquant += WEIGHTS_PLANE2_OFFSET; + plane_mask = ~plane_mask; + } + + return adjustments; +} + +/** + * @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 +) { + // Get the partition descriptor + unsigned int partition_count = scb.partition_count; + const auto& pi = bsd.get_partition_info(partition_count, scb.partition_index); + + // Get the quantization table + const block_mode& bm = bsd.get_block_mode(scb.block_mode); + unsigned int weight_quant_level = bm.quant_mode; + const quant_and_transfer_table& qat = quant_and_xfer_tables[weight_quant_level]; + + // Get the decimation table + const decimation_info& di = bsd.get_decimation_info(bm.decimation_mode); + unsigned int weight_count = di.weight_count; + assert(weight_count != bsd.texel_count); + + unsigned int max_plane = bm.is_dual_plane; + int plane2_component = scb.plane2_component; + vmask4 plane_mask = vint4::lane_id() == vint4(plane2_component); + + // Decode the color endpoints + bool rgb_hdr; + bool alpha_hdr; + vint4 endpnt0[BLOCK_MAX_PARTITIONS]; + vint4 endpnt1[BLOCK_MAX_PARTITIONS]; + vfloat4 endpnt0f[BLOCK_MAX_PARTITIONS]; + vfloat4 offset[BLOCK_MAX_PARTITIONS]; + + promise(partition_count > 0); + promise(weight_count > 0); + + for (unsigned int pa_idx = 0; pa_idx < partition_count; pa_idx++) + { + unpack_color_endpoints(decode_mode, + scb.color_formats[pa_idx], + scb.color_values[pa_idx], + rgb_hdr, alpha_hdr, + endpnt0[pa_idx], + endpnt1[pa_idx]); + } + + uint8_t* dec_weights_uquant = scb.weights; + bool adjustments = false; + + // For each plane and partition ... + for (unsigned int pl_idx = 0; pl_idx <= max_plane; pl_idx++) + { + for (unsigned int pa_idx = 0; pa_idx < partition_count; pa_idx++) + { + // Compute the endpoint delta for all components in current plane + vint4 epd = endpnt1[pa_idx] - endpnt0[pa_idx]; + epd = select(epd, vint4::zero(), plane_mask); + + endpnt0f[pa_idx] = int_to_float(endpnt0[pa_idx]); + offset[pa_idx] = int_to_float(epd) * (1.0f / 64.0f); + } + + // Create an unquantized weight grid for this decimation level + ASTCENC_ALIGNAS float uq_weightsf[BLOCK_MAX_WEIGHTS]; + for (unsigned int we_idx = 0; we_idx < weight_count; we_idx += ASTCENC_SIMD_WIDTH) + { + vint unquant_value(dec_weights_uquant + we_idx); + vfloat unquant_valuef = int_to_float(unquant_value); + storea(unquant_valuef, uq_weightsf + we_idx); + } + + // For each weight compute previous, current, and next errors + for (unsigned int we_idx = 0; we_idx < weight_count; we_idx++) + { + int uqw = dec_weights_uquant[we_idx]; + uint32_t prev_and_next = qat.prev_next_values[uqw]; + + float uqw_base = uq_weightsf[we_idx]; + float uqw_down = static_cast(prev_and_next & 0xFF); + float uqw_up = static_cast((prev_and_next >> 8) & 0xFF); + + float uqw_diff_down = uqw_down - uqw_base; + float uqw_diff_up = uqw_up - uqw_base; + + vfloat4 error_basev = vfloat4::zero(); + vfloat4 error_downv = vfloat4::zero(); + vfloat4 error_upv = vfloat4::zero(); + + // Interpolate the colors to create the diffs + unsigned int texels_to_evaluate = di.weight_texel_count[we_idx]; + promise(texels_to_evaluate > 0); + for (unsigned int te_idx = 0; te_idx < texels_to_evaluate; te_idx++) + { + unsigned int texel = di.weight_texels_tr[te_idx][we_idx]; + + float tw_base = di.texel_contrib_for_weight[te_idx][we_idx]; + + float weight_base = (uq_weightsf[di.texel_weights_tr[0][texel]] * di.texel_weight_contribs_float_tr[0][texel] + + uq_weightsf[di.texel_weights_tr[1][texel]] * di.texel_weight_contribs_float_tr[1][texel]) + + (uq_weightsf[di.texel_weights_tr[2][texel]] * di.texel_weight_contribs_float_tr[2][texel] + + uq_weightsf[di.texel_weights_tr[3][texel]] * di.texel_weight_contribs_float_tr[3][texel]); + + // Ideally this is integer rounded, but IQ gain it isn't worth the overhead + // float weight = astc::flt_rd(weight_base + 0.5f); + // float weight_down = astc::flt_rd(weight_base + 0.5f + uqw_diff_down * tw_base) - weight; + // float weight_up = astc::flt_rd(weight_base + 0.5f + uqw_diff_up * tw_base) - weight; + float weight_down = weight_base + uqw_diff_down * tw_base - weight_base; + float weight_up = weight_base + uqw_diff_up * tw_base - weight_base; + + unsigned int partition = pi.partition_of_texel[texel]; + vfloat4 color_offset = offset[partition]; + vfloat4 color_base = endpnt0f[partition]; + + vfloat4 color = color_base + color_offset * weight_base; + vfloat4 orig_color = blk.texel(texel); + + vfloat4 color_diff = color - orig_color; + vfloat4 color_down_diff = color_diff + color_offset * weight_down; + vfloat4 color_up_diff = color_diff + color_offset * weight_up; + + error_basev += color_diff * color_diff; + error_downv += color_down_diff * color_down_diff; + error_upv += color_up_diff * color_up_diff; + } + + vfloat4 error_weight = blk.channel_weight; + float error_base = hadd_s(error_basev * error_weight); + float error_down = hadd_s(error_downv * error_weight); + float error_up = hadd_s(error_upv * error_weight); + + // Check if the prev or next error is better, and if so use it + if ((error_up < error_base) && (error_up < error_down) && (uqw < 64)) + { + uq_weightsf[we_idx] = uqw_up; + dec_weights_uquant[we_idx] = static_cast(uqw_up); + adjustments = true; + } + else if ((error_down < error_base) && (uqw > 0)) + { + uq_weightsf[we_idx] = uqw_down; + dec_weights_uquant[we_idx] = static_cast(uqw_down); + adjustments = true; + } + } + + // Prepare iteration for plane 2 + dec_weights_uquant += WEIGHTS_PLANE2_OFFSET; + plane_mask = ~plane_mask; + } + + return adjustments; +} + +/** + * @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 +) { + promise(partition_count > 0); + promise(config.tune_candidate_limit > 0); + promise(config.tune_refinement_limit > 0); + + int max_weight_quant = astc::min(static_cast(QUANT_32), quant_limit); + + auto compute_difference = &compute_symbolic_block_difference_1plane; + if ((partition_count == 1) && !(config.flags & ASTCENC_FLG_MAP_RGBM)) + { + compute_difference = &compute_symbolic_block_difference_1plane_1partition; + } + + const auto& pi = bsd.get_partition_info(partition_count, partition_index); + + // Compute ideal weights and endpoint colors, with no quantization or decimation + endpoints_and_weights& ei = tmpbuf.ei1; + compute_ideal_colors_and_weights_1plane(blk, pi, ei); + + // Compute ideal weights and endpoint colors for every decimation + float* dec_weights_ideal = tmpbuf.dec_weights_ideal; + uint8_t* dec_weights_uquant = tmpbuf.dec_weights_uquant; + + // For each decimation mode, compute an ideal set of weights with no quantization + unsigned int max_decimation_modes = only_always ? bsd.decimation_mode_count_always + : bsd.decimation_mode_count_selected; + promise(max_decimation_modes > 0); + for (unsigned int i = 0; i < max_decimation_modes; i++) + { + const auto& dm = bsd.get_decimation_mode(i); + if (!dm.is_ref_1plane(static_cast(max_weight_quant))) + { + continue; + } + + const auto& di = bsd.get_decimation_info(i); + + compute_ideal_weights_for_decimation( + ei, + di, + dec_weights_ideal + i * BLOCK_MAX_WEIGHTS); + } + + // Compute maximum colors for the endpoints and ideal weights, then for each endpoint and ideal + // weight pair, compute the smallest weight that will result in a color value greater than 1 + vfloat4 min_ep(10.0f); + for (unsigned int i = 0; i < partition_count; i++) + { + vfloat4 ep = (vfloat4(1.0f) - ei.ep.endpt0[i]) / (ei.ep.endpt1[i] - ei.ep.endpt0[i]); + + vmask4 use_ep = (ep > vfloat4(0.5f)) & (ep < min_ep); + min_ep = select(min_ep, ep, use_ep); + } + + float min_wt_cutoff = hmin_s(min_ep); + + // For each mode, use the angular method to compute a shift + compute_angular_endpoints_1plane( + only_always, bsd, dec_weights_ideal, max_weight_quant, tmpbuf); + + float* weight_low_value = tmpbuf.weight_low_value1; + float* weight_high_value = tmpbuf.weight_high_value1; + int8_t* qwt_bitcounts = tmpbuf.qwt_bitcounts; + float* qwt_errors = tmpbuf.qwt_errors; + + // For each mode (which specifies a decimation and a quantization): + // * Compute number of bits needed for the quantized weights + // * Generate an optimized set of quantized weights + // * Compute quantization errors for the mode + + + static const int8_t free_bits_for_partition_count[4] { + 115 - 4, 111 - 4 - PARTITION_INDEX_BITS, 108 - 4 - PARTITION_INDEX_BITS, 105 - 4 - PARTITION_INDEX_BITS + }; + + unsigned int max_block_modes = only_always ? bsd.block_mode_count_1plane_always + : bsd.block_mode_count_1plane_selected; + promise(max_block_modes > 0); + for (unsigned int i = 0; i < max_block_modes; i++) + { + const block_mode& bm = bsd.block_modes[i]; + + if (bm.quant_mode > max_weight_quant) + { + qwt_errors[i] = 1e38f; + continue; + } + + assert(!bm.is_dual_plane); + int bitcount = free_bits_for_partition_count[partition_count - 1] - bm.weight_bits; + if (bitcount <= 0) + { + qwt_errors[i] = 1e38f; + continue; + } + + if (weight_high_value[i] > 1.02f * min_wt_cutoff) + { + weight_high_value[i] = 1.0f; + } + + int decimation_mode = bm.decimation_mode; + const auto& di = bsd.get_decimation_info(decimation_mode); + + qwt_bitcounts[i] = static_cast(bitcount); + + ASTCENC_ALIGNAS float dec_weights_uquantf[BLOCK_MAX_WEIGHTS]; + + // Generate the optimized set of weights for the weight mode + compute_quantized_weights_for_decimation( + di, + weight_low_value[i], weight_high_value[i], + dec_weights_ideal + BLOCK_MAX_WEIGHTS * decimation_mode, + dec_weights_uquantf, + dec_weights_uquant + BLOCK_MAX_WEIGHTS * i, + bm.get_weight_quant_mode()); + + // Compute weight quantization errors for the block mode + qwt_errors[i] = compute_error_of_weight_set_1plane( + ei, + di, + dec_weights_uquantf); + } + + // Decide the optimal combination of color endpoint encodings and weight encodings + uint8_t partition_format_specifiers[TUNE_MAX_TRIAL_CANDIDATES][BLOCK_MAX_PARTITIONS]; + int block_mode_index[TUNE_MAX_TRIAL_CANDIDATES]; + + quant_method color_quant_level[TUNE_MAX_TRIAL_CANDIDATES]; + quant_method color_quant_level_mod[TUNE_MAX_TRIAL_CANDIDATES]; + + unsigned int candidate_count = compute_ideal_endpoint_formats( + pi, blk, ei.ep, qwt_bitcounts, qwt_errors, + config.tune_candidate_limit, 0, max_block_modes, + partition_format_specifiers, block_mode_index, + color_quant_level, color_quant_level_mod, tmpbuf); + + // Iterate over the N believed-to-be-best modes to find out which one is actually best + float best_errorval_in_mode = ERROR_CALC_DEFAULT; + float best_errorval_in_scb = scb.errorval; + + for (unsigned int i = 0; i < candidate_count; i++) + { + TRACE_NODE(node0, "candidate"); + + const int bm_packed_index = block_mode_index[i]; + assert(bm_packed_index >= 0 && bm_packed_index < static_cast(bsd.block_mode_count_1plane_selected)); + const block_mode& qw_bm = bsd.block_modes[bm_packed_index]; + + int decimation_mode = qw_bm.decimation_mode; + const auto& di = bsd.get_decimation_info(decimation_mode); + promise(di.weight_count > 0); + + trace_add_data("weight_x", di.weight_x); + trace_add_data("weight_y", di.weight_y); + trace_add_data("weight_z", di.weight_z); + trace_add_data("weight_quant", qw_bm.quant_mode); + + // Recompute the ideal color endpoints before storing them + vfloat4 rgbs_colors[BLOCK_MAX_PARTITIONS]; + vfloat4 rgbo_colors[BLOCK_MAX_PARTITIONS]; + + symbolic_compressed_block workscb; + endpoints workep = ei.ep; + + uint8_t* u8_weight_src = dec_weights_uquant + BLOCK_MAX_WEIGHTS * bm_packed_index; + + for (unsigned int j = 0; j < di.weight_count; j++) + { + workscb.weights[j] = u8_weight_src[j]; + } + + for (unsigned int l = 0; l < config.tune_refinement_limit; l++) + { + recompute_ideal_colors_1plane( + blk, pi, di, workscb.weights, + workep, rgbs_colors, rgbo_colors); + + // Quantize the chosen color, tracking if worth trying the mod value + bool all_same = color_quant_level[i] != color_quant_level_mod[i]; + for (unsigned int j = 0; j < partition_count; j++) + { + workscb.color_formats[j] = pack_color_endpoints( + workep.endpt0[j], + workep.endpt1[j], + rgbs_colors[j], + rgbo_colors[j], + partition_format_specifiers[i][j], + workscb.color_values[j], + color_quant_level[i]); + + all_same = all_same && workscb.color_formats[j] == workscb.color_formats[0]; + } + + // If all the color endpoint modes are the same, we get a few more bits to store colors; + // let's see if we can take advantage of this: requantize all the colors and see if the + // endpoint modes remain the same. + workscb.color_formats_matched = 0; + if (partition_count >= 2 && all_same) + { + uint8_t colorvals[BLOCK_MAX_PARTITIONS][8]; + uint8_t color_formats_mod[BLOCK_MAX_PARTITIONS] { 0 }; + bool all_same_mod = true; + for (unsigned int j = 0; j < partition_count; j++) + { + color_formats_mod[j] = pack_color_endpoints( + workep.endpt0[j], + workep.endpt1[j], + rgbs_colors[j], + rgbo_colors[j], + partition_format_specifiers[i][j], + colorvals[j], + color_quant_level_mod[i]); + + // Early out as soon as it's no longer possible to use mod + if (color_formats_mod[j] != color_formats_mod[0]) + { + all_same_mod = false; + break; + } + } + + if (all_same_mod) + { + workscb.color_formats_matched = 1; + for (unsigned int j = 0; j < BLOCK_MAX_PARTITIONS; j++) + { + for (unsigned int k = 0; k < 8; k++) + { + workscb.color_values[j][k] = colorvals[j][k]; + } + + workscb.color_formats[j] = color_formats_mod[j]; + } + } + } + + // Store header fields + workscb.partition_count = static_cast(partition_count); + workscb.partition_index = static_cast(partition_index); + workscb.plane2_component = -1; + workscb.quant_mode = workscb.color_formats_matched ? color_quant_level_mod[i] : color_quant_level[i]; + workscb.block_mode = qw_bm.mode_index; + workscb.block_type = SYM_BTYPE_NONCONST; + + // Pre-realign test + if (l == 0) + { + float errorval = compute_difference(config, bsd, workscb, blk); + if (errorval == -ERROR_CALC_DEFAULT) + { + errorval = -errorval; + workscb.block_type = SYM_BTYPE_ERROR; + } + + trace_add_data("error_prerealign", errorval); + best_errorval_in_mode = astc::min(errorval, best_errorval_in_mode); + + // Average refinement improvement is 3.5% per iteration (allow 4.5%), but the first + // iteration can help more so we give it a extra 8% leeway. Use this knowledge to + // drive a heuristic to skip blocks that are unlikely to catch up with the best + // block we have already. + unsigned int iters_remaining = config.tune_refinement_limit - l; + float threshold = (0.045f * static_cast(iters_remaining)) + 1.08f; + if (errorval > (threshold * best_errorval_in_scb)) + { + break; + } + + if (errorval < best_errorval_in_scb) + { + best_errorval_in_scb = errorval; + workscb.errorval = errorval; + scb = workscb; + + if (errorval < tune_errorval_threshold) + { + // Skip remaining candidates - this is "good enough" + i = candidate_count; + break; + } + } + } + + bool adjustments; + if (di.weight_count != bsd.texel_count) + { + adjustments = realign_weights_decimated( + config.profile, bsd, blk, workscb); + } + else + { + adjustments = realign_weights_undecimated( + config.profile, bsd, blk, workscb); + } + + // Post-realign test + float errorval = compute_difference(config, bsd, workscb, blk); + if (errorval == -ERROR_CALC_DEFAULT) + { + errorval = -errorval; + workscb.block_type = SYM_BTYPE_ERROR; + } + + trace_add_data("error_postrealign", errorval); + best_errorval_in_mode = astc::min(errorval, best_errorval_in_mode); + + // Average refinement improvement is 3.5% per iteration, so skip blocks that are + // unlikely to catch up with the best block we have already. Assume a 4.5% per step to + // give benefit of the doubt ... + unsigned int iters_remaining = config.tune_refinement_limit - 1 - l; + float threshold = (0.045f * static_cast(iters_remaining)) + 1.0f; + if (errorval > (threshold * best_errorval_in_scb)) + { + break; + } + + if (errorval < best_errorval_in_scb) + { + best_errorval_in_scb = errorval; + workscb.errorval = errorval; + scb = workscb; + + if (errorval < tune_errorval_threshold) + { + // Skip remaining candidates - this is "good enough" + i = candidate_count; + break; + } + } + + if (!adjustments) + { + break; + } + } + } + + return best_errorval_in_mode; +} + +/** + * @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 +) { + promise(config.tune_candidate_limit > 0); + promise(config.tune_refinement_limit > 0); + promise(bsd.decimation_mode_count_selected > 0); + + int max_weight_quant = astc::min(static_cast(QUANT_32), quant_limit); + + // Compute ideal weights and endpoint colors, with no quantization or decimation + endpoints_and_weights& ei1 = tmpbuf.ei1; + endpoints_and_weights& ei2 = tmpbuf.ei2; + + compute_ideal_colors_and_weights_2planes(bsd, blk, plane2_component, ei1, ei2); + + // Compute ideal weights and endpoint colors for every decimation + float* dec_weights_ideal = tmpbuf.dec_weights_ideal; + uint8_t* dec_weights_uquant = tmpbuf.dec_weights_uquant; + + // For each decimation mode, compute an ideal set of weights with no quantization + for (unsigned int i = 0; i < bsd.decimation_mode_count_selected; i++) + { + const auto& dm = bsd.get_decimation_mode(i); + if (!dm.is_ref_2plane(static_cast(max_weight_quant))) + { + continue; + } + + const auto& di = bsd.get_decimation_info(i); + + compute_ideal_weights_for_decimation( + ei1, + di, + dec_weights_ideal + i * BLOCK_MAX_WEIGHTS); + + compute_ideal_weights_for_decimation( + ei2, + di, + dec_weights_ideal + i * BLOCK_MAX_WEIGHTS + WEIGHTS_PLANE2_OFFSET); + } + + // Compute maximum colors for the endpoints and ideal weights, then for each endpoint and ideal + // weight pair, compute the smallest weight that will result in a color value greater than 1 + vfloat4 min_ep1(10.0f); + vfloat4 min_ep2(10.0f); + + vfloat4 ep1 = (vfloat4(1.0f) - ei1.ep.endpt0[0]) / (ei1.ep.endpt1[0] - ei1.ep.endpt0[0]); + vmask4 use_ep1 = (ep1 > vfloat4(0.5f)) & (ep1 < min_ep1); + min_ep1 = select(min_ep1, ep1, use_ep1); + + vfloat4 ep2 = (vfloat4(1.0f) - ei2.ep.endpt0[0]) / (ei2.ep.endpt1[0] - ei2.ep.endpt0[0]); + vmask4 use_ep2 = (ep2 > vfloat4(0.5f)) & (ep2 < min_ep2); + min_ep2 = select(min_ep2, ep2, use_ep2); + + vfloat4 err_max(ERROR_CALC_DEFAULT); + vmask4 err_mask = vint4::lane_id() == vint4(plane2_component); + + // Set the plane2 component to max error in ep1 + min_ep1 = select(min_ep1, err_max, err_mask); + + float min_wt_cutoff1 = hmin_s(min_ep1); + + // Set the minwt2 to the plane2 component min in ep2 + float min_wt_cutoff2 = hmin_s(select(err_max, min_ep2, err_mask)); + + compute_angular_endpoints_2planes( + bsd, dec_weights_ideal, max_weight_quant, tmpbuf); + + // For each mode (which specifies a decimation and a quantization): + // * Compute number of bits needed for the quantized weights + // * Generate an optimized set of quantized weights + // * Compute quantization errors for the mode + + float* weight_low_value1 = tmpbuf.weight_low_value1; + float* weight_high_value1 = tmpbuf.weight_high_value1; + float* weight_low_value2 = tmpbuf.weight_low_value2; + float* weight_high_value2 = tmpbuf.weight_high_value2; + + int8_t* qwt_bitcounts = tmpbuf.qwt_bitcounts; + float* qwt_errors = tmpbuf.qwt_errors; + + unsigned int start_2plane = bsd.block_mode_count_1plane_selected; + unsigned int end_2plane = bsd.block_mode_count_1plane_2plane_selected; + + for (unsigned int i = start_2plane; i < end_2plane; i++) + { + const block_mode& bm = bsd.block_modes[i]; + assert(bm.is_dual_plane); + + if (bm.quant_mode > max_weight_quant) + { + qwt_errors[i] = 1e38f; + continue; + } + + qwt_bitcounts[i] = static_cast(109 - bm.weight_bits); + + if (weight_high_value1[i] > 1.02f * min_wt_cutoff1) + { + weight_high_value1[i] = 1.0f; + } + + if (weight_high_value2[i] > 1.02f * min_wt_cutoff2) + { + weight_high_value2[i] = 1.0f; + } + + unsigned int decimation_mode = bm.decimation_mode; + const auto& di = bsd.get_decimation_info(decimation_mode); + + ASTCENC_ALIGNAS float dec_weights_uquantf[BLOCK_MAX_WEIGHTS]; + + // Generate the optimized set of weights for the mode + compute_quantized_weights_for_decimation( + di, + weight_low_value1[i], + weight_high_value1[i], + dec_weights_ideal + BLOCK_MAX_WEIGHTS * decimation_mode, + dec_weights_uquantf, + dec_weights_uquant + BLOCK_MAX_WEIGHTS * i, + bm.get_weight_quant_mode()); + + compute_quantized_weights_for_decimation( + di, + weight_low_value2[i], + weight_high_value2[i], + dec_weights_ideal + BLOCK_MAX_WEIGHTS * decimation_mode + WEIGHTS_PLANE2_OFFSET, + dec_weights_uquantf + WEIGHTS_PLANE2_OFFSET, + dec_weights_uquant + BLOCK_MAX_WEIGHTS * i + WEIGHTS_PLANE2_OFFSET, + bm.get_weight_quant_mode()); + + // Compute weight quantization errors for the block mode + qwt_errors[i] = compute_error_of_weight_set_2planes( + ei1, + ei2, + di, + dec_weights_uquantf, + dec_weights_uquantf + WEIGHTS_PLANE2_OFFSET); + } + + // Decide the optimal combination of color endpoint encodings and weight encodings + uint8_t partition_format_specifiers[TUNE_MAX_TRIAL_CANDIDATES][BLOCK_MAX_PARTITIONS]; + int block_mode_index[TUNE_MAX_TRIAL_CANDIDATES]; + + quant_method color_quant_level[TUNE_MAX_TRIAL_CANDIDATES]; + quant_method color_quant_level_mod[TUNE_MAX_TRIAL_CANDIDATES]; + + endpoints epm; + merge_endpoints(ei1.ep, ei2.ep, plane2_component, epm); + + const auto& pi = bsd.get_partition_info(1, 0); + unsigned int candidate_count = compute_ideal_endpoint_formats( + pi, blk, epm, qwt_bitcounts, qwt_errors, + config.tune_candidate_limit, + bsd.block_mode_count_1plane_selected, bsd.block_mode_count_1plane_2plane_selected, + partition_format_specifiers, block_mode_index, + color_quant_level, color_quant_level_mod, tmpbuf); + + // Iterate over the N believed-to-be-best modes to find out which one is actually best + float best_errorval_in_mode = ERROR_CALC_DEFAULT; + float best_errorval_in_scb = scb.errorval; + + for (unsigned int i = 0; i < candidate_count; i++) + { + TRACE_NODE(node0, "candidate"); + + const int bm_packed_index = block_mode_index[i]; + assert(bm_packed_index >= static_cast(bsd.block_mode_count_1plane_selected) && + bm_packed_index < static_cast(bsd.block_mode_count_1plane_2plane_selected)); + const block_mode& qw_bm = bsd.block_modes[bm_packed_index]; + + int decimation_mode = qw_bm.decimation_mode; + const auto& di = bsd.get_decimation_info(decimation_mode); + promise(di.weight_count > 0); + + trace_add_data("weight_x", di.weight_x); + trace_add_data("weight_y", di.weight_y); + trace_add_data("weight_z", di.weight_z); + trace_add_data("weight_quant", qw_bm.quant_mode); + + vfloat4 rgbs_color; + vfloat4 rgbo_color; + + symbolic_compressed_block workscb; + endpoints workep = epm; + + uint8_t* u8_weight1_src = dec_weights_uquant + BLOCK_MAX_WEIGHTS * bm_packed_index; + uint8_t* u8_weight2_src = dec_weights_uquant + BLOCK_MAX_WEIGHTS * bm_packed_index + WEIGHTS_PLANE2_OFFSET; + + for (int j = 0; j < di.weight_count; j++) + { + workscb.weights[j] = u8_weight1_src[j]; + workscb.weights[j + WEIGHTS_PLANE2_OFFSET] = u8_weight2_src[j]; + } + + for (unsigned int l = 0; l < config.tune_refinement_limit; l++) + { + recompute_ideal_colors_2planes( + blk, bsd, di, + workscb.weights, workscb.weights + WEIGHTS_PLANE2_OFFSET, + workep, rgbs_color, rgbo_color, plane2_component); + + // Quantize the chosen color + workscb.color_formats[0] = pack_color_endpoints( + workep.endpt0[0], + workep.endpt1[0], + rgbs_color, rgbo_color, + partition_format_specifiers[i][0], + workscb.color_values[0], + color_quant_level[i]); + + // Store header fields + workscb.partition_count = 1; + workscb.partition_index = 0; + workscb.quant_mode = color_quant_level[i]; + workscb.color_formats_matched = 0; + workscb.block_mode = qw_bm.mode_index; + workscb.plane2_component = static_cast(plane2_component); + workscb.block_type = SYM_BTYPE_NONCONST; + + // Pre-realign test + if (l == 0) + { + float errorval = compute_symbolic_block_difference_2plane(config, bsd, workscb, blk); + if (errorval == -ERROR_CALC_DEFAULT) + { + errorval = -errorval; + workscb.block_type = SYM_BTYPE_ERROR; + } + + trace_add_data("error_prerealign", errorval); + best_errorval_in_mode = astc::min(errorval, best_errorval_in_mode); + + // Average refinement improvement is 3.5% per iteration (allow 4.5%), but the first + // iteration can help more so we give it a extra 8% leeway. Use this knowledge to + // drive a heuristic to skip blocks that are unlikely to catch up with the best + // block we have already. + unsigned int iters_remaining = config.tune_refinement_limit - l; + float threshold = (0.045f * static_cast(iters_remaining)) + 1.08f; + if (errorval > (threshold * best_errorval_in_scb)) + { + break; + } + + if (errorval < best_errorval_in_scb) + { + best_errorval_in_scb = errorval; + workscb.errorval = errorval; + scb = workscb; + + if (errorval < tune_errorval_threshold) + { + // Skip remaining candidates - this is "good enough" + i = candidate_count; + break; + } + } + } + + // Perform a final pass over the weights to try to improve them. + bool adjustments; + if (di.weight_count != bsd.texel_count) + { + adjustments = realign_weights_decimated( + config.profile, bsd, blk, workscb); + } + else + { + adjustments = realign_weights_undecimated( + config.profile, bsd, blk, workscb); + } + + // Post-realign test + float errorval = compute_symbolic_block_difference_2plane(config, bsd, workscb, blk); + if (errorval == -ERROR_CALC_DEFAULT) + { + errorval = -errorval; + workscb.block_type = SYM_BTYPE_ERROR; + } + + trace_add_data("error_postrealign", errorval); + best_errorval_in_mode = astc::min(errorval, best_errorval_in_mode); + + // Average refinement improvement is 3.5% per iteration, so skip blocks that are + // unlikely to catch up with the best block we have already. Assume a 4.5% per step to + // give benefit of the doubt ... + unsigned int iters_remaining = config.tune_refinement_limit - 1 - l; + float threshold = (0.045f * static_cast(iters_remaining)) + 1.0f; + if (errorval > (threshold * best_errorval_in_scb)) + { + break; + } + + if (errorval < best_errorval_in_scb) + { + best_errorval_in_scb = errorval; + workscb.errorval = errorval; + scb = workscb; + + if (errorval < tune_errorval_threshold) + { + // Skip remaining candidates - this is "good enough" + i = candidate_count; + break; + } + } + + if (!adjustments) + { + break; + } + } + } + + return best_errorval_in_mode; +} + +/** + * @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 +) { + // Compute covariance matrix, as a collection of 10 scalars that form the upper-triangular row + // of the matrix. The matrix is symmetric, so this is all we need for this use case. + float rs = 0.0f; + float gs = 0.0f; + float bs = 0.0f; + float as = 0.0f; + float rr_var = 0.0f; + float gg_var = 0.0f; + float bb_var = 0.0f; + float aa_var = 0.0f; + float rg_cov = 0.0f; + float rb_cov = 0.0f; + float ra_cov = 0.0f; + float gb_cov = 0.0f; + float ga_cov = 0.0f; + float ba_cov = 0.0f; + + float weight_sum = 0.0f; + + promise(texels_per_block > 0); + for (int i = 0; i < texels_per_block; i++) + { + float weight = hadd_s(blk.channel_weight) / 4.0f; + assert(weight >= 0.0f); + weight_sum += weight; + + float r = blk.data_r[i]; + float g = blk.data_g[i]; + float b = blk.data_b[i]; + float a = blk.data_a[i]; + + float rw = r * weight; + rs += rw; + rr_var += r * rw; + rg_cov += g * rw; + rb_cov += b * rw; + ra_cov += a * rw; + + float gw = g * weight; + gs += gw; + gg_var += g * gw; + gb_cov += b * gw; + ga_cov += a * gw; + + float bw = b * weight; + bs += bw; + bb_var += b * bw; + ba_cov += a * bw; + + float aw = a * weight; + as += aw; + aa_var += a * aw; + } + + float rpt = 1.0f / astc::max(weight_sum, 1e-7f); + + rr_var -= rs * (rs * rpt); + rg_cov -= gs * (rs * rpt); + rb_cov -= bs * (rs * rpt); + ra_cov -= as * (rs * rpt); + + gg_var -= gs * (gs * rpt); + gb_cov -= bs * (gs * rpt); + ga_cov -= as * (gs * rpt); + + bb_var -= bs * (bs * rpt); + ba_cov -= as * (bs * rpt); + + aa_var -= as * (as * rpt); + + // These will give a NaN if a channel is constant - these are fixed up in the next step + rg_cov *= astc::rsqrt(rr_var * gg_var); + rb_cov *= astc::rsqrt(rr_var * bb_var); + ra_cov *= astc::rsqrt(rr_var * aa_var); + gb_cov *= astc::rsqrt(gg_var * bb_var); + ga_cov *= astc::rsqrt(gg_var * aa_var); + ba_cov *= astc::rsqrt(bb_var * aa_var); + + if (astc::isnan(rg_cov)) rg_cov = 1.0f; + if (astc::isnan(rb_cov)) rb_cov = 1.0f; + if (astc::isnan(ra_cov)) ra_cov = 1.0f; + if (astc::isnan(gb_cov)) gb_cov = 1.0f; + if (astc::isnan(ga_cov)) ga_cov = 1.0f; + if (astc::isnan(ba_cov)) ba_cov = 1.0f; + + float lowest_correlation = astc::min(fabsf(rg_cov), fabsf(rb_cov)); + lowest_correlation = astc::min(lowest_correlation, fabsf(ra_cov)); + lowest_correlation = astc::min(lowest_correlation, fabsf(gb_cov)); + lowest_correlation = astc::min(lowest_correlation, fabsf(ga_cov)); + lowest_correlation = astc::min(lowest_correlation, fabsf(ba_cov)); + + // Diagnostic trace points + trace_add_data("min_r", blk.data_min.lane<0>()); + trace_add_data("max_r", blk.data_max.lane<0>()); + trace_add_data("min_g", blk.data_min.lane<1>()); + trace_add_data("max_g", blk.data_max.lane<1>()); + trace_add_data("min_b", blk.data_min.lane<2>()); + trace_add_data("max_b", blk.data_max.lane<2>()); + trace_add_data("min_a", blk.data_min.lane<3>()); + trace_add_data("max_a", blk.data_max.lane<3>()); + trace_add_data("cov_rg", fabsf(rg_cov)); + trace_add_data("cov_rb", fabsf(rb_cov)); + trace_add_data("cov_ra", fabsf(ra_cov)); + trace_add_data("cov_gb", fabsf(gb_cov)); + trace_add_data("cov_ga", fabsf(ga_cov)); + trace_add_data("cov_ba", fabsf(ba_cov)); + + return lowest_correlation; +} + +/* See header for documentation. */ +void compress_block( + const astcenc_contexti& ctx, + const image_block& blk, + uint8_t pcb[16], + compression_working_buffers& tmpbuf) +{ + astcenc_profile decode_mode = ctx.config.profile; + symbolic_compressed_block scb; + const block_size_descriptor& bsd = *ctx.bsd; + float lowest_correl; + + TRACE_NODE(node0, "block"); + trace_add_data("pos_x", blk.xpos); + trace_add_data("pos_y", blk.ypos); + trace_add_data("pos_z", blk.zpos); + + // Set stricter block targets for luminance data as we have more bits to play with + bool block_is_l = blk.is_luminance(); + float block_is_l_scale = block_is_l ? 1.0f / 1.5f : 1.0f; + + // Set slightly stricter block targets for lumalpha data as we have more bits to play with + bool block_is_la = blk.is_luminancealpha(); + float block_is_la_scale = block_is_la ? 1.0f / 1.05f : 1.0f; + + bool block_skip_two_plane = false; + int max_partitions = ctx.config.tune_partition_count_limit; + + unsigned int requested_partition_indices[3] { + ctx.config.tune_2partition_index_limit, + ctx.config.tune_3partition_index_limit, + ctx.config.tune_4partition_index_limit + }; + + unsigned int requested_partition_trials[3] { + ctx.config.tune_2partitioning_candidate_limit, + ctx.config.tune_3partitioning_candidate_limit, + ctx.config.tune_4partitioning_candidate_limit + }; + +#if defined(ASTCENC_DIAGNOSTICS) + // Do this early in diagnostic builds so we can dump uniform metrics + // for every block. Do it later in release builds to avoid redundant work! + float error_weight_sum = hadd_s(blk.channel_weight) * bsd.texel_count; + float error_threshold = ctx.config.tune_db_limit + * error_weight_sum + * block_is_l_scale + * block_is_la_scale; + + lowest_correl = prepare_block_statistics(bsd.texel_count, blk); + trace_add_data("lowest_correl", lowest_correl); + trace_add_data("tune_error_threshold", error_threshold); +#endif + + // Detected a constant-color block + if (all(blk.data_min == blk.data_max)) + { + TRACE_NODE(node1, "pass"); + trace_add_data("partition_count", 0); + trace_add_data("plane_count", 1); + + scb.partition_count = 0; + + // Encode as FP16 if using HDR + if ((decode_mode == ASTCENC_PRF_HDR) || + (decode_mode == ASTCENC_PRF_HDR_RGB_LDR_A)) + { + scb.block_type = SYM_BTYPE_CONST_F16; + vint4 color_f16 = float_to_float16(blk.origin_texel); + store(color_f16, scb.constant_color); + } + // Encode as UNORM16 if NOT using HDR + else + { + scb.block_type = SYM_BTYPE_CONST_U16; + vfloat4 color_f32 = clamp(0.0f, 1.0f, blk.origin_texel) * 65535.0f; + vint4 color_u16 = float_to_int_rtn(color_f32); + store(color_u16, scb.constant_color); + } + + trace_add_data("exit", "quality hit"); + + symbolic_to_physical(bsd, scb, pcb); + return; + } + +#if !defined(ASTCENC_DIAGNOSTICS) + float error_weight_sum = hadd_s(blk.channel_weight) * bsd.texel_count; + float error_threshold = ctx.config.tune_db_limit + * error_weight_sum + * block_is_l_scale + * block_is_la_scale; +#endif + + // Set SCB and mode errors to a very high error value + scb.errorval = ERROR_CALC_DEFAULT; + scb.block_type = SYM_BTYPE_ERROR; + + float best_errorvals_for_pcount[BLOCK_MAX_PARTITIONS] { + ERROR_CALC_DEFAULT, ERROR_CALC_DEFAULT, ERROR_CALC_DEFAULT, ERROR_CALC_DEFAULT + }; + + float exit_thresholds_for_pcount[BLOCK_MAX_PARTITIONS] { + 0.0f, + ctx.config.tune_2partition_early_out_limit_factor, + ctx.config.tune_3partition_early_out_limit_factor, + 0.0f + }; + + // Trial using 1 plane of weights and 1 partition. + + // Most of the time we test it twice, first with a mode cutoff of 0 and then with the specified + // mode cutoff. This causes an early-out that speeds up encoding of easy blocks. However, this + // optimization is disabled for 4x4 and 5x4 blocks where it nearly always slows down the + // compression and slightly reduces image quality. + + float errorval_mult[2] { + 1.0f / ctx.config.tune_mse_overshoot, + 1.0f + }; + + const float errorval_overshoot = 1.0f / ctx.config.tune_mse_overshoot; + + // Only enable MODE0 fast path if enabled + // Never enable for 3D blocks as no "always" block modes are available + int start_trial = 1; + if ((ctx.config.tune_search_mode0_enable >= TUNE_MIN_SEARCH_MODE0) && (bsd.zdim == 1)) + { + start_trial = 0; + } + + int quant_limit = QUANT_32; + for (int i = start_trial; i < 2; i++) + { + TRACE_NODE(node1, "pass"); + trace_add_data("partition_count", 1); + trace_add_data("plane_count", 1); + trace_add_data("search_mode", i); + + float errorval = compress_symbolic_block_for_partition_1plane( + ctx.config, bsd, blk, i == 0, + error_threshold * errorval_mult[i] * errorval_overshoot, + 1, 0, scb, tmpbuf, QUANT_32); + + // Record the quant level so we can use the filter later searches + const auto& bm = bsd.get_block_mode(scb.block_mode); + quant_limit = bm.get_weight_quant_mode(); + + best_errorvals_for_pcount[0] = astc::min(best_errorvals_for_pcount[0], errorval); + if (errorval < (error_threshold * errorval_mult[i])) + { + trace_add_data("exit", "quality hit"); + goto END_OF_TESTS; + } + } + +#if !defined(ASTCENC_DIAGNOSTICS) + lowest_correl = prepare_block_statistics(bsd.texel_count, blk); +#endif + + block_skip_two_plane = lowest_correl > ctx.config.tune_2plane_early_out_limit_correlation; + + // Test the four possible 1-partition, 2-planes modes. Do this in reverse, as + // alpha is the most likely to be non-correlated if it is present in the data. + for (int i = BLOCK_MAX_COMPONENTS - 1; i >= 0; i--) + { + TRACE_NODE(node1, "pass"); + trace_add_data("partition_count", 1); + trace_add_data("plane_count", 2); + trace_add_data("plane_component", i); + + if (block_skip_two_plane) + { + trace_add_data("skip", "tune_2plane_early_out_limit_correlation"); + continue; + } + + if (blk.grayscale && i != 3) + { + trace_add_data("skip", "grayscale block"); + continue; + } + + if (blk.is_constant_channel(i)) + { + trace_add_data("skip", "constant component"); + continue; + } + + float errorval = compress_symbolic_block_for_partition_2planes( + ctx.config, bsd, blk, error_threshold * errorval_overshoot, + i, scb, tmpbuf, quant_limit); + + // If attempting two planes is much worse than the best one plane result + // then further two plane searches are unlikely to help so move on ... + if (errorval > (best_errorvals_for_pcount[0] * 1.85f)) + { + break; + } + + if (errorval < error_threshold) + { + trace_add_data("exit", "quality hit"); + goto END_OF_TESTS; + } + } + + // Find best blocks for 2, 3 and 4 partitions + for (int partition_count = 2; partition_count <= max_partitions; partition_count++) + { + unsigned int partition_indices[TUNE_MAX_PARTITIONING_CANDIDATES]; + + unsigned int requested_indices = requested_partition_indices[partition_count - 2]; + + unsigned int requested_trials = requested_partition_trials[partition_count - 2]; + requested_trials = astc::min(requested_trials, requested_indices); + + unsigned int actual_trials = find_best_partition_candidates( + bsd, blk, partition_count, requested_indices, partition_indices, requested_trials); + + float best_error_in_prev = best_errorvals_for_pcount[partition_count - 2]; + + for (unsigned int i = 0; i < actual_trials; i++) + { + TRACE_NODE(node1, "pass"); + trace_add_data("partition_count", partition_count); + trace_add_data("partition_index", partition_indices[i]); + trace_add_data("plane_count", 1); + trace_add_data("search_mode", i); + + float errorval = compress_symbolic_block_for_partition_1plane( + ctx.config, bsd, blk, false, + error_threshold * errorval_overshoot, + partition_count, partition_indices[i], + scb, tmpbuf, quant_limit); + + best_errorvals_for_pcount[partition_count - 1] = astc::min(best_errorvals_for_pcount[partition_count - 1], errorval); + + // If using N partitions doesn't improve much over using N-1 partitions then skip trying + // N+1. Error can dramatically improve if the data is correlated or non-correlated and + // aligns with a partitioning that suits that encoding, so for this inner loop check add + // a large error scale because the "other" trial could be a lot better. + float best_error = best_errorvals_for_pcount[partition_count - 1]; + float best_error_scale = exit_thresholds_for_pcount[partition_count - 1] * 1.85f; + if (best_error > (best_error_in_prev * best_error_scale)) + { + trace_add_data("skip", "tune_partition_early_out_limit_factor"); + goto END_OF_TESTS; + } + + if (errorval < error_threshold) + { + trace_add_data("exit", "quality hit"); + goto END_OF_TESTS; + } + } + + // If using N partitions doesn't improve much over using N-1 partitions then skip trying N+1 + float best_error = best_errorvals_for_pcount[partition_count - 1]; + float best_error_scale = exit_thresholds_for_pcount[partition_count - 1]; + if (best_error > (best_error_in_prev * best_error_scale)) + { + trace_add_data("skip", "tune_partition_early_out_limit_factor"); + goto END_OF_TESTS; + } + } + + trace_add_data("exit", "quality not hit"); + +END_OF_TESTS: + // If we still have an error block then convert to something we can encode + // TODO: Do something more sensible here, such as average color block + if (scb.block_type == SYM_BTYPE_ERROR) + { +#if defined(ASTCENC_DIAGNOSTICS) + static bool printed_once = false; + if (!printed_once) + { + printed_once = true; + printf("WARN: At least one block failed to find a valid encoding.\n" + " Try increasing compression quality settings.\n\n"); + } +#endif + + scb.block_type = SYM_BTYPE_CONST_U16; + vfloat4 color_f32 = clamp(0.0f, 1.0f, blk.origin_texel) * 65535.0f; + vint4 color_u16 = float_to_int_rtn(color_f32); + store(color_u16, scb.constant_color); + } + + // Compress to a physical block + symbolic_to_physical(bsd, scb, pcb); +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_compute_variance.cpp b/ktx/external/astc-encoder/Source/astcenc_compute_variance.cpp new file mode 100644 index 0000000..48a4af8 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_compute_variance.cpp @@ -0,0 +1,472 @@ +// 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 + +/** + * @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 +) { + if (items < 2) + return; + + size_t lc_stride = 2; + size_t log2_stride = 1; + + // The reduction-tree loop + do { + size_t step = lc_stride >> 1; + size_t start = lc_stride - 1; + size_t iters = items >> log2_stride; + + vfloat4 *da = d + (start * stride); + ptrdiff_t ofs = -static_cast(step * stride); + size_t ofs_stride = stride << log2_stride; + + while (iters) + { + *da = *da + da[ofs]; + da += ofs_stride; + iters--; + } + + log2_stride += 1; + lc_stride <<= 1; + } while (lc_stride <= items); + + // The expansion-tree loop + do { + log2_stride -= 1; + lc_stride >>= 1; + + size_t step = lc_stride >> 1; + size_t start = step + lc_stride - 1; + size_t iters = (items - step) >> log2_stride; + + vfloat4 *da = d + (start * stride); + ptrdiff_t ofs = -static_cast(step * stride); + size_t ofs_stride = stride << log2_stride; + + while (iters) + { + *da = *da + da[ofs]; + da += ofs_stride; + iters--; + } + } while (lc_stride > 2); +} + +/* See header for documentation. */ +void compute_pixel_region_variance( + astcenc_contexti& ctx, + const pixel_region_args& arg +) { + // Unpack the memory structure into local variables + const astcenc_image* img = arg.img; + astcenc_swizzle swz = arg.swz; + bool have_z = arg.have_z; + + int size_x = arg.size_x; + int size_y = arg.size_y; + int size_z = arg.size_z; + + int offset_x = arg.offset_x; + int offset_y = arg.offset_y; + int offset_z = arg.offset_z; + + int alpha_kernel_radius = arg.alpha_kernel_radius; + + float* input_alpha_averages = ctx.input_alpha_averages; + vfloat4* work_memory = arg.work_memory; + + // Compute memory sizes and dimensions that we need + int kernel_radius = alpha_kernel_radius; + int kerneldim = 2 * kernel_radius + 1; + int kernel_radius_xy = kernel_radius; + int kernel_radius_z = have_z ? kernel_radius : 0; + + int padsize_x = size_x + kerneldim; + int padsize_y = size_y + kerneldim; + int padsize_z = size_z + (have_z ? kerneldim : 0); + int sizeprod = padsize_x * padsize_y * padsize_z; + + int zd_start = have_z ? 1 : 0; + + vfloat4 *varbuf1 = work_memory; + vfloat4 *varbuf2 = work_memory + sizeprod; + + // Scaling factors to apply to Y and Z for accesses into the work buffers + int yst = padsize_x; + int zst = padsize_x * padsize_y; + + // Scaling factors to apply to Y and Z for accesses into result buffers + int ydt = img->dim_x; + int zdt = img->dim_x * img->dim_y; + + // Macros to act as accessor functions for the work-memory + #define VARBUF1(z, y, x) varbuf1[z * zst + y * yst + x] + #define VARBUF2(z, y, x) varbuf2[z * zst + y * yst + x] + + // Load N and N^2 values into the work buffers + if (img->data_type == ASTCENC_TYPE_U8) + { + // Swizzle data structure 4 = ZERO, 5 = ONE + uint8_t data[6]; + data[ASTCENC_SWZ_0] = 0; + data[ASTCENC_SWZ_1] = 255; + + for (int z = zd_start; z < padsize_z; z++) + { + int z_src = (z - zd_start) + offset_z - kernel_radius_z; + z_src = astc::clamp(z_src, 0, static_cast(img->dim_z - 1)); + uint8_t* data8 = static_cast(img->data[z_src]); + + for (int y = 1; y < padsize_y; y++) + { + int y_src = (y - 1) + offset_y - kernel_radius_xy; + y_src = astc::clamp(y_src, 0, static_cast(img->dim_y - 1)); + + for (int x = 1; x < padsize_x; x++) + { + int x_src = (x - 1) + offset_x - kernel_radius_xy; + x_src = astc::clamp(x_src, 0, static_cast(img->dim_x - 1)); + + data[0] = data8[(4 * img->dim_x * y_src) + (4 * x_src )]; + data[1] = data8[(4 * img->dim_x * y_src) + (4 * x_src + 1)]; + data[2] = data8[(4 * img->dim_x * y_src) + (4 * x_src + 2)]; + data[3] = data8[(4 * img->dim_x * y_src) + (4 * x_src + 3)]; + + uint8_t r = data[swz.r]; + uint8_t g = data[swz.g]; + uint8_t b = data[swz.b]; + uint8_t a = data[swz.a]; + + vfloat4 d = vfloat4 (r * (1.0f / 255.0f), + g * (1.0f / 255.0f), + b * (1.0f / 255.0f), + a * (1.0f / 255.0f)); + + VARBUF1(z, y, x) = d; + VARBUF2(z, y, x) = d * d; + } + } + } + } + else if (img->data_type == ASTCENC_TYPE_F16) + { + // Swizzle data structure 4 = ZERO, 5 = ONE (in FP16) + uint16_t data[6]; + data[ASTCENC_SWZ_0] = 0; + data[ASTCENC_SWZ_1] = 0x3C00; + + for (int z = zd_start; z < padsize_z; z++) + { + int z_src = (z - zd_start) + offset_z - kernel_radius_z; + z_src = astc::clamp(z_src, 0, static_cast(img->dim_z - 1)); + uint16_t* data16 = static_cast(img->data[z_src]); + + for (int y = 1; y < padsize_y; y++) + { + int y_src = (y - 1) + offset_y - kernel_radius_xy; + y_src = astc::clamp(y_src, 0, static_cast(img->dim_y - 1)); + + for (int x = 1; x < padsize_x; x++) + { + int x_src = (x - 1) + offset_x - kernel_radius_xy; + x_src = astc::clamp(x_src, 0, static_cast(img->dim_x - 1)); + + data[0] = data16[(4 * img->dim_x * y_src) + (4 * x_src )]; + data[1] = data16[(4 * img->dim_x * y_src) + (4 * x_src + 1)]; + data[2] = data16[(4 * img->dim_x * y_src) + (4 * x_src + 2)]; + data[3] = data16[(4 * img->dim_x * y_src) + (4 * x_src + 3)]; + + vint4 di(data[swz.r], data[swz.g], data[swz.b], data[swz.a]); + vfloat4 d = float16_to_float(di); + + VARBUF1(z, y, x) = d; + VARBUF2(z, y, x) = d * d; + } + } + } + } + else // if (img->data_type == ASTCENC_TYPE_F32) + { + assert(img->data_type == ASTCENC_TYPE_F32); + + // Swizzle data structure 4 = ZERO, 5 = ONE (in FP16) + float data[6]; + data[ASTCENC_SWZ_0] = 0.0f; + data[ASTCENC_SWZ_1] = 1.0f; + + for (int z = zd_start; z < padsize_z; z++) + { + int z_src = (z - zd_start) + offset_z - kernel_radius_z; + z_src = astc::clamp(z_src, 0, static_cast(img->dim_z - 1)); + float* data32 = static_cast(img->data[z_src]); + + for (int y = 1; y < padsize_y; y++) + { + int y_src = (y - 1) + offset_y - kernel_radius_xy; + y_src = astc::clamp(y_src, 0, static_cast(img->dim_y - 1)); + + for (int x = 1; x < padsize_x; x++) + { + int x_src = (x - 1) + offset_x - kernel_radius_xy; + x_src = astc::clamp(x_src, 0, static_cast(img->dim_x - 1)); + + data[0] = data32[(4 * img->dim_x * y_src) + (4 * x_src )]; + data[1] = data32[(4 * img->dim_x * y_src) + (4 * x_src + 1)]; + data[2] = data32[(4 * img->dim_x * y_src) + (4 * x_src + 2)]; + data[3] = data32[(4 * img->dim_x * y_src) + (4 * x_src + 3)]; + + float r = data[swz.r]; + float g = data[swz.g]; + float b = data[swz.b]; + float a = data[swz.a]; + + vfloat4 d(r, g, b, a); + + VARBUF1(z, y, x) = d; + VARBUF2(z, y, x) = d * d; + } + } + } + } + + // Pad with an extra layer of 0s; this forms the edge of the SAT tables + vfloat4 vbz = vfloat4::zero(); + for (int z = 0; z < padsize_z; z++) + { + for (int y = 0; y < padsize_y; y++) + { + VARBUF1(z, y, 0) = vbz; + VARBUF2(z, y, 0) = vbz; + } + + for (int x = 0; x < padsize_x; x++) + { + VARBUF1(z, 0, x) = vbz; + VARBUF2(z, 0, x) = vbz; + } + } + + if (have_z) + { + for (int y = 0; y < padsize_y; y++) + { + for (int x = 0; x < padsize_x; x++) + { + VARBUF1(0, y, x) = vbz; + VARBUF2(0, y, x) = vbz; + } + } + } + + // Generate summed-area tables for N and N^2; this is done in-place, using + // a Brent-Kung parallel-prefix based algorithm to minimize precision loss + for (int z = zd_start; z < padsize_z; z++) + { + for (int y = 1; y < padsize_y; y++) + { + brent_kung_prefix_sum(&(VARBUF1(z, y, 1)), padsize_x - 1, 1); + brent_kung_prefix_sum(&(VARBUF2(z, y, 1)), padsize_x - 1, 1); + } + } + + for (int z = zd_start; z < padsize_z; z++) + { + for (int x = 1; x < padsize_x; x++) + { + brent_kung_prefix_sum(&(VARBUF1(z, 1, x)), padsize_y - 1, yst); + brent_kung_prefix_sum(&(VARBUF2(z, 1, x)), padsize_y - 1, yst); + } + } + + if (have_z) + { + for (int y = 1; y < padsize_y; y++) + { + for (int x = 1; x < padsize_x; x++) + { + brent_kung_prefix_sum(&(VARBUF1(1, y, x)), padsize_z - 1, zst); + brent_kung_prefix_sum(&(VARBUF2(1, y, x)), padsize_z - 1, zst); + } + } + } + + // Compute a few constants used in the variance-calculation. + float alpha_kdim = static_cast(2 * alpha_kernel_radius + 1); + float alpha_rsamples; + + if (have_z) + { + alpha_rsamples = 1.0f / (alpha_kdim * alpha_kdim * alpha_kdim); + } + else + { + alpha_rsamples = 1.0f / (alpha_kdim * alpha_kdim); + } + + // Use the summed-area tables to compute variance for each neighborhood + if (have_z) + { + for (int z = 0; z < size_z; z++) + { + int z_src = z + kernel_radius_z; + int z_dst = z + offset_z; + int z_low = z_src - alpha_kernel_radius; + int z_high = z_src + alpha_kernel_radius + 1; + + for (int y = 0; y < size_y; y++) + { + int y_src = y + kernel_radius_xy; + int y_dst = y + offset_y; + int y_low = y_src - alpha_kernel_radius; + int y_high = y_src + alpha_kernel_radius + 1; + + for (int x = 0; x < size_x; x++) + { + int x_src = x + kernel_radius_xy; + int x_dst = x + offset_x; + int x_low = x_src - alpha_kernel_radius; + int x_high = x_src + alpha_kernel_radius + 1; + + // Summed-area table lookups for alpha average + float vasum = ( VARBUF1(z_high, y_low, x_low).lane<3>() + - VARBUF1(z_high, y_low, x_high).lane<3>() + - VARBUF1(z_high, y_high, x_low).lane<3>() + + VARBUF1(z_high, y_high, x_high).lane<3>()) - + ( VARBUF1(z_low, y_low, x_low).lane<3>() + - VARBUF1(z_low, y_low, x_high).lane<3>() + - VARBUF1(z_low, y_high, x_low).lane<3>() + + VARBUF1(z_low, y_high, x_high).lane<3>()); + + int out_index = z_dst * zdt + y_dst * ydt + x_dst; + input_alpha_averages[out_index] = (vasum * alpha_rsamples); + } + } + } + } + else + { + for (int y = 0; y < size_y; y++) + { + int y_src = y + kernel_radius_xy; + int y_dst = y + offset_y; + int y_low = y_src - alpha_kernel_radius; + int y_high = y_src + alpha_kernel_radius + 1; + + for (int x = 0; x < size_x; x++) + { + int x_src = x + kernel_radius_xy; + int x_dst = x + offset_x; + int x_low = x_src - alpha_kernel_radius; + int x_high = x_src + alpha_kernel_radius + 1; + + // Summed-area table lookups for alpha average + float vasum = VARBUF1(0, y_low, x_low).lane<3>() + - VARBUF1(0, y_low, x_high).lane<3>() + - VARBUF1(0, y_high, x_low).lane<3>() + + VARBUF1(0, y_high, x_high).lane<3>(); + + int out_index = y_dst * ydt + x_dst; + input_alpha_averages[out_index] = (vasum * alpha_rsamples); + } + } + } +} + +/* 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 +) { + unsigned int size_x = img.dim_x; + unsigned int size_y = img.dim_y; + unsigned int size_z = img.dim_z; + + // Compute maximum block size and from that the working memory buffer size + unsigned int kernel_radius = alpha_kernel_radius; + unsigned int kerneldim = 2 * kernel_radius + 1; + + bool have_z = (size_z > 1); + unsigned int max_blk_size_xy = have_z ? 16 : 32; + unsigned int max_blk_size_z = astc::min(size_z, have_z ? 16u : 1u); + + unsigned int max_padsize_xy = max_blk_size_xy + kerneldim; + unsigned int max_padsize_z = max_blk_size_z + (have_z ? kerneldim : 0); + + // Perform block-wise averages calculations across the image + // Initialize fields which are not populated until later + ag.arg.size_x = 0; + ag.arg.size_y = 0; + ag.arg.size_z = 0; + ag.arg.offset_x = 0; + ag.arg.offset_y = 0; + ag.arg.offset_z = 0; + ag.arg.work_memory = nullptr; + + ag.arg.img = &img; + ag.arg.swz = swz; + ag.arg.have_z = have_z; + ag.arg.alpha_kernel_radius = alpha_kernel_radius; + + ag.img_size_x = size_x; + ag.img_size_y = size_y; + ag.img_size_z = size_z; + ag.blk_size_xy = max_blk_size_xy; + ag.blk_size_z = max_blk_size_z; + ag.work_memory_size = 2 * max_padsize_xy * max_padsize_xy * max_padsize_z; + + // The parallel task count + unsigned int z_tasks = (size_z + max_blk_size_z - 1) / max_blk_size_z; + unsigned int y_tasks = (size_y + max_blk_size_xy - 1) / max_blk_size_xy; + return z_tasks * y_tasks; +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_decompress_symbolic.cpp b/ktx/external/astc-encoder/Source/astcenc_decompress_symbolic.cpp new file mode 100644 index 0000000..e7791ee --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_decompress_symbolic.cpp @@ -0,0 +1,622 @@ +// 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions to decompress a symbolic block. + */ + +#include "astcenc_internal.h" + +#include +#include + +/** + * @brief Compute the integer linear interpolation of two color endpoints. + * + * @param u8_mask The mask for lanes using decode_unorm8 rather than decode_f16. + * @param color0 The endpoint0 color. + * @param color1 The endpoint1 color. + * @param weights The interpolation weight (between 0 and 64). + * + * @return The interpolated color. + */ +static vint4 lerp_color_int( + vmask4 u8_mask, + vint4 color0, + vint4 color1, + vint4 weights +) { + vint4 weight1 = weights; + vint4 weight0 = vint4(64) - weight1; + + vint4 color = (color0 * weight0) + (color1 * weight1) + vint4(32); + color = asr<6>(color); + + // For decode_unorm8 values force the codec to bit replicate. This allows the + // rest of the codec to assume the full 0xFFFF range for everything and ignore + // the decode_mode setting + vint4 color_u8 = asr<8>(color) * vint4(257); + color = select(color, color_u8, u8_mask); + + return color; +} + +/** + * @brief Convert integer color value into a float value for the decoder. + * + * @param data The integer color value post-interpolation. + * @param lns_mask If set treat lane as HDR (LNS) else LDR (unorm16). + * + * @return The float color value. + */ +static inline vfloat4 decode_texel( + vint4 data, + vmask4 lns_mask +) { + vint4 color_lns = vint4::zero(); + vint4 color_unorm = vint4::zero(); + + if (any(lns_mask)) + { + color_lns = lns_to_sf16(data); + } + + if (!all(lns_mask)) + { + color_unorm = unorm16_to_sf16(data); + } + + // Pick components and then convert to FP16 + vint4 datai = select(color_unorm, color_lns, lns_mask); + return float16_to_float(datai); +} + +/* See header for documentation. */ +void unpack_weights( + const block_size_descriptor& bsd, + const symbolic_compressed_block& scb, + const decimation_info& di, + bool is_dual_plane, + int weights_plane1[BLOCK_MAX_TEXELS], + int weights_plane2[BLOCK_MAX_TEXELS] +) { + // Safe to overshoot as all arrays are allocated to full size + if (!is_dual_plane) + { + // Build full 64-entry weight lookup table + vtable_64x8 table; + vtable_prepare(table, scb.weights); + + for (unsigned int i = 0; i < bsd.texel_count; i += ASTCENC_SIMD_WIDTH) + { + vint summed_value(8); + vint weight_count(di.texel_weight_count + i); + int max_weight_count = hmax_s(weight_count); + + promise(max_weight_count > 0); + for (int j = 0; j < max_weight_count; j++) + { + vint texel_weights(di.texel_weights_tr[j] + i); + vint texel_weights_int(di.texel_weight_contribs_int_tr[j] + i); + + summed_value += vtable_lookup_32bit(table, texel_weights) * texel_weights_int; + } + + store(lsr<4>(summed_value), weights_plane1 + i); + } + } + else + { + // Build a 32-entry weight lookup table per plane + // Plane 1 + vtable_32x8 tab_plane1; + vtable_prepare(tab_plane1, scb.weights); + + // Plane 2 + vtable_32x8 tab_plane2; + vtable_prepare(tab_plane2, scb.weights + 32); + + for (unsigned int i = 0; i < bsd.texel_count; i += ASTCENC_SIMD_WIDTH) + { + vint sum_plane1(8); + vint sum_plane2(8); + + vint weight_count(di.texel_weight_count + i); + int max_weight_count = hmax_s(weight_count); + + promise(max_weight_count > 0); + for (int j = 0; j < max_weight_count; j++) + { + vint texel_weights(di.texel_weights_tr[j] + i); + vint texel_weights_int(di.texel_weight_contribs_int_tr[j] + i); + + sum_plane1 += vtable_lookup_32bit(tab_plane1, texel_weights) * texel_weights_int; + sum_plane2 += vtable_lookup_32bit(tab_plane2, texel_weights) * texel_weights_int; + } + + store(lsr<4>(sum_plane1), weights_plane1 + i); + store(lsr<4>(sum_plane2), weights_plane2 + i); + } + } +} + +/** + * @brief Return an FP32 NaN value for use in error colors. + * + * This NaN encoding will turn into 0xFFFF when converted to an FP16 NaN. + * + * @return The float color value. + */ +static float error_color_nan() +{ + if32 v; + v.u = 0xFFFFE000U; + return v.f; +} + +/* See header for documentation. */ +void decompress_symbolic_block( + astcenc_profile decode_mode, + const block_size_descriptor& bsd, + int xpos, + int ypos, + int zpos, + const symbolic_compressed_block& scb, + image_block& blk +) { + blk.xpos = xpos; + blk.ypos = ypos; + blk.zpos = zpos; + + blk.data_min = vfloat4::zero(); + blk.data_mean = vfloat4::zero(); + blk.data_max = vfloat4::zero(); + blk.grayscale = false; + + // If we detected an error-block, blow up immediately. + if (scb.block_type == SYM_BTYPE_ERROR) + { + for (unsigned int i = 0; i < bsd.texel_count; i++) + { + blk.data_r[i] = error_color_nan(); + blk.data_g[i] = error_color_nan(); + blk.data_b[i] = error_color_nan(); + blk.data_a[i] = error_color_nan(); + blk.rgb_lns[i] = 0; + blk.alpha_lns[i] = 0; + } + + return; + } + + if ((scb.block_type == SYM_BTYPE_CONST_F16) || + (scb.block_type == SYM_BTYPE_CONST_U16)) + { + vfloat4 color; + uint8_t use_lns = 0; + + // UNORM16 constant color block + if (scb.block_type == SYM_BTYPE_CONST_U16) + { + vint4 colori(scb.constant_color); + + // Determine the UNORM8 rounding on the decode + vmask4 u8_mask = get_u8_component_mask(decode_mode, blk); + + // The real decoder would just use the top 8 bits, but we rescale + // in to a 16-bit value that rounds correctly. + vint4 colori_u8 = asr<8>(colori) * 257; + colori = select(colori, colori_u8, u8_mask); + + vint4 colorf16 = unorm16_to_sf16(colori); + color = float16_to_float(colorf16); + } + // FLOAT16 constant color block + else + { + switch (decode_mode) + { + case ASTCENC_PRF_LDR_SRGB: + case ASTCENC_PRF_LDR: + color = vfloat4(error_color_nan()); + break; + case ASTCENC_PRF_HDR_RGB_LDR_A: + case ASTCENC_PRF_HDR: + // Constant-color block; unpack from FP16 to FP32. + color = float16_to_float(vint4(scb.constant_color)); + use_lns = 1; + break; + } + } + + for (unsigned int i = 0; i < bsd.texel_count; i++) + { + blk.data_r[i] = color.lane<0>(); + blk.data_g[i] = color.lane<1>(); + blk.data_b[i] = color.lane<2>(); + blk.data_a[i] = color.lane<3>(); + blk.rgb_lns[i] = use_lns; + blk.alpha_lns[i] = use_lns; + } + + return; + } + + // Get the appropriate partition-table entry + int partition_count = scb.partition_count; + const auto& pi = bsd.get_partition_info(partition_count, scb.partition_index); + + // Get the appropriate block descriptors + const auto& bm = bsd.get_block_mode(scb.block_mode); + const auto& di = bsd.get_decimation_info(bm.decimation_mode); + + bool is_dual_plane = static_cast(bm.is_dual_plane); + + // Unquantize and undecimate the weights + int plane1_weights[BLOCK_MAX_TEXELS]; + int plane2_weights[BLOCK_MAX_TEXELS]; + unpack_weights(bsd, scb, di, is_dual_plane, plane1_weights, plane2_weights); + + // Now that we have endpoint colors and weights, we can unpack texel colors + int plane2_component = scb.plane2_component; + vmask4 plane2_mask = vint4::lane_id() == vint4(plane2_component); + + vmask4 u8_mask = get_u8_component_mask(decode_mode, blk); + + for (int i = 0; i < partition_count; i++) + { + // Decode the color endpoints for this partition + vint4 ep0; + vint4 ep1; + bool rgb_lns; + bool a_lns; + + unpack_color_endpoints(decode_mode, + scb.color_formats[i], + scb.color_values[i], + rgb_lns, a_lns, + ep0, ep1); + + vmask4 lns_mask(rgb_lns, rgb_lns, rgb_lns, a_lns); + + int texel_count = pi.partition_texel_count[i]; + for (int j = 0; j < texel_count; j++) + { + int tix = pi.texels_of_partition[i][j]; + vint4 weight = select(vint4(plane1_weights[tix]), vint4(plane2_weights[tix]), plane2_mask); + vint4 color = lerp_color_int(u8_mask, ep0, ep1, weight); + vfloat4 colorf = decode_texel(color, lns_mask); + + blk.data_r[tix] = colorf.lane<0>(); + blk.data_g[tix] = colorf.lane<1>(); + blk.data_b[tix] = colorf.lane<2>(); + blk.data_a[tix] = colorf.lane<3>(); + } + } +} + +#if !defined(ASTCENC_DECOMPRESS_ONLY) + +/* See header for documentation. */ +float compute_symbolic_block_difference_2plane( + const astcenc_config& config, + const block_size_descriptor& bsd, + const symbolic_compressed_block& scb, + const image_block& blk +) { + // If we detected an error-block, blow up immediately. + if (scb.block_type == SYM_BTYPE_ERROR) + { + return ERROR_CALC_DEFAULT; + } + + assert(scb.block_mode >= 0); + assert(scb.partition_count == 1); + assert(bsd.get_block_mode(scb.block_mode).is_dual_plane == 1); + + // Get the appropriate block descriptor + const block_mode& bm = bsd.get_block_mode(scb.block_mode); + const decimation_info& di = bsd.get_decimation_info(bm.decimation_mode); + + // Unquantize and undecimate the weights + int plane1_weights[BLOCK_MAX_TEXELS]; + int plane2_weights[BLOCK_MAX_TEXELS]; + unpack_weights(bsd, scb, di, true, plane1_weights, plane2_weights); + + vmask4 plane2_mask = vint4::lane_id() == vint4(scb.plane2_component); + + vfloat4 summa = vfloat4::zero(); + + // Decode the color endpoints for this partition + vint4 ep0; + vint4 ep1; + bool rgb_lns; + bool a_lns; + + unpack_color_endpoints(config.profile, + scb.color_formats[0], + scb.color_values[0], + rgb_lns, a_lns, + ep0, ep1); + + vmask4 u8_mask = get_u8_component_mask(config.profile, blk); + + // Unpack and compute error for each texel in the partition + unsigned int texel_count = bsd.texel_count; + for (unsigned int i = 0; i < texel_count; i++) + { + vint4 weight = select(vint4(plane1_weights[i]), vint4(plane2_weights[i]), plane2_mask); + vint4 colori = lerp_color_int(u8_mask, ep0, ep1, weight); + + vfloat4 color = int_to_float(colori); + vfloat4 oldColor = blk.texel(i); + + // Compare error using a perceptual decode metric for RGBM textures + if (config.flags & ASTCENC_FLG_MAP_RGBM) + { + // Fail encodings that result in zero weight M pixels. Note that this can cause + // "interesting" artifacts if we reject all useful encodings - we typically get max + // brightness encodings instead which look just as bad. We recommend users apply a + // bias to their stored M value, limiting the lower value to 16 or 32 to avoid + // getting small M values post-quantization, but we can't prove it would never + // happen, especially at low bit rates ... + if (color.lane<3>() == 0.0f) + { + return -ERROR_CALC_DEFAULT; + } + + // Compute error based on decoded RGBM color + color = vfloat4( + color.lane<0>() * color.lane<3>() * config.rgbm_m_scale, + color.lane<1>() * color.lane<3>() * config.rgbm_m_scale, + color.lane<2>() * color.lane<3>() * config.rgbm_m_scale, + 1.0f + ); + + oldColor = vfloat4( + oldColor.lane<0>() * oldColor.lane<3>() * config.rgbm_m_scale, + oldColor.lane<1>() * oldColor.lane<3>() * config.rgbm_m_scale, + oldColor.lane<2>() * oldColor.lane<3>() * config.rgbm_m_scale, + 1.0f + ); + } + + vfloat4 error = oldColor - color; + error = min(abs(error), 1e15f); + error = error * error; + + summa += min(dot(error, blk.channel_weight), ERROR_CALC_DEFAULT); + } + + return summa.lane<0>(); +} + +/* See header for documentation. */ +float compute_symbolic_block_difference_1plane( + const astcenc_config& config, + const block_size_descriptor& bsd, + const symbolic_compressed_block& scb, + const image_block& blk +) { + assert(bsd.get_block_mode(scb.block_mode).is_dual_plane == 0); + + // If we detected an error-block, blow up immediately. + if (scb.block_type == SYM_BTYPE_ERROR) + { + return ERROR_CALC_DEFAULT; + } + + assert(scb.block_mode >= 0); + + // Get the appropriate partition-table entry + unsigned int partition_count = scb.partition_count; + const auto& pi = bsd.get_partition_info(partition_count, scb.partition_index); + + // Get the appropriate block descriptor + const block_mode& bm = bsd.get_block_mode(scb.block_mode); + const decimation_info& di = bsd.get_decimation_info(bm.decimation_mode); + + // Unquantize and undecimate the weights + int plane1_weights[BLOCK_MAX_TEXELS]; + unpack_weights(bsd, scb, di, false, plane1_weights, nullptr); + + vmask4 u8_mask = get_u8_component_mask(config.profile, blk); + + vfloat4 summa = vfloat4::zero(); + for (unsigned int i = 0; i < partition_count; i++) + { + // Decode the color endpoints for this partition + vint4 ep0; + vint4 ep1; + bool rgb_lns; + bool a_lns; + + unpack_color_endpoints(config.profile, + scb.color_formats[i], + scb.color_values[i], + rgb_lns, a_lns, + ep0, ep1); + + // Unpack and compute error for each texel in the partition + unsigned int texel_count = pi.partition_texel_count[i]; + for (unsigned int j = 0; j < texel_count; j++) + { + unsigned int tix = pi.texels_of_partition[i][j]; + vint4 colori = lerp_color_int(u8_mask, ep0, ep1, + vint4(plane1_weights[tix])); + + vfloat4 color = int_to_float(colori); + vfloat4 oldColor = blk.texel(tix); + + // Compare error using a perceptual decode metric for RGBM textures + if (config.flags & ASTCENC_FLG_MAP_RGBM) + { + // Fail encodings that result in zero weight M pixels. Note that this can cause + // "interesting" artifacts if we reject all useful encodings - we typically get max + // brightness encodings instead which look just as bad. We recommend users apply a + // bias to their stored M value, limiting the lower value to 16 or 32 to avoid + // getting small M values post-quantization, but we can't prove it would never + // happen, especially at low bit rates ... + if (color.lane<3>() == 0.0f) + { + return -ERROR_CALC_DEFAULT; + } + + // Compute error based on decoded RGBM color + color = vfloat4( + color.lane<0>() * color.lane<3>() * config.rgbm_m_scale, + color.lane<1>() * color.lane<3>() * config.rgbm_m_scale, + color.lane<2>() * color.lane<3>() * config.rgbm_m_scale, + 1.0f + ); + + oldColor = vfloat4( + oldColor.lane<0>() * oldColor.lane<3>() * config.rgbm_m_scale, + oldColor.lane<1>() * oldColor.lane<3>() * config.rgbm_m_scale, + oldColor.lane<2>() * oldColor.lane<3>() * config.rgbm_m_scale, + 1.0f + ); + } + + vfloat4 error = oldColor - color; + error = min(abs(error), 1e15f); + error = error * error; + + summa += min(dot(error, blk.channel_weight), ERROR_CALC_DEFAULT); + } + } + + return summa.lane<0>(); +} + +/* See header for documentation. */ +float compute_symbolic_block_difference_1plane_1partition( + const astcenc_config& config, + const block_size_descriptor& bsd, + const symbolic_compressed_block& scb, + const image_block& blk +) { + // If we detected an error-block, blow up immediately. + if (scb.block_type == SYM_BTYPE_ERROR) + { + return ERROR_CALC_DEFAULT; + } + + assert(scb.block_mode >= 0); + assert(bsd.get_partition_info(scb.partition_count, scb.partition_index).partition_count == 1); + + // Get the appropriate block descriptor + const block_mode& bm = bsd.get_block_mode(scb.block_mode); + const decimation_info& di = bsd.get_decimation_info(bm.decimation_mode); + + // Unquantize and undecimate the weights + ASTCENC_ALIGNAS int plane1_weights[BLOCK_MAX_TEXELS]; + unpack_weights(bsd, scb, di, false, plane1_weights, nullptr); + + // Decode the color endpoints for this partition + vint4 ep0; + vint4 ep1; + bool rgb_lns; + bool a_lns; + + unpack_color_endpoints(config.profile, + scb.color_formats[0], + scb.color_values[0], + rgb_lns, a_lns, + ep0, ep1); + + vmask4 u8_mask = get_u8_component_mask(config.profile, blk); + + // Unpack and compute error for each texel in the partition + vfloatacc summav = vfloatacc::zero(); + + vint lane_id = vint::lane_id(); + + unsigned int texel_count = bsd.texel_count; + for (unsigned int i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + // Compute EP1 contribution + vint weight1 = vint::loada(plane1_weights + i); + vint ep1_r = vint(ep1.lane<0>()) * weight1; + vint ep1_g = vint(ep1.lane<1>()) * weight1; + vint ep1_b = vint(ep1.lane<2>()) * weight1; + vint ep1_a = vint(ep1.lane<3>()) * weight1; + + // Compute EP0 contribution + vint weight0 = vint(64) - weight1; + vint ep0_r = vint(ep0.lane<0>()) * weight0; + vint ep0_g = vint(ep0.lane<1>()) * weight0; + vint ep0_b = vint(ep0.lane<2>()) * weight0; + vint ep0_a = vint(ep0.lane<3>()) * weight0; + + // Combine contributions + vint colori_r = asr<6>(ep0_r + ep1_r + vint(32)); + vint colori_g = asr<6>(ep0_g + ep1_g + vint(32)); + vint colori_b = asr<6>(ep0_b + ep1_b + vint(32)); + vint colori_a = asr<6>(ep0_a + ep1_a + vint(32)); + + // If using a U8 decode mode bit replicate top 8 bits + // so rest of codec can assume 0xFFFF max range everywhere + vint colori_r8 = asr<8>(colori_r) * vint(257); + colori_r = select(colori_r, colori_r8, vmask(u8_mask.lane<0>())); + + vint colori_g8 = asr<8>(colori_g) * vint(257); + colori_g = select(colori_g, colori_g8, vmask(u8_mask.lane<1>())); + + vint colori_b8 = asr<8>(colori_b) * vint(257); + colori_b = select(colori_b, colori_b8, vmask(u8_mask.lane<2>())); + + vint colori_a8 = asr<8>(colori_a) * vint(257); + colori_a = select(colori_a, colori_a8, vmask(u8_mask.lane<3>())); + + // Compute color diff + vfloat color_r = int_to_float(colori_r); + vfloat color_g = int_to_float(colori_g); + vfloat color_b = int_to_float(colori_b); + vfloat color_a = int_to_float(colori_a); + + vfloat color_orig_r = loada(blk.data_r + i); + vfloat color_orig_g = loada(blk.data_g + i); + vfloat color_orig_b = loada(blk.data_b + i); + vfloat color_orig_a = loada(blk.data_a + i); + + vfloat color_error_r = min(abs(color_orig_r - color_r), vfloat(1e15f)); + vfloat color_error_g = min(abs(color_orig_g - color_g), vfloat(1e15f)); + vfloat color_error_b = min(abs(color_orig_b - color_b), vfloat(1e15f)); + vfloat color_error_a = min(abs(color_orig_a - color_a), vfloat(1e15f)); + + // Compute squared error metric + color_error_r = color_error_r * color_error_r; + color_error_g = color_error_g * color_error_g; + color_error_b = color_error_b * color_error_b; + color_error_a = color_error_a * color_error_a; + + vfloat metric = color_error_r * blk.channel_weight.lane<0>() + + color_error_g * blk.channel_weight.lane<1>() + + color_error_b * blk.channel_weight.lane<2>() + + color_error_a * blk.channel_weight.lane<3>(); + + // Mask off bad lanes + vmask mask = lane_id < vint(texel_count); + lane_id += vint(ASTCENC_SIMD_WIDTH); + haccumulate(summav, metric, mask); + } + + return hadd_s(summav); +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.cpp b/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.cpp new file mode 100644 index 0000000..bcd6fa7 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.cpp @@ -0,0 +1,245 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2021-2023 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for the library entrypoint. + */ + +#if defined(ASTCENC_DIAGNOSTICS) + +#include +#include +#include +#include +#include +#include + +#include "astcenc_diagnostic_trace.h" + +/** @brief The global trace logger. */ +static TraceLog* g_TraceLog = nullptr; + +/** @brief The JSON indentation level. */ +static const size_t g_trace_indent = 2; + +TraceLog::TraceLog( + const char* file_name): + m_file(file_name, std::ofstream::out | std::ofstream::binary) +{ + assert(!g_TraceLog); + g_TraceLog = this; + m_root = new TraceNode("root"); +} + +/* See header for documentation. */ +TraceNode* TraceLog::get_current_leaf() +{ + if (m_stack.size()) + { + return m_stack.back(); + } + + return nullptr; +} + +/* See header for documentation. */ +size_t TraceLog::get_depth() +{ + return m_stack.size(); +} + +/* See header for documentation. */ +TraceLog::~TraceLog() +{ + assert(g_TraceLog == this); + delete m_root; + g_TraceLog = nullptr; +} + +/* See header for documentation. */ +TraceNode::TraceNode( + const char* format, + ... +) { + // Format the name string + constexpr size_t bufsz = 256; + char buffer[bufsz]; + + va_list args; + va_start (args, format); + vsnprintf (buffer, bufsz, format, args); + va_end (args); + + // Guarantee there is a nul terminator + buffer[bufsz - 1] = 0; + + // Generate the node + TraceNode* parent = g_TraceLog->get_current_leaf(); + size_t depth = g_TraceLog->get_depth(); + g_TraceLog->m_stack.push_back(this); + + bool comma = parent && parent->m_attrib_count; + auto& out = g_TraceLog->m_file; + + if (parent) + { + parent->m_attrib_count++; + } + + if (comma) + { + out << ','; + } + + if (depth) + { + out << '\n'; + } + + size_t out_indent = (depth * 2) * g_trace_indent; + size_t in_indent = (depth * 2 + 1) * g_trace_indent; + + std::string out_indents(""); + if (out_indent) + { + out_indents = std::string(out_indent, ' '); + } + + std::string in_indents(in_indent, ' '); + + out << out_indents << "[ \"node\", \"" << buffer << "\",\n"; + out << in_indents << "["; +} + +/* See header for documentation. */ +void TraceNode::add_attrib( + std::string type, + std::string key, + std::string value +) { + (void)type; + + size_t depth = g_TraceLog->get_depth(); + size_t indent = (depth * 2) * g_trace_indent; + auto& out = g_TraceLog->m_file; + bool comma = m_attrib_count; + m_attrib_count++; + + if (comma) + { + out << ','; + } + + out << '\n'; + out << std::string(indent, ' ') << "[ " + << "\"" << key << "\", " + << value << " ]"; +} + +/* See header for documentation. */ +TraceNode::~TraceNode() +{ + g_TraceLog->m_stack.pop_back(); + + auto& out = g_TraceLog->m_file; + size_t depth = g_TraceLog->get_depth(); + size_t out_indent = (depth * 2) * g_trace_indent; + size_t in_indent = (depth * 2 + 1) * g_trace_indent; + + std::string out_indents(""); + if (out_indent) + { + out_indents = std::string(out_indent, ' '); + } + + std::string in_indents(in_indent, ' '); + + if (m_attrib_count) + { + out << "\n" << in_indents; + } + out << "]\n"; + + out << out_indents << "]"; +} + +/* See header for documentation. */ +void trace_add_data( + const char* key, + const char* format, + ... +) { + constexpr size_t bufsz = 256; + char buffer[bufsz]; + + va_list args; + va_start (args, format); + vsnprintf (buffer, bufsz, format, args); + va_end (args); + + // Guarantee there is a nul terminator + buffer[bufsz - 1] = 0; + + std::string value = "\"" + std::string(buffer) + "\""; + + TraceNode* node = g_TraceLog->get_current_leaf(); + node->add_attrib("str", key, value); +} + +/* See header for documentation. */ +void trace_add_data( + const char* key, + float value +) { + // Turn infinities into parseable values + if (std::isinf(value)) + { + if (value > 0.0f) + { + value = std::numeric_limits::max(); + } + else + { + value = -std::numeric_limits::max(); + } + } + + char buffer[256]; + sprintf(buffer, "%.20g", (double)value); + TraceNode* node = g_TraceLog->get_current_leaf(); + node->add_attrib("float", key, buffer); +} + +/* See header for documentation. */ +void trace_add_data( + const char* key, + int value +) { + TraceNode* node = g_TraceLog->get_current_leaf(); + node->add_attrib("int", key, std::to_string(value)); +} + +/* See header for documentation. */ +void trace_add_data( + const char* key, + unsigned int value +) { + TraceNode* node = g_TraceLog->get_current_leaf(); + node->add_attrib("int", key, std::to_string(value)); +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.h b/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.h new file mode 100644 index 0000000..f5586b0 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_diagnostic_trace.h @@ -0,0 +1,219 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2021-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. +// ---------------------------------------------------------------------------- + +/** + * @brief This module provides a set of diagnostic tracing utilities. + * + * Overview + * ======== + * + * The built-in diagnostic trace tool generates a hierarchical JSON tree structure. The tree + * hierarchy contains three levels: + * + * - block + * - pass + * - candidate + * + * One block node exists for each compressed block in the image. One pass node exists for each major + * pass (N partition, M planes, O components) applied to a block. One candidate node exists for each + * encoding candidate trialed for a pass. + * + * Each node contains both the hierarchy but also a number of attributes which explain the behavior. + * For example, the block node contains the block coordinates in the image, the pass explains the + * pass configuration, and the candidate will explain the candidate encoding such as weight + * decimation, refinement error, etc. + * + * Trace Nodes are designed as scope-managed C++ objects with stack-like push/pop behavior. + * Constructing a trace node on the stack will automatically add it to the current node as a child, + * and then make it the current node. Destroying the current node will pop the stack and set the + * parent to the current node. This provides a robust mechanism for ensuring reliable nesting in the + * tree structure. + * + * A set of utility macros are provided to add attribute annotations to the current trace node. + * + * Usage + * ===== + * + * Create Trace Nodes on the stack using the @c TRACE_NODE() macro. This will compile-out completely + * in builds with diagnostics disabled. + * + * Add annotations to the current trace node using the @c trace_add_data() macro. This will + * similarly compile out completely in builds with diagnostics disabled. + * + * If you need to add additional code to support diagnostics-only behavior wrap + * it in preprocessor guards: + * + * #if defined(ASTCENC_DIAGNOSTICS) + * #endif + */ + +#ifndef ASTCENC_DIAGNOSTIC_TRACE_INCLUDED +#define ASTCENC_DIAGNOSTIC_TRACE_INCLUDED + +#if defined(ASTCENC_DIAGNOSTICS) + +#include +#include +#include + +/** + * @brief Class representing a single node in the trace hierarchy. + */ +class TraceNode +{ +public: + /** + * @brief Construct a new node. + * + * Constructing a node will push to the the top of the stack, automatically making it a child of + * the current node, and then setting it to become the current node. + * + * @param format The format template for the node name. + * @param ... The format parameters. + */ + TraceNode(const char* format, ...); + + /** + * @brief Add an attribute to this node. + * + * Note that no quoting is applied to the @c value, so if quoting is needed it must be done by + * the caller. + * + * @param type The type of the attribute. + * @param key The key of the attribute. + * @param value The value of the attribute. + */ + void add_attrib(std::string type, std::string key, std::string value); + + /** + * @brief Destroy this node. + * + * Destroying a node will pop it from the top of the stack, making its parent the current node. + * It is invalid behavior to destroy a node that is not the current node; usage must conform to + * stack push-pop semantics. + */ + ~TraceNode(); + + /** + * @brief The number of attributes and child nodes in this node. + */ + unsigned int m_attrib_count { 0 }; +}; + +/** + * @brief Class representing the trace log file being written. + */ +class TraceLog +{ +public: + /** + * @brief Create a new trace log. + * + * The trace log is global; there can be only one at a time. + * + * @param file_name The name of the file to write. + */ + TraceLog(const char* file_name); + + /** + * @brief Detroy the trace log. + * + * Trace logs MUST be cleanly destroyed to ensure the file gets written. + */ + ~TraceLog(); + + /** + * @brief Get the current child node. + * + * @return The current leaf node. + */ + TraceNode* get_current_leaf(); + + /** + * @brief Get the stack depth of the current child node. + * + * @return The current leaf node stack depth. + */ + size_t get_depth(); + + /** + * @brief The file stream to write to. + */ + std::ofstream m_file; + + /** + * @brief The stack of nodes (newest at the back). + */ + std::vector m_stack; + +private: + /** + * @brief The root node in the JSON file. + */ + TraceNode* m_root; +}; + +/** + * @brief Utility macro to create a trace node on the stack. + * + * @param name The variable name to use. + * @param ... The name template and format parameters. + */ +#define TRACE_NODE(name, ...) TraceNode name(__VA_ARGS__); + +/** + * @brief Add a string annotation to the current node. + * + * @param key The name of the attribute. + * @param format The format template for the attribute value. + * @param ... The format parameters. + */ +void trace_add_data(const char* key, const char* format, ...); + +/** + * @brief Add a float annotation to the current node. + * + * @param key The name of the attribute. + * @param value The value of the attribute. + */ +void trace_add_data(const char* key, float value); + +/** + * @brief Add an integer annotation to the current node. + * + * @param key The name of the attribute. + * @param value The value of the attribute. + */ +void trace_add_data(const char* key, int value); + +/** + * @brief Add an unsigned integer annotation to the current node. + * + * @param key The name of the attribute. + * @param value The value of the attribute. + */ +void trace_add_data(const char* key, unsigned int value); + +#else + +#define TRACE_NODE(name, ...) + +#define trace_add_data(...) + +#endif + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_entry.cpp b/ktx/external/astc-encoder/Source/astcenc_entry.cpp new file mode 100644 index 0000000..4023797 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_entry.cpp @@ -0,0 +1,1413 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2025 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for the library entrypoint. + */ + +#include +#include +#include + +#include "astcenc.h" +#include "astcenc_internal_entry.h" +#include "astcenc_diagnostic_trace.h" + +/** + * @brief Record of the quality tuning parameter values. + * + * See the @c astcenc_config structure for detailed parameter documentation. + * + * Note that the mse_overshoot entries are scaling factors relative to the base MSE to hit db_limit. + * A 20% overshoot is harder to hit for a higher base db_limit, so we may actually use lower ratios + * for the more through search presets because the underlying db_limit is so much higher. + */ +struct astcenc_preset_config +{ + float quality; + unsigned int tune_partition_count_limit; + unsigned int tune_2partition_index_limit; + unsigned int tune_3partition_index_limit; + unsigned int tune_4partition_index_limit; + unsigned int tune_block_mode_limit; + unsigned int tune_refinement_limit; + unsigned int tune_candidate_limit; + unsigned int tune_2partitioning_candidate_limit; + unsigned int tune_3partitioning_candidate_limit; + unsigned int tune_4partitioning_candidate_limit; + float tune_db_limit_a_base; + float tune_db_limit_b_base; + float tune_mse_overshoot; + float tune_2partition_early_out_limit_factor; + float tune_3partition_early_out_limit_factor; + float tune_2plane_early_out_limit_correlation; + float tune_search_mode0_enable; +}; + +/** + * @brief The static presets for high bandwidth encodings (x < 25 texels per block). + */ +static const std::array preset_configs_high {{ + { + ASTCENC_PRE_FASTEST, + 2, 10, 6, 4, 43, 2, 2, 2, 2, 2, 85.2f, 63.2f, 3.5f, 1.0f, 1.0f, 0.85f, 0.0f + }, { + ASTCENC_PRE_FAST, + 3, 18, 10, 8, 55, 3, 3, 2, 2, 2, 85.2f, 63.2f, 3.5f, 1.0f, 1.0f, 0.90f, 0.0f + }, { + ASTCENC_PRE_MEDIUM, + 4, 34, 28, 16, 77, 3, 3, 2, 2, 2, 95.0f, 70.0f, 2.5f, 1.1f, 1.05f, 0.95f, 0.0f + }, { + ASTCENC_PRE_THOROUGH, + 4, 82, 60, 30, 94, 4, 4, 3, 2, 2, 105.0f, 77.0f, 10.0f, 1.35f, 1.15f, 0.97f, 0.0f + }, { + ASTCENC_PRE_VERYTHOROUGH, + 4, 256, 128, 64, 98, 4, 6, 8, 6, 4, 200.0f, 200.0f, 10.0f, 1.6f, 1.4f, 0.98f, 0.0f + }, { + ASTCENC_PRE_EXHAUSTIVE, + 4, 512, 512, 512, 100, 4, 8, 8, 8, 8, 200.0f, 200.0f, 10.0f, 2.0f, 2.0f, 0.99f, 0.0f + } +}}; + +/** + * @brief The static presets for medium bandwidth encodings (25 <= x < 64 texels per block). + */ +static const std::array preset_configs_mid {{ + { + ASTCENC_PRE_FASTEST, + 2, 10, 6, 4, 43, 2, 2, 2, 2, 2, 85.2f, 63.2f, 3.5f, 1.0f, 1.0f, 0.80f, 1.0f + }, { + ASTCENC_PRE_FAST, + 3, 18, 12, 10, 55, 3, 3, 2, 2, 2, 85.2f, 63.2f, 3.5f, 1.0f, 1.0f, 0.85f, 1.0f + }, { + ASTCENC_PRE_MEDIUM, + 3, 34, 28, 16, 77, 3, 3, 2, 2, 2, 95.0f, 70.0f, 3.0f, 1.1f, 1.05f, 0.90f, 1.0f + }, { + ASTCENC_PRE_THOROUGH, + 4, 82, 60, 30, 94, 4, 4, 3, 2, 2, 105.0f, 77.0f, 10.0f, 1.4f, 1.2f, 0.95f, 0.0f + }, { + ASTCENC_PRE_VERYTHOROUGH, + 4, 256, 128, 64, 98, 4, 6, 8, 6, 3, 200.0f, 200.0f, 10.0f, 1.6f, 1.4f, 0.98f, 0.0f + }, { + ASTCENC_PRE_EXHAUSTIVE, + 4, 256, 256, 256, 100, 4, 8, 8, 8, 8, 200.0f, 200.0f, 10.0f, 2.0f, 2.0f, 0.99f, 0.0f + } +}}; + +/** + * @brief The static presets for low bandwidth encodings (64 <= x texels per block). + */ +static const std::array preset_configs_low {{ + { + ASTCENC_PRE_FASTEST, + 2, 10, 6, 4, 40, 2, 2, 2, 2, 2, 85.0f, 63.0f, 3.5f, 1.0f, 1.0f, 0.80f, 1.0f + }, { + ASTCENC_PRE_FAST, + 2, 18, 12, 10, 55, 3, 3, 2, 2, 2, 85.0f, 63.0f, 3.5f, 1.0f, 1.0f, 0.85f, 1.0f + }, { + ASTCENC_PRE_MEDIUM, + 3, 34, 28, 16, 77, 3, 3, 2, 2, 2, 95.0f, 70.0f, 3.5f, 1.1f, 1.05f, 0.90f, 1.0f + }, { + ASTCENC_PRE_THOROUGH, + 4, 82, 60, 30, 93, 4, 4, 3, 2, 2, 105.0f, 77.0f, 10.0f, 1.3f, 1.2f, 0.97f, 1.0f + }, { + ASTCENC_PRE_VERYTHOROUGH, + 4, 256, 128, 64, 98, 4, 6, 8, 5, 2, 200.0f, 200.0f, 10.0f, 1.6f, 1.4f, 0.98f, 1.0f + }, { + ASTCENC_PRE_EXHAUSTIVE, + 4, 256, 256, 256, 100, 4, 8, 8, 8, 8, 200.0f, 200.0f, 10.0f, 2.0f, 2.0f, 0.99f, 1.0f + } +}}; + +/** + * @brief Validate CPU floating point meets assumptions made in the codec. + * + * The codec is written with the assumption that a float threaded through the @c if32 union will be + * stored and reloaded as a 32-bit IEEE-754 float with round-to-nearest rounding. This is always the + * case in an IEEE-754 compliant system, however not every system or compilation mode is actually + * IEEE-754 compliant. This normally fails if the code is compiled with fast math enabled. + * + * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. + */ +static astcenc_error validate_cpu_float() +{ + if32 p; + volatile float xprec_testval = 2.51f; + p.f = xprec_testval + 12582912.0f; + float q = p.f - 12582912.0f; + + if (q != 3.0f) + { + return ASTCENC_ERR_BAD_CPU_FLOAT; + } + + return ASTCENC_SUCCESS; +} + +/** + * @brief Validate config profile. + * + * @param profile The profile to check. + * + * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. + */ +static astcenc_error validate_profile( + astcenc_profile profile +) { + // Values in this enum are from an external user, so not guaranteed to be + // bounded to the enum values + switch (static_cast(profile)) + { + case ASTCENC_PRF_LDR_SRGB: + case ASTCENC_PRF_LDR: + case ASTCENC_PRF_HDR_RGB_LDR_A: + case ASTCENC_PRF_HDR: + return ASTCENC_SUCCESS; + default: + return ASTCENC_ERR_BAD_PROFILE; + } +} + +/** + * @brief Validate block size. + * + * @param block_x The block x dimensions. + * @param block_y The block y dimensions. + * @param block_z The block z dimensions. + * + * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. + */ +static astcenc_error validate_block_size( + unsigned int block_x, + unsigned int block_y, + unsigned int block_z +) { + // Test if this is a legal block size at all + bool is_legal = (((block_z <= 1) && is_legal_2d_block_size(block_x, block_y)) || + ((block_z >= 2) && is_legal_3d_block_size(block_x, block_y, block_z))); + if (!is_legal) + { + return ASTCENC_ERR_BAD_BLOCK_SIZE; + } + + // Test if this build has sufficient capacity for this block size + bool have_capacity = (block_x * block_y * block_z) <= BLOCK_MAX_TEXELS; + if (!have_capacity) + { + return ASTCENC_ERR_NOT_IMPLEMENTED; + } + + return ASTCENC_SUCCESS; +} + +/** + * @brief Validate flags. + * + * @param profile The profile to check. + * @param flags The flags to check. + * + * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. + */ +static astcenc_error validate_flags( + astcenc_profile profile, + unsigned int flags +) { + // Flags field must not contain any unknown flag bits + unsigned int exMask = ~ASTCENC_ALL_FLAGS; + if (popcount(flags & exMask) != 0) + { + return ASTCENC_ERR_BAD_FLAGS; + } + + // Flags field must only contain at most a single map type + exMask = ASTCENC_FLG_MAP_NORMAL + | ASTCENC_FLG_MAP_RGBM; + if (popcount(flags & exMask) > 1) + { + return ASTCENC_ERR_BAD_FLAGS; + } + + // Decode_unorm8 must only be used with an LDR profile + bool is_unorm8 = flags & ASTCENC_FLG_USE_DECODE_UNORM8; + bool is_hdr = (profile == ASTCENC_PRF_HDR) || (profile == ASTCENC_PRF_HDR_RGB_LDR_A); + if (is_unorm8 && is_hdr) + { + return ASTCENC_ERR_BAD_DECODE_MODE; + } + + return ASTCENC_SUCCESS; +} + +#if !defined(ASTCENC_DECOMPRESS_ONLY) + +/** + * @brief Validate single channel compression swizzle. + * + * @param swizzle The swizzle to check. + * + * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. + */ +static astcenc_error validate_compression_swz( + astcenc_swz swizzle +) { + // Not all enum values are handled; SWZ_Z is invalid for compression + switch (static_cast(swizzle)) + { + case ASTCENC_SWZ_R: + case ASTCENC_SWZ_G: + case ASTCENC_SWZ_B: + case ASTCENC_SWZ_A: + case ASTCENC_SWZ_0: + case ASTCENC_SWZ_1: + return ASTCENC_SUCCESS; + default: + return ASTCENC_ERR_BAD_SWIZZLE; + } +} + +/** + * @brief Validate overall compression swizzle. + * + * @param swizzle The swizzle to check. + * + * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. + */ +static astcenc_error validate_compression_swizzle( + const astcenc_swizzle& swizzle +) { + if (validate_compression_swz(swizzle.r) || + validate_compression_swz(swizzle.g) || + validate_compression_swz(swizzle.b) || + validate_compression_swz(swizzle.a)) + { + return ASTCENC_ERR_BAD_SWIZZLE; + } + + return ASTCENC_SUCCESS; +} +#endif + +/** + * @brief Validate single channel decompression swizzle. + * + * @param swizzle The swizzle to check. + * + * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. + */ +static astcenc_error validate_decompression_swz( + astcenc_swz swizzle +) { + // Values in this enum are from an external user, so not guaranteed to be + // bounded to the enum values + switch (static_cast(swizzle)) + { + case ASTCENC_SWZ_R: + case ASTCENC_SWZ_G: + case ASTCENC_SWZ_B: + case ASTCENC_SWZ_A: + case ASTCENC_SWZ_0: + case ASTCENC_SWZ_1: + case ASTCENC_SWZ_Z: + return ASTCENC_SUCCESS; + default: + return ASTCENC_ERR_BAD_SWIZZLE; + } +} + +/** + * @brief Validate overall decompression swizzle. + * + * @param swizzle The swizzle to check. + * + * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. + */ +static astcenc_error validate_decompression_swizzle( + const astcenc_swizzle& swizzle +) { + if (validate_decompression_swz(swizzle.r) || + validate_decompression_swz(swizzle.g) || + validate_decompression_swz(swizzle.b) || + validate_decompression_swz(swizzle.a)) + { + return ASTCENC_ERR_BAD_SWIZZLE; + } + + return ASTCENC_SUCCESS; +} + +/** + * Validate that an incoming configuration is in-spec. + * + * This function can respond in two ways: + * + * * Numerical inputs that have valid ranges are clamped to those valid ranges. No error is thrown + * for out-of-range inputs in this case. + * * Numerical inputs and logic inputs are are logically invalid and which make no sense + * algorithmically will return an error. + * + * @param[in,out] config The input compressor configuration. + * + * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. + */ +static astcenc_error validate_config( + astcenc_config &config +) { + astcenc_error status; + + status = validate_profile(config.profile); + if (status != ASTCENC_SUCCESS) + { + return status; + } + + status = validate_flags(config.profile, config.flags); + if (status != ASTCENC_SUCCESS) + { + return status; + } + + status = validate_block_size(config.block_x, config.block_y, config.block_z); + if (status != ASTCENC_SUCCESS) + { + return status; + } + +#if defined(ASTCENC_DECOMPRESS_ONLY) + // Decompress-only builds only support decompress-only contexts + if (!(config.flags & ASTCENC_FLG_DECOMPRESS_ONLY)) + { + return ASTCENC_ERR_BAD_PARAM; + } +#endif + + config.rgbm_m_scale = astc::max(config.rgbm_m_scale, 1.0f); + + config.tune_partition_count_limit = astc::clamp(config.tune_partition_count_limit, 1u, 4u); + config.tune_2partition_index_limit = astc::clamp(config.tune_2partition_index_limit, 1u, BLOCK_MAX_PARTITIONINGS); + config.tune_3partition_index_limit = astc::clamp(config.tune_3partition_index_limit, 1u, BLOCK_MAX_PARTITIONINGS); + config.tune_4partition_index_limit = astc::clamp(config.tune_4partition_index_limit, 1u, BLOCK_MAX_PARTITIONINGS); + config.tune_block_mode_limit = astc::clamp(config.tune_block_mode_limit, 1u, 100u); + config.tune_refinement_limit = astc::max(config.tune_refinement_limit, 1u); + config.tune_candidate_limit = astc::clamp(config.tune_candidate_limit, 1u, TUNE_MAX_TRIAL_CANDIDATES); + config.tune_2partitioning_candidate_limit = astc::clamp(config.tune_2partitioning_candidate_limit, 1u, TUNE_MAX_PARTITIONING_CANDIDATES); + config.tune_3partitioning_candidate_limit = astc::clamp(config.tune_3partitioning_candidate_limit, 1u, TUNE_MAX_PARTITIONING_CANDIDATES); + config.tune_4partitioning_candidate_limit = astc::clamp(config.tune_4partitioning_candidate_limit, 1u, TUNE_MAX_PARTITIONING_CANDIDATES); + config.tune_db_limit = astc::max(config.tune_db_limit, 0.0f); + config.tune_mse_overshoot = astc::max(config.tune_mse_overshoot, 1.0f); + config.tune_2partition_early_out_limit_factor = astc::max(config.tune_2partition_early_out_limit_factor, 0.0f); + config.tune_3partition_early_out_limit_factor = astc::max(config.tune_3partition_early_out_limit_factor, 0.0f); + config.tune_2plane_early_out_limit_correlation = astc::max(config.tune_2plane_early_out_limit_correlation, 0.0f); + + // Specifying a zero weight color component is not allowed; force to small value + float max_weight = astc::max(astc::max(config.cw_r_weight, config.cw_g_weight), + astc::max(config.cw_b_weight, config.cw_a_weight)); + if (max_weight > 0.0f) + { + max_weight /= 1000.0f; + config.cw_r_weight = astc::max(config.cw_r_weight, max_weight); + config.cw_g_weight = astc::max(config.cw_g_weight, max_weight); + config.cw_b_weight = astc::max(config.cw_b_weight, max_weight); + config.cw_a_weight = astc::max(config.cw_a_weight, max_weight); + } + // If all color components error weights are zero then return an error + else + { + return ASTCENC_ERR_BAD_PARAM; + } + + return ASTCENC_SUCCESS; +} + +/* See header for documentation. */ +astcenc_error astcenc_config_init( + astcenc_profile profile, + unsigned int block_x, + unsigned int block_y, + unsigned int block_z, + float quality, + unsigned int flags, + astcenc_config* configp +) { + astcenc_error status; + + status = validate_cpu_float(); + if (status != ASTCENC_SUCCESS) + { + return status; + } + + // Zero init all config fields; although most of will be over written + astcenc_config& config = *configp; + std::memset(&config, 0, sizeof(config)); + + // Process the block size + block_z = astc::max(block_z, 1u); // For 2D blocks Z==0 is accepted, but convert to 1 + status = validate_block_size(block_x, block_y, block_z); + if (status != ASTCENC_SUCCESS) + { + return status; + } + + config.block_x = block_x; + config.block_y = block_y; + config.block_z = block_z; + + float texels = static_cast(block_x * block_y * block_z); + float ltexels = logf(texels) / logf(10.0f); + + // Process the performance quality level or preset; note that this must be done before we + // process any additional settings, such as color profile and flags, which may replace some of + // these settings with more use case tuned values + if (quality < ASTCENC_PRE_FASTEST || + quality > ASTCENC_PRE_EXHAUSTIVE) + { + return ASTCENC_ERR_BAD_QUALITY; + } + + static const std::array* preset_configs; + int texels_int = block_x * block_y * block_z; + if (texels_int < 25) + { + preset_configs = &preset_configs_high; + } + else if (texels_int < 64) + { + preset_configs = &preset_configs_mid; + } + else + { + preset_configs = &preset_configs_low; + } + + // Determine which preset to use, or which pair to interpolate + size_t start; + size_t end; + for (end = 0; end < preset_configs->size(); end++) + { + if ((*preset_configs)[end].quality >= quality) + { + break; + } + } + + start = end == 0 ? 0 : end - 1; + + // Start and end node are the same - so just transfer the values. + if (start == end) + { + config.tune_partition_count_limit = (*preset_configs)[start].tune_partition_count_limit; + config.tune_2partition_index_limit = (*preset_configs)[start].tune_2partition_index_limit; + config.tune_3partition_index_limit = (*preset_configs)[start].tune_3partition_index_limit; + config.tune_4partition_index_limit = (*preset_configs)[start].tune_4partition_index_limit; + config.tune_block_mode_limit = (*preset_configs)[start].tune_block_mode_limit; + config.tune_refinement_limit = (*preset_configs)[start].tune_refinement_limit; + config.tune_candidate_limit = (*preset_configs)[start].tune_candidate_limit; + config.tune_2partitioning_candidate_limit = (*preset_configs)[start].tune_2partitioning_candidate_limit; + config.tune_3partitioning_candidate_limit = (*preset_configs)[start].tune_3partitioning_candidate_limit; + config.tune_4partitioning_candidate_limit = (*preset_configs)[start].tune_4partitioning_candidate_limit; + config.tune_db_limit = astc::max((*preset_configs)[start].tune_db_limit_a_base - 35 * ltexels, + (*preset_configs)[start].tune_db_limit_b_base - 19 * ltexels); + + config.tune_mse_overshoot = (*preset_configs)[start].tune_mse_overshoot; + + config.tune_2partition_early_out_limit_factor = (*preset_configs)[start].tune_2partition_early_out_limit_factor; + config.tune_3partition_early_out_limit_factor = (*preset_configs)[start].tune_3partition_early_out_limit_factor; + config.tune_2plane_early_out_limit_correlation = (*preset_configs)[start].tune_2plane_early_out_limit_correlation; + config.tune_search_mode0_enable = (*preset_configs)[start].tune_search_mode0_enable; + } + // Start and end node are not the same - so interpolate between them + else + { + auto& node_a = (*preset_configs)[start]; + auto& node_b = (*preset_configs)[end]; + + float wt_range = node_b.quality - node_a.quality; + assert(wt_range > 0); + + // Compute interpolation factors + float wt_node_a = (node_b.quality - quality) / wt_range; + float wt_node_b = (quality - node_a.quality) / wt_range; + + #define LERP(param) ((node_a.param * wt_node_a) + (node_b.param * wt_node_b)) + #define LERPI(param) astc::flt2int_rtn(\ + (static_cast(node_a.param) * wt_node_a) + \ + (static_cast(node_b.param) * wt_node_b)) + #define LERPUI(param) static_cast(LERPI(param)) + + config.tune_partition_count_limit = LERPI(tune_partition_count_limit); + config.tune_2partition_index_limit = LERPI(tune_2partition_index_limit); + config.tune_3partition_index_limit = LERPI(tune_3partition_index_limit); + config.tune_4partition_index_limit = LERPI(tune_4partition_index_limit); + config.tune_block_mode_limit = LERPI(tune_block_mode_limit); + config.tune_refinement_limit = LERPI(tune_refinement_limit); + config.tune_candidate_limit = LERPUI(tune_candidate_limit); + config.tune_2partitioning_candidate_limit = LERPUI(tune_2partitioning_candidate_limit); + config.tune_3partitioning_candidate_limit = LERPUI(tune_3partitioning_candidate_limit); + config.tune_4partitioning_candidate_limit = LERPUI(tune_4partitioning_candidate_limit); + config.tune_db_limit = astc::max(LERP(tune_db_limit_a_base) - 35 * ltexels, + LERP(tune_db_limit_b_base) - 19 * ltexels); + + config.tune_mse_overshoot = LERP(tune_mse_overshoot); + + config.tune_2partition_early_out_limit_factor = LERP(tune_2partition_early_out_limit_factor); + config.tune_3partition_early_out_limit_factor = LERP(tune_3partition_early_out_limit_factor); + config.tune_2plane_early_out_limit_correlation = LERP(tune_2plane_early_out_limit_correlation); + config.tune_search_mode0_enable = LERP(tune_search_mode0_enable); + #undef LERP + #undef LERPI + #undef LERPUI + } + + // Set heuristics to the defaults for each color profile + config.cw_r_weight = 1.0f; + config.cw_g_weight = 1.0f; + config.cw_b_weight = 1.0f; + config.cw_a_weight = 1.0f; + + config.a_scale_radius = 0; + + config.rgbm_m_scale = 0.0f; + + config.profile = profile; + + // Values in this enum are from an external user, so not guaranteed to be + // bounded to the enum values + switch (static_cast(profile)) + { + case ASTCENC_PRF_LDR: + case ASTCENC_PRF_LDR_SRGB: + break; + case ASTCENC_PRF_HDR_RGB_LDR_A: + case ASTCENC_PRF_HDR: + config.tune_db_limit = 999.0f; + config.tune_search_mode0_enable = 0.0f; + break; + default: + return ASTCENC_ERR_BAD_PROFILE; + } + + // Flags field must not contain any unknown flag bits + status = validate_flags(profile, flags); + if (status != ASTCENC_SUCCESS) + { + return status; + } + + if (flags & ASTCENC_FLG_MAP_NORMAL) + { + // Normal map encoding uses L+A blocks, so allow one more partitioning + // than normal. We need need fewer bits for endpoints, so more likely + // to be able to use more partitions than an RGB/RGBA block + config.tune_partition_count_limit = astc::min(config.tune_partition_count_limit + 1u, 4u); + + config.cw_g_weight = 0.0f; + config.cw_b_weight = 0.0f; + config.tune_2partition_early_out_limit_factor *= 1.5f; + config.tune_3partition_early_out_limit_factor *= 1.5f; + config.tune_2plane_early_out_limit_correlation = 0.99f; + + // Normals are prone to blocking artifacts on smooth curves + // so force compressor to try harder here ... + config.tune_db_limit *= 1.03f; + } + else if (flags & ASTCENC_FLG_MAP_RGBM) + { + config.rgbm_m_scale = 5.0f; + config.cw_a_weight = 2.0f * config.rgbm_m_scale; + } + else // (This is color data) + { + // This is a very basic perceptual metric for RGB color data, which weights error + // significance by the perceptual luminance contribution of each color channel. For + // luminance the usual weights to compute luminance from a linear RGB value are as + // follows: + // + // l = r * 0.3 + g * 0.59 + b * 0.11 + // + // ... but we scale these up to keep a better balance between color and alpha. Note + // that if the content is using alpha we'd recommend using the -a option to weight + // the color contribution by the alpha transparency. + if (flags & ASTCENC_FLG_USE_PERCEPTUAL) + { + config.cw_r_weight = 0.30f * 2.25f; + config.cw_g_weight = 0.59f * 2.25f; + config.cw_b_weight = 0.11f * 2.25f; + } + } + config.flags = flags; + + return ASTCENC_SUCCESS; +} + +/* See header for documentation. */ +astcenc_error astcenc_context_alloc( + const astcenc_config* configp, + unsigned int thread_count, + astcenc_context** context +) { + astcenc_error status; + const astcenc_config& config = *configp; + + status = validate_cpu_float(); + if (status != ASTCENC_SUCCESS) + { + return status; + } + + if (thread_count == 0) + { + return ASTCENC_ERR_BAD_PARAM; + } + +#if defined(ASTCENC_DIAGNOSTICS) + // Force single threaded compressor use in diagnostic mode. + if (thread_count != 1) + { + return ASTCENC_ERR_BAD_PARAM; + } +#endif + + astcenc_context* ctxo = new astcenc_context; + astcenc_contexti* ctx = &ctxo->context; + ctx->thread_count = thread_count; + ctx->config = config; + ctx->working_buffers = nullptr; + + // These are allocated per-compress, as they depend on image size + ctx->input_alpha_averages = nullptr; + + // Copy the config first and validate the copy (we may modify it) + status = validate_config(ctx->config); + if (status != ASTCENC_SUCCESS) + { + delete ctxo; + return status; + } + + ctx->bsd = aligned_malloc(sizeof(block_size_descriptor), ASTCENC_VECALIGN); + if (!ctx->bsd) + { + delete ctxo; + return ASTCENC_ERR_OUT_OF_MEM; + } + + bool can_omit_modes = static_cast(config.flags & ASTCENC_FLG_SELF_DECOMPRESS_ONLY); + init_block_size_descriptor(config.block_x, config.block_y, config.block_z, + can_omit_modes, + config.tune_partition_count_limit, + static_cast(config.tune_block_mode_limit) / 100.0f, + *ctx->bsd); + +#if !defined(ASTCENC_DECOMPRESS_ONLY) + // Do setup only needed by compression + if (!(ctx->config.flags & ASTCENC_FLG_DECOMPRESS_ONLY)) + { + // Turn a dB limit into a per-texel error for faster use later + if ((ctx->config.profile == ASTCENC_PRF_LDR) || (ctx->config.profile == ASTCENC_PRF_LDR_SRGB)) + { + ctx->config.tune_db_limit = astc::pow(0.1f, ctx->config.tune_db_limit * 0.1f) * 65535.0f * 65535.0f; + } + else + { + ctx->config.tune_db_limit = 0.0f; + } + + size_t worksize = sizeof(compression_working_buffers) * thread_count; + ctx->working_buffers = aligned_malloc(worksize, ASTCENC_VECALIGN); + static_assert((ASTCENC_VECALIGN == 0) || ((sizeof(compression_working_buffers) % ASTCENC_VECALIGN) == 0), + "compression_working_buffers size must be multiple of vector alignment"); + if (!ctx->working_buffers) + { + aligned_free(ctx->bsd); + delete ctxo; + *context = nullptr; + return ASTCENC_ERR_OUT_OF_MEM; + } + } +#endif + +#if defined(ASTCENC_DIAGNOSTICS) + ctx->trace_log = new TraceLog(ctx->config.trace_file_path); + if (!ctx->trace_log->m_file) + { + return ASTCENC_ERR_DTRACE_FAILURE; + } + + trace_add_data("block_x", config.block_x); + trace_add_data("block_y", config.block_y); + trace_add_data("block_z", config.block_z); +#endif + + *context = ctxo; + +#if !defined(ASTCENC_DECOMPRESS_ONLY) + prepare_angular_tables(); +#endif + + return ASTCENC_SUCCESS; +} + +/* See header dor documentation. */ +void astcenc_context_free( + astcenc_context* ctxo +) { + if (ctxo) + { + astcenc_contexti* ctx = &ctxo->context; + aligned_free(ctx->working_buffers); + aligned_free(ctx->bsd); +#if defined(ASTCENC_DIAGNOSTICS) + delete ctx->trace_log; +#endif + delete ctxo; + } +} + +#if !defined(ASTCENC_DECOMPRESS_ONLY) + +/** + * @brief Compress an image, after any preflight has completed. + * + * @param[out] ctxo The compressor context. + * @param thread_index The thread index. + * @param image The intput image. + * @param swizzle The input swizzle. + * @param[out] buffer The output array for the compressed data. + */ +static void compress_image( + astcenc_context& ctxo, + unsigned int thread_index, + const astcenc_image& image, + const astcenc_swizzle& swizzle, + uint8_t* buffer +) { + astcenc_contexti& ctx = ctxo.context; + const block_size_descriptor& bsd = *ctx.bsd; + astcenc_profile decode_mode = ctx.config.profile; + + image_block blk; + + int block_x = bsd.xdim; + int block_y = bsd.ydim; + int block_z = bsd.zdim; + blk.texel_count = static_cast(block_x * block_y * block_z); + + int dim_x = image.dim_x; + int dim_y = image.dim_y; + int dim_z = image.dim_z; + + int xblocks = (dim_x + block_x - 1) / block_x; + int yblocks = (dim_y + block_y - 1) / block_y; + int zblocks = (dim_z + block_z - 1) / block_z; + int block_count = zblocks * yblocks * xblocks; + + int row_blocks = xblocks; + int plane_blocks = xblocks * yblocks; + + blk.decode_unorm8 = ctxo.context.config.flags & ASTCENC_FLG_USE_DECODE_UNORM8; + + // Populate the block channel weights + blk.channel_weight = vfloat4(ctx.config.cw_r_weight, + ctx.config.cw_g_weight, + ctx.config.cw_b_weight, + ctx.config.cw_a_weight); + + // Use preallocated scratch buffer + auto& temp_buffers = ctx.working_buffers[thread_index]; + + // Only the first thread actually runs the initializer + ctxo.manage_compress.init(block_count, ctx.config.progress_callback); + + // Determine if we can use an optimized load function + bool needs_swz = (swizzle.r != ASTCENC_SWZ_R) || (swizzle.g != ASTCENC_SWZ_G) || + (swizzle.b != ASTCENC_SWZ_B) || (swizzle.a != ASTCENC_SWZ_A); + + bool needs_hdr = (decode_mode == ASTCENC_PRF_HDR) || + (decode_mode == ASTCENC_PRF_HDR_RGB_LDR_A); + + bool use_fast_load = !needs_swz && !needs_hdr && + block_z == 1 && image.data_type == ASTCENC_TYPE_U8; + + auto load_func = load_image_block; + if (use_fast_load) + { + load_func = load_image_block_fast_ldr; + } + + // All threads run this processing loop until there is no work remaining + while (true) + { + unsigned int count; + unsigned int base = ctxo.manage_compress.get_task_assignment(16, count); + if (!count) + { + break; + } + + for (unsigned int i = base; i < base + count; i++) + { + // Decode i into x, y, z block indices + int z = i / plane_blocks; + unsigned int rem = i - (z * plane_blocks); + int y = rem / row_blocks; + int x = rem - (y * row_blocks); + + // Test if we can apply some basic alpha-scale RDO + bool use_full_block = true; + if (ctx.config.a_scale_radius != 0 && block_z == 1) + { + int start_x = x * block_x; + int end_x = astc::min(dim_x, start_x + block_x); + + int start_y = y * block_y; + int end_y = astc::min(dim_y, start_y + block_y); + + // SATs accumulate error, so don't test exactly zero. Test for + // less than 1 alpha in the expanded block footprint that + // includes the alpha radius. + int x_footprint = block_x + 2 * (ctx.config.a_scale_radius - 1); + + int y_footprint = block_y + 2 * (ctx.config.a_scale_radius - 1); + + float footprint = static_cast(x_footprint * y_footprint); + float threshold = 0.9f / (255.0f * footprint); + + // Do we have any alpha values? + use_full_block = false; + for (int ay = start_y; ay < end_y; ay++) + { + for (int ax = start_x; ax < end_x; ax++) + { + float a_avg = ctx.input_alpha_averages[ay * dim_x + ax]; + if (a_avg > threshold) + { + use_full_block = true; + ax = end_x; + ay = end_y; + } + } + } + } + + // Fetch the full block for compression + if (use_full_block) + { + load_func(decode_mode, image, blk, bsd, x * block_x, y * block_y, z * block_z, swizzle); + + // Scale RGB error contribution by the maximum alpha in the block + // This encourages preserving alpha accuracy in regions with high + // transparency, and can buy up to 0.5 dB PSNR. + if (ctx.config.flags & ASTCENC_FLG_USE_ALPHA_WEIGHT) + { + float alpha_scale = blk.data_max.lane<3>() * (1.0f / 65535.0f); + blk.channel_weight = vfloat4(ctx.config.cw_r_weight * alpha_scale, + ctx.config.cw_g_weight * alpha_scale, + ctx.config.cw_b_weight * alpha_scale, + ctx.config.cw_a_weight); + } + } + // Apply alpha scale RDO - substitute constant color block + else + { + blk.origin_texel = vfloat4::zero(); + blk.data_min = vfloat4::zero(); + blk.data_mean = vfloat4::zero(); + blk.data_max = vfloat4::zero(); + blk.grayscale = true; + } + + int offset = ((z * yblocks + y) * xblocks + x) * 16; + uint8_t *bp = buffer + offset; + compress_block(ctx, blk, bp, temp_buffers); + } + + ctxo.manage_compress.complete_task_assignment(count); + } +} + +/** + * @brief Compute regional averages in an image. + * + * This function can be called by multiple threads, but only after a single + * thread calls the setup function @c init_compute_averages(). + * + * Results are written back into @c img->input_alpha_averages. + * + * @param[out] ctx The context. + * @param ag The average and variance arguments created during setup. + */ +static void compute_averages( + astcenc_context& ctx, + const avg_args &ag +) { + pixel_region_args arg = ag.arg; + arg.work_memory = new vfloat4[ag.work_memory_size]; + + int size_x = ag.img_size_x; + int size_y = ag.img_size_y; + int size_z = ag.img_size_z; + + int step_xy = ag.blk_size_xy; + int step_z = ag.blk_size_z; + + int y_tasks = (size_y + step_xy - 1) / step_xy; + + // All threads run this processing loop until there is no work remaining + while (true) + { + unsigned int count; + unsigned int base = ctx.manage_avg.get_task_assignment(16, count); + if (!count) + { + break; + } + + for (unsigned int i = base; i < base + count; i++) + { + int z = (i / (y_tasks)) * step_z; + int y = (i - (z * y_tasks)) * step_xy; + + arg.size_z = astc::min(step_z, size_z - z); + arg.offset_z = z; + + arg.size_y = astc::min(step_xy, size_y - y); + arg.offset_y = y; + + for (int x = 0; x < size_x; x += step_xy) + { + arg.size_x = astc::min(step_xy, size_x - x); + arg.offset_x = x; + compute_pixel_region_variance(ctx.context, arg); + } + } + + ctx.manage_avg.complete_task_assignment(count); + } + + delete[] arg.work_memory; +} + +#endif + +/* See header for documentation. */ +astcenc_error astcenc_compress_image( + astcenc_context* ctxo, + astcenc_image* imagep, + const astcenc_swizzle* swizzle, + uint8_t* data_out, + size_t data_len, + unsigned int thread_index +) { +#if defined(ASTCENC_DECOMPRESS_ONLY) + (void)ctxo; + (void)imagep; + (void)swizzle; + (void)data_out; + (void)data_len; + (void)thread_index; + return ASTCENC_ERR_BAD_CONTEXT; +#else + astcenc_contexti* ctx = &ctxo->context; + astcenc_error status; + astcenc_image& image = *imagep; + + if (ctx->config.flags & ASTCENC_FLG_DECOMPRESS_ONLY) + { + return ASTCENC_ERR_BAD_CONTEXT; + } + + status = validate_compression_swizzle(*swizzle); + if (status != ASTCENC_SUCCESS) + { + return status; + } + + if (thread_index >= ctx->thread_count) + { + return ASTCENC_ERR_BAD_PARAM; + } + + unsigned int block_x = ctx->config.block_x; + unsigned int block_y = ctx->config.block_y; + unsigned int block_z = ctx->config.block_z; + + unsigned int xblocks = (image.dim_x + block_x - 1) / block_x; + unsigned int yblocks = (image.dim_y + block_y - 1) / block_y; + unsigned int zblocks = (image.dim_z + block_z - 1) / block_z; + + // Check we have enough output space (16 bytes per block) + size_t size_needed = xblocks * yblocks * zblocks * 16; + if (data_len < size_needed) + { + return ASTCENC_ERR_OUT_OF_MEM; + } + + // If context thread count is one then implicitly reset + if (ctx->thread_count == 1) + { + astcenc_compress_reset(ctxo); + } + + if (ctx->config.a_scale_radius != 0) + { + // First thread to enter will do setup, other threads will subsequently + // enter the critical section but simply skip over the initialization + auto init_avg = [ctx, &image, swizzle]() { + // Perform memory allocations for the destination buffers + size_t texel_count = image.dim_x * image.dim_y * image.dim_z; + ctx->input_alpha_averages = new float[texel_count]; + + return init_compute_averages( + image, ctx->config.a_scale_radius, *swizzle, + ctx->avg_preprocess_args); + }; + + // Only the first thread actually runs the initializer + ctxo->manage_avg.init(init_avg); + + // All threads will enter this function and dynamically grab work + compute_averages(*ctxo, ctx->avg_preprocess_args); + } + + // Wait for compute_averages to complete before compressing + ctxo->manage_avg.wait(); + + compress_image(*ctxo, thread_index, image, *swizzle, data_out); + + // Wait for compress to complete before freeing memory + ctxo->manage_compress.wait(); + + auto term_compress = [ctx]() { + delete[] ctx->input_alpha_averages; + ctx->input_alpha_averages = nullptr; + }; + + // Only the first thread to arrive actually runs the term + ctxo->manage_compress.term(term_compress); + + return ASTCENC_SUCCESS; +#endif +} + +/* See header for documentation. */ +astcenc_error astcenc_compress_reset( + astcenc_context* ctxo +) { +#if defined(ASTCENC_DECOMPRESS_ONLY) + (void)ctxo; + return ASTCENC_ERR_BAD_CONTEXT; +#else + astcenc_contexti* ctx = &ctxo->context; + if (ctx->config.flags & ASTCENC_FLG_DECOMPRESS_ONLY) + { + return ASTCENC_ERR_BAD_CONTEXT; + } + + ctxo->manage_avg.reset(); + ctxo->manage_compress.reset(); + return ASTCENC_SUCCESS; +#endif +} + +/* See header for documentation. */ +astcenc_error astcenc_compress_cancel( + astcenc_context* ctxo +) { +#if defined(ASTCENC_DECOMPRESS_ONLY) + (void)ctxo; + return ASTCENC_ERR_BAD_CONTEXT; +#else + astcenc_contexti* ctx = &ctxo->context; + if (ctx->config.flags & ASTCENC_FLG_DECOMPRESS_ONLY) + { + return ASTCENC_ERR_BAD_CONTEXT; + } + + // Cancel compression before cancelling avg. This avoids the race condition + // where cancelling them in the other order could see a compression worker + // starting to process even though some of the avg data is undefined. + ctxo->manage_compress.cancel(); + ctxo->manage_avg.cancel(); + return ASTCENC_SUCCESS; +#endif +} + +/* See header for documentation. */ +astcenc_error astcenc_decompress_image( + astcenc_context* ctxo, + const uint8_t* data, + size_t data_len, + astcenc_image* image_outp, + const astcenc_swizzle* swizzle, + unsigned int thread_index +) { + astcenc_error status; + astcenc_image& image_out = *image_outp; + astcenc_contexti* ctx = &ctxo->context; + + // Today this doesn't matter (working set on stack) but might in future ... + if (thread_index >= ctx->thread_count) + { + return ASTCENC_ERR_BAD_PARAM; + } + + status = validate_decompression_swizzle(*swizzle); + if (status != ASTCENC_SUCCESS) + { + return status; + } + + unsigned int block_x = ctx->config.block_x; + unsigned int block_y = ctx->config.block_y; + unsigned int block_z = ctx->config.block_z; + + unsigned int xblocks = (image_out.dim_x + block_x - 1) / block_x; + unsigned int yblocks = (image_out.dim_y + block_y - 1) / block_y; + unsigned int zblocks = (image_out.dim_z + block_z - 1) / block_z; + unsigned int block_count = zblocks * yblocks * xblocks; + + int row_blocks = xblocks; + int plane_blocks = xblocks * yblocks; + + // Check we have enough output space (16 bytes per block) + size_t size_needed = xblocks * yblocks * zblocks * 16; + if (data_len < size_needed) + { + return ASTCENC_ERR_OUT_OF_MEM; + } + + image_block blk {}; + blk.texel_count = static_cast(block_x * block_y * block_z); + + // Decode mode inferred from the output data type + blk.decode_unorm8 = image_out.data_type == ASTCENC_TYPE_U8; + + // If context thread count is one then implicitly reset + if (ctx->thread_count == 1) + { + astcenc_decompress_reset(ctxo); + } + + // Only the first thread actually runs the initializer + ctxo->manage_decompress.init(block_count, nullptr); + + // All threads run this processing loop until there is no work remaining + while (true) + { + unsigned int count; + unsigned int base = ctxo->manage_decompress.get_task_assignment(128, count); + if (!count) + { + break; + } + + for (unsigned int i = base; i < base + count; i++) + { + // Decode i into x, y, z block indices + int z = i / plane_blocks; + unsigned int rem = i - (z * plane_blocks); + int y = rem / row_blocks; + int x = rem - (y * row_blocks); + + unsigned int offset = (((z * yblocks + y) * xblocks) + x) * 16; + const uint8_t* bp = data + offset; + + symbolic_compressed_block scb; + + physical_to_symbolic(*ctx->bsd, bp, scb); + + decompress_symbolic_block(ctx->config.profile, *ctx->bsd, + x * block_x, y * block_y, z * block_z, + scb, blk); + + store_image_block(image_out, blk, *ctx->bsd, + x * block_x, y * block_y, z * block_z, *swizzle); + } + + ctxo->manage_decompress.complete_task_assignment(count); + } + + return ASTCENC_SUCCESS; +} + +/* See header for documentation. */ +astcenc_error astcenc_decompress_reset( + astcenc_context* ctxo +) { + ctxo->manage_decompress.reset(); + return ASTCENC_SUCCESS; +} + +/* See header for documentation. */ +astcenc_error astcenc_get_block_info( + astcenc_context* ctxo, + const uint8_t data[16], + astcenc_block_info* info +) { +#if defined(ASTCENC_DECOMPRESS_ONLY) + (void)ctxo; + (void)data; + (void)info; + return ASTCENC_ERR_BAD_CONTEXT; +#else + astcenc_contexti* ctx = &ctxo->context; + + // Decode the compressed data into a symbolic form + symbolic_compressed_block scb; + physical_to_symbolic(*ctx->bsd, data, scb); + + // Fetch the appropriate partition and decimation tables + block_size_descriptor& bsd = *ctx->bsd; + + // Start from a clean slate + memset(info, 0, sizeof(*info)); + + // Basic info we can always populate + info->profile = ctx->config.profile; + + info->block_x = ctx->config.block_x; + info->block_y = ctx->config.block_y; + info->block_z = ctx->config.block_z; + info->texel_count = bsd.texel_count; + + // Check for error blocks first + info->is_error_block = scb.block_type == SYM_BTYPE_ERROR; + if (info->is_error_block) + { + return ASTCENC_SUCCESS; + } + + // Check for constant color blocks second + info->is_constant_block = scb.block_type == SYM_BTYPE_CONST_F16 || + scb.block_type == SYM_BTYPE_CONST_U16; + if (info->is_constant_block) + { + return ASTCENC_SUCCESS; + } + + // Otherwise handle a full block ; known to be valid after conditions above have been checked + int partition_count = scb.partition_count; + const auto& pi = bsd.get_partition_info(partition_count, scb.partition_index); + + const block_mode& bm = bsd.get_block_mode(scb.block_mode); + const decimation_info& di = bsd.get_decimation_info(bm.decimation_mode); + + info->weight_x = di.weight_x; + info->weight_y = di.weight_y; + info->weight_z = di.weight_z; + + info->is_dual_plane_block = bm.is_dual_plane != 0; + + info->partition_count = scb.partition_count; + info->partition_index = scb.partition_index; + info->dual_plane_component = scb.plane2_component; + + info->color_level_count = get_quant_level(scb.get_color_quant_mode()); + info->weight_level_count = get_quant_level(bm.get_weight_quant_mode()); + + // Unpack color endpoints for each active partition + for (unsigned int i = 0; i < scb.partition_count; i++) + { + bool rgb_hdr; + bool a_hdr; + vint4 endpnt[2]; + + unpack_color_endpoints(ctx->config.profile, + scb.color_formats[i], + scb.color_values[i], + rgb_hdr, a_hdr, + endpnt[0], endpnt[1]); + + // Store the color endpoint mode info + info->color_endpoint_modes[i] = scb.color_formats[i]; + info->is_hdr_block = info->is_hdr_block || rgb_hdr || a_hdr; + + // Store the unpacked and decoded color endpoint + vmask4 hdr_mask(rgb_hdr, rgb_hdr, rgb_hdr, a_hdr); + for (int j = 0; j < 2; j++) + { + vint4 color_lns = lns_to_sf16(endpnt[j]); + vint4 color_unorm = unorm16_to_sf16(endpnt[j]); + vint4 datai = select(color_unorm, color_lns, hdr_mask); + store(float16_to_float(datai), info->color_endpoints[i][j]); + } + } + + // Unpack weights for each texel + int weight_plane1[BLOCK_MAX_TEXELS]; + int weight_plane2[BLOCK_MAX_TEXELS]; + + unpack_weights(bsd, scb, di, bm.is_dual_plane, weight_plane1, weight_plane2); + for (unsigned int i = 0; i < bsd.texel_count; i++) + { + info->weight_values_plane1[i] = static_cast(weight_plane1[i]) * (1.0f / WEIGHTS_TEXEL_SUM); + if (info->is_dual_plane_block) + { + info->weight_values_plane2[i] = static_cast(weight_plane2[i]) * (1.0f / WEIGHTS_TEXEL_SUM); + } + } + + // Unpack partition assignments for each texel + for (unsigned int i = 0; i < bsd.texel_count; i++) + { + info->partition_assignment[i] = pi.partition_of_texel[i]; + } + + return ASTCENC_SUCCESS; +#endif +} + +/* See header for documentation. */ +const char* astcenc_get_error_string( + astcenc_error status +) { + // Values in this enum are from an external user, so not guaranteed to be + // bounded to the enum values + switch (static_cast(status)) + { + case ASTCENC_SUCCESS: + return "ASTCENC_SUCCESS"; + case ASTCENC_ERR_OUT_OF_MEM: + return "ASTCENC_ERR_OUT_OF_MEM"; + case ASTCENC_ERR_BAD_CPU_FLOAT: + return "ASTCENC_ERR_BAD_CPU_FLOAT"; + case ASTCENC_ERR_BAD_PARAM: + return "ASTCENC_ERR_BAD_PARAM"; + case ASTCENC_ERR_BAD_BLOCK_SIZE: + return "ASTCENC_ERR_BAD_BLOCK_SIZE"; + case ASTCENC_ERR_BAD_PROFILE: + return "ASTCENC_ERR_BAD_PROFILE"; + case ASTCENC_ERR_BAD_QUALITY: + return "ASTCENC_ERR_BAD_QUALITY"; + case ASTCENC_ERR_BAD_FLAGS: + return "ASTCENC_ERR_BAD_FLAGS"; + case ASTCENC_ERR_BAD_SWIZZLE: + return "ASTCENC_ERR_BAD_SWIZZLE"; + case ASTCENC_ERR_BAD_CONTEXT: + return "ASTCENC_ERR_BAD_CONTEXT"; + case ASTCENC_ERR_NOT_IMPLEMENTED: + return "ASTCENC_ERR_NOT_IMPLEMENTED"; + case ASTCENC_ERR_BAD_DECODE_MODE: + return "ASTCENC_ERR_BAD_DECODE_MODE"; +#if defined(ASTCENC_DIAGNOSTICS) + case ASTCENC_ERR_DTRACE_FAILURE: + return "ASTCENC_ERR_DTRACE_FAILURE"; +#endif + default: + return nullptr; + } +} diff --git a/ktx/external/astc-encoder/Source/astcenc_find_best_partitioning.cpp b/ktx/external/astc-encoder/Source/astcenc_find_best_partitioning.cpp new file mode 100644 index 0000000..2025889 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_find_best_partitioning.cpp @@ -0,0 +1,781 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2025 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 for finding best partition for a block. + * + * The partition search operates in two stages. The first pass uses kmeans clustering to group + * texels into an ideal partitioning for the requested partition count, and then compares that + * against the 1024 partitionings generated by the ASTC partition hash function. The generated + * partitions are then ranked by the number of texels in the wrong partition, compared to the ideal + * clustering. All 1024 partitions are tested for similarity and ranked, apart from duplicates and + * partitionings that actually generate fewer than the requested partition count, but only the top + * N candidates are actually put through a more detailed search. N is determined by the compressor + * quality preset. + * + * For the detailed search, each candidate is checked against two possible encoding methods: + * + * - The best partitioning assuming different chroma colors (RGB + RGB or RGB + delta endpoints). + * - The best partitioning assuming same chroma colors (RGB + scale endpoints). + * + * This is implemented by computing the compute mean color and dominant direction for each + * partition. This defines two lines, both of which go through the mean color value. + * + * - One line has a direction defined by the dominant direction; this is used to assess the error + * from using an uncorrelated color representation. + * - The other line goes through (0,0,0,1) and is used to assess the error from using a same chroma + * (RGB + scale) color representation. + * + * The best candidate is selected by computing the squared-errors that result from using these + * lines for endpoint selection. + */ + +#include +#include "astcenc_internal.h" + +/** + * @brief Pick some initial kmeans cluster centers. + * + * @param blk The image block color data to compress. + * @param texel_count The number of texels in the block. + * @param partition_count The number of partitions in the block. + * @param[out] cluster_centers The initial partition cluster center colors. + */ +static void kmeans_init( + const image_block& blk, + unsigned int texel_count, + unsigned int partition_count, + vfloat4 cluster_centers[BLOCK_MAX_PARTITIONS] +) { + promise(texel_count > 0); + promise(partition_count > 0); + + unsigned int clusters_selected = 0; + float distances[BLOCK_MAX_TEXELS]; + + // Pick a random sample as first cluster center; 145897 from random.org + unsigned int sample = 145897 % texel_count; + vfloat4 center_color = blk.texel(sample); + cluster_centers[clusters_selected] = center_color; + clusters_selected++; + + // Compute the distance to the first cluster center + float distance_sum = 0.0f; + for (unsigned int i = 0; i < texel_count; i++) + { + vfloat4 color = blk.texel(i); + vfloat4 diff = color - center_color; + float distance = dot_s(diff * diff, blk.channel_weight); + distance_sum += distance; + distances[i] = distance; + } + + // More numbers from random.org for weighted-random center selection + const float cluster_cutoffs[9] { + 0.626220f, 0.932770f, 0.275454f, + 0.318558f, 0.240113f, 0.009190f, + 0.347661f, 0.731960f, 0.156391f + }; + + unsigned int cutoff = (clusters_selected - 1) + 3 * (partition_count - 2); + + // Pick the remaining samples as needed + while (true) + { + // Pick the next center in a weighted-random fashion. + float summa = 0.0f; + float distance_cutoff = distance_sum * cluster_cutoffs[cutoff++]; + for (sample = 0; sample < texel_count; sample++) + { + summa += distances[sample]; + if (summa >= distance_cutoff) + { + break; + } + } + + // Clamp to a valid range and store the selected cluster center + sample = astc::min(sample, texel_count - 1); + + center_color = blk.texel(sample); + cluster_centers[clusters_selected++] = center_color; + if (clusters_selected >= partition_count) + { + break; + } + + // Compute the distance to the new cluster center, keep the min dist + distance_sum = 0.0f; + for (unsigned int i = 0; i < texel_count; i++) + { + vfloat4 color = blk.texel(i); + vfloat4 diff = color - center_color; + float distance = dot_s(diff * diff, blk.channel_weight); + distance = astc::min(distance, distances[i]); + distance_sum += distance; + distances[i] = distance; + } + } +} + +/** + * @brief Assign texels to clusters, based on a set of chosen center points. + * + * @param blk The image block color data to compress. + * @param texel_count The number of texels in the block. + * @param partition_count The number of partitions in the block. + * @param cluster_centers The partition cluster center colors. + * @param[out] partition_of_texel The partition assigned for each texel. + */ +static void kmeans_assign( + const image_block& blk, + unsigned int texel_count, + unsigned int partition_count, + const vfloat4 cluster_centers[BLOCK_MAX_PARTITIONS], + uint8_t partition_of_texel[BLOCK_MAX_TEXELS] +) { + promise(texel_count > 0); + promise(partition_count > 0); + + uint8_t partition_texel_count[BLOCK_MAX_PARTITIONS] { 0 }; + + // Find the best partition for every texel + for (unsigned int i = 0; i < texel_count; i++) + { + float best_distance = std::numeric_limits::max(); + unsigned int best_partition = 0; + + vfloat4 color = blk.texel(i); + for (unsigned int j = 0; j < partition_count; j++) + { + vfloat4 diff = color - cluster_centers[j]; + float distance = dot_s(diff * diff, blk.channel_weight); + if (distance < best_distance) + { + best_distance = distance; + best_partition = j; + } + } + + partition_of_texel[i] = static_cast(best_partition); + partition_texel_count[best_partition]++; + } + + // It is possible to get a situation where a partition ends up without any texels. In this case, + // assign texel N to partition N. This is silly, but ensures that every partition retains at + // least one texel. Reassigning a texel in this manner may cause another partition to go empty, + // so if we actually did a reassignment, run the whole loop over again. + bool problem_case; + do + { + problem_case = false; + for (unsigned int i = 0; i < partition_count; i++) + { + if (partition_texel_count[i] == 0) + { + partition_texel_count[partition_of_texel[i]]--; + partition_texel_count[i]++; + partition_of_texel[i] = static_cast(i); + problem_case = true; + } + } + } while (problem_case); +} + +/** + * @brief Compute new cluster centers based on their center of gravity. + * + * @param blk The image block color data to compress. + * @param texel_count The number of texels in the block. + * @param partition_count The number of partitions in the block. + * @param[out] cluster_centers The new cluster center colors. + * @param partition_of_texel The partition assigned for each texel. + */ +static void kmeans_update( + const image_block& blk, + unsigned int texel_count, + unsigned int partition_count, + vfloat4 cluster_centers[BLOCK_MAX_PARTITIONS], + const uint8_t partition_of_texel[BLOCK_MAX_TEXELS] +) { + promise(texel_count > 0); + promise(partition_count > 0); + + vfloat4 color_sum[BLOCK_MAX_PARTITIONS] { + vfloat4::zero(), + vfloat4::zero(), + vfloat4::zero(), + vfloat4::zero() + }; + + uint8_t partition_texel_count[BLOCK_MAX_PARTITIONS] { 0 }; + + // Find the center of gravity in each cluster + for (unsigned int i = 0; i < texel_count; i++) + { + uint8_t partition = partition_of_texel[i]; + color_sum[partition] += blk.texel(i); + partition_texel_count[partition]++; + } + + // Set the center of gravity to be the new cluster center + for (unsigned int i = 0; i < partition_count; i++) + { + float scale = 1.0f / static_cast(partition_texel_count[i]); + cluster_centers[i] = color_sum[i] * scale; + } +} + +/** + * @brief Compute bit-mismatch for partitioning in 2-partition mode. + * + * @param a The texel assignment bitvector for the block. + * @param b The texel assignment bitvector for the partition table. + * + * @return The number of bit mismatches. + */ +static inline uint8_t partition_mismatch2( + const uint64_t a[2], + const uint64_t b[2] +) { + int v1 = popcount(a[0] ^ b[0]) + popcount(a[1] ^ b[1]); + int v2 = popcount(a[0] ^ b[1]) + popcount(a[1] ^ b[0]); + + // Divide by 2 because XOR always counts errors twice, once when missing + // in the expected position, and again when present in the wrong partition + return static_cast(astc::min(v1, v2) / 2); +} + +/** + * @brief Compute bit-mismatch for partitioning in 3-partition mode. + * + * @param a The texel assignment bitvector for the block. + * @param b The texel assignment bitvector for the partition table. + * + * @return The number of bit mismatches. + */ +static inline uint8_t partition_mismatch3( + const uint64_t a[3], + const uint64_t b[3] +) { + int p00 = popcount(a[0] ^ b[0]); + int p01 = popcount(a[0] ^ b[1]); + int p02 = popcount(a[0] ^ b[2]); + + int p10 = popcount(a[1] ^ b[0]); + int p11 = popcount(a[1] ^ b[1]); + int p12 = popcount(a[1] ^ b[2]); + + int p20 = popcount(a[2] ^ b[0]); + int p21 = popcount(a[2] ^ b[1]); + int p22 = popcount(a[2] ^ b[2]); + + int s0 = p11 + p22; + int s1 = p12 + p21; + int v0 = astc::min(s0, s1) + p00; + + int s2 = p10 + p22; + int s3 = p12 + p20; + int v1 = astc::min(s2, s3) + p01; + + int s4 = p10 + p21; + int s5 = p11 + p20; + int v2 = astc::min(s4, s5) + p02; + + // Divide by 2 because XOR always counts errors twice, once when missing + // in the expected position, and again when present in the wrong partition + return static_cast(astc::min(v0, v1, v2) / 2); +} + +/** + * @brief Compute bit-mismatch for partitioning in 4-partition mode. + * + * @param a The texel assignment bitvector for the block. + * @param b The texel assignment bitvector for the partition table. + * + * @return The number of bit mismatches. + */ +static inline uint8_t partition_mismatch4( + const uint64_t a[4], + const uint64_t b[4] +) { + int p00 = popcount(a[0] ^ b[0]); + int p01 = popcount(a[0] ^ b[1]); + int p02 = popcount(a[0] ^ b[2]); + int p03 = popcount(a[0] ^ b[3]); + + int p10 = popcount(a[1] ^ b[0]); + int p11 = popcount(a[1] ^ b[1]); + int p12 = popcount(a[1] ^ b[2]); + int p13 = popcount(a[1] ^ b[3]); + + int p20 = popcount(a[2] ^ b[0]); + int p21 = popcount(a[2] ^ b[1]); + int p22 = popcount(a[2] ^ b[2]); + int p23 = popcount(a[2] ^ b[3]); + + int p30 = popcount(a[3] ^ b[0]); + int p31 = popcount(a[3] ^ b[1]); + int p32 = popcount(a[3] ^ b[2]); + int p33 = popcount(a[3] ^ b[3]); + + int mx23 = astc::min(p22 + p33, p23 + p32); + int mx13 = astc::min(p21 + p33, p23 + p31); + int mx12 = astc::min(p21 + p32, p22 + p31); + int mx03 = astc::min(p20 + p33, p23 + p30); + int mx02 = astc::min(p20 + p32, p22 + p30); + int mx01 = astc::min(p21 + p30, p20 + p31); + + int v0 = p00 + astc::min(p11 + mx23, p12 + mx13, p13 + mx12); + int v1 = p01 + astc::min(p10 + mx23, p12 + mx03, p13 + mx02); + int v2 = p02 + astc::min(p11 + mx03, p10 + mx13, p13 + mx01); + int v3 = p03 + astc::min(p11 + mx02, p12 + mx01, p10 + mx12); + + // Divide by 2 because XOR always counts errors twice, once when missing + // in the expected position, and again when present in the wrong partition + return static_cast(astc::min(v0, v1, v2, v3) / 2); +} + +using mismatch_dispatch = unsigned int (*)(const uint64_t*, const uint64_t*); + +/** + * @brief Count the partition table mismatches vs the data clustering. + * + * @param bsd The block size information. + * @param partition_count The number of partitions in the block. + * @param bitmaps The block texel partition assignment patterns. + * @param[out] mismatch_counts The array storing per partitioning mismatch counts. + */ +static void count_partition_mismatch_bits( + const block_size_descriptor& bsd, + unsigned int partition_count, + const uint64_t bitmaps[BLOCK_MAX_PARTITIONS], + uint8_t mismatch_counts[BLOCK_MAX_PARTITIONINGS] +) { + unsigned int active_count = bsd.partitioning_count_selected[partition_count - 1]; + promise(active_count > 0); + + if (partition_count == 2) + { + for (unsigned int i = 0; i < active_count; i++) + { + mismatch_counts[i] = partition_mismatch2(bitmaps, bsd.coverage_bitmaps_2[i]); + assert(mismatch_counts[i] < BLOCK_MAX_KMEANS_TEXELS); + assert(mismatch_counts[i] < bsd.texel_count); + } + } + else if (partition_count == 3) + { + for (unsigned int i = 0; i < active_count; i++) + { + mismatch_counts[i] = partition_mismatch3(bitmaps, bsd.coverage_bitmaps_3[i]); + assert(mismatch_counts[i] < BLOCK_MAX_KMEANS_TEXELS); + assert(mismatch_counts[i] < bsd.texel_count); + } + } + else + { + for (unsigned int i = 0; i < active_count; i++) + { + mismatch_counts[i] = partition_mismatch4(bitmaps, bsd.coverage_bitmaps_4[i]); + assert(mismatch_counts[i] < BLOCK_MAX_KMEANS_TEXELS); + assert(mismatch_counts[i] < bsd.texel_count); + } + } +} + +/** + * @brief Use counting sort on the mismatch array to sort partition candidates. + * + * @param partitioning_count The number of packed partitionings. + * @param mismatch_count Partitioning mismatch counts, in index order. + * @param[out] partition_ordering Partition index values, in mismatch order. + * + * @return The number of active partitions in this selection. + */ +static unsigned int get_partition_ordering_by_mismatch_bits( + unsigned int texel_count, + unsigned int partitioning_count, + const uint8_t mismatch_count[BLOCK_MAX_PARTITIONINGS], + uint16_t partition_ordering[BLOCK_MAX_PARTITIONINGS] +) { + promise(partitioning_count > 0); + uint16_t mscount[BLOCK_MAX_KMEANS_TEXELS] { 0 }; + + // Create the histogram of mismatch counts + for (unsigned int i = 0; i < partitioning_count; i++) + { + mscount[mismatch_count[i]]++; + } + + // Create a running sum from the histogram array + // Indices store previous values only; i.e. exclude self after sum + uint16_t sum = 0; + for (unsigned int i = 0; i < texel_count; i++) + { + uint16_t cnt = mscount[i]; + mscount[i] = sum; + sum += cnt; + } + + // Use the running sum as the index, incrementing after read to allow + // sequential entries with the same count + for (unsigned int i = 0; i < partitioning_count; i++) + { + unsigned int idx = mscount[mismatch_count[i]]++; + partition_ordering[idx] = static_cast(i); + } + + return partitioning_count; +} + +/** + * @brief Use k-means clustering to compute a partition ordering for a block.. + * + * @param bsd The block size information. + * @param blk The image block color data to compress. + * @param partition_count The desired number of partitions in the block. + * @param[out] partition_ordering The list of recommended partition indices, in priority order. + * + * @return The number of active partitionings in this selection. + */ +static unsigned int compute_kmeans_partition_ordering( + const block_size_descriptor& bsd, + const image_block& blk, + unsigned int partition_count, + uint16_t partition_ordering[BLOCK_MAX_PARTITIONINGS] +) { + vfloat4 cluster_centers[BLOCK_MAX_PARTITIONS]; + uint8_t texel_partitions[BLOCK_MAX_TEXELS]; + + // Use three passes of k-means clustering to partition the block data + for (unsigned int i = 0; i < 3; i++) + { + if (i == 0) + { + kmeans_init(blk, bsd.texel_count, partition_count, cluster_centers); + } + else + { + kmeans_update(blk, bsd.texel_count, partition_count, cluster_centers, texel_partitions); + } + + kmeans_assign(blk, bsd.texel_count, partition_count, cluster_centers, texel_partitions); + } + + // Construct the block bitmaps of texel assignments to each partition + uint64_t bitmaps[BLOCK_MAX_PARTITIONS] { 0 }; + unsigned int texels_to_process = astc::min(bsd.texel_count, BLOCK_MAX_KMEANS_TEXELS); + promise(texels_to_process > 0); + for (unsigned int i = 0; i < texels_to_process; i++) + { + unsigned int idx = bsd.kmeans_texels[i]; + bitmaps[texel_partitions[idx]] |= 1ULL << i; + } + + // Count the mismatch between the block and the format's partition tables + uint8_t mismatch_counts[BLOCK_MAX_PARTITIONINGS]; + count_partition_mismatch_bits(bsd, partition_count, bitmaps, mismatch_counts); + + // Sort the partitions based on the number of mismatched bits + return get_partition_ordering_by_mismatch_bits( + texels_to_process, + bsd.partitioning_count_selected[partition_count - 1], + mismatch_counts, partition_ordering); +} + +/** + * @brief Insert a partitioning into an order list of results, sorted by error. + * + * @param max_values The max number of entries in the best result arrays. + * @param this_error The error of the new entry. + * @param this_partition The partition ID of the new entry. + * @param[out] best_errors The array of best error values. + * @param[out] best_partitions The array of best partition values. + */ +static void insert_result( + unsigned int max_values, + float this_error, + unsigned int this_partition, + float* best_errors, + unsigned int* best_partitions) +{ + promise(max_values > 0); + + // Don't bother searching if the current worst error beats the new error + if (this_error >= best_errors[max_values - 1]) + { + return; + } + + // Else insert into the list in error-order + for (unsigned int i = 0; i < max_values; i++) + { + // Existing result is better - move on ... + if (this_error > best_errors[i]) + { + continue; + } + + // Move existing results down one + for (unsigned int j = max_values - 1; j > i; j--) + { + best_errors[j] = best_errors[j - 1]; + best_partitions[j] = best_partitions[j - 1]; + } + + // Insert new result + best_errors[i] = this_error; + best_partitions[i] = this_partition; + break; + } +} + +/* See header for documentation. */ +unsigned int find_best_partition_candidates( + const block_size_descriptor& bsd, + const image_block& blk, + unsigned int partition_count, + unsigned int partition_search_limit, + unsigned int best_partitions[TUNE_MAX_PARTITIONING_CANDIDATES], + unsigned int requested_candidates +) { + // Constant used to estimate quantization error for a given partitioning; the optimal value for + // this depends on bitrate. These values have been determined empirically. + unsigned int texels_per_block = bsd.texel_count; + float weight_imprecision_estim = 0.055f; + if (texels_per_block <= 20) + { + weight_imprecision_estim = 0.03f; + } + else if (texels_per_block <= 31) + { + weight_imprecision_estim = 0.04f; + } + else if (texels_per_block <= 41) + { + weight_imprecision_estim = 0.05f; + } + + promise(partition_count > 0); + promise(partition_search_limit > 0); + + weight_imprecision_estim = weight_imprecision_estim * weight_imprecision_estim; + + uint16_t partition_sequence[BLOCK_MAX_PARTITIONINGS]; + unsigned int sequence_len = compute_kmeans_partition_ordering(bsd, blk, partition_count, partition_sequence); + partition_search_limit = astc::min(partition_search_limit, sequence_len); + requested_candidates = astc::min(partition_search_limit, requested_candidates); + + bool uses_alpha = !blk.is_constant_channel(3); + + // Partitioning errors assuming uncorrelated-chrominance endpoints + float uncor_best_errors[TUNE_MAX_PARTITIONING_CANDIDATES]; + unsigned int uncor_best_partitions[TUNE_MAX_PARTITIONING_CANDIDATES]; + + // Partitioning errors assuming same-chrominance endpoints + float samec_best_errors[TUNE_MAX_PARTITIONING_CANDIDATES]; + unsigned int samec_best_partitions[TUNE_MAX_PARTITIONING_CANDIDATES]; + + for (unsigned int i = 0; i < requested_candidates; i++) + { + uncor_best_errors[i] = ERROR_CALC_DEFAULT; + samec_best_errors[i] = ERROR_CALC_DEFAULT; + } + + if (uses_alpha) + { + for (unsigned int i = 0; i < partition_search_limit; i++) + { + unsigned int partition = partition_sequence[i]; + const auto& pi = bsd.get_raw_partition_info(partition_count, partition); + + // Compute weighting to give to each component in each partition + partition_metrics pms[BLOCK_MAX_PARTITIONS]; + + compute_avgs_and_dirs_4_comp(pi, blk, pms); + + line4 uncor_lines[BLOCK_MAX_PARTITIONS]; + line4 samec_lines[BLOCK_MAX_PARTITIONS]; + + processed_line4 uncor_plines[BLOCK_MAX_PARTITIONS]; + processed_line4 samec_plines[BLOCK_MAX_PARTITIONS]; + + float line_lengths[BLOCK_MAX_PARTITIONS]; + + for (unsigned int j = 0; j < partition_count; j++) + { + partition_metrics& pm = pms[j]; + + uncor_lines[j].a = pm.avg; + uncor_lines[j].b = normalize_safe(pm.dir, unit4()); + + uncor_plines[j].amod = uncor_lines[j].a - uncor_lines[j].b * dot(uncor_lines[j].a, uncor_lines[j].b); + uncor_plines[j].bs = uncor_lines[j].b; + + samec_lines[j].a = vfloat4::zero(); + samec_lines[j].b = normalize_safe(pm.avg, unit4()); + + samec_plines[j].amod = vfloat4::zero(); + samec_plines[j].bs = samec_lines[j].b; + } + + float uncor_error = 0.0f; + float samec_error = 0.0f; + + compute_error_squared_rgba(pi, + blk, + uncor_plines, + samec_plines, + line_lengths, + uncor_error, + samec_error); + + // Compute an estimate of error introduced by weight quantization imprecision. + // This error is computed as follows, for each partition + // 1: compute the principal-axis vector (full length) in error-space + // 2: convert the principal-axis vector to regular RGB-space + // 3: scale the vector by a constant that estimates average quantization error + // 4: for each texel, square the vector, then do a dot-product with the texel's + // error weight; sum up the results across all texels. + // 4(optimized): square the vector once, then do a dot-product with the average + // texel error, then multiply by the number of texels. + + for (unsigned int j = 0; j < partition_count; j++) + { + float tpp = static_cast(pi.partition_texel_count[j]); + vfloat4 error_weights(tpp * weight_imprecision_estim); + + vfloat4 uncor_vector = uncor_lines[j].b * line_lengths[j]; + vfloat4 samec_vector = samec_lines[j].b * line_lengths[j]; + + uncor_error += dot_s(uncor_vector * uncor_vector, error_weights); + samec_error += dot_s(samec_vector * samec_vector, error_weights); + } + + insert_result(requested_candidates, uncor_error, partition, uncor_best_errors, uncor_best_partitions); + insert_result(requested_candidates, samec_error, partition, samec_best_errors, samec_best_partitions); + } + } + else + { + for (unsigned int i = 0; i < partition_search_limit; i++) + { + unsigned int partition = partition_sequence[i]; + const auto& pi = bsd.get_raw_partition_info(partition_count, partition); + + // Compute weighting to give to each component in each partition + partition_metrics pms[BLOCK_MAX_PARTITIONS]; + compute_avgs_and_dirs_3_comp_rgb(pi, blk, pms); + + partition_lines3 plines[BLOCK_MAX_PARTITIONS]; + + for (unsigned int j = 0; j < partition_count; j++) + { + partition_metrics& pm = pms[j]; + partition_lines3& pl = plines[j]; + + pl.uncor_line.a = pm.avg; + pl.uncor_line.b = normalize_safe(pm.dir, unit3()); + + pl.samec_line.a = vfloat4::zero(); + pl.samec_line.b = normalize_safe(pm.avg, unit3()); + + pl.uncor_pline.amod = pl.uncor_line.a - pl.uncor_line.b * dot3(pl.uncor_line.a, pl.uncor_line.b); + pl.uncor_pline.bs = pl.uncor_line.b; + + pl.samec_pline.amod = vfloat4::zero(); + pl.samec_pline.bs = pl.samec_line.b; + } + + float uncor_error = 0.0f; + float samec_error = 0.0f; + + compute_error_squared_rgb(pi, + blk, + plines, + uncor_error, + samec_error); + + // Compute an estimate of error introduced by weight quantization imprecision. + // This error is computed as follows, for each partition + // 1: compute the principal-axis vector (full length) in error-space + // 2: convert the principal-axis vector to regular RGB-space + // 3: scale the vector by a constant that estimates average quantization error + // 4: for each texel, square the vector, then do a dot-product with the texel's + // error weight; sum up the results across all texels. + // 4(optimized): square the vector once, then do a dot-product with the average + // texel error, then multiply by the number of texels. + + for (unsigned int j = 0; j < partition_count; j++) + { + partition_lines3& pl = plines[j]; + + float tpp = static_cast(pi.partition_texel_count[j]); + vfloat4 error_weights(tpp * weight_imprecision_estim); + + vfloat4 uncor_vector = pl.uncor_line.b * pl.line_length; + vfloat4 samec_vector = pl.samec_line.b * pl.line_length; + + uncor_error += dot3_s(uncor_vector * uncor_vector, error_weights); + samec_error += dot3_s(samec_vector * samec_vector, error_weights); + } + + insert_result(requested_candidates, uncor_error, partition, uncor_best_errors, uncor_best_partitions); + insert_result(requested_candidates, samec_error, partition, samec_best_errors, samec_best_partitions); + } + } + + unsigned int interleave[2 * TUNE_MAX_PARTITIONING_CANDIDATES]; + for (unsigned int i = 0; i < requested_candidates; i++) + { + interleave[2 * i] = bsd.get_raw_partition_info(partition_count, uncor_best_partitions[i]).partition_index; + interleave[2 * i + 1] = bsd.get_raw_partition_info(partition_count, samec_best_partitions[i]).partition_index; + } + + uint64_t bitmasks[1024/64] { 0 }; + unsigned int emitted = 0; + + // Deduplicate the first "requested" entries + for (unsigned int i = 0; i < requested_candidates * 2; i++) + { + unsigned int partition = interleave[i]; + + unsigned int word = partition / 64; + unsigned int bit = partition % 64; + + bool written = bitmasks[word] & (1ull << bit); + + if (!written) + { + best_partitions[emitted] = partition; + bitmasks[word] |= 1ull << bit; + emitted++; + + if (emitted == requested_candidates) + { + break; + } + } + } + + return emitted; +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp b/ktx/external/astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp new file mode 100644 index 0000000..bd2e4ba --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_ideal_endpoints_and_weights.cpp @@ -0,0 +1,1652 @@ +// 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 for computing color endpoints and texel weights. + */ + +#include + +#include "astcenc_internal.h" +#include "astcenc_vecmathlib.h" + +/** + * @brief Compute the infilled weight for N texel indices in a decimated grid. + * + * @param di The weight grid decimation to use. + * @param weights The decimated weight values to use. + * @param index The first texel index to interpolate. + * + * @return The interpolated weight for the given set of SIMD_WIDTH texels. + */ +static vfloat bilinear_infill_vla( + const decimation_info& di, + const float* weights, + unsigned int index +) { + // Load the bilinear filter texel weight indexes in the decimated grid + const uint8_t* weight_idx0 = di.texel_weights_tr[0] + index; + const uint8_t* weight_idx1 = di.texel_weights_tr[1] + index; + const uint8_t* weight_idx2 = di.texel_weights_tr[2] + index; + const uint8_t* weight_idx3 = di.texel_weights_tr[3] + index; + + // Load the bilinear filter weights from the decimated grid + vfloat weight_val0 = gatherf_byte_inds(weights, weight_idx0); + vfloat weight_val1 = gatherf_byte_inds(weights, weight_idx1); + vfloat weight_val2 = gatherf_byte_inds(weights, weight_idx2); + vfloat weight_val3 = gatherf_byte_inds(weights, weight_idx3); + + // Load the weight contribution factors for each decimated weight + vfloat tex_weight_float0 = loada(di.texel_weight_contribs_float_tr[0] + index); + vfloat tex_weight_float1 = loada(di.texel_weight_contribs_float_tr[1] + index); + vfloat tex_weight_float2 = loada(di.texel_weight_contribs_float_tr[2] + index); + vfloat tex_weight_float3 = loada(di.texel_weight_contribs_float_tr[3] + index); + + // Compute the bilinear interpolation to generate the per-texel weight + return (weight_val0 * tex_weight_float0 + weight_val1 * tex_weight_float1) + + (weight_val2 * tex_weight_float2 + weight_val3 * tex_weight_float3); +} + +/** + * @brief Compute the infilled weight for N texel indices in a decimated grid. + * + * This is specialized version which computes only two weights per texel for + * encodings that are only decimated in a single axis. + * + * @param di The weight grid decimation to use. + * @param weights The decimated weight values to use. + * @param index The first texel index to interpolate. + * + * @return The interpolated weight for the given set of SIMD_WIDTH texels. + */ +static vfloat bilinear_infill_vla_2( + const decimation_info& di, + const float* weights, + unsigned int index +) { + // Load the bilinear filter texel weight indexes in the decimated grid + const uint8_t* weight_idx0 = di.texel_weights_tr[0] + index; + const uint8_t* weight_idx1 = di.texel_weights_tr[1] + index; + + // Load the bilinear filter weights from the decimated grid + vfloat weight_val0 = gatherf_byte_inds(weights, weight_idx0); + vfloat weight_val1 = gatherf_byte_inds(weights, weight_idx1); + + // Load the weight contribution factors for each decimated weight + vfloat tex_weight_float0 = loada(di.texel_weight_contribs_float_tr[0] + index); + vfloat tex_weight_float1 = loada(di.texel_weight_contribs_float_tr[1] + index); + + // Compute the bilinear interpolation to generate the per-texel weight + return (weight_val0 * tex_weight_float0 + weight_val1 * tex_weight_float1); +} + +/** + * @brief Compute the ideal endpoints and weights for 1 color component. + * + * @param blk The image block color data to compress. + * @param pi The partition info for the current trial. + * @param[out] ei The computed ideal endpoints and weights. + * @param component The color component to compute. + */ +static void compute_ideal_colors_and_weights_1_comp( + const image_block& blk, + const partition_info& pi, + endpoints_and_weights& ei, + unsigned int component +) { + unsigned int partition_count = pi.partition_count; + ei.ep.partition_count = partition_count; + promise(partition_count > 0); + + unsigned int texel_count = blk.texel_count; + promise(texel_count > 0); + + float error_weight; + const float* data_vr = nullptr; + + assert(component < BLOCK_MAX_COMPONENTS); + switch (component) + { + case 0: + error_weight = blk.channel_weight.lane<0>(); + data_vr = blk.data_r; + break; + case 1: + error_weight = blk.channel_weight.lane<1>(); + data_vr = blk.data_g; + break; + case 2: + error_weight = blk.channel_weight.lane<2>(); + data_vr = blk.data_b; + break; + default: + assert(component == 3); + error_weight = blk.channel_weight.lane<3>(); + data_vr = blk.data_a; + break; + } + + vmask4 sep_mask = vint4::lane_id() == vint4(component); + bool is_constant_wes { true }; + float partition0_len_sq { 0.0f }; + + for (unsigned int i = 0; i < partition_count; i++) + { + float lowvalue { 1e10f }; + float highvalue { -1e10f }; + + unsigned int partition_texel_count = pi.partition_texel_count[i]; + for (unsigned int j = 0; j < partition_texel_count; j++) + { + unsigned int tix = pi.texels_of_partition[i][j]; + float value = data_vr[tix]; + lowvalue = astc::min(value, lowvalue); + highvalue = astc::max(value, highvalue); + } + + if (highvalue <= lowvalue) + { + lowvalue = 0.0f; + highvalue = 1e-7f; + } + + float length = highvalue - lowvalue; + float length_squared = length * length; + float scale = 1.0f / length; + + if (i == 0) + { + partition0_len_sq = length_squared; + } + else + { + is_constant_wes = is_constant_wes && length_squared == partition0_len_sq; + } + + for (unsigned int j = 0; j < partition_texel_count; j++) + { + unsigned int tix = pi.texels_of_partition[i][j]; + float value = (data_vr[tix] - lowvalue) * scale; + value = astc::clamp1f(value); + + ei.weights[tix] = value; + ei.weight_error_scale[tix] = length_squared * error_weight; + assert(!astc::isnan(ei.weight_error_scale[tix])); + } + + ei.ep.endpt0[i] = select(blk.data_min, vfloat4(lowvalue), sep_mask); + ei.ep.endpt1[i] = select(blk.data_max, vfloat4(highvalue), sep_mask); + } + + // Zero initialize any SIMD over-fetch + size_t texel_count_simd = round_up_to_simd_multiple_vla(texel_count); + for (size_t i = texel_count; i < texel_count_simd; i++) + { + ei.weights[i] = 0.0f; + ei.weight_error_scale[i] = 0.0f; + } + + ei.is_constant_weight_error_scale = is_constant_wes; +} + +/** + * @brief Compute the ideal endpoints and weights for 2 color components. + * + * @param blk The image block color data to compress. + * @param pi The partition info for the current trial. + * @param[out] ei The computed ideal endpoints and weights. + * @param component1 The first color component to compute. + * @param component2 The second color component to compute. + */ +static void compute_ideal_colors_and_weights_2_comp( + const image_block& blk, + const partition_info& pi, + endpoints_and_weights& ei, + int component1, + int component2 +) { + unsigned int partition_count = pi.partition_count; + ei.ep.partition_count = partition_count; + promise(partition_count > 0); + + unsigned int texel_count = blk.texel_count; + promise(texel_count > 0); + + partition_metrics pms[BLOCK_MAX_PARTITIONS]; + + float error_weight; + const float* data_vr = nullptr; + const float* data_vg = nullptr; + + if (component1 == 0 && component2 == 1) + { + error_weight = hadd_s(blk.channel_weight.swz<0, 1>()) / 2.0f; + + data_vr = blk.data_r; + data_vg = blk.data_g; + } + else if (component1 == 0 && component2 == 2) + { + error_weight = hadd_s(blk.channel_weight.swz<0, 2>()) / 2.0f; + + data_vr = blk.data_r; + data_vg = blk.data_b; + } + else // (component1 == 1 && component2 == 2) + { + assert(component1 == 1 && component2 == 2); + + error_weight = hadd_s(blk.channel_weight.swz<1, 2>()) / 2.0f; + + data_vr = blk.data_g; + data_vg = blk.data_b; + } + + compute_avgs_and_dirs_2_comp(pi, blk, component1, component2, pms); + + bool is_constant_wes { true }; + float partition0_len_sq { 0.0f }; + + vmask4 comp1_mask = vint4::lane_id() == vint4(component1); + vmask4 comp2_mask = vint4::lane_id() == vint4(component2); + + for (unsigned int i = 0; i < partition_count; i++) + { + vfloat4 dir = pms[i].dir; + if (hadd_s(dir) < 0.0f) + { + dir = vfloat4::zero() - dir; + } + + line2 line { pms[i].avg, normalize_safe(dir, unit2()) }; + float lowparam { 1e10f }; + float highparam { -1e10f }; + + unsigned int partition_texel_count = pi.partition_texel_count[i]; + for (unsigned int j = 0; j < partition_texel_count; j++) + { + unsigned int tix = pi.texels_of_partition[i][j]; + vfloat4 point = vfloat2(data_vr[tix], data_vg[tix]); + float param = dot_s(point - line.a, line.b); + ei.weights[tix] = param; + + lowparam = astc::min(param, lowparam); + highparam = astc::max(param, highparam); + } + + // It is possible for a uniform-color partition to produce length=0; + // this causes NaN issues so set to small value to avoid this problem + if (highparam <= lowparam) + { + lowparam = 0.0f; + highparam = 1e-7f; + } + + float length = highparam - lowparam; + float length_squared = length * length; + float scale = 1.0f / length; + + if (i == 0) + { + partition0_len_sq = length_squared; + } + else + { + is_constant_wes = is_constant_wes && length_squared == partition0_len_sq; + } + + for (unsigned int j = 0; j < partition_texel_count; j++) + { + unsigned int tix = pi.texels_of_partition[i][j]; + float idx = (ei.weights[tix] - lowparam) * scale; + idx = astc::clamp1f(idx); + + ei.weights[tix] = idx; + ei.weight_error_scale[tix] = length_squared * error_weight; + assert(!astc::isnan(ei.weight_error_scale[tix])); + } + + vfloat4 lowvalue = line.a + line.b * lowparam; + vfloat4 highvalue = line.a + line.b * highparam; + + vfloat4 ep0 = select(blk.data_min, vfloat4(lowvalue.lane<0>()), comp1_mask); + vfloat4 ep1 = select(blk.data_max, vfloat4(highvalue.lane<0>()), comp1_mask); + + ei.ep.endpt0[i] = select(ep0, vfloat4(lowvalue.lane<1>()), comp2_mask); + ei.ep.endpt1[i] = select(ep1, vfloat4(highvalue.lane<1>()), comp2_mask); + } + + // Zero initialize any SIMD over-fetch + size_t texel_count_simd = round_up_to_simd_multiple_vla(texel_count); + for (size_t i = texel_count; i < texel_count_simd; i++) + { + ei.weights[i] = 0.0f; + ei.weight_error_scale[i] = 0.0f; + } + + ei.is_constant_weight_error_scale = is_constant_wes; +} + +/** + * @brief Compute the ideal endpoints and weights for 3 color components. + * + * @param blk The image block color data to compress. + * @param pi The partition info for the current trial. + * @param[out] ei The computed ideal endpoints and weights. + * @param omitted_component The color component excluded from the calculation. + */ +static void compute_ideal_colors_and_weights_3_comp( + const image_block& blk, + const partition_info& pi, + endpoints_and_weights& ei, + unsigned int omitted_component +) { + unsigned int partition_count = pi.partition_count; + ei.ep.partition_count = partition_count; + promise(partition_count > 0); + + unsigned int texel_count = blk.texel_count; + promise(texel_count > 0); + + partition_metrics pms[BLOCK_MAX_PARTITIONS]; + + float error_weight; + const float* data_vr = nullptr; + const float* data_vg = nullptr; + const float* data_vb = nullptr; + if (omitted_component == 0) + { + error_weight = hadd_s(blk.channel_weight.swz<0, 1, 2>()); + data_vr = blk.data_g; + data_vg = blk.data_b; + data_vb = blk.data_a; + } + else if (omitted_component == 1) + { + error_weight = hadd_s(blk.channel_weight.swz<0, 2, 3>()); + data_vr = blk.data_r; + data_vg = blk.data_b; + data_vb = blk.data_a; + } + else if (omitted_component == 2) + { + error_weight = hadd_s(blk.channel_weight.swz<0, 1, 3>()); + data_vr = blk.data_r; + data_vg = blk.data_g; + data_vb = blk.data_a; + } + else + { + assert(omitted_component == 3); + + error_weight = hadd_s(blk.channel_weight.swz<0, 1, 2>()); + data_vr = blk.data_r; + data_vg = blk.data_g; + data_vb = blk.data_b; + } + + error_weight = error_weight * (1.0f / 3.0f); + + if (omitted_component == 3) + { + compute_avgs_and_dirs_3_comp_rgb(pi, blk, pms); + } + else + { + compute_avgs_and_dirs_3_comp(pi, blk, omitted_component, pms); + } + + bool is_constant_wes { true }; + float partition0_len_sq { 0.0f }; + + for (unsigned int i = 0; i < partition_count; i++) + { + vfloat4 dir = pms[i].dir; + if (hadd_rgb_s(dir) < 0.0f) + { + dir = vfloat4::zero() - dir; + } + + line3 line { pms[i].avg, normalize_safe(dir, unit3()) }; + float lowparam { 1e10f }; + float highparam { -1e10f }; + + unsigned int partition_texel_count = pi.partition_texel_count[i]; + for (unsigned int j = 0; j < partition_texel_count; j++) + { + unsigned int tix = pi.texels_of_partition[i][j]; + vfloat4 point = vfloat3(data_vr[tix], data_vg[tix], data_vb[tix]); + float param = dot3_s(point - line.a, line.b); + ei.weights[tix] = param; + + lowparam = astc::min(param, lowparam); + highparam = astc::max(param, highparam); + } + + // It is possible for a uniform-color partition to produce length=0; + // this causes NaN issues so set to small value to avoid this problem + if (highparam <= lowparam) + { + lowparam = 0.0f; + highparam = 1e-7f; + } + + float length = highparam - lowparam; + float length_squared = length * length; + float scale = 1.0f / length; + + if (i == 0) + { + partition0_len_sq = length_squared; + } + else + { + is_constant_wes = is_constant_wes && length_squared == partition0_len_sq; + } + + for (unsigned int j = 0; j < partition_texel_count; j++) + { + unsigned int tix = pi.texels_of_partition[i][j]; + float idx = (ei.weights[tix] - lowparam) * scale; + idx = astc::clamp1f(idx); + + ei.weights[tix] = idx; + ei.weight_error_scale[tix] = length_squared * error_weight; + assert(!astc::isnan(ei.weight_error_scale[tix])); + } + + vfloat4 ep0 = line.a + line.b * lowparam; + vfloat4 ep1 = line.a + line.b * highparam; + + vfloat4 bmin = blk.data_min; + vfloat4 bmax = blk.data_max; + + assert(omitted_component < BLOCK_MAX_COMPONENTS); + switch (omitted_component) + { + case 0: + ei.ep.endpt0[i] = vfloat4(bmin.lane<0>(), ep0.lane<0>(), ep0.lane<1>(), ep0.lane<2>()); + ei.ep.endpt1[i] = vfloat4(bmax.lane<0>(), ep1.lane<0>(), ep1.lane<1>(), ep1.lane<2>()); + break; + case 1: + ei.ep.endpt0[i] = vfloat4(ep0.lane<0>(), bmin.lane<1>(), ep0.lane<1>(), ep0.lane<2>()); + ei.ep.endpt1[i] = vfloat4(ep1.lane<0>(), bmax.lane<1>(), ep1.lane<1>(), ep1.lane<2>()); + break; + case 2: + ei.ep.endpt0[i] = vfloat4(ep0.lane<0>(), ep0.lane<1>(), bmin.lane<2>(), ep0.lane<2>()); + ei.ep.endpt1[i] = vfloat4(ep1.lane<0>(), ep1.lane<1>(), bmax.lane<2>(), ep1.lane<2>()); + break; + default: + ei.ep.endpt0[i] = vfloat4(ep0.lane<0>(), ep0.lane<1>(), ep0.lane<2>(), bmin.lane<3>()); + ei.ep.endpt1[i] = vfloat4(ep1.lane<0>(), ep1.lane<1>(), ep1.lane<2>(), bmax.lane<3>()); + break; + } + } + + // Zero initialize any SIMD over-fetch + size_t texel_count_simd = round_up_to_simd_multiple_vla(texel_count); + for (size_t i = texel_count; i < texel_count_simd; i++) + { + ei.weights[i] = 0.0f; + ei.weight_error_scale[i] = 0.0f; + } + + ei.is_constant_weight_error_scale = is_constant_wes; +} + +/** + * @brief Compute the ideal endpoints and weights for 4 color components. + * + * @param blk The image block color data to compress. + * @param pi The partition info for the current trial. + * @param[out] ei The computed ideal endpoints and weights. + */ +static void compute_ideal_colors_and_weights_4_comp( + const image_block& blk, + const partition_info& pi, + endpoints_and_weights& ei +) { + const float error_weight = hadd_s(blk.channel_weight) / 4.0f; + + unsigned int partition_count = pi.partition_count; + + unsigned int texel_count = blk.texel_count; + promise(texel_count > 0); + promise(partition_count > 0); + + partition_metrics pms[BLOCK_MAX_PARTITIONS]; + + compute_avgs_and_dirs_4_comp(pi, blk, pms); + + bool is_constant_wes { true }; + float partition0_len_sq { 0.0f }; + + for (unsigned int i = 0; i < partition_count; i++) + { + vfloat4 dir = pms[i].dir; + if (hadd_rgb_s(dir) < 0.0f) + { + dir = vfloat4::zero() - dir; + } + + line4 line { pms[i].avg, normalize_safe(dir, unit4()) }; + float lowparam { 1e10f }; + float highparam { -1e10f }; + + unsigned int partition_texel_count = pi.partition_texel_count[i]; + for (unsigned int j = 0; j < partition_texel_count; j++) + { + unsigned int tix = pi.texels_of_partition[i][j]; + vfloat4 point = blk.texel(tix); + float param = dot_s(point - line.a, line.b); + ei.weights[tix] = param; + + lowparam = astc::min(param, lowparam); + highparam = astc::max(param, highparam); + } + + // It is possible for a uniform-color partition to produce length=0; + // this causes NaN issues so set to small value to avoid this problem + if (highparam <= lowparam) + { + lowparam = 0.0f; + highparam = 1e-7f; + } + + float length = highparam - lowparam; + float length_squared = length * length; + float scale = 1.0f / length; + + if (i == 0) + { + partition0_len_sq = length_squared; + } + else + { + is_constant_wes = is_constant_wes && length_squared == partition0_len_sq; + } + + ei.ep.endpt0[i] = line.a + line.b * lowparam; + ei.ep.endpt1[i] = line.a + line.b * highparam; + + for (unsigned int j = 0; j < partition_texel_count; j++) + { + unsigned int tix = pi.texels_of_partition[i][j]; + float idx = (ei.weights[tix] - lowparam) * scale; + idx = astc::clamp1f(idx); + + ei.weights[tix] = idx; + ei.weight_error_scale[tix] = length_squared * error_weight; + assert(!astc::isnan(ei.weight_error_scale[tix])); + } + } + + // Zero initialize any SIMD over-fetch + size_t texel_count_simd = round_up_to_simd_multiple_vla(texel_count); + for (size_t i = texel_count; i < texel_count_simd; i++) + { + ei.weights[i] = 0.0f; + ei.weight_error_scale[i] = 0.0f; + } + + ei.is_constant_weight_error_scale = is_constant_wes; +} + +/* See header for documentation. */ +void compute_ideal_colors_and_weights_1plane( + const image_block& blk, + const partition_info& pi, + endpoints_and_weights& ei +) { + bool uses_alpha = !blk.is_constant_channel(3); + + if (uses_alpha) + { + compute_ideal_colors_and_weights_4_comp(blk, pi, ei); + } + else + { + compute_ideal_colors_and_weights_3_comp(blk, pi, ei, 3); + } +} + +/* See header for documentation. */ +void compute_ideal_colors_and_weights_2planes( + const block_size_descriptor& bsd, + const image_block& blk, + unsigned int plane2_component, + endpoints_and_weights& ei1, + endpoints_and_weights& ei2 +) { + const auto& pi = bsd.get_partition_info(1, 0); + bool uses_alpha = !blk.is_constant_channel(3); + + assert(plane2_component < BLOCK_MAX_COMPONENTS); + switch (plane2_component) + { + case 0: // Separate weights for red + if (uses_alpha) + { + compute_ideal_colors_and_weights_3_comp(blk, pi, ei1, 0); + } + else + { + compute_ideal_colors_and_weights_2_comp(blk, pi, ei1, 1, 2); + } + compute_ideal_colors_and_weights_1_comp(blk, pi, ei2, 0); + break; + + case 1: // Separate weights for green + if (uses_alpha) + { + compute_ideal_colors_and_weights_3_comp(blk, pi, ei1, 1); + } + else + { + compute_ideal_colors_and_weights_2_comp(blk, pi, ei1, 0, 2); + } + compute_ideal_colors_and_weights_1_comp(blk, pi, ei2, 1); + break; + + case 2: // Separate weights for blue + if (uses_alpha) + { + compute_ideal_colors_and_weights_3_comp(blk, pi, ei1, 2); + } + else + { + compute_ideal_colors_and_weights_2_comp(blk, pi, ei1, 0, 1); + } + compute_ideal_colors_and_weights_1_comp(blk, pi, ei2, 2); + break; + + default: // Separate weights for alpha + assert(uses_alpha); + compute_ideal_colors_and_weights_3_comp(blk, pi, ei1, 3); + compute_ideal_colors_and_weights_1_comp(blk, pi, ei2, 3); + break; + } +} + +/* See header for documentation. */ +float compute_error_of_weight_set_1plane( + const endpoints_and_weights& eai, + const decimation_info& di, + const float* dec_weight_quant_uvalue +) { + vfloatacc error_summav = vfloatacc::zero(); + unsigned int texel_count = di.texel_count; + promise(texel_count > 0); + + // Process SIMD-width chunks, safe to over-fetch - the extra space is zero initialized + if (di.max_texel_weight_count > 2) + { + for (unsigned int i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + // Compute the bilinear interpolation of the decimated weight grid + vfloat current_values = bilinear_infill_vla(di, dec_weight_quant_uvalue, i); + + // Compute the error between the computed value and the ideal weight + vfloat actual_values = loada(eai.weights + i); + vfloat diff = current_values - actual_values; + vfloat significance = loada(eai.weight_error_scale + i); + vfloat error = diff * diff * significance; + + haccumulate(error_summav, error); + } + } + else if (di.max_texel_weight_count > 1) + { + for (unsigned int i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + // Compute the bilinear interpolation of the decimated weight grid + vfloat current_values = bilinear_infill_vla_2(di, dec_weight_quant_uvalue, i); + + // Compute the error between the computed value and the ideal weight + vfloat actual_values = loada(eai.weights + i); + vfloat diff = current_values - actual_values; + vfloat significance = loada(eai.weight_error_scale + i); + vfloat error = diff * diff * significance; + + haccumulate(error_summav, error); + } + } + else + { + for (unsigned int i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + // Load the weight set directly, without interpolation + vfloat current_values = loada(dec_weight_quant_uvalue + i); + + // Compute the error between the computed value and the ideal weight + vfloat actual_values = loada(eai.weights + i); + vfloat diff = current_values - actual_values; + vfloat significance = loada(eai.weight_error_scale + i); + vfloat error = diff * diff * significance; + + haccumulate(error_summav, error); + } + } + + // Resolve the final scalar accumulator sum + return hadd_s(error_summav); +} + +/* See header for documentation. */ +float compute_error_of_weight_set_2planes( + const endpoints_and_weights& eai1, + const endpoints_and_weights& eai2, + const decimation_info& di, + const float* dec_weight_quant_uvalue_plane1, + const float* dec_weight_quant_uvalue_plane2 +) { + vfloatacc error_summav = vfloatacc::zero(); + unsigned int texel_count = di.texel_count; + promise(texel_count > 0); + + // Process SIMD-width chunks, safe to over-fetch - the extra space is zero initialized + if (di.max_texel_weight_count > 2) + { + for (unsigned int i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + // Plane 1 + // Compute the bilinear interpolation of the decimated weight grid + vfloat current_values1 = bilinear_infill_vla(di, dec_weight_quant_uvalue_plane1, i); + + // Compute the error between the computed value and the ideal weight + vfloat actual_values1 = loada(eai1.weights + i); + vfloat diff = current_values1 - actual_values1; + vfloat error1 = diff * diff * loada(eai1.weight_error_scale + i); + + // Plane 2 + // Compute the bilinear interpolation of the decimated weight grid + vfloat current_values2 = bilinear_infill_vla(di, dec_weight_quant_uvalue_plane2, i); + + // Compute the error between the computed value and the ideal weight + vfloat actual_values2 = loada(eai2.weights + i); + diff = current_values2 - actual_values2; + vfloat error2 = diff * diff * loada(eai2.weight_error_scale + i); + + haccumulate(error_summav, error1 + error2); + } + } + else if (di.max_texel_weight_count > 1) + { + for (unsigned int i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + // Plane 1 + // Compute the bilinear interpolation of the decimated weight grid + vfloat current_values1 = bilinear_infill_vla_2(di, dec_weight_quant_uvalue_plane1, i); + + // Compute the error between the computed value and the ideal weight + vfloat actual_values1 = loada(eai1.weights + i); + vfloat diff = current_values1 - actual_values1; + vfloat error1 = diff * diff * loada(eai1.weight_error_scale + i); + + // Plane 2 + // Compute the bilinear interpolation of the decimated weight grid + vfloat current_values2 = bilinear_infill_vla_2(di, dec_weight_quant_uvalue_plane2, i); + + // Compute the error between the computed value and the ideal weight + vfloat actual_values2 = loada(eai2.weights + i); + diff = current_values2 - actual_values2; + vfloat error2 = diff * diff * loada(eai2.weight_error_scale + i); + + haccumulate(error_summav, error1 + error2); + } + } + else + { + for (unsigned int i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + // Plane 1 + // Load the weight set directly, without interpolation + vfloat current_values1 = loada(dec_weight_quant_uvalue_plane1 + i); + + // Compute the error between the computed value and the ideal weight + vfloat actual_values1 = loada(eai1.weights + i); + vfloat diff = current_values1 - actual_values1; + vfloat error1 = diff * diff * loada(eai1.weight_error_scale + i); + + // Plane 2 + // Load the weight set directly, without interpolation + vfloat current_values2 = loada(dec_weight_quant_uvalue_plane2 + i); + + // Compute the error between the computed value and the ideal weight + vfloat actual_values2 = loada(eai2.weights + i); + diff = current_values2 - actual_values2; + vfloat error2 = diff * diff * loada(eai2.weight_error_scale + i); + + haccumulate(error_summav, error1 + error2); + } + } + + // Resolve the final scalar accumulator sum + return hadd_s(error_summav); +} + +/* See header for documentation. */ +void compute_ideal_weights_for_decimation( + const endpoints_and_weights& ei, + const decimation_info& di, + float* dec_weight_ideal_value +) { + unsigned int texel_count = di.texel_count; + unsigned int weight_count = di.weight_count; + bool is_direct = texel_count == weight_count; + promise(texel_count > 0); + promise(weight_count > 0); + + // If we have a 1:1 mapping just shortcut the computation. Transfer enough to also copy the + // zero-initialized SIMD over-fetch region + if (is_direct) + { + for (unsigned int i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + vfloat weight(ei.weights + i); + storea(weight, dec_weight_ideal_value + i); + } + + return; + } + + // Otherwise compute an estimate and perform single refinement iteration + + // Compute an initial average for each decimated weight + bool constant_wes = ei.is_constant_weight_error_scale; + vfloat weight_error_scale(ei.weight_error_scale[0]); + + // This overshoots - this is OK as we initialize the array tails in the + // decimation table structures to safe values ... + for (unsigned int i = 0; i < weight_count; i += ASTCENC_SIMD_WIDTH) + { + // Start with a small value to avoid div-by-zero later + vfloat weight_weight(1e-10f); + vfloat initial_weight = vfloat::zero(); + + // Accumulate error weighting of all the texels using this weight + vint weight_texel_count(di.weight_texel_count + i); + unsigned int max_texel_count = hmax_s(weight_texel_count); + promise(max_texel_count > 0); + + for (unsigned int j = 0; j < max_texel_count; j++) + { + const uint8_t* texel = di.weight_texels_tr[j] + i; + vfloat weight = loada(di.weights_texel_contribs_tr[j] + i); + + if (!constant_wes) + { + weight_error_scale = gatherf_byte_inds(ei.weight_error_scale, texel); + } + + vfloat contrib_weight = weight * weight_error_scale; + + weight_weight += contrib_weight; + initial_weight += gatherf_byte_inds(ei.weights, texel) * contrib_weight; + } + + storea(initial_weight / weight_weight, dec_weight_ideal_value + i); + } + + // Populate the interpolated weight grid based on the initial average + // Process SIMD-width texel coordinates at at time while we can. Safe to + // over-process full SIMD vectors - the tail is zeroed. + ASTCENC_ALIGNAS float infilled_weights[BLOCK_MAX_TEXELS]; + if (di.max_texel_weight_count <= 2) + { + for (unsigned int i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + vfloat weight = bilinear_infill_vla_2(di, dec_weight_ideal_value, i); + storea(weight, infilled_weights + i); + } + } + else + { + for (unsigned int i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + vfloat weight = bilinear_infill_vla(di, dec_weight_ideal_value, i); + storea(weight, infilled_weights + i); + } + } + + // Perform a single iteration of refinement + // Empirically determined step size; larger values don't help but smaller drops image quality + constexpr float stepsize = 0.25f; + constexpr float chd_scale = -WEIGHTS_TEXEL_SUM; + + for (unsigned int i = 0; i < weight_count; i += ASTCENC_SIMD_WIDTH) + { + vfloat weight_val = loada(dec_weight_ideal_value + i); + + // Accumulate error weighting of all the texels using this weight + // Start with a small value to avoid div-by-zero later + vfloat error_change0(1e-10f); + vfloat error_change1(0.0f); + + // Accumulate error weighting of all the texels using this weight + vint weight_texel_count(di.weight_texel_count + i); + unsigned int max_texel_count = hmax_s(weight_texel_count); + promise(max_texel_count > 0); + + for (unsigned int j = 0; j < max_texel_count; j++) + { + const uint8_t* texel = di.weight_texels_tr[j] + i; + vfloat contrib_weight = loada(di.weights_texel_contribs_tr[j] + i); + + if (!constant_wes) + { + weight_error_scale = gatherf_byte_inds(ei.weight_error_scale, texel); + } + + vfloat scale = weight_error_scale * contrib_weight; + vfloat old_weight = gatherf_byte_inds(infilled_weights, texel); + vfloat ideal_weight = gatherf_byte_inds(ei.weights, texel); + + error_change0 += contrib_weight * scale; + error_change1 += (old_weight - ideal_weight) * scale; + } + + vfloat step = (error_change1 * chd_scale) / error_change0; + step = clamp(-stepsize, stepsize, step); + + // Update the weight; note this can store negative values + storea(weight_val + step, dec_weight_ideal_value + i); + } +} + +/* See header for documentation. */ +void compute_quantized_weights_for_decimation( + const decimation_info& di, + float low_bound, + float high_bound, + const float* dec_weight_ideal_value, + float* weight_set_out, + uint8_t* quantized_weight_set, + quant_method quant_level +) { + int weight_count = di.weight_count; + promise(weight_count > 0); + const quant_and_transfer_table& qat = quant_and_xfer_tables[quant_level]; + + // The available quant levels, stored with a minus 1 bias + static const float quant_levels_m1[12] { + 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 7.0f, 9.0f, 11.0f, 15.0f, 19.0f, 23.0f, 31.0f + }; + + vint steps_m1(get_quant_level(quant_level) - 1); + float quant_level_m1 = quant_levels_m1[quant_level]; + + // Quantize the weight set using both the specified low/high bounds and standard 0..1 bounds + + // TODO: Oddity to investigate; triggered by test in issue #265. + if (high_bound <= low_bound) + { + low_bound = 0.0f; + high_bound = 1.0f; + } + + float rscale = high_bound - low_bound; + float scale = 1.0f / rscale; + + float scaled_low_bound = low_bound * scale; + rscale *= 1.0f / 64.0f; + + vfloat scalev(scale); + vfloat scaled_low_boundv(scaled_low_bound); + vfloat quant_level_m1v(quant_level_m1); + vfloat rscalev(rscale); + vfloat low_boundv(low_bound); + + // This runs to the rounded-up SIMD size, which is safe as the loop tail is filled with known + // safe data in compute_ideal_weights_for_decimation and arrays are always 64 elements + if (get_quant_level(quant_level) <= 16) + { + vtable_16x8 table; + vtable_prepare(table, qat.quant_to_unquant); + + for (int i = 0; i < weight_count; i += ASTCENC_SIMD_WIDTH) + { + vfloat ix = loada(dec_weight_ideal_value + i) * scalev - scaled_low_boundv; + ix = clampzo(ix); + + // Look up the two closest indexes and return the one that was closest + vfloat ix1 = ix * quant_level_m1v; + + vint weightl = float_to_int(ix1); + vint weighth = min(weightl + vint(1), steps_m1); + + vint ixli = vtable_lookup_32bit(table, weightl); + vint ixhi = vtable_lookup_32bit(table, weighth); + + vfloat ixl = int_to_float(ixli); + vfloat ixh = int_to_float(ixhi); + + vmask mask = (ixl + ixh) < (vfloat(128.0f) * ix); + vint weight = select(ixli, ixhi, mask); + ixl = select(ixl, ixh, mask); + + // Invert the weight-scaling that was done initially + storea(ixl * rscalev + low_boundv, weight_set_out + i); + pack_and_store_low_bytes(weight, quantized_weight_set + i); + } + } + else + { + vtable_32x8 table; + vtable_prepare(table, qat.quant_to_unquant); + + for (int i = 0; i < weight_count; i += ASTCENC_SIMD_WIDTH) + { + vfloat ix = loada(dec_weight_ideal_value + i) * scalev - scaled_low_boundv; + ix = clampzo(ix); + + // Look up the two closest indexes and return the one that was closest + vfloat ix1 = ix * quant_level_m1v; + + vint weightl = float_to_int(ix1); + vint weighth = min(weightl + vint(1), steps_m1); + + vint ixli = vtable_lookup_32bit(table, weightl); + vint ixhi = vtable_lookup_32bit(table, weighth); + + vfloat ixl = int_to_float(ixli); + vfloat ixh = int_to_float(ixhi); + + vmask mask = (ixl + ixh) < (vfloat(128.0f) * ix); + vint weight = select(ixli, ixhi, mask); + ixl = select(ixl, ixh, mask); + + // Invert the weight-scaling that was done initially + storea(ixl * rscalev + low_boundv, weight_set_out + i); + pack_and_store_low_bytes(weight, quantized_weight_set + i); + } + } +} + +/** + * @brief Compute the RGB + offset for a HDR endpoint mode #7. + * + * Since the matrix needed has a regular structure we can simplify the inverse calculation. This + * gives us ~24 multiplications vs. 96 for a generic inverse. + * + * mat[0] = vfloat4(rgba_ws.x, 0.0f, 0.0f, wght_ws.x); + * mat[1] = vfloat4( 0.0f, rgba_ws.y, 0.0f, wght_ws.y); + * mat[2] = vfloat4( 0.0f, 0.0f, rgba_ws.z, wght_ws.z); + * mat[3] = vfloat4(wght_ws.x, wght_ws.y, wght_ws.z, psum); + * mat = invert(mat); + * + * @param rgba_weight_sum Sum of partition component error weights. + * @param weight_weight_sum Sum of partition component error weights * texel weight. + * @param rgbq_sum Sum of partition component error weights * texel weight * color data. + * @param psum Sum of RGB color weights * texel weight^2. + */ +static inline vfloat4 compute_rgbo_vector( + vfloat4 rgba_weight_sum, + vfloat4 weight_weight_sum, + vfloat4 rgbq_sum, + float psum +) { + float X = rgba_weight_sum.lane<0>(); + float Y = rgba_weight_sum.lane<1>(); + float Z = rgba_weight_sum.lane<2>(); + float P = weight_weight_sum.lane<0>(); + float Q = weight_weight_sum.lane<1>(); + float R = weight_weight_sum.lane<2>(); + float S = psum; + + float PP = P * P; + float QQ = Q * Q; + float RR = R * R; + + float SZmRR = S * Z - RR; + float DT = SZmRR * Y - Z * QQ; + float YP = Y * P; + float QX = Q * X; + float YX = Y * X; + float mZYP = -Z * YP; + float mZQX = -Z * QX; + float mRYX = -R * YX; + float ZQP = Z * Q * P; + float RYP = R * YP; + float RQX = R * QX; + + // Compute the reciprocal of matrix determinant + float rdet = 1.0f / (DT * X + mZYP * P); + + // Actually compute the adjugate, and then apply 1/det separately + vfloat4 mat0(DT, ZQP, RYP, mZYP); + vfloat4 mat1(ZQP, SZmRR * X - Z * PP, RQX, mZQX); + vfloat4 mat2(RYP, RQX, (S * Y - QQ) * X - Y * PP, mRYX); + vfloat4 mat3(mZYP, mZQX, mRYX, Z * YX); + vfloat4 vect = rgbq_sum * rdet; + + return vfloat4(dot_s(mat0, vect), + dot_s(mat1, vect), + dot_s(mat2, vect), + dot_s(mat3, vect)); +} + +/* See header for documentation. */ +void recompute_ideal_colors_1plane( + const image_block& blk, + const partition_info& pi, + const decimation_info& di, + const uint8_t* dec_weights_uquant, + endpoints& ep, + vfloat4 rgbs_vectors[BLOCK_MAX_PARTITIONS], + vfloat4 rgbo_vectors[BLOCK_MAX_PARTITIONS] +) { + unsigned int weight_count = di.weight_count; + unsigned int total_texel_count = blk.texel_count; + unsigned int partition_count = pi.partition_count; + + promise(weight_count > 0); + promise(total_texel_count > 0); + promise(partition_count > 0); + + ASTCENC_ALIGNAS float dec_weight[BLOCK_MAX_WEIGHTS]; + for (unsigned int i = 0; i < weight_count; i += ASTCENC_SIMD_WIDTH) + { + vint unquant_value(dec_weights_uquant + i); + vfloat unquant_valuef = int_to_float(unquant_value) * vfloat(1.0f / 64.0f); + storea(unquant_valuef, dec_weight + i); + } + + ASTCENC_ALIGNAS float undec_weight[BLOCK_MAX_TEXELS]; + float* undec_weight_ref; + if (di.max_texel_weight_count == 1) + { + undec_weight_ref = dec_weight; + } + else if (di.max_texel_weight_count <= 2) + { + for (unsigned int i = 0; i < total_texel_count; i += ASTCENC_SIMD_WIDTH) + { + vfloat weight = bilinear_infill_vla_2(di, dec_weight, i); + storea(weight, undec_weight + i); + } + + undec_weight_ref = undec_weight; + } + else + { + for (unsigned int i = 0; i < total_texel_count; i += ASTCENC_SIMD_WIDTH) + { + vfloat weight = bilinear_infill_vla(di, dec_weight, i); + storea(weight, undec_weight + i); + } + + undec_weight_ref = undec_weight; + } + + vfloat4 rgba_sum(blk.data_mean * static_cast(blk.texel_count)); + + for (unsigned int i = 0; i < partition_count; i++) + { + unsigned int texel_count = pi.partition_texel_count[i]; + const uint8_t *texel_indexes = pi.texels_of_partition[i]; + + // Only compute a partition mean if more than one partition + if (partition_count > 1) + { + rgba_sum = vfloat4::zero(); + promise(texel_count > 0); + for (unsigned int j = 0; j < texel_count; j++) + { + unsigned int tix = texel_indexes[j]; + rgba_sum += blk.texel(tix); + } + } + + rgba_sum = rgba_sum * blk.channel_weight; + vfloat4 rgba_weight_sum = max(blk.channel_weight * static_cast(texel_count), 1e-17f); + vfloat4 scale_dir = normalize((rgba_sum / rgba_weight_sum).swz<0, 1, 2>()); + + float scale_max = 0.0f; + float scale_min = 1e10f; + + float wmin1 = 1.0f; + float wmax1 = 0.0f; + + float left_sum_s = 0.0f; + float middle_sum_s = 0.0f; + float right_sum_s = 0.0f; + + vfloat4 color_vec_x = vfloat4::zero(); + vfloat4 color_vec_y = vfloat4::zero(); + + vfloat4 scale_vec = vfloat4::zero(); + + float weight_weight_sum_s = 1e-17f; + + vfloat4 color_weight = blk.channel_weight; + float ls_weight = hadd_rgb_s(color_weight); + + for (unsigned int j = 0; j < texel_count; j++) + { + unsigned int tix = texel_indexes[j]; + vfloat4 rgba = blk.texel(tix); + + float idx0 = undec_weight_ref[tix]; + + float om_idx0 = 1.0f - idx0; + wmin1 = astc::min(idx0, wmin1); + wmax1 = astc::max(idx0, wmax1); + + float scale = dot3_s(scale_dir, rgba); + scale_min = astc::min(scale, scale_min); + scale_max = astc::max(scale, scale_max); + + left_sum_s += om_idx0 * om_idx0; + middle_sum_s += om_idx0 * idx0; + right_sum_s += idx0 * idx0; + weight_weight_sum_s += idx0; + + vfloat4 color_idx(idx0); + vfloat4 cwprod = rgba; + vfloat4 cwiprod = cwprod * color_idx; + + color_vec_y += cwiprod; + color_vec_x += cwprod - cwiprod; + + scale_vec += vfloat2(om_idx0, idx0) * (scale * ls_weight); + } + + vfloat4 left_sum = vfloat4(left_sum_s) * color_weight; + vfloat4 middle_sum = vfloat4(middle_sum_s) * color_weight; + vfloat4 right_sum = vfloat4(right_sum_s) * color_weight; + vfloat4 lmrs_sum = vfloat3(left_sum_s, middle_sum_s, right_sum_s) * ls_weight; + + color_vec_x = color_vec_x * color_weight; + color_vec_y = color_vec_y * color_weight; + + // Initialize the luminance and scale vectors with a reasonable default + float scalediv = scale_min / astc::max(scale_max, 1e-10f); + scalediv = astc::clamp1f(scalediv); + + vfloat4 sds = scale_dir * scale_max; + + rgbs_vectors[i] = vfloat4(sds.lane<0>(), sds.lane<1>(), sds.lane<2>(), scalediv); + + if (wmin1 >= wmax1 * 0.999f) + { + // If all weights in the partition were equal, then just take average of all colors in + // the partition and use that as both endpoint colors + vfloat4 avg = (color_vec_x + color_vec_y) / rgba_weight_sum; + + vmask4 notnan_mask = avg == avg; + ep.endpt0[i] = select(ep.endpt0[i], avg, notnan_mask); + ep.endpt1[i] = select(ep.endpt1[i], avg, notnan_mask); + + rgbs_vectors[i] = vfloat4(sds.lane<0>(), sds.lane<1>(), sds.lane<2>(), 1.0f); + } + else + { + // Otherwise, complete the analytic calculation of ideal-endpoint-values for the given + // set of texel weights and pixel colors + vfloat4 color_det1 = (left_sum * right_sum) - (middle_sum * middle_sum); + vfloat4 color_rdet1 = 1.0f / color_det1; + + float ls_det1 = (lmrs_sum.lane<0>() * lmrs_sum.lane<2>()) - (lmrs_sum.lane<1>() * lmrs_sum.lane<1>()); + float ls_rdet1 = 1.0f / ls_det1; + + vfloat4 color_mss1 = (left_sum * left_sum) + + (2.0f * middle_sum * middle_sum) + + (right_sum * right_sum); + + float ls_mss1 = (lmrs_sum.lane<0>() * lmrs_sum.lane<0>()) + + (2.0f * lmrs_sum.lane<1>() * lmrs_sum.lane<1>()) + + (lmrs_sum.lane<2>() * lmrs_sum.lane<2>()); + + vfloat4 ep0 = (right_sum * color_vec_x - middle_sum * color_vec_y) * color_rdet1; + vfloat4 ep1 = (left_sum * color_vec_y - middle_sum * color_vec_x) * color_rdet1; + + vmask4 det_mask = abs(color_det1) > (color_mss1 * 1e-4f); + vmask4 notnan_mask = (ep0 == ep0) & (ep1 == ep1); + vmask4 full_mask = det_mask & notnan_mask; + + ep.endpt0[i] = select(ep.endpt0[i], ep0, full_mask); + ep.endpt1[i] = select(ep.endpt1[i], ep1, full_mask); + + float scale_ep0 = (lmrs_sum.lane<2>() * scale_vec.lane<0>() - lmrs_sum.lane<1>() * scale_vec.lane<1>()) * ls_rdet1; + float scale_ep1 = (lmrs_sum.lane<0>() * scale_vec.lane<1>() - lmrs_sum.lane<1>() * scale_vec.lane<0>()) * ls_rdet1; + + if (fabsf(ls_det1) > (ls_mss1 * 1e-4f) && scale_ep0 == scale_ep0 && scale_ep1 == scale_ep1 && scale_ep0 < scale_ep1) + { + float scalediv2 = scale_ep0 / scale_ep1; + vfloat4 sdsm = scale_dir * scale_ep1; + rgbs_vectors[i] = vfloat4(sdsm.lane<0>(), sdsm.lane<1>(), sdsm.lane<2>(), scalediv2); + } + } + + // Calculations specific to mode #7, the HDR RGB-scale mode - skip if known LDR + if (blk.rgb_lns[0] || blk.alpha_lns[0]) + { + vfloat4 weight_weight_sum = vfloat4(weight_weight_sum_s) * color_weight; + float psum = right_sum_s * hadd_rgb_s(color_weight); + + vfloat4 rgbq_sum = color_vec_x + color_vec_y; + rgbq_sum.set_lane<3>(hadd_rgb_s(color_vec_y)); + + vfloat4 rgbovec = compute_rgbo_vector(rgba_weight_sum, weight_weight_sum, rgbq_sum, psum); + rgbo_vectors[i] = rgbovec; + + // We can get a failure due to the use of a singular (non-invertible) matrix + // If it failed, compute rgbo_vectors[] with a different method ... + if (astc::isnan(dot_s(rgbovec, rgbovec))) + { + vfloat4 v0 = ep.endpt0[i]; + vfloat4 v1 = ep.endpt1[i]; + + float avgdif = hadd_rgb_s(v1 - v0) * (1.0f / 3.0f); + avgdif = astc::max(avgdif, 0.0f); + + vfloat4 avg = (v0 + v1) * 0.5f; + vfloat4 ep0 = avg - vfloat4(avgdif) * 0.5f; + rgbo_vectors[i] = vfloat4(ep0.lane<0>(), ep0.lane<1>(), ep0.lane<2>(), avgdif); + } + } + } +} + +/* See header for documentation. */ +void recompute_ideal_colors_2planes( + const image_block& blk, + const block_size_descriptor& bsd, + const decimation_info& di, + const uint8_t* dec_weights_uquant_plane1, + const uint8_t* dec_weights_uquant_plane2, + endpoints& ep, + vfloat4& rgbs_vector, + vfloat4& rgbo_vector, + int plane2_component +) { + unsigned int weight_count = di.weight_count; + unsigned int total_texel_count = blk.texel_count; + + promise(total_texel_count > 0); + promise(weight_count > 0); + + ASTCENC_ALIGNAS float dec_weight_plane1[BLOCK_MAX_WEIGHTS_2PLANE]; + ASTCENC_ALIGNAS float dec_weight_plane2[BLOCK_MAX_WEIGHTS_2PLANE]; + + assert(weight_count <= BLOCK_MAX_WEIGHTS_2PLANE); + + for (unsigned int i = 0; i < weight_count; i += ASTCENC_SIMD_WIDTH) + { + vint unquant_value1(dec_weights_uquant_plane1 + i); + vfloat unquant_value1f = int_to_float(unquant_value1) * vfloat(1.0f / 64.0f); + storea(unquant_value1f, dec_weight_plane1 + i); + + vint unquant_value2(dec_weights_uquant_plane2 + i); + vfloat unquant_value2f = int_to_float(unquant_value2) * vfloat(1.0f / 64.0f); + storea(unquant_value2f, dec_weight_plane2 + i); + } + + ASTCENC_ALIGNAS float undec_weight_plane1[BLOCK_MAX_TEXELS]; + ASTCENC_ALIGNAS float undec_weight_plane2[BLOCK_MAX_TEXELS]; + + float* undec_weight_plane1_ref; + float* undec_weight_plane2_ref; + + if (di.max_texel_weight_count == 1) + { + undec_weight_plane1_ref = dec_weight_plane1; + undec_weight_plane2_ref = dec_weight_plane2; + } + else if (di.max_texel_weight_count <= 2) + { + for (unsigned int i = 0; i < total_texel_count; i += ASTCENC_SIMD_WIDTH) + { + vfloat weight = bilinear_infill_vla_2(di, dec_weight_plane1, i); + storea(weight, undec_weight_plane1 + i); + + weight = bilinear_infill_vla_2(di, dec_weight_plane2, i); + storea(weight, undec_weight_plane2 + i); + } + + undec_weight_plane1_ref = undec_weight_plane1; + undec_weight_plane2_ref = undec_weight_plane2; + } + else + { + for (unsigned int i = 0; i < total_texel_count; i += ASTCENC_SIMD_WIDTH) + { + vfloat weight = bilinear_infill_vla(di, dec_weight_plane1, i); + storea(weight, undec_weight_plane1 + i); + + weight = bilinear_infill_vla(di, dec_weight_plane2, i); + storea(weight, undec_weight_plane2 + i); + } + + undec_weight_plane1_ref = undec_weight_plane1; + undec_weight_plane2_ref = undec_weight_plane2; + } + + unsigned int texel_count = bsd.texel_count; + vfloat4 rgba_weight_sum = max(blk.channel_weight * static_cast(texel_count), 1e-17f); + vfloat4 scale_dir = normalize(blk.data_mean.swz<0, 1, 2>()); + + float scale_max = 0.0f; + float scale_min = 1e10f; + + float wmin1 = 1.0f; + float wmax1 = 0.0f; + + float wmin2 = 1.0f; + float wmax2 = 0.0f; + + float left1_sum_s = 0.0f; + float middle1_sum_s = 0.0f; + float right1_sum_s = 0.0f; + + float left2_sum_s = 0.0f; + float middle2_sum_s = 0.0f; + float right2_sum_s = 0.0f; + + vfloat4 color_vec_x = vfloat4::zero(); + vfloat4 color_vec_y = vfloat4::zero(); + + vfloat4 scale_vec = vfloat4::zero(); + + vfloat4 weight_weight_sum = vfloat4(1e-17f); + + vmask4 p2_mask = vint4::lane_id() == vint4(plane2_component); + vfloat4 color_weight = blk.channel_weight; + float ls_weight = hadd_rgb_s(color_weight); + + for (unsigned int j = 0; j < texel_count; j++) + { + vfloat4 rgba = blk.texel(j); + + float idx0 = undec_weight_plane1_ref[j]; + + float om_idx0 = 1.0f - idx0; + wmin1 = astc::min(idx0, wmin1); + wmax1 = astc::max(idx0, wmax1); + + float scale = dot3_s(scale_dir, rgba); + scale_min = astc::min(scale, scale_min); + scale_max = astc::max(scale, scale_max); + + left1_sum_s += om_idx0 * om_idx0; + middle1_sum_s += om_idx0 * idx0; + right1_sum_s += idx0 * idx0; + + float idx1 = undec_weight_plane2_ref[j]; + + float om_idx1 = 1.0f - idx1; + wmin2 = astc::min(idx1, wmin2); + wmax2 = astc::max(idx1, wmax2); + + left2_sum_s += om_idx1 * om_idx1; + middle2_sum_s += om_idx1 * idx1; + right2_sum_s += idx1 * idx1; + + vfloat4 color_idx = select(vfloat4(idx0), vfloat4(idx1), p2_mask); + + vfloat4 cwprod = rgba; + vfloat4 cwiprod = cwprod * color_idx; + + color_vec_y += cwiprod; + color_vec_x += cwprod - cwiprod; + + scale_vec += vfloat2(om_idx0, idx0) * (ls_weight * scale); + weight_weight_sum += color_idx; + } + + vfloat4 left1_sum = vfloat4(left1_sum_s) * color_weight; + vfloat4 middle1_sum = vfloat4(middle1_sum_s) * color_weight; + vfloat4 right1_sum = vfloat4(right1_sum_s) * color_weight; + vfloat4 lmrs_sum = vfloat3(left1_sum_s, middle1_sum_s, right1_sum_s) * ls_weight; + + vfloat4 left2_sum = vfloat4(left2_sum_s) * color_weight; + vfloat4 middle2_sum = vfloat4(middle2_sum_s) * color_weight; + vfloat4 right2_sum = vfloat4(right2_sum_s) * color_weight; + + color_vec_x = color_vec_x * color_weight; + color_vec_y = color_vec_y * color_weight; + + // Initialize the luminance and scale vectors with a reasonable default + float scalediv = scale_min / astc::max(scale_max, 1e-10f); + scalediv = astc::clamp1f(scalediv); + + vfloat4 sds = scale_dir * scale_max; + + rgbs_vector = vfloat4(sds.lane<0>(), sds.lane<1>(), sds.lane<2>(), scalediv); + + if (wmin1 >= wmax1 * 0.999f) + { + // If all weights in the partition were equal, then just take average of all colors in + // the partition and use that as both endpoint colors + vfloat4 avg = (color_vec_x + color_vec_y) / rgba_weight_sum; + + vmask4 p1_mask = vint4::lane_id() != vint4(plane2_component); + vmask4 notnan_mask = avg == avg; + vmask4 full_mask = p1_mask & notnan_mask; + + ep.endpt0[0] = select(ep.endpt0[0], avg, full_mask); + ep.endpt1[0] = select(ep.endpt1[0], avg, full_mask); + + rgbs_vector = vfloat4(sds.lane<0>(), sds.lane<1>(), sds.lane<2>(), 1.0f); + } + else + { + // Otherwise, complete the analytic calculation of ideal-endpoint-values for the given + // set of texel weights and pixel colors + vfloat4 color_det1 = (left1_sum * right1_sum) - (middle1_sum * middle1_sum); + vfloat4 color_rdet1 = 1.0f / color_det1; + + float ls_det1 = (lmrs_sum.lane<0>() * lmrs_sum.lane<2>()) - (lmrs_sum.lane<1>() * lmrs_sum.lane<1>()); + float ls_rdet1 = 1.0f / ls_det1; + + vfloat4 color_mss1 = (left1_sum * left1_sum) + + (2.0f * middle1_sum * middle1_sum) + + (right1_sum * right1_sum); + + float ls_mss1 = (lmrs_sum.lane<0>() * lmrs_sum.lane<0>()) + + (2.0f * lmrs_sum.lane<1>() * lmrs_sum.lane<1>()) + + (lmrs_sum.lane<2>() * lmrs_sum.lane<2>()); + + vfloat4 ep0 = (right1_sum * color_vec_x - middle1_sum * color_vec_y) * color_rdet1; + vfloat4 ep1 = (left1_sum * color_vec_y - middle1_sum * color_vec_x) * color_rdet1; + + float scale_ep0 = (lmrs_sum.lane<2>() * scale_vec.lane<0>() - lmrs_sum.lane<1>() * scale_vec.lane<1>()) * ls_rdet1; + float scale_ep1 = (lmrs_sum.lane<0>() * scale_vec.lane<1>() - lmrs_sum.lane<1>() * scale_vec.lane<0>()) * ls_rdet1; + + vmask4 p1_mask = vint4::lane_id() != vint4(plane2_component); + vmask4 det_mask = abs(color_det1) > (color_mss1 * 1e-4f); + vmask4 notnan_mask = (ep0 == ep0) & (ep1 == ep1); + vmask4 full_mask = p1_mask & det_mask & notnan_mask; + + ep.endpt0[0] = select(ep.endpt0[0], ep0, full_mask); + ep.endpt1[0] = select(ep.endpt1[0], ep1, full_mask); + + if (fabsf(ls_det1) > (ls_mss1 * 1e-4f) && scale_ep0 == scale_ep0 && scale_ep1 == scale_ep1 && scale_ep0 < scale_ep1) + { + float scalediv2 = scale_ep0 / scale_ep1; + vfloat4 sdsm = scale_dir * scale_ep1; + rgbs_vector = vfloat4(sdsm.lane<0>(), sdsm.lane<1>(), sdsm.lane<2>(), scalediv2); + } + } + + if (wmin2 >= wmax2 * 0.999f) + { + // If all weights in the partition were equal, then just take average of all colors in + // the partition and use that as both endpoint colors + vfloat4 avg = (color_vec_x + color_vec_y) / rgba_weight_sum; + + vmask4 notnan_mask = avg == avg; + vmask4 full_mask = p2_mask & notnan_mask; + + ep.endpt0[0] = select(ep.endpt0[0], avg, full_mask); + ep.endpt1[0] = select(ep.endpt1[0], avg, full_mask); + } + else + { + // Otherwise, complete the analytic calculation of ideal-endpoint-values for the given + // set of texel weights and pixel colors + vfloat4 color_det2 = (left2_sum * right2_sum) - (middle2_sum * middle2_sum); + vfloat4 color_rdet2 = 1.0f / color_det2; + + vfloat4 color_mss2 = (left2_sum * left2_sum) + + (2.0f * middle2_sum * middle2_sum) + + (right2_sum * right2_sum); + + vfloat4 ep0 = (right2_sum * color_vec_x - middle2_sum * color_vec_y) * color_rdet2; + vfloat4 ep1 = (left2_sum * color_vec_y - middle2_sum * color_vec_x) * color_rdet2; + + vmask4 det_mask = abs(color_det2) > (color_mss2 * 1e-4f); + vmask4 notnan_mask = (ep0 == ep0) & (ep1 == ep1); + vmask4 full_mask = p2_mask & det_mask & notnan_mask; + + ep.endpt0[0] = select(ep.endpt0[0], ep0, full_mask); + ep.endpt1[0] = select(ep.endpt1[0], ep1, full_mask); + } + + // Calculations specific to mode #7, the HDR RGB-scale mode - skip if known LDR + if (blk.rgb_lns[0] || blk.alpha_lns[0]) + { + weight_weight_sum = weight_weight_sum * color_weight; + float psum = dot3_s(select(right1_sum, right2_sum, p2_mask), color_weight); + + vfloat4 rgbq_sum = color_vec_x + color_vec_y; + rgbq_sum.set_lane<3>(hadd_rgb_s(color_vec_y)); + + rgbo_vector = compute_rgbo_vector(rgba_weight_sum, weight_weight_sum, rgbq_sum, psum); + + // We can get a failure due to the use of a singular (non-invertible) matrix + // If it failed, compute rgbo_vectors[] with a different method ... + if (astc::isnan(dot_s(rgbo_vector, rgbo_vector))) + { + vfloat4 v0 = ep.endpt0[0]; + vfloat4 v1 = ep.endpt1[0]; + + float avgdif = hadd_rgb_s(v1 - v0) * (1.0f / 3.0f); + avgdif = astc::max(avgdif, 0.0f); + + vfloat4 avg = (v0 + v1) * 0.5f; + vfloat4 ep0 = avg - vfloat4(avgdif) * 0.5f; + + rgbo_vector = vfloat4(ep0.lane<0>(), ep0.lane<1>(), ep0.lane<2>(), avgdif); + } + } +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_image.cpp b/ktx/external/astc-encoder/Source/astcenc_image.cpp new file mode 100644 index 0000000..079f69f --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_image.cpp @@ -0,0 +1,558 @@ +// 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for creating in-memory ASTC image structures. + */ + +#include +#include + +#include "astcenc_internal.h" + +/** + * @brief Loader pipeline function type for data fetch from memory. + */ +using pixel_loader = vfloat4(*)(const void*, int); + +/** + * @brief Loader pipeline function type for swizzling data in a vector. + */ +using pixel_swizzler = vfloat4(*)(vfloat4, const astcenc_swizzle&); + +/** + * @brief Loader pipeline function type for converting data in a vector to LNS. + */ +using pixel_converter = vfloat4(*)(vfloat4, vmask4); + +/** + * @brief Load a 8-bit UNORM texel from a data array. + * + * @param data The data pointer. + * @param base_offset The index offset to the start of the pixel. + */ +static vfloat4 load_texel_u8( + const void* data, + int base_offset +) { + const uint8_t* data8 = static_cast(data); + return int_to_float(vint4(data8 + base_offset)) / 255.0f; +} + +/** + * @brief Load a 16-bit fp16 texel from a data array. + * + * @param data The data pointer. + * @param base_offset The index offset to the start of the pixel. + */ +static vfloat4 load_texel_f16( + const void* data, + int base_offset +) { + const uint16_t* data16 = static_cast(data); + int r = data16[base_offset ]; + int g = data16[base_offset + 1]; + int b = data16[base_offset + 2]; + int a = data16[base_offset + 3]; + return float16_to_float(vint4(r, g, b, a)); +} + +/** + * @brief Load a 32-bit float texel from a data array. + * + * @param data The data pointer. + * @param base_offset The index offset to the start of the pixel. + */ +static vfloat4 load_texel_f32( + const void* data, + int base_offset +) { + const float* data32 = static_cast(data); + return vfloat4(data32 + base_offset); +} + +/** + * @brief Dummy no-op swizzle function. + * + * @param data The source RGBA vector to swizzle. + * @param swz The swizzle to use. + */ +static vfloat4 swz_texel_skip( + vfloat4 data, + const astcenc_swizzle& swz +) { + (void)swz; + return data; +} + +/** + * @brief Swizzle a texel into a new arrangement. + * + * @param data The source RGBA vector to swizzle. + * @param swz The swizzle to use. + */ +static vfloat4 swz_texel( + vfloat4 data, + const astcenc_swizzle& swz +) { + ASTCENC_ALIGNAS float datas[6]; + + storea(data, datas); + datas[ASTCENC_SWZ_0] = 0.0f; + datas[ASTCENC_SWZ_1] = 1.0f; + + return vfloat4(datas[swz.r], datas[swz.g], datas[swz.b], datas[swz.a]); +} + +/** + * @brief Encode a texel that is entirely LDR linear. + * + * @param data The RGBA data to encode. + * @param lns_mask The mask for the HDR channels than need LNS encoding. + */ +static vfloat4 encode_texel_unorm( + vfloat4 data, + vmask4 lns_mask +) { + (void)lns_mask; + return data * 65535.0f; +} + +/** + * @brief Encode a texel that includes at least some HDR LNS texels. + * + * @param data The RGBA data to encode. + * @param lns_mask The mask for the HDR channels than need LNS encoding. + */ +static vfloat4 encode_texel_lns( + vfloat4 data, + vmask4 lns_mask +) { + vfloat4 datav_unorm = data * 65535.0f; + vfloat4 datav_lns = float_to_lns(data); + return select(datav_unorm, datav_lns, lns_mask); +} + +/* See header for documentation. */ +void load_image_block( + astcenc_profile decode_mode, + const astcenc_image& img, + image_block& blk, + const block_size_descriptor& bsd, + unsigned int xpos, + unsigned int ypos, + unsigned int zpos, + const astcenc_swizzle& swz +) { + unsigned int xsize = img.dim_x; + unsigned int ysize = img.dim_y; + unsigned int zsize = img.dim_z; + + blk.xpos = xpos; + blk.ypos = ypos; + blk.zpos = zpos; + + // True if any non-identity swizzle + bool needs_swz = (swz.r != ASTCENC_SWZ_R) || (swz.g != ASTCENC_SWZ_G) || + (swz.b != ASTCENC_SWZ_B) || (swz.a != ASTCENC_SWZ_A); + + int idx = 0; + + vfloat4 data_min(1e38f); + vfloat4 data_mean(0.0f); + vfloat4 data_mean_scale(1.0f / static_cast(bsd.texel_count)); + vfloat4 data_max(-1e38f); + vmask4 grayscalev(true); + + // This works because we impose the same choice everywhere during encode + uint8_t rgb_lns = (decode_mode == ASTCENC_PRF_HDR) || + (decode_mode == ASTCENC_PRF_HDR_RGB_LDR_A) ? 1 : 0; + uint8_t a_lns = decode_mode == ASTCENC_PRF_HDR ? 1 : 0; + vint4 use_lns(rgb_lns, rgb_lns, rgb_lns, a_lns); + vmask4 lns_mask = use_lns != vint4::zero(); + + // Set up the function pointers for loading pipeline as needed + pixel_loader loader = load_texel_u8; + if (img.data_type == ASTCENC_TYPE_F16) + { + loader = load_texel_f16; + } + else if (img.data_type == ASTCENC_TYPE_F32) + { + loader = load_texel_f32; + } + + pixel_swizzler swizzler = swz_texel_skip; + if (needs_swz) + { + swizzler = swz_texel; + } + + pixel_converter converter = encode_texel_unorm; + if (any(lns_mask)) + { + converter = encode_texel_lns; + } + + for (unsigned int z = 0; z < bsd.zdim; z++) + { + unsigned int zi = astc::min(zpos + z, zsize - 1); + void* plane = img.data[zi]; + + for (unsigned int y = 0; y < bsd.ydim; y++) + { + unsigned int yi = astc::min(ypos + y, ysize - 1); + + for (unsigned int x = 0; x < bsd.xdim; x++) + { + unsigned int xi = astc::min(xpos + x, xsize - 1); + + vfloat4 datav = loader(plane, (4 * xsize * yi) + (4 * xi)); + datav = swizzler(datav, swz); + datav = converter(datav, lns_mask); + + // Compute block metadata + data_min = min(data_min, datav); + data_mean += datav * data_mean_scale; + data_max = max(data_max, datav); + + grayscalev = grayscalev & (datav.swz<0,0,0,0>() == datav.swz<1,1,2,2>()); + + blk.data_r[idx] = datav.lane<0>(); + blk.data_g[idx] = datav.lane<1>(); + blk.data_b[idx] = datav.lane<2>(); + blk.data_a[idx] = datav.lane<3>(); + + blk.rgb_lns[idx] = rgb_lns; + blk.alpha_lns[idx] = a_lns; + + idx++; + } + } + } + + // Reverse the encoding so we store origin block in the original format + vfloat4 data_enc = blk.texel(0); + vfloat4 data_enc_unorm = data_enc / 65535.0f; + vfloat4 data_enc_lns = vfloat4::zero(); + + if (rgb_lns || a_lns) + { + data_enc_lns = float16_to_float(lns_to_sf16(float_to_int(data_enc))); + } + + blk.origin_texel = select(data_enc_unorm, data_enc_lns, lns_mask); + + // Store block metadata + blk.data_min = data_min; + blk.data_mean = data_mean; + blk.data_max = data_max; + blk.grayscale = all(grayscalev); +} + +/* See header for documentation. */ +void load_image_block_fast_ldr( + astcenc_profile decode_mode, + const astcenc_image& img, + image_block& blk, + const block_size_descriptor& bsd, + unsigned int xpos, + unsigned int ypos, + unsigned int zpos, + const astcenc_swizzle& swz +) { + (void)swz; + (void)decode_mode; + + unsigned int xsize = img.dim_x; + unsigned int ysize = img.dim_y; + + blk.xpos = xpos; + blk.ypos = ypos; + blk.zpos = zpos; + + vfloat4 data_min(1e38f); + vfloat4 data_mean = vfloat4::zero(); + vfloat4 data_max(-1e38f); + vmask4 grayscalev(true); + int idx = 0; + + const uint8_t* plane = static_cast(img.data[0]); + for (unsigned int y = ypos; y < ypos + bsd.ydim; y++) + { + unsigned int yi = astc::min(y, ysize - 1); + + for (unsigned int x = xpos; x < xpos + bsd.xdim; x++) + { + unsigned int xi = astc::min(x, xsize - 1); + + vint4 datavi = vint4(plane + (4 * xsize * yi) + (4 * xi)); + vfloat4 datav = int_to_float(datavi) * (65535.0f / 255.0f); + + // Compute block metadata + data_min = min(data_min, datav); + data_mean += datav; + data_max = max(data_max, datav); + + grayscalev = grayscalev & (datav.swz<0,0,0,0>() == datav.swz<1,1,2,2>()); + + blk.data_r[idx] = datav.lane<0>(); + blk.data_g[idx] = datav.lane<1>(); + blk.data_b[idx] = datav.lane<2>(); + blk.data_a[idx] = datav.lane<3>(); + + idx++; + } + } + + // Reverse the encoding so we store origin block in the original format + blk.origin_texel = blk.texel(0) / 65535.0f; + + // Store block metadata + blk.rgb_lns[0] = 0; + blk.alpha_lns[0] = 0; + blk.data_min = data_min; + blk.data_mean = data_mean / static_cast(bsd.texel_count); + blk.data_max = data_max; + blk.grayscale = all(grayscalev); +} + +/* See header for documentation. */ +void store_image_block( + astcenc_image& img, + const image_block& blk, + const block_size_descriptor& bsd, + unsigned int xpos, + unsigned int ypos, + unsigned int zpos, + const astcenc_swizzle& swz +) { + unsigned int x_size = img.dim_x; + unsigned int x_start = xpos; + unsigned int x_end = astc::min(x_size, xpos + bsd.xdim); + unsigned int x_count = x_end - x_start; + unsigned int x_nudge = bsd.xdim - x_count; + + unsigned int y_size = img.dim_y; + unsigned int y_start = ypos; + unsigned int y_end = astc::min(y_size, ypos + bsd.ydim); + unsigned int y_count = y_end - y_start; + unsigned int y_nudge = (bsd.ydim - y_count) * bsd.xdim; + + unsigned int z_size = img.dim_z; + unsigned int z_start = zpos; + unsigned int z_end = astc::min(z_size, zpos + bsd.zdim); + + // True if any non-identity swizzle + bool needs_swz = (swz.r != ASTCENC_SWZ_R) || (swz.g != ASTCENC_SWZ_G) || + (swz.b != ASTCENC_SWZ_B) || (swz.a != ASTCENC_SWZ_A); + + // True if any swizzle uses Z reconstruct + bool needs_z = (swz.r == ASTCENC_SWZ_Z) || (swz.g == ASTCENC_SWZ_Z) || + (swz.b == ASTCENC_SWZ_Z) || (swz.a == ASTCENC_SWZ_Z); + + int idx = 0; + if (img.data_type == ASTCENC_TYPE_U8) + { + for (unsigned int z = z_start; z < z_end; z++) + { + // Fetch the image plane + uint8_t* data8 = static_cast(img.data[z]); + + for (unsigned int y = y_start; y < y_end; y++) + { + uint8_t* data8_row = data8 + (4 * x_size * y) + (4 * x_start); + + for (unsigned int x = 0; x < x_count; x += ASTCENC_SIMD_WIDTH) + { + unsigned int max_texels = ASTCENC_SIMD_WIDTH; + unsigned int used_texels = astc::min(x_count - x, max_texels); + + // Unaligned load as rows are not always SIMD_WIDTH long + vfloat data_r(blk.data_r + idx); + vfloat data_g(blk.data_g + idx); + vfloat data_b(blk.data_b + idx); + vfloat data_a(blk.data_a + idx); + + vint data_ri = float_to_int_rtn(min(data_r, 1.0f) * 255.0f); + vint data_gi = float_to_int_rtn(min(data_g, 1.0f) * 255.0f); + vint data_bi = float_to_int_rtn(min(data_b, 1.0f) * 255.0f); + vint data_ai = float_to_int_rtn(min(data_a, 1.0f) * 255.0f); + + if (needs_swz) + { + vint swizzle_table[7]; + swizzle_table[ASTCENC_SWZ_0] = vint(0); + swizzle_table[ASTCENC_SWZ_1] = vint(255); + swizzle_table[ASTCENC_SWZ_R] = data_ri; + swizzle_table[ASTCENC_SWZ_G] = data_gi; + swizzle_table[ASTCENC_SWZ_B] = data_bi; + swizzle_table[ASTCENC_SWZ_A] = data_ai; + + if (needs_z) + { + vfloat data_x = (data_r * vfloat(2.0f)) - vfloat(1.0f); + vfloat data_y = (data_a * vfloat(2.0f)) - vfloat(1.0f); + vfloat data_z = vfloat(1.0f) - (data_x * data_x) - (data_y * data_y); + data_z = max(data_z, 0.0f); + data_z = (sqrt(data_z) * vfloat(0.5f)) + vfloat(0.5f); + + swizzle_table[ASTCENC_SWZ_Z] = float_to_int_rtn(min(data_z, 1.0f) * 255.0f); + } + + data_ri = swizzle_table[swz.r]; + data_gi = swizzle_table[swz.g]; + data_bi = swizzle_table[swz.b]; + data_ai = swizzle_table[swz.a]; + } + + // Errors are NaN encoded - convert to magenta error color + // Branch is OK here - it is almost never true so predicts well + vmask nan_mask = data_r != data_r; + if (any(nan_mask)) + { + data_ri = select(data_ri, vint(0xFF), nan_mask); + data_gi = select(data_gi, vint(0x00), nan_mask); + data_bi = select(data_bi, vint(0xFF), nan_mask); + data_ai = select(data_ai, vint(0xFF), nan_mask); + } + + vint data_rgbai = interleave_rgba8(data_ri, data_gi, data_bi, data_ai); + vmask store_mask = vint::lane_id() < vint(used_texels); + store_lanes_masked(data8_row, data_rgbai, store_mask); + + data8_row += ASTCENC_SIMD_WIDTH * 4; + idx += used_texels; + } + idx += x_nudge; + } + idx += y_nudge; + } + } + else if (img.data_type == ASTCENC_TYPE_F16) + { + for (unsigned int z = z_start; z < z_end; z++) + { + // Fetch the image plane + uint16_t* data16 = static_cast(img.data[z]); + + for (unsigned int y = y_start; y < y_end; y++) + { + uint16_t* data16_row = data16 + (4 * x_size * y) + (4 * x_start); + + for (unsigned int x = 0; x < x_count; x++) + { + vint4 color; + + // NaNs are handled inline - no need to special case + if (needs_swz) + { + float data[7]; + data[ASTCENC_SWZ_0] = 0.0f; + data[ASTCENC_SWZ_1] = 1.0f; + data[ASTCENC_SWZ_R] = blk.data_r[idx]; + data[ASTCENC_SWZ_G] = blk.data_g[idx]; + data[ASTCENC_SWZ_B] = blk.data_b[idx]; + data[ASTCENC_SWZ_A] = blk.data_a[idx]; + + if (needs_z) + { + float xN = (data[0] * 2.0f) - 1.0f; + float yN = (data[3] * 2.0f) - 1.0f; + float zN = 1.0f - xN * xN - yN * yN; + if (zN < 0.0f) + { + zN = 0.0f; + } + data[ASTCENC_SWZ_Z] = (astc::sqrt(zN) * 0.5f) + 0.5f; + } + + vfloat4 colorf(data[swz.r], data[swz.g], data[swz.b], data[swz.a]); + color = float_to_float16(colorf); + } + else + { + vfloat4 colorf = blk.texel(idx); + color = float_to_float16(colorf); + } + + // TODO: Vectorize with store N shorts? + data16_row[0] = static_cast(color.lane<0>()); + data16_row[1] = static_cast(color.lane<1>()); + data16_row[2] = static_cast(color.lane<2>()); + data16_row[3] = static_cast(color.lane<3>()); + data16_row += 4; + idx++; + } + idx += x_nudge; + } + idx += y_nudge; + } + } + else // if (img.data_type == ASTCENC_TYPE_F32) + { + assert(img.data_type == ASTCENC_TYPE_F32); + + for (unsigned int z = z_start; z < z_end; z++) + { + // Fetch the image plane + float* data32 = static_cast(img.data[z]); + + for (unsigned int y = y_start; y < y_end; y++) + { + float* data32_row = data32 + (4 * x_size * y) + (4 * x_start); + + for (unsigned int x = 0; x < x_count; x++) + { + vfloat4 color = blk.texel(idx); + + // NaNs are handled inline - no need to special case + if (needs_swz) + { + float data[7]; + data[ASTCENC_SWZ_0] = 0.0f; + data[ASTCENC_SWZ_1] = 1.0f; + data[ASTCENC_SWZ_R] = color.lane<0>(); + data[ASTCENC_SWZ_G] = color.lane<1>(); + data[ASTCENC_SWZ_B] = color.lane<2>(); + data[ASTCENC_SWZ_A] = color.lane<3>(); + + if (needs_z) + { + float xN = (data[0] * 2.0f) - 1.0f; + float yN = (data[3] * 2.0f) - 1.0f; + float zN = 1.0f - xN * xN - yN * yN; + if (zN < 0.0f) + { + zN = 0.0f; + } + data[ASTCENC_SWZ_Z] = (astc::sqrt(zN) * 0.5f) + 0.5f; + } + + color = vfloat4(data[swz.r], data[swz.g], data[swz.b], data[swz.a]); + } + + store(color, data32_row); + data32_row += 4; + idx++; + } + idx += x_nudge; + } + idx += y_nudge; + } + } +} diff --git a/ktx/external/astc-encoder/Source/astcenc_integer_sequence.cpp b/ktx/external/astc-encoder/Source/astcenc_integer_sequence.cpp new file mode 100644 index 0000000..41dc38b --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_integer_sequence.cpp @@ -0,0 +1,739 @@ +// 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for encoding/decoding Bounded Integer Sequence Encoding. + */ + +#include "astcenc_internal.h" + +#include + +/** @brief Unpacked quint triplets for each packed value */ +// TODO: Bitpack these into a uint16_t? +static const uint8_t quints_of_integer[128][3] { + {0, 0, 0}, {1, 0, 0}, {2, 0, 0}, {3, 0, 0}, + {4, 0, 0}, {0, 4, 0}, {4, 4, 0}, {4, 4, 4}, + {0, 1, 0}, {1, 1, 0}, {2, 1, 0}, {3, 1, 0}, + {4, 1, 0}, {1, 4, 0}, {4, 4, 1}, {4, 4, 4}, + {0, 2, 0}, {1, 2, 0}, {2, 2, 0}, {3, 2, 0}, + {4, 2, 0}, {2, 4, 0}, {4, 4, 2}, {4, 4, 4}, + {0, 3, 0}, {1, 3, 0}, {2, 3, 0}, {3, 3, 0}, + {4, 3, 0}, {3, 4, 0}, {4, 4, 3}, {4, 4, 4}, + {0, 0, 1}, {1, 0, 1}, {2, 0, 1}, {3, 0, 1}, + {4, 0, 1}, {0, 4, 1}, {4, 0, 4}, {0, 4, 4}, + {0, 1, 1}, {1, 1, 1}, {2, 1, 1}, {3, 1, 1}, + {4, 1, 1}, {1, 4, 1}, {4, 1, 4}, {1, 4, 4}, + {0, 2, 1}, {1, 2, 1}, {2, 2, 1}, {3, 2, 1}, + {4, 2, 1}, {2, 4, 1}, {4, 2, 4}, {2, 4, 4}, + {0, 3, 1}, {1, 3, 1}, {2, 3, 1}, {3, 3, 1}, + {4, 3, 1}, {3, 4, 1}, {4, 3, 4}, {3, 4, 4}, + {0, 0, 2}, {1, 0, 2}, {2, 0, 2}, {3, 0, 2}, + {4, 0, 2}, {0, 4, 2}, {2, 0, 4}, {3, 0, 4}, + {0, 1, 2}, {1, 1, 2}, {2, 1, 2}, {3, 1, 2}, + {4, 1, 2}, {1, 4, 2}, {2, 1, 4}, {3, 1, 4}, + {0, 2, 2}, {1, 2, 2}, {2, 2, 2}, {3, 2, 2}, + {4, 2, 2}, {2, 4, 2}, {2, 2, 4}, {3, 2, 4}, + {0, 3, 2}, {1, 3, 2}, {2, 3, 2}, {3, 3, 2}, + {4, 3, 2}, {3, 4, 2}, {2, 3, 4}, {3, 3, 4}, + {0, 0, 3}, {1, 0, 3}, {2, 0, 3}, {3, 0, 3}, + {4, 0, 3}, {0, 4, 3}, {0, 0, 4}, {1, 0, 4}, + {0, 1, 3}, {1, 1, 3}, {2, 1, 3}, {3, 1, 3}, + {4, 1, 3}, {1, 4, 3}, {0, 1, 4}, {1, 1, 4}, + {0, 2, 3}, {1, 2, 3}, {2, 2, 3}, {3, 2, 3}, + {4, 2, 3}, {2, 4, 3}, {0, 2, 4}, {1, 2, 4}, + {0, 3, 3}, {1, 3, 3}, {2, 3, 3}, {3, 3, 3}, + {4, 3, 3}, {3, 4, 3}, {0, 3, 4}, {1, 3, 4} +}; + +/** @brief Packed quint values for each unpacked value, indexed [hi][mid][lo]. */ +static const uint8_t integer_of_quints[5][5][5] { + { + {0, 1, 2, 3, 4}, + {8, 9, 10, 11, 12}, + {16, 17, 18, 19, 20}, + {24, 25, 26, 27, 28}, + {5, 13, 21, 29, 6} + }, + { + {32, 33, 34, 35, 36}, + {40, 41, 42, 43, 44}, + {48, 49, 50, 51, 52}, + {56, 57, 58, 59, 60}, + {37, 45, 53, 61, 14} + }, + { + {64, 65, 66, 67, 68}, + {72, 73, 74, 75, 76}, + {80, 81, 82, 83, 84}, + {88, 89, 90, 91, 92}, + {69, 77, 85, 93, 22} + }, + { + {96, 97, 98, 99, 100}, + {104, 105, 106, 107, 108}, + {112, 113, 114, 115, 116}, + {120, 121, 122, 123, 124}, + {101, 109, 117, 125, 30} + }, + { + {102, 103, 70, 71, 38}, + {110, 111, 78, 79, 46}, + {118, 119, 86, 87, 54}, + {126, 127, 94, 95, 62}, + {39, 47, 55, 63, 31} + } +}; + +/** @brief Unpacked trit quintuplets for each packed value */ +// TODO: Bitpack these into a uint16_t? +static const uint8_t trits_of_integer[256][5] { + {0, 0, 0, 0, 0}, {1, 0, 0, 0, 0}, {2, 0, 0, 0, 0}, {0, 0, 2, 0, 0}, + {0, 1, 0, 0, 0}, {1, 1, 0, 0, 0}, {2, 1, 0, 0, 0}, {1, 0, 2, 0, 0}, + {0, 2, 0, 0, 0}, {1, 2, 0, 0, 0}, {2, 2, 0, 0, 0}, {2, 0, 2, 0, 0}, + {0, 2, 2, 0, 0}, {1, 2, 2, 0, 0}, {2, 2, 2, 0, 0}, {2, 0, 2, 0, 0}, + {0, 0, 1, 0, 0}, {1, 0, 1, 0, 0}, {2, 0, 1, 0, 0}, {0, 1, 2, 0, 0}, + {0, 1, 1, 0, 0}, {1, 1, 1, 0, 0}, {2, 1, 1, 0, 0}, {1, 1, 2, 0, 0}, + {0, 2, 1, 0, 0}, {1, 2, 1, 0, 0}, {2, 2, 1, 0, 0}, {2, 1, 2, 0, 0}, + {0, 0, 0, 2, 2}, {1, 0, 0, 2, 2}, {2, 0, 0, 2, 2}, {0, 0, 2, 2, 2}, + {0, 0, 0, 1, 0}, {1, 0, 0, 1, 0}, {2, 0, 0, 1, 0}, {0, 0, 2, 1, 0}, + {0, 1, 0, 1, 0}, {1, 1, 0, 1, 0}, {2, 1, 0, 1, 0}, {1, 0, 2, 1, 0}, + {0, 2, 0, 1, 0}, {1, 2, 0, 1, 0}, {2, 2, 0, 1, 0}, {2, 0, 2, 1, 0}, + {0, 2, 2, 1, 0}, {1, 2, 2, 1, 0}, {2, 2, 2, 1, 0}, {2, 0, 2, 1, 0}, + {0, 0, 1, 1, 0}, {1, 0, 1, 1, 0}, {2, 0, 1, 1, 0}, {0, 1, 2, 1, 0}, + {0, 1, 1, 1, 0}, {1, 1, 1, 1, 0}, {2, 1, 1, 1, 0}, {1, 1, 2, 1, 0}, + {0, 2, 1, 1, 0}, {1, 2, 1, 1, 0}, {2, 2, 1, 1, 0}, {2, 1, 2, 1, 0}, + {0, 1, 0, 2, 2}, {1, 1, 0, 2, 2}, {2, 1, 0, 2, 2}, {1, 0, 2, 2, 2}, + {0, 0, 0, 2, 0}, {1, 0, 0, 2, 0}, {2, 0, 0, 2, 0}, {0, 0, 2, 2, 0}, + {0, 1, 0, 2, 0}, {1, 1, 0, 2, 0}, {2, 1, 0, 2, 0}, {1, 0, 2, 2, 0}, + {0, 2, 0, 2, 0}, {1, 2, 0, 2, 0}, {2, 2, 0, 2, 0}, {2, 0, 2, 2, 0}, + {0, 2, 2, 2, 0}, {1, 2, 2, 2, 0}, {2, 2, 2, 2, 0}, {2, 0, 2, 2, 0}, + {0, 0, 1, 2, 0}, {1, 0, 1, 2, 0}, {2, 0, 1, 2, 0}, {0, 1, 2, 2, 0}, + {0, 1, 1, 2, 0}, {1, 1, 1, 2, 0}, {2, 1, 1, 2, 0}, {1, 1, 2, 2, 0}, + {0, 2, 1, 2, 0}, {1, 2, 1, 2, 0}, {2, 2, 1, 2, 0}, {2, 1, 2, 2, 0}, + {0, 2, 0, 2, 2}, {1, 2, 0, 2, 2}, {2, 2, 0, 2, 2}, {2, 0, 2, 2, 2}, + {0, 0, 0, 0, 2}, {1, 0, 0, 0, 2}, {2, 0, 0, 0, 2}, {0, 0, 2, 0, 2}, + {0, 1, 0, 0, 2}, {1, 1, 0, 0, 2}, {2, 1, 0, 0, 2}, {1, 0, 2, 0, 2}, + {0, 2, 0, 0, 2}, {1, 2, 0, 0, 2}, {2, 2, 0, 0, 2}, {2, 0, 2, 0, 2}, + {0, 2, 2, 0, 2}, {1, 2, 2, 0, 2}, {2, 2, 2, 0, 2}, {2, 0, 2, 0, 2}, + {0, 0, 1, 0, 2}, {1, 0, 1, 0, 2}, {2, 0, 1, 0, 2}, {0, 1, 2, 0, 2}, + {0, 1, 1, 0, 2}, {1, 1, 1, 0, 2}, {2, 1, 1, 0, 2}, {1, 1, 2, 0, 2}, + {0, 2, 1, 0, 2}, {1, 2, 1, 0, 2}, {2, 2, 1, 0, 2}, {2, 1, 2, 0, 2}, + {0, 2, 2, 2, 2}, {1, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 0, 2, 2, 2}, + {0, 0, 0, 0, 1}, {1, 0, 0, 0, 1}, {2, 0, 0, 0, 1}, {0, 0, 2, 0, 1}, + {0, 1, 0, 0, 1}, {1, 1, 0, 0, 1}, {2, 1, 0, 0, 1}, {1, 0, 2, 0, 1}, + {0, 2, 0, 0, 1}, {1, 2, 0, 0, 1}, {2, 2, 0, 0, 1}, {2, 0, 2, 0, 1}, + {0, 2, 2, 0, 1}, {1, 2, 2, 0, 1}, {2, 2, 2, 0, 1}, {2, 0, 2, 0, 1}, + {0, 0, 1, 0, 1}, {1, 0, 1, 0, 1}, {2, 0, 1, 0, 1}, {0, 1, 2, 0, 1}, + {0, 1, 1, 0, 1}, {1, 1, 1, 0, 1}, {2, 1, 1, 0, 1}, {1, 1, 2, 0, 1}, + {0, 2, 1, 0, 1}, {1, 2, 1, 0, 1}, {2, 2, 1, 0, 1}, {2, 1, 2, 0, 1}, + {0, 0, 1, 2, 2}, {1, 0, 1, 2, 2}, {2, 0, 1, 2, 2}, {0, 1, 2, 2, 2}, + {0, 0, 0, 1, 1}, {1, 0, 0, 1, 1}, {2, 0, 0, 1, 1}, {0, 0, 2, 1, 1}, + {0, 1, 0, 1, 1}, {1, 1, 0, 1, 1}, {2, 1, 0, 1, 1}, {1, 0, 2, 1, 1}, + {0, 2, 0, 1, 1}, {1, 2, 0, 1, 1}, {2, 2, 0, 1, 1}, {2, 0, 2, 1, 1}, + {0, 2, 2, 1, 1}, {1, 2, 2, 1, 1}, {2, 2, 2, 1, 1}, {2, 0, 2, 1, 1}, + {0, 0, 1, 1, 1}, {1, 0, 1, 1, 1}, {2, 0, 1, 1, 1}, {0, 1, 2, 1, 1}, + {0, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {2, 1, 1, 1, 1}, {1, 1, 2, 1, 1}, + {0, 2, 1, 1, 1}, {1, 2, 1, 1, 1}, {2, 2, 1, 1, 1}, {2, 1, 2, 1, 1}, + {0, 1, 1, 2, 2}, {1, 1, 1, 2, 2}, {2, 1, 1, 2, 2}, {1, 1, 2, 2, 2}, + {0, 0, 0, 2, 1}, {1, 0, 0, 2, 1}, {2, 0, 0, 2, 1}, {0, 0, 2, 2, 1}, + {0, 1, 0, 2, 1}, {1, 1, 0, 2, 1}, {2, 1, 0, 2, 1}, {1, 0, 2, 2, 1}, + {0, 2, 0, 2, 1}, {1, 2, 0, 2, 1}, {2, 2, 0, 2, 1}, {2, 0, 2, 2, 1}, + {0, 2, 2, 2, 1}, {1, 2, 2, 2, 1}, {2, 2, 2, 2, 1}, {2, 0, 2, 2, 1}, + {0, 0, 1, 2, 1}, {1, 0, 1, 2, 1}, {2, 0, 1, 2, 1}, {0, 1, 2, 2, 1}, + {0, 1, 1, 2, 1}, {1, 1, 1, 2, 1}, {2, 1, 1, 2, 1}, {1, 1, 2, 2, 1}, + {0, 2, 1, 2, 1}, {1, 2, 1, 2, 1}, {2, 2, 1, 2, 1}, {2, 1, 2, 2, 1}, + {0, 2, 1, 2, 2}, {1, 2, 1, 2, 2}, {2, 2, 1, 2, 2}, {2, 1, 2, 2, 2}, + {0, 0, 0, 1, 2}, {1, 0, 0, 1, 2}, {2, 0, 0, 1, 2}, {0, 0, 2, 1, 2}, + {0, 1, 0, 1, 2}, {1, 1, 0, 1, 2}, {2, 1, 0, 1, 2}, {1, 0, 2, 1, 2}, + {0, 2, 0, 1, 2}, {1, 2, 0, 1, 2}, {2, 2, 0, 1, 2}, {2, 0, 2, 1, 2}, + {0, 2, 2, 1, 2}, {1, 2, 2, 1, 2}, {2, 2, 2, 1, 2}, {2, 0, 2, 1, 2}, + {0, 0, 1, 1, 2}, {1, 0, 1, 1, 2}, {2, 0, 1, 1, 2}, {0, 1, 2, 1, 2}, + {0, 1, 1, 1, 2}, {1, 1, 1, 1, 2}, {2, 1, 1, 1, 2}, {1, 1, 2, 1, 2}, + {0, 2, 1, 1, 2}, {1, 2, 1, 1, 2}, {2, 2, 1, 1, 2}, {2, 1, 2, 1, 2}, + {0, 2, 2, 2, 2}, {1, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 1, 2, 2, 2} +}; + +/** @brief Packed trit values for each unpacked value, indexed [hi][][][][lo]. */ +static const uint8_t integer_of_trits[3][3][3][3][3] { + { + { + { + {0, 1, 2}, + {4, 5, 6}, + {8, 9, 10} + }, + { + {16, 17, 18}, + {20, 21, 22}, + {24, 25, 26} + }, + { + {3, 7, 15}, + {19, 23, 27}, + {12, 13, 14} + } + }, + { + { + {32, 33, 34}, + {36, 37, 38}, + {40, 41, 42} + }, + { + {48, 49, 50}, + {52, 53, 54}, + {56, 57, 58} + }, + { + {35, 39, 47}, + {51, 55, 59}, + {44, 45, 46} + } + }, + { + { + {64, 65, 66}, + {68, 69, 70}, + {72, 73, 74} + }, + { + {80, 81, 82}, + {84, 85, 86}, + {88, 89, 90} + }, + { + {67, 71, 79}, + {83, 87, 91}, + {76, 77, 78} + } + } + }, + { + { + { + {128, 129, 130}, + {132, 133, 134}, + {136, 137, 138} + }, + { + {144, 145, 146}, + {148, 149, 150}, + {152, 153, 154} + }, + { + {131, 135, 143}, + {147, 151, 155}, + {140, 141, 142} + } + }, + { + { + {160, 161, 162}, + {164, 165, 166}, + {168, 169, 170} + }, + { + {176, 177, 178}, + {180, 181, 182}, + {184, 185, 186} + }, + { + {163, 167, 175}, + {179, 183, 187}, + {172, 173, 174} + } + }, + { + { + {192, 193, 194}, + {196, 197, 198}, + {200, 201, 202} + }, + { + {208, 209, 210}, + {212, 213, 214}, + {216, 217, 218} + }, + { + {195, 199, 207}, + {211, 215, 219}, + {204, 205, 206} + } + } + }, + { + { + { + {96, 97, 98}, + {100, 101, 102}, + {104, 105, 106} + }, + { + {112, 113, 114}, + {116, 117, 118}, + {120, 121, 122} + }, + { + {99, 103, 111}, + {115, 119, 123}, + {108, 109, 110} + } + }, + { + { + {224, 225, 226}, + {228, 229, 230}, + {232, 233, 234} + }, + { + {240, 241, 242}, + {244, 245, 246}, + {248, 249, 250} + }, + { + {227, 231, 239}, + {243, 247, 251}, + {236, 237, 238} + } + }, + { + { + {28, 29, 30}, + {60, 61, 62}, + {92, 93, 94} + }, + { + {156, 157, 158}, + {188, 189, 190}, + {220, 221, 222} + }, + { + {31, 63, 127}, + {159, 191, 255}, + {252, 253, 254} + } + } + } +}; + +/** + * @brief The number of bits, trits, and quints needed for a quant level. + */ +struct btq_count +{ + /** @brief The number of bits. */ + uint8_t bits:6; + + /** @brief The number of trits. */ + uint8_t trits:1; + + /** @brief The number of quints. */ + uint8_t quints:1; +}; + +/** + * @brief The table of bits, trits, and quints needed for a quant encode. + */ +static const std::array btq_counts {{ + { 1, 0, 0 }, // QUANT_2 + { 0, 1, 0 }, // QUANT_3 + { 2, 0, 0 }, // QUANT_4 + { 0, 0, 1 }, // QUANT_5 + { 1, 1, 0 }, // QUANT_6 + { 3, 0, 0 }, // QUANT_8 + { 1, 0, 1 }, // QUANT_10 + { 2, 1, 0 }, // QUANT_12 + { 4, 0, 0 }, // QUANT_16 + { 2, 0, 1 }, // QUANT_20 + { 3, 1, 0 }, // QUANT_24 + { 5, 0, 0 }, // QUANT_32 + { 3, 0, 1 }, // QUANT_40 + { 4, 1, 0 }, // QUANT_48 + { 6, 0, 0 }, // QUANT_64 + { 4, 0, 1 }, // QUANT_80 + { 5, 1, 0 }, // QUANT_96 + { 7, 0, 0 }, // QUANT_128 + { 5, 0, 1 }, // QUANT_160 + { 6, 1, 0 }, // QUANT_192 + { 8, 0, 0 } // QUANT_256 +}}; + +/** + * @brief The sequence scale, round, and divisors needed to compute sizing. + * + * The length of a quantized sequence in bits is: + * (scale * + round) / divisor + */ +struct ise_size +{ + /** @brief The scaling parameter. */ + uint8_t scale:6; + + /** @brief The divisor parameter. */ + uint8_t divisor:2; +}; + +/** + * @brief The table of scale, round, and divisors needed for quant sizing. + */ +static const std::array ise_sizes {{ + { 1, 0 }, // QUANT_2 + { 8, 2 }, // QUANT_3 + { 2, 0 }, // QUANT_4 + { 7, 1 }, // QUANT_5 + { 13, 2 }, // QUANT_6 + { 3, 0 }, // QUANT_8 + { 10, 1 }, // QUANT_10 + { 18, 2 }, // QUANT_12 + { 4, 0 }, // QUANT_16 + { 13, 1 }, // QUANT_20 + { 23, 2 }, // QUANT_24 + { 5, 0 }, // QUANT_32 + { 16, 1 }, // QUANT_40 + { 28, 2 }, // QUANT_48 + { 6, 0 }, // QUANT_64 + { 19, 1 }, // QUANT_80 + { 33, 2 }, // QUANT_96 + { 7, 0 }, // QUANT_128 + { 22, 1 }, // QUANT_160 + { 38, 2 }, // QUANT_192 + { 8, 0 } // QUANT_256 +}}; + +/* See header for documentation. */ +unsigned int get_ise_sequence_bitcount( + unsigned int character_count, + quant_method quant_level +) { + // Cope with out-of bounds values - input might be invalid + if (static_cast(quant_level) >= ise_sizes.size()) + { + // Arbitrary large number that's more than an ASTC block can hold + return 1024; + } + + auto& entry = ise_sizes[quant_level]; + unsigned int divisor = (entry.divisor << 1) + 1; + return (entry.scale * character_count + divisor - 1) / divisor; +} + +/** + * @brief Write up to 8 bits at an arbitrary bit offset. + * + * The stored value is at most 8 bits, but can be stored at an offset of between 0 and 7 bits so may + * span two separate bytes in memory. + * + * @param value The value to write. + * @param bitcount The number of bits to write, starting from LSB. + * @param bitoffset The bit offset to store at, between 0 and 7. + * @param[in,out] ptr The data pointer to write to. + */ +static inline void write_bits( + unsigned int value, + unsigned int bitcount, + unsigned int bitoffset, + uint8_t ptr[2] +) { + unsigned int mask = (1 << bitcount) - 1; + value &= mask; + ptr += bitoffset >> 3; + bitoffset &= 7; + value <<= bitoffset; + mask <<= bitoffset; + mask = ~mask; + + ptr[0] &= mask; + ptr[0] |= value; + ptr[1] &= mask >> 8; + ptr[1] |= value >> 8; +} + +/** + * @brief Read up to 16 bits from two bytes. + * + * This function reads a packed N-bit field from two bytes in memory. The stored value must exist + * within the two bytes, but can start at an arbitary bit offset and span the two bytes in memory. + * + * @param bitcount The number of bits to read. + * @param bitoffset The bit offset to read from, between 0 and 7. + * @param[in,out] ptr The data pointer to read from. + * + * @return The read value. + */ +static inline unsigned int read_bits( + unsigned int bitcount, + unsigned int bitoffset, + const uint8_t* ptr +) { + unsigned int mask = (1 << bitcount) - 1; + ptr += bitoffset >> 3; + bitoffset &= 7; + unsigned int value = ptr[0] | (ptr[1] << 8); + value >>= bitoffset; + value &= mask; + return value; +} + +/* See header for documentation. */ +void encode_ise( + quant_method quant_level, + unsigned int character_count, + const uint8_t* input_data, + uint8_t* output_data, + unsigned int bit_offset +) { + promise(character_count > 0); + + unsigned int bits = btq_counts[quant_level].bits; + unsigned int trits = btq_counts[quant_level].trits; + unsigned int quints = btq_counts[quant_level].quints; + unsigned int mask = (1 << bits) - 1; + + // Write out trits and bits + if (trits) + { + unsigned int i = 0; + unsigned int full_trit_blocks = character_count / 5; + + for (unsigned int j = 0; j < full_trit_blocks; j++) + { + unsigned int i4 = input_data[i + 4] >> bits; + unsigned int i3 = input_data[i + 3] >> bits; + unsigned int i2 = input_data[i + 2] >> bits; + unsigned int i1 = input_data[i + 1] >> bits; + unsigned int i0 = input_data[i + 0] >> bits; + + uint8_t T = integer_of_trits[i4][i3][i2][i1][i0]; + + // The max size of a trit bit count is 6, so we can always safely + // pack a single MX value with the following 1 or 2 T bits. + uint8_t pack; + + // Element 0 + T0 + T1 + pack = (input_data[i++] & mask) | (((T >> 0) & 0x3) << bits); + write_bits(pack, bits + 2, bit_offset, output_data); + bit_offset += bits + 2; + + // Element 1 + T2 + T3 + pack = (input_data[i++] & mask) | (((T >> 2) & 0x3) << bits); + write_bits(pack, bits + 2, bit_offset, output_data); + bit_offset += bits + 2; + + // Element 2 + T4 + pack = (input_data[i++] & mask) | (((T >> 4) & 0x1) << bits); + write_bits(pack, bits + 1, bit_offset, output_data); + bit_offset += bits + 1; + + // Element 3 + T5 + T6 + pack = (input_data[i++] & mask) | (((T >> 5) & 0x3) << bits); + write_bits(pack, bits + 2, bit_offset, output_data); + bit_offset += bits + 2; + + // Element 4 + T7 + pack = (input_data[i++] & mask) | (((T >> 7) & 0x1) << bits); + write_bits(pack, bits + 1, bit_offset, output_data); + bit_offset += bits + 1; + } + + // Loop tail for a partial block + if (i != character_count) + { + // i4 cannot be present - we know the block is partial + // i0 must be present - we know the block isn't empty + unsigned int i4 = 0; + unsigned int i3 = i + 3 >= character_count ? 0 : input_data[i + 3] >> bits; + unsigned int i2 = i + 2 >= character_count ? 0 : input_data[i + 2] >> bits; + unsigned int i1 = i + 1 >= character_count ? 0 : input_data[i + 1] >> bits; + unsigned int i0 = input_data[i + 0] >> bits; + + uint8_t T = integer_of_trits[i4][i3][i2][i1][i0]; + + for (unsigned int j = 0; i < character_count; i++, j++) + { + // Truncated table as this iteration is always partital + static const uint8_t tbits[4] { 2, 2, 1, 2 }; + static const uint8_t tshift[4] { 0, 2, 4, 5 }; + + uint8_t pack = (input_data[i] & mask) | + (((T >> tshift[j]) & ((1 << tbits[j]) - 1)) << bits); + + write_bits(pack, bits + tbits[j], bit_offset, output_data); + bit_offset += bits + tbits[j]; + } + } + } + // Write out quints and bits + else if (quints) + { + unsigned int i = 0; + unsigned int full_quint_blocks = character_count / 3; + + for (unsigned int j = 0; j < full_quint_blocks; j++) + { + unsigned int i2 = input_data[i + 2] >> bits; + unsigned int i1 = input_data[i + 1] >> bits; + unsigned int i0 = input_data[i + 0] >> bits; + + uint8_t T = integer_of_quints[i2][i1][i0]; + + // The max size of a quint bit count is 5, so we can always safely + // pack a single M value with the following 2 or 3 T bits. + uint8_t pack; + + // Element 0 + pack = (input_data[i++] & mask) | (((T >> 0) & 0x7) << bits); + write_bits(pack, bits + 3, bit_offset, output_data); + bit_offset += bits + 3; + + // Element 1 + pack = (input_data[i++] & mask) | (((T >> 3) & 0x3) << bits); + write_bits(pack, bits + 2, bit_offset, output_data); + bit_offset += bits + 2; + + // Element 2 + pack = (input_data[i++] & mask) | (((T >> 5) & 0x3) << bits); + write_bits(pack, bits + 2, bit_offset, output_data); + bit_offset += bits + 2; + } + + // Loop tail for a partial block + if (i != character_count) + { + // i2 cannot be present - we know the block is partial + // i0 must be present - we know the block isn't empty + unsigned int i2 = 0; + unsigned int i1 = i + 1 >= character_count ? 0 : input_data[i + 1] >> bits; + unsigned int i0 = input_data[i + 0] >> bits; + + uint8_t T = integer_of_quints[i2][i1][i0]; + + for (unsigned int j = 0; i < character_count; i++, j++) + { + // Truncated table as this iteration is always partital + static const uint8_t tbits[2] { 3, 2 }; + static const uint8_t tshift[2] { 0, 3 }; + + uint8_t pack = (input_data[i] & mask) | + (((T >> tshift[j]) & ((1 << tbits[j]) - 1)) << bits); + + write_bits(pack, bits + tbits[j], bit_offset, output_data); + bit_offset += bits + tbits[j]; + } + } + } + // Write out just bits + else + { + for (unsigned int i = 0; i < character_count; i++) + { + write_bits(input_data[i], bits, bit_offset, output_data); + bit_offset += bits; + } + } +} + +/* See header for documentation. */ +void decode_ise( + quant_method quant_level, + unsigned int character_count, + const uint8_t* input_data, + uint8_t* output_data, + unsigned int bit_offset +) { + promise(character_count > 0); + + // Note: due to how the trit/quint-block unpacking is done in this function, we may write more + // temporary results than the number of outputs. The maximum actual number of results is 64 bit, + // but we keep 4 additional character_count of padding. + uint8_t results[68]; + uint8_t tq_blocks[22] { 0 }; // Trit-blocks or quint-blocks, must be zeroed + + unsigned int bits = btq_counts[quant_level].bits; + unsigned int trits = btq_counts[quant_level].trits; + unsigned int quints = btq_counts[quant_level].quints; + + unsigned int lcounter = 0; + unsigned int hcounter = 0; + + // Collect bits for each element, as well as bits for any trit-blocks and quint-blocks. + for (unsigned int i = 0; i < character_count; i++) + { + results[i] = static_cast(read_bits(bits, bit_offset, input_data)); + bit_offset += bits; + + if (trits) + { + static const uint8_t bits_to_read[5] { 2, 2, 1, 2, 1 }; + static const uint8_t block_shift[5] { 0, 2, 4, 5, 7 }; + static const uint8_t next_lcounter[5] { 1, 2, 3, 4, 0 }; + static const uint8_t hcounter_incr[5] { 0, 0, 0, 0, 1 }; + unsigned int tdata = read_bits(bits_to_read[lcounter], bit_offset, input_data); + bit_offset += bits_to_read[lcounter]; + tq_blocks[hcounter] |= tdata << block_shift[lcounter]; + hcounter += hcounter_incr[lcounter]; + lcounter = next_lcounter[lcounter]; + } + + if (quints) + { + static const uint8_t bits_to_read[3] { 3, 2, 2 }; + static const uint8_t block_shift[3] { 0, 3, 5 }; + static const uint8_t next_lcounter[3] { 1, 2, 0 }; + static const uint8_t hcounter_incr[3] { 0, 0, 1 }; + unsigned int tdata = read_bits(bits_to_read[lcounter], bit_offset, input_data); + bit_offset += bits_to_read[lcounter]; + tq_blocks[hcounter] |= tdata << block_shift[lcounter]; + hcounter += hcounter_incr[lcounter]; + lcounter = next_lcounter[lcounter]; + } + } + + // Unpack trit-blocks or quint-blocks as needed + if (trits) + { + unsigned int trit_blocks = (character_count + 4) / 5; + promise(trit_blocks > 0); + for (unsigned int i = 0; i < trit_blocks; i++) + { + const uint8_t *tritptr = trits_of_integer[tq_blocks[i]]; + results[5 * i ] |= tritptr[0] << bits; + results[5 * i + 1] |= tritptr[1] << bits; + results[5 * i + 2] |= tritptr[2] << bits; + results[5 * i + 3] |= tritptr[3] << bits; + results[5 * i + 4] |= tritptr[4] << bits; + } + } + + if (quints) + { + unsigned int quint_blocks = (character_count + 2) / 3; + promise(quint_blocks > 0); + for (unsigned int i = 0; i < quint_blocks; i++) + { + const uint8_t *quintptr = quints_of_integer[tq_blocks[i]]; + results[3 * i ] |= quintptr[0] << bits; + results[3 * i + 1] |= quintptr[1] << bits; + results[3 * i + 2] |= quintptr[2] << bits; + } + } + + for (unsigned int i = 0; i < character_count; i++) + { + output_data[i] = results[i]; + } +} diff --git a/ktx/external/astc-encoder/Source/astcenc_internal.h b/ktx/external/astc-encoder/Source/astcenc_internal.h new file mode 100644 index 0000000..008e1f5 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_internal.h @@ -0,0 +1,2221 @@ +// 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions and data declarations. + */ + +#ifndef ASTCENC_INTERNAL_INCLUDED +#define ASTCENC_INTERNAL_INCLUDED + +#include +#include +#include +#if defined(ASTCENC_DIAGNOSTICS) + #include +#endif +#include +#include + +#include "astcenc.h" +#include "astcenc_mathlib.h" +#include "astcenc_vecmathlib.h" + +/** + * @brief Make a promise to the compiler's optimizer. + * + * A promise is an expression that the optimizer is can assume is true for to help it generate + * faster code. Common use cases for this are to promise that a for loop will iterate more than + * once, or that the loop iteration count is a multiple of a vector length, which avoids pre-loop + * checks and can avoid loop tails if loops are unrolled by the auto-vectorizer. + */ +#if defined(NDEBUG) + #if !defined(__clang__) && defined(_MSC_VER) + #define promise(cond) __assume(cond) + #elif defined(__clang__) + #if __has_builtin(__builtin_assume) + #define promise(cond) __builtin_assume(cond) + #elif __has_builtin(__builtin_unreachable) + #define promise(cond) if (!(cond)) { __builtin_unreachable(); } + #else + #define promise(cond) + #endif + #else // Assume GCC + #define promise(cond) if (!(cond)) { __builtin_unreachable(); } + #endif +#else + #define promise(cond) assert(cond) +#endif + +/* ============================================================================ + Constants +============================================================================ */ +#if !defined(ASTCENC_BLOCK_MAX_TEXELS) + #define ASTCENC_BLOCK_MAX_TEXELS 216 // A 3D 6x6x6 block +#endif + +/** @brief The maximum number of texels a block can support (6x6x6 block). */ +static constexpr unsigned int BLOCK_MAX_TEXELS { ASTCENC_BLOCK_MAX_TEXELS }; + +/** @brief The maximum number of components a block can support. */ +static constexpr unsigned int BLOCK_MAX_COMPONENTS { 4 }; + +/** @brief The maximum number of partitions a block can support. */ +static constexpr unsigned int BLOCK_MAX_PARTITIONS { 4 }; + +/** @brief The number of partitionings, per partition count, suported by the ASTC format. */ +static constexpr unsigned int BLOCK_MAX_PARTITIONINGS { 1024 }; + +/** @brief The maximum number of texels used during partition selection for texel clustering. */ +static constexpr uint8_t BLOCK_MAX_KMEANS_TEXELS { 64 }; + +/** @brief The maximum number of weights a block can support. */ +static constexpr unsigned int BLOCK_MAX_WEIGHTS { 64 }; + +/** @brief The maximum number of weights a block can support per plane in 2 plane mode. */ +static constexpr unsigned int BLOCK_MAX_WEIGHTS_2PLANE { BLOCK_MAX_WEIGHTS / 2 }; + +/** @brief The minimum number of weight bits a candidate encoding must encode. */ +static constexpr unsigned int BLOCK_MIN_WEIGHT_BITS { 24 }; + +/** @brief The maximum number of weight bits a candidate encoding can encode. */ +static constexpr unsigned int BLOCK_MAX_WEIGHT_BITS { 96 }; + +/** @brief The index indicating a bad (unused) block mode in the remap array. */ +static constexpr uint16_t BLOCK_BAD_BLOCK_MODE { 0xFFFFu }; + +/** @brief The index indicating a bad (unused) partitioning in the remap array. */ +static constexpr uint16_t BLOCK_BAD_PARTITIONING { 0xFFFFu }; + +/** @brief The number of partition index bits supported by the ASTC format . */ +static constexpr unsigned int PARTITION_INDEX_BITS { 10 }; + +/** @brief The offset of the plane 2 weights in shared weight arrays. */ +static constexpr unsigned int WEIGHTS_PLANE2_OFFSET { BLOCK_MAX_WEIGHTS_2PLANE }; + +/** @brief The sum of quantized weights for one texel. */ +static constexpr float WEIGHTS_TEXEL_SUM { 16.0f }; + +/** @brief The number of block modes supported by the ASTC format. */ +static constexpr unsigned int WEIGHTS_MAX_BLOCK_MODES { 2048 }; + +/** @brief The number of weight grid decimation modes supported by the ASTC format. */ +static constexpr unsigned int WEIGHTS_MAX_DECIMATION_MODES { 87 }; + +/** @brief The high default error used to initialize error trackers. */ +static constexpr float ERROR_CALC_DEFAULT { 1e30f }; + +/** + * @brief The minimum tuning setting threshold for the one partition fast path. + */ +static constexpr float TUNE_MIN_SEARCH_MODE0 { 0.85f }; + +/** + * @brief The maximum number of candidate encodings tested for each encoding mode. + * + * This can be dynamically reduced by the compression quality preset. + */ +static constexpr unsigned int TUNE_MAX_TRIAL_CANDIDATES { 8 }; + +/** + * @brief The maximum number of candidate partitionings tested for each encoding mode. + * + * This can be dynamically reduced by the compression quality preset. + */ +static constexpr unsigned int TUNE_MAX_PARTITIONING_CANDIDATES { 8 }; + +/** + * @brief The maximum quant level using full angular endpoint search method. + * + * The angular endpoint search is used to find the min/max weight that should + * be used for a given quantization level. It is effective but expensive, so + * we only use it where it has the most value - low quant levels with wide + * spacing. It is used below TUNE_MAX_ANGULAR_QUANT (inclusive). Above this we + * assume the min weight is 0.0f, and the max weight is 1.0f. + * + * Note the angular algorithm is vectorized, and using QUANT_12 exactly fills + * one 8-wide vector. Decreasing by one doesn't buy much performance, and + * increasing by one is disproportionately expensive. + */ +static constexpr unsigned int TUNE_MAX_ANGULAR_QUANT { 7 }; /* QUANT_12 */ + +static_assert((BLOCK_MAX_TEXELS % ASTCENC_SIMD_WIDTH) == 0, + "BLOCK_MAX_TEXELS must be multiple of ASTCENC_SIMD_WIDTH"); + +static_assert(BLOCK_MAX_TEXELS <= 216, + "BLOCK_MAX_TEXELS must not be greater than 216"); + +static_assert((BLOCK_MAX_WEIGHTS % ASTCENC_SIMD_WIDTH) == 0, + "BLOCK_MAX_WEIGHTS must be multiple of ASTCENC_SIMD_WIDTH"); + +static_assert((WEIGHTS_MAX_BLOCK_MODES % ASTCENC_SIMD_WIDTH) == 0, + "WEIGHTS_MAX_BLOCK_MODES must be multiple of ASTCENC_SIMD_WIDTH"); + + +/* ============================================================================ + Commonly used data structures +============================================================================ */ + +/** + * @brief The ASTC endpoint formats. + * + * Note, the values here are used directly in the encoding in the format so do not rearrange. + */ +enum endpoint_formats +{ + FMT_LUMINANCE = 0, + FMT_LUMINANCE_DELTA = 1, + FMT_HDR_LUMINANCE_LARGE_RANGE = 2, + FMT_HDR_LUMINANCE_SMALL_RANGE = 3, + FMT_LUMINANCE_ALPHA = 4, + FMT_LUMINANCE_ALPHA_DELTA = 5, + FMT_RGB_SCALE = 6, + FMT_HDR_RGB_SCALE = 7, + FMT_RGB = 8, + FMT_RGB_DELTA = 9, + FMT_RGB_SCALE_ALPHA = 10, + FMT_HDR_RGB = 11, + FMT_RGBA = 12, + FMT_RGBA_DELTA = 13, + FMT_HDR_RGB_LDR_ALPHA = 14, + FMT_HDR_RGBA = 15 +}; + +/** + * @brief The ASTC quantization methods. + * + * Note, the values here are used directly in the encoding in the format so do not rearrange. + */ +enum quant_method +{ + QUANT_2 = 0, + QUANT_3 = 1, + QUANT_4 = 2, + QUANT_5 = 3, + QUANT_6 = 4, + QUANT_8 = 5, + QUANT_10 = 6, + QUANT_12 = 7, + QUANT_16 = 8, + QUANT_20 = 9, + QUANT_24 = 10, + QUANT_32 = 11, + QUANT_40 = 12, + QUANT_48 = 13, + QUANT_64 = 14, + QUANT_80 = 15, + QUANT_96 = 16, + QUANT_128 = 17, + QUANT_160 = 18, + QUANT_192 = 19, + QUANT_256 = 20 +}; + +/** + * @brief The number of levels use by an ASTC quantization method. + * + * @param method The quantization method + * + * @return The number of levels used by @c method. + */ +static inline unsigned int get_quant_level(quant_method method) +{ + switch (method) + { + case QUANT_2: return 2; + case QUANT_3: return 3; + case QUANT_4: return 4; + case QUANT_5: return 5; + case QUANT_6: return 6; + case QUANT_8: return 8; + case QUANT_10: return 10; + case QUANT_12: return 12; + case QUANT_16: return 16; + case QUANT_20: return 20; + case QUANT_24: return 24; + case QUANT_32: return 32; + case QUANT_40: return 40; + case QUANT_48: return 48; + case QUANT_64: return 64; + case QUANT_80: return 80; + case QUANT_96: return 96; + case QUANT_128: return 128; + case QUANT_160: return 160; + case QUANT_192: return 192; + case QUANT_256: return 256; + } + + // Unreachable - the enum is fully described + return 0; +} + +/** + * @brief Computed metrics about a partition in a block. + */ +struct partition_metrics +{ + /** @brief The error-weighted average color in the partition. */ + vfloat4 avg; + + /** @brief The dominant error-weighted direction in the partition. */ + vfloat4 dir; +}; + +/** + * @brief Computed lines for a a three component analysis. + */ +struct partition_lines3 +{ + /** @brief Line for uncorrelated chroma. */ + line3 uncor_line; + + /** @brief Line for correlated chroma, passing though the origin. */ + line3 samec_line; + + /** @brief Post-processed line for uncorrelated chroma. */ + processed_line3 uncor_pline; + + /** @brief Post-processed line for correlated chroma, passing though the origin. */ + processed_line3 samec_pline; + + /** + * @brief The length of the line for uncorrelated chroma. + * + * This is used for both the uncorrelated and same chroma lines - they are normally very similar + * and only used for the relative ranking of partitionings against one another. + */ + float line_length; +}; + +/** + * @brief The partition information for a single partition. + * + * ASTC has a total of 1024 candidate partitions for each of 2/3/4 partition counts, although this + * 1024 includes seeds that generate duplicates of other seeds and seeds that generate completely + * empty partitions. These are both valid encodings, but astcenc will skip both during compression + * as they are not useful. + */ +struct partition_info +{ + /** @brief The number of partitions in this partitioning. */ + uint16_t partition_count; + + /** @brief The index (seed) of this partitioning. */ + uint16_t partition_index; + + /** + * @brief The number of texels in each partition. + * + * Note that some seeds result in zero texels assigned to a partition. These are valid, but are + * skipped by this compressor as there is no point spending bits encoding an unused endpoints. + */ + uint8_t partition_texel_count[BLOCK_MAX_PARTITIONS]; + + /** @brief The partition of each texel in the block. */ + ASTCENC_ALIGNAS uint8_t partition_of_texel[BLOCK_MAX_TEXELS]; + + /** @brief The list of texels in each partition. */ + ASTCENC_ALIGNAS uint8_t texels_of_partition[BLOCK_MAX_PARTITIONS][BLOCK_MAX_TEXELS]; +}; + +/** + * @brief The weight grid information for a single decimation pattern. + * + * ASTC can store one weight per texel, but is also capable of storing lower resolution weight grids + * that are interpolated during decompression to assign a with to a texel. Storing fewer weights + * can free up a substantial amount of bits that we can then spend on more useful things, such as + * more accurate endpoints and weights, or additional partitions. + * + * This data structure is used to store information about a single weight grid decimation pattern, + * for a single block size. + */ +struct decimation_info +{ + /** @brief The total number of texels in the block. */ + uint8_t texel_count; + + /** @brief The maximum number of stored weights that contribute to each texel, between 1 and 4. */ + uint8_t max_texel_weight_count; + + /** @brief The total number of weights stored. */ + uint8_t weight_count; + + /** @brief The number of stored weights in the X dimension. */ + uint8_t weight_x; + + /** @brief The number of stored weights in the Y dimension. */ + uint8_t weight_y; + + /** @brief The number of stored weights in the Z dimension. */ + uint8_t weight_z; + + /** + * @brief The number of weights that contribute to each texel. + * Value is between 1 and 4. + */ + ASTCENC_ALIGNAS uint8_t texel_weight_count[BLOCK_MAX_TEXELS]; + + /** + * @brief The weight index of the N weights that are interpolated for each texel. + * Stored transposed to improve vectorization. + */ + ASTCENC_ALIGNAS uint8_t texel_weights_tr[4][BLOCK_MAX_TEXELS]; + + /** + * @brief The bilinear contribution of the N weights that are interpolated for each texel. + * Value is between 0 and 16, stored transposed to improve vectorization. + */ + ASTCENC_ALIGNAS uint8_t texel_weight_contribs_int_tr[4][BLOCK_MAX_TEXELS]; + + /** + * @brief The bilinear contribution of the N weights that are interpolated for each texel. + * Value is between 0 and 1, stored transposed to improve vectorization. + */ + ASTCENC_ALIGNAS float texel_weight_contribs_float_tr[4][BLOCK_MAX_TEXELS]; + + /** @brief The number of texels that each stored weight contributes to. */ + ASTCENC_ALIGNAS uint8_t weight_texel_count[BLOCK_MAX_WEIGHTS]; + + /** + * @brief The list of texels that use a specific weight index. + * Stored transposed to improve vectorization. + */ + ASTCENC_ALIGNAS uint8_t weight_texels_tr[BLOCK_MAX_TEXELS][BLOCK_MAX_WEIGHTS]; + + /** + * @brief The bilinear contribution to the N texels that use each weight. + * Value is between 0 and 1, stored transposed to improve vectorization. + */ + ASTCENC_ALIGNAS float weights_texel_contribs_tr[BLOCK_MAX_TEXELS][BLOCK_MAX_WEIGHTS]; + + /** + * @brief The bilinear contribution to the Nth texel that uses each weight. + * Value is between 0 and 1, stored transposed to improve vectorization. + */ + float texel_contrib_for_weight[BLOCK_MAX_TEXELS][BLOCK_MAX_WEIGHTS]; +}; + +/** + * @brief Metadata for single block mode for a specific block size. + */ +struct block_mode +{ + /** @brief The block mode index in the ASTC encoded form. */ + uint16_t mode_index; + + /** @brief The decimation mode index in the compressor reindexed list. */ + uint8_t decimation_mode; + + /** @brief The weight quantization used by this block mode. */ + uint8_t quant_mode; + + /** @brief The weight quantization used by this block mode. */ + uint8_t weight_bits; + + /** @brief Is a dual weight plane used by this block mode? */ + uint8_t is_dual_plane : 1; + + /** + * @brief Get the weight quantization used by this block mode. + * + * @return The quantization level. + */ + inline quant_method get_weight_quant_mode() const + { + return static_cast(this->quant_mode); + } +}; + +/** + * @brief Metadata for single decimation mode for a specific block size. + */ +struct decimation_mode +{ + /** @brief The max weight precision for 1 plane, or -1 if not supported. */ + int8_t maxprec_1plane; + + /** @brief The max weight precision for 2 planes, or -1 if not supported. */ + int8_t maxprec_2planes; + + /** + * @brief Bitvector indicating weight quant modes used by active 1 plane block modes. + * + * Bit 0 = QUANT_2, Bit 1 = QUANT_3, etc. + */ + uint16_t refprec_1plane; + + /** + * @brief Bitvector indicating weight quant methods used by active 2 plane block modes. + * + * Bit 0 = QUANT_2, Bit 1 = QUANT_3, etc. + */ + uint16_t refprec_2planes; + + /** + * @brief Set a 1 plane weight quant as active. + * + * @param weight_quant The quant method to set. + */ + void set_ref_1plane(quant_method weight_quant) + { + refprec_1plane |= (1 << weight_quant); + } + + /** + * @brief Test if this mode is active below a given 1 plane weight quant (inclusive). + * + * @param max_weight_quant The max quant method to test. + */ + bool is_ref_1plane(quant_method max_weight_quant) const + { + uint16_t mask = static_cast((1 << (max_weight_quant + 1)) - 1); + return (refprec_1plane & mask) != 0; + } + + /** + * @brief Set a 2 plane weight quant as active. + * + * @param weight_quant The quant method to set. + */ + void set_ref_2plane(quant_method weight_quant) + { + refprec_2planes |= static_cast(1 << weight_quant); + } + + /** + * @brief Test if this mode is active below a given 2 plane weight quant (inclusive). + * + * @param max_weight_quant The max quant method to test. + */ + bool is_ref_2plane(quant_method max_weight_quant) const + { + uint16_t mask = static_cast((1 << (max_weight_quant + 1)) - 1); + return (refprec_2planes & mask) != 0; + } +}; + +/** + * @brief Data tables for a single block size. + * + * The decimation tables store the information to apply weight grid dimension reductions. We only + * store the decimation modes that are actually needed by the current context; many of the possible + * modes will be unused (too many weights for the current block size or disabled by heuristics). The + * actual number of weights stored is @c decimation_mode_count, and the @c decimation_modes and + * @c decimation_tables arrays store the active modes contiguously at the start of the array. These + * entries are not stored in any particular order. + * + * The block mode tables store the unpacked block mode settings. Block modes are stored in the + * compressed block as an 11 bit field, but for any given block size and set of compressor + * heuristics, only a subset of the block modes will be used. The actual number of block modes + * stored is indicated in @c block_mode_count, and the @c block_modes array store the active modes + * contiguously at the start of the array. These entries are stored in incrementing "packed" value + * order, which doesn't mean much once unpacked. To allow decompressors to reference the packed data + * efficiently the @c block_mode_packed_index array stores the mapping between physical ID and the + * actual remapped array index. + */ +struct block_size_descriptor +{ + /** @brief The block X dimension, in texels. */ + uint8_t xdim; + + /** @brief The block Y dimension, in texels. */ + uint8_t ydim; + + /** @brief The block Z dimension, in texels. */ + uint8_t zdim; + + /** @brief The block total texel count. */ + uint8_t texel_count; + + /** + * @brief The number of stored decimation modes which are "always" modes. + * + * Always modes are stored at the start of the decimation_modes list. + */ + unsigned int decimation_mode_count_always; + + /** @brief The number of stored decimation modes for selected encodings. */ + unsigned int decimation_mode_count_selected; + + /** @brief The number of stored decimation modes for any encoding. */ + unsigned int decimation_mode_count_all; + + /** + * @brief The number of stored block modes which are "always" modes. + * + * Always modes are stored at the start of the block_modes list. + */ + unsigned int block_mode_count_1plane_always; + + /** @brief The number of stored block modes for active 1 plane encodings. */ + unsigned int block_mode_count_1plane_selected; + + /** @brief The number of stored block modes for active 1 and 2 plane encodings. */ + unsigned int block_mode_count_1plane_2plane_selected; + + /** @brief The number of stored block modes for any encoding. */ + unsigned int block_mode_count_all; + + /** @brief The number of selected partitionings for 1/2/3/4 partitionings. */ + unsigned int partitioning_count_selected[BLOCK_MAX_PARTITIONS]; + + /** @brief The number of partitionings for 1/2/3/4 partitionings. */ + unsigned int partitioning_count_all[BLOCK_MAX_PARTITIONS]; + + /** @brief The active decimation modes, stored in low indices. */ + decimation_mode decimation_modes[WEIGHTS_MAX_DECIMATION_MODES]; + + /** @brief The active decimation tables, stored in low indices. */ + ASTCENC_ALIGNAS decimation_info decimation_tables[WEIGHTS_MAX_DECIMATION_MODES]; + + /** @brief The packed block mode array index, or @c BLOCK_BAD_BLOCK_MODE if not active. */ + uint16_t block_mode_packed_index[WEIGHTS_MAX_BLOCK_MODES]; + + /** @brief The active block modes, stored in low indices. */ + block_mode block_modes[WEIGHTS_MAX_BLOCK_MODES]; + + /** @brief The active partition tables, stored in low indices per-count. */ + partition_info partitionings[(3 * BLOCK_MAX_PARTITIONINGS) + 1]; + + /** + * @brief The packed partition table array index, or @c BLOCK_BAD_PARTITIONING if not active. + * + * Indexed by partition_count - 2, containing 2, 3 and 4 partitions. + */ + uint16_t partitioning_packed_index[3][BLOCK_MAX_PARTITIONINGS]; + + /** @brief The active texels for k-means partition selection. */ + uint8_t kmeans_texels[BLOCK_MAX_KMEANS_TEXELS]; + + /** + * @brief The canonical 2-partition coverage pattern used during block partition search. + * + * Indexed by remapped index, not physical index. + */ + uint64_t coverage_bitmaps_2[BLOCK_MAX_PARTITIONINGS][2]; + + /** + * @brief The canonical 3-partition coverage pattern used during block partition search. + * + * Indexed by remapped index, not physical index. + */ + uint64_t coverage_bitmaps_3[BLOCK_MAX_PARTITIONINGS][3]; + + /** + * @brief The canonical 4-partition coverage pattern used during block partition search. + * + * Indexed by remapped index, not physical index. + */ + uint64_t coverage_bitmaps_4[BLOCK_MAX_PARTITIONINGS][4]; + + /** + * @brief Get the block mode structure for index @c block_mode. + * + * This function can only return block modes that are enabled by the current compressor config. + * Decompression from an arbitrary source should not use this without first checking that the + * packed block mode index is not @c BLOCK_BAD_BLOCK_MODE. + * + * @param block_mode The packed block mode index. + * + * @return The block mode structure. + */ + const block_mode& get_block_mode(unsigned int block_mode) const + { + unsigned int packed_index = this->block_mode_packed_index[block_mode]; + assert(packed_index != BLOCK_BAD_BLOCK_MODE && packed_index < this->block_mode_count_all); + return this->block_modes[packed_index]; + } + + /** + * @brief Get the decimation mode structure for index @c decimation_mode. + * + * This function can only return decimation modes that are enabled by the current compressor + * config. The mode array is stored packed, but this is only ever indexed by the packed index + * stored in the @c block_mode and never exists in an unpacked form. + * + * @param decimation_mode The packed decimation mode index. + * + * @return The decimation mode structure. + */ + const decimation_mode& get_decimation_mode(unsigned int decimation_mode) const + { + return this->decimation_modes[decimation_mode]; + } + + /** + * @brief Get the decimation info structure for index @c decimation_mode. + * + * This function can only return decimation modes that are enabled by the current compressor + * config. The mode array is stored packed, but this is only ever indexed by the packed index + * stored in the @c block_mode and never exists in an unpacked form. + * + * @param decimation_mode The packed decimation mode index. + * + * @return The decimation info structure. + */ + const decimation_info& get_decimation_info(unsigned int decimation_mode) const + { + return this->decimation_tables[decimation_mode]; + } + + /** + * @brief Get the partition info table for a given partition count. + * + * @param partition_count The number of partitions we want the table for. + * + * @return The pointer to the table of 1024 entries (for 2/3/4 parts) or 1 entry (for 1 part). + */ + const partition_info* get_partition_table(unsigned int partition_count) const + { + if (partition_count == 1) + { + partition_count = 5; + } + unsigned int index = (partition_count - 2) * BLOCK_MAX_PARTITIONINGS; + return this->partitionings + index; + } + + /** + * @brief Get the partition info structure for a given partition count and seed. + * + * @param partition_count The number of partitions we want the info for. + * @param index The partition seed (between 0 and 1023). + * + * @return The partition info structure. + */ + const partition_info& get_partition_info(unsigned int partition_count, unsigned int index) const + { + unsigned int packed_index = 0; + if (partition_count >= 2) + { + packed_index = this->partitioning_packed_index[partition_count - 2][index]; + } + + assert(packed_index != BLOCK_BAD_PARTITIONING && packed_index < this->partitioning_count_all[partition_count - 1]); + auto& result = get_partition_table(partition_count)[packed_index]; + assert(index == result.partition_index); + return result; + } + + /** + * @brief Get the partition info structure for a given partition count and seed. + * + * @param partition_count The number of partitions we want the info for. + * @param packed_index The raw array offset. + * + * @return The partition info structure. + */ + const partition_info& get_raw_partition_info(unsigned int partition_count, unsigned int packed_index) const + { + assert(packed_index != BLOCK_BAD_PARTITIONING && packed_index < this->partitioning_count_all[partition_count - 1]); + auto& result = get_partition_table(partition_count)[packed_index]; + return result; + } +}; + +/** + * @brief The image data for a single block. + * + * The @c data_[rgba] fields store the image data in an encoded SoA float form designed for easy + * vectorization. Input data is converted to float and stored as values between 0 and 65535. LDR + * data is stored as direct UNORM data, HDR data is stored as LNS data. They are allocated SIMD + * elements over-size to allow vectorized stores of unaligned and partial SIMD lanes (e.g. in a + * 6x6x6 block the final row write will read elements 210-217 (vec8) or 214-217 (vec4), which is + * two elements above the last real data element). The overspill values are never written to memory, + * and would be benign, but the padding avoids hitting undefined behavior. + * + * The @c rgb_lns and @c alpha_lns fields that assigned a per-texel use of HDR are only used during + * decompression. The current compressor will always use HDR endpoint formats when in HDR mode. + */ +struct image_block +{ + /** @brief The input (compress) or output (decompress) data for the red color component. */ + ASTCENC_ALIGNAS float data_r[BLOCK_MAX_TEXELS + ASTCENC_SIMD_WIDTH - 1]; + + /** @brief The input (compress) or output (decompress) data for the green color component. */ + ASTCENC_ALIGNAS float data_g[BLOCK_MAX_TEXELS + ASTCENC_SIMD_WIDTH - 1]; + + /** @brief The input (compress) or output (decompress) data for the blue color component. */ + ASTCENC_ALIGNAS float data_b[BLOCK_MAX_TEXELS + ASTCENC_SIMD_WIDTH - 1]; + + /** @brief The input (compress) or output (decompress) data for the alpha color component. */ + ASTCENC_ALIGNAS float data_a[BLOCK_MAX_TEXELS + ASTCENC_SIMD_WIDTH - 1]; + + /** @brief The number of texels in the block. */ + uint8_t texel_count; + + /** @brief The original data for texel 0 for constant color block encoding. */ + vfloat4 origin_texel; + + /** @brief The min component value of all texels in the block. */ + vfloat4 data_min; + + /** @brief The mean component value of all texels in the block. */ + vfloat4 data_mean; + + /** @brief The max component value of all texels in the block. */ + vfloat4 data_max; + + /** @brief The relative error significance of the color channels. */ + vfloat4 channel_weight; + + /** @brief Is this grayscale block where R == G == B for all texels? */ + bool grayscale; + + /** @brief Is the eventual decode using decode_unorm8 rounding? */ + bool decode_unorm8; + + /** @brief Set to 1 if a texel is using HDR RGB endpoints (decompression only). */ + uint8_t rgb_lns[BLOCK_MAX_TEXELS]; + + /** @brief Set to 1 if a texel is using HDR alpha endpoints (decompression only). */ + uint8_t alpha_lns[BLOCK_MAX_TEXELS]; + + /** @brief The X position of this block in the input or output image. */ + unsigned int xpos; + + /** @brief The Y position of this block in the input or output image. */ + unsigned int ypos; + + /** @brief The Z position of this block in the input or output image. */ + unsigned int zpos; + + /** + * @brief Get an RGBA texel value from the data. + * + * @param index The texel index. + * + * @return The texel in RGBA component ordering. + */ + inline vfloat4 texel(unsigned int index) const + { + return vfloat4(data_r[index], + data_g[index], + data_b[index], + data_a[index]); + } + + /** + * @brief Get an RGB texel value from the data. + * + * @param index The texel index. + * + * @return The texel in RGB0 component ordering. + */ + inline vfloat4 texel3(unsigned int index) const + { + return vfloat3(data_r[index], + data_g[index], + data_b[index]); + } + + /** + * @brief Get the default alpha value for endpoints that don't store it. + * + * The default depends on whether the alpha endpoint is LDR or HDR. + * + * @return The alpha value in the scaled range used by the compressor. + */ + inline float get_default_alpha() const + { + return this->alpha_lns[0] ? static_cast(0x7800) : static_cast(0xFFFF); + } + + /** + * @brief Test if a single color channel is constant across the block. + * + * Constant color channels are easier to compress as interpolating between two identical colors + * always returns the same value, irrespective of the weight used. They therefore can be ignored + * for the purposes of weight selection and use of a second weight plane. + * + * @return @c true if the channel is constant across the block, @c false otherwise. + */ + inline bool is_constant_channel(int channel) const + { + vmask4 lane_mask = vint4::lane_id() == vint4(channel); + vmask4 color_mask = this->data_min == this->data_max; + return any(lane_mask & color_mask); + } + + /** + * @brief Test if this block is a luminance block with constant 1.0 alpha. + * + * @return @c true if the block is a luminance block , @c false otherwise. + */ + inline bool is_luminance() const + { + float default_alpha = this->get_default_alpha(); + bool alpha1 = (this->data_min.lane<3>() == default_alpha) && + (this->data_max.lane<3>() == default_alpha); + return this->grayscale && alpha1; + } + + /** + * @brief Test if this block is a luminance block with variable alpha. + * + * @return @c true if the block is a luminance + alpha block , @c false otherwise. + */ + inline bool is_luminancealpha() const + { + float default_alpha = this->get_default_alpha(); + bool alpha1 = (this->data_min.lane<3>() == default_alpha) && + (this->data_max.lane<3>() == default_alpha); + return this->grayscale && !alpha1; + } +}; + +/** + * @brief Data structure storing the color endpoints for a block. + */ +struct endpoints +{ + /** @brief The number of partition endpoints stored. */ + unsigned int partition_count; + + /** @brief The colors for endpoint 0. */ + vfloat4 endpt0[BLOCK_MAX_PARTITIONS]; + + /** @brief The colors for endpoint 1. */ + vfloat4 endpt1[BLOCK_MAX_PARTITIONS]; +}; + +/** + * @brief Data structure storing the color endpoints and weights. + */ +struct endpoints_and_weights +{ + /** @brief True if all active values in weight_error_scale are the same. */ + bool is_constant_weight_error_scale; + + /** @brief The color endpoints. */ + endpoints ep; + + /** @brief The ideal weight for each texel; may be undecimated or decimated. */ + ASTCENC_ALIGNAS float weights[BLOCK_MAX_TEXELS]; + + /** @brief The ideal weight error scaling for each texel; may be undecimated or decimated. */ + ASTCENC_ALIGNAS float weight_error_scale[BLOCK_MAX_TEXELS]; +}; + +/** + * @brief Utility storing estimated errors from choosing particular endpoint encodings. + */ +struct encoding_choice_errors +{ + /** @brief Error of using LDR RGB-scale instead of complete endpoints. */ + float rgb_scale_error; + + /** @brief Error of using HDR RGB-scale instead of complete endpoints. */ + float rgb_luma_error; + + /** @brief Error of using luminance instead of RGB. */ + float luminance_error; + + /** @brief Error of discarding alpha and using a constant 1.0 alpha. */ + float alpha_drop_error; + + /** @brief Can we use delta offset encoding? */ + bool can_offset_encode; + + /** @brief Can we use blue contraction encoding? */ + bool can_blue_contract; +}; + +/** + * @brief Preallocated working buffers, allocated per thread during context creation. + */ +struct ASTCENC_ALIGNAS compression_working_buffers +{ + /** @brief Ideal endpoints and weights for plane 1. */ + endpoints_and_weights ei1; + + /** @brief Ideal endpoints and weights for plane 2. */ + endpoints_and_weights ei2; + + /** + * @brief Decimated ideal weight values in the ~0-1 range. + * + * Note that values can be slightly below zero or higher than one due to + * endpoint extents being inside the ideal color representation. + * + * For two planes, second plane starts at @c WEIGHTS_PLANE2_OFFSET offsets. + */ + ASTCENC_ALIGNAS float dec_weights_ideal[WEIGHTS_MAX_DECIMATION_MODES * BLOCK_MAX_WEIGHTS]; + + /** + * @brief Decimated quantized weight values in the unquantized 0-64 range. + * + * For two planes, second plane starts at @c WEIGHTS_PLANE2_OFFSET offsets. + */ + ASTCENC_ALIGNAS uint8_t dec_weights_uquant[WEIGHTS_MAX_BLOCK_MODES * BLOCK_MAX_WEIGHTS]; + + /** @brief Error of the best encoding combination for each block mode. */ + ASTCENC_ALIGNAS float errors_of_best_combination[WEIGHTS_MAX_BLOCK_MODES]; + + /** @brief The best color quant for each block mode. */ + uint8_t best_quant_levels[WEIGHTS_MAX_BLOCK_MODES]; + + /** @brief The best color quant for each block mode if modes are the same and we have spare bits. */ + uint8_t best_quant_levels_mod[WEIGHTS_MAX_BLOCK_MODES]; + + /** @brief The best endpoint format for each partition. */ + uint8_t best_ep_formats[WEIGHTS_MAX_BLOCK_MODES][BLOCK_MAX_PARTITIONS]; + + /** @brief The total bit storage needed for quantized weights for each block mode. */ + int8_t qwt_bitcounts[WEIGHTS_MAX_BLOCK_MODES]; + + /** @brief The cumulative error for quantized weights for each block mode. */ + float qwt_errors[WEIGHTS_MAX_BLOCK_MODES]; + + /** @brief The low weight value in plane 1 for each block mode. */ + float weight_low_value1[WEIGHTS_MAX_BLOCK_MODES]; + + /** @brief The high weight value in plane 1 for each block mode. */ + float weight_high_value1[WEIGHTS_MAX_BLOCK_MODES]; + + /** @brief The low weight value in plane 1 for each quant level and decimation mode. */ + float weight_low_values1[WEIGHTS_MAX_DECIMATION_MODES][TUNE_MAX_ANGULAR_QUANT + 1]; + + /** @brief The high weight value in plane 1 for each quant level and decimation mode. */ + float weight_high_values1[WEIGHTS_MAX_DECIMATION_MODES][TUNE_MAX_ANGULAR_QUANT + 1]; + + /** @brief The low weight value in plane 2 for each block mode. */ + float weight_low_value2[WEIGHTS_MAX_BLOCK_MODES]; + + /** @brief The high weight value in plane 2 for each block mode. */ + float weight_high_value2[WEIGHTS_MAX_BLOCK_MODES]; + + /** @brief The low weight value in plane 2 for each quant level and decimation mode. */ + float weight_low_values2[WEIGHTS_MAX_DECIMATION_MODES][TUNE_MAX_ANGULAR_QUANT + 1]; + + /** @brief The high weight value in plane 2 for each quant level and decimation mode. */ + float weight_high_values2[WEIGHTS_MAX_DECIMATION_MODES][TUNE_MAX_ANGULAR_QUANT + 1]; +}; + +struct dt_init_working_buffers +{ + uint8_t weight_count_of_texel[BLOCK_MAX_TEXELS]; + uint8_t grid_weights_of_texel[BLOCK_MAX_TEXELS][4]; + uint8_t weights_of_texel[BLOCK_MAX_TEXELS][4]; + + uint8_t texel_count_of_weight[BLOCK_MAX_WEIGHTS]; + uint8_t texels_of_weight[BLOCK_MAX_WEIGHTS][BLOCK_MAX_TEXELS]; + uint8_t texel_weights_of_weight[BLOCK_MAX_WEIGHTS][BLOCK_MAX_TEXELS]; +}; + +/** + * @brief Weight quantization transfer table. + * + * ASTC can store texel weights at many quantization levels, so for performance we store essential + * information about each level as a precomputed data structure. Unquantized weights are integers + * or floats in the range [0, 64]. + * + * This structure provides a table, used to estimate the closest quantized weight for a given + * floating-point weight. For each quantized weight, the corresponding unquantized values. For each + * quantized weight, a previous-value and a next-value. +*/ +struct quant_and_transfer_table +{ + /** @brief The unscrambled unquantized value. */ + uint8_t quant_to_unquant[32]; + + /** @brief The scrambling order: scrambled_quant = map[unscrambled_quant]. */ + uint8_t scramble_map[32]; + + /** @brief The unscrambling order: unscrambled_unquant = map[scrambled_quant]. */ + uint8_t unscramble_and_unquant_map[32]; + + /** + * @brief A table of previous-and-next weights, indexed by the current unquantized value. + * * bits 7:0 = previous-index, unquantized + * * bits 15:8 = next-index, unquantized + */ + uint16_t prev_next_values[65]; +}; + +/** @brief The precomputed quant and transfer table. */ +extern const quant_and_transfer_table quant_and_xfer_tables[12]; + +/** @brief The block is an error block, and will return error color or NaN. */ +static constexpr uint8_t SYM_BTYPE_ERROR { 0 }; + +/** @brief The block is a constant color block using FP16 colors. */ +static constexpr uint8_t SYM_BTYPE_CONST_F16 { 1 }; + +/** @brief The block is a constant color block using UNORM16 colors. */ +static constexpr uint8_t SYM_BTYPE_CONST_U16 { 2 }; + +/** @brief The block is a normal non-constant color block. */ +static constexpr uint8_t SYM_BTYPE_NONCONST { 3 }; + +/** + * @brief A symbolic representation of a compressed block. + * + * The symbolic representation stores the unpacked content of a single + * physical compressed block, in a form which is much easier to access for + * the rest of the compressor code. + */ +struct symbolic_compressed_block +{ + /** @brief The block type, one of the @c SYM_BTYPE_* constants. */ + uint8_t block_type; + + /** @brief The number of partitions; valid for @c NONCONST blocks. */ + uint8_t partition_count; + + /** @brief Non-zero if the color formats matched; valid for @c NONCONST blocks. */ + uint8_t color_formats_matched; + + /** @brief The plane 2 color component, or -1 if single plane; valid for @c NONCONST blocks. */ + int8_t plane2_component; + + /** @brief The block mode; valid for @c NONCONST blocks. */ + uint16_t block_mode; + + /** @brief The partition index; valid for @c NONCONST blocks if 2 or more partitions. */ + uint16_t partition_index; + + /** @brief The endpoint color formats for each partition; valid for @c NONCONST blocks. */ + uint8_t color_formats[BLOCK_MAX_PARTITIONS]; + + /** @brief The endpoint color quant mode; valid for @c NONCONST blocks. */ + quant_method quant_mode; + + /** @brief The error of the current encoding; valid for @c NONCONST blocks. */ + float errorval; + + // We can't have both of these at the same time + union { + /** @brief The constant color; valid for @c CONST blocks. */ + int constant_color[BLOCK_MAX_COMPONENTS]; + + /** @brief The quantized endpoint color pairs; valid for @c NONCONST blocks. */ + uint8_t color_values[BLOCK_MAX_PARTITIONS][8]; + }; + + /** @brief The quantized and decimated weights. + * + * Weights are stored in the 0-64 unpacked range allowing them to be used + * directly in encoding passes without per-use unpacking. Packing happens + * when converting to/from the physical bitstream encoding. + * + * If dual plane, the second plane starts at @c weights[WEIGHTS_PLANE2_OFFSET]. + */ + ASTCENC_ALIGNAS uint8_t weights[BLOCK_MAX_WEIGHTS]; + + /** + * @brief Get the weight quantization used by this block mode. + * + * @return The quantization level. + */ + inline quant_method get_color_quant_mode() const + { + return this->quant_mode; + } +}; + +/** + * @brief Parameter structure for @c compute_pixel_region_variance(). + * + * This function takes a structure to avoid spilling arguments to the stack on every function + * invocation, as there are a lot of parameters. + */ +struct pixel_region_args +{ + /** @brief The image to analyze. */ + const astcenc_image* img; + + /** @brief The component swizzle pattern. */ + astcenc_swizzle swz; + + /** @brief Should the algorithm bother with Z axis processing? */ + bool have_z; + + /** @brief The kernel radius for alpha processing. */ + unsigned int alpha_kernel_radius; + + /** @brief The X dimension of the working data to process. */ + unsigned int size_x; + + /** @brief The Y dimension of the working data to process. */ + unsigned int size_y; + + /** @brief The Z dimension of the working data to process. */ + unsigned int size_z; + + /** @brief The X position of first src and dst data in the data set. */ + unsigned int offset_x; + + /** @brief The Y position of first src and dst data in the data set. */ + unsigned int offset_y; + + /** @brief The Z position of first src and dst data in the data set. */ + unsigned int offset_z; + + /** @brief The working memory buffer. */ + vfloat4 *work_memory; +}; + +/** + * @brief Parameter structure for @c compute_averages_proc(). + */ +struct avg_args +{ + /** @brief The arguments for the nested variance computation. */ + pixel_region_args arg; + + /** @brief The image X dimensions. */ + unsigned int img_size_x; + + /** @brief The image Y dimensions. */ + unsigned int img_size_y; + + /** @brief The image Z dimensions. */ + unsigned int img_size_z; + + /** @brief The maximum working block dimensions in X and Y dimensions. */ + unsigned int blk_size_xy; + + /** @brief The maximum working block dimensions in Z dimensions. */ + unsigned int blk_size_z; + + /** @brief The working block memory size. */ + unsigned int work_memory_size; +}; + +#if defined(ASTCENC_DIAGNOSTICS) +/* See astcenc_diagnostic_trace header for details. */ +class TraceLog; +#endif + +/** + * @brief The astcenc compression context. + */ +struct astcenc_contexti +{ + /** @brief The configuration this context was created with. */ + astcenc_config config; + + /** @brief The thread count supported by this context. */ + unsigned int thread_count; + + /** @brief The block size descriptor this context was created with. */ + block_size_descriptor* bsd; + + /* + * Fields below here are not needed in a decompress-only build, but some remain as they are + * small and it avoids littering the code with #ifdefs. The most significant contributors to + * large structure size are omitted. + */ + + /** @brief The input image alpha channel averages table, may be @c nullptr if not needed. */ + float* input_alpha_averages; + + /** @brief The scratch working buffers, one per thread (see @c thread_count). */ + compression_working_buffers* working_buffers; + +#if !defined(ASTCENC_DECOMPRESS_ONLY) + /** @brief The pixel region and variance worker arguments. */ + avg_args avg_preprocess_args; +#endif + +#if defined(ASTCENC_DIAGNOSTICS) + /** + * @brief The diagnostic trace logger. + * + * Note that this is a singleton, so can only be used in single threaded mode. It only exists + * here so we have a reference to close the file at the end of the capture. + */ + TraceLog* trace_log; +#endif +}; + +/* ============================================================================ + Functionality for managing block sizes and partition tables. +============================================================================ */ + +/** + * @brief Populate the block size descriptor for the target block size. + * + * This will also initialize the partition table metadata, which is stored as part of the BSD + * structure. + * + * @param x_texels The number of texels in the block X dimension. + * @param y_texels The number of texels in the block Y dimension. + * @param z_texels The number of texels in the block Z dimension. + * @param can_omit_modes Can we discard modes and partitionings that astcenc won't use? + * @param partition_count_cutoff The partition count cutoff to use, if we can omit partitionings. + * @param mode_cutoff The block mode percentile cutoff [0-1]. + * @param[out] bsd The descriptor to initialize. + */ +void init_block_size_descriptor( + unsigned int x_texels, + unsigned int y_texels, + unsigned int z_texels, + bool can_omit_modes, + unsigned int partition_count_cutoff, + float mode_cutoff, + block_size_descriptor& bsd); + +/** + * @brief Populate the partition tables for the target block size. + * + * Note the @c bsd descriptor must be initialized by calling @c init_block_size_descriptor() before + * calling this function. + * + * @param[out] bsd The block size information structure to populate. + * @param can_omit_partitionings True if we can we drop partitionings that astcenc won't use. + * @param partition_count_cutoff The partition count cutoff to use, if we can omit partitionings. + */ +void init_partition_tables( + block_size_descriptor& bsd, + bool can_omit_partitionings, + unsigned int partition_count_cutoff); + +/** + * @brief Get the percentile table for 2D block modes. + * + * This is an empirically determined prioritization of which block modes to use in the search in + * terms of their centile (lower centiles = more useful). + * + * Returns a dynamically allocated array; caller must free with delete[]. + * + * @param xdim The block x size. + * @param ydim The block y size. + * + * @return The unpacked table. + */ +const float* get_2d_percentile_table( + unsigned int xdim, + unsigned int ydim); + +/** + * @brief Query if a 2D block size is legal. + * + * @return True if legal, false otherwise. + */ +bool is_legal_2d_block_size( + unsigned int xdim, + unsigned int ydim); + +/** + * @brief Query if a 3D block size is legal. + * + * @return True if legal, false otherwise. + */ +bool is_legal_3d_block_size( + unsigned int xdim, + unsigned int ydim, + unsigned int zdim); + +/* ============================================================================ + Functionality for managing BISE quantization and unquantization. +============================================================================ */ + +/** + * @brief The precomputed table for quantizing color values. + * + * Converts unquant value in 0-255 range into quant value in 0-255 range. + * No BISE scrambling is applied at this stage. + * + * The BISE encoding results in ties where available quant<256> values are + * equidistant the available quant values. This table stores two values + * for each input - one for use with a negative residual, and one for use with + * a positive residual. + * + * Indexed by [quant_mode - 4][data_value * 2 + residual]. + */ +extern const uint8_t color_unquant_to_uquant_tables[17][512]; + +/** + * @brief The precomputed table for packing quantized color values. + * + * Converts quant value in 0-255 range into packed quant value in 0-N range, + * with BISE scrambling applied. + * + * Indexed by [quant_mode - 4][data_value]. + */ +extern const uint8_t color_uquant_to_scrambled_pquant_tables[17][256]; + +/** + * @brief The precomputed table for unpacking color values. + * + * Converts quant value in 0-N range into unpacked value in 0-255 range, + * with BISE unscrambling applied. + * + * Indexed by [quant_mode - 4][data_value]. + */ +extern const uint8_t* color_scrambled_pquant_to_uquant_tables[17]; + +/** + * @brief The precomputed quant mode storage table. + * + * Indexing by [integer_count/2][bits] gives us the quantization level for a given integer count and + * number of compressed storage bits. Returns -1 for cases where the requested integer count cannot + * ever fit in the supplied storage size. + */ +extern const int8_t quant_mode_table[10][128]; + +/** + * @brief Encode a packed string using BISE. + * + * Note that BISE can return strings that are not a whole number of bytes in length, and ASTC can + * start storing strings in a block at arbitrary bit offsets in the encoded data. + * + * @param quant_level The BISE alphabet size. + * @param character_count The number of characters in the string. + * @param input_data The unpacked string, one byte per character. + * @param[in,out] output_data The output packed string. + * @param bit_offset The starting offset in the output storage. + */ +void encode_ise( + quant_method quant_level, + unsigned int character_count, + const uint8_t* input_data, + uint8_t* output_data, + unsigned int bit_offset); + +/** + * @brief Decode a packed string using BISE. + * + * Note that BISE input strings are not a whole number of bytes in length, and ASTC can start + * strings at arbitrary bit offsets in the encoded data. + * + * @param quant_level The BISE alphabet size. + * @param character_count The number of characters in the string. + * @param input_data The packed string. + * @param[in,out] output_data The output storage, one byte per character. + * @param bit_offset The starting offset in the output storage. + */ +void decode_ise( + quant_method quant_level, + unsigned int character_count, + const uint8_t* input_data, + uint8_t* output_data, + unsigned int bit_offset); + +/** + * @brief Return the number of bits needed to encode an ISE sequence. + * + * This implementation assumes that the @c quant level is untrusted, given it may come from random + * data being decompressed, so we return an arbitrary unencodable size if that is the case. + * + * @param character_count The number of items in the sequence. + * @param quant_level The desired quantization level. + * + * @return The number of bits needed to encode the BISE string. + */ +unsigned int get_ise_sequence_bitcount( + unsigned int character_count, + quant_method quant_level); + +/* ============================================================================ + Functionality for managing color partitioning. +============================================================================ */ + +/** + * @brief Compute averages and dominant directions for each partition in a 2 component texture. + * + * @param pi The partition info for the current trial. + * @param blk The image block color data to be compressed. + * @param component1 The first component included in the analysis. + * @param component2 The second component included in the analysis. + * @param[out] pm The output partition metrics. + * - Only pi.partition_count array entries actually get initialized. + * - Direction vectors @c pm.dir are not normalized. + */ +void compute_avgs_and_dirs_2_comp( + const partition_info& pi, + const image_block& blk, + unsigned int component1, + unsigned int component2, + partition_metrics pm[BLOCK_MAX_PARTITIONS]); + +/** + * @brief Compute averages and dominant directions for each partition in a 3 component texture. + * + * @param pi The partition info for the current trial. + * @param blk The image block color data to be compressed. + * @param omitted_component The component excluded from the analysis. + * @param[out] pm The output partition metrics. + * - Only pi.partition_count array entries actually get initialized. + * - Direction vectors @c pm.dir are not normalized. + */ +void compute_avgs_and_dirs_3_comp( + const partition_info& pi, + const image_block& blk, + unsigned int omitted_component, + partition_metrics pm[BLOCK_MAX_PARTITIONS]); + +/** + * @brief Compute averages and dominant directions for each partition in a 3 component texture. + * + * This is a specialization of @c compute_avgs_and_dirs_3_comp where the omitted component is + * always alpha, a common case during partition search. + * + * @param pi The partition info for the current trial. + * @param blk The image block color data to be compressed. + * @param[out] pm The output partition metrics. + * - Only pi.partition_count array entries actually get initialized. + * - Direction vectors @c pm.dir are not normalized. + */ +void compute_avgs_and_dirs_3_comp_rgb( + const partition_info& pi, + const image_block& blk, + partition_metrics pm[BLOCK_MAX_PARTITIONS]); + +/** + * @brief Compute averages and dominant directions for each partition in a 4 component texture. + * + * @param pi The partition info for the current trial. + * @param blk The image block color data to be compressed. + * @param[out] pm The output partition metrics. + * - Only pi.partition_count array entries actually get initialized. + * - Direction vectors @c pm.dir are not normalized. + */ +void compute_avgs_and_dirs_4_comp( + const partition_info& pi, + const image_block& blk, + partition_metrics pm[BLOCK_MAX_PARTITIONS]); + +/** + * @brief Compute the RGB error for uncorrelated and same chroma projections. + * + * The output of compute averages and dirs is post processed to define two lines, both of which go + * through the mean-color-value. One line has a direction defined by the dominant direction; this + * is used to assess the error from using an uncorrelated color representation. The other line goes + * through (0,0,0) and is used to assess the error from using an RGBS color representation. + * + * This function computes the squared error when using these two representations. + * + * @param pi The partition info for the current trial. + * @param blk The image block color data to be compressed. + * @param[in,out] plines Processed line inputs, and line length outputs. + * @param[out] uncor_error The cumulative error for using the uncorrelated line. + * @param[out] samec_error The cumulative error for using the same chroma line. + */ +void compute_error_squared_rgb( + const partition_info& pi, + const image_block& blk, + partition_lines3 plines[BLOCK_MAX_PARTITIONS], + float& uncor_error, + float& samec_error); + +/** + * @brief Compute the RGBA error for uncorrelated and same chroma projections. + * + * The output of compute averages and dirs is post processed to define two lines, both of which go + * through the mean-color-value. One line has a direction defined by the dominant direction; this + * is used to assess the error from using an uncorrelated color representation. The other line goes + * through (0,0,0,1) and is used to assess the error from using an RGBS color representation. + * + * This function computes the squared error when using these two representations. + * + * @param pi The partition info for the current trial. + * @param blk The image block color data to be compressed. + * @param uncor_plines Processed uncorrelated partition lines for each partition. + * @param samec_plines Processed same chroma partition lines for each partition. + * @param[out] line_lengths The length of each components deviation from the line. + * @param[out] uncor_error The cumulative error for using the uncorrelated line. + * @param[out] samec_error The cumulative error for using the same chroma line. + */ +void compute_error_squared_rgba( + const partition_info& pi, + const image_block& blk, + const processed_line4 uncor_plines[BLOCK_MAX_PARTITIONS], + const processed_line4 samec_plines[BLOCK_MAX_PARTITIONS], + float line_lengths[BLOCK_MAX_PARTITIONS], + float& uncor_error, + float& samec_error); + +/** + * @brief Find the best set of partitions to trial for a given block. + * + * On return the @c best_partitions list will contain the two best partition + * candidates; one assuming data has uncorrelated chroma and one assuming the + * data has correlated chroma. The best candidate is returned first in the list. + * + * @param bsd The block size information. + * @param blk The image block color data to compress. + * @param partition_count The number of partitions in the block. + * @param partition_search_limit The number of candidate partition encodings to trial. + * @param[out] best_partitions The best partition candidates. + * @param requested_candidates The number of requested partitionings. May return fewer if + * candidates are not available. + * + * @return The actual number of candidates returned. + */ +unsigned int find_best_partition_candidates( + const block_size_descriptor& bsd, + const image_block& blk, + unsigned int partition_count, + unsigned int partition_search_limit, + unsigned int best_partitions[TUNE_MAX_PARTITIONING_CANDIDATES], + unsigned int requested_candidates); + +/* ============================================================================ + Functionality for managing images and image related data. +============================================================================ */ + +/** + * @brief Get a vector mask indicating lanes decompressing into a UNORM8 value. + * + * @param decode_mode The color profile for LDR_SRGB settings. + * @param blk The image block for output image bitness settings. + * + * @return The component mask vector. + */ +static inline vmask4 get_u8_component_mask( + astcenc_profile decode_mode, + const image_block& blk +) { + // Decode mode or sRGB forces writing to unorm8 output value + if (blk.decode_unorm8 || decode_mode == ASTCENC_PRF_LDR_SRGB) + { + return vmask4(true); + } + + return vmask4(false); +} + +/** + * @brief Setup computation of regional averages in an image. + * + * This must be done by only a single thread per image, before any thread calls + * @c compute_averages(). + * + * Results are written back into @c img->input_alpha_averages. + * + * @param img The input image data, also holds output data. + * @param alpha_kernel_radius The kernel radius (in pixels) for alpha mods. + * @param swz Input data component swizzle. + * @param[out] ag The average variance arguments to init. + * + * @return The number of tasks in the processing stage. + */ +unsigned int init_compute_averages( + const astcenc_image& img, + unsigned int alpha_kernel_radius, + const astcenc_swizzle& swz, + avg_args& ag); + +/** + * @brief Compute averages for a pixel region. + * + * The routine computes both in a single pass, using a summed-area table to decouple the running + * time from the averaging/variance kernel size. + * + * @param[out] ctx The compressor context storing the output data. + * @param arg The input parameter structure. + */ +void compute_pixel_region_variance( + astcenc_contexti& ctx, + const pixel_region_args& arg); +/** + * @brief Load a single image block from the input image. + * + * @param decode_mode The compression color profile. + * @param img The input image data. + * @param[out] blk The image block to populate. + * @param bsd The block size information. + * @param xpos The block X coordinate in the input image. + * @param ypos The block Y coordinate in the input image. + * @param zpos The block Z coordinate in the input image. + * @param swz The swizzle to apply on load. + */ +void load_image_block( + astcenc_profile decode_mode, + const astcenc_image& img, + image_block& blk, + const block_size_descriptor& bsd, + unsigned int xpos, + unsigned int ypos, + unsigned int zpos, + const astcenc_swizzle& swz); + +/** + * @brief Load a single image block from the input image. + * + * This specialized variant can be used only if the block is 2D LDR U8 data, + * with no swizzle. + * + * @param decode_mode The compression color profile. + * @param img The input image data. + * @param[out] blk The image block to populate. + * @param bsd The block size information. + * @param xpos The block X coordinate in the input image. + * @param ypos The block Y coordinate in the input image. + * @param zpos The block Z coordinate in the input image. + * @param swz The swizzle to apply on load. + */ +void load_image_block_fast_ldr( + astcenc_profile decode_mode, + const astcenc_image& img, + image_block& blk, + const block_size_descriptor& bsd, + unsigned int xpos, + unsigned int ypos, + unsigned int zpos, + const astcenc_swizzle& swz); + +/** + * @brief Store a single image block to the output image. + * + * @param[out] img The output image data. + * @param blk The image block to export. + * @param bsd The block size information. + * @param xpos The block X coordinate in the input image. + * @param ypos The block Y coordinate in the input image. + * @param zpos The block Z coordinate in the input image. + * @param swz The swizzle to apply on store. + */ +void store_image_block( + astcenc_image& img, + const image_block& blk, + const block_size_descriptor& bsd, + unsigned int xpos, + unsigned int ypos, + unsigned int zpos, + const astcenc_swizzle& swz); + +/* ============================================================================ + Functionality for computing endpoint colors and weights for a block. +============================================================================ */ + +/** + * @brief Compute ideal endpoint colors and weights for 1 plane of weights. + * + * The ideal endpoints define a color line for the partition. For each texel the ideal weight + * defines an exact position on the partition color line. We can then use these to assess the error + * introduced by removing and quantizing the weight grid. + * + * @param blk The image block color data to compress. + * @param pi The partition info for the current trial. + * @param[out] ei The endpoint and weight values. + */ +void compute_ideal_colors_and_weights_1plane( + const image_block& blk, + const partition_info& pi, + endpoints_and_weights& ei); + +/** + * @brief Compute ideal endpoint colors and weights for 2 planes of weights. + * + * The ideal endpoints define a color line for the partition. For each texel the ideal weight + * defines an exact position on the partition color line. We can then use these to assess the error + * introduced by removing and quantizing the weight grid. + * + * @param bsd The block size information. + * @param blk The image block color data to compress. + * @param plane2_component The component assigned to plane 2. + * @param[out] ei1 The endpoint and weight values for plane 1. + * @param[out] ei2 The endpoint and weight values for plane 2. + */ +void compute_ideal_colors_and_weights_2planes( + const block_size_descriptor& bsd, + const image_block& blk, + unsigned int plane2_component, + endpoints_and_weights& ei1, + endpoints_and_weights& ei2); + +/** + * @brief Compute the optimal unquantized weights for a decimation table. + * + * After computing ideal weights for the case for a complete weight grid, we we want to compute the + * ideal weights for the case where weights exist only for some texels. We do this with a + * steepest-descent grid solver which works as follows: + * + * First, for each actual weight, perform a weighted averaging of the texels affected by the weight. + * Then, set step size to and attempt one step towards the original ideal + * weight if it helps to reduce error. + * + * @param ei The non-decimated endpoints and weights. + * @param di The selected weight decimation. + * @param[out] dec_weight_ideal_value The ideal values for the decimated weight set. + */ +void compute_ideal_weights_for_decimation( + const endpoints_and_weights& ei, + const decimation_info& di, + float* dec_weight_ideal_value); + +/** + * @brief Compute the optimal quantized weights for a decimation table. + * + * We test the two closest weight indices in the allowed quantization range and keep the weight that + * is the closest match. + * + * @param di The selected weight decimation. + * @param low_bound The lowest weight allowed. + * @param high_bound The highest weight allowed. + * @param dec_weight_ideal_value The ideal weight set. + * @param[out] dec_weight_quant_uvalue The output quantized weight as a float. + * @param[out] dec_weight_uquant The output quantized weight as encoded int. + * @param quant_level The desired weight quant level. + */ +void compute_quantized_weights_for_decimation( + const decimation_info& di, + float low_bound, + float high_bound, + const float* dec_weight_ideal_value, + float* dec_weight_quant_uvalue, + uint8_t* dec_weight_uquant, + quant_method quant_level); + +/** + * @brief Compute the error of a decimated weight set for 1 plane. + * + * After computing ideal weights for the case with one weight per texel, we want to compute the + * error for decimated weight grids where weights are stored at a lower resolution. This function + * computes the error of the reduced grid, compared to the full grid. + * + * @param eai The ideal weights for the full grid. + * @param di The selected weight decimation. + * @param dec_weight_quant_uvalue The quantized weights for the decimated grid. + * + * @return The accumulated error. + */ +float compute_error_of_weight_set_1plane( + const endpoints_and_weights& eai, + const decimation_info& di, + const float* dec_weight_quant_uvalue); + +/** + * @brief Compute the error of a decimated weight set for 2 planes. + * + * After computing ideal weights for the case with one weight per texel, we want to compute the + * error for decimated weight grids where weights are stored at a lower resolution. This function + * computes the error of the reduced grid, compared to the full grid. + * + * @param eai1 The ideal weights for the full grid and plane 1. + * @param eai2 The ideal weights for the full grid and plane 2. + * @param di The selected weight decimation. + * @param dec_weight_quant_uvalue_plane1 The quantized weights for the decimated grid plane 1. + * @param dec_weight_quant_uvalue_plane2 The quantized weights for the decimated grid plane 2. + * + * @return The accumulated error. + */ +float compute_error_of_weight_set_2planes( + const endpoints_and_weights& eai1, + const endpoints_and_weights& eai2, + const decimation_info& di, + const float* dec_weight_quant_uvalue_plane1, + const float* dec_weight_quant_uvalue_plane2); + +/** + * @brief Pack a single pair of color endpoints as effectively as possible. + * + * The user requests a base color endpoint mode in @c format, but the quantizer may choose a + * delta-based representation. It will report back the format variant it actually used. + * + * @param color0 The input unquantized color0 endpoint for absolute endpoint pairs. + * @param color1 The input unquantized color1 endpoint for absolute endpoint pairs. + * @param rgbs_color The input unquantized RGBS variant endpoint for same chroma endpoints. + * @param rgbo_color The input unquantized RGBS variant endpoint for HDR endpoints. + * @param format The desired base format. + * @param[out] output The output storage for the quantized colors/ + * @param quant_level The quantization level requested. + * + * @return The actual endpoint mode used. + */ +uint8_t pack_color_endpoints( + vfloat4 color0, + vfloat4 color1, + vfloat4 rgbs_color, + vfloat4 rgbo_color, + int format, + uint8_t* output, + quant_method quant_level); + +/** + * @brief Unpack a single pair of encoded endpoints. + * + * Endpoints must be unscrambled and converted into the 0-255 range before calling this functions. + * + * @param decode_mode The decode mode (LDR, HDR, etc). + * @param format The color endpoint mode used. + * @param input The raw array of encoded input integers. The length of this array + * depends on @c format; it can be safely assumed to be large enough. + * @param[out] rgb_hdr Is the endpoint using HDR for the RGB channels? + * @param[out] alpha_hdr Is the endpoint using HDR for the A channel? + * @param[out] output0 The output color for endpoint 0. + * @param[out] output1 The output color for endpoint 1. + */ +void unpack_color_endpoints( + astcenc_profile decode_mode, + int format, + const uint8_t* input, + bool& rgb_hdr, + bool& alpha_hdr, + vint4& output0, + vint4& output1); + +/** + * @brief Unpack an LDR RGBA color that uses delta encoding. + * + * @param input0 The packed endpoint 0 color. + * @param input1 The packed endpoint 1 color deltas. + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +void rgba_delta_unpack( + vint4 input0, + vint4 input1, + vint4& output0, + vint4& output1); + +/** + * @brief Unpack an LDR RGBA color that uses direct encoding. + * + * @param input0 The packed endpoint 0 color. + * @param input1 The packed endpoint 1 color. + * @param[out] output0 The unpacked endpoint 0 color. + * @param[out] output1 The unpacked endpoint 1 color. + */ +void rgba_unpack( + vint4 input0, + vint4 input1, + vint4& output0, + vint4& output1); + +/** + * @brief Unpack a set of quantized and decimated weights. + * + * TODO: Can we skip this for non-decimated weights now that the @c scb is + * already storing unquantized weights? + * + * @param bsd The block size information. + * @param scb The symbolic compressed encoding. + * @param di The weight grid decimation table. + * @param is_dual_plane @c true if this is a dual plane block, @c false otherwise. + * @param[out] weights_plane1 The output array for storing the plane 1 weights. + * @param[out] weights_plane2 The output array for storing the plane 2 weights. + */ +void unpack_weights( + const block_size_descriptor& bsd, + const symbolic_compressed_block& scb, + const decimation_info& di, + bool is_dual_plane, + int weights_plane1[BLOCK_MAX_TEXELS], + int weights_plane2[BLOCK_MAX_TEXELS]); + +/** + * @brief Identify, for each mode, which set of color endpoint produces the best result. + * + * Returns the best @c tune_candidate_limit best looking modes, along with the ideal color encoding + * combination for each. The modified quantization level can be used when all formats are the same, + * as this frees up two additional bits of storage. + * + * @param pi The partition info for the current trial. + * @param blk The image block color data to compress. + * @param ep The ideal endpoints. + * @param qwt_bitcounts Bit counts for different quantization methods. + * @param qwt_errors Errors for different quantization methods. + * @param tune_candidate_limit The max number of candidates to return, may be less. + * @param start_block_mode The first block mode to inspect. + * @param end_block_mode The last block mode to inspect. + * @param[out] partition_format_specifiers The best formats per partition. + * @param[out] block_mode The best packed block mode indexes. + * @param[out] quant_level The best color quant level. + * @param[out] quant_level_mod The best color quant level if endpoints are the same. + * @param[out] tmpbuf Preallocated scratch buffers for the compressor. + * + * @return The actual number of candidate matches returned. + */ +unsigned int compute_ideal_endpoint_formats( + const partition_info& pi, + const image_block& blk, + const endpoints& ep, + const int8_t* qwt_bitcounts, + const float* qwt_errors, + unsigned int tune_candidate_limit, + unsigned int start_block_mode, + unsigned int end_block_mode, + uint8_t partition_format_specifiers[TUNE_MAX_TRIAL_CANDIDATES][BLOCK_MAX_PARTITIONS], + int block_mode[TUNE_MAX_TRIAL_CANDIDATES], + quant_method quant_level[TUNE_MAX_TRIAL_CANDIDATES], + quant_method quant_level_mod[TUNE_MAX_TRIAL_CANDIDATES], + compression_working_buffers& tmpbuf); + +/** + * @brief For a given 1 plane weight set recompute the endpoint colors. + * + * As we quantize and decimate weights the optimal endpoint colors may change slightly, so we must + * recompute the ideal colors for a specific weight set. + * + * @param blk The image block color data to compress. + * @param pi The partition info for the current trial. + * @param di The weight grid decimation table. + * @param dec_weights_uquant The quantized weight set. + * @param[in,out] ep The color endpoints (modifed in place). + * @param[out] rgbs_vectors The RGB+scale vectors for LDR blocks. + * @param[out] rgbo_vectors The RGB+offset vectors for HDR blocks. + */ +void recompute_ideal_colors_1plane( + const image_block& blk, + const partition_info& pi, + const decimation_info& di, + const uint8_t* dec_weights_uquant, + endpoints& ep, + vfloat4 rgbs_vectors[BLOCK_MAX_PARTITIONS], + vfloat4 rgbo_vectors[BLOCK_MAX_PARTITIONS]); + +/** + * @brief For a given 2 plane weight set recompute the endpoint colors. + * + * As we quantize and decimate weights the optimal endpoint colors may change slightly, so we must + * recompute the ideal colors for a specific weight set. + * + * @param blk The image block color data to compress. + * @param bsd The block_size descriptor. + * @param di The weight grid decimation table. + * @param dec_weights_uquant_plane1 The quantized weight set for plane 1. + * @param dec_weights_uquant_plane2 The quantized weight set for plane 2. + * @param[in,out] ep The color endpoints (modifed in place). + * @param[out] rgbs_vector The RGB+scale color for LDR blocks. + * @param[out] rgbo_vector The RGB+offset color for HDR blocks. + * @param plane2_component The component assigned to plane 2. + */ +void recompute_ideal_colors_2planes( + const image_block& blk, + const block_size_descriptor& bsd, + const decimation_info& di, + const uint8_t* dec_weights_uquant_plane1, + const uint8_t* dec_weights_uquant_plane2, + endpoints& ep, + vfloat4& rgbs_vector, + vfloat4& rgbo_vector, + int plane2_component); + +/** + * @brief Expand the angular tables needed for the alternative to PCA that we use. + */ +void prepare_angular_tables(); + +/** + * @brief Compute the angular endpoints for one plane for each block mode. + * + * @param only_always Only consider block modes that are always enabled. + * @param bsd The block size descriptor for the current trial. + * @param dec_weight_ideal_value The ideal decimated unquantized weight values. + * @param max_weight_quant The maximum block mode weight quantization allowed. + * @param[out] tmpbuf Preallocated scratch buffers for the compressor. + */ +void compute_angular_endpoints_1plane( + bool only_always, + const block_size_descriptor& bsd, + const float* dec_weight_ideal_value, + unsigned int max_weight_quant, + compression_working_buffers& tmpbuf); + +/** + * @brief Compute the angular endpoints for two planes for each block mode. + * + * @param bsd The block size descriptor for the current trial. + * @param dec_weight_ideal_value The ideal decimated unquantized weight values. + * @param max_weight_quant The maximum block mode weight quantization allowed. + * @param[out] tmpbuf Preallocated scratch buffers for the compressor. + */ +void compute_angular_endpoints_2planes( + const block_size_descriptor& bsd, + const float* dec_weight_ideal_value, + unsigned int max_weight_quant, + compression_working_buffers& tmpbuf); + +/* ============================================================================ + Functionality for high level compression and decompression access. +============================================================================ */ + +/** + * @brief Compress an image block into a physical block. + * + * @param ctx The compressor context and configuration. + * @param blk The image block color data to compress. + * @param[out] pcb The physical compressed block output. + * @param[out] tmpbuf Preallocated scratch buffers for the compressor. + */ +void compress_block( + const astcenc_contexti& ctx, + const image_block& blk, + uint8_t pcb[16], + compression_working_buffers& tmpbuf); + +/** + * @brief Decompress a symbolic block in to an image block. + * + * @param decode_mode The decode mode (LDR, HDR, etc). + * @param bsd The block size information. + * @param xpos The X coordinate of the block in the overall image. + * @param ypos The Y coordinate of the block in the overall image. + * @param zpos The Z coordinate of the block in the overall image. + * @param[out] blk The decompressed image block color data. + */ +void decompress_symbolic_block( + astcenc_profile decode_mode, + const block_size_descriptor& bsd, + int xpos, + int ypos, + int zpos, + const symbolic_compressed_block& scb, + image_block& blk); + +/** + * @brief Compute the error between a symbolic block and the original input data. + * + * This function is specialized for 2 plane and 1 partition search. + * + * In RGBM mode this will reject blocks that attempt to encode a zero M value. + * + * @param config The compressor config. + * @param bsd The block size information. + * @param scb The symbolic compressed encoding. + * @param blk The original image block color data. + * + * @return Returns the computed error, or a negative value if the encoding + * should be rejected for any reason. + */ +float compute_symbolic_block_difference_2plane( + const astcenc_config& config, + const block_size_descriptor& bsd, + const symbolic_compressed_block& scb, + const image_block& blk); + +/** + * @brief Compute the error between a symbolic block and the original input data. + * + * This function is specialized for 1 plane and N partition search. + * + * In RGBM mode this will reject blocks that attempt to encode a zero M value. + * + * @param config The compressor config. + * @param bsd The block size information. + * @param scb The symbolic compressed encoding. + * @param blk The original image block color data. + * + * @return Returns the computed error, or a negative value if the encoding + * should be rejected for any reason. + */ +float compute_symbolic_block_difference_1plane( + const astcenc_config& config, + const block_size_descriptor& bsd, + const symbolic_compressed_block& scb, + const image_block& blk); + +/** + * @brief Compute the error between a symbolic block and the original input data. + * + * This function is specialized for 1 plane and 1 partition search. + * + * In RGBM mode this will reject blocks that attempt to encode a zero M value. + * + * @param config The compressor config. + * @param bsd The block size information. + * @param scb The symbolic compressed encoding. + * @param blk The original image block color data. + * + * @return Returns the computed error, or a negative value if the encoding + * should be rejected for any reason. + */ +float compute_symbolic_block_difference_1plane_1partition( + const astcenc_config& config, + const block_size_descriptor& bsd, + const symbolic_compressed_block& scb, + const image_block& blk); + +/** + * @brief Convert a symbolic representation into a binary physical encoding. + * + * It is assumed that the symbolic encoding is valid and encodable, or + * previously flagged as an error block if an error color it to be encoded. + * + * @param bsd The block size information. + * @param scb The symbolic representation. + * @param[out] pcb The physical compressed block output. + */ +void symbolic_to_physical( + const block_size_descriptor& bsd, + const symbolic_compressed_block& scb, + uint8_t pcb[16]); + +/** + * @brief Convert a binary physical encoding into a symbolic representation. + * + * This function can cope with arbitrary input data; output blocks will be + * flagged as an error block if the encoding is invalid. + * + * @param bsd The block size information. + * @param pcb The physical compresesd block input. + * @param[out] scb The output symbolic representation. + */ +void physical_to_symbolic( + const block_size_descriptor& bsd, + const uint8_t pcb[16], + symbolic_compressed_block& scb); + +/* ============================================================================ +Platform-specific functions. +============================================================================ */ +/** + * @brief Allocate an aligned memory buffer. + * + * Allocated memory must be freed by aligned_free. + * + * @param size The desired buffer size. + * @param align The desired buffer alignment; must be 2^N, may be increased + * by the implementation to a minimum allowable alignment. + * + * @return The memory buffer pointer or nullptr on allocation failure. + */ +template +T* aligned_malloc(size_t size, size_t align) +{ + void* ptr; + int error = 0; + + // Don't allow this to under-align a type + size_t min_align = astc::max(alignof(T), sizeof(void*)); + size_t real_align = astc::max(min_align, align); + +#if defined(_WIN32) + ptr = _aligned_malloc(size, real_align); +#else + error = posix_memalign(&ptr, real_align, size); +#endif + + if (error || (!ptr)) + { + return nullptr; + } + + return static_cast(ptr); +} + +/** + * @brief Free an aligned memory buffer. + * + * @param ptr The buffer to free. + */ +template +void aligned_free(T* ptr) +{ +#if defined(_WIN32) + _aligned_free(ptr); +#else + free(ptr); +#endif +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_internal_entry.h b/ktx/external/astc-encoder/Source/astcenc_internal_entry.h new file mode 100644 index 0000000..966c1d3 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_internal_entry.h @@ -0,0 +1,346 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2025 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions and data declarations for the outer context. + * + * The outer context includes thread-pool management, which is slower to + * compile due to increased use of C++ stdlib. The inner context used in the + * majority of the codec library does not include this. + */ + +#ifndef ASTCENC_INTERNAL_ENTRY_INCLUDED +#define ASTCENC_INTERNAL_ENTRY_INCLUDED + +#include +#include +#include +#include + +#include "astcenc_internal.h" + +/* ============================================================================ + Parallel execution control +============================================================================ */ + +/** + * @brief A simple counter-based manager for parallel task execution. + * + * The task processing execution consists of: + * + * * A single-threaded init stage. + * * A multi-threaded processing stage. + * * A condition variable so threads can wait for processing completion. + * + * The init stage will be executed by the first thread to arrive in the critical section, there is + * no main thread in the thread pool. + * + * The processing stage uses dynamic dispatch to assign task tickets to threads on an on-demand + * basis. Threads may each therefore executed different numbers of tasks, depending on their + * processing complexity. The task queue and the task tickets are just counters; the caller must map + * these integers to an actual processing partition in a specific problem domain. + * + * The exit wait condition is needed to ensure processing has finished before a worker thread can + * progress to the next stage of the pipeline. Specifically a worker may exit the processing stage + * because there are no new tasks to assign to it while other worker threads are still processing. + * Calling @c wait() will ensure that all other worker have finished before the thread can proceed. + * + * The basic usage model: + * + * // --------- From single-threaded code --------- + * + * // Reset the tracker state + * manager->reset() + * + * // --------- From multi-threaded code --------- + * + * // Run the stage init; only first thread actually runs the lambda + * manager->init() + * + * do + * { + * // Request a task assignment + * uint task_count; + * uint base_index = manager->get_tasks(, task_count); + * + * // Process any tasks we were given (task_count <= granule size) + * if (task_count) + * { + * // Run the user task processing code for N tasks here + * ... + * + * // Flag these tasks as complete + * manager->complete_tasks(task_count); + * } + * } while (task_count); + * + * // Wait for all threads to complete tasks before progressing + * manager->wait() + * + * // Run the stage term; only first thread actually runs the lambda + * manager->term() + */ +class ParallelManager +{ +private: + /** @brief Lock used for critical section and condition synchronization. */ + std::mutex m_lock; + + /** @brief True if the current operation is cancelled. */ + std::atomic m_is_cancelled; + + /** @brief True if the stage init() step has been executed. */ + bool m_init_done; + + /** @brief True if the stage term() step has been executed. */ + bool m_term_done; + + /** @brief Condition variable for tracking stage processing completion. */ + std::condition_variable m_complete; + + /** @brief Number of tasks started, but not necessarily finished. */ + std::atomic m_start_count; + + /** @brief Number of tasks finished. */ + unsigned int m_done_count; + + /** @brief Number of tasks that need to be processed. */ + unsigned int m_task_count; + + /** @brief Progress callback (optional). */ + astcenc_progress_callback m_callback; + + /** @brief Lock used for callback synchronization. */ + std::mutex m_callback_lock; + + /** @brief Minimum progress before making a callback. */ + float m_callback_min_diff; + + /** @brief Last progress callback value. */ + float m_callback_last_value; + +public: + /** @brief Create a new ParallelManager. */ + ParallelManager() + { + reset(); + } + + /** + * @brief Reset the tracker for a new processing batch. + * + * This must be called from single-threaded code before starting the multi-threaded processing + * operations. + */ + void reset() + { + m_init_done = false; + m_term_done = false; + m_is_cancelled = false; + m_start_count = 0; + m_done_count = 0; + m_task_count = 0; + m_callback = nullptr; + m_callback_last_value = 0.0f; + m_callback_min_diff = 1.0f; + } + + /** + * @brief Clear the tracker and stop new tasks being assigned. + * + * Note, all in-flight tasks in a worker will still complete normally. + */ + void cancel() + { + m_is_cancelled = true; + } + + /** + * @brief Trigger the pipeline stage init step. + * + * This can be called from multi-threaded code. The first thread to hit this will process the + * initialization. Other threads will block and wait for it to complete. + * + * @param init_func Callable which executes the stage initialization. It must return the + * total number of tasks in the stage. + */ + void init(std::function init_func) + { + std::lock_guard lck(m_lock); + if (!m_init_done) + { + m_task_count = init_func(); + m_init_done = true; + } + } + + /** + * @brief Trigger the pipeline stage init step. + * + * This can be called from multi-threaded code. The first thread to hit this will process the + * initialization. Other threads will block and wait for it to complete. + * + * @param task_count Total number of tasks needing processing. + * @param callback Function pointer for progress status callbacks. + */ + void init(unsigned int task_count, astcenc_progress_callback callback) + { + std::lock_guard lck(m_lock); + if (!m_init_done) + { + m_callback = callback; + m_task_count = task_count; + m_init_done = true; + + // Report every 1% or 4096 blocks, whichever is larger, to avoid callback overhead + float min_diff = (4096.0f / static_cast(task_count)) * 100.0f; + m_callback_min_diff = astc::max(min_diff, 1.0f); + } + } + + /** + * @brief Request a task assignment. + * + * Assign up to @c granule tasks to the caller for processing. + * + * @param granule Maximum number of tasks that can be assigned. + * @param[out] count Actual number of tasks assigned, or zero if no tasks were assigned. + * + * @return Task index of the first assigned task; assigned tasks increment from this. + */ + unsigned int get_task_assignment(unsigned int granule, unsigned int& count) + { + unsigned int base = m_start_count.fetch_add(granule, std::memory_order_relaxed); + if (m_is_cancelled || base >= m_task_count) + { + count = 0; + return 0; + } + + count = astc::min(m_task_count - base, granule); + return base; + } + + /** + * @brief Complete a task assignment. + * + * Mark @c count tasks as complete. This will notify all threads blocked on @c wait() if this + * completes the processing of the stage. + * + * @param count The number of completed tasks. + */ + void complete_task_assignment(unsigned int count) + { + // Note: m_done_count cannot use an atomic without the mutex; this has a race between the + // update here and the wait() for other threads + unsigned int local_count; + float local_last_value; + { + std::unique_lock lck(m_lock); + m_done_count += count; + local_count = m_done_count; + local_last_value = m_callback_last_value; + + // Ensure the progress bar hits 100% + if (m_callback && m_done_count == m_task_count) + { + std::unique_lock cblck(m_callback_lock); + m_callback(100.0f); + m_callback_last_value = 100.0f; + } + + // Notify if nothing left to do + if (m_is_cancelled || m_done_count == m_task_count) + { + lck.unlock(); + m_complete.notify_all(); + } + } + + // Process progress callback if we have one + if (m_callback) + { + // Initial lockless test - have we progressed enough to emit? + float num = static_cast(local_count); + float den = static_cast(m_task_count); + float this_value = (num / den) * 100.0f; + bool report_test = (this_value - local_last_value) > m_callback_min_diff; + + // Recheck under lock, because another thread might report first + if (report_test) + { + std::unique_lock cblck(m_callback_lock); + bool report_retest = (this_value - m_callback_last_value) > m_callback_min_diff; + if (report_retest) + { + m_callback(this_value); + m_callback_last_value = this_value; + } + } + } + } + + /** + * @brief Wait for stage processing to complete. + */ + void wait() + { + std::unique_lock lck(m_lock); + m_complete.wait(lck, [this]{ return m_is_cancelled || m_done_count == m_task_count; }); + } + + /** + * @brief Trigger the pipeline stage term step. + * + * This can be called from multi-threaded code. The first thread to hit this will process the + * work pool termination. Caller must have called @c wait() prior to calling this function to + * ensure that processing is complete. + * + * @param term_func Callable which executes the stage termination. + */ + void term(std::function term_func) + { + std::lock_guard lck(m_lock); + if (!m_term_done) + { + term_func(); + m_term_done = true; + } + } +}; + +/** + * @brief The astcenc compression context. + */ +struct astcenc_context +{ + /** @brief The context internal state. */ + astcenc_contexti context; + +#if !defined(ASTCENC_DECOMPRESS_ONLY) + /** @brief The parallel manager for averages computation. */ + ParallelManager manage_avg; + + /** @brief The parallel manager for compression. */ + ParallelManager manage_compress; +#endif + + /** @brief The parallel manager for decompression. */ + ParallelManager manage_decompress; +}; + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_mathlib.cpp b/ktx/external/astc-encoder/Source/astcenc_mathlib.cpp new file mode 100644 index 0000000..f276ac7 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_mathlib.cpp @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2021 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. +// ---------------------------------------------------------------------------- + +#include "astcenc_mathlib.h" + +/** + * @brief 64-bit rotate left. + * + * @param val The value to rotate. + * @param count The rotation, in bits. + */ +static inline uint64_t rotl(uint64_t val, int count) +{ + return (val << count) | (val >> (64 - count)); +} + +/* See header for documentation. */ +void astc::rand_init(uint64_t state[2]) +{ + state[0] = 0xfaf9e171cea1ec6bULL; + state[1] = 0xf1b318cc06af5d71ULL; +} + +/* See header for documentation. */ +uint64_t astc::rand(uint64_t state[2]) +{ + uint64_t s0 = state[0]; + uint64_t s1 = state[1]; + uint64_t res = s0 + s1; + s1 ^= s0; + state[0] = rotl(s0, 24) ^ s1 ^ (s1 << 16); + state[1] = rotl(s1, 37); + return res; +} diff --git a/ktx/external/astc-encoder/Source/astcenc_mathlib.h b/ktx/external/astc-encoder/Source/astcenc_mathlib.h new file mode 100644 index 0000000..5fd296d --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_mathlib.h @@ -0,0 +1,505 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2025 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. +// ---------------------------------------------------------------------------- + +/* + * This module implements a variety of mathematical data types and library + * functions used by the codec. + */ + +#ifndef ASTC_MATHLIB_H_INCLUDED +#define ASTC_MATHLIB_H_INCLUDED + +#include +#include +#include + +#ifndef ASTCENC_POPCNT + #if defined(__POPCNT__) + #define ASTCENC_POPCNT 1 + #else + #define ASTCENC_POPCNT 0 + #endif +#endif + +#ifndef ASTCENC_F16C + #if defined(__F16C__) + #define ASTCENC_F16C 1 + #else + #define ASTCENC_F16C 0 + #endif +#endif + +#ifndef ASTCENC_SSE + #if defined(__SSE4_2__) + #define ASTCENC_SSE 42 + #elif defined(__SSE4_1__) + #define ASTCENC_SSE 41 + #elif defined(__SSE2__) || (defined(_M_AMD64) && !defined(_M_ARM64EC)) + #define ASTCENC_SSE 20 + #else + #define ASTCENC_SSE 0 + #endif +#endif + +#ifndef ASTCENC_AVX + #if defined(__AVX2__) + #define ASTCENC_AVX 2 + #define ASTCENC_X86_GATHERS 1 + #elif defined(__AVX__) + #define ASTCENC_AVX 1 + #define ASTCENC_X86_GATHERS 1 + #else + #define ASTCENC_AVX 0 + #endif +#endif + +#ifndef ASTCENC_NEON + #if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + #define ASTCENC_NEON 1 + #else + #define ASTCENC_NEON 0 + #endif +#endif + +#ifndef ASTCENC_SVE + #if defined(__ARM_FEATURE_SVE) + #if defined(__ARM_FEATURE_SVE_BITS) && __ARM_FEATURE_SVE_BITS == 256 + #define ASTCENC_SVE 8 + // Auto-detected SVE can only assume vector width of 4 is available, but + // must also allow for hardware being longer and so all use of intrinsics + // must explicitly use predicate masks to limit to 4-wide. + #else + #define ASTCENC_SVE 4 + #endif + #else + #define ASTCENC_SVE 0 + #endif +#endif + +// Force vector-sized SIMD alignment +#if ASTCENC_AVX || ASTCENC_SVE == 8 + #define ASTCENC_VECALIGN 32 +#elif ASTCENC_SSE || ASTCENC_NEON || ASTCENC_SVE == 4 + #define ASTCENC_VECALIGN 16 +// Use default alignment for non-SIMD builds +#else + #define ASTCENC_VECALIGN 0 +#endif + +// C++11 states that alignas(0) should be ignored but GCC doesn't do +// this on some versions, so workaround and avoid emitting alignas(0) +#if ASTCENC_VECALIGN > 0 + #define ASTCENC_ALIGNAS alignas(ASTCENC_VECALIGN) +#else + #define ASTCENC_ALIGNAS +#endif + +#if ASTCENC_SSE != 0 || ASTCENC_AVX != 0 || ASTCENC_POPCNT != 0 + #include +#endif + +/* ============================================================================ + Fast math library; note that many of the higher-order functions in this set + use approximations which are less accurate, but faster, than standard + library equivalents. + + Note: Many of these are not necessarily faster than simple C versions when + used on a single scalar value, but are included for testing purposes as most + have an option based on SSE intrinsics and therefore provide an obvious route + to future vectorization. +============================================================================ */ + +// Union for manipulation of float bit patterns +typedef union +{ + uint32_t u; + int32_t s; + float f; +} if32; + +// These are namespaced to avoid colliding with C standard library functions. +namespace astc +{ + +static const float PI = 3.14159265358979323846f; +static const float PI_OVER_TWO = 1.57079632679489661923f; + +/** + * @brief SP float absolute value. + * + * @param v The value to make absolute. + * + * @return The absolute value. + */ +static inline float fabs(float v) +{ + return std::fabs(v); +} + +/** + * @brief Test if a float value is a nan. + * + * @param v The value test. + * + * @return Zero is not a NaN, non-zero otherwise. + */ +static inline bool isnan(float v) +{ + return v != v; +} + +/** + * @brief Return the minimum of two values. + * + * For floats, NaNs are turned into @c q. + * + * @param p The first value to compare. + * @param q The second value to compare. + * + * @return The smallest value. + */ +template +static inline T min(T p, T q) +{ + return p < q ? p : q; +} + +/** + * @brief Return the minimum of three values. + * + * For floats, NaNs are turned into @c r. + * + * @param p The first value to compare. + * @param q The second value to compare. + * @param r The third value to compare. + * + * @return The smallest value. + */ +template +static inline T min(T p, T q, T r) +{ + return min(min(p, q), r); +} + +/** + * @brief Return the minimum of four values. + * + * For floats, NaNs are turned into @c s. + * + * @param p The first value to compare. + * @param q The second value to compare. + * @param r The third value to compare. + * @param s The fourth value to compare. + * + * @return The smallest value. + */ +template +static inline T min(T p, T q, T r, T s) +{ + return min(min(p, q), min(r, s)); +} + +/** + * @brief Return the maximum of two values. + * + * For floats, NaNs are turned into @c q. + * + * @param p The first value to compare. + * @param q The second value to compare. + * + * @return The largest value. + */ +template +static inline T max(T p, T q) +{ + return p > q ? p : q; +} + +/** + * @brief Return the maximum of three values. + * + * For floats, NaNs are turned into @c r. + * + * @param p The first value to compare. + * @param q The second value to compare. + * @param r The third value to compare. + * + * @return The largest value. + */ +template +static inline T max(T p, T q, T r) +{ + return max(max(p, q), r); +} + +/** + * @brief Return the maximum of four values. + * + * For floats, NaNs are turned into @c s. + * + * @param p The first value to compare. + * @param q The second value to compare. + * @param r The third value to compare. + * @param s The fourth value to compare. + * + * @return The largest value. + */ +template +static inline T max(T p, T q, T r, T s) +{ + return max(max(p, q), max(r, s)); +} + +/** + * @brief Clamp a value value between @c mn and @c mx. + * + * For floats, NaNs are turned into @c mn. + * + * @param v The value to clamp. + * @param mn The min value (inclusive). + * @param mx The max value (inclusive). + * + * @return The clamped value. + */ +template +inline T clamp(T v, T mn, T mx) +{ + // Do not reorder; correct NaN handling relies on the fact that comparison + // with NaN returns false and will fall-though to the "min" value. + if (v > mx) return mx; + if (v > mn) return v; + return mn; +} + +/** + * @brief Clamp a float value between 0.0f and 1.0f. + * + * NaNs are turned into 0.0f. + * + * @param v The value to clamp. + * + * @return The clamped value. + */ +static inline float clamp1f(float v) +{ + return astc::clamp(v, 0.0f, 1.0f); +} + +/** + * @brief Clamp a float value between 0.0f and 255.0f. + * + * NaNs are turned into 0.0f. + * + * @param v The value to clamp. + * + * @return The clamped value. + */ +static inline float clamp255f(float v) +{ + return astc::clamp(v, 0.0f, 255.0f); +} + +/** + * @brief SP float round-down. + * + * @param v The value to round. + * + * @return The rounded value. + */ +static inline float flt_rd(float v) +{ + return std::floor(v); +} + +/** + * @brief SP float round-to-nearest and convert to integer. + * + * @param v The value to round. + * + * @return The rounded value. + */ +static inline int flt2int_rtn(float v) +{ + + return static_cast(v + 0.5f); +} + +/** + * @brief SP float round down and convert to integer. + * + * @param v The value to round. + * + * @return The rounded value. + */ +static inline int flt2int_rd(float v) +{ + return static_cast(v); +} + +/** + * @brief SP float bit-interpreted as an integer. + * + * @param v The value to bitcast. + * + * @return The converted value. + */ +static inline int float_as_int(float v) +{ + union { int a; float b; } u; + u.b = v; + return u.a; +} + +/** + * @brief Integer bit-interpreted as an SP float. + * + * @param v The value to bitcast. + * + * @return The converted value. + */ +static inline float int_as_float(int v) +{ + union { int a; float b; } u; + u.a = v; + return u.b; +} + +/** + * @brief Fast approximation of 1.0 / sqrt(val). + * + * @param v The input value. + * + * @return The approximated result. + */ +static inline float rsqrt(float v) +{ + return 1.0f / std::sqrt(v); +} + +/** + * @brief Fast approximation of sqrt(val). + * + * @param v The input value. + * + * @return The approximated result. + */ +static inline float sqrt(float v) +{ + return std::sqrt(v); +} + +/** + * @brief Extract mantissa and exponent of a float value. + * + * @param v The input value. + * @param[out] expo The output exponent. + * + * @return The mantissa. + */ +static inline float frexp(float v, int* expo) +{ + if32 p; + p.f = v; + *expo = ((p.u >> 23) & 0xFF) - 126; + p.u = (p.u & 0x807fffff) | 0x3f000000; + return p.f; +} + +/** + * @brief Initialize the seed structure for a random number generator. + * + * Important note: For the purposes of ASTC we want sets of random numbers to + * use the codec, but we want the same seed value across instances and threads + * to ensure that image output is stable across compressor runs and across + * platforms. Every PRNG created by this call will therefore return the same + * sequence of values ... + * + * @param state The state structure to initialize. + */ +void rand_init(uint64_t state[2]); + +/** + * @brief Return the next random number from the generator. + * + * This RNG is an implementation of the "xoroshoro-128+ 1.0" PRNG, based on the + * public-domain implementation given by David Blackman & Sebastiano Vigna at + * http://vigna.di.unimi.it/xorshift/xoroshiro128plus.c + * + * @param state The state structure to use/update. + */ +uint64_t rand(uint64_t state[2]); + +} + +/* ============================================================================ + Softfloat library with fp32 and fp16 conversion functionality. +============================================================================ */ +#if (ASTCENC_F16C == 0) && (ASTCENC_NEON == 0) + /* narrowing float->float conversions */ + uint16_t float_to_sf16(float val); + float sf16_to_float(uint16_t val); +#endif + +/********************************* + Vector library +*********************************/ +#include "astcenc_vecmathlib.h" + +/********************************* + Declaration of line types +*********************************/ +// parametric line, 2D: The line is given by line = a + b * t. + +struct line2 +{ + vfloat4 a; + vfloat4 b; +}; + +// parametric line, 3D +struct line3 +{ + vfloat4 a; + vfloat4 b; +}; + +struct line4 +{ + vfloat4 a; + vfloat4 b; +}; + + +struct processed_line2 +{ + vfloat4 amod; + vfloat4 bs; +}; + +struct processed_line3 +{ + vfloat4 amod; + vfloat4 bs; +}; + +struct processed_line4 +{ + vfloat4 amod; + vfloat4 bs; +}; + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_mathlib_softfloat.cpp b/ktx/external/astc-encoder/Source/astcenc_mathlib_softfloat.cpp new file mode 100644 index 0000000..42db764 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_mathlib_softfloat.cpp @@ -0,0 +1,411 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2021 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Soft-float library for IEEE-754. + */ +#if (ASTCENC_F16C == 0) && (ASTCENC_NEON == 0) + +#include "astcenc_mathlib.h" + +/* sized soft-float types. These are mapped to the sized integer + types of C99, instead of C's floating-point types; this is because + the library needs to maintain exact, bit-level control on all + operations on these data types. */ +typedef uint16_t sf16; +typedef uint32_t sf32; + +/****************************************** + helper functions and their lookup tables + ******************************************/ +/* count leading zeros functions. Only used when the input is nonzero. */ + +#if defined(__GNUC__) && (defined(__i386) || defined(__amd64)) +#elif defined(__arm__) && defined(__ARMCC_VERSION) +#elif defined(__arm__) && defined(__GNUC__) +#else + /* table used for the slow default versions. */ + static const uint8_t clz_table[256] = + { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; +#endif + +/* + 32-bit count-leading-zeros function: use the Assembly instruction whenever possible. */ +static uint32_t clz32(uint32_t inp) +{ + #if defined(__GNUC__) && (defined(__i386) || defined(__amd64)) + uint32_t bsr; + __asm__("bsrl %1, %0": "=r"(bsr):"r"(inp | 1)); + return 31 - bsr; + #else + #if defined(__arm__) && defined(__ARMCC_VERSION) + return __clz(inp); /* armcc builtin */ + #else + #if defined(__arm__) && defined(__GNUC__) + uint32_t lz; + __asm__("clz %0, %1": "=r"(lz):"r"(inp)); + return lz; + #else + /* slow default version */ + uint32_t summa = 24; + if (inp >= UINT32_C(0x10000)) + { + inp >>= 16; + summa -= 16; + } + if (inp >= UINT32_C(0x100)) + { + inp >>= 8; + summa -= 8; + } + return summa + clz_table[inp]; + #endif + #endif + #endif +} + +/* the five rounding modes that IEEE-754r defines */ +typedef enum +{ + SF_UP = 0, /* round towards positive infinity */ + SF_DOWN = 1, /* round towards negative infinity */ + SF_TOZERO = 2, /* round towards zero */ + SF_NEARESTEVEN = 3, /* round toward nearest value; if mid-between, round to even value */ + SF_NEARESTAWAY = 4 /* round toward nearest value; if mid-between, round away from zero */ +} roundmode; + + +static uint32_t rtne_shift32(uint32_t inp, uint32_t shamt) +{ + uint32_t vl1 = UINT32_C(1) << shamt; + uint32_t inp2 = inp + (vl1 >> 1); /* added 0.5 ULP */ + uint32_t msk = (inp | UINT32_C(1)) & vl1; /* nonzero if odd. '| 1' forces it to 1 if the shamt is 0. */ + msk--; /* negative if even, nonnegative if odd. */ + inp2 -= (msk >> 31); /* subtract epsilon before shift if even. */ + inp2 >>= shamt; + return inp2; +} + +static uint32_t rtna_shift32(uint32_t inp, uint32_t shamt) +{ + uint32_t vl1 = (UINT32_C(1) << shamt) >> 1; + inp += vl1; + inp >>= shamt; + return inp; +} + +static uint32_t rtup_shift32(uint32_t inp, uint32_t shamt) +{ + uint32_t vl1 = UINT32_C(1) << shamt; + inp += vl1; + inp--; + inp >>= shamt; + return inp; +} + +/* convert from FP16 to FP32. */ +static sf32 sf16_to_sf32(sf16 inp) +{ + uint32_t inpx = inp; + + /* + This table contains, for every FP16 sign/exponent value combination, + the difference between the input FP16 value and the value obtained + by shifting the correct FP32 result right by 13 bits. + This table allows us to handle every case except denormals and NaN + with just 1 table lookup, 2 shifts and 1 add. + */ + + #define WITH_MSB(a) (UINT32_C(a) | (1u << 31)) + static const uint32_t tbl[64] = + { + WITH_MSB(0x00000), 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, + 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, + 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, + 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, 0x1C000, WITH_MSB(0x38000), + WITH_MSB(0x38000), 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, + 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, + 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, + 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, 0x54000, WITH_MSB(0x70000) + }; + + uint32_t res = tbl[inpx >> 10]; + res += inpx; + + /* Normal cases: MSB of 'res' not set. */ + if ((res & WITH_MSB(0)) == 0) + { + return res << 13; + } + + /* Infinity and Zero: 10 LSB of 'res' not set. */ + if ((res & 0x3FF) == 0) + { + return res << 13; + } + + /* NaN: the exponent field of 'inp' is non-zero. */ + if ((inpx & 0x7C00) != 0) + { + /* All NaNs are quietened. */ + return (res << 13) | 0x400000; + } + + /* Denormal cases */ + uint32_t sign = (inpx & 0x8000) << 16; + uint32_t mskval = inpx & 0x7FFF; + uint32_t leadingzeroes = clz32(mskval); + mskval <<= leadingzeroes; + return (mskval >> 8) + ((0x85 - leadingzeroes) << 23) + sign; +} + +/* Conversion routine that converts from FP32 to FP16. It supports denormals and all rounding modes. If a NaN is given as input, it is quietened. */ +static sf16 sf32_to_sf16(sf32 inp, roundmode rmode) +{ + /* for each possible sign/exponent combination, store a case index. This gives a 512-byte table */ + static const uint8_t tab[512] { + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 50, + + 5, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 55, + }; + + /* many of the cases below use a case-dependent magic constant. So we look up a magic constant before actually performing the switch. This table allows us to group cases, thereby minimizing code + size. */ + static const uint32_t tabx[60] { + UINT32_C(0), UINT32_C(0), UINT32_C(0), UINT32_C(0), UINT32_C(0), UINT32_C(0x8000), UINT32_C(0x80000000), UINT32_C(0x8000), UINT32_C(0x8000), UINT32_C(0x8000), + UINT32_C(1), UINT32_C(0), UINT32_C(0), UINT32_C(0), UINT32_C(0), UINT32_C(0x8000), UINT32_C(0x8001), UINT32_C(0x8000), UINT32_C(0x8000), UINT32_C(0x8000), + UINT32_C(0), UINT32_C(0), UINT32_C(0), UINT32_C(0), UINT32_C(0), UINT32_C(0x8000), UINT32_C(0x8000), UINT32_C(0x8000), UINT32_C(0x8000), UINT32_C(0x8000), + UINT32_C(0xC8001FFF), UINT32_C(0xC8000000), UINT32_C(0xC8000000), UINT32_C(0xC8000FFF), UINT32_C(0xC8001000), + UINT32_C(0x58000000), UINT32_C(0x38001FFF), UINT32_C(0x58000000), UINT32_C(0x58000FFF), UINT32_C(0x58001000), + UINT32_C(0x7C00), UINT32_C(0x7BFF), UINT32_C(0x7BFF), UINT32_C(0x7C00), UINT32_C(0x7C00), + UINT32_C(0xFBFF), UINT32_C(0xFC00), UINT32_C(0xFBFF), UINT32_C(0xFC00), UINT32_C(0xFC00), + UINT32_C(0x90000000), UINT32_C(0x90000000), UINT32_C(0x90000000), UINT32_C(0x90000000), UINT32_C(0x90000000), + UINT32_C(0x20000000), UINT32_C(0x20000000), UINT32_C(0x20000000), UINT32_C(0x20000000), UINT32_C(0x20000000) + }; + + uint32_t p; + uint32_t idx = rmode + tab[inp >> 23]; + uint32_t vlx = tabx[idx]; + switch (idx) + { + /* + Positive number which may be Infinity or NaN. + We need to check whether it is NaN; if it is, quieten it by setting the top bit of the mantissa. + (If we don't do this quieting, then a NaN that is distinguished only by having + its low-order bits set, would be turned into an INF. */ + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + case 58: + case 59: + /* + the input value is 0x7F800000 or 0xFF800000 if it is INF. + By subtracting 1, we get 7F7FFFFF or FF7FFFFF, that is, bit 23 becomes zero. + For NaNs, however, this operation will keep bit 23 with the value 1. + We can then extract bit 23, and logical-OR bit 9 of the result with this + bit in order to quieten the NaN (a Quiet NaN is a NaN where the top bit + of the mantissa is set.) + */ + p = (inp - 1) & UINT32_C(0x800000); /* zero if INF, nonzero if NaN. */ + return static_cast(((inp + vlx) >> 13) | (p >> 14)); + /* + positive, exponent = 0, round-mode == UP; need to check whether number actually is 0. + If it is, then return 0, else return 1 (the smallest representable nonzero number) + */ + case 0: + /* + -inp will set the MSB if the input number is nonzero. + Thus (-inp) >> 31 will turn into 0 if the input number is 0 and 1 otherwise. + */ + return static_cast(static_cast((-static_cast(inp))) >> 31); + + /* + negative, exponent = , round-mode == DOWN, need to check whether number is + actually 0. If it is, return 0x8000 ( float -0.0 ) + Else return the smallest negative number ( 0x8001 ) */ + case 6: + /* + in this case 'vlx' is 0x80000000. By subtracting the input value from it, + we obtain a value that is 0 if the input value is in fact zero and has + the MSB set if it isn't. We then right-shift the value by 31 places to + get a value that is 0 if the input is -0.0 and 1 otherwise. + */ + return static_cast(((vlx - inp) >> 31) + UINT32_C(0x8000)); + + /* + for all other cases involving underflow/overflow, we don't need to + do actual tests; we just return 'vlx'. + */ + case 1: + case 2: + case 3: + case 4: + case 5: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 40: + case 41: + case 42: + case 43: + case 44: + case 45: + case 46: + case 47: + case 48: + case 49: + return static_cast(vlx); + + /* + for normal numbers, 'vlx' is the difference between the FP32 value of a number and the + FP16 representation of the same number left-shifted by 13 places. In addition, a rounding constant is + baked into 'vlx': for rounding-away-from zero, the constant is 2^13 - 1, causing roundoff away + from zero. for round-to-nearest away, the constant is 2^12, causing roundoff away from zero. + for round-to-nearest-even, the constant is 2^12 - 1. This causes correct round-to-nearest-even + except for odd input numbers. For odd input numbers, we need to add 1 to the constant. */ + + /* normal number, all rounding modes except round-to-nearest-even: */ + case 30: + case 31: + case 32: + case 34: + case 35: + case 36: + case 37: + case 39: + return static_cast((inp + vlx) >> 13); + + /* normal number, round-to-nearest-even. */ + case 33: + case 38: + p = inp + vlx; + p += (inp >> 13) & 1; + return static_cast(p >> 13); + + /* + the various denormal cases. These are not expected to be common, so their performance is a bit + less important. For each of these cases, we need to extract an exponent and a mantissa + (including the implicit '1'!), and then right-shift the mantissa by a shift-amount that + depends on the exponent. The shift must apply the correct rounding mode. 'vlx' is used to supply the + sign of the resulting denormal number. + */ + case 21: + case 22: + case 25: + case 27: + /* denormal, round towards zero. */ + p = 126 - ((inp >> 23) & 0xFF); + return static_cast((((inp & UINT32_C(0x7FFFFF)) + UINT32_C(0x800000)) >> p) | vlx); + case 20: + case 26: + /* denormal, round away from zero. */ + p = 126 - ((inp >> 23) & 0xFF); + return static_cast(rtup_shift32((inp & UINT32_C(0x7FFFFF)) + UINT32_C(0x800000), p) | vlx); + case 24: + case 29: + /* denormal, round to nearest-away */ + p = 126 - ((inp >> 23) & 0xFF); + return static_cast(rtna_shift32((inp & UINT32_C(0x7FFFFF)) + UINT32_C(0x800000), p) | vlx); + case 23: + case 28: + /* denormal, round to nearest-even. */ + p = 126 - ((inp >> 23) & 0xFF); + return static_cast(rtne_shift32((inp & UINT32_C(0x7FFFFF)) + UINT32_C(0x800000), p) | vlx); + } + + return 0; +} + +/* convert from soft-float to native-float */ +float sf16_to_float(uint16_t p) +{ + if32 i; + i.u = sf16_to_sf32(p); + return i.f; +} + +/* convert from native-float to soft-float */ +uint16_t float_to_sf16(float p) +{ + if32 i; + i.f = p; + return sf32_to_sf16(i.u, SF_NEARESTEVEN); +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_partition_tables.cpp b/ktx/external/astc-encoder/Source/astcenc_partition_tables.cpp new file mode 100644 index 0000000..3a127cc --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_partition_tables.cpp @@ -0,0 +1,481 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2023 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for generating partition tables on demand. + */ + +#include "astcenc_internal.h" + +/** @brief The number of 64-bit words needed to represent a canonical partition bit pattern. */ +#define BIT_PATTERN_WORDS (((ASTCENC_BLOCK_MAX_TEXELS * 2) + 63) / 64) + +/** + * @brief Generate a canonical representation of a partition pattern. + * + * The returned value stores two bits per texel, for up to 6x6x6 texels, where the two bits store + * the remapped texel index. Remapping ensures that we only match on the partition pattern, + * independent of the partition order generated by the hash. + * + * @param texel_count The number of texels in the block. + * @param partition_of_texel The partition assignments, in hash order. + * @param[out] bit_pattern The output bit pattern representation. + */ +static void generate_canonical_partitioning( + unsigned int texel_count, + const uint8_t* partition_of_texel, + uint64_t bit_pattern[BIT_PATTERN_WORDS] +) { + // Clear the pattern + for (unsigned int i = 0; i < BIT_PATTERN_WORDS; i++) + { + bit_pattern[i] = 0; + } + + // Store a mapping to reorder the raw partitions so that the partitions are ordered such + // that the lowest texel index in partition N is smaller than the lowest texel index in + // partition N + 1. + int mapped_index[BLOCK_MAX_PARTITIONS]; + int map_weight_count = 0; + + for (unsigned int i = 0; i < BLOCK_MAX_PARTITIONS; i++) + { + mapped_index[i] = -1; + } + + for (unsigned int i = 0; i < texel_count; i++) + { + int index = partition_of_texel[i]; + if (mapped_index[index] < 0) + { + mapped_index[index] = map_weight_count++; + } + + uint64_t xlat_index = mapped_index[index]; + bit_pattern[i >> 5] |= xlat_index << (2 * (i & 0x1F)); + } +} + +/** + * @brief Compare two canonical patterns to see if they are the same. + * + * @param part1 The first canonical bit pattern to check. + * @param part2 The second canonical bit pattern to check. + * + * @return @c true if the patterns are the same, @c false otherwise. + */ +static bool compare_canonical_partitionings( + const uint64_t part1[BIT_PATTERN_WORDS], + const uint64_t part2[BIT_PATTERN_WORDS] +) { + return (part1[0] == part2[0]) +#if BIT_PATTERN_WORDS > 1 + && (part1[1] == part2[1]) +#endif +#if BIT_PATTERN_WORDS > 2 + && (part1[2] == part2[2]) +#endif +#if BIT_PATTERN_WORDS > 3 + && (part1[3] == part2[3]) +#endif +#if BIT_PATTERN_WORDS > 4 + && (part1[4] == part2[4]) +#endif +#if BIT_PATTERN_WORDS > 5 + && (part1[5] == part2[5]) +#endif +#if BIT_PATTERN_WORDS > 6 + && (part1[6] == part2[6]) +#endif + ; +} + +/** + * @brief Hash function used for procedural partition assignment. + * + * @param inp The hash seed. + * + * @return The hashed value. + */ +static uint32_t hash52( + uint32_t inp +) { + inp ^= inp >> 15; + + // (2^4 + 1) * (2^7 + 1) * (2^17 - 1) + inp *= 0xEEDE0891; + inp ^= inp >> 5; + inp += inp << 16; + inp ^= inp >> 7; + inp ^= inp >> 3; + inp ^= inp << 6; + inp ^= inp >> 17; + return inp; +} + +/** + * @brief Select texel assignment for a single coordinate. + * + * @param seed The seed - the partition index from the block. + * @param x The texel X coordinate in the block. + * @param y The texel Y coordinate in the block. + * @param z The texel Z coordinate in the block. + * @param partition_count The total partition count of this encoding. + * @param small_block @c true if the block has fewer than 32 texels. + * + * @return The assigned partition index for this texel. + */ +static uint8_t select_partition( + int seed, + int x, + int y, + int z, + int partition_count, + bool small_block +) { + // For small blocks bias the coordinates to get better distribution + if (small_block) + { + x <<= 1; + y <<= 1; + z <<= 1; + } + + seed += (partition_count - 1) * 1024; + + uint32_t rnum = hash52(seed); + + uint8_t seed1 = rnum & 0xF; + uint8_t seed2 = (rnum >> 4) & 0xF; + uint8_t seed3 = (rnum >> 8) & 0xF; + uint8_t seed4 = (rnum >> 12) & 0xF; + uint8_t seed5 = (rnum >> 16) & 0xF; + uint8_t seed6 = (rnum >> 20) & 0xF; + uint8_t seed7 = (rnum >> 24) & 0xF; + uint8_t seed8 = (rnum >> 28) & 0xF; + uint8_t seed9 = (rnum >> 18) & 0xF; + uint8_t seed10 = (rnum >> 22) & 0xF; + uint8_t seed11 = (rnum >> 26) & 0xF; + uint8_t seed12 = ((rnum >> 30) | (rnum << 2)) & 0xF; + + // Squaring all the seeds in order to bias their distribution towards lower values. + seed1 *= seed1; + seed2 *= seed2; + seed3 *= seed3; + seed4 *= seed4; + seed5 *= seed5; + seed6 *= seed6; + seed7 *= seed7; + seed8 *= seed8; + seed9 *= seed9; + seed10 *= seed10; + seed11 *= seed11; + seed12 *= seed12; + + int sh1, sh2; + if (seed & 1) + { + sh1 = (seed & 2 ? 4 : 5); + sh2 = (partition_count == 3 ? 6 : 5); + } + else + { + sh1 = (partition_count == 3 ? 6 : 5); + sh2 = (seed & 2 ? 4 : 5); + } + + int sh3 = (seed & 0x10) ? sh1 : sh2; + + seed1 >>= sh1; + seed2 >>= sh2; + seed3 >>= sh1; + seed4 >>= sh2; + seed5 >>= sh1; + seed6 >>= sh2; + seed7 >>= sh1; + seed8 >>= sh2; + + seed9 >>= sh3; + seed10 >>= sh3; + seed11 >>= sh3; + seed12 >>= sh3; + + int a = seed1 * x + seed2 * y + seed11 * z + (rnum >> 14); + int b = seed3 * x + seed4 * y + seed12 * z + (rnum >> 10); + int c = seed5 * x + seed6 * y + seed9 * z + (rnum >> 6); + int d = seed7 * x + seed8 * y + seed10 * z + (rnum >> 2); + + // Apply the saw + a &= 0x3F; + b &= 0x3F; + c &= 0x3F; + d &= 0x3F; + + // Remove some of the components if we are to output < 4 partitions. + if (partition_count <= 3) + { + d = 0; + } + + if (partition_count <= 2) + { + c = 0; + } + + if (partition_count <= 1) + { + b = 0; + } + + uint8_t partition; + if (a >= b && a >= c && a >= d) + { + partition = 0; + } + else if (b >= c && b >= d) + { + partition = 1; + } + else if (c >= d) + { + partition = 2; + } + else + { + partition = 3; + } + + return partition; +} + +/** + * @brief Generate a single partition info structure. + * + * @param[out] bsd The block size information. + * @param partition_count The partition count of this partitioning. + * @param partition_index The partition index / seed of this partitioning. + * @param partition_remap_index The remapped partition index of this partitioning. + * @param[out] pi The partition info structure to populate. + * + * @return True if this is a useful partition index, False if we can skip it. + */ +static bool generate_one_partition_info_entry( + block_size_descriptor& bsd, + unsigned int partition_count, + unsigned int partition_index, + unsigned int partition_remap_index, + partition_info& pi +) { + int texels_per_block = bsd.texel_count; + bool small_block = texels_per_block < 32; + + uint8_t *partition_of_texel = pi.partition_of_texel; + + // Assign texels to partitions + int texel_idx = 0; + int counts[BLOCK_MAX_PARTITIONS] { 0 }; + for (unsigned int z = 0; z < bsd.zdim; z++) + { + for (unsigned int y = 0; y < bsd.ydim; y++) + { + for (unsigned int x = 0; x < bsd.xdim; x++) + { + uint8_t part = select_partition(partition_index, x, y, z, partition_count, small_block); + pi.texels_of_partition[part][counts[part]++] = static_cast(texel_idx++); + *partition_of_texel++ = part; + } + } + } + + // Fill loop tail so we can overfetch later + for (unsigned int i = 0; i < partition_count; i++) + { + size_t ptex_count = counts[i]; + size_t ptex_count_simd = round_up_to_simd_multiple_vla(ptex_count); + for (size_t j = ptex_count; j < ptex_count_simd; j++) + { + pi.texels_of_partition[i][j] = pi.texels_of_partition[i][ptex_count - 1]; + } + } + + // Populate the actual procedural partition count + if (counts[0] == 0) + { + pi.partition_count = 0; + } + else if (counts[1] == 0) + { + pi.partition_count = 1; + } + else if (counts[2] == 0) + { + pi.partition_count = 2; + } + else if (counts[3] == 0) + { + pi.partition_count = 3; + } + else + { + pi.partition_count = 4; + } + + // Populate the partition index + pi.partition_index = static_cast(partition_index); + + // Populate the coverage bitmaps for 2/3/4 partitions + uint64_t* bitmaps { nullptr }; + if (partition_count == 2) + { + bitmaps = bsd.coverage_bitmaps_2[partition_remap_index]; + } + else if (partition_count == 3) + { + bitmaps = bsd.coverage_bitmaps_3[partition_remap_index]; + } + else if (partition_count == 4) + { + bitmaps = bsd.coverage_bitmaps_4[partition_remap_index]; + } + + for (unsigned int i = 0; i < BLOCK_MAX_PARTITIONS; i++) + { + pi.partition_texel_count[i] = static_cast(counts[i]); + } + + // Valid partitionings have texels in all of the requested partitions + bool valid = pi.partition_count == partition_count; + + if (bitmaps) + { + // Populate the partition coverage bitmap + for (unsigned int i = 0; i < partition_count; i++) + { + bitmaps[i] = 0ULL; + } + + unsigned int texels_to_process = astc::min(bsd.texel_count, BLOCK_MAX_KMEANS_TEXELS); + for (unsigned int i = 0; i < texels_to_process; i++) + { + unsigned int idx = bsd.kmeans_texels[i]; + bitmaps[pi.partition_of_texel[idx]] |= 1ULL << i; + } + } + + return valid; +} + +static void build_partition_table_for_one_partition_count( + block_size_descriptor& bsd, + bool can_omit_partitionings, + unsigned int partition_count_cutoff, + unsigned int partition_count, + partition_info* ptab, + uint64_t* canonical_patterns +) { + unsigned int next_index = 0; + bsd.partitioning_count_selected[partition_count - 1] = 0; + bsd.partitioning_count_all[partition_count - 1] = 0; + + // Skip tables larger than config max partition count if we can omit modes + if (can_omit_partitionings && (partition_count > partition_count_cutoff)) + { + return; + } + + // Iterate through twice + // - Pass 0: Keep selected partitionings + // - Pass 1: Keep non-selected partitionings (skip if in omit mode) + unsigned int max_iter = can_omit_partitionings ? 1 : 2; + + // Tracker for things we built in the first iteration + uint8_t build[BLOCK_MAX_PARTITIONINGS] { 0 }; + for (unsigned int x = 0; x < max_iter; x++) + { + for (unsigned int i = 0; i < BLOCK_MAX_PARTITIONINGS; i++) + { + // Don't include things we built in the first pass + if ((x == 1) && build[i]) + { + continue; + } + + bool keep_useful = generate_one_partition_info_entry(bsd, partition_count, i, next_index, ptab[next_index]); + if ((x == 0) && !keep_useful) + { + continue; + } + + generate_canonical_partitioning(bsd.texel_count, ptab[next_index].partition_of_texel, canonical_patterns + next_index * BIT_PATTERN_WORDS); + bool keep_canonical = true; + for (unsigned int j = 0; j < next_index; j++) + { + bool match = compare_canonical_partitionings(canonical_patterns + next_index * BIT_PATTERN_WORDS, canonical_patterns + j * BIT_PATTERN_WORDS); + if (match) + { + keep_canonical = false; + break; + } + } + + if (keep_useful && keep_canonical) + { + if (x == 0) + { + bsd.partitioning_packed_index[partition_count - 2][i] = static_cast(next_index); + bsd.partitioning_count_selected[partition_count - 1]++; + bsd.partitioning_count_all[partition_count - 1]++; + build[i] = 1; + next_index++; + } + } + else + { + if (x == 1) + { + bsd.partitioning_packed_index[partition_count - 2][i] = static_cast(next_index); + bsd.partitioning_count_all[partition_count - 1]++; + next_index++; + } + } + } + } +} + +/* See header for documentation. */ +void init_partition_tables( + block_size_descriptor& bsd, + bool can_omit_partitionings, + unsigned int partition_count_cutoff +) { + partition_info* par_tab2 = bsd.partitionings; + partition_info* par_tab3 = par_tab2 + BLOCK_MAX_PARTITIONINGS; + partition_info* par_tab4 = par_tab3 + BLOCK_MAX_PARTITIONINGS; + partition_info* par_tab1 = par_tab4 + BLOCK_MAX_PARTITIONINGS; + + generate_one_partition_info_entry(bsd, 1, 0, 0, *par_tab1); + bsd.partitioning_count_selected[0] = 1; + bsd.partitioning_count_all[0] = 1; + + uint64_t* canonical_patterns = new uint64_t[BLOCK_MAX_PARTITIONINGS * BIT_PATTERN_WORDS]; + + build_partition_table_for_one_partition_count(bsd, can_omit_partitionings, partition_count_cutoff, 2, par_tab2, canonical_patterns); + build_partition_table_for_one_partition_count(bsd, can_omit_partitionings, partition_count_cutoff, 3, par_tab3, canonical_patterns); + build_partition_table_for_one_partition_count(bsd, can_omit_partitionings, partition_count_cutoff, 4, par_tab4, canonical_patterns); + + delete[] canonical_patterns; +} diff --git a/ktx/external/astc-encoder/Source/astcenc_percentile_tables.cpp b/ktx/external/astc-encoder/Source/astcenc_percentile_tables.cpp new file mode 100644 index 0000000..448ddcc --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_percentile_tables.cpp @@ -0,0 +1,1251 @@ +// 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Percentile data tables for different block encodings. + * + * To reduce binary size the tables are stored using a packed differential encoding. + */ + +#include "astcenc_internal.h" + +#if !defined(ASTCENC_DECOMPRESS_ONLY) +/** + * @brief Structure containing packed percentile metadata. + * + * Note that percentile tables do not exist for 3D textures, so no zdim is stored. + */ +struct packed_percentile_table +{ + /** The block X dimension. */ + uint8_t xdim; + + /** The block Y dimension. */ + uint8_t ydim; + + /** The number of packed items in the 1 and 2 plane data. */ + uint16_t item_count[2]; + + /** The accumulator divisor for 1 and 2 plane data. */ + uint16_t difscales[2]; + + /** The initial accumulator values for 1 and 2 plane data. */ + uint16_t initial_percs[2]; + + /** The packed data for the 1 and 2 plane data. */ + const uint16_t *items[2]; +}; + +#if ASTCENC_BLOCK_MAX_TEXELS >= (4 * 4) +static const uint16_t percentile_arr_4x4_0[61] { + 0x0242, 0x7243, 0x6A51, 0x6A52, 0x5A41, 0x4A53, 0x8851, 0x3842, + 0x3852, 0x3853, 0x3043, 0xFA33, 0x1BDF, 0x2022, 0x1032, 0x29CE, + 0x21DE, 0x2823, 0x0813, 0x0A13, 0x0A31, 0x0A23, 0x09CF, 0x0833, + 0x0A32, 0x01DF, 0x0BDD, 0x0BCF, 0x0221, 0x095F, 0x0A01, 0x0BDE, + 0x0BCD, 0x0A22, 0x09AF, 0x0B5F, 0x0B4D, 0x0BCE, 0x0BBF, 0x0A11, + 0x01BF, 0x0202, 0x0B5D, 0x1203, 0x034E, 0x0B8E, 0x035E, 0x0212, + 0x032E, 0x0B4F, 0x03AF, 0x03AD, 0x03BD, 0x0BBE, 0x03AE, 0x039F, + 0x039E, 0x033E, 0x033F, 0x038F, 0x032F +}; + +static const uint16_t percentile_arr_4x4_1[84] { + 0x0452, 0xFFAE, 0x2433, 0x1DDF, 0x17CD, 0x1E21, 0x1C43, 0x1442, + 0x3FBE, 0x1FDD, 0x0E31, 0x0F4F, 0x1423, 0x0FBD, 0x1451, 0x0E03, + 0x05CF, 0x0C32, 0x0DDE, 0x27AD, 0x274E, 0x0E02, 0x0F5E, 0x07AF, + 0x0F5F, 0x0DCE, 0x0C41, 0x0422, 0x0613, 0x0E12, 0x0611, 0x0F3F, + 0x0601, 0x0DBF, 0x05DD, 0x075D, 0x0C02, 0x054E, 0x0431, 0x0413, + 0x079F, 0x05BE, 0x0F4D, 0x0403, 0x05AF, 0x055F, 0x05AE, 0x054F, + 0x0421, 0x05BD, 0x0DCD, 0x0411, 0x0412, 0x055E, 0x055D, 0x073D, + 0x058E, 0x072F, 0x072D, 0x079D, 0x0D2E, 0x0453, 0x078D, 0x053E, + 0x053F, 0x059E, 0x052F, 0x058F, 0x072E, 0x078F, 0x059F, 0x078E, + 0x071F, 0x073E, 0x051F, 0x070D, 0x079E, 0x070E, 0x071D, 0x0622, + 0x070F, 0x071E, 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_4x4 { + 4, 4, + { 61, 84 }, + { 184, 141 }, + { 0, 53 }, + { percentile_arr_4x4_0, percentile_arr_4x4_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (5 * 4) +static const uint16_t percentile_arr_5x4_0[91] { + 0x02C1, 0xFAD1, 0xE8D3, 0xDAC2, 0xA8D2, 0x70D1, 0x50C2, 0x80C3, + 0xD2C3, 0x4AA2, 0x2AD2, 0x2242, 0x2251, 0x42A3, 0x1A43, 0x4A52, + 0x32B3, 0x2A41, 0x1042, 0x1851, 0x5892, 0x10A2, 0x2253, 0x10B2, + 0x10B3, 0x13DF, 0x3083, 0x08B1, 0x1043, 0x12B1, 0x0AB2, 0x1A93, + 0x1852, 0x1A33, 0x09CE, 0x08A3, 0x1022, 0x1283, 0x0853, 0x1AA1, + 0x1093, 0x11DE, 0x135F, 0x1832, 0x195F, 0x0A81, 0x11CF, 0x0A31, + 0x09DF, 0x0B4D, 0x09AF, 0x03CF, 0x0813, 0x03DD, 0x0A92, 0x0A82, + 0x03CD, 0x0023, 0x0BDE, 0x0BBF, 0x1232, 0x0221, 0x0291, 0x0A23, + 0x0833, 0x035D, 0x0BCE, 0x01BF, 0x0222, 0x134E, 0x0213, 0x0A01, + 0x0B4F, 0x0B5E, 0x038E, 0x032E, 0x03AF, 0x0A11, 0x03AD, 0x0203, + 0x0202, 0x0BBD, 0x033E, 0x03AE, 0x03BE, 0x0212, 0x033F, 0x039E, + 0x039F, 0x032F, 0x038F +}; + +static const uint16_t percentile_arr_5x4_1[104] { + 0x0433, 0xB621, 0x5452, 0x4443, 0x7FAE, 0xFCA3, 0x7CC2, 0x24B2, + 0x45DF, 0x44B3, 0x7631, 0x27CD, 0x1CD1, 0x1E03, 0x4FBE, 0x774F, + 0x1C42, 0x7691, 0x24A2, 0x2681, 0x3C23, 0x3C93, 0x0FBD, 0x1C32, + 0x1E82, 0x1E12, 0x0F4E, 0x1602, 0x0FAD, 0x0C51, 0x1FDD, 0x0E13, + 0x0DCF, 0x175E, 0x0C22, 0x175F, 0x15DE, 0x0CB1, 0x17AF, 0x1CC1, + 0x1F3F, 0x1483, 0x0441, 0x0C91, 0x04D2, 0x0DCE, 0x154E, 0x079F, + 0x0CA1, 0x0F5D, 0x0431, 0x15DD, 0x05BF, 0x0C92, 0x0611, 0x0C82, + 0x0402, 0x074D, 0x0DBD, 0x055E, 0x05BE, 0x0DCD, 0x0421, 0x05AF, + 0x0403, 0x0D4F, 0x055F, 0x05AE, 0x0413, 0x0E01, 0x055D, 0x073D, + 0x0C12, 0x0692, 0x0411, 0x072D, 0x078D, 0x079D, 0x058E, 0x0D2E, + 0x0453, 0x072F, 0x059E, 0x052F, 0x071F, 0x053F, 0x053E, 0x078F, + 0x058F, 0x051F, 0x0F2E, 0x059F, 0x078E, 0x073E, 0x071D, 0x070D, + 0x070E, 0x079E, 0x0622, 0x0683, 0x070F, 0x071E, 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_5x4 { + 5, 4, + { 91, 104 }, + { 322, 464 }, + { 0, 202 }, + { percentile_arr_5x4_0, percentile_arr_5x4_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (5 * 5) +static const uint16_t percentile_arr_5x5_0[129] { + 0x00F3, 0xF8F2, 0x70E3, 0x62E1, 0x60E1, 0x4AC1, 0x3261, 0x38D3, + 0x3271, 0x5AF1, 0x5873, 0x2AD1, 0x28E2, 0x28F1, 0x2262, 0x9AC2, + 0x18D2, 0x1072, 0x1071, 0x22A2, 0x2062, 0x1A51, 0x10C2, 0x0892, + 0x08D1, 0x1AA3, 0x23EE, 0x08C3, 0x0BEF, 0x2242, 0x0863, 0x0AB3, + 0x0BFF, 0x0A93, 0x08A2, 0x0A41, 0x1083, 0x0842, 0x10B3, 0x21EE, + 0x10B2, 0x00B1, 0x1263, 0x12C3, 0x0A83, 0x0851, 0x11FE, 0x0253, + 0x09FD, 0x0A72, 0x09FF, 0x1AB2, 0x0BDF, 0x0A33, 0x0243, 0x0B7F, + 0x0AB1, 0x12D2, 0x0252, 0x096F, 0x00A3, 0x0893, 0x0822, 0x0843, + 0x097E, 0x097F, 0x01EF, 0x09CE, 0x03FE, 0x0A81, 0x036F, 0x0052, + 0x13FD, 0x0AA1, 0x1853, 0x036D, 0x0A92, 0x0832, 0x01DE, 0x0A82, + 0x0BED, 0x0231, 0x0BBF, 0x03DD, 0x0B6E, 0x01AF, 0x0813, 0x0023, + 0x0A91, 0x015F, 0x037E, 0x01CF, 0x0232, 0x0BCD, 0x0221, 0x0BDE, + 0x0213, 0x035F, 0x0B7D, 0x0223, 0x01BF, 0x0BCF, 0x01DF, 0x0033, + 0x0222, 0x03CE, 0x0A01, 0x03AF, 0x034D, 0x0B8E, 0x032E, 0x0203, + 0x0211, 0x0202, 0x0B5D, 0x03AD, 0x034E, 0x03AE, 0x034F, 0x033F, + 0x039F, 0x03BD, 0x03BE, 0x035E, 0x0212, 0x033E, 0x039E, 0x032F, + 0x038F +}; + +static const uint16_t percentile_arr_5x5_1[126] { + 0x0443, 0x6452, 0xFE21, 0x27AE, 0x2433, 0x1FCD, 0x25DF, 0x6CC2, + 0x2C62, 0x1F4F, 0x4C42, 0x1FBE, 0x0DEF, 0x34A3, 0x0E03, 0x54B2, + 0x1F7D, 0x17DD, 0x0DFF, 0x0CD1, 0x0E31, 0x0C71, 0x1CF1, 0x15FE, + 0x1691, 0x1681, 0x24B3, 0x174E, 0x0F6E, 0x0493, 0x175E, 0x1C51, + 0x17BD, 0x076D, 0x2CA2, 0x05EE, 0x1472, 0x2423, 0x0DCF, 0x0432, + 0x15DE, 0x0612, 0x0CD2, 0x0682, 0x0F5F, 0x07AD, 0x0602, 0x0CE1, + 0x0C91, 0x0FAF, 0x073F, 0x0E13, 0x0D7F, 0x0DCE, 0x0422, 0x0D7D, + 0x0441, 0x05FD, 0x0CB1, 0x0C83, 0x04C1, 0x0461, 0x0F9F, 0x0DDD, + 0x056E, 0x0C92, 0x0482, 0x0431, 0x05ED, 0x0D6F, 0x075D, 0x0402, + 0x057E, 0x0DBF, 0x04A1, 0x054E, 0x0F4D, 0x0403, 0x05CD, 0x0453, + 0x05AE, 0x0421, 0x0F1F, 0x05BE, 0x0601, 0x0611, 0x05BD, 0x05AF, + 0x078D, 0x072D, 0x073D, 0x055E, 0x0F9D, 0x0411, 0x0413, 0x0412, + 0x055F, 0x077E, 0x055D, 0x052E, 0x054F, 0x053E, 0x058E, 0x078F, + 0x059E, 0x071D, 0x0E92, 0x053F, 0x059F, 0x051F, 0x072F, 0x052F, + 0x070D, 0x079E, 0x058F, 0x072E, 0x070E, 0x078E, 0x070F, 0x073E, + 0x0622, 0x0683, 0x071E, 0x076F, 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_5x5 { + 5, 5, + { 129, 126 }, + { 258, 291 }, + { 0, 116 }, + { percentile_arr_5x5_0, percentile_arr_5x5_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (6 * 5) +static const uint16_t percentile_arr_6x5_0[165] { + 0x0163, 0xF8F3, 0x9962, 0x8972, 0x7961, 0x7173, 0x6953, 0x5943, + 0x4B41, 0x3AE1, 0x38E3, 0x6971, 0x32C1, 0x28D3, 0x2A61, 0xC8F2, + 0x2271, 0x4873, 0x5B21, 0x3AD1, 0x1B13, 0x1952, 0x1B51, 0x12F1, + 0x1A62, 0x1322, 0x1951, 0x10E2, 0x1B31, 0x20F1, 0x2102, 0x2072, + 0x10D2, 0x1142, 0x2912, 0x3871, 0x2BEE, 0x0862, 0x1123, 0x0AC2, + 0x12A2, 0x0A51, 0x1922, 0x0941, 0x1BEF, 0x0B42, 0x08D1, 0x13FF, + 0x1933, 0x08C3, 0x08C2, 0x1131, 0x08E1, 0x2903, 0x0863, 0x0B32, + 0x1132, 0x1AC3, 0x0A42, 0x1A41, 0x0042, 0x21EE, 0x09FF, 0x03DF, + 0x0AA3, 0x11FE, 0x02B3, 0x0B11, 0x10B3, 0x0B03, 0x11FD, 0x0913, + 0x0A53, 0x037F, 0x1263, 0x0051, 0x0A33, 0x0B01, 0x016F, 0x0A72, + 0x1312, 0x08A2, 0x10B1, 0x0BFE, 0x11EF, 0x0B02, 0x0A52, 0x0043, + 0x0822, 0x01CE, 0x0A43, 0x097F, 0x036F, 0x08B2, 0x03FD, 0x0A83, + 0x0B33, 0x0AB1, 0x017E, 0x0B23, 0x0852, 0x02D2, 0x0BBF, 0x0BDD, + 0x03ED, 0x0AB2, 0x02A1, 0x0853, 0x036D, 0x0892, 0x0032, 0x0A31, + 0x0083, 0x09DE, 0x0A93, 0x08A3, 0x1213, 0x0BDE, 0x03CD, 0x036E, + 0x037E, 0x0A21, 0x0023, 0x0BCF, 0x01CF, 0x0013, 0x01AF, 0x0A92, + 0x0232, 0x035F, 0x0093, 0x0B7D, 0x015F, 0x0282, 0x01BF, 0x09DF, + 0x03CE, 0x0223, 0x0833, 0x0222, 0x03AF, 0x0A01, 0x0291, 0x0B4D, + 0x032E, 0x038E, 0x0203, 0x0281, 0x035D, 0x03AD, 0x0B9F, 0x0202, + 0x034F, 0x03BE, 0x0211, 0x03AE, 0x03BD, 0x0212, 0x034E, 0x033F, + 0x033E, 0x035E, 0x039E, 0x032F, 0x038F +}; + +static const uint16_t percentile_arr_6x5_1[145] { + 0x0443, 0xEFAE, 0x2CC2, 0x2E21, 0x2C52, 0x7C33, 0x47CD, 0x25DF, + 0x3CA3, 0xFFBE, 0x2551, 0x24B3, 0x474F, 0x1513, 0x2691, 0x1603, + 0x1462, 0x1D32, 0x14B2, 0x5442, 0x2CD2, 0x35EF, 0x0CD1, 0x3D22, + 0x17BD, 0x0FDD, 0x0DFF, 0x2631, 0x177D, 0x0CF1, 0x1E81, 0x0E82, + 0x1DFE, 0x0F5E, 0x0701, 0x2CA2, 0x1D03, 0x0F4E, 0x1471, 0x0C51, + 0x1F6E, 0x2FAF, 0x0561, 0x0C72, 0x176D, 0x0FAD, 0x0DEE, 0x05CF, + 0x0E13, 0x0F5F, 0x0E12, 0x0C23, 0x1E02, 0x1D12, 0x0CB1, 0x0C32, + 0x0C93, 0x15DE, 0x0F9F, 0x0F3F, 0x0D41, 0x0C41, 0x0CC1, 0x0D31, + 0x0C22, 0x05FD, 0x057F, 0x0D01, 0x0461, 0x04E1, 0x0D7D, 0x05CE, + 0x0502, 0x0C31, 0x05ED, 0x05DD, 0x0511, 0x0F11, 0x0491, 0x0D6F, + 0x0521, 0x056E, 0x0C83, 0x0D23, 0x04A1, 0x0C02, 0x075D, 0x05BF, + 0x0C21, 0x079D, 0x0482, 0x05BD, 0x0DBE, 0x05CD, 0x054E, 0x057E, + 0x0DAE, 0x074D, 0x078D, 0x0542, 0x0492, 0x05AF, 0x0611, 0x0F3D, + 0x0601, 0x071F, 0x055E, 0x059E, 0x0571, 0x054F, 0x0412, 0x0453, + 0x058E, 0x0413, 0x0D3E, 0x077E, 0x072D, 0x052E, 0x059F, 0x055D, + 0x072F, 0x0403, 0x0411, 0x058F, 0x055F, 0x0692, 0x078E, 0x053F, + 0x0D2F, 0x078F, 0x070D, 0x071D, 0x051F, 0x072E, 0x079E, 0x070E, + 0x070F, 0x073E, 0x0622, 0x0683, 0x0702, 0x071E, 0x076F, 0x07BF, + 0x07CE +}; + +static const packed_percentile_table block_pcd_6x5 { + 6, 5, + { 165, 145 }, + { 388, 405 }, + { 0, 156 }, + { percentile_arr_6x5_0, percentile_arr_6x5_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (6 * 6) +static const uint16_t percentile_arr_6x6_0[206] { + 0x006F, 0xF908, 0xF104, 0xE918, 0xE963, 0xD114, 0xB0F3, 0xA07E, + 0x7972, 0x705F, 0x687F, 0x6162, 0x5953, 0x586E, 0x610C, 0x524D, + 0x5973, 0x9943, 0x98E3, 0x904F, 0x8341, 0x7AC1, 0x3A61, 0x70D3, + 0xA073, 0x6AE1, 0x30F2, 0x3313, 0x2B21, 0x9A2E, 0x4322, 0x225D, + 0x2331, 0x2271, 0x22D1, 0x1A2D, 0x221F, 0x22F1, 0x1971, 0x6952, + 0x1951, 0x187D, 0x18F1, 0x1902, 0x185E, 0x1B51, 0x105D, 0x1A3D, + 0x30E2, 0x10D2, 0x1961, 0x12A2, 0x6072, 0x3942, 0x386D, 0x33EE, + 0x104E, 0x4923, 0x101E, 0x2122, 0x1251, 0x1141, 0x182F, 0x3133, + 0x080E, 0x1262, 0x123E, 0x1B32, 0x102E, 0x1931, 0x10D1, 0x1912, + 0x0871, 0x12C2, 0x08C2, 0x1103, 0x0B03, 0x1062, 0x083D, 0x08E1, + 0x1132, 0x184D, 0x0863, 0x08C3, 0x303F, 0x083E, 0x10B3, 0x12A3, + 0x0BEF, 0x0B11, 0x1A42, 0x2233, 0x13FF, 0x080F, 0x0A41, 0x0AC3, + 0x0842, 0x1A63, 0x0BDF, 0x09FF, 0x12B3, 0x124E, 0x0B12, 0x0B42, + 0x0A2F, 0x1253, 0x0913, 0x1051, 0x0B01, 0x120F, 0x0B02, 0x08A2, + 0x0BBF, 0x00B1, 0x22B1, 0x01EE, 0x1B33, 0x0B23, 0x0283, 0x13FD, + 0x0AB2, 0x11FD, 0x09FE, 0x0A43, 0x08B2, 0x0A1D, 0x0A52, 0x023F, + 0x101F, 0x01CE, 0x0A31, 0x0BDD, 0x0293, 0x1822, 0x12A1, 0x03FE, + 0x121E, 0x0843, 0x0272, 0x0B6F, 0x0052, 0x0A0D, 0x0BED, 0x12D2, + 0x1B7F, 0x1053, 0x0032, 0x01DE, 0x08A3, 0x020E, 0x0883, 0x09EF, + 0x0892, 0x0A21, 0x03CD, 0x0B5F, 0x0213, 0x0A32, 0x016F, 0x1292, + 0x03DE, 0x017E, 0x0BAF, 0x0223, 0x1093, 0x0BCF, 0x037E, 0x01DF, + 0x09CF, 0x015F, 0x09AF, 0x0023, 0x01BF, 0x0222, 0x0282, 0x03CE, + 0x1013, 0x036E, 0x097F, 0x0033, 0x0A01, 0x0B6D, 0x03BE, 0x037D, + 0x0281, 0x0BAE, 0x0203, 0x032E, 0x034D, 0x034F, 0x0291, 0x0211, + 0x038E, 0x03BD, 0x039E, 0x0BAD, 0x033E, 0x034E, 0x039F, 0x0202, + 0x035D, 0x0212, 0x033F, 0x035E, 0x038F, 0x032F +}; + +static const uint16_t percentile_arr_6x6_1[164] { + 0x07AE, 0x8443, 0x7E21, 0x77CD, 0x6C62, 0x9433, 0x6452, 0x34C2, + 0x5DDF, 0xC7BE, 0x25EF, 0x24A3, 0x3CF1, 0xFDFF, 0x177D, 0x1F4F, + 0xC551, 0x5CB3, 0x1532, 0x1513, 0x143E, 0x245D, 0x14B2, 0x2472, + 0x14D2, 0x1FBD, 0x1631, 0x2DFE, 0x1691, 0x17DD, 0x2E03, 0x376E, + 0x2442, 0x0F6D, 0x3C71, 0x2CD1, 0x2522, 0x6C51, 0x260D, 0x17AF, + 0x0DEE, 0x1C1F, 0x2F01, 0x142E, 0x0CA2, 0x0FAD, 0x3D03, 0x275E, + 0x1681, 0x274E, 0x1682, 0x1C23, 0x273F, 0x0F5F, 0x05DE, 0x15FD, + 0x0DCF, 0x1E02, 0x04B1, 0x144D, 0x0E12, 0x0D12, 0x1CC1, 0x0E13, + 0x1C6D, 0x0C32, 0x043D, 0x0C61, 0x0F9F, 0x04E1, 0x0DCE, 0x0D41, + 0x1C93, 0x0C22, 0x061D, 0x0D7F, 0x0C41, 0x0561, 0x0531, 0x0D21, + 0x0711, 0x0C91, 0x0501, 0x0C1E, 0x040F, 0x15DD, 0x0431, 0x0C2F, + 0x057D, 0x0C2D, 0x0DBE, 0x040E, 0x0D02, 0x0D11, 0x054E, 0x040D, + 0x0D23, 0x0DBF, 0x04A1, 0x05ED, 0x0C1D, 0x05BD, 0x072D, 0x056E, + 0x0483, 0x0F3D, 0x0482, 0x078D, 0x0F5D, 0x0453, 0x0D9E, 0x0C4E, + 0x05CD, 0x079D, 0x0402, 0x05AE, 0x0F1F, 0x0542, 0x074D, 0x056F, + 0x0421, 0x0D4F, 0x0601, 0x0571, 0x0492, 0x059F, 0x053F, 0x05AF, + 0x0611, 0x055E, 0x0D8E, 0x053E, 0x055D, 0x047D, 0x0411, 0x052E, + 0x058F, 0x051F, 0x055F, 0x0D7E, 0x072F, 0x052F, 0x0412, 0x078F, + 0x0403, 0x077E, 0x070D, 0x070E, 0x078E, 0x0F1D, 0x072E, 0x0413, + 0x070F, 0x0692, 0x079E, 0x060E, 0x0622, 0x0683, 0x0702, 0x071E, + 0x073E, 0x076F, 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_6x6 { + 6, 6, + { 206, 164 }, + { 769, 644 }, + { 0, 256 }, + { percentile_arr_6x6_0, percentile_arr_6x6_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (8 * 5) +static const uint16_t percentile_arr_8x5_0[226] { + 0x0066, 0xF865, 0xE963, 0xA856, 0xA1F2, 0x9875, 0x91C3, 0x91E2, + 0x80F3, 0x8076, 0x61E3, 0x6153, 0x5172, 0x59D2, 0x51D3, 0x5047, + 0xA943, 0x49B3, 0x4846, 0x4962, 0xC037, 0x4173, 0x39F1, 0x7027, + 0xA2C1, 0x3AE1, 0x9341, 0x30D3, 0x5225, 0x2A61, 0x33C1, 0x28E3, + 0x53A1, 0x49C2, 0x2A06, 0x4055, 0x2006, 0x21D1, 0x2271, 0x4321, + 0x3873, 0x18F2, 0x2015, 0x1A15, 0x1857, 0x52D1, 0x3045, 0x4835, + 0x1952, 0x29E1, 0x3207, 0x1036, 0x1816, 0x2A16, 0x2971, 0x13B1, + 0x2A17, 0x2351, 0x1025, 0x1826, 0x30E2, 0x1262, 0x20F1, 0x1007, + 0x1072, 0x1151, 0x10D2, 0x1235, 0x1205, 0x1062, 0x4AF1, 0x1251, + 0x0B31, 0x1381, 0x13EE, 0x1B92, 0x13EF, 0x0942, 0x1AA2, 0x13FF, + 0x1161, 0x0B93, 0x19A2, 0x11B1, 0x08D1, 0x12C2, 0x0B13, 0x1B22, + 0x2123, 0x09A3, 0x2071, 0x1B7F, 0x1817, 0x0A42, 0x10C2, 0x1233, + 0x08C3, 0x0A41, 0x0B42, 0x09C1, 0x0933, 0x1AB3, 0x1382, 0x1BDF, + 0x2122, 0x0A53, 0x0AC3, 0x20E1, 0x0941, 0x0931, 0x0042, 0x0BA2, + 0x0AA3, 0x0992, 0x0863, 0x08B3, 0x11B2, 0x0902, 0x1283, 0x09FF, + 0x0B83, 0x0982, 0x0932, 0x0BFE, 0x0B32, 0x0BBF, 0x11FE, 0x036F, + 0x0851, 0x08B1, 0x18A2, 0x11EE, 0x0A52, 0x0BB2, 0x01FD, 0x0A43, + 0x1A63, 0x1193, 0x0B91, 0x0043, 0x1231, 0x0A26, 0x0AB1, 0x03FD, + 0x096F, 0x00B2, 0x0983, 0x0A72, 0x01CE, 0x0BDD, 0x0022, 0x0B11, + 0x1213, 0x0B6D, 0x017E, 0x1333, 0x0112, 0x0852, 0x02D2, 0x097F, + 0x01EF, 0x0AB2, 0x0293, 0x0853, 0x0BED, 0x0B12, 0x1303, 0x02A1, + 0x0892, 0x0032, 0x0883, 0x0B6E, 0x0292, 0x0A32, 0x037E, 0x0B23, + 0x0103, 0x0A21, 0x0B01, 0x0302, 0x0BCD, 0x00A3, 0x0BCF, 0x0BDE, + 0x0113, 0x01DE, 0x0B5F, 0x0013, 0x0BAF, 0x0223, 0x0222, 0x0A82, + 0x0833, 0x0023, 0x09CF, 0x037D, 0x01AF, 0x095F, 0x03CE, 0x09DF, + 0x01BF, 0x0893, 0x0203, 0x0201, 0x0B4D, 0x03BE, 0x032E, 0x03AE, + 0x0291, 0x0A02, 0x0211, 0x039F, 0x0281, 0x038E, 0x03AD, 0x033F, + 0x035D, 0x033E, 0x034E, 0x034F, 0x0212, 0x03BD, 0x032F, 0x035E, + 0x038F, 0x039E +}; + +static const uint16_t percentile_arr_8x5_1[167] { + 0x0621, 0xFCC2, 0x3443, 0xA433, 0x5532, 0x2551, 0x6CA3, 0x27AE, + 0x6452, 0x8E03, 0x3CB3, 0x4DA2, 0x6DDF, 0x37CD, 0x6F01, 0x1691, + 0x2E82, 0x27BE, 0x1513, 0x34D2, 0x1D22, 0x3E31, 0x2593, 0x2CB2, + 0x1C16, 0x374F, 0x0DD1, 0x2583, 0x6613, 0x0CD1, 0x0C35, 0x1462, + 0x3E81, 0x2612, 0x2C42, 0x3407, 0x14A2, 0x0E02, 0x1CF1, 0x0C06, + 0x17BD, 0x0F7D, 0x1D23, 0x35B1, 0x179F, 0x0D92, 0x0F5E, 0x1451, + 0x04B1, 0x1F6E, 0x0DEF, 0x0D31, 0x374E, 0x15C1, 0x0541, 0x2405, + 0x17AD, 0x0471, 0x1472, 0x0DFE, 0x0711, 0x0FDD, 0x0DFF, 0x0432, + 0x1D82, 0x0423, 0x0F6D, 0x07AF, 0x0F5F, 0x04C1, 0x1542, 0x0561, + 0x0DCF, 0x1D03, 0x1493, 0x0422, 0x0445, 0x0D12, 0x0C25, 0x0415, + 0x0DA1, 0x1591, 0x0DEE, 0x05DE, 0x0C31, 0x0491, 0x0441, 0x0D21, + 0x078D, 0x057D, 0x0C61, 0x0F3F, 0x0581, 0x0D6E, 0x0501, 0x0CA1, + 0x04E1, 0x0DFD, 0x057F, 0x0502, 0x0511, 0x0C82, 0x0483, 0x0C03, + 0x079D, 0x0402, 0x0DDD, 0x0611, 0x05AE, 0x0DCE, 0x056F, 0x0421, + 0x057E, 0x071F, 0x0DBF, 0x05BE, 0x0412, 0x059F, 0x054E, 0x077E, + 0x0C26, 0x05ED, 0x073D, 0x0601, 0x0492, 0x0453, 0x075D, 0x058E, + 0x0F2D, 0x05CD, 0x0571, 0x053E, 0x0692, 0x05BD, 0x054F, 0x055E, + 0x0411, 0x0F1D, 0x074D, 0x059E, 0x05AF, 0x070D, 0x053F, 0x058F, + 0x0413, 0x070F, 0x055D, 0x070E, 0x078F, 0x052E, 0x072F, 0x055F, + 0x078E, 0x0F2E, 0x052F, 0x051F, 0x0417, 0x071E, 0x0781, 0x0622, + 0x0683, 0x0702, 0x073E, 0x076F, 0x079E, 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_8x5 { + 8, 5, + { 226, 167 }, + { 763, 517 }, + { 0, 178 }, + { percentile_arr_8x5_0, percentile_arr_8x5_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (8 * 6) +static const uint16_t percentile_arr_8x6_0[273] { + 0x0154, 0xF944, 0xE066, 0xA128, 0x9963, 0x8118, 0x806F, 0x79F2, + 0x79E2, 0x7108, 0xD934, 0x6056, 0x69C3, 0x60F3, 0x5972, 0x59E3, + 0x5075, 0x91B3, 0xC9D2, 0x807E, 0x385F, 0x4153, 0x3943, 0x4162, + 0x3837, 0x3847, 0x7173, 0x31D3, 0x6948, 0x3046, 0x307F, 0x5827, + 0x3114, 0x32C1, 0x3076, 0x2A4D, 0x58E3, 0x306E, 0x2924, 0x2A61, + 0x29F1, 0x50D3, 0x704F, 0x210C, 0x2BA1, 0x2225, 0x2873, 0x4865, + 0x2206, 0x8341, 0x2006, 0x3B21, 0x18F2, 0x21C2, 0x1A1F, 0x23C1, + 0x3AE1, 0x1855, 0x19D1, 0x1A15, 0x3815, 0x1207, 0x1835, 0x2A2E, + 0x1A16, 0x1836, 0x2271, 0x2845, 0x1A2D, 0x11E1, 0x1816, 0x1171, + 0x2217, 0x1952, 0x12D1, 0x3904, 0x125D, 0x4BB1, 0x207D, 0x10E2, + 0x1026, 0x2025, 0x12F1, 0x28F1, 0x105D, 0x1235, 0x12A2, 0x1007, + 0x123D, 0x1A05, 0x1072, 0x1331, 0x101E, 0x0951, 0x10D2, 0x1057, + 0x1B92, 0x185E, 0x1251, 0x19A2, 0x186D, 0x0B81, 0x2BEE, 0x080E, + 0x1A33, 0x1942, 0x0B13, 0x0B51, 0x11A3, 0x0923, 0x2322, 0x09B1, + 0x184E, 0x1161, 0x18D1, 0x0933, 0x0B93, 0x4A62, 0x1017, 0x082F, + 0x0A42, 0x0B82, 0x0AA3, 0x0A41, 0x08C2, 0x08B3, 0x0A3E, 0x22B3, + 0x0871, 0x1BBF, 0x09C1, 0x0AC2, 0x09B2, 0x0BEF, 0x082E, 0x1062, + 0x0922, 0x08C3, 0x1063, 0x0A53, 0x0BDF, 0x080F, 0x0B42, 0x0A83, + 0x084D, 0x103F, 0x0931, 0x08E1, 0x0A0F, 0x1BA2, 0x09FF, 0x1332, + 0x03FF, 0x0941, 0x12C3, 0x0A63, 0x003D, 0x0842, 0x083E, 0x0B83, + 0x0BB2, 0x0A31, 0x0932, 0x1102, 0x0992, 0x0982, 0x1051, 0x08B1, + 0x0A2F, 0x121E, 0x02B1, 0x0A4E, 0x11EE, 0x00A2, 0x1022, 0x0043, + 0x0A52, 0x0A1D, 0x0226, 0x1193, 0x03DD, 0x08B2, 0x0BFD, 0x0A43, + 0x0A13, 0x0AB2, 0x01FD, 0x09FE, 0x020D, 0x081F, 0x0B33, 0x0053, + 0x0B91, 0x0293, 0x0B11, 0x0B7F, 0x0AA1, 0x0B03, 0x0A0E, 0x03FE, + 0x01CE, 0x0B6F, 0x0183, 0x0912, 0x023F, 0x0852, 0x0A21, 0x0323, + 0x03ED, 0x0A32, 0x13AF, 0x0272, 0x08A3, 0x0B12, 0x0083, 0x0832, + 0x13CD, 0x0223, 0x0A92, 0x0092, 0x0AD2, 0x0301, 0x0302, 0x0BDE, + 0x0A22, 0x01EF, 0x0B5F, 0x0103, 0x0BCF, 0x096F, 0x017E, 0x0113, + 0x01DE, 0x0823, 0x0282, 0x0B6E, 0x015F, 0x0813, 0x01AF, 0x01CF, + 0x0B7E, 0x0033, 0x01DF, 0x0BCE, 0x01BF, 0x036D, 0x0A03, 0x017F, + 0x03BE, 0x0201, 0x0893, 0x038E, 0x034D, 0x03AE, 0x0202, 0x039F, + 0x0291, 0x0A11, 0x032E, 0x033F, 0x034F, 0x0281, 0x037D, 0x03BD, + 0x0212, 0x033E, 0x035E, 0x034E, 0x035D, 0x03AD, 0x032F, 0x038F, + 0x039E +}; + +static const uint16_t percentile_arr_8x6_1[186] { + 0x0621, 0xFC33, 0x37AE, 0x1CC2, 0x2C43, 0xAD32, 0x34A3, 0x4551, + 0x6452, 0x5C62, 0x1FCD, 0x14F1, 0x4CB3, 0x24D2, 0x15DF, 0x0FBE, + 0x2603, 0x3DA2, 0x2E31, 0x25D1, 0x25EF, 0x0D22, 0x2E91, 0x1E82, + 0x0FBD, 0x1513, 0x0CB2, 0x0CD1, 0x0F4F, 0x1F7D, 0x1701, 0x0C16, + 0x2593, 0x2C42, 0x0C72, 0x14A2, 0x0F6E, 0x0C35, 0x0C71, 0x0D83, + 0x0C07, 0x1DFF, 0x043E, 0x1613, 0x07DD, 0x0FAD, 0x1451, 0x076D, + 0x0E81, 0x05FE, 0x0406, 0x0E0D, 0x045D, 0x2612, 0x0E02, 0x07AF, + 0x0DB1, 0x0F5E, 0x15C1, 0x0C23, 0x1523, 0x0C1F, 0x0D92, 0x04B1, + 0x0D31, 0x0432, 0x0D61, 0x0F4E, 0x0D41, 0x0DEE, 0x0D42, 0x04C1, + 0x0CE1, 0x079F, 0x0C2E, 0x0405, 0x0C22, 0x0461, 0x0E1D, 0x0582, + 0x073F, 0x0571, 0x0C4D, 0x0DFD, 0x05CE, 0x0C6D, 0x05DE, 0x0415, + 0x0C45, 0x075F, 0x0C41, 0x0D03, 0x05A1, 0x0711, 0x05CF, 0x0425, + 0x0C93, 0x0D21, 0x0591, 0x043D, 0x0D12, 0x0501, 0x040F, 0x0511, + 0x0431, 0x0C03, 0x04A1, 0x078D, 0x0581, 0x041E, 0x040D, 0x0C02, + 0x040E, 0x05DD, 0x057F, 0x079D, 0x042D, 0x0D9F, 0x0502, 0x056E, + 0x0412, 0x071F, 0x044E, 0x05BF, 0x0C1D, 0x0482, 0x05AE, 0x042F, + 0x057D, 0x0491, 0x054E, 0x047D, 0x0DBE, 0x0611, 0x0492, 0x0601, + 0x05BD, 0x05CD, 0x0426, 0x05ED, 0x072D, 0x073D, 0x0483, 0x0F5D, + 0x0421, 0x056F, 0x053F, 0x058E, 0x054F, 0x078F, 0x053E, 0x059E, + 0x057E, 0x051F, 0x055D, 0x0413, 0x070D, 0x05AF, 0x0411, 0x0453, + 0x0D5E, 0x077E, 0x052F, 0x070F, 0x074D, 0x0692, 0x070E, 0x072F, + 0x072E, 0x058F, 0x071D, 0x052E, 0x0417, 0x073E, 0x0781, 0x078E, + 0x055F, 0x060E, 0x0622, 0x0683, 0x0702, 0x071E, 0x076F, 0x079E, + 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_8x6 { + 8, 6, + { 273, 186 }, + { 880, 300 }, + { 0, 64 }, + { percentile_arr_8x6_0, percentile_arr_8x6_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (8 * 8) +static const uint16_t percentile_arr_8x8_0[347] { + 0x0334, 0xFD44, 0xDD14, 0x9154, 0x9B08, 0x906A, 0x8928, 0x8108, + 0xE866, 0xC918, 0x606F, 0xC0FE, 0x5963, 0x58EE, 0x6534, 0x505A, + 0x51E2, 0xA8CF, 0x5354, 0x5314, 0x5134, 0x5524, 0x48F3, 0x504B, + 0x487E, 0x5344, 0x49C3, 0x4972, 0x49F2, 0x4856, 0xD0EF, 0x81D2, + 0x78DE, 0x4261, 0x3AC1, 0x71E3, 0x6879, 0x390C, 0x3143, 0x31B3, + 0x385F, 0x3153, 0x306E, 0x3037, 0x30DF, 0x3162, 0x304F, 0x3075, + 0xB03B, 0x2847, 0x28E3, 0x2914, 0x507F, 0x28BF, 0x5173, 0x5073, + 0x20D3, 0x2A06, 0x2827, 0x2508, 0x2229, 0x29D3, 0x204A, 0x207A, + 0x2046, 0x4148, 0x20FD, 0x4225, 0x23A1, 0x3944, 0x2065, 0x1924, + 0x2324, 0x1806, 0x19F1, 0x2215, 0x1876, 0x22AD, 0x502B, 0x1B04, + 0x18F2, 0x3A4D, 0x3216, 0x3504, 0x18DD, 0x1B21, 0x10CE, 0x1869, + 0x1B41, 0x1855, 0x1207, 0x1AE1, 0x2845, 0x19D1, 0x2A0A, 0x1A2D, + 0x2A1A, 0x11C2, 0x1A0B, 0x1217, 0x2816, 0x121B, 0x1271, 0x2AD1, + 0x1035, 0x1015, 0x287D, 0x12F1, 0x43C1, 0x1171, 0x1A05, 0x08E2, + 0x11E1, 0x3251, 0x2049, 0x20F1, 0x12CD, 0x0A39, 0x1219, 0x1059, + 0x1104, 0x1036, 0x1872, 0x3007, 0x08ED, 0x205E, 0x1026, 0x0952, + 0x1392, 0x1019, 0x0951, 0x100A, 0x13EE, 0x08D2, 0x1242, 0x0ABD, + 0x22A2, 0x0BDF, 0x2B81, 0x0A35, 0x13B1, 0x0839, 0x13BF, 0x0A33, + 0x1B31, 0x205D, 0x1241, 0x183A, 0x2025, 0x0B93, 0x0A3D, 0x1017, + 0x1313, 0x1253, 0x082A, 0x204E, 0x09A2, 0x080B, 0x0A1F, 0x125D, + 0x0A2E, 0x081A, 0x08D1, 0x082F, 0x086D, 0x1B82, 0x0A09, 0x0B22, + 0x1062, 0x11A3, 0x2161, 0x0923, 0x129F, 0x1A62, 0x0871, 0x0942, + 0x081B, 0x1133, 0x18AE, 0x0A9E, 0x0863, 0x09FF, 0x18C2, 0x0B51, + 0x08BD, 0x0AA3, 0x09B1, 0x1AC2, 0x08B3, 0x0829, 0x0BEF, 0x0B83, + 0x0AAE, 0x0A8D, 0x1857, 0x185B, 0x08AF, 0x103F, 0x08C3, 0x09B2, + 0x0A4E, 0x11C1, 0x0A31, 0x0B42, 0x0A83, 0x0BFF, 0x13DD, 0x00CD, + 0x0AB3, 0x0842, 0x08BE, 0x0922, 0x1A8E, 0x08E1, 0x002E, 0x0BA2, + 0x0A8F, 0x2263, 0x0252, 0x0B32, 0x0AC3, 0x0941, 0x0A43, 0x083D, + 0x083E, 0x0A3E, 0x084D, 0x1131, 0x136F, 0x0AB1, 0x0193, 0x0BFD, + 0x0391, 0x0851, 0x13AF, 0x0843, 0x0213, 0x1226, 0x0932, 0x03B2, + 0x0902, 0x0BCD, 0x0221, 0x089E, 0x00B1, 0x0BDE, 0x03FE, 0x02A1, + 0x0982, 0x009F, 0x080E, 0x0B5F, 0x02BE, 0x0A32, 0x0A2A, 0x01EE, + 0x0053, 0x0AB2, 0x0192, 0x09FD, 0x0052, 0x0B03, 0x0293, 0x00A2, + 0x0B7F, 0x0BED, 0x0311, 0x08B2, 0x0A72, 0x088E, 0x0333, 0x0B12, + 0x0A23, 0x0822, 0x0083, 0x11CE, 0x021D, 0x08A3, 0x088F, 0x029D, + 0x0A22, 0x0A3F, 0x01FE, 0x020F, 0x0983, 0x02D2, 0x0292, 0x0B23, + 0x001E, 0x0BCF, 0x03CE, 0x09AF, 0x0B02, 0x0301, 0x022F, 0x137E, + 0x021E, 0x09EF, 0x016F, 0x0112, 0x097E, 0x080F, 0x020D, 0x0092, + 0x01DE, 0x09DF, 0x0032, 0x0033, 0x0A82, 0x03BE, 0x0B6E, 0x001F, + 0x020E, 0x0023, 0x09CF, 0x0113, 0x0103, 0x0013, 0x0BAE, 0x0203, + 0x0BAD, 0x01BF, 0x034F, 0x095F, 0x036D, 0x0202, 0x017F, 0x0093, + 0x0201, 0x034D, 0x0212, 0x035D, 0x03BD, 0x0B3F, 0x035E, 0x0211, + 0x0281, 0x0291, 0x032E, 0x037D, 0x034E, 0x038E, 0x039F, 0x032F, + 0x033E, 0x038F, 0x039E +}; + +static const uint16_t percentile_arr_8x8_1[208] { + 0x0621, 0x3443, 0x47CD, 0x97AE, 0xFC62, 0x14F1, 0x24C2, 0x25DF, + 0x3C33, 0x1C52, 0x9C72, 0x0FBE, 0x0C5D, 0x343E, 0x24A3, 0x1551, + 0x5D32, 0x1CD2, 0x15EF, 0x4E31, 0x04DD, 0x1FDD, 0x174F, 0x0DD1, + 0x3E0D, 0x15FF, 0x0DA2, 0x1E03, 0x17BD, 0x177D, 0x14B3, 0x0471, + 0x0CAE, 0x1C1F, 0x04D1, 0x0F6E, 0x0DFE, 0x1C42, 0x0C16, 0x0D22, + 0x0C9F, 0x2C2E, 0x0FAD, 0x0571, 0x147D, 0x0C07, 0x04B2, 0x0F6D, + 0x0F5E, 0x07AF, 0x146D, 0x0C51, 0x0593, 0x2583, 0x0C4E, 0x040B, + 0x0C35, 0x0513, 0x0E91, 0x0406, 0x073F, 0x144D, 0x0561, 0x048F, + 0x0F01, 0x0F4E, 0x0CA2, 0x075F, 0x1682, 0x04E1, 0x0C1A, 0x04BD, + 0x0542, 0x0D41, 0x0DEE, 0x04CD, 0x0DCF, 0x04B1, 0x0C15, 0x0C3D, + 0x0423, 0x0592, 0x0DDE, 0x0422, 0x0432, 0x05FD, 0x0DC1, 0x05B1, + 0x0DCE, 0x0612, 0x0C2F, 0x0445, 0x0602, 0x0531, 0x0439, 0x0E81, + 0x0582, 0x0C61, 0x061D, 0x049E, 0x0405, 0x0409, 0x0DBE, 0x079F, + 0x0D21, 0x04C1, 0x0C0A, 0x0E13, 0x04AD, 0x040E, 0x0581, 0x0419, + 0x05DD, 0x0D03, 0x049D, 0x0449, 0x0429, 0x048E, 0x0DA1, 0x0425, + 0x0512, 0x0501, 0x0431, 0x0523, 0x0441, 0x042D, 0x040F, 0x0D7D, + 0x0511, 0x0502, 0x05BF, 0x04A1, 0x0C03, 0x0402, 0x079D, 0x05AE, + 0x075D, 0x057F, 0x041D, 0x048D, 0x042A, 0x0453, 0x05AF, 0x078D, + 0x0C0D, 0x073D, 0x0491, 0x0591, 0x05BD, 0x072D, 0x057E, 0x051F, + 0x0482, 0x0492, 0x041E, 0x0412, 0x0D9F, 0x0421, 0x0493, 0x0711, + 0x056E, 0x059E, 0x054E, 0x0611, 0x05ED, 0x074D, 0x070F, 0x056F, + 0x052F, 0x053F, 0x071F, 0x054F, 0x05CD, 0x0483, 0x055E, 0x072F, + 0x0E01, 0x0426, 0x058F, 0x0413, 0x078F, 0x071D, 0x055F, 0x058E, + 0x0411, 0x053E, 0x071E, 0x055D, 0x077E, 0x052E, 0x0692, 0x0417, + 0x070D, 0x078E, 0x070E, 0x072E, 0x041B, 0x060E, 0x0622, 0x0683, + 0x068D, 0x0702, 0x073E, 0x076F, 0x0781, 0x079E, 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_8x8 { + 8, 8, + { 347, 208 }, + { 1144, 267 }, + { 0, 38 }, + { percentile_arr_8x8_0, percentile_arr_8x8_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (10 * 5) +static const uint16_t percentile_arr_10x5_0[274] { + 0x0165, 0xF975, 0xD866, 0xC056, 0xA946, 0x90C6, 0x90F5, 0x8963, + 0x80D6, 0x80E6, 0x60F3, 0x61C3, 0x59F2, 0xA927, 0x5075, 0x4847, + 0x5153, 0x4955, 0x49E2, 0x48B6, 0x41D2, 0x4943, 0x8305, 0x8172, + 0x4046, 0x4037, 0x40A7, 0x70B7, 0x7AC1, 0x31E3, 0x7027, 0x30E5, + 0x69D3, 0x99B3, 0x3315, 0x6115, 0x3136, 0x3076, 0x3173, 0x30D5, + 0x3106, 0x8962, 0x2916, 0x30C7, 0x5126, 0x30D3, 0x2956, 0x5117, + 0x2B41, 0x2AE1, 0x2A61, 0x29F1, 0x2306, 0x2145, 0x4A85, 0x2057, + 0x40E3, 0x4137, 0x3B21, 0x23C1, 0x2065, 0x1925, 0x51C2, 0x5225, + 0x4935, 0x1AD1, 0x23A1, 0x19D1, 0x1A71, 0x4055, 0x1873, 0x1A86, + 0x1295, 0x18F2, 0x28A6, 0x1952, 0x4AA5, 0x20B5, 0x10C5, 0x2AA2, + 0x11E1, 0x1107, 0x10D2, 0x2171, 0x1351, 0x3036, 0x1331, 0x1BEE, + 0x2035, 0x1045, 0x1313, 0x0A15, 0x1087, 0x1296, 0x13EF, 0x18E2, + 0x1151, 0x1086, 0x10F1, 0x08A5, 0x12C2, 0x1BFF, 0x1095, 0x1A62, + 0x1322, 0x0942, 0x1026, 0x1872, 0x1062, 0x0897, 0x1123, 0x08D1, + 0x1A06, 0x0806, 0x137F, 0x13B1, 0x13DF, 0x1A51, 0x09B1, 0x0A83, + 0x1015, 0x22F1, 0x0961, 0x0B81, 0x12B3, 0x0A35, 0x0AA3, 0x20B3, + 0x08C3, 0x2342, 0x0933, 0x0A33, 0x09A2, 0x10C2, 0x0896, 0x2205, + 0x0825, 0x20E1, 0x0922, 0x1242, 0x0B16, 0x0B32, 0x09A3, 0x0AC3, + 0x0BBF, 0x0B93, 0x0071, 0x0931, 0x0A41, 0x2392, 0x13FE, 0x09C1, + 0x0B07, 0x0016, 0x1182, 0x09B2, 0x0A26, 0x0132, 0x0941, 0x0A93, + 0x0992, 0x1063, 0x1217, 0x01FF, 0x11EE, 0x1216, 0x0B23, 0x0B82, + 0x0042, 0x1102, 0x0213, 0x0B6F, 0x09FE, 0x1207, 0x0807, 0x18B1, + 0x0253, 0x0AB1, 0x08A2, 0x13FD, 0x01FD, 0x1983, 0x0AB2, 0x0A31, + 0x016F, 0x0B11, 0x00B2, 0x0851, 0x0AD2, 0x0993, 0x0BDD, 0x12A1, + 0x017F, 0x0A97, 0x1022, 0x0383, 0x0843, 0x0A52, 0x03A2, 0x097E, + 0x0817, 0x03B2, 0x0A43, 0x09EF, 0x0A63, 0x0B33, 0x0B03, 0x0292, + 0x0272, 0x09CE, 0x0287, 0x136D, 0x0053, 0x0B12, 0x0083, 0x0892, + 0x0112, 0x1282, 0x03ED, 0x0852, 0x0301, 0x1391, 0x0232, 0x0B7E, + 0x0221, 0x08A3, 0x0BCD, 0x0BCF, 0x036E, 0x09DE, 0x0103, 0x03DE, + 0x0832, 0x0BAF, 0x0302, 0x13CE, 0x035F, 0x0093, 0x0A23, 0x01DF, + 0x0013, 0x0A22, 0x0023, 0x0113, 0x09AF, 0x01BF, 0x0033, 0x095F, + 0x0203, 0x0281, 0x09CF, 0x037D, 0x0201, 0x0B4D, 0x03AE, 0x03BE, + 0x0291, 0x035E, 0x038E, 0x0B9F, 0x03AD, 0x0202, 0x034F, 0x0211, + 0x035D, 0x0212, 0x032E, 0x039E, 0x033F, 0x034E, 0x03BD, 0x032F, + 0x033E, 0x038F +}; + +static const uint16_t percentile_arr_10x5_1[180] { + 0x0532, 0xFCA3, 0x3621, 0x6E82, 0x2CC2, 0x3D51, 0x3F01, 0x2691, + 0x17AE, 0x35A2, 0x74B3, 0x1603, 0x4433, 0x3C43, 0x6C35, 0x25D1, + 0x1D13, 0x15DF, 0x37CD, 0x0D93, 0x1D22, 0x0E81, 0x1452, 0x0CD2, + 0x37BE, 0x0CB2, 0x3407, 0x1523, 0x0C16, 0x0CB5, 0x0C96, 0x1486, + 0x2631, 0x1506, 0x0F4F, 0x1583, 0x0CD1, 0x2CA2, 0x2612, 0x1613, + 0x1602, 0x1F11, 0x179F, 0x17BD, 0x15B1, 0x0406, 0x1D41, 0x0CF1, + 0x0D31, 0x0442, 0x1C62, 0x0F6E, 0x077D, 0x0C51, 0x0445, 0x0D15, + 0x2592, 0x0CB1, 0x05EF, 0x0542, 0x17AF, 0x1425, 0x075E, 0x0FAD, + 0x0CC1, 0x0503, 0x0512, 0x15C1, 0x0C95, 0x0415, 0x0505, 0x0F4E, + 0x04A5, 0x0493, 0x0C32, 0x0F5F, 0x04E1, 0x0521, 0x0C85, 0x07DD, + 0x0582, 0x15FF, 0x05CF, 0x0405, 0x0D91, 0x05A1, 0x05FE, 0x0C23, + 0x0561, 0x0472, 0x0471, 0x0C22, 0x0DEE, 0x076D, 0x0502, 0x0426, + 0x0C61, 0x0D7D, 0x0525, 0x05DE, 0x0DCE, 0x079D, 0x0692, 0x0441, + 0x0C91, 0x05DD, 0x0511, 0x057F, 0x0611, 0x0DFD, 0x078D, 0x056E, + 0x0492, 0x04A1, 0x073F, 0x0C31, 0x05BE, 0x0483, 0x0571, 0x056F, + 0x0D9F, 0x0581, 0x0501, 0x057E, 0x05BF, 0x078F, 0x0516, 0x05ED, + 0x0402, 0x0F7E, 0x0482, 0x054E, 0x075D, 0x071F, 0x05CD, 0x0535, + 0x05AE, 0x0C11, 0x058F, 0x05AF, 0x0421, 0x0413, 0x0601, 0x054F, + 0x073D, 0x059E, 0x0487, 0x070F, 0x078E, 0x0781, 0x053E, 0x0403, + 0x072D, 0x055D, 0x05BD, 0x079E, 0x0D8E, 0x0412, 0x052E, 0x074D, + 0x053F, 0x051F, 0x070E, 0x055F, 0x072F, 0x052F, 0x070D, 0x055E, + 0x0417, 0x0453, 0x072E, 0x0622, 0x0683, 0x0702, 0x071D, 0x071E, + 0x073E, 0x076F, 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_10x5 { + 10, 5, + { 274, 180 }, + { 954, 324 }, + { 0, 79 }, + { percentile_arr_10x5_0, percentile_arr_10x5_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (10 * 6) +static const uint16_t percentile_arr_10x6_0[325] { + 0x01A4, 0xF954, 0xA066, 0x9975, 0x80F5, 0x7056, 0x6918, 0x6963, + 0x58C6, 0x5946, 0x5928, 0x5174, 0x586F, 0xA0E6, 0x5108, 0x48D6, + 0x49E2, 0x40F3, 0x9172, 0x41F2, 0xB875, 0x3927, 0x39C3, 0xA953, + 0x3934, 0x3305, 0x30B6, 0x6943, 0x31D2, 0x3876, 0x3037, 0x2955, + 0x30A7, 0x32C1, 0x29B3, 0x3027, 0x287E, 0x30B7, 0x29E3, 0x5846, + 0x2B15, 0x2847, 0x3162, 0x5173, 0x4936, 0x285F, 0x48D3, 0x2164, + 0x4906, 0x20E5, 0x2915, 0x2116, 0x407F, 0x20D5, 0x2A61, 0x4117, + 0x20E3, 0x2126, 0x4148, 0x206E, 0x39D3, 0x2145, 0x41B4, 0x1B06, + 0x2114, 0x2165, 0x5321, 0x5A85, 0x1A4D, 0x1A1F, 0x19F1, 0x3341, + 0x184F, 0x1956, 0x3125, 0x30C7, 0x28F2, 0x1937, 0x1AE1, 0x1073, + 0x1BA1, 0x1935, 0x110C, 0x1BC1, 0x3A25, 0x19C2, 0x1295, 0x122E, + 0x1944, 0x11D1, 0x1124, 0x1857, 0x22D1, 0x2286, 0x1A2D, 0x12A2, + 0x2107, 0x1055, 0x2065, 0x0A71, 0x2152, 0x10C5, 0x10D2, 0x1331, + 0x08B5, 0x1171, 0x2836, 0x10A6, 0x0904, 0x123D, 0x20F1, 0x12A5, + 0x10E2, 0x107D, 0x1AF1, 0x1313, 0x0951, 0x11E1, 0x1B22, 0x1B51, + 0x0835, 0x101E, 0x0A5D, 0x0A15, 0x3045, 0x0A96, 0x08A5, 0x1142, + 0x12A3, 0x1872, 0x085D, 0x09B1, 0x100E, 0x0887, 0x0886, 0x086D, + 0x0933, 0x12B3, 0x0897, 0x08B3, 0x0A33, 0x0923, 0x1095, 0x0BEE, + 0x2BB1, 0x085E, 0x1283, 0x0A51, 0x1026, 0x0A06, 0x12C2, 0x08D1, + 0x11A2, 0x13BF, 0x08C3, 0x10C2, 0x0A3E, 0x0BDF, 0x0B81, 0x13EF, + 0x0A35, 0x0B16, 0x082F, 0x2161, 0x1B32, 0x0806, 0x084E, 0x11A3, + 0x1015, 0x1122, 0x2931, 0x0342, 0x0825, 0x0A0F, 0x0896, 0x0A05, + 0x0241, 0x09C1, 0x083F, 0x0A42, 0x0071, 0x0B07, 0x082E, 0x0393, + 0x12B1, 0x0A62, 0x0226, 0x0A2F, 0x0B92, 0x0063, 0x0932, 0x0862, + 0x09FF, 0x0A31, 0x00E1, 0x12B2, 0x09B2, 0x0AC3, 0x0941, 0x0293, + 0x1323, 0x104D, 0x003E, 0x083D, 0x0992, 0x1382, 0x03FF, 0x0A13, + 0x1016, 0x0A53, 0x0182, 0x1007, 0x0AA1, 0x080F, 0x0A16, 0x0A1E, + 0x0042, 0x0902, 0x13DD, 0x0BB2, 0x0A63, 0x00A2, 0x08B1, 0x03FE, + 0x1207, 0x08B2, 0x0B83, 0x09EE, 0x0311, 0x0A87, 0x0BAF, 0x03A2, + 0x09FD, 0x0051, 0x0B33, 0x020D, 0x09CE, 0x0217, 0x021D, 0x0817, + 0x020E, 0x0A4E, 0x001F, 0x0BFD, 0x0297, 0x0983, 0x0A92, 0x0252, + 0x0243, 0x0B03, 0x0193, 0x036F, 0x0B12, 0x0043, 0x0822, 0x0A21, + 0x01FE, 0x0853, 0x037F, 0x023F, 0x0BED, 0x02D2, 0x0B91, 0x0232, + 0x0282, 0x0912, 0x08A3, 0x0852, 0x0223, 0x0BCD, 0x0083, 0x0301, + 0x0832, 0x01EF, 0x0892, 0x0302, 0x0A72, 0x03DE, 0x0893, 0x0BCF, + 0x09DE, 0x03CE, 0x035F, 0x0833, 0x0023, 0x0103, 0x017E, 0x0813, + 0x01CF, 0x01BF, 0x016F, 0x0A22, 0x037E, 0x0113, 0x01AF, 0x0B6E, + 0x03BE, 0x0201, 0x0A03, 0x01DF, 0x036D, 0x03AE, 0x015F, 0x0281, + 0x033E, 0x0A02, 0x038E, 0x017F, 0x0291, 0x034D, 0x03BD, 0x0B7D, + 0x03AD, 0x0211, 0x0212, 0x034F, 0x032E, 0x039F, 0x034E, 0x035D, + 0x035E, 0x033F, 0x039E, 0x032F, 0x038F +}; + +static const uint16_t percentile_arr_10x6_1[199] { + 0x0621, 0xBD32, 0x5CA3, 0x1FAE, 0x64C2, 0x1D51, 0x6C33, 0xFC43, + 0x5CB3, 0x25A2, 0x2E82, 0x35D1, 0x4F01, 0x3FBE, 0x3691, 0x2DDF, + 0x2E03, 0x3FCD, 0x14D2, 0x1CF1, 0x0C52, 0x3C35, 0x2D22, 0x1513, + 0x1462, 0x54B2, 0x0E31, 0x4E81, 0x1593, 0x1D23, 0x1CD1, 0x14B5, + 0x2FBD, 0x0C07, 0x1D06, 0x0DEF, 0x14A2, 0x1612, 0x1F4F, 0x0C16, + 0x1F7D, 0x0C96, 0x0486, 0x1F9F, 0x0D42, 0x4583, 0x0E02, 0x0472, + 0x0DB1, 0x1613, 0x0FAD, 0x0D41, 0x0F11, 0x0E0D, 0x1C42, 0x143E, + 0x076E, 0x04B1, 0x0FAF, 0x0D61, 0x0531, 0x0C71, 0x0DFF, 0x0DFE, + 0x0406, 0x0C45, 0x0451, 0x0D15, 0x05C1, 0x2CC1, 0x141F, 0x0CE1, + 0x0FDD, 0x0C22, 0x0582, 0x0D92, 0x0571, 0x0F6D, 0x0C93, 0x045D, + 0x0F5E, 0x044D, 0x0423, 0x0D05, 0x0425, 0x0C95, 0x04A5, 0x0DCE, + 0x075F, 0x0E1D, 0x0503, 0x042E, 0x0D91, 0x0512, 0x0DDE, 0x05A1, + 0x074E, 0x0C32, 0x0431, 0x0415, 0x0D21, 0x05EE, 0x040E, 0x0DDD, + 0x0485, 0x1525, 0x0491, 0x0C26, 0x046D, 0x0C05, 0x05CF, 0x05FD, + 0x0E92, 0x073F, 0x0C0D, 0x043D, 0x0502, 0x0C1E, 0x041D, 0x0461, + 0x04A1, 0x0511, 0x0581, 0x05BD, 0x0C41, 0x059F, 0x05BF, 0x040F, + 0x0C7D, 0x0402, 0x054E, 0x057D, 0x0403, 0x078D, 0x05AE, 0x042D, + 0x0483, 0x079D, 0x0D7F, 0x0482, 0x0611, 0x056E, 0x0516, 0x05BE, + 0x0535, 0x044E, 0x05AF, 0x0DED, 0x042F, 0x0492, 0x058E, 0x078F, + 0x0412, 0x057E, 0x053E, 0x0F1F, 0x073D, 0x0601, 0x0501, 0x075D, + 0x059E, 0x05CD, 0x053F, 0x054F, 0x055E, 0x055D, 0x0421, 0x074D, + 0x051F, 0x072F, 0x0781, 0x0411, 0x0D6F, 0x077E, 0x0487, 0x070E, + 0x070F, 0x072D, 0x058F, 0x078E, 0x079E, 0x052E, 0x0413, 0x072E, + 0x071D, 0x052F, 0x055F, 0x073E, 0x0417, 0x0453, 0x060E, 0x0622, + 0x0683, 0x0702, 0x070D, 0x071E, 0x076F, 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_10x6 { + 10, 6, + { 325, 199 }, + { 922, 381 }, + { 0, 78 }, + { percentile_arr_10x6_0, percentile_arr_10x6_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (10 * 8) +static const uint16_t percentile_arr_10x8_0[400] { + 0x0154, 0xAB34, 0xAD44, 0x8308, 0x7866, 0x7B64, 0x79A4, 0x7975, + 0x686A, 0x6908, 0xC514, 0x6174, 0x6128, 0x6118, 0x5B54, 0x5163, + 0xF856, 0x50F5, 0x986F, 0xDD34, 0x48FE, 0x4972, 0x48E6, 0x4146, + 0x48EE, 0x40F3, 0x4AC1, 0x38C6, 0x41E2, 0xBB05, 0x707E, 0x38D6, + 0x3927, 0x6B14, 0x384B, 0x3948, 0x3153, 0x385A, 0x3134, 0x6B15, + 0x39F2, 0x30CF, 0x3143, 0x91D2, 0x31C3, 0x60EF, 0x5973, 0x3076, + 0x28D3, 0x3261, 0x2875, 0x28DE, 0x290C, 0x51E3, 0x28A7, 0x20E3, + 0x2962, 0x2B06, 0x2917, 0x483B, 0x20B6, 0x2D24, 0x206E, 0x285F, + 0x20B7, 0x2936, 0x4047, 0x2037, 0x20DF, 0x28BF, 0x21B4, 0x21B3, + 0x1D08, 0x2027, 0x404F, 0x3846, 0x2116, 0x187F, 0x1879, 0x2285, + 0x1A29, 0x3915, 0x4873, 0x1955, 0x3114, 0x1B44, 0x2165, 0x107A, + 0x1956, 0x6137, 0x1106, 0x3145, 0x1B21, 0x19D3, 0x12AD, 0x1B41, + 0x1AD1, 0x1126, 0x18F2, 0x282B, 0x40E5, 0x20D5, 0x2A0A, 0x284A, + 0x1286, 0x1295, 0x121A, 0x2A0B, 0x321B, 0x122D, 0x10FD, 0x13A1, + 0x32A2, 0x12E1, 0x1164, 0x13C1, 0x124D, 0x1239, 0x4504, 0x10C7, + 0x22F1, 0x11F1, 0x0AC2, 0x2125, 0x1225, 0x0B04, 0x1107, 0x1069, + 0x1A19, 0x13BF, 0x2A96, 0x08D2, 0x1271, 0x0952, 0x2BDF, 0x0B31, + 0x1251, 0x2124, 0x0B13, 0x12BD, 0x1233, 0x13EE, 0x2144, 0x0B16, + 0x0A15, 0x18E2, 0x08DD, 0x1097, 0x0857, 0x0B24, 0x0AA5, 0x12A3, + 0x11C2, 0x11D1, 0x10CE, 0x0865, 0x123D, 0x08B3, 0x0B51, 0x1971, + 0x0A41, 0x0A06, 0x1039, 0x080A, 0x0B22, 0x0923, 0x0836, 0x08C3, + 0x0A1F, 0x1072, 0x080B, 0x0935, 0x0855, 0x18A6, 0x0A42, 0x1133, + 0x0A83, 0x0A09, 0x0ACD, 0x0A2E, 0x0887, 0x083A, 0x10C5, 0x085E, + 0x13B1, 0x087D, 0x0819, 0x0A9F, 0x0049, 0x08F1, 0x0BEF, 0x1161, + 0x0B42, 0x09E1, 0x0A05, 0x0904, 0x12AE, 0x029E, 0x0A31, 0x09FF, + 0x0951, 0x0859, 0x001A, 0x082F, 0x0B81, 0x08B5, 0x0A35, 0x082A, + 0x08ED, 0x1142, 0x1262, 0x0B32, 0x08A5, 0x12D2, 0x03DD, 0x0B07, + 0x18AE, 0x083F, 0x00AF, 0x0AB3, 0x086D, 0x0287, 0x0A93, 0x025D, + 0x0816, 0x13FF, 0x0A8D, 0x005D, 0x08D1, 0x0392, 0x0845, 0x0AC3, + 0x08C2, 0x01A3, 0x0AB1, 0x09A2, 0x005B, 0x0B93, 0x02B2, 0x1086, + 0x001B, 0x0863, 0x0216, 0x0AA1, 0x0896, 0x0A8F, 0x084E, 0x0A8E, + 0x0A53, 0x0026, 0x0A26, 0x0382, 0x0807, 0x0862, 0x0029, 0x0871, + 0x00BD, 0x0835, 0x024E, 0x0806, 0x0941, 0x0895, 0x03AF, 0x0A13, + 0x0932, 0x03ED, 0x0BFD, 0x0207, 0x0B83, 0x0993, 0x09B1, 0x03CD, + 0x0A3E, 0x03FE, 0x0A21, 0x0015, 0x0B11, 0x0A43, 0x00E1, 0x136F, + 0x00BE, 0x00A2, 0x0842, 0x0043, 0x0825, 0x082E, 0x0A2A, 0x03DE, + 0x0BA2, 0x0122, 0x0BCF, 0x004D, 0x0323, 0x09C1, 0x0292, 0x083E, + 0x0252, 0x0017, 0x0A72, 0x00CD, 0x0182, 0x0A63, 0x0131, 0x09B2, + 0x0303, 0x0902, 0x0053, 0x035F, 0x0A32, 0x003D, 0x0992, 0x0A2F, + 0x03B2, 0x0ABE, 0x009F, 0x0183, 0x0312, 0x08B1, 0x0B02, 0x0A17, + 0x0B7F, 0x0333, 0x0297, 0x0A23, 0x020F, 0x0282, 0x0851, 0x0822, + 0x03CE, 0x01EE, 0x000E, 0x08B2, 0x0083, 0x0A1D, 0x00A3, 0x0222, + 0x088F, 0x0112, 0x029D, 0x0092, 0x0A3F, 0x0391, 0x089E, 0x0301, + 0x01FD, 0x09BF, 0x01CE, 0x0852, 0x01FE, 0x0013, 0x0903, 0x088E, + 0x037E, 0x021E, 0x01EF, 0x095F, 0x016F, 0x09DE, 0x03BE, 0x020E, + 0x0113, 0x01DF, 0x080F, 0x020D, 0x0833, 0x03AE, 0x0032, 0x03BD, + 0x0823, 0x001E, 0x01AF, 0x0203, 0x034F, 0x0093, 0x0A81, 0x036E, + 0x0291, 0x038E, 0x0A01, 0x001F, 0x017F, 0x01CF, 0x017E, 0x0202, + 0x0BAD, 0x0211, 0x035D, 0x035E, 0x039F, 0x0212, 0x032E, 0x033F, + 0x034D, 0x034E, 0x036D, 0x032F, 0x033E, 0x037D, 0x038F, 0x039E +}; + +static const uint16_t percentile_arr_10x8_1[221] { + 0x0621, 0xDFAE, 0x2443, 0x54C2, 0x37CD, 0x1CF1, 0xFCA3, 0x14D2, + 0x2D32, 0x5551, 0x7DDF, 0x5C33, 0x15D1, 0x3462, 0x24B3, 0x7452, + 0x5FBE, 0x6472, 0x65A2, 0x1D06, 0x445D, 0x15EF, 0x0E31, 0x1D71, + 0x343E, 0x0D42, 0x0CDD, 0x1F01, 0x4691, 0x1435, 0x0E82, 0x0DFF, + 0x17DD, 0x0D22, 0x24B2, 0x1603, 0x04B5, 0x24AE, 0x060D, 0x2D13, + 0x0C7D, 0x0496, 0x17BD, 0x1F4F, 0x1F7D, 0x1486, 0x0593, 0x1C16, + 0x0C07, 0x15FE, 0x041F, 0x14D1, 0x0C9F, 0x0E81, 0x0D15, 0x27AF, + 0x0C2E, 0x0D23, 0x176E, 0x0FAD, 0x1C06, 0x1561, 0x0DB1, 0x040B, + 0x1C4E, 0x0D83, 0x1711, 0x0C42, 0x0C71, 0x1C1A, 0x0D25, 0x04A2, + 0x0C45, 0x076D, 0x0F9F, 0x075F, 0x0E12, 0x046D, 0x048F, 0x1D92, + 0x0602, 0x0C39, 0x174E, 0x0C51, 0x0CA1, 0x075E, 0x05C1, 0x14BD, + 0x0D31, 0x0423, 0x0F3F, 0x0495, 0x0C93, 0x049E, 0x0D05, 0x04E1, + 0x0DEE, 0x0415, 0x04B1, 0x0503, 0x0CCD, 0x042F, 0x0DCF, 0x044D, + 0x0541, 0x1582, 0x05DE, 0x0D01, 0x0487, 0x040A, 0x0516, 0x0CA5, + 0x05FD, 0x05BF, 0x057D, 0x0DA1, 0x0426, 0x040F, 0x071F, 0x0613, + 0x0432, 0x0D12, 0x043D, 0x0425, 0x0461, 0x061D, 0x0D21, 0x0591, + 0x079D, 0x048D, 0x0429, 0x0C49, 0x04C1, 0x042A, 0x040E, 0x0485, + 0x0511, 0x0405, 0x0502, 0x0441, 0x0C19, 0x0692, 0x0535, 0x058F, + 0x041D, 0x059F, 0x072D, 0x04AD, 0x049D, 0x05CE, 0x048E, 0x0C31, + 0x057F, 0x078D, 0x0409, 0x041E, 0x05AE, 0x0611, 0x058E, 0x05DD, + 0x05CD, 0x056E, 0x0483, 0x073D, 0x054E, 0x0D9E, 0x0402, 0x0491, + 0x040D, 0x056F, 0x042D, 0x0581, 0x0421, 0x057E, 0x0781, 0x053E, + 0x0482, 0x078F, 0x0413, 0x052E, 0x0601, 0x0422, 0x0492, 0x055E, + 0x05BE, 0x0F9E, 0x072F, 0x074D, 0x0412, 0x070F, 0x075D, 0x05BD, + 0x051F, 0x071D, 0x073E, 0x077E, 0x0403, 0x0411, 0x078E, 0x055D, + 0x05AF, 0x05ED, 0x052F, 0x053F, 0x070D, 0x070E, 0x072E, 0x054F, + 0x0417, 0x041B, 0x0453, 0x055F, 0x060E, 0x0622, 0x0683, 0x068D, + 0x0702, 0x071E, 0x076F, 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_10x8 = +{ + 10, 8, + { 400, 221 }, + { 1119, 376 }, + { 0, 52 }, + { percentile_arr_10x8_0, percentile_arr_10x8_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (10 * 10) +static const uint16_t percentile_arr_10x10_0[453] { + 0x0334, 0x9514, 0x8954, 0x806A, 0x6F14, 0x6724, 0x6108, 0x6364, + 0x5175, 0x5D44, 0x5866, 0x5118, 0x5308, 0xA179, 0x5128, 0xF534, + 0x49A4, 0x5354, 0x9174, 0x486F, 0x48EA, 0x40F3, 0x4963, 0x414A, + 0xF8F9, 0x3984, 0x4172, 0x387E, 0x405A, 0x38DA, 0x38F5, 0x9B05, + 0x30EE, 0x32C1, 0x3261, 0x3D08, 0x31E2, 0x3056, 0x292B, 0x3146, + 0x3127, 0x3315, 0x58CA, 0x58E6, 0x290C, 0x3314, 0x8134, 0x28E3, + 0x28FE, 0x2948, 0x28C6, 0x78DE, 0x28BB, 0x68D6, 0x286E, 0x2173, + 0x2962, 0x21D2, 0x205F, 0x49F2, 0x2917, 0x2306, 0x207F, 0x404F, + 0x2153, 0x2943, 0x20CF, 0x21C3, 0x2073, 0x20D3, 0x2136, 0x183B, + 0x430A, 0x40A7, 0x18B6, 0x2079, 0x2309, 0x2075, 0x184B, 0x20EF, + 0x187A, 0x7837, 0x1B19, 0x20AB, 0x18BA, 0x20B7, 0x1994, 0x19E3, + 0x21B4, 0x49B3, 0x38BF, 0x193B, 0x1876, 0x182B, 0x30F2, 0x193A, + 0x1827, 0x1965, 0x1914, 0x184A, 0x4047, 0x1916, 0x1285, 0x1937, + 0x122D, 0x1915, 0x1321, 0x1955, 0x1046, 0x191B, 0x2106, 0x2919, + 0x1344, 0x1524, 0x12E1, 0x3926, 0x10E5, 0x2295, 0x1159, 0x1145, + 0x10DF, 0x124D, 0x1271, 0x092A, 0x2169, 0x1704, 0x22A2, 0x1164, + 0x13EE, 0x12F1, 0x0AD1, 0x128A, 0x110A, 0x11D3, 0x1286, 0x115A, + 0x2BA1, 0x0BBF, 0x3956, 0x2A89, 0x12AD, 0x10E9, 0x0B41, 0x1A29, + 0x2225, 0x08FD, 0x1107, 0x08D5, 0x191A, 0x1125, 0x1A96, 0x0B04, + 0x18D9, 0x2B16, 0x11F1, 0x0A33, 0x0924, 0x131A, 0x1149, 0x1324, + 0x0BEF, 0x0A99, 0x08CB, 0x123D, 0x1331, 0x0BDF, 0x0872, 0x22A3, + 0x0AC2, 0x1144, 0x0D04, 0x08D2, 0x08CE, 0x0AA9, 0x0A9A, 0x0B13, + 0x1251, 0x0865, 0x1069, 0x0897, 0x1215, 0x18B3, 0x1A62, 0x08C7, + 0x185E, 0x10E2, 0x0AA5, 0x21FF, 0x090B, 0x0952, 0x09E1, 0x0A42, + 0x08F1, 0x0A06, 0x0B22, 0x087D, 0x1139, 0x021F, 0x122E, 0x082F, + 0x09C2, 0x0887, 0x0A0A, 0x03C1, 0x0929, 0x0A5D, 0x0A83, 0x0BFF, + 0x0935, 0x085B, 0x0104, 0x08DD, 0x0923, 0x083F, 0x0241, 0x09D1, + 0x0A39, 0x0863, 0x0A8B, 0x08A6, 0x008B, 0x1133, 0x13B1, 0x089B, + 0x0AB3, 0x0036, 0x0BDD, 0x08ED, 0x0857, 0x0971, 0x0219, 0x1235, + 0x0AB1, 0x0ACD, 0x036F, 0x0A31, 0x08AA, 0x003A, 0x08C3, 0x0A05, + 0x02BD, 0x0B92, 0x0B07, 0x12B2, 0x08C5, 0x0B51, 0x0381, 0x0A8D, + 0x01A3, 0x0896, 0x0855, 0x0BFD, 0x005D, 0x0BFE, 0x023E, 0x08AF, + 0x00B9, 0x0A93, 0x00B5, 0x0862, 0x0A0B, 0x0A09, 0x0A72, 0x0332, + 0x0AA1, 0x08C9, 0x024E, 0x1382, 0x0951, 0x00A5, 0x0A2A, 0x0059, + 0x0A9E, 0x0B42, 0x004E, 0x0942, 0x03ED, 0x09B2, 0x02D2, 0x0849, + 0x0035, 0x0216, 0x0961, 0x0BAF, 0x00AE, 0x0826, 0x0287, 0x0A1A, + 0x0393, 0x0221, 0x09A2, 0x086D, 0x0226, 0x0871, 0x0039, 0x082A, + 0x08C2, 0x08E1, 0x0845, 0x0207, 0x0B23, 0x0015, 0x00D1, 0x0B83, + 0x037F, 0x0252, 0x08A9, 0x0099, 0x0A13, 0x0053, 0x0807, 0x03CD, + 0x0BDE, 0x0016, 0x089A, 0x0232, 0x035F, 0x0A8E, 0x0AC3, 0x022F, + 0x0263, 0x0829, 0x004D, 0x0132, 0x0806, 0x0311, 0x01B1, 0x0941, + 0x0086, 0x000B, 0x1122, 0x0025, 0x0842, 0x00BD, 0x0BCF, 0x03A2, + 0x0043, 0x0B03, 0x0895, 0x0A8F, 0x008A, 0x09EF, 0x0253, 0x0A1B, + 0x0182, 0x0243, 0x0A92, 0x00CD, 0x083E, 0x030B, 0x0223, 0x081A, + 0x0A9F, 0x0193, 0x00BE, 0x0017, 0x0931, 0x0391, 0x037E, 0x09C1, + 0x0312, 0x0333, 0x03B2, 0x083D, 0x08B1, 0x00B2, 0x002E, 0x021D, + 0x0A9D, 0x0192, 0x02AE, 0x0102, 0x0022, 0x081B, 0x0222, 0x009E, + 0x021E, 0x000A, 0x089F, 0x0217, 0x0BCE, 0x0052, 0x020F, 0x0A97, + 0x0282, 0x008E, 0x0A3F, 0x01FD, 0x00A3, 0x0019, 0x08A2, 0x0301, + 0x036E, 0x01FE, 0x03BE, 0x0ABE, 0x01CE, 0x0302, 0x029B, 0x0051, + 0x0883, 0x008F, 0x0BAE, 0x01DF, 0x0183, 0x0912, 0x000E, 0x020D, + 0x01EE, 0x0B4F, 0x0033, 0x0103, 0x020E, 0x0832, 0x01AF, 0x0913, + 0x01DE, 0x0203, 0x001E, 0x0092, 0x0093, 0x000F, 0x015F, 0x0291, + 0x0281, 0x0813, 0x001F, 0x01CF, 0x033F, 0x0023, 0x01BF, 0x0202, + 0x016F, 0x017E, 0x03AD, 0x0201, 0x034E, 0x0BBD, 0x036D, 0x017F, + 0x0211, 0x038E, 0x0212, 0x032E, 0x034D, 0x035E, 0x037D, 0x039E, + 0x032F, 0x033E, 0x035D, 0x038F, 0x039F +}; + +static const uint16_t percentile_arr_10x10_1[234] { + 0x07CD, 0x6E21, 0x24F1, 0x8443, 0xD7AE, 0x24C2, 0x1C62, 0xCCA3, + 0x1C33, 0xFDEF, 0x2532, 0x55DF, 0x1472, 0x6C3E, 0x14D2, 0x34DD, + 0x1452, 0x745D, 0x4D51, 0x8DD1, 0x247D, 0x75FF, 0x0CB3, 0x17BE, + 0x6CAE, 0x17DD, 0x1571, 0x3D06, 0x4E31, 0x0DA2, 0x67BD, 0x160D, + 0x2C4E, 0x0D22, 0x176E, 0x3CB2, 0x142E, 0x4DFE, 0x0F4F, 0x1435, + 0x0F01, 0x0D42, 0x0F7D, 0x0CB5, 0x1E03, 0x149F, 0x1C96, 0x141F, + 0x14B9, 0x0FAF, 0x0439, 0x0E91, 0x2682, 0x1D13, 0x1FAD, 0x0407, + 0x3471, 0x0C86, 0x0F6D, 0x0D15, 0x0D61, 0x040B, 0x0C6D, 0x0C16, + 0x0C9A, 0x0D0A, 0x0593, 0x0CD1, 0x248F, 0x0C2F, 0x3C42, 0x1523, + 0x0445, 0x0E81, 0x0CA2, 0x1525, 0x0406, 0x1C8A, 0x0C1A, 0x04BD, + 0x0F5E, 0x0F3F, 0x1F4E, 0x0E1D, 0x0423, 0x0DCF, 0x044D, 0x0D92, + 0x0583, 0x0DB1, 0x1449, 0x15EE, 0x0F5F, 0x079F, 0x0D19, 0x0409, + 0x04CD, 0x05FD, 0x143D, 0x0612, 0x0D03, 0x0D82, 0x04B1, 0x0C95, + 0x0C2A, 0x049E, 0x05AF, 0x0D31, 0x05BE, 0x04E1, 0x0D05, 0x0516, + 0x0711, 0x05C1, 0x0509, 0x0D41, 0x0493, 0x048E, 0x0602, 0x05BF, + 0x0CA5, 0x0529, 0x0535, 0x0D12, 0x0539, 0x0451, 0x0C29, 0x071F, + 0x040A, 0x0F3D, 0x0432, 0x059F, 0x0425, 0x0C99, 0x05DE, 0x05CE, + 0x0C0F, 0x0489, 0x051A, 0x0501, 0x0415, 0x057F, 0x0431, 0x0E13, + 0x040D, 0x041D, 0x075D, 0x0C53, 0x0502, 0x04C1, 0x049D, 0x0426, + 0x040E, 0x05A1, 0x055F, 0x0781, 0x0591, 0x04A9, 0x048B, 0x0D8E, + 0x052E, 0x0412, 0x0521, 0x0405, 0x04AD, 0x074D, 0x0611, 0x077E, + 0x078F, 0x078D, 0x048D, 0x041E, 0x0487, 0x0461, 0x0C85, 0x05ED, + 0x0402, 0x0483, 0x0419, 0x0511, 0x0491, 0x0482, 0x059E, 0x068D, + 0x055D, 0x072E, 0x05DD, 0x054E, 0x0441, 0x0422, 0x052F, 0x057D, + 0x072D, 0x079D, 0x0CA1, 0x072F, 0x079E, 0x0581, 0x042D, 0x055E, + 0x0601, 0x0413, 0x0692, 0x0403, 0x051F, 0x053F, 0x054F, 0x05CD, + 0x070F, 0x071D, 0x05AE, 0x05BD, 0x0492, 0x056E, 0x0411, 0x0417, + 0x041B, 0x0421, 0x053E, 0x056F, 0x057E, 0x058F, 0x060E, 0x0622, + 0x0683, 0x0702, 0x070D, 0x070E, 0x071E, 0x073E, 0x076F, 0x078E, + 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_10x10 { + 10, 10, + { 453, 234 }, + { 1095, 472 }, + { 0, 70 }, + { percentile_arr_10x10_0, percentile_arr_10x10_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (12 * 10) +static const uint16_t percentile_arr_12x10_0[491] { + 0x0334, 0x9954, 0x8514, 0x7128, 0x6364, 0xC174, 0x5D34, 0x5866, + 0x5975, 0x5354, 0xAF14, 0x506A, 0x5108, 0x5724, 0x5308, 0x4544, + 0x4918, 0x4064, 0x49E2, 0x4179, 0x8163, 0x4054, 0xF81C, 0x394A, + 0x38F3, 0x4172, 0x38F5, 0xA06F, 0x68EA, 0x69F2, 0x3134, 0x31A4, + 0x305A, 0x68DA, 0x3056, 0x3146, 0x31F5, 0x3148, 0x5A61, 0x32C1, + 0x31D2, 0x307E, 0x29E3, 0x30E6, 0x59C3, 0x2984, 0x29B6, 0x28F9, + 0x5204, 0x28EE, 0x50CA, 0x2997, 0x48C6, 0x4838, 0x2953, 0x200C, + 0x2943, 0x2173, 0x2D08, 0x4162, 0x29B4, 0x2314, 0x21B3, 0x212B, + 0x210C, 0x48E3, 0x60DE, 0x205F, 0x20FE, 0x2028, 0x21A6, 0x404F, + 0x20D6, 0x2214, 0x2127, 0x1873, 0x40CF, 0x206E, 0x1B09, 0x21C6, + 0x2075, 0x19D5, 0x2305, 0x18D3, 0x2076, 0x1804, 0x230A, 0x304B, + 0x20BB, 0x18B6, 0x1936, 0x1B19, 0x3037, 0x187F, 0x18A7, 0x1B85, + 0x30BA, 0x183B, 0x1027, 0x18EF, 0x1B21, 0x1879, 0x10AB, 0x1917, + 0x1114, 0x18BF, 0x1074, 0x1994, 0x2847, 0x111B, 0x28F2, 0x11E5, + 0x19A7, 0x113A, 0x1046, 0x28B7, 0x207A, 0x182B, 0x1155, 0x104A, + 0x1344, 0x293B, 0x11D3, 0x2014, 0x1044, 0x1018, 0x13A1, 0x1315, + 0x2524, 0x20DF, 0x10E5, 0x1126, 0x12A2, 0x1824, 0x2271, 0x11F1, + 0x2964, 0x12D1, 0x115A, 0x092A, 0x2341, 0x1A2D, 0x12E1, 0x090A, + 0x13BF, 0x0A4D, 0x2119, 0x0BC1, 0x1233, 0x1A8A, 0x2008, 0x1159, + 0x1A89, 0x08D5, 0x1156, 0x0834, 0x13EE, 0x1169, 0x1187, 0x1AA3, + 0x1229, 0x1331, 0x0A85, 0x0937, 0x1704, 0x08FD, 0x2124, 0x0B13, + 0x1251, 0x0AAD, 0x082C, 0x091A, 0x18D9, 0x0A99, 0x1848, 0x18E9, + 0x0B95, 0x1144, 0x0AF1, 0x1A25, 0x131A, 0x09C5, 0x0986, 0x1BDF, + 0x0B24, 0x0965, 0x1262, 0x0949, 0x0872, 0x09C2, 0x12C2, 0x0916, + 0x085E, 0x0B06, 0x08CB, 0x08C7, 0x1242, 0x1BEF, 0x0A9A, 0x1152, + 0x08B3, 0x0AA9, 0x090B, 0x08D2, 0x1B22, 0x0B04, 0x0865, 0x0A15, + 0x1286, 0x0A83, 0x0A95, 0x09D1, 0x0A06, 0x0196, 0x1139, 0x0A3D, + 0x0933, 0x13B1, 0x0123, 0x0D04, 0x08E2, 0x122E, 0x08A6, 0x00CE, + 0x0A31, 0x1241, 0x0B51, 0x1057, 0x1171, 0x007D, 0x1145, 0x0A0A, + 0x0129, 0x09FF, 0x089B, 0x085B, 0x0063, 0x0AB1, 0x0A1F, 0x0A5D, + 0x0AA5, 0x0036, 0x0904, 0x0B86, 0x0A8B, 0x0897, 0x11E1, 0x0332, + 0x083F, 0x0A19, 0x02B3, 0x0859, 0x08C3, 0x0855, 0x11B5, 0x01A5, + 0x0AB2, 0x0392, 0x10DD, 0x09A3, 0x00ED, 0x0907, 0x1161, 0x002F, + 0x0887, 0x0216, 0x0ABD, 0x0B81, 0x0A93, 0x0A21, 0x003A, 0x0ACD, + 0x0AA1, 0x0A35, 0x0272, 0x0BDD, 0x03FE, 0x0BAF, 0x0869, 0x0213, + 0x088B, 0x020B, 0x00B5, 0x1035, 0x08F1, 0x0151, 0x0A4E, 0x0239, + 0x0BA2, 0x00AA, 0x0896, 0x0382, 0x0A08, 0x0A05, 0x0A09, 0x0142, + 0x086D, 0x004E, 0x0B23, 0x0106, 0x0807, 0x036F, 0x0995, 0x03FD, + 0x08AF, 0x08C5, 0x0062, 0x0053, 0x0B42, 0x0826, 0x021A, 0x01A2, + 0x09B1, 0x00C9, 0x09B2, 0x0045, 0x0207, 0x08B9, 0x00A5, 0x0AD2, + 0x0095, 0x003E, 0x0A32, 0x0383, 0x0849, 0x0135, 0x029E, 0x0A26, + 0x023E, 0x0BFF, 0x0A52, 0x0311, 0x001B, 0x0915, 0x0A8D, 0x0223, + 0x022A, 0x0BED, 0x0086, 0x0A96, 0x0222, 0x035F, 0x0A43, 0x085D, + 0x0303, 0x0393, 0x0A63, 0x082A, 0x037F, 0x0932, 0x0043, 0x0292, + 0x03CD, 0x0BDE, 0x009F, 0x0125, 0x08A9, 0x0253, 0x0015, 0x0192, + 0x0A17, 0x08C2, 0x0316, 0x00D1, 0x0282, 0x0871, 0x0312, 0x0122, + 0x0A9F, 0x02AE, 0x0006, 0x0A8E, 0x08E1, 0x0016, 0x0B0B, 0x00AE, + 0x0025, 0x0193, 0x0AC3, 0x0017, 0x0307, 0x00BD, 0x08BE, 0x0039, + 0x0BB2, 0x021B, 0x01FD, 0x084D, 0x03CE, 0x00A3, 0x0302, 0x0BCF, + 0x0033, 0x0391, 0x028F, 0x0852, 0x0287, 0x008A, 0x0333, 0x080B, + 0x0131, 0x01C1, 0x037E, 0x0A0F, 0x00B1, 0x002E, 0x0099, 0x0902, + 0x009A, 0x003D, 0x0982, 0x0301, 0x00CD, 0x0941, 0x0042, 0x0183, + 0x029D, 0x08A2, 0x021D, 0x001A, 0x0A97, 0x01EF, 0x01CE, 0x0051, + 0x0BAE, 0x022F, 0x03BE, 0x021E, 0x000A, 0x09DF, 0x0029, 0x020D, + 0x02BE, 0x029B, 0x09EE, 0x00B2, 0x0912, 0x036E, 0x009E, 0x0022, + 0x0019, 0x0892, 0x0032, 0x01FE, 0x0083, 0x023F, 0x0B96, 0x000E, + 0x008F, 0x0113, 0x0103, 0x001E, 0x0A0E, 0x0013, 0x008E, 0x0281, + 0x09AF, 0x017E, 0x0203, 0x016F, 0x0291, 0x0023, 0x0093, 0x03BD, + 0x001F, 0x01CF, 0x01DE, 0x0201, 0x01BF, 0x0B4F, 0x000F, 0x0202, + 0x037D, 0x038E, 0x0211, 0x0212, 0x034E, 0x039F, 0x03AD, 0x015F, + 0x017F, 0x032E, 0x033F, 0x034D, 0x035E, 0x036D, 0x032F, 0x033E, + 0x035D, 0x038F, 0x039E +}; + +static const uint16_t percentile_arr_12x10_1[240] { + 0x0621, 0xA443, 0xFCC2, 0x3CA3, 0x1D32, 0x14F1, 0x7462, 0x1433, + 0x27CD, 0x2571, 0x57AE, 0x5DD1, 0x64B3, 0x44D2, 0x2C72, 0x25A2, + 0x1E31, 0x55DF, 0x4C52, 0x1DEF, 0x0D51, 0x3C5D, 0x3C3E, 0x74DD, + 0x347D, 0x27BE, 0x5CB5, 0x17DD, 0x2C14, 0x0CAE, 0x24B2, 0x15FF, + 0x2701, 0x0D42, 0x1FBD, 0x0C35, 0x1603, 0x060D, 0x1D93, 0x0C96, + 0x1C07, 0x1522, 0x0D06, 0x0F4F, 0x0C9F, 0x1F6E, 0x0D86, 0x0C2E, + 0x1DFE, 0x0682, 0x1E91, 0x0F7D, 0x0C86, 0x040B, 0x1513, 0x044E, + 0x14D1, 0x0C39, 0x14B9, 0x1C71, 0x05B1, 0x0C1F, 0x0681, 0x1445, + 0x0C16, 0x0D95, 0x1583, 0x0D61, 0x0FAD, 0x1442, 0x048F, 0x0D0A, + 0x049A, 0x0F6D, 0x146D, 0x0C2F, 0x0D25, 0x0406, 0x0C1A, 0x0D23, + 0x0612, 0x0FAF, 0x0F11, 0x0592, 0x0515, 0x14E1, 0x0602, 0x048A, + 0x0E1D, 0x0CBD, 0x0F9F, 0x0423, 0x075E, 0x174E, 0x0426, 0x0404, + 0x0C22, 0x0CA2, 0x0DEE, 0x0CA5, 0x0F3F, 0x05C1, 0x0CCD, 0x0503, + 0x044D, 0x0D16, 0x0449, 0x0D82, 0x0613, 0x0585, 0x0519, 0x0C95, + 0x075F, 0x0D35, 0x04B1, 0x0509, 0x0531, 0x0DA1, 0x049E, 0x040A, + 0x05CF, 0x0D41, 0x0415, 0x0692, 0x05FD, 0x0C25, 0x04A1, 0x0529, + 0x0591, 0x0C93, 0x057F, 0x04C1, 0x0512, 0x051A, 0x078D, 0x0451, + 0x0C0F, 0x0487, 0x0611, 0x0432, 0x042A, 0x05AF, 0x0461, 0x072D, + 0x0409, 0x0405, 0x0D39, 0x05DE, 0x048E, 0x0499, 0x0483, 0x04A9, + 0x0491, 0x042D, 0x049D, 0x0429, 0x040E, 0x05AE, 0x0521, 0x043D, + 0x0581, 0x05DD, 0x0492, 0x0CAD, 0x041E, 0x058F, 0x071F, 0x072F, + 0x0419, 0x073D, 0x057D, 0x0511, 0x05CE, 0x041D, 0x0485, 0x056E, + 0x0412, 0x0431, 0x05BF, 0x0441, 0x054E, 0x0489, 0x0421, 0x0502, + 0x0408, 0x040D, 0x051F, 0x059F, 0x073E, 0x078F, 0x0482, 0x079D, + 0x0C02, 0x05BE, 0x048B, 0x0411, 0x0505, 0x057E, 0x052E, 0x074D, + 0x077E, 0x054F, 0x0601, 0x055F, 0x068D, 0x070D, 0x070F, 0x071E, + 0x072E, 0x05CD, 0x0403, 0x0501, 0x055D, 0x059E, 0x0781, 0x0413, + 0x0417, 0x041B, 0x0453, 0x048D, 0x052F, 0x053E, 0x053F, 0x055E, + 0x056F, 0x058E, 0x05BD, 0x05ED, 0x060E, 0x0622, 0x0683, 0x0702, + 0x070E, 0x071D, 0x075D, 0x076F, 0x078E, 0x079E, 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_12x10 = +{ + 12, 10, + { 491, 240 }, + { 1099, 341 }, + { 0, 23 }, + { percentile_arr_12x10_0, percentile_arr_12x10_1 } +}; +#endif + +#if ASTCENC_BLOCK_MAX_TEXELS >= (12 * 12) +static const uint16_t percentile_arr_12x12_0[529] { + 0x0334, 0xF534, 0x8514, 0x8954, 0x7F14, 0xFB54, 0x7B08, 0x7128, + 0x7974, 0x6179, 0x6B64, 0x6908, 0x606A, 0x6724, 0xB544, 0xB066, + 0xA14A, 0x5118, 0x9975, 0x51F9, 0x981C, 0x49CA, 0x4854, 0x886F, + 0x88D4, 0x48EE, 0x41E2, 0x4163, 0x40F3, 0x4261, 0x4064, 0x407E, + 0x385A, 0x42C1, 0x4172, 0x38EA, 0x3946, 0x78CF, 0xA056, 0x38DE, + 0x3D08, 0x38F9, 0x3B14, 0x38FE, 0xA134, 0x38B8, 0x31A4, 0x71D2, + 0x60DA, 0x39C3, 0x99BA, 0x60CA, 0x39F2, 0x30F5, 0x304F, 0x31B6, + 0x31F5, 0x3204, 0x3148, 0x305F, 0x2953, 0x3194, 0x3184, 0x310C, + 0x889C, 0x300C, 0x2943, 0x30EF, 0x28C6, 0x2997, 0x2838, 0x58E6, + 0x20E4, 0x28E3, 0x2873, 0x29E3, 0x2A84, 0x28D3, 0x492B, 0x2962, + 0x286E, 0x20BF, 0x21AA, 0x29A6, 0x6A14, 0x2828, 0x89C6, 0x21B3, + 0x2305, 0x29B4, 0x2173, 0x2127, 0x20D6, 0x407F, 0x2294, 0x21D9, + 0x21D5, 0x2004, 0x404B, 0x18DF, 0x2079, 0x219B, 0x18A8, 0x2385, + 0x1936, 0x21AB, 0x188C, 0x1B09, 0x18BA, 0x203B, 0x187A, 0x1875, + 0x2344, 0x18BB, 0x18B6, 0x193A, 0x1837, 0x1914, 0x1846, 0x1876, + 0x1884, 0x1D24, 0x182B, 0x284A, 0x18A7, 0x18AB, 0x1917, 0x322D, + 0x1047, 0x1874, 0x1818, 0x18F2, 0x1164, 0x1B89, 0x2959, 0x1B21, + 0x39E5, 0x1827, 0x10F4, 0x18B7, 0x11D3, 0x1A4D, 0x1315, 0x12AD, + 0x1AD1, 0x3A71, 0x1319, 0x11A7, 0x2044, 0x2F04, 0x2341, 0x10E5, + 0x1155, 0x195A, 0x1024, 0x111B, 0x1251, 0x1233, 0x12E1, 0x13A1, + 0x13BF, 0x212A, 0x22A2, 0x113B, 0x23DF, 0x10D5, 0x2399, 0x0814, + 0x1126, 0x13EE, 0x1285, 0x10C4, 0x18FD, 0x20D9, 0x0987, 0x1242, + 0x29C5, 0x2313, 0x0898, 0x13C1, 0x08C8, 0x11F1, 0x1034, 0x1B24, + 0x0B0A, 0x11E9, 0x0808, 0x125D, 0x18E9, 0x0848, 0x1395, 0x0965, + 0x123D, 0x2186, 0x1295, 0x18CE, 0x098B, 0x0BEF, 0x1504, 0x082C, + 0x0A41, 0x1144, 0x0A89, 0x0956, 0x1331, 0x085E, 0x0B04, 0x128A, + 0x12A3, 0x1937, 0x19C2, 0x0952, 0x0872, 0x08B4, 0x1262, 0x1124, + 0x1969, 0x1063, 0x0AF1, 0x1225, 0x0894, 0x11C9, 0x18D2, 0x0ACD, + 0x0A29, 0x0B06, 0x09B5, 0x18C7, 0x0916, 0x1088, 0x09FF, 0x2206, + 0x0A15, 0x08B3, 0x0B51, 0x0A1F, 0x18CB, 0x0AC2, 0x0A2E, 0x1865, + 0x08AC, 0x0A31, 0x08A4, 0x138A, 0x0A99, 0x09D1, 0x0A86, 0x189B, + 0x0283, 0x0BDD, 0x0ABD, 0x1933, 0x083F, 0x1386, 0x0923, 0x0322, + 0x0869, 0x10DD, 0x13B1, 0x082F, 0x087D, 0x11B9, 0x085B, 0x08ED, + 0x00C3, 0x08E2, 0x084E, 0x0887, 0x0855, 0x0A0A, 0x0857, 0x0B92, + 0x1036, 0x12A5, 0x0293, 0x0945, 0x08A6, 0x0196, 0x19A3, 0x036F, + 0x0904, 0x1205, 0x09E1, 0x0381, 0x0971, 0x1219, 0x0BAF, 0x0949, + 0x00AF, 0x0AA9, 0x018A, 0x0907, 0x0BFD, 0x003A, 0x0BCD, 0x0AB2, + 0x088B, 0x0252, 0x0A4E, 0x03FF, 0x0845, 0x0897, 0x0059, 0x090B, + 0x0B42, 0x0807, 0x0A16, 0x0853, 0x0A8D, 0x01B2, 0x0AB1, 0x091A, + 0x0195, 0x0A35, 0x00B5, 0x10AA, 0x0115, 0x0A21, 0x0096, 0x0A08, + 0x03FE, 0x0B7F, 0x08B9, 0x12B3, 0x023E, 0x0A23, 0x029E, 0x08F1, + 0x01A9, 0x0BDE, 0x0843, 0x02D2, 0x0A1A, 0x08C5, 0x0151, 0x0A43, + 0x0332, 0x0383, 0x0826, 0x0BED, 0x10C2, 0x00AE, 0x0B82, 0x0213, + 0x0232, 0x085D, 0x02A1, 0x101B, 0x035F, 0x0303, 0x0A39, 0x0207, + 0x0A53, 0x0142, 0x01A5, 0x082A, 0x0099, 0x0A17, 0x03CF, 0x0906, + 0x0125, 0x0A96, 0x0A9A, 0x0209, 0x0393, 0x0961, 0x0131, 0x0A88, + 0x0139, 0x099A, 0x0292, 0x0272, 0x0862, 0x08BE, 0x0141, 0x02C3, + 0x0886, 0x0039, 0x08A9, 0x01A2, 0x01B1, 0x0851, 0x020B, 0x086D, + 0x0312, 0x08CD, 0x020F, 0x0311, 0x0BCE, 0x0135, 0x0006, 0x0849, + 0x0132, 0x0A8F, 0x022F, 0x022A, 0x0AAE, 0x0A8E, 0x0263, 0x03A2, + 0x083E, 0x009A, 0x021B, 0x0835, 0x0323, 0x0871, 0x0993, 0x0226, + 0x0302, 0x0922, 0x0119, 0x0222, 0x021D, 0x0B07, 0x08C9, 0x037E, + 0x08BD, 0x0042, 0x00D1, 0x0B33, 0x01C1, 0x0B9A, 0x0282, 0x088A, + 0x0182, 0x083D, 0x004D, 0x010A, 0x0A1E, 0x0019, 0x00B2, 0x0999, + 0x00A5, 0x0095, 0x0817, 0x0022, 0x031A, 0x0902, 0x00A3, 0x01BF, + 0x029F, 0x0816, 0x03B2, 0x0015, 0x0391, 0x0BBE, 0x01FE, 0x1129, + 0x002E, 0x01DF, 0x0301, 0x0033, 0x0B6E, 0x00E1, 0x0297, 0x00B1, + 0x009F, 0x0B16, 0x000A, 0x001A, 0x0052, 0x080B, 0x030B, 0x029D, + 0x0BAE, 0x01FD, 0x020E, 0x00A2, 0x0A3F, 0x0192, 0x0ABE, 0x020D, + 0x008F, 0x028B, 0x0083, 0x0025, 0x09EE, 0x01EF, 0x0029, 0x0291, + 0x0B4F, 0x0396, 0x0287, 0x008E, 0x0092, 0x0B4E, 0x017E, 0x001E, + 0x009E, 0x0103, 0x080F, 0x000E, 0x0113, 0x0203, 0x01CF, 0x0183, + 0x01CE, 0x001F, 0x0112, 0x01DE, 0x038E, 0x0832, 0x033E, 0x0212, + 0x029B, 0x0023, 0x016F, 0x0201, 0x09AF, 0x0202, 0x0281, 0x035E, + 0x034D, 0x037D, 0x03AD, 0x0013, 0x0093, 0x015F, 0x0211, 0x033F, + 0x036D, 0x039F, 0x03BD, 0x017F, 0x032E, 0x032F, 0x035D, 0x038F, + 0x039E +}; + +static const uint16_t percentile_arr_12x12_1[246] { + 0x0443, 0xFFCD, 0x2C62, 0x2E21, 0x3CF1, 0x34C2, 0x4CDD, 0x2452, + 0xD5DF, 0x1DD1, 0x0FAE, 0x64A3, 0x0C7D, 0x3433, 0x1CD2, 0x2DEF, + 0x0C3E, 0x1D71, 0xA472, 0x0D32, 0x54B3, 0x4D51, 0x445D, 0x0E31, + 0x1FDD, 0x0DFF, 0x0CAE, 0x45A2, 0x2FBE, 0xA4B9, 0x1C4E, 0x2C9F, + 0x160D, 0x0D42, 0x342E, 0x074F, 0x1414, 0x0F6E, 0x0CB2, 0x34B5, + 0x0DFE, 0x0D86, 0x1496, 0x1D22, 0x0691, 0x140B, 0x041F, 0x0C35, + 0x1D93, 0x1506, 0x1439, 0x0C9A, 0x0F01, 0x2442, 0x0C8F, 0x04D1, + 0x1486, 0x0C6D, 0x0513, 0x0C71, 0x0E82, 0x177D, 0x0E03, 0x07BD, + 0x0C2F, 0x0D83, 0x07AF, 0x0D61, 0x1407, 0x0DB1, 0x050A, 0x0C94, + 0x07AD, 0x0D8A, 0x0C04, 0x0416, 0x0C49, 0x0445, 0x15C1, 0x0C1A, + 0x0525, 0x0595, 0x0C8A, 0x075E, 0x0CBD, 0x0681, 0x0F4E, 0x075F, + 0x061D, 0x1541, 0x0CB1, 0x0F3F, 0x0406, 0x076D, 0x0DCF, 0x05EE, + 0x0D23, 0x0599, 0x0CCD, 0x0711, 0x0C23, 0x079F, 0x0D15, 0x0585, + 0x04A2, 0x042A, 0x0D31, 0x05BF, 0x0D92, 0x0C26, 0x043D, 0x0C93, + 0x0502, 0x0C15, 0x048B, 0x0D03, 0x0613, 0x0516, 0x0495, 0x0C29, + 0x04A5, 0x040F, 0x0425, 0x0539, 0x0D19, 0x04E1, 0x05BE, 0x0422, + 0x0432, 0x0C0A, 0x0431, 0x041E, 0x0492, 0x04A9, 0x0582, 0x0529, + 0x0487, 0x0C4D, 0x0512, 0x049E, 0x0505, 0x0451, 0x0D7F, 0x0489, + 0x0602, 0x05DE, 0x0591, 0x0535, 0x074D, 0x055E, 0x04C1, 0x0612, + 0x05DD, 0x05FD, 0x0C61, 0x0521, 0x0484, 0x05CE, 0x0581, 0x0491, + 0x051A, 0x04A1, 0x048E, 0x040D, 0x0499, 0x071F, 0x072E, 0x075D, + 0x0441, 0x0589, 0x057E, 0x0CAD, 0x0501, 0x054F, 0x0692, 0x0511, + 0x049D, 0x0509, 0x056E, 0x040E, 0x0409, 0x0601, 0x048D, 0x0413, + 0x053E, 0x0419, 0x072D, 0x0408, 0x0485, 0x042D, 0x041D, 0x05A1, + 0x0781, 0x0402, 0x05ED, 0x0C82, 0x0403, 0x057D, 0x05CD, 0x0611, + 0x0488, 0x0411, 0x054E, 0x051F, 0x053F, 0x056F, 0x059F, 0x070F, + 0x071D, 0x073D, 0x073E, 0x077E, 0x078F, 0x0405, 0x079D, 0x079E, + 0x058E, 0x0412, 0x055D, 0x05AE, 0x041B, 0x0421, 0x0453, 0x0417, + 0x0483, 0x052E, 0x052F, 0x055F, 0x058F, 0x059E, 0x05AF, 0x05BD, + 0x060E, 0x0622, 0x0683, 0x068D, 0x0702, 0x070D, 0x070E, 0x071E, + 0x072F, 0x076F, 0x078D, 0x078E, 0x07BF, 0x07CE +}; + +static const packed_percentile_table block_pcd_12x12 { + 12, 12, + { 529, 246 }, + { 1435, 335 }, + { 0, 22 }, + { percentile_arr_12x12_0, percentile_arr_12x12_1 } +}; +#endif + +/** + * @brief Fetch the packed percentile table for the given 2D block size. + * + * @param xdim The block x size. + * @param ydim The block y size. + * + * @return The packed table. + */ +static const packed_percentile_table *get_packed_table( + int xdim, + int ydim +) { + int idx = (ydim << 8) | xdim; + switch (idx) + { +#if ASTCENC_BLOCK_MAX_TEXELS >= (4 * 4) + case 0x0404: return &block_pcd_4x4; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (5 * 4) + case 0x0405: return &block_pcd_5x4; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (5 * 5) + case 0x0505: return &block_pcd_5x5; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (6 * 5) + case 0x0506: return &block_pcd_6x5; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (6 * 6) + case 0x0606: return &block_pcd_6x6; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (8 * 5) + case 0x0508: return &block_pcd_8x5; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (8 * 6) + case 0x0608: return &block_pcd_8x6; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (8 * 8) + case 0x0808: return &block_pcd_8x8; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (10 * 5) + case 0x050A: return &block_pcd_10x5; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (10 * 6) + case 0x060A: return &block_pcd_10x6; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (10 * 8) + case 0x080A: return &block_pcd_10x8; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (10 * 10) + case 0x0A0A: return &block_pcd_10x10; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (12 * 10) + case 0x0A0C: return &block_pcd_12x10; +#endif +#if ASTCENC_BLOCK_MAX_TEXELS >= (12 * 12) + case 0x0C0C: return &block_pcd_12x12; +#endif + } + + // Should never hit this with a valid 2D block size + return nullptr; +} + +/* See header for documentation. */ +const float *get_2d_percentile_table( + unsigned int xdim, + unsigned int ydim +) { + float* unpacked_table = new float[WEIGHTS_MAX_BLOCK_MODES]; + const packed_percentile_table *apt = get_packed_table(xdim, ydim); + + // Set the default percentile + for (unsigned int i = 0; i < WEIGHTS_MAX_BLOCK_MODES; i++) + { + unpacked_table[i] = 1.0f; + } + + // Populate the unpacked percentile values + for (int i = 0; i < 2; i++) + { + unsigned int itemcount = apt->item_count[i]; + unsigned int difscale = apt->difscales[i]; + unsigned int accum = apt->initial_percs[i]; + const uint16_t *item_ptr = apt->items[i]; + + for (unsigned int j = 0; j < itemcount; j++) + { + uint16_t item = item_ptr[j]; + unsigned int idx = item & 0x7FF; + unsigned int weight = (item >> 11) & 0x1F; + accum += weight; + unpacked_table[idx] = static_cast(accum) / static_cast(difscale); + } + } + + return unpacked_table; +} +#endif + +/* See header for documentation. */ +bool is_legal_2d_block_size( + unsigned int xdim, + unsigned int ydim +) { + unsigned int idx = (xdim << 8) | ydim; + switch (idx) + { + case 0x0404: + case 0x0504: + case 0x0505: + case 0x0605: + case 0x0606: + case 0x0805: + case 0x0806: + case 0x0808: + case 0x0A05: + case 0x0A06: + case 0x0A08: + case 0x0A0A: + case 0x0C0A: + case 0x0C0C: + return true; + } + + return false; +} + +/* See header for documentation. */ +bool is_legal_3d_block_size( + unsigned int xdim, + unsigned int ydim, + unsigned int zdim +) { + unsigned int idx = (xdim << 16) | (ydim << 8) | zdim; + switch (idx) + { + case 0x030303: + case 0x040303: + case 0x040403: + case 0x040404: + case 0x050404: + case 0x050504: + case 0x050505: + case 0x060505: + case 0x060605: + case 0x060606: + return true; + } + + return false; +} diff --git a/ktx/external/astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp b/ktx/external/astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp new file mode 100644 index 0000000..7de2f2d --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_pick_best_endpoint_format.cpp @@ -0,0 +1,1353 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2025 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 for finding best endpoint format. + * + * We assume there are two independent sources of error in any given partition: + * + * - Encoding choice errors + * - Quantization errors + * + * Encoding choice errors are caused by encoder decisions. For example: + * + * - Using luminance instead of separate RGB components. + * - Using a constant 1.0 alpha instead of storing an alpha component. + * - Using RGB+scale instead of storing two full RGB endpoints. + * + * Quantization errors occur due to the limited precision we use for storage. These errors generally + * scale with quantization level, but are not actually independent of color encoding. In particular: + * + * - If we can use offset encoding then quantization error is halved. + * - If we can use blue-contraction then quantization error for RG is halved. + * - If we use HDR endpoints the quantization error is higher. + * + * Apart from these effects, we assume the error is proportional to the quantization step size. + */ + + +#include "astcenc_internal.h" +#include "astcenc_vecmathlib.h" + +#include + +/** + * @brief Compute the errors of the endpoint line options for one partition. + * + * Uncorrelated data assumes storing completely independent RGBA channels for each endpoint. Same + * chroma data assumes storing RGBA endpoints which pass though the origin (LDR only). RGBL data + * assumes storing RGB + lumashift (HDR only). Luminance error assumes storing RGB channels as a + * single value. + * + * + * @param pi The partition info data. + * @param partition_index The partition index to compule the error for. + * @param blk The image block. + * @param uncor_pline The endpoint line assuming uncorrelated endpoints. + * @param[out] uncor_err The computed error for the uncorrelated endpoint line. + * @param samec_pline The endpoint line assuming the same chroma for both endpoints. + * @param[out] samec_err The computed error for the uncorrelated endpoint line. + * @param rgbl_pline The endpoint line assuming RGB + lumashift data. + * @param[out] rgbl_err The computed error for the RGB + lumashift endpoint line. + * @param l_pline The endpoint line assuming luminance data. + * @param[out] l_err The computed error for the luminance endpoint line. + * @param[out] a_drop_err The computed error for dropping the alpha component. + */ +static void compute_error_squared_rgb_single_partition( + const partition_info& pi, + int partition_index, + const image_block& blk, + const processed_line3& uncor_pline, + float& uncor_err, + const processed_line3& samec_pline, + float& samec_err, + const processed_line3& rgbl_pline, + float& rgbl_err, + const processed_line3& l_pline, + float& l_err, + float& a_drop_err +) { + vfloat4 ews = blk.channel_weight; + + unsigned int texel_count = pi.partition_texel_count[partition_index]; + const uint8_t* texel_indexes = pi.texels_of_partition[partition_index]; + promise(texel_count > 0); + + vfloatacc a_drop_errv = vfloatacc::zero(); + vfloat default_a(blk.get_default_alpha()); + + vfloatacc uncor_errv = vfloatacc::zero(); + vfloat uncor_bs0(uncor_pline.bs.lane<0>()); + vfloat uncor_bs1(uncor_pline.bs.lane<1>()); + vfloat uncor_bs2(uncor_pline.bs.lane<2>()); + + vfloat uncor_amod0(uncor_pline.amod.lane<0>()); + vfloat uncor_amod1(uncor_pline.amod.lane<1>()); + vfloat uncor_amod2(uncor_pline.amod.lane<2>()); + + vfloatacc samec_errv = vfloatacc::zero(); + vfloat samec_bs0(samec_pline.bs.lane<0>()); + vfloat samec_bs1(samec_pline.bs.lane<1>()); + vfloat samec_bs2(samec_pline.bs.lane<2>()); + + vfloatacc rgbl_errv = vfloatacc::zero(); + vfloat rgbl_bs0(rgbl_pline.bs.lane<0>()); + vfloat rgbl_bs1(rgbl_pline.bs.lane<1>()); + vfloat rgbl_bs2(rgbl_pline.bs.lane<2>()); + + vfloat rgbl_amod0(rgbl_pline.amod.lane<0>()); + vfloat rgbl_amod1(rgbl_pline.amod.lane<1>()); + vfloat rgbl_amod2(rgbl_pline.amod.lane<2>()); + + vfloatacc l_errv = vfloatacc::zero(); + vfloat l_bs0(l_pline.bs.lane<0>()); + vfloat l_bs1(l_pline.bs.lane<1>()); + vfloat l_bs2(l_pline.bs.lane<2>()); + + vint lane_ids = vint::lane_id(); + for (unsigned int i = 0; i < texel_count; i += ASTCENC_SIMD_WIDTH) + { + const uint8_t* tix = texel_indexes + i; + + vmask mask = lane_ids < vint(texel_count); + lane_ids += vint(ASTCENC_SIMD_WIDTH); + + // Compute the error that arises from just ditching alpha + vfloat data_a = gatherf_byte_inds(blk.data_a, tix); + vfloat alpha_diff = data_a - default_a; + alpha_diff = alpha_diff * alpha_diff; + + haccumulate(a_drop_errv, alpha_diff, mask); + + vfloat data_r = gatherf_byte_inds(blk.data_r, tix); + vfloat data_g = gatherf_byte_inds(blk.data_g, tix); + vfloat data_b = gatherf_byte_inds(blk.data_b, tix); + + // Compute uncorrelated error + vfloat param = data_r * uncor_bs0 + + data_g * uncor_bs1 + + data_b * uncor_bs2; + + vfloat dist0 = (uncor_amod0 + param * uncor_bs0) - data_r; + vfloat dist1 = (uncor_amod1 + param * uncor_bs1) - data_g; + vfloat dist2 = (uncor_amod2 + param * uncor_bs2) - data_b; + + vfloat error = dist0 * dist0 * ews.lane<0>() + + dist1 * dist1 * ews.lane<1>() + + dist2 * dist2 * ews.lane<2>(); + + haccumulate(uncor_errv, error, mask); + + // Compute same chroma error - no "amod", its always zero + param = data_r * samec_bs0 + + data_g * samec_bs1 + + data_b * samec_bs2; + + dist0 = (param * samec_bs0) - data_r; + dist1 = (param * samec_bs1) - data_g; + dist2 = (param * samec_bs2) - data_b; + + error = dist0 * dist0 * ews.lane<0>() + + dist1 * dist1 * ews.lane<1>() + + dist2 * dist2 * ews.lane<2>(); + + haccumulate(samec_errv, error, mask); + + // Compute rgbl error + param = data_r * rgbl_bs0 + + data_g * rgbl_bs1 + + data_b * rgbl_bs2; + + dist0 = (rgbl_amod0 + param * rgbl_bs0) - data_r; + dist1 = (rgbl_amod1 + param * rgbl_bs1) - data_g; + dist2 = (rgbl_amod2 + param * rgbl_bs2) - data_b; + + error = dist0 * dist0 * ews.lane<0>() + + dist1 * dist1 * ews.lane<1>() + + dist2 * dist2 * ews.lane<2>(); + + haccumulate(rgbl_errv, error, mask); + + // Compute luma error - no "amod", its always zero + param = data_r * l_bs0 + + data_g * l_bs1 + + data_b * l_bs2; + + dist0 = (param * l_bs0) - data_r; + dist1 = (param * l_bs1) - data_g; + dist2 = (param * l_bs2) - data_b; + + error = dist0 * dist0 * ews.lane<0>() + + dist1 * dist1 * ews.lane<1>() + + dist2 * dist2 * ews.lane<2>(); + + haccumulate(l_errv, error, mask); + } + + a_drop_err = hadd_s(a_drop_errv) * ews.lane<3>(); + uncor_err = hadd_s(uncor_errv); + samec_err = hadd_s(samec_errv); + rgbl_err = hadd_s(rgbl_errv); + l_err = hadd_s(l_errv); +} + +/** + * @brief For a given set of input colors and partitioning determine endpoint encode errors. + * + * This function determines the color error that results from RGB-scale encoding (LDR only), + * RGB-lumashift encoding (HDR only), luminance-encoding, and alpha drop. Also determines whether + * the endpoints are eligible for offset encoding or blue-contraction + * + * @param blk The image block. + * @param pi The partition info data. + * @param ep The idealized endpoints. + * @param[out] eci The resulting encoding choice error metrics. + */ +static void compute_encoding_choice_errors( + const image_block& blk, + const partition_info& pi, + const endpoints& ep, + encoding_choice_errors eci[BLOCK_MAX_PARTITIONS]) +{ + int partition_count = pi.partition_count; + promise(partition_count > 0); + + partition_metrics pms[BLOCK_MAX_PARTITIONS]; + + compute_avgs_and_dirs_3_comp_rgb(pi, blk, pms); + + for (int i = 0; i < partition_count; i++) + { + partition_metrics& pm = pms[i]; + + line3 uncor_rgb_lines; + line3 samec_rgb_lines; // for LDR-RGB-scale + line3 rgb_luma_lines; // for HDR-RGB-scale + + processed_line3 uncor_rgb_plines; + processed_line3 samec_rgb_plines; + processed_line3 rgb_luma_plines; + processed_line3 luminance_plines; + + float uncorr_rgb_error; + float samechroma_rgb_error; + float rgb_luma_error; + float luminance_rgb_error; + float alpha_drop_error; + + uncor_rgb_lines.a = pm.avg; + uncor_rgb_lines.b = normalize_safe(pm.dir, unit3()); + + samec_rgb_lines.a = vfloat4::zero(); + samec_rgb_lines.b = normalize_safe(pm.avg, unit3()); + + rgb_luma_lines.a = pm.avg; + rgb_luma_lines.b = unit3(); + + uncor_rgb_plines.amod = uncor_rgb_lines.a - uncor_rgb_lines.b * dot3(uncor_rgb_lines.a, uncor_rgb_lines.b); + uncor_rgb_plines.bs = uncor_rgb_lines.b; + + // Same chroma always goes though zero, so this is simpler than the others + samec_rgb_plines.amod = vfloat4::zero(); + samec_rgb_plines.bs = samec_rgb_lines.b; + + rgb_luma_plines.amod = rgb_luma_lines.a - rgb_luma_lines.b * dot3(rgb_luma_lines.a, rgb_luma_lines.b); + rgb_luma_plines.bs = rgb_luma_lines.b; + + // Luminance always goes though zero, so this is simpler than the others + luminance_plines.amod = vfloat4::zero(); + luminance_plines.bs = unit3(); + + compute_error_squared_rgb_single_partition( + pi, i, blk, + uncor_rgb_plines, uncorr_rgb_error, + samec_rgb_plines, samechroma_rgb_error, + rgb_luma_plines, rgb_luma_error, + luminance_plines, luminance_rgb_error, + alpha_drop_error); + + // Determine if we can offset encode RGB lanes + vfloat4 endpt0 = ep.endpt0[i]; + vfloat4 endpt1 = ep.endpt1[i]; + vfloat4 endpt_diff = abs(endpt1 - endpt0); + vmask4 endpt_can_offset = endpt_diff < vfloat4(0.12f * 65535.0f); + bool can_offset_encode = (mask(endpt_can_offset) & 0x7) == 0x7; + + // Store out the settings + eci[i].rgb_scale_error = (samechroma_rgb_error - uncorr_rgb_error) * 0.7f; // empirical + eci[i].rgb_luma_error = (rgb_luma_error - uncorr_rgb_error) * 1.5f; // wild guess + eci[i].luminance_error = (luminance_rgb_error - uncorr_rgb_error) * 3.0f; // empirical + eci[i].alpha_drop_error = alpha_drop_error * 3.0f; + eci[i].can_offset_encode = can_offset_encode; + eci[i].can_blue_contract = !blk.is_luminance(); + } +} + +/** + * @brief For a given partition compute the error for every endpoint integer count and quant level. + * + * @param encode_hdr_rgb @c true if using HDR for RGB, @c false for LDR. + * @param encode_hdr_alpha @c true if using HDR for alpha, @c false for LDR. + * @param partition_index The partition index. + * @param pi The partition info. + * @param eci The encoding choice error metrics. + * @param ep The idealized endpoints. + * @param error_weight The resulting encoding choice error metrics. + * @param[out] best_error The best error for each integer count and quant level. + * @param[out] format_of_choice The preferred endpoint format for each integer count and quant level. + */ +static void compute_color_error_for_every_integer_count_and_quant_level( + bool encode_hdr_rgb, + bool encode_hdr_alpha, + int partition_index, + const partition_info& pi, + const encoding_choice_errors& eci, + const endpoints& ep, + vfloat4 error_weight, + float best_error[21][4], + uint8_t format_of_choice[21][4] +) { + int partition_size = pi.partition_texel_count[partition_index]; + + static const float baseline_quant_error[21 - QUANT_6] { + (65536.0f * 65536.0f / 18.0f) / (5 * 5), + (65536.0f * 65536.0f / 18.0f) / (7 * 7), + (65536.0f * 65536.0f / 18.0f) / (9 * 9), + (65536.0f * 65536.0f / 18.0f) / (11 * 11), + (65536.0f * 65536.0f / 18.0f) / (15 * 15), + (65536.0f * 65536.0f / 18.0f) / (19 * 19), + (65536.0f * 65536.0f / 18.0f) / (23 * 23), + (65536.0f * 65536.0f / 18.0f) / (31 * 31), + (65536.0f * 65536.0f / 18.0f) / (39 * 39), + (65536.0f * 65536.0f / 18.0f) / (47 * 47), + (65536.0f * 65536.0f / 18.0f) / (63 * 63), + (65536.0f * 65536.0f / 18.0f) / (79 * 79), + (65536.0f * 65536.0f / 18.0f) / (95 * 95), + (65536.0f * 65536.0f / 18.0f) / (127 * 127), + (65536.0f * 65536.0f / 18.0f) / (159 * 159), + (65536.0f * 65536.0f / 18.0f) / (191 * 191), + (65536.0f * 65536.0f / 18.0f) / (255 * 255) + }; + + vfloat4 ep0 = ep.endpt0[partition_index]; + vfloat4 ep1 = ep.endpt1[partition_index]; + + float ep1_min = hmin_rgb_s(ep1); + ep1_min = astc::max(ep1_min, 0.0f); + + float error_weight_rgbsum = hadd_rgb_s(error_weight); + + float range_upper_limit_rgb = encode_hdr_rgb ? 61440.0f : 65535.0f; + float range_upper_limit_alpha = encode_hdr_alpha ? 61440.0f : 65535.0f; + + // It is possible to get endpoint colors significantly outside [0,upper-limit] even if the + // input data are safely contained in [0,upper-limit]; we need to add an error term for this + vfloat4 offset(range_upper_limit_rgb, range_upper_limit_rgb, range_upper_limit_rgb, range_upper_limit_alpha); + vfloat4 ep0_range_error_high = max(ep0 - offset, 0.0f); + vfloat4 ep1_range_error_high = max(ep1 - offset, 0.0f); + + vfloat4 ep0_range_error_low = min(ep0, 0.0f); + vfloat4 ep1_range_error_low = min(ep1, 0.0f); + + vfloat4 sum_range_error = + (ep0_range_error_low * ep0_range_error_low) + + (ep1_range_error_low * ep1_range_error_low) + + (ep0_range_error_high * ep0_range_error_high) + + (ep1_range_error_high * ep1_range_error_high); + + float rgb_range_error = dot3_s(sum_range_error, error_weight) + * 0.5f * static_cast(partition_size); + float alpha_range_error = sum_range_error.lane<3>() * error_weight.lane<3>() + * 0.5f * static_cast(partition_size); + + if (encode_hdr_rgb) + { + + // Collect some statistics + float af, cf; + if (ep1.lane<0>() > ep1.lane<1>() && ep1.lane<0>() > ep1.lane<2>()) + { + af = ep1.lane<0>(); + cf = ep1.lane<0>() - ep0.lane<0>(); + } + else if (ep1.lane<1>() > ep1.lane<2>()) + { + af = ep1.lane<1>(); + cf = ep1.lane<1>() - ep0.lane<1>(); + } + else + { + af = ep1.lane<2>(); + cf = ep1.lane<2>() - ep0.lane<2>(); + } + + // Estimate of color-component spread in high endpoint color + float bf = af - ep1_min; + vfloat4 prd = (ep1 - vfloat4(cf)).swz<0, 1, 2>(); + vfloat4 pdif = prd - ep0.swz<0, 1, 2>(); + // Estimate of color-component spread in low endpoint color + float df = hmax_s(abs(pdif)); + + int b = static_cast(bf); + int c = static_cast(cf); + int d = static_cast(df); + + // Determine which one of the 6 submodes is likely to be used in case of an RGBO-mode + int rgbo_mode = 5; // 7 bits per component + // mode 4: 8 7 6 + if (b < 32768 && c < 16384) + { + rgbo_mode = 4; + } + + // mode 3: 9 6 7 + if (b < 8192 && c < 16384) + { + rgbo_mode = 3; + } + + // mode 2: 10 5 8 + if (b < 2048 && c < 16384) + { + rgbo_mode = 2; + } + + // mode 1: 11 6 5 + if (b < 2048 && c < 1024) + { + rgbo_mode = 1; + } + + // mode 0: 11 5 7 + if (b < 1024 && c < 4096) + { + rgbo_mode = 0; + } + + // Determine which one of the 9 submodes is likely to be used in case of an RGB-mode. + int rgb_mode = 8; // 8 bits per component, except 7 bits for blue + + // mode 0: 9 7 6 7 + if (b < 16384 && c < 8192 && d < 8192) + { + rgb_mode = 0; + } + + // mode 1: 9 8 6 6 + if (b < 32768 && c < 8192 && d < 4096) + { + rgb_mode = 1; + } + + // mode 2: 10 6 7 7 + if (b < 4096 && c < 8192 && d < 4096) + { + rgb_mode = 2; + } + + // mode 3: 10 7 7 6 + if (b < 8192 && c < 8192 && d < 2048) + { + rgb_mode = 3; + } + + // mode 4: 11 8 6 5 + if (b < 8192 && c < 2048 && d < 512) + { + rgb_mode = 4; + } + + // mode 5: 11 6 8 6 + if (b < 2048 && c < 8192 && d < 1024) + { + rgb_mode = 5; + } + + // mode 6: 12 7 7 5 + if (b < 2048 && c < 2048 && d < 256) + { + rgb_mode = 6; + } + + // mode 7: 12 6 7 6 + if (b < 1024 && c < 2048 && d < 512) + { + rgb_mode = 7; + } + + static const float rgbo_error_scales[6] { 4.0f, 4.0f, 16.0f, 64.0f, 256.0f, 1024.0f }; + static const float rgb_error_scales[9] { 64.0f, 64.0f, 16.0f, 16.0f, 4.0f, 4.0f, 1.0f, 1.0f, 384.0f }; + + float mode7mult = rgbo_error_scales[rgbo_mode] * 0.0015f; // Empirically determined .... + float mode11mult = rgb_error_scales[rgb_mode] * 0.010f; // Empirically determined .... + + + float lum_high = hadd_rgb_s(ep1) * (1.0f / 3.0f); + float lum_low = hadd_rgb_s(ep0) * (1.0f / 3.0f); + float lumdif = lum_high - lum_low; + float mode23mult = lumdif < 960 ? 4.0f : lumdif < 3968 ? 16.0f : 128.0f; + + mode23mult *= 0.0005f; // Empirically determined .... + + // Pick among the available HDR endpoint modes + for (int i = QUANT_2; i < QUANT_16; i++) + { + best_error[i][3] = ERROR_CALC_DEFAULT; + best_error[i][2] = ERROR_CALC_DEFAULT; + best_error[i][1] = ERROR_CALC_DEFAULT; + best_error[i][0] = ERROR_CALC_DEFAULT; + + format_of_choice[i][3] = static_cast(encode_hdr_alpha ? FMT_HDR_RGBA : FMT_HDR_RGB_LDR_ALPHA); + format_of_choice[i][2] = FMT_HDR_RGB; + format_of_choice[i][1] = FMT_HDR_RGB_SCALE; + format_of_choice[i][0] = FMT_HDR_LUMINANCE_LARGE_RANGE; + } + + for (int i = QUANT_16; i <= QUANT_256; i++) + { + // The base_quant_error should depend on the scale-factor that would be used during + // actual encode of the color value + + float base_quant_error = baseline_quant_error[i - QUANT_6] * static_cast(partition_size); + float rgb_quantization_error = error_weight_rgbsum * base_quant_error * 2.0f; + float alpha_quantization_error = error_weight.lane<3>() * base_quant_error * 2.0f; + float rgba_quantization_error = rgb_quantization_error + alpha_quantization_error; + + // For 8 integers, we have two encodings: one with HDR A and another one with LDR A + + float full_hdr_rgba_error = rgba_quantization_error + rgb_range_error + alpha_range_error; + best_error[i][3] = full_hdr_rgba_error; + format_of_choice[i][3] = static_cast(encode_hdr_alpha ? FMT_HDR_RGBA : FMT_HDR_RGB_LDR_ALPHA); + + // For 6 integers, we have one HDR-RGB encoding + float full_hdr_rgb_error = (rgb_quantization_error * mode11mult) + rgb_range_error + eci.alpha_drop_error; + best_error[i][2] = full_hdr_rgb_error; + format_of_choice[i][2] = FMT_HDR_RGB; + + // For 4 integers, we have one HDR-RGB-Scale encoding + float hdr_rgb_scale_error = (rgb_quantization_error * mode7mult) + rgb_range_error + eci.alpha_drop_error + eci.rgb_luma_error; + + best_error[i][1] = hdr_rgb_scale_error; + format_of_choice[i][1] = FMT_HDR_RGB_SCALE; + + // For 2 integers, we assume luminance-with-large-range + float hdr_luminance_error = (rgb_quantization_error * mode23mult) + rgb_range_error + eci.alpha_drop_error + eci.luminance_error; + best_error[i][0] = hdr_luminance_error; + format_of_choice[i][0] = FMT_HDR_LUMINANCE_LARGE_RANGE; + } + } + else + { + for (int i = QUANT_2; i < QUANT_6; i++) + { + best_error[i][3] = ERROR_CALC_DEFAULT; + best_error[i][2] = ERROR_CALC_DEFAULT; + best_error[i][1] = ERROR_CALC_DEFAULT; + best_error[i][0] = ERROR_CALC_DEFAULT; + + format_of_choice[i][3] = FMT_RGBA; + format_of_choice[i][2] = FMT_RGB; + format_of_choice[i][1] = FMT_RGB_SCALE; + format_of_choice[i][0] = FMT_LUMINANCE; + } + + float base_quant_error_rgb = error_weight_rgbsum * static_cast(partition_size); + float base_quant_error_a = error_weight.lane<3>() * static_cast(partition_size); + float base_quant_error_rgba = base_quant_error_rgb + base_quant_error_a; + + float error_scale_bc_rgba = eci.can_blue_contract ? 0.625f : 1.0f; + float error_scale_oe_rgba = eci.can_offset_encode ? 0.5f : 1.0f; + + float error_scale_bc_rgb = eci.can_blue_contract ? 0.5f : 1.0f; + float error_scale_oe_rgb = eci.can_offset_encode ? 0.25f : 1.0f; + + // Pick among the available LDR endpoint modes + for (int i = QUANT_6; i <= QUANT_256; i++) + { + // Offset encoding not possible at higher quant levels + if (i >= QUANT_192) + { + error_scale_oe_rgba = 1.0f; + error_scale_oe_rgb = 1.0f; + } + + float base_quant_error = baseline_quant_error[i - QUANT_6]; + float quant_error_rgb = base_quant_error_rgb * base_quant_error; + float quant_error_rgba = base_quant_error_rgba * base_quant_error; + + // 8 integers can encode as RGBA+RGBA + float full_ldr_rgba_error = quant_error_rgba + * error_scale_bc_rgba + * error_scale_oe_rgba + + rgb_range_error + + alpha_range_error; + + best_error[i][3] = full_ldr_rgba_error; + format_of_choice[i][3] = FMT_RGBA; + + // 6 integers can encode as RGB+RGB or RGBS+AA + float full_ldr_rgb_error = quant_error_rgb + * error_scale_bc_rgb + * error_scale_oe_rgb + + rgb_range_error + + eci.alpha_drop_error; + + float rgbs_alpha_error = quant_error_rgba + + eci.rgb_scale_error + + rgb_range_error + + alpha_range_error; + + if (rgbs_alpha_error < full_ldr_rgb_error) + { + best_error[i][2] = rgbs_alpha_error; + format_of_choice[i][2] = FMT_RGB_SCALE_ALPHA; + } + else + { + best_error[i][2] = full_ldr_rgb_error; + format_of_choice[i][2] = FMT_RGB; + } + + // 4 integers can encode as RGBS or LA+LA + float ldr_rgbs_error = quant_error_rgb + + rgb_range_error + + eci.alpha_drop_error + + eci.rgb_scale_error; + + float lum_alpha_error = quant_error_rgba + + rgb_range_error + + alpha_range_error + + eci.luminance_error; + + if (ldr_rgbs_error < lum_alpha_error) + { + best_error[i][1] = ldr_rgbs_error; + format_of_choice[i][1] = FMT_RGB_SCALE; + } + else + { + best_error[i][1] = lum_alpha_error; + format_of_choice[i][1] = FMT_LUMINANCE_ALPHA; + } + + // 2 integers can encode as L+L + float luminance_error = quant_error_rgb + + rgb_range_error + + eci.alpha_drop_error + + eci.luminance_error; + + best_error[i][0] = luminance_error; + format_of_choice[i][0] = FMT_LUMINANCE; + } + } +} + +/** + * @brief For one partition compute the best format and quantization for a given bit count. + * + * @param best_combined_error The best error for each quant level and integer count. + * @param best_combined_format The best format for each quant level and integer count. + * @param bits_available The number of bits available for encoding. + * @param[out] best_quant_level The output best color quant level. + * @param[out] best_format The output best color format. + * + * @return The output error for the best pairing. + */ +static float one_partition_find_best_combination_for_bitcount( + const float best_combined_error[21][4], + const uint8_t best_combined_format[21][4], + int bits_available, + uint8_t& best_quant_level, + uint8_t& best_format +) { + int best_integer_count = 0; + float best_integer_count_error = ERROR_CALC_DEFAULT; + + for (int integer_count = 1; integer_count <= 4; integer_count++) + { + // Compute the quantization level for a given number of integers and a given number of bits + int quant_level = quant_mode_table[integer_count][bits_available]; + + // Don't have enough bits to represent a given endpoint format at all! + if (quant_level < QUANT_6) + { + continue; + } + + float integer_count_error = best_combined_error[quant_level][integer_count - 1]; + if (integer_count_error < best_integer_count_error) + { + best_integer_count_error = integer_count_error; + best_integer_count = integer_count - 1; + } + } + + int ql = quant_mode_table[best_integer_count + 1][bits_available]; + + best_quant_level = static_cast(ql); + best_format = FMT_LUMINANCE; + + if (ql >= QUANT_6) + { + best_format = best_combined_format[ql][best_integer_count]; + } + + return best_integer_count_error; +} + +/** + * @brief For 2 partitions compute the best format combinations for every pair of quant mode and integer count. + * + * @param best_error The best error for a single endpoint quant level and integer count. + * @param best_format The best format for a single endpoint quant level and integer count. + * @param[out] best_combined_error The best combined error pairings for the 2 partitions. + * @param[out] best_combined_format The best combined format pairings for the 2 partitions. + */ +static void two_partitions_find_best_combination_for_every_quantization_and_integer_count( + const float best_error[2][21][4], // indexed by (partition, quant-level, integer-pair-count-minus-1) + const uint8_t best_format[2][21][4], + float best_combined_error[21][7], // indexed by (quant-level, integer-pair-count-minus-2) + uint8_t best_combined_format[21][7][2] +) { + for (int i = QUANT_2; i <= QUANT_256; i++) + { + for (int j = 0; j < 7; j++) + { + best_combined_error[i][j] = ERROR_CALC_DEFAULT; + } + } + + for (int quant = QUANT_6; quant <= QUANT_256; quant++) + { + for (int i = 0; i < 4; i++) // integer-count for first endpoint-pair + { + for (int j = 0; j < 4; j++) // integer-count for second endpoint-pair + { + int low2 = astc::min(i, j); + int high2 = astc::max(i, j); + if ((high2 - low2) > 1) + { + continue; + } + + int intcnt = i + j; + float errorterm = astc::min(best_error[0][quant][i] + best_error[1][quant][j], 1e10f); + if (errorterm <= best_combined_error[quant][intcnt]) + { + best_combined_error[quant][intcnt] = errorterm; + best_combined_format[quant][intcnt][0] = best_format[0][quant][i]; + best_combined_format[quant][intcnt][1] = best_format[1][quant][j]; + } + } + } + } +} + +/** + * @brief For 2 partitions compute the best format and quantization for a given bit count. + * + * @param best_combined_error The best error for each quant level and integer count. + * @param best_combined_format The best format for each quant level and integer count. + * @param bits_available The number of bits available for encoding. + * @param[out] best_quant_level The output best color quant level. + * @param[out] best_quant_level_mod The output best color quant level assuming two more bits are available. + * @param[out] best_formats The output best color formats. + * + * @return The output error for the best pairing. + */ +static float two_partitions_find_best_combination_for_bitcount( + float best_combined_error[21][7], + uint8_t best_combined_format[21][7][2], + int bits_available, + uint8_t& best_quant_level, + uint8_t& best_quant_level_mod, + uint8_t* best_formats +) { + int best_integer_count = 0; + float best_integer_count_error = ERROR_CALC_DEFAULT; + + for (int integer_count = 2; integer_count <= 8; integer_count++) + { + // Compute the quantization level for a given number of integers and a given number of bits + int quant_level = quant_mode_table[integer_count][bits_available]; + + // Don't have enough bits to represent a given endpoint format at all! + if (quant_level < QUANT_6) + { + break; + } + + float integer_count_error = best_combined_error[quant_level][integer_count - 2]; + if (integer_count_error < best_integer_count_error) + { + best_integer_count_error = integer_count_error; + best_integer_count = integer_count; + } + } + + int ql = quant_mode_table[best_integer_count][bits_available]; + int ql_mod = quant_mode_table[best_integer_count][bits_available + 2]; + + best_quant_level = static_cast(ql); + best_quant_level_mod = static_cast(ql_mod); + + if (ql >= QUANT_6) + { + for (int i = 0; i < 2; i++) + { + best_formats[i] = best_combined_format[ql][best_integer_count - 2][i]; + } + } + else + { + for (int i = 0; i < 2; i++) + { + best_formats[i] = FMT_LUMINANCE; + } + } + + return best_integer_count_error; +} + +/** + * @brief For 3 partitions compute the best format combinations for every pair of quant mode and integer count. + * + * @param best_error The best error for a single endpoint quant level and integer count. + * @param best_format The best format for a single endpoint quant level and integer count. + * @param[out] best_combined_error The best combined error pairings for the 3 partitions. + * @param[out] best_combined_format The best combined format pairings for the 3 partitions. + */ +static void three_partitions_find_best_combination_for_every_quantization_and_integer_count( + const float best_error[3][21][4], // indexed by (partition, quant-level, integer-count) + const uint8_t best_format[3][21][4], + float best_combined_error[21][10], + uint8_t best_combined_format[21][10][3] +) { + for (int i = QUANT_2; i <= QUANT_256; i++) + { + for (int j = 0; j < 10; j++) + { + best_combined_error[i][j] = ERROR_CALC_DEFAULT; + } + } + + for (int quant = QUANT_6; quant <= QUANT_256; quant++) + { + for (int i = 0; i < 4; i++) // integer-count for first endpoint-pair + { + for (int j = 0; j < 4; j++) // integer-count for second endpoint-pair + { + int low2 = astc::min(i, j); + int high2 = astc::max(i, j); + if ((high2 - low2) > 1) + { + continue; + } + + for (int k = 0; k < 4; k++) // integer-count for third endpoint-pair + { + int low3 = astc::min(k, low2); + int high3 = astc::max(k, high2); + if ((high3 - low3) > 1) + { + continue; + } + + int intcnt = i + j + k; + float errorterm = astc::min(best_error[0][quant][i] + best_error[1][quant][j] + best_error[2][quant][k], 1e10f); + if (errorterm <= best_combined_error[quant][intcnt]) + { + best_combined_error[quant][intcnt] = errorterm; + best_combined_format[quant][intcnt][0] = best_format[0][quant][i]; + best_combined_format[quant][intcnt][1] = best_format[1][quant][j]; + best_combined_format[quant][intcnt][2] = best_format[2][quant][k]; + } + } + } + } + } +} + +/** + * @brief For 3 partitions compute the best format and quantization for a given bit count. + * + * @param best_combined_error The best error for each quant level and integer count. + * @param best_combined_format The best format for each quant level and integer count. + * @param bits_available The number of bits available for encoding. + * @param[out] best_quant_level The output best color quant level. + * @param[out] best_quant_level_mod The output best color quant level assuming two more bits are available. + * @param[out] best_formats The output best color formats. + * + * @return The output error for the best pairing. + */ +static float three_partitions_find_best_combination_for_bitcount( + const float best_combined_error[21][10], + const uint8_t best_combined_format[21][10][3], + int bits_available, + uint8_t& best_quant_level, + uint8_t& best_quant_level_mod, + uint8_t* best_formats +) { + int best_integer_count = 0; + float best_integer_count_error = ERROR_CALC_DEFAULT; + + for (int integer_count = 3; integer_count <= 9; integer_count++) + { + // Compute the quantization level for a given number of integers and a given number of bits + int quant_level = quant_mode_table[integer_count][bits_available]; + + // Don't have enough bits to represent a given endpoint format at all! + if (quant_level < QUANT_6) + { + break; + } + + float integer_count_error = best_combined_error[quant_level][integer_count - 3]; + if (integer_count_error < best_integer_count_error) + { + best_integer_count_error = integer_count_error; + best_integer_count = integer_count; + } + } + + int ql = quant_mode_table[best_integer_count][bits_available]; + int ql_mod = quant_mode_table[best_integer_count][bits_available + 5]; + + best_quant_level = static_cast(ql); + best_quant_level_mod = static_cast(ql_mod); + + if (ql >= QUANT_6) + { + for (int i = 0; i < 3; i++) + { + best_formats[i] = best_combined_format[ql][best_integer_count - 3][i]; + } + } + else + { + for (int i = 0; i < 3; i++) + { + best_formats[i] = FMT_LUMINANCE; + } + } + + return best_integer_count_error; +} + +/** + * @brief For 4 partitions compute the best format combinations for every pair of quant mode and integer count. + * + * @param best_error The best error for a single endpoint quant level and integer count. + * @param best_format The best format for a single endpoint quant level and integer count. + * @param[out] best_combined_error The best combined error pairings for the 4 partitions. + * @param[out] best_combined_format The best combined format pairings for the 4 partitions. + */ +static void four_partitions_find_best_combination_for_every_quantization_and_integer_count( + const float best_error[4][21][4], // indexed by (partition, quant-level, integer-count) + const uint8_t best_format[4][21][4], + float best_combined_error[21][13], + uint8_t best_combined_format[21][13][4] +) { + for (int i = QUANT_2; i <= QUANT_256; i++) + { + for (int j = 0; j < 13; j++) + { + best_combined_error[i][j] = ERROR_CALC_DEFAULT; + } + } + + for (int quant = QUANT_6; quant <= QUANT_256; quant++) + { + for (int i = 0; i < 4; i++) // integer-count for first endpoint-pair + { + for (int j = 0; j < 4; j++) // integer-count for second endpoint-pair + { + int low2 = astc::min(i, j); + int high2 = astc::max(i, j); + if ((high2 - low2) > 1) + { + continue; + } + + for (int k = 0; k < 4; k++) // integer-count for third endpoint-pair + { + int low3 = astc::min(k, low2); + int high3 = astc::max(k, high2); + if ((high3 - low3) > 1) + { + continue; + } + + for (int l = 0; l < 4; l++) // integer-count for fourth endpoint-pair + { + int low4 = astc::min(l, low3); + int high4 = astc::max(l, high3); + if ((high4 - low4) > 1) + { + continue; + } + + int intcnt = i + j + k + l; + float errorterm = astc::min(best_error[0][quant][i] + best_error[1][quant][j] + best_error[2][quant][k] + best_error[3][quant][l], 1e10f); + if (errorterm <= best_combined_error[quant][intcnt]) + { + best_combined_error[quant][intcnt] = errorterm; + best_combined_format[quant][intcnt][0] = best_format[0][quant][i]; + best_combined_format[quant][intcnt][1] = best_format[1][quant][j]; + best_combined_format[quant][intcnt][2] = best_format[2][quant][k]; + best_combined_format[quant][intcnt][3] = best_format[3][quant][l]; + } + } + } + } + } + } +} + +/** + * @brief For 4 partitions compute the best format and quantization for a given bit count. + * + * @param best_combined_error The best error for each quant level and integer count. + * @param best_combined_format The best format for each quant level and integer count. + * @param bits_available The number of bits available for encoding. + * @param[out] best_quant_level The output best color quant level. + * @param[out] best_quant_level_mod The output best color quant level assuming two more bits are available. + * @param[out] best_formats The output best color formats. + * + * @return best_error The output error for the best pairing. + */ +static float four_partitions_find_best_combination_for_bitcount( + const float best_combined_error[21][13], + const uint8_t best_combined_format[21][13][4], + int bits_available, + uint8_t& best_quant_level, + uint8_t& best_quant_level_mod, + uint8_t* best_formats +) { + int best_integer_count = 0; + float best_integer_count_error = ERROR_CALC_DEFAULT; + + for (int integer_count = 4; integer_count <= 9; integer_count++) + { + // Compute the quantization level for a given number of integers and a given number of bits + int quant_level = quant_mode_table[integer_count][bits_available]; + + // Don't have enough bits to represent a given endpoint format at all! + if (quant_level < QUANT_6) + { + break; + } + + float integer_count_error = best_combined_error[quant_level][integer_count - 4]; + if (integer_count_error < best_integer_count_error) + { + best_integer_count_error = integer_count_error; + best_integer_count = integer_count; + } + } + + int ql = quant_mode_table[best_integer_count][bits_available]; + int ql_mod = quant_mode_table[best_integer_count][bits_available + 8]; + + best_quant_level = static_cast(ql); + best_quant_level_mod = static_cast(ql_mod); + + if (ql >= QUANT_6) + { + for (int i = 0; i < 4; i++) + { + best_formats[i] = best_combined_format[ql][best_integer_count - 4][i]; + } + } + else + { + for (int i = 0; i < 4; i++) + { + best_formats[i] = FMT_LUMINANCE; + } + } + + return best_integer_count_error; +} + +/* See header for documentation. */ +unsigned int compute_ideal_endpoint_formats( + const partition_info& pi, + const image_block& blk, + const endpoints& ep, + // bitcounts and errors computed for the various quantization methods + const int8_t* qwt_bitcounts, + const float* qwt_errors, + unsigned int tune_candidate_limit, + unsigned int start_block_mode, + unsigned int end_block_mode, + // output data + uint8_t partition_format_specifiers[TUNE_MAX_TRIAL_CANDIDATES][BLOCK_MAX_PARTITIONS], + int block_mode[TUNE_MAX_TRIAL_CANDIDATES], + quant_method quant_level[TUNE_MAX_TRIAL_CANDIDATES], + quant_method quant_level_mod[TUNE_MAX_TRIAL_CANDIDATES], + compression_working_buffers& tmpbuf +) { + int partition_count = pi.partition_count; + + promise(partition_count > 0); + + bool encode_hdr_rgb = static_cast(blk.rgb_lns[0]); + bool encode_hdr_alpha = static_cast(blk.alpha_lns[0]); + + // Compute the errors that result from various encoding choices (such as using luminance instead + // of RGB, discarding Alpha, using RGB-scale in place of two separate RGB endpoints and so on) + encoding_choice_errors eci[BLOCK_MAX_PARTITIONS]; + compute_encoding_choice_errors(blk, pi, ep, eci); + + float best_error[BLOCK_MAX_PARTITIONS][21][4]; + uint8_t format_of_choice[BLOCK_MAX_PARTITIONS][21][4]; + for (int i = 0; i < partition_count; i++) + { + compute_color_error_for_every_integer_count_and_quant_level( + encode_hdr_rgb, encode_hdr_alpha, i, + pi, eci[i], ep, blk.channel_weight, best_error[i], + format_of_choice[i]); + } + + float* errors_of_best_combination = tmpbuf.errors_of_best_combination; + uint8_t* best_quant_levels = tmpbuf.best_quant_levels; + uint8_t* best_quant_levels_mod = tmpbuf.best_quant_levels_mod; + uint8_t (&best_ep_formats)[WEIGHTS_MAX_BLOCK_MODES][BLOCK_MAX_PARTITIONS] = tmpbuf.best_ep_formats; + + // Ensure that the first iteration understep contains data that will never be picked + vfloat clear_error(ERROR_CALC_DEFAULT); + vint clear_quant(0); + + size_t packed_start_block_mode = round_down_to_simd_multiple_vla(start_block_mode); + storea(clear_error, errors_of_best_combination + packed_start_block_mode); + store_nbytes(clear_quant, best_quant_levels + packed_start_block_mode); + store_nbytes(clear_quant, best_quant_levels_mod + packed_start_block_mode); + + // Ensure that last iteration overstep contains data that will never be picked + size_t packed_end_block_mode = round_down_to_simd_multiple_vla(end_block_mode - 1); + storea(clear_error, errors_of_best_combination + packed_end_block_mode); + store_nbytes(clear_quant, best_quant_levels + packed_end_block_mode); + store_nbytes(clear_quant, best_quant_levels_mod + packed_end_block_mode); + + // Track a scalar best to avoid expensive search at least once ... + float error_of_best_combination = ERROR_CALC_DEFAULT; + int index_of_best_combination = -1; + + // The block contains 1 partition + if (partition_count == 1) + { + for (unsigned int i = start_block_mode; i < end_block_mode; i++) + { + if (qwt_errors[i] >= ERROR_CALC_DEFAULT) + { + errors_of_best_combination[i] = ERROR_CALC_DEFAULT; + continue; + } + + float error_of_best = one_partition_find_best_combination_for_bitcount( + best_error[0], format_of_choice[0], qwt_bitcounts[i], + best_quant_levels[i], best_ep_formats[i][0]); + + float total_error = error_of_best + qwt_errors[i]; + errors_of_best_combination[i] = total_error; + best_quant_levels_mod[i] = best_quant_levels[i]; + + if (total_error < error_of_best_combination) + { + error_of_best_combination = total_error; + index_of_best_combination = i; + } + } + } + // The block contains 2 partitions + else if (partition_count == 2) + { + float combined_best_error[21][7]; + uint8_t formats_of_choice[21][7][2]; + + two_partitions_find_best_combination_for_every_quantization_and_integer_count( + best_error, format_of_choice, combined_best_error, formats_of_choice); + + assert(start_block_mode == 0); + for (unsigned int i = 0; i < end_block_mode; i++) + { + if (qwt_errors[i] >= ERROR_CALC_DEFAULT) + { + errors_of_best_combination[i] = ERROR_CALC_DEFAULT; + continue; + } + + float error_of_best = two_partitions_find_best_combination_for_bitcount( + combined_best_error, formats_of_choice, qwt_bitcounts[i], + best_quant_levels[i], best_quant_levels_mod[i], + best_ep_formats[i]); + + float total_error = error_of_best + qwt_errors[i]; + errors_of_best_combination[i] = total_error; + + if (total_error < error_of_best_combination) + { + error_of_best_combination = total_error; + index_of_best_combination = i; + } + } + } + // The block contains 3 partitions + else if (partition_count == 3) + { + float combined_best_error[21][10]; + uint8_t formats_of_choice[21][10][3]; + + three_partitions_find_best_combination_for_every_quantization_and_integer_count( + best_error, format_of_choice, combined_best_error, formats_of_choice); + + assert(start_block_mode == 0); + for (unsigned int i = 0; i < end_block_mode; i++) + { + if (qwt_errors[i] >= ERROR_CALC_DEFAULT) + { + errors_of_best_combination[i] = ERROR_CALC_DEFAULT; + continue; + } + + float error_of_best = three_partitions_find_best_combination_for_bitcount( + combined_best_error, formats_of_choice, qwt_bitcounts[i], + best_quant_levels[i], best_quant_levels_mod[i], + best_ep_formats[i]); + + float total_error = error_of_best + qwt_errors[i]; + errors_of_best_combination[i] = total_error; + + if (total_error < error_of_best_combination) + { + error_of_best_combination = total_error; + index_of_best_combination = i; + } + } + } + // The block contains 4 partitions + else // if (partition_count == 4) + { + assert(partition_count == 4); + float combined_best_error[21][13]; + uint8_t formats_of_choice[21][13][4]; + + four_partitions_find_best_combination_for_every_quantization_and_integer_count( + best_error, format_of_choice, combined_best_error, formats_of_choice); + + assert(start_block_mode == 0); + for (unsigned int i = 0; i < end_block_mode; i++) + { + if (qwt_errors[i] >= ERROR_CALC_DEFAULT) + { + errors_of_best_combination[i] = ERROR_CALC_DEFAULT; + continue; + } + + float error_of_best = four_partitions_find_best_combination_for_bitcount( + combined_best_error, formats_of_choice, qwt_bitcounts[i], + best_quant_levels[i], best_quant_levels_mod[i], + best_ep_formats[i]); + + float total_error = error_of_best + qwt_errors[i]; + errors_of_best_combination[i] = total_error; + + if (total_error < error_of_best_combination) + { + error_of_best_combination = total_error; + index_of_best_combination = i; + } + } + } + + int best_error_weights[TUNE_MAX_TRIAL_CANDIDATES]; + + // Fast path the first result and avoid the list search for trial 0 + best_error_weights[0] = index_of_best_combination; + if (index_of_best_combination >= 0) + { + errors_of_best_combination[index_of_best_combination] = ERROR_CALC_DEFAULT; + } + + // Search the remaining results and pick the best candidate modes for trial 1+ + for (unsigned int i = 1; i < tune_candidate_limit; i++) + { + vint vbest_error_index(-1); + vfloat vbest_ep_error(ERROR_CALC_DEFAULT); + + // TODO: This should use size_t for the inputs of start/end_block_mode + // to avoid some of this type conversion, but that propagates and will + // need a bigger PR to fix + size_t start_mode = round_down_to_simd_multiple_vla(start_block_mode); + vint lane_ids = vint::lane_id() + vint_from_size(start_mode); + for (size_t j = start_mode; j < end_block_mode; j += ASTCENC_SIMD_WIDTH) + { + vfloat err = vfloat(errors_of_best_combination + j); + vmask mask = err < vbest_ep_error; + vbest_ep_error = select(vbest_ep_error, err, mask); + vbest_error_index = select(vbest_error_index, lane_ids, mask); + lane_ids += vint(ASTCENC_SIMD_WIDTH); + } + + // Pick best mode from the SIMD result, using lowest matching index to ensure invariance + vmask lanes_min_error = vbest_ep_error == hmin(vbest_ep_error); + vbest_error_index = select(vint(0x7FFFFFFF), vbest_error_index, lanes_min_error); + + int best_error_index = hmin_s(vbest_error_index); + + best_error_weights[i] = best_error_index; + + // Max the error for this candidate so we don't pick it again + if (best_error_index >= 0) + { + errors_of_best_combination[best_error_index] = ERROR_CALC_DEFAULT; + } + // Early-out if no more candidates are valid + else + { + break; + } + } + + for (unsigned int i = 0; i < tune_candidate_limit; i++) + { + if (best_error_weights[i] < 0) + { + return i; + } + + block_mode[i] = best_error_weights[i]; + + quant_level[i] = static_cast(best_quant_levels[best_error_weights[i]]); + quant_level_mod[i] = static_cast(best_quant_levels_mod[best_error_weights[i]]); + + assert(quant_level[i] >= QUANT_6 && quant_level[i] <= QUANT_256); + assert(quant_level_mod[i] >= QUANT_6 && quant_level_mod[i] <= QUANT_256); + + for (int j = 0; j < partition_count; j++) + { + partition_format_specifiers[i][j] = best_ep_formats[best_error_weights[i]][j]; + } + } + + return tune_candidate_limit; +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_platform_isa_detection.cpp b/ktx/external/astc-encoder/Source/astcenc_platform_isa_detection.cpp new file mode 100644 index 0000000..4158da3 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_platform_isa_detection.cpp @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2020-2021 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Platform-specific function implementations. + * + * This module contains functions for querying the host extended ISA support. + */ + +// Include before the defines below to pick up any auto-setup based on compiler +// built-in config, if not being set explicitly by the build system +#include "astcenc_internal.h" + +#if (ASTCENC_SSE > 0) || (ASTCENC_AVX > 0) || \ + (ASTCENC_POPCNT > 0) || (ASTCENC_F16C > 0) + +static bool g_init { false }; + +/** Does this CPU support SSE 4.1? Set to -1 if not yet initialized. */ +static bool g_cpu_has_sse41 { false }; + +/** Does this CPU support AVX2? Set to -1 if not yet initialized. */ +static bool g_cpu_has_avx2 { false }; + +/** Does this CPU support POPCNT? Set to -1 if not yet initialized. */ +static bool g_cpu_has_popcnt { false }; + +/** Does this CPU support F16C? Set to -1 if not yet initialized. */ +static bool g_cpu_has_f16c { false }; + +/* ============================================================================ + Platform code for Visual Studio +============================================================================ */ +#if !defined(__clang__) && defined(_MSC_VER) +#define WIN32_LEAN_AND_MEAN +#include +#include + +/** + * @brief Detect platform CPU ISA support and update global trackers. + */ +static void detect_cpu_isa() +{ + int data[4]; + + __cpuid(data, 0); + int num_id = data[0]; + + if (num_id >= 1) + { + __cpuidex(data, 1, 0); + // SSE41 = Bank 1, ECX, bit 19 + g_cpu_has_sse41 = data[2] & (1 << 19) ? true : false; + // POPCNT = Bank 1, ECX, bit 23 + g_cpu_has_popcnt = data[2] & (1 << 23) ? true : false; + // F16C = Bank 1, ECX, bit 29 + g_cpu_has_f16c = data[2] & (1 << 29) ? true : false; + } + + if (num_id >= 7) + { + __cpuidex(data, 7, 0); + // AVX2 = Bank 7, EBX, bit 5 + g_cpu_has_avx2 = data[1] & (1 << 5) ? true : false; + } + + // Ensure state bits are updated before init flag is updated + MemoryBarrier(); + g_init = true; +} + +/* ============================================================================ + Platform code for GCC and Clang +============================================================================ */ +#else +#include + +/** + * @brief Detect platform CPU ISA support and update global trackers. + */ +static void detect_cpu_isa() +{ + unsigned int data[4]; + + if (__get_cpuid_count(1, 0, &data[0], &data[1], &data[2], &data[3])) + { + // SSE41 = Bank 1, ECX, bit 19 + g_cpu_has_sse41 = data[2] & (1 << 19) ? true : false; + // POPCNT = Bank 1, ECX, bit 23 + g_cpu_has_popcnt = data[2] & (1 << 23) ? true : false; + // F16C = Bank 1, ECX, bit 29 + g_cpu_has_f16c = data[2] & (1 << 29) ? true : false; + } + + g_cpu_has_avx2 = 0; + if (__get_cpuid_count(7, 0, &data[0], &data[1], &data[2], &data[3])) + { + // AVX2 = Bank 7, EBX, bit 5 + g_cpu_has_avx2 = data[1] & (1 << 5) ? true : false; + } + + // Ensure state bits are updated before init flag is updated + __sync_synchronize(); + g_init = true; +} +#endif + +/* See header for documentation. */ +bool cpu_supports_popcnt() +{ + if (!g_init) + { + detect_cpu_isa(); + } + + return g_cpu_has_popcnt; +} + +/* See header for documentation. */ +bool cpu_supports_f16c() +{ + if (!g_init) + { + detect_cpu_isa(); + } + + return g_cpu_has_f16c; +} + +/* See header for documentation. */ +bool cpu_supports_sse41() +{ + if (!g_init) + { + detect_cpu_isa(); + } + + return g_cpu_has_sse41; +} + +/* See header for documentation. */ +bool cpu_supports_avx2() +{ + if (!g_init) + { + detect_cpu_isa(); + } + + return g_cpu_has_avx2; +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_quantization.cpp b/ktx/external/astc-encoder/Source/astcenc_quantization.cpp new file mode 100644 index 0000000..84d758d --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_quantization.cpp @@ -0,0 +1,903 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2023 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions and data tables for numeric quantization.. + */ + +#include "astcenc_internal.h" + +#if !defined(ASTCENC_DECOMPRESS_ONLY) + +// Not scrambled, starts from QUANT_6 +const uint8_t color_unquant_to_uquant_tables[17][512] { + { // QUANT_6 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_8 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_12 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_16 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_20 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 201, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_24 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 222, 222, 222, 222, 222, 222, 222, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_32 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 222, 222, 222, 222, 222, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_40 + 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, + 158, 158, 158, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 190, 190, 190, 190, 190, 190, 190, 190, 190, + 190, 190, 190, 190, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 210, 210, + 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_48 + 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 158, 158, 158, 158, 158, 158, 158, 158, 158, + 158, 158, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 190, 190, 190, 190, 190, 190, 190, 190, + 190, 190, 190, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 207, 207, 207, 207, 207, 207, 207, + 207, 207, 207, 207, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_64 + 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, + 16, 16, 16, 16, 16, 20, 20, 20, 20, 20, 20, 20, 20, 24, 24, 24, 24, 24, 24, 24, 24, 28, 28, 28, 28, 28, 28, 28, 28, 32, 32, 32, + 32, 32, 32, 32, 32, 36, 36, 36, 36, 36, 36, 36, 36, 40, 40, 40, 40, 40, 40, 40, 40, 44, 44, 44, 44, 44, 44, 44, 44, 48, 48, 48, + 48, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 56, 56, 56, 56, 56, 56, 56, 56, 60, 60, 60, 60, 60, 60, 60, 60, 60, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 69, 69, 69, 69, 69, 69, 69, 69, 73, 73, 73, 73, 73, 73, 73, 73, 77, 77, 77, 77, 77, 77, 77, 77, 81, + 81, 81, 81, 81, 81, 81, 81, 85, 85, 85, 85, 85, 85, 85, 85, 89, 89, 89, 89, 89, 89, 89, 89, 93, 93, 93, 93, 93, 93, 93, 93, 97, + 97, 97, 97, 97, 97, 97, 97, 101, 101, 101, 101, 101, 101, 101, 101, 105, 105, 105, 105, 105, 105, 105, 105, 109, 109, 109, 109, 109, 109, 109, 109, 113, + 113, 113, 113, 113, 113, 113, 113, 117, 117, 117, 117, 117, 117, 117, 117, 121, 121, 121, 121, 121, 121, 121, 121, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 134, 134, 134, 134, 134, 134, 134, 134, 138, 138, 138, 138, 138, 138, 138, 138, 142, 142, 142, 142, 142, 142, 142, + 142, 146, 146, 146, 146, 146, 146, 146, 146, 150, 150, 150, 150, 150, 150, 150, 150, 154, 154, 154, 154, 154, 154, 154, 154, 158, 158, 158, 158, 158, 158, 158, + 158, 162, 162, 162, 162, 162, 162, 162, 162, 166, 166, 166, 166, 166, 166, 166, 166, 170, 170, 170, 170, 170, 170, 170, 170, 174, 174, 174, 174, 174, 174, 174, + 174, 178, 178, 178, 178, 178, 178, 178, 178, 182, 182, 182, 182, 182, 182, 182, 182, 186, 186, 186, 186, 186, 186, 186, 186, 190, 190, 190, 190, 190, 190, 190, + 190, 190, 195, 195, 195, 195, 195, 195, 195, 195, 195, 199, 199, 199, 199, 199, 199, 199, 199, 203, 203, 203, 203, 203, 203, 203, 203, 207, 207, 207, 207, 207, + 207, 207, 207, 211, 211, 211, 211, 211, 211, 211, 211, 215, 215, 215, 215, 215, 215, 215, 215, 219, 219, 219, 219, 219, 219, 219, 219, 223, 223, 223, 223, 223, + 223, 223, 223, 227, 227, 227, 227, 227, 227, 227, 227, 231, 231, 231, 231, 231, 231, 231, 231, 235, 235, 235, 235, 235, 235, 235, 235, 239, 239, 239, 239, 239, + 239, 239, 239, 243, 243, 243, 243, 243, 243, 243, 243, 247, 247, 247, 247, 247, 247, 247, 247, 251, 251, 251, 251, 251, 251, 251, 251, 255, 255, 255, 255, 255 + }, + { // QUANT_80 + 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 9, 9, 9, 9, 9, 9, 9, 13, 13, 13, 13, 13, 13, 13, 16, 16, + 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 22, 22, 22, 22, 22, 22, 25, 25, 25, 25, 25, 25, 25, 29, 29, 29, 29, 29, 29, 29, 32, 32, + 32, 32, 32, 32, 35, 35, 35, 35, 35, 35, 38, 38, 38, 38, 38, 38, 38, 42, 42, 42, 42, 42, 42, 42, 45, 45, 45, 45, 45, 45, 48, 48, + 48, 48, 48, 48, 51, 51, 51, 51, 51, 51, 54, 54, 54, 54, 54, 54, 54, 58, 58, 58, 58, 58, 58, 58, 61, 61, 61, 61, 61, 61, 64, 64, + 64, 64, 64, 64, 67, 67, 67, 67, 67, 67, 67, 71, 71, 71, 71, 71, 71, 71, 74, 74, 74, 74, 74, 74, 77, 77, 77, 77, 77, 77, 80, 80, + 80, 80, 80, 80, 83, 83, 83, 83, 83, 83, 83, 87, 87, 87, 87, 87, 87, 87, 90, 90, 90, 90, 90, 90, 93, 93, 93, 93, 93, 93, 96, 96, + 96, 96, 96, 96, 96, 100, 100, 100, 100, 100, 100, 100, 103, 103, 103, 103, 103, 103, 106, 106, 106, 106, 106, 106, 109, 109, 109, 109, 109, 109, 112, 112, + 112, 112, 112, 112, 112, 116, 116, 116, 116, 116, 116, 116, 119, 119, 119, 119, 119, 119, 122, 122, 122, 122, 122, 122, 125, 125, 125, 125, 125, 125, 125, 125, + 130, 130, 130, 130, 130, 130, 130, 130, 133, 133, 133, 133, 133, 133, 136, 136, 136, 136, 136, 136, 139, 139, 139, 139, 139, 139, 139, 143, 143, 143, 143, 143, + 143, 143, 146, 146, 146, 146, 146, 146, 149, 149, 149, 149, 149, 149, 152, 152, 152, 152, 152, 152, 155, 155, 155, 155, 155, 155, 155, 159, 159, 159, 159, 159, + 159, 159, 162, 162, 162, 162, 162, 162, 165, 165, 165, 165, 165, 165, 168, 168, 168, 168, 168, 168, 168, 172, 172, 172, 172, 172, 172, 172, 175, 175, 175, 175, + 175, 175, 178, 178, 178, 178, 178, 178, 181, 181, 181, 181, 181, 181, 184, 184, 184, 184, 184, 184, 184, 188, 188, 188, 188, 188, 188, 188, 191, 191, 191, 191, + 191, 191, 194, 194, 194, 194, 194, 194, 197, 197, 197, 197, 197, 197, 197, 201, 201, 201, 201, 201, 201, 201, 204, 204, 204, 204, 204, 204, 207, 207, 207, 207, + 207, 207, 210, 210, 210, 210, 210, 210, 213, 213, 213, 213, 213, 213, 213, 217, 217, 217, 217, 217, 217, 217, 220, 220, 220, 220, 220, 220, 223, 223, 223, 223, + 223, 223, 226, 226, 226, 226, 226, 226, 226, 230, 230, 230, 230, 230, 230, 230, 233, 233, 233, 233, 233, 233, 236, 236, 236, 236, 236, 236, 239, 239, 239, 239, + 239, 239, 242, 242, 242, 242, 242, 242, 242, 246, 246, 246, 246, 246, 246, 246, 249, 249, 249, 249, 249, 249, 252, 252, 252, 252, 252, 252, 255, 255, 255, 255 + }, + { // QUANT_96 + 0, 0, 0, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 16, 16, + 16, 16, 16, 18, 18, 18, 18, 18, 21, 21, 21, 21, 21, 21, 24, 24, 24, 24, 24, 26, 26, 26, 26, 26, 29, 29, 29, 29, 29, 29, 32, 32, + 32, 32, 32, 32, 35, 35, 35, 35, 35, 37, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 43, 43, 43, 43, 43, 45, 45, 45, 45, 45, 48, 48, + 48, 48, 48, 48, 51, 51, 51, 51, 51, 53, 53, 53, 53, 53, 56, 56, 56, 56, 56, 56, 59, 59, 59, 59, 59, 61, 61, 61, 61, 61, 64, 64, + 64, 64, 64, 64, 67, 67, 67, 67, 67, 67, 70, 70, 70, 70, 70, 72, 72, 72, 72, 72, 75, 75, 75, 75, 75, 75, 78, 78, 78, 78, 78, 80, + 80, 80, 80, 80, 83, 83, 83, 83, 83, 83, 86, 86, 86, 86, 86, 88, 88, 88, 88, 88, 91, 91, 91, 91, 91, 91, 94, 94, 94, 94, 94, 96, + 96, 96, 96, 96, 99, 99, 99, 99, 99, 99, 102, 102, 102, 102, 102, 104, 104, 104, 104, 104, 107, 107, 107, 107, 107, 107, 110, 110, 110, 110, 110, 112, + 112, 112, 112, 112, 115, 115, 115, 115, 115, 115, 118, 118, 118, 118, 118, 120, 120, 120, 120, 120, 123, 123, 123, 123, 123, 123, 126, 126, 126, 126, 126, 126, + 129, 129, 129, 129, 129, 129, 132, 132, 132, 132, 132, 132, 135, 135, 135, 135, 135, 137, 137, 137, 137, 137, 140, 140, 140, 140, 140, 140, 143, 143, 143, 143, + 143, 145, 145, 145, 145, 145, 148, 148, 148, 148, 148, 148, 151, 151, 151, 151, 151, 153, 153, 153, 153, 153, 156, 156, 156, 156, 156, 156, 159, 159, 159, 159, + 159, 161, 161, 161, 161, 161, 164, 164, 164, 164, 164, 164, 167, 167, 167, 167, 167, 169, 169, 169, 169, 169, 172, 172, 172, 172, 172, 172, 175, 175, 175, 175, + 175, 177, 177, 177, 177, 177, 180, 180, 180, 180, 180, 180, 183, 183, 183, 183, 183, 185, 185, 185, 185, 185, 188, 188, 188, 188, 188, 188, 191, 191, 191, 191, + 191, 191, 194, 194, 194, 194, 194, 196, 196, 196, 196, 196, 199, 199, 199, 199, 199, 199, 202, 202, 202, 202, 202, 204, 204, 204, 204, 204, 207, 207, 207, 207, + 207, 207, 210, 210, 210, 210, 210, 212, 212, 212, 212, 212, 215, 215, 215, 215, 215, 215, 218, 218, 218, 218, 218, 220, 220, 220, 220, 220, 223, 223, 223, 223, + 223, 223, 226, 226, 226, 226, 226, 226, 229, 229, 229, 229, 229, 231, 231, 231, 231, 231, 234, 234, 234, 234, 234, 234, 237, 237, 237, 237, 237, 239, 239, 239, + 239, 239, 242, 242, 242, 242, 242, 242, 245, 245, 245, 245, 245, 247, 247, 247, 247, 247, 250, 250, 250, 250, 250, 250, 253, 253, 253, 253, 253, 255, 255, 255 + }, + { // QUANT_128 + 0, 0, 0, 2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, 14, 14, 16, + 16, 16, 16, 18, 18, 18, 18, 20, 20, 20, 20, 22, 22, 22, 22, 24, 24, 24, 24, 26, 26, 26, 26, 28, 28, 28, 28, 30, 30, 30, 30, 32, + 32, 32, 32, 34, 34, 34, 34, 36, 36, 36, 36, 38, 38, 38, 38, 40, 40, 40, 40, 42, 42, 42, 42, 44, 44, 44, 44, 46, 46, 46, 46, 48, + 48, 48, 48, 50, 50, 50, 50, 52, 52, 52, 52, 54, 54, 54, 54, 56, 56, 56, 56, 58, 58, 58, 58, 60, 60, 60, 60, 62, 62, 62, 62, 64, + 64, 64, 64, 66, 66, 66, 66, 68, 68, 68, 68, 70, 70, 70, 70, 72, 72, 72, 72, 74, 74, 74, 74, 76, 76, 76, 76, 78, 78, 78, 78, 80, + 80, 80, 80, 82, 82, 82, 82, 84, 84, 84, 84, 86, 86, 86, 86, 88, 88, 88, 88, 90, 90, 90, 90, 92, 92, 92, 92, 94, 94, 94, 94, 96, + 96, 96, 96, 98, 98, 98, 98, 100, 100, 100, 100, 102, 102, 102, 102, 104, 104, 104, 104, 106, 106, 106, 106, 108, 108, 108, 108, 110, 110, 110, 110, 112, + 112, 112, 112, 114, 114, 114, 114, 116, 116, 116, 116, 118, 118, 118, 118, 120, 120, 120, 120, 122, 122, 122, 122, 124, 124, 124, 124, 126, 126, 126, 126, 126, + 129, 129, 129, 129, 129, 131, 131, 131, 131, 133, 133, 133, 133, 135, 135, 135, 135, 137, 137, 137, 137, 139, 139, 139, 139, 141, 141, 141, 141, 143, 143, 143, + 143, 145, 145, 145, 145, 147, 147, 147, 147, 149, 149, 149, 149, 151, 151, 151, 151, 153, 153, 153, 153, 155, 155, 155, 155, 157, 157, 157, 157, 159, 159, 159, + 159, 161, 161, 161, 161, 163, 163, 163, 163, 165, 165, 165, 165, 167, 167, 167, 167, 169, 169, 169, 169, 171, 171, 171, 171, 173, 173, 173, 173, 175, 175, 175, + 175, 177, 177, 177, 177, 179, 179, 179, 179, 181, 181, 181, 181, 183, 183, 183, 183, 185, 185, 185, 185, 187, 187, 187, 187, 189, 189, 189, 189, 191, 191, 191, + 191, 193, 193, 193, 193, 195, 195, 195, 195, 197, 197, 197, 197, 199, 199, 199, 199, 201, 201, 201, 201, 203, 203, 203, 203, 205, 205, 205, 205, 207, 207, 207, + 207, 209, 209, 209, 209, 211, 211, 211, 211, 213, 213, 213, 213, 215, 215, 215, 215, 217, 217, 217, 217, 219, 219, 219, 219, 221, 221, 221, 221, 223, 223, 223, + 223, 225, 225, 225, 225, 227, 227, 227, 227, 229, 229, 229, 229, 231, 231, 231, 231, 233, 233, 233, 233, 235, 235, 235, 235, 237, 237, 237, 237, 239, 239, 239, + 239, 241, 241, 241, 241, 243, 243, 243, 243, 245, 245, 245, 245, 247, 247, 247, 247, 249, 249, 249, 249, 251, 251, 251, 251, 253, 253, 253, 253, 255, 255, 255 + }, + { // QUANT_160 + 0, 0, 1, 1, 1, 3, 3, 3, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 9, 9, 9, 11, 11, 11, 12, 12, 12, 14, 14, 14, 14, 16, + 16, 16, 17, 17, 17, 19, 19, 19, 20, 20, 20, 22, 22, 22, 22, 24, 24, 24, 25, 25, 25, 27, 27, 27, 28, 28, 28, 30, 30, 30, 30, 32, + 32, 32, 33, 33, 33, 35, 35, 35, 36, 36, 36, 38, 38, 38, 38, 40, 40, 40, 41, 41, 41, 43, 43, 43, 44, 44, 44, 46, 46, 46, 46, 48, + 48, 48, 49, 49, 49, 51, 51, 51, 52, 52, 52, 54, 54, 54, 54, 56, 56, 56, 57, 57, 57, 59, 59, 59, 60, 60, 60, 62, 62, 62, 62, 64, + 64, 64, 65, 65, 65, 67, 67, 67, 68, 68, 68, 70, 70, 70, 70, 72, 72, 72, 73, 73, 73, 75, 75, 75, 76, 76, 76, 78, 78, 78, 78, 80, + 80, 80, 81, 81, 81, 83, 83, 83, 84, 84, 84, 86, 86, 86, 86, 88, 88, 88, 89, 89, 89, 91, 91, 91, 92, 92, 92, 94, 94, 94, 94, 96, + 96, 96, 97, 97, 97, 99, 99, 99, 100, 100, 100, 102, 102, 102, 102, 104, 104, 104, 105, 105, 105, 107, 107, 107, 108, 108, 108, 110, 110, 110, 110, 112, + 112, 112, 113, 113, 113, 115, 115, 115, 116, 116, 116, 118, 118, 118, 118, 120, 120, 120, 121, 121, 121, 123, 123, 123, 124, 124, 124, 126, 126, 126, 126, 126, + 129, 129, 129, 129, 129, 131, 131, 131, 132, 132, 132, 134, 134, 134, 135, 135, 135, 137, 137, 137, 137, 139, 139, 139, 140, 140, 140, 142, 142, 142, 143, 143, + 143, 145, 145, 145, 145, 147, 147, 147, 148, 148, 148, 150, 150, 150, 151, 151, 151, 153, 153, 153, 153, 155, 155, 155, 156, 156, 156, 158, 158, 158, 159, 159, + 159, 161, 161, 161, 161, 163, 163, 163, 164, 164, 164, 166, 166, 166, 167, 167, 167, 169, 169, 169, 169, 171, 171, 171, 172, 172, 172, 174, 174, 174, 175, 175, + 175, 177, 177, 177, 177, 179, 179, 179, 180, 180, 180, 182, 182, 182, 183, 183, 183, 185, 185, 185, 185, 187, 187, 187, 188, 188, 188, 190, 190, 190, 191, 191, + 191, 193, 193, 193, 193, 195, 195, 195, 196, 196, 196, 198, 198, 198, 199, 199, 199, 201, 201, 201, 201, 203, 203, 203, 204, 204, 204, 206, 206, 206, 207, 207, + 207, 209, 209, 209, 209, 211, 211, 211, 212, 212, 212, 214, 214, 214, 215, 215, 215, 217, 217, 217, 217, 219, 219, 219, 220, 220, 220, 222, 222, 222, 223, 223, + 223, 225, 225, 225, 225, 227, 227, 227, 228, 228, 228, 230, 230, 230, 231, 231, 231, 233, 233, 233, 233, 235, 235, 235, 236, 236, 236, 238, 238, 238, 239, 239, + 239, 241, 241, 241, 241, 243, 243, 243, 244, 244, 244, 246, 246, 246, 247, 247, 247, 249, 249, 249, 249, 251, 251, 251, 252, 252, 252, 254, 254, 254, 255, 255 + }, + { // QUANT_192 + 0, 0, 1, 1, 2, 2, 2, 4, 4, 4, 5, 5, 6, 6, 6, 8, 8, 8, 9, 9, 10, 10, 10, 12, 12, 12, 13, 13, 14, 14, 14, 16, + 16, 16, 17, 17, 18, 18, 18, 20, 20, 20, 21, 21, 22, 22, 22, 24, 24, 24, 25, 25, 26, 26, 26, 28, 28, 28, 29, 29, 30, 30, 30, 32, + 32, 32, 33, 33, 34, 34, 34, 36, 36, 36, 37, 37, 38, 38, 38, 40, 40, 40, 41, 41, 42, 42, 42, 44, 44, 44, 45, 45, 46, 46, 46, 48, + 48, 48, 49, 49, 50, 50, 50, 52, 52, 52, 53, 53, 54, 54, 54, 56, 56, 56, 57, 57, 58, 58, 58, 60, 60, 60, 61, 61, 62, 62, 62, 64, + 64, 64, 65, 65, 66, 66, 66, 68, 68, 68, 69, 69, 70, 70, 70, 72, 72, 72, 73, 73, 74, 74, 74, 76, 76, 76, 77, 77, 78, 78, 78, 80, + 80, 80, 81, 81, 82, 82, 82, 84, 84, 84, 85, 85, 86, 86, 86, 88, 88, 88, 89, 89, 90, 90, 90, 92, 92, 92, 93, 93, 94, 94, 94, 96, + 96, 96, 97, 97, 98, 98, 98, 100, 100, 100, 101, 101, 102, 102, 102, 104, 104, 104, 105, 105, 106, 106, 106, 108, 108, 108, 109, 109, 110, 110, 110, 112, + 112, 112, 113, 113, 114, 114, 114, 116, 116, 116, 117, 117, 118, 118, 118, 120, 120, 120, 121, 121, 122, 122, 122, 124, 124, 124, 125, 125, 126, 126, 126, 126, + 129, 129, 129, 129, 130, 130, 131, 131, 131, 133, 133, 133, 134, 134, 135, 135, 135, 137, 137, 137, 138, 138, 139, 139, 139, 141, 141, 141, 142, 142, 143, 143, + 143, 145, 145, 145, 146, 146, 147, 147, 147, 149, 149, 149, 150, 150, 151, 151, 151, 153, 153, 153, 154, 154, 155, 155, 155, 157, 157, 157, 158, 158, 159, 159, + 159, 161, 161, 161, 162, 162, 163, 163, 163, 165, 165, 165, 166, 166, 167, 167, 167, 169, 169, 169, 170, 170, 171, 171, 171, 173, 173, 173, 174, 174, 175, 175, + 175, 177, 177, 177, 178, 178, 179, 179, 179, 181, 181, 181, 182, 182, 183, 183, 183, 185, 185, 185, 186, 186, 187, 187, 187, 189, 189, 189, 190, 190, 191, 191, + 191, 193, 193, 193, 194, 194, 195, 195, 195, 197, 197, 197, 198, 198, 199, 199, 199, 201, 201, 201, 202, 202, 203, 203, 203, 205, 205, 205, 206, 206, 207, 207, + 207, 209, 209, 209, 210, 210, 211, 211, 211, 213, 213, 213, 214, 214, 215, 215, 215, 217, 217, 217, 218, 218, 219, 219, 219, 221, 221, 221, 222, 222, 223, 223, + 223, 225, 225, 225, 226, 226, 227, 227, 227, 229, 229, 229, 230, 230, 231, 231, 231, 233, 233, 233, 234, 234, 235, 235, 235, 237, 237, 237, 238, 238, 239, 239, + 239, 241, 241, 241, 242, 242, 243, 243, 243, 245, 245, 245, 246, 246, 247, 247, 247, 249, 249, 249, 250, 250, 251, 251, 251, 253, 253, 253, 254, 254, 255, 255 + }, + { // QUANT_256 + 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, + 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, + 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, + 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, + 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, + 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, + 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, + 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 127, + 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, 133, 133, 134, 134, 135, 135, 136, 136, 137, 137, 138, 138, 139, 139, 140, 140, 141, 141, 142, 142, 143, 143, + 144, 144, 145, 145, 146, 146, 147, 147, 148, 148, 149, 149, 150, 150, 151, 151, 152, 152, 153, 153, 154, 154, 155, 155, 156, 156, 157, 157, 158, 158, 159, 159, + 160, 160, 161, 161, 162, 162, 163, 163, 164, 164, 165, 165, 166, 166, 167, 167, 168, 168, 169, 169, 170, 170, 171, 171, 172, 172, 173, 173, 174, 174, 175, 175, + 176, 176, 177, 177, 178, 178, 179, 179, 180, 180, 181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 190, 191, 191, + 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, + 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, + 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 239, + 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255 + }, +}; + +// Starts from QUANT_6 +// Scrambled +const uint8_t color_uquant_to_scrambled_pquant_tables[17][256] { + { // QUANT_6 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + }, + { // QUANT_8 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 + }, + { // QUANT_10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + }, + { // QUANT_12 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + }, + { // QUANT_16 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15 + }, + { // QUANT_20 + 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1 + }, + { // QUANT_24 + 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1 + }, + { // QUANT_32 + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, + 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, + 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, + 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, + 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, + 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, + 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, + 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, + 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, + 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31 + }, + { // QUANT_40 + 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, + 24, 24, 24, 24, 24, 24, 24, 32, 32, 32, 32, 32, 32, 32, 2, 2, + 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 18, 18, 18, 18, 18, 18, + 18, 26, 26, 26, 26, 26, 26, 34, 34, 34, 34, 34, 34, 34, 4, 4, + 4, 4, 4, 4, 12, 12, 12, 12, 12, 12, 12, 20, 20, 20, 20, 20, + 20, 28, 28, 28, 28, 28, 28, 28, 36, 36, 36, 36, 36, 36, 36, 6, + 6, 6, 6, 6, 6, 14, 14, 14, 14, 14, 14, 22, 22, 22, 22, 22, + 22, 22, 30, 30, 30, 30, 30, 30, 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 39, 39, 39, 39, 39, 39, 31, 31, 31, 31, 31, 31, 23, 23, + 23, 23, 23, 23, 23, 15, 15, 15, 15, 15, 15, 7, 7, 7, 7, 7, + 7, 37, 37, 37, 37, 37, 37, 37, 29, 29, 29, 29, 29, 29, 29, 21, + 21, 21, 21, 21, 21, 13, 13, 13, 13, 13, 13, 13, 5, 5, 5, 5, + 5, 5, 35, 35, 35, 35, 35, 35, 35, 27, 27, 27, 27, 27, 27, 19, + 19, 19, 19, 19, 19, 19, 11, 11, 11, 11, 11, 11, 3, 3, 3, 3, + 3, 3, 33, 33, 33, 33, 33, 33, 33, 25, 25, 25, 25, 25, 25, 25, + 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1 + }, + { // QUANT_48 + 0, 0, 0, 16, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 2, 2, + 2, 2, 2, 18, 18, 18, 18, 18, 34, 34, 34, 34, 34, 34, 4, 4, + 4, 4, 4, 20, 20, 20, 20, 20, 20, 36, 36, 36, 36, 36, 6, 6, + 6, 6, 6, 22, 22, 22, 22, 22, 22, 38, 38, 38, 38, 38, 38, 8, + 8, 8, 8, 8, 24, 24, 24, 24, 24, 40, 40, 40, 40, 40, 40, 10, + 10, 10, 10, 10, 26, 26, 26, 26, 26, 42, 42, 42, 42, 42, 42, 12, + 12, 12, 12, 12, 28, 28, 28, 28, 28, 28, 44, 44, 44, 44, 44, 14, + 14, 14, 14, 14, 30, 30, 30, 30, 30, 30, 46, 46, 46, 46, 46, 46, + 47, 47, 47, 47, 47, 47, 31, 31, 31, 31, 31, 31, 15, 15, 15, 15, + 15, 45, 45, 45, 45, 45, 29, 29, 29, 29, 29, 29, 13, 13, 13, 13, + 13, 43, 43, 43, 43, 43, 43, 27, 27, 27, 27, 27, 11, 11, 11, 11, + 11, 41, 41, 41, 41, 41, 41, 25, 25, 25, 25, 25, 9, 9, 9, 9, + 9, 39, 39, 39, 39, 39, 39, 23, 23, 23, 23, 23, 23, 7, 7, 7, + 7, 7, 37, 37, 37, 37, 37, 21, 21, 21, 21, 21, 21, 5, 5, 5, + 5, 5, 35, 35, 35, 35, 35, 35, 19, 19, 19, 19, 19, 3, 3, 3, + 3, 3, 33, 33, 33, 33, 33, 33, 17, 17, 17, 17, 17, 1, 1, 1 + }, + { // QUANT_64 + 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, + 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, + 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, + 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, + 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, + 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, + 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, + 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, + 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, + 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, + 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, + 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, + 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, + 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, + 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, + 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63 + }, + { // QUANT_80 + 0, 0, 16, 16, 16, 32, 32, 32, 48, 48, 48, 64, 64, 64, 64, 2, + 2, 2, 18, 18, 18, 34, 34, 34, 50, 50, 50, 66, 66, 66, 66, 4, + 4, 4, 20, 20, 20, 36, 36, 36, 52, 52, 52, 52, 68, 68, 68, 6, + 6, 6, 22, 22, 22, 38, 38, 38, 54, 54, 54, 54, 70, 70, 70, 8, + 8, 8, 24, 24, 24, 40, 40, 40, 40, 56, 56, 56, 72, 72, 72, 10, + 10, 10, 26, 26, 26, 42, 42, 42, 42, 58, 58, 58, 74, 74, 74, 12, + 12, 12, 28, 28, 28, 28, 44, 44, 44, 60, 60, 60, 76, 76, 76, 14, + 14, 14, 30, 30, 30, 30, 46, 46, 46, 62, 62, 62, 78, 78, 78, 78, + 79, 79, 79, 79, 63, 63, 63, 47, 47, 47, 31, 31, 31, 31, 15, 15, + 15, 77, 77, 77, 61, 61, 61, 45, 45, 45, 29, 29, 29, 29, 13, 13, + 13, 75, 75, 75, 59, 59, 59, 43, 43, 43, 43, 27, 27, 27, 11, 11, + 11, 73, 73, 73, 57, 57, 57, 41, 41, 41, 41, 25, 25, 25, 9, 9, + 9, 71, 71, 71, 55, 55, 55, 55, 39, 39, 39, 23, 23, 23, 7, 7, + 7, 69, 69, 69, 53, 53, 53, 53, 37, 37, 37, 21, 21, 21, 5, 5, + 5, 67, 67, 67, 67, 51, 51, 51, 35, 35, 35, 19, 19, 19, 3, 3, + 3, 65, 65, 65, 65, 49, 49, 49, 33, 33, 33, 17, 17, 17, 1, 1 + }, + { // QUANT_96 + 0, 32, 32, 32, 64, 64, 64, 2, 2, 34, 34, 34, 66, 66, 66, 4, + 4, 36, 36, 36, 68, 68, 68, 6, 6, 38, 38, 38, 70, 70, 70, 8, + 8, 8, 40, 40, 72, 72, 72, 10, 10, 10, 42, 42, 74, 74, 74, 12, + 12, 12, 44, 44, 76, 76, 76, 14, 14, 14, 46, 46, 78, 78, 78, 16, + 16, 16, 48, 48, 48, 80, 80, 80, 18, 18, 50, 50, 50, 82, 82, 82, + 20, 20, 52, 52, 52, 84, 84, 84, 22, 22, 54, 54, 54, 86, 86, 86, + 24, 24, 56, 56, 56, 88, 88, 88, 26, 26, 58, 58, 58, 90, 90, 90, + 28, 28, 60, 60, 60, 92, 92, 92, 30, 30, 62, 62, 62, 94, 94, 94, + 95, 95, 95, 63, 63, 63, 31, 31, 93, 93, 93, 61, 61, 61, 29, 29, + 91, 91, 91, 59, 59, 59, 27, 27, 89, 89, 89, 57, 57, 57, 25, 25, + 87, 87, 87, 55, 55, 55, 23, 23, 85, 85, 85, 53, 53, 53, 21, 21, + 83, 83, 83, 51, 51, 51, 19, 19, 81, 81, 81, 49, 49, 49, 17, 17, + 17, 79, 79, 79, 47, 47, 15, 15, 15, 77, 77, 77, 45, 45, 13, 13, + 13, 75, 75, 75, 43, 43, 11, 11, 11, 73, 73, 73, 41, 41, 9, 9, + 9, 71, 71, 71, 39, 39, 39, 7, 7, 69, 69, 69, 37, 37, 37, 5, + 5, 67, 67, 67, 35, 35, 35, 3, 3, 65, 65, 65, 33, 33, 33, 1 + }, + { // QUANT_128 + 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, + 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, + 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, + 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, + 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, + 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, + 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, + 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 63, + 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, + 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, + 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, + 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, + 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, + 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, + 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, + 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 127 + }, + { // QUANT_160 + 0, 32, 64, 64, 96, 128, 128, 128, 2, 34, 66, 66, 98, 130, 130, 130, + 4, 36, 68, 68, 100, 132, 132, 132, 6, 38, 70, 70, 102, 134, 134, 134, + 8, 40, 72, 72, 104, 136, 136, 136, 10, 42, 74, 74, 106, 138, 138, 138, + 12, 44, 76, 76, 108, 140, 140, 140, 14, 46, 78, 78, 110, 142, 142, 142, + 16, 48, 80, 80, 112, 144, 144, 144, 18, 50, 82, 82, 114, 146, 146, 146, + 20, 52, 84, 84, 116, 148, 148, 148, 22, 54, 86, 86, 118, 150, 150, 150, + 24, 56, 88, 88, 120, 152, 152, 152, 26, 58, 90, 90, 122, 154, 154, 154, + 28, 60, 92, 92, 124, 156, 156, 156, 30, 62, 94, 94, 126, 158, 158, 158, + 159, 159, 159, 127, 95, 95, 63, 31, 157, 157, 157, 125, 93, 93, 61, 29, + 155, 155, 155, 123, 91, 91, 59, 27, 153, 153, 153, 121, 89, 89, 57, 25, + 151, 151, 151, 119, 87, 87, 55, 23, 149, 149, 149, 117, 85, 85, 53, 21, + 147, 147, 147, 115, 83, 83, 51, 19, 145, 145, 145, 113, 81, 81, 49, 17, + 143, 143, 143, 111, 79, 79, 47, 15, 141, 141, 141, 109, 77, 77, 45, 13, + 139, 139, 139, 107, 75, 75, 43, 11, 137, 137, 137, 105, 73, 73, 41, 9, + 135, 135, 135, 103, 71, 71, 39, 7, 133, 133, 133, 101, 69, 69, 37, 5, + 131, 131, 131, 99, 67, 67, 35, 3, 129, 129, 129, 97, 65, 65, 33, 1 + }, + { // QUANT_192 + 0, 64, 128, 128, 2, 66, 130, 130, 4, 68, 132, 132, 6, 70, 134, 134, + 8, 72, 136, 136, 10, 74, 138, 138, 12, 76, 140, 140, 14, 78, 142, 142, + 16, 80, 144, 144, 18, 82, 146, 146, 20, 84, 148, 148, 22, 86, 150, 150, + 24, 88, 152, 152, 26, 90, 154, 154, 28, 92, 156, 156, 30, 94, 158, 158, + 32, 96, 160, 160, 34, 98, 162, 162, 36, 100, 164, 164, 38, 102, 166, 166, + 40, 104, 168, 168, 42, 106, 170, 170, 44, 108, 172, 172, 46, 110, 174, 174, + 48, 112, 176, 176, 50, 114, 178, 178, 52, 116, 180, 180, 54, 118, 182, 182, + 56, 120, 184, 184, 58, 122, 186, 186, 60, 124, 188, 188, 62, 126, 190, 190, + 191, 191, 127, 63, 189, 189, 125, 61, 187, 187, 123, 59, 185, 185, 121, 57, + 183, 183, 119, 55, 181, 181, 117, 53, 179, 179, 115, 51, 177, 177, 113, 49, + 175, 175, 111, 47, 173, 173, 109, 45, 171, 171, 107, 43, 169, 169, 105, 41, + 167, 167, 103, 39, 165, 165, 101, 37, 163, 163, 99, 35, 161, 161, 97, 33, + 159, 159, 95, 31, 157, 157, 93, 29, 155, 155, 91, 27, 153, 153, 89, 25, + 151, 151, 87, 23, 149, 149, 85, 21, 147, 147, 83, 19, 145, 145, 81, 17, + 143, 143, 79, 15, 141, 141, 77, 13, 139, 139, 75, 11, 137, 137, 73, 9, + 135, 135, 71, 7, 133, 133, 69, 5, 131, 131, 67, 3, 129, 129, 65, 1 + }, + { // QUANT_256 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 + } +}; + +#endif + +// Starts from QUANT_6 +// Scrambled +static const uint8_t color_scrambled_pquant_to_uquant_q6[6] { + 0, 255, 51, 204, 102, 153 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q8[8] { + 0, 36, 73, 109, 146, 182, 219, 255 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q10[10] { + 0, 255, 28, 227, 56, 199, 84, 171, 113, 142 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q12[12] { + 0, 255, 69, 186, 23, 232, 92, 163, 46, 209, 116, 139 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q16[16] { + 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q20[20] { + 0, 255, 67, 188, 13, 242, 80, 175, 27, 228, 94, 161, 40, 215, 107, 148, + 54, 201, 121, 134 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q24[24] { + 0, 255, 33, 222, 66, 189, 99, 156, 11, 244, 44, 211, 77, 178, 110, 145, + 22, 233, 55, 200, 88, 167, 121, 134 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q32[32] { + 0, 8, 16, 24, 33, 41, 49, 57, 66, 74, 82, 90, 99, 107, 115, 123, + 132, 140, 148, 156, 165, 173, 181, 189, 198, 206, 214, 222, 231, 239, 247, 255 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q40[40] { + 0, 255, 32, 223, 65, 190, 97, 158, 6, 249, 39, 216, 71, 184, 104, 151, + 13, 242, 45, 210, 78, 177, 110, 145, 19, 236, 52, 203, 84, 171, 117, 138, + 26, 229, 58, 197, 91, 164, 123, 132 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q48[48] { + 0, 255, 16, 239, 32, 223, 48, 207, 65, 190, 81, 174, 97, 158, 113, 142, + 5, 250, 21, 234, 38, 217, 54, 201, 70, 185, 86, 169, 103, 152, 119, 136, + 11, 244, 27, 228, 43, 212, 59, 196, 76, 179, 92, 163, 108, 147, 124, 131 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q64[64] { + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, + 65, 69, 73, 77, 81, 85, 89, 93, 97, 101, 105, 109, 113, 117, 121, 125, + 130, 134, 138, 142, 146, 150, 154, 158, 162, 166, 170, 174, 178, 182, 186, 190, + 195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 255, +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q80[80] { + 0, 255, 16, 239, 32, 223, 48, 207, 64, 191, 80, 175, 96, 159, 112, 143, + 3, 252, 19, 236, 35, 220, 51, 204, 67, 188, 83, 172, 100, 155, 116, 139, + 6, 249, 22, 233, 38, 217, 54, 201, 71, 184, 87, 168, 103, 152, 119, 136, + 9, 246, 25, 230, 42, 213, 58, 197, 74, 181, 90, 165, 106, 149, 122, 133, + 13, 242, 29, 226, 45, 210, 61, 194, 77, 178, 93, 162, 109, 146, 125, 130 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q96[96] { + 0, 255, 8, 247, 16, 239, 24, 231, 32, 223, 40, 215, 48, 207, 56, 199, + 64, 191, 72, 183, 80, 175, 88, 167, 96, 159, 104, 151, 112, 143, 120, 135, + 2, 253, 10, 245, 18, 237, 26, 229, 35, 220, 43, 212, 51, 204, 59, 196, + 67, 188, 75, 180, 83, 172, 91, 164, 99, 156, 107, 148, 115, 140, 123, 132, + 5, 250, 13, 242, 21, 234, 29, 226, 37, 218, 45, 210, 53, 202, 61, 194, + 70, 185, 78, 177, 86, 169, 94, 161, 102, 153, 110, 145, 118, 137, 126, 129 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q128[128] { + 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, + 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, + 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, + 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, + 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, + 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, + 193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, + 225, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q160[160] { + 0, 255, 8, 247, 16, 239, 24, 231, 32, 223, 40, 215, 48, 207, 56, 199, + 64, 191, 72, 183, 80, 175, 88, 167, 96, 159, 104, 151, 112, 143, 120, 135, + 1, 254, 9, 246, 17, 238, 25, 230, 33, 222, 41, 214, 49, 206, 57, 198, + 65, 190, 73, 182, 81, 174, 89, 166, 97, 158, 105, 150, 113, 142, 121, 134, + 3, 252, 11, 244, 19, 236, 27, 228, 35, 220, 43, 212, 51, 204, 59, 196, + 67, 188, 75, 180, 83, 172, 91, 164, 99, 156, 107, 148, 115, 140, 123, 132, + 4, 251, 12, 243, 20, 235, 28, 227, 36, 219, 44, 211, 52, 203, 60, 195, + 68, 187, 76, 179, 84, 171, 92, 163, 100, 155, 108, 147, 116, 139, 124, 131, + 6, 249, 14, 241, 22, 233, 30, 225, 38, 217, 46, 209, 54, 201, 62, 193, + 70, 185, 78, 177, 86, 169, 94, 161, 102, 153, 110, 145, 118, 137, 126, 129 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q192[192] { + 0, 255, 4, 251, 8, 247, 12, 243, 16, 239, 20, 235, 24, 231, 28, 227, + 32, 223, 36, 219, 40, 215, 44, 211, 48, 207, 52, 203, 56, 199, 60, 195, + 64, 191, 68, 187, 72, 183, 76, 179, 80, 175, 84, 171, 88, 167, 92, 163, + 96, 159, 100, 155, 104, 151, 108, 147, 112, 143, 116, 139, 120, 135, 124, 131, + 1, 254, 5, 250, 9, 246, 13, 242, 17, 238, 21, 234, 25, 230, 29, 226, + 33, 222, 37, 218, 41, 214, 45, 210, 49, 206, 53, 202, 57, 198, 61, 194, + 65, 190, 69, 186, 73, 182, 77, 178, 81, 174, 85, 170, 89, 166, 93, 162, + 97, 158, 101, 154, 105, 150, 109, 146, 113, 142, 117, 138, 121, 134, 125, 130, + 2, 253, 6, 249, 10, 245, 14, 241, 18, 237, 22, 233, 26, 229, 30, 225, + 34, 221, 38, 217, 42, 213, 46, 209, 50, 205, 54, 201, 58, 197, 62, 193, + 66, 189, 70, 185, 74, 181, 78, 177, 82, 173, 86, 169, 90, 165, 94, 161, + 98, 157, 102, 153, 106, 149, 110, 145, 114, 141, 118, 137, 122, 133, 126, 129 +}; + +static const uint8_t color_scrambled_pquant_to_uquant_q256[256] { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 +}; + +const uint8_t* color_scrambled_pquant_to_uquant_tables[17] { + color_scrambled_pquant_to_uquant_q6, + color_scrambled_pquant_to_uquant_q8, + color_scrambled_pquant_to_uquant_q10, + color_scrambled_pquant_to_uquant_q12, + color_scrambled_pquant_to_uquant_q16, + color_scrambled_pquant_to_uquant_q20, + color_scrambled_pquant_to_uquant_q24, + color_scrambled_pquant_to_uquant_q32, + color_scrambled_pquant_to_uquant_q40, + color_scrambled_pquant_to_uquant_q48, + color_scrambled_pquant_to_uquant_q64, + color_scrambled_pquant_to_uquant_q80, + color_scrambled_pquant_to_uquant_q96, + color_scrambled_pquant_to_uquant_q128, + color_scrambled_pquant_to_uquant_q160, + color_scrambled_pquant_to_uquant_q192, + color_scrambled_pquant_to_uquant_q256 +}; + +// The quant_mode_table[integer_count/2][bits] gives us the quantization level for a given integer +// count and number of bits that the integer may fit into. +const int8_t quant_mode_table[10][128] { + { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + }, + { + -1, -1, 0, 0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 15, 17, 18, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 + }, + { + -1, -1, -1, -1, 0, 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, + 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 + }, + { + -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, + 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 + }, + { + -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, + 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, + 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 19, 19, 19, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 + }, + { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, + 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 10, 10, + 10, 10, 11, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, + 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 19, 19, 19, 19, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 + }, + { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, + 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, + 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, + 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 + }, + { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, + 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, + 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, + 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, + 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 19, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 + }, + { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, + 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, + 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19 + }, + { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, + 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, + 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, + 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 17, 17 + } +}; diff --git a/ktx/external/astc-encoder/Source/astcenc_symbolic_physical.cpp b/ktx/external/astc-encoder/Source/astcenc_symbolic_physical.cpp new file mode 100644 index 0000000..45d9abb --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_symbolic_physical.cpp @@ -0,0 +1,544 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2023 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for converting between symbolic and physical encodings. + */ + +#include "astcenc_internal.h" + +#include + +/** + * @brief Reverse bits in a byte. + * + * @param p The value to reverse. + * + * @return The reversed result. + */ +static inline int bitrev8(int p) +{ + p = ((p & 0x0F) << 4) | ((p >> 4) & 0x0F); + p = ((p & 0x33) << 2) | ((p >> 2) & 0x33); + p = ((p & 0x55) << 1) | ((p >> 1) & 0x55); + return p; +} + + +/** + * @brief Read up to 8 bits at an arbitrary bit offset. + * + * The stored value is at most 8 bits, but can be stored at an offset of between 0 and 7 bits so may + * span two separate bytes in memory. + * + * @param bitcount The number of bits to read. + * @param bitoffset The bit offset to read from, between 0 and 7. + * @param[in,out] ptr The data pointer to read from. + * + * @return The read value. + */ +static inline int read_bits( + int bitcount, + int bitoffset, + const uint8_t* ptr +) { + int mask = (1 << bitcount) - 1; + ptr += bitoffset >> 3; + bitoffset &= 7; + int value = ptr[0] | (ptr[1] << 8); + value >>= bitoffset; + value &= mask; + return value; +} + +#if !defined(ASTCENC_DECOMPRESS_ONLY) + +/** + * @brief Write up to 8 bits at an arbitrary bit offset. + * + * The stored value is at most 8 bits, but can be stored at an offset of between 0 and 7 bits so + * may span two separate bytes in memory. + * + * @param value The value to write. + * @param bitcount The number of bits to write, starting from LSB. + * @param bitoffset The bit offset to store at, between 0 and 7. + * @param[in,out] ptr The data pointer to write to. + */ +static inline void write_bits( + int value, + int bitcount, + int bitoffset, + uint8_t* ptr +) { + int mask = (1 << bitcount) - 1; + value &= mask; + ptr += bitoffset >> 3; + bitoffset &= 7; + value <<= bitoffset; + mask <<= bitoffset; + mask = ~mask; + + ptr[0] &= mask; + ptr[0] |= value; + ptr[1] &= mask >> 8; + ptr[1] |= value >> 8; +} + +/* See header for documentation. */ +void symbolic_to_physical( + const block_size_descriptor& bsd, + const symbolic_compressed_block& scb, + uint8_t pcb[16] +) { + assert(scb.block_type != SYM_BTYPE_ERROR); + + // Constant color block using UNORM16 colors + if (scb.block_type == SYM_BTYPE_CONST_U16) + { + // There is currently no attempt to coalesce larger void-extents + static const uint8_t cbytes[8] { 0xFC, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + for (unsigned int i = 0; i < 8; i++) + { + pcb[i] = cbytes[i]; + } + + for (unsigned int i = 0; i < BLOCK_MAX_COMPONENTS; i++) + { + pcb[2 * i + 8] = scb.constant_color[i] & 0xFF; + pcb[2 * i + 9] = (scb.constant_color[i] >> 8) & 0xFF; + } + + return; + } + + // Constant color block using FP16 colors + if (scb.block_type == SYM_BTYPE_CONST_F16) + { + // There is currently no attempt to coalesce larger void-extents + static const uint8_t cbytes[8] { 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + for (unsigned int i = 0; i < 8; i++) + { + pcb[i] = cbytes[i]; + } + + for (unsigned int i = 0; i < BLOCK_MAX_COMPONENTS; i++) + { + pcb[2 * i + 8] = scb.constant_color[i] & 0xFF; + pcb[2 * i + 9] = (scb.constant_color[i] >> 8) & 0xFF; + } + + return; + } + + unsigned int partition_count = scb.partition_count; + + // Compress the weights. + // They are encoded as an ordinary integer-sequence, then bit-reversed + uint8_t weightbuf[16] { 0 }; + + const auto& bm = bsd.get_block_mode(scb.block_mode); + const auto& di = bsd.get_decimation_info(bm.decimation_mode); + int weight_count = di.weight_count; + quant_method weight_quant_method = bm.get_weight_quant_mode(); + float weight_quant_levels = static_cast(get_quant_level(weight_quant_method)); + int is_dual_plane = bm.is_dual_plane; + + const auto& qat = quant_and_xfer_tables[weight_quant_method]; + + int real_weight_count = is_dual_plane ? 2 * weight_count : weight_count; + + int bits_for_weights = get_ise_sequence_bitcount(real_weight_count, weight_quant_method); + + uint8_t weights[64]; + if (is_dual_plane) + { + for (int i = 0; i < weight_count; i++) + { + float uqw = static_cast(scb.weights[i]); + float qw = (uqw / 64.0f) * (weight_quant_levels - 1.0f); + int qwi = static_cast(qw + 0.5f); + weights[2 * i] = qat.scramble_map[qwi]; + + uqw = static_cast(scb.weights[i + WEIGHTS_PLANE2_OFFSET]); + qw = (uqw / 64.0f) * (weight_quant_levels - 1.0f); + qwi = static_cast(qw + 0.5f); + weights[2 * i + 1] = qat.scramble_map[qwi]; + } + } + else + { + for (int i = 0; i < weight_count; i++) + { + float uqw = static_cast(scb.weights[i]); + float qw = (uqw / 64.0f) * (weight_quant_levels - 1.0f); + int qwi = static_cast(qw + 0.5f); + weights[i] = qat.scramble_map[qwi]; + } + } + + encode_ise(weight_quant_method, real_weight_count, weights, weightbuf, 0); + + for (int i = 0; i < 16; i++) + { + pcb[i] = static_cast(bitrev8(weightbuf[15 - i])); + } + + write_bits(scb.block_mode, 11, 0, pcb); + write_bits(partition_count - 1, 2, 11, pcb); + + int below_weights_pos = 128 - bits_for_weights; + + // Encode partition index and color endpoint types for blocks with 2+ partitions + if (partition_count > 1) + { + write_bits(scb.partition_index, 6, 13, pcb); + write_bits(scb.partition_index >> 6, PARTITION_INDEX_BITS - 6, 19, pcb); + + if (scb.color_formats_matched) + { + write_bits(scb.color_formats[0] << 2, 6, 13 + PARTITION_INDEX_BITS, pcb); + } + else + { + // Check endpoint types for each partition to determine the lowest class present + int low_class = 4; + + for (unsigned int i = 0; i < partition_count; i++) + { + int class_of_format = scb.color_formats[i] >> 2; + low_class = astc::min(class_of_format, low_class); + } + + if (low_class == 3) + { + low_class = 2; + } + + int encoded_type = low_class + 1; + int bitpos = 2; + + for (unsigned int i = 0; i < partition_count; i++) + { + int classbit_of_format = (scb.color_formats[i] >> 2) - low_class; + encoded_type |= classbit_of_format << bitpos; + bitpos++; + } + + for (unsigned int i = 0; i < partition_count; i++) + { + int lowbits_of_format = scb.color_formats[i] & 3; + encoded_type |= lowbits_of_format << bitpos; + bitpos += 2; + } + + int encoded_type_lowpart = encoded_type & 0x3F; + int encoded_type_highpart = encoded_type >> 6; + int encoded_type_highpart_size = (3 * partition_count) - 4; + int encoded_type_highpart_pos = 128 - bits_for_weights - encoded_type_highpart_size; + write_bits(encoded_type_lowpart, 6, 13 + PARTITION_INDEX_BITS, pcb); + write_bits(encoded_type_highpart, encoded_type_highpart_size, encoded_type_highpart_pos, pcb); + below_weights_pos -= encoded_type_highpart_size; + } + } + else + { + write_bits(scb.color_formats[0], 4, 13, pcb); + } + + // In dual-plane mode, encode the color component of the second plane of weights + if (is_dual_plane) + { + write_bits(scb.plane2_component, 2, below_weights_pos - 2, pcb); + } + + // Encode the color components + uint8_t values_to_encode[32]; + int valuecount_to_encode = 0; + + const uint8_t* pack_table = color_uquant_to_scrambled_pquant_tables[scb.quant_mode - QUANT_6]; + for (unsigned int i = 0; i < scb.partition_count; i++) + { + int vals = 2 * (scb.color_formats[i] >> 2) + 2; + assert(vals <= 8); + for (int j = 0; j < vals; j++) + { + values_to_encode[j + valuecount_to_encode] = pack_table[scb.color_values[i][j]]; + } + valuecount_to_encode += vals; + } + + encode_ise(scb.get_color_quant_mode(), valuecount_to_encode, values_to_encode, pcb, + scb.partition_count == 1 ? 17 : 19 + PARTITION_INDEX_BITS); +} + +#endif + +/* See header for documentation. */ +void physical_to_symbolic( + const block_size_descriptor& bsd, + const uint8_t pcb[16], + symbolic_compressed_block& scb +) { + uint8_t bswapped[16]; + + scb.block_type = SYM_BTYPE_NONCONST; + + // Extract header fields + int block_mode = read_bits(11, 0, pcb); + if ((block_mode & 0x1FF) == 0x1FC) + { + // Constant color block + + // Check what format the data has + if (block_mode & 0x200) + { + scb.block_type = SYM_BTYPE_CONST_F16; + } + else + { + scb.block_type = SYM_BTYPE_CONST_U16; + } + + scb.partition_count = 0; + for (int i = 0; i < 4; i++) + { + scb.constant_color[i] = pcb[2 * i + 8] | (pcb[2 * i + 9] << 8); + } + + // Additionally, check that the void-extent + if (bsd.zdim == 1) + { + // 2D void-extent + int rsvbits = read_bits(2, 10, pcb); + if (rsvbits != 3) + { + scb.block_type = SYM_BTYPE_ERROR; + return; + } + + // Low values span 3 bytes so need two read_bits calls + int vx_low_s = read_bits(8, 12, pcb) | (read_bits(5, 12 + 8, pcb) << 8); + int vx_high_s = read_bits(13, 25, pcb); + int vx_low_t = read_bits(8, 38, pcb) | (read_bits(5, 38 + 8, pcb) << 8); + int vx_high_t = read_bits(13, 51, pcb); + + int all_ones = vx_low_s == 0x1FFF && vx_high_s == 0x1FFF && + vx_low_t == 0x1FFF && vx_high_t == 0x1FFF; + + if ((vx_low_s >= vx_high_s || vx_low_t >= vx_high_t) && !all_ones) + { + scb.block_type = SYM_BTYPE_ERROR; + return; + } + } + else + { + // 3D void-extent + int vx_low_s = read_bits(9, 10, pcb); + int vx_high_s = read_bits(9, 19, pcb); + int vx_low_t = read_bits(9, 28, pcb); + int vx_high_t = read_bits(9, 37, pcb); + int vx_low_r = read_bits(9, 46, pcb); + int vx_high_r = read_bits(9, 55, pcb); + + int all_ones = vx_low_s == 0x1FF && vx_high_s == 0x1FF && + vx_low_t == 0x1FF && vx_high_t == 0x1FF && + vx_low_r == 0x1FF && vx_high_r == 0x1FF; + + if ((vx_low_s >= vx_high_s || vx_low_t >= vx_high_t || vx_low_r >= vx_high_r) && !all_ones) + { + scb.block_type = SYM_BTYPE_ERROR; + return; + } + } + + return; + } + + unsigned int packed_index = bsd.block_mode_packed_index[block_mode]; + if (packed_index == BLOCK_BAD_BLOCK_MODE) + { + scb.block_type = SYM_BTYPE_ERROR; + return; + } + + const auto& bm = bsd.get_block_mode(block_mode); + const auto& di = bsd.get_decimation_info(bm.decimation_mode); + + int weight_count = di.weight_count; + promise(weight_count > 0); + + quant_method weight_quant_method = static_cast(bm.quant_mode); + int is_dual_plane = bm.is_dual_plane; + + int real_weight_count = is_dual_plane ? 2 * weight_count : weight_count; + + int partition_count = read_bits(2, 11, pcb) + 1; + promise(partition_count > 0); + + scb.block_mode = static_cast(block_mode); + scb.partition_count = static_cast(partition_count); + + for (int i = 0; i < 16; i++) + { + bswapped[i] = static_cast(bitrev8(pcb[15 - i])); + } + + int bits_for_weights = get_ise_sequence_bitcount(real_weight_count, weight_quant_method); + + int below_weights_pos = 128 - bits_for_weights; + + uint8_t indices[64]; + const auto& qat = quant_and_xfer_tables[weight_quant_method]; + + decode_ise(weight_quant_method, real_weight_count, bswapped, indices, 0); + + if (is_dual_plane) + { + for (int i = 0; i < weight_count; i++) + { + scb.weights[i] = qat.unscramble_and_unquant_map[indices[2 * i]]; + scb.weights[i + WEIGHTS_PLANE2_OFFSET] = qat.unscramble_and_unquant_map[indices[2 * i + 1]]; + } + } + else + { + for (int i = 0; i < weight_count; i++) + { + scb.weights[i] = qat.unscramble_and_unquant_map[indices[i]]; + } + } + + if (is_dual_plane && partition_count == 4) + { + scb.block_type = SYM_BTYPE_ERROR; + return; + } + + scb.color_formats_matched = 0; + + // Determine the format of each endpoint pair + int color_formats[BLOCK_MAX_PARTITIONS]; + int encoded_type_highpart_size = 0; + if (partition_count == 1) + { + color_formats[0] = read_bits(4, 13, pcb); + scb.partition_index = 0; + } + else + { + encoded_type_highpart_size = (3 * partition_count) - 4; + below_weights_pos -= encoded_type_highpart_size; + int encoded_type = read_bits(6, 13 + PARTITION_INDEX_BITS, pcb) | + (read_bits(encoded_type_highpart_size, below_weights_pos, pcb) << 6); + int baseclass = encoded_type & 0x3; + if (baseclass == 0) + { + for (int i = 0; i < partition_count; i++) + { + color_formats[i] = (encoded_type >> 2) & 0xF; + } + + below_weights_pos += encoded_type_highpart_size; + scb.color_formats_matched = 1; + encoded_type_highpart_size = 0; + } + else + { + int bitpos = 2; + baseclass--; + + for (int i = 0; i < partition_count; i++) + { + color_formats[i] = (((encoded_type >> bitpos) & 1) + baseclass) << 2; + bitpos++; + } + + for (int i = 0; i < partition_count; i++) + { + color_formats[i] |= (encoded_type >> bitpos) & 3; + bitpos += 2; + } + } + scb.partition_index = static_cast(read_bits(10, 13, pcb)); + } + + for (int i = 0; i < partition_count; i++) + { + scb.color_formats[i] = static_cast(color_formats[i]); + } + + // Determine number of color endpoint integers + int color_integer_count = 0; + for (int i = 0; i < partition_count; i++) + { + int endpoint_class = color_formats[i] >> 2; + color_integer_count += (endpoint_class + 1) * 2; + } + + if (color_integer_count > 18) + { + scb.block_type = SYM_BTYPE_ERROR; + return; + } + + // Determine the color endpoint format to use + static const int color_bits_arr[5] { -1, 115 - 4, 113 - 4 - PARTITION_INDEX_BITS, 113 - 4 - PARTITION_INDEX_BITS, 113 - 4 - PARTITION_INDEX_BITS }; + int color_bits = color_bits_arr[partition_count] - bits_for_weights - encoded_type_highpart_size; + if (is_dual_plane) + { + color_bits -= 2; + } + + if (color_bits < 0) + { + color_bits = 0; + } + + int color_quant_level = quant_mode_table[color_integer_count >> 1][color_bits]; + if (color_quant_level < QUANT_6) + { + scb.block_type = SYM_BTYPE_ERROR; + return; + } + + // Unpack the integer color values and assign to endpoints + scb.quant_mode = static_cast(color_quant_level); + + uint8_t values_to_decode[32]; + decode_ise(static_cast(color_quant_level), color_integer_count, pcb, + values_to_decode, (partition_count == 1 ? 17 : 19 + PARTITION_INDEX_BITS)); + + int valuecount_to_decode = 0; + const uint8_t* unpack_table = color_scrambled_pquant_to_uquant_tables[scb.quant_mode - QUANT_6]; + for (int i = 0; i < partition_count; i++) + { + int vals = 2 * (color_formats[i] >> 2) + 2; + for (int j = 0; j < vals; j++) + { + scb.color_values[i][j] = unpack_table[values_to_decode[j + valuecount_to_decode]]; + } + valuecount_to_decode += vals; + } + + // Fetch component for second-plane in the case of dual plane of weights. + scb.plane2_component = -1; + if (is_dual_plane) + { + scb.plane2_component = static_cast(read_bits(2, below_weights_pos - 2, pcb)); + } +} diff --git a/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h b/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h new file mode 100644 index 0000000..50a588f --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_vecmathlib.h @@ -0,0 +1,608 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2019-2025 Arm Limited +// Copyright 2008 Jose Fonseca +// +// 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. +// ---------------------------------------------------------------------------- + +/* + * This module implements vector support for floats, ints, and vector lane + * control masks. It provides access to both explicit vector width types, and + * flexible N-wide types where N can be determined at compile time. + * + * The design of this module encourages use of vector length agnostic code, via + * the vint, vfloat, and vmask types. These will take on the widest SIMD vector + * with that is available at compile time. The current vector width is + * accessible for e.g. loop strides via the ASTCENC_SIMD_WIDTH constant. + * + * Explicit scalar types are accessible via the vint1, vfloat1, vmask1 types. + * These are provided primarily for prototyping and algorithm debug of VLA + * implementations. + * + * Explicit 4-wide types are accessible via the vint4, vfloat4, and vmask4 + * types. These are provided for use by VLA code, but are also expected to be + * used as a fixed-width type and will supported a reference C++ fallback for + * use on platforms without SIMD intrinsics. + * + * Explicit 8-wide types are accessible via the vint8, vfloat8, and vmask8 + * types. These are provide for use by VLA code, and are not expected to be + * used as a fixed-width type in normal code. No reference C implementation is + * provided on platforms without underlying SIMD intrinsics. + * + * With the current implementation ISA support is provided for: + * + * * 1-wide for scalar reference + * * 4-wide for Armv8-A NEON + * * 4-wide for x86-64 SSE2 + * * 4-wide for x86-64 SSE4.1 + * * 8-wide for Armv8-A SVE + * * 8-wide for x86-64 AVX2 + */ + +#ifndef ASTC_VECMATHLIB_H_INCLUDED +#define ASTC_VECMATHLIB_H_INCLUDED + +#if ASTCENC_SSE != 0 || ASTCENC_AVX != 0 + #include +#endif + +#if ASTCENC_SVE != 0 + #include + #include +#endif + +#if ASTCENC_NEON != 0 + #include +#endif + +#if !defined(__clang__) && defined(_MSC_VER) + #define ASTCENC_SIMD_INLINE __forceinline + #define ASTCENC_NO_INLINE +#elif defined(__GNUC__) && !defined(__clang__) + #define ASTCENC_SIMD_INLINE __attribute__((always_inline)) inline + #define ASTCENC_NO_INLINE __attribute__ ((noinline)) +#else + #define ASTCENC_SIMD_INLINE __attribute__((always_inline, nodebug)) inline + #define ASTCENC_NO_INLINE __attribute__ ((noinline)) +#endif + +template T gatherf_byte_inds(const float* base, const uint8_t* indices); + +#if ASTCENC_AVX >= 2 + // If we have AVX2 expose 8-wide VLA. + #include "astcenc_vecmathlib_sse_4.h" + #include "astcenc_vecmathlib_common_4.h" + #include "astcenc_vecmathlib_avx2_8.h" + + #define ASTCENC_SIMD_WIDTH 8 + + using vfloat = vfloat8; + + #if defined(ASTCENC_NO_INVARIANCE) + using vfloatacc = vfloat8; + #else + using vfloatacc = vfloat4; + #endif + + using vint = vint8; + using vmask = vmask8; + + using vtable_16x8 = vtable8_16x8; + using vtable_32x8 = vtable8_32x8; + using vtable_64x8 = vtable8_64x8; + + constexpr auto loada = vfloat8::loada; + constexpr auto load1 = vfloat8::load1; + constexpr auto vint_from_size = vint8_from_size; + +#elif ASTCENC_SSE >= 20 + // If we have SSE expose 4-wide VLA, and 4-wide fixed width. + #include "astcenc_vecmathlib_sse_4.h" + #include "astcenc_vecmathlib_common_4.h" + + #define ASTCENC_SIMD_WIDTH 4 + + using vfloat = vfloat4; + using vfloatacc = vfloat4; + using vint = vint4; + using vmask = vmask4; + + using vtable_16x8 = vtable4_16x8; + using vtable_32x8 = vtable4_32x8; + using vtable_64x8 = vtable4_64x8; + + constexpr auto loada = vfloat4::loada; + constexpr auto load1 = vfloat4::load1; + constexpr auto vint_from_size = vint4_from_size; + +#elif ASTCENC_SVE == 8 + // Check the compiler is configured with fixed-length 256-bit SVE. + #if !defined(__ARM_FEATURE_SVE_BITS) || (__ARM_FEATURE_SVE_BITS != 256) + #error "__ARM_FEATURE_SVE_BITS is not set to 256 bits" + #endif + + // If we have SVE configured as 8-wide, expose 8-wide VLA. + #include "astcenc_vecmathlib_neon_4.h" + #include "astcenc_vecmathlib_common_4.h" + #include "astcenc_vecmathlib_sve_8.h" + + #define ASTCENC_SIMD_WIDTH 8 + + using vfloat = vfloat8; + + #if defined(ASTCENC_NO_INVARIANCE) + using vfloatacc = vfloat8; + #else + using vfloatacc = vfloat4; + #endif + + using vint = vint8; + using vmask = vmask8; + + using vtable_16x8 = vtable8_16x8; + using vtable_32x8 = vtable8_32x8; + using vtable_64x8 = vtable8_64x8; + + constexpr auto loada = vfloat8::loada; + constexpr auto load1 = vfloat8::load1; + constexpr auto vint_from_size = vint8_from_size; + +#elif ASTCENC_NEON > 0 + // If we have NEON expose 4-wide VLA. + #include "astcenc_vecmathlib_neon_4.h" + #include "astcenc_vecmathlib_common_4.h" + + #define ASTCENC_SIMD_WIDTH 4 + + using vfloat = vfloat4; + using vfloatacc = vfloat4; + using vint = vint4; + using vmask = vmask4; + + using vtable_16x8 = vtable4_16x8; + using vtable_32x8 = vtable4_32x8; + using vtable_64x8 = vtable4_64x8; + + constexpr auto loada = vfloat4::loada; + constexpr auto load1 = vfloat4::load1; + constexpr auto vint_from_size = vint4_from_size; + +#else + // If we have nothing expose 4-wide VLA, and 4-wide fixed width. + + // Note: We no longer expose the 1-wide scalar fallback because it is not + // invariant with the 4-wide path due to algorithms that use horizontal + // operations that accumulate a local vector sum before accumulating into + // a running sum. + // + // For 4 items adding into an accumulator using 1-wide vectors the sum is: + // + // result = ((((sum + l0) + l1) + l2) + l3) + // + // ... whereas the accumulator for a 4-wide vector sum is: + // + // result = sum + ((l0 + l2) + (l1 + l3)) + // + // In "normal maths" this is the same, but the floating point reassociation + // differences mean that these will not produce the same result. + + #include "astcenc_vecmathlib_none_4.h" + #include "astcenc_vecmathlib_common_4.h" + + #define ASTCENC_SIMD_WIDTH 4 + + using vfloat = vfloat4; + using vfloatacc = vfloat4; + using vint = vint4; + using vmask = vmask4; + + using vtable_16x8 = vtable4_16x8; + using vtable_32x8 = vtable4_32x8; + using vtable_64x8 = vtable4_64x8; + + constexpr auto loada = vfloat4::loada; + constexpr auto load1 = vfloat4::load1; + constexpr auto vint_from_size = vint4_from_size; +#endif + +/** + * @brief Round a count down to the largest multiple of the SIMD width. + * + * Assumption that the vector width is a power of two ... + * + * @param count The unrounded value. + * + * @return The rounded value. + */ +ASTCENC_SIMD_INLINE size_t round_down_to_simd_multiple_vla(size_t count) +{ + return count & static_cast(~(ASTCENC_SIMD_WIDTH - 1)); +} + +/** + * @brief Round a count up to the largest multiple of the SIMD width. + * + * Assumption that the vector width is a power of two ... + * + * @param count The unrounded value. + * + * @return The rounded value. + */ +ASTCENC_SIMD_INLINE size_t round_up_to_simd_multiple_vla(size_t count) +{ + size_t multiples = (count + ASTCENC_SIMD_WIDTH - 1) / ASTCENC_SIMD_WIDTH; + return multiples * ASTCENC_SIMD_WIDTH; +} + +/** + * @brief Return @c a with lanes negated if the @c b lane is negative. + */ +ASTCENC_SIMD_INLINE vfloat change_sign(vfloat a, vfloat b) +{ + vint ia = float_as_int(a); + vint ib = float_as_int(b); + vint sign_mask(static_cast(0x80000000)); + vint r = ia ^ (ib & sign_mask); + return int_as_float(r); +} + +/** + * @brief Return fast, but approximate, vector atan(x). + * + * Max error of this implementation is 0.004883. + */ +ASTCENC_SIMD_INLINE vfloat atan(vfloat x) +{ + vmask c = abs(x) > vfloat(1.0f); + vfloat z = change_sign(vfloat(astc::PI_OVER_TWO), x); + vfloat y = select(x, vfloat(1.0f) / x, c); + y = y / (y * y * vfloat(0.28f) + vfloat(1.0f)); + return select(y, z - y, c); +} + +/** + * @brief Return fast, but approximate, vector atan2(x, y). + */ +ASTCENC_SIMD_INLINE vfloat atan2(vfloat y, vfloat x) +{ + vfloat z = atan(abs(y / x)); + vmask xmask = x < vfloat::zero(); + return change_sign(select(z, vfloat(astc::PI) - z, xmask), y); +} + +/* + * @brief Factory that returns a unit length 4 component vfloat4. + */ +static ASTCENC_SIMD_INLINE vfloat4 unit4() +{ + return vfloat4(0.5f); +} + +/** + * @brief Factory that returns a unit length 3 component vfloat4. + */ +static ASTCENC_SIMD_INLINE vfloat4 unit3() +{ + float val = 0.577350258827209473f; + return vfloat4(val, val, val, 0.0f); +} + +/** + * @brief Factory that returns a unit length 2 component vfloat4. + */ +static ASTCENC_SIMD_INLINE vfloat4 unit2() +{ + float val = 0.707106769084930420f; + return vfloat4(val, val, 0.0f, 0.0f); +} + +/** + * @brief Factory that returns a 3 component vfloat4. + */ +static ASTCENC_SIMD_INLINE vfloat4 vfloat3(float a, float b, float c) +{ + return vfloat4(a, b, c, 0.0f); +} + +/** + * @brief Factory that returns a 2 component vfloat4. + */ +static ASTCENC_SIMD_INLINE vfloat4 vfloat2(float a, float b) +{ + return vfloat4(a, b, 0.0f, 0.0f); +} + +/** + * @brief Normalize a non-zero length vector to unit length. + */ +static ASTCENC_SIMD_INLINE vfloat4 normalize(vfloat4 a) +{ + vfloat4 length = dot(a, a); + return a / sqrt(length); +} + +/** + * @brief Normalize a vector, returning @c safe if len is zero. + */ +static ASTCENC_SIMD_INLINE vfloat4 normalize_safe(vfloat4 a, vfloat4 safe) +{ + vfloat4 length = dot(a, a); + if (length.lane<0>() != 0.0f) + { + return a / sqrt(length); + } + + return safe; +} + + + +#define POLY0(x, c0) ( c0) +#define POLY1(x, c0, c1) ((POLY0(x, c1) * x) + c0) +#define POLY2(x, c0, c1, c2) ((POLY1(x, c1, c2) * x) + c0) +#define POLY3(x, c0, c1, c2, c3) ((POLY2(x, c1, c2, c3) * x) + c0) +#define POLY4(x, c0, c1, c2, c3, c4) ((POLY3(x, c1, c2, c3, c4) * x) + c0) +#define POLY5(x, c0, c1, c2, c3, c4, c5) ((POLY4(x, c1, c2, c3, c4, c5) * x) + c0) + +/** + * @brief Compute an approximate exp2(x) for each lane in the vector. + * + * Based on 5th degree minimax polynomials, ported from this blog + * https://jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html + */ +static ASTCENC_SIMD_INLINE vfloat4 exp2(vfloat4 x) +{ + x = clamp(-126.99999f, 129.0f, x); + + vint4 ipart = float_to_int(x - 0.5f); + vfloat4 fpart = x - int_to_float(ipart); + + // Integer contrib, using 1 << ipart + vfloat4 iexp = int_as_float(lsl<23>(ipart + 127)); + + // Fractional contrib, using polynomial fit of 2^x in range [-0.5, 0.5) + vfloat4 fexp = POLY5(fpart, + 9.9999994e-1f, + 6.9315308e-1f, + 2.4015361e-1f, + 5.5826318e-2f, + 8.9893397e-3f, + 1.8775767e-3f); + + return iexp * fexp; +} + +/** + * @brief Compute an approximate log2(x) for each lane in the vector. + * + * Based on 5th degree minimax polynomials, ported from this blog + * https://jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html + */ +static ASTCENC_SIMD_INLINE vfloat4 log2(vfloat4 x) +{ + vint4 exp(0x7F800000); + vint4 mant(0x007FFFFF); + vint4 one(0x3F800000); + + vint4 i = float_as_int(x); + + vfloat4 e = int_to_float(lsr<23>(i & exp) - 127); + + vfloat4 m = int_as_float((i & mant) | one); + + // Polynomial fit of log2(x)/(x - 1), for x in range [1, 2) + vfloat4 p = POLY4(m, + 2.8882704548164776201f, + -2.52074962577807006663f, + 1.48116647521213171641f, + -0.465725644288844778798f, + 0.0596515482674574969533f); + + // Increases the polynomial degree, but ensures that log2(1) == 0 + p = p * (m - 1.0f); + + return p + e; +} + +/** + * @brief Compute an approximate pow(x, y) for each lane in the vector. + * + * Power function based on the exp2(log2(x) * y) transform. + */ +static ASTCENC_SIMD_INLINE vfloat4 pow(vfloat4 x, vfloat4 y) +{ + vmask4 zero_mask = y == vfloat4(0.0f); + vfloat4 estimate = exp2(log2(x) * y); + + // Guarantee that y == 0 returns exactly 1.0f + return select(estimate, vfloat4(1.0f), zero_mask); +} + +/** + * @brief Count the leading zeros for each lane in @c a. + * + * Valid for all data values of @c a; will return a per-lane value [0, 32]. + */ +static ASTCENC_SIMD_INLINE vint4 clz(vint4 a) +{ + // This function is a horrible abuse of floating point exponents to convert + // the original integer value into a 2^N encoding we can recover easily. + + // Convert to float without risk of rounding up by keeping only top 8 bits. + // This trick is is guaranteed to keep top 8 bits and clear the 9th. + a = (~lsr<8>(a)) & a; + a = float_as_int(int_to_float(a)); + + // Extract and unbias exponent + a = vint4(127 + 31) - lsr<23>(a); + + // Clamp result to a valid 32-bit range + return clamp(0, 32, a); +} + +/** + * @brief Return lanewise 2^a for each lane in @c a. + * + * Use of signed int means that this is only valid for values in range [0, 31]. + */ +static ASTCENC_SIMD_INLINE vint4 two_to_the_n(vint4 a) +{ + // 2^30 is the largest signed number than can be represented + assert(all(a < vint4(31))); + + // This function is a horrible abuse of floating point to use the exponent + // and float conversion to generate a 2^N multiple. + + // Bias the exponent + vint4 exp = a + 127; + exp = lsl<23>(exp); + + // Reinterpret the bits as a float, and then convert to an int + vfloat4 f = int_as_float(exp); + return float_to_int(f); +} + +/** + * @brief Convert unorm16 [0, 65535] to float16 in range [0, 1]. + */ +static ASTCENC_SIMD_INLINE vint4 unorm16_to_sf16(vint4 p) +{ + vint4 fp16_one = vint4(0x3C00); + vint4 fp16_small = lsl<8>(p); + + vmask4 is_one = p == vint4(0xFFFF); + vmask4 is_small = p < vint4(4); + + // Manually inline clz() on Visual Studio to avoid release build codegen bug + // see https://github.com/ARM-software/astc-encoder/issues/259 +#if !defined(__clang__) && defined(_MSC_VER) + vint4 a = (~lsr<8>(p)) & p; + a = float_as_int(int_to_float(a)); + a = vint4(127 + 31) - lsr<23>(a); + vint4 lz = clamp(0, 32, a) - 16; +#else + vint4 lz = clz(p) - 16; +#endif + + p = p * two_to_the_n(lz + 1); + p = p & vint4(0xFFFF); + + p = lsr<6>(p); + + p = p | lsl<10>(vint4(14) - lz); + + vint4 r = select(p, fp16_one, is_one); + r = select(r, fp16_small, is_small); + return r; +} + +/** + * @brief Convert 16-bit LNS to float16. + */ +static ASTCENC_SIMD_INLINE vint4 lns_to_sf16(vint4 p) +{ + vint4 mc = p & 0x7FF; + vint4 ec = lsr<11>(p); + + vint4 mc_512 = mc * 3; + vmask4 mask_512 = mc < vint4(512); + + vint4 mc_1536 = mc * 4 - 512; + vmask4 mask_1536 = mc < vint4(1536); + + vint4 mc_else = mc * 5 - 2048; + + vint4 mt = mc_else; + mt = select(mt, mc_1536, mask_1536); + mt = select(mt, mc_512, mask_512); + + vint4 res = lsl<10>(ec) | lsr<3>(mt); + return min(res, vint4(0x7BFF)); +} + +/** + * @brief Extract mantissa and exponent of a float value. + * + * @param a The input value. + * @param[out] exp The output exponent. + * + * @return The mantissa. + */ +static ASTCENC_SIMD_INLINE vfloat4 frexp(vfloat4 a, vint4& exp) +{ + // Interpret the bits as an integer + vint4 ai = float_as_int(a); + + // Extract and unbias the exponent + exp = (lsr<23>(ai) & 0xFF) - 126; + + // Extract and unbias the mantissa + vint4 manti = (ai & static_cast(0x807FFFFF)) | 0x3F000000; + return int_as_float(manti); +} + +/** + * @brief Convert float to 16-bit LNS. + */ +static ASTCENC_SIMD_INLINE vfloat4 float_to_lns(vfloat4 a) +{ + vint4 exp; + vfloat4 mant = frexp(a, exp); + + // Do these early before we start messing about ... + vmask4 mask_underflow_nan = ~(a > vfloat4(1.0f / 67108864.0f)); + vmask4 mask_infinity = a >= vfloat4(65536.0f); + + // If input is smaller than 2^-14, multiply by 2^25 and don't bias. + vmask4 exp_lt_m13 = exp < vint4(-13); + + vfloat4 a1a = a * 33554432.0f; + vint4 expa = vint4::zero(); + + vfloat4 a1b = (mant - 0.5f) * 4096; + vint4 expb = exp + 14; + + a = select(a1b, a1a, exp_lt_m13); + exp = select(expb, expa, exp_lt_m13); + + vmask4 a_lt_384 = a < vfloat4(384.0f); + vmask4 a_lt_1408 = a <= vfloat4(1408.0f); + + vfloat4 a2a = a * (4.0f / 3.0f); + vfloat4 a2b = a + 128.0f; + vfloat4 a2c = (a + 512.0f) * (4.0f / 5.0f); + + a = a2c; + a = select(a, a2b, a_lt_1408); + a = select(a, a2a, a_lt_384); + + a = a + (int_to_float(exp) * 2048.0f) + 1.0f; + + a = select(a, vfloat4(65535.0f), mask_infinity); + a = select(a, vfloat4::zero(), mask_underflow_nan); + + return a; +} + +namespace astc +{ + +static ASTCENC_SIMD_INLINE float pow(float x, float y) +{ + return pow(vfloat4(x), vfloat4(y)).lane<0>(); +} + +} + +#endif // #ifndef ASTC_VECMATHLIB_H_INCLUDED diff --git a/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h b/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h new file mode 100644 index 0000000..af4ecf7 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_vecmathlib_avx2_8.h @@ -0,0 +1,1218 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2019-2025 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. +// ---------------------------------------------------------------------------- + +/** + * @brief 8x32-bit vectors, implemented using AVX2. + * + * This module implements 8-wide 32-bit float, int, and mask vectors for x86 + * AVX2. + * + * There is a baseline level of functionality provided by all vector widths and + * implementations. This is implemented using identical function signatures, + * modulo data type, so we can use them as substitutable implementations in VLA + * code. + */ + +#ifndef ASTC_VECMATHLIB_AVX2_8_H_INCLUDED +#define ASTC_VECMATHLIB_AVX2_8_H_INCLUDED + +#ifndef ASTCENC_SIMD_INLINE + #error "Include astcenc_vecmathlib.h, do not include directly" +#endif + +#include + +// Define convenience intrinsics that are missing on older compilers +#define astcenc_mm256_set_m128i(m, n) _mm256_insertf128_si256(_mm256_castsi128_si256((n)), (m), 1) + +// ============================================================================ +// vfloat8 data type +// ============================================================================ + +/** + * @brief Data type for 8-wide floats. + */ +struct vfloat8 +{ + /** + * @brief Construct from zero-initialized value. + */ + ASTCENC_SIMD_INLINE vfloat8() = default; + + /** + * @brief Construct from 8 values loaded from an unaligned address. + * + * Consider using loada() which is better with vectors if data is aligned + * to vector length. + */ + ASTCENC_SIMD_INLINE explicit vfloat8(const float *p) + { + m = _mm256_loadu_ps(p); + } + + /** + * @brief Construct from 1 scalar value replicated across all lanes. + * + * Consider using zero() for constexpr zeros. + */ + ASTCENC_SIMD_INLINE explicit vfloat8(float a) + { + m = _mm256_set1_ps(a); + } + + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vfloat8(__m256 a) + { + m = a; + } + + /** + * @brief Factory that returns a vector of zeros. + */ + static ASTCENC_SIMD_INLINE vfloat8 zero() + { + return vfloat8(_mm256_setzero_ps()); + } + + /** + * @brief Factory that returns a replicated scalar loaded from memory. + */ + static ASTCENC_SIMD_INLINE vfloat8 load1(const float* p) + { + return vfloat8(_mm256_broadcast_ss(p)); + } + + /** + * @brief Factory that returns a vector loaded from 32B aligned memory. + */ + static ASTCENC_SIMD_INLINE vfloat8 loada(const float* p) + { + return vfloat8(_mm256_load_ps(p)); + } + + /** + * @brief The vector ... + */ + __m256 m; +}; + +// ============================================================================ +// vint8 data type +// ============================================================================ + +/** + * @brief Data type for 8-wide ints. + */ +struct vint8 +{ + /** + * @brief Construct from zero-initialized value. + */ + ASTCENC_SIMD_INLINE vint8() = default; + + /** + * @brief Construct from 8 values loaded from an unaligned address. + * + * Consider using loada() which is better with vectors if data is aligned + * to vector length. + */ + ASTCENC_SIMD_INLINE explicit vint8(const int *p) + { + m = _mm256_loadu_si256(reinterpret_cast(p)); + } + + /** + * @brief Construct from 8 uint8_t loaded from an unaligned address. + */ + ASTCENC_SIMD_INLINE explicit vint8(const uint8_t *p) + { + // _mm_loadu_si64 would be nicer syntax, but missing on older GCC + m = _mm256_cvtepu8_epi32(_mm_cvtsi64_si128(*reinterpret_cast(p))); + } + + /** + * @brief Construct from 1 scalar value replicated across all lanes. + * + * Consider using zero() for constexpr zeros. + */ + ASTCENC_SIMD_INLINE explicit vint8(int a) + { + m = _mm256_set1_epi32(a); + } + + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vint8(__m256i a) + { + m = a; + } + + /** + * @brief Factory that returns a vector of zeros. + */ + static ASTCENC_SIMD_INLINE vint8 zero() + { + return vint8(_mm256_setzero_si256()); + } + + /** + * @brief Factory that returns a replicated scalar loaded from memory. + */ + static ASTCENC_SIMD_INLINE vint8 load1(const int* p) + { + __m128i a = _mm_set1_epi32(*p); + return vint8(_mm256_broadcastd_epi32(a)); + } + + /** + * @brief Factory that returns a vector loaded from unaligned memory. + */ + static ASTCENC_SIMD_INLINE vint8 load(const uint8_t* p) + { + return vint8(_mm256_lddqu_si256(reinterpret_cast(p))); + } + + /** + * @brief Factory that returns a vector loaded from 32B aligned memory. + */ + static ASTCENC_SIMD_INLINE vint8 loada(const int* p) + { + return vint8(_mm256_load_si256(reinterpret_cast(p))); + } + + /** + * @brief Factory that returns a vector containing the lane IDs. + */ + static ASTCENC_SIMD_INLINE vint8 lane_id() + { + return vint8(_mm256_set_epi32(7, 6, 5, 4, 3, 2, 1, 0)); + } + + /** + * @brief The vector ... + */ + __m256i m; +}; + +// ============================================================================ +// vmask8 data type +// ============================================================================ + +/** + * @brief Data type for 8-wide control plane masks. + */ +struct vmask8 +{ + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vmask8(__m256 a) + { + m = a; + } + + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vmask8(__m256i a) + { + m = _mm256_castsi256_ps(a); + } + + /** + * @brief Construct from 1 scalar value. + */ + ASTCENC_SIMD_INLINE explicit vmask8(bool a) + { + vint8 mask(a == false ? 0 : -1); + m = _mm256_castsi256_ps(mask.m); + } + + /** + * @brief The vector ... + */ + __m256 m; +}; + +// ============================================================================ +// vmask8 operators and functions +// ============================================================================ + +/** + * @brief Overload: mask union (or). + */ +ASTCENC_SIMD_INLINE vmask8 operator|(vmask8 a, vmask8 b) +{ + return vmask8(_mm256_or_ps(a.m, b.m)); +} + +/** + * @brief Overload: mask intersect (and). + */ +ASTCENC_SIMD_INLINE vmask8 operator&(vmask8 a, vmask8 b) +{ + return vmask8(_mm256_and_ps(a.m, b.m)); +} + +/** + * @brief Overload: mask difference (xor). + */ +ASTCENC_SIMD_INLINE vmask8 operator^(vmask8 a, vmask8 b) +{ + return vmask8(_mm256_xor_ps(a.m, b.m)); +} + +/** + * @brief Overload: mask invert (not). + */ +ASTCENC_SIMD_INLINE vmask8 operator~(vmask8 a) +{ + return vmask8(_mm256_xor_si256(_mm256_castps_si256(a.m), _mm256_set1_epi32(-1))); +} + +/** + * @brief Return a 8-bit mask code indicating mask status. + * + * bit0 = lane 0 + */ +ASTCENC_SIMD_INLINE unsigned int mask(vmask8 a) +{ + return static_cast(_mm256_movemask_ps(a.m)); +} + +/** + * @brief True if any lanes are enabled, false otherwise. + */ +ASTCENC_SIMD_INLINE bool any(vmask8 a) +{ + return mask(a) != 0; +} + +/** + * @brief True if all lanes are enabled, false otherwise. + */ +ASTCENC_SIMD_INLINE bool all(vmask8 a) +{ + return mask(a) == 0xFF; +} + +// ============================================================================ +// vint8 operators and functions +// ============================================================================ +/** + * @brief Overload: vector by vector addition. + */ +ASTCENC_SIMD_INLINE vint8 operator+(vint8 a, vint8 b) +{ + return vint8(_mm256_add_epi32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector incremental addition. + */ +ASTCENC_SIMD_INLINE vint8& operator+=(vint8& a, const vint8& b) +{ + a = a + b; + return a; +} + +/** + * @brief Overload: vector by vector subtraction. + */ +ASTCENC_SIMD_INLINE vint8 operator-(vint8 a, vint8 b) +{ + return vint8(_mm256_sub_epi32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector multiplication. + */ +ASTCENC_SIMD_INLINE vint8 operator*(vint8 a, vint8 b) +{ + return vint8(_mm256_mullo_epi32(a.m, b.m)); +} + +/** + * @brief Overload: vector bit invert. + */ +ASTCENC_SIMD_INLINE vint8 operator~(vint8 a) +{ + return vint8(_mm256_xor_si256(a.m, _mm256_set1_epi32(-1))); +} + +/** + * @brief Overload: vector by vector bitwise or. + */ +ASTCENC_SIMD_INLINE vint8 operator|(vint8 a, vint8 b) +{ + return vint8(_mm256_or_si256(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector bitwise and. + */ +ASTCENC_SIMD_INLINE vint8 operator&(vint8 a, vint8 b) +{ + return vint8(_mm256_and_si256(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector bitwise xor. + */ +ASTCENC_SIMD_INLINE vint8 operator^(vint8 a, vint8 b) +{ + return vint8(_mm256_xor_si256(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector equality. + */ +ASTCENC_SIMD_INLINE vmask8 operator==(vint8 a, vint8 b) +{ + return vmask8(_mm256_cmpeq_epi32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector inequality. + */ +ASTCENC_SIMD_INLINE vmask8 operator!=(vint8 a, vint8 b) +{ + return ~vmask8(_mm256_cmpeq_epi32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector less than. + */ +ASTCENC_SIMD_INLINE vmask8 operator<(vint8 a, vint8 b) +{ + return vmask8(_mm256_cmpgt_epi32(b.m, a.m)); +} + +/** + * @brief Overload: vector by vector greater than. + */ +ASTCENC_SIMD_INLINE vmask8 operator>(vint8 a, vint8 b) +{ + return vmask8(_mm256_cmpgt_epi32(a.m, b.m)); +} + +/** + * @brief Logical shift left. + */ +template ASTCENC_SIMD_INLINE vint8 lsl(vint8 a) +{ + return vint8(_mm256_slli_epi32(a.m, s)); +} + +/** + * @brief Arithmetic shift right. + */ +template ASTCENC_SIMD_INLINE vint8 asr(vint8 a) +{ + return vint8(_mm256_srai_epi32(a.m, s)); +} + +/** + * @brief Logical shift right. + */ +template ASTCENC_SIMD_INLINE vint8 lsr(vint8 a) +{ + return vint8(_mm256_srli_epi32(a.m, s)); +} + +/** + * @brief Return the min vector of two vectors. + */ +ASTCENC_SIMD_INLINE vint8 min(vint8 a, vint8 b) +{ + return vint8(_mm256_min_epi32(a.m, b.m)); +} + +/** + * @brief Return the max vector of two vectors. + */ +ASTCENC_SIMD_INLINE vint8 max(vint8 a, vint8 b) +{ + return vint8(_mm256_max_epi32(a.m, b.m)); +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE vint8 hmin(vint8 a) +{ + // Build min within groups of 2, then 4, then 8 + __m256i m = _mm256_min_epi32(a.m, _mm256_shuffle_epi32(a.m, _MM_SHUFFLE(2, 3, 0, 1))); + m = _mm256_min_epi32(m, _mm256_shuffle_epi32(m, _MM_SHUFFLE(1, 0, 3, 2))); + m = _mm256_min_epi32(m, _mm256_permute2x128_si256(m, m, 0x01)); + + vint8 vmin(m); + return vmin; +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE int hmin_s(vint8 a) +{ + return _mm256_cvtsi256_si32(hmin(a).m); +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE vint8 hmax(vint8 a) +{ + // Build max within groups of 2, then 4, then 8 + __m256i m = _mm256_max_epi32(a.m, _mm256_shuffle_epi32(a.m, _MM_SHUFFLE(2, 3, 0, 1))); + m = _mm256_max_epi32(m, _mm256_shuffle_epi32(m, _MM_SHUFFLE(1, 0, 3, 2))); + m = _mm256_max_epi32(m, _mm256_permute2x128_si256(m, m, 0x01)); + + vint8 vmax(m); + return vmax; +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE int hmax_s(vint8 a) +{ + return _mm256_cvtsi256_si32(hmax(a).m); +} + +/** + * @brief Generate a vint8 from a size_t. + */ + ASTCENC_SIMD_INLINE vint8 vint8_from_size(size_t a) + { + assert(a <= std::numeric_limits::max()); + return vint8(static_cast(a)); + } + +/** + * @brief Store a vector to a 16B aligned memory address. + */ +ASTCENC_SIMD_INLINE void storea(vint8 a, int* p) +{ + _mm256_store_si256(reinterpret_cast<__m256i*>(p), a.m); +} + +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vint8 a, int* p) +{ + _mm256_storeu_si256(reinterpret_cast<__m256i*>(p), a.m); +} + +/** + * @brief Store lowest N (vector width) bytes into an unaligned address. + */ +ASTCENC_SIMD_INLINE void store_nbytes(vint8 a, uint8_t* p) +{ + // This is the most logical implementation, but the convenience intrinsic + // is missing on older compilers (supported in g++ 9 and clang++ 9). + // _mm_storeu_si64(ptr, _mm256_extracti128_si256(v.m, 0)) + _mm_storel_epi64(reinterpret_cast<__m128i*>(p), _mm256_extracti128_si256(a.m, 0)); +} + +/** + * @brief Pack low 8 bits of N (vector width) lanes into bottom of vector. + */ +ASTCENC_SIMD_INLINE void pack_and_store_low_bytes(vint8 v, uint8_t* p) +{ + __m256i shuf = _mm256_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28, 24, 20, 16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 12, 8, 4, 0); + __m256i a = _mm256_shuffle_epi8(v.m, shuf); + __m128i a0 = _mm256_extracti128_si256(a, 0); + __m128i a1 = _mm256_extracti128_si256(a, 1); + __m128i b = _mm_unpacklo_epi32(a0, a1); + + __m256i r = astcenc_mm256_set_m128i(b, b); + + store_nbytes(vint8(r), p); +} + +/** + * @brief Return lanes from @c b if @c cond is set, else @c a. + */ +ASTCENC_SIMD_INLINE vint8 select(vint8 a, vint8 b, vmask8 cond) +{ + __m256i condi = _mm256_castps_si256(cond.m); + return vint8(_mm256_blendv_epi8(a.m, b.m, condi)); +} + +// ============================================================================ +// vfloat8 operators and functions +// ============================================================================ + +/** + * @brief Overload: vector by vector addition. + */ +ASTCENC_SIMD_INLINE vfloat8 operator+(vfloat8 a, vfloat8 b) +{ + return vfloat8(_mm256_add_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector incremental addition. + */ +ASTCENC_SIMD_INLINE vfloat8& operator+=(vfloat8& a, const vfloat8& b) +{ + a = a + b; + return a; +} + +/** + * @brief Overload: vector by vector subtraction. + */ +ASTCENC_SIMD_INLINE vfloat8 operator-(vfloat8 a, vfloat8 b) +{ + return vfloat8(_mm256_sub_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector multiplication. + */ +ASTCENC_SIMD_INLINE vfloat8 operator*(vfloat8 a, vfloat8 b) +{ + return vfloat8(_mm256_mul_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by scalar multiplication. + */ +ASTCENC_SIMD_INLINE vfloat8 operator*(vfloat8 a, float b) +{ + return vfloat8(_mm256_mul_ps(a.m, _mm256_set1_ps(b))); +} + +/** + * @brief Overload: scalar by vector multiplication. + */ +ASTCENC_SIMD_INLINE vfloat8 operator*(float a, vfloat8 b) +{ + return vfloat8(_mm256_mul_ps(_mm256_set1_ps(a), b.m)); +} + +/** + * @brief Overload: vector by vector division. + */ +ASTCENC_SIMD_INLINE vfloat8 operator/(vfloat8 a, vfloat8 b) +{ + return vfloat8(_mm256_div_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by scalar division. + */ +ASTCENC_SIMD_INLINE vfloat8 operator/(vfloat8 a, float b) +{ + return vfloat8(_mm256_div_ps(a.m, _mm256_set1_ps(b))); +} + +/** + * @brief Overload: scalar by vector division. + */ +ASTCENC_SIMD_INLINE vfloat8 operator/(float a, vfloat8 b) +{ + return vfloat8(_mm256_div_ps(_mm256_set1_ps(a), b.m)); +} + +/** + * @brief Overload: vector by vector equality. + */ +ASTCENC_SIMD_INLINE vmask8 operator==(vfloat8 a, vfloat8 b) +{ + return vmask8(_mm256_cmp_ps(a.m, b.m, _CMP_EQ_OQ)); +} + +/** + * @brief Overload: vector by vector inequality. + */ +ASTCENC_SIMD_INLINE vmask8 operator!=(vfloat8 a, vfloat8 b) +{ + return vmask8(_mm256_cmp_ps(a.m, b.m, _CMP_NEQ_OQ)); +} + +/** + * @brief Overload: vector by vector less than. + */ +ASTCENC_SIMD_INLINE vmask8 operator<(vfloat8 a, vfloat8 b) +{ + return vmask8(_mm256_cmp_ps(a.m, b.m, _CMP_LT_OQ)); +} + +/** + * @brief Overload: vector by vector greater than. + */ +ASTCENC_SIMD_INLINE vmask8 operator>(vfloat8 a, vfloat8 b) +{ + return vmask8(_mm256_cmp_ps(a.m, b.m, _CMP_GT_OQ)); +} + +/** + * @brief Overload: vector by vector less than or equal. + */ +ASTCENC_SIMD_INLINE vmask8 operator<=(vfloat8 a, vfloat8 b) +{ + return vmask8(_mm256_cmp_ps(a.m, b.m, _CMP_LE_OQ)); +} + +/** + * @brief Overload: vector by vector greater than or equal. + */ +ASTCENC_SIMD_INLINE vmask8 operator>=(vfloat8 a, vfloat8 b) +{ + return vmask8(_mm256_cmp_ps(a.m, b.m, _CMP_GE_OQ)); +} + +/** + * @brief Return the min vector of two vectors. + * + * If either lane value is NaN, @c b will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat8 min(vfloat8 a, vfloat8 b) +{ + return vfloat8(_mm256_min_ps(a.m, b.m)); +} + +/** + * @brief Return the min vector of a vector and a scalar. + * + * If either lane value is NaN, @c b will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat8 min(vfloat8 a, float b) +{ + return min(a, vfloat8(b)); +} + +/** + * @brief Return the max vector of two vectors. + * + * If either lane value is NaN, @c b will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat8 max(vfloat8 a, vfloat8 b) +{ + return vfloat8(_mm256_max_ps(a.m, b.m)); +} + +/** + * @brief Return the max vector of a vector and a scalar. + * + * If either lane value is NaN, @c b will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat8 max(vfloat8 a, float b) +{ + return max(a, vfloat8(b)); +} + +/** + * @brief Return the clamped value between min and max. + * + * It is assumed that neither @c min nor @c max are NaN values. If @c a is NaN + * then @c min will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat8 clamp(float min, float max, vfloat8 a) +{ + // Do not reorder - second operand will return if either is NaN + a.m = _mm256_max_ps(a.m, _mm256_set1_ps(min)); + a.m = _mm256_min_ps(a.m, _mm256_set1_ps(max)); + return a; +} + +/** + * @brief Return a clamped value between 0.0f and 1.0f. + * + * If @c a is NaN then zero will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat8 clampzo(vfloat8 a) +{ + a.m = _mm256_max_ps(a.m, _mm256_setzero_ps()); + a.m = _mm256_min_ps(a.m, _mm256_set1_ps(1.0f)); + return a; +} + +/** + * @brief Return the absolute value of the float vector. + */ +ASTCENC_SIMD_INLINE vfloat8 abs(vfloat8 a) +{ + __m256 msk = _mm256_castsi256_ps(_mm256_set1_epi32(0x7fffffff)); + return vfloat8(_mm256_and_ps(a.m, msk)); +} + +/** + * @brief Return a float rounded to the nearest integer value. + */ +ASTCENC_SIMD_INLINE vfloat8 round(vfloat8 a) +{ + constexpr int flags = _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC; + return vfloat8(_mm256_round_ps(a.m, flags)); +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE vfloat8 hmin(vfloat8 a) +{ + __m128 vlow = _mm256_castps256_ps128(a.m); + __m128 vhigh = _mm256_extractf128_ps(a.m, 1); + vlow = _mm_min_ps(vlow, vhigh); + + // First do an horizontal reduction. + __m128 shuf = _mm_shuffle_ps(vlow, vlow, _MM_SHUFFLE(2, 3, 0, 1)); + __m128 mins = _mm_min_ps(vlow, shuf); + shuf = _mm_movehl_ps(shuf, mins); + mins = _mm_min_ss(mins, shuf); + + // This is the most logical implementation, but the convenience intrinsic + // is missing on older compilers (supported in g++ 9 and clang++ 9). + //__m256i r = _mm256_set_m128(m, m) + __m256 r = _mm256_insertf128_ps(_mm256_castps128_ps256(mins), mins, 1); + + return vfloat8(_mm256_permute_ps(r, 0)); +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE float hmin_s(vfloat8 a) +{ + return _mm256_cvtss_f32(hmin(a).m); +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE vfloat8 hmax(vfloat8 a) +{ + __m128 vlow = _mm256_castps256_ps128(a.m); + __m128 vhigh = _mm256_extractf128_ps(a.m, 1); + vhigh = _mm_max_ps(vlow, vhigh); + + // First do an horizontal reduction. + __m128 shuf = _mm_shuffle_ps(vhigh, vhigh, _MM_SHUFFLE(2, 3, 0, 1)); + __m128 maxs = _mm_max_ps(vhigh, shuf); + shuf = _mm_movehl_ps(shuf,maxs); + maxs = _mm_max_ss(maxs, shuf); + + // This is the most logical implementation, but the convenience intrinsic + // is missing on older compilers (supported in g++ 9 and clang++ 9). + //__m256i r = _mm256_set_m128(m, m) + __m256 r = _mm256_insertf128_ps(_mm256_castps128_ps256(maxs), maxs, 1); + return vfloat8(_mm256_permute_ps(r, 0)); +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE float hmax_s(vfloat8 a) +{ + return _mm256_cvtss_f32(hmax(a).m); +} + +/** + * @brief Return the horizontal sum of a vector. + */ +ASTCENC_SIMD_INLINE float hadd_s(vfloat8 a) +{ + // Two sequential 4-wide adds gives invariance with 4-wide code + vfloat4 lo(_mm256_extractf128_ps(a.m, 0)); + vfloat4 hi(_mm256_extractf128_ps(a.m, 1)); + return hadd_s(lo) + hadd_s(hi); +} + +/** + * @brief Return lanes from @c b if @c cond is set, else @c a. + */ +ASTCENC_SIMD_INLINE vfloat8 select(vfloat8 a, vfloat8 b, vmask8 cond) +{ + return vfloat8(_mm256_blendv_ps(a.m, b.m, cond.m)); +} + +/** + * @brief Accumulate lane-wise sums for a vector, folded 4-wide. + * + * This is invariant with 4-wide implementations. + */ +ASTCENC_SIMD_INLINE void haccumulate(vfloat4& accum, vfloat8 a) +{ + vfloat4 lo(_mm256_extractf128_ps(a.m, 0)); + haccumulate(accum, lo); + + vfloat4 hi(_mm256_extractf128_ps(a.m, 1)); + haccumulate(accum, hi); +} + +/** + * @brief Accumulate lane-wise sums for a vector. + * + * This is NOT invariant with 4-wide implementations. + */ +ASTCENC_SIMD_INLINE void haccumulate(vfloat8& accum, vfloat8 a) +{ + accum += a; +} + +/** + * @brief Accumulate masked lane-wise sums for a vector, folded 4-wide. + * + * This is invariant with 4-wide implementations. + */ +ASTCENC_SIMD_INLINE void haccumulate(vfloat4& accum, vfloat8 a, vmask8 m) +{ + a = select(vfloat8::zero(), a, m); + haccumulate(accum, a); +} + +/** + * @brief Accumulate masked lane-wise sums for a vector. + * + * This is NOT invariant with 4-wide implementations. + */ +ASTCENC_SIMD_INLINE void haccumulate(vfloat8& accum, vfloat8 a, vmask8 m) +{ + a = select(vfloat8::zero(), a, m); + haccumulate(accum, a); +} + +/** + * @brief Return the sqrt of the lanes in the vector. + */ +ASTCENC_SIMD_INLINE vfloat8 sqrt(vfloat8 a) +{ + return vfloat8(_mm256_sqrt_ps(a.m)); +} + +/** + * @brief Load a vector of gathered results from an array; + */ +ASTCENC_SIMD_INLINE vfloat8 gatherf(const float* base, vint8 indices) +{ + return vfloat8(_mm256_i32gather_ps(base, indices.m, 4)); +} + +/** + * @brief Load a vector of gathered results from an array using byte indices from memory + */ +template<> +ASTCENC_SIMD_INLINE vfloat8 gatherf_byte_inds(const float* base, const uint8_t* indices) +{ +#if ASTCENC_X86_GATHERS == 0 + // Perform manual gather using scalar loads in two separate dependency chains, + // then merge late. MSVC translates this 1:1, which is OK. Clang turns it + // into a bunch of memory-operand inserts on 128-bit halves then merges late, + // which performs significantly worse in tests. + __m256 m0 = _mm256_broadcast_ss(base + indices[0]); + __m256 m1 = _mm256_broadcast_ss(base + indices[1]); + m0 = _mm256_blend_ps(m0, _mm256_broadcast_ss(base + indices[2]), 1 << 2); + m1 = _mm256_blend_ps(m1, _mm256_broadcast_ss(base + indices[3]), 1 << 3); + m0 = _mm256_blend_ps(m0, _mm256_broadcast_ss(base + indices[4]), 1 << 4); + m1 = _mm256_blend_ps(m1, _mm256_broadcast_ss(base + indices[5]), 1 << 5); + m0 = _mm256_blend_ps(m0, _mm256_broadcast_ss(base + indices[6]), 1 << 6); + m1 = _mm256_blend_ps(m1, _mm256_broadcast_ss(base + indices[7]), 1 << 7); + + return vfloat8(_mm256_blend_ps(m0, m1, 0xaa)); +#else + vint8 inds(indices); + return gatherf(base, inds); +#endif +} + +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vfloat8 a, float* p) +{ + _mm256_storeu_ps(p, a.m); +} + +/** + * @brief Store a vector to a 32B aligned memory address. + */ +ASTCENC_SIMD_INLINE void storea(vfloat8 a, float* p) +{ + _mm256_store_ps(p, a.m); +} + +/** + * @brief Return a integer value for a float vector, using truncation. + */ +ASTCENC_SIMD_INLINE vint8 float_to_int(vfloat8 a) +{ + return vint8(_mm256_cvttps_epi32(a.m)); +} + +/** + * @brief Return a integer value for a float vector, using round-to-nearest. + */ +ASTCENC_SIMD_INLINE vint8 float_to_int_rtn(vfloat8 a) +{ + a = a + vfloat8(0.5f); + return vint8(_mm256_cvttps_epi32(a.m)); +} + + +/** + * @brief Return a float value for an integer vector. + */ +ASTCENC_SIMD_INLINE vfloat8 int_to_float(vint8 a) +{ + return vfloat8(_mm256_cvtepi32_ps(a.m)); +} + +/** + * @brief Return a float value as an integer bit pattern (i.e. no conversion). + * + * It is a common trick to convert floats into integer bit patterns, perform + * some bit hackery based on knowledge they are IEEE 754 layout, and then + * convert them back again. This is the first half of that flip. + */ +ASTCENC_SIMD_INLINE vint8 float_as_int(vfloat8 a) +{ + return vint8(_mm256_castps_si256(a.m)); +} + +/** + * @brief Return a integer value as a float bit pattern (i.e. no conversion). + * + * It is a common trick to convert floats into integer bit patterns, perform + * some bit hackery based on knowledge they are IEEE 754 layout, and then + * convert them back again. This is the second half of that flip. + */ +ASTCENC_SIMD_INLINE vfloat8 int_as_float(vint8 a) +{ + return vfloat8(_mm256_castsi256_ps(a.m)); +} + +/* + * Table structure for a 16x 8-bit entry table. + */ +struct vtable8_16x8 { + vint8 t0; +}; + +/* + * Table structure for a 32x 8-bit entry table. + */ +struct vtable8_32x8 { + vint8 t0; + vint8 t1; +}; + +/* + * Table structure for a 64x 8-bit entry table. + */ +struct vtable8_64x8 { + vint8 t0; + vint8 t1; + vint8 t2; + vint8 t3; +}; + +/** + * @brief Prepare a vtable lookup table for 16x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable8_16x8& table, + const uint8_t* data +) { + // AVX2 tables duplicate table entries in each 128-bit half-register + vint4 d0 = vint4::load(data); + + table.t0 = vint8(astcenc_mm256_set_m128i(d0.m, d0.m)); +} + +/** + * @brief Prepare a vtable lookup table for 32x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable8_32x8& table, + const uint8_t* data +) { + // AVX2 tables duplicate table entries in each 128-bit half-register + vint4 d0 = vint4::load(data); + vint4 d1 = vint4::load(data + 16); + + table.t0 = vint8(astcenc_mm256_set_m128i(d0.m, d0.m)); + table.t1 = vint8(astcenc_mm256_set_m128i(d1.m, d1.m)); + + // XOR chain the high rows to allow table emulation + table.t1 = table.t1 ^ table.t0; +} + +/** + * @brief Prepare a vtable lookup table 64x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable8_64x8& table, + const uint8_t* data +) { + // AVX2 tables duplicate table entries in each 128-bit half-register + vint4 d0 = vint4::load(data); + vint4 d1 = vint4::load(data + 16); + vint4 d2 = vint4::load(data + 32); + vint4 d3 = vint4::load(data + 48); + + table.t0 = vint8(astcenc_mm256_set_m128i(d0.m, d0.m)); + table.t1 = vint8(astcenc_mm256_set_m128i(d1.m, d1.m)); + table.t2 = vint8(astcenc_mm256_set_m128i(d2.m, d2.m)); + table.t3 = vint8(astcenc_mm256_set_m128i(d3.m, d3.m)); + + // XOR chain the high rows to allow table emulation + table.t3 = table.t3 ^ table.t2; + table.t2 = table.t2 ^ table.t1; + table.t1 = table.t1 ^ table.t0; +} + +/** + * @brief Perform a vtable lookup in a 16x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint8 vtable_lookup_32bit( + const vtable8_16x8& tbl, + vint8 idx +) { + // Set index byte MSB to 1 for unused bytes so shuffle returns zero + __m256i idxx = _mm256_or_si256(idx.m, _mm256_set1_epi32(static_cast(0xFFFFFF00))); + + __m256i result = _mm256_shuffle_epi8(tbl.t0.m, idxx); + return vint8(result); +} + +/** + * @brief Perform a vtable lookup in a 32x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint8 vtable_lookup_32bit( + const vtable8_32x8& tbl, + vint8 idx +) { + // Set index byte MSB to 1 for unused bytes so shuffle returns zero + __m256i idxx = _mm256_or_si256(idx.m, _mm256_set1_epi32(static_cast(0xFFFFFF00))); + + __m256i result = _mm256_shuffle_epi8(tbl.t0.m, idxx); + idxx = _mm256_sub_epi8(idxx, _mm256_set1_epi8(16)); + + __m256i result2 = _mm256_shuffle_epi8(tbl.t1.m, idxx); + result = _mm256_xor_si256(result, result2); + return vint8(result); +} + +/** + * @brief Perform a vtable lookup in a 64x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint8 vtable_lookup_32bit( + const vtable8_64x8& tbl, + vint8 idx +) { + // Set index byte MSB to 1 for unused bytes so shuffle returns zero + __m256i idxx = _mm256_or_si256(idx.m, _mm256_set1_epi32(static_cast(0xFFFFFF00))); + + __m256i result = _mm256_shuffle_epi8(tbl.t0.m, idxx); + idxx = _mm256_sub_epi8(idxx, _mm256_set1_epi8(16)); + + __m256i result2 = _mm256_shuffle_epi8(tbl.t1.m, idxx); + result = _mm256_xor_si256(result, result2); + idxx = _mm256_sub_epi8(idxx, _mm256_set1_epi8(16)); + + result2 = _mm256_shuffle_epi8(tbl.t2.m, idxx); + result = _mm256_xor_si256(result, result2); + idxx = _mm256_sub_epi8(idxx, _mm256_set1_epi8(16)); + + result2 = _mm256_shuffle_epi8(tbl.t3.m, idxx); + result = _mm256_xor_si256(result, result2); + + return vint8(result); +} + +/** + * @brief Return a vector of interleaved RGBA data. + * + * Input vectors have the value stored in the bottom 8 bits of each lane, + * with high bits set to zero. + * + * Output vector stores a single RGBA texel packed in each lane. + */ +ASTCENC_SIMD_INLINE vint8 interleave_rgba8(vint8 r, vint8 g, vint8 b, vint8 a) +{ + return r + lsl<8>(g) + lsl<16>(b) + lsl<24>(a); +} + +/** + * @brief Store a vector, skipping masked lanes. + * + * All masked lanes must be at the end of vector, after all non-masked lanes. + */ +ASTCENC_SIMD_INLINE void store_lanes_masked(uint8_t* base, vint8 data, vmask8 mask) +{ + _mm256_maskstore_epi32(reinterpret_cast(base), _mm256_castps_si256(mask.m), data.m); +} + +/** + * @brief Debug function to print a vector of ints. + */ +ASTCENC_SIMD_INLINE void print(vint8 a) +{ + alignas(32) int v[8]; + storea(a, v); + printf("v8_i32:\n %8d %8d %8d %8d %8d %8d %8d %8d\n", + v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]); +} + +/** + * @brief Debug function to print a vector of ints. + */ +ASTCENC_SIMD_INLINE void printx(vint8 a) +{ + alignas(32) int v[8]; + storea(a, v); + + unsigned int uv[8]; + std::memcpy(uv, v, sizeof(int) * 8); + + printf("v8_i32:\n %08x %08x %08x %08x %08x %08x %08x %08x\n", + uv[0], uv[1], uv[2], uv[3], uv[4], uv[5], uv[6], uv[7]); +} + +/** + * @brief Debug function to print a vector of floats. + */ +ASTCENC_SIMD_INLINE void print(vfloat8 a) +{ + alignas(32) float v[8]; + storea(a, v); + printf("v8_f32:\n %0.4f %0.4f %0.4f %0.4f %0.4f %0.4f %0.4f %0.4f\n", + static_cast(v[0]), static_cast(v[1]), + static_cast(v[2]), static_cast(v[3]), + static_cast(v[4]), static_cast(v[5]), + static_cast(v[6]), static_cast(v[7])); +} + +/** + * @brief Debug function to print a vector of masks. + */ +ASTCENC_SIMD_INLINE void print(vmask8 a) +{ + print(select(vint8(0), vint8(1), a)); +} + +#endif // #ifndef ASTC_VECMATHLIB_AVX2_8_H_INCLUDED diff --git a/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h b/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h new file mode 100644 index 0000000..f3a00db --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_vecmathlib_common_4.h @@ -0,0 +1,421 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2020-2025 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Generic 4x32-bit vector functions. + * + * This module implements generic 4-wide vector functions that are valid for + * all instruction sets, typically implemented using lower level 4-wide + * operations that are ISA-specific. + */ + +#ifndef ASTC_VECMATHLIB_COMMON_4_H_INCLUDED +#define ASTC_VECMATHLIB_COMMON_4_H_INCLUDED + +#ifndef ASTCENC_SIMD_INLINE + #error "Include astcenc_vecmathlib.h, do not include directly" +#endif + +#include +#include + +// ============================================================================ +// vint4 operators and functions +// ============================================================================ + +/** + * @brief Overload: vector by scalar addition. + */ +ASTCENC_SIMD_INLINE vint4 operator+(vint4 a, int b) +{ + return a + vint4(b); +} + +/** + * @brief Overload: vector by vector incremental addition. + */ +ASTCENC_SIMD_INLINE vint4& operator+=(vint4& a, const vint4& b) +{ + a = a + b; + return a; +} + +/** + * @brief Overload: vector by scalar subtraction. + */ +ASTCENC_SIMD_INLINE vint4 operator-(vint4 a, int b) +{ + return a - vint4(b); +} + +/** + * @brief Overload: vector by scalar multiplication. + */ +ASTCENC_SIMD_INLINE vint4 operator*(vint4 a, int b) +{ + return a * vint4(b); +} + +/** + * @brief Overload: vector by scalar bitwise or. + */ +ASTCENC_SIMD_INLINE vint4 operator|(vint4 a, int b) +{ + return a | vint4(b); +} + +/** + * @brief Overload: vector by scalar bitwise and. + */ +ASTCENC_SIMD_INLINE vint4 operator&(vint4 a, int b) +{ + return a & vint4(b); +} + +/** + * @brief Overload: vector by scalar bitwise xor. + */ +ASTCENC_SIMD_INLINE vint4 operator^(vint4 a, int b) +{ + return a ^ vint4(b); +} + +/** + * @brief Return the clamped value between min and max. + */ +ASTCENC_SIMD_INLINE vint4 clamp(int minv, int maxv, vint4 a) +{ + return min(max(a, vint4(minv)), vint4(maxv)); +} + +/** + * @brief Return the horizontal sum of RGB vector lanes as a scalar. + */ +ASTCENC_SIMD_INLINE int hadd_rgb_s(vint4 a) +{ + return a.lane<0>() + a.lane<1>() + a.lane<2>(); +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE int hmin_s(vint4 a) +{ + return hmin(a).lane<0>(); +} + +/** + * @brief Generate a vint4 from a size_t. + */ + ASTCENC_SIMD_INLINE vint4 vint4_from_size(size_t a) + { + assert(a <= std::numeric_limits::max()); + return vint4(static_cast(a)); + } + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE int hmax_s(vint4 a) +{ + return hmax(a).lane<0>(); +} + +// ============================================================================ +// vfloat4 operators and functions +// ============================================================================ + +/** + * @brief Overload: vector by vector incremental addition. + */ +ASTCENC_SIMD_INLINE vfloat4& operator+=(vfloat4& a, const vfloat4& b) +{ + a = a + b; + return a; +} + +/** + * @brief Overload: vector by scalar addition. + */ +ASTCENC_SIMD_INLINE vfloat4 operator+(vfloat4 a, float b) +{ + return a + vfloat4(b); +} + +/** + * @brief Overload: vector by scalar subtraction. + */ +ASTCENC_SIMD_INLINE vfloat4 operator-(vfloat4 a, float b) +{ + return a - vfloat4(b); +} + +/** + * @brief Overload: vector by scalar multiplication. + */ +ASTCENC_SIMD_INLINE vfloat4 operator*(vfloat4 a, float b) +{ + return a * vfloat4(b); +} + +/** + * @brief Overload: scalar by vector multiplication. + */ +ASTCENC_SIMD_INLINE vfloat4 operator*(float a, vfloat4 b) +{ + return vfloat4(a) * b; +} + +/** + * @brief Overload: vector by scalar division. + */ +ASTCENC_SIMD_INLINE vfloat4 operator/(vfloat4 a, float b) +{ + return a / vfloat4(b); +} + +/** + * @brief Overload: scalar by vector division. + */ +ASTCENC_SIMD_INLINE vfloat4 operator/(float a, vfloat4 b) +{ + return vfloat4(a) / b; +} + +/** + * @brief Return the min vector of a vector and a scalar. + * + * If either lane value is NaN, @c b will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat4 min(vfloat4 a, float b) +{ + return min(a, vfloat4(b)); +} + +/** + * @brief Return the max vector of a vector and a scalar. + * + * If either lane value is NaN, @c b will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat4 max(vfloat4 a, float b) +{ + return max(a, vfloat4(b)); +} + +/** + * @brief Return the clamped value between min and max. + * + * It is assumed that neither @c min nor @c max are NaN values. If @c a is NaN + * then @c min will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat4 clamp(float minv, float maxv, vfloat4 a) +{ + // Do not reorder - second operand will return if either is NaN + return min(max(a, minv), maxv); +} + +/** + * @brief Return the clamped value between 0.0f and 1.0f. + * + * If @c a is NaN then zero will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat4 clampzo(vfloat4 a) +{ + // Do not reorder - second operand will return if either is NaN + return min(max(a, vfloat4::zero()), 1.0f); +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE float hmin_s(vfloat4 a) +{ + return hmin(a).lane<0>(); +} + +/** + * @brief Return the horizontal min of RGB vector lanes as a scalar. + */ +ASTCENC_SIMD_INLINE float hmin_rgb_s(vfloat4 a) +{ + a.set_lane<3>(a.lane<0>()); + return hmin_s(a); +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE float hmax_s(vfloat4 a) +{ + return hmax(a).lane<0>(); +} + +/** + * @brief Accumulate lane-wise sums for a vector. + */ +ASTCENC_SIMD_INLINE void haccumulate(vfloat4& accum, vfloat4 a) +{ + accum = accum + a; +} + +/** + * @brief Accumulate lane-wise sums for a masked vector. + */ +ASTCENC_SIMD_INLINE void haccumulate(vfloat4& accum, vfloat4 a, vmask4 m) +{ + a = select(vfloat4::zero(), a, m); + haccumulate(accum, a); +} + +/** + * @brief Return the horizontal sum of RGB vector lanes as a scalar. + */ +ASTCENC_SIMD_INLINE float hadd_rgb_s(vfloat4 a) +{ + return a.lane<0>() + a.lane<1>() + a.lane<2>(); +} + +#if !defined(ASTCENC_USE_NATIVE_DOT_PRODUCT) + +/** + * @brief Return the dot product for the full 4 lanes, returning scalar. + */ +ASTCENC_SIMD_INLINE float dot_s(vfloat4 a, vfloat4 b) +{ + vfloat4 m = a * b; + return hadd_s(m); +} + +/** + * @brief Return the dot product for the full 4 lanes, returning vector. + */ +ASTCENC_SIMD_INLINE vfloat4 dot(vfloat4 a, vfloat4 b) +{ + vfloat4 m = a * b; + return vfloat4(hadd_s(m)); +} + +/** + * @brief Return the dot product for the bottom 3 lanes, returning scalar. + */ +ASTCENC_SIMD_INLINE float dot3_s(vfloat4 a, vfloat4 b) +{ + vfloat4 m = a * b; + return hadd_rgb_s(m); +} + +/** + * @brief Return the dot product for the bottom 3 lanes, returning vector. + */ +ASTCENC_SIMD_INLINE vfloat4 dot3(vfloat4 a, vfloat4 b) +{ + vfloat4 m = a * b; + float d3 = hadd_rgb_s(m); + return vfloat4(d3, d3, d3, 0.0f); +} + +#endif + +#if !defined(ASTCENC_USE_NATIVE_POPCOUNT) + +/** + * @brief Population bit count. + * + * @param v The value to population count. + * + * @return The number of 1 bits. + */ +static inline int popcount(uint64_t v) +{ + uint64_t mask1 = 0x5555555555555555ULL; + uint64_t mask2 = 0x3333333333333333ULL; + uint64_t mask3 = 0x0F0F0F0F0F0F0F0FULL; + v -= (v >> 1) & mask1; + v = (v & mask2) + ((v >> 2) & mask2); + v += v >> 4; + v &= mask3; + v *= 0x0101010101010101ULL; + v >>= 56; + return static_cast(v); +} + +#endif + +/** + * @brief Apply signed bit transfer. + * + * @param input0 The first encoded endpoint. + * @param input1 The second encoded endpoint. + */ +static ASTCENC_SIMD_INLINE void bit_transfer_signed( + vint4& input0, + vint4& input1 +) { + input1 = lsr<1>(input1) | (input0 & 0x80); + input0 = lsr<1>(input0) & 0x3F; + + vmask4 mask = (input0 & 0x20) != vint4::zero(); + input0 = select(input0, input0 - 0x40, mask); +} + +/** + * @brief Debug function to print a vector of ints. + */ +ASTCENC_SIMD_INLINE void print(vint4 a) +{ + ASTCENC_ALIGNAS int v[4]; + storea(a, v); + printf("v4_i32:\n %8d %8d %8d %8d\n", + v[0], v[1], v[2], v[3]); +} + +/** + * @brief Debug function to print a vector of ints. + */ +ASTCENC_SIMD_INLINE void printx(vint4 a) +{ + ASTCENC_ALIGNAS int v[4]; + storea(a, v); + + unsigned int uv[4]; + std::memcpy(uv, v, sizeof(int) * 4); + + printf("v4_i32:\n %08x %08x %08x %08x\n", + uv[0], uv[1], uv[2], uv[3]); +} + +/** + * @brief Debug function to print a vector of floats. + */ +ASTCENC_SIMD_INLINE void print(vfloat4 a) +{ + ASTCENC_ALIGNAS float v[4]; + storea(a, v); + printf("v4_f32:\n %0.4f %0.4f %0.4f %0.4f\n", + static_cast(v[0]), static_cast(v[1]), + static_cast(v[2]), static_cast(v[3])); +} + +/** + * @brief Debug function to print a vector of masks. + */ +ASTCENC_SIMD_INLINE void print(vmask4 a) +{ + print(select(vint4(0), vint4(1), a)); +} + +#endif // #ifndef ASTC_VECMATHLIB_COMMON_4_H_INCLUDED diff --git a/ktx/external/astc-encoder/Source/astcenc_vecmathlib_neon_4.h b/ktx/external/astc-encoder/Source/astcenc_vecmathlib_neon_4.h new file mode 100644 index 0000000..f31063d --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_vecmathlib_neon_4.h @@ -0,0 +1,1121 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2019-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. +// ---------------------------------------------------------------------------- + +/** + * @brief 4x32-bit vectors, implemented using Armv8-A NEON. + * + * This module implements 4-wide 32-bit float, int, and mask vectors for + * Armv8-A NEON. + * + * There is a baseline level of functionality provided by all vector widths and + * implementations. This is implemented using identical function signatures, + * modulo data type, so we can use them as substitutable implementations in VLA + * code. + * + * The 4-wide vectors are also used as a fixed-width type, and significantly + * extend the functionality above that available to VLA code. + */ + +#ifndef ASTC_VECMATHLIB_NEON_4_H_INCLUDED +#define ASTC_VECMATHLIB_NEON_4_H_INCLUDED + +#ifndef ASTCENC_SIMD_INLINE + #error "Include astcenc_vecmathlib.h, do not include directly" +#endif + +#include +#include + +// ============================================================================ +// vfloat4 data type +// ============================================================================ + +/** + * @brief Data type for 4-wide floats. + */ +struct vfloat4 +{ + /** + * @brief Construct from zero-initialized value. + */ + ASTCENC_SIMD_INLINE vfloat4() = default; + + /** + * @brief Construct from 4 values loaded from an unaligned address. + * + * Consider using loada() which is better with vectors if data is aligned + * to vector length. + */ + ASTCENC_SIMD_INLINE explicit vfloat4(const float *p) + { + m = vld1q_f32(p); + } + + /** + * @brief Construct from 1 scalar value replicated across all lanes. + * + * Consider using zero() for constexpr zeros. + */ + ASTCENC_SIMD_INLINE explicit vfloat4(float a) + { + m = vdupq_n_f32(a); + } + + /** + * @brief Construct from 4 scalar values. + * + * The value of @c a is stored to lane 0 (LSB) in the SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vfloat4(float a, float b, float c, float d) + { + float v[4] { a, b, c, d }; + m = vld1q_f32(v); + } + + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vfloat4(float32x4_t a) + { + m = a; + } + + /** + * @brief Get the scalar value of a single lane. + */ + template ASTCENC_SIMD_INLINE float lane() const + { + return vgetq_lane_f32(m, l); + } + + /** + * @brief Set the scalar value of a single lane. + */ + template ASTCENC_SIMD_INLINE void set_lane(float a) + { + m = vsetq_lane_f32(a, m, l); + } + + /** + * @brief Factory that returns a vector of zeros. + */ + static ASTCENC_SIMD_INLINE vfloat4 zero() + { + return vfloat4(0.0f); + } + + /** + * @brief Factory that returns a replicated scalar loaded from memory. + */ + static ASTCENC_SIMD_INLINE vfloat4 load1(const float* p) + { + return vfloat4(vld1q_dup_f32(p)); + } + + /** + * @brief Factory that returns a vector loaded from 16B aligned memory. + */ + static ASTCENC_SIMD_INLINE vfloat4 loada(const float* p) + { + return vfloat4(vld1q_f32(p)); + } + + /** + * @brief Return a swizzled float 2. + */ + template ASTCENC_SIMD_INLINE vfloat4 swz() const + { + return vfloat4(lane(), lane(), 0.0f, 0.0f); + } + + /** + * @brief Return a swizzled float 3. + */ + template ASTCENC_SIMD_INLINE vfloat4 swz() const + { + return vfloat4(lane(), lane(), lane(), 0.0f); + } + + /** + * @brief Return a swizzled float 4. + */ + template ASTCENC_SIMD_INLINE vfloat4 swz() const + { + return vfloat4(lane(), lane(), lane(), lane()); + } + + /** + * @brief The vector ... + */ + float32x4_t m; +}; + +// ============================================================================ +// vint4 data type +// ============================================================================ + +/** + * @brief Data type for 4-wide ints. + */ +struct vint4 +{ + /** + * @brief Construct from zero-initialized value. + */ + ASTCENC_SIMD_INLINE vint4() = default; + + /** + * @brief Construct from 4 values loaded from an unaligned address. + * + * Consider using loada() which is better with vectors if data is aligned + * to vector length. + */ + ASTCENC_SIMD_INLINE explicit vint4(const int *p) + { + m = vld1q_s32(p); + } + + /** + * @brief Construct from 4 uint8_t loaded from an unaligned address. + */ + ASTCENC_SIMD_INLINE explicit vint4(const uint8_t *p) + { +#if ASTCENC_SVE == 0 + // Cast is safe - NEON loads are allowed to be unaligned + uint32x2_t t8 = vld1_dup_u32(reinterpret_cast(p)); + uint16x4_t t16 = vget_low_u16(vmovl_u8(vreinterpret_u8_u32(t8))); + m = vreinterpretq_s32_u32(vmovl_u16(t16)); +#else + svint32_t data = svld1ub_s32(svptrue_pat_b32(SV_VL4), p); + m = svget_neonq(data); +#endif + } + + /** + * @brief Construct from 1 scalar value replicated across all lanes. + * + * Consider using zero() for constexpr zeros. + */ + ASTCENC_SIMD_INLINE explicit vint4(int a) + { + m = vdupq_n_s32(a); + } + + /** + * @brief Construct from 4 scalar values. + * + * The value of @c a is stored to lane 0 (LSB) in the SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vint4(int a, int b, int c, int d) + { + int v[4] { a, b, c, d }; + m = vld1q_s32(v); + } + + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vint4(int32x4_t a) + { + m = a; + } + + /** + * @brief Get the scalar from a single lane. + */ + template ASTCENC_SIMD_INLINE int lane() const + { + return vgetq_lane_s32(m, l); + } + + /** + * @brief Set the scalar value of a single lane. + */ + template ASTCENC_SIMD_INLINE void set_lane(int a) + { + m = vsetq_lane_s32(a, m, l); + } + + /** + * @brief Factory that returns a vector of zeros. + */ + static ASTCENC_SIMD_INLINE vint4 zero() + { + return vint4(0); + } + + /** + * @brief Factory that returns a replicated scalar loaded from memory. + */ + static ASTCENC_SIMD_INLINE vint4 load1(const int* p) + { + return vint4(*p); + } + + /** + * @brief Factory that returns a vector loaded from unaligned memory. + */ + static ASTCENC_SIMD_INLINE vint4 load(const uint8_t* p) + { + vint4 data; + std::memcpy(&data.m, p, 4 * sizeof(int)); + return data; + } + + /** + * @brief Factory that returns a vector loaded from 16B aligned memory. + */ + static ASTCENC_SIMD_INLINE vint4 loada(const int* p) + { + return vint4(p); + } + + /** + * @brief Factory that returns a vector containing the lane IDs. + */ + static ASTCENC_SIMD_INLINE vint4 lane_id() + { + alignas(16) static const int data[4] { 0, 1, 2, 3 }; + return vint4(vld1q_s32(data)); + } + + /** + * @brief The vector ... + */ + int32x4_t m; +}; + +// ============================================================================ +// vmask4 data type +// ============================================================================ + +/** + * @brief Data type for 4-wide control plane masks. + */ +struct vmask4 +{ + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vmask4(uint32x4_t a) + { + m = a; + } + +#if !defined(_MSC_VER) + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vmask4(int32x4_t a) + { + m = vreinterpretq_u32_s32(a); + } +#endif + + /** + * @brief Construct from 1 scalar value. + */ + ASTCENC_SIMD_INLINE explicit vmask4(bool a) + { + m = vreinterpretq_u32_s32(vdupq_n_s32(a == true ? -1 : 0)); + } + + /** + * @brief Construct from 4 scalar values. + * + * The value of @c a is stored to lane 0 (LSB) in the SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vmask4(bool a, bool b, bool c, bool d) + { + int v[4] { + a == true ? -1 : 0, + b == true ? -1 : 0, + c == true ? -1 : 0, + d == true ? -1 : 0 + }; + + int32x4_t ms = vld1q_s32(v); + m = vreinterpretq_u32_s32(ms); + } + + /** + * @brief Get the scalar from a single lane. + */ + template ASTCENC_SIMD_INLINE bool lane() const + { + return vgetq_lane_u32(m, l) != 0; + } + + /** + * @brief The vector ... + */ + uint32x4_t m; +}; + +// ============================================================================ +// vmask4 operators and functions +// ============================================================================ + +/** + * @brief Overload: mask union (or). + */ +ASTCENC_SIMD_INLINE vmask4 operator|(vmask4 a, vmask4 b) +{ + return vmask4(vorrq_u32(a.m, b.m)); +} + +/** + * @brief Overload: mask intersect (and). + */ +ASTCENC_SIMD_INLINE vmask4 operator&(vmask4 a, vmask4 b) +{ + return vmask4(vandq_u32(a.m, b.m)); +} + +/** + * @brief Overload: mask difference (xor). + */ +ASTCENC_SIMD_INLINE vmask4 operator^(vmask4 a, vmask4 b) +{ + return vmask4(veorq_u32(a.m, b.m)); +} + +/** + * @brief Overload: mask invert (not). + */ +ASTCENC_SIMD_INLINE vmask4 operator~(vmask4 a) +{ + return vmask4(vmvnq_u32(a.m)); +} + +/** + * @brief Return a 4-bit mask code indicating mask status. + * + * bit0 = lane 0 + */ +ASTCENC_SIMD_INLINE unsigned int mask(vmask4 a) +{ + static const int shifta[4] { 0, 1, 2, 3 }; + static const int32x4_t shift = vld1q_s32(shifta); + + uint32x4_t tmp = vshrq_n_u32(a.m, 31); + return vaddvq_u32(vshlq_u32(tmp, shift)); +} + +/** + * @brief True if any lanes are enabled, false otherwise. + */ +ASTCENC_SIMD_INLINE bool any(vmask4 a) +{ + return vmaxvq_u32(a.m) != 0; +} + +/** + * @brief True if all lanes are enabled, false otherwise. + */ +ASTCENC_SIMD_INLINE bool all(vmask4 a) +{ + return vminvq_u32(a.m) != 0; +} + +// ============================================================================ +// vint4 operators and functions +// ============================================================================ + +/** + * @brief Overload: vector by vector addition. + */ +ASTCENC_SIMD_INLINE vint4 operator+(vint4 a, vint4 b) +{ + return vint4(vaddq_s32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector subtraction. + */ +ASTCENC_SIMD_INLINE vint4 operator-(vint4 a, vint4 b) +{ + return vint4(vsubq_s32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector multiplication. + */ +ASTCENC_SIMD_INLINE vint4 operator*(vint4 a, vint4 b) +{ + return vint4(vmulq_s32(a.m, b.m)); +} + +/** + * @brief Overload: vector bit invert. + */ +ASTCENC_SIMD_INLINE vint4 operator~(vint4 a) +{ + return vint4(vmvnq_s32(a.m)); +} + +/** + * @brief Overload: vector by vector bitwise or. + */ +ASTCENC_SIMD_INLINE vint4 operator|(vint4 a, vint4 b) +{ + return vint4(vorrq_s32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector bitwise and. + */ +ASTCENC_SIMD_INLINE vint4 operator&(vint4 a, vint4 b) +{ + return vint4(vandq_s32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector bitwise xor. + */ +ASTCENC_SIMD_INLINE vint4 operator^(vint4 a, vint4 b) +{ + return vint4(veorq_s32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector equality. + */ +ASTCENC_SIMD_INLINE vmask4 operator==(vint4 a, vint4 b) +{ + return vmask4(vceqq_s32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector inequality. + */ +ASTCENC_SIMD_INLINE vmask4 operator!=(vint4 a, vint4 b) +{ + return ~vmask4(vceqq_s32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector less than. + */ +ASTCENC_SIMD_INLINE vmask4 operator<(vint4 a, vint4 b) +{ + return vmask4(vcltq_s32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector greater than. + */ +ASTCENC_SIMD_INLINE vmask4 operator>(vint4 a, vint4 b) +{ + return vmask4(vcgtq_s32(a.m, b.m)); +} + +/** + * @brief Logical shift left. + */ +template ASTCENC_SIMD_INLINE vint4 lsl(vint4 a) +{ + return vint4(vshlq_s32(a.m, vdupq_n_s32(s))); +} + +/** + * @brief Logical shift right. + */ +template ASTCENC_SIMD_INLINE vint4 lsr(vint4 a) +{ + uint32x4_t ua = vreinterpretq_u32_s32(a.m); + ua = vshlq_u32(ua, vdupq_n_s32(-s)); + return vint4(vreinterpretq_s32_u32(ua)); +} + +/** + * @brief Arithmetic shift right. + */ +template ASTCENC_SIMD_INLINE vint4 asr(vint4 a) +{ + return vint4(vshlq_s32(a.m, vdupq_n_s32(-s))); +} + +/** + * @brief Return the min vector of two vectors. + */ +ASTCENC_SIMD_INLINE vint4 min(vint4 a, vint4 b) +{ + return vint4(vminq_s32(a.m, b.m)); +} + +/** + * @brief Return the max vector of two vectors. + */ +ASTCENC_SIMD_INLINE vint4 max(vint4 a, vint4 b) +{ + return vint4(vmaxq_s32(a.m, b.m)); +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE vint4 hmin(vint4 a) +{ + return vint4(vminvq_s32(a.m)); +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE vint4 hmax(vint4 a) +{ + return vint4(vmaxvq_s32(a.m)); +} + +/** + * @brief Store a vector to a 16B aligned memory address. + */ +ASTCENC_SIMD_INLINE void storea(vint4 a, int* p) +{ + vst1q_s32(p, a.m); +} + +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vint4 a, int* p) +{ + vst1q_s32(p, a.m); +} + +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vint4 a, uint8_t* p) +{ + std::memcpy(p, &a.m, sizeof(int) * 4); +} + +/** + * @brief Store lowest N (vector width) bytes into an unaligned address. + */ +ASTCENC_SIMD_INLINE void store_nbytes(vint4 a, uint8_t* p) +{ + vst1q_lane_s32(reinterpret_cast(p), a.m, 0); +} + +/** + * @brief Pack and store low 8 bits of each vector lane. + */ +ASTCENC_SIMD_INLINE void pack_and_store_low_bytes(vint4 a, uint8_t* data) +{ + alignas(16) uint8_t shuf[16] { + 0, 4, 8, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + uint8x16_t idx = vld1q_u8(shuf); + int8x16_t av = vreinterpretq_s8_s32(a.m); + a = vint4(vreinterpretq_s32_s8(vqtbl1q_s8(av, idx))); + store_nbytes(a, data); +} + +/** + * @brief Return lanes from @c b if @c cond is set, else @c a. + */ +ASTCENC_SIMD_INLINE vint4 select(vint4 a, vint4 b, vmask4 cond) +{ + return vint4(vbslq_s32(cond.m, b.m, a.m)); +} + +// ============================================================================ +// vfloat4 operators and functions +// ============================================================================ + +/** + * @brief Overload: vector by vector addition. + */ +ASTCENC_SIMD_INLINE vfloat4 operator+(vfloat4 a, vfloat4 b) +{ + return vfloat4(vaddq_f32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector subtraction. + */ +ASTCENC_SIMD_INLINE vfloat4 operator-(vfloat4 a, vfloat4 b) +{ + return vfloat4(vsubq_f32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector multiplication. + */ +ASTCENC_SIMD_INLINE vfloat4 operator*(vfloat4 a, vfloat4 b) +{ + return vfloat4(vmulq_f32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector division. + */ +ASTCENC_SIMD_INLINE vfloat4 operator/(vfloat4 a, vfloat4 b) +{ + return vfloat4(vdivq_f32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector equality. + */ +ASTCENC_SIMD_INLINE vmask4 operator==(vfloat4 a, vfloat4 b) +{ + return vmask4(vceqq_f32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector inequality. + */ +ASTCENC_SIMD_INLINE vmask4 operator!=(vfloat4 a, vfloat4 b) +{ + return vmask4(vmvnq_u32(vceqq_f32(a.m, b.m))); +} + +/** + * @brief Overload: vector by vector less than. + */ +ASTCENC_SIMD_INLINE vmask4 operator<(vfloat4 a, vfloat4 b) +{ + return vmask4(vcltq_f32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector greater than. + */ +ASTCENC_SIMD_INLINE vmask4 operator>(vfloat4 a, vfloat4 b) +{ + return vmask4(vcgtq_f32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector less than or equal. + */ +ASTCENC_SIMD_INLINE vmask4 operator<=(vfloat4 a, vfloat4 b) +{ + return vmask4(vcleq_f32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector greater than or equal. + */ +ASTCENC_SIMD_INLINE vmask4 operator>=(vfloat4 a, vfloat4 b) +{ + return vmask4(vcgeq_f32(a.m, b.m)); +} + +/** + * @brief Return the min vector of two vectors. + * + * If either lane value is NaN, @c b will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat4 min(vfloat4 a, vfloat4 b) +{ + // Do not reorder - second operand will return if either is NaN + return vfloat4(vminnmq_f32(a.m, b.m)); +} + +/** + * @brief Return the max vector of two vectors. + * + * If either lane value is NaN, @c b will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat4 max(vfloat4 a, vfloat4 b) +{ + // Do not reorder - second operand will return if either is NaN + return vfloat4(vmaxnmq_f32(a.m, b.m)); +} + +/** + * @brief Return the absolute value of the float vector. + */ +ASTCENC_SIMD_INLINE vfloat4 abs(vfloat4 a) +{ + float32x4_t zero = vdupq_n_f32(0.0f); + float32x4_t inv = vsubq_f32(zero, a.m); + return vfloat4(vmaxq_f32(a.m, inv)); +} + +/** + * @brief Return a float rounded to the nearest integer value. + */ +ASTCENC_SIMD_INLINE vfloat4 round(vfloat4 a) +{ + return vfloat4(vrndnq_f32(a.m)); +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE vfloat4 hmin(vfloat4 a) +{ + return vfloat4(vminvq_f32(a.m)); +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE vfloat4 hmax(vfloat4 a) +{ + return vfloat4(vmaxvq_f32(a.m)); +} + +/** + * @brief Return the horizontal sum of a vector. + */ +ASTCENC_SIMD_INLINE float hadd_s(vfloat4 a) +{ + // Perform halving add to ensure invariance; we cannot use vaddqv as this + // does (0 + 1 + 2 + 3) which is not invariant with x86 (0 + 2) + (1 + 3). + float32x2_t t = vadd_f32(vget_high_f32(a.m), vget_low_f32(a.m)); + return vget_lane_f32(vpadd_f32(t, t), 0); +} + +/** + * @brief Return the sqrt of the lanes in the vector. + */ +ASTCENC_SIMD_INLINE vfloat4 sqrt(vfloat4 a) +{ + return vfloat4(vsqrtq_f32(a.m)); +} + +/** + * @brief Return lanes from @c b if @c cond is set, else @c a. + */ +ASTCENC_SIMD_INLINE vfloat4 select(vfloat4 a, vfloat4 b, vmask4 cond) +{ + return vfloat4(vbslq_f32(cond.m, b.m, a.m)); +} + +/** + * @brief Load a vector of gathered results from an array; + */ +ASTCENC_SIMD_INLINE vfloat4 gatherf(const float* base, vint4 indices) +{ +#if ASTCENC_SVE == 0 + alignas(16) int idx[4]; + storea(indices, idx); + alignas(16) float vals[4]; + vals[0] = base[idx[0]]; + vals[1] = base[idx[1]]; + vals[2] = base[idx[2]]; + vals[3] = base[idx[3]]; + return vfloat4(vals); +#else + svint32_t offsets = svset_neonq_s32(svundef_s32(), indices.m); + svfloat32_t data = svld1_gather_s32index_f32(svptrue_pat_b32(SV_VL4), base, offsets); + return vfloat4(svget_neonq_f32(data)); +#endif +} + +/** + * @brief Load a vector of gathered results from an array using byte indices from memory + */ +template<> +ASTCENC_SIMD_INLINE vfloat4 gatherf_byte_inds(const float* base, const uint8_t* indices) +{ +#if ASTCENC_SVE == 0 + alignas(16) float vals[4]; + vals[0] = base[indices[0]]; + vals[1] = base[indices[1]]; + vals[2] = base[indices[2]]; + vals[3] = base[indices[3]]; + return vfloat4(vals); +#else + svint32_t offsets = svld1ub_s32(svptrue_pat_b32(SV_VL4), indices); + svfloat32_t data = svld1_gather_s32index_f32(svptrue_pat_b32(SV_VL4), base, offsets); + return vfloat4(svget_neonq_f32(data)); +#endif +} +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vfloat4 a, float* p) +{ + vst1q_f32(p, a.m); +} + +/** + * @brief Store a vector to a 16B aligned memory address. + */ +ASTCENC_SIMD_INLINE void storea(vfloat4 a, float* p) +{ + vst1q_f32(p, a.m); +} + +/** + * @brief Return a integer value for a float vector, using truncation. + */ +ASTCENC_SIMD_INLINE vint4 float_to_int(vfloat4 a) +{ + return vint4(vcvtq_s32_f32(a.m)); +} + +/** + * @brief Return a integer value for a float vector, using round-to-nearest. + */ +ASTCENC_SIMD_INLINE vint4 float_to_int_rtn(vfloat4 a) +{ + a = a + vfloat4(0.5f); + return vint4(vcvtq_s32_f32(a.m)); +} + +/** + * @brief Return a float value for an integer vector. + */ +ASTCENC_SIMD_INLINE vfloat4 int_to_float(vint4 a) +{ + return vfloat4(vcvtq_f32_s32(a.m)); +} + +/** + * @brief Return a float16 value for a float vector, using round-to-nearest. + */ +ASTCENC_SIMD_INLINE vint4 float_to_float16(vfloat4 a) +{ + // Generate float16 value + float16x4_t f16 = vcvt_f16_f32(a.m); + + // Convert each 16-bit float pattern to a 32-bit pattern + uint16x4_t u16 = vreinterpret_u16_f16(f16); + uint32x4_t u32 = vmovl_u16(u16); + return vint4(vreinterpretq_s32_u32(u32)); +} + +/** + * @brief Return a float16 value for a float scalar, using round-to-nearest. + */ +static inline uint16_t float_to_float16(float a) +{ + vfloat4 av(a); + return static_cast(float_to_float16(av).lane<0>()); +} + +/** + * @brief Return a float value for a float16 vector. + */ +ASTCENC_SIMD_INLINE vfloat4 float16_to_float(vint4 a) +{ + // Convert each 32-bit float pattern to a 16-bit pattern + uint32x4_t u32 = vreinterpretq_u32_s32(a.m); + uint16x4_t u16 = vmovn_u32(u32); + float16x4_t f16 = vreinterpret_f16_u16(u16); + + // Generate float16 value + return vfloat4(vcvt_f32_f16(f16)); +} + +/** + * @brief Return a float value for a float16 scalar. + */ +ASTCENC_SIMD_INLINE float float16_to_float(uint16_t a) +{ + vint4 av(a); + return float16_to_float(av).lane<0>(); +} + +/** + * @brief Return a float value as an integer bit pattern (i.e. no conversion). + * + * It is a common trick to convert floats into integer bit patterns, perform + * some bit hackery based on knowledge they are IEEE 754 layout, and then + * convert them back again. This is the first half of that flip. + */ +ASTCENC_SIMD_INLINE vint4 float_as_int(vfloat4 a) +{ + return vint4(vreinterpretq_s32_f32(a.m)); +} + +/** + * @brief Return a integer value as a float bit pattern (i.e. no conversion). + * + * It is a common trick to convert floats into integer bit patterns, perform + * some bit hackery based on knowledge they are IEEE 754 layout, and then + * convert them back again. This is the second half of that flip. + */ +ASTCENC_SIMD_INLINE vfloat4 int_as_float(vint4 v) +{ + return vfloat4(vreinterpretq_f32_s32(v.m)); +} + +/* + * Table structure for a 16x 8-bit entry table. + */ +struct vtable4_16x8 { + uint8x16_t t0; +}; + +/* + * Table structure for a 32x 8-bit entry table. + */ +struct vtable4_32x8 { + uint8x16x2_t t01; +}; + +/* + * Table structure for a 64x 8-bit entry table. + */ +struct vtable4_64x8 { + uint8x16x4_t t0123; +}; + +/** + * @brief Prepare a vtable lookup table for 16x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable4_16x8& table, + const uint8_t* data +) { + table.t0 = vld1q_u8(data); +} + +/** + * @brief Prepare a vtable lookup table for 32x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable4_32x8& table, + const uint8_t* data +) { + table.t01 = uint8x16x2_t { + vld1q_u8(data), + vld1q_u8(data + 16) + }; +} + +/** + * @brief Prepare a vtable lookup table 64x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable4_64x8& table, + const uint8_t* data +) { + table.t0123 = uint8x16x4_t { + vld1q_u8(data), + vld1q_u8(data + 16), + vld1q_u8(data + 32), + vld1q_u8(data + 48) + }; +} + +/** + * @brief Perform a vtable lookup in a 16x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint4 vtable_lookup_32bit( + const vtable4_16x8& tbl, + vint4 idx +) { + // Set index byte above max index for unused bytes so table lookup returns zero + int32x4_t idx_masked = vorrq_s32(idx.m, vdupq_n_s32(0xFFFFFF00)); + uint8x16_t idx_bytes = vreinterpretq_u8_s32(idx_masked); + + return vint4(vreinterpretq_s32_u8(vqtbl1q_u8(tbl.t0, idx_bytes))); +} + +/** + * @brief Perform a vtable lookup in a 32x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint4 vtable_lookup_32bit( + const vtable4_32x8& tbl, + vint4 idx +) { + // Set index byte above max index for unused bytes so table lookup returns zero + int32x4_t idx_masked = vorrq_s32(idx.m, vdupq_n_s32(0xFFFFFF00)); + uint8x16_t idx_bytes = vreinterpretq_u8_s32(idx_masked); + + return vint4(vreinterpretq_s32_u8(vqtbl2q_u8(tbl.t01, idx_bytes))); +} + +/** + * @brief Perform a vtable lookup in a 64x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint4 vtable_lookup_32bit( + const vtable4_64x8& tbl, + vint4 idx +) { + // Set index byte above max index for unused bytes so table lookup returns zero + int32x4_t idx_masked = vorrq_s32(idx.m, vdupq_n_s32(0xFFFFFF00)); + uint8x16_t idx_bytes = vreinterpretq_u8_s32(idx_masked); + + return vint4(vreinterpretq_s32_u8(vqtbl4q_u8(tbl.t0123, idx_bytes))); +} + +/** + * @brief Return a vector of interleaved RGBA data. + * + * Input vectors have the value stored in the bottom 8 bits of each lane, + * with high bits set to zero. + * + * Output vector stores a single RGBA texel packed in each lane. + */ +ASTCENC_SIMD_INLINE vint4 interleave_rgba8(vint4 r, vint4 g, vint4 b, vint4 a) +{ + return r + lsl<8>(g) + lsl<16>(b) + lsl<24>(a); +} + +/** + * @brief Store a single vector lane to an unaligned address. + */ +ASTCENC_SIMD_INLINE void store_lane(uint8_t* base, int data) +{ + std::memcpy(base, &data, sizeof(int)); +} + +/** + * @brief Store a vector, skipping masked lanes. + * + * All masked lanes must be at the end of vector, after all non-masked lanes. + */ +ASTCENC_SIMD_INLINE void store_lanes_masked(uint8_t* base, vint4 data, vmask4 mask) +{ + if (mask.lane<3>()) + { + store(data, base); + } + else if (mask.lane<2>() != 0.0f) + { + store_lane(base + 0, data.lane<0>()); + store_lane(base + 4, data.lane<1>()); + store_lane(base + 8, data.lane<2>()); + } + else if (mask.lane<1>() != 0.0f) + { + store_lane(base + 0, data.lane<0>()); + store_lane(base + 4, data.lane<1>()); + } + else if (mask.lane<0>() != 0.0f) + { + store_lane(base + 0, data.lane<0>()); + } +} + +#define ASTCENC_USE_NATIVE_POPCOUNT 1 + +/** + * @brief Population bit count. + * + * @param v The value to population count. + * + * @return The number of 1 bits. + */ +ASTCENC_SIMD_INLINE int popcount(uint64_t v) +{ + return static_cast(vaddlv_u8(vcnt_u8(vcreate_u8(v)))); +} + +#endif // #ifndef ASTC_VECMATHLIB_NEON_4_H_INCLUDED diff --git a/ktx/external/astc-encoder/Source/astcenc_vecmathlib_none_4.h b/ktx/external/astc-encoder/Source/astcenc_vecmathlib_none_4.h new file mode 100644 index 0000000..dcccd63 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_vecmathlib_none_4.h @@ -0,0 +1,1222 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2019-2025 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. +// ---------------------------------------------------------------------------- + +/** + * @brief 4x32-bit vectors, implemented using plain C++. + * + * This module implements 4-wide 32-bit float, int, and mask vectors. This + * module provides a scalar fallback for VLA code, primarily useful for + * debugging VLA algorithms without the complexity of handling SIMD. Only the + * baseline level of functionality needed to support VLA is provided. + * + * Note that the vector conditional operators implemented by this module are + * designed to behave like SIMD conditional operators that generate lane masks. + * Rather than returning 0/1 booleans like normal C++ code they will return + * 0/-1 to give a full lane-width bitmask. + * + * Note that the documentation for this module still talks about "vectors" to + * help developers think about the implied VLA behavior when writing optimized + * paths. + */ + +#ifndef ASTC_VECMATHLIB_NONE_4_H_INCLUDED +#define ASTC_VECMATHLIB_NONE_4_H_INCLUDED + +#ifndef ASTCENC_SIMD_INLINE + #error "Include astcenc_vecmathlib.h, do not include directly" +#endif + +#include +#include +#include +#include + +// ============================================================================ +// vfloat4 data type +// ============================================================================ + +/** + * @brief Data type for 4-wide floats. + */ +struct vfloat4 +{ + /** + * @brief Construct from zero-initialized value. + */ + ASTCENC_SIMD_INLINE vfloat4() = default; + + /** + * @brief Construct from 4 values loaded from an unaligned address. + * + * Consider using loada() which is better with wider VLA vectors if data is + * aligned to vector length. + */ + ASTCENC_SIMD_INLINE explicit vfloat4(const float* p) + { + m[0] = p[0]; + m[1] = p[1]; + m[2] = p[2]; + m[3] = p[3]; + } + + /** + * @brief Construct from 4 scalar values replicated across all lanes. + * + * Consider using zero() for constexpr zeros. + */ + ASTCENC_SIMD_INLINE explicit vfloat4(float a) + { + m[0] = a; + m[1] = a; + m[2] = a; + m[3] = a; + } + + /** + * @brief Construct from 4 scalar values. + * + * The value of @c a is stored to lane 0 (LSB) in the SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vfloat4(float a, float b, float c, float d) + { + m[0] = a; + m[1] = b; + m[2] = c; + m[3] = d; + } + + /** + * @brief Get the scalar value of a single lane. + */ + template ASTCENC_SIMD_INLINE float lane() const + { + return m[l]; + } + + /** + * @brief Set the scalar value of a single lane. + */ + template ASTCENC_SIMD_INLINE void set_lane(float a) + { + m[l] = a; + } + + /** + * @brief Factory that returns a vector of zeros. + */ + static ASTCENC_SIMD_INLINE vfloat4 zero() + { + return vfloat4(0.0f); + } + + /** + * @brief Factory that returns a replicated scalar loaded from memory. + */ + static ASTCENC_SIMD_INLINE vfloat4 load1(const float* p) + { + return vfloat4(*p); + } + + /** + * @brief Factory that returns a vector loaded from aligned memory. + */ + static ASTCENC_SIMD_INLINE vfloat4 loada(const float* p) + { + return vfloat4(p); + } + + /** + * @brief Return a swizzled float 2. + */ + template ASTCENC_SIMD_INLINE vfloat4 swz() const + { + return vfloat4(lane(), lane(), 0.0f, 0.0f); + } + + /** + * @brief Return a swizzled float 3. + */ + template ASTCENC_SIMD_INLINE vfloat4 swz() const + { + return vfloat4(lane(), lane(), lane(), 0.0f); + } + + /** + * @brief Return a swizzled float 4. + */ + template ASTCENC_SIMD_INLINE vfloat4 swz() const + { + return vfloat4(lane(), lane(), lane(), lane()); + } + + /** + * @brief The vector ... + */ + float m[4]; +}; + +// ============================================================================ +// vint4 data type +// ============================================================================ + +/** + * @brief Data type for 4-wide ints. + */ +struct vint4 +{ + /** + * @brief Construct from zero-initialized value. + */ + ASTCENC_SIMD_INLINE vint4() = default; + + /** + * @brief Construct from 4 values loaded from an unaligned address. + * + * Consider using vint4::loada() which is better with wider VLA vectors + * if data is aligned. + */ + ASTCENC_SIMD_INLINE explicit vint4(const int* p) + { + m[0] = p[0]; + m[1] = p[1]; + m[2] = p[2]; + m[3] = p[3]; + } + + /** + * @brief Construct from 4 uint8_t loaded from an unaligned address. + */ + ASTCENC_SIMD_INLINE explicit vint4(const uint8_t *p) + { + m[0] = p[0]; + m[1] = p[1]; + m[2] = p[2]; + m[3] = p[3]; + } + + /** + * @brief Construct from 4 scalar values. + * + * The value of @c a is stored to lane 0 (LSB) in the SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vint4(int a, int b, int c, int d) + { + m[0] = a; + m[1] = b; + m[2] = c; + m[3] = d; + } + + + /** + * @brief Construct from 4 scalar values replicated across all lanes. + * + * Consider using zero() for constexpr zeros. + */ + ASTCENC_SIMD_INLINE explicit vint4(int a) + { + m[0] = a; + m[1] = a; + m[2] = a; + m[3] = a; + } + + /** + * @brief Get the scalar value of a single lane. + */ + template ASTCENC_SIMD_INLINE int lane() const + { + return m[l]; + } + + /** + * @brief Set the scalar value of a single lane. + */ + template ASTCENC_SIMD_INLINE void set_lane(int a) + { + m[l] = a; + } + + /** + * @brief Factory that returns a vector of zeros. + */ + static ASTCENC_SIMD_INLINE vint4 zero() + { + return vint4(0); + } + + /** + * @brief Factory that returns a replicated scalar loaded from memory. + */ + static ASTCENC_SIMD_INLINE vint4 load1(const int* p) + { + return vint4(*p); + } + + /** + * @brief Factory that returns a vector loaded from unaligned memory. + */ + static ASTCENC_SIMD_INLINE vint4 load(const uint8_t* p) + { + vint4 data; + std::memcpy(&data.m, p, 4 * sizeof(int)); + return data; + } + + /** + * @brief Factory that returns a vector loaded from 16B aligned memory. + */ + static ASTCENC_SIMD_INLINE vint4 loada(const int* p) + { + return vint4(p); + } + + /** + * @brief Factory that returns a vector containing the lane IDs. + */ + static ASTCENC_SIMD_INLINE vint4 lane_id() + { + return vint4(0, 1, 2, 3); + } + + /** + * @brief The vector ... + */ + int m[4]; +}; + +// ============================================================================ +// vmask4 data type +// ============================================================================ + +/** + * @brief Data type for 4-wide control plane masks. + */ +struct vmask4 +{ + /** + * @brief Construct from an existing mask value. + */ + ASTCENC_SIMD_INLINE explicit vmask4(int* p) + { + m[0] = p[0]; + m[1] = p[1]; + m[2] = p[2]; + m[3] = p[3]; + } + + /** + * @brief Construct from 1 scalar value. + */ + ASTCENC_SIMD_INLINE explicit vmask4(bool a) + { + m[0] = a == false ? 0 : -1; + m[1] = a == false ? 0 : -1; + m[2] = a == false ? 0 : -1; + m[3] = a == false ? 0 : -1; + } + + /** + * @brief Construct from 4 scalar values. + * + * The value of @c a is stored to lane 0 (LSB) in the SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vmask4(bool a, bool b, bool c, bool d) + { + m[0] = a == false ? 0 : -1; + m[1] = b == false ? 0 : -1; + m[2] = c == false ? 0 : -1; + m[3] = d == false ? 0 : -1; + } + + /** + * @brief Get the scalar value of a single lane. + */ + template ASTCENC_SIMD_INLINE bool lane() const + { + return m[l] != 0; + } + + /** + * @brief The vector ... + */ + int m[4]; +}; + +// ============================================================================ +// vmask4 operators and functions +// ============================================================================ + +/** + * @brief Overload: mask union (or). + */ +ASTCENC_SIMD_INLINE vmask4 operator|(vmask4 a, vmask4 b) +{ + return vmask4(a.m[0] | b.m[0], + a.m[1] | b.m[1], + a.m[2] | b.m[2], + a.m[3] | b.m[3]); +} + +/** + * @brief Overload: mask intersect (and). + */ +ASTCENC_SIMD_INLINE vmask4 operator&(vmask4 a, vmask4 b) +{ + return vmask4(a.m[0] & b.m[0], + a.m[1] & b.m[1], + a.m[2] & b.m[2], + a.m[3] & b.m[3]); +} + +/** + * @brief Overload: mask difference (xor). + */ +ASTCENC_SIMD_INLINE vmask4 operator^(vmask4 a, vmask4 b) +{ + return vmask4(a.m[0] ^ b.m[0], + a.m[1] ^ b.m[1], + a.m[2] ^ b.m[2], + a.m[3] ^ b.m[3]); +} + +/** + * @brief Overload: mask invert (not). + */ +ASTCENC_SIMD_INLINE vmask4 operator~(vmask4 a) +{ + return vmask4(~a.m[0], + ~a.m[1], + ~a.m[2], + ~a.m[3]); +} + +/** + * @brief Return a 1-bit mask code indicating mask status. + * + * bit0 = lane 0 + */ +ASTCENC_SIMD_INLINE unsigned int mask(vmask4 a) +{ + return (a.m[0] & 0x1) | + (a.m[1] & 0x2) | + (a.m[2] & 0x4) | + (a.m[3] & 0x8); +} + +/** + * @brief True if any lanes are enabled, false otherwise. + */ +ASTCENC_SIMD_INLINE bool any(vmask4 a) +{ + return mask(a) != 0; +} + +/** + * @brief True if all lanes are enabled, false otherwise. + */ +ASTCENC_SIMD_INLINE bool all(vmask4 a) +{ + return mask(a) == 0xF; +} + +// ============================================================================ +// vint4 operators and functions +// ============================================================================ + +/** + * @brief Overload: vector by vector addition. + */ +ASTCENC_SIMD_INLINE vint4 operator+(vint4 a, vint4 b) +{ + return vint4(a.m[0] + b.m[0], + a.m[1] + b.m[1], + a.m[2] + b.m[2], + a.m[3] + b.m[3]); +} + +/** + * @brief Overload: vector by vector subtraction. + */ +ASTCENC_SIMD_INLINE vint4 operator-(vint4 a, vint4 b) +{ + return vint4(a.m[0] - b.m[0], + a.m[1] - b.m[1], + a.m[2] - b.m[2], + a.m[3] - b.m[3]); +} + +/** + * @brief Overload: vector by vector multiplication. + */ +ASTCENC_SIMD_INLINE vint4 operator*(vint4 a, vint4 b) +{ + return vint4(a.m[0] * b.m[0], + a.m[1] * b.m[1], + a.m[2] * b.m[2], + a.m[3] * b.m[3]); +} + +/** + * @brief Overload: vector bit invert. + */ +ASTCENC_SIMD_INLINE vint4 operator~(vint4 a) +{ + return vint4(~a.m[0], + ~a.m[1], + ~a.m[2], + ~a.m[3]); +} + +/** + * @brief Overload: vector by vector bitwise or. + */ +ASTCENC_SIMD_INLINE vint4 operator|(vint4 a, vint4 b) +{ + return vint4(a.m[0] | b.m[0], + a.m[1] | b.m[1], + a.m[2] | b.m[2], + a.m[3] | b.m[3]); +} + +/** + * @brief Overload: vector by vector bitwise and. + */ +ASTCENC_SIMD_INLINE vint4 operator&(vint4 a, vint4 b) +{ + return vint4(a.m[0] & b.m[0], + a.m[1] & b.m[1], + a.m[2] & b.m[2], + a.m[3] & b.m[3]); +} + +/** + * @brief Overload: vector by vector bitwise xor. + */ +ASTCENC_SIMD_INLINE vint4 operator^(vint4 a, vint4 b) +{ + return vint4(a.m[0] ^ b.m[0], + a.m[1] ^ b.m[1], + a.m[2] ^ b.m[2], + a.m[3] ^ b.m[3]); +} + +/** + * @brief Overload: vector by vector equality. + */ +ASTCENC_SIMD_INLINE vmask4 operator==(vint4 a, vint4 b) +{ + return vmask4(a.m[0] == b.m[0], + a.m[1] == b.m[1], + a.m[2] == b.m[2], + a.m[3] == b.m[3]); +} + +/** + * @brief Overload: vector by vector inequality. + */ +ASTCENC_SIMD_INLINE vmask4 operator!=(vint4 a, vint4 b) +{ + return vmask4(a.m[0] != b.m[0], + a.m[1] != b.m[1], + a.m[2] != b.m[2], + a.m[3] != b.m[3]); +} + +/** + * @brief Overload: vector by vector less than. + */ +ASTCENC_SIMD_INLINE vmask4 operator<(vint4 a, vint4 b) +{ + return vmask4(a.m[0] < b.m[0], + a.m[1] < b.m[1], + a.m[2] < b.m[2], + a.m[3] < b.m[3]); +} + +/** + * @brief Overload: vector by vector greater than. + */ +ASTCENC_SIMD_INLINE vmask4 operator>(vint4 a, vint4 b) +{ + return vmask4(a.m[0] > b.m[0], + a.m[1] > b.m[1], + a.m[2] > b.m[2], + a.m[3] > b.m[3]); +} + +/** + * @brief Logical shift left. + */ +template ASTCENC_SIMD_INLINE vint4 lsl(vint4 a) +{ + // Cast to unsigned to avoid shift in/out of sign bit undefined behavior + unsigned int as0 = static_cast(a.m[0]) << s; + unsigned int as1 = static_cast(a.m[1]) << s; + unsigned int as2 = static_cast(a.m[2]) << s; + unsigned int as3 = static_cast(a.m[3]) << s; + + return vint4(static_cast(as0), + static_cast(as1), + static_cast(as2), + static_cast(as3)); +} + +/** + * @brief Logical shift right. + */ +template ASTCENC_SIMD_INLINE vint4 lsr(vint4 a) +{ + // Cast to unsigned to avoid shift in/out of sign bit undefined behavior + unsigned int as0 = static_cast(a.m[0]) >> s; + unsigned int as1 = static_cast(a.m[1]) >> s; + unsigned int as2 = static_cast(a.m[2]) >> s; + unsigned int as3 = static_cast(a.m[3]) >> s; + + return vint4(static_cast(as0), + static_cast(as1), + static_cast(as2), + static_cast(as3)); +} + +/** + * @brief Arithmetic shift right. + */ +template ASTCENC_SIMD_INLINE vint4 asr(vint4 a) +{ + return vint4(a.m[0] >> s, + a.m[1] >> s, + a.m[2] >> s, + a.m[3] >> s); +} + +/** + * @brief Return the min vector of two vectors. + */ +ASTCENC_SIMD_INLINE vint4 min(vint4 a, vint4 b) +{ + return vint4(a.m[0] < b.m[0] ? a.m[0] : b.m[0], + a.m[1] < b.m[1] ? a.m[1] : b.m[1], + a.m[2] < b.m[2] ? a.m[2] : b.m[2], + a.m[3] < b.m[3] ? a.m[3] : b.m[3]); +} + +/** + * @brief Return the min vector of two vectors. + */ +ASTCENC_SIMD_INLINE vint4 max(vint4 a, vint4 b) +{ + return vint4(a.m[0] > b.m[0] ? a.m[0] : b.m[0], + a.m[1] > b.m[1] ? a.m[1] : b.m[1], + a.m[2] > b.m[2] ? a.m[2] : b.m[2], + a.m[3] > b.m[3] ? a.m[3] : b.m[3]); +} + +/** + * @brief Return the horizontal minimum of a single vector. + */ +ASTCENC_SIMD_INLINE vint4 hmin(vint4 a) +{ + int b = std::min(a.m[0], a.m[1]); + int c = std::min(a.m[2], a.m[3]); + return vint4(std::min(b, c)); +} + +/** + * @brief Return the horizontal maximum of a single vector. + */ +ASTCENC_SIMD_INLINE vint4 hmax(vint4 a) +{ + int b = std::max(a.m[0], a.m[1]); + int c = std::max(a.m[2], a.m[3]); + return vint4(std::max(b, c)); +} + +/** + * @brief Store a vector to an aligned memory address. + */ +ASTCENC_SIMD_INLINE void storea(vint4 a, int* p) +{ + p[0] = a.m[0]; + p[1] = a.m[1]; + p[2] = a.m[2]; + p[3] = a.m[3]; +} + +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vint4 a, int* p) +{ + p[0] = a.m[0]; + p[1] = a.m[1]; + p[2] = a.m[2]; + p[3] = a.m[3]; +} + +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vint4 a, uint8_t* p) +{ + std::memcpy(p, a.m, sizeof(int) * 4); +} + +/** + * @brief Store lowest N (vector width) bytes into an unaligned address. + */ +ASTCENC_SIMD_INLINE void store_nbytes(vint4 a, uint8_t* p) +{ + std::memcpy(p, a.m, sizeof(uint8_t) * 4); +} + +/** + * @brief Pack low 8 bits of N (vector width) lanes into bottom of vector. + */ +ASTCENC_SIMD_INLINE void pack_and_store_low_bytes(vint4 a, uint8_t* p) +{ + int b0 = a.m[0] & 0xFF; + int b1 = a.m[1] & 0xFF; + int b2 = a.m[2] & 0xFF; + int b3 = a.m[3] & 0xFF; + +#if !defined(ASTCENC_BIG_ENDIAN) + int b = b0 | (b1 << 8) | (b2 << 16) | (b3 << 24); +#else + int b = b3 | (b2 << 8) | (b1 << 16) | (b0 << 24); +#endif + a = vint4(b, 0, 0, 0); + store_nbytes(a, p); +} + +/** + * @brief Return lanes from @c b if MSB of @c cond is set, else @c a. + */ +ASTCENC_SIMD_INLINE vint4 select(vint4 a, vint4 b, vmask4 cond) +{ + return vint4((cond.m[0] & static_cast(0x80000000)) ? b.m[0] : a.m[0], + (cond.m[1] & static_cast(0x80000000)) ? b.m[1] : a.m[1], + (cond.m[2] & static_cast(0x80000000)) ? b.m[2] : a.m[2], + (cond.m[3] & static_cast(0x80000000)) ? b.m[3] : a.m[3]); +} + +// ============================================================================ +// vfloat4 operators and functions +// ============================================================================ + +/** + * @brief Overload: vector by vector addition. + */ +ASTCENC_SIMD_INLINE vfloat4 operator+(vfloat4 a, vfloat4 b) +{ + return vfloat4(a.m[0] + b.m[0], + a.m[1] + b.m[1], + a.m[2] + b.m[2], + a.m[3] + b.m[3]); +} + +/** + * @brief Overload: vector by vector subtraction. + */ +ASTCENC_SIMD_INLINE vfloat4 operator-(vfloat4 a, vfloat4 b) +{ + return vfloat4(a.m[0] - b.m[0], + a.m[1] - b.m[1], + a.m[2] - b.m[2], + a.m[3] - b.m[3]); +} + +/** + * @brief Overload: vector by vector multiplication. + */ +ASTCENC_SIMD_INLINE vfloat4 operator*(vfloat4 a, vfloat4 b) +{ + return vfloat4(a.m[0] * b.m[0], + a.m[1] * b.m[1], + a.m[2] * b.m[2], + a.m[3] * b.m[3]); +} + +/** + * @brief Overload: vector by vector division. + */ +ASTCENC_SIMD_INLINE vfloat4 operator/(vfloat4 a, vfloat4 b) +{ + return vfloat4(a.m[0] / b.m[0], + a.m[1] / b.m[1], + a.m[2] / b.m[2], + a.m[3] / b.m[3]); +} + +/** + * @brief Overload: vector by vector equality. + */ +ASTCENC_SIMD_INLINE vmask4 operator==(vfloat4 a, vfloat4 b) +{ + return vmask4(a.m[0] == b.m[0], + a.m[1] == b.m[1], + a.m[2] == b.m[2], + a.m[3] == b.m[3]); +} + +/** + * @brief Overload: vector by vector inequality. + */ +ASTCENC_SIMD_INLINE vmask4 operator!=(vfloat4 a, vfloat4 b) +{ + return vmask4(a.m[0] != b.m[0], + a.m[1] != b.m[1], + a.m[2] != b.m[2], + a.m[3] != b.m[3]); +} + +/** + * @brief Overload: vector by vector less than. + */ +ASTCENC_SIMD_INLINE vmask4 operator<(vfloat4 a, vfloat4 b) +{ + return vmask4(a.m[0] < b.m[0], + a.m[1] < b.m[1], + a.m[2] < b.m[2], + a.m[3] < b.m[3]); +} + +/** + * @brief Overload: vector by vector greater than. + */ +ASTCENC_SIMD_INLINE vmask4 operator>(vfloat4 a, vfloat4 b) +{ + return vmask4(a.m[0] > b.m[0], + a.m[1] > b.m[1], + a.m[2] > b.m[2], + a.m[3] > b.m[3]); +} + +/** + * @brief Overload: vector by vector less than or equal. + */ +ASTCENC_SIMD_INLINE vmask4 operator<=(vfloat4 a, vfloat4 b) +{ + return vmask4(a.m[0] <= b.m[0], + a.m[1] <= b.m[1], + a.m[2] <= b.m[2], + a.m[3] <= b.m[3]); +} + +/** + * @brief Overload: vector by vector greater than or equal. + */ +ASTCENC_SIMD_INLINE vmask4 operator>=(vfloat4 a, vfloat4 b) +{ + return vmask4(a.m[0] >= b.m[0], + a.m[1] >= b.m[1], + a.m[2] >= b.m[2], + a.m[3] >= b.m[3]); +} + +/** + * @brief Return the min vector of two vectors. + * + * If either lane value is NaN, @c b will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat4 min(vfloat4 a, vfloat4 b) +{ + return vfloat4(a.m[0] < b.m[0] ? a.m[0] : b.m[0], + a.m[1] < b.m[1] ? a.m[1] : b.m[1], + a.m[2] < b.m[2] ? a.m[2] : b.m[2], + a.m[3] < b.m[3] ? a.m[3] : b.m[3]); +} + +/** + * @brief Return the max vector of two vectors. + * + * If either lane value is NaN, @c b will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat4 max(vfloat4 a, vfloat4 b) +{ + return vfloat4(a.m[0] > b.m[0] ? a.m[0] : b.m[0], + a.m[1] > b.m[1] ? a.m[1] : b.m[1], + a.m[2] > b.m[2] ? a.m[2] : b.m[2], + a.m[3] > b.m[3] ? a.m[3] : b.m[3]); +} + +/** + * @brief Return the absolute value of the float vector. + */ +ASTCENC_SIMD_INLINE vfloat4 abs(vfloat4 a) +{ + return vfloat4(std::abs(a.m[0]), + std::abs(a.m[1]), + std::abs(a.m[2]), + std::abs(a.m[3])); +} + +/** + * @brief Return a float rounded to the nearest integer value. + */ +ASTCENC_SIMD_INLINE vfloat4 round(vfloat4 a) +{ + assert(std::fegetround() == FE_TONEAREST); + return vfloat4(std::nearbyint(a.m[0]), + std::nearbyint(a.m[1]), + std::nearbyint(a.m[2]), + std::nearbyint(a.m[3])); +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE vfloat4 hmin(vfloat4 a) +{ + float tmp1 = std::min(a.m[0], a.m[1]); + float tmp2 = std::min(a.m[2], a.m[3]); + return vfloat4(std::min(tmp1, tmp2)); +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE vfloat4 hmax(vfloat4 a) +{ + float tmp1 = std::max(a.m[0], a.m[1]); + float tmp2 = std::max(a.m[2], a.m[3]); + return vfloat4(std::max(tmp1, tmp2)); +} + +/** + * @brief Return the horizontal sum of a vector. + */ +ASTCENC_SIMD_INLINE float hadd_s(vfloat4 a) +{ + // Use halving add, gives invariance with SIMD versions + return (a.m[0] + a.m[2]) + (a.m[1] + a.m[3]); +} + +/** + * @brief Return the sqrt of the lanes in the vector. + */ +ASTCENC_SIMD_INLINE vfloat4 sqrt(vfloat4 a) +{ + return vfloat4(std::sqrt(a.m[0]), + std::sqrt(a.m[1]), + std::sqrt(a.m[2]), + std::sqrt(a.m[3])); +} + +/** + * @brief Return lanes from @c b if @c cond is set, else @c a. + */ +ASTCENC_SIMD_INLINE vfloat4 select(vfloat4 a, vfloat4 b, vmask4 cond) +{ + return vfloat4((cond.m[0] & static_cast(0x80000000)) ? b.m[0] : a.m[0], + (cond.m[1] & static_cast(0x80000000)) ? b.m[1] : a.m[1], + (cond.m[2] & static_cast(0x80000000)) ? b.m[2] : a.m[2], + (cond.m[3] & static_cast(0x80000000)) ? b.m[3] : a.m[3]); +} + +/** + * @brief Load a vector of gathered results from an array; + */ +ASTCENC_SIMD_INLINE vfloat4 gatherf(const float* base, vint4 indices) +{ + return vfloat4(base[indices.m[0]], + base[indices.m[1]], + base[indices.m[2]], + base[indices.m[3]]); +} + +/** + * @brief Load a vector of gathered results from an array using byte indices from memory + */ +template<> +ASTCENC_SIMD_INLINE vfloat4 gatherf_byte_inds(const float* base, const uint8_t* indices) +{ + return vfloat4(base[indices[0]], + base[indices[1]], + base[indices[2]], + base[indices[3]]); +} + +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vfloat4 a, float* ptr) +{ + ptr[0] = a.m[0]; + ptr[1] = a.m[1]; + ptr[2] = a.m[2]; + ptr[3] = a.m[3]; +} + +/** + * @brief Store a vector to an aligned memory address. + */ +ASTCENC_SIMD_INLINE void storea(vfloat4 a, float* ptr) +{ + ptr[0] = a.m[0]; + ptr[1] = a.m[1]; + ptr[2] = a.m[2]; + ptr[3] = a.m[3]; +} + +/** + * @brief Return a integer value for a float vector, using truncation. + */ +ASTCENC_SIMD_INLINE vint4 float_to_int(vfloat4 a) +{ + return vint4(static_cast(a.m[0]), + static_cast(a.m[1]), + static_cast(a.m[2]), + static_cast(a.m[3])); +} + +/**f + * @brief Return a integer value for a float vector, using round-to-nearest. + */ +ASTCENC_SIMD_INLINE vint4 float_to_int_rtn(vfloat4 a) +{ + a = a + vfloat4(0.5f); + return vint4(static_cast(a.m[0]), + static_cast(a.m[1]), + static_cast(a.m[2]), + static_cast(a.m[3])); +} + +/** + * @brief Return a float value for a integer vector. + */ +ASTCENC_SIMD_INLINE vfloat4 int_to_float(vint4 a) +{ + return vfloat4(static_cast(a.m[0]), + static_cast(a.m[1]), + static_cast(a.m[2]), + static_cast(a.m[3])); +} + +/** + * @brief Return a float16 value for a float vector, using round-to-nearest. + */ +ASTCENC_SIMD_INLINE vint4 float_to_float16(vfloat4 a) +{ + return vint4( + float_to_sf16(a.lane<0>()), + float_to_sf16(a.lane<1>()), + float_to_sf16(a.lane<2>()), + float_to_sf16(a.lane<3>())); +} + +/** + * @brief Return a float16 value for a float scalar, using round-to-nearest. + */ +static inline uint16_t float_to_float16(float a) +{ + return float_to_sf16(a); +} + +/** + * @brief Return a float value for a float16 vector. + */ +ASTCENC_SIMD_INLINE vfloat4 float16_to_float(vint4 a) +{ + return vfloat4( + sf16_to_float(static_cast(a.lane<0>())), + sf16_to_float(static_cast(a.lane<1>())), + sf16_to_float(static_cast(a.lane<2>())), + sf16_to_float(static_cast(a.lane<3>()))); +} + +/** + * @brief Return a float value for a float16 scalar. + */ +ASTCENC_SIMD_INLINE float float16_to_float(uint16_t a) +{ + return sf16_to_float(a); +} + +/** + * @brief Return a float value as an integer bit pattern (i.e. no conversion). + * + * It is a common trick to convert floats into integer bit patterns, perform + * some bit hackery based on knowledge they are IEEE 754 layout, and then + * convert them back again. This is the first half of that flip. + */ +ASTCENC_SIMD_INLINE vint4 float_as_int(vfloat4 a) +{ + vint4 r; + std::memcpy(r.m, a.m, 4 * 4); + return r; +} + +/** + * @brief Return a integer value as a float bit pattern (i.e. no conversion). + * + * It is a common trick to convert floats into integer bit patterns, perform + * some bit hackery based on knowledge they are IEEE 754 layout, and then + * convert them back again. This is the second half of that flip. + */ +ASTCENC_SIMD_INLINE vfloat4 int_as_float(vint4 a) +{ + vfloat4 r; + std::memcpy(r.m, a.m, 4 * 4); + return r; +} + +/* + * Table structure for a 16x 8-bit entry table. + */ +struct vtable4_16x8 { + const uint8_t* data; +}; + +/* + * Table structure for a 32x 8-bit entry table. + */ +struct vtable4_32x8 { + const uint8_t* data; +}; + +/* + * Table structure for a 64x 8-bit entry table. + */ +struct vtable4_64x8 { + const uint8_t* data; +}; + +/** + * @brief Prepare a vtable lookup table for 16x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable4_16x8& table, + const uint8_t* data +) { + table.data = data; +} + +/** + * @brief Prepare a vtable lookup table for 32x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable4_32x8& table, + const uint8_t* data +) { + table.data = data; +} + +/** + * @brief Prepare a vtable lookup table 64x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable4_64x8& table, + const uint8_t* data +) { + table.data = data; +} + +/** + * @brief Perform a vtable lookup in a 16x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint4 vtable_lookup_32bit( + const vtable4_16x8& table, + vint4 idx +) { + return vint4(table.data[idx.lane<0>()], + table.data[idx.lane<1>()], + table.data[idx.lane<2>()], + table.data[idx.lane<3>()]); +} + +/** + * @brief Perform a vtable lookup in a 32x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint4 vtable_lookup_32bit( + const vtable4_32x8& table, + vint4 idx +) { + return vint4(table.data[idx.lane<0>()], + table.data[idx.lane<1>()], + table.data[idx.lane<2>()], + table.data[idx.lane<3>()]); +} + +/** + * @brief Perform a vtable lookup in a 64x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint4 vtable_lookup_32bit( + const vtable4_64x8& table, + vint4 idx +) { + return vint4(table.data[idx.lane<0>()], + table.data[idx.lane<1>()], + table.data[idx.lane<2>()], + table.data[idx.lane<3>()]); +} + +/** + * @brief Return a vector of interleaved RGBA data. + * + * Input vectors have the value stored in the bottom 8 bits of each lane, + * with high bits set to zero. + * + * Output vector stores a single RGBA texel packed in each lane. + */ +ASTCENC_SIMD_INLINE vint4 interleave_rgba8(vint4 r, vint4 g, vint4 b, vint4 a) +{ +#if !defined(ASTCENC_BIG_ENDIAN) + return r + lsl<8>(g) + lsl<16>(b) + lsl<24>(a); +#else + return a + lsl<8>(b) + lsl<16>(g) + lsl<24>(r); +#endif +} + +/** + * @brief Store a single vector lane to an unaligned address. + */ +ASTCENC_SIMD_INLINE void store_lane(uint8_t* base, int data) +{ + std::memcpy(base, &data, sizeof(int)); +} + +/** + * @brief Store a vector, skipping masked lanes. + * + * All masked lanes must be at the end of vector, after all non-masked lanes. + * Input is a byte array of at least 4 bytes per unmasked entry. + */ +ASTCENC_SIMD_INLINE void store_lanes_masked(uint8_t* base, vint4 data, vmask4 mask) +{ + if (mask.m[3]) + { + store(data, base); + } + else if (mask.m[2]) + { + store_lane(base + 0, data.lane<0>()); + store_lane(base + 4, data.lane<1>()); + store_lane(base + 8, data.lane<2>()); + } + else if (mask.m[1]) + { + store_lane(base + 0, data.lane<0>()); + store_lane(base + 4, data.lane<1>()); + } + else if (mask.m[0]) + { + store_lane(base + 0, data.lane<0>()); + } +} + +#endif // #ifndef ASTC_VECMATHLIB_NONE_4_H_INCLUDED diff --git a/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h b/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h new file mode 100644 index 0000000..f6991e4 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sse_4.h @@ -0,0 +1,1340 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2019-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. +// ---------------------------------------------------------------------------- + +/** + * @brief 4x32-bit vectors, implemented using SSE. + * + * This module implements 4-wide 32-bit float, int, and mask vectors for x86 + * SSE. The implementation requires at least SSE2, but higher levels of SSE can + * be selected at compile time to improve performance. + * + * There is a baseline level of functionality provided by all vector widths and + * implementations. This is implemented using identical function signatures, + * modulo data type, so we can use them as substitutable implementations in VLA + * code. + * + * The 4-wide vectors are also used as a fixed-width type, and significantly + * extend the functionality above that available to VLA code. + */ + +#ifndef ASTC_VECMATHLIB_SSE_4_H_INCLUDED +#define ASTC_VECMATHLIB_SSE_4_H_INCLUDED + +#ifndef ASTCENC_SIMD_INLINE + #error "Include astcenc_vecmathlib.h, do not include directly" +#endif + +#include +#include + +// ============================================================================ +// vfloat4 data type +// ============================================================================ + +/** + * @brief Data type for 4-wide floats. + */ +struct vfloat4 +{ + /** + * @brief Construct from zero-initialized value. + */ + ASTCENC_SIMD_INLINE vfloat4() = default; + + /** + * @brief Construct from 4 values loaded from an unaligned address. + * + * Consider using loada() which is better with vectors if data is aligned + * to vector length. + */ + ASTCENC_SIMD_INLINE explicit vfloat4(const float *p) + { + m = _mm_loadu_ps(p); + } + + /** + * @brief Construct from 1 scalar value replicated across all lanes. + * + * Consider using zero() for constexpr zeros. + */ + ASTCENC_SIMD_INLINE explicit vfloat4(float a) + { + m = _mm_set1_ps(a); + } + + /** + * @brief Construct from 4 scalar values. + * + * The value of @c a is stored to lane 0 (LSB) in the SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vfloat4(float a, float b, float c, float d) + { + m = _mm_set_ps(d, c, b, a); + } + + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vfloat4(__m128 a) + { + m = a; + } + + /** + * @brief Get the scalar value of a single lane. + */ + template ASTCENC_SIMD_INLINE float lane() const + { + return _mm_cvtss_f32(_mm_shuffle_ps(m, m, l)); + } + + /** + * @brief Set the scalar value of a single lane. + */ + template ASTCENC_SIMD_INLINE void set_lane(float a) + { +#if ASTCENC_SSE >= 41 + __m128 v = _mm_set1_ps(a); + m = _mm_insert_ps(m, v, l << 6 | l << 4); +#else + alignas(16) float idx[4]; + _mm_store_ps(idx, m); + idx[l] = a; + m = _mm_load_ps(idx); +#endif + } + + /** + * @brief Factory that returns a vector of zeros. + */ + static ASTCENC_SIMD_INLINE vfloat4 zero() + { + return vfloat4(_mm_setzero_ps()); + } + + /** + * @brief Factory that returns a replicated scalar loaded from memory. + */ + static ASTCENC_SIMD_INLINE vfloat4 load1(const float* p) + { + return vfloat4(_mm_load_ps1(p)); + } + + /** + * @brief Factory that returns a vector loaded from 16B aligned memory. + */ + static ASTCENC_SIMD_INLINE vfloat4 loada(const float* p) + { + return vfloat4(_mm_load_ps(p)); + } + + /** + * @brief Return a swizzled float 2. + */ + template ASTCENC_SIMD_INLINE vfloat4 swz() const + { + vfloat4 result(_mm_shuffle_ps(m, m, l0 | l1 << 2)); + result.set_lane<2>(0.0f); + result.set_lane<3>(0.0f); + return result; + } + + /** + * @brief Return a swizzled float 3. + */ + template ASTCENC_SIMD_INLINE vfloat4 swz() const + { + vfloat4 result(_mm_shuffle_ps(m, m, l0 | l1 << 2 | l2 << 4)); + result.set_lane<3>(0.0f); + return result; + } + + /** + * @brief Return a swizzled float 4. + */ + template ASTCENC_SIMD_INLINE vfloat4 swz() const + { + return vfloat4(_mm_shuffle_ps(m, m, l0 | l1 << 2 | l2 << 4 | l3 << 6)); + } + + /** + * @brief The vector ... + */ + __m128 m; +}; + +// ============================================================================ +// vint4 data type +// ============================================================================ + +/** + * @brief Data type for 4-wide ints. + */ +struct vint4 +{ + /** + * @brief Construct from zero-initialized value. + */ + ASTCENC_SIMD_INLINE vint4() = default; + + /** + * @brief Construct from 4 values loaded from an unaligned address. + * + * Consider using loada() which is better with vectors if data is aligned + * to vector length. + */ + ASTCENC_SIMD_INLINE explicit vint4(const int *p) + { + m = _mm_loadu_si128(reinterpret_cast(p)); + } + + /** + * @brief Construct from 4 uint8_t loaded from an unaligned address. + */ + ASTCENC_SIMD_INLINE explicit vint4(const uint8_t *p) + { + // _mm_loadu_si32 would be nicer syntax, but missing on older GCC + __m128i t = _mm_cvtsi32_si128(*reinterpret_cast(p)); + +#if ASTCENC_SSE >= 41 + m = _mm_cvtepu8_epi32(t); +#else + t = _mm_unpacklo_epi8(t, _mm_setzero_si128()); + m = _mm_unpacklo_epi16(t, _mm_setzero_si128()); +#endif + } + + /** + * @brief Construct from 1 scalar value replicated across all lanes. + * + * Consider using zero() for constexpr zeros. + */ + ASTCENC_SIMD_INLINE explicit vint4(int a) + { + m = _mm_set1_epi32(a); + } + + /** + * @brief Construct from 4 scalar values. + * + * The value of @c a is stored to lane 0 (LSB) in the SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vint4(int a, int b, int c, int d) + { + m = _mm_set_epi32(d, c, b, a); + } + + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vint4(__m128i a) + { + m = a; + } + + /** + * @brief Get the scalar from a single lane. + */ + template ASTCENC_SIMD_INLINE int lane() const + { + return _mm_cvtsi128_si32(_mm_shuffle_epi32(m, l)); + } + + /** + * @brief Set the scalar value of a single lane. + */ + template ASTCENC_SIMD_INLINE void set_lane(int a) + { +#if ASTCENC_SSE >= 41 + m = _mm_insert_epi32(m, a, l); +#else + alignas(16) int idx[4]; + _mm_store_si128(reinterpret_cast<__m128i*>(idx), m); + idx[l] = a; + m = _mm_load_si128(reinterpret_cast(idx)); +#endif + } + + /** + * @brief Factory that returns a vector of zeros. + */ + static ASTCENC_SIMD_INLINE vint4 zero() + { + return vint4(_mm_setzero_si128()); + } + + /** + * @brief Factory that returns a replicated scalar loaded from memory. + */ + static ASTCENC_SIMD_INLINE vint4 load1(const int* p) + { + return vint4(*p); + } + + /** + * @brief Factory that returns a vector loaded from unaligned memory. + */ + static ASTCENC_SIMD_INLINE vint4 load(const uint8_t* p) + { +#if ASTCENC_SSE >= 41 + return vint4(_mm_lddqu_si128(reinterpret_cast(p))); +#else + return vint4(_mm_loadu_si128(reinterpret_cast(p))); +#endif + } + + /** + * @brief Factory that returns a vector loaded from 16B aligned memory. + */ + static ASTCENC_SIMD_INLINE vint4 loada(const int* p) + { + return vint4(_mm_load_si128(reinterpret_cast(p))); + } + + /** + * @brief Factory that returns a vector containing the lane IDs. + */ + static ASTCENC_SIMD_INLINE vint4 lane_id() + { + return vint4(_mm_set_epi32(3, 2, 1, 0)); + } + + /** + * @brief The vector ... + */ + __m128i m; +}; + +// ============================================================================ +// vmask4 data type +// ============================================================================ + +/** + * @brief Data type for 4-wide control plane masks. + */ +struct vmask4 +{ + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vmask4(__m128 a) + { + m = a; + } + + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vmask4(__m128i a) + { + m = _mm_castsi128_ps(a); + } + + /** + * @brief Construct from 1 scalar value. + */ + ASTCENC_SIMD_INLINE explicit vmask4(bool a) + { + vint4 mask(a == false ? 0 : -1); + m = _mm_castsi128_ps(mask.m); + } + + /** + * @brief Construct from 4 scalar values. + * + * The value of @c a is stored to lane 0 (LSB) in the SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vmask4(bool a, bool b, bool c, bool d) + { + vint4 mask(a == false ? 0 : -1, + b == false ? 0 : -1, + c == false ? 0 : -1, + d == false ? 0 : -1); + + m = _mm_castsi128_ps(mask.m); + } + + /** + * @brief Get the scalar value of a single lane. + */ + template ASTCENC_SIMD_INLINE bool lane() const + { + return _mm_cvtss_f32(_mm_shuffle_ps(m, m, l)) != 0.0f; + } + + /** + * @brief The vector ... + */ + __m128 m; +}; + +// ============================================================================ +// vmask4 operators and functions +// ============================================================================ + +/** + * @brief Overload: mask union (or). + */ +ASTCENC_SIMD_INLINE vmask4 operator|(vmask4 a, vmask4 b) +{ + return vmask4(_mm_or_ps(a.m, b.m)); +} + +/** + * @brief Overload: mask intersect (and). + */ +ASTCENC_SIMD_INLINE vmask4 operator&(vmask4 a, vmask4 b) +{ + return vmask4(_mm_and_ps(a.m, b.m)); +} + +/** + * @brief Overload: mask difference (xor). + */ +ASTCENC_SIMD_INLINE vmask4 operator^(vmask4 a, vmask4 b) +{ + return vmask4(_mm_xor_ps(a.m, b.m)); +} + +/** + * @brief Overload: mask invert (not). + */ +ASTCENC_SIMD_INLINE vmask4 operator~(vmask4 a) +{ + return vmask4(_mm_xor_si128(_mm_castps_si128(a.m), _mm_set1_epi32(-1))); +} + +/** + * @brief Return a 4-bit mask code indicating mask status. + * + * bit0 = lane 0 + */ +ASTCENC_SIMD_INLINE unsigned int mask(vmask4 a) +{ + return static_cast(_mm_movemask_ps(a.m)); +} + +/** + * @brief True if any lanes are enabled, false otherwise. + */ +ASTCENC_SIMD_INLINE bool any(vmask4 a) +{ + return mask(a) != 0; +} + +/** + * @brief True if all lanes are enabled, false otherwise. + */ +ASTCENC_SIMD_INLINE bool all(vmask4 a) +{ + return mask(a) == 0xF; +} + +// ============================================================================ +// vint4 operators and functions +// ============================================================================ + +/** + * @brief Overload: vector by vector addition. + */ +ASTCENC_SIMD_INLINE vint4 operator+(vint4 a, vint4 b) +{ + return vint4(_mm_add_epi32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector subtraction. + */ +ASTCENC_SIMD_INLINE vint4 operator-(vint4 a, vint4 b) +{ + return vint4(_mm_sub_epi32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector multiplication. + */ +ASTCENC_SIMD_INLINE vint4 operator*(vint4 a, vint4 b) +{ +#if ASTCENC_SSE >= 41 + return vint4(_mm_mullo_epi32 (a.m, b.m)); +#else + __m128i t1 = _mm_mul_epu32(a.m, b.m); + __m128i t2 = _mm_mul_epu32( + _mm_srli_si128(a.m, 4), + _mm_srli_si128(b.m, 4)); + __m128i r = _mm_unpacklo_epi32( + _mm_shuffle_epi32(t1, _MM_SHUFFLE (0, 0, 2, 0)), + _mm_shuffle_epi32(t2, _MM_SHUFFLE (0, 0, 2, 0))); + return vint4(r); +#endif +} + +/** + * @brief Overload: vector bit invert. + */ +ASTCENC_SIMD_INLINE vint4 operator~(vint4 a) +{ + return vint4(_mm_xor_si128(a.m, _mm_set1_epi32(-1))); +} + +/** + * @brief Overload: vector by vector bitwise or. + */ +ASTCENC_SIMD_INLINE vint4 operator|(vint4 a, vint4 b) +{ + return vint4(_mm_or_si128(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector bitwise and. + */ +ASTCENC_SIMD_INLINE vint4 operator&(vint4 a, vint4 b) +{ + return vint4(_mm_and_si128(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector bitwise xor. + */ +ASTCENC_SIMD_INLINE vint4 operator^(vint4 a, vint4 b) +{ + return vint4(_mm_xor_si128(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector equality. + */ +ASTCENC_SIMD_INLINE vmask4 operator==(vint4 a, vint4 b) +{ + return vmask4(_mm_cmpeq_epi32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector inequality. + */ +ASTCENC_SIMD_INLINE vmask4 operator!=(vint4 a, vint4 b) +{ + return ~vmask4(_mm_cmpeq_epi32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector less than. + */ +ASTCENC_SIMD_INLINE vmask4 operator<(vint4 a, vint4 b) +{ + return vmask4(_mm_cmplt_epi32(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector greater than. + */ +ASTCENC_SIMD_INLINE vmask4 operator>(vint4 a, vint4 b) +{ + return vmask4(_mm_cmpgt_epi32(a.m, b.m)); +} + +/** + * @brief Logical shift left. + */ +template ASTCENC_SIMD_INLINE vint4 lsl(vint4 a) +{ + return vint4(_mm_slli_epi32(a.m, s)); +} + +/** + * @brief Logical shift right. + */ +template ASTCENC_SIMD_INLINE vint4 lsr(vint4 a) +{ + return vint4(_mm_srli_epi32(a.m, s)); +} + +/** + * @brief Arithmetic shift right. + */ +template ASTCENC_SIMD_INLINE vint4 asr(vint4 a) +{ + return vint4(_mm_srai_epi32(a.m, s)); +} + +/** + * @brief Return the min vector of two vectors. + */ +ASTCENC_SIMD_INLINE vint4 min(vint4 a, vint4 b) +{ +#if ASTCENC_SSE >= 41 + return vint4(_mm_min_epi32(a.m, b.m)); +#else + vmask4 d = a < b; + __m128i ap = _mm_and_si128(_mm_castps_si128(d.m), a.m); + __m128i bp = _mm_andnot_si128(_mm_castps_si128(d.m), b.m); + return vint4(_mm_or_si128(ap,bp)); +#endif +} + +/** + * @brief Return the max vector of two vectors. + */ +ASTCENC_SIMD_INLINE vint4 max(vint4 a, vint4 b) +{ +#if ASTCENC_SSE >= 41 + return vint4(_mm_max_epi32(a.m, b.m)); +#else + vmask4 d = a > b; + __m128i ap = _mm_and_si128(_mm_castps_si128(d.m), a.m); + __m128i bp = _mm_andnot_si128(_mm_castps_si128(d.m), b.m); + return vint4(_mm_or_si128(ap,bp)); +#endif +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE vint4 hmin(vint4 a) +{ + a = min(a, vint4(_mm_shuffle_epi32(a.m, _MM_SHUFFLE(2, 3, 0, 1)))); + a = min(a, vint4(_mm_shuffle_epi32(a.m, _MM_SHUFFLE(1, 0, 3, 2)))); + return a; +} + +/* + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE vint4 hmax(vint4 a) +{ + a = max(a, vint4(_mm_shuffle_epi32(a.m, _MM_SHUFFLE(2, 3, 0, 1)))); + a = max(a, vint4(_mm_shuffle_epi32(a.m, _MM_SHUFFLE(1, 0, 3, 2)))); + return a; +} + +/** + * @brief Store a vector to a 16B aligned memory address. + */ +ASTCENC_SIMD_INLINE void storea(vint4 a, int* p) +{ + _mm_store_si128(reinterpret_cast<__m128i*>(p), a.m); +} + +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vint4 a, int* p) +{ + // Cast due to missing intrinsics + _mm_storeu_ps(reinterpret_cast(p), _mm_castsi128_ps(a.m)); +} + +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vint4 a, uint8_t* p) +{ + std::memcpy(p, &a.m, sizeof(int) * 4); +} + +/** + * @brief Store lowest N (vector width) bytes into an unaligned address. + */ +ASTCENC_SIMD_INLINE void store_nbytes(vint4 a, uint8_t* p) +{ + // Cast due to missing intrinsics + _mm_store_ss(reinterpret_cast(p), _mm_castsi128_ps(a.m)); +} + +/** + * @brief Pack low 8 bits of N (vector width) lanes into bottom of vector. + */ +ASTCENC_SIMD_INLINE void pack_and_store_low_bytes(vint4 a, uint8_t* p) +{ +#if ASTCENC_SSE >= 41 + __m128i shuf = _mm_set_epi8(0,0,0,0, 0,0,0,0, 0,0,0,0, 12,8,4,0); + a = vint4(_mm_shuffle_epi8(a.m, shuf)); + store_nbytes(a, p); +#else + __m128i va = _mm_unpacklo_epi8(a.m, _mm_shuffle_epi32(a.m, _MM_SHUFFLE(1,1,1,1))); + __m128i vb = _mm_unpackhi_epi8(a.m, _mm_shuffle_epi32(a.m, _MM_SHUFFLE(3,3,3,3))); + a = vint4(_mm_unpacklo_epi16(va, vb)); + store_nbytes(a, p); +#endif +} + +/** + * @brief Return lanes from @c b if @c cond is set, else @c a. + */ +ASTCENC_SIMD_INLINE vint4 select(vint4 a, vint4 b, vmask4 cond) +{ + __m128i condi = _mm_castps_si128(cond.m); + +#if ASTCENC_SSE >= 41 + return vint4(_mm_blendv_epi8(a.m, b.m, condi)); +#else + return vint4(_mm_or_si128(_mm_and_si128(condi, b.m), _mm_andnot_si128(condi, a.m))); +#endif +} + +// ============================================================================ +// vfloat4 operators and functions +// ============================================================================ + +/** + * @brief Overload: vector by vector addition. + */ +ASTCENC_SIMD_INLINE vfloat4 operator+(vfloat4 a, vfloat4 b) +{ + return vfloat4(_mm_add_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector subtraction. + */ +ASTCENC_SIMD_INLINE vfloat4 operator-(vfloat4 a, vfloat4 b) +{ + return vfloat4(_mm_sub_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector multiplication. + */ +ASTCENC_SIMD_INLINE vfloat4 operator*(vfloat4 a, vfloat4 b) +{ + return vfloat4(_mm_mul_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector division. + */ +ASTCENC_SIMD_INLINE vfloat4 operator/(vfloat4 a, vfloat4 b) +{ + return vfloat4(_mm_div_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector equality. + */ +ASTCENC_SIMD_INLINE vmask4 operator==(vfloat4 a, vfloat4 b) +{ + return vmask4(_mm_cmpeq_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector inequality. + */ +ASTCENC_SIMD_INLINE vmask4 operator!=(vfloat4 a, vfloat4 b) +{ + return vmask4(_mm_cmpneq_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector less than. + */ +ASTCENC_SIMD_INLINE vmask4 operator<(vfloat4 a, vfloat4 b) +{ + return vmask4(_mm_cmplt_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector greater than. + */ +ASTCENC_SIMD_INLINE vmask4 operator>(vfloat4 a, vfloat4 b) +{ + return vmask4(_mm_cmpgt_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector less than or equal. + */ +ASTCENC_SIMD_INLINE vmask4 operator<=(vfloat4 a, vfloat4 b) +{ + return vmask4(_mm_cmple_ps(a.m, b.m)); +} + +/** + * @brief Overload: vector by vector greater than or equal. + */ +ASTCENC_SIMD_INLINE vmask4 operator>=(vfloat4 a, vfloat4 b) +{ + return vmask4(_mm_cmpge_ps(a.m, b.m)); +} + +/** + * @brief Return the min vector of two vectors. + * + * If either lane value is NaN, @c b will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat4 min(vfloat4 a, vfloat4 b) +{ + // Do not reorder - second operand will return if either is NaN + return vfloat4(_mm_min_ps(a.m, b.m)); +} + +/** + * @brief Return the max vector of two vectors. + * + * If either lane value is NaN, @c b will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat4 max(vfloat4 a, vfloat4 b) +{ + // Do not reorder - second operand will return if either is NaN + return vfloat4(_mm_max_ps(a.m, b.m)); +} + +/** + * @brief Return the absolute value of the float vector. + */ +ASTCENC_SIMD_INLINE vfloat4 abs(vfloat4 a) +{ + return vfloat4(_mm_max_ps(_mm_sub_ps(_mm_setzero_ps(), a.m), a.m)); +} + +/** + * @brief Return a float rounded to the nearest integer value. + */ +ASTCENC_SIMD_INLINE vfloat4 round(vfloat4 a) +{ +#if ASTCENC_SSE >= 41 + constexpr int flags = _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC; + return vfloat4(_mm_round_ps(a.m, flags)); +#else + __m128 v = a.m; + __m128 neg_zero = _mm_castsi128_ps(_mm_set1_epi32(static_cast(0x80000000))); + __m128 no_fraction = _mm_set1_ps(8388608.0f); + __m128 abs_mask = _mm_castsi128_ps(_mm_set1_epi32(0x7FFFFFFF)); + __m128 sign = _mm_and_ps(v, neg_zero); + __m128 s_magic = _mm_or_ps(no_fraction, sign); + __m128 r1 = _mm_add_ps(v, s_magic); + r1 = _mm_sub_ps(r1, s_magic); + __m128 r2 = _mm_and_ps(v, abs_mask); + __m128 mask = _mm_cmple_ps(r2, no_fraction); + r2 = _mm_andnot_ps(mask, v); + r1 = _mm_and_ps(r1, mask); + return vfloat4(_mm_xor_ps(r1, r2)); +#endif +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE vfloat4 hmin(vfloat4 a) +{ + a = min(a, vfloat4(_mm_shuffle_ps(a.m, a.m, _MM_SHUFFLE(0, 0, 3, 2)))); + a = min(a, vfloat4(_mm_shuffle_ps(a.m, a.m, _MM_SHUFFLE(0, 0, 0, 1)))); + return vfloat4(_mm_shuffle_ps(a.m, a.m, _MM_SHUFFLE(0, 0, 0, 0))); +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE vfloat4 hmax(vfloat4 a) +{ + a = max(a, vfloat4(_mm_shuffle_ps(a.m, a.m, _MM_SHUFFLE(0, 0, 3, 2)))); + a = max(a, vfloat4(_mm_shuffle_ps(a.m, a.m, _MM_SHUFFLE(0, 0, 0, 1)))); + return vfloat4(_mm_shuffle_ps(a.m, a.m, _MM_SHUFFLE(0, 0, 0, 0))); +} + +/** + * @brief Return the horizontal sum of a vector as a scalar. + */ +ASTCENC_SIMD_INLINE float hadd_s(vfloat4 a) +{ + // Add top and bottom halves, lane 1/0 + __m128 t = _mm_add_ps(a.m, _mm_movehl_ps(a.m, a.m)); + + // Add top and bottom halves, lane 0 (_mm_hadd_ps exists but slow) + t = _mm_add_ss(t, _mm_shuffle_ps(t, t, 0x55)); + + return _mm_cvtss_f32(t); +} + +/** + * @brief Return the sqrt of the lanes in the vector. + */ +ASTCENC_SIMD_INLINE vfloat4 sqrt(vfloat4 a) +{ + return vfloat4(_mm_sqrt_ps(a.m)); +} + +/** + * @brief Return lanes from @c b if @c cond is set, else @c a. + */ +ASTCENC_SIMD_INLINE vfloat4 select(vfloat4 a, vfloat4 b, vmask4 cond) +{ +#if ASTCENC_SSE >= 41 + return vfloat4(_mm_blendv_ps(a.m, b.m, cond.m)); +#else + return vfloat4(_mm_or_ps(_mm_and_ps(cond.m, b.m), _mm_andnot_ps(cond.m, a.m))); +#endif +} + +/** + * @brief Load a vector of gathered results from an array; + */ +ASTCENC_SIMD_INLINE vfloat4 gatherf(const float* base, vint4 indices) +{ +#if ASTCENC_AVX >= 2 && ASTCENC_X86_GATHERS != 0 + return vfloat4(_mm_i32gather_ps(base, indices.m, 4)); +#else + alignas(16) int idx[4]; + storea(indices, idx); + return vfloat4(base[idx[0]], base[idx[1]], base[idx[2]], base[idx[3]]); +#endif +} + +/** + * @brief Load a vector of gathered results from an array using byte indices from memory + */ +template<> +ASTCENC_SIMD_INLINE vfloat4 gatherf_byte_inds(const float* base, const uint8_t* indices) +{ + // Experimentally, in this particular use case (byte indices in memory), + // using 4 separate scalar loads is appreciably faster than using gathers + // even if they're available, on every x86 uArch tried, so always do the + // separate loads even when ASTCENC_X86_GATHERS is enabled. + // + // Tested on: + // - Intel Skylake-X, Coffee Lake, Crestmont, Redwood Cove + // - AMD Zen 2, Zen 4 + return vfloat4(base[indices[0]], base[indices[1]], base[indices[2]], base[indices[3]]); +} + +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vfloat4 a, float* p) +{ + _mm_storeu_ps(p, a.m); +} + +/** + * @brief Store a vector to a 16B aligned memory address. + */ +ASTCENC_SIMD_INLINE void storea(vfloat4 a, float* p) +{ + _mm_store_ps(p, a.m); +} + +/** + * @brief Return a integer value for a float vector, using truncation. + */ +ASTCENC_SIMD_INLINE vint4 float_to_int(vfloat4 a) +{ + return vint4(_mm_cvttps_epi32(a.m)); +} + +/** + * @brief Return a integer value for a float vector, using round-to-nearest. + */ +ASTCENC_SIMD_INLINE vint4 float_to_int_rtn(vfloat4 a) +{ + a = a + vfloat4(0.5f); + return vint4(_mm_cvttps_epi32(a.m)); +} + +/** + * @brief Return a float value for an integer vector. + */ +ASTCENC_SIMD_INLINE vfloat4 int_to_float(vint4 a) +{ + return vfloat4(_mm_cvtepi32_ps(a.m)); +} + +/** + * @brief Return a float16 value for a float vector, using round-to-nearest. + */ +ASTCENC_SIMD_INLINE vint4 float_to_float16(vfloat4 a) +{ +#if ASTCENC_F16C >= 1 + __m128i packedf16 = _mm_cvtps_ph(a.m, 0); + __m128i f16 = _mm_cvtepu16_epi32(packedf16); + return vint4(f16); +#else + return vint4( + float_to_sf16(a.lane<0>()), + float_to_sf16(a.lane<1>()), + float_to_sf16(a.lane<2>()), + float_to_sf16(a.lane<3>())); +#endif +} + +/** + * @brief Return a float16 value for a float scalar, using round-to-nearest. + */ +static inline uint16_t float_to_float16(float a) +{ +#if ASTCENC_F16C >= 1 + __m128i f16 = _mm_cvtps_ph(_mm_set1_ps(a), 0); + return static_cast(_mm_cvtsi128_si32(f16)); +#else + return float_to_sf16(a); +#endif +} + +/** + * @brief Return a float value for a float16 vector. + */ +ASTCENC_SIMD_INLINE vfloat4 float16_to_float(vint4 a) +{ +#if ASTCENC_F16C >= 1 + __m128i packed = _mm_packs_epi32(a.m, a.m); + __m128 f32 = _mm_cvtph_ps(packed); + return vfloat4(f32); +#else + return vfloat4( + sf16_to_float(static_cast(a.lane<0>())), + sf16_to_float(static_cast(a.lane<1>())), + sf16_to_float(static_cast(a.lane<2>())), + sf16_to_float(static_cast(a.lane<3>()))); +#endif +} + +/** + * @brief Return a float value for a float16 scalar. + */ +ASTCENC_SIMD_INLINE float float16_to_float(uint16_t a) +{ +#if ASTCENC_F16C >= 1 + __m128i packed = _mm_set1_epi16(static_cast(a)); + __m128 f32 = _mm_cvtph_ps(packed); + return _mm_cvtss_f32(f32); +#else + return sf16_to_float(a); +#endif +} + +/** + * @brief Return a float value as an integer bit pattern (i.e. no conversion). + * + * It is a common trick to convert floats into integer bit patterns, perform + * some bit hackery based on knowledge they are IEEE 754 layout, and then + * convert them back again. This is the first half of that flip. + */ +ASTCENC_SIMD_INLINE vint4 float_as_int(vfloat4 a) +{ + return vint4(_mm_castps_si128(a.m)); +} + +/** + * @brief Return a integer value as a float bit pattern (i.e. no conversion). + * + * It is a common trick to convert floats into integer bit patterns, perform + * some bit hackery based on knowledge they are IEEE 754 layout, and then + * convert them back again. This is the second half of that flip. + */ +ASTCENC_SIMD_INLINE vfloat4 int_as_float(vint4 v) +{ + return vfloat4(_mm_castsi128_ps(v.m)); +} + +/* + * Table structure for a 16x 8-bit entry table. + */ +struct vtable4_16x8 { +#if ASTCENC_SSE >= 41 + vint4 t0; +#else + const uint8_t* data; +#endif +}; + +/* + * Table structure for a 32x 8-bit entry table. + */ +struct vtable4_32x8 { +#if ASTCENC_SSE >= 41 + vint4 t0; + vint4 t1; +#else + const uint8_t* data; +#endif +}; + +/* + * Table structure for a 64x 8-bit entry table. + */ +struct vtable4_64x8 { +#if ASTCENC_SSE >= 41 + vint4 t0; + vint4 t1; + vint4 t2; + vint4 t3; +#else + const uint8_t* data; +#endif +}; + +/** + * @brief Prepare a vtable lookup table for 16x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable4_16x8& table, + const uint8_t* data +) { +#if ASTCENC_SSE >= 41 + table.t0 = vint4::load(data); +#else + table.data = data; +#endif +} + +/** + * @brief Prepare a vtable lookup table for 32x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable4_32x8& table, + const uint8_t* data +) { +#if ASTCENC_SSE >= 41 + table.t0 = vint4::load(data); + table.t1 = vint4::load(data + 16); + + table.t1 = table.t1 ^ table.t0; +#else + table.data = data; +#endif +} + +/** + * @brief Prepare a vtable lookup table 64x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable4_64x8& table, + const uint8_t* data +) { +#if ASTCENC_SSE >= 41 + table.t0 = vint4::load(data); + table.t1 = vint4::load(data + 16); + table.t2 = vint4::load(data + 32); + table.t3 = vint4::load(data + 48); + + table.t3 = table.t3 ^ table.t2; + table.t2 = table.t2 ^ table.t1; + table.t1 = table.t1 ^ table.t0; +#else + table.data = data; +#endif +} + +/** + * @brief Perform a vtable lookup in a 16x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint4 vtable_lookup_32bit( + const vtable4_16x8& tbl, + vint4 idx +) { +#if ASTCENC_SSE >= 41 + // Set index byte MSB to 1 for unused bytes so shuffle returns zero + __m128i idxx = _mm_or_si128(idx.m, _mm_set1_epi32(static_cast(0xFFFFFF00))); + + __m128i result = _mm_shuffle_epi8(tbl.t0.m, idxx); + return vint4(result); +#else + return vint4(tbl.data[idx.lane<0>()], + tbl.data[idx.lane<1>()], + tbl.data[idx.lane<2>()], + tbl.data[idx.lane<3>()]); +#endif +} + +/** + * @brief Perform a vtable lookup in a 32x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint4 vtable_lookup_32bit( + const vtable4_32x8& tbl, + vint4 idx +) { +#if ASTCENC_SSE >= 41 + // Set index byte MSB to 1 for unused bytes so shuffle returns zero + __m128i idxx = _mm_or_si128(idx.m, _mm_set1_epi32(static_cast(0xFFFFFF00))); + + __m128i result = _mm_shuffle_epi8(tbl.t0.m, idxx); + idxx = _mm_sub_epi8(idxx, _mm_set1_epi8(16)); + + __m128i result2 = _mm_shuffle_epi8(tbl.t1.m, idxx); + result = _mm_xor_si128(result, result2); + + return vint4(result); +#else + return vint4(tbl.data[idx.lane<0>()], + tbl.data[idx.lane<1>()], + tbl.data[idx.lane<2>()], + tbl.data[idx.lane<3>()]); +#endif +} + +/** + * @brief Perform a vtable lookup in a 64x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint4 vtable_lookup_32bit( + const vtable4_64x8& tbl, + vint4 idx +) { +#if ASTCENC_SSE >= 41 + // Set index byte MSB to 1 for unused bytes so shuffle returns zero + __m128i idxx = _mm_or_si128(idx.m, _mm_set1_epi32(static_cast(0xFFFFFF00))); + + __m128i result = _mm_shuffle_epi8(tbl.t0.m, idxx); + idxx = _mm_sub_epi8(idxx, _mm_set1_epi8(16)); + + __m128i result2 = _mm_shuffle_epi8(tbl.t1.m, idxx); + result = _mm_xor_si128(result, result2); + idxx = _mm_sub_epi8(idxx, _mm_set1_epi8(16)); + + result2 = _mm_shuffle_epi8(tbl.t2.m, idxx); + result = _mm_xor_si128(result, result2); + idxx = _mm_sub_epi8(idxx, _mm_set1_epi8(16)); + + result2 = _mm_shuffle_epi8(tbl.t3.m, idxx); + result = _mm_xor_si128(result, result2); + + return vint4(result); +#else + return vint4(tbl.data[idx.lane<0>()], + tbl.data[idx.lane<1>()], + tbl.data[idx.lane<2>()], + tbl.data[idx.lane<3>()]); +#endif +} + +/** + * @brief Return a vector of interleaved RGBA data. + * + * Input vectors have the value stored in the bottom 8 bits of each lane, + * with high bits set to zero. + * + * Output vector stores a single RGBA texel packed in each lane. + */ +ASTCENC_SIMD_INLINE vint4 interleave_rgba8(vint4 r, vint4 g, vint4 b, vint4 a) +{ +// Workaround an XCode compiler internal fault; note is slower than slli_epi32 +// so we should revert this when we get the opportunity +#if defined(__APPLE__) + __m128i value = r.m; + value = _mm_add_epi32(value, _mm_bslli_si128(g.m, 1)); + value = _mm_add_epi32(value, _mm_bslli_si128(b.m, 2)); + value = _mm_add_epi32(value, _mm_bslli_si128(a.m, 3)); + return vint4(value); +#else + __m128i value = r.m; + value = _mm_add_epi32(value, _mm_slli_epi32(g.m, 8)); + value = _mm_add_epi32(value, _mm_slli_epi32(b.m, 16)); + value = _mm_add_epi32(value, _mm_slli_epi32(a.m, 24)); + return vint4(value); +#endif +} + +/** + * @brief Store a single vector lane to an unaligned address. + */ +ASTCENC_SIMD_INLINE void store_lane(uint8_t* base, int data) +{ + std::memcpy(base, &data, sizeof(int)); +} + +/** + * @brief Store a vector, skipping masked lanes. + * + * All masked lanes must be at the end of vector, after all non-masked lanes. + */ +ASTCENC_SIMD_INLINE void store_lanes_masked(uint8_t* base, vint4 data, vmask4 mask) +{ +#if ASTCENC_AVX >= 2 + _mm_maskstore_epi32(reinterpret_cast(base), _mm_castps_si128(mask.m), data.m); +#else + // Note - we cannot use _mm_maskmoveu_si128 as the underlying hardware doesn't guarantee + // fault suppression on masked lanes so we can get page faults at the end of an image. + if (mask.lane<3>() != 0.0f) + { + store(data, base); + } + else if (mask.lane<2>() != 0.0f) + { + store_lane(base + 0, data.lane<0>()); + store_lane(base + 4, data.lane<1>()); + store_lane(base + 8, data.lane<2>()); + } + else if (mask.lane<1>() != 0.0f) + { + store_lane(base + 0, data.lane<0>()); + store_lane(base + 4, data.lane<1>()); + } + else if (mask.lane<0>() != 0.0f) + { + store_lane(base + 0, data.lane<0>()); + } +#endif +} + +#if defined(ASTCENC_NO_INVARIANCE) && (ASTCENC_SSE >= 41) + +#define ASTCENC_USE_NATIVE_DOT_PRODUCT 1 + +/** + * @brief Return the dot product for the full 4 lanes, returning scalar. + */ +ASTCENC_SIMD_INLINE float dot_s(vfloat4 a, vfloat4 b) +{ + return _mm_cvtss_f32(_mm_dp_ps(a.m, b.m, 0xFF)); +} + +/** + * @brief Return the dot product for the full 4 lanes, returning vector. + */ +ASTCENC_SIMD_INLINE vfloat4 dot(vfloat4 a, vfloat4 b) +{ + return vfloat4(_mm_dp_ps(a.m, b.m, 0xFF)); +} + +/** + * @brief Return the dot product for the bottom 3 lanes, returning scalar. + */ +ASTCENC_SIMD_INLINE float dot3_s(vfloat4 a, vfloat4 b) +{ + return _mm_cvtss_f32(_mm_dp_ps(a.m, b.m, 0x77)); +} + +/** + * @brief Return the dot product for the bottom 3 lanes, returning vector. + */ +ASTCENC_SIMD_INLINE vfloat4 dot3(vfloat4 a, vfloat4 b) +{ + return vfloat4(_mm_dp_ps(a.m, b.m, 0x77)); +} + +#endif // #if defined(ASTCENC_NO_INVARIANCE) && (ASTCENC_SSE >= 41) + +#if ASTCENC_POPCNT >= 1 + +#define ASTCENC_USE_NATIVE_POPCOUNT 1 + +/** + * @brief Population bit count. + * + * @param v The value to population count. + * + * @return The number of 1 bits. + */ +ASTCENC_SIMD_INLINE int popcount(uint64_t v) +{ +#if !defined(__x86_64__) && !defined(_M_AMD64) + return static_cast(__builtin_popcountll(v)); +#else + return static_cast(_mm_popcnt_u64(v)); +#endif +} + +#endif // ASTCENC_POPCNT >= 1 + +#endif // #ifndef ASTC_VECMATHLIB_SSE_4_H_INCLUDED diff --git a/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sve_8.h b/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sve_8.h new file mode 100644 index 0000000..9f18853 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_vecmathlib_sve_8.h @@ -0,0 +1,1101 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2019-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. +// ---------------------------------------------------------------------------- + +/** + * @brief 8x32-bit vectors, implemented using SVE. + * + * This module implements 8-wide 32-bit float, int, and mask vectors for Arm + * SVE. + * + * There is a baseline level of functionality provided by all vector widths and + * implementations. This is implemented using identical function signatures, + * modulo data type, so we can use them as substitutable implementations in VLA + * code. + */ + +#ifndef ASTC_VECMATHLIB_SVE_8_H_INCLUDED +#define ASTC_VECMATHLIB_SVE_8_H_INCLUDED + +#ifndef ASTCENC_SIMD_INLINE + #error "Include astcenc_vecmathlib.h, do not include directly" +#endif + +#include + +typedef svbool_t svbool_8_t __attribute__((arm_sve_vector_bits(256))); +typedef svuint8_t svuint8_8_t __attribute__((arm_sve_vector_bits(256))); +typedef svuint16_t svuint16_8_t __attribute__((arm_sve_vector_bits(256))); +typedef svuint32_t svuint32_8_t __attribute__((arm_sve_vector_bits(256))); +typedef svint32_t svint32_8_t __attribute__((arm_sve_vector_bits(256))); +typedef svfloat32_t svfloat32_8_t __attribute__((arm_sve_vector_bits(256))); + +// ============================================================================ +// vfloat8 data type +// ============================================================================ + +/** + * @brief Data type for 8-wide floats. + */ +struct vfloat8 +{ + /** + * @brief Construct from zero-initialized value. + */ + ASTCENC_SIMD_INLINE vfloat8() = default; + + /** + * @brief Construct from 8 values loaded from an unaligned address. + * + * Consider using loada() which is better with vectors if data is aligned + * to vector length. + */ + ASTCENC_SIMD_INLINE explicit vfloat8(const float *p) + { + m = svld1_f32(svptrue_b32(), p); + } + + /** + * @brief Construct from 1 scalar value replicated across all lanes. + * + * Consider using zero() for constexpr zeros. + */ + ASTCENC_SIMD_INLINE explicit vfloat8(float a) + { + m = svdup_f32(a); + } + + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vfloat8(svfloat32_8_t a) + { + m = a; + } + + /** + * @brief Factory that returns a vector of zeros. + */ + static ASTCENC_SIMD_INLINE vfloat8 zero() + { + return vfloat8(0.0f); + } + + /** + * @brief Factory that returns a replicated scalar loaded from memory. + */ + static ASTCENC_SIMD_INLINE vfloat8 load1(const float* p) + { + return vfloat8(*p); + } + + /** + * @brief Factory that returns a vector loaded from 32B aligned memory. + */ + static ASTCENC_SIMD_INLINE vfloat8 loada(const float* p) + { + return vfloat8(p); + } + + /** + * @brief The vector ... + */ + svfloat32_8_t m; +}; + +// ============================================================================ +// vint8 data type +// ============================================================================ + +/** + * @brief Data type for 8-wide ints. + */ +struct vint8 +{ + /** + * @brief Construct from zero-initialized value. + */ + ASTCENC_SIMD_INLINE vint8() = default; + + /** + * @brief Construct from 8 values loaded from an unaligned address. + * + * Consider using loada() which is better with vectors if data is aligned + * to vector length. + */ + ASTCENC_SIMD_INLINE explicit vint8(const int *p) + { + m = svld1_s32(svptrue_b32(), p); + } + + /** + * @brief Construct from 8 uint8_t loaded from an unaligned address. + */ + ASTCENC_SIMD_INLINE explicit vint8(const uint8_t *p) + { + // Load 8-bit values and expand to 32-bits + m = svld1ub_s32(svptrue_b32(), p); + } + + /** + * @brief Construct from 1 scalar value replicated across all lanes. + * + * Consider using zero() for constexpr zeros. + */ + ASTCENC_SIMD_INLINE explicit vint8(int a) + { + m = svdup_s32(a); + } + + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vint8(svint32_8_t a) + { + m = a; + } + + /** + * @brief Factory that returns a vector of zeros. + */ + static ASTCENC_SIMD_INLINE vint8 zero() + { + return vint8(0.0f); + } + + /** + * @brief Factory that returns a replicated scalar loaded from memory. + */ + static ASTCENC_SIMD_INLINE vint8 load1(const int* p) + { + return vint8(*p); + } + + /** + * @brief Factory that returns a vector loaded from unaligned memory. + */ + static ASTCENC_SIMD_INLINE vint8 load(const uint8_t* p) + { + svuint8_8_t data = svld1_u8(svptrue_b8(), p); + return vint8(svreinterpret_s32_u8(data)); + } + + /** + * @brief Factory that returns a vector loaded from 32B aligned memory. + */ + static ASTCENC_SIMD_INLINE vint8 loada(const int* p) + { + return vint8(p); + } + + /** + * @brief Factory that returns a vector containing the lane IDs. + */ + static ASTCENC_SIMD_INLINE vint8 lane_id() + { + return vint8(svindex_s32(0, 1)); + } + + /** + * @brief The vector ... + */ + svint32_8_t m; +}; + +// ============================================================================ +// vmask8 data type +// ============================================================================ + +/** + * @brief Data type for 8-wide control plane masks. + */ +struct vmask8 +{ + /** + * @brief Construct from an existing SIMD register. + */ + ASTCENC_SIMD_INLINE explicit vmask8(svbool_8_t a) + { + m = a; + } + + /** + * @brief Construct from 1 scalar value. + */ + ASTCENC_SIMD_INLINE explicit vmask8(bool a) + { + m = svdup_b32(a); + } + + /** + * @brief The vector ... + */ + svbool_8_t m; +}; + +// ============================================================================ +// vmask8 operators and functions +// ============================================================================ + +/** + * @brief Overload: mask union (or). + */ +ASTCENC_SIMD_INLINE vmask8 operator|(vmask8 a, vmask8 b) +{ + return vmask8(svorr_z(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: mask intersect (and). + */ +ASTCENC_SIMD_INLINE vmask8 operator&(vmask8 a, vmask8 b) +{ + return vmask8(svand_z(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: mask difference (xor). + */ +ASTCENC_SIMD_INLINE vmask8 operator^(vmask8 a, vmask8 b) +{ + return vmask8(sveor_z(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: mask invert (not). + */ +ASTCENC_SIMD_INLINE vmask8 operator~(vmask8 a) +{ + return vmask8(svnot_z(svptrue_b32(), a.m)); +} + +/** + * @brief Return a 8-bit mask code indicating mask status. + * + * bit0 = lane 0 + */ +ASTCENC_SIMD_INLINE unsigned int mask(vmask8 a) +{ + alignas(32) const int shifta[8] { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 }; + svint32_8_t template_vals = svld1_s32(svptrue_b32(), shifta); + svint32_8_t active_vals = svsel_s32(a.m, template_vals, svdup_s32(0)); + return static_cast(svaddv_s32(svptrue_b32(), active_vals)); +} + +/** + * @brief True if any lanes are enabled, false otherwise. + */ +ASTCENC_SIMD_INLINE bool any(vmask8 a) +{ + return svptest_any(svptrue_b32(), a.m); +} + +/** + * @brief True if all lanes are enabled, false otherwise. + */ +ASTCENC_SIMD_INLINE bool all(vmask8 a) +{ + return !svptest_any(svptrue_b32(), (~a).m); +} + +// ============================================================================ +// vint8 operators and functions +// ============================================================================ +/** + * @brief Overload: vector by vector addition. + */ +ASTCENC_SIMD_INLINE vint8 operator+(vint8 a, vint8 b) +{ + return vint8(svadd_s32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector incremental addition. + */ +ASTCENC_SIMD_INLINE vint8& operator+=(vint8& a, const vint8& b) +{ + a = a + b; + return a; +} + +/** + * @brief Overload: vector by vector subtraction. + */ +ASTCENC_SIMD_INLINE vint8 operator-(vint8 a, vint8 b) +{ + return vint8(svsub_s32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector multiplication. + */ +ASTCENC_SIMD_INLINE vint8 operator*(vint8 a, vint8 b) +{ + return vint8(svmul_s32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector bit invert. + */ +ASTCENC_SIMD_INLINE vint8 operator~(vint8 a) +{ + return vint8(svnot_s32_x(svptrue_b32(), a.m)); +} + +/** + * @brief Overload: vector by vector bitwise or. + */ +ASTCENC_SIMD_INLINE vint8 operator|(vint8 a, vint8 b) +{ + return vint8(svorr_s32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector bitwise and. + */ +ASTCENC_SIMD_INLINE vint8 operator&(vint8 a, vint8 b) +{ + return vint8(svand_s32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector bitwise xor. + */ +ASTCENC_SIMD_INLINE vint8 operator^(vint8 a, vint8 b) +{ + return vint8(sveor_s32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector equality. + */ +ASTCENC_SIMD_INLINE vmask8 operator==(vint8 a, vint8 b) +{ + return vmask8(svcmpeq_s32(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector inequality. + */ +ASTCENC_SIMD_INLINE vmask8 operator!=(vint8 a, vint8 b) +{ + return vmask8(svcmpne_s32(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector less than. + */ +ASTCENC_SIMD_INLINE vmask8 operator<(vint8 a, vint8 b) +{ + return vmask8(svcmplt_s32(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector greater than. + */ +ASTCENC_SIMD_INLINE vmask8 operator>(vint8 a, vint8 b) +{ + return vmask8(svcmpgt_s32(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Logical shift left. + */ +template ASTCENC_SIMD_INLINE vint8 lsl(vint8 a) +{ + return vint8(svlsl_n_s32_x(svptrue_b32(), a.m, s)); +} + +/** + * @brief Arithmetic shift right. + */ +template ASTCENC_SIMD_INLINE vint8 asr(vint8 a) +{ + return vint8(svasr_n_s32_x(svptrue_b32(), a.m, s)); +} + +/** + * @brief Logical shift right. + */ +template ASTCENC_SIMD_INLINE vint8 lsr(vint8 a) +{ + svuint32_8_t r = svreinterpret_u32_s32(a.m); + r = svlsr_n_u32_x(svptrue_b32(), r, s); + return vint8(svreinterpret_s32_u32(r)); +} + +/** + * @brief Return the min vector of two vectors. + */ +ASTCENC_SIMD_INLINE vint8 min(vint8 a, vint8 b) +{ + return vint8(svmin_s32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Return the max vector of two vectors. + */ +ASTCENC_SIMD_INLINE vint8 max(vint8 a, vint8 b) +{ + return vint8(svmax_s32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE vint8 hmin(vint8 a) +{ + return vint8(svminv_s32(svptrue_b32(), a.m)); +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE int hmin_s(vint8 a) +{ + return svminv_s32(svptrue_b32(), a.m); +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE vint8 hmax(vint8 a) +{ + return vint8(svmaxv_s32(svptrue_b32(), a.m)); +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE int hmax_s(vint8 a) +{ + return svmaxv_s32(svptrue_b32(), a.m); +} + +/** + * @brief Generate a vint8 from a size_t. + */ + ASTCENC_SIMD_INLINE vint8 vint8_from_size(size_t a) + { + assert(a <= std::numeric_limits::max()); + return vint8(static_cast(a)); + } + +/** + * @brief Store a vector to a 16B aligned memory address. + */ +ASTCENC_SIMD_INLINE void storea(vint8 a, int* p) +{ + svst1_s32(svptrue_b32(), p, a.m); +} + +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vint8 a, int* p) +{ + svst1_s32(svptrue_b32(), p, a.m); +} + +/** + * @brief Store lowest N (vector width) bytes into an unaligned address. + */ +ASTCENC_SIMD_INLINE void store_nbytes(vint8 a, uint8_t* p) +{ + svuint8_8_t r = svreinterpret_u8_s32(a.m); + svst1_u8(svptrue_pat_b8(SV_VL8), p, r); +} + +/** + * @brief Pack low 8 bits of N (vector width) lanes into bottom of vector. + */ +ASTCENC_SIMD_INLINE void pack_and_store_low_bytes(vint8 v, uint8_t* p) +{ + svuint32_8_t data = svreinterpret_u32_s32(v.m); + svst1b_u32(svptrue_b32(), p, data); +} + +/** + * @brief Return lanes from @c b if @c cond is set, else @c a. + */ +ASTCENC_SIMD_INLINE vint8 select(vint8 a, vint8 b, vmask8 cond) +{ + return vint8(svsel_s32(cond.m, b.m, a.m)); +} + +// ============================================================================ +// vfloat8 operators and functions +// ============================================================================ + +/** + * @brief Overload: vector by vector addition. + */ +ASTCENC_SIMD_INLINE vfloat8 operator+(vfloat8 a, vfloat8 b) +{ + return vfloat8(svadd_f32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector incremental addition. + */ +ASTCENC_SIMD_INLINE vfloat8& operator+=(vfloat8& a, const vfloat8& b) +{ + a = a + b; + return a; +} + +/** + * @brief Overload: vector by vector subtraction. + */ +ASTCENC_SIMD_INLINE vfloat8 operator-(vfloat8 a, vfloat8 b) +{ + return vfloat8(svsub_f32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector multiplication. + */ +ASTCENC_SIMD_INLINE vfloat8 operator*(vfloat8 a, vfloat8 b) +{ + return vfloat8(svmul_f32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by scalar multiplication. + */ +ASTCENC_SIMD_INLINE vfloat8 operator*(vfloat8 a, float b) +{ + return vfloat8(svmul_f32_x(svptrue_b32(), a.m, svdup_f32(b))); +} + +/** + * @brief Overload: scalar by vector multiplication. + */ +ASTCENC_SIMD_INLINE vfloat8 operator*(float a, vfloat8 b) +{ + return vfloat8(svmul_f32_x(svptrue_b32(), svdup_f32(a), b.m)); +} + +/** + * @brief Overload: vector by vector division. + */ +ASTCENC_SIMD_INLINE vfloat8 operator/(vfloat8 a, vfloat8 b) +{ + return vfloat8(svdiv_f32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by scalar division. + */ +ASTCENC_SIMD_INLINE vfloat8 operator/(vfloat8 a, float b) +{ + return vfloat8(svdiv_f32_x(svptrue_b32(), a.m, svdup_f32(b))); +} + +/** + * @brief Overload: scalar by vector division. + */ +ASTCENC_SIMD_INLINE vfloat8 operator/(float a, vfloat8 b) +{ + return vfloat8(svdiv_f32_x(svptrue_b32(), svdup_f32(a), b.m)); +} + +/** + * @brief Overload: vector by vector equality. + */ +ASTCENC_SIMD_INLINE vmask8 operator==(vfloat8 a, vfloat8 b) +{ + return vmask8(svcmpeq_f32(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector inequality. + */ +ASTCENC_SIMD_INLINE vmask8 operator!=(vfloat8 a, vfloat8 b) +{ + return vmask8(svcmpne_f32(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector less than. + */ +ASTCENC_SIMD_INLINE vmask8 operator<(vfloat8 a, vfloat8 b) +{ + return vmask8(svcmplt_f32(svptrue_b32(), a.m, b.m));; +} + +/** + * @brief Overload: vector by vector greater than. + */ +ASTCENC_SIMD_INLINE vmask8 operator>(vfloat8 a, vfloat8 b) +{ + return vmask8(svcmpgt_f32(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector less than or equal. + */ +ASTCENC_SIMD_INLINE vmask8 operator<=(vfloat8 a, vfloat8 b) +{ + return vmask8(svcmple_f32(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Overload: vector by vector greater than or equal. + */ +ASTCENC_SIMD_INLINE vmask8 operator>=(vfloat8 a, vfloat8 b) +{ + return vmask8(svcmpge_f32(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Return the min vector of two vectors. + * + * If either lane value is NaN, the other lane will be returned. + */ +ASTCENC_SIMD_INLINE vfloat8 min(vfloat8 a, vfloat8 b) +{ + return vfloat8(svminnm_f32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Return the min vector of a vector and a scalar. + * + * If either lane value is NaN, the other lane will be returned. + */ +ASTCENC_SIMD_INLINE vfloat8 min(vfloat8 a, float b) +{ + return min(a, vfloat8(b)); +} + +/** + * @brief Return the max vector of two vectors. + * + * If either lane value is NaN, the other lane will be returned. + */ +ASTCENC_SIMD_INLINE vfloat8 max(vfloat8 a, vfloat8 b) +{ + return vfloat8(svmaxnm_f32_x(svptrue_b32(), a.m, b.m)); +} + +/** + * @brief Return the max vector of a vector and a scalar. + * + * If either lane value is NaN, the other lane will be returned. + */ +ASTCENC_SIMD_INLINE vfloat8 max(vfloat8 a, float b) +{ + return max(a, vfloat8(b)); +} + +/** + * @brief Return the clamped value between min and max. + * + * It is assumed that neither @c min nor @c max are NaN values. If @c a is NaN + * then @c min will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat8 clamp(float minv, float maxv, vfloat8 a) +{ + return min(max(a, minv), maxv); +} + +/** + * @brief Return a clamped value between 0.0f and 1.0f. + * + * If @c a is NaN then zero will be returned for that lane. + */ +ASTCENC_SIMD_INLINE vfloat8 clampzo(vfloat8 a) +{ + return clamp(0.0f, 1.0f, a); +} + +/** + * @brief Return the absolute value of the float vector. + */ +ASTCENC_SIMD_INLINE vfloat8 abs(vfloat8 a) +{ + return vfloat8(svabs_f32_x(svptrue_b32(), a.m)); +} + +/** + * @brief Return a float rounded to the nearest integer value. + */ +ASTCENC_SIMD_INLINE vfloat8 round(vfloat8 a) +{ + return vfloat8(svrintn_f32_x(svptrue_b32(), a.m)); +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE vfloat8 hmin(vfloat8 a) +{ + return vfloat8(svminnmv_f32(svptrue_b32(), a.m)); +} + +/** + * @brief Return the horizontal minimum of a vector. + */ +ASTCENC_SIMD_INLINE float hmin_s(vfloat8 a) +{ + return svminnmv_f32(svptrue_b32(), a.m); +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE vfloat8 hmax(vfloat8 a) +{ + return vfloat8(svmaxnmv_f32(svptrue_b32(), a.m)); +} + +/** + * @brief Return the horizontal maximum of a vector. + */ +ASTCENC_SIMD_INLINE float hmax_s(vfloat8 a) +{ + return svmaxnmv_f32(svptrue_b32(), a.m); +} + +/** + * @brief Return the horizontal sum of a vector. + */ +ASTCENC_SIMD_INLINE float hadd_s(vfloat8 a) +{ + // Can't use svaddv - it's not invariant + vfloat4 lo(svget_neonq_f32(a.m)); + vfloat4 hi(svget_neonq_f32(svext_f32(a.m, a.m, 4))); + return hadd_s(lo) + hadd_s(hi); +} + +/** + * @brief Return lanes from @c b if @c cond is set, else @c a. + */ +ASTCENC_SIMD_INLINE vfloat8 select(vfloat8 a, vfloat8 b, vmask8 cond) +{ + return vfloat8(svsel_f32(cond.m, b.m, a.m)); +} + +/** + * @brief Accumulate lane-wise sums for a vector, folded 4-wide. + * + * This is invariant with 4-wide implementations. + */ +ASTCENC_SIMD_INLINE void haccumulate(vfloat4& accum, vfloat8 a) +{ + vfloat4 lo(svget_neonq_f32(a.m)); + haccumulate(accum, lo); + + vfloat4 hi(svget_neonq_f32(svext_f32(a.m, a.m, 4))); + haccumulate(accum, hi); +} + +/** + * @brief Accumulate lane-wise sums for a vector. + * + * This is NOT invariant with 4-wide implementations. + */ +ASTCENC_SIMD_INLINE void haccumulate(vfloat8& accum, vfloat8 a) +{ + accum += a; +} + +/** + * @brief Accumulate masked lane-wise sums for a vector, folded 4-wide. + * + * This is invariant with 4-wide implementations. + */ +ASTCENC_SIMD_INLINE void haccumulate(vfloat4& accum, vfloat8 a, vmask8 m) +{ + a = select(vfloat8::zero(), a, m); + haccumulate(accum, a); +} + +/** + * @brief Accumulate masked lane-wise sums for a vector. + * + * This is NOT invariant with 4-wide implementations. + */ +ASTCENC_SIMD_INLINE void haccumulate(vfloat8& accum, vfloat8 a, vmask8 m) +{ + accum.m = svadd_f32_m(m.m, accum.m, a.m); +} + +/** + * @brief Return the sqrt of the lanes in the vector. + */ +ASTCENC_SIMD_INLINE vfloat8 sqrt(vfloat8 a) +{ + return vfloat8(svsqrt_f32_x(svptrue_b32(), a.m)); +} + +/** + * @brief Load a vector of gathered results from an array; + */ +ASTCENC_SIMD_INLINE vfloat8 gatherf(const float* base, vint8 indices) +{ + return vfloat8(svld1_gather_s32index_f32(svptrue_b32(), base, indices.m)); +} + +/** + * @brief Load a vector of gathered results from an array using byte indices from memory + */ +template<> +ASTCENC_SIMD_INLINE vfloat8 gatherf_byte_inds(const float* base, const uint8_t* indices) +{ + svint32_t offsets = svld1ub_s32(svptrue_b32(), indices); + return vfloat8(svld1_gather_s32index_f32(svptrue_b32(), base, offsets)); +} + +/** + * @brief Store a vector to an unaligned memory address. + */ +ASTCENC_SIMD_INLINE void store(vfloat8 a, float* p) +{ + svst1_f32(svptrue_b32(), p, a.m); +} + +/** + * @brief Store a vector to a 32B aligned memory address. + */ +ASTCENC_SIMD_INLINE void storea(vfloat8 a, float* p) +{ + svst1_f32(svptrue_b32(), p, a.m); +} + +/** + * @brief Return a integer value for a float vector, using truncation. + */ +ASTCENC_SIMD_INLINE vint8 float_to_int(vfloat8 a) +{ + return vint8(svcvt_s32_f32_x(svptrue_b32(), a.m)); +} + +/** + * @brief Return a integer value for a float vector, using round-to-nearest. + */ +ASTCENC_SIMD_INLINE vint8 float_to_int_rtn(vfloat8 a) +{ + a = a + vfloat8(0.5f); + return vint8(svcvt_s32_f32_x(svptrue_b32(), a.m)); +} + +/** + * @brief Return a float value for an integer vector. + */ +ASTCENC_SIMD_INLINE vfloat8 int_to_float(vint8 a) +{ + return vfloat8(svcvt_f32_s32_x(svptrue_b32(), a.m)); +} + +/** + * @brief Return a float value as an integer bit pattern (i.e. no conversion). + * + * It is a common trick to convert floats into integer bit patterns, perform + * some bit hackery based on knowledge they are IEEE 754 layout, and then + * convert them back again. This is the first half of that flip. + */ +ASTCENC_SIMD_INLINE vint8 float_as_int(vfloat8 a) +{ + return vint8(svreinterpret_s32_f32(a.m)); +} + +/** + * @brief Return a integer value as a float bit pattern (i.e. no conversion). + * + * It is a common trick to convert floats into integer bit patterns, perform + * some bit hackery based on knowledge they are IEEE 754 layout, and then + * convert them back again. This is the second half of that flip. + */ +ASTCENC_SIMD_INLINE vfloat8 int_as_float(vint8 a) +{ + return vfloat8(svreinterpret_f32_s32(a.m)); +} + +/* + * Table structure for a 16x 8-bit entry table. + */ +struct vtable8_16x8 { + svuint8_8_t t0; +}; + +/* + * Table structure for a 32x 8-bit entry table. + */ +struct vtable8_32x8 { + svuint8_8_t t0; +}; + +/* + * Table structure for a 64x 8-bit entry table. + */ +struct vtable8_64x8 { + svuint8_8_t t0; + svuint8_8_t t1; +}; + +/** + * @brief Prepare a vtable lookup table for 16x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable8_16x8& table, + const uint8_t* data +) { + // Top half of register will be zeros + table.t0 = svld1_u8(svptrue_pat_b8(SV_VL16), data); +} + +/** + * @brief Prepare a vtable lookup table for 32x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable8_32x8& table, + const uint8_t* data +) { + table.t0 = svld1_u8(svptrue_b8(), data); +} + +/** + * @brief Prepare a vtable lookup table 64x 8-bit entry table. + */ +ASTCENC_SIMD_INLINE void vtable_prepare( + vtable8_64x8& table, + const uint8_t* data +) { + table.t0 = svld1_u8(svptrue_b8(), data); + table.t1 = svld1_u8(svptrue_b8(), data + 32); +} + +/** + * @brief Perform a vtable lookup in a 16x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint8 vtable_lookup_32bit( + const vtable8_16x8& tbl, + vint8 idx +) { + // Set index byte above max index for unused bytes so table lookup returns zero + svint32_8_t idx_masked = svorr_s32_x(svptrue_b32(), idx.m, svdup_s32(0xFFFFFF00)); + svuint8_8_t idx_bytes = svreinterpret_u8_s32(idx_masked); + + svuint8_8_t result = svtbl_u8(tbl.t0, idx_bytes); + return vint8(svreinterpret_s32_u8(result)); +} + +/** + * @brief Perform a vtable lookup in a 32x 8-bit table with 32-bit indices. + */ +ASTCENC_SIMD_INLINE vint8 vtable_lookup_32bit( + const vtable8_32x8& tbl, + vint8 idx +) { + // Set index byte above max index for unused bytes so table lookup returns zero + svint32_8_t idx_masked = svorr_s32_x(svptrue_b32(), idx.m, svdup_s32(0xFFFFFF00)); + svuint8_8_t idx_bytes = svreinterpret_u8_s32(idx_masked); + + svuint8_8_t result = svtbl_u8(tbl.t0, idx_bytes); + return vint8(svreinterpret_s32_u8(result)); +} + +/** + * @brief Perform a vtable lookup in a 64x 8-bit table with 32-bit indices. + * + * Future: SVE2 can directly do svtbl2_u8() for a two register table. + */ +ASTCENC_SIMD_INLINE vint8 vtable_lookup_32bit( + const vtable8_64x8& tbl, + vint8 idx +) { + // Set index byte above max index for unused bytes so table lookup returns zero + svint32_8_t idxm = svorr_s32_x(svptrue_b32(), idx.m, svdup_s32(0xFFFFFF00)); + + svuint8_8_t idxm8 = svreinterpret_u8_s32(idxm); + svuint8_8_t t0_lookup = svtbl_u8(tbl.t0, idxm8); + + idxm8 = svsub_u8_x(svptrue_b8(), idxm8, svdup_u8(32)); + svuint8_8_t t1_lookup = svtbl_u8(tbl.t1, idxm8); + + svuint8_8_t result = svorr_u8_x(svptrue_b32(), t0_lookup, t1_lookup); + return vint8(svreinterpret_s32_u8(result)); +} + +/** + * @brief Return a vector of interleaved RGBA data. + * + * Input vectors have the value stored in the bottom 8 bits of each lane, + * with high bits set to zero. + * + * Output vector stores a single RGBA texel packed in each lane. + */ +ASTCENC_SIMD_INLINE vint8 interleave_rgba8(vint8 r, vint8 g, vint8 b, vint8 a) +{ + return r + lsl<8>(g) + lsl<16>(b) + lsl<24>(a); +} + +/** + * @brief Store a vector, skipping masked lanes. + * + * All masked lanes must be at the end of vector, after all non-masked lanes. + */ +ASTCENC_SIMD_INLINE void store_lanes_masked(uint8_t* base, vint8 data, vmask8 mask) +{ + svst1_s32(mask.m, reinterpret_cast(base), data.m); +} + +/** + * @brief Debug function to print a vector of ints. + */ +ASTCENC_SIMD_INLINE void print(vint8 a) +{ + alignas(32) int v[8]; + storea(a, v); + printf("v8_i32:\n %8d %8d %8d %8d %8d %8d %8d %8d\n", + v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]); +} + +/** + * @brief Debug function to print a vector of ints. + */ +ASTCENC_SIMD_INLINE void printx(vint8 a) +{ + alignas(32) int v[8]; + storea(a, v); + printf("v8_i32:\n %08x %08x %08x %08x %08x %08x %08x %08x\n", + v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]); +} + +/** + * @brief Debug function to print a vector of floats. + */ +ASTCENC_SIMD_INLINE void print(vfloat8 a) +{ + alignas(32) float v[8]; + storea(a, v); + printf("v8_f32:\n %0.4f %0.4f %0.4f %0.4f %0.4f %0.4f %0.4f %0.4f\n", + static_cast(v[0]), static_cast(v[1]), + static_cast(v[2]), static_cast(v[3]), + static_cast(v[4]), static_cast(v[5]), + static_cast(v[6]), static_cast(v[7])); +} + +/** + * @brief Debug function to print a vector of masks. + */ +ASTCENC_SIMD_INLINE void print(vmask8 a) +{ + print(select(vint8(0), vint8(1), a)); +} + +#endif // #ifndef ASTC_VECMATHLIB_SVE_8_H_INCLUDED diff --git a/ktx/external/astc-encoder/Source/astcenc_weight_align.cpp b/ktx/external/astc-encoder/Source/astcenc_weight_align.cpp new file mode 100644 index 0000000..b205416 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_weight_align.cpp @@ -0,0 +1,496 @@ +// 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 for angular-sum algorithm for weight alignment. + * + * This algorithm works as follows: + * - we compute a complex number P as (cos s*i, sin s*i) for each weight, + * where i is the input value and s is a scaling factor based on the spacing between the weights. + * - we then add together complex numbers for all the weights. + * - we then compute the length and angle of the resulting sum. + * + * This should produce the following results: + * - perfect alignment results in a vector whose length is equal to the sum of lengths of all inputs + * - even distribution results in a vector of length 0. + * - all samples identical results in perfect alignment for every scaling. + * + * For each scaling factor within a given set, we compute an alignment factor from 0 to 1. This + * should then result in some scalings standing out as having particularly good alignment factors; + * we can use this to produce a set of candidate scale/shift values for various quantization levels; + * we should then actually try them and see what happens. + */ + +#include "astcenc_internal.h" +#include "astcenc_vecmathlib.h" + +#include +#include +#include +#include + +static constexpr unsigned int ANGULAR_STEPS { 32 }; + +static_assert((ANGULAR_STEPS % ASTCENC_SIMD_WIDTH) == 0, + "ANGULAR_STEPS must be multiple of ASTCENC_SIMD_WIDTH"); + +static_assert(ANGULAR_STEPS >= 32, + "ANGULAR_STEPS must be at least max(steps_for_quant_level)"); + +// Store a reduced sin/cos table for 64 possible weight values; this causes +// slight quality loss compared to using sin() and cos() directly. Must be 2^N. +static constexpr unsigned int SINCOS_STEPS { 64 }; + +static const uint8_t steps_for_quant_level[12] { + 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32 +}; + +ASTCENC_ALIGNAS static float sin_table[SINCOS_STEPS][ANGULAR_STEPS]; +ASTCENC_ALIGNAS static float cos_table[SINCOS_STEPS][ANGULAR_STEPS]; + +#if defined(ASTCENC_DIAGNOSTICS) + static bool print_once { true }; +#endif + +/* See header for documentation. */ +void prepare_angular_tables() +{ + for (unsigned int i = 0; i < ANGULAR_STEPS; i++) + { + float angle_step = static_cast(i + 1); + + for (unsigned int j = 0; j < SINCOS_STEPS; j++) + { + sin_table[j][i] = static_cast(sinf((2.0f * astc::PI / (SINCOS_STEPS - 1.0f)) * angle_step * static_cast(j))); + cos_table[j][i] = static_cast(cosf((2.0f * astc::PI / (SINCOS_STEPS - 1.0f)) * angle_step * static_cast(j))); + } + } +} + +/** + * @brief Compute the angular alignment factors and offsets. + * + * @param weight_count The number of (decimated) weights. + * @param dec_weight_ideal_value The ideal decimated unquantized weight values. + * @param max_angular_steps The maximum number of steps to be tested. + * @param[out] offsets The output angular offsets array. + */ +static void compute_angular_offsets( + unsigned int weight_count, + const float* dec_weight_ideal_value, + unsigned int max_angular_steps, + float* offsets +) { + promise(weight_count > 0); + promise(max_angular_steps > 0); + + ASTCENC_ALIGNAS int isamplev[BLOCK_MAX_WEIGHTS]; + + // Precompute isample; arrays are always allocated 64 elements long + for (unsigned int i = 0; i < weight_count; i += ASTCENC_SIMD_WIDTH) + { + // Ideal weight can be outside [0, 1] range, so clamp to fit table + vfloat ideal_weight = clampzo(loada(dec_weight_ideal_value + i)); + + // Convert a weight to a sincos table index + vfloat sample = ideal_weight * (SINCOS_STEPS - 1.0f); + vint isample = float_to_int_rtn(sample); + storea(isample, isamplev + i); + } + + // Arrays are multiple of SIMD width (ANGULAR_STEPS), safe to overshoot max + vfloat mult(1.0f / (2.0f * astc::PI)); + + for (unsigned int i = 0; i < max_angular_steps; i += ASTCENC_SIMD_WIDTH) + { + vfloat anglesum_x = vfloat::zero(); + vfloat anglesum_y = vfloat::zero(); + + for (unsigned int j = 0; j < weight_count; j++) + { + int isample = isamplev[j]; + anglesum_x += loada(cos_table[isample] + i); + anglesum_y += loada(sin_table[isample] + i); + } + + vfloat angle = atan2(anglesum_y, anglesum_x); + vfloat ofs = angle * mult; + storea(ofs, offsets + i); + } +} + +/** + * @brief For a given step size compute the lowest and highest weight. + * + * Compute the lowest and highest weight that results from quantizing using the given stepsize and + * offset, and then compute the resulting error. The cut errors indicate the error that results from + * forcing samples that should have had one weight value one step up or down. + * + * @param weight_count The number of (decimated) weights. + * @param dec_weight_ideal_value The ideal decimated unquantized weight values. + * @param max_angular_steps The maximum number of steps to be tested. + * @param max_quant_steps The maximum quantization level to be tested. + * @param offsets The angular offsets array. + * @param[out] lowest_weight Per angular step, the lowest weight. + * @param[out] weight_span Per angular step, the span between lowest and highest weight. + * @param[out] error Per angular step, the error. + * @param[out] cut_low_weight_error Per angular step, the low weight cut error. + * @param[out] cut_high_weight_error Per angular step, the high weight cut error. + */ +static void compute_lowest_and_highest_weight( + unsigned int weight_count, + const float* dec_weight_ideal_value, + unsigned int max_angular_steps, + unsigned int max_quant_steps, + const float* offsets, + float* lowest_weight, + int* weight_span, + float* error, + float* cut_low_weight_error, + float* cut_high_weight_error +) { + promise(weight_count > 0); + promise(max_angular_steps > 0); + + vfloat rcp_stepsize = int_to_float(vint::lane_id()) + vfloat(1.0f); + + // Compute minimum/maximum weights in the weight array. Our remapping + // is monotonic, so the min/max rounded weights relate to the min/max + // unrounded weights in a straightforward way. + vfloat min_weight(FLT_MAX); + vfloat max_weight(-FLT_MAX); + + vint lane_id = vint::lane_id(); + for (unsigned int i = 0; i < weight_count; i += ASTCENC_SIMD_WIDTH) + { + vmask active = lane_id < vint(weight_count); + lane_id += vint(ASTCENC_SIMD_WIDTH); + + vfloat weights = loada(dec_weight_ideal_value + i); + min_weight = min(min_weight, select(min_weight, weights, active)); + max_weight = max(max_weight, select(max_weight, weights, active)); + } + + min_weight = hmin(min_weight); + max_weight = hmax(max_weight); + + // Arrays are ANGULAR_STEPS long, so always safe to run full vectors + for (unsigned int sp = 0; sp < max_angular_steps; sp += ASTCENC_SIMD_WIDTH) + { + vfloat errval = vfloat::zero(); + vfloat cut_low_weight_err = vfloat::zero(); + vfloat cut_high_weight_err = vfloat::zero(); + vfloat offset = loada(offsets + sp); + + // We know the min and max weight values, so we can figure out + // the corresponding indices before we enter the loop. + vfloat minidx = round(min_weight * rcp_stepsize - offset); + vfloat maxidx = round(max_weight * rcp_stepsize - offset); + + for (unsigned int j = 0; j < weight_count; j++) + { + vfloat sval = load1(dec_weight_ideal_value + j) * rcp_stepsize - offset; + vfloat svalrte = round(sval); + vfloat diff = sval - svalrte; + errval += diff * diff; + + // Accumulate errors for minimum index + vmask mask = svalrte == minidx; + vfloat accum = cut_low_weight_err + vfloat(1.0f) - vfloat(2.0f) * diff; + cut_low_weight_err = select(cut_low_weight_err, accum, mask); + + // Accumulate errors for maximum index + mask = svalrte == maxidx; + accum = cut_high_weight_err + vfloat(1.0f) + vfloat(2.0f) * diff; + cut_high_weight_err = select(cut_high_weight_err, accum, mask); + } + + // Write out min weight and weight span; clamp span to a usable range + vint span = float_to_int(maxidx - minidx + vfloat(1)); + span = min(span, vint(max_quant_steps + 3)); + span = max(span, vint(2)); + storea(minidx, lowest_weight + sp); + storea(span, weight_span + sp); + + // The cut_(lowest/highest)_weight_error indicate the error that results from forcing + // samples that should have had the weight value one step (up/down). + vfloat ssize = 1.0f / rcp_stepsize; + vfloat errscale = ssize * ssize; + storea(errval * errscale, error + sp); + storea(cut_low_weight_err * errscale, cut_low_weight_error + sp); + storea(cut_high_weight_err * errscale, cut_high_weight_error + sp); + + rcp_stepsize = rcp_stepsize + vfloat(ASTCENC_SIMD_WIDTH); + } +} + +/** + * @brief The main function for the angular algorithm. + * + * @param weight_count The number of (decimated) weights. + * @param dec_weight_ideal_value The ideal decimated unquantized weight values. + * @param max_quant_level The maximum quantization level to be tested. + * @param[out] low_value Per angular step, the lowest weight value. + * @param[out] high_value Per angular step, the highest weight value. + */ +static void compute_angular_endpoints_for_quant_levels( + unsigned int weight_count, + const float* dec_weight_ideal_value, + unsigned int max_quant_level, + float low_value[TUNE_MAX_ANGULAR_QUANT + 1], + float high_value[TUNE_MAX_ANGULAR_QUANT + 1] +) { + unsigned int max_quant_steps = steps_for_quant_level[max_quant_level]; + unsigned int max_angular_steps = steps_for_quant_level[max_quant_level]; + + ASTCENC_ALIGNAS float angular_offsets[ANGULAR_STEPS]; + + compute_angular_offsets(weight_count, dec_weight_ideal_value, + max_angular_steps, angular_offsets); + + ASTCENC_ALIGNAS float lowest_weight[ANGULAR_STEPS]; + ASTCENC_ALIGNAS int32_t weight_span[ANGULAR_STEPS]; + ASTCENC_ALIGNAS float error[ANGULAR_STEPS]; + ASTCENC_ALIGNAS float cut_low_weight_error[ANGULAR_STEPS]; + ASTCENC_ALIGNAS float cut_high_weight_error[ANGULAR_STEPS]; + + compute_lowest_and_highest_weight(weight_count, dec_weight_ideal_value, + max_angular_steps, max_quant_steps, + angular_offsets, lowest_weight, weight_span, error, + cut_low_weight_error, cut_high_weight_error); + + // For each quantization level, find the best error terms. Use packed vectors so data-dependent + // branches can become selects. This involves some integer to float casts, but the values are + // small enough so they never round the wrong way. + vfloat4 best_results[36]; + + // Initialize the array to some safe defaults + promise(max_quant_steps > 0); + for (unsigned int i = 0; i < (max_quant_steps + 4); i++) + { + // Lane<0> = Best error + // Lane<1> = Best scale; -1 indicates no solution found + // Lane<2> = Cut low weight + best_results[i] = vfloat4(ERROR_CALC_DEFAULT, -1.0f, 0.0f, 0.0f); + } + + promise(max_angular_steps > 0); + for (unsigned int i = 0; i < max_angular_steps; i++) + { + float i_flt = static_cast(i); + + int idx_span = weight_span[i]; + + float error_cut_low = error[i] + cut_low_weight_error[i]; + float error_cut_high = error[i] + cut_high_weight_error[i]; + float error_cut_low_high = error[i] + cut_low_weight_error[i] + cut_high_weight_error[i]; + + // Check best error against record N + vfloat4 best_result = best_results[idx_span]; + vfloat4 new_result = vfloat4(error[i], i_flt, 0.0f, 0.0f); + vmask4 mask = vfloat4(best_result.lane<0>()) > vfloat4(error[i]); + best_results[idx_span] = select(best_result, new_result, mask); + + // Check best error against record N-1 with either cut low or cut high + best_result = best_results[idx_span - 1]; + + new_result = vfloat4(error_cut_low, i_flt, 1.0f, 0.0f); + mask = vfloat4(best_result.lane<0>()) > vfloat4(error_cut_low); + best_result = select(best_result, new_result, mask); + + new_result = vfloat4(error_cut_high, i_flt, 0.0f, 0.0f); + mask = vfloat4(best_result.lane<0>()) > vfloat4(error_cut_high); + best_results[idx_span - 1] = select(best_result, new_result, mask); + + // Check best error against record N-2 with both cut low and high + best_result = best_results[idx_span - 2]; + new_result = vfloat4(error_cut_low_high, i_flt, 1.0f, 0.0f); + mask = vfloat4(best_result.lane<0>()) > vfloat4(error_cut_low_high); + best_results[idx_span - 2] = select(best_result, new_result, mask); + } + + for (unsigned int i = 0; i <= max_quant_level; i++) + { + unsigned int q = steps_for_quant_level[i]; + int bsi = static_cast(best_results[q].lane<1>()); + + // Did we find anything? +#if defined(ASTCENC_DIAGNOSTICS) + if ((bsi < 0) && print_once) + { + print_once = false; + printf("INFO: Unable to find full encoding within search error limit.\n\n"); + } +#endif + + bsi = astc::max(0, bsi); + + float lwi = lowest_weight[bsi] + best_results[q].lane<2>(); + float hwi = lwi + static_cast(q) - 1.0f; + + float stepsize = 1.0f / (1.0f + static_cast(bsi)); + low_value[i] = (angular_offsets[bsi] + lwi) * stepsize; + high_value[i] = (angular_offsets[bsi] + hwi) * stepsize; + } +} + +/* See header for documentation. */ +void compute_angular_endpoints_1plane( + bool only_always, + const block_size_descriptor& bsd, + const float* dec_weight_ideal_value, + unsigned int max_weight_quant, + compression_working_buffers& tmpbuf +) { + float (&low_value)[WEIGHTS_MAX_BLOCK_MODES] = tmpbuf.weight_low_value1; + float (&high_value)[WEIGHTS_MAX_BLOCK_MODES] = tmpbuf.weight_high_value1; + + float (&low_values)[WEIGHTS_MAX_DECIMATION_MODES][TUNE_MAX_ANGULAR_QUANT + 1] = tmpbuf.weight_low_values1; + float (&high_values)[WEIGHTS_MAX_DECIMATION_MODES][TUNE_MAX_ANGULAR_QUANT + 1] = tmpbuf.weight_high_values1; + + unsigned int max_decimation_modes = only_always ? bsd.decimation_mode_count_always + : bsd.decimation_mode_count_selected; + promise(max_decimation_modes > 0); + for (unsigned int i = 0; i < max_decimation_modes; i++) + { + const decimation_mode& dm = bsd.decimation_modes[i]; + if (!dm.is_ref_1plane(static_cast(max_weight_quant))) + { + continue; + } + + unsigned int weight_count = bsd.get_decimation_info(i).weight_count; + + unsigned int max_precision = dm.maxprec_1plane; + if (max_precision > TUNE_MAX_ANGULAR_QUANT) + { + max_precision = TUNE_MAX_ANGULAR_QUANT; + } + + if (max_precision > max_weight_quant) + { + max_precision = max_weight_quant; + } + + compute_angular_endpoints_for_quant_levels( + weight_count, + dec_weight_ideal_value + i * BLOCK_MAX_WEIGHTS, + max_precision, low_values[i], high_values[i]); + } + + unsigned int max_block_modes = only_always ? bsd.block_mode_count_1plane_always + : bsd.block_mode_count_1plane_selected; + promise(max_block_modes > 0); + for (unsigned int i = 0; i < max_block_modes; i++) + { + const block_mode& bm = bsd.block_modes[i]; + assert(!bm.is_dual_plane); + + unsigned int quant_mode = bm.quant_mode; + unsigned int decim_mode = bm.decimation_mode; + + if (quant_mode <= TUNE_MAX_ANGULAR_QUANT) + { + low_value[i] = low_values[decim_mode][quant_mode]; + high_value[i] = high_values[decim_mode][quant_mode]; + } + else + { + low_value[i] = 0.0f; + high_value[i] = 1.0f; + } + } +} + +/* See header for documentation. */ +void compute_angular_endpoints_2planes( + const block_size_descriptor& bsd, + const float* dec_weight_ideal_value, + unsigned int max_weight_quant, + compression_working_buffers& tmpbuf +) { + float (&low_value1)[WEIGHTS_MAX_BLOCK_MODES] = tmpbuf.weight_low_value1; + float (&high_value1)[WEIGHTS_MAX_BLOCK_MODES] = tmpbuf.weight_high_value1; + float (&low_value2)[WEIGHTS_MAX_BLOCK_MODES] = tmpbuf.weight_low_value2; + float (&high_value2)[WEIGHTS_MAX_BLOCK_MODES] = tmpbuf.weight_high_value2; + + float (&low_values1)[WEIGHTS_MAX_DECIMATION_MODES][TUNE_MAX_ANGULAR_QUANT + 1] = tmpbuf.weight_low_values1; + float (&high_values1)[WEIGHTS_MAX_DECIMATION_MODES][TUNE_MAX_ANGULAR_QUANT + 1] = tmpbuf.weight_high_values1; + float (&low_values2)[WEIGHTS_MAX_DECIMATION_MODES][TUNE_MAX_ANGULAR_QUANT + 1] = tmpbuf.weight_low_values2; + float (&high_values2)[WEIGHTS_MAX_DECIMATION_MODES][TUNE_MAX_ANGULAR_QUANT + 1] = tmpbuf.weight_high_values2; + + promise(bsd.decimation_mode_count_selected > 0); + for (unsigned int i = 0; i < bsd.decimation_mode_count_selected; i++) + { + const decimation_mode& dm = bsd.decimation_modes[i]; + if (!dm.is_ref_2plane(static_cast(max_weight_quant))) + { + continue; + } + + unsigned int weight_count = bsd.get_decimation_info(i).weight_count; + + unsigned int max_precision = dm.maxprec_2planes; + if (max_precision > TUNE_MAX_ANGULAR_QUANT) + { + max_precision = TUNE_MAX_ANGULAR_QUANT; + } + + if (max_precision > max_weight_quant) + { + max_precision = max_weight_quant; + } + + compute_angular_endpoints_for_quant_levels( + weight_count, + dec_weight_ideal_value + i * BLOCK_MAX_WEIGHTS, + max_precision, low_values1[i], high_values1[i]); + + compute_angular_endpoints_for_quant_levels( + weight_count, + dec_weight_ideal_value + i * BLOCK_MAX_WEIGHTS + WEIGHTS_PLANE2_OFFSET, + max_precision, low_values2[i], high_values2[i]); + } + + unsigned int start = bsd.block_mode_count_1plane_selected; + unsigned int end = bsd.block_mode_count_1plane_2plane_selected; + for (unsigned int i = start; i < end; i++) + { + const block_mode& bm = bsd.block_modes[i]; + unsigned int quant_mode = bm.quant_mode; + unsigned int decim_mode = bm.decimation_mode; + + if (quant_mode <= TUNE_MAX_ANGULAR_QUANT) + { + low_value1[i] = low_values1[decim_mode][quant_mode]; + high_value1[i] = high_values1[decim_mode][quant_mode]; + low_value2[i] = low_values2[decim_mode][quant_mode]; + high_value2[i] = high_values2[decim_mode][quant_mode]; + } + else + { + low_value1[i] = 0.0f; + high_value1[i] = 1.0f; + low_value2[i] = 0.0f; + high_value2[i] = 1.0f; + } + } +} + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp b/ktx/external/astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp new file mode 100644 index 0000000..8fdf73a --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenc_weight_quant_xfer_tables.cpp @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2021 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Data tables for quantization transfer. + */ + +#include "astcenc_internal.h" + +#define _ 0 // Using _ to indicate an entry that will not be used. + +const quant_and_transfer_table quant_and_xfer_tables[12] { + // QUANT2, range 0..1 + { + {0, 64}, + {0, 1}, + {0, 64}, + {0x4000,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + 0x4000} + }, + // QUANT_3, range 0..2 + { + {0, 32, 64}, + {0, 1, 2}, + {0, 32, 64}, + {0x2000,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,0x4000,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,0x4020} + }, + // QUANT_4, range 0..3 + { + {0, 21, 43, 64}, + {0, 1, 2, 3}, + {0, 21, 43, 64}, + {0x1500,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,0x2b00,_,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,0x4015,_,_,_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,0x402b} + }, + //QUANT_5, range 0..4 + { + {0, 16, 32, 48, 64}, + {0, 1, 2, 3, 4}, + {0, 16, 32, 48, 64}, + {0x1000,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,0x2000,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,0x3010,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,0x4020,_,_,_, + _,_,_,_,_,_,_,_,_,_,_,_,0x4030} + }, + // QUANT_6, range 0..5 + { + {0, 12, 25, 39, 52, 64}, + {0, 2, 4, 5, 3, 1}, + {0, 64, 12, 52, 25, 39}, + {0x0c00,_,_,_,_,_,_,_,_,_,_,_,0x1900,_,_,_,_,_,_,_,_,_,_,_,_, + 0x270c,_,_,_,_,_,_,_,_,_,_,_,_,_,0x3419,_,_,_,_,_,_,_,_,_,_, + _,_,0x4027,_,_,_,_,_,_,_,_,_,_,_,0x4034} + }, + // QUANT_8, range 0..7 + { + {0, 9, 18, 27, 37, 46, 55, 64}, + {0, 1, 2, 3, 4, 5, 6, 7}, + {0, 9, 18, 27, 37, 46, 55, 64}, + {0x0900,_,_,_,_,_,_,_,_,0x1200,_,_,_,_,_,_,_,_,0x1b09,_,_, + _,_,_,_,_,_,0x2512,_,_,_,_,_,_,_,_,_,0x2e1b,_,_,_,_,_,_,_,_, + 0x3725,_,_,_,_,_,_,_,_,0x402e,_,_,_,_,_,_,_,_,0x4037} + }, + // QUANT_10, range 0..9 + { + {0, 7, 14, 21, 28, 36, 43, 50, 57, 64}, + {0, 2, 4, 6, 8, 9, 7, 5, 3, 1}, + {0, 64, 7, 57, 14, 50, 21, 43, 28, 36}, + {0x0700,_,_,_,_,_,_,0x0e00,_,_,_,_,_,_,0x1507,_,_,_,_,_,_, + 0x1c0e,_,_,_,_,_,_,0x2415,_,_,_,_,_,_,_,0x2b1c,_,_,_,_,_, + _,0x3224,_,_,_,_,_,_,0x392b,_,_,_,_,_,_,0x4032,_,_,_,_,_, + _,0x4039} + }, + // QUANT_12, range 0..11 + { + {0, 5, 11, 17, 23, 28, 36, 41, 47, 53, 59, 64}, + {0, 4, 8, 2, 6, 10, 11, 7, 3, 9, 5, 1}, + {0, 64, 17, 47, 5, 59, 23, 41, 11, 53, 28, 36}, + {0x0500,_,_,_,_,0x0b00,_,_,_,_,_,0x1105,_,_,_,_,_, + 0x170b,_,_,_,_,_,0x1c11,_,_,_,_,0x2417,_,_,_,_,_,_,_, + 0x291c,_,_,_,_,0x2f24,_,_,_,_,_,0x3529,_,_,_,_,_, + 0x3b2f,_,_,_,_,_,0x4035,_,_,_,_,0x403b} + }, + // QUANT_16, range 0..15 + { + {0, 4, 8, 12, 17, 21, 25, 29, 35, 39, 43, 47, 52, 56, 60, 64}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, + {0, 4, 8, 12, 17, 21, 25, 29, 35, 39, 43, 47, 52, 56, 60, 64}, + {0x0400,_,_,_,0x0800,_,_,_,0x0c04,_,_,_,0x1108,_,_,_,_, + 0x150c,_,_,_,0x1911,_,_,_,0x1d15,_,_,_,0x2319,_,_,_,_, + _,0x271d,_,_,_,0x2b23,_,_,_,0x2f27,_,_,_,0x342b,_,_,_, + _,0x382f,_,_,_,0x3c34,_,_,_,0x4038,_,_,_,0x403c} + }, + // QUANT_20, range 0..19 + { + {0, 3, 6, 9, 13, 16, 19, 23, 26, 29, 35, 38, 41, 45, 48, 51, 55, 58, 61, 64}, + {0, 4, 8, 12, 16, 2, 6, 10, 14, 18, 19, 15, 11, 7, 3, 17, 13, 9, 5, 1}, + {0, 64, 16, 48, 3, 61, 19, 45, 6, 58, 23, 41, 9, 55, 26, 38, 13, 51, 29, 35}, + {0x0300,_,_,0x0600,_,_,0x0903,_,_,0x0d06,_,_,_, + 0x1009,_,_,0x130d,_,_,0x1710,_,_,_,0x1a13,_,_, + 0x1d17,_,_,0x231a,_,_,_,_,_,0x261d,_,_,0x2923,_,_, + 0x2d26,_,_,_,0x3029,_,_,0x332d,_,_,0x3730,_,_,_, + 0x3a33,_,_,0x3d37,_,_,0x403a,_,_,0x403d} + }, + // QUANT_24, range 0..23 + { + {0, 2, 5, 8, 11, 13, 16, 19, 22, 24, 27, 30, 34, 37, 40, 42, 45, 48, 51, 53, 56, 59, 62, 64}, + {0, 8, 16, 2, 10, 18, 4, 12, 20, 6, 14, 22, 23, 15, 7, 21, 13, 5, 19, 11, 3, 17, 9, 1}, + {0, 64, 8, 56, 16, 48, 24, 40, 2, 62, 11, 53, 19, 45, 27, 37, 5, 59, 13, 51, 22, 42, 30, 34}, + {0x0200,_,0x0500,_,_,0x0802,_,_,0x0b05,_,_,0x0d08, + _,0x100b,_,_,0x130d,_,_,0x1610,_,_,0x1813,_, + 0x1b16,_,_,0x1e18,_,_,0x221b,_,_,_,0x251e,_,_, + 0x2822,_,_,0x2a25,_,0x2d28,_,_,0x302a,_,_,0x332d, + _,_,0x3530,_,0x3833,_,_,0x3b35,_,_,0x3e38,_,_, + 0x403b,_,0x403e} + }, + // QUANT_32, range 0..31 + { + {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, + {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64}, + {0x0200,_,0x0400,_,0x0602,_,0x0804,_,0x0a06,_, + 0x0c08,_,0x0e0a,_,0x100c,_,0x120e,_,0x1410,_, + 0x1612,_,0x1814,_,0x1a16,_,0x1c18,_,0x1e1a,_, + 0x221c,_,_,_,0x241e,_,0x2622,_,0x2824,_,0x2a26,_, + 0x2c28,_,0x2e2a,_,0x302c,_,0x322e,_,0x3430,_, + 0x3632,_,0x3834,_,0x3a36,_,0x3c38,_,0x3e3a,_, + 0x403c,_,0x403e} + } +}; diff --git a/ktx/external/astc-encoder/Source/astcenccli_entry.cpp b/ktx/external/astc-encoder/Source/astcenccli_entry.cpp new file mode 100644 index 0000000..c5ea173 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenccli_entry.cpp @@ -0,0 +1,316 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2020-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. +// ---------------------------------------------------------------------------- + +/** + * @brief Application entry point. + * + * This module contains the first command line entry point veneer, used to + * validate that the host extended ISA availability matches the tool build. + * It is compiled without any extended ISA support so it's guaranteed to be + * executable without any invalid instruction errors. + */ + +#include + +/** + * @brief The main veneer entry point. + * + * @param argc The number of arguments. + * @param argv The vector of arguments. + * + * @return 0 on success, non-zero otherwise. + */ +int astcenc_main_veneer( + int argc, + char **argv); + +// x86-64 builds +#if (ASTCENC_SSE > 20) || (ASTCENC_AVX > 0) || \ + (ASTCENC_POPCNT > 0) || (ASTCENC_F16C > 0) + +static bool g_init { false }; + +/** Does this CPU support SSE 4.1? Set to -1 if not yet initialized. */ +static bool g_cpu_has_sse41 { false }; + +/** Does this CPU support AVX2? Set to -1 if not yet initialized. */ +static bool g_cpu_has_avx2 { false }; + +/** Does this CPU support POPCNT? Set to -1 if not yet initialized. */ +static bool g_cpu_has_popcnt { false }; + +/** Does this CPU support F16C? Set to -1 if not yet initialized. */ +static bool g_cpu_has_f16c { false }; + +/* ============================================================================ + Platform code for Visual Studio +============================================================================ */ +#if !defined(__clang__) && defined(_MSC_VER) +#define WIN32_LEAN_AND_MEAN +#include +#include + +/** + * @brief Detect platform CPU ISA support and update global trackers. + */ +static void detect_cpu_isa() +{ + int data[4]; + + __cpuid(data, 0); + int num_id = data[0]; + + if (num_id >= 1) + { + __cpuidex(data, 1, 0); + // SSE41 = Bank 1, ECX, bit 19 + g_cpu_has_sse41 = data[2] & (1 << 19) ? true : false; + // POPCNT = Bank 1, ECX, bit 23 + g_cpu_has_popcnt = data[2] & (1 << 23) ? true : false; + // F16C = Bank 1, ECX, bit 29 + g_cpu_has_f16c = data[2] & (1 << 29) ? true : false; + } + + if (num_id >= 7) + { + __cpuidex(data, 7, 0); + // AVX2 = Bank 7, EBX, bit 5 + g_cpu_has_avx2 = data[1] & (1 << 5) ? true : false; + } + + // Ensure state bits are updated before init flag is updated + MemoryBarrier(); + g_init = true; +} + +/* ============================================================================ + Platform code for GCC and Clang +============================================================================ */ +#else +#include + +/** + * @brief Detect platform CPU ISA support and update global trackers. + */ +static void detect_cpu_isa() +{ + unsigned int data[4]; + + if (__get_cpuid_count(1, 0, &data[0], &data[1], &data[2], &data[3])) + { + // SSE41 = Bank 1, ECX, bit 19 + g_cpu_has_sse41 = data[2] & (1 << 19) ? true : false; + // POPCNT = Bank 1, ECX, bit 23 + g_cpu_has_popcnt = data[2] & (1 << 23) ? true : false; + // F16C = Bank 1, ECX, bit 29 + g_cpu_has_f16c = data[2] & (1 << 29) ? true : false; + } + + g_cpu_has_avx2 = 0; + if (__get_cpuid_count(7, 0, &data[0], &data[1], &data[2], &data[3])) + { + // AVX2 = Bank 7, EBX, bit 5 + g_cpu_has_avx2 = data[1] & (1 << 5) ? true : false; + } + + // Ensure state bits are updated before init flag is updated + __sync_synchronize(); + g_init = true; +} +#endif + +#if ASTCENC_POPCNT > 0 +/** + * @brief Run-time detection if the host CPU supports the POPCNT extension. + * + * @return @c true if supported, @c false if not. + */ +static bool cpu_supports_popcnt() +{ + if (!g_init) + { + detect_cpu_isa(); + } + + return g_cpu_has_popcnt; +} +#endif + +#if ASTCENC_F16C > 0 +/** + * @brief Run-time detection if the host CPU supports F16C extension. + * + * @return @c true if supported, @c false if not. + */ +static bool cpu_supports_f16c() +{ + if (!g_init) + { + detect_cpu_isa(); + } + + return g_cpu_has_f16c; +} +#endif + +#if ASTCENC_SSE >= 41 +/** + * @brief Run-time detection if the host CPU supports SSE 4.1 extension. + * + * @return @c true if supported, @c false if not. + */ +static bool cpu_supports_sse41() +{ + if (!g_init) + { + detect_cpu_isa(); + } + + return g_cpu_has_sse41; +} +#endif + +#if ASTCENC_AVX >= 2 +/** + * @brief Run-time detection if the host CPU supports AVX 2 extension. + * + * @return @c true if supported, @c false if not. + */ +static bool cpu_supports_avx2() +{ + if (!g_init) + { + detect_cpu_isa(); + } + + return g_cpu_has_avx2; +} +#endif + +/** + * @brief Print a string to stderr. + */ +static inline void print_error( + const char* format +) { + fprintf(stderr, "%s", format); +} + +/** + * @brief Validate CPU ISA support meets the requirements of this build of the library. + * + * Each library build is statically compiled for a particular set of CPU ISA features, such as the + * SIMD support or other ISA extensions such as POPCNT. This function checks that the host CPU + * actually supports everything this build needs. + * + * @return Return @c true if validated, @c false otherwise. + */ +static bool validate_cpu_isa() +{ + #if ASTCENC_AVX >= 2 + if (!cpu_supports_avx2()) + { + print_error("ERROR: Host does not support AVX2 ISA extension\n"); + return false; + } + #endif + + #if ASTCENC_F16C >= 1 + if (!cpu_supports_f16c()) + { + print_error("ERROR: Host does not support F16C ISA extension\n"); + return false; + } + #endif + + #if ASTCENC_SSE >= 41 + if (!cpu_supports_sse41()) + { + print_error("ERROR: Host does not support SSE4.1 ISA extension\n"); + return false; + } + #endif + + #if ASTCENC_POPCNT >= 1 + if (!cpu_supports_popcnt()) + { + print_error("ERROR: Host does not support POPCNT ISA extension\n"); + return false; + } + #endif + + return true; +} + +// Validate Arm SVE availability +#elif ASTCENC_SVE != 0 + +#include +static bool cpu_supports_sve() +{ + long hwcaps = getauxval(AT_HWCAP); + return (hwcaps & HWCAP_SVE) != 0; +} + +/** + * @brief Print a string to stderr. + */ +static inline void print_error( + const char* format +) { + fprintf(stderr, "%s", format); +} + +/** + * @brief Validate that SVE is supported. + * + * Note that this function checks that SVE is supported, but because it + * runs in the veneer which is compiled without SVE support, we cannot + * check the SVE width is correct. This is checked later. + */ +static bool validate_cpu_isa() +{ + if (!cpu_supports_sve()) + { + print_error("ERROR: Host does not support SVE ISA extension\n"); + return false; + } + + return true; +} + +#else + +// Fallback for cases with no dynamic ISA availability +static bool validate_cpu_isa() +{ + return true; +} + +#endif + +int main( + int argc, + char **argv +) { + if (!validate_cpu_isa()) + { + return 1; + } + + return astcenc_main_veneer(argc, argv); +} diff --git a/ktx/external/astc-encoder/Source/astcenccli_entry2.cpp b/ktx/external/astc-encoder/Source/astcenccli_entry2.cpp new file mode 100644 index 0000000..2434a69 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenccli_entry2.cpp @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Application entry point second veneer. + * + * This module contains the second command line entry point veneer, used to + * validate that Arm SVE vector width matches the tool build. When used, it is + * compiled with SVE ISA support but without any vector legnth override, so it + * will see the native SVE vector length exposed to the application. + */ + +#include + +#if ASTCENC_SVE != 0 + #include +#endif + +/** + * @brief The main entry point. + * + * @param argc The number of arguments. + * @param argv The vector of arguments. + * + * @return 0 on success, non-zero otherwise. + */ +int astcenc_main( + int argc, + char **argv); + +/** + * @brief Print a formatted string to stderr. + */ +template +static inline void print_error( + const char* format, + _Args...args +) { + fprintf(stderr, format, args...); +} + +int astcenc_main_veneer( + int argc, + char **argv +) { + // We don't need this check for 128-bit SVE, because that is compiled as + // VLA code, using predicate masks in the augmented NEON. +#if ASTCENC_SVE > 4 + // svcntw() returns compile-time length if used with -msve-vector-bits + if (svcntw() != ASTCENC_SVE) + { + int bits = ASTCENC_SVE * 32; + print_error("ERROR: Host SVE support is not a %u-bit implementation\n", bits); + return 1; + } +#endif + + return astcenc_main(argc, argv); +} diff --git a/ktx/external/astc-encoder/Source/astcenccli_error_metrics.cpp b/ktx/external/astc-encoder/Source/astcenccli_error_metrics.cpp new file mode 100644 index 0000000..4e01a9e --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenccli_error_metrics.cpp @@ -0,0 +1,413 @@ +// 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for computing image error metrics. + */ + +#include +#include + +#include "astcenccli_internal.h" + +/** + * @brief An accumulator for errors. + */ +class error_accum4 +{ +public: + /** @brief The running sum. */ + double sum_r { 0.0 }; + double sum_g { 0.0 }; + double sum_b { 0.0 }; + double sum_a { 0.0 }; +}; + +/** + * @brief Incremental addition operator for error accumulators. + * + * @param val The accumulator to increment + * @param inc The increment to apply + * + * @return The updated accumulator + */ +static error_accum4& operator+=( + error_accum4 &val, + vfloat4 inc +) { + val.sum_r += static_cast(inc.lane<0>()); + val.sum_g += static_cast(inc.lane<1>()); + val.sum_b += static_cast(inc.lane<2>()); + val.sum_a += static_cast(inc.lane<3>()); + return val; +} + +/** + * @brief mPSNR tone-mapping operator for HDR images. + * + * @param val The color value to tone map + * @param fstop The exposure fstop; should be in range [-125, 125] + * + * @return The mapped color value in [0.0f, 255.0f] range + */ +static float mpsnr_operator( + float val, + int fstop +) { + if32 p; + p.u = 0x3f800000 + (fstop << 23); // 0x3f800000 is 1.0f + val *= p.f; + val = powf(val, (1.0f / 2.2f)); + val *= 255.0f; + + return astc::clamp(val, 0.0f, 255.0f); +} + +/** + * @brief mPSNR difference between two values. + * + * Differences are given as "val1 - val2". + * + * @param val1 The first color value + * @param val2 The second color value + * @param fstop_lo The low exposure fstop; should be in range [-125, 125] + * @param fstop_hi The high exposure fstop; should be in range [-125, 125] + * + * @return The summed mPSNR difference across all active fstop levels + */ +static float mpsnr_sumdiff( + float val1, + float val2, + int fstop_lo, + int fstop_hi +) { + float summa = 0.0f; + for (int i = fstop_lo; i <= fstop_hi; i++) + { + float mval1 = mpsnr_operator(val1, i); + float mval2 = mpsnr_operator(val2, i); + float mdiff = mval1 - mval2; + summa += mdiff * mdiff; + } + return summa; +} + +/* See header for documentation */ +void compute_error_metrics( + bool compute_hdr_metrics, + bool compute_normal_metrics, + int input_components, + const astcenc_image* img1, + const astcenc_image* img2, + int fstop_lo, + int fstop_hi +) { + static const int componentmasks[5] { 0x00, 0x07, 0x0C, 0x07, 0x0F }; + int componentmask = componentmasks[input_components]; + + error_accum4 errorsum; + error_accum4 alpha_scaled_errorsum; + error_accum4 log_errorsum; + error_accum4 mpsnr_errorsum; + double mean_angular_errorsum = 0.0; + double worst_angular_errorsum = 0.0; + + unsigned int dim_x = astc::min(img1->dim_x, img2->dim_x); + unsigned int dim_y = astc::min(img1->dim_y, img2->dim_y); + unsigned int dim_z = astc::min(img1->dim_z, img2->dim_z); + + if (img1->dim_x != img2->dim_x || + img1->dim_y != img2->dim_y || + img1->dim_z != img2->dim_z) + { + printf("WARNING: Only intersection of images will be compared:\n" + " Image 1: %dx%dx%d\n" + " Image 2: %dx%dx%d\n", + img1->dim_x, img1->dim_y, img1->dim_z, + img2->dim_x, img2->dim_y, img2->dim_z); + } + + double rgb_peak = 0.0; + unsigned int xsize1 = img1->dim_x; + unsigned int xsize2 = img2->dim_x; + + for (unsigned int z = 0; z < dim_z; z++) + { + for (unsigned int y = 0; y < dim_y; y++) + { + for (unsigned int x = 0; x < dim_x; x++) + { + vfloat4 color1; + vfloat4 color2; + + if (img1->data_type == ASTCENC_TYPE_U8) + { + uint8_t* data8 = static_cast(img1->data[z]); + + color1 = vfloat4( + data8[(4 * xsize1 * y) + (4 * x )], + data8[(4 * xsize1 * y) + (4 * x + 1)], + data8[(4 * xsize1 * y) + (4 * x + 2)], + data8[(4 * xsize1 * y) + (4 * x + 3)]); + + color1 = color1 / 255.0f; + } + else if (img1->data_type == ASTCENC_TYPE_F16) + { + uint16_t* data16 = static_cast(img1->data[z]); + + vint4 color1i = vint4( + data16[(4 * xsize1 * y) + (4 * x )], + data16[(4 * xsize1 * y) + (4 * x + 1)], + data16[(4 * xsize1 * y) + (4 * x + 2)], + data16[(4 * xsize1 * y) + (4 * x + 3)]); + + color1 = float16_to_float(color1i); + color1 = clamp(0, 65504.0f, color1); + } + else // if (img1->data_type == ASTCENC_TYPE_F32) + { + assert(img1->data_type == ASTCENC_TYPE_F32); + float* data32 = static_cast(img1->data[z]); + + color1 = vfloat4( + data32[(4 * xsize1 * y) + (4 * x )], + data32[(4 * xsize1 * y) + (4 * x + 1)], + data32[(4 * xsize1 * y) + (4 * x + 2)], + data32[(4 * xsize1 * y) + (4 * x + 3)]); + + color1 = clamp(0, 65504.0f, color1); + } + + if (img2->data_type == ASTCENC_TYPE_U8) + { + uint8_t* data8 = static_cast(img2->data[z]); + + color2 = vfloat4( + data8[(4 * xsize2 * y) + (4 * x )], + data8[(4 * xsize2 * y) + (4 * x + 1)], + data8[(4 * xsize2 * y) + (4 * x + 2)], + data8[(4 * xsize2 * y) + (4 * x + 3)]); + + color2 = color2 / 255.0f; + } + else if (img2->data_type == ASTCENC_TYPE_F16) + { + uint16_t* data16 = static_cast(img2->data[z]); + + vint4 color2i = vint4( + data16[(4 * xsize2 * y) + (4 * x )], + data16[(4 * xsize2 * y) + (4 * x + 1)], + data16[(4 * xsize2 * y) + (4 * x + 2)], + data16[(4 * xsize2 * y) + (4 * x + 3)]); + + color2 = float16_to_float(color2i); + color2 = clamp(0, 65504.0f, color2); + } + else // if (img2->data_type == ASTCENC_TYPE_F32) + { + assert(img2->data_type == ASTCENC_TYPE_F32); + float* data32 = static_cast(img2->data[z]); + + color2 = vfloat4( + data32[(4 * xsize2 * y) + (4 * x )], + data32[(4 * xsize2 * y) + (4 * x + 1)], + data32[(4 * xsize2 * y) + (4 * x + 2)], + data32[(4 * xsize2 * y) + (4 * x + 3)]); + + color2 = clamp(0, 65504.0f, color2); + } + + rgb_peak = astc::max(static_cast(color1.lane<0>()), + static_cast(color1.lane<1>()), + static_cast(color1.lane<2>()), + rgb_peak); + + vfloat4 diffcolor = color1 - color2; + vfloat4 diffcolor_sq = diffcolor * diffcolor; + errorsum += diffcolor_sq; + + vfloat4 alpha_scaled_diffcolor = vfloat4( + diffcolor.lane<0>() * color1.lane<3>(), + diffcolor.lane<1>() * color1.lane<3>(), + diffcolor.lane<2>() * color1.lane<3>(), + diffcolor.lane<3>()); + + vfloat4 alpha_scaled_diffcolor_sq = alpha_scaled_diffcolor * alpha_scaled_diffcolor; + alpha_scaled_errorsum += alpha_scaled_diffcolor_sq; + + if (compute_hdr_metrics) + { + vfloat4 log_input_color1 = log2(color1); + vfloat4 log_input_color2 = log2(color2); + + vfloat4 log_diffcolor = log_input_color1 - log_input_color2; + + log_errorsum += log_diffcolor * log_diffcolor; + + vfloat4 mpsnr_error = vfloat4( + mpsnr_sumdiff(color1.lane<0>(), color2.lane<0>(), fstop_lo, fstop_hi), + mpsnr_sumdiff(color1.lane<1>(), color2.lane<1>(), fstop_lo, fstop_hi), + mpsnr_sumdiff(color1.lane<2>(), color2.lane<2>(), fstop_lo, fstop_hi), + mpsnr_sumdiff(color1.lane<3>(), color2.lane<3>(), fstop_lo, fstop_hi)); + + mpsnr_errorsum += mpsnr_error; + } + + if (compute_normal_metrics) + { + // Decode the normal vector + vfloat4 normal1 = (color1 - 0.5f) * 2.0f; + normal1 = normalize_safe(normal1.swz<0, 1, 2>(), unit3()); + + vfloat4 normal2 = (color2 - 0.5f) * 2.0f; + normal2 = normalize_safe(normal2.swz<0, 1, 2>(), unit3()); + + // Float error can push this outside of valid range for acos, so clamp to avoid NaN issues + float normal_cos = clamp(-1.0f, 1.0f, dot3(normal1, normal2)).lane<0>(); + float rad_to_degrees = 180.0f / astc::PI; + double error_degrees = std::acos(static_cast(normal_cos)) * static_cast(rad_to_degrees); + + mean_angular_errorsum += error_degrees / (dim_x * dim_y * dim_z); + worst_angular_errorsum = astc::max(worst_angular_errorsum, error_degrees); + } + } + } + } + + double pixels = static_cast(dim_x * dim_y * dim_z); + double samples = 0.0; + + double num = 0.0; + double alpha_num = 0.0; + double log_num = 0.0; + double mpsnr_num = 0.0; + + if (componentmask & 1) + { + num += errorsum.sum_r; + alpha_num += alpha_scaled_errorsum.sum_r; + log_num += log_errorsum.sum_r; + mpsnr_num += mpsnr_errorsum.sum_r; + samples += pixels; + } + + if (componentmask & 2) + { + num += errorsum.sum_g; + alpha_num += alpha_scaled_errorsum.sum_g; + log_num += log_errorsum.sum_g; + mpsnr_num += mpsnr_errorsum.sum_g; + samples += pixels; + } + + if (componentmask & 4) + { + num += errorsum.sum_b; + alpha_num += alpha_scaled_errorsum.sum_b; + log_num += log_errorsum.sum_b; + mpsnr_num += mpsnr_errorsum.sum_b; + samples += pixels; + } + + if (componentmask & 8) + { + num += errorsum.sum_a; + alpha_num += alpha_scaled_errorsum.sum_a; + samples += pixels; + } + + double denom = samples; + double stopcount = static_cast(fstop_hi - fstop_lo + 1); + double mpsnr_denom = pixels * 3.0 * stopcount * 255.0 * 255.0; + + double psnr; + if (num == 0.0) + { + psnr = 999.0; + } + else + { + psnr = 10.0 * log10(denom / num); + } + + double rgb_psnr = psnr; + + printf("Quality metrics\n"); + printf("===============\n\n"); + + if (componentmask & 8) + { + printf(" PSNR (LDR-RGBA): %9.4f dB\n", psnr); + + double alpha_psnr; + if (alpha_num == 0.0) + { + alpha_psnr = 999.0; + } + else + { + alpha_psnr = 10.0 * log10(denom / alpha_num); + } + printf(" Alpha-weighted PSNR: %9.4f dB\n", alpha_psnr); + + double rgb_num = errorsum.sum_r + errorsum.sum_g + errorsum.sum_b; + if (rgb_num == 0.0) + { + rgb_psnr = 999.0; + } + else + { + rgb_psnr = 10.0 * log10(pixels * 3.0 / rgb_num); + } + printf(" PSNR (LDR-RGB): %9.4f dB\n", rgb_psnr); + } + else + { + printf(" PSNR (LDR-RGB): %9.4f dB\n", psnr); + } + + if (compute_hdr_metrics) + { + printf(" PSNR (RGB norm to peak): %9.4f dB (peak %f)\n", + rgb_psnr + 20.0 * log10(rgb_peak), rgb_peak); + + double mpsnr; + if (mpsnr_num == 0.0) + { + mpsnr = 999.0; + } + else + { + mpsnr = 10.0 * log10(mpsnr_denom / mpsnr_num); + } + + printf(" mPSNR (RGB): %9.4f dB (fstops %+d to %+d)\n", + mpsnr, fstop_lo, fstop_hi); + + double logrmse = sqrt(log_num / pixels); + printf(" LogRMSE (RGB): %9.4f\n", logrmse); + } + + if (compute_normal_metrics) + { + printf(" Mean Angular Error: %9.4f degrees\n", mean_angular_errorsum); + printf(" Worst Angular Error: %9.4f degrees\n", worst_angular_errorsum); + } + + printf("\n"); +} diff --git a/ktx/external/astc-encoder/Source/astcenccli_image.cpp b/ktx/external/astc-encoder/Source/astcenccli_image.cpp new file mode 100644 index 0000000..237da60 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenccli_image.cpp @@ -0,0 +1,377 @@ +// 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for creating in-memory ASTC image structures. + */ + +#include +#include + +#include "astcenccli_internal.h" + +/* See header for documentation. */ +astcenc_image *alloc_image( + unsigned int bitness, + unsigned int dim_x, + unsigned int dim_y, + unsigned int dim_z +) { + astcenc_image *img = new astcenc_image; + img->dim_x = dim_x; + img->dim_y = dim_y; + img->dim_z = dim_z; + + void** data = new void*[dim_z]; + img->data = data; + + if (bitness == 8) + { + img->data_type = ASTCENC_TYPE_U8; + for (unsigned int z = 0; z < dim_z; z++) + { + data[z] = new uint8_t[dim_x * dim_y * 4]; + } + } + else if (bitness == 16) + { + img->data_type = ASTCENC_TYPE_F16; + for (unsigned int z = 0; z < dim_z; z++) + { + data[z] = new uint16_t[dim_x * dim_y * 4]; + } + } + else // if (bitness == 32) + { + assert(bitness == 32); + img->data_type = ASTCENC_TYPE_F32; + for (unsigned int z = 0; z < dim_z; z++) + { + data[z] = new float[dim_x * dim_y * 4]; + } + } + + return img; +} + +/* See header for documentation. */ +void free_image(astcenc_image * img) +{ + if (img == nullptr) + { + return; + } + + for (unsigned int z = 0; z < img->dim_z; z++) + { + delete[] reinterpret_cast(img->data[z]); + } + + delete[] img->data; + delete img; +} + +/* See header for documentation. */ +int determine_image_components(const astcenc_image * img) +{ + unsigned int dim_x = img->dim_x; + unsigned int dim_y = img->dim_y; + unsigned int dim_z = img->dim_z; + + // Scan through the image data to determine how many color components the image has + bool is_luma = true; + bool has_alpha = false; + + if (img->data_type == ASTCENC_TYPE_U8) + { + for (unsigned int z = 0; z < dim_z; z++) + { + uint8_t* data8 = static_cast(img->data[z]); + + for (unsigned int y = 0; y < dim_y; y++) + { + for (unsigned int x = 0; x < dim_x; x++) + { + int r = data8[(4 * dim_x * y) + (4 * x )]; + int g = data8[(4 * dim_x * y) + (4 * x + 1)]; + int b = data8[(4 * dim_x * y) + (4 * x + 2)]; + int a = data8[(4 * dim_x * y) + (4 * x + 3)]; + + is_luma = is_luma && (r == g) && (r == b); + has_alpha = has_alpha || (a != 0xFF); + } + } + } + } + else if (img->data_type == ASTCENC_TYPE_F16) + { + for (unsigned int z = 0; z < dim_z; z++) + { + uint16_t* data16 = static_cast(img->data[z]); + + for (unsigned int y = 0; y < dim_y; y++) + { + for (unsigned int x = 0; x < dim_x; x++) + { + int r = data16[(4 * dim_x * y) + (4 * x )]; + int g = data16[(4 * dim_x * y) + (4 * x + 1)]; + int b = data16[(4 * dim_x * y) + (4 * x + 2)]; + int a = data16[(4 * dim_x * y) + (4 * x + 3)]; + + is_luma = is_luma && (r == g) && (r == b); + has_alpha = has_alpha || ((a ^ 0xC3FF) != 0xFFFF); + // a ^ 0xC3FF returns FFFF if and only if the input is 1.0 + } + } + } + } + else // if (img->data_type == ASTCENC_TYPE_F32) + { + assert(img->data_type == ASTCENC_TYPE_F32); + + for (unsigned int z = 0; z < dim_z; z++) + { + float* data32 = static_cast(img->data[z]); + + for (unsigned int y = 0; y < dim_y; y++) + { + for (unsigned int x = 0; x < dim_x; x++) + { + float r = data32[(4 * dim_x * y) + (4 * x )]; + float g = data32[(4 * dim_x * y) + (4 * x + 1)]; + float b = data32[(4 * dim_x * y) + (4 * x + 2)]; + float a = data32[(4 * dim_x * y) + (4 * x + 3)]; + + is_luma = is_luma && (r == g) && (r == b); + has_alpha = has_alpha || (a != 1.0f); + } + } + } + } + + int image_components = 1 + (is_luma == 0 ? 2 : 0) + (has_alpha ? 1 : 0); + return image_components; +} + +/* See header for documentation. */ +astcenc_image* astc_img_from_floatx4_array( + const float* data, + unsigned int dim_x, + unsigned int dim_y, + bool y_flip +) { + astcenc_image* img = alloc_image(16, dim_x, dim_y, 1); + + for (unsigned int y = 0; y < dim_y; y++) + { + uint16_t* data16 = static_cast(img->data[0]); + unsigned int y_src = y_flip ? (dim_y - y - 1) : y; + const float* src = data + 4 * dim_x * y_src; + + for (unsigned int x = 0; x < dim_x; x++) + { + vint4 colorf16 = float_to_float16(vfloat4( + src[4 * x ], + src[4 * x + 1], + src[4 * x + 2], + src[4 * x + 3] + )); + + data16[(4 * dim_x * y) + (4 * x )] = static_cast(colorf16.lane<0>()); + data16[(4 * dim_x * y) + (4 * x + 1)] = static_cast(colorf16.lane<1>()); + data16[(4 * dim_x * y) + (4 * x + 2)] = static_cast(colorf16.lane<2>()); + data16[(4 * dim_x * y) + (4 * x + 3)] = static_cast(colorf16.lane<3>()); + } + } + + return img; +} + +/* See header for documentation. */ +astcenc_image* astc_img_from_unorm8x4_array( + const uint8_t* data, + unsigned int dim_x, + unsigned int dim_y, + bool y_flip +) { + astcenc_image* img = alloc_image(8, dim_x, dim_y, 1); + + for (unsigned int y = 0; y < dim_y; y++) + { + uint8_t* data8 = static_cast(img->data[0]); + unsigned int y_src = y_flip ? (dim_y - y - 1) : y; + const uint8_t* src = data + 4 * dim_x * y_src; + + for (unsigned int x = 0; x < dim_x; x++) + { + data8[(4 * dim_x * y) + (4 * x )] = src[4 * x ]; + data8[(4 * dim_x * y) + (4 * x + 1)] = src[4 * x + 1]; + data8[(4 * dim_x * y) + (4 * x + 2)] = src[4 * x + 2]; + data8[(4 * dim_x * y) + (4 * x + 3)] = src[4 * x + 3]; + } + } + + return img; +} + +// initialize a flattened array of float values from an ASTC codec image +// The returned array is allocated with new[] and must be deleted with delete[]. +/* See header for documentation. */ +float* floatx4_array_from_astc_img( + const astcenc_image* img, + bool y_flip, + unsigned int z_index +) { + unsigned int dim_x = img->dim_x; + unsigned int dim_y = img->dim_y; + float *buf = new float[4 * dim_x * dim_y]; + + assert(z_index < img->dim_z); + + if (img->data_type == ASTCENC_TYPE_U8) + { + uint8_t* data8 = static_cast(img->data[z_index]); + for (unsigned int y = 0; y < dim_y; y++) + { + unsigned int ymod = y_flip ? dim_y - y - 1 : y; + float* dst = buf + y * dim_x * 4; + + for (unsigned int x = 0; x < dim_x; x++) + { + dst[4 * x ] = data8[(4 * dim_x * ymod) + (4 * x )] * (1.0f / 255.0f); + dst[4 * x + 1] = data8[(4 * dim_x * ymod) + (4 * x + 1)] * (1.0f / 255.0f); + dst[4 * x + 2] = data8[(4 * dim_x * ymod) + (4 * x + 2)] * (1.0f / 255.0f); + dst[4 * x + 3] = data8[(4 * dim_x * ymod) + (4 * x + 3)] * (1.0f / 255.0f); + } + } + } + else if (img->data_type == ASTCENC_TYPE_F16) + { + uint16_t* data16 = static_cast(img->data[z_index]); + for (unsigned int y = 0; y < dim_y; y++) + { + unsigned int ymod = y_flip ? dim_y - y - 1 : y; + float *dst = buf + y * dim_x * 4; + + for (unsigned int x = 0; x < dim_x; x++) + { + vint4 colori( + data16[(4 * dim_x * ymod) + (4 * x )], + data16[(4 * dim_x * ymod) + (4 * x + 1)], + data16[(4 * dim_x * ymod) + (4 * x + 2)], + data16[(4 * dim_x * ymod) + (4 * x + 3)] + ); + + vfloat4 color = float16_to_float(colori); + store(color, dst + 4 * x); + } + } + } + else // if (img->data_type == ASTCENC_TYPE_F32) + { + assert(img->data_type == ASTCENC_TYPE_F32); + float* data32 = static_cast(img->data[z_index]); + for (unsigned int y = 0; y < dim_y; y++) + { + unsigned int ymod = y_flip ? dim_y - y - 1 : y; + float *dst = buf + y * dim_x * 4; + + for (unsigned int x = 0; x < dim_x; x++) + { + dst[4 * x ] = data32[(4 * dim_x * ymod) + (4 * x )]; + dst[4 * x + 1] = data32[(4 * dim_x * ymod) + (4 * x + 1)]; + dst[4 * x + 2] = data32[(4 * dim_x * ymod) + (4 * x + 2)]; + dst[4 * x + 3] = data32[(4 * dim_x * ymod) + (4 * x + 3)]; + } + } + } + + return buf; +} + +/* See header for documentation. */ +uint8_t* unorm8x4_array_from_astc_img( + const astcenc_image* img, + bool y_flip +) { + unsigned int dim_x = img->dim_x; + unsigned int dim_y = img->dim_y; + uint8_t* buf = new uint8_t[4 * dim_x * dim_y]; + + if (img->data_type == ASTCENC_TYPE_U8) + { + uint8_t* data8 = static_cast(img->data[0]); + for (unsigned int y = 0; y < dim_y; y++) + { + unsigned int ymod = y_flip ? dim_y - y - 1 : y; + uint8_t* dst = buf + y * dim_x * 4; + + for (unsigned int x = 0; x < dim_x; x++) + { + dst[4 * x ] = data8[(4 * dim_x * ymod) + (4 * x )]; + dst[4 * x + 1] = data8[(4 * dim_x * ymod) + (4 * x + 1)]; + dst[4 * x + 2] = data8[(4 * dim_x * ymod) + (4 * x + 2)]; + dst[4 * x + 3] = data8[(4 * dim_x * ymod) + (4 * x + 3)]; + } + } + } + else if (img->data_type == ASTCENC_TYPE_F16) + { + uint16_t* data16 = static_cast(img->data[0]); + for (unsigned int y = 0; y < dim_y; y++) + { + unsigned int ymod = y_flip ? dim_y - y - 1 : y; + uint8_t* dst = buf + y * dim_x * 4; + + for (unsigned int x = 0; x < dim_x; x++) + { + vint4 colori( + data16[(4 * dim_x * ymod) + (4 * x )], + data16[(4 * dim_x * ymod) + (4 * x + 1)], + data16[(4 * dim_x * ymod) + (4 * x + 2)], + data16[(4 * dim_x * ymod) + (4 * x + 3)] + ); + + vfloat4 color = float16_to_float(colori); + color = clamp(0.0f, 1.0f, color) * 255.0f; + + colori = float_to_int_rtn(color); + pack_and_store_low_bytes(colori, dst + 4 * x); + } + } + } + else // if (img->data_type == ASTCENC_TYPE_F32) + { + assert(img->data_type == ASTCENC_TYPE_F32); + float* data32 = static_cast(img->data[0]); + for (unsigned int y = 0; y < dim_y; y++) + { + unsigned int ymod = y_flip ? dim_y - y - 1 : y; + uint8_t* dst = buf + y * dim_x * 4; + + for (unsigned int x = 0; x < dim_x; x++) + { + dst[4 * x ] = static_cast(astc::flt2int_rtn(astc::clamp1f(data32[(4 * dim_x * ymod) + (4 * x )]) * 255.0f)); + dst[4 * x + 1] = static_cast(astc::flt2int_rtn(astc::clamp1f(data32[(4 * dim_x * ymod) + (4 * x + 1)]) * 255.0f)); + dst[4 * x + 2] = static_cast(astc::flt2int_rtn(astc::clamp1f(data32[(4 * dim_x * ymod) + (4 * x + 2)]) * 255.0f)); + dst[4 * x + 3] = static_cast(astc::flt2int_rtn(astc::clamp1f(data32[(4 * dim_x * ymod) + (4 * x + 3)]) * 255.0f)); + } + } + } + + return buf; +} diff --git a/ktx/external/astc-encoder/Source/astcenccli_image_external.cpp b/ktx/external/astc-encoder/Source/astcenccli_image_external.cpp new file mode 100644 index 0000000..e41b9ab --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenccli_image_external.cpp @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2023 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for building the implementation of stb_image and tinyexr. + */ + +#include +#include +#include +#include + +#include "astcenccli_internal.h" + +// Configure the STB image write library build. +#define STB_IMAGE_IMPLEMENTATION +#define STB_IMAGE_WRITE_IMPLEMENTATION +#define STBI_NO_GIF +#define STBI_NO_PIC +#define STBI_NO_PNM +#define STBI_NO_PNG +#define STBI_NO_PSD + +// Configure the TinyEXR library build. +#define TINYEXR_IMPLEMENTATION + +// Configure the Wuffs library build. +#define WUFFS_IMPLEMENTATION +#define WUFFS_CONFIG__MODULES +#define WUFFS_CONFIG__MODULE__ADLER32 +#define WUFFS_CONFIG__MODULE__BASE +#define WUFFS_CONFIG__MODULE__CRC32 +#define WUFFS_CONFIG__MODULE__DEFLATE +#define WUFFS_CONFIG__MODULE__PNG +#define WUFFS_CONFIG__MODULE__ZLIB +#include "wuffs-v0.3.c" + +// For both libraries force asserts (which can be triggered by corrupt input +// images) to be handled at runtime in release builds to avoid security issues. +#define STBI_ASSERT(x) astcenc_runtime_assert(x) +#define TEXR_ASSERT(x) astcenc_runtime_assert(x) + +/** + * @brief Trap image load failures and convert into a runtime error. + */ +static void astcenc_runtime_assert(bool condition) +{ + if (!condition) + { + print_error("ERROR: Corrupt input image\n"); + exit(1); + } +} + +#include "ThirdParty/stb_image.h" +#include "ThirdParty/stb_image_write.h" +#include "ThirdParty/tinyexr.h" + +/** + * @brief Load an image using Wuffs to provide the loader. + * + * @param filename The name of the file to load. + * @param y_flip Should the image be vertically flipped? + * @param[out] is_hdr Is this an HDR image load? + * @param[out] component_count The number of components in the data. + * + * @return The loaded image data in a canonical 4 channel format, or @c nullptr on error. + */ +astcenc_image* load_png_with_wuffs( + const char* filename, + bool y_flip, + bool& is_hdr, + unsigned int& component_count +) { + is_hdr = false; + component_count = 4; + + std::ifstream file(filename, std::ios::binary | std::ios::ate); + if (!file) + { + print_error("ERROR: Failed to load image %s (can't fopen)\n", filename); + return nullptr; + } + + std::streamsize size = file.tellg(); + file.seekg(0, std::ios::beg); + + std::vector buffer(size); + file.read((char*)buffer.data(), size); + + wuffs_png__decoder *dec = wuffs_png__decoder__alloc(); + if (!dec) + { + return nullptr; + } + + wuffs_base__image_config ic; + wuffs_base__io_buffer src = wuffs_base__ptr_u8__reader(buffer.data(), size, true); + wuffs_base__status status = wuffs_png__decoder__decode_image_config(dec, &ic, &src); + if (status.repr) + { + return nullptr; + } + + uint32_t dim_x = wuffs_base__pixel_config__width(&ic.pixcfg); + uint32_t dim_y = wuffs_base__pixel_config__height(&ic.pixcfg); + size_t num_pixels = dim_x * dim_y; + if (num_pixels > (SIZE_MAX / 4)) + { + return nullptr; + } + + // Override the image's native pixel format to be RGBA_NONPREMUL + wuffs_base__pixel_config__set( + &ic.pixcfg, + WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL, + WUFFS_BASE__PIXEL_SUBSAMPLING__NONE, + dim_x, dim_y); + + // Configure the work buffer + size_t workbuf_len = wuffs_png__decoder__workbuf_len(dec).max_incl; + if (workbuf_len > SIZE_MAX) + { + return nullptr; + } + + wuffs_base__slice_u8 workbuf_slice = wuffs_base__make_slice_u8((uint8_t*)malloc(workbuf_len), workbuf_len); + if (!workbuf_slice.ptr) + { + return nullptr; + } + + wuffs_base__slice_u8 pixbuf_slice = wuffs_base__make_slice_u8((uint8_t*)malloc(num_pixels * 4), num_pixels * 4); + if (!pixbuf_slice.ptr) + { + return nullptr; + } + + wuffs_base__pixel_buffer pb; + status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg, pixbuf_slice); + if (status.repr) + { + return nullptr; + } + + // Decode the pixels + status = wuffs_png__decoder__decode_frame(dec, &pb, &src, WUFFS_BASE__PIXEL_BLEND__SRC, workbuf_slice, NULL); + if (status.repr) + { + return nullptr; + } + + astcenc_image* img = astc_img_from_unorm8x4_array(pixbuf_slice.ptr, dim_x, dim_y, y_flip); + + free(pixbuf_slice.ptr); + free(workbuf_slice.ptr); + free(dec); + + return img; +} diff --git a/ktx/external/astc-encoder/Source/astcenccli_image_load_store.cpp b/ktx/external/astc-encoder/Source/astcenccli_image_load_store.cpp new file mode 100644 index 0000000..fff7fb3 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenccli_image_load_store.cpp @@ -0,0 +1,2601 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2025 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for loading/storing uncompressed and compressed images. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "astcenccli_internal.h" + +#include "ThirdParty/stb_image.h" +#include "ThirdParty/stb_image_write.h" +#include "ThirdParty/tinyexr.h" + +/** + * @brief Reverse the bytes in a uint32_t value. + */ +static uint32_t reverse_bytes_u32( + uint32_t val +) { + return ((val >> 24) & 0x000000FF) | + ((val >> 8) & 0x0000FF00) | + ((val << 8) & 0x00FF0000) | + ((val << 24) & 0xFF000000); +} + +/** + * @brief Determine the output file name to use for a sliced image write. + * + * @param img The source data for the image. + * @param filename The base name of the file to save. + * @param index The slice index to write. + * + * @return The file name to use when saving the file. + */ +static std::string get_output_filename( + const astcenc_image* img, + const char* filename, + unsigned int index +) { + if (img->dim_z <= 1) + { + return filename; + } + + std::string fnmod(filename); + std::string fnext = fnmod.substr(fnmod.find_last_of(".")); + + // Remove the extension + fnmod = fnmod.erase(fnmod.length() - fnext.size()); + + // Insert the file index into the base name, then append the extension + std::stringstream ss; + ss << fnmod << "_" << std::setw(3) << std::setfill('0') << index << fnext; + return ss.str(); +} + +/* ============================================================================ + Image load and store through the stb_image and tinyexr libraries +============================================================================ */ + +/** + * @brief Load a .exr image using TinyExr to provide the loader. + * + * @param filename The name of the file to load. + * @param y_flip Should the image be vertically flipped? + * @param[out] is_hdr Is this an HDR image load? Always @c true for this function. + * @param[out] component_count The number of components in the data. + * + * @return The loaded image data in a canonical 4 channel format. + */ +static astcenc_image* load_image_with_tinyexr( + const char* filename, + bool y_flip, + bool& is_hdr, + unsigned int& component_count +) { + int dim_x, dim_y; + float* image; + const char* err; + + int load_res = LoadEXR(&image, &dim_x, &dim_y, filename, &err); + if (load_res != TINYEXR_SUCCESS) + { + print_error("ERROR: Failed to load image %s (%s)\n", filename, err); + free(reinterpret_cast(const_cast(err))); + return nullptr; + } + + astcenc_image* res_img = astc_img_from_floatx4_array(image, dim_x, dim_y, y_flip); + free(image); + + is_hdr = true; + component_count = 4; + return res_img; +} + +/** + * @brief Load an image using STBImage to provide the loader. + * + * @param filename The name of the file to load. + * @param y_flip Should the image be vertically flipped? + * @param[out] is_hdr Is this an HDR image load? + * @param[out] component_count The number of components in the data. + * + * @return The loaded image data in a canonical 4 channel format, or @c nullptr on error. + */ +static astcenc_image* load_image_with_stb( + const char* filename, + bool y_flip, + bool& is_hdr, + unsigned int& component_count +) { + int dim_x, dim_y; + + if (stbi_is_hdr(filename)) + { + float* data = stbi_loadf(filename, &dim_x, &dim_y, nullptr, STBI_rgb_alpha); + if (data) + { + astcenc_image* img = astc_img_from_floatx4_array(data, dim_x, dim_y, y_flip); + stbi_image_free(data); + is_hdr = true; + component_count = 4; + return img; + } + } + else + { + uint8_t* data = stbi_load(filename, &dim_x, &dim_y, nullptr, STBI_rgb_alpha); + if (data) + { + astcenc_image* img = astc_img_from_unorm8x4_array(data, dim_x, dim_y, y_flip); + stbi_image_free(data); + is_hdr = false; + component_count = 4; + return img; + } + } + + print_error("ERROR: Failed to load image %s (%s)\n", filename, stbi_failure_reason()); + return nullptr; +} + +/** + * @brief Save an EXR image using TinyExr to provide the store routine. + * + * @param img The source data for the image. + * @param filename The name of the file to save. + * @param y_flip Should the image be vertically flipped? + * + * @return @c true if the image saved OK, @c false on error. + */ +static bool store_exr_image_with_tinyexr( + const astcenc_image* img, + const char* filename, + int y_flip +) { + int res { 0 }; + + for (unsigned int i = 0; i < img->dim_z; i++) + { + std::string fnmod = get_output_filename(img, filename, i); + float* buf = floatx4_array_from_astc_img(img, y_flip, i); + + res = SaveEXR(buf, img->dim_x, img->dim_y, 4, 1, fnmod.c_str(), nullptr); + delete[] buf; + if (res < 0) + { + break; + } + } + + return res >= 0; +} + +/** + * @brief Save a PNG image using STBImageWrite to provide the store routine. + * + * @param img The source data for the image. + * @param filename The name of the file to save. + * @param y_flip Should the image be vertically flipped? + * + * @return @c true if the image saved OK, @c false on error. + */ +static bool store_png_image_with_stb( + const astcenc_image* img, + const char* filename, + int y_flip +) { + int res { 0 }; + + assert(img->data_type == ASTCENC_TYPE_U8); + + for (unsigned int i = 0; i < img->dim_z; i++) + { + std::string fnmod = get_output_filename(img, filename, i); + uint8_t* buf = reinterpret_cast(img->data[i]); + + stbi_flip_vertically_on_write(y_flip); + res = stbi_write_png(fnmod.c_str(), img->dim_x, img->dim_y, 4, buf, img->dim_x * 4); + if (res == 0) + { + break; + } + } + + return res != 0; +} + +/** + * @brief Save a TGA image using STBImageWrite to provide the store routine. + * + * @param img The source data for the image. + * @param filename The name of the file to save. + * @param y_flip Should the image be vertically flipped? + * + * @return @c true if the image saved OK, @c false on error. + */ +static bool store_tga_image_with_stb( + const astcenc_image* img, + const char* filename, + int y_flip +) { + int res { 0 }; + + assert(img->data_type == ASTCENC_TYPE_U8); + + for (unsigned int i = 0; i < img->dim_z; i++) + { + std::string fnmod = get_output_filename(img, filename, i); + uint8_t* buf = reinterpret_cast(img->data[i]); + + stbi_flip_vertically_on_write(y_flip); + res = stbi_write_tga(fnmod.c_str(), img->dim_x, img->dim_y, 4, buf); + if (res == 0) + { + break; + } + } + + return res != 0; +} + +/** + * @brief Save a BMP image using STBImageWrite to provide the store routine. + * + * @param img The source data for the image. + * @param filename The name of the file to save. + * @param y_flip Should the image be vertically flipped? + * + * @return @c true if the image saved OK, @c false on error. + */ +static bool store_bmp_image_with_stb( + const astcenc_image* img, + const char* filename, + int y_flip +) { + int res { 0 }; + + assert(img->data_type == ASTCENC_TYPE_U8); + + for (unsigned int i = 0; i < img->dim_z; i++) + { + std::string fnmod = get_output_filename(img, filename, i); + uint8_t* buf = reinterpret_cast(img->data[i]); + + stbi_flip_vertically_on_write(y_flip); + res = stbi_write_bmp(fnmod.c_str(), img->dim_x, img->dim_y, 4, buf); + if (res == 0) + { + break; + } + } + + return res != 0; +} + +/** + * @brief Save a HDR image using STBImageWrite to provide the store routine. + * + * @param img The source data for the image. + * @param filename The name of the file to save. + * @param y_flip Should the image be vertically flipped? + * + * @return @c true if the image saved OK, @c false on error. + */ +static bool store_hdr_image_with_stb( + const astcenc_image* img, + const char* filename, + int y_flip +) { + int res { 0 }; + + for (unsigned int i = 0; i < img->dim_z; i++) + { + std::string fnmod = get_output_filename(img, filename, i); + float* buf = floatx4_array_from_astc_img(img, y_flip, i); + + res = stbi_write_hdr(fnmod.c_str(), img->dim_x, img->dim_y, 4, buf); + delete[] buf; + if (res == 0) + { + break; + } + } + + return res != 0; +} + +/* ============================================================================ +Native Load and store of KTX and DDS file formats. + +Unlike "regular" 2D image formats, which are mostly supported through stb_image +and tinyexr, these formats are supported directly; this involves a relatively +large number of pixel formats. + +The following restrictions apply to loading of these file formats: + + * Only uncompressed data supported + * Only first mipmap in mipmap pyramid supported + * KTX: Cube-map arrays are not supported +============================================================================ */ +enum scanline_transfer +{ + R8_TO_RGBA8, + RG8_TO_RGBA8, + RGB8_TO_RGBA8, + RGBA8_TO_RGBA8, + BGR8_TO_RGBA8, + BGRA8_TO_RGBA8, + L8_TO_RGBA8, + LA8_TO_RGBA8, + + RGBX8_TO_RGBA8, + BGRX8_TO_RGBA8, + + R16_TO_RGBA16F, + RG16_TO_RGBA16F, + RGB16_TO_RGBA16F, + RGBA16_TO_RGBA16F, + BGR16_TO_RGBA16F, + BGRA16_TO_RGBA16F, + L16_TO_RGBA16F, + LA16_TO_RGBA16F, + + R16F_TO_RGBA16F, + RG16F_TO_RGBA16F, + RGB16F_TO_RGBA16F, + RGBA16F_TO_RGBA16F, + BGR16F_TO_RGBA16F, + BGRA16F_TO_RGBA16F, + L16F_TO_RGBA16F, + LA16F_TO_RGBA16F, + + R32F_TO_RGBA16F, + RG32F_TO_RGBA16F, + RGB32F_TO_RGBA16F, + RGBA32F_TO_RGBA16F, + BGR32F_TO_RGBA16F, + BGRA32F_TO_RGBA16F, + L32F_TO_RGBA16F, + LA32F_TO_RGBA16F +}; + +/** + * @brief Copy a scanline from a source file and expand to a canonical format. + * + * Outputs are always 4 component RGBA, stored as U8 (LDR) or FP16 (HDR). + * + * @param[out] dst The start of the line to store to. + * @param src The start of the line to load. + * @param pixel_count The number of pixels in the scanline. + * @param method The conversion function. + */ +static void copy_scanline( + void* dst, + const void* src, + int pixel_count, + scanline_transfer method +) { + +#define id(x) (x) +#define u16_sf16(x) float_to_float16(x * (1.0f/65535.0f)) +#define f32_sf16(x) float_to_float16(x) + +#define COPY_R(dsttype, srctype, convfunc, oneval) \ + do { \ + const srctype* s = reinterpret_cast(src); \ + dsttype* d = reinterpret_cast(dst); \ + for (int i = 0; i < pixel_count; i++) \ + { \ + d[4 * i ] = convfunc(s[i]); \ + d[4 * i + 1] = 0; \ + d[4 * i + 2] = 0; \ + d[4 * i + 3] = oneval; \ + } \ + } while (0); \ + break + +#define COPY_RG(dsttype, srctype, convfunc, oneval) \ + do { \ + const srctype* s = reinterpret_cast(src); \ + dsttype* d = reinterpret_cast(dst); \ + for (int i = 0; i < pixel_count; i++) \ + { \ + d[4 * i ] = convfunc(s[2 * i ]); \ + d[4 * i + 1] = convfunc(s[2 * i + 1]); \ + d[4 * i + 2] = 0; \ + d[4 * i + 3] = oneval; \ + } \ + } while (0); \ + break + +#define COPY_RGB(dsttype, srctype, convfunc, oneval) \ + do { \ + const srctype* s = reinterpret_cast(src); \ + dsttype* d = reinterpret_cast(dst); \ + for (int i = 0; i < pixel_count; i++) \ + { \ + d[4 * i ] = convfunc(s[3 * i ]); \ + d[4 * i + 1] = convfunc(s[3 * i + 1]); \ + d[4 * i + 2] = convfunc(s[3 * i + 2]); \ + d[4 * i + 3] = oneval; \ + } \ + } while (0); \ + break + +#define COPY_BGR(dsttype, srctype, convfunc, oneval) \ + do { \ + const srctype* s = reinterpret_cast(src); \ + dsttype* d = reinterpret_cast(dst); \ + for (int i = 0; i < pixel_count; i++)\ + { \ + d[4 * i ] = convfunc(s[3 * i + 2]); \ + d[4 * i + 1] = convfunc(s[3 * i + 1]); \ + d[4 * i + 2] = convfunc(s[3 * i ]); \ + d[4 * i + 3] = oneval; \ + } \ + } while (0); \ + break + +#define COPY_RGBX(dsttype, srctype, convfunc, oneval) \ + do { \ + const srctype* s = reinterpret_cast(src); \ + dsttype* d = reinterpret_cast(dst); \ + for (int i = 0; i < pixel_count; i++)\ + { \ + d[4 * i ] = convfunc(s[4 * i ]); \ + d[4 * i + 1] = convfunc(s[4 * i + 1]); \ + d[4 * i + 2] = convfunc(s[4 * i + 2]); \ + d[4 * i + 3] = oneval; \ + } \ + } while (0); \ + break + +#define COPY_BGRX(dsttype, srctype, convfunc, oneval) \ + do { \ + const srctype* s = reinterpret_cast(src); \ + dsttype* d = reinterpret_cast(dst); \ + for (int i = 0; i < pixel_count; i++)\ + { \ + d[4 * i ] = convfunc(s[4 * i + 2]); \ + d[4 * i + 1] = convfunc(s[4 * i + 1]); \ + d[4 * i + 2] = convfunc(s[4 * i ]); \ + d[4 * i + 3] = oneval; \ + } \ + } while (0); \ + break + +#define COPY_RGBA(dsttype, srctype, convfunc, oneval) \ + do { \ + const srctype* s = reinterpret_cast(src); \ + dsttype* d = reinterpret_cast(dst); \ + for (int i = 0; i < pixel_count; i++) \ + { \ + d[4 * i ] = convfunc(s[4 * i ]); \ + d[4 * i + 1] = convfunc(s[4 * i + 1]); \ + d[4 * i + 2] = convfunc(s[4 * i + 2]); \ + d[4 * i + 3] = convfunc(s[4 * i + 3]); \ + } \ + } while (0); \ + break + +#define COPY_BGRA(dsttype, srctype, convfunc, oneval) \ + do { \ + const srctype* s = reinterpret_cast(src); \ + dsttype* d = reinterpret_cast(dst); \ + for (int i = 0; i < pixel_count; i++) \ + { \ + d[4 * i ] = convfunc(s[4 * i + 2]); \ + d[4 * i + 1] = convfunc(s[4 * i + 1]); \ + d[4 * i + 2] = convfunc(s[4 * i ]); \ + d[4 * i + 3] = convfunc(s[4 * i + 3]); \ + } \ + } while (0); \ + break + +#define COPY_L(dsttype, srctype, convfunc, oneval) \ + do { \ + const srctype* s = reinterpret_cast(src); \ + dsttype* d = reinterpret_cast(dst); \ + for (int i = 0; i < pixel_count; i++) \ + { \ + d[4 * i ] = convfunc(s[i]); \ + d[4 * i + 1] = convfunc(s[i]); \ + d[4 * i + 2] = convfunc(s[i]); \ + d[4 * i + 3] = oneval; \ + } \ + } while (0); \ + break + +#define COPY_LA(dsttype, srctype, convfunc, oneval) \ + do { \ + const srctype* s = reinterpret_cast(src); \ + dsttype* d = reinterpret_cast(dst); \ + for (int i = 0; i < pixel_count; i++) \ + { \ + d[4 * i ] = convfunc(s[2 * i ]); \ + d[4 * i + 1] = convfunc(s[2 * i ]); \ + d[4 * i + 2] = convfunc(s[2 * i ]); \ + d[4 * i + 3] = convfunc(s[2 * i + 1]); \ + } \ + } while (0); \ + break + + switch (method) + { + case R8_TO_RGBA8: + COPY_R(uint8_t, uint8_t, id, 0xFF); + case RG8_TO_RGBA8: + COPY_RG(uint8_t, uint8_t, id, 0xFF); + case RGB8_TO_RGBA8: + COPY_RGB(uint8_t, uint8_t, id, 0xFF); + case RGBA8_TO_RGBA8: + COPY_RGBA(uint8_t, uint8_t, id, 0xFF); + case BGR8_TO_RGBA8: + COPY_BGR(uint8_t, uint8_t, id, 0xFF); + case BGRA8_TO_RGBA8: + COPY_BGRA(uint8_t, uint8_t, id, 0xFF); + case RGBX8_TO_RGBA8: + COPY_RGBX(uint8_t, uint8_t, id, 0xFF); + case BGRX8_TO_RGBA8: + COPY_BGRX(uint8_t, uint8_t, id, 0xFF); + case L8_TO_RGBA8: + COPY_L(uint8_t, uint8_t, id, 0xFF); + case LA8_TO_RGBA8: + COPY_LA(uint8_t, uint8_t, id, 0xFF); + + case R16F_TO_RGBA16F: + COPY_R(uint16_t, uint16_t, id, 0x3C00); + case RG16F_TO_RGBA16F: + COPY_RG(uint16_t, uint16_t, id, 0x3C00); + case RGB16F_TO_RGBA16F: + COPY_RGB(uint16_t, uint16_t, id, 0x3C00); + case RGBA16F_TO_RGBA16F: + COPY_RGBA(uint16_t, uint16_t, id, 0x3C00); + case BGR16F_TO_RGBA16F: + COPY_BGR(uint16_t, uint16_t, id, 0x3C00); + case BGRA16F_TO_RGBA16F: + COPY_BGRA(uint16_t, uint16_t, id, 0x3C00); + case L16F_TO_RGBA16F: + COPY_L(uint16_t, uint16_t, id, 0x3C00); + case LA16F_TO_RGBA16F: + COPY_LA(uint16_t, uint16_t, id, 0x3C00); + + case R16_TO_RGBA16F: + COPY_R(uint16_t, uint16_t, u16_sf16, 0x3C00); + case RG16_TO_RGBA16F: + COPY_RG(uint16_t, uint16_t, u16_sf16, 0x3C00); + case RGB16_TO_RGBA16F: + COPY_RGB(uint16_t, uint16_t, u16_sf16, 0x3C00); + case RGBA16_TO_RGBA16F: + COPY_RGBA(uint16_t, uint16_t, u16_sf16, 0x3C00); + case BGR16_TO_RGBA16F: + COPY_BGR(uint16_t, uint16_t, u16_sf16, 0x3C00); + case BGRA16_TO_RGBA16F: + COPY_BGRA(uint16_t, uint16_t, u16_sf16, 0x3C00); + case L16_TO_RGBA16F: + COPY_L(uint16_t, uint16_t, u16_sf16, 0x3C00); + case LA16_TO_RGBA16F: + COPY_LA(uint16_t, uint16_t, u16_sf16, 0x3C00); + + case R32F_TO_RGBA16F: + COPY_R(uint16_t, float, f32_sf16, 0x3C00); + case RG32F_TO_RGBA16F: + COPY_RG(uint16_t, float, f32_sf16, 0x3C00); + case RGB32F_TO_RGBA16F: + COPY_RGB(uint16_t, float, f32_sf16, 0x3C00); + case RGBA32F_TO_RGBA16F: + COPY_RGBA(uint16_t, float, f32_sf16, 0x3C00); + case BGR32F_TO_RGBA16F: + COPY_BGR(uint16_t, float, f32_sf16, 0x3C00); + case BGRA32F_TO_RGBA16F: + COPY_BGRA(uint16_t, float, f32_sf16, 0x3C00); + case L32F_TO_RGBA16F: + COPY_L(uint16_t, float, f32_sf16, 0x3C00); + case LA32F_TO_RGBA16F: + COPY_LA(uint16_t, float, f32_sf16, 0x3C00); + } +} + +/** + * @brief Swap endianness of N two byte values. + * + * @param[in,out] dataptr The data to convert. + * @param byte_count The number of bytes to convert. + */ +static void switch_endianness2( + void* dataptr, + int byte_count +) { + uint8_t* data = reinterpret_cast(dataptr); + for (int i = 0; i < byte_count / 2; i++) + { + uint8_t d0 = data[0]; + uint8_t d1 = data[1]; + data[0] = d1; + data[1] = d0; + data += 2; + } +} + +/** + * @brief Swap endianness of N four byte values. + * + * @param[in,out] dataptr The data to convert. + * @param byte_count The number of bytes to convert. + */ +static void switch_endianness4( + void* dataptr, + int byte_count +) { + uint8_t* data = reinterpret_cast(dataptr); + for (int i = 0; i < byte_count / 4; i++) + { + uint8_t d0 = data[0]; + uint8_t d1 = data[1]; + uint8_t d2 = data[2]; + uint8_t d3 = data[3]; + data[0] = d3; + data[1] = d2; + data[2] = d1; + data[3] = d0; + data += 4; + } +} + +/* + Notes about KTX: + + After the header and the key/value data area, the actual image data follows. + Each image starts with a 4-byte "imageSize" value indicating the number of bytes of image data follow. + (For cube-maps, this value appears only after first image; the remaining 5 images are all of equal size.) + If the size of an image is not a multiple of 4, then it is padded to the next multiple of 4. + Note that this padding is NOT included in the "imageSize" field. + In a cubemap, the padding appears after each face note that in a 2D/3D texture, padding does + NOT appear between the lines/planes of the texture! + + In a KTX file, there may be multiple images; they are organized as follows: + + For each mipmap_level in numberOfMipmapLevels + UInt32 imageSize; + For each array_element in numberOfArrayElements + * for each face in numberOfFaces + * for each z_slice in pixelDepth + * for each row or row_of_blocks in pixelHeight + * for each pixel or block_of_pixels in pixelWidth + Byte data[format-specific-number-of-bytes] + * end + * end + *end + Byte cubePadding[0-3] + *end + Byte mipPadding[3 - ((imageSize+ 3) % 4)] + *end + + In the ASTC codec, we will, for the time being only harvest the first image, + and we will support only a limited set of formats: + + gl_type: UNSIGNED_BYTE UNSIGNED_SHORT HALF_FLOAT FLOAT UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8_REV + gl_format: RED, RG. RGB, RGBA BGR, BGRA + gl_internal_format: used for upload to OpenGL; we can ignore it on uncompressed-load, but + need to provide a reasonable value on store: RGB8 RGBA8 RGB16F RGBA16F + gl_base_internal_format: same as gl_format unless texture is compressed (well, BGR is turned into RGB) + RED, RG, RGB, RGBA +*/ + +// Khronos enums +#define GL_RED 0x1903 +#define GL_RG 0x8227 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A + +#define GL_R8 0x8229 +#define GL_RG8 0x822B +#define GL_RGB8 0x8051 +#define GL_RGBA8 0x8058 + +#define GL_R16F 0x822D +#define GL_RG16F 0x822F +#define GL_RGB16F 0x881B +#define GL_RGBA16F 0x881A + +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_HALF_FLOAT 0x140B +#define GL_FLOAT 0x1406 + +#define GL_COMPRESSED_RGBA_ASTC_4x4 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12 0x93BD + +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12 0x93DD + +#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0 +#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1 +#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2 +#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3 +#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4 +#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5 +#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6 +#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7 +#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8 +#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9 + +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9 + +struct format_entry +{ + unsigned int x; + unsigned int y; + unsigned int z; + bool is_srgb; + unsigned int format; +}; + +static const std::array ASTC_FORMATS = +{{ + // 2D Linear RGB + { 4, 4, 1, false, GL_COMPRESSED_RGBA_ASTC_4x4}, + { 5, 4, 1, false, GL_COMPRESSED_RGBA_ASTC_5x4}, + { 5, 5, 1, false, GL_COMPRESSED_RGBA_ASTC_5x5}, + { 6, 5, 1, false, GL_COMPRESSED_RGBA_ASTC_6x5}, + { 6, 6, 1, false, GL_COMPRESSED_RGBA_ASTC_6x6}, + { 8, 5, 1, false, GL_COMPRESSED_RGBA_ASTC_8x5}, + { 8, 6, 1, false, GL_COMPRESSED_RGBA_ASTC_8x6}, + { 8, 8, 1, false, GL_COMPRESSED_RGBA_ASTC_8x8}, + {10, 5, 1, false, GL_COMPRESSED_RGBA_ASTC_10x5}, + {10, 6, 1, false, GL_COMPRESSED_RGBA_ASTC_10x6}, + {10, 8, 1, false, GL_COMPRESSED_RGBA_ASTC_10x8}, + {10, 10, 1, false, GL_COMPRESSED_RGBA_ASTC_10x10}, + {12, 10, 1, false, GL_COMPRESSED_RGBA_ASTC_12x10}, + {12, 12, 1, false, GL_COMPRESSED_RGBA_ASTC_12x12}, + // 2D SRGB + { 4, 4, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4}, + { 5, 4, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4}, + { 5, 5, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5}, + { 6, 5, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5}, + { 6, 6, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6}, + { 8, 5, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5}, + { 8, 6, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6}, + { 8, 8, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8}, + {10, 5, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5}, + {10, 6, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6}, + {10, 8, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8}, + {10, 10, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10}, + {12, 10, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10}, + {12, 12, 1, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12}, + // 3D Linear RGB + { 3, 3, 3, false, GL_COMPRESSED_RGBA_ASTC_3x3x3_OES}, + { 4, 3, 3, false, GL_COMPRESSED_RGBA_ASTC_4x3x3_OES}, + { 4, 4, 3, false, GL_COMPRESSED_RGBA_ASTC_4x4x3_OES}, + { 4, 4, 4, false, GL_COMPRESSED_RGBA_ASTC_4x4x4_OES}, + { 5, 4, 4, false, GL_COMPRESSED_RGBA_ASTC_5x4x4_OES}, + { 5, 5, 4, false, GL_COMPRESSED_RGBA_ASTC_5x5x4_OES}, + { 5, 5, 5, false, GL_COMPRESSED_RGBA_ASTC_5x5x5_OES}, + { 6, 5, 5, false, GL_COMPRESSED_RGBA_ASTC_6x5x5_OES}, + { 6, 6, 5, false, GL_COMPRESSED_RGBA_ASTC_6x6x5_OES}, + { 6, 6, 6, false, GL_COMPRESSED_RGBA_ASTC_6x6x6_OES}, + // 3D SRGB + { 3, 3, 3, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES}, + { 4, 3, 3, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES}, + { 4, 4, 3, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES}, + { 4, 4, 4, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES}, + { 5, 4, 4, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES}, + { 5, 5, 4, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES}, + { 5, 5, 5, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES}, + { 6, 5, 5, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES}, + { 6, 6, 5, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES}, + { 6, 6, 6, true, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES} +}}; + +static const format_entry* get_format( + unsigned int format +) { + for (auto& it : ASTC_FORMATS) + { + if (it.format == format) + { + return ⁢ + } + } + return nullptr; +} + +static unsigned int get_format( + unsigned int x, + unsigned int y, + unsigned int z, + bool is_srgb +) { + for (auto& it : ASTC_FORMATS) + { + if ((it.x == x) && (it.y == y) && (it.z == z) && (it.is_srgb == is_srgb)) + { + return it.format; + } + } + return 0; +} + +struct ktx_header +{ + uint8_t magic[12]; + uint32_t endianness; // should be 0x04030201; if it is instead 0x01020304, then the endianness of everything must be switched. + uint32_t gl_type; // 0 for compressed textures, otherwise value from table 3.2 (page 162) of OpenGL 4.0 spec + uint32_t gl_type_size; // size of data elements to do endianness swap on (1=endian-neutral data) + uint32_t gl_format; // 0 for compressed textures, otherwise value from table 3.3 (page 163) of OpenGL spec + uint32_t gl_internal_format; // sized-internal-format, corresponding to table 3.12 to 3.14 (pages 182-185) of OpenGL spec + uint32_t gl_base_internal_format; // unsized-internal-format: corresponding to table 3.11 (page 179) of OpenGL spec + uint32_t pixel_width; // texture dimensions; not rounded up to block size for compressed. + uint32_t pixel_height; // must be 0 for 1D textures. + uint32_t pixel_depth; // must be 0 for 1D, 2D and cubemap textures. + uint32_t number_of_array_elements; // 0 if not a texture array + uint32_t number_of_faces; // 6 for cubemaps, 1 for non-cubemaps + uint32_t number_of_mipmap_levels; // 0 or 1 for non-mipmapped textures; 0 indicates that auto-mipmap-gen should be done at load time. + uint32_t bytes_of_key_value_data; // size in bytes of the key-and-value area immediately following the header. +}; + +// Magic 12-byte sequence that must appear at the beginning of every KTX file. +static uint8_t ktx_magic[12] { + 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A +}; + +static void ktx_header_switch_endianness(ktx_header * kt) +{ + #define REV(x) kt->x = reverse_bytes_u32(kt->x) + REV(endianness); + REV(gl_type); + REV(gl_type_size); + REV(gl_format); + REV(gl_internal_format); + REV(gl_base_internal_format); + REV(pixel_width); + REV(pixel_height); + REV(pixel_depth); + REV(number_of_array_elements); + REV(number_of_faces); + REV(number_of_mipmap_levels); + REV(bytes_of_key_value_data); + #undef REV +} + +/** + * @brief Load an uncompressed KTX image using the local custom loader. + * + * @param filename The name of the file to load. + * @param y_flip Should the image be vertically flipped? + * @param[out] is_hdr Is this an HDR image load? + * @param[out] component_count The number of components in the data. + * + * @return The loaded image data in a canonical 4 channel format, or @c nullptr on error. + */ +static astcenc_image* load_ktx_uncompressed_image( + const char* filename, + bool y_flip, + bool& is_hdr, + unsigned int& component_count +) { + FILE *f = fopen(filename, "rb"); + if (!f) + { + printf("Failed to open file %s\n", filename); + return nullptr; + } + + ktx_header hdr; + size_t header_bytes_read = fread(&hdr, 1, sizeof(hdr), f); + + if (header_bytes_read != sizeof(hdr)) + { + printf("Failed to read header of KTX file %s\n", filename); + fclose(f); + return nullptr; + } + + if (memcmp(hdr.magic, ktx_magic, 12) != 0 || (hdr.endianness != 0x04030201 && hdr.endianness != 0x01020304)) + { + printf("File %s does not have a valid KTX header\n", filename); + fclose(f); + return nullptr; + } + + bool switch_endianness = false; + if (hdr.endianness == 0x01020304) + { + ktx_header_switch_endianness(&hdr); + switch_endianness = true; + } + + if (hdr.gl_type == 0 || hdr.gl_format == 0) + { + printf("File %s appears to be compressed, not supported as input\n", filename); + fclose(f); + return nullptr; + } + + // the formats we support are: + + // Cartesian product of gl_type=(UNSIGNED_BYTE, UNSIGNED_SHORT, HALF_FLOAT, FLOAT) x gl_format=(RED, RG, RGB, RGBA, BGR, BGRA) + + int components; + switch (hdr.gl_format) + { + case GL_RED: + components = 1; + break; + case GL_RG: + components = 2; + break; + case GL_RGB: + components = 3; + break; + case GL_RGBA: + components = 4; + break; + case GL_BGR: + components = 3; + break; + case GL_BGRA: + components = 4; + break; + case GL_LUMINANCE: + components = 1; + break; + case GL_LUMINANCE_ALPHA: + components = 2; + break; + default: + printf("KTX file %s has unsupported GL type\n", filename); + fclose(f); + return nullptr; + } + + // Although these are set up later, use default initializer to remove warnings + int bitness = 8; // Internal precision after conversion + int bytes_per_component = 1; // Bytes per component in the KTX file + scanline_transfer copy_method = R8_TO_RGBA8; + + switch (hdr.gl_type) + { + case GL_UNSIGNED_BYTE: + { + bitness = 8; + bytes_per_component = 1; + switch (hdr.gl_format) + { + case GL_RED: + copy_method = R8_TO_RGBA8; + break; + case GL_RG: + copy_method = RG8_TO_RGBA8; + break; + case GL_RGB: + copy_method = RGB8_TO_RGBA8; + break; + case GL_RGBA: + copy_method = RGBA8_TO_RGBA8; + break; + case GL_BGR: + copy_method = BGR8_TO_RGBA8; + break; + case GL_BGRA: + copy_method = BGRA8_TO_RGBA8; + break; + case GL_LUMINANCE: + copy_method = L8_TO_RGBA8; + break; + case GL_LUMINANCE_ALPHA: + copy_method = LA8_TO_RGBA8; + break; + } + break; + } + case GL_UNSIGNED_SHORT: + { + bitness = 16; + bytes_per_component = 2; + switch (hdr.gl_format) + { + case GL_RED: + copy_method = R16_TO_RGBA16F; + break; + case GL_RG: + copy_method = RG16_TO_RGBA16F; + break; + case GL_RGB: + copy_method = RGB16_TO_RGBA16F; + break; + case GL_RGBA: + copy_method = RGBA16_TO_RGBA16F; + break; + case GL_BGR: + copy_method = BGR16_TO_RGBA16F; + break; + case GL_BGRA: + copy_method = BGRA16_TO_RGBA16F; + break; + case GL_LUMINANCE: + copy_method = L16_TO_RGBA16F; + break; + case GL_LUMINANCE_ALPHA: + copy_method = LA16_TO_RGBA16F; + break; + } + break; + } + case GL_HALF_FLOAT: + { + bitness = 16; + bytes_per_component = 2; + switch (hdr.gl_format) + { + case GL_RED: + copy_method = R16F_TO_RGBA16F; + break; + case GL_RG: + copy_method = RG16F_TO_RGBA16F; + break; + case GL_RGB: + copy_method = RGB16F_TO_RGBA16F; + break; + case GL_RGBA: + copy_method = RGBA16F_TO_RGBA16F; + break; + case GL_BGR: + copy_method = BGR16F_TO_RGBA16F; + break; + case GL_BGRA: + copy_method = BGRA16F_TO_RGBA16F; + break; + case GL_LUMINANCE: + copy_method = L16F_TO_RGBA16F; + break; + case GL_LUMINANCE_ALPHA: + copy_method = LA16F_TO_RGBA16F; + break; + } + break; + } + case GL_FLOAT: + { + bitness = 16; + bytes_per_component = 4; + switch (hdr.gl_format) + { + case GL_RED: + copy_method = R32F_TO_RGBA16F; + break; + case GL_RG: + copy_method = RG32F_TO_RGBA16F; + break; + case GL_RGB: + copy_method = RGB32F_TO_RGBA16F; + break; + case GL_RGBA: + copy_method = RGBA32F_TO_RGBA16F; + break; + case GL_BGR: + copy_method = BGR32F_TO_RGBA16F; + break; + case GL_BGRA: + copy_method = BGRA32F_TO_RGBA16F; + break; + case GL_LUMINANCE: + copy_method = L32F_TO_RGBA16F; + break; + case GL_LUMINANCE_ALPHA: + copy_method = LA32F_TO_RGBA16F; + break; + } + break; + } + default: + printf("KTX file %s has unsupported GL format\n", filename); + fclose(f); + return nullptr; + } + + if (hdr.number_of_mipmap_levels > 1) + { + printf("WARNING: KTX file %s has %d mipmap levels; only the first one will be encoded.\n", filename, hdr.number_of_mipmap_levels); + } + + if (hdr.number_of_array_elements > 1) + { + printf("WARNING: KTX file %s contains a texture array with %d layers; only the first one will be encoded.\n", filename, hdr.number_of_array_elements); + } + + if (hdr.number_of_faces > 1) + { + printf("WARNING: KTX file %s contains a cubemap with 6 faces; only the first one will be encoded.\n", filename); + } + + + unsigned int dim_x = hdr.pixel_width; + unsigned int dim_y = astc::max(hdr.pixel_height, 1u); + unsigned int dim_z = astc::max(hdr.pixel_depth, 1u); + + // ignore the key/value data + fseek(f, hdr.bytes_of_key_value_data, SEEK_CUR); + + uint32_t specified_bytes_of_surface = 0; + size_t sb_read = fread(&specified_bytes_of_surface, 1, 4, f); + if (sb_read != 4) + { + printf("Failed to read header of KTX file %s\n", filename); + fclose(f); + return nullptr; + } + + if (switch_endianness) + { + specified_bytes_of_surface = reverse_bytes_u32(specified_bytes_of_surface); + } + + // read the surface + uint32_t xstride = bytes_per_component * components * dim_x; + uint32_t ystride = xstride * dim_y; + uint32_t computed_bytes_of_surface = dim_z * ystride; + if (computed_bytes_of_surface != specified_bytes_of_surface) + { + fclose(f); + printf("%s: KTX file inconsistency: computed surface size is %d bytes, but specified size is %d bytes\n", filename, computed_bytes_of_surface, specified_bytes_of_surface); + return nullptr; + } + + uint8_t *buf = new uint8_t[specified_bytes_of_surface]; + size_t bytes_read = fread(buf, 1, specified_bytes_of_surface, f); + fclose(f); + if (bytes_read != specified_bytes_of_surface) + { + delete[] buf; + printf("Failed to read file %s\n", filename); + return nullptr; + } + + // perform an endianness swap on the surface if needed. + if (switch_endianness) + { + if (hdr.gl_type_size == 2) + { + switch_endianness2(buf, specified_bytes_of_surface); + } + + if (hdr.gl_type_size == 4) + { + switch_endianness4(buf, specified_bytes_of_surface); + } + } + + // Transfer data from the surface to our own image data structure + astcenc_image *astc_img = alloc_image(bitness, dim_x, dim_y, dim_z); + + for (unsigned int z = 0; z < dim_z; z++) + { + for (unsigned int y = 0; y < dim_y; y++) + { + unsigned int ymod = y_flip ? dim_y - y - 1 : y; + unsigned int ydst = ymod; + void *dst; + + if (astc_img->data_type == ASTCENC_TYPE_U8) + { + uint8_t* data8 = static_cast(astc_img->data[z]); + dst = static_cast(&data8[4 * dim_x * ydst]); + } + else // if (astc_img->data_type == ASTCENC_TYPE_F16) + { + assert(astc_img->data_type == ASTCENC_TYPE_F16); + uint16_t* data16 = static_cast(astc_img->data[z]); + dst = static_cast(&data16[4 * dim_x * ydst]); + } + + uint8_t *src = buf + (z * ystride) + (y * xstride); + copy_scanline(dst, src, dim_x, copy_method); + } + } + + delete[] buf; + is_hdr = bitness >= 16; + component_count = components; + return astc_img; +} + +/** + * @brief Load a KTX compressed image using the local custom loader. + * + * @param filename The name of the file to load. + * @param[out] is_srgb @c true if this is an sRGB image, @c false otherwise. + * @param[out] img The output image to populate. + * + * @return @c true on error, @c false otherwise. + */ +bool load_ktx_compressed_image( + const char* filename, + bool& is_srgb, + astc_compressed_image& img +) { + FILE *f = fopen(filename, "rb"); + if (!f) + { + printf("Failed to open file %s\n", filename); + return true; + } + + ktx_header hdr; + size_t actual = fread(&hdr, 1, sizeof(hdr), f); + if (actual != sizeof(hdr)) + { + printf("Failed to read header from %s\n", filename); + fclose(f); + return true; + } + + if (memcmp(hdr.magic, ktx_magic, 12) != 0 || + (hdr.endianness != 0x04030201 && hdr.endianness != 0x01020304)) + { + printf("File %s does not have a valid KTX header\n", filename); + fclose(f); + return true; + } + + bool switch_endianness = false; + if (hdr.endianness == 0x01020304) + { + switch_endianness = true; + ktx_header_switch_endianness(&hdr); + } + + if (hdr.gl_type != 0 || hdr.gl_format != 0 || hdr.gl_type_size != 1 || + hdr.gl_base_internal_format != GL_RGBA) + { + printf("File %s is not a compressed ASTC file\n", filename); + fclose(f); + return true; + } + + const format_entry* fmt = get_format(hdr.gl_internal_format); + if (!fmt) + { + printf("File %s is not a compressed ASTC file\n", filename); + fclose(f); + return true; + } + + // Skip over any key-value pairs + int seekerr; + seekerr = fseek(f, hdr.bytes_of_key_value_data, SEEK_CUR); + if (seekerr) + { + printf("Failed to skip key-value pairs in %s\n", filename); + fclose(f); + return true; + } + + // Read the length of the data and endianess convert + unsigned int data_len; + actual = fread(&data_len, 1, sizeof(data_len), f); + if (actual != sizeof(data_len)) + { + printf("Failed to read mip 0 size from %s\n", filename); + fclose(f); + return true; + } + + if (switch_endianness) + { + data_len = reverse_bytes_u32(data_len); + } + + // Read the data + unsigned char* data = new unsigned char[data_len]; + actual = fread(data, 1, data_len, f); + if (actual != data_len) + { + printf("Failed to read mip 0 data from %s\n", filename); + fclose(f); + delete[] data; + return true; + } + + img.block_x = fmt->x; + img.block_y = fmt->y; + img.block_z = fmt->z == 0 ? 1 : fmt->z; + + img.dim_x = hdr.pixel_width; + img.dim_y = hdr.pixel_height; + img.dim_z = hdr.pixel_depth == 0 ? 1 : hdr.pixel_depth; + + img.data_len = data_len; + img.data = data; + + is_srgb = fmt->is_srgb; + + fclose(f); + return false; +} + +/** + * @brief Store a KTX compressed image using a local store routine. + * + * @param img The image data to store. + * @param filename The name of the file to save. + * @param is_srgb @c true if this is an sRGB image, @c false if linear. + * + * @return @c true on error, @c false otherwise. + */ +bool store_ktx_compressed_image( + const astc_compressed_image& img, + const char* filename, + bool is_srgb +) { + unsigned int fmt = get_format(img.block_x, img.block_y, img.block_z, is_srgb); + + ktx_header hdr; + memcpy(hdr.magic, ktx_magic, 12); + hdr.endianness = 0x04030201; + hdr.gl_type = 0; + hdr.gl_type_size = 1; + hdr.gl_format = 0; + hdr.gl_internal_format = fmt; + hdr.gl_base_internal_format = GL_RGBA; + hdr.pixel_width = img.dim_x; + hdr.pixel_height = img.dim_y; + hdr.pixel_depth = (img.dim_z == 1) ? 0 : img.dim_z; + hdr.number_of_array_elements = 0; + hdr.number_of_faces = 1; + hdr.number_of_mipmap_levels = 1; + hdr.bytes_of_key_value_data = 0; + +#if defined(ASTCENC_BIG_ENDIAN) + ktx_header_switch_endianness(&hdr); +#endif + + size_t expected = sizeof(ktx_header) + 4 + img.data_len; + size_t actual = 0; + + FILE *wf = fopen(filename, "wb"); + if (!wf) + { + return true; + } + + uint32_t data_len = static_cast(img.data_len); +#if defined(ASTCENC_BIG_ENDIAN) + data_len = reverse_bytes_u32(data_len); +#endif + + actual += fwrite(&hdr, 1, sizeof(ktx_header), wf); + actual += fwrite(&data_len, 1, sizeof(uint32_t), wf); + actual += fwrite(img.data, 1, img.data_len, wf); + fclose(wf); + + if (actual != expected) + { + return true; + } + + return false; +} + +/** + * @brief Save a KTX uncompressed image using a local store routine. + * + * @param img The source data for the image. + * @param filename The name of the file to save. + * @param y_flip Should the image be vertically flipped? + * + * @return @c true if the image saved OK, @c false on error. + */ +static bool store_ktx_uncompressed_image( + const astcenc_image* img, + const char* filename, + int y_flip +) { + unsigned int dim_x = img->dim_x; + unsigned int dim_y = img->dim_y; + unsigned int dim_z = img->dim_z; + + int bitness = img->data_type == ASTCENC_TYPE_U8 ? 8 : 16; + int image_components = determine_image_components(img); + + ktx_header hdr; + + static const int gl_format_of_components[4] { + GL_RED, GL_RG, GL_RGB, GL_RGBA + }; + + static const int gl_sized_format_of_components_ldr[4] { + GL_R8, GL_RG8, GL_RGB8, GL_RGBA8 + }; + + static const int gl_sized_format_of_components_hdr[4] { + GL_R16F, GL_RG16F, GL_RGB16F, GL_RGBA16F + }; + + memcpy(hdr.magic, ktx_magic, 12); + hdr.endianness = 0x04030201; + hdr.gl_type = (bitness == 16) ? GL_HALF_FLOAT : GL_UNSIGNED_BYTE; + hdr.gl_type_size = bitness / 8; + hdr.gl_format = gl_format_of_components[image_components - 1]; + if (bitness == 16) + { + hdr.gl_internal_format = gl_sized_format_of_components_hdr[image_components - 1]; + } + else + { + hdr.gl_internal_format = gl_sized_format_of_components_ldr[image_components - 1]; + } + hdr.gl_base_internal_format = hdr.gl_format; + hdr.pixel_width = dim_x; + hdr.pixel_height = dim_y; + hdr.pixel_depth = (dim_z == 1) ? 0 : dim_z; + hdr.number_of_array_elements = 0; + hdr.number_of_faces = 1; + hdr.number_of_mipmap_levels = 1; + hdr.bytes_of_key_value_data = 0; + + // Collect image data to write + uint8_t ***row_pointers8 = nullptr; + uint16_t ***row_pointers16 = nullptr; + if (bitness == 8) + { + row_pointers8 = new uint8_t **[dim_z]; + row_pointers8[0] = new uint8_t *[dim_y * dim_z]; + row_pointers8[0][0] = new uint8_t[dim_x * dim_y * dim_z * image_components + 3]; + + for (unsigned int z = 1; z < dim_z; z++) + { + row_pointers8[z] = row_pointers8[0] + dim_y * z; + row_pointers8[z][0] = row_pointers8[0][0] + dim_y * dim_x * image_components * z; + } + + for (unsigned int z = 0; z < dim_z; z++) + { + for (unsigned int y = 1; y < dim_y; y++) + { + row_pointers8[z][y] = row_pointers8[z][0] + dim_x * image_components * y; + } + } + + for (unsigned int z = 0; z < dim_z; z++) + { + uint8_t* data8 = static_cast(img->data[z]); + for (unsigned int y = 0; y < dim_y; y++) + { + int ym = y_flip ? dim_y - y - 1 : y; + switch (image_components) + { + case 1: // single-component, treated as Luminance + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers8[z][y][x] = data8[(4 * dim_x * ym) + (4 * x )]; + } + break; + case 2: // two-component, treated as Luminance-Alpha + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers8[z][y][2 * x ] = data8[(4 * dim_x * ym) + (4 * x )]; + row_pointers8[z][y][2 * x + 1] = data8[(4 * dim_x * ym) + (4 * x + 3)]; + } + break; + case 3: // three-component, treated a + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers8[z][y][3 * x ] = data8[(4 * dim_x * ym) + (4 * x )]; + row_pointers8[z][y][3 * x + 1] = data8[(4 * dim_x * ym) + (4 * x + 1)]; + row_pointers8[z][y][3 * x + 2] = data8[(4 * dim_x * ym) + (4 * x + 2)]; + } + break; + case 4: // four-component, treated as RGBA + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers8[z][y][4 * x ] = data8[(4 * dim_x * ym) + (4 * x )]; + row_pointers8[z][y][4 * x + 1] = data8[(4 * dim_x * ym) + (4 * x + 1)]; + row_pointers8[z][y][4 * x + 2] = data8[(4 * dim_x * ym) + (4 * x + 2)]; + row_pointers8[z][y][4 * x + 3] = data8[(4 * dim_x * ym) + (4 * x + 3)]; + } + break; + } + } + } + } + else // if bitness == 16 + { + row_pointers16 = new uint16_t **[dim_z]; + row_pointers16[0] = new uint16_t *[dim_y * dim_z]; + row_pointers16[0][0] = new uint16_t[dim_x * dim_y * dim_z * image_components + 1]; + + for (unsigned int z = 1; z < dim_z; z++) + { + row_pointers16[z] = row_pointers16[0] + dim_y * z; + row_pointers16[z][0] = row_pointers16[0][0] + dim_y * dim_x * image_components * z; + } + + for (unsigned int z = 0; z < dim_z; z++) + { + for (unsigned int y = 1; y < dim_y; y++) + { + row_pointers16[z][y] = row_pointers16[z][0] + dim_x * image_components * y; + } + } + + for (unsigned int z = 0; z < dim_z; z++) + { + uint16_t* data16 = static_cast(img->data[z]); + for (unsigned int y = 0; y < dim_y; y++) + { + int ym = y_flip ? dim_y - y - 1 : y; + switch (image_components) + { + case 1: // single-component, treated as Luminance + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers16[z][y][x] = data16[(4 * dim_x * ym) + (4 * x )]; + } + break; + case 2: // two-component, treated as Luminance-Alpha + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers16[z][y][2 * x ] = data16[(4 * dim_x * ym) + (4 * x )]; + row_pointers16[z][y][2 * x + 1] = data16[(4 * dim_x * ym) + (4 * x + 3)]; + } + break; + case 3: // three-component, treated as RGB + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers16[z][y][3 * x ] = data16[(4 * dim_x * ym) + (4 * x )]; + row_pointers16[z][y][3 * x + 1] = data16[(4 * dim_x * ym) + (4 * x + 1)]; + row_pointers16[z][y][3 * x + 2] = data16[(4 * dim_x * ym) + (4 * x + 2)]; + } + break; + case 4: // four-component, treated as RGBA + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers16[z][y][4 * x ] = data16[(4 * dim_x * ym) + (4 * x )]; + row_pointers16[z][y][4 * x + 1] = data16[(4 * dim_x * ym) + (4 * x + 1)]; + row_pointers16[z][y][4 * x + 2] = data16[(4 * dim_x * ym) + (4 * x + 2)]; + row_pointers16[z][y][4 * x + 3] = data16[(4 * dim_x * ym) + (4 * x + 3)]; + } + break; + } + } + } + } + + bool retval { true }; + uint32_t image_bytes = dim_x * dim_y * dim_z * image_components * (bitness / 8); + uint32_t image_write_bytes = (image_bytes + 3) & ~3; + + FILE *wf = fopen(filename, "wb"); + if (wf) + { + void* dataptr = (bitness == 16) ? + reinterpret_cast(row_pointers16[0][0]) : + reinterpret_cast(row_pointers8[0][0]); + + size_t expected_bytes_written = sizeof(ktx_header) + image_write_bytes + 4; + size_t hdr_bytes_written = fwrite(&hdr, 1, sizeof(ktx_header), wf); + size_t bytecount_bytes_written = fwrite(&image_bytes, 1, 4, wf); + size_t data_bytes_written = fwrite(dataptr, 1, image_write_bytes, wf); + fclose(wf); + if (hdr_bytes_written + bytecount_bytes_written + data_bytes_written != expected_bytes_written) + { + retval = false; + } + } + else + { + retval = false; + } + + if (row_pointers8) + { + delete[] row_pointers8[0][0]; + delete[] row_pointers8[0]; + delete[] row_pointers8; + } + + if (row_pointers16) + { + delete[] row_pointers16[0][0]; + delete[] row_pointers16[0]; + delete[] row_pointers16; + } + + return retval; +} + +/* + Loader for DDS files. + + Note that after the header, data are densely packed with no padding; + in the case of multiple surfaces, they appear one after another in + the file, again with no padding. + + This code is NOT endian-neutral. +*/ +struct dds_pixelformat +{ + uint32_t size; // structure size, set to 32. + /* + flags bits are a combination of the following: 0x1 : Texture contains alpha data 0x2 : ---- (older files: texture contains alpha data, for Alpha-only texture) 0x4 : The fourcc field is valid, + indicating a compressed or DX10 texture format 0x40 : texture contains uncompressed RGB data 0x200 : ---- (YUV in older files) 0x20000 : Texture contains Luminance data (can be combined with + 0x1 for Lum-Alpha) */ + uint32_t flags; + uint32_t fourcc; // "DX10" to indicate a DX10 format, "DXTn" for the DXT formats + uint32_t rgbbitcount; // number of bits per texel; up to 32 for non-DX10 formats. + uint32_t rbitmask; // bitmap indicating position of red/luminance color component + uint32_t gbitmask; // bitmap indicating position of green color component + uint32_t bbitmask; // bitmap indicating position of blue color component + uint32_t abitmask; // bitmap indicating position of alpha color component +}; + +struct dds_header +{ + uint32_t size; // header size; must be exactly 124. + /* + flag field is an OR or the following bits, that indicate fields containing valid data: + 1: caps/caps2/caps3/caps4 (set in all DDS files, ignore on read) + 2: height (set in all DDS files, ignore on read) + 4: width (set in all DDS files, ignore on read) + 8: pitch (for uncompressed texture) + 0x1000: the pixel format field (set in all DDS files, ignore on read) + 0x20000: mipmap count (for mipmapped textures with >1 level) + 0x80000: pitch (for compressed texture) + 0x800000: depth (for 3d textures) + */ + uint32_t flags; + uint32_t height; + uint32_t width; + uint32_t pitch_or_linear_size; // scanline pitch for uncompressed; total size in bytes for compressed + uint32_t depth; + uint32_t mipmapcount; + // unused, set to 0 + uint32_t reserved1[11]; + dds_pixelformat ddspf; + /* + caps field is an OR of the following values: + 8 : should be set for a file that contains more than 1 surface (ignore on read) + 0x400000 : should be set for a mipmapped texture + 0x1000 : should be set if the surface is a texture at all (all DDS files, ignore on read) + */ + uint32_t caps; + /* + caps2 field is an OR of the following values: + 0x200 : texture is cubemap + 0x400 : +X face of cubemap is present + 0x800 : -X face of cubemap is present + 0x1000 : +Y face of cubemap is present + 0x2000 : -Y face of cubemap is present + 0x4000 : +Z face of cubemap is present + 0x8000 : -Z face of cubemap is present + 0x200000 : texture is a 3d texture. + */ + uint32_t caps2; + // unused, set to 0 + uint32_t caps3; + // unused, set to 0 + uint32_t caps4; + // unused, set to 0 + uint32_t reserved2; +}; + +struct dds_header_dx10 +{ + uint32_t dxgi_format; + uint32_t resource_dimension; // 2=1d-texture, 3=2d-texture or cubemap, 4=3d-texture + uint32_t misc_flag; // 4 if cubemap, else 0 + uint32_t array_size; // size of array in case of a texture array; set to 1 for a non-array + uint32_t reserved; // set to 0. +}; + +#define DDS_MAGIC 0x20534444 +#define DX10_MAGIC 0x30315844 + +/** + * @brief Load an uncompressed DDS image using the local custom loader. + * + * @param filename The name of the file to load. + * @param y_flip Should the image be vertically flipped? + * @param[out] is_hdr Is this an HDR image load? + * @param[out] component_count The number of components in the data. + * + * @return The loaded image data in a canonical 4 channel format, or @c nullptr on error. + */ +static astcenc_image* load_dds_uncompressed_image( + const char* filename, + bool y_flip, + bool& is_hdr, + unsigned int& component_count +) { + FILE *f = fopen(filename, "rb"); + if (!f) + { + printf("Failed to open file %s\n", filename); + return nullptr; + } + + // Read and check the DDS magic number + uint32_t magic; + size_t magic_bytes_read = fread(&magic, 1, sizeof(uint32_t), f); + if (magic_bytes_read != 4) + { + printf("Failed to read magic number from file %s\n", filename); + fclose(f); + return nullptr; + } + +#if defined(ASTCENC_BIG_ENDIAN) + magic = reverse_bytes_u32(magic); +#endif + + if (magic != DDS_MAGIC) + { + printf("File %s has incorrect magic number\n", filename); + fclose(f); + return nullptr; + } + + // Validate that we can read the DDS header + dds_header hdr; + size_t header_bytes_read = fread(&hdr, 1, sizeof(hdr), f); + if (header_bytes_read != sizeof(hdr)) + { + printf("Failed to read header from file %s\n", filename); + fclose(f); + return nullptr; + } + +#if defined(ASTCENC_BIG_ENDIAN) + // DDS header fields all 32-bit words + uint32_t* words = reinterpret_cast(&hdr); + size_t word_count = sizeof(hdr) / sizeof(uint32_t); + + // Reverse all of them + for (size_t i = 0; i < word_count; i++) + { + words[i] = reverse_bytes_u32(words[i]); + } +#endif + + if (hdr.size != 124) + { + printf("File %s has incorrect header\n", filename); + fclose(f); + return nullptr; + } + + int use_dx10_header = 0; + if (hdr.ddspf.flags & 4) + { + if (hdr.ddspf.fourcc == DX10_MAGIC) + { + use_dx10_header = 1; + } + else + { + printf("DDS file %s is compressed, not supported\n", filename); + fclose(f); + return nullptr; + } + } + + dds_header_dx10 dx10_header; + if (use_dx10_header) + { + size_t dx10_header_bytes_read = fread(&dx10_header, 1, sizeof(dx10_header), f); + if (dx10_header_bytes_read != sizeof(dx10_header)) + { + printf("Failed to read header of DDS file %s\n", filename); + fclose(f); + return nullptr; + } + } + + unsigned int dim_x = hdr.width; + unsigned int dim_y = hdr.height; + unsigned int dim_z = (hdr.flags & 0x800000) ? hdr.depth : 1; + + // The bitcount that we will use internally in the codec + int bitness = 0; + + // The bytes per component in the DDS file itself + int bytes_per_component = 0; + int components = 0; + scanline_transfer copy_method = R8_TO_RGBA8; + + // figure out the format actually used in the DDS file. + if (use_dx10_header) + { + // DX10 header present; use the DXGI format. + #define DXGI_FORMAT_R32G32B32A32_FLOAT 2 + #define DXGI_FORMAT_R32G32B32_FLOAT 6 + #define DXGI_FORMAT_R16G16B16A16_FLOAT 10 + #define DXGI_FORMAT_R16G16B16A16_UNORM 11 + #define DXGI_FORMAT_R32G32_FLOAT 16 + #define DXGI_FORMAT_R8G8B8A8_UNORM 28 + #define DXGI_FORMAT_R16G16_FLOAT 34 + #define DXGI_FORMAT_R16G16_UNORM 35 + #define DXGI_FORMAT_R32_FLOAT 41 + #define DXGI_FORMAT_R8G8_UNORM 49 + #define DXGI_FORMAT_R16_FLOAT 54 + #define DXGI_FORMAT_R16_UNORM 56 + #define DXGI_FORMAT_R8_UNORM 61 + #define DXGI_FORMAT_B8G8R8A8_UNORM 86 + #define DXGI_FORMAT_B8G8R8X8_UNORM 87 + + struct dxgi_params + { + int bitness; + int bytes_per_component; + int components; + scanline_transfer copy_method; + uint32_t dxgi_format_number; + }; + + static const dxgi_params format_params[] { + {16, 4, 4, RGBA32F_TO_RGBA16F, DXGI_FORMAT_R32G32B32A32_FLOAT}, + {16, 4, 3, RGB32F_TO_RGBA16F, DXGI_FORMAT_R32G32B32_FLOAT}, + {16, 2, 4, RGBA16F_TO_RGBA16F, DXGI_FORMAT_R16G16B16A16_FLOAT}, + {16, 2, 4, RGBA16_TO_RGBA16F, DXGI_FORMAT_R16G16B16A16_UNORM}, + {16, 4, 2, RG32F_TO_RGBA16F, DXGI_FORMAT_R32G32_FLOAT}, + {8, 1, 4, RGBA8_TO_RGBA8, DXGI_FORMAT_R8G8B8A8_UNORM}, + {16, 2, 2, RG16F_TO_RGBA16F, DXGI_FORMAT_R16G16_FLOAT}, + {16, 2, 2, RG16_TO_RGBA16F, DXGI_FORMAT_R16G16_UNORM}, + {16, 4, 1, R32F_TO_RGBA16F, DXGI_FORMAT_R32_FLOAT}, + {8, 1, 2, RG8_TO_RGBA8, DXGI_FORMAT_R8G8_UNORM}, + {16, 2, 1, R16F_TO_RGBA16F, DXGI_FORMAT_R16_FLOAT}, + {16, 2, 1, R16_TO_RGBA16F, DXGI_FORMAT_R16_UNORM}, + {8, 1, 1, R8_TO_RGBA8, DXGI_FORMAT_R8_UNORM}, + {8, 1, 4, BGRA8_TO_RGBA8, DXGI_FORMAT_B8G8R8A8_UNORM}, + {8, 1, 4, BGRX8_TO_RGBA8, DXGI_FORMAT_B8G8R8X8_UNORM}, + }; + + int dxgi_modes_supported = sizeof(format_params) / sizeof(format_params[0]); + int did_select_format = 0; + for (int i = 0; i < dxgi_modes_supported; i++) + { + if (dx10_header.dxgi_format == format_params[i].dxgi_format_number) + { + bitness = format_params[i].bitness; + bytes_per_component = format_params[i].bytes_per_component; + components = format_params[i].components; + copy_method = format_params[i].copy_method; + did_select_format = 1; + break; + } + } + + if (!did_select_format) + { + printf("DDS file %s: DXGI format not supported by codec\n", filename); + fclose(f); + return nullptr; + } + } + else + { + // No DX10 header present. Then try to match the bitcount and bitmask against + // a set of prepared patterns. + uint32_t flags = hdr.ddspf.flags; + uint32_t bitcount = hdr.ddspf.rgbbitcount; + uint32_t rmask = hdr.ddspf.rbitmask; + uint32_t gmask = hdr.ddspf.gbitmask; + uint32_t bmask = hdr.ddspf.bbitmask; + uint32_t amask = hdr.ddspf.abitmask; + + // RGBA-unorm8 + if ((flags & 0x41) == 0x41 && bitcount == 32 && rmask == 0xFF && gmask == 0xFF00 && bmask == 0xFF0000 && amask == 0xFF000000) + { + bytes_per_component = 1; + components = 4; + copy_method = RGBA8_TO_RGBA8; + } + // BGRA-unorm8 + else if ((flags & 0x41) == 0x41 && bitcount == 32 && rmask == 0xFF0000 && gmask == 0xFF00 && bmask == 0xFF && amask == 0xFF000000) + { + bytes_per_component = 1; + components = 4; + copy_method = BGRA8_TO_RGBA8; + } + // RGBX-unorm8 + else if ((flags & 0x40) && bitcount == 32 && rmask == 0xFF && gmask == 0xFF00 && bmask == 0xFF0000) + { + bytes_per_component = 1; + components = 4; + copy_method = RGBX8_TO_RGBA8; + } + // BGRX-unorm8 + else if ((flags & 0x40) && bitcount == 32 && rmask == 0xFF0000 && gmask == 0xFF00 && bmask == 0xFF) + { + bytes_per_component = 1; + components = 4; + copy_method = BGRX8_TO_RGBA8; + } + // RGB-unorm8 + else if ((flags & 0x40) && bitcount == 24 && rmask == 0xFF && gmask == 0xFF00 && bmask == 0xFF0000) + { + bytes_per_component = 1; + components = 3; + copy_method = RGB8_TO_RGBA8; + } + // BGR-unorm8 + else if ((flags & 0x40) && bitcount == 24 && rmask == 0xFF0000 && gmask == 0xFF00 && bmask == 0xFF) + { + bytes_per_component = 1; + components = 3; + copy_method = BGR8_TO_RGBA8; + } + // RG-unorm16 + else if ((flags & 0x40) && bitcount == 16 && rmask == 0xFFFF && gmask == 0xFFFF0000) + { + bytes_per_component = 2; + components = 2; + copy_method = RG16_TO_RGBA16F; + } + // A8L8 + else if ((flags & 0x20001) == 0x20001 && bitcount == 16 && rmask == 0xFF && amask == 0xFF00) + { + bytes_per_component = 1; + components = 2; + copy_method = LA8_TO_RGBA8; + } + // L8 + else if ((flags & 0x20000) && bitcount == 8 && rmask == 0xFF) + { + bytes_per_component = 1; + components = 1; + copy_method = L8_TO_RGBA8; + } + // L16 + else if ((flags & 0x20000) && bitcount == 16 && rmask == 0xFFFF) + { + bytes_per_component = 2; + components = 1; + copy_method = L16_TO_RGBA16F; + } + else + { + printf("DDS file %s: Non-DXGI format not supported by codec\n", filename); + fclose(f); + return nullptr; + } + + bitness = bytes_per_component * 8; + } + + // then, load the actual file. + uint32_t xstride = bytes_per_component * components * dim_x; + uint32_t ystride = xstride * dim_y; + uint32_t bytes_of_surface = ystride * dim_z; + + uint8_t *buf = new uint8_t[bytes_of_surface]; + size_t bytes_read = fread(buf, 1, bytes_of_surface, f); + fclose(f); + if (bytes_read != bytes_of_surface) + { + delete[] buf; + printf("Failed to read file %s\n", filename); + return nullptr; + } + + // then transfer data from the surface to our own image-data-structure. + astcenc_image *astc_img = alloc_image(bitness, dim_x, dim_y, dim_z); + + for (unsigned int z = 0; z < dim_z; z++) + { + for (unsigned int y = 0; y < dim_y; y++) + { + unsigned int ymod = y_flip ? dim_y - y - 1 : y; + unsigned int ydst = ymod; + void* dst; + + if (astc_img->data_type == ASTCENC_TYPE_U8) + { + uint8_t* data8 = static_cast(astc_img->data[z]); + dst = static_cast(&data8[4 * dim_x * ydst]); + } + else // if (astc_img->data_type == ASTCENC_TYPE_F16) + { + assert(astc_img->data_type == ASTCENC_TYPE_F16); + uint16_t* data16 = static_cast(astc_img->data[z]); + dst = static_cast(&data16[4 * dim_x * ydst]); + } + + uint8_t *src = buf + (z * ystride) + (y * xstride); + copy_scanline(dst, src, dim_x, copy_method); + } + } + + delete[] buf; + is_hdr = bitness >= 16; + component_count = components; + return astc_img; +} + +/** + * @brief Save a DDS uncompressed image using a local store routine. + * + * @param img The source data for the image. + * @param filename The name of the file to save. + * @param y_flip Should the image be vertically flipped? + * + * @return @c true if the image saved OK, @c false on error. + */ +static bool store_dds_uncompressed_image( + const astcenc_image* img, + const char* filename, + int y_flip +) { + unsigned int dim_x = img->dim_x; + unsigned int dim_y = img->dim_y; + unsigned int dim_z = img->dim_z; + + int bitness = img->data_type == ASTCENC_TYPE_U8 ? 8 : 16; + int image_components = (bitness == 16) ? 4 : determine_image_components(img); + + // DDS-pixel-format structures to use when storing LDR image with 1,2,3 or 4 components. + static const dds_pixelformat format_of_image_components[4] = + { + {32, 0x20000, 0, 8, 0xFF, 0, 0, 0}, // luminance + {32, 0x20001, 0, 16, 0xFF, 0, 0, 0xFF00}, // L8A8 + {32, 0x40, 0, 24, 0xFF, 0xFF00, 0xFF0000, 0}, // RGB8 + {32, 0x41, 0, 32, 0xFF, 0xFF00, 0xFF0000, 0xFF000000} // RGBA8 + }; + + // DDS-pixel-format structures to use when storing HDR image. + static const dds_pixelformat dxt10_diverter = + { + 32, 4, DX10_MAGIC, 0, 0, 0, 0, 0 + }; + + // Header handling; will write: + // * DDS magic value + // * DDS header + // * DDS DX10 header, if the file is floating-point + // * pixel data + + // Main header data + dds_header hdr; + hdr.size = 124; + hdr.flags = 0x100F | (dim_z > 1 ? 0x800000 : 0); + hdr.height = dim_y; + hdr.width = dim_x; + hdr.pitch_or_linear_size = image_components * (bitness / 8) * dim_x; + hdr.depth = dim_z; + hdr.mipmapcount = 1; + for (unsigned int i = 0; i < 11; i++) + { + hdr.reserved1[i] = 0; + } + hdr.caps = 0x1000; + hdr.caps2 = (dim_z > 1) ? 0x200000 : 0; + hdr.caps3 = 0; + hdr.caps4 = 0; + + // Pixel-format data + if (bitness == 8) + { + hdr.ddspf = format_of_image_components[image_components - 1]; + } + else + { + hdr.ddspf = dxt10_diverter; + } + + // DX10 data + dds_header_dx10 dx10; + dx10.dxgi_format = DXGI_FORMAT_R16G16B16A16_FLOAT; + dx10.resource_dimension = (dim_z > 1) ? 4 : 3; + dx10.misc_flag = 0; + dx10.array_size = 1; + dx10.reserved = 0; + + // Collect image data to write + uint8_t ***row_pointers8 = nullptr; + uint16_t ***row_pointers16 = nullptr; + + if (bitness == 8) + { + row_pointers8 = new uint8_t **[dim_z]; + row_pointers8[0] = new uint8_t *[dim_y * dim_z]; + row_pointers8[0][0] = new uint8_t[dim_x * dim_y * dim_z * image_components]; + + for (unsigned int z = 1; z < dim_z; z++) + { + row_pointers8[z] = row_pointers8[0] + dim_y * z; + row_pointers8[z][0] = row_pointers8[0][0] + dim_y * dim_z * image_components * z; + } + + for (unsigned int z = 0; z < dim_z; z++) + { + for (unsigned int y = 1; y < dim_y; y++) + { + row_pointers8[z][y] = row_pointers8[z][0] + dim_x * image_components * y; + } + } + + for (unsigned int z = 0; z < dim_z; z++) + { + uint8_t* data8 = static_cast(img->data[z]); + + for (unsigned int y = 0; y < dim_y; y++) + { + int ym = y_flip ? dim_y - y - 1 : y; + switch (image_components) + { + case 1: // single-component, treated as Luminance + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers8[z][y][x] = data8[(4 * dim_x * ym) + (4 * x )]; + } + break; + case 2: // two-component, treated as Luminance-Alpha + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers8[z][y][2 * x ] = data8[(4 * dim_x * ym) + (4 * x )]; + row_pointers8[z][y][2 * x + 1] = data8[(4 * dim_x * ym) + (4 * x + 3)]; + } + break; + case 3: // three-component, treated as RGB + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers8[z][y][3 * x ] = data8[(4 * dim_x * ym) + (4 * x )]; + row_pointers8[z][y][3 * x + 1] = data8[(4 * dim_x * ym) + (4 * x + 1)]; + row_pointers8[z][y][3 * x + 2] = data8[(4 * dim_x * ym) + (4 * x + 2)]; + } + break; + case 4: // four-component, treated as RGBA + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers8[z][y][4 * x ] = data8[(4 * dim_x * ym) + (4 * x )]; + row_pointers8[z][y][4 * x + 1] = data8[(4 * dim_x * ym) + (4 * x + 1)]; + row_pointers8[z][y][4 * x + 2] = data8[(4 * dim_x * ym) + (4 * x + 2)]; + row_pointers8[z][y][4 * x + 3] = data8[(4 * dim_x * ym) + (4 * x + 3)]; + } + break; + } + } + } + } + else // if bitness == 16 + { + row_pointers16 = new uint16_t **[dim_z]; + row_pointers16[0] = new uint16_t *[dim_y * dim_z]; + row_pointers16[0][0] = new uint16_t[dim_x * dim_y * dim_z * image_components]; + + for (unsigned int z = 1; z < dim_z; z++) + { + row_pointers16[z] = row_pointers16[0] + dim_y * z; + row_pointers16[z][0] = row_pointers16[0][0] + dim_y * dim_x * image_components * z; + } + + for (unsigned int z = 0; z < dim_z; z++) + { + for (unsigned int y = 1; y < dim_y; y++) + { + row_pointers16[z][y] = row_pointers16[z][0] + dim_x * image_components * y; + } + } + + for (unsigned int z = 0; z < dim_z; z++) + { + uint16_t* data16 = static_cast(img->data[z]); + + for (unsigned int y = 0; y < dim_y; y++) + { + int ym = y_flip ? dim_y - y - 1: y; + switch (image_components) + { + case 1: // single-component, treated as Luminance + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers16[z][y][x] = data16[(4 * dim_x * ym) + (4 * x )]; + } + break; + case 2: // two-component, treated as Luminance-Alpha + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers16[z][y][2 * x ] = data16[(4 * dim_x * ym) + (4 * x )]; + row_pointers16[z][y][2 * x + 1] = data16[(4 * dim_x * ym) + (4 * x + 3)]; + } + break; + case 3: // three-component, treated as RGB + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers16[z][y][3 * x ] = data16[(4 * dim_x * ym) + (4 * x )]; + row_pointers16[z][y][3 * x + 1] = data16[(4 * dim_x * ym) + (4 * x + 1)]; + row_pointers16[z][y][3 * x + 2] = data16[(4 * dim_x * ym) + (4 * x + 2)]; + } + break; + case 4: // four-component, treated as RGBA + for (unsigned int x = 0; x < dim_x; x++) + { + row_pointers16[z][y][4 * x ] = data16[(4 * dim_x * ym) + (4 * x )]; + row_pointers16[z][y][4 * x + 1] = data16[(4 * dim_x * ym) + (4 * x + 1)]; + row_pointers16[z][y][4 * x + 2] = data16[(4 * dim_x * ym) + (4 * x + 2)]; + row_pointers16[z][y][4 * x + 3] = data16[(4 * dim_x * ym) + (4 * x + 3)]; + } + break; + } + } + } + } + + bool retval { true }; + uint32_t image_bytes = dim_x * dim_y * dim_z * image_components * (bitness / 8); + + uint32_t dds_magic = DDS_MAGIC; + + FILE *wf = fopen(filename, "wb"); + if (wf) + { + void *dataptr = (bitness == 16) ? + reinterpret_cast(row_pointers16[0][0]) : + reinterpret_cast(row_pointers8[0][0]); + + size_t expected_bytes_written = 4 + sizeof(dds_header) + (bitness > 8 ? sizeof(dds_header_dx10) : 0) + image_bytes; + + size_t magic_bytes_written = fwrite(&dds_magic, 1, 4, wf); + size_t hdr_bytes_written = fwrite(&hdr, 1, sizeof(dds_header), wf); + + size_t dx10_bytes_written; + if (bitness > 8) + { + dx10_bytes_written = fwrite(&dx10, 1, sizeof(dx10), wf); + } + else + { + dx10_bytes_written = 0; + } + + size_t data_bytes_written = fwrite(dataptr, 1, image_bytes, wf); + + fclose(wf); + if (magic_bytes_written + hdr_bytes_written + dx10_bytes_written + data_bytes_written != expected_bytes_written) + { + retval = false; + } + } + else + { + retval = false; + } + + if (row_pointers8) + { + delete[] row_pointers8[0][0]; + delete[] row_pointers8[0]; + delete[] row_pointers8; + } + + if (row_pointers16) + { + delete[] row_pointers16[0][0]; + delete[] row_pointers16[0]; + delete[] row_pointers16; + } + + return retval; +} + +/** + * @brief Supported uncompressed image load functions, and their associated file extensions. + */ +static const struct +{ + const char* ending1; + const char* ending2; + astcenc_image* (*loader_func)(const char*, bool, bool&, unsigned int&); +} loader_descs[] { + // LDR formats + {".png", ".PNG", load_png_with_wuffs}, + // HDR formats + {".exr", ".EXR", load_image_with_tinyexr }, + // Container formats + {".ktx", ".KTX", load_ktx_uncompressed_image }, + {".dds", ".DDS", load_dds_uncompressed_image }, + // Generic catch all; this one must be last in the list + { nullptr, nullptr, load_image_with_stb } +}; + +static const int loader_descr_count = sizeof(loader_descs) / sizeof(loader_descs[0]); + +/** + * @brief Supported uncompressed image store functions, and their associated file extensions. + */ +static const struct +{ + const char *ending1; + const char *ending2; + int enforced_bitness; + bool (*storer_func)(const astcenc_image *output_image, const char *filename, int y_flip); +} storer_descs[] { + // LDR formats + {".bmp", ".BMP", 8, store_bmp_image_with_stb}, + {".png", ".PNG", 8, store_png_image_with_stb}, + {".tga", ".TGA", 8, store_tga_image_with_stb}, + // HDR formats + {".exr", ".EXR", 16, store_exr_image_with_tinyexr}, + {".hdr", ".HDR", 16, store_hdr_image_with_stb}, + // Container formats + {".dds", ".DDS", 0, store_dds_uncompressed_image}, + {".ktx", ".KTX", 0, store_ktx_uncompressed_image} +}; + +static const int storer_descr_count = sizeof(storer_descs) / sizeof(storer_descs[0]); + +/* See header for documentation. */ +int get_output_filename_enforced_bitness( + const char* filename +) { + const char *eptr = strrchr(filename, '.'); + if (!eptr) + { + return 0; + } + + for (int i = 0; i < storer_descr_count; i++) + { + if (strcmp(eptr, storer_descs[i].ending1) == 0 + || strcmp(eptr, storer_descs[i].ending2) == 0) + { + return storer_descs[i].enforced_bitness; + } + } + + return -1; +} + +/* See header for documentation. */ +astcenc_image* load_ncimage( + const char* filename, + bool y_flip, + bool& is_hdr, + unsigned int& component_count +) { + // Get the file extension + const char* eptr = strrchr(filename, '.'); + if (!eptr) + { + eptr = filename; + } + + // Scan through descriptors until a matching loader is found + for (unsigned int i = 0; i < loader_descr_count; i++) + { + if (loader_descs[i].ending1 == nullptr + || strcmp(eptr, loader_descs[i].ending1) == 0 + || strcmp(eptr, loader_descs[i].ending2) == 0) + { + return loader_descs[i].loader_func(filename, y_flip, is_hdr, component_count); + } + } + + // Should never reach here - stb_image provides a generic handler + return nullptr; +} + +/* See header for documentation. */ +bool store_ncimage( + const astcenc_image* output_image, + const char* filename, + int y_flip +) { + const char* eptr = strrchr(filename, '.'); + if (!eptr) + { + eptr = ".ktx"; // use KTX file format if we don't have an ending. + } + + for (int i = 0; i < storer_descr_count; i++) + { + if (strcmp(eptr, storer_descs[i].ending1) == 0 + || strcmp(eptr, storer_descs[i].ending2) == 0) + { + return storer_descs[i].storer_func(output_image, filename, y_flip); + } + } + + // Should never reach here - get_output_filename_enforced_bitness should + // have acted as a preflight check + return false; +} + +/* ============================================================================ + ASTC compressed file loading +============================================================================ */ +struct astc_header +{ + uint8_t magic[4]; + uint8_t block_x; + uint8_t block_y; + uint8_t block_z; + uint8_t dim_x[3]; // dims = dim[0] + (dim[1] << 8) + (dim[2] << 16) + uint8_t dim_y[3]; // Sizes are given in texels; + uint8_t dim_z[3]; // block count is inferred +}; + +static const uint32_t ASTC_MAGIC_ID = 0x5CA1AB13; + +static unsigned int unpack_bytes( + uint8_t a, + uint8_t b, + uint8_t c, + uint8_t d +) { + return (static_cast(a) ) + + (static_cast(b) << 8) + + (static_cast(c) << 16) + + (static_cast(d) << 24); +} + +/* See header for documentation. */ +int load_cimage( + const char* filename, + astc_compressed_image& img +) { + std::ifstream file(filename, std::ios::in | std::ios::binary); + if (!file) + { + print_error("ERROR: File open failed '%s'\n", filename); + return 1; + } + + astc_header hdr; + file.read(reinterpret_cast(&hdr), sizeof(astc_header)); + if (file.fail()) + { + print_error("ERROR: File read failed '%s'\n", filename); + return 1; + } + + unsigned int magicval = unpack_bytes(hdr.magic[0], hdr.magic[1], hdr.magic[2], hdr.magic[3]); + if (magicval != ASTC_MAGIC_ID) + { + print_error("ERROR: File not recognized '%s'\n", filename); + return 1; + } + + // Ensure these are not zero to avoid div by zero + unsigned int block_x = astc::max(static_cast(hdr.block_x), 1u); + unsigned int block_y = astc::max(static_cast(hdr.block_y), 1u); + unsigned int block_z = astc::max(static_cast(hdr.block_z), 1u); + + unsigned int dim_x = unpack_bytes(hdr.dim_x[0], hdr.dim_x[1], hdr.dim_x[2], 0); + unsigned int dim_y = unpack_bytes(hdr.dim_y[0], hdr.dim_y[1], hdr.dim_y[2], 0); + unsigned int dim_z = unpack_bytes(hdr.dim_z[0], hdr.dim_z[1], hdr.dim_z[2], 0); + + if (dim_x == 0 || dim_y == 0 || dim_z == 0) + { + print_error("ERROR: Image header corrupt '%s'\n", filename); + return 1; + } + + unsigned int xblocks = (dim_x + block_x - 1) / block_x; + unsigned int yblocks = (dim_y + block_y - 1) / block_y; + unsigned int zblocks = (dim_z + block_z - 1) / block_z; + + size_t data_size = xblocks * yblocks * zblocks * 16; + uint8_t *buffer = new uint8_t[data_size]; + + file.read(reinterpret_cast(buffer), data_size); + if (file.fail()) + { + print_error("ERROR: Image data size exceeded file size '%s'\n", filename); + delete[] buffer; + return 1; + } + + img.data = buffer; + img.data_len = data_size; + img.block_x = block_x; + img.block_y = block_y; + img.block_z = block_z; + img.dim_x = dim_x; + img.dim_y = dim_y; + img.dim_z = dim_z; + return 0; +} + +/* See header for documentation. */ +int store_cimage( + const astc_compressed_image& img, + const char* filename +) { + astc_header hdr; + hdr.magic[0] = ASTC_MAGIC_ID & 0xFF; + hdr.magic[1] = (ASTC_MAGIC_ID >> 8) & 0xFF; + hdr.magic[2] = (ASTC_MAGIC_ID >> 16) & 0xFF; + hdr.magic[3] = (ASTC_MAGIC_ID >> 24) & 0xFF; + + hdr.block_x = static_cast(img.block_x); + hdr.block_y = static_cast(img.block_y); + hdr.block_z = static_cast(img.block_z); + + hdr.dim_x[0] = img.dim_x & 0xFF; + hdr.dim_x[1] = (img.dim_x >> 8) & 0xFF; + hdr.dim_x[2] = (img.dim_x >> 16) & 0xFF; + + hdr.dim_y[0] = img.dim_y & 0xFF; + hdr.dim_y[1] = (img.dim_y >> 8) & 0xFF; + hdr.dim_y[2] = (img.dim_y >> 16) & 0xFF; + + hdr.dim_z[0] = img.dim_z & 0xFF; + hdr.dim_z[1] = (img.dim_z >> 8) & 0xFF; + hdr.dim_z[2] = (img.dim_z >> 16) & 0xFF; + + std::ofstream file(filename, std::ios::out | std::ios::binary); + if (!file) + { + print_error("ERROR: File open failed '%s'\n", filename); + return 1; + } + + file.write(reinterpret_cast(&hdr), sizeof(astc_header)); + file.write(reinterpret_cast(img.data), img.data_len); + return 0; +} diff --git a/ktx/external/astc-encoder/Source/astcenccli_internal.h b/ktx/external/astc-encoder/Source/astcenccli_internal.h new file mode 100644 index 0000000..ea3ae38 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenccli_internal.h @@ -0,0 +1,422 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2011-2023 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions and data declarations. + */ + +#ifndef ASTCENCCLI_INTERNAL_INCLUDED +#define ASTCENCCLI_INTERNAL_INCLUDED + +#include +#include +#include +#include + +#include "astcenc.h" +#include "astcenc_mathlib.h" + +/** + * @brief The payload stored in a compressed ASTC image. + */ +struct astc_compressed_image +{ + /** @brief The block width in texels. */ + unsigned int block_x; + + /** @brief The block height in texels. */ + unsigned int block_y; + + /** @brief The block depth in texels. */ + unsigned int block_z; + + /** @brief The image width in texels. */ + unsigned int dim_x; + + /** @brief The image height in texels. */ + unsigned int dim_y; + + /** @brief The image depth in texels. */ + unsigned int dim_z; + + /** @brief The binary data payload. */ + uint8_t* data; + + /** @brief The binary data length in bytes. */ + size_t data_len; +}; + +/** + * @brief Config options that have been read from command line. + */ +struct cli_config_options +{ + /** @brief The number of threads to use for processing. */ + unsigned int thread_count; + + /** @brief The number of repeats to execute for benchmarking. */ + unsigned int repeat_count; + + /** @brief The number of image slices to load for a 3D image. */ + unsigned int array_size; + + /** @brief @c true if running in silent mode with minimal output. */ + bool silentmode; + + /** @brief @c true if the images should be y-flipped. */ + bool y_flip; + + /** @brief @c true if diagnostic images should be stored. */ + bool diagnostic_images; + + /** @brief The low exposure fstop for error computation. */ + int low_fstop; + + /** @brief The high exposure fstop for error computation. */ + int high_fstop; + + /** @brief The pre-encode swizzle. */ + astcenc_swizzle swz_encode; + + /** @brief The post-decode swizzle. */ + astcenc_swizzle swz_decode; +}; + +/** + * @brief Print a string to stderr. + */ +static inline void print_error( + const char* format +) { + fprintf(stderr, "%s", format); +} + +/** + * @brief Print a formatted string to stderr. + */ +template +static inline void print_error( + const char* format, + _Args...args +) { + fprintf(stderr, format, args...); +} + +/** + * @brief Load uncompressed image. + * + * @param filename The file path on disk. + * @param y_flip Should this image be Y flipped? + * @param[out] is_hdr Is the loaded image HDR? + * @param[out] component_count The number of components in the loaded image. + * + * @return The astc image file, or nullptr on error. + */ +astcenc_image* load_ncimage( + const char* filename, + bool y_flip, + bool& is_hdr, + unsigned int& component_count); + +/** + * @brief Load uncompressed PNG image. + * + * @param filename The file path on disk. + * @param y_flip Should this image be Y flipped? + * @param[out] is_hdr Is the loaded image HDR? + * @param[out] component_count The number of components in the loaded image. + * + * @return The astc image file, or nullptr on error. + */ +astcenc_image* load_png_with_wuffs( + const char* filename, + bool y_flip, + bool& is_hdr, + unsigned int& component_count); + +/** + * @brief Save an uncompressed image. + * + * @param img The source data for the image. + * @param filename The name of the file to save. + * @param y_flip Should the image be vertically flipped? + * + * @return @c true if the image saved OK, @c false on error. + */ +bool store_ncimage( + const astcenc_image* img, + const char* filename, + int y_flip); + +/** + * @brief Check if the output file type requires a specific bitness. + * + * @param filename The file name, containing hte extension to check. + * + * @return Valid values are: + * * -1 - error - unknown file type. + * * 0 - no enforced bitness. + * * 8 - enforced 8-bit UNORM. + * * 16 - enforced 16-bit FP16. + */ +int get_output_filename_enforced_bitness( + const char* filename); + +/** + * @brief Allocate a new image in a canonical format. + * + * Allocated images must be freed with a @c free_image() call. + * + * @param bitness The number of bits per component (8, 16, or 32). + * @param dim_x The width of the image, in texels. + * @param dim_y The height of the image, in texels. + * @param dim_z The depth of the image, in texels. + * + * @return The allocated image, or @c nullptr on error. + */ +astcenc_image* alloc_image( + unsigned int bitness, + unsigned int dim_x, + unsigned int dim_y, + unsigned int dim_z); + +/** + * @brief Free an image. + * + * @param img The image to free. + */ +void free_image( + astcenc_image* img); + +/** + * @brief Determine the number of active components in an image. + * + * @param img The image to analyze. + * + * @return The number of active components in the image. + */ +int determine_image_components( + const astcenc_image* img); + +/** + * @brief Load a compressed .astc image. + * + * @param filename The file to load. + * @param img The image to populate with loaded data. + * + * @return Non-zero on error, zero on success. + */ +int load_cimage( + const char* filename, + astc_compressed_image& img); + +/** + * @brief Store a compressed .astc image. + * + * @param img The image to store. + * @param filename The file to save. + * + * @return Non-zero on error, zero on success. + */ +int store_cimage( + const astc_compressed_image& img, + const char* filename); + +/** + * @brief Load a compressed .ktx image. + * + * @param filename The file to load. + * @param is_srgb Is this an sRGB encoded file? + * @param img The image to populate with loaded data. + * + * @return Non-zero on error, zero on success. + */ +bool load_ktx_compressed_image( + const char* filename, + bool& is_srgb, + astc_compressed_image& img) ; + +/** + * @brief Store a compressed .ktx image. + * + * @param img The image to store. + * @param filename The file to store. + * @param is_srgb Is this an sRGB encoded file? + * + * @return Non-zero on error, zero on success. + */ +bool store_ktx_compressed_image( + const astc_compressed_image& img, + const char* filename, + bool is_srgb); + +/** + * @brief Create an image from a 2D float data array. + * + * @param data The raw input data. + * @param dim_x The width of the image, in texels. + * @param dim_y The height of the image, in texels. + * @param y_flip Should this image be vertically flipped? + * + * @return The populated image. + */ +astcenc_image* astc_img_from_floatx4_array( + const float* data, + unsigned int dim_x, + unsigned int dim_y, + bool y_flip); + +/** + * @brief Create an image from a 2D byte data array. + * + * @param data The raw input data. + * @param dim_x The width of the image, in texels. + * @param dim_y The height of the image, in texels. + * @param y_flip Should this image be vertically flipped? + * + * @return The populated image. + */ +astcenc_image* astc_img_from_unorm8x4_array( + const uint8_t* data, + unsigned int dim_x, + unsigned int dim_y, + bool y_flip); + +/** + * @brief Create a flattened RGBA FLOAT32 data array for a single slice from an image structure. + * + * The returned data array is allocated with @c new[] and must be freed with a @c delete[] call. + * + * @param img The input image. + * @param y_flip Should the data in the array be Y flipped? + * @param z_index The slice index to convert. + * + * @return The data array. + */ +float* floatx4_array_from_astc_img( + const astcenc_image* img, + bool y_flip, + unsigned int z_index); + +/** + * @brief Create a flattened RGBA UNORM8 data array from an image structure. + * + * The returned data array is allocated with @c new[] and must be freed with a @c delete[] call. + * + * @param img The input image. + * @param y_flip Should the data in the array be Y flipped? + * + * @return The data array. + */ +uint8_t* unorm8x4_array_from_astc_img( + const astcenc_image* img, + bool y_flip); + +/* ============================================================================ + Functions for printing build info and help messages +============================================================================ */ + +/** + * @brief Print the tool copyright and version header to stdout. + */ +void astcenc_print_header(); + +/** + * @brief Print the tool copyright, version, and short-form help to stdout. + */ +void astcenc_print_shorthelp(); + +/** + * @brief Print the tool copyright, version, and long-form help to stdout. + */ +void astcenc_print_longhelp(); + +/** + * @brief Compute error metrics comparing two images. + * + * @param compute_hdr_metrics True if HDR metrics should be computed. + * @param compute_normal_metrics True if normal map metrics should be computed. + * @param input_components The number of input color components. + * @param img1 The original image. + * @param img2 The compressed image. + * @param fstop_lo The low exposure fstop (HDR only). + * @param fstop_hi The high exposure fstop (HDR only). + */ +void compute_error_metrics( + bool compute_hdr_metrics, + bool compute_normal_metrics, + int input_components, + const astcenc_image* img1, + const astcenc_image* img2, + int fstop_lo, + int fstop_hi); + +/** + * @brief Get the current time. + * + * @return The current time in seconds since arbitrary epoch. + */ +double get_time(); + +/** + * @brief Get the number of CPU cores. + * + * @return The number of online or onlineable CPU cores in the system. + */ +int get_cpu_count(); + +/** + * @brief Launch N worker threads and wait for them to complete. + * + * All threads run the same thread function, and have the same thread payload, but are given a + * unique thread ID (0 .. N-1) as a parameter to the run function to allow thread-specific behavior. + * + * @param operation The name of the operation for this async task. + * @param thread_count The number of threads to spawn. + * @param func The function to execute. Must have the signature: + * void (int thread_count, int thread_id, void* payload) + * @param payload Pointer to an opaque thread payload object. + */ +void launch_threads( + const char* operation, + int thread_count, + void (*func)(int, int, void*), + void *payload); + +/** + * @brief Set the current thread name to a string value. + * + * For portability strings should be no longer than 16 characters. + * + * @param name The thread name. + */ +void set_thread_name( + const char* name); + +/** + * @brief The main entry point. + * + * @param argc The number of arguments. + * @param argv The vector of arguments. + * + * @return 0 on success, non-zero otherwise. + */ +int astcenc_main( + int argc, + char **argv); + +#endif diff --git a/ktx/external/astc-encoder/Source/astcenccli_platform_dependents.cpp b/ktx/external/astc-encoder/Source/astcenccli_platform_dependents.cpp new file mode 100644 index 0000000..cc364bc --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenccli_platform_dependents.cpp @@ -0,0 +1,309 @@ +// 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Platform-specific function implementations. + * + * This module contains functions with strongly OS-dependent implementations: + * + * * CPU count queries + * * Threading + * * Time + * + * In addition to the basic thread abstraction (which is native pthreads on + * all platforms, except Windows where it is an emulation of pthreads), a + * utility function to create N threads and wait for them to complete a batch + * task has also been provided. + */ + +#include "astcenccli_internal.h" + +/* ============================================================================ + Platform code for Windows using the Win32 APIs. +============================================================================ */ +#if defined(_WIN32) && !defined(__CYGWIN__) + +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include +#include +#include +#include + +/** @brief Alias pthread_t to one of the internal Windows types. */ +typedef HANDLE pthread_t; + +/** @brief Alias pthread_attr_t to one of the internal Windows types. */ +typedef int pthread_attr_t; + +/** + * @brief Proxy Windows @c CreateThread underneath a pthreads-like wrapper. + */ +static int pthread_create( + pthread_t* thread, + const pthread_attr_t* attribs, + void* (*threadfunc)(void*), + void* thread_arg +) { + static_cast(attribs); + LPTHREAD_START_ROUTINE func = reinterpret_cast(threadfunc); + *thread = CreateThread(nullptr, 0, func, thread_arg, 0, nullptr); + + // Ensure we return 0 on success, non-zero on error + if (*thread == NULL) + { + return 1; + } + + return 0; +} + +/** + * @brief Manually set CPU group and thread affinity. + * + * This is needed on Windows 10 or older to allow benefit from large core count + * systems with more than 64 logical CPUs. The assignment is skipped on systems + * with a single processor group, as it is not necessary. + */ +static void set_group_affinity( + pthread_t thread, + int thread_index +) { + // Skip thread assignment for hardware with a single CPU group + int group_count = GetActiveProcessorGroupCount(); + if (group_count == 1) + { + return; + } + + // Ensure we have a valid assign if user creates more threads than cores + int assign_index = thread_index % get_cpu_count(); + int assign_group { 0 }; + int assign_group_cpu_count { 0 }; + + // Determine which core group and core in the group to use for this thread + int group_cpu_count_sum { 0 }; + for (int group = 0; group < group_count; group++) + { + int group_cpu_count = static_cast(GetMaximumProcessorCount(group)); + group_cpu_count_sum += group_cpu_count; + + if (assign_index < group_cpu_count_sum) + { + assign_group = group; + assign_group_cpu_count = group_cpu_count; + break; + } + } + + // Set the affinity to the assigned group, and all supported cores + GROUP_AFFINITY affinity {}; + affinity.Mask = (1 << assign_group_cpu_count) - 1; + affinity.Group = assign_group; + SetThreadGroupAffinity(thread, &affinity, nullptr); +} + +/** + * @brief Proxy Windows @c WaitForSingleObject underneath a pthreads-like wrapper. + */ +static int pthread_join( + pthread_t thread, + void** value +) { + static_cast(value); + WaitForSingleObject(thread, INFINITE); + return 0; +} + +/* See header for documentation */ +int get_cpu_count() +{ + DWORD cpu_count = GetActiveProcessorCount(ALL_PROCESSOR_GROUPS); + return static_cast(cpu_count); +} + +/* See header for documentation */ +double get_time() +{ + FILETIME tv; + GetSystemTimePreciseAsFileTime(&tv); + unsigned long long ticks = tv.dwHighDateTime; + ticks = (ticks << 32) | tv.dwLowDateTime; + return static_cast(ticks) / 1.0e7; +} + +/* See header for documentation */ +void set_thread_name( + const char* name +) { + // Names are limited to 16 characters + wchar_t wname [16] { 0 }; + size_t name_len = std::strlen(name); + size_t clamp_len = std::min(name_len, 15); + + // We know we only have basic 7-bit ASCII so just widen + for (size_t i = 0; i < clamp_len; i++) + { + wname[i] = static_cast(name[i]); + } + + SetThreadDescription(GetCurrentThread(), wname); +} + +/* ============================================================================ + Platform code for an platform using POSIX APIs. +============================================================================ */ +#else + +#include +#include +#include + +/* See header for documentation */ +int get_cpu_count() +{ + return static_cast(sysconf(_SC_NPROCESSORS_ONLN)); +} + +/* See header for documentation */ +double get_time() +{ + timeval tv; + gettimeofday(&tv, 0); + return static_cast(tv.tv_sec) + static_cast(tv.tv_usec) * 1.0e-6; +} + +/* See header for documentation */ +void set_thread_name( + const char* name +) { + // No standard mechanism, so be defensive here +#if defined(__linux__) + pthread_setname_np(pthread_self(), name); +#elif defined(__APPLE__) + pthread_setname_np(name); +#else + (void)name; +#endif +} + +#endif + +/** + * @brief Worker thread helper payload for launch_threads. + */ +struct launch_desc +{ + /** @brief The native thread handle. */ + pthread_t thread_handle; + /** @brief The total number of threads in the thread pool. */ + int thread_count; + /** @brief The thread index in the thread pool. */ + int thread_id; + /** @brief The user thread function to execute. */ + void (*func)(int, int, void*); + /** @brief The user thread payload. */ + void* payload; +}; + +/** + * @brief Helper function to translate thread entry points. + * + * Convert a (void*) thread entry to an (int, void*) thread entry, where the + * integer contains the thread ID in the thread pool. + * + * @param p The thread launch helper payload. + */ +static void* launch_threads_helper( + void *p +) { + launch_desc* ltd = reinterpret_cast(p); + ltd->func(ltd->thread_count, ltd->thread_id, ltd->payload); + return nullptr; +} + +/* See header for documentation */ +void launch_threads( + const char* operation, + int thread_count, + void (*func)(int, int, void*), + void *payload +) { + // Directly execute single threaded workloads on this thread + if (thread_count <= 1) + { + func(1, 0, payload); + return; + } + + // Otherwise spawn worker threads + launch_desc *thread_descs = new launch_desc[thread_count]; + int actual_thread_count { 0 }; + + for (int i = 0; i < thread_count; i++) + { + thread_descs[actual_thread_count].thread_count = thread_count; + thread_descs[actual_thread_count].thread_id = actual_thread_count; + thread_descs[actual_thread_count].payload = payload; + thread_descs[actual_thread_count].func = func; + + // Handle pthread_create failing by simply using fewer threads + int error = pthread_create( + &(thread_descs[actual_thread_count].thread_handle), + nullptr, + launch_threads_helper, + reinterpret_cast(thread_descs + actual_thread_count)); + + // Track how many threads we actually created + if (!error) + { + // Windows needs explicit thread assignment to handle large core count systems + #if defined(_WIN32) && !defined(__CYGWIN__) + set_group_affinity( + thread_descs[actual_thread_count].thread_handle, + actual_thread_count); + #endif + + actual_thread_count++; + } + } + + // If we did not create thread_count threads then emit a warning + if (actual_thread_count != thread_count) + { + int log_count = actual_thread_count == 0 ? 1 : actual_thread_count; + const char* log_s = log_count == 1 ? "" : "s"; + printf("WARNING: %s using %d thread%s due to thread creation error\n\n", + operation, log_count, log_s); + } + + // If we managed to spawn any threads wait for them to complete + if (actual_thread_count != 0) + { + for (int i = 0; i < actual_thread_count; i++) + { + pthread_join(thread_descs[i].thread_handle, nullptr); + } + } + // Else fall back to using this thread + else + { + func(1, 0, payload); + } + + delete[] thread_descs; +} diff --git a/ktx/external/astc-encoder/Source/astcenccli_toplevel.cpp b/ktx/external/astc-encoder/Source/astcenccli_toplevel.cpp new file mode 100644 index 0000000..cf1fae1 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenccli_toplevel.cpp @@ -0,0 +1,2381 @@ +// 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for codec library front-end. + */ + +#include "astcenc.h" +#include "astcenccli_internal.h" + +#if defined(_WIN32) + #include + #define isatty _isatty +#else + #include +#endif +#include +#include +#include +#include +#include +#include +#include + +/* ============================================================================ + Data structure definitions +============================================================================ */ + +typedef unsigned int astcenc_operation; + +struct mode_entry +{ + const char* opt; + astcenc_operation operation; + astcenc_profile decode_mode; +}; + +/* ============================================================================ + Constants and literals +============================================================================ */ + +/** @brief Stage bit indicating we need to load a compressed image. */ +static const unsigned int ASTCENC_STAGE_LD_COMP = 1 << 0; + +/** @brief Stage bit indicating we need to store a compressed image. */ +static const unsigned int ASTCENC_STAGE_ST_COMP = 1 << 1; + +/** @brief Stage bit indicating we need to load an uncompressed image. */ +static const unsigned int ASTCENC_STAGE_LD_NCOMP = 1 << 2; + +/** @brief Stage bit indicating we need to store an uncompressed image. */ +static const unsigned int ASTCENC_STAGE_ST_NCOMP = 1 << 3; + +/** @brief Stage bit indicating we need compress an image. */ +static const unsigned int ASTCENC_STAGE_COMPRESS = 1 << 4; + +/** @brief Stage bit indicating we need to decompress an image. */ +static const unsigned int ASTCENC_STAGE_DECOMPRESS = 1 << 5; + +/** @brief Stage bit indicating we need to compare an image with the original input. */ +static const unsigned int ASTCENC_STAGE_COMPARE = 1 << 6; + +/** @brief Operation indicating an unknown request (should never happen). */ +static const astcenc_operation ASTCENC_OP_UNKNOWN = 0; + +/** @brief Operation indicating the user wants to print long-form help text and version info. */ +static const astcenc_operation ASTCENC_OP_HELP = 1 << 7; + +/** @brief Operation indicating the user wants to print short-form help text and version info. */ +static const astcenc_operation ASTCENC_OP_VERSION = 1 << 8; + +/** @brief Operation indicating the user wants to compress and store an image. */ +static const astcenc_operation ASTCENC_OP_COMPRESS = + ASTCENC_STAGE_LD_NCOMP | + ASTCENC_STAGE_COMPRESS | + ASTCENC_STAGE_ST_COMP; + +/** @brief Operation indicating the user wants to decompress and store an image. */ +static const astcenc_operation ASTCENC_OP_DECOMPRESS = + ASTCENC_STAGE_LD_COMP | + ASTCENC_STAGE_DECOMPRESS | + ASTCENC_STAGE_ST_NCOMP; + +/** @brief Operation indicating the user wants to test a compression setting on an image. */ +static const astcenc_operation ASTCENC_OP_TEST = + ASTCENC_STAGE_LD_NCOMP | + ASTCENC_STAGE_COMPRESS | + ASTCENC_STAGE_DECOMPRESS | + ASTCENC_STAGE_COMPARE | + ASTCENC_STAGE_ST_NCOMP; + +/** + * @brief Image preprocesing tasks prior to encoding. + */ +enum astcenc_preprocess +{ + /** @brief No image preprocessing. */ + ASTCENC_PP_NONE = 0, + /** @brief Normal vector unit-length normalization. */ + ASTCENC_PP_NORMALIZE, + /** @brief Color data alpha premultiplication. */ + ASTCENC_PP_PREMULTIPLY +}; + +/** @brief Decode table for command line operation modes. */ +static const mode_entry modes[] { + {"-cl", ASTCENC_OP_COMPRESS, ASTCENC_PRF_LDR}, + {"-dl", ASTCENC_OP_DECOMPRESS, ASTCENC_PRF_LDR}, + {"-tl", ASTCENC_OP_TEST, ASTCENC_PRF_LDR}, + {"-cs", ASTCENC_OP_COMPRESS, ASTCENC_PRF_LDR_SRGB}, + {"-ds", ASTCENC_OP_DECOMPRESS, ASTCENC_PRF_LDR_SRGB}, + {"-ts", ASTCENC_OP_TEST, ASTCENC_PRF_LDR_SRGB}, + {"-ch", ASTCENC_OP_COMPRESS, ASTCENC_PRF_HDR_RGB_LDR_A}, + {"-dh", ASTCENC_OP_DECOMPRESS, ASTCENC_PRF_HDR_RGB_LDR_A}, + {"-th", ASTCENC_OP_TEST, ASTCENC_PRF_HDR_RGB_LDR_A}, + {"-cH", ASTCENC_OP_COMPRESS, ASTCENC_PRF_HDR}, + {"-dH", ASTCENC_OP_DECOMPRESS, ASTCENC_PRF_HDR}, + {"-tH", ASTCENC_OP_TEST, ASTCENC_PRF_HDR}, + {"-h", ASTCENC_OP_HELP, ASTCENC_PRF_HDR}, + {"-help", ASTCENC_OP_HELP, ASTCENC_PRF_HDR}, + {"-v", ASTCENC_OP_VERSION, ASTCENC_PRF_HDR}, + {"-version", ASTCENC_OP_VERSION, ASTCENC_PRF_HDR} +}; + +/** + * @brief Compression workload definition for worker threads. + */ +struct compression_workload +{ + astcenc_context* context; + astcenc_image* image; + astcenc_swizzle swizzle; + uint8_t* data_out; + size_t data_len; + astcenc_error error; +}; + +/** + * @brief Decompression workload definition for worker threads. + */ +struct decompression_workload +{ + astcenc_context* context; + uint8_t* data; + size_t data_len; + astcenc_image* image_out; + astcenc_swizzle swizzle; + astcenc_error error; +}; + +/** + * @brief Callback emitting a progress bar + */ +extern "C" void progress_emitter( + float value +) { + const unsigned int bar_size = 25; + unsigned int parts = static_cast(value / 4.0f); + + char buffer[bar_size + 3]; + buffer[0] = '['; + + for (unsigned int i = 0; i < parts; i++) + { + buffer[i + 1] = '='; + } + + for (unsigned int i = parts; i < bar_size; i++) + { + buffer[i + 1] = ' '; + } + + buffer[bar_size + 1] = ']'; + buffer[bar_size + 2] = '\0'; + + printf(" Progress: %s %03.1f%%\r", buffer, static_cast(value)); + fflush(stdout); +} + +/** + * @brief Test if a string argument is a well formed float. + */ +static bool is_float( + std::string target +) { + float test; + std::istringstream stream(target); + + // Leading whitespace is an error + stream >> std::noskipws >> test; + + // Ensure entire no remaining string in addition to parse failure + return stream.eof() && !stream.fail(); +} + +/** + * @brief Test if a string ends with a given suffix. + */ +static bool ends_with( + const std::string& str, + const std::string& suffix +) { + return (str.size() >= suffix.size()) && + (0 == str.compare(str.size() - suffix.size(), suffix.size(), suffix)); +} + +/** + * @brief Runner callback function for a compression worker thread. + * + * @param thread_count The number of threads in the worker pool. + * @param thread_id The index of this thread in the worker pool. + * @param payload The parameters for this thread. + */ +static void compression_workload_runner( + int thread_count, + int thread_id, + void* payload +) { + (void)thread_count; + + char name[16] { 0 }; + std::snprintf(name, 16, "astc workc %d", thread_id); + set_thread_name(name); + + compression_workload* work = static_cast(payload); + astcenc_error error = astcenc_compress_image( + work->context, work->image, &work->swizzle, + work->data_out, work->data_len, thread_id); + + // This is a racy update, so which error gets returned is a random, but it + // will reliably report an error if an error occurs + if (error != ASTCENC_SUCCESS) + { + work->error = error; + } +} + +/** + * @brief Runner callback function for a decompression worker thread. + * + * @param thread_count The number of threads in the worker pool. + * @param thread_id The index of this thread in the worker pool. + * @param payload The parameters for this thread. + */ +static void decompression_workload_runner( + int thread_count, + int thread_id, + void* payload +) { + (void)thread_count; + + char name[16] { 0 }; + std::snprintf(name, 16, "astc workd %d", thread_id); + set_thread_name(name); + + decompression_workload* work = static_cast(payload); + astcenc_error error = astcenc_decompress_image( + work->context, work->data, work->data_len, + work->image_out, &work->swizzle, thread_id); + + // This is a racy update, so which error gets returned is a random, but it + // will reliably report an error if an error occurs + if (error != ASTCENC_SUCCESS) + { + work->error = error; + } +} + +/** + * @brief Utility to generate a slice file name from a pattern. + * + * Convert "foo/bar.png" in to "foo/bar_.png" + * + * @param basename The base pattern; must contain a file extension. + * @param index The slice index. + * @param error Set to true on success, false on error (no extension found). + * + * @return The slice file name. + */ +static std::string get_slice_filename( + const std::string& basename, + unsigned int index, + bool& error +) { + size_t sep = basename.find_last_of('.'); + if (sep == std::string::npos) + { + error = true; + return ""; + } + + std::string base = basename.substr(0, sep); + std::string ext = basename.substr(sep); + std::string name = base + "_" + std::to_string(index) + ext; + error = false; + return name; +} + +/** + * @brief Load a non-astc image file from memory. + * + * @param filename The file to load, or a pattern for array loads. + * @param dim_z The number of slices to load. + * @param y_flip Should this image be Y flipped? + * @param[out] is_hdr Is the loaded image HDR? + * @param[out] component_count The number of components in the loaded image. + * + * @return The astc image file, or nullptr on error. + */ +static astcenc_image* load_uncomp_file( + const char* filename, + unsigned int dim_z, + bool y_flip, + bool& is_hdr, + unsigned int& component_count +) { + astcenc_image *image = nullptr; + + // For a 2D image just load the image directly + if (dim_z == 1) + { + image = load_ncimage(filename, y_flip, is_hdr, component_count); + } + else + { + bool slice_is_hdr; + unsigned int slice_component_count; + astcenc_image* slice = nullptr; + std::vector slices; + + // For a 3D image load an array of slices + for (unsigned int image_index = 0; image_index < dim_z; image_index++) + { + bool error; + std::string slice_name = get_slice_filename(filename, image_index, error); + if (error) + { + print_error("ERROR: Image pattern does not contain file extension: %s\n", filename); + break; + } + + slice = load_ncimage(slice_name.c_str(), y_flip, + slice_is_hdr, slice_component_count); + if (!slice) + { + break; + } + + slices.push_back(slice); + + // Check it is not a 3D image + if (slice->dim_z != 1) + { + print_error("ERROR: Image arrays do not support 3D sources: %s\n", slice_name.c_str()); + break; + } + + // Check slices are consistent with each other + if (image_index != 0) + { + if ((is_hdr != slice_is_hdr) || (component_count != slice_component_count)) + { + print_error("ERROR: Image array[0] and [%d] are different formats\n", image_index); + break; + } + + if ((slices[0]->dim_x != slice->dim_x) || + (slices[0]->dim_y != slice->dim_y) || + (slices[0]->dim_z != slice->dim_z)) + { + print_error("ERROR: Image array[0] and [%d] are different dimensions\n", image_index); + break; + } + } + else + { + is_hdr = slice_is_hdr; + component_count = slice_component_count; + } + } + + // If all slices loaded correctly then repack them into a single image + if (slices.size() == dim_z) + { + unsigned int dim_x = slices[0]->dim_x; + unsigned int dim_y = slices[0]->dim_y; + int bitness = is_hdr ? 16 : 8; + int slice_size = dim_x * dim_y; + + image = alloc_image(bitness, dim_x, dim_y, dim_z); + + // Combine 2D source images into one 3D image + for (unsigned int z = 0; z < dim_z; z++) + { + if (image->data_type == ASTCENC_TYPE_U8) + { + uint8_t* data8 = static_cast(image->data[z]); + uint8_t* data8src = static_cast(slices[z]->data[0]); + size_t copy_size = slice_size * 4 * sizeof(uint8_t); + memcpy(data8, data8src, copy_size); + } + else if (image->data_type == ASTCENC_TYPE_F16) + { + uint16_t* data16 = static_cast(image->data[z]); + uint16_t* data16src = static_cast(slices[z]->data[0]); + size_t copy_size = slice_size * 4 * sizeof(uint16_t); + memcpy(data16, data16src, copy_size); + } + else // if (image->data_type == ASTCENC_TYPE_F32) + { + assert(image->data_type == ASTCENC_TYPE_F32); + float* data32 = static_cast(image->data[z]); + float* data32src = static_cast(slices[z]->data[0]); + size_t copy_size = slice_size * 4 * sizeof(float); + memcpy(data32, data32src, copy_size); + } + } + } + + for (auto &i : slices) + { + free_image(i); + } + } + + return image; +} + +/** + * @brief Parse the command line. + * + * @param argc Command line argument count. + * @param[in] argv Command line argument vector. + * @param[out] operation Codec operation mode. + * @param[out] profile Codec color profile. + * + * @return 0 if everything is okay, 1 if there is some error + */ +static int parse_commandline_options( + int argc, + char **argv, + astcenc_operation& operation, + astcenc_profile& profile +) { + assert(argc >= 2); (void)argc; + + profile = ASTCENC_PRF_LDR; + operation = ASTCENC_OP_UNKNOWN; + + int modes_count = sizeof(modes) / sizeof(modes[0]); + for (int i = 0; i < modes_count; i++) + { + if (!strcmp(modes[i].opt, argv[1])) + { + operation = modes[i].operation; + profile = modes[i].decode_mode; + break; + } + } + + if (operation == ASTCENC_OP_UNKNOWN) + { + print_error("ERROR: Unrecognized operation '%s'\n", argv[1]); + return 1; + } + + return 0; +} + +/** + * @brief Initialize the astcenc_config + * + * @param argc Command line argument count. + * @param[in] argv Command line argument vector. + * @param operation Codec operation mode. + * @param[out] profile Codec color profile. + * @param comp_image Compressed image if a decompress operation. + * @param[out] preprocess Image preprocess operation. + * @param[out] config Codec configuration. + * + * @return 0 if everything is okay, 1 if there is some error + */ +static int init_astcenc_config( + int argc, + char **argv, + astcenc_profile profile, + astcenc_operation operation, + astc_compressed_image& comp_image, + astcenc_preprocess& preprocess, + astcenc_config& config +) { + unsigned int block_x = 0; + unsigned int block_y = 0; + unsigned int block_z = 1; + + // For decode the block size is set by the incoming image. + if (operation == ASTCENC_OP_DECOMPRESS) + { + block_x = comp_image.block_x; + block_y = comp_image.block_y; + block_z = comp_image.block_z; + } + + float quality = 0.0f; + preprocess = ASTCENC_PP_NONE; + + // parse the command line's encoding options. + int argidx = 4; + if (operation & ASTCENC_STAGE_COMPRESS) + { + // Read and decode block size + if (argc < 5) + { + print_error("ERROR: Block size must be specified\n"); + return 1; + } + + int cnt2D, cnt3D; + int dimensions = sscanf(argv[4], "%ux%u%nx%u%n", + &block_x, &block_y, &cnt2D, &block_z, &cnt3D); + // Character after the last match should be a NUL + if (!(((dimensions == 2) && !argv[4][cnt2D]) || ((dimensions == 3) && !argv[4][cnt3D]))) + { + print_error("ERROR: Block size '%s' is invalid\n", argv[4]); + return 1; + } + + // Read and decode search quality + if (argc < 6) + { + print_error("ERROR: Search quality level must be specified\n"); + return 1; + } + + if (!strcmp(argv[5], "-fastest")) + { + quality = ASTCENC_PRE_FASTEST; + } + else if (!strcmp(argv[5], "-fast")) + { + quality = ASTCENC_PRE_FAST; + } + else if (!strcmp(argv[5], "-medium")) + { + quality = ASTCENC_PRE_MEDIUM; + } + else if (!strcmp(argv[5], "-thorough")) + { + quality = ASTCENC_PRE_THOROUGH; + } + else if (!strcmp(argv[5], "-verythorough")) + { + quality = ASTCENC_PRE_VERYTHOROUGH; + } + else if (!strcmp(argv[5], "-exhaustive")) + { + quality = ASTCENC_PRE_EXHAUSTIVE; + } + else if (is_float(argv[5])) + { + quality = static_cast(atof(argv[5])); + } + else + { + print_error("ERROR: Search quality/preset '%s' is invalid\n", argv[5]); + return 1; + } + + argidx = 6; + } + + unsigned int flags = 0; + + // Gather the flags that we need + while (argidx < argc) + { + if (!strcmp(argv[argidx], "-a")) + { + // Skip over the data value for now + argidx++; + flags |= ASTCENC_FLG_USE_ALPHA_WEIGHT; + } + else if (!strcmp(argv[argidx], "-normal")) + { + flags |= ASTCENC_FLG_MAP_NORMAL; + } + else if (!strcmp(argv[argidx], "-decode_unorm8")) + { + flags |= ASTCENC_FLG_USE_DECODE_UNORM8; + } + else if (!strcmp(argv[argidx], "-rgbm")) + { + // Skip over the data value for now + argidx++; + flags |= ASTCENC_FLG_MAP_RGBM; + } + else if (!strcmp(argv[argidx], "-perceptual")) + { + flags |= ASTCENC_FLG_USE_PERCEPTUAL; + } + else if (!strcmp(argv[argidx], "-pp-normalize")) + { + if (preprocess != ASTCENC_PP_NONE) + { + print_error("ERROR: Only a single image preprocess can be used\n"); + return 1; + } + preprocess = ASTCENC_PP_NORMALIZE; + } + else if (!strcmp(argv[argidx], "-pp-premultiply")) + { + if (preprocess != ASTCENC_PP_NONE) + { + print_error("ERROR: Only a single image preprocess can be used\n"); + return 1; + } + preprocess = ASTCENC_PP_PREMULTIPLY; + } + argidx ++; + } + +#if defined(ASTCENC_DECOMPRESS_ONLY) + flags |= ASTCENC_FLG_DECOMPRESS_ONLY; +#else + // Decompression can skip some memory allocation, but need full tables + if (operation == ASTCENC_OP_DECOMPRESS) + { + flags |= ASTCENC_FLG_DECOMPRESS_ONLY; + } + // Compression and test passes can skip some decimation initialization + // as we know we are decompressing images that were compressed using the + // same settings and heuristics ... + else + { + flags |= ASTCENC_FLG_SELF_DECOMPRESS_ONLY; + } +#endif + + astcenc_error status = astcenc_config_init(profile, block_x, block_y, block_z, + quality, flags, &config); + if (status == ASTCENC_ERR_BAD_BLOCK_SIZE) + { + print_error("ERROR: Block size '%s' is invalid\n", argv[4]); + return 1; + } + else if (status == ASTCENC_ERR_BAD_DECODE_MODE) + { + print_error("ERROR: Decode_unorm8 is not supported by HDR profiles\n", argv[4]); + return 1; + } + else if (status == ASTCENC_ERR_BAD_CPU_FLOAT) + { + print_error("ERROR: astcenc must not be compiled with -ffast-math\n"); + return 1; + } + else if (status != ASTCENC_SUCCESS) + { + print_error("ERROR: Init config failed with %s\n", astcenc_get_error_string(status)); + return 1; + } + + return 0; +} + +/** + * @brief Edit the astcenc_config + * + * @param argc Command line argument count. + * @param[in] argv Command line argument vector. + * @param operation Codec operation. + * @param[out] cli_config Command line config. + * @param[in,out] config Codec configuration. + * + * @return 0 if everything is OK, 1 if there is some error + */ +static int edit_astcenc_config( + int argc, + char **argv, + const astcenc_operation operation, + cli_config_options& cli_config, + astcenc_config& config +) { + + int argidx = (operation & ASTCENC_STAGE_COMPRESS) ? 6 : 4; + + while (argidx < argc) + { + if (!strcmp(argv[argidx], "-silent")) + { + argidx++; + cli_config.silentmode = 1; + } + else if (!strcmp(argv[argidx], "-cw")) + { + argidx += 5; + if (argidx > argc) + { + print_error("ERROR: -cw switch with less than 4 arguments\n"); + return 1; + } + + config.cw_r_weight = static_cast(atof(argv[argidx - 4])); + config.cw_g_weight = static_cast(atof(argv[argidx - 3])); + config.cw_b_weight = static_cast(atof(argv[argidx - 2])); + config.cw_a_weight = static_cast(atof(argv[argidx - 1])); + } + else if (!strcmp(argv[argidx], "-a")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -a switch with no argument\n"); + return 1; + } + + config.a_scale_radius = atoi(argv[argidx - 1]); + } + else if (!strcmp(argv[argidx], "-esw")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -esw switch with no argument\n"); + return 1; + } + + if (strlen(argv[argidx - 1]) != 4) + { + print_error("ERROR: -esw pattern does not contain 4 characters\n"); + return 1; + } + + astcenc_swz swizzle_components[4]; + for (int i = 0; i < 4; i++) + { + switch (argv[argidx - 1][i]) + { + case 'r': + swizzle_components[i] = ASTCENC_SWZ_R; + break; + case 'g': + swizzle_components[i] = ASTCENC_SWZ_G; + break; + case 'b': + swizzle_components[i] = ASTCENC_SWZ_B; + break; + case 'a': + swizzle_components[i] = ASTCENC_SWZ_A; + break; + case '0': + swizzle_components[i] = ASTCENC_SWZ_0; + break; + case '1': + swizzle_components[i] = ASTCENC_SWZ_1; + break; + default: + print_error("ERROR: -esw component '%c' is not valid\n", argv[argidx - 1][i]); + return 1; + } + } + + cli_config.swz_encode.r = swizzle_components[0]; + cli_config.swz_encode.g = swizzle_components[1]; + cli_config.swz_encode.b = swizzle_components[2]; + cli_config.swz_encode.a = swizzle_components[3]; + } + else if (!strcmp(argv[argidx], "-ssw")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -ssw switch with no argument\n"); + return 1; + } + + size_t char_count = strlen(argv[argidx - 1]); + if (char_count == 0) + { + print_error("ERROR: -ssw pattern contains no characters\n"); + return 1; + } + + if (char_count > 4) + { + print_error("ERROR: -ssw pattern contains more than 4 characters\n"); + return 1; + } + + bool found_r = false; + bool found_g = false; + bool found_b = false; + bool found_a = false; + + for (size_t i = 0; i < char_count; i++) + { + switch (argv[argidx - 1][i]) + { + case 'r': + found_r = true; + break; + case 'g': + found_g = true; + break; + case 'b': + found_b = true; + break; + case 'a': + found_a = true; + break; + default: + print_error("ERROR: -ssw component '%c' is not valid\n", argv[argidx - 1][i]); + return 1; + } + } + + config.cw_r_weight = found_r ? 1.0f : 0.0f; + config.cw_g_weight = found_g ? 1.0f : 0.0f; + config.cw_b_weight = found_b ? 1.0f : 0.0f; + config.cw_a_weight = found_a ? 1.0f : 0.0f; + } + else if (!strcmp(argv[argidx], "-dsw")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -dsw switch with no argument\n"); + return 1; + } + + if (strlen(argv[argidx - 1]) != 4) + { + print_error("ERROR: -dsw switch does not contain 4 characters\n"); + return 1; + } + + astcenc_swz swizzle_components[4]; + for (int i = 0; i < 4; i++) + { + switch (argv[argidx - 1][i]) + { + case 'r': + swizzle_components[i] = ASTCENC_SWZ_R; + break; + case 'g': + swizzle_components[i] = ASTCENC_SWZ_G; + break; + case 'b': + swizzle_components[i] = ASTCENC_SWZ_B; + break; + case 'a': + swizzle_components[i] = ASTCENC_SWZ_A; + break; + case '0': + swizzle_components[i] = ASTCENC_SWZ_0; + break; + case '1': + swizzle_components[i] = ASTCENC_SWZ_1; + break; + case 'z': + swizzle_components[i] = ASTCENC_SWZ_Z; + break; + default: + print_error("ERROR: ERROR: -dsw component '%c' is not valid\n", argv[argidx - 1][i]); + return 1; + } + } + + cli_config.swz_decode.r = swizzle_components[0]; + cli_config.swz_decode.g = swizzle_components[1]; + cli_config.swz_decode.b = swizzle_components[2]; + cli_config.swz_decode.a = swizzle_components[3]; + } + // presets begin here + else if (!strcmp(argv[argidx], "-normal")) + { + argidx++; + + cli_config.swz_encode.r = ASTCENC_SWZ_R; + cli_config.swz_encode.g = ASTCENC_SWZ_R; + cli_config.swz_encode.b = ASTCENC_SWZ_R; + cli_config.swz_encode.a = ASTCENC_SWZ_G; + + cli_config.swz_decode.r = ASTCENC_SWZ_R; + cli_config.swz_decode.g = ASTCENC_SWZ_A; + cli_config.swz_decode.b = ASTCENC_SWZ_Z; + cli_config.swz_decode.a = ASTCENC_SWZ_1; + } + else if (!strcmp(argv[argidx], "-rgbm")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -rgbm switch with no argument\n"); + return 1; + } + + config.rgbm_m_scale = static_cast(atof(argv[argidx - 1])); + config.cw_a_weight = 2.0f * config.rgbm_m_scale; + } + else if (!strcmp(argv[argidx], "-decode_unorm8")) + { + argidx++; + } + else if (!strcmp(argv[argidx], "-perceptual")) + { + argidx++; + } + else if (!strcmp(argv[argidx], "-pp-normalize")) + { + argidx++; + } + else if (!strcmp(argv[argidx], "-pp-premultiply")) + { + argidx++; + } + else if (!strcmp(argv[argidx], "-blockmodelimit")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -blockmodelimit switch with no argument\n"); + return 1; + } + + config.tune_block_mode_limit = atoi(argv[argidx - 1]); + } + else if (!strcmp(argv[argidx], "-partitioncountlimit")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -partitioncountlimit switch with no argument\n"); + return 1; + } + + config.tune_partition_count_limit = atoi(argv[argidx - 1]); + } + else if (!strcmp(argv[argidx], "-2partitionindexlimit")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -2partitionindexlimit switch with no argument\n"); + return 1; + } + + config.tune_2partition_index_limit = atoi(argv[argidx - 1]); + } + else if (!strcmp(argv[argidx], "-3partitionindexlimit")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -3partitionindexlimit switch with no argument\n"); + return 1; + } + + config.tune_3partition_index_limit = atoi(argv[argidx - 1]); + } + else if (!strcmp(argv[argidx], "-4partitionindexlimit")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -4partitionindexlimit switch with no argument\n"); + return 1; + } + + config.tune_4partition_index_limit = atoi(argv[argidx - 1]); + } + else if (!strcmp(argv[argidx], "-2partitioncandidatelimit")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -2partitioncandidatelimit switch with no argument\n"); + return 1; + } + + config.tune_2partitioning_candidate_limit = atoi(argv[argidx - 1]); + } + else if (!strcmp(argv[argidx], "-3partitioncandidatelimit")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -3partitioncandidatelimit switch with no argument\n"); + return 1; + } + + config.tune_3partitioning_candidate_limit = atoi(argv[argidx - 1]); + } + else if (!strcmp(argv[argidx], "-4partitioncandidatelimit")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -4partitioncandidatelimit switch with no argument\n"); + return 1; + } + + config.tune_4partitioning_candidate_limit = atoi(argv[argidx - 1]); + } + else if (!strcmp(argv[argidx], "-dblimit")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -dblimit switch with no argument\n"); + return 1; + } + + if ((config.profile == ASTCENC_PRF_LDR) || (config.profile == ASTCENC_PRF_LDR_SRGB)) + { + config.tune_db_limit = static_cast(atof(argv[argidx - 1])); + } + } + else if (!strcmp(argv[argidx], "-2partitionlimitfactor")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -2partitionlimitfactor switch with no argument\n"); + return 1; + } + + config.tune_2partition_early_out_limit_factor = static_cast(atof(argv[argidx - 1])); + } + else if (!strcmp(argv[argidx], "-3partitionlimitfactor")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -3partitionlimitfactor switch with no argument\n"); + return 1; + } + + config.tune_3partition_early_out_limit_factor = static_cast(atof(argv[argidx - 1])); + } + else if (!strcmp(argv[argidx], "-2planelimitcorrelation")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -2planelimitcorrelation switch with no argument\n"); + return 1; + } + + config.tune_2plane_early_out_limit_correlation = static_cast(atof(argv[argidx - 1])); + } + else if (!strcmp(argv[argidx], "-refinementlimit")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -refinementlimit switch with no argument\n"); + return 1; + } + + config.tune_refinement_limit = atoi(argv[argidx - 1]); + } + else if (!strcmp(argv[argidx], "-candidatelimit")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -candidatelimit switch with no argument\n"); + return 1; + } + + config.tune_candidate_limit = atoi(argv[argidx - 1]); + } + else if (!strcmp(argv[argidx], "-j")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -j switch with no argument\n"); + return 1; + } + + cli_config.thread_count = atoi(argv[argidx - 1]); + } + else if (!strcmp(argv[argidx], "-repeats")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -repeats switch with no argument\n"); + return 1; + } + + cli_config.repeat_count = atoi(argv[argidx - 1]); + if (cli_config.repeat_count <= 0) + { + print_error("ERROR: -repeats value must be at least one\n"); + return 1; + } + } + else if (!strcmp(argv[argidx], "-yflip")) + { + argidx++; + cli_config.y_flip = 1; + } + else if (!strcmp(argv[argidx], "-mpsnr")) + { + argidx += 3; + if (argidx > argc) + { + print_error("ERROR: -mpsnr switch with less than 2 arguments\n"); + return 1; + } + + cli_config.low_fstop = atoi(argv[argidx - 2]); + cli_config.high_fstop = atoi(argv[argidx - 1]); + if (cli_config.high_fstop < cli_config.low_fstop) + { + print_error("ERROR: -mpsnr switch is greater than the \n"); + return 1; + } + } + // Option: Encode a 3D image from a sequence of 2D images. + else if (!strcmp(argv[argidx], "-zdim")) + { + // Only supports compressing + if (!(operation & ASTCENC_STAGE_COMPRESS)) + { + print_error("ERROR: -zdim switch is only valid for compression\n"); + return 1; + } + + // Image depth must be specified. + if (argidx + 2 > argc) + { + print_error("ERROR: -zdim switch with no argument\n"); + return 1; + } + argidx++; + + // Read array size (image depth). + if (!sscanf(argv[argidx], "%u", &cli_config.array_size) || cli_config.array_size == 0) + { + print_error("ERROR: -zdim size '%s' is invalid\n", argv[argidx]); + return 1; + } + + if ((cli_config.array_size > 1) && (config.block_z == 1)) + { + print_error("ERROR: -zdim with 3D input data for a 2D output format\n"); + return 1; + } + argidx++; + } +#if defined(ASTCENC_DIAGNOSTICS) + else if (!strcmp(argv[argidx], "-dtrace")) + { + argidx += 2; + if (argidx > argc) + { + print_error("ERROR: -dtrace switch with no argument\n"); + return 1; + } + + config.trace_file_path = argv[argidx - 1]; + } +#endif + else if (!strcmp(argv[argidx], "-dimage")) + { + argidx += 1; + cli_config.diagnostic_images = true; + } + else // check others as well + { + print_error("ERROR: Argument '%s' not recognized\n", argv[argidx]); + return 1; + } + } + + if (cli_config.thread_count <= 0) + { + cli_config.thread_count = get_cpu_count(); + } + +#if defined(ASTCENC_DIAGNOSTICS) + // Force single threaded for diagnostic builds + cli_config.thread_count = 1; + + if (!config.trace_file_path) + { + print_error("ERROR: Diagnostics builds must set -dtrace\n"); + return 1; + } +#endif + + return 0; +} + +/** + * @brief Print the config settings in a human readable form. + * + * @param[in] cli_config Command line config. + * @param[in] config Codec configuration. + */ +static void print_astcenc_config( + const cli_config_options& cli_config, + const astcenc_config& config +) { + // Print all encoding settings unless specifically told otherwise + if (!cli_config.silentmode) + { + printf("Compressor settings\n"); + printf("===================\n\n"); + + switch (config.profile) + { + case ASTCENC_PRF_LDR: + printf(" Color profile: LDR linear\n"); + break; + case ASTCENC_PRF_LDR_SRGB: + printf(" Color profile: LDR sRGB\n"); + break; + case ASTCENC_PRF_HDR_RGB_LDR_A: + printf(" Color profile: HDR RGB + LDR A\n"); + break; + case ASTCENC_PRF_HDR: + printf(" Color profile: HDR RGBA\n"); + break; + } + + if (config.block_z == 1) + { + printf(" Block size: %ux%u\n", config.block_x, config.block_y); + } + else + { + printf(" Block size: %ux%ux%u\n", config.block_x, config.block_y, config.block_z); + } + + printf(" Bitrate: %3.2f bpp\n", 128.0 / (config.block_x * config.block_y * config.block_z)); + printf(" RGB alpha scale weight: %d\n", (config.flags & ASTCENC_FLG_USE_ALPHA_WEIGHT)); + if ((config.flags & ASTCENC_FLG_USE_ALPHA_WEIGHT)) + { + printf(" Radius RGB alpha scale: %u texels\n", config.a_scale_radius); + } + + printf(" R component weight: %g\n", static_cast(config.cw_r_weight)); + printf(" G component weight: %g\n", static_cast(config.cw_g_weight)); + printf(" B component weight: %g\n", static_cast(config.cw_b_weight)); + printf(" A component weight: %g\n", static_cast(config.cw_a_weight)); + printf(" Partition cutoff: %u partitions\n", config.tune_partition_count_limit); + printf(" 2 partition index cutoff: %u partition ids\n", config.tune_2partition_index_limit); + printf(" 3 partition index cutoff: %u partition ids\n", config.tune_3partition_index_limit); + printf(" 4 partition index cutoff: %u partition ids\n", config.tune_4partition_index_limit); + printf(" PSNR cutoff: %g dB\n", static_cast(config.tune_db_limit)); + printf(" 3 partition cutoff: %g\n", static_cast(config.tune_2partition_early_out_limit_factor)); + printf(" 4 partition cutoff: %g\n", static_cast(config.tune_3partition_early_out_limit_factor)); + printf(" 2 plane correlation cutoff: %g\n", static_cast(config.tune_2plane_early_out_limit_correlation)); + printf(" Block mode centile cutoff: %g%%\n", static_cast(config.tune_block_mode_limit)); + printf(" Candidate cutoff: %u candidates\n", config.tune_candidate_limit); + printf(" Refinement cutoff: %u iterations\n", config.tune_refinement_limit); + printf(" Compressor thread count: %d\n", cli_config.thread_count); + printf("\n"); + } +} + +/** + * @brief Get the value of a single pixel in an image. + * + * Note, this implementation is not particularly optimal as it puts format + * checks in the inner-most loop. For the CLI preprocess passes this is deemed + * acceptable as these are not performance critical paths. + * + * @param[in] img The output image. + * @param x The pixel x coordinate. + * @param y The pixel y coordinate. + * @param z The pixel z coordinate. + * + * @return pixel The pixel color value to write. + */ +static vfloat4 image_get_pixel( + const astcenc_image& img, + unsigned int x, + unsigned int y, + unsigned int z +) { + // We should never escape bounds + assert(x < img.dim_x); + assert(y < img.dim_y); + assert(z < img.dim_z); + + if (img.data_type == ASTCENC_TYPE_U8) + { + uint8_t* data = static_cast(img.data[z]); + + float r = data[(4 * img.dim_x * y) + (4 * x )] / 255.0f; + float g = data[(4 * img.dim_x * y) + (4 * x + 1)] / 255.0f; + float b = data[(4 * img.dim_x * y) + (4 * x + 2)] / 255.0f; + float a = data[(4 * img.dim_x * y) + (4 * x + 3)] / 255.0f; + + return vfloat4(r, g, b, a); + } + else if (img.data_type == ASTCENC_TYPE_F16) + { + uint16_t* data = static_cast(img.data[z]); + + vint4 colori( + data[(4 * img.dim_x * y) + (4 * x )], + data[(4 * img.dim_x * y) + (4 * x + 1)], + data[(4 * img.dim_x * y) + (4 * x + 2)], + data[(4 * img.dim_x * y) + (4 * x + 3)] + ); + + return float16_to_float(colori); + } + else // if (img.data_type == ASTCENC_TYPE_F32) + { + assert(img.data_type == ASTCENC_TYPE_F32); + float* data = static_cast(img.data[z]); + + return vfloat4( + data[(4 * img.dim_x * y) + (4 * x )], + data[(4 * img.dim_x * y) + (4 * x + 1)], + data[(4 * img.dim_x * y) + (4 * x + 2)], + data[(4 * img.dim_x * y) + (4 * x + 3)] + ); + } +} + +/** + * @brief Set the value of a single pixel in an image. + * + * @param[out] img The output image; must use F32 texture components. + * @param x The pixel x coordinate. + * @param y The pixel y coordinate. + * @param z The pixel z coordinate. + * @param pixel The pixel color value to write. + */ +static void image_set_pixel( + astcenc_image& img, + unsigned int x, + unsigned int y, + unsigned int z, + vfloat4 pixel +) { + // We should never escape bounds + assert(x < img.dim_x); + assert(y < img.dim_y); + assert(z < img.dim_z); + assert(img.data_type == ASTCENC_TYPE_F32); + + float* data = static_cast(img.data[z]); + + data[(4 * img.dim_x * y) + (4 * x )] = pixel.lane<0>(); + data[(4 * img.dim_x * y) + (4 * x + 1)] = pixel.lane<1>(); + data[(4 * img.dim_x * y) + (4 * x + 2)] = pixel.lane<2>(); + data[(4 * img.dim_x * y) + (4 * x + 3)] = pixel.lane<3>(); +} + +/** + * @brief Set the value of a single pixel in an image. + * + * @param[out] img The output image; must use F32 texture components. + * @param x The pixel x coordinate. + * @param y The pixel y coordinate. + * @param pixel The pixel color value to write. + */ +static void image_set_pixel_u8( + astcenc_image& img, + size_t x, + size_t y, + vint4 pixel +) { + // We should never escape bounds + assert(x < img.dim_x); + assert(y < img.dim_y); + assert(img.data_type == ASTCENC_TYPE_U8); + + uint8_t* data = static_cast(img.data[0]); + pack_and_store_low_bytes(pixel, data + (4 * img.dim_x * y) + (4 * x)); +} + +/** + * @brief Create a copy of @c input with forced unit-length normal vectors. + * + * It is assumed that all normal vectors are stored in the RGB components, and + * stored in a packed unsigned range of [0,1] which must be unpacked prior + * normalization. Data must then be repacked into this form for handing over to + * the core codec. + * + * @param[in] input The input image. + * @param[out] output The output image, must use F32 components. + */ +static void image_preprocess_normalize( + const astcenc_image& input, + astcenc_image& output +) { + for (unsigned int z = 0; z < input.dim_z; z++) + { + for (unsigned int y = 0; y < input.dim_y; y++) + { + for (unsigned int x = 0; x < input.dim_x; x++) + { + vfloat4 pixel = image_get_pixel(input, x, y, z); + + // Stash alpha component and zero + float a = pixel.lane<3>(); + pixel.set_lane<3>(0.0f); + + // Decode [0,1] normals to [-1,1] + pixel.set_lane<0>((pixel.lane<0>() * 2.0f) - 1.0f); + pixel.set_lane<1>((pixel.lane<1>() * 2.0f) - 1.0f); + pixel.set_lane<2>((pixel.lane<2>() * 2.0f) - 1.0f); + + // Normalize pixel and restore alpha + pixel = normalize(pixel); + pixel.set_lane<3>(a); + + // Encode [-1,1] normals to [0,1] + pixel.set_lane<0>((pixel.lane<0>() + 1.0f) / 2.0f); + pixel.set_lane<1>((pixel.lane<1>() + 1.0f) / 2.0f); + pixel.set_lane<2>((pixel.lane<2>() + 1.0f) / 2.0f); + + image_set_pixel(output, x, y, z, pixel); + } + } + } +} + +/** + * @brief Linearize an sRGB value. + * + * @return The linearized value. + */ +static float srgb_to_linear( + float a +) { + if (a <= 0.04045f) + { + return a * (1.0f / 12.92f); + } + + return powf((a + 0.055f) * (1.0f / 1.055f), 2.4f); +} + +/** + * @brief sRGB gamma-encode a linear value. + * + * @return The gamma encoded value. + */ +static float linear_to_srgb( + float a +) { + if (a <= 0.0031308f) + { + return a * 12.92f; + } + + return 1.055f * powf(a, 1.0f / 2.4f) - 0.055f; +} + +/** + * @brief Create a copy of @c input with premultiplied color data. + * + * If we are compressing sRGB data we linearize the data prior to + * premultiplication and re-gamma-encode afterwards. + * + * @param[in] input The input image. + * @param[out] output The output image, must use F32 components. + * @param profile The encoding profile. + */ +static void image_preprocess_premultiply( + const astcenc_image& input, + astcenc_image& output, + astcenc_profile profile +) { + for (unsigned int z = 0; z < input.dim_z; z++) + { + for (unsigned int y = 0; y < input.dim_y; y++) + { + for (unsigned int x = 0; x < input.dim_x; x++) + { + vfloat4 pixel = image_get_pixel(input, x, y, z); + + // Linearize sRGB + if (profile == ASTCENC_PRF_LDR_SRGB) + { + pixel.set_lane<0>(srgb_to_linear(pixel.lane<0>())); + pixel.set_lane<1>(srgb_to_linear(pixel.lane<1>())); + pixel.set_lane<2>(srgb_to_linear(pixel.lane<2>())); + } + + // Premultiply pixel in linear-space + pixel.set_lane<0>(pixel.lane<0>() * pixel.lane<3>()); + pixel.set_lane<1>(pixel.lane<1>() * pixel.lane<3>()); + pixel.set_lane<2>(pixel.lane<2>() * pixel.lane<3>()); + + // Gamma-encode sRGB + if (profile == ASTCENC_PRF_LDR_SRGB) + { + pixel.set_lane<0>(linear_to_srgb(pixel.lane<0>())); + pixel.set_lane<1>(linear_to_srgb(pixel.lane<1>())); + pixel.set_lane<2>(linear_to_srgb(pixel.lane<2>())); + } + + image_set_pixel(output, x, y, z, pixel); + } + } + } +} + +/** + * @brief Populate a single diagnostic image showing aspects of the encoding. + * + * @param context The context to use. + * @param image The compressed image to analyze. + * @param diag_image The output visualization image to populate. + * @param texel_func The per-texel callback used to determine output color. + */ +static void print_diagnostic_image( + astcenc_context* context, + const astc_compressed_image& image, + astcenc_image& diag_image, + std::function texel_func +) { + size_t block_cols = (image.dim_x + image.block_x - 1) / image.block_x; + size_t block_rows = (image.dim_y + image.block_y - 1) / image.block_y; + + uint8_t* data = image.data; + for (size_t block_y = 0; block_y < block_rows; block_y++) + { + for (size_t block_x = 0; block_x < block_cols; block_x++) + { + astcenc_block_info block_info; + astcenc_get_block_info(context, data, &block_info); + data += 16; + + size_t start_row = block_y * image.block_y; + size_t start_col = block_x * image.block_x; + + size_t end_row = astc::min(start_row + image.block_y, static_cast(image.dim_y)); + size_t end_col = astc::min(start_col + image.block_x, static_cast(image.dim_x)); + + for (size_t texel_y = start_row; texel_y < end_row; texel_y++) + { + for (size_t texel_x = start_col; texel_x < end_col; texel_x++) + { + vint4 color = texel_func(block_info, texel_x - start_col, texel_y - start_row); + image_set_pixel_u8(diag_image, texel_x, texel_y, color); + } + } + } + } +} + +/** + * @brief Print a set of diagnostic images showing aspects of the encoding. + * + * @param context The context to use. + * @param image The compressed image to analyze. + * @param output_file The output file name to use as a stem for new names. + */ +static void print_diagnostic_images( + astcenc_context* context, + const astc_compressed_image& image, + const std::string& output_file +) { + if (image.dim_z != 1) + { + return; + } + + // Try to find a file extension we know about + size_t index = output_file.find_last_of("."); + std::string stem = output_file; + if (index != std::string::npos) + { + stem = stem.substr(0, index); + } + + auto diag_image = alloc_image(8, image.dim_x, image.dim_y, image.dim_z); + + // ---- ---- ---- ---- Partitioning ---- ---- ---- ---- + auto partition_func = [](astcenc_block_info& info, size_t texel_x, size_t texel_y) { + const vint4 colors[] { + vint4( 0, 0, 0, 255), + vint4(255, 0, 0, 255), + vint4( 0, 255, 0, 255), + vint4( 0, 0, 255, 255), + vint4(255, 255, 255, 255) + }; + + size_t texel_index = texel_y * info.block_x + texel_x; + + int partition { 0 }; + if (!info.is_constant_block) + { + partition = info.partition_assignment[texel_index] + 1; + } + + return colors[partition]; + }; + + print_diagnostic_image(context, image, *diag_image, partition_func); + std::string fname = stem + "_diag_partitioning.png"; + store_ncimage(diag_image, fname.c_str(), false); + + // ---- ---- ---- ---- Weight planes ---- ---- ---- ---- + auto texel_func1 = [](astcenc_block_info& info, size_t texel_x, size_t texel_y) { + (void)texel_x; + (void)texel_y; + + const vint4 colors[] { + vint4( 0, 0, 0, 255), + vint4(255, 0, 0, 255), + vint4( 0, 255, 0, 255), + vint4( 0, 0, 255, 255), + vint4(255, 255, 255, 255) + }; + + int component { 0 }; + if (info.is_dual_plane_block) + { + component = info.dual_plane_component + 1; + } + + return colors[component]; + }; + + print_diagnostic_image(context, image, *diag_image, texel_func1); + fname = stem + "_diag_weight_plane2.png"; + store_ncimage(diag_image, fname.c_str(), false); + + // ---- ---- ---- ---- Weight density ---- ---- ---- ---- + auto texel_func2 = [](astcenc_block_info& info, size_t texel_x, size_t texel_y) { + (void)texel_x; + (void)texel_y; + + float density = 0.0f; + if (!info.is_constant_block) + { + float texel_count = static_cast(info.block_x * info.block_y); + float weight_count = static_cast(info.weight_x * info.weight_y); + density = weight_count / texel_count; + } + + int densityi = static_cast(255.0f * density); + return vint4(densityi, densityi, densityi, 255); + }; + + print_diagnostic_image(context, image, *diag_image, texel_func2); + fname = stem + "_diag_weight_density.png"; + store_ncimage(diag_image, fname.c_str(), false); + + // ---- ---- ---- ---- Weight quant ---- ---- ---- ---- + auto texel_func3 = [](astcenc_block_info& info, size_t texel_x, size_t texel_y) { + (void)texel_x; + (void)texel_y; + + int quant { 0 }; + if (!info.is_constant_block) + { + quant = info.weight_level_count - 1; + } + + return vint4(quant, quant, quant, 255); + }; + + print_diagnostic_image(context, image, *diag_image, texel_func3); + fname = stem + "_diag_weight_quant.png"; + store_ncimage(diag_image, fname.c_str(), false); + + // ---- ---- ---- ---- Color quant ---- ---- ---- ---- + auto texel_func4 = [](astcenc_block_info& info, size_t texel_x, size_t texel_y) { + (void)texel_x; + (void)texel_y; + + int quant { 0 }; + if (!info.is_constant_block) + { + quant = info.color_level_count - 1; + } + + return vint4(quant, quant, quant, 255); + }; + + print_diagnostic_image(context, image, *diag_image, texel_func4); + fname = stem + "_diag_color_quant.png"; + store_ncimage(diag_image, fname.c_str(), false); + + // ---- ---- ---- ---- Color endpoint mode: Index ---- ---- ---- ---- + auto texel_func5 = [](astcenc_block_info& info, size_t texel_x, size_t texel_y) { + (void)texel_x; + (void)texel_y; + + size_t texel_index = texel_y * info.block_x + texel_x; + + int cem { 255 }; + if (!info.is_constant_block) + { + uint8_t partition = info.partition_assignment[texel_index]; + cem = info.color_endpoint_modes[partition] * 16; + } + + return vint4(cem, cem, cem, 255); + }; + + print_diagnostic_image(context, image, *diag_image, texel_func5); + fname = stem + "_diag_cem_index.png"; + store_ncimage(diag_image, fname.c_str(), false); + + // ---- ---- ---- ---- Color endpoint mode: Components ---- ---- ---- ---- + auto texel_func6 = [](astcenc_block_info& info, size_t texel_x, size_t texel_y) { + (void)texel_x; + (void)texel_y; + + const vint4 colors[] { + vint4( 0, 0, 0, 255), + vint4(255, 0, 0, 255), + vint4( 0, 255, 0, 255), + vint4( 0, 0, 255, 255), + vint4(255, 255, 255, 255) + }; + + size_t texel_index = texel_y * info.block_x + texel_x; + + int components { 0 }; + if (!info.is_constant_block) + { + uint8_t partition = info.partition_assignment[texel_index]; + uint8_t cem = info.color_endpoint_modes[partition]; + + switch (cem) + { + case 0: + case 1: + case 2: + case 3: + components = 1; + break; + case 4: + case 5: + components = 2; + break; + case 6: + case 7: + case 8: + case 9: + case 11: + components = 3; + break; + default: + components = 4; + break; + } + } + + return colors[components]; + }; + + print_diagnostic_image(context, image, *diag_image, texel_func6); + fname = stem + "_diag_cem_components.png"; + store_ncimage(diag_image, fname.c_str(), false); + + // ---- ---- ---- ---- Color endpoint mode: Style ---- ---- ---- ---- + auto texel_func7 = [](astcenc_block_info& info, size_t texel_x, size_t texel_y) { + (void)texel_x; + (void)texel_y; + + const vint4 colors[] { + vint4( 0, 0, 0, 255), + vint4(255, 0, 0, 255), + vint4( 0, 255, 0, 255), + vint4( 0, 0, 255, 255), + }; + + size_t texel_index = texel_y * info.block_x + texel_x; + + int style { 0 }; + if (!info.is_constant_block) + { + uint8_t partition = info.partition_assignment[texel_index]; + uint8_t cem = info.color_endpoint_modes[partition]; + + switch (cem) + { + // Direct - two absolute endpoints + case 0: + case 1: + case 2: + case 3: + case 4: + case 8: + case 11: + case 12: + case 14: + case 15: + style = 1; + break; + // Offset - one absolute plus delta + case 5: + case 9: + case 13: + style = 2; + break; + // Scale - one absolute plus scale + case 6: + case 7: + case 10: + style = 3; + break; + // Shouldn't happen ... + default: + style = 0; + break; + } + } + + return colors[style]; + }; + + print_diagnostic_image(context, image, *diag_image, texel_func7); + fname = stem + "_diag_cem_style.png"; + store_ncimage(diag_image, fname.c_str(), false); + + // ---- ---- ---- ---- Color endpoint mode: Style ---- ---- ---- ---- + auto texel_func8 = [](astcenc_block_info& info, size_t texel_x, size_t texel_y) { + (void)texel_x; + (void)texel_y; + + size_t texel_index = texel_y * info.block_x + texel_x; + + int style { 0 }; + if (!info.is_constant_block) + { + uint8_t partition = info.partition_assignment[texel_index]; + uint8_t cem = info.color_endpoint_modes[partition]; + + switch (cem) + { + // LDR blocks + case 0: + case 1: + case 4: + case 5: + case 6: + case 8: + case 9: + case 10: + case 12: + case 13: + style = 128; + break; + // HDR blocks + default: + style = 155; + break; + } + } + + return vint4(style, style, style, 255); + }; + + print_diagnostic_image(context, image, *diag_image, texel_func8); + fname = stem + "_diag_cem_hdr.png"; + store_ncimage(diag_image, fname.c_str(), false); + + free_image(diag_image); +} + +/** + * @brief The main entry point. + * + * @param argc The number of arguments. + * @param argv The vector of arguments. + * + * @return 0 on success, non-zero otherwise. + */ +int astcenc_main( + int argc, + char **argv +) { + set_thread_name("astc main"); + + double start_time = get_time(); + + if (argc < 2) + { + astcenc_print_shorthelp(); + return 0; + } + + astcenc_operation operation; + astcenc_profile profile; + int error = parse_commandline_options(argc, argv, operation, profile); + if (error) + { + return 1; + } + + switch (operation) + { + case ASTCENC_OP_HELP: + astcenc_print_longhelp(); + return 0; + case ASTCENC_OP_VERSION: + astcenc_print_header(); + return 0; + default: + break; + } + + std::string input_filename = argc >= 3 ? argv[2] : ""; + std::string output_filename = argc >= 4 ? argv[3] : ""; + + if (input_filename.empty()) + { + print_error("ERROR: Input file not specified\n"); + return 1; + } + + if (output_filename.empty()) + { + print_error("ERROR: Output file not specified\n"); + return 1; + } + + // TODO: Handle RAII resources so they get freed when out of scope + // Load the compressed input file if needed + + // This has to come first, as the block size is in the file header + astc_compressed_image image_comp {}; + if (operation & ASTCENC_STAGE_LD_COMP) + { + if (ends_with(input_filename, ".astc")) + { + error = load_cimage(input_filename.c_str(), image_comp); + if (error) + { + return 1; + } + } + else if (ends_with(input_filename, ".ktx")) + { + bool is_srgb; + error = load_ktx_compressed_image(input_filename.c_str(), is_srgb, image_comp); + if (error) + { + return 1; + } + + if (is_srgb && (profile != ASTCENC_PRF_LDR_SRGB)) + { + printf("WARNING: Input file is sRGB, but decompressing as linear\n"); + } + + if (!is_srgb && (profile == ASTCENC_PRF_LDR_SRGB)) + { + printf("WARNING: Input file is linear, but decompressing as sRGB\n"); + } + } + else + { + print_error("ERROR: Unknown compressed input file type\n"); + return 1; + } + } + + astcenc_config config {}; + astcenc_preprocess preprocess; + error = init_astcenc_config(argc, argv, profile, operation, image_comp, preprocess, config); + if (error) + { + return 1; + } + + // Initialize cli_config_options with default values + cli_config_options cli_config { 0, 1, 1, false, false, false, -10, 10, + { ASTCENC_SWZ_R, ASTCENC_SWZ_G, ASTCENC_SWZ_B, ASTCENC_SWZ_A }, + { ASTCENC_SWZ_R, ASTCENC_SWZ_G, ASTCENC_SWZ_B, ASTCENC_SWZ_A } }; + + error = edit_astcenc_config(argc, argv, operation, cli_config, config); + if (error) + { + return 1; + } + + // Enable progress callback if not in silent mode and using a terminal + #if defined(_WIN32) + int stdoutfno = _fileno(stdout); + #else + int stdoutfno = STDOUT_FILENO; + #endif + + if ((!cli_config.silentmode) && isatty(stdoutfno)) + { + config.progress_callback = progress_emitter; + } + + astcenc_image* image_uncomp_in = nullptr ; + unsigned int image_uncomp_in_component_count = 0; + bool image_uncomp_in_is_hdr = false; + astcenc_image* image_decomp_out = nullptr; + + // Determine decompression output bitness, if limited by file type + int out_bitness = 0; + if (operation & ASTCENC_STAGE_DECOMPRESS) + { + out_bitness = get_output_filename_enforced_bitness(output_filename.c_str()); + if (out_bitness == 0) + { + bool is_hdr = (config.profile == ASTCENC_PRF_HDR) || + (config.profile == ASTCENC_PRF_HDR_RGB_LDR_A); + out_bitness = is_hdr ? 16 : 8; + } + + // If decompressed output is unorm8 then force the decode_unorm8 heuristics for compression + if (out_bitness == 8) + { + config.flags |= ASTCENC_FLG_USE_DECODE_UNORM8; + } + } + + // TODO: Handle RAII resources so they get freed when out of scope + astcenc_error codec_status; + astcenc_context* codec_context; + + // Preflight - check we have valid extensions for storing a file + if (operation & ASTCENC_STAGE_ST_NCOMP) + { + int bitness = get_output_filename_enforced_bitness(output_filename.c_str()); + if (bitness < 0) + { + const char *eptr = strrchr(output_filename.c_str(), '.'); + eptr = eptr ? eptr : ""; + print_error("ERROR: Unknown uncompressed output file type '%s'\n", eptr); + return 1; + } + } + + if (operation & ASTCENC_STAGE_ST_COMP) + { +#if defined(_WIN32) + bool is_null = output_filename == "NUL" || output_filename == "nul"; +#else + bool is_null = output_filename == "/dev/null"; +#endif + + if (!(is_null || ends_with(output_filename, ".astc") || ends_with(output_filename, ".ktx"))) + { + const char *eptr = strrchr(output_filename.c_str(), '.'); + eptr = eptr ? eptr : ""; + print_error("ERROR: Unknown compressed output file type '%s'\n", eptr); + return 1; + } + } + + codec_status = astcenc_context_alloc(&config, cli_config.thread_count, &codec_context); + if (codec_status != ASTCENC_SUCCESS) + { + print_error("ERROR: Codec context alloc failed: %s\n", astcenc_get_error_string(codec_status)); + return 1; + } + + // Load the uncompressed input file if needed + if (operation & ASTCENC_STAGE_LD_NCOMP) + { + image_uncomp_in = load_uncomp_file( + input_filename.c_str(), cli_config.array_size, cli_config.y_flip, + image_uncomp_in_is_hdr, image_uncomp_in_component_count); + if (!image_uncomp_in) + { + print_error("ERROR: Failed to load uncompressed image file\n"); + return 1; + } + + + if (preprocess != ASTCENC_PP_NONE) + { + // Allocate a float image so we can avoid additional quantization, + // as e.g. premultiplication can result in fractional color values + astcenc_image* image_pp = alloc_image(32, + image_uncomp_in->dim_x, + image_uncomp_in->dim_y, + image_uncomp_in->dim_z); + if (!image_pp) + { + print_error("ERROR: Failed to allocate preprocessed image\n"); + return 1; + } + + if (preprocess == ASTCENC_PP_NORMALIZE) + { + image_preprocess_normalize(*image_uncomp_in, *image_pp); + } + + if (preprocess == ASTCENC_PP_PREMULTIPLY) + { + image_preprocess_premultiply(*image_uncomp_in, *image_pp, + config.profile); + } + + // Delete the original as we no longer need it + free_image(image_uncomp_in); + image_uncomp_in = image_pp; + } + + if (!cli_config.silentmode) + { + printf("Source image\n"); + printf("============\n\n"); + printf(" Source: %s\n", input_filename.c_str()); + printf(" Color profile: %s\n", image_uncomp_in_is_hdr ? "HDR" : "LDR"); + if (image_uncomp_in->dim_z > 1) + { + printf(" Dimensions: 3D, %ux%ux%u\n", + image_uncomp_in->dim_x, image_uncomp_in->dim_y, image_uncomp_in->dim_z); + } + else + { + printf(" Dimensions: 2D, %ux%u\n", + image_uncomp_in->dim_x, image_uncomp_in->dim_y); + } + printf(" Components: %d\n\n", image_uncomp_in_component_count); + } + } + + double image_size = 0.0; + if (image_uncomp_in) + { + image_size = static_cast(image_uncomp_in->dim_x) * + static_cast(image_uncomp_in->dim_y) * + static_cast(image_uncomp_in->dim_z); + } + else + { + image_size = static_cast(image_comp.dim_x) * + static_cast(image_comp.dim_y) * + static_cast(image_comp.dim_z); + } + + // Compress an image + double best_compression_time = 100000.0; + double total_compression_time = 0.0; + if (operation & ASTCENC_STAGE_COMPRESS) + { + print_astcenc_config(cli_config, config); + + unsigned int blocks_x = (image_uncomp_in->dim_x + config.block_x - 1) / config.block_x; + unsigned int blocks_y = (image_uncomp_in->dim_y + config.block_y - 1) / config.block_y; + unsigned int blocks_z = (image_uncomp_in->dim_z + config.block_z - 1) / config.block_z; + size_t buffer_size = blocks_x * blocks_y * blocks_z * 16; + uint8_t* buffer = new uint8_t[buffer_size]; + + compression_workload work; + work.context = codec_context; + work.image = image_uncomp_in; + work.swizzle = cli_config.swz_encode; + work.data_out = buffer; + work.data_len = buffer_size; + work.error = ASTCENC_SUCCESS; + + // Only launch worker threads for multi-threaded use - it makes basic + // single-threaded profiling and debugging a little less convoluted + double start_compression_time = get_time(); + for (unsigned int i = 0; i < cli_config.repeat_count; i++) + { + if (config.progress_callback) + { + printf("Compression\n"); + printf("===========\n"); + printf("\n"); + } + + double start_iter_time = get_time(); + if (cli_config.thread_count > 1) + { + launch_threads("Compression", cli_config.thread_count, compression_workload_runner, &work); + } + else + { + work.error = astcenc_compress_image( + work.context, work.image, &work.swizzle, + work.data_out, work.data_len, 0); + } + + astcenc_compress_reset(codec_context); + + if (config.progress_callback) + { + printf("\n\n"); + } + + double iter_time = get_time() - start_iter_time; + best_compression_time = astc::min(iter_time, best_compression_time); + } + total_compression_time = get_time() - start_compression_time; + + if (work.error != ASTCENC_SUCCESS) + { + print_error("ERROR: Codec compress failed: %s\n", astcenc_get_error_string(work.error)); + return 1; + } + + image_comp.block_x = config.block_x; + image_comp.block_y = config.block_y; + image_comp.block_z = config.block_z; + image_comp.dim_x = image_uncomp_in->dim_x; + image_comp.dim_y = image_uncomp_in->dim_y; + image_comp.dim_z = image_uncomp_in->dim_z; + image_comp.data = buffer; + image_comp.data_len = buffer_size; + } + + // Decompress an image + double best_decompression_time = 100000.0; + double total_decompression_time = 0.0; + if (operation & ASTCENC_STAGE_DECOMPRESS) + { + image_decomp_out = alloc_image( + out_bitness, image_comp.dim_x, image_comp.dim_y, image_comp.dim_z); + + decompression_workload work; + work.context = codec_context; + work.data = image_comp.data; + work.data_len = image_comp.data_len; + work.image_out = image_decomp_out; + work.swizzle = cli_config.swz_decode; + work.error = ASTCENC_SUCCESS; + + // Only launch worker threads for multi-threaded use - it makes basic + // single-threaded profiling and debugging a little less convoluted + double start_decompression_time = get_time(); + for (unsigned int i = 0; i < cli_config.repeat_count; i++) + { + double start_iter_time = get_time(); + if (cli_config.thread_count > 1) + { + launch_threads("Decompression", cli_config.thread_count, decompression_workload_runner, &work); + } + else + { + work.error = astcenc_decompress_image( + work.context, work.data, work.data_len, + work.image_out, &work.swizzle, 0); + } + + astcenc_decompress_reset(codec_context); + + double iter_time = get_time() - start_iter_time; + best_decompression_time = astc::min(iter_time, best_decompression_time); + } + total_decompression_time = get_time() - start_decompression_time; + + if (work.error != ASTCENC_SUCCESS) + { + print_error("ERROR: Codec decompress failed: %s\n", + astcenc_get_error_string(work.error)); + return 1; + } + } + +#if defined(_WIN32) + bool is_null = output_filename == "NUL" || output_filename == "nul"; +#else + bool is_null = output_filename == "/dev/null"; +#endif + + // Print metrics in comparison mode + if (operation & ASTCENC_STAGE_COMPARE) + { + bool is_normal_map = config.flags & ASTCENC_FLG_MAP_NORMAL; + + compute_error_metrics( + image_uncomp_in_is_hdr, is_normal_map, image_uncomp_in_component_count, + image_uncomp_in, image_decomp_out, cli_config.low_fstop, cli_config.high_fstop); + } + + // Store compressed image + if (operation & ASTCENC_STAGE_ST_COMP) + { + if (ends_with(output_filename, ".astc")) + { + error = store_cimage(image_comp, output_filename.c_str()); + if (error) + { + print_error("ERROR: Failed to store compressed image\n"); + return 1; + } + } + else if (ends_with(output_filename, ".ktx")) + { + bool srgb = profile == ASTCENC_PRF_LDR_SRGB; + error = store_ktx_compressed_image(image_comp, output_filename.c_str(), srgb); + if (error) + { + print_error("ERROR: Failed to store compressed image\n"); + return 1; + } + } + else + { + if (!is_null) + { + print_error("ERROR: Unknown compressed output file type\n"); + return 1; + } + } + } + + // Store decompressed image + if (operation & ASTCENC_STAGE_ST_NCOMP) + { + if (!is_null) + { + bool store_result = store_ncimage(image_decomp_out, output_filename.c_str(), + cli_config.y_flip); + if (!store_result) + { + print_error("ERROR: Failed to write output image %s\n", output_filename.c_str()); + return 1; + } + } + } + + // Store diagnostic images + if (cli_config.diagnostic_images && !is_null) + { + print_diagnostic_images(codec_context, image_comp, output_filename); + } + + free_image(image_uncomp_in); + free_image(image_decomp_out); + astcenc_context_free(codec_context); + + delete[] image_comp.data; + + if ((operation & ASTCENC_STAGE_COMPARE) || (!cli_config.silentmode)) + { + double end_time = get_time(); + + double repeats = static_cast(cli_config.repeat_count); + double avg_compression_time = total_compression_time / repeats; + double avg_decompression_time = total_decompression_time / repeats; + double total_time = (end_time - start_time) - ((repeats - 1.0) * avg_compression_time) - ((repeats - 1.0) * avg_decompression_time); + + printf("Performance metrics\n"); + printf("===================\n\n"); + printf(" Total time: %8.4f s\n", total_time); + + if (operation & ASTCENC_STAGE_COMPRESS) + { + double compression_rate = image_size / (best_compression_time * 1000000.0); + + printf(" Coding time: %8.4f s\n", best_compression_time); + printf(" Coding rate: %8.4f MT/s\n", compression_rate); + } + + if (operation & ASTCENC_STAGE_DECOMPRESS) + { + double decompression_rate = image_size / (best_decompression_time * 1000000.0); + printf(" Decoding time: %8.4f s\n", best_decompression_time); + printf(" Decoding rate: %8.4f MT/s\n", decompression_rate); + } + } + + return 0; +} diff --git a/ktx/external/astc-encoder/Source/astcenccli_toplevel_help.cpp b/ktx/external/astc-encoder/Source/astcenccli_toplevel_help.cpp new file mode 100644 index 0000000..f475b39 --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenccli_toplevel_help.cpp @@ -0,0 +1,610 @@ +// 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions for printing build info and help messages. + */ + +#include "astcenccli_internal.h" +#include "astcenccli_version.h" + +/** @brief The version header. */ +static const char *astcenc_copyright_string = +R"(astcenc v%s, %u-bit %s%s%s +Copyright (c) 2011-%s Arm Limited. All rights reserved. +)"; + +/** @brief The short-form help text. */ +static const char *astcenc_short_help = +R"( +Basic usage: + +To compress an image use: + astcenc {-cl|-cs|-ch|-cH} [options] + +e.g. using LDR profile, 8x6 blocks, and the thorough quality preset: + astcenc -cl kodim01.png kodim01.astc 8x6 -thorough + +To decompress an image use: + astcenc {-dl|-ds|-dh|-dH} + +e.g. using LDR profile: + astcenc -dl kodim01.astc kodim01.png + +To perform a compression test, writing back the decompressed output, use: + astcenc {-tl|-ts|-th|-tH} [options] + +e.g. using LDR profile, 8x6 blocks, and the thorough quality preset: + astcenc -tl kodim01.png kodim01-test.png 8x6 -thorough + +The -*l options are used to configure the codec to support only the linear +LDR profile, preventing use of the HDR encoding features. + +The -*s options are used to configure the codec to support only +the sRGB LDR profile, preventing use of the HDR encoding features. Input +texture data must be encoded in the sRGB colorspace for this option to +provide correct output results. + +The -*h/-*H options are used to configure the codec to support the HDR ASTC +color profile. Textures compressed with this profile may fail to decompress +correctly on GPU hardware without HDR profile support. The -*h options +configure the compressor for HDR RGB components and an LDR alpha component. +The -*H options configure the compressor for HDR across all 4 components. + +For full help documentation run 'astcenc -help'. +)"; + +/** @brief The long-form help text. */ +static const char *astcenc_long_help = R"( +NAME + astcenc - compress or decompress images using the ASTC format + +SYNOPSIS + astcenc {-h|-help} + astcenc {-v|-version} + astcenc {-cl|-cs|-ch|-cH} [options] + astcenc {-dl|-ds|-dh|-dH} [options] + astcenc {-tl|-ts|-th|-tH} [options] + +DESCRIPTION + astcenc compresses image files into the Adaptive Scalable Texture + Compression (ASTC) image format, a lossy compression format design + for use in real-time graphics applications. It is a fully featured + compressor implementation, supporting all of the compression + profiles and block sizes specified by the ASTC format: + + All color profiles (LDR linear, LDR sRGB, and HDR) + All 2D block sizes (4x4 though to 12x12) + All 3D block sizes (3x3x3 through to 6x6x6) + + The compressor provides a flexible quality level, allowing users to + trade off compressed image quality against compression performance. + For ease of use, a number of quality presets are also provided. For + advanced users the compressor provides many additional control + options for fine tuning quality. + + astcenc can also be used to decompress ASTC compressed images, and + perform compression image quality analysis. + +COMPRESSION + To compress an image using the ASTC format you must specify the + color profile, the input file name, the output file name, the target + block size, and the quality preset. + + The color profile is specified using the -cl (LDR linear), -cs (LDR + sRGB), -ch (HDR RGB, LDR A), or -cH (HDR RGBA) encoder options. Note + that not all GPUs implementing ASTC support the HDR profile. + + The input file path must match a valid file format for compression, + and the output file format must be a valid output for compression. + See the FILE FORMATS section for the list of supported formats. + + The block size must be a valid ASTC block size. Every block + compresses into 128 bits of compressed output, so the block size + determines the compressed data bitrate. + + Supported 2D block sizes are: + + 4x4: 8.00 bpp 10x5: 2.56 bpp + 5x4: 6.40 bpp 10x6: 2.13 bpp + 5x5: 5.12 bpp 8x8: 2.00 bpp + 6x5: 4.27 bpp 10x8: 1.60 bpp + 6x6: 3.56 bpp 10x10: 1.28 bpp + 8x5: 3.20 bpp 12x10: 1.07 bpp + 8x6: 2.67 bpp 12x12: 0.89 bpp + + Supported 3D block sizes are: + + 3x3x3: 4.74 bpp 5x5x4: 1.28 bpp + 4x3x3: 3.56 bpp 5x5x5: 1.02 bpp + 4x4x3: 2.67 bpp 6x5x5: 0.85 bpp + 4x4x4: 2.00 bpp 6x6x5: 0.71 bpp + 5x4x4: 1.60 bpp 6x6x6: 0.59 bpp + + The quality level configures the quality-performance tradeoff for + the compressor; more complete searches of the search space improve + image quality at the expense of compression time. The quality level + can be set to any value between 0 (fastest) and 100 (exhaustive), + or to a fixed quality preset: + + -fastest (equivalent to quality = 0) + -fast (equivalent to quality = 10) + -medium (equivalent to quality = 60) + -thorough (equivalent to quality = 98) + -verythorough (equivalent to quality = 99) + -exhaustive (equivalent to quality = 100) + + For compression of production content we recommend using a quality + level equivalent to -medium or higher. + + Using quality levels higher than -thorough will significantly + increase compression time, but typically only gives minor quality + improvements. + + There are a number of additional compressor options which are useful + to consider for common usage, based on the type of image data being + compressed. + + -decode_unorm8 + Indicate that an LDR compressed texture will be used with + the decode_unorm8 extension behavior, instead of the default + decode_float16 decompression. + + Matching the decode mode used during compression to the mode + used at runtime will improve image quality as the compressor + can ensure that rounding goes the right way. + + This mode is used automatically if you decompress to an 8-bit + per component output image format. + + -normal + The input texture is a three component linear LDR normal map + storing unit length normals as (R=X, G=Y, B=Z). The output will + be a two component X+Y normal map stored as (RGB=X, A=Y). The Z + component can be recovered programmatically in shader code by + using the equation: + + nml.xy = texture(...).ga; // Load in [0,1] + nml.xy = nml.xy * 2.0 - 1.0; // Unpack to [-1,1] + nml.z = sqrt(1 - dot(nml.xy, nml.xy)); // Compute Z + + Alternative component swizzles can be set with -esw and -dsw + parameters. + + -rgbm + The input texture is an RGBM encoded texture, storing values HDR + values between 0 and in an LDR container format with a + shared multiplier. Shaders reconstruct the HDR value as: + + vec3 hdr_value = tex.rgb * tex.a * max; + + The compression behavior of the ASTC format for RGBM data + requires that the user's RGBM encoding preprocess keeps values + of M above a lower threshold to avoid them quantizing to zero + during compression. We recommend trying 16/255 or 32/255. + + -perceptual + The codec should optimize perceptual error, instead of direct + RMS error. This aims to improves perceived image quality, but + typically lowers the measured PSNR score. Perceptual methods are + currently only available for normal maps and RGB color data. + + -zdim + Load a sequence of 2D image slices to use as a 3D image. + The input filename given is used is decorated with the postfix + "_" to find the file to load. For example, an input named + "input.png" would load as input_0.png, input_1.png, etc. + + -pp-normalize + Run a preprocess over the image that forces normal vectors to + be unit length. Preprocessing applies before any codec encoding + swizzle, so normal data must be in the RGB components in the + source image. + + -pp-premultiply + Run a preprocess over the image that scales RGB components in + the image by the alpha value. Preprocessing applies before any + codec encoding swizzle, so color data must be in the RGB + components in the source image.)" +// This split in the literals is needed for Visual Studio; the compiler +// will concatenate these two strings together ... +R"( + +COMPRESSION TIPS & TRICKS + ASTC is a block-based format that can be prone to block artifacts. + If block artifacts are a problem when compressing a given texture, + increasing the compressor quality preset can help to alleviate the + problem. + + If a texture exhibits severe block artifacts in only some of the + color components, which is a common problem for mask textures, then + using the -cw option to raise the weighting of the affected color + component(s) may help. For example, if the green color component is + particularly badly encoded then try '-cw 1 6 1 1'. + +ADVANCED COMPRESSION + Error weighting options + ----------------------- + + These options provide low-level control of the codec error metric + computation, used to determine what good compression looks like. + + -a + For textures with alpha component, scale per-texel weights by + the alpha value. The alpha value chosen for scaling of any + particular texel is taken as an average across a neighborhood of + the texel defined by the argument. Setting to + 0 causes only the texel's own alpha to be used. + + ASTC blocks that are entirely zero weighted, after the radius is + taken into account, are replaced by constant color blocks. This + is an RDO-like technique to improve compression ratio in any + application packaging compression that is applied. + + -cw + Assign an additional weight scaling to each color component, + allowing the components to be treated differently in terms of + error significance. Set values above 1 to increase a component's + significance, and values below 1 to decrease it. Set to 0 to + exclude a component from error computation. + + -mpsnr + Set the low and high f-stop values for the mPSNR error metric. + The mPSNR error metric only applies to HDR textures. + + Performance-quality tradeoff options + ------------------------------------ + + These options provide low-level control of the codec heuristics that + drive the performance-quality trade off. The presets vary by block + bitrate; the recommended starting point for a 4x4 block is very + different to a 8x8 block. The presets documented here are for the + high bitrate mode (fewer than 25 texels). + + -partitioncountlimit + Test up to and including partitions for each block. + Higher numbers give better quality, as more complex blocks can + be encoded, but will increase search time. Preset defaults are: + + -fastest : 2 + -fast : 3 + -medium : 4 + -thorough : 4 + -verythorough : 4 + -exhaustive : 4 + + -[2|3|4]partitionindexlimit + Estimate errors for block partition indices for this + partition count. Higher numbers give better quality, however + large values give diminishing returns especially for smaller + block sizes. Preset defaults are: + + -fastest : 10 | 6 | 4 + -fast : 18 | 10 | 8 + -medium : 34 | 28 | 16 + -thorough : 82 | 60 | 30 + -verythorough : 256 | 128 | 64 + -exhaustive : 512 | 512 | 512 + + -[2|3|4]partitioncandidatelimit + Calculate errors for block partition indices for this + partition count. Higher numbers give better quality, however + large values give diminishing returns especially for smaller + block sizes. Preset defaults are: + + -fastest : 2 | 2 | 2 + -fast : 2 | 2 | 2 + -medium : 2 | 2 | 2 + -thorough : 3 | 2 | 2 + -verythorough : 20 | 14 | 8 + -exhaustive : 32 | 32 | 32 + + -blockmodelimit + Test block modes below usage centile in an empirically + determined distribution of block mode frequency. This option is + ineffective for 3D textures. Preset defaults are: + + -fastest : 43 + -fast : 55 + -medium : 77 + -thorough : 94 + -verythorough : 98 + -exhaustive : 100 + + -refinementlimit + Iterate refinement iterations on colors and + weights. Minimum value is 1. Preset defaults are: + + -fastest : 2 + -fast : 3 + -medium : 3 + -thorough : 4 + -verythorough : 4 + -exhaustive : 4 + + -candidatelimit + Trial candidate encodings for each block mode: + + -fastest : 2 + -fast : 3 + -medium : 3 + -thorough : 4 + -verythorough : 6 + -exhaustive : 8 + + -dblimit + Stop compression work on a block as soon as the PSNR of the + block, measured in dB, exceeds . This option is + ineffective for HDR textures. Preset defaults, where N is the + number of texels in a block, are: + + -fastest : MAX(63-19*log10(N), 85-35*log10(N)) + -fast : MAX(63-19*log10(N), 85-35*log10(N)) + -medium : MAX(70-19*log10(N), 95-35*log10(N)) + -thorough : MAX(77-19*log10(N), 105-35*log10(N)) + -verythorough : 999 + -exhaustive : 999 + + -[2|3]partitionlimitfactor + Stop compression work on a block after only testing blocks with + up to 2/3 partitions and one plane of weights, unless the 2/3 + partition error term is lower than the error term from encoding + with 1/2 partitions by more than the specified factor. Preset + defaults are: + + -fastest : 1.00 | 1.00 + -fast : 1.00 | 1.00 + -medium : 1.10 | 1.05 + -thorough : 1.35 | 1.15 + -verythrorough : 1.60 | 1.40 + -exhaustive : 2.00 | 2.00 + + -2planelimitcorrelation + Stop compression after testing only one plane of weights, unless + the minimum color correlation factor between any pair of color + components is below this factor. This option is ineffective for + normal maps. Preset defaults are: + + -fastest : 0.50 + -fast : 0.65 + -medium : 0.85 + -thorough : 0.95 + -verythorough : 0.98 + -exhaustive : 0.99 +)" +// This split in the literals is needed for Visual Studio; the compiler +// will concatenate these two strings together ... +R"( + Other options + ------------- + + -esw + Specify an encoding swizzle to reorder the color components + before compression. The swizzle is specified using a four + character string, which defines the format ordering used by + the compressor. + + The characters may be taken from the set [rgba01], selecting + either input color components or a literal zero or one. For + example to swap the RG components, and replace alpha with 1, + the swizzle 'grb1' should be used. + + By default all 4 post-swizzle components are included in the + compression error metrics. When using -esw to map two + component data to the L+A endpoint (e.g. -esw rrrg) the + luminance data stored in the RGB components will be weighted 3 + times more strongly than the alpha component. This can be + corrected using the -ssw option to specify which components + will be sampled at runtime e.g. -ssw ra. + + -ssw + Specify a sampling swizzle to identify which color components + are actually read by the application shader program. For example, + using -ssw ra tells the compressor that the green and blue error + does not matter because the data is not actually read. + + The sampling swizzle is based on the channel ordering after the + -esw transform has been applied. Note -ssw exposes the same + functionality as -cw, but in a more user-friendly form. + + -dsw + Specify a decompression swizzle used to reorder the color + components after decompression. The swizzle is specified using + the same method as the -esw option, with support for an extra + "z" character. This is used to specify that the compressed data + stores an X+Y normal map, and that the Z output component + should be reconstructed from the two components stored in the + data. For the typical ASTC normal encoding, which uses an + 'rrrg' compression swizzle, you should specify an 'raz1' + swizzle for decompression. + + -yflip + Flip the image in the vertical axis prior to compression and + after decompression. Note that using this option in a test mode + (-t*) will have no effect as the image will be flipped twice. + + -j + Explicitly specify the number of threads to use in the codec. If + not specified, the codec will use one thread per CPU detected in + the system. + + -silent + Suppresses all non-essential diagnostic output from the codec. + Error messages will always be printed, as will mandatory outputs + for the selected operation mode. For example, the test mode will + always output image quality metrics and compression time but + will suppress all other output.)" +// This split in the literals is needed for Visual Studio; the compiler +// will concatenate these two strings together ... +R"( + +DECOMPRESSION + To decompress an image stored in the ASTC format you must specify + the color profile, the input file name, and the output file name. + + The color profile is specified using the -dl (LDR linear), -ds (LDR + sRGB), -dh (HDR RGB, LDR A), or -dH (HDR RGBA) decoder options. + + The input file path must match a valid file format for + decompression, and the output file format must be a valid output for + a decompressed image. Note that not all output formats that the + compression path can produce are supported for decompression. See + the FILE FORMATS section for the list of supported formats. + + The -dsw option documented in ADVANCED COMPRESSION option + documentation is also relevant to decompression. + +TEST + To perform a compression test which round-trips a single image + through compression and decompression and stores the decompressed + result back to file, you must specify same settings as COMPRESSION + other than swapping the color profile to select test mode. Note that + the compressed intermediate data is discarded in this mode. + + The color profile is specified using the -tl (LDR linear), -ts (LDR + sRGB), -th (HDR RGB, LDR A), or -tH (HDR RGBA) encoder options. + + This operation mode will print error metrics suitable for either LDR + and HDR images, allowing some assessment of the compression image + quality. + +COMPRESSION FILE FORMATS + The following formats are supported as compression inputs: + + LDR Formats: + BMP (*.bmp) + PNG (*.png) + Targa (*.tga) + JPEG (*.jpg) + + HDR Formats: + OpenEXR (*.exr) + Radiance HDR (*.hdr) + + Container Formats: + Khronos Texture KTX (*.ktx) + DirectDraw Surface DDS (*.dds) + + For the KTX and DDS formats only a subset of the features of the + formats are supported: + + Texture topology must be 2D, 2D-array, 3D, or cube-map. Note + that 2D-array textures are treated as 3D block input. + + Texel format must be R, RG, RGB, BGR, RGBA, BGRA, L, or LA. + + Only the first mipmap in the file will be read. + + The following formats are supported as compression outputs: + + ASTC (*.astc) + Khronos Texture KTX (*.ktx) + + +DECOMPRESSION FILE FORMATS + The following formats are supported as decompression inputs: + + ASTC (*.astc) + Khronos Texture KTX (*.ktx) + + The following formats are supported as decompression outputs: + + LDR Formats: + BMP (*.bmp) + PNG (*.png) + Targa (*.tga) + + HDR Formats: + OpenEXR (*.exr) + Radiance HDR (*.hdr) + + Container Formats: + Khronos Texture KTX (*.ktx) + DirectDraw Surface DDS (*.dds) + +QUICK REFERENCE + + To compress an image use: + astcenc {-cl|-cs|-ch|-cH} [options] + + To decompress an image use: + astcenc {-dl|-ds|-dh|-dH} + + To perform a quality test use: + astcenc {-tl|-ts|-th|-tH} [options] + + Mode -*l = linear LDR, -*s = sRGB LDR, -*h = HDR RGB/LDR A, -*H = HDR. + Quality = -fastest/-fast/-medium/-thorough/-verythorough/-exhaustive/a float [0-100]. +)"; + +/* See header for documentation. */ +void astcenc_print_header() +{ +#if (ASTCENC_AVX == 2) + const char* simdtype = "avx2"; +#elif (ASTCENC_SSE == 41) + const char* simdtype = "sse4.1"; +#elif (ASTCENC_SSE == 20) + const char* simdtype = "sse2"; +#elif (ASTCENC_SVE == 8) + const char* simdtype = "sve.256b"; +#elif (ASTCENC_SVE == 4) + const char* simdtype = "sve.128b"; +#elif (ASTCENC_NEON == 1) + const char* simdtype = "neon"; +#else + const char* simdtype = "none"; +#endif + +#if (ASTCENC_POPCNT == 1) + const char* pcnttype = "+popcnt"; +#else + const char* pcnttype = ""; +#endif + +#if (ASTCENC_F16C == 1) + const char* f16ctype = "+f16c"; +#else + const char* f16ctype = ""; +#endif + + unsigned int bits = static_cast(sizeof(void*) * 8); + printf(astcenc_copyright_string, + VERSION_STRING, bits, simdtype, pcnttype, f16ctype, YEAR_STRING); + + // If possible, print hint that 8-wide SVE could be used +#if ASTCENC_SVE == 4 + if (svcntw() == 8) + { + printf("Note: This CPU can support 256-bit SVE builds.\n"); + } +#endif +} + +/* See header for documentation. */ +void astcenc_print_shorthelp() +{ + astcenc_print_header(); + printf("%s", astcenc_short_help); +} + +/* See header for documentation. */ +void astcenc_print_longhelp() +{ + astcenc_print_header(); + printf("%s", astcenc_long_help); +} diff --git a/ktx/external/astc-encoder/Source/astcenccli_version.h.in b/ktx/external/astc-encoder/Source/astcenccli_version.h.in new file mode 100644 index 0000000..bdacc0a --- /dev/null +++ b/ktx/external/astc-encoder/Source/astcenccli_version.h.in @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2021 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. +// ---------------------------------------------------------------------------- + +/** + * @brief Functions and data declarations. + */ + +#ifndef ASTCENCCLI_VERSION_INCLUDED +#define ASTCENCCLI_VERSION_INCLUDED + +#define VERSION_STRING "@astcencoder_VERSION@" +#define YEAR_STRING "@astcencoder_YEAR@" + +#endif diff --git a/ktx/external/astc-encoder/Source/cmake_compiler.cmake b/ktx/external/astc-encoder/Source/cmake_compiler.cmake new file mode 100644 index 0000000..8b4d671 --- /dev/null +++ b/ktx/external/astc-encoder/Source/cmake_compiler.cmake @@ -0,0 +1,37 @@ +# SPDX-License-Identifier: Apache-2.0 +# ---------------------------------------------------------------------------- +# Copyright 2020-2025 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. +# ---------------------------------------------------------------------------- + +# On CMake 3.25 or older CXX_COMPILER_FRONTEND_VARIANT is not always set +if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "") + set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "${CMAKE_CXX_COMPILER_ID}") +endif() + +# Compiler accepts MSVC-style command line options +set(is_msvc_fe "$") +# Compiler accepts GNU-style command line options +set(is_gnu_fe1 "$") +# Compiler accepts AppleClang-style command line options, which is also GNU-style +set(is_gnu_fe2 "$") +# Compiler accepts GNU-style command line options +set(is_gnu_fe "$") + +# Compiler is Visual Studio cl.exe +set(is_msvccl "$>") +# Compiler is Visual Studio clangcl.exe +set(is_clangcl "$>") +# Compiler is upstream clang with the standard frontend +set(is_clang "$>") diff --git a/ktx/external/astc-encoder/Source/cmake_core.cmake b/ktx/external/astc-encoder/Source/cmake_core.cmake new file mode 100644 index 0000000..a9196b1 --- /dev/null +++ b/ktx/external/astc-encoder/Source/cmake_core.cmake @@ -0,0 +1,528 @@ +# SPDX-License-Identifier: Apache-2.0 +# ---------------------------------------------------------------------------- +# Copyright 2020-2025 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. +# ---------------------------------------------------------------------------- + +set(ASTCENC_TARGET astc${ASTCENC_CODEC}-${ASTCENC_ISA_SIMD}) + +project(${ASTCENC_TARGET}) + +include(cmake_compiler.cmake) + +add_library(${ASTCENC_TARGET}-static + STATIC + astcenc_averages_and_directions.cpp + astcenc_block_sizes.cpp + astcenc_color_quantize.cpp + astcenc_color_unquantize.cpp + astcenc_compress_symbolic.cpp + astcenc_compute_variance.cpp + astcenc_decompress_symbolic.cpp + astcenc_diagnostic_trace.cpp + astcenc_entry.cpp + astcenc_find_best_partitioning.cpp + astcenc_ideal_endpoints_and_weights.cpp + astcenc_image.cpp + astcenc_integer_sequence.cpp + astcenc_mathlib.cpp + astcenc_mathlib_softfloat.cpp + astcenc_partition_tables.cpp + astcenc_percentile_tables.cpp + astcenc_pick_best_endpoint_format.cpp + astcenc_quantization.cpp + astcenc_symbolic_physical.cpp + astcenc_weight_align.cpp + astcenc_weight_quant_xfer_tables.cpp) + +target_include_directories(${ASTCENC_TARGET}-static + PUBLIC + $ + $) + +if(${ASTCENC_SHAREDLIB}) + add_library(${ASTCENC_TARGET}-shared + SHARED + astcenc_averages_and_directions.cpp + astcenc_block_sizes.cpp + astcenc_color_quantize.cpp + astcenc_color_unquantize.cpp + astcenc_compress_symbolic.cpp + astcenc_compute_variance.cpp + astcenc_decompress_symbolic.cpp + astcenc_diagnostic_trace.cpp + astcenc_entry.cpp + astcenc_find_best_partitioning.cpp + astcenc_ideal_endpoints_and_weights.cpp + astcenc_image.cpp + astcenc_integer_sequence.cpp + astcenc_mathlib.cpp + astcenc_mathlib_softfloat.cpp + astcenc_partition_tables.cpp + astcenc_percentile_tables.cpp + astcenc_pick_best_endpoint_format.cpp + astcenc_quantization.cpp + astcenc_symbolic_physical.cpp + astcenc_weight_align.cpp + astcenc_weight_quant_xfer_tables.cpp) + + target_include_directories(${ASTCENC_TARGET}-shared + PUBLIC + $ + $) +endif() + +if(${ASTCENC_CLI}) + # Veneer is compiled without any extended ISA so we can safely do + # ISA compatability checks without triggering a SIGILL + add_library(${ASTCENC_TARGET}-veneer1 + astcenccli_entry.cpp) + + # Veneer is compiled with extended ISA but without vector length overrides + # so we can safely do SVE vector length compatability checks + add_library(${ASTCENC_TARGET}-veneer2 + astcenccli_entry2.cpp) + + add_executable(${ASTCENC_TARGET} + astcenccli_error_metrics.cpp + astcenccli_image.cpp + astcenccli_image_external.cpp + astcenccli_image_load_store.cpp + astcenccli_platform_dependents.cpp + astcenccli_toplevel.cpp + astcenccli_toplevel_help.cpp) + + target_link_libraries(${ASTCENC_TARGET} + PRIVATE + ${ASTCENC_TARGET}-veneer1 + ${ASTCENC_TARGET}-veneer2 + ${ASTCENC_TARGET}-static) +endif() + +macro(astcenc_set_properties ASTCENC_TARGET_NAME ASTCENC_VENEER_TYPE) + + target_compile_features(${ASTCENC_TARGET_NAME} + PRIVATE + cxx_std_14) + + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_msvc_fe}:_CRT_SECURE_NO_WARNINGS>) + + if(${ASTCENC_DECOMPRESSOR}) + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE + ASTCENC_DECOMPRESS_ONLY) + endif() + + if(${ASTCENC_BLOCK_MAX_TEXELS}) + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE + ASTCENC_BLOCK_MAX_TEXELS=${ASTCENC_BLOCK_MAX_TEXELS}) + endif() + + if(${ASTCENC_DIAGNOSTICS}) + target_compile_definitions(${ASTCENC_TARGET_NAME} + PUBLIC + ASTCENC_DIAGNOSTICS) + endif() + + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + # Use pthreads on Linux/macOS + $<$:-pthread> + + # MSVC compiler defines + $<${is_msvc_fe}:/EHsc> + $<$,${is_msvc_fe}>:/WX> + $<${is_msvccl}:/wd4324> + + # G++ and Clang++ compiler defines + $<${is_gnu_fe}:-Wall> + $<${is_gnu_fe}:-Wextra> + $<${is_gnu_fe}:-Wpedantic> + $<$,${is_gnu_fe}>:-Werror> + $<${is_gnu_fe}:-Wshadow> + $<${is_gnu_fe}:-Wdouble-promotion> + $<${is_clang}:-Wdocumentation> + + # Hide noise thrown up by Clang 10 and clang-cl + $<${is_gnu_fe}:-Wno-unknown-warning-option> + $<${is_gnu_fe}:-Wno-c++98-compat-pedantic> + $<${is_gnu_fe}:-Wno-c++98-c++11-compat-pedantic> + $<${is_gnu_fe}:-Wno-float-equal> + $<${is_gnu_fe}:-Wno-deprecated-declarations> + $<${is_gnu_fe}:-Wno-atomic-implicit-seq-cst> + $<${is_clang}:-Wno-overriding-option> + + # Clang 10 also throws up warnings we need to investigate (ours) + $<${is_gnu_fe}:-Wno-cast-align> + $<${is_gnu_fe}:-Wno-sign-conversion> + $<${is_gnu_fe}:-Wno-implicit-int-conversion> + $<${is_gnu_fe}:-Wno-shift-sign-overflow> + $<${is_gnu_fe}:-Wno-format-nonliteral> + $<${is_gnu_fe}:-Wno-reserved-identifier> + $<${is_gnu_fe}:-Wno-cast-function-type> + + # Force DWARF4 for Valgrind profiling + $<$,${is_clang}>:-gdwarf-4> + + # Disable non-portable Windows.h warning (fixing it fails builds on MinGW) + $<$,${is_clang}>:-Wno-nonportable-system-include-path>) + + target_link_options(${ASTCENC_TARGET_NAME} + PRIVATE + # Use pthreads on Linux/macOS + $<$:-pthread>) + + if(${ASTCENC_ASAN}) + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_clang}:-fsanitize=address>) + + target_link_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_clang}:-fsanitize=address>) + endif() + + if(${ASTCENC_UBSAN}) + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_clang}:-fsanitize=undefined>) + + target_link_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_clang}:-fsanitize=undefined>) + endif() + + if(NOT ${ASTCENC_INVARIANCE}) + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE + ASTCENC_NO_INVARIANCE=1) + + # For Visual Studio prior to 2022 (compiler < 19.30) /fp:precise + # For Visual Studio 2022 (compiler >= 19.30) /fp:precise and /fp:contract + + # For Visual Studio 2022 ClangCL seems to have accidentally enabled contraction by default, + # so behaves differently to CL.exe. Use the -Xclang argument to workaround and allow access + # GNU-style switch to control contraction on the assumption this gets fixed and disabled. + # Note ClangCL does not accept /fp:contract as an argument as of v15.0.7. + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_msvccl}:/fp:precise> + $<${is_clangcl}:/fp:precise> + $<$,19.30>>:/fp:contract> + $<$,14.0.0>>:-Xclang -ffp-contract=fast> + $<$,10.0.0>>:-ffp-model=precise> + $<${is_gnu_fe}:-ffp-contract=fast>) + else() + # For Visual Studio prior to 2022 (compiler < 19.30) /fp:strict + # For Visual Studio 2022 (compiler >= 19.30) /fp:precise + + # For Visual Studio 2022 ClangCL seems to have accidentally enabled contraction by default, + # so behaves differently to CL.exe. Use the -Xclang argument to workaround and allow access + # GNU-style switch to control contraction and force disable. + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<$,19.30>>:/fp:strict> + $<$,19.30>>:/fp:precise> + $<${is_clangcl}:/fp:precise> + $<$,14.0.0>>:-Xclang -ffp-contract=off> + $<$,10.0.0>>:-ffp-model=precise> + $<${is_gnu_fe}:-ffp-contract=off>) + endif() + + if(${ASTCENC_CLI}) + # Enable LTO on release builds + set_property(TARGET ${ASTCENC_TARGET_NAME} + PROPERTY + INTERPROCEDURAL_OPTIMIZATION_RELEASE True) + + # Use a static runtime on MSVC builds (ignored on non-MSVC compilers) + set_property(TARGET ${ASTCENC_TARGET_NAME} + PROPERTY + MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + endif() + + # Set up configuration for SIMD ISA builds + if(${ASTCENC_ISA_SIMD} MATCHES "none") + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE + ASTCENC_NEON=0 + ASTCENC_SVE=0 + ASTCENC_SSE=0 + ASTCENC_AVX=0 + ASTCENC_POPCNT=0 + ASTCENC_F16C=0) + + if(${ASTCENC_BIG_ENDIAN}) + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE + ASTCENC_BIG_ENDIAN=1) + endif() + + elseif(${ASTCENC_ISA_SIMD} MATCHES "neon") + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE + ASTCENC_NEON=1 + ASTCENC_SVE=0 + ASTCENC_SSE=0 + ASTCENC_AVX=0 + ASTCENC_POPCNT=0 + ASTCENC_F16C=0) + + # Workaround MSVC codegen bug for NEON builds on VS 2022 17.2 or older + # https://developercommunity.visualstudio.com/t/inlining-turns-constant-into-register-operand-for/1394798 + if((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND (MSVC_VERSION LESS 1933)) + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_msvccl}:/d2ssa-cfg-sink->) + endif() + + elseif(${ASTCENC_ISA_SIMD} MATCHES "sve_256") + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE + ASTCENC_NEON=1 + ASTCENC_SVE=8 + ASTCENC_SSE=0 + ASTCENC_AVX=0 + ASTCENC_POPCNT=0 + ASTCENC_F16C=0) + + # Enable SVE in the core library + if (NOT ${ASTCENC_VENEER_TYPE}) + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + -march=armv8-a+sve -msve-vector-bits=256) + + # Enable SVE without fixed vector length in the veneer + elseif (${ASTCENC_VENEER_TYPE} EQUAL 2) + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + -march=armv8-a+sve) + endif() + + elseif(${ASTCENC_ISA_SIMD} MATCHES "sve_128") + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE + ASTCENC_NEON=1 + ASTCENC_SVE=4 + ASTCENC_SSE=0 + ASTCENC_AVX=0 + ASTCENC_POPCNT=0 + ASTCENC_F16C=0) + + # Enable SVE in the core library + # Note that for 128-bit SVE the generated code is actually + # vector-length agnostic, but any manual intrinsics used in the + # enhanced-NEON library use 128-bit data width predicates + if (NOT ${ASTCENC_VENEER_TYPE}) + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + -march=armv8-a+sve) + + # Enable SVE without fixed vector length in the veneer + elseif (${ASTCENC_VENEER_TYPE} EQUAL 2) + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + -march=armv8-a+sve) + endif() + + elseif(${ASTCENC_ISA_SIMD} MATCHES "sse2") + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE + ASTCENC_NEON=0 + ASTCENC_SVE=0 + ASTCENC_SSE=20 + ASTCENC_AVX=0 + ASTCENC_POPCNT=0 + ASTCENC_F16C=0 + ASTCENC_X86_GATHERS=0) + + # Force SSE2 on AppleClang (normally SSE4.1 is the default) + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_clangcl}:-msse2> + $<${is_gnu_fe}:-msse2> + $<${is_gnu_fe}:-mno-sse4.1> + $<${is_gnu_fe}:-Wno-unused-command-line-argument>) + + elseif(${ASTCENC_ISA_SIMD} MATCHES "sse4.1") + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE + ASTCENC_NEON=0 + ASTCENC_SVE=0 + ASTCENC_SSE=41 + ASTCENC_AVX=0 + ASTCENC_POPCNT=1 + ASTCENC_F16C=0 + ASTCENC_X86_GATHERS=0) + + if (${ASTCENC_VENEER_TYPE} GREATER 0) + # Force SSE2 on AppleClang (normally SSE4.1 is the default) + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_gnu_fe}:-msse2> + $<${is_gnu_fe}:-mno-sse4.1> + $<${is_gnu_fe}:-Wno-unused-command-line-argument>) + else() + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_clangcl}:-msse4.1 -mpopcnt> + $<${is_gnu_fe}:-msse4.1 -mpopcnt> + $<${is_gnu_fe}:-Wno-unused-command-line-argument>) + endif() + + elseif(${ASTCENC_ISA_SIMD} MATCHES "avx2") + # Gathers are quite slow on many x86 microarchitectures, to the point where + # it can be significantly faster to just avoid them use scalar loads. + + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE + ASTCENC_NEON=0 + ASTCENC_SVE=0 + ASTCENC_SSE=41 + ASTCENC_AVX=2 + ASTCENC_X86_GATHERS=$ + ASTCENC_POPCNT=1 + ASTCENC_F16C=1) + + if (${ASTCENC_VENEER_TYPE} GREATER 0) + # Force SSE2 on AppleClang (normally SSE4.1 is the default) + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_gnu_fe}:-msse2> + $<${is_gnu_fe}:-mno-sse4.1> + $<${is_gnu_fe}:-Wno-unused-command-line-argument>) + else() + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_msvc_fe}:/arch:AVX2> + $<${is_clangcl}:-mavx2 -mpopcnt -mf16c> + $<${is_gnu_fe}:-mavx2 -mpopcnt -mf16c> + $<${is_gnu_fe}:-Wno-unused-command-line-argument>) + endif() + + # Non-invariant builds enable us to loosen the compiler constraints on + # floating point, but this is only worth doing on CPUs with AVX2 because + # this implies we can also enable the FMA instruction set extensions + # which significantly improve performance. Note that this DOES reduce + # image quality by up to 0.2 dB (normally much less), but buys an + # average of 10-15% performance improvement ... + if((NOT ${ASTCENC_INVARIANCE}) AND (NOT ${ASTCENC_VENEER_TYPE})) + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_gnu_fe}:-mfma>) + endif() + + elseif(${ASTCENC_ISA_SIMD} MATCHES "native") + target_compile_definitions(${ASTCENC_TARGET_NAME} + PRIVATE) + + if (${ASTCENC_VENEER_TYPE} GREATER 0) + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_gnu_fe}:-Wno-unused-command-line-argument>) + else() + target_compile_options(${ASTCENC_TARGET_NAME} + PRIVATE + $<${is_clangcl}:-mcpu=native -march=native> + $<${is_gnu_fe}:-mcpu=native -march=native> + $<${is_gnu_fe}:-Wno-unused-command-line-argument>) + endif() + endif() + +endmacro() + +string(CONCAT EXTERNAL_CXX_FLAGS + " $<${is_gnu_fe}: -fno-strict-aliasing>" + " $<${is_gnu_fe}: -Wno-pedantic>" + " $<${is_gnu_fe}: -Wno-unused-parameter>" + " $<${is_gnu_fe}: -Wno-old-style-cast>" + " $<${is_gnu_fe}: -Wno-double-promotion>" + " $<${is_gnu_fe}: -Wno-zero-as-null-pointer-constant>" + " $<${is_gnu_fe}: -Wno-disabled-macro-expansion>" + " $<${is_gnu_fe}: -Wno-reserved-id-macro>" + " $<${is_gnu_fe}: -Wno-extra-semi-stmt>" + " $<${is_gnu_fe}: -Wno-implicit-fallthrough>" + " $<${is_gnu_fe}: -Wno-tautological-type-limit-compare>" + " $<${is_gnu_fe}: -Wno-cast-qual>" + " $<${is_gnu_fe}: -Wno-reserved-identifier>" + " $<${is_clang}: -Wno-missing-prototypes>" + " $<${is_gnu_fe}: -Wno-missing-field-initializers>" + " $<${is_gnu_fe}: -Wno-suggest-override>" + " $<${is_gnu_fe}: -Wno-used-but-marked-unused>" + " $<${is_gnu_fe}: -Wno-noexcept-type>" + " $<${is_gnu_fe}: -Wno-comma>" + " $<${is_gnu_fe}: -Wno-c99-extensions>") + +set_source_files_properties(astcenccli_image_external.cpp + PROPERTIES + COMPILE_FLAGS ${EXTERNAL_CXX_FLAGS}) + +astcenc_set_properties(${ASTCENC_TARGET}-static OFF) + +target_compile_options(${ASTCENC_TARGET}-static + PRIVATE + $<${is_msvc_fe}:/W4>) + +if(${ASTCENC_SHAREDLIB}) + astcenc_set_properties(${ASTCENC_TARGET}-shared OFF) + + target_compile_definitions(${ASTCENC_TARGET}-shared + PRIVATE + ASTCENC_DYNAMIC_LIBRARY=1) + + target_compile_options(${ASTCENC_TARGET}-shared + PRIVATE + $<${is_gnu_fe}:-fvisibility=hidden> + $<${is_msvc_fe}:/W4>) + + if(NOT ${ASTCENC_UNIVERSAL_BUILD}) + install(TARGETS ${ASTCENC_TARGET}-shared) + endif() +endif() + +if(${ASTCENC_CLI}) + astcenc_set_properties(${ASTCENC_TARGET}-veneer1 1) + astcenc_set_properties(${ASTCENC_TARGET}-veneer2 2) + astcenc_set_properties(${ASTCENC_TARGET} 0) + + target_compile_options(${ASTCENC_TARGET}-veneer1 + PRIVATE + $<${is_msvc_fe}:/W3>) + + target_compile_options(${ASTCENC_TARGET}-veneer2 + PRIVATE + $<${is_msvc_fe}:/W3>) + + target_compile_options(${ASTCENC_TARGET} + PRIVATE + $<${is_msvc_fe}:/W3>) + + string(TIMESTAMP astcencoder_YEAR "%Y") + + configure_file( + astcenccli_version.h.in + astcenccli_version.h + ESCAPE_QUOTES @ONLY) + + target_include_directories(${ASTCENC_TARGET} + PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}) + + if(NOT ${ASTCENC_UNIVERSAL_BUILD}) + install(TARGETS ${ASTCENC_TARGET}) + endif() +endif() diff --git a/ktx/external/astc-encoder/Source/wuffs-v0.3.c b/ktx/external/astc-encoder/Source/wuffs-v0.3.c new file mode 100644 index 0000000..6e57261 --- /dev/null +++ b/ktx/external/astc-encoder/Source/wuffs-v0.3.c @@ -0,0 +1,49314 @@ +#ifndef WUFFS_INCLUDE_GUARD +#define WUFFS_INCLUDE_GUARD + +// Wuffs ships as a "single file C library" or "header file library" as per +// https://github.com/nothings/stb/blob/master/docs/stb_howto.txt +// +// To use that single file as a "foo.c"-like implementation, instead of a +// "foo.h"-like header, #define WUFFS_IMPLEMENTATION before #include'ing or +// compiling it. + +// Wuffs' C code is generated automatically, not hand-written. These warnings' +// costs outweigh the benefits. +// +// The "elif defined(__clang__)" isn't redundant. While vanilla clang defines +// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#pragma GCC diagnostic ignored "-Wunreachable-code" +#pragma GCC diagnostic ignored "-Wunused-function" +#pragma GCC diagnostic ignored "-Wunused-parameter" +#if defined(__cplusplus) +#pragma GCC diagnostic ignored "-Wold-style-cast" +#endif +#elif defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wimplicit-fallthrough" +#pragma clang diagnostic ignored "-Wmissing-field-initializers" +#pragma clang diagnostic ignored "-Wunreachable-code" +#pragma clang diagnostic ignored "-Wunused-function" +#pragma clang diagnostic ignored "-Wunused-parameter" +#if defined(__cplusplus) +#pragma clang diagnostic ignored "-Wold-style-cast" +#endif +#endif + +// Copyright 2017 The Wuffs Authors. +// +// 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. + +#include +#include +#include +#include + +#ifdef __cplusplus +#if (__cplusplus >= 201103L) || defined(_MSC_VER) +#include +#define WUFFS_BASE__HAVE_EQ_DELETE +#define WUFFS_BASE__HAVE_UNIQUE_PTR +// The "defined(__clang__)" isn't redundant. While vanilla clang defines +// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. +#elif defined(__GNUC__) || defined(__clang__) +#warning "Wuffs' C++ code expects -std=c++11 or later" +#endif + +extern "C" { +#endif + +// ---------------- Version + +// WUFFS_VERSION is the major.minor.patch version, as per https://semver.org/, +// as a uint64_t. The major number is the high 32 bits. The minor number is the +// middle 16 bits. The patch number is the low 16 bits. The pre-release label +// and build metadata are part of the string representation (such as +// "1.2.3-beta+456.20181231") but not the uint64_t representation. +// +// WUFFS_VERSION_PRE_RELEASE_LABEL (such as "", "beta" or "rc.1") being +// non-empty denotes a developer preview, not a release version, and has no +// backwards or forwards compatibility guarantees. +// +// WUFFS_VERSION_BUILD_METADATA_XXX, if non-zero, are the number of commits and +// the last commit date in the repository used to build this library. Within +// each major.minor branch, the commit count should increase monotonically. +// +// WUFFS_VERSION was overridden by "wuffs gen -version" based on revision +// a138188d5742c0469de983878a430bdbe7e50e77 committed on 2024-04-19. +#define WUFFS_VERSION 0x000030004 +#define WUFFS_VERSION_MAJOR 0 +#define WUFFS_VERSION_MINOR 3 +#define WUFFS_VERSION_PATCH 4 +#define WUFFS_VERSION_PRE_RELEASE_LABEL "" +#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3401 +#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20240419 +#define WUFFS_VERSION_STRING "0.3.4+3401.20240419" + +// ---------------- Configuration + +// Define WUFFS_CONFIG__AVOID_CPU_ARCH to avoid any code tied to a specific CPU +// architecture, such as SSE SIMD for the x86 CPU family. +#if defined(WUFFS_CONFIG__AVOID_CPU_ARCH) // (#if-chain ref AVOID_CPU_ARCH_0) +// No-op. +#else // (#if-chain ref AVOID_CPU_ARCH_0) + +// The "defined(__clang__)" isn't redundant. While vanilla clang defines +// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. +#if defined(__GNUC__) || defined(__clang__) +#define WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET(arg) __attribute__((target(arg))) +#else +#define WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET(arg) +#endif // defined(__GNUC__) || defined(__clang__) + +#if defined(__GNUC__) // (#if-chain ref AVOID_CPU_ARCH_1) + +// To simplify Wuffs code, "cpu_arch >= arm_xxx" requires xxx but also +// unaligned little-endian load/stores. +#if defined(__ARM_FEATURE_UNALIGNED) && !defined(__native_client__) && \ + defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +// Not all gcc versions define __ARM_ACLE, even if they support crc32 +// intrinsics. Look for __ARM_FEATURE_CRC32 instead. +#if defined(__ARM_FEATURE_CRC32) +#include +#define WUFFS_BASE__CPU_ARCH__ARM_CRC32 +#endif // defined(__ARM_FEATURE_CRC32) +#if defined(__ARM_NEON) +#include +#define WUFFS_BASE__CPU_ARCH__ARM_NEON +#endif // defined(__ARM_NEON) +#endif // defined(__ARM_FEATURE_UNALIGNED) etc + +// Similarly, "cpu_arch >= x86_sse42" requires SSE4.2 but also PCLMUL and +// POPCNT. This is checked at runtime via cpuid, not at compile time. +// +// Likewise, "cpu_arch >= x86_avx2" also requires PCLMUL, POPCNT and SSE4.2. +#if defined(__i386__) || defined(__x86_64__) +#if !defined(__native_client__) +#include +#include +// X86_FAMILY means X86 (32-bit) or X86_64 (64-bit, obviously). +#define WUFFS_BASE__CPU_ARCH__X86_FAMILY +#endif // !defined(__native_client__) +#endif // defined(__i386__) || defined(__x86_64__) + +#elif defined(_MSC_VER) // (#if-chain ref AVOID_CPU_ARCH_1) + +#if defined(_M_IX86) || defined(_M_X64) +#if defined(__AVX__) || defined(__clang__) + +// We need for the __cpuid function. +#include +// That's not enough for X64 SIMD, with clang-cl, if we want to use +// "__attribute__((target(arg)))" without e.g. "/arch:AVX". +// +// Some web pages suggest that is all you need, as it pulls in +// the earlier SIMD families like SSE4.2, but that doesn't seem to work in +// practice, possibly for the same reason that just doesn't work. +#include // AVX, AVX2, FMA, POPCNT +#include // SSE4.2 +#include // AES, PCLMUL +// X86_FAMILY means X86 (32-bit) or X86_64 (64-bit, obviously). +#define WUFFS_BASE__CPU_ARCH__X86_FAMILY + +#else // defined(__AVX__) || defined(__clang__) + +// clang-cl (which defines both __clang__ and _MSC_VER) supports +// "__attribute__((target(arg)))". +// +// For MSVC's cl.exe (unlike clang or gcc), SIMD capability is a compile-time +// property of the source file (e.g. a /arch:AVX or -mavx compiler flag), not +// of individual functions (that can be conditionally selected at runtime). +#pragma message("Wuffs with MSVC+IX86/X64 needs /arch:AVX for best performance") + +#endif // defined(__AVX__) || defined(__clang__) +#endif // defined(_M_IX86) || defined(_M_X64) + +#endif // (#if-chain ref AVOID_CPU_ARCH_1) +#endif // (#if-chain ref AVOID_CPU_ARCH_0) + +// -------- + +// Define WUFFS_CONFIG__STATIC_FUNCTIONS (combined with WUFFS_IMPLEMENTATION) +// to make all of Wuffs' functions have static storage. +// +// This can help the compiler ignore or discard unused code, which can produce +// faster compiles and smaller binaries. Other motivations are discussed in the +// "ALLOW STATIC IMPLEMENTATION" section of +// https://raw.githubusercontent.com/nothings/stb/master/docs/stb_howto.txt +#if defined(WUFFS_CONFIG__STATIC_FUNCTIONS) +#define WUFFS_BASE__MAYBE_STATIC static +#else +#define WUFFS_BASE__MAYBE_STATIC +#endif // defined(WUFFS_CONFIG__STATIC_FUNCTIONS) + +// ---------------- CPU Architecture + +static inline bool // +wuffs_base__cpu_arch__have_arm_crc32() { +#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) + return true; +#else + return false; +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +} + +static inline bool // +wuffs_base__cpu_arch__have_arm_neon() { +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + return true; +#else + return false; +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +} + +static inline bool // +wuffs_base__cpu_arch__have_x86_avx2() { +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + // GCC defines these macros but MSVC does not. + // - bit_AVX2 = (1 << 5) + const unsigned int avx2_ebx7 = 0x00000020; + // GCC defines these macros but MSVC does not. + // - bit_PCLMUL = (1 << 1) + // - bit_POPCNT = (1 << 23) + // - bit_SSE4_2 = (1 << 20) + const unsigned int avx2_ecx1 = 0x00900002; + + // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__). +#if defined(__GNUC__) + unsigned int eax7 = 0; + unsigned int ebx7 = 0; + unsigned int ecx7 = 0; + unsigned int edx7 = 0; + if (__get_cpuid_count(7, 0, &eax7, &ebx7, &ecx7, &edx7) && + ((ebx7 & avx2_ebx7) == avx2_ebx7)) { + unsigned int eax1 = 0; + unsigned int ebx1 = 0; + unsigned int ecx1 = 0; + unsigned int edx1 = 0; + if (__get_cpuid(1, &eax1, &ebx1, &ecx1, &edx1) && + ((ecx1 & avx2_ecx1) == avx2_ecx1)) { + return true; + } + } +#elif defined(_MSC_VER) // defined(__GNUC__) + int x7[4]; + __cpuidex(x7, 7, 0); + if ((((unsigned int)(x7[1])) & avx2_ebx7) == avx2_ebx7) { + int x1[4]; + __cpuid(x1, 1); + if ((((unsigned int)(x1[2])) & avx2_ecx1) == avx2_ecx1) { + return true; + } + } +#else +#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler" +#endif // defined(__GNUC__); defined(_MSC_VER) +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + return false; +} + +static inline bool // +wuffs_base__cpu_arch__have_x86_bmi2() { +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + // GCC defines these macros but MSVC does not. + // - bit_BMI2 = (1 << 8) + const unsigned int bmi2_ebx7 = 0x00000100; + + // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__). +#if defined(__GNUC__) + unsigned int eax7 = 0; + unsigned int ebx7 = 0; + unsigned int ecx7 = 0; + unsigned int edx7 = 0; + if (__get_cpuid_count(7, 0, &eax7, &ebx7, &ecx7, &edx7) && + ((ebx7 & bmi2_ebx7) == bmi2_ebx7)) { + return true; + } +#elif defined(_MSC_VER) // defined(__GNUC__) + int x7[4]; + __cpuidex(x7, 7, 0); + if ((((unsigned int)(x7[1])) & bmi2_ebx7) == bmi2_ebx7) { + return true; + } +#else +#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler" +#endif // defined(__GNUC__); defined(_MSC_VER) +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + return false; +} + +static inline bool // +wuffs_base__cpu_arch__have_x86_sse42() { +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + // GCC defines these macros but MSVC does not. + // - bit_PCLMUL = (1 << 1) + // - bit_POPCNT = (1 << 23) + // - bit_SSE4_2 = (1 << 20) + const unsigned int sse42_ecx1 = 0x00900002; + + // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__). +#if defined(__GNUC__) + unsigned int eax1 = 0; + unsigned int ebx1 = 0; + unsigned int ecx1 = 0; + unsigned int edx1 = 0; + if (__get_cpuid(1, &eax1, &ebx1, &ecx1, &edx1) && + ((ecx1 & sse42_ecx1) == sse42_ecx1)) { + return true; + } +#elif defined(_MSC_VER) // defined(__GNUC__) + int x1[4]; + __cpuid(x1, 1); + if ((((unsigned int)(x1[2])) & sse42_ecx1) == sse42_ecx1) { + return true; + } +#else +#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler" +#endif // defined(__GNUC__); defined(_MSC_VER) +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + return false; +} + +// ---------------- Fundamentals + +// Wuffs assumes that: +// - converting a uint32_t to a size_t will never overflow. +// - converting a size_t to a uint64_t will never overflow. +#if defined(__WORDSIZE) +#if (__WORDSIZE != 32) && (__WORDSIZE != 64) +#error "Wuffs requires a word size of either 32 or 64 bits" +#endif +#endif + +// The "defined(__clang__)" isn't redundant. While vanilla clang defines +// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. +#if defined(__GNUC__) || defined(__clang__) +#define WUFFS_BASE__POTENTIALLY_UNUSED __attribute__((unused)) +#define WUFFS_BASE__WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#else +#define WUFFS_BASE__POTENTIALLY_UNUSED +#define WUFFS_BASE__WARN_UNUSED_RESULT +#endif + +// -------- + +// Options (bitwise or'ed together) for wuffs_foo__bar__initialize functions. + +#define WUFFS_INITIALIZE__DEFAULT_OPTIONS ((uint32_t)0x00000000) + +// WUFFS_INITIALIZE__ALREADY_ZEROED means that the "self" receiver struct value +// has already been set to all zeroes. +#define WUFFS_INITIALIZE__ALREADY_ZEROED ((uint32_t)0x00000001) + +// WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED means that, absent +// WUFFS_INITIALIZE__ALREADY_ZEROED, only some of the "self" receiver struct +// value will be set to all zeroes. Internal buffers, which tend to be a large +// proportion of the struct's size, will be left uninitialized. Internal means +// that the buffer is contained by the receiver struct, as opposed to being +// passed as a separately allocated "work buffer". +// +// For more detail, see: +// https://github.com/google/wuffs/blob/main/doc/note/initialization.md +#define WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED \ + ((uint32_t)0x00000002) + +// -------- + +// wuffs_base__empty_struct is used when a Wuffs function returns an empty +// struct. In C, if a function f returns void, you can't say "x = f()", but in +// Wuffs, if a function g returns empty, you can say "y = g()". +typedef struct wuffs_base__empty_struct__struct { + // private_impl is a placeholder field. It isn't explicitly used, except that + // without it, the sizeof a struct with no fields can differ across C/C++ + // compilers, and it is undefined behavior in C99. For example, gcc says that + // the sizeof an empty struct is 0, and g++ says that it is 1. This leads to + // ABI incompatibility if a Wuffs .c file is processed by one compiler and + // its .h file with another compiler. + // + // Instead, we explicitly insert an otherwise unused field, so that the + // sizeof this struct is always 1. + uint8_t private_impl; +} wuffs_base__empty_struct; + +static inline wuffs_base__empty_struct // +wuffs_base__make_empty_struct() { + wuffs_base__empty_struct ret; + ret.private_impl = 0; + return ret; +} + +// wuffs_base__utility is a placeholder receiver type. It enables what Java +// calls static methods, as opposed to regular methods. +typedef struct wuffs_base__utility__struct { + // private_impl is a placeholder field. It isn't explicitly used, except that + // without it, the sizeof a struct with no fields can differ across C/C++ + // compilers, and it is undefined behavior in C99. For example, gcc says that + // the sizeof an empty struct is 0, and g++ says that it is 1. This leads to + // ABI incompatibility if a Wuffs .c file is processed by one compiler and + // its .h file with another compiler. + // + // Instead, we explicitly insert an otherwise unused field, so that the + // sizeof this struct is always 1. + uint8_t private_impl; +} wuffs_base__utility; + +typedef struct wuffs_base__vtable__struct { + const char* vtable_name; + const void* function_pointers; +} wuffs_base__vtable; + +// -------- + +// See https://github.com/google/wuffs/blob/main/doc/note/statuses.md +typedef struct wuffs_base__status__struct { + const char* repr; + +#ifdef __cplusplus + inline bool is_complete() const; + inline bool is_error() const; + inline bool is_note() const; + inline bool is_ok() const; + inline bool is_suspension() const; + inline const char* message() const; +#endif // __cplusplus + +} wuffs_base__status; + +extern const char wuffs_base__note__i_o_redirect[]; +extern const char wuffs_base__note__end_of_data[]; +extern const char wuffs_base__note__metadata_reported[]; +extern const char wuffs_base__suspension__even_more_information[]; +extern const char wuffs_base__suspension__mispositioned_read[]; +extern const char wuffs_base__suspension__mispositioned_write[]; +extern const char wuffs_base__suspension__short_read[]; +extern const char wuffs_base__suspension__short_write[]; +extern const char wuffs_base__error__bad_i_o_position[]; +extern const char wuffs_base__error__bad_argument_length_too_short[]; +extern const char wuffs_base__error__bad_argument[]; +extern const char wuffs_base__error__bad_call_sequence[]; +extern const char wuffs_base__error__bad_data[]; +extern const char wuffs_base__error__bad_receiver[]; +extern const char wuffs_base__error__bad_restart[]; +extern const char wuffs_base__error__bad_sizeof_receiver[]; +extern const char wuffs_base__error__bad_vtable[]; +extern const char wuffs_base__error__bad_workbuf_length[]; +extern const char wuffs_base__error__bad_wuffs_version[]; +extern const char wuffs_base__error__cannot_return_a_suspension[]; +extern const char wuffs_base__error__disabled_by_previous_error[]; +extern const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[]; +extern const char wuffs_base__error__initialize_not_called[]; +extern const char wuffs_base__error__interleaved_coroutine_calls[]; +extern const char wuffs_base__error__no_more_information[]; +extern const char wuffs_base__error__not_enough_data[]; +extern const char wuffs_base__error__out_of_bounds[]; +extern const char wuffs_base__error__unsupported_method[]; +extern const char wuffs_base__error__unsupported_option[]; +extern const char wuffs_base__error__unsupported_pixel_swizzler_option[]; +extern const char wuffs_base__error__too_much_data[]; + +static inline wuffs_base__status // +wuffs_base__make_status(const char* repr) { + wuffs_base__status z; + z.repr = repr; + return z; +} + +static inline bool // +wuffs_base__status__is_complete(const wuffs_base__status* z) { + return (z->repr == NULL) || ((*z->repr != '$') && (*z->repr != '#')); +} + +static inline bool // +wuffs_base__status__is_error(const wuffs_base__status* z) { + return z->repr && (*z->repr == '#'); +} + +static inline bool // +wuffs_base__status__is_note(const wuffs_base__status* z) { + return z->repr && (*z->repr != '$') && (*z->repr != '#'); +} + +static inline bool // +wuffs_base__status__is_ok(const wuffs_base__status* z) { + return z->repr == NULL; +} + +static inline bool // +wuffs_base__status__is_suspension(const wuffs_base__status* z) { + return z->repr && (*z->repr == '$'); +} + +// wuffs_base__status__message strips the leading '$', '#' or '@'. +static inline const char* // +wuffs_base__status__message(const wuffs_base__status* z) { + if (z->repr) { + if ((*z->repr == '$') || (*z->repr == '#') || (*z->repr == '@')) { + return z->repr + 1; + } + } + return z->repr; +} + +#ifdef __cplusplus + +inline bool // +wuffs_base__status::is_complete() const { + return wuffs_base__status__is_complete(this); +} + +inline bool // +wuffs_base__status::is_error() const { + return wuffs_base__status__is_error(this); +} + +inline bool // +wuffs_base__status::is_note() const { + return wuffs_base__status__is_note(this); +} + +inline bool // +wuffs_base__status::is_ok() const { + return wuffs_base__status__is_ok(this); +} + +inline bool // +wuffs_base__status::is_suspension() const { + return wuffs_base__status__is_suspension(this); +} + +inline const char* // +wuffs_base__status::message() const { + return wuffs_base__status__message(this); +} + +#endif // __cplusplus + +// -------- + +// WUFFS_BASE__RESULT is a result type: either a status (an error) or a value. +// +// A result with all fields NULL or zero is as valid as a zero-valued T. +#define WUFFS_BASE__RESULT(T) \ + struct { \ + wuffs_base__status status; \ + T value; \ + } + +typedef WUFFS_BASE__RESULT(double) wuffs_base__result_f64; +typedef WUFFS_BASE__RESULT(int64_t) wuffs_base__result_i64; +typedef WUFFS_BASE__RESULT(uint64_t) wuffs_base__result_u64; + +// -------- + +// wuffs_base__transform__output is the result of transforming from a src slice +// to a dst slice. +typedef struct wuffs_base__transform__output__struct { + wuffs_base__status status; + size_t num_dst; + size_t num_src; +} wuffs_base__transform__output; + +// -------- + +// FourCC constants. Four Character Codes are literally four ASCII characters +// (sometimes padded with ' ' spaces) that pack neatly into a signed or +// unsigned 32-bit integer. ASCII letters are conventionally upper case. +// +// They are often used to identify video codecs (e.g. "H265") and pixel formats +// (e.g. "YV12"). Wuffs uses them for that but also generally for naming +// various things: compression formats (e.g. "BZ2 "), image metadata (e.g. +// "EXIF"), file formats (e.g. "HTML"), etc. +// +// Wuffs' u32 values are big-endian ("JPEG" is 0x4A504547 not 0x4745504A) to +// preserve ordering: "JPEG" < "MP3 " and 0x4A504547 < 0x4D503320. + +// Background Color. +#define WUFFS_BASE__FOURCC__BGCL 0x4247434C + +// Bitmap. +#define WUFFS_BASE__FOURCC__BMP 0x424D5020 + +// Brotli. +#define WUFFS_BASE__FOURCC__BRTL 0x4252544C + +// Bzip2. +#define WUFFS_BASE__FOURCC__BZ2 0x425A3220 + +// Concise Binary Object Representation. +#define WUFFS_BASE__FOURCC__CBOR 0x43424F52 + +// Primary Chromaticities and White Point. +#define WUFFS_BASE__FOURCC__CHRM 0x4348524D + +// Cascading Style Sheets. +#define WUFFS_BASE__FOURCC__CSS 0x43535320 + +// Encapsulated PostScript. +#define WUFFS_BASE__FOURCC__EPS 0x45505320 + +// Exchangeable Image File Format. +#define WUFFS_BASE__FOURCC__EXIF 0x45584946 + +// Free Lossless Audio Codec. +#define WUFFS_BASE__FOURCC__FLAC 0x464C4143 + +// Gamma Correction. +#define WUFFS_BASE__FOURCC__GAMA 0x47414D41 + +// Graphics Interchange Format. +#define WUFFS_BASE__FOURCC__GIF 0x47494620 + +// GNU Zip. +#define WUFFS_BASE__FOURCC__GZ 0x475A2020 + +// High Efficiency Image File. +#define WUFFS_BASE__FOURCC__HEIF 0x48454946 + +// Hypertext Markup Language. +#define WUFFS_BASE__FOURCC__HTML 0x48544D4C + +// International Color Consortium Profile. +#define WUFFS_BASE__FOURCC__ICCP 0x49434350 + +// Icon. +#define WUFFS_BASE__FOURCC__ICO 0x49434F20 + +// Icon Vector Graphics. +#define WUFFS_BASE__FOURCC__ICVG 0x49435647 + +// Initialization. +#define WUFFS_BASE__FOURCC__INI 0x494E4920 + +// Joint Photographic Experts Group. +#define WUFFS_BASE__FOURCC__JPEG 0x4A504547 + +// JavaScript. +#define WUFFS_BASE__FOURCC__JS 0x4A532020 + +// JavaScript Object Notation. +#define WUFFS_BASE__FOURCC__JSON 0x4A534F4E + +// JSON With Commas and Comments. +#define WUFFS_BASE__FOURCC__JWCC 0x4A574343 + +// Key-Value Pair. +#define WUFFS_BASE__FOURCC__KVP 0x4B565020 + +// Key-Value Pair (Key). +#define WUFFS_BASE__FOURCC__KVPK 0x4B56504B + +// Key-Value Pair (Value). +#define WUFFS_BASE__FOURCC__KVPV 0x4B565056 + +// Lempel–Ziv 4. +#define WUFFS_BASE__FOURCC__LZ4 0x4C5A3420 + +// Markdown. +#define WUFFS_BASE__FOURCC__MD 0x4D442020 + +// Modification Time. +#define WUFFS_BASE__FOURCC__MTIM 0x4D54494D + +// MPEG-1 Audio Layer III. +#define WUFFS_BASE__FOURCC__MP3 0x4D503320 + +// Naive Image. +#define WUFFS_BASE__FOURCC__NIE 0x4E494520 + +// Offset (2-Dimensional). +#define WUFFS_BASE__FOURCC__OFS2 0x4F465332 + +// Open Type Format. +#define WUFFS_BASE__FOURCC__OTF 0x4F544620 + +// Portable Document Format. +#define WUFFS_BASE__FOURCC__PDF 0x50444620 + +// Physical Dimensions. +#define WUFFS_BASE__FOURCC__PHYD 0x50485944 + +// Portable Network Graphics. +#define WUFFS_BASE__FOURCC__PNG 0x504E4720 + +// Portable Anymap. +#define WUFFS_BASE__FOURCC__PNM 0x504E4D20 + +// PostScript. +#define WUFFS_BASE__FOURCC__PS 0x50532020 + +// Quite OK Image. +#define WUFFS_BASE__FOURCC__QOI 0x514F4920 + +// Random Access Compression. +#define WUFFS_BASE__FOURCC__RAC 0x52414320 + +// Raw. +#define WUFFS_BASE__FOURCC__RAW 0x52415720 + +// Resource Interchange File Format. +#define WUFFS_BASE__FOURCC__RIFF 0x52494646 + +// Riegeli Records. +#define WUFFS_BASE__FOURCC__RIGL 0x5249474C + +// Snappy. +#define WUFFS_BASE__FOURCC__SNPY 0x534E5059 + +// Standard Red Green Blue (Rendering Intent). +#define WUFFS_BASE__FOURCC__SRGB 0x53524742 + +// Scalable Vector Graphics. +#define WUFFS_BASE__FOURCC__SVG 0x53564720 + +// Tape Archive. +#define WUFFS_BASE__FOURCC__TAR 0x54415220 + +// Text. +#define WUFFS_BASE__FOURCC__TEXT 0x54455854 + +// Truevision Advanced Raster Graphics Adapter. +#define WUFFS_BASE__FOURCC__TGA 0x54474120 + +// Tagged Image File Format. +#define WUFFS_BASE__FOURCC__TIFF 0x54494646 + +// Tom's Obvious Minimal Language. +#define WUFFS_BASE__FOURCC__TOML 0x544F4D4C + +// Waveform. +#define WUFFS_BASE__FOURCC__WAVE 0x57415645 + +// Wireless Bitmap. +#define WUFFS_BASE__FOURCC__WBMP 0x57424D50 + +// Web Picture. +#define WUFFS_BASE__FOURCC__WEBP 0x57454250 + +// Web Open Font Format. +#define WUFFS_BASE__FOURCC__WOFF 0x574F4646 + +// Extensible Markup Language. +#define WUFFS_BASE__FOURCC__XML 0x584D4C20 + +// Extensible Metadata Platform. +#define WUFFS_BASE__FOURCC__XMP 0x584D5020 + +// Xz. +#define WUFFS_BASE__FOURCC__XZ 0x585A2020 + +// Zip. +#define WUFFS_BASE__FOURCC__ZIP 0x5A495020 + +// Zlib. +#define WUFFS_BASE__FOURCC__ZLIB 0x5A4C4942 + +// Zstandard. +#define WUFFS_BASE__FOURCC__ZSTD 0x5A535444 + +// -------- + +// Quirks. + +#define WUFFS_BASE__QUIRK_IGNORE_CHECKSUM 1 + +// -------- + +// Flicks are a unit of time. One flick (frame-tick) is 1 / 705_600_000 of a +// second. See https://github.com/OculusVR/Flicks +typedef int64_t wuffs_base__flicks; + +#define WUFFS_BASE__FLICKS_PER_SECOND ((uint64_t)705600000) +#define WUFFS_BASE__FLICKS_PER_MILLISECOND ((uint64_t)705600) + +// ---------------- Numeric Types + +// The helpers below are functions, instead of macros, because their arguments +// can be an expression that we shouldn't evaluate more than once. +// +// They are static, so that linking multiple wuffs .o files won't complain about +// duplicate function definitions. +// +// They are explicitly marked inline, even if modern compilers don't use the +// inline attribute to guide optimizations such as inlining, to avoid the +// -Wunused-function warning, and we like to compile with -Wall -Werror. + +static inline int8_t // +wuffs_base__i8__min(int8_t x, int8_t y) { + return x < y ? x : y; +} + +static inline int8_t // +wuffs_base__i8__max(int8_t x, int8_t y) { + return x > y ? x : y; +} + +static inline int16_t // +wuffs_base__i16__min(int16_t x, int16_t y) { + return x < y ? x : y; +} + +static inline int16_t // +wuffs_base__i16__max(int16_t x, int16_t y) { + return x > y ? x : y; +} + +static inline int32_t // +wuffs_base__i32__min(int32_t x, int32_t y) { + return x < y ? x : y; +} + +static inline int32_t // +wuffs_base__i32__max(int32_t x, int32_t y) { + return x > y ? x : y; +} + +static inline int64_t // +wuffs_base__i64__min(int64_t x, int64_t y) { + return x < y ? x : y; +} + +static inline int64_t // +wuffs_base__i64__max(int64_t x, int64_t y) { + return x > y ? x : y; +} + +static inline uint8_t // +wuffs_base__u8__min(uint8_t x, uint8_t y) { + return x < y ? x : y; +} + +static inline uint8_t // +wuffs_base__u8__max(uint8_t x, uint8_t y) { + return x > y ? x : y; +} + +static inline uint16_t // +wuffs_base__u16__min(uint16_t x, uint16_t y) { + return x < y ? x : y; +} + +static inline uint16_t // +wuffs_base__u16__max(uint16_t x, uint16_t y) { + return x > y ? x : y; +} + +static inline uint32_t // +wuffs_base__u32__min(uint32_t x, uint32_t y) { + return x < y ? x : y; +} + +static inline uint32_t // +wuffs_base__u32__max(uint32_t x, uint32_t y) { + return x > y ? x : y; +} + +static inline uint64_t // +wuffs_base__u64__min(uint64_t x, uint64_t y) { + return x < y ? x : y; +} + +static inline uint64_t // +wuffs_base__u64__max(uint64_t x, uint64_t y) { + return x > y ? x : y; +} + +// -------- + +static inline uint8_t // +wuffs_base__u8__rotate_left(uint8_t x, uint32_t n) { + n &= 7; + return ((uint8_t)(x << n)) | ((uint8_t)(x >> (8 - n))); +} + +static inline uint8_t // +wuffs_base__u8__rotate_right(uint8_t x, uint32_t n) { + n &= 7; + return ((uint8_t)(x >> n)) | ((uint8_t)(x << (8 - n))); +} + +static inline uint16_t // +wuffs_base__u16__rotate_left(uint16_t x, uint32_t n) { + n &= 15; + return ((uint16_t)(x << n)) | ((uint16_t)(x >> (16 - n))); +} + +static inline uint16_t // +wuffs_base__u16__rotate_right(uint16_t x, uint32_t n) { + n &= 15; + return ((uint16_t)(x >> n)) | ((uint16_t)(x << (16 - n))); +} + +static inline uint32_t // +wuffs_base__u32__rotate_left(uint32_t x, uint32_t n) { + n &= 31; + return ((uint32_t)(x << n)) | ((uint32_t)(x >> (32 - n))); +} + +static inline uint32_t // +wuffs_base__u32__rotate_right(uint32_t x, uint32_t n) { + n &= 31; + return ((uint32_t)(x >> n)) | ((uint32_t)(x << (32 - n))); +} + +static inline uint64_t // +wuffs_base__u64__rotate_left(uint64_t x, uint32_t n) { + n &= 63; + return ((uint64_t)(x << n)) | ((uint64_t)(x >> (64 - n))); +} + +static inline uint64_t // +wuffs_base__u64__rotate_right(uint64_t x, uint32_t n) { + n &= 63; + return ((uint64_t)(x >> n)) | ((uint64_t)(x << (64 - n))); +} + +// -------- + +// Saturating arithmetic (sat_add, sat_sub) branchless bit-twiddling algorithms +// are per https://locklessinc.com/articles/sat_arithmetic/ +// +// It is important that the underlying types are unsigned integers, as signed +// integer arithmetic overflow is undefined behavior in C. + +static inline uint8_t // +wuffs_base__u8__sat_add(uint8_t x, uint8_t y) { + uint8_t res = (uint8_t)(x + y); + res |= (uint8_t)(-(res < x)); + return res; +} + +static inline uint8_t // +wuffs_base__u8__sat_sub(uint8_t x, uint8_t y) { + uint8_t res = (uint8_t)(x - y); + res &= (uint8_t)(-(res <= x)); + return res; +} + +static inline uint16_t // +wuffs_base__u16__sat_add(uint16_t x, uint16_t y) { + uint16_t res = (uint16_t)(x + y); + res |= (uint16_t)(-(res < x)); + return res; +} + +static inline uint16_t // +wuffs_base__u16__sat_sub(uint16_t x, uint16_t y) { + uint16_t res = (uint16_t)(x - y); + res &= (uint16_t)(-(res <= x)); + return res; +} + +static inline uint32_t // +wuffs_base__u32__sat_add(uint32_t x, uint32_t y) { + uint32_t res = (uint32_t)(x + y); + res |= (uint32_t)(-(res < x)); + return res; +} + +static inline uint32_t // +wuffs_base__u32__sat_sub(uint32_t x, uint32_t y) { + uint32_t res = (uint32_t)(x - y); + res &= (uint32_t)(-(res <= x)); + return res; +} + +static inline uint64_t // +wuffs_base__u64__sat_add(uint64_t x, uint64_t y) { + uint64_t res = (uint64_t)(x + y); + res |= (uint64_t)(-(res < x)); + return res; +} + +static inline uint64_t // +wuffs_base__u64__sat_sub(uint64_t x, uint64_t y) { + uint64_t res = (uint64_t)(x - y); + res &= (uint64_t)(-(res <= x)); + return res; +} + +// -------- + +typedef struct wuffs_base__multiply_u64__output__struct { + uint64_t lo; + uint64_t hi; +} wuffs_base__multiply_u64__output; + +// wuffs_base__multiply_u64 returns x*y as a 128-bit value. +// +// The maximum inclusive output hi_lo is 0xFFFFFFFFFFFFFFFE_0000000000000001. +static inline wuffs_base__multiply_u64__output // +wuffs_base__multiply_u64(uint64_t x, uint64_t y) { +#if defined(__SIZEOF_INT128__) + __uint128_t z = ((__uint128_t)x) * ((__uint128_t)y); + wuffs_base__multiply_u64__output o; + o.lo = ((uint64_t)(z)); + o.hi = ((uint64_t)(z >> 64)); + return o; +#else + // TODO: consider using the _mul128 intrinsic if defined(_MSC_VER). + uint64_t x0 = x & 0xFFFFFFFF; + uint64_t x1 = x >> 32; + uint64_t y0 = y & 0xFFFFFFFF; + uint64_t y1 = y >> 32; + uint64_t w0 = x0 * y0; + uint64_t t = (x1 * y0) + (w0 >> 32); + uint64_t w1 = t & 0xFFFFFFFF; + uint64_t w2 = t >> 32; + w1 += x0 * y1; + wuffs_base__multiply_u64__output o; + o.lo = x * y; + o.hi = (x1 * y1) + w2 + (w1 >> 32); + return o; +#endif +} + +// -------- + +// The "defined(__clang__)" isn't redundant. While vanilla clang defines +// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. +#if (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8) + +static inline uint32_t // +wuffs_base__count_leading_zeroes_u64(uint64_t u) { + return u ? ((uint32_t)(__builtin_clzl(u))) : 64u; +} + +#else +// TODO: consider using the _BitScanReverse intrinsic if defined(_MSC_VER). + +static inline uint32_t // +wuffs_base__count_leading_zeroes_u64(uint64_t u) { + if (u == 0) { + return 64; + } + + uint32_t n = 0; + if ((u >> 32) == 0) { + n |= 32; + u <<= 32; + } + if ((u >> 48) == 0) { + n |= 16; + u <<= 16; + } + if ((u >> 56) == 0) { + n |= 8; + u <<= 8; + } + if ((u >> 60) == 0) { + n |= 4; + u <<= 4; + } + if ((u >> 62) == 0) { + n |= 2; + u <<= 2; + } + if ((u >> 63) == 0) { + n |= 1; + u <<= 1; + } + return n; +} + +#endif // (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8) + +// -------- + +// Normally, the wuffs_base__peek_etc and wuffs_base__poke_etc implementations +// are both (1) correct regardless of CPU endianness and (2) very fast (e.g. an +// inlined wuffs_base__peek_u32le__no_bounds_check call, in an optimized clang +// or gcc build, is a single MOV instruction on x86_64). +// +// However, the endian-agnostic implementations are slow on Microsoft's C +// compiler (MSC). Alternative memcpy-based implementations restore speed, but +// they are only correct on little-endian CPU architectures. Defining +// WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE opts in to these implementations. +// +// https://godbolt.org/z/q4MfjzTPh +#if defined(_MSC_VER) && !defined(__clang__) && \ + (defined(_M_ARM64) || defined(_M_X64)) +#define WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE +#endif + +#define wuffs_base__peek_u8be__no_bounds_check \ + wuffs_base__peek_u8__no_bounds_check +#define wuffs_base__peek_u8le__no_bounds_check \ + wuffs_base__peek_u8__no_bounds_check + +static inline uint8_t // +wuffs_base__peek_u8__no_bounds_check(const uint8_t* p) { + return p[0]; +} + +static inline uint16_t // +wuffs_base__peek_u16be__no_bounds_check(const uint8_t* p) { +#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) + uint16_t x; + memcpy(&x, p, 2); + return _byteswap_ushort(x); +#else + return (uint16_t)(((uint16_t)(p[0]) << 8) | ((uint16_t)(p[1]) << 0)); +#endif +} + +static inline uint16_t // +wuffs_base__peek_u16le__no_bounds_check(const uint8_t* p) { +#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) + uint16_t x; + memcpy(&x, p, 2); + return x; +#else + return (uint16_t)(((uint16_t)(p[0]) << 0) | ((uint16_t)(p[1]) << 8)); +#endif +} + +static inline uint32_t // +wuffs_base__peek_u24be__no_bounds_check(const uint8_t* p) { + return ((uint32_t)(p[0]) << 16) | ((uint32_t)(p[1]) << 8) | + ((uint32_t)(p[2]) << 0); +} + +static inline uint32_t // +wuffs_base__peek_u24le__no_bounds_check(const uint8_t* p) { + return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) | + ((uint32_t)(p[2]) << 16); +} + +static inline uint32_t // +wuffs_base__peek_u32be__no_bounds_check(const uint8_t* p) { +#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) + uint32_t x; + memcpy(&x, p, 4); + return _byteswap_ulong(x); +#else + return ((uint32_t)(p[0]) << 24) | ((uint32_t)(p[1]) << 16) | + ((uint32_t)(p[2]) << 8) | ((uint32_t)(p[3]) << 0); +#endif +} + +static inline uint32_t // +wuffs_base__peek_u32le__no_bounds_check(const uint8_t* p) { +#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) + uint32_t x; + memcpy(&x, p, 4); + return x; +#else + return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) | + ((uint32_t)(p[2]) << 16) | ((uint32_t)(p[3]) << 24); +#endif +} + +static inline uint64_t // +wuffs_base__peek_u40be__no_bounds_check(const uint8_t* p) { + return ((uint64_t)(p[0]) << 32) | ((uint64_t)(p[1]) << 24) | + ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 8) | + ((uint64_t)(p[4]) << 0); +} + +static inline uint64_t // +wuffs_base__peek_u40le__no_bounds_check(const uint8_t* p) { + return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) | + ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) | + ((uint64_t)(p[4]) << 32); +} + +static inline uint64_t // +wuffs_base__peek_u48be__no_bounds_check(const uint8_t* p) { + return ((uint64_t)(p[0]) << 40) | ((uint64_t)(p[1]) << 32) | + ((uint64_t)(p[2]) << 24) | ((uint64_t)(p[3]) << 16) | + ((uint64_t)(p[4]) << 8) | ((uint64_t)(p[5]) << 0); +} + +static inline uint64_t // +wuffs_base__peek_u48le__no_bounds_check(const uint8_t* p) { + return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) | + ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) | + ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40); +} + +static inline uint64_t // +wuffs_base__peek_u56be__no_bounds_check(const uint8_t* p) { + return ((uint64_t)(p[0]) << 48) | ((uint64_t)(p[1]) << 40) | + ((uint64_t)(p[2]) << 32) | ((uint64_t)(p[3]) << 24) | + ((uint64_t)(p[4]) << 16) | ((uint64_t)(p[5]) << 8) | + ((uint64_t)(p[6]) << 0); +} + +static inline uint64_t // +wuffs_base__peek_u56le__no_bounds_check(const uint8_t* p) { + return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) | + ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) | + ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40) | + ((uint64_t)(p[6]) << 48); +} + +static inline uint64_t // +wuffs_base__peek_u64be__no_bounds_check(const uint8_t* p) { +#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) + uint64_t x; + memcpy(&x, p, 8); + return _byteswap_uint64(x); +#else + return ((uint64_t)(p[0]) << 56) | ((uint64_t)(p[1]) << 48) | + ((uint64_t)(p[2]) << 40) | ((uint64_t)(p[3]) << 32) | + ((uint64_t)(p[4]) << 24) | ((uint64_t)(p[5]) << 16) | + ((uint64_t)(p[6]) << 8) | ((uint64_t)(p[7]) << 0); +#endif +} + +static inline uint64_t // +wuffs_base__peek_u64le__no_bounds_check(const uint8_t* p) { +#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) + uint64_t x; + memcpy(&x, p, 8); + return x; +#else + return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) | + ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) | + ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40) | + ((uint64_t)(p[6]) << 48) | ((uint64_t)(p[7]) << 56); +#endif +} + +// -------- + +#define wuffs_base__poke_u8be__no_bounds_check \ + wuffs_base__poke_u8__no_bounds_check +#define wuffs_base__poke_u8le__no_bounds_check \ + wuffs_base__poke_u8__no_bounds_check + +static inline void // +wuffs_base__poke_u8__no_bounds_check(uint8_t* p, uint8_t x) { + p[0] = x; +} + +static inline void // +wuffs_base__poke_u16be__no_bounds_check(uint8_t* p, uint16_t x) { + p[0] = (uint8_t)(x >> 8); + p[1] = (uint8_t)(x >> 0); +} + +static inline void // +wuffs_base__poke_u16le__no_bounds_check(uint8_t* p, uint16_t x) { +#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \ + (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__)) + // This seems to perform better on gcc 10 (but not clang 9). Clang also + // defines "__GNUC__". + memcpy(p, &x, 2); +#else + p[0] = (uint8_t)(x >> 0); + p[1] = (uint8_t)(x >> 8); +#endif +} + +static inline void // +wuffs_base__poke_u24be__no_bounds_check(uint8_t* p, uint32_t x) { + p[0] = (uint8_t)(x >> 16); + p[1] = (uint8_t)(x >> 8); + p[2] = (uint8_t)(x >> 0); +} + +static inline void // +wuffs_base__poke_u24le__no_bounds_check(uint8_t* p, uint32_t x) { + p[0] = (uint8_t)(x >> 0); + p[1] = (uint8_t)(x >> 8); + p[2] = (uint8_t)(x >> 16); +} + +static inline void // +wuffs_base__poke_u32be__no_bounds_check(uint8_t* p, uint32_t x) { + p[0] = (uint8_t)(x >> 24); + p[1] = (uint8_t)(x >> 16); + p[2] = (uint8_t)(x >> 8); + p[3] = (uint8_t)(x >> 0); +} + +static inline void // +wuffs_base__poke_u32le__no_bounds_check(uint8_t* p, uint32_t x) { +#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \ + (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__)) + // This seems to perform better on gcc 10 (but not clang 9). Clang also + // defines "__GNUC__". + memcpy(p, &x, 4); +#else + p[0] = (uint8_t)(x >> 0); + p[1] = (uint8_t)(x >> 8); + p[2] = (uint8_t)(x >> 16); + p[3] = (uint8_t)(x >> 24); +#endif +} + +static inline void // +wuffs_base__poke_u40be__no_bounds_check(uint8_t* p, uint64_t x) { + p[0] = (uint8_t)(x >> 32); + p[1] = (uint8_t)(x >> 24); + p[2] = (uint8_t)(x >> 16); + p[3] = (uint8_t)(x >> 8); + p[4] = (uint8_t)(x >> 0); +} + +static inline void // +wuffs_base__poke_u40le__no_bounds_check(uint8_t* p, uint64_t x) { + p[0] = (uint8_t)(x >> 0); + p[1] = (uint8_t)(x >> 8); + p[2] = (uint8_t)(x >> 16); + p[3] = (uint8_t)(x >> 24); + p[4] = (uint8_t)(x >> 32); +} + +static inline void // +wuffs_base__poke_u48be__no_bounds_check(uint8_t* p, uint64_t x) { + p[0] = (uint8_t)(x >> 40); + p[1] = (uint8_t)(x >> 32); + p[2] = (uint8_t)(x >> 24); + p[3] = (uint8_t)(x >> 16); + p[4] = (uint8_t)(x >> 8); + p[5] = (uint8_t)(x >> 0); +} + +static inline void // +wuffs_base__poke_u48le__no_bounds_check(uint8_t* p, uint64_t x) { + p[0] = (uint8_t)(x >> 0); + p[1] = (uint8_t)(x >> 8); + p[2] = (uint8_t)(x >> 16); + p[3] = (uint8_t)(x >> 24); + p[4] = (uint8_t)(x >> 32); + p[5] = (uint8_t)(x >> 40); +} + +static inline void // +wuffs_base__poke_u56be__no_bounds_check(uint8_t* p, uint64_t x) { + p[0] = (uint8_t)(x >> 48); + p[1] = (uint8_t)(x >> 40); + p[2] = (uint8_t)(x >> 32); + p[3] = (uint8_t)(x >> 24); + p[4] = (uint8_t)(x >> 16); + p[5] = (uint8_t)(x >> 8); + p[6] = (uint8_t)(x >> 0); +} + +static inline void // +wuffs_base__poke_u56le__no_bounds_check(uint8_t* p, uint64_t x) { + p[0] = (uint8_t)(x >> 0); + p[1] = (uint8_t)(x >> 8); + p[2] = (uint8_t)(x >> 16); + p[3] = (uint8_t)(x >> 24); + p[4] = (uint8_t)(x >> 32); + p[5] = (uint8_t)(x >> 40); + p[6] = (uint8_t)(x >> 48); +} + +static inline void // +wuffs_base__poke_u64be__no_bounds_check(uint8_t* p, uint64_t x) { + p[0] = (uint8_t)(x >> 56); + p[1] = (uint8_t)(x >> 48); + p[2] = (uint8_t)(x >> 40); + p[3] = (uint8_t)(x >> 32); + p[4] = (uint8_t)(x >> 24); + p[5] = (uint8_t)(x >> 16); + p[6] = (uint8_t)(x >> 8); + p[7] = (uint8_t)(x >> 0); +} + +static inline void // +wuffs_base__poke_u64le__no_bounds_check(uint8_t* p, uint64_t x) { +#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \ + (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__)) + // This seems to perform better on gcc 10 (but not clang 9). Clang also + // defines "__GNUC__". + memcpy(p, &x, 8); +#else + p[0] = (uint8_t)(x >> 0); + p[1] = (uint8_t)(x >> 8); + p[2] = (uint8_t)(x >> 16); + p[3] = (uint8_t)(x >> 24); + p[4] = (uint8_t)(x >> 32); + p[5] = (uint8_t)(x >> 40); + p[6] = (uint8_t)(x >> 48); + p[7] = (uint8_t)(x >> 56); +#endif +} + +// -------- + +// Load and Store functions are deprecated. Use Peek and Poke instead. + +#define wuffs_base__load_u8__no_bounds_check \ + wuffs_base__peek_u8__no_bounds_check +#define wuffs_base__load_u16be__no_bounds_check \ + wuffs_base__peek_u16be__no_bounds_check +#define wuffs_base__load_u16le__no_bounds_check \ + wuffs_base__peek_u16le__no_bounds_check +#define wuffs_base__load_u24be__no_bounds_check \ + wuffs_base__peek_u24be__no_bounds_check +#define wuffs_base__load_u24le__no_bounds_check \ + wuffs_base__peek_u24le__no_bounds_check +#define wuffs_base__load_u32be__no_bounds_check \ + wuffs_base__peek_u32be__no_bounds_check +#define wuffs_base__load_u32le__no_bounds_check \ + wuffs_base__peek_u32le__no_bounds_check +#define wuffs_base__load_u40be__no_bounds_check \ + wuffs_base__peek_u40be__no_bounds_check +#define wuffs_base__load_u40le__no_bounds_check \ + wuffs_base__peek_u40le__no_bounds_check +#define wuffs_base__load_u48be__no_bounds_check \ + wuffs_base__peek_u48be__no_bounds_check +#define wuffs_base__load_u48le__no_bounds_check \ + wuffs_base__peek_u48le__no_bounds_check +#define wuffs_base__load_u56be__no_bounds_check \ + wuffs_base__peek_u56be__no_bounds_check +#define wuffs_base__load_u56le__no_bounds_check \ + wuffs_base__peek_u56le__no_bounds_check +#define wuffs_base__load_u64be__no_bounds_check \ + wuffs_base__peek_u64be__no_bounds_check +#define wuffs_base__load_u64le__no_bounds_check \ + wuffs_base__peek_u64le__no_bounds_check + +#define wuffs_base__store_u8__no_bounds_check \ + wuffs_base__poke_u8__no_bounds_check +#define wuffs_base__store_u16be__no_bounds_check \ + wuffs_base__poke_u16be__no_bounds_check +#define wuffs_base__store_u16le__no_bounds_check \ + wuffs_base__poke_u16le__no_bounds_check +#define wuffs_base__store_u24be__no_bounds_check \ + wuffs_base__poke_u24be__no_bounds_check +#define wuffs_base__store_u24le__no_bounds_check \ + wuffs_base__poke_u24le__no_bounds_check +#define wuffs_base__store_u32be__no_bounds_check \ + wuffs_base__poke_u32be__no_bounds_check +#define wuffs_base__store_u32le__no_bounds_check \ + wuffs_base__poke_u32le__no_bounds_check +#define wuffs_base__store_u40be__no_bounds_check \ + wuffs_base__poke_u40be__no_bounds_check +#define wuffs_base__store_u40le__no_bounds_check \ + wuffs_base__poke_u40le__no_bounds_check +#define wuffs_base__store_u48be__no_bounds_check \ + wuffs_base__poke_u48be__no_bounds_check +#define wuffs_base__store_u48le__no_bounds_check \ + wuffs_base__poke_u48le__no_bounds_check +#define wuffs_base__store_u56be__no_bounds_check \ + wuffs_base__poke_u56be__no_bounds_check +#define wuffs_base__store_u56le__no_bounds_check \ + wuffs_base__poke_u56le__no_bounds_check +#define wuffs_base__store_u64be__no_bounds_check \ + wuffs_base__poke_u64be__no_bounds_check +#define wuffs_base__store_u64le__no_bounds_check \ + wuffs_base__poke_u64le__no_bounds_check + +// ---------------- Slices and Tables + +// WUFFS_BASE__SLICE is a 1-dimensional buffer. +// +// len measures a number of elements, not necessarily a size in bytes. +// +// A value with all fields NULL or zero is a valid, empty slice. +#define WUFFS_BASE__SLICE(T) \ + struct { \ + T* ptr; \ + size_t len; \ + } + +// WUFFS_BASE__TABLE is a 2-dimensional buffer. +// +// width, height and stride measure a number of elements, not necessarily a +// size in bytes. +// +// A value with all fields NULL or zero is a valid, empty table. +#define WUFFS_BASE__TABLE(T) \ + struct { \ + T* ptr; \ + size_t width; \ + size_t height; \ + size_t stride; \ + } + +typedef WUFFS_BASE__SLICE(uint8_t) wuffs_base__slice_u8; +typedef WUFFS_BASE__SLICE(uint16_t) wuffs_base__slice_u16; +typedef WUFFS_BASE__SLICE(uint32_t) wuffs_base__slice_u32; +typedef WUFFS_BASE__SLICE(uint64_t) wuffs_base__slice_u64; + +typedef WUFFS_BASE__TABLE(uint8_t) wuffs_base__table_u8; +typedef WUFFS_BASE__TABLE(uint16_t) wuffs_base__table_u16; +typedef WUFFS_BASE__TABLE(uint32_t) wuffs_base__table_u32; +typedef WUFFS_BASE__TABLE(uint64_t) wuffs_base__table_u64; + +static inline wuffs_base__slice_u8 // +wuffs_base__make_slice_u8(uint8_t* ptr, size_t len) { + wuffs_base__slice_u8 ret; + ret.ptr = ptr; + ret.len = len; + return ret; +} + +static inline wuffs_base__slice_u16 // +wuffs_base__make_slice_u16(uint16_t* ptr, size_t len) { + wuffs_base__slice_u16 ret; + ret.ptr = ptr; + ret.len = len; + return ret; +} + +static inline wuffs_base__slice_u32 // +wuffs_base__make_slice_u32(uint32_t* ptr, size_t len) { + wuffs_base__slice_u32 ret; + ret.ptr = ptr; + ret.len = len; + return ret; +} + +static inline wuffs_base__slice_u64 // +wuffs_base__make_slice_u64(uint64_t* ptr, size_t len) { + wuffs_base__slice_u64 ret; + ret.ptr = ptr; + ret.len = len; + return ret; +} + +static inline wuffs_base__slice_u8 // +wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u8 ret; + ret.ptr = ptr + i; + ret.len = (j >= i) ? (j - i) : 0; + return ret; +} + +static inline wuffs_base__slice_u16 // +wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u16 ret; + ret.ptr = ptr + i; + ret.len = (j >= i) ? (j - i) : 0; + return ret; +} + +static inline wuffs_base__slice_u32 // +wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u32 ret; + ret.ptr = ptr + i; + ret.len = (j >= i) ? (j - i) : 0; + return ret; +} + +static inline wuffs_base__slice_u64 // +wuffs_base__make_slice_u64_ij(uint64_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u64 ret; + ret.ptr = ptr + i; + ret.len = (j >= i) ? (j - i) : 0; + return ret; +} + +static inline wuffs_base__slice_u8 // +wuffs_base__empty_slice_u8() { + wuffs_base__slice_u8 ret; + ret.ptr = NULL; + ret.len = 0; + return ret; +} + +static inline wuffs_base__slice_u16 // +wuffs_base__empty_slice_u16() { + wuffs_base__slice_u16 ret; + ret.ptr = NULL; + ret.len = 0; + return ret; +} + +static inline wuffs_base__slice_u32 // +wuffs_base__empty_slice_u32() { + wuffs_base__slice_u32 ret; + ret.ptr = NULL; + ret.len = 0; + return ret; +} + +static inline wuffs_base__slice_u64 // +wuffs_base__empty_slice_u64() { + wuffs_base__slice_u64 ret; + ret.ptr = NULL; + ret.len = 0; + return ret; +} + +static inline wuffs_base__table_u8 // +wuffs_base__make_table_u8(uint8_t* ptr, + size_t width, + size_t height, + size_t stride) { + wuffs_base__table_u8 ret; + ret.ptr = ptr; + ret.width = width; + ret.height = height; + ret.stride = stride; + return ret; +} + +static inline wuffs_base__table_u16 // +wuffs_base__make_table_u16(uint16_t* ptr, + size_t width, + size_t height, + size_t stride) { + wuffs_base__table_u16 ret; + ret.ptr = ptr; + ret.width = width; + ret.height = height; + ret.stride = stride; + return ret; +} + +static inline wuffs_base__table_u32 // +wuffs_base__make_table_u32(uint32_t* ptr, + size_t width, + size_t height, + size_t stride) { + wuffs_base__table_u32 ret; + ret.ptr = ptr; + ret.width = width; + ret.height = height; + ret.stride = stride; + return ret; +} + +static inline wuffs_base__table_u64 // +wuffs_base__make_table_u64(uint64_t* ptr, + size_t width, + size_t height, + size_t stride) { + wuffs_base__table_u64 ret; + ret.ptr = ptr; + ret.width = width; + ret.height = height; + ret.stride = stride; + return ret; +} + +static inline wuffs_base__table_u8 // +wuffs_base__empty_table_u8() { + wuffs_base__table_u8 ret; + ret.ptr = NULL; + ret.width = 0; + ret.height = 0; + ret.stride = 0; + return ret; +} + +static inline wuffs_base__table_u16 // +wuffs_base__empty_table_u16() { + wuffs_base__table_u16 ret; + ret.ptr = NULL; + ret.width = 0; + ret.height = 0; + ret.stride = 0; + return ret; +} + +static inline wuffs_base__table_u32 // +wuffs_base__empty_table_u32() { + wuffs_base__table_u32 ret; + ret.ptr = NULL; + ret.width = 0; + ret.height = 0; + ret.stride = 0; + return ret; +} + +static inline wuffs_base__table_u64 // +wuffs_base__empty_table_u64() { + wuffs_base__table_u64 ret; + ret.ptr = NULL; + ret.width = 0; + ret.height = 0; + ret.stride = 0; + return ret; +} + +static inline bool // +wuffs_base__slice_u8__overlaps(wuffs_base__slice_u8 s, wuffs_base__slice_u8 t) { + return ((s.ptr <= t.ptr) && (t.ptr < (s.ptr + s.len))) || + ((t.ptr <= s.ptr) && (s.ptr < (t.ptr + t.len))); +} + +// wuffs_base__slice_u8__subslice_i returns s[i:]. +// +// It returns an empty slice if i is out of bounds. +static inline wuffs_base__slice_u8 // +wuffs_base__slice_u8__subslice_i(wuffs_base__slice_u8 s, uint64_t i) { + if ((i <= SIZE_MAX) && (i <= s.len)) { + return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(s.len - i))); + } + return wuffs_base__make_slice_u8(NULL, 0); +} + +// wuffs_base__slice_u8__subslice_j returns s[:j]. +// +// It returns an empty slice if j is out of bounds. +static inline wuffs_base__slice_u8 // +wuffs_base__slice_u8__subslice_j(wuffs_base__slice_u8 s, uint64_t j) { + if ((j <= SIZE_MAX) && (j <= s.len)) { + return wuffs_base__make_slice_u8(s.ptr, ((size_t)j)); + } + return wuffs_base__make_slice_u8(NULL, 0); +} + +// wuffs_base__slice_u8__subslice_ij returns s[i:j]. +// +// It returns an empty slice if i or j is out of bounds. +static inline wuffs_base__slice_u8 // +wuffs_base__slice_u8__subslice_ij(wuffs_base__slice_u8 s, + uint64_t i, + uint64_t j) { + if ((i <= j) && (j <= SIZE_MAX) && (j <= s.len)) { + return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(j - i))); + } + return wuffs_base__make_slice_u8(NULL, 0); +} + +// wuffs_base__table_u8__subtable_ij returns t[ix:jx, iy:jy]. +// +// It returns an empty table if i or j is out of bounds. +static inline wuffs_base__table_u8 // +wuffs_base__table_u8__subtable_ij(wuffs_base__table_u8 t, + uint64_t ix, + uint64_t iy, + uint64_t jx, + uint64_t jy) { + if ((ix <= jx) && (jx <= SIZE_MAX) && (jx <= t.width) && // + (iy <= jy) && (jy <= SIZE_MAX) && (jy <= t.height)) { + return wuffs_base__make_table_u8(t.ptr + ix + (iy * t.stride), // + ((size_t)(jx - ix)), // + ((size_t)(jy - iy)), // + t.stride); // + } + return wuffs_base__make_table_u8(NULL, 0, 0, 0); +} + +// wuffs_base__table__flattened_length returns the number of elements covered +// by the 1-dimensional span that backs a 2-dimensional table. This counts the +// elements inside the table and, when width != stride, the elements outside +// the table but between its rows. +// +// For example, consider a width 10, height 4, stride 10 table. Mark its first +// and last (inclusive) elements with 'a' and 'z'. This function returns 40. +// +// a123456789 +// 0123456789 +// 0123456789 +// 012345678z +// +// Now consider the sub-table of that from (2, 1) inclusive to (8, 4) exclusive. +// +// a123456789 +// 01iiiiiioo +// ooiiiiiioo +// ooiiiiii8z +// +// This function (called with width 6, height 3, stride 10) returns 26: 18 'i' +// inside elements plus 8 'o' outside elements. Note that 26 is less than a +// naive (height * stride = 30) computation. Indeed, advancing 29 elements from +// the first 'i' would venture past 'z', out of bounds of the original table. +// +// It does not check for overflow, but if the arguments come from a table that +// exists in memory and each element occupies a positive number of bytes then +// the result should be bounded by the amount of allocatable memory (which +// shouldn't overflow SIZE_MAX). +static inline size_t // +wuffs_base__table__flattened_length(size_t width, + size_t height, + size_t stride) { + if (height == 0) { + return 0; + } + return ((height - 1) * stride) + width; +} + +// ---------------- Magic Numbers + +// wuffs_base__magic_number_guess_fourcc guesses the file format of some data, +// given its starting bytes (the prefix_data argument) and whether or not there +// may be further bytes (the prefix_closed argument; true means that +// prefix_data is the entire data). +// +// It returns a positive FourCC value on success. +// +// It returns zero if nothing matches its hard-coded list of 'magic numbers'. +// +// It returns a negative value if prefix_closed is false and a longer prefix is +// required for a conclusive result. For example, a single 'B' byte (without +// further data) is not enough to discriminate the BMP and BPG image file +// formats. Similarly, a single '\xFF' byte might be the start of JPEG data or +// it might be the start of some other binary data. +// +// It does not do a full validity check. Like any guess made from a short +// prefix of the data, it may return false positives. Data that starts with 99 +// bytes of valid JPEG followed by corruption or truncation is an invalid JPEG +// image overall, but this function will still return WUFFS_BASE__FOURCC__JPEG. +// +// Another source of false positives is that some 'magic numbers' are valid +// ASCII data. A file starting with "GIF87a and GIF89a are the two versions of +// GIF" will match GIF's 'magic number' even if it's plain text, not an image. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__MAGIC sub-module, not just +// WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC int32_t // +wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, + bool prefix_closed); + +// ---------------- Ranges and Rects + +// See https://github.com/google/wuffs/blob/main/doc/note/ranges-and-rects.md + +typedef struct wuffs_base__range_ii_u32__struct { + uint32_t min_incl; + uint32_t max_incl; + +#ifdef __cplusplus + inline bool is_empty() const; + inline bool equals(wuffs_base__range_ii_u32__struct s) const; + inline wuffs_base__range_ii_u32__struct intersect( + wuffs_base__range_ii_u32__struct s) const; + inline wuffs_base__range_ii_u32__struct unite( + wuffs_base__range_ii_u32__struct s) const; + inline bool contains(uint32_t x) const; + inline bool contains_range(wuffs_base__range_ii_u32__struct s) const; +#endif // __cplusplus + +} wuffs_base__range_ii_u32; + +static inline wuffs_base__range_ii_u32 // +wuffs_base__empty_range_ii_u32() { + wuffs_base__range_ii_u32 ret; + ret.min_incl = 0; + ret.max_incl = 0; + return ret; +} + +static inline wuffs_base__range_ii_u32 // +wuffs_base__make_range_ii_u32(uint32_t min_incl, uint32_t max_incl) { + wuffs_base__range_ii_u32 ret; + ret.min_incl = min_incl; + ret.max_incl = max_incl; + return ret; +} + +static inline bool // +wuffs_base__range_ii_u32__is_empty(const wuffs_base__range_ii_u32* r) { + return r->min_incl > r->max_incl; +} + +static inline bool // +wuffs_base__range_ii_u32__equals(const wuffs_base__range_ii_u32* r, + wuffs_base__range_ii_u32 s) { + return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) || + (wuffs_base__range_ii_u32__is_empty(r) && + wuffs_base__range_ii_u32__is_empty(&s)); +} + +static inline wuffs_base__range_ii_u32 // +wuffs_base__range_ii_u32__intersect(const wuffs_base__range_ii_u32* r, + wuffs_base__range_ii_u32 s) { + wuffs_base__range_ii_u32 t; + t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl); + t.max_incl = wuffs_base__u32__min(r->max_incl, s.max_incl); + return t; +} + +static inline wuffs_base__range_ii_u32 // +wuffs_base__range_ii_u32__unite(const wuffs_base__range_ii_u32* r, + wuffs_base__range_ii_u32 s) { + if (wuffs_base__range_ii_u32__is_empty(r)) { + return s; + } + if (wuffs_base__range_ii_u32__is_empty(&s)) { + return *r; + } + wuffs_base__range_ii_u32 t; + t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl); + t.max_incl = wuffs_base__u32__max(r->max_incl, s.max_incl); + return t; +} + +static inline bool // +wuffs_base__range_ii_u32__contains(const wuffs_base__range_ii_u32* r, + uint32_t x) { + return (r->min_incl <= x) && (x <= r->max_incl); +} + +static inline bool // +wuffs_base__range_ii_u32__contains_range(const wuffs_base__range_ii_u32* r, + wuffs_base__range_ii_u32 s) { + return wuffs_base__range_ii_u32__equals( + &s, wuffs_base__range_ii_u32__intersect(r, s)); +} + +#ifdef __cplusplus + +inline bool // +wuffs_base__range_ii_u32::is_empty() const { + return wuffs_base__range_ii_u32__is_empty(this); +} + +inline bool // +wuffs_base__range_ii_u32::equals(wuffs_base__range_ii_u32 s) const { + return wuffs_base__range_ii_u32__equals(this, s); +} + +inline wuffs_base__range_ii_u32 // +wuffs_base__range_ii_u32::intersect(wuffs_base__range_ii_u32 s) const { + return wuffs_base__range_ii_u32__intersect(this, s); +} + +inline wuffs_base__range_ii_u32 // +wuffs_base__range_ii_u32::unite(wuffs_base__range_ii_u32 s) const { + return wuffs_base__range_ii_u32__unite(this, s); +} + +inline bool // +wuffs_base__range_ii_u32::contains(uint32_t x) const { + return wuffs_base__range_ii_u32__contains(this, x); +} + +inline bool // +wuffs_base__range_ii_u32::contains_range(wuffs_base__range_ii_u32 s) const { + return wuffs_base__range_ii_u32__contains_range(this, s); +} + +#endif // __cplusplus + +// -------- + +typedef struct wuffs_base__range_ie_u32__struct { + uint32_t min_incl; + uint32_t max_excl; + +#ifdef __cplusplus + inline bool is_empty() const; + inline bool equals(wuffs_base__range_ie_u32__struct s) const; + inline wuffs_base__range_ie_u32__struct intersect( + wuffs_base__range_ie_u32__struct s) const; + inline wuffs_base__range_ie_u32__struct unite( + wuffs_base__range_ie_u32__struct s) const; + inline bool contains(uint32_t x) const; + inline bool contains_range(wuffs_base__range_ie_u32__struct s) const; + inline uint32_t length() const; +#endif // __cplusplus + +} wuffs_base__range_ie_u32; + +static inline wuffs_base__range_ie_u32 // +wuffs_base__empty_range_ie_u32() { + wuffs_base__range_ie_u32 ret; + ret.min_incl = 0; + ret.max_excl = 0; + return ret; +} + +static inline wuffs_base__range_ie_u32 // +wuffs_base__make_range_ie_u32(uint32_t min_incl, uint32_t max_excl) { + wuffs_base__range_ie_u32 ret; + ret.min_incl = min_incl; + ret.max_excl = max_excl; + return ret; +} + +static inline bool // +wuffs_base__range_ie_u32__is_empty(const wuffs_base__range_ie_u32* r) { + return r->min_incl >= r->max_excl; +} + +static inline bool // +wuffs_base__range_ie_u32__equals(const wuffs_base__range_ie_u32* r, + wuffs_base__range_ie_u32 s) { + return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) || + (wuffs_base__range_ie_u32__is_empty(r) && + wuffs_base__range_ie_u32__is_empty(&s)); +} + +static inline wuffs_base__range_ie_u32 // +wuffs_base__range_ie_u32__intersect(const wuffs_base__range_ie_u32* r, + wuffs_base__range_ie_u32 s) { + wuffs_base__range_ie_u32 t; + t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl); + t.max_excl = wuffs_base__u32__min(r->max_excl, s.max_excl); + return t; +} + +static inline wuffs_base__range_ie_u32 // +wuffs_base__range_ie_u32__unite(const wuffs_base__range_ie_u32* r, + wuffs_base__range_ie_u32 s) { + if (wuffs_base__range_ie_u32__is_empty(r)) { + return s; + } + if (wuffs_base__range_ie_u32__is_empty(&s)) { + return *r; + } + wuffs_base__range_ie_u32 t; + t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl); + t.max_excl = wuffs_base__u32__max(r->max_excl, s.max_excl); + return t; +} + +static inline bool // +wuffs_base__range_ie_u32__contains(const wuffs_base__range_ie_u32* r, + uint32_t x) { + return (r->min_incl <= x) && (x < r->max_excl); +} + +static inline bool // +wuffs_base__range_ie_u32__contains_range(const wuffs_base__range_ie_u32* r, + wuffs_base__range_ie_u32 s) { + return wuffs_base__range_ie_u32__equals( + &s, wuffs_base__range_ie_u32__intersect(r, s)); +} + +static inline uint32_t // +wuffs_base__range_ie_u32__length(const wuffs_base__range_ie_u32* r) { + return wuffs_base__u32__sat_sub(r->max_excl, r->min_incl); +} + +#ifdef __cplusplus + +inline bool // +wuffs_base__range_ie_u32::is_empty() const { + return wuffs_base__range_ie_u32__is_empty(this); +} + +inline bool // +wuffs_base__range_ie_u32::equals(wuffs_base__range_ie_u32 s) const { + return wuffs_base__range_ie_u32__equals(this, s); +} + +inline wuffs_base__range_ie_u32 // +wuffs_base__range_ie_u32::intersect(wuffs_base__range_ie_u32 s) const { + return wuffs_base__range_ie_u32__intersect(this, s); +} + +inline wuffs_base__range_ie_u32 // +wuffs_base__range_ie_u32::unite(wuffs_base__range_ie_u32 s) const { + return wuffs_base__range_ie_u32__unite(this, s); +} + +inline bool // +wuffs_base__range_ie_u32::contains(uint32_t x) const { + return wuffs_base__range_ie_u32__contains(this, x); +} + +inline bool // +wuffs_base__range_ie_u32::contains_range(wuffs_base__range_ie_u32 s) const { + return wuffs_base__range_ie_u32__contains_range(this, s); +} + +inline uint32_t // +wuffs_base__range_ie_u32::length() const { + return wuffs_base__range_ie_u32__length(this); +} + +#endif // __cplusplus + +// -------- + +typedef struct wuffs_base__range_ii_u64__struct { + uint64_t min_incl; + uint64_t max_incl; + +#ifdef __cplusplus + inline bool is_empty() const; + inline bool equals(wuffs_base__range_ii_u64__struct s) const; + inline wuffs_base__range_ii_u64__struct intersect( + wuffs_base__range_ii_u64__struct s) const; + inline wuffs_base__range_ii_u64__struct unite( + wuffs_base__range_ii_u64__struct s) const; + inline bool contains(uint64_t x) const; + inline bool contains_range(wuffs_base__range_ii_u64__struct s) const; +#endif // __cplusplus + +} wuffs_base__range_ii_u64; + +static inline wuffs_base__range_ii_u64 // +wuffs_base__empty_range_ii_u64() { + wuffs_base__range_ii_u64 ret; + ret.min_incl = 0; + ret.max_incl = 0; + return ret; +} + +static inline wuffs_base__range_ii_u64 // +wuffs_base__make_range_ii_u64(uint64_t min_incl, uint64_t max_incl) { + wuffs_base__range_ii_u64 ret; + ret.min_incl = min_incl; + ret.max_incl = max_incl; + return ret; +} + +static inline bool // +wuffs_base__range_ii_u64__is_empty(const wuffs_base__range_ii_u64* r) { + return r->min_incl > r->max_incl; +} + +static inline bool // +wuffs_base__range_ii_u64__equals(const wuffs_base__range_ii_u64* r, + wuffs_base__range_ii_u64 s) { + return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) || + (wuffs_base__range_ii_u64__is_empty(r) && + wuffs_base__range_ii_u64__is_empty(&s)); +} + +static inline wuffs_base__range_ii_u64 // +wuffs_base__range_ii_u64__intersect(const wuffs_base__range_ii_u64* r, + wuffs_base__range_ii_u64 s) { + wuffs_base__range_ii_u64 t; + t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl); + t.max_incl = wuffs_base__u64__min(r->max_incl, s.max_incl); + return t; +} + +static inline wuffs_base__range_ii_u64 // +wuffs_base__range_ii_u64__unite(const wuffs_base__range_ii_u64* r, + wuffs_base__range_ii_u64 s) { + if (wuffs_base__range_ii_u64__is_empty(r)) { + return s; + } + if (wuffs_base__range_ii_u64__is_empty(&s)) { + return *r; + } + wuffs_base__range_ii_u64 t; + t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl); + t.max_incl = wuffs_base__u64__max(r->max_incl, s.max_incl); + return t; +} + +static inline bool // +wuffs_base__range_ii_u64__contains(const wuffs_base__range_ii_u64* r, + uint64_t x) { + return (r->min_incl <= x) && (x <= r->max_incl); +} + +static inline bool // +wuffs_base__range_ii_u64__contains_range(const wuffs_base__range_ii_u64* r, + wuffs_base__range_ii_u64 s) { + return wuffs_base__range_ii_u64__equals( + &s, wuffs_base__range_ii_u64__intersect(r, s)); +} + +#ifdef __cplusplus + +inline bool // +wuffs_base__range_ii_u64::is_empty() const { + return wuffs_base__range_ii_u64__is_empty(this); +} + +inline bool // +wuffs_base__range_ii_u64::equals(wuffs_base__range_ii_u64 s) const { + return wuffs_base__range_ii_u64__equals(this, s); +} + +inline wuffs_base__range_ii_u64 // +wuffs_base__range_ii_u64::intersect(wuffs_base__range_ii_u64 s) const { + return wuffs_base__range_ii_u64__intersect(this, s); +} + +inline wuffs_base__range_ii_u64 // +wuffs_base__range_ii_u64::unite(wuffs_base__range_ii_u64 s) const { + return wuffs_base__range_ii_u64__unite(this, s); +} + +inline bool // +wuffs_base__range_ii_u64::contains(uint64_t x) const { + return wuffs_base__range_ii_u64__contains(this, x); +} + +inline bool // +wuffs_base__range_ii_u64::contains_range(wuffs_base__range_ii_u64 s) const { + return wuffs_base__range_ii_u64__contains_range(this, s); +} + +#endif // __cplusplus + +// -------- + +typedef struct wuffs_base__range_ie_u64__struct { + uint64_t min_incl; + uint64_t max_excl; + +#ifdef __cplusplus + inline bool is_empty() const; + inline bool equals(wuffs_base__range_ie_u64__struct s) const; + inline wuffs_base__range_ie_u64__struct intersect( + wuffs_base__range_ie_u64__struct s) const; + inline wuffs_base__range_ie_u64__struct unite( + wuffs_base__range_ie_u64__struct s) const; + inline bool contains(uint64_t x) const; + inline bool contains_range(wuffs_base__range_ie_u64__struct s) const; + inline uint64_t length() const; +#endif // __cplusplus + +} wuffs_base__range_ie_u64; + +static inline wuffs_base__range_ie_u64 // +wuffs_base__empty_range_ie_u64() { + wuffs_base__range_ie_u64 ret; + ret.min_incl = 0; + ret.max_excl = 0; + return ret; +} + +static inline wuffs_base__range_ie_u64 // +wuffs_base__make_range_ie_u64(uint64_t min_incl, uint64_t max_excl) { + wuffs_base__range_ie_u64 ret; + ret.min_incl = min_incl; + ret.max_excl = max_excl; + return ret; +} + +static inline bool // +wuffs_base__range_ie_u64__is_empty(const wuffs_base__range_ie_u64* r) { + return r->min_incl >= r->max_excl; +} + +static inline bool // +wuffs_base__range_ie_u64__equals(const wuffs_base__range_ie_u64* r, + wuffs_base__range_ie_u64 s) { + return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) || + (wuffs_base__range_ie_u64__is_empty(r) && + wuffs_base__range_ie_u64__is_empty(&s)); +} + +static inline wuffs_base__range_ie_u64 // +wuffs_base__range_ie_u64__intersect(const wuffs_base__range_ie_u64* r, + wuffs_base__range_ie_u64 s) { + wuffs_base__range_ie_u64 t; + t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl); + t.max_excl = wuffs_base__u64__min(r->max_excl, s.max_excl); + return t; +} + +static inline wuffs_base__range_ie_u64 // +wuffs_base__range_ie_u64__unite(const wuffs_base__range_ie_u64* r, + wuffs_base__range_ie_u64 s) { + if (wuffs_base__range_ie_u64__is_empty(r)) { + return s; + } + if (wuffs_base__range_ie_u64__is_empty(&s)) { + return *r; + } + wuffs_base__range_ie_u64 t; + t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl); + t.max_excl = wuffs_base__u64__max(r->max_excl, s.max_excl); + return t; +} + +static inline bool // +wuffs_base__range_ie_u64__contains(const wuffs_base__range_ie_u64* r, + uint64_t x) { + return (r->min_incl <= x) && (x < r->max_excl); +} + +static inline bool // +wuffs_base__range_ie_u64__contains_range(const wuffs_base__range_ie_u64* r, + wuffs_base__range_ie_u64 s) { + return wuffs_base__range_ie_u64__equals( + &s, wuffs_base__range_ie_u64__intersect(r, s)); +} + +static inline uint64_t // +wuffs_base__range_ie_u64__length(const wuffs_base__range_ie_u64* r) { + return wuffs_base__u64__sat_sub(r->max_excl, r->min_incl); +} + +#ifdef __cplusplus + +inline bool // +wuffs_base__range_ie_u64::is_empty() const { + return wuffs_base__range_ie_u64__is_empty(this); +} + +inline bool // +wuffs_base__range_ie_u64::equals(wuffs_base__range_ie_u64 s) const { + return wuffs_base__range_ie_u64__equals(this, s); +} + +inline wuffs_base__range_ie_u64 // +wuffs_base__range_ie_u64::intersect(wuffs_base__range_ie_u64 s) const { + return wuffs_base__range_ie_u64__intersect(this, s); +} + +inline wuffs_base__range_ie_u64 // +wuffs_base__range_ie_u64::unite(wuffs_base__range_ie_u64 s) const { + return wuffs_base__range_ie_u64__unite(this, s); +} + +inline bool // +wuffs_base__range_ie_u64::contains(uint64_t x) const { + return wuffs_base__range_ie_u64__contains(this, x); +} + +inline bool // +wuffs_base__range_ie_u64::contains_range(wuffs_base__range_ie_u64 s) const { + return wuffs_base__range_ie_u64__contains_range(this, s); +} + +inline uint64_t // +wuffs_base__range_ie_u64::length() const { + return wuffs_base__range_ie_u64__length(this); +} + +#endif // __cplusplus + +// -------- + +typedef struct wuffs_base__rect_ii_u32__struct { + uint32_t min_incl_x; + uint32_t min_incl_y; + uint32_t max_incl_x; + uint32_t max_incl_y; + +#ifdef __cplusplus + inline bool is_empty() const; + inline bool equals(wuffs_base__rect_ii_u32__struct s) const; + inline wuffs_base__rect_ii_u32__struct intersect( + wuffs_base__rect_ii_u32__struct s) const; + inline wuffs_base__rect_ii_u32__struct unite( + wuffs_base__rect_ii_u32__struct s) const; + inline bool contains(uint32_t x, uint32_t y) const; + inline bool contains_rect(wuffs_base__rect_ii_u32__struct s) const; +#endif // __cplusplus + +} wuffs_base__rect_ii_u32; + +static inline wuffs_base__rect_ii_u32 // +wuffs_base__empty_rect_ii_u32() { + wuffs_base__rect_ii_u32 ret; + ret.min_incl_x = 0; + ret.min_incl_y = 0; + ret.max_incl_x = 0; + ret.max_incl_y = 0; + return ret; +} + +static inline wuffs_base__rect_ii_u32 // +wuffs_base__make_rect_ii_u32(uint32_t min_incl_x, + uint32_t min_incl_y, + uint32_t max_incl_x, + uint32_t max_incl_y) { + wuffs_base__rect_ii_u32 ret; + ret.min_incl_x = min_incl_x; + ret.min_incl_y = min_incl_y; + ret.max_incl_x = max_incl_x; + ret.max_incl_y = max_incl_y; + return ret; +} + +static inline bool // +wuffs_base__rect_ii_u32__is_empty(const wuffs_base__rect_ii_u32* r) { + return (r->min_incl_x > r->max_incl_x) || (r->min_incl_y > r->max_incl_y); +} + +static inline bool // +wuffs_base__rect_ii_u32__equals(const wuffs_base__rect_ii_u32* r, + wuffs_base__rect_ii_u32 s) { + return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y && + r->max_incl_x == s.max_incl_x && r->max_incl_y == s.max_incl_y) || + (wuffs_base__rect_ii_u32__is_empty(r) && + wuffs_base__rect_ii_u32__is_empty(&s)); +} + +static inline wuffs_base__rect_ii_u32 // +wuffs_base__rect_ii_u32__intersect(const wuffs_base__rect_ii_u32* r, + wuffs_base__rect_ii_u32 s) { + wuffs_base__rect_ii_u32 t; + t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x); + t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y); + t.max_incl_x = wuffs_base__u32__min(r->max_incl_x, s.max_incl_x); + t.max_incl_y = wuffs_base__u32__min(r->max_incl_y, s.max_incl_y); + return t; +} + +static inline wuffs_base__rect_ii_u32 // +wuffs_base__rect_ii_u32__unite(const wuffs_base__rect_ii_u32* r, + wuffs_base__rect_ii_u32 s) { + if (wuffs_base__rect_ii_u32__is_empty(r)) { + return s; + } + if (wuffs_base__rect_ii_u32__is_empty(&s)) { + return *r; + } + wuffs_base__rect_ii_u32 t; + t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x); + t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y); + t.max_incl_x = wuffs_base__u32__max(r->max_incl_x, s.max_incl_x); + t.max_incl_y = wuffs_base__u32__max(r->max_incl_y, s.max_incl_y); + return t; +} + +static inline bool // +wuffs_base__rect_ii_u32__contains(const wuffs_base__rect_ii_u32* r, + uint32_t x, + uint32_t y) { + return (r->min_incl_x <= x) && (x <= r->max_incl_x) && (r->min_incl_y <= y) && + (y <= r->max_incl_y); +} + +static inline bool // +wuffs_base__rect_ii_u32__contains_rect(const wuffs_base__rect_ii_u32* r, + wuffs_base__rect_ii_u32 s) { + return wuffs_base__rect_ii_u32__equals( + &s, wuffs_base__rect_ii_u32__intersect(r, s)); +} + +#ifdef __cplusplus + +inline bool // +wuffs_base__rect_ii_u32::is_empty() const { + return wuffs_base__rect_ii_u32__is_empty(this); +} + +inline bool // +wuffs_base__rect_ii_u32::equals(wuffs_base__rect_ii_u32 s) const { + return wuffs_base__rect_ii_u32__equals(this, s); +} + +inline wuffs_base__rect_ii_u32 // +wuffs_base__rect_ii_u32::intersect(wuffs_base__rect_ii_u32 s) const { + return wuffs_base__rect_ii_u32__intersect(this, s); +} + +inline wuffs_base__rect_ii_u32 // +wuffs_base__rect_ii_u32::unite(wuffs_base__rect_ii_u32 s) const { + return wuffs_base__rect_ii_u32__unite(this, s); +} + +inline bool // +wuffs_base__rect_ii_u32::contains(uint32_t x, uint32_t y) const { + return wuffs_base__rect_ii_u32__contains(this, x, y); +} + +inline bool // +wuffs_base__rect_ii_u32::contains_rect(wuffs_base__rect_ii_u32 s) const { + return wuffs_base__rect_ii_u32__contains_rect(this, s); +} + +#endif // __cplusplus + +// -------- + +typedef struct wuffs_base__rect_ie_u32__struct { + uint32_t min_incl_x; + uint32_t min_incl_y; + uint32_t max_excl_x; + uint32_t max_excl_y; + +#ifdef __cplusplus + inline bool is_empty() const; + inline bool equals(wuffs_base__rect_ie_u32__struct s) const; + inline wuffs_base__rect_ie_u32__struct intersect( + wuffs_base__rect_ie_u32__struct s) const; + inline wuffs_base__rect_ie_u32__struct unite( + wuffs_base__rect_ie_u32__struct s) const; + inline bool contains(uint32_t x, uint32_t y) const; + inline bool contains_rect(wuffs_base__rect_ie_u32__struct s) const; + inline uint32_t width() const; + inline uint32_t height() const; +#endif // __cplusplus + +} wuffs_base__rect_ie_u32; + +static inline wuffs_base__rect_ie_u32 // +wuffs_base__empty_rect_ie_u32() { + wuffs_base__rect_ie_u32 ret; + ret.min_incl_x = 0; + ret.min_incl_y = 0; + ret.max_excl_x = 0; + ret.max_excl_y = 0; + return ret; +} + +static inline wuffs_base__rect_ie_u32 // +wuffs_base__make_rect_ie_u32(uint32_t min_incl_x, + uint32_t min_incl_y, + uint32_t max_excl_x, + uint32_t max_excl_y) { + wuffs_base__rect_ie_u32 ret; + ret.min_incl_x = min_incl_x; + ret.min_incl_y = min_incl_y; + ret.max_excl_x = max_excl_x; + ret.max_excl_y = max_excl_y; + return ret; +} + +static inline bool // +wuffs_base__rect_ie_u32__is_empty(const wuffs_base__rect_ie_u32* r) { + return (r->min_incl_x >= r->max_excl_x) || (r->min_incl_y >= r->max_excl_y); +} + +static inline bool // +wuffs_base__rect_ie_u32__equals(const wuffs_base__rect_ie_u32* r, + wuffs_base__rect_ie_u32 s) { + return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y && + r->max_excl_x == s.max_excl_x && r->max_excl_y == s.max_excl_y) || + (wuffs_base__rect_ie_u32__is_empty(r) && + wuffs_base__rect_ie_u32__is_empty(&s)); +} + +static inline wuffs_base__rect_ie_u32 // +wuffs_base__rect_ie_u32__intersect(const wuffs_base__rect_ie_u32* r, + wuffs_base__rect_ie_u32 s) { + wuffs_base__rect_ie_u32 t; + t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x); + t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y); + t.max_excl_x = wuffs_base__u32__min(r->max_excl_x, s.max_excl_x); + t.max_excl_y = wuffs_base__u32__min(r->max_excl_y, s.max_excl_y); + return t; +} + +static inline wuffs_base__rect_ie_u32 // +wuffs_base__rect_ie_u32__unite(const wuffs_base__rect_ie_u32* r, + wuffs_base__rect_ie_u32 s) { + if (wuffs_base__rect_ie_u32__is_empty(r)) { + return s; + } + if (wuffs_base__rect_ie_u32__is_empty(&s)) { + return *r; + } + wuffs_base__rect_ie_u32 t; + t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x); + t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y); + t.max_excl_x = wuffs_base__u32__max(r->max_excl_x, s.max_excl_x); + t.max_excl_y = wuffs_base__u32__max(r->max_excl_y, s.max_excl_y); + return t; +} + +static inline bool // +wuffs_base__rect_ie_u32__contains(const wuffs_base__rect_ie_u32* r, + uint32_t x, + uint32_t y) { + return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->min_incl_y <= y) && + (y < r->max_excl_y); +} + +static inline bool // +wuffs_base__rect_ie_u32__contains_rect(const wuffs_base__rect_ie_u32* r, + wuffs_base__rect_ie_u32 s) { + return wuffs_base__rect_ie_u32__equals( + &s, wuffs_base__rect_ie_u32__intersect(r, s)); +} + +static inline uint32_t // +wuffs_base__rect_ie_u32__width(const wuffs_base__rect_ie_u32* r) { + return wuffs_base__u32__sat_sub(r->max_excl_x, r->min_incl_x); +} + +static inline uint32_t // +wuffs_base__rect_ie_u32__height(const wuffs_base__rect_ie_u32* r) { + return wuffs_base__u32__sat_sub(r->max_excl_y, r->min_incl_y); +} + +#ifdef __cplusplus + +inline bool // +wuffs_base__rect_ie_u32::is_empty() const { + return wuffs_base__rect_ie_u32__is_empty(this); +} + +inline bool // +wuffs_base__rect_ie_u32::equals(wuffs_base__rect_ie_u32 s) const { + return wuffs_base__rect_ie_u32__equals(this, s); +} + +inline wuffs_base__rect_ie_u32 // +wuffs_base__rect_ie_u32::intersect(wuffs_base__rect_ie_u32 s) const { + return wuffs_base__rect_ie_u32__intersect(this, s); +} + +inline wuffs_base__rect_ie_u32 // +wuffs_base__rect_ie_u32::unite(wuffs_base__rect_ie_u32 s) const { + return wuffs_base__rect_ie_u32__unite(this, s); +} + +inline bool // +wuffs_base__rect_ie_u32::contains(uint32_t x, uint32_t y) const { + return wuffs_base__rect_ie_u32__contains(this, x, y); +} + +inline bool // +wuffs_base__rect_ie_u32::contains_rect(wuffs_base__rect_ie_u32 s) const { + return wuffs_base__rect_ie_u32__contains_rect(this, s); +} + +inline uint32_t // +wuffs_base__rect_ie_u32::width() const { + return wuffs_base__rect_ie_u32__width(this); +} + +inline uint32_t // +wuffs_base__rect_ie_u32::height() const { + return wuffs_base__rect_ie_u32__height(this); +} + +#endif // __cplusplus + +// ---------------- More Information + +// wuffs_base__more_information holds additional fields, typically when a Wuffs +// method returns a [note status](/doc/note/statuses.md). +// +// The flavor field follows the base38 namespace +// convention](/doc/note/base38-and-fourcc.md). The other fields' semantics +// depends on the flavor. +typedef struct wuffs_base__more_information__struct { + uint32_t flavor; + uint32_t w; + uint64_t x; + uint64_t y; + uint64_t z; + +#ifdef __cplusplus + inline void set(uint32_t flavor_arg, + uint32_t w_arg, + uint64_t x_arg, + uint64_t y_arg, + uint64_t z_arg); + inline uint32_t io_redirect__fourcc() const; + inline wuffs_base__range_ie_u64 io_redirect__range() const; + inline uint64_t io_seek__position() const; + inline uint32_t metadata__fourcc() const; + // Deprecated: use metadata_raw_passthrough__range. + inline wuffs_base__range_ie_u64 metadata__range() const; + inline wuffs_base__range_ie_u64 metadata_raw_passthrough__range() const; + inline int32_t metadata_parsed__chrm(uint32_t component) const; + inline uint32_t metadata_parsed__gama() const; + inline uint32_t metadata_parsed__srgb() const; +#endif // __cplusplus + +} wuffs_base__more_information; + +#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_REDIRECT 1 +#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_SEEK 2 +// Deprecated: use +// WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH. +#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA 3 +#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH 3 +#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_TRANSFORM 4 +#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED 5 + +static inline wuffs_base__more_information // +wuffs_base__empty_more_information() { + wuffs_base__more_information ret; + ret.flavor = 0; + ret.w = 0; + ret.x = 0; + ret.y = 0; + ret.z = 0; + return ret; +} + +static inline void // +wuffs_base__more_information__set(wuffs_base__more_information* m, + uint32_t flavor, + uint32_t w, + uint64_t x, + uint64_t y, + uint64_t z) { + if (!m) { + return; + } + m->flavor = flavor; + m->w = w; + m->x = x; + m->y = y; + m->z = z; +} + +static inline uint32_t // +wuffs_base__more_information__io_redirect__fourcc( + const wuffs_base__more_information* m) { + return m->w; +} + +static inline wuffs_base__range_ie_u64 // +wuffs_base__more_information__io_redirect__range( + const wuffs_base__more_information* m) { + wuffs_base__range_ie_u64 ret; + ret.min_incl = m->y; + ret.max_excl = m->z; + return ret; +} + +static inline uint64_t // +wuffs_base__more_information__io_seek__position( + const wuffs_base__more_information* m) { + return m->x; +} + +static inline uint32_t // +wuffs_base__more_information__metadata__fourcc( + const wuffs_base__more_information* m) { + return m->w; +} + +// Deprecated: use +// wuffs_base__more_information__metadata_raw_passthrough__range. +static inline wuffs_base__range_ie_u64 // +wuffs_base__more_information__metadata__range( + const wuffs_base__more_information* m) { + wuffs_base__range_ie_u64 ret; + ret.min_incl = m->y; + ret.max_excl = m->z; + return ret; +} + +static inline wuffs_base__range_ie_u64 // +wuffs_base__more_information__metadata_raw_passthrough__range( + const wuffs_base__more_information* m) { + wuffs_base__range_ie_u64 ret; + ret.min_incl = m->y; + ret.max_excl = m->z; + return ret; +} + +#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__WHITE_X 0 +#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__WHITE_Y 1 +#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__RED_X 2 +#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__RED_Y 3 +#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__GREEN_X 4 +#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__GREEN_Y 5 +#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__BLUE_X 6 +#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__BLUE_Y 7 + +// wuffs_base__more_information__metadata_parsed__chrm returns chromaticity +// values (scaled by 100000) like the PNG "cHRM" chunk. For example, the sRGB +// color space corresponds to: +// - ETC__CHRM__WHITE_X 31270 +// - ETC__CHRM__WHITE_Y 32900 +// - ETC__CHRM__RED_X 64000 +// - ETC__CHRM__RED_Y 33000 +// - ETC__CHRM__GREEN_X 30000 +// - ETC__CHRM__GREEN_Y 60000 +// - ETC__CHRM__BLUE_X 15000 +// - ETC__CHRM__BLUE_Y 6000 +// +// See +// https://ciechanow.ski/color-spaces/#chromaticity-and-white-point-coordinates +static inline int32_t // +wuffs_base__more_information__metadata_parsed__chrm( + const wuffs_base__more_information* m, + uint32_t component) { + // After the flavor and the w field (holding a FourCC), a + // wuffs_base__more_information holds 24 bytes of data in three uint64_t + // typed fields (x, y and z). We pack the eight chromaticity values (wx, wy, + // rx, ..., by), basically int24_t values, into 24 bytes like this: + // - LSB MSB + // - x: wx wx wx wy wy wy rx rx + // - y: rx ry ry ry gx gx gx gy + // - z: gy gy bx bx bx by by by + uint32_t u = 0; + switch (component & 7) { + case 0: + u = ((uint32_t)(m->x >> 0)); + break; + case 1: + u = ((uint32_t)(m->x >> 24)); + break; + case 2: + u = ((uint32_t)((m->x >> 48) | (m->y << 16))); + break; + case 3: + u = ((uint32_t)(m->y >> 8)); + break; + case 4: + u = ((uint32_t)(m->y >> 32)); + break; + case 5: + u = ((uint32_t)((m->y >> 56) | (m->z << 8))); + break; + case 6: + u = ((uint32_t)(m->z >> 16)); + break; + case 7: + u = ((uint32_t)(m->z >> 40)); + break; + } + // The left-right shifts sign-extend from 24-bit to 32-bit integers. + return ((int32_t)(u << 8)) >> 8; +} + +// wuffs_base__more_information__metadata_parsed__gama returns inverse gamma +// correction values (scaled by 100000) like the PNG "gAMA" chunk. For example, +// for gamma = 2.2, this returns 45455 (approximating 100000 / 2.2). +static inline uint32_t // +wuffs_base__more_information__metadata_parsed__gama( + const wuffs_base__more_information* m) { + return ((uint32_t)(m->x)); +} + +#define WUFFS_BASE__SRGB_RENDERING_INTENT__PERCEPTUAL 0 +#define WUFFS_BASE__SRGB_RENDERING_INTENT__RELATIVE_COLORIMETRIC 1 +#define WUFFS_BASE__SRGB_RENDERING_INTENT__SATURATION 2 +#define WUFFS_BASE__SRGB_RENDERING_INTENT__ABSOLUTE_COLORIMETRIC 3 + +// wuffs_base__more_information__metadata_parsed__srgb returns the sRGB +// rendering intent like the PNG "sRGB" chunk. +static inline uint32_t // +wuffs_base__more_information__metadata_parsed__srgb( + const wuffs_base__more_information* m) { + return m->x & 3; +} + +#ifdef __cplusplus + +inline void // +wuffs_base__more_information::set(uint32_t flavor_arg, + uint32_t w_arg, + uint64_t x_arg, + uint64_t y_arg, + uint64_t z_arg) { + wuffs_base__more_information__set(this, flavor_arg, w_arg, x_arg, y_arg, + z_arg); +} + +inline uint32_t // +wuffs_base__more_information::io_redirect__fourcc() const { + return wuffs_base__more_information__io_redirect__fourcc(this); +} + +inline wuffs_base__range_ie_u64 // +wuffs_base__more_information::io_redirect__range() const { + return wuffs_base__more_information__io_redirect__range(this); +} + +inline uint64_t // +wuffs_base__more_information::io_seek__position() const { + return wuffs_base__more_information__io_seek__position(this); +} + +inline uint32_t // +wuffs_base__more_information::metadata__fourcc() const { + return wuffs_base__more_information__metadata__fourcc(this); +} + +inline wuffs_base__range_ie_u64 // +wuffs_base__more_information::metadata__range() const { + return wuffs_base__more_information__metadata__range(this); +} + +inline wuffs_base__range_ie_u64 // +wuffs_base__more_information::metadata_raw_passthrough__range() const { + return wuffs_base__more_information__metadata_raw_passthrough__range(this); +} + +inline int32_t // +wuffs_base__more_information::metadata_parsed__chrm(uint32_t component) const { + return wuffs_base__more_information__metadata_parsed__chrm(this, component); +} + +inline uint32_t // +wuffs_base__more_information::metadata_parsed__gama() const { + return wuffs_base__more_information__metadata_parsed__gama(this); +} + +inline uint32_t // +wuffs_base__more_information::metadata_parsed__srgb() const { + return wuffs_base__more_information__metadata_parsed__srgb(this); +} + +#endif // __cplusplus + +// ---------------- I/O +// +// See (/doc/note/io-input-output.md). + +// wuffs_base__io_buffer_meta is the metadata for a wuffs_base__io_buffer's +// data. +typedef struct wuffs_base__io_buffer_meta__struct { + size_t wi; // Write index. Invariant: wi <= len. + size_t ri; // Read index. Invariant: ri <= wi. + uint64_t pos; // Buffer position (relative to the start of stream). + bool closed; // No further writes are expected. +} wuffs_base__io_buffer_meta; + +// wuffs_base__io_buffer is a 1-dimensional buffer (a pointer and length) plus +// additional metadata. +// +// A value with all fields zero is a valid, empty buffer. +typedef struct wuffs_base__io_buffer__struct { + wuffs_base__slice_u8 data; + wuffs_base__io_buffer_meta meta; + +#ifdef __cplusplus + inline bool is_valid() const; + inline void compact(); + inline size_t reader_length() const; + inline uint8_t* reader_pointer() const; + inline uint64_t reader_position() const; + inline wuffs_base__slice_u8 reader_slice() const; + inline size_t writer_length() const; + inline uint8_t* writer_pointer() const; + inline uint64_t writer_position() const; + inline wuffs_base__slice_u8 writer_slice() const; + + // Deprecated: use reader_position. + inline uint64_t reader_io_position() const; + // Deprecated: use writer_position. + inline uint64_t writer_io_position() const; +#endif // __cplusplus + +} wuffs_base__io_buffer; + +static inline wuffs_base__io_buffer // +wuffs_base__make_io_buffer(wuffs_base__slice_u8 data, + wuffs_base__io_buffer_meta meta) { + wuffs_base__io_buffer ret; + ret.data = data; + ret.meta = meta; + return ret; +} + +static inline wuffs_base__io_buffer_meta // +wuffs_base__make_io_buffer_meta(size_t wi, + size_t ri, + uint64_t pos, + bool closed) { + wuffs_base__io_buffer_meta ret; + ret.wi = wi; + ret.ri = ri; + ret.pos = pos; + ret.closed = closed; + return ret; +} + +static inline wuffs_base__io_buffer // +wuffs_base__ptr_u8__reader(uint8_t* ptr, size_t len, bool closed) { + wuffs_base__io_buffer ret; + ret.data.ptr = ptr; + ret.data.len = len; + ret.meta.wi = len; + ret.meta.ri = 0; + ret.meta.pos = 0; + ret.meta.closed = closed; + return ret; +} + +static inline wuffs_base__io_buffer // +wuffs_base__ptr_u8__writer(uint8_t* ptr, size_t len) { + wuffs_base__io_buffer ret; + ret.data.ptr = ptr; + ret.data.len = len; + ret.meta.wi = 0; + ret.meta.ri = 0; + ret.meta.pos = 0; + ret.meta.closed = false; + return ret; +} + +static inline wuffs_base__io_buffer // +wuffs_base__slice_u8__reader(wuffs_base__slice_u8 s, bool closed) { + wuffs_base__io_buffer ret; + ret.data.ptr = s.ptr; + ret.data.len = s.len; + ret.meta.wi = s.len; + ret.meta.ri = 0; + ret.meta.pos = 0; + ret.meta.closed = closed; + return ret; +} + +static inline wuffs_base__io_buffer // +wuffs_base__slice_u8__writer(wuffs_base__slice_u8 s) { + wuffs_base__io_buffer ret; + ret.data.ptr = s.ptr; + ret.data.len = s.len; + ret.meta.wi = 0; + ret.meta.ri = 0; + ret.meta.pos = 0; + ret.meta.closed = false; + return ret; +} + +static inline wuffs_base__io_buffer // +wuffs_base__empty_io_buffer() { + wuffs_base__io_buffer ret; + ret.data.ptr = NULL; + ret.data.len = 0; + ret.meta.wi = 0; + ret.meta.ri = 0; + ret.meta.pos = 0; + ret.meta.closed = false; + return ret; +} + +static inline wuffs_base__io_buffer_meta // +wuffs_base__empty_io_buffer_meta() { + wuffs_base__io_buffer_meta ret; + ret.wi = 0; + ret.ri = 0; + ret.pos = 0; + ret.closed = false; + return ret; +} + +static inline bool // +wuffs_base__io_buffer__is_valid(const wuffs_base__io_buffer* buf) { + if (buf) { + if (buf->data.ptr) { + return (buf->meta.ri <= buf->meta.wi) && (buf->meta.wi <= buf->data.len); + } else { + return (buf->meta.ri == 0) && (buf->meta.wi == 0) && (buf->data.len == 0); + } + } + return false; +} + +// wuffs_base__io_buffer__compact moves any written but unread bytes to the +// start of the buffer. +static inline void // +wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) { + if (!buf || (buf->meta.ri == 0)) { + return; + } + buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri); + size_t n = buf->meta.wi - buf->meta.ri; + if (n != 0) { + memmove(buf->data.ptr, buf->data.ptr + buf->meta.ri, n); + } + buf->meta.wi = n; + buf->meta.ri = 0; +} + +// Deprecated. Use wuffs_base__io_buffer__reader_position. +static inline uint64_t // +wuffs_base__io_buffer__reader_io_position(const wuffs_base__io_buffer* buf) { + return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri) : 0; +} + +static inline size_t // +wuffs_base__io_buffer__reader_length(const wuffs_base__io_buffer* buf) { + return buf ? buf->meta.wi - buf->meta.ri : 0; +} + +static inline uint8_t* // +wuffs_base__io_buffer__reader_pointer(const wuffs_base__io_buffer* buf) { + return buf ? (buf->data.ptr + buf->meta.ri) : NULL; +} + +static inline uint64_t // +wuffs_base__io_buffer__reader_position(const wuffs_base__io_buffer* buf) { + return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri) : 0; +} + +static inline wuffs_base__slice_u8 // +wuffs_base__io_buffer__reader_slice(const wuffs_base__io_buffer* buf) { + return buf ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri, + buf->meta.wi - buf->meta.ri) + : wuffs_base__empty_slice_u8(); +} + +// Deprecated. Use wuffs_base__io_buffer__writer_position. +static inline uint64_t // +wuffs_base__io_buffer__writer_io_position(const wuffs_base__io_buffer* buf) { + return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.wi) : 0; +} + +static inline size_t // +wuffs_base__io_buffer__writer_length(const wuffs_base__io_buffer* buf) { + return buf ? buf->data.len - buf->meta.wi : 0; +} + +static inline uint8_t* // +wuffs_base__io_buffer__writer_pointer(const wuffs_base__io_buffer* buf) { + return buf ? (buf->data.ptr + buf->meta.wi) : NULL; +} + +static inline uint64_t // +wuffs_base__io_buffer__writer_position(const wuffs_base__io_buffer* buf) { + return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.wi) : 0; +} + +static inline wuffs_base__slice_u8 // +wuffs_base__io_buffer__writer_slice(const wuffs_base__io_buffer* buf) { + return buf ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi, + buf->data.len - buf->meta.wi) + : wuffs_base__empty_slice_u8(); +} + +#ifdef __cplusplus + +inline bool // +wuffs_base__io_buffer::is_valid() const { + return wuffs_base__io_buffer__is_valid(this); +} + +inline void // +wuffs_base__io_buffer::compact() { + wuffs_base__io_buffer__compact(this); +} + +inline uint64_t // +wuffs_base__io_buffer::reader_io_position() const { + return wuffs_base__io_buffer__reader_io_position(this); +} + +inline size_t // +wuffs_base__io_buffer::reader_length() const { + return wuffs_base__io_buffer__reader_length(this); +} + +inline uint8_t* // +wuffs_base__io_buffer::reader_pointer() const { + return wuffs_base__io_buffer__reader_pointer(this); +} + +inline uint64_t // +wuffs_base__io_buffer::reader_position() const { + return wuffs_base__io_buffer__reader_position(this); +} + +inline wuffs_base__slice_u8 // +wuffs_base__io_buffer::reader_slice() const { + return wuffs_base__io_buffer__reader_slice(this); +} + +inline uint64_t // +wuffs_base__io_buffer::writer_io_position() const { + return wuffs_base__io_buffer__writer_io_position(this); +} + +inline size_t // +wuffs_base__io_buffer::writer_length() const { + return wuffs_base__io_buffer__writer_length(this); +} + +inline uint8_t* // +wuffs_base__io_buffer::writer_pointer() const { + return wuffs_base__io_buffer__writer_pointer(this); +} + +inline uint64_t // +wuffs_base__io_buffer::writer_position() const { + return wuffs_base__io_buffer__writer_position(this); +} + +inline wuffs_base__slice_u8 // +wuffs_base__io_buffer::writer_slice() const { + return wuffs_base__io_buffer__writer_slice(this); +} + +#endif // __cplusplus + +// ---------------- Tokens + +// wuffs_base__token is an element of a byte stream's tokenization. +// +// See https://github.com/google/wuffs/blob/main/doc/note/tokens.md +typedef struct wuffs_base__token__struct { + uint64_t repr; + +#ifdef __cplusplus + inline int64_t value() const; + inline int64_t value_extension() const; + inline int64_t value_major() const; + inline int64_t value_base_category() const; + inline uint64_t value_minor() const; + inline uint64_t value_base_detail() const; + inline int64_t value_base_detail__sign_extended() const; + inline bool continued() const; + inline uint64_t length() const; +#endif // __cplusplus + +} wuffs_base__token; + +static inline wuffs_base__token // +wuffs_base__make_token(uint64_t repr) { + wuffs_base__token ret; + ret.repr = repr; + return ret; +} + +// -------- + +#define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF + +#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17 +#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17 +#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42 +#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17 +#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38 +#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17 +#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16 +#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0 + +#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS 46 + +// -------- + +#define WUFFS_BASE__TOKEN__VBC__FILLER 0 +#define WUFFS_BASE__TOKEN__VBC__STRUCTURE 1 +#define WUFFS_BASE__TOKEN__VBC__STRING 2 +#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT 3 +#define WUFFS_BASE__TOKEN__VBC__LITERAL 4 +#define WUFFS_BASE__TOKEN__VBC__NUMBER 5 +#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED 6 +#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED 7 + +// -------- + +#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION 0x00001 +#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_BLOCK 0x00002 +#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE 0x00004 + +// COMMENT_ANY is a bit-wise or of COMMENT_BLOCK AND COMMENT_LINE. +#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY 0x00006 + +// -------- + +#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH 0x00001 +#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP 0x00002 +#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE 0x00010 +#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST 0x00020 +#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT 0x00040 +#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE 0x01000 +#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST 0x02000 +#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT 0x04000 + +// -------- + +// DEFINITELY_FOO means that the destination bytes (and also the source bytes, +// for 1_DST_1_SRC_COPY) are in the FOO format. Definitely means that the lack +// of the bit means "maybe FOO". It does not necessarily mean "not FOO". +// +// CHAIN_ETC means that decoding the entire token chain forms a UTF-8 or ASCII +// string, not just this current token. CHAIN_ETC_UTF_8 therefore distinguishes +// Unicode (UTF-8) strings from byte strings. MUST means that the the token +// producer (e.g. parser) must verify this. SHOULD means that the token +// consumer (e.g. renderer) should verify this. +// +// When a CHAIN_ETC_UTF_8 bit is set, the parser must ensure that non-ASCII +// code points (with multi-byte UTF-8 encodings) do not straddle token +// boundaries. Checking UTF-8 validity can inspect each token separately. +// +// The lack of any particular bit is conservative: it is valid for all-ASCII +// strings, in a single- or multi-token chain, to have none of these bits set. +#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8 0x00001 +#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 0x00002 +#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_UTF_8 0x00004 +#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII 0x00010 +#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII 0x00020 +#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_ASCII 0x00040 + +// CONVERT_D_DST_S_SRC means that multiples of S source bytes (possibly padded) +// produces multiples of D destination bytes. For example, +// CONVERT_1_DST_4_SRC_BACKSLASH_X means a source like "\\x23\\x67\\xAB", where +// 12 src bytes encode 3 dst bytes. +// +// Post-processing may further transform those D destination bytes (e.g. treat +// "\\xFF" as the Unicode code point U+00FF instead of the byte 0xFF), but that +// is out of scope of this VBD's semantics. +// +// When src is the empty string, multiple conversion algorithms are applicable +// (so these bits are not necessarily mutually exclusive), all producing the +// same empty dst string. +#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP 0x00100 +#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY 0x00200 +#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_2_SRC_HEXADECIMAL 0x00400 +#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X 0x00800 +#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_STD 0x01000 +#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_URL 0x02000 +#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85 0x04000 +#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_HEX 0x08000 +#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_STD 0x10000 + +// -------- + +#define WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED 0x00001 +#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL 0x00002 +#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE 0x00004 +#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE 0x00008 + +// -------- + +// For a source string of "123" or "0x9A", it is valid for a tokenizer to +// return any combination of: +// - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT. +// - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED. +// - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED. +// +// For a source string of "+123" or "-0x9A", only the first two are valid. +// +// For a source string of "123.", only the first one is valid. +#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT 0x00001 +#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED 0x00002 +#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED 0x00004 + +#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF 0x00010 +#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_INF 0x00020 +#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_NAN 0x00040 +#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_NAN 0x00080 + +// The number 300 might be represented as "\x01\x2C", "\x2C\x01\x00\x00" or +// "300", which are big-endian, little-endian or text. For binary formats, the +// token length (after adjusting for FORMAT_IGNORE_ETC) discriminates +// e.g. u16 little-endian vs u32 little-endian. +#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN 0x00100 +#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_LITTLE_ENDIAN 0x00200 +#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT 0x00400 + +#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE 0x01000 + +// -------- + +// wuffs_base__token__value returns the token's high 46 bits, sign-extended. A +// negative value means an extended token, non-negative means a simple token. +static inline int64_t // +wuffs_base__token__value(const wuffs_base__token* t) { + return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE__SHIFT; +} + +// wuffs_base__token__value_extension returns a negative value if the token was +// not an extended token. +static inline int64_t // +wuffs_base__token__value_extension(const wuffs_base__token* t) { + return (~(int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT; +} + +// wuffs_base__token__value_major returns a negative value if the token was not +// a simple token. +static inline int64_t // +wuffs_base__token__value_major(const wuffs_base__token* t) { + return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT; +} + +// wuffs_base__token__value_base_category returns a negative value if the token +// was not a simple token. +static inline int64_t // +wuffs_base__token__value_base_category(const wuffs_base__token* t) { + return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT; +} + +static inline uint64_t // +wuffs_base__token__value_minor(const wuffs_base__token* t) { + return (t->repr >> WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) & 0x1FFFFFF; +} + +static inline uint64_t // +wuffs_base__token__value_base_detail(const wuffs_base__token* t) { + return (t->repr >> WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT) & 0x1FFFFF; +} + +static inline int64_t // +wuffs_base__token__value_base_detail__sign_extended( + const wuffs_base__token* t) { + // The VBD is 21 bits in the middle of t->repr. Left shift the high (64 - 21 + // - ETC__SHIFT) bits off, then right shift (sign-extending) back down. + uint64_t u = t->repr << (43 - WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT); + return ((int64_t)u) >> 43; +} + +static inline bool // +wuffs_base__token__continued(const wuffs_base__token* t) { + return t->repr & 0x10000; +} + +static inline uint64_t // +wuffs_base__token__length(const wuffs_base__token* t) { + return (t->repr >> WUFFS_BASE__TOKEN__LENGTH__SHIFT) & 0xFFFF; +} + +#ifdef __cplusplus + +inline int64_t // +wuffs_base__token::value() const { + return wuffs_base__token__value(this); +} + +inline int64_t // +wuffs_base__token::value_extension() const { + return wuffs_base__token__value_extension(this); +} + +inline int64_t // +wuffs_base__token::value_major() const { + return wuffs_base__token__value_major(this); +} + +inline int64_t // +wuffs_base__token::value_base_category() const { + return wuffs_base__token__value_base_category(this); +} + +inline uint64_t // +wuffs_base__token::value_minor() const { + return wuffs_base__token__value_minor(this); +} + +inline uint64_t // +wuffs_base__token::value_base_detail() const { + return wuffs_base__token__value_base_detail(this); +} + +inline int64_t // +wuffs_base__token::value_base_detail__sign_extended() const { + return wuffs_base__token__value_base_detail__sign_extended(this); +} + +inline bool // +wuffs_base__token::continued() const { + return wuffs_base__token__continued(this); +} + +inline uint64_t // +wuffs_base__token::length() const { + return wuffs_base__token__length(this); +} + +#endif // __cplusplus + +// -------- + +typedef WUFFS_BASE__SLICE(wuffs_base__token) wuffs_base__slice_token; + +static inline wuffs_base__slice_token // +wuffs_base__make_slice_token(wuffs_base__token* ptr, size_t len) { + wuffs_base__slice_token ret; + ret.ptr = ptr; + ret.len = len; + return ret; +} + +static inline wuffs_base__slice_token // +wuffs_base__empty_slice_token() { + wuffs_base__slice_token ret; + ret.ptr = NULL; + ret.len = 0; + return ret; +} + +// -------- + +// wuffs_base__token_buffer_meta is the metadata for a +// wuffs_base__token_buffer's data. +typedef struct wuffs_base__token_buffer_meta__struct { + size_t wi; // Write index. Invariant: wi <= len. + size_t ri; // Read index. Invariant: ri <= wi. + uint64_t pos; // Position of the buffer start relative to the stream start. + bool closed; // No further writes are expected. +} wuffs_base__token_buffer_meta; + +// wuffs_base__token_buffer is a 1-dimensional buffer (a pointer and length) +// plus additional metadata. +// +// A value with all fields zero is a valid, empty buffer. +typedef struct wuffs_base__token_buffer__struct { + wuffs_base__slice_token data; + wuffs_base__token_buffer_meta meta; + +#ifdef __cplusplus + inline bool is_valid() const; + inline void compact(); + inline uint64_t reader_length() const; + inline wuffs_base__token* reader_pointer() const; + inline wuffs_base__slice_token reader_slice() const; + inline uint64_t reader_token_position() const; + inline uint64_t writer_length() const; + inline uint64_t writer_token_position() const; + inline wuffs_base__token* writer_pointer() const; + inline wuffs_base__slice_token writer_slice() const; +#endif // __cplusplus + +} wuffs_base__token_buffer; + +static inline wuffs_base__token_buffer // +wuffs_base__make_token_buffer(wuffs_base__slice_token data, + wuffs_base__token_buffer_meta meta) { + wuffs_base__token_buffer ret; + ret.data = data; + ret.meta = meta; + return ret; +} + +static inline wuffs_base__token_buffer_meta // +wuffs_base__make_token_buffer_meta(size_t wi, + size_t ri, + uint64_t pos, + bool closed) { + wuffs_base__token_buffer_meta ret; + ret.wi = wi; + ret.ri = ri; + ret.pos = pos; + ret.closed = closed; + return ret; +} + +static inline wuffs_base__token_buffer // +wuffs_base__slice_token__reader(wuffs_base__slice_token s, bool closed) { + wuffs_base__token_buffer ret; + ret.data.ptr = s.ptr; + ret.data.len = s.len; + ret.meta.wi = s.len; + ret.meta.ri = 0; + ret.meta.pos = 0; + ret.meta.closed = closed; + return ret; +} + +static inline wuffs_base__token_buffer // +wuffs_base__slice_token__writer(wuffs_base__slice_token s) { + wuffs_base__token_buffer ret; + ret.data.ptr = s.ptr; + ret.data.len = s.len; + ret.meta.wi = 0; + ret.meta.ri = 0; + ret.meta.pos = 0; + ret.meta.closed = false; + return ret; +} + +static inline wuffs_base__token_buffer // +wuffs_base__empty_token_buffer() { + wuffs_base__token_buffer ret; + ret.data.ptr = NULL; + ret.data.len = 0; + ret.meta.wi = 0; + ret.meta.ri = 0; + ret.meta.pos = 0; + ret.meta.closed = false; + return ret; +} + +static inline wuffs_base__token_buffer_meta // +wuffs_base__empty_token_buffer_meta() { + wuffs_base__token_buffer_meta ret; + ret.wi = 0; + ret.ri = 0; + ret.pos = 0; + ret.closed = false; + return ret; +} + +static inline bool // +wuffs_base__token_buffer__is_valid(const wuffs_base__token_buffer* buf) { + if (buf) { + if (buf->data.ptr) { + return (buf->meta.ri <= buf->meta.wi) && (buf->meta.wi <= buf->data.len); + } else { + return (buf->meta.ri == 0) && (buf->meta.wi == 0) && (buf->data.len == 0); + } + } + return false; +} + +// wuffs_base__token_buffer__compact moves any written but unread tokens to the +// start of the buffer. +static inline void // +wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) { + if (!buf || (buf->meta.ri == 0)) { + return; + } + buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri); + size_t n = buf->meta.wi - buf->meta.ri; + if (n != 0) { + memmove(buf->data.ptr, buf->data.ptr + buf->meta.ri, + n * sizeof(wuffs_base__token)); + } + buf->meta.wi = n; + buf->meta.ri = 0; +} + +static inline uint64_t // +wuffs_base__token_buffer__reader_length(const wuffs_base__token_buffer* buf) { + return buf ? buf->meta.wi - buf->meta.ri : 0; +} + +static inline wuffs_base__token* // +wuffs_base__token_buffer__reader_pointer(const wuffs_base__token_buffer* buf) { + return buf ? (buf->data.ptr + buf->meta.ri) : NULL; +} + +static inline wuffs_base__slice_token // +wuffs_base__token_buffer__reader_slice(const wuffs_base__token_buffer* buf) { + return buf ? wuffs_base__make_slice_token(buf->data.ptr + buf->meta.ri, + buf->meta.wi - buf->meta.ri) + : wuffs_base__empty_slice_token(); +} + +static inline uint64_t // +wuffs_base__token_buffer__reader_token_position( + const wuffs_base__token_buffer* buf) { + return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri) : 0; +} + +static inline uint64_t // +wuffs_base__token_buffer__writer_length(const wuffs_base__token_buffer* buf) { + return buf ? buf->data.len - buf->meta.wi : 0; +} + +static inline wuffs_base__token* // +wuffs_base__token_buffer__writer_pointer(const wuffs_base__token_buffer* buf) { + return buf ? (buf->data.ptr + buf->meta.wi) : NULL; +} + +static inline wuffs_base__slice_token // +wuffs_base__token_buffer__writer_slice(const wuffs_base__token_buffer* buf) { + return buf ? wuffs_base__make_slice_token(buf->data.ptr + buf->meta.wi, + buf->data.len - buf->meta.wi) + : wuffs_base__empty_slice_token(); +} + +static inline uint64_t // +wuffs_base__token_buffer__writer_token_position( + const wuffs_base__token_buffer* buf) { + return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.wi) : 0; +} + +#ifdef __cplusplus + +inline bool // +wuffs_base__token_buffer::is_valid() const { + return wuffs_base__token_buffer__is_valid(this); +} + +inline void // +wuffs_base__token_buffer::compact() { + wuffs_base__token_buffer__compact(this); +} + +inline uint64_t // +wuffs_base__token_buffer::reader_length() const { + return wuffs_base__token_buffer__reader_length(this); +} + +inline wuffs_base__token* // +wuffs_base__token_buffer::reader_pointer() const { + return wuffs_base__token_buffer__reader_pointer(this); +} + +inline wuffs_base__slice_token // +wuffs_base__token_buffer::reader_slice() const { + return wuffs_base__token_buffer__reader_slice(this); +} + +inline uint64_t // +wuffs_base__token_buffer::reader_token_position() const { + return wuffs_base__token_buffer__reader_token_position(this); +} + +inline uint64_t // +wuffs_base__token_buffer::writer_length() const { + return wuffs_base__token_buffer__writer_length(this); +} + +inline wuffs_base__token* // +wuffs_base__token_buffer::writer_pointer() const { + return wuffs_base__token_buffer__writer_pointer(this); +} + +inline wuffs_base__slice_token // +wuffs_base__token_buffer::writer_slice() const { + return wuffs_base__token_buffer__writer_slice(this); +} + +inline uint64_t // +wuffs_base__token_buffer::writer_token_position() const { + return wuffs_base__token_buffer__writer_token_position(this); +} + +#endif // __cplusplus + +// ---------------- Memory Allocation + +// The memory allocation related functions in this section aren't used by Wuffs +// per se, but they may be helpful to the code that uses Wuffs. + +// wuffs_base__malloc_slice_uxx wraps calling a malloc-like function, except +// that it takes a uint64_t number of elements instead of a size_t size in +// bytes, and it returns a slice (a pointer and a length) instead of just a +// pointer. +// +// You can pass the C stdlib's malloc as the malloc_func. +// +// It returns an empty slice (containing a NULL ptr field) if (num_uxx * +// sizeof(uintxx_t)) would overflow SIZE_MAX. + +static inline wuffs_base__slice_u8 // +wuffs_base__malloc_slice_u8(void* (*malloc_func)(size_t), uint64_t num_u8) { + if (malloc_func && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) { + void* p = (*malloc_func)((size_t)(num_u8 * sizeof(uint8_t))); + if (p) { + return wuffs_base__make_slice_u8((uint8_t*)(p), (size_t)num_u8); + } + } + return wuffs_base__make_slice_u8(NULL, 0); +} + +static inline wuffs_base__slice_u16 // +wuffs_base__malloc_slice_u16(void* (*malloc_func)(size_t), uint64_t num_u16) { + if (malloc_func && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) { + void* p = (*malloc_func)((size_t)(num_u16 * sizeof(uint16_t))); + if (p) { + return wuffs_base__make_slice_u16((uint16_t*)(p), (size_t)num_u16); + } + } + return wuffs_base__make_slice_u16(NULL, 0); +} + +static inline wuffs_base__slice_u32 // +wuffs_base__malloc_slice_u32(void* (*malloc_func)(size_t), uint64_t num_u32) { + if (malloc_func && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) { + void* p = (*malloc_func)((size_t)(num_u32 * sizeof(uint32_t))); + if (p) { + return wuffs_base__make_slice_u32((uint32_t*)(p), (size_t)num_u32); + } + } + return wuffs_base__make_slice_u32(NULL, 0); +} + +static inline wuffs_base__slice_u64 // +wuffs_base__malloc_slice_u64(void* (*malloc_func)(size_t), uint64_t num_u64) { + if (malloc_func && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) { + void* p = (*malloc_func)((size_t)(num_u64 * sizeof(uint64_t))); + if (p) { + return wuffs_base__make_slice_u64((uint64_t*)(p), (size_t)num_u64); + } + } + return wuffs_base__make_slice_u64(NULL, 0); +} + +// ---------------- Images + +// wuffs_base__color_u32_argb_premul is an 8 bit per channel premultiplied +// Alpha, Red, Green, Blue color, as a uint32_t value. Its value is always +// 0xAARRGGBB (Alpha most significant, Blue least), regardless of endianness. +typedef uint32_t wuffs_base__color_u32_argb_premul; + +// wuffs_base__color_u32_argb_premul__is_valid returns whether c's Red, Green +// and Blue channels are all less than or equal to its Alpha channel. c uses +// premultiplied alpha, so 50% opaque 100% saturated red is 0x7F7F_0000 and a +// value like 0x7F80_0000 is invalid. +static inline bool // +wuffs_base__color_u32_argb_premul__is_valid( + wuffs_base__color_u32_argb_premul c) { + uint32_t a = 0xFF & (c >> 24); + uint32_t r = 0xFF & (c >> 16); + uint32_t g = 0xFF & (c >> 8); + uint32_t b = 0xFF & (c >> 0); + return (a >= r) && (a >= g) && (a >= b); +} + +static inline uint16_t // +wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( + wuffs_base__color_u32_argb_premul c) { + uint32_t r5 = 0xF800 & (c >> 8); + uint32_t g6 = 0x07E0 & (c >> 5); + uint32_t b5 = 0x001F & (c >> 3); + return (uint16_t)(r5 | g6 | b5); +} + +static inline wuffs_base__color_u32_argb_premul // +wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(uint16_t rgb_565) { + uint32_t b5 = 0x1F & (rgb_565 >> 0); + uint32_t b = (b5 << 3) | (b5 >> 2); + uint32_t g6 = 0x3F & (rgb_565 >> 5); + uint32_t g = (g6 << 2) | (g6 >> 4); + uint32_t r5 = 0x1F & (rgb_565 >> 11); + uint32_t r = (r5 << 3) | (r5 >> 2); + return 0xFF000000 | (r << 16) | (g << 8) | (b << 0); +} + +static inline uint8_t // +wuffs_base__color_u32_argb_premul__as__color_u8_gray( + wuffs_base__color_u32_argb_premul c) { + // Work in 16-bit color. + uint32_t cr = 0x101 * (0xFF & (c >> 16)); + uint32_t cg = 0x101 * (0xFF & (c >> 8)); + uint32_t cb = 0x101 * (0xFF & (c >> 0)); + + // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same + // as those given by the JFIF specification. + // + // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16). We + // shift by 24, not just by 16, because the return value is 8-bit color, not + // 16-bit color. + uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768; + return (uint8_t)(weighted_average >> 24); +} + +static inline uint16_t // +wuffs_base__color_u32_argb_premul__as__color_u16_gray( + wuffs_base__color_u32_argb_premul c) { + // Work in 16-bit color. + uint32_t cr = 0x101 * (0xFF & (c >> 16)); + uint32_t cg = 0x101 * (0xFF & (c >> 8)); + uint32_t cb = 0x101 * (0xFF & (c >> 0)); + + // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same + // as those given by the JFIF specification. + // + // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16). + uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768; + return (uint16_t)(weighted_average >> 16); +} + +// wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul converts +// from non-premultiplied alpha to premultiplied alpha. +static inline wuffs_base__color_u32_argb_premul // +wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( + uint32_t argb_nonpremul) { + // Multiplying by 0x101 (twice, once for alpha and once for color) converts + // from 8-bit to 16-bit color. Shifting right by 8 undoes that. + // + // Working in the higher bit depth can produce slightly different (and + // arguably slightly more accurate) results. For example, given 8-bit blue + // and alpha of 0x80 and 0x81: + // + // - ((0x80 * 0x81 ) / 0xFF ) = 0x40 = 0x40 + // - ((0x8080 * 0x8181) / 0xFFFF) >> 8 = 0x4101 >> 8 = 0x41 + uint32_t a = 0xFF & (argb_nonpremul >> 24); + uint32_t a16 = a * (0x101 * 0x101); + + uint32_t r = 0xFF & (argb_nonpremul >> 16); + r = ((r * a16) / 0xFFFF) >> 8; + uint32_t g = 0xFF & (argb_nonpremul >> 8); + g = ((g * a16) / 0xFFFF) >> 8; + uint32_t b = 0xFF & (argb_nonpremul >> 0); + b = ((b * a16) / 0xFFFF) >> 8; + + return (a << 24) | (r << 16) | (g << 8) | (b << 0); +} + +// wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul converts +// from premultiplied alpha to non-premultiplied alpha. +static inline uint32_t // +wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( + wuffs_base__color_u32_argb_premul c) { + uint32_t a = 0xFF & (c >> 24); + if (a == 0xFF) { + return c; + } else if (a == 0) { + return 0; + } + uint32_t a16 = a * 0x101; + + uint32_t r = 0xFF & (c >> 16); + r = ((r * (0x101 * 0xFFFF)) / a16) >> 8; + uint32_t g = 0xFF & (c >> 8); + g = ((g * (0x101 * 0xFFFF)) / a16) >> 8; + uint32_t b = 0xFF & (c >> 0); + b = ((b * (0x101 * 0xFFFF)) / a16) >> 8; + + return (a << 24) | (r << 16) | (g << 8) | (b << 0); +} + +// wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul converts +// from 4x16LE non-premultiplied alpha to 4x8 premultiplied alpha. +static inline wuffs_base__color_u32_argb_premul // +wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( + uint64_t argb_nonpremul) { + uint32_t a16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 48))); + + uint32_t r16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 32))); + r16 = (r16 * a16) / 0xFFFF; + uint32_t g16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 16))); + g16 = (g16 * a16) / 0xFFFF; + uint32_t b16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 0))); + b16 = (b16 * a16) / 0xFFFF; + + return ((a16 >> 8) << 24) | ((r16 >> 8) << 16) | ((g16 >> 8) << 8) | + ((b16 >> 8) << 0); +} + +// wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul converts +// from 4x8 premultiplied alpha to 4x16LE non-premultiplied alpha. +static inline uint64_t // +wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( + wuffs_base__color_u32_argb_premul c) { + uint32_t a = 0xFF & (c >> 24); + if (a == 0xFF) { + uint64_t r16 = 0x101 * (0xFF & (c >> 16)); + uint64_t g16 = 0x101 * (0xFF & (c >> 8)); + uint64_t b16 = 0x101 * (0xFF & (c >> 0)); + return 0xFFFF000000000000u | (r16 << 32) | (g16 << 16) | (b16 << 0); + } else if (a == 0) { + return 0; + } + uint64_t a16 = a * 0x101; + + uint64_t r = 0xFF & (c >> 16); + uint64_t r16 = (r * (0x101 * 0xFFFF)) / a16; + uint64_t g = 0xFF & (c >> 8); + uint64_t g16 = (g * (0x101 * 0xFFFF)) / a16; + uint64_t b = 0xFF & (c >> 0); + uint64_t b16 = (b * (0x101 * 0xFFFF)) / a16; + + return (a16 << 48) | (r16 << 32) | (g16 << 16) | (b16 << 0); +} + +static inline uint64_t // +wuffs_base__color_u32__as__color_u64(uint32_t c) { + uint64_t a16 = 0x101 * (0xFF & (c >> 24)); + uint64_t r16 = 0x101 * (0xFF & (c >> 16)); + uint64_t g16 = 0x101 * (0xFF & (c >> 8)); + uint64_t b16 = 0x101 * (0xFF & (c >> 0)); + return (a16 << 48) | (r16 << 32) | (g16 << 16) | (b16 << 0); +} + +static inline uint32_t // +wuffs_base__color_u64__as__color_u32(uint64_t c) { + uint32_t a = ((uint32_t)(0xFF & (c >> 56))); + uint32_t r = ((uint32_t)(0xFF & (c >> 40))); + uint32_t g = ((uint32_t)(0xFF & (c >> 24))); + uint32_t b = ((uint32_t)(0xFF & (c >> 8))); + return (a << 24) | (r << 16) | (g << 8) | (b << 0); +} + +// -------- + +typedef uint8_t wuffs_base__pixel_blend; + +// wuffs_base__pixel_blend encodes how to blend source and destination pixels, +// accounting for transparency. It encompasses the Porter-Duff compositing +// operators as well as the other blending modes defined by PDF. +// +// TODO: implement the other modes. +#define WUFFS_BASE__PIXEL_BLEND__SRC ((wuffs_base__pixel_blend)0) +#define WUFFS_BASE__PIXEL_BLEND__SRC_OVER ((wuffs_base__pixel_blend)1) + +// -------- + +// wuffs_base__pixel_alpha_transparency is a pixel format's alpha channel +// model. It is a property of the pixel format in general, not of a specific +// pixel. An RGBA pixel format (with alpha) can still have fully opaque pixels. +typedef uint32_t wuffs_base__pixel_alpha_transparency; + +#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__OPAQUE 0 +#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__NONPREMULTIPLIED_ALPHA 1 +#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__PREMULTIPLIED_ALPHA 2 +#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__BINARY_ALPHA 3 + +// Deprecated: use WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__NONPREMULTIPLIED_ALPHA +// instead. +#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__NON_PREMULTIPLIED_ALPHA 1 + +// -------- + +#define WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX 4 + +#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__INDEX_PLANE 0 +#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE 3 + +// A palette is 256 entries × 4 bytes per entry (e.g. BGRA). +#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH 1024 + +// wuffs_base__pixel_format encodes the format of the bytes that constitute an +// image frame's pixel data. +// +// See https://github.com/google/wuffs/blob/main/doc/note/pixel-formats.md +// +// Do not manipulate its bits directly; they are private implementation +// details. Use methods such as wuffs_base__pixel_format__num_planes instead. +typedef struct wuffs_base__pixel_format__struct { + uint32_t repr; + +#ifdef __cplusplus + inline bool is_valid() const; + inline uint32_t bits_per_pixel() const; + inline bool is_direct() const; + inline bool is_indexed() const; + inline bool is_interleaved() const; + inline bool is_planar() const; + inline uint32_t num_planes() const; + inline wuffs_base__pixel_alpha_transparency transparency() const; +#endif // __cplusplus + +} wuffs_base__pixel_format; + +static inline wuffs_base__pixel_format // +wuffs_base__make_pixel_format(uint32_t repr) { + wuffs_base__pixel_format f; + f.repr = repr; + return f; +} + +// Common 8-bit-depth pixel formats. This list is not exhaustive; not all valid +// wuffs_base__pixel_format values are present. + +#define WUFFS_BASE__PIXEL_FORMAT__INVALID 0x00000000 + +#define WUFFS_BASE__PIXEL_FORMAT__A 0x02000008 + +#define WUFFS_BASE__PIXEL_FORMAT__Y 0x20000008 +#define WUFFS_BASE__PIXEL_FORMAT__Y_16LE 0x2000000B +#define WUFFS_BASE__PIXEL_FORMAT__Y_16BE 0x2010000B +#define WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL 0x21000008 +#define WUFFS_BASE__PIXEL_FORMAT__YA_PREMUL 0x22000008 + +#define WUFFS_BASE__PIXEL_FORMAT__YCBCR 0x40020888 +#define WUFFS_BASE__PIXEL_FORMAT__YCBCRA_NONPREMUL 0x41038888 +#define WUFFS_BASE__PIXEL_FORMAT__YCBCRK 0x50038888 + +#define WUFFS_BASE__PIXEL_FORMAT__YCOCG 0x60020888 +#define WUFFS_BASE__PIXEL_FORMAT__YCOCGA_NONPREMUL 0x61038888 +#define WUFFS_BASE__PIXEL_FORMAT__YCOCGK 0x70038888 + +#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL 0x81040008 +#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL 0x82040008 +#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY 0x83040008 + +#define WUFFS_BASE__PIXEL_FORMAT__BGR_565 0x80000565 +#define WUFFS_BASE__PIXEL_FORMAT__BGR 0x80000888 +#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL 0x81008888 +#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE 0x8100BBBB +#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL 0x82008888 +#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE 0x8200BBBB +#define WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY 0x83008888 +#define WUFFS_BASE__PIXEL_FORMAT__BGRX 0x90008888 + +#define WUFFS_BASE__PIXEL_FORMAT__RGB 0xA0000888 +#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL 0xA1008888 +#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE 0xA100BBBB +#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL 0xA2008888 +#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE 0xA200BBBB +#define WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY 0xA3008888 +#define WUFFS_BASE__PIXEL_FORMAT__RGBX 0xB0008888 + +#define WUFFS_BASE__PIXEL_FORMAT__CMY 0xC0020888 +#define WUFFS_BASE__PIXEL_FORMAT__CMYK 0xD0038888 + +extern const uint32_t wuffs_base__pixel_format__bits_per_channel[16]; + +static inline bool // +wuffs_base__pixel_format__is_valid(const wuffs_base__pixel_format* f) { + return f->repr != 0; +} + +// wuffs_base__pixel_format__bits_per_pixel returns the number of bits per +// pixel for interleaved pixel formats, and returns 0 for planar pixel formats. +static inline uint32_t // +wuffs_base__pixel_format__bits_per_pixel(const wuffs_base__pixel_format* f) { + if (((f->repr >> 16) & 0x03) != 0) { + return 0; + } + return wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 0)] + + wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 4)] + + wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 8)] + + wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 12)]; +} + +static inline bool // +wuffs_base__pixel_format__is_direct(const wuffs_base__pixel_format* f) { + return ((f->repr >> 18) & 0x01) == 0; +} + +static inline bool // +wuffs_base__pixel_format__is_indexed(const wuffs_base__pixel_format* f) { + return ((f->repr >> 18) & 0x01) != 0; +} + +static inline bool // +wuffs_base__pixel_format__is_interleaved(const wuffs_base__pixel_format* f) { + return ((f->repr >> 16) & 0x03) == 0; +} + +static inline bool // +wuffs_base__pixel_format__is_planar(const wuffs_base__pixel_format* f) { + return ((f->repr >> 16) & 0x03) != 0; +} + +static inline uint32_t // +wuffs_base__pixel_format__num_planes(const wuffs_base__pixel_format* f) { + return ((f->repr >> 16) & 0x03) + 1; +} + +static inline wuffs_base__pixel_alpha_transparency // +wuffs_base__pixel_format__transparency(const wuffs_base__pixel_format* f) { + return (wuffs_base__pixel_alpha_transparency)((f->repr >> 24) & 0x03); +} + +#ifdef __cplusplus + +inline bool // +wuffs_base__pixel_format::is_valid() const { + return wuffs_base__pixel_format__is_valid(this); +} + +inline uint32_t // +wuffs_base__pixel_format::bits_per_pixel() const { + return wuffs_base__pixel_format__bits_per_pixel(this); +} + +inline bool // +wuffs_base__pixel_format::is_direct() const { + return wuffs_base__pixel_format__is_direct(this); +} + +inline bool // +wuffs_base__pixel_format::is_indexed() const { + return wuffs_base__pixel_format__is_indexed(this); +} + +inline bool // +wuffs_base__pixel_format::is_interleaved() const { + return wuffs_base__pixel_format__is_interleaved(this); +} + +inline bool // +wuffs_base__pixel_format::is_planar() const { + return wuffs_base__pixel_format__is_planar(this); +} + +inline uint32_t // +wuffs_base__pixel_format::num_planes() const { + return wuffs_base__pixel_format__num_planes(this); +} + +inline wuffs_base__pixel_alpha_transparency // +wuffs_base__pixel_format::transparency() const { + return wuffs_base__pixel_format__transparency(this); +} + +#endif // __cplusplus + +// -------- + +// wuffs_base__pixel_subsampling encodes whether sample values cover one pixel +// or cover multiple pixels. +// +// See https://github.com/google/wuffs/blob/main/doc/note/pixel-subsampling.md +// +// Do not manipulate its bits directly; they are private implementation +// details. Use methods such as wuffs_base__pixel_subsampling__bias_x instead. +typedef struct wuffs_base__pixel_subsampling__struct { + uint32_t repr; + +#ifdef __cplusplus + inline uint32_t bias_x(uint32_t plane) const; + inline uint32_t denominator_x(uint32_t plane) const; + inline uint32_t bias_y(uint32_t plane) const; + inline uint32_t denominator_y(uint32_t plane) const; +#endif // __cplusplus + +} wuffs_base__pixel_subsampling; + +static inline wuffs_base__pixel_subsampling // +wuffs_base__make_pixel_subsampling(uint32_t repr) { + wuffs_base__pixel_subsampling s; + s.repr = repr; + return s; +} + +#define WUFFS_BASE__PIXEL_SUBSAMPLING__NONE 0x00000000 + +#define WUFFS_BASE__PIXEL_SUBSAMPLING__444 0x000000 +#define WUFFS_BASE__PIXEL_SUBSAMPLING__440 0x010100 +#define WUFFS_BASE__PIXEL_SUBSAMPLING__422 0x101000 +#define WUFFS_BASE__PIXEL_SUBSAMPLING__420 0x111100 +#define WUFFS_BASE__PIXEL_SUBSAMPLING__411 0x303000 +#define WUFFS_BASE__PIXEL_SUBSAMPLING__410 0x313100 + +static inline uint32_t // +wuffs_base__pixel_subsampling__bias_x(const wuffs_base__pixel_subsampling* s, + uint32_t plane) { + uint32_t shift = ((plane & 0x03) * 8) + 6; + return (s->repr >> shift) & 0x03; +} + +static inline uint32_t // +wuffs_base__pixel_subsampling__denominator_x( + const wuffs_base__pixel_subsampling* s, + uint32_t plane) { + uint32_t shift = ((plane & 0x03) * 8) + 4; + return ((s->repr >> shift) & 0x03) + 1; +} + +static inline uint32_t // +wuffs_base__pixel_subsampling__bias_y(const wuffs_base__pixel_subsampling* s, + uint32_t plane) { + uint32_t shift = ((plane & 0x03) * 8) + 2; + return (s->repr >> shift) & 0x03; +} + +static inline uint32_t // +wuffs_base__pixel_subsampling__denominator_y( + const wuffs_base__pixel_subsampling* s, + uint32_t plane) { + uint32_t shift = ((plane & 0x03) * 8) + 0; + return ((s->repr >> shift) & 0x03) + 1; +} + +#ifdef __cplusplus + +inline uint32_t // +wuffs_base__pixel_subsampling::bias_x(uint32_t plane) const { + return wuffs_base__pixel_subsampling__bias_x(this, plane); +} + +inline uint32_t // +wuffs_base__pixel_subsampling::denominator_x(uint32_t plane) const { + return wuffs_base__pixel_subsampling__denominator_x(this, plane); +} + +inline uint32_t // +wuffs_base__pixel_subsampling::bias_y(uint32_t plane) const { + return wuffs_base__pixel_subsampling__bias_y(this, plane); +} + +inline uint32_t // +wuffs_base__pixel_subsampling::denominator_y(uint32_t plane) const { + return wuffs_base__pixel_subsampling__denominator_y(this, plane); +} + +#endif // __cplusplus + +// -------- + +typedef struct wuffs_base__pixel_config__struct { + // Do not access the private_impl's fields directly. There is no API/ABI + // compatibility or safety guarantee if you do so. + struct { + wuffs_base__pixel_format pixfmt; + wuffs_base__pixel_subsampling pixsub; + uint32_t width; + uint32_t height; + } private_impl; + +#ifdef __cplusplus + inline void set(uint32_t pixfmt_repr, + uint32_t pixsub_repr, + uint32_t width, + uint32_t height); + inline void invalidate(); + inline bool is_valid() const; + inline wuffs_base__pixel_format pixel_format() const; + inline wuffs_base__pixel_subsampling pixel_subsampling() const; + inline wuffs_base__rect_ie_u32 bounds() const; + inline uint32_t width() const; + inline uint32_t height() const; + inline uint64_t pixbuf_len() const; +#endif // __cplusplus + +} wuffs_base__pixel_config; + +static inline wuffs_base__pixel_config // +wuffs_base__null_pixel_config() { + wuffs_base__pixel_config ret; + ret.private_impl.pixfmt.repr = 0; + ret.private_impl.pixsub.repr = 0; + ret.private_impl.width = 0; + ret.private_impl.height = 0; + return ret; +} + +// TODO: Should this function return bool? An error type? +static inline void // +wuffs_base__pixel_config__set(wuffs_base__pixel_config* c, + uint32_t pixfmt_repr, + uint32_t pixsub_repr, + uint32_t width, + uint32_t height) { + if (!c) { + return; + } + if (pixfmt_repr) { + uint64_t wh = ((uint64_t)width) * ((uint64_t)height); + // TODO: handle things other than 1 byte per pixel. + if (wh <= ((uint64_t)SIZE_MAX)) { + c->private_impl.pixfmt.repr = pixfmt_repr; + c->private_impl.pixsub.repr = pixsub_repr; + c->private_impl.width = width; + c->private_impl.height = height; + return; + } + } + + c->private_impl.pixfmt.repr = 0; + c->private_impl.pixsub.repr = 0; + c->private_impl.width = 0; + c->private_impl.height = 0; +} + +static inline void // +wuffs_base__pixel_config__invalidate(wuffs_base__pixel_config* c) { + if (c) { + c->private_impl.pixfmt.repr = 0; + c->private_impl.pixsub.repr = 0; + c->private_impl.width = 0; + c->private_impl.height = 0; + } +} + +static inline bool // +wuffs_base__pixel_config__is_valid(const wuffs_base__pixel_config* c) { + return c && c->private_impl.pixfmt.repr; +} + +static inline wuffs_base__pixel_format // +wuffs_base__pixel_config__pixel_format(const wuffs_base__pixel_config* c) { + return c ? c->private_impl.pixfmt : wuffs_base__make_pixel_format(0); +} + +static inline wuffs_base__pixel_subsampling // +wuffs_base__pixel_config__pixel_subsampling(const wuffs_base__pixel_config* c) { + return c ? c->private_impl.pixsub : wuffs_base__make_pixel_subsampling(0); +} + +static inline wuffs_base__rect_ie_u32 // +wuffs_base__pixel_config__bounds(const wuffs_base__pixel_config* c) { + if (c) { + wuffs_base__rect_ie_u32 ret; + ret.min_incl_x = 0; + ret.min_incl_y = 0; + ret.max_excl_x = c->private_impl.width; + ret.max_excl_y = c->private_impl.height; + return ret; + } + + wuffs_base__rect_ie_u32 ret; + ret.min_incl_x = 0; + ret.min_incl_y = 0; + ret.max_excl_x = 0; + ret.max_excl_y = 0; + return ret; +} + +static inline uint32_t // +wuffs_base__pixel_config__width(const wuffs_base__pixel_config* c) { + return c ? c->private_impl.width : 0; +} + +static inline uint32_t // +wuffs_base__pixel_config__height(const wuffs_base__pixel_config* c) { + return c ? c->private_impl.height : 0; +} + +// TODO: this is the right API for planar (not interleaved) pixbufs? Should it +// allow decoding into a color model different from the format's intrinsic one? +// For example, decoding a JPEG image straight to RGBA instead of to YCbCr? +static inline uint64_t // +wuffs_base__pixel_config__pixbuf_len(const wuffs_base__pixel_config* c) { + if (!c) { + return 0; + } + if (wuffs_base__pixel_format__is_planar(&c->private_impl.pixfmt)) { + // TODO: support planar pixel formats, concious of pixel subsampling. + return 0; + } + uint32_t bits_per_pixel = + wuffs_base__pixel_format__bits_per_pixel(&c->private_impl.pixfmt); + if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) { + // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel? + return 0; + } + uint64_t bytes_per_pixel = bits_per_pixel / 8; + + uint64_t n = + ((uint64_t)c->private_impl.width) * ((uint64_t)c->private_impl.height); + if (n > (UINT64_MAX / bytes_per_pixel)) { + return 0; + } + n *= bytes_per_pixel; + + if (wuffs_base__pixel_format__is_indexed(&c->private_impl.pixfmt)) { + if (n > + (UINT64_MAX - WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH)) { + return 0; + } + n += WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH; + } + + return n; +} + +#ifdef __cplusplus + +inline void // +wuffs_base__pixel_config::set(uint32_t pixfmt_repr, + uint32_t pixsub_repr, + uint32_t width, + uint32_t height) { + wuffs_base__pixel_config__set(this, pixfmt_repr, pixsub_repr, width, height); +} + +inline void // +wuffs_base__pixel_config::invalidate() { + wuffs_base__pixel_config__invalidate(this); +} + +inline bool // +wuffs_base__pixel_config::is_valid() const { + return wuffs_base__pixel_config__is_valid(this); +} + +inline wuffs_base__pixel_format // +wuffs_base__pixel_config::pixel_format() const { + return wuffs_base__pixel_config__pixel_format(this); +} + +inline wuffs_base__pixel_subsampling // +wuffs_base__pixel_config::pixel_subsampling() const { + return wuffs_base__pixel_config__pixel_subsampling(this); +} + +inline wuffs_base__rect_ie_u32 // +wuffs_base__pixel_config::bounds() const { + return wuffs_base__pixel_config__bounds(this); +} + +inline uint32_t // +wuffs_base__pixel_config::width() const { + return wuffs_base__pixel_config__width(this); +} + +inline uint32_t // +wuffs_base__pixel_config::height() const { + return wuffs_base__pixel_config__height(this); +} + +inline uint64_t // +wuffs_base__pixel_config::pixbuf_len() const { + return wuffs_base__pixel_config__pixbuf_len(this); +} + +#endif // __cplusplus + +// -------- + +typedef struct wuffs_base__image_config__struct { + wuffs_base__pixel_config pixcfg; + + // Do not access the private_impl's fields directly. There is no API/ABI + // compatibility or safety guarantee if you do so. + struct { + uint64_t first_frame_io_position; + bool first_frame_is_opaque; + } private_impl; + +#ifdef __cplusplus + inline void set(uint32_t pixfmt_repr, + uint32_t pixsub_repr, + uint32_t width, + uint32_t height, + uint64_t first_frame_io_position, + bool first_frame_is_opaque); + inline void invalidate(); + inline bool is_valid() const; + inline uint64_t first_frame_io_position() const; + inline bool first_frame_is_opaque() const; +#endif // __cplusplus + +} wuffs_base__image_config; + +static inline wuffs_base__image_config // +wuffs_base__null_image_config() { + wuffs_base__image_config ret; + ret.pixcfg = wuffs_base__null_pixel_config(); + ret.private_impl.first_frame_io_position = 0; + ret.private_impl.first_frame_is_opaque = false; + return ret; +} + +// TODO: Should this function return bool? An error type? +static inline void // +wuffs_base__image_config__set(wuffs_base__image_config* c, + uint32_t pixfmt_repr, + uint32_t pixsub_repr, + uint32_t width, + uint32_t height, + uint64_t first_frame_io_position, + bool first_frame_is_opaque) { + if (!c) { + return; + } + if (pixfmt_repr) { + c->pixcfg.private_impl.pixfmt.repr = pixfmt_repr; + c->pixcfg.private_impl.pixsub.repr = pixsub_repr; + c->pixcfg.private_impl.width = width; + c->pixcfg.private_impl.height = height; + c->private_impl.first_frame_io_position = first_frame_io_position; + c->private_impl.first_frame_is_opaque = first_frame_is_opaque; + return; + } + + c->pixcfg.private_impl.pixfmt.repr = 0; + c->pixcfg.private_impl.pixsub.repr = 0; + c->pixcfg.private_impl.width = 0; + c->pixcfg.private_impl.height = 0; + c->private_impl.first_frame_io_position = 0; + c->private_impl.first_frame_is_opaque = 0; +} + +static inline void // +wuffs_base__image_config__invalidate(wuffs_base__image_config* c) { + if (c) { + c->pixcfg.private_impl.pixfmt.repr = 0; + c->pixcfg.private_impl.pixsub.repr = 0; + c->pixcfg.private_impl.width = 0; + c->pixcfg.private_impl.height = 0; + c->private_impl.first_frame_io_position = 0; + c->private_impl.first_frame_is_opaque = 0; + } +} + +static inline bool // +wuffs_base__image_config__is_valid(const wuffs_base__image_config* c) { + return c && wuffs_base__pixel_config__is_valid(&(c->pixcfg)); +} + +static inline uint64_t // +wuffs_base__image_config__first_frame_io_position( + const wuffs_base__image_config* c) { + return c ? c->private_impl.first_frame_io_position : 0; +} + +static inline bool // +wuffs_base__image_config__first_frame_is_opaque( + const wuffs_base__image_config* c) { + return c ? c->private_impl.first_frame_is_opaque : false; +} + +#ifdef __cplusplus + +inline void // +wuffs_base__image_config::set(uint32_t pixfmt_repr, + uint32_t pixsub_repr, + uint32_t width, + uint32_t height, + uint64_t first_frame_io_position, + bool first_frame_is_opaque) { + wuffs_base__image_config__set(this, pixfmt_repr, pixsub_repr, width, height, + first_frame_io_position, first_frame_is_opaque); +} + +inline void // +wuffs_base__image_config::invalidate() { + wuffs_base__image_config__invalidate(this); +} + +inline bool // +wuffs_base__image_config::is_valid() const { + return wuffs_base__image_config__is_valid(this); +} + +inline uint64_t // +wuffs_base__image_config::first_frame_io_position() const { + return wuffs_base__image_config__first_frame_io_position(this); +} + +inline bool // +wuffs_base__image_config::first_frame_is_opaque() const { + return wuffs_base__image_config__first_frame_is_opaque(this); +} + +#endif // __cplusplus + +// -------- + +// wuffs_base__animation_disposal encodes, for an animated image, how to +// dispose of a frame after displaying it: +// - None means to draw the next frame on top of this one. +// - Restore Background means to clear the frame's dirty rectangle to "the +// background color" (in practice, this means transparent black) before +// drawing the next frame. +// - Restore Previous means to undo the current frame, so that the next frame +// is drawn on top of the previous one. +typedef uint8_t wuffs_base__animation_disposal; + +#define WUFFS_BASE__ANIMATION_DISPOSAL__NONE ((wuffs_base__animation_disposal)0) +#define WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_BACKGROUND \ + ((wuffs_base__animation_disposal)1) +#define WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_PREVIOUS \ + ((wuffs_base__animation_disposal)2) + +// -------- + +typedef struct wuffs_base__frame_config__struct { + // Do not access the private_impl's fields directly. There is no API/ABI + // compatibility or safety guarantee if you do so. + struct { + wuffs_base__rect_ie_u32 bounds; + wuffs_base__flicks duration; + uint64_t index; + uint64_t io_position; + wuffs_base__animation_disposal disposal; + bool opaque_within_bounds; + bool overwrite_instead_of_blend; + wuffs_base__color_u32_argb_premul background_color; + } private_impl; + +#ifdef __cplusplus + inline void set(wuffs_base__rect_ie_u32 bounds, + wuffs_base__flicks duration, + uint64_t index, + uint64_t io_position, + wuffs_base__animation_disposal disposal, + bool opaque_within_bounds, + bool overwrite_instead_of_blend, + wuffs_base__color_u32_argb_premul background_color); + inline wuffs_base__rect_ie_u32 bounds() const; + inline uint32_t width() const; + inline uint32_t height() const; + inline wuffs_base__flicks duration() const; + inline uint64_t index() const; + inline uint64_t io_position() const; + inline wuffs_base__animation_disposal disposal() const; + inline bool opaque_within_bounds() const; + inline bool overwrite_instead_of_blend() const; + inline wuffs_base__color_u32_argb_premul background_color() const; +#endif // __cplusplus + +} wuffs_base__frame_config; + +static inline wuffs_base__frame_config // +wuffs_base__null_frame_config() { + wuffs_base__frame_config ret; + ret.private_impl.bounds = wuffs_base__make_rect_ie_u32(0, 0, 0, 0); + ret.private_impl.duration = 0; + ret.private_impl.index = 0; + ret.private_impl.io_position = 0; + ret.private_impl.disposal = 0; + ret.private_impl.opaque_within_bounds = false; + ret.private_impl.overwrite_instead_of_blend = false; + return ret; +} + +static inline void // +wuffs_base__frame_config__set( + wuffs_base__frame_config* c, + wuffs_base__rect_ie_u32 bounds, + wuffs_base__flicks duration, + uint64_t index, + uint64_t io_position, + wuffs_base__animation_disposal disposal, + bool opaque_within_bounds, + bool overwrite_instead_of_blend, + wuffs_base__color_u32_argb_premul background_color) { + if (!c) { + return; + } + + c->private_impl.bounds = bounds; + c->private_impl.duration = duration; + c->private_impl.index = index; + c->private_impl.io_position = io_position; + c->private_impl.disposal = disposal; + c->private_impl.opaque_within_bounds = opaque_within_bounds; + c->private_impl.overwrite_instead_of_blend = overwrite_instead_of_blend; + c->private_impl.background_color = background_color; +} + +static inline wuffs_base__rect_ie_u32 // +wuffs_base__frame_config__bounds(const wuffs_base__frame_config* c) { + if (c) { + return c->private_impl.bounds; + } + + wuffs_base__rect_ie_u32 ret; + ret.min_incl_x = 0; + ret.min_incl_y = 0; + ret.max_excl_x = 0; + ret.max_excl_y = 0; + return ret; +} + +static inline uint32_t // +wuffs_base__frame_config__width(const wuffs_base__frame_config* c) { + return c ? wuffs_base__rect_ie_u32__width(&c->private_impl.bounds) : 0; +} + +static inline uint32_t // +wuffs_base__frame_config__height(const wuffs_base__frame_config* c) { + return c ? wuffs_base__rect_ie_u32__height(&c->private_impl.bounds) : 0; +} + +// wuffs_base__frame_config__duration returns the amount of time to display +// this frame. Zero means to display forever - a still (non-animated) image. +static inline wuffs_base__flicks // +wuffs_base__frame_config__duration(const wuffs_base__frame_config* c) { + return c ? c->private_impl.duration : 0; +} + +// wuffs_base__frame_config__index returns the index of this frame. The first +// frame in an image has index 0, the second frame has index 1, and so on. +static inline uint64_t // +wuffs_base__frame_config__index(const wuffs_base__frame_config* c) { + return c ? c->private_impl.index : 0; +} + +// wuffs_base__frame_config__io_position returns the I/O stream position before +// the frame config. +static inline uint64_t // +wuffs_base__frame_config__io_position(const wuffs_base__frame_config* c) { + return c ? c->private_impl.io_position : 0; +} + +// wuffs_base__frame_config__disposal returns, for an animated image, how to +// dispose of this frame after displaying it. +static inline wuffs_base__animation_disposal // +wuffs_base__frame_config__disposal(const wuffs_base__frame_config* c) { + return c ? c->private_impl.disposal : 0; +} + +// wuffs_base__frame_config__opaque_within_bounds returns whether all pixels +// within the frame's bounds are fully opaque. It makes no claim about pixels +// outside the frame bounds but still inside the overall image. The two +// bounding rectangles can differ for animated images. +// +// Its semantics are conservative. It is valid for a fully opaque frame to have +// this value be false: a false negative. +// +// If true, drawing the frame with WUFFS_BASE__PIXEL_BLEND__SRC and +// WUFFS_BASE__PIXEL_BLEND__SRC_OVER should be equivalent, in terms of +// resultant pixels, but the former may be faster. +static inline bool // +wuffs_base__frame_config__opaque_within_bounds( + const wuffs_base__frame_config* c) { + return c && c->private_impl.opaque_within_bounds; +} + +// wuffs_base__frame_config__overwrite_instead_of_blend returns, for an +// animated image, whether to ignore the previous image state (within the frame +// bounds) when drawing this incremental frame. Equivalently, whether to use +// WUFFS_BASE__PIXEL_BLEND__SRC instead of WUFFS_BASE__PIXEL_BLEND__SRC_OVER. +// +// The WebP spec (https://developers.google.com/speed/webp/docs/riff_container) +// calls this the "Blending method" bit. WebP's "Do not blend" corresponds to +// Wuffs' "overwrite_instead_of_blend". +static inline bool // +wuffs_base__frame_config__overwrite_instead_of_blend( + const wuffs_base__frame_config* c) { + return c && c->private_impl.overwrite_instead_of_blend; +} + +static inline wuffs_base__color_u32_argb_premul // +wuffs_base__frame_config__background_color(const wuffs_base__frame_config* c) { + return c ? c->private_impl.background_color : 0; +} + +#ifdef __cplusplus + +inline void // +wuffs_base__frame_config::set( + wuffs_base__rect_ie_u32 bounds, + wuffs_base__flicks duration, + uint64_t index, + uint64_t io_position, + wuffs_base__animation_disposal disposal, + bool opaque_within_bounds, + bool overwrite_instead_of_blend, + wuffs_base__color_u32_argb_premul background_color) { + wuffs_base__frame_config__set(this, bounds, duration, index, io_position, + disposal, opaque_within_bounds, + overwrite_instead_of_blend, background_color); +} + +inline wuffs_base__rect_ie_u32 // +wuffs_base__frame_config::bounds() const { + return wuffs_base__frame_config__bounds(this); +} + +inline uint32_t // +wuffs_base__frame_config::width() const { + return wuffs_base__frame_config__width(this); +} + +inline uint32_t // +wuffs_base__frame_config::height() const { + return wuffs_base__frame_config__height(this); +} + +inline wuffs_base__flicks // +wuffs_base__frame_config::duration() const { + return wuffs_base__frame_config__duration(this); +} + +inline uint64_t // +wuffs_base__frame_config::index() const { + return wuffs_base__frame_config__index(this); +} + +inline uint64_t // +wuffs_base__frame_config::io_position() const { + return wuffs_base__frame_config__io_position(this); +} + +inline wuffs_base__animation_disposal // +wuffs_base__frame_config::disposal() const { + return wuffs_base__frame_config__disposal(this); +} + +inline bool // +wuffs_base__frame_config::opaque_within_bounds() const { + return wuffs_base__frame_config__opaque_within_bounds(this); +} + +inline bool // +wuffs_base__frame_config::overwrite_instead_of_blend() const { + return wuffs_base__frame_config__overwrite_instead_of_blend(this); +} + +inline wuffs_base__color_u32_argb_premul // +wuffs_base__frame_config::background_color() const { + return wuffs_base__frame_config__background_color(this); +} + +#endif // __cplusplus + +// -------- + +typedef struct wuffs_base__pixel_buffer__struct { + wuffs_base__pixel_config pixcfg; + + // Do not access the private_impl's fields directly. There is no API/ABI + // compatibility or safety guarantee if you do so. + struct { + wuffs_base__table_u8 planes[WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX]; + // TODO: color spaces. + } private_impl; + +#ifdef __cplusplus + inline wuffs_base__status set_interleaved( + const wuffs_base__pixel_config* pixcfg, + wuffs_base__table_u8 primary_memory, + wuffs_base__slice_u8 palette_memory); + inline wuffs_base__status set_from_slice( + const wuffs_base__pixel_config* pixcfg, + wuffs_base__slice_u8 pixbuf_memory); + inline wuffs_base__status set_from_table( + const wuffs_base__pixel_config* pixcfg, + wuffs_base__table_u8 primary_memory); + inline wuffs_base__slice_u8 palette(); + inline wuffs_base__slice_u8 palette_or_else(wuffs_base__slice_u8 fallback); + inline wuffs_base__pixel_format pixel_format() const; + inline wuffs_base__table_u8 plane(uint32_t p); + inline wuffs_base__color_u32_argb_premul color_u32_at(uint32_t x, + uint32_t y) const; + inline wuffs_base__status set_color_u32_at( + uint32_t x, + uint32_t y, + wuffs_base__color_u32_argb_premul color); + inline wuffs_base__status set_color_u32_fill_rect( + wuffs_base__rect_ie_u32 rect, + wuffs_base__color_u32_argb_premul color); +#endif // __cplusplus + +} wuffs_base__pixel_buffer; + +static inline wuffs_base__pixel_buffer // +wuffs_base__null_pixel_buffer() { + wuffs_base__pixel_buffer ret; + ret.pixcfg = wuffs_base__null_pixel_config(); + ret.private_impl.planes[0] = wuffs_base__empty_table_u8(); + ret.private_impl.planes[1] = wuffs_base__empty_table_u8(); + ret.private_impl.planes[2] = wuffs_base__empty_table_u8(); + ret.private_impl.planes[3] = wuffs_base__empty_table_u8(); + return ret; +} + +static inline wuffs_base__status // +wuffs_base__pixel_buffer__set_interleaved( + wuffs_base__pixel_buffer* pb, + const wuffs_base__pixel_config* pixcfg, + wuffs_base__table_u8 primary_memory, + wuffs_base__slice_u8 palette_memory) { + if (!pb) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + memset(pb, 0, sizeof(*pb)); + if (!pixcfg || + wuffs_base__pixel_format__is_planar(&pixcfg->private_impl.pixfmt)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt) && + (palette_memory.len < + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH)) { + return wuffs_base__make_status( + wuffs_base__error__bad_argument_length_too_short); + } + uint32_t bits_per_pixel = + wuffs_base__pixel_format__bits_per_pixel(&pixcfg->private_impl.pixfmt); + if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) { + // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel? + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + uint64_t bytes_per_pixel = bits_per_pixel / 8; + + uint64_t width_in_bytes = + ((uint64_t)pixcfg->private_impl.width) * bytes_per_pixel; + if ((width_in_bytes > primary_memory.width) || + (pixcfg->private_impl.height > primary_memory.height)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + + pb->pixcfg = *pixcfg; + pb->private_impl.planes[0] = primary_memory; + if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt)) { + wuffs_base__table_u8* tab = + &pb->private_impl + .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE]; + tab->ptr = palette_memory.ptr; + tab->width = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH; + tab->height = 1; + tab->stride = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH; + } + return wuffs_base__make_status(NULL); +} + +static inline wuffs_base__status // +wuffs_base__pixel_buffer__set_from_slice(wuffs_base__pixel_buffer* pb, + const wuffs_base__pixel_config* pixcfg, + wuffs_base__slice_u8 pixbuf_memory) { + if (!pb) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + memset(pb, 0, sizeof(*pb)); + if (!pixcfg) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if (wuffs_base__pixel_format__is_planar(&pixcfg->private_impl.pixfmt)) { + // TODO: support planar pixel formats, concious of pixel subsampling. + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + uint32_t bits_per_pixel = + wuffs_base__pixel_format__bits_per_pixel(&pixcfg->private_impl.pixfmt); + if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) { + // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel? + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + uint64_t bytes_per_pixel = bits_per_pixel / 8; + + uint8_t* ptr = pixbuf_memory.ptr; + uint64_t len = pixbuf_memory.len; + if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt)) { + // Split a WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH byte + // chunk (1024 bytes = 256 palette entries × 4 bytes per entry) from the + // start of pixbuf_memory. We split from the start, not the end, so that + // the both chunks' pointers have the same alignment as the original + // pointer, up to an alignment of 1024. + if (len < WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return wuffs_base__make_status( + wuffs_base__error__bad_argument_length_too_short); + } + wuffs_base__table_u8* tab = + &pb->private_impl + .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE]; + tab->ptr = ptr; + tab->width = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH; + tab->height = 1; + tab->stride = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH; + ptr += WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH; + len -= WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH; + } + + uint64_t wh = ((uint64_t)pixcfg->private_impl.width) * + ((uint64_t)pixcfg->private_impl.height); + size_t width = (size_t)(pixcfg->private_impl.width); + if ((wh > (UINT64_MAX / bytes_per_pixel)) || + (width > (SIZE_MAX / bytes_per_pixel))) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + wh *= bytes_per_pixel; + width = ((size_t)(width * bytes_per_pixel)); + if (wh > len) { + return wuffs_base__make_status( + wuffs_base__error__bad_argument_length_too_short); + } + + pb->pixcfg = *pixcfg; + wuffs_base__table_u8* tab = &pb->private_impl.planes[0]; + tab->ptr = ptr; + tab->width = width; + tab->height = pixcfg->private_impl.height; + tab->stride = width; + return wuffs_base__make_status(NULL); +} + +// Deprecated: does not handle indexed pixel configurations. Use +// wuffs_base__pixel_buffer__set_interleaved instead. +static inline wuffs_base__status // +wuffs_base__pixel_buffer__set_from_table(wuffs_base__pixel_buffer* pb, + const wuffs_base__pixel_config* pixcfg, + wuffs_base__table_u8 primary_memory) { + if (!pb) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + memset(pb, 0, sizeof(*pb)); + if (!pixcfg || + wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt) || + wuffs_base__pixel_format__is_planar(&pixcfg->private_impl.pixfmt)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + uint32_t bits_per_pixel = + wuffs_base__pixel_format__bits_per_pixel(&pixcfg->private_impl.pixfmt); + if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) { + // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel? + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + uint64_t bytes_per_pixel = bits_per_pixel / 8; + + uint64_t width_in_bytes = + ((uint64_t)pixcfg->private_impl.width) * bytes_per_pixel; + if ((width_in_bytes > primary_memory.width) || + (pixcfg->private_impl.height > primary_memory.height)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + + pb->pixcfg = *pixcfg; + pb->private_impl.planes[0] = primary_memory; + return wuffs_base__make_status(NULL); +} + +// wuffs_base__pixel_buffer__palette returns the palette color data. If +// non-empty, it will have length +// WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH. +static inline wuffs_base__slice_u8 // +wuffs_base__pixel_buffer__palette(wuffs_base__pixel_buffer* pb) { + if (pb && + wuffs_base__pixel_format__is_indexed(&pb->pixcfg.private_impl.pixfmt)) { + wuffs_base__table_u8* tab = + &pb->private_impl + .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE]; + if ((tab->width == + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) && + (tab->height == 1)) { + return wuffs_base__make_slice_u8( + tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH); + } + } + return wuffs_base__make_slice_u8(NULL, 0); +} + +static inline wuffs_base__slice_u8 // +wuffs_base__pixel_buffer__palette_or_else(wuffs_base__pixel_buffer* pb, + wuffs_base__slice_u8 fallback) { + if (pb && + wuffs_base__pixel_format__is_indexed(&pb->pixcfg.private_impl.pixfmt)) { + wuffs_base__table_u8* tab = + &pb->private_impl + .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE]; + if ((tab->width == + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) && + (tab->height == 1)) { + return wuffs_base__make_slice_u8( + tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH); + } + } + return fallback; +} + +static inline wuffs_base__pixel_format // +wuffs_base__pixel_buffer__pixel_format(const wuffs_base__pixel_buffer* pb) { + if (pb) { + return pb->pixcfg.private_impl.pixfmt; + } + return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__INVALID); +} + +static inline wuffs_base__table_u8 // +wuffs_base__pixel_buffer__plane(wuffs_base__pixel_buffer* pb, uint32_t p) { + if (pb && (p < WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX)) { + return pb->private_impl.planes[p]; + } + + wuffs_base__table_u8 ret; + ret.ptr = NULL; + ret.width = 0; + ret.height = 0; + ret.stride = 0; + return ret; +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul // +wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb, + uint32_t x, + uint32_t y); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +wuffs_base__pixel_buffer__set_color_u32_at( + wuffs_base__pixel_buffer* pb, + uint32_t x, + uint32_t y, + wuffs_base__color_u32_argb_premul color); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +wuffs_base__pixel_buffer__set_color_u32_fill_rect( + wuffs_base__pixel_buffer* pb, + wuffs_base__rect_ie_u32 rect, + wuffs_base__color_u32_argb_premul color); + +#ifdef __cplusplus + +inline wuffs_base__status // +wuffs_base__pixel_buffer::set_interleaved( + const wuffs_base__pixel_config* pixcfg_arg, + wuffs_base__table_u8 primary_memory, + wuffs_base__slice_u8 palette_memory) { + return wuffs_base__pixel_buffer__set_interleaved( + this, pixcfg_arg, primary_memory, palette_memory); +} + +inline wuffs_base__status // +wuffs_base__pixel_buffer::set_from_slice( + const wuffs_base__pixel_config* pixcfg_arg, + wuffs_base__slice_u8 pixbuf_memory) { + return wuffs_base__pixel_buffer__set_from_slice(this, pixcfg_arg, + pixbuf_memory); +} + +inline wuffs_base__status // +wuffs_base__pixel_buffer::set_from_table( + const wuffs_base__pixel_config* pixcfg_arg, + wuffs_base__table_u8 primary_memory) { + return wuffs_base__pixel_buffer__set_from_table(this, pixcfg_arg, + primary_memory); +} + +inline wuffs_base__slice_u8 // +wuffs_base__pixel_buffer::palette() { + return wuffs_base__pixel_buffer__palette(this); +} + +inline wuffs_base__slice_u8 // +wuffs_base__pixel_buffer::palette_or_else(wuffs_base__slice_u8 fallback) { + return wuffs_base__pixel_buffer__palette_or_else(this, fallback); +} + +inline wuffs_base__pixel_format // +wuffs_base__pixel_buffer::pixel_format() const { + return wuffs_base__pixel_buffer__pixel_format(this); +} + +inline wuffs_base__table_u8 // +wuffs_base__pixel_buffer::plane(uint32_t p) { + return wuffs_base__pixel_buffer__plane(this, p); +} + +inline wuffs_base__color_u32_argb_premul // +wuffs_base__pixel_buffer::color_u32_at(uint32_t x, uint32_t y) const { + return wuffs_base__pixel_buffer__color_u32_at(this, x, y); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +wuffs_base__pixel_buffer__set_color_u32_fill_rect( + wuffs_base__pixel_buffer* pb, + wuffs_base__rect_ie_u32 rect, + wuffs_base__color_u32_argb_premul color); + +inline wuffs_base__status // +wuffs_base__pixel_buffer::set_color_u32_at( + uint32_t x, + uint32_t y, + wuffs_base__color_u32_argb_premul color) { + return wuffs_base__pixel_buffer__set_color_u32_at(this, x, y, color); +} + +inline wuffs_base__status // +wuffs_base__pixel_buffer::set_color_u32_fill_rect( + wuffs_base__rect_ie_u32 rect, + wuffs_base__color_u32_argb_premul color) { + return wuffs_base__pixel_buffer__set_color_u32_fill_rect(this, rect, color); +} + +#endif // __cplusplus + +// -------- + +typedef struct wuffs_base__decode_frame_options__struct { + // Do not access the private_impl's fields directly. There is no API/ABI + // compatibility or safety guarantee if you do so. + struct { + uint8_t TODO; + } private_impl; + +#ifdef __cplusplus +#endif // __cplusplus + +} wuffs_base__decode_frame_options; + +#ifdef __cplusplus + +#endif // __cplusplus + +// -------- + +// wuffs_base__pixel_palette__closest_element returns the index of the palette +// element that minimizes the sum of squared differences of the four ARGB +// channels, working in premultiplied alpha. Ties favor the smaller index. +// +// The palette_slice.len may equal (N*4), for N less than 256, which means that +// only the first N palette elements are considered. It returns 0 when N is 0. +// +// Applying this function on a per-pixel basis will not produce whole-of-image +// dithering. +WUFFS_BASE__MAYBE_STATIC uint8_t // +wuffs_base__pixel_palette__closest_element( + wuffs_base__slice_u8 palette_slice, + wuffs_base__pixel_format palette_format, + wuffs_base__color_u32_argb_premul c); + +// -------- + +// TODO: should the func type take restrict pointers? +typedef uint64_t (*wuffs_base__pixel_swizzler__func)(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len); + +typedef uint64_t (*wuffs_base__pixel_swizzler__transparent_black_func)( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + uint64_t num_pixels, + uint32_t dst_pixfmt_bytes_per_pixel); + +typedef struct wuffs_base__pixel_swizzler__struct { + // Do not access the private_impl's fields directly. There is no API/ABI + // compatibility or safety guarantee if you do so. + struct { + wuffs_base__pixel_swizzler__func func; + wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func; + uint32_t dst_pixfmt_bytes_per_pixel; + uint32_t src_pixfmt_bytes_per_pixel; + } private_impl; + +#ifdef __cplusplus + inline wuffs_base__status prepare(wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__pixel_format src_pixfmt, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend); + inline uint64_t swizzle_interleaved_from_slice( + wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src) const; +#endif // __cplusplus + +} wuffs_base__pixel_swizzler; + +// wuffs_base__pixel_swizzler__prepare readies the pixel swizzler so that its +// other methods may be called. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__PIXCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__pixel_format src_pixfmt, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend); + +// wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice converts pixels +// from a source format to a destination format. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__PIXCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC uint64_t // +wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice( + const wuffs_base__pixel_swizzler* p, + wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src); + +#ifdef __cplusplus + +inline wuffs_base__status // +wuffs_base__pixel_swizzler::prepare(wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__pixel_format src_pixfmt, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + return wuffs_base__pixel_swizzler__prepare(this, dst_pixfmt, dst_palette, + src_pixfmt, src_palette, blend); +} + +uint64_t // +wuffs_base__pixel_swizzler::swizzle_interleaved_from_slice( + wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src) const { + return wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice( + this, dst, dst_palette, src); +} + +#endif // __cplusplus + +// ---------------- String Conversions + +// Options (bitwise or'ed together) for wuffs_base__parse_number_xxx +// functions. The XXX options apply to both integer and floating point. The FXX +// options apply only to floating point. + +#define WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS ((uint32_t)0x00000000) + +// WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES means to accept +// inputs like "00", "0644" and "00.7". By default, they are rejected. +#define WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES \ + ((uint32_t)0x00000001) + +// WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES means to accept inputs like +// "1__2" and "_3.141_592". By default, they are rejected. +#define WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES ((uint32_t)0x00000002) + +// WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA means to accept +// "1,5" and not "1.5" as one-and-a-half. +// +// If the caller wants to accept either, it is responsible for canonicalizing +// the input before calling wuffs_base__parse_number_fxx. The caller also has +// more context on e.g. exactly how to treat something like "$1,234". +#define WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA \ + ((uint32_t)0x00000010) + +// WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN means to reject inputs that +// would lead to infinite or Not-a-Number floating point values. By default, +// they are accepted. +// +// This affects the literal "inf" as input, but also affects inputs like +// "1e999" that would overflow double-precision floating point. +#define WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN ((uint32_t)0x00000020) + +// -------- + +// Options (bitwise or'ed together) for wuffs_base__render_number_xxx +// functions. The XXX options apply to both integer and floating point. The FXX +// options apply only to floating point. + +#define WUFFS_BASE__RENDER_NUMBER_XXX__DEFAULT_OPTIONS ((uint32_t)0x00000000) + +// WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT means to render to the right side +// (higher indexes) of the destination slice, leaving any untouched bytes on +// the left side (lower indexes). The default is vice versa: rendering on the +// left with slack on the right. +#define WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT ((uint32_t)0x00000100) + +// WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN means to render the leading +// "+" for non-negative numbers: "+0" and "+12.3" instead of "0" and "12.3". +#define WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN ((uint32_t)0x00000200) + +// WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA means to render +// one-and-a-half as "1,5" instead of "1.5". +#define WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA \ + ((uint32_t)0x00001000) + +// WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ETC means whether to never +// (EXPONENT_ABSENT, equivalent to printf's "%f") or to always +// (EXPONENT_PRESENT, equivalent to printf's "%e") render a floating point +// number as "1.23e+05" instead of "123000". +// +// Having both bits set is the same has having neither bit set, where the +// notation used depends on whether the exponent is sufficiently large: "0.5" +// is preferred over "5e-01" but "5e-09" is preferred over "0.000000005". +#define WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT ((uint32_t)0x00002000) +#define WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT ((uint32_t)0x00004000) + +// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION means to render the +// smallest number of digits so that parsing the resultant string will recover +// the same double-precision floating point number. +// +// For example, double-precision cannot distinguish between 0.3 and +// 0.299999999999999988897769753748434595763683319091796875, so when this bit +// is set, rendering the latter will produce "0.3" but rendering +// 0.3000000000000000444089209850062616169452667236328125 will produce +// "0.30000000000000004". +#define WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION \ + ((uint32_t)0x00008000) + +// ---------------- IEEE 754 Floating Point + +// wuffs_base__ieee_754_bit_representation__etc converts between a double +// precision numerical value and its IEEE 754 representations: +// - 16-bit: 1 sign bit, 5 exponent bits, 10 explicit significand bits. +// - 32-bit: 1 sign bit, 8 exponent bits, 23 explicit significand bits. +// - 64-bit: 1 sign bit, 11 exponent bits, 52 explicit significand bits. +// +// For example, it converts between: +// - +1.0 and 0x3C00, 0x3F80_0000 or 0x3FF0_0000_0000_0000. +// - +5.5 and 0x4580, 0x40B0_0000 or 0x4016_0000_0000_0000. +// - -inf and 0xFC00, 0xFF80_0000 or 0xFFF0_0000_0000_0000. +// +// Converting from f64 to shorter formats (f16 or f32, represented in C as +// uint16_t and uint32_t) may be lossy. Such functions have names that look +// like etc_truncate, as converting finite numbers produce equal or smaller +// (closer-to-zero) finite numbers. For example, 1048576.0 is a perfectly valid +// f64 number, but converting it to a f16 (with truncation) produces 65504.0, +// the largest finite f16 number. Truncating a f64-typed value d to f32 does +// not always produce the same result as the C-style cast ((float)d), as +// casting can convert from finite numbers to infinite ones. +// +// Converting infinities or NaNs produces infinities or NaNs and always report +// no loss, even though there a multiple NaN representations so that round- +// tripping a f64-typed NaN may produce a different 64 bits. Nonetheless, the +// etc_truncate functions preserve a NaN's "quiet vs signaling" bit. +// +// See https://en.wikipedia.org/wiki/Double-precision_floating-point_format + +typedef struct wuffs_base__lossy_value_u16__struct { + uint16_t value; + bool lossy; +} wuffs_base__lossy_value_u16; + +typedef struct wuffs_base__lossy_value_u32__struct { + uint32_t value; + bool lossy; +} wuffs_base__lossy_value_u32; + +WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16 // +wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32 // +wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f); + +static inline uint64_t // +wuffs_base__ieee_754_bit_representation__from_f64_to_u64(double f) { + uint64_t u = 0; + if (sizeof(uint64_t) == sizeof(double)) { + memcpy(&u, &f, sizeof(uint64_t)); + } + return u; +} + +static inline double // +wuffs_base__ieee_754_bit_representation__from_u16_to_f64(uint16_t u) { + uint64_t v = ((uint64_t)(u & 0x8000)) << 48; + + do { + uint64_t exp = (u >> 10) & 0x1F; + uint64_t man = u & 0x3FF; + if (exp == 0x1F) { // Infinity or NaN. + exp = 2047; + } else if (exp != 0) { // Normal. + exp += 1008; // 1008 = 1023 - 15, the difference in biases. + } else if (man != 0) { // Subnormal but non-zero. + uint32_t clz = wuffs_base__count_leading_zeroes_u64(man); + exp = 1062 - clz; // 1062 = 1008 + 64 - 10. + man = 0x3FF & (man << (clz - 53)); + } else { // Zero. + break; + } + v |= (exp << 52) | (man << 42); + } while (0); + + double f = 0; + if (sizeof(uint64_t) == sizeof(double)) { + memcpy(&f, &v, sizeof(uint64_t)); + } + return f; +} + +static inline double // +wuffs_base__ieee_754_bit_representation__from_u32_to_f64(uint32_t u) { + float f = 0; + if (sizeof(uint32_t) == sizeof(float)) { + memcpy(&f, &u, sizeof(uint32_t)); + } + return (double)f; +} + +static inline double // +wuffs_base__ieee_754_bit_representation__from_u64_to_f64(uint64_t u) { + double f = 0; + if (sizeof(uint64_t) == sizeof(double)) { + memcpy(&f, &u, sizeof(uint64_t)); + } + return f; +} + +// ---------------- Parsing and Rendering Numbers + +// wuffs_base__parse_number_f64 parses the floating point number in s. For +// example, if s contains the bytes "1.5" then it will return the double 1.5. +// +// It returns an error if s does not contain a floating point number. +// +// It does not necessarily return an error if the conversion is lossy, e.g. if +// s is "0.3", which double-precision floating point cannot represent exactly. +// +// Similarly, the returned value may be infinite (and no error returned) even +// if s was not "inf", when the input is nominally finite but sufficiently +// larger than DBL_MAX, about 1.8e+308. +// +// It is similar to the C standard library's strtod function, but: +// - Errors are returned in-band (in a result type), not out-of-band (errno). +// - It takes a slice (a pointer and length), not a NUL-terminated C string. +// - It does not take an optional endptr argument. It does not allow a partial +// parse: it returns an error unless all of s is consumed. +// - It does not allow whitespace, leading or otherwise. +// - It does not allow hexadecimal floating point numbers. +// - It is not affected by i18n / l10n settings such as environment variables. +// +// The options argument can change these, but by default, it: +// - Allows "inf", "+Infinity" and "-NAN", case insensitive. Similarly, +// without an explicit opt-out, it would successfully parse "1e999" as +// infinity, even though it overflows double-precision floating point. +// - Rejects underscores. With an explicit opt-in, "_3.141_592" would +// successfully parse as an approximation to π. +// - Rejects unnecessary leading zeroes: "00", "0644" and "00.7". +// - Uses a dot '1.5' instead of a comma '1,5' for the decimal separator. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__FLOATCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // +wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options); + +// wuffs_base__parse_number_i64 parses the ASCII integer in s. For example, if +// s contains the bytes "-123" then it will return the int64_t -123. +// +// It returns an error if s does not contain an integer or if the integer +// within would overflow an int64_t. +// +// It is similar to wuffs_base__parse_number_u64 but it returns a signed +// integer, not an unsigned integer. It also allows a leading '+' or '-'. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 // +wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options); + +// wuffs_base__parse_number_u64 parses the ASCII integer in s. For example, if +// s contains the bytes "123" then it will return the uint64_t 123. +// +// It returns an error if s does not contain an integer or if the integer +// within would overflow a uint64_t. +// +// It is similar to the C standard library's strtoull function, but: +// - Errors are returned in-band (in a result type), not out-of-band (errno). +// - It takes a slice (a pointer and length), not a NUL-terminated C string. +// - It does not take an optional endptr argument. It does not allow a partial +// parse: it returns an error unless all of s is consumed. +// - It does not allow whitespace, leading or otherwise. +// - It does not allow a leading '+' or '-'. +// - It does not take a base argument (e.g. base 10 vs base 16). Instead, it +// always accepts both decimal (e.g "1234", "0d5678") and hexadecimal (e.g. +// "0x9aBC"). The caller is responsible for prior filtering of e.g. hex +// numbers if they are unwanted. For example, Wuffs' JSON decoder will only +// produce a wuffs_base__token for decimal numbers, not hexadecimal. +// - It is not affected by i18n / l10n settings such as environment variables. +// +// The options argument can change these, but by default, it: +// - Rejects underscores. With an explicit opt-in, "__0D_1_002" would +// successfully parse as "one thousand and two". Underscores are still +// rejected inside the optional 2-byte opening "0d" or "0X" that denotes +// base-10 or base-16. +// - Rejects unnecessary leading zeroes: "00" and "0644". +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 // +wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options); + +// -------- + +// WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL is the string length of +// "-9223372036854775808" and "+9223372036854775807", INT64_MIN and INT64_MAX. +#define WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL 20 + +// WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL is the string length of +// "+18446744073709551615", UINT64_MAX. +#define WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL 21 + +// wuffs_base__render_number_f64 writes the decimal encoding of x to dst and +// returns the number of bytes written. If dst is shorter than the entire +// encoding, it returns 0 (and no bytes are written). +// +// For those familiar with C's printf or Go's fmt.Printf functions: +// - "%e" means the WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT option. +// - "%f" means the WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT option. +// - "%g" means neither or both bits are set. +// +// The precision argument controls the number of digits rendered, excluding the +// exponent (the "e+05" in "1.23e+05"): +// - for "%e" and "%f" it is the number of digits after the decimal separator, +// - for "%g" it is the number of significant digits (and trailing zeroes are +// removed). +// +// A precision of 6 gives similar output to printf's defaults. +// +// A precision greater than 4095 is equivalent to 4095. +// +// The precision argument is ignored when the +// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION option is set. This is +// similar to Go's strconv.FormatFloat with a negative (i.e. non-sensical) +// precision, but there is no corresponding feature in C's printf. +// +// Extreme values of x will be rendered as "NaN", "Inf" (or "+Inf" if the +// WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN option is set) or "-Inf". +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__FLOATCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC size_t // +wuffs_base__render_number_f64(wuffs_base__slice_u8 dst, + double x, + uint32_t precision, + uint32_t options); + +// wuffs_base__render_number_i64 writes the decimal encoding of x to dst and +// returns the number of bytes written. If dst is shorter than the entire +// encoding, it returns 0 (and no bytes are written). +// +// dst will never be too short if its length is at least 20, also known as +// WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC size_t // +wuffs_base__render_number_i64(wuffs_base__slice_u8 dst, + int64_t x, + uint32_t options); + +// wuffs_base__render_number_u64 writes the decimal encoding of x to dst and +// returns the number of bytes written. If dst is shorter than the entire +// encoding, it returns 0 (and no bytes are written). +// +// dst will never be too short if its length is at least 21, also known as +// WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC size_t // +wuffs_base__render_number_u64(wuffs_base__slice_u8 dst, + uint64_t x, + uint32_t options); + +// ---------------- Base-16 + +// Options (bitwise or'ed together) for wuffs_base__base_16__xxx functions. + +#define WUFFS_BASE__BASE_16__DEFAULT_OPTIONS ((uint32_t)0x00000000) + +// wuffs_base__base_16__decode2 converts "6A6b" to "jk", where e.g. 'j' is +// U+006A. There are 2 src bytes for every dst byte. +// +// It assumes that the src bytes are two hexadecimal digits (0-9, A-F, a-f), +// repeated. It may write nonsense bytes if not, although it will not read or +// write out of bounds. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src, + bool src_closed, + uint32_t options); + +// wuffs_base__base_16__decode4 converts both "\\x6A\\x6b" and "??6a??6B" to +// "jk", where e.g. 'j' is U+006A. There are 4 src bytes for every dst byte. +// +// It assumes that the src bytes are two ignored bytes and then two hexadecimal +// digits (0-9, A-F, a-f), repeated. It may write nonsense bytes if not, +// although it will not read or write out of bounds. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src, + bool src_closed, + uint32_t options); + +// wuffs_base__base_16__encode2 converts "jk" to "6A6B", where e.g. 'j' is +// U+006A. There are 2 dst bytes for every src byte. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src, + bool src_closed, + uint32_t options); + +// wuffs_base__base_16__encode4 converts "jk" to "\\x6A\\x6B", where e.g. 'j' +// is U+006A. There are 4 dst bytes for every src byte. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src, + bool src_closed, + uint32_t options); + +// ---------------- Base-64 + +// Options (bitwise or'ed together) for wuffs_base__base_64__xxx functions. + +#define WUFFS_BASE__BASE_64__DEFAULT_OPTIONS ((uint32_t)0x00000000) + +// WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING means that, when decoding base-64, +// the input may (but does not need to) be padded with '=' bytes so that the +// overall encoded length in bytes is a multiple of 4. A successful decoding +// will return a num_src that includes those padding bytes. +// +// Excess padding (e.g. three final '='s) will be rejected as bad data. +#define WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING ((uint32_t)0x00000001) + +// WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING means that, when encoding base-64, +// the output will be padded with '=' bytes so that the overall encoded length +// in bytes is a multiple of 4. +#define WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING ((uint32_t)0x00000002) + +// WUFFS_BASE__BASE_64__URL_ALPHABET means that, for base-64, the URL-friendly +// and file-name-friendly alphabet be used, as per RFC 4648 section 5. When +// this option bit is off, the standard alphabet from section 4 is used. +#define WUFFS_BASE__BASE_64__URL_ALPHABET ((uint32_t)0x00000100) + +// wuffs_base__base_64__decode transforms base-64 encoded bytes from src to +// arbitrary bytes in dst. +// +// It will not permit line breaks or other whitespace in src. Filtering those +// out is the responsibility of the caller. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +wuffs_base__base_64__decode(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src, + bool src_closed, + uint32_t options); + +// wuffs_base__base_64__encode transforms arbitrary bytes from src to base-64 +// encoded bytes in dst. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +wuffs_base__base_64__encode(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src, + bool src_closed, + uint32_t options); + +// ---------------- Unicode and UTF-8 + +#define WUFFS_BASE__UNICODE_CODE_POINT__MIN_INCL 0x00000000 +#define WUFFS_BASE__UNICODE_CODE_POINT__MAX_INCL 0x0010FFFF + +#define WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER 0x0000FFFD + +#define WUFFS_BASE__UNICODE_SURROGATE__MIN_INCL 0x0000D800 +#define WUFFS_BASE__UNICODE_SURROGATE__MAX_INCL 0x0000DFFF + +#define WUFFS_BASE__ASCII__MIN_INCL 0x00 +#define WUFFS_BASE__ASCII__MAX_INCL 0x7F + +#define WUFFS_BASE__UTF_8__BYTE_LENGTH__MIN_INCL 1 +#define WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL 4 + +#define WUFFS_BASE__UTF_8__BYTE_LENGTH_1__CODE_POINT__MIN_INCL 0x00000000 +#define WUFFS_BASE__UTF_8__BYTE_LENGTH_1__CODE_POINT__MAX_INCL 0x0000007F +#define WUFFS_BASE__UTF_8__BYTE_LENGTH_2__CODE_POINT__MIN_INCL 0x00000080 +#define WUFFS_BASE__UTF_8__BYTE_LENGTH_2__CODE_POINT__MAX_INCL 0x000007FF +#define WUFFS_BASE__UTF_8__BYTE_LENGTH_3__CODE_POINT__MIN_INCL 0x00000800 +#define WUFFS_BASE__UTF_8__BYTE_LENGTH_3__CODE_POINT__MAX_INCL 0x0000FFFF +#define WUFFS_BASE__UTF_8__BYTE_LENGTH_4__CODE_POINT__MIN_INCL 0x00010000 +#define WUFFS_BASE__UTF_8__BYTE_LENGTH_4__CODE_POINT__MAX_INCL 0x0010FFFF + +// -------- + +// wuffs_base__utf_8__next__output is the type returned by +// wuffs_base__utf_8__next. +typedef struct wuffs_base__utf_8__next__output__struct { + uint32_t code_point; + uint32_t byte_length; + +#ifdef __cplusplus + inline bool is_valid() const; +#endif // __cplusplus + +} wuffs_base__utf_8__next__output; + +static inline wuffs_base__utf_8__next__output // +wuffs_base__make_utf_8__next__output(uint32_t code_point, + uint32_t byte_length) { + wuffs_base__utf_8__next__output ret; + ret.code_point = code_point; + ret.byte_length = byte_length; + return ret; +} + +static inline bool // +wuffs_base__utf_8__next__output__is_valid( + const wuffs_base__utf_8__next__output* o) { + if (o) { + uint32_t cp = o->code_point; + switch (o->byte_length) { + case 1: + return (cp <= 0x7F); + case 2: + return (0x080 <= cp) && (cp <= 0x7FF); + case 3: + // Avoid the 0xD800 ..= 0xDFFF surrogate range. + return ((0x0800 <= cp) && (cp <= 0xD7FF)) || + ((0xE000 <= cp) && (cp <= 0xFFFF)); + case 4: + return (0x00010000 <= cp) && (cp <= 0x0010FFFF); + } + } + return false; +} + +#ifdef __cplusplus + +inline bool // +wuffs_base__utf_8__next__output::is_valid() const { + return wuffs_base__utf_8__next__output__is_valid(this); +} + +#endif // __cplusplus + +// -------- + +// wuffs_base__utf_8__encode writes the UTF-8 encoding of code_point to s and +// returns the number of bytes written. If code_point is invalid, or if s is +// shorter than the entire encoding, it returns 0 (and no bytes are written). +// +// s will never be too short if its length is at least 4, also known as +// WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just +// WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC size_t // +wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point); + +// wuffs_base__utf_8__next returns the next UTF-8 code point (and that code +// point's byte length) at the start of the read-only slice (s_ptr, s_len). +// +// There are exactly two cases in which this function returns something where +// wuffs_base__utf_8__next__output__is_valid is false: +// - If s is empty then it returns {.code_point=0, .byte_length=0}. +// - If s is non-empty and starts with invalid UTF-8 then it returns +// {.code_point=WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, .byte_length=1}. +// +// Otherwise, it returns something where +// wuffs_base__utf_8__next__output__is_valid is true. +// +// In any case, it always returns an output that satisfies both of: +// - (output.code_point <= WUFFS_BASE__UNICODE_CODE_POINT__MAX_INCL). +// - (output.byte_length <= s_len). +// +// If s is a sub-slice of a larger slice of valid UTF-8, but that sub-slice +// boundary occurs in the middle of a multi-byte UTF-8 encoding of a single +// code point, then this function may return something invalid. It is the +// caller's responsibility to split on or otherwise manage UTF-8 boundaries. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just +// WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // +wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len); + +// wuffs_base__utf_8__next_from_end is like wuffs_base__utf_8__next except that +// it looks at the end of (s_ptr, s_len) instead of the start. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just +// WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // +wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len); + +// wuffs_base__utf_8__longest_valid_prefix returns the largest n such that the +// sub-slice s[..n] is valid UTF-8, where s is the read-only slice (s_ptr, +// s_len). +// +// In particular, it returns s_len if and only if all of s is valid UTF-8. +// +// If s is a sub-slice of a larger slice of valid UTF-8, but that sub-slice +// boundary occurs in the middle of a multi-byte UTF-8 encoding of a single +// code point, then this function will return less than s_len. It is the +// caller's responsibility to split on or otherwise manage UTF-8 boundaries. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just +// WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC size_t // +wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len); + +// wuffs_base__ascii__longest_valid_prefix returns the largest n such that the +// sub-slice s[..n] is valid ASCII, where s is the read-only slice (s_ptr, +// s_len). +// +// In particular, it returns s_len if and only if all of s is valid ASCII. +// Equivalently, when none of the bytes in s have the 0x80 high bit set. +// +// For modular builds that divide the base module into sub-modules, using this +// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just +// WUFFS_CONFIG__MODULE__BASE__CORE. +WUFFS_BASE__MAYBE_STATIC size_t // +wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len); + +// ---------------- Interface Declarations. + +// For modular builds that divide the base module into sub-modules, using these +// functions require the WUFFS_CONFIG__MODULE__BASE__INTERFACES sub-module, not +// just WUFFS_CONFIG__MODULE__BASE__CORE. + +// -------- + +extern const char wuffs_base__hasher_u32__vtable_name[]; + +typedef struct wuffs_base__hasher_u32__func_ptrs__struct { + wuffs_base__empty_struct (*set_quirk_enabled)( + void* self, + uint32_t a_quirk, + bool a_enabled); + uint32_t (*update_u32)( + void* self, + wuffs_base__slice_u8 a_x); +} wuffs_base__hasher_u32__func_ptrs; + +typedef struct wuffs_base__hasher_u32__struct wuffs_base__hasher_u32; + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_base__hasher_u32__set_quirk_enabled( + wuffs_base__hasher_u32* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_base__hasher_u32__update_u32( + wuffs_base__hasher_u32* self, + wuffs_base__slice_u8 a_x); + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_base__hasher_u32__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable first_vtable; + } private_impl; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; +#endif + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__hasher_u32__set_quirk_enabled( + this, a_quirk, a_enabled); + } + + inline uint32_t + update_u32( + wuffs_base__slice_u8 a_x) { + return wuffs_base__hasher_u32__update_u32( + this, a_x); + } + +#endif // __cplusplus +}; // struct wuffs_base__hasher_u32__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +// -------- + +extern const char wuffs_base__image_decoder__vtable_name[]; + +typedef struct wuffs_base__image_decoder__func_ptrs__struct { + wuffs_base__status (*decode_frame)( + void* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + wuffs_base__status (*decode_frame_config)( + void* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + wuffs_base__status (*decode_image_config)( + void* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + wuffs_base__rect_ie_u32 (*frame_dirty_rect)( + const void* self); + uint32_t (*num_animation_loops)( + const void* self); + uint64_t (*num_decoded_frame_configs)( + const void* self); + uint64_t (*num_decoded_frames)( + const void* self); + wuffs_base__status (*restart_frame)( + void* self, + uint64_t a_index, + uint64_t a_io_position); + wuffs_base__empty_struct (*set_quirk_enabled)( + void* self, + uint32_t a_quirk, + bool a_enabled); + wuffs_base__empty_struct (*set_report_metadata)( + void* self, + uint32_t a_fourcc, + bool a_report); + wuffs_base__status (*tell_me_more)( + void* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + wuffs_base__range_ii_u64 (*workbuf_len)( + const void* self); +} wuffs_base__image_decoder__func_ptrs; + +typedef struct wuffs_base__image_decoder__struct wuffs_base__image_decoder; + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__image_decoder__decode_frame( + wuffs_base__image_decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__image_decoder__decode_frame_config( + wuffs_base__image_decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__image_decoder__decode_image_config( + wuffs_base__image_decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_base__image_decoder__frame_dirty_rect( + const wuffs_base__image_decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_base__image_decoder__num_animation_loops( + const wuffs_base__image_decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_base__image_decoder__num_decoded_frame_configs( + const wuffs_base__image_decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_base__image_decoder__num_decoded_frames( + const wuffs_base__image_decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__image_decoder__restart_frame( + wuffs_base__image_decoder* self, + uint64_t a_index, + uint64_t a_io_position); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_base__image_decoder__set_quirk_enabled( + wuffs_base__image_decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_base__image_decoder__set_report_metadata( + wuffs_base__image_decoder* self, + uint32_t a_fourcc, + bool a_report); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__image_decoder__tell_me_more( + wuffs_base__image_decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_base__image_decoder__workbuf_len( + const wuffs_base__image_decoder* self); + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_base__image_decoder__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable first_vtable; + } private_impl; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; +#endif + + inline wuffs_base__status + decode_frame( + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + return wuffs_base__image_decoder__decode_frame( + this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_base__image_decoder__decode_frame_config( + this, a_dst, a_src); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_base__image_decoder__decode_image_config( + this, a_dst, a_src); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { + return wuffs_base__image_decoder__frame_dirty_rect(this); + } + + inline uint32_t + num_animation_loops() const { + return wuffs_base__image_decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { + return wuffs_base__image_decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { + return wuffs_base__image_decoder__num_decoded_frames(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { + return wuffs_base__image_decoder__restart_frame( + this, a_index, a_io_position); + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__image_decoder__set_quirk_enabled( + this, a_quirk, a_enabled); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { + return wuffs_base__image_decoder__set_report_metadata( + this, a_fourcc, a_report); + } + + inline wuffs_base__status + tell_me_more( + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + return wuffs_base__image_decoder__tell_me_more( + this, a_dst, a_minfo, a_src); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_base__image_decoder__workbuf_len(this); + } + +#endif // __cplusplus +}; // struct wuffs_base__image_decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +// -------- + +extern const char wuffs_base__io_transformer__vtable_name[]; + +typedef struct wuffs_base__io_transformer__func_ptrs__struct { + wuffs_base__empty_struct (*set_quirk_enabled)( + void* self, + uint32_t a_quirk, + bool a_enabled); + wuffs_base__status (*transform_io)( + void* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + wuffs_base__range_ii_u64 (*workbuf_len)( + const void* self); +} wuffs_base__io_transformer__func_ptrs; + +typedef struct wuffs_base__io_transformer__struct wuffs_base__io_transformer; + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_base__io_transformer__set_quirk_enabled( + wuffs_base__io_transformer* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__io_transformer__transform_io( + wuffs_base__io_transformer* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_base__io_transformer__workbuf_len( + const wuffs_base__io_transformer* self); + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_base__io_transformer__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable first_vtable; + } private_impl; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; +#endif + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__io_transformer__set_quirk_enabled( + this, a_quirk, a_enabled); + } + + inline wuffs_base__status + transform_io( + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + return wuffs_base__io_transformer__transform_io( + this, a_dst, a_src, a_workbuf); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_base__io_transformer__workbuf_len(this); + } + +#endif // __cplusplus +}; // struct wuffs_base__io_transformer__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +// -------- + +extern const char wuffs_base__token_decoder__vtable_name[]; + +typedef struct wuffs_base__token_decoder__func_ptrs__struct { + wuffs_base__status (*decode_tokens)( + void* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + wuffs_base__empty_struct (*set_quirk_enabled)( + void* self, + uint32_t a_quirk, + bool a_enabled); + wuffs_base__range_ii_u64 (*workbuf_len)( + const void* self); +} wuffs_base__token_decoder__func_ptrs; + +typedef struct wuffs_base__token_decoder__struct wuffs_base__token_decoder; + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__token_decoder__decode_tokens( + wuffs_base__token_decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_base__token_decoder__set_quirk_enabled( + wuffs_base__token_decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_base__token_decoder__workbuf_len( + const wuffs_base__token_decoder* self); + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_base__token_decoder__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable first_vtable; + } private_impl; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; +#endif + + inline wuffs_base__status + decode_tokens( + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + return wuffs_base__token_decoder__decode_tokens( + this, a_dst, a_src, a_workbuf); + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__token_decoder__set_quirk_enabled( + this, a_quirk, a_enabled); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_base__token_decoder__workbuf_len(this); + } + +#endif // __cplusplus +}; // struct wuffs_base__token_decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +// ---------------- + +#ifdef __cplusplus +} // extern "C" +#endif + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +// ---------------- Public Consts + +// ---------------- Struct Declarations + +typedef struct wuffs_adler32__hasher__struct wuffs_adler32__hasher; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_adler32__hasher__initialize( + wuffs_adler32__hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_adler32__hasher(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_adler32__hasher* +wuffs_adler32__hasher__alloc(); + +static inline wuffs_base__hasher_u32* +wuffs_adler32__hasher__alloc_as__wuffs_base__hasher_u32() { + return (wuffs_base__hasher_u32*)(wuffs_adler32__hasher__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__hasher_u32* +wuffs_adler32__hasher__upcast_as__wuffs_base__hasher_u32( + wuffs_adler32__hasher* p) { + return (wuffs_base__hasher_u32*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_adler32__hasher__set_quirk_enabled( + wuffs_adler32__hasher* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_adler32__hasher__update_u32( + wuffs_adler32__hasher* self, + wuffs_base__slice_u8 a_x); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_adler32__hasher__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__hasher_u32; + wuffs_base__vtable null_vtable; + + uint32_t f_state; + bool f_started; + + wuffs_base__empty_struct (*choosy_up)( + wuffs_adler32__hasher* self, + wuffs_base__slice_u8 a_x); + } private_impl; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_adler32__hasher__alloc(), &free); + } + + static inline wuffs_base__hasher_u32::unique_ptr + alloc_as__wuffs_base__hasher_u32() { + return wuffs_base__hasher_u32::unique_ptr( + wuffs_adler32__hasher__alloc_as__wuffs_base__hasher_u32(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_adler32__hasher__struct() = delete; + wuffs_adler32__hasher__struct(const wuffs_adler32__hasher__struct&) = delete; + wuffs_adler32__hasher__struct& operator=( + const wuffs_adler32__hasher__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_adler32__hasher__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__hasher_u32* + upcast_as__wuffs_base__hasher_u32() { + return (wuffs_base__hasher_u32*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_adler32__hasher__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline uint32_t + update_u32( + wuffs_base__slice_u8 a_x) { + return wuffs_adler32__hasher__update_u32(this, a_x); + } + +#endif // __cplusplus +}; // struct wuffs_adler32__hasher__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_bmp__error__bad_header[]; +extern const char wuffs_bmp__error__bad_rle_compression[]; +extern const char wuffs_bmp__error__truncated_input[]; +extern const char wuffs_bmp__error__unsupported_bmp_file[]; + +// ---------------- Public Consts + +#define WUFFS_BMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 + +// ---------------- Struct Declarations + +typedef struct wuffs_bmp__decoder__struct wuffs_bmp__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_bmp__decoder__initialize( + wuffs_bmp__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_bmp__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_bmp__decoder* +wuffs_bmp__decoder__alloc(); + +static inline wuffs_base__image_decoder* +wuffs_bmp__decoder__alloc_as__wuffs_base__image_decoder() { + return (wuffs_base__image_decoder*)(wuffs_bmp__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__image_decoder* +wuffs_bmp__decoder__upcast_as__wuffs_base__image_decoder( + wuffs_bmp__decoder* p) { + return (wuffs_base__image_decoder*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_bmp__decoder__set_quirk_enabled( + wuffs_bmp__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bmp__decoder__decode_image_config( + wuffs_bmp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bmp__decoder__decode_frame_config( + wuffs_bmp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bmp__decoder__decode_frame( + wuffs_bmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_bmp__decoder__frame_dirty_rect( + const wuffs_bmp__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_bmp__decoder__num_animation_loops( + const wuffs_bmp__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_bmp__decoder__num_decoded_frame_configs( + const wuffs_bmp__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_bmp__decoder__num_decoded_frames( + const wuffs_bmp__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bmp__decoder__restart_frame( + wuffs_bmp__decoder* self, + uint64_t a_index, + uint64_t a_io_position); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_bmp__decoder__set_report_metadata( + wuffs_bmp__decoder* self, + uint32_t a_fourcc, + bool a_report); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bmp__decoder__tell_me_more( + wuffs_bmp__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_bmp__decoder__workbuf_len( + const wuffs_bmp__decoder* self); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_bmp__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + + uint32_t f_width; + uint32_t f_height; + uint8_t f_call_sequence; + bool f_top_down; + uint32_t f_pad_per_row; + uint32_t f_src_pixfmt; + uint32_t f_io_redirect_fourcc; + uint64_t f_io_redirect_pos; + uint64_t f_frame_config_io_position; + uint32_t f_bitmap_info_len; + uint32_t f_padding; + uint32_t f_bits_per_pixel; + uint32_t f_compression; + uint32_t f_channel_masks[4]; + uint8_t f_channel_shifts[4]; + uint8_t f_channel_num_bits[4]; + uint32_t f_dst_x; + uint32_t f_dst_y; + uint32_t f_dst_y_inc; + uint32_t f_pending_pad; + uint32_t f_rle_state; + uint32_t f_rle_length; + uint8_t f_rle_delta_x; + bool f_rle_padded; + wuffs_base__pixel_swizzler f_swizzler; + + uint32_t p_decode_image_config[1]; + uint32_t p_do_decode_image_config[1]; + uint32_t p_decode_frame_config[1]; + uint32_t p_do_decode_frame_config[1]; + uint32_t p_decode_frame[1]; + uint32_t p_do_decode_frame[1]; + uint32_t p_tell_me_more[1]; + uint32_t p_read_palette[1]; + } private_impl; + + struct { + uint8_t f_scratch[2048]; + uint8_t f_src_palette[1024]; + + struct { + uint64_t scratch; + } s_do_decode_image_config[1]; + struct { + uint64_t scratch; + } s_do_decode_frame[1]; + struct { + uint32_t v_i; + uint64_t scratch; + } s_read_palette[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_bmp__decoder__alloc(), &free); + } + + static inline wuffs_base__image_decoder::unique_ptr + alloc_as__wuffs_base__image_decoder() { + return wuffs_base__image_decoder::unique_ptr( + wuffs_bmp__decoder__alloc_as__wuffs_base__image_decoder(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_bmp__decoder__struct() = delete; + wuffs_bmp__decoder__struct(const wuffs_bmp__decoder__struct&) = delete; + wuffs_bmp__decoder__struct& operator=( + const wuffs_bmp__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_bmp__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__image_decoder* + upcast_as__wuffs_base__image_decoder() { + return (wuffs_base__image_decoder*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_bmp__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_bmp__decoder__decode_image_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_bmp__decoder__decode_frame_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame( + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + return wuffs_bmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { + return wuffs_bmp__decoder__frame_dirty_rect(this); + } + + inline uint32_t + num_animation_loops() const { + return wuffs_bmp__decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { + return wuffs_bmp__decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { + return wuffs_bmp__decoder__num_decoded_frames(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { + return wuffs_bmp__decoder__restart_frame(this, a_index, a_io_position); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { + return wuffs_bmp__decoder__set_report_metadata(this, a_fourcc, a_report); + } + + inline wuffs_base__status + tell_me_more( + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + return wuffs_bmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_bmp__decoder__workbuf_len(this); + } + +#endif // __cplusplus +}; // struct wuffs_bmp__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[]; +extern const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[]; +extern const char wuffs_bzip2__error__bad_block_header[]; +extern const char wuffs_bzip2__error__bad_block_length[]; +extern const char wuffs_bzip2__error__bad_checksum[]; +extern const char wuffs_bzip2__error__bad_header[]; +extern const char wuffs_bzip2__error__bad_number_of_sections[]; +extern const char wuffs_bzip2__error__truncated_input[]; +extern const char wuffs_bzip2__error__unsupported_block_randomization[]; + +// ---------------- Public Consts + +#define WUFFS_BZIP2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 + +// ---------------- Struct Declarations + +typedef struct wuffs_bzip2__decoder__struct wuffs_bzip2__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_bzip2__decoder__initialize( + wuffs_bzip2__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_bzip2__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_bzip2__decoder* +wuffs_bzip2__decoder__alloc(); + +static inline wuffs_base__io_transformer* +wuffs_bzip2__decoder__alloc_as__wuffs_base__io_transformer() { + return (wuffs_base__io_transformer*)(wuffs_bzip2__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__io_transformer* +wuffs_bzip2__decoder__upcast_as__wuffs_base__io_transformer( + wuffs_bzip2__decoder* p) { + return (wuffs_base__io_transformer*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_bzip2__decoder__set_quirk_enabled( + wuffs_bzip2__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_bzip2__decoder__workbuf_len( + const wuffs_bzip2__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bzip2__decoder__transform_io( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_bzip2__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__io_transformer; + wuffs_base__vtable null_vtable; + + uint32_t f_bits; + uint32_t f_n_bits; + uint32_t f_max_incl_block_size; + uint32_t f_block_size; + bool f_decode_huffman_finished; + uint8_t f_decode_huffman_which; + uint32_t f_decode_huffman_ticks; + uint32_t f_decode_huffman_section; + uint32_t f_decode_huffman_run_shift; + uint32_t f_flush_pointer; + uint32_t f_flush_repeat_count; + uint8_t f_flush_prev; + bool f_ignore_checksum; + uint32_t f_final_checksum_have; + uint32_t f_block_checksum_have; + uint32_t f_block_checksum_want; + uint32_t f_original_pointer; + uint32_t f_num_symbols; + uint32_t f_num_huffman_codes; + uint32_t f_num_sections; + uint32_t f_code_lengths_bitmask; + + uint32_t p_transform_io[1]; + uint32_t p_do_transform_io[1]; + uint32_t p_prepare_block[1]; + uint32_t p_read_code_lengths[1]; + uint32_t p_flush_slow[1]; + uint32_t p_decode_huffman_slow[1]; + } private_impl; + + struct { + uint32_t f_scratch; + uint32_t f_letter_counts[256]; + uint8_t f_presence[256]; + uint8_t f_mtft[256]; + uint8_t f_huffman_selectors[32768]; + uint16_t f_huffman_trees[6][257][2]; + uint16_t f_huffman_tables[6][256]; + uint32_t f_bwt[1048576]; + + struct { + uint32_t v_i; + uint64_t v_tag; + uint32_t v_final_checksum_want; + } s_do_transform_io[1]; + struct { + uint32_t v_i; + uint32_t v_selector; + } s_prepare_block[1]; + struct { + uint32_t v_i; + uint32_t v_code_length; + } s_read_code_lengths[1]; + struct { + uint32_t v_flush_pointer; + uint32_t v_flush_repeat_count; + uint8_t v_flush_prev; + uint32_t v_block_checksum_have; + uint32_t v_block_size; + uint8_t v_curr; + uint64_t scratch; + } s_flush_slow[1]; + struct { + uint32_t v_node_index; + } s_decode_huffman_slow[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_bzip2__decoder__alloc(), &free); + } + + static inline wuffs_base__io_transformer::unique_ptr + alloc_as__wuffs_base__io_transformer() { + return wuffs_base__io_transformer::unique_ptr( + wuffs_bzip2__decoder__alloc_as__wuffs_base__io_transformer(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_bzip2__decoder__struct() = delete; + wuffs_bzip2__decoder__struct(const wuffs_bzip2__decoder__struct&) = delete; + wuffs_bzip2__decoder__struct& operator=( + const wuffs_bzip2__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_bzip2__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__io_transformer* + upcast_as__wuffs_base__io_transformer() { + return (wuffs_base__io_transformer*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_bzip2__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_bzip2__decoder__workbuf_len(this); + } + + inline wuffs_base__status + transform_io( + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + return wuffs_bzip2__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + +#endif // __cplusplus +}; // struct wuffs_bzip2__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_cbor__error__bad_input[]; +extern const char wuffs_cbor__error__unsupported_recursion_depth[]; + +// ---------------- Public Consts + +#define WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 + +#define WUFFS_CBOR__DECODER_DEPTH_MAX_INCL 1024 + +#define WUFFS_CBOR__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 2 + +#define WUFFS_CBOR__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 9 + +#define WUFFS_CBOR__TOKEN_VALUE_MAJOR 787997 + +#define WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK 262143 + +#define WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X 16777216 + +#define WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE 8388608 + +#define WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG 4194304 + +// ---------------- Struct Declarations + +typedef struct wuffs_cbor__decoder__struct wuffs_cbor__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_cbor__decoder__initialize( + wuffs_cbor__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_cbor__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_cbor__decoder* +wuffs_cbor__decoder__alloc(); + +static inline wuffs_base__token_decoder* +wuffs_cbor__decoder__alloc_as__wuffs_base__token_decoder() { + return (wuffs_base__token_decoder*)(wuffs_cbor__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__token_decoder* +wuffs_cbor__decoder__upcast_as__wuffs_base__token_decoder( + wuffs_cbor__decoder* p) { + return (wuffs_base__token_decoder*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_cbor__decoder__set_quirk_enabled( + wuffs_cbor__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_cbor__decoder__workbuf_len( + const wuffs_cbor__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_cbor__decoder__decode_tokens( + wuffs_cbor__decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_cbor__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__token_decoder; + wuffs_base__vtable null_vtable; + + bool f_end_of_data; + + uint32_t p_decode_tokens[1]; + } private_impl; + + struct { + uint32_t f_stack[64]; + uint64_t f_container_num_remaining[1024]; + + struct { + uint64_t v_string_length; + uint32_t v_depth; + bool v_tagged; + uint8_t v_indefinite_string_major_type; + } s_decode_tokens[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_cbor__decoder__alloc(), &free); + } + + static inline wuffs_base__token_decoder::unique_ptr + alloc_as__wuffs_base__token_decoder() { + return wuffs_base__token_decoder::unique_ptr( + wuffs_cbor__decoder__alloc_as__wuffs_base__token_decoder(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_cbor__decoder__struct() = delete; + wuffs_cbor__decoder__struct(const wuffs_cbor__decoder__struct&) = delete; + wuffs_cbor__decoder__struct& operator=( + const wuffs_cbor__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_cbor__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__token_decoder* + upcast_as__wuffs_base__token_decoder() { + return (wuffs_base__token_decoder*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_cbor__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_cbor__decoder__workbuf_len(this); + } + + inline wuffs_base__status + decode_tokens( + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + return wuffs_cbor__decoder__decode_tokens(this, a_dst, a_src, a_workbuf); + } + +#endif // __cplusplus +}; // struct wuffs_cbor__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +// ---------------- Public Consts + +// ---------------- Struct Declarations + +typedef struct wuffs_crc32__ieee_hasher__struct wuffs_crc32__ieee_hasher; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_crc32__ieee_hasher__initialize( + wuffs_crc32__ieee_hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_crc32__ieee_hasher(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_crc32__ieee_hasher* +wuffs_crc32__ieee_hasher__alloc(); + +static inline wuffs_base__hasher_u32* +wuffs_crc32__ieee_hasher__alloc_as__wuffs_base__hasher_u32() { + return (wuffs_base__hasher_u32*)(wuffs_crc32__ieee_hasher__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__hasher_u32* +wuffs_crc32__ieee_hasher__upcast_as__wuffs_base__hasher_u32( + wuffs_crc32__ieee_hasher* p) { + return (wuffs_base__hasher_u32*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_crc32__ieee_hasher__set_quirk_enabled( + wuffs_crc32__ieee_hasher* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_crc32__ieee_hasher__update_u32( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_crc32__ieee_hasher__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__hasher_u32; + wuffs_base__vtable null_vtable; + + uint32_t f_state; + + wuffs_base__empty_struct (*choosy_up)( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x); + } private_impl; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_crc32__ieee_hasher__alloc(), &free); + } + + static inline wuffs_base__hasher_u32::unique_ptr + alloc_as__wuffs_base__hasher_u32() { + return wuffs_base__hasher_u32::unique_ptr( + wuffs_crc32__ieee_hasher__alloc_as__wuffs_base__hasher_u32(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_crc32__ieee_hasher__struct() = delete; + wuffs_crc32__ieee_hasher__struct(const wuffs_crc32__ieee_hasher__struct&) = delete; + wuffs_crc32__ieee_hasher__struct& operator=( + const wuffs_crc32__ieee_hasher__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_crc32__ieee_hasher__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__hasher_u32* + upcast_as__wuffs_base__hasher_u32() { + return (wuffs_base__hasher_u32*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_crc32__ieee_hasher__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline uint32_t + update_u32( + wuffs_base__slice_u8 a_x) { + return wuffs_crc32__ieee_hasher__update_u32(this, a_x); + } + +#endif // __cplusplus +}; // struct wuffs_crc32__ieee_hasher__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_deflate__error__bad_huffman_code_over_subscribed[]; +extern const char wuffs_deflate__error__bad_huffman_code_under_subscribed[]; +extern const char wuffs_deflate__error__bad_huffman_code_length_count[]; +extern const char wuffs_deflate__error__bad_huffman_code_length_repetition[]; +extern const char wuffs_deflate__error__bad_huffman_code[]; +extern const char wuffs_deflate__error__bad_huffman_minimum_code_length[]; +extern const char wuffs_deflate__error__bad_block[]; +extern const char wuffs_deflate__error__bad_distance[]; +extern const char wuffs_deflate__error__bad_distance_code_count[]; +extern const char wuffs_deflate__error__bad_literal_length_code_count[]; +extern const char wuffs_deflate__error__inconsistent_stored_block_length[]; +extern const char wuffs_deflate__error__missing_end_of_block_code[]; +extern const char wuffs_deflate__error__no_huffman_codes[]; +extern const char wuffs_deflate__error__truncated_input[]; + +// ---------------- Public Consts + +#define WUFFS_DEFLATE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1 + +// ---------------- Struct Declarations + +typedef struct wuffs_deflate__decoder__struct wuffs_deflate__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_deflate__decoder__initialize( + wuffs_deflate__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_deflate__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_deflate__decoder* +wuffs_deflate__decoder__alloc(); + +static inline wuffs_base__io_transformer* +wuffs_deflate__decoder__alloc_as__wuffs_base__io_transformer() { + return (wuffs_base__io_transformer*)(wuffs_deflate__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__io_transformer* +wuffs_deflate__decoder__upcast_as__wuffs_base__io_transformer( + wuffs_deflate__decoder* p) { + return (wuffs_base__io_transformer*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_deflate__decoder__add_history( + wuffs_deflate__decoder* self, + wuffs_base__slice_u8 a_hist); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_deflate__decoder__set_quirk_enabled( + wuffs_deflate__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_deflate__decoder__workbuf_len( + const wuffs_deflate__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_deflate__decoder__transform_io( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_deflate__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__io_transformer; + wuffs_base__vtable null_vtable; + + uint32_t f_bits; + uint32_t f_n_bits; + uint64_t f_transformed_history_count; + uint32_t f_history_index; + uint32_t f_n_huffs_bits[2]; + bool f_end_of_block; + + uint32_t p_transform_io[1]; + uint32_t p_do_transform_io[1]; + uint32_t p_decode_blocks[1]; + uint32_t p_decode_uncompressed[1]; + uint32_t p_init_dynamic_huffman[1]; + wuffs_base__status (*choosy_decode_huffman_fast64)( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src); + uint32_t p_decode_huffman_slow[1]; + } private_impl; + + struct { + uint32_t f_huffs[2][1024]; + uint8_t f_history[33025]; + uint8_t f_code_lengths[320]; + + struct { + uint32_t v_final; + } s_decode_blocks[1]; + struct { + uint32_t v_length; + uint64_t scratch; + } s_decode_uncompressed[1]; + struct { + uint32_t v_bits; + uint32_t v_n_bits; + uint32_t v_n_lit; + uint32_t v_n_dist; + uint32_t v_n_clen; + uint32_t v_i; + uint32_t v_mask; + uint32_t v_n_extra_bits; + uint8_t v_rep_symbol; + uint32_t v_rep_count; + } s_init_dynamic_huffman[1]; + struct { + uint32_t v_bits; + uint32_t v_n_bits; + uint32_t v_table_entry_n_bits; + uint32_t v_lmask; + uint32_t v_dmask; + uint32_t v_redir_top; + uint32_t v_redir_mask; + uint32_t v_length; + uint32_t v_dist_minus_1; + uint64_t scratch; + } s_decode_huffman_slow[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_deflate__decoder__alloc(), &free); + } + + static inline wuffs_base__io_transformer::unique_ptr + alloc_as__wuffs_base__io_transformer() { + return wuffs_base__io_transformer::unique_ptr( + wuffs_deflate__decoder__alloc_as__wuffs_base__io_transformer(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_deflate__decoder__struct() = delete; + wuffs_deflate__decoder__struct(const wuffs_deflate__decoder__struct&) = delete; + wuffs_deflate__decoder__struct& operator=( + const wuffs_deflate__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_deflate__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__io_transformer* + upcast_as__wuffs_base__io_transformer() { + return (wuffs_base__io_transformer*)this; + } + + inline wuffs_base__empty_struct + add_history( + wuffs_base__slice_u8 a_hist) { + return wuffs_deflate__decoder__add_history(this, a_hist); + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_deflate__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_deflate__decoder__workbuf_len(this); + } + + inline wuffs_base__status + transform_io( + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + return wuffs_deflate__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + +#endif // __cplusplus +}; // struct wuffs_deflate__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_lzw__error__bad_code[]; +extern const char wuffs_lzw__error__truncated_input[]; + +// ---------------- Public Consts + +#define WUFFS_LZW__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 + +// ---------------- Struct Declarations + +typedef struct wuffs_lzw__decoder__struct wuffs_lzw__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_lzw__decoder__initialize( + wuffs_lzw__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_lzw__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_lzw__decoder* +wuffs_lzw__decoder__alloc(); + +static inline wuffs_base__io_transformer* +wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer() { + return (wuffs_base__io_transformer*)(wuffs_lzw__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__io_transformer* +wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer( + wuffs_lzw__decoder* p) { + return (wuffs_base__io_transformer*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_lzw__decoder__set_quirk_enabled( + wuffs_lzw__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_lzw__decoder__set_literal_width( + wuffs_lzw__decoder* self, + uint32_t a_lw); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_lzw__decoder__workbuf_len( + const wuffs_lzw__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_lzw__decoder__transform_io( + wuffs_lzw__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 +wuffs_lzw__decoder__flush( + wuffs_lzw__decoder* self); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_lzw__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__io_transformer; + wuffs_base__vtable null_vtable; + + uint32_t f_set_literal_width_arg; + uint32_t f_literal_width; + uint32_t f_clear_code; + uint32_t f_end_code; + uint32_t f_save_code; + uint32_t f_prev_code; + uint32_t f_width; + uint32_t f_bits; + uint32_t f_n_bits; + uint32_t f_output_ri; + uint32_t f_output_wi; + uint32_t f_read_from_return_value; + uint16_t f_prefixes[4096]; + + uint32_t p_transform_io[1]; + uint32_t p_write_to[1]; + } private_impl; + + struct { + uint8_t f_suffixes[4096][8]; + uint16_t f_lm1s[4096]; + uint8_t f_output[8199]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_lzw__decoder__alloc(), &free); + } + + static inline wuffs_base__io_transformer::unique_ptr + alloc_as__wuffs_base__io_transformer() { + return wuffs_base__io_transformer::unique_ptr( + wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_lzw__decoder__struct() = delete; + wuffs_lzw__decoder__struct(const wuffs_lzw__decoder__struct&) = delete; + wuffs_lzw__decoder__struct& operator=( + const wuffs_lzw__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_lzw__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__io_transformer* + upcast_as__wuffs_base__io_transformer() { + return (wuffs_base__io_transformer*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_lzw__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__empty_struct + set_literal_width( + uint32_t a_lw) { + return wuffs_lzw__decoder__set_literal_width(this, a_lw); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_lzw__decoder__workbuf_len(this); + } + + inline wuffs_base__status + transform_io( + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + return wuffs_lzw__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + + inline wuffs_base__slice_u8 + flush() { + return wuffs_lzw__decoder__flush(this); + } + +#endif // __cplusplus +}; // struct wuffs_lzw__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_gif__error__bad_extension_label[]; +extern const char wuffs_gif__error__bad_frame_size[]; +extern const char wuffs_gif__error__bad_graphic_control[]; +extern const char wuffs_gif__error__bad_header[]; +extern const char wuffs_gif__error__bad_literal_width[]; +extern const char wuffs_gif__error__bad_palette[]; +extern const char wuffs_gif__error__truncated_input[]; + +// ---------------- Public Consts + +#define WUFFS_GIF__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 + +#define WUFFS_GIF__QUIRK_DELAY_NUM_DECODED_FRAMES 1041635328 + +#define WUFFS_GIF__QUIRK_FIRST_FRAME_LOCAL_PALETTE_MEANS_BLACK_BACKGROUND 1041635329 + +#define WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR 1041635330 + +#define WUFFS_GIF__QUIRK_IGNORE_TOO_MUCH_PIXEL_DATA 1041635331 + +#define WUFFS_GIF__QUIRK_IMAGE_BOUNDS_ARE_STRICT 1041635332 + +#define WUFFS_GIF__QUIRK_REJECT_EMPTY_FRAME 1041635333 + +#define WUFFS_GIF__QUIRK_REJECT_EMPTY_PALETTE 1041635334 + +// ---------------- Struct Declarations + +typedef struct wuffs_gif__decoder__struct wuffs_gif__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_gif__decoder__initialize( + wuffs_gif__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_gif__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_gif__decoder* +wuffs_gif__decoder__alloc(); + +static inline wuffs_base__image_decoder* +wuffs_gif__decoder__alloc_as__wuffs_base__image_decoder() { + return (wuffs_base__image_decoder*)(wuffs_gif__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__image_decoder* +wuffs_gif__decoder__upcast_as__wuffs_base__image_decoder( + wuffs_gif__decoder* p) { + return (wuffs_base__image_decoder*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_gif__decoder__set_quirk_enabled( + wuffs_gif__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_gif__decoder__decode_image_config( + wuffs_gif__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_gif__decoder__set_report_metadata( + wuffs_gif__decoder* self, + uint32_t a_fourcc, + bool a_report); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_gif__decoder__tell_me_more( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_gif__decoder__num_animation_loops( + const wuffs_gif__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_gif__decoder__num_decoded_frame_configs( + const wuffs_gif__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_gif__decoder__num_decoded_frames( + const wuffs_gif__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_gif__decoder__frame_dirty_rect( + const wuffs_gif__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_gif__decoder__workbuf_len( + const wuffs_gif__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_gif__decoder__restart_frame( + wuffs_gif__decoder* self, + uint64_t a_index, + uint64_t a_io_position); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_gif__decoder__decode_frame_config( + wuffs_gif__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_gif__decoder__decode_frame( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_gif__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + + uint32_t f_width; + uint32_t f_height; + uint8_t f_call_sequence; + bool f_report_metadata_iccp; + bool f_report_metadata_xmp; + uint32_t f_metadata_fourcc; + uint64_t f_metadata_io_position; + bool f_quirks[7]; + bool f_delayed_num_decoded_frames; + bool f_previous_lzw_decode_ended_abruptly; + bool f_seen_header; + bool f_has_global_palette; + uint8_t f_interlace; + bool f_seen_num_animation_loops_value; + uint32_t f_num_animation_loops_value; + uint32_t f_background_color_u32_argb_premul; + uint32_t f_black_color_u32_argb_premul; + bool f_gc_has_transparent_index; + uint8_t f_gc_transparent_index; + uint8_t f_gc_disposal; + uint64_t f_gc_duration; + uint64_t f_frame_config_io_position; + uint64_t f_num_decoded_frame_configs_value; + uint64_t f_num_decoded_frames_value; + uint32_t f_frame_rect_x0; + uint32_t f_frame_rect_y0; + uint32_t f_frame_rect_x1; + uint32_t f_frame_rect_y1; + uint32_t f_dst_x; + uint32_t f_dst_y; + uint32_t f_dirty_max_excl_y; + uint64_t f_compressed_ri; + uint64_t f_compressed_wi; + wuffs_base__pixel_swizzler f_swizzler; + + uint32_t p_decode_image_config[1]; + uint32_t p_do_decode_image_config[1]; + uint32_t p_tell_me_more[1]; + uint32_t p_do_tell_me_more[1]; + uint32_t p_decode_frame_config[1]; + uint32_t p_do_decode_frame_config[1]; + uint32_t p_skip_frame[1]; + uint32_t p_decode_frame[1]; + uint32_t p_do_decode_frame[1]; + uint32_t p_decode_up_to_id_part1[1]; + uint32_t p_decode_header[1]; + uint32_t p_decode_lsd[1]; + uint32_t p_decode_extension[1]; + uint32_t p_skip_blocks[1]; + uint32_t p_decode_ae[1]; + uint32_t p_decode_gc[1]; + uint32_t p_decode_id_part0[1]; + uint32_t p_decode_id_part1[1]; + uint32_t p_decode_id_part2[1]; + } private_impl; + + struct { + uint8_t f_compressed[4096]; + uint8_t f_palettes[2][1024]; + uint8_t f_dst_palette[1024]; + wuffs_lzw__decoder f_lzw; + + struct { + uint32_t v_background_color; + } s_do_decode_frame_config[1]; + struct { + uint64_t scratch; + } s_skip_frame[1]; + struct { + uint8_t v_c[6]; + uint32_t v_i; + } s_decode_header[1]; + struct { + uint8_t v_flags; + uint8_t v_background_color_index; + uint32_t v_num_palette_entries; + uint32_t v_i; + uint64_t scratch; + } s_decode_lsd[1]; + struct { + uint64_t scratch; + } s_skip_blocks[1]; + struct { + uint8_t v_block_size; + bool v_is_animexts; + bool v_is_netscape; + bool v_is_iccp; + bool v_is_xmp; + uint64_t scratch; + } s_decode_ae[1]; + struct { + uint64_t scratch; + } s_decode_gc[1]; + struct { + uint64_t scratch; + } s_decode_id_part0[1]; + struct { + uint8_t v_which_palette; + uint32_t v_num_palette_entries; + uint32_t v_i; + uint64_t scratch; + } s_decode_id_part1[1]; + struct { + uint64_t v_block_size; + bool v_need_block_size; + uint64_t scratch; + } s_decode_id_part2[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_gif__decoder__alloc(), &free); + } + + static inline wuffs_base__image_decoder::unique_ptr + alloc_as__wuffs_base__image_decoder() { + return wuffs_base__image_decoder::unique_ptr( + wuffs_gif__decoder__alloc_as__wuffs_base__image_decoder(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_gif__decoder__struct() = delete; + wuffs_gif__decoder__struct(const wuffs_gif__decoder__struct&) = delete; + wuffs_gif__decoder__struct& operator=( + const wuffs_gif__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_gif__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__image_decoder* + upcast_as__wuffs_base__image_decoder() { + return (wuffs_base__image_decoder*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_gif__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_gif__decoder__decode_image_config(this, a_dst, a_src); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { + return wuffs_gif__decoder__set_report_metadata(this, a_fourcc, a_report); + } + + inline wuffs_base__status + tell_me_more( + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + return wuffs_gif__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + + inline uint32_t + num_animation_loops() const { + return wuffs_gif__decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { + return wuffs_gif__decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { + return wuffs_gif__decoder__num_decoded_frames(this); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { + return wuffs_gif__decoder__frame_dirty_rect(this); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_gif__decoder__workbuf_len(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { + return wuffs_gif__decoder__restart_frame(this, a_index, a_io_position); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_gif__decoder__decode_frame_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame( + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + return wuffs_gif__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + +#endif // __cplusplus +}; // struct wuffs_gif__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_gzip__error__bad_checksum[]; +extern const char wuffs_gzip__error__bad_compression_method[]; +extern const char wuffs_gzip__error__bad_encoding_flags[]; +extern const char wuffs_gzip__error__bad_header[]; +extern const char wuffs_gzip__error__truncated_input[]; + +// ---------------- Public Consts + +#define WUFFS_GZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1 + +// ---------------- Struct Declarations + +typedef struct wuffs_gzip__decoder__struct wuffs_gzip__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_gzip__decoder__initialize( + wuffs_gzip__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_gzip__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_gzip__decoder* +wuffs_gzip__decoder__alloc(); + +static inline wuffs_base__io_transformer* +wuffs_gzip__decoder__alloc_as__wuffs_base__io_transformer() { + return (wuffs_base__io_transformer*)(wuffs_gzip__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__io_transformer* +wuffs_gzip__decoder__upcast_as__wuffs_base__io_transformer( + wuffs_gzip__decoder* p) { + return (wuffs_base__io_transformer*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_gzip__decoder__set_quirk_enabled( + wuffs_gzip__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_gzip__decoder__workbuf_len( + const wuffs_gzip__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_gzip__decoder__transform_io( + wuffs_gzip__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_gzip__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__io_transformer; + wuffs_base__vtable null_vtable; + + bool f_ignore_checksum; + + uint32_t p_transform_io[1]; + uint32_t p_do_transform_io[1]; + } private_impl; + + struct { + wuffs_crc32__ieee_hasher f_checksum; + wuffs_deflate__decoder f_flate; + + struct { + uint8_t v_flags; + uint32_t v_checksum_got; + uint32_t v_decoded_length_got; + uint32_t v_checksum_want; + uint64_t scratch; + } s_do_transform_io[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_gzip__decoder__alloc(), &free); + } + + static inline wuffs_base__io_transformer::unique_ptr + alloc_as__wuffs_base__io_transformer() { + return wuffs_base__io_transformer::unique_ptr( + wuffs_gzip__decoder__alloc_as__wuffs_base__io_transformer(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_gzip__decoder__struct() = delete; + wuffs_gzip__decoder__struct(const wuffs_gzip__decoder__struct&) = delete; + wuffs_gzip__decoder__struct& operator=( + const wuffs_gzip__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_gzip__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__io_transformer* + upcast_as__wuffs_base__io_transformer() { + return (wuffs_base__io_transformer*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_gzip__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_gzip__decoder__workbuf_len(this); + } + + inline wuffs_base__status + transform_io( + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + return wuffs_gzip__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + +#endif // __cplusplus +}; // struct wuffs_gzip__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_json__error__bad_c0_control_code[]; +extern const char wuffs_json__error__bad_utf_8[]; +extern const char wuffs_json__error__bad_backslash_escape[]; +extern const char wuffs_json__error__bad_input[]; +extern const char wuffs_json__error__bad_new_line_in_a_string[]; +extern const char wuffs_json__error__bad_quirk_combination[]; +extern const char wuffs_json__error__unsupported_number_length[]; +extern const char wuffs_json__error__unsupported_recursion_depth[]; + +// ---------------- Public Consts + +#define WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 + +#define WUFFS_JSON__DECODER_DEPTH_MAX_INCL 1024 + +#define WUFFS_JSON__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 1 + +#define WUFFS_JSON__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 100 + +#define WUFFS_JSON__QUIRK_ALLOW_ASCII_CONTROL_CODES 1225364480 + +#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_A 1225364481 + +#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_CAPITAL_U 1225364482 + +#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_E 1225364483 + +#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_NEW_LINE 1225364484 + +#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_QUESTION_MARK 1225364485 + +#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_SINGLE_QUOTE 1225364486 + +#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_V 1225364487 + +#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_X_AS_CODE_POINTS 1225364489 + +#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_ZERO 1225364490 + +#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_BLOCK 1225364491 + +#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_LINE 1225364492 + +#define WUFFS_JSON__QUIRK_ALLOW_EXTRA_COMMA 1225364493 + +#define WUFFS_JSON__QUIRK_ALLOW_INF_NAN_NUMBERS 1225364494 + +#define WUFFS_JSON__QUIRK_ALLOW_LEADING_ASCII_RECORD_SEPARATOR 1225364495 + +#define WUFFS_JSON__QUIRK_ALLOW_LEADING_UNICODE_BYTE_ORDER_MARK 1225364496 + +#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER 1225364497 + +#define WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF 1225364498 + +#define WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T 1225364499 + +#define WUFFS_JSON__QUIRK_REPLACE_INVALID_UNICODE 1225364500 + +// ---------------- Struct Declarations + +typedef struct wuffs_json__decoder__struct wuffs_json__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_json__decoder__initialize( + wuffs_json__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_json__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_json__decoder* +wuffs_json__decoder__alloc(); + +static inline wuffs_base__token_decoder* +wuffs_json__decoder__alloc_as__wuffs_base__token_decoder() { + return (wuffs_base__token_decoder*)(wuffs_json__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__token_decoder* +wuffs_json__decoder__upcast_as__wuffs_base__token_decoder( + wuffs_json__decoder* p) { + return (wuffs_base__token_decoder*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_json__decoder__set_quirk_enabled( + wuffs_json__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_json__decoder__workbuf_len( + const wuffs_json__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_json__decoder__decode_tokens( + wuffs_json__decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_json__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__token_decoder; + wuffs_base__vtable null_vtable; + + bool f_quirks[21]; + bool f_allow_leading_ars; + bool f_allow_leading_ubom; + bool f_end_of_data; + uint8_t f_trailer_stop; + uint8_t f_comment_type; + + uint32_t p_decode_tokens[1]; + uint32_t p_decode_leading[1]; + uint32_t p_decode_comment[1]; + uint32_t p_decode_inf_nan[1]; + uint32_t p_decode_trailer[1]; + } private_impl; + + struct { + uint32_t f_stack[32]; + + struct { + uint32_t v_depth; + uint32_t v_expect; + uint32_t v_expect_after_value; + } s_decode_tokens[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_json__decoder__alloc(), &free); + } + + static inline wuffs_base__token_decoder::unique_ptr + alloc_as__wuffs_base__token_decoder() { + return wuffs_base__token_decoder::unique_ptr( + wuffs_json__decoder__alloc_as__wuffs_base__token_decoder(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_json__decoder__struct() = delete; + wuffs_json__decoder__struct(const wuffs_json__decoder__struct&) = delete; + wuffs_json__decoder__struct& operator=( + const wuffs_json__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_json__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__token_decoder* + upcast_as__wuffs_base__token_decoder() { + return (wuffs_base__token_decoder*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_json__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_json__decoder__workbuf_len(this); + } + + inline wuffs_base__status + decode_tokens( + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + return wuffs_json__decoder__decode_tokens(this, a_dst, a_src, a_workbuf); + } + +#endif // __cplusplus +}; // struct wuffs_json__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_nie__error__bad_header[]; +extern const char wuffs_nie__error__truncated_input[]; +extern const char wuffs_nie__error__unsupported_nie_file[]; + +// ---------------- Public Consts + +#define WUFFS_NIE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 + +// ---------------- Struct Declarations + +typedef struct wuffs_nie__decoder__struct wuffs_nie__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_nie__decoder__initialize( + wuffs_nie__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_nie__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_nie__decoder* +wuffs_nie__decoder__alloc(); + +static inline wuffs_base__image_decoder* +wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder() { + return (wuffs_base__image_decoder*)(wuffs_nie__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__image_decoder* +wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder( + wuffs_nie__decoder* p) { + return (wuffs_base__image_decoder*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_nie__decoder__set_quirk_enabled( + wuffs_nie__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_nie__decoder__decode_image_config( + wuffs_nie__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_nie__decoder__decode_frame_config( + wuffs_nie__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_nie__decoder__decode_frame( + wuffs_nie__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_nie__decoder__frame_dirty_rect( + const wuffs_nie__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_nie__decoder__num_animation_loops( + const wuffs_nie__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_nie__decoder__num_decoded_frame_configs( + const wuffs_nie__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_nie__decoder__num_decoded_frames( + const wuffs_nie__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_nie__decoder__restart_frame( + wuffs_nie__decoder* self, + uint64_t a_index, + uint64_t a_io_position); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_nie__decoder__set_report_metadata( + wuffs_nie__decoder* self, + uint32_t a_fourcc, + bool a_report); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_nie__decoder__tell_me_more( + wuffs_nie__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_nie__decoder__workbuf_len( + const wuffs_nie__decoder* self); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_nie__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + + uint32_t f_pixfmt; + uint32_t f_width; + uint32_t f_height; + uint8_t f_call_sequence; + uint32_t f_dst_x; + uint32_t f_dst_y; + wuffs_base__pixel_swizzler f_swizzler; + + uint32_t p_decode_image_config[1]; + uint32_t p_do_decode_image_config[1]; + uint32_t p_decode_frame_config[1]; + uint32_t p_do_decode_frame_config[1]; + uint32_t p_decode_frame[1]; + uint32_t p_do_decode_frame[1]; + } private_impl; + + struct { + struct { + uint64_t scratch; + } s_do_decode_image_config[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_nie__decoder__alloc(), &free); + } + + static inline wuffs_base__image_decoder::unique_ptr + alloc_as__wuffs_base__image_decoder() { + return wuffs_base__image_decoder::unique_ptr( + wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_nie__decoder__struct() = delete; + wuffs_nie__decoder__struct(const wuffs_nie__decoder__struct&) = delete; + wuffs_nie__decoder__struct& operator=( + const wuffs_nie__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_nie__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__image_decoder* + upcast_as__wuffs_base__image_decoder() { + return (wuffs_base__image_decoder*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_nie__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_nie__decoder__decode_image_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_nie__decoder__decode_frame_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame( + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + return wuffs_nie__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { + return wuffs_nie__decoder__frame_dirty_rect(this); + } + + inline uint32_t + num_animation_loops() const { + return wuffs_nie__decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { + return wuffs_nie__decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { + return wuffs_nie__decoder__num_decoded_frames(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { + return wuffs_nie__decoder__restart_frame(this, a_index, a_io_position); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { + return wuffs_nie__decoder__set_report_metadata(this, a_fourcc, a_report); + } + + inline wuffs_base__status + tell_me_more( + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + return wuffs_nie__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_nie__decoder__workbuf_len(this); + } + +#endif // __cplusplus +}; // struct wuffs_nie__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_zlib__note__dictionary_required[]; +extern const char wuffs_zlib__error__bad_checksum[]; +extern const char wuffs_zlib__error__bad_compression_method[]; +extern const char wuffs_zlib__error__bad_compression_window_size[]; +extern const char wuffs_zlib__error__bad_parity_check[]; +extern const char wuffs_zlib__error__incorrect_dictionary[]; +extern const char wuffs_zlib__error__truncated_input[]; + +// ---------------- Public Consts + +#define WUFFS_ZLIB__QUIRK_JUST_RAW_DEFLATE 2113790976 + +#define WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1 + +// ---------------- Struct Declarations + +typedef struct wuffs_zlib__decoder__struct wuffs_zlib__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_zlib__decoder__initialize( + wuffs_zlib__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_zlib__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_zlib__decoder* +wuffs_zlib__decoder__alloc(); + +static inline wuffs_base__io_transformer* +wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer() { + return (wuffs_base__io_transformer*)(wuffs_zlib__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__io_transformer* +wuffs_zlib__decoder__upcast_as__wuffs_base__io_transformer( + wuffs_zlib__decoder* p) { + return (wuffs_base__io_transformer*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_zlib__decoder__dictionary_id( + const wuffs_zlib__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_zlib__decoder__add_dictionary( + wuffs_zlib__decoder* self, + wuffs_base__slice_u8 a_dict); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_zlib__decoder__set_quirk_enabled( + wuffs_zlib__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_zlib__decoder__workbuf_len( + const wuffs_zlib__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_zlib__decoder__transform_io( + wuffs_zlib__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_zlib__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__io_transformer; + wuffs_base__vtable null_vtable; + + bool f_bad_call_sequence; + bool f_header_complete; + bool f_got_dictionary; + bool f_want_dictionary; + bool f_quirks[1]; + bool f_ignore_checksum; + uint32_t f_dict_id_got; + uint32_t f_dict_id_want; + + uint32_t p_transform_io[1]; + uint32_t p_do_transform_io[1]; + } private_impl; + + struct { + wuffs_adler32__hasher f_checksum; + wuffs_adler32__hasher f_dict_id_hasher; + wuffs_deflate__decoder f_flate; + + struct { + uint32_t v_checksum_got; + uint64_t scratch; + } s_do_transform_io[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_zlib__decoder__alloc(), &free); + } + + static inline wuffs_base__io_transformer::unique_ptr + alloc_as__wuffs_base__io_transformer() { + return wuffs_base__io_transformer::unique_ptr( + wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_zlib__decoder__struct() = delete; + wuffs_zlib__decoder__struct(const wuffs_zlib__decoder__struct&) = delete; + wuffs_zlib__decoder__struct& operator=( + const wuffs_zlib__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_zlib__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__io_transformer* + upcast_as__wuffs_base__io_transformer() { + return (wuffs_base__io_transformer*)this; + } + + inline uint32_t + dictionary_id() const { + return wuffs_zlib__decoder__dictionary_id(this); + } + + inline wuffs_base__empty_struct + add_dictionary( + wuffs_base__slice_u8 a_dict) { + return wuffs_zlib__decoder__add_dictionary(this, a_dict); + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_zlib__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_zlib__decoder__workbuf_len(this); + } + + inline wuffs_base__status + transform_io( + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + return wuffs_zlib__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + +#endif // __cplusplus +}; // struct wuffs_zlib__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_png__error__bad_animation_sequence_number[]; +extern const char wuffs_png__error__bad_checksum[]; +extern const char wuffs_png__error__bad_chunk[]; +extern const char wuffs_png__error__bad_filter[]; +extern const char wuffs_png__error__bad_header[]; +extern const char wuffs_png__error__bad_text_chunk_not_latin_1[]; +extern const char wuffs_png__error__missing_palette[]; +extern const char wuffs_png__error__truncated_input[]; +extern const char wuffs_png__error__unsupported_cgbi_extension[]; +extern const char wuffs_png__error__unsupported_png_compression_method[]; +extern const char wuffs_png__error__unsupported_png_file[]; + +// ---------------- Public Consts + +#define WUFFS_PNG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 2251799562027015 + +#define WUFFS_PNG__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 8 + +// ---------------- Struct Declarations + +typedef struct wuffs_png__decoder__struct wuffs_png__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_png__decoder__initialize( + wuffs_png__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_png__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_png__decoder* +wuffs_png__decoder__alloc(); + +static inline wuffs_base__image_decoder* +wuffs_png__decoder__alloc_as__wuffs_base__image_decoder() { + return (wuffs_base__image_decoder*)(wuffs_png__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__image_decoder* +wuffs_png__decoder__upcast_as__wuffs_base__image_decoder( + wuffs_png__decoder* p) { + return (wuffs_base__image_decoder*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_png__decoder__set_quirk_enabled( + wuffs_png__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_png__decoder__decode_image_config( + wuffs_png__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_png__decoder__decode_frame_config( + wuffs_png__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_png__decoder__decode_frame( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_png__decoder__frame_dirty_rect( + const wuffs_png__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_png__decoder__num_animation_loops( + const wuffs_png__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_png__decoder__num_decoded_frame_configs( + const wuffs_png__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_png__decoder__num_decoded_frames( + const wuffs_png__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_png__decoder__restart_frame( + wuffs_png__decoder* self, + uint64_t a_index, + uint64_t a_io_position); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_png__decoder__set_report_metadata( + wuffs_png__decoder* self, + uint32_t a_fourcc, + bool a_report); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_png__decoder__tell_me_more( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_png__decoder__workbuf_len( + const wuffs_png__decoder* self); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_png__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + + uint32_t f_width; + uint32_t f_height; + uint64_t f_pass_bytes_per_row; + uint64_t f_workbuf_wi; + uint64_t f_workbuf_hist_pos_base; + uint64_t f_overall_workbuf_length; + uint64_t f_pass_workbuf_length; + uint8_t f_call_sequence; + bool f_report_metadata_chrm; + bool f_report_metadata_exif; + bool f_report_metadata_gama; + bool f_report_metadata_iccp; + bool f_report_metadata_kvp; + bool f_report_metadata_srgb; + bool f_ignore_checksum; + uint8_t f_depth; + uint8_t f_color_type; + uint8_t f_filter_distance; + uint8_t f_interlace_pass; + bool f_seen_actl; + bool f_seen_chrm; + bool f_seen_fctl; + bool f_seen_exif; + bool f_seen_gama; + bool f_seen_iccp; + bool f_seen_idat; + bool f_seen_ihdr; + bool f_seen_plte; + bool f_seen_srgb; + bool f_seen_trns; + bool f_metadata_is_zlib_compressed; + bool f_zlib_is_dirty; + uint32_t f_chunk_type; + uint8_t f_chunk_type_array[4]; + uint32_t f_chunk_length; + uint64_t f_remap_transparency; + uint32_t f_dst_pixfmt; + uint32_t f_src_pixfmt; + uint32_t f_num_animation_frames_value; + uint32_t f_num_animation_loops_value; + uint32_t f_num_decoded_frame_configs_value; + uint32_t f_num_decoded_frames_value; + uint32_t f_frame_rect_x0; + uint32_t f_frame_rect_y0; + uint32_t f_frame_rect_x1; + uint32_t f_frame_rect_y1; + uint32_t f_first_rect_x0; + uint32_t f_first_rect_y0; + uint32_t f_first_rect_x1; + uint32_t f_first_rect_y1; + uint64_t f_frame_config_io_position; + uint64_t f_first_config_io_position; + uint64_t f_frame_duration; + uint64_t f_first_duration; + uint8_t f_frame_disposal; + uint8_t f_first_disposal; + bool f_frame_overwrite_instead_of_blend; + bool f_first_overwrite_instead_of_blend; + uint32_t f_next_animation_seq_num; + uint32_t f_metadata_flavor; + uint32_t f_metadata_fourcc; + uint64_t f_metadata_x; + uint64_t f_metadata_y; + uint64_t f_metadata_z; + uint32_t f_ztxt_ri; + uint32_t f_ztxt_wi; + uint64_t f_ztxt_hist_pos; + wuffs_base__pixel_swizzler f_swizzler; + + wuffs_base__empty_struct (*choosy_filter_1)( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr); + wuffs_base__empty_struct (*choosy_filter_3)( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); + wuffs_base__empty_struct (*choosy_filter_4)( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); + uint32_t p_decode_image_config[1]; + uint32_t p_do_decode_image_config[1]; + uint32_t p_decode_ihdr[1]; + uint32_t p_decode_other_chunk[1]; + uint32_t p_decode_actl[1]; + uint32_t p_decode_chrm[1]; + uint32_t p_decode_fctl[1]; + uint32_t p_decode_gama[1]; + uint32_t p_decode_iccp[1]; + uint32_t p_decode_plte[1]; + uint32_t p_decode_srgb[1]; + uint32_t p_decode_trns[1]; + uint32_t p_decode_frame_config[1]; + uint32_t p_do_decode_frame_config[1]; + uint32_t p_skip_frame[1]; + uint32_t p_decode_frame[1]; + uint32_t p_do_decode_frame[1]; + uint32_t p_decode_pass[1]; + uint32_t p_tell_me_more[1]; + uint32_t p_do_tell_me_more[1]; + wuffs_base__status (*choosy_filter_and_swizzle)( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__slice_u8 a_workbuf); + } private_impl; + + struct { + wuffs_crc32__ieee_hasher f_crc32; + wuffs_zlib__decoder f_zlib; + uint8_t f_dst_palette[1024]; + uint8_t f_src_palette[1024]; + + struct { + uint32_t v_checksum_have; + uint64_t scratch; + } s_do_decode_image_config[1]; + struct { + uint64_t scratch; + } s_decode_ihdr[1]; + struct { + uint64_t scratch; + } s_decode_other_chunk[1]; + struct { + uint64_t scratch; + } s_decode_actl[1]; + struct { + uint64_t scratch; + } s_decode_chrm[1]; + struct { + uint32_t v_x0; + uint32_t v_x1; + uint32_t v_y1; + uint64_t scratch; + } s_decode_fctl[1]; + struct { + uint64_t scratch; + } s_decode_gama[1]; + struct { + uint32_t v_num_entries; + uint32_t v_i; + uint64_t scratch; + } s_decode_plte[1]; + struct { + uint32_t v_i; + uint32_t v_n; + uint64_t scratch; + } s_decode_trns[1]; + struct { + uint64_t scratch; + } s_do_decode_frame_config[1]; + struct { + uint64_t scratch; + } s_skip_frame[1]; + struct { + uint64_t scratch; + } s_do_decode_frame[1]; + struct { + uint64_t scratch; + } s_decode_pass[1]; + struct { + wuffs_base__status v_zlib_status; + uint64_t scratch; + } s_do_tell_me_more[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_png__decoder__alloc(), &free); + } + + static inline wuffs_base__image_decoder::unique_ptr + alloc_as__wuffs_base__image_decoder() { + return wuffs_base__image_decoder::unique_ptr( + wuffs_png__decoder__alloc_as__wuffs_base__image_decoder(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_png__decoder__struct() = delete; + wuffs_png__decoder__struct(const wuffs_png__decoder__struct&) = delete; + wuffs_png__decoder__struct& operator=( + const wuffs_png__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_png__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__image_decoder* + upcast_as__wuffs_base__image_decoder() { + return (wuffs_base__image_decoder*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_png__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_png__decoder__decode_image_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_png__decoder__decode_frame_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame( + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + return wuffs_png__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { + return wuffs_png__decoder__frame_dirty_rect(this); + } + + inline uint32_t + num_animation_loops() const { + return wuffs_png__decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { + return wuffs_png__decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { + return wuffs_png__decoder__num_decoded_frames(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { + return wuffs_png__decoder__restart_frame(this, a_index, a_io_position); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { + return wuffs_png__decoder__set_report_metadata(this, a_fourcc, a_report); + } + + inline wuffs_base__status + tell_me_more( + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + return wuffs_png__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_png__decoder__workbuf_len(this); + } + +#endif // __cplusplus +}; // struct wuffs_png__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_tga__error__bad_header[]; +extern const char wuffs_tga__error__bad_run_length_encoding[]; +extern const char wuffs_tga__error__truncated_input[]; +extern const char wuffs_tga__error__unsupported_tga_file[]; + +// ---------------- Public Consts + +#define WUFFS_TGA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 + +// ---------------- Struct Declarations + +typedef struct wuffs_tga__decoder__struct wuffs_tga__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_tga__decoder__initialize( + wuffs_tga__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_tga__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_tga__decoder* +wuffs_tga__decoder__alloc(); + +static inline wuffs_base__image_decoder* +wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder() { + return (wuffs_base__image_decoder*)(wuffs_tga__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__image_decoder* +wuffs_tga__decoder__upcast_as__wuffs_base__image_decoder( + wuffs_tga__decoder* p) { + return (wuffs_base__image_decoder*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_tga__decoder__set_quirk_enabled( + wuffs_tga__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_tga__decoder__decode_image_config( + wuffs_tga__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_tga__decoder__decode_frame_config( + wuffs_tga__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_tga__decoder__decode_frame( + wuffs_tga__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_tga__decoder__frame_dirty_rect( + const wuffs_tga__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_tga__decoder__num_animation_loops( + const wuffs_tga__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_tga__decoder__num_decoded_frame_configs( + const wuffs_tga__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_tga__decoder__num_decoded_frames( + const wuffs_tga__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_tga__decoder__restart_frame( + wuffs_tga__decoder* self, + uint64_t a_index, + uint64_t a_io_position); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_tga__decoder__set_report_metadata( + wuffs_tga__decoder* self, + uint32_t a_fourcc, + bool a_report); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_tga__decoder__tell_me_more( + wuffs_tga__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_tga__decoder__workbuf_len( + const wuffs_tga__decoder* self); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_tga__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + + uint32_t f_width; + uint32_t f_height; + uint8_t f_call_sequence; + uint8_t f_header_id_length; + uint8_t f_header_color_map_type; + uint8_t f_header_image_type; + uint16_t f_header_color_map_first_entry_index; + uint16_t f_header_color_map_length; + uint8_t f_header_color_map_entry_size; + uint8_t f_header_pixel_depth; + uint8_t f_header_image_descriptor; + bool f_opaque; + uint32_t f_scratch_bytes_per_pixel; + uint32_t f_src_bytes_per_pixel; + uint32_t f_src_pixfmt; + uint64_t f_frame_config_io_position; + wuffs_base__pixel_swizzler f_swizzler; + + uint32_t p_decode_image_config[1]; + uint32_t p_do_decode_image_config[1]; + uint32_t p_decode_frame_config[1]; + uint32_t p_do_decode_frame_config[1]; + uint32_t p_decode_frame[1]; + uint32_t p_do_decode_frame[1]; + } private_impl; + + struct { + uint8_t f_dst_palette[1024]; + uint8_t f_src_palette[1024]; + uint8_t f_scratch[4]; + + struct { + uint32_t v_i; + uint64_t scratch; + } s_do_decode_image_config[1]; + struct { + uint64_t v_dst_bytes_per_pixel; + uint32_t v_dst_x; + uint32_t v_dst_y; + uint64_t v_mark; + uint32_t v_num_pixels32; + uint32_t v_lit_length; + uint32_t v_run_length; + uint64_t v_num_dst_bytes; + uint64_t scratch; + } s_do_decode_frame[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_tga__decoder__alloc(), &free); + } + + static inline wuffs_base__image_decoder::unique_ptr + alloc_as__wuffs_base__image_decoder() { + return wuffs_base__image_decoder::unique_ptr( + wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_tga__decoder__struct() = delete; + wuffs_tga__decoder__struct(const wuffs_tga__decoder__struct&) = delete; + wuffs_tga__decoder__struct& operator=( + const wuffs_tga__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_tga__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__image_decoder* + upcast_as__wuffs_base__image_decoder() { + return (wuffs_base__image_decoder*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_tga__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_tga__decoder__decode_image_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_tga__decoder__decode_frame_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame( + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + return wuffs_tga__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { + return wuffs_tga__decoder__frame_dirty_rect(this); + } + + inline uint32_t + num_animation_loops() const { + return wuffs_tga__decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { + return wuffs_tga__decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { + return wuffs_tga__decoder__num_decoded_frames(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { + return wuffs_tga__decoder__restart_frame(this, a_index, a_io_position); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { + return wuffs_tga__decoder__set_report_metadata(this, a_fourcc, a_report); + } + + inline wuffs_base__status + tell_me_more( + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + return wuffs_tga__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_tga__decoder__workbuf_len(this); + } + +#endif // __cplusplus +}; // struct wuffs_tga__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) + +// ---------------- Status Codes + +extern const char wuffs_wbmp__error__bad_header[]; +extern const char wuffs_wbmp__error__truncated_input[]; + +// ---------------- Public Consts + +#define WUFFS_WBMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 + +// ---------------- Struct Declarations + +typedef struct wuffs_wbmp__decoder__struct wuffs_wbmp__decoder; + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Public Initializer Prototypes + +// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, +// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". +// +// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. +// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_wbmp__decoder__initialize( + wuffs_wbmp__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + +size_t +sizeof__wuffs_wbmp__decoder(); + +// ---------------- Allocs + +// These functions allocate and initialize Wuffs structs. They return NULL if +// memory allocation fails. If they return non-NULL, there is no need to call +// wuffs_foo__bar__initialize, but the caller is responsible for eventually +// calling free on the returned pointer. That pointer is effectively a C++ +// std::unique_ptr. + +wuffs_wbmp__decoder* +wuffs_wbmp__decoder__alloc(); + +static inline wuffs_base__image_decoder* +wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder() { + return (wuffs_base__image_decoder*)(wuffs_wbmp__decoder__alloc()); +} + +// ---------------- Upcasts + +static inline wuffs_base__image_decoder* +wuffs_wbmp__decoder__upcast_as__wuffs_base__image_decoder( + wuffs_wbmp__decoder* p) { + return (wuffs_base__image_decoder*)p; +} + +// ---------------- Public Function Prototypes + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_wbmp__decoder__set_quirk_enabled( + wuffs_wbmp__decoder* self, + uint32_t a_quirk, + bool a_enabled); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_wbmp__decoder__decode_image_config( + wuffs_wbmp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_wbmp__decoder__decode_frame_config( + wuffs_wbmp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_wbmp__decoder__decode_frame( + wuffs_wbmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_wbmp__decoder__frame_dirty_rect( + const wuffs_wbmp__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_wbmp__decoder__num_animation_loops( + const wuffs_wbmp__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_wbmp__decoder__num_decoded_frame_configs( + const wuffs_wbmp__decoder* self); + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_wbmp__decoder__num_decoded_frames( + const wuffs_wbmp__decoder* self); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_wbmp__decoder__restart_frame( + wuffs_wbmp__decoder* self, + uint64_t a_index, + uint64_t a_io_position); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_wbmp__decoder__set_report_metadata( + wuffs_wbmp__decoder* self, + uint32_t a_fourcc, + bool a_report); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_wbmp__decoder__tell_me_more( + wuffs_wbmp__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_wbmp__decoder__workbuf_len( + const wuffs_wbmp__decoder* self); + +#ifdef __cplusplus +} // extern "C" +#endif + +// ---------------- Struct Definitions + +// These structs' fields, and the sizeof them, are private implementation +// details that aren't guaranteed to be stable across Wuffs versions. +// +// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +struct wuffs_wbmp__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. + // + // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct + // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + + struct { + uint32_t magic; + uint32_t active_coroutine; + wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + + uint32_t f_width; + uint32_t f_height; + uint8_t f_call_sequence; + uint64_t f_frame_config_io_position; + wuffs_base__pixel_swizzler f_swizzler; + + uint32_t p_decode_image_config[1]; + uint32_t p_do_decode_image_config[1]; + uint32_t p_decode_frame_config[1]; + uint32_t p_do_decode_frame_config[1]; + uint32_t p_decode_frame[1]; + uint32_t p_do_decode_frame[1]; + } private_impl; + + struct { + struct { + uint32_t v_i; + uint32_t v_x32; + } s_do_decode_image_config[1]; + struct { + uint64_t v_dst_bytes_per_pixel; + uint32_t v_dst_x; + uint32_t v_dst_y; + uint8_t v_src[1]; + uint8_t v_c; + } s_do_decode_frame[1]; + } private_data; + +#ifdef __cplusplus +#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { + return unique_ptr(wuffs_wbmp__decoder__alloc(), &free); + } + + static inline wuffs_base__image_decoder::unique_ptr + alloc_as__wuffs_base__image_decoder() { + return wuffs_base__image_decoder::unique_ptr( + wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder(), &free); + } +#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + // Disallow constructing or copying an object via standard C++ mechanisms, + // e.g. the "new" operator, as this struct is intentionally opaque. Its total + // size and field layout is not part of the public, stable, memory-safe API. + // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and + // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as + // their first argument) rather than tweaking bar.private_impl.qux fields. + // + // In C, we can just leave wuffs_foo__bar as an incomplete type (unless + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". + wuffs_wbmp__decoder__struct() = delete; + wuffs_wbmp__decoder__struct(const wuffs_wbmp__decoder__struct&) = delete; + wuffs_wbmp__decoder__struct& operator=( + const wuffs_wbmp__decoder__struct&) = delete; +#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +#if !defined(WUFFS_IMPLEMENTATION) + // As above, the size of the struct is not part of the public API, and unless + // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap + // allocated, not stack allocated. Its size is not intended to be known at + // compile time, but it is unfortunately divulged as a side effect of + // defining C++ convenience methods. Use "sizeof__T()", calling the function, + // instead of "sizeof T", invoking the operator. To make the two values + // different, so that passing the latter will be rejected by the initialize + // function, we add an arbitrary amount of dead weight. + uint8_t dead_weight[123000000]; // 123 MB. +#endif // !defined(WUFFS_IMPLEMENTATION) + + inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT + initialize( + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { + return wuffs_wbmp__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + + inline wuffs_base__image_decoder* + upcast_as__wuffs_base__image_decoder() { + return (wuffs_base__image_decoder*)this; + } + + inline wuffs_base__empty_struct + set_quirk_enabled( + uint32_t a_quirk, + bool a_enabled) { + return wuffs_wbmp__decoder__set_quirk_enabled(this, a_quirk, a_enabled); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_wbmp__decoder__decode_image_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + return wuffs_wbmp__decoder__decode_frame_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame( + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + return wuffs_wbmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { + return wuffs_wbmp__decoder__frame_dirty_rect(this); + } + + inline uint32_t + num_animation_loops() const { + return wuffs_wbmp__decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { + return wuffs_wbmp__decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { + return wuffs_wbmp__decoder__num_decoded_frames(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { + return wuffs_wbmp__decoder__restart_frame(this, a_index, a_io_position); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { + return wuffs_wbmp__decoder__set_report_metadata(this, a_fourcc, a_report); + } + + inline wuffs_base__status + tell_me_more( + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + return wuffs_wbmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_wbmp__decoder__workbuf_len(this); + } + +#endif // __cplusplus +}; // struct wuffs_wbmp__decoder__struct + +#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) + +#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +// ---------------- Auxiliary - Base + +// Auxiliary code is discussed at +// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md + +#include + +#include + +namespace wuffs_aux { + +using IOBuffer = wuffs_base__io_buffer; + +// MemOwner represents ownership of some memory. Dynamically allocated memory +// (e.g. from malloc or new) is typically paired with free or delete, invoked +// when the std::unique_ptr is destroyed. Statically allocated memory might use +// MemOwner(nullptr, &free), even if that statically allocated memory is not +// nullptr, since calling free(nullptr) is a no-op. +using MemOwner = std::unique_ptr; + +namespace sync_io { + +// -------- + +// DynIOBuffer is an IOBuffer that is backed by a dynamically sized byte array. +// It owns that backing array and will free it in its destructor. +// +// The array size can be explicitly extended (by calling the grow method) but, +// unlike a C++ std::vector, there is no implicit extension (e.g. by calling +// std::vector::insert) and its maximum size is capped by the max_incl +// constructor argument. +// +// It contains an IOBuffer-typed field whose reader side provides access to +// previously written bytes and whose writer side provides access to the +// allocated but not-yet-written-to slack space. For Go programmers, this slack +// space is roughly analogous to the s[len(s):cap(s)] space of a slice s. +class DynIOBuffer { + public: + enum GrowResult { + OK = 0, + FailedMaxInclExceeded = 1, + FailedOutOfMemory = 2, + }; + + // m_buf holds the dynamically sized byte array and its read/write indexes: + // - m_buf.meta.wi is roughly analogous to a Go slice's length. + // - m_buf.data.len is roughly analogous to a Go slice's capacity. It is + // also equal to the m_buf.data.ptr malloc/realloc size. + // + // Users should not modify the m_buf.data.ptr or m_buf.data.len fields (as + // they are conceptually private to this class), but they can modify the + // bytes referenced by that pointer-length pair (e.g. compactions). + IOBuffer m_buf; + + // m_max_incl is an inclusive upper bound on the backing array size. + const uint64_t m_max_incl; + + // Constructor and destructor. + explicit DynIOBuffer(uint64_t max_incl); + ~DynIOBuffer(); + + // Drop frees the byte array and resets m_buf. The DynIOBuffer can still be + // used after a drop call. It just restarts from zero. + void drop(); + + // grow ensures that the byte array size is at least min_incl and at most + // max_incl. It returns FailedMaxInclExceeded if that would require + // allocating more than max_incl bytes, including the case where (min_incl > + // max_incl). It returns FailedOutOfMemory if memory allocation failed. + GrowResult grow(uint64_t min_incl); + + private: + // Delete the copy and assign constructors. + DynIOBuffer(const DynIOBuffer&) = delete; + DynIOBuffer& operator=(const DynIOBuffer&) = delete; + + static uint64_t round_up(uint64_t min_incl, uint64_t max_incl); +}; + +// -------- + +class Input { + public: + virtual ~Input(); + + virtual IOBuffer* BringsItsOwnIOBuffer(); + virtual std::string CopyIn(IOBuffer* dst) = 0; +}; + +// -------- + +// FileInput is an Input that reads from a file source. +// +// It does not take responsibility for closing the file when done. +class FileInput : public Input { + public: + FileInput(FILE* f); + + virtual std::string CopyIn(IOBuffer* dst); + + private: + FILE* m_f; + + // Delete the copy and assign constructors. + FileInput(const FileInput&) = delete; + FileInput& operator=(const FileInput&) = delete; +}; + +// -------- + +// MemoryInput is an Input that reads from an in-memory source. +// +// It does not take responsibility for freeing the memory when done. +class MemoryInput : public Input { + public: + MemoryInput(const char* ptr, size_t len); + MemoryInput(const uint8_t* ptr, size_t len); + + virtual IOBuffer* BringsItsOwnIOBuffer(); + virtual std::string CopyIn(IOBuffer* dst); + + private: + IOBuffer m_io; + + // Delete the copy and assign constructors. + MemoryInput(const MemoryInput&) = delete; + MemoryInput& operator=(const MemoryInput&) = delete; +}; + +// -------- + +} // namespace sync_io + +} // namespace wuffs_aux + +// ---------------- Auxiliary - CBOR + +namespace wuffs_aux { + +struct DecodeCborResult { + DecodeCborResult(std::string&& error_message0, uint64_t cursor_position0); + + std::string error_message; + uint64_t cursor_position; +}; + +class DecodeCborCallbacks { + public: + virtual ~DecodeCborCallbacks(); + + // AppendXxx are called for leaf nodes: literals, numbers, strings, etc. + + virtual std::string AppendNull() = 0; + virtual std::string AppendUndefined() = 0; + virtual std::string AppendBool(bool val) = 0; + virtual std::string AppendF64(double val) = 0; + virtual std::string AppendI64(int64_t val) = 0; + virtual std::string AppendU64(uint64_t val) = 0; + virtual std::string AppendByteString(std::string&& val) = 0; + virtual std::string AppendTextString(std::string&& val) = 0; + virtual std::string AppendMinus1MinusX(uint64_t val) = 0; + virtual std::string AppendCborSimpleValue(uint8_t val) = 0; + virtual std::string AppendCborTag(uint64_t val) = 0; + + // Push and Pop are called for container nodes: CBOR arrays (lists) and CBOR + // maps (dictionaries). + // + // The flags bits combine exactly one of: + // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE + // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST + // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT + // and exactly one of: + // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE + // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST + // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT + + virtual std::string Push(uint32_t flags) = 0; + virtual std::string Pop(uint32_t flags) = 0; + + // Done is always the last Callback method called by DecodeCbor, whether or + // not parsing the input as CBOR encountered an error. Even when successful, + // trailing data may remain in input and buffer. + // + // Do not keep a reference to buffer or buffer.data.ptr after Done returns, + // as DecodeCbor may then de-allocate the backing array. + // + // The default Done implementation is a no-op. + virtual void // + Done(DecodeCborResult& result, sync_io::Input& input, IOBuffer& buffer); +}; + +// The FooArgBar types add structure to Foo's optional arguments. They wrap +// inner representations for several reasons: +// - It provides a home for the DefaultValue static method, for Foo callers +// that want to override some but not all optional arguments. +// - It provides the "Bar" name at Foo call sites, which can help self- +// document Foo calls with many arguemnts. +// - It provides some type safety against accidentally transposing or omitting +// adjacent fundamentally-numeric-typed optional arguments. + +// DecodeCborArgQuirks wraps an optional argument to DecodeCbor. +struct DecodeCborArgQuirks { + explicit DecodeCborArgQuirks(wuffs_base__slice_u32 repr0); + explicit DecodeCborArgQuirks(uint32_t* ptr, size_t len); + + // DefaultValue returns an empty slice. + static DecodeCborArgQuirks DefaultValue(); + + wuffs_base__slice_u32 repr; +}; + +// DecodeCbor calls callbacks based on the CBOR-formatted data in input. +// +// On success, the returned error_message is empty and cursor_position counts +// the number of bytes consumed. On failure, error_message is non-empty and +// cursor_position is the location of the error. That error may be a content +// error (invalid CBOR) or an input error (e.g. network failure). +DecodeCborResult // +DecodeCbor(DecodeCborCallbacks& callbacks, + sync_io::Input& input, + DecodeCborArgQuirks quirks = DecodeCborArgQuirks::DefaultValue()); + +} // namespace wuffs_aux + +// ---------------- Auxiliary - Image + +namespace wuffs_aux { + +struct DecodeImageResult { + DecodeImageResult(MemOwner&& pixbuf_mem_owner0, + wuffs_base__pixel_buffer pixbuf0, + std::string&& error_message0); + DecodeImageResult(std::string&& error_message0); + + MemOwner pixbuf_mem_owner; + wuffs_base__pixel_buffer pixbuf; + std::string error_message; +}; + +// DecodeImageCallbacks are the callbacks given to DecodeImage. They are always +// called in this order: +// 1. SelectDecoder +// 2. HandleMetadata +// 3. SelectPixfmt +// 4. AllocPixbuf +// 5. AllocWorkbuf +// 6. Done +// +// It may return early - the third callback might not be invoked if the second +// one fails - but the final callback (Done) is always invoked. +class DecodeImageCallbacks { + public: + // AllocPixbufResult holds a memory allocation (the result of malloc or new, + // a statically allocated pointer, etc), or an error message. The memory is + // de-allocated when mem_owner goes out of scope and is destroyed. + struct AllocPixbufResult { + AllocPixbufResult(MemOwner&& mem_owner0, wuffs_base__pixel_buffer pixbuf0); + AllocPixbufResult(std::string&& error_message0); + + MemOwner mem_owner; + wuffs_base__pixel_buffer pixbuf; + std::string error_message; + }; + + // AllocWorkbufResult holds a memory allocation (the result of malloc or new, + // a statically allocated pointer, etc), or an error message. The memory is + // de-allocated when mem_owner goes out of scope and is destroyed. + struct AllocWorkbufResult { + AllocWorkbufResult(MemOwner&& mem_owner0, wuffs_base__slice_u8 workbuf0); + AllocWorkbufResult(std::string&& error_message0); + + MemOwner mem_owner; + wuffs_base__slice_u8 workbuf; + std::string error_message; + }; + + virtual ~DecodeImageCallbacks(); + + // SelectDecoder returns the image decoder for the input data's file format. + // Returning a nullptr means failure (DecodeImage_UnsupportedImageFormat). + // + // Common formats will have a FourCC value in the range [1 ..= 0x7FFF_FFFF], + // such as WUFFS_BASE__FOURCC__JPEG. A zero FourCC value means that Wuffs' + // standard library did not recognize the image format but if SelectDecoder + // was overridden, it may examine the input data's starting bytes and still + // provide its own image decoder, e.g. for an exotic image file format that's + // not in Wuffs' standard library. The prefix_etc fields have the same + // meaning as wuffs_base__magic_number_guess_fourcc arguments. SelectDecoder + // implementations should not modify prefix_data's contents. + // + // SelectDecoder might be called more than once, since some image file + // formats can wrap others. For example, a nominal BMP file can actually + // contain a JPEG or a PNG. + // + // The default SelectDecoder accepts the FOURCC codes listed below. For + // modular builds (i.e. when #define'ing WUFFS_CONFIG__MODULES), acceptance + // of the ETC file format is optional (for each value of ETC) and depends on + // the corresponding module to be enabled at compile time (i.e. #define'ing + // WUFFS_CONFIG__MODULE__ETC). + // - WUFFS_BASE__FOURCC__BMP + // - WUFFS_BASE__FOURCC__GIF + // - WUFFS_BASE__FOURCC__NIE + // - WUFFS_BASE__FOURCC__PNG + // - WUFFS_BASE__FOURCC__TGA + // - WUFFS_BASE__FOURCC__WBMP + virtual wuffs_base__image_decoder::unique_ptr // + SelectDecoder(uint32_t fourcc, + wuffs_base__slice_u8 prefix_data, + bool prefix_closed); + + // HandleMetadata acknowledges image metadata. minfo.flavor will be one of: + // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH + // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED + // If it is ETC__METADATA_RAW_ETC then raw contains the metadata bytes. Those + // bytes should not be retained beyond the the HandleMetadata call. + // + // minfo.metadata__fourcc() will typically match one of the + // DecodeImageArgFlags bits. For example, if (REPORT_METADATA_CHRM | + // REPORT_METADATA_GAMA) was passed to DecodeImage then the metadata FourCC + // will be either WUFFS_BASE__FOURCC__CHRM or WUFFS_BASE__FOURCC__GAMA. + // + // It returns an error message, or an empty string on success. + virtual std::string // + HandleMetadata(const wuffs_base__more_information& minfo, + wuffs_base__slice_u8 raw); + + // SelectPixfmt returns the destination pixel format for AllocPixbuf. It + // should return wuffs_base__make_pixel_format(etc) called with one of: + // - WUFFS_BASE__PIXEL_FORMAT__BGR_565 + // - WUFFS_BASE__PIXEL_FORMAT__BGR + // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL + // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE + // - WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL + // - WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL + // - WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL + // or return image_config.pixcfg.pixel_format(). The latter means to use the + // image file's natural pixel format. For example, GIF images' natural pixel + // format is an indexed one. + // + // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat). + // + // The default SelectPixfmt implementation returns + // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which + // is 4 bytes per pixel (8 bits per channel × 4 channels). + virtual wuffs_base__pixel_format // + SelectPixfmt(const wuffs_base__image_config& image_config); + + // AllocPixbuf allocates the pixel buffer. + // + // allow_uninitialized_memory will be true if a valid background_color was + // passed to DecodeImage, since the pixel buffer's contents will be + // overwritten with that color after AllocPixbuf returns. + // + // The default AllocPixbuf implementation allocates either uninitialized or + // zeroed memory. Zeroed memory typically corresponds to filling with opaque + // black or transparent black, depending on the pixel format. + virtual AllocPixbufResult // + AllocPixbuf(const wuffs_base__image_config& image_config, + bool allow_uninitialized_memory); + + // AllocWorkbuf allocates the work buffer. The allocated buffer's length + // should be at least len_range.min_incl, but larger allocations (up to + // len_range.max_incl) may have better performance (by using more memory). + // + // The default AllocWorkbuf implementation allocates len_range.max_incl bytes + // of either uninitialized or zeroed memory. + virtual AllocWorkbufResult // + AllocWorkbuf(wuffs_base__range_ii_u64 len_range, + bool allow_uninitialized_memory); + + // Done is always the last Callback method called by DecodeImage, whether or + // not parsing the input encountered an error. Even when successful, trailing + // data may remain in input and buffer. + // + // The image_decoder is the one returned by SelectDecoder (if SelectDecoder + // was successful), or a no-op unique_ptr otherwise. Like any unique_ptr, + // ownership moves to the Done implementation. + // + // Do not keep a reference to buffer or buffer.data.ptr after Done returns, + // as DecodeImage may then de-allocate the backing array. + // + // The default Done implementation is a no-op, other than running the + // image_decoder unique_ptr destructor. + virtual void // + Done(DecodeImageResult& result, + sync_io::Input& input, + IOBuffer& buffer, + wuffs_base__image_decoder::unique_ptr image_decoder); +}; + +extern const char DecodeImage_BufferIsTooShort[]; +extern const char DecodeImage_MaxInclDimensionExceeded[]; +extern const char DecodeImage_MaxInclMetadataLengthExceeded[]; +extern const char DecodeImage_OutOfMemory[]; +extern const char DecodeImage_UnexpectedEndOfFile[]; +extern const char DecodeImage_UnsupportedImageFormat[]; +extern const char DecodeImage_UnsupportedMetadata[]; +extern const char DecodeImage_UnsupportedPixelBlend[]; +extern const char DecodeImage_UnsupportedPixelConfiguration[]; +extern const char DecodeImage_UnsupportedPixelFormat[]; + +// The FooArgBar types add structure to Foo's optional arguments. They wrap +// inner representations for several reasons: +// - It provides a home for the DefaultValue static method, for Foo callers +// that want to override some but not all optional arguments. +// - It provides the "Bar" name at Foo call sites, which can help self- +// document Foo calls with many arguemnts. +// - It provides some type safety against accidentally transposing or omitting +// adjacent fundamentally-numeric-typed optional arguments. + +// DecodeImageArgQuirks wraps an optional argument to DecodeImage. +struct DecodeImageArgQuirks { + explicit DecodeImageArgQuirks(wuffs_base__slice_u32 repr0); + explicit DecodeImageArgQuirks(uint32_t* ptr, size_t len); + + // DefaultValue returns an empty slice. + static DecodeImageArgQuirks DefaultValue(); + + wuffs_base__slice_u32 repr; +}; + +// DecodeImageArgFlags wraps an optional argument to DecodeImage. +struct DecodeImageArgFlags { + explicit DecodeImageArgFlags(uint64_t repr0); + + // DefaultValue returns 0. + static DecodeImageArgFlags DefaultValue(); + + // TODO: support all of the REPORT_METADATA_ETC flags, not just CHRM, EXIF, + // GAMA, ICCP, KVP, SRGB and XMP. + + // Background Color. + static constexpr uint64_t REPORT_METADATA_BGCL = 0x0001; + // Primary Chromaticities and White Point. + static constexpr uint64_t REPORT_METADATA_CHRM = 0x0002; + // Exchangeable Image File Format. + static constexpr uint64_t REPORT_METADATA_EXIF = 0x0004; + // Gamma Correction. + static constexpr uint64_t REPORT_METADATA_GAMA = 0x0008; + // International Color Consortium Profile. + static constexpr uint64_t REPORT_METADATA_ICCP = 0x0010; + // Key-Value Pair. + // + // For PNG files, this includes iTXt, tEXt and zTXt chunks. In the + // HandleMetadata callback, the raw argument contains UTF-8 strings. + static constexpr uint64_t REPORT_METADATA_KVP = 0x0020; + // Modification Time. + static constexpr uint64_t REPORT_METADATA_MTIM = 0x0040; + // Offset (2-Dimensional). + static constexpr uint64_t REPORT_METADATA_OFS2 = 0x0080; + // Physical Dimensions. + static constexpr uint64_t REPORT_METADATA_PHYD = 0x0100; + // Standard Red Green Blue (Rendering Intent). + static constexpr uint64_t REPORT_METADATA_SRGB = 0x0200; + // Extensible Metadata Platform. + static constexpr uint64_t REPORT_METADATA_XMP = 0x0400; + + uint64_t repr; +}; + +// DecodeImageArgPixelBlend wraps an optional argument to DecodeImage. +struct DecodeImageArgPixelBlend { + explicit DecodeImageArgPixelBlend(wuffs_base__pixel_blend repr0); + + // DefaultValue returns WUFFS_BASE__PIXEL_BLEND__SRC. + static DecodeImageArgPixelBlend DefaultValue(); + + wuffs_base__pixel_blend repr; +}; + +// DecodeImageArgBackgroundColor wraps an optional argument to DecodeImage. +struct DecodeImageArgBackgroundColor { + explicit DecodeImageArgBackgroundColor( + wuffs_base__color_u32_argb_premul repr0); + + // DefaultValue returns 1, an invalid wuffs_base__color_u32_argb_premul. + static DecodeImageArgBackgroundColor DefaultValue(); + + wuffs_base__color_u32_argb_premul repr; +}; + +// DecodeImageArgMaxInclDimension wraps an optional argument to DecodeImage. +struct DecodeImageArgMaxInclDimension { + explicit DecodeImageArgMaxInclDimension(uint32_t repr0); + + // DefaultValue returns 1048575 = 0x000F_FFFF, more than 1 million pixels. + static DecodeImageArgMaxInclDimension DefaultValue(); + + uint32_t repr; +}; + +// DecodeImageArgMaxInclMetadataLength wraps an optional argument to +// DecodeImage. +struct DecodeImageArgMaxInclMetadataLength { + explicit DecodeImageArgMaxInclMetadataLength(uint64_t repr0); + + // DefaultValue returns 16777215 = 0x00FF_FFFF, one less than 16 MiB. + static DecodeImageArgMaxInclMetadataLength DefaultValue(); + + uint64_t repr; +}; + +// DecodeImage decodes the image data in input. A variety of image file formats +// can be decoded, depending on what callbacks.SelectDecoder returns. +// +// For animated formats, only the first frame is returned, since the API is +// simpler for synchronous I/O and having DecodeImage only return when +// completely done, but rendering animation often involves handling other +// events in between animation frames. To decode multiple frames of animated +// images, or for asynchronous I/O (e.g. when decoding an image streamed over +// the network), use Wuffs' lower level C API instead of its higher level, +// simplified C++ API (the wuffs_aux API). +// +// The DecodeImageResult's fields depend on whether decoding succeeded: +// - On total success, the error_message is empty and pixbuf.pixcfg.is_valid() +// is true. +// - On partial success (e.g. the input file was truncated but we are still +// able to decode some of the pixels), error_message is non-empty but +// pixbuf.pixcfg.is_valid() is still true. It is up to the caller whether to +// accept or reject partial success. +// - On failure, the error_message is non_empty and pixbuf.pixcfg.is_valid() +// is false. +// +// The callbacks allocate the pixel buffer memory and work buffer memory. On +// success, pixel buffer memory ownership is passed to the DecodeImage caller +// as the returned pixbuf_mem_owner. Regardless of success or failure, the work +// buffer memory is deleted. +// +// The pixel_blend (one of the constants listed below) determines how to +// composite the decoded image over the pixel buffer's original pixels (as +// returned by callbacks.AllocPixbuf): +// - WUFFS_BASE__PIXEL_BLEND__SRC +// - WUFFS_BASE__PIXEL_BLEND__SRC_OVER +// +// The background_color is used to fill the pixel buffer after +// callbacks.AllocPixbuf returns, if it is valid in the +// wuffs_base__color_u32_argb_premul__is_valid sense. The default value, +// 0x0000_0001, is not valid since its Blue channel value (0x01) is greater +// than its Alpha channel value (0x00). A valid background_color will typically +// be overwritten when pixel_blend is WUFFS_BASE__PIXEL_BLEND__SRC, but might +// still be visible on partial (not total) success or when pixel_blend is +// WUFFS_BASE__PIXEL_BLEND__SRC_OVER and the decoded image is not fully opaque. +// +// Decoding fails (with DecodeImage_MaxInclDimensionExceeded) if the image's +// width or height is greater than max_incl_dimension or if any opted-in (via +// flags bits) metadata is longer than max_incl_metadata_length. +DecodeImageResult // +DecodeImage(DecodeImageCallbacks& callbacks, + sync_io::Input& input, + DecodeImageArgQuirks quirks = DecodeImageArgQuirks::DefaultValue(), + DecodeImageArgFlags flags = DecodeImageArgFlags::DefaultValue(), + DecodeImageArgPixelBlend pixel_blend = + DecodeImageArgPixelBlend::DefaultValue(), + DecodeImageArgBackgroundColor background_color = + DecodeImageArgBackgroundColor::DefaultValue(), + DecodeImageArgMaxInclDimension max_incl_dimension = + DecodeImageArgMaxInclDimension::DefaultValue(), + DecodeImageArgMaxInclMetadataLength max_incl_metadata_length = + DecodeImageArgMaxInclMetadataLength::DefaultValue()); + +} // namespace wuffs_aux + +// ---------------- Auxiliary - JSON + +namespace wuffs_aux { + +struct DecodeJsonResult { + DecodeJsonResult(std::string&& error_message0, uint64_t cursor_position0); + + std::string error_message; + uint64_t cursor_position; +}; + +class DecodeJsonCallbacks { + public: + virtual ~DecodeJsonCallbacks(); + + // AppendXxx are called for leaf nodes: literals, numbers and strings. For + // strings, the Callbacks implementation is responsible for tracking map keys + // versus other values. + + virtual std::string AppendNull() = 0; + virtual std::string AppendBool(bool val) = 0; + virtual std::string AppendF64(double val) = 0; + virtual std::string AppendI64(int64_t val) = 0; + virtual std::string AppendTextString(std::string&& val) = 0; + + // Push and Pop are called for container nodes: JSON arrays (lists) and JSON + // objects (dictionaries). + // + // The flags bits combine exactly one of: + // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE + // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST + // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT + // and exactly one of: + // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE + // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST + // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT + + virtual std::string Push(uint32_t flags) = 0; + virtual std::string Pop(uint32_t flags) = 0; + + // Done is always the last Callback method called by DecodeJson, whether or + // not parsing the input as JSON encountered an error. Even when successful, + // trailing data may remain in input and buffer. See "Unintuitive JSON + // Parsing" (https://nullprogram.com/blog/2019/12/28/) which discusses JSON + // parsing and when it stops. + // + // Do not keep a reference to buffer or buffer.data.ptr after Done returns, + // as DecodeJson may then de-allocate the backing array. + // + // The default Done implementation is a no-op. + virtual void // + Done(DecodeJsonResult& result, sync_io::Input& input, IOBuffer& buffer); +}; + +extern const char DecodeJson_BadJsonPointer[]; +extern const char DecodeJson_NoMatch[]; + +// The FooArgBar types add structure to Foo's optional arguments. They wrap +// inner representations for several reasons: +// - It provides a home for the DefaultValue static method, for Foo callers +// that want to override some but not all optional arguments. +// - It provides the "Bar" name at Foo call sites, which can help self- +// document Foo calls with many arguemnts. +// - It provides some type safety against accidentally transposing or omitting +// adjacent fundamentally-numeric-typed optional arguments. + +// DecodeJsonArgQuirks wraps an optional argument to DecodeJson. +struct DecodeJsonArgQuirks { + explicit DecodeJsonArgQuirks(wuffs_base__slice_u32 repr0); + explicit DecodeJsonArgQuirks(uint32_t* ptr, size_t len); + + // DefaultValue returns an empty slice. + static DecodeJsonArgQuirks DefaultValue(); + + wuffs_base__slice_u32 repr; +}; + +// DecodeJsonArgJsonPointer wraps an optional argument to DecodeJson. +struct DecodeJsonArgJsonPointer { + explicit DecodeJsonArgJsonPointer(std::string repr0); + + // DefaultValue returns an empty string. + static DecodeJsonArgJsonPointer DefaultValue(); + + std::string repr; +}; + +// DecodeJson calls callbacks based on the JSON-formatted data in input. +// +// On success, the returned error_message is empty and cursor_position counts +// the number of bytes consumed. On failure, error_message is non-empty and +// cursor_position is the location of the error. That error may be a content +// error (invalid JSON) or an input error (e.g. network failure). +// +// json_pointer is a query in the JSON Pointer (RFC 6901) syntax. The callbacks +// run for the input's sub-node that matches the query. DecodeJson_NoMatch is +// returned if no matching sub-node was found. The empty query matches the +// input's root node, consistent with JSON Pointer semantics. +// +// The JSON Pointer implementation is greedy: duplicate keys are not rejected +// but only the first match for each '/'-separated fragment is followed. +DecodeJsonResult // +DecodeJson(DecodeJsonCallbacks& callbacks, + sync_io::Input& input, + DecodeJsonArgQuirks quirks = DecodeJsonArgQuirks::DefaultValue(), + DecodeJsonArgJsonPointer json_pointer = + DecodeJsonArgJsonPointer::DefaultValue()); + +} // namespace wuffs_aux + +#endif // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +// ‼ WUFFS C HEADER ENDS HERE. +#ifdef WUFFS_IMPLEMENTATION + +#ifdef __cplusplus +extern "C" { +#endif + +// ---------------- Fundamentals + +// WUFFS_BASE__MAGIC is a magic number to check that initializers are called. +// It's not foolproof, given C doesn't automatically zero memory before use, +// but it should catch 99.99% of cases. +// +// Its (non-zero) value is arbitrary, based on md5sum("wuffs"). +#define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71) + +// WUFFS_BASE__DISABLED is a magic number to indicate that a non-recoverable +// error was previously encountered. +// +// Its (non-zero) value is arbitrary, based on md5sum("disabled"). +#define WUFFS_BASE__DISABLED ((uint32_t)0x075AE3D2) + +// Use switch cases for coroutine suspension points, similar to the technique +// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html +// +// The implicit fallthrough is intentional. +// +// We use trivial macros instead of an explicit assignment and case statement +// so that clang-format doesn't get confused by the unusual "case"s. +#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:; +#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \ + coro_susp_point = n; \ + case n:; + +#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \ + if (!status.repr) { \ + goto ok; \ + } else if (*status.repr != '$') { \ + goto exit; \ + } \ + coro_susp_point = n; \ + goto suspend; \ + case n:; + +// The "defined(__clang__)" isn't redundant. While vanilla clang defines +// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. +#if defined(__GNUC__) || defined(__clang__) +#define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1)) +#define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0)) +#else +#define WUFFS_BASE__LIKELY(expr) (expr) +#define WUFFS_BASE__UNLIKELY(expr) (expr) +#endif + +// -------- + +static inline wuffs_base__empty_struct // +wuffs_base__ignore_status(wuffs_base__status z) { + return wuffs_base__make_empty_struct(); +} + +static inline wuffs_base__status // +wuffs_base__status__ensure_not_a_suspension(wuffs_base__status z) { + if (z.repr && (*z.repr == '$')) { + z.repr = wuffs_base__error__cannot_return_a_suspension; + } + return z; +} + +// -------- + +// wuffs_base__iterate_total_advance returns the exclusive pointer-offset at +// which iteration should stop. The overall slice has length total_len, each +// iteration's sub-slice has length iter_len and are placed iter_advance apart. +// +// The iter_advance may not be larger than iter_len. The iter_advance may be +// smaller than iter_len, in which case the sub-slices will overlap. +// +// The return value r satisfies ((0 <= r) && (r <= total_len)). +// +// For example, if total_len = 15, iter_len = 5 and iter_advance = 3, there are +// four iterations at offsets 0, 3, 6 and 9. This function returns 12. +// +// 0123456789012345 +// [....] +// [....] +// [....] +// [....] +// $ +// 0123456789012345 +// +// For example, if total_len = 15, iter_len = 5 and iter_advance = 5, there are +// three iterations at offsets 0, 5 and 10. This function returns 15. +// +// 0123456789012345 +// [....] +// [....] +// [....] +// $ +// 0123456789012345 +static inline size_t // +wuffs_base__iterate_total_advance(size_t total_len, + size_t iter_len, + size_t iter_advance) { + if (total_len >= iter_len) { + size_t n = total_len - iter_len; + return ((n / iter_advance) * iter_advance) + iter_advance; + } + return 0; +} + +// ---------------- Numeric Types + +extern const uint8_t wuffs_base__low_bits_mask__u8[8]; +extern const uint16_t wuffs_base__low_bits_mask__u16[16]; +extern const uint32_t wuffs_base__low_bits_mask__u32[32]; +extern const uint64_t wuffs_base__low_bits_mask__u64[64]; + +#define WUFFS_BASE__LOW_BITS_MASK__U8(n) (wuffs_base__low_bits_mask__u8[n]) +#define WUFFS_BASE__LOW_BITS_MASK__U16(n) (wuffs_base__low_bits_mask__u16[n]) +#define WUFFS_BASE__LOW_BITS_MASK__U32(n) (wuffs_base__low_bits_mask__u32[n]) +#define WUFFS_BASE__LOW_BITS_MASK__U64(n) (wuffs_base__low_bits_mask__u64[n]) + +// -------- + +static inline void // +wuffs_base__u8__sat_add_indirect(uint8_t* x, uint8_t y) { + *x = wuffs_base__u8__sat_add(*x, y); +} + +static inline void // +wuffs_base__u8__sat_sub_indirect(uint8_t* x, uint8_t y) { + *x = wuffs_base__u8__sat_sub(*x, y); +} + +static inline void // +wuffs_base__u16__sat_add_indirect(uint16_t* x, uint16_t y) { + *x = wuffs_base__u16__sat_add(*x, y); +} + +static inline void // +wuffs_base__u16__sat_sub_indirect(uint16_t* x, uint16_t y) { + *x = wuffs_base__u16__sat_sub(*x, y); +} + +static inline void // +wuffs_base__u32__sat_add_indirect(uint32_t* x, uint32_t y) { + *x = wuffs_base__u32__sat_add(*x, y); +} + +static inline void // +wuffs_base__u32__sat_sub_indirect(uint32_t* x, uint32_t y) { + *x = wuffs_base__u32__sat_sub(*x, y); +} + +static inline void // +wuffs_base__u64__sat_add_indirect(uint64_t* x, uint64_t y) { + *x = wuffs_base__u64__sat_add(*x, y); +} + +static inline void // +wuffs_base__u64__sat_sub_indirect(uint64_t* x, uint64_t y) { + *x = wuffs_base__u64__sat_sub(*x, y); +} + +// ---------------- Slices and Tables + +// wuffs_base__slice_u8__prefix returns up to the first up_to bytes of s. +static inline wuffs_base__slice_u8 // +wuffs_base__slice_u8__prefix(wuffs_base__slice_u8 s, uint64_t up_to) { + if (((uint64_t)(s.len)) > up_to) { + s.len = ((size_t)up_to); + } + return s; +} + +// wuffs_base__slice_u8__suffix returns up to the last up_to bytes of s. +static inline wuffs_base__slice_u8 // +wuffs_base__slice_u8__suffix(wuffs_base__slice_u8 s, uint64_t up_to) { + if (((uint64_t)(s.len)) > up_to) { + s.ptr += ((uint64_t)(s.len)) - up_to; + s.len = ((size_t)up_to); + } + return s; +} + +// wuffs_base__slice_u8__copy_from_slice calls memmove(dst.ptr, src.ptr, len) +// where len is the minimum of dst.len and src.len. +// +// Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty +// slice) is valid and results in a no-op. +static inline uint64_t // +wuffs_base__slice_u8__copy_from_slice(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src) { + size_t len = dst.len < src.len ? dst.len : src.len; + if (len > 0) { + memmove(dst.ptr, src.ptr, len); + } + return len; +} + +// -------- + +static inline wuffs_base__slice_u8 // +wuffs_base__table_u8__row_u32(wuffs_base__table_u8 t, uint32_t y) { + if (y < t.height) { + return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width); + } + return wuffs_base__make_slice_u8(NULL, 0); +} + +// ---------------- Slices and Tables (Utility) + +#define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8 + +// ---------------- Ranges and Rects + +static inline uint32_t // +wuffs_base__range_ii_u32__get_min_incl(const wuffs_base__range_ii_u32* r) { + return r->min_incl; +} + +static inline uint32_t // +wuffs_base__range_ii_u32__get_max_incl(const wuffs_base__range_ii_u32* r) { + return r->max_incl; +} + +static inline uint32_t // +wuffs_base__range_ie_u32__get_min_incl(const wuffs_base__range_ie_u32* r) { + return r->min_incl; +} + +static inline uint32_t // +wuffs_base__range_ie_u32__get_max_excl(const wuffs_base__range_ie_u32* r) { + return r->max_excl; +} + +static inline uint64_t // +wuffs_base__range_ii_u64__get_min_incl(const wuffs_base__range_ii_u64* r) { + return r->min_incl; +} + +static inline uint64_t // +wuffs_base__range_ii_u64__get_max_incl(const wuffs_base__range_ii_u64* r) { + return r->max_incl; +} + +static inline uint64_t // +wuffs_base__range_ie_u64__get_min_incl(const wuffs_base__range_ie_u64* r) { + return r->min_incl; +} + +static inline uint64_t // +wuffs_base__range_ie_u64__get_max_excl(const wuffs_base__range_ie_u64* r) { + return r->max_excl; +} + +// ---------------- Ranges and Rects (Utility) + +#define wuffs_base__utility__empty_range_ii_u32 wuffs_base__empty_range_ii_u32 +#define wuffs_base__utility__empty_range_ie_u32 wuffs_base__empty_range_ie_u32 +#define wuffs_base__utility__empty_range_ii_u64 wuffs_base__empty_range_ii_u64 +#define wuffs_base__utility__empty_range_ie_u64 wuffs_base__empty_range_ie_u64 +#define wuffs_base__utility__empty_rect_ii_u32 wuffs_base__empty_rect_ii_u32 +#define wuffs_base__utility__empty_rect_ie_u32 wuffs_base__empty_rect_ie_u32 +#define wuffs_base__utility__make_range_ii_u32 wuffs_base__make_range_ii_u32 +#define wuffs_base__utility__make_range_ie_u32 wuffs_base__make_range_ie_u32 +#define wuffs_base__utility__make_range_ii_u64 wuffs_base__make_range_ii_u64 +#define wuffs_base__utility__make_range_ie_u64 wuffs_base__make_range_ie_u64 +#define wuffs_base__utility__make_rect_ii_u32 wuffs_base__make_rect_ii_u32 +#define wuffs_base__utility__make_rect_ie_u32 wuffs_base__make_rect_ie_u32 + +// ---------------- I/O + +static inline uint64_t // +wuffs_base__io__count_since(uint64_t mark, uint64_t index) { + if (index >= mark) { + return index - mark; + } + return 0; +} + +// TODO: drop the "const" in "const uint8_t* ptr". Some though required about +// the base.io_reader.since method returning a mutable "slice base.u8". +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif +static inline wuffs_base__slice_u8 // +wuffs_base__io__since(uint64_t mark, uint64_t index, const uint8_t* ptr) { + if (index >= mark) { + return wuffs_base__make_slice_u8(((uint8_t*)ptr) + mark, + ((size_t)(index - mark))); + } + return wuffs_base__make_slice_u8(NULL, 0); +} +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +// -------- + +static inline void // +wuffs_base__io_reader__limit(const uint8_t** ptr_io2_r, + const uint8_t* iop_r, + uint64_t limit) { + if (((uint64_t)(*ptr_io2_r - iop_r)) > limit) { + *ptr_io2_r = iop_r + limit; + } +} + +static inline uint32_t // +wuffs_base__io_reader__limited_copy_u32_to_slice(const uint8_t** ptr_iop_r, + const uint8_t* io2_r, + uint32_t length, + wuffs_base__slice_u8 dst) { + const uint8_t* iop_r = *ptr_iop_r; + size_t n = dst.len; + if (n > length) { + n = length; + } + if (n > ((size_t)(io2_r - iop_r))) { + n = (size_t)(io2_r - iop_r); + } + if (n > 0) { + memmove(dst.ptr, iop_r, n); + *ptr_iop_r += n; + } + return (uint32_t)(n); +} + +// wuffs_base__io_reader__match7 returns whether the io_reader's upcoming bytes +// start with the given prefix (up to 7 bytes long). It is peek-like, not +// read-like, in that there are no side-effects. +// +// The low 3 bits of a hold the prefix length, n. +// +// The high 56 bits of a hold the prefix itself, in little-endian order. The +// first prefix byte is in bits 8..=15, the second prefix byte is in bits +// 16..=23, etc. The high (8 * (7 - n)) bits are ignored. +// +// There are three possible return values: +// - 0 means success. +// - 1 means inconclusive, equivalent to "$short read". +// - 2 means failure. +static inline uint32_t // +wuffs_base__io_reader__match7(const uint8_t* iop_r, + const uint8_t* io2_r, + wuffs_base__io_buffer* r, + uint64_t a) { + uint32_t n = a & 7; + a >>= 8; + if ((io2_r - iop_r) >= 8) { + uint64_t x = wuffs_base__peek_u64le__no_bounds_check(iop_r); + uint32_t shift = 8 * (8 - n); + return ((a << shift) == (x << shift)) ? 0 : 2; + } + for (; n > 0; n--) { + if (iop_r >= io2_r) { + return (r && r->meta.closed) ? 2 : 1; + } else if (*iop_r != ((uint8_t)(a))) { + return 2; + } + iop_r++; + a >>= 8; + } + return 0; +} + +static inline wuffs_base__io_buffer* // +wuffs_base__io_reader__set(wuffs_base__io_buffer* b, + const uint8_t** ptr_iop_r, + const uint8_t** ptr_io0_r, + const uint8_t** ptr_io1_r, + const uint8_t** ptr_io2_r, + wuffs_base__slice_u8 data, + uint64_t history_position) { + b->data = data; + b->meta.wi = data.len; + b->meta.ri = 0; + b->meta.pos = history_position; + b->meta.closed = false; + + *ptr_iop_r = data.ptr; + *ptr_io0_r = data.ptr; + *ptr_io1_r = data.ptr; + *ptr_io2_r = data.ptr + data.len; + + return b; +} + +// -------- + +static inline uint64_t // +wuffs_base__io_writer__copy_from_slice(uint8_t** ptr_iop_w, + uint8_t* io2_w, + wuffs_base__slice_u8 src) { + uint8_t* iop_w = *ptr_iop_w; + size_t n = src.len; + if (n > ((size_t)(io2_w - iop_w))) { + n = (size_t)(io2_w - iop_w); + } + if (n > 0) { + memmove(iop_w, src.ptr, n); + *ptr_iop_w += n; + } + return (uint64_t)(n); +} + +static inline void // +wuffs_base__io_writer__limit(uint8_t** ptr_io2_w, + uint8_t* iop_w, + uint64_t limit) { + if (((uint64_t)(*ptr_io2_w - iop_w)) > limit) { + *ptr_io2_w = iop_w + limit; + } +} + +static inline uint32_t // +wuffs_base__io_writer__limited_copy_u32_from_history(uint8_t** ptr_iop_w, + uint8_t* io0_w, + uint8_t* io2_w, + uint32_t length, + uint32_t distance) { + if (!distance) { + return 0; + } + uint8_t* p = *ptr_iop_w; + if ((size_t)(p - io0_w) < (size_t)(distance)) { + return 0; + } + uint8_t* q = p - distance; + size_t n = (size_t)(io2_w - p); + if ((size_t)(length) > n) { + length = (uint32_t)(n); + } else { + n = (size_t)(length); + } + // TODO: unrolling by 3 seems best for the std/deflate benchmarks, but that + // is mostly because 3 is the minimum length for the deflate format. This + // function implementation shouldn't overfit to that one format. Perhaps the + // limited_copy_u32_from_history Wuffs method should also take an unroll hint + // argument, and the cgen can look if that argument is the constant + // expression '3'. + // + // See also wuffs_base__io_writer__limited_copy_u32_from_history_fast below. + for (; n >= 3; n -= 3) { + *p++ = *q++; + *p++ = *q++; + *p++ = *q++; + } + for (; n; n--) { + *p++ = *q++; + } + *ptr_iop_w = p; + return length; +} + +// wuffs_base__io_writer__limited_copy_u32_from_history_fast is like the +// wuffs_base__io_writer__limited_copy_u32_from_history function above, but has +// stronger pre-conditions. +// +// The caller needs to prove that: +// - length <= (io2_w - *ptr_iop_w) +// - distance >= 1 +// - distance <= (*ptr_iop_w - io0_w) +static inline uint32_t // +wuffs_base__io_writer__limited_copy_u32_from_history_fast(uint8_t** ptr_iop_w, + uint8_t* io0_w, + uint8_t* io2_w, + uint32_t length, + uint32_t distance) { + uint8_t* p = *ptr_iop_w; + uint8_t* q = p - distance; + uint32_t n = length; + for (; n >= 3; n -= 3) { + *p++ = *q++; + *p++ = *q++; + *p++ = *q++; + } + for (; n; n--) { + *p++ = *q++; + } + *ptr_iop_w = p; + return length; +} + +// wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast +// copies the previous byte (the one immediately before *ptr_iop_w), copying 8 +// byte chunks at a time. Each chunk contains 8 repetitions of the same byte. +// +// In terms of number of bytes copied, length is rounded up to a multiple of 8. +// As a special case, a zero length rounds up to 8 (even though 0 is already a +// multiple of 8), since there is always at least one 8 byte chunk copied. +// +// In terms of advancing *ptr_iop_w, length is not rounded up. +// +// The caller needs to prove that: +// - (length + 8) <= (io2_w - *ptr_iop_w) +// - distance == 1 +// - distance <= (*ptr_iop_w - io0_w) +static inline uint32_t // +wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( + uint8_t** ptr_iop_w, + uint8_t* io0_w, + uint8_t* io2_w, + uint32_t length, + uint32_t distance) { + uint8_t* p = *ptr_iop_w; + uint64_t x = p[-1]; + x |= x << 8; + x |= x << 16; + x |= x << 32; + uint32_t n = length; + while (1) { + wuffs_base__poke_u64le__no_bounds_check(p, x); + if (n <= 8) { + p += n; + break; + } + p += 8; + n -= 8; + } + *ptr_iop_w = p; + return length; +} + +// wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast is +// like the wuffs_base__io_writer__limited_copy_u32_from_history_fast function +// above, but copies 8 byte chunks at a time. +// +// In terms of number of bytes copied, length is rounded up to a multiple of 8. +// As a special case, a zero length rounds up to 8 (even though 0 is already a +// multiple of 8), since there is always at least one 8 byte chunk copied. +// +// In terms of advancing *ptr_iop_w, length is not rounded up. +// +// The caller needs to prove that: +// - (length + 8) <= (io2_w - *ptr_iop_w) +// - distance >= 8 +// - distance <= (*ptr_iop_w - io0_w) +static inline uint32_t // +wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( + uint8_t** ptr_iop_w, + uint8_t* io0_w, + uint8_t* io2_w, + uint32_t length, + uint32_t distance) { + uint8_t* p = *ptr_iop_w; + uint8_t* q = p - distance; + uint32_t n = length; + while (1) { + memcpy(p, q, 8); + if (n <= 8) { + p += n; + break; + } + p += 8; + q += 8; + n -= 8; + } + *ptr_iop_w = p; + return length; +} + +static inline uint32_t // +wuffs_base__io_writer__limited_copy_u32_from_reader(uint8_t** ptr_iop_w, + uint8_t* io2_w, + uint32_t length, + const uint8_t** ptr_iop_r, + const uint8_t* io2_r) { + uint8_t* iop_w = *ptr_iop_w; + size_t n = length; + if (n > ((size_t)(io2_w - iop_w))) { + n = (size_t)(io2_w - iop_w); + } + const uint8_t* iop_r = *ptr_iop_r; + if (n > ((size_t)(io2_r - iop_r))) { + n = (size_t)(io2_r - iop_r); + } + if (n > 0) { + memmove(iop_w, iop_r, n); + *ptr_iop_w += n; + *ptr_iop_r += n; + } + return (uint32_t)(n); +} + +static inline uint32_t // +wuffs_base__io_writer__limited_copy_u32_from_slice(uint8_t** ptr_iop_w, + uint8_t* io2_w, + uint32_t length, + wuffs_base__slice_u8 src) { + uint8_t* iop_w = *ptr_iop_w; + size_t n = src.len; + if (n > length) { + n = length; + } + if (n > ((size_t)(io2_w - iop_w))) { + n = (size_t)(io2_w - iop_w); + } + if (n > 0) { + memmove(iop_w, src.ptr, n); + *ptr_iop_w += n; + } + return (uint32_t)(n); +} + +static inline wuffs_base__io_buffer* // +wuffs_base__io_writer__set(wuffs_base__io_buffer* b, + uint8_t** ptr_iop_w, + uint8_t** ptr_io0_w, + uint8_t** ptr_io1_w, + uint8_t** ptr_io2_w, + wuffs_base__slice_u8 data, + uint64_t history_position) { + b->data = data; + b->meta.wi = 0; + b->meta.ri = 0; + b->meta.pos = history_position; + b->meta.closed = false; + + *ptr_iop_w = data.ptr; + *ptr_io0_w = data.ptr; + *ptr_io1_w = data.ptr; + *ptr_io2_w = data.ptr + data.len; + + return b; +} + +// ---------------- I/O (Utility) + +#define wuffs_base__utility__empty_io_reader wuffs_base__empty_io_reader +#define wuffs_base__utility__empty_io_writer wuffs_base__empty_io_writer + +// ---------------- Tokens + +// ---------------- Tokens (Utility) + +// ---------------- Memory Allocation + +// ---------------- Images + +WUFFS_BASE__MAYBE_STATIC uint64_t // +wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( + const wuffs_base__pixel_swizzler* p, + uint32_t up_to_num_pixels, + wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 dst_palette, + const uint8_t** ptr_iop_r, + const uint8_t* io2_r); + +WUFFS_BASE__MAYBE_STATIC uint64_t // +wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( + const wuffs_base__pixel_swizzler* p, + wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 dst_palette, + const uint8_t** ptr_iop_r, + const uint8_t* io2_r); + +WUFFS_BASE__MAYBE_STATIC uint64_t // +wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( + const wuffs_base__pixel_swizzler* p, + wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 dst_palette, + uint64_t num_pixels); + +// ---------------- Images (Utility) + +#define wuffs_base__utility__make_pixel_format wuffs_base__make_pixel_format + +// ---------------- String Conversions + +// ---------------- Unicode and UTF-8 + +// ---------------- + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ + defined(WUFFS_CONFIG__MODULE__BASE__CORE) + +const uint8_t wuffs_base__low_bits_mask__u8[8] = { + 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, +}; + +const uint16_t wuffs_base__low_bits_mask__u16[16] = { + 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, + 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, +}; + +const uint32_t wuffs_base__low_bits_mask__u32[32] = { + 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, + 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, + 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF, + 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, + 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF, + 0x3FFFFFFF, 0x7FFFFFFF, +}; + +const uint64_t wuffs_base__low_bits_mask__u64[64] = { + 0x0000000000000000, 0x0000000000000001, 0x0000000000000003, + 0x0000000000000007, 0x000000000000000F, 0x000000000000001F, + 0x000000000000003F, 0x000000000000007F, 0x00000000000000FF, + 0x00000000000001FF, 0x00000000000003FF, 0x00000000000007FF, + 0x0000000000000FFF, 0x0000000000001FFF, 0x0000000000003FFF, + 0x0000000000007FFF, 0x000000000000FFFF, 0x000000000001FFFF, + 0x000000000003FFFF, 0x000000000007FFFF, 0x00000000000FFFFF, + 0x00000000001FFFFF, 0x00000000003FFFFF, 0x00000000007FFFFF, + 0x0000000000FFFFFF, 0x0000000001FFFFFF, 0x0000000003FFFFFF, + 0x0000000007FFFFFF, 0x000000000FFFFFFF, 0x000000001FFFFFFF, + 0x000000003FFFFFFF, 0x000000007FFFFFFF, 0x00000000FFFFFFFF, + 0x00000001FFFFFFFF, 0x00000003FFFFFFFF, 0x00000007FFFFFFFF, + 0x0000000FFFFFFFFF, 0x0000001FFFFFFFFF, 0x0000003FFFFFFFFF, + 0x0000007FFFFFFFFF, 0x000000FFFFFFFFFF, 0x000001FFFFFFFFFF, + 0x000003FFFFFFFFFF, 0x000007FFFFFFFFFF, 0x00000FFFFFFFFFFF, + 0x00001FFFFFFFFFFF, 0x00003FFFFFFFFFFF, 0x00007FFFFFFFFFFF, + 0x0000FFFFFFFFFFFF, 0x0001FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF, + 0x0007FFFFFFFFFFFF, 0x000FFFFFFFFFFFFF, 0x001FFFFFFFFFFFFF, + 0x003FFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF, + 0x01FFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF, + 0x0FFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF, + 0x7FFFFFFFFFFFFFFF, +}; + +const uint32_t wuffs_base__pixel_format__bits_per_channel[16] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, +}; + +const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect"; +const char wuffs_base__note__end_of_data[] = "@base: end of data"; +const char wuffs_base__note__metadata_reported[] = "@base: metadata reported"; +const char wuffs_base__suspension__even_more_information[] = "$base: even more information"; +const char wuffs_base__suspension__mispositioned_read[] = "$base: mispositioned read"; +const char wuffs_base__suspension__mispositioned_write[] = "$base: mispositioned write"; +const char wuffs_base__suspension__short_read[] = "$base: short read"; +const char wuffs_base__suspension__short_write[] = "$base: short write"; +const char wuffs_base__error__bad_i_o_position[] = "#base: bad I/O position"; +const char wuffs_base__error__bad_argument_length_too_short[] = "#base: bad argument (length too short)"; +const char wuffs_base__error__bad_argument[] = "#base: bad argument"; +const char wuffs_base__error__bad_call_sequence[] = "#base: bad call sequence"; +const char wuffs_base__error__bad_data[] = "#base: bad data"; +const char wuffs_base__error__bad_receiver[] = "#base: bad receiver"; +const char wuffs_base__error__bad_restart[] = "#base: bad restart"; +const char wuffs_base__error__bad_sizeof_receiver[] = "#base: bad sizeof receiver"; +const char wuffs_base__error__bad_vtable[] = "#base: bad vtable"; +const char wuffs_base__error__bad_workbuf_length[] = "#base: bad workbuf length"; +const char wuffs_base__error__bad_wuffs_version[] = "#base: bad wuffs version"; +const char wuffs_base__error__cannot_return_a_suspension[] = "#base: cannot return a suspension"; +const char wuffs_base__error__disabled_by_previous_error[] = "#base: disabled by previous error"; +const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[] = "#base: initialize falsely claimed already zeroed"; +const char wuffs_base__error__initialize_not_called[] = "#base: initialize not called"; +const char wuffs_base__error__interleaved_coroutine_calls[] = "#base: interleaved coroutine calls"; +const char wuffs_base__error__no_more_information[] = "#base: no more information"; +const char wuffs_base__error__not_enough_data[] = "#base: not enough data"; +const char wuffs_base__error__out_of_bounds[] = "#base: out of bounds"; +const char wuffs_base__error__unsupported_method[] = "#base: unsupported method"; +const char wuffs_base__error__unsupported_option[] = "#base: unsupported option"; +const char wuffs_base__error__unsupported_pixel_swizzler_option[] = "#base: unsupported pixel swizzler option"; +const char wuffs_base__error__too_much_data[] = "#base: too much data"; + +const char wuffs_base__hasher_u32__vtable_name[] = "{vtable}wuffs_base__hasher_u32"; +const char wuffs_base__image_decoder__vtable_name[] = "{vtable}wuffs_base__image_decoder"; +const char wuffs_base__io_transformer__vtable_name[] = "{vtable}wuffs_base__io_transformer"; +const char wuffs_base__token_decoder__vtable_name[] = "{vtable}wuffs_base__token_decoder"; + +#endif // !defined(WUFFS_CONFIG__MODULES) || + // defined(WUFFS_CONFIG__MODULE__BASE) || + // defined(WUFFS_CONFIG__MODULE__BASE__CORE) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ + defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) + +// ---------------- Interface Definitions. + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_base__hasher_u32__set_quirk_enabled( + wuffs_base__hasher_u32* self, + uint32_t a_quirk, + bool a_enabled) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { + const wuffs_base__hasher_u32__func_ptrs* func_ptrs = + (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); + return (*func_ptrs->set_quirk_enabled)(self, a_quirk, a_enabled); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__make_empty_struct(); +} + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_base__hasher_u32__update_u32( + wuffs_base__hasher_u32* self, + wuffs_base__slice_u8 a_x) { + if (!self) { + return 0; + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return 0; + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { + const wuffs_base__hasher_u32__func_ptrs* func_ptrs = + (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); + return (*func_ptrs->update_u32)(self, a_x); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return 0; +} + +// -------- + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__image_decoder__decode_frame( + wuffs_base__image_decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { + const wuffs_base__image_decoder__func_ptrs* func_ptrs = + (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->decode_frame)(self, a_dst, a_src, a_blend, a_workbuf, a_opts); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__make_status(wuffs_base__error__bad_vtable); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__image_decoder__decode_frame_config( + wuffs_base__image_decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { + const wuffs_base__image_decoder__func_ptrs* func_ptrs = + (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->decode_frame_config)(self, a_dst, a_src); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__make_status(wuffs_base__error__bad_vtable); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__image_decoder__decode_image_config( + wuffs_base__image_decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { + const wuffs_base__image_decoder__func_ptrs* func_ptrs = + (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->decode_image_config)(self, a_dst, a_src); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__make_status(wuffs_base__error__bad_vtable); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_base__image_decoder__frame_dirty_rect( + const wuffs_base__image_decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { + const wuffs_base__image_decoder__func_ptrs* func_ptrs = + (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->frame_dirty_rect)(self); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__utility__empty_rect_ie_u32(); +} + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_base__image_decoder__num_animation_loops( + const wuffs_base__image_decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { + const wuffs_base__image_decoder__func_ptrs* func_ptrs = + (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->num_animation_loops)(self); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return 0; +} + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_base__image_decoder__num_decoded_frame_configs( + const wuffs_base__image_decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { + const wuffs_base__image_decoder__func_ptrs* func_ptrs = + (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->num_decoded_frame_configs)(self); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return 0; +} + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_base__image_decoder__num_decoded_frames( + const wuffs_base__image_decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { + const wuffs_base__image_decoder__func_ptrs* func_ptrs = + (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->num_decoded_frames)(self); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return 0; +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__image_decoder__restart_frame( + wuffs_base__image_decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { + const wuffs_base__image_decoder__func_ptrs* func_ptrs = + (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->restart_frame)(self, a_index, a_io_position); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__make_status(wuffs_base__error__bad_vtable); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_base__image_decoder__set_quirk_enabled( + wuffs_base__image_decoder* self, + uint32_t a_quirk, + bool a_enabled) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { + const wuffs_base__image_decoder__func_ptrs* func_ptrs = + (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->set_quirk_enabled)(self, a_quirk, a_enabled); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__make_empty_struct(); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_base__image_decoder__set_report_metadata( + wuffs_base__image_decoder* self, + uint32_t a_fourcc, + bool a_report) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { + const wuffs_base__image_decoder__func_ptrs* func_ptrs = + (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->set_report_metadata)(self, a_fourcc, a_report); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__make_empty_struct(); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__image_decoder__tell_me_more( + wuffs_base__image_decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { + const wuffs_base__image_decoder__func_ptrs* func_ptrs = + (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->tell_me_more)(self, a_dst, a_minfo, a_src); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__make_status(wuffs_base__error__bad_vtable); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_base__image_decoder__workbuf_len( + const wuffs_base__image_decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { + const wuffs_base__image_decoder__func_ptrs* func_ptrs = + (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->workbuf_len)(self); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__utility__empty_range_ii_u64(); +} + +// -------- + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_base__io_transformer__set_quirk_enabled( + wuffs_base__io_transformer* self, + uint32_t a_quirk, + bool a_enabled) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { + const wuffs_base__io_transformer__func_ptrs* func_ptrs = + (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); + return (*func_ptrs->set_quirk_enabled)(self, a_quirk, a_enabled); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__make_empty_struct(); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__io_transformer__transform_io( + wuffs_base__io_transformer* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { + const wuffs_base__io_transformer__func_ptrs* func_ptrs = + (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); + return (*func_ptrs->transform_io)(self, a_dst, a_src, a_workbuf); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__make_status(wuffs_base__error__bad_vtable); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_base__io_transformer__workbuf_len( + const wuffs_base__io_transformer* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { + const wuffs_base__io_transformer__func_ptrs* func_ptrs = + (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); + return (*func_ptrs->workbuf_len)(self); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__utility__empty_range_ii_u64(); +} + +// -------- + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_base__token_decoder__decode_tokens( + wuffs_base__token_decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { + const wuffs_base__token_decoder__func_ptrs* func_ptrs = + (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->decode_tokens)(self, a_dst, a_src, a_workbuf); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__make_status(wuffs_base__error__bad_vtable); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_base__token_decoder__set_quirk_enabled( + wuffs_base__token_decoder* self, + uint32_t a_quirk, + bool a_enabled) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { + const wuffs_base__token_decoder__func_ptrs* func_ptrs = + (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->set_quirk_enabled)(self, a_quirk, a_enabled); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__make_empty_struct(); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_base__token_decoder__workbuf_len( + const wuffs_base__token_decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + const wuffs_base__vtable* v = &self->private_impl.first_vtable; + int i; + for (i = 0; i < 63; i++) { + if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { + const wuffs_base__token_decoder__func_ptrs* func_ptrs = + (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); + return (*func_ptrs->workbuf_len)(self); + } else if (v->vtable_name == NULL) { + break; + } + v++; + } + + return wuffs_base__utility__empty_range_ii_u64(); +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || + // defined(WUFFS_CONFIG__MODULE__BASE) || + // defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ + defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) + +// ---------------- IEEE 754 Floating Point + +// The etc__hpd_left_shift and etc__powers_of_5 tables were printed by +// script/print-hpd-left-shift.go. That script has an optional -comments flag, +// whose output is not copied here, which prints further detail. +// +// These tables are used in +// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits. + +// wuffs_base__private_implementation__hpd_left_shift[i] encodes the number of +// new digits created after multiplying a positive integer by (1 << i): the +// additional length in the decimal representation. For example, shifting "234" +// by 3 (equivalent to multiplying by 8) will produce "1872". Going from a +// 3-length string to a 4-length string means that 1 new digit was added (and +// existing digits may have changed). +// +// Shifting by i can add either N or N-1 new digits, depending on whether the +// original positive integer compares >= or < to the i'th power of 5 (as 10 +// equals 2 * 5). Comparison is lexicographic, not numerical. +// +// For example, shifting by 4 (i.e. multiplying by 16) can add 1 or 2 new +// digits, depending on a lexicographic comparison to (5 ** 4), i.e. "625": +// - ("1" << 4) is "16", which adds 1 new digit. +// - ("5678" << 4) is "90848", which adds 1 new digit. +// - ("624" << 4) is "9984", which adds 1 new digit. +// - ("62498" << 4) is "999968", which adds 1 new digit. +// - ("625" << 4) is "10000", which adds 2 new digits. +// - ("625001" << 4) is "10000016", which adds 2 new digits. +// - ("7008" << 4) is "112128", which adds 2 new digits. +// - ("99" << 4) is "1584", which adds 2 new digits. +// +// Thus, when i is 4, N is 2 and (5 ** i) is "625". This etc__hpd_left_shift +// array encodes this as: +// - etc__hpd_left_shift[4] is 0x1006 = (2 << 11) | 0x0006. +// - etc__hpd_left_shift[5] is 0x1009 = (? << 11) | 0x0009. +// where the ? isn't relevant for i == 4. +// +// The high 5 bits of etc__hpd_left_shift[i] is N, the higher of the two +// possible number of new digits. The low 11 bits are an offset into the +// etc__powers_of_5 array (of length 0x051C, so offsets fit in 11 bits). When i +// is 4, its offset and the next one is 6 and 9, and etc__powers_of_5[6 .. 9] +// is the string "\x06\x02\x05", so the relevant power of 5 is "625". +// +// Thanks to Ken Thompson for the original idea. +static const uint16_t wuffs_base__private_implementation__hpd_left_shift[65] = { + 0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817, + 0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067, + 0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF, + 0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0, + 0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA, + 0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC, + 0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C, + 0x051C, 0x051C, +}; + +// wuffs_base__private_implementation__powers_of_5 contains the powers of 5, +// concatenated together: "5", "25", "125", "625", "3125", etc. +static const uint8_t wuffs_base__private_implementation__powers_of_5[0x051C] = { + 5, 2, 5, 1, 2, 5, 6, 2, 5, 3, 1, 2, 5, 1, 5, 6, 2, 5, 7, 8, 1, 2, 5, 3, 9, + 0, 6, 2, 5, 1, 9, 5, 3, 1, 2, 5, 9, 7, 6, 5, 6, 2, 5, 4, 8, 8, 2, 8, 1, 2, + 5, 2, 4, 4, 1, 4, 0, 6, 2, 5, 1, 2, 2, 0, 7, 0, 3, 1, 2, 5, 6, 1, 0, 3, 5, + 1, 5, 6, 2, 5, 3, 0, 5, 1, 7, 5, 7, 8, 1, 2, 5, 1, 5, 2, 5, 8, 7, 8, 9, 0, + 6, 2, 5, 7, 6, 2, 9, 3, 9, 4, 5, 3, 1, 2, 5, 3, 8, 1, 4, 6, 9, 7, 2, 6, 5, + 6, 2, 5, 1, 9, 0, 7, 3, 4, 8, 6, 3, 2, 8, 1, 2, 5, 9, 5, 3, 6, 7, 4, 3, 1, + 6, 4, 0, 6, 2, 5, 4, 7, 6, 8, 3, 7, 1, 5, 8, 2, 0, 3, 1, 2, 5, 2, 3, 8, 4, + 1, 8, 5, 7, 9, 1, 0, 1, 5, 6, 2, 5, 1, 1, 9, 2, 0, 9, 2, 8, 9, 5, 5, 0, 7, + 8, 1, 2, 5, 5, 9, 6, 0, 4, 6, 4, 4, 7, 7, 5, 3, 9, 0, 6, 2, 5, 2, 9, 8, 0, + 2, 3, 2, 2, 3, 8, 7, 6, 9, 5, 3, 1, 2, 5, 1, 4, 9, 0, 1, 1, 6, 1, 1, 9, 3, + 8, 4, 7, 6, 5, 6, 2, 5, 7, 4, 5, 0, 5, 8, 0, 5, 9, 6, 9, 2, 3, 8, 2, 8, 1, + 2, 5, 3, 7, 2, 5, 2, 9, 0, 2, 9, 8, 4, 6, 1, 9, 1, 4, 0, 6, 2, 5, 1, 8, 6, + 2, 6, 4, 5, 1, 4, 9, 2, 3, 0, 9, 5, 7, 0, 3, 1, 2, 5, 9, 3, 1, 3, 2, 2, 5, + 7, 4, 6, 1, 5, 4, 7, 8, 5, 1, 5, 6, 2, 5, 4, 6, 5, 6, 6, 1, 2, 8, 7, 3, 0, + 7, 7, 3, 9, 2, 5, 7, 8, 1, 2, 5, 2, 3, 2, 8, 3, 0, 6, 4, 3, 6, 5, 3, 8, 6, + 9, 6, 2, 8, 9, 0, 6, 2, 5, 1, 1, 6, 4, 1, 5, 3, 2, 1, 8, 2, 6, 9, 3, 4, 8, + 1, 4, 4, 5, 3, 1, 2, 5, 5, 8, 2, 0, 7, 6, 6, 0, 9, 1, 3, 4, 6, 7, 4, 0, 7, + 2, 2, 6, 5, 6, 2, 5, 2, 9, 1, 0, 3, 8, 3, 0, 4, 5, 6, 7, 3, 3, 7, 0, 3, 6, + 1, 3, 2, 8, 1, 2, 5, 1, 4, 5, 5, 1, 9, 1, 5, 2, 2, 8, 3, 6, 6, 8, 5, 1, 8, + 0, 6, 6, 4, 0, 6, 2, 5, 7, 2, 7, 5, 9, 5, 7, 6, 1, 4, 1, 8, 3, 4, 2, 5, 9, + 0, 3, 3, 2, 0, 3, 1, 2, 5, 3, 6, 3, 7, 9, 7, 8, 8, 0, 7, 0, 9, 1, 7, 1, 2, + 9, 5, 1, 6, 6, 0, 1, 5, 6, 2, 5, 1, 8, 1, 8, 9, 8, 9, 4, 0, 3, 5, 4, 5, 8, + 5, 6, 4, 7, 5, 8, 3, 0, 0, 7, 8, 1, 2, 5, 9, 0, 9, 4, 9, 4, 7, 0, 1, 7, 7, + 2, 9, 2, 8, 2, 3, 7, 9, 1, 5, 0, 3, 9, 0, 6, 2, 5, 4, 5, 4, 7, 4, 7, 3, 5, + 0, 8, 8, 6, 4, 6, 4, 1, 1, 8, 9, 5, 7, 5, 1, 9, 5, 3, 1, 2, 5, 2, 2, 7, 3, + 7, 3, 6, 7, 5, 4, 4, 3, 2, 3, 2, 0, 5, 9, 4, 7, 8, 7, 5, 9, 7, 6, 5, 6, 2, + 5, 1, 1, 3, 6, 8, 6, 8, 3, 7, 7, 2, 1, 6, 1, 6, 0, 2, 9, 7, 3, 9, 3, 7, 9, + 8, 8, 2, 8, 1, 2, 5, 5, 6, 8, 4, 3, 4, 1, 8, 8, 6, 0, 8, 0, 8, 0, 1, 4, 8, + 6, 9, 6, 8, 9, 9, 4, 1, 4, 0, 6, 2, 5, 2, 8, 4, 2, 1, 7, 0, 9, 4, 3, 0, 4, + 0, 4, 0, 0, 7, 4, 3, 4, 8, 4, 4, 9, 7, 0, 7, 0, 3, 1, 2, 5, 1, 4, 2, 1, 0, + 8, 5, 4, 7, 1, 5, 2, 0, 2, 0, 0, 3, 7, 1, 7, 4, 2, 2, 4, 8, 5, 3, 5, 1, 5, + 6, 2, 5, 7, 1, 0, 5, 4, 2, 7, 3, 5, 7, 6, 0, 1, 0, 0, 1, 8, 5, 8, 7, 1, 1, + 2, 4, 2, 6, 7, 5, 7, 8, 1, 2, 5, 3, 5, 5, 2, 7, 1, 3, 6, 7, 8, 8, 0, 0, 5, + 0, 0, 9, 2, 9, 3, 5, 5, 6, 2, 1, 3, 3, 7, 8, 9, 0, 6, 2, 5, 1, 7, 7, 6, 3, + 5, 6, 8, 3, 9, 4, 0, 0, 2, 5, 0, 4, 6, 4, 6, 7, 7, 8, 1, 0, 6, 6, 8, 9, 4, + 5, 3, 1, 2, 5, 8, 8, 8, 1, 7, 8, 4, 1, 9, 7, 0, 0, 1, 2, 5, 2, 3, 2, 3, 3, + 8, 9, 0, 5, 3, 3, 4, 4, 7, 2, 6, 5, 6, 2, 5, 4, 4, 4, 0, 8, 9, 2, 0, 9, 8, + 5, 0, 0, 6, 2, 6, 1, 6, 1, 6, 9, 4, 5, 2, 6, 6, 7, 2, 3, 6, 3, 2, 8, 1, 2, + 5, 2, 2, 2, 0, 4, 4, 6, 0, 4, 9, 2, 5, 0, 3, 1, 3, 0, 8, 0, 8, 4, 7, 2, 6, + 3, 3, 3, 6, 1, 8, 1, 6, 4, 0, 6, 2, 5, 1, 1, 1, 0, 2, 2, 3, 0, 2, 4, 6, 2, + 5, 1, 5, 6, 5, 4, 0, 4, 2, 3, 6, 3, 1, 6, 6, 8, 0, 9, 0, 8, 2, 0, 3, 1, 2, + 5, 5, 5, 5, 1, 1, 1, 5, 1, 2, 3, 1, 2, 5, 7, 8, 2, 7, 0, 2, 1, 1, 8, 1, 5, + 8, 3, 4, 0, 4, 5, 4, 1, 0, 1, 5, 6, 2, 5, 2, 7, 7, 5, 5, 5, 7, 5, 6, 1, 5, + 6, 2, 8, 9, 1, 3, 5, 1, 0, 5, 9, 0, 7, 9, 1, 7, 0, 2, 2, 7, 0, 5, 0, 7, 8, + 1, 2, 5, 1, 3, 8, 7, 7, 7, 8, 7, 8, 0, 7, 8, 1, 4, 4, 5, 6, 7, 5, 5, 2, 9, + 5, 3, 9, 5, 8, 5, 1, 1, 3, 5, 2, 5, 3, 9, 0, 6, 2, 5, 6, 9, 3, 8, 8, 9, 3, + 9, 0, 3, 9, 0, 7, 2, 2, 8, 3, 7, 7, 6, 4, 7, 6, 9, 7, 9, 2, 5, 5, 6, 7, 6, + 2, 6, 9, 5, 3, 1, 2, 5, 3, 4, 6, 9, 4, 4, 6, 9, 5, 1, 9, 5, 3, 6, 1, 4, 1, + 8, 8, 8, 2, 3, 8, 4, 8, 9, 6, 2, 7, 8, 3, 8, 1, 3, 4, 7, 6, 5, 6, 2, 5, 1, + 7, 3, 4, 7, 2, 3, 4, 7, 5, 9, 7, 6, 8, 0, 7, 0, 9, 4, 4, 1, 1, 9, 2, 4, 4, + 8, 1, 3, 9, 1, 9, 0, 6, 7, 3, 8, 2, 8, 1, 2, 5, 8, 6, 7, 3, 6, 1, 7, 3, 7, + 9, 8, 8, 4, 0, 3, 5, 4, 7, 2, 0, 5, 9, 6, 2, 2, 4, 0, 6, 9, 5, 9, 5, 3, 3, + 6, 9, 1, 4, 0, 6, 2, 5, +}; + +// -------- + +// wuffs_base__private_implementation__powers_of_10 contains truncated +// approximations to the powers of 10, ranging from 1e-307 to 1e+288 inclusive, +// as 596 pairs of uint64_t values (a 128-bit mantissa). +// +// There's also an implicit third column (implied by a linear formula involving +// the base-10 exponent) that is the base-2 exponent, biased by a magic +// constant. That constant (1214 or 0x04BE) equals 1023 + 191. 1023 is the bias +// for IEEE 754 double-precision floating point. 191 is ((3 * 64) - 1) and +// wuffs_base__private_implementation__parse_number_f64_eisel_lemire works with +// multiples-of-64-bit mantissas. +// +// For example, the third row holds the approximation to 1e-305: +// 0xE0B62E29_29ABA83C_331ACDAB_FE94DE87 * (2 ** (0x0049 - 0x04BE)) +// +// Similarly, 1e+4 is approximated by: +// 0x9C400000_00000000_00000000_00000000 * (2 ** (0x044C - 0x04BE)) +// +// Similarly, 1e+68 is approximated by: +// 0xED63A231_D4C4FB27_4CA7AAA8_63EE4BDD * (2 ** (0x0520 - 0x04BE)) +// +// This table was generated by by script/print-mpb-powers-of-10.go +static const uint64_t wuffs_base__private_implementation__powers_of_10[596][2] = + { + {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB}, // 1e-307 + {0x8F48A4899877186C, 0xB3C4F1BA87BC8696}, // 1e-306 + {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C}, // 1e-305 + {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925}, // 1e-304 + {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F}, // 1e-303 + {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A}, // 1e-302 + {0xBE311C083A225CD2, 0x892731AC9FAF056E}, // 1e-301 + {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA}, // 1e-300 + {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D}, // 1e-299 + {0x25BBF56008C58EA5, 0x85F0468293F0EB4E}, // 1e-298 + {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621}, // 1e-297 + {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA}, // 1e-296 + {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA}, // 1e-295 + {0xE50FF107BAB528A0, 0xA37FCE126597973C}, // 1e-294 + {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C}, // 1e-293 + {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F}, // 1e-292 + {0x77B191618C54E9AC, 0x9FAACF3DF73609B1}, // 1e-291 + {0xD59DF5B9EF6A2417, 0xC795830D75038C1D}, // 1e-290 + {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25}, // 1e-289 + {0x4EE367F9430AEC32, 0x9BECCE62836AC577}, // 1e-288 + {0x229C41F793CDA73F, 0xC2E801FB244576D5}, // 1e-287 + {0x6B43527578C1110F, 0xF3A20279ED56D48A}, // 1e-286 + {0x830A13896B78AAA9, 0x9845418C345644D6}, // 1e-285 + {0x23CC986BC656D553, 0xBE5691EF416BD60C}, // 1e-284 + {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F}, // 1e-283 + {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39}, // 1e-282 + {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07}, // 1e-281 + {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9}, // 1e-280 + {0x23100809B9C21FA1, 0x91376C36D99995BE}, // 1e-279 + {0xABD40A0C2832A78A, 0xB58547448FFFFB2D}, // 1e-278 + {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9}, // 1e-277 + {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B}, // 1e-276 + {0x99CD11CFDF41779C, 0xB1442798F49FFB4A}, // 1e-275 + {0x40405643D711D583, 0xDD95317F31C7FA1D}, // 1e-274 + {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52}, // 1e-273 + {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66}, // 1e-272 + {0x90BED43E40076A82, 0xD863B256369D4A40}, // 1e-271 + {0x5A7744A6E804A291, 0x873E4F75E2224E68}, // 1e-270 + {0x711515D0A205CB36, 0xA90DE3535AAAE202}, // 1e-269 + {0x0D5A5B44CA873E03, 0xD3515C2831559A83}, // 1e-268 + {0xE858790AFE9486C2, 0x8412D9991ED58091}, // 1e-267 + {0x626E974DBE39A872, 0xA5178FFF668AE0B6}, // 1e-266 + {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3}, // 1e-265 + {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E}, // 1e-264 + {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72}, // 1e-263 + {0xA327FFB266B56220, 0xC987434744AC874E}, // 1e-262 + {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922}, // 1e-261 + {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5}, // 1e-260 + {0xCB550FB4384D21D3, 0xC4CE17B399107C22}, // 1e-259 + {0x7E2A53A146606A48, 0xF6019DA07F549B2B}, // 1e-258 + {0x2EDA7444CBFC426D, 0x99C102844F94E0FB}, // 1e-257 + {0xFA911155FEFB5308, 0xC0314325637A1939}, // 1e-256 + {0x793555AB7EBA27CA, 0xF03D93EEBC589F88}, // 1e-255 + {0x4BC1558B2F3458DE, 0x96267C7535B763B5}, // 1e-254 + {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2}, // 1e-253 + {0x465E15A979C1CADC, 0xEA9C227723EE8BCB}, // 1e-252 + {0x0BFACD89EC191EC9, 0x92A1958A7675175F}, // 1e-251 + {0xCEF980EC671F667B, 0xB749FAED14125D36}, // 1e-250 + {0x82B7E12780E7401A, 0xE51C79A85916F484}, // 1e-249 + {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2}, // 1e-248 + {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07}, // 1e-247 + {0x67A791E093E1D49A, 0xDFBDCECE67006AC9}, // 1e-246 + {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD}, // 1e-245 + {0x58FAE9F773886E18, 0xAECC49914078536D}, // 1e-244 + {0xAF39A475506A899E, 0xDA7F5BF590966848}, // 1e-243 + {0x6D8406C952429603, 0x888F99797A5E012D}, // 1e-242 + {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178}, // 1e-241 + {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6}, // 1e-240 + {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26}, // 1e-239 + {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F}, // 1e-238 + {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B}, // 1e-237 + {0x76C53D08D6B70858, 0x823C12795DB6CE57}, // 1e-236 + {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED}, // 1e-235 + {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268}, // 1e-234 + {0xD3F93B35435D7C4C, 0xFE5D54150B090B02}, // 1e-233 + {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1}, // 1e-232 + {0x359AB6419CA1091B, 0xC6B8E9B0709F109A}, // 1e-231 + {0xC30163D203C94B62, 0xF867241C8CC6D4C0}, // 1e-230 + {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8}, // 1e-229 + {0x985915FC12F542E4, 0xC21094364DFB5636}, // 1e-228 + {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4}, // 1e-227 + {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A}, // 1e-226 + {0x50C6FF782A838353, 0xBD8430BD08277231}, // 1e-225 + {0xA4F8BF5635246428, 0xECE53CEC4A314EBD}, // 1e-224 + {0x871B7795E136BE99, 0x940F4613AE5ED136}, // 1e-223 + {0x28E2557B59846E3F, 0xB913179899F68584}, // 1e-222 + {0x331AEADA2FE589CF, 0xE757DD7EC07426E5}, // 1e-221 + {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F}, // 1e-220 + {0x0FED077A756B53A9, 0xB4BCA50B065ABE63}, // 1e-219 + {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB}, // 1e-218 + {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD}, // 1e-217 + {0xBD8D794D96AACFB3, 0xB080392CC4349DEC}, // 1e-216 + {0xECF0D7A0FC5583A0, 0xDCA04777F541C567}, // 1e-215 + {0xF41686C49DB57244, 0x89E42CAAF9491B60}, // 1e-214 + {0x311C2875C522CED5, 0xAC5D37D5B79B6239}, // 1e-213 + {0x7D633293366B828B, 0xD77485CB25823AC7}, // 1e-212 + {0xAE5DFF9C02033197, 0x86A8D39EF77164BC}, // 1e-211 + {0xD9F57F830283FDFC, 0xA8530886B54DBDEB}, // 1e-210 + {0xD072DF63C324FD7B, 0xD267CAA862A12D66}, // 1e-209 + {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60}, // 1e-208 + {0x52D9BE85F074E608, 0xA46116538D0DEB78}, // 1e-207 + {0x67902E276C921F8B, 0xCD795BE870516656}, // 1e-206 + {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6}, // 1e-205 + {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3}, // 1e-204 + {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0}, // 1e-203 + {0x796B805720085F81, 0xFAD2A4B13D1B5D6C}, // 1e-202 + {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63}, // 1e-201 + {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC}, // 1e-200 + {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B}, // 1e-199 + {0x751BDD152D4D1C4A, 0x991711052D8BF3C5}, // 1e-198 + {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6}, // 1e-197 + {0x86FB897116C87C34, 0xEF340A98172AACE4}, // 1e-196 + {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E}, // 1e-195 + {0x8974836059CCA109, 0xBAE0A846D2195712}, // 1e-194 + {0x2BD1A438703FC94B, 0xE998D258869FACD7}, // 1e-193 + {0x7B6306A34627DDCF, 0x91FF83775423CC06}, // 1e-192 + {0x1A3BC84C17B1D542, 0xB67F6455292CBF08}, // 1e-191 + {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA}, // 1e-190 + {0x547EB47B7282EE9C, 0x8E938662882AF53E}, // 1e-189 + {0xE99E619A4F23AA43, 0xB23867FB2A35B28D}, // 1e-188 + {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31}, // 1e-187 + {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E}, // 1e-186 + {0x9624AB50B148D445, 0xAE0B158B4738705E}, // 1e-185 + {0x3BADD624DD9B0957, 0xD98DDAEE19068C76}, // 1e-184 + {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9}, // 1e-183 + {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC}, // 1e-182 + {0x7647C3200069671F, 0xD47487CC8470652B}, // 1e-181 + {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B}, // 1e-180 + {0xF468107100525890, 0xA5FB0A17C777CF09}, // 1e-179 + {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC}, // 1e-178 + {0xC6F14CD848405530, 0x81AC1FE293D599BF}, // 1e-177 + {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F}, // 1e-176 + {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B}, // 1e-175 + {0x908F4A166D1DA663, 0xFD442E4688BD304A}, // 1e-174 + {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E}, // 1e-173 + {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA}, // 1e-172 + {0xD12BEE59E68EF47C, 0xF7549530E188C128}, // 1e-171 + {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9}, // 1e-170 + {0xE36A52363C1FAF01, 0xC13A148E3032D6E7}, // 1e-169 + {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1}, // 1e-168 + {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5}, // 1e-167 + {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE}, // 1e-166 + {0x111B495B3464AD21, 0xEBDF661791D60F56}, // 1e-165 + {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995}, // 1e-164 + {0x3D5D514F40EEA742, 0xB84687C269EF3BFB}, // 1e-163 + {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA}, // 1e-162 + {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC}, // 1e-161 + {0x59ED216765690F56, 0xB3F4E093DB73A093}, // 1e-160 + {0x306869C13EC3532C, 0xE0F218B8D25088B8}, // 1e-159 + {0x1E414218C73A13FB, 0x8C974F7383725573}, // 1e-158 + {0xE5D1929EF90898FA, 0xAFBD2350644EEACF}, // 1e-157 + {0xDF45F746B74ABF39, 0xDBAC6C247D62A583}, // 1e-156 + {0x6B8BBA8C328EB783, 0x894BC396CE5DA772}, // 1e-155 + {0x066EA92F3F326564, 0xAB9EB47C81F5114F}, // 1e-154 + {0xC80A537B0EFEFEBD, 0xD686619BA27255A2}, // 1e-153 + {0xBD06742CE95F5F36, 0x8613FD0145877585}, // 1e-152 + {0x2C48113823B73704, 0xA798FC4196E952E7}, // 1e-151 + {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0}, // 1e-150 + {0x9A984D73DBE722FB, 0x82EF85133DE648C4}, // 1e-149 + {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5}, // 1e-148 + {0x318DF905079926A8, 0xCC963FEE10B7D1B3}, // 1e-147 + {0xFDF17746497F7052, 0xFFBBCFE994E5C61F}, // 1e-146 + {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3}, // 1e-145 + {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8}, // 1e-144 + {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B}, // 1e-143 + {0x06BEA10CA65C084E, 0x9C1661A651213E2D}, // 1e-142 + {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8}, // 1e-141 + {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126}, // 1e-140 + {0xF89629465A75E01C, 0x986DDB5C6B3A76B7}, // 1e-139 + {0xF6BBB397F1135823, 0xBE89523386091465}, // 1e-138 + {0x746AA07DED582E2C, 0xEE2BA6C0678B597F}, // 1e-137 + {0xA8C2A44EB4571CDC, 0x94DB483840B717EF}, // 1e-136 + {0x92F34D62616CE413, 0xBA121A4650E4DDEB}, // 1e-135 + {0x77B020BAF9C81D17, 0xE896A0D7E51E1566}, // 1e-134 + {0x0ACE1474DC1D122E, 0x915E2486EF32CD60}, // 1e-133 + {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8}, // 1e-132 + {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6}, // 1e-131 + {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F}, // 1e-130 + {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3}, // 1e-129 + {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0}, // 1e-128 + {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4}, // 1e-127 + {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D}, // 1e-126 + {0xE871C7BF077BA8B7, 0xD89D64D57A607744}, // 1e-125 + {0x11471CD764AD4972, 0x87625F056C7C4A8B}, // 1e-124 + {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D}, // 1e-123 + {0x4AFF1D108D4EC2C3, 0xD389B47879823479}, // 1e-122 + {0xCEDF722A585139BA, 0x843610CB4BF160CB}, // 1e-121 + {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE}, // 1e-120 + {0x733D226229FEEA32, 0xCE947A3DA6A9273E}, // 1e-119 + {0x0806357D5A3F525F, 0x811CCC668829B887}, // 1e-118 + {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8}, // 1e-117 + {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052}, // 1e-116 + {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67}, // 1e-115 + {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0}, // 1e-114 + {0x0A9E795E65D4DF11, 0xC5029163F384A931}, // 1e-113 + {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D}, // 1e-112 + {0x504BCED1BF8E4E45, 0x99EA0196163FA42E}, // 1e-111 + {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39}, // 1e-110 + {0x5D767327BB4E5A4C, 0xF07DA27A82C37088}, // 1e-109 + {0x3A6A07F8D510F86F, 0x964E858C91BA2655}, // 1e-108 + {0x890489F70A55368B, 0xBBE226EFB628AFEA}, // 1e-107 + {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5}, // 1e-106 + {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F}, // 1e-105 + {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB}, // 1e-104 + {0xCC420A6A101D0515, 0xE55990879DDCAABD}, // 1e-103 + {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6}, // 1e-102 + {0x47939822DC96ABF9, 0xB32DF8E9F3546564}, // 1e-101 + {0x59787E2B93BC56F7, 0xDFF9772470297EBD}, // 1e-100 + {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36}, // 1e-99 + {0xEDE622920B6B23F1, 0xAEFAE51477A06B03}, // 1e-98 + {0xE95FAB368E45ECED, 0xDAB99E59958885C4}, // 1e-97 + {0x11DBCB0218EBB414, 0x88B402F7FD75539B}, // 1e-96 + {0xD652BDC29F26A119, 0xAAE103B5FCD2A881}, // 1e-95 + {0x4BE76D3346F0495F, 0xD59944A37C0752A2}, // 1e-94 + {0x6F70A4400C562DDB, 0x857FCAE62D8493A5}, // 1e-93 + {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E}, // 1e-92 + {0x7E2000A41346A7A7, 0xD097AD07A71F26B2}, // 1e-91 + {0x8ED400668C0C28C8, 0x825ECC24C873782F}, // 1e-90 + {0x728900802F0F32FA, 0xA2F67F2DFA90563B}, // 1e-89 + {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA}, // 1e-88 + {0xE2F610C84987BFA8, 0xFEA126B7D78186BC}, // 1e-87 + {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436}, // 1e-86 + {0x91503D1C79720DBB, 0xC6EDE63FA05D3143}, // 1e-85 + {0x75A44C6397CE912A, 0xF8A95FCF88747D94}, // 1e-84 + {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C}, // 1e-83 + {0xFBE85BADCE996168, 0xC24452DA229B021B}, // 1e-82 + {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2}, // 1e-81 + {0xDCCD879FC967D41A, 0x97C560BA6B0919A5}, // 1e-80 + {0x5400E987BBC1C920, 0xBDB6B8E905CB600F}, // 1e-79 + {0x290123E9AAB23B68, 0xED246723473E3813}, // 1e-78 + {0xF9A0B6720AAF6521, 0x9436C0760C86E30B}, // 1e-77 + {0xF808E40E8D5B3E69, 0xB94470938FA89BCE}, // 1e-76 + {0xB60B1D1230B20E04, 0xE7958CB87392C2C2}, // 1e-75 + {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9}, // 1e-74 + {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828}, // 1e-73 + {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232}, // 1e-72 + {0x579C487E5A38AD0E, 0x8D590723948A535F}, // 1e-71 + {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837}, // 1e-70 + {0xF8E431456CF88E65, 0xDCDB1B2798182244}, // 1e-69 + {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B}, // 1e-68 + {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5}, // 1e-67 + {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177}, // 1e-66 + {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA}, // 1e-65 + {0x3F2398D747B36224, 0xA87FEA27A539E9A5}, // 1e-64 + {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E}, // 1e-63 + {0x1953CF68300424AC, 0x83A3EEEEF9153E89}, // 1e-62 + {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B}, // 1e-61 + {0x3792F412CB06794D, 0xCDB02555653131B6}, // 1e-60 + {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11}, // 1e-59 + {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6}, // 1e-58 + {0xF245825A5A445275, 0xC8DE047564D20A8B}, // 1e-57 + {0xEED6E2F0F0D56712, 0xFB158592BE068D2E}, // 1e-56 + {0x55464DD69685606B, 0x9CED737BB6C4183D}, // 1e-55 + {0xAA97E14C3C26B886, 0xC428D05AA4751E4C}, // 1e-54 + {0xD53DD99F4B3066A8, 0xF53304714D9265DF}, // 1e-53 + {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB}, // 1e-52 + {0xDE98520472BDD033, 0xBF8FDB78849A5F96}, // 1e-51 + {0x963E66858F6D4440, 0xEF73D256A5C0F77C}, // 1e-50 + {0xDDE7001379A44AA8, 0x95A8637627989AAD}, // 1e-49 + {0x5560C018580D5D52, 0xBB127C53B17EC159}, // 1e-48 + {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF}, // 1e-47 + {0xCAB3961304CA70E8, 0x9226712162AB070D}, // 1e-46 + {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1}, // 1e-45 + {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05}, // 1e-44 + {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3}, // 1e-43 + {0x55F038B237591ED3, 0xB267ED1940F1C61C}, // 1e-42 + {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3}, // 1e-41 + {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6}, // 1e-40 + {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77}, // 1e-39 + {0x96E7BD358C904A21, 0xD9C7DCED53C72255}, // 1e-38 + {0x7E50D64177DA2E54, 0x881CEA14545C7575}, // 1e-37 + {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2}, // 1e-36 + {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787}, // 1e-35 + {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4}, // 1e-34 + {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61}, // 1e-33 + {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA}, // 1e-32 + {0x80EACF948770CED7, 0x81CEB32C4B43FCF4}, // 1e-31 + {0xA1258379A94D028D, 0xA2425FF75E14FC31}, // 1e-30 + {0x096EE45813A04330, 0xCAD2F7F5359A3B3E}, // 1e-29 + {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D}, // 1e-28 + {0x775EA264CF55347D, 0x9E74D1B791E07E48}, // 1e-27 + {0x95364AFE032A819D, 0xC612062576589DDA}, // 1e-26 + {0x3A83DDBD83F52204, 0xF79687AED3EEC551}, // 1e-25 + {0xC4926A9672793542, 0x9ABE14CD44753B52}, // 1e-24 + {0x75B7053C0F178293, 0xC16D9A0095928A27}, // 1e-23 + {0x5324C68B12DD6338, 0xF1C90080BAF72CB1}, // 1e-22 + {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE}, // 1e-21 + {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA}, // 1e-20 + {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5}, // 1e-19 + {0x3AFF322E62439FCF, 0x9392EE8E921D5D07}, // 1e-18 + {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449}, // 1e-17 + {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B}, // 1e-16 + {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9}, // 1e-15 + {0x538484C19EF38C94, 0xB424DC35095CD80F}, // 1e-14 + {0x2865A5F206B06FB9, 0xE12E13424BB40E13}, // 1e-13 + {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB}, // 1e-12 + {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE}, // 1e-11 + {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE}, // 1e-10 + {0x31680A88F8953030, 0x89705F4136B4A597}, // 1e-9 + {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC}, // 1e-8 + {0x3D32907604691B4C, 0xD6BF94D5E57A42BC}, // 1e-7 + {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5}, // 1e-6 + {0x0FCF80DC33721D53, 0xA7C5AC471B478423}, // 1e-5 + {0xD3C36113404EA4A8, 0xD1B71758E219652B}, // 1e-4 + {0x645A1CAC083126E9, 0x83126E978D4FDF3B}, // 1e-3 + {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A}, // 1e-2 + {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC}, // 1e-1 + {0x0000000000000000, 0x8000000000000000}, // 1e0 + {0x0000000000000000, 0xA000000000000000}, // 1e1 + {0x0000000000000000, 0xC800000000000000}, // 1e2 + {0x0000000000000000, 0xFA00000000000000}, // 1e3 + {0x0000000000000000, 0x9C40000000000000}, // 1e4 + {0x0000000000000000, 0xC350000000000000}, // 1e5 + {0x0000000000000000, 0xF424000000000000}, // 1e6 + {0x0000000000000000, 0x9896800000000000}, // 1e7 + {0x0000000000000000, 0xBEBC200000000000}, // 1e8 + {0x0000000000000000, 0xEE6B280000000000}, // 1e9 + {0x0000000000000000, 0x9502F90000000000}, // 1e10 + {0x0000000000000000, 0xBA43B74000000000}, // 1e11 + {0x0000000000000000, 0xE8D4A51000000000}, // 1e12 + {0x0000000000000000, 0x9184E72A00000000}, // 1e13 + {0x0000000000000000, 0xB5E620F480000000}, // 1e14 + {0x0000000000000000, 0xE35FA931A0000000}, // 1e15 + {0x0000000000000000, 0x8E1BC9BF04000000}, // 1e16 + {0x0000000000000000, 0xB1A2BC2EC5000000}, // 1e17 + {0x0000000000000000, 0xDE0B6B3A76400000}, // 1e18 + {0x0000000000000000, 0x8AC7230489E80000}, // 1e19 + {0x0000000000000000, 0xAD78EBC5AC620000}, // 1e20 + {0x0000000000000000, 0xD8D726B7177A8000}, // 1e21 + {0x0000000000000000, 0x878678326EAC9000}, // 1e22 + {0x0000000000000000, 0xA968163F0A57B400}, // 1e23 + {0x0000000000000000, 0xD3C21BCECCEDA100}, // 1e24 + {0x0000000000000000, 0x84595161401484A0}, // 1e25 + {0x0000000000000000, 0xA56FA5B99019A5C8}, // 1e26 + {0x0000000000000000, 0xCECB8F27F4200F3A}, // 1e27 + {0x4000000000000000, 0x813F3978F8940984}, // 1e28 + {0x5000000000000000, 0xA18F07D736B90BE5}, // 1e29 + {0xA400000000000000, 0xC9F2C9CD04674EDE}, // 1e30 + {0x4D00000000000000, 0xFC6F7C4045812296}, // 1e31 + {0xF020000000000000, 0x9DC5ADA82B70B59D}, // 1e32 + {0x6C28000000000000, 0xC5371912364CE305}, // 1e33 + {0xC732000000000000, 0xF684DF56C3E01BC6}, // 1e34 + {0x3C7F400000000000, 0x9A130B963A6C115C}, // 1e35 + {0x4B9F100000000000, 0xC097CE7BC90715B3}, // 1e36 + {0x1E86D40000000000, 0xF0BDC21ABB48DB20}, // 1e37 + {0x1314448000000000, 0x96769950B50D88F4}, // 1e38 + {0x17D955A000000000, 0xBC143FA4E250EB31}, // 1e39 + {0x5DCFAB0800000000, 0xEB194F8E1AE525FD}, // 1e40 + {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE}, // 1e41 + {0xF14A3D9E40000000, 0xB7ABC627050305AD}, // 1e42 + {0x6D9CCD05D0000000, 0xE596B7B0C643C719}, // 1e43 + {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F}, // 1e44 + {0xDDA2802C8A800000, 0xB35DBF821AE4F38B}, // 1e45 + {0xD50B2037AD200000, 0xE0352F62A19E306E}, // 1e46 + {0x4526F422CC340000, 0x8C213D9DA502DE45}, // 1e47 + {0x9670B12B7F410000, 0xAF298D050E4395D6}, // 1e48 + {0x3C0CDD765F114000, 0xDAF3F04651D47B4C}, // 1e49 + {0xA5880A69FB6AC800, 0x88D8762BF324CD0F}, // 1e50 + {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053}, // 1e51 + {0x72A4904598D6D880, 0xD5D238A4ABE98068}, // 1e52 + {0x47A6DA2B7F864750, 0x85A36366EB71F041}, // 1e53 + {0x999090B65F67D924, 0xA70C3C40A64E6C51}, // 1e54 + {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765}, // 1e55 + {0xBFF8F10E7A8921A4, 0x82818F1281ED449F}, // 1e56 + {0xAFF72D52192B6A0D, 0xA321F2D7226895C7}, // 1e57 + {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39}, // 1e58 + {0x02F236D04753D5B4, 0xFEE50B7025C36A08}, // 1e59 + {0x01D762422C946590, 0x9F4F2726179A2245}, // 1e60 + {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6}, // 1e61 + {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B}, // 1e62 + {0x63CC55F49F88EB2F, 0x9B934C3B330C8577}, // 1e63 + {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5}, // 1e64 + {0x8BEF464E3945EF7A, 0xF316271C7FC3908A}, // 1e65 + {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56}, // 1e66 + {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC}, // 1e67 + {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27}, // 1e68 + {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8}, // 1e69 + {0xB3E2FD538E122B44, 0xB975D6B6EE39E436}, // 1e70 + {0x60DBBCA87196B616, 0xE7D34C64A9C85D44}, // 1e71 + {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A}, // 1e72 + {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD}, // 1e73 + {0xC696963C7EED2DD1, 0xE264589A4DCDAB14}, // 1e74 + {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC}, // 1e75 + {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8}, // 1e76 + {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912}, // 1e77 + {0x6E3569326C784337, 0x8A2DBF142DFCC7AB}, // 1e78 + {0x49C2C37F07965404, 0xACB92ED9397BF996}, // 1e79 + {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB}, // 1e80 + {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD}, // 1e81 + {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC}, // 1e82 + {0xF50A3FA490C30190, 0xD2D80DB02AABD62B}, // 1e83 + {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB}, // 1e84 + {0x577001B891185938, 0xA4B8CAB1A1563F52}, // 1e85 + {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26}, // 1e86 + {0x544F8158315B05B4, 0x80B05E5AC60B6178}, // 1e87 + {0x696361AE3DB1C721, 0xA0DC75F1778E39D6}, // 1e88 + {0x03BC3A19CD1E38E9, 0xC913936DD571C84C}, // 1e89 + {0x04AB48A04065C723, 0xFB5878494ACE3A5F}, // 1e90 + {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B}, // 1e91 + {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A}, // 1e92 + {0xCA8F44EC7EE36479, 0xF5746577930D6500}, // 1e93 + {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20}, // 1e94 + {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8}, // 1e95 + {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2}, // 1e96 + {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5}, // 1e97 + {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F}, // 1e98 + {0xF52D09D71A3293BD, 0xEA1575143CF97226}, // 1e99 + {0x593C2626705F9C56, 0x924D692CA61BE758}, // 1e100 + {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E}, // 1e101 + {0x0B6DFB9C0F956447, 0xE498F455C38B997A}, // 1e102 + {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC}, // 1e103 + {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7}, // 1e104 + {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1}, // 1e105 + {0xBD79E0D20082EE74, 0x8B865B215899F46C}, // 1e106 + {0xECD8590680A3AA11, 0xAE67F1E9AEC07187}, // 1e107 + {0xE80E6F4820CC9495, 0xDA01EE641A708DE9}, // 1e108 + {0x3109058D147FDCDD, 0x884134FE908658B2}, // 1e109 + {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE}, // 1e110 + {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96}, // 1e111 + {0x03E2CF6BC604DDB0, 0x850FADC09923329E}, // 1e112 + {0x84DB8346B786151C, 0xA6539930BF6BFF45}, // 1e113 + {0xE612641865679A63, 0xCFE87F7CEF46FF16}, // 1e114 + {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E}, // 1e115 + {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749}, // 1e116 + {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C}, // 1e117 + {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63}, // 1e118 + {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E}, // 1e119 + {0xB281E1FD541501B8, 0xC646D63501A1511D}, // 1e120 + {0x1F225A7CA91A4226, 0xF7D88BC24209A565}, // 1e121 + {0x3375788DE9B06958, 0x9AE757596946075F}, // 1e122 + {0x0052D6B1641C83AE, 0xC1A12D2FC3978937}, // 1e123 + {0xC0678C5DBD23A49A, 0xF209787BB47D6B84}, // 1e124 + {0xF840B7BA963646E0, 0x9745EB4D50CE6332}, // 1e125 + {0xB650E5A93BC3D898, 0xBD176620A501FBFF}, // 1e126 + {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF}, // 1e127 + {0xC66F336C36B10137, 0x93BA47C980E98CDF}, // 1e128 + {0xB80B0047445D4184, 0xB8A8D9BBE123F017}, // 1e129 + {0xA60DC059157491E5, 0xE6D3102AD96CEC1D}, // 1e130 + {0x87C89837AD68DB2F, 0x9043EA1AC7E41392}, // 1e131 + {0x29BABE4598C311FB, 0xB454E4A179DD1877}, // 1e132 + {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94}, // 1e133 + {0x1899E4A65F58660C, 0x8CE2529E2734BB1D}, // 1e134 + {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4}, // 1e135 + {0x76707543F4FA1F73, 0xDC21A1171D42645D}, // 1e136 + {0x6A06494A791C53A8, 0x899504AE72497EBA}, // 1e137 + {0x0487DB9D17636892, 0xABFA45DA0EDBDE69}, // 1e138 + {0x45A9D2845D3C42B6, 0xD6F8D7509292D603}, // 1e139 + {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2}, // 1e140 + {0x8E6CAC7768D7141E, 0xA7F26836F282B732}, // 1e141 + {0x3207D795430CD926, 0xD1EF0244AF2364FF}, // 1e142 + {0x7F44E6BD49E807B8, 0x8335616AED761F1F}, // 1e143 + {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7}, // 1e144 + {0x36DBA887C37A8C0F, 0xCD036837130890A1}, // 1e145 + {0xC2494954DA2C9789, 0x802221226BE55A64}, // 1e146 + {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD}, // 1e147 + {0x6F92829494E5ACC7, 0xC83553C5C8965D3D}, // 1e148 + {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C}, // 1e149 + {0xFF2A760414536EFB, 0x9C69A97284B578D7}, // 1e150 + {0xFEF5138519684ABA, 0xC38413CF25E2D70D}, // 1e151 + {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1}, // 1e152 + {0xEF2F773FFBD97A61, 0x98BF2F79D5993802}, // 1e153 + {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603}, // 1e154 + {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784}, // 1e155 + {0xDD945A747BF26183, 0x952AB45CFA97A0B2}, // 1e156 + {0x94F971119AEEF9E4, 0xBA756174393D88DF}, // 1e157 + {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17}, // 1e158 + {0xAC62E055C10AB33A, 0x91ABB422CCB812EE}, // 1e159 + {0x577B986B314D6009, 0xB616A12B7FE617AA}, // 1e160 + {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94}, // 1e161 + {0x14588F13BE847307, 0x8E41ADE9FBEBC27D}, // 1e162 + {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C}, // 1e163 + {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3}, // 1e164 + {0x25DE7BB9480D5854, 0x8AEC23D680043BEE}, // 1e165 + {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9}, // 1e166 + {0x1B2BA1518094DA04, 0xD910F7FF28069DA4}, // 1e167 + {0x90FB44D2F05D0842, 0x87AA9AFF79042286}, // 1e168 + {0x353A1607AC744A53, 0xA99541BF57452B28}, // 1e169 + {0x42889B8997915CE8, 0xD3FA922F2D1675F2}, // 1e170 + {0x69956135FEBADA11, 0x847C9B5D7C2E09B7}, // 1e171 + {0x43FAB9837E699095, 0xA59BC234DB398C25}, // 1e172 + {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E}, // 1e173 + {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D}, // 1e174 + {0x6462D92A69731732, 0xA1BA1BA79E1632DC}, // 1e175 + {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93}, // 1e176 + {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78}, // 1e177 + {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB}, // 1e178 + {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916}, // 1e179 + {0x8AAD549E57273D45, 0xF6C69A72A3989F5B}, // 1e180 + {0x36AC54E2F678864B, 0x9A3C2087A63F6399}, // 1e181 + {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F}, // 1e182 + {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F}, // 1e183 + {0x9F644AE5A4B1B325, 0x969EB7C47859E743}, // 1e184 + {0x873D5D9F0DDE1FEE, 0xBC4665B596706114}, // 1e185 + {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959}, // 1e186 + {0x09A7F12442D588F2, 0x9316FF75DD87CBD8}, // 1e187 + {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE}, // 1e188 + {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81}, // 1e189 + {0xF96E017D694487BC, 0x8FA475791A569D10}, // 1e190 + {0x37C981DCC395A9AC, 0xB38D92D760EC4455}, // 1e191 + {0x85BBE253F47B1417, 0xE070F78D3927556A}, // 1e192 + {0x93956D7478CCEC8E, 0x8C469AB843B89562}, // 1e193 + {0x387AC8D1970027B2, 0xAF58416654A6BABB}, // 1e194 + {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A}, // 1e195 + {0x441FECE3BDF81F03, 0x88FCF317F22241E2}, // 1e196 + {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A}, // 1e197 + {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1}, // 1e198 + {0xF6872D5667844E49, 0x85C7056562757456}, // 1e199 + {0xB428F8AC016561DB, 0xA738C6BEBB12D16C}, // 1e200 + {0xE13336D701BEBA52, 0xD106F86E69D785C7}, // 1e201 + {0xECC0024661173473, 0x82A45B450226B39C}, // 1e202 + {0x27F002D7F95D0190, 0xA34D721642B06084}, // 1e203 + {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5}, // 1e204 + {0x7E67047175A15271, 0xFF290242C83396CE}, // 1e205 + {0x0F0062C6E984D386, 0x9F79A169BD203E41}, // 1e206 + {0x52C07B78A3E60868, 0xC75809C42C684DD1}, // 1e207 + {0xA7709A56CCDF8A82, 0xF92E0C3537826145}, // 1e208 + {0x88A66076400BB691, 0x9BBCC7A142B17CCB}, // 1e209 + {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE}, // 1e210 + {0x0583F6B8C4124D43, 0xF356F7EBF83552FE}, // 1e211 + {0xC3727A337A8B704A, 0x98165AF37B2153DE}, // 1e212 + {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6}, // 1e213 + {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C}, // 1e214 + {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7}, // 1e215 + {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1}, // 1e216 + {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99}, // 1e217 + {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0}, // 1e218 + {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8}, // 1e219 + {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A}, // 1e220 + {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24}, // 1e221 + {0x7425A83E872C5F47, 0xB10D8E1456105DAD}, // 1e222 + {0xD12F124E28F77719, 0xDD50F1996B947518}, // 1e223 + {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F}, // 1e224 + {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B}, // 1e225 + {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A}, // 1e226 + {0x65ACFAEC34810A71, 0x8714A775E3E95C78}, // 1e227 + {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396}, // 1e228 + {0x1EDE48111209A050, 0xD31045A8341CA07C}, // 1e229 + {0x934AED0AAB460432, 0x83EA2B892091E44D}, // 1e230 + {0xF81DA84D5617853F, 0xA4E4B66B68B65D60}, // 1e231 + {0x36251260AB9D668E, 0xCE1DE40642E3F4B9}, // 1e232 + {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3}, // 1e233 + {0xB24CF65B8612F81F, 0xA1075A24E4421730}, // 1e234 + {0xDEE033F26797B627, 0xC94930AE1D529CFC}, // 1e235 + {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C}, // 1e236 + {0x8E1F289560EE864E, 0x9D412E0806E88AA5}, // 1e237 + {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E}, // 1e238 + {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2}, // 1e239 + {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765}, // 1e240 + {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F}, // 1e241 + {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E}, // 1e242 + {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9}, // 1e243 + {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F}, // 1e244 + {0x84C86189216DC5ED, 0xEA53DF5FD18D5513}, // 1e245 + {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C}, // 1e246 + {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77}, // 1e247 + {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515}, // 1e248 + {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D}, // 1e249 + {0x743E20E9EF511012, 0xB2C71D5BCA9023F8}, // 1e250 + {0x914DA9246B255416, 0xDF78E4B2BD342CF6}, // 1e251 + {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A}, // 1e252 + {0xA184AC2473B529B1, 0xAE9672ABA3D0C320}, // 1e253 + {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8}, // 1e254 + {0x7E2FA67C7A658892, 0x8865899617FB1871}, // 1e255 + {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D}, // 1e256 + {0x552A74227F3EA565, 0xD51EA6FA85785631}, // 1e257 + {0xD53A88958F87275F, 0x8533285C936B35DE}, // 1e258 + {0x8A892ABAF368F137, 0xA67FF273B8460356}, // 1e259 + {0x2D2B7569B0432D85, 0xD01FEF10A657842C}, // 1e260 + {0x9C3B29620E29FC73, 0x8213F56A67F6B29B}, // 1e261 + {0x8349F3BA91B47B8F, 0xA298F2C501F45F42}, // 1e262 + {0x241C70A936219A73, 0xCB3F2F7642717713}, // 1e263 + {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7}, // 1e264 + {0xF4363804324A40AA, 0x9EC95D1463E8A506}, // 1e265 + {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48}, // 1e266 + {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA}, // 1e267 + {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128}, // 1e268 + {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72}, // 1e269 + {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF}, // 1e270 + {0xD5BE0503E085D813, 0x976E41088617CA01}, // 1e271 + {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82}, // 1e272 + {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2}, // 1e273 + {0xCABB90E5C942B503, 0x93E1AB8252F33B45}, // 1e274 + {0x3D6A751F3B936243, 0xB8DA1662E7B00A17}, // 1e275 + {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D}, // 1e276 + {0x27FB2B80668B24C5, 0x906A617D450187E2}, // 1e277 + {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA}, // 1e278 + {0x5E7873F8A0396973, 0xE1A63853BBD26451}, // 1e279 + {0xDB0B487B6423E1E8, 0x8D07E33455637EB2}, // 1e280 + {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F}, // 1e281 + {0x7641A140CC7810FB, 0xDC5C5301C56B75F7}, // 1e282 + {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA}, // 1e283 + {0x546345FA9FBDCD44, 0xAC2820D9623BF429}, // 1e284 + {0xA97C177947AD4095, 0xD732290FBACAF133}, // 1e285 + {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0}, // 1e286 + {0x5C68F256BFFF5A74, 0xA81F301449EE8C70}, // 1e287 + {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C}, // 1e288 +}; + +// wuffs_base__private_implementation__f64_powers_of_10 holds powers of 10 that +// can be exactly represented by a float64 (what C calls a double). +static const double wuffs_base__private_implementation__f64_powers_of_10[23] = { + 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, + 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, +}; + +// ---------------- IEEE 754 Floating Point + +WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16 // +wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f) { + uint64_t u = 0; + if (sizeof(uint64_t) == sizeof(double)) { + memcpy(&u, &f, sizeof(uint64_t)); + } + uint16_t neg = ((uint16_t)((u >> 63) << 15)); + u &= 0x7FFFFFFFFFFFFFFF; + uint64_t exp = u >> 52; + uint64_t man = u & 0x000FFFFFFFFFFFFF; + + if (exp == 0x7FF) { + if (man == 0) { // Infinity. + wuffs_base__lossy_value_u16 ret; + ret.value = neg | 0x7C00; + ret.lossy = false; + return ret; + } + // NaN. Shift the 52 mantissa bits to 10 mantissa bits, keeping the most + // significant mantissa bit (quiet vs signaling NaNs). Also set the low 9 + // bits of ret.value so that the 10-bit mantissa is non-zero. + wuffs_base__lossy_value_u16 ret; + ret.value = neg | 0x7DFF | ((uint16_t)(man >> 42)); + ret.lossy = false; + return ret; + + } else if (exp > 0x40E) { // Truncate to the largest finite f16. + wuffs_base__lossy_value_u16 ret; + ret.value = neg | 0x7BFF; + ret.lossy = true; + return ret; + + } else if (exp <= 0x3E6) { // Truncate to zero. + wuffs_base__lossy_value_u16 ret; + ret.value = neg; + ret.lossy = (u != 0); + return ret; + + } else if (exp <= 0x3F0) { // Normal f64, subnormal f16. + // Convert from a 53-bit mantissa (after realizing the implicit bit) to a + // 10-bit mantissa and then adjust for the exponent. + man |= 0x0010000000000000; + uint32_t shift = ((uint32_t)(1051 - exp)); // 1051 = 0x3F0 + 53 - 10. + uint64_t shifted_man = man >> shift; + wuffs_base__lossy_value_u16 ret; + ret.value = neg | ((uint16_t)shifted_man); + ret.lossy = (shifted_man << shift) != man; + return ret; + } + + // Normal f64, normal f16. + + // Re-bias from 1023 to 15 and shift above f16's 10 mantissa bits. + exp = (exp - 1008) << 10; // 1008 = 1023 - 15 = 0x3FF - 0xF. + + // Convert from a 52-bit mantissa (excluding the implicit bit) to a 10-bit + // mantissa (again excluding the implicit bit). We lose some information if + // any of the bottom 42 bits are non-zero. + wuffs_base__lossy_value_u16 ret; + ret.value = neg | ((uint16_t)exp) | ((uint16_t)(man >> 42)); + ret.lossy = (man << 22) != 0; + return ret; +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32 // +wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f) { + uint64_t u = 0; + if (sizeof(uint64_t) == sizeof(double)) { + memcpy(&u, &f, sizeof(uint64_t)); + } + uint32_t neg = ((uint32_t)(u >> 63)) << 31; + u &= 0x7FFFFFFFFFFFFFFF; + uint64_t exp = u >> 52; + uint64_t man = u & 0x000FFFFFFFFFFFFF; + + if (exp == 0x7FF) { + if (man == 0) { // Infinity. + wuffs_base__lossy_value_u32 ret; + ret.value = neg | 0x7F800000; + ret.lossy = false; + return ret; + } + // NaN. Shift the 52 mantissa bits to 23 mantissa bits, keeping the most + // significant mantissa bit (quiet vs signaling NaNs). Also set the low 22 + // bits of ret.value so that the 23-bit mantissa is non-zero. + wuffs_base__lossy_value_u32 ret; + ret.value = neg | 0x7FBFFFFF | ((uint32_t)(man >> 29)); + ret.lossy = false; + return ret; + + } else if (exp > 0x47E) { // Truncate to the largest finite f32. + wuffs_base__lossy_value_u32 ret; + ret.value = neg | 0x7F7FFFFF; + ret.lossy = true; + return ret; + + } else if (exp <= 0x369) { // Truncate to zero. + wuffs_base__lossy_value_u32 ret; + ret.value = neg; + ret.lossy = (u != 0); + return ret; + + } else if (exp <= 0x380) { // Normal f64, subnormal f32. + // Convert from a 53-bit mantissa (after realizing the implicit bit) to a + // 23-bit mantissa and then adjust for the exponent. + man |= 0x0010000000000000; + uint32_t shift = ((uint32_t)(926 - exp)); // 926 = 0x380 + 53 - 23. + uint64_t shifted_man = man >> shift; + wuffs_base__lossy_value_u32 ret; + ret.value = neg | ((uint32_t)shifted_man); + ret.lossy = (shifted_man << shift) != man; + return ret; + } + + // Normal f64, normal f32. + + // Re-bias from 1023 to 127 and shift above f32's 23 mantissa bits. + exp = (exp - 896) << 23; // 896 = 1023 - 127 = 0x3FF - 0x7F. + + // Convert from a 52-bit mantissa (excluding the implicit bit) to a 23-bit + // mantissa (again excluding the implicit bit). We lose some information if + // any of the bottom 29 bits are non-zero. + wuffs_base__lossy_value_u32 ret; + ret.value = neg | ((uint32_t)exp) | ((uint32_t)(man >> 29)); + ret.lossy = (man << 35) != 0; + return ret; +} + +// -------- + +#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE 2047 +#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION 800 + +// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL is the largest N +// such that ((10 << N) < (1 << 64)). +#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL 60 + +// wuffs_base__private_implementation__high_prec_dec (abbreviated as HPD) is a +// fixed precision floating point decimal number, augmented with ±infinity +// values, but it cannot represent NaN (Not a Number). +// +// "High precision" means that the mantissa holds 800 decimal digits. 800 is +// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION. +// +// An HPD isn't for general purpose arithmetic, only for conversions to and +// from IEEE 754 double-precision floating point, where the largest and +// smallest positive, finite values are approximately 1.8e+308 and 4.9e-324. +// HPD exponents above +2047 mean infinity, below -2047 mean zero. The ±2047 +// bounds are further away from zero than ±(324 + 800), where 800 and 2047 is +// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION and +// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE. +// +// digits[.. num_digits] are the number's digits in big-endian order. The +// uint8_t values are in the range [0 ..= 9], not ['0' ..= '9'], where e.g. '7' +// is the ASCII value 0x37. +// +// decimal_point is the index (within digits) of the decimal point. It may be +// negative or be larger than num_digits, in which case the explicit digits are +// padded with implicit zeroes. +// +// For example, if num_digits is 3 and digits is "\x07\x08\x09": +// - A decimal_point of -2 means ".00789" +// - A decimal_point of -1 means ".0789" +// - A decimal_point of +0 means ".789" +// - A decimal_point of +1 means "7.89" +// - A decimal_point of +2 means "78.9" +// - A decimal_point of +3 means "789." +// - A decimal_point of +4 means "7890." +// - A decimal_point of +5 means "78900." +// +// As above, a decimal_point higher than +2047 means that the overall value is +// infinity, lower than -2047 means zero. +// +// negative is a sign bit. An HPD can distinguish positive and negative zero. +// +// truncated is whether there are more than +// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION digits, and at +// least one of those extra digits are non-zero. The existence of long-tail +// digits can affect rounding. +// +// The "all fields are zero" value is valid, and represents the number +0. +typedef struct wuffs_base__private_implementation__high_prec_dec__struct { + uint32_t num_digits; + int32_t decimal_point; + bool negative; + bool truncated; + uint8_t digits[WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION]; +} wuffs_base__private_implementation__high_prec_dec; + +// wuffs_base__private_implementation__high_prec_dec__trim trims trailing +// zeroes from the h->digits[.. h->num_digits] slice. They have no benefit, +// since we explicitly track h->decimal_point. +// +// Preconditions: +// - h is non-NULL. +static inline void // +wuffs_base__private_implementation__high_prec_dec__trim( + wuffs_base__private_implementation__high_prec_dec* h) { + while ((h->num_digits > 0) && (h->digits[h->num_digits - 1] == 0)) { + h->num_digits--; + } +} + +// wuffs_base__private_implementation__high_prec_dec__assign sets h to +// represent the number x. +// +// Preconditions: +// - h is non-NULL. +static void // +wuffs_base__private_implementation__high_prec_dec__assign( + wuffs_base__private_implementation__high_prec_dec* h, + uint64_t x, + bool negative) { + uint32_t n = 0; + + // Set h->digits. + if (x > 0) { + // Calculate the digits, working right-to-left. After we determine n (how + // many digits there are), copy from buf to h->digits. + // + // UINT64_MAX, 18446744073709551615, is 20 digits long. It can be faster to + // copy a constant number of bytes than a variable number (20 instead of + // n). Make buf large enough (and start writing to it from the middle) so + // that can we always copy 20 bytes: the slice buf[(20-n) .. (40-n)]. + uint8_t buf[40] = {0}; + uint8_t* ptr = &buf[20]; + do { + uint64_t remaining = x / 10; + x -= remaining * 10; + ptr--; + *ptr = (uint8_t)x; + n++; + x = remaining; + } while (x > 0); + memcpy(h->digits, ptr, 20); + } + + // Set h's other fields. + h->num_digits = n; + h->decimal_point = (int32_t)n; + h->negative = negative; + h->truncated = false; + wuffs_base__private_implementation__high_prec_dec__trim(h); +} + +static wuffs_base__status // +wuffs_base__private_implementation__high_prec_dec__parse( + wuffs_base__private_implementation__high_prec_dec* h, + wuffs_base__slice_u8 s, + uint32_t options) { + if (!h) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + h->num_digits = 0; + h->decimal_point = 0; + h->negative = false; + h->truncated = false; + + uint8_t* p = s.ptr; + uint8_t* q = s.ptr + s.len; + + if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { + for (;; p++) { + if (p >= q) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } else if (*p != '_') { + break; + } + } + } + + // Parse sign. + do { + if (*p == '+') { + p++; + } else if (*p == '-') { + h->negative = true; + p++; + } else { + break; + } + if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { + for (;; p++) { + if (p >= q) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } else if (*p != '_') { + break; + } + } + } + } while (0); + + // Parse digits, up to (and including) a '.', 'E' or 'e'. Examples for each + // limb in this if-else chain: + // - "0.789" + // - "1002.789" + // - ".789" + // - Other (invalid input). + uint32_t nd = 0; + int32_t dp = 0; + bool no_digits_before_separator = false; + if (('0' == *p) && + !(options & + WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES)) { + p++; + for (;; p++) { + if (p >= q) { + goto after_all; + } else if (*p == + ((options & + WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) + ? ',' + : '.')) { + p++; + goto after_sep; + } else if ((*p == 'E') || (*p == 'e')) { + p++; + goto after_exp; + } else if ((*p != '_') || + !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + } + + } else if (('0' <= *p) && (*p <= '9')) { + if (*p == '0') { + for (; (p < q) && (*p == '0'); p++) { + } + } else { + h->digits[nd++] = (uint8_t)(*p - '0'); + dp = (int32_t)nd; + p++; + } + + for (;; p++) { + if (p >= q) { + goto after_all; + } else if (('0' <= *p) && (*p <= '9')) { + if (nd < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { + h->digits[nd++] = (uint8_t)(*p - '0'); + dp = (int32_t)nd; + } else if ('0' != *p) { + // Long-tail non-zeroes set the truncated bit. + h->truncated = true; + } + } else if (*p == + ((options & + WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) + ? ',' + : '.')) { + p++; + goto after_sep; + } else if ((*p == 'E') || (*p == 'e')) { + p++; + goto after_exp; + } else if ((*p != '_') || + !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + } + + } else if (*p == ((options & + WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) + ? ',' + : '.')) { + p++; + no_digits_before_separator = true; + + } else { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + +after_sep: + for (;; p++) { + if (p >= q) { + goto after_all; + } else if ('0' == *p) { + if (nd == 0) { + // Track leading zeroes implicitly. + dp--; + } else if (nd < + WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { + h->digits[nd++] = (uint8_t)(*p - '0'); + } + } else if (('0' < *p) && (*p <= '9')) { + if (nd < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { + h->digits[nd++] = (uint8_t)(*p - '0'); + } else { + // Long-tail non-zeroes set the truncated bit. + h->truncated = true; + } + } else if ((*p == 'E') || (*p == 'e')) { + p++; + goto after_exp; + } else if ((*p != '_') || + !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + } + +after_exp: + do { + if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { + for (;; p++) { + if (p >= q) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } else if (*p != '_') { + break; + } + } + } + + int32_t exp_sign = +1; + if (*p == '+') { + p++; + } else if (*p == '-') { + exp_sign = -1; + p++; + } + + int32_t exp = 0; + const int32_t exp_large = + WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE + + WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION; + bool saw_exp_digits = false; + for (; p < q; p++) { + if ((*p == '_') && + (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { + // No-op. + } else if (('0' <= *p) && (*p <= '9')) { + saw_exp_digits = true; + if (exp < exp_large) { + exp = (10 * exp) + ((int32_t)(*p - '0')); + } + } else { + break; + } + } + if (!saw_exp_digits) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + dp += exp_sign * exp; + } while (0); + +after_all: + if (p != q) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + h->num_digits = nd; + if (nd == 0) { + if (no_digits_before_separator) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + h->decimal_point = 0; + } else if (dp < + -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { + h->decimal_point = + -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE - 1; + } else if (dp > + +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { + h->decimal_point = + +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE + 1; + } else { + h->decimal_point = dp; + } + wuffs_base__private_implementation__high_prec_dec__trim(h); + return wuffs_base__make_status(NULL); +} + +// -------- + +// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits +// returns the number of additional decimal digits when left-shifting by shift. +// +// See below for preconditions. +static uint32_t // +wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits( + wuffs_base__private_implementation__high_prec_dec* h, + uint32_t shift) { + // Masking with 0x3F should be unnecessary (assuming the preconditions) but + // it's cheap and ensures that we don't overflow the + // wuffs_base__private_implementation__hpd_left_shift array. + shift &= 63; + + uint32_t x_a = wuffs_base__private_implementation__hpd_left_shift[shift]; + uint32_t x_b = wuffs_base__private_implementation__hpd_left_shift[shift + 1]; + uint32_t num_new_digits = x_a >> 11; + uint32_t pow5_a = 0x7FF & x_a; + uint32_t pow5_b = 0x7FF & x_b; + + const uint8_t* pow5 = + &wuffs_base__private_implementation__powers_of_5[pow5_a]; + uint32_t i = 0; + uint32_t n = pow5_b - pow5_a; + for (; i < n; i++) { + if (i >= h->num_digits) { + return num_new_digits - 1; + } else if (h->digits[i] == pow5[i]) { + continue; + } else if (h->digits[i] < pow5[i]) { + return num_new_digits - 1; + } else { + return num_new_digits; + } + } + return num_new_digits; +} + +// -------- + +// wuffs_base__private_implementation__high_prec_dec__rounded_integer returns +// the integral (non-fractional) part of h, provided that it is 18 or fewer +// decimal digits. For 19 or more digits, it returns UINT64_MAX. Note that: +// - (1 << 53) is 9007199254740992, which has 16 decimal digits. +// - (1 << 56) is 72057594037927936, which has 17 decimal digits. +// - (1 << 59) is 576460752303423488, which has 18 decimal digits. +// - (1 << 63) is 9223372036854775808, which has 19 decimal digits. +// and that IEEE 754 double precision has 52 mantissa bits. +// +// That integral part is rounded-to-even: rounding 7.5 or 8.5 both give 8. +// +// h's negative bit is ignored: rounding -8.6 returns 9. +// +// See below for preconditions. +static uint64_t // +wuffs_base__private_implementation__high_prec_dec__rounded_integer( + wuffs_base__private_implementation__high_prec_dec* h) { + if ((h->num_digits == 0) || (h->decimal_point < 0)) { + return 0; + } else if (h->decimal_point > 18) { + return UINT64_MAX; + } + + uint32_t dp = (uint32_t)(h->decimal_point); + uint64_t n = 0; + uint32_t i = 0; + for (; i < dp; i++) { + n = (10 * n) + ((i < h->num_digits) ? h->digits[i] : 0); + } + + bool round_up = false; + if (dp < h->num_digits) { + round_up = h->digits[dp] >= 5; + if ((h->digits[dp] == 5) && (dp + 1 == h->num_digits)) { + // We are exactly halfway. If we're truncated, round up, otherwise round + // to even. + round_up = h->truncated || // + ((dp > 0) && (1 & h->digits[dp - 1])); + } + } + if (round_up) { + n++; + } + + return n; +} + +// wuffs_base__private_implementation__high_prec_dec__small_xshift shifts h's +// number (where 'x' is 'l' or 'r' for left or right) by a small shift value. +// +// Preconditions: +// - h is non-NULL. +// - h->decimal_point is "not extreme". +// - shift is non-zero. +// - shift is "a small shift". +// +// "Not extreme" means within +// ±WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE. +// +// "A small shift" means not more than +// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL. +// +// wuffs_base__private_implementation__high_prec_dec__rounded_integer and +// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits +// have the same preconditions. +// +// wuffs_base__private_implementation__high_prec_dec__lshift keeps the first +// two preconditions but not the last two. Its shift argument is signed and +// does not need to be "small": zero is a no-op, positive means left shift and +// negative means right shift. + +static void // +wuffs_base__private_implementation__high_prec_dec__small_lshift( + wuffs_base__private_implementation__high_prec_dec* h, + uint32_t shift) { + if (h->num_digits == 0) { + return; + } + uint32_t num_new_digits = + wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits( + h, shift); + uint32_t rx = h->num_digits - 1; // Read index. + uint32_t wx = h->num_digits - 1 + num_new_digits; // Write index. + uint64_t n = 0; + + // Repeat: pick up a digit, put down a digit, right to left. + while (((int32_t)rx) >= 0) { + n += ((uint64_t)(h->digits[rx])) << shift; + uint64_t quo = n / 10; + uint64_t rem = n - (10 * quo); + if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { + h->digits[wx] = (uint8_t)rem; + } else if (rem > 0) { + h->truncated = true; + } + n = quo; + wx--; + rx--; + } + + // Put down leading digits, right to left. + while (n > 0) { + uint64_t quo = n / 10; + uint64_t rem = n - (10 * quo); + if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { + h->digits[wx] = (uint8_t)rem; + } else if (rem > 0) { + h->truncated = true; + } + n = quo; + wx--; + } + + // Finish. + h->num_digits += num_new_digits; + if (h->num_digits > + WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { + h->num_digits = WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION; + } + h->decimal_point += (int32_t)num_new_digits; + wuffs_base__private_implementation__high_prec_dec__trim(h); +} + +static void // +wuffs_base__private_implementation__high_prec_dec__small_rshift( + wuffs_base__private_implementation__high_prec_dec* h, + uint32_t shift) { + uint32_t rx = 0; // Read index. + uint32_t wx = 0; // Write index. + uint64_t n = 0; + + // Pick up enough leading digits to cover the first shift. + while ((n >> shift) == 0) { + if (rx < h->num_digits) { + // Read a digit. + n = (10 * n) + h->digits[rx++]; + } else if (n == 0) { + // h's number used to be zero and remains zero. + return; + } else { + // Read sufficient implicit trailing zeroes. + while ((n >> shift) == 0) { + n = 10 * n; + rx++; + } + break; + } + } + h->decimal_point -= ((int32_t)(rx - 1)); + if (h->decimal_point < + -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { + // After the shift, h's number is effectively zero. + h->num_digits = 0; + h->decimal_point = 0; + h->truncated = false; + return; + } + + // Repeat: pick up a digit, put down a digit, left to right. + uint64_t mask = (((uint64_t)(1)) << shift) - 1; + while (rx < h->num_digits) { + uint8_t new_digit = ((uint8_t)(n >> shift)); + n = (10 * (n & mask)) + h->digits[rx++]; + h->digits[wx++] = new_digit; + } + + // Put down trailing digits, left to right. + while (n > 0) { + uint8_t new_digit = ((uint8_t)(n >> shift)); + n = 10 * (n & mask); + if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { + h->digits[wx++] = new_digit; + } else if (new_digit > 0) { + h->truncated = true; + } + } + + // Finish. + h->num_digits = wx; + wuffs_base__private_implementation__high_prec_dec__trim(h); +} + +static void // +wuffs_base__private_implementation__high_prec_dec__lshift( + wuffs_base__private_implementation__high_prec_dec* h, + int32_t shift) { + if (shift > 0) { + while (shift > +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) { + wuffs_base__private_implementation__high_prec_dec__small_lshift( + h, WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL); + shift -= WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; + } + wuffs_base__private_implementation__high_prec_dec__small_lshift( + h, ((uint32_t)(+shift))); + } else if (shift < 0) { + while (shift < -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) { + wuffs_base__private_implementation__high_prec_dec__small_rshift( + h, WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL); + shift += WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; + } + wuffs_base__private_implementation__high_prec_dec__small_rshift( + h, ((uint32_t)(-shift))); + } +} + +// -------- + +// wuffs_base__private_implementation__high_prec_dec__round_etc rounds h's +// number. For those functions that take an n argument, rounding produces at +// most n digits (which is not necessarily at most n decimal places). Negative +// n values are ignored, as well as any n greater than or equal to h's number +// of digits. The etc__round_just_enough function implicitly chooses an n to +// implement WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION. +// +// Preconditions: +// - h is non-NULL. +// - h->decimal_point is "not extreme". +// +// "Not extreme" means within +// ±WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE. + +static void // +wuffs_base__private_implementation__high_prec_dec__round_down( + wuffs_base__private_implementation__high_prec_dec* h, + int32_t n) { + if ((n < 0) || (h->num_digits <= (uint32_t)n)) { + return; + } + h->num_digits = (uint32_t)(n); + wuffs_base__private_implementation__high_prec_dec__trim(h); +} + +static void // +wuffs_base__private_implementation__high_prec_dec__round_up( + wuffs_base__private_implementation__high_prec_dec* h, + int32_t n) { + if ((n < 0) || (h->num_digits <= (uint32_t)n)) { + return; + } + + for (n--; n >= 0; n--) { + if (h->digits[n] < 9) { + h->digits[n]++; + h->num_digits = (uint32_t)(n + 1); + return; + } + } + + // The number is all 9s. Change to a single 1 and adjust the decimal point. + h->digits[0] = 1; + h->num_digits = 1; + h->decimal_point++; +} + +static void // +wuffs_base__private_implementation__high_prec_dec__round_nearest( + wuffs_base__private_implementation__high_prec_dec* h, + int32_t n) { + if ((n < 0) || (h->num_digits <= (uint32_t)n)) { + return; + } + bool up = h->digits[n] >= 5; + if ((h->digits[n] == 5) && ((n + 1) == ((int32_t)(h->num_digits)))) { + up = h->truncated || // + ((n > 0) && ((h->digits[n - 1] & 1) != 0)); + } + + if (up) { + wuffs_base__private_implementation__high_prec_dec__round_up(h, n); + } else { + wuffs_base__private_implementation__high_prec_dec__round_down(h, n); + } +} + +static void // +wuffs_base__private_implementation__high_prec_dec__round_just_enough( + wuffs_base__private_implementation__high_prec_dec* h, + int32_t exp2, + uint64_t mantissa) { + // The magic numbers 52 and 53 in this function are because IEEE 754 double + // precision has 52 mantissa bits. + // + // Let f be the floating point number represented by exp2 and mantissa (and + // also the number in h): the number (mantissa * (2 ** (exp2 - 52))). + // + // If f is zero or a small integer, we can return early. + if ((mantissa == 0) || + ((exp2 < 53) && (h->decimal_point >= ((int32_t)(h->num_digits))))) { + return; + } + + // The smallest normal f has an exp2 of -1022 and a mantissa of (1 << 52). + // Subnormal numbers have the same exp2 but a smaller mantissa. + static const int32_t min_incl_normal_exp2 = -1022; + static const uint64_t min_incl_normal_mantissa = 0x0010000000000000ul; + + // Compute lower and upper bounds such that any number between them (possibly + // inclusive) will round to f. First, the lower bound. Our number f is: + // ((mantissa + 0) * (2 ** ( exp2 - 52))) + // + // The next lowest floating point number is: + // ((mantissa - 1) * (2 ** ( exp2 - 52))) + // unless (mantissa - 1) drops the (1 << 52) bit and exp2 is not the + // min_incl_normal_exp2. Either way, call it: + // ((l_mantissa) * (2 ** (l_exp2 - 52))) + // + // The lower bound is halfway between them (noting that 52 became 53): + // (((2 * l_mantissa) + 1) * (2 ** (l_exp2 - 53))) + int32_t l_exp2 = exp2; + uint64_t l_mantissa = mantissa - 1; + if ((exp2 > min_incl_normal_exp2) && (mantissa <= min_incl_normal_mantissa)) { + l_exp2 = exp2 - 1; + l_mantissa = (2 * mantissa) - 1; + } + wuffs_base__private_implementation__high_prec_dec lower; + wuffs_base__private_implementation__high_prec_dec__assign( + &lower, (2 * l_mantissa) + 1, false); + wuffs_base__private_implementation__high_prec_dec__lshift(&lower, + l_exp2 - 53); + + // Next, the upper bound. Our number f is: + // ((mantissa + 0) * (2 ** (exp2 - 52))) + // + // The next highest floating point number is: + // ((mantissa + 1) * (2 ** (exp2 - 52))) + // + // The upper bound is halfway between them (noting that 52 became 53): + // (((2 * mantissa) + 1) * (2 ** (exp2 - 53))) + wuffs_base__private_implementation__high_prec_dec upper; + wuffs_base__private_implementation__high_prec_dec__assign( + &upper, (2 * mantissa) + 1, false); + wuffs_base__private_implementation__high_prec_dec__lshift(&upper, exp2 - 53); + + // The lower and upper bounds are possible outputs only if the original + // mantissa is even, so that IEEE round-to-even would round to the original + // mantissa and not its neighbors. + bool inclusive = (mantissa & 1) == 0; + + // As we walk the digits, we want to know whether rounding up would fall + // within the upper bound. This is tracked by upper_delta: + // - When -1, the digits of h and upper are the same so far. + // - When +0, we saw a difference of 1 between h and upper on a previous + // digit and subsequently only 9s for h and 0s for upper. Thus, rounding + // up may fall outside of the bound if !inclusive. + // - When +1, the difference is greater than 1 and we know that rounding up + // falls within the bound. + // + // This is a state machine with three states. The numerical value for each + // state (-1, +0 or +1) isn't important, other than their order. + int upper_delta = -1; + + // We can now figure out the shortest number of digits required. Walk the + // digits until h has distinguished itself from lower or upper. + // + // The zi and zd variables are indexes and digits, for z in l (lower), h (the + // number) and u (upper). + // + // The lower, h and upper numbers may have their decimal points at different + // places. In this case, upper is the longest, so we iterate ui starting from + // 0 and iterate li and hi starting from either 0 or -1. + int32_t ui = 0; + for (;; ui++) { + // Calculate hd, the middle number's digit. + int32_t hi = ui - upper.decimal_point + h->decimal_point; + if (hi >= ((int32_t)(h->num_digits))) { + break; + } + uint8_t hd = (((uint32_t)hi) < h->num_digits) ? h->digits[hi] : 0; + + // Calculate ld, the lower bound's digit. + int32_t li = ui - upper.decimal_point + lower.decimal_point; + uint8_t ld = (((uint32_t)li) < lower.num_digits) ? lower.digits[li] : 0; + + // We can round down (truncate) if lower has a different digit than h or if + // lower is inclusive and is exactly the result of rounding down (i.e. we + // have reached the final digit of lower). + bool can_round_down = + (ld != hd) || // + (inclusive && ((li + 1) == ((int32_t)(lower.num_digits)))); + + // Calculate ud, the upper bound's digit, and update upper_delta. + uint8_t ud = (((uint32_t)ui) < upper.num_digits) ? upper.digits[ui] : 0; + if (upper_delta < 0) { + if ((hd + 1) < ud) { + // For example: + // h = 12345??? + // upper = 12347??? + upper_delta = +1; + } else if (hd != ud) { + // For example: + // h = 12345??? + // upper = 12346??? + upper_delta = +0; + } + } else if (upper_delta == 0) { + if ((hd != 9) || (ud != 0)) { + // For example: + // h = 1234598? + // upper = 1234600? + upper_delta = +1; + } + } + + // We can round up if upper has a different digit than h and either upper + // is inclusive or upper is bigger than the result of rounding up. + bool can_round_up = + (upper_delta > 0) || // + ((upper_delta == 0) && // + (inclusive || ((ui + 1) < ((int32_t)(upper.num_digits))))); + + // If we can round either way, round to nearest. If we can round only one + // way, do it. If we can't round, continue the loop. + if (can_round_down) { + if (can_round_up) { + wuffs_base__private_implementation__high_prec_dec__round_nearest( + h, hi + 1); + return; + } else { + wuffs_base__private_implementation__high_prec_dec__round_down(h, + hi + 1); + return; + } + } else { + if (can_round_up) { + wuffs_base__private_implementation__high_prec_dec__round_up(h, hi + 1); + return; + } + } + } +} + +// -------- + +// wuffs_base__private_implementation__parse_number_f64_eisel_lemire produces +// the IEEE 754 double-precision value for an exact mantissa and base-10 +// exponent. For example: +// - when parsing "12345.678e+02", man is 12345678 and exp10 is -1. +// - when parsing "-12", man is 12 and exp10 is 0. Processing the leading +// minus sign is the responsibility of the caller, not this function. +// +// On success, it returns a non-negative int64_t such that the low 63 bits hold +// the 11-bit exponent and 52-bit mantissa. +// +// On failure, it returns a negative value. +// +// The algorithm is based on an original idea by Michael Eisel that was refined +// by Daniel Lemire. See +// https://lemire.me/blog/2020/03/10/fast-float-parsing-in-practice/ +// and +// https://nigeltao.github.io/blog/2020/eisel-lemire.html +// +// Preconditions: +// - man is non-zero. +// - exp10 is in the range [-307 ..= 288], the same range of the +// wuffs_base__private_implementation__powers_of_10 array. +// +// The exp10 range (and the fact that man is in the range [1 ..= UINT64_MAX], +// approximately [1 ..= 1.85e+19]) means that (man * (10 ** exp10)) is in the +// range [1e-307 ..= 1.85e+307]. This is entirely within the range of normal +// (neither subnormal nor non-finite) f64 values: DBL_MIN and DBL_MAX are +// approximately 2.23e–308 and 1.80e+308. +static int64_t // +wuffs_base__private_implementation__parse_number_f64_eisel_lemire( + uint64_t man, + int32_t exp10) { + // Look up the (possibly truncated) base-2 representation of (10 ** exp10). + // The look-up table was constructed so that it is already normalized: the + // table entry's mantissa's MSB (most significant bit) is on. + const uint64_t* po10 = + &wuffs_base__private_implementation__powers_of_10[exp10 + 307][0]; + + // Normalize the man argument. The (man != 0) precondition means that a + // non-zero bit exists. + uint32_t clz = wuffs_base__count_leading_zeroes_u64(man); + man <<= clz; + + // Calculate the return value's base-2 exponent. We might tweak it by ±1 + // later, but its initial value comes from a linear scaling of exp10, + // converting from power-of-10 to power-of-2, and adjusting by clz. + // + // The magic constants are: + // - 1087 = 1023 + 64. The 1023 is the f64 exponent bias. The 64 is because + // the look-up table uses 64-bit mantissas. + // - 217706 is such that the ratio 217706 / 65536 ≈ 3.321930 is close enough + // (over the practical range of exp10) to log(10) / log(2) ≈ 3.321928. + // - 65536 = 1<<16 is arbitrary but a power of 2, so division is a shift. + // + // Equality of the linearly-scaled value and the actual power-of-2, over the + // range of exp10 arguments that this function accepts, is confirmed by + // script/print-mpb-powers-of-10.go + uint64_t ret_exp2 = + ((uint64_t)(((217706 * exp10) >> 16) + 1087)) - ((uint64_t)clz); + + // Multiply the two mantissas. Normalization means that both mantissas are at + // least (1<<63), so the 128-bit product must be at least (1<<126). The high + // 64 bits of the product, x_hi, must therefore be at least (1<<62). + // + // As a consequence, x_hi has either 0 or 1 leading zeroes. Shifting x_hi + // right by either 9 or 10 bits (depending on x_hi's MSB) will therefore + // leave the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. + wuffs_base__multiply_u64__output x = wuffs_base__multiply_u64(man, po10[1]); + uint64_t x_hi = x.hi; + uint64_t x_lo = x.lo; + + // Before we shift right by at least 9 bits, recall that the look-up table + // entry was possibly truncated. We have so far only calculated a lower bound + // for the product (man * e), where e is (10 ** exp10). The upper bound would + // add a further (man * 1) to the 128-bit product, which overflows the lower + // 64-bit limb if ((x_lo + man) < man). + // + // If overflow occurs, that adds 1 to x_hi. Since we're about to shift right + // by at least 9 bits, that carried 1 can be ignored unless the higher 64-bit + // limb's low 9 bits are all on. + // + // For example, parsing "9999999999999999999" will take the if-true branch + // here, since: + // - x_hi = 0x4563918244F3FFFF + // - x_lo = 0x8000000000000000 + // - man = 0x8AC7230489E7FFFF + if (((x_hi & 0x1FF) == 0x1FF) && ((x_lo + man) < man)) { + // Refine our calculation of (man * e). Before, our approximation of e used + // a "low resolution" 64-bit mantissa. Now use a "high resolution" 128-bit + // mantissa. We've already calculated x = (man * bits_0_to_63_incl_of_e). + // Now calculate y = (man * bits_64_to_127_incl_of_e). + wuffs_base__multiply_u64__output y = wuffs_base__multiply_u64(man, po10[0]); + uint64_t y_hi = y.hi; + uint64_t y_lo = y.lo; + + // Merge the 128-bit x and 128-bit y, which overlap by 64 bits, to + // calculate the 192-bit product of the 64-bit man by the 128-bit e. + // As we exit this if-block, we only care about the high 128 bits + // (merged_hi and merged_lo) of that 192-bit product. + // + // For example, parsing "1.234e-45" will take the if-true branch here, + // since: + // - x_hi = 0x70B7E3696DB29FFF + // - x_lo = 0xE040000000000000 + // - y_hi = 0x33718BBEAB0E0D7A + // - y_lo = 0xA880000000000000 + uint64_t merged_hi = x_hi; + uint64_t merged_lo = x_lo + y_hi; + if (merged_lo < x_lo) { + merged_hi++; // Carry the overflow bit. + } + + // The "high resolution" approximation of e is still a lower bound. Once + // again, see if the upper bound is large enough to produce a different + // result. This time, if it does, give up instead of reaching for an even + // more precise approximation to e. + // + // This three-part check is similar to the two-part check that guarded the + // if block that we're now in, but it has an extra term for the middle 64 + // bits (checking that adding 1 to merged_lo would overflow). + // + // For example, parsing "5.9604644775390625e-8" will take the if-true + // branch here, since: + // - merged_hi = 0x7FFFFFFFFFFFFFFF + // - merged_lo = 0xFFFFFFFFFFFFFFFF + // - y_lo = 0x4DB3FFC120988200 + // - man = 0xD3C21BCECCEDA100 + if (((merged_hi & 0x1FF) == 0x1FF) && ((merged_lo + 1) == 0) && + (y_lo + man < man)) { + return -1; + } + + // Replace the 128-bit x with merged. + x_hi = merged_hi; + x_lo = merged_lo; + } + + // As mentioned above, shifting x_hi right by either 9 or 10 bits will leave + // the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. If the + // MSB (before shifting) was on, adjust ret_exp2 for the larger shift. + // + // Having bit 53 on (and higher bits off) means that ret_mantissa is a 54-bit + // number. + uint64_t msb = x_hi >> 63; + uint64_t ret_mantissa = x_hi >> (msb + 9); + ret_exp2 -= 1 ^ msb; + + // IEEE 754 rounds to-nearest with ties rounded to-even. Rounding to-even can + // be tricky. If we're half-way between two exactly representable numbers + // (x's low 73 bits are zero and the next 2 bits that matter are "01"), give + // up instead of trying to pick the winner. + // + // Technically, we could tighten the condition by changing "73" to "73 or 74, + // depending on msb", but a flat "73" is simpler. + // + // For example, parsing "1e+23" will take the if-true branch here, since: + // - x_hi = 0x54B40B1F852BDA00 + // - ret_mantissa = 0x002A5A058FC295ED + if ((x_lo == 0) && ((x_hi & 0x1FF) == 0) && ((ret_mantissa & 3) == 1)) { + return -1; + } + + // If we're not halfway then it's rounding to-nearest. Starting with a 54-bit + // number, carry the lowest bit (bit 0) up if it's on. Regardless of whether + // it was on or off, shifting right by one then produces a 53-bit number. If + // carrying up overflowed, shift again. + ret_mantissa += ret_mantissa & 1; + ret_mantissa >>= 1; + // This if block is equivalent to (but benchmarks slightly faster than) the + // following branchless form: + // uint64_t overflow_adjustment = ret_mantissa >> 53; + // ret_mantissa >>= overflow_adjustment; + // ret_exp2 += overflow_adjustment; + // + // For example, parsing "7.2057594037927933e+16" will take the if-true + // branch here, since: + // - x_hi = 0x7FFFFFFFFFFFFE80 + // - ret_mantissa = 0x0020000000000000 + if ((ret_mantissa >> 53) > 0) { + ret_mantissa >>= 1; + ret_exp2++; + } + + // Starting with a 53-bit number, IEEE 754 double-precision normal numbers + // have an implicit mantissa bit. Mask that away and keep the low 52 bits. + ret_mantissa &= 0x000FFFFFFFFFFFFF; + + // Pack the bits and return. + return ((int64_t)(ret_mantissa | (ret_exp2 << 52))); +} + +// -------- + +static wuffs_base__result_f64 // +wuffs_base__private_implementation__parse_number_f64_special( + wuffs_base__slice_u8 s, + uint32_t options) { + do { + if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { + goto fail; + } + + uint8_t* p = s.ptr; + uint8_t* q = s.ptr + s.len; + + for (; (p < q) && (*p == '_'); p++) { + } + if (p >= q) { + goto fail; + } + + // Parse sign. + bool negative = false; + do { + if (*p == '+') { + p++; + } else if (*p == '-') { + negative = true; + p++; + } else { + break; + } + for (; (p < q) && (*p == '_'); p++) { + } + } while (0); + if (p >= q) { + goto fail; + } + + bool nan = false; + switch (p[0]) { + case 'I': + case 'i': + if (((q - p) < 3) || // + ((p[1] != 'N') && (p[1] != 'n')) || // + ((p[2] != 'F') && (p[2] != 'f'))) { + goto fail; + } + p += 3; + + if ((p >= q) || (*p == '_')) { + break; + } else if (((q - p) < 5) || // + ((p[0] != 'I') && (p[0] != 'i')) || // + ((p[1] != 'N') && (p[1] != 'n')) || // + ((p[2] != 'I') && (p[2] != 'i')) || // + ((p[3] != 'T') && (p[3] != 't')) || // + ((p[4] != 'Y') && (p[4] != 'y'))) { + goto fail; + } + p += 5; + + if ((p >= q) || (*p == '_')) { + break; + } + goto fail; + + case 'N': + case 'n': + if (((q - p) < 3) || // + ((p[1] != 'A') && (p[1] != 'a')) || // + ((p[2] != 'N') && (p[2] != 'n'))) { + goto fail; + } + p += 3; + + if ((p >= q) || (*p == '_')) { + nan = true; + break; + } + goto fail; + + default: + goto fail; + } + + // Finish. + for (; (p < q) && (*p == '_'); p++) { + } + if (p != q) { + goto fail; + } + wuffs_base__result_f64 ret; + ret.status.repr = NULL; + ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( + (nan ? 0x7FFFFFFFFFFFFFFF : 0x7FF0000000000000) | + (negative ? 0x8000000000000000 : 0)); + return ret; + } while (0); + +fail: + do { + wuffs_base__result_f64 ret; + ret.status.repr = wuffs_base__error__bad_argument; + ret.value = 0; + return ret; + } while (0); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // +wuffs_base__private_implementation__high_prec_dec__to_f64( + wuffs_base__private_implementation__high_prec_dec* h, + uint32_t options) { + do { + // powers converts decimal powers of 10 to binary powers of 2. For example, + // (10000 >> 13) is 1. It stops before the elements exceed 60, also known + // as WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL. + // + // This rounds down (1<<13 is a lower bound for 1e4). Adding 1 to the array + // element value rounds up (1<<14 is an upper bound for 1e4) while staying + // at or below WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL. + // + // When starting in the range [1e+1 .. 1e+2] (i.e. h->decimal_point == +2), + // powers[2] == 6 and so: + // - Right shifting by 6+0 produces the range [10/64 .. 100/64] = + // [0.156250 .. 1.56250]. The resultant h->decimal_point is +0 or +1. + // - Right shifting by 6+1 produces the range [10/128 .. 100/128] = + // [0.078125 .. 0.78125]. The resultant h->decimal_point is -1 or -0. + // + // When starting in the range [1e-3 .. 1e-2] (i.e. h->decimal_point == -2), + // powers[2] == 6 and so: + // - Left shifting by 6+0 produces the range [0.001*64 .. 0.01*64] = + // [0.064 .. 0.64]. The resultant h->decimal_point is -1 or -0. + // - Left shifting by 6+1 produces the range [0.001*128 .. 0.01*128] = + // [0.128 .. 1.28]. The resultant h->decimal_point is +0 or +1. + // + // Thus, when targeting h->decimal_point being +0 or +1, use (powers[n]+0) + // when right shifting but (powers[n]+1) when left shifting. + static const uint32_t num_powers = 19; + static const uint8_t powers[19] = { + 0, 3, 6, 9, 13, 16, 19, 23, 26, 29, // + 33, 36, 39, 43, 46, 49, 53, 56, 59, // + }; + + // Handle zero and obvious extremes. The largest and smallest positive + // finite f64 values are approximately 1.8e+308 and 4.9e-324. + if ((h->num_digits == 0) || (h->decimal_point < -326)) { + goto zero; + } else if (h->decimal_point > 310) { + goto infinity; + } + + // Try the fast Eisel-Lemire algorithm again. Calculating the (man, exp10) + // pair from the high_prec_dec h is more correct but slower than the + // approach taken in wuffs_base__parse_number_f64. The latter is optimized + // for the common cases (e.g. assuming no underscores or a leading '+' + // sign) rather than the full set of cases allowed by the Wuffs API. + // + // When we have 19 or fewer mantissa digits, run Eisel-Lemire once (trying + // for an exact result). When we have more than 19 mantissa digits, run it + // twice to get a lower and upper bound. We still have an exact result + // (within f64's rounding margin) if both bounds are equal (and valid). + uint32_t i_max = h->num_digits; + if (i_max > 19) { + i_max = 19; + } + int32_t exp10 = h->decimal_point - ((int32_t)i_max); + if ((-307 <= exp10) && (exp10 <= 288)) { + uint64_t man = 0; + uint32_t i; + for (i = 0; i < i_max; i++) { + man = (10 * man) + h->digits[i]; + } + while (man != 0) { // The 'while' is just an 'if' that we can 'break'. + int64_t r0 = + wuffs_base__private_implementation__parse_number_f64_eisel_lemire( + man + 0, exp10); + if (r0 < 0) { + break; + } else if (h->num_digits > 19) { + int64_t r1 = + wuffs_base__private_implementation__parse_number_f64_eisel_lemire( + man + 1, exp10); + if (r1 != r0) { + break; + } + } + wuffs_base__result_f64 ret; + ret.status.repr = NULL; + ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( + ((uint64_t)r0) | (((uint64_t)(h->negative)) << 63)); + return ret; + } + } + + // When Eisel-Lemire fails, fall back to Simple Decimal Conversion. See + // https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html + // + // Scale by powers of 2 until we're in the range [0.1 .. 10]. Equivalently, + // that h->decimal_point is +0 or +1. + // + // First we shift right while at or above 10... + const int32_t f64_bias = -1023; + int32_t exp2 = 0; + while (h->decimal_point > 1) { + uint32_t n = (uint32_t)(+h->decimal_point); + uint32_t shift = + (n < num_powers) + ? powers[n] + : WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; + + wuffs_base__private_implementation__high_prec_dec__small_rshift(h, shift); + if (h->decimal_point < + -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { + goto zero; + } + exp2 += (int32_t)shift; + } + // ...then we shift left while below 0.1. + while (h->decimal_point < 0) { + uint32_t shift; + uint32_t n = (uint32_t)(-h->decimal_point); + shift = (n < num_powers) + // The +1 is per "when targeting h->decimal_point being +0 or + // +1... when left shifting" in the powers comment above. + ? (powers[n] + 1) + : WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; + + wuffs_base__private_implementation__high_prec_dec__small_lshift(h, shift); + if (h->decimal_point > + +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { + goto infinity; + } + exp2 -= (int32_t)shift; + } + + // To get from "in the range [0.1 .. 10]" to "in the range [1 .. 2]" (which + // will give us our exponent in base-2), the mantissa's first 3 digits will + // determine the final left shift, equal to 52 (the number of explicit f64 + // bits) plus an additional adjustment. + int man3 = (100 * h->digits[0]) + + ((h->num_digits > 1) ? (10 * h->digits[1]) : 0) + + ((h->num_digits > 2) ? h->digits[2] : 0); + int32_t additional_lshift = 0; + if (h->decimal_point == 0) { // The value is in [0.1 .. 1]. + if (man3 < 125) { + additional_lshift = +4; + } else if (man3 < 250) { + additional_lshift = +3; + } else if (man3 < 500) { + additional_lshift = +2; + } else { + additional_lshift = +1; + } + } else { // The value is in [1 .. 10]. + if (man3 < 200) { + additional_lshift = -0; + } else if (man3 < 400) { + additional_lshift = -1; + } else if (man3 < 800) { + additional_lshift = -2; + } else { + additional_lshift = -3; + } + } + exp2 -= additional_lshift; + uint32_t final_lshift = (uint32_t)(52 + additional_lshift); + + // The minimum normal exponent is (f64_bias + 1). + while ((f64_bias + 1) > exp2) { + uint32_t n = (uint32_t)((f64_bias + 1) - exp2); + if (n > WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) { + n = WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; + } + wuffs_base__private_implementation__high_prec_dec__small_rshift(h, n); + exp2 += (int32_t)n; + } + + // Check for overflow. + if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. + goto infinity; + } + + // Extract 53 bits for the mantissa (in base-2). + wuffs_base__private_implementation__high_prec_dec__small_lshift( + h, final_lshift); + uint64_t man2 = + wuffs_base__private_implementation__high_prec_dec__rounded_integer(h); + + // Rounding might have added one bit. If so, shift and re-check overflow. + if ((man2 >> 53) != 0) { + man2 >>= 1; + exp2++; + if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. + goto infinity; + } + } + + // Handle subnormal numbers. + if ((man2 >> 52) == 0) { + exp2 = f64_bias; + } + + // Pack the bits and return. + uint64_t exp2_bits = + (uint64_t)((exp2 - f64_bias) & 0x07FF); // (1 << 11) - 1. + uint64_t bits = (man2 & 0x000FFFFFFFFFFFFF) | // (1 << 52) - 1. + (exp2_bits << 52) | // + (h->negative ? 0x8000000000000000 : 0); // (1 << 63). + + wuffs_base__result_f64 ret; + ret.status.repr = NULL; + ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); + return ret; + } while (0); + +zero: + do { + uint64_t bits = h->negative ? 0x8000000000000000 : 0; + + wuffs_base__result_f64 ret; + ret.status.repr = NULL; + ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); + return ret; + } while (0); + +infinity: + do { + if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { + wuffs_base__result_f64 ret; + ret.status.repr = wuffs_base__error__bad_argument; + ret.value = 0; + return ret; + } + + uint64_t bits = h->negative ? 0xFFF0000000000000 : 0x7FF0000000000000; + + wuffs_base__result_f64 ret; + ret.status.repr = NULL; + ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); + return ret; + } while (0); +} + +static inline bool // +wuffs_base__private_implementation__is_decimal_digit(uint8_t c) { + return ('0' <= c) && (c <= '9'); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // +wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options) { + // In practice, almost all "dd.ddddE±xxx" numbers can be represented + // losslessly by a uint64_t mantissa "dddddd" and an int32_t base-10 + // exponent, adjusting "xxx" for the position (if present) of the decimal + // separator '.' or ','. + // + // This (u64 man, i32 exp10) data structure is superficially similar to the + // "Do It Yourself Floating Point" type from Loitsch (†), but the exponent + // here is base-10, not base-2. + // + // If s's number fits in a (man, exp10), parse that pair with the + // Eisel-Lemire algorithm. If not, or if Eisel-Lemire fails, parsing s with + // the fallback algorithm is slower but comprehensive. + // + // † "Printing Floating-Point Numbers Quickly and Accurately with Integers" + // (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf). + // Florian Loitsch is also the primary contributor to + // https://github.com/google/double-conversion + do { + // Calculating that (man, exp10) pair needs to stay within s's bounds. + // Provided that s isn't extremely long, work on a NUL-terminated copy of + // s's contents. The NUL byte isn't a valid part of "±dd.ddddE±xxx". + // + // As the pointer p walks the contents, it's faster to repeatedly check "is + // *p a valid digit" than "is p within bounds and *p a valid digit". + if (s.len >= 256) { + goto fallback; + } + uint8_t z[256]; + memcpy(&z[0], s.ptr, s.len); + z[s.len] = 0; + const uint8_t* p = &z[0]; + + // Look for a leading minus sign. Technically, we could also look for an + // optional plus sign, but the "script/process-json-numbers.c with -p" + // benchmark is noticably slower if we do. It's optional and, in practice, + // usually absent. Let the fallback catch it. + bool negative = (*p == '-'); + if (negative) { + p++; + } + + // After walking "dd.dddd", comparing p later with p now will produce the + // number of "d"s and "."s. + const uint8_t* const start_of_digits_ptr = p; + + // Walk the "d"s before a '.', 'E', NUL byte, etc. If it starts with '0', + // it must be a single '0'. If it starts with a non-zero decimal digit, it + // can be a sequence of decimal digits. + // + // Update the man variable during the walk. It's OK if man overflows now. + // We'll detect that later. + uint64_t man; + if (*p == '0') { + man = 0; + p++; + if (wuffs_base__private_implementation__is_decimal_digit(*p)) { + goto fallback; + } + } else if (wuffs_base__private_implementation__is_decimal_digit(*p)) { + man = ((uint8_t)(*p - '0')); + p++; + for (; wuffs_base__private_implementation__is_decimal_digit(*p); p++) { + man = (10 * man) + ((uint8_t)(*p - '0')); + } + } else { + goto fallback; + } + + // Walk the "d"s after the optional decimal separator ('.' or ','), + // updating the man and exp10 variables. + int32_t exp10 = 0; + if (*p == + ((options & WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) + ? ',' + : '.')) { + p++; + const uint8_t* first_after_separator_ptr = p; + if (!wuffs_base__private_implementation__is_decimal_digit(*p)) { + goto fallback; + } + man = (10 * man) + ((uint8_t)(*p - '0')); + p++; + for (; wuffs_base__private_implementation__is_decimal_digit(*p); p++) { + man = (10 * man) + ((uint8_t)(*p - '0')); + } + exp10 = ((int32_t)(first_after_separator_ptr - p)); + } + + // Count the number of digits: + // - for an input of "314159", digit_count is 6. + // - for an input of "3.14159", digit_count is 7. + // + // This is off-by-one if there is a decimal separator. That's OK for now. + // We'll correct for that later. The "script/process-json-numbers.c with + // -p" benchmark is noticably slower if we try to correct for that now. + uint32_t digit_count = (uint32_t)(p - start_of_digits_ptr); + + // Update exp10 for the optional exponent, starting with 'E' or 'e'. + if ((*p | 0x20) == 'e') { + p++; + int32_t exp_sign = +1; + if (*p == '-') { + p++; + exp_sign = -1; + } else if (*p == '+') { + p++; + } + if (!wuffs_base__private_implementation__is_decimal_digit(*p)) { + goto fallback; + } + int32_t exp_num = ((uint8_t)(*p - '0')); + p++; + // The rest of the exp_num walking has a peculiar control flow but, once + // again, the "script/process-json-numbers.c with -p" benchmark is + // sensitive to alternative formulations. + if (wuffs_base__private_implementation__is_decimal_digit(*p)) { + exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); + p++; + } + if (wuffs_base__private_implementation__is_decimal_digit(*p)) { + exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); + p++; + } + while (wuffs_base__private_implementation__is_decimal_digit(*p)) { + if (exp_num > 0x1000000) { + goto fallback; + } + exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); + p++; + } + exp10 += exp_sign * exp_num; + } + + // The Wuffs API is that the original slice has no trailing data. It also + // allows underscores, which we don't catch here but the fallback should. + if (p != &z[s.len]) { + goto fallback; + } + + // Check that the uint64_t typed man variable has not overflowed, based on + // digit_count. + // + // For reference: + // - (1 << 63) is 9223372036854775808, which has 19 decimal digits. + // - (1 << 64) is 18446744073709551616, which has 20 decimal digits. + // - 19 nines, 9999999999999999999, is 0x8AC7230489E7FFFF, which has 64 + // bits and 16 hexadecimal digits. + // - 20 nines, 99999999999999999999, is 0x56BC75E2D630FFFFF, which has 67 + // bits and 17 hexadecimal digits. + if (digit_count > 19) { + // Even if we have more than 19 pseudo-digits, it's not yet definitely an + // overflow. Recall that digit_count might be off-by-one (too large) if + // there's a decimal separator. It will also over-report the number of + // meaningful digits if the input looks something like "0.000dddExxx". + // + // We adjust by the number of leading '0's and '.'s and re-compare to 19. + // Once again, technically, we could skip ','s too, but that perturbs the + // "script/process-json-numbers.c with -p" benchmark. + const uint8_t* q = start_of_digits_ptr; + for (; (*q == '0') || (*q == '.'); q++) { + } + digit_count -= (uint32_t)(q - start_of_digits_ptr); + if (digit_count > 19) { + goto fallback; + } + } + + // The wuffs_base__private_implementation__parse_number_f64_eisel_lemire + // preconditions include that exp10 is in the range [-307 ..= 288]. + if ((exp10 < -307) || (288 < exp10)) { + goto fallback; + } + + // If both man and (10 ** exp10) are exactly representable by a double, we + // don't need to run the Eisel-Lemire algorithm. + if ((-22 <= exp10) && (exp10 <= 22) && ((man >> 53) == 0)) { + double d = (double)man; + if (exp10 >= 0) { + d *= wuffs_base__private_implementation__f64_powers_of_10[+exp10]; + } else { + d /= wuffs_base__private_implementation__f64_powers_of_10[-exp10]; + } + wuffs_base__result_f64 ret; + ret.status.repr = NULL; + ret.value = negative ? -d : +d; + return ret; + } + + // The wuffs_base__private_implementation__parse_number_f64_eisel_lemire + // preconditions include that man is non-zero. Parsing "0" should be caught + // by the "If both man and (10 ** exp10)" above, but "0e99" might not. + if (man == 0) { + goto fallback; + } + + // Our man and exp10 are in range. Run the Eisel-Lemire algorithm. + int64_t r = + wuffs_base__private_implementation__parse_number_f64_eisel_lemire( + man, exp10); + if (r < 0) { + goto fallback; + } + wuffs_base__result_f64 ret; + ret.status.repr = NULL; + ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( + ((uint64_t)r) | (((uint64_t)negative) << 63)); + return ret; + } while (0); + +fallback: + do { + wuffs_base__private_implementation__high_prec_dec h; + wuffs_base__status status = + wuffs_base__private_implementation__high_prec_dec__parse(&h, s, + options); + if (status.repr) { + return wuffs_base__private_implementation__parse_number_f64_special( + s, options); + } + return wuffs_base__private_implementation__high_prec_dec__to_f64(&h, + options); + } while (0); +} + +// -------- + +static inline size_t // +wuffs_base__private_implementation__render_inf(wuffs_base__slice_u8 dst, + bool neg, + uint32_t options) { + if (neg) { + if (dst.len < 4) { + return 0; + } + wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492D); // '-Inf'le. + return 4; + } + + if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { + if (dst.len < 4) { + return 0; + } + wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492B); // '+Inf'le. + return 4; + } + + if (dst.len < 3) { + return 0; + } + wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x666E49); // 'Inf'le. + return 3; +} + +static inline size_t // +wuffs_base__private_implementation__render_nan(wuffs_base__slice_u8 dst) { + if (dst.len < 3) { + return 0; + } + wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x4E614E); // 'NaN'le. + return 3; +} + +static size_t // +wuffs_base__private_implementation__high_prec_dec__render_exponent_absent( + wuffs_base__slice_u8 dst, + wuffs_base__private_implementation__high_prec_dec* h, + uint32_t precision, + uint32_t options) { + size_t n = (h->negative || + (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) + ? 1 + : 0; + if (h->decimal_point <= 0) { + n += 1; + } else { + n += (size_t)(h->decimal_point); + } + if (precision > 0) { + n += precision + 1; // +1 for the '.'. + } + + // Don't modify dst if the formatted number won't fit. + if (n > dst.len) { + return 0; + } + + // Align-left or align-right. + uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) + ? &dst.ptr[dst.len - n] + : &dst.ptr[0]; + + // Leading "±". + if (h->negative) { + *ptr++ = '-'; + } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { + *ptr++ = '+'; + } + + // Integral digits. + if (h->decimal_point <= 0) { + *ptr++ = '0'; + } else { + uint32_t m = + wuffs_base__u32__min(h->num_digits, (uint32_t)(h->decimal_point)); + uint32_t i = 0; + for (; i < m; i++) { + *ptr++ = (uint8_t)('0' | h->digits[i]); + } + for (; i < (uint32_t)(h->decimal_point); i++) { + *ptr++ = '0'; + } + } + + // Separator and then fractional digits. + if (precision > 0) { + *ptr++ = + (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) + ? ',' + : '.'; + uint32_t i = 0; + for (; i < precision; i++) { + uint32_t j = ((uint32_t)(h->decimal_point)) + i; + *ptr++ = (uint8_t)('0' | ((j < h->num_digits) ? h->digits[j] : 0)); + } + } + + return n; +} + +static size_t // +wuffs_base__private_implementation__high_prec_dec__render_exponent_present( + wuffs_base__slice_u8 dst, + wuffs_base__private_implementation__high_prec_dec* h, + uint32_t precision, + uint32_t options) { + int32_t exp = 0; + if (h->num_digits > 0) { + exp = h->decimal_point - 1; + } + bool negative_exp = exp < 0; + if (negative_exp) { + exp = -exp; + } + + size_t n = (h->negative || + (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) + ? 4 + : 3; // Mininum 3 bytes: first digit and then "e±". + if (precision > 0) { + n += precision + 1; // +1 for the '.'. + } + n += (exp < 100) ? 2 : 3; + + // Don't modify dst if the formatted number won't fit. + if (n > dst.len) { + return 0; + } + + // Align-left or align-right. + uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) + ? &dst.ptr[dst.len - n] + : &dst.ptr[0]; + + // Leading "±". + if (h->negative) { + *ptr++ = '-'; + } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { + *ptr++ = '+'; + } + + // Integral digit. + if (h->num_digits > 0) { + *ptr++ = (uint8_t)('0' | h->digits[0]); + } else { + *ptr++ = '0'; + } + + // Separator and then fractional digits. + if (precision > 0) { + *ptr++ = + (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) + ? ',' + : '.'; + uint32_t i = 1; + uint32_t j = wuffs_base__u32__min(h->num_digits, precision + 1); + for (; i < j; i++) { + *ptr++ = (uint8_t)('0' | h->digits[i]); + } + for (; i <= precision; i++) { + *ptr++ = '0'; + } + } + + // Exponent: "e±" and then 2 or 3 digits. + *ptr++ = 'e'; + *ptr++ = negative_exp ? '-' : '+'; + if (exp < 10) { + *ptr++ = '0'; + *ptr++ = (uint8_t)('0' | exp); + } else if (exp < 100) { + *ptr++ = (uint8_t)('0' | (exp / 10)); + *ptr++ = (uint8_t)('0' | (exp % 10)); + } else { + int32_t e = exp / 100; + exp -= e * 100; + *ptr++ = (uint8_t)('0' | e); + *ptr++ = (uint8_t)('0' | (exp / 10)); + *ptr++ = (uint8_t)('0' | (exp % 10)); + } + + return n; +} + +WUFFS_BASE__MAYBE_STATIC size_t // +wuffs_base__render_number_f64(wuffs_base__slice_u8 dst, + double x, + uint32_t precision, + uint32_t options) { + // Decompose x (64 bits) into negativity (1 bit), base-2 exponent (11 bits + // with a -1023 bias) and mantissa (52 bits). + uint64_t bits = wuffs_base__ieee_754_bit_representation__from_f64_to_u64(x); + bool neg = (bits >> 63) != 0; + int32_t exp2 = ((int32_t)(bits >> 52)) & 0x7FF; + uint64_t man = bits & 0x000FFFFFFFFFFFFFul; + + // Apply the exponent bias and set the implicit top bit of the mantissa, + // unless x is subnormal. Also take care of Inf and NaN. + if (exp2 == 0x7FF) { + if (man != 0) { + return wuffs_base__private_implementation__render_nan(dst); + } + return wuffs_base__private_implementation__render_inf(dst, neg, options); + } else if (exp2 == 0) { + exp2 = -1022; + } else { + exp2 -= 1023; + man |= 0x0010000000000000ul; + } + + // Ensure that precision isn't too large. + if (precision > 4095) { + precision = 4095; + } + + // Convert from the (neg, exp2, man) tuple to an HPD. + wuffs_base__private_implementation__high_prec_dec h; + wuffs_base__private_implementation__high_prec_dec__assign(&h, man, neg); + if (h.num_digits > 0) { + wuffs_base__private_implementation__high_prec_dec__lshift( + &h, exp2 - 52); // 52 mantissa bits. + } + + // Handle the "%e" and "%f" formats. + switch (options & (WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT | + WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT)) { + case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT: // The "%"f" format. + if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { + wuffs_base__private_implementation__high_prec_dec__round_just_enough( + &h, exp2, man); + int32_t p = ((int32_t)(h.num_digits)) - h.decimal_point; + precision = ((uint32_t)(wuffs_base__i32__max(0, p))); + } else { + wuffs_base__private_implementation__high_prec_dec__round_nearest( + &h, ((int32_t)precision) + h.decimal_point); + } + return wuffs_base__private_implementation__high_prec_dec__render_exponent_absent( + dst, &h, precision, options); + + case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT: // The "%e" format. + if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { + wuffs_base__private_implementation__high_prec_dec__round_just_enough( + &h, exp2, man); + precision = (h.num_digits > 0) ? (h.num_digits - 1) : 0; + } else { + wuffs_base__private_implementation__high_prec_dec__round_nearest( + &h, ((int32_t)precision) + 1); + } + return wuffs_base__private_implementation__high_prec_dec__render_exponent_present( + dst, &h, precision, options); + } + + // We have the "%g" format and so precision means the number of significant + // digits, not the number of digits after the decimal separator. Perform + // rounding and determine whether to use "%e" or "%f". + int32_t e_threshold = 0; + if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { + wuffs_base__private_implementation__high_prec_dec__round_just_enough( + &h, exp2, man); + precision = h.num_digits; + e_threshold = 6; + } else { + if (precision == 0) { + precision = 1; + } + wuffs_base__private_implementation__high_prec_dec__round_nearest( + &h, ((int32_t)precision)); + e_threshold = ((int32_t)precision); + int32_t nd = ((int32_t)(h.num_digits)); + if ((e_threshold > nd) && (nd >= h.decimal_point)) { + e_threshold = nd; + } + } + + // Use the "%e" format if the exponent is large. + int32_t e = h.decimal_point - 1; + if ((e < -4) || (e_threshold <= e)) { + uint32_t p = wuffs_base__u32__min(precision, h.num_digits); + return wuffs_base__private_implementation__high_prec_dec__render_exponent_present( + dst, &h, (p > 0) ? (p - 1) : 0, options); + } + + // Use the "%f" format otherwise. + int32_t p = ((int32_t)precision); + if (p > h.decimal_point) { + p = ((int32_t)(h.num_digits)); + } + precision = ((uint32_t)(wuffs_base__i32__max(0, p - h.decimal_point))); + return wuffs_base__private_implementation__high_prec_dec__render_exponent_absent( + dst, &h, precision, options); +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || + // defined(WUFFS_CONFIG__MODULE__BASE) || + // defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ + defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) + +// ---------------- Integer + +// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits, +// and (0x80 | v) for valid digits, where v is the 4 bit value. + +static const uint8_t wuffs_base__parse_number__decimal_digits[256] = { + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. + 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F +}; + +static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = { + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. + 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. + + 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x40 ..= 0x47. 'A'-'F'. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. + 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x60 ..= 0x67. 'a'-'f'. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F +}; + +static const uint8_t wuffs_base__private_implementation__encode_base16[16] = { + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // 0x00 ..= 0x07. + 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, // 0x08 ..= 0x0F. +}; + +// -------- + +WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 // +wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options) { + uint8_t* p = s.ptr; + uint8_t* q = s.ptr + s.len; + + if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { + for (; (p < q) && (*p == '_'); p++) { + } + } + + bool negative = false; + if (p >= q) { + goto fail_bad_argument; + } else if (*p == '-') { + p++; + negative = true; + } else if (*p == '+') { + p++; + } + + do { + wuffs_base__result_u64 r = wuffs_base__parse_number_u64( + wuffs_base__make_slice_u8(p, (size_t)(q - p)), options); + if (r.status.repr != NULL) { + wuffs_base__result_i64 ret; + ret.status.repr = r.status.repr; + ret.value = 0; + return ret; + } else if (negative) { + if (r.value < 0x8000000000000000) { + wuffs_base__result_i64 ret; + ret.status.repr = NULL; + ret.value = -(int64_t)(r.value); + return ret; + } else if (r.value == 0x8000000000000000) { + wuffs_base__result_i64 ret; + ret.status.repr = NULL; + ret.value = INT64_MIN; + return ret; + } + goto fail_out_of_bounds; + } else if (r.value > 0x7FFFFFFFFFFFFFFF) { + goto fail_out_of_bounds; + } else { + wuffs_base__result_i64 ret; + ret.status.repr = NULL; + ret.value = +(int64_t)(r.value); + return ret; + } + } while (0); + +fail_bad_argument: + do { + wuffs_base__result_i64 ret; + ret.status.repr = wuffs_base__error__bad_argument; + ret.value = 0; + return ret; + } while (0); + +fail_out_of_bounds: + do { + wuffs_base__result_i64 ret; + ret.status.repr = wuffs_base__error__out_of_bounds; + ret.value = 0; + return ret; + } while (0); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 // +wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options) { + uint8_t* p = s.ptr; + uint8_t* q = s.ptr + s.len; + + if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { + for (; (p < q) && (*p == '_'); p++) { + } + } + + if (p >= q) { + goto fail_bad_argument; + + } else if (*p == '0') { + p++; + if (p >= q) { + goto ok_zero; + } + if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { + if (*p == '_') { + p++; + for (; p < q; p++) { + if (*p != '_') { + if (options & + WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { + goto decimal; + } + goto fail_bad_argument; + } + } + goto ok_zero; + } + } + + if ((*p == 'x') || (*p == 'X')) { + p++; + if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { + for (; (p < q) && (*p == '_'); p++) { + } + } + if (p < q) { + goto hexadecimal; + } + + } else if ((*p == 'd') || (*p == 'D')) { + p++; + if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { + for (; (p < q) && (*p == '_'); p++) { + } + } + if (p < q) { + goto decimal; + } + } + + if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { + goto decimal; + } + goto fail_bad_argument; + } + +decimal: + do { + uint64_t v = wuffs_base__parse_number__decimal_digits[*p++]; + if (v == 0) { + goto fail_bad_argument; + } + v &= 0x0F; + + // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1). + const uint64_t max10 = 1844674407370955161u; + const uint8_t max1 = 5; + + for (; p < q; p++) { + if ((*p == '_') && + (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { + continue; + } + uint8_t digit = wuffs_base__parse_number__decimal_digits[*p]; + if (digit == 0) { + goto fail_bad_argument; + } + digit &= 0x0F; + if ((v > max10) || ((v == max10) && (digit > max1))) { + goto fail_out_of_bounds; + } + v = (10 * v) + ((uint64_t)(digit)); + } + + wuffs_base__result_u64 ret; + ret.status.repr = NULL; + ret.value = v; + return ret; + } while (0); + +hexadecimal: + do { + uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++]; + if (v == 0) { + goto fail_bad_argument; + } + v &= 0x0F; + + for (; p < q; p++) { + if ((*p == '_') && + (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { + continue; + } + uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p]; + if (digit == 0) { + goto fail_bad_argument; + } + digit &= 0x0F; + if ((v >> 60) != 0) { + goto fail_out_of_bounds; + } + v = (v << 4) | ((uint64_t)(digit)); + } + + wuffs_base__result_u64 ret; + ret.status.repr = NULL; + ret.value = v; + return ret; + } while (0); + +ok_zero: + do { + wuffs_base__result_u64 ret; + ret.status.repr = NULL; + ret.value = 0; + return ret; + } while (0); + +fail_bad_argument: + do { + wuffs_base__result_u64 ret; + ret.status.repr = wuffs_base__error__bad_argument; + ret.value = 0; + return ret; + } while (0); + +fail_out_of_bounds: + do { + wuffs_base__result_u64 ret; + ret.status.repr = wuffs_base__error__out_of_bounds; + ret.value = 0; + return ret; + } while (0); +} + +// -------- + +// wuffs_base__render_number__first_hundred contains the decimal encodings of +// the first one hundred numbers [0 ..= 99]. +static const uint8_t wuffs_base__render_number__first_hundred[200] = { + '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', // + '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', // + '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', // + '1', '5', '1', '6', '1', '7', '1', '8', '1', '9', // + '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', // + '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', // + '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', // + '3', '5', '3', '6', '3', '7', '3', '8', '3', '9', // + '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', // + '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', // + '5', '0', '5', '1', '5', '2', '5', '3', '5', '4', // + '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', // + '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', // + '6', '5', '6', '6', '6', '7', '6', '8', '6', '9', // + '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', // + '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', // + '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', // + '8', '5', '8', '6', '8', '7', '8', '8', '8', '9', // + '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', // + '9', '5', '9', '6', '9', '7', '9', '8', '9', '9', // +}; + +static size_t // +wuffs_base__private_implementation__render_number_u64(wuffs_base__slice_u8 dst, + uint64_t x, + uint32_t options, + bool neg) { + uint8_t buf[WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL]; + uint8_t* ptr = &buf[0] + sizeof(buf); + + while (x >= 100) { + size_t index = ((size_t)((x % 100) * 2)); + x /= 100; + uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; + uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; + ptr -= 2; + ptr[0] = s0; + ptr[1] = s1; + } + + if (x < 10) { + ptr -= 1; + ptr[0] = (uint8_t)('0' + x); + } else { + size_t index = ((size_t)(x * 2)); + uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; + uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; + ptr -= 2; + ptr[0] = s0; + ptr[1] = s1; + } + + if (neg) { + ptr -= 1; + ptr[0] = '-'; + } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { + ptr -= 1; + ptr[0] = '+'; + } + + size_t n = sizeof(buf) - ((size_t)(ptr - &buf[0])); + if (n > dst.len) { + return 0; + } + memcpy(dst.ptr + ((options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) + ? (dst.len - n) + : 0), + ptr, n); + return n; +} + +WUFFS_BASE__MAYBE_STATIC size_t // +wuffs_base__render_number_i64(wuffs_base__slice_u8 dst, + int64_t x, + uint32_t options) { + uint64_t u = (uint64_t)x; + bool neg = x < 0; + if (neg) { + u = 1 + ~u; + } + return wuffs_base__private_implementation__render_number_u64(dst, u, options, + neg); +} + +WUFFS_BASE__MAYBE_STATIC size_t // +wuffs_base__render_number_u64(wuffs_base__slice_u8 dst, + uint64_t x, + uint32_t options) { + return wuffs_base__private_implementation__render_number_u64(dst, x, options, + false); +} + +// ---------------- Base-16 + +WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src, + bool src_closed, + uint32_t options) { + wuffs_base__transform__output o; + size_t src_len2 = src.len / 2; + size_t len; + if (dst.len < src_len2) { + len = dst.len; + o.status.repr = wuffs_base__suspension__short_write; + } else { + len = src_len2; + if (!src_closed) { + o.status.repr = wuffs_base__suspension__short_read; + } else if (src.len & 1) { + o.status.repr = wuffs_base__error__bad_data; + } else { + o.status.repr = NULL; + } + } + + uint8_t* d = dst.ptr; + uint8_t* s = src.ptr; + size_t n = len; + + while (n--) { + *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) | + (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F)); + d += 1; + s += 2; + } + + o.num_dst = len; + o.num_src = len * 2; + return o; +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src, + bool src_closed, + uint32_t options) { + wuffs_base__transform__output o; + size_t src_len4 = src.len / 4; + size_t len = dst.len < src_len4 ? dst.len : src_len4; + if (dst.len < src_len4) { + len = dst.len; + o.status.repr = wuffs_base__suspension__short_write; + } else { + len = src_len4; + if (!src_closed) { + o.status.repr = wuffs_base__suspension__short_read; + } else if (src.len & 1) { + o.status.repr = wuffs_base__error__bad_data; + } else { + o.status.repr = NULL; + } + } + + uint8_t* d = dst.ptr; + uint8_t* s = src.ptr; + size_t n = len; + + while (n--) { + *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) | + (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F)); + d += 1; + s += 4; + } + + o.num_dst = len; + o.num_src = len * 4; + return o; +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src, + bool src_closed, + uint32_t options) { + wuffs_base__transform__output o; + size_t dst_len2 = dst.len / 2; + size_t len; + if (dst_len2 < src.len) { + len = dst_len2; + o.status.repr = wuffs_base__suspension__short_write; + } else { + len = src.len; + if (!src_closed) { + o.status.repr = wuffs_base__suspension__short_read; + } else { + o.status.repr = NULL; + } + } + + uint8_t* d = dst.ptr; + uint8_t* s = src.ptr; + size_t n = len; + + while (n--) { + uint8_t c = *s; + d[0] = wuffs_base__private_implementation__encode_base16[c >> 4]; + d[1] = wuffs_base__private_implementation__encode_base16[c & 0x0F]; + d += 2; + s += 1; + } + + o.num_dst = len * 2; + o.num_src = len; + return o; +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src, + bool src_closed, + uint32_t options) { + wuffs_base__transform__output o; + size_t dst_len4 = dst.len / 4; + size_t len; + if (dst_len4 < src.len) { + len = dst_len4; + o.status.repr = wuffs_base__suspension__short_write; + } else { + len = src.len; + if (!src_closed) { + o.status.repr = wuffs_base__suspension__short_read; + } else { + o.status.repr = NULL; + } + } + + uint8_t* d = dst.ptr; + uint8_t* s = src.ptr; + size_t n = len; + + while (n--) { + uint8_t c = *s; + d[0] = '\\'; + d[1] = 'x'; + d[2] = wuffs_base__private_implementation__encode_base16[c >> 4]; + d[3] = wuffs_base__private_implementation__encode_base16[c & 0x0F]; + d += 4; + s += 1; + } + + o.num_dst = len * 4; + o.num_src = len; + return o; +} + +// ---------------- Base-64 + +// The two base-64 alphabets, std and url, differ only in the last two codes. +// - std: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +// - url: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" + +static const uint8_t wuffs_base__base_64__decode_std[256] = { + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. + 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x80, 0x3F, // 0x28 ..= 0x2F. + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. + 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. + + 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. + 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. + 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. + 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x58 ..= 0x5F. + 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. + 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. + 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. + + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. + + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F +}; + +static const uint8_t wuffs_base__base_64__decode_url[256] = { + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, // 0x28 ..= 0x2F. + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. + 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. + + 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. + 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. + 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. + 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x3F, // 0x58 ..= 0x5F. + 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. + 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. + 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. + + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. + + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F +}; + +static const uint8_t wuffs_base__base_64__encode_std[64] = { + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. + 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. + 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. + 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. + 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. + 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F, // 0x38 ..= 0x3F. +}; + +static const uint8_t wuffs_base__base_64__encode_url[64] = { + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. + 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. + 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. + 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. + 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. + 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2D, 0x5F, // 0x38 ..= 0x3F. +}; + +// -------- + +WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +wuffs_base__base_64__decode(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src, + bool src_closed, + uint32_t options) { + const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) + ? wuffs_base__base_64__decode_url + : wuffs_base__base_64__decode_std; + wuffs_base__transform__output o; + uint8_t* d_ptr = dst.ptr; + size_t d_len = dst.len; + const uint8_t* s_ptr = src.ptr; + size_t s_len = src.len; + bool pad = false; + + while (s_len >= 4) { + uint32_t s = wuffs_base__peek_u32le__no_bounds_check(s_ptr); + uint32_t s0 = alphabet[0xFF & (s >> 0)]; + uint32_t s1 = alphabet[0xFF & (s >> 8)]; + uint32_t s2 = alphabet[0xFF & (s >> 16)]; + uint32_t s3 = alphabet[0xFF & (s >> 24)]; + + if (((s0 | s1 | s2 | s3) & 0xC0) != 0) { + if (s_len > 4) { + o.status.repr = wuffs_base__error__bad_data; + goto done; + } else if (!src_closed) { + o.status.repr = wuffs_base__suspension__short_read; + goto done; + } else if ((options & WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING) && + (s_ptr[3] == '=')) { + pad = true; + if (s_ptr[2] == '=') { + goto src2; + } + goto src3; + } + o.status.repr = wuffs_base__error__bad_data; + goto done; + } + + if (d_len < 3) { + o.status.repr = wuffs_base__suspension__short_write; + goto done; + } + + s_ptr += 4; + s_len -= 4; + s = (s0 << 18) | (s1 << 12) | (s2 << 6) | (s3 << 0); + *d_ptr++ = (uint8_t)(s >> 16); + *d_ptr++ = (uint8_t)(s >> 8); + *d_ptr++ = (uint8_t)(s >> 0); + d_len -= 3; + } + + if (!src_closed) { + o.status.repr = wuffs_base__suspension__short_read; + goto done; + } + + if (s_len == 0) { + o.status.repr = NULL; + goto done; + } else if (s_len == 1) { + o.status.repr = wuffs_base__error__bad_data; + goto done; + } else if (s_len == 2) { + goto src2; + } + +src3: + do { + uint32_t s = wuffs_base__peek_u24le__no_bounds_check(s_ptr); + uint32_t s0 = alphabet[0xFF & (s >> 0)]; + uint32_t s1 = alphabet[0xFF & (s >> 8)]; + uint32_t s2 = alphabet[0xFF & (s >> 16)]; + if ((s0 & 0xC0) || (s1 & 0xC0) || (s2 & 0xC3)) { + o.status.repr = wuffs_base__error__bad_data; + goto done; + } + if (d_len < 2) { + o.status.repr = wuffs_base__suspension__short_write; + goto done; + } + s_ptr += pad ? 4 : 3; + s = (s0 << 18) | (s1 << 12) | (s2 << 6); + *d_ptr++ = (uint8_t)(s >> 16); + *d_ptr++ = (uint8_t)(s >> 8); + o.status.repr = NULL; + goto done; + } while (0); + +src2: + do { + uint32_t s = wuffs_base__peek_u16le__no_bounds_check(s_ptr); + uint32_t s0 = alphabet[0xFF & (s >> 0)]; + uint32_t s1 = alphabet[0xFF & (s >> 8)]; + if ((s0 & 0xC0) || (s1 & 0xCF)) { + o.status.repr = wuffs_base__error__bad_data; + goto done; + } + if (d_len < 1) { + o.status.repr = wuffs_base__suspension__short_write; + goto done; + } + s_ptr += pad ? 4 : 2; + s = (s0 << 18) | (s1 << 12); + *d_ptr++ = (uint8_t)(s >> 16); + o.status.repr = NULL; + goto done; + } while (0); + +done: + o.num_dst = (size_t)(d_ptr - dst.ptr); + o.num_src = (size_t)(s_ptr - src.ptr); + return o; +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +wuffs_base__base_64__encode(wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 src, + bool src_closed, + uint32_t options) { + const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) + ? wuffs_base__base_64__encode_url + : wuffs_base__base_64__encode_std; + wuffs_base__transform__output o; + uint8_t* d_ptr = dst.ptr; + size_t d_len = dst.len; + const uint8_t* s_ptr = src.ptr; + size_t s_len = src.len; + + do { + while (s_len >= 3) { + if (d_len < 4) { + o.status.repr = wuffs_base__suspension__short_write; + goto done; + } + uint32_t s = wuffs_base__peek_u24be__no_bounds_check(s_ptr); + s_ptr += 3; + s_len -= 3; + *d_ptr++ = alphabet[0x3F & (s >> 18)]; + *d_ptr++ = alphabet[0x3F & (s >> 12)]; + *d_ptr++ = alphabet[0x3F & (s >> 6)]; + *d_ptr++ = alphabet[0x3F & (s >> 0)]; + d_len -= 4; + } + + if (!src_closed) { + o.status.repr = wuffs_base__suspension__short_read; + goto done; + } + + if (s_len == 2) { + if (d_len < + ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 3)) { + o.status.repr = wuffs_base__suspension__short_write; + goto done; + } + uint32_t s = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(s_ptr))) + << 8; + s_ptr += 2; + *d_ptr++ = alphabet[0x3F & (s >> 18)]; + *d_ptr++ = alphabet[0x3F & (s >> 12)]; + *d_ptr++ = alphabet[0x3F & (s >> 6)]; + if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { + *d_ptr++ = '='; + } + o.status.repr = NULL; + goto done; + + } else if (s_len == 1) { + if (d_len < + ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 2)) { + o.status.repr = wuffs_base__suspension__short_write; + goto done; + } + uint32_t s = ((uint32_t)(wuffs_base__peek_u8__no_bounds_check(s_ptr))) + << 16; + s_ptr += 1; + *d_ptr++ = alphabet[0x3F & (s >> 18)]; + *d_ptr++ = alphabet[0x3F & (s >> 12)]; + if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { + *d_ptr++ = '='; + *d_ptr++ = '='; + } + o.status.repr = NULL; + goto done; + + } else { + o.status.repr = NULL; + goto done; + } + } while (0); + +done: + o.num_dst = (size_t)(d_ptr - dst.ptr); + o.num_src = (size_t)(s_ptr - src.ptr); + return o; +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || + // defined(WUFFS_CONFIG__MODULE__BASE) || + // defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ + defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) + +// ---------------- Magic Numbers + +// ICO doesn't start with a magic identifier. Instead, see if the opening bytes +// are plausibly ICO. +// +// Callers should have already verified that (prefix_data.len >= 2) and the +// first two bytes are 0x00. +// +// See: +// - https://docs.fileformat.com/image/ico/ +static int32_t // +wuffs_base__magic_number_guess_fourcc__maybe_ico( + wuffs_base__slice_u8 prefix_data, + bool prefix_closed) { + // Allow-list for the Image Type field. + if (prefix_data.len < 4) { + return prefix_closed ? 0 : -1; + } else if (prefix_data.ptr[3] != 0) { + return 0; + } + switch (prefix_data.ptr[2]) { + case 0x01: // ICO + case 0x02: // CUR + break; + default: + return 0; + } + + // The Number Of Images should be positive. + if (prefix_data.len < 6) { + return prefix_closed ? 0 : -1; + } else if ((prefix_data.ptr[4] == 0) && (prefix_data.ptr[5] == 0)) { + return 0; + } + + // The first ICONDIRENTRY's fourth byte should be zero. + if (prefix_data.len < 10) { + return prefix_closed ? 0 : -1; + } else if (prefix_data.ptr[9] != 0) { + return 0; + } + + // TODO: have a separate FourCC for CUR? + return 0x49434F20; // 'ICO 'be +} + +// TGA doesn't start with a magic identifier. Instead, see if the opening bytes +// are plausibly TGA. +// +// Callers should have already verified that (prefix_data.len >= 2) and the +// second byte (prefix_data.ptr[1], the Color Map Type byte), is either 0x00 or +// 0x01. +// +// See: +// - https://docs.fileformat.com/image/tga/ +// - https://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf +static int32_t // +wuffs_base__magic_number_guess_fourcc__maybe_tga( + wuffs_base__slice_u8 prefix_data, + bool prefix_closed) { + // Allow-list for the Image Type field. + if (prefix_data.len < 3) { + return prefix_closed ? 0 : -1; + } + switch (prefix_data.ptr[2]) { + case 0x01: + case 0x02: + case 0x03: + case 0x09: + case 0x0A: + case 0x0B: + break; + default: + // TODO: 0x20 and 0x21 are invalid, according to the spec, but are + // apparently unofficial extensions. + return 0; + } + + // Allow-list for the Color Map Entry Size field (if the Color Map Type field + // is non-zero) or else all the Color Map fields should be zero. + if (prefix_data.len < 8) { + return prefix_closed ? 0 : -1; + } else if (prefix_data.ptr[1] != 0x00) { + switch (prefix_data.ptr[7]) { + case 0x0F: + case 0x10: + case 0x18: + case 0x20: + break; + default: + return 0; + } + } else if ((prefix_data.ptr[3] | prefix_data.ptr[4] | prefix_data.ptr[5] | + prefix_data.ptr[6] | prefix_data.ptr[7]) != 0x00) { + return 0; + } + + // Allow-list for the Pixel Depth field. + if (prefix_data.len < 17) { + return prefix_closed ? 0 : -1; + } + switch (prefix_data.ptr[16]) { + case 0x01: + case 0x08: + case 0x0F: + case 0x10: + case 0x18: + case 0x20: + break; + default: + return 0; + } + + return 0x54474120; // 'TGA 'be +} + +WUFFS_BASE__MAYBE_STATIC int32_t // +wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, + bool prefix_closed) { + // This is similar to (but different from): + // - the magic/Magdir tables under https://github.com/file/file + // - the MIME Sniffing algorithm at https://mimesniff.spec.whatwg.org/ + + // table holds the 'magic numbers' (which are actually variable length + // strings). The strings may contain NUL bytes, so the "const char* magic" + // value starts with the length-minus-1 of the 'magic number'. + // + // Keep it sorted by magic[1], then magic[0] descending (prioritizing longer + // matches) and finally by magic[2:]. When multiple entries match, the + // longest one wins. + // + // The fourcc field might be negated, in which case there's further + // specialization (see § below). + static struct { + int32_t fourcc; + const char* magic; + } table[] = { + {-0x30302020, "\x01\x00\x00"}, // '00 'be + {+0x475A2020, "\x02\x1F\x8B\x08"}, // GZ + {+0x5A535444, "\x03\x28\xB5\x2F\xFD"}, // ZSTD + {+0x425A3220, "\x02\x42\x5A\x68"}, // BZ2 + {+0x424D5020, "\x01\x42\x4D"}, // BMP + {+0x47494620, "\x03\x47\x49\x46\x38"}, // GIF + {+0x54494646, "\x03\x49\x49\x2A\x00"}, // TIFF (little-endian) + {+0x54494646, "\x03\x4D\x4D\x00\x2A"}, // TIFF (big-endian) + {-0x52494646, "\x03\x52\x49\x46\x46"}, // RIFF + {+0x4E494520, "\x02\x6E\xC3\xAF"}, // NIE + {+0x514F4920, "\x03\x71\x6F\x69\x66"}, // QOI + {+0x5A4C4942, "\x01\x78\x9C"}, // ZLIB + {+0x504E4720, "\x03\x89\x50\x4E\x47"}, // PNG + {+0x4A504547, "\x01\xFF\xD8"}, // JPEG + }; + static const size_t table_len = sizeof(table) / sizeof(table[0]); + + if (prefix_data.len == 0) { + return prefix_closed ? 0 : -1; + } + uint8_t pre_first_byte = prefix_data.ptr[0]; + + int32_t fourcc = 0; + size_t i; + for (i = 0; i < table_len; i++) { + uint8_t mag_first_byte = ((uint8_t)(table[i].magic[1])); + if (pre_first_byte < mag_first_byte) { + break; + } else if (pre_first_byte > mag_first_byte) { + continue; + } + fourcc = table[i].fourcc; + + uint8_t mag_remaining_len = ((uint8_t)(table[i].magic[0])); + if (mag_remaining_len == 0) { + goto match; + } + + const char* mag_remaining_ptr = table[i].magic + 2; + uint8_t* pre_remaining_ptr = prefix_data.ptr + 1; + size_t pre_remaining_len = prefix_data.len - 1; + if (pre_remaining_len < mag_remaining_len) { + if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, pre_remaining_len)) { + return prefix_closed ? 0 : -1; + } + } else { + if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, mag_remaining_len)) { + goto match; + } + } + } + + if (prefix_data.len < 2) { + return prefix_closed ? 0 : -1; + } else if ((prefix_data.ptr[1] == 0x00) || (prefix_data.ptr[1] == 0x01)) { + return wuffs_base__magic_number_guess_fourcc__maybe_tga(prefix_data, + prefix_closed); + } + + return 0; + +match: + // Negative FourCC values (see § above) are further specialized. + if (fourcc < 0) { + fourcc = -fourcc; + + if (fourcc == 0x52494646) { // 'RIFF'be + if (prefix_data.len < 12) { + return prefix_closed ? 0 : -1; + } + uint32_t x = wuffs_base__peek_u32be__no_bounds_check(prefix_data.ptr + 8); + if (x == 0x57454250) { // 'WEBP'be + return 0x57454250; // 'WEBP'be + } + + } else if (fourcc == 0x30302020) { // '00 'be + // Binary data starting with multiple 0x00 NUL bytes is quite common. + // Unfortunately, some file formats also don't start with a magic + // identifier, so we have to use heuristics (where the order matters, the + // same as /usr/bin/file's magic/Magdir tables) as best we can. Maybe + // it's TGA, ICO/CUR, etc. Maybe it's something else. + int32_t tga = wuffs_base__magic_number_guess_fourcc__maybe_tga( + prefix_data, prefix_closed); + if (tga != 0) { + return tga; + } + int32_t ico = wuffs_base__magic_number_guess_fourcc__maybe_ico( + prefix_data, prefix_closed); + if (ico != 0) { + return ico; + } + if (prefix_data.len < 4) { + return prefix_closed ? 0 : -1; + } else if ((prefix_data.ptr[2] != 0x00) && + ((prefix_data.ptr[2] >= 0x80) || + (prefix_data.ptr[3] != 0x00))) { + // Roughly speaking, this could be a non-degenerate (non-0-width and + // non-0-height) WBMP image. + return 0x57424D50; // 'WBMP'be + } + return 0; + } + } + return fourcc; +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || + // defined(WUFFS_CONFIG__MODULE__BASE) || + // defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ + defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) + +// ---------------- Pixel Swizzler + +static inline uint32_t // +wuffs_base__swap_u32_argb_abgr(uint32_t u) { + uint32_t o = u & 0xFF00FF00ul; + uint32_t r = u & 0x00FF0000ul; + uint32_t b = u & 0x000000FFul; + return o | (r >> 16) | (b << 16); +} + +static inline uint64_t // +wuffs_base__swap_u64_argb_abgr(uint64_t u) { + uint64_t o = u & 0xFFFF0000FFFF0000ull; + uint64_t r = u & 0x0000FFFF00000000ull; + uint64_t b = u & 0x000000000000FFFFull; + return o | (r >> 32) | (b << 32); +} + +static inline uint32_t // +wuffs_base__color_u64__as__color_u32__swap_u32_argb_abgr(uint64_t c) { + uint32_t a = ((uint32_t)(0xFF & (c >> 56))); + uint32_t r = ((uint32_t)(0xFF & (c >> 40))); + uint32_t g = ((uint32_t)(0xFF & (c >> 24))); + uint32_t b = ((uint32_t)(0xFF & (c >> 8))); + return (a << 24) | (b << 16) | (g << 8) | (r << 0); +} + +// -------- + +WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul // +wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb, + uint32_t x, + uint32_t y) { + if (!pb || (x >= pb->pixcfg.private_impl.width) || + (y >= pb->pixcfg.private_impl.height)) { + return 0; + } + + if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { + // TODO: support planar formats. + return 0; + } + + size_t stride = pb->private_impl.planes[0].stride; + const uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); + + switch (pb->pixcfg.private_impl.pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: + return wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); + + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { + uint8_t* palette = pb->private_impl.planes[3].ptr; + return wuffs_base__peek_u32le__no_bounds_check(palette + + (4 * ((size_t)row[x]))); + } + + // Common formats above. Rarer formats below. + + case WUFFS_BASE__PIXEL_FORMAT__Y: + return 0xFF000000 | (0x00010101 * ((uint32_t)(row[x]))); + case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: + return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 1]))); + case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: + return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 0]))); + + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: { + uint8_t* palette = pb->private_impl.planes[3].ptr; + return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( + wuffs_base__peek_u32le__no_bounds_check(palette + + (4 * ((size_t)row[x])))); + } + + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + return wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( + wuffs_base__peek_u16le__no_bounds_check(row + (2 * ((size_t)x)))); + case WUFFS_BASE__PIXEL_FORMAT__BGR: + return 0xFF000000 | + wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x))); + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( + wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + return wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( + wuffs_base__peek_u64le__no_bounds_check(row + (8 * ((size_t)x)))); + case WUFFS_BASE__PIXEL_FORMAT__BGRX: + return 0xFF000000 | + wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); + + case WUFFS_BASE__PIXEL_FORMAT__RGB: + return wuffs_base__swap_u32_argb_abgr( + 0xFF000000 | + wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x)))); + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + return wuffs_base__swap_u32_argb_abgr( + wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( + wuffs_base__peek_u32le__no_bounds_check(row + + (4 * ((size_t)x))))); + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: + return wuffs_base__swap_u32_argb_abgr( + wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); + case WUFFS_BASE__PIXEL_FORMAT__RGBX: + return wuffs_base__swap_u32_argb_abgr( + 0xFF000000 | + wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); + + default: + // TODO: support more formats. + break; + } + + return 0; +} + +// -------- + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +wuffs_base__pixel_buffer__set_color_u32_at( + wuffs_base__pixel_buffer* pb, + uint32_t x, + uint32_t y, + wuffs_base__color_u32_argb_premul color) { + if (!pb) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if ((x >= pb->pixcfg.private_impl.width) || + (y >= pb->pixcfg.private_impl.height)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + + if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { + // TODO: support planar formats. + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + + size_t stride = pb->private_impl.planes[0].stride; + uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); + + switch (pb->pixcfg.private_impl.pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRX: + wuffs_base__poke_u32le__no_bounds_check(row + (4 * ((size_t)x)), color); + break; + + // Common formats above. Rarer formats below. + + case WUFFS_BASE__PIXEL_FORMAT__Y: + wuffs_base__poke_u8__no_bounds_check( + row + ((size_t)x), + wuffs_base__color_u32_argb_premul__as__color_u8_gray(color)); + break; + case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: + wuffs_base__poke_u16le__no_bounds_check( + row + (2 * ((size_t)x)), + wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); + break; + case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: + wuffs_base__poke_u16be__no_bounds_check( + row + (2 * ((size_t)x)), + wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); + break; + + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: + wuffs_base__poke_u8__no_bounds_check( + row + ((size_t)x), wuffs_base__pixel_palette__closest_element( + wuffs_base__pixel_buffer__palette(pb), + pb->pixcfg.private_impl.pixfmt, color)); + break; + + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + wuffs_base__poke_u16le__no_bounds_check( + row + (2 * ((size_t)x)), + wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); + break; + case WUFFS_BASE__PIXEL_FORMAT__BGR: + wuffs_base__poke_u24le__no_bounds_check(row + (3 * ((size_t)x)), color); + break; + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + wuffs_base__poke_u32le__no_bounds_check( + row + (4 * ((size_t)x)), + wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( + color)); + break; + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + wuffs_base__poke_u64le__no_bounds_check( + row + (8 * ((size_t)x)), + wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( + color)); + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGB: + wuffs_base__poke_u24le__no_bounds_check( + row + (3 * ((size_t)x)), wuffs_base__swap_u32_argb_abgr(color)); + break; + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + wuffs_base__poke_u32le__no_bounds_check( + row + (4 * ((size_t)x)), + wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( + wuffs_base__swap_u32_argb_abgr(color))); + break; + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBX: + wuffs_base__poke_u32le__no_bounds_check( + row + (4 * ((size_t)x)), wuffs_base__swap_u32_argb_abgr(color)); + break; + + default: + // TODO: support more formats. + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + + return wuffs_base__make_status(NULL); +} + +// -------- + +static inline void // +wuffs_base__pixel_buffer__set_color_u32_fill_rect__xx( + wuffs_base__pixel_buffer* pb, + wuffs_base__rect_ie_u32 rect, + uint16_t color) { + size_t stride = pb->private_impl.planes[0].stride; + uint32_t width = wuffs_base__rect_ie_u32__width(&rect); + if ((stride == (2 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { + uint8_t* ptr = + pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); + uint32_t height = wuffs_base__rect_ie_u32__height(&rect); + size_t n; + for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { + wuffs_base__poke_u16le__no_bounds_check(ptr, color); + ptr += 2; + } + return; + } + + uint32_t y; + for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { + uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + + (2 * ((size_t)rect.min_incl_x)); + uint32_t n; + for (n = width; n > 0; n--) { + wuffs_base__poke_u16le__no_bounds_check(ptr, color); + ptr += 2; + } + } +} + +static inline void // +wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxx( + wuffs_base__pixel_buffer* pb, + wuffs_base__rect_ie_u32 rect, + uint32_t color) { + size_t stride = pb->private_impl.planes[0].stride; + uint32_t width = wuffs_base__rect_ie_u32__width(&rect); + if ((stride == (3 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { + uint8_t* ptr = + pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); + uint32_t height = wuffs_base__rect_ie_u32__height(&rect); + size_t n; + for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { + wuffs_base__poke_u24le__no_bounds_check(ptr, color); + ptr += 3; + } + return; + } + + uint32_t y; + for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { + uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + + (3 * ((size_t)rect.min_incl_x)); + uint32_t n; + for (n = width; n > 0; n--) { + wuffs_base__poke_u24le__no_bounds_check(ptr, color); + ptr += 3; + } + } +} + +static inline void // +wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( + wuffs_base__pixel_buffer* pb, + wuffs_base__rect_ie_u32 rect, + uint32_t color) { + size_t stride = pb->private_impl.planes[0].stride; + uint32_t width = wuffs_base__rect_ie_u32__width(&rect); + if ((stride == (4 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { + uint8_t* ptr = + pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); + uint32_t height = wuffs_base__rect_ie_u32__height(&rect); + size_t n; + for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { + wuffs_base__poke_u32le__no_bounds_check(ptr, color); + ptr += 4; + } + return; + } + + uint32_t y; + for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { + uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + + (4 * ((size_t)rect.min_incl_x)); + uint32_t n; + for (n = width; n > 0; n--) { + wuffs_base__poke_u32le__no_bounds_check(ptr, color); + ptr += 4; + } + } +} + +static inline void // +wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( + wuffs_base__pixel_buffer* pb, + wuffs_base__rect_ie_u32 rect, + uint64_t color) { + size_t stride = pb->private_impl.planes[0].stride; + uint32_t width = wuffs_base__rect_ie_u32__width(&rect); + if ((stride == (8 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { + uint8_t* ptr = + pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); + uint32_t height = wuffs_base__rect_ie_u32__height(&rect); + size_t n; + for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { + wuffs_base__poke_u64le__no_bounds_check(ptr, color); + ptr += 8; + } + return; + } + + uint32_t y; + for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { + uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + + (8 * ((size_t)rect.min_incl_x)); + uint32_t n; + for (n = width; n > 0; n--) { + wuffs_base__poke_u64le__no_bounds_check(ptr, color); + ptr += 8; + } + } +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +wuffs_base__pixel_buffer__set_color_u32_fill_rect( + wuffs_base__pixel_buffer* pb, + wuffs_base__rect_ie_u32 rect, + wuffs_base__color_u32_argb_premul color) { + if (!pb) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } else if (wuffs_base__rect_ie_u32__is_empty(&rect)) { + return wuffs_base__make_status(NULL); + } + wuffs_base__rect_ie_u32 bounds = + wuffs_base__pixel_config__bounds(&pb->pixcfg); + if (!wuffs_base__rect_ie_u32__contains_rect(&bounds, rect)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + + if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { + // TODO: support planar formats. + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + + switch (pb->pixcfg.private_impl.pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRX: + wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx(pb, rect, color); + return wuffs_base__make_status(NULL); + + // Common formats above. Rarer formats below. + + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + wuffs_base__pixel_buffer__set_color_u32_fill_rect__xx( + pb, rect, + wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); + return wuffs_base__make_status(NULL); + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxx(pb, rect, color); + return wuffs_base__make_status(NULL); + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( + pb, rect, + wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( + color)); + return wuffs_base__make_status(NULL); + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( + pb, rect, + wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( + color)); + return wuffs_base__make_status(NULL); + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( + pb, rect, + wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( + wuffs_base__swap_u32_argb_abgr(color))); + return wuffs_base__make_status(NULL); + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBX: + wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( + pb, rect, wuffs_base__swap_u32_argb_abgr(color)); + return wuffs_base__make_status(NULL); + } + + uint32_t y; + for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { + uint32_t x; + for (x = rect.min_incl_x; x < rect.max_excl_x; x++) { + wuffs_base__pixel_buffer__set_color_u32_at(pb, x, y, color); + } + } + return wuffs_base__make_status(NULL); +} + +// -------- + +WUFFS_BASE__MAYBE_STATIC uint8_t // +wuffs_base__pixel_palette__closest_element( + wuffs_base__slice_u8 palette_slice, + wuffs_base__pixel_format palette_format, + wuffs_base__color_u32_argb_premul c) { + size_t n = palette_slice.len / 4; + if (n > (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { + n = (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4); + } + size_t best_index = 0; + uint64_t best_score = 0xFFFFFFFFFFFFFFFF; + + // Work in 16-bit color. + uint32_t ca = 0x101 * (0xFF & (c >> 24)); + uint32_t cr = 0x101 * (0xFF & (c >> 16)); + uint32_t cg = 0x101 * (0xFF & (c >> 8)); + uint32_t cb = 0x101 * (0xFF & (c >> 0)); + + switch (palette_format.repr) { + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { + bool nonpremul = palette_format.repr == + WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL; + + size_t i; + for (i = 0; i < n; i++) { + // Work in 16-bit color. + uint32_t pb = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 0])); + uint32_t pg = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 1])); + uint32_t pr = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 2])); + uint32_t pa = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 3])); + + // Convert to premultiplied alpha. + if (nonpremul && (pa != 0xFFFF)) { + pb = (pb * pa) / 0xFFFF; + pg = (pg * pa) / 0xFFFF; + pr = (pr * pa) / 0xFFFF; + } + + // These deltas are conceptually int32_t (signed) but after squaring, + // it's equivalent to work in uint32_t (unsigned). + pb -= cb; + pg -= cg; + pr -= cr; + pa -= ca; + uint64_t score = ((uint64_t)(pb * pb)) + ((uint64_t)(pg * pg)) + + ((uint64_t)(pr * pr)) + ((uint64_t)(pa * pa)); + if (best_score > score) { + best_score = score; + best_index = i; + } + } + break; + } + } + + return (uint8_t)best_index; +} + +// -------- + +static inline uint32_t // +wuffs_base__composite_nonpremul_nonpremul_u32_axxx(uint32_t dst_nonpremul, + uint32_t src_nonpremul) { + // Extract 16-bit color components. + // + // If the destination is transparent then SRC_OVER is equivalent to SRC: just + // return src_nonpremul. This isn't just an optimization (skipping the rest + // of the function's computation). It also preserves the nonpremul + // distinction between e.g. transparent red and transparent blue that would + // otherwise be lost by converting from nonpremul to premul and back. + uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); + if (da == 0) { + return src_nonpremul; + } + uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); + uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); + uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); + uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); + uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); + uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); + uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); + + // Convert dst from nonpremul to premul. + dr = (dr * da) / 0xFFFF; + dg = (dg * da) / 0xFFFF; + db = (db * da) / 0xFFFF; + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (nonpremul) over dst (premul). + da = sa + ((da * ia) / 0xFFFF); + dr = ((sr * sa) + (dr * ia)) / 0xFFFF; + dg = ((sg * sa) + (dg * ia)) / 0xFFFF; + db = ((sb * sa) + (db * ia)) / 0xFFFF; + + // Convert dst from premul to nonpremul. + if (da != 0) { + dr = (dr * 0xFFFF) / da; + dg = (dg * 0xFFFF) / da; + db = (db * 0xFFFF) / da; + } + + // Convert from 16-bit color to 8-bit color. + da >>= 8; + dr >>= 8; + dg >>= 8; + db >>= 8; + + // Combine components. + return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +} + +static inline uint64_t // +wuffs_base__composite_nonpremul_nonpremul_u64_axxx(uint64_t dst_nonpremul, + uint64_t src_nonpremul) { + // Extract components. + // + // If the destination is transparent then SRC_OVER is equivalent to SRC: just + // return src_nonpremul. This isn't just an optimization (skipping the rest + // of the function's computation). It also preserves the nonpremul + // distinction between e.g. transparent red and transparent blue that would + // otherwise be lost by converting from nonpremul to premul and back. + uint64_t da = 0xFFFF & (dst_nonpremul >> 48); + if (da == 0) { + return src_nonpremul; + } + uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); + uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); + uint64_t db = 0xFFFF & (dst_nonpremul >> 0); + uint64_t sa = 0xFFFF & (src_nonpremul >> 48); + uint64_t sr = 0xFFFF & (src_nonpremul >> 32); + uint64_t sg = 0xFFFF & (src_nonpremul >> 16); + uint64_t sb = 0xFFFF & (src_nonpremul >> 0); + + // Convert dst from nonpremul to premul. + dr = (dr * da) / 0xFFFF; + dg = (dg * da) / 0xFFFF; + db = (db * da) / 0xFFFF; + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint64_t ia = 0xFFFF - sa; + + // Composite src (nonpremul) over dst (premul). + da = sa + ((da * ia) / 0xFFFF); + dr = ((sr * sa) + (dr * ia)) / 0xFFFF; + dg = ((sg * sa) + (dg * ia)) / 0xFFFF; + db = ((sb * sa) + (db * ia)) / 0xFFFF; + + // Convert dst from premul to nonpremul. + if (da != 0) { + dr = (dr * 0xFFFF) / da; + dg = (dg * 0xFFFF) / da; + db = (db * 0xFFFF) / da; + } + + // Combine components. + return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); +} + +static inline uint32_t // +wuffs_base__composite_nonpremul_premul_u32_axxx(uint32_t dst_nonpremul, + uint32_t src_premul) { + // Extract 16-bit color components. + uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); + uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); + uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); + uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); + uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); + uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); + uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); + uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); + + // Convert dst from nonpremul to premul. + dr = (dr * da) / 0xFFFF; + dg = (dg * da) / 0xFFFF; + db = (db * da) / 0xFFFF; + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (premul) over dst (premul). + da = sa + ((da * ia) / 0xFFFF); + dr = sr + ((dr * ia) / 0xFFFF); + dg = sg + ((dg * ia) / 0xFFFF); + db = sb + ((db * ia) / 0xFFFF); + + // Convert dst from premul to nonpremul. + if (da != 0) { + dr = (dr * 0xFFFF) / da; + dg = (dg * 0xFFFF) / da; + db = (db * 0xFFFF) / da; + } + + // Convert from 16-bit color to 8-bit color. + da >>= 8; + dr >>= 8; + dg >>= 8; + db >>= 8; + + // Combine components. + return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +} + +static inline uint64_t // +wuffs_base__composite_nonpremul_premul_u64_axxx(uint64_t dst_nonpremul, + uint64_t src_premul) { + // Extract components. + uint64_t da = 0xFFFF & (dst_nonpremul >> 48); + uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); + uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); + uint64_t db = 0xFFFF & (dst_nonpremul >> 0); + uint64_t sa = 0xFFFF & (src_premul >> 48); + uint64_t sr = 0xFFFF & (src_premul >> 32); + uint64_t sg = 0xFFFF & (src_premul >> 16); + uint64_t sb = 0xFFFF & (src_premul >> 0); + + // Convert dst from nonpremul to premul. + dr = (dr * da) / 0xFFFF; + dg = (dg * da) / 0xFFFF; + db = (db * da) / 0xFFFF; + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint64_t ia = 0xFFFF - sa; + + // Composite src (premul) over dst (premul). + da = sa + ((da * ia) / 0xFFFF); + dr = sr + ((dr * ia) / 0xFFFF); + dg = sg + ((dg * ia) / 0xFFFF); + db = sb + ((db * ia) / 0xFFFF); + + // Convert dst from premul to nonpremul. + if (da != 0) { + dr = (dr * 0xFFFF) / da; + dg = (dg * 0xFFFF) / da; + db = (db * 0xFFFF) / da; + } + + // Combine components. + return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); +} + +static inline uint32_t // +wuffs_base__composite_premul_nonpremul_u32_axxx(uint32_t dst_premul, + uint32_t src_nonpremul) { + // Extract 16-bit color components. + uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); + uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); + uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); + uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); + uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); + uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); + uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); + uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (nonpremul) over dst (premul). + da = sa + ((da * ia) / 0xFFFF); + dr = ((sr * sa) + (dr * ia)) / 0xFFFF; + dg = ((sg * sa) + (dg * ia)) / 0xFFFF; + db = ((sb * sa) + (db * ia)) / 0xFFFF; + + // Convert from 16-bit color to 8-bit color. + da >>= 8; + dr >>= 8; + dg >>= 8; + db >>= 8; + + // Combine components. + return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +} + +static inline uint64_t // +wuffs_base__composite_premul_nonpremul_u64_axxx(uint64_t dst_premul, + uint64_t src_nonpremul) { + // Extract components. + uint64_t da = 0xFFFF & (dst_premul >> 48); + uint64_t dr = 0xFFFF & (dst_premul >> 32); + uint64_t dg = 0xFFFF & (dst_premul >> 16); + uint64_t db = 0xFFFF & (dst_premul >> 0); + uint64_t sa = 0xFFFF & (src_nonpremul >> 48); + uint64_t sr = 0xFFFF & (src_nonpremul >> 32); + uint64_t sg = 0xFFFF & (src_nonpremul >> 16); + uint64_t sb = 0xFFFF & (src_nonpremul >> 0); + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint64_t ia = 0xFFFF - sa; + + // Composite src (nonpremul) over dst (premul). + da = sa + ((da * ia) / 0xFFFF); + dr = ((sr * sa) + (dr * ia)) / 0xFFFF; + dg = ((sg * sa) + (dg * ia)) / 0xFFFF; + db = ((sb * sa) + (db * ia)) / 0xFFFF; + + // Combine components. + return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); +} + +static inline uint32_t // +wuffs_base__composite_premul_premul_u32_axxx(uint32_t dst_premul, + uint32_t src_premul) { + // Extract 16-bit color components. + uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); + uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); + uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); + uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); + uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); + uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); + uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); + uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (premul) over dst (premul). + da = sa + ((da * ia) / 0xFFFF); + dr = sr + ((dr * ia) / 0xFFFF); + dg = sg + ((dg * ia) / 0xFFFF); + db = sb + ((db * ia) / 0xFFFF); + + // Convert from 16-bit color to 8-bit color. + da >>= 8; + dr >>= 8; + dg >>= 8; + db >>= 8; + + // Combine components. + return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888(uint8_t* dst_ptr, + size_t dst_len, + const uint8_t* src_ptr, + size_t src_len, + bool nonpremul) { + size_t len = (dst_len < src_len ? dst_len : src_len) / 4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n--) { + uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s); + if (nonpremul) { + argb = + wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb); + } + uint32_t b5 = 0x1F & (argb >> (8 - 5)); + uint32_t g6 = 0x3F & (argb >> (16 - 6)); + uint32_t r5 = 0x1F & (argb >> (24 - 5)); + uint32_t alpha = argb & 0xFF000000; + wuffs_base__poke_u32le__no_bounds_check( + d, alpha | (r5 << 11) | (g6 << 5) | (b5 << 0)); + s += 4; + d += 4; + } + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__swap_rgb_bgr(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t len = (dst_len < src_len ? dst_len : src_len) / 3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n--) { + uint8_t s0 = s[0]; + uint8_t s1 = s[1]; + uint8_t s2 = s[2]; + d[0] = s2; + d[1] = s1; + d[2] = s0; + s += 3; + d += 3; + } + return len; +} + +// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +static uint64_t // +wuffs_base__pixel_swizzler__swap_rgbx_bgrx__sse42(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t len = (dst_len < src_len ? dst_len : src_len) / 4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + __m128i shuffle = _mm_set_epi8(+0x0F, +0x0C, +0x0D, +0x0E, // + +0x0B, +0x08, +0x09, +0x0A, // + +0x07, +0x04, +0x05, +0x06, // + +0x03, +0x00, +0x01, +0x02); + + while (n >= 4) { + __m128i x; + x = _mm_lddqu_si128((const __m128i*)(const void*)s); + x = _mm_shuffle_epi8(x, shuffle); + _mm_storeu_si128((__m128i*)(void*)d, x); + + s += 4 * 4; + d += 4 * 4; + n -= 4; + } + + while (n--) { + uint8_t s0 = s[0]; + uint8_t s1 = s[1]; + uint8_t s2 = s[2]; + uint8_t s3 = s[3]; + d[0] = s2; + d[1] = s1; + d[2] = s0; + d[3] = s3; + s += 4; + d += 4; + } + return len; +} +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +static uint64_t // +wuffs_base__pixel_swizzler__swap_rgbx_bgrx(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t len = (dst_len < src_len ? dst_len : src_len) / 4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n--) { + uint8_t s0 = s[0]; + uint8_t s1 = s[1]; + uint8_t s2 = s[2]; + uint8_t s3 = s[3]; + d[0] = s2; + d[1] = s1; + d[2] = s0; + d[3] = s3; + s += 4; + d += 4; + } + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__copy_1_1(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t len = (dst_len < src_len) ? dst_len : src_len; + if (len > 0) { + memmove(dst_ptr, src_ptr, len); + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__copy_2_2(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len2 = src_len / 2; + size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; + if (len > 0) { + memmove(dst_ptr, src_ptr, len * 2); + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__copy_3_3(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len3 = src_len / 3; + size_t len = (dst_len3 < src_len3) ? dst_len3 : src_len3; + if (len > 0) { + memmove(dst_ptr, src_ptr, len * 3); + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__copy_4_4(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + if (len > 0) { + memmove(dst_ptr, src_ptr, len * 4); + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__copy_8_8(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len8 = src_len / 8; + size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; + if (len > 0) { + memmove(dst_ptr, src_ptr, len * 8); + } + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__bgr(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len3 = src_len / 3; + size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t b5 = s[0] >> 3; + uint32_t g6 = s[1] >> 2; + uint32_t r5 = s[2] >> 3; + uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); + wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + + s += 1 * 3; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__bgrx(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; + size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t b5 = s[0] >> 3; + uint32_t g6 = s[1] >> 2; + uint32_t r5 = s[2] >> 3; + uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); + wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + + s += 1 * 4; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; + size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + wuffs_base__poke_u16le__no_bounds_check( + d + (0 * 2), + wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( + wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); + + s += 1 * 4; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len8 = src_len / 8; + size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + wuffs_base__poke_u16le__no_bounds_check( + d + (0 * 2), + wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( + wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( + wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))))); + + s += 1 * 8; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; + size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + // Extract 16-bit color components. + uint32_t sa = 0x101 * ((uint32_t)s[3]); + uint32_t sr = 0x101 * ((uint32_t)s[2]); + uint32_t sg = 0x101 * ((uint32_t)s[1]); + uint32_t sb = 0x101 * ((uint32_t)s[0]); + + // Convert from 565 color to 16-bit color. + uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); + uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); + uint32_t dr = (0x8421 * old_r5) >> 4; + uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); + uint32_t dg = (0x1041 * old_g6) >> 2; + uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); + uint32_t db = (0x8421 * old_b5) >> 4; + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (nonpremul) over dst (premul). + dr = ((sr * sa) + (dr * ia)) / 0xFFFF; + dg = ((sg * sa) + (dg * ia)) / 0xFFFF; + db = ((sb * sa) + (db * ia)) / 0xFFFF; + + // Convert from 16-bit color to 565 color and combine the components. + uint32_t new_r5 = 0x1F & (dr >> 11); + uint32_t new_g6 = 0x3F & (dg >> 10); + uint32_t new_b5 = 0x1F & (db >> 11); + uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); + wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 4; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len8 = src_len / 8; + size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + // Extract 16-bit color components. + uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); + uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); + uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); + uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); + + // Convert from 565 color to 16-bit color. + uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); + uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); + uint32_t dr = (0x8421 * old_r5) >> 4; + uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); + uint32_t dg = (0x1041 * old_g6) >> 2; + uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); + uint32_t db = (0x8421 * old_b5) >> 4; + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (nonpremul) over dst (premul). + dr = ((sr * sa) + (dr * ia)) / 0xFFFF; + dg = ((sg * sa) + (dg * ia)) / 0xFFFF; + db = ((sb * sa) + (db * ia)) / 0xFFFF; + + // Convert from 16-bit color to 565 color and combine the components. + uint32_t new_r5 = 0x1F & (dr >> 11); + uint32_t new_g6 = 0x3F & (dg >> 10); + uint32_t new_b5 = 0x1F & (db >> 11); + uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); + wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 8; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; + size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + wuffs_base__poke_u16le__no_bounds_check( + d + (0 * 2), wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); + + s += 1 * 4; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; + size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + // Extract 16-bit color components. + uint32_t sa = 0x101 * ((uint32_t)s[3]); + uint32_t sr = 0x101 * ((uint32_t)s[2]); + uint32_t sg = 0x101 * ((uint32_t)s[1]); + uint32_t sb = 0x101 * ((uint32_t)s[0]); + + // Convert from 565 color to 16-bit color. + uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); + uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); + uint32_t dr = (0x8421 * old_r5) >> 4; + uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); + uint32_t dg = (0x1041 * old_g6) >> 2; + uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); + uint32_t db = (0x8421 * old_b5) >> 4; + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (premul) over dst (premul). + dr = sr + ((dr * ia) / 0xFFFF); + dg = sg + ((dg * ia) / 0xFFFF); + db = sb + ((db * ia) / 0xFFFF); + + // Convert from 16-bit color to 565 color and combine the components. + uint32_t new_r5 = 0x1F & (dr >> 11); + uint32_t new_g6 = 0x3F & (dg >> 10); + uint32_t new_b5 = 0x1F & (db >> 11); + uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); + wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 4; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__rgb(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len3 = src_len / 3; + size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t r5 = s[0] >> 3; + uint32_t g6 = s[1] >> 2; + uint32_t b5 = s[2] >> 3; + uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); + wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + + s += 1 * 3; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; + size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + wuffs_base__poke_u16le__no_bounds_check( + d + (0 * 2), + wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( + wuffs_base__swap_u32_argb_abgr( + wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))))); + + s += 1 * 4; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; + size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + // Extract 16-bit color components. + uint32_t sa = 0x101 * ((uint32_t)s[3]); + uint32_t sb = 0x101 * ((uint32_t)s[2]); + uint32_t sg = 0x101 * ((uint32_t)s[1]); + uint32_t sr = 0x101 * ((uint32_t)s[0]); + + // Convert from 565 color to 16-bit color. + uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); + uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); + uint32_t dr = (0x8421 * old_r5) >> 4; + uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); + uint32_t dg = (0x1041 * old_g6) >> 2; + uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); + uint32_t db = (0x8421 * old_b5) >> 4; + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (nonpremul) over dst (premul). + dr = ((sr * sa) + (dr * ia)) / 0xFFFF; + dg = ((sg * sa) + (dg * ia)) / 0xFFFF; + db = ((sb * sa) + (db * ia)) / 0xFFFF; + + // Convert from 16-bit color to 565 color and combine the components. + uint32_t new_r5 = 0x1F & (dr >> 11); + uint32_t new_g6 = 0x3F & (dg >> 10); + uint32_t new_b5 = 0x1F & (db >> 11); + uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); + wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 4; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; + size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + wuffs_base__poke_u16le__no_bounds_check( + d + (0 * 2), + wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( + wuffs_base__swap_u32_argb_abgr( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); + + s += 1 * 4; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; + size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + // Extract 16-bit color components. + uint32_t sa = 0x101 * ((uint32_t)s[3]); + uint32_t sb = 0x101 * ((uint32_t)s[2]); + uint32_t sg = 0x101 * ((uint32_t)s[1]); + uint32_t sr = 0x101 * ((uint32_t)s[0]); + + // Convert from 565 color to 16-bit color. + uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); + uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); + uint32_t dr = (0x8421 * old_r5) >> 4; + uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); + uint32_t dg = (0x1041 * old_g6) >> 2; + uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); + uint32_t db = (0x8421 * old_b5) >> 4; + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (premul) over dst (premul). + dr = sr + ((dr * ia) / 0xFFFF); + dg = sg + ((dg * ia) / 0xFFFF); + db = sb + ((db * ia) / 0xFFFF); + + // Convert from 16-bit color to 565 color and combine the components. + uint32_t new_r5 = 0x1F & (dr >> 11); + uint32_t new_g6 = 0x3F & (dg >> 10); + uint32_t new_b5 = 0x1F & (db >> 11); + uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); + wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 4; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__y(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t y5 = s[0] >> 3; + uint32_t y6 = s[0] >> 2; + uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); + wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + + s += 1 * 1; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__y_16be(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len2 = src_len / 2; + size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t y5 = s[0] >> 3; + uint32_t y6 = s[0] >> 2; + uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); + wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + + s += 1 * 2; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__index__src(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len2 = dst_len / 2; + size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + const size_t loop_unroll_count = 4; + + while (n >= loop_unroll_count) { + wuffs_base__poke_u16le__no_bounds_check( + d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( + dst_palette_ptr + ((size_t)s[0] * 4))); + wuffs_base__poke_u16le__no_bounds_check( + d + (1 * 2), wuffs_base__peek_u16le__no_bounds_check( + dst_palette_ptr + ((size_t)s[1] * 4))); + wuffs_base__poke_u16le__no_bounds_check( + d + (2 * 2), wuffs_base__peek_u16le__no_bounds_check( + dst_palette_ptr + ((size_t)s[2] * 4))); + wuffs_base__poke_u16le__no_bounds_check( + d + (3 * 2), wuffs_base__peek_u16le__no_bounds_check( + dst_palette_ptr + ((size_t)s[3] * 4))); + + s += loop_unroll_count * 1; + d += loop_unroll_count * 2; + n -= loop_unroll_count; + } + + while (n >= 1) { + wuffs_base__poke_u16le__no_bounds_check( + d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( + dst_palette_ptr + ((size_t)s[0] * 4))); + + s += 1 * 1; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__index_bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len2 = dst_len / 2; + size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t d0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( + wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2))); + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[0] * 4)); + wuffs_base__poke_u16le__no_bounds_check( + d + (0 * 2), + wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( + wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0))); + + s += 1 * 1; + d += 1 * 2; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr_565__index_binary_alpha__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len2 = dst_len / 2; + size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[0] * 4)); + if (s0) { + wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)s0); + } + + s += 1 * 1; + d += 1 * 2; + n -= 1; + } + + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__bgr__bgr_565(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len2 = src_len / 2; + size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( + wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))); + wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + + s += 1 * 2; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len4 = src_len / 4; + size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t s0 = + wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + + s += 1 * 4; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len8 = src_len / 8; + size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t s0 = + wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( + wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); + wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + + s += 1 * 8; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len4 = src_len / 4; + size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + // Extract 16-bit color components. + uint32_t dr = 0x101 * ((uint32_t)d[2]); + uint32_t dg = 0x101 * ((uint32_t)d[1]); + uint32_t db = 0x101 * ((uint32_t)d[0]); + uint32_t sa = 0x101 * ((uint32_t)s[3]); + uint32_t sr = 0x101 * ((uint32_t)s[2]); + uint32_t sg = 0x101 * ((uint32_t)s[1]); + uint32_t sb = 0x101 * ((uint32_t)s[0]); + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (nonpremul) over dst (premul). + dr = ((sr * sa) + (dr * ia)) / 0xFFFF; + dg = ((sg * sa) + (dg * ia)) / 0xFFFF; + db = ((sb * sa) + (db * ia)) / 0xFFFF; + + // Convert from 16-bit color to 8-bit color. + d[0] = (uint8_t)(db >> 8); + d[1] = (uint8_t)(dg >> 8); + d[2] = (uint8_t)(dr >> 8); + + s += 1 * 4; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len8 = src_len / 8; + size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + // Extract 16-bit color components. + uint32_t dr = 0x101 * ((uint32_t)d[2]); + uint32_t dg = 0x101 * ((uint32_t)d[1]); + uint32_t db = 0x101 * ((uint32_t)d[0]); + uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); + uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); + uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); + uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (nonpremul) over dst (premul). + dr = ((sr * sa) + (dr * ia)) / 0xFFFF; + dg = ((sg * sa) + (dg * ia)) / 0xFFFF; + db = ((sb * sa) + (db * ia)) / 0xFFFF; + + // Convert from 16-bit color to 8-bit color. + d[0] = (uint8_t)(db >> 8); + d[1] = (uint8_t)(dg >> 8); + d[2] = (uint8_t)(dr >> 8); + + s += 1 * 8; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr__bgra_premul__src(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len4 = src_len / 4; + size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint8_t s0 = s[0]; + uint8_t s1 = s[1]; + uint8_t s2 = s[2]; + d[0] = s0; + d[1] = s1; + d[2] = s2; + + s += 1 * 4; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len4 = src_len / 4; + size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + // Extract 16-bit color components. + uint32_t dr = 0x101 * ((uint32_t)d[2]); + uint32_t dg = 0x101 * ((uint32_t)d[1]); + uint32_t db = 0x101 * ((uint32_t)d[0]); + uint32_t sa = 0x101 * ((uint32_t)s[3]); + uint32_t sr = 0x101 * ((uint32_t)s[2]); + uint32_t sg = 0x101 * ((uint32_t)s[1]); + uint32_t sb = 0x101 * ((uint32_t)s[0]); + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (premul) over dst (premul). + dr = sr + ((dr * ia) / 0xFFFF); + dg = sg + ((dg * ia) / 0xFFFF); + db = sb + ((db * ia) / 0xFFFF); + + // Convert from 16-bit color to 8-bit color. + d[0] = (uint8_t)(db >> 8); + d[1] = (uint8_t)(dg >> 8); + d[2] = (uint8_t)(dr >> 8); + + s += 1 * 4; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len4 = src_len / 4; + size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t s0 = wuffs_base__swap_u32_argb_abgr( + wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); + wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + + s += 1 * 4; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len4 = src_len / 4; + size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + // Extract 16-bit color components. + uint32_t dr = 0x101 * ((uint32_t)d[2]); + uint32_t dg = 0x101 * ((uint32_t)d[1]); + uint32_t db = 0x101 * ((uint32_t)d[0]); + uint32_t sa = 0x101 * ((uint32_t)s[3]); + uint32_t sb = 0x101 * ((uint32_t)s[2]); + uint32_t sg = 0x101 * ((uint32_t)s[1]); + uint32_t sr = 0x101 * ((uint32_t)s[0]); + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (nonpremul) over dst (premul). + dr = ((sr * sa) + (dr * ia)) / 0xFFFF; + dg = ((sg * sa) + (dg * ia)) / 0xFFFF; + db = ((sb * sa) + (db * ia)) / 0xFFFF; + + // Convert from 16-bit color to 8-bit color. + d[0] = (uint8_t)(db >> 8); + d[1] = (uint8_t)(dg >> 8); + d[2] = (uint8_t)(dr >> 8); + + s += 1 * 4; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr__rgba_premul__src(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len4 = src_len / 4; + size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint8_t s0 = s[0]; + uint8_t s1 = s[1]; + uint8_t s2 = s[2]; + d[0] = s2; + d[1] = s1; + d[2] = s0; + + s += 1 * 4; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len4 = src_len / 4; + size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + // Extract 16-bit color components. + uint32_t dr = 0x101 * ((uint32_t)d[2]); + uint32_t dg = 0x101 * ((uint32_t)d[1]); + uint32_t db = 0x101 * ((uint32_t)d[0]); + uint32_t sa = 0x101 * ((uint32_t)s[3]); + uint32_t sb = 0x101 * ((uint32_t)s[2]); + uint32_t sg = 0x101 * ((uint32_t)s[1]); + uint32_t sr = 0x101 * ((uint32_t)s[0]); + + // Calculate the inverse of the src-alpha: how much of the dst to keep. + uint32_t ia = 0xFFFF - sa; + + // Composite src (premul) over dst (premul). + dr = sr + ((dr * ia) / 0xFFFF); + dg = sg + ((dg * ia) / 0xFFFF); + db = sb + ((db * ia) / 0xFFFF); + + // Convert from 16-bit color to 8-bit color. + d[0] = (uint8_t)(db >> 8); + d[1] = (uint8_t)(dg >> 8); + d[2] = (uint8_t)(dr >> 8); + + s += 1 * 4; + d += 1 * 3; + n -= 1; + } + + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len8 = src_len / 8; + size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n >= 1) { + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), wuffs_base__color_u64__as__color_u32( + wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); + + s += 1 * 8; + d += 1 * 4; + n -= 1; + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len8 = src_len / 8; + size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint64_t d0 = wuffs_base__color_u32__as__color_u64( + wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); + uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__color_u64__as__color_u32( + wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0))); + + s += 1 * 8; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), wuffs_base__composite_nonpremul_premul_u32_axxx(d0, s0)); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len4 = dst_len / 4; + size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[0] * 4)); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 1; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); + uint32_t s0 = wuffs_base__swap_u32_argb_abgr( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint32_t s0 = wuffs_base__swap_u32_argb_abgr( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); + uint32_t s0 = wuffs_base__swap_u32_argb_abgr( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), wuffs_base__composite_nonpremul_premul_u32_axxx(d0, s0)); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len4 = src_len / 4; + size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n >= 1) { + uint8_t s0 = s[0]; + uint8_t s1 = s[1]; + uint8_t s2 = s[2]; + uint8_t s3 = s[3]; + d[0] = s0; + d[1] = s0; + d[2] = s1; + d[3] = s1; + d[4] = s2; + d[5] = s2; + d[6] = s3; + d[7] = s3; + + s += 1 * 4; + d += 1 * 8; + n -= 1; + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len4 = src_len / 4; + size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n >= 1) { + uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); + uint64_t s0 = wuffs_base__color_u32__as__color_u64( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + wuffs_base__poke_u64le__no_bounds_check( + d + (0 * 8), + wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + + s += 1 * 4; + d += 1 * 8; + n -= 1; + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len8 = src_len / 8; + size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n >= 1) { + uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); + uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); + wuffs_base__poke_u64le__no_bounds_check( + d + (0 * 8), + wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + + s += 1 * 8; + d += 1 * 8; + n -= 1; + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len4 = src_len / 4; + size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n >= 1) { + uint64_t s0 = wuffs_base__color_u32__as__color_u64( + wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); + wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); + + s += 1 * 4; + d += 1 * 8; + n -= 1; + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len4 = src_len / 4; + size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n >= 1) { + uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); + uint64_t s0 = wuffs_base__color_u32__as__color_u64( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + wuffs_base__poke_u64le__no_bounds_check( + d + (0 * 8), wuffs_base__composite_nonpremul_premul_u64_axxx(d0, s0)); + + s += 1 * 4; + d += 1 * 8; + n -= 1; + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len8 = dst_len / 8; + size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); + uint64_t s0 = wuffs_base__color_u32__as__color_u64( + wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[0] * 4))); + wuffs_base__poke_u64le__no_bounds_check( + d + (0 * 8), + wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + + s += 1 * 1; + d += 1 * 8; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len4 = src_len / 4; + size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n >= 1) { + uint8_t s0 = s[0]; + uint8_t s1 = s[1]; + uint8_t s2 = s[2]; + uint8_t s3 = s[3]; + d[0] = s2; + d[1] = s2; + d[2] = s1; + d[3] = s1; + d[4] = s0; + d[5] = s0; + d[6] = s3; + d[7] = s3; + + s += 1 * 4; + d += 1 * 8; + n -= 1; + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len4 = src_len / 4; + size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n >= 1) { + uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); + uint64_t s0 = + wuffs_base__color_u32__as__color_u64(wuffs_base__swap_u32_argb_abgr( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); + wuffs_base__poke_u64le__no_bounds_check( + d + (0 * 8), + wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + + s += 1 * 4; + d += 1 * 8; + n -= 1; + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len4 = src_len / 4; + size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n >= 1) { + uint64_t s0 = wuffs_base__color_u32__as__color_u64( + wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( + wuffs_base__swap_u32_argb_abgr( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); + wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); + + s += 1 * 4; + d += 1 * 8; + n -= 1; + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len4 = src_len / 4; + size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n >= 1) { + uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); + uint64_t s0 = + wuffs_base__color_u32__as__color_u64(wuffs_base__swap_u32_argb_abgr( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); + wuffs_base__poke_u64le__no_bounds_check( + d + (0 * 8), wuffs_base__composite_nonpremul_premul_u64_axxx(d0, s0)); + + s += 1 * 4; + d += 1 * 8; + n -= 1; + } + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len8 = src_len / 8; + size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(s0)); + + s += 1 * 8; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len8 = src_len / 8; + size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint64_t d0 = wuffs_base__color_u32__as__color_u64( + wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); + uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__color_u64__as__color_u32( + wuffs_base__composite_premul_nonpremul_u64_axxx(d0, s0))); + + s += 1 * 8; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), wuffs_base__composite_premul_premul_u32_axxx(d0, s0)); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len4 = dst_len / 4; + size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[0] * 4)); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 1; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t s0 = wuffs_base__swap_u32_argb_abgr( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); + uint32_t s0 = wuffs_base__swap_u32_argb_abgr( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len8 = src_len / 8; + size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__swap_u32_argb_abgr( + wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( + s0))); + + s += 1 * 8; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len8 = src_len / 8; + size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint64_t d0 = wuffs_base__color_u32__as__color_u64( + wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); + uint64_t s0 = wuffs_base__swap_u64_argb_abgr( + wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__color_u64__as__color_u32( + wuffs_base__composite_premul_nonpremul_u64_axxx(d0, s0))); + + s += 1 * 8; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); + uint32_t s0 = wuffs_base__swap_u32_argb_abgr( + wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), wuffs_base__composite_premul_premul_u32_axxx(d0, s0)); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__bgrw__bgr(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len3 = src_len / 3; + size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + 0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3))); + + s += 1 * 3; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgrw__bgr_565(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len2 = src_len / 2; + size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( + wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))); + + s += 1 * 2; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgrw__bgrx(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + 0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +static uint64_t // +wuffs_base__pixel_swizzler__bgrw__rgb__sse42(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len3 = src_len / 3; + size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + __m128i shuffle = _mm_set_epi8(+0x00, +0x09, +0x0A, +0x0B, // + +0x00, +0x06, +0x07, +0x08, // + +0x00, +0x03, +0x04, +0x05, // + +0x00, +0x00, +0x01, +0x02); + __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // + -0x01, +0x00, +0x00, +0x00, // + -0x01, +0x00, +0x00, +0x00, // + -0x01, +0x00, +0x00, +0x00); + + while (n >= 6) { + __m128i x; + x = _mm_lddqu_si128((const __m128i*)(const void*)s); + x = _mm_shuffle_epi8(x, shuffle); + x = _mm_or_si128(x, or_ff); + _mm_storeu_si128((__m128i*)(void*)d, x); + + s += 4 * 3; + d += 4 * 4; + n -= 4; + } + + while (n >= 1) { + uint8_t b0 = s[0]; + uint8_t b1 = s[1]; + uint8_t b2 = s[2]; + d[0] = b2; + d[1] = b1; + d[2] = b0; + d[3] = 0xFF; + + s += 1 * 3; + d += 1 * 4; + n -= 1; + } + + return len; +} +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +static uint64_t // +wuffs_base__pixel_swizzler__bgrw__rgb(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len3 = src_len / 3; + size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint8_t b0 = s[0]; + uint8_t b1 = s[1]; + uint8_t b2 = s[2]; + d[0] = b2; + d[1] = b1; + d[2] = b0; + d[3] = 0xFF; + + s += 1 * 3; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgrw__rgbx(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; + size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint8_t b0 = s[0]; + uint8_t b1 = s[1]; + uint8_t b2 = s[2]; + d[0] = b2; + d[1] = b1; + d[2] = b0; + d[3] = 0xFF; + + s += 1 * 4; + d += 1 * 4; + n -= 1; + } + + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__bgrw_4x16le__bgr(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len3 = src_len / 3; + size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint8_t s0 = s[0]; + uint8_t s1 = s[1]; + uint8_t s2 = s[2]; + d[0] = s0; + d[1] = s0; + d[2] = s1; + d[3] = s1; + d[4] = s2; + d[5] = s2; + d[6] = 0xFF; + d[7] = 0xFF; + + s += 1 * 3; + d += 1 * 8; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len2 = src_len / 2; + size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + wuffs_base__poke_u64le__no_bounds_check( + d + (0 * 8), + wuffs_base__color_u32__as__color_u64( + wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( + wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); + + s += 1 * 2; + d += 1 * 8; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgrw_4x16le__bgrx(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len4 = src_len / 4; + size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint8_t s0 = s[0]; + uint8_t s1 = s[1]; + uint8_t s2 = s[2]; + d[0] = s0; + d[1] = s0; + d[2] = s1; + d[3] = s1; + d[4] = s2; + d[5] = s2; + d[6] = 0xFF; + d[7] = 0xFF; + + s += 1 * 4; + d += 1 * 8; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__bgrw_4x16le__rgb(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len3 = src_len / 3; + size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint8_t s0 = s[0]; + uint8_t s1 = s[1]; + uint8_t s2 = s[2]; + d[0] = s2; + d[1] = s2; + d[2] = s1; + d[3] = s1; + d[4] = s0; + d[5] = s0; + d[6] = 0xFF; + d[7] = 0xFF; + + s += 1 * 3; + d += 1 * 8; + n -= 1; + } + + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len8 = src_len / 8; + size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; + while (n >= 1) { + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), wuffs_base__color_u64__as__color_u32__swap_u32_argb_abgr( + wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); + + s += 1 * 8; + d += 1 * 4; + n -= 1; + } + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len8 = src_len / 8; + size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint64_t d0 = wuffs_base__color_u32__as__color_u64( + wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); + uint64_t s0 = wuffs_base__swap_u64_argb_abgr( + wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__color_u64__as__color_u32( + wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0))); + + s += 1 * 8; + d += 1 * 4; + n -= 1; + } + + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__rgbw__bgr_565(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len2 = src_len / 2; + size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), + wuffs_base__swap_u32_argb_abgr( + wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( + wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); + + s += 1 * 2; + d += 1 * 4; + n -= 1; + } + + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__xxx__index__src(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len3 = dst_len / 3; + size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + const size_t loop_unroll_count = 4; + + // The comparison in the while condition is ">", not ">=", because with + // ">=", the last 4-byte store could write past the end of the dst slice. + // + // Each 4-byte store writes one too many bytes, but a subsequent store + // will overwrite that with the correct byte. There is always another + // store, whether a 4-byte store in this loop or a 1-byte store in the + // next loop. + while (n > loop_unroll_count) { + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check( + dst_palette_ptr + ((size_t)s[0] * 4))); + wuffs_base__poke_u32le__no_bounds_check( + d + (1 * 3), wuffs_base__peek_u32le__no_bounds_check( + dst_palette_ptr + ((size_t)s[1] * 4))); + wuffs_base__poke_u32le__no_bounds_check( + d + (2 * 3), wuffs_base__peek_u32le__no_bounds_check( + dst_palette_ptr + ((size_t)s[2] * 4))); + wuffs_base__poke_u32le__no_bounds_check( + d + (3 * 3), wuffs_base__peek_u32le__no_bounds_check( + dst_palette_ptr + ((size_t)s[3] * 4))); + + s += loop_unroll_count * 1; + d += loop_unroll_count * 3; + n -= loop_unroll_count; + } + + while (n >= 1) { + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[0] * 4)); + wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + + s += 1 * 1; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len3 = dst_len / 3; + size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint32_t d0 = + wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000; + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[0] * 4)); + wuffs_base__poke_u24le__no_bounds_check( + d + (0 * 3), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 1; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len3 = dst_len / 3; + size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + const size_t loop_unroll_count = 4; + + while (n >= loop_unroll_count) { + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[0] * 4)); + if (s0) { + wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + } + uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[1] * 4)); + if (s1) { + wuffs_base__poke_u24le__no_bounds_check(d + (1 * 3), s1); + } + uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[2] * 4)); + if (s2) { + wuffs_base__poke_u24le__no_bounds_check(d + (2 * 3), s2); + } + uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[3] * 4)); + if (s3) { + wuffs_base__poke_u24le__no_bounds_check(d + (3 * 3), s3); + } + + s += loop_unroll_count * 1; + d += loop_unroll_count * 3; + n -= loop_unroll_count; + } + + while (n >= 1) { + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[0] * 4)); + if (s0) { + wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + } + + s += 1 * 1; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__xxx__xxxx(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len4 = src_len / 4; + size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + wuffs_base__poke_u24le__no_bounds_check( + d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + + s += 1 * 4; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__xxx__y(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint8_t s0 = s[0]; + d[0] = s0; + d[1] = s0; + d[2] = s0; + + s += 1 * 1; + d += 1 * 3; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__xxx__y_16be(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len3 = dst_len / 3; + size_t src_len2 = src_len / 2; + size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + // TODO: unroll. + + while (n >= 1) { + uint8_t s0 = s[0]; + d[0] = s0; + d[1] = s0; + d[2] = s0; + + s += 1 * 2; + d += 1 * 3; + n -= 1; + } + + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__xxxx__index__src(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len4 = dst_len / 4; + size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + const size_t loop_unroll_count = 4; + + while (n >= loop_unroll_count) { + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( + dst_palette_ptr + ((size_t)s[0] * 4))); + wuffs_base__poke_u32le__no_bounds_check( + d + (1 * 4), wuffs_base__peek_u32le__no_bounds_check( + dst_palette_ptr + ((size_t)s[1] * 4))); + wuffs_base__poke_u32le__no_bounds_check( + d + (2 * 4), wuffs_base__peek_u32le__no_bounds_check( + dst_palette_ptr + ((size_t)s[2] * 4))); + wuffs_base__poke_u32le__no_bounds_check( + d + (3 * 4), wuffs_base__peek_u32le__no_bounds_check( + dst_palette_ptr + ((size_t)s[3] * 4))); + + s += loop_unroll_count * 1; + d += loop_unroll_count * 4; + n -= loop_unroll_count; + } + + while (n >= 1) { + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( + dst_palette_ptr + ((size_t)s[0] * 4))); + + s += 1 * 1; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len4 = dst_len / 4; + size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + const size_t loop_unroll_count = 4; + + while (n >= loop_unroll_count) { + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[0] * 4)); + if (s0) { + wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); + } + uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[1] * 4)); + if (s1) { + wuffs_base__poke_u32le__no_bounds_check(d + (1 * 4), s1); + } + uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[2] * 4)); + if (s2) { + wuffs_base__poke_u32le__no_bounds_check(d + (2 * 4), s2); + } + uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[3] * 4)); + if (s3) { + wuffs_base__poke_u32le__no_bounds_check(d + (3 * 4), s3); + } + + s += loop_unroll_count * 1; + d += loop_unroll_count * 4; + n -= loop_unroll_count; + } + + while (n >= 1) { + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[0] * 4)); + if (s0) { + wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); + } + + s += 1 * 1; + d += 1 * 4; + n -= 1; + } + + return len; +} + +// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +static uint64_t // +wuffs_base__pixel_swizzler__xxxx__y__sse42(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + __m128i shuffle = _mm_set_epi8(+0x03, +0x03, +0x03, +0x03, // + +0x02, +0x02, +0x02, +0x02, // + +0x01, +0x01, +0x01, +0x01, // + +0x00, +0x00, +0x00, +0x00); + __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // + -0x01, +0x00, +0x00, +0x00, // + -0x01, +0x00, +0x00, +0x00, // + -0x01, +0x00, +0x00, +0x00); + + while (n >= 4) { + __m128i x; + x = _mm_cvtsi32_si128((int)(wuffs_base__peek_u32le__no_bounds_check(s))); + x = _mm_shuffle_epi8(x, shuffle); + x = _mm_or_si128(x, or_ff); + _mm_storeu_si128((__m128i*)(void*)d, x); + + s += 4 * 1; + d += 4 * 4; + n -= 4; + } + + while (n >= 1) { + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); + + s += 1 * 1; + d += 1 * 4; + n -= 1; + } + + return len; +} +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +static uint64_t // +wuffs_base__pixel_swizzler__xxxx__y(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); + + s += 1 * 1; + d += 1 * 4; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__xxxx__y_16be(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len4 = dst_len / 4; + size_t src_len2 = src_len / 2; + size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + wuffs_base__poke_u32le__no_bounds_check( + d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); + + s += 1 * 2; + d += 1 * 4; + n -= 1; + } + + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__xxxxxxxx__index__src(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len8 = dst_len / 8; + size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + wuffs_base__poke_u64le__no_bounds_check( + d + (0 * 8), wuffs_base__color_u32__as__color_u64( + wuffs_base__peek_u32le__no_bounds_check( + dst_palette_ptr + ((size_t)s[0] * 4)))); + + s += 1 * 1; + d += 1 * 8; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } + size_t dst_len8 = dst_len / 8; + size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + + ((size_t)s[0] * 4)); + if (s0) { + wuffs_base__poke_u64le__no_bounds_check( + d + (0 * 8), wuffs_base__color_u32__as__color_u64(s0)); + } + + s += 1 * 1; + d += 1 * 8; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__xxxxxxxx__y(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + wuffs_base__poke_u64le__no_bounds_check( + d + (0 * 8), 0xFFFF000000000000 | (0x010101010101 * (uint64_t)s[0])); + + s += 1 * 1; + d += 1 * 8; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__xxxxxxxx__y_16be(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len8 = dst_len / 8; + size_t src_len2 = src_len / 2; + size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint64_t s0 = + ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(s + (0 * 2)))); + wuffs_base__poke_u64le__no_bounds_check( + d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0)); + + s += 1 * 2; + d += 1 * 8; + n -= 1; + } + + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__y__y_16be(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t src_len2 = src_len / 2; + size_t len = (dst_len < src_len2) ? dst_len : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + d[0] = s[0]; + + s += 1 * 2; + d += 1 * 1; + n -= 1; + } + + return len; +} + +static uint64_t // +wuffs_base__pixel_swizzler__y_16le__y_16be(uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { + size_t dst_len2 = dst_len / 2; + size_t src_len2 = src_len / 2; + size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { + uint8_t s0 = s[0]; + uint8_t s1 = s[1]; + d[0] = s1; + d[1] = s0; + + s += 1 * 2; + d += 1 * 2; + n -= 1; + } + + return len; +} + +// -------- + +static uint64_t // +wuffs_base__pixel_swizzler__transparent_black_src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + uint64_t num_pixels, + uint32_t dst_pixfmt_bytes_per_pixel) { + uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; + if (n > num_pixels) { + n = num_pixels; + } + memset(dst_ptr, 0, ((size_t)(n * dst_pixfmt_bytes_per_pixel))); + return n; +} + +static uint64_t // +wuffs_base__pixel_swizzler__transparent_black_src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + uint64_t num_pixels, + uint32_t dst_pixfmt_bytes_per_pixel) { + uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; + if (n > num_pixels) { + n = num_pixels; + } + return n; +} + +// -------- + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__y(wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__Y: + return wuffs_base__pixel_swizzler__copy_1_1; + + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + return wuffs_base__pixel_swizzler__bgr_565__y; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + case WUFFS_BASE__PIXEL_FORMAT__RGB: + return wuffs_base__pixel_swizzler__xxx__y; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__BGRX: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__RGBX: +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + if (wuffs_base__cpu_arch__have_x86_sse42()) { + return wuffs_base__pixel_swizzler__xxxx__y__sse42; + } +#endif + return wuffs_base__pixel_swizzler__xxxx__y; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: + return wuffs_base__pixel_swizzler__xxxxxxxx__y; + } + return NULL; +} + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__y_16be(wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__Y: + return wuffs_base__pixel_swizzler__y__y_16be; + + case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: + return wuffs_base__pixel_swizzler__y_16le__y_16be; + + case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: + return wuffs_base__pixel_swizzler__copy_2_2; + + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + return wuffs_base__pixel_swizzler__bgr_565__y_16be; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + case WUFFS_BASE__PIXEL_FORMAT__RGB: + return wuffs_base__pixel_swizzler__xxx__y_16be; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__BGRX: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__RGBX: + return wuffs_base__pixel_swizzler__xxxx__y_16be; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: + return wuffs_base__pixel_swizzler__xxxxxxxx__y_16be; + } + return NULL; +} + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__indexed__bgra_nonpremul( + wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: + if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return NULL; + } + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__copy_1_1; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + if (wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888( + dst_palette.ptr, dst_palette.len, src_palette.ptr, + src_palette.len, true) != + (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { + return NULL; + } + return wuffs_base__pixel_swizzler__bgr_565__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return NULL; + } + return wuffs_base__pixel_swizzler__bgr_565__index_bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + if (wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( + dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, + src_palette.len) != + (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { + return NULL; + } + return wuffs_base__pixel_swizzler__xxx__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return NULL; + } + return wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return NULL; + } + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__xxxx__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return NULL; + } + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__xxxxxxxx__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + if (wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( + dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, + src_palette.len) != + (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { + return NULL; + } + return wuffs_base__pixel_swizzler__xxxx__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return NULL; + } + return wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGB: + // TODO. + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( + dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, + src_palette.len) != + (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { + return NULL; + } + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__xxxx__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + if (wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( + dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, + src_palette.len) != + (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { + return NULL; + } + return wuffs_base__pixel_swizzler__xxxx__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( + dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, + src_palette.len) != + (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { + return NULL; + } + return wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGBX: + // TODO. + break; + } + return NULL; +} + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__indexed__bgra_binary( + wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: + if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return NULL; + } + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__copy_1_1; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + if (wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888( + dst_palette.ptr, dst_palette.len, src_palette.ptr, + src_palette.len, false) != + (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { + return NULL; + } + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgr_565__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgr_565__index_binary_alpha__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return NULL; + } + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__xxx__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: + if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return NULL; + } + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__xxxx__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: + if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return NULL; + } + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__xxxxxxxx__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGB: + if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( + dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, + src_palette.len) != + (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { + return NULL; + } + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__xxx__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: + if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( + dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, + src_palette.len) != + (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { + return NULL; + } + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__xxxx__index__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over; + } + return NULL; + } + return NULL; +} + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__bgr_565( + wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + return wuffs_base__pixel_swizzler__copy_2_2; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + return wuffs_base__pixel_swizzler__bgr__bgr_565; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__BGRX: + return wuffs_base__pixel_swizzler__bgrw__bgr_565; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: + return wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__RGBX: + return wuffs_base__pixel_swizzler__rgbw__bgr_565; + } + return NULL; +} + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__bgr(wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + return wuffs_base__pixel_swizzler__bgr_565__bgr; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + return wuffs_base__pixel_swizzler__copy_3_3; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__BGRX: + return wuffs_base__pixel_swizzler__bgrw__bgr; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: + return wuffs_base__pixel_swizzler__bgrw_4x16le__bgr; + + case WUFFS_BASE__PIXEL_FORMAT__RGB: + return wuffs_base__pixel_swizzler__swap_rgb_bgr; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__RGBX: +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + if (wuffs_base__cpu_arch__have_x86_sse42()) { + return wuffs_base__pixel_swizzler__bgrw__rgb__sse42; + } +#endif + return wuffs_base__pixel_swizzler__bgrw__rgb; + } + return NULL; +} + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__bgra_nonpremul( + wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__copy_4_4; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__BGRX: + // TODO. + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGB: + // TODO. + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + if (wuffs_base__cpu_arch__have_x86_sse42()) { + return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__sse42; + } +#endif + return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__RGBX: + // TODO. + break; + } + return NULL; +} + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__bgra_nonpremul_4x16le( + wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__copy_8_8; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__BGRX: + // TODO. + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGB: + // TODO. + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src_over; + } + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__RGBX: + // TODO. + break; + } + return NULL; +} + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__bgra_premul( + wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgr__bgra_premul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__copy_4_4; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + if (wuffs_base__cpu_arch__have_x86_sse42()) { + return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__sse42; + } +#endif + return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over; + } + return NULL; + } + return NULL; +} + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__bgrx(wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + return wuffs_base__pixel_swizzler__bgr_565__bgrx; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + return wuffs_base__pixel_swizzler__xxx__xxxx; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: + return wuffs_base__pixel_swizzler__bgrw__bgrx; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + return wuffs_base__pixel_swizzler__bgrw_4x16le__bgrx; + + case WUFFS_BASE__PIXEL_FORMAT__BGRX: + return wuffs_base__pixel_swizzler__copy_4_4; + + case WUFFS_BASE__PIXEL_FORMAT__RGB: + // TODO. + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__RGBX: + return wuffs_base__pixel_swizzler__bgrw__rgbx; + } + return NULL; +} + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__rgb(wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + return wuffs_base__pixel_swizzler__bgr_565__rgb; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + return wuffs_base__pixel_swizzler__swap_rgb_bgr; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__BGRX: +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + if (wuffs_base__cpu_arch__have_x86_sse42()) { + return wuffs_base__pixel_swizzler__bgrw__rgb__sse42; + } +#endif + return wuffs_base__pixel_swizzler__bgrw__rgb; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + return wuffs_base__pixel_swizzler__bgrw_4x16le__rgb; + + case WUFFS_BASE__PIXEL_FORMAT__RGB: + return wuffs_base__pixel_swizzler__copy_3_3; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__RGBX: + return wuffs_base__pixel_swizzler__bgrw__bgr; + } + return NULL; +} + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__rgba_nonpremul( + wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + if (wuffs_base__cpu_arch__have_x86_sse42()) { + return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__sse42; + } +#endif + return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__BGRX: + // TODO. + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGB: + // TODO. + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__copy_4_4; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: + case WUFFS_BASE__PIXEL_FORMAT__RGBX: + // TODO. + break; + } + return NULL; +} + +static wuffs_base__pixel_swizzler__func // +wuffs_base__pixel_swizzler__prepare__rgba_premul( + wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + switch (dst_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgr__rgba_premul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + if (wuffs_base__cpu_arch__have_x86_sse42()) { + return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__sse42; + } +#endif + return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over; + } + return NULL; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + return wuffs_base__pixel_swizzler__copy_4_4; + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + return wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over; + } + return NULL; + } + return NULL; +} + +// -------- + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p, + wuffs_base__pixel_format dst_pixfmt, + wuffs_base__slice_u8 dst_palette, + wuffs_base__pixel_format src_pixfmt, + wuffs_base__slice_u8 src_palette, + wuffs_base__pixel_blend blend) { + if (!p) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + p->private_impl.func = NULL; + p->private_impl.transparent_black_func = NULL; + p->private_impl.dst_pixfmt_bytes_per_pixel = 0; + p->private_impl.src_pixfmt_bytes_per_pixel = 0; + + wuffs_base__pixel_swizzler__func func = NULL; + wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func = + NULL; + + uint32_t dst_pixfmt_bits_per_pixel = + wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt); + if ((dst_pixfmt_bits_per_pixel == 0) || + ((dst_pixfmt_bits_per_pixel & 7) != 0)) { + return wuffs_base__make_status( + wuffs_base__error__unsupported_pixel_swizzler_option); + } + + uint32_t src_pixfmt_bits_per_pixel = + wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt); + if ((src_pixfmt_bits_per_pixel == 0) || + ((src_pixfmt_bits_per_pixel & 7) != 0)) { + return wuffs_base__make_status( + wuffs_base__error__unsupported_pixel_swizzler_option); + } + + // TODO: support many more formats. + + switch (blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + transparent_black_func = + wuffs_base__pixel_swizzler__transparent_black_src; + break; + + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + transparent_black_func = + wuffs_base__pixel_swizzler__transparent_black_src_over; + break; + } + + switch (src_pixfmt.repr) { + case WUFFS_BASE__PIXEL_FORMAT__Y: + func = wuffs_base__pixel_swizzler__prepare__y(p, dst_pixfmt, dst_palette, + src_palette, blend); + break; + + case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: + func = wuffs_base__pixel_swizzler__prepare__y_16be( + p, dst_pixfmt, dst_palette, src_palette, blend); + break; + + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: + func = wuffs_base__pixel_swizzler__prepare__indexed__bgra_nonpremul( + p, dst_pixfmt, dst_palette, src_palette, blend); + break; + + case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: + func = wuffs_base__pixel_swizzler__prepare__indexed__bgra_binary( + p, dst_pixfmt, dst_palette, src_palette, blend); + break; + + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + func = wuffs_base__pixel_swizzler__prepare__bgr_565( + p, dst_pixfmt, dst_palette, src_palette, blend); + break; + + case WUFFS_BASE__PIXEL_FORMAT__BGR: + func = wuffs_base__pixel_swizzler__prepare__bgr( + p, dst_pixfmt, dst_palette, src_palette, blend); + break; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + func = wuffs_base__pixel_swizzler__prepare__bgra_nonpremul( + p, dst_pixfmt, dst_palette, src_palette, blend); + break; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + func = wuffs_base__pixel_swizzler__prepare__bgra_nonpremul_4x16le( + p, dst_pixfmt, dst_palette, src_palette, blend); + break; + + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + func = wuffs_base__pixel_swizzler__prepare__bgra_premul( + p, dst_pixfmt, dst_palette, src_palette, blend); + break; + + case WUFFS_BASE__PIXEL_FORMAT__BGRX: + func = wuffs_base__pixel_swizzler__prepare__bgrx( + p, dst_pixfmt, dst_palette, src_palette, blend); + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGB: + func = wuffs_base__pixel_swizzler__prepare__rgb( + p, dst_pixfmt, dst_palette, src_palette, blend); + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + func = wuffs_base__pixel_swizzler__prepare__rgba_nonpremul( + p, dst_pixfmt, dst_palette, src_palette, blend); + break; + + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + func = wuffs_base__pixel_swizzler__prepare__rgba_premul( + p, dst_pixfmt, dst_palette, src_palette, blend); + break; + } + + p->private_impl.func = func; + p->private_impl.transparent_black_func = transparent_black_func; + p->private_impl.dst_pixfmt_bytes_per_pixel = dst_pixfmt_bits_per_pixel / 8; + p->private_impl.src_pixfmt_bytes_per_pixel = src_pixfmt_bits_per_pixel / 8; + return wuffs_base__make_status( + func ? NULL : wuffs_base__error__unsupported_pixel_swizzler_option); +} + +WUFFS_BASE__MAYBE_STATIC uint64_t // +wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( + const wuffs_base__pixel_swizzler* p, + uint32_t up_to_num_pixels, + wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 dst_palette, + const uint8_t** ptr_iop_r, + const uint8_t* io2_r) { + if (p && p->private_impl.func) { + const uint8_t* iop_r = *ptr_iop_r; + uint64_t src_len = wuffs_base__u64__min( + ((uint64_t)up_to_num_pixels) * + ((uint64_t)p->private_impl.src_pixfmt_bytes_per_pixel), + ((uint64_t)(io2_r - iop_r))); + uint64_t n = + (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, + dst_palette.len, iop_r, (size_t)src_len); + *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; + return n; + } + return 0; +} + +WUFFS_BASE__MAYBE_STATIC uint64_t // +wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( + const wuffs_base__pixel_swizzler* p, + wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 dst_palette, + const uint8_t** ptr_iop_r, + const uint8_t* io2_r) { + if (p && p->private_impl.func) { + const uint8_t* iop_r = *ptr_iop_r; + uint64_t src_len = ((uint64_t)(io2_r - iop_r)); + uint64_t n = + (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, + dst_palette.len, iop_r, (size_t)src_len); + *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; + return n; + } + return 0; +} + +WUFFS_BASE__MAYBE_STATIC uint64_t // +wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice( + const wuffs_base__pixel_swizzler* p, + wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 dst_palette, + wuffs_base__slice_u8 src) { + if (p && p->private_impl.func) { + return (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, + dst_palette.len, src.ptr, src.len); + } + return 0; +} + +WUFFS_BASE__MAYBE_STATIC uint64_t // +wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( + const wuffs_base__pixel_swizzler* p, + wuffs_base__slice_u8 dst, + wuffs_base__slice_u8 dst_palette, + uint64_t num_pixels) { + if (p && p->private_impl.transparent_black_func) { + return (*p->private_impl.transparent_black_func)( + dst.ptr, dst.len, dst_palette.ptr, dst_palette.len, num_pixels, + p->private_impl.dst_pixfmt_bytes_per_pixel); + } + return 0; +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || + // defined(WUFFS_CONFIG__MODULE__BASE) || + // defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ + defined(WUFFS_CONFIG__MODULE__BASE__UTF8) + +// ---------------- Unicode and UTF-8 + +WUFFS_BASE__MAYBE_STATIC size_t // +wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) { + if (code_point <= 0x7F) { + if (dst.len >= 1) { + dst.ptr[0] = (uint8_t)(code_point); + return 1; + } + + } else if (code_point <= 0x07FF) { + if (dst.len >= 2) { + dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6))); + dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); + return 2; + } + + } else if (code_point <= 0xFFFF) { + if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) { + dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12))); + dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); + dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); + return 3; + } + + } else if (code_point <= 0x10FFFF) { + if (dst.len >= 4) { + dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18))); + dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F)); + dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); + dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); + return 4; + } + } + + return 0; +} + +// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a +// UTF-8 encoded code point, based on the encoding's initial byte. +// - 0x00 is 1-byte UTF-8 (ASCII). +// - 0x01 is the start of 2-byte UTF-8. +// - 0x02 is the start of 3-byte UTF-8. +// - 0x03 is the start of 4-byte UTF-8. +// - 0x40 is a UTF-8 tail byte. +// - 0x80 is invalid UTF-8. +// +// RFC 3629 (UTF-8) gives this grammar for valid UTF-8: +// UTF8-1 = %x00-7F +// UTF8-2 = %xC2-DF UTF8-tail +// UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / +// %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) +// UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / +// %xF4 %x80-8F 2( UTF8-tail ) +// UTF8-tail = %x80-BF +static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = { + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x30 ..= 0x37. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. + + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x80 ..= 0x87. + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x88 ..= 0x8F. + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x90 ..= 0x97. + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x98 ..= 0x9F. + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA0 ..= 0xA7. + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA8 ..= 0xAF. + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB0 ..= 0xB7. + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB8 ..= 0xBF. + + 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC0 ..= 0xC7. + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC8 ..= 0xCF. + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD0 ..= 0xD7. + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD8 ..= 0xDF. + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE0 ..= 0xE7. + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE8 ..= 0xEF. + 0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F +}; + +WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // +wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len) { + if (s_len == 0) { + return wuffs_base__make_utf_8__next__output(0, 0); + } + uint32_t c = s_ptr[0]; + switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) { + case 0: + return wuffs_base__make_utf_8__next__output(c, 1); + + case 1: + if (s_len < 2) { + break; + } + c = wuffs_base__peek_u16le__no_bounds_check(s_ptr); + if ((c & 0xC000) != 0x8000) { + break; + } + c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8)); + return wuffs_base__make_utf_8__next__output(c, 2); + + case 2: + if (s_len < 3) { + break; + } + c = wuffs_base__peek_u24le__no_bounds_check(s_ptr); + if ((c & 0xC0C000) != 0x808000) { + break; + } + c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) | + (0x00003F & (c >> 16)); + if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) { + break; + } + return wuffs_base__make_utf_8__next__output(c, 3); + + case 3: + if (s_len < 4) { + break; + } + c = wuffs_base__peek_u32le__no_bounds_check(s_ptr); + if ((c & 0xC0C0C000) != 0x80808000) { + break; + } + c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) | + (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24)); + if ((c <= 0xFFFF) || (0x110000 <= c)) { + break; + } + return wuffs_base__make_utf_8__next__output(c, 4); + } + + return wuffs_base__make_utf_8__next__output( + WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); +} + +WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // +wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len) { + if (s_len == 0) { + return wuffs_base__make_utf_8__next__output(0, 0); + } + const uint8_t* ptr = &s_ptr[s_len - 1]; + if (*ptr < 0x80) { + return wuffs_base__make_utf_8__next__output(*ptr, 1); + + } else if (*ptr < 0xC0) { + const uint8_t* too_far = &s_ptr[(s_len > 4) ? (s_len - 4) : 0]; + uint32_t n = 1; + while (ptr != too_far) { + ptr--; + n++; + if (*ptr < 0x80) { + break; + } else if (*ptr < 0xC0) { + continue; + } + wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(ptr, n); + if (o.byte_length != n) { + break; + } + return o; + } + } + + return wuffs_base__make_utf_8__next__output( + WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); +} + +WUFFS_BASE__MAYBE_STATIC size_t // +wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { + // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time). + // + // TODO: possibly optimize this by manually inlining the + // wuffs_base__utf_8__next calls. + size_t original_len = s_len; + while (s_len > 0) { + wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s_ptr, s_len); + if ((o.code_point > 0x7F) && (o.byte_length == 1)) { + break; + } + s_ptr += o.byte_length; + s_len -= o.byte_length; + } + return original_len - s_len; +} + +WUFFS_BASE__MAYBE_STATIC size_t // +wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { + // TODO: possibly optimize this by checking 4 or 8 bytes at a time. + const uint8_t* original_ptr = s_ptr; + const uint8_t* p = s_ptr; + const uint8_t* q = s_ptr + s_len; + for (; (p != q) && ((*p & 0x80) == 0); p++) { + } + return (size_t)(p - original_ptr); +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || + // defined(WUFFS_CONFIG__MODULE__BASE) || + // defined(WUFFS_CONFIG__MODULE__BASE__UTF8) + +#ifdef __cplusplus +} // extern "C" +#endif + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) + +// ---------------- Status Codes Implementations + +// ---------------- Private Consts + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__empty_struct +wuffs_adler32__hasher__up( + wuffs_adler32__hasher* self, + wuffs_base__slice_u8 a_x); + +static wuffs_base__empty_struct +wuffs_adler32__hasher__up__choosy_default( + wuffs_adler32__hasher* self, + wuffs_base__slice_u8 a_x); + +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +static wuffs_base__empty_struct +wuffs_adler32__hasher__up_arm_neon( + wuffs_adler32__hasher* self, + wuffs_base__slice_u8 a_x); +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +static wuffs_base__empty_struct +wuffs_adler32__hasher__up_x86_sse42( + wuffs_adler32__hasher* self, + wuffs_base__slice_u8 a_x); +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + +// ---------------- VTables + +const wuffs_base__hasher_u32__func_ptrs +wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_adler32__hasher__set_quirk_enabled), + (uint32_t(*)(void*, + wuffs_base__slice_u8))(&wuffs_adler32__hasher__update_u32), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_adler32__hasher__initialize( + wuffs_adler32__hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.choosy_up = &wuffs_adler32__hasher__up__choosy_default; + + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = + wuffs_base__hasher_u32__vtable_name; + self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = + (const void*)(&wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32); + return wuffs_base__make_status(NULL); +} + +wuffs_adler32__hasher* +wuffs_adler32__hasher__alloc() { + wuffs_adler32__hasher* x = + (wuffs_adler32__hasher*)(calloc(1, sizeof(wuffs_adler32__hasher))); + if (!x) { + return NULL; + } + if (wuffs_adler32__hasher__initialize( + x, sizeof(wuffs_adler32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_adler32__hasher() { + return sizeof(wuffs_adler32__hasher); +} + +// ---------------- Function Implementations + +// -------- func adler32.hasher.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_adler32__hasher__set_quirk_enabled( + wuffs_adler32__hasher* self, + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__make_empty_struct(); +} + +// -------- func adler32.hasher.update_u32 + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_adler32__hasher__update_u32( + wuffs_adler32__hasher* self, + wuffs_base__slice_u8 a_x) { + if (!self) { + return 0; + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return 0; + } + + if ( ! self->private_impl.f_started) { + self->private_impl.f_started = true; + self->private_impl.f_state = 1; + self->private_impl.choosy_up = ( +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon : +#endif +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 : +#endif + self->private_impl.choosy_up); + } + wuffs_adler32__hasher__up(self, a_x); + return self->private_impl.f_state; +} + +// -------- func adler32.hasher.up + +static wuffs_base__empty_struct +wuffs_adler32__hasher__up( + wuffs_adler32__hasher* self, + wuffs_base__slice_u8 a_x) { + return (*self->private_impl.choosy_up)(self, a_x); +} + +static wuffs_base__empty_struct +wuffs_adler32__hasher__up__choosy_default( + wuffs_adler32__hasher* self, + wuffs_base__slice_u8 a_x) { + uint32_t v_s1 = 0; + uint32_t v_s2 = 0; + wuffs_base__slice_u8 v_remaining = {0}; + wuffs_base__slice_u8 v_p = {0}; + + v_s1 = ((self->private_impl.f_state) & 0xFFFF); + v_s2 = ((self->private_impl.f_state) >> (32 - (16))); + while (((uint64_t)(a_x.len)) > 0) { + v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0); + if (((uint64_t)(a_x.len)) > 5552) { + v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5552); + a_x = wuffs_base__slice_u8__subslice_j(a_x, 5552); + } + { + wuffs_base__slice_u8 i_slice_p = a_x; + v_p.ptr = i_slice_p.ptr; + v_p.len = 1; + uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8); + while (v_p.ptr < i_end0_p) { + v_s1 += ((uint32_t)(v_p.ptr[0])); + v_s2 += v_s1; + v_p.ptr += 1; + v_s1 += ((uint32_t)(v_p.ptr[0])); + v_s2 += v_s1; + v_p.ptr += 1; + v_s1 += ((uint32_t)(v_p.ptr[0])); + v_s2 += v_s1; + v_p.ptr += 1; + v_s1 += ((uint32_t)(v_p.ptr[0])); + v_s2 += v_s1; + v_p.ptr += 1; + v_s1 += ((uint32_t)(v_p.ptr[0])); + v_s2 += v_s1; + v_p.ptr += 1; + v_s1 += ((uint32_t)(v_p.ptr[0])); + v_s2 += v_s1; + v_p.ptr += 1; + v_s1 += ((uint32_t)(v_p.ptr[0])); + v_s2 += v_s1; + v_p.ptr += 1; + v_s1 += ((uint32_t)(v_p.ptr[0])); + v_s2 += v_s1; + v_p.ptr += 1; + } + v_p.len = 1; + uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len; + while (v_p.ptr < i_end1_p) { + v_s1 += ((uint32_t)(v_p.ptr[0])); + v_s2 += v_s1; + v_p.ptr += 1; + } + v_p.len = 0; + } + v_s1 %= 65521; + v_s2 %= 65521; + a_x = v_remaining; + } + self->private_impl.f_state = (((v_s2 & 65535) << 16) | (v_s1 & 65535)); + return wuffs_base__make_empty_struct(); +} + +// ‼ WUFFS MULTI-FILE SECTION +arm_neon +// -------- func adler32.hasher.up_arm_neon + +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +static wuffs_base__empty_struct +wuffs_adler32__hasher__up_arm_neon( + wuffs_adler32__hasher* self, + wuffs_base__slice_u8 a_x) { + uint32_t v_s1 = 0; + uint32_t v_s2 = 0; + wuffs_base__slice_u8 v_remaining = {0}; + wuffs_base__slice_u8 v_p = {0}; + uint8x16_t v_p__left = {0}; + uint8x16_t v_p_right = {0}; + uint32x4_t v_v1 = {0}; + uint32x4_t v_v2 = {0}; + uint16x8_t v_col0 = {0}; + uint16x8_t v_col1 = {0}; + uint16x8_t v_col2 = {0}; + uint16x8_t v_col3 = {0}; + uint32x2_t v_sum1 = {0}; + uint32x2_t v_sum2 = {0}; + uint32x2_t v_sum12 = {0}; + uint32_t v_num_iterate_bytes = 0; + uint64_t v_tail_index = 0; + + v_s1 = ((self->private_impl.f_state) & 0xFFFF); + v_s2 = ((self->private_impl.f_state) >> (32 - (16))); + while ((((uint64_t)(a_x.len)) > 0) && ((15 & ((uint32_t)(0xFFF & (uintptr_t)(a_x.ptr)))) != 0)) { + v_s1 += ((uint32_t)(a_x.ptr[0])); + v_s2 += v_s1; + a_x = wuffs_base__slice_u8__subslice_i(a_x, 1); + } + v_s1 %= 65521; + v_s2 %= 65521; + while (((uint64_t)(a_x.len)) > 0) { + v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0); + if (((uint64_t)(a_x.len)) > 5536) { + v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536); + a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536); + } + v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264))); + v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); + v_v1 = vdupq_n_u32(0); + v_v2 = vdupq_n_u32(0); + v_col0 = vdupq_n_u16(0); + v_col1 = vdupq_n_u16(0); + v_col2 = vdupq_n_u16(0); + v_col3 = vdupq_n_u16(0); + { + wuffs_base__slice_u8 i_slice_p = a_x; + v_p.ptr = i_slice_p.ptr; + v_p.len = 32; + uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); + while (v_p.ptr < i_end0_p) { + v_p__left = vld1q_u8(v_p.ptr); + v_p_right = vld1q_u8(v_p.ptr + 16); + v_v2 = vaddq_u32(v_v2, v_v1); + v_v1 = vpadalq_u16(v_v1, vpadalq_u8(vpaddlq_u8(v_p__left), v_p_right)); + v_col0 = vaddw_u8(v_col0, vget_low_u8(v_p__left)); + v_col1 = vaddw_u8(v_col1, vget_high_u8(v_p__left)); + v_col2 = vaddw_u8(v_col2, vget_low_u8(v_p_right)); + v_col3 = vaddw_u8(v_col3, vget_high_u8(v_p_right)); + v_p.ptr += 32; + } + v_p.len = 0; + } + v_v2 = vshlq_n_u32(v_v2, 5); + v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col0), ((uint16x4_t){32, 31, 30, 29})); + v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col0), ((uint16x4_t){28, 27, 26, 25})); + v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col1), ((uint16x4_t){24, 23, 22, 21})); + v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col1), ((uint16x4_t){20, 19, 18, 17})); + v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col2), ((uint16x4_t){16, 15, 14, 13})); + v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col2), ((uint16x4_t){12, 11, 10, 9})); + v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col3), ((uint16x4_t){8, 7, 6, 5})); + v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col3), ((uint16x4_t){4, 3, 2, 1})); + v_sum1 = vpadd_u32(vget_low_u32(v_v1), vget_high_u32(v_v1)); + v_sum2 = vpadd_u32(vget_low_u32(v_v2), vget_high_u32(v_v2)); + v_sum12 = vpadd_u32(v_sum1, v_sum2); + v_s1 += vget_lane_u32(v_sum12, 0); + v_s2 += vget_lane_u32(v_sum12, 1); + v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); + if (v_tail_index < ((uint64_t)(a_x.len))) { + { + wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); + v_p.ptr = i_slice_p.ptr; + v_p.len = 1; + uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; + while (v_p.ptr < i_end0_p) { + v_s1 += ((uint32_t)(v_p.ptr[0])); + v_s2 += v_s1; + v_p.ptr += 1; + } + v_p.len = 0; + } + } + v_s1 %= 65521; + v_s2 %= 65521; + a_x = v_remaining; + } + self->private_impl.f_state = (((v_s2 & 65535) << 16) | (v_s1 & 65535)); + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +// -------- func adler32.hasher.up_x86_sse42 + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +static wuffs_base__empty_struct +wuffs_adler32__hasher__up_x86_sse42( + wuffs_adler32__hasher* self, + wuffs_base__slice_u8 a_x) { + uint32_t v_s1 = 0; + uint32_t v_s2 = 0; + wuffs_base__slice_u8 v_remaining = {0}; + wuffs_base__slice_u8 v_p = {0}; + __m128i v_zeroes = {0}; + __m128i v_ones = {0}; + __m128i v_weights__left = {0}; + __m128i v_weights_right = {0}; + __m128i v_q__left = {0}; + __m128i v_q_right = {0}; + __m128i v_v1 = {0}; + __m128i v_v2 = {0}; + __m128i v_v2j = {0}; + __m128i v_v2k = {0}; + uint32_t v_num_iterate_bytes = 0; + uint64_t v_tail_index = 0; + + v_zeroes = _mm_set1_epi16((int16_t)(0)); + v_ones = _mm_set1_epi16((int16_t)(1)); + v_weights__left = _mm_set_epi8((int8_t)(17), (int8_t)(18), (int8_t)(19), (int8_t)(20), (int8_t)(21), (int8_t)(22), (int8_t)(23), (int8_t)(24), (int8_t)(25), (int8_t)(26), (int8_t)(27), (int8_t)(28), (int8_t)(29), (int8_t)(30), (int8_t)(31), (int8_t)(32)); + v_weights_right = _mm_set_epi8((int8_t)(1), (int8_t)(2), (int8_t)(3), (int8_t)(4), (int8_t)(5), (int8_t)(6), (int8_t)(7), (int8_t)(8), (int8_t)(9), (int8_t)(10), (int8_t)(11), (int8_t)(12), (int8_t)(13), (int8_t)(14), (int8_t)(15), (int8_t)(16)); + v_s1 = ((self->private_impl.f_state) & 0xFFFF); + v_s2 = ((self->private_impl.f_state) >> (32 - (16))); + while (((uint64_t)(a_x.len)) > 0) { + v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0); + if (((uint64_t)(a_x.len)) > 5536) { + v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536); + a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536); + } + v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264))); + v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); + v_v1 = _mm_setzero_si128(); + v_v2j = _mm_setzero_si128(); + v_v2k = _mm_setzero_si128(); + { + wuffs_base__slice_u8 i_slice_p = a_x; + v_p.ptr = i_slice_p.ptr; + v_p.len = 32; + uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); + while (v_p.ptr < i_end0_p) { + v_q__left = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr)); + v_q_right = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16)); + v_v2j = _mm_add_epi32(v_v2j, v_v1); + v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q__left, v_zeroes)); + v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q_right, v_zeroes)); + v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q__left, v_weights__left))); + v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q_right, v_weights_right))); + v_p.ptr += 32; + } + v_p.len = 0; + } + v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(177))); + v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(78))); + v_s1 += ((uint32_t)(_mm_cvtsi128_si32(v_v1))); + v_v2 = _mm_add_epi32(v_v2k, _mm_slli_epi32(v_v2j, (int32_t)(5))); + v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(177))); + v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(78))); + v_s2 += ((uint32_t)(_mm_cvtsi128_si32(v_v2))); + v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); + if (v_tail_index < ((uint64_t)(a_x.len))) { + { + wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); + v_p.ptr = i_slice_p.ptr; + v_p.len = 1; + uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; + while (v_p.ptr < i_end0_p) { + v_s1 += ((uint32_t)(v_p.ptr[0])); + v_s2 += v_s1; + v_p.ptr += 1; + } + v_p.len = 0; + } + } + v_s1 %= 65521; + v_s2 %= 65521; + a_x = v_remaining; + } + self->private_impl.f_state = (((v_s2 & 65535) << 16) | (v_s1 & 65535)); + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) + +// ---------------- Status Codes Implementations + +const char wuffs_bmp__error__bad_header[] = "#bmp: bad header"; +const char wuffs_bmp__error__bad_rle_compression[] = "#bmp: bad RLE compression"; +const char wuffs_bmp__error__truncated_input[] = "#bmp: truncated input"; +const char wuffs_bmp__error__unsupported_bmp_file[] = "#bmp: unsupported BMP file"; +const char wuffs_bmp__note__internal_note_short_read[] = "@bmp: internal note: short read"; + +// ---------------- Private Consts + +#define WUFFS_BMP__COMPRESSION_NONE 0 + +#define WUFFS_BMP__COMPRESSION_RLE8 1 + +#define WUFFS_BMP__COMPRESSION_RLE4 2 + +#define WUFFS_BMP__COMPRESSION_BITFIELDS 3 + +#define WUFFS_BMP__COMPRESSION_JPEG 4 + +#define WUFFS_BMP__COMPRESSION_PNG 5 + +#define WUFFS_BMP__COMPRESSION_ALPHABITFIELDS 6 + +#define WUFFS_BMP__COMPRESSION_LOW_BIT_DEPTH 256 + +#define WUFFS_BMP__RLE_STATE_NEUTRAL 0 + +#define WUFFS_BMP__RLE_STATE_RUN 1 + +#define WUFFS_BMP__RLE_STATE_ESCAPE 2 + +#define WUFFS_BMP__RLE_STATE_LITERAL 3 + +#define WUFFS_BMP__RLE_STATE_DELTA_X 4 + +#define WUFFS_BMP__RLE_STATE_DELTA_Y 5 + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__status +wuffs_bmp__decoder__do_decode_image_config( + wuffs_bmp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bmp__decoder__do_decode_frame_config( + wuffs_bmp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bmp__decoder__do_decode_frame( + wuffs_bmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +static wuffs_base__status +wuffs_bmp__decoder__swizzle_none( + wuffs_bmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bmp__decoder__swizzle_rle( + wuffs_bmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bmp__decoder__swizzle_bitfields( + wuffs_bmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bmp__decoder__swizzle_low_bit_depth( + wuffs_bmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bmp__decoder__do_tell_me_more( + wuffs_bmp__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bmp__decoder__read_palette( + wuffs_bmp__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bmp__decoder__process_masks( + wuffs_bmp__decoder* self); + +// ---------------- VTables + +const wuffs_base__image_decoder__func_ptrs +wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { + (wuffs_base__status(*)(void*, + wuffs_base__pixel_buffer*, + wuffs_base__io_buffer*, + wuffs_base__pixel_blend, + wuffs_base__slice_u8, + wuffs_base__decode_frame_options*))(&wuffs_bmp__decoder__decode_frame), + (wuffs_base__status(*)(void*, + wuffs_base__frame_config*, + wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_frame_config), + (wuffs_base__status(*)(void*, + wuffs_base__image_config*, + wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_image_config), + (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_bmp__decoder__frame_dirty_rect), + (uint32_t(*)(const void*))(&wuffs_bmp__decoder__num_animation_loops), + (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frame_configs), + (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frames), + (wuffs_base__status(*)(void*, + uint64_t, + uint64_t))(&wuffs_bmp__decoder__restart_frame), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_bmp__decoder__set_quirk_enabled), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_bmp__decoder__set_report_metadata), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__more_information*, + wuffs_base__io_buffer*))(&wuffs_bmp__decoder__tell_me_more), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bmp__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_bmp__decoder__initialize( + wuffs_bmp__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = + wuffs_base__image_decoder__vtable_name; + self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = + (const void*)(&wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder); + return wuffs_base__make_status(NULL); +} + +wuffs_bmp__decoder* +wuffs_bmp__decoder__alloc() { + wuffs_bmp__decoder* x = + (wuffs_bmp__decoder*)(1, calloc(sizeof(wuffs_bmp__decoder))); + if (!x) { + return NULL; + } + if (wuffs_bmp__decoder__initialize( + x, sizeof(wuffs_bmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_bmp__decoder() { + return sizeof(wuffs_bmp__decoder); +} + +// ---------------- Function Implementations + +// -------- func bmp.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_bmp__decoder__set_quirk_enabled( + wuffs_bmp__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__make_empty_struct(); +} + +// -------- func bmp.decoder.decode_image_config + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bmp__decoder__decode_image_config( + wuffs_bmp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_image_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_image_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func bmp.decoder.do_decode_image_config + +static wuffs_base__status +wuffs_bmp__decoder__do_decode_image_config( + wuffs_bmp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_magic = 0; + uint32_t v_width = 0; + uint32_t v_height = 0; + uint32_t v_planes = 0; + uint32_t v_dst_pixfmt = 0; + uint32_t v_byte_width = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if ((self->private_impl.f_call_sequence != 0) || (self->private_impl.f_io_redirect_fourcc == 1)) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } else if (self->private_impl.f_io_redirect_fourcc != 0) { + status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); + goto ok; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; + if (num_bits_0 == 8) { + t_0 = ((uint32_t)(*scratch)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } + v_magic = t_0; + } + if (v_magic != 19778) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } + self->private_data.s_do_decode_image_config[0].scratch = 8; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; + if (num_bits_1 == 24) { + t_1 = ((uint32_t)(*scratch)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } + self->private_impl.f_padding = t_1; + } + if (self->private_impl.f_padding < 14) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } + self->private_impl.f_padding -= 14; + self->private_impl.f_io_redirect_pos = wuffs_base__u64__sat_add(((uint64_t)(self->private_impl.f_padding)), wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))); + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + uint32_t t_2; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; + if (num_bits_2 == 24) { + t_2 = ((uint32_t)(*scratch)); + break; + } + num_bits_2 += 8; + *scratch |= ((uint64_t)(num_bits_2)) << 56; + } + } + self->private_impl.f_bitmap_info_len = t_2; + } + if (self->private_impl.f_padding < self->private_impl.f_bitmap_info_len) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } + self->private_impl.f_padding -= self->private_impl.f_bitmap_info_len; + if (self->private_impl.f_bitmap_info_len == 12) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + uint32_t t_3; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; + if (num_bits_3 == 8) { + t_3 = ((uint32_t)(*scratch)); + break; + } + num_bits_3 += 8; + *scratch |= ((uint64_t)(num_bits_3)) << 56; + } + } + self->private_impl.f_width = t_3; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + uint32_t t_4; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; + if (num_bits_4 == 8) { + t_4 = ((uint32_t)(*scratch)); + break; + } + num_bits_4 += 8; + *scratch |= ((uint64_t)(num_bits_4)) << 56; + } + } + self->private_impl.f_height = t_4; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); + uint32_t t_5; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_5 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5; + if (num_bits_5 == 8) { + t_5 = ((uint32_t)(*scratch)); + break; + } + num_bits_5 += 8; + *scratch |= ((uint64_t)(num_bits_5)) << 56; + } + } + v_planes = t_5; + } + if (v_planes != 1) { + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); + uint32_t t_6; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; + if (num_bits_6 == 8) { + t_6 = ((uint32_t)(*scratch)); + break; + } + num_bits_6 += 8; + *scratch |= ((uint64_t)(num_bits_6)) << 56; + } + } + self->private_impl.f_bits_per_pixel = t_6; + } + } else if (self->private_impl.f_bitmap_info_len == 16) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); + uint32_t t_7; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; + if (num_bits_7 == 24) { + t_7 = ((uint32_t)(*scratch)); + break; + } + num_bits_7 += 8; + *scratch |= ((uint64_t)(num_bits_7)) << 56; + } + } + v_width = t_7; + } + if (v_width >= 2147483648) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } + self->private_impl.f_width = v_width; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); + uint32_t t_8; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; + if (num_bits_8 == 24) { + t_8 = ((uint32_t)(*scratch)); + break; + } + num_bits_8 += 8; + *scratch |= ((uint64_t)(num_bits_8)) << 56; + } + } + v_height = t_8; + } + if (v_height >= 2147483648) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } + self->private_impl.f_height = v_height; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); + uint32_t t_9; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_9 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; + if (num_bits_9 == 8) { + t_9 = ((uint32_t)(*scratch)); + break; + } + num_bits_9 += 8; + *scratch |= ((uint64_t)(num_bits_9)) << 56; + } + } + v_planes = t_9; + } + if (v_planes != 1) { + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); + uint32_t t_10; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_10 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; + if (num_bits_10 == 8) { + t_10 = ((uint32_t)(*scratch)); + break; + } + num_bits_10 += 8; + *scratch |= ((uint64_t)(num_bits_10)) << 56; + } + } + self->private_impl.f_bits_per_pixel = t_10; + } + } else { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); + uint32_t t_11; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; + if (num_bits_11 == 24) { + t_11 = ((uint32_t)(*scratch)); + break; + } + num_bits_11 += 8; + *scratch |= ((uint64_t)(num_bits_11)) << 56; + } + } + v_width = t_11; + } + if (v_width >= 2147483648) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } + self->private_impl.f_width = v_width; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); + uint32_t t_12; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_12 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; + if (num_bits_12 == 24) { + t_12 = ((uint32_t)(*scratch)); + break; + } + num_bits_12 += 8; + *scratch |= ((uint64_t)(num_bits_12)) << 56; + } + } + v_height = t_12; + } + if (v_height == 2147483648) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } else if (v_height >= 2147483648) { + self->private_impl.f_height = (((uint32_t)(0 - v_height)) & 2147483647); + self->private_impl.f_top_down = true; + } else { + self->private_impl.f_height = v_height; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); + uint32_t t_13; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_13 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_13 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_13; + if (num_bits_13 == 8) { + t_13 = ((uint32_t)(*scratch)); + break; + } + num_bits_13 += 8; + *scratch |= ((uint64_t)(num_bits_13)) << 56; + } + } + v_planes = t_13; + } + if (v_planes != 1) { + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); + uint32_t t_14; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_14 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_14 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_14; + if (num_bits_14 == 8) { + t_14 = ((uint32_t)(*scratch)); + break; + } + num_bits_14 += 8; + *scratch |= ((uint64_t)(num_bits_14)) << 56; + } + } + self->private_impl.f_bits_per_pixel = t_14; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); + uint32_t t_15; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15; + if (num_bits_15 == 24) { + t_15 = ((uint32_t)(*scratch)); + break; + } + num_bits_15 += 8; + *scratch |= ((uint64_t)(num_bits_15)) << 56; + } + } + self->private_impl.f_compression = t_15; + } + if (self->private_impl.f_bits_per_pixel == 0) { + if (self->private_impl.f_compression == 4) { + self->private_impl.f_io_redirect_fourcc = 1246774599; + status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); + goto ok; + } else if (self->private_impl.f_compression == 5) { + self->private_impl.f_io_redirect_fourcc = 1347307296; + status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); + goto ok; + } + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + self->private_data.s_do_decode_image_config[0].scratch = 20; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(34); + if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; + if (self->private_impl.f_bitmap_info_len == 40) { + if (self->private_impl.f_bits_per_pixel >= 16) { + if (self->private_impl.f_padding >= 16) { + self->private_impl.f_bitmap_info_len = 56; + self->private_impl.f_padding -= 16; + } else if (self->private_impl.f_padding >= 12) { + self->private_impl.f_bitmap_info_len = 52; + self->private_impl.f_padding -= 12; + } + } + } else if ((self->private_impl.f_bitmap_info_len != 52) && + (self->private_impl.f_bitmap_info_len != 56) && + (self->private_impl.f_bitmap_info_len != 64) && + (self->private_impl.f_bitmap_info_len != 108) && + (self->private_impl.f_bitmap_info_len != 124)) { + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + if (self->private_impl.f_compression == 6) { + self->private_impl.f_compression = 3; + } + if (self->private_impl.f_compression == 3) { + if (self->private_impl.f_bitmap_info_len >= 52) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(35); + uint32_t t_16; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(36); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16; + if (num_bits_16 == 24) { + t_16 = ((uint32_t)(*scratch)); + break; + } + num_bits_16 += 8; + *scratch |= ((uint64_t)(num_bits_16)) << 56; + } + } + self->private_impl.f_channel_masks[2] = t_16; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(37); + uint32_t t_17; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_17 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(38); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_17 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_17; + if (num_bits_17 == 24) { + t_17 = ((uint32_t)(*scratch)); + break; + } + num_bits_17 += 8; + *scratch |= ((uint64_t)(num_bits_17)) << 56; + } + } + self->private_impl.f_channel_masks[1] = t_17; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(39); + uint32_t t_18; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_18 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(40); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18; + if (num_bits_18 == 24) { + t_18 = ((uint32_t)(*scratch)); + break; + } + num_bits_18 += 8; + *scratch |= ((uint64_t)(num_bits_18)) << 56; + } + } + self->private_impl.f_channel_masks[0] = t_18; + } + if (self->private_impl.f_bitmap_info_len >= 56) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(41); + uint32_t t_19; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_19 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(42); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_19 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_19; + if (num_bits_19 == 24) { + t_19 = ((uint32_t)(*scratch)); + break; + } + num_bits_19 += 8; + *scratch |= ((uint64_t)(num_bits_19)) << 56; + } + } + self->private_impl.f_channel_masks[3] = t_19; + } + self->private_data.s_do_decode_image_config[0].scratch = ((uint32_t)(self->private_impl.f_bitmap_info_len - 56)); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(43); + if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; + } + if ((self->private_impl.f_channel_masks[0] == 255) && (self->private_impl.f_channel_masks[1] == 65280) && (self->private_impl.f_channel_masks[2] == 16711680)) { + if (self->private_impl.f_bits_per_pixel == 24) { + self->private_impl.f_compression = 0; + } else if (self->private_impl.f_bits_per_pixel == 32) { + if ((self->private_impl.f_channel_masks[3] == 0) || (self->private_impl.f_channel_masks[3] == 4278190080)) { + self->private_impl.f_compression = 0; + } + } + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(44); + status = wuffs_bmp__decoder__process_masks(self); + if (status.repr) { + goto suspend; + } + } + } else if (self->private_impl.f_bitmap_info_len >= 40) { + self->private_data.s_do_decode_image_config[0].scratch = (self->private_impl.f_bitmap_info_len - 40); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(45); + if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; + } else { + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + } + if (self->private_impl.f_compression != 3) { + if (self->private_impl.f_bits_per_pixel < 16) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(46); + status = wuffs_bmp__decoder__read_palette(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } + } + if (self->private_impl.f_compression == 0) { + if ((self->private_impl.f_bits_per_pixel == 1) || (self->private_impl.f_bits_per_pixel == 2) || (self->private_impl.f_bits_per_pixel == 4)) { + self->private_impl.f_src_pixfmt = 2198077448; + self->private_impl.f_compression = 256; + } else if (self->private_impl.f_bits_per_pixel == 8) { + self->private_impl.f_src_pixfmt = 2198077448; + } else if (self->private_impl.f_bits_per_pixel == 16) { + self->private_impl.f_compression = 3; + self->private_impl.f_channel_masks[0] = 31; + self->private_impl.f_channel_masks[1] = 992; + self->private_impl.f_channel_masks[2] = 31744; + self->private_impl.f_channel_masks[3] = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(47); + status = wuffs_bmp__decoder__process_masks(self); + if (status.repr) { + goto suspend; + } + self->private_impl.f_src_pixfmt = 2164308923; + } else if (self->private_impl.f_bits_per_pixel == 24) { + self->private_impl.f_src_pixfmt = 2147485832; + } else if (self->private_impl.f_bits_per_pixel == 32) { + if (self->private_impl.f_channel_masks[3] == 0) { + self->private_impl.f_src_pixfmt = 2415954056; + } else { + self->private_impl.f_src_pixfmt = 2164295816; + } + } else { + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + } else if (self->private_impl.f_compression == 1) { + if (self->private_impl.f_bits_per_pixel == 8) { + self->private_impl.f_src_pixfmt = 2198077448; + } else { + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + } else if (self->private_impl.f_compression == 2) { + if (self->private_impl.f_bits_per_pixel == 4) { + self->private_impl.f_src_pixfmt = 2198077448; + } else { + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + } else if (self->private_impl.f_compression == 3) { + if ((self->private_impl.f_bits_per_pixel == 16) || (self->private_impl.f_bits_per_pixel == 32)) { + self->private_impl.f_src_pixfmt = 2164308923; + } else { + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + } else { + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + if (((self->private_impl.f_bitmap_info_len < 40) || (self->private_impl.f_bitmap_info_len == 64)) && + (self->private_impl.f_bits_per_pixel != 1) && + (self->private_impl.f_bits_per_pixel != 4) && + (self->private_impl.f_bits_per_pixel != 8) && + (self->private_impl.f_bits_per_pixel != 24)) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } + if (self->private_impl.f_bits_per_pixel == 1) { + v_byte_width = ((self->private_impl.f_width >> 3) + (((self->private_impl.f_width & 7) + 7) >> 3)); + self->private_impl.f_pad_per_row = ((4 - (v_byte_width & 3)) & 3); + } else if (self->private_impl.f_bits_per_pixel == 2) { + v_byte_width = ((self->private_impl.f_width >> 2) + (((self->private_impl.f_width & 3) + 3) >> 2)); + self->private_impl.f_pad_per_row = ((4 - (v_byte_width & 3)) & 3); + } else if (self->private_impl.f_bits_per_pixel == 4) { + v_byte_width = ((self->private_impl.f_width >> 1) + (self->private_impl.f_width & 1)); + self->private_impl.f_pad_per_row = ((4 - (v_byte_width & 3)) & 3); + } else if (self->private_impl.f_bits_per_pixel == 8) { + self->private_impl.f_pad_per_row = ((4 - (self->private_impl.f_width & 3)) & 3); + } else if (self->private_impl.f_bits_per_pixel == 16) { + self->private_impl.f_pad_per_row = ((self->private_impl.f_width & 1) * 2); + } else if (self->private_impl.f_bits_per_pixel == 24) { + self->private_impl.f_pad_per_row = (self->private_impl.f_width & 3); + } else if (self->private_impl.f_bits_per_pixel == 32) { + self->private_impl.f_pad_per_row = 0; + } + self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); + if (a_dst != NULL) { + v_dst_pixfmt = 2164295816; + if ((self->private_impl.f_channel_num_bits[0] > 8) || + (self->private_impl.f_channel_num_bits[1] > 8) || + (self->private_impl.f_channel_num_bits[2] > 8) || + (self->private_impl.f_channel_num_bits[3] > 8)) { + v_dst_pixfmt = 2164308923; + } + wuffs_base__image_config__set( + a_dst, + v_dst_pixfmt, + 0, + self->private_impl.f_width, + self->private_impl.f_height, + self->private_impl.f_frame_config_io_position, + (self->private_impl.f_channel_masks[3] == 0)); + } + self->private_impl.f_call_sequence = 32; + + ok: + self->private_impl.p_do_decode_image_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bmp.decoder.decode_frame_config + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bmp__decoder__decode_frame_config( + wuffs_bmp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_frame_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func bmp.decoder.do_decode_frame_config + +static wuffs_base__status +wuffs_bmp__decoder__do_decode_frame_config( + wuffs_bmp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence == 32) { + } else if (self->private_impl.f_call_sequence < 32) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_bmp__decoder__do_decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else if (self->private_impl.f_call_sequence == 40) { + if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { + status = wuffs_base__make_status(wuffs_base__error__bad_restart); + goto exit; + } + } else if (self->private_impl.f_call_sequence == 64) { + self->private_impl.f_call_sequence = 96; + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + if (a_dst != NULL) { + wuffs_base__frame_config__set( + a_dst, + wuffs_base__utility__make_rect_ie_u32( + 0, + 0, + self->private_impl.f_width, + self->private_impl.f_height), + ((wuffs_base__flicks)(0)), + 0, + self->private_impl.f_frame_config_io_position, + 0, + true, + false, + 4278190080); + } + self->private_impl.f_call_sequence = 64; + + ok: + self->private_impl.p_do_decode_frame_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bmp.decoder.decode_frame + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bmp__decoder__decode_frame( + wuffs_bmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 3)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame(self, + a_dst, + a_src, + a_blend, + a_workbuf, + a_opts); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func bmp.decoder.do_decode_frame + +static wuffs_base__status +wuffs_bmp__decoder__do_decode_frame( + wuffs_bmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence == 64) { + } else if (self->private_impl.f_call_sequence < 64) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_bmp__decoder__do_decode_frame_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + self->private_data.s_do_decode_frame[0].scratch = self->private_impl.f_padding; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_decode_frame[0].scratch; + if ((self->private_impl.f_width > 0) && (self->private_impl.f_height > 0)) { + self->private_impl.f_dst_x = 0; + if (self->private_impl.f_top_down) { + self->private_impl.f_dst_y = 0; + self->private_impl.f_dst_y_inc = 1; + } else { + self->private_impl.f_dst_y = ((uint32_t)(self->private_impl.f_height - 1)); + self->private_impl.f_dst_y_inc = 4294967295; + } + v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, + wuffs_base__pixel_buffer__pixel_format(a_dst), + wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)), + wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), + wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), + a_blend); + if ( ! wuffs_base__status__is_ok(&v_status)) { + status = v_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + while (true) { + if (self->private_impl.f_compression == 0) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + v_status = wuffs_bmp__decoder__swizzle_none(self, a_dst, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } else if (self->private_impl.f_compression < 3) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + v_status = wuffs_bmp__decoder__swizzle_rle(self, a_dst, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } else if (self->private_impl.f_compression == 3) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + v_status = wuffs_bmp__decoder__swizzle_bitfields(self, a_dst, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } else { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + v_status = wuffs_bmp__decoder__swizzle_low_bit_depth(self, a_dst, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } + if (wuffs_base__status__is_ok(&v_status)) { + goto label__0__break; + } else if (v_status.repr != wuffs_bmp__note__internal_note_short_read) { + status = v_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + } + label__0__break:; + self->private_data.s_do_decode_frame[0].scratch = self->private_impl.f_pending_pad; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_decode_frame[0].scratch; + self->private_impl.f_pending_pad = 0; + } + self->private_impl.f_call_sequence = 96; + + ok: + self->private_impl.p_do_decode_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bmp.decoder.swizzle_none + +static wuffs_base__status +wuffs_bmp__decoder__swizzle_none( + wuffs_bmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__pixel_format v_dst_pixfmt = {0}; + uint32_t v_dst_bits_per_pixel = 0; + uint64_t v_dst_bytes_per_pixel = 0; + uint64_t v_dst_bytes_per_row = 0; + uint32_t v_src_bytes_per_pixel = 0; + wuffs_base__slice_u8 v_dst_palette = {0}; + wuffs_base__table_u8 v_tab = {0}; + wuffs_base__slice_u8 v_dst = {0}; + uint64_t v_i = 0; + uint64_t v_j = 0; + uint64_t v_n = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); + v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); + if ((v_dst_bits_per_pixel & 7) != 0) { + status = wuffs_base__make_status(wuffs_base__error__unsupported_option); + goto exit; + } + v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); + v_dst_bytes_per_row = (((uint64_t)(self->private_impl.f_width)) * v_dst_bytes_per_pixel); + v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); + v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); + label__outer__continue:; + while (true) { + while (self->private_impl.f_pending_pad > 0) { + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); + goto ok; + } + self->private_impl.f_pending_pad -= 1; + iop_a_src += 1; + } + while (true) { + if (self->private_impl.f_dst_x == self->private_impl.f_width) { + self->private_impl.f_dst_x = 0; + self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; + if (self->private_impl.f_dst_y >= self->private_impl.f_height) { + if (self->private_impl.f_height > 0) { + self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; + } + goto label__outer__break; + } else if (self->private_impl.f_pad_per_row != 0) { + self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; + goto label__outer__continue; + } + } + v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); + if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); + } + v_i = (((uint64_t)(self->private_impl.f_dst_x)) * v_dst_bytes_per_pixel); + if (v_i >= ((uint64_t)(v_dst.len))) { + if (self->private_impl.f_bits_per_pixel > 32) { + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + v_src_bytes_per_pixel = (self->private_impl.f_bits_per_pixel / 8); + if (v_src_bytes_per_pixel == 0) { + status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } + v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); + v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); + v_j = v_n; + while (v_j >= 8) { + if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8)))) { + iop_a_src += (v_src_bytes_per_pixel * 8); + } + v_j -= 8; + } + while (v_j > 0) { + if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1)))) { + iop_a_src += (v_src_bytes_per_pixel * 1); + } + v_j -= 1; + } + } else { + v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( + &self->private_impl.f_swizzler, + wuffs_base__slice_u8__subslice_i(v_dst, v_i), + v_dst_palette, + &iop_a_src, + io2_a_src); + } + if (v_n == 0) { + status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); + goto ok; + } + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)((v_n & 4294967295)))); + } + } + label__outer__break:; + status = wuffs_base__make_status(NULL); + goto ok; + + ok: + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bmp.decoder.swizzle_rle + +static wuffs_base__status +wuffs_bmp__decoder__swizzle_rle( + wuffs_bmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__pixel_format v_dst_pixfmt = {0}; + uint32_t v_dst_bits_per_pixel = 0; + uint64_t v_dst_bytes_per_pixel = 0; + uint64_t v_dst_bytes_per_row = 0; + wuffs_base__slice_u8 v_dst_palette = {0}; + wuffs_base__table_u8 v_tab = {0}; + wuffs_base__slice_u8 v_row = {0}; + wuffs_base__slice_u8 v_dst = {0}; + uint64_t v_i = 0; + uint64_t v_n = 0; + uint32_t v_p0 = 0; + uint8_t v_code = 0; + uint8_t v_indexes[2] = {0}; + uint32_t v_rle_state = 0; + uint32_t v_chunk_bits = 0; + uint32_t v_chunk_count = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); + v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); + if ((v_dst_bits_per_pixel & 7) != 0) { + status = wuffs_base__make_status(wuffs_base__error__unsupported_option); + goto exit; + } + v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); + v_dst_bytes_per_row = (((uint64_t)(self->private_impl.f_width)) * v_dst_bytes_per_pixel); + v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); + v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); + v_rle_state = self->private_impl.f_rle_state; + label__outer__continue:; + while (true) { + v_row = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); + if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { + v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); + } + label__middle__continue:; + while (true) { + v_i = (((uint64_t)(self->private_impl.f_dst_x)) * v_dst_bytes_per_pixel); + if (v_i <= ((uint64_t)(v_row.len))) { + v_dst = wuffs_base__slice_u8__subslice_i(v_row, v_i); + } else { + v_dst = wuffs_base__utility__empty_slice_u8(); + } + while (true) { + label__inner__continue:; + while (true) { + if (v_rle_state == 0) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 1) { + goto label__goto_suspend__break; + } + v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + if (v_code == 0) { + v_rle_state = 2; + goto label__inner__continue; + } + self->private_impl.f_rle_length = ((uint32_t)(v_code)); + v_rle_state = 1; + goto label__inner__continue; + } else if (v_rle_state == 1) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 1) { + goto label__goto_suspend__break; + } + v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + if (self->private_impl.f_bits_per_pixel == 8) { + v_p0 = 0; + while (v_p0 < self->private_impl.f_rle_length) { + self->private_data.f_scratch[v_p0] = v_code; + v_p0 += 1; + } + } else { + v_indexes[0] = ((uint8_t)((v_code >> 4))); + v_indexes[1] = (v_code & 15); + v_p0 = 0; + while (v_p0 < self->private_impl.f_rle_length) { + self->private_data.f_scratch[(v_p0 + 0)] = v_indexes[0]; + self->private_data.f_scratch[(v_p0 + 1)] = v_indexes[1]; + v_p0 += 2; + } + } + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_rle_length)); + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length); + v_rle_state = 0; + goto label__middle__continue; + } else if (v_rle_state == 2) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 1) { + goto label__goto_suspend__break; + } + v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + if (v_code < 2) { + if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0)) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); + goto exit; + } + wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, 18446744073709551615u); + self->private_impl.f_dst_x = 0; + self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; + if (v_code > 0) { + goto label__outer__break; + } + v_rle_state = 0; + goto label__outer__continue; + } else if (v_code == 2) { + v_rle_state = 4; + goto label__inner__continue; + } + self->private_impl.f_rle_length = ((uint32_t)(v_code)); + self->private_impl.f_rle_padded = ((self->private_impl.f_bits_per_pixel == 8) && ((v_code & 1) != 0)); + v_rle_state = 3; + goto label__inner__continue; + } else if (v_rle_state == 3) { + if (self->private_impl.f_bits_per_pixel == 8) { + v_n = wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( + &self->private_impl.f_swizzler, + self->private_impl.f_rle_length, + v_dst, + v_dst_palette, + &iop_a_src, + io2_a_src); + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)((v_n & 4294967295)))); + wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_rle_length, ((uint32_t)((v_n & 4294967295)))); + } else { + v_chunk_count = ((self->private_impl.f_rle_length + 3) / 4); + v_p0 = 0; + while ((v_chunk_count > 0) && (((uint64_t)(io2_a_src - iop_a_src)) >= 2)) { + v_chunk_bits = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); + iop_a_src += 2; + self->private_data.f_scratch[(v_p0 + 0)] = ((uint8_t)((15 & (v_chunk_bits >> 12)))); + self->private_data.f_scratch[(v_p0 + 1)] = ((uint8_t)((15 & (v_chunk_bits >> 8)))); + self->private_data.f_scratch[(v_p0 + 2)] = ((uint8_t)((15 & (v_chunk_bits >> 4)))); + self->private_data.f_scratch[(v_p0 + 3)] = ((uint8_t)((15 & (v_chunk_bits >> 0)))); + v_p0 = ((v_p0 & 255) + 4); + v_chunk_count -= 1; + } + v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length); + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0); + wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0); + } + if (self->private_impl.f_rle_length > 0) { + goto label__goto_suspend__break; + } + if (self->private_impl.f_rle_padded) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 1) { + goto label__goto_suspend__break; + } + iop_a_src += 1; + self->private_impl.f_rle_padded = false; + } + v_rle_state = 0; + goto label__middle__continue; + } else if (v_rle_state == 4) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 1) { + goto label__goto_suspend__break; + } + self->private_impl.f_rle_delta_x = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + v_rle_state = 5; + goto label__inner__continue; + } + if (((uint64_t)(io2_a_src - iop_a_src)) < 1) { + goto label__goto_suspend__break; + } + v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + if (self->private_impl.f_rle_delta_x > 0) { + wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, ((uint64_t)(self->private_impl.f_rle_delta_x))); + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x))); + self->private_impl.f_rle_delta_x = 0; + if (self->private_impl.f_dst_x > self->private_impl.f_width) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); + goto exit; + } + } + if (v_code > 0) { +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + v_code -= 1; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + while (true) { + self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; + if (self->private_impl.f_dst_y >= self->private_impl.f_height) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); + goto exit; + } + v_row = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); + if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { + v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); + } + if (v_code <= 0) { + wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, ((uint64_t)(self->private_impl.f_dst_x))); + goto label__0__break; + } + wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + v_code -= 1; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } + label__0__break:; + } + v_rle_state = 0; + goto label__middle__continue; + } + } + label__goto_suspend__break:; + self->private_impl.f_rle_state = v_rle_state; + status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); + goto ok; + } + } + label__outer__break:; + while (self->private_impl.f_dst_y < self->private_impl.f_height) { + v_row = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); + if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { + v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); + } + wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); + self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; + } + status = wuffs_base__make_status(NULL); + goto ok; + + ok: + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bmp.decoder.swizzle_bitfields + +static wuffs_base__status +wuffs_bmp__decoder__swizzle_bitfields( + wuffs_bmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__pixel_format v_dst_pixfmt = {0}; + uint32_t v_dst_bits_per_pixel = 0; + uint64_t v_dst_bytes_per_pixel = 0; + uint64_t v_dst_bytes_per_row = 0; + wuffs_base__slice_u8 v_dst_palette = {0}; + wuffs_base__table_u8 v_tab = {0}; + wuffs_base__slice_u8 v_dst = {0}; + uint64_t v_i = 0; + uint64_t v_n = 0; + uint32_t v_p0 = 0; + uint32_t v_p1 = 0; + uint32_t v_p1_temp = 0; + uint32_t v_num_bits = 0; + uint32_t v_c = 0; + uint32_t v_c32 = 0; + uint32_t v_channel = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); + v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); + if ((v_dst_bits_per_pixel & 7) != 0) { + status = wuffs_base__make_status(wuffs_base__error__unsupported_option); + goto exit; + } + v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); + v_dst_bytes_per_row = (((uint64_t)(self->private_impl.f_width)) * v_dst_bytes_per_pixel); + v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); + v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); + label__outer__continue:; + while (true) { + while (self->private_impl.f_pending_pad > 0) { + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); + goto ok; + } + self->private_impl.f_pending_pad -= 1; + iop_a_src += 1; + } + while (true) { + if (self->private_impl.f_dst_x == self->private_impl.f_width) { + self->private_impl.f_dst_x = 0; + self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; + if (self->private_impl.f_dst_y >= self->private_impl.f_height) { + if (self->private_impl.f_height > 0) { + self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; + } + goto label__outer__break; + } else if (self->private_impl.f_pad_per_row != 0) { + self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; + goto label__outer__continue; + } + } + v_p1_temp = ((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)); + v_p1 = wuffs_base__u32__min(v_p1_temp, 256); + v_p0 = 0; + while (v_p0 < v_p1) { + if (self->private_impl.f_bits_per_pixel == 16) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 2) { + goto label__0__break; + } + v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + if (((uint64_t)(io2_a_src - iop_a_src)) < 4) { + goto label__0__break; + } + v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } + v_channel = 0; + while (v_channel < 4) { + if (self->private_impl.f_channel_num_bits[v_channel] == 0) { + self->private_data.f_scratch[((8 * v_p0) + (2 * v_channel) + 0)] = 255; + self->private_data.f_scratch[((8 * v_p0) + (2 * v_channel) + 1)] = 255; + } else { + v_c = ((v_c32 & self->private_impl.f_channel_masks[v_channel]) >> self->private_impl.f_channel_shifts[v_channel]); + v_num_bits = ((uint32_t)(self->private_impl.f_channel_num_bits[v_channel])); + while (v_num_bits < 16) { + v_c |= ((uint32_t)(v_c << v_num_bits)); + v_num_bits *= 2; + } + v_c >>= (v_num_bits - 16); + self->private_data.f_scratch[((8 * v_p0) + (2 * v_channel) + 0)] = ((uint8_t)((255 & (v_c >> 0)))); + self->private_data.f_scratch[((8 * v_p0) + (2 * v_channel) + 1)] = ((uint8_t)((255 & (v_c >> 8)))); + } + v_channel += 1; + } + v_p0 += 1; + } + label__0__break:; + v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); + if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); + } + v_i = (((uint64_t)(self->private_impl.f_dst_x)) * v_dst_bytes_per_pixel); + if (v_i >= ((uint64_t)(v_dst.len))) { + v_n = ((uint64_t)(v_p0)); + } else { + v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, (8 * v_p0))); + } + if (v_n == 0) { + status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); + goto ok; + } + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)((v_n & 4294967295)))); + } + } + label__outer__break:; + status = wuffs_base__make_status(NULL); + goto ok; + + ok: + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bmp.decoder.swizzle_low_bit_depth + +static wuffs_base__status +wuffs_bmp__decoder__swizzle_low_bit_depth( + wuffs_bmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__pixel_format v_dst_pixfmt = {0}; + uint32_t v_dst_bits_per_pixel = 0; + uint64_t v_dst_bytes_per_pixel = 0; + uint64_t v_dst_bytes_per_row = 0; + wuffs_base__slice_u8 v_dst_palette = {0}; + wuffs_base__table_u8 v_tab = {0}; + wuffs_base__slice_u8 v_dst = {0}; + uint64_t v_i = 0; + uint64_t v_n = 0; + uint32_t v_p0 = 0; + uint32_t v_chunk_bits = 0; + uint32_t v_chunk_count = 0; + uint32_t v_pixels_per_chunk = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); + v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); + if ((v_dst_bits_per_pixel & 7) != 0) { + status = wuffs_base__make_status(wuffs_base__error__unsupported_option); + goto exit; + } + v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); + v_dst_bytes_per_row = (((uint64_t)(self->private_impl.f_width)) * v_dst_bytes_per_pixel); + v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); + v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); + label__loop__continue:; + while (true) { + if (self->private_impl.f_dst_x == self->private_impl.f_width) { + self->private_impl.f_dst_x = 0; + self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; + if (self->private_impl.f_dst_y >= self->private_impl.f_height) { + goto label__loop__break; + } + } + v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); + if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); + } + v_i = (((uint64_t)(self->private_impl.f_dst_x)) * v_dst_bytes_per_pixel); + if (v_i >= ((uint64_t)(v_dst.len))) { + if (self->private_impl.f_bits_per_pixel == 1) { + v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31) / 32); + v_pixels_per_chunk = 32; + } else if (self->private_impl.f_bits_per_pixel == 2) { + v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15) / 16); + v_pixels_per_chunk = 16; + } else { + v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7) / 8); + v_pixels_per_chunk = 8; + } + while ((v_chunk_count >= 64) && (((uint64_t)(io2_a_src - iop_a_src)) >= 256)) { + iop_a_src += 256; + self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 64)))); + v_chunk_count -= 64; + } + while ((v_chunk_count >= 8) && (((uint64_t)(io2_a_src - iop_a_src)) >= 32)) { + iop_a_src += 32; + self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 8)))); + v_chunk_count -= 8; + } + while (v_chunk_count > 0) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 4) { + status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); + goto ok; + } + iop_a_src += 4; + self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 1)))); + v_chunk_count -= 1; + } + goto label__loop__continue; + } + v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); + v_p0 = 0; + if (self->private_impl.f_bits_per_pixel == 1) { + v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31) / 32); + v_chunk_count = wuffs_base__u32__min(v_chunk_count, 16); + while ((v_chunk_count > 0) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4)) { + v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + self->private_data.f_scratch[(v_p0 + 0)] = ((uint8_t)((1 & (v_chunk_bits >> 31)))); + self->private_data.f_scratch[(v_p0 + 1)] = ((uint8_t)((1 & (v_chunk_bits >> 30)))); + self->private_data.f_scratch[(v_p0 + 2)] = ((uint8_t)((1 & (v_chunk_bits >> 29)))); + self->private_data.f_scratch[(v_p0 + 3)] = ((uint8_t)((1 & (v_chunk_bits >> 28)))); + self->private_data.f_scratch[(v_p0 + 4)] = ((uint8_t)((1 & (v_chunk_bits >> 27)))); + self->private_data.f_scratch[(v_p0 + 5)] = ((uint8_t)((1 & (v_chunk_bits >> 26)))); + self->private_data.f_scratch[(v_p0 + 6)] = ((uint8_t)((1 & (v_chunk_bits >> 25)))); + self->private_data.f_scratch[(v_p0 + 7)] = ((uint8_t)((1 & (v_chunk_bits >> 24)))); + self->private_data.f_scratch[(v_p0 + 8)] = ((uint8_t)((1 & (v_chunk_bits >> 23)))); + self->private_data.f_scratch[(v_p0 + 9)] = ((uint8_t)((1 & (v_chunk_bits >> 22)))); + self->private_data.f_scratch[(v_p0 + 10)] = ((uint8_t)((1 & (v_chunk_bits >> 21)))); + self->private_data.f_scratch[(v_p0 + 11)] = ((uint8_t)((1 & (v_chunk_bits >> 20)))); + self->private_data.f_scratch[(v_p0 + 12)] = ((uint8_t)((1 & (v_chunk_bits >> 19)))); + self->private_data.f_scratch[(v_p0 + 13)] = ((uint8_t)((1 & (v_chunk_bits >> 18)))); + self->private_data.f_scratch[(v_p0 + 14)] = ((uint8_t)((1 & (v_chunk_bits >> 17)))); + self->private_data.f_scratch[(v_p0 + 15)] = ((uint8_t)((1 & (v_chunk_bits >> 16)))); + self->private_data.f_scratch[(v_p0 + 16)] = ((uint8_t)((1 & (v_chunk_bits >> 15)))); + self->private_data.f_scratch[(v_p0 + 17)] = ((uint8_t)((1 & (v_chunk_bits >> 14)))); + self->private_data.f_scratch[(v_p0 + 18)] = ((uint8_t)((1 & (v_chunk_bits >> 13)))); + self->private_data.f_scratch[(v_p0 + 19)] = ((uint8_t)((1 & (v_chunk_bits >> 12)))); + self->private_data.f_scratch[(v_p0 + 20)] = ((uint8_t)((1 & (v_chunk_bits >> 11)))); + self->private_data.f_scratch[(v_p0 + 21)] = ((uint8_t)((1 & (v_chunk_bits >> 10)))); + self->private_data.f_scratch[(v_p0 + 22)] = ((uint8_t)((1 & (v_chunk_bits >> 9)))); + self->private_data.f_scratch[(v_p0 + 23)] = ((uint8_t)((1 & (v_chunk_bits >> 8)))); + self->private_data.f_scratch[(v_p0 + 24)] = ((uint8_t)((1 & (v_chunk_bits >> 7)))); + self->private_data.f_scratch[(v_p0 + 25)] = ((uint8_t)((1 & (v_chunk_bits >> 6)))); + self->private_data.f_scratch[(v_p0 + 26)] = ((uint8_t)((1 & (v_chunk_bits >> 5)))); + self->private_data.f_scratch[(v_p0 + 27)] = ((uint8_t)((1 & (v_chunk_bits >> 4)))); + self->private_data.f_scratch[(v_p0 + 28)] = ((uint8_t)((1 & (v_chunk_bits >> 3)))); + self->private_data.f_scratch[(v_p0 + 29)] = ((uint8_t)((1 & (v_chunk_bits >> 2)))); + self->private_data.f_scratch[(v_p0 + 30)] = ((uint8_t)((1 & (v_chunk_bits >> 1)))); + self->private_data.f_scratch[(v_p0 + 31)] = ((uint8_t)((1 & (v_chunk_bits >> 0)))); + v_p0 = ((v_p0 & 511) + 32); + v_chunk_count -= 1; + } + } else if (self->private_impl.f_bits_per_pixel == 2) { + v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15) / 16); + v_chunk_count = wuffs_base__u32__min(v_chunk_count, 32); + while ((v_chunk_count > 0) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4)) { + v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + self->private_data.f_scratch[(v_p0 + 0)] = ((uint8_t)((3 & (v_chunk_bits >> 30)))); + self->private_data.f_scratch[(v_p0 + 1)] = ((uint8_t)((3 & (v_chunk_bits >> 28)))); + self->private_data.f_scratch[(v_p0 + 2)] = ((uint8_t)((3 & (v_chunk_bits >> 26)))); + self->private_data.f_scratch[(v_p0 + 3)] = ((uint8_t)((3 & (v_chunk_bits >> 24)))); + self->private_data.f_scratch[(v_p0 + 4)] = ((uint8_t)((3 & (v_chunk_bits >> 22)))); + self->private_data.f_scratch[(v_p0 + 5)] = ((uint8_t)((3 & (v_chunk_bits >> 20)))); + self->private_data.f_scratch[(v_p0 + 6)] = ((uint8_t)((3 & (v_chunk_bits >> 18)))); + self->private_data.f_scratch[(v_p0 + 7)] = ((uint8_t)((3 & (v_chunk_bits >> 16)))); + self->private_data.f_scratch[(v_p0 + 8)] = ((uint8_t)((3 & (v_chunk_bits >> 14)))); + self->private_data.f_scratch[(v_p0 + 9)] = ((uint8_t)((3 & (v_chunk_bits >> 12)))); + self->private_data.f_scratch[(v_p0 + 10)] = ((uint8_t)((3 & (v_chunk_bits >> 10)))); + self->private_data.f_scratch[(v_p0 + 11)] = ((uint8_t)((3 & (v_chunk_bits >> 8)))); + self->private_data.f_scratch[(v_p0 + 12)] = ((uint8_t)((3 & (v_chunk_bits >> 6)))); + self->private_data.f_scratch[(v_p0 + 13)] = ((uint8_t)((3 & (v_chunk_bits >> 4)))); + self->private_data.f_scratch[(v_p0 + 14)] = ((uint8_t)((3 & (v_chunk_bits >> 2)))); + self->private_data.f_scratch[(v_p0 + 15)] = ((uint8_t)((3 & (v_chunk_bits >> 0)))); + v_p0 = ((v_p0 & 511) + 16); + v_chunk_count -= 1; + } + } else { + v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7) / 8); + v_chunk_count = wuffs_base__u32__min(v_chunk_count, 64); + while ((v_chunk_count > 0) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4)) { + v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + self->private_data.f_scratch[(v_p0 + 0)] = ((uint8_t)((15 & (v_chunk_bits >> 28)))); + self->private_data.f_scratch[(v_p0 + 1)] = ((uint8_t)((15 & (v_chunk_bits >> 24)))); + self->private_data.f_scratch[(v_p0 + 2)] = ((uint8_t)((15 & (v_chunk_bits >> 20)))); + self->private_data.f_scratch[(v_p0 + 3)] = ((uint8_t)((15 & (v_chunk_bits >> 16)))); + self->private_data.f_scratch[(v_p0 + 4)] = ((uint8_t)((15 & (v_chunk_bits >> 12)))); + self->private_data.f_scratch[(v_p0 + 5)] = ((uint8_t)((15 & (v_chunk_bits >> 8)))); + self->private_data.f_scratch[(v_p0 + 6)] = ((uint8_t)((15 & (v_chunk_bits >> 4)))); + self->private_data.f_scratch[(v_p0 + 7)] = ((uint8_t)((15 & (v_chunk_bits >> 0)))); + v_p0 = ((v_p0 & 511) + 8); + v_chunk_count -= 1; + } + } + v_p0 = wuffs_base__u32__min(v_p0, wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x)); + v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); + if (v_n == 0) { + status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); + goto ok; + } + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)((v_n & 4294967295)))); + } + label__loop__break:; + status = wuffs_base__make_status(NULL); + goto ok; + + ok: + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bmp.decoder.frame_dirty_rect + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_bmp__decoder__frame_dirty_rect( + const wuffs_bmp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + + return wuffs_base__utility__make_rect_ie_u32( + 0, + 0, + self->private_impl.f_width, + self->private_impl.f_height); +} + +// -------- func bmp.decoder.num_animation_loops + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_bmp__decoder__num_animation_loops( + const wuffs_bmp__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + return 0; +} + +// -------- func bmp.decoder.num_decoded_frame_configs + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_bmp__decoder__num_decoded_frame_configs( + const wuffs_bmp__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + if (self->private_impl.f_call_sequence > 32) { + return 1; + } + return 0; +} + +// -------- func bmp.decoder.num_decoded_frames + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_bmp__decoder__num_decoded_frames( + const wuffs_bmp__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + if (self->private_impl.f_call_sequence > 64) { + return 1; + } + return 0; +} + +// -------- func bmp.decoder.restart_frame + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bmp__decoder__restart_frame( + wuffs_bmp__decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + if (self->private_impl.f_call_sequence < 32) { + return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + } + if (a_index != 0) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + self->private_impl.f_call_sequence = 40; + self->private_impl.f_frame_config_io_position = a_io_position; + return wuffs_base__make_status(NULL); +} + +// -------- func bmp.decoder.set_report_metadata + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_bmp__decoder__set_report_metadata( + wuffs_bmp__decoder* self, + uint32_t a_fourcc, + bool a_report) { + return wuffs_base__make_empty_struct(); +} + +// -------- func bmp.decoder.tell_me_more + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bmp__decoder__tell_me_more( + wuffs_bmp__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 4)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_bmp__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_tell_me_more[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func bmp.decoder.do_tell_me_more + +static wuffs_base__status +wuffs_bmp__decoder__do_tell_me_more( + wuffs_bmp__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + if (self->private_impl.f_io_redirect_fourcc <= 1) { + status = wuffs_base__make_status(wuffs_base__error__no_more_information); + goto exit; + } + if (a_minfo != NULL) { + wuffs_base__more_information__set(a_minfo, + 1, + self->private_impl.f_io_redirect_fourcc, + 0, + self->private_impl.f_io_redirect_pos, + 18446744073709551615u); + } + self->private_impl.f_io_redirect_fourcc = 1; + + goto ok; + ok: + goto exit; + exit: + return status; +} + +// -------- func bmp.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_bmp__decoder__workbuf_len( + const wuffs_bmp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__make_range_ii_u64(0, 0); +} + +// -------- func bmp.decoder.read_palette + +static wuffs_base__status +wuffs_bmp__decoder__read_palette( + wuffs_bmp__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_i = 0; + uint32_t v_argb = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_read_palette[0]; + if (coro_susp_point) { + v_i = self->private_data.s_read_palette[0].v_i; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_bitmap_info_len == 12) { + while ((v_i < 256) && (self->private_impl.f_padding >= 3)) { + self->private_impl.f_padding -= 3; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { + t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); + iop_a_src += 3; + } else { + self->private_data.s_read_palette[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_read_palette[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; + if (num_bits_0 == 16) { + t_0 = ((uint32_t)(*scratch)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } + v_argb = t_0; + } + v_argb |= 4278190080; + self->private_data.f_src_palette[((4 * v_i) + 0)] = ((uint8_t)(((v_argb >> 0) & 255))); + self->private_data.f_src_palette[((4 * v_i) + 1)] = ((uint8_t)(((v_argb >> 8) & 255))); + self->private_data.f_src_palette[((4 * v_i) + 2)] = ((uint8_t)(((v_argb >> 16) & 255))); + self->private_data.f_src_palette[((4 * v_i) + 3)] = ((uint8_t)(((v_argb >> 24) & 255))); + v_i += 1; + } + } else { + while ((v_i < 256) && (self->private_impl.f_padding >= 4)) { + self->private_impl.f_padding -= 4; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_read_palette[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_read_palette[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; + if (num_bits_1 == 24) { + t_1 = ((uint32_t)(*scratch)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } + v_argb = t_1; + } + v_argb |= 4278190080; + self->private_data.f_src_palette[((4 * v_i) + 0)] = ((uint8_t)(((v_argb >> 0) & 255))); + self->private_data.f_src_palette[((4 * v_i) + 1)] = ((uint8_t)(((v_argb >> 8) & 255))); + self->private_data.f_src_palette[((4 * v_i) + 2)] = ((uint8_t)(((v_argb >> 16) & 255))); + self->private_data.f_src_palette[((4 * v_i) + 3)] = ((uint8_t)(((v_argb >> 24) & 255))); + v_i += 1; + } + } + while (v_i < 256) { + self->private_data.f_src_palette[((4 * v_i) + 0)] = 0; + self->private_data.f_src_palette[((4 * v_i) + 1)] = 0; + self->private_data.f_src_palette[((4 * v_i) + 2)] = 0; + self->private_data.f_src_palette[((4 * v_i) + 3)] = 255; + v_i += 1; + } + + goto ok; + ok: + self->private_impl.p_read_palette[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_read_palette[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_read_palette[0].v_i = v_i; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bmp.decoder.process_masks + +static wuffs_base__status +wuffs_bmp__decoder__process_masks( + wuffs_bmp__decoder* self) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_i = 0; + uint32_t v_mask = 0; + uint32_t v_n = 0; + + while (v_i < 4) { + v_mask = self->private_impl.f_channel_masks[v_i]; + if (v_mask != 0) { + v_n = 0; + while ((v_mask & 1) == 0) { + v_n += 1; + v_mask >>= 1; + } + self->private_impl.f_channel_shifts[v_i] = ((uint8_t)((v_n & 31))); + v_n = 0; + while ((v_mask & 1) == 1) { + v_n += 1; + v_mask >>= 1; + } + if ((v_mask != 0) || (v_n > 32)) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } + self->private_impl.f_channel_num_bits[v_i] = ((uint8_t)(v_n)); + } else if (v_i != 3) { + status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } + v_i += 1; + } + + goto ok; + ok: + goto exit; + exit: + return status; +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) + +// ---------------- Status Codes Implementations + +const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[] = "#bzip2: bad Huffman code (over-subscribed)"; +const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[] = "#bzip2: bad Huffman code (under-subscribed)"; +const char wuffs_bzip2__error__bad_block_header[] = "#bzip2: bad block header"; +const char wuffs_bzip2__error__bad_block_length[] = "#bzip2: bad block length"; +const char wuffs_bzip2__error__bad_checksum[] = "#bzip2: bad checksum"; +const char wuffs_bzip2__error__bad_header[] = "#bzip2: bad header"; +const char wuffs_bzip2__error__bad_number_of_sections[] = "#bzip2: bad number of sections"; +const char wuffs_bzip2__error__truncated_input[] = "#bzip2: truncated input"; +const char wuffs_bzip2__error__unsupported_block_randomization[] = "#bzip2: unsupported block randomization"; +const char wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state[] = "#bzip2: internal error: inconsistent Huffman decoder state"; + +// ---------------- Private Consts + +static const uint8_t +WUFFS_BZIP2__CLAMP_TO_5[8] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 1, 2, 3, 4, 5, 5, 5, +}; + +static const uint32_t +WUFFS_BZIP2__REV_CRC32_TABLE[256] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 79764919, 159529838, 222504665, 319059676, 398814059, 445009330, 507990021, + 638119352, 583659535, 797628118, 726387553, 890018660, 835552979, 1015980042, 944750013, + 1276238704, 1221641927, 1167319070, 1095957929, 1595256236, 1540665371, 1452775106, 1381403509, + 1780037320, 1859660671, 1671105958, 1733955601, 2031960084, 2111593891, 1889500026, 1952343757, + 2552477408, 2632100695, 2443283854, 2506133561, 2334638140, 2414271883, 2191915858, 2254759653, + 3190512472, 3135915759, 3081330742, 3009969537, 2905550212, 2850959411, 2762807018, 2691435357, + 3560074640, 3505614887, 3719321342, 3648080713, 3342211916, 3287746299, 3467911202, 3396681109, + 4063920168, 4143685023, 4223187782, 4286162673, 3779000052, 3858754371, 3904687514, 3967668269, + 881225847, 809987520, 1023691545, 969234094, 662832811, 591600412, 771767749, 717299826, + 311336399, 374308984, 453813921, 533576470, 25881363, 88864420, 134795389, 214552010, + 2023205639, 2086057648, 1897238633, 1976864222, 1804852699, 1867694188, 1645340341, 1724971778, + 1587496639, 1516133128, 1461550545, 1406951526, 1302016099, 1230646740, 1142491917, 1087903418, + 2896545431, 2825181984, 2770861561, 2716262478, 3215044683, 3143675388, 3055782693, 3001194130, + 2326604591, 2389456536, 2200899649, 2280525302, 2578013683, 2640855108, 2418763421, 2498394922, + 3769900519, 3832873040, 3912640137, 3992402750, 4088425275, 4151408268, 4197601365, 4277358050, + 3334271071, 3263032808, 3476998961, 3422541446, 3585640067, 3514407732, 3694837229, 3640369242, + 1762451694, 1842216281, 1619975040, 1682949687, 2047383090, 2127137669, 1938468188, 2001449195, + 1325665622, 1271206113, 1183200824, 1111960463, 1543535498, 1489069629, 1434599652, 1363369299, + 622672798, 568075817, 748617968, 677256519, 907627842, 853037301, 1067152940, 995781531, + 51762726, 131386257, 177728840, 240578815, 269590778, 349224269, 429104020, 491947555, + 4046411278, 4126034873, 4172115296, 4234965207, 3794477266, 3874110821, 3953728444, 4016571915, + 3609705398, 3555108353, 3735388376, 3664026991, 3290680682, 3236090077, 3449943556, 3378572211, + 3174993278, 3120533705, 3032266256, 2961025959, 2923101090, 2868635157, 2813903052, 2742672763, + 2604032198, 2683796849, 2461293480, 2524268063, 2284983834, 2364738477, 2175806836, 2238787779, + 1569362073, 1498123566, 1409854455, 1355396672, 1317987909, 1246755826, 1192025387, 1137557660, + 2072149281, 2135122070, 1912620623, 1992383480, 1753615357, 1816598090, 1627664531, 1707420964, + 295390185, 358241886, 404320391, 483945776, 43990325, 106832002, 186451547, 266083308, + 932423249, 861060070, 1041341759, 986742920, 613929101, 542559546, 756411363, 701822548, + 3316196985, 3244833742, 3425377559, 3370778784, 3601682597, 3530312978, 3744426955, 3689838204, + 3819031489, 3881883254, 3928223919, 4007849240, 4037393693, 4100235434, 4180117107, 4259748804, + 2310601993, 2373574846, 2151335527, 2231098320, 2596047829, 2659030626, 2470359227, 2550115596, + 2947551409, 2876312838, 2788305887, 2733848168, 3165939309, 3094707162, 3040238851, 2985771188, +}; + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__status +wuffs_bzip2__decoder__do_transform_io( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +static wuffs_base__status +wuffs_bzip2__decoder__prepare_block( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bzip2__decoder__read_code_lengths( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bzip2__decoder__build_huffman_tree( + wuffs_bzip2__decoder* self, + uint32_t a_which); + +static wuffs_base__empty_struct +wuffs_bzip2__decoder__build_huffman_table( + wuffs_bzip2__decoder* self, + uint32_t a_which); + +static wuffs_base__empty_struct +wuffs_bzip2__decoder__invert_bwt( + wuffs_bzip2__decoder* self); + +static wuffs_base__empty_struct +wuffs_bzip2__decoder__flush_fast( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst); + +static wuffs_base__status +wuffs_bzip2__decoder__flush_slow( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst); + +static wuffs_base__status +wuffs_bzip2__decoder__decode_huffman_fast( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_bzip2__decoder__decode_huffman_slow( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + +// ---------------- VTables + +const wuffs_base__io_transformer__func_ptrs +wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer = { + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_bzip2__decoder__set_quirk_enabled), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__io_buffer*, + wuffs_base__slice_u8))(&wuffs_bzip2__decoder__transform_io), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bzip2__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_bzip2__decoder__initialize( + wuffs_bzip2__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = + wuffs_base__io_transformer__vtable_name; + self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = + (const void*)(&wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer); + return wuffs_base__make_status(NULL); +} + +wuffs_bzip2__decoder* +wuffs_bzip2__decoder__alloc() { + wuffs_bzip2__decoder* x = + (wuffs_bzip2__decoder*)(calloc(1, sizeof(wuffs_bzip2__decoder))); + if (!x) { + return NULL; + } + if (wuffs_bzip2__decoder__initialize( + x, sizeof(wuffs_bzip2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_bzip2__decoder() { + return sizeof(wuffs_bzip2__decoder); +} + +// ---------------- Function Implementations + +// -------- func bzip2.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_bzip2__decoder__set_quirk_enabled( + wuffs_bzip2__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + if (a_quirk == 1) { + self->private_impl.f_ignore_checksum = a_enabled; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func bzip2.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_bzip2__decoder__workbuf_len( + const wuffs_bzip2__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__make_range_ii_u64(0, 0); +} + +// -------- func bzip2.decoder.transform_io + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_bzip2__decoder__transform_io( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_bzip2__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_bzip2__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_transform_io[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func bzip2.decoder.do_transform_io + +static wuffs_base__status +wuffs_bzip2__decoder__do_transform_io( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint32_t v_i = 0; + uint64_t v_tag = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + uint32_t v_final_checksum_want = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; + if (coro_susp_point) { + v_i = self->private_data.s_do_transform_io[0].v_i; + v_tag = self->private_data.s_do_transform_io[0].v_tag; + v_final_checksum_want = self->private_data.s_do_transform_io[0].v_final_checksum_want; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c = t_0; + } + if (v_c != 66) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + v_c = t_1; + } + if (v_c != 90) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + v_c = t_2; + } + if (v_c != 104) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; + v_c = t_3; + } + if ((v_c < 49) || (57 < v_c)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); + goto exit; + } + self->private_impl.f_max_incl_block_size = (((uint32_t)((v_c - 48))) * 100000); + while (true) { + v_tag = 0; + v_i = 0; + while (v_i < 48) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_4 = *iop_a_src++; + v_c = t_4; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + v_tag <<= 1; + v_tag |= ((uint64_t)((self->private_impl.f_bits >> 31))); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + if (v_tag == 25779555029136) { + goto label__0__break; + } else if (v_tag != 54156738319193) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + status = wuffs_bzip2__decoder__prepare_block(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_block_size = 0; + self->private_impl.f_decode_huffman_finished = false; + self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[0] & 7)]; + self->private_impl.f_decode_huffman_ticks = 50; + self->private_impl.f_decode_huffman_section = 0; + self->private_impl.f_decode_huffman_run_shift = 0; + while ( ! self->private_impl.f_decode_huffman_finished) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + v_status = wuffs_bzip2__decoder__decode_huffman_fast(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (wuffs_base__status__is_error(&v_status)) { + status = v_status; + goto exit; + } else if (self->private_impl.f_decode_huffman_finished) { + goto label__1__break; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + status = wuffs_bzip2__decoder__decode_huffman_slow(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } + label__1__break:; + wuffs_bzip2__decoder__invert_bwt(self); + self->private_impl.f_block_checksum_have = 4294967295; + if (self->private_impl.f_original_pointer >= self->private_impl.f_block_size) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + self->private_impl.f_flush_pointer = (self->private_data.f_bwt[self->private_impl.f_original_pointer] >> 12); + self->private_impl.f_flush_repeat_count = 0; + self->private_impl.f_flush_prev = 0; + while (self->private_impl.f_block_size > 0) { + wuffs_bzip2__decoder__flush_fast(self, a_dst); + if (self->private_impl.f_block_size <= 0) { + goto label__2__break; + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + status = wuffs_bzip2__decoder__flush_slow(self, a_dst); + if (status.repr) { + goto suspend; + } + } + label__2__break:; + self->private_impl.f_block_checksum_have ^= 4294967295; + if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_block_checksum_have != self->private_impl.f_block_checksum_want)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); + goto exit; + } + self->private_impl.f_final_checksum_have = (self->private_impl.f_block_checksum_have ^ ((self->private_impl.f_final_checksum_have >> 31) | ((uint32_t)(self->private_impl.f_final_checksum_have << 1)))); + } + label__0__break:; + v_final_checksum_want = 0; + v_i = 0; + while (v_i < 32) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_5 = *iop_a_src++; + v_c = t_5; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + v_final_checksum_want <<= 1; + v_final_checksum_want |= (self->private_impl.f_bits >> 31); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_final_checksum_have != v_final_checksum_want)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); + goto exit; + } + + goto ok; + ok: + self->private_impl.p_do_transform_io[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_do_transform_io[0].v_i = v_i; + self->private_data.s_do_transform_io[0].v_tag = v_tag; + self->private_data.s_do_transform_io[0].v_final_checksum_want = v_final_checksum_want; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bzip2.decoder.prepare_block + +static wuffs_base__status +wuffs_bzip2__decoder__prepare_block( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint32_t v_i = 0; + uint32_t v_j = 0; + uint32_t v_selector = 0; + uint32_t v_sel_ff = 0; + uint8_t v_movee = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_prepare_block[0]; + if (coro_susp_point) { + v_i = self->private_data.s_prepare_block[0].v_i; + v_selector = self->private_data.s_prepare_block[0].v_selector; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + self->private_impl.f_block_checksum_want = 0; + v_i = 0; + while (v_i < 32) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c = t_0; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + self->private_impl.f_block_checksum_want <<= 1; + self->private_impl.f_block_checksum_want |= (self->private_impl.f_bits >> 31); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + v_c = t_1; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + if ((self->private_impl.f_bits >> 31) != 0) { + status = wuffs_base__make_status(wuffs_bzip2__error__unsupported_block_randomization); + goto exit; + } + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + self->private_impl.f_original_pointer = 0; + v_i = 0; + while (v_i < 24) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + v_c = t_2; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + self->private_impl.f_original_pointer <<= 1; + self->private_impl.f_original_pointer |= (self->private_impl.f_bits >> 31); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + v_i = 0; + while (v_i < 256) { + self->private_data.f_presence[v_i] = 0; + v_i += 1; + } + v_i = 0; + while (v_i < 256) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; + v_c = t_3; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + if ((self->private_impl.f_bits >> 31) != 0) { + self->private_data.f_presence[v_i] = 1; + } + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 16; + } + self->private_data.f_scratch = 0; + v_i = 0; + label__0__continue:; + while (v_i < 256) { + if (self->private_data.f_presence[v_i] == 0) { + v_i += 16; + goto label__0__continue; + } + while (true) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_4 = *iop_a_src++; + v_c = t_4; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + self->private_data.f_scratch += (self->private_impl.f_bits >> 31); + self->private_data.f_presence[(v_i & 255)] = ((uint8_t)((self->private_impl.f_bits >> 31))); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + if ((v_i & 15) == 0) { + goto label__1__break; + } + } + label__1__break:; + } + if ((self->private_data.f_scratch < 1) || (256 < self->private_data.f_scratch)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } + self->private_impl.f_num_symbols = (self->private_data.f_scratch + 2); + self->private_data.f_scratch = 0; + v_i = 0; + while (v_i < 3) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_5 = *iop_a_src++; + v_c = t_5; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + self->private_data.f_scratch <<= 1; + self->private_data.f_scratch |= (self->private_impl.f_bits >> 31); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + if ((self->private_data.f_scratch < 2) || (6 < self->private_data.f_scratch)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } + self->private_impl.f_num_huffman_codes = self->private_data.f_scratch; + self->private_data.f_scratch = 0; + v_i = 0; + while (v_i < 15) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_6 = *iop_a_src++; + v_c = t_6; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + self->private_data.f_scratch <<= 1; + self->private_data.f_scratch |= (self->private_impl.f_bits >> 31); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + if ((self->private_data.f_scratch < 1) || (18001 < self->private_data.f_scratch)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } + self->private_impl.f_num_sections = self->private_data.f_scratch; + v_i = 0; + while (v_i < self->private_impl.f_num_huffman_codes) { + self->private_data.f_mtft[v_i] = ((uint8_t)(v_i)); + v_i += 1; + } + v_i = 0; + while (v_i < self->private_impl.f_num_sections) { + v_selector = 0; + while (true) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_7 = *iop_a_src++; + v_c = t_7; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + if ((self->private_impl.f_bits >> 31) == 0) { + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + goto label__2__break; + } + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_selector += 1; + if (v_selector >= self->private_impl.f_num_huffman_codes) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } + } + label__2__break:; + if (v_selector == 0) { + self->private_data.f_huffman_selectors[v_i] = self->private_data.f_mtft[0]; + } else { + v_sel_ff = (v_selector & 255); + v_movee = self->private_data.f_mtft[v_sel_ff]; + wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1 + v_sel_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_sel_ff)); + self->private_data.f_mtft[0] = v_movee; + self->private_data.f_huffman_selectors[v_i] = v_movee; + } + v_i += 1; + } + v_i = 0; + while (v_i < self->private_impl.f_num_huffman_codes) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + status = wuffs_bzip2__decoder__read_code_lengths(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + v_status = wuffs_bzip2__decoder__build_huffman_tree(self, v_i); + if (wuffs_base__status__is_error(&v_status)) { + status = v_status; + goto exit; + } + wuffs_bzip2__decoder__build_huffman_table(self, v_i); + v_i += 1; + } + v_i = 0; + v_j = 0; + while (v_i < 256) { + if (self->private_data.f_presence[v_i] != 0) { + self->private_data.f_mtft[(v_j & 255)] = ((uint8_t)(v_i)); + v_j += 1; + } + v_i += 1; + } + v_i = 0; + while (v_i < 256) { + self->private_data.f_letter_counts[v_i] = 0; + v_i += 1; + } + + goto ok; + ok: + self->private_impl.p_prepare_block[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_prepare_block[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_prepare_block[0].v_i = v_i; + self->private_data.s_prepare_block[0].v_selector = v_selector; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bzip2.decoder.read_code_lengths + +static wuffs_base__status +wuffs_bzip2__decoder__read_code_lengths( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint32_t v_i = 0; + uint32_t v_code_length = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_read_code_lengths[0]; + if (coro_susp_point) { + v_i = self->private_data.s_read_code_lengths[0].v_i; + v_code_length = self->private_data.s_read_code_lengths[0].v_code_length; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + self->private_impl.f_code_lengths_bitmask = 0; + v_i = 0; + while (v_i < 5) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c = t_0; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + v_code_length <<= 1; + v_code_length |= (self->private_impl.f_bits >> 31); + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + v_i += 1; + } + v_i = 0; + while (v_i < self->private_impl.f_num_symbols) { + while (true) { + if ((v_code_length < 1) || (20 < v_code_length)) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + v_c = t_1; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + if ((self->private_impl.f_bits >> 31) == 0) { + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + goto label__0__break; + } + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + v_c = t_2; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + if ((self->private_impl.f_bits >> 31) == 0) { + v_code_length += 1; + } else { + v_code_length -= 1; + } + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + } + label__0__break:; + self->private_impl.f_code_lengths_bitmask |= (((uint32_t)(1)) << (v_code_length & 31)); + self->private_data.f_bwt[v_i] = v_code_length; + v_i += 1; + } + + goto ok; + ok: + self->private_impl.p_read_code_lengths[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_read_code_lengths[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_read_code_lengths[0].v_i = v_i; + self->private_data.s_read_code_lengths[0].v_code_length = v_code_length; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bzip2.decoder.build_huffman_tree + +static wuffs_base__status +wuffs_bzip2__decoder__build_huffman_tree( + wuffs_bzip2__decoder* self, + uint32_t a_which) { + uint32_t v_code_length = 0; + uint32_t v_symbol_index = 0; + uint32_t v_num_branch_nodes = 0; + uint32_t v_stack_height = 0; + uint32_t v_stack_values[21] = {0}; + uint32_t v_node_index = 0; + uint16_t v_leaf_value = 0; + + self->private_data.f_huffman_trees[a_which][0][0] = 0; + self->private_data.f_huffman_trees[a_which][0][1] = 0; + v_num_branch_nodes = 1; + v_stack_height = 1; + v_stack_values[0] = 0; + v_code_length = 1; + label__0__continue:; + while (v_code_length <= 20) { + if ((self->private_impl.f_code_lengths_bitmask & (((uint32_t)(1)) << v_code_length)) == 0) { + v_code_length += 1; + goto label__0__continue; + } + v_symbol_index = 0; + label__1__continue:; + while (v_symbol_index < self->private_impl.f_num_symbols) { + if (self->private_data.f_bwt[v_symbol_index] != v_code_length) { + v_symbol_index += 1; + goto label__1__continue; + } + while (true) { + if (v_stack_height <= 0) { + return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_over_subscribed); + } else if (v_stack_height >= v_code_length) { + goto label__2__break; + } + v_node_index = v_stack_values[(v_stack_height - 1)]; + if (self->private_data.f_huffman_trees[a_which][v_node_index][0] == 0) { + self->private_data.f_huffman_trees[a_which][v_node_index][0] = ((uint16_t)(v_num_branch_nodes)); + } else { + self->private_data.f_huffman_trees[a_which][v_node_index][1] = ((uint16_t)(v_num_branch_nodes)); + } + if (v_num_branch_nodes >= 257) { + return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); + } + v_stack_values[v_stack_height] = v_num_branch_nodes; + self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][0] = 0; + self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][1] = 0; + v_num_branch_nodes += 1; + v_stack_height += 1; + } + label__2__break:; + v_node_index = v_stack_values[(v_stack_height - 1)]; + if (v_symbol_index < 2) { + v_leaf_value = ((uint16_t)((769 + v_symbol_index))); + } else if ((v_symbol_index + 1) < self->private_impl.f_num_symbols) { + v_leaf_value = ((uint16_t)((511 + v_symbol_index))); + } else { + v_leaf_value = 768; + } + if (self->private_data.f_huffman_trees[a_which][v_node_index][0] == 0) { + self->private_data.f_huffman_trees[a_which][v_node_index][0] = v_leaf_value; + } else { + self->private_data.f_huffman_trees[a_which][v_node_index][1] = v_leaf_value; + v_stack_height -= 1; + while (v_stack_height > 0) { + v_node_index = v_stack_values[(v_stack_height - 1)]; + if (self->private_data.f_huffman_trees[a_which][v_node_index][1] == 0) { + goto label__3__break; + } + v_stack_height -= 1; + } + label__3__break:; + } + v_symbol_index += 1; + } + v_code_length += 1; + } + if (v_stack_height != 0) { + return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); + } + return wuffs_base__make_status(NULL); +} + +// -------- func bzip2.decoder.build_huffman_table + +static wuffs_base__empty_struct +wuffs_bzip2__decoder__build_huffman_table( + wuffs_bzip2__decoder* self, + uint32_t a_which) { + uint32_t v_i = 0; + uint32_t v_bits = 0; + uint16_t v_n_bits = 0; + uint16_t v_child = 0; + + while (v_i < 256) { + v_bits = (v_i << 24); + v_n_bits = 0; + v_child = 0; + while ((v_child < 257) && (v_n_bits < 8)) { + v_child = self->private_data.f_huffman_trees[a_which][v_child][(v_bits >> 31)]; + v_bits <<= 1; +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + v_n_bits += 1; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } + self->private_data.f_huffman_tables[a_which][v_i] = ((uint16_t)((v_child | (v_n_bits << 12)))); + v_i += 1; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func bzip2.decoder.invert_bwt + +static wuffs_base__empty_struct +wuffs_bzip2__decoder__invert_bwt( + wuffs_bzip2__decoder* self) { + uint32_t v_i = 0; + uint32_t v_letter = 0; + uint32_t v_sum = 0; + uint32_t v_old_sum = 0; + + v_sum = 0; + v_i = 0; + while (v_i < 256) { + v_old_sum = v_sum; + v_sum += self->private_data.f_letter_counts[v_i]; + self->private_data.f_letter_counts[v_i] = v_old_sum; + v_i += 1; + } + v_i = 0; + while (v_i < self->private_impl.f_block_size) { + v_letter = (self->private_data.f_bwt[v_i] & 255); + self->private_data.f_bwt[(self->private_data.f_letter_counts[v_letter] & 1048575)] |= (v_i << 12); + self->private_data.f_letter_counts[v_letter] += 1; + v_i += 1; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func bzip2.decoder.flush_fast + +static wuffs_base__empty_struct +wuffs_bzip2__decoder__flush_fast( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst) { + uint32_t v_flush_pointer = 0; + uint32_t v_flush_repeat_count = 0; + uint8_t v_flush_prev = 0; + uint32_t v_block_checksum_have = 0; + uint32_t v_block_size = 0; + uint32_t v_entry = 0; + uint8_t v_curr = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + + v_flush_pointer = self->private_impl.f_flush_pointer; + v_flush_repeat_count = self->private_impl.f_flush_repeat_count; + v_flush_prev = self->private_impl.f_flush_prev; + v_block_checksum_have = self->private_impl.f_block_checksum_have; + v_block_size = self->private_impl.f_block_size; + while ((v_block_size > 0) && (((uint64_t)(io2_a_dst - iop_a_dst)) >= 255)) { + if (v_flush_repeat_count < 4) { + v_entry = self->private_data.f_bwt[v_flush_pointer]; + v_curr = ((uint8_t)((v_entry & 255))); + v_flush_pointer = (v_entry >> 12); + if (v_curr == v_flush_prev) { + v_flush_repeat_count += 1; + } else { + v_flush_repeat_count = 1; + } + v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24))) ^ v_curr)] ^ ((uint32_t)(v_block_checksum_have << 8))); + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_curr), iop_a_dst += 1); + v_flush_prev = v_curr; + v_block_size -= 1; + } else { + v_entry = self->private_data.f_bwt[v_flush_pointer]; + v_curr = ((uint8_t)((v_entry & 255))); + v_flush_pointer = (v_entry >> 12); + v_flush_repeat_count = ((uint32_t)(v_curr)); + while (v_flush_repeat_count > 0) { + v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24))) ^ v_flush_prev)] ^ ((uint32_t)(v_block_checksum_have << 8))); + if (((uint64_t)(io2_a_dst - iop_a_dst)) > 0) { + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_flush_prev), iop_a_dst += 1); + } + v_flush_repeat_count -= 1; + } + v_flush_repeat_count = 0; + v_flush_prev = v_curr; + v_block_size -= 1; + } + } + self->private_impl.f_flush_pointer = v_flush_pointer; + self->private_impl.f_flush_repeat_count = v_flush_repeat_count; + self->private_impl.f_flush_prev = v_flush_prev; + self->private_impl.f_block_checksum_have = v_block_checksum_have; + if (v_block_size <= 900000) { + self->private_impl.f_block_size = v_block_size; + } + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + + return wuffs_base__make_empty_struct(); +} + +// -------- func bzip2.decoder.flush_slow + +static wuffs_base__status +wuffs_bzip2__decoder__flush_slow( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_flush_pointer = 0; + uint32_t v_flush_repeat_count = 0; + uint8_t v_flush_prev = 0; + uint32_t v_block_checksum_have = 0; + uint32_t v_block_size = 0; + uint32_t v_entry = 0; + uint8_t v_curr = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + + uint32_t coro_susp_point = self->private_impl.p_flush_slow[0]; + if (coro_susp_point) { + v_flush_pointer = self->private_data.s_flush_slow[0].v_flush_pointer; + v_flush_repeat_count = self->private_data.s_flush_slow[0].v_flush_repeat_count; + v_flush_prev = self->private_data.s_flush_slow[0].v_flush_prev; + v_block_checksum_have = self->private_data.s_flush_slow[0].v_block_checksum_have; + v_block_size = self->private_data.s_flush_slow[0].v_block_size; + v_curr = self->private_data.s_flush_slow[0].v_curr; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + v_flush_pointer = self->private_impl.f_flush_pointer; + v_flush_repeat_count = self->private_impl.f_flush_repeat_count; + v_flush_prev = self->private_impl.f_flush_prev; + v_block_checksum_have = self->private_impl.f_block_checksum_have; + v_block_size = self->private_impl.f_block_size; + while ((v_block_size > 0) && ! (self->private_impl.p_flush_slow[0] != 0)) { + if (v_flush_repeat_count < 4) { + v_entry = self->private_data.f_bwt[v_flush_pointer]; + v_curr = ((uint8_t)((v_entry & 255))); + v_flush_pointer = (v_entry >> 12); + if (v_curr == v_flush_prev) { + v_flush_repeat_count += 1; + } else { + v_flush_repeat_count = 1; + } + v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24))) ^ v_curr)] ^ ((uint32_t)(v_block_checksum_have << 8))); + self->private_data.s_flush_slow[0].scratch = v_curr; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (iop_a_dst == io2_a_dst) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + goto suspend; + } + *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow[0].scratch)); + v_flush_prev = v_curr; + v_block_size -= 1; + } else { + v_entry = self->private_data.f_bwt[v_flush_pointer]; + v_curr = ((uint8_t)((v_entry & 255))); + v_flush_pointer = (v_entry >> 12); + v_flush_repeat_count = ((uint32_t)(v_curr)); + while (v_flush_repeat_count > 0) { + v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24))) ^ v_flush_prev)] ^ ((uint32_t)(v_block_checksum_have << 8))); + self->private_data.s_flush_slow[0].scratch = v_flush_prev; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (iop_a_dst == io2_a_dst) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + goto suspend; + } + *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow[0].scratch)); + v_flush_repeat_count -= 1; + } + v_flush_repeat_count = 0; + v_flush_prev = v_curr; + v_block_size -= 1; + } + } + self->private_impl.f_flush_pointer = v_flush_pointer; + self->private_impl.f_flush_repeat_count = v_flush_repeat_count; + self->private_impl.f_flush_prev = v_flush_prev; + self->private_impl.f_block_checksum_have = v_block_checksum_have; + if (v_block_size <= 900000) { + self->private_impl.f_block_size = v_block_size; + } + + goto ok; + ok: + self->private_impl.p_flush_slow[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_flush_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_flush_slow[0].v_flush_pointer = v_flush_pointer; + self->private_data.s_flush_slow[0].v_flush_repeat_count = v_flush_repeat_count; + self->private_data.s_flush_slow[0].v_flush_prev = v_flush_prev; + self->private_data.s_flush_slow[0].v_block_checksum_have = v_block_checksum_have; + self->private_data.s_flush_slow[0].v_block_size = v_block_size; + self->private_data.s_flush_slow[0].v_curr = v_curr; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + + return status; +} + +// -------- func bzip2.decoder.decode_huffman_fast + +static wuffs_base__status +wuffs_bzip2__decoder__decode_huffman_fast( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_bits = 0; + uint32_t v_n_bits = 0; + uint32_t v_block_size = 0; + uint8_t v_which = 0; + uint32_t v_ticks = 0; + uint32_t v_section = 0; + uint32_t v_run_shift = 0; + uint16_t v_table_entry = 0; + uint16_t v_child = 0; + uint32_t v_child_ff = 0; + uint32_t v_i = 0; + uint32_t v_j = 0; + uint32_t v_output = 0; + uint32_t v_run = 0; + uint32_t v_mtft0 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + v_bits = self->private_impl.f_bits; + v_n_bits = self->private_impl.f_n_bits; + v_block_size = self->private_impl.f_block_size; + v_which = self->private_impl.f_decode_huffman_which; + v_ticks = self->private_impl.f_decode_huffman_ticks; + v_section = self->private_impl.f_decode_huffman_section; + v_run_shift = self->private_impl.f_decode_huffman_run_shift; + label__outer__continue:; + while (((uint64_t)(io2_a_src - iop_a_src)) >= 4) { + if (v_ticks > 0) { + v_ticks -= 1; + } else { + v_ticks = 49; + v_section += 1; + if (v_section >= self->private_impl.f_num_sections) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); + goto exit; + } + v_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[(v_section & 32767)] & 7)]; + } + v_bits |= (wuffs_base__peek_u32be__no_bounds_check(iop_a_src) >> v_n_bits); + iop_a_src += ((31 - v_n_bits) >> 3); + v_n_bits |= 24; + v_table_entry = self->private_data.f_huffman_tables[v_which][(v_bits >> 24)]; + v_bits <<= (v_table_entry >> 12); + v_n_bits -= ((uint32_t)((v_table_entry >> 12))); + v_child = (v_table_entry & 1023); + while (v_child < 257) { + v_child = self->private_data.f_huffman_trees[v_which][v_child][(v_bits >> 31)]; + v_bits <<= 1; + if (v_n_bits <= 0) { + status = wuffs_base__make_status(wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + v_n_bits -= 1; + } + if (v_child < 768) { + v_child_ff = ((uint32_t)((v_child & 255))); + v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); + wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1 + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); + self->private_data.f_mtft[0] = ((uint8_t)(v_output)); + self->private_data.f_letter_counts[v_output] += 1; + self->private_data.f_bwt[v_block_size] = v_output; + if (v_block_size >= self->private_impl.f_max_incl_block_size) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + v_block_size += 1; + v_run_shift = 0; + goto label__outer__continue; + } else if (v_child == 768) { + self->private_impl.f_decode_huffman_finished = true; + goto label__outer__break; + } + if (v_run_shift >= 23) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + v_run = ((((uint32_t)(v_child)) & 3) << v_run_shift); + v_run_shift += 1; + v_i = v_block_size; + v_j = (v_run + v_block_size); + if (v_j > self->private_impl.f_max_incl_block_size) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + v_block_size = v_j; + v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0])); + self->private_data.f_letter_counts[v_mtft0] += v_run; + while (v_i < v_j) { + self->private_data.f_bwt[v_i] = v_mtft0; + v_i += 1; + } + } + label__outer__break:; + self->private_impl.f_bits = v_bits; + self->private_impl.f_n_bits = v_n_bits; + self->private_impl.f_block_size = v_block_size; + self->private_impl.f_decode_huffman_which = v_which; + self->private_impl.f_decode_huffman_ticks = v_ticks; + self->private_impl.f_decode_huffman_section = v_section; + self->private_impl.f_decode_huffman_run_shift = v_run_shift; + status = wuffs_base__make_status(NULL); + goto ok; + + ok: + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func bzip2.decoder.decode_huffman_slow + +static wuffs_base__status +wuffs_bzip2__decoder__decode_huffman_slow( + wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint32_t v_node_index = 0; + uint16_t v_child = 0; + uint32_t v_child_ff = 0; + uint32_t v_i = 0; + uint32_t v_j = 0; + uint32_t v_output = 0; + uint32_t v_run = 0; + uint32_t v_mtft0 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow[0]; + if (coro_susp_point) { + v_node_index = self->private_data.s_decode_huffman_slow[0].v_node_index; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while ( ! (self->private_impl.p_decode_huffman_slow[0] != 0)) { + if (self->private_impl.f_decode_huffman_ticks > 0) { + self->private_impl.f_decode_huffman_ticks -= 1; + } else { + self->private_impl.f_decode_huffman_ticks = 49; + self->private_impl.f_decode_huffman_section += 1; + if (self->private_impl.f_decode_huffman_section >= self->private_impl.f_num_sections) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); + goto exit; + } + self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[(self->private_impl.f_decode_huffman_section & 32767)] & 7)]; + } + v_node_index = 0; + label__0__continue:; + while (true) { + if (self->private_impl.f_n_bits <= 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c = t_0; + } + self->private_impl.f_bits = (((uint32_t)(v_c)) << 24); + self->private_impl.f_n_bits = 8; + } + v_child = self->private_data.f_huffman_trees[self->private_impl.f_decode_huffman_which][v_node_index][(self->private_impl.f_bits >> 31)]; + self->private_impl.f_bits <<= 1; + self->private_impl.f_n_bits -= 1; + if (v_child < 257) { + v_node_index = ((uint32_t)(v_child)); + goto label__0__continue; + } else if (v_child < 768) { + v_child_ff = ((uint32_t)((v_child & 255))); + v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); + wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1 + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); + self->private_data.f_mtft[0] = ((uint8_t)(v_output)); + self->private_data.f_letter_counts[v_output] += 1; + self->private_data.f_bwt[self->private_impl.f_block_size] = v_output; + if (self->private_impl.f_block_size >= self->private_impl.f_max_incl_block_size) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + self->private_impl.f_block_size += 1; + self->private_impl.f_decode_huffman_run_shift = 0; + goto label__0__break; + } else if (v_child == 768) { + self->private_impl.f_decode_huffman_finished = true; + goto label__outer__break; + } + if (self->private_impl.f_decode_huffman_run_shift >= 23) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + v_run = ((((uint32_t)(v_child)) & 3) << self->private_impl.f_decode_huffman_run_shift); + self->private_impl.f_decode_huffman_run_shift += 1; + v_i = self->private_impl.f_block_size; + v_j = (v_run + self->private_impl.f_block_size); + if (v_j > self->private_impl.f_max_incl_block_size) { + status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } + self->private_impl.f_block_size = v_j; + v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0])); + self->private_data.f_letter_counts[v_mtft0] += v_run; + while (v_i < v_j) { + self->private_data.f_bwt[v_i] = v_mtft0; + v_i += 1; + } + goto label__0__break; + } + label__0__break:; + } + label__outer__break:; + + goto ok; + ok: + self->private_impl.p_decode_huffman_slow[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_huffman_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_decode_huffman_slow[0].v_node_index = v_node_index; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) + +// ---------------- Status Codes Implementations + +const char wuffs_cbor__error__bad_input[] = "#cbor: bad input"; +const char wuffs_cbor__error__unsupported_recursion_depth[] = "#cbor: unsupported recursion depth"; +const char wuffs_cbor__error__internal_error_inconsistent_i_o[] = "#cbor: internal error: inconsistent I/O"; +const char wuffs_cbor__error__internal_error_inconsistent_token_length[] = "#cbor: internal error: inconsistent token length"; + +// ---------------- Private Consts + +static const uint32_t +WUFFS_CBOR__LITERALS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { + 8388612, 8388616, 8388610, 8388609, +}; + +static const uint8_t +WUFFS_CBOR__TOKEN_LENGTHS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 5, 9, 0, 0, 0, 1, +}; + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +// ---------------- VTables + +const wuffs_base__token_decoder__func_ptrs +wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder = { + (wuffs_base__status(*)(void*, + wuffs_base__token_buffer*, + wuffs_base__io_buffer*, + wuffs_base__slice_u8))(&wuffs_cbor__decoder__decode_tokens), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_cbor__decoder__set_quirk_enabled), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_cbor__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_cbor__decoder__initialize( + wuffs_cbor__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = + wuffs_base__token_decoder__vtable_name; + self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = + (const void*)(&wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder); + return wuffs_base__make_status(NULL); +} + +wuffs_cbor__decoder* +wuffs_cbor__decoder__alloc() { + wuffs_cbor__decoder* x = + (wuffs_cbor__decoder*)(calloc(1, sizeof(wuffs_cbor__decoder))); + if (!x) { + return NULL; + } + if (wuffs_cbor__decoder__initialize( + x, sizeof(wuffs_cbor__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_cbor__decoder() { + return sizeof(wuffs_cbor__decoder); +} + +// ---------------- Function Implementations + +// -------- func cbor.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_cbor__decoder__set_quirk_enabled( + wuffs_cbor__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__make_empty_struct(); +} + +// -------- func cbor.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_cbor__decoder__workbuf_len( + const wuffs_cbor__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__empty_range_ii_u64(); +} + +// -------- func cbor.decoder.decode_tokens + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_cbor__decoder__decode_tokens( + wuffs_cbor__decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint64_t v_string_length = 0; + uint64_t v_n64 = 0; + uint32_t v_depth = 0; + uint32_t v_stack_byte = 0; + uint32_t v_stack_bit = 0; + uint32_t v_stack_val = 0; + uint32_t v_token_length = 0; + uint32_t v_vminor = 0; + uint32_t v_vminor_alt = 0; + uint32_t v_continued = 0; + uint8_t v_c = 0; + uint8_t v_c_major = 0; + uint8_t v_c_minor = 0; + bool v_tagged = false; + uint8_t v_indefinite_string_major_type = 0; + + wuffs_base__token* iop_a_dst = NULL; + wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_tokens[0]; + if (coro_susp_point) { + v_string_length = self->private_data.s_decode_tokens[0].v_string_length; + v_depth = self->private_data.s_decode_tokens[0].v_depth; + v_tagged = self->private_data.s_decode_tokens[0].v_tagged; + v_indefinite_string_major_type = self->private_data.s_decode_tokens[0].v_indefinite_string_major_type; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_end_of_data) { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + label__outer__continue:; + while (true) { + while (true) { + while (true) { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + goto label__outer__continue; + } + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_cbor__error__bad_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + goto label__outer__continue; + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + if ((v_indefinite_string_major_type != 0) && (v_indefinite_string_major_type != (v_c >> 5))) { + if (v_c != 255) { + status = wuffs_base__make_status(wuffs_cbor__error__bad_input); + goto exit; + } + v_vminor = 4194560; + if (v_indefinite_string_major_type == 3) { + v_vminor |= 19; + } + v_indefinite_string_major_type = 0; + iop_a_src += 1; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } + iop_a_src += 1; + v_c_major = ((uint8_t)((v_c >> 5))); + v_c_minor = (v_c & 31); + if (v_c_minor < 24) { + v_string_length = ((uint64_t)(v_c_minor)); + } else { + while (true) { + if (v_c_minor == 24) { + if (((uint64_t)(io2_a_src - iop_a_src)) >= 1) { + v_string_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); + iop_a_src += 1; + goto label__goto_have_string_length__break; + } + } else if (v_c_minor == 25) { + if (((uint64_t)(io2_a_src - iop_a_src)) >= 2) { + v_string_length = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); + iop_a_src += 2; + goto label__goto_have_string_length__break; + } + } else if (v_c_minor == 26) { + if (((uint64_t)(io2_a_src - iop_a_src)) >= 4) { + v_string_length = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); + iop_a_src += 4; + goto label__goto_have_string_length__break; + } + } else if (v_c_minor == 27) { + if (((uint64_t)(io2_a_src - iop_a_src)) >= 8) { + v_string_length = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); + iop_a_src += 8; + goto label__goto_have_string_length__break; + } + } else { + v_string_length = 0; + goto label__goto_have_string_length__break; + } + if (iop_a_src > io1_a_src) { + iop_a_src--; + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_cbor__error__bad_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + goto label__outer__continue; + } + status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); + goto exit; + } + label__goto_have_string_length__break:; + } + if (v_c_major == 0) { + if (v_c_minor < 26) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((14680064 | ((uint32_t)((v_string_length & 65535)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } else if (v_c_minor < 28) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((14680064 | ((uint32_t)((v_string_length >> 46)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + *iop_a_dst++ = wuffs_base__make_token( + (~(v_string_length & 70368744177663) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } + } else if (v_c_major == 1) { + if (v_c_minor < 26) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((12582912 | (2097151 - ((uint32_t)((v_string_length & 65535))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } else if (v_c_minor < 28) { + if (v_string_length < 9223372036854775808u) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((12582912 | (2097151 - ((uint32_t)((v_string_length >> 46))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + *iop_a_dst++ = wuffs_base__make_token( + (~((18446744073709551615u - v_string_length) & 70368744177663) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } else { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(787997)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | + (((uint64_t)(16777216)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(9)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } + goto label__goto_parsed_a_leaf_value__break; + } + } else if (v_c_major == 2) { + if (v_c_minor < 28) { + if (v_string_length == 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194560)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194560)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } else if (v_c_minor == 31) { + if (v_indefinite_string_major_type != 0) { + goto label__goto_fail__break; + } + v_indefinite_string_major_type = 2; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194560)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__outer__continue; + } else { + goto label__goto_fail__break; + } + label__0__continue:; + while (true) { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); + goto label__0__continue; + } + v_n64 = wuffs_base__u64__min(v_string_length, ((uint64_t)(io2_a_src - iop_a_src))); + v_token_length = ((uint32_t)((v_n64 & 65535))); + if (v_n64 > 65535) { + v_token_length = 65535; + } else if (v_token_length <= 0) { + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_cbor__error__bad_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + goto label__0__continue; + } + if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { + status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); + goto exit; + } + v_string_length -= ((uint64_t)(v_token_length)); + v_continued = 0; + if ((v_string_length > 0) || (v_indefinite_string_major_type > 0)) { + v_continued = 1; + } + iop_a_src += v_token_length; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194816)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + if (v_string_length > 0) { + goto label__0__continue; + } else if (v_indefinite_string_major_type > 0) { + goto label__outer__continue; + } + goto label__goto_parsed_a_leaf_value__break; + } + } else if (v_c_major == 3) { + if (v_c_minor < 28) { + if (v_string_length == 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194579)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194579)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } else if (v_c_minor == 31) { + if (v_indefinite_string_major_type != 0) { + goto label__goto_fail__break; + } + v_indefinite_string_major_type = 3; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194579)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__outer__continue; + } else { + goto label__goto_fail__break; + } + label__1__continue:; + while (true) { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); + goto label__1__continue; + } + v_n64 = wuffs_base__u64__min(v_string_length, 65535); + v_n64 = ((uint64_t)(wuffs_base__utf_8__longest_valid_prefix(iop_a_src, + ((size_t)(wuffs_base__u64__min(((uint64_t)(io2_a_src - iop_a_src)), v_n64)))))); + v_token_length = ((uint32_t)((v_n64 & 65535))); + if (v_token_length <= 0) { + if ((a_src && a_src->meta.closed) || (((uint64_t)(io2_a_src - iop_a_src)) >= 4)) { + status = wuffs_base__make_status(wuffs_cbor__error__bad_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); + goto label__1__continue; + } + if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { + status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); + goto exit; + } + v_string_length -= ((uint64_t)(v_token_length)); + v_continued = 0; + if ((v_string_length > 0) || (v_indefinite_string_major_type > 0)) { + v_continued = 1; + } + iop_a_src += v_token_length; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + if (v_string_length > 0) { + goto label__1__continue; + } else if (v_indefinite_string_major_type > 0) { + goto label__outer__continue; + } + goto label__goto_parsed_a_leaf_value__break; + } + } else if (v_c_major == 4) { + if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0) { + goto label__goto_fail__break; + } else if (v_depth >= 1024) { + v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); + while ((v_token_length > 0) && (iop_a_src > io1_a_src)) { + iop_a_src--; + v_token_length -= 1; + } + status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); + goto exit; + } + v_vminor = 2105361; + v_vminor_alt = 2101282; + if (v_depth > 0) { + v_stack_byte = ((v_depth - 1) / 16); + v_stack_bit = (((v_depth - 1) & 15) * 2); + if (0 == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1)) << v_stack_bit))) { + v_vminor = 2105377; + v_vminor_alt = 2105378; + } else { + v_vminor = 2105409; + v_vminor_alt = 2113570; + } + } + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + if (v_c_minor == 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } + v_stack_byte = (v_depth / 16); + v_stack_bit = ((v_depth & 15) * 2); + self->private_data.f_stack[v_stack_byte] &= (4294967295 ^ (((uint32_t)(3)) << v_stack_bit)); + self->private_data.f_container_num_remaining[v_depth] = v_string_length; + v_depth += 1; + v_tagged = false; + goto label__outer__continue; + } else if (v_c_major == 5) { + if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0) { + goto label__goto_fail__break; + } else if (v_depth >= 1024) { + v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); + while ((v_token_length > 0) && (iop_a_src > io1_a_src)) { + iop_a_src--; + v_token_length -= 1; + } + status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); + goto exit; + } + v_vminor = 2113553; + v_vminor_alt = 2101314; + if (v_depth > 0) { + v_stack_byte = ((v_depth - 1) / 16); + v_stack_bit = (((v_depth - 1) & 15) * 2); + if (0 == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1)) << v_stack_bit))) { + v_vminor = 2113569; + v_vminor_alt = 2105410; + } else { + v_vminor = 2113601; + v_vminor_alt = 2113602; + } + } + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + if (v_c_minor == 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } + v_stack_byte = (v_depth / 16); + v_stack_bit = ((v_depth & 15) * 2); + self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(3)) << v_stack_bit); + self->private_data.f_container_num_remaining[v_depth] = v_string_length; + v_depth += 1; + v_tagged = false; + goto label__outer__continue; + } else if (v_c_major == 6) { + if (v_c_minor >= 28) { + goto label__goto_fail__break; + } + if (v_string_length < 262144) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(787997)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | + (((uint64_t)((4194304 | ((uint32_t)(v_string_length))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } else { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(787997)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | + (((uint64_t)((4194304 | ((uint32_t)((v_string_length >> 46)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + *iop_a_dst++ = wuffs_base__make_token( + (~(v_string_length & 70368744177663) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } + v_tagged = true; + goto label__outer__continue; + } else if (v_c_major == 7) { + if (v_c_minor < 20) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(787997)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | + (((uint64_t)((8388608 | ((uint32_t)((v_string_length & 255)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } else if (v_c_minor < 24) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(WUFFS_CBOR__LITERALS[(v_c_minor & 3)])) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } else if (v_c_minor == 24) { + if (v_string_length < 24) { + if ( ! (iop_a_src > io1_a_src)) { + status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); + goto exit; + } + iop_a_src--; + goto label__goto_fail__break; + } + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(787997)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | + (((uint64_t)((8388608 | ((uint32_t)((v_string_length & 255)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(2)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } else if (v_c_minor < 28) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(10490113)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } else if (v_c_minor == 31) { + if (v_tagged || (v_depth <= 0)) { + goto label__goto_fail__break; + } + v_depth -= 1; + if (self->private_data.f_container_num_remaining[v_depth] != 0) { + goto label__goto_fail__break; + } + v_stack_byte = (v_depth / 16); + v_stack_bit = ((v_depth & 15) * 2); + v_stack_val = (3 & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit)); + if (v_stack_val == 1) { + goto label__goto_fail__break; + } + if (v_stack_val != 3) { + v_vminor_alt = 2097186; + } else { + v_vminor_alt = 2097218; + } + if (v_depth <= 0) { + v_vminor_alt |= 4096; + } else { + v_stack_byte = ((v_depth - 1) / 16); + v_stack_bit = (((v_depth - 1) & 15) * 2); + if (0 == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1)) << v_stack_bit))) { + v_vminor_alt |= 8192; + } else { + v_vminor_alt |= 16384; + } + } + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__goto_parsed_a_leaf_value__break; + } + } + goto label__goto_fail__break; + } + label__goto_fail__break:; + if (iop_a_src > io1_a_src) { + iop_a_src--; + status = wuffs_base__make_status(wuffs_cbor__error__bad_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); + goto exit; + } + label__goto_parsed_a_leaf_value__break:; + v_tagged = false; + while (v_depth > 0) { + v_stack_byte = ((v_depth - 1) / 16); + v_stack_bit = (((v_depth - 1) & 15) * 2); + self->private_data.f_stack[v_stack_byte] ^= (((uint32_t)(1)) << (v_stack_bit + 1)); + if (1 == (3 & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit))) { + goto label__outer__continue; + } + if (self->private_data.f_container_num_remaining[(v_depth - 1)] <= 0) { + goto label__outer__continue; + } + self->private_data.f_container_num_remaining[(v_depth - 1)] -= 1; + if (self->private_data.f_container_num_remaining[(v_depth - 1)] > 0) { + goto label__outer__continue; + } + label__2__continue:; + while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); + goto label__2__continue; + } + v_depth -= 1; + v_stack_byte = (v_depth / 16); + v_stack_bit = ((v_depth & 15) * 2); + if (0 == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1)) << v_stack_bit))) { + v_vminor_alt = 2097186; + } else { + v_vminor_alt = 2097218; + } + if (v_depth <= 0) { + v_vminor_alt |= 4096; + } else { + v_stack_byte = ((v_depth - 1) / 16); + v_stack_bit = (((v_depth - 1) & 15) * 2); + if (0 == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1)) << v_stack_bit))) { + v_vminor_alt |= 8192; + } else { + v_vminor_alt |= 16384; + } + } + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } + goto label__outer__break; + } + label__outer__break:; + self->private_impl.f_end_of_data = true; + + ok: + self->private_impl.p_decode_tokens[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_tokens[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + self->private_data.s_decode_tokens[0].v_string_length = v_string_length; + self->private_data.s_decode_tokens[0].v_depth = v_depth; + self->private_data.s_decode_tokens[0].v_tagged = v_tagged; + self->private_data.s_decode_tokens[0].v_indefinite_string_major_type = v_indefinite_string_major_type; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) + +// ---------------- Status Codes Implementations + +// ---------------- Private Consts + +static const uint32_t +WUFFS_CRC32__IEEE_TABLE[16][256] WUFFS_BASE__POTENTIALLY_UNUSED = { + { + 0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, + 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, + 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, + 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, + 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, + 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, + 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, + 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, + 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, + 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, + 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, + 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, + 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, + 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, + 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, + 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, + 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, + 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, + 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, + 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, + 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, + 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, + 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, + 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, + 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, + 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, + 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, + 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, + 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, + 2932959818, 3654703836, 1088359270, 936918000, 2847714899, 3736837829, 1202900863, 817233897, + 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, + 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117, + }, { + 0, 421212481, 842424962, 724390851, 1684849924, 2105013317, 1448781702, 1329698503, + 3369699848, 3519200073, 4210026634, 3824474571, 2897563404, 3048111693, 2659397006, 2274893007, + 1254232657, 1406739216, 2029285587, 1643069842, 783210325, 934667796, 479770071, 92505238, + 2182846553, 2600511768, 2955803355, 2838940570, 3866582365, 4285295644, 3561045983, 3445231262, + 2508465314, 2359236067, 2813478432, 3198777185, 4058571174, 3908292839, 3286139684, 3670389349, + 1566420650, 1145479147, 1869335592, 1987116393, 959540142, 539646703, 185010476, 303839341, + 3745920755, 3327985586, 3983561841, 4100678960, 3140154359, 2721170102, 2300350837, 2416418868, + 396344571, 243568058, 631889529, 1018359608, 1945336319, 1793607870, 1103436669, 1490954812, + 4034481925, 3915546180, 3259968903, 3679722694, 2484439553, 2366552896, 2787371139, 3208174018, + 950060301, 565965900, 177645455, 328046286, 1556873225, 1171730760, 1861902987, 2011255754, + 3132841300, 2745199637, 2290958294, 2442530455, 3738671184, 3352078609, 3974232786, 4126854035, + 1919080284, 1803150877, 1079293406, 1498383519, 370020952, 253043481, 607678682, 1025720731, + 1711106983, 2095471334, 1472923941, 1322268772, 26324643, 411738082, 866634785, 717028704, + 2904875439, 3024081134, 2668790573, 2248782444, 3376948395, 3495106026, 4219356713, 3798300520, + 792689142, 908347575, 487136116, 68299317, 1263779058, 1380486579, 2036719216, 1618931505, + 3890672638, 4278043327, 3587215740, 3435896893, 2206873338, 2593195963, 2981909624, 2829542713, + 998479947, 580430090, 162921161, 279890824, 1609522511, 1190423566, 1842954189, 1958874764, + 4082766403, 3930137346, 3245109441, 3631694208, 2536953671, 2385372678, 2768287173, 3155920004, + 1900120602, 1750776667, 1131931800, 1517083097, 355290910, 204897887, 656092572, 1040194781, + 3113746450, 2692952403, 2343461520, 2461357009, 3723805974, 3304059991, 4022511508, 4141455061, + 2919742697, 3072101800, 2620513899, 2234183466, 3396041197, 3547351212, 4166851439, 3779471918, + 1725839073, 2143618976, 1424512099, 1307796770, 45282277, 464110244, 813994343, 698327078, + 3838160568, 4259225593, 3606301754, 3488152955, 2158586812, 2578602749, 2996767038, 2877569151, + 740041904, 889656817, 506086962, 120682355, 1215357364, 1366020341, 2051441462, 1667084919, + 3422213966, 3538019855, 4190942668, 3772220557, 2945847882, 3062702859, 2644537544, 2226864521, + 52649286, 439905287, 823476164, 672009861, 1733269570, 2119477507, 1434057408, 1281543041, + 2167981343, 2552493150, 3004082077, 2853541596, 3847487515, 4233048410, 3613549209, 3464057816, + 1239502615, 1358593622, 2077699477, 1657543892, 764250643, 882293586, 532408465, 111204816, + 1585378284, 1197851309, 1816695150, 1968414767, 974272232, 587794345, 136598634, 289367339, + 2527558116, 2411481253, 2760973158, 3179948583, 4073438432, 3956313505, 3237863010, 3655790371, + 347922877, 229101820, 646611775, 1066513022, 1892689081, 1774917112, 1122387515, 1543337850, + 3697634229, 3313392372, 3998419255, 4148705398, 3087642289, 2702352368, 2319436851, 2468674930, + }, { + 0, 29518391, 59036782, 38190681, 118073564, 114017003, 76381362, 89069189, + 236147128, 265370511, 228034006, 206958561, 152762724, 148411219, 178138378, 190596925, + 472294256, 501532999, 530741022, 509615401, 456068012, 451764635, 413917122, 426358261, + 305525448, 334993663, 296822438, 275991697, 356276756, 352202787, 381193850, 393929805, + 944588512, 965684439, 1003065998, 973863097, 1061482044, 1049003019, 1019230802, 1023561829, + 912136024, 933002607, 903529270, 874031361, 827834244, 815125939, 852716522, 856752605, + 611050896, 631869351, 669987326, 640506825, 593644876, 580921211, 551983394, 556069653, + 712553512, 733666847, 704405574, 675154545, 762387700, 749958851, 787859610, 792175277, + 1889177024, 1901651959, 1931368878, 1927033753, 2006131996, 1985040171, 1947726194, 1976933189, + 2122964088, 2135668303, 2098006038, 2093965857, 2038461604, 2017599123, 2047123658, 2076625661, + 1824272048, 1836991623, 1866005214, 1861914857, 1807058540, 1786244187, 1748062722, 1777547317, + 1655668488, 1668093247, 1630251878, 1625932113, 1705433044, 1684323811, 1713505210, 1742760333, + 1222101792, 1226154263, 1263738702, 1251046777, 1339974652, 1310460363, 1281013650, 1301863845, + 1187289752, 1191637167, 1161842422, 1149379777, 1103966788, 1074747507, 1112139306, 1133218845, + 1425107024, 1429406311, 1467333694, 1454888457, 1408811148, 1379576507, 1350309090, 1371438805, + 1524775400, 1528845279, 1499917702, 1487177649, 1575719220, 1546255107, 1584350554, 1605185389, + 3778354048, 3774312887, 3803303918, 3816007129, 3862737756, 3892238699, 3854067506, 3833203973, + 4012263992, 4007927823, 3970080342, 3982554209, 3895452388, 3924658387, 3953866378, 3932773565, + 4245928176, 4241609415, 4271336606, 4283762345, 4196012076, 4225268251, 4187931714, 4166823541, + 4076923208, 4072833919, 4035198246, 4047918865, 4094247316, 4123732899, 4153251322, 4132437965, + 3648544096, 3636082519, 3673983246, 3678331705, 3732010428, 3753090955, 3723829714, 3694611429, + 3614117080, 3601426159, 3572488374, 3576541825, 3496125444, 3516976691, 3555094634, 3525581405, + 3311336976, 3298595879, 3336186494, 3340255305, 3260503756, 3281337595, 3251864226, 3222399125, + 3410866088, 3398419871, 3368647622, 3372945905, 3427010420, 3448139075, 3485520666, 3456284973, + 2444203584, 2423127159, 2452308526, 2481530905, 2527477404, 2539934891, 2502093554, 2497740997, + 2679949304, 2659102159, 2620920726, 2650438049, 2562027300, 2574714131, 2603727690, 2599670141, + 2374579504, 2353749767, 2383274334, 2412743529, 2323684844, 2336421851, 2298759554, 2294686645, + 2207933576, 2186809023, 2149495014, 2178734801, 2224278612, 2236720739, 2266437690, 2262135309, + 2850214048, 2820717207, 2858812622, 2879680249, 2934667388, 2938704459, 2909776914, 2897069605, + 2817622296, 2788420399, 2759153014, 2780249921, 2700618180, 2704950259, 2742877610, 2730399645, + 3049550800, 3020298727, 3057690558, 3078802825, 2999835404, 3004150075, 2974355298, 2961925461, + 3151438440, 3121956959, 3092510214, 3113327665, 3168701108, 3172786307, 3210370778, 3197646061, + }, { + 0, 3099354981, 2852767883, 313896942, 2405603159, 937357362, 627793884, 2648127673, + 3316918511, 2097696650, 1874714724, 3607201537, 1255587768, 4067088605, 3772741427, 1482887254, + 1343838111, 3903140090, 4195393300, 1118632049, 3749429448, 1741137837, 1970407491, 3452858150, + 2511175536, 756094997, 1067759611, 2266550430, 449832999, 2725482306, 2965774508, 142231497, + 2687676222, 412010587, 171665333, 2995192016, 793786473, 2548850444, 2237264098, 1038456711, + 1703315409, 3711623348, 3482275674, 1999841343, 3940814982, 1381529571, 1089329165, 4166106984, + 4029413537, 1217896388, 1512189994, 3802027855, 2135519222, 3354724499, 3577784189, 1845280792, + 899665998, 2367928107, 2677414085, 657096608, 3137160985, 37822588, 284462994, 2823350519, + 2601801789, 598228824, 824021174, 2309093331, 343330666, 2898962447, 3195996129, 113467524, + 1587572946, 3860600759, 4104763481, 1276501820, 3519211397, 1769898208, 2076913422, 3279374443, + 3406630818, 1941006535, 1627703081, 3652755532, 1148164341, 4241751952, 3999682686, 1457141531, + 247015245, 3053797416, 2763059142, 470583459, 2178658330, 963106687, 735213713, 2473467892, + 992409347, 2207944806, 2435792776, 697522413, 3024379988, 217581361, 508405983, 2800865210, + 4271038444, 1177467017, 1419450215, 3962007554, 1911572667, 3377213406, 3690561584, 1665525589, + 1799331996, 3548628985, 3241568279, 2039091058, 3831314379, 1558270126, 1314193216, 4142438437, + 2928380019, 372764438, 75645176, 3158189981, 568925988, 2572515393, 2346768303, 861712586, + 3982079547, 1441124702, 1196457648, 4293663189, 1648042348, 3666298377, 3358779879, 1888390786, + 686661332, 2421291441, 2196002399, 978858298, 2811169155, 523464422, 226935048, 3040519789, + 3175145892, 100435649, 390670639, 2952089162, 841119475, 2325614998, 2553003640, 546822429, + 2029308235, 3225988654, 3539796416, 1782671013, 4153826844, 1328167289, 1570739863, 3844338162, + 1298864389, 4124540512, 3882013070, 1608431339, 3255406162, 2058742071, 1744848601, 3501990332, + 2296328682, 811816591, 584513889, 2590678532, 129869501, 3204563416, 2914283062, 352848211, + 494030490, 2781751807, 3078325777, 264757620, 2450577869, 715964072, 941166918, 2158327331, + 3636881013, 1618608400, 1926213374, 3396585883, 1470427426, 4011365959, 4255988137, 1158766284, + 1984818694, 3471935843, 3695453837, 1693991400, 4180638033, 1100160564, 1395044826, 3952793279, + 3019491049, 189112716, 435162722, 2706139399, 1016811966, 2217162459, 2526189877, 774831696, + 643086745, 2666061564, 2354934034, 887166583, 2838900430, 294275499, 54519365, 3145957664, + 3823145334, 1532818963, 1240029693, 4048895640, 1820460577, 3560857924, 3331051178, 2117577167, + 3598663992, 1858283101, 2088143283, 3301633750, 1495127663, 3785470218, 4078182116, 1269332353, + 332098007, 2876706482, 3116540252, 25085497, 2628386432, 605395429, 916469259, 2384220526, + 2254837415, 1054503362, 745528876, 2496903497, 151290352, 2981684885, 2735556987, 464596510, + 1137851976, 4218313005, 3923506883, 1365741990, 3434129695, 1946996346, 1723425172, 3724871409, + }, { + 0, 1029712304, 2059424608, 1201699536, 4118849216, 3370159984, 2403399072, 2988497936, + 812665793, 219177585, 1253054625, 2010132753, 3320900865, 4170237105, 3207642721, 2186319825, + 1625331586, 1568718386, 438355170, 658566482, 2506109250, 2818578674, 4020265506, 3535817618, + 1351670851, 1844508147, 709922595, 389064339, 2769320579, 2557498163, 3754961379, 3803185235, + 3250663172, 4238411444, 3137436772, 2254525908, 876710340, 153198708, 1317132964, 1944187668, + 4054934725, 3436268917, 2339452837, 3054575125, 70369797, 961670069, 2129760613, 1133623509, + 2703341702, 2621542710, 3689016294, 3867263574, 1419845190, 1774270454, 778128678, 318858390, + 2438067015, 2888948471, 3952189479, 3606153623, 1691440519, 1504803895, 504432359, 594620247, + 1492342857, 1704161785, 573770537, 525542041, 2910060169, 2417219385, 3618876905, 3939730521, + 1753420680, 1440954936, 306397416, 790849880, 2634265928, 2690882808, 3888375336, 3668168600, + 940822475, 91481723, 1121164459, 2142483739, 3448989963, 4042473659, 3075684971, 2318603227, + 140739594, 889433530, 1923340138, 1338244826, 4259521226, 3229813626, 2267247018, 3124975642, + 2570221389, 2756861693, 3824297005, 3734113693, 1823658381, 1372780605, 376603373, 722643805, + 2839690380, 2485261628, 3548540908, 4007806556, 1556257356, 1638052860, 637716780, 459464860, + 4191346895, 3300051327, 2199040943, 3195181599, 206718479, 825388991, 1989285231, 1274166495, + 3382881038, 4106388158, 3009607790, 2382549470, 1008864718, 21111934, 1189240494, 2072147742, + 2984685714, 2357631266, 3408323570, 4131834434, 1147541074, 2030452706, 1051084082, 63335554, + 2174155603, 3170292451, 4216760371, 3325460867, 1947622803, 1232499747, 248909555, 867575619, + 3506841360, 3966111392, 2881909872, 2527485376, 612794832, 434546784, 1581699760, 1663499008, + 3782634705, 3692447073, 2612412337, 2799048193, 351717905, 697754529, 1849071985, 1398190273, + 1881644950, 1296545318, 182963446, 931652934, 2242328918, 3100053734, 4284967478, 3255255942, + 1079497815, 2100821479, 983009079, 133672583, 3050795671, 2293717799, 3474399735, 4067887175, + 281479188, 765927844, 1778867060, 1466397380, 3846680276, 3626469220, 2676489652, 2733102084, + 548881365, 500656741, 1517752501, 1729575173, 3577210133, 3898068133, 2952246901, 2459410373, + 3910527195, 3564487019, 2480257979, 2931134987, 479546907, 569730987, 1716854139, 1530213579, + 3647316762, 3825568426, 2745561210, 2663766474, 753206746, 293940330, 1445287610, 1799716618, + 2314567513, 3029685993, 4080348217, 3461678473, 2088098201, 1091956777, 112560889, 1003856713, + 3112514712, 2229607720, 3276105720, 4263857736, 1275433560, 1902492648, 918929720, 195422344, + 685033439, 364179055, 1377080511, 1869921551, 3713294623, 3761522863, 2811507327, 2599689167, + 413436958, 633644462, 1650777982, 1594160846, 3978570462, 3494118254, 2548332990, 2860797966, + 1211387997, 1968470509, 854852413, 261368461, 3182753437, 2161434413, 3346310653, 4195650637, + 2017729436, 1160000044, 42223868, 1071931724, 2378480988, 2963576044, 4144295484, 3395602316, + }, { + 0, 3411858341, 1304994059, 2257875630, 2609988118, 1355649459, 3596215069, 486879416, + 3964895853, 655315400, 2711298918, 1791488195, 2009251963, 3164476382, 973758832, 4048990933, + 64357019, 3364540734, 1310630800, 2235723829, 2554806413, 1394316072, 3582976390, 517157411, + 4018503926, 618222419, 2722963965, 1762783832, 1947517664, 3209171269, 970744811, 4068520014, + 128714038, 3438335635, 1248109629, 2167961496, 2621261600, 1466012805, 3522553387, 447296910, + 3959392091, 547575038, 2788632144, 1835791861, 1886307661, 3140622056, 1034314822, 4143626211, + 75106221, 3475428360, 1236444838, 2196665603, 2682996155, 1421317662, 3525567664, 427767573, + 3895035328, 594892389, 2782995659, 1857943406, 1941489622, 3101955187, 1047553757, 4113347960, + 257428076, 3288652233, 1116777319, 2311878850, 2496219258, 1603640287, 3640781169, 308099796, + 3809183745, 676813732, 2932025610, 1704983215, 2023410199, 3016104370, 894593820, 4262377657, + 210634999, 3352484690, 1095150076, 2316991065, 2535410401, 1547934020, 3671583722, 294336591, + 3772615322, 729897279, 2903845777, 1716123700, 2068629644, 2953845545, 914647431, 4258839074, + 150212442, 3282623743, 1161604689, 2388688372, 2472889676, 1480171241, 3735940167, 368132066, + 3836185911, 805002898, 2842635324, 1647574937, 2134298401, 3026852996, 855535146, 4188192143, + 186781121, 3229539940, 1189784778, 2377547631, 2427670487, 1542429810, 3715886812, 371670393, + 3882979244, 741170185, 2864262823, 1642462466, 2095107514, 3082559007, 824732849, 4201955092, + 514856152, 3589064573, 1400419795, 2552522358, 2233554638, 1316849003, 3370776517, 62202976, + 4075001525, 968836368, 3207280574, 1954014235, 1769133219, 2720925446, 616199592, 4024870413, + 493229635, 3594175974, 1353627464, 2616354029, 2264355925, 1303087088, 3409966430, 6498043, + 4046820398, 979978123, 3170710821, 2007099008, 1789187640, 2717386141, 661419827, 3962610838, + 421269998, 3527459403, 1423225061, 2676515648, 2190300152, 1238466653, 3477467891, 68755798, + 4115633027, 1041448998, 3095868040, 1943789869, 1860096405, 2776760880, 588673182, 3897205563, + 449450869, 3516317904, 1459794558, 2623431131, 2170245475, 1242006214, 3432247400, 131015629, + 4137259288, 1036337853, 3142660115, 1879958454, 1829294862, 2790523051, 549483013, 3952910752, + 300424884, 3669282065, 1545650111, 2541513754, 2323209378, 1092980487, 3350330793, 216870412, + 4256931033, 921128828, 2960342482, 2066738807, 1714085583, 2910195050, 736264132, 3770592353, + 306060335, 3647131530, 1610005796, 2494197377, 2309971513, 1123257756, 3295149874, 255536279, + 4268596802, 892423655, 3013951305, 2029645036, 1711070292, 2929725425, 674528607, 3815288570, + 373562242, 3709388839, 1535949449, 2429577516, 2379569556, 1183418929, 3223189663, 188820282, + 4195850735, 827017802, 3084859620, 2089020225, 1636228089, 2866415708, 743340786, 3876759895, + 361896217, 3738094268, 1482340370, 2466671543, 2382584591, 1163888810, 3284924932, 144124321, + 4190215028, 849168593, 3020503679, 2136336858, 1649465698, 2836138695, 798521449, 3838094284, + }, { + 0, 2792819636, 2543784233, 837294749, 4098827283, 1379413927, 1674589498, 3316072078, + 871321191, 2509784531, 2758827854, 34034938, 3349178996, 1641505216, 1346337629, 4131942633, + 1742642382, 3249117050, 4030828007, 1446413907, 2475800797, 904311657, 68069876, 2725880384, + 1412551337, 4064729373, 3283010432, 1708771380, 2692675258, 101317902, 937551763, 2442587175, + 3485284764, 1774858792, 1478633653, 4266992385, 1005723023, 2642744891, 2892827814, 169477906, + 4233263099, 1512406095, 1808623314, 3451546982, 136139752, 2926205020, 2676114113, 972376437, + 2825102674, 236236518, 1073525883, 2576072655, 1546420545, 4200303349, 3417542760, 1841601500, + 2609703733, 1039917185, 202635804, 2858742184, 1875103526, 3384067218, 4166835727, 1579931067, + 1141601657, 3799809741, 3549717584, 1977839588, 2957267306, 372464350, 668680259, 2175552503, + 2011446046, 3516084394, 3766168119, 1175200131, 2209029901, 635180217, 338955812, 2990736784, + 601221559, 2242044419, 3024812190, 306049834, 3617246628, 1911408144, 1074125965, 3866285881, + 272279504, 3058543716, 2275784441, 567459149, 3832906691, 1107462263, 1944752874, 3583875422, + 2343980261, 767641425, 472473036, 3126744696, 2147051766, 3649987394, 3899029983, 1309766251, + 3092841090, 506333494, 801510315, 2310084639, 1276520081, 3932237093, 3683203000, 2113813516, + 3966292011, 1243601823, 2079834370, 3716205238, 405271608, 3192979340, 2411259153, 701492901, + 3750207052, 2045810168, 1209569125, 4000285905, 734575199, 2378150379, 3159862134, 438345922, + 2283203314, 778166598, 529136603, 3120492655, 2086260449, 3660498261, 3955679176, 1303499900, + 3153699989, 495890209, 744928700, 2316418568, 1337360518, 3921775410, 3626602927, 2120129051, + 4022892092, 1237286280, 2018993941, 3726666913, 461853231, 3186645403, 2350400262, 711936178, + 3693557851, 2052076527, 1270360434, 3989775046, 677911624, 2384402428, 3220639073, 427820757, + 1202443118, 3789347034, 3493118535, 1984154099, 3018127229, 362020041, 612099668, 2181885408, + 1950653705, 3526596285, 3822816288, 1168934804, 2148251930, 645706414, 395618355, 2984485767, + 544559008, 2248295444, 3085590153, 295523645, 3560598451, 1917673479, 1134918298, 3855773998, + 328860103, 3052210803, 2214924526, 577903450, 3889505748, 1101147744, 1883911421, 3594338121, + 3424493451, 1785369663, 1535282850, 4260726038, 944946072, 2653270060, 2949491377, 163225861, + 4294103532, 1501944408, 1752023237, 3457862513, 196998655, 2915761739, 2619532502, 978710370, + 2881684293, 229902577, 1012666988, 2586515928, 1603020630, 4193987810, 3356702335, 1852063179, + 2553040162, 1046169238, 263412747, 2848217023, 1818454321, 3390333573, 4227627032, 1569420204, + 60859927, 2782375331, 2487203646, 843627658, 4159668740, 1368951216, 1617990445, 3322386585, + 810543216, 2520310724, 2815490393, 27783917, 3288386659, 1652017111, 1402985802, 4125677310, + 1685994201, 3255382381, 4091620336, 1435902020, 2419138250, 910562686, 128847843, 2715354199, + 1469150398, 4058414858, 3222168983, 1719234083, 2749255853, 94984985, 876691844, 2453031472, + }, { + 0, 3433693342, 1109723005, 2391738339, 2219446010, 1222643300, 3329165703, 180685081, + 3555007413, 525277995, 2445286600, 1567235158, 1471092047, 2600801745, 361370162, 3642757804, + 2092642603, 2953916853, 1050555990, 4063508168, 4176560081, 878395215, 3134470316, 1987983410, + 2942184094, 1676945920, 3984272867, 567356797, 722740324, 3887998202, 1764827929, 2778407815, + 4185285206, 903635656, 3142804779, 2012833205, 2101111980, 2979425330, 1058630609, 4088621903, + 714308067, 3862526333, 1756790430, 2753330688, 2933487385, 1651734407, 3975966820, 542535930, + 2244825981, 1231508451, 3353891840, 188896414, 25648519, 3442302233, 1134713594, 2399689316, + 1445480648, 2592229462, 336416693, 3634843435, 3529655858, 516441772, 2420588879, 1559052753, + 698204909, 3845636723, 1807271312, 2803025166, 2916600855, 1635634313, 4025666410, 593021940, + 4202223960, 919787974, 3093159461, 1962401467, 2117261218, 2996361020, 1008193759, 4038971457, + 1428616134, 2576151384, 386135227, 3685348389, 3513580860, 499580322, 2471098945, 1608776415, + 2260985971, 1248454893, 3303468814, 139259792, 42591881, 3458459159, 1085071860, 2349261162, + 3505103035, 474062885, 2463016902, 1583654744, 1419882049, 2550902495, 377792828, 3660491170, + 51297038, 3483679632, 1093385331, 2374089965, 2269427188, 1273935210, 3311514249, 164344343, + 2890961296, 1627033870, 4000683757, 585078387, 672833386, 3836780532, 1782552599, 2794821769, + 2142603813, 3005188795, 1032883544, 4047146438, 4227826911, 928351297, 3118105506, 1970307900, + 1396409818, 2677114180, 287212199, 3719594553, 3614542624, 467372990, 2505346141, 1509854403, + 2162073199, 1282711281, 3271268626, 240228748, 76845205, 3359543307, 1186043880, 2317064054, + 796964081, 3811226735, 1839575948, 2702160658, 2882189835, 1734392469, 3924802934, 625327592, + 4234522436, 818917338, 3191908409, 1927981223, 2016387518, 3028656416, 973776579, 4137723485, + 2857232268, 1726474002, 3899187441, 616751215, 772270454, 3803048424, 1814228491, 2693328533, + 2041117753, 3036871847, 999160644, 4146592730, 4259508931, 826864221, 3217552830, 1936586016, + 3606501031, 442291769, 2496909786, 1484378436, 1388107869, 2652297411, 278519584, 3694387134, + 85183762, 3384397196, 1194773103, 2342308593, 2170143720, 1307820918, 3279733909, 265733131, + 2057717559, 3054258089, 948125770, 4096344276, 4276898253, 843467091, 3167309488, 1885556270, + 2839764098, 1709792284, 3949353983, 667704161, 755585656, 3785577190, 1865176325, 2743489947, + 102594076, 3401021058, 1144549729, 2291298815, 2186770662, 1325234296, 3228729243, 215514885, + 3589828009, 424832311, 2547870420, 1534552650, 1370645331, 2635621325, 328688686, 3745342640, + 2211456353, 1333405183, 3254067740, 224338562, 127544219, 3408931589, 1170156774, 2299866232, + 1345666772, 2627681866, 303053225, 3736746295, 3565105198, 416624816, 2522494803, 1525692365, + 4285207626, 868291796, 3176010551, 1910772649, 2065767088, 3079346734, 956571085, 4121828691, + 747507711, 3760459617, 1856702594, 2717976604, 2831417605, 1684930971, 3940615800, 642451174, + }, + { + 0, 393942083, 787884166, 965557445, 1575768332, 1251427663, 1931114890, 1684106697, + 3151536664, 2896410203, 2502855326, 2186649309, 3862229780, 4048545623, 3368213394, 3753496529, + 2898281073, 3149616690, 2184604407, 2504883892, 4046197629, 3864463166, 3755621371, 3366006712, + 387506281, 6550570, 971950319, 781573292, 1257550181, 1569695014, 1677892067, 1937345952, + 2196865699, 2508887776, 2886183461, 3145514598, 3743273903, 3362179052, 4058774313, 3868258154, + 958996667, 777139448, 400492605, 10755198, 1690661303, 1941857780, 1244879153, 1565019506, + 775012562, 961205393, 13101140, 398261271, 1943900638, 1688634781, 1563146584, 1246801179, + 2515100362, 2190636681, 3139390028, 2892258831, 3355784134, 3749586821, 3874691904, 4052225795, + 3734110983, 3387496260, 4033096577, 3877584834, 2206093835, 2483373640, 2911402637, 3136515790, + 1699389727, 1915860316, 1270647193, 1556585946, 950464531, 803071056, 374397077, 19647702, + 1917993334, 1697207605, 1554278896, 1272937907, 800985210, 952435769, 21510396, 372452543, + 3381322606, 3740399405, 3883715560, 4027047851, 2489758306, 2199758369, 3130039012, 2917895847, + 1550025124, 1259902439, 1922410786, 1710144865, 26202280, 385139947, 796522542, 939715693, + 3887801276, 4039129087, 3377269562, 3728088953, 3126293168, 2905368307, 2493602358, 2212122229, + 4037264341, 3889747862, 3730172755, 3375300368, 2907673305, 3124004506, 2209987167, 2495786524, + 1266377165, 1543533966, 1703758155, 1928748296, 379007169, 32253058, 945887303, 790236164, + 1716846671, 1898845196, 1218652361, 1608006794, 1002000707, 750929152, 357530053, 36990342, + 3717046871, 3405166100, 4084959953, 3825245842, 2153902939, 2535122712, 2929187805, 3119304606, + 3398779454, 3723384445, 3831720632, 4078468859, 2541294386, 2147616625, 3113171892, 2935238647, + 1900929062, 1714877541, 1606142112, 1220599011, 748794154, 1004184937, 39295404, 355241455, + 3835986668, 4091516591, 3394415210, 3710500393, 3108557792, 2922629027, 2545875814, 2160455461, + 1601970420, 1208431799, 1904871538, 1727077425, 43020792, 367748539, 744905086, 991776061, + 1214562461, 1595921630, 1720903707, 1911159896, 361271697, 49513938, 998160663, 738569556, + 4089209477, 3838277318, 3712633347, 3392233024, 2924491657, 3106613194, 2158369551, 2547846988, + 3100050248, 2948339467, 2519804878, 2169126797, 3844821572, 4065347079, 3420289730, 3701894785, + 52404560, 342144275, 770279894, 982687125, 1593045084, 1233708063, 1879431386, 1736363161, + 336019769, 58479994, 988899775, 764050940, 1240141877, 1586496630, 1729968307, 1885744368, + 2950685473, 3097818978, 2166999975, 2522013668, 4063474221, 3846743662, 3703937707, 3418263272, + 976650731, 760059304, 348170605, 62635310, 1742393575, 1889649828, 1227683937, 1582820386, + 2179867635, 2526361520, 2937588597, 3093503798, 3691148031, 3413731004, 4076100217, 3851374138, + 2532754330, 2173556697, 3087067932, 2944139103, 3407516310, 3697379029, 3857496592, 4070026835, + 758014338, 978679233, 64506116, 346250567, 1891774606, 1740186829, 1580472328, 1229917259, + }, { + 0, 4022496062, 83218493, 3946298115, 166436986, 3861498692, 220098631, 3806075769, + 332873972, 4229245898, 388141257, 4175494135, 440197262, 4127099824, 516501683, 4044053389, + 665747944, 3362581206, 593187285, 3432594155, 776282514, 3246869164, 716239279, 3312622225, + 880394524, 3686509090, 814485793, 3746462239, 1033003366, 3528460888, 963096923, 3601193573, + 1331495888, 2694801646, 1269355501, 2758457555, 1186374570, 2843003028, 1111716759, 2910918825, + 1552565028, 3007850522, 1484755737, 3082680359, 1432478558, 3131279456, 1368666979, 3193329757, + 1760789048, 2268195078, 1812353541, 2210675003, 1628971586, 2396670332, 1710092927, 2318375233, + 2066006732, 2498144754, 2144408305, 2417195471, 1926193846, 2634877320, 1983558283, 2583222709, + 2662991776, 1903717534, 2588923805, 1972223139, 2538711002, 2022952164, 2477029351, 2087066841, + 2372749140, 1655647338, 2308478825, 1717238871, 2223433518, 1799654416, 2155034387, 1873894445, + 3105130056, 1456926070, 3185661557, 1378041163, 2969511474, 1597852940, 3020617231, 1539874097, + 2864957116, 1157737858, 2922780289, 1106542015, 2737333958, 1290407416, 2816325371, 1210047941, + 3521578096, 1042640718, 3574781005, 986759027, 3624707082, 936300340, 3707335735, 859512585, + 3257943172, 770846650, 3334837433, 688390023, 3420185854, 605654976, 3475911875, 552361981, + 4132013464, 428600998, 4072428965, 494812827, 4288816610, 274747100, 4216845791, 345349857, + 3852387692, 173846098, 3781891409, 245988975, 3967116566, 62328360, 3900749099, 121822741, + 3859089665, 164061759, 3807435068, 221426178, 4025395579, 2933317, 3944446278, 81334904, + 4124199413, 437265099, 4045904328, 518386422, 4231653775, 335250097, 4174133682, 386814604, + 3249244393, 778691543, 3311294676, 714879978, 3359647891, 662848429, 3434477742, 595039120, + 3531393053, 1035903779, 3599308832, 961245982, 3684132967, 877986649, 3747788890, 815846244, + 2841119441, 1184522735, 2913852140, 1114616274, 2696129195, 1332855189, 2756082326, 1266946472, + 3129952805, 1431118107, 3195705880, 1371074854, 3009735263, 1554415969, 3079748194, 1481855324, + 2398522169, 1630855175, 2315475716, 1707159610, 2266835779, 1759461501, 2213084030, 1814728768, + 2636237773, 1927520499, 2580814832, 1981182158, 2496293815, 2064121993, 2420095882, 2147340468, + 2025787041, 2541577631, 2085281436, 2475210146, 1901375195, 2660681189, 1973518054, 2590184920, + 1801997909, 2225743211, 1872600680, 2153772374, 1652813359, 2369881361, 1719025170, 2310296876, + 1594986313, 2966676599, 1541693300, 3022402634, 1459236659, 3107472397, 1376780046, 3184366640, + 1288097725, 2734990467, 1211309952, 2817619134, 1160605639, 2867791097, 1104723962, 2920993988, + 937561457, 3626001999, 857201996, 3704993394, 1040821515, 3519792693, 989625654, 3577615880, + 607473029, 3421972155, 549494200, 3473077894, 769584639, 3256649409, 690699714, 3337180924, + 273452185, 4287555495, 347692196, 4219156378, 430386403, 4133832669, 491977950, 4069562336, + 60542061, 3965298515, 124656720, 3903616878, 175139863, 3853649705, 243645482, 3779581716, + }, { + 0, 3247366080, 1483520449, 2581751297, 2967040898, 1901571138, 3904227907, 691737987, + 3133399365, 2068659845, 3803142276, 589399876, 169513671, 3415493895, 1383475974, 2482566342, + 2935407819, 1870142219, 4137319690, 924099274, 506443593, 3751897225, 1178799752, 2278412616, + 339027342, 3585866318, 1280941135, 2379694991, 2766951948, 1700956620, 4236308429, 1024339981, + 2258407383, 1192382487, 3740284438, 528411094, 910556245, 4157285269, 1848198548, 2946996820, + 1012887186, 4258378066, 1681119059, 2780629139, 2357599504, 1292419792, 3572147409, 358906641, + 678054684, 3924071644, 1879503581, 2978491677, 2561882270, 1497229150, 3235873119, 22109855, + 2460592729, 1395094937, 3401913240, 189516888, 577821147, 3825075739, 2048679962, 3146956762, + 3595049455, 398902831, 2384764974, 1336573934, 1720805997, 2803873197, 1056822188, 4285729900, + 1821112490, 2902796138, 887570795, 4117339819, 3696397096, 500978920, 2218668777, 1169222953, + 2025774372, 3106931428, 550659301, 3780950821, 3362238118, 166293862, 2416645991, 1367722151, + 3262987361, 66315169, 2584839584, 1537170016, 1923370979, 3005911075, 717813282, 3947244002, + 1356109368, 2438613496, 146288633, 3375820857, 3759007162, 562248314, 3093388411, 2045739963, + 3927406461, 731490493, 2994458300, 1945440636, 1523451135, 2604718911, 44219710, 3274466046, + 4263662323, 1068272947, 2790189874, 1740649714, 1325080945, 2406874801, 379033776, 3608758128, + 1155642294, 2238671990, 479005303, 3708016055, 4097359924, 901128180, 2891217397, 1843045941, + 2011248031, 3060787807, 797805662, 3993195422, 3342353949, 112630237, 2673147868, 1591353372, + 3441611994, 212601626, 2504944923, 1421914843, 2113644376, 3161815192, 630660761, 3826893145, + 3642224980, 412692116, 2172340373, 1089836885, 1775141590, 2822790422, 832715543, 4029474007, + 1674842129, 2723860433, 1001957840, 4197873168, 3540870035, 310623315, 2338445906, 1257178514, + 4051548744, 821257608, 2836464521, 1755307081, 1101318602, 2150241802, 432566283, 3628511179, + 1270766349, 2318435533, 332587724, 3529260300, 4217841807, 988411727, 2735444302, 1652903566, + 1602977411, 2651169091, 132630338, 3328776322, 4015131905, 786223809, 3074340032, 1991273216, + 3846741958, 616972294, 3173262855, 2091579847, 1435626564, 2485072772, 234706309, 3430124101, + 2712218736, 1613231024, 4190475697, 944458353, 292577266, 3506339890, 1226630707, 2291284467, + 459984181, 3672380149, 1124496628, 2189994804, 2880683703, 1782407543, 4091479926, 844224694, + 257943739, 3469817723, 1462980986, 2529005242, 3213269817, 2114471161, 3890881272, 644152632, + 3046902270, 1947391550, 3991973951, 746483711, 88439420, 3301680572, 1563018173, 2628197501, + 657826727, 3871046759, 2136545894, 3201811878, 2548879397, 1449267173, 3481299428, 235845156, + 2650161890, 1551408418, 3315268387, 68429027, 758067552, 3970035360, 1967360161, 3033356129, + 2311284588, 1213053100, 3517963949, 270598509, 958010606, 4170500910, 1635167535, 2700636911, + 855672361, 4069415401, 1802256360, 2866995240, 2212099499, 1113008747, 3686091882, 440112042, + }, { + 0, 2611301487, 3963330207, 2006897392, 50740095, 2560849680, 4013794784, 1956178319, + 101480190, 2645113489, 3929532513, 1905435662, 84561281, 2662269422, 3912356638, 1922342769, + 202960380, 2545787283, 3760419683, 2072395532, 253679235, 2495322860, 3810871324, 2021655667, + 169122562, 2444351341, 3861841309, 2106214898, 152215677, 2461527058, 3844685538, 2123133581, + 405920760, 2207553431, 4094313831, 1873742088, 456646791, 2157096168, 4144791064, 1823027831, + 507358470, 2241388905, 4060492697, 1772322806, 490444409, 2258557462, 4043311334, 1789215881, + 338245124, 2408348267, 4161972379, 1672996084, 388959611, 2357870868, 4212429796, 1622269835, + 304431354, 2306870421, 4263435877, 1706791434, 287538053, 2324051946, 4246267162, 1723705717, + 811841520, 2881944479, 3696765295, 1207788800, 862293135, 2831204576, 3747484176, 1157324415, + 913293582, 2915732833, 3662962577, 1106318334, 896137841, 2932651550, 3646055662, 1123494017, + 1014716940, 2816349795, 3493905555, 1273334012, 1065181555, 2765630748, 3544645612, 1222882179, + 980888818, 2714919069, 3595350637, 1307180546, 963712909, 2731826146, 3578431762, 1324336509, + 676490248, 3019317351, 3295277719, 1607253752, 726947703, 2968591128, 3345992168, 1556776327, + 777919222, 3053147801, 3261432937, 1505806342, 760750473, 3070062054, 3244539670, 1522987897, + 608862708, 3220163995, 3362856811, 1406423812, 659339915, 3169449700, 3413582868, 1355966587, + 575076106, 3118709605, 3464325525, 1440228858, 557894773, 3135602714, 3447411434, 1457397381, + 1623683040, 4217512847, 2365387135, 391757072, 1673614495, 4167309552, 2415577600, 341804655, + 1724586270, 4251866481, 2331019137, 290835438, 1707942497, 4268256782, 2314648830, 307490961, + 1826587164, 4152020595, 2162433155, 457265388, 1876539747, 4101829900, 2212636668, 407333779, + 1792275682, 4051089549, 2263378557, 491595282, 1775619997, 4067460082, 2246988034, 508239213, + 2029433880, 3813931127, 2496473735, 258500328, 2079362919, 3763716872, 2546668024, 208559511, + 2130363110, 3848244873, 2462145657, 157552662, 2113730969, 3864638966, 2445764358, 174205801, + 1961777636, 4014675339, 2564147067, 57707284, 2011718299, 3964481268, 2614361092, 7778411, + 1927425818, 3913769845, 2665066885, 92077546, 1910772837, 3930150922, 2648673018, 108709525, + 1352980496, 3405878399, 3164554895, 658115296, 1403183983, 3355946752, 3214507504, 607924639, + 1453895406, 3440239233, 3130208369, 557218846, 1437504913, 3456883198, 3113552654, 573589345, + 1555838444, 3340335491, 2961681267, 723707676, 1606028947, 3290383100, 3011612684, 673504355, + 1521500946, 3239382909, 3062619533, 758026722, 1505130605, 3256038402, 3045975794, 774417053, + 1217725416, 3543158663, 2762906999, 1057739032, 1267939479, 3493229816, 2812847624, 1007544935, + 1318679830, 3577493881, 2728586121, 956803046, 1302285929, 3594125830, 2711933174, 973184153, + 1150152212, 3743982203, 2830528651, 856898788, 1200346475, 3694041348, 2880457716, 806684571, + 1115789546, 3643069573, 2931426933, 891243034, 1099408277, 3659722746, 2914794762, 907637093, + }, { + 0, 3717650821, 1616688459, 3184159950, 3233376918, 489665299, 2699419613, 2104690264, + 1510200173, 2274691816, 979330598, 3888758691, 2595928571, 1194090622, 4209380528, 661706037, + 3020400346, 1771143007, 3562738577, 164481556, 1958661196, 2837976521, 350386439, 3379863682, + 3993269687, 865250354, 2388181244, 1406015865, 784146209, 4079732388, 1323412074, 2474079215, + 3011398645, 1860735600, 3542286014, 246687547, 1942430051, 2924607718, 328963112, 3456978349, + 3917322392, 887832861, 2300653011, 1421341782, 700772878, 4099025803, 1234716485, 2483986112, + 125431087, 3673109674, 1730500708, 3132326369, 3351283641, 441867836, 2812031730, 2047535991, + 1568292418, 2163009479, 1025936137, 3769651852, 2646824148, 1079348561, 4255113631, 537475098, + 3180171691, 1612400686, 3721471200, 4717925, 2100624189, 2694980280, 493375094, 3237910515, + 3884860102, 974691139, 2278750093, 1514417672, 657926224, 4204917205, 1198234907, 2600289438, + 160053105, 3558665972, 1775665722, 3024116671, 3375586791, 346391650, 2842683564, 1962488105, + 1401545756, 2384412057, 869618007, 3997403346, 2469432970, 1319524111, 4083956673, 788193860, + 250862174, 3546612699, 1856990997, 3006903952, 3461001416, 333211981, 2920678787, 1937824774, + 1425017139, 2305216694, 883735672, 3912918525, 2487837605, 1239398944, 4095071982, 696455019, + 3136584836, 1734518017, 3668494799, 121507914, 2051872274, 2816200599, 437363545, 3347544796, + 3774328809, 1029797484, 2158697122, 1564328743, 542033279, 4258798842, 1074950196, 2642717105, + 2691310871, 2113731730, 3224801372, 497043929, 1624461185, 3175454212, 9435850, 3709412175, + 4201248378, 671035391, 2587181873, 1201904308, 986750188, 3880142185, 1519135143, 2266689570, + 342721485, 3388693064, 1949382278, 2846355203, 3570723163, 155332830, 3028835344, 1763607957, + 1315852448, 2482538789, 775087595, 4087626862, 2396469814, 1396827059, 4002123645, 857560824, + 320106210, 3464673127, 1934154665, 2933785132, 3551331444, 238804465, 3018961215, 1852270778, + 1226292623, 2491507722, 692783300, 4108177729, 2309936921, 1412959900, 3924976210, 879016919, + 2803091512, 2055541181, 3343875443, 450471158, 1739236014, 3124525867, 133568485, 3663777376, + 4245691221, 545702608, 2639048222, 1088059291, 1034514883, 3762268230, 1576387720, 2153979149, + 501724348, 3228659001, 2109407735, 2687359090, 3713981994, 13109167, 3171052385, 1620357860, + 1206151121, 2591211092, 666423962, 4197321503, 2271022407, 1523307714, 3875649548, 982999433, + 2850034278, 1953942499, 3384583981, 338329256, 1767471344, 3033506165, 151375291, 3566408766, + 4091789579, 779425934, 2478797888, 1311354309, 861580189, 4006375960, 1392910038, 2391852883, + 2929327945, 1930372812, 3469036034, 324244359, 1847629279, 3015068762, 243015828, 3555391761, + 4103744548, 688715169, 2496043375, 1229996266, 874727090, 3920994103, 1417671673, 2313759356, + 446585235, 3339223062, 2059594968, 2807313757, 3660002053, 129100416, 3128657486, 1743609803, + 1084066558, 2634765179, 549535669, 4250396208, 2149900392, 1571961325, 3765982499, 1039043750, + }, { + 0, 2635063670, 3782132909, 2086741467, 430739227, 2225303149, 4173482934, 1707977408, + 861478454, 2924937024, 3526875803, 1329085421, 720736557, 3086643291, 3415954816, 1452586230, + 1722956908, 4223524122, 2279405761, 450042295, 2132718455, 3792785921, 2658170842, 58693292, + 1441473114, 3370435372, 3028674295, 696911745, 1279765825, 3511176247, 2905172460, 807831706, + 3445913816, 1349228974, 738901109, 2969918723, 3569940419, 1237784245, 900084590, 2829701656, + 4265436910, 1664255896, 525574723, 2187084597, 3885099509, 2057177219, 117386584, 2616249390, + 2882946228, 920233410, 1253605401, 3619119471, 2994391983, 796207833, 1393823490, 3457937012, + 2559531650, 92322804, 2044829231, 3840835417, 2166609305, 472659183, 1615663412, 4249022530, + 1102706673, 3702920839, 2698457948, 1037619754, 1477802218, 3306854812, 3111894087, 611605809, + 1927342535, 4025419953, 2475568490, 243387420, 1800169180, 4131620778, 2317525617, 388842247, + 655084445, 3120835307, 3328511792, 1533734470, 1051149446, 2745738736, 3754524715, 1120297309, + 340972971, 2304586973, 4114354438, 1748234352, 234773168, 2431761350, 3968900637, 1906278251, + 2363330345, 299003487, 1840466820, 4038896370, 2507210802, 142532932, 1948239007, 3910149609, + 3213136159, 579563625, 1592415666, 3286611140, 2787646980, 992477042, 1195825833, 3662232543, + 3933188933, 2002801203, 184645608, 2517538462, 4089658462, 1858919720, 313391347, 2409765253, + 3644239219, 1144605701, 945318366, 2773977256, 3231326824, 1570095902, 569697989, 3170568115, + 2205413346, 511446676, 1646078799, 4279421497, 2598330617, 131105167, 2075239508, 3871229218, + 2955604436, 757403810, 1363424633, 3427521551, 2844163791, 881434553, 1223211618, 3588709140, + 3854685070, 2026779384, 78583587, 2577462869, 4235025557, 1633861091, 486774840, 2148301134, + 3600338360, 1268198606, 938871061, 2868504675, 3476308643, 1379640277, 777684494, 3008718712, + 1310168890, 3541595724, 2943964055, 846639841, 1471879201, 3400857943, 3067468940, 735723002, + 2102298892, 3762382970, 2619362721, 19901655, 1692534295, 4193118049, 2240594618, 411247564, + 681945942, 3047836192, 3385552891, 1422167693, 822682701, 2886124859, 3496468704, 1298661782, + 469546336, 2264093718, 4203901389, 1738379451, 38812283, 2673859341, 3812556502, 2117148576, + 3268024339, 1606809957, 598006974, 3198893512, 3680933640, 1181316734, 973624229, 2802299603, + 4052944421, 1822222163, 285065864, 2381456382, 3896478014, 1966106696, 156323219, 2489232613, + 2759337087, 964150537, 1159127250, 3625517476, 3184831332, 551242258, 1555722185, 3249901247, + 2535537225, 170842943, 1984954084, 3946848146, 2391651666, 327308324, 1877176831, 4075589769, + 263086283, 2460058045, 4005602406, 1942963472, 369291216, 2332888742, 4151061373, 1784924683, + 1022852861, 2717425547, 3717839440, 1083595558, 626782694, 3092517008, 3291821387, 1497027645, + 1763466407, 4094934481, 2289211402, 360544636, 1890636732, 3988730570, 2447251217, 215086695, + 1514488465, 3343557607, 3140191804, 639919946, 1139395978, 3739626748, 2726758695, 1065936977, + }, { + 0, 3120290792, 2827399569, 293431929, 2323408227, 864534155, 586863858, 2600537882, + 3481914503, 1987188591, 1729068310, 3740575486, 1173727716, 4228805132, 3983743093, 1418249117, + 1147313999, 4254680231, 3974377182, 1428157750, 3458136620, 2011505092, 1721256893, 3747844181, + 2347455432, 839944224, 594403929, 2593536433, 26687147, 3094146371, 2836498234, 283794642, + 2294627998, 826205558, 541298447, 2578994407, 45702141, 3141697557, 2856315500, 331624836, + 1196225049, 4273416689, 4023010184, 1446090848, 3442513786, 1959480466, 1706436331, 3696098563, + 3433538001, 1968994873, 1679888448, 3722103720, 1188807858, 4280295258, 3999102243, 1470541515, + 53374294, 3134568126, 2879970503, 307431215, 2303854645, 816436189, 567589284, 2553242188, + 3405478781, 1929420949, 1652411116, 3682996484, 1082596894, 4185703926, 3892424591, 1375368295, + 91404282, 3163122706, 2918450795, 336584067, 2400113305, 922028401, 663249672, 2658384096, + 2392450098, 929185754, 639587747, 2682555979, 82149713, 3172883129, 2892181696, 362343208, + 1091578037, 4176212829, 3918960932, 1349337804, 3412872662, 1922537022, 1676344391, 3658557359, + 1111377379, 4224032267, 3937989746, 1396912026, 3359776896, 1908013928, 1623494929, 3644803833, + 2377615716, 877417100, 623982837, 2630542109, 130804743, 3190831087, 2941083030, 381060734, + 106748588, 3215393092, 2933549885, 388083925, 2350956495, 903570471, 614862430, 2640172470, + 3386185259, 1882115523, 1632872378, 3634920530, 1135178568, 4199721120, 3945775833, 1389631793, + 1317531835, 4152109907, 3858841898, 1610259138, 3304822232, 2097172016, 1820140617, 3582394273, + 2165193788, 955639764, 696815021, 2423477829, 192043359, 2995356343, 2750736590, 437203750, + 182808564, 3005133852, 2724453989, 462947725, 2157513367, 962777471, 673168134, 2447663342, + 3312231283, 2090301595, 1844056802, 3557935370, 1326499344, 4142603768, 3885397889, 1584245865, + 3326266917, 2142836173, 1858371508, 3611272284, 1279175494, 4123357358, 3837270743, 1564721471, + 164299426, 2955991370, 2706223923, 414607579, 2209834945, 978107433, 724686416, 2462715320, + 2183156074, 1004243586, 715579643, 2472360723, 140260361, 2980573153, 2698675608, 421617264, + 1302961645, 4099032581, 3845074044, 1557460884, 3352688782, 2116952934, 1867729183, 3601371895, + 2222754758, 1032278062, 754596439, 2499928511, 234942117, 3086693709, 2793824052, 528319708, + 1274365761, 4061043881, 3816027856, 1518873912, 3246989858, 2020800970, 1762628531, 3505670235, + 3223196809, 2045103969, 1754834200, 3512958704, 1247965674, 4086934018, 3806642299, 1528765331, + 261609486, 3060532198, 2802936223, 518697591, 2246819181, 1007707781, 762121468, 2492913428, + 213497176, 3041029808, 2755593417, 499441441, 2261110843, 1061030867, 776167850, 2545465922, + 3274734047, 2060165687, 1807140942, 3528266662, 1229724860, 4038575956, 3788156205, 1479636677, + 1222322711, 4045468159, 3764231046, 1504067694, 3265744756, 2069664924, 1780612837, 3554288909, + 2270357136, 1051278712, 802445057, 2519698665, 221152243, 3033880603, 2779263586, 475261322, + }, { + 0, 2926088593, 2275419491, 701019378, 3560000647, 2052709654, 1402038756, 4261017717, + 1930665807, 3715829470, 4105419308, 1524313021, 2804077512, 155861593, 545453739, 2397726522, + 3861331614, 1213181711, 1636244477, 3488582252, 840331801, 2625561480, 3048626042, 467584747, + 2503254481, 995897408, 311723186, 3170637091, 1090907478, 4016929991, 3332753461, 1758288292, + 390036349, 3109546732, 2426363422, 1056427919, 3272488954, 1835443819, 1152258713, 3938878216, + 1680663602, 3393484195, 3817652561, 1306808512, 2954733749, 510998820, 935169494, 2580880455, + 4044899811, 1601229938, 1991794816, 3637571857, 623446372, 2336332021, 2726898695, 216120726, + 2181814956, 744704829, 95158223, 2881711710, 1446680107, 4166125498, 3516576584, 2146575065, + 780072698, 2148951915, 2849952665, 129384968, 4199529085, 1411853292, 2112855838, 3548843663, + 1567451573, 4077254692, 3670887638, 1957027143, 2304517426, 657765539, 251396177, 2694091200, + 3361327204, 1714510325, 1341779207, 3784408214, 476611811, 2986349938, 2613617024, 899690513, + 3142211371, 354600634, 1021997640, 2458051545, 1870338988, 3239283261, 3906682575, 1186180958, + 960597383, 2536053782, 3202459876, 277428597, 3983589632, 1125666961, 1792074851, 3300423154, + 1246892744, 3829039961, 3455203243, 1671079482, 2657312335, 806080478, 432241452, 3081497277, + 3748049689, 1896751752, 1489409658, 4138600427, 190316446, 2772397583, 2365053693, 580864876, + 2893360214, 35503559, 735381813, 2243795108, 2017747153, 3593269568, 4293150130, 1368183843, + 1560145396, 4069882981, 3680356503, 1966430470, 2295112051, 648294626, 258769936, 2701399425, + 804156091, 2173100842, 2823706584, 103204425, 4225711676, 1438101421, 2088704863, 3524758222, + 3134903146, 347226875, 1031468553, 2467456920, 1860935661, 3229814396, 3914054286, 1193487135, + 3385412645, 1738661300, 1315531078, 3758225623, 502792354, 3012596019, 2589468097, 875607120, + 1271043721, 3853125400, 3429020650, 1644831355, 2683558414, 832261023, 408158061, 3057348348, + 953223622, 2528745559, 3211865253, 286899508, 3974120769, 1116263632, 1799381026, 3307794867, + 2917509143, 59586950, 709201268, 2217549029, 2043995280, 3619452161, 4269064691, 1344032866, + 3740677976, 1889445577, 1498812987, 4148069290, 180845535, 2762992206, 2372361916, 588238637, + 1921194766, 3706423967, 4112727661, 1531686908, 2796705673, 148555288, 554857194, 2407195515, + 26248257, 2952271312, 2251333922, 676868275, 3584149702, 2076793175, 1375858085, 4234771508, + 2493785488, 986493953, 319029491, 3178008930, 1083533591, 4009621638, 3342158964, 1767759333, + 3887577823, 1239362382, 1612160956, 3464433197, 864482904, 2649647049, 3022443323, 441336490, + 1706844275, 3419730402, 3793503504, 1282724993, 2978819316, 535149925, 908921239, 2554697734, + 380632892, 3100077741, 2433735263, 1063734222, 3265180603, 1828069930, 1161729752, 3948283721, + 2207997677, 770953084, 71007118, 2857626143, 1470763626, 4190274555, 3490330377, 2120394392, + 4035494306, 1591758899, 1999168705, 3644880208, 616140069, 2328960180, 2736367686, 225524183, + }, +}; + +static const uint8_t +WUFFS_CRC32__IEEE_X86_SSE42_K1K2[16] WUFFS_BASE__POTENTIALLY_UNUSED = { + 212, 43, 68, 84, 1, 0, 0, 0, + 150, 21, 228, 198, 1, 0, 0, 0, +}; + +static const uint8_t +WUFFS_CRC32__IEEE_X86_SSE42_K3K4[16] WUFFS_BASE__POTENTIALLY_UNUSED = { + 208, 151, 25, 117, 1, 0, 0, 0, + 158, 0, 170, 204, 0, 0, 0, 0, +}; + +static const uint8_t +WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ[16] WUFFS_BASE__POTENTIALLY_UNUSED = { + 36, 97, 205, 99, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static const uint8_t +WUFFS_CRC32__IEEE_X86_SSE42_PXMU[16] WUFFS_BASE__POTENTIALLY_UNUSED = { + 65, 6, 113, 219, 1, 0, 0, 0, + 65, 22, 1, 247, 1, 0, 0, 0, +}; + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__empty_struct +wuffs_crc32__ieee_hasher__up( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x); + +static wuffs_base__empty_struct +wuffs_crc32__ieee_hasher__up__choosy_default( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x); + +#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +static wuffs_base__empty_struct +wuffs_crc32__ieee_hasher__up_arm_crc32( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x); +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +static wuffs_base__empty_struct +wuffs_crc32__ieee_hasher__up_x86_avx2( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x); +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +static wuffs_base__empty_struct +wuffs_crc32__ieee_hasher__up_x86_sse42( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x); +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + +// ---------------- VTables + +const wuffs_base__hasher_u32__func_ptrs +wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = { + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_crc32__ieee_hasher__set_quirk_enabled), + (uint32_t(*)(void*, + wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update_u32), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_crc32__ieee_hasher__initialize( + wuffs_crc32__ieee_hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.choosy_up = &wuffs_crc32__ieee_hasher__up__choosy_default; + + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = + wuffs_base__hasher_u32__vtable_name; + self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = + (const void*)(&wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32); + return wuffs_base__make_status(NULL); +} + +wuffs_crc32__ieee_hasher* +wuffs_crc32__ieee_hasher__alloc() { + wuffs_crc32__ieee_hasher* x = + (wuffs_crc32__ieee_hasher*)(calloc(1, sizeof(wuffs_crc32__ieee_hasher))); + if (!x) { + return NULL; + } + if (wuffs_crc32__ieee_hasher__initialize( + x, sizeof(wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_crc32__ieee_hasher() { + return sizeof(wuffs_crc32__ieee_hasher); +} + +// ---------------- Function Implementations + +// -------- func crc32.ieee_hasher.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_crc32__ieee_hasher__set_quirk_enabled( + wuffs_crc32__ieee_hasher* self, + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__make_empty_struct(); +} + +// -------- func crc32.ieee_hasher.update_u32 + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_crc32__ieee_hasher__update_u32( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x) { + if (!self) { + return 0; + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return 0; + } + + if (self->private_impl.f_state == 0) { + self->private_impl.choosy_up = ( +#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) + wuffs_base__cpu_arch__have_arm_crc32() ? &wuffs_crc32__ieee_hasher__up_arm_crc32 : +#endif +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_crc32__ieee_hasher__up_x86_avx2 : +#endif +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 : +#endif + self->private_impl.choosy_up); + } + wuffs_crc32__ieee_hasher__up(self, a_x); + return self->private_impl.f_state; +} + +// -------- func crc32.ieee_hasher.up + +static wuffs_base__empty_struct +wuffs_crc32__ieee_hasher__up( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x) { + return (*self->private_impl.choosy_up)(self, a_x); +} + +static wuffs_base__empty_struct +wuffs_crc32__ieee_hasher__up__choosy_default( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x) { + uint32_t v_s = 0; + wuffs_base__slice_u8 v_p = {0}; + + v_s = (4294967295 ^ self->private_impl.f_state); + { + wuffs_base__slice_u8 i_slice_p = a_x; + v_p.ptr = i_slice_p.ptr; + v_p.len = 16; + uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); + while (v_p.ptr < i_end0_p) { + v_s ^= ((((uint32_t)(v_p.ptr[0])) << 0) | + (((uint32_t)(v_p.ptr[1])) << 8) | + (((uint32_t)(v_p.ptr[2])) << 16) | + (((uint32_t)(v_p.ptr[3])) << 24)); + v_s = (WUFFS_CRC32__IEEE_TABLE[0][v_p.ptr[15]] ^ + WUFFS_CRC32__IEEE_TABLE[1][v_p.ptr[14]] ^ + WUFFS_CRC32__IEEE_TABLE[2][v_p.ptr[13]] ^ + WUFFS_CRC32__IEEE_TABLE[3][v_p.ptr[12]] ^ + WUFFS_CRC32__IEEE_TABLE[4][v_p.ptr[11]] ^ + WUFFS_CRC32__IEEE_TABLE[5][v_p.ptr[10]] ^ + WUFFS_CRC32__IEEE_TABLE[6][v_p.ptr[9]] ^ + WUFFS_CRC32__IEEE_TABLE[7][v_p.ptr[8]] ^ + WUFFS_CRC32__IEEE_TABLE[8][v_p.ptr[7]] ^ + WUFFS_CRC32__IEEE_TABLE[9][v_p.ptr[6]] ^ + WUFFS_CRC32__IEEE_TABLE[10][v_p.ptr[5]] ^ + WUFFS_CRC32__IEEE_TABLE[11][v_p.ptr[4]] ^ + WUFFS_CRC32__IEEE_TABLE[12][(255 & (v_s >> 24))] ^ + WUFFS_CRC32__IEEE_TABLE[13][(255 & (v_s >> 16))] ^ + WUFFS_CRC32__IEEE_TABLE[14][(255 & (v_s >> 8))] ^ + WUFFS_CRC32__IEEE_TABLE[15][(255 & (v_s >> 0))]); + v_p.ptr += 16; + v_s ^= ((((uint32_t)(v_p.ptr[0])) << 0) | + (((uint32_t)(v_p.ptr[1])) << 8) | + (((uint32_t)(v_p.ptr[2])) << 16) | + (((uint32_t)(v_p.ptr[3])) << 24)); + v_s = (WUFFS_CRC32__IEEE_TABLE[0][v_p.ptr[15]] ^ + WUFFS_CRC32__IEEE_TABLE[1][v_p.ptr[14]] ^ + WUFFS_CRC32__IEEE_TABLE[2][v_p.ptr[13]] ^ + WUFFS_CRC32__IEEE_TABLE[3][v_p.ptr[12]] ^ + WUFFS_CRC32__IEEE_TABLE[4][v_p.ptr[11]] ^ + WUFFS_CRC32__IEEE_TABLE[5][v_p.ptr[10]] ^ + WUFFS_CRC32__IEEE_TABLE[6][v_p.ptr[9]] ^ + WUFFS_CRC32__IEEE_TABLE[7][v_p.ptr[8]] ^ + WUFFS_CRC32__IEEE_TABLE[8][v_p.ptr[7]] ^ + WUFFS_CRC32__IEEE_TABLE[9][v_p.ptr[6]] ^ + WUFFS_CRC32__IEEE_TABLE[10][v_p.ptr[5]] ^ + WUFFS_CRC32__IEEE_TABLE[11][v_p.ptr[4]] ^ + WUFFS_CRC32__IEEE_TABLE[12][(255 & (v_s >> 24))] ^ + WUFFS_CRC32__IEEE_TABLE[13][(255 & (v_s >> 16))] ^ + WUFFS_CRC32__IEEE_TABLE[14][(255 & (v_s >> 8))] ^ + WUFFS_CRC32__IEEE_TABLE[15][(255 & (v_s >> 0))]); + v_p.ptr += 16; + } + v_p.len = 16; + uint8_t* i_end1_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16); + while (v_p.ptr < i_end1_p) { + v_s ^= ((((uint32_t)(v_p.ptr[0])) << 0) | + (((uint32_t)(v_p.ptr[1])) << 8) | + (((uint32_t)(v_p.ptr[2])) << 16) | + (((uint32_t)(v_p.ptr[3])) << 24)); + v_s = (WUFFS_CRC32__IEEE_TABLE[0][v_p.ptr[15]] ^ + WUFFS_CRC32__IEEE_TABLE[1][v_p.ptr[14]] ^ + WUFFS_CRC32__IEEE_TABLE[2][v_p.ptr[13]] ^ + WUFFS_CRC32__IEEE_TABLE[3][v_p.ptr[12]] ^ + WUFFS_CRC32__IEEE_TABLE[4][v_p.ptr[11]] ^ + WUFFS_CRC32__IEEE_TABLE[5][v_p.ptr[10]] ^ + WUFFS_CRC32__IEEE_TABLE[6][v_p.ptr[9]] ^ + WUFFS_CRC32__IEEE_TABLE[7][v_p.ptr[8]] ^ + WUFFS_CRC32__IEEE_TABLE[8][v_p.ptr[7]] ^ + WUFFS_CRC32__IEEE_TABLE[9][v_p.ptr[6]] ^ + WUFFS_CRC32__IEEE_TABLE[10][v_p.ptr[5]] ^ + WUFFS_CRC32__IEEE_TABLE[11][v_p.ptr[4]] ^ + WUFFS_CRC32__IEEE_TABLE[12][(255 & (v_s >> 24))] ^ + WUFFS_CRC32__IEEE_TABLE[13][(255 & (v_s >> 16))] ^ + WUFFS_CRC32__IEEE_TABLE[14][(255 & (v_s >> 8))] ^ + WUFFS_CRC32__IEEE_TABLE[15][(255 & (v_s >> 0))]); + v_p.ptr += 16; + } + v_p.len = 1; + uint8_t* i_end2_p = i_slice_p.ptr + i_slice_p.len; + while (v_p.ptr < i_end2_p) { + v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ v_p.ptr[0])] ^ (v_s >> 8)); + v_p.ptr += 1; + } + v_p.len = 0; + } + self->private_impl.f_state = (4294967295 ^ v_s); + return wuffs_base__make_empty_struct(); +} + +// ‼ WUFFS MULTI-FILE SECTION +arm_crc32 +// -------- func crc32.ieee_hasher.up_arm_crc32 + +#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +static wuffs_base__empty_struct +wuffs_crc32__ieee_hasher__up_arm_crc32( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x) { + wuffs_base__slice_u8 v_p = {0}; + uint32_t v_s = 0; + + v_s = (4294967295 ^ self->private_impl.f_state); + while ((((uint64_t)(a_x.len)) > 0) && ((15 & ((uint32_t)(0xFFF & (uintptr_t)(a_x.ptr)))) != 0)) { + v_s = __crc32b(v_s, a_x.ptr[0]); + a_x = wuffs_base__slice_u8__subslice_i(a_x, 1); + } + { + wuffs_base__slice_u8 i_slice_p = a_x; + v_p.ptr = i_slice_p.ptr; + v_p.len = 8; + uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 128) * 128); + while (v_p.ptr < i_end0_p) { + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + } + v_p.len = 8; + uint8_t* i_end1_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8); + while (v_p.ptr < i_end1_p) { + v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); + v_p.ptr += 8; + } + v_p.len = 1; + uint8_t* i_end2_p = i_slice_p.ptr + i_slice_p.len; + while (v_p.ptr < i_end2_p) { + v_s = __crc32b(v_s, v_p.ptr[0]); + v_p.ptr += 1; + } + v_p.len = 0; + } + self->private_impl.f_state = (4294967295 ^ v_s); + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +// ‼ WUFFS MULTI-FILE SECTION -arm_crc32 + +// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 +// -------- func crc32.ieee_hasher.up_x86_avx2 + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +static wuffs_base__empty_struct +wuffs_crc32__ieee_hasher__up_x86_avx2( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x) { + uint32_t v_s = 0; + wuffs_base__slice_u8 v_p = {0}; + __m128i v_k = {0}; + __m128i v_x0 = {0}; + __m128i v_x1 = {0}; + __m128i v_x2 = {0}; + __m128i v_x3 = {0}; + __m128i v_y0 = {0}; + __m128i v_y1 = {0}; + __m128i v_y2 = {0}; + __m128i v_y3 = {0}; + uint64_t v_tail_index = 0; + + v_s = (4294967295 ^ self->private_impl.f_state); + while ((((uint64_t)(a_x.len)) > 0) && ((15 & ((uint32_t)(0xFFF & (uintptr_t)(a_x.ptr)))) != 0)) { + v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ a_x.ptr[0])] ^ (v_s >> 8)); + a_x = wuffs_base__slice_u8__subslice_i(a_x, 1); + } + if (((uint64_t)(a_x.len)) < 64) { + { + wuffs_base__slice_u8 i_slice_p = a_x; + v_p.ptr = i_slice_p.ptr; + v_p.len = 1; + uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; + while (v_p.ptr < i_end0_p) { + v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ v_p.ptr[0])] ^ (v_s >> 8)); + v_p.ptr += 1; + } + v_p.len = 0; + } + self->private_impl.f_state = (4294967295 ^ v_s); + return wuffs_base__make_empty_struct(); + } + v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0)); + v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16)); + v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32)); + v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48)); + v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s))); + v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K1K2)); + { + wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64); + v_p.ptr = i_slice_p.ptr; + v_p.len = 64; + uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64); + while (v_p.ptr < i_end0_p) { + v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0)); + v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0)); + v_y2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(0)); + v_y3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(0)); + v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17)); + v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(17)); + v_x2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(17)); + v_x3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(17)); + v_x0 = _mm_xor_si128(_mm_xor_si128(v_x0, v_y0), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 0))); + v_x1 = _mm_xor_si128(_mm_xor_si128(v_x1, v_y1), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16))); + v_x2 = _mm_xor_si128(_mm_xor_si128(v_x2, v_y2), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 32))); + v_x3 = _mm_xor_si128(_mm_xor_si128(v_x3, v_y3), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 48))); + v_p.ptr += 64; + } + v_p.len = 0; + } + v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K3K4)); + v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0)); + v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17)); + v_x0 = _mm_xor_si128(v_x0, v_x1); + v_x0 = _mm_xor_si128(v_x0, v_y0); + v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0)); + v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17)); + v_x0 = _mm_xor_si128(v_x0, v_x2); + v_x0 = _mm_xor_si128(v_x0, v_y0); + v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0)); + v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17)); + v_x0 = _mm_xor_si128(v_x0, v_x3); + v_x0 = _mm_xor_si128(v_x0, v_y0); + v_x1 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(16)); + v_x2 = _mm_set_epi32((int32_t)(0), (int32_t)(4294967295), (int32_t)(0), (int32_t)(4294967295)); + v_x0 = _mm_srli_si128(v_x0, (int32_t)(8)); + v_x0 = _mm_xor_si128(v_x0, v_x1); + v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ)); + v_x1 = _mm_srli_si128(v_x0, (int32_t)(4)); + v_x0 = _mm_and_si128(v_x0, v_x2); + v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0)); + v_x0 = _mm_xor_si128(v_x0, v_x1); + v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_PXMU)); + v_x1 = _mm_and_si128(v_x0, v_x2); + v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(16)); + v_x1 = _mm_and_si128(v_x1, v_x2); + v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0)); + v_x0 = _mm_xor_si128(v_x0, v_x1); + v_s = ((uint32_t)(_mm_extract_epi32(v_x0, (int32_t)(1)))); + v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551552u); + if (v_tail_index < ((uint64_t)(a_x.len))) { + { + wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); + v_p.ptr = i_slice_p.ptr; + v_p.len = 1; + uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; + while (v_p.ptr < i_end0_p) { + v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ v_p.ptr[0])] ^ (v_s >> 8)); + v_p.ptr += 1; + } + v_p.len = 0; + } + } + self->private_impl.f_state = (4294967295 ^ v_s); + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 + +// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +// -------- func crc32.ieee_hasher.up_x86_sse42 + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +static wuffs_base__empty_struct +wuffs_crc32__ieee_hasher__up_x86_sse42( + wuffs_crc32__ieee_hasher* self, + wuffs_base__slice_u8 a_x) { + uint32_t v_s = 0; + wuffs_base__slice_u8 v_p = {0}; + __m128i v_k = {0}; + __m128i v_x0 = {0}; + __m128i v_x1 = {0}; + __m128i v_x2 = {0}; + __m128i v_x3 = {0}; + __m128i v_y0 = {0}; + __m128i v_y1 = {0}; + __m128i v_y2 = {0}; + __m128i v_y3 = {0}; + uint64_t v_tail_index = 0; + + v_s = (4294967295 ^ self->private_impl.f_state); + while ((((uint64_t)(a_x.len)) > 0) && ((15 & ((uint32_t)(0xFFF & (uintptr_t)(a_x.ptr)))) != 0)) { + v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ a_x.ptr[0])] ^ (v_s >> 8)); + a_x = wuffs_base__slice_u8__subslice_i(a_x, 1); + } + if (((uint64_t)(a_x.len)) < 64) { + { + wuffs_base__slice_u8 i_slice_p = a_x; + v_p.ptr = i_slice_p.ptr; + v_p.len = 1; + uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; + while (v_p.ptr < i_end0_p) { + v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ v_p.ptr[0])] ^ (v_s >> 8)); + v_p.ptr += 1; + } + v_p.len = 0; + } + self->private_impl.f_state = (4294967295 ^ v_s); + return wuffs_base__make_empty_struct(); + } + v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0)); + v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16)); + v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32)); + v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48)); + v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s))); + v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K1K2)); + { + wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64); + v_p.ptr = i_slice_p.ptr; + v_p.len = 64; + uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64); + while (v_p.ptr < i_end0_p) { + v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0)); + v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0)); + v_y2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(0)); + v_y3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(0)); + v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17)); + v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(17)); + v_x2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(17)); + v_x3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(17)); + v_x0 = _mm_xor_si128(_mm_xor_si128(v_x0, v_y0), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 0))); + v_x1 = _mm_xor_si128(_mm_xor_si128(v_x1, v_y1), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16))); + v_x2 = _mm_xor_si128(_mm_xor_si128(v_x2, v_y2), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 32))); + v_x3 = _mm_xor_si128(_mm_xor_si128(v_x3, v_y3), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 48))); + v_p.ptr += 64; + } + v_p.len = 0; + } + v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K3K4)); + v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0)); + v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17)); + v_x0 = _mm_xor_si128(v_x0, v_x1); + v_x0 = _mm_xor_si128(v_x0, v_y0); + v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0)); + v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17)); + v_x0 = _mm_xor_si128(v_x0, v_x2); + v_x0 = _mm_xor_si128(v_x0, v_y0); + v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0)); + v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17)); + v_x0 = _mm_xor_si128(v_x0, v_x3); + v_x0 = _mm_xor_si128(v_x0, v_y0); + v_x1 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(16)); + v_x2 = _mm_set_epi32((int32_t)(0), (int32_t)(4294967295), (int32_t)(0), (int32_t)(4294967295)); + v_x0 = _mm_srli_si128(v_x0, (int32_t)(8)); + v_x0 = _mm_xor_si128(v_x0, v_x1); + v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ)); + v_x1 = _mm_srli_si128(v_x0, (int32_t)(4)); + v_x0 = _mm_and_si128(v_x0, v_x2); + v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0)); + v_x0 = _mm_xor_si128(v_x0, v_x1); + v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_PXMU)); + v_x1 = _mm_and_si128(v_x0, v_x2); + v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(16)); + v_x1 = _mm_and_si128(v_x1, v_x2); + v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0)); + v_x0 = _mm_xor_si128(v_x0, v_x1); + v_s = ((uint32_t)(_mm_extract_epi32(v_x0, (int32_t)(1)))); + v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551552u); + if (v_tail_index < ((uint64_t)(a_x.len))) { + { + wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); + v_p.ptr = i_slice_p.ptr; + v_p.len = 1; + uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; + while (v_p.ptr < i_end0_p) { + v_s = (WUFFS_CRC32__IEEE_TABLE[0][(((uint8_t)((v_s & 255))) ^ v_p.ptr[0])] ^ (v_s >> 8)); + v_p.ptr += 1; + } + v_p.len = 0; + } + } + self->private_impl.f_state = (4294967295 ^ v_s); + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) + +// ---------------- Status Codes Implementations + +const char wuffs_deflate__error__bad_huffman_code_over_subscribed[] = "#deflate: bad Huffman code (over-subscribed)"; +const char wuffs_deflate__error__bad_huffman_code_under_subscribed[] = "#deflate: bad Huffman code (under-subscribed)"; +const char wuffs_deflate__error__bad_huffman_code_length_count[] = "#deflate: bad Huffman code length count"; +const char wuffs_deflate__error__bad_huffman_code_length_repetition[] = "#deflate: bad Huffman code length repetition"; +const char wuffs_deflate__error__bad_huffman_code[] = "#deflate: bad Huffman code"; +const char wuffs_deflate__error__bad_huffman_minimum_code_length[] = "#deflate: bad Huffman minimum code length"; +const char wuffs_deflate__error__bad_block[] = "#deflate: bad block"; +const char wuffs_deflate__error__bad_distance[] = "#deflate: bad distance"; +const char wuffs_deflate__error__bad_distance_code_count[] = "#deflate: bad distance code count"; +const char wuffs_deflate__error__bad_literal_length_code_count[] = "#deflate: bad literal/length code count"; +const char wuffs_deflate__error__inconsistent_stored_block_length[] = "#deflate: inconsistent stored block length"; +const char wuffs_deflate__error__missing_end_of_block_code[] = "#deflate: missing end-of-block code"; +const char wuffs_deflate__error__no_huffman_codes[] = "#deflate: no Huffman codes"; +const char wuffs_deflate__error__truncated_input[] = "#deflate: truncated input"; +const char wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state[] = "#deflate: internal error: inconsistent Huffman decoder state"; +const char wuffs_deflate__error__internal_error_inconsistent_i_o[] = "#deflate: internal error: inconsistent I/O"; +const char wuffs_deflate__error__internal_error_inconsistent_distance[] = "#deflate: internal error: inconsistent distance"; +const char wuffs_deflate__error__internal_error_inconsistent_n_bits[] = "#deflate: internal error: inconsistent n_bits"; + +// ---------------- Private Consts + +static const uint8_t +WUFFS_DEFLATE__CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = { + 16, 17, 18, 0, 8, 7, 9, 6, + 10, 5, 11, 4, 12, 3, 13, 2, + 14, 1, 15, +}; + +static const uint8_t +WUFFS_DEFLATE__REVERSE8[256] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 128, 64, 192, 32, 160, 96, 224, + 16, 144, 80, 208, 48, 176, 112, 240, + 8, 136, 72, 200, 40, 168, 104, 232, + 24, 152, 88, 216, 56, 184, 120, 248, + 4, 132, 68, 196, 36, 164, 100, 228, + 20, 148, 84, 212, 52, 180, 116, 244, + 12, 140, 76, 204, 44, 172, 108, 236, + 28, 156, 92, 220, 60, 188, 124, 252, + 2, 130, 66, 194, 34, 162, 98, 226, + 18, 146, 82, 210, 50, 178, 114, 242, + 10, 138, 74, 202, 42, 170, 106, 234, + 26, 154, 90, 218, 58, 186, 122, 250, + 6, 134, 70, 198, 38, 166, 102, 230, + 22, 150, 86, 214, 54, 182, 118, 246, + 14, 142, 78, 206, 46, 174, 110, 238, + 30, 158, 94, 222, 62, 190, 126, 254, + 1, 129, 65, 193, 33, 161, 97, 225, + 17, 145, 81, 209, 49, 177, 113, 241, + 9, 137, 73, 201, 41, 169, 105, 233, + 25, 153, 89, 217, 57, 185, 121, 249, + 5, 133, 69, 197, 37, 165, 101, 229, + 21, 149, 85, 213, 53, 181, 117, 245, + 13, 141, 77, 205, 45, 173, 109, 237, + 29, 157, 93, 221, 61, 189, 125, 253, + 3, 131, 67, 195, 35, 163, 99, 227, + 19, 147, 83, 211, 51, 179, 115, 243, + 11, 139, 75, 203, 43, 171, 107, 235, + 27, 155, 91, 219, 59, 187, 123, 251, + 7, 135, 71, 199, 39, 167, 103, 231, + 23, 151, 87, 215, 55, 183, 119, 247, + 15, 143, 79, 207, 47, 175, 111, 239, + 31, 159, 95, 223, 63, 191, 127, 255, +}; + +static const uint32_t +WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { + 1073741824, 1073742080, 1073742336, 1073742592, 1073742848, 1073743104, 1073743360, 1073743616, + 1073743888, 1073744400, 1073744912, 1073745424, 1073745952, 1073746976, 1073748000, 1073749024, + 1073750064, 1073752112, 1073754160, 1073756208, 1073758272, 1073762368, 1073766464, 1073770560, + 1073774672, 1073782864, 1073791056, 1073799248, 1073807104, 134217728, 134217728, 134217728, +}; + +static const uint32_t +WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { + 1073741824, 1073742080, 1073742336, 1073742592, 1073742864, 1073743376, 1073743904, 1073744928, + 1073745968, 1073748016, 1073750080, 1073754176, 1073758288, 1073766480, 1073774688, 1073791072, + 1073807472, 1073840240, 1073873024, 1073938560, 1074004112, 1074135184, 1074266272, 1074528416, + 1074790576, 1075314864, 1075839168, 1076887744, 1077936336, 1080033488, 134217728, 134217728, +}; + +#define WUFFS_DEFLATE__HUFFS_TABLE_SIZE 1024 + +#define WUFFS_DEFLATE__HUFFS_TABLE_MASK 1023 + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__status +wuffs_deflate__decoder__do_transform_io( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +static wuffs_base__status +wuffs_deflate__decoder__decode_blocks( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_deflate__decoder__decode_uncompressed( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_deflate__decoder__init_fixed_huffman( + wuffs_deflate__decoder* self); + +static wuffs_base__status +wuffs_deflate__decoder__init_dynamic_huffman( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_deflate__decoder__init_huff( + wuffs_deflate__decoder* self, + uint32_t a_which, + uint32_t a_n_codes0, + uint32_t a_n_codes1, + uint32_t a_base_symbol); + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +static wuffs_base__status +wuffs_deflate__decoder__decode_huffman_bmi2( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src); +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + +static wuffs_base__status +wuffs_deflate__decoder__decode_huffman_fast32( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_deflate__decoder__decode_huffman_fast64( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_deflate__decoder__decode_huffman_slow( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +// ---------------- VTables + +const wuffs_base__io_transformer__func_ptrs +wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer = { + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_deflate__decoder__set_quirk_enabled), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__io_buffer*, + wuffs_base__slice_u8))(&wuffs_deflate__decoder__transform_io), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_deflate__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_deflate__decoder__initialize( + wuffs_deflate__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.choosy_decode_huffman_fast64 = &wuffs_deflate__decoder__decode_huffman_fast64__choosy_default; + + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = + wuffs_base__io_transformer__vtable_name; + self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = + (const void*)(&wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer); + return wuffs_base__make_status(NULL); +} + +wuffs_deflate__decoder* +wuffs_deflate__decoder__alloc() { + wuffs_deflate__decoder* x = + (wuffs_deflate__decoder*)(calloc(1, sizeof(wuffs_deflate__decoder))); + if (!x) { + return NULL; + } + if (wuffs_deflate__decoder__initialize( + x, sizeof(wuffs_deflate__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_deflate__decoder() { + return sizeof(wuffs_deflate__decoder); +} + +// ---------------- Function Implementations + +// -------- func deflate.decoder.add_history + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_deflate__decoder__add_history( + wuffs_deflate__decoder* self, + wuffs_base__slice_u8 a_hist) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + wuffs_base__slice_u8 v_s = {0}; + uint64_t v_n_copied = 0; + uint32_t v_already_full = 0; + + v_s = a_hist; + if (((uint64_t)(v_s.len)) >= 32768) { + v_s = wuffs_base__slice_u8__suffix(v_s, 32768); + wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); + self->private_impl.f_history_index = 32768; + } else { + v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, (self->private_impl.f_history_index & 32767), 32768), v_s); + if (v_n_copied < ((uint64_t)(v_s.len))) { + v_s = wuffs_base__slice_u8__subslice_i(v_s, v_n_copied); + v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); + self->private_impl.f_history_index = (((uint32_t)((v_n_copied & 32767))) + 32768); + } else { + v_already_full = 0; + if (self->private_impl.f_history_index >= 32768) { + v_already_full = 32768; + } + self->private_impl.f_history_index = ((self->private_impl.f_history_index & 32767) + ((uint32_t)((v_n_copied & 32767))) + v_already_full); + } + } + wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, 32768, 33025), wuffs_base__make_slice_u8(self->private_data.f_history, 33025)); + return wuffs_base__make_empty_struct(); +} + +// -------- func deflate.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_deflate__decoder__set_quirk_enabled( + wuffs_deflate__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__make_empty_struct(); +} + +// -------- func deflate.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_deflate__decoder__workbuf_len( + const wuffs_deflate__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__make_range_ii_u64(1, 1); +} + +// -------- func deflate.decoder.transform_io + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_deflate__decoder__transform_io( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_deflate__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_deflate__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_transform_io[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func deflate.decoder.do_transform_io + +static wuffs_base__status +wuffs_deflate__decoder__do_transform_io( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint64_t v_mark = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + + uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + self->private_impl.choosy_decode_huffman_fast64 = ( +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 : +#endif + self->private_impl.choosy_decode_huffman_fast64); + while (true) { + v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); + { + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + wuffs_base__status t_0 = wuffs_deflate__decoder__decode_blocks(self, a_dst, a_src); + v_status = t_0; + if (a_dst) { + iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; + } + } + if ( ! wuffs_base__status__is_suspension(&v_status)) { + status = v_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + wuffs_base__u64__sat_add_indirect(&self->private_impl.f_transformed_history_count, wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)))); + wuffs_deflate__decoder__add_history(self, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_do_transform_io[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + + return status; +} + +// -------- func deflate.decoder.decode_blocks + +static wuffs_base__status +wuffs_deflate__decoder__decode_blocks( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_final = 0; + uint32_t v_b0 = 0; + uint32_t v_type = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_blocks[0]; + if (coro_susp_point) { + v_final = self->private_data.s_decode_blocks[0].v_final; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + label__outer__continue:; + while (v_final == 0) { + while (self->private_impl.f_n_bits < 3) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_0 = *iop_a_src++; + v_b0 = t_0; + } + self->private_impl.f_bits |= (v_b0 << (self->private_impl.f_n_bits & 3)); + self->private_impl.f_n_bits = ((self->private_impl.f_n_bits & 3) + 8); + } + v_final = (self->private_impl.f_bits & 1); + v_type = ((self->private_impl.f_bits >> 1) & 3); + self->private_impl.f_bits >>= 3; + self->private_impl.f_n_bits -= 3; + if (v_type == 0) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + status = wuffs_deflate__decoder__decode_uncompressed(self, a_dst, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + goto label__outer__continue; + } else if (v_type == 1) { + v_status = wuffs_deflate__decoder__init_fixed_huffman(self); + if ( ! wuffs_base__status__is_ok(&v_status)) { + status = v_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + } else if (v_type == 2) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + status = wuffs_deflate__decoder__init_dynamic_huffman(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else { + status = wuffs_base__make_status(wuffs_deflate__error__bad_block); + goto exit; + } + self->private_impl.f_end_of_block = false; + while (true) { + if (sizeof(void*) == 4) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + v_status = wuffs_deflate__decoder__decode_huffman_fast32(self, a_dst, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } else { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } + if (wuffs_base__status__is_error(&v_status)) { + status = v_status; + goto exit; + } + if (self->private_impl.f_end_of_block) { + goto label__outer__continue; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + status = wuffs_deflate__decoder__decode_huffman_slow(self, a_dst, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + if (self->private_impl.f_end_of_block) { + goto label__outer__continue; + } + } + } + + ok: + self->private_impl.p_decode_blocks[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_blocks[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_decode_blocks[0].v_final = v_final; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func deflate.decoder.decode_uncompressed + +static wuffs_base__status +wuffs_deflate__decoder__decode_uncompressed( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_length = 0; + uint32_t v_n_copied = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_uncompressed[0]; + if (coro_susp_point) { + v_length = self->private_data.s_decode_uncompressed[0].v_length; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7)) != 0)) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } + self->private_impl.f_n_bits = 0; + self->private_impl.f_bits = 0; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_uncompressed[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_uncompressed[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; + if (num_bits_0 == 24) { + t_0 = ((uint32_t)(*scratch)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } + v_length = t_0; + } + if ((((v_length) & 0xFFFF) + ((v_length) >> (32 - (16)))) != 65535) { + status = wuffs_base__make_status(wuffs_deflate__error__inconsistent_stored_block_length); + goto exit; + } + v_length = ((v_length) & 0xFFFF); + while (true) { + v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_reader( + &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src); + if (v_length <= v_n_copied) { + status = wuffs_base__make_status(NULL); + goto ok; + } + v_length -= v_n_copied; + if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + } else { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); + } + } + + ok: + self->private_impl.p_decode_uncompressed[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_uncompressed[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_decode_uncompressed[0].v_length = v_length; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func deflate.decoder.init_fixed_huffman + +static wuffs_base__status +wuffs_deflate__decoder__init_fixed_huffman( + wuffs_deflate__decoder* self) { + uint32_t v_i = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + while (v_i < 144) { + self->private_data.f_code_lengths[v_i] = 8; + v_i += 1; + } + while (v_i < 256) { + self->private_data.f_code_lengths[v_i] = 9; + v_i += 1; + } + while (v_i < 280) { + self->private_data.f_code_lengths[v_i] = 7; + v_i += 1; + } + while (v_i < 288) { + self->private_data.f_code_lengths[v_i] = 8; + v_i += 1; + } + while (v_i < 320) { + self->private_data.f_code_lengths[v_i] = 5; + v_i += 1; + } + v_status = wuffs_deflate__decoder__init_huff(self, + 0, + 0, + 288, + 257); + if (wuffs_base__status__is_error(&v_status)) { + return v_status; + } + v_status = wuffs_deflate__decoder__init_huff(self, + 1, + 288, + 320, + 0); + if (wuffs_base__status__is_error(&v_status)) { + return v_status; + } + return wuffs_base__make_status(NULL); +} + +// -------- func deflate.decoder.init_dynamic_huffman + +static wuffs_base__status +wuffs_deflate__decoder__init_dynamic_huffman( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_bits = 0; + uint32_t v_n_bits = 0; + uint32_t v_b0 = 0; + uint32_t v_n_lit = 0; + uint32_t v_n_dist = 0; + uint32_t v_n_clen = 0; + uint32_t v_i = 0; + uint32_t v_b1 = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + uint32_t v_mask = 0; + uint32_t v_table_entry = 0; + uint32_t v_table_entry_n_bits = 0; + uint32_t v_b2 = 0; + uint32_t v_n_extra_bits = 0; + uint8_t v_rep_symbol = 0; + uint32_t v_rep_count = 0; + uint32_t v_b3 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_init_dynamic_huffman[0]; + if (coro_susp_point) { + v_bits = self->private_data.s_init_dynamic_huffman[0].v_bits; + v_n_bits = self->private_data.s_init_dynamic_huffman[0].v_n_bits; + v_n_lit = self->private_data.s_init_dynamic_huffman[0].v_n_lit; + v_n_dist = self->private_data.s_init_dynamic_huffman[0].v_n_dist; + v_n_clen = self->private_data.s_init_dynamic_huffman[0].v_n_clen; + v_i = self->private_data.s_init_dynamic_huffman[0].v_i; + v_mask = self->private_data.s_init_dynamic_huffman[0].v_mask; + v_n_extra_bits = self->private_data.s_init_dynamic_huffman[0].v_n_extra_bits; + v_rep_symbol = self->private_data.s_init_dynamic_huffman[0].v_rep_symbol; + v_rep_count = self->private_data.s_init_dynamic_huffman[0].v_rep_count; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + v_bits = self->private_impl.f_bits; + v_n_bits = self->private_impl.f_n_bits; + while (v_n_bits < 14) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_0 = *iop_a_src++; + v_b0 = t_0; + } + v_bits |= (v_b0 << v_n_bits); + v_n_bits += 8; + } + v_n_lit = (((v_bits) & 0x1F) + 257); + if (v_n_lit > 286) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_literal_length_code_count); + goto exit; + } + v_bits >>= 5; + v_n_dist = (((v_bits) & 0x1F) + 1); + if (v_n_dist > 30) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_distance_code_count); + goto exit; + } + v_bits >>= 5; + v_n_clen = (((v_bits) & 0xF) + 4); + v_bits >>= 4; + v_n_bits -= 14; + v_i = 0; + while (v_i < v_n_clen) { + while (v_n_bits < 3) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_1 = *iop_a_src++; + v_b1 = t_1; + } + v_bits |= (v_b1 << v_n_bits); + v_n_bits += 8; + } + self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = ((uint8_t)((v_bits & 7))); + v_bits >>= 3; + v_n_bits -= 3; + v_i += 1; + } + while (v_i < 19) { + self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = 0; + v_i += 1; + } + v_status = wuffs_deflate__decoder__init_huff(self, + 0, + 0, + 19, + 4095); + if (wuffs_base__status__is_error(&v_status)) { + status = v_status; + goto exit; + } + v_mask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1); + v_i = 0; + label__0__continue:; + while (v_i < (v_n_lit + v_n_dist)) { + while (true) { + v_table_entry = self->private_data.f_huffs[0][(v_bits & v_mask)]; + v_table_entry_n_bits = (v_table_entry & 15); + if (v_n_bits >= v_table_entry_n_bits) { + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + goto label__1__break; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_2 = *iop_a_src++; + v_b2 = t_2; + } + v_bits |= (v_b2 << v_n_bits); + v_n_bits += 8; + } + label__1__break:; + if ((v_table_entry >> 24) != 128) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + v_table_entry = ((v_table_entry >> 8) & 255); + if (v_table_entry < 16) { + self->private_data.f_code_lengths[v_i] = ((uint8_t)(v_table_entry)); + v_i += 1; + goto label__0__continue; + } + v_n_extra_bits = 0; + v_rep_symbol = 0; + v_rep_count = 0; + if (v_table_entry == 16) { + v_n_extra_bits = 2; + if (v_i <= 0) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_repetition); + goto exit; + } + v_rep_symbol = (self->private_data.f_code_lengths[(v_i - 1)] & 15); + v_rep_count = 3; + } else if (v_table_entry == 17) { + v_n_extra_bits = 3; + v_rep_symbol = 0; + v_rep_count = 3; + } else if (v_table_entry == 18) { + v_n_extra_bits = 7; + v_rep_symbol = 0; + v_rep_count = 11; + } else { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + while (v_n_bits < v_n_extra_bits) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_3 = *iop_a_src++; + v_b3 = t_3; + } + v_bits |= (v_b3 << v_n_bits); + v_n_bits += 8; + } + v_rep_count += ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_n_extra_bits)); + v_bits >>= v_n_extra_bits; + v_n_bits -= v_n_extra_bits; + while (v_rep_count > 0) { + if (v_i >= (v_n_lit + v_n_dist)) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); + goto exit; + } + self->private_data.f_code_lengths[v_i] = v_rep_symbol; + v_i += 1; + v_rep_count -= 1; + } + } + if (v_i != (v_n_lit + v_n_dist)) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); + goto exit; + } + if (self->private_data.f_code_lengths[256] == 0) { + status = wuffs_base__make_status(wuffs_deflate__error__missing_end_of_block_code); + goto exit; + } + v_status = wuffs_deflate__decoder__init_huff(self, + 0, + 0, + v_n_lit, + 257); + if (wuffs_base__status__is_error(&v_status)) { + status = v_status; + goto exit; + } + v_status = wuffs_deflate__decoder__init_huff(self, + 1, + v_n_lit, + (v_n_lit + v_n_dist), + 0); + if (wuffs_base__status__is_error(&v_status)) { + status = v_status; + goto exit; + } + self->private_impl.f_bits = v_bits; + self->private_impl.f_n_bits = v_n_bits; + + goto ok; + ok: + self->private_impl.p_init_dynamic_huffman[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_init_dynamic_huffman[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_init_dynamic_huffman[0].v_bits = v_bits; + self->private_data.s_init_dynamic_huffman[0].v_n_bits = v_n_bits; + self->private_data.s_init_dynamic_huffman[0].v_n_lit = v_n_lit; + self->private_data.s_init_dynamic_huffman[0].v_n_dist = v_n_dist; + self->private_data.s_init_dynamic_huffman[0].v_n_clen = v_n_clen; + self->private_data.s_init_dynamic_huffman[0].v_i = v_i; + self->private_data.s_init_dynamic_huffman[0].v_mask = v_mask; + self->private_data.s_init_dynamic_huffman[0].v_n_extra_bits = v_n_extra_bits; + self->private_data.s_init_dynamic_huffman[0].v_rep_symbol = v_rep_symbol; + self->private_data.s_init_dynamic_huffman[0].v_rep_count = v_rep_count; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func deflate.decoder.init_huff + +static wuffs_base__status +wuffs_deflate__decoder__init_huff( + wuffs_deflate__decoder* self, + uint32_t a_which, + uint32_t a_n_codes0, + uint32_t a_n_codes1, + uint32_t a_base_symbol) { + uint16_t v_counts[16] = {0}; + uint32_t v_i = 0; + uint32_t v_remaining = 0; + uint16_t v_offsets[16] = {0}; + uint32_t v_n_symbols = 0; + uint32_t v_count = 0; + uint16_t v_symbols[320] = {0}; + uint32_t v_min_cl = 0; + uint32_t v_max_cl = 0; + uint32_t v_initial_high_bits = 0; + uint32_t v_prev_cl = 0; + uint32_t v_prev_redirect_key = 0; + uint32_t v_top = 0; + uint32_t v_next_top = 0; + uint32_t v_code = 0; + uint32_t v_key = 0; + uint32_t v_value = 0; + uint32_t v_cl = 0; + uint32_t v_redirect_key = 0; + uint32_t v_j = 0; + uint32_t v_reversed_key = 0; + uint32_t v_symbol = 0; + uint32_t v_high_bits = 0; + uint32_t v_delta = 0; + + v_i = a_n_codes0; + while (v_i < a_n_codes1) { + if (v_counts[(self->private_data.f_code_lengths[v_i] & 15)] >= 320) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + v_counts[(self->private_data.f_code_lengths[v_i] & 15)] += 1; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + v_i += 1; + } + if ((((uint32_t)(v_counts[0])) + a_n_codes0) == a_n_codes1) { + return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); + } + v_remaining = 1; + v_i = 1; + while (v_i <= 15) { + if (v_remaining > 1073741824) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + v_remaining <<= 1; + if (v_remaining < ((uint32_t)(v_counts[v_i]))) { + return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_over_subscribed); + } + v_remaining -= ((uint32_t)(v_counts[v_i])); + v_i += 1; + } + if (v_remaining != 0) { + if ((a_which == 1) && (v_counts[1] == 1) && ((((uint32_t)(v_counts[0])) + a_n_codes0 + 1) == a_n_codes1)) { + v_i = 0; + while (v_i <= 29) { + if (self->private_data.f_code_lengths[(a_n_codes0 + v_i)] == 1) { + self->private_impl.f_n_huffs_bits[1] = 1; + self->private_data.f_huffs[1][0] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[v_i] | 1); + self->private_data.f_huffs[1][1] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[31] | 1); + return wuffs_base__make_status(NULL); + } + v_i += 1; + } + } + return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_under_subscribed); + } + v_i = 1; + while (v_i <= 15) { + v_offsets[v_i] = ((uint16_t)(v_n_symbols)); + v_count = ((uint32_t)(v_counts[v_i])); + if (v_n_symbols > (320 - v_count)) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + v_n_symbols = (v_n_symbols + v_count); + v_i += 1; + } + if (v_n_symbols > 288) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + v_i = a_n_codes0; + while (v_i < a_n_codes1) { + if (v_i < a_n_codes0) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + if (self->private_data.f_code_lengths[v_i] != 0) { + if (v_offsets[(self->private_data.f_code_lengths[v_i] & 15)] >= 320) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + v_symbols[v_offsets[(self->private_data.f_code_lengths[v_i] & 15)]] = ((uint16_t)((v_i - a_n_codes0))); +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + v_offsets[(self->private_data.f_code_lengths[v_i] & 15)] += 1; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } + v_i += 1; + } + v_min_cl = 1; + while (true) { + if (v_counts[v_min_cl] != 0) { + goto label__0__break; + } + if (v_min_cl >= 9) { + return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_minimum_code_length); + } + v_min_cl += 1; + } + label__0__break:; + v_max_cl = 15; + while (true) { + if (v_counts[v_max_cl] != 0) { + goto label__1__break; + } + if (v_max_cl <= 1) { + return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); + } + v_max_cl -= 1; + } + label__1__break:; + if (v_max_cl <= 9) { + self->private_impl.f_n_huffs_bits[a_which] = v_max_cl; + } else { + self->private_impl.f_n_huffs_bits[a_which] = 9; + } + v_i = 0; + if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) || (v_n_symbols != ((uint32_t)(v_offsets[15])))) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + if ((a_n_codes0 + ((uint32_t)(v_symbols[0]))) >= 320) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + v_initial_high_bits = 512; + if (v_max_cl < 9) { + v_initial_high_bits = (((uint32_t)(1)) << v_max_cl); + } + v_prev_cl = ((uint32_t)((self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[0])))] & 15))); + v_prev_redirect_key = 4294967295; + v_top = 0; + v_next_top = 512; + v_code = 0; + v_key = 0; + v_value = 0; + while (true) { + if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + v_cl = ((uint32_t)((self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[v_i])))] & 15))); + if (v_cl > v_prev_cl) { + v_code <<= (v_cl - v_prev_cl); + if (v_code >= 32768) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + } + v_prev_cl = v_cl; + v_key = v_code; + if (v_cl > 9) { + v_cl -= 9; + v_redirect_key = ((v_key >> v_cl) & 511); + v_key = ((v_key) & WUFFS_BASE__LOW_BITS_MASK__U32(v_cl)); + if (v_prev_redirect_key != v_redirect_key) { + v_prev_redirect_key = v_redirect_key; + v_remaining = (((uint32_t)(1)) << v_cl); + v_j = v_prev_cl; + while (v_j <= 15) { + if (v_remaining <= ((uint32_t)(v_counts[v_j]))) { + goto label__2__break; + } + v_remaining -= ((uint32_t)(v_counts[v_j])); + if (v_remaining > 1073741824) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + v_remaining <<= 1; + v_j += 1; + } + label__2__break:; + if ((v_j <= 9) || (15 < v_j)) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + v_j -= 9; + v_initial_high_bits = (((uint32_t)(1)) << v_j); + v_top = v_next_top; + if ((v_top + (((uint32_t)(1)) << v_j)) > 1024) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + v_next_top = (v_top + (((uint32_t)(1)) << v_j)); + v_redirect_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_redirect_key >> 1)])) | ((v_redirect_key & 1) << 8)); + self->private_data.f_huffs[a_which][v_redirect_key] = (268435465 | (v_top << 8) | (v_j << 4)); + } + } + if ((v_key >= 512) || (v_counts[v_prev_cl] <= 0)) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + v_counts[v_prev_cl] -= 1; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + v_reversed_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_key >> 1)])) | ((v_key & 1) << 8)); + v_reversed_key >>= (9 - v_cl); + v_symbol = ((uint32_t)(v_symbols[v_i])); + if (v_symbol == 256) { + v_value = (536870912 | v_cl); + } else if ((v_symbol < 256) && (a_which == 0)) { + v_value = (2147483648 | (v_symbol << 8) | v_cl); + } else if (v_symbol >= a_base_symbol) { + v_symbol -= a_base_symbol; + if (a_which == 0) { + v_value = (WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[(v_symbol & 31)] | v_cl); + } else { + v_value = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[(v_symbol & 31)] | v_cl); + } + } else { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + v_high_bits = v_initial_high_bits; + v_delta = (((uint32_t)(1)) << v_cl); + while (v_high_bits >= v_delta) { + v_high_bits -= v_delta; + if ((v_top + ((v_high_bits | v_reversed_key) & 511)) >= 1024) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + self->private_data.f_huffs[a_which][(v_top + ((v_high_bits | v_reversed_key) & 511))] = v_value; + } + v_i += 1; + if (v_i >= v_n_symbols) { + goto label__3__break; + } + v_code += 1; + if (v_code >= 32768) { + return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } + } + label__3__break:; + return wuffs_base__make_status(NULL); +} + +// ‼ WUFFS MULTI-FILE SECTION +x86_bmi2 +// -------- func deflate.decoder.decode_huffman_bmi2 + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2") +static wuffs_base__status +wuffs_deflate__decoder__decode_huffman_bmi2( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint64_t v_bits = 0; + uint32_t v_n_bits = 0; + uint32_t v_table_entry = 0; + uint32_t v_table_entry_n_bits = 0; + uint64_t v_lmask = 0; + uint64_t v_dmask = 0; + uint32_t v_redir_top = 0; + uint32_t v_redir_mask = 0; + uint32_t v_length = 0; + uint32_t v_dist_minus_1 = 0; + uint32_t v_hlen = 0; + uint32_t v_hdist = 0; + uint32_t v_hdist_adjustment = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7)) != 0)) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } + v_bits = ((uint64_t)(self->private_impl.f_bits)); + v_n_bits = self->private_impl.f_n_bits; + v_lmask = ((((uint64_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1); + v_dmask = ((((uint64_t)(1)) << self->private_impl.f_n_huffs_bits[1]) - 1); + if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0)) { + status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); + goto exit; + } + v_hdist_adjustment = ((uint32_t)(((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0)) & 4294967295))); + label__loop__continue:; + while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8)) { + v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63))); + iop_a_src += ((63 - (v_n_bits & 63)) >> 3); + v_n_bits |= 56; + v_table_entry = self->private_data.f_huffs[0][(v_bits & v_lmask)]; + v_table_entry_n_bits = (v_table_entry & 15); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + if ((v_table_entry >> 31) != 0) { + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(((v_table_entry >> 8) & 255)))), iop_a_dst += 1); + goto label__loop__continue; + } else if ((v_table_entry >> 30) != 0) { + } else if ((v_table_entry >> 29) != 0) { + self->private_impl.f_end_of_block = true; + goto label__loop__break; + } else if ((v_table_entry >> 28) != 0) { + v_redir_top = ((v_table_entry >> 8) & 65535); + v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1); + v_table_entry = self->private_data.f_huffs[0][((v_redir_top + (((uint32_t)((v_bits & 4294967295))) & v_redir_mask)) & 1023)]; + v_table_entry_n_bits = (v_table_entry & 15); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + if ((v_table_entry >> 31) != 0) { + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(((v_table_entry >> 8) & 255)))), iop_a_dst += 1); + goto label__loop__continue; + } else if ((v_table_entry >> 30) != 0) { + } else if ((v_table_entry >> 29) != 0) { + self->private_impl.f_end_of_block = true; + goto label__loop__break; + } else if ((v_table_entry >> 28) != 0) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } else if ((v_table_entry >> 27) != 0) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); + goto exit; + } else { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + } else if ((v_table_entry >> 27) != 0) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); + goto exit; + } else { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + v_length = (((v_table_entry >> 8) & 255) + 3); + v_table_entry_n_bits = ((v_table_entry >> 4) & 15); + if (v_table_entry_n_bits > 0) { + v_length = (((v_length + 253 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255) + 3); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + } + v_table_entry = self->private_data.f_huffs[1][(v_bits & v_dmask)]; + v_table_entry_n_bits = (v_table_entry & 15); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + if ((v_table_entry >> 28) == 1) { + v_redir_top = ((v_table_entry >> 8) & 65535); + v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1); + v_table_entry = self->private_data.f_huffs[1][((v_redir_top + (((uint32_t)((v_bits & 4294967295))) & v_redir_mask)) & 1023)]; + v_table_entry_n_bits = (v_table_entry & 15); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + } + if ((v_table_entry >> 24) != 64) { + if ((v_table_entry >> 24) == 8) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); + goto exit; + } + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + v_dist_minus_1 = ((v_table_entry >> 8) & 32767); + v_table_entry_n_bits = ((v_table_entry >> 4) & 15); + v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + while (true) { + if (((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { + v_hlen = 0; + v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); + if (v_length > v_hdist) { + v_length -= v_hdist; + v_hlen = v_hdist; + } else { + v_hlen = v_length; + v_length = 0; + } + v_hdist += v_hdist_adjustment; + if (self->private_impl.f_history_index < v_hdist) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); + goto exit; + } + wuffs_base__io_writer__limited_copy_u32_from_slice( + &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767), 33025)); + if (v_length == 0) { + goto label__loop__continue; + } + if ((((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); + goto exit; + } + } + if ((v_dist_minus_1 + 1) >= 8) { + wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( + &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1)); + } else if ((v_dist_minus_1 + 1) == 1) { + wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( + &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1)); + } else { + wuffs_base__io_writer__limited_copy_u32_from_history_fast( + &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1)); + } + goto label__0__break; + } + label__0__break:; + } + label__loop__break:; + if (v_n_bits > 63) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } + while (v_n_bits >= 8) { + v_n_bits -= 8; + if (iop_a_src > io1_a_src) { + iop_a_src--; + } else { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); + goto exit; + } + } + self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1)) << v_n_bits) - 1)))); + self->private_impl.f_n_bits = v_n_bits; + if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0)) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +// ‼ WUFFS MULTI-FILE SECTION -x86_bmi2 + +// -------- func deflate.decoder.decode_huffman_fast32 + +static wuffs_base__status +wuffs_deflate__decoder__decode_huffman_fast32( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_bits = 0; + uint32_t v_n_bits = 0; + uint32_t v_table_entry = 0; + uint32_t v_table_entry_n_bits = 0; + uint32_t v_lmask = 0; + uint32_t v_dmask = 0; + uint32_t v_redir_top = 0; + uint32_t v_redir_mask = 0; + uint32_t v_length = 0; + uint32_t v_dist_minus_1 = 0; + uint32_t v_hlen = 0; + uint32_t v_hdist = 0; + uint32_t v_hdist_adjustment = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7)) != 0)) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } + v_bits = self->private_impl.f_bits; + v_n_bits = self->private_impl.f_n_bits; + v_lmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1); + v_dmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[1]) - 1); + if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0)) { + status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); + goto exit; + } + v_hdist_adjustment = ((uint32_t)(((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0)) & 4294967295))); + label__loop__continue:; + while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266) && (((uint64_t)(io2_a_src - iop_a_src)) >= 12)) { + if (v_n_bits < 15) { + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + } else { + } + v_table_entry = self->private_data.f_huffs[0][(v_bits & v_lmask)]; + v_table_entry_n_bits = (v_table_entry & 15); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + if ((v_table_entry >> 31) != 0) { + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(((v_table_entry >> 8) & 255)))), iop_a_dst += 1); + goto label__loop__continue; + } else if ((v_table_entry >> 30) != 0) { + } else if ((v_table_entry >> 29) != 0) { + self->private_impl.f_end_of_block = true; + goto label__loop__break; + } else if ((v_table_entry >> 28) != 0) { + if (v_n_bits < 15) { + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + } else { + } + v_redir_top = ((v_table_entry >> 8) & 65535); + v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1); + v_table_entry = self->private_data.f_huffs[0][((v_redir_top + (v_bits & v_redir_mask)) & 1023)]; + v_table_entry_n_bits = (v_table_entry & 15); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + if ((v_table_entry >> 31) != 0) { + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(((v_table_entry >> 8) & 255)))), iop_a_dst += 1); + goto label__loop__continue; + } else if ((v_table_entry >> 30) != 0) { + } else if ((v_table_entry >> 29) != 0) { + self->private_impl.f_end_of_block = true; + goto label__loop__break; + } else if ((v_table_entry >> 28) != 0) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } else if ((v_table_entry >> 27) != 0) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); + goto exit; + } else { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + } else if ((v_table_entry >> 27) != 0) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); + goto exit; + } else { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + v_length = (((v_table_entry >> 8) & 255) + 3); + v_table_entry_n_bits = ((v_table_entry >> 4) & 15); + if (v_table_entry_n_bits > 0) { + if (v_n_bits < 15) { + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + } else { + } + v_length = (((v_length + 253 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255) + 3); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + } else { + } + if (v_n_bits < 15) { + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + } else { + } + v_table_entry = self->private_data.f_huffs[1][(v_bits & v_dmask)]; + v_table_entry_n_bits = (v_table_entry & 15); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + if ((v_table_entry >> 28) == 1) { + if (v_n_bits < 15) { + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + } else { + } + v_redir_top = ((v_table_entry >> 8) & 65535); + v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1); + v_table_entry = self->private_data.f_huffs[1][((v_redir_top + (v_bits & v_redir_mask)) & 1023)]; + v_table_entry_n_bits = (v_table_entry & 15); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + } else { + } + if ((v_table_entry >> 24) != 64) { + if ((v_table_entry >> 24) == 8) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); + goto exit; + } + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + v_dist_minus_1 = ((v_table_entry >> 8) & 32767); + v_table_entry_n_bits = ((v_table_entry >> 4) & 15); + if (v_n_bits < v_table_entry_n_bits) { + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + } + v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + while (true) { + if (((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { + v_hlen = 0; + v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); + if (v_length > v_hdist) { + v_length -= v_hdist; + v_hlen = v_hdist; + } else { + v_hlen = v_length; + v_length = 0; + } + v_hdist += v_hdist_adjustment; + if (self->private_impl.f_history_index < v_hdist) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); + goto exit; + } + wuffs_base__io_writer__limited_copy_u32_from_slice( + &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767), 33025)); + if (v_length == 0) { + goto label__loop__continue; + } + if ((((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); + goto exit; + } + } + if ((v_dist_minus_1 + 1) >= 8) { + wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( + &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1)); + } else { + wuffs_base__io_writer__limited_copy_u32_from_history_fast( + &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1)); + } + goto label__0__break; + } + label__0__break:; + } + label__loop__break:; + while (v_n_bits >= 8) { + v_n_bits -= 8; + if (iop_a_src > io1_a_src) { + iop_a_src--; + } else { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); + goto exit; + } + } + self->private_impl.f_bits = (v_bits & ((((uint32_t)(1)) << v_n_bits) - 1)); + self->private_impl.f_n_bits = v_n_bits; + if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0)) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func deflate.decoder.decode_huffman_fast64 + +static wuffs_base__status +wuffs_deflate__decoder__decode_huffman_fast64( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + return (*self->private_impl.choosy_decode_huffman_fast64)(self, a_dst, a_src); +} + +static wuffs_base__status +wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint64_t v_bits = 0; + uint32_t v_n_bits = 0; + uint32_t v_table_entry = 0; + uint32_t v_table_entry_n_bits = 0; + uint64_t v_lmask = 0; + uint64_t v_dmask = 0; + uint32_t v_redir_top = 0; + uint32_t v_redir_mask = 0; + uint32_t v_length = 0; + uint32_t v_dist_minus_1 = 0; + uint32_t v_hlen = 0; + uint32_t v_hdist = 0; + uint32_t v_hdist_adjustment = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7)) != 0)) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } + v_bits = ((uint64_t)(self->private_impl.f_bits)); + v_n_bits = self->private_impl.f_n_bits; + v_lmask = ((((uint64_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1); + v_dmask = ((((uint64_t)(1)) << self->private_impl.f_n_huffs_bits[1]) - 1); + if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0)) { + status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); + goto exit; + } + v_hdist_adjustment = ((uint32_t)(((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0)) & 4294967295))); + label__loop__continue:; + while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8)) { + v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63))); + iop_a_src += ((63 - (v_n_bits & 63)) >> 3); + v_n_bits |= 56; + v_table_entry = self->private_data.f_huffs[0][(v_bits & v_lmask)]; + v_table_entry_n_bits = (v_table_entry & 15); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + if ((v_table_entry >> 31) != 0) { + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(((v_table_entry >> 8) & 255)))), iop_a_dst += 1); + goto label__loop__continue; + } else if ((v_table_entry >> 30) != 0) { + } else if ((v_table_entry >> 29) != 0) { + self->private_impl.f_end_of_block = true; + goto label__loop__break; + } else if ((v_table_entry >> 28) != 0) { + v_redir_top = ((v_table_entry >> 8) & 65535); + v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1); + v_table_entry = self->private_data.f_huffs[0][((v_redir_top + (((uint32_t)((v_bits & 4294967295))) & v_redir_mask)) & 1023)]; + v_table_entry_n_bits = (v_table_entry & 15); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + if ((v_table_entry >> 31) != 0) { + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(((v_table_entry >> 8) & 255)))), iop_a_dst += 1); + goto label__loop__continue; + } else if ((v_table_entry >> 30) != 0) { + } else if ((v_table_entry >> 29) != 0) { + self->private_impl.f_end_of_block = true; + goto label__loop__break; + } else if ((v_table_entry >> 28) != 0) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } else if ((v_table_entry >> 27) != 0) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); + goto exit; + } else { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + } else if ((v_table_entry >> 27) != 0) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); + goto exit; + } else { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + v_length = (((v_table_entry >> 8) & 255) + 3); + v_table_entry_n_bits = ((v_table_entry >> 4) & 15); + if (v_table_entry_n_bits > 0) { + v_length = (((v_length + 253 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255) + 3); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + } + v_table_entry = self->private_data.f_huffs[1][(v_bits & v_dmask)]; + v_table_entry_n_bits = (v_table_entry & 15); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + if ((v_table_entry >> 28) == 1) { + v_redir_top = ((v_table_entry >> 8) & 65535); + v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1); + v_table_entry = self->private_data.f_huffs[1][((v_redir_top + (((uint32_t)((v_bits & 4294967295))) & v_redir_mask)) & 1023)]; + v_table_entry_n_bits = (v_table_entry & 15); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + } + if ((v_table_entry >> 24) != 64) { + if ((v_table_entry >> 24) == 8) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); + goto exit; + } + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + v_dist_minus_1 = ((v_table_entry >> 8) & 32767); + v_table_entry_n_bits = ((v_table_entry >> 4) & 15); + v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + while (true) { + if (((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { + v_hlen = 0; + v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); + if (v_length > v_hdist) { + v_length -= v_hdist; + v_hlen = v_hdist; + } else { + v_hlen = v_length; + v_length = 0; + } + v_hdist += v_hdist_adjustment; + if (self->private_impl.f_history_index < v_hdist) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); + goto exit; + } + wuffs_base__io_writer__limited_copy_u32_from_slice( + &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767), 33025)); + if (v_length == 0) { + goto label__loop__continue; + } + if ((((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); + goto exit; + } + } + if ((v_dist_minus_1 + 1) >= 8) { + wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( + &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1)); + } else if ((v_dist_minus_1 + 1) == 1) { + wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( + &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1)); + } else { + wuffs_base__io_writer__limited_copy_u32_from_history_fast( + &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1)); + } + goto label__0__break; + } + label__0__break:; + } + label__loop__break:; + if (v_n_bits > 63) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } + while (v_n_bits >= 8) { + v_n_bits -= 8; + if (iop_a_src > io1_a_src) { + iop_a_src--; + } else { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); + goto exit; + } + } + self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1)) << v_n_bits) - 1)))); + self->private_impl.f_n_bits = v_n_bits; + if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0)) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func deflate.decoder.decode_huffman_slow + +static wuffs_base__status +wuffs_deflate__decoder__decode_huffman_slow( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_bits = 0; + uint32_t v_n_bits = 0; + uint32_t v_table_entry = 0; + uint32_t v_table_entry_n_bits = 0; + uint32_t v_lmask = 0; + uint32_t v_dmask = 0; + uint32_t v_b0 = 0; + uint32_t v_redir_top = 0; + uint32_t v_redir_mask = 0; + uint32_t v_b1 = 0; + uint32_t v_length = 0; + uint32_t v_b2 = 0; + uint32_t v_b3 = 0; + uint32_t v_b4 = 0; + uint32_t v_dist_minus_1 = 0; + uint32_t v_b5 = 0; + uint32_t v_n_copied = 0; + uint32_t v_hlen = 0; + uint32_t v_hdist = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow[0]; + if (coro_susp_point) { + v_bits = self->private_data.s_decode_huffman_slow[0].v_bits; + v_n_bits = self->private_data.s_decode_huffman_slow[0].v_n_bits; + v_table_entry_n_bits = self->private_data.s_decode_huffman_slow[0].v_table_entry_n_bits; + v_lmask = self->private_data.s_decode_huffman_slow[0].v_lmask; + v_dmask = self->private_data.s_decode_huffman_slow[0].v_dmask; + v_redir_top = self->private_data.s_decode_huffman_slow[0].v_redir_top; + v_redir_mask = self->private_data.s_decode_huffman_slow[0].v_redir_mask; + v_length = self->private_data.s_decode_huffman_slow[0].v_length; + v_dist_minus_1 = self->private_data.s_decode_huffman_slow[0].v_dist_minus_1; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7)) != 0)) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } + v_bits = self->private_impl.f_bits; + v_n_bits = self->private_impl.f_n_bits; + v_lmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1); + v_dmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[1]) - 1); + label__loop__continue:; + while ( ! (self->private_impl.p_decode_huffman_slow[0] != 0)) { + while (true) { + v_table_entry = self->private_data.f_huffs[0][(v_bits & v_lmask)]; + v_table_entry_n_bits = (v_table_entry & 15); + if (v_n_bits >= v_table_entry_n_bits) { + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + goto label__0__break; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_0 = *iop_a_src++; + v_b0 = t_0; + } + v_bits |= (v_b0 << v_n_bits); + v_n_bits += 8; + } + label__0__break:; + if ((v_table_entry >> 31) != 0) { + self->private_data.s_decode_huffman_slow[0].scratch = ((uint8_t)(((v_table_entry >> 8) & 255))); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (iop_a_dst == io2_a_dst) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + goto suspend; + } + *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow[0].scratch)); + goto label__loop__continue; + } else if ((v_table_entry >> 30) != 0) { + } else if ((v_table_entry >> 29) != 0) { + self->private_impl.f_end_of_block = true; + goto label__loop__break; + } else if ((v_table_entry >> 28) != 0) { + v_redir_top = ((v_table_entry >> 8) & 65535); + v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1); + while (true) { + v_table_entry = self->private_data.f_huffs[0][((v_redir_top + (v_bits & v_redir_mask)) & 1023)]; + v_table_entry_n_bits = (v_table_entry & 15); + if (v_n_bits >= v_table_entry_n_bits) { + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + goto label__1__break; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_1 = *iop_a_src++; + v_b1 = t_1; + } + v_bits |= (v_b1 << v_n_bits); + v_n_bits += 8; + } + label__1__break:; + if ((v_table_entry >> 31) != 0) { + self->private_data.s_decode_huffman_slow[0].scratch = ((uint8_t)(((v_table_entry >> 8) & 255))); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (iop_a_dst == io2_a_dst) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + goto suspend; + } + *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow[0].scratch)); + goto label__loop__continue; + } else if ((v_table_entry >> 30) != 0) { + } else if ((v_table_entry >> 29) != 0) { + self->private_impl.f_end_of_block = true; + goto label__loop__break; + } else if ((v_table_entry >> 28) != 0) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } else if ((v_table_entry >> 27) != 0) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); + goto exit; + } else { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + } else if ((v_table_entry >> 27) != 0) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); + goto exit; + } else { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + v_length = (((v_table_entry >> 8) & 255) + 3); + v_table_entry_n_bits = ((v_table_entry >> 4) & 15); + if (v_table_entry_n_bits > 0) { + while (v_n_bits < v_table_entry_n_bits) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_2 = *iop_a_src++; + v_b2 = t_2; + } + v_bits |= (v_b2 << v_n_bits); + v_n_bits += 8; + } + v_length = (((v_length + 253 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255) + 3); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + } + while (true) { + v_table_entry = self->private_data.f_huffs[1][(v_bits & v_dmask)]; + v_table_entry_n_bits = (v_table_entry & 15); + if (v_n_bits >= v_table_entry_n_bits) { + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + goto label__2__break; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_3 = *iop_a_src++; + v_b3 = t_3; + } + v_bits |= (v_b3 << v_n_bits); + v_n_bits += 8; + } + label__2__break:; + if ((v_table_entry >> 28) == 1) { + v_redir_top = ((v_table_entry >> 8) & 65535); + v_redir_mask = ((((uint32_t)(1)) << ((v_table_entry >> 4) & 15)) - 1); + while (true) { + v_table_entry = self->private_data.f_huffs[1][((v_redir_top + (v_bits & v_redir_mask)) & 1023)]; + v_table_entry_n_bits = (v_table_entry & 15); + if (v_n_bits >= v_table_entry_n_bits) { + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + goto label__3__break; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_4 = *iop_a_src++; + v_b4 = t_4; + } + v_bits |= (v_b4 << v_n_bits); + v_n_bits += 8; + } + label__3__break:; + } + if ((v_table_entry >> 24) != 64) { + if ((v_table_entry >> 24) == 8) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); + goto exit; + } + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } + v_dist_minus_1 = ((v_table_entry >> 8) & 32767); + v_table_entry_n_bits = ((v_table_entry >> 4) & 15); + if (v_table_entry_n_bits > 0) { + while (v_n_bits < v_table_entry_n_bits) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_5 = *iop_a_src++; + v_b5 = t_5; + } + v_bits |= (v_b5 << v_n_bits); + v_n_bits += 8; + } + v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767); + v_bits >>= v_table_entry_n_bits; + v_n_bits -= v_table_entry_n_bits; + } + label__inner__continue:; + while (true) { + if (((uint64_t)((v_dist_minus_1 + 1))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { + v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); + if (v_hdist < v_length) { + v_hlen = v_hdist; + } else { + v_hlen = v_length; + } + v_hdist += ((uint32_t)((((uint64_t)(self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0))) & 4294967295))); + if (self->private_impl.f_history_index < v_hdist) { + status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); + goto exit; + } + v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_slice( + &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767), 33025)); + if (v_n_copied < v_hlen) { + v_length -= v_n_copied; + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); + goto label__inner__continue; + } + v_length -= v_hlen; + if (v_length == 0) { + goto label__loop__continue; + } + } + v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_history( + &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1)); + if (v_length <= v_n_copied) { + goto label__loop__continue; + } + v_length -= v_n_copied; + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); + } + } + label__loop__break:; + self->private_impl.f_bits = v_bits; + self->private_impl.f_n_bits = v_n_bits; + if ((self->private_impl.f_n_bits >= 8) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7)) != 0)) { + status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } + + ok: + self->private_impl.p_decode_huffman_slow[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_huffman_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_decode_huffman_slow[0].v_bits = v_bits; + self->private_data.s_decode_huffman_slow[0].v_n_bits = v_n_bits; + self->private_data.s_decode_huffman_slow[0].v_table_entry_n_bits = v_table_entry_n_bits; + self->private_data.s_decode_huffman_slow[0].v_lmask = v_lmask; + self->private_data.s_decode_huffman_slow[0].v_dmask = v_dmask; + self->private_data.s_decode_huffman_slow[0].v_redir_top = v_redir_top; + self->private_data.s_decode_huffman_slow[0].v_redir_mask = v_redir_mask; + self->private_data.s_decode_huffman_slow[0].v_length = v_length; + self->private_data.s_decode_huffman_slow[0].v_dist_minus_1 = v_dist_minus_1; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) + +// ---------------- Status Codes Implementations + +const char wuffs_lzw__error__bad_code[] = "#lzw: bad code"; +const char wuffs_lzw__error__truncated_input[] = "#lzw: truncated input"; +const char wuffs_lzw__error__internal_error_inconsistent_i_o[] = "#lzw: internal error: inconsistent I/O"; + +// ---------------- Private Consts + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__empty_struct +wuffs_lzw__decoder__read_from( + wuffs_lzw__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_lzw__decoder__write_to( + wuffs_lzw__decoder* self, + wuffs_base__io_buffer* a_dst); + +// ---------------- VTables + +const wuffs_base__io_transformer__func_ptrs +wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer = { + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_lzw__decoder__set_quirk_enabled), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__io_buffer*, + wuffs_base__slice_u8))(&wuffs_lzw__decoder__transform_io), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzw__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_lzw__decoder__initialize( + wuffs_lzw__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = + wuffs_base__io_transformer__vtable_name; + self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = + (const void*)(&wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer); + return wuffs_base__make_status(NULL); +} + +wuffs_lzw__decoder* +wuffs_lzw__decoder__alloc() { + wuffs_lzw__decoder* x = + (wuffs_lzw__decoder*)(calloc(1, sizeof(wuffs_lzw__decoder))); + if (!x) { + return NULL; + } + if (wuffs_lzw__decoder__initialize( + x, sizeof(wuffs_lzw__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_lzw__decoder() { + return sizeof(wuffs_lzw__decoder); +} + +// ---------------- Function Implementations + +// -------- func lzw.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_lzw__decoder__set_quirk_enabled( + wuffs_lzw__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__make_empty_struct(); +} + +// -------- func lzw.decoder.set_literal_width + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_lzw__decoder__set_literal_width( + wuffs_lzw__decoder* self, + uint32_t a_lw) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + if (a_lw > 8) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_empty_struct(); + } + + self->private_impl.f_set_literal_width_arg = (a_lw + 1); + return wuffs_base__make_empty_struct(); +} + +// -------- func lzw.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_lzw__decoder__workbuf_len( + const wuffs_lzw__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__make_range_ii_u64(0, 0); +} + +// -------- func lzw.decoder.transform_io + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_lzw__decoder__transform_io( + wuffs_lzw__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_i = 0; + + uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + self->private_impl.f_literal_width = 8; + if (self->private_impl.f_set_literal_width_arg > 0) { + self->private_impl.f_literal_width = (self->private_impl.f_set_literal_width_arg - 1); + } + self->private_impl.f_clear_code = (((uint32_t)(1)) << self->private_impl.f_literal_width); + self->private_impl.f_end_code = (self->private_impl.f_clear_code + 1); + self->private_impl.f_save_code = self->private_impl.f_end_code; + self->private_impl.f_prev_code = self->private_impl.f_end_code; + self->private_impl.f_width = (self->private_impl.f_literal_width + 1); + self->private_impl.f_bits = 0; + self->private_impl.f_n_bits = 0; + self->private_impl.f_output_ri = 0; + self->private_impl.f_output_wi = 0; + v_i = 0; + while (v_i < self->private_impl.f_clear_code) { + self->private_data.f_lm1s[v_i] = 0; + self->private_data.f_suffixes[v_i][0] = ((uint8_t)(v_i)); + v_i += 1; + } + label__0__continue:; + while (true) { + wuffs_lzw__decoder__read_from(self, a_src); + if (self->private_impl.f_output_wi > 0) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_lzw__decoder__write_to(self, a_dst); + if (status.repr) { + goto suspend; + } + } + if (self->private_impl.f_read_from_return_value == 0) { + goto label__0__break; + } else if (self->private_impl.f_read_from_return_value == 1) { + goto label__0__continue; + } else if (self->private_impl.f_read_from_return_value == 2) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + } else if (self->private_impl.f_read_from_return_value == 3) { + status = wuffs_base__make_status(wuffs_lzw__error__truncated_input); + goto exit; + } else if (self->private_impl.f_read_from_return_value == 4) { + status = wuffs_base__make_status(wuffs_lzw__error__bad_code); + goto exit; + } else { + status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); + goto exit; + } + } + label__0__break:; + + ok: + self->private_impl.p_transform_io[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func lzw.decoder.read_from + +static wuffs_base__empty_struct +wuffs_lzw__decoder__read_from( + wuffs_lzw__decoder* self, + wuffs_base__io_buffer* a_src) { + uint32_t v_clear_code = 0; + uint32_t v_end_code = 0; + uint32_t v_save_code = 0; + uint32_t v_prev_code = 0; + uint32_t v_width = 0; + uint32_t v_bits = 0; + uint32_t v_n_bits = 0; + uint32_t v_output_wi = 0; + uint32_t v_code = 0; + uint32_t v_c = 0; + uint32_t v_o = 0; + uint32_t v_steps = 0; + uint8_t v_first_byte = 0; + uint16_t v_lm1_b = 0; + uint16_t v_lm1_a = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + v_clear_code = self->private_impl.f_clear_code; + v_end_code = self->private_impl.f_end_code; + v_save_code = self->private_impl.f_save_code; + v_prev_code = self->private_impl.f_prev_code; + v_width = self->private_impl.f_width; + v_bits = self->private_impl.f_bits; + v_n_bits = self->private_impl.f_n_bits; + v_output_wi = self->private_impl.f_output_wi; + while (true) { + if (v_n_bits < v_width) { + if (((uint64_t)(io2_a_src - iop_a_src)) >= 4) { + v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); + iop_a_src += ((31 - v_n_bits) >> 3); + v_n_bits |= 24; + } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if (a_src && a_src->meta.closed) { + self->private_impl.f_read_from_return_value = 3; + } else { + self->private_impl.f_read_from_return_value = 2; + } + goto label__0__break; + } else { + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + if (v_n_bits >= v_width) { + } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if (a_src && a_src->meta.closed) { + self->private_impl.f_read_from_return_value = 3; + } else { + self->private_impl.f_read_from_return_value = 2; + } + goto label__0__break; + } else { + v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); + iop_a_src += 1; + v_n_bits += 8; + if (v_n_bits < v_width) { + self->private_impl.f_read_from_return_value = 5; + goto label__0__break; + } + } + } + } + v_code = ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_width)); + v_bits >>= v_width; + v_n_bits -= v_width; + if (v_code < v_clear_code) { + self->private_data.f_output[v_output_wi] = ((uint8_t)(v_code)); + v_output_wi = ((v_output_wi + 1) & 8191); + if (v_save_code <= 4095) { + v_lm1_a = (((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1)) & 4095); + self->private_data.f_lm1s[v_save_code] = v_lm1_a; + if ((v_lm1_a % 8) != 0) { + self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; + memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); + self->private_data.f_suffixes[v_save_code][(v_lm1_a % 8)] = ((uint8_t)(v_code)); + } else { + self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); + self->private_data.f_suffixes[v_save_code][0] = ((uint8_t)(v_code)); + } + v_save_code += 1; + if (v_width < 12) { + v_width += (1 & (v_save_code >> v_width)); + } + v_prev_code = v_code; + } + } else if (v_code <= v_end_code) { + if (v_code == v_end_code) { + self->private_impl.f_read_from_return_value = 0; + goto label__0__break; + } + v_save_code = v_end_code; + v_prev_code = v_end_code; + v_width = (self->private_impl.f_literal_width + 1); + } else if (v_code <= v_save_code) { + v_c = v_code; + if (v_code == v_save_code) { + v_c = v_prev_code; + } + v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lm1s[v_c])) & 4294967288)) & 8191); + v_output_wi = ((v_output_wi + 1 + ((uint32_t)(self->private_data.f_lm1s[v_c]))) & 8191); + v_steps = (((uint32_t)(self->private_data.f_lm1s[v_c])) >> 3); + while (true) { + memcpy((self->private_data.f_output)+(v_o), (self->private_data.f_suffixes[v_c]), 8); + if (v_steps <= 0) { + goto label__1__break; + } + v_steps -= 1; + v_o = (((uint32_t)(v_o - 8)) & 8191); + v_c = ((uint32_t)(self->private_impl.f_prefixes[v_c])); + } + label__1__break:; + v_first_byte = self->private_data.f_suffixes[v_c][0]; + if (v_code == v_save_code) { + self->private_data.f_output[v_output_wi] = v_first_byte; + v_output_wi = ((v_output_wi + 1) & 8191); + } + if (v_save_code <= 4095) { + v_lm1_b = (((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1)) & 4095); + self->private_data.f_lm1s[v_save_code] = v_lm1_b; + if ((v_lm1_b % 8) != 0) { + self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; + memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); + self->private_data.f_suffixes[v_save_code][(v_lm1_b % 8)] = v_first_byte; + } else { + self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); + self->private_data.f_suffixes[v_save_code][0] = ((uint8_t)(v_first_byte)); + } + v_save_code += 1; + if (v_width < 12) { + v_width += (1 & (v_save_code >> v_width)); + } + v_prev_code = v_code; + } + } else { + self->private_impl.f_read_from_return_value = 4; + goto label__0__break; + } + if (v_output_wi > 4095) { + self->private_impl.f_read_from_return_value = 1; + goto label__0__break; + } + } + label__0__break:; + if (self->private_impl.f_read_from_return_value != 2) { + while (v_n_bits >= 8) { + v_n_bits -= 8; + if (iop_a_src > io1_a_src) { + iop_a_src--; + } else { + self->private_impl.f_read_from_return_value = 5; + goto label__2__break; + } + } + label__2__break:; + } + self->private_impl.f_save_code = v_save_code; + self->private_impl.f_prev_code = v_prev_code; + self->private_impl.f_width = v_width; + self->private_impl.f_bits = v_bits; + self->private_impl.f_n_bits = v_n_bits; + self->private_impl.f_output_wi = v_output_wi; + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return wuffs_base__make_empty_struct(); +} + +// -------- func lzw.decoder.write_to + +static wuffs_base__status +wuffs_lzw__decoder__write_to( + wuffs_lzw__decoder* self, + wuffs_base__io_buffer* a_dst) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__slice_u8 v_s = {0}; + uint64_t v_n = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + + uint32_t coro_susp_point = self->private_impl.p_write_to[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (self->private_impl.f_output_wi > 0) { + if (self->private_impl.f_output_ri > self->private_impl.f_output_wi) { + status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); + goto exit; + } + v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output, + self->private_impl.f_output_ri, + self->private_impl.f_output_wi); + v_n = wuffs_base__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,v_s); + if (v_n == ((uint64_t)(v_s.len))) { + self->private_impl.f_output_ri = 0; + self->private_impl.f_output_wi = 0; + status = wuffs_base__make_status(NULL); + goto ok; + } + self->private_impl.f_output_ri = (((uint32_t)(self->private_impl.f_output_ri + ((uint32_t)((v_n & 4294967295))))) & 8191); + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_write_to[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_write_to[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + + return status; +} + +// -------- func lzw.decoder.flush + +WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 +wuffs_lzw__decoder__flush( + wuffs_lzw__decoder* self) { + if (!self) { + return wuffs_base__make_slice_u8(NULL, 0); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_slice_u8(NULL, 0); + } + + wuffs_base__slice_u8 v_s = {0}; + + if (self->private_impl.f_output_ri <= self->private_impl.f_output_wi) { + v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output, + self->private_impl.f_output_ri, + self->private_impl.f_output_wi); + } + self->private_impl.f_output_ri = 0; + self->private_impl.f_output_wi = 0; + return v_s; +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) + +// ---------------- Status Codes Implementations + +const char wuffs_gif__error__bad_extension_label[] = "#gif: bad extension label"; +const char wuffs_gif__error__bad_frame_size[] = "#gif: bad frame size"; +const char wuffs_gif__error__bad_graphic_control[] = "#gif: bad graphic control"; +const char wuffs_gif__error__bad_header[] = "#gif: bad header"; +const char wuffs_gif__error__bad_literal_width[] = "#gif: bad literal width"; +const char wuffs_gif__error__bad_palette[] = "#gif: bad palette"; +const char wuffs_gif__error__truncated_input[] = "#gif: truncated input"; +const char wuffs_gif__error__internal_error_inconsistent_ri_wi[] = "#gif: internal error: inconsistent ri/wi"; + +// ---------------- Private Consts + +static const uint32_t +WUFFS_GIF__INTERLACE_START[5] WUFFS_BASE__POTENTIALLY_UNUSED = { + 4294967295, 1, 2, 4, 0, +}; + +static const uint8_t +WUFFS_GIF__INTERLACE_DELTA[5] WUFFS_BASE__POTENTIALLY_UNUSED = { + 1, 2, 4, 8, 8, +}; + +static const uint8_t +WUFFS_GIF__INTERLACE_COUNT[5] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 1, 2, 4, 8, +}; + +static const uint8_t +WUFFS_GIF__ANIMEXTS1DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { + 65, 78, 73, 77, 69, 88, 84, 83, + 49, 46, 48, +}; + +static const uint8_t +WUFFS_GIF__NETSCAPE2DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { + 78, 69, 84, 83, 67, 65, 80, 69, + 50, 46, 48, +}; + +static const uint8_t +WUFFS_GIF__ICCRGBG1012[11] WUFFS_BASE__POTENTIALLY_UNUSED = { + 73, 67, 67, 82, 71, 66, 71, 49, + 48, 49, 50, +}; + +static const uint8_t +WUFFS_GIF__XMPDATAXMP[11] WUFFS_BASE__POTENTIALLY_UNUSED = { + 88, 77, 80, 32, 68, 97, 116, 97, + 88, 77, 80, +}; + +#define WUFFS_GIF__QUIRKS_BASE 1041635328 + +#define WUFFS_GIF__QUIRKS_COUNT 7 + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__status +wuffs_gif__decoder__do_decode_image_config( + wuffs_gif__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_gif__decoder__do_tell_me_more( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_gif__decoder__do_decode_frame_config( + wuffs_gif__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_gif__decoder__skip_frame( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_gif__decoder__do_decode_frame( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +static wuffs_base__empty_struct +wuffs_gif__decoder__reset_gc( + wuffs_gif__decoder* self); + +static wuffs_base__status +wuffs_gif__decoder__decode_up_to_id_part1( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_gif__decoder__decode_header( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_gif__decoder__decode_lsd( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_gif__decoder__decode_extension( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_gif__decoder__skip_blocks( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_gif__decoder__decode_ae( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_gif__decoder__decode_gc( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_gif__decoder__decode_id_part0( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_gif__decoder__decode_id_part1( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend); + +static wuffs_base__status +wuffs_gif__decoder__decode_id_part2( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +static wuffs_base__status +wuffs_gif__decoder__copy_to_image_buffer( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_pb, + wuffs_base__slice_u8 a_src); + +// ---------------- VTables + +const wuffs_base__image_decoder__func_ptrs +wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder = { + (wuffs_base__status(*)(void*, + wuffs_base__pixel_buffer*, + wuffs_base__io_buffer*, + wuffs_base__pixel_blend, + wuffs_base__slice_u8, + wuffs_base__decode_frame_options*))(&wuffs_gif__decoder__decode_frame), + (wuffs_base__status(*)(void*, + wuffs_base__frame_config*, + wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_frame_config), + (wuffs_base__status(*)(void*, + wuffs_base__image_config*, + wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_image_config), + (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_gif__decoder__frame_dirty_rect), + (uint32_t(*)(const void*))(&wuffs_gif__decoder__num_animation_loops), + (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frame_configs), + (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frames), + (wuffs_base__status(*)(void*, + uint64_t, + uint64_t))(&wuffs_gif__decoder__restart_frame), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_gif__decoder__set_quirk_enabled), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_gif__decoder__set_report_metadata), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__more_information*, + wuffs_base__io_buffer*))(&wuffs_gif__decoder__tell_me_more), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gif__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_gif__decoder__initialize( + wuffs_gif__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + { + wuffs_base__status z = wuffs_lzw__decoder__initialize( + &self->private_data.f_lzw, sizeof(self->private_data.f_lzw), WUFFS_VERSION, options); + if (z.repr) { + return z; + } + } + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = + wuffs_base__image_decoder__vtable_name; + self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = + (const void*)(&wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder); + return wuffs_base__make_status(NULL); +} + +wuffs_gif__decoder* +wuffs_gif__decoder__alloc() { + wuffs_gif__decoder* x = + (wuffs_gif__decoder*)(calloc(1, sizeof(wuffs_gif__decoder))); + if (!x) { + return NULL; + } + if (wuffs_gif__decoder__initialize( + x, sizeof(wuffs_gif__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_gif__decoder() { + return sizeof(wuffs_gif__decoder); +} + +// ---------------- Function Implementations + +// -------- func gif.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_gif__decoder__set_quirk_enabled( + wuffs_gif__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + if ((self->private_impl.f_call_sequence == 0) && (a_quirk >= 1041635328)) { + a_quirk -= 1041635328; + if (a_quirk < 7) { + self->private_impl.f_quirks[a_quirk] = a_enabled; + } + } + return wuffs_base__make_empty_struct(); +} + +// -------- func gif.decoder.decode_image_config + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_gif__decoder__decode_image_config( + wuffs_gif__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_image_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_gif__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_image_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func gif.decoder.do_decode_image_config + +static wuffs_base__status +wuffs_gif__decoder__do_decode_image_config( + wuffs_gif__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + bool v_ffio = false; + + uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence != 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } else if ( ! self->private_impl.f_seen_header) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_gif__decoder__decode_header(self, a_src); + if (status.repr) { + goto suspend; + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + status = wuffs_gif__decoder__decode_lsd(self, a_src); + if (status.repr) { + goto suspend; + } + self->private_impl.f_seen_header = true; + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); + if (status.repr) { + goto suspend; + } + v_ffio = ! self->private_impl.f_gc_has_transparent_index; + if ( ! self->private_impl.f_quirks[2]) { + v_ffio = (v_ffio && + (self->private_impl.f_frame_rect_x0 == 0) && + (self->private_impl.f_frame_rect_y0 == 0) && + (self->private_impl.f_frame_rect_x1 == self->private_impl.f_width) && + (self->private_impl.f_frame_rect_y1 == self->private_impl.f_height)); + } else if (v_ffio) { + self->private_impl.f_black_color_u32_argb_premul = 4278190080; + } + if (self->private_impl.f_background_color_u32_argb_premul == 77) { + self->private_impl.f_background_color_u32_argb_premul = self->private_impl.f_black_color_u32_argb_premul; + } + if (a_dst != NULL) { + wuffs_base__image_config__set( + a_dst, + 2198077448, + 0, + self->private_impl.f_width, + self->private_impl.f_height, + self->private_impl.f_frame_config_io_position, + v_ffio); + } + if (self->private_impl.f_call_sequence == 0) { + self->private_impl.f_call_sequence = 32; + } + + goto ok; + ok: + self->private_impl.p_do_decode_image_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + return status; +} + +// -------- func gif.decoder.set_report_metadata + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_gif__decoder__set_report_metadata( + wuffs_gif__decoder* self, + uint32_t a_fourcc, + bool a_report) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + if (a_fourcc == 1229144912) { + self->private_impl.f_report_metadata_iccp = a_report; + } else if (a_fourcc == 1481461792) { + self->private_impl.f_report_metadata_xmp = a_report; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func gif.decoder.tell_me_more + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_gif__decoder__tell_me_more( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_gif__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_gif__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_tell_me_more[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func gif.decoder.do_tell_me_more + +static wuffs_base__status +wuffs_gif__decoder__do_tell_me_more( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint64_t v_chunk_length = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if ((self->private_impl.f_call_sequence & 16) == 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } + if (self->private_impl.f_metadata_fourcc == 0) { + status = wuffs_base__make_status(wuffs_base__error__no_more_information); + goto exit; + } + while (true) { + label__0__continue:; + while (true) { + if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_io_position) { + if (a_minfo != NULL) { + wuffs_base__more_information__set(a_minfo, + 2, + 0, + self->private_impl.f_metadata_io_position, + 0, + 0); + } + status = wuffs_base__make_status(wuffs_base__suspension__mispositioned_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + goto label__0__continue; + } + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if (a_minfo != NULL) { + wuffs_base__more_information__set(a_minfo, + 0, + 0, + 0, + 0, + 0); + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + goto label__0__continue; + } + goto label__0__break; + } + label__0__break:; + v_chunk_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); + if (v_chunk_length <= 0) { + iop_a_src += 1; + goto label__1__break; + } + if (self->private_impl.f_metadata_fourcc == 1481461792) { + v_chunk_length += 1; + } else { + iop_a_src += 1; + } + self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), v_chunk_length); + if (a_minfo != NULL) { + wuffs_base__more_information__set(a_minfo, + 3, + self->private_impl.f_metadata_fourcc, + 0, + wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), + self->private_impl.f_metadata_io_position); + } + status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + } + label__1__break:; + if (a_minfo != NULL) { + wuffs_base__more_information__set(a_minfo, + 3, + self->private_impl.f_metadata_fourcc, + 0, + self->private_impl.f_metadata_io_position, + self->private_impl.f_metadata_io_position); + } + self->private_impl.f_call_sequence &= 239; + self->private_impl.f_metadata_fourcc = 0; + self->private_impl.f_metadata_io_position = 0; + status = wuffs_base__make_status(NULL); + goto ok; + + ok: + self->private_impl.p_do_tell_me_more[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.num_animation_loops + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_gif__decoder__num_animation_loops( + const wuffs_gif__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + if (self->private_impl.f_seen_num_animation_loops_value) { + return self->private_impl.f_num_animation_loops_value; + } + if (self->private_impl.f_num_decoded_frame_configs_value > 1) { + return 1; + } + return 0; +} + +// -------- func gif.decoder.num_decoded_frame_configs + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_gif__decoder__num_decoded_frame_configs( + const wuffs_gif__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + return self->private_impl.f_num_decoded_frame_configs_value; +} + +// -------- func gif.decoder.num_decoded_frames + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_gif__decoder__num_decoded_frames( + const wuffs_gif__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + return self->private_impl.f_num_decoded_frames_value; +} + +// -------- func gif.decoder.frame_dirty_rect + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_gif__decoder__frame_dirty_rect( + const wuffs_gif__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + + return wuffs_base__utility__make_rect_ie_u32( + wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), + wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), + wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), + wuffs_base__u32__min(self->private_impl.f_dirty_max_excl_y, self->private_impl.f_height)); +} + +// -------- func gif.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_gif__decoder__workbuf_len( + const wuffs_gif__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__make_range_ii_u64(0, 0); +} + +// -------- func gif.decoder.restart_frame + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_gif__decoder__restart_frame( + wuffs_gif__decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + if (self->private_impl.f_call_sequence < 32) { + return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + } else if (a_io_position == 0) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + self->private_impl.f_delayed_num_decoded_frames = false; + self->private_impl.f_frame_config_io_position = a_io_position; + self->private_impl.f_num_decoded_frame_configs_value = a_index; + self->private_impl.f_num_decoded_frames_value = a_index; + wuffs_gif__decoder__reset_gc(self); + self->private_impl.f_call_sequence = 40; + return wuffs_base__make_status(NULL); +} + +// -------- func gif.decoder.decode_frame_config + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_gif__decoder__decode_frame_config( + wuffs_gif__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 3)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_gif__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_frame_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func gif.decoder.do_decode_frame_config + +static wuffs_base__status +wuffs_gif__decoder__do_decode_frame_config( + wuffs_gif__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_background_color = 0; + uint8_t v_flags = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; + if (coro_susp_point) { + v_background_color = self->private_data.s_do_decode_frame_config[0].v_background_color; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + self->private_impl.f_dirty_max_excl_y = 0; + if ((self->private_impl.f_call_sequence & 16) != 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } else if (self->private_impl.f_call_sequence == 32) { + } else if (self->private_impl.f_call_sequence < 32) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_gif__decoder__do_decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else if (self->private_impl.f_call_sequence == 40) { + if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { + status = wuffs_base__make_status(wuffs_base__error__bad_restart); + goto exit; + } + } else if (self->private_impl.f_call_sequence == 64) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + status = wuffs_gif__decoder__skip_frame(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + if (self->private_impl.f_call_sequence >= 96) { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + if ((self->private_impl.f_num_decoded_frame_configs_value > 0) || (self->private_impl.f_call_sequence == 40)) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + if (self->private_impl.f_call_sequence >= 96) { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + } + v_background_color = self->private_impl.f_black_color_u32_argb_premul; + if ( ! self->private_impl.f_gc_has_transparent_index) { + v_background_color = self->private_impl.f_background_color_u32_argb_premul; + if (self->private_impl.f_quirks[1] && (self->private_impl.f_num_decoded_frame_configs_value == 0)) { + while (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); + } + v_flags = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + if ((v_flags & 128) != 0) { + v_background_color = self->private_impl.f_black_color_u32_argb_premul; + } + } + } + if (a_dst != NULL) { + wuffs_base__frame_config__set( + a_dst, + wuffs_base__utility__make_rect_ie_u32( + wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), + wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), + wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), + wuffs_base__u32__min(self->private_impl.f_frame_rect_y1, self->private_impl.f_height)), + ((wuffs_base__flicks)(self->private_impl.f_gc_duration)), + self->private_impl.f_num_decoded_frame_configs_value, + self->private_impl.f_frame_config_io_position, + self->private_impl.f_gc_disposal, + ! self->private_impl.f_gc_has_transparent_index, + false, + v_background_color); + } + wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1); + self->private_impl.f_call_sequence = 64; + + ok: + self->private_impl.p_do_decode_frame_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_do_decode_frame_config[0].v_background_color = v_background_color; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.skip_frame + +static wuffs_base__status +wuffs_gif__decoder__skip_frame( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_flags = 0; + uint8_t v_lw = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_skip_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_flags = t_0; + } + if ((v_flags & 128) != 0) { + self->private_data.s_skip_frame[0].scratch = (((uint32_t)(3)) << (1 + (v_flags & 7))); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_skip_frame[0].scratch; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + v_lw = t_1; + } + if (v_lw > 8) { + status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + status = wuffs_gif__decoder__skip_blocks(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + if (self->private_impl.f_quirks[0]) { + self->private_impl.f_delayed_num_decoded_frames = true; + } else { + wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1); + } + wuffs_gif__decoder__reset_gc(self); + self->private_impl.f_call_sequence = 32; + + goto ok; + ok: + self->private_impl.p_skip_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_skip_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.decode_frame + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_gif__decoder__decode_frame( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 4)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame(self, + a_dst, + a_src, + a_blend, + a_workbuf, + a_opts); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_gif__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func gif.decoder.do_decode_frame + +static wuffs_base__status +wuffs_gif__decoder__do_decode_frame( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence == 64) { + } else if (self->private_impl.f_call_sequence < 64) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_gif__decoder__do_decode_frame_config(self, NULL, a_src); + if (status.repr) { + goto suspend; + } + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + if (self->private_impl.f_quirks[5] && ((self->private_impl.f_frame_rect_x0 == self->private_impl.f_frame_rect_x1) || (self->private_impl.f_frame_rect_y0 == self->private_impl.f_frame_rect_y1))) { + status = wuffs_base__make_status(wuffs_gif__error__bad_frame_size); + goto exit; + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + status = wuffs_gif__decoder__decode_id_part1(self, a_dst, a_src, a_blend); + if (status.repr) { + goto suspend; + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + status = wuffs_gif__decoder__decode_id_part2(self, a_dst, a_src, a_workbuf); + if (status.repr) { + goto suspend; + } + wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1); + wuffs_gif__decoder__reset_gc(self); + self->private_impl.f_call_sequence = 32; + + ok: + self->private_impl.p_do_decode_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + return status; +} + +// -------- func gif.decoder.reset_gc + +static wuffs_base__empty_struct +wuffs_gif__decoder__reset_gc( + wuffs_gif__decoder* self) { + self->private_impl.f_gc_has_transparent_index = false; + self->private_impl.f_gc_transparent_index = 0; + self->private_impl.f_gc_disposal = 0; + self->private_impl.f_gc_duration = 0; + return wuffs_base__make_empty_struct(); +} + +// -------- func gif.decoder.decode_up_to_id_part1 + +static wuffs_base__status +wuffs_gif__decoder__decode_up_to_id_part1( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_block_type = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_up_to_id_part1[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if ((self->private_impl.f_frame_config_io_position == 0) || (self->private_impl.f_num_decoded_frame_configs_value > 0)) { + self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); + } + while (true) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_block_type = t_0; + } + if (v_block_type == 33) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + status = wuffs_gif__decoder__decode_extension(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else if (v_block_type == 44) { + if (self->private_impl.f_delayed_num_decoded_frames) { + self->private_impl.f_delayed_num_decoded_frames = false; + wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1); + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + status = wuffs_gif__decoder__decode_id_part0(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + goto label__0__break; + } else { + if (self->private_impl.f_delayed_num_decoded_frames) { + self->private_impl.f_delayed_num_decoded_frames = false; + wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1); + } + self->private_impl.f_call_sequence = 96; + goto label__0__break; + } + } + label__0__break:; + + goto ok; + ok: + self->private_impl.p_decode_up_to_id_part1[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_up_to_id_part1[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.decode_header + +static wuffs_base__status +wuffs_gif__decoder__decode_header( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c[6] = {0}; + uint32_t v_i = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_header[0]; + if (coro_susp_point) { + memcpy(v_c, self->private_data.s_decode_header[0].v_c, sizeof(v_c)); + v_i = self->private_data.s_decode_header[0].v_i; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (v_i < 6) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c[v_i] = t_0; + } + v_i += 1; + } + if ((v_c[0] != 71) || + (v_c[1] != 73) || + (v_c[2] != 70) || + (v_c[3] != 56) || + ((v_c[4] != 55) && (v_c[4] != 57)) || + (v_c[5] != 97)) { + status = wuffs_base__make_status(wuffs_gif__error__bad_header); + goto exit; + } + + goto ok; + ok: + self->private_impl.p_decode_header[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_header[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + memcpy(self->private_data.s_decode_header[0].v_c, v_c, sizeof(v_c)); + self->private_data.s_decode_header[0].v_i = v_i; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.decode_lsd + +static wuffs_base__status +wuffs_gif__decoder__decode_lsd( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_flags = 0; + uint8_t v_background_color_index = 0; + uint32_t v_num_palette_entries = 0; + uint32_t v_i = 0; + uint32_t v_j = 0; + uint32_t v_argb = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_lsd[0]; + if (coro_susp_point) { + v_flags = self->private_data.s_decode_lsd[0].v_flags; + v_background_color_index = self->private_data.s_decode_lsd[0].v_background_color_index; + v_num_palette_entries = self->private_data.s_decode_lsd[0].v_num_palette_entries; + v_i = self->private_data.s_decode_lsd[0].v_i; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_decode_lsd[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; + if (num_bits_0 == 8) { + t_0 = ((uint32_t)(*scratch)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } + self->private_impl.f_width = t_0; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_decode_lsd[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; + if (num_bits_1 == 8) { + t_1 = ((uint32_t)(*scratch)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } + self->private_impl.f_height = t_1; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + v_flags = t_2; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; + v_background_color_index = t_3; + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src++; + v_i = 0; + self->private_impl.f_has_global_palette = ((v_flags & 128) != 0); + if (self->private_impl.f_has_global_palette) { + v_num_palette_entries = (((uint32_t)(1)) << (1 + (v_flags & 7))); + while (v_i < v_num_palette_entries) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + uint32_t t_4; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { + t_4 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); + iop_a_src += 3; + } else { + self->private_data.s_decode_lsd[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch; + uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); + if (num_bits_4 == 16) { + t_4 = ((uint32_t)(*scratch >> 40)); + break; + } + num_bits_4 += 8; + *scratch |= ((uint64_t)(num_bits_4)); + } + } + v_argb = t_4; + } + v_argb |= 4278190080; + self->private_data.f_palettes[0][((4 * v_i) + 0)] = ((uint8_t)(((v_argb >> 0) & 255))); + self->private_data.f_palettes[0][((4 * v_i) + 1)] = ((uint8_t)(((v_argb >> 8) & 255))); + self->private_data.f_palettes[0][((4 * v_i) + 2)] = ((uint8_t)(((v_argb >> 16) & 255))); + self->private_data.f_palettes[0][((4 * v_i) + 3)] = ((uint8_t)(((v_argb >> 24) & 255))); + v_i += 1; + } + if (self->private_impl.f_quirks[2]) { + if ((v_background_color_index != 0) && (((uint32_t)(v_background_color_index)) < v_num_palette_entries)) { + v_j = (4 * ((uint32_t)(v_background_color_index))); + self->private_impl.f_background_color_u32_argb_premul = ((((uint32_t)(self->private_data.f_palettes[0][(v_j + 0)])) << 0) | + (((uint32_t)(self->private_data.f_palettes[0][(v_j + 1)])) << 8) | + (((uint32_t)(self->private_data.f_palettes[0][(v_j + 2)])) << 16) | + (((uint32_t)(self->private_data.f_palettes[0][(v_j + 3)])) << 24)); + } else { + self->private_impl.f_background_color_u32_argb_premul = 77; + } + } + } + while (v_i < 256) { + self->private_data.f_palettes[0][((4 * v_i) + 0)] = 0; + self->private_data.f_palettes[0][((4 * v_i) + 1)] = 0; + self->private_data.f_palettes[0][((4 * v_i) + 2)] = 0; + self->private_data.f_palettes[0][((4 * v_i) + 3)] = 255; + v_i += 1; + } + + goto ok; + ok: + self->private_impl.p_decode_lsd[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_lsd[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_decode_lsd[0].v_flags = v_flags; + self->private_data.s_decode_lsd[0].v_background_color_index = v_background_color_index; + self->private_data.s_decode_lsd[0].v_num_palette_entries = v_num_palette_entries; + self->private_data.s_decode_lsd[0].v_i = v_i; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.decode_extension + +static wuffs_base__status +wuffs_gif__decoder__decode_extension( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_label = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_extension[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_label = t_0; + } + if (v_label == 249) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + status = wuffs_gif__decoder__decode_gc(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + status = wuffs_base__make_status(NULL); + goto ok; + } else if (v_label == 255) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + status = wuffs_gif__decoder__decode_ae(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + status = wuffs_base__make_status(NULL); + goto ok; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + status = wuffs_gif__decoder__skip_blocks(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + + ok: + self->private_impl.p_decode_extension[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_extension[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.skip_blocks + +static wuffs_base__status +wuffs_gif__decoder__skip_blocks( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_block_size = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_skip_blocks[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_block_size = t_0; + } + if (v_block_size == 0) { + status = wuffs_base__make_status(NULL); + goto ok; + } + self->private_data.s_skip_blocks[0].scratch = ((uint32_t)(v_block_size)); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (self->private_data.s_skip_blocks[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_skip_blocks[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_skip_blocks[0].scratch; + } + + ok: + self->private_impl.p_skip_blocks[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_skip_blocks[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.decode_ae + +static wuffs_base__status +wuffs_gif__decoder__decode_ae( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint8_t v_block_size = 0; + bool v_is_animexts = false; + bool v_is_netscape = false; + bool v_is_iccp = false; + bool v_is_xmp = false; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_ae[0]; + if (coro_susp_point) { + v_block_size = self->private_data.s_decode_ae[0].v_block_size; + v_is_animexts = self->private_data.s_decode_ae[0].v_is_animexts; + v_is_netscape = self->private_data.s_decode_ae[0].v_is_netscape; + v_is_iccp = self->private_data.s_decode_ae[0].v_is_iccp; + v_is_xmp = self->private_data.s_decode_ae[0].v_is_xmp; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + if (self->private_impl.f_metadata_fourcc != 0) { + status = wuffs_base__make_status(wuffs_base__note__metadata_reported); + goto ok; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_block_size = t_0; + } + if (v_block_size == 0) { + status = wuffs_base__make_status(NULL); + goto ok; + } + if (v_block_size != 11) { + self->private_data.s_decode_ae[0].scratch = ((uint32_t)(v_block_size)); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_decode_ae[0].scratch; + goto label__goto_done__break; + } + v_is_animexts = true; + v_is_netscape = true; + v_is_iccp = true; + v_is_xmp = true; + v_block_size = 0; + while (v_block_size < 11) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + v_c = t_1; + } + v_is_animexts = (v_is_animexts && (v_c == WUFFS_GIF__ANIMEXTS1DOT0[v_block_size])); + v_is_netscape = (v_is_netscape && (v_c == WUFFS_GIF__NETSCAPE2DOT0[v_block_size])); + v_is_iccp = (v_is_iccp && (v_c == WUFFS_GIF__ICCRGBG1012[v_block_size])); + v_is_xmp = (v_is_xmp && (v_c == WUFFS_GIF__XMPDATAXMP[v_block_size])); +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + v_block_size += 1; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } + if (v_is_animexts || v_is_netscape) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + v_block_size = t_2; + } + if (v_block_size != 3) { + self->private_data.s_decode_ae[0].scratch = ((uint32_t)(v_block_size)); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_decode_ae[0].scratch; + goto label__goto_done__break; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; + v_c = t_3; + } + if (v_c != 1) { + self->private_data.s_decode_ae[0].scratch = 2; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_decode_ae[0].scratch; + goto label__goto_done__break; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + uint32_t t_4; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_decode_ae[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_ae[0].scratch; + uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; + if (num_bits_4 == 8) { + t_4 = ((uint32_t)(*scratch)); + break; + } + num_bits_4 += 8; + *scratch |= ((uint64_t)(num_bits_4)) << 56; + } + } + self->private_impl.f_num_animation_loops_value = t_4; + } + self->private_impl.f_seen_num_animation_loops_value = true; + if ((0 < self->private_impl.f_num_animation_loops_value) && (self->private_impl.f_num_animation_loops_value <= 65535)) { + self->private_impl.f_num_animation_loops_value += 1; + } + } else if (self->private_impl.f_call_sequence >= 32) { + } else if (v_is_iccp && self->private_impl.f_report_metadata_iccp) { + self->private_impl.f_metadata_fourcc = 1229144912; + self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); + self->private_impl.f_call_sequence = 16; + status = wuffs_base__make_status(wuffs_base__note__metadata_reported); + goto ok; + } else if (v_is_xmp && self->private_impl.f_report_metadata_xmp) { + self->private_impl.f_metadata_fourcc = 1481461792; + self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); + self->private_impl.f_call_sequence = 16; + status = wuffs_base__make_status(wuffs_base__note__metadata_reported); + goto ok; + } + goto label__goto_done__break; + } + label__goto_done__break:; + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + status = wuffs_gif__decoder__skip_blocks(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + + ok: + self->private_impl.p_decode_ae[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_ae[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_decode_ae[0].v_block_size = v_block_size; + self->private_data.s_decode_ae[0].v_is_animexts = v_is_animexts; + self->private_data.s_decode_ae[0].v_is_netscape = v_is_netscape; + self->private_data.s_decode_ae[0].v_is_iccp = v_is_iccp; + self->private_data.s_decode_ae[0].v_is_xmp = v_is_xmp; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.decode_gc + +static wuffs_base__status +wuffs_gif__decoder__decode_gc( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint8_t v_flags = 0; + uint16_t v_gc_duration_centiseconds = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_gc[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c = t_0; + } + if (v_c != 4) { + status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + v_flags = t_1; + } + self->private_impl.f_gc_has_transparent_index = ((v_flags & 1) != 0); + v_flags = ((v_flags >> 2) & 7); + if (v_flags == 2) { + self->private_impl.f_gc_disposal = 1; + } else if ((v_flags == 3) || (v_flags == 4)) { + self->private_impl.f_gc_disposal = 2; + } else { + self->private_impl.f_gc_disposal = 0; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint16_t t_2; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); + iop_a_src += 2; + } else { + self->private_data.s_decode_gc[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_gc[0].scratch; + uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; + if (num_bits_2 == 8) { + t_2 = ((uint16_t)(*scratch)); + break; + } + num_bits_2 += 8; + *scratch |= ((uint64_t)(num_bits_2)) << 56; + } + } + v_gc_duration_centiseconds = t_2; + } + self->private_impl.f_gc_duration = (((uint64_t)(v_gc_duration_centiseconds)) * 7056000); + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; + self->private_impl.f_gc_transparent_index = t_3; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_4 = *iop_a_src++; + v_c = t_4; + } + if (v_c != 0) { + status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); + goto exit; + } + + goto ok; + ok: + self->private_impl.p_decode_gc[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_gc[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.decode_id_part0 + +static wuffs_base__status +wuffs_gif__decoder__decode_id_part0( + wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_id_part0[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_decode_id_part0[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; + if (num_bits_0 == 8) { + t_0 = ((uint32_t)(*scratch)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } + self->private_impl.f_frame_rect_x0 = t_0; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_decode_id_part0[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; + if (num_bits_1 == 8) { + t_1 = ((uint32_t)(*scratch)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } + self->private_impl.f_frame_rect_y0 = t_1; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + uint32_t t_2; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_decode_id_part0[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; + uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; + if (num_bits_2 == 8) { + t_2 = ((uint32_t)(*scratch)); + break; + } + num_bits_2 += 8; + *scratch |= ((uint64_t)(num_bits_2)) << 56; + } + } + self->private_impl.f_frame_rect_x1 = t_2; + } + self->private_impl.f_frame_rect_x1 += self->private_impl.f_frame_rect_x0; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + uint32_t t_3; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_decode_id_part0[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; + uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; + if (num_bits_3 == 8) { + t_3 = ((uint32_t)(*scratch)); + break; + } + num_bits_3 += 8; + *scratch |= ((uint64_t)(num_bits_3)) << 56; + } + } + self->private_impl.f_frame_rect_y1 = t_3; + } + self->private_impl.f_frame_rect_y1 += self->private_impl.f_frame_rect_y0; + self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; + self->private_impl.f_dst_y = self->private_impl.f_frame_rect_y0; + if ((self->private_impl.f_num_decoded_frame_configs_value == 0) && ! self->private_impl.f_quirks[4]) { + self->private_impl.f_width = wuffs_base__u32__max(self->private_impl.f_width, self->private_impl.f_frame_rect_x1); + self->private_impl.f_height = wuffs_base__u32__max(self->private_impl.f_height, self->private_impl.f_frame_rect_y1); + } + + goto ok; + ok: + self->private_impl.p_decode_id_part0[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_id_part0[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.decode_id_part1 + +static wuffs_base__status +wuffs_gif__decoder__decode_id_part1( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_flags = 0; + uint8_t v_which_palette = 0; + uint32_t v_num_palette_entries = 0; + uint32_t v_i = 0; + uint32_t v_argb = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + uint8_t v_lw = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_id_part1[0]; + if (coro_susp_point) { + v_which_palette = self->private_data.s_decode_id_part1[0].v_which_palette; + v_num_palette_entries = self->private_data.s_decode_id_part1[0].v_num_palette_entries; + v_i = self->private_data.s_decode_id_part1[0].v_i; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_flags = t_0; + } + if ((v_flags & 64) != 0) { + self->private_impl.f_interlace = 4; + } else { + self->private_impl.f_interlace = 0; + } + v_which_palette = 1; + if ((v_flags & 128) != 0) { + v_num_palette_entries = (((uint32_t)(1)) << (1 + (v_flags & 7))); + v_i = 0; + while (v_i < v_num_palette_entries) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { + t_1 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); + iop_a_src += 3; + } else { + self->private_data.s_decode_id_part1[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_id_part1[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); + if (num_bits_1 == 16) { + t_1 = ((uint32_t)(*scratch >> 40)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)); + } + } + v_argb = t_1; + } + v_argb |= 4278190080; + self->private_data.f_palettes[1][((4 * v_i) + 0)] = ((uint8_t)(((v_argb >> 0) & 255))); + self->private_data.f_palettes[1][((4 * v_i) + 1)] = ((uint8_t)(((v_argb >> 8) & 255))); + self->private_data.f_palettes[1][((4 * v_i) + 2)] = ((uint8_t)(((v_argb >> 16) & 255))); + self->private_data.f_palettes[1][((4 * v_i) + 3)] = ((uint8_t)(((v_argb >> 24) & 255))); + v_i += 1; + } + while (v_i < 256) { + self->private_data.f_palettes[1][((4 * v_i) + 0)] = 0; + self->private_data.f_palettes[1][((4 * v_i) + 1)] = 0; + self->private_data.f_palettes[1][((4 * v_i) + 2)] = 0; + self->private_data.f_palettes[1][((4 * v_i) + 3)] = 255; + v_i += 1; + } + } else if (self->private_impl.f_quirks[6] && ! self->private_impl.f_has_global_palette) { + status = wuffs_base__make_status(wuffs_gif__error__bad_palette); + goto exit; + } else if (self->private_impl.f_gc_has_transparent_index) { + wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_palettes[1], 1024), wuffs_base__make_slice_u8(self->private_data.f_palettes[0], 1024)); + } else { + v_which_palette = 0; + } + if (self->private_impl.f_gc_has_transparent_index) { + self->private_data.f_palettes[1][((4 * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 0)] = 0; + self->private_data.f_palettes[1][((4 * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 1)] = 0; + self->private_data.f_palettes[1][((4 * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 2)] = 0; + self->private_data.f_palettes[1][((4 * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 3)] = 0; + } + v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, + wuffs_base__pixel_buffer__pixel_format(a_dst), + wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), + wuffs_base__utility__make_pixel_format(2198077448), + wuffs_base__make_slice_u8(self->private_data.f_palettes[v_which_palette], 1024), + a_blend); + if ( ! wuffs_base__status__is_ok(&v_status)) { + status = v_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + if (self->private_impl.f_previous_lzw_decode_ended_abruptly) { + wuffs_base__ignore_status(wuffs_lzw__decoder__initialize(&self->private_data.f_lzw, + sizeof (wuffs_lzw__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + v_lw = t_2; + } + if (v_lw > 8) { + status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); + goto exit; + } + wuffs_lzw__decoder__set_literal_width(&self->private_data.f_lzw, ((uint32_t)(v_lw))); + self->private_impl.f_previous_lzw_decode_ended_abruptly = true; + + ok: + self->private_impl.p_decode_id_part1[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_id_part1[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_decode_id_part1[0].v_which_palette = v_which_palette; + self->private_data.s_decode_id_part1[0].v_num_palette_entries = v_num_palette_entries; + self->private_data.s_decode_id_part1[0].v_i = v_i; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.decode_id_part2 + +static wuffs_base__status +wuffs_gif__decoder__decode_id_part2( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__io_buffer empty_io_buffer = wuffs_base__empty_io_buffer(); + + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint64_t v_block_size = 0; + bool v_need_block_size = false; + uint32_t v_n_copied = 0; + uint64_t v_n_compressed = 0; + wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); + wuffs_base__io_buffer* v_r = &u_r; + const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint64_t v_mark = 0; + wuffs_base__status v_lzw_status = wuffs_base__make_status(NULL); + wuffs_base__status v_copy_status = wuffs_base__make_status(NULL); + wuffs_base__slice_u8 v_uncompressed = {0}; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_id_part2[0]; + if (coro_susp_point) { + v_block_size = self->private_data.s_decode_id_part2[0].v_block_size; + v_need_block_size = self->private_data.s_decode_id_part2[0].v_need_block_size; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + v_need_block_size = true; + label__outer__continue:; + while (true) { + if (v_need_block_size) { + v_need_block_size = false; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t t_0 = *iop_a_src++; + v_block_size = t_0; + } + } + if (v_block_size == 0) { + goto label__outer__break; + } + while (((uint64_t)(io2_a_src - iop_a_src)) == 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + } + if (self->private_impl.f_compressed_ri == self->private_impl.f_compressed_wi) { + self->private_impl.f_compressed_ri = 0; + self->private_impl.f_compressed_wi = 0; + } + while (self->private_impl.f_compressed_wi <= 3841) { + v_n_compressed = wuffs_base__u64__min(v_block_size, ((uint64_t)(io2_a_src - iop_a_src))); + if (v_n_compressed <= 0) { + goto label__0__break; + } + v_n_copied = wuffs_base__io_reader__limited_copy_u32_to_slice( + &iop_a_src, io2_a_src,((uint32_t)((v_n_compressed & 4294967295))), wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, self->private_impl.f_compressed_wi, 4096)); + wuffs_base__u64__sat_add_indirect(&self->private_impl.f_compressed_wi, ((uint64_t)(v_n_copied))); + wuffs_base__u64__sat_sub_indirect(&v_block_size, ((uint64_t)(v_n_copied))); + if (v_block_size > 0) { + goto label__0__break; + } + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + v_need_block_size = true; + goto label__0__break; + } + v_block_size = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); + iop_a_src += 1; + } + label__0__break:; + label__inner__continue:; + while (true) { + if ((self->private_impl.f_compressed_ri > self->private_impl.f_compressed_wi) || (self->private_impl.f_compressed_wi > 4096)) { + status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_ri_wi); + goto exit; + } + { + wuffs_base__io_buffer* o_0_v_r = v_r; + const uint8_t *o_0_iop_v_r = iop_v_r; + const uint8_t *o_0_io0_v_r = io0_v_r; + const uint8_t *o_0_io1_v_r = io1_v_r; + const uint8_t *o_0_io2_v_r = io2_v_r; + v_r = wuffs_base__io_reader__set( + &u_r, + &iop_v_r, + &io0_v_r, + &io1_v_r, + &io2_v_r, + wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, + self->private_impl.f_compressed_ri, + self->private_impl.f_compressed_wi), + 0); + v_mark = ((uint64_t)(iop_v_r - io0_v_r)); + { + u_r.meta.ri = ((size_t)(iop_v_r - u_r.data.ptr)); + wuffs_base__status t_1 = wuffs_lzw__decoder__transform_io(&self->private_data.f_lzw, &empty_io_buffer, v_r, wuffs_base__utility__empty_slice_u8()); + v_lzw_status = t_1; + iop_v_r = u_r.data.ptr + u_r.meta.ri; + } + wuffs_base__u64__sat_add_indirect(&self->private_impl.f_compressed_ri, wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_v_r - io0_v_r)))); + v_r = o_0_v_r; + iop_v_r = o_0_iop_v_r; + io0_v_r = o_0_io0_v_r; + io1_v_r = o_0_io1_v_r; + io2_v_r = o_0_io2_v_r; + } + v_uncompressed = wuffs_lzw__decoder__flush(&self->private_data.f_lzw); + if (((uint64_t)(v_uncompressed.len)) > 0) { + v_copy_status = wuffs_gif__decoder__copy_to_image_buffer(self, a_dst, v_uncompressed); + if (wuffs_base__status__is_error(&v_copy_status)) { + status = v_copy_status; + goto exit; + } + } + if (wuffs_base__status__is_ok(&v_lzw_status)) { + self->private_impl.f_previous_lzw_decode_ended_abruptly = false; + if (v_need_block_size || (v_block_size > 0)) { + self->private_data.s_decode_id_part2[0].scratch = ((uint32_t)(v_block_size)); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (self->private_data.s_decode_id_part2[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_decode_id_part2[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_decode_id_part2[0].scratch; + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + status = wuffs_gif__decoder__skip_blocks(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } + goto label__outer__break; + } else if (v_lzw_status.repr == wuffs_base__suspension__short_read) { + goto label__outer__continue; + } else if (v_lzw_status.repr == wuffs_base__suspension__short_write) { + goto label__inner__continue; + } else if (self->private_impl.f_quirks[3] && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) && (self->private_impl.f_interlace == 0)) { + if (v_need_block_size || (v_block_size > 0)) { + self->private_data.s_decode_id_part2[0].scratch = ((uint32_t)(v_block_size)); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (self->private_data.s_decode_id_part2[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_decode_id_part2[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_decode_id_part2[0].scratch; + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + status = wuffs_gif__decoder__skip_blocks(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } + goto label__outer__break; + } + status = v_lzw_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + } + label__outer__break:; + self->private_impl.f_compressed_ri = 0; + self->private_impl.f_compressed_wi = 0; + if ((self->private_impl.f_dst_y < self->private_impl.f_frame_rect_y1) && (self->private_impl.f_frame_rect_x0 != self->private_impl.f_frame_rect_x1) && (self->private_impl.f_frame_rect_y0 != self->private_impl.f_frame_rect_y1)) { + status = wuffs_base__make_status(wuffs_base__error__not_enough_data); + goto exit; + } + + ok: + self->private_impl.p_decode_id_part2[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_id_part2[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_decode_id_part2[0].v_block_size = v_block_size; + self->private_data.s_decode_id_part2[0].v_need_block_size = v_need_block_size; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func gif.decoder.copy_to_image_buffer + +static wuffs_base__status +wuffs_gif__decoder__copy_to_image_buffer( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_pb, + wuffs_base__slice_u8 a_src) { + wuffs_base__slice_u8 v_dst = {0}; + wuffs_base__slice_u8 v_src = {0}; + uint64_t v_width_in_bytes = 0; + uint64_t v_n = 0; + uint64_t v_src_ri = 0; + wuffs_base__pixel_format v_pixfmt = {0}; + uint32_t v_bytes_per_pixel = 0; + uint32_t v_bits_per_pixel = 0; + wuffs_base__table_u8 v_tab = {0}; + uint64_t v_i = 0; + uint64_t v_j = 0; + uint32_t v_replicate_y0 = 0; + uint32_t v_replicate_y1 = 0; + wuffs_base__slice_u8 v_replicate_dst = {0}; + wuffs_base__slice_u8 v_replicate_src = {0}; + + v_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_pb); + v_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_pixfmt); + if ((v_bits_per_pixel & 7) != 0) { + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + v_bytes_per_pixel = (v_bits_per_pixel >> 3); + v_width_in_bytes = (((uint64_t)(self->private_impl.f_width)) * ((uint64_t)(v_bytes_per_pixel))); + v_tab = wuffs_base__pixel_buffer__plane(a_pb, 0); + label__0__continue:; + while (v_src_ri < ((uint64_t)(a_src.len))) { + v_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_ri); + if (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) { + if (self->private_impl.f_quirks[3]) { + return wuffs_base__make_status(NULL); + } + return wuffs_base__make_status(wuffs_base__error__too_much_data); + } + v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); + if (self->private_impl.f_dst_y >= self->private_impl.f_height) { + v_dst = wuffs_base__slice_u8__subslice_j(v_dst, 0); + } else if (v_width_in_bytes < ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_width_in_bytes); + } + v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_bytes_per_pixel))); + if (v_i < ((uint64_t)(v_dst.len))) { + v_j = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * ((uint64_t)(v_bytes_per_pixel))); + if ((v_i <= v_j) && (v_j <= ((uint64_t)(v_dst.len)))) { + v_dst = wuffs_base__slice_u8__subslice_ij(v_dst, v_i, v_j); + } else { + v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); + } + v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), v_src); + wuffs_base__u64__sat_add_indirect(&v_src_ri, v_n); + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)((v_n & 4294967295)))); + self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1)); + } + if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { + self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; + if (self->private_impl.f_interlace == 0) { + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_y, 1); + goto label__0__continue; + } + if ((self->private_impl.f_num_decoded_frames_value == 0) && ! self->private_impl.f_gc_has_transparent_index && (self->private_impl.f_interlace > 1)) { + v_replicate_src = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); + v_replicate_y0 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1); + v_replicate_y1 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_COUNT[self->private_impl.f_interlace]))); + v_replicate_y1 = wuffs_base__u32__min(v_replicate_y1, self->private_impl.f_frame_rect_y1); + while (v_replicate_y0 < v_replicate_y1) { + v_replicate_dst = wuffs_base__table_u8__row_u32(v_tab, v_replicate_y0); + wuffs_base__slice_u8__copy_from_slice(v_replicate_dst, v_replicate_src); + v_replicate_y0 += 1; + } + self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, v_replicate_y1); + } + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); + while ((self->private_impl.f_interlace > 0) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + self->private_impl.f_interlace -= 1; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); + } + goto label__0__continue; + } + if (((uint64_t)(a_src.len)) == v_src_ri) { + goto label__0__break; + } else if (((uint64_t)(a_src.len)) < v_src_ri) { + return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_ri_wi); + } + v_n = ((uint64_t)((self->private_impl.f_frame_rect_x1 - self->private_impl.f_dst_x))); + v_n = wuffs_base__u64__min(v_n, (((uint64_t)(a_src.len)) - v_src_ri)); + wuffs_base__u64__sat_add_indirect(&v_src_ri, v_n); + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)((v_n & 4294967295)))); + if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { + self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); + while ((self->private_impl.f_interlace > 0) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + self->private_impl.f_interlace -= 1; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); + } + goto label__0__continue; + } + if (v_src_ri != ((uint64_t)(a_src.len))) { + return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_ri_wi); + } + goto label__0__break; + } + label__0__break:; + return wuffs_base__make_status(NULL); +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) + +// ---------------- Status Codes Implementations + +const char wuffs_gzip__error__bad_checksum[] = "#gzip: bad checksum"; +const char wuffs_gzip__error__bad_compression_method[] = "#gzip: bad compression method"; +const char wuffs_gzip__error__bad_encoding_flags[] = "#gzip: bad encoding flags"; +const char wuffs_gzip__error__bad_header[] = "#gzip: bad header"; +const char wuffs_gzip__error__truncated_input[] = "#gzip: truncated input"; + +// ---------------- Private Consts + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__status +wuffs_gzip__decoder__do_transform_io( + wuffs_gzip__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +// ---------------- VTables + +const wuffs_base__io_transformer__func_ptrs +wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer = { + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_gzip__decoder__set_quirk_enabled), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__io_buffer*, + wuffs_base__slice_u8))(&wuffs_gzip__decoder__transform_io), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gzip__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_gzip__decoder__initialize( + wuffs_gzip__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + { + wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( + &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); + if (z.repr) { + return z; + } + } + { + wuffs_base__status z = wuffs_deflate__decoder__initialize( + &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); + if (z.repr) { + return z; + } + } + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = + wuffs_base__io_transformer__vtable_name; + self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = + (const void*)(&wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer); + return wuffs_base__make_status(NULL); +} + +wuffs_gzip__decoder* +wuffs_gzip__decoder__alloc() { + wuffs_gzip__decoder* x = + (wuffs_gzip__decoder*)(calloc(1, sizeof(wuffs_gzip__decoder))); + if (!x) { + return NULL; + } + if (wuffs_gzip__decoder__initialize( + x, sizeof(wuffs_gzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_gzip__decoder() { + return sizeof(wuffs_gzip__decoder); +} + +// ---------------- Function Implementations + +// -------- func gzip.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_gzip__decoder__set_quirk_enabled( + wuffs_gzip__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + if (a_quirk == 1) { + self->private_impl.f_ignore_checksum = a_enabled; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func gzip.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_gzip__decoder__workbuf_len( + const wuffs_gzip__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__make_range_ii_u64(1, 1); +} + +// -------- func gzip.decoder.transform_io + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_gzip__decoder__transform_io( + wuffs_gzip__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_gzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_gzip__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_transform_io[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func gzip.decoder.do_transform_io + +static wuffs_base__status +wuffs_gzip__decoder__do_transform_io( + wuffs_gzip__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint8_t v_flags = 0; + uint16_t v_xlen = 0; + uint64_t v_mark = 0; + uint32_t v_checksum_got = 0; + uint32_t v_decoded_length_got = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + uint32_t v_checksum_want = 0; + uint32_t v_decoded_length_want = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; + if (coro_susp_point) { + v_flags = self->private_data.s_do_transform_io[0].v_flags; + v_checksum_got = self->private_data.s_do_transform_io[0].v_checksum_got; + v_decoded_length_got = self->private_data.s_do_transform_io[0].v_decoded_length_got; + v_checksum_want = self->private_data.s_do_transform_io[0].v_checksum_want; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c = t_0; + } + if (v_c != 31) { + status = wuffs_base__make_status(wuffs_gzip__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + v_c = t_1; + } + if (v_c != 139) { + status = wuffs_base__make_status(wuffs_gzip__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + v_c = t_2; + } + if (v_c != 8) { + status = wuffs_base__make_status(wuffs_gzip__error__bad_compression_method); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; + v_flags = t_3; + } + self->private_data.s_do_transform_io[0].scratch = 6; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (self->private_data.s_do_transform_io[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_transform_io[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_transform_io[0].scratch; + if ((v_flags & 4) != 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + uint16_t t_4; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); + iop_a_src += 2; + } else { + self->private_data.s_do_transform_io[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; + uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; + if (num_bits_4 == 8) { + t_4 = ((uint16_t)(*scratch)); + break; + } + num_bits_4 += 8; + *scratch |= ((uint64_t)(num_bits_4)) << 56; + } + } + v_xlen = t_4; + } + self->private_data.s_do_transform_io[0].scratch = ((uint32_t)(v_xlen)); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + if (self->private_data.s_do_transform_io[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_transform_io[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_transform_io[0].scratch; + } + if ((v_flags & 8) != 0) { + while (true) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_5 = *iop_a_src++; + v_c = t_5; + } + if (v_c == 0) { + goto label__0__break; + } + } + label__0__break:; + } + if ((v_flags & 16) != 0) { + while (true) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_6 = *iop_a_src++; + v_c = t_6; + } + if (v_c == 0) { + goto label__1__break; + } + } + label__1__break:; + } + if ((v_flags & 2) != 0) { + self->private_data.s_do_transform_io[0].scratch = 2; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); + if (self->private_data.s_do_transform_io[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_transform_io[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_transform_io[0].scratch; + } + if ((v_flags & 224) != 0) { + status = wuffs_base__make_status(wuffs_gzip__error__bad_encoding_flags); + goto exit; + } + while (true) { + v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); + { + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + wuffs_base__status t_7 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); + v_status = t_7; + if (a_dst) { + iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; + } + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } + if ( ! self->private_impl.f_ignore_checksum) { + v_checksum_got = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_checksum, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); + v_decoded_length_got += ((uint32_t)((wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst))) & 4294967295))); + } + if (wuffs_base__status__is_ok(&v_status)) { + goto label__2__break; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); + } + label__2__break:; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); + uint32_t t_8; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_transform_io[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; + uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; + if (num_bits_8 == 24) { + t_8 = ((uint32_t)(*scratch)); + break; + } + num_bits_8 += 8; + *scratch |= ((uint64_t)(num_bits_8)) << 56; + } + } + v_checksum_want = t_8; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); + uint32_t t_9; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_9 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_transform_io[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; + uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; + if (num_bits_9 == 24) { + t_9 = ((uint32_t)(*scratch)); + break; + } + num_bits_9 += 8; + *scratch |= ((uint64_t)(num_bits_9)) << 56; + } + } + v_decoded_length_want = t_9; + } + if ( ! self->private_impl.f_ignore_checksum && ((v_checksum_got != v_checksum_want) || (v_decoded_length_got != v_decoded_length_want))) { + status = wuffs_base__make_status(wuffs_gzip__error__bad_checksum); + goto exit; + } + + ok: + self->private_impl.p_do_transform_io[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_do_transform_io[0].v_flags = v_flags; + self->private_data.s_do_transform_io[0].v_checksum_got = v_checksum_got; + self->private_data.s_do_transform_io[0].v_decoded_length_got = v_decoded_length_got; + self->private_data.s_do_transform_io[0].v_checksum_want = v_checksum_want; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) + +// ---------------- Status Codes Implementations + +const char wuffs_json__error__bad_c0_control_code[] = "#json: bad C0 control code"; +const char wuffs_json__error__bad_utf_8[] = "#json: bad UTF-8"; +const char wuffs_json__error__bad_backslash_escape[] = "#json: bad backslash-escape"; +const char wuffs_json__error__bad_input[] = "#json: bad input"; +const char wuffs_json__error__bad_new_line_in_a_string[] = "#json: bad new-line in a string"; +const char wuffs_json__error__bad_quirk_combination[] = "#json: bad quirk combination"; +const char wuffs_json__error__unsupported_number_length[] = "#json: unsupported number length"; +const char wuffs_json__error__unsupported_recursion_depth[] = "#json: unsupported recursion depth"; +const char wuffs_json__error__internal_error_inconsistent_i_o[] = "#json: internal error: inconsistent I/O"; + +// ---------------- Private Consts + +#define WUFFS_JSON__DECODER_NUMBER_LENGTH_MAX_INCL 99 + +static const uint8_t +WUFFS_JSON__LUT_BACKSLASHES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 162, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 0, 0, 0, 175, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 220, 0, 0, 0, + 0, 1, 136, 0, 0, 2, 140, 0, + 0, 0, 0, 0, 0, 0, 138, 0, + 0, 0, 141, 0, 137, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static const uint8_t +WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 1, 3, 4, 5, 6, 7, 10, +}; + +static const uint8_t +WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 7, 27, 10, 63, 39, 11, 0, +}; + +static const uint8_t +WUFFS_JSON__LUT_CHARS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 32, 32, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, +}; + +#define WUFFS_JSON__CLASS_WHITESPACE 0 + +#define WUFFS_JSON__CLASS_STRING 1 + +#define WUFFS_JSON__CLASS_COMMA 2 + +#define WUFFS_JSON__CLASS_COLON 3 + +#define WUFFS_JSON__CLASS_NUMBER 4 + +#define WUFFS_JSON__CLASS_OPEN_CURLY_BRACE 5 + +#define WUFFS_JSON__CLASS_CLOSE_CURLY_BRACE 6 + +#define WUFFS_JSON__CLASS_OPEN_SQUARE_BRACKET 7 + +#define WUFFS_JSON__CLASS_CLOSE_SQUARE_BRACKET 8 + +#define WUFFS_JSON__CLASS_FALSE 9 + +#define WUFFS_JSON__CLASS_TRUE 10 + +#define WUFFS_JSON__CLASS_NULL_NAN_INF 11 + +#define WUFFS_JSON__CLASS_COMMENT 12 + +#define WUFFS_JSON__EXPECT_VALUE 7858 + +#define WUFFS_JSON__EXPECT_NON_STRING_VALUE 7856 + +#define WUFFS_JSON__EXPECT_STRING 4098 + +#define WUFFS_JSON__EXPECT_COMMA 4100 + +#define WUFFS_JSON__EXPECT_COLON 4104 + +#define WUFFS_JSON__EXPECT_NUMBER 4112 + +#define WUFFS_JSON__EXPECT_CLOSE_CURLY_BRACE 4160 + +#define WUFFS_JSON__EXPECT_CLOSE_SQUARE_BRACKET 4352 + +static const uint8_t +WUFFS_JSON__LUT_CLASSES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 0, 0, 15, 15, 0, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 0, 15, 1, 15, 15, 15, 15, 15, + 15, 15, 15, 11, 2, 4, 15, 12, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 3, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 11, 15, 15, 15, 15, 11, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 7, 15, 8, 15, 15, + 15, 15, 15, 15, 15, 15, 9, 15, + 15, 11, 15, 15, 15, 15, 11, 15, + 15, 15, 15, 15, 10, 15, 15, 15, + 15, 15, 15, 5, 15, 6, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, +}; + +static const uint8_t +WUFFS_JSON__LUT_DECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static const uint8_t +WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 0, 0, 0, 0, 0, 0, + 0, 138, 139, 140, 141, 142, 143, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 138, 139, 140, 141, 142, 143, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +}; + +#define WUFFS_JSON__QUIRKS_BASE 1225364480 + +#define WUFFS_JSON__QUIRKS_COUNT 21 + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static uint32_t +wuffs_json__decoder__decode_number( + wuffs_json__decoder* self, + wuffs_base__io_buffer* a_src); + +static uint32_t +wuffs_json__decoder__decode_digits( + wuffs_json__decoder* self, + wuffs_base__io_buffer* a_src, + uint32_t a_n); + +static wuffs_base__status +wuffs_json__decoder__decode_leading( + wuffs_json__decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_json__decoder__decode_comment( + wuffs_json__decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_json__decoder__decode_inf_nan( + wuffs_json__decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_json__decoder__decode_trailer( + wuffs_json__decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +// ---------------- VTables + +const wuffs_base__token_decoder__func_ptrs +wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder = { + (wuffs_base__status(*)(void*, + wuffs_base__token_buffer*, + wuffs_base__io_buffer*, + wuffs_base__slice_u8))(&wuffs_json__decoder__decode_tokens), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_json__decoder__set_quirk_enabled), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_json__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_json__decoder__initialize( + wuffs_json__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = + wuffs_base__token_decoder__vtable_name; + self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = + (const void*)(&wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder); + return wuffs_base__make_status(NULL); +} + +wuffs_json__decoder* +wuffs_json__decoder__alloc() { + wuffs_json__decoder* x = + (wuffs_json__decoder*)(calloc(1, sizeof(wuffs_json__decoder))); + if (!x) { + return NULL; + } + if (wuffs_json__decoder__initialize( + x, sizeof(wuffs_json__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_json__decoder() { + return sizeof(wuffs_json__decoder); +} + +// ---------------- Function Implementations + +// -------- func json.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_json__decoder__set_quirk_enabled( + wuffs_json__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + if (a_quirk >= 1225364480) { + a_quirk -= 1225364480; + if (a_quirk < 21) { + self->private_impl.f_quirks[a_quirk] = a_enabled; + } + } + return wuffs_base__make_empty_struct(); +} + +// -------- func json.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_json__decoder__workbuf_len( + const wuffs_json__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__empty_range_ii_u64(); +} + +// -------- func json.decoder.decode_tokens + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_json__decoder__decode_tokens( + wuffs_json__decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_vminor = 0; + uint32_t v_number_length = 0; + uint32_t v_number_status = 0; + uint32_t v_string_length = 0; + uint32_t v_whitespace_length = 0; + uint32_t v_depth = 0; + uint32_t v_stack_byte = 0; + uint32_t v_stack_bit = 0; + uint32_t v_match = 0; + uint32_t v_c4 = 0; + uint8_t v_c = 0; + uint8_t v_backslash = 0; + uint8_t v_char = 0; + uint8_t v_class = 0; + uint32_t v_multi_byte_utf8 = 0; + uint8_t v_backslash_x_ok = 0; + uint8_t v_backslash_x_value = 0; + uint32_t v_backslash_x_string = 0; + uint8_t v_uni4_ok = 0; + uint64_t v_uni4_string = 0; + uint32_t v_uni4_value = 0; + uint32_t v_uni4_high_surrogate = 0; + uint8_t v_uni8_ok = 0; + uint64_t v_uni8_string = 0; + uint32_t v_uni8_value = 0; + uint32_t v_expect = 0; + uint32_t v_expect_after_value = 0; + + wuffs_base__token* iop_a_dst = NULL; + wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_tokens[0]; + if (coro_susp_point) { + v_depth = self->private_data.s_decode_tokens[0].v_depth; + v_expect = self->private_data.s_decode_tokens[0].v_expect; + v_expect_after_value = self->private_data.s_decode_tokens[0].v_expect_after_value; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_end_of_data) { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + if (self->private_impl.f_quirks[18]) { + if (self->private_impl.f_quirks[11] || self->private_impl.f_quirks[12] || self->private_impl.f_quirks[17]) { + status = wuffs_base__make_status(wuffs_json__error__bad_quirk_combination); + goto exit; + } + } + if (self->private_impl.f_quirks[15] || self->private_impl.f_quirks[16]) { + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_json__decoder__decode_leading(self, a_dst, a_src); + if (a_dst) { + iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; + } + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } + v_expect = 7858; + label__outer__continue:; + while (true) { + while (true) { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + goto label__outer__continue; + } + v_whitespace_length = 0; + v_c = 0; + v_class = 0; + while (true) { + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if (v_whitespace_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_whitespace_length = 0; + } + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + goto label__outer__continue; + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + v_class = WUFFS_JSON__LUT_CLASSES[v_c]; + if (v_class != 0) { + goto label__ws__break; + } + iop_a_src += 1; + if (v_whitespace_length >= 65534) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(65535)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_whitespace_length = 0; + goto label__outer__continue; + } + v_whitespace_length += 1; + } + label__ws__break:; + if (v_whitespace_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_whitespace_length = 0; + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + goto label__outer__continue; + } + } + if (0 == (v_expect & (((uint32_t)(1)) << v_class))) { + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } + if (v_class == 1) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194579)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + iop_a_src += 1; + label__string_loop_outer__continue:; + while (true) { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); + goto label__string_loop_outer__continue; + } + v_string_length = 0; + label__string_loop_inner__continue:; + while (true) { + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if (v_string_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_string_length = 0; + } + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + goto label__string_loop_outer__continue; + } + while (((uint64_t)(io2_a_src - iop_a_src)) > 4) { + v_c4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + if (0 != (WUFFS_JSON__LUT_CHARS[(255 & (v_c4 >> 0))] | + WUFFS_JSON__LUT_CHARS[(255 & (v_c4 >> 8))] | + WUFFS_JSON__LUT_CHARS[(255 & (v_c4 >> 16))] | + WUFFS_JSON__LUT_CHARS[(255 & (v_c4 >> 24))])) { + goto label__0__break; + } + iop_a_src += 4; + if (v_string_length > 65527) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)((v_string_length + 4))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_string_length = 0; + goto label__string_loop_outer__continue; + } + v_string_length += 4; + } + label__0__break:; + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + v_char = WUFFS_JSON__LUT_CHARS[v_c]; + if (v_char == 0) { + iop_a_src += 1; + if (v_string_length >= 65531) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(65532)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_string_length = 0; + goto label__string_loop_outer__continue; + } + v_string_length += 1; + goto label__string_loop_inner__continue; + } else if (v_char == 1) { + if (v_string_length != 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_string_length = 0; + } + goto label__string_loop_outer__break; + } else if (v_char == 2) { + if (v_string_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_string_length = 0; + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + goto label__string_loop_outer__continue; + } + } + if (((uint64_t)(io2_a_src - iop_a_src)) < 2) { + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); + goto label__string_loop_outer__continue; + } + v_c = ((uint8_t)((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8))); + v_backslash = WUFFS_JSON__LUT_BACKSLASHES[v_c]; + if ((v_backslash & 128) != 0) { + iop_a_src += 2; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((6291456 | ((uint32_t)((v_backslash & 127)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(2)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__string_loop_outer__continue; + } else if (v_backslash != 0) { + if (self->private_impl.f_quirks[WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[(v_backslash & 7)]]) { + iop_a_src += 2; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((6291456 | ((uint32_t)(WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[(v_backslash & 7)]))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(2)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__string_loop_outer__continue; + } + } else if (v_c == 117) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 6) { + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); + goto label__string_loop_outer__continue; + } + v_uni4_string = (((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))) >> 16); + v_uni4_value = 0; + v_uni4_ok = 128; + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni4_string >> 0))]; + v_uni4_ok &= v_c; + v_uni4_value |= (((uint32_t)((v_c & 15))) << 12); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni4_string >> 8))]; + v_uni4_ok &= v_c; + v_uni4_value |= (((uint32_t)((v_c & 15))) << 8); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni4_string >> 16))]; + v_uni4_ok &= v_c; + v_uni4_value |= (((uint32_t)((v_c & 15))) << 4); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni4_string >> 24))]; + v_uni4_ok &= v_c; + v_uni4_value |= (((uint32_t)((v_c & 15))) << 0); + if (v_uni4_ok == 0) { + } else if ((v_uni4_value < 55296) || (57343 < v_uni4_value)) { + iop_a_src += 6; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((6291456 | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(6)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__string_loop_outer__continue; + } else if (v_uni4_value >= 56320) { + } else { + if (((uint64_t)(io2_a_src - iop_a_src)) < 12) { + if (a_src && a_src->meta.closed) { + if (self->private_impl.f_quirks[20]) { + iop_a_src += 6; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(6)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__string_loop_outer__continue; + } + status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); + goto label__string_loop_outer__continue; + } + v_uni4_string = (wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 4) >> 16); + if (((255 & (v_uni4_string >> 0)) != 92) || ((255 & (v_uni4_string >> 8)) != 117)) { + v_uni4_high_surrogate = 0; + v_uni4_value = 0; + v_uni4_ok = 0; + } else { + v_uni4_high_surrogate = (65536 + ((v_uni4_value - 55296) << 10)); + v_uni4_value = 0; + v_uni4_ok = 128; + v_uni4_string >>= 16; + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni4_string >> 0))]; + v_uni4_ok &= v_c; + v_uni4_value |= (((uint32_t)((v_c & 15))) << 12); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni4_string >> 8))]; + v_uni4_ok &= v_c; + v_uni4_value |= (((uint32_t)((v_c & 15))) << 8); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni4_string >> 16))]; + v_uni4_ok &= v_c; + v_uni4_value |= (((uint32_t)((v_c & 15))) << 4); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni4_string >> 24))]; + v_uni4_ok &= v_c; + v_uni4_value |= (((uint32_t)((v_c & 15))) << 0); + } + if ((v_uni4_ok != 0) && (56320 <= v_uni4_value) && (v_uni4_value <= 57343)) { + v_uni4_value -= 56320; + iop_a_src += 12; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((6291456 | v_uni4_high_surrogate | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(12)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__string_loop_outer__continue; + } + } + if (self->private_impl.f_quirks[20]) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 6) { + status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); + goto exit; + } + iop_a_src += 6; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(6)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__string_loop_outer__continue; + } + } else if ((v_c == 85) && self->private_impl.f_quirks[2]) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 10) { + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); + goto label__string_loop_outer__continue; + } + v_uni8_string = wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 2); + v_uni8_value = 0; + v_uni8_ok = 128; + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni8_string >> 0))]; + v_uni8_ok &= v_c; + v_uni8_value |= (((uint32_t)((v_c & 15))) << 28); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni8_string >> 8))]; + v_uni8_ok &= v_c; + v_uni8_value |= (((uint32_t)((v_c & 15))) << 24); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni8_string >> 16))]; + v_uni8_ok &= v_c; + v_uni8_value |= (((uint32_t)((v_c & 15))) << 20); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni8_string >> 24))]; + v_uni8_ok &= v_c; + v_uni8_value |= (((uint32_t)((v_c & 15))) << 16); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni8_string >> 32))]; + v_uni8_ok &= v_c; + v_uni8_value |= (((uint32_t)((v_c & 15))) << 12); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni8_string >> 40))]; + v_uni8_ok &= v_c; + v_uni8_value |= (((uint32_t)((v_c & 15))) << 8); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni8_string >> 48))]; + v_uni8_ok &= v_c; + v_uni8_value |= (((uint32_t)((v_c & 15))) << 4); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_uni8_string >> 56))]; + v_uni8_ok &= v_c; + v_uni8_value |= (((uint32_t)((v_c & 15))) << 0); + if (v_uni8_ok == 0) { + } else if ((v_uni8_value < 55296) || ((57343 < v_uni8_value) && (v_uni8_value <= 1114111))) { + iop_a_src += 10; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((6291456 | (v_uni8_value & 2097151)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(10)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__string_loop_outer__continue; + } else if (self->private_impl.f_quirks[20]) { + iop_a_src += 10; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(10)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__string_loop_outer__continue; + } + } else if ((v_c == 120) && self->private_impl.f_quirks[9]) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 4) { + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); + goto label__string_loop_outer__continue; + } + v_backslash_x_string = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + v_backslash_x_ok = 128; + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_backslash_x_string >> 16))]; + v_backslash_x_ok &= v_c; + v_backslash_x_value = ((uint8_t)(((v_c & 15) << 4))); + v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255 & (v_backslash_x_string >> 24))]; + v_backslash_x_ok &= v_c; + v_backslash_x_value = ((uint8_t)((v_backslash_x_value | (v_c & 15)))); + if ((v_backslash_x_ok == 0) || ((v_backslash_x_string & 65535) != 30812)) { + status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); + goto exit; + } + iop_a_src += 4; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((6291456 | ((uint32_t)(v_backslash_x_value))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(4)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__string_loop_outer__continue; + } + status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); + goto exit; + } else if (v_char == 3) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 2) { + if (v_string_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_string_length = 0; + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + goto label__string_loop_outer__continue; + } + } + if (a_src && a_src->meta.closed) { + if (self->private_impl.f_quirks[20]) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + iop_a_src += 1; + goto label__string_loop_outer__continue; + } + status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); + goto label__string_loop_outer__continue; + } + v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + if ((v_multi_byte_utf8 & 49152) == 32768) { + v_multi_byte_utf8 = ((1984 & ((uint32_t)(v_multi_byte_utf8 << 6))) | (63 & (v_multi_byte_utf8 >> 8))); + iop_a_src += 2; + if (v_string_length >= 65528) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)((v_string_length + 2))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_string_length = 0; + goto label__string_loop_outer__continue; + } + v_string_length += 2; + goto label__string_loop_inner__continue; + } + } else if (v_char == 4) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 3) { + if (v_string_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_string_length = 0; + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + goto label__string_loop_outer__continue; + } + } + if (a_src && a_src->meta.closed) { + if (self->private_impl.f_quirks[20]) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + iop_a_src += 1; + goto label__string_loop_outer__continue; + } + status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); + goto label__string_loop_outer__continue; + } + v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); + if ((v_multi_byte_utf8 & 12632064) == 8421376) { + v_multi_byte_utf8 = ((61440 & ((uint32_t)(v_multi_byte_utf8 << 12))) | (4032 & (v_multi_byte_utf8 >> 2)) | (63 & (v_multi_byte_utf8 >> 16))); + if ((2047 < v_multi_byte_utf8) && ((v_multi_byte_utf8 < 55296) || (57343 < v_multi_byte_utf8))) { + iop_a_src += 3; + if (v_string_length >= 65528) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)((v_string_length + 3))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_string_length = 0; + goto label__string_loop_outer__continue; + } + v_string_length += 3; + goto label__string_loop_inner__continue; + } + } + } else if (v_char == 5) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 4) { + if (v_string_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_string_length = 0; + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + goto label__string_loop_outer__continue; + } + } + if (a_src && a_src->meta.closed) { + if (self->private_impl.f_quirks[20]) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + iop_a_src += 1; + goto label__string_loop_outer__continue; + } + status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(13); + goto label__string_loop_outer__continue; + } + v_multi_byte_utf8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + if ((v_multi_byte_utf8 & 3233857536) == 2155905024) { + v_multi_byte_utf8 = ((1835008 & ((uint32_t)(v_multi_byte_utf8 << 18))) | + (258048 & ((uint32_t)(v_multi_byte_utf8 << 4))) | + (4032 & (v_multi_byte_utf8 >> 10)) | + (63 & (v_multi_byte_utf8 >> 24))); + if ((65535 < v_multi_byte_utf8) && (v_multi_byte_utf8 <= 1114111)) { + iop_a_src += 4; + if (v_string_length >= 65528) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)((v_string_length + 4))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_string_length = 0; + goto label__string_loop_outer__continue; + } + v_string_length += 4; + goto label__string_loop_inner__continue; + } + } + } + if (v_string_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194819)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_string_length = 0; + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + goto label__string_loop_outer__continue; + } + } + if ((v_char & 128) != 0) { + if (self->private_impl.f_quirks[0]) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((6291456 | ((uint32_t)((v_char & 127)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + iop_a_src += 1; + goto label__string_loop_outer__continue; + } + if (v_char == 138) { + status = wuffs_base__make_status(wuffs_json__error__bad_new_line_in_a_string); + goto exit; + } + status = wuffs_base__make_status(wuffs_json__error__bad_c0_control_code); + goto exit; + } + if (self->private_impl.f_quirks[20]) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + iop_a_src += 1; + goto label__string_loop_outer__continue; + } + status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); + goto exit; + } + } + label__string_loop_outer__break:; + label__1__continue:; + while (true) { + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(14); + goto label__1__continue; + } + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(15); + goto label__1__continue; + } + iop_a_src += 1; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4194579)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__1__break; + } + label__1__break:; + if (0 == (v_expect & (((uint32_t)(1)) << 4))) { + v_expect = 4104; + goto label__outer__continue; + } + goto label__goto_parsed_a_leaf_value__break; + } else if (v_class == 2) { + iop_a_src += 1; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + if (0 == (v_expect & (((uint32_t)(1)) << 8))) { + if (self->private_impl.f_quirks[13]) { + v_expect = 4162; + } else { + v_expect = 4098; + } + } else { + if (self->private_impl.f_quirks[13]) { + v_expect = 8114; + } else { + v_expect = 7858; + } + } + goto label__outer__continue; + } else if (v_class == 3) { + iop_a_src += 1; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_expect = 7858; + goto label__outer__continue; + } else if (v_class == 4) { + while (true) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + v_number_length = wuffs_json__decoder__decode_number(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + v_number_status = (v_number_length >> 8); + v_vminor = 10486787; + if ((v_number_length & 128) != 0) { + v_vminor = 10486785; + } + v_number_length = (v_number_length & 127); + if (v_number_status == 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(v_number_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__2__break; + } + while (v_number_length > 0) { + v_number_length -= 1; + if (iop_a_src > io1_a_src) { + iop_a_src--; + } else { + status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); + goto exit; + } + } + if (v_number_status == 1) { + if (self->private_impl.f_quirks[14]) { + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); + status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); + if (a_dst) { + iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; + } + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + goto label__2__break; + } + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } else if (v_number_status == 2) { + status = wuffs_base__make_status(wuffs_json__error__unsupported_number_length); + goto exit; + } else { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(17); + while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(18); + } + } + } + label__2__break:; + goto label__goto_parsed_a_leaf_value__break; + } else if (v_class == 5) { + v_vminor = 2113553; + if (v_depth == 0) { + } else if (0 != (v_expect_after_value & (((uint32_t)(1)) << 6))) { + v_vminor = 2113601; + } else { + v_vminor = 2113569; + } + if (v_depth >= 1024) { + status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); + goto exit; + } + v_stack_byte = (v_depth / 32); + v_stack_bit = (v_depth & 31); + self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(1)) << v_stack_bit); + v_depth += 1; + iop_a_src += 1; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_expect = 4162; + v_expect_after_value = 4164; + goto label__outer__continue; + } else if (v_class == 6) { + iop_a_src += 1; + if (v_depth <= 1) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(2101314)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__outer__break; + } + v_depth -= 1; + v_stack_byte = ((v_depth - 1) / 32); + v_stack_bit = ((v_depth - 1) & 31); + if (0 == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1)) << v_stack_bit))) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(2105410)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_expect = 4356; + v_expect_after_value = 4356; + } else { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(2113602)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_expect = 4164; + v_expect_after_value = 4164; + } + goto label__outer__continue; + } else if (v_class == 7) { + v_vminor = 2105361; + if (v_depth == 0) { + } else if (0 != (v_expect_after_value & (((uint32_t)(1)) << 6))) { + v_vminor = 2105409; + } else { + v_vminor = 2105377; + } + if (v_depth >= 1024) { + status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); + goto exit; + } + v_stack_byte = (v_depth / 32); + v_stack_bit = (v_depth & 31); + self->private_data.f_stack[v_stack_byte] &= (4294967295 ^ (((uint32_t)(1)) << v_stack_bit)); + v_depth += 1; + iop_a_src += 1; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_expect = 8114; + v_expect_after_value = 4356; + goto label__outer__continue; + } else if (v_class == 8) { + iop_a_src += 1; + if (v_depth <= 1) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(2101282)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__outer__break; + } + v_depth -= 1; + v_stack_byte = ((v_depth - 1) / 32); + v_stack_bit = ((v_depth - 1) & 31); + if (0 == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1)) << v_stack_bit))) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(2105378)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_expect = 4356; + v_expect_after_value = 4356; + } else { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(2113570)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + v_expect = 4164; + v_expect_after_value = 4164; + } + goto label__outer__continue; + } else if (v_class == 9) { + v_match = wuffs_base__io_reader__match7(iop_a_src, io2_a_src, a_src,111546413966853); + if (v_match == 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(8388612)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(5)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + if (((uint64_t)(io2_a_src - iop_a_src)) < 5) { + status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); + goto exit; + } + iop_a_src += 5; + goto label__goto_parsed_a_leaf_value__break; + } else if (v_match == 1) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(19); + goto label__outer__continue; + } + } else if (v_class == 10) { + v_match = wuffs_base__io_reader__match7(iop_a_src, io2_a_src, a_src,435762131972); + if (v_match == 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(8388616)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(4)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + if (((uint64_t)(io2_a_src - iop_a_src)) < 4) { + status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); + goto exit; + } + iop_a_src += 4; + goto label__goto_parsed_a_leaf_value__break; + } else if (v_match == 1) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(20); + goto label__outer__continue; + } + } else if (v_class == 11) { + v_match = wuffs_base__io_reader__match7(iop_a_src, io2_a_src, a_src,465676103172); + if (v_match == 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(8388610)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(4)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + if (((uint64_t)(io2_a_src - iop_a_src)) < 4) { + status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); + goto exit; + } + iop_a_src += 4; + goto label__goto_parsed_a_leaf_value__break; + } else if (v_match == 1) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21); + goto label__outer__continue; + } + if (self->private_impl.f_quirks[14]) { + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); + status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); + if (a_dst) { + iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; + } + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + goto label__goto_parsed_a_leaf_value__break; + } + } else if (v_class == 12) { + if (self->private_impl.f_quirks[11] || self->private_impl.f_quirks[12]) { + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); + status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); + if (a_dst) { + iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; + } + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + if (self->private_impl.f_comment_type > 0) { + goto label__outer__continue; + } + } + } + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } + label__goto_parsed_a_leaf_value__break:; + if (v_depth == 0) { + goto label__outer__break; + } + v_expect = v_expect_after_value; + } + label__outer__break:; + if (self->private_impl.f_quirks[17] || self->private_impl.f_quirks[18]) { + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); + status = wuffs_json__decoder__decode_trailer(self, a_dst, a_src); + if (a_dst) { + iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; + } + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } + self->private_impl.f_end_of_data = true; + + ok: + self->private_impl.p_decode_tokens[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_tokens[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + self->private_data.s_decode_tokens[0].v_depth = v_depth; + self->private_data.s_decode_tokens[0].v_expect = v_expect; + self->private_data.s_decode_tokens[0].v_expect_after_value = v_expect_after_value; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func json.decoder.decode_number + +static uint32_t +wuffs_json__decoder__decode_number( + wuffs_json__decoder* self, + wuffs_base__io_buffer* a_src) { + uint8_t v_c = 0; + uint32_t v_n = 0; + uint32_t v_floating_point = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + while (true) { + v_n = 0; + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if ( ! (a_src && a_src->meta.closed)) { + v_n |= 768; + } + goto label__goto_done__break; + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + if (v_c != 45) { + } else { + v_n += 1; + iop_a_src += 1; + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if ( ! (a_src && a_src->meta.closed)) { + v_n |= 768; + } + v_n |= 256; + goto label__goto_done__break; + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + } + if (v_c == 48) { + v_n += 1; + iop_a_src += 1; + } else { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (v_n > 99) { + goto label__goto_done__break; + } + } + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if ( ! (a_src && a_src->meta.closed)) { + v_n |= 768; + } + goto label__goto_done__break; + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + if (v_c != 46) { + } else { + if (v_n >= 99) { + v_n |= 512; + goto label__goto_done__break; + } + v_n += 1; + iop_a_src += 1; + v_floating_point = 128; + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (v_n > 99) { + goto label__goto_done__break; + } + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if ( ! (a_src && a_src->meta.closed)) { + v_n |= 768; + } + goto label__goto_done__break; + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + } + if ((v_c != 69) && (v_c != 101)) { + goto label__goto_done__break; + } + if (v_n >= 99) { + v_n |= 512; + goto label__goto_done__break; + } + v_n += 1; + iop_a_src += 1; + v_floating_point = 128; + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if ( ! (a_src && a_src->meta.closed)) { + v_n |= 768; + } + v_n |= 256; + goto label__goto_done__break; + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + if ((v_c != 43) && (v_c != 45)) { + } else { + if (v_n >= 99) { + v_n |= 512; + goto label__goto_done__break; + } + v_n += 1; + iop_a_src += 1; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + goto label__goto_done__break; + } + label__goto_done__break:; + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + return (v_n | v_floating_point); +} + +// -------- func json.decoder.decode_digits + +static uint32_t +wuffs_json__decoder__decode_digits( + wuffs_json__decoder* self, + wuffs_base__io_buffer* a_src, + uint32_t a_n) { + uint8_t v_c = 0; + uint32_t v_n = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + v_n = a_n; + while (true) { + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if ( ! (a_src && a_src->meta.closed)) { + v_n |= 768; + } + goto label__0__break; + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + if (0 == WUFFS_JSON__LUT_DECIMAL_DIGITS[v_c]) { + goto label__0__break; + } + if (v_n >= 99) { + v_n |= 512; + goto label__0__break; + } + v_n += 1; + iop_a_src += 1; + } + label__0__break:; + if (v_n == a_n) { + v_n |= 256; + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + return v_n; +} + +// -------- func json.decoder.decode_leading + +static wuffs_base__status +wuffs_json__decoder__decode_leading( + wuffs_json__decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint32_t v_u = 0; + + wuffs_base__token* iop_a_dst = NULL; + wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_leading[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + self->private_impl.f_allow_leading_ars = self->private_impl.f_quirks[15]; + self->private_impl.f_allow_leading_ubom = self->private_impl.f_quirks[16]; + label__0__continue:; + while (self->private_impl.f_allow_leading_ars || self->private_impl.f_allow_leading_ubom) { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + goto label__0__continue; + } + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if (a_src && a_src->meta.closed) { + goto label__0__break; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + goto label__0__continue; + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + if ((v_c == 30) && self->private_impl.f_allow_leading_ars) { + self->private_impl.f_allow_leading_ars = false; + iop_a_src += 1; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__0__continue; + } else if ((v_c == 239) && self->private_impl.f_allow_leading_ubom) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 3) { + if (a_src && a_src->meta.closed) { + goto label__0__break; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + goto label__0__continue; + } + v_u = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); + if (v_u == 12565487) { + self->private_impl.f_allow_leading_ubom = false; + iop_a_src += 3; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + goto label__0__continue; + } + } + goto label__0__break; + } + label__0__break:; + + ok: + self->private_impl.p_decode_leading[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_leading[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func json.decoder.decode_comment + +static wuffs_base__status +wuffs_json__decoder__decode_comment( + wuffs_json__decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint16_t v_c2 = 0; + uint32_t v_length = 0; + + wuffs_base__token* iop_a_dst = NULL; + wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_comment[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + self->private_impl.f_comment_type = 0; + label__0__continue:; + while ((((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) || (((uint64_t)(io2_a_src - iop_a_src)) <= 1)) { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + goto label__0__continue; + } + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(NULL); + goto ok; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + } + v_c2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); + if ((v_c2 == 10799) && self->private_impl.f_quirks[11]) { + iop_a_src += 2; + v_length = 2; + label__comment_block__continue:; + while (true) { + if (((uint64_t)(io2_a_src - iop_a_src)) <= 1) { + if (v_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); + } + v_length = 0; + goto label__comment_block__continue; + } + v_c2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); + if (v_c2 == 12074) { + iop_a_src += 2; + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)((v_length + 2))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + self->private_impl.f_comment_type = 1; + status = wuffs_base__make_status(NULL); + goto ok; + } + iop_a_src += 1; + if (v_length >= 65533) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)((v_length + 1))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + } + v_length = 0; + goto label__comment_block__continue; + } + v_length += 1; + } + } else if ((v_c2 == 12079) && self->private_impl.f_quirks[12]) { + iop_a_src += 2; + v_length = 2; + label__comment_line__continue:; + while (true) { + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if (a_src && a_src->meta.closed) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + self->private_impl.f_comment_type = 2; + status = wuffs_base__make_status(NULL); + goto ok; + } else if (v_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); + while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); + } + v_length = 0; + goto label__comment_line__continue; + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + if (v_c == 10) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + self->private_impl.f_comment_type = 2; + status = wuffs_base__make_status(NULL); + goto ok; + } + iop_a_src += 1; + if (v_length >= 65533) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(4)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | + (((uint64_t)((v_length + 1))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); + } + v_length = 0; + goto label__comment_line__continue; + } + v_length += 1; + } + } + + ok: + self->private_impl.p_decode_comment[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_comment[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func json.decoder.decode_inf_nan + +static wuffs_base__status +wuffs_json__decoder__decode_inf_nan( + wuffs_json__decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_c4 = 0; + uint32_t v_neg = 0; + + wuffs_base__token* iop_a_dst = NULL; + wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_inf_nan[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + label__0__continue:; + while (true) { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + goto label__0__continue; + } + if (((uint64_t)(io2_a_src - iop_a_src)) <= 2) { + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + goto label__0__continue; + } + v_c4 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); + if ((v_c4 | 2105376) == 6712937) { + if (((uint64_t)(io2_a_src - iop_a_src)) > 7) { + if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) | 2314885530818453536) == 8751735898823356009) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(10485792)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(8)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + iop_a_src += 8; + status = wuffs_base__make_status(NULL); + goto ok; + } + } else if ( ! (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + goto label__0__continue; + } + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(10485792)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + iop_a_src += 3; + status = wuffs_base__make_status(NULL); + goto ok; + } else if ((v_c4 | 2105376) == 7233902) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(10485888)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(3)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + iop_a_src += 3; + status = wuffs_base__make_status(NULL); + goto ok; + } else if ((v_c4 & 255) == 43) { + v_neg = 0; + } else if ((v_c4 & 255) == 45) { + v_neg = 1; + } else { + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } + if (((uint64_t)(io2_a_src - iop_a_src)) <= 3) { + if (a_src && a_src->meta.closed) { + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); + goto label__0__continue; + } + v_c4 = (wuffs_base__peek_u32le__no_bounds_check(iop_a_src) >> 8); + if ((v_c4 | 2105376) == 6712937) { + if (((uint64_t)(io2_a_src - iop_a_src)) > 8) { + if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 1) | 2314885530818453536) == 8751735898823356009) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((10485760 | (((uint32_t)(32)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(9)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + iop_a_src += 9; + status = wuffs_base__make_status(NULL); + goto ok; + } + } else if ( ! (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + goto label__0__continue; + } + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((10485760 | (((uint32_t)(32)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(4)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + iop_a_src += 4; + status = wuffs_base__make_status(NULL); + goto ok; + } else if ((v_c4 | 2105376) == 7233902) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)((10485760 | (((uint32_t)(128)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(4)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + iop_a_src += 4; + status = wuffs_base__make_status(NULL); + goto ok; + } + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } + + ok: + self->private_impl.p_decode_inf_nan[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_inf_nan[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func json.decoder.decode_trailer + +static wuffs_base__status +wuffs_json__decoder__decode_trailer( + wuffs_json__decoder* self, + wuffs_base__token_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint32_t v_whitespace_length = 0; + + wuffs_base__token* iop_a_dst = NULL; + wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_trailer[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_quirks[18]) { + self->private_impl.f_trailer_stop = 10; + } else { + self->private_impl.f_trailer_stop = 0; + } + label__outer__continue:; + while (true) { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + goto label__outer__continue; + } + v_whitespace_length = 0; + while (true) { + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + if (v_whitespace_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } + if (a_src && a_src->meta.closed) { + goto label__outer__break; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + goto label__outer__continue; + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + if (WUFFS_JSON__LUT_CLASSES[v_c] != 0) { + if (v_whitespace_length > 0) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } + if (self->private_impl.f_trailer_stop > 0) { + status = wuffs_base__make_status(wuffs_json__error__bad_input); + goto exit; + } + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); + if (a_dst) { + iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; + } + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + if (self->private_impl.f_comment_type > 0) { + goto label__outer__continue; + } + status = wuffs_base__make_status(NULL); + goto ok; + } + iop_a_src += 1; + if ((v_whitespace_length >= 65534) || (v_c == self->private_impl.f_trailer_stop)) { + *iop_a_dst++ = wuffs_base__make_token( + (((uint64_t)(0)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | + (((uint64_t)((v_whitespace_length + 1))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + if (v_c == self->private_impl.f_trailer_stop) { + status = wuffs_base__make_status(NULL); + goto ok; + } + goto label__outer__continue; + } + v_whitespace_length += 1; + } + } + label__outer__break:; + + ok: + self->private_impl.p_decode_trailer[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_trailer[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) + +// ---------------- Status Codes Implementations + +const char wuffs_nie__error__bad_header[] = "#nie: bad header"; +const char wuffs_nie__error__truncated_input[] = "#nie: truncated input"; +const char wuffs_nie__error__unsupported_nie_file[] = "#nie: unsupported NIE file"; +const char wuffs_nie__note__internal_note_short_read[] = "@nie: internal note: short read"; + +// ---------------- Private Consts + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__status +wuffs_nie__decoder__do_decode_image_config( + wuffs_nie__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_nie__decoder__do_decode_frame_config( + wuffs_nie__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_nie__decoder__do_decode_frame( + wuffs_nie__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +static wuffs_base__status +wuffs_nie__decoder__swizzle( + wuffs_nie__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src); + +// ---------------- VTables + +const wuffs_base__image_decoder__func_ptrs +wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder = { + (wuffs_base__status(*)(void*, + wuffs_base__pixel_buffer*, + wuffs_base__io_buffer*, + wuffs_base__pixel_blend, + wuffs_base__slice_u8, + wuffs_base__decode_frame_options*))(&wuffs_nie__decoder__decode_frame), + (wuffs_base__status(*)(void*, + wuffs_base__frame_config*, + wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_frame_config), + (wuffs_base__status(*)(void*, + wuffs_base__image_config*, + wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_image_config), + (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_nie__decoder__frame_dirty_rect), + (uint32_t(*)(const void*))(&wuffs_nie__decoder__num_animation_loops), + (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frame_configs), + (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frames), + (wuffs_base__status(*)(void*, + uint64_t, + uint64_t))(&wuffs_nie__decoder__restart_frame), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_nie__decoder__set_quirk_enabled), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_nie__decoder__set_report_metadata), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__more_information*, + wuffs_base__io_buffer*))(&wuffs_nie__decoder__tell_me_more), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_nie__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_nie__decoder__initialize( + wuffs_nie__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = + wuffs_base__image_decoder__vtable_name; + self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = + (const void*)(&wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder); + return wuffs_base__make_status(NULL); +} + +wuffs_nie__decoder* +wuffs_nie__decoder__alloc() { + wuffs_nie__decoder* x = + (wuffs_nie__decoder*)(calloc(1, sizeof(wuffs_nie__decoder))); + if (!x) { + return NULL; + } + if (wuffs_nie__decoder__initialize( + x, sizeof(wuffs_nie__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_nie__decoder() { + return sizeof(wuffs_nie__decoder); +} + +// ---------------- Function Implementations + +// -------- func nie.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_nie__decoder__set_quirk_enabled( + wuffs_nie__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__make_empty_struct(); +} + +// -------- func nie.decoder.decode_image_config + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_nie__decoder__decode_image_config( + wuffs_nie__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_image_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_nie__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_image_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func nie.decoder.do_decode_image_config + +static wuffs_base__status +wuffs_nie__decoder__do_decode_image_config( + wuffs_nie__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_a = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence != 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; + if (num_bits_0 == 24) { + t_0 = ((uint32_t)(*scratch)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } + v_a = t_0; + } + if (v_a != 1169146734) { + status = wuffs_base__make_status(wuffs_nie__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; + if (num_bits_1 == 24) { + t_1 = ((uint32_t)(*scratch)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } + v_a = t_1; + } + if (v_a == 879649535) { + self->private_impl.f_pixfmt = 2164295816; + } else if (v_a == 946758399) { + self->private_impl.f_pixfmt = 2164308923; + } else if (v_a == 879780607) { + status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); + goto exit; + } else if (v_a == 946889471) { + status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); + goto exit; + } else { + status = wuffs_base__make_status(wuffs_nie__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + uint32_t t_2; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; + if (num_bits_2 == 24) { + t_2 = ((uint32_t)(*scratch)); + break; + } + num_bits_2 += 8; + *scratch |= ((uint64_t)(num_bits_2)) << 56; + } + } + v_a = t_2; + } + if (v_a >= 2147483648) { + status = wuffs_base__make_status(wuffs_nie__error__bad_header); + goto exit; + } + self->private_impl.f_width = v_a; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + uint32_t t_3; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; + if (num_bits_3 == 24) { + t_3 = ((uint32_t)(*scratch)); + break; + } + num_bits_3 += 8; + *scratch |= ((uint64_t)(num_bits_3)) << 56; + } + } + v_a = t_3; + } + if (v_a >= 2147483648) { + status = wuffs_base__make_status(wuffs_nie__error__bad_header); + goto exit; + } + self->private_impl.f_height = v_a; + if (a_dst != NULL) { + wuffs_base__image_config__set( + a_dst, + self->private_impl.f_pixfmt, + 0, + self->private_impl.f_width, + self->private_impl.f_height, + 16, + false); + } + self->private_impl.f_call_sequence = 32; + + goto ok; + ok: + self->private_impl.p_do_decode_image_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func nie.decoder.decode_frame_config + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_nie__decoder__decode_frame_config( + wuffs_nie__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_nie__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_frame_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func nie.decoder.do_decode_frame_config + +static wuffs_base__status +wuffs_nie__decoder__do_decode_frame_config( + wuffs_nie__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence == 32) { + } else if (self->private_impl.f_call_sequence < 32) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_nie__decoder__do_decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else if (self->private_impl.f_call_sequence == 40) { + if (16 != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { + status = wuffs_base__make_status(wuffs_base__error__bad_restart); + goto exit; + } + } else if (self->private_impl.f_call_sequence == 64) { + self->private_impl.f_call_sequence = 96; + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + if (a_dst != NULL) { + wuffs_base__frame_config__set( + a_dst, + wuffs_base__utility__make_rect_ie_u32( + 0, + 0, + self->private_impl.f_width, + self->private_impl.f_height), + ((wuffs_base__flicks)(0)), + 0, + 16, + 0, + false, + false, + 0); + } + self->private_impl.f_call_sequence = 64; + + ok: + self->private_impl.p_do_decode_frame_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func nie.decoder.decode_frame + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_nie__decoder__decode_frame( + wuffs_nie__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 3)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame(self, + a_dst, + a_src, + a_blend, + a_workbuf, + a_opts); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_nie__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func nie.decoder.do_decode_frame + +static wuffs_base__status +wuffs_nie__decoder__do_decode_frame( + wuffs_nie__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence == 64) { + } else if (self->private_impl.f_call_sequence < 64) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_nie__decoder__do_decode_frame_config(self, NULL, a_src); + if (status.repr) { + goto suspend; + } + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + self->private_impl.f_dst_x = 0; + self->private_impl.f_dst_y = 0; + v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, + wuffs_base__pixel_buffer__pixel_format(a_dst), + wuffs_base__pixel_buffer__palette(a_dst), + wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), + wuffs_base__utility__empty_slice_u8(), + a_blend); + if ( ! wuffs_base__status__is_ok(&v_status)) { + status = v_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + while (true) { + v_status = wuffs_nie__decoder__swizzle(self, a_dst, a_src); + if (wuffs_base__status__is_ok(&v_status)) { + goto label__0__break; + } else if (v_status.repr != wuffs_nie__note__internal_note_short_read) { + status = v_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + } + label__0__break:; + self->private_impl.f_call_sequence = 96; + + ok: + self->private_impl.p_do_decode_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + return status; +} + +// -------- func nie.decoder.swizzle + +static wuffs_base__status +wuffs_nie__decoder__swizzle( + wuffs_nie__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__pixel_format v_dst_pixfmt = {0}; + uint32_t v_dst_bits_per_pixel = 0; + uint64_t v_dst_bytes_per_pixel = 0; + uint64_t v_dst_bytes_per_row = 0; + uint32_t v_src_bytes_per_pixel = 0; + wuffs_base__table_u8 v_tab = {0}; + wuffs_base__slice_u8 v_dst = {0}; + uint64_t v_i = 0; + uint64_t v_j = 0; + uint64_t v_n = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); + v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); + if ((v_dst_bits_per_pixel & 7) != 0) { + status = wuffs_base__make_status(wuffs_base__error__unsupported_option); + goto exit; + } + v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); + v_dst_bytes_per_row = (((uint64_t)(self->private_impl.f_width)) * v_dst_bytes_per_pixel); + v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); + while (true) { + if (self->private_impl.f_dst_x == self->private_impl.f_width) { + self->private_impl.f_dst_x = 0; + self->private_impl.f_dst_y += 1; + if (self->private_impl.f_dst_y >= self->private_impl.f_height) { + goto label__0__break; + } + } + v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); + if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); + } + v_i = (((uint64_t)(self->private_impl.f_dst_x)) * v_dst_bytes_per_pixel); + if (v_i >= ((uint64_t)(v_dst.len))) { + v_src_bytes_per_pixel = 4; + if (self->private_impl.f_pixfmt == 2164308923) { + v_src_bytes_per_pixel = 8; + } + v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); + v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); + v_j = v_n; + while (v_j >= 8) { + if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8)))) { + iop_a_src += (v_src_bytes_per_pixel * 8); + } + v_j -= 8; + } + while (v_j > 0) { + if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1)))) { + iop_a_src += (v_src_bytes_per_pixel * 1); + } + v_j -= 1; + } + } else { + v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( + &self->private_impl.f_swizzler, + wuffs_base__slice_u8__subslice_i(v_dst, v_i), + wuffs_base__pixel_buffer__palette(a_dst), + &iop_a_src, + io2_a_src); + } + if (v_n == 0) { + status = wuffs_base__make_status(wuffs_nie__note__internal_note_short_read); + goto ok; + } + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)((v_n & 4294967295)))); + } + label__0__break:; + status = wuffs_base__make_status(NULL); + goto ok; + + ok: + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func nie.decoder.frame_dirty_rect + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_nie__decoder__frame_dirty_rect( + const wuffs_nie__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + + return wuffs_base__utility__make_rect_ie_u32( + 0, + 0, + self->private_impl.f_width, + self->private_impl.f_height); +} + +// -------- func nie.decoder.num_animation_loops + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_nie__decoder__num_animation_loops( + const wuffs_nie__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + return 0; +} + +// -------- func nie.decoder.num_decoded_frame_configs + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_nie__decoder__num_decoded_frame_configs( + const wuffs_nie__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + if (self->private_impl.f_call_sequence > 32) { + return 1; + } + return 0; +} + +// -------- func nie.decoder.num_decoded_frames + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_nie__decoder__num_decoded_frames( + const wuffs_nie__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + if (self->private_impl.f_call_sequence > 64) { + return 1; + } + return 0; +} + +// -------- func nie.decoder.restart_frame + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_nie__decoder__restart_frame( + wuffs_nie__decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + if (self->private_impl.f_call_sequence < 32) { + return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + } + if ((a_index != 0) || (a_io_position != 16)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + self->private_impl.f_call_sequence = 40; + return wuffs_base__make_status(NULL); +} + +// -------- func nie.decoder.set_report_metadata + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_nie__decoder__set_report_metadata( + wuffs_nie__decoder* self, + uint32_t a_fourcc, + bool a_report) { + return wuffs_base__make_empty_struct(); +} + +// -------- func nie.decoder.tell_me_more + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_nie__decoder__tell_me_more( + wuffs_nie__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 4)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + status = wuffs_base__make_status(wuffs_base__error__no_more_information); + goto exit; + + goto ok; + ok: + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func nie.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_nie__decoder__workbuf_len( + const wuffs_nie__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__make_range_ii_u64(0, 0); +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) + +// ---------------- Status Codes Implementations + +const char wuffs_zlib__note__dictionary_required[] = "@zlib: dictionary required"; +const char wuffs_zlib__error__bad_checksum[] = "#zlib: bad checksum"; +const char wuffs_zlib__error__bad_compression_method[] = "#zlib: bad compression method"; +const char wuffs_zlib__error__bad_compression_window_size[] = "#zlib: bad compression window size"; +const char wuffs_zlib__error__bad_parity_check[] = "#zlib: bad parity check"; +const char wuffs_zlib__error__incorrect_dictionary[] = "#zlib: incorrect dictionary"; +const char wuffs_zlib__error__truncated_input[] = "#zlib: truncated input"; + +// ---------------- Private Consts + +#define WUFFS_ZLIB__QUIRKS_BASE 2113790976 + +#define WUFFS_ZLIB__QUIRKS_COUNT 1 + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__status +wuffs_zlib__decoder__do_transform_io( + wuffs_zlib__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +// ---------------- VTables + +const wuffs_base__io_transformer__func_ptrs +wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer = { + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_zlib__decoder__set_quirk_enabled), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__io_buffer*, + wuffs_base__slice_u8))(&wuffs_zlib__decoder__transform_io), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_zlib__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_zlib__decoder__initialize( + wuffs_zlib__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + { + wuffs_base__status z = wuffs_adler32__hasher__initialize( + &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); + if (z.repr) { + return z; + } + } + { + wuffs_base__status z = wuffs_adler32__hasher__initialize( + &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, options); + if (z.repr) { + return z; + } + } + { + wuffs_base__status z = wuffs_deflate__decoder__initialize( + &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); + if (z.repr) { + return z; + } + } + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = + wuffs_base__io_transformer__vtable_name; + self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = + (const void*)(&wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer); + return wuffs_base__make_status(NULL); +} + +wuffs_zlib__decoder* +wuffs_zlib__decoder__alloc() { + wuffs_zlib__decoder* x = + (wuffs_zlib__decoder*)(calloc(1, sizeof(wuffs_zlib__decoder))); + if (!x) { + return NULL; + } + if (wuffs_zlib__decoder__initialize( + x, sizeof(wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_zlib__decoder() { + return sizeof(wuffs_zlib__decoder); +} + +// ---------------- Function Implementations + +// -------- func zlib.decoder.dictionary_id + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_zlib__decoder__dictionary_id( + const wuffs_zlib__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + return self->private_impl.f_dict_id_want; +} + +// -------- func zlib.decoder.add_dictionary + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_zlib__decoder__add_dictionary( + wuffs_zlib__decoder* self, + wuffs_base__slice_u8 a_dict) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + if (self->private_impl.f_header_complete) { + self->private_impl.f_bad_call_sequence = true; + } else { + self->private_impl.f_dict_id_got = wuffs_adler32__hasher__update_u32(&self->private_data.f_dict_id_hasher, a_dict); + wuffs_deflate__decoder__add_history(&self->private_data.f_flate, a_dict); + } + self->private_impl.f_got_dictionary = true; + return wuffs_base__make_empty_struct(); +} + +// -------- func zlib.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_zlib__decoder__set_quirk_enabled( + wuffs_zlib__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + if (self->private_impl.f_header_complete) { + self->private_impl.f_bad_call_sequence = true; + } else if (a_quirk == 1) { + self->private_impl.f_ignore_checksum = a_enabled; + } else if (a_quirk >= 2113790976) { + a_quirk -= 2113790976; + if (a_quirk < 1) { + self->private_impl.f_quirks[a_quirk] = a_enabled; + } + } + return wuffs_base__make_empty_struct(); +} + +// -------- func zlib.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_zlib__decoder__workbuf_len( + const wuffs_zlib__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__make_range_ii_u64(1, 1); +} + +// -------- func zlib.decoder.transform_io + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_zlib__decoder__transform_io( + wuffs_zlib__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_zlib__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_zlib__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_transform_io[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func zlib.decoder.do_transform_io + +static wuffs_base__status +wuffs_zlib__decoder__do_transform_io( + wuffs_zlib__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint16_t v_x = 0; + uint32_t v_checksum_got = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + uint32_t v_checksum_want = 0; + uint64_t v_mark = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; + if (coro_susp_point) { + v_checksum_got = self->private_data.s_do_transform_io[0].v_checksum_got; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_bad_call_sequence) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } else if (self->private_impl.f_quirks[0]) { + } else if ( ! self->private_impl.f_want_dictionary) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint16_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); + iop_a_src += 2; + } else { + self->private_data.s_do_transform_io[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 8) { + t_0 = ((uint16_t)(*scratch >> 48)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)); + } + } + v_x = t_0; + } + if (((v_x >> 8) & 15) != 8) { + status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_method); + goto exit; + } + if ((v_x >> 12) > 7) { + status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_window_size); + goto exit; + } + if ((v_x % 31) != 0) { + status = wuffs_base__make_status(wuffs_zlib__error__bad_parity_check); + goto exit; + } + self->private_impl.f_want_dictionary = ((v_x & 32) != 0); + if (self->private_impl.f_want_dictionary) { + self->private_impl.f_dict_id_got = 1; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_transform_io[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); + if (num_bits_1 == 24) { + t_1 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)); + } + } + self->private_impl.f_dict_id_want = t_1; + } + status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); + goto ok; + } else if (self->private_impl.f_got_dictionary) { + status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); + goto exit; + } + } else if (self->private_impl.f_dict_id_got != self->private_impl.f_dict_id_want) { + if (self->private_impl.f_got_dictionary) { + status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); + goto exit; + } + status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); + goto ok; + } + self->private_impl.f_header_complete = true; + while (true) { + v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); + { + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + wuffs_base__status t_2 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); + v_status = t_2; + if (a_dst) { + iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; + } + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } + if ( ! self->private_impl.f_ignore_checksum && ! self->private_impl.f_quirks[0]) { + v_checksum_got = wuffs_adler32__hasher__update_u32(&self->private_data.f_checksum, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); + } + if (wuffs_base__status__is_ok(&v_status)) { + goto label__0__break; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + } + label__0__break:; + if ( ! self->private_impl.f_quirks[0]) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + uint32_t t_3; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_transform_io[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; + uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); + if (num_bits_3 == 24) { + t_3 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_3 += 8; + *scratch |= ((uint64_t)(num_bits_3)); + } + } + v_checksum_want = t_3; + } + if ( ! self->private_impl.f_ignore_checksum && (v_checksum_got != v_checksum_want)) { + status = wuffs_base__make_status(wuffs_zlib__error__bad_checksum); + goto exit; + } + } + + ok: + self->private_impl.p_do_transform_io[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_do_transform_io[0].v_checksum_got = v_checksum_got; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) + +// ---------------- Status Codes Implementations + +const char wuffs_png__error__bad_animation_sequence_number[] = "#png: bad animation sequence number"; +const char wuffs_png__error__bad_checksum[] = "#png: bad checksum"; +const char wuffs_png__error__bad_chunk[] = "#png: bad chunk"; +const char wuffs_png__error__bad_filter[] = "#png: bad filter"; +const char wuffs_png__error__bad_header[] = "#png: bad header"; +const char wuffs_png__error__bad_text_chunk_not_latin_1[] = "#png: bad text chunk (not Latin-1)"; +const char wuffs_png__error__missing_palette[] = "#png: missing palette"; +const char wuffs_png__error__truncated_input[] = "#png: truncated input"; +const char wuffs_png__error__unsupported_cgbi_extension[] = "#png: unsupported CgBI extension"; +const char wuffs_png__error__unsupported_png_compression_method[] = "#png: unsupported PNG compression method"; +const char wuffs_png__error__unsupported_png_file[] = "#png: unsupported PNG file"; +const char wuffs_png__error__internal_error_inconsistent_i_o[] = "#png: internal error: inconsistent I/O"; +const char wuffs_png__error__internal_error_inconsistent_chunk_type[] = "#png: internal error: inconsistent chunk type"; +const char wuffs_png__error__internal_error_inconsistent_frame_bounds[] = "#png: internal error: inconsistent frame bounds"; +const char wuffs_png__error__internal_error_inconsistent_workbuf_length[] = "#png: internal error: inconsistent workbuf length"; +const char wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input[] = "#png: internal error: zlib decoder did not exhaust its input"; + +// ---------------- Private Consts + +#define WUFFS_PNG__ANCILLARY_BIT 32 + +static const uint8_t +WUFFS_PNG__INTERLACING[8][6] WUFFS_BASE__POTENTIALLY_UNUSED = { + { + 0, 0, 0, 0, 0, 0, + }, { + 3, 7, 0, 3, 7, 0, + }, { + 3, 3, 4, 3, 7, 0, + }, { + 2, 3, 0, 3, 3, 4, + }, { + 2, 1, 2, 2, 3, 0, + }, { + 1, 1, 0, 2, 1, 2, + }, { + 1, 0, 1, 1, 1, 0, + }, { + 0, 0, 0, 1, 0, 1, + }, +}; + +static const uint8_t +WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 255, 85, 0, 17, 0, 0, 0, +}; + +static const uint8_t +WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 8, 4, 0, 2, 0, 0, 0, +}; + +static const uint8_t +WUFFS_PNG__NUM_CHANNELS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { + 1, 0, 3, 1, 2, 0, 4, 0, +}; + +static const uint16_t +WUFFS_PNG__LATIN_1[256] WUFFS_BASE__POTENTIALLY_UNUSED = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 41410, 41666, 41922, 42178, 42434, 42690, 42946, + 43202, 43458, 43714, 43970, 44226, 44482, 44738, 44994, + 45250, 45506, 45762, 46018, 46274, 46530, 46786, 47042, + 47298, 47554, 47810, 48066, 48322, 48578, 48834, 49090, + 32963, 33219, 33475, 33731, 33987, 34243, 34499, 34755, + 35011, 35267, 35523, 35779, 36035, 36291, 36547, 36803, + 37059, 37315, 37571, 37827, 38083, 38339, 38595, 38851, + 39107, 39363, 39619, 39875, 40131, 40387, 40643, 40899, + 41155, 41411, 41667, 41923, 42179, 42435, 42691, 42947, + 43203, 43459, 43715, 43971, 44227, 44483, 44739, 44995, + 45251, 45507, 45763, 46019, 46275, 46531, 46787, 47043, + 47299, 47555, 47811, 48067, 48323, 48579, 48835, 49091, +}; + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +static wuffs_base__empty_struct +wuffs_png__decoder__filter_1_distance_4_arm_neon( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr); +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +static wuffs_base__empty_struct +wuffs_png__decoder__filter_3_distance_4_arm_neon( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4_distance_3_arm_neon( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4_distance_4_arm_neon( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_1( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr); + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_1__choosy_default( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr); + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_1_distance_3_fallback( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr); + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_1_distance_4_fallback( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr); + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_2( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_3( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_3__choosy_default( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_3_distance_3_fallback( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_3_distance_4_fallback( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4__choosy_default( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4_distance_3_fallback( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4_distance_4_fallback( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +static wuffs_base__empty_struct +wuffs_png__decoder__filter_1_distance_4_x86_sse42( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr); +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +static wuffs_base__empty_struct +wuffs_png__decoder__filter_3_distance_4_x86_sse42( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4_distance_3_x86_sse42( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4_distance_4_x86_sse42( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + +static wuffs_base__status +wuffs_png__decoder__do_decode_image_config( + wuffs_png__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__decode_ihdr( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__empty_struct +wuffs_png__decoder__assign_filter_distance( + wuffs_png__decoder* self); + +static uint64_t +wuffs_png__decoder__calculate_bytes_per_row( + const wuffs_png__decoder* self, + uint32_t a_width); + +static wuffs_base__empty_struct +wuffs_png__decoder__choose_filter_implementations( + wuffs_png__decoder* self); + +static wuffs_base__status +wuffs_png__decoder__decode_other_chunk( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src, + bool a_framy); + +static wuffs_base__status +wuffs_png__decoder__decode_actl( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__decode_chrm( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__decode_exif( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__decode_fctl( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__decode_gama( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__decode_iccp( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__decode_plte( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__decode_srgb( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__decode_trns( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__do_decode_frame_config( + wuffs_png__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__skip_frame( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__do_decode_frame( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +static wuffs_base__status +wuffs_png__decoder__decode_pass( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +static wuffs_base__status +wuffs_png__decoder__do_tell_me_more( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_png__decoder__filter_and_swizzle( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__slice_u8 a_workbuf); + +static wuffs_base__status +wuffs_png__decoder__filter_and_swizzle__choosy_default( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__slice_u8 a_workbuf); + +static wuffs_base__status +wuffs_png__decoder__filter_and_swizzle_tricky( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__slice_u8 a_workbuf); + +// ---------------- VTables + +const wuffs_base__image_decoder__func_ptrs +wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder = { + (wuffs_base__status(*)(void*, + wuffs_base__pixel_buffer*, + wuffs_base__io_buffer*, + wuffs_base__pixel_blend, + wuffs_base__slice_u8, + wuffs_base__decode_frame_options*))(&wuffs_png__decoder__decode_frame), + (wuffs_base__status(*)(void*, + wuffs_base__frame_config*, + wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_frame_config), + (wuffs_base__status(*)(void*, + wuffs_base__image_config*, + wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_image_config), + (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_png__decoder__frame_dirty_rect), + (uint32_t(*)(const void*))(&wuffs_png__decoder__num_animation_loops), + (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frame_configs), + (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frames), + (wuffs_base__status(*)(void*, + uint64_t, + uint64_t))(&wuffs_png__decoder__restart_frame), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_png__decoder__set_quirk_enabled), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_png__decoder__set_report_metadata), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__more_information*, + wuffs_base__io_buffer*))(&wuffs_png__decoder__tell_me_more), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_png__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_png__decoder__initialize( + wuffs_png__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.choosy_filter_1 = &wuffs_png__decoder__filter_1__choosy_default; + self->private_impl.choosy_filter_3 = &wuffs_png__decoder__filter_3__choosy_default; + self->private_impl.choosy_filter_4 = &wuffs_png__decoder__filter_4__choosy_default; + self->private_impl.choosy_filter_and_swizzle = &wuffs_png__decoder__filter_and_swizzle__choosy_default; + + { + wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( + &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); + if (z.repr) { + return z; + } + } + { + wuffs_base__status z = wuffs_zlib__decoder__initialize( + &self->private_data.f_zlib, sizeof(self->private_data.f_zlib), WUFFS_VERSION, options); + if (z.repr) { + return z; + } + } + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = + wuffs_base__image_decoder__vtable_name; + self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = + (const void*)(&wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder); + return wuffs_base__make_status(NULL); +} + +wuffs_png__decoder* +wuffs_png__decoder__alloc() { + wuffs_png__decoder* x = + (wuffs_png__decoder*)(calloc(1, sizeof(wuffs_png__decoder))); + if (!x) { + return NULL; + } + if (wuffs_png__decoder__initialize( + x, sizeof(wuffs_png__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_png__decoder() { + return sizeof(wuffs_png__decoder); +} + +// ---------------- Function Implementations + +// ‼ WUFFS MULTI-FILE SECTION +arm_neon +// -------- func png.decoder.filter_1_distance_4_arm_neon + +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +static wuffs_base__empty_struct +wuffs_png__decoder__filter_1_distance_4_arm_neon( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr) { + wuffs_base__slice_u8 v_curr = {0}; + uint8x8_t v_fa = {0}; + uint8x8_t v_fx = {0}; + + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + v_curr.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); + while (v_curr.ptr < i_end0_curr) { + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fx = vadd_u8(v_fx, v_fa); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fa = v_fx; + v_curr.ptr += 4; + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fx = vadd_u8(v_fx, v_fa); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fa = v_fx; + v_curr.ptr += 4; + } + v_curr.len = 4; + uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); + while (v_curr.ptr < i_end1_curr) { + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fx = vadd_u8(v_fx, v_fa); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fa = v_fx; + v_curr.ptr += 4; + } + v_curr.len = 0; + } + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +// ‼ WUFFS MULTI-FILE SECTION +arm_neon +// -------- func png.decoder.filter_3_distance_4_arm_neon + +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +static wuffs_base__empty_struct +wuffs_png__decoder__filter_3_distance_4_arm_neon( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + wuffs_base__slice_u8 v_curr = {0}; + wuffs_base__slice_u8 v_prev = {0}; + uint8x8_t v_fa = {0}; + uint8x8_t v_fb = {0}; + uint8x8_t v_fx = {0}; + + if (((uint64_t)(a_prev.len)) == 0) { + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + v_curr.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); + while (v_curr.ptr < i_end0_curr) { + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fa = v_fx; + v_curr.ptr += 4; + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fa = v_fx; + v_curr.ptr += 4; + } + v_curr.len = 4; + uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); + while (v_curr.ptr < i_end1_curr) { + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fa = v_fx; + v_curr.ptr += 4; + } + v_curr.len = 0; + } + } else { + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + wuffs_base__slice_u8 i_slice_prev = a_prev; + v_prev.ptr = i_slice_prev.ptr; + i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); + while (v_curr.ptr < i_end0_curr) { + v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fa = v_fx; + v_curr.ptr += 4; + v_prev.ptr += 4; + v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fa = v_fx; + v_curr.ptr += 4; + v_prev.ptr += 4; + } + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); + while (v_curr.ptr < i_end1_curr) { + v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fa = v_fx; + v_curr.ptr += 4; + v_prev.ptr += 4; + } + v_curr.len = 0; + v_prev.len = 0; + } + } + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +// ‼ WUFFS MULTI-FILE SECTION +arm_neon +// -------- func png.decoder.filter_4_distance_3_arm_neon + +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4_distance_3_arm_neon( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + wuffs_base__slice_u8 v_curr = {0}; + wuffs_base__slice_u8 v_prev = {0}; + uint8x8_t v_fa = {0}; + uint8x8_t v_fb = {0}; + uint8x8_t v_fc = {0}; + uint8x8_t v_fx = {0}; + uint16x8_t v_fafb = {0}; + uint16x8_t v_fcfc = {0}; + uint16x8_t v_pa = {0}; + uint16x8_t v_pb = {0}; + uint16x8_t v_pc = {0}; + uint16x8_t v_cmpab = {0}; + uint16x8_t v_cmpac = {0}; + uint8x8_t v_picka = {0}; + uint8x8_t v_pickb = {0}; + + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + wuffs_base__slice_u8 i_slice_prev = a_prev; + v_prev.ptr = i_slice_prev.ptr; + i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6); + while (v_curr.ptr < i_end0_curr) { + v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fafb = vaddl_u8(v_fa, v_fb); + v_fcfc = vaddl_u8(v_fc, v_fc); + v_pa = vabdl_u8(v_fb, v_fc); + v_pb = vabdl_u8(v_fa, v_fc); + v_pc = vabdq_u16(v_fafb, v_fcfc); + v_cmpab = vcleq_u16(v_pa, v_pb); + v_cmpac = vcleq_u16(v_pa, v_pc); + v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); + v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); + v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); + wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fc = v_fb; + v_fa = v_fx; + v_curr.ptr += 3; + v_prev.ptr += 3; + v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fafb = vaddl_u8(v_fa, v_fb); + v_fcfc = vaddl_u8(v_fc, v_fc); + v_pa = vabdl_u8(v_fb, v_fc); + v_pb = vabdl_u8(v_fa, v_fc); + v_pc = vabdq_u16(v_fafb, v_fcfc); + v_cmpab = vcleq_u16(v_pa, v_pb); + v_cmpac = vcleq_u16(v_pa, v_pc); + v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); + v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); + v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); + wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fc = v_fb; + v_fa = v_fx; + v_curr.ptr += 3; + v_prev.ptr += 3; + } + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end1_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3); + while (v_curr.ptr < i_end1_curr) { + v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fafb = vaddl_u8(v_fa, v_fb); + v_fcfc = vaddl_u8(v_fc, v_fc); + v_pa = vabdl_u8(v_fb, v_fc); + v_pb = vabdl_u8(v_fa, v_fc); + v_pc = vabdq_u16(v_fafb, v_fcfc); + v_cmpab = vcleq_u16(v_pa, v_pb); + v_cmpac = vcleq_u16(v_pa, v_pc); + v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); + v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); + v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); + wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fc = v_fb; + v_fa = v_fx; + v_curr.ptr += 3; + v_prev.ptr += 3; + } + v_curr.len = 3; + v_prev.len = 3; + uint8_t* i_end2_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); + while (v_curr.ptr < i_end2_curr) { + v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); + v_fafb = vaddl_u8(v_fa, v_fb); + v_fcfc = vaddl_u8(v_fc, v_fc); + v_pa = vabdl_u8(v_fb, v_fc); + v_pb = vabdl_u8(v_fa, v_fc); + v_pc = vabdq_u16(v_fafb, v_fcfc); + v_cmpab = vcleq_u16(v_pa, v_pb); + v_cmpac = vcleq_u16(v_pa, v_pc); + v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); + v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); + v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); + wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_curr.ptr += 3; + v_prev.ptr += 3; + } + v_curr.len = 0; + v_prev.len = 0; + } + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +// ‼ WUFFS MULTI-FILE SECTION +arm_neon +// -------- func png.decoder.filter_4_distance_4_arm_neon + +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4_distance_4_arm_neon( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + wuffs_base__slice_u8 v_curr = {0}; + wuffs_base__slice_u8 v_prev = {0}; + uint8x8_t v_fa = {0}; + uint8x8_t v_fb = {0}; + uint8x8_t v_fc = {0}; + uint8x8_t v_fx = {0}; + uint16x8_t v_fafb = {0}; + uint16x8_t v_fcfc = {0}; + uint16x8_t v_pa = {0}; + uint16x8_t v_pb = {0}; + uint16x8_t v_pc = {0}; + uint16x8_t v_cmpab = {0}; + uint16x8_t v_cmpac = {0}; + uint8x8_t v_picka = {0}; + uint8x8_t v_pickb = {0}; + + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + wuffs_base__slice_u8 i_slice_prev = a_prev; + v_prev.ptr = i_slice_prev.ptr; + i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); + while (v_curr.ptr < i_end0_curr) { + v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fafb = vaddl_u8(v_fa, v_fb); + v_fcfc = vaddl_u8(v_fc, v_fc); + v_pa = vabdl_u8(v_fb, v_fc); + v_pb = vabdl_u8(v_fa, v_fc); + v_pc = vabdq_u16(v_fafb, v_fcfc); + v_cmpab = vcleq_u16(v_pa, v_pb); + v_cmpac = vcleq_u16(v_pa, v_pc); + v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); + v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); + v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fc = v_fb; + v_fa = v_fx; + v_curr.ptr += 4; + v_prev.ptr += 4; + v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fafb = vaddl_u8(v_fa, v_fb); + v_fcfc = vaddl_u8(v_fc, v_fc); + v_pa = vabdl_u8(v_fb, v_fc); + v_pb = vabdl_u8(v_fa, v_fc); + v_pc = vabdq_u16(v_fafb, v_fcfc); + v_cmpab = vcleq_u16(v_pa, v_pb); + v_cmpac = vcleq_u16(v_pa, v_pc); + v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); + v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); + v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fc = v_fb; + v_fa = v_fx; + v_curr.ptr += 4; + v_prev.ptr += 4; + } + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); + while (v_curr.ptr < i_end1_curr) { + v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_fafb = vaddl_u8(v_fa, v_fb); + v_fcfc = vaddl_u8(v_fc, v_fc); + v_pa = vabdl_u8(v_fb, v_fc); + v_pb = vabdl_u8(v_fa, v_fc); + v_pc = vabdq_u16(v_fafb, v_fcfc); + v_cmpab = vcleq_u16(v_pa, v_pb); + v_cmpac = vcleq_u16(v_pa, v_pc); + v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); + v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); + v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0)); + v_fc = v_fb; + v_fa = v_fx; + v_curr.ptr += 4; + v_prev.ptr += 4; + } + v_curr.len = 0; + v_prev.len = 0; + } + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +// -------- func png.decoder.filter_1 + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_1( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr) { + return (*self->private_impl.choosy_filter_1)(self, a_curr); +} + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_1__choosy_default( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr) { + uint64_t v_filter_distance = 0; + uint8_t v_fa = 0; + uint64_t v_i_start = 0; + uint64_t v_i = 0; + + v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); + v_i_start = 0; + while (v_i_start < v_filter_distance) { + v_fa = 0; + v_i = v_i_start; + while (v_i < ((uint64_t)(a_curr.len))) { + a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + v_fa)); + v_fa = a_curr.ptr[v_i]; + v_i += v_filter_distance; + } + v_i_start += 1; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.filter_1_distance_3_fallback + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_1_distance_3_fallback( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr) { + wuffs_base__slice_u8 v_curr = {0}; + uint8_t v_fa0 = 0; + uint8_t v_fa1 = 0; + uint8_t v_fa2 = 0; + + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + v_curr.len = 3; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6); + while (v_curr.ptr < i_end0_curr) { + v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0])); + v_curr.ptr[0] = v_fa0; + v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1])); + v_curr.ptr[1] = v_fa1; + v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2])); + v_curr.ptr[2] = v_fa2; + v_curr.ptr += 3; + v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0])); + v_curr.ptr[0] = v_fa0; + v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1])); + v_curr.ptr[1] = v_fa1; + v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2])); + v_curr.ptr[2] = v_fa2; + v_curr.ptr += 3; + } + v_curr.len = 3; + uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); + while (v_curr.ptr < i_end1_curr) { + v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0])); + v_curr.ptr[0] = v_fa0; + v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1])); + v_curr.ptr[1] = v_fa1; + v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2])); + v_curr.ptr[2] = v_fa2; + v_curr.ptr += 3; + } + v_curr.len = 0; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.filter_1_distance_4_fallback + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_1_distance_4_fallback( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr) { + wuffs_base__slice_u8 v_curr = {0}; + uint8_t v_fa0 = 0; + uint8_t v_fa1 = 0; + uint8_t v_fa2 = 0; + uint8_t v_fa3 = 0; + + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + v_curr.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); + while (v_curr.ptr < i_end0_curr) { + v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0])); + v_curr.ptr[0] = v_fa0; + v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1])); + v_curr.ptr[1] = v_fa1; + v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2])); + v_curr.ptr[2] = v_fa2; + v_fa3 = ((uint8_t)(v_fa3 + v_curr.ptr[3])); + v_curr.ptr[3] = v_fa3; + v_curr.ptr += 4; + } + v_curr.len = 0; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.filter_2 + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_2( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + uint64_t v_n = 0; + uint64_t v_i = 0; + + v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); + v_i = 0; + while (v_i < v_n) { + a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); + v_i += 1; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.filter_3 + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_3( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + return (*self->private_impl.choosy_filter_3)(self, a_curr, a_prev); +} + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_3__choosy_default( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + uint64_t v_filter_distance = 0; + uint64_t v_n = 0; + uint64_t v_i = 0; + + v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); + if (((uint64_t)(a_prev.len)) == 0) { + v_i = v_filter_distance; + while (v_i < ((uint64_t)(a_curr.len))) { + a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + (a_curr.ptr[(v_i - v_filter_distance)] / 2))); + v_i += 1; + } + } else { + v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); + v_i = 0; + while ((v_i < v_n) && (v_i < v_filter_distance)) { + a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + (a_prev.ptr[v_i] / 2))); + v_i += 1; + } + v_i = v_filter_distance; + while (v_i < v_n) { + a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(((((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])) + ((uint32_t)(a_prev.ptr[v_i]))) / 2))))); + v_i += 1; + } + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.filter_3_distance_3_fallback + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_3_distance_3_fallback( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + wuffs_base__slice_u8 v_curr = {0}; + wuffs_base__slice_u8 v_prev = {0}; + uint8_t v_fa0 = 0; + uint8_t v_fa1 = 0; + uint8_t v_fa2 = 0; + + if (((uint64_t)(a_prev.len)) == 0) { + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + v_curr.len = 3; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6); + while (v_curr.ptr < i_end0_curr) { + v_fa0 = ((uint8_t)((v_fa0 / 2) + v_curr.ptr[0])); + v_curr.ptr[0] = v_fa0; + v_fa1 = ((uint8_t)((v_fa1 / 2) + v_curr.ptr[1])); + v_curr.ptr[1] = v_fa1; + v_fa2 = ((uint8_t)((v_fa2 / 2) + v_curr.ptr[2])); + v_curr.ptr[2] = v_fa2; + v_curr.ptr += 3; + v_fa0 = ((uint8_t)((v_fa0 / 2) + v_curr.ptr[0])); + v_curr.ptr[0] = v_fa0; + v_fa1 = ((uint8_t)((v_fa1 / 2) + v_curr.ptr[1])); + v_curr.ptr[1] = v_fa1; + v_fa2 = ((uint8_t)((v_fa2 / 2) + v_curr.ptr[2])); + v_curr.ptr[2] = v_fa2; + v_curr.ptr += 3; + } + v_curr.len = 3; + uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); + while (v_curr.ptr < i_end1_curr) { + v_fa0 = ((uint8_t)((v_fa0 / 2) + v_curr.ptr[0])); + v_curr.ptr[0] = v_fa0; + v_fa1 = ((uint8_t)((v_fa1 / 2) + v_curr.ptr[1])); + v_curr.ptr[1] = v_fa1; + v_fa2 = ((uint8_t)((v_fa2 / 2) + v_curr.ptr[2])); + v_curr.ptr[2] = v_fa2; + v_curr.ptr += 3; + } + v_curr.len = 0; + } + } else { + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + wuffs_base__slice_u8 i_slice_prev = a_prev; + v_prev.ptr = i_slice_prev.ptr; + i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); + v_curr.len = 3; + v_prev.len = 3; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6); + while (v_curr.ptr < i_end0_curr) { + v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0]))) / 2))) + v_curr.ptr[0])); + v_curr.ptr[0] = v_fa0; + v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1]))) / 2))) + v_curr.ptr[1])); + v_curr.ptr[1] = v_fa1; + v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2]))) / 2))) + v_curr.ptr[2])); + v_curr.ptr[2] = v_fa2; + v_curr.ptr += 3; + v_prev.ptr += 3; + v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0]))) / 2))) + v_curr.ptr[0])); + v_curr.ptr[0] = v_fa0; + v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1]))) / 2))) + v_curr.ptr[1])); + v_curr.ptr[1] = v_fa1; + v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2]))) / 2))) + v_curr.ptr[2])); + v_curr.ptr[2] = v_fa2; + v_curr.ptr += 3; + v_prev.ptr += 3; + } + v_curr.len = 3; + v_prev.len = 3; + uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); + while (v_curr.ptr < i_end1_curr) { + v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0]))) / 2))) + v_curr.ptr[0])); + v_curr.ptr[0] = v_fa0; + v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1]))) / 2))) + v_curr.ptr[1])); + v_curr.ptr[1] = v_fa1; + v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2]))) / 2))) + v_curr.ptr[2])); + v_curr.ptr[2] = v_fa2; + v_curr.ptr += 3; + v_prev.ptr += 3; + } + v_curr.len = 0; + v_prev.len = 0; + } + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.filter_3_distance_4_fallback + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_3_distance_4_fallback( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + wuffs_base__slice_u8 v_curr = {0}; + wuffs_base__slice_u8 v_prev = {0}; + uint8_t v_fa0 = 0; + uint8_t v_fa1 = 0; + uint8_t v_fa2 = 0; + uint8_t v_fa3 = 0; + + if (((uint64_t)(a_prev.len)) == 0) { + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + v_curr.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); + while (v_curr.ptr < i_end0_curr) { + v_fa0 = ((uint8_t)((v_fa0 / 2) + v_curr.ptr[0])); + v_curr.ptr[0] = v_fa0; + v_fa1 = ((uint8_t)((v_fa1 / 2) + v_curr.ptr[1])); + v_curr.ptr[1] = v_fa1; + v_fa2 = ((uint8_t)((v_fa2 / 2) + v_curr.ptr[2])); + v_curr.ptr[2] = v_fa2; + v_fa3 = ((uint8_t)((v_fa3 / 2) + v_curr.ptr[3])); + v_curr.ptr[3] = v_fa3; + v_curr.ptr += 4; + } + v_curr.len = 0; + } + } else { + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + wuffs_base__slice_u8 i_slice_prev = a_prev; + v_prev.ptr = i_slice_prev.ptr; + i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); + while (v_curr.ptr < i_end0_curr) { + v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0]))) / 2))) + v_curr.ptr[0])); + v_curr.ptr[0] = v_fa0; + v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1]))) / 2))) + v_curr.ptr[1])); + v_curr.ptr[1] = v_fa1; + v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2]))) / 2))) + v_curr.ptr[2])); + v_curr.ptr[2] = v_fa2; + v_fa3 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa3)) + ((uint32_t)(v_prev.ptr[3]))) / 2))) + v_curr.ptr[3])); + v_curr.ptr[3] = v_fa3; + v_curr.ptr += 4; + v_prev.ptr += 4; + } + v_curr.len = 0; + v_prev.len = 0; + } + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.filter_4 + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + return (*self->private_impl.choosy_filter_4)(self, a_curr, a_prev); +} + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4__choosy_default( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + uint64_t v_filter_distance = 0; + uint64_t v_n = 0; + uint64_t v_i = 0; + uint32_t v_fa = 0; + uint32_t v_fb = 0; + uint32_t v_fc = 0; + uint32_t v_pp = 0; + uint32_t v_pa = 0; + uint32_t v_pb = 0; + uint32_t v_pc = 0; + + v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); + v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); + v_i = 0; + while ((v_i < v_n) && (v_i < v_filter_distance)) { + a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); + v_i += 1; + } + v_i = v_filter_distance; + while (v_i < v_n) { + v_fa = ((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])); + v_fb = ((uint32_t)(a_prev.ptr[v_i])); + v_fc = ((uint32_t)(a_prev.ptr[(v_i - v_filter_distance)])); + v_pp = ((uint32_t)(((uint32_t)(v_fa + v_fb)) - v_fc)); + v_pa = ((uint32_t)(v_pp - v_fa)); + if (v_pa >= 2147483648) { + v_pa = ((uint32_t)(0 - v_pa)); + } + v_pb = ((uint32_t)(v_pp - v_fb)); + if (v_pb >= 2147483648) { + v_pb = ((uint32_t)(0 - v_pb)); + } + v_pc = ((uint32_t)(v_pp - v_fc)); + if (v_pc >= 2147483648) { + v_pc = ((uint32_t)(0 - v_pc)); + } + if ((v_pa <= v_pb) && (v_pa <= v_pc)) { + } else if (v_pb <= v_pc) { + v_fa = v_fb; + } else { + v_fa = v_fc; + } + a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)((v_fa & 255))))); + v_i += 1; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.filter_4_distance_3_fallback + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4_distance_3_fallback( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + wuffs_base__slice_u8 v_curr = {0}; + wuffs_base__slice_u8 v_prev = {0}; + uint32_t v_fa0 = 0; + uint32_t v_fa1 = 0; + uint32_t v_fa2 = 0; + uint32_t v_fb0 = 0; + uint32_t v_fb1 = 0; + uint32_t v_fb2 = 0; + uint32_t v_fc0 = 0; + uint32_t v_fc1 = 0; + uint32_t v_fc2 = 0; + uint32_t v_pp0 = 0; + uint32_t v_pp1 = 0; + uint32_t v_pp2 = 0; + uint32_t v_pa0 = 0; + uint32_t v_pa1 = 0; + uint32_t v_pa2 = 0; + uint32_t v_pb0 = 0; + uint32_t v_pb1 = 0; + uint32_t v_pb2 = 0; + uint32_t v_pc0 = 0; + uint32_t v_pc1 = 0; + uint32_t v_pc2 = 0; + + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + wuffs_base__slice_u8 i_slice_prev = a_prev; + v_prev.ptr = i_slice_prev.ptr; + i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); + v_curr.len = 3; + v_prev.len = 3; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); + while (v_curr.ptr < i_end0_curr) { + v_fb0 = ((uint32_t)(v_prev.ptr[0])); + v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); + v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); + if (v_pa0 >= 2147483648) { + v_pa0 = ((uint32_t)(0 - v_pa0)); + } + v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); + if (v_pb0 >= 2147483648) { + v_pb0 = ((uint32_t)(0 - v_pb0)); + } + v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); + if (v_pc0 >= 2147483648) { + v_pc0 = ((uint32_t)(0 - v_pc0)); + } + if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { + } else if (v_pb0 <= v_pc0) { + v_fa0 = v_fb0; + } else { + v_fa0 = v_fc0; + } + v_curr.ptr[0] = ((uint8_t)(v_curr.ptr[0] + ((uint8_t)((v_fa0 & 255))))); + v_fa0 = ((uint32_t)(v_curr.ptr[0])); + v_fc0 = v_fb0; + v_fb1 = ((uint32_t)(v_prev.ptr[1])); + v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); + v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); + if (v_pa1 >= 2147483648) { + v_pa1 = ((uint32_t)(0 - v_pa1)); + } + v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); + if (v_pb1 >= 2147483648) { + v_pb1 = ((uint32_t)(0 - v_pb1)); + } + v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); + if (v_pc1 >= 2147483648) { + v_pc1 = ((uint32_t)(0 - v_pc1)); + } + if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { + } else if (v_pb1 <= v_pc1) { + v_fa1 = v_fb1; + } else { + v_fa1 = v_fc1; + } + v_curr.ptr[1] = ((uint8_t)(v_curr.ptr[1] + ((uint8_t)((v_fa1 & 255))))); + v_fa1 = ((uint32_t)(v_curr.ptr[1])); + v_fc1 = v_fb1; + v_fb2 = ((uint32_t)(v_prev.ptr[2])); + v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); + v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); + if (v_pa2 >= 2147483648) { + v_pa2 = ((uint32_t)(0 - v_pa2)); + } + v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); + if (v_pb2 >= 2147483648) { + v_pb2 = ((uint32_t)(0 - v_pb2)); + } + v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); + if (v_pc2 >= 2147483648) { + v_pc2 = ((uint32_t)(0 - v_pc2)); + } + if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { + } else if (v_pb2 <= v_pc2) { + v_fa2 = v_fb2; + } else { + v_fa2 = v_fc2; + } + v_curr.ptr[2] = ((uint8_t)(v_curr.ptr[2] + ((uint8_t)((v_fa2 & 255))))); + v_fa2 = ((uint32_t)(v_curr.ptr[2])); + v_fc2 = v_fb2; + v_curr.ptr += 3; + v_prev.ptr += 3; + } + v_curr.len = 0; + v_prev.len = 0; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.filter_4_distance_4_fallback + +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4_distance_4_fallback( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + wuffs_base__slice_u8 v_curr = {0}; + wuffs_base__slice_u8 v_prev = {0}; + uint32_t v_fa0 = 0; + uint32_t v_fa1 = 0; + uint32_t v_fa2 = 0; + uint32_t v_fa3 = 0; + uint32_t v_fb0 = 0; + uint32_t v_fb1 = 0; + uint32_t v_fb2 = 0; + uint32_t v_fb3 = 0; + uint32_t v_fc0 = 0; + uint32_t v_fc1 = 0; + uint32_t v_fc2 = 0; + uint32_t v_fc3 = 0; + uint32_t v_pp0 = 0; + uint32_t v_pp1 = 0; + uint32_t v_pp2 = 0; + uint32_t v_pp3 = 0; + uint32_t v_pa0 = 0; + uint32_t v_pa1 = 0; + uint32_t v_pa2 = 0; + uint32_t v_pa3 = 0; + uint32_t v_pb0 = 0; + uint32_t v_pb1 = 0; + uint32_t v_pb2 = 0; + uint32_t v_pb3 = 0; + uint32_t v_pc0 = 0; + uint32_t v_pc1 = 0; + uint32_t v_pc2 = 0; + uint32_t v_pc3 = 0; + + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + wuffs_base__slice_u8 i_slice_prev = a_prev; + v_prev.ptr = i_slice_prev.ptr; + i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); + while (v_curr.ptr < i_end0_curr) { + v_fb0 = ((uint32_t)(v_prev.ptr[0])); + v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); + v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); + if (v_pa0 >= 2147483648) { + v_pa0 = ((uint32_t)(0 - v_pa0)); + } + v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); + if (v_pb0 >= 2147483648) { + v_pb0 = ((uint32_t)(0 - v_pb0)); + } + v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); + if (v_pc0 >= 2147483648) { + v_pc0 = ((uint32_t)(0 - v_pc0)); + } + if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { + } else if (v_pb0 <= v_pc0) { + v_fa0 = v_fb0; + } else { + v_fa0 = v_fc0; + } + v_curr.ptr[0] = ((uint8_t)(v_curr.ptr[0] + ((uint8_t)((v_fa0 & 255))))); + v_fa0 = ((uint32_t)(v_curr.ptr[0])); + v_fc0 = v_fb0; + v_fb1 = ((uint32_t)(v_prev.ptr[1])); + v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); + v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); + if (v_pa1 >= 2147483648) { + v_pa1 = ((uint32_t)(0 - v_pa1)); + } + v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); + if (v_pb1 >= 2147483648) { + v_pb1 = ((uint32_t)(0 - v_pb1)); + } + v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); + if (v_pc1 >= 2147483648) { + v_pc1 = ((uint32_t)(0 - v_pc1)); + } + if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { + } else if (v_pb1 <= v_pc1) { + v_fa1 = v_fb1; + } else { + v_fa1 = v_fc1; + } + v_curr.ptr[1] = ((uint8_t)(v_curr.ptr[1] + ((uint8_t)((v_fa1 & 255))))); + v_fa1 = ((uint32_t)(v_curr.ptr[1])); + v_fc1 = v_fb1; + v_fb2 = ((uint32_t)(v_prev.ptr[2])); + v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); + v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); + if (v_pa2 >= 2147483648) { + v_pa2 = ((uint32_t)(0 - v_pa2)); + } + v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); + if (v_pb2 >= 2147483648) { + v_pb2 = ((uint32_t)(0 - v_pb2)); + } + v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); + if (v_pc2 >= 2147483648) { + v_pc2 = ((uint32_t)(0 - v_pc2)); + } + if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { + } else if (v_pb2 <= v_pc2) { + v_fa2 = v_fb2; + } else { + v_fa2 = v_fc2; + } + v_curr.ptr[2] = ((uint8_t)(v_curr.ptr[2] + ((uint8_t)((v_fa2 & 255))))); + v_fa2 = ((uint32_t)(v_curr.ptr[2])); + v_fc2 = v_fb2; + v_fb3 = ((uint32_t)(v_prev.ptr[3])); + v_pp3 = ((uint32_t)(((uint32_t)(v_fa3 + v_fb3)) - v_fc3)); + v_pa3 = ((uint32_t)(v_pp3 - v_fa3)); + if (v_pa3 >= 2147483648) { + v_pa3 = ((uint32_t)(0 - v_pa3)); + } + v_pb3 = ((uint32_t)(v_pp3 - v_fb3)); + if (v_pb3 >= 2147483648) { + v_pb3 = ((uint32_t)(0 - v_pb3)); + } + v_pc3 = ((uint32_t)(v_pp3 - v_fc3)); + if (v_pc3 >= 2147483648) { + v_pc3 = ((uint32_t)(0 - v_pc3)); + } + if ((v_pa3 <= v_pb3) && (v_pa3 <= v_pc3)) { + } else if (v_pb3 <= v_pc3) { + v_fa3 = v_fb3; + } else { + v_fa3 = v_fc3; + } + v_curr.ptr[3] = ((uint8_t)(v_curr.ptr[3] + ((uint8_t)((v_fa3 & 255))))); + v_fa3 = ((uint32_t)(v_curr.ptr[3])); + v_fc3 = v_fb3; + v_curr.ptr += 4; + v_prev.ptr += 4; + } + v_curr.len = 0; + v_prev.len = 0; + } + return wuffs_base__make_empty_struct(); +} + +// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +// -------- func png.decoder.filter_1_distance_4_x86_sse42 + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +static wuffs_base__empty_struct +wuffs_png__decoder__filter_1_distance_4_x86_sse42( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr) { + wuffs_base__slice_u8 v_curr = {0}; + __m128i v_x128 = {0}; + __m128i v_a128 = {0}; + + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + v_curr.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); + while (v_curr.ptr < i_end0_curr) { + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_add_epi8(v_x128, v_a128); + v_a128 = v_x128; + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 4; + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_add_epi8(v_x128, v_a128); + v_a128 = v_x128; + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 4; + } + v_curr.len = 4; + uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); + while (v_curr.ptr < i_end1_curr) { + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_add_epi8(v_x128, v_a128); + v_a128 = v_x128; + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 4; + } + v_curr.len = 0; + } + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +// -------- func png.decoder.filter_3_distance_4_x86_sse42 + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +static wuffs_base__empty_struct +wuffs_png__decoder__filter_3_distance_4_x86_sse42( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + wuffs_base__slice_u8 v_curr = {0}; + wuffs_base__slice_u8 v_prev = {0}; + __m128i v_x128 = {0}; + __m128i v_a128 = {0}; + __m128i v_b128 = {0}; + __m128i v_p128 = {0}; + __m128i v_k128 = {0}; + + if (((uint64_t)(a_prev.len)) == 0) { + v_k128 = _mm_set1_epi8((int8_t)(254)); + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + v_curr.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); + while (v_curr.ptr < i_end0_curr) { + v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_a128 = v_x128; + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 4; + v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_a128 = v_x128; + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 4; + } + v_curr.len = 4; + uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); + while (v_curr.ptr < i_end1_curr) { + v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_a128 = v_x128; + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 4; + } + v_curr.len = 0; + } + } else { + v_k128 = _mm_set1_epi8((int8_t)(1)); + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + wuffs_base__slice_u8 i_slice_prev = a_prev; + v_prev.ptr = i_slice_prev.ptr; + i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); + while (v_curr.ptr < i_end0_curr) { + v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_p128 = _mm_avg_epu8(v_a128, v_b128); + v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_a128 = v_x128; + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 4; + v_prev.ptr += 4; + v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_p128 = _mm_avg_epu8(v_a128, v_b128); + v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_a128 = v_x128; + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 4; + v_prev.ptr += 4; + } + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); + while (v_curr.ptr < i_end1_curr) { + v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_p128 = _mm_avg_epu8(v_a128, v_b128); + v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_a128 = v_x128; + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 4; + v_prev.ptr += 4; + } + v_curr.len = 0; + v_prev.len = 0; + } + } + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +// -------- func png.decoder.filter_4_distance_3_x86_sse42 + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4_distance_3_x86_sse42( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + wuffs_base__slice_u8 v_curr = {0}; + wuffs_base__slice_u8 v_prev = {0}; + __m128i v_x128 = {0}; + __m128i v_a128 = {0}; + __m128i v_b128 = {0}; + __m128i v_c128 = {0}; + __m128i v_p128 = {0}; + __m128i v_pa128 = {0}; + __m128i v_pb128 = {0}; + __m128i v_pc128 = {0}; + __m128i v_smallest128 = {0}; + __m128i v_z128 = {0}; + + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + wuffs_base__slice_u8 i_slice_prev = a_prev; + v_prev.ptr = i_slice_prev.ptr; + i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6); + while (v_curr.ptr < i_end0_curr) { + v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); + v_pa128 = _mm_sub_epi16(v_b128, v_c128); + v_pb128 = _mm_sub_epi16(v_a128, v_c128); + v_pc128 = _mm_add_epi16(v_pa128, v_pb128); + v_pa128 = _mm_abs_epi16(v_pa128); + v_pb128 = _mm_abs_epi16(v_pb128); + v_pc128 = _mm_abs_epi16(v_pc128); + v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); + v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_a128 = v_x128; + v_c128 = v_b128; + v_x128 = _mm_packus_epi16(v_x128, v_x128); + wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 3; + v_prev.ptr += 3; + v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); + v_pa128 = _mm_sub_epi16(v_b128, v_c128); + v_pb128 = _mm_sub_epi16(v_a128, v_c128); + v_pc128 = _mm_add_epi16(v_pa128, v_pb128); + v_pa128 = _mm_abs_epi16(v_pa128); + v_pb128 = _mm_abs_epi16(v_pb128); + v_pc128 = _mm_abs_epi16(v_pc128); + v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); + v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_a128 = v_x128; + v_c128 = v_b128; + v_x128 = _mm_packus_epi16(v_x128, v_x128); + wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 3; + v_prev.ptr += 3; + } + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end1_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3); + while (v_curr.ptr < i_end1_curr) { + v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); + v_pa128 = _mm_sub_epi16(v_b128, v_c128); + v_pb128 = _mm_sub_epi16(v_a128, v_c128); + v_pc128 = _mm_add_epi16(v_pa128, v_pb128); + v_pa128 = _mm_abs_epi16(v_pa128); + v_pb128 = _mm_abs_epi16(v_pb128); + v_pc128 = _mm_abs_epi16(v_pc128); + v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); + v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_a128 = v_x128; + v_c128 = v_b128; + v_x128 = _mm_packus_epi16(v_x128, v_x128); + wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 3; + v_prev.ptr += 3; + } + v_curr.len = 3; + v_prev.len = 3; + uint8_t* i_end2_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); + while (v_curr.ptr < i_end2_curr) { + v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); + v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); + v_pa128 = _mm_sub_epi16(v_b128, v_c128); + v_pb128 = _mm_sub_epi16(v_a128, v_c128); + v_pc128 = _mm_add_epi16(v_pa128, v_pb128); + v_pa128 = _mm_abs_epi16(v_pa128); + v_pb128 = _mm_abs_epi16(v_pb128); + v_pc128 = _mm_abs_epi16(v_pc128); + v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); + v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_x128 = _mm_packus_epi16(v_x128, v_x128); + wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 3; + v_prev.ptr += 3; + } + v_curr.len = 0; + v_prev.len = 0; + } + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +// -------- func png.decoder.filter_4_distance_4_x86_sse42 + +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +static wuffs_base__empty_struct +wuffs_png__decoder__filter_4_distance_4_x86_sse42( + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev) { + wuffs_base__slice_u8 v_curr = {0}; + wuffs_base__slice_u8 v_prev = {0}; + __m128i v_x128 = {0}; + __m128i v_a128 = {0}; + __m128i v_b128 = {0}; + __m128i v_c128 = {0}; + __m128i v_p128 = {0}; + __m128i v_pa128 = {0}; + __m128i v_pb128 = {0}; + __m128i v_pc128 = {0}; + __m128i v_smallest128 = {0}; + __m128i v_z128 = {0}; + + { + wuffs_base__slice_u8 i_slice_curr = a_curr; + v_curr.ptr = i_slice_curr.ptr; + wuffs_base__slice_u8 i_slice_prev = a_prev; + v_prev.ptr = i_slice_prev.ptr; + i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); + while (v_curr.ptr < i_end0_curr) { + v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); + v_pa128 = _mm_sub_epi16(v_b128, v_c128); + v_pb128 = _mm_sub_epi16(v_a128, v_c128); + v_pc128 = _mm_add_epi16(v_pa128, v_pb128); + v_pa128 = _mm_abs_epi16(v_pa128); + v_pb128 = _mm_abs_epi16(v_pb128); + v_pc128 = _mm_abs_epi16(v_pc128); + v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); + v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_a128 = v_x128; + v_c128 = v_b128; + v_x128 = _mm_packus_epi16(v_x128, v_x128); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 4; + v_prev.ptr += 4; + v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); + v_pa128 = _mm_sub_epi16(v_b128, v_c128); + v_pb128 = _mm_sub_epi16(v_a128, v_c128); + v_pc128 = _mm_add_epi16(v_pa128, v_pb128); + v_pa128 = _mm_abs_epi16(v_pa128); + v_pb128 = _mm_abs_epi16(v_pb128); + v_pc128 = _mm_abs_epi16(v_pc128); + v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); + v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_a128 = v_x128; + v_c128 = v_b128; + v_x128 = _mm_packus_epi16(v_x128, v_x128); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 4; + v_prev.ptr += 4; + } + v_curr.len = 4; + v_prev.len = 4; + uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); + while (v_curr.ptr < i_end1_curr) { + v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); + v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); + v_pa128 = _mm_sub_epi16(v_b128, v_c128); + v_pb128 = _mm_sub_epi16(v_a128, v_c128); + v_pc128 = _mm_add_epi16(v_pa128, v_pb128); + v_pa128 = _mm_abs_epi16(v_pa128); + v_pb128 = _mm_abs_epi16(v_pb128); + v_pc128 = _mm_abs_epi16(v_pc128); + v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); + v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); + v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); + v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); + v_x128 = _mm_add_epi8(v_x128, v_p128); + v_a128 = v_x128; + v_c128 = v_b128; + v_x128 = _mm_packus_epi16(v_x128, v_x128); + wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); + v_curr.ptr += 4; + v_prev.ptr += 4; + } + v_curr.len = 0; + v_prev.len = 0; + } + return wuffs_base__make_empty_struct(); +} +#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +// -------- func png.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_png__decoder__set_quirk_enabled( + wuffs_png__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + if (a_quirk == 1) { + self->private_impl.f_ignore_checksum = a_enabled; + wuffs_zlib__decoder__set_quirk_enabled(&self->private_data.f_zlib, a_quirk, a_enabled); + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.decode_image_config + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_png__decoder__decode_image_config( + wuffs_png__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_png__decoder__do_decode_image_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_png__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_image_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func png.decoder.do_decode_image_config + +static wuffs_base__status +wuffs_png__decoder__do_decode_image_config( + wuffs_png__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint64_t v_magic = 0; + uint64_t v_mark = 0; + uint32_t v_checksum_have = 0; + uint32_t v_checksum_want = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; + if (coro_susp_point) { + v_checksum_have = self->private_data.s_do_decode_image_config[0].v_checksum_have; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence != 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } else if ( ! self->private_impl.f_seen_ihdr) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint64_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { + t_0 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); + iop_a_src += 8; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; + if (num_bits_0 == 56) { + t_0 = ((uint64_t)(*scratch)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } + v_magic = t_0; + } + if (v_magic != 727905341920923785) { + status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint64_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { + t_1 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); + iop_a_src += 8; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; + if (num_bits_1 == 56) { + t_1 = ((uint64_t)(*scratch)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } + v_magic = t_1; + } + if (v_magic != 5927942488114331648) { + if (v_magic == 5278895250759221248) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_cgbi_extension); + goto exit; + } + status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } + self->private_impl.f_chunk_type_array[0] = 73; + self->private_impl.f_chunk_type_array[1] = 72; + self->private_impl.f_chunk_type_array[2] = 68; + self->private_impl.f_chunk_type_array[3] = 82; + wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, + sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); + wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); + while (true) { + v_mark = ((uint64_t)(iop_a_src - io0_a_src)); + { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + wuffs_base__status t_2 = wuffs_png__decoder__decode_ihdr(self, a_src); + v_status = t_2; + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } + if ( ! self->private_impl.f_ignore_checksum) { + v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); + } + if (wuffs_base__status__is_ok(&v_status)) { + goto label__0__break; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + } + label__0__break:; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + uint32_t t_3; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); + if (num_bits_3 == 24) { + t_3 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_3 += 8; + *scratch |= ((uint64_t)(num_bits_3)); + } + } + v_checksum_want = t_3; + } + if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) { + status = wuffs_base__make_status(wuffs_png__error__bad_checksum); + goto exit; + } + self->private_impl.f_seen_ihdr = true; + } else if (self->private_impl.f_metadata_fourcc != 0) { + self->private_impl.f_call_sequence = 16; + status = wuffs_base__make_status(wuffs_base__note__metadata_reported); + goto ok; + } + label__1__continue:; + while (true) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 8) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); + goto label__1__continue; + } + self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32))); + if (self->private_impl.f_chunk_type == 1413563465) { + if ( ! self->private_impl.f_seen_actl || self->private_impl.f_seen_fctl) { + goto label__1__break; + } + self->private_impl.f_seen_idat = true; + } else if (self->private_impl.f_chunk_type == 1413571686) { + if (self->private_impl.f_seen_idat && self->private_impl.f_seen_fctl) { + goto label__1__break; + } + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + iop_a_src += 8; + if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32) == 0)) { + self->private_impl.f_chunk_type_array[0] = ((uint8_t)(((self->private_impl.f_chunk_type >> 0) & 255))); + self->private_impl.f_chunk_type_array[1] = ((uint8_t)(((self->private_impl.f_chunk_type >> 8) & 255))); + self->private_impl.f_chunk_type_array[2] = ((uint8_t)(((self->private_impl.f_chunk_type >> 16) & 255))); + self->private_impl.f_chunk_type_array[3] = ((uint8_t)(((self->private_impl.f_chunk_type >> 24) & 255))); + wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, + sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); + wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); + } + while (true) { + v_mark = ((uint64_t)(iop_a_src - io0_a_src)); + { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + wuffs_base__status t_4 = wuffs_png__decoder__decode_other_chunk(self, a_src, false); + v_status = t_4; + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } + if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32) == 0)) { + v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); + } + if (wuffs_base__status__is_ok(&v_status)) { + goto label__2__break; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); + } + label__2__break:; + if (self->private_impl.f_metadata_fourcc != 0) { + self->private_impl.f_call_sequence = 16; + status = wuffs_base__make_status(wuffs_base__note__metadata_reported); + goto ok; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + uint32_t t_5; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); + if (num_bits_5 == 24) { + t_5 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_5 += 8; + *scratch |= ((uint64_t)(num_bits_5)); + } + } + v_checksum_want = t_5; + } + if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32) == 0) && (v_checksum_have != v_checksum_want)) { + status = wuffs_base__make_status(wuffs_png__error__bad_checksum); + goto exit; + } + } + label__1__break:; + if ((self->private_impl.f_color_type == 3) && ! self->private_impl.f_seen_plte) { + status = wuffs_base__make_status(wuffs_png__error__missing_palette); + goto exit; + } + self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); + self->private_impl.f_first_config_io_position = self->private_impl.f_frame_config_io_position; + if (a_dst != NULL) { + wuffs_base__image_config__set( + a_dst, + self->private_impl.f_dst_pixfmt, + 0, + self->private_impl.f_width, + self->private_impl.f_height, + self->private_impl.f_first_config_io_position, + ((self->private_impl.f_color_type <= 3) && ! self->private_impl.f_seen_trns)); + } + if ( ! self->private_impl.f_seen_actl) { + self->private_impl.f_num_animation_frames_value = 1; + self->private_impl.f_first_rect_x0 = 0; + self->private_impl.f_first_rect_y0 = 0; + self->private_impl.f_first_rect_x1 = self->private_impl.f_width; + self->private_impl.f_first_rect_y1 = self->private_impl.f_height; + self->private_impl.f_first_duration = 0; + self->private_impl.f_first_disposal = 0; + self->private_impl.f_first_overwrite_instead_of_blend = false; + } + self->private_impl.f_call_sequence = 32; + + ok: + self->private_impl.p_do_decode_image_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_do_decode_image_config[0].v_checksum_have = v_checksum_have; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_ihdr + +static wuffs_base__status +wuffs_png__decoder__decode_ihdr( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_a32 = 0; + uint8_t v_a8 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_ihdr[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_ihdr[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_ihdr[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 24) { + t_0 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)); + } + } + v_a32 = t_0; + } + if ((v_a32 == 0) || (v_a32 >= 2147483648)) { + status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } else if (v_a32 >= 16777216) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); + goto exit; + } + self->private_impl.f_width = v_a32; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_ihdr[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_ihdr[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); + if (num_bits_1 == 24) { + t_1 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)); + } + } + v_a32 = t_1; + } + if ((v_a32 == 0) || (v_a32 >= 2147483648)) { + status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } else if (v_a32 >= 16777216) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); + goto exit; + } + self->private_impl.f_height = v_a32; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + v_a8 = t_2; + } + if (v_a8 > 16) { + status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } + self->private_impl.f_depth = v_a8; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; + v_a8 = t_3; + } + if ((v_a8 == 1) || (v_a8 == 5) || (v_a8 > 6)) { + status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } + self->private_impl.f_color_type = v_a8; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_4 = *iop_a_src++; + v_a8 = t_4; + } + if (v_a8 != 0) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_5 = *iop_a_src++; + v_a8 = t_5; + } + if (v_a8 != 0) { + status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_6 = *iop_a_src++; + v_a8 = t_6; + } + if (v_a8 == 0) { + self->private_impl.f_interlace_pass = 0; + } else if (v_a8 == 1) { + self->private_impl.f_interlace_pass = 1; + self->private_impl.choosy_filter_and_swizzle = ( + &wuffs_png__decoder__filter_and_swizzle_tricky); + } else { + status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } + self->private_impl.f_filter_distance = 0; + wuffs_png__decoder__assign_filter_distance(self); + if (self->private_impl.f_filter_distance == 0) { + status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } + self->private_impl.f_overall_workbuf_length = (((uint64_t)(self->private_impl.f_height)) * (1 + wuffs_png__decoder__calculate_bytes_per_row(self, self->private_impl.f_width))); + wuffs_png__decoder__choose_filter_implementations(self); + + goto ok; + ok: + self->private_impl.p_decode_ihdr[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_ihdr[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.assign_filter_distance + +static wuffs_base__empty_struct +wuffs_png__decoder__assign_filter_distance( + wuffs_png__decoder* self) { + if (self->private_impl.f_depth < 8) { + if ((self->private_impl.f_depth != 1) && (self->private_impl.f_depth != 2) && (self->private_impl.f_depth != 4)) { + return wuffs_base__make_empty_struct(); + } else if (self->private_impl.f_color_type == 0) { + self->private_impl.f_dst_pixfmt = 536870920; + self->private_impl.f_src_pixfmt = 536870920; + } else if (self->private_impl.f_color_type == 3) { + self->private_impl.f_dst_pixfmt = 2198077448; + self->private_impl.f_src_pixfmt = 2198077448; + } else { + return wuffs_base__make_empty_struct(); + } + self->private_impl.f_filter_distance = 1; + self->private_impl.choosy_filter_and_swizzle = ( + &wuffs_png__decoder__filter_and_swizzle_tricky); + } else if (self->private_impl.f_color_type == 0) { + if (self->private_impl.f_depth == 8) { + self->private_impl.f_dst_pixfmt = 536870920; + self->private_impl.f_src_pixfmt = 536870920; + self->private_impl.f_filter_distance = 1; + } else if (self->private_impl.f_depth == 16) { + if (self->private_impl.f_interlace_pass == 0) { + self->private_impl.f_dst_pixfmt = 536870923; + self->private_impl.f_src_pixfmt = 537919499; + } else { + self->private_impl.f_dst_pixfmt = 2164308923; + self->private_impl.f_src_pixfmt = 2164308923; + } + self->private_impl.f_filter_distance = 2; + } + } else if (self->private_impl.f_color_type == 2) { + if (self->private_impl.f_depth == 8) { + self->private_impl.f_dst_pixfmt = 2147485832; + self->private_impl.f_src_pixfmt = 2684356744; + self->private_impl.f_filter_distance = 3; + } else if (self->private_impl.f_depth == 16) { + self->private_impl.f_dst_pixfmt = 2164308923; + self->private_impl.f_src_pixfmt = 2164308923; + self->private_impl.f_filter_distance = 6; + self->private_impl.choosy_filter_and_swizzle = ( + &wuffs_png__decoder__filter_and_swizzle_tricky); + } + } else if (self->private_impl.f_color_type == 3) { + if (self->private_impl.f_depth == 8) { + self->private_impl.f_dst_pixfmt = 2198077448; + self->private_impl.f_src_pixfmt = 2198077448; + self->private_impl.f_filter_distance = 1; + } + } else if (self->private_impl.f_color_type == 4) { + if (self->private_impl.f_depth == 8) { + self->private_impl.f_dst_pixfmt = 2164295816; + self->private_impl.f_src_pixfmt = 2164295816; + self->private_impl.f_filter_distance = 2; + self->private_impl.choosy_filter_and_swizzle = ( + &wuffs_png__decoder__filter_and_swizzle_tricky); + } else if (self->private_impl.f_depth == 16) { + self->private_impl.f_dst_pixfmt = 2164308923; + self->private_impl.f_src_pixfmt = 2164308923; + self->private_impl.f_filter_distance = 4; + self->private_impl.choosy_filter_and_swizzle = ( + &wuffs_png__decoder__filter_and_swizzle_tricky); + } + } else if (self->private_impl.f_color_type == 6) { + if (self->private_impl.f_depth == 8) { + self->private_impl.f_dst_pixfmt = 2164295816; + self->private_impl.f_src_pixfmt = 2701166728; + self->private_impl.f_filter_distance = 4; + } else if (self->private_impl.f_depth == 16) { + self->private_impl.f_dst_pixfmt = 2164308923; + self->private_impl.f_src_pixfmt = 2164308923; + self->private_impl.f_filter_distance = 8; + self->private_impl.choosy_filter_and_swizzle = ( + &wuffs_png__decoder__filter_and_swizzle_tricky); + } + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.calculate_bytes_per_row + +static uint64_t +wuffs_png__decoder__calculate_bytes_per_row( + const wuffs_png__decoder* self, + uint32_t a_width) { + uint64_t v_bytes_per_channel = 0; + + if (self->private_impl.f_depth == 1) { + return ((uint64_t)(((a_width + 7) / 8))); + } else if (self->private_impl.f_depth == 2) { + return ((uint64_t)(((a_width + 3) / 4))); + } else if (self->private_impl.f_depth == 4) { + return ((uint64_t)(((a_width + 1) / 2))); + } + v_bytes_per_channel = ((uint64_t)((self->private_impl.f_depth >> 3))); + return (((uint64_t)(a_width)) * v_bytes_per_channel * ((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type]))); +} + +// -------- func png.decoder.choose_filter_implementations + +static wuffs_base__empty_struct +wuffs_png__decoder__choose_filter_implementations( + wuffs_png__decoder* self) { + if (self->private_impl.f_filter_distance == 3) { + self->private_impl.choosy_filter_1 = ( + &wuffs_png__decoder__filter_1_distance_3_fallback); + self->private_impl.choosy_filter_3 = ( + &wuffs_png__decoder__filter_3_distance_3_fallback); + self->private_impl.choosy_filter_4 = ( +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_3_arm_neon : +#endif +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_3_x86_sse42 : +#endif + &wuffs_png__decoder__filter_4_distance_3_fallback); + } else if (self->private_impl.f_filter_distance == 4) { + self->private_impl.choosy_filter_1 = ( +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_1_distance_4_arm_neon : +#endif +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_1_distance_4_x86_sse42 : +#endif + &wuffs_png__decoder__filter_1_distance_4_fallback); + self->private_impl.choosy_filter_3 = ( +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_3_distance_4_arm_neon : +#endif +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_3_distance_4_x86_sse42 : +#endif + &wuffs_png__decoder__filter_3_distance_4_fallback); + self->private_impl.choosy_filter_4 = ( +#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_4_arm_neon : +#endif +#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_4_x86_sse42 : +#endif + &wuffs_png__decoder__filter_4_distance_4_fallback); + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.decode_other_chunk + +static wuffs_base__status +wuffs_png__decoder__decode_other_chunk( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src, + bool a_framy) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_other_chunk[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if ((self->private_impl.f_chunk_type == 1163152464) && ! a_framy) { + if (self->private_impl.f_seen_plte) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } else if (self->private_impl.f_color_type == 3) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_png__decoder__decode_plte(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else if ((self->private_impl.f_color_type == 2) || (self->private_impl.f_color_type == 6)) { + } else { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_seen_plte = true; + } else if ((self->private_impl.f_chunk_type & 32) == 0) { + if (self->private_impl.f_chunk_type != 1413563465) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + } + if (self->private_impl.f_chunk_type == 1716082789) { + if (self->private_impl.f_report_metadata_exif) { + if (self->private_impl.f_seen_exif) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + status = wuffs_png__decoder__decode_exif(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_seen_exif = true; + } + } else if ((self->private_impl.f_chunk_type == 1951945833) || (self->private_impl.f_chunk_type == 1951942004) || (self->private_impl.f_chunk_type == 1951945850)) { + if (self->private_impl.f_report_metadata_kvp) { + self->private_impl.f_metadata_flavor = 4; + self->private_impl.f_metadata_fourcc = 1263947851; + self->private_impl.f_metadata_x = 0; + self->private_impl.f_metadata_y = 0; + self->private_impl.f_metadata_z = 0; + } + } else if ( ! a_framy) { + if (self->private_impl.f_chunk_type == 1280598881) { + if (self->private_impl.f_seen_actl) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + status = wuffs_png__decoder__decode_actl(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_seen_actl = true; + } else if (self->private_impl.f_chunk_type == 1297238115) { + if (self->private_impl.f_report_metadata_chrm) { + if (self->private_impl.f_seen_chrm) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + status = wuffs_png__decoder__decode_chrm(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_seen_chrm = true; + } + } else if (self->private_impl.f_chunk_type == 1280598886) { + if (self->private_impl.f_seen_fctl) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + status = wuffs_png__decoder__decode_fctl(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_seen_fctl = true; + } else if (self->private_impl.f_chunk_type == 1095582055) { + if (self->private_impl.f_report_metadata_gama) { + if (self->private_impl.f_seen_gama) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + status = wuffs_png__decoder__decode_gama(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_seen_gama = true; + } + } else if (self->private_impl.f_chunk_type == 1346585449) { + if (self->private_impl.f_report_metadata_iccp) { + if (self->private_impl.f_seen_iccp) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + status = wuffs_png__decoder__decode_iccp(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_seen_iccp = true; + } + } else if (self->private_impl.f_chunk_type == 1111970419) { + if (self->private_impl.f_report_metadata_srgb) { + if (self->private_impl.f_seen_srgb) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + status = wuffs_png__decoder__decode_srgb(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_impl.f_seen_srgb = true; + } + } else if (self->private_impl.f_chunk_type == 1397641844) { + if (self->private_impl.f_seen_trns || ((self->private_impl.f_color_type == 3) && ! self->private_impl.f_seen_plte)) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } else if (self->private_impl.f_color_type > 3) { + } else { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + status = wuffs_png__decoder__decode_trns(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } + self->private_impl.f_seen_trns = true; + } + } + if (self->private_impl.f_metadata_fourcc == 0) { + self->private_data.s_decode_other_chunk[0].scratch = self->private_impl.f_chunk_length; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + if (self->private_data.s_decode_other_chunk[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_decode_other_chunk[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_decode_other_chunk[0].scratch; + } + + goto ok; + ok: + self->private_impl.p_decode_other_chunk[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_other_chunk[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_actl + +static wuffs_base__status +wuffs_png__decoder__decode_actl( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_actl[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_chunk_length != 8) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } else if (self->private_impl.f_interlace_pass > 0) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); + goto exit; + } + self->private_impl.f_chunk_length = 0; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_actl[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_actl[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 24) { + t_0 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)); + } + } + self->private_impl.f_num_animation_frames_value = t_0; + } + if (self->private_impl.f_num_animation_frames_value == 0) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_actl[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_actl[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); + if (num_bits_1 == 24) { + t_1 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)); + } + } + self->private_impl.f_num_animation_loops_value = t_1; + } + + goto ok; + ok: + self->private_impl.p_decode_actl[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_actl[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_chrm + +static wuffs_base__status +wuffs_png__decoder__decode_chrm( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint64_t v_u = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_chrm[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_chunk_length != 32) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length = 0; + self->private_impl.f_metadata_flavor = 5; + self->private_impl.f_metadata_fourcc = 1128813133; + self->private_impl.f_metadata_x = 0; + self->private_impl.f_metadata_y = 0; + self->private_impl.f_metadata_z = 0; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint64_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); + iop_a_src += 4; + } else { + self->private_data.s_decode_chrm[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 24) { + t_0 = ((uint64_t)(*scratch >> 32)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)); + } + } + v_u = t_0; + } + self->private_impl.f_metadata_x |= ((16777215 & v_u) << 0); + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint64_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); + iop_a_src += 4; + } else { + self->private_data.s_decode_chrm[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); + if (num_bits_1 == 24) { + t_1 = ((uint64_t)(*scratch >> 32)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)); + } + } + v_u = t_1; + } + self->private_impl.f_metadata_x |= ((16777215 & v_u) << 24); + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + uint64_t t_2; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_2 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); + iop_a_src += 4; + } else { + self->private_data.s_decode_chrm[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; + uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); + if (num_bits_2 == 24) { + t_2 = ((uint64_t)(*scratch >> 32)); + break; + } + num_bits_2 += 8; + *scratch |= ((uint64_t)(num_bits_2)); + } + } + v_u = t_2; + } + self->private_impl.f_metadata_x |= ((uint64_t)((16777215 & v_u) << 48)); + self->private_impl.f_metadata_y |= ((16777215 & v_u) >> 16); + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + uint64_t t_3; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_3 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); + iop_a_src += 4; + } else { + self->private_data.s_decode_chrm[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; + uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); + if (num_bits_3 == 24) { + t_3 = ((uint64_t)(*scratch >> 32)); + break; + } + num_bits_3 += 8; + *scratch |= ((uint64_t)(num_bits_3)); + } + } + v_u = t_3; + } + self->private_impl.f_metadata_y |= ((16777215 & v_u) << 8); + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + uint64_t t_4; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_4 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); + iop_a_src += 4; + } else { + self->private_data.s_decode_chrm[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; + uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); + if (num_bits_4 == 24) { + t_4 = ((uint64_t)(*scratch >> 32)); + break; + } + num_bits_4 += 8; + *scratch |= ((uint64_t)(num_bits_4)); + } + } + v_u = t_4; + } + self->private_impl.f_metadata_y |= ((16777215 & v_u) << 32); + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); + uint64_t t_5; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_5 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); + iop_a_src += 4; + } else { + self->private_data.s_decode_chrm[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; + uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); + if (num_bits_5 == 24) { + t_5 = ((uint64_t)(*scratch >> 32)); + break; + } + num_bits_5 += 8; + *scratch |= ((uint64_t)(num_bits_5)); + } + } + v_u = t_5; + } + self->private_impl.f_metadata_y |= ((uint64_t)((16777215 & v_u) << 56)); + self->private_impl.f_metadata_z |= ((16777215 & v_u) >> 8); + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); + uint64_t t_6; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_6 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); + iop_a_src += 4; + } else { + self->private_data.s_decode_chrm[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; + uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); + if (num_bits_6 == 24) { + t_6 = ((uint64_t)(*scratch >> 32)); + break; + } + num_bits_6 += 8; + *scratch |= ((uint64_t)(num_bits_6)); + } + } + v_u = t_6; + } + self->private_impl.f_metadata_z |= ((16777215 & v_u) << 16); + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); + uint64_t t_7; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_7 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); + iop_a_src += 4; + } else { + self->private_data.s_decode_chrm[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; + uint32_t num_bits_7 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_7); + if (num_bits_7 == 24) { + t_7 = ((uint64_t)(*scratch >> 32)); + break; + } + num_bits_7 += 8; + *scratch |= ((uint64_t)(num_bits_7)); + } + } + v_u = t_7; + } + self->private_impl.f_metadata_z |= ((16777215 & v_u) << 40); + + goto ok; + ok: + self->private_impl.p_decode_chrm[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_chrm[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_exif + +static wuffs_base__status +wuffs_png__decoder__decode_exif( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + if (self->private_impl.f_chunk_length < 4) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_metadata_flavor = 3; + self->private_impl.f_metadata_fourcc = 1163413830; + self->private_impl.f_metadata_x = 0; + self->private_impl.f_metadata_y = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); + self->private_impl.f_metadata_z = wuffs_base__u64__sat_add(self->private_impl.f_metadata_y, ((uint64_t)(self->private_impl.f_chunk_length))); + self->private_impl.f_chunk_length = 0; + + goto ok; + ok: + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_fctl + +static wuffs_base__status +wuffs_png__decoder__decode_fctl( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_x0 = 0; + uint32_t v_y0 = 0; + uint32_t v_x1 = 0; + uint32_t v_y1 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_fctl[0]; + if (coro_susp_point) { + v_x0 = self->private_data.s_decode_fctl[0].v_x0; + v_x1 = self->private_data.s_decode_fctl[0].v_x1; + v_y1 = self->private_data.s_decode_fctl[0].v_y1; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_chunk_length != 26) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length = 0; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_fctl[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 24) { + t_0 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)); + } + } + v_x0 = t_0; + } + if (v_x0 != self->private_impl.f_next_animation_seq_num) { + status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); + goto exit; + } else if (self->private_impl.f_next_animation_seq_num >= 4294967295) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); + goto exit; + } + self->private_impl.f_next_animation_seq_num += 1; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_fctl[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); + if (num_bits_1 == 24) { + t_1 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)); + } + } + v_x1 = t_1; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + uint32_t t_2; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_fctl[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; + uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); + if (num_bits_2 == 24) { + t_2 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_2 += 8; + *scratch |= ((uint64_t)(num_bits_2)); + } + } + v_y1 = t_2; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + uint32_t t_3; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_fctl[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; + uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); + if (num_bits_3 == 24) { + t_3 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_3 += 8; + *scratch |= ((uint64_t)(num_bits_3)); + } + } + v_x0 = t_3; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + uint32_t t_4; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_4 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_fctl[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; + uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); + if (num_bits_4 == 24) { + t_4 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_4 += 8; + *scratch |= ((uint64_t)(num_bits_4)); + } + } + v_y0 = t_4; + } + v_x1 += v_x0; + v_y1 += v_y0; + if ((v_x0 >= v_x1) || + (v_x0 > self->private_impl.f_width) || + (v_x1 > self->private_impl.f_width) || + (v_y0 >= v_y1) || + (v_y0 > self->private_impl.f_height) || + (v_y1 > self->private_impl.f_height)) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_frame_rect_x0 = v_x0; + self->private_impl.f_frame_rect_y0 = v_y0; + self->private_impl.f_frame_rect_x1 = v_x1; + self->private_impl.f_frame_rect_y1 = v_y1; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); + uint32_t t_5; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_decode_fctl[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; + uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); + if (num_bits_5 == 8) { + t_5 = ((uint32_t)(*scratch >> 48)); + break; + } + num_bits_5 += 8; + *scratch |= ((uint64_t)(num_bits_5)); + } + } + v_x0 = t_5; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); + uint32_t t_6; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_decode_fctl[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; + uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); + if (num_bits_6 == 8) { + t_6 = ((uint32_t)(*scratch >> 48)); + break; + } + num_bits_6 += 8; + *scratch |= ((uint64_t)(num_bits_6)); + } + } + v_x1 = t_6; + } + if (v_x1 <= 0) { + self->private_impl.f_frame_duration = (((uint64_t)(v_x0)) * 7056000); + } else { + self->private_impl.f_frame_duration = ((((uint64_t)(v_x0)) * 705600000) / ((uint64_t)(v_x1))); + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_7 = *iop_a_src++; + v_x0 = t_7; + } + if (v_x0 == 0) { + self->private_impl.f_frame_disposal = 0; + } else if (v_x0 == 1) { + self->private_impl.f_frame_disposal = 1; + } else if (v_x0 == 2) { + self->private_impl.f_frame_disposal = 2; + } else { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint32_t t_8 = *iop_a_src++; + v_x0 = t_8; + } + if (v_x0 == 0) { + self->private_impl.f_frame_overwrite_instead_of_blend = true; + } else if (v_x0 == 1) { + self->private_impl.f_frame_overwrite_instead_of_blend = false; + } else { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if (self->private_impl.f_num_decoded_frame_configs_value == 0) { + self->private_impl.f_first_rect_x0 = self->private_impl.f_frame_rect_x0; + self->private_impl.f_first_rect_y0 = self->private_impl.f_frame_rect_y0; + self->private_impl.f_first_rect_x1 = self->private_impl.f_frame_rect_x1; + self->private_impl.f_first_rect_y1 = self->private_impl.f_frame_rect_y1; + self->private_impl.f_first_duration = self->private_impl.f_frame_duration; + self->private_impl.f_first_disposal = self->private_impl.f_frame_disposal; + self->private_impl.f_first_overwrite_instead_of_blend = self->private_impl.f_frame_overwrite_instead_of_blend; + } + + goto ok; + ok: + self->private_impl.p_decode_fctl[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_fctl[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_decode_fctl[0].v_x0 = v_x0; + self->private_data.s_decode_fctl[0].v_x1 = v_x1; + self->private_data.s_decode_fctl[0].v_y1 = v_y1; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_gama + +static wuffs_base__status +wuffs_png__decoder__decode_gama( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_gama[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_chunk_length != 4) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length = 0; + self->private_impl.f_metadata_flavor = 5; + self->private_impl.f_metadata_fourcc = 1195461953; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint64_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); + iop_a_src += 4; + } else { + self->private_data.s_decode_gama[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_gama[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 24) { + t_0 = ((uint64_t)(*scratch >> 32)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)); + } + } + self->private_impl.f_metadata_x = t_0; + } + self->private_impl.f_metadata_y = 0; + self->private_impl.f_metadata_z = 0; + + goto ok; + ok: + self->private_impl.p_decode_gama[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_gama[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_iccp + +static wuffs_base__status +wuffs_png__decoder__decode_iccp( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_iccp[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + if (self->private_impl.f_chunk_length <= 0) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length -= 1; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c = t_0; + } + if (v_c == 0) { + goto label__0__break; + } + } + label__0__break:; + if (self->private_impl.f_chunk_length <= 0) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length -= 1; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + v_c = t_1; + } + if (v_c != 0) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); + goto exit; + } + self->private_impl.f_metadata_is_zlib_compressed = true; + self->private_impl.f_metadata_flavor = 4; + self->private_impl.f_metadata_fourcc = 1229144912; + self->private_impl.f_metadata_x = 0; + self->private_impl.f_metadata_y = 0; + self->private_impl.f_metadata_z = 0; + + goto ok; + ok: + self->private_impl.p_decode_iccp[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_iccp[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_plte + +static wuffs_base__status +wuffs_png__decoder__decode_plte( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_num_entries = 0; + uint32_t v_i = 0; + uint32_t v_argb = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_plte[0]; + if (coro_susp_point) { + v_num_entries = self->private_data.s_decode_plte[0].v_num_entries; + v_i = self->private_data.s_decode_plte[0].v_i; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if ((self->private_impl.f_chunk_length > 768) || ((self->private_impl.f_chunk_length % 3) != 0)) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + v_num_entries = (((uint32_t)(self->private_impl.f_chunk_length)) / 3); + self->private_impl.f_chunk_length = 0; + while (v_i < v_num_entries) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { + t_0 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); + iop_a_src += 3; + } else { + self->private_data.s_decode_plte[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_plte[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 16) { + t_0 = ((uint32_t)(*scratch >> 40)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)); + } + } + v_argb = t_0; + } + v_argb |= 4278190080; + self->private_data.f_src_palette[((4 * v_i) + 0)] = ((uint8_t)(((v_argb >> 0) & 255))); + self->private_data.f_src_palette[((4 * v_i) + 1)] = ((uint8_t)(((v_argb >> 8) & 255))); + self->private_data.f_src_palette[((4 * v_i) + 2)] = ((uint8_t)(((v_argb >> 16) & 255))); + self->private_data.f_src_palette[((4 * v_i) + 3)] = ((uint8_t)(((v_argb >> 24) & 255))); + v_i += 1; + } + while (v_i < 256) { + self->private_data.f_src_palette[((4 * v_i) + 0)] = 0; + self->private_data.f_src_palette[((4 * v_i) + 1)] = 0; + self->private_data.f_src_palette[((4 * v_i) + 2)] = 0; + self->private_data.f_src_palette[((4 * v_i) + 3)] = 255; + v_i += 1; + } + + goto ok; + ok: + self->private_impl.p_decode_plte[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_plte[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_decode_plte[0].v_num_entries = v_num_entries; + self->private_data.s_decode_plte[0].v_i = v_i; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_srgb + +static wuffs_base__status +wuffs_png__decoder__decode_srgb( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_srgb[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_chunk_length != 1) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length = 0; + self->private_impl.f_metadata_flavor = 5; + self->private_impl.f_metadata_fourcc = 1397901122; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t t_0 = *iop_a_src++; + self->private_impl.f_metadata_x = t_0; + } + self->private_impl.f_metadata_y = 0; + self->private_impl.f_metadata_z = 0; + + goto ok; + ok: + self->private_impl.p_decode_srgb[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_srgb[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_trns + +static wuffs_base__status +wuffs_png__decoder__decode_trns( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_i = 0; + uint32_t v_n = 0; + uint64_t v_u = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_trns[0]; + if (coro_susp_point) { + v_i = self->private_data.s_decode_trns[0].v_i; + v_n = self->private_data.s_decode_trns[0].v_n; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_color_type == 0) { + self->private_impl.choosy_filter_and_swizzle = ( + &wuffs_png__decoder__filter_and_swizzle_tricky); + if (self->private_impl.f_depth <= 8) { + self->private_impl.f_dst_pixfmt = 2164295816; + self->private_impl.f_src_pixfmt = 2164295816; + } else { + self->private_impl.f_dst_pixfmt = 2164308923; + self->private_impl.f_src_pixfmt = 2164308923; + } + if (self->private_impl.f_chunk_length != 2) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length = 0; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint64_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_0 = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_decode_trns[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_trns[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 8) { + t_0 = ((uint64_t)(*scratch >> 48)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)); + } + } + v_u = t_0; + } + if (self->private_impl.f_depth <= 1) { + self->private_impl.f_remap_transparency = (((v_u & 1) * 16777215) | 4278190080); + } else if (self->private_impl.f_depth <= 2) { + self->private_impl.f_remap_transparency = (((v_u & 3) * 5592405) | 4278190080); + } else if (self->private_impl.f_depth <= 4) { + self->private_impl.f_remap_transparency = (((v_u & 15) * 1118481) | 4278190080); + } else if (self->private_impl.f_depth <= 8) { + self->private_impl.f_remap_transparency = (((v_u & 255) * 65793) | 4278190080); + } else { + self->private_impl.f_remap_transparency = ((v_u * 4295032833) | 18446462598732840960u); + } + } else if (self->private_impl.f_color_type == 2) { + self->private_impl.choosy_filter_and_swizzle = ( + &wuffs_png__decoder__filter_and_swizzle_tricky); + if (self->private_impl.f_depth <= 8) { + self->private_impl.f_dst_pixfmt = 2164295816; + self->private_impl.f_src_pixfmt = 2164295816; + } else { + self->private_impl.f_dst_pixfmt = 2164308923; + self->private_impl.f_src_pixfmt = 2164308923; + } + if (self->private_impl.f_chunk_length != 6) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length = 0; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint64_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { + t_1 = ((uint64_t)(wuffs_base__peek_u48be__no_bounds_check(iop_a_src))); + iop_a_src += 6; + } else { + self->private_data.s_decode_trns[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_trns[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); + if (num_bits_1 == 40) { + t_1 = ((uint64_t)(*scratch >> 16)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)); + } + } + v_u = t_1; + } + if (self->private_impl.f_depth <= 8) { + self->private_impl.f_remap_transparency = ((255 & (v_u >> 0)) | + (65280 & (v_u >> 8)) | + (16711680 & (v_u >> 16)) | + 4278190080); + } else { + self->private_impl.f_remap_transparency = (v_u | 18446462598732840960u); + } + } else if (self->private_impl.f_color_type == 3) { + self->private_impl.f_dst_pixfmt = 2164523016; + self->private_impl.f_src_pixfmt = 2164523016; + if (self->private_impl.f_chunk_length > 256) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + v_n = ((uint32_t)(self->private_impl.f_chunk_length)); + self->private_impl.f_chunk_length = 0; + while (v_i < v_n) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + self->private_data.f_src_palette[((4 * v_i) + 3)] = t_2; + } + v_i += 1; + } + } else { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + + goto ok; + ok: + self->private_impl.p_decode_trns[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_trns[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_decode_trns[0].v_i = v_i; + self->private_data.s_decode_trns[0].v_n = v_n; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_frame_config + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_png__decoder__decode_frame_config( + wuffs_png__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_png__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_frame_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func png.decoder.do_decode_frame_config + +static wuffs_base__status +wuffs_png__decoder__do_decode_frame_config( + wuffs_png__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_checksum_have = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if ((self->private_impl.f_call_sequence & 16) != 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } else if (self->private_impl.f_call_sequence == 32) { + } else if (self->private_impl.f_call_sequence < 32) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_png__decoder__do_decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else if (self->private_impl.f_call_sequence == 40) { + if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { + status = wuffs_base__make_status(wuffs_base__error__bad_restart); + goto exit; + } + } else if (self->private_impl.f_call_sequence == 64) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + status = wuffs_png__decoder__skip_frame(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + if (self->private_impl.f_metadata_fourcc != 0) { + self->private_impl.f_call_sequence = 48; + status = wuffs_base__make_status(wuffs_base__note__metadata_reported); + goto ok; + } + if (self->private_impl.f_num_decoded_frame_configs_value == 0) { + self->private_impl.f_frame_rect_x0 = self->private_impl.f_first_rect_x0; + self->private_impl.f_frame_rect_y0 = self->private_impl.f_first_rect_y0; + self->private_impl.f_frame_rect_x1 = self->private_impl.f_first_rect_x1; + self->private_impl.f_frame_rect_y1 = self->private_impl.f_first_rect_y1; + self->private_impl.f_frame_config_io_position = self->private_impl.f_first_config_io_position; + self->private_impl.f_frame_duration = self->private_impl.f_first_duration; + self->private_impl.f_frame_disposal = self->private_impl.f_first_disposal; + self->private_impl.f_frame_overwrite_instead_of_blend = self->private_impl.f_first_overwrite_instead_of_blend; + } else { + while (true) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_frame_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_frame_config[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 24) { + t_0 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)); + } + } + self->private_impl.f_chunk_length = t_0; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_frame_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_frame_config[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; + if (num_bits_1 == 24) { + t_1 = ((uint32_t)(*scratch)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } + self->private_impl.f_chunk_type = t_1; + } + if (self->private_impl.f_chunk_type == 1145980233) { + if (self->private_impl.f_chunk_length != 0) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + uint32_t t_2; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_frame_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_frame_config[0].scratch; + uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; + if (num_bits_2 == 24) { + t_2 = ((uint32_t)(*scratch)); + break; + } + num_bits_2 += 8; + *scratch |= ((uint64_t)(num_bits_2)) << 56; + } + } + v_checksum_have = t_2; + } + if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != 2187346606)) { + status = wuffs_base__make_status(wuffs_png__error__bad_checksum); + goto exit; + } + self->private_impl.f_call_sequence = 96; + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } else if (self->private_impl.f_chunk_type == 1413571686) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } else if (self->private_impl.f_chunk_type == 1280598886) { + self->private_impl.f_frame_config_io_position = ((uint64_t)(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) - 8)); + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + status = wuffs_png__decoder__decode_fctl(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + self->private_data.s_do_decode_frame_config[0].scratch = 4; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + if (self->private_data.s_do_decode_frame_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_decode_frame_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_decode_frame_config[0].scratch; + goto label__0__break; + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); + status = wuffs_png__decoder__decode_other_chunk(self, a_src, true); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + if (self->private_impl.f_metadata_fourcc != 0) { + self->private_impl.f_call_sequence = 48; + status = wuffs_base__make_status(wuffs_base__note__metadata_reported); + goto ok; + } + self->private_data.s_do_decode_frame_config[0].scratch = 4; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); + if (self->private_data.s_do_decode_frame_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_decode_frame_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_decode_frame_config[0].scratch; + self->private_impl.f_chunk_length = 0; + } + label__0__break:; + } + if (a_dst != NULL) { + wuffs_base__frame_config__set( + a_dst, + wuffs_base__utility__make_rect_ie_u32( + self->private_impl.f_frame_rect_x0, + self->private_impl.f_frame_rect_y0, + self->private_impl.f_frame_rect_x1, + self->private_impl.f_frame_rect_y1), + ((wuffs_base__flicks)(self->private_impl.f_frame_duration)), + ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)), + self->private_impl.f_frame_config_io_position, + self->private_impl.f_frame_disposal, + ((self->private_impl.f_color_type <= 3) && ! self->private_impl.f_seen_trns), + self->private_impl.f_frame_overwrite_instead_of_blend, + 0); + } + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1); + self->private_impl.f_call_sequence = 64; + + ok: + self->private_impl.p_do_decode_frame_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.skip_frame + +static wuffs_base__status +wuffs_png__decoder__skip_frame( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_seq_num = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_skip_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + self->private_impl.f_chunk_type_array[0] = 0; + self->private_impl.f_chunk_type_array[1] = 0; + self->private_impl.f_chunk_type_array[2] = 0; + self->private_impl.f_chunk_type_array[3] = 0; + label__0__continue:; + while (true) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 8) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + goto label__0__continue; + } + self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32))); + if (self->private_impl.f_chunk_type == 1413563465) { + if (self->private_impl.f_chunk_type_array[0] == 102) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_type_array[0] = 73; + self->private_impl.f_chunk_type_array[1] = 68; + self->private_impl.f_chunk_type_array[2] = 65; + self->private_impl.f_chunk_type_array[3] = 84; + } else if (self->private_impl.f_chunk_type == 1413571686) { + if (self->private_impl.f_chunk_type_array[0] == 73) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_type_array[0] = 102; + self->private_impl.f_chunk_type_array[1] = 100; + self->private_impl.f_chunk_type_array[2] = 65; + self->private_impl.f_chunk_type_array[3] = 84; + if (self->private_impl.f_chunk_length < 4) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length -= 4; + iop_a_src += 8; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_skip_frame[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_skip_frame[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 24) { + t_0 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)); + } + } + v_seq_num = t_0; + } + if (v_seq_num != self->private_impl.f_next_animation_seq_num) { + status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); + goto exit; + } else if (self->private_impl.f_next_animation_seq_num >= 4294967295) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); + goto exit; + } + self->private_impl.f_next_animation_seq_num += 1; + self->private_data.s_skip_frame[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 4); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_skip_frame[0].scratch; + self->private_impl.f_chunk_length = 0; + goto label__0__continue; + } else if (self->private_impl.f_chunk_type_array[0] != 0) { + goto label__0__break; + } else if (self->private_impl.f_chunk_type == 1280598886) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_data.s_skip_frame[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_skip_frame[0].scratch; + self->private_impl.f_chunk_length = 0; + } + label__0__break:; + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1); + self->private_impl.f_call_sequence = 32; + + ok: + self->private_impl.p_skip_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_skip_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_frame + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_png__decoder__decode_frame( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 3)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame(self, + a_dst, + a_src, + a_blend, + a_workbuf, + a_opts); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_png__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func png.decoder.do_decode_frame + +static wuffs_base__status +wuffs_png__decoder__do_decode_frame( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_seq_num = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + uint32_t v_pass_width = 0; + uint32_t v_pass_height = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if ((self->private_impl.f_call_sequence & 16) != 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } else if (self->private_impl.f_call_sequence >= 96) { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } else if (self->private_impl.f_call_sequence != 64) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_png__decoder__do_decode_frame_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } + label__0__continue:; + while (true) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 8) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + goto label__0__continue; + } + self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32))); + if (self->private_impl.f_chunk_type == 1413563465) { + self->private_impl.f_chunk_type_array[0] = 73; + self->private_impl.f_chunk_type_array[1] = 68; + self->private_impl.f_chunk_type_array[2] = 65; + self->private_impl.f_chunk_type_array[3] = 84; + iop_a_src += 8; + if ( ! self->private_impl.f_ignore_checksum) { + wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, + sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); + wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); + } + goto label__0__break; + } else if (self->private_impl.f_chunk_type == 1413571686) { + self->private_impl.f_chunk_type_array[0] = 102; + self->private_impl.f_chunk_type_array[1] = 100; + self->private_impl.f_chunk_type_array[2] = 65; + self->private_impl.f_chunk_type_array[3] = 84; + if (self->private_impl.f_chunk_length < 4) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length -= 4; + iop_a_src += 8; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_frame[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_frame[0].scratch; + uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 24) { + t_0 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_0 += 8; + *scratch |= ((uint64_t)(num_bits_0)); + } + } + v_seq_num = t_0; + } + if (v_seq_num != self->private_impl.f_next_animation_seq_num) { + status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); + goto exit; + } else if (self->private_impl.f_next_animation_seq_num >= 4294967295) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); + goto exit; + } + self->private_impl.f_next_animation_seq_num += 1; + goto label__0__break; + } else if (self->private_impl.f_chunk_type == 1280598886) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_data.s_do_decode_frame[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_decode_frame[0].scratch; + self->private_impl.f_chunk_length = 0; + } + label__0__break:; + if (self->private_impl.f_zlib_is_dirty) { + wuffs_base__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, + sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); + if (self->private_impl.f_ignore_checksum) { + wuffs_zlib__decoder__set_quirk_enabled(&self->private_data.f_zlib, 1, true); + } + } + self->private_impl.f_zlib_is_dirty = true; + v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, + wuffs_base__pixel_buffer__pixel_format(a_dst), + wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), + wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), + wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), + a_blend); + if ( ! wuffs_base__status__is_ok(&v_status)) { + status = v_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + self->private_impl.f_workbuf_hist_pos_base = 0; + while (true) { + if (self->private_impl.f_chunk_type_array[0] == 73) { + v_pass_width = (16777215 & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][1])) + self->private_impl.f_width) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0])); + v_pass_height = (16777215 & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][4])) + self->private_impl.f_height) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3])); + } else { + v_pass_width = (16777215 & ((uint32_t)(self->private_impl.f_frame_rect_x1 - self->private_impl.f_frame_rect_x0))); + v_pass_height = (16777215 & ((uint32_t)(self->private_impl.f_frame_rect_y1 - self->private_impl.f_frame_rect_y0))); + } + if ((v_pass_width > 0) && (v_pass_height > 0)) { + self->private_impl.f_pass_bytes_per_row = wuffs_png__decoder__calculate_bytes_per_row(self, v_pass_width); + self->private_impl.f_pass_workbuf_length = (((uint64_t)(v_pass_height)) * (1 + self->private_impl.f_pass_bytes_per_row)); + while (true) { + { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + wuffs_base__status t_1 = wuffs_png__decoder__decode_pass(self, a_src, a_workbuf); + v_status = t_1; + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } + if (wuffs_base__status__is_ok(&v_status)) { + goto label__1__break; + } else if (wuffs_base__status__is_error(&v_status) || ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed))) { + if (self->private_impl.f_workbuf_wi <= ((uint64_t)(a_workbuf.len))) { + wuffs_png__decoder__filter_and_swizzle(self, a_dst, wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_workbuf_wi)); + } + if (v_status.repr == wuffs_base__suspension__short_read) { + status = wuffs_base__make_status(wuffs_png__error__truncated_input); + goto exit; + } + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); + } + label__1__break:; + v_status = wuffs_png__decoder__filter_and_swizzle(self, a_dst, a_workbuf); + if ( ! wuffs_base__status__is_ok(&v_status)) { + status = v_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + self->private_impl.f_workbuf_hist_pos_base += self->private_impl.f_pass_workbuf_length; + } + if ((self->private_impl.f_interlace_pass == 0) || (self->private_impl.f_interlace_pass >= 7)) { + goto label__2__break; + } +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + self->private_impl.f_interlace_pass += 1; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } + label__2__break:; + wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1); + self->private_impl.f_call_sequence = 32; + + ok: + self->private_impl.p_do_decode_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.decode_pass + +static wuffs_base__status +wuffs_png__decoder__decode_pass( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); + wuffs_base__io_buffer* v_w = &u_w; + uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint64_t v_w_mark = 0; + uint64_t v_r_mark = 0; + wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); + uint32_t v_checksum_have = 0; + uint32_t v_checksum_want = 0; + uint32_t v_seq_num = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_decode_pass[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + self->private_impl.f_workbuf_wi = 0; + label__0__continue:; + while (true) { + if ((self->private_impl.f_workbuf_wi > self->private_impl.f_pass_workbuf_length) || (self->private_impl.f_pass_workbuf_length > ((uint64_t)(a_workbuf.len)))) { + status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); + goto exit; + } + { + wuffs_base__io_buffer* o_0_v_w = v_w; + uint8_t *o_0_iop_v_w = iop_v_w; + uint8_t *o_0_io0_v_w = io0_v_w; + uint8_t *o_0_io1_v_w = io1_v_w; + uint8_t *o_0_io2_v_w = io2_v_w; + v_w = wuffs_base__io_writer__set( + &u_w, + &iop_v_w, + &io0_v_w, + &io1_v_w, + &io2_v_w, + wuffs_base__slice_u8__subslice_ij(a_workbuf, + self->private_impl.f_workbuf_wi, + self->private_impl.f_pass_workbuf_length), + ((uint64_t)(self->private_impl.f_workbuf_hist_pos_base + self->private_impl.f_workbuf_wi))); + { + const bool o_1_closed_a_src = a_src->meta.closed; + const uint8_t *o_1_io2_a_src = io2_a_src; + wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, + ((uint64_t)(self->private_impl.f_chunk_length))); + if (a_src) { + size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); + a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); + a_src->meta.wi = n; + } + v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); + v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); + { + u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); + v_zlib_status = t_0; + iop_v_w = u_w.data.ptr + u_w.meta.wi; + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } + if ( ! self->private_impl.f_ignore_checksum) { + wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__io__since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); + } + wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)((wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src))) & 4294967295)))); + wuffs_base__u64__sat_add_indirect(&self->private_impl.f_workbuf_wi, wuffs_base__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w)))); + io2_a_src = o_1_io2_a_src; + if (a_src) { + a_src->meta.closed = o_1_closed_a_src; + a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); + } + } + v_w = o_0_v_w; + iop_v_w = o_0_iop_v_w; + io0_v_w = o_0_io0_v_w; + io1_v_w = o_0_io1_v_w; + io2_v_w = o_0_io2_v_w; + } + if (wuffs_base__status__is_ok(&v_zlib_status)) { + if (self->private_impl.f_chunk_length > 0) { + status = wuffs_base__make_status(wuffs_base__error__too_much_data); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_pass[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); + if (num_bits_1 == 24) { + t_1 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_1 += 8; + *scratch |= ((uint64_t)(num_bits_1)); + } + } + v_checksum_want = t_1; + } + if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0] == 73)) { + v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); + if (v_checksum_have != v_checksum_want) { + status = wuffs_base__make_status(wuffs_png__error__bad_checksum); + goto exit; + } + } + goto label__0__break; + } else if (v_zlib_status.repr == wuffs_base__suspension__short_write) { + if ((1 <= self->private_impl.f_interlace_pass) && (self->private_impl.f_interlace_pass <= 6)) { + goto label__0__break; + } + status = wuffs_base__make_status(wuffs_base__error__too_much_data); + goto exit; + } else if (v_zlib_status.repr != wuffs_base__suspension__short_read) { + status = v_zlib_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } else if (self->private_impl.f_chunk_length == 0) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_2; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_pass[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; + uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); + if (num_bits_2 == 24) { + t_2 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_2 += 8; + *scratch |= ((uint64_t)(num_bits_2)); + } + } + v_checksum_want = t_2; + } + if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0] == 73)) { + v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); + if (v_checksum_have != v_checksum_want) { + status = wuffs_base__make_status(wuffs_png__error__bad_checksum); + goto exit; + } + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + uint32_t t_3; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_pass[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; + uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); + if (num_bits_3 == 24) { + t_3 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_3 += 8; + *scratch |= ((uint64_t)(num_bits_3)); + } + } + self->private_impl.f_chunk_length = t_3; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + uint32_t t_4; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_pass[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; + uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; + if (num_bits_4 == 24) { + t_4 = ((uint32_t)(*scratch)); + break; + } + num_bits_4 += 8; + *scratch |= ((uint64_t)(num_bits_4)) << 56; + } + } + self->private_impl.f_chunk_type = t_4; + } + if (self->private_impl.f_chunk_type_array[0] == 73) { + if (self->private_impl.f_chunk_type != 1413563465) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + if ( ! self->private_impl.f_ignore_checksum) { + wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, + sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); + wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); + } + } else { + if ((self->private_impl.f_chunk_type != 1413571686) || (self->private_impl.f_chunk_length < 4)) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length -= 4; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + uint32_t t_5; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_decode_pass[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; + uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFF)); + *scratch >>= 8; + *scratch <<= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); + if (num_bits_5 == 24) { + t_5 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_5 += 8; + *scratch |= ((uint64_t)(num_bits_5)); + } + } + v_seq_num = t_5; + } + if (v_seq_num != self->private_impl.f_next_animation_seq_num) { + status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); + goto exit; + } else if (self->private_impl.f_next_animation_seq_num >= 4294967295) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); + goto exit; + } + self->private_impl.f_next_animation_seq_num += 1; + } + goto label__0__continue; + } else if (((uint64_t)(io2_a_src - iop_a_src)) > 0) { + status = wuffs_base__make_status(wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input); + goto exit; + } + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); + } + label__0__break:; + if (self->private_impl.f_workbuf_wi != self->private_impl.f_pass_workbuf_length) { + status = wuffs_base__make_status(wuffs_base__error__not_enough_data); + goto exit; + } else if (0 < ((uint64_t)(a_workbuf.len))) { + if (a_workbuf.ptr[0] == 4) { + a_workbuf.ptr[0] = 1; + } + } + + ok: + self->private_impl.p_decode_pass[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_pass[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.frame_dirty_rect + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_png__decoder__frame_dirty_rect( + const wuffs_png__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + + return wuffs_base__utility__make_rect_ie_u32( + self->private_impl.f_frame_rect_x0, + self->private_impl.f_frame_rect_y0, + self->private_impl.f_frame_rect_x1, + self->private_impl.f_frame_rect_y1); +} + +// -------- func png.decoder.num_animation_loops + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_png__decoder__num_animation_loops( + const wuffs_png__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + return self->private_impl.f_num_animation_loops_value; +} + +// -------- func png.decoder.num_decoded_frame_configs + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_png__decoder__num_decoded_frame_configs( + const wuffs_png__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + return ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)); +} + +// -------- func png.decoder.num_decoded_frames + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_png__decoder__num_decoded_frames( + const wuffs_png__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + return ((uint64_t)(self->private_impl.f_num_decoded_frames_value)); +} + +// -------- func png.decoder.restart_frame + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_png__decoder__restart_frame( + wuffs_png__decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + if (self->private_impl.f_call_sequence < 32) { + return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + } else if ((a_index >= ((uint64_t)(self->private_impl.f_num_animation_frames_value))) || ((a_index == 0) && (a_io_position != self->private_impl.f_first_config_io_position))) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + self->private_impl.f_call_sequence = 40; + if (self->private_impl.f_interlace_pass >= 1) { + self->private_impl.f_interlace_pass = 1; + } + self->private_impl.f_frame_config_io_position = a_io_position; + self->private_impl.f_num_decoded_frame_configs_value = ((uint32_t)((a_index & 4294967295))); + self->private_impl.f_num_decoded_frames_value = self->private_impl.f_num_decoded_frame_configs_value; + return wuffs_base__make_status(NULL); +} + +// -------- func png.decoder.set_report_metadata + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_png__decoder__set_report_metadata( + wuffs_png__decoder* self, + uint32_t a_fourcc, + bool a_report) { + if (!self) { + return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_empty_struct(); + } + + if (a_fourcc == 1128813133) { + self->private_impl.f_report_metadata_chrm = a_report; + } else if (a_fourcc == 1163413830) { + self->private_impl.f_report_metadata_exif = a_report; + } else if (a_fourcc == 1195461953) { + self->private_impl.f_report_metadata_gama = a_report; + } else if (a_fourcc == 1229144912) { + self->private_impl.f_report_metadata_iccp = a_report; + } else if (a_fourcc == 1263947808) { + self->private_impl.f_report_metadata_kvp = a_report; + } else if (a_fourcc == 1397901122) { + self->private_impl.f_report_metadata_srgb = a_report; + } + return wuffs_base__make_empty_struct(); +} + +// -------- func png.decoder.tell_me_more + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_png__decoder__tell_me_more( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 4)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_png__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_png__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_tell_me_more[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func png.decoder.do_tell_me_more + +static wuffs_base__status +wuffs_png__decoder__do_tell_me_more( + wuffs_png__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint16_t v_c2 = 0; + wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); + wuffs_base__io_buffer* v_w = &u_w; + uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint64_t v_num_written = 0; + uint64_t v_w_mark = 0; + uint64_t v_r_mark = 0; + wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; + iop_a_dst = io1_a_dst; + io2_a_dst = io0_a_dst + a_dst->data.len; + if (a_dst->meta.closed) { + io2_a_dst = iop_a_dst; + } + } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more[0]; + if (coro_susp_point) { + v_zlib_status = self->private_data.s_do_tell_me_more[0].v_zlib_status; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if ((self->private_impl.f_call_sequence & 16) == 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } + if (self->private_impl.f_metadata_fourcc == 0) { + status = wuffs_base__make_status(wuffs_base__error__no_more_information); + goto exit; + } + while (true) { + if (self->private_impl.f_metadata_flavor == 3) { + while (true) { + if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_y) { + status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); + goto exit; + } else if (a_minfo != NULL) { + wuffs_base__more_information__set(a_minfo, + self->private_impl.f_metadata_flavor, + self->private_impl.f_metadata_fourcc, + self->private_impl.f_metadata_x, + self->private_impl.f_metadata_y, + self->private_impl.f_metadata_z); + } + if (self->private_impl.f_metadata_y >= self->private_impl.f_metadata_z) { + goto label__goto_done__break; + } + self->private_impl.f_metadata_y = self->private_impl.f_metadata_z; + status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + } + if (self->private_impl.f_metadata_is_zlib_compressed) { + if (self->private_impl.f_zlib_is_dirty) { + wuffs_base__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, + sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); + if (self->private_impl.f_ignore_checksum) { + wuffs_zlib__decoder__set_quirk_enabled(&self->private_data.f_zlib, 1, true); + } + } + self->private_impl.f_zlib_is_dirty = true; + self->private_impl.f_ztxt_hist_pos = 0; + } + label__loop__continue:; + while (true) { + if (a_minfo != NULL) { + wuffs_base__more_information__set(a_minfo, + self->private_impl.f_metadata_flavor, + self->private_impl.f_metadata_fourcc, + self->private_impl.f_metadata_x, + self->private_impl.f_metadata_y, + self->private_impl.f_metadata_z); + } + if (self->private_impl.f_metadata_flavor != 4) { + goto label__loop__break; + } + if (self->private_impl.f_metadata_is_zlib_compressed) { + if (self->private_impl.f_chunk_type == 1346585449) { + { + const bool o_0_closed_a_src = a_src->meta.closed; + const uint8_t *o_0_io2_a_src = io2_a_src; + wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, + ((uint64_t)(self->private_impl.f_chunk_length))); + if (a_src) { + size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); + a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); + a_src->meta.wi = n; + } + v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); + { + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); + v_zlib_status = t_0; + if (a_dst) { + iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; + } + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } + wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)((wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src))) & 4294967295)))); + io2_a_src = o_0_io2_a_src; + if (a_src) { + a_src->meta.closed = o_0_closed_a_src; + a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); + } + } + if (wuffs_base__status__is_ok(&v_zlib_status)) { + self->private_impl.f_metadata_is_zlib_compressed = false; + goto label__loop__break; + } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { + status = v_zlib_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + status = v_zlib_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + } else if (self->private_impl.f_chunk_type == 1951945833) { + { + const bool o_1_closed_a_src = a_src->meta.closed; + const uint8_t *o_1_io2_a_src = io2_a_src; + wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, + ((uint64_t)(self->private_impl.f_chunk_length))); + if (a_src) { + size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); + a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); + a_src->meta.wi = n; + } + v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); + { + if (a_dst) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + wuffs_base__status t_1 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); + v_zlib_status = t_1; + if (a_dst) { + iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; + } + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } + wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)((wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src))) & 4294967295)))); + io2_a_src = o_1_io2_a_src; + if (a_src) { + a_src->meta.closed = o_1_closed_a_src; + a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); + } + } + if (wuffs_base__status__is_ok(&v_zlib_status)) { + self->private_impl.f_metadata_is_zlib_compressed = false; + goto label__loop__break; + } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { + status = v_zlib_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + status = v_zlib_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + } else if (self->private_impl.f_chunk_type == 1951945850) { + if (self->private_impl.f_ztxt_ri == self->private_impl.f_ztxt_wi) { + { + wuffs_base__io_buffer* o_2_v_w = v_w; + uint8_t *o_2_iop_v_w = iop_v_w; + uint8_t *o_2_io0_v_w = io0_v_w; + uint8_t *o_2_io1_v_w = io1_v_w; + uint8_t *o_2_io2_v_w = io2_v_w; + v_w = wuffs_base__io_writer__set( + &u_w, + &iop_v_w, + &io0_v_w, + &io1_v_w, + &io2_v_w, + wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), + self->private_impl.f_ztxt_hist_pos); + { + const bool o_3_closed_a_src = a_src->meta.closed; + const uint8_t *o_3_io2_a_src = io2_a_src; + wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, + ((uint64_t)(self->private_impl.f_chunk_length))); + if (a_src) { + size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); + a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); + a_src->meta.wi = n; + } + v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); + v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); + { + u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + wuffs_base__status t_2 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); + v_zlib_status = t_2; + iop_v_w = u_w.data.ptr + u_w.meta.wi; + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } + wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)((wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src))) & 4294967295)))); + v_num_written = wuffs_base__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w))); + io2_a_src = o_3_io2_a_src; + if (a_src) { + a_src->meta.closed = o_3_closed_a_src; + a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); + } + } + v_w = o_2_v_w; + iop_v_w = o_2_iop_v_w; + io0_v_w = o_2_io0_v_w; + io1_v_w = o_2_io1_v_w; + io2_v_w = o_2_io2_v_w; + } + if (v_num_written > 1024) { + status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_i_o); + goto exit; + } + self->private_impl.f_ztxt_ri = 0; + self->private_impl.f_ztxt_wi = ((uint32_t)(v_num_written)); + wuffs_base__u64__sat_add_indirect(&self->private_impl.f_ztxt_hist_pos, v_num_written); + } + while (self->private_impl.f_ztxt_ri < self->private_impl.f_ztxt_wi) { + v_c2 = WUFFS_PNG__LATIN_1[self->private_data.f_dst_palette[self->private_impl.f_ztxt_ri]]; + if (v_c2 == 0) { + status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); + goto exit; + } else if (v_c2 <= 127) { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); + goto label__loop__continue; + } + self->private_impl.f_ztxt_ri += 1; + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c2))), iop_a_dst += 1); + } else { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + goto label__loop__continue; + } + self->private_impl.f_ztxt_ri += 1; + (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c2), iop_a_dst += 2); + } + } + if (wuffs_base__status__is_ok(&v_zlib_status)) { + self->private_impl.f_metadata_is_zlib_compressed = false; + goto label__loop__break; + } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { + status = v_zlib_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } else if (v_zlib_status.repr != wuffs_base__suspension__short_write) { + status = v_zlib_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); + } + } else { + status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_chunk_type); + goto exit; + } + } else if ((self->private_impl.f_chunk_type == 1951945833) && (self->private_impl.f_metadata_fourcc == 1263947862)) { + while (true) { + if (self->private_impl.f_chunk_length <= 0) { + goto label__loop__break; + } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); + goto label__loop__continue; + } else if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); + goto label__loop__continue; + } + self->private_impl.f_chunk_length -= 1; + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_c), iop_a_dst += 1); + } + } else { + while (true) { + if (self->private_impl.f_chunk_length <= 0) { + if (self->private_impl.f_metadata_fourcc == 1263947851) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + goto label__loop__break; + } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); + goto label__loop__continue; + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + if (v_c == 0) { + self->private_impl.f_chunk_length -= 1; + iop_a_src += 1; + goto label__loop__break; + } + v_c2 = WUFFS_PNG__LATIN_1[v_c]; + if (v_c2 == 0) { + status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); + goto exit; + } else if (v_c2 <= 127) { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); + goto label__loop__continue; + } + self->private_impl.f_chunk_length -= 1; + iop_a_src += 1; + (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c2))), iop_a_dst += 1); + } else { + if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1) { + status = wuffs_base__make_status(wuffs_base__suspension__short_write); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); + goto label__loop__continue; + } + self->private_impl.f_chunk_length -= 1; + iop_a_src += 1; + (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c2), iop_a_dst += 2); + } + } + } + } + label__loop__break:; + if (self->private_impl.f_metadata_fourcc == 1263947851) { + self->private_impl.f_metadata_fourcc = 1263947862; + if (self->private_impl.f_chunk_type == 1951945833) { + if (self->private_impl.f_chunk_length <= 1) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length -= 2; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; + v_c = t_3; + } + if (v_c == 0) { + self->private_impl.f_metadata_is_zlib_compressed = false; + } else if (v_c == 1) { + self->private_impl.f_metadata_is_zlib_compressed = true; + } else { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_4 = *iop_a_src++; + v_c = t_4; + } + if ((v_c != 0) && self->private_impl.f_metadata_is_zlib_compressed) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); + goto exit; + } + self->private_impl.f_metadata_fourcc -= 2; + while (self->private_impl.f_metadata_fourcc != 1263947862) { + self->private_impl.f_metadata_fourcc += 1; + while (true) { + if (self->private_impl.f_chunk_length <= 0) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length -= 1; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_5 = *iop_a_src++; + v_c = t_5; + } + if (v_c == 0) { + goto label__0__break; + } + } + label__0__break:; + } + } else if (self->private_impl.f_chunk_type == 1951945850) { + if (self->private_impl.f_chunk_length <= 0) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_impl.f_chunk_length -= 1; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_6 = *iop_a_src++; + v_c = t_6; + } + if (v_c != 0) { + status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); + goto exit; + } + self->private_impl.f_metadata_is_zlib_compressed = true; + } + self->private_impl.f_call_sequence &= 239; + status = wuffs_base__make_status(NULL); + goto ok; + } + goto label__goto_done__break; + } + label__goto_done__break:; + if (self->private_impl.f_chunk_length != 0) { + status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } + self->private_data.s_do_tell_me_more[0].scratch = 4; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); + if (self->private_data.s_do_tell_me_more[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_tell_me_more[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_tell_me_more[0].scratch; + self->private_impl.f_metadata_flavor = 0; + self->private_impl.f_metadata_fourcc = 0; + self->private_impl.f_metadata_x = 0; + self->private_impl.f_metadata_y = 0; + self->private_impl.f_metadata_z = 0; + self->private_impl.f_call_sequence &= 239; + status = wuffs_base__make_status(NULL); + goto ok; + + ok: + self->private_impl.p_do_tell_me_more[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_do_tell_me_more[0].v_zlib_status = v_zlib_status; + + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func png.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_png__decoder__workbuf_len( + const wuffs_png__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_overall_workbuf_length, self->private_impl.f_overall_workbuf_length); +} + +// -------- func png.decoder.filter_and_swizzle + +static wuffs_base__status +wuffs_png__decoder__filter_and_swizzle( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__slice_u8 a_workbuf) { + return (*self->private_impl.choosy_filter_and_swizzle)(self, a_dst, a_workbuf); +} + +static wuffs_base__status +wuffs_png__decoder__filter_and_swizzle__choosy_default( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__pixel_format v_dst_pixfmt = {0}; + uint32_t v_dst_bits_per_pixel = 0; + uint64_t v_dst_bytes_per_pixel = 0; + uint64_t v_dst_bytes_per_row0 = 0; + uint64_t v_dst_bytes_per_row1 = 0; + wuffs_base__slice_u8 v_dst_palette = {0}; + wuffs_base__table_u8 v_tab = {0}; + uint32_t v_y = 0; + wuffs_base__slice_u8 v_dst = {0}; + uint8_t v_filter = 0; + wuffs_base__slice_u8 v_curr_row = {0}; + wuffs_base__slice_u8 v_prev_row = {0}; + + v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); + v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); + if ((v_dst_bits_per_pixel & 7) != 0) { + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); + v_dst_bytes_per_row0 = (((uint64_t)(self->private_impl.f_frame_rect_x0)) * v_dst_bytes_per_pixel); + v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); + v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); + v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); + if (v_dst_bytes_per_row1 < ((uint64_t)(v_tab.width))) { + v_tab = wuffs_base__table_u8__subtable_ij(v_tab, + 0, + 0, + v_dst_bytes_per_row1, + ((uint64_t)(v_tab.height))); + } + if (v_dst_bytes_per_row0 < ((uint64_t)(v_tab.width))) { + v_tab = wuffs_base__table_u8__subtable_ij(v_tab, + v_dst_bytes_per_row0, + 0, + ((uint64_t)(v_tab.width)), + ((uint64_t)(v_tab.height))); + } else { + v_tab = wuffs_base__table_u8__subtable_ij(v_tab, + 0, + 0, + 0, + 0); + } + v_y = self->private_impl.f_frame_rect_y0; + while (v_y < self->private_impl.f_frame_rect_y1) { + v_dst = wuffs_base__table_u8__row_u32(v_tab, v_y); + if (1 > ((uint64_t)(a_workbuf.len))) { + return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); + } + v_filter = a_workbuf.ptr[0]; + a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1); + if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { + return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); + } + v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); + a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); + if (v_filter == 0) { + } else if (v_filter == 1) { + wuffs_png__decoder__filter_1(self, v_curr_row); + } else if (v_filter == 2) { + wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); + } else if (v_filter == 3) { + wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); + } else if (v_filter == 4) { + wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); + } else { + return wuffs_base__make_status(wuffs_png__error__bad_filter); + } + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, v_curr_row); + v_prev_row = v_curr_row; + v_y += 1; + } + return wuffs_base__make_status(NULL); +} + +// -------- func png.decoder.filter_and_swizzle_tricky + +static wuffs_base__status +wuffs_png__decoder__filter_and_swizzle_tricky( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__pixel_format v_dst_pixfmt = {0}; + uint32_t v_dst_bits_per_pixel = 0; + uint64_t v_dst_bytes_per_pixel = 0; + uint64_t v_dst_bytes_per_row1 = 0; + wuffs_base__slice_u8 v_dst_palette = {0}; + wuffs_base__table_u8 v_tab = {0}; + uint64_t v_src_bytes_per_pixel = 0; + uint32_t v_x = 0; + uint32_t v_y = 0; + uint64_t v_i = 0; + wuffs_base__slice_u8 v_dst = {0}; + uint8_t v_filter = 0; + wuffs_base__slice_u8 v_s = {0}; + wuffs_base__slice_u8 v_curr_row = {0}; + wuffs_base__slice_u8 v_prev_row = {0}; + uint8_t v_bits_unpacked[8] = {0}; + uint8_t v_bits_packed = 0; + uint8_t v_packs_remaining = 0; + uint8_t v_multiplier = 0; + uint8_t v_shift = 0; + + v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); + v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); + if ((v_dst_bits_per_pixel & 7) != 0) { + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); + v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); + v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); + v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); + v_src_bytes_per_pixel = 1; + if (self->private_impl.f_depth >= 8) { + v_src_bytes_per_pixel = (((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type])) * ((uint64_t)((self->private_impl.f_depth >> 3)))); + } + if (self->private_impl.f_chunk_type_array[0] == 73) { + v_y = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][5])); + } else { + v_y = self->private_impl.f_frame_rect_y0; + } + while (v_y < self->private_impl.f_frame_rect_y1) { + v_dst = wuffs_base__table_u8__row_u32(v_tab, v_y); + if (v_dst_bytes_per_row1 < ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row1); + } + if (1 > ((uint64_t)(a_workbuf.len))) { + return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); + } + v_filter = a_workbuf.ptr[0]; + a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1); + if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { + return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); + } + v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); + a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); + if (v_filter == 0) { + } else if (v_filter == 1) { + wuffs_png__decoder__filter_1(self, v_curr_row); + } else if (v_filter == 2) { + wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); + } else if (v_filter == 3) { + wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); + } else if (v_filter == 4) { + wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); + } else { + return wuffs_base__make_status(wuffs_png__error__bad_filter); + } + v_s = v_curr_row; + if (self->private_impl.f_chunk_type_array[0] == 73) { + v_x = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][2])); + } else { + v_x = self->private_impl.f_frame_rect_x0; + } + if (self->private_impl.f_depth == 8) { + while (v_x < self->private_impl.f_frame_rect_x1) { + v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); + if (v_i <= ((uint64_t)(v_dst.len))) { + if (self->private_impl.f_color_type == 4) { + if (2 <= ((uint64_t)(v_s.len))) { + v_bits_unpacked[0] = v_s.ptr[0]; + v_bits_unpacked[1] = v_s.ptr[0]; + v_bits_unpacked[2] = v_s.ptr[0]; + v_bits_unpacked[3] = v_s.ptr[1]; + v_s = wuffs_base__slice_u8__subslice_i(v_s, 2); + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); + } + } else if (((uint32_t)((self->private_impl.f_remap_transparency & 4294967295))) != 0) { + if (self->private_impl.f_color_type == 0) { + if (1 <= ((uint64_t)(v_s.len))) { + v_bits_unpacked[0] = v_s.ptr[0]; + v_bits_unpacked[1] = v_s.ptr[0]; + v_bits_unpacked[2] = v_s.ptr[0]; + v_bits_unpacked[3] = 255; + v_s = wuffs_base__slice_u8__subslice_i(v_s, 1); + if (((uint32_t)((self->private_impl.f_remap_transparency & 4294967295))) == ((((uint32_t)(v_bits_unpacked[0])) << 0) | + (((uint32_t)(v_bits_unpacked[1])) << 8) | + (((uint32_t)(v_bits_unpacked[2])) << 16) | + (((uint32_t)(v_bits_unpacked[3])) << 24))) { + v_bits_unpacked[0] = 0; + v_bits_unpacked[1] = 0; + v_bits_unpacked[2] = 0; + v_bits_unpacked[3] = 0; + } + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); + } + } else { + if (3 <= ((uint64_t)(v_s.len))) { + v_bits_unpacked[0] = v_s.ptr[2]; + v_bits_unpacked[1] = v_s.ptr[1]; + v_bits_unpacked[2] = v_s.ptr[0]; + v_bits_unpacked[3] = 255; + v_s = wuffs_base__slice_u8__subslice_i(v_s, 3); + if (((uint32_t)((self->private_impl.f_remap_transparency & 4294967295))) == ((((uint32_t)(v_bits_unpacked[0])) << 0) | + (((uint32_t)(v_bits_unpacked[1])) << 8) | + (((uint32_t)(v_bits_unpacked[2])) << 16) | + (((uint32_t)(v_bits_unpacked[3])) << 24))) { + v_bits_unpacked[0] = 0; + v_bits_unpacked[1] = 0; + v_bits_unpacked[2] = 0; + v_bits_unpacked[3] = 0; + } + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); + } + } + } else if (v_src_bytes_per_pixel <= ((uint64_t)(v_s.len))) { + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__slice_u8__subslice_j(v_s, v_src_bytes_per_pixel)); + v_s = wuffs_base__slice_u8__subslice_i(v_s, v_src_bytes_per_pixel); + } + } + v_x += (((uint32_t)(1)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0]); + } + } else if (self->private_impl.f_depth < 8) { + v_multiplier = 1; + if (self->private_impl.f_color_type == 0) { + v_multiplier = WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[self->private_impl.f_depth]; + } + v_shift = ((8 - self->private_impl.f_depth) & 7); + v_packs_remaining = 0; + while (v_x < self->private_impl.f_frame_rect_x1) { + v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); + if (v_i <= ((uint64_t)(v_dst.len))) { + if ((v_packs_remaining == 0) && (1 <= ((uint64_t)(v_s.len)))) { + v_packs_remaining = WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[self->private_impl.f_depth]; + v_bits_packed = v_s.ptr[0]; + v_s = wuffs_base__slice_u8__subslice_i(v_s, 1); + } + v_bits_unpacked[0] = ((uint8_t)((v_bits_packed >> v_shift) * v_multiplier)); + v_bits_packed = ((uint8_t)(v_bits_packed << self->private_impl.f_depth)); + v_packs_remaining = ((uint8_t)(v_packs_remaining - 1)); + if (((uint32_t)((self->private_impl.f_remap_transparency & 4294967295))) != 0) { + v_bits_unpacked[1] = v_bits_unpacked[0]; + v_bits_unpacked[2] = v_bits_unpacked[0]; + v_bits_unpacked[3] = 255; + if (((uint32_t)((self->private_impl.f_remap_transparency & 4294967295))) == ((((uint32_t)(v_bits_unpacked[0])) << 0) | + (((uint32_t)(v_bits_unpacked[1])) << 8) | + (((uint32_t)(v_bits_unpacked[2])) << 16) | + (((uint32_t)(v_bits_unpacked[3])) << 24))) { + v_bits_unpacked[0] = 0; + v_bits_unpacked[1] = 0; + v_bits_unpacked[2] = 0; + v_bits_unpacked[3] = 0; + } + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); + } else { + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 1)); + } + } + v_x += (((uint32_t)(1)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0]); + } + } else { + while (v_x < self->private_impl.f_frame_rect_x1) { + v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); + if (v_i <= ((uint64_t)(v_dst.len))) { + if (self->private_impl.f_color_type == 0) { + if (2 <= ((uint64_t)(v_s.len))) { + v_bits_unpacked[0] = v_s.ptr[1]; + v_bits_unpacked[1] = v_s.ptr[0]; + v_bits_unpacked[2] = v_s.ptr[1]; + v_bits_unpacked[3] = v_s.ptr[0]; + v_bits_unpacked[4] = v_s.ptr[1]; + v_bits_unpacked[5] = v_s.ptr[0]; + v_bits_unpacked[6] = 255; + v_bits_unpacked[7] = 255; + v_s = wuffs_base__slice_u8__subslice_i(v_s, 2); + if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0])) << 0) | + (((uint64_t)(v_bits_unpacked[1])) << 8) | + (((uint64_t)(v_bits_unpacked[2])) << 16) | + (((uint64_t)(v_bits_unpacked[3])) << 24) | + (((uint64_t)(v_bits_unpacked[4])) << 32) | + (((uint64_t)(v_bits_unpacked[5])) << 40) | + (((uint64_t)(v_bits_unpacked[6])) << 48) | + (((uint64_t)(v_bits_unpacked[7])) << 56))) { + v_bits_unpacked[0] = 0; + v_bits_unpacked[1] = 0; + v_bits_unpacked[2] = 0; + v_bits_unpacked[3] = 0; + v_bits_unpacked[4] = 0; + v_bits_unpacked[5] = 0; + v_bits_unpacked[6] = 0; + v_bits_unpacked[7] = 0; + } + } + } else if (self->private_impl.f_color_type == 2) { + if (6 <= ((uint64_t)(v_s.len))) { + v_bits_unpacked[0] = v_s.ptr[5]; + v_bits_unpacked[1] = v_s.ptr[4]; + v_bits_unpacked[2] = v_s.ptr[3]; + v_bits_unpacked[3] = v_s.ptr[2]; + v_bits_unpacked[4] = v_s.ptr[1]; + v_bits_unpacked[5] = v_s.ptr[0]; + v_bits_unpacked[6] = 255; + v_bits_unpacked[7] = 255; + v_s = wuffs_base__slice_u8__subslice_i(v_s, 6); + if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0])) << 0) | + (((uint64_t)(v_bits_unpacked[1])) << 8) | + (((uint64_t)(v_bits_unpacked[2])) << 16) | + (((uint64_t)(v_bits_unpacked[3])) << 24) | + (((uint64_t)(v_bits_unpacked[4])) << 32) | + (((uint64_t)(v_bits_unpacked[5])) << 40) | + (((uint64_t)(v_bits_unpacked[6])) << 48) | + (((uint64_t)(v_bits_unpacked[7])) << 56))) { + v_bits_unpacked[0] = 0; + v_bits_unpacked[1] = 0; + v_bits_unpacked[2] = 0; + v_bits_unpacked[3] = 0; + v_bits_unpacked[4] = 0; + v_bits_unpacked[5] = 0; + v_bits_unpacked[6] = 0; + v_bits_unpacked[7] = 0; + } + } + } else if (self->private_impl.f_color_type == 4) { + if (4 <= ((uint64_t)(v_s.len))) { + v_bits_unpacked[0] = v_s.ptr[1]; + v_bits_unpacked[1] = v_s.ptr[0]; + v_bits_unpacked[2] = v_s.ptr[1]; + v_bits_unpacked[3] = v_s.ptr[0]; + v_bits_unpacked[4] = v_s.ptr[1]; + v_bits_unpacked[5] = v_s.ptr[0]; + v_bits_unpacked[6] = v_s.ptr[3]; + v_bits_unpacked[7] = v_s.ptr[2]; + v_s = wuffs_base__slice_u8__subslice_i(v_s, 4); + } + } else { + if (8 <= ((uint64_t)(v_s.len))) { + v_bits_unpacked[0] = v_s.ptr[5]; + v_bits_unpacked[1] = v_s.ptr[4]; + v_bits_unpacked[2] = v_s.ptr[3]; + v_bits_unpacked[3] = v_s.ptr[2]; + v_bits_unpacked[4] = v_s.ptr[1]; + v_bits_unpacked[5] = v_s.ptr[0]; + v_bits_unpacked[6] = v_s.ptr[7]; + v_bits_unpacked[7] = v_s.ptr[6]; + v_s = wuffs_base__slice_u8__subslice_i(v_s, 8); + } + } + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 8)); + } + v_x += (((uint32_t)(1)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0]); + } + } + v_prev_row = v_curr_row; + v_y += (((uint32_t)(1)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3]); + } + return wuffs_base__make_status(NULL); +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) + +// ---------------- Status Codes Implementations + +const char wuffs_tga__error__bad_header[] = "#tga: bad header"; +const char wuffs_tga__error__bad_run_length_encoding[] = "#tga: bad run length encoding"; +const char wuffs_tga__error__truncated_input[] = "#tga: truncated input"; +const char wuffs_tga__error__unsupported_tga_file[] = "#tga: unsupported TGA file"; + +// ---------------- Private Consts + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__status +wuffs_tga__decoder__do_decode_image_config( + wuffs_tga__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_tga__decoder__do_decode_frame_config( + wuffs_tga__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_tga__decoder__do_decode_frame( + wuffs_tga__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +// ---------------- VTables + +const wuffs_base__image_decoder__func_ptrs +wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder = { + (wuffs_base__status(*)(void*, + wuffs_base__pixel_buffer*, + wuffs_base__io_buffer*, + wuffs_base__pixel_blend, + wuffs_base__slice_u8, + wuffs_base__decode_frame_options*))(&wuffs_tga__decoder__decode_frame), + (wuffs_base__status(*)(void*, + wuffs_base__frame_config*, + wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_frame_config), + (wuffs_base__status(*)(void*, + wuffs_base__image_config*, + wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_image_config), + (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_tga__decoder__frame_dirty_rect), + (uint32_t(*)(const void*))(&wuffs_tga__decoder__num_animation_loops), + (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frame_configs), + (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frames), + (wuffs_base__status(*)(void*, + uint64_t, + uint64_t))(&wuffs_tga__decoder__restart_frame), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_tga__decoder__set_quirk_enabled), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_tga__decoder__set_report_metadata), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__more_information*, + wuffs_base__io_buffer*))(&wuffs_tga__decoder__tell_me_more), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_tga__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_tga__decoder__initialize( + wuffs_tga__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = + wuffs_base__image_decoder__vtable_name; + self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = + (const void*)(&wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder); + return wuffs_base__make_status(NULL); +} + +wuffs_tga__decoder* +wuffs_tga__decoder__alloc() { + wuffs_tga__decoder* x = + (wuffs_tga__decoder*)(calloc(1, sizeof(wuffs_tga__decoder))); + if (!x) { + return NULL; + } + if (wuffs_tga__decoder__initialize( + x, sizeof(wuffs_tga__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_tga__decoder() { + return sizeof(wuffs_tga__decoder); +} + +// ---------------- Function Implementations + +// -------- func tga.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_tga__decoder__set_quirk_enabled( + wuffs_tga__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__make_empty_struct(); +} + +// -------- func tga.decoder.decode_image_config + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_tga__decoder__decode_image_config( + wuffs_tga__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_image_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_tga__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_image_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func tga.decoder.do_decode_image_config + +static wuffs_base__status +wuffs_tga__decoder__do_decode_image_config( + wuffs_tga__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_c = 0; + uint32_t v_c5 = 0; + uint32_t v_i = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; + if (coro_susp_point) { + v_i = self->private_data.s_do_decode_image_config[0].v_i; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence != 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + self->private_impl.f_header_id_length = t_0; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + self->private_impl.f_header_color_map_type = t_1; + } + if (self->private_impl.f_header_color_map_type > 1) { + status = wuffs_base__make_status(wuffs_tga__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_2 = *iop_a_src++; + self->private_impl.f_header_image_type = t_2; + } + if ((self->private_impl.f_header_image_type == 1) || + (self->private_impl.f_header_image_type == 2) || + (self->private_impl.f_header_image_type == 3) || + (self->private_impl.f_header_image_type == 9) || + (self->private_impl.f_header_image_type == 10) || + (self->private_impl.f_header_image_type == 11)) { + } else { + status = wuffs_base__make_status(wuffs_tga__error__bad_header); + goto exit; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + uint16_t t_3; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_3 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; + if (num_bits_3 == 8) { + t_3 = ((uint16_t)(*scratch)); + break; + } + num_bits_3 += 8; + *scratch |= ((uint64_t)(num_bits_3)) << 56; + } + } + self->private_impl.f_header_color_map_first_entry_index = t_3; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + uint16_t t_4; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; + if (num_bits_4 == 8) { + t_4 = ((uint16_t)(*scratch)); + break; + } + num_bits_4 += 8; + *scratch |= ((uint64_t)(num_bits_4)) << 56; + } + } + self->private_impl.f_header_color_map_length = t_4; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_5 = *iop_a_src++; + self->private_impl.f_header_color_map_entry_size = t_5; + } + if (self->private_impl.f_header_color_map_type != 0) { + if ((self->private_impl.f_header_color_map_first_entry_index != 0) || (self->private_impl.f_header_color_map_length > 256)) { + status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); + goto exit; + } else if ((self->private_impl.f_header_color_map_entry_size != 15) && + (self->private_impl.f_header_color_map_entry_size != 16) && + (self->private_impl.f_header_color_map_entry_size != 24) && + (self->private_impl.f_header_color_map_entry_size != 32)) { + status = wuffs_base__make_status(wuffs_tga__error__bad_header); + goto exit; + } + } else { + if ((self->private_impl.f_header_color_map_first_entry_index != 0) || (self->private_impl.f_header_color_map_length != 0) || (self->private_impl.f_header_color_map_entry_size != 0)) { + status = wuffs_base__make_status(wuffs_tga__error__bad_header); + goto exit; + } + } + self->private_data.s_do_decode_image_config[0].scratch = 4; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + uint32_t t_6; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; + if (num_bits_6 == 8) { + t_6 = ((uint32_t)(*scratch)); + break; + } + num_bits_6 += 8; + *scratch |= ((uint64_t)(num_bits_6)) << 56; + } + } + self->private_impl.f_width = t_6; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); + uint32_t t_7; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_7 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; + if (num_bits_7 == 8) { + t_7 = ((uint32_t)(*scratch)); + break; + } + num_bits_7 += 8; + *scratch |= ((uint64_t)(num_bits_7)) << 56; + } + } + self->private_impl.f_height = t_7; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_8 = *iop_a_src++; + self->private_impl.f_header_pixel_depth = t_8; + } + if ((self->private_impl.f_header_pixel_depth != 1) && + (self->private_impl.f_header_pixel_depth != 8) && + (self->private_impl.f_header_pixel_depth != 15) && + (self->private_impl.f_header_pixel_depth != 16) && + (self->private_impl.f_header_pixel_depth != 24) && + (self->private_impl.f_header_pixel_depth != 32)) { + status = wuffs_base__make_status(wuffs_tga__error__bad_header); + goto exit; + } + if ((self->private_impl.f_header_image_type | 8) == 9) { + self->private_impl.f_scratch_bytes_per_pixel = 1; + self->private_impl.f_src_bytes_per_pixel = 1; + self->private_impl.f_src_pixfmt = 2164523016; + self->private_impl.f_opaque = ((self->private_impl.f_header_color_map_entry_size == 15) || (self->private_impl.f_header_color_map_entry_size == 24)); + } else if ((self->private_impl.f_header_image_type | 8) == 10) { + if ((self->private_impl.f_header_pixel_depth == 15) || (self->private_impl.f_header_pixel_depth == 16)) { + self->private_impl.f_scratch_bytes_per_pixel = 4; + self->private_impl.f_src_bytes_per_pixel = 0; + self->private_impl.f_src_pixfmt = 2164295816; + } else if (self->private_impl.f_header_pixel_depth == 24) { + self->private_impl.f_scratch_bytes_per_pixel = 3; + self->private_impl.f_src_bytes_per_pixel = 3; + self->private_impl.f_src_pixfmt = 2147485832; + self->private_impl.f_opaque = true; + } else if (self->private_impl.f_header_pixel_depth == 32) { + self->private_impl.f_scratch_bytes_per_pixel = 4; + self->private_impl.f_src_bytes_per_pixel = 4; + self->private_impl.f_src_pixfmt = 2164295816; + } else { + status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); + goto exit; + } + } else { + if (self->private_impl.f_header_pixel_depth == 8) { + self->private_impl.f_scratch_bytes_per_pixel = 1; + self->private_impl.f_src_bytes_per_pixel = 1; + self->private_impl.f_src_pixfmt = 536870920; + self->private_impl.f_opaque = true; + } else { + status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); + goto exit; + } + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_9 = *iop_a_src++; + self->private_impl.f_header_image_descriptor = t_9; + } + if ((self->private_impl.f_header_image_descriptor & 16) != 0) { + status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); + goto exit; + } + self->private_data.s_do_decode_image_config[0].scratch = ((uint32_t)(self->private_impl.f_header_id_length)); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); + if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; + if (self->private_impl.f_header_color_map_type != 0) { + while (v_i < ((uint32_t)(self->private_impl.f_header_color_map_length))) { + if (self->private_impl.f_header_color_map_entry_size == 24) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); + uint32_t t_10; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { + t_10 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); + iop_a_src += 3; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; + if (num_bits_10 == 16) { + t_10 = ((uint32_t)(*scratch)); + break; + } + num_bits_10 += 8; + *scratch |= ((uint64_t)(num_bits_10)) << 56; + } + } + v_c = t_10; + } + self->private_data.f_src_palette[(((v_i & 255) * 4) + 0)] = ((uint8_t)(((v_c >> 0) & 255))); + self->private_data.f_src_palette[(((v_i & 255) * 4) + 1)] = ((uint8_t)(((v_c >> 8) & 255))); + self->private_data.f_src_palette[(((v_i & 255) * 4) + 2)] = ((uint8_t)(((v_c >> 16) & 255))); + self->private_data.f_src_palette[(((v_i & 255) * 4) + 3)] = 255; + } else if (self->private_impl.f_header_color_map_entry_size == 32) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); + uint32_t t_11; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; + if (num_bits_11 == 24) { + t_11 = ((uint32_t)(*scratch)); + break; + } + num_bits_11 += 8; + *scratch |= ((uint64_t)(num_bits_11)) << 56; + } + } + v_c = t_11; + } + self->private_data.f_src_palette[(((v_i & 255) * 4) + 0)] = ((uint8_t)(((v_c >> 0) & 255))); + self->private_data.f_src_palette[(((v_i & 255) * 4) + 1)] = ((uint8_t)(((v_c >> 8) & 255))); + self->private_data.f_src_palette[(((v_i & 255) * 4) + 2)] = ((uint8_t)(((v_c >> 16) & 255))); + self->private_data.f_src_palette[(((v_i & 255) * 4) + 3)] = ((uint8_t)(((v_c >> 24) & 255))); + } else { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); + uint32_t t_12; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { + t_12 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { + self->private_data.s_do_decode_image_config[0].scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; + uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; + *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; + if (num_bits_12 == 8) { + t_12 = ((uint32_t)(*scratch)); + break; + } + num_bits_12 += 8; + *scratch |= ((uint64_t)(num_bits_12)) << 56; + } + } + v_c = t_12; + } + v_c5 = (31 & (v_c >> 0)); + self->private_data.f_src_palette[(((v_i & 255) * 4) + 0)] = ((uint8_t)(((v_c5 << 3) | (v_c5 >> 2)))); + v_c5 = (31 & (v_c >> 5)); + self->private_data.f_src_palette[(((v_i & 255) * 4) + 1)] = ((uint8_t)(((v_c5 << 3) | (v_c5 >> 2)))); + v_c5 = (31 & (v_c >> 10)); + self->private_data.f_src_palette[(((v_i & 255) * 4) + 2)] = ((uint8_t)(((v_c5 << 3) | (v_c5 >> 2)))); + self->private_data.f_src_palette[(((v_i & 255) * 4) + 3)] = 255; + } + v_i += 1; + } + while (v_i < 256) { + self->private_data.f_src_palette[((v_i * 4) + 0)] = 0; + self->private_data.f_src_palette[((v_i * 4) + 1)] = 0; + self->private_data.f_src_palette[((v_i * 4) + 2)] = 0; + self->private_data.f_src_palette[((v_i * 4) + 3)] = 255; + v_i += 1; + } + } + self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); + if (a_dst != NULL) { + wuffs_base__image_config__set( + a_dst, + self->private_impl.f_src_pixfmt, + 0, + self->private_impl.f_width, + self->private_impl.f_height, + self->private_impl.f_frame_config_io_position, + self->private_impl.f_opaque); + } + self->private_impl.f_call_sequence = 32; + + goto ok; + ok: + self->private_impl.p_do_decode_image_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_do_decode_image_config[0].v_i = v_i; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func tga.decoder.decode_frame_config + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_tga__decoder__decode_frame_config( + wuffs_tga__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_tga__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_frame_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func tga.decoder.do_decode_frame_config + +static wuffs_base__status +wuffs_tga__decoder__do_decode_frame_config( + wuffs_tga__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence == 32) { + } else if (self->private_impl.f_call_sequence < 32) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_tga__decoder__do_decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else if (self->private_impl.f_call_sequence == 40) { + if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { + status = wuffs_base__make_status(wuffs_base__error__bad_restart); + goto exit; + } + } else if (self->private_impl.f_call_sequence == 64) { + self->private_impl.f_call_sequence = 96; + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + if (a_dst != NULL) { + wuffs_base__frame_config__set( + a_dst, + wuffs_base__utility__make_rect_ie_u32( + 0, + 0, + self->private_impl.f_width, + self->private_impl.f_height), + ((wuffs_base__flicks)(0)), + 0, + self->private_impl.f_frame_config_io_position, + 0, + self->private_impl.f_opaque, + false, + 4278190080); + } + self->private_impl.f_call_sequence = 64; + + ok: + self->private_impl.p_do_decode_frame_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func tga.decoder.decode_frame + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_tga__decoder__decode_frame( + wuffs_tga__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 3)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame(self, + a_dst, + a_src, + a_blend, + a_workbuf, + a_opts); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_tga__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func tga.decoder.do_decode_frame + +static wuffs_base__status +wuffs_tga__decoder__do_decode_frame( + wuffs_tga__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + wuffs_base__pixel_format v_dst_pixfmt = {0}; + uint32_t v_dst_bits_per_pixel = 0; + uint64_t v_dst_bytes_per_pixel = 0; + uint32_t v_dst_x = 0; + uint32_t v_dst_y = 0; + wuffs_base__table_u8 v_tab = {0}; + wuffs_base__slice_u8 v_dst_palette = {0}; + wuffs_base__slice_u8 v_dst = {0}; + uint64_t v_dst_start = 0; + wuffs_base__slice_u8 v_src_palette = {0}; + uint64_t v_mark = 0; + uint64_t v_num_pixels64 = 0; + uint32_t v_num_pixels32 = 0; + uint32_t v_lit_length = 0; + uint32_t v_run_length = 0; + uint64_t v_num_dst_bytes = 0; + uint32_t v_num_src_bytes = 0; + uint32_t v_c = 0; + uint32_t v_c5 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; + if (coro_susp_point) { + v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel; + v_dst_x = self->private_data.s_do_decode_frame[0].v_dst_x; + v_dst_y = self->private_data.s_do_decode_frame[0].v_dst_y; + v_mark = self->private_data.s_do_decode_frame[0].v_mark; + v_num_pixels32 = self->private_data.s_do_decode_frame[0].v_num_pixels32; + v_lit_length = self->private_data.s_do_decode_frame[0].v_lit_length; + v_run_length = self->private_data.s_do_decode_frame[0].v_run_length; + v_num_dst_bytes = self->private_data.s_do_decode_frame[0].v_num_dst_bytes; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence == 64) { + } else if (self->private_impl.f_call_sequence < 64) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_tga__decoder__do_decode_frame_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + if (self->private_impl.f_header_color_map_type != 0) { + v_src_palette = wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024); + } + v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, + wuffs_base__pixel_buffer__pixel_format(a_dst), + wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), + wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), + v_src_palette, + a_blend); + if ( ! wuffs_base__status__is_ok(&v_status)) { + status = v_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); + v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); + if ((v_dst_bits_per_pixel & 7) != 0) { + status = wuffs_base__make_status(wuffs_base__error__unsupported_option); + goto exit; + } + v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); + if ((self->private_impl.f_header_image_descriptor & 32) == 0) { + v_dst_y = ((uint32_t)(self->private_impl.f_height - 1)); + } + if ((self->private_impl.f_header_image_type & 8) == 0) { + v_lit_length = self->private_impl.f_width; + } + label__resume__continue:; + while (true) { + v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); + v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); + while (v_dst_y < self->private_impl.f_height) { + v_dst = wuffs_base__table_u8__row_u32(v_tab, v_dst_y); + v_dst_start = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); + if (v_dst_start <= ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_start); + } else { + v_dst = wuffs_base__utility__empty_slice_u8(); + } + while (v_dst_x < self->private_impl.f_width) { + if (self->private_impl.f_src_bytes_per_pixel > 0) { + if (v_lit_length > 0) { + v_mark = ((uint64_t)(iop_a_src - io0_a_src)); + v_num_pixels64 = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(self->private_impl.f_src_bytes_per_pixel))); + v_num_pixels32 = ((uint32_t)(wuffs_base__u64__min(v_num_pixels64, ((uint64_t)(v_lit_length))))); + v_num_dst_bytes = (((uint64_t)(v_num_pixels32)) * v_dst_bytes_per_pixel); + v_num_src_bytes = (v_num_pixels32 * self->private_impl.f_src_bytes_per_pixel); + self->private_data.s_do_decode_frame[0].scratch = v_num_src_bytes; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { + self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); + iop_a_src = io2_a_src; + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + iop_a_src += self->private_data.s_do_decode_frame[0].scratch; + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); + if (v_num_dst_bytes <= ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_num_dst_bytes); + } else { + v_dst = wuffs_base__utility__empty_slice_u8(); + } + v_dst_x += v_num_pixels32; + v_lit_length = (((uint32_t)(v_lit_length - v_num_pixels32)) & 65535); + if (v_lit_length > 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + goto label__resume__continue; + } + } else if (v_run_length > 0) { + v_run_length -= 1; + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); + if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); + } + v_dst_x += 1; + } else { + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); + goto label__resume__continue; + } + if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128) { + v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1); + iop_a_src += 1; + if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { + status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); + goto exit; + } + } else { + if (self->private_impl.f_src_bytes_per_pixel == 1) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 2) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + goto label__resume__continue; + } + v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127) + 1); + iop_a_src += 1; + self->private_data.f_scratch[0] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + } else if (self->private_impl.f_src_bytes_per_pixel == 3) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 4) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); + goto label__resume__continue; + } + v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127) + 1); + iop_a_src += 1; + self->private_data.f_scratch[0] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + self->private_data.f_scratch[1] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + self->private_data.f_scratch[2] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + } else { + if (((uint64_t)(io2_a_src - iop_a_src)) < 5) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); + goto label__resume__continue; + } + v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127) + 1); + iop_a_src += 1; + self->private_data.f_scratch[0] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + self->private_data.f_scratch[1] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + self->private_data.f_scratch[2] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + self->private_data.f_scratch[3] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + } + if ((v_run_length + v_dst_x) > self->private_impl.f_width) { + status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); + goto exit; + } + } + } + } else { + if (v_lit_length > 0) { + if (((uint64_t)(io2_a_src - iop_a_src)) < 2) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); + goto label__resume__continue; + } + v_c = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + v_c5 = (31 & (v_c >> 0)); + self->private_data.f_scratch[0] = ((uint8_t)(((v_c5 << 3) | (v_c5 >> 2)))); + v_c5 = (31 & (v_c >> 5)); + self->private_data.f_scratch[1] = ((uint8_t)(((v_c5 << 3) | (v_c5 >> 2)))); + v_c5 = (31 & (v_c >> 10)); + self->private_data.f_scratch[2] = ((uint8_t)(((v_c5 << 3) | (v_c5 >> 2)))); + self->private_data.f_scratch[3] = 255; + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, 4)); + if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); + } + v_dst_x += 1; + v_lit_length -= 1; + } else if (v_run_length > 0) { + v_run_length -= 1; + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); + if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); + } + v_dst_x += 1; + } else { + if (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); + goto label__resume__continue; + } + if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128) { + v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1); + iop_a_src += 1; + if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { + status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); + goto exit; + } + } else { + if (((uint64_t)(io2_a_src - iop_a_src)) < 3) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); + goto label__resume__continue; + } + v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127) + 1); + iop_a_src += 1; + v_c = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + v_c5 = (31 & (v_c >> 0)); + self->private_data.f_scratch[0] = ((uint8_t)(((v_c5 << 3) | (v_c5 >> 2)))); + v_c5 = (31 & (v_c >> 5)); + self->private_data.f_scratch[1] = ((uint8_t)(((v_c5 << 3) | (v_c5 >> 2)))); + v_c5 = (31 & (v_c >> 10)); + self->private_data.f_scratch[2] = ((uint8_t)(((v_c5 << 3) | (v_c5 >> 2)))); + self->private_data.f_scratch[3] = 255; + if ((v_run_length + v_dst_x) > self->private_impl.f_width) { + status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); + goto exit; + } + } + } + } + } + v_dst_x = 0; + if ((self->private_impl.f_header_image_descriptor & 32) == 0) { + v_dst_y -= 1; + } else { + v_dst_y += 1; + } + if ((self->private_impl.f_header_image_type & 8) == 0) { + v_lit_length = self->private_impl.f_width; + } + } + goto label__resume__break; + } + label__resume__break:; + self->private_impl.f_call_sequence = 96; + + ok: + self->private_impl.p_do_decode_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; + self->private_data.s_do_decode_frame[0].v_dst_x = v_dst_x; + self->private_data.s_do_decode_frame[0].v_dst_y = v_dst_y; + self->private_data.s_do_decode_frame[0].v_mark = v_mark; + self->private_data.s_do_decode_frame[0].v_num_pixels32 = v_num_pixels32; + self->private_data.s_do_decode_frame[0].v_lit_length = v_lit_length; + self->private_data.s_do_decode_frame[0].v_run_length = v_run_length; + self->private_data.s_do_decode_frame[0].v_num_dst_bytes = v_num_dst_bytes; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func tga.decoder.frame_dirty_rect + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_tga__decoder__frame_dirty_rect( + const wuffs_tga__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + + return wuffs_base__utility__make_rect_ie_u32( + 0, + 0, + self->private_impl.f_width, + self->private_impl.f_height); +} + +// -------- func tga.decoder.num_animation_loops + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_tga__decoder__num_animation_loops( + const wuffs_tga__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + return 0; +} + +// -------- func tga.decoder.num_decoded_frame_configs + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_tga__decoder__num_decoded_frame_configs( + const wuffs_tga__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + if (self->private_impl.f_call_sequence > 32) { + return 1; + } + return 0; +} + +// -------- func tga.decoder.num_decoded_frames + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_tga__decoder__num_decoded_frames( + const wuffs_tga__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + if (self->private_impl.f_call_sequence > 64) { + return 1; + } + return 0; +} + +// -------- func tga.decoder.restart_frame + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_tga__decoder__restart_frame( + wuffs_tga__decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + if (self->private_impl.f_call_sequence < 32) { + return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + } + if (a_index != 0) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + self->private_impl.f_call_sequence = 40; + self->private_impl.f_frame_config_io_position = a_io_position; + return wuffs_base__make_status(NULL); +} + +// -------- func tga.decoder.set_report_metadata + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_tga__decoder__set_report_metadata( + wuffs_tga__decoder* self, + uint32_t a_fourcc, + bool a_report) { + return wuffs_base__make_empty_struct(); +} + +// -------- func tga.decoder.tell_me_more + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_tga__decoder__tell_me_more( + wuffs_tga__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 4)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + status = wuffs_base__make_status(wuffs_base__error__no_more_information); + goto exit; + + goto ok; + ok: + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func tga.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_tga__decoder__workbuf_len( + const wuffs_tga__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__make_range_ii_u64(0, 0); +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) + +// ---------------- Status Codes Implementations + +const char wuffs_wbmp__error__bad_header[] = "#wbmp: bad header"; +const char wuffs_wbmp__error__truncated_input[] = "#wbmp: truncated input"; + +// ---------------- Private Consts + +// ---------------- Private Initializer Prototypes + +// ---------------- Private Function Prototypes + +static wuffs_base__status +wuffs_wbmp__decoder__do_decode_image_config( + wuffs_wbmp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_wbmp__decoder__do_decode_frame_config( + wuffs_wbmp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + +static wuffs_base__status +wuffs_wbmp__decoder__do_decode_frame( + wuffs_wbmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts); + +// ---------------- VTables + +const wuffs_base__image_decoder__func_ptrs +wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { + (wuffs_base__status(*)(void*, + wuffs_base__pixel_buffer*, + wuffs_base__io_buffer*, + wuffs_base__pixel_blend, + wuffs_base__slice_u8, + wuffs_base__decode_frame_options*))(&wuffs_wbmp__decoder__decode_frame), + (wuffs_base__status(*)(void*, + wuffs_base__frame_config*, + wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_frame_config), + (wuffs_base__status(*)(void*, + wuffs_base__image_config*, + wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_image_config), + (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_wbmp__decoder__frame_dirty_rect), + (uint32_t(*)(const void*))(&wuffs_wbmp__decoder__num_animation_loops), + (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frame_configs), + (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frames), + (wuffs_base__status(*)(void*, + uint64_t, + uint64_t))(&wuffs_wbmp__decoder__restart_frame), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_wbmp__decoder__set_quirk_enabled), + (wuffs_base__empty_struct(*)(void*, + uint32_t, + bool))(&wuffs_wbmp__decoder__set_report_metadata), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__more_information*, + wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__tell_me_more), + (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_wbmp__decoder__workbuf_len), +}; + +// ---------------- Initializer Implementations + +wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +wuffs_wbmp__decoder__initialize( + wuffs_wbmp__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (sizeof(*self) != sizeof_star_self) { + return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } + if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || + (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { + return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + + if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { + // The whole point of this if-check is to detect an uninitialized *self. + // We disable the warning on GCC. Clang-5.0 does not have this warning. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + if (self->private_impl.magic != 0) { + return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { + memset(self, 0, sizeof(*self)); + options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { + memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } + + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = + wuffs_base__image_decoder__vtable_name; + self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = + (const void*)(&wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder); + return wuffs_base__make_status(NULL); +} + +wuffs_wbmp__decoder* +wuffs_wbmp__decoder__alloc() { + wuffs_wbmp__decoder* x = + (wuffs_wbmp__decoder*)(calloc(1, sizeof(wuffs_wbmp__decoder))); + if (!x) { + return NULL; + } + if (wuffs_wbmp__decoder__initialize( + x, sizeof(wuffs_wbmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } + return x; +} + +size_t +sizeof__wuffs_wbmp__decoder() { + return sizeof(wuffs_wbmp__decoder); +} + +// ---------------- Function Implementations + +// -------- func wbmp.decoder.set_quirk_enabled + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_wbmp__decoder__set_quirk_enabled( + wuffs_wbmp__decoder* self, + uint32_t a_quirk, + bool a_enabled) { + return wuffs_base__make_empty_struct(); +} + +// -------- func wbmp.decoder.decode_image_config + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_wbmp__decoder__decode_image_config( + wuffs_wbmp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_image_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_image_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func wbmp.decoder.do_decode_image_config + +static wuffs_base__status +wuffs_wbmp__decoder__do_decode_image_config( + wuffs_wbmp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint8_t v_c = 0; + uint32_t v_i = 0; + uint32_t v_x32 = 0; + uint64_t v_x64 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; + if (coro_susp_point) { + v_i = self->private_data.s_do_decode_image_config[0].v_i; + v_x32 = self->private_data.s_do_decode_image_config[0].v_x32; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence != 0) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } + v_i = 0; + while (v_i < 2) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_0 = *iop_a_src++; + v_c = t_0; + } + if (v_c != 0) { + status = wuffs_base__make_status(wuffs_wbmp__error__bad_header); + goto exit; + } + v_i += 1; + } + v_i = 0; + while (v_i < 2) { + v_x32 = 0; + while (true) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_1 = *iop_a_src++; + v_c = t_1; + } + v_x32 |= ((uint32_t)((v_c & 127))); + if ((v_c >> 7) == 0) { + goto label__0__break; + } + v_x64 = (((uint64_t)(v_x32)) << 7); + if (v_x64 > 4294967295) { + status = wuffs_base__make_status(wuffs_wbmp__error__bad_header); + goto exit; + } + v_x32 = ((uint32_t)(v_x64)); + } + label__0__break:; + if (v_i == 0) { + self->private_impl.f_width = v_x32; + } else { + self->private_impl.f_height = v_x32; + } + v_i += 1; + } + self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); + if (a_dst != NULL) { + wuffs_base__image_config__set( + a_dst, + 2198077448, + 0, + self->private_impl.f_width, + self->private_impl.f_height, + self->private_impl.f_frame_config_io_position, + true); + } + self->private_impl.f_call_sequence = 32; + + goto ok; + ok: + self->private_impl.p_do_decode_image_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_do_decode_image_config[0].v_i = v_i; + self->private_data.s_do_decode_image_config[0].v_x32 = v_x32; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func wbmp.decoder.decode_frame_config + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_wbmp__decoder__decode_frame_config( + wuffs_wbmp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_frame_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func wbmp.decoder.do_decode_frame_config + +static wuffs_base__status +wuffs_wbmp__decoder__do_decode_frame_config( + wuffs_wbmp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence == 32) { + } else if (self->private_impl.f_call_sequence < 32) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_wbmp__decoder__do_decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else if (self->private_impl.f_call_sequence == 40) { + if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { + status = wuffs_base__make_status(wuffs_base__error__bad_restart); + goto exit; + } + } else if (self->private_impl.f_call_sequence == 64) { + self->private_impl.f_call_sequence = 96; + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + if (a_dst != NULL) { + wuffs_base__frame_config__set( + a_dst, + wuffs_base__utility__make_rect_ie_u32( + 0, + 0, + self->private_impl.f_width, + self->private_impl.f_height), + ((wuffs_base__flicks)(0)), + 0, + self->private_impl.f_frame_config_io_position, + 0, + true, + false, + 4278190080); + } + self->private_impl.f_call_sequence = 64; + + ok: + self->private_impl.p_do_decode_frame_config[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func wbmp.decoder.decode_frame + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_wbmp__decoder__decode_frame( + wuffs_wbmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 3)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + + uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { + wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame(self, + a_dst, + a_src, + a_blend, + a_workbuf, + a_opts); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { + status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); + goto exit; + } + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: + self->private_impl.p_decode_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func wbmp.decoder.do_decode_frame + +static wuffs_base__status +wuffs_wbmp__decoder__do_decode_frame( + wuffs_wbmp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + wuffs_base__pixel_format v_dst_pixfmt = {0}; + uint32_t v_dst_bits_per_pixel = 0; + uint64_t v_dst_bytes_per_pixel = 0; + uint64_t v_dst_x_in_bytes = 0; + uint32_t v_dst_x = 0; + uint32_t v_dst_y = 0; + wuffs_base__table_u8 v_tab = {0}; + wuffs_base__slice_u8 v_dst = {0}; + uint8_t v_src[1] = {0}; + uint8_t v_c = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_src && a_src->data.ptr) { + io0_a_src = a_src->data.ptr; + io1_a_src = io0_a_src + a_src->meta.ri; + iop_a_src = io1_a_src; + io2_a_src = io0_a_src + a_src->meta.wi; + } + + uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; + if (coro_susp_point) { + v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel; + v_dst_x = self->private_data.s_do_decode_frame[0].v_dst_x; + v_dst_y = self->private_data.s_do_decode_frame[0].v_dst_y; + memcpy(v_src, self->private_data.s_do_decode_frame[0].v_src, sizeof(v_src)); + v_c = self->private_data.s_do_decode_frame[0].v_c; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + if (self->private_impl.f_call_sequence == 64) { + } else if (self->private_impl.f_call_sequence < 64) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + status = wuffs_wbmp__decoder__do_decode_frame_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } + } else { + status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } + v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, + wuffs_base__pixel_buffer__pixel_format(a_dst), + wuffs_base__pixel_buffer__palette(a_dst), + wuffs_base__utility__make_pixel_format(536870920), + wuffs_base__utility__empty_slice_u8(), + a_blend); + if ( ! wuffs_base__status__is_ok(&v_status)) { + status = v_status; + if (wuffs_base__status__is_error(&status)) { + goto exit; + } else if (wuffs_base__status__is_suspension(&status)) { + status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } + goto ok; + } + v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); + v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); + if ((v_dst_bits_per_pixel & 7) != 0) { + status = wuffs_base__make_status(wuffs_base__error__unsupported_option); + goto exit; + } + v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8))); + if (self->private_impl.f_width > 0) { + v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); + while (v_dst_y < self->private_impl.f_height) { + v_dst = wuffs_base__table_u8__row_u32(v_tab, v_dst_y); + v_dst_x = 0; + while (v_dst_x < self->private_impl.f_width) { + if ((v_dst_x & 7) == 0) { + while (((uint64_t)(io2_a_src - iop_a_src)) <= 0) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0); + v_dst = wuffs_base__table_u8__row_u32(v_tab, v_dst_y); + v_dst_x_in_bytes = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); + if (v_dst_x_in_bytes <= ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_x_in_bytes); + } + } + v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1; + } + if ((v_c & 128) == 0) { + v_src[0] = 0; + } else { + v_src[0] = 255; + } + v_c = ((uint8_t)(((((uint32_t)(v_c)) << 1) & 255))); + wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__utility__empty_slice_u8(), wuffs_base__make_slice_u8(v_src, 1)); + if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { + v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); + } + v_dst_x += 1; + } + v_dst_y += 1; + } + } + self->private_impl.f_call_sequence = 96; + + ok: + self->private_impl.p_do_decode_frame[0] = 0; + goto exit; + } + + goto suspend; + suspend: + self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; + self->private_data.s_do_decode_frame[0].v_dst_x = v_dst_x; + self->private_data.s_do_decode_frame[0].v_dst_y = v_dst_y; + memcpy(self->private_data.s_do_decode_frame[0].v_src, v_src, sizeof(v_src)); + self->private_data.s_do_decode_frame[0].v_c = v_c; + + goto exit; + exit: + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; +} + +// -------- func wbmp.decoder.frame_dirty_rect + +WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +wuffs_wbmp__decoder__frame_dirty_rect( + const wuffs_wbmp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_rect_ie_u32(); + } + + return wuffs_base__utility__make_rect_ie_u32( + 0, + 0, + self->private_impl.f_width, + self->private_impl.f_height); +} + +// -------- func wbmp.decoder.num_animation_loops + +WUFFS_BASE__MAYBE_STATIC uint32_t +wuffs_wbmp__decoder__num_animation_loops( + const wuffs_wbmp__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + return 0; +} + +// -------- func wbmp.decoder.num_decoded_frame_configs + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_wbmp__decoder__num_decoded_frame_configs( + const wuffs_wbmp__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + if (self->private_impl.f_call_sequence > 32) { + return 1; + } + return 0; +} + +// -------- func wbmp.decoder.num_decoded_frames + +WUFFS_BASE__MAYBE_STATIC uint64_t +wuffs_wbmp__decoder__num_decoded_frames( + const wuffs_wbmp__decoder* self) { + if (!self) { + return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } + + if (self->private_impl.f_call_sequence > 64) { + return 1; + } + return 0; +} + +// -------- func wbmp.decoder.restart_frame + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_wbmp__decoder__restart_frame( + wuffs_wbmp__decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + + if (self->private_impl.f_call_sequence < 32) { + return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + } + if (a_index != 0) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + self->private_impl.f_call_sequence = 40; + self->private_impl.f_frame_config_io_position = a_io_position; + return wuffs_base__make_status(NULL); +} + +// -------- func wbmp.decoder.set_report_metadata + +WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +wuffs_wbmp__decoder__set_report_metadata( + wuffs_wbmp__decoder* self, + uint32_t a_fourcc, + bool a_report) { + return wuffs_base__make_empty_struct(); +} + +// -------- func wbmp.decoder.tell_me_more + +WUFFS_BASE__MAYBE_STATIC wuffs_base__status +wuffs_wbmp__decoder__tell_me_more( + wuffs_wbmp__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return wuffs_base__make_status( + (self->private_impl.magic == WUFFS_BASE__DISABLED) + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } + if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && + (self->private_impl.active_coroutine != 4)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + + status = wuffs_base__make_status(wuffs_base__error__no_more_information); + goto exit; + + goto ok; + ok: + goto exit; + exit: + if (wuffs_base__status__is_error(&status)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + } + return status; +} + +// -------- func wbmp.decoder.workbuf_len + +WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +wuffs_wbmp__decoder__workbuf_len( + const wuffs_wbmp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return wuffs_base__utility__empty_range_ii_u64(); + } + + return wuffs_base__utility__make_range_ii_u64(0, 0); +} + +#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) + +#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +// ---------------- Auxiliary - Base + +// Auxiliary code is discussed at +// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__BASE) + +namespace wuffs_aux { + +namespace sync_io { + +// -------- + +DynIOBuffer::DynIOBuffer(uint64_t max_incl) + : m_buf(wuffs_base__empty_io_buffer()), m_max_incl(max_incl) {} + +DynIOBuffer::~DynIOBuffer() { + if (m_buf.data.ptr) { + free(m_buf.data.ptr); + } +} + +void // +DynIOBuffer::drop() { + if (m_buf.data.ptr) { + free(m_buf.data.ptr); + } + m_buf = wuffs_base__empty_io_buffer(); +} + +DynIOBuffer::GrowResult // +DynIOBuffer::grow(uint64_t min_incl) { + uint64_t n = round_up(min_incl, m_max_incl); + if (n == 0) { + return ((min_incl == 0) && (m_max_incl == 0)) + ? DynIOBuffer::GrowResult::OK + : DynIOBuffer::GrowResult::FailedMaxInclExceeded; + } else if (n > m_buf.data.len) { + uint8_t* ptr = static_cast(realloc(m_buf.data.ptr, n)); + if (!ptr) { + return DynIOBuffer::GrowResult::FailedOutOfMemory; + } + m_buf.data.ptr = ptr; + m_buf.data.len = n; + } + return DynIOBuffer::GrowResult::OK; +} + +// round_up rounds min_incl up, returning the smallest value x satisfying +// (min_incl <= x) and (x <= max_incl) and some other constraints. It returns 0 +// if there is no such x. +// +// When max_incl <= 4096, the other constraints are: +// - (x == max_incl) +// +// When max_incl > 4096, the other constraints are: +// - (x == max_incl) or (x is a power of 2) +// - (x >= 4096) +uint64_t // +DynIOBuffer::round_up(uint64_t min_incl, uint64_t max_incl) { + if (min_incl > max_incl) { + return 0; + } + uint64_t n = 4096; + if (n >= max_incl) { + return max_incl; + } + while (n < min_incl) { + if (n >= (max_incl / 2)) { + return max_incl; + } + n *= 2; + } + return n; +} + +// -------- + +Input::~Input() {} + +IOBuffer* // +Input::BringsItsOwnIOBuffer() { + return nullptr; +} + +// -------- + +FileInput::FileInput(FILE* f) : m_f(f) {} + +std::string // +FileInput::CopyIn(IOBuffer* dst) { + if (!m_f) { + return "wuffs_aux::sync_io::FileInput: nullptr file"; + } else if (!dst) { + return "wuffs_aux::sync_io::FileInput: nullptr IOBuffer"; + } else if (dst->meta.closed) { + return "wuffs_aux::sync_io::FileInput: end of file"; + } else { + dst->compact(); + size_t n = fread(dst->writer_pointer(), 1, dst->writer_length(), m_f); + dst->meta.wi += n; + dst->meta.closed = feof(m_f); + if (ferror(m_f)) { + return "wuffs_aux::sync_io::FileInput: error reading file"; + } + } + return ""; +} + +// -------- + +MemoryInput::MemoryInput(const char* ptr, size_t len) + : m_io(wuffs_base__ptr_u8__reader( + static_cast(static_cast(const_cast(ptr))), + len, + true)) {} + +MemoryInput::MemoryInput(const uint8_t* ptr, size_t len) + : m_io(wuffs_base__ptr_u8__reader(const_cast(ptr), len, true)) {} + +IOBuffer* // +MemoryInput::BringsItsOwnIOBuffer() { + return &m_io; +} + +std::string // +MemoryInput::CopyIn(IOBuffer* dst) { + if (!dst) { + return "wuffs_aux::sync_io::MemoryInput: nullptr IOBuffer"; + } else if (dst->meta.closed) { + return "wuffs_aux::sync_io::MemoryInput: end of file"; + } else if (wuffs_base__slice_u8__overlaps(dst->data, m_io.data)) { + // Treat m_io's data as immutable, so don't compact dst or otherwise write + // to it. + return "wuffs_aux::sync_io::MemoryInput: overlapping buffers"; + } else { + dst->compact(); + size_t nd = dst->writer_length(); + size_t ns = m_io.reader_length(); + size_t n = (nd < ns) ? nd : ns; + memcpy(dst->writer_pointer(), m_io.reader_pointer(), n); + m_io.meta.ri += n; + dst->meta.wi += n; + dst->meta.closed = m_io.reader_length() == 0; + } + return ""; +} + +// -------- + +} // namespace sync_io + +namespace private_impl { + +struct ErrorMessages { + const char* max_incl_metadata_length_exceeded; + const char* out_of_memory; + const char* unexpected_end_of_file; + const char* unsupported_metadata; + const char* unsupported_negative_advance; + + // If adding new "const char*" typed fields to this struct, either add them + // after existing fields or, if re-ordering fields, make sure that you update + // all of the "const private_impl::ErrorMessages FooBarErrorMessages" values + // in all of the sibling *.cc files. + + static inline const char* resolve(const char* s) { + return s ? s : "wuffs_aux::private_impl: unknown error"; + }; +}; + +std::string // +AdvanceIOBufferTo(const ErrorMessages& error_messages, + sync_io::Input& input, + IOBuffer& io_buf, + uint64_t absolute_position) { + if (absolute_position < io_buf.reader_position()) { + return error_messages.resolve(error_messages.unsupported_negative_advance); + } + while (true) { + uint64_t relative_position = absolute_position - io_buf.reader_position(); + if (relative_position <= io_buf.reader_length()) { + io_buf.meta.ri += (size_t)relative_position; + break; + } else if (io_buf.meta.closed) { + return error_messages.resolve(error_messages.unexpected_end_of_file); + } + io_buf.meta.ri = io_buf.meta.wi; + if (!input.BringsItsOwnIOBuffer()) { + io_buf.compact(); + } + std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return error_message; + } + } + return ""; +} + +std::string // +HandleMetadata( + const ErrorMessages& error_messages, + sync_io::Input& input, + wuffs_base__io_buffer& io_buf, + sync_io::DynIOBuffer& raw, + wuffs_base__status (*tell_me_more_func)(void*, + wuffs_base__io_buffer*, + wuffs_base__more_information*, + wuffs_base__io_buffer*), + void* tell_me_more_receiver, + std::string (*handle_metadata_func)(void*, + const wuffs_base__more_information*, + wuffs_base__slice_u8), + void* handle_metadata_receiver) { + wuffs_base__more_information minfo = wuffs_base__empty_more_information(); + // Reset raw but keep its backing array (the raw.m_buf.data slice). + raw.m_buf.meta = wuffs_base__empty_io_buffer_meta(); + + while (true) { + minfo = wuffs_base__empty_more_information(); + wuffs_base__status status = (*tell_me_more_func)( + tell_me_more_receiver, &raw.m_buf, &minfo, &io_buf); + switch (minfo.flavor) { + case 0: + case WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_TRANSFORM: + case WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED: + break; + + case WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH: { + wuffs_base__range_ie_u64 r = minfo.metadata_raw_passthrough__range(); + if (r.is_empty()) { + break; + } + uint64_t num_to_copy = r.length(); + if (num_to_copy > (raw.m_max_incl - raw.m_buf.meta.wi)) { + return error_messages.resolve( + error_messages.max_incl_metadata_length_exceeded); + } else if (num_to_copy > (raw.m_buf.data.len - raw.m_buf.meta.wi)) { + switch (raw.grow(num_to_copy + raw.m_buf.meta.wi)) { + case sync_io::DynIOBuffer::GrowResult::OK: + break; + case sync_io::DynIOBuffer::GrowResult::FailedMaxInclExceeded: + return error_messages.resolve( + error_messages.max_incl_metadata_length_exceeded); + case sync_io::DynIOBuffer::GrowResult::FailedOutOfMemory: + return error_messages.resolve(error_messages.out_of_memory); + } + } + + if (io_buf.reader_position() > r.min_incl) { + return error_messages.resolve(error_messages.unsupported_metadata); + } else { + std::string error_message = + AdvanceIOBufferTo(error_messages, input, io_buf, r.min_incl); + if (!error_message.empty()) { + return error_message; + } + } + + while (true) { + uint64_t n = + wuffs_base__u64__min(num_to_copy, io_buf.reader_length()); + memcpy(raw.m_buf.writer_pointer(), io_buf.reader_pointer(), n); + raw.m_buf.meta.wi += n; + io_buf.meta.ri += n; + num_to_copy -= n; + if (num_to_copy == 0) { + break; + } else if (io_buf.meta.closed) { + return error_messages.resolve( + error_messages.unexpected_end_of_file); + } else if (!input.BringsItsOwnIOBuffer()) { + io_buf.compact(); + } + std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return error_message; + } + } + break; + } + + default: + return error_messages.resolve(error_messages.unsupported_metadata); + } + + if (status.repr == nullptr) { + break; + } else if (status.repr != wuffs_base__suspension__even_more_information) { + if (status.repr != wuffs_base__suspension__short_write) { + return status.message(); + } + switch (raw.grow(wuffs_base__u64__sat_add(raw.m_buf.data.len, 1))) { + case sync_io::DynIOBuffer::GrowResult::OK: + break; + case sync_io::DynIOBuffer::GrowResult::FailedMaxInclExceeded: + return error_messages.resolve( + error_messages.max_incl_metadata_length_exceeded); + case sync_io::DynIOBuffer::GrowResult::FailedOutOfMemory: + return error_messages.resolve(error_messages.out_of_memory); + } + } + } + + return (*handle_metadata_func)(handle_metadata_receiver, &minfo, + raw.m_buf.reader_slice()); +} + +} // namespace private_impl + +} // namespace wuffs_aux + +#endif // !defined(WUFFS_CONFIG__MODULES) || + // defined(WUFFS_CONFIG__MODULE__AUX__BASE) + +// ---------------- Auxiliary - CBOR + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__CBOR) + +#include + +namespace wuffs_aux { + +DecodeCborResult::DecodeCborResult(std::string&& error_message0, + uint64_t cursor_position0) + : error_message(std::move(error_message0)), + cursor_position(cursor_position0) {} + +DecodeCborCallbacks::~DecodeCborCallbacks() {} + +void // +DecodeCborCallbacks::Done(DecodeCborResult& result, + sync_io::Input& input, + IOBuffer& buffer) {} + +DecodeCborArgQuirks::DecodeCborArgQuirks(wuffs_base__slice_u32 repr0) + : repr(repr0) {} + +DecodeCborArgQuirks::DecodeCborArgQuirks(uint32_t* ptr0, size_t len0) + : repr(wuffs_base__make_slice_u32(ptr0, len0)) {} + +DecodeCborArgQuirks // +DecodeCborArgQuirks::DefaultValue() { + return DecodeCborArgQuirks(wuffs_base__empty_slice_u32()); +} + +DecodeCborResult // +DecodeCbor(DecodeCborCallbacks& callbacks, + sync_io::Input& input, + DecodeCborArgQuirks quirks) { + // Prepare the wuffs_base__io_buffer and the resultant error_message. + wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer(); + wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer(); + std::unique_ptr fallback_io_array(nullptr); + if (!io_buf) { + fallback_io_array = std::unique_ptr(new uint8_t[4096]); + fallback_io_buf = wuffs_base__ptr_u8__writer(fallback_io_array.get(), 4096); + io_buf = &fallback_io_buf; + } + // cursor_index is discussed at + // https://nigeltao.github.io/blog/2020/jsonptr.html#the-cursor-index + size_t cursor_index = 0; + std::string ret_error_message; + std::string io_error_message; + + do { + // Prepare the low-level CBOR decoder. + wuffs_cbor__decoder::unique_ptr dec = wuffs_cbor__decoder::alloc(); + if (!dec) { + ret_error_message = "wuffs_aux::DecodeCbor: out of memory"; + goto done; + } + for (size_t i = 0; i < quirks.repr.len; i++) { + dec->set_quirk_enabled(quirks.repr.ptr[i], true); + } + + // Prepare the wuffs_base__tok_buffer. 256 tokens is 2KiB. + wuffs_base__token tok_array[256]; + wuffs_base__token_buffer tok_buf = + wuffs_base__slice_token__writer(wuffs_base__make_slice_token( + &tok_array[0], (sizeof(tok_array) / sizeof(tok_array[0])))); + wuffs_base__status tok_status = wuffs_base__make_status(nullptr); + + // Prepare other state. + int32_t depth = 0; + std::string str; + int64_t extension_category = 0; + uint64_t extension_detail = 0; + + // Valid token's VBCs range in 0 ..= 15. Values over that are for tokens + // from outside of the base package, such as the CBOR package. + constexpr int64_t EXT_CAT__CBOR_TAG = 16; + + // Loop, doing these two things: + // 1. Get the next token. + // 2. Process that token. + while (true) { + // 1. Get the next token. + + while (tok_buf.meta.ri >= tok_buf.meta.wi) { + if (tok_status.repr == nullptr) { + // No-op. + } else if (tok_status.repr == wuffs_base__suspension__short_write) { + tok_buf.compact(); + } else if (tok_status.repr == wuffs_base__suspension__short_read) { + // Read from input to io_buf. + if (!io_error_message.empty()) { + ret_error_message = std::move(io_error_message); + goto done; + } else if (cursor_index != io_buf->meta.ri) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: bad cursor_index"; + goto done; + } else if (io_buf->meta.closed) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: io_buf is closed"; + goto done; + } + io_buf->compact(); + if (io_buf->meta.wi >= io_buf->data.len) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: io_buf is full"; + goto done; + } + cursor_index = io_buf->meta.ri; + io_error_message = input.CopyIn(io_buf); + } else { + ret_error_message = tok_status.message(); + goto done; + } + + if (WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: bad WORKBUF_LEN"; + goto done; + } + wuffs_base__slice_u8 work_buf = wuffs_base__empty_slice_u8(); + tok_status = dec->decode_tokens(&tok_buf, io_buf, work_buf); + if ((tok_buf.meta.ri > tok_buf.meta.wi) || + (tok_buf.meta.wi > tok_buf.data.len) || + (io_buf->meta.ri > io_buf->meta.wi) || + (io_buf->meta.wi > io_buf->data.len)) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: bad buffer indexes"; + goto done; + } + } + + wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++]; + uint64_t token_len = token.length(); + if ((io_buf->meta.ri < cursor_index) || + ((io_buf->meta.ri - cursor_index) < token_len)) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: bad token indexes"; + goto done; + } + uint8_t* token_ptr = io_buf->data.ptr + cursor_index; + cursor_index += static_cast(token_len); + + // 2. Process that token. + + uint64_t vbd = token.value_base_detail(); + + if (extension_category != 0) { + int64_t ext = token.value_extension(); + if ((ext >= 0) && !token.continued()) { + extension_detail = (extension_detail + << WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS) | + static_cast(ext); + switch (extension_category) { + case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED: + extension_category = 0; + ret_error_message = + callbacks.AppendI64(static_cast(extension_detail)); + goto parsed_a_value; + case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED: + extension_category = 0; + ret_error_message = callbacks.AppendU64(extension_detail); + goto parsed_a_value; + case EXT_CAT__CBOR_TAG: + extension_category = 0; + ret_error_message = callbacks.AppendCborTag(extension_detail); + if (!ret_error_message.empty()) { + goto done; + } + continue; + } + } + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: bad extended token"; + goto done; + } + + switch (token.value_base_category()) { + case WUFFS_BASE__TOKEN__VBC__FILLER: + continue; + + case WUFFS_BASE__TOKEN__VBC__STRUCTURE: { + if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) { + ret_error_message = callbacks.Push(static_cast(vbd)); + if (!ret_error_message.empty()) { + goto done; + } + depth++; + if (depth > WUFFS_CBOR__DECODER_DEPTH_MAX_INCL) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: bad depth"; + goto done; + } + continue; + } + ret_error_message = callbacks.Pop(static_cast(vbd)); + depth--; + if (depth < 0) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: bad depth"; + goto done; + } + goto parsed_a_value; + } + + case WUFFS_BASE__TOKEN__VBC__STRING: { + if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) { + // No-op. + } else if (vbd & + WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) { + const char* ptr = // Convert from (uint8_t*). + static_cast(static_cast(token_ptr)); + str.append(ptr, static_cast(token_len)); + } else { + goto fail; + } + if (token.continued()) { + continue; + } + ret_error_message = + (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8) + ? callbacks.AppendTextString(std::move(str)) + : callbacks.AppendByteString(std::move(str)); + str.clear(); + goto parsed_a_value; + } + + case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: { + uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL]; + size_t n = wuffs_base__utf_8__encode( + wuffs_base__make_slice_u8( + &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL), + static_cast(vbd)); + const char* ptr = // Convert from (uint8_t*). + static_cast(static_cast(&u[0])); + str.append(ptr, n); + if (token.continued()) { + continue; + } + goto fail; + } + + case WUFFS_BASE__TOKEN__VBC__LITERAL: { + if (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__NULL) { + ret_error_message = callbacks.AppendNull(); + } else if (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED) { + ret_error_message = callbacks.AppendUndefined(); + } else { + ret_error_message = callbacks.AppendBool( + vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE); + } + goto parsed_a_value; + } + + case WUFFS_BASE__TOKEN__VBC__NUMBER: { + const uint64_t cfp_fbbe_fifb = + WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT | + WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN | + WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE; + if ((vbd & cfp_fbbe_fifb) == cfp_fbbe_fifb) { + double f; + switch (token_len) { + case 3: + f = wuffs_base__ieee_754_bit_representation__from_u16_to_f64( + wuffs_base__peek_u16be__no_bounds_check(token_ptr + 1)); + break; + case 5: + f = wuffs_base__ieee_754_bit_representation__from_u32_to_f64( + wuffs_base__peek_u32be__no_bounds_check(token_ptr + 1)); + break; + case 9: + f = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( + wuffs_base__peek_u64be__no_bounds_check(token_ptr + 1)); + break; + default: + goto fail; + } + ret_error_message = callbacks.AppendF64(f); + goto parsed_a_value; + } + goto fail; + } + + case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED: { + if (token.continued()) { + extension_category = WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED; + extension_detail = + static_cast(token.value_base_detail__sign_extended()); + continue; + } + ret_error_message = + callbacks.AppendI64(token.value_base_detail__sign_extended()); + goto parsed_a_value; + } + + case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED: { + if (token.continued()) { + extension_category = + WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED; + extension_detail = vbd; + continue; + } + ret_error_message = callbacks.AppendU64(vbd); + goto parsed_a_value; + } + } + + if (token.value_major() == WUFFS_CBOR__TOKEN_VALUE_MAJOR) { + uint64_t value_minor = token.value_minor(); + if (value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X) { + if (token_len == 9) { + ret_error_message = callbacks.AppendMinus1MinusX( + wuffs_base__peek_u64be__no_bounds_check(token_ptr + 1)); + goto parsed_a_value; + } + } else if (value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE) { + ret_error_message = + callbacks.AppendCborSimpleValue(static_cast( + value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK)); + goto parsed_a_value; + } else if (value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG) { + if (token.continued()) { + extension_category = EXT_CAT__CBOR_TAG; + extension_detail = + value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK; + continue; + } + ret_error_message = callbacks.AppendCborTag( + value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK); + if (!ret_error_message.empty()) { + goto done; + } + continue; + } + } + + fail: + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: unexpected token"; + goto done; + + parsed_a_value: + if (!ret_error_message.empty() || (depth == 0)) { + goto done; + } + } + } while (false); + +done: + DecodeCborResult result( + std::move(ret_error_message), + wuffs_base__u64__sat_add(io_buf->meta.pos, cursor_index)); + callbacks.Done(result, input, *io_buf); + return result; +} + +} // namespace wuffs_aux + +#endif // !defined(WUFFS_CONFIG__MODULES) || + // defined(WUFFS_CONFIG__MODULE__AUX__CBOR) + +// ---------------- Auxiliary - Image + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__IMAGE) + +#include + +namespace wuffs_aux { + +DecodeImageResult::DecodeImageResult(MemOwner&& pixbuf_mem_owner0, + wuffs_base__pixel_buffer pixbuf0, + std::string&& error_message0) + : pixbuf_mem_owner(std::move(pixbuf_mem_owner0)), + pixbuf(pixbuf0), + error_message(std::move(error_message0)) {} + +DecodeImageResult::DecodeImageResult(std::string&& error_message0) + : pixbuf_mem_owner(nullptr, &free), + pixbuf(wuffs_base__null_pixel_buffer()), + error_message(std::move(error_message0)) {} + +DecodeImageCallbacks::~DecodeImageCallbacks() {} + +DecodeImageCallbacks::AllocPixbufResult::AllocPixbufResult( + MemOwner&& mem_owner0, + wuffs_base__pixel_buffer pixbuf0) + : mem_owner(std::move(mem_owner0)), pixbuf(pixbuf0), error_message("") {} + +DecodeImageCallbacks::AllocPixbufResult::AllocPixbufResult( + std::string&& error_message0) + : mem_owner(nullptr, &free), + pixbuf(wuffs_base__null_pixel_buffer()), + error_message(std::move(error_message0)) {} + +DecodeImageCallbacks::AllocWorkbufResult::AllocWorkbufResult( + MemOwner&& mem_owner0, + wuffs_base__slice_u8 workbuf0) + : mem_owner(std::move(mem_owner0)), workbuf(workbuf0), error_message("") {} + +DecodeImageCallbacks::AllocWorkbufResult::AllocWorkbufResult( + std::string&& error_message0) + : mem_owner(nullptr, &free), + workbuf(wuffs_base__empty_slice_u8()), + error_message(std::move(error_message0)) {} + +wuffs_base__image_decoder::unique_ptr // +DecodeImageCallbacks::SelectDecoder(uint32_t fourcc, + wuffs_base__slice_u8 prefix_data, + bool prefix_closed) { + switch (fourcc) { +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) + case WUFFS_BASE__FOURCC__BMP: + return wuffs_bmp__decoder::alloc_as__wuffs_base__image_decoder(); +#endif + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) + case WUFFS_BASE__FOURCC__GIF: + return wuffs_gif__decoder::alloc_as__wuffs_base__image_decoder(); +#endif + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) + case WUFFS_BASE__FOURCC__NIE: + return wuffs_nie__decoder::alloc_as__wuffs_base__image_decoder(); +#endif + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) + case WUFFS_BASE__FOURCC__PNG: { + auto dec = wuffs_png__decoder::alloc_as__wuffs_base__image_decoder(); + // Favor faster decodes over rejecting invalid checksums. + dec->set_quirk_enabled(WUFFS_BASE__QUIRK_IGNORE_CHECKSUM, true); + return dec; + } +#endif + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) + case WUFFS_BASE__FOURCC__TGA: + return wuffs_tga__decoder::alloc_as__wuffs_base__image_decoder(); +#endif + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) + case WUFFS_BASE__FOURCC__WBMP: + return wuffs_wbmp__decoder::alloc_as__wuffs_base__image_decoder(); +#endif + } + + return wuffs_base__image_decoder::unique_ptr(nullptr, &free); +} + +std::string // +DecodeImageCallbacks::HandleMetadata(const wuffs_base__more_information& minfo, + wuffs_base__slice_u8 raw) { + return ""; +} + +wuffs_base__pixel_format // +DecodeImageCallbacks::SelectPixfmt( + const wuffs_base__image_config& image_config) { + return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL); +} + +DecodeImageCallbacks::AllocPixbufResult // +DecodeImageCallbacks::AllocPixbuf(const wuffs_base__image_config& image_config, + bool allow_uninitialized_memory) { + uint32_t w = image_config.pixcfg.width(); + uint32_t h = image_config.pixcfg.height(); + if ((w == 0) || (h == 0)) { + return AllocPixbufResult(""); + } + uint64_t len = image_config.pixcfg.pixbuf_len(); + if ((len == 0) || (SIZE_MAX < len)) { + return AllocPixbufResult(DecodeImage_UnsupportedPixelConfiguration); + } + void* ptr = + allow_uninitialized_memory ? malloc((size_t)len) : calloc((size_t)len, 1); + if (!ptr) { + return AllocPixbufResult(DecodeImage_OutOfMemory); + } + wuffs_base__pixel_buffer pixbuf; + wuffs_base__status status = pixbuf.set_from_slice( + &image_config.pixcfg, + wuffs_base__make_slice_u8((uint8_t*)ptr, (size_t)len)); + if (!status.is_ok()) { + free(ptr); + return AllocPixbufResult(status.message()); + } + return AllocPixbufResult(MemOwner(ptr, &free), pixbuf); +} + +DecodeImageCallbacks::AllocWorkbufResult // +DecodeImageCallbacks::AllocWorkbuf(wuffs_base__range_ii_u64 len_range, + bool allow_uninitialized_memory) { + uint64_t len = len_range.max_incl; + if (len == 0) { + return AllocWorkbufResult(""); + } else if (SIZE_MAX < len) { + return AllocWorkbufResult(DecodeImage_OutOfMemory); + } + void* ptr = + allow_uninitialized_memory ? malloc((size_t)len) : calloc((size_t)len, 1); + if (!ptr) { + return AllocWorkbufResult(DecodeImage_OutOfMemory); + } + return AllocWorkbufResult( + MemOwner(ptr, &free), + wuffs_base__make_slice_u8((uint8_t*)ptr, (size_t)len)); +} + +void // +DecodeImageCallbacks::Done( + DecodeImageResult& result, + sync_io::Input& input, + IOBuffer& buffer, + wuffs_base__image_decoder::unique_ptr image_decoder) {} + +const char DecodeImage_BufferIsTooShort[] = // + "wuffs_aux::DecodeImage: buffer is too short"; +const char DecodeImage_MaxInclDimensionExceeded[] = // + "wuffs_aux::DecodeImage: max_incl_dimension exceeded"; +const char DecodeImage_MaxInclMetadataLengthExceeded[] = // + "wuffs_aux::DecodeImage: max_incl_metadata_length exceeded"; +const char DecodeImage_OutOfMemory[] = // + "wuffs_aux::DecodeImage: out of memory"; +const char DecodeImage_UnexpectedEndOfFile[] = // + "wuffs_aux::DecodeImage: unexpected end of file"; +const char DecodeImage_UnsupportedImageFormat[] = // + "wuffs_aux::DecodeImage: unsupported image format"; +const char DecodeImage_UnsupportedMetadata[] = // + "wuffs_aux::DecodeImage: unsupported metadata"; +const char DecodeImage_UnsupportedPixelBlend[] = // + "wuffs_aux::DecodeImage: unsupported pixel blend"; +const char DecodeImage_UnsupportedPixelConfiguration[] = // + "wuffs_aux::DecodeImage: unsupported pixel configuration"; +const char DecodeImage_UnsupportedPixelFormat[] = // + "wuffs_aux::DecodeImage: unsupported pixel format"; + +DecodeImageArgQuirks::DecodeImageArgQuirks(wuffs_base__slice_u32 repr0) + : repr(repr0) {} + +DecodeImageArgQuirks::DecodeImageArgQuirks(uint32_t* ptr0, size_t len0) + : repr(wuffs_base__make_slice_u32(ptr0, len0)) {} + +DecodeImageArgQuirks // +DecodeImageArgQuirks::DefaultValue() { + return DecodeImageArgQuirks(wuffs_base__empty_slice_u32()); +} + +DecodeImageArgFlags::DecodeImageArgFlags(uint64_t repr0) : repr(repr0) {} + +DecodeImageArgFlags // +DecodeImageArgFlags::DefaultValue() { + return DecodeImageArgFlags(0); +} + +DecodeImageArgPixelBlend::DecodeImageArgPixelBlend( + wuffs_base__pixel_blend repr0) + : repr(repr0) {} + +DecodeImageArgPixelBlend // +DecodeImageArgPixelBlend::DefaultValue() { + return DecodeImageArgPixelBlend(WUFFS_BASE__PIXEL_BLEND__SRC); +} + +DecodeImageArgBackgroundColor::DecodeImageArgBackgroundColor( + wuffs_base__color_u32_argb_premul repr0) + : repr(repr0) {} + +DecodeImageArgBackgroundColor // +DecodeImageArgBackgroundColor::DefaultValue() { + return DecodeImageArgBackgroundColor(1); +} + +DecodeImageArgMaxInclDimension::DecodeImageArgMaxInclDimension(uint32_t repr0) + : repr(repr0) {} + +DecodeImageArgMaxInclDimension // +DecodeImageArgMaxInclDimension::DefaultValue() { + return DecodeImageArgMaxInclDimension(1048575); +} + +DecodeImageArgMaxInclMetadataLength::DecodeImageArgMaxInclMetadataLength( + uint64_t repr0) + : repr(repr0) {} + +DecodeImageArgMaxInclMetadataLength // +DecodeImageArgMaxInclMetadataLength::DefaultValue() { + return DecodeImageArgMaxInclMetadataLength(16777215); +} + +// -------- + +namespace { + +const private_impl::ErrorMessages DecodeImageErrorMessages = { + DecodeImage_MaxInclMetadataLengthExceeded, // + DecodeImage_OutOfMemory, // + DecodeImage_UnexpectedEndOfFile, // + DecodeImage_UnsupportedMetadata, // + DecodeImage_UnsupportedImageFormat, // +}; + +std::string // +DecodeImageAdvanceIOBufferTo(sync_io::Input& input, + wuffs_base__io_buffer& io_buf, + uint64_t absolute_position) { + return private_impl::AdvanceIOBufferTo(DecodeImageErrorMessages, input, + io_buf, absolute_position); +} + +wuffs_base__status // +DIHM0(void* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { + return wuffs_base__image_decoder__tell_me_more( + static_cast(self), a_dst, a_minfo, a_src); +} + +std::string // +DIHM1(void* self, + const wuffs_base__more_information* minfo, + wuffs_base__slice_u8 raw) { + return static_cast(self)->HandleMetadata(*minfo, raw); +} + +std::string // +DecodeImageHandleMetadata(wuffs_base__image_decoder::unique_ptr& image_decoder, + DecodeImageCallbacks& callbacks, + sync_io::Input& input, + wuffs_base__io_buffer& io_buf, + sync_io::DynIOBuffer& raw_metadata_buf) { + return private_impl::HandleMetadata(DecodeImageErrorMessages, input, io_buf, + raw_metadata_buf, DIHM0, + static_cast(image_decoder.get()), + DIHM1, static_cast(&callbacks)); +} + +DecodeImageResult // +DecodeImage0(wuffs_base__image_decoder::unique_ptr& image_decoder, + DecodeImageCallbacks& callbacks, + sync_io::Input& input, + wuffs_base__io_buffer& io_buf, + wuffs_base__slice_u32 quirks, + uint64_t flags, + wuffs_base__pixel_blend pixel_blend, + wuffs_base__color_u32_argb_premul background_color, + uint32_t max_incl_dimension, + uint64_t max_incl_metadata_length) { + // Check args. + switch (pixel_blend) { + case WUFFS_BASE__PIXEL_BLEND__SRC: + case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: + break; + default: + return DecodeImageResult(DecodeImage_UnsupportedPixelBlend); + } + + wuffs_base__image_config image_config = wuffs_base__null_image_config(); + sync_io::DynIOBuffer raw_metadata_buf(max_incl_metadata_length); + uint64_t start_pos = io_buf.reader_position(); + bool interested_in_metadata_after_the_frame = false; + bool redirected = false; + int32_t fourcc = 0; +redirect: + do { + // Determine the image format. + if (!redirected) { + while (true) { + fourcc = wuffs_base__magic_number_guess_fourcc(io_buf.reader_slice(), + io_buf.meta.closed); + if (fourcc > 0) { + break; + } else if ((fourcc == 0) && (io_buf.reader_length() >= 64)) { + // Having (fourcc == 0) means that Wuffs' built in MIME sniffer + // didn't recognize the image format. Nonetheless, custom callbacks + // may still be able to do their own MIME sniffing, for exotic image + // types. We try to give them at least 64 bytes of prefix data when + // one-shot-calling callbacks.SelectDecoder. There is no mechanism + // for the callbacks to request a longer prefix. + break; + } else if (io_buf.meta.closed || (io_buf.writer_length() == 0)) { + fourcc = 0; + break; + } + std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } + } + } else { + wuffs_base__io_buffer empty = wuffs_base__empty_io_buffer(); + wuffs_base__more_information minfo = wuffs_base__empty_more_information(); + wuffs_base__status tmm_status = + image_decoder->tell_me_more(&empty, &minfo, &io_buf); + if (tmm_status.repr != nullptr) { + return DecodeImageResult(tmm_status.message()); + } + if (minfo.flavor != WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_REDIRECT) { + return DecodeImageResult(DecodeImage_UnsupportedImageFormat); + } + uint64_t pos = minfo.io_redirect__range().min_incl; + if (pos <= start_pos) { + // Redirects must go forward. + return DecodeImageResult(DecodeImage_UnsupportedImageFormat); + } + std::string error_message = + DecodeImageAdvanceIOBufferTo(input, io_buf, pos); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } + fourcc = (int32_t)(minfo.io_redirect__fourcc()); + if (fourcc == 0) { + return DecodeImageResult(DecodeImage_UnsupportedImageFormat); + } + image_decoder.reset(); + } + + // Select the image decoder. + image_decoder = callbacks.SelectDecoder( + (uint32_t)fourcc, io_buf.reader_slice(), io_buf.meta.closed); + if (!image_decoder) { + return DecodeImageResult(DecodeImage_UnsupportedImageFormat); + } + + // Apply quirks. + for (size_t i = 0; i < quirks.len; i++) { + image_decoder->set_quirk_enabled(quirks.ptr[i], true); + } + + // Apply flags. + if (flags != 0) { + if (flags & DecodeImageArgFlags::REPORT_METADATA_CHRM) { + image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__CHRM, true); + } + if (flags & DecodeImageArgFlags::REPORT_METADATA_EXIF) { + interested_in_metadata_after_the_frame = true; + image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__EXIF, true); + } + if (flags & DecodeImageArgFlags::REPORT_METADATA_GAMA) { + image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__GAMA, true); + } + if (flags & DecodeImageArgFlags::REPORT_METADATA_ICCP) { + image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__ICCP, true); + } + if (flags & DecodeImageArgFlags::REPORT_METADATA_KVP) { + interested_in_metadata_after_the_frame = true; + image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__KVP, true); + } + if (flags & DecodeImageArgFlags::REPORT_METADATA_SRGB) { + image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__SRGB, true); + } + if (flags & DecodeImageArgFlags::REPORT_METADATA_XMP) { + interested_in_metadata_after_the_frame = true; + image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__XMP, true); + } + } + + // Decode the image config. + while (true) { + wuffs_base__status id_dic_status = + image_decoder->decode_image_config(&image_config, &io_buf); + if (id_dic_status.repr == nullptr) { + break; + } else if (id_dic_status.repr == wuffs_base__note__i_o_redirect) { + if (redirected) { + return DecodeImageResult(DecodeImage_UnsupportedImageFormat); + } + redirected = true; + goto redirect; + } else if (id_dic_status.repr == wuffs_base__note__metadata_reported) { + std::string error_message = DecodeImageHandleMetadata( + image_decoder, callbacks, input, io_buf, raw_metadata_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } + } else if (id_dic_status.repr != wuffs_base__suspension__short_read) { + return DecodeImageResult(id_dic_status.message()); + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { + std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } + } + } + } while (false); + if (!interested_in_metadata_after_the_frame) { + raw_metadata_buf.drop(); + } + + // Select the pixel format. + uint32_t w = image_config.pixcfg.width(); + uint32_t h = image_config.pixcfg.height(); + if ((w > max_incl_dimension) || (h > max_incl_dimension)) { + return DecodeImageResult(DecodeImage_MaxInclDimensionExceeded); + } + wuffs_base__pixel_format pixel_format = callbacks.SelectPixfmt(image_config); + if (pixel_format.repr != image_config.pixcfg.pixel_format().repr) { + switch (pixel_format.repr) { + case WUFFS_BASE__PIXEL_FORMAT__BGR_565: + case WUFFS_BASE__PIXEL_FORMAT__BGR: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: + case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: + case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: + break; + default: + return DecodeImageResult(DecodeImage_UnsupportedPixelFormat); + } + image_config.pixcfg.set(pixel_format.repr, + WUFFS_BASE__PIXEL_SUBSAMPLING__NONE, w, h); + } + + // Allocate the pixel buffer. + bool valid_background_color = + wuffs_base__color_u32_argb_premul__is_valid(background_color); + DecodeImageCallbacks::AllocPixbufResult alloc_pixbuf_result = + callbacks.AllocPixbuf(image_config, valid_background_color); + if (!alloc_pixbuf_result.error_message.empty()) { + return DecodeImageResult(std::move(alloc_pixbuf_result.error_message)); + } + wuffs_base__pixel_buffer pixel_buffer = alloc_pixbuf_result.pixbuf; + if (valid_background_color) { + wuffs_base__status pb_scufr_status = pixel_buffer.set_color_u32_fill_rect( + pixel_buffer.pixcfg.bounds(), background_color); + if (pb_scufr_status.repr != nullptr) { + return DecodeImageResult(pb_scufr_status.message()); + } + } + + // Allocate the work buffer. Wuffs' decoders conventionally assume that this + // can be uninitialized memory. + wuffs_base__range_ii_u64 workbuf_len = image_decoder->workbuf_len(); + DecodeImageCallbacks::AllocWorkbufResult alloc_workbuf_result = + callbacks.AllocWorkbuf(workbuf_len, true); + if (!alloc_workbuf_result.error_message.empty()) { + return DecodeImageResult(std::move(alloc_workbuf_result.error_message)); + } else if (alloc_workbuf_result.workbuf.len < workbuf_len.min_incl) { + return DecodeImageResult(DecodeImage_BufferIsTooShort); + } + + // Decode the frame config. + wuffs_base__frame_config frame_config = wuffs_base__null_frame_config(); + while (true) { + wuffs_base__status id_dfc_status = + image_decoder->decode_frame_config(&frame_config, &io_buf); + if (id_dfc_status.repr == nullptr) { + break; + } else if (id_dfc_status.repr == wuffs_base__note__metadata_reported) { + std::string error_message = DecodeImageHandleMetadata( + image_decoder, callbacks, input, io_buf, raw_metadata_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } + } else if (id_dfc_status.repr != wuffs_base__suspension__short_read) { + return DecodeImageResult(id_dfc_status.message()); + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { + std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } + } + } + + // Decode the frame (the pixels). + // + // From here on, always returns the pixel_buffer. If we get this far, we can + // still display a partial image, even if we encounter an error. + std::string message(""); + if ((pixel_blend == WUFFS_BASE__PIXEL_BLEND__SRC_OVER) && + frame_config.overwrite_instead_of_blend()) { + pixel_blend = WUFFS_BASE__PIXEL_BLEND__SRC; + } + while (true) { + wuffs_base__status id_df_status = + image_decoder->decode_frame(&pixel_buffer, &io_buf, pixel_blend, + alloc_workbuf_result.workbuf, nullptr); + if (id_df_status.repr == nullptr) { + break; + } else if (id_df_status.repr != wuffs_base__suspension__short_read) { + message = id_df_status.message(); + break; + } else if (io_buf.meta.closed) { + message = DecodeImage_UnexpectedEndOfFile; + break; + } else { + std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + message = std::move(error_message); + break; + } + } + } + + // Decode any metadata after the frame. + if (interested_in_metadata_after_the_frame) { + while (true) { + wuffs_base__status id_dfc_status = + image_decoder->decode_frame_config(NULL, &io_buf); + if (id_dfc_status.repr == wuffs_base__note__end_of_data) { + break; + } else if (id_dfc_status.repr == nullptr) { + continue; + } else if (id_dfc_status.repr == wuffs_base__note__metadata_reported) { + std::string error_message = DecodeImageHandleMetadata( + image_decoder, callbacks, input, io_buf, raw_metadata_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } + } else if (id_dfc_status.repr != wuffs_base__suspension__short_read) { + return DecodeImageResult(id_dfc_status.message()); + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { + std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } + } + } + } + + return DecodeImageResult(std::move(alloc_pixbuf_result.mem_owner), + pixel_buffer, std::move(message)); +} + +} // namespace + +DecodeImageResult // +DecodeImage(DecodeImageCallbacks& callbacks, + sync_io::Input& input, + DecodeImageArgQuirks quirks, + DecodeImageArgFlags flags, + DecodeImageArgPixelBlend pixel_blend, + DecodeImageArgBackgroundColor background_color, + DecodeImageArgMaxInclDimension max_incl_dimension, + DecodeImageArgMaxInclMetadataLength max_incl_metadata_length) { + wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer(); + wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer(); + std::unique_ptr fallback_io_array(nullptr); + if (!io_buf) { + fallback_io_array = std::unique_ptr(new uint8_t[32768]); + fallback_io_buf = + wuffs_base__ptr_u8__writer(fallback_io_array.get(), 32768); + io_buf = &fallback_io_buf; + } + + wuffs_base__image_decoder::unique_ptr image_decoder(nullptr, &free); + DecodeImageResult result = + DecodeImage0(image_decoder, callbacks, input, *io_buf, quirks.repr, + flags.repr, pixel_blend.repr, background_color.repr, + max_incl_dimension.repr, max_incl_metadata_length.repr); + callbacks.Done(result, input, *io_buf, std::move(image_decoder)); + return result; +} + +} // namespace wuffs_aux + +#endif // !defined(WUFFS_CONFIG__MODULES) || + // defined(WUFFS_CONFIG__MODULE__AUX__IMAGE) + +// ---------------- Auxiliary - JSON + +#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__JSON) + +#include + +namespace wuffs_aux { + +DecodeJsonResult::DecodeJsonResult(std::string&& error_message0, + uint64_t cursor_position0) + : error_message(std::move(error_message0)), + cursor_position(cursor_position0) {} + +DecodeJsonCallbacks::~DecodeJsonCallbacks() {} + +void // +DecodeJsonCallbacks::Done(DecodeJsonResult& result, + sync_io::Input& input, + IOBuffer& buffer) {} + +const char DecodeJson_BadJsonPointer[] = // + "wuffs_aux::DecodeJson: bad JSON Pointer"; +const char DecodeJson_NoMatch[] = // + "wuffs_aux::DecodeJson: no match"; + +DecodeJsonArgQuirks::DecodeJsonArgQuirks(wuffs_base__slice_u32 repr0) + : repr(repr0) {} + +DecodeJsonArgQuirks::DecodeJsonArgQuirks(uint32_t* ptr0, size_t len0) + : repr(wuffs_base__make_slice_u32(ptr0, len0)) {} + +DecodeJsonArgQuirks // +DecodeJsonArgQuirks::DefaultValue() { + return DecodeJsonArgQuirks(wuffs_base__empty_slice_u32()); +} + +DecodeJsonArgJsonPointer::DecodeJsonArgJsonPointer(std::string repr0) + : repr(repr0) {} + +DecodeJsonArgJsonPointer // +DecodeJsonArgJsonPointer::DefaultValue() { + return DecodeJsonArgJsonPointer(std::string()); +} + +// -------- + +#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN \ + while (tok_buf.meta.ri >= tok_buf.meta.wi) { \ + if (tok_status.repr == nullptr) { \ + goto done; \ + } else if (tok_status.repr == wuffs_base__suspension__short_write) { \ + tok_buf.compact(); \ + } else if (tok_status.repr == wuffs_base__suspension__short_read) { \ + if (!io_error_message.empty()) { \ + ret_error_message = std::move(io_error_message); \ + goto done; \ + } else if (cursor_index != io_buf->meta.ri) { \ + ret_error_message = \ + "wuffs_aux::DecodeJson: internal error: bad cursor_index"; \ + goto done; \ + } else if (io_buf->meta.closed) { \ + ret_error_message = \ + "wuffs_aux::DecodeJson: internal error: io_buf is closed"; \ + goto done; \ + } \ + io_buf->compact(); \ + if (io_buf->meta.wi >= io_buf->data.len) { \ + ret_error_message = \ + "wuffs_aux::DecodeJson: internal error: io_buf is full"; \ + goto done; \ + } \ + cursor_index = io_buf->meta.ri; \ + io_error_message = input.CopyIn(io_buf); \ + } else { \ + ret_error_message = tok_status.message(); \ + goto done; \ + } \ + tok_status = \ + dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8()); \ + if ((tok_buf.meta.ri > tok_buf.meta.wi) || \ + (tok_buf.meta.wi > tok_buf.data.len) || \ + (io_buf->meta.ri > io_buf->meta.wi) || \ + (io_buf->meta.wi > io_buf->data.len)) { \ + ret_error_message = \ + "wuffs_aux::DecodeJson: internal error: bad buffer indexes"; \ + goto done; \ + } \ + } \ + wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++]; \ + uint64_t token_len = token.length(); \ + if ((io_buf->meta.ri < cursor_index) || \ + ((io_buf->meta.ri - cursor_index) < token_len)) { \ + ret_error_message = \ + "wuffs_aux::DecodeJson: internal error: bad token indexes"; \ + goto done; \ + } \ + uint8_t* token_ptr = io_buf->data.ptr + cursor_index; \ + (void)(token_ptr); \ + cursor_index += static_cast(token_len) + +// -------- + +namespace { + +// DecodeJson_SplitJsonPointer returns ("bar", 8) for ("/foo/bar/b~1z/qux", 5, +// etc). It returns a 0 size_t when s has invalid JSON Pointer syntax or i is +// out of bounds. +// +// The string returned is unescaped. If calling it again, this time with i=8, +// the "b~1z" substring would be returned as "b/z". +std::pair // +DecodeJson_SplitJsonPointer(std::string& s, + size_t i, + bool allow_tilde_n_tilde_r_tilde_t) { + std::string fragment; + if (i > s.size()) { + return std::make_pair(std::string(), 0); + } + while (i < s.size()) { + char c = s[i]; + if (c == '/') { + break; + } else if (c != '~') { + fragment.push_back(c); + i++; + continue; + } + i++; + if (i >= s.size()) { + return std::make_pair(std::string(), 0); + } + c = s[i]; + if (c == '0') { + fragment.push_back('~'); + i++; + continue; + } else if (c == '1') { + fragment.push_back('/'); + i++; + continue; + } else if (allow_tilde_n_tilde_r_tilde_t) { + if (c == 'n') { + fragment.push_back('\n'); + i++; + continue; + } else if (c == 'r') { + fragment.push_back('\r'); + i++; + continue; + } else if (c == 't') { + fragment.push_back('\t'); + i++; + continue; + } + } + return std::make_pair(std::string(), 0); + } + return std::make_pair(std::move(fragment), i); +} + +// -------- + +std::string // +DecodeJson_WalkJsonPointerFragment(wuffs_base__token_buffer& tok_buf, + wuffs_base__status& tok_status, + wuffs_json__decoder::unique_ptr& dec, + wuffs_base__io_buffer* io_buf, + std::string& io_error_message, + size_t& cursor_index, + sync_io::Input& input, + std::string& json_pointer_fragment) { + std::string ret_error_message; + while (true) { + WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN; + + int64_t vbc = token.value_base_category(); + uint64_t vbd = token.value_base_detail(); + if (vbc == WUFFS_BASE__TOKEN__VBC__FILLER) { + continue; + } else if ((vbc != WUFFS_BASE__TOKEN__VBC__STRUCTURE) || + !(vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH)) { + return DecodeJson_NoMatch; + } else if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST) { + goto do_list; + } + goto do_dict; + } + +do_dict: + // Alternate between these two things: + // 1. Decode the next dict key (a string). If it matches the fragment, we're + // done (success). If we've reached the dict's end (VBD__STRUCTURE__POP) + // so that there was no next dict key, we're done (failure). + // 2. Otherwise, skip the next dict value. + while (true) { + for (std::string str; true;) { + WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN; + + int64_t vbc = token.value_base_category(); + uint64_t vbd = token.value_base_detail(); + switch (vbc) { + case WUFFS_BASE__TOKEN__VBC__FILLER: + continue; + + case WUFFS_BASE__TOKEN__VBC__STRUCTURE: + if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) { + goto fail; + } + return DecodeJson_NoMatch; + + case WUFFS_BASE__TOKEN__VBC__STRING: { + if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) { + // No-op. + } else if (vbd & + WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) { + const char* ptr = // Convert from (uint8_t*). + static_cast(static_cast(token_ptr)); + str.append(ptr, static_cast(token_len)); + } else { + goto fail; + } + break; + } + + case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: { + uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL]; + size_t n = wuffs_base__utf_8__encode( + wuffs_base__make_slice_u8( + &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL), + static_cast(vbd)); + const char* ptr = // Convert from (uint8_t*). + static_cast(static_cast(&u[0])); + str.append(ptr, n); + break; + } + + default: + goto fail; + } + + if (token.continued()) { + continue; + } + if (str == json_pointer_fragment) { + return ""; + } + goto skip_the_next_dict_value; + } + + skip_the_next_dict_value: + for (uint32_t skip_depth = 0; true;) { + WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN; + + int64_t vbc = token.value_base_category(); + uint64_t vbd = token.value_base_detail(); + if (token.continued() || (vbc == WUFFS_BASE__TOKEN__VBC__FILLER)) { + continue; + } else if (vbc == WUFFS_BASE__TOKEN__VBC__STRUCTURE) { + if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) { + skip_depth++; + continue; + } + skip_depth--; + } + + if (skip_depth == 0) { + break; + } + } // skip_the_next_dict_value + } // do_dict + +do_list: + do { + wuffs_base__result_u64 result_u64 = wuffs_base__parse_number_u64( + wuffs_base__make_slice_u8( + static_cast(static_cast( + const_cast(json_pointer_fragment.data()))), + json_pointer_fragment.size()), + WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS); + if (!result_u64.status.is_ok()) { + return DecodeJson_NoMatch; + } + uint64_t remaining = result_u64.value; + if (remaining == 0) { + goto check_that_a_value_follows; + } + for (uint32_t skip_depth = 0; true;) { + WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN; + + int64_t vbc = token.value_base_category(); + uint64_t vbd = token.value_base_detail(); + if (token.continued() || (vbc == WUFFS_BASE__TOKEN__VBC__FILLER)) { + continue; + } else if (vbc == WUFFS_BASE__TOKEN__VBC__STRUCTURE) { + if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) { + skip_depth++; + continue; + } + if (skip_depth == 0) { + return DecodeJson_NoMatch; + } + skip_depth--; + } + + if (skip_depth > 0) { + continue; + } + remaining--; + if (remaining == 0) { + goto check_that_a_value_follows; + } + } + } while (false); // do_list + +check_that_a_value_follows: + while (true) { + WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN; + + int64_t vbc = token.value_base_category(); + uint64_t vbd = token.value_base_detail(); + if (vbc == WUFFS_BASE__TOKEN__VBC__FILLER) { + continue; + } + + // Undo the last part of WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN, so + // that we're only peeking at the next token. + tok_buf.meta.ri--; + cursor_index -= static_cast(token_len); + + if ((vbc == WUFFS_BASE__TOKEN__VBC__STRUCTURE) && + (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP)) { + return DecodeJson_NoMatch; + } + return ""; + } // check_that_a_value_follows + +fail: + return "wuffs_aux::DecodeJson: internal error: unexpected token"; +done: + return ret_error_message; +} + +} // namespace + +// -------- + +DecodeJsonResult // +DecodeJson(DecodeJsonCallbacks& callbacks, + sync_io::Input& input, + DecodeJsonArgQuirks quirks, + DecodeJsonArgJsonPointer json_pointer) { + // Prepare the wuffs_base__io_buffer and the resultant error_message. + wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer(); + wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer(); + std::unique_ptr fallback_io_array(nullptr); + if (!io_buf) { + fallback_io_array = std::unique_ptr(new uint8_t[4096]); + fallback_io_buf = wuffs_base__ptr_u8__writer(fallback_io_array.get(), 4096); + io_buf = &fallback_io_buf; + } + // cursor_index is discussed at + // https://nigeltao.github.io/blog/2020/jsonptr.html#the-cursor-index + size_t cursor_index = 0; + std::string ret_error_message; + std::string io_error_message; + + do { + // Prepare the low-level JSON decoder. + wuffs_json__decoder::unique_ptr dec = wuffs_json__decoder::alloc(); + if (!dec) { + ret_error_message = "wuffs_aux::DecodeJson: out of memory"; + goto done; + } else if (WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) { + ret_error_message = + "wuffs_aux::DecodeJson: internal error: bad WORKBUF_LEN"; + goto done; + } + bool allow_tilde_n_tilde_r_tilde_t = false; + for (size_t i = 0; i < quirks.repr.len; i++) { + dec->set_quirk_enabled(quirks.repr.ptr[i], true); + if (quirks.repr.ptr[i] == + WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T) { + allow_tilde_n_tilde_r_tilde_t = true; + } + } + + // Prepare the wuffs_base__tok_buffer. 256 tokens is 2KiB. + wuffs_base__token tok_array[256]; + wuffs_base__token_buffer tok_buf = + wuffs_base__slice_token__writer(wuffs_base__make_slice_token( + &tok_array[0], (sizeof(tok_array) / sizeof(tok_array[0])))); + wuffs_base__status tok_status = + dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8()); + + // Prepare other state. + int32_t depth = 0; + std::string str; + + // Walk the (optional) JSON Pointer. + for (size_t i = 0; i < json_pointer.repr.size();) { + if (json_pointer.repr[i] != '/') { + ret_error_message = DecodeJson_BadJsonPointer; + goto done; + } + std::pair split = DecodeJson_SplitJsonPointer( + json_pointer.repr, i + 1, allow_tilde_n_tilde_r_tilde_t); + i = split.second; + if (i == 0) { + ret_error_message = DecodeJson_BadJsonPointer; + goto done; + } + ret_error_message = DecodeJson_WalkJsonPointerFragment( + tok_buf, tok_status, dec, io_buf, io_error_message, cursor_index, + input, split.first); + if (!ret_error_message.empty()) { + goto done; + } + } + + // Loop, doing these two things: + // 1. Get the next token. + // 2. Process that token. + while (true) { + WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN; + + int64_t vbc = token.value_base_category(); + uint64_t vbd = token.value_base_detail(); + switch (vbc) { + case WUFFS_BASE__TOKEN__VBC__FILLER: + continue; + + case WUFFS_BASE__TOKEN__VBC__STRUCTURE: { + if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) { + ret_error_message = callbacks.Push(static_cast(vbd)); + if (!ret_error_message.empty()) { + goto done; + } + depth++; + if (depth > WUFFS_JSON__DECODER_DEPTH_MAX_INCL) { + ret_error_message = + "wuffs_aux::DecodeJson: internal error: bad depth"; + goto done; + } + continue; + } + ret_error_message = callbacks.Pop(static_cast(vbd)); + depth--; + if (depth < 0) { + ret_error_message = + "wuffs_aux::DecodeJson: internal error: bad depth"; + goto done; + } + goto parsed_a_value; + } + + case WUFFS_BASE__TOKEN__VBC__STRING: { + if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) { + // No-op. + } else if (vbd & + WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) { + const char* ptr = // Convert from (uint8_t*). + static_cast(static_cast(token_ptr)); + str.append(ptr, static_cast(token_len)); + } else { + goto fail; + } + if (token.continued()) { + continue; + } + ret_error_message = callbacks.AppendTextString(std::move(str)); + str.clear(); + goto parsed_a_value; + } + + case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: { + uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL]; + size_t n = wuffs_base__utf_8__encode( + wuffs_base__make_slice_u8( + &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL), + static_cast(vbd)); + const char* ptr = // Convert from (uint8_t*). + static_cast(static_cast(&u[0])); + str.append(ptr, n); + if (token.continued()) { + continue; + } + goto fail; + } + + case WUFFS_BASE__TOKEN__VBC__LITERAL: { + ret_error_message = + (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__NULL) + ? callbacks.AppendNull() + : callbacks.AppendBool(vbd & + WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE); + goto parsed_a_value; + } + + case WUFFS_BASE__TOKEN__VBC__NUMBER: { + if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT) { + if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED) { + wuffs_base__result_i64 r = wuffs_base__parse_number_i64( + wuffs_base__make_slice_u8(token_ptr, + static_cast(token_len)), + WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS); + if (r.status.is_ok()) { + ret_error_message = callbacks.AppendI64(r.value); + goto parsed_a_value; + } + } + if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT) { + wuffs_base__result_f64 r = wuffs_base__parse_number_f64( + wuffs_base__make_slice_u8(token_ptr, + static_cast(token_len)), + WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS); + if (r.status.is_ok()) { + ret_error_message = callbacks.AppendF64(r.value); + goto parsed_a_value; + } + } + } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF) { + ret_error_message = callbacks.AppendF64( + wuffs_base__ieee_754_bit_representation__from_u64_to_f64( + 0xFFF0000000000000ul)); + goto parsed_a_value; + } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_INF) { + ret_error_message = callbacks.AppendF64( + wuffs_base__ieee_754_bit_representation__from_u64_to_f64( + 0x7FF0000000000000ul)); + goto parsed_a_value; + } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_NAN) { + ret_error_message = callbacks.AppendF64( + wuffs_base__ieee_754_bit_representation__from_u64_to_f64( + 0xFFFFFFFFFFFFFFFFul)); + goto parsed_a_value; + } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_NAN) { + ret_error_message = callbacks.AppendF64( + wuffs_base__ieee_754_bit_representation__from_u64_to_f64( + 0x7FFFFFFFFFFFFFFFul)); + goto parsed_a_value; + } + goto fail; + } + } + + fail: + ret_error_message = + "wuffs_aux::DecodeJson: internal error: unexpected token"; + goto done; + + parsed_a_value: + // If an error was encountered, we are done. Otherwise, (depth == 0) + // after parsing a value is equivalent to having decoded the entire JSON + // value (for an empty json_pointer query) or having decoded the + // pointed-to JSON value (for a non-empty json_pointer query). In the + // latter case, we are also done. + // + // However, if quirks like WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER or + // WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF are passed, decoding + // the entire JSON value should also consume any trailing filler, in case + // the DecodeJson caller wants to subsequently check that the input is + // completely exhausted (and otherwise raise "valid JSON followed by + // further (unexpected) data"). We aren't done yet. Instead, keep the + // loop running until WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN's + // decode_tokens returns an ok status. + if (!ret_error_message.empty() || + ((depth == 0) && !json_pointer.repr.empty())) { + goto done; + } + } + } while (false); + +done: + DecodeJsonResult result( + std::move(ret_error_message), + wuffs_base__u64__sat_add(io_buf->meta.pos, cursor_index)); + callbacks.Done(result, input, *io_buf); + return result; +} + +#undef WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN + +} // namespace wuffs_aux + +#endif // !defined(WUFFS_CONFIG__MODULES) || + // defined(WUFFS_CONFIG__MODULE__AUX__JSON) + +#endif // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +#endif // WUFFS_IMPLEMENTATION + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#elif defined(__clang__) +#pragma clang diagnostic pop +#endif + +#endif // WUFFS_INCLUDE_GUARD diff --git a/ktx/external/astc-encoder/Test/Data/HDR-A-1x1.astc b/ktx/external/astc-encoder/Test/Data/HDR-A-1x1.astc new file mode 100644 index 0000000..57d5e89 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/HDR-A-1x1.astc differ diff --git a/ktx/external/astc-encoder/Test/Data/HDR-A-1x1.exr b/ktx/external/astc-encoder/Test/Data/HDR-A-1x1.exr new file mode 100644 index 0000000..f438b36 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/HDR-A-1x1.exr differ diff --git a/ktx/external/astc-encoder/Test/Data/LDR-A-1x1.astc b/ktx/external/astc-encoder/Test/Data/LDR-A-1x1.astc new file mode 100644 index 0000000..2786ded Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/LDR-A-1x1.astc differ diff --git a/ktx/external/astc-encoder/Test/Data/LDR-A-1x1.png b/ktx/external/astc-encoder/Test/Data/LDR-A-1x1.png new file mode 100644 index 0000000..e1cce2c Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/LDR-A-1x1.png differ diff --git a/ktx/external/astc-encoder/Test/Data/LDRS-A-1x1.astc b/ktx/external/astc-encoder/Test/Data/LDRS-A-1x1.astc new file mode 100644 index 0000000..20e9307 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/LDRS-A-1x1.astc differ diff --git a/ktx/external/astc-encoder/Test/Data/LDRS-A-1x1.png b/ktx/external/astc-encoder/Test/Data/LDRS-A-1x1.png new file mode 100644 index 0000000..36b1403 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/LDRS-A-1x1.png differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/hdr-complex.exr b/ktx/external/astc-encoder/Test/Data/Tiles/hdr-complex.exr new file mode 100644 index 0000000..4eaf761 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/hdr-complex.exr differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/hdr.astc b/ktx/external/astc-encoder/Test/Data/Tiles/hdr.astc new file mode 100644 index 0000000..aa21576 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/hdr.astc differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/hdr.exr b/ktx/external/astc-encoder/Test/Data/Tiles/hdr.exr new file mode 100644 index 0000000..e0ac6a6 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/hdr.exr differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/hdr.hdr b/ktx/external/astc-encoder/Test/Data/Tiles/hdr.hdr new file mode 100644 index 0000000..abf4097 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/hdr.hdr differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/ldr-complex.png b/ktx/external/astc-encoder/Test/Data/Tiles/ldr-complex.png new file mode 100644 index 0000000..dcc6b00 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/ldr-complex.png differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/ldr.astc b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.astc new file mode 100644 index 0000000..ab78578 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.astc differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/ldr.bmp b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.bmp new file mode 100644 index 0000000..f3371a5 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.bmp differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/ldr.dds b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.dds new file mode 100644 index 0000000..2ea2e19 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.dds differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/ldr.jpg b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.jpg new file mode 100644 index 0000000..dc5afe9 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.jpg differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/ldr.ktx b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.ktx new file mode 100644 index 0000000..baf566d Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.ktx differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/ldr.png b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.png new file mode 100644 index 0000000..d759b56 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.png differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/ldr.tga b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.tga new file mode 100644 index 0000000..d2025a5 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/ldr.tga differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/ldr_0.png b/ktx/external/astc-encoder/Test/Data/Tiles/ldr_0.png new file mode 100644 index 0000000..d759b56 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/ldr_0.png differ diff --git a/ktx/external/astc-encoder/Test/Data/Tiles/ldr_1.png b/ktx/external/astc-encoder/Test/Data/Tiles/ldr_1.png new file mode 100644 index 0000000..d759b56 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Data/Tiles/ldr_1.png differ diff --git a/ktx/external/astc-encoder/Test/Data/empty.unk b/ktx/external/astc-encoder/Test/Data/empty.unk new file mode 100644 index 0000000..e69de29 diff --git a/ktx/external/astc-encoder/Test/DocSource/astc_image_info.rst b/ktx/external/astc-encoder/Test/DocSource/astc_image_info.rst new file mode 100644 index 0000000..7417322 --- /dev/null +++ b/ktx/external/astc-encoder/Test/DocSource/astc_image_info.rst @@ -0,0 +1,8 @@ +astc_image_info +=============== + +.. automodule:: astc_image_info + :members: + :undoc-members: + :inherited-members: + :show-inheritance: diff --git a/ktx/external/astc-encoder/Test/DocSource/astc_size_binary.rst b/ktx/external/astc-encoder/Test/DocSource/astc_size_binary.rst new file mode 100644 index 0000000..852dbbc --- /dev/null +++ b/ktx/external/astc-encoder/Test/DocSource/astc_size_binary.rst @@ -0,0 +1,8 @@ +astc_size_binary +================ + +.. automodule:: astc_size_binary + :members: + :undoc-members: + :inherited-members: + :show-inheritance: diff --git a/ktx/external/astc-encoder/Test/DocSource/astc_test_functional.rst b/ktx/external/astc-encoder/Test/DocSource/astc_test_functional.rst new file mode 100644 index 0000000..1055a31 --- /dev/null +++ b/ktx/external/astc-encoder/Test/DocSource/astc_test_functional.rst @@ -0,0 +1,8 @@ +astc_test_functional +==================== + +.. automodule:: astc_test_functional + :members: + :undoc-members: + :inherited-members: + :show-inheritance: diff --git a/ktx/external/astc-encoder/Test/DocSource/astc_test_image.rst b/ktx/external/astc-encoder/Test/DocSource/astc_test_image.rst new file mode 100644 index 0000000..25ba580 --- /dev/null +++ b/ktx/external/astc-encoder/Test/DocSource/astc_test_image.rst @@ -0,0 +1,8 @@ +astc_test_image +=============== + +.. automodule:: astc_test_image + :members: + :undoc-members: + :inherited-members: + :show-inheritance: diff --git a/ktx/external/astc-encoder/Test/DocSource/astc_test_image_dl.rst b/ktx/external/astc-encoder/Test/DocSource/astc_test_image_dl.rst new file mode 100644 index 0000000..8054105 --- /dev/null +++ b/ktx/external/astc-encoder/Test/DocSource/astc_test_image_dl.rst @@ -0,0 +1,8 @@ +astc_test_image_dl +================== + +.. automodule:: astc_test_image_dl + :members: + :undoc-members: + :inherited-members: + :show-inheritance: diff --git a/ktx/external/astc-encoder/Test/DocSource/conf.py b/ktx/external/astc-encoder/Test/DocSource/conf.py new file mode 100644 index 0000000..74d0b4e --- /dev/null +++ b/ktx/external/astc-encoder/Test/DocSource/conf.py @@ -0,0 +1,56 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.insert(0, os.path.abspath('../')) +sys.path.insert(0, os.path.abspath('../testlib')) + + +# -- Project information ----------------------------------------------------- + +project = 'astcenc' +copyright = '2020, Arm Limited' +author = 'Arm Limited' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.napoleon', + 'sphinx.ext.coverage' +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'classic' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] diff --git a/ktx/external/astc-encoder/Test/DocSource/index.rst b/ktx/external/astc-encoder/Test/DocSource/index.rst new file mode 100644 index 0000000..4fad396 --- /dev/null +++ b/ktx/external/astc-encoder/Test/DocSource/index.rst @@ -0,0 +1,18 @@ +Welcome to astcenc's documentation! +=================================== + +.. toctree:: + :maxdepth: 2 + :glob: + + + astc_* + testlib-* + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/ktx/external/astc-encoder/Test/DocSource/testlib-encoder.rst b/ktx/external/astc-encoder/Test/DocSource/testlib-encoder.rst new file mode 100644 index 0000000..b033bdf --- /dev/null +++ b/ktx/external/astc-encoder/Test/DocSource/testlib-encoder.rst @@ -0,0 +1,8 @@ +testlib.encoder +=============== + +.. automodule:: testlib.encoder + :members: + :undoc-members: + :inherited-members: + :show-inheritance: diff --git a/ktx/external/astc-encoder/Test/DocSource/testlib-image.rst b/ktx/external/astc-encoder/Test/DocSource/testlib-image.rst new file mode 100644 index 0000000..00250be --- /dev/null +++ b/ktx/external/astc-encoder/Test/DocSource/testlib-image.rst @@ -0,0 +1,8 @@ +testlib.image +============= + +.. automodule:: testlib.image + :members: + :undoc-members: + :inherited-members: + :show-inheritance: diff --git a/ktx/external/astc-encoder/Test/DocSource/testlib-misc.rst b/ktx/external/astc-encoder/Test/DocSource/testlib-misc.rst new file mode 100644 index 0000000..2d1b8b6 --- /dev/null +++ b/ktx/external/astc-encoder/Test/DocSource/testlib-misc.rst @@ -0,0 +1,8 @@ +testlib.misc +============ + +.. automodule:: testlib.misc + :members: + :undoc-members: + :inherited-members: + :show-inheritance: diff --git a/ktx/external/astc-encoder/Test/DocSource/testlib-resultset.rst b/ktx/external/astc-encoder/Test/DocSource/testlib-resultset.rst new file mode 100644 index 0000000..05cf865 --- /dev/null +++ b/ktx/external/astc-encoder/Test/DocSource/testlib-resultset.rst @@ -0,0 +1,8 @@ +testlib.resultset +================= + +.. automodule:: testlib.resultset + :members: + :undoc-members: + :inherited-members: + :show-inheritance: diff --git a/ktx/external/astc-encoder/Test/DocSource/testlib-testset.rst b/ktx/external/astc-encoder/Test/DocSource/testlib-testset.rst new file mode 100644 index 0000000..c13f699 --- /dev/null +++ b/ktx/external/astc-encoder/Test/DocSource/testlib-testset.rst @@ -0,0 +1,8 @@ +testlib.testset +=============== + +.. automodule:: testlib.testset + :members: + :undoc-members: + :inherited-members: + :show-inheritance: diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-arboretum.exr b/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-arboretum.exr new file mode 100644 index 0000000..fc7c849 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-arboretum.exr differ diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-arboretum.hdr b/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-arboretum.hdr new file mode 100644 index 0000000..7b12975 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-arboretum.hdr differ diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-bellparkpier.hdr b/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-bellparkpier.hdr new file mode 100644 index 0000000..b0945b6 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-bellparkpier.hdr differ diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-canarywharf.hdr b/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-canarywharf.hdr new file mode 100644 index 0000000..c799348 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-canarywharf.hdr differ diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-eveningroad.hdr b/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-eveningroad.hdr new file mode 100644 index 0000000..b2c6d2c Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-eveningroad.hdr differ diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-riverwalk.hdr b/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-riverwalk.hdr new file mode 100644 index 0000000..d828f78 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/HDRIHaven/HDR-RGB/hdr-rgb-riverwalk.hdr differ diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/LICENSE.txt b/ktx/external/astc-encoder/Test/Images/HDRIHaven/LICENSE.txt new file mode 100644 index 0000000..b31b413 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/LICENSE.txt @@ -0,0 +1,126 @@ +Images in this test directory are extracts of images from HDRIHaven, and are +licensed under the CC0 license. + +* Source: https://hdrihaven.com/ + +------------------------------------------------------------------------------- + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-1.7_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-1.7_fast_results.csv new file mode 100644 index 0000000..64ca1ba --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-1.7_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,44.9180,5.8811,1.9828,0.2975 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.4078,5.8348,1.9498,0.3025 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.7918,6.0551,2.1805,0.2705 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.6266,6.0875,2.2156,0.2662 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,33.0154,6.3407,2.4463,0.2411 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.1086,6.0821,2.1912,0.2692 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.6123,6.0296,2.1561,0.2736 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.1412,6.1852,2.3091,0.2554 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.8086,6.2638,2.3913,0.2466 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.4331,6.1691,2.2755,0.2592 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.6372,6.9400,3.0490,0.1934 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.7644,6.8936,3.0175,0.1955 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4682,7.0723,3.1995,0.1844 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.5171,7.1083,3.2346,0.1823 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.2958,6.8755,2.9831,0.1977 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.3118,7.0048,3.1148,0.1894 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.9545,6.9463,3.0662,0.1924 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1398,7.0775,3.2096,0.1838 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.4621,7.2125,3.3267,0.1773 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.5279,6.8306,2.9303,0.2013 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.8786,6.4897,2.5823,0.2284 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.7873,6.5407,2.6612,0.2216 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,35.9732,6.4638,2.5017,0.2358 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6707,6.7646,2.8962,0.2037 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.8074,6.4054,2.5167,0.2344 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-1.7_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-1.7_fastest_results.csv new file mode 100644 index 0000000..d412b42 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-1.7_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,44.9180,5.8029,1.8800,0.3137 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.4078,5.8311,1.9505,0.3024 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.7918,6.0639,2.1838,0.2701 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.6266,6.0948,2.2202,0.2657 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,33.0154,6.3051,2.4217,0.2436 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.1086,6.0691,2.1839,0.2701 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.6123,6.0237,2.1452,0.2750 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.1412,6.1658,2.2883,0.2578 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.8086,6.2984,2.4117,0.2446 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.4331,6.1638,2.2657,0.2603 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.6372,6.9349,3.0463,0.1936 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.7644,6.8755,3.0020,0.1965 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4682,7.0570,3.1885,0.1850 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.5171,7.1030,3.2326,0.1825 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.2958,6.8688,2.9736,0.1984 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.3118,6.9654,3.0713,0.1920 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.9545,6.9124,3.0439,0.1938 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1398,7.0831,3.2156,0.1834 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.4621,7.1763,3.3035,0.1785 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.5279,6.8076,2.9083,0.2028 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.8786,6.4984,2.5800,0.2286 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.7873,6.4889,2.6166,0.2254 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,35.9732,6.4854,2.6159,0.2255 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6707,6.7706,2.8977,0.2036 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.8074,6.4244,2.5184,0.2342 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-1.7_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-1.7_medium_results.csv new file mode 100644 index 0000000..7de33dc --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-1.7_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.3349,9.1397,5.2529,0.1123 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9091,8.7914,4.9232,0.1198 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.4137,9.3508,5.4810,0.1076 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.1518,8.8777,5.0168,0.1176 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,33.5597,10.4345,6.5494,0.0901 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3003,9.7496,5.8678,0.1005 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.1834,9.6431,5.7828,0.1020 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.8774,10.3255,6.4581,0.0913 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1054,9.7900,5.9253,0.0995 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.7231,10.7202,6.8248,0.0864 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.7393,10.1339,6.2486,0.0944 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.2842,9.4997,5.6309,0.1047 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.1029,10.4579,6.6019,0.0893 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7407,9.9920,6.1344,0.0962 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.4348,10.2550,6.3683,0.0926 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.4550,10.2479,6.3586,0.0928 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5185,9.4533,5.5893,0.1055 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.6229,10.5221,6.6537,0.0886 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6194,10.0716,6.1786,0.0955 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.5860,9.8313,5.9397,0.0993 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.9511,9.0998,5.2039,0.1133 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1868,8.5205,4.6440,0.1270 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.2438,9.0871,5.2155,0.1131 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7817,9.0531,5.1928,0.1136 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.8360,8.5454,4.6543,0.1267 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-1.7_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-1.7_thorough_results.csv new file mode 100644 index 0000000..b23e7c0 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-1.7_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.5140,14.8456,10.9583,0.0538 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.2721,14.3502,10.4806,0.0563 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.9463,14.4174,10.5371,0.0560 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.3727,13.0638,9.1945,0.0641 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,33.6846,15.4515,11.5674,0.0510 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3511,16.7248,12.8406,0.0459 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.4510,16.0741,12.2115,0.0483 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.3185,16.0478,12.1785,0.0484 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.2336,14.4657,10.6063,0.0556 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.7403,16.3106,12.4298,0.0475 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.7730,17.5702,13.6863,0.0431 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.5136,16.7994,12.9217,0.0456 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.4492,16.9512,13.0780,0.0451 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8268,15.3719,11.5087,0.0513 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.4335,16.7375,12.8470,0.0459 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.4896,17.8624,13.9829,0.0422 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.6657,16.7230,12.8603,0.0459 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.8672,17.3022,13.4270,0.0439 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7092,15.8839,11.9999,0.0492 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.6076,16.9198,13.0211,0.0453 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.9765,15.7640,11.8768,0.0497 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3461,14.8261,10.9476,0.0539 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3645,15.6118,11.7408,0.0502 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8402,14.4685,10.5872,0.0557 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.8490,15.9317,12.0367,0.0490 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-avx2_fast_results.csv new file mode 100644 index 0000000..7c21847 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-avx2_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,44.8641,1.0664,0.2375,2.4837 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2940,1.0545,0.2290,2.5754 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.7014,1.0931,0.2629,2.2432 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.5768,1.0552,0.2300,2.5640 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,32.9879,1.1289,0.3031,1.9459 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.0456,1.0789,0.2487,2.3716 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4355,1.0703,0.2432,2.4252 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0572,1.0920,0.2649,2.2270 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.8088,1.0724,0.2457,2.4003 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.4066,1.0862,0.2579,2.2871 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.5215,1.1578,0.3246,1.8173 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.5662,1.1486,0.3208,1.8388 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.2873,1.1655,0.3363,1.7539 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.4187,1.1509,0.3228,1.8270 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.2187,1.1488,0.3172,1.8594 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.1626,1.2047,0.3690,1.5984 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.7346,1.2040,0.3681,1.6022 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,38.9610,1.2135,0.3770,1.5646 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3431,1.1979,0.3678,1.6036 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.4418,1.1950,0.3587,1.6443 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.7796,1.2235,0.3802,1.5513 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.5270,1.2216,0.3792,1.5553 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,35.8715,1.2182,0.3767,1.5659 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.5649,1.2208,0.3781,1.5600 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.7569,1.2191,0.3744,1.5754 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-avx2_fastest_results.csv new file mode 100644 index 0000000..dcb204e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-avx2_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,43.9510,0.9969,0.1681,3.5083 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,54.2358,0.9745,0.1475,3.9975 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,46.9226,0.9879,0.1628,3.6223 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,50.2785,0.9715,0.1472,4.0081 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,31.1675,1.0167,0.1871,3.1519 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,40.7288,0.9702,0.1420,4.1546 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,50.5000,0.9702,0.1425,4.1380 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,44.3517,0.9798,0.1527,3.8623 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.2901,0.9653,0.1395,4.2276 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.0376,0.9679,0.1386,4.2570 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.1105,0.9922,0.1615,3.6520 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,47.9067,0.9905,0.1621,3.6377 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,41.7376,1.0005,0.1713,3.4441 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,45.9474,0.9903,0.1652,3.5698 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.0148,0.9893,0.1594,3.7009 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,32.9261,1.0702,0.2354,2.5052 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.0581,1.0647,0.2344,2.5162 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,38.4293,1.0710,0.2384,2.4736 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.0021,1.0669,0.2342,2.5183 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.2851,1.0639,0.2299,2.5654 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.6014,1.0728,0.2347,2.5135 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,39.8785,1.0740,0.2361,2.4978 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,35.4959,1.0720,0.2347,2.5128 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.2873,1.0722,0.2352,2.5082 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.6381,1.0728,0.2337,2.5238 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-avx2_medium_results.csv new file mode 100644 index 0000000..0393c04 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-avx2_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2330,1.3897,0.5601,1.0532 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.7938,1.3379,0.5130,1.1499 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.2636,1.4089,0.5813,1.0147 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.0439,1.3550,0.5320,1.1086 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,33.4389,1.5139,0.6886,0.8565 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.2272,1.4174,0.5891,1.0012 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.9807,1.4227,0.5912,0.9976 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.6837,1.4705,0.6425,0.9180 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.0703,1.4115,0.5811,1.0150 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.6278,1.4667,0.6389,0.9231 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.6053,1.4480,0.6154,0.9584 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.0611,1.4129,0.5857,1.0071 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.8915,1.4958,0.6642,0.8880 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.6271,1.4353,0.6087,0.9689 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.3221,1.4489,0.6190,0.9528 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.2786,1.4643,0.6285,0.9385 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.2097,1.4512,0.6105,0.9661 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.3740,1.5356,0.7021,0.8401 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.4717,1.4843,0.6497,0.9078 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.4793,1.4511,0.6164,0.9569 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.8289,1.4665,0.6223,0.9478 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.8853,1.4583,0.6132,0.9620 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.1041,1.4969,0.6494,0.9083 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6632,1.4756,0.6310,0.9348 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.7728,1.4520,0.6065,0.9724 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-avx2_thorough_results.csv new file mode 100644 index 0000000..66e2bf1 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-avx2_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.4529,2.2529,1.4239,0.4142 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.1699,2.2152,1.3878,0.4250 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.8273,2.1921,1.3627,0.4328 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.3345,2.1353,1.3078,0.4510 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,33.5777,2.2895,1.4626,0.4033 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3180,2.3332,1.5003,0.3931 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.3374,2.3070,1.4727,0.4005 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.1877,2.2880,1.4508,0.4066 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.2422,2.2198,1.3918,0.4238 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.7302,2.2482,1.4182,0.4159 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.6886,2.3882,1.5598,0.3781 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3881,2.3398,1.5135,0.3897 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.3441,2.3352,1.5065,0.3915 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7722,2.2802,1.4497,0.4069 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.3867,2.2595,1.4251,0.4139 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.3849,2.4530,1.6161,0.3650 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.4758,2.4316,1.5956,0.3697 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7275,2.4460,1.6107,0.3662 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6272,2.4225,1.5875,0.3715 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.5403,2.3397,1.5035,0.3923 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.9092,2.3489,1.4992,0.3934 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1237,2.2552,1.4091,0.4186 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.2620,2.3167,1.4666,0.4022 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7762,2.3341,1.4849,0.3972 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.8048,2.3270,1.4808,0.3983 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse2_fast_results.csv new file mode 100644 index 0000000..cc8cb89 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse2_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,44.8641,1.1959,0.3066,1.9240 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2940,1.1808,0.2945,2.0030 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.7014,1.2297,0.3416,1.7268 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.5768,1.1843,0.2970,1.9860 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,32.9879,1.2742,0.3883,1.5189 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.0456,1.2293,0.3378,1.7460 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4355,1.2173,0.3299,1.7878 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0572,1.2455,0.3585,1.6452 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.8088,1.2195,0.3315,1.7790 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.4066,1.2392,0.3491,1.6897 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.5215,1.3376,0.4467,1.3203 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.5662,1.3290,0.4391,1.3432 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.2873,1.3502,0.4631,1.2737 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.4187,1.3338,0.4437,1.3292 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.2187,1.3241,0.4359,1.3530 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.1626,1.4195,0.5238,1.1261 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.7346,1.4152,0.5196,1.1351 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,38.9610,1.4259,0.5299,1.1130 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3431,1.4144,0.5200,1.1343 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.4418,1.4018,0.5057,1.1664 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.7796,1.4361,0.5337,1.1052 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.5270,1.4360,0.5326,1.1074 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,35.8715,1.4337,0.5307,1.1113 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.5649,1.4356,0.5311,1.1107 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.7569,1.4311,0.5260,1.1212 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse2_fastest_results.csv new file mode 100644 index 0000000..f9f8915 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse2_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,43.9510,1.1077,0.2199,2.6822 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,54.2358,1.0823,0.1961,3.0079 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,46.9226,1.1019,0.2148,2.7459 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,50.2785,1.0792,0.1943,3.0357 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,31.1675,1.1333,0.2458,2.3997 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,40.7288,1.0656,0.1758,3.3555 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,50.5000,1.0671,0.1798,3.2803 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,44.3517,1.0816,0.1913,3.0832 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.2901,1.0602,0.1730,3.4095 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.0376,1.0610,0.1730,3.4086 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.1105,1.0929,0.2079,2.8374 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,47.9067,1.0953,0.2086,2.8281 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,41.7376,1.1081,0.2203,2.6769 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,45.9474,1.1000,0.2129,2.7707 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.0148,1.0923,0.2041,2.8892 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,32.9261,1.2165,0.3225,1.8291 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.0581,1.2112,0.3210,1.8375 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,38.4293,1.2194,0.3275,1.8010 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.0021,1.2124,0.3197,1.8451 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.2851,1.2075,0.3142,1.8770 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.6014,1.2206,0.3231,1.8256 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,39.8785,1.2242,0.3252,1.8140 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,35.4959,1.2192,0.3236,1.8228 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.2873,1.2204,0.3232,1.8248 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.6381,1.2184,0.3212,1.8362 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse2_medium_results.csv new file mode 100644 index 0000000..fc4372d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse2_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2330,1.6293,0.7382,0.7990 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.7938,1.5667,0.6807,0.8665 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.2636,1.6573,0.7703,0.7657 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.0439,1.5961,0.7089,0.8321 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,33.4389,1.7913,0.9013,0.6544 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.2272,1.7234,0.8333,0.7078 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.9807,1.7230,0.8313,0.7095 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.6837,1.8014,0.9111,0.6474 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.0703,1.7144,0.8210,0.7184 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.6278,1.7960,0.9027,0.6534 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.6053,1.7664,0.8766,0.6729 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.0611,1.7293,0.8354,0.7060 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.8915,1.8352,0.9411,0.6268 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.6271,1.7620,0.8699,0.6780 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.3221,1.7700,0.8802,0.6701 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.2786,1.8174,0.9155,0.6442 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.2097,1.7894,0.8858,0.6658 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.3740,1.9260,1.0249,0.5755 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.4717,1.8441,0.9485,0.6219 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.4793,1.7941,0.8985,0.6565 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.8289,1.8018,0.8939,0.6599 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.8853,1.7854,0.8782,0.6716 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.1041,1.8406,0.9333,0.6320 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6632,1.8090,0.9004,0.6551 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.7728,1.7769,0.8703,0.6777 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse2_thorough_results.csv new file mode 100644 index 0000000..23384ec --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse2_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.4529,2.6970,1.8005,0.3276 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.1699,2.6468,1.7574,0.3356 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.8273,2.6170,1.7265,0.3416 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.3345,2.5460,1.6587,0.3556 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,33.5777,2.7293,1.8399,0.3206 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3180,2.8869,1.9943,0.2958 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.3374,2.8492,1.9599,0.3009 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.1877,2.8315,1.9384,0.3043 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.2422,2.7474,1.8545,0.3181 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.7302,2.7759,1.8849,0.3129 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.6886,3.0119,2.1196,0.2783 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3881,2.9476,2.0580,0.2866 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.3441,2.9327,2.0444,0.2885 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7722,2.8609,1.9716,0.2992 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.3867,2.8393,1.9484,0.3027 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.3849,3.2266,2.3113,0.2552 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.4758,3.1677,2.2752,0.2592 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7275,3.2022,2.3034,0.2561 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6272,3.1699,2.2706,0.2598 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.5403,3.0407,2.1431,0.2752 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.9092,3.0560,2.1485,0.2745 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1237,2.9324,2.0266,0.2910 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.2620,3.0155,2.1060,0.2801 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7762,3.0379,2.1320,0.2767 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.8048,3.0284,2.1208,0.2781 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse4.1_fast_results.csv new file mode 100644 index 0000000..768e3a0 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse4.1_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,44.8641,1.0683,0.2584,2.2828 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2940,1.0533,0.2482,2.3762 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.7014,1.0922,0.2869,2.0562 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.5768,1.0572,0.2509,2.3504 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,32.9879,1.1354,0.3290,1.7925 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.0456,1.0955,0.2840,2.0769 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4355,1.0859,0.2779,2.1228 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0572,1.1076,0.3002,1.9648 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.8088,1.0901,0.2790,2.1140 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.4066,1.1027,0.2927,2.0148 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.5215,1.1912,0.3798,1.5532 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.5662,1.1792,0.3716,1.5872 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.2873,1.2035,0.3942,1.4963 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.4187,1.1865,0.3787,1.5577 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.2187,1.1840,0.3738,1.5780 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.1626,1.2770,0.4624,1.2756 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.7346,1.2753,0.4625,1.2754 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,38.9610,1.2825,0.4690,1.2577 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3431,1.2726,0.4587,1.2860 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.4418,1.2625,0.4458,1.3232 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.7796,1.3151,0.4885,1.2074 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.5270,1.3060,0.4855,1.2149 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,35.8715,1.3042,0.4829,1.2215 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.5649,1.3074,0.4864,1.2125 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.7569,1.3040,0.4819,1.2241 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse4.1_fastest_results.csv new file mode 100644 index 0000000..0f1d93d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse4.1_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,43.9510,0.9884,0.1806,3.2660 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,54.2358,0.9650,0.1610,3.6632 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,46.9226,0.9839,0.1763,3.3463 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,50.2785,0.9664,0.1608,3.6687 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,31.1675,1.0087,0.2024,2.9138 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,40.7288,0.9582,0.1474,4.0009 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,50.5000,0.9564,0.1505,3.9198 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,44.3517,0.9707,0.1605,3.6743 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.2901,0.9534,0.1465,4.0254 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.0376,0.9542,0.1454,4.0567 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.1105,0.9859,0.1781,3.3116 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,47.9067,0.9852,0.1790,3.2949 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,41.7376,0.9966,0.1888,3.1245 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,45.9474,0.9885,0.1822,3.2377 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.0148,0.9835,0.1760,3.3507 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,32.9261,1.0989,0.2834,2.0811 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.0581,1.0958,0.2833,2.0823 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,38.4293,1.1039,0.2906,2.0298 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.0021,1.0978,0.2848,2.0708 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.2851,1.0947,0.2782,2.1200 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.6014,1.1182,0.2990,1.9725 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,39.8785,1.1192,0.3010,1.9599 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,35.4959,1.1157,0.2979,1.9802 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.2873,1.1153,0.2983,1.9772 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.6381,1.1146,0.2961,1.9921 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse4.1_medium_results.csv new file mode 100644 index 0000000..c37b5b0 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse4.1_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2330,1.4364,0.6267,0.9412 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.7938,1.3838,0.5782,1.0200 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.2636,1.4620,0.6551,0.9004 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.0439,1.4076,0.6024,0.9791 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,33.4389,1.5734,0.7670,0.7690 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.2272,1.5066,0.6986,0.8443 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.9807,1.5090,0.7012,0.8412 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.6837,1.5723,0.7636,0.7724 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.0703,1.4970,0.6905,0.8542 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.6278,1.5685,0.7596,0.7765 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.6053,1.5614,0.7501,0.7863 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.0611,1.5192,0.7070,0.8343 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.8915,1.6141,0.8023,0.7352 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.6271,1.5491,0.7408,0.7962 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.3221,1.5548,0.7420,0.7949 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.2786,1.6337,0.8111,0.7272 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.2097,1.6028,0.7879,0.7486 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.3740,1.7255,0.9029,0.6532 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.4717,1.6550,0.8390,0.7030 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.4793,1.6064,0.7887,0.7478 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.8289,1.6413,0.8147,0.7239 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.8853,1.6298,0.8034,0.7342 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.1041,1.6782,0.8527,0.6918 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6632,1.6513,0.8281,0.7122 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.7728,1.6212,0.7954,0.7415 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse4.1_thorough_results.csv new file mode 100644 index 0000000..d80e9cc --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-2.5-sse4.1_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.4529,2.3904,1.5831,0.3726 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.1699,2.3458,1.5398,0.3831 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.8273,2.3289,1.5213,0.3877 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.3345,2.2562,1.4486,0.4072 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,33.5777,2.4264,1.6185,0.3644 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3180,2.5328,1.7196,0.3430 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.3374,2.5087,1.6955,0.3479 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.1877,2.4832,1.6734,0.3525 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.2422,2.4194,1.6047,0.3676 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,29.7302,2.4365,1.6240,0.3632 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.6886,2.6724,1.8559,0.3178 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3881,2.5959,1.7855,0.3303 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.3441,2.5917,1.7854,0.3304 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7722,2.5323,1.7252,0.3419 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,27.3867,2.5058,1.6921,0.3486 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.3849,2.8778,2.0633,0.2859 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.4758,2.8383,2.0245,0.2913 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7275,2.8705,2.0514,0.2875 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6272,2.8305,2.0145,0.2928 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,24.5403,2.7149,1.8968,0.3110 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,29.9092,2.7740,1.9472,0.3029 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1237,2.6701,1.8418,0.3203 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.2620,2.7409,1.9137,0.3082 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7762,2.7648,1.9392,0.3042 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,21.8048,2.7526,1.9243,0.3065 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-avx2_fast_results.csv new file mode 100644 index 0000000..e7bc1f3 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-avx2_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.4642,0.9206,0.1086,5.4306 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6113,0.9023,0.1042,5.6594 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1249,0.9088,0.1151,5.1237 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.8620,0.9039,0.1064,5.5433 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4006,0.9604,0.1386,4.2548 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4855,0.9261,0.1123,5.2511 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8798,0.9130,0.1129,5.2252 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5073,0.9110,0.1164,5.0690 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9690,0.9134,0.1130,5.2194 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8563,0.9531,0.1314,4.4902 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9117,0.9368,0.1226,4.8125 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9417,0.9174,0.1235,4.7743 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6901,0.9159,0.1247,4.7282 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.6034,0.9219,0.1237,4.7695 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4690,0.9657,0.1410,4.1836 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6259,1.0036,0.1842,3.2028 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.0949,0.9746,0.1730,3.4098 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4004,0.9796,0.1780,3.3143 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5218,0.9778,0.1735,3.3987 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6552,1.0249,0.1933,3.0509 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2083,1.0440,0.2153,2.7398 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1174,1.0073,0.1992,2.9616 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3098,1.0129,0.2058,2.8664 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7317,1.0167,0.2065,2.8566 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0473,1.0679,0.2263,2.6068 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-avx2_fastest_results.csv new file mode 100644 index 0000000..23c1756 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-avx2_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2326,0.8834,0.0732,8.0546 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2416,0.8664,0.0739,7.9788 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4153,0.8676,0.0738,7.9926 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.6138,0.8715,0.0738,7.9920 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.0126,0.9023,0.0794,7.4294 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3165,0.8916,0.0804,7.3356 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4653,0.8779,0.0810,7.2802 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0821,0.8755,0.0807,7.3127 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.7249,0.8807,0.0825,7.1537 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4955,0.9102,0.0845,6.9824 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8196,0.8892,0.0779,7.5716 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6921,0.8750,0.0797,7.4031 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4519,0.8730,0.0779,7.5736 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3978,0.8744,0.0797,7.3992 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3170,0.9022,0.0810,7.2811 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5303,0.9379,0.1203,4.9045 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8147,0.9207,0.1202,4.9074 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1762,0.9168,0.1183,4.9860 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3622,0.9242,0.1215,4.8552 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.5936,0.9590,0.1270,4.6442 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1316,0.9686,0.1448,4.0723 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.6209,0.9452,0.1410,4.1826 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0262,0.9435,0.1409,4.1869 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6170,0.9515,0.1447,4.0759 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0061,0.9935,0.1550,3.8064 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-avx2_medium_results.csv new file mode 100644 index 0000000..4d5d22d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-avx2_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6813,1.0152,0.1984,2.9722 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9798,0.9898,0.1927,3.0610 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5307,1.0064,0.2162,2.7282 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2443,0.9997,0.1979,2.9801 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.7736,1.0887,0.2683,2.1981 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5886,1.0282,0.2159,2.7315 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2735,1.0275,0.2244,2.6287 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0266,1.0367,0.2354,2.5060 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1990,1.0237,0.2220,2.6565 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0853,1.1085,0.2788,2.1153 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9799,1.0462,0.2313,2.5503 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3967,1.0207,0.2245,2.6272 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2283,1.0421,0.2421,2.4367 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7624,1.0325,0.2280,2.5873 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6249,1.1214,0.2926,2.0159 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7193,1.1333,0.3106,1.8989 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5399,1.0800,0.2739,2.1533 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7977,1.1059,0.3027,1.9487 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6493,1.1016,0.2954,1.9965 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7364,1.1932,0.3560,1.6567 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2550,1.2301,0.3959,1.4897 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3419,1.1312,0.3167,1.8626 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5225,1.1784,0.3665,1.6095 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8200,1.1691,0.3549,1.6619 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0791,1.2708,0.4258,1.3853 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-avx2_thorough_results.csv new file mode 100644 index 0000000..e682b84 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-avx2_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8140,1.2786,0.4654,1.2672 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.3108,1.2803,0.4840,1.2185 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0416,1.2881,0.4957,1.1898 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4415,1.2576,0.4593,1.2841 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9172,1.3825,0.5584,1.0563 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6414,1.3319,0.5165,1.1419 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.5164,1.3635,0.5626,1.0484 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4423,1.3605,0.5630,1.0477 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.3342,1.3238,0.5249,1.1236 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2127,1.4354,0.6116,0.9644 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0206,1.4166,0.6002,0.9827 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.5914,1.4251,0.6261,0.9421 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5720,1.4318,0.6347,0.9293 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8656,1.4023,0.6044,0.9758 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7315,1.5346,0.7063,0.8351 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7638,1.5949,0.7743,0.7618 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7385,1.5035,0.6977,0.8454 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0389,1.5403,0.7381,0.7991 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7390,1.5266,0.7178,0.8218 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8113,1.7122,0.8752,0.6739 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2896,1.7554,0.9179,0.6426 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5190,1.5453,0.7246,0.8140 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7063,1.6414,0.8256,0.7145 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8774,1.6395,0.8212,0.7183 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1152,1.8808,1.0319,0.5716 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse2_fast_results.csv new file mode 100644 index 0000000..7f7fcfc --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse2_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.4642,0.9467,0.1363,4.3277 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6113,0.9284,0.1309,4.5048 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1249,0.9385,0.1436,4.1086 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.8620,0.9319,0.1331,4.4325 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4006,0.9953,0.1724,3.4211 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4855,0.9690,0.1534,3.8461 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8798,0.9525,0.1534,3.8443 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5073,0.9539,0.1578,3.7371 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9690,0.9547,0.1531,3.8532 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8563,1.0047,0.1788,3.2995 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9117,0.9980,0.1808,3.2631 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9417,0.9821,0.1812,3.2554 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6901,0.9781,0.1823,3.2348 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.6034,0.9832,0.1806,3.2657 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4690,1.0337,0.2048,2.8804 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6259,1.0986,0.2734,2.1570 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.0949,1.0655,0.2576,2.2900 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4004,1.0731,0.2682,2.1989 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5218,1.0685,0.2607,2.2623 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6552,1.1252,0.2871,2.0544 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2083,1.1537,0.3238,1.8215 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1174,1.1093,0.2999,1.9665 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3098,1.1162,0.3092,1.9078 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7317,1.1237,0.3094,1.9064 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0473,1.1800,0.3385,1.7423 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse2_fastest_results.csv new file mode 100644 index 0000000..5edf0b2 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse2_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2326,0.9060,0.0936,6.3045 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2416,0.8912,0.0937,6.2929 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4153,0.8881,0.0941,6.2703 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.6138,0.8931,0.0942,6.2615 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.0126,0.9247,0.1013,5.8225 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3165,0.9240,0.1109,5.3166 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4653,0.9099,0.1119,5.2715 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0821,0.9071,0.1110,5.3134 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.7249,0.9123,0.1121,5.2598 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4955,0.9404,0.1154,5.1095 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8196,0.9275,0.1130,5.2215 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6921,0.9147,0.1153,5.1166 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4519,0.9091,0.1130,5.2177 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3978,0.9152,0.1149,5.1337 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3170,0.9432,0.1167,5.0546 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5303,0.9951,0.1753,3.3650 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8147,0.9780,0.1750,3.3697 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1762,0.9739,0.1732,3.4059 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3622,0.9824,0.1776,3.3203 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.5936,1.0191,0.1866,3.1608 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1316,1.0419,0.2144,2.7516 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.6209,1.0192,0.2113,2.7921 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0262,1.0160,0.2102,2.8064 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6170,1.0268,0.2166,2.7231 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0061,1.0702,0.2301,2.5638 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse2_medium_results.csv new file mode 100644 index 0000000..64dbf42 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse2_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6813,1.0841,0.2661,2.2164 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9798,1.0610,0.2612,2.2584 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5307,1.0883,0.2923,2.0177 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2443,1.0682,0.2673,2.2069 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.7736,1.1871,0.3598,1.6392 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5886,1.1287,0.3134,1.8818 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2735,1.1319,0.3276,1.8003 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0266,1.1436,0.3455,1.7071 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1990,1.1306,0.3256,1.8118 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0853,1.2347,0.4070,1.4490 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9799,1.1702,0.3495,1.6877 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3967,1.1431,0.3414,1.7275 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2283,1.1688,0.3681,1.6022 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7624,1.1525,0.3465,1.7024 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6249,1.2719,0.4421,1.3342 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7193,1.3044,0.4816,1.2246 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5399,1.2323,0.4252,1.3872 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7977,1.2743,0.4709,1.2526 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6493,1.2624,0.4562,1.2929 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7364,1.3818,0.5486,1.0752 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2550,1.4356,0.6055,0.9742 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3419,1.3001,0.4875,1.2099 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5225,1.3711,0.5605,1.0523 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8200,1.3601,0.5422,1.0878 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0791,1.4984,0.6513,0.9057 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse2_thorough_results.csv new file mode 100644 index 0000000..46fe116 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse2_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8140,1.4350,0.6193,0.9524 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.3108,1.4526,0.6532,0.9030 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0416,1.4670,0.6700,0.8804 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4415,1.4204,0.6200,0.9514 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9172,1.5700,0.7472,0.7894 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6414,1.5601,0.7446,0.7922 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.5164,1.6150,0.8121,0.7263 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4423,1.6092,0.8127,0.7257 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.3342,1.5609,0.7556,0.7806 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2127,1.7099,0.8809,0.6696 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0206,1.7151,0.8957,0.6585 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.5914,1.7311,0.9290,0.6349 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5720,1.7488,0.9474,0.6226 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8656,1.7043,0.9018,0.6541 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7315,1.8778,1.0479,0.5629 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7638,2.0126,1.1857,0.4975 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7385,1.8810,1.0719,0.5502 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0389,1.9360,1.1320,0.5210 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7390,1.9138,1.1054,0.5336 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8113,2.1880,1.3469,0.4379 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2896,2.2359,1.3992,0.4215 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5190,1.9326,1.1153,0.5289 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7063,2.0784,1.2631,0.4670 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8774,2.0728,1.2533,0.4706 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1152,2.4112,1.5651,0.3769 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse4.1_fast_results.csv new file mode 100644 index 0000000..fd65f8c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse4.1_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.4642,0.9349,0.1215,4.8552 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6113,0.9154,0.1171,5.0354 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1249,0.9239,0.1284,4.5924 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.8620,0.9187,0.1184,4.9800 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4006,0.9803,0.1542,3.8248 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4855,0.9477,0.1327,4.4461 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8798,0.9348,0.1335,4.4189 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5073,0.9350,0.1373,4.2959 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9690,0.9350,0.1330,4.4341 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8563,0.9812,0.1558,3.7849 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9117,0.9740,0.1576,3.7418 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9417,0.9586,0.1579,3.7349 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6901,0.9566,0.1589,3.7111 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.6034,0.9586,0.1571,3.7548 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4690,1.0069,0.1779,3.3146 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6259,1.0635,0.2402,2.4553 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.0949,1.0317,0.2274,2.5933 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4004,1.0395,0.2340,2.5210 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5218,1.0347,0.2271,2.5977 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6552,1.0872,0.2511,2.3487 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2083,1.1156,0.2853,2.0673 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1174,1.0738,0.2647,2.2281 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3098,1.0843,0.2727,2.1627 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7317,1.0871,0.2721,2.1680 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0473,1.1433,0.2984,1.9766 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse4.1_fastest_results.csv new file mode 100644 index 0000000..7c28cf2 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse4.1_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2326,0.8925,0.0828,7.1221 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2416,0.8796,0.0829,7.1145 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4153,0.8771,0.0830,7.1040 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.6138,0.8800,0.0830,7.1094 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.0126,0.9129,0.0899,6.5637 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3165,0.9087,0.0957,6.1635 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4653,0.8948,0.0965,6.1136 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0821,0.8909,0.0962,6.1328 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.7249,0.8958,0.0964,6.1191 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4955,0.9245,0.0994,5.9329 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8196,0.9113,0.0982,6.0056 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6921,0.8973,0.1003,5.8804 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4519,0.8922,0.0987,5.9764 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3978,0.8989,0.0997,5.9157 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3170,0.9262,0.1018,5.7928 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5303,0.9712,0.1539,3.8330 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8147,0.9563,0.1535,3.8420 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1762,0.9496,0.1499,3.9360 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3622,0.9614,0.1556,3.7901 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.5936,0.9963,0.1630,3.6182 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1316,1.0145,0.1901,3.1022 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.6209,0.9923,0.1861,3.1699 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0262,0.9907,0.1852,3.1845 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6170,0.9988,0.1919,3.0730 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0061,1.0422,0.2040,2.8913 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse4.1_medium_results.csv new file mode 100644 index 0000000..7908270 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse4.1_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6813,1.0485,0.2338,2.5226 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9798,1.0310,0.2281,2.5855 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5307,1.0563,0.2549,2.3139 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2443,1.0411,0.2330,2.5316 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.7736,1.1405,0.3145,1.8756 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5886,1.0881,0.2695,2.1888 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2735,1.0834,0.2816,2.0946 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0266,1.0971,0.2964,1.9901 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1990,1.0846,0.2788,2.1152 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0853,1.1794,0.3502,1.6841 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9799,1.1205,0.3011,1.9590 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3967,1.0966,0.2921,2.0192 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2283,1.1184,0.3173,1.8590 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7624,1.1048,0.2979,1.9796 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6249,1.2150,0.3838,1.5369 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7193,1.2415,0.4217,1.3986 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5399,1.1818,0.3740,1.5773 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7977,1.2190,0.4116,1.4330 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6493,1.2074,0.4001,1.4742 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7364,1.3194,0.4816,1.2247 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2550,1.3714,0.5360,1.1005 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3419,1.2455,0.4300,1.3717 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5225,1.3058,0.4948,1.1920 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8200,1.2958,0.4783,1.2333 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0791,1.4251,0.5758,1.0243 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse4.1_thorough_results.csv new file mode 100644 index 0000000..3d7af90 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.6-sse4.1_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8140,1.3668,0.5496,1.0731 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.3108,1.3742,0.5744,1.0268 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0416,1.3844,0.5893,1.0009 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4415,1.3448,0.5442,1.0839 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9172,1.4844,0.6601,0.8936 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6414,1.4673,0.6500,0.9074 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.5164,1.5132,0.7083,0.8327 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4423,1.5122,0.7090,0.8319 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.3342,1.4652,0.6606,0.8928 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2127,1.5933,0.7676,0.7684 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0206,1.5996,0.7801,0.7561 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.5914,1.6176,0.8131,0.7254 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5720,1.6268,0.8284,0.7120 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8656,1.5934,0.7870,0.7494 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7315,1.7475,0.9170,0.6432 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7638,1.8698,1.0465,0.5636 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7385,1.7500,0.9440,0.6248 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0389,1.8071,1.0011,0.5892 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7390,1.7833,0.9732,0.6061 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8113,2.0260,1.1907,0.4954 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2896,2.0752,1.2384,0.4763 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5190,1.8057,0.9886,0.5966 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7063,1.9364,1.1189,0.5272 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8774,1.9304,1.1109,0.5310 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1152,2.2427,1.3917,0.4238 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-avx2_fast_results.csv new file mode 100644 index 0000000..7d43d95 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-avx2_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.4641,0.9218,0.1073,5.4994 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6113,0.9023,0.1041,5.6654 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1250,0.9084,0.1151,5.1251 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.8620,0.8992,0.1054,5.5985 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4006,0.9608,0.1372,4.3000 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4855,0.9179,0.1094,5.3933 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8797,0.9085,0.1117,5.2808 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5073,0.9106,0.1149,5.1319 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9690,0.9114,0.1110,5.3115 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8563,0.9550,0.1292,4.5660 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9117,0.9359,0.1211,4.8687 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9417,0.9196,0.1217,4.8465 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6901,0.9195,0.1224,4.8169 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.6035,0.9177,0.1209,4.8766 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4690,0.9639,0.1370,4.3039 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6259,1.0021,0.1797,3.2828 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.0949,0.9737,0.1695,3.4804 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4005,0.9761,0.1756,3.3591 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5217,0.9768,0.1713,3.4429 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6552,1.0186,0.1887,3.1257 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2083,1.0385,0.2123,2.7787 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1174,1.0045,0.1949,3.0262 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3098,1.0067,0.2012,2.9313 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7317,1.0127,0.2040,2.8911 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0473,1.0644,0.2224,2.6525 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-avx2_fastest_results.csv new file mode 100644 index 0000000..df7e854 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-avx2_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2326,0.8870,0.0733,8.0447 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2416,0.8716,0.0738,7.9962 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4155,0.8676,0.0739,7.9813 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.6138,0.8721,0.0739,7.9796 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.0126,0.9013,0.0802,7.3578 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3165,0.8940,0.0794,7.4278 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4653,0.8790,0.0809,7.2923 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0821,0.8732,0.0803,7.3469 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.7249,0.8790,0.0806,7.3202 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4955,0.9074,0.0842,7.0009 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8196,0.8885,0.0765,7.7085 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6921,0.8749,0.0789,7.4734 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4519,0.8721,0.0773,7.6282 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3979,0.8768,0.0788,7.4882 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3170,0.9039,0.0794,7.4249 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5303,0.9325,0.1179,5.0011 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8147,0.9187,0.1179,5.0007 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1762,0.9148,0.1161,5.0787 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3622,0.9205,0.1191,4.9532 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.5936,0.9579,0.1262,4.6744 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1316,0.9653,0.1425,4.1378 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.6209,0.9442,0.1383,4.2643 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0262,0.9424,0.1387,4.2529 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6170,0.9501,0.1429,4.1265 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0061,0.9901,0.1525,3.8689 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-avx2_medium_results.csv new file mode 100644 index 0000000..80cf24e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-avx2_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6813,1.0132,0.1962,3.0062 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9798,0.9897,0.1911,3.0871 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5306,1.0104,0.2138,2.7589 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2442,0.9996,0.1967,2.9988 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.7736,1.0864,0.2642,2.2326 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5886,1.0299,0.2115,2.7888 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2736,1.0254,0.2217,2.6605 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0266,1.0343,0.2343,2.5176 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1990,1.0246,0.2206,2.6738 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0853,1.1052,0.2762,2.1352 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9799,1.0363,0.2239,2.6338 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3967,1.0231,0.2214,2.6640 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2282,1.0361,0.2411,2.4468 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7624,1.0230,0.2248,2.6234 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6249,1.1126,0.2872,2.0539 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7193,1.1301,0.3070,1.9214 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5399,1.0773,0.2685,2.1968 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7977,1.0996,0.2967,1.9881 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6492,1.0991,0.2908,2.0281 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7364,1.1854,0.3500,1.6851 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2550,1.2191,0.3897,1.5137 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3419,1.1247,0.3121,1.8901 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5225,1.1674,0.3578,1.6483 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8199,1.1625,0.3474,1.6977 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0791,1.2700,0.4192,1.4071 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-avx2_thorough_results.csv new file mode 100644 index 0000000..04bd9ae --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-avx2_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8139,1.2768,0.4551,1.2960 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.3108,1.2694,0.4733,1.2462 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0417,1.2816,0.4876,1.2095 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4415,1.2472,0.4497,1.3115 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9172,1.3721,0.5479,1.0766 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6414,1.3245,0.5063,1.1651 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.5164,1.3531,0.5518,1.0690 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4423,1.3541,0.5532,1.0663 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.3342,1.3138,0.5126,1.1506 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2127,1.4295,0.5996,0.9838 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0206,1.4006,0.5855,1.0074 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.5914,1.4183,0.6116,0.9644 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5720,1.4177,0.6226,0.9474 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8656,1.3921,0.5919,0.9964 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7315,1.5221,0.6927,0.8515 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7637,1.5769,0.7557,0.7805 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7385,1.4893,0.6817,0.8652 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0389,1.5299,0.7267,0.8117 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7389,1.5108,0.7033,0.8387 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8113,1.6972,0.8592,0.6865 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2896,1.7375,0.9002,0.6552 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5190,1.5311,0.7115,0.8290 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7063,1.6242,0.8119,0.7264 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8774,1.6229,0.8046,0.7330 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1152,1.8624,1.0122,0.5827 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse2_fast_results.csv new file mode 100644 index 0000000..143f501 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse2_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.4641,0.9473,0.1355,4.3536 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6113,0.9274,0.1308,4.5108 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1250,0.9356,0.1427,4.1332 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.8620,0.9278,0.1327,4.4432 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4006,0.9938,0.1723,3.4242 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4855,0.9626,0.1511,3.9047 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8797,0.9488,0.1518,3.8853 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5073,0.9493,0.1556,3.7897 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9690,0.9500,0.1510,3.9068 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8563,0.9986,0.1770,3.3317 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9117,0.9950,0.1791,3.2940 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9417,0.9776,0.1795,3.2863 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6901,0.9776,0.1812,3.2557 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.6035,0.9784,0.1791,3.2930 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4690,1.0307,0.2029,2.9070 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6259,1.0936,0.2725,2.1641 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.0949,1.0600,0.2586,2.2809 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4005,1.0697,0.2661,2.2165 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5217,1.0641,0.2613,2.2575 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6552,1.1208,0.2881,2.0470 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2083,1.1494,0.3225,1.8289 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1174,1.1086,0.2981,1.9788 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3098,1.1146,0.3070,1.9214 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7317,1.1195,0.3077,1.9169 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0473,1.1804,0.3364,1.7533 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse2_fastest_results.csv new file mode 100644 index 0000000..35f9254 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse2_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2326,0.9045,0.0936,6.2989 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2416,0.8891,0.0935,6.3075 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4155,0.8857,0.0938,6.2904 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.6138,0.8899,0.0934,6.3139 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.0126,0.9201,0.1010,5.8380 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3165,0.9199,0.1102,5.3514 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4653,0.9058,0.1110,5.3126 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0821,0.9025,0.1102,5.3533 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.7249,0.9083,0.1111,5.3101 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4955,0.9360,0.1141,5.1702 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8196,0.9233,0.1119,5.2696 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6921,0.9108,0.1138,5.1851 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4519,0.9057,0.1120,5.2660 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3979,0.9094,0.1138,5.1847 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3170,0.9393,0.1151,5.1250 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5303,0.9899,0.1742,3.3853 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8147,0.9733,0.1754,3.3632 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1762,0.9695,0.1727,3.4152 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3622,0.9805,0.1766,3.3400 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.5936,1.0173,0.1858,3.1746 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1316,1.0369,0.2135,2.7625 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.6209,1.0156,0.2099,2.8103 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0262,1.0117,0.2099,2.8099 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6170,1.0223,0.2160,2.7307 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0061,1.0648,0.2289,2.5766 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse2_medium_results.csv new file mode 100644 index 0000000..930e559 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse2_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6813,1.0755,0.2623,2.2486 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9798,1.0606,0.2578,2.2879 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5306,1.0818,0.2898,2.0356 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2442,1.0637,0.2634,2.2392 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.7736,1.1878,0.3542,1.6653 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5886,1.1332,0.3086,1.9113 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2736,1.1285,0.3249,1.8156 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0266,1.1406,0.3400,1.7348 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1990,1.1254,0.3223,1.8299 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0853,1.2287,0.4035,1.4617 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9799,1.1611,0.3436,1.7168 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3967,1.1387,0.3345,1.7632 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2282,1.1657,0.3625,1.6270 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7624,1.1482,0.3412,1.7287 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6249,1.2627,0.4353,1.3548 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7193,1.3011,0.4758,1.2397 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5399,1.2270,0.4221,1.3974 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7977,1.2698,0.4662,1.2652 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6492,1.2615,0.4504,1.3096 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7364,1.3779,0.5453,1.0817 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2550,1.4340,0.6005,0.9822 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3419,1.2972,0.4838,1.2191 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5225,1.3637,0.5541,1.0644 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8199,1.3509,0.5371,1.0981 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0791,1.4932,0.6471,0.9114 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse2_thorough_results.csv new file mode 100644 index 0000000..a290d4b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse2_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8139,1.4137,0.6023,0.9793 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.3108,1.4359,0.6365,0.9266 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0417,1.4510,0.6504,0.9068 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4415,1.4039,0.6044,0.9758 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9172,1.5476,0.7259,0.8126 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6414,1.5397,0.7245,0.8141 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.5164,1.6009,0.7960,0.7410 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4423,1.5940,0.7977,0.7394 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.3342,1.5420,0.7425,0.7943 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2127,1.6911,0.8596,0.6861 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0206,1.6935,0.8775,0.6722 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.5914,1.7178,0.9193,0.6416 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5720,1.7297,0.9319,0.6329 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8656,1.6887,0.8872,0.6648 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7315,1.8485,1.0197,0.5784 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7637,1.9921,1.1685,0.5048 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7385,1.8652,1.0596,0.5567 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0389,1.9231,1.1191,0.5270 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7389,1.8959,1.0893,0.5414 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8113,2.1659,1.3246,0.4453 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2896,2.2175,1.3855,0.4257 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5190,1.9238,1.1052,0.5337 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7063,2.0665,1.2531,0.4707 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8774,2.0650,1.2428,0.4746 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1152,2.4022,1.5512,0.3802 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse4.1_fast_results.csv new file mode 100644 index 0000000..6966214 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse4.1_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.4641,0.9314,0.1201,4.9124 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6113,0.9103,0.1155,5.1072 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1250,0.9211,0.1271,4.6422 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.8620,0.9160,0.1174,5.0251 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4006,0.9747,0.1533,3.8483 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4855,0.9416,0.1310,4.5030 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8797,0.9325,0.1313,4.4915 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5073,0.9311,0.1350,4.3675 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9690,0.9328,0.1317,4.4798 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8563,0.9785,0.1539,3.8335 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9117,0.9685,0.1553,3.7970 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9417,0.9548,0.1557,3.7883 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6901,0.9532,0.1566,3.7671 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.6035,0.9644,0.1554,3.7953 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4690,1.0115,0.1757,3.3575 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6259,1.0578,0.2406,2.4517 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.0949,1.0265,0.2258,2.6119 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4005,1.0353,0.2313,2.5502 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5217,1.0307,0.2248,2.6240 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6552,1.0854,0.2486,2.3722 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2083,1.1099,0.2833,2.0816 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1174,1.0740,0.2614,2.2561 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3098,1.0776,0.2708,2.1779 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7317,1.0825,0.2721,2.1673 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0473,1.1393,0.2968,1.9876 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse4.1_fastest_results.csv new file mode 100644 index 0000000..5e9ec35 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse4.1_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2326,0.8923,0.0815,7.2360 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2416,0.8785,0.0818,7.2098 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4155,0.8735,0.0822,7.1780 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.6138,0.8804,0.0821,7.1847 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.0126,0.9088,0.0887,6.6500 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3165,0.9066,0.0943,6.2518 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4653,0.8932,0.0958,6.1576 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0821,0.8916,0.0950,6.2062 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.7249,0.8951,0.0956,6.1715 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4955,0.9221,0.0987,5.9779 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8196,0.9095,0.0971,6.0772 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6921,0.8954,0.0988,5.9714 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4519,0.8926,0.0969,6.0899 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3979,0.8961,0.0982,6.0072 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3170,0.9252,0.1001,5.8895 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5303,0.9712,0.1517,3.8880 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8147,0.9544,0.1512,3.9012 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1762,0.9472,0.1494,3.9482 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3622,0.9556,0.1540,3.8294 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.5936,0.9911,0.1611,3.6611 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1316,1.0133,0.1892,3.1167 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.6209,0.9907,0.1850,3.1878 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0262,0.9880,0.1838,3.2094 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6170,0.9964,0.1901,3.1033 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0061,1.0391,0.2010,2.9338 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse4.1_medium_results.csv new file mode 100644 index 0000000..a5072f1 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse4.1_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6813,1.0432,0.2279,2.5878 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9798,1.0214,0.2231,2.6433 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5306,1.0450,0.2502,2.3570 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2442,1.0295,0.2291,2.5746 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.7736,1.1314,0.3086,1.9112 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5886,1.0808,0.2656,2.2208 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2736,1.0815,0.2764,2.1339 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0266,1.0881,0.2923,2.0176 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1990,1.0787,0.2748,2.1465 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0853,1.1695,0.3439,1.7153 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9799,1.1151,0.2988,1.9740 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3967,1.0893,0.2868,2.0566 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2282,1.1138,0.3127,1.8865 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7624,1.0970,0.2950,1.9997 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6249,1.2049,0.3776,1.5621 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7193,1.2370,0.4165,1.4160 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5399,1.1802,0.3704,1.5922 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7977,1.2124,0.4077,1.4466 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6492,1.2073,0.3974,1.4841 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7364,1.3110,0.4762,1.2386 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2550,1.3642,0.5315,1.1096 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3419,1.2401,0.4281,1.3778 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5225,1.3038,0.4906,1.2024 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8199,1.2876,0.4737,1.2450 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0791,1.4169,0.5713,1.0324 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse4.1_thorough_results.csv new file mode 100644 index 0000000..1e5433e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-3.7-sse4.1_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8139,1.3757,0.5382,1.0959 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.3108,1.3940,0.5870,1.0048 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0417,1.3709,0.5748,1.0261 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4415,1.3280,0.5302,1.1124 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9172,1.4711,0.6420,0.9188 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6414,1.4511,0.6334,0.9312 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.5164,1.4945,0.6909,0.8537 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4423,1.4912,0.6923,0.8520 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.3342,1.4496,0.6470,0.9116 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2127,1.5747,0.7474,0.7892 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0206,1.5839,0.7672,0.7688 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.5914,1.5978,0.7909,0.7458 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5720,1.6133,0.8163,0.7226 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8656,1.5826,0.7684,0.7676 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7315,1.7515,0.9037,0.6527 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7637,1.8827,1.0402,0.5670 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7385,1.7561,0.9440,0.6248 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0389,1.7941,0.9898,0.5959 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7389,1.7780,0.9645,0.6115 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8113,2.0074,1.1668,0.5055 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2896,2.0637,1.2261,0.4811 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5190,1.7944,0.9754,0.6047 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7063,1.9262,1.1099,0.5314 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8774,1.9157,1.1010,0.5357 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1152,2.2276,1.3793,0.4276 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-avx2_fast_results.csv new file mode 100644 index 0000000..a57d92c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-avx2_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.5079,1.2433,0.0917,6.4350 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6274,1.1602,0.0867,6.7993 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1770,1.2131,0.0980,6.0209 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.9296,1.1880,0.0888,6.6407 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4914,1.2989,0.1218,4.8443 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4760,1.2247,0.0745,7.9222 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8411,1.1616,0.0736,8.0192 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5211,1.1555,0.0784,7.5269 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9432,1.1581,0.0738,7.9921 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8652,1.2708,0.0951,6.2047 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9076,1.1425,0.0719,8.2045 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9393,1.1562,0.0758,7.7788 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6879,1.2011,0.0769,7.6696 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.5917,1.1692,0.0752,7.8386 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4745,1.2668,0.0885,6.6669 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6248,1.2599,0.1076,5.4821 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.2283,1.1500,0.1065,5.5385 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4765,1.1315,0.1065,5.5389 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5473,1.2048,0.1091,5.4060 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6682,1.2993,0.1198,4.9223 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2103,1.2877,0.1411,4.1805 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1352,1.2135,0.1341,4.3990 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3178,1.1723,0.1362,4.3303 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7267,1.2432,0.1432,4.1178 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0409,1.2488,0.1547,3.8137 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-avx2_fastest_results.csv new file mode 100644 index 0000000..c741b3f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-avx2_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2760,1.1140,0.0548,10.7585 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2550,1.1359,0.0562,10.4992 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4452,1.1049,0.0566,10.4250 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.7224,1.1450,0.0561,10.5213 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.1407,1.2410,0.0650,9.0792 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3462,1.1527,0.0492,11.9926 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4523,1.1231,0.0487,12.1044 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0647,1.1431,0.0489,12.0626 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.6860,1.1284,0.0481,12.2686 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4860,1.2263,0.0557,10.5986 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8152,1.1911,0.0466,12.6469 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6862,1.1143,0.0459,12.8583 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4504,1.0768,0.0470,12.5545 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3418,1.1178,0.0457,12.9025 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3231,1.2356,0.0512,11.5106 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5286,1.2252,0.0733,8.0520 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8172,1.1024,0.0669,8.8159 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1742,1.1861,0.0696,8.4780 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3216,1.0968,0.0688,8.5703 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6015,1.2552,0.0806,7.3175 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1296,1.2498,0.0946,6.2342 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.6184,1.1710,0.0871,6.7736 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0073,1.1971,0.0897,6.5743 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6053,1.1890,0.0935,6.3060 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,22.9988,1.2962,0.1049,5.6223 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-avx2_medium_results.csv new file mode 100644 index 0000000..f60c284 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-avx2_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6791,1.2972,0.1409,4.1847 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9716,1.2255,0.1420,4.1551 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5447,1.2686,0.1602,3.6827 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2529,1.2509,0.1472,4.0063 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.8078,1.2822,0.1971,2.9928 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5749,1.2769,0.1231,4.7915 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2379,1.1591,0.1345,4.3852 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0205,1.2516,0.1384,4.2620 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1604,1.2253,0.1324,4.4542 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0714,1.2594,0.1651,3.5717 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9665,1.2826,0.1276,4.6241 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3830,1.2211,0.1422,4.1492 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2212,1.2530,0.1447,4.0769 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7449,1.2062,0.1418,4.1592 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6274,1.3405,0.1645,3.5861 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7112,1.3268,0.1788,3.2987 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5312,1.2685,0.1781,3.3113 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7927,1.2964,0.1920,3.0713 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6447,1.2136,0.1877,3.1416 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7353,1.3889,0.2061,2.8617 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2530,1.3137,0.2413,2.4446 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3580,1.2285,0.2233,2.6420 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5156,1.2875,0.2469,2.3889 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8195,1.3181,0.2387,2.4705 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0654,1.4044,0.2532,2.3298 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-avx2_thorough_results.csv new file mode 100644 index 0000000..351b97e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-avx2_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8052,1.4606,0.3026,1.9489 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.2886,1.4075,0.3215,1.8345 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0376,1.3893,0.3436,1.7167 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4310,1.4155,0.3190,1.8493 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9371,1.5838,0.4014,1.4693 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6353,1.4328,0.2857,2.0644 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.4748,1.3500,0.3339,1.7664 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4296,1.4435,0.3337,1.7678 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.2931,1.4059,0.3081,1.9147 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2164,1.5607,0.3755,1.5707 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0231,1.4694,0.3083,1.9134 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.6005,1.4411,0.3605,1.6360 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5595,1.4689,0.3524,1.6737 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8532,1.4323,0.3363,1.7537 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7385,1.5691,0.3852,1.5311 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7658,1.4909,0.4225,1.3961 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7381,1.5341,0.4455,1.3241 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0261,1.5253,0.4607,1.2804 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7370,1.5438,0.4426,1.3326 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8137,1.6624,0.4823,1.2230 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2928,1.7494,0.5841,1.0097 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5418,1.5307,0.5105,1.1553 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7152,1.7035,0.5832,1.0114 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8798,1.6793,0.5707,1.0335 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1095,1.8121,0.6279,0.9393 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-neon_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-neon_fast_results.csv new file mode 100644 index 0000000..f59bf28 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-neon_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.5079,0.5683,0.1576,3.7417 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6274,0.5618,0.1518,3.8863 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1770,0.5924,0.1759,3.3533 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.9296,0.5634,0.1543,3.8225 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4914,0.6153,0.2071,2.8483 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4760,0.5406,0.1327,4.4456 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8411,0.5395,0.1315,4.4868 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5211,0.5466,0.1390,4.2443 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9432,0.5390,0.1310,4.5020 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8652,0.5740,0.1670,3.5310 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9076,0.5392,0.1311,4.4984 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9393,0.5461,0.1380,4.2726 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6879,0.5463,0.1388,4.2487 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.5917,0.5442,0.1366,4.3172 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4745,0.5645,0.1579,3.7354 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6248,0.6123,0.2040,2.8907 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.2283,0.6145,0.2072,2.8468 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4765,0.6127,0.2054,2.8721 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5473,0.6190,0.2112,2.7926 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6682,0.6352,0.2283,2.5836 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2103,0.6950,0.2855,2.0658 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1352,0.6880,0.2792,2.1123 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3178,0.6969,0.2837,2.0787 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7267,0.7094,0.3005,1.9627 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0409,0.7304,0.3206,1.8398 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-neon_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-neon_fastest_results.csv new file mode 100644 index 0000000..4428bcc --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-neon_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2760,0.5096,0.0973,6.0625 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2550,0.5165,0.1021,5.7780 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4452,0.5090,0.1012,5.8260 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.7224,0.5115,0.0999,5.9036 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.1407,0.5318,0.1142,5.1629 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3462,0.5009,0.0900,6.5544 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4523,0.4945,0.0892,6.6133 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0647,0.4943,0.0894,6.5982 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.6860,0.4934,0.0884,6.6733 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4860,0.5056,0.1006,5.8659 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8152,0.4923,0.0866,6.8092 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6862,0.4921,0.0847,6.9664 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4504,0.4915,0.0866,6.8108 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3418,0.4889,0.0835,7.0644 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3231,0.4977,0.0940,6.2755 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5286,0.5465,0.1412,4.1764 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8172,0.5363,0.1315,4.4853 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1742,0.5394,0.1350,4.3706 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3216,0.5384,0.1332,4.4280 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6015,0.5604,0.1549,3.8089 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1296,0.5944,0.1870,3.1544 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.6184,0.5816,0.1749,3.3716 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0073,0.5866,0.1791,3.2933 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6053,0.5933,0.1864,3.1645 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,22.9988,0.6150,0.2086,2.8270 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-neon_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-neon_medium_results.csv new file mode 100644 index 0000000..2fa401b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-neon_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6791,0.7651,0.2952,1.9978 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9716,0.7615,0.2965,1.9896 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5447,0.8043,0.3329,1.7719 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2529,0.7683,0.3032,1.9454 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.8078,0.8760,0.4052,1.4555 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5749,0.7296,0.2638,2.2356 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2379,0.7536,0.2880,2.0480 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0205,0.7670,0.2888,2.0421 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1604,0.8159,0.3260,1.8094 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0714,0.8200,0.3529,1.6713 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9665,0.7382,0.2776,2.1247 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3830,0.7898,0.3084,1.9125 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2212,0.7713,0.3137,1.8802 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7449,0.7695,0.3129,1.8853 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6274,0.8192,0.3519,1.6762 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7112,0.8723,0.4136,1.4261 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5312,0.9181,0.4326,1.3636 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7927,0.9249,0.4521,1.3047 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6447,0.8991,0.4389,1.3438 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7353,2.0119,1.0926,0.5398 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2530,1.8696,1.1588,0.5090 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3580,1.0519,0.5687,1.0371 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5156,1.0984,0.6189,0.9530 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8195,1.0771,0.5955,0.9905 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0654,1.1031,0.6278,0.9396 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-neon_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-neon_thorough_results.csv new file mode 100644 index 0000000..3056eab --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-neon_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8052,1.2359,0.6909,0.8538 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.2886,1.2722,0.7312,0.8067 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0376,1.3278,0.7803,0.7559 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4310,1.2708,0.7221,0.8168 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9371,1.4555,0.9082,0.6494 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6353,1.2199,0.6762,0.8722 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.4748,1.3319,0.7969,0.7401 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4296,1.3148,0.7814,0.7548 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.2931,1.1763,0.6873,0.8582 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2164,1.3137,0.8248,0.7151 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0231,1.0953,0.6436,0.9165 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.6005,1.1935,0.7539,0.7823 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5595,1.1613,0.7294,0.8086 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8532,1.1204,0.6856,0.8602 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7385,1.2047,0.7789,0.7573 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7658,1.3487,0.9238,0.6385 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7381,1.4440,1.0041,0.5874 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0261,1.4456,1.0234,0.5764 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7370,1.4127,0.9813,0.6010 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8137,1.4919,1.0533,0.5600 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2928,1.8043,1.3667,0.4316 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5418,1.6700,1.2344,0.4778 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7152,1.8212,1.3788,0.4278 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8798,1.7772,1.3411,0.4398 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1095,1.8914,1.4608,0.4038 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse2_fast_results.csv new file mode 100644 index 0000000..4d583b0 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse2_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.5079,1.2988,0.1150,5.1282 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6274,1.1593,0.1106,5.3353 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1770,1.2717,0.1240,4.7562 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.9296,1.2347,0.1131,5.2154 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4914,1.2673,0.1534,3.8452 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4760,1.2465,0.1019,5.7887 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8411,1.1888,0.1014,5.8194 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5211,1.1966,0.1068,5.5249 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9432,1.1705,0.1008,5.8499 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8652,1.2484,0.1298,4.5440 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9076,1.2811,0.1060,5.5640 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9393,1.1565,0.1129,5.2243 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6879,1.2558,0.1129,5.2261 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.5917,1.1682,0.1111,5.3085 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4745,1.2490,0.1294,4.5593 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6248,1.3399,0.1643,3.5907 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.2283,1.2104,0.1686,3.4989 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4765,1.3058,0.1654,3.5664 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5473,1.2416,0.1701,3.4681 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6682,1.3900,0.1852,3.1855 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2103,1.3817,0.2098,2.8111 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1352,1.3232,0.2026,2.9108 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3178,1.2785,0.2048,2.8804 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7267,1.2831,0.2140,2.7567 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0409,1.3557,0.2311,2.5518 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse2_fastest_results.csv new file mode 100644 index 0000000..9f64e46 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse2_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2760,1.1755,0.0696,8.4768 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2550,1.1910,0.0722,8.1659 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4452,1.2158,0.0722,8.1749 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.7224,1.1333,0.0714,8.2663 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.1407,1.1977,0.0826,7.1445 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3462,1.1661,0.0672,8.7745 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4523,1.1701,0.0678,8.7022 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0647,1.1425,0.0673,8.7681 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.6860,1.1954,0.0663,8.9011 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4860,1.2867,0.0760,7.7617 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8152,1.2543,0.0698,8.4517 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6862,1.1773,0.0687,8.5907 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4504,1.2192,0.0700,8.4205 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3418,1.1324,0.0670,8.7997 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3231,1.2813,0.0760,7.7611 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5286,1.2151,0.1128,5.2307 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8172,1.1477,0.1051,5.6111 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1742,1.2502,0.1073,5.4962 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3216,1.1619,0.1064,5.5426 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6015,1.2512,0.1237,4.7692 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1296,1.2533,0.1398,4.2203 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.6184,1.2377,0.1304,4.5238 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0073,1.2739,0.1342,4.3946 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6053,1.1972,0.1399,4.2149 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,22.9988,1.3632,0.1554,3.7964 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse2_medium_results.csv new file mode 100644 index 0000000..0a01297 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse2_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6791,1.3648,0.1830,3.2236 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9716,1.2804,0.1866,3.1606 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5447,1.3444,0.2093,2.8181 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2529,1.3249,0.1950,3.0252 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.8078,1.4629,0.2574,2.2913 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5749,1.3536,0.1739,3.3924 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2379,1.2472,0.1953,3.0207 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0205,1.2643,0.1972,2.9915 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1604,1.3257,0.1914,3.0810 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0714,1.4452,0.2339,2.5212 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9665,1.3791,0.1933,3.0512 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3830,1.3299,0.2171,2.7163 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2212,1.3653,0.2172,2.7154 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7449,1.3414,0.2173,2.7146 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6274,1.4572,0.2439,2.4182 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7112,1.4018,0.2793,2.1116 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5312,1.3956,0.2837,2.0791 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7927,1.4441,0.3011,1.9591 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6447,1.4229,0.2936,2.0086 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7353,1.5081,0.3194,1.8467 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2530,1.5507,0.3577,1.6489 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3580,1.3921,0.3347,1.7622 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5156,1.4534,0.3688,1.5991 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8195,1.4917,0.3562,1.6557 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0654,1.5899,0.3749,1.5732 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse2_thorough_results.csv new file mode 100644 index 0000000..beeaed9 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse2_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8052,1.5839,0.3987,1.4794 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.2886,1.5431,0.4321,1.3651 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0376,1.6087,0.4585,1.2865 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4310,1.5552,0.4274,1.3799 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9371,1.6625,0.5304,1.1121 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6353,1.5246,0.4043,1.4590 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.4748,1.5950,0.4816,1.2248 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4296,1.6183,0.4728,1.2476 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.2931,1.5681,0.4439,1.3286 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2164,1.6669,0.5286,1.1158 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0231,1.5554,0.4555,1.2949 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.6005,1.6543,0.5401,1.0920 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5595,1.6717,0.5254,1.1227 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8532,1.6286,0.5020,1.1750 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7385,1.7787,0.5631,1.0475 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7658,1.8364,0.6449,0.9146 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7381,1.8162,0.6998,0.8428 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0261,1.8576,0.7104,0.8303 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7370,1.8225,0.6841,0.8622 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8137,1.8640,0.7332,0.8044 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2928,2.0132,0.8552,0.6897 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5418,1.8864,0.7625,0.7736 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7152,2.0177,0.8642,0.6825 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8798,1.9765,0.8428,0.6998 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1095,2.1336,0.9221,0.6396 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse4.1_fast_results.csv new file mode 100644 index 0000000..51fa134 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse4.1_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.5079,1.1608,0.0977,6.0373 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6274,1.1668,0.0933,6.3240 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1770,1.2026,0.1051,5.6131 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.9296,1.1171,0.0955,6.1791 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4914,1.2133,0.1313,4.4905 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4760,1.2255,0.0828,7.1202 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8411,1.1512,0.0824,7.1613 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5211,1.1914,0.0872,6.7632 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9432,1.1705,0.0818,7.2146 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8652,1.2718,0.1057,5.5801 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9076,1.2170,0.0864,6.8289 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9393,1.1675,0.0918,6.4283 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6879,1.1350,0.0921,6.4049 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.5917,1.1775,0.0905,6.5152 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4745,1.1870,0.1047,5.6349 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6248,1.2398,0.1384,4.2625 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.2283,1.1433,0.1400,4.2135 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4765,1.1650,0.1387,4.2527 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5473,1.1518,0.1422,4.1490 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6682,1.3188,0.1546,3.8153 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2103,1.2453,0.1843,3.2001 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1352,1.1857,0.1789,3.2961 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3178,1.2880,0.1811,3.2565 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7267,1.2047,0.1890,3.1204 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0409,1.2854,0.2034,2.8999 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse4.1_fastest_results.csv new file mode 100644 index 0000000..c9ecd3a --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse4.1_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2760,1.1233,0.0581,10.1458 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2550,1.0673,0.0602,9.7930 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4452,1.0874,0.0604,9.7579 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.7224,1.1488,0.0597,9.8867 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.1407,1.1574,0.0698,8.4495 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3462,1.1855,0.0544,10.8354 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4523,1.0496,0.0540,10.9196 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0647,1.1571,0.0540,10.9200 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.6860,1.0662,0.0534,11.0407 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4860,1.2358,0.0618,9.5507 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8152,1.1990,0.0567,10.4025 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6862,1.0809,0.0553,10.6750 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4504,1.0834,0.0561,10.5060 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3418,1.1407,0.0545,10.8139 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3231,1.2351,0.0610,9.6648 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5286,1.1470,0.0937,6.2966 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8172,1.1602,0.0870,6.7795 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1742,1.1047,0.0894,6.5979 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3216,1.1766,0.0878,6.7191 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6015,1.2703,0.1023,5.7633 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1296,1.2757,0.1238,4.7634 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.6184,1.1988,0.1151,5.1245 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0073,1.2204,0.1174,5.0226 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6053,1.2070,0.1227,4.8067 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,22.9988,1.3019,0.1374,4.2924 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse4.1_medium_results.csv new file mode 100644 index 0000000..9c6fa08 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse4.1_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6791,1.3026,0.1549,3.8089 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9716,1.2318,0.1573,3.7504 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5447,1.2712,0.1758,3.3542 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2529,1.2473,0.1637,3.6021 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.8078,1.3887,0.2170,2.7185 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5749,1.2894,0.1419,4.1555 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2379,1.2295,0.1577,3.7409 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0205,1.2584,0.1603,3.6802 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1604,1.2437,0.1554,3.7955 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0714,1.2909,0.1916,3.0778 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9665,1.3006,0.1572,3.7518 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3830,1.1870,0.1763,3.3451 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2212,1.2430,0.1774,3.3242 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7449,1.1949,0.1756,3.3589 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6274,1.2832,0.1993,2.9593 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7112,1.3380,0.2317,2.5455 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5312,1.3064,0.2367,2.4921 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7927,1.3554,0.2507,2.3526 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6447,1.2575,0.2438,2.4194 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7353,1.4324,0.2682,2.1988 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2530,1.4632,0.3159,1.8673 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3580,1.3730,0.2960,1.9925 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5156,1.4291,0.3274,1.8017 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8195,1.4088,0.3154,1.8701 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0654,1.5079,0.3320,1.7767 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse4.1_thorough_results.csv new file mode 100644 index 0000000..14096ce --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-4.8-sse4.1_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8052,1.4027,0.3390,1.7398 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.2886,1.3658,0.3618,1.6301 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0376,1.4866,0.3864,1.5265 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4310,1.4466,0.3587,1.6445 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9371,1.5627,0.4468,1.3201 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6353,1.3926,0.3324,1.7746 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.4748,1.3953,0.3937,1.4983 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4296,1.4962,0.3895,1.5142 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.2931,1.4534,0.3636,1.6220 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2164,1.5192,0.4356,1.3540 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0231,1.5296,0.3754,1.5710 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.6005,1.5135,0.4422,1.3337 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5595,1.5306,0.4348,1.3566 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8532,1.4576,0.4127,1.4293 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7385,1.5319,0.4685,1.2590 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7658,1.6954,0.5458,1.0806 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7381,1.6679,0.5883,1.0026 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0261,1.6950,0.6003,0.9826 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7370,1.6766,0.5812,1.0149 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8137,1.8012,0.6219,0.9485 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2928,1.9139,0.7622,0.7738 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5418,1.6809,0.6749,0.8739 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7152,1.7975,0.7639,0.7721 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8798,1.7749,0.7470,0.7896 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1095,2.0007,0.8162,0.7227 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-avx2_fast_results.csv new file mode 100644 index 0000000..c32392d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-avx2_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.5080,1.3168,0.0989,5.9629 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6274,1.1744,0.0949,6.2120 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1770,1.1812,0.1121,5.2616 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.9295,1.2383,0.0971,6.0743 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4914,1.3958,0.1373,4.2974 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4768,1.2515,0.0825,7.1475 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8355,1.1497,0.0789,7.4712 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5182,1.2273,0.0871,6.7743 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9428,1.2246,0.0781,7.5560 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8644,1.3352,0.1042,5.6623 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9048,1.3172,0.0986,5.9830 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9314,1.2455,0.0992,5.9451 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6856,1.2542,0.0932,6.3297 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.5912,1.2214,0.0886,6.6569 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4731,1.2616,0.1070,5.5100 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6207,1.2583,0.1315,4.4837 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.2287,1.2567,0.1305,4.5180 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4704,1.2086,0.1303,4.5254 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5481,1.2687,0.1350,4.3677 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6657,1.3868,0.1485,3.9730 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2102,1.4078,0.1913,3.0827 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1366,1.2402,0.1675,3.5214 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3219,1.3222,0.1725,3.4184 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7291,1.2629,0.1481,3.9835 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0429,1.3371,0.1627,3.6248 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-avx2_fastest_results.csv new file mode 100644 index 0000000..bfe4807 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-avx2_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2760,1.1337,0.0537,10.9854 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2550,1.0631,0.0557,10.5800 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4452,1.1492,0.0559,10.5550 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.7221,1.1084,0.0547,10.7823 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.1407,1.1298,0.0641,9.2023 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3464,1.1838,0.0482,12.2424 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4507,1.0467,0.0481,12.2584 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0634,1.0679,0.0482,12.2281 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.6852,1.0687,0.0476,12.3947 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4869,1.1815,0.0546,10.8074 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8151,1.1830,0.0462,12.7681 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6801,1.0469,0.0456,12.9220 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4491,1.0695,0.0466,12.6571 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3427,1.0416,0.0450,13.1206 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3229,1.1110,0.0509,11.5897 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5249,1.1262,0.0731,8.0656 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8209,1.0599,0.0673,8.7658 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1709,1.1426,0.0695,8.4896 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3190,1.1365,0.0688,8.5668 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6016,1.1568,0.0803,7.3442 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1315,1.1473,0.0942,6.2623 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.5966,1.1526,0.0872,6.7619 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0035,1.1211,0.0891,6.6179 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6041,1.1001,0.0938,6.2909 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,22.9996,1.1915,0.1052,5.6066 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-avx2_medium_results.csv new file mode 100644 index 0000000..30d0fa9 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-avx2_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6788,1.3308,0.1444,4.0837 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9718,1.2419,0.1468,4.0186 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5441,1.2316,0.1664,3.5443 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2539,1.1915,0.1523,3.8726 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.8070,1.4070,0.2038,2.8936 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5734,1.2895,0.1282,4.6017 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2355,1.2640,0.1476,3.9967 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0145,1.3185,0.1529,3.8588 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1600,1.2781,0.1466,4.0226 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0726,1.4164,0.1842,3.2025 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9647,1.2710,0.1405,4.1993 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3761,1.2056,0.1568,3.7628 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2189,1.3018,0.1567,3.7634 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7418,1.2879,0.1563,3.7733 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6244,1.3197,0.1831,3.2218 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7063,1.4084,0.1964,3.0033 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5260,1.3133,0.2032,2.9032 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7863,1.3700,0.2202,2.6789 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6428,1.3536,0.2125,2.7760 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7320,1.4813,0.2352,2.5083 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2488,1.4791,0.2763,2.1345 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3739,1.2939,0.2541,2.3213 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5145,1.3442,0.2447,2.4102 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8213,1.3163,0.2356,2.5036 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0662,1.4208,0.2507,2.3525 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-avx2_thorough_results.csv new file mode 100644 index 0000000..c183da7 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-avx2_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8046,1.4341,0.3128,1.8859 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.2870,1.4288,0.3313,1.7802 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0366,1.4837,0.3558,1.6577 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4315,1.4471,0.3278,1.7991 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9359,1.6164,0.4154,1.4200 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6341,1.4643,0.2961,1.9918 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.4701,1.3905,0.3478,1.6958 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4281,1.4330,0.3458,1.7059 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.2934,1.3835,0.3200,1.8430 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2162,1.5779,0.3878,1.5209 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0203,1.4992,0.3176,1.8573 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.5959,1.4825,0.3756,1.5703 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5641,1.4805,0.3641,1.6201 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8519,1.3886,0.3437,1.7159 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7392,1.5948,0.3975,1.4838 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7624,1.5465,0.4327,1.3630 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7332,1.4920,0.4648,1.2691 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0260,1.5805,0.4770,1.2367 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7389,1.5122,0.4573,1.2899 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8109,1.6077,0.5031,1.1725 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2874,1.7221,0.6042,0.9762 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5439,1.6323,0.5157,1.1437 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7142,1.7504,0.6074,0.9711 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8829,1.7189,0.5919,0.9966 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1100,1.8646,0.6585,0.8958 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse2_fast_results.csv new file mode 100644 index 0000000..e7ee825 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse2_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.5080,1.2932,0.1158,5.0921 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6274,1.2131,0.1116,5.2863 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1770,1.2639,0.1249,4.7215 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.9295,1.2342,0.1132,5.2111 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4914,1.3562,0.1540,3.8304 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4768,1.2776,0.1022,5.7688 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8355,1.1991,0.1019,5.7860 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5182,1.2281,0.1075,5.4867 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9428,1.2212,0.1010,5.8393 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8644,1.3246,0.1301,4.5327 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9048,1.2816,0.1065,5.5388 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9314,1.2195,0.1135,5.1964 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6856,1.2499,0.1134,5.2026 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.5912,1.1652,0.1118,5.2750 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4731,1.3231,0.1289,4.5751 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6207,1.3384,0.1655,3.5637 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.2287,1.2113,0.1685,3.5006 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4704,1.3029,0.1667,3.5389 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5481,1.2245,0.1710,3.4494 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6657,1.3831,0.1847,3.1931 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2102,1.3085,0.2081,2.8345 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1366,1.2560,0.2028,2.9089 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3219,1.3447,0.2056,2.8687 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7291,1.3418,0.2147,2.7472 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0429,1.4330,0.2310,2.5531 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse2_fastest_results.csv new file mode 100644 index 0000000..6823433 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse2_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2760,1.2407,0.0703,8.3899 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2550,1.1703,0.0730,8.0839 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4452,1.1325,0.0730,8.0807 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.7221,1.1320,0.0723,8.1611 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.1407,1.2707,0.0835,7.0633 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3464,1.1649,0.0679,8.6832 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4507,1.1110,0.0678,8.6990 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0634,1.1250,0.0679,8.6922 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.6852,1.1190,0.0672,8.7821 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4869,1.1845,0.0768,7.6763 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8151,1.1699,0.0707,8.3455 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6801,1.1774,0.0695,8.4852 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4491,1.2102,0.0709,8.3198 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3427,1.1980,0.0679,8.6865 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3229,1.2815,0.0767,7.6943 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5249,1.2892,0.1133,5.2064 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8209,1.2120,0.1056,5.5850 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1709,1.2490,0.1082,5.4519 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3190,1.2315,0.1066,5.5353 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6016,1.3357,0.1243,4.7443 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1315,1.3242,0.1407,4.1912 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.5966,1.2422,0.1309,4.5060 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0035,1.2768,0.1337,4.4106 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6041,1.2671,0.1400,4.2122 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,22.9996,1.3577,0.1560,3.7805 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse2_medium_results.csv new file mode 100644 index 0000000..c5c3602 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse2_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6788,1.3551,0.1830,3.2223 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9718,1.2918,0.1873,3.1486 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5441,1.3387,0.2102,2.8063 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2539,1.2525,0.1954,3.0189 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.8070,1.4448,0.2563,2.3017 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5734,1.3465,0.1751,3.3676 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2355,1.2165,0.1960,3.0099 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0145,1.3351,0.1985,2.9710 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1600,1.3003,0.1915,3.0806 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0726,1.4328,0.2341,2.5193 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9647,1.2792,0.1932,3.0527 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3761,1.2528,0.2176,2.7110 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2189,1.3386,0.2184,2.7002 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7418,1.3201,0.2159,2.7323 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6244,1.3581,0.2450,2.4079 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7063,1.3668,0.2790,2.1141 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5260,1.3228,0.2847,2.0716 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7863,1.4284,0.3006,1.9621 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6428,1.4126,0.2935,2.0094 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7320,1.5193,0.3183,1.8529 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2488,1.4538,0.3567,1.6535 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3739,1.4327,0.3341,1.7653 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5145,1.4964,0.3667,1.6084 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8213,1.4719,0.3536,1.6680 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0662,1.5369,0.3736,1.5786 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse2_thorough_results.csv new file mode 100644 index 0000000..4613939 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse2_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8046,1.5705,0.3993,1.4771 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.2870,1.5346,0.4317,1.3663 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0366,1.5909,0.4583,1.2871 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4315,1.4736,0.4275,1.3797 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9359,1.6424,0.5280,1.1171 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6341,1.4908,0.4045,1.4580 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.4701,1.5791,0.4813,1.2256 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4281,1.5305,0.4722,1.2492 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.2934,1.4872,0.4424,1.3333 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2162,1.7306,0.5272,1.1187 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0203,1.5437,0.4539,1.2994 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.5959,1.5693,0.5393,1.0936 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5641,1.6541,0.5253,1.1228 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8519,1.5434,0.5005,1.1786 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7392,1.7501,0.5624,1.0488 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7624,1.8136,0.6415,0.9194 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7332,1.7354,0.6981,0.8449 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0260,1.7616,0.7082,0.8329 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7389,1.8035,0.6832,0.8633 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8109,1.8457,0.7296,0.8084 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2874,1.9842,0.8519,0.6923 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5439,1.8508,0.7586,0.7775 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7142,1.9319,0.8626,0.6837 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8829,1.9216,0.8368,0.7048 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1100,2.0399,0.9151,0.6445 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse4.1_fast_results.csv new file mode 100644 index 0000000..ea884fb --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse4.1_fast_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.5080,1.2665,0.0999,5.9018 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.6274,1.1971,0.0965,6.1127 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.1770,1.2347,0.1085,5.4378 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.9295,1.2091,0.0982,6.0043 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.4914,1.3225,0.1344,4.3886 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.4768,1.2624,0.0848,6.9575 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.8355,1.1841,0.0851,6.9283 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.5182,1.2111,0.0904,6.5268 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.9428,1.2053,0.0844,6.9884 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.8644,1.3151,0.1097,5.3762 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9048,1.2611,0.0891,6.6226 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.9314,1.1940,0.0961,6.1363 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.6856,1.2209,0.0949,6.2159 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.5912,1.1427,0.0948,6.2238 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.4731,1.3215,0.1086,5.4299 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.6207,1.3258,0.1438,4.1016 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.2287,1.2521,0.1443,4.0863 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.4704,1.2471,0.1526,3.8645 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.5481,1.2071,0.1528,3.8595 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6657,1.4031,0.1753,3.3641 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2102,1.4282,0.2132,2.7667 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.1366,1.3350,0.1981,2.9767 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.3219,1.3199,0.1994,2.9574 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.7291,1.3754,0.2208,2.6717 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0429,1.4074,0.2637,2.2367 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse4.1_fastest_results.csv new file mode 100644 index 0000000..2114412 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse4.1_fastest_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.2760,1.1840,0.0629,9.3706 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.2550,1.1440,0.0752,7.8436 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,48.4452,1.1736,0.0739,7.9839 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,51.7221,1.2069,0.0696,8.4791 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.1407,1.2345,0.0801,7.3616 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.3464,1.2680,0.0610,9.6640 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,51.4507,1.1748,0.0662,8.9053 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,45.0634,1.2217,0.0621,9.5044 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,48.6852,1.1409,0.0637,9.2623 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,30.4869,1.2496,0.0731,8.0733 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.8151,1.2821,0.0627,9.4032 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,48.6801,1.1971,0.0681,8.6647 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,42.4491,1.1648,0.0662,8.9059 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.3427,1.1806,0.0567,10.4011 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.3229,1.1835,0.0635,9.2858 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.5249,1.2703,0.0964,6.1168 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,44.8209,1.1889,0.0899,6.5641 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.1709,1.1640,0.0947,6.2306 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.3190,1.2146,0.0922,6.3995 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.6016,1.2284,0.1081,5.4552 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.1315,1.3071,0.1278,4.6151 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,40.5966,1.1804,0.1250,4.7196 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.0035,1.2603,0.1243,4.7444 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.6041,1.2464,0.1275,4.6266 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,22.9996,1.2761,0.1437,4.1035 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse4.1_medium_results.csv new file mode 100644 index 0000000..5ee96f3 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse4.1_medium_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.6788,1.3310,0.1594,3.6995 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,55.9718,1.2502,0.1620,3.6412 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,49.5441,1.3156,0.1818,3.2437 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.2539,1.2925,0.1685,3.5006 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.8070,1.3631,0.2248,2.6239 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.5734,1.3202,0.1465,4.0263 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.2355,1.2597,0.1644,3.5871 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.0145,1.3134,0.1658,3.5583 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.1600,1.2961,0.1651,3.5734 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.0726,1.4413,0.2084,2.8296 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,37.9647,1.3936,0.1809,3.2614 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.3761,1.2790,0.2036,2.8972 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.2189,1.3808,0.2283,2.5831 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.7418,1.2809,0.1809,3.2602 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.6244,1.3956,0.2045,2.8839 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7063,1.3155,0.2374,2.4846 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.5260,1.2699,0.2408,2.4499 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,39.7863,1.3862,0.2545,2.3172 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.6428,1.3273,0.2487,2.3721 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.7320,1.4684,0.2718,2.1700 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2488,1.4879,0.3228,1.8271 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.3739,1.4054,0.3052,1.9328 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.5145,1.4672,0.3325,1.7738 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8213,1.4330,0.3174,1.8581 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.0662,1.4666,0.3395,1.7374 diff --git a/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse4.1_thorough_results.csv new file mode 100644 index 0000000..9fc90bd --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/HDRIHaven/astc_reference-5.0-sse4.1_thorough_results.csv @@ -0,0 +1,26 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +HDRIHaven,4x4,hdr-rgb-arboretum.hdr,45.8046,1.5342,0.3969,1.4859 +HDRIHaven,4x4,hdr-rgb-bellparkpier.hdr,56.2870,1.4863,0.4220,1.3978 +HDRIHaven,4x4,hdr-rgb-canarywharf.hdr,50.0366,1.5331,0.4479,1.3168 +HDRIHaven,4x4,hdr-rgb-eveningroad.hdr,52.4315,1.5737,0.4197,1.4054 +HDRIHaven,4x4,hdr-rgb-riverwalk.hdr,34.9359,1.6700,0.5159,1.1433 +HDRIHaven,5x5,hdr-rgb-arboretum.hdr,41.6341,1.5100,0.3844,1.5344 +HDRIHaven,5x5,hdr-rgb-bellparkpier.hdr,52.4701,1.5200,0.4619,1.2768 +HDRIHaven,5x5,hdr-rgb-canarywharf.hdr,46.4281,1.5296,0.4567,1.2915 +HDRIHaven,5x5,hdr-rgb-eveningroad.hdr,49.2934,1.5667,0.4265,1.3829 +HDRIHaven,5x5,hdr-rgb-riverwalk.hdr,31.2162,1.7486,0.5112,1.1538 +HDRIHaven,6x6,hdr-rgb-arboretum.hdr,38.0203,1.5496,0.4359,1.3530 +HDRIHaven,6x6,hdr-rgb-bellparkpier.hdr,49.5959,1.4660,0.4415,1.3359 +HDRIHaven,6x6,hdr-rgb-canarywharf.hdr,43.5641,1.4529,0.4302,1.3710 +HDRIHaven,6x6,hdr-rgb-eveningroad.hdr,46.8519,1.4134,0.4110,1.4351 +HDRIHaven,6x6,hdr-rgb-riverwalk.hdr,28.7392,1.5354,0.4651,1.2682 +HDRIHaven,8x8,hdr-rgb-arboretum.hdr,33.7624,1.6178,0.5423,1.0877 +HDRIHaven,8x8,hdr-rgb-bellparkpier.hdr,45.7332,1.5885,0.5858,1.0069 +HDRIHaven,8x8,hdr-rgb-canarywharf.hdr,40.0260,1.6894,0.5961,0.9894 +HDRIHaven,8x8,hdr-rgb-eveningroad.hdr,43.7389,1.5827,0.5753,1.0253 +HDRIHaven,8x8,hdr-rgb-riverwalk.hdr,25.8109,1.7769,0.6178,0.9547 +HDRIHaven,12x12,hdr-rgb-arboretum.hdr,30.2874,1.9019,0.7545,0.7817 +HDRIHaven,12x12,hdr-rgb-bellparkpier.hdr,41.5439,1.7447,0.6695,0.8810 +HDRIHaven,12x12,hdr-rgb-canarywharf.hdr,36.7142,1.8530,0.7597,0.7764 +HDRIHaven,12x12,hdr-rgb-eveningroad.hdr,40.8829,1.7567,0.7422,0.7947 +HDRIHaven,12x12,hdr-rgb-riverwalk.hdr,23.1100,1.9763,0.8094,0.7287 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/LDR-L/ldr-l-occlusion.png b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-L/ldr-l-occlusion.png new file mode 100644 index 0000000..d08c259 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-L/ldr-l-occlusion.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGB/ldr-rgb-diffuse.png b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGB/ldr-rgb-diffuse.png new file mode 100644 index 0000000..1f43be4 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGB/ldr-rgb-diffuse.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGB/ldr-rgb-emissive.png b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGB/ldr-rgb-emissive.png new file mode 100644 index 0000000..43ef67b Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGB/ldr-rgb-emissive.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGB/ldr-rgb-metalrough.png b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGB/ldr-rgb-metalrough.png new file mode 100644 index 0000000..684fe98 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGB/ldr-rgb-metalrough.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGB/ldr-rgb-metalrough2.png b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGB/ldr-rgb-metalrough2.png new file mode 100644 index 0000000..c936862 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGB/ldr-rgb-metalrough2.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGBA/ldr-rgba-base.png b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGBA/ldr-rgba-base.png new file mode 100644 index 0000000..5d46455 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGBA/ldr-rgba-base.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGBA/ldr-rgba-diffuse.png b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGBA/ldr-rgba-diffuse.png new file mode 100644 index 0000000..3d4ada6 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGBA/ldr-rgba-diffuse.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGBA/ldr-rgba-specgloss.png b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGBA/ldr-rgba-specgloss.png new file mode 100644 index 0000000..9261c9e Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-RGBA/ldr-rgba-specgloss.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/LDR-XY/ldr-xy-normal1.png b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-XY/ldr-xy-normal1.png new file mode 100644 index 0000000..187a842 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-XY/ldr-xy-normal1.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/LDR-XY/ldr-xy-normal2.png b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-XY/ldr-xy-normal2.png new file mode 100644 index 0000000..faf95b6 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Khronos/LDR-XY/ldr-xy-normal2.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/LICENSE.txt b/ktx/external/astc-encoder/Test/Images/Khronos/LICENSE.txt new file mode 100644 index 0000000..ae73e9d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/LICENSE.txt @@ -0,0 +1,28 @@ +Images in this test directory are extracts of images from the KhronosGroup +glTF-Asset-Generator test suite and are MIT licensed. + +* Source: https://github.com/KhronosGroup/glTF-Asset-Generator/ + +------------------------------------------------------------------------------- + +MIT License + +Copyright (c) 2017 Khronos Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-1.7_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-1.7_fast_results.csv new file mode 100644 index 0000000..c681e06 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-1.7_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,61.3102,0.1772,0.1455,7.2087 +Khronos,4x4,ldr-rgb-diffuse.png,51.8017,1.3552,1.1448,3.6636 +Khronos,4x4,ldr-rgb-emissive.png,58.2838,0.1023,0.0641,16.3569 +Khronos,4x4,ldr-rgb-metalrough.png,44.0711,0.9713,0.9187,1.1414 +Khronos,4x4,ldr-rgb-metalrough2.png,42.7515,5.7704,5.5415,0.7569 +Khronos,4x4,ldr-rgba-base.png,42.8303,1.1711,1.1080,0.9464 +Khronos,4x4,ldr-rgba-diffuse.png,43.4186,0.8835,0.8232,1.2738 +Khronos,4x4,ldr-rgba-specgloss.png,41.4435,1.7664,1.6975,0.6177 +Khronos,4x4,ldr-xy-normal1.png,44.9142,0.9345,0.8677,1.2085 +Khronos,4x4,ldr-xy-normal2.png,48.4027,1.8090,1.5800,2.6546 +Khronos,5x5,ldr-l-occlusion.png,53.9369,0.1375,0.1062,9.8711 +Khronos,5x5,ldr-rgb-diffuse.png,47.2790,0.9785,0.7703,5.4454 +Khronos,5x5,ldr-rgb-emissive.png,52.1360,0.0940,0.0552,18.9953 +Khronos,5x5,ldr-rgb-metalrough.png,39.4881,0.6844,0.6303,1.6636 +Khronos,5x5,ldr-rgb-metalrough2.png,37.5581,5.2746,5.0429,0.8317 +Khronos,5x5,ldr-rgba-base.png,38.4063,0.7437,0.6806,1.5407 +Khronos,5x5,ldr-rgba-diffuse.png,38.7333,0.7512,0.6916,1.5162 +Khronos,5x5,ldr-rgba-specgloss.png,38.1138,1.0267,0.9602,1.0920 +Khronos,5x5,ldr-xy-normal1.png,41.6973,0.6942,0.6276,1.6706 +Khronos,5x5,ldr-xy-normal2.png,46.1758,1.3052,1.0724,3.9110 +Khronos,6x6,ldr-l-occlusion.png,47.9269,0.1328,0.1016,10.3234 +Khronos,6x6,ldr-rgb-diffuse.png,43.0337,1.2743,1.0587,3.9619 +Khronos,6x6,ldr-rgb-emissive.png,49.0509,0.1186,0.0809,12.9587 +Khronos,6x6,ldr-rgb-metalrough.png,36.3192,1.0106,0.9574,1.0953 +Khronos,6x6,ldr-rgb-metalrough2.png,35.0982,6.6330,6.3890,0.6565 +Khronos,6x6,ldr-rgba-base.png,35.9127,1.0318,0.9690,1.0821 +Khronos,6x6,ldr-rgba-diffuse.png,35.9648,1.1871,1.1273,0.9302 +Khronos,6x6,ldr-rgba-specgloss.png,35.8939,1.2648,1.1988,0.8747 +Khronos,6x6,ldr-xy-normal1.png,39.2718,0.8172,0.7502,1.3977 +Khronos,6x6,ldr-xy-normal2.png,43.9674,1.4075,1.1770,3.5636 +Khronos,8x8,ldr-l-occlusion.png,43.9164,0.1348,0.1039,10.0907 +Khronos,8x8,ldr-rgb-diffuse.png,38.0475,1.0903,0.8821,4.7547 +Khronos,8x8,ldr-rgb-emissive.png,44.3284,0.1198,0.0817,12.8362 +Khronos,8x8,ldr-rgb-metalrough.png,32.2970,0.8726,0.8192,1.2800 +Khronos,8x8,ldr-rgb-metalrough2.png,32.0777,3.2219,2.9939,1.4009 +Khronos,8x8,ldr-rgba-base.png,32.2658,0.9873,0.9240,1.1348 +Khronos,8x8,ldr-rgba-diffuse.png,32.0795,1.1389,1.0796,0.9713 +Khronos,8x8,ldr-rgba-specgloss.png,32.8319,0.9267,0.8595,1.2200 +Khronos,8x8,ldr-xy-normal1.png,35.8442,0.6515,0.5844,1.7944 +Khronos,8x8,ldr-xy-normal2.png,40.3931,1.4308,1.1986,3.4995 +Khronos,12x12,ldr-l-occlusion.png,39.0755,0.1013,0.0696,15.0718 +Khronos,12x12,ldr-rgb-diffuse.png,33.1946,0.5905,0.3814,10.9980 +Khronos,12x12,ldr-rgb-emissive.png,38.8643,0.0915,0.0532,19.7004 +Khronos,12x12,ldr-rgb-metalrough.png,28.5775,0.3484,0.2966,3.5354 +Khronos,12x12,ldr-rgb-metalrough2.png,29.0596,0.9177,0.6906,6.0731 +Khronos,12x12,ldr-rgba-base.png,29.0155,0.4699,0.4072,2.5750 +Khronos,12x12,ldr-rgba-diffuse.png,28.5403,0.4781,0.4184,2.5062 +Khronos,12x12,ldr-rgba-specgloss.png,29.6883,0.3778,0.3101,3.3813 +Khronos,12x12,ldr-xy-normal1.png,32.1082,0.4384,0.3714,2.8235 +Khronos,12x12,ldr-xy-normal2.png,35.7519,1.0944,0.8659,4.8438 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-1.7_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-1.7_fastest_results.csv new file mode 100644 index 0000000..cc1c563 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-1.7_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,61.3102,0.1781,0.1466,7.1529 +Khronos,4x4,ldr-rgb-diffuse.png,51.8017,1.3690,1.1587,3.6198 +Khronos,4x4,ldr-rgb-emissive.png,58.2838,0.1039,0.0654,16.0242 +Khronos,4x4,ldr-rgb-metalrough.png,44.0711,0.9842,0.9305,1.1269 +Khronos,4x4,ldr-rgb-metalrough2.png,42.7515,5.8451,5.6142,0.7471 +Khronos,4x4,ldr-rgba-base.png,42.8303,1.1678,1.1040,0.9498 +Khronos,4x4,ldr-rgba-diffuse.png,43.4186,0.8781,0.8177,1.2823 +Khronos,4x4,ldr-rgba-specgloss.png,41.4435,1.7545,1.6874,0.6214 +Khronos,4x4,ldr-xy-normal1.png,44.9142,0.9410,0.8728,1.2014 +Khronos,4x4,ldr-xy-normal2.png,48.4027,1.8060,1.5785,2.6571 +Khronos,5x5,ldr-l-occlusion.png,53.9369,0.1403,0.1085,9.6610 +Khronos,5x5,ldr-rgb-diffuse.png,47.2790,0.9828,0.7718,5.4345 +Khronos,5x5,ldr-rgb-emissive.png,52.1360,0.0929,0.0543,19.3186 +Khronos,5x5,ldr-rgb-metalrough.png,39.4881,0.6836,0.6304,1.6635 +Khronos,5x5,ldr-rgb-metalrough2.png,37.5581,5.2910,5.0645,0.8282 +Khronos,5x5,ldr-rgba-base.png,38.4063,0.7496,0.6851,1.5306 +Khronos,5x5,ldr-rgba-diffuse.png,38.7333,0.7512,0.6906,1.5184 +Khronos,5x5,ldr-rgba-specgloss.png,38.1138,1.0222,0.9543,1.0987 +Khronos,5x5,ldr-xy-normal1.png,41.6973,0.6993,0.6325,1.6579 +Khronos,5x5,ldr-xy-normal2.png,46.1758,1.2969,1.0688,3.9243 +Khronos,6x6,ldr-l-occlusion.png,47.9269,0.1336,0.1022,10.2647 +Khronos,6x6,ldr-rgb-diffuse.png,43.0337,1.2802,1.0629,3.9463 +Khronos,6x6,ldr-rgb-emissive.png,49.0509,0.1208,0.0809,12.9555 +Khronos,6x6,ldr-rgb-metalrough.png,36.3192,1.0104,0.9568,1.0959 +Khronos,6x6,ldr-rgb-metalrough2.png,35.0982,6.4172,6.1892,0.6777 +Khronos,6x6,ldr-rgba-base.png,35.9127,1.0299,0.9653,1.0863 +Khronos,6x6,ldr-rgba-diffuse.png,35.9648,1.2004,1.1403,0.9196 +Khronos,6x6,ldr-rgba-specgloss.png,35.8939,1.2600,1.1918,0.8798 +Khronos,6x6,ldr-xy-normal1.png,39.2718,0.8233,0.7569,1.3854 +Khronos,6x6,ldr-xy-normal2.png,43.9674,1.4185,1.1825,3.5471 +Khronos,8x8,ldr-l-occlusion.png,43.9164,0.1377,0.1054,9.9481 +Khronos,8x8,ldr-rgb-diffuse.png,38.0475,1.0942,0.8832,4.7492 +Khronos,8x8,ldr-rgb-emissive.png,44.3284,0.1207,0.0819,12.7983 +Khronos,8x8,ldr-rgb-metalrough.png,32.2970,0.8784,0.8255,1.2702 +Khronos,8x8,ldr-rgb-metalrough2.png,32.0777,3.2253,2.9993,1.3984 +Khronos,8x8,ldr-rgba-base.png,32.2658,0.9915,0.9274,1.1307 +Khronos,8x8,ldr-rgba-diffuse.png,32.0795,1.1531,1.0932,0.9592 +Khronos,8x8,ldr-rgba-specgloss.png,32.8319,0.9491,0.8832,1.1873 +Khronos,8x8,ldr-xy-normal1.png,35.8442,0.6515,0.5841,1.7951 +Khronos,8x8,ldr-xy-normal2.png,40.3931,1.4465,1.2154,3.4510 +Khronos,12x12,ldr-l-occlusion.png,39.0755,0.1029,0.0716,14.6521 +Khronos,12x12,ldr-rgb-diffuse.png,33.1946,0.5911,0.3812,11.0042 +Khronos,12x12,ldr-rgb-emissive.png,38.8643,0.0922,0.0533,19.6694 +Khronos,12x12,ldr-rgb-metalrough.png,28.5775,0.3505,0.2964,3.5374 +Khronos,12x12,ldr-rgb-metalrough2.png,29.0596,0.9205,0.6945,6.0393 +Khronos,12x12,ldr-rgba-base.png,29.0155,0.4679,0.4047,2.5907 +Khronos,12x12,ldr-rgba-diffuse.png,28.5403,0.4780,0.4177,2.5106 +Khronos,12x12,ldr-rgba-specgloss.png,29.6883,0.3827,0.3159,3.3198 +Khronos,12x12,ldr-xy-normal1.png,32.1082,0.4474,0.3797,2.7618 +Khronos,12x12,ldr-xy-normal2.png,35.7519,1.0881,0.8598,4.8781 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-1.7_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-1.7_medium_results.csv new file mode 100644 index 0000000..6d7d4b1 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-1.7_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,65.7725,0.2416,0.2108,4.9747 +Khronos,4x4,ldr-rgb-diffuse.png,54.1801,4.3490,4.1331,1.0148 +Khronos,4x4,ldr-rgb-emissive.png,59.8256,0.3120,0.2742,3.8241 +Khronos,4x4,ldr-rgb-metalrough.png,44.8297,4.8904,4.8386,0.2167 +Khronos,4x4,ldr-rgb-metalrough2.png,43.7561,31.3881,31.1618,0.1346 +Khronos,4x4,ldr-rgba-base.png,43.8031,5.7156,5.6530,0.1855 +Khronos,4x4,ldr-rgba-diffuse.png,44.1847,3.6726,3.6123,0.2903 +Khronos,4x4,ldr-rgba-specgloss.png,42.2813,8.1809,8.1149,0.1292 +Khronos,4x4,ldr-xy-normal1.png,46.6393,4.2150,4.1485,0.2528 +Khronos,4x4,ldr-xy-normal2.png,50.1793,8.8935,8.6674,0.4839 +Khronos,5x5,ldr-l-occlusion.png,56.8362,0.2630,0.2319,4.5208 +Khronos,5x5,ldr-rgb-diffuse.png,49.1166,4.2017,3.9897,1.0513 +Khronos,5x5,ldr-rgb-emissive.png,55.4557,0.3548,0.3179,3.2984 +Khronos,5x5,ldr-rgb-metalrough.png,40.2769,5.4787,5.4257,0.1933 +Khronos,5x5,ldr-rgb-metalrough2.png,39.0783,37.1835,36.9464,0.1135 +Khronos,5x5,ldr-rgba-base.png,39.4634,6.3154,6.2514,0.1677 +Khronos,5x5,ldr-rgba-diffuse.png,39.6336,4.2481,4.1861,0.2505 +Khronos,5x5,ldr-rgba-specgloss.png,38.7996,9.4766,9.4104,0.1114 +Khronos,5x5,ldr-xy-normal1.png,43.1318,4.2023,4.1362,0.2535 +Khronos,5x5,ldr-xy-normal2.png,47.3136,5.2207,4.9792,0.8424 +Khronos,6x6,ldr-l-occlusion.png,50.1740,0.3850,0.3532,2.9685 +Khronos,6x6,ldr-rgb-diffuse.png,45.0542,6.0704,5.8519,0.7167 +Khronos,6x6,ldr-rgb-emissive.png,51.6448,0.4428,0.4052,2.5879 +Khronos,6x6,ldr-rgb-metalrough.png,36.8730,5.3017,5.2494,0.1998 +Khronos,6x6,ldr-rgb-metalrough2.png,36.4906,33.8889,33.6617,0.1246 +Khronos,6x6,ldr-rgba-base.png,36.7148,5.7871,5.7229,0.1832 +Khronos,6x6,ldr-rgba-diffuse.png,36.5789,5.5268,5.4678,0.1918 +Khronos,6x6,ldr-rgba-specgloss.png,36.5177,8.5151,8.4478,0.1241 +Khronos,6x6,ldr-xy-normal1.png,40.5994,3.5512,3.4834,0.3010 +Khronos,6x6,ldr-xy-normal2.png,45.2291,3.4256,3.1991,1.3111 +Khronos,8x8,ldr-l-occlusion.png,45.1964,0.3202,0.2882,3.6378 +Khronos,8x8,ldr-rgb-diffuse.png,40.2552,7.4345,7.2272,0.5803 +Khronos,8x8,ldr-rgb-emissive.png,46.7794,0.5106,0.4731,2.2166 +Khronos,8x8,ldr-rgb-metalrough.png,32.7782,5.7990,5.7461,0.1825 +Khronos,8x8,ldr-rgb-metalrough2.png,33.2171,31.4575,31.2320,0.1343 +Khronos,8x8,ldr-rgba-base.png,33.1396,5.3741,5.3111,0.1974 +Khronos,8x8,ldr-rgba-diffuse.png,32.6696,7.1488,7.0874,0.1479 +Khronos,8x8,ldr-rgba-specgloss.png,33.5323,7.3640,7.2967,0.1437 +Khronos,8x8,ldr-xy-normal1.png,37.1178,3.0859,3.0190,0.3473 +Khronos,8x8,ldr-xy-normal2.png,42.0253,3.3776,3.1487,1.3321 +Khronos,12x12,ldr-l-occlusion.png,41.6022,0.2110,0.1799,5.8273 +Khronos,12x12,ldr-rgb-diffuse.png,35.5423,3.0495,2.8393,1.4772 +Khronos,12x12,ldr-rgb-emissive.png,41.3036,0.3907,0.3536,2.9651 +Khronos,12x12,ldr-rgb-metalrough.png,29.1147,3.3625,3.3101,0.3168 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1232,12.0596,11.8319,0.3545 +Khronos,12x12,ldr-rgba-base.png,29.5585,2.8406,2.7770,0.3776 +Khronos,12x12,ldr-rgba-diffuse.png,29.0794,5.0453,4.9805,0.2105 +Khronos,12x12,ldr-rgba-specgloss.png,30.4257,3.1904,3.1247,0.3356 +Khronos,12x12,ldr-xy-normal1.png,32.9807,1.8065,1.7373,0.6036 +Khronos,12x12,ldr-xy-normal2.png,37.6377,2.9692,2.7401,1.5307 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-1.7_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-1.7_thorough_results.csv new file mode 100644 index 0000000..5fd280d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-1.7_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,70.7070,0.6738,0.6431,1.6305 +Khronos,4x4,ldr-rgb-diffuse.png,54.8558,30.4744,30.2608,0.1386 +Khronos,4x4,ldr-rgb-emissive.png,60.9372,0.8322,0.7952,1.3186 +Khronos,4x4,ldr-rgb-metalrough.png,44.9799,10.6853,10.6329,0.0986 +Khronos,4x4,ldr-rgb-metalrough2.png,44.1245,61.6222,61.3960,0.0683 +Khronos,4x4,ldr-rgba-base.png,44.0794,13.1965,13.1332,0.0798 +Khronos,4x4,ldr-rgba-diffuse.png,44.4729,8.6496,8.5881,0.1221 +Khronos,4x4,ldr-rgba-specgloss.png,42.4777,18.0403,17.9736,0.0583 +Khronos,4x4,ldr-xy-normal1.png,46.9558,13.9609,13.8922,0.0755 +Khronos,4x4,ldr-xy-normal2.png,50.8233,30.2494,30.0213,0.1397 +Khronos,5x5,ldr-l-occlusion.png,58.5903,1.2576,1.2269,0.8546 +Khronos,5x5,ldr-rgb-diffuse.png,49.9048,21.0048,20.7662,0.2020 +Khronos,5x5,ldr-rgb-emissive.png,56.3055,1.0577,1.0204,1.0276 +Khronos,5x5,ldr-rgb-metalrough.png,40.5058,13.3510,13.2965,0.0789 +Khronos,5x5,ldr-rgb-metalrough2.png,39.5882,72.3450,72.1186,0.0582 +Khronos,5x5,ldr-rgba-base.png,39.8452,14.9836,14.9207,0.0703 +Khronos,5x5,ldr-rgba-diffuse.png,39.9866,9.8632,9.8038,0.1070 +Khronos,5x5,ldr-rgba-specgloss.png,39.0599,20.6708,20.6036,0.0509 +Khronos,5x5,ldr-xy-normal1.png,43.6571,18.1796,18.1125,0.0579 +Khronos,5x5,ldr-xy-normal2.png,48.0257,51.8060,51.5775,0.0813 +Khronos,6x6,ldr-l-occlusion.png,52.1129,2.4145,2.3840,0.4398 +Khronos,6x6,ldr-rgb-diffuse.png,45.8094,21.9278,21.7183,0.1931 +Khronos,6x6,ldr-rgb-emissive.png,52.7569,1.2146,1.1770,0.8909 +Khronos,6x6,ldr-rgb-metalrough.png,37.0622,15.2526,15.1998,0.0690 +Khronos,6x6,ldr-rgb-metalrough2.png,36.8307,81.0488,80.8222,0.0519 +Khronos,6x6,ldr-rgba-base.png,36.9443,19.3240,19.2574,0.0545 +Khronos,6x6,ldr-rgba-diffuse.png,36.7760,13.4944,13.4309,0.0781 +Khronos,6x6,ldr-rgba-specgloss.png,36.7106,22.0400,21.9744,0.0477 +Khronos,6x6,ldr-xy-normal1.png,41.0679,13.2597,13.1934,0.0795 +Khronos,6x6,ldr-xy-normal2.png,45.9061,29.3687,29.1375,0.1439 +Khronos,8x8,ldr-l-occlusion.png,46.0348,1.9711,1.9407,0.5403 +Khronos,8x8,ldr-rgb-diffuse.png,40.9223,20.1581,19.9494,0.2102 +Khronos,8x8,ldr-rgb-emissive.png,47.8032,1.0438,1.0062,1.0421 +Khronos,8x8,ldr-rgb-metalrough.png,32.9188,14.7474,14.6943,0.0714 +Khronos,8x8,ldr-rgb-metalrough2.png,33.6572,81.7089,81.4810,0.0515 +Khronos,8x8,ldr-rgba-base.png,33.3326,20.3867,20.3194,0.0516 +Khronos,8x8,ldr-rgba-diffuse.png,32.8038,15.6834,15.6235,0.0671 +Khronos,8x8,ldr-rgba-specgloss.png,33.7018,22.1764,22.1103,0.0474 +Khronos,8x8,ldr-xy-normal1.png,37.5642,7.3789,7.3123,0.1434 +Khronos,8x8,ldr-xy-normal2.png,42.5393,8.2413,8.0119,0.5235 +Khronos,12x12,ldr-l-occlusion.png,42.3583,0.8327,0.8014,1.3085 +Khronos,12x12,ldr-rgb-diffuse.png,36.6054,17.0708,16.8600,0.2488 +Khronos,12x12,ldr-rgb-emissive.png,42.4104,1.1875,1.1494,0.9123 +Khronos,12x12,ldr-rgb-metalrough.png,29.3191,13.3601,13.3074,0.0788 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7865,68.3450,68.1152,0.0616 +Khronos,12x12,ldr-rgba-base.png,29.9177,14.7319,14.6696,0.0715 +Khronos,12x12,ldr-rgba-diffuse.png,29.2903,14.0364,13.9768,0.0750 +Khronos,12x12,ldr-rgba-specgloss.png,30.7263,18.9312,18.8641,0.0556 +Khronos,12x12,ldr-xy-normal1.png,33.5785,6.1576,6.0898,0.1722 +Khronos,12x12,ldr-xy-normal2.png,38.3760,7.0640,6.8323,0.6139 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-avx2_fast_results.csv new file mode 100644 index 0000000..307fc8c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-avx2_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,60.4151,0.0496,0.0239,43.8660 +Khronos,4x4,ldr-rgb-diffuse.png,52.4596,0.2954,0.1478,28.3767 +Khronos,4x4,ldr-rgb-emissive.png,58.2803,0.0508,0.0221,47.4019 +Khronos,4x4,ldr-rgb-metalrough.png,44.0910,0.1592,0.1160,9.0356 +Khronos,4x4,ldr-rgb-metalrough2.png,42.7375,0.9243,0.7586,5.5287 +Khronos,4x4,ldr-rgba-base.png,42.8411,0.2036,0.1540,6.8090 +Khronos,4x4,ldr-rgba-diffuse.png,43.4515,0.1619,0.1145,9.1582 +Khronos,4x4,ldr-rgba-specgloss.png,41.4338,0.2752,0.2224,4.7139 +Khronos,4x4,ldr-xy-normal1.png,44.7064,0.1744,0.1225,8.5606 +Khronos,4x4,ldr-xy-normal2.png,48.2326,0.3723,0.2102,19.9525 +Khronos,5x5,ldr-l-occlusion.png,53.8051,0.0459,0.0193,54.1925 +Khronos,5x5,ldr-rgb-diffuse.png,47.0733,0.2681,0.1203,34.8558 +Khronos,5x5,ldr-rgb-emissive.png,52.5256,0.0465,0.0174,60.1697 +Khronos,5x5,ldr-rgb-metalrough.png,39.4854,0.1359,0.0932,11.2514 +Khronos,5x5,ldr-rgb-metalrough2.png,37.5447,0.8543,0.6865,6.1099 +Khronos,5x5,ldr-rgba-base.png,38.4172,0.1527,0.1028,10.2018 +Khronos,5x5,ldr-rgba-diffuse.png,38.7078,0.1535,0.1046,10.0206 +Khronos,5x5,ldr-rgba-specgloss.png,38.1294,0.1925,0.1394,7.5196 +Khronos,5x5,ldr-xy-normal1.png,41.6008,0.1472,0.0953,11.0023 +Khronos,5x5,ldr-xy-normal2.png,46.0206,0.3198,0.1570,26.7211 +Khronos,6x6,ldr-l-occlusion.png,48.3348,0.0487,0.0208,50.3347 +Khronos,6x6,ldr-rgb-diffuse.png,43.1892,0.3089,0.1589,26.3940 +Khronos,6x6,ldr-rgb-emissive.png,48.8751,0.0481,0.0179,58.5571 +Khronos,6x6,ldr-rgb-metalrough.png,36.2921,0.1588,0.1147,9.1427 +Khronos,6x6,ldr-rgb-metalrough2.png,35.0937,0.9012,0.7345,5.7108 +Khronos,6x6,ldr-rgba-base.png,35.8503,0.1755,0.1244,8.4262 +Khronos,6x6,ldr-rgba-diffuse.png,35.9027,0.1859,0.1365,7.6844 +Khronos,6x6,ldr-rgba-specgloss.png,35.9402,0.2089,0.1543,6.7946 +Khronos,6x6,ldr-xy-normal1.png,39.2714,0.1566,0.1034,10.1398 +Khronos,6x6,ldr-xy-normal2.png,43.9713,0.3346,0.1714,24.4688 +Khronos,8x8,ldr-l-occlusion.png,43.8215,0.0521,0.0198,53.0141 +Khronos,8x8,ldr-rgb-diffuse.png,38.3118,0.3136,0.1605,26.1391 +Khronos,8x8,ldr-rgb-emissive.png,44.3832,0.0520,0.0171,61.1800 +Khronos,8x8,ldr-rgb-metalrough.png,32.1965,0.1785,0.1300,8.0631 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1223,0.6671,0.4976,8.4285 +Khronos,8x8,ldr-rgba-base.png,32.1878,0.1884,0.1327,7.8992 +Khronos,8x8,ldr-rgba-diffuse.png,31.9979,0.2144,0.1609,6.5174 +Khronos,8x8,ldr-rgba-specgloss.png,32.7788,0.2024,0.1428,7.3428 +Khronos,8x8,ldr-xy-normal1.png,36.0796,0.1471,0.0883,11.8760 +Khronos,8x8,ldr-xy-normal2.png,40.6006,0.3432,0.1779,23.5768 +Khronos,12x12,ldr-l-occlusion.png,40.4147,0.0590,0.0187,56.2058 +Khronos,12x12,ldr-rgb-diffuse.png,33.4769,0.2687,0.1051,39.9002 +Khronos,12x12,ldr-rgb-emissive.png,39.3530,0.0582,0.0154,68.2492 +Khronos,12x12,ldr-rgb-metalrough.png,28.6260,0.1217,0.0653,16.0665 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2121,0.3865,0.2076,20.2064 +Khronos,12x12,ldr-rgba-base.png,29.0517,0.1457,0.0814,12.8870 +Khronos,12x12,ldr-rgba-diffuse.png,28.5908,0.1565,0.0948,11.0647 +Khronos,12x12,ldr-rgba-specgloss.png,29.8334,0.1324,0.0661,15.8558 +Khronos,12x12,ldr-xy-normal1.png,32.2941,0.1322,0.0663,15.8123 +Khronos,12x12,ldr-xy-normal2.png,35.9760,0.3391,0.1697,24.7151 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-avx2_fastest_results.csv new file mode 100644 index 0000000..442fb3e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-avx2_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,57.4113,0.0469,0.0198,53.0013 +Khronos,4x4,ldr-rgb-diffuse.png,51.2509,0.2714,0.1239,33.8649 +Khronos,4x4,ldr-rgb-emissive.png,55.6511,0.0462,0.0175,60.0662 +Khronos,4x4,ldr-rgb-metalrough.png,41.6529,0.0969,0.0540,19.4141 +Khronos,4x4,ldr-rgb-metalrough2.png,38.5529,0.5601,0.3941,10.6427 +Khronos,4x4,ldr-rgba-base.png,39.7178,0.1116,0.0619,16.9303 +Khronos,4x4,ldr-rgba-diffuse.png,40.1672,0.1083,0.0603,17.3784 +Khronos,4x4,ldr-rgba-specgloss.png,39.5239,0.1228,0.0687,15.2629 +Khronos,4x4,ldr-xy-normal1.png,42.1115,0.1332,0.0808,12.9783 +Khronos,4x4,ldr-xy-normal2.png,47.0197,0.3154,0.1550,27.0609 +Khronos,5x5,ldr-l-occlusion.png,51.3929,0.0439,0.0178,59.0017 +Khronos,5x5,ldr-rgb-diffuse.png,46.0180,0.2438,0.0960,43.6779 +Khronos,5x5,ldr-rgb-emissive.png,49.9390,0.0430,0.0143,73.5841 +Khronos,5x5,ldr-rgb-metalrough.png,38.5800,0.0769,0.0331,31.6810 +Khronos,5x5,ldr-rgb-metalrough2.png,36.1402,0.3098,0.1443,29.0704 +Khronos,5x5,ldr-rgba-base.png,37.3085,0.0893,0.0390,26.8934 +Khronos,5x5,ldr-rgba-diffuse.png,37.6059,0.0876,0.0393,26.6984 +Khronos,5x5,ldr-rgba-specgloss.png,37.1049,0.0933,0.0396,26.4498 +Khronos,5x5,ldr-xy-normal1.png,39.7042,0.0921,0.0393,26.6644 +Khronos,5x5,ldr-xy-normal2.png,44.4611,0.2775,0.1152,36.3969 +Khronos,6x6,ldr-l-occlusion.png,46.3544,0.0427,0.0158,66.3065 +Khronos,6x6,ldr-rgb-diffuse.png,40.2178,0.2393,0.0848,49.4582 +Khronos,6x6,ldr-rgb-emissive.png,46.2986,0.0418,0.0123,85.2021 +Khronos,6x6,ldr-rgb-metalrough.png,34.9135,0.0747,0.0308,34.0069 +Khronos,6x6,ldr-rgb-metalrough2.png,33.6206,0.2861,0.1182,35.4897 +Khronos,6x6,ldr-rgba-base.png,34.7163,0.0882,0.0363,28.8476 +Khronos,6x6,ldr-rgba-diffuse.png,34.4734,0.0867,0.0372,28.1847 +Khronos,6x6,ldr-rgba-specgloss.png,34.5265,0.0905,0.0357,29.3348 +Khronos,6x6,ldr-xy-normal1.png,37.6450,0.0885,0.0353,29.7181 +Khronos,6x6,ldr-xy-normal2.png,42.1188,0.2709,0.1092,38.4241 +Khronos,8x8,ldr-l-occlusion.png,41.2438,0.0446,0.0136,77.1019 +Khronos,8x8,ldr-rgb-diffuse.png,35.8787,0.2217,0.0713,58.8509 +Khronos,8x8,ldr-rgb-emissive.png,41.0813,0.0431,0.0095,110.0750 +Khronos,8x8,ldr-rgb-metalrough.png,31.0515,0.0745,0.0271,38.7613 +Khronos,8x8,ldr-rgb-metalrough2.png,30.9068,0.2499,0.0826,50.7743 +Khronos,8x8,ldr-rgba-base.png,31.2069,0.0892,0.0345,30.3556 +Khronos,8x8,ldr-rgba-diffuse.png,30.9071,0.0846,0.0312,33.5695 +Khronos,8x8,ldr-rgba-specgloss.png,31.5986,0.0873,0.0296,35.4139 +Khronos,8x8,ldr-xy-normal1.png,34.3389,0.0869,0.0306,34.2874 +Khronos,8x8,ldr-xy-normal2.png,38.1324,0.2627,0.0995,42.1666 +Khronos,12x12,ldr-l-occlusion.png,37.8314,0.0490,0.0129,81.4046 +Khronos,12x12,ldr-rgb-diffuse.png,32.6027,0.2306,0.0709,59.1589 +Khronos,12x12,ldr-rgb-emissive.png,36.0957,0.0473,0.0085,122.7716 +Khronos,12x12,ldr-rgb-metalrough.png,27.9574,0.0718,0.0186,56.2331 +Khronos,12x12,ldr-rgb-metalrough2.png,28.2161,0.2499,0.0745,56.2683 +Khronos,12x12,ldr-rgba-base.png,28.2305,0.0804,0.0198,52.8726 +Khronos,12x12,ldr-rgba-diffuse.png,27.8536,0.0766,0.0179,58.4948 +Khronos,12x12,ldr-rgba-specgloss.png,29.2324,0.0824,0.0190,55.2581 +Khronos,12x12,ldr-xy-normal1.png,30.2168,0.0846,0.0232,45.2441 +Khronos,12x12,ldr-xy-normal2.png,33.6811,0.2547,0.0824,50.9166 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-avx2_medium_results.csv new file mode 100644 index 0000000..6ebfc0a --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-avx2_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,66.7868,0.0681,0.0423,24.8085 +Khronos,4x4,ldr-rgb-diffuse.png,53.7691,0.6384,0.4902,8.5565 +Khronos,4x4,ldr-rgb-emissive.png,59.7142,0.0742,0.0461,22.7575 +Khronos,4x4,ldr-rgb-metalrough.png,44.7803,0.5633,0.5196,2.0180 +Khronos,4x4,ldr-rgb-metalrough2.png,43.6506,3.6612,3.4936,1.2006 +Khronos,4x4,ldr-rgba-base.png,43.7092,0.6640,0.6149,1.7053 +Khronos,4x4,ldr-rgba-diffuse.png,44.1135,0.4654,0.4174,2.5122 +Khronos,4x4,ldr-rgba-specgloss.png,42.2242,0.9009,0.8478,1.2368 +Khronos,4x4,ldr-xy-normal1.png,46.4185,0.5102,0.4590,2.2847 +Khronos,4x4,ldr-xy-normal2.png,49.9984,1.1129,0.9525,4.4036 +Khronos,5x5,ldr-l-occlusion.png,56.4406,0.0683,0.0409,25.6207 +Khronos,5x5,ldr-rgb-diffuse.png,48.5255,0.6021,0.4514,9.2909 +Khronos,5x5,ldr-rgb-emissive.png,55.1706,0.0736,0.0438,23.9275 +Khronos,5x5,ldr-rgb-metalrough.png,40.1843,0.5864,0.5418,1.9353 +Khronos,5x5,ldr-rgb-metalrough2.png,38.9751,3.9658,3.7986,1.1042 +Khronos,5x5,ldr-rgba-base.png,39.3544,0.6843,0.6339,1.6543 +Khronos,5x5,ldr-rgba-diffuse.png,39.5225,0.5125,0.4637,2.2611 +Khronos,5x5,ldr-rgba-specgloss.png,38.7348,0.9786,0.9239,1.1349 +Khronos,5x5,ldr-xy-normal1.png,42.9057,0.4928,0.4408,2.3789 +Khronos,5x5,ldr-xy-normal2.png,47.0106,0.7260,0.5637,7.4407 +Khronos,6x6,ldr-l-occlusion.png,50.1342,0.0786,0.0501,20.9250 +Khronos,6x6,ldr-rgb-diffuse.png,44.5662,0.7587,0.6072,6.9080 +Khronos,6x6,ldr-rgb-emissive.png,51.3050,0.0814,0.0504,20.8141 +Khronos,6x6,ldr-rgb-metalrough.png,36.7702,0.5824,0.5380,1.9491 +Khronos,6x6,ldr-rgb-metalrough2.png,36.3558,3.5828,3.4119,1.2293 +Khronos,6x6,ldr-rgba-base.png,36.5529,0.6277,0.5752,1.8229 +Khronos,6x6,ldr-rgba-diffuse.png,36.4219,0.6057,0.5551,1.8891 +Khronos,6x6,ldr-rgba-specgloss.png,36.4361,0.9109,0.8549,1.2266 +Khronos,6x6,ldr-xy-normal1.png,40.3826,0.4205,0.3655,2.8689 +Khronos,6x6,ldr-xy-normal2.png,44.9515,0.5206,0.3567,11.7596 +Khronos,8x8,ldr-l-occlusion.png,45.0010,0.0840,0.0503,20.8581 +Khronos,8x8,ldr-rgb-diffuse.png,39.7364,0.9170,0.7640,5.4896 +Khronos,8x8,ldr-rgb-emissive.png,46.4668,0.0971,0.0610,17.1932 +Khronos,8x8,ldr-rgb-metalrough.png,32.5602,0.6592,0.6096,1.7201 +Khronos,8x8,ldr-rgb-metalrough2.png,33.0559,3.4611,3.2920,1.2741 +Khronos,8x8,ldr-rgba-base.png,32.8810,0.6368,0.5804,1.8067 +Khronos,8x8,ldr-rgba-diffuse.png,32.4614,0.7848,0.7295,1.4374 +Khronos,8x8,ldr-rgba-specgloss.png,33.2614,0.8745,0.8140,1.2882 +Khronos,8x8,ldr-xy-normal1.png,36.9667,0.4053,0.3464,3.0274 +Khronos,8x8,ldr-xy-normal2.png,41.8048,0.5420,0.3755,11.1712 +Khronos,12x12,ldr-l-occlusion.png,41.3889,0.0743,0.0309,33.9060 +Khronos,12x12,ldr-rgb-diffuse.png,35.0131,0.5726,0.4066,10.3167 +Khronos,12x12,ldr-rgb-emissive.png,41.0878,0.0988,0.0528,19.8639 +Khronos,12x12,ldr-rgb-metalrough.png,29.0038,0.4905,0.4305,2.4358 +Khronos,12x12,ldr-rgb-metalrough2.png,29.9329,1.5981,1.4149,2.9644 +Khronos,12x12,ldr-rgba-base.png,29.4544,0.4390,0.3717,2.8210 +Khronos,12x12,ldr-rgba-diffuse.png,28.9536,0.6885,0.6244,1.6792 +Khronos,12x12,ldr-rgba-specgloss.png,30.2552,0.4739,0.4028,2.6032 +Khronos,12x12,ldr-xy-normal1.png,32.9189,0.3158,0.2481,4.2271 +Khronos,12x12,ldr-xy-normal2.png,37.3165,0.5626,0.3875,10.8238 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-avx2_thorough_results.csv new file mode 100644 index 0000000..f303702 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-avx2_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,70.9435,0.1438,0.1181,8.8750 +Khronos,4x4,ldr-rgb-diffuse.png,54.7264,4.2483,4.1003,1.0229 +Khronos,4x4,ldr-rgb-emissive.png,60.8072,0.1410,0.1123,9.3412 +Khronos,4x4,ldr-rgb-metalrough.png,44.9792,1.4544,1.4111,0.7431 +Khronos,4x4,ldr-rgb-metalrough2.png,44.0081,8.3180,8.1526,0.5145 +Khronos,4x4,ldr-rgba-base.png,44.0102,1.7498,1.7002,0.6167 +Khronos,4x4,ldr-rgba-diffuse.png,44.4119,1.2169,1.1695,0.8966 +Khronos,4x4,ldr-rgba-specgloss.png,42.4736,2.2819,2.2282,0.4706 +Khronos,4x4,ldr-xy-normal1.png,46.7760,1.8297,1.7779,0.5898 +Khronos,4x4,ldr-xy-normal2.png,50.6172,4.9625,4.8027,0.8733 +Khronos,5x5,ldr-l-occlusion.png,58.7743,0.2862,0.2589,4.0497 +Khronos,5x5,ldr-rgb-diffuse.png,49.8110,3.3682,3.2165,1.3040 +Khronos,5x5,ldr-rgb-emissive.png,56.1353,0.1595,0.1296,8.0918 +Khronos,5x5,ldr-rgb-metalrough.png,40.4630,1.6088,1.5637,0.6706 +Khronos,5x5,ldr-rgb-metalrough2.png,39.5023,8.9128,8.7453,0.4796 +Khronos,5x5,ldr-rgba-base.png,39.7584,1.8608,1.8092,0.5796 +Khronos,5x5,ldr-rgba-diffuse.png,39.9079,1.3104,1.2618,0.8310 +Khronos,5x5,ldr-rgba-specgloss.png,39.0322,2.4937,2.4393,0.4299 +Khronos,5x5,ldr-xy-normal1.png,43.4799,2.1957,2.1424,0.4894 +Khronos,5x5,ldr-xy-normal2.png,47.8136,6.6706,6.5073,0.6446 +Khronos,6x6,ldr-l-occlusion.png,52.2832,0.3646,0.3365,3.1166 +Khronos,6x6,ldr-rgb-diffuse.png,45.7933,3.4126,3.2608,1.2863 +Khronos,6x6,ldr-rgb-emissive.png,52.6785,0.1775,0.1467,7.1468 +Khronos,6x6,ldr-rgb-metalrough.png,37.0205,1.8459,1.8008,0.5823 +Khronos,6x6,ldr-rgb-metalrough2.png,36.7319,9.6371,9.4680,0.4430 +Khronos,6x6,ldr-rgba-base.png,36.8253,2.2511,2.1985,0.4770 +Khronos,6x6,ldr-rgba-diffuse.png,36.6565,1.6279,1.5777,0.6646 +Khronos,6x6,ldr-rgba-specgloss.png,36.6756,2.6337,2.5779,0.4068 +Khronos,6x6,ldr-xy-normal1.png,40.9773,1.6093,1.5542,0.6747 +Khronos,6x6,ldr-xy-normal2.png,45.7767,3.8866,3.7231,1.1266 +Khronos,8x8,ldr-l-occlusion.png,45.9639,0.3808,0.3471,3.0210 +Khronos,8x8,ldr-rgb-diffuse.png,40.8021,3.3321,3.1772,1.3201 +Khronos,8x8,ldr-rgb-emissive.png,47.6346,0.1708,0.1337,7.8408 +Khronos,8x8,ldr-rgb-metalrough.png,32.7845,1.9448,1.8885,0.5553 +Khronos,8x8,ldr-rgb-metalrough2.png,33.5322,10.4832,10.3105,0.4068 +Khronos,8x8,ldr-rgba-base.png,33.1422,2.5306,2.4729,0.4240 +Khronos,8x8,ldr-rgba-diffuse.png,32.6696,1.9628,1.9069,0.5499 +Khronos,8x8,ldr-rgba-specgloss.png,33.4968,2.8570,2.7952,0.3751 +Khronos,8x8,ldr-xy-normal1.png,37.4328,1.0786,1.0190,1.0290 +Khronos,8x8,ldr-xy-normal2.png,42.4942,1.8319,1.6653,2.5187 +Khronos,12x12,ldr-l-occlusion.png,42.4739,0.2831,0.2394,4.3799 +Khronos,12x12,ldr-rgb-diffuse.png,36.5490,3.1785,3.0100,1.3935 +Khronos,12x12,ldr-rgb-emissive.png,42.3982,0.2162,0.1694,6.1915 +Khronos,12x12,ldr-rgb-metalrough.png,29.2680,1.9452,1.8837,0.5567 +Khronos,12x12,ldr-rgb-metalrough2.png,30.6868,9.7791,9.5971,0.4370 +Khronos,12x12,ldr-rgba-base.png,29.8610,2.0748,2.0068,0.5225 +Khronos,12x12,ldr-rgba-diffuse.png,29.2143,1.9443,1.8780,0.5584 +Khronos,12x12,ldr-rgba-specgloss.png,30.6435,2.7254,2.6540,0.3951 +Khronos,12x12,ldr-xy-normal1.png,33.6238,0.9794,0.9094,1.1530 +Khronos,12x12,ldr-xy-normal2.png,38.3060,1.3670,1.1862,3.5358 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse2_fast_results.csv new file mode 100644 index 0000000..21849b4 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse2_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,60.4151,0.0554,0.0283,37.0480 +Khronos,4x4,ldr-rgb-diffuse.png,52.4596,0.3443,0.1957,21.4320 +Khronos,4x4,ldr-rgb-emissive.png,58.2803,0.0511,0.0226,46.3357 +Khronos,4x4,ldr-rgb-metalrough.png,44.0910,0.1955,0.1520,6.9001 +Khronos,4x4,ldr-rgb-metalrough2.png,42.7375,1.1532,0.9876,4.2470 +Khronos,4x4,ldr-rgba-base.png,42.8411,0.2529,0.2020,5.1913 +Khronos,4x4,ldr-rgba-diffuse.png,43.4515,0.1976,0.1500,6.9915 +Khronos,4x4,ldr-rgba-specgloss.png,41.4338,0.3462,0.2920,3.5905 +Khronos,4x4,ldr-xy-normal1.png,44.7064,0.2140,0.1607,6.5240 +Khronos,4x4,ldr-xy-normal2.png,48.2326,0.4434,0.2791,15.0294 +Khronos,5x5,ldr-l-occlusion.png,53.8051,0.0480,0.0202,51.9870 +Khronos,5x5,ldr-rgb-diffuse.png,47.0733,0.2922,0.1408,29.7994 +Khronos,5x5,ldr-rgb-emissive.png,52.5256,0.0475,0.0184,57.0834 +Khronos,5x5,ldr-rgb-metalrough.png,39.4854,0.1650,0.1214,8.6376 +Khronos,5x5,ldr-rgb-metalrough2.png,37.5447,1.0975,0.9293,4.5134 +Khronos,5x5,ldr-rgba-base.png,38.4172,0.1869,0.1351,7.7619 +Khronos,5x5,ldr-rgba-diffuse.png,38.7078,0.1895,0.1399,7.4976 +Khronos,5x5,ldr-rgba-specgloss.png,38.1294,0.2422,0.1871,5.6055 +Khronos,5x5,ldr-xy-normal1.png,41.6008,0.1784,0.1251,8.3792 +Khronos,5x5,ldr-xy-normal2.png,46.0206,0.3506,0.1890,22.1875 +Khronos,6x6,ldr-l-occlusion.png,48.3348,0.0523,0.0233,44.9762 +Khronos,6x6,ldr-rgb-diffuse.png,43.1892,0.3518,0.2013,20.8402 +Khronos,6x6,ldr-rgb-emissive.png,48.8751,0.0510,0.0204,51.4692 +Khronos,6x6,ldr-rgb-metalrough.png,36.2921,0.2015,0.1566,6.6952 +Khronos,6x6,ldr-rgb-metalrough2.png,35.0937,1.1731,1.0073,4.1637 +Khronos,6x6,ldr-rgba-base.png,35.8503,0.2217,0.1692,6.1962 +Khronos,6x6,ldr-rgba-diffuse.png,35.9027,0.2369,0.1865,5.6233 +Khronos,6x6,ldr-rgba-specgloss.png,35.9402,0.2683,0.2121,4.9442 +Khronos,6x6,ldr-xy-normal1.png,39.2714,0.1930,0.1385,7.5727 +Khronos,6x6,ldr-xy-normal2.png,43.9713,0.3781,0.2119,19.7924 +Khronos,8x8,ldr-l-occlusion.png,43.8215,0.0570,0.0235,44.5579 +Khronos,8x8,ldr-rgb-diffuse.png,38.3118,0.3679,0.2140,19.5973 +Khronos,8x8,ldr-rgb-emissive.png,44.3832,0.0555,0.0202,51.8968 +Khronos,8x8,ldr-rgb-metalrough.png,32.1965,0.2308,0.1812,5.7883 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1223,0.8660,0.6968,6.0192 +Khronos,8x8,ldr-rgba-base.png,32.1878,0.2418,0.1853,5.6576 +Khronos,8x8,ldr-rgba-diffuse.png,31.9979,0.2795,0.2243,4.6741 +Khronos,8x8,ldr-rgba-specgloss.png,32.7788,0.2610,0.2003,5.2340 +Khronos,8x8,ldr-xy-normal1.png,36.0796,0.1798,0.1214,8.6340 +Khronos,8x8,ldr-xy-normal2.png,40.6006,0.4061,0.2370,17.6985 +Khronos,12x12,ldr-l-occlusion.png,40.4147,0.0637,0.0219,47.8605 +Khronos,12x12,ldr-rgb-diffuse.png,33.4769,0.2913,0.1274,32.9277 +Khronos,12x12,ldr-rgb-emissive.png,39.3530,0.0608,0.0178,59.0183 +Khronos,12x12,ldr-rgb-metalrough.png,28.6260,0.1428,0.0859,12.2017 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2121,0.4484,0.2704,15.5109 +Khronos,12x12,ldr-rgba-base.png,29.0517,0.1752,0.1101,9.5226 +Khronos,12x12,ldr-rgba-diffuse.png,28.5908,0.1922,0.1292,8.1144 +Khronos,12x12,ldr-rgba-specgloss.png,29.8334,0.1558,0.0880,11.9103 +Khronos,12x12,ldr-xy-normal1.png,32.2941,0.1581,0.0908,11.5448 +Khronos,12x12,ldr-xy-normal2.png,35.9760,0.3938,0.2168,19.3485 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse2_fastest_results.csv new file mode 100644 index 0000000..bace17e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse2_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,57.4113,0.0522,0.0249,42.1879 +Khronos,4x4,ldr-rgb-diffuse.png,51.2509,0.3136,0.1642,25.5398 +Khronos,4x4,ldr-rgb-emissive.png,55.6511,0.0459,0.0174,60.2555 +Khronos,4x4,ldr-rgb-metalrough.png,41.6529,0.1142,0.0707,14.8351 +Khronos,4x4,ldr-rgb-metalrough2.png,38.5529,0.6925,0.5267,7.9632 +Khronos,4x4,ldr-rgba-base.png,39.7178,0.1324,0.0814,12.8832 +Khronos,4x4,ldr-rgba-diffuse.png,40.1672,0.1269,0.0783,13.3993 +Khronos,4x4,ldr-rgba-specgloss.png,39.5239,0.1432,0.0889,11.7967 +Khronos,4x4,ldr-xy-normal1.png,42.1115,0.1596,0.1063,9.8614 +Khronos,4x4,ldr-xy-normal2.png,47.0197,0.3676,0.2083,20.1314 +Khronos,5x5,ldr-l-occlusion.png,51.3929,0.0456,0.0182,57.7187 +Khronos,5x5,ldr-rgb-diffuse.png,46.0180,0.2584,0.1072,39.1091 +Khronos,5x5,ldr-rgb-emissive.png,49.9390,0.0430,0.0142,73.8547 +Khronos,5x5,ldr-rgb-metalrough.png,38.5800,0.0821,0.0384,27.2989 +Khronos,5x5,ldr-rgb-metalrough2.png,36.1402,0.3388,0.1705,24.5961 +Khronos,5x5,ldr-rgba-base.png,37.3085,0.0973,0.0456,22.9809 +Khronos,5x5,ldr-rgba-diffuse.png,37.6059,0.0963,0.0469,22.3590 +Khronos,5x5,ldr-rgba-specgloss.png,37.1049,0.1018,0.0472,22.2250 +Khronos,5x5,ldr-xy-normal1.png,39.7042,0.1007,0.0472,22.2335 +Khronos,5x5,ldr-xy-normal2.png,44.4611,0.2945,0.1330,31.5344 +Khronos,6x6,ldr-l-occlusion.png,46.3544,0.0444,0.0161,65.2907 +Khronos,6x6,ldr-rgb-diffuse.png,40.2178,0.2493,0.0986,42.5257 +Khronos,6x6,ldr-rgb-emissive.png,46.2986,0.0419,0.0123,85.5069 +Khronos,6x6,ldr-rgb-metalrough.png,34.9135,0.0817,0.0373,28.0939 +Khronos,6x6,ldr-rgb-metalrough2.png,33.6206,0.3051,0.1374,30.5329 +Khronos,6x6,ldr-rgba-base.png,34.7163,0.1018,0.0488,21.4657 +Khronos,6x6,ldr-rgba-diffuse.png,34.4734,0.0965,0.0461,22.7669 +Khronos,6x6,ldr-rgba-specgloss.png,34.5265,0.0984,0.0432,24.2934 +Khronos,6x6,ldr-xy-normal1.png,37.6450,0.0963,0.0428,24.4789 +Khronos,6x6,ldr-xy-normal2.png,42.1188,0.2902,0.1260,33.2768 +Khronos,8x8,ldr-l-occlusion.png,41.2438,0.0468,0.0146,71.6236 +Khronos,8x8,ldr-rgb-diffuse.png,35.8787,0.2348,0.0832,50.3977 +Khronos,8x8,ldr-rgb-emissive.png,41.0813,0.0433,0.0098,107.0736 +Khronos,8x8,ldr-rgb-metalrough.png,31.0515,0.0813,0.0334,31.3953 +Khronos,8x8,ldr-rgb-metalrough2.png,30.9068,0.2671,0.0994,42.1933 +Khronos,8x8,ldr-rgba-base.png,31.2069,0.0999,0.0439,23.9101 +Khronos,8x8,ldr-rgba-diffuse.png,30.9071,0.0934,0.0396,26.4879 +Khronos,8x8,ldr-rgba-specgloss.png,31.5986,0.0965,0.0371,28.2553 +Khronos,8x8,ldr-xy-normal1.png,34.3389,0.0953,0.0377,27.8241 +Khronos,8x8,ldr-xy-normal2.png,38.1324,0.2903,0.1222,34.3188 +Khronos,12x12,ldr-l-occlusion.png,37.8314,0.0511,0.0136,77.1235 +Khronos,12x12,ldr-rgb-diffuse.png,32.6027,0.2380,0.0779,53.8132 +Khronos,12x12,ldr-rgb-emissive.png,36.0957,0.0468,0.0079,133.1853 +Khronos,12x12,ldr-rgb-metalrough.png,27.9574,0.0744,0.0212,49.5287 +Khronos,12x12,ldr-rgb-metalrough2.png,28.2161,0.2540,0.0786,53.3865 +Khronos,12x12,ldr-rgba-base.png,28.2305,0.0837,0.0227,46.2704 +Khronos,12x12,ldr-rgba-diffuse.png,27.8536,0.0785,0.0200,52.3054 +Khronos,12x12,ldr-rgba-specgloss.png,29.2324,0.0850,0.0212,49.4846 +Khronos,12x12,ldr-xy-normal1.png,30.2168,0.0896,0.0271,38.7258 +Khronos,12x12,ldr-xy-normal2.png,33.6811,0.2672,0.0923,45.4287 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse2_medium_results.csv new file mode 100644 index 0000000..b8aa56c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse2_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,66.7868,0.0839,0.0565,18.5618 +Khronos,4x4,ldr-rgb-diffuse.png,53.7691,0.8427,0.6914,6.0668 +Khronos,4x4,ldr-rgb-emissive.png,59.7142,0.0856,0.0573,18.3157 +Khronos,4x4,ldr-rgb-metalrough.png,44.7803,0.7588,0.7144,1.4677 +Khronos,4x4,ldr-rgb-metalrough2.png,43.6506,4.8821,4.7151,0.8895 +Khronos,4x4,ldr-rgba-base.png,43.7092,0.8775,0.8267,1.2685 +Khronos,4x4,ldr-rgba-diffuse.png,44.1135,0.6149,0.5657,1.8535 +Khronos,4x4,ldr-rgba-specgloss.png,42.2242,1.1938,1.1394,0.9202 +Khronos,4x4,ldr-xy-normal1.png,46.4185,0.6679,0.6147,1.7059 +Khronos,4x4,ldr-xy-normal2.png,49.9984,1.4594,1.2959,3.2367 +Khronos,5x5,ldr-l-occlusion.png,56.4406,0.0801,0.0521,20.1231 +Khronos,5x5,ldr-rgb-diffuse.png,48.5255,0.7851,0.6343,6.6121 +Khronos,5x5,ldr-rgb-emissive.png,55.1706,0.0869,0.0573,18.2921 +Khronos,5x5,ldr-rgb-metalrough.png,40.1843,0.8320,0.7865,1.3332 +Khronos,5x5,ldr-rgb-metalrough2.png,38.9751,5.6508,5.4844,0.7648 +Khronos,5x5,ldr-rgba-base.png,39.3544,0.9527,0.9005,1.1644 +Khronos,5x5,ldr-rgba-diffuse.png,39.5225,0.7132,0.6638,1.5796 +Khronos,5x5,ldr-rgba-specgloss.png,38.7348,1.3816,1.3259,0.7908 +Khronos,5x5,ldr-xy-normal1.png,42.9057,0.6760,0.6216,1.6870 +Khronos,5x5,ldr-xy-normal2.png,47.0106,0.9350,0.7719,5.4336 +Khronos,6x6,ldr-l-occlusion.png,50.1342,0.0961,0.0664,15.7954 +Khronos,6x6,ldr-rgb-diffuse.png,44.5662,1.0114,0.8604,4.8747 +Khronos,6x6,ldr-rgb-emissive.png,51.3050,0.0988,0.0676,15.5080 +Khronos,6x6,ldr-rgb-metalrough.png,36.7702,0.8233,0.7772,1.3491 +Khronos,6x6,ldr-rgb-metalrough2.png,36.3558,5.0621,4.8949,0.8569 +Khronos,6x6,ldr-rgba-base.png,36.5529,0.8766,0.8222,1.2754 +Khronos,6x6,ldr-rgba-diffuse.png,36.4219,0.8477,0.7971,1.3156 +Khronos,6x6,ldr-rgba-specgloss.png,36.4361,1.2853,1.2289,0.8532 +Khronos,6x6,ldr-xy-normal1.png,40.3826,0.5731,0.5175,2.0261 +Khronos,6x6,ldr-xy-normal2.png,44.9515,0.6537,0.4877,8.5999 +Khronos,8x8,ldr-l-occlusion.png,45.0010,0.1049,0.0699,15.0000 +Khronos,8x8,ldr-rgb-diffuse.png,39.7364,1.2728,1.1170,3.7549 +Khronos,8x8,ldr-rgb-emissive.png,46.4668,0.1208,0.0851,12.3260 +Khronos,8x8,ldr-rgb-metalrough.png,32.5602,0.9484,0.8971,1.1688 +Khronos,8x8,ldr-rgb-metalrough2.png,33.0559,5.0369,4.8662,0.8619 +Khronos,8x8,ldr-rgba-base.png,32.8810,0.9140,0.8557,1.2253 +Khronos,8x8,ldr-rgba-diffuse.png,32.4614,1.1306,1.0752,0.9752 +Khronos,8x8,ldr-rgba-specgloss.png,33.2614,1.2568,1.1955,0.8771 +Khronos,8x8,ldr-xy-normal1.png,36.9667,0.5663,0.5069,2.0686 +Khronos,8x8,ldr-xy-normal2.png,41.8048,0.7075,0.5367,7.8154 +Khronos,12x12,ldr-l-occlusion.png,41.3889,0.0853,0.0406,25.8042 +Khronos,12x12,ldr-rgb-diffuse.png,35.0131,0.7352,0.5697,7.3619 +Khronos,12x12,ldr-rgb-emissive.png,41.0878,0.1204,0.0748,14.0124 +Khronos,12x12,ldr-rgb-metalrough.png,29.0038,0.6835,0.6230,1.6830 +Khronos,12x12,ldr-rgb-metalrough2.png,29.9329,2.2146,2.0325,2.0636 +Khronos,12x12,ldr-rgba-base.png,29.4544,0.6003,0.5329,1.9678 +Khronos,12x12,ldr-rgba-diffuse.png,28.9536,0.9617,0.8965,1.1696 +Khronos,12x12,ldr-rgba-specgloss.png,30.2552,0.6503,0.5790,1.8111 +Khronos,12x12,ldr-xy-normal1.png,32.9189,0.4242,0.3555,2.9496 +Khronos,12x12,ldr-xy-normal2.png,37.3165,0.7206,0.5423,7.7342 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse2_thorough_results.csv new file mode 100644 index 0000000..b1f1c70 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse2_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,70.9435,0.1815,0.1549,6.7675 +Khronos,4x4,ldr-rgb-diffuse.png,54.7264,5.4503,5.3018,0.7911 +Khronos,4x4,ldr-rgb-emissive.png,60.8072,0.1711,0.1424,7.3651 +Khronos,4x4,ldr-rgb-metalrough.png,44.9792,1.8812,1.8368,0.5709 +Khronos,4x4,ldr-rgb-metalrough2.png,44.0081,10.7454,10.5813,0.3964 +Khronos,4x4,ldr-rgba-base.png,44.0102,2.2275,2.1767,0.4817 +Khronos,4x4,ldr-rgba-diffuse.png,44.4120,1.5495,1.5003,0.6989 +Khronos,4x4,ldr-rgba-specgloss.png,42.4736,2.9169,2.8617,0.3664 +Khronos,4x4,ldr-xy-normal1.png,46.7760,2.3098,2.2562,0.4647 +Khronos,4x4,ldr-xy-normal2.png,50.6172,6.3076,6.1487,0.6821 +Khronos,5x5,ldr-l-occlusion.png,58.7743,0.3753,0.3469,3.0224 +Khronos,5x5,ldr-rgb-diffuse.png,49.8110,4.5038,4.3531,0.9635 +Khronos,5x5,ldr-rgb-emissive.png,56.1353,0.1997,0.1698,6.1737 +Khronos,5x5,ldr-rgb-metalrough.png,40.4630,2.1806,2.1361,0.4909 +Khronos,5x5,ldr-rgb-metalrough2.png,39.5023,12.0277,11.8624,0.3536 +Khronos,5x5,ldr-rgba-base.png,39.7584,2.4848,2.4321,0.4311 +Khronos,5x5,ldr-rgba-diffuse.png,39.9079,1.7413,1.6906,0.6202 +Khronos,5x5,ldr-rgba-specgloss.png,39.0322,3.3129,3.2572,0.3219 +Khronos,5x5,ldr-xy-normal1.png,43.4799,2.9090,2.8548,0.3673 +Khronos,5x5,ldr-xy-normal2.png,47.8136,8.8588,8.6931,0.4825 +Khronos,6x6,ldr-l-occlusion.png,52.2832,0.4921,0.4620,2.2695 +Khronos,6x6,ldr-rgb-diffuse.png,45.7933,4.6837,4.5302,0.9259 +Khronos,6x6,ldr-rgb-emissive.png,52.6785,0.2274,0.1958,5.3541 +Khronos,6x6,ldr-rgb-metalrough.png,37.0205,2.5362,2.4902,0.4211 +Khronos,6x6,ldr-rgb-metalrough2.png,36.7319,13.1436,12.9751,0.3233 +Khronos,6x6,ldr-rgba-base.png,36.8253,3.0642,3.0119,0.3481 +Khronos,6x6,ldr-rgba-diffuse.png,36.6565,2.2129,2.1614,0.4851 +Khronos,6x6,ldr-rgba-specgloss.png,36.6756,3.5637,3.5073,0.2990 +Khronos,6x6,ldr-xy-normal1.png,40.9773,2.1716,2.1159,0.4956 +Khronos,6x6,ldr-xy-normal2.png,45.7767,5.2697,5.1037,0.8218 +Khronos,8x8,ldr-l-occlusion.png,45.9639,0.5400,0.5045,2.0785 +Khronos,8x8,ldr-rgb-diffuse.png,40.8021,4.7674,4.6127,0.9093 +Khronos,8x8,ldr-rgb-emissive.png,47.6346,0.2245,0.1886,5.5612 +Khronos,8x8,ldr-rgb-metalrough.png,32.7845,2.7914,2.7395,0.3828 +Khronos,8x8,ldr-rgb-metalrough2.png,33.5322,14.9884,14.8165,0.2831 +Khronos,8x8,ldr-rgba-base.png,33.1422,3.5996,3.5399,0.2962 +Khronos,8x8,ldr-rgba-diffuse.png,32.6696,2.8007,2.7435,0.3822 +Khronos,8x8,ldr-rgba-specgloss.png,33.4968,4.0568,3.9940,0.2625 +Khronos,8x8,ldr-xy-normal1.png,37.4328,1.5220,1.4626,0.7169 +Khronos,8x8,ldr-xy-normal2.png,42.4942,2.6032,2.4313,1.7251 +Khronos,12x12,ldr-l-occlusion.png,42.4739,0.3881,0.3431,3.0563 +Khronos,12x12,ldr-rgb-diffuse.png,36.5490,4.5040,4.3372,0.9670 +Khronos,12x12,ldr-rgb-emissive.png,42.3982,0.3248,0.2785,3.7651 +Khronos,12x12,ldr-rgb-metalrough.png,29.2680,2.7715,2.7108,0.3868 +Khronos,12x12,ldr-rgb-metalrough2.png,30.6868,13.9207,13.7362,0.3053 +Khronos,12x12,ldr-rgba-base.png,29.8610,2.9403,2.8725,0.3650 +Khronos,12x12,ldr-rgba-diffuse.png,29.2143,2.7659,2.7003,0.3883 +Khronos,12x12,ldr-rgba-specgloss.png,30.6435,3.8513,3.7786,0.2775 +Khronos,12x12,ldr-xy-normal1.png,33.6238,1.3769,1.3068,0.8024 +Khronos,12x12,ldr-xy-normal2.png,38.3060,1.8753,1.6973,2.4712 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse4.1_fast_results.csv new file mode 100644 index 0000000..9782d0b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse4.1_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,60.4151,0.0530,0.0257,40.8084 +Khronos,4x4,ldr-rgb-diffuse.png,52.4596,0.3270,0.1740,24.1022 +Khronos,4x4,ldr-rgb-emissive.png,58.2803,0.0512,0.0225,46.6968 +Khronos,4x4,ldr-rgb-metalrough.png,44.0910,0.1718,0.1292,8.1130 +Khronos,4x4,ldr-rgb-metalrough2.png,42.7375,0.9973,0.8301,5.0529 +Khronos,4x4,ldr-rgba-base.png,42.8411,0.2201,0.1694,6.1890 +Khronos,4x4,ldr-rgba-diffuse.png,43.4515,0.1748,0.1264,8.2987 +Khronos,4x4,ldr-rgba-specgloss.png,41.4338,0.2982,0.2440,4.2980 +Khronos,4x4,ldr-xy-normal1.png,44.7064,0.1886,0.1359,7.7152 +Khronos,4x4,ldr-xy-normal2.png,48.2326,0.4020,0.2404,17.4460 +Khronos,5x5,ldr-l-occlusion.png,53.8051,0.0473,0.0193,54.4576 +Khronos,5x5,ldr-rgb-diffuse.png,47.0733,0.2795,0.1275,32.9061 +Khronos,5x5,ldr-rgb-emissive.png,52.5256,0.0473,0.0177,59.3256 +Khronos,5x5,ldr-rgb-metalrough.png,39.4854,0.1466,0.1026,10.2208 +Khronos,5x5,ldr-rgb-metalrough2.png,37.5447,0.9502,0.7790,5.3841 +Khronos,5x5,ldr-rgba-base.png,38.4172,0.1662,0.1145,9.1559 +Khronos,5x5,ldr-rgba-diffuse.png,38.7078,0.1664,0.1173,8.9430 +Khronos,5x5,ldr-rgba-specgloss.png,38.1294,0.2367,0.1814,5.7818 +Khronos,5x5,ldr-xy-normal1.png,41.6008,0.1731,0.1193,8.7929 +Khronos,5x5,ldr-xy-normal2.png,46.0206,0.3327,0.1686,24.8839 +Khronos,6x6,ldr-l-occlusion.png,48.3348,0.0516,0.0223,47.1105 +Khronos,6x6,ldr-rgb-diffuse.png,43.1892,0.3350,0.1801,23.2909 +Khronos,6x6,ldr-rgb-emissive.png,48.8751,0.0498,0.0191,54.9371 +Khronos,6x6,ldr-rgb-metalrough.png,36.2921,0.1791,0.1348,7.7807 +Khronos,6x6,ldr-rgb-metalrough2.png,35.0937,1.0299,0.8595,4.8797 +Khronos,6x6,ldr-rgba-base.png,35.8503,0.1969,0.1444,7.2599 +Khronos,6x6,ldr-rgba-diffuse.png,35.9027,0.2095,0.1592,6.5867 +Khronos,6x6,ldr-rgba-specgloss.png,35.9402,0.2364,0.1806,5.8055 +Khronos,6x6,ldr-xy-normal1.png,39.2714,0.1728,0.1189,8.8161 +Khronos,6x6,ldr-xy-normal2.png,43.9713,0.3518,0.1887,22.2248 +Khronos,8x8,ldr-l-occlusion.png,43.8215,0.0559,0.0219,47.8407 +Khronos,8x8,ldr-rgb-diffuse.png,38.3118,0.3466,0.1907,21.9889 +Khronos,8x8,ldr-rgb-emissive.png,44.3832,0.0545,0.0195,53.7041 +Khronos,8x8,ldr-rgb-metalrough.png,32.1965,0.2096,0.1598,6.5636 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1223,0.7822,0.6099,6.8766 +Khronos,8x8,ldr-rgba-base.png,32.1878,0.2193,0.1626,6.4489 +Khronos,8x8,ldr-rgba-diffuse.png,31.9979,0.2524,0.1972,5.3163 +Khronos,8x8,ldr-rgba-specgloss.png,32.7788,0.2354,0.1751,5.9868 +Khronos,8x8,ldr-xy-normal1.png,36.0796,0.1661,0.1073,9.7701 +Khronos,8x8,ldr-xy-normal2.png,40.6006,0.3795,0.2118,19.8058 +Khronos,12x12,ldr-l-occlusion.png,40.4147,0.0628,0.0210,50.0034 +Khronos,12x12,ldr-rgb-diffuse.png,33.4769,0.2866,0.1189,35.2718 +Khronos,12x12,ldr-rgb-emissive.png,39.3530,0.0606,0.0175,59.7544 +Khronos,12x12,ldr-rgb-metalrough.png,28.6260,0.1356,0.0793,13.2307 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2121,0.4286,0.2466,17.0087 +Khronos,12x12,ldr-rgba-base.png,29.0517,0.1649,0.1004,10.4400 +Khronos,12x12,ldr-rgba-diffuse.png,28.5908,0.1803,0.1182,8.8700 +Khronos,12x12,ldr-rgba-specgloss.png,29.8334,0.1475,0.0803,13.0553 +Khronos,12x12,ldr-xy-normal1.png,32.2941,0.1488,0.0824,12.7251 +Khronos,12x12,ldr-xy-normal2.png,35.9760,0.3722,0.2006,20.9081 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse4.1_fastest_results.csv new file mode 100644 index 0000000..2bdac93 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse4.1_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,57.4113,0.0505,0.0231,45.3673 +Khronos,4x4,ldr-rgb-diffuse.png,51.2509,0.2965,0.1442,29.0878 +Khronos,4x4,ldr-rgb-emissive.png,55.6511,0.0469,0.0185,56.7900 +Khronos,4x4,ldr-rgb-metalrough.png,41.6529,0.1033,0.0600,17.4702 +Khronos,4x4,ldr-rgb-metalrough2.png,38.5529,0.6006,0.4312,9.7265 +Khronos,4x4,ldr-rgba-base.png,39.7178,0.1190,0.0686,15.2795 +Khronos,4x4,ldr-rgba-diffuse.png,40.1672,0.1145,0.0660,15.8807 +Khronos,4x4,ldr-rgba-specgloss.png,39.5239,0.1279,0.0745,14.0724 +Khronos,4x4,ldr-xy-normal1.png,42.1115,0.1409,0.0883,11.8815 +Khronos,4x4,ldr-xy-normal2.png,47.0197,0.3408,0.1798,23.3316 +Khronos,5x5,ldr-l-occlusion.png,51.3929,0.0455,0.0179,58.7346 +Khronos,5x5,ldr-rgb-diffuse.png,46.0180,0.2519,0.0991,42.3278 +Khronos,5x5,ldr-rgb-emissive.png,49.9390,0.0434,0.0144,72.9748 +Khronos,5x5,ldr-rgb-metalrough.png,38.5800,0.0780,0.0341,30.7917 +Khronos,5x5,ldr-rgb-metalrough2.png,36.1402,0.3222,0.1514,27.6954 +Khronos,5x5,ldr-rgba-base.png,37.3085,0.0918,0.0400,26.2282 +Khronos,5x5,ldr-rgba-diffuse.png,37.6059,0.0902,0.0407,25.7477 +Khronos,5x5,ldr-rgba-specgloss.png,37.1049,0.0956,0.0413,25.4181 +Khronos,5x5,ldr-xy-normal1.png,39.7042,0.0937,0.0410,25.5712 +Khronos,5x5,ldr-xy-normal2.png,44.4611,0.2848,0.1204,34.8292 +Khronos,6x6,ldr-l-occlusion.png,46.3544,0.0444,0.0159,65.9150 +Khronos,6x6,ldr-rgb-diffuse.png,40.2178,0.2489,0.0945,44.3762 +Khronos,6x6,ldr-rgb-emissive.png,46.2986,0.0427,0.0126,83.1342 +Khronos,6x6,ldr-rgb-metalrough.png,34.9135,0.0779,0.0333,31.4897 +Khronos,6x6,ldr-rgb-metalrough2.png,33.6206,0.2959,0.1245,33.6892 +Khronos,6x6,ldr-rgba-base.png,34.7163,0.0921,0.0405,25.9094 +Khronos,6x6,ldr-rgba-diffuse.png,34.4734,0.0922,0.0423,24.7897 +Khronos,6x6,ldr-rgba-specgloss.png,34.5265,0.0941,0.0388,27.0217 +Khronos,6x6,ldr-xy-normal1.png,37.6450,0.0919,0.0385,27.2187 +Khronos,6x6,ldr-xy-normal2.png,42.1188,0.2771,0.1162,36.0831 +Khronos,8x8,ldr-l-occlusion.png,41.2438,0.0470,0.0143,73.4342 +Khronos,8x8,ldr-rgb-diffuse.png,35.8787,0.2324,0.0782,53.6198 +Khronos,8x8,ldr-rgb-emissive.png,41.0813,0.0438,0.0098,107.3925 +Khronos,8x8,ldr-rgb-metalrough.png,31.0515,0.0792,0.0307,34.1010 +Khronos,8x8,ldr-rgb-metalrough2.png,30.9068,0.2628,0.0917,45.7534 +Khronos,8x8,ldr-rgba-base.png,31.2069,0.0958,0.0399,26.2881 +Khronos,8x8,ldr-rgba-diffuse.png,30.9071,0.0902,0.0363,28.8792 +Khronos,8x8,ldr-rgba-specgloss.png,31.5986,0.0931,0.0340,30.8568 +Khronos,8x8,ldr-xy-normal1.png,34.3389,0.0914,0.0344,30.4836 +Khronos,8x8,ldr-xy-normal2.png,38.1324,0.2739,0.1119,37.4692 +Khronos,12x12,ldr-l-occlusion.png,37.8314,0.0510,0.0131,79.9892 +Khronos,12x12,ldr-rgb-diffuse.png,32.6027,0.2376,0.0759,55.2836 +Khronos,12x12,ldr-rgb-emissive.png,36.0957,0.0471,0.0082,127.1479 +Khronos,12x12,ldr-rgb-metalrough.png,27.9574,0.0739,0.0201,52.1961 +Khronos,12x12,ldr-rgb-metalrough2.png,28.2161,0.2549,0.0767,54.6667 +Khronos,12x12,ldr-rgba-base.png,28.2305,0.0827,0.0213,49.1226 +Khronos,12x12,ldr-rgba-diffuse.png,27.8536,0.0783,0.0199,52.7616 +Khronos,12x12,ldr-rgba-specgloss.png,29.2324,0.0840,0.0203,51.7716 +Khronos,12x12,ldr-xy-normal1.png,30.2168,0.0876,0.0256,41.0288 +Khronos,12x12,ldr-xy-normal2.png,33.6811,0.2596,0.0880,47.6789 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse4.1_medium_results.csv new file mode 100644 index 0000000..6896f06 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse4.1_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,66.7868,0.0775,0.0502,20.9087 +Khronos,4x4,ldr-rgb-diffuse.png,53.7691,0.7322,0.5784,7.2511 +Khronos,4x4,ldr-rgb-emissive.png,59.7142,0.0786,0.0497,21.0811 +Khronos,4x4,ldr-rgb-metalrough.png,44.7803,0.6444,0.6007,1.7457 +Khronos,4x4,ldr-rgb-metalrough2.png,43.6506,4.1279,3.9582,1.0597 +Khronos,4x4,ldr-rgba-base.png,43.7092,0.7464,0.6964,1.5058 +Khronos,4x4,ldr-rgba-diffuse.png,44.1135,0.5234,0.4754,2.2056 +Khronos,4x4,ldr-rgba-specgloss.png,42.2242,1.0171,0.9626,1.0893 +Khronos,4x4,ldr-xy-normal1.png,46.4185,0.5743,0.5213,2.0113 +Khronos,4x4,ldr-xy-normal2.png,49.9984,1.2551,1.0965,3.8250 +Khronos,5x5,ldr-l-occlusion.png,56.4406,0.0795,0.0509,20.5970 +Khronos,5x5,ldr-rgb-diffuse.png,48.5255,0.6842,0.5305,7.9057 +Khronos,5x5,ldr-rgb-emissive.png,55.1706,0.0797,0.0498,21.0757 +Khronos,5x5,ldr-rgb-metalrough.png,40.1843,0.7012,0.6558,1.5990 +Khronos,5x5,ldr-rgb-metalrough2.png,38.9751,4.7347,4.5649,0.9188 +Khronos,5x5,ldr-rgba-base.png,39.3544,0.8025,0.7509,1.3965 +Khronos,5x5,ldr-rgba-diffuse.png,39.5225,0.6010,0.5509,1.9034 +Khronos,5x5,ldr-rgba-specgloss.png,38.7348,1.1581,1.1029,0.9507 +Khronos,5x5,ldr-xy-normal1.png,42.9057,0.5740,0.5204,2.0151 +Khronos,5x5,ldr-xy-normal2.png,47.0106,0.8212,0.6562,6.3918 +Khronos,6x6,ldr-l-occlusion.png,50.1342,0.0885,0.0586,17.8963 +Khronos,6x6,ldr-rgb-diffuse.png,44.5662,0.8930,0.7379,5.6843 +Khronos,6x6,ldr-rgb-emissive.png,51.3050,0.0914,0.0596,17.5944 +Khronos,6x6,ldr-rgb-metalrough.png,36.7702,0.7058,0.6590,1.5911 +Khronos,6x6,ldr-rgb-metalrough2.png,36.3558,4.3393,4.1707,1.0057 +Khronos,6x6,ldr-rgba-base.png,36.5529,0.7534,0.7002,1.4976 +Khronos,6x6,ldr-rgba-diffuse.png,36.4219,0.7272,0.6761,1.5510 +Khronos,6x6,ldr-rgba-specgloss.png,36.4361,1.1074,1.0511,0.9976 +Khronos,6x6,ldr-xy-normal1.png,40.3826,0.4954,0.4408,2.3790 +Khronos,6x6,ldr-xy-normal2.png,44.9515,0.5863,0.4206,9.9712 +Khronos,8x8,ldr-l-occlusion.png,45.0010,0.0972,0.0620,16.9196 +Khronos,8x8,ldr-rgb-diffuse.png,39.7364,1.1463,0.9866,4.2511 +Khronos,8x8,ldr-rgb-emissive.png,46.4668,0.1124,0.0766,13.6942 +Khronos,8x8,ldr-rgb-metalrough.png,32.5602,0.8444,0.7933,1.3218 +Khronos,8x8,ldr-rgb-metalrough2.png,33.0559,4.4342,4.2619,0.9841 +Khronos,8x8,ldr-rgba-base.png,32.8810,0.8101,0.7519,1.3946 +Khronos,8x8,ldr-rgba-diffuse.png,32.4614,0.9988,0.9437,1.1112 +Khronos,8x8,ldr-rgba-specgloss.png,33.2614,1.1138,1.0518,0.9970 +Khronos,8x8,ldr-xy-normal1.png,36.9667,0.5043,0.4442,2.3607 +Khronos,8x8,ldr-xy-normal2.png,41.8048,0.6424,0.4743,8.8424 +Khronos,12x12,ldr-l-occlusion.png,41.3889,0.0830,0.0376,27.9099 +Khronos,12x12,ldr-rgb-diffuse.png,35.0131,0.6943,0.5225,8.0267 +Khronos,12x12,ldr-rgb-emissive.png,41.0878,0.1146,0.0686,15.2809 +Khronos,12x12,ldr-rgb-metalrough.png,29.0038,0.6277,0.5674,1.8482 +Khronos,12x12,ldr-rgb-metalrough2.png,29.9329,2.0388,1.8553,2.2607 +Khronos,12x12,ldr-rgba-base.png,29.4544,0.5542,0.4870,2.1531 +Khronos,12x12,ldr-rgba-diffuse.png,28.9536,0.8835,0.8175,1.2826 +Khronos,12x12,ldr-rgba-specgloss.png,30.2552,0.5980,0.5266,1.9912 +Khronos,12x12,ldr-xy-normal1.png,32.9189,0.3929,0.3237,3.2392 +Khronos,12x12,ldr-xy-normal2.png,37.3165,0.6765,0.4964,8.4499 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse4.1_thorough_results.csv new file mode 100644 index 0000000..4af5fad --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-2.5-sse4.1_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,70.9435,0.1597,0.1326,7.9053 +Khronos,4x4,ldr-rgb-diffuse.png,54.7264,4.7227,4.5685,0.9181 +Khronos,4x4,ldr-rgb-emissive.png,60.8072,0.1528,0.1244,8.4302 +Khronos,4x4,ldr-rgb-metalrough.png,44.9792,1.6354,1.5922,0.6586 +Khronos,4x4,ldr-rgb-metalrough2.png,44.0081,9.3404,9.1724,0.4573 +Khronos,4x4,ldr-rgba-base.png,44.0102,1.9417,1.8918,0.5543 +Khronos,4x4,ldr-rgba-diffuse.png,44.4120,1.3544,1.3048,0.8036 +Khronos,4x4,ldr-rgba-specgloss.png,42.4736,2.5698,2.5136,0.4172 +Khronos,4x4,ldr-xy-normal1.png,46.7760,2.0320,1.9783,0.5300 +Khronos,4x4,ldr-xy-normal2.png,50.6172,5.5314,5.3666,0.7816 +Khronos,5x5,ldr-l-occlusion.png,58.7743,0.3264,0.2974,3.5262 +Khronos,5x5,ldr-rgb-diffuse.png,49.8110,3.8742,3.7184,1.1280 +Khronos,5x5,ldr-rgb-emissive.png,56.1353,0.1766,0.1463,7.1662 +Khronos,5x5,ldr-rgb-metalrough.png,40.4630,1.8736,1.8282,0.5736 +Khronos,5x5,ldr-rgb-metalrough2.png,39.5023,10.3552,10.1849,0.4118 +Khronos,5x5,ldr-rgba-base.png,39.7584,2.1516,2.0983,0.4997 +Khronos,5x5,ldr-rgba-diffuse.png,39.9079,1.4963,1.4463,0.7250 +Khronos,5x5,ldr-rgba-specgloss.png,39.0322,2.8848,2.8293,0.3706 +Khronos,5x5,ldr-xy-normal1.png,43.4799,2.5135,2.4583,0.4265 +Khronos,5x5,ldr-xy-normal2.png,47.8136,7.6456,7.4792,0.5608 +Khronos,6x6,ldr-l-occlusion.png,52.2832,0.4282,0.3979,2.6351 +Khronos,6x6,ldr-rgb-diffuse.png,45.7933,4.0879,3.9306,1.0671 +Khronos,6x6,ldr-rgb-emissive.png,52.6785,0.2039,0.1724,6.0807 +Khronos,6x6,ldr-rgb-metalrough.png,37.0205,2.2006,2.1548,0.4866 +Khronos,6x6,ldr-rgb-metalrough2.png,36.7319,11.4455,11.2734,0.3721 +Khronos,6x6,ldr-rgba-base.png,36.8253,2.6676,2.6141,0.4011 +Khronos,6x6,ldr-rgba-diffuse.png,36.6565,1.9345,1.8838,0.5566 +Khronos,6x6,ldr-rgba-specgloss.png,36.6756,3.1302,3.0746,0.3410 +Khronos,6x6,ldr-xy-normal1.png,40.9773,1.8972,1.8417,0.5694 +Khronos,6x6,ldr-xy-normal2.png,45.7767,4.5746,4.4092,0.9513 +Khronos,8x8,ldr-l-occlusion.png,45.9639,0.4761,0.4411,2.3774 +Khronos,8x8,ldr-rgb-diffuse.png,40.8021,4.2334,4.0770,1.0288 +Khronos,8x8,ldr-rgb-emissive.png,47.6346,0.2053,0.1694,6.1905 +Khronos,8x8,ldr-rgb-metalrough.png,32.7845,2.4729,2.4224,0.4329 +Khronos,8x8,ldr-rgb-metalrough2.png,33.5322,13.3597,13.1785,0.3183 +Khronos,8x8,ldr-rgba-base.png,33.1422,3.2098,3.1518,0.3327 +Khronos,8x8,ldr-rgba-diffuse.png,32.6696,2.4668,2.4095,0.4352 +Khronos,8x8,ldr-rgba-specgloss.png,33.4968,3.6079,3.5470,0.2956 +Khronos,8x8,ldr-xy-normal1.png,37.4328,1.3492,1.2883,0.8139 +Khronos,8x8,ldr-xy-normal2.png,42.4942,2.2836,2.1161,1.9821 +Khronos,12x12,ldr-l-occlusion.png,42.4739,0.3546,0.3091,3.3919 +Khronos,12x12,ldr-rgb-diffuse.png,36.5490,4.1032,3.9327,1.0665 +Khronos,12x12,ldr-rgb-emissive.png,42.3982,0.2653,0.2195,4.7780 +Khronos,12x12,ldr-rgb-metalrough.png,29.2680,2.5236,2.4626,0.4258 +Khronos,12x12,ldr-rgb-metalrough2.png,30.6868,12.6387,12.4527,0.3368 +Khronos,12x12,ldr-rgba-base.png,29.8610,2.6840,2.6150,0.4010 +Khronos,12x12,ldr-rgba-diffuse.png,29.2143,2.5184,2.4518,0.4277 +Khronos,12x12,ldr-rgba-specgloss.png,30.6435,3.5102,3.4382,0.3050 +Khronos,12x12,ldr-xy-normal1.png,33.6238,1.2512,1.1801,0.8886 +Khronos,12x12,ldr-xy-normal2.png,38.3060,1.7108,1.5306,2.7403 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-avx2_fast_results.csv new file mode 100644 index 0000000..1d46dce --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-avx2_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,64.2943,0.0386,0.0147,71.4537 +Khronos,4x4,ldr-rgb-diffuse.png,52.5337,0.2415,0.0859,48.8158 +Khronos,4x4,ldr-rgb-emissive.png,58.5505,0.0416,0.0154,68.2937 +Khronos,4x4,ldr-rgb-metalrough.png,44.2748,0.0992,0.0575,18.2504 +Khronos,4x4,ldr-rgb-metalrough2.png,42.9160,0.5165,0.3468,12.0938 +Khronos,4x4,ldr-rgba-base.png,43.2384,0.1210,0.0716,14.6384 +Khronos,4x4,ldr-rgba-diffuse.png,43.8337,0.0992,0.0528,19.8488 +Khronos,4x4,ldr-rgba-specgloss.png,41.6515,0.1589,0.1065,9.8465 +Khronos,4x4,ldr-xy-normal1.png,44.9658,0.1682,0.0882,11.8946 +Khronos,4x4,ldr-xy-normal2.png,48.6954,0.4019,0.1394,30.0841 +Khronos,5x5,ldr-l-occlusion.png,54.3853,0.0378,0.0131,79.9107 +Khronos,5x5,ldr-rgb-diffuse.png,47.2206,0.2291,0.0734,57.1516 +Khronos,5x5,ldr-rgb-emissive.png,52.6484,0.0404,0.0133,78.5800 +Khronos,5x5,ldr-rgb-metalrough.png,39.8152,0.0886,0.0456,22.9809 +Khronos,5x5,ldr-rgb-metalrough2.png,37.8813,0.5293,0.3558,11.7871 +Khronos,5x5,ldr-rgba-base.png,38.8783,0.1061,0.0559,18.7530 +Khronos,5x5,ldr-rgba-diffuse.png,39.1281,0.1027,0.0555,18.8830 +Khronos,5x5,ldr-rgba-specgloss.png,38.3729,0.1246,0.0711,14.7450 +Khronos,5x5,ldr-xy-normal1.png,41.8817,0.1494,0.0680,15.4148 +Khronos,5x5,ldr-xy-normal2.png,46.1664,0.3829,0.1028,40.7974 +Khronos,6x6,ldr-l-occlusion.png,48.3853,0.0383,0.0129,81.5072 +Khronos,6x6,ldr-rgb-diffuse.png,43.2790,0.2424,0.0865,48.4902 +Khronos,6x6,ldr-rgb-emissive.png,49.1258,0.0399,0.0121,86.9042 +Khronos,6x6,ldr-rgb-metalrough.png,36.4555,0.0965,0.0541,19.3847 +Khronos,6x6,ldr-rgb-metalrough2.png,35.2939,0.5438,0.3699,11.3389 +Khronos,6x6,ldr-rgba-base.png,36.1037,0.1132,0.0626,16.7630 +Khronos,6x6,ldr-rgba-diffuse.png,36.0866,0.1146,0.0669,15.6714 +Khronos,6x6,ldr-rgba-specgloss.png,36.1059,0.1287,0.0750,13.9719 +Khronos,6x6,ldr-xy-normal1.png,39.6565,0.1452,0.0635,16.5031 +Khronos,6x6,ldr-xy-normal2.png,44.1113,0.3798,0.1007,41.6365 +Khronos,8x8,ldr-l-occlusion.png,43.9509,0.0416,0.0122,85.8775 +Khronos,8x8,ldr-rgb-diffuse.png,38.3579,0.2523,0.0949,44.1743 +Khronos,8x8,ldr-rgb-emissive.png,44.5417,0.0427,0.0109,95.8640 +Khronos,8x8,ldr-rgb-metalrough.png,32.3176,0.1158,0.0690,15.1899 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1727,0.4674,0.2935,14.2886 +Khronos,8x8,ldr-rgba-base.png,32.3786,0.1234,0.0692,15.1452 +Khronos,8x8,ldr-rgba-diffuse.png,32.1163,0.1365,0.0846,12.3892 +Khronos,8x8,ldr-rgba-specgloss.png,32.9674,0.1355,0.0783,13.3935 +Khronos,8x8,ldr-xy-normal1.png,36.4984,0.1438,0.0576,18.2167 +Khronos,8x8,ldr-xy-normal2.png,40.6917,0.3854,0.1034,40.5509 +Khronos,12x12,ldr-l-occlusion.png,40.5785,0.0473,0.0110,95.1340 +Khronos,12x12,ldr-rgb-diffuse.png,33.3691,0.2326,0.0684,61.2780 +Khronos,12x12,ldr-rgb-emissive.png,39.4740,0.0486,0.0103,101.7949 +Khronos,12x12,ldr-rgb-metalrough.png,28.6341,0.0929,0.0384,27.2874 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2524,0.3020,0.1227,34.1910 +Khronos,12x12,ldr-rgba-base.png,29.0205,0.1116,0.0513,20.4413 +Khronos,12x12,ldr-rgba-diffuse.png,28.6231,0.1177,0.0594,17.6626 +Khronos,12x12,ldr-rgba-specgloss.png,29.8092,0.1049,0.0419,25.0203 +Khronos,12x12,ldr-xy-normal1.png,32.7294,0.1286,0.0359,29.2147 +Khronos,12x12,ldr-xy-normal2.png,36.2128,0.3758,0.0876,47.8994 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-avx2_fastest_results.csv new file mode 100644 index 0000000..ad14980 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-avx2_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,64.1811,0.0375,0.0144,72.7575 +Khronos,4x4,ldr-rgb-diffuse.png,52.3048,0.2331,0.0787,53.2643 +Khronos,4x4,ldr-rgb-emissive.png,57.9745,0.0387,0.0131,80.3076 +Khronos,4x4,ldr-rgb-metalrough.png,43.8757,0.0817,0.0407,25.7438 +Khronos,4x4,ldr-rgb-metalrough2.png,42.6172,0.3854,0.2183,19.2135 +Khronos,4x4,ldr-rgba-base.png,42.7808,0.0944,0.0460,22.8164 +Khronos,4x4,ldr-rgba-diffuse.png,43.2186,0.0815,0.0354,29.6065 +Khronos,4x4,ldr-rgba-specgloss.png,41.2397,0.1183,0.0669,15.6705 +Khronos,4x4,ldr-xy-normal1.png,44.7980,0.1331,0.0546,19.2216 +Khronos,4x4,ldr-xy-normal2.png,48.3359,0.3786,0.1093,38.3777 +Khronos,5x5,ldr-l-occlusion.png,53.9891,0.0370,0.0131,80.1963 +Khronos,5x5,ldr-rgb-diffuse.png,47.0472,0.2246,0.0715,58.6330 +Khronos,5x5,ldr-rgb-emissive.png,52.3396,0.0389,0.0127,82.5258 +Khronos,5x5,ldr-rgb-metalrough.png,39.2552,0.0759,0.0343,30.6072 +Khronos,5x5,ldr-rgb-metalrough2.png,37.2923,0.3998,0.2309,18.1682 +Khronos,5x5,ldr-rgba-base.png,38.0848,0.0889,0.0383,27.3894 +Khronos,5x5,ldr-rgba-diffuse.png,38.3579,0.0834,0.0363,28.8569 +Khronos,5x5,ldr-rgba-specgloss.png,37.9190,0.1015,0.0493,21.2658 +Khronos,5x5,ldr-xy-normal1.png,41.3049,0.1307,0.0495,21.2035 +Khronos,5x5,ldr-xy-normal2.png,45.6138,0.3686,0.0888,47.2310 +Khronos,6x6,ldr-l-occlusion.png,48.3038,0.0366,0.0122,85.7102 +Khronos,6x6,ldr-rgb-diffuse.png,43.2173,0.2309,0.0732,57.3132 +Khronos,6x6,ldr-rgb-emissive.png,48.9702,0.0376,0.0113,93.0587 +Khronos,6x6,ldr-rgb-metalrough.png,36.2530,0.0792,0.0372,28.1921 +Khronos,6x6,ldr-rgb-metalrough2.png,35.0960,0.3954,0.2243,18.6964 +Khronos,6x6,ldr-rgba-base.png,35.9357,0.0904,0.0405,25.8742 +Khronos,6x6,ldr-rgba-diffuse.png,35.9044,0.0883,0.0413,25.3634 +Khronos,6x6,ldr-rgba-specgloss.png,35.8773,0.1009,0.0485,21.6045 +Khronos,6x6,ldr-xy-normal1.png,38.8396,0.1267,0.0472,22.2335 +Khronos,6x6,ldr-xy-normal2.png,43.4426,0.3650,0.0851,49.2984 +Khronos,8x8,ldr-l-occlusion.png,43.4865,0.0385,0.0111,94.6529 +Khronos,8x8,ldr-rgb-diffuse.png,38.2787,0.2353,0.0790,53.0696 +Khronos,8x8,ldr-rgb-emissive.png,44.2565,0.0390,0.0092,114.1994 +Khronos,8x8,ldr-rgb-metalrough.png,32.2167,0.0934,0.0481,21.7935 +Khronos,8x8,ldr-rgb-metalrough2.png,32.0902,0.3822,0.2106,19.9168 +Khronos,8x8,ldr-rgba-base.png,32.2303,0.1004,0.0483,21.7285 +Khronos,8x8,ldr-rgba-diffuse.png,32.0058,0.1076,0.0577,18.1755 +Khronos,8x8,ldr-rgba-specgloss.png,32.8371,0.1099,0.0539,19.4595 +Khronos,8x8,ldr-xy-normal1.png,36.2071,0.1247,0.0412,25.4632 +Khronos,8x8,ldr-xy-normal2.png,40.2733,0.3631,0.0835,50.2096 +Khronos,12x12,ldr-l-occlusion.png,40.2271,0.0419,0.0100,104.7952 +Khronos,12x12,ldr-rgb-diffuse.png,33.3234,0.2198,0.0591,71.0259 +Khronos,12x12,ldr-rgb-emissive.png,39.2738,0.0428,0.0090,115.9180 +Khronos,12x12,ldr-rgb-metalrough.png,28.5929,0.0781,0.0289,36.2815 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1679,0.2725,0.0972,43.1420 +Khronos,12x12,ldr-rgba-base.png,28.9701,0.0943,0.0376,27.8670 +Khronos,12x12,ldr-rgba-diffuse.png,28.5748,0.0977,0.0435,24.0964 +Khronos,12x12,ldr-rgba-specgloss.png,29.7683,0.0904,0.0313,33.4837 +Khronos,12x12,ldr-xy-normal1.png,32.6096,0.1176,0.0285,36.7871 +Khronos,12x12,ldr-xy-normal2.png,36.0023,0.3571,0.0737,56.9151 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-avx2_medium_results.csv new file mode 100644 index 0000000..606bd7d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-avx2_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.9245,0.0471,0.0224,46.7340 +Khronos,4x4,ldr-rgb-diffuse.png,54.0221,0.4039,0.2498,16.7923 +Khronos,4x4,ldr-rgb-emissive.png,59.8356,0.0507,0.0238,44.0951 +Khronos,4x4,ldr-rgb-metalrough.png,44.8439,0.2333,0.1912,5.4847 +Khronos,4x4,ldr-rgb-metalrough2.png,43.7387,1.4456,1.2744,3.2913 +Khronos,4x4,ldr-rgba-base.png,43.8181,0.2962,0.2473,4.2398 +Khronos,4x4,ldr-rgba-diffuse.png,44.2283,0.2173,0.1704,6.1535 +Khronos,4x4,ldr-rgba-specgloss.png,42.2924,0.3928,0.3399,3.0853 +Khronos,4x4,ldr-xy-normal1.png,46.4815,0.3525,0.2721,3.8542 +Khronos,4x4,ldr-xy-normal2.png,50.2696,0.8003,0.5465,7.6749 +Khronos,5x5,ldr-l-occlusion.png,57.1580,0.0505,0.0245,42.8584 +Khronos,5x5,ldr-rgb-diffuse.png,48.9900,0.4062,0.2519,16.6506 +Khronos,5x5,ldr-rgb-emissive.png,55.3732,0.0528,0.0241,43.5364 +Khronos,5x5,ldr-rgb-metalrough.png,40.2386,0.2521,0.2080,5.0420 +Khronos,5x5,ldr-rgb-metalrough2.png,39.0265,1.6811,1.5087,2.7801 +Khronos,5x5,ldr-rgba-base.png,39.3979,0.3260,0.2742,3.8247 +Khronos,5x5,ldr-rgba-diffuse.png,39.5646,0.2613,0.2127,4.9296 +Khronos,5x5,ldr-rgba-specgloss.png,38.7813,0.4196,0.3647,2.8752 +Khronos,5x5,ldr-xy-normal1.png,43.0494,0.3306,0.2483,4.2224 +Khronos,5x5,ldr-xy-normal2.png,47.2289,0.6889,0.4172,10.0542 +Khronos,6x6,ldr-l-occlusion.png,50.8663,0.0569,0.0305,34.4157 +Khronos,6x6,ldr-rgb-diffuse.png,44.9305,0.4123,0.2568,16.3318 +Khronos,6x6,ldr-rgb-emissive.png,51.5230,0.0516,0.0229,45.8474 +Khronos,6x6,ldr-rgb-metalrough.png,36.8282,0.2588,0.2148,4.8805 +Khronos,6x6,ldr-rgb-metalrough2.png,36.4385,1.6463,1.4733,2.8469 +Khronos,6x6,ldr-rgba-base.png,36.6372,0.2979,0.2463,4.2573 +Khronos,6x6,ldr-rgba-diffuse.png,36.4889,0.2786,0.2295,4.5690 +Khronos,6x6,ldr-rgba-specgloss.png,36.4896,0.4238,0.3685,2.8455 +Khronos,6x6,ldr-xy-normal1.png,40.6311,0.2807,0.1979,5.2993 +Khronos,6x6,ldr-xy-normal2.png,45.1540,0.5110,0.2285,18.3564 +Khronos,8x8,ldr-l-occlusion.png,45.4494,0.0654,0.0352,29.7704 +Khronos,8x8,ldr-rgb-diffuse.png,40.2397,0.5202,0.3586,11.6971 +Khronos,8x8,ldr-rgb-emissive.png,46.7056,0.0587,0.0261,40.2170 +Khronos,8x8,ldr-rgb-metalrough.png,32.6674,0.3371,0.2881,3.6396 +Khronos,8x8,ldr-rgb-metalrough2.png,33.1989,1.8101,1.6358,2.5641 +Khronos,8x8,ldr-rgba-base.png,33.0632,0.3187,0.2642,3.9686 +Khronos,8x8,ldr-rgba-diffuse.png,32.5747,0.3644,0.3118,3.3631 +Khronos,8x8,ldr-rgba-specgloss.png,33.4751,0.4471,0.3893,2.6934 +Khronos,8x8,ldr-xy-normal1.png,37.4171,0.3091,0.2215,4.7342 +Khronos,8x8,ldr-xy-normal2.png,42.0727,0.5276,0.2448,17.1344 +Khronos,12x12,ldr-l-occlusion.png,41.6742,0.0605,0.0220,47.7213 +Khronos,12x12,ldr-rgb-diffuse.png,35.7658,0.4717,0.3044,13.7780 +Khronos,12x12,ldr-rgb-emissive.png,41.3741,0.0694,0.0286,36.6788 +Khronos,12x12,ldr-rgb-metalrough.png,29.0892,0.3004,0.2445,4.2891 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1599,1.1734,0.9917,4.2296 +Khronos,12x12,ldr-rgba-base.png,29.6109,0.3060,0.2439,4.2985 +Khronos,12x12,ldr-rgba-diffuse.png,29.0613,0.4114,0.3503,2.9933 +Khronos,12x12,ldr-rgba-specgloss.png,30.4743,0.3253,0.2578,4.0673 +Khronos,12x12,ldr-xy-normal1.png,33.4993,0.2788,0.1831,5.7260 +Khronos,12x12,ldr-xy-normal2.png,37.8161,0.5493,0.2584,16.2331 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-avx2_thorough_results.csv new file mode 100644 index 0000000..e22a0ef --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-avx2_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,70.5315,0.0890,0.0644,16.2895 +Khronos,4x4,ldr-rgb-diffuse.png,54.7187,1.8348,1.6789,2.4982 +Khronos,4x4,ldr-rgb-emissive.png,60.8411,0.0771,0.0500,20.9841 +Khronos,4x4,ldr-rgb-metalrough.png,44.9834,0.5172,0.4748,2.2086 +Khronos,4x4,ldr-rgb-metalrough2.png,44.0109,3.0104,2.8367,1.4786 +Khronos,4x4,ldr-rgba-base.png,44.0067,0.6797,0.6302,1.6639 +Khronos,4x4,ldr-rgba-diffuse.png,44.4135,0.4941,0.4464,2.3489 +Khronos,4x4,ldr-rgba-specgloss.png,42.4620,0.8713,0.8182,1.2816 +Khronos,4x4,ldr-xy-normal1.png,46.6816,1.0432,0.9630,1.0889 +Khronos,4x4,ldr-xy-normal2.png,50.5731,2.7388,2.4906,1.6841 +Khronos,5x5,ldr-l-occlusion.png,58.7308,0.1542,0.1278,8.2076 +Khronos,5x5,ldr-rgb-diffuse.png,49.7919,1.5934,1.4369,2.9189 +Khronos,5x5,ldr-rgb-emissive.png,56.1398,0.0879,0.0595,17.6142 +Khronos,5x5,ldr-rgb-metalrough.png,40.4561,0.6178,0.5739,1.8271 +Khronos,5x5,ldr-rgb-metalrough2.png,39.4939,3.5505,3.3775,1.2418 +Khronos,5x5,ldr-rgba-base.png,39.7539,0.7923,0.7392,1.4186 +Khronos,5x5,ldr-rgba-diffuse.png,39.8978,0.5850,0.5359,1.9565 +Khronos,5x5,ldr-rgba-specgloss.png,39.0262,0.9859,0.9311,1.1262 +Khronos,5x5,ldr-xy-normal1.png,43.4105,1.2222,1.1415,0.9186 +Khronos,5x5,ldr-xy-normal2.png,47.7893,3.5399,3.2755,1.2805 +Khronos,6x6,ldr-l-occlusion.png,52.2696,0.2047,0.1784,5.8767 +Khronos,6x6,ldr-rgb-diffuse.png,45.7745,1.4895,1.3304,3.1526 +Khronos,6x6,ldr-rgb-emissive.png,52.6625,0.0966,0.0679,15.4371 +Khronos,6x6,ldr-rgb-metalrough.png,37.0147,0.7595,0.7145,1.4676 +Khronos,6x6,ldr-rgb-metalrough2.png,36.7447,4.2513,4.0776,1.0286 +Khronos,6x6,ldr-rgba-base.png,36.8327,0.9392,0.8874,1.1816 +Khronos,6x6,ldr-rgba-diffuse.png,36.6564,0.7070,0.6575,1.5947 +Khronos,6x6,ldr-rgba-specgloss.png,36.6739,1.1431,1.0886,0.9632 +Khronos,6x6,ldr-xy-normal1.png,41.1133,1.0974,1.0155,1.0325 +Khronos,6x6,ldr-xy-normal2.png,45.8124,2.8938,2.6204,1.6007 +Khronos,8x8,ldr-l-occlusion.png,46.0393,0.2484,0.2170,4.8313 +Khronos,8x8,ldr-rgb-diffuse.png,40.8641,1.5870,1.4261,2.9412 +Khronos,8x8,ldr-rgb-emissive.png,47.6060,0.1006,0.0668,15.6956 +Khronos,8x8,ldr-rgb-metalrough.png,32.8279,0.9382,0.8883,1.1805 +Khronos,8x8,ldr-rgb-metalrough2.png,33.5845,5.2332,5.0573,0.8294 +Khronos,8x8,ldr-rgba-base.png,33.2523,1.1619,1.1053,0.9487 +Khronos,8x8,ldr-rgba-diffuse.png,32.7215,0.9205,0.8662,1.2106 +Khronos,8x8,ldr-rgba-specgloss.png,33.6278,1.4210,1.3596,0.7712 +Khronos,8x8,ldr-xy-normal1.png,37.7223,0.7286,0.6426,1.6319 +Khronos,8x8,ldr-xy-normal2.png,42.5159,1.3968,1.1160,3.7585 +Khronos,12x12,ldr-l-occlusion.png,42.4633,0.2079,0.1684,6.2280 +Khronos,12x12,ldr-rgb-diffuse.png,36.6027,1.7913,1.6187,2.5911 +Khronos,12x12,ldr-rgb-emissive.png,42.3476,0.1380,0.0939,11.1628 +Khronos,12x12,ldr-rgb-metalrough.png,29.2644,1.1208,1.0620,0.9873 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7448,5.7565,5.5722,0.7527 +Khronos,12x12,ldr-rgba-base.png,29.9105,1.2119,1.1465,0.9146 +Khronos,12x12,ldr-rgba-diffuse.png,29.2512,1.1582,1.0952,0.9574 +Khronos,12x12,ldr-rgba-specgloss.png,30.6950,1.6220,1.5533,0.6751 +Khronos,12x12,ldr-xy-normal1.png,33.9598,0.7437,0.6468,1.6212 +Khronos,12x12,ldr-xy-normal2.png,38.4366,1.1253,0.8352,5.0220 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse2_fast_results.csv new file mode 100644 index 0000000..4222587 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse2_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,64.2943,0.0433,0.0174,60.1623 +Khronos,4x4,ldr-rgb-diffuse.png,52.5337,0.2688,0.1110,37.7957 +Khronos,4x4,ldr-rgb-emissive.png,58.5505,0.0432,0.0148,70.7684 +Khronos,4x4,ldr-rgb-metalrough.png,44.2748,0.1163,0.0736,14.2373 +Khronos,4x4,ldr-rgb-metalrough2.png,42.9160,0.6176,0.4457,9.4114 +Khronos,4x4,ldr-rgba-base.png,43.2384,0.1418,0.0922,11.3775 +Khronos,4x4,ldr-rgba-diffuse.png,43.8337,0.1160,0.0681,15.3924 +Khronos,4x4,ldr-rgba-specgloss.png,41.6515,0.1904,0.1368,7.6640 +Khronos,4x4,ldr-xy-normal1.png,44.9658,0.1949,0.1137,9.2198 +Khronos,4x4,ldr-xy-normal2.png,48.6954,0.4516,0.1818,23.0719 +Khronos,5x5,ldr-l-occlusion.png,54.3853,0.0414,0.0142,74.0462 +Khronos,5x5,ldr-rgb-diffuse.png,47.2206,0.2468,0.0869,48.2626 +Khronos,5x5,ldr-rgb-emissive.png,52.6484,0.0423,0.0130,80.6345 +Khronos,5x5,ldr-rgb-metalrough.png,39.8152,0.1045,0.0612,17.1235 +Khronos,5x5,ldr-rgb-metalrough2.png,37.8813,0.6623,0.4883,8.5904 +Khronos,5x5,ldr-rgba-base.png,38.8783,0.1251,0.0738,14.2159 +Khronos,5x5,ldr-rgba-diffuse.png,39.1281,0.1216,0.0724,14.4781 +Khronos,5x5,ldr-rgba-specgloss.png,38.3729,0.1507,0.0960,10.9187 +Khronos,5x5,ldr-xy-normal1.png,41.8817,0.1733,0.0897,11.6877 +Khronos,5x5,ldr-xy-normal2.png,46.1664,0.4135,0.1290,32.5027 +Khronos,6x6,ldr-l-occlusion.png,48.3853,0.0427,0.0151,69.3458 +Khronos,6x6,ldr-rgb-diffuse.png,43.2790,0.2766,0.1161,36.1276 +Khronos,6x6,ldr-rgb-emissive.png,49.1258,0.0426,0.0130,80.8777 +Khronos,6x6,ldr-rgb-metalrough.png,36.4555,0.1213,0.0775,13.5237 +Khronos,6x6,ldr-rgb-metalrough2.png,35.2939,0.7031,0.5287,7.9328 +Khronos,6x6,ldr-rgba-base.png,36.1037,0.1404,0.0888,11.8119 +Khronos,6x6,ldr-rgba-diffuse.png,36.0866,0.1435,0.0943,11.1160 +Khronos,6x6,ldr-rgba-specgloss.png,36.1059,0.1627,0.1076,9.7480 +Khronos,6x6,ldr-xy-normal1.png,39.6565,0.1726,0.0885,11.8487 +Khronos,6x6,ldr-xy-normal2.png,44.1113,0.4143,0.1308,32.0729 +Khronos,8x8,ldr-l-occlusion.png,43.9509,0.0469,0.0157,66.6401 +Khronos,8x8,ldr-rgb-diffuse.png,38.3579,0.2976,0.1371,30.6031 +Khronos,8x8,ldr-rgb-emissive.png,44.5417,0.0471,0.0134,78.3630 +Khronos,8x8,ldr-rgb-metalrough.png,32.3176,0.1517,0.1036,10.1257 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1727,0.6083,0.4304,9.7461 +Khronos,8x8,ldr-rgba-base.png,32.3786,0.1574,0.1023,10.2521 +Khronos,8x8,ldr-rgba-diffuse.png,32.1163,0.1786,0.1255,8.3526 +Khronos,8x8,ldr-rgba-specgloss.png,32.9674,0.1749,0.1161,9.0284 +Khronos,8x8,ldr-xy-normal1.png,36.4984,0.1726,0.0846,12.4013 +Khronos,8x8,ldr-xy-normal2.png,40.6917,0.4408,0.1508,27.8198 +Khronos,12x12,ldr-l-occlusion.png,40.5785,0.0524,0.0144,73.0306 +Khronos,12x12,ldr-rgb-diffuse.png,33.3691,0.2643,0.0977,42.9217 +Khronos,12x12,ldr-rgb-emissive.png,39.4740,0.0531,0.0124,84.2844 +Khronos,12x12,ldr-rgb-metalrough.png,28.6341,0.1106,0.0565,18.5717 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2524,0.3622,0.1777,23.6053 +Khronos,12x12,ldr-rgba-base.png,29.0205,0.1365,0.0758,13.8340 +Khronos,12x12,ldr-rgba-diffuse.png,28.6231,0.1462,0.0870,12.0523 +Khronos,12x12,ldr-rgba-specgloss.png,29.8092,0.1255,0.0606,17.2955 +Khronos,12x12,ldr-xy-normal1.png,32.7294,0.1484,0.0526,19.9429 +Khronos,12x12,ldr-xy-normal2.png,36.2128,0.4227,0.1276,32.8798 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse2_fastest_results.csv new file mode 100644 index 0000000..1cfe659 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse2_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,64.1811,0.0406,0.0150,69.9513 +Khronos,4x4,ldr-rgb-diffuse.png,52.3048,0.2564,0.0993,42.2591 +Khronos,4x4,ldr-rgb-emissive.png,57.9745,0.0422,0.0143,73.1216 +Khronos,4x4,ldr-rgb-metalrough.png,43.8757,0.0951,0.0531,19.7628 +Khronos,4x4,ldr-rgb-metalrough2.png,42.6172,0.4577,0.2873,14.5977 +Khronos,4x4,ldr-rgba-base.png,42.7808,0.1094,0.0601,17.4353 +Khronos,4x4,ldr-rgba-diffuse.png,43.2186,0.0931,0.0456,22.9775 +Khronos,4x4,ldr-rgba-specgloss.png,41.2397,0.1395,0.0868,12.0841 +Khronos,4x4,ldr-xy-normal1.png,44.7980,0.1512,0.0710,14.7739 +Khronos,4x4,ldr-xy-normal2.png,48.3359,0.4176,0.1445,29.0215 +Khronos,5x5,ldr-l-occlusion.png,53.9891,0.0404,0.0141,74.2048 +Khronos,5x5,ldr-rgb-diffuse.png,47.0472,0.2413,0.0828,50.6314 +Khronos,5x5,ldr-rgb-emissive.png,52.3396,0.0414,0.0133,78.7094 +Khronos,5x5,ldr-rgb-metalrough.png,39.2552,0.0880,0.0454,23.1153 +Khronos,5x5,ldr-rgb-metalrough2.png,37.2923,0.4893,0.3160,13.2714 +Khronos,5x5,ldr-rgba-base.png,38.0848,0.1018,0.0518,20.2447 +Khronos,5x5,ldr-rgba-diffuse.png,38.3579,0.0965,0.0492,21.3273 +Khronos,5x5,ldr-rgba-specgloss.png,37.9190,0.1199,0.0670,15.6588 +Khronos,5x5,ldr-xy-normal1.png,41.3049,0.1469,0.0644,16.2853 +Khronos,5x5,ldr-xy-normal2.png,45.6138,0.3923,0.1107,37.8807 +Khronos,6x6,ldr-l-occlusion.png,48.3038,0.0407,0.0140,74.7065 +Khronos,6x6,ldr-rgb-diffuse.png,43.2173,0.2575,0.0996,42.1288 +Khronos,6x6,ldr-rgb-emissive.png,48.9702,0.0404,0.0116,90.5115 +Khronos,6x6,ldr-rgb-metalrough.png,36.2530,0.0952,0.0524,20.0041 +Khronos,6x6,ldr-rgb-metalrough2.png,35.0960,0.4903,0.3160,13.2712 +Khronos,6x6,ldr-rgba-base.png,35.9357,0.1064,0.0573,18.3083 +Khronos,6x6,ldr-rgba-diffuse.png,35.9044,0.1061,0.0580,18.0720 +Khronos,6x6,ldr-rgba-specgloss.png,35.8773,0.1223,0.0684,15.3375 +Khronos,6x6,ldr-xy-normal1.png,38.8396,0.1479,0.0652,16.0763 +Khronos,6x6,ldr-xy-normal2.png,43.4426,0.3881,0.1075,38.9998 +Khronos,8x8,ldr-l-occlusion.png,43.4865,0.0427,0.0133,78.6095 +Khronos,8x8,ldr-rgb-diffuse.png,38.2787,0.2716,0.1124,37.3189 +Khronos,8x8,ldr-rgb-emissive.png,44.2565,0.0428,0.0110,95.5080 +Khronos,8x8,ldr-rgb-metalrough.png,32.2167,0.1168,0.0707,14.8410 +Khronos,8x8,ldr-rgb-metalrough2.png,32.0902,0.4810,0.3045,13.7757 +Khronos,8x8,ldr-rgba-base.png,32.2303,0.1232,0.0695,15.0851 +Khronos,8x8,ldr-rgba-diffuse.png,32.0058,0.1357,0.0839,12.5018 +Khronos,8x8,ldr-rgba-specgloss.png,32.8371,0.1350,0.0778,13.4737 +Khronos,8x8,ldr-xy-normal1.png,36.2071,0.1467,0.0596,17.5847 +Khronos,8x8,ldr-xy-normal2.png,40.2733,0.4062,0.1196,35.0677 +Khronos,12x12,ldr-l-occlusion.png,40.2271,0.0467,0.0132,79.4086 +Khronos,12x12,ldr-rgb-diffuse.png,33.3234,0.2477,0.0846,49.5557 +Khronos,12x12,ldr-rgb-emissive.png,39.2738,0.0467,0.0105,100.2747 +Khronos,12x12,ldr-rgb-metalrough.png,28.5929,0.0923,0.0422,24.8195 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1679,0.3209,0.1408,29.7986 +Khronos,12x12,ldr-rgba-base.png,28.9701,0.1127,0.0549,19.1018 +Khronos,12x12,ldr-rgba-diffuse.png,28.5748,0.1192,0.0633,16.5730 +Khronos,12x12,ldr-rgba-specgloss.png,29.7683,0.1046,0.0448,23.4214 +Khronos,12x12,ldr-xy-normal1.png,32.6096,0.1328,0.0417,25.1710 +Khronos,12x12,ldr-xy-normal2.png,36.0023,0.3974,0.1054,39.7786 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse2_medium_results.csv new file mode 100644 index 0000000..8130bbf --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse2_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.9245,0.0559,0.0290,36.1168 +Khronos,4x4,ldr-rgb-diffuse.png,54.0221,0.5109,0.3524,11.9030 +Khronos,4x4,ldr-rgb-emissive.png,59.8356,0.0577,0.0283,37.0402 +Khronos,4x4,ldr-rgb-metalrough.png,44.8439,0.3091,0.2651,3.9550 +Khronos,4x4,ldr-rgb-metalrough2.png,43.7387,1.9253,1.7504,2.3962 +Khronos,4x4,ldr-rgba-base.png,43.8181,0.3896,0.3391,3.0919 +Khronos,4x4,ldr-rgba-diffuse.png,44.2283,0.2815,0.2329,4.5024 +Khronos,4x4,ldr-rgba-specgloss.png,42.2924,0.5203,0.4661,2.2496 +Khronos,4x4,ldr-xy-normal1.png,46.4815,0.4465,0.3657,2.8675 +Khronos,4x4,ldr-xy-normal2.png,50.2696,1.0112,0.7526,5.5728 +Khronos,5x5,ldr-l-occlusion.png,57.1580,0.0593,0.0312,33.6232 +Khronos,5x5,ldr-rgb-diffuse.png,48.9900,0.5235,0.3637,11.5331 +Khronos,5x5,ldr-rgb-emissive.png,55.3732,0.0613,0.0307,34.1946 +Khronos,5x5,ldr-rgb-metalrough.png,40.2386,0.3521,0.3067,3.4192 +Khronos,5x5,ldr-rgb-metalrough2.png,39.0265,2.3999,2.2243,1.8857 +Khronos,5x5,ldr-rgba-base.png,39.3979,0.4565,0.4029,2.6028 +Khronos,5x5,ldr-rgba-diffuse.png,39.5646,0.3627,0.3122,3.3589 +Khronos,5x5,ldr-rgba-specgloss.png,38.7813,0.5897,0.5342,1.9628 +Khronos,5x5,ldr-xy-normal1.png,43.0494,0.4409,0.3575,2.9331 +Khronos,5x5,ldr-xy-normal2.png,47.2289,0.8760,0.6006,6.9841 +Khronos,6x6,ldr-l-occlusion.png,50.8663,0.0714,0.0423,24.8048 +Khronos,6x6,ldr-rgb-diffuse.png,44.9305,0.5407,0.3803,11.0301 +Khronos,6x6,ldr-rgb-emissive.png,51.5230,0.0613,0.0302,34.7350 +Khronos,6x6,ldr-rgb-metalrough.png,36.8282,0.3705,0.3245,3.2312 +Khronos,6x6,ldr-rgb-metalrough2.png,36.4385,2.3842,2.2069,1.9006 +Khronos,6x6,ldr-rgba-base.png,36.6372,0.4265,0.3735,2.8072 +Khronos,6x6,ldr-rgba-diffuse.png,36.4889,0.3953,0.3437,3.0505 +Khronos,6x6,ldr-rgba-specgloss.png,36.4896,0.6061,0.5502,1.9058 +Khronos,6x6,ldr-xy-normal1.png,40.6311,0.3764,0.2912,3.6012 +Khronos,6x6,ldr-xy-normal2.png,45.1540,0.6099,0.3252,12.8980 +Khronos,8x8,ldr-l-occlusion.png,45.4494,0.0846,0.0524,19.9996 +Khronos,8x8,ldr-rgb-diffuse.png,40.2397,0.7274,0.5646,7.4283 +Khronos,8x8,ldr-rgb-emissive.png,46.7056,0.0725,0.0374,28.0421 +Khronos,8x8,ldr-rgb-metalrough.png,32.6674,0.4987,0.4489,2.3361 +Khronos,8x8,ldr-rgb-metalrough2.png,33.1989,2.7002,2.5186,1.6654 +Khronos,8x8,ldr-rgba-base.png,33.0632,0.4653,0.4085,2.5671 +Khronos,8x8,ldr-rgba-diffuse.png,32.5747,0.5347,0.4814,2.1780 +Khronos,8x8,ldr-rgba-specgloss.png,33.4751,0.6588,0.5997,1.7484 +Khronos,8x8,ldr-xy-normal1.png,37.4171,0.4297,0.3402,3.0819 +Khronos,8x8,ldr-xy-normal2.png,42.0727,0.6618,0.3714,11.2922 +Khronos,12x12,ldr-l-occlusion.png,41.6742,0.0714,0.0315,33.2510 +Khronos,12x12,ldr-rgb-diffuse.png,35.7658,0.6473,0.4764,8.8044 +Khronos,12x12,ldr-rgb-emissive.png,41.3741,0.0836,0.0410,25.5501 +Khronos,12x12,ldr-rgb-metalrough.png,29.0892,0.4308,0.3730,2.8114 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1599,1.7010,1.5141,2.7702 +Khronos,12x12,ldr-rgba-base.png,29.6109,0.4367,0.3722,2.8169 +Khronos,12x12,ldr-rgba-diffuse.png,29.0613,0.5935,0.5312,1.9740 +Khronos,12x12,ldr-rgba-specgloss.png,30.4743,0.4619,0.3937,2.6634 +Khronos,12x12,ldr-xy-normal1.png,33.4993,0.3781,0.2799,3.7467 +Khronos,12x12,ldr-xy-normal2.png,37.8161,0.6928,0.3942,10.6405 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse2_thorough_results.csv new file mode 100644 index 0000000..4f767df --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse2_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,70.5315,0.1152,0.0879,11.9285 +Khronos,4x4,ldr-rgb-diffuse.png,54.7187,2.4752,2.3161,1.8110 +Khronos,4x4,ldr-rgb-emissive.png,60.8411,0.0932,0.0641,16.3633 +Khronos,4x4,ldr-rgb-metalrough.png,44.9834,0.6943,0.6493,1.6148 +Khronos,4x4,ldr-rgb-metalrough2.png,44.0109,4.0555,3.8794,1.0812 +Khronos,4x4,ldr-rgba-base.png,44.0067,0.9142,0.8609,1.2179 +Khronos,4x4,ldr-rgba-diffuse.png,44.4135,0.6521,0.6030,1.7390 +Khronos,4x4,ldr-rgba-specgloss.png,42.4620,1.1507,1.0960,0.9568 +Khronos,4x4,ldr-xy-normal1.png,46.6816,1.3263,1.2459,0.8416 +Khronos,4x4,ldr-xy-normal2.png,50.5731,3.5048,3.2499,1.2906 +Khronos,5x5,ldr-l-occlusion.png,58.7308,0.2119,0.1837,5.7078 +Khronos,5x5,ldr-rgb-diffuse.png,49.7919,2.2626,2.1019,1.9955 +Khronos,5x5,ldr-rgb-emissive.png,56.1398,0.1121,0.0813,12.9019 +Khronos,5x5,ldr-rgb-metalrough.png,40.4561,0.8844,0.8383,1.2508 +Khronos,5x5,ldr-rgb-metalrough2.png,39.4939,5.1171,4.9407,0.8489 +Khronos,5x5,ldr-rgba-base.png,39.7539,1.1256,1.0725,0.9777 +Khronos,5x5,ldr-rgba-diffuse.png,39.8978,0.8279,0.7771,1.3494 +Khronos,5x5,ldr-rgba-specgloss.png,39.0262,1.3952,1.3396,0.7827 +Khronos,5x5,ldr-xy-normal1.png,43.4105,1.6830,1.5991,0.6557 +Khronos,5x5,ldr-xy-normal2.png,47.7893,4.8954,4.6209,0.9077 +Khronos,6x6,ldr-l-occlusion.png,52.2696,0.2970,0.2679,3.9143 +Khronos,6x6,ldr-rgb-diffuse.png,45.7745,2.1797,2.0180,2.0785 +Khronos,6x6,ldr-rgb-emissive.png,52.6625,0.1261,0.0948,11.0630 +Khronos,6x6,ldr-rgb-metalrough.png,37.0147,1.1210,1.0745,0.9758 +Khronos,6x6,ldr-rgb-metalrough2.png,36.7447,6.2531,6.0746,0.6905 +Khronos,6x6,ldr-rgba-base.png,36.8327,1.3906,1.3371,0.7842 +Khronos,6x6,ldr-rgba-diffuse.png,36.6564,1.0332,0.9812,1.0686 +Khronos,6x6,ldr-rgba-specgloss.png,36.6739,1.6520,1.5960,0.6570 +Khronos,6x6,ldr-xy-normal1.png,41.1133,1.5640,1.4790,0.7090 +Khronos,6x6,ldr-xy-normal2.png,45.8124,4.1248,3.8481,1.0900 +Khronos,8x8,ldr-l-occlusion.png,46.0393,0.3707,0.3364,3.1174 +Khronos,8x8,ldr-rgb-diffuse.png,40.8641,2.4013,2.2367,1.8752 +Khronos,8x8,ldr-rgb-emissive.png,47.6060,0.1350,0.0975,10.7554 +Khronos,8x8,ldr-rgb-metalrough.png,32.8279,1.4264,1.3755,0.7623 +Khronos,8x8,ldr-rgb-metalrough2.png,33.5845,7.9530,7.7734,0.5396 +Khronos,8x8,ldr-rgba-base.png,33.2523,1.7583,1.7005,0.6166 +Khronos,8x8,ldr-rgba-diffuse.png,32.7215,1.3905,1.3338,0.7861 +Khronos,8x8,ldr-rgba-specgloss.png,33.6278,2.1263,2.0656,0.5076 +Khronos,8x8,ldr-xy-normal1.png,37.7223,1.0690,0.9792,1.0709 +Khronos,8x8,ldr-xy-normal2.png,42.5159,2.0313,1.7438,2.4052 +Khronos,12x12,ldr-l-occlusion.png,42.4633,0.2987,0.2550,4.1115 +Khronos,12x12,ldr-rgb-diffuse.png,36.6027,2.6774,2.5038,1.6752 +Khronos,12x12,ldr-rgb-emissive.png,42.3476,0.1853,0.1401,7.4844 +Khronos,12x12,ldr-rgb-metalrough.png,29.2644,1.6780,1.6177,0.6482 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7448,8.6487,8.4606,0.4957 +Khronos,12x12,ldr-rgba-base.png,29.9105,1.8067,1.7395,0.6028 +Khronos,12x12,ldr-rgba-diffuse.png,29.2512,1.7249,1.6611,0.6313 +Khronos,12x12,ldr-rgba-specgloss.png,30.6950,2.4073,2.3382,0.4485 +Khronos,12x12,ldr-xy-normal1.png,33.9598,1.0843,0.9860,1.0635 +Khronos,12x12,ldr-xy-normal2.png,38.4366,1.5801,1.2855,3.2628 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse4.1_fast_results.csv new file mode 100644 index 0000000..0448eb1 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse4.1_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,64.2943,0.0418,0.0164,64.1133 +Khronos,4x4,ldr-rgb-diffuse.png,52.5337,0.2551,0.1003,41.8067 +Khronos,4x4,ldr-rgb-emissive.png,58.5505,0.0431,0.0150,70.0683 +Khronos,4x4,ldr-rgb-metalrough.png,44.2748,0.1075,0.0652,16.0894 +Khronos,4x4,ldr-rgb-metalrough2.png,42.9160,0.5669,0.3952,10.6126 +Khronos,4x4,ldr-rgba-base.png,43.2384,0.1317,0.0820,12.7936 +Khronos,4x4,ldr-rgba-diffuse.png,43.8337,0.1084,0.0611,17.1669 +Khronos,4x4,ldr-rgba-specgloss.png,41.6515,0.1743,0.1218,8.6099 +Khronos,4x4,ldr-xy-normal1.png,44.9658,0.1830,0.1017,10.3109 +Khronos,4x4,ldr-xy-normal2.png,48.6954,0.4304,0.1643,25.5244 +Khronos,5x5,ldr-l-occlusion.png,54.3853,0.0399,0.0139,75.4485 +Khronos,5x5,ldr-rgb-diffuse.png,47.2206,0.2397,0.0823,50.9468 +Khronos,5x5,ldr-rgb-emissive.png,52.6484,0.0419,0.0135,77.9091 +Khronos,5x5,ldr-rgb-metalrough.png,39.8152,0.0980,0.0547,19.1847 +Khronos,5x5,ldr-rgb-metalrough2.png,37.8813,0.6004,0.4239,9.8950 +Khronos,5x5,ldr-rgba-base.png,38.8783,0.1158,0.0655,16.0044 +Khronos,5x5,ldr-rgba-diffuse.png,39.1281,0.1127,0.0648,16.1737 +Khronos,5x5,ldr-rgba-specgloss.png,38.3729,0.1378,0.0849,12.3471 +Khronos,5x5,ldr-xy-normal1.png,41.8817,0.1617,0.0789,13.2972 +Khronos,5x5,ldr-xy-normal2.png,46.1664,0.3947,0.1168,35.9144 +Khronos,6x6,ldr-l-occlusion.png,48.3853,0.0408,0.0141,74.1410 +Khronos,6x6,ldr-rgb-diffuse.png,43.2790,0.2633,0.1061,39.5182 +Khronos,6x6,ldr-rgb-emissive.png,49.1258,0.0415,0.0127,82.4407 +Khronos,6x6,ldr-rgb-metalrough.png,36.4555,0.1111,0.0679,15.4457 +Khronos,6x6,ldr-rgb-metalrough2.png,35.2939,0.6376,0.4623,9.0726 +Khronos,6x6,ldr-rgba-base.png,36.1037,0.1288,0.0779,13.4581 +Khronos,6x6,ldr-rgba-diffuse.png,36.0866,0.1315,0.0829,12.6490 +Khronos,6x6,ldr-rgba-specgloss.png,36.1059,0.1488,0.0941,11.1448 +Khronos,6x6,ldr-xy-normal1.png,39.6565,0.1600,0.0776,13.5120 +Khronos,6x6,ldr-xy-normal2.png,44.1113,0.3988,0.1177,35.6334 +Khronos,8x8,ldr-l-occlusion.png,43.9509,0.0443,0.0143,73.5841 +Khronos,8x8,ldr-rgb-diffuse.png,38.3579,0.2780,0.1203,34.8520 +Khronos,8x8,ldr-rgb-emissive.png,44.5417,0.0454,0.0125,84.0268 +Khronos,8x8,ldr-rgb-metalrough.png,32.3176,0.1369,0.0898,11.6707 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1727,0.5558,0.3785,11.0828 +Khronos,8x8,ldr-rgba-base.png,32.3786,0.1442,0.0896,11.7087 +Khronos,8x8,ldr-rgba-diffuse.png,32.1163,0.1622,0.1093,9.5939 +Khronos,8x8,ldr-rgba-specgloss.png,32.9674,0.1597,0.1015,10.3265 +Khronos,8x8,ldr-xy-normal1.png,36.4984,0.1605,0.0741,14.1512 +Khronos,8x8,ldr-xy-normal2.png,40.6917,0.4154,0.1321,31.7491 +Khronos,12x12,ldr-l-occlusion.png,40.5785,0.0506,0.0134,78.1361 +Khronos,12x12,ldr-rgb-diffuse.png,33.3691,0.2510,0.0868,48.3125 +Khronos,12x12,ldr-rgb-emissive.png,39.4740,0.0517,0.0120,87.2576 +Khronos,12x12,ldr-rgb-metalrough.png,28.6341,0.1032,0.0499,21.0009 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2524,0.3401,0.1578,26.5834 +Khronos,12x12,ldr-rgba-base.png,29.0205,0.1279,0.0674,15.5610 +Khronos,12x12,ldr-rgba-diffuse.png,28.6231,0.1356,0.0774,13.5421 +Khronos,12x12,ldr-rgba-specgloss.png,29.8092,0.1188,0.0540,19.4055 +Khronos,12x12,ldr-xy-normal1.png,32.7294,0.1408,0.0467,22.4423 +Khronos,12x12,ldr-xy-normal2.png,36.2128,0.4050,0.1128,37.1991 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse4.1_fastest_results.csv new file mode 100644 index 0000000..310f5b6 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse4.1_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,64.1811,0.0390,0.0145,72.1169 +Khronos,4x4,ldr-rgb-diffuse.png,52.3048,0.2421,0.0883,47.4781 +Khronos,4x4,ldr-rgb-emissive.png,57.9745,0.0410,0.0135,77.9146 +Khronos,4x4,ldr-rgb-metalrough.png,43.8757,0.0886,0.0470,22.3206 +Khronos,4x4,ldr-rgb-metalrough2.png,42.6172,0.4240,0.2524,16.6195 +Khronos,4x4,ldr-rgba-base.png,42.7808,0.1027,0.0537,19.5110 +Khronos,4x4,ldr-rgba-diffuse.png,43.2186,0.0884,0.0412,25.4397 +Khronos,4x4,ldr-rgba-specgloss.png,41.2397,0.1293,0.0767,13.6759 +Khronos,4x4,ldr-xy-normal1.png,44.7980,0.1420,0.0629,16.6673 +Khronos,4x4,ldr-xy-normal2.png,48.3359,0.3947,0.1277,32.8429 +Khronos,5x5,ldr-l-occlusion.png,53.9891,0.0390,0.0139,75.4369 +Khronos,5x5,ldr-rgb-diffuse.png,47.0472,0.2339,0.0767,54.6995 +Khronos,5x5,ldr-rgb-emissive.png,52.3396,0.0406,0.0126,83.3927 +Khronos,5x5,ldr-rgb-metalrough.png,39.2552,0.0830,0.0406,25.8282 +Khronos,5x5,ldr-rgb-metalrough2.png,37.2923,0.4472,0.2748,15.2658 +Khronos,5x5,ldr-rgba-base.png,38.0848,0.0952,0.0457,22.9443 +Khronos,5x5,ldr-rgba-diffuse.png,38.3579,0.0912,0.0437,23.9784 +Khronos,5x5,ldr-rgba-specgloss.png,37.9190,0.1117,0.0585,17.9232 +Khronos,5x5,ldr-xy-normal1.png,41.3049,0.1367,0.0564,18.5994 +Khronos,5x5,ldr-xy-normal2.png,45.6138,0.3779,0.1003,41.8306 +Khronos,6x6,ldr-l-occlusion.png,48.3038,0.0387,0.0133,78.7983 +Khronos,6x6,ldr-rgb-diffuse.png,43.2173,0.2492,0.0901,46.5734 +Khronos,6x6,ldr-rgb-emissive.png,48.9702,0.0394,0.0112,93.7490 +Khronos,6x6,ldr-rgb-metalrough.png,36.2530,0.0882,0.0460,22.7719 +Khronos,6x6,ldr-rgb-metalrough2.png,35.0960,0.4539,0.2791,15.0299 +Khronos,6x6,ldr-rgba-base.png,35.9357,0.1001,0.0505,20.7532 +Khronos,6x6,ldr-rgba-diffuse.png,35.9044,0.0990,0.0515,20.3801 +Khronos,6x6,ldr-rgba-specgloss.png,35.8773,0.1136,0.0599,17.5028 +Khronos,6x6,ldr-xy-normal1.png,38.8396,0.1378,0.0574,18.2704 +Khronos,6x6,ldr-xy-normal2.png,43.4426,0.3758,0.0973,43.1273 +Khronos,8x8,ldr-l-occlusion.png,43.4865,0.0405,0.0122,85.8222 +Khronos,8x8,ldr-rgb-diffuse.png,38.2787,0.2538,0.0988,42.4426 +Khronos,8x8,ldr-rgb-emissive.png,44.2565,0.0417,0.0105,99.6837 +Khronos,8x8,ldr-rgb-metalrough.png,32.2167,0.1073,0.0619,16.9330 +Khronos,8x8,ldr-rgb-metalrough2.png,32.0902,0.4417,0.2659,15.7752 +Khronos,8x8,ldr-rgba-base.png,32.2303,0.1141,0.0610,17.1942 +Khronos,8x8,ldr-rgba-diffuse.png,32.0058,0.1246,0.0737,14.2251 +Khronos,8x8,ldr-rgba-specgloss.png,32.8371,0.1246,0.0683,15.3592 +Khronos,8x8,ldr-xy-normal1.png,36.2071,0.1358,0.0524,20.0225 +Khronos,8x8,ldr-xy-normal2.png,40.2733,0.3867,0.1054,39.8104 +Khronos,12x12,ldr-l-occlusion.png,40.2271,0.0444,0.0116,90.6589 +Khronos,12x12,ldr-rgb-diffuse.png,33.3234,0.2338,0.0749,56.0279 +Khronos,12x12,ldr-rgb-emissive.png,39.2738,0.0455,0.0101,103.8721 +Khronos,12x12,ldr-rgb-metalrough.png,28.5929,0.0873,0.0374,28.0316 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1679,0.3039,0.1251,33.5324 +Khronos,12x12,ldr-rgba-base.png,28.9701,0.1059,0.0490,21.4069 +Khronos,12x12,ldr-rgba-diffuse.png,28.5748,0.1109,0.0564,18.5957 +Khronos,12x12,ldr-rgba-specgloss.png,29.7683,0.0994,0.0398,26.3613 +Khronos,12x12,ldr-xy-normal1.png,32.6096,0.1254,0.0368,28.4575 +Khronos,12x12,ldr-xy-normal2.png,36.0023,0.3763,0.0930,45.0908 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse4.1_medium_results.csv new file mode 100644 index 0000000..12f6ed2 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse4.1_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.9245,0.0526,0.0268,39.1157 +Khronos,4x4,ldr-rgb-diffuse.png,54.0221,0.4617,0.3060,13.7058 +Khronos,4x4,ldr-rgb-emissive.png,59.8356,0.0549,0.0265,39.6406 +Khronos,4x4,ldr-rgb-metalrough.png,44.8439,0.2722,0.2285,4.5886 +Khronos,4x4,ldr-rgb-metalrough2.png,43.7387,1.6815,1.5116,2.7747 +Khronos,4x4,ldr-rgba-base.png,43.8181,0.3440,0.2944,3.5613 +Khronos,4x4,ldr-rgba-diffuse.png,44.2283,0.2512,0.2029,5.1672 +Khronos,4x4,ldr-rgba-specgloss.png,42.2924,0.4609,0.4074,2.5736 +Khronos,4x4,ldr-xy-normal1.png,46.4815,0.4048,0.3227,3.2499 +Khronos,4x4,ldr-xy-normal2.png,50.2696,0.9086,0.6548,6.4054 +Khronos,5x5,ldr-l-occlusion.png,57.1580,0.0560,0.0282,37.2167 +Khronos,5x5,ldr-rgb-diffuse.png,48.9900,0.4727,0.3157,13.2850 +Khronos,5x5,ldr-rgb-emissive.png,55.3732,0.0576,0.0279,37.6442 +Khronos,5x5,ldr-rgb-metalrough.png,40.2386,0.3073,0.2618,4.0051 +Khronos,5x5,ldr-rgb-metalrough2.png,39.0265,2.0781,1.9019,2.2053 +Khronos,5x5,ldr-rgba-base.png,39.3979,0.3988,0.3466,3.0253 +Khronos,5x5,ldr-rgba-diffuse.png,39.5646,0.3194,0.2694,3.8919 +Khronos,5x5,ldr-rgba-specgloss.png,38.7813,0.5136,0.4585,2.2868 +Khronos,5x5,ldr-xy-normal1.png,43.0494,0.3912,0.3093,3.3900 +Khronos,5x5,ldr-xy-normal2.png,47.2289,0.7928,0.5195,8.0732 +Khronos,6x6,ldr-l-occlusion.png,50.8663,0.0660,0.0380,27.6136 +Khronos,6x6,ldr-rgb-diffuse.png,44.9305,0.4927,0.3328,12.6049 +Khronos,6x6,ldr-rgb-emissive.png,51.5230,0.0579,0.0277,37.8493 +Khronos,6x6,ldr-rgb-metalrough.png,36.8282,0.3281,0.2831,3.7041 +Khronos,6x6,ldr-rgb-metalrough2.png,36.4385,2.0877,1.9101,2.1958 +Khronos,6x6,ldr-rgba-base.png,36.6372,0.3749,0.3223,3.2536 +Khronos,6x6,ldr-rgba-diffuse.png,36.4889,0.3492,0.2991,3.5056 +Khronos,6x6,ldr-rgba-specgloss.png,36.4896,0.5348,0.4795,2.1867 +Khronos,6x6,ldr-xy-normal1.png,40.6311,0.3377,0.2536,4.1351 +Khronos,6x6,ldr-xy-normal2.png,45.1540,0.5663,0.2863,14.6496 +Khronos,8x8,ldr-l-occlusion.png,45.4494,0.0777,0.0463,22.6240 +Khronos,8x8,ldr-rgb-diffuse.png,40.2397,0.6532,0.4935,8.4987 +Khronos,8x8,ldr-rgb-emissive.png,46.7056,0.0677,0.0334,31.4086 +Khronos,8x8,ldr-rgb-metalrough.png,32.6674,0.4406,0.3921,2.6742 +Khronos,8x8,ldr-rgb-metalrough2.png,33.1989,2.3871,2.2108,1.8972 +Khronos,8x8,ldr-rgba-base.png,33.0632,0.4168,0.3610,2.9048 +Khronos,8x8,ldr-rgba-diffuse.png,32.5747,0.4764,0.4215,2.4878 +Khronos,8x8,ldr-rgba-specgloss.png,33.4751,0.5866,0.5269,1.9903 +Khronos,8x8,ldr-xy-normal1.png,37.4171,0.3863,0.2968,3.5326 +Khronos,8x8,ldr-xy-normal2.png,42.0727,0.6099,0.3244,12.9311 +Khronos,12x12,ldr-l-occlusion.png,41.6742,0.0675,0.0285,36.7653 +Khronos,12x12,ldr-rgb-diffuse.png,35.7658,0.5883,0.4194,10.0015 +Khronos,12x12,ldr-rgb-emissive.png,41.3741,0.0790,0.0367,28.5380 +Khronos,12x12,ldr-rgb-metalrough.png,29.0892,0.3861,0.3300,3.1779 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1599,1.5251,1.3372,3.1366 +Khronos,12x12,ldr-rgba-base.png,29.6109,0.3927,0.3275,3.2019 +Khronos,12x12,ldr-rgba-diffuse.png,29.0613,0.5317,0.4699,2.2313 +Khronos,12x12,ldr-rgba-specgloss.png,30.4743,0.4166,0.3493,3.0019 +Khronos,12x12,ldr-xy-normal1.png,33.4993,0.3454,0.2490,4.2108 +Khronos,12x12,ldr-xy-normal2.png,37.8161,0.6426,0.3499,11.9875 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse4.1_thorough_results.csv new file mode 100644 index 0000000..5b33740 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.6-sse4.1_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,70.5315,0.1035,0.0773,13.5691 +Khronos,4x4,ldr-rgb-diffuse.png,54.7187,2.1796,2.0238,2.0724 +Khronos,4x4,ldr-rgb-emissive.png,60.8411,0.0872,0.0585,17.9238 +Khronos,4x4,ldr-rgb-metalrough.png,44.9834,0.6117,0.5690,1.8429 +Khronos,4x4,ldr-rgb-metalrough2.png,44.0109,3.5575,3.3844,1.2393 +Khronos,4x4,ldr-rgba-base.png,44.0067,0.8048,0.7540,1.3906 +Khronos,4x4,ldr-rgba-diffuse.png,44.4135,0.5796,0.5311,1.9743 +Khronos,4x4,ldr-rgba-specgloss.png,42.4620,1.0263,0.9726,1.0781 +Khronos,4x4,ldr-xy-normal1.png,46.6816,1.1963,1.1171,0.9387 +Khronos,4x4,ldr-xy-normal2.png,50.5731,3.1594,2.9096,1.4415 +Khronos,5x5,ldr-l-occlusion.png,58.7308,0.1880,0.1604,6.5373 +Khronos,5x5,ldr-rgb-diffuse.png,49.7919,1.9859,1.8249,2.2983 +Khronos,5x5,ldr-rgb-emissive.png,56.1398,0.1012,0.0714,14.6841 +Khronos,5x5,ldr-rgb-metalrough.png,40.4561,0.7671,0.7222,1.4520 +Khronos,5x5,ldr-rgb-metalrough2.png,39.4939,4.4480,4.2712,0.9820 +Khronos,5x5,ldr-rgba-base.png,39.7539,0.9879,0.9353,1.1211 +Khronos,5x5,ldr-rgba-diffuse.png,39.8978,0.7282,0.6784,1.5456 +Khronos,5x5,ldr-rgba-specgloss.png,39.0262,1.2268,1.1715,0.8951 +Khronos,5x5,ldr-xy-normal1.png,43.4105,1.4933,1.4107,0.7433 +Khronos,5x5,ldr-xy-normal2.png,47.7893,4.3236,4.0619,1.0326 +Khronos,6x6,ldr-l-occlusion.png,52.2696,0.2620,0.2340,4.4813 +Khronos,6x6,ldr-rgb-diffuse.png,45.7745,1.9165,1.7569,2.3874 +Khronos,6x6,ldr-rgb-emissive.png,52.6625,0.1140,0.0835,12.5527 +Khronos,6x6,ldr-rgb-metalrough.png,37.0147,0.9830,0.9373,1.1187 +Khronos,6x6,ldr-rgb-metalrough2.png,36.7447,5.4681,5.2870,0.7933 +Khronos,6x6,ldr-rgba-base.png,36.8327,1.2103,1.1583,0.9053 +Khronos,6x6,ldr-rgba-diffuse.png,36.6564,0.9085,0.8582,1.2218 +Khronos,6x6,ldr-rgba-specgloss.png,36.6739,1.4683,1.4115,0.7429 +Khronos,6x6,ldr-xy-normal1.png,41.1133,1.3865,1.3025,0.8050 +Khronos,6x6,ldr-xy-normal2.png,45.8124,3.6665,3.3881,1.2380 +Khronos,8x8,ldr-l-occlusion.png,46.0393,0.3299,0.2963,3.5392 +Khronos,8x8,ldr-rgb-diffuse.png,40.8641,2.1190,1.9581,2.1420 +Khronos,8x8,ldr-rgb-emissive.png,47.6060,0.1228,0.0877,11.9625 +Khronos,8x8,ldr-rgb-metalrough.png,32.8279,1.2598,1.2097,0.8668 +Khronos,8x8,ldr-rgb-metalrough2.png,33.5845,7.0352,6.8538,0.6120 +Khronos,8x8,ldr-rgba-base.png,33.2523,1.5600,1.5035,0.6974 +Khronos,8x8,ldr-rgba-diffuse.png,32.7215,1.2334,1.1786,0.8897 +Khronos,8x8,ldr-rgba-specgloss.png,33.6278,1.8922,1.8310,0.5727 +Khronos,8x8,ldr-xy-normal1.png,37.7223,0.9534,0.8633,1.2145 +Khronos,8x8,ldr-xy-normal2.png,42.5159,1.8083,1.5287,2.7436 +Khronos,12x12,ldr-l-occlusion.png,42.4633,0.2682,0.2263,4.6326 +Khronos,12x12,ldr-rgb-diffuse.png,36.6027,2.3875,2.2137,1.8947 +Khronos,12x12,ldr-rgb-emissive.png,42.3476,0.1695,0.1248,8.4039 +Khronos,12x12,ldr-rgb-metalrough.png,29.2644,1.4912,1.4321,0.7322 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7448,7.6917,7.5016,0.5591 +Khronos,12x12,ldr-rgba-base.png,29.9105,1.6103,1.5443,0.6790 +Khronos,12x12,ldr-rgba-diffuse.png,29.2512,1.5374,1.4741,0.7113 +Khronos,12x12,ldr-rgba-specgloss.png,30.6950,2.1464,2.0777,0.5047 +Khronos,12x12,ldr-xy-normal1.png,33.9598,0.9725,0.8733,1.2007 +Khronos,12x12,ldr-xy-normal2.png,38.4366,1.4302,1.1373,3.6878 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-avx2_fast_results.csv new file mode 100644 index 0000000..92a71b0 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-avx2_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,64.2943,0.0373,0.0153,68.7087 +Khronos,4x4,ldr-rgb-diffuse.png,52.5337,0.2077,0.0915,45.8329 +Khronos,4x4,ldr-rgb-emissive.png,58.5505,0.0397,0.0162,64.7314 +Khronos,4x4,ldr-rgb-metalrough.png,44.2748,0.0908,0.0578,18.1327 +Khronos,4x4,ldr-rgb-metalrough2.png,42.9160,0.4711,0.3484,12.0383 +Khronos,4x4,ldr-rgba-base.png,43.2384,0.1090,0.0725,14.4701 +Khronos,4x4,ldr-rgba-diffuse.png,43.8337,0.0908,0.0552,19.0015 +Khronos,4x4,ldr-rgba-specgloss.png,41.6516,0.1462,0.1077,9.7388 +Khronos,4x4,ldr-xy-normal1.png,44.9659,0.1531,0.0898,11.6729 +Khronos,4x4,ldr-xy-normal2.png,48.6954,0.3623,0.1437,29.1928 +Khronos,5x5,ldr-l-occlusion.png,54.3853,0.0361,0.0131,80.0270 +Khronos,5x5,ldr-rgb-diffuse.png,47.2206,0.1895,0.0756,55.4567 +Khronos,5x5,ldr-rgb-emissive.png,52.6484,0.0376,0.0129,81.1029 +Khronos,5x5,ldr-rgb-metalrough.png,39.8153,0.0800,0.0465,22.5510 +Khronos,5x5,ldr-rgb-metalrough2.png,37.8813,0.4813,0.3564,11.7696 +Khronos,5x5,ldr-rgba-base.png,38.8861,0.0927,0.0552,18.9815 +Khronos,5x5,ldr-rgba-diffuse.png,39.1290,0.0909,0.0546,19.2026 +Khronos,5x5,ldr-rgba-specgloss.png,38.3728,0.1105,0.0712,14.7237 +Khronos,5x5,ldr-xy-normal1.png,41.8816,0.1329,0.0674,15.5513 +Khronos,5x5,ldr-xy-normal2.png,46.1675,0.3365,0.1051,39.9256 +Khronos,6x6,ldr-l-occlusion.png,48.3856,0.0359,0.0126,83.0761 +Khronos,6x6,ldr-rgb-diffuse.png,43.2790,0.2008,0.0849,49.4232 +Khronos,6x6,ldr-rgb-emissive.png,49.1262,0.0372,0.0123,85.1889 +Khronos,6x6,ldr-rgb-metalrough.png,36.4558,0.0874,0.0535,19.5900 +Khronos,6x6,ldr-rgb-metalrough2.png,35.2940,0.4887,0.3625,11.5696 +Khronos,6x6,ldr-rgba-base.png,36.1465,0.0993,0.0613,17.1143 +Khronos,6x6,ldr-rgba-diffuse.png,36.1109,0.1026,0.0659,15.9099 +Khronos,6x6,ldr-rgba-specgloss.png,36.1063,0.1138,0.0739,14.1818 +Khronos,6x6,ldr-xy-normal1.png,39.6587,0.1284,0.0618,16.9780 +Khronos,6x6,ldr-xy-normal2.png,44.1122,0.3302,0.0975,43.0291 +Khronos,8x8,ldr-l-occlusion.png,43.9509,0.0393,0.0121,86.6371 +Khronos,8x8,ldr-rgb-diffuse.png,38.3579,0.2062,0.0911,46.0331 +Khronos,8x8,ldr-rgb-emissive.png,44.5417,0.0403,0.0111,94.1181 +Khronos,8x8,ldr-rgb-metalrough.png,32.3221,0.1057,0.0681,15.4030 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1735,0.4106,0.2849,14.7227 +Khronos,8x8,ldr-rgba-base.png,32.4344,0.1117,0.0692,15.1574 +Khronos,8x8,ldr-rgba-diffuse.png,32.1528,0.1250,0.0838,12.5098 +Khronos,8x8,ldr-rgba-specgloss.png,32.9651,0.1211,0.0768,13.6455 +Khronos,8x8,ldr-xy-normal1.png,36.5136,0.1266,0.0571,18.3651 +Khronos,8x8,ldr-xy-normal2.png,40.7081,0.3338,0.1013,41.3933 +Khronos,12x12,ldr-l-occlusion.png,40.5785,0.0450,0.0108,97.2890 +Khronos,12x12,ldr-rgb-diffuse.png,33.3691,0.1937,0.0683,61.4458 +Khronos,12x12,ldr-rgb-emissive.png,39.4740,0.0458,0.0102,102.4422 +Khronos,12x12,ldr-rgb-metalrough.png,28.6393,0.0825,0.0380,27.6268 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2526,0.2590,0.1240,33.8272 +Khronos,12x12,ldr-rgba-base.png,29.0353,0.0995,0.0508,20.6434 +Khronos,12x12,ldr-rgba-diffuse.png,28.6266,0.1060,0.0587,17.8709 +Khronos,12x12,ldr-rgba-specgloss.png,29.8100,0.0908,0.0406,25.8389 +Khronos,12x12,ldr-xy-normal1.png,32.7462,0.1141,0.0374,28.0098 +Khronos,12x12,ldr-xy-normal2.png,36.2212,0.3376,0.0950,44.1558 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-avx2_fastest_results.csv new file mode 100644 index 0000000..0826acc --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-avx2_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,64.1811,0.0358,0.0143,73.2044 +Khronos,4x4,ldr-rgb-diffuse.png,52.3048,0.1993,0.0859,48.8119 +Khronos,4x4,ldr-rgb-emissive.png,57.9745,0.0371,0.0143,73.2239 +Khronos,4x4,ldr-rgb-metalrough.png,43.8757,0.0726,0.0408,25.6871 +Khronos,4x4,ldr-rgb-metalrough2.png,42.6172,0.3398,0.2172,19.3147 +Khronos,4x4,ldr-rgba-base.png,42.7856,0.0845,0.0479,21.9043 +Khronos,4x4,ldr-rgba-diffuse.png,43.2186,0.0711,0.0361,29.0594 +Khronos,4x4,ldr-rgba-specgloss.png,41.2397,0.1055,0.0672,15.6017 +Khronos,4x4,ldr-xy-normal1.png,44.7981,0.1185,0.0554,18.9345 +Khronos,4x4,ldr-xy-normal2.png,48.3359,0.3339,0.1119,37.4984 +Khronos,5x5,ldr-l-occlusion.png,53.9892,0.0349,0.0127,82.3188 +Khronos,5x5,ldr-rgb-diffuse.png,47.0472,0.1827,0.0688,60.9673 +Khronos,5x5,ldr-rgb-emissive.png,52.3396,0.0364,0.0130,80.4810 +Khronos,5x5,ldr-rgb-metalrough.png,39.2554,0.0668,0.0337,31.0809 +Khronos,5x5,ldr-rgb-metalrough2.png,37.2923,0.3549,0.2309,18.1627 +Khronos,5x5,ldr-rgba-base.png,38.2416,0.0755,0.0383,27.3836 +Khronos,5x5,ldr-rgba-diffuse.png,38.4404,0.0719,0.0358,29.2727 +Khronos,5x5,ldr-rgba-specgloss.png,37.9182,0.0886,0.0493,21.2529 +Khronos,5x5,ldr-xy-normal1.png,41.3098,0.1123,0.0481,21.7809 +Khronos,5x5,ldr-xy-normal2.png,45.6455,0.3220,0.0909,46.1232 +Khronos,6x6,ldr-l-occlusion.png,48.3043,0.0344,0.0120,87.3096 +Khronos,6x6,ldr-rgb-diffuse.png,43.2173,0.1870,0.0725,57.8660 +Khronos,6x6,ldr-rgb-emissive.png,48.9702,0.0352,0.0113,92.4678 +Khronos,6x6,ldr-rgb-metalrough.png,36.2530,0.0690,0.0359,29.1710 +Khronos,6x6,ldr-rgb-metalrough2.png,35.0960,0.3439,0.2179,19.2492 +Khronos,6x6,ldr-rgba-base.png,35.9930,0.0771,0.0401,26.1686 +Khronos,6x6,ldr-rgba-diffuse.png,35.9379,0.0768,0.0405,25.9157 +Khronos,6x6,ldr-rgba-specgloss.png,35.8780,0.0869,0.0476,22.0358 +Khronos,6x6,ldr-xy-normal1.png,38.8417,0.1101,0.0460,22.7729 +Khronos,6x6,ldr-xy-normal2.png,43.4552,0.3094,0.0803,52.2375 +Khronos,8x8,ldr-l-occlusion.png,43.4865,0.0365,0.0105,99.9965 +Khronos,8x8,ldr-rgb-diffuse.png,38.2787,0.1885,0.0757,55.3799 +Khronos,8x8,ldr-rgb-emissive.png,44.2565,0.0367,0.0093,112.8485 +Khronos,8x8,ldr-rgb-metalrough.png,32.2230,0.0835,0.0477,21.9891 +Khronos,8x8,ldr-rgb-metalrough2.png,32.0902,0.3270,0.2041,20.5531 +Khronos,8x8,ldr-rgba-base.png,32.3141,0.0883,0.0479,21.9070 +Khronos,8x8,ldr-rgba-diffuse.png,32.0388,0.0962,0.0573,18.3154 +Khronos,8x8,ldr-rgba-specgloss.png,32.8378,0.0951,0.0530,19.7796 +Khronos,8x8,ldr-xy-normal1.png,36.2257,0.1084,0.0405,25.8843 +Khronos,8x8,ldr-xy-normal2.png,40.2806,0.3116,0.0809,51.8353 +Khronos,12x12,ldr-l-occlusion.png,40.2271,0.0399,0.0099,105.6385 +Khronos,12x12,ldr-rgb-diffuse.png,33.3234,0.1834,0.0625,67.0713 +Khronos,12x12,ldr-rgb-emissive.png,39.2738,0.0399,0.0087,120.3033 +Khronos,12x12,ldr-rgb-metalrough.png,28.5951,0.0688,0.0286,36.6059 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1680,0.2315,0.1012,41.4378 +Khronos,12x12,ldr-rgba-base.png,28.9761,0.0811,0.0365,28.6996 +Khronos,12x12,ldr-rgba-diffuse.png,28.5781,0.0868,0.0429,24.4269 +Khronos,12x12,ldr-rgba-specgloss.png,29.7683,0.0761,0.0305,34.4270 +Khronos,12x12,ldr-xy-normal1.png,32.6311,0.1005,0.0279,37.5686 +Khronos,12x12,ldr-xy-normal2.png,36.0090,0.3145,0.0757,55.3814 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-avx2_medium_results.csv new file mode 100644 index 0000000..3bbed96 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-avx2_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.9241,0.0451,0.0224,46.7549 +Khronos,4x4,ldr-rgb-diffuse.png,54.0220,0.3614,0.2467,17.0030 +Khronos,4x4,ldr-rgb-emissive.png,59.8355,0.0507,0.0260,40.3624 +Khronos,4x4,ldr-rgb-metalrough.png,44.8439,0.2230,0.1899,5.5214 +Khronos,4x4,ldr-rgb-metalrough2.png,43.7387,1.3884,1.2642,3.3178 +Khronos,4x4,ldr-rgba-base.png,43.8182,0.2833,0.2448,4.2832 +Khronos,4x4,ldr-rgba-diffuse.png,44.2282,0.2042,0.1676,6.2553 +Khronos,4x4,ldr-rgba-specgloss.png,42.2924,0.3733,0.3333,3.1463 +Khronos,4x4,ldr-xy-normal1.png,46.4813,0.3347,0.2712,3.8668 +Khronos,4x4,ldr-xy-normal2.png,50.2697,0.7537,0.5460,7.6824 +Khronos,5x5,ldr-l-occlusion.png,57.1582,0.0478,0.0236,44.3857 +Khronos,5x5,ldr-rgb-diffuse.png,48.9898,0.3614,0.2452,17.1053 +Khronos,5x5,ldr-rgb-emissive.png,55.3721,0.0499,0.0240,43.6141 +Khronos,5x5,ldr-rgb-metalrough.png,40.2389,0.2388,0.2038,5.1462 +Khronos,5x5,ldr-rgb-metalrough2.png,39.0265,1.6118,1.4865,2.8216 +Khronos,5x5,ldr-rgba-base.png,39.4069,0.3111,0.2719,3.8569 +Khronos,5x5,ldr-rgba-diffuse.png,39.5655,0.2478,0.2092,5.0116 +Khronos,5x5,ldr-rgba-specgloss.png,38.7778,0.3968,0.3554,2.9502 +Khronos,5x5,ldr-xy-normal1.png,43.0478,0.3105,0.2438,4.3002 +Khronos,5x5,ldr-xy-normal2.png,47.2289,0.6411,0.4146,10.1156 +Khronos,6x6,ldr-l-occlusion.png,50.8664,0.0556,0.0305,34.3436 +Khronos,6x6,ldr-rgb-diffuse.png,44.9305,0.3664,0.2495,16.8102 +Khronos,6x6,ldr-rgb-emissive.png,51.5230,0.0507,0.0239,43.9269 +Khronos,6x6,ldr-rgb-metalrough.png,36.8297,0.2444,0.2096,5.0030 +Khronos,6x6,ldr-rgb-metalrough2.png,36.4385,1.5671,1.4371,2.9185 +Khronos,6x6,ldr-rgba-base.png,36.6600,0.2820,0.2422,4.3288 +Khronos,6x6,ldr-rgba-diffuse.png,36.4968,0.2627,0.2236,4.6886 +Khronos,6x6,ldr-rgba-specgloss.png,36.4898,0.4011,0.3575,2.9330 +Khronos,6x6,ldr-xy-normal1.png,40.6313,0.2611,0.1938,5.4112 +Khronos,6x6,ldr-xy-normal2.png,45.1539,0.4548,0.2239,18.7331 +Khronos,8x8,ldr-l-occlusion.png,45.4494,0.0637,0.0357,29.3489 +Khronos,8x8,ldr-rgb-diffuse.png,40.2400,0.4705,0.3517,11.9263 +Khronos,8x8,ldr-rgb-emissive.png,46.7056,0.0570,0.0270,38.8434 +Khronos,8x8,ldr-rgb-metalrough.png,32.6672,0.3212,0.2815,3.7255 +Khronos,8x8,ldr-rgb-metalrough2.png,33.1993,1.7299,1.6027,2.6170 +Khronos,8x8,ldr-rgba-base.png,33.0666,0.3037,0.2597,4.0370 +Khronos,8x8,ldr-rgba-diffuse.png,32.5794,0.3481,0.3062,3.4240 +Khronos,8x8,ldr-rgba-specgloss.png,33.4730,0.4268,0.3823,2.7431 +Khronos,8x8,ldr-xy-normal1.png,37.4170,0.2907,0.2194,4.7794 +Khronos,8x8,ldr-xy-normal2.png,42.0752,0.4743,0.2402,17.4597 +Khronos,12x12,ldr-l-occlusion.png,41.6742,0.0591,0.0217,48.2369 +Khronos,12x12,ldr-rgb-diffuse.png,35.7657,0.4317,0.3031,13.8401 +Khronos,12x12,ldr-rgb-emissive.png,41.3741,0.0661,0.0275,38.0846 +Khronos,12x12,ldr-rgb-metalrough.png,29.0921,0.2856,0.2388,4.3907 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1608,1.1096,0.9739,4.3068 +Khronos,12x12,ldr-rgba-base.png,29.6309,0.2917,0.2400,4.3693 +Khronos,12x12,ldr-rgba-diffuse.png,29.0674,0.3943,0.3443,3.0456 +Khronos,12x12,ldr-rgba-specgloss.png,30.4747,0.3066,0.2536,4.1351 +Khronos,12x12,ldr-xy-normal1.png,33.5015,0.2608,0.1801,5.8215 +Khronos,12x12,ldr-xy-normal2.png,37.8164,0.5024,0.2587,16.2139 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-avx2_thorough_results.csv new file mode 100644 index 0000000..2d57ec5 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-avx2_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,70.5315,0.0869,0.0640,16.3737 +Khronos,4x4,ldr-rgb-diffuse.png,54.7186,1.7650,1.6506,2.5410 +Khronos,4x4,ldr-rgb-emissive.png,60.8411,0.0749,0.0507,20.6925 +Khronos,4x4,ldr-rgb-metalrough.png,44.9834,0.4995,0.4663,2.2485 +Khronos,4x4,ldr-rgb-metalrough2.png,44.0109,2.9087,2.7858,1.5056 +Khronos,4x4,ldr-rgba-base.png,44.0074,0.6569,0.6182,1.6962 +Khronos,4x4,ldr-rgba-diffuse.png,44.4143,0.4733,0.4371,2.3989 +Khronos,4x4,ldr-rgba-specgloss.png,42.4617,0.8325,0.7926,1.3229 +Khronos,4x4,ldr-xy-normal1.png,46.6817,1.0055,0.9422,1.1129 +Khronos,4x4,ldr-xy-normal2.png,50.5734,2.6490,2.4454,1.7152 +Khronos,5x5,ldr-l-occlusion.png,58.7331,0.1502,0.1260,8.3249 +Khronos,5x5,ldr-rgb-diffuse.png,49.7917,1.5314,1.4150,2.9642 +Khronos,5x5,ldr-rgb-emissive.png,56.1399,0.0848,0.0593,17.6912 +Khronos,5x5,ldr-rgb-metalrough.png,40.4567,0.5948,0.5597,1.8735 +Khronos,5x5,ldr-rgb-metalrough2.png,39.4939,3.4418,3.3148,1.2653 +Khronos,5x5,ldr-rgba-base.png,39.7586,0.7642,0.7247,1.4469 +Khronos,5x5,ldr-rgba-diffuse.png,39.8981,0.5642,0.5257,1.9947 +Khronos,5x5,ldr-rgba-specgloss.png,39.0247,0.9583,0.9165,1.1441 +Khronos,5x5,ldr-xy-normal1.png,43.4086,1.1861,1.1196,0.9365 +Khronos,5x5,ldr-xy-normal2.png,47.7884,3.4293,3.2094,1.3069 +Khronos,6x6,ldr-l-occlusion.png,52.2700,0.1979,0.1723,6.0842 +Khronos,6x6,ldr-rgb-diffuse.png,45.7745,1.4116,1.2922,3.2460 +Khronos,6x6,ldr-rgb-emissive.png,52.6625,0.0921,0.0657,15.9678 +Khronos,6x6,ldr-rgb-metalrough.png,37.0152,0.7318,0.6960,1.5067 +Khronos,6x6,ldr-rgb-metalrough2.png,36.7447,4.1146,3.9888,1.0515 +Khronos,6x6,ldr-rgba-base.png,36.8638,0.9059,0.8665,1.2101 +Khronos,6x6,ldr-rgba-diffuse.png,36.6647,0.6835,0.6449,1.6260 +Khronos,6x6,ldr-rgba-specgloss.png,36.6746,1.1009,1.0583,0.9908 +Khronos,6x6,ldr-xy-normal1.png,41.1135,1.0609,0.9937,1.0552 +Khronos,6x6,ldr-xy-normal2.png,45.8126,2.7911,2.5671,1.6338 +Khronos,8x8,ldr-l-occlusion.png,46.0393,0.2418,0.2111,4.9677 +Khronos,8x8,ldr-rgb-diffuse.png,40.8642,1.5160,1.3972,3.0020 +Khronos,8x8,ldr-rgb-emissive.png,47.6060,0.0978,0.0666,15.7373 +Khronos,8x8,ldr-rgb-metalrough.png,32.8288,0.9108,0.8700,1.2053 +Khronos,8x8,ldr-rgb-metalrough2.png,33.5847,5.1001,4.9720,0.8436 +Khronos,8x8,ldr-rgba-base.png,33.2578,1.1339,1.0887,0.9631 +Khronos,8x8,ldr-rgba-diffuse.png,32.7252,0.8962,0.8522,1.2304 +Khronos,8x8,ldr-rgba-specgloss.png,33.6269,1.3764,1.3295,0.7887 +Khronos,8x8,ldr-xy-normal1.png,37.7223,0.7053,0.6329,1.6567 +Khronos,8x8,ldr-xy-normal2.png,42.5153,1.3323,1.1006,3.8109 +Khronos,12x12,ldr-l-occlusion.png,42.4633,0.2033,0.1652,6.3477 +Khronos,12x12,ldr-rgb-diffuse.png,36.6027,1.7204,1.5923,2.6341 +Khronos,12x12,ldr-rgb-emissive.png,42.3480,0.1336,0.0930,11.2713 +Khronos,12x12,ldr-rgb-metalrough.png,29.2660,1.0886,1.0394,1.0088 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7449,5.6199,5.4796,0.7654 +Khronos,12x12,ldr-rgba-base.png,29.9101,1.1764,1.1232,0.9336 +Khronos,12x12,ldr-rgba-diffuse.png,29.2514,1.1257,1.0727,0.9775 +Khronos,12x12,ldr-rgba-specgloss.png,30.6953,1.5793,1.5239,0.6881 +Khronos,12x12,ldr-xy-normal1.png,33.9599,0.7164,0.6357,1.6495 +Khronos,12x12,ldr-xy-normal2.png,38.4364,1.0692,0.8252,5.0828 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse2_fast_results.csv new file mode 100644 index 0000000..352af2c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse2_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,64.2943,0.0414,0.0178,58.9416 +Khronos,4x4,ldr-rgb-diffuse.png,52.5337,0.2349,0.1168,35.9237 +Khronos,4x4,ldr-rgb-emissive.png,58.5505,0.0423,0.0167,62.7101 +Khronos,4x4,ldr-rgb-metalrough.png,44.2748,0.1083,0.0740,14.1697 +Khronos,4x4,ldr-rgb-metalrough2.png,42.9160,0.5772,0.4489,9.3431 +Khronos,4x4,ldr-rgba-base.png,43.2384,0.1309,0.0923,11.3578 +Khronos,4x4,ldr-rgba-diffuse.png,43.8337,0.1055,0.0685,15.3126 +Khronos,4x4,ldr-rgba-specgloss.png,41.6516,0.1767,0.1368,7.6673 +Khronos,4x4,ldr-xy-normal1.png,44.9659,0.1818,0.1146,9.1507 +Khronos,4x4,ldr-xy-normal2.png,48.6954,0.4113,0.1865,22.4933 +Khronos,5x5,ldr-l-occlusion.png,54.3853,0.0386,0.0137,76.5730 +Khronos,5x5,ldr-rgb-diffuse.png,47.2206,0.2093,0.0884,47.4587 +Khronos,5x5,ldr-rgb-emissive.png,52.6484,0.0409,0.0143,73.4869 +Khronos,5x5,ldr-rgb-metalrough.png,39.8153,0.0960,0.0609,17.2177 +Khronos,5x5,ldr-rgb-metalrough2.png,37.8813,0.6151,0.4846,8.6549 +Khronos,5x5,ldr-rgba-base.png,38.8861,0.1121,0.0736,14.2437 +Khronos,5x5,ldr-rgba-diffuse.png,39.1290,0.1105,0.0720,14.5567 +Khronos,5x5,ldr-rgba-specgloss.png,38.3728,0.1370,0.0957,10.9577 +Khronos,5x5,ldr-xy-normal1.png,41.8816,0.1578,0.0893,11.7442 +Khronos,5x5,ldr-xy-normal2.png,46.1675,0.3677,0.1295,32.3762 +Khronos,6x6,ldr-l-occlusion.png,48.3856,0.0403,0.0150,69.8080 +Khronos,6x6,ldr-rgb-diffuse.png,43.2790,0.2344,0.1145,36.6215 +Khronos,6x6,ldr-rgb-emissive.png,49.1262,0.0408,0.0139,75.4046 +Khronos,6x6,ldr-rgb-metalrough.png,36.4558,0.1127,0.0770,13.6187 +Khronos,6x6,ldr-rgb-metalrough2.png,35.2940,0.6542,0.5247,7.9934 +Khronos,6x6,ldr-rgba-base.png,36.1465,0.1281,0.0892,11.7610 +Khronos,6x6,ldr-rgba-diffuse.png,36.1109,0.1329,0.0948,11.0585 +Khronos,6x6,ldr-rgba-specgloss.png,36.1063,0.1488,0.1077,9.7368 +Khronos,6x6,ldr-xy-normal1.png,39.6587,0.1569,0.0878,11.9440 +Khronos,6x6,ldr-xy-normal2.png,44.1122,0.3659,0.1296,32.3599 +Khronos,8x8,ldr-l-occlusion.png,43.9509,0.0444,0.0158,66.2686 +Khronos,8x8,ldr-rgb-diffuse.png,38.3579,0.2603,0.1369,30.6294 +Khronos,8x8,ldr-rgb-emissive.png,44.5417,0.0450,0.0139,75.1983 +Khronos,8x8,ldr-rgb-metalrough.png,32.3221,0.1424,0.1033,10.1535 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1735,0.5655,0.4314,9.7226 +Khronos,8x8,ldr-rgba-base.png,32.4344,0.1476,0.1031,10.1668 +Khronos,8x8,ldr-rgba-diffuse.png,32.1528,0.1686,0.1261,8.3181 +Khronos,8x8,ldr-rgba-specgloss.png,32.9651,0.1612,0.1156,9.0720 +Khronos,8x8,ldr-xy-normal1.png,36.5136,0.1589,0.0849,12.3519 +Khronos,8x8,ldr-xy-normal2.png,40.7081,0.3945,0.1506,27.8427 +Khronos,12x12,ldr-l-occlusion.png,40.5785,0.0500,0.0148,71.0658 +Khronos,12x12,ldr-rgb-diffuse.png,33.3691,0.2295,0.0997,42.0706 +Khronos,12x12,ldr-rgb-emissive.png,39.4740,0.0504,0.0121,86.3242 +Khronos,12x12,ldr-rgb-metalrough.png,28.6393,0.1026,0.0562,18.6576 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2526,0.3196,0.1790,23.4312 +Khronos,12x12,ldr-rgba-base.png,29.0353,0.1266,0.0765,13.7085 +Khronos,12x12,ldr-rgba-diffuse.png,28.6266,0.1364,0.0868,12.0826 +Khronos,12x12,ldr-rgba-specgloss.png,29.8100,0.1124,0.0604,17.3476 +Khronos,12x12,ldr-xy-normal1.png,32.7462,0.1349,0.0559,18.7594 +Khronos,12x12,ldr-xy-normal2.png,36.2212,0.3862,0.1355,30.9469 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse2_fastest_results.csv new file mode 100644 index 0000000..e969283 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse2_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,64.1811,0.0394,0.0166,63.0608 +Khronos,4x4,ldr-rgb-diffuse.png,52.3048,0.2251,0.1065,39.3713 +Khronos,4x4,ldr-rgb-emissive.png,57.9745,0.0401,0.0150,70.1063 +Khronos,4x4,ldr-rgb-metalrough.png,43.8757,0.0908,0.0559,18.7577 +Khronos,4x4,ldr-rgb-metalrough2.png,42.6172,0.4174,0.2902,14.4554 +Khronos,4x4,ldr-rgba-base.png,42.7856,0.0981,0.0608,17.2491 +Khronos,4x4,ldr-rgba-diffuse.png,43.2186,0.0829,0.0462,22.7023 +Khronos,4x4,ldr-rgba-specgloss.png,41.2397,0.1271,0.0874,12.0018 +Khronos,4x4,ldr-xy-normal1.png,44.7981,0.1380,0.0719,14.5934 +Khronos,4x4,ldr-xy-normal2.png,48.3359,0.3754,0.1481,28.3131 +Khronos,5x5,ldr-l-occlusion.png,53.9892,0.0374,0.0138,75.8899 +Khronos,5x5,ldr-rgb-diffuse.png,47.0472,0.2044,0.0849,49.3993 +Khronos,5x5,ldr-rgb-emissive.png,52.3396,0.0392,0.0133,79.1314 +Khronos,5x5,ldr-rgb-metalrough.png,39.2554,0.0798,0.0453,23.1448 +Khronos,5x5,ldr-rgb-metalrough2.png,37.2923,0.4438,0.3144,13.3423 +Khronos,5x5,ldr-rgba-base.png,38.2416,0.0897,0.0520,20.1618 +Khronos,5x5,ldr-rgba-diffuse.png,38.4404,0.0855,0.0488,21.4678 +Khronos,5x5,ldr-rgba-specgloss.png,37.9182,0.1060,0.0662,15.8445 +Khronos,5x5,ldr-xy-normal1.png,41.3098,0.1315,0.0637,16.4485 +Khronos,5x5,ldr-xy-normal2.png,45.6455,0.3483,0.1110,37.7893 +Khronos,6x6,ldr-l-occlusion.png,48.3043,0.0378,0.0138,76.1000 +Khronos,6x6,ldr-rgb-diffuse.png,43.2173,0.2158,0.0970,43.2273 +Khronos,6x6,ldr-rgb-emissive.png,48.9702,0.0381,0.0122,86.0624 +Khronos,6x6,ldr-rgb-metalrough.png,36.2530,0.0870,0.0521,20.1370 +Khronos,6x6,ldr-rgb-metalrough2.png,35.0960,0.4434,0.3127,13.4153 +Khronos,6x6,ldr-rgba-base.png,35.9930,0.0955,0.0572,18.3449 +Khronos,6x6,ldr-rgba-diffuse.png,35.9379,0.0956,0.0574,18.2822 +Khronos,6x6,ldr-rgba-specgloss.png,35.8780,0.1101,0.0688,15.2463 +Khronos,6x6,ldr-xy-normal1.png,38.8417,0.1324,0.0645,16.2560 +Khronos,6x6,ldr-xy-normal2.png,43.4552,0.3420,0.1056,39.7120 +Khronos,8x8,ldr-l-occlusion.png,43.4865,0.0403,0.0134,78.3281 +Khronos,8x8,ldr-rgb-diffuse.png,38.2787,0.2332,0.1122,37.3844 +Khronos,8x8,ldr-rgb-emissive.png,44.2565,0.0407,0.0112,93.3887 +Khronos,8x8,ldr-rgb-metalrough.png,32.2230,0.1092,0.0709,14.7868 +Khronos,8x8,ldr-rgb-metalrough2.png,32.0902,0.4357,0.3046,13.7702 +Khronos,8x8,ldr-rgba-base.png,32.3141,0.1117,0.0698,15.0159 +Khronos,8x8,ldr-rgba-diffuse.png,32.0388,0.1245,0.0834,12.5759 +Khronos,8x8,ldr-rgba-specgloss.png,32.8378,0.1220,0.0779,13.4590 +Khronos,8x8,ldr-xy-normal1.png,36.2257,0.1296,0.0597,17.5517 +Khronos,8x8,ldr-xy-normal2.png,40.2806,0.3596,0.1195,35.1123 +Khronos,12x12,ldr-l-occlusion.png,40.2271,0.0439,0.0129,81.2527 +Khronos,12x12,ldr-rgb-diffuse.png,33.3234,0.2127,0.0867,48.3704 +Khronos,12x12,ldr-rgb-emissive.png,39.2738,0.0441,0.0103,101.4076 +Khronos,12x12,ldr-rgb-metalrough.png,28.5951,0.0845,0.0424,24.7363 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1680,0.2806,0.1433,29.2731 +Khronos,12x12,ldr-rgba-base.png,28.9761,0.1007,0.0554,18.9195 +Khronos,12x12,ldr-rgba-diffuse.png,28.5781,0.1083,0.0639,16.4155 +Khronos,12x12,ldr-rgba-specgloss.png,29.7683,0.0930,0.0448,23.3807 +Khronos,12x12,ldr-xy-normal1.png,32.6311,0.1168,0.0416,25.2303 +Khronos,12x12,ldr-xy-normal2.png,36.0090,0.3536,0.1066,39.3347 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse2_medium_results.csv new file mode 100644 index 0000000..fa6f0f5 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse2_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.9241,0.0553,0.0310,33.7792 +Khronos,4x4,ldr-rgb-diffuse.png,54.0220,0.4765,0.3551,11.8122 +Khronos,4x4,ldr-rgb-emissive.png,59.8355,0.0555,0.0291,35.9803 +Khronos,4x4,ldr-rgb-metalrough.png,44.8439,0.2957,0.2602,4.0300 +Khronos,4x4,ldr-rgb-metalrough2.png,43.7387,1.8598,1.7291,2.4257 +Khronos,4x4,ldr-rgba-base.png,43.8182,0.3745,0.3358,3.1227 +Khronos,4x4,ldr-rgba-diffuse.png,44.2282,0.2685,0.2302,4.5546 +Khronos,4x4,ldr-rgba-specgloss.png,42.2924,0.5053,0.4639,2.2604 +Khronos,4x4,ldr-xy-normal1.png,46.4813,0.4346,0.3663,2.8625 +Khronos,4x4,ldr-xy-normal2.png,50.2697,0.9678,0.7490,5.5998 +Khronos,5x5,ldr-l-occlusion.png,57.1582,0.0570,0.0310,33.7836 +Khronos,5x5,ldr-rgb-diffuse.png,48.9898,0.4820,0.3599,11.6532 +Khronos,5x5,ldr-rgb-emissive.png,55.3721,0.0592,0.0305,34.4270 +Khronos,5x5,ldr-rgb-metalrough.png,40.2389,0.3367,0.2999,3.4960 +Khronos,5x5,ldr-rgb-metalrough2.png,39.0265,2.3317,2.2007,1.9059 +Khronos,5x5,ldr-rgba-base.png,39.4069,0.4398,0.3984,2.6317 +Khronos,5x5,ldr-rgba-diffuse.png,39.5655,0.3478,0.3085,3.3994 +Khronos,5x5,ldr-rgba-specgloss.png,38.7778,0.5718,0.5296,1.9799 +Khronos,5x5,ldr-xy-normal1.png,43.0478,0.4238,0.3551,2.9531 +Khronos,5x5,ldr-xy-normal2.png,47.2289,0.8253,0.5947,7.0527 +Khronos,6x6,ldr-l-occlusion.png,50.8664,0.0687,0.0423,24.7650 +Khronos,6x6,ldr-rgb-diffuse.png,44.9305,0.4961,0.3738,11.2204 +Khronos,6x6,ldr-rgb-emissive.png,51.5230,0.0605,0.0312,33.5888 +Khronos,6x6,ldr-rgb-metalrough.png,36.8297,0.3563,0.3184,3.2931 +Khronos,6x6,ldr-rgb-metalrough2.png,36.4385,2.3132,2.1818,1.9224 +Khronos,6x6,ldr-rgba-base.png,36.6600,0.4098,0.3693,2.8394 +Khronos,6x6,ldr-rgba-diffuse.png,36.4968,0.3806,0.3411,3.0742 +Khronos,6x6,ldr-rgba-specgloss.png,36.4898,0.5888,0.5457,1.9216 +Khronos,6x6,ldr-xy-normal1.png,40.6313,0.3586,0.2887,3.6315 +Khronos,6x6,ldr-xy-normal2.png,45.1539,0.5601,0.3219,13.0283 +Khronos,8x8,ldr-l-occlusion.png,45.4494,0.0830,0.0527,19.9023 +Khronos,8x8,ldr-rgb-diffuse.png,40.2400,0.6842,0.5595,7.4965 +Khronos,8x8,ldr-rgb-emissive.png,46.7056,0.0696,0.0374,28.0030 +Khronos,8x8,ldr-rgb-metalrough.png,32.6672,0.4833,0.4416,2.3745 +Khronos,8x8,ldr-rgb-metalrough2.png,33.1993,2.6310,2.4977,1.6792 +Khronos,8x8,ldr-rgba-base.png,33.0666,0.4516,0.4075,2.5734 +Khronos,8x8,ldr-rgba-diffuse.png,32.5794,0.5249,0.4819,2.1757 +Khronos,8x8,ldr-rgba-specgloss.png,33.4730,0.6457,0.5981,1.7532 +Khronos,8x8,ldr-xy-normal1.png,37.4170,0.4118,0.3368,3.1136 +Khronos,8x8,ldr-xy-normal2.png,42.0752,0.6151,0.3702,11.3302 +Khronos,12x12,ldr-l-occlusion.png,41.6742,0.0694,0.0311,33.7230 +Khronos,12x12,ldr-rgb-diffuse.png,35.7657,0.6082,0.4765,8.8029 +Khronos,12x12,ldr-rgb-emissive.png,41.3741,0.0811,0.0402,26.0639 +Khronos,12x12,ldr-rgb-metalrough.png,29.0921,0.4204,0.3713,2.8240 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1608,1.6559,1.5135,2.7712 +Khronos,12x12,ldr-rgba-base.png,29.6309,0.4229,0.3714,2.8232 +Khronos,12x12,ldr-rgba-diffuse.png,29.0674,0.5797,0.5292,1.9813 +Khronos,12x12,ldr-rgba-specgloss.png,30.4747,0.4492,0.3930,2.6678 +Khronos,12x12,ldr-xy-normal1.png,33.5015,0.3609,0.2790,3.7588 +Khronos,12x12,ldr-xy-normal2.png,37.8164,0.6525,0.3952,10.6131 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse2_thorough_results.csv new file mode 100644 index 0000000..7590db6 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse2_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,70.5315,0.1101,0.0856,12.2474 +Khronos,4x4,ldr-rgb-diffuse.png,54.7186,2.3884,2.2693,1.8483 +Khronos,4x4,ldr-rgb-emissive.png,60.8411,0.0922,0.0655,15.9976 +Khronos,4x4,ldr-rgb-metalrough.png,44.9834,0.6637,0.6277,1.6704 +Khronos,4x4,ldr-rgb-metalrough2.png,44.0109,3.8843,3.7538,1.1173 +Khronos,4x4,ldr-rgba-base.png,44.0074,0.8742,0.8351,1.2557 +Khronos,4x4,ldr-rgba-diffuse.png,44.4143,0.6228,0.5853,1.7915 +Khronos,4x4,ldr-rgba-specgloss.png,42.4617,1.1211,1.0796,0.9713 +Khronos,4x4,ldr-xy-normal1.png,46.6817,1.2938,1.2288,0.8533 +Khronos,4x4,ldr-xy-normal2.png,50.5734,3.4208,3.2103,1.3065 +Khronos,5x5,ldr-l-occlusion.png,58.7331,0.2059,0.1799,5.8280 +Khronos,5x5,ldr-rgb-diffuse.png,49.7917,2.1898,2.0660,2.0301 +Khronos,5x5,ldr-rgb-emissive.png,56.1399,0.1085,0.0805,13.0196 +Khronos,5x5,ldr-rgb-metalrough.png,40.4567,0.8507,0.8134,1.2892 +Khronos,5x5,ldr-rgb-metalrough2.png,39.4939,4.9456,4.8142,0.8712 +Khronos,5x5,ldr-rgba-base.png,39.7586,1.0971,1.0561,0.9929 +Khronos,5x5,ldr-rgba-diffuse.png,39.8981,0.8049,0.7652,1.3703 +Khronos,5x5,ldr-rgba-specgloss.png,39.0247,1.3626,1.3198,0.7945 +Khronos,5x5,ldr-xy-normal1.png,43.4086,1.6538,1.5849,0.6616 +Khronos,5x5,ldr-xy-normal2.png,47.7884,4.7819,4.5596,0.9199 +Khronos,6x6,ldr-l-occlusion.png,52.2700,0.2866,0.2606,4.0238 +Khronos,6x6,ldr-rgb-diffuse.png,45.7745,2.1091,1.9838,2.1143 +Khronos,6x6,ldr-rgb-emissive.png,52.6625,0.1217,0.0932,11.2534 +Khronos,6x6,ldr-rgb-metalrough.png,37.0152,1.0884,1.0502,0.9984 +Khronos,6x6,ldr-rgb-metalrough2.png,36.7447,6.0896,5.9592,0.7038 +Khronos,6x6,ldr-rgba-base.png,36.8638,1.3427,1.3016,0.8056 +Khronos,6x6,ldr-rgba-diffuse.png,36.6647,1.0044,0.9648,1.0868 +Khronos,6x6,ldr-rgba-specgloss.png,36.6746,1.6258,1.5824,0.6627 +Khronos,6x6,ldr-xy-normal1.png,41.1135,1.5333,1.4628,0.7168 +Khronos,6x6,ldr-xy-normal2.png,45.8126,4.0331,3.8029,1.1029 +Khronos,8x8,ldr-l-occlusion.png,46.0393,0.3620,0.3310,3.1683 +Khronos,8x8,ldr-rgb-diffuse.png,40.8642,2.3271,2.2005,1.9061 +Khronos,8x8,ldr-rgb-emissive.png,47.6060,0.1298,0.0962,10.8944 +Khronos,8x8,ldr-rgb-metalrough.png,32.8288,1.3974,1.3554,0.7736 +Khronos,8x8,ldr-rgb-metalrough2.png,33.5847,7.8291,7.6926,0.5452 +Khronos,8x8,ldr-rgba-base.png,33.2578,1.7308,1.6860,0.6219 +Khronos,8x8,ldr-rgba-diffuse.png,32.7252,1.3607,1.3163,0.7966 +Khronos,8x8,ldr-rgba-specgloss.png,33.6269,2.1037,2.0560,0.5100 +Khronos,8x8,ldr-xy-normal1.png,37.7223,1.0427,0.9694,1.0817 +Khronos,8x8,ldr-xy-normal2.png,42.5153,1.9820,1.7350,2.4175 +Khronos,12x12,ldr-l-occlusion.png,42.4633,0.2947,0.2531,4.1424 +Khronos,12x12,ldr-rgb-diffuse.png,36.6027,2.6254,2.4901,1.6844 +Khronos,12x12,ldr-rgb-emissive.png,42.3480,0.1817,0.1394,7.5206 +Khronos,12x12,ldr-rgb-metalrough.png,29.2660,1.6599,1.6081,0.6521 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7449,8.5343,8.3869,0.5001 +Khronos,12x12,ldr-rgba-base.png,29.9101,1.7808,1.7265,0.6073 +Khronos,12x12,ldr-rgba-diffuse.png,29.2514,1.7036,1.6500,0.6355 +Khronos,12x12,ldr-rgba-specgloss.png,30.6953,2.3808,2.3234,0.4513 +Khronos,12x12,ldr-xy-normal1.png,33.9599,1.0621,0.9786,1.0715 +Khronos,12x12,ldr-xy-normal2.png,38.4364,1.5331,1.2797,3.2777 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse4.1_fast_results.csv new file mode 100644 index 0000000..68bac9e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse4.1_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,64.2943,0.0392,0.0168,62.2820 +Khronos,4x4,ldr-rgb-diffuse.png,52.5337,0.2225,0.1069,39.2490 +Khronos,4x4,ldr-rgb-emissive.png,58.5505,0.0415,0.0166,63.2321 +Khronos,4x4,ldr-rgb-metalrough.png,44.2748,0.0993,0.0656,15.9937 +Khronos,4x4,ldr-rgb-metalrough2.png,42.9160,0.5181,0.3951,10.6153 +Khronos,4x4,ldr-rgba-base.png,43.2384,0.1191,0.0820,12.7807 +Khronos,4x4,ldr-rgba-diffuse.png,43.8337,0.0973,0.0610,17.1942 +Khronos,4x4,ldr-rgba-specgloss.png,41.6516,0.1603,0.1211,8.6594 +Khronos,4x4,ldr-xy-normal1.png,44.9659,0.1677,0.1022,10.2561 +Khronos,4x4,ldr-xy-normal2.png,48.6954,0.3884,0.1668,25.1525 +Khronos,5x5,ldr-l-occlusion.png,54.3853,0.0371,0.0135,77.6149 +Khronos,5x5,ldr-rgb-diffuse.png,47.2206,0.2013,0.0830,50.5283 +Khronos,5x5,ldr-rgb-emissive.png,52.6484,0.0390,0.0135,77.6491 +Khronos,5x5,ldr-rgb-metalrough.png,39.8153,0.0882,0.0540,19.4256 +Khronos,5x5,ldr-rgb-metalrough2.png,37.8813,0.5504,0.4215,9.9511 +Khronos,5x5,ldr-rgba-base.png,38.8861,0.1026,0.0649,16.1620 +Khronos,5x5,ldr-rgba-diffuse.png,39.1290,0.1008,0.0639,16.4014 +Khronos,5x5,ldr-rgba-specgloss.png,38.3728,0.1237,0.0844,12.4299 +Khronos,5x5,ldr-xy-normal1.png,41.8816,0.1445,0.0779,13.4624 +Khronos,5x5,ldr-xy-normal2.png,46.1675,0.3515,0.1178,35.5962 +Khronos,6x6,ldr-l-occlusion.png,48.3856,0.0379,0.0140,74.9944 +Khronos,6x6,ldr-rgb-diffuse.png,43.2790,0.2186,0.1029,40.7697 +Khronos,6x6,ldr-rgb-emissive.png,49.1262,0.0385,0.0125,83.8986 +Khronos,6x6,ldr-rgb-metalrough.png,36.4558,0.1014,0.0668,15.6965 +Khronos,6x6,ldr-rgb-metalrough2.png,35.2940,0.5834,0.4565,9.1886 +Khronos,6x6,ldr-rgba-base.png,36.1465,0.1152,0.0772,13.5779 +Khronos,6x6,ldr-rgba-diffuse.png,36.1109,0.1197,0.0826,12.6970 +Khronos,6x6,ldr-rgba-specgloss.png,36.1063,0.1339,0.0933,11.2362 +Khronos,6x6,ldr-xy-normal1.png,39.6587,0.1445,0.0767,13.6627 +Khronos,6x6,ldr-xy-normal2.png,44.1122,0.3481,0.1156,36.2889 +Khronos,8x8,ldr-l-occlusion.png,43.9509,0.0418,0.0142,73.5952 +Khronos,8x8,ldr-rgb-diffuse.png,38.3579,0.2372,0.1197,35.0372 +Khronos,8x8,ldr-rgb-emissive.png,44.5417,0.0430,0.0129,81.1777 +Khronos,8x8,ldr-rgb-metalrough.png,32.3221,0.1281,0.0895,11.7144 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1735,0.5034,0.3749,11.1866 +Khronos,8x8,ldr-rgba-base.png,32.4344,0.1323,0.0903,11.6146 +Khronos,8x8,ldr-rgba-diffuse.png,32.1528,0.1507,0.1098,9.5515 +Khronos,8x8,ldr-rgba-specgloss.png,32.9651,0.1447,0.1005,10.4338 +Khronos,8x8,ldr-xy-normal1.png,36.5136,0.1456,0.0740,14.1749 +Khronos,8x8,ldr-xy-normal2.png,40.7081,0.3688,0.1321,31.7476 +Khronos,12x12,ldr-l-occlusion.png,40.5785,0.0476,0.0129,81.2347 +Khronos,12x12,ldr-rgb-diffuse.png,33.3691,0.2160,0.0902,46.5031 +Khronos,12x12,ldr-rgb-emissive.png,39.4740,0.0487,0.0121,86.6883 +Khronos,12x12,ldr-rgb-metalrough.png,28.6393,0.0947,0.0496,21.1462 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2526,0.2959,0.1609,26.0715 +Khronos,12x12,ldr-rgba-base.png,29.0353,0.1160,0.0677,15.4781 +Khronos,12x12,ldr-rgba-diffuse.png,28.6266,0.1243,0.0770,13.6103 +Khronos,12x12,ldr-rgba-specgloss.png,29.8100,0.1042,0.0538,19.4881 +Khronos,12x12,ldr-xy-normal1.png,32.7462,0.1271,0.0495,21.1966 +Khronos,12x12,ldr-xy-normal2.png,36.2212,0.3678,0.1212,34.5979 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse4.1_fastest_results.csv new file mode 100644 index 0000000..26479cb --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse4.1_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,64.1811,0.0378,0.0160,65.4578 +Khronos,4x4,ldr-rgb-diffuse.png,52.3048,0.2131,0.0979,42.8409 +Khronos,4x4,ldr-rgb-emissive.png,57.9745,0.0389,0.0142,74.0474 +Khronos,4x4,ldr-rgb-metalrough.png,43.8757,0.0801,0.0475,22.0716 +Khronos,4x4,ldr-rgb-metalrough2.png,42.6172,0.3775,0.2536,16.5383 +Khronos,4x4,ldr-rgba-base.png,42.7856,0.0907,0.0543,19.3115 +Khronos,4x4,ldr-rgba-diffuse.png,43.2186,0.0769,0.0412,25.4701 +Khronos,4x4,ldr-rgba-specgloss.png,41.2397,0.1153,0.0768,13.6517 +Khronos,4x4,ldr-xy-normal1.png,44.7981,0.1283,0.0635,16.5200 +Khronos,4x4,ldr-xy-normal2.png,48.3359,0.3538,0.1312,31.9666 +Khronos,5x5,ldr-l-occlusion.png,53.9892,0.0361,0.0137,76.3324 +Khronos,5x5,ldr-rgb-diffuse.png,47.0472,0.1940,0.0763,54.9582 +Khronos,5x5,ldr-rgb-emissive.png,52.3396,0.0380,0.0134,77.9616 +Khronos,5x5,ldr-rgb-metalrough.png,39.2554,0.0733,0.0398,26.3375 +Khronos,5x5,ldr-rgb-metalrough2.png,37.2923,0.4009,0.2738,15.3192 +Khronos,5x5,ldr-rgba-base.png,38.2416,0.0829,0.0455,23.0487 +Khronos,5x5,ldr-rgba-diffuse.png,38.4404,0.0787,0.0424,24.7528 +Khronos,5x5,ldr-rgba-specgloss.png,37.9182,0.0970,0.0577,18.1685 +Khronos,5x5,ldr-xy-normal1.png,41.3098,0.1216,0.0555,18.8790 +Khronos,5x5,ldr-xy-normal2.png,45.6455,0.3339,0.1018,41.1937 +Khronos,6x6,ldr-l-occlusion.png,48.3043,0.0361,0.0132,79.4316 +Khronos,6x6,ldr-rgb-diffuse.png,43.2173,0.2032,0.0888,47.2396 +Khronos,6x6,ldr-rgb-emissive.png,48.9702,0.0367,0.0114,92.2312 +Khronos,6x6,ldr-rgb-metalrough.png,36.2530,0.0792,0.0458,22.9057 +Khronos,6x6,ldr-rgb-metalrough2.png,35.0960,0.4001,0.2744,15.2838 +Khronos,6x6,ldr-rgba-base.png,35.9930,0.0868,0.0504,20.8084 +Khronos,6x6,ldr-rgba-diffuse.png,35.9379,0.0877,0.0511,20.5265 +Khronos,6x6,ldr-rgba-specgloss.png,35.8780,0.0993,0.0597,17.5579 +Khronos,6x6,ldr-xy-normal1.png,38.8417,0.1232,0.0564,18.5888 +Khronos,6x6,ldr-xy-normal2.png,43.4552,0.3270,0.0945,44.3837 +Khronos,8x8,ldr-l-occlusion.png,43.4865,0.0381,0.0125,84.1619 +Khronos,8x8,ldr-rgb-diffuse.png,38.2787,0.2147,0.0981,42.7532 +Khronos,8x8,ldr-rgb-emissive.png,44.2565,0.0390,0.0106,98.5490 +Khronos,8x8,ldr-rgb-metalrough.png,32.2230,0.0990,0.0617,16.9821 +Khronos,8x8,ldr-rgb-metalrough2.png,32.0902,0.3920,0.2650,15.8268 +Khronos,8x8,ldr-rgba-base.png,32.3141,0.1010,0.0612,17.1428 +Khronos,8x8,ldr-rgba-diffuse.png,32.0388,0.1121,0.0729,14.3792 +Khronos,8x8,ldr-rgba-specgloss.png,32.8378,0.1109,0.0683,15.3428 +Khronos,8x8,ldr-xy-normal1.png,36.2257,0.1209,0.0520,20.1669 +Khronos,8x8,ldr-xy-normal2.png,40.2806,0.3387,0.1042,40.2691 +Khronos,12x12,ldr-l-occlusion.png,40.2271,0.0420,0.0117,89.5532 +Khronos,12x12,ldr-rgb-diffuse.png,33.3234,0.1996,0.0785,53.4632 +Khronos,12x12,ldr-rgb-emissive.png,39.2738,0.0428,0.0101,103.4202 +Khronos,12x12,ldr-rgb-metalrough.png,28.5951,0.0788,0.0375,27.9859 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1680,0.2612,0.1285,32.6398 +Khronos,12x12,ldr-rgba-base.png,28.9761,0.0932,0.0484,21.6648 +Khronos,12x12,ldr-rgba-diffuse.png,28.5781,0.1002,0.0559,18.7661 +Khronos,12x12,ldr-rgba-specgloss.png,29.7683,0.0867,0.0396,26.5074 +Khronos,12x12,ldr-xy-normal1.png,32.6311,0.1103,0.0365,28.7202 +Khronos,12x12,ldr-xy-normal2.png,36.0090,0.3378,0.0950,44.1431 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse4.1_medium_results.csv new file mode 100644 index 0000000..d76e38e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse4.1_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.9241,0.0506,0.0275,38.1411 +Khronos,4x4,ldr-rgb-diffuse.png,54.0220,0.4241,0.3077,13.6328 +Khronos,4x4,ldr-rgb-emissive.png,59.8355,0.0528,0.0275,38.0968 +Khronos,4x4,ldr-rgb-metalrough.png,44.8439,0.2586,0.2247,4.6673 +Khronos,4x4,ldr-rgb-metalrough2.png,43.7387,1.6127,1.4880,2.8188 +Khronos,4x4,ldr-rgba-base.png,43.8182,0.3260,0.2892,3.6252 +Khronos,4x4,ldr-rgba-diffuse.png,44.2282,0.2358,0.1993,5.2616 +Khronos,4x4,ldr-rgba-specgloss.png,42.2924,0.4414,0.4021,2.6079 +Khronos,4x4,ldr-xy-normal1.png,46.4813,0.3814,0.3171,3.3070 +Khronos,4x4,ldr-xy-normal2.png,50.2697,0.8577,0.6507,6.4461 +Khronos,5x5,ldr-l-occlusion.png,57.1582,0.0527,0.0279,37.5186 +Khronos,5x5,ldr-rgb-diffuse.png,48.9898,0.4323,0.3148,13.3237 +Khronos,5x5,ldr-rgb-emissive.png,55.3721,0.0551,0.0281,37.3437 +Khronos,5x5,ldr-rgb-metalrough.png,40.2389,0.2905,0.2548,4.1159 +Khronos,5x5,ldr-rgb-metalrough2.png,39.0265,1.9955,1.8686,2.2446 +Khronos,5x5,ldr-rgba-base.png,39.4069,0.3799,0.3411,3.0743 +Khronos,5x5,ldr-rgba-diffuse.png,39.5655,0.3041,0.2661,3.9402 +Khronos,5x5,ldr-rgba-specgloss.png,38.7778,0.4913,0.4503,2.3289 +Khronos,5x5,ldr-xy-normal1.png,43.0478,0.3723,0.3049,3.4388 +Khronos,5x5,ldr-xy-normal2.png,47.2289,0.7439,0.5156,8.1346 +Khronos,6x6,ldr-l-occlusion.png,50.8664,0.0638,0.0381,27.5550 +Khronos,6x6,ldr-rgb-diffuse.png,44.9305,0.4423,0.3242,12.9392 +Khronos,6x6,ldr-rgb-emissive.png,51.5230,0.0558,0.0284,36.9397 +Khronos,6x6,ldr-rgb-metalrough.png,36.8297,0.3106,0.2739,3.8282 +Khronos,6x6,ldr-rgb-metalrough2.png,36.4385,2.0093,1.8823,2.2283 +Khronos,6x6,ldr-rgba-base.png,36.6600,0.3565,0.3160,3.3182 +Khronos,6x6,ldr-rgba-diffuse.png,36.4968,0.3332,0.2939,3.5674 +Khronos,6x6,ldr-rgba-specgloss.png,36.4898,0.5117,0.4692,2.2347 +Khronos,6x6,ldr-xy-normal1.png,40.6313,0.3194,0.2507,4.1830 +Khronos,6x6,ldr-xy-normal2.png,45.1539,0.5171,0.2817,14.8889 +Khronos,8x8,ldr-l-occlusion.png,45.4494,0.0748,0.0464,22.6083 +Khronos,8x8,ldr-rgb-diffuse.png,40.2400,0.6047,0.4865,8.6219 +Khronos,8x8,ldr-rgb-emissive.png,46.7056,0.0643,0.0333,31.5132 +Khronos,8x8,ldr-rgb-metalrough.png,32.6672,0.4234,0.3845,2.7271 +Khronos,8x8,ldr-rgb-metalrough2.png,33.1993,2.3103,2.1793,1.9246 +Khronos,8x8,ldr-rgba-base.png,33.0666,0.3996,0.3572,2.9354 +Khronos,8x8,ldr-rgba-diffuse.png,32.5794,0.4606,0.4190,2.5027 +Khronos,8x8,ldr-rgba-specgloss.png,33.4730,0.5620,0.5170,2.0282 +Khronos,8x8,ldr-xy-normal1.png,37.4170,0.3671,0.2938,3.5688 +Khronos,8x8,ldr-xy-normal2.png,42.0752,0.5621,0.3224,13.0110 +Khronos,12x12,ldr-l-occlusion.png,41.6742,0.0658,0.0292,35.9485 +Khronos,12x12,ldr-rgb-diffuse.png,35.7657,0.5503,0.4213,9.9563 +Khronos,12x12,ldr-rgb-emissive.png,41.3741,0.0757,0.0366,28.6339 +Khronos,12x12,ldr-rgb-metalrough.png,29.0921,0.3761,0.3280,3.1970 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1608,1.4720,1.3324,3.1479 +Khronos,12x12,ldr-rgba-base.png,29.6309,0.3808,0.3299,3.1783 +Khronos,12x12,ldr-rgba-diffuse.png,29.0674,0.5178,0.4680,2.2405 +Khronos,12x12,ldr-rgba-specgloss.png,30.4747,0.4014,0.3483,3.0105 +Khronos,12x12,ldr-xy-normal1.png,33.5015,0.3274,0.2463,4.2576 +Khronos,12x12,ldr-xy-normal2.png,37.8164,0.5994,0.3502,11.9779 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse4.1_thorough_results.csv new file mode 100644 index 0000000..0b384f4 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-3.7-sse4.1_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,70.5315,0.0990,0.0757,13.8521 +Khronos,4x4,ldr-rgb-diffuse.png,54.7186,2.0951,1.9740,2.1248 +Khronos,4x4,ldr-rgb-emissive.png,60.8411,0.0832,0.0579,18.1176 +Khronos,4x4,ldr-rgb-metalrough.png,44.9834,0.5881,0.5532,1.8956 +Khronos,4x4,ldr-rgb-metalrough2.png,44.0109,3.4178,3.2934,1.2736 +Khronos,4x4,ldr-rgba-base.png,44.0074,0.7744,0.7351,1.4265 +Khronos,4x4,ldr-rgba-diffuse.png,44.4143,0.5533,0.5168,2.0289 +Khronos,4x4,ldr-rgba-specgloss.png,42.4617,0.9908,0.9511,1.1025 +Khronos,4x4,ldr-xy-normal1.png,46.6817,1.1558,1.0922,0.9601 +Khronos,4x4,ldr-xy-normal2.png,50.5734,3.0515,2.8477,1.4729 +Khronos,5x5,ldr-l-occlusion.png,58.7331,0.1824,0.1574,6.6608 +Khronos,5x5,ldr-rgb-diffuse.png,49.7917,1.9059,1.7882,2.3455 +Khronos,5x5,ldr-rgb-emissive.png,56.1399,0.0992,0.0722,14.5299 +Khronos,5x5,ldr-rgb-metalrough.png,40.4567,0.7408,0.7046,1.4881 +Khronos,5x5,ldr-rgb-metalrough2.png,39.4939,4.2926,4.1649,1.0071 +Khronos,5x5,ldr-rgba-base.png,39.7586,0.9547,0.9136,1.1477 +Khronos,5x5,ldr-rgba-diffuse.png,39.8981,0.7029,0.6638,1.5797 +Khronos,5x5,ldr-rgba-specgloss.png,39.0247,1.1930,1.1518,0.9104 +Khronos,5x5,ldr-xy-normal1.png,43.4086,1.4487,1.3822,0.7586 +Khronos,5x5,ldr-xy-normal2.png,47.7884,4.2000,3.9779,1.0544 +Khronos,6x6,ldr-l-occlusion.png,52.2700,0.2539,0.2286,4.5878 +Khronos,6x6,ldr-rgb-diffuse.png,45.7745,1.8366,1.7197,2.4390 +Khronos,6x6,ldr-rgb-emissive.png,52.6625,0.1098,0.0823,12.7426 +Khronos,6x6,ldr-rgb-metalrough.png,37.0152,0.9500,0.9130,1.1485 +Khronos,6x6,ldr-rgb-metalrough2.png,36.7447,5.3084,5.1823,0.8094 +Khronos,6x6,ldr-rgba-base.png,36.8638,1.1751,1.1342,0.9245 +Khronos,6x6,ldr-rgba-diffuse.png,36.6647,0.8827,0.8442,1.2421 +Khronos,6x6,ldr-rgba-specgloss.png,36.6746,1.4247,1.3831,0.7582 +Khronos,6x6,ldr-xy-normal1.png,41.1135,1.3496,1.2808,0.8187 +Khronos,6x6,ldr-xy-normal2.png,45.8126,3.5520,3.3258,1.2611 +Khronos,8x8,ldr-l-occlusion.png,46.0393,0.3218,0.2918,3.5929 +Khronos,8x8,ldr-rgb-diffuse.png,40.8642,2.0600,1.9380,2.1642 +Khronos,8x8,ldr-rgb-emissive.png,47.6060,0.1208,0.0882,11.8836 +Khronos,8x8,ldr-rgb-metalrough.png,32.8288,1.2322,1.1901,0.8811 +Khronos,8x8,ldr-rgb-metalrough2.png,33.5847,6.8728,6.7416,0.6222 +Khronos,8x8,ldr-rgba-base.png,33.2578,1.5298,1.4850,0.7061 +Khronos,8x8,ldr-rgba-diffuse.png,32.7252,1.2025,1.1587,0.9049 +Khronos,8x8,ldr-rgba-specgloss.png,33.6269,1.8543,1.8077,0.5801 +Khronos,8x8,ldr-xy-normal1.png,37.7223,0.9278,0.8536,1.2284 +Khronos,8x8,ldr-xy-normal2.png,42.5153,1.7518,1.5155,2.7675 +Khronos,12x12,ldr-l-occlusion.png,42.4633,0.2617,0.2227,4.7077 +Khronos,12x12,ldr-rgb-diffuse.png,36.6027,2.3304,2.1986,1.9077 +Khronos,12x12,ldr-rgb-emissive.png,42.3480,0.1662,0.1245,8.4194 +Khronos,12x12,ldr-rgb-metalrough.png,29.2660,1.4731,1.4219,0.7375 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7449,7.5747,7.4310,0.5644 +Khronos,12x12,ldr-rgba-base.png,29.9101,1.5810,1.5276,0.6864 +Khronos,12x12,ldr-rgba-diffuse.png,29.2514,1.5116,1.4581,0.7191 +Khronos,12x12,ldr-rgba-specgloss.png,30.6953,2.1197,2.0644,0.5079 +Khronos,12x12,ldr-xy-normal1.png,33.9599,0.9485,0.8672,1.2091 +Khronos,12x12,ldr-xy-normal2.png,38.4364,1.3771,1.1310,3.7086 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-avx2_fast_results.csv new file mode 100644 index 0000000..a3228ef --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-avx2_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.4655,0.0382,0.0067,156.6646 +Khronos,4x4,ldr-rgb-diffuse.png,52.6045,0.1751,0.0538,77.9844 +Khronos,4x4,ldr-rgb-emissive.png,58.5113,0.0361,0.0047,220.9407 +Khronos,4x4,ldr-rgb-metalrough.png,44.4073,0.0910,0.0453,23.1341 +Khronos,4x4,ldr-rgb-metalrough2.png,43.0365,0.4246,0.2926,14.3356 +Khronos,4x4,ldr-rgba-base.png,43.3923,0.1064,0.0578,18.1496 +Khronos,4x4,ldr-rgba-diffuse.png,43.9493,0.0870,0.0409,25.6383 +Khronos,4x4,ldr-rgba-specgloss.png,41.7912,0.1477,0.0960,10.9190 +Khronos,4x4,ldr-xy-normal1.png,45.0926,0.1473,0.0676,15.5128 +Khronos,4x4,ldr-xy-normal2.png,48.8199,0.3231,0.0986,42.5321 +Khronos,5x5,ldr-l-occlusion.png,53.1348,0.0370,0.0054,195.9303 +Khronos,5x5,ldr-rgb-diffuse.png,47.1728,0.1569,0.0406,103.3691 +Khronos,5x5,ldr-rgb-emissive.png,52.6847,0.0358,0.0039,271.5849 +Khronos,5x5,ldr-rgb-metalrough.png,39.9533,0.0789,0.0336,31.1982 +Khronos,5x5,ldr-rgb-metalrough2.png,38.0161,0.4014,0.2707,15.4934 +Khronos,5x5,ldr-rgba-base.png,38.9983,0.0901,0.0401,26.1367 +Khronos,5x5,ldr-rgba-diffuse.png,39.2058,0.0846,0.0387,27.1258 +Khronos,5x5,ldr-rgba-specgloss.png,38.4784,0.1064,0.0557,18.8251 +Khronos,5x5,ldr-xy-normal1.png,42.0012,0.1293,0.0514,20.3991 +Khronos,5x5,ldr-xy-normal2.png,46.4491,0.2971,0.0676,62.0293 +Khronos,6x6,ldr-l-occlusion.png,48.1652,0.0389,0.0064,162.7520 +Khronos,6x6,ldr-rgb-diffuse.png,43.2161,0.1721,0.0554,75.6972 +Khronos,6x6,ldr-rgb-emissive.png,49.0922,0.0348,0.0041,254.7525 +Khronos,6x6,ldr-rgb-metalrough.png,36.5665,0.0817,0.0382,27.4167 +Khronos,6x6,ldr-rgb-metalrough2.png,35.3752,0.3895,0.2598,16.1457 +Khronos,6x6,ldr-rgba-base.png,36.2171,0.0931,0.0439,23.9046 +Khronos,6x6,ldr-rgba-diffuse.png,36.1683,0.0926,0.0462,22.6880 +Khronos,6x6,ldr-rgba-specgloss.png,36.1729,0.1086,0.0573,18.2994 +Khronos,6x6,ldr-xy-normal1.png,39.7098,0.1235,0.0466,22.5162 +Khronos,6x6,ldr-xy-normal2.png,44.2686,0.2905,0.0638,65.7342 +Khronos,8x8,ldr-l-occlusion.png,43.9539,0.0398,0.0075,140.7105 +Khronos,8x8,ldr-rgb-diffuse.png,38.4343,0.1884,0.0708,59.2609 +Khronos,8x8,ldr-rgb-emissive.png,44.6628,0.0362,0.0057,182.5825 +Khronos,8x8,ldr-rgb-metalrough.png,32.3691,0.0964,0.0494,21.2323 +Khronos,8x8,ldr-rgb-metalrough2.png,32.2370,0.3543,0.2246,18.6781 +Khronos,8x8,ldr-rgba-base.png,32.4906,0.0974,0.0481,21.8099 +Khronos,8x8,ldr-rgba-diffuse.png,32.1814,0.1067,0.0607,17.2790 +Khronos,8x8,ldr-rgba-specgloss.png,32.9771,0.1084,0.0571,18.3754 +Khronos,8x8,ldr-xy-normal1.png,36.6064,0.1166,0.0400,26.2255 +Khronos,8x8,ldr-xy-normal2.png,40.8606,0.3031,0.0711,58.9792 +Khronos,12x12,ldr-l-occlusion.png,40.5661,0.0405,0.0068,154.0849 +Khronos,12x12,ldr-rgb-diffuse.png,33.3873,0.1683,0.0524,80.1112 +Khronos,12x12,ldr-rgb-emissive.png,39.4684,0.0372,0.0056,186.5793 +Khronos,12x12,ldr-rgb-metalrough.png,28.6613,0.0768,0.0296,35.4381 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2734,0.2357,0.1046,40.0928 +Khronos,12x12,ldr-rgba-base.png,29.0545,0.0887,0.0387,27.0886 +Khronos,12x12,ldr-rgba-diffuse.png,28.6353,0.0923,0.0452,23.1746 +Khronos,12x12,ldr-rgba-specgloss.png,29.8286,0.0836,0.0329,31.9076 +Khronos,12x12,ldr-xy-normal1.png,32.7785,0.1067,0.0275,38.1941 +Khronos,12x12,ldr-xy-normal2.png,36.2721,0.2947,0.0637,65.8923 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-avx2_fastest_results.csv new file mode 100644 index 0000000..62c271b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-avx2_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.3133,0.0378,0.0062,168.0440 +Khronos,4x4,ldr-rgb-diffuse.png,52.3938,0.1692,0.0479,87.4907 +Khronos,4x4,ldr-rgb-emissive.png,57.9377,0.0345,0.0040,262.6170 +Khronos,4x4,ldr-rgb-metalrough.png,43.9316,0.0764,0.0297,35.2676 +Khronos,4x4,ldr-rgb-metalrough2.png,42.7512,0.3135,0.1815,23.1112 +Khronos,4x4,ldr-rgba-base.png,42.9570,0.0861,0.0367,28.6035 +Khronos,4x4,ldr-rgba-diffuse.png,43.3447,0.0726,0.0259,40.4652 +Khronos,4x4,ldr-rgba-specgloss.png,41.4899,0.1107,0.0593,17.6822 +Khronos,4x4,ldr-xy-normal1.png,44.9546,0.1212,0.0448,23.4145 +Khronos,4x4,ldr-xy-normal2.png,48.6052,0.3045,0.0771,54.3741 +Khronos,5x5,ldr-l-occlusion.png,53.0293,0.0372,0.0053,199.1959 +Khronos,5x5,ldr-rgb-diffuse.png,47.0203,0.1549,0.0383,109.4920 +Khronos,5x5,ldr-rgb-emissive.png,52.3745,0.0352,0.0035,298.9022 +Khronos,5x5,ldr-rgb-metalrough.png,39.4731,0.0692,0.0239,43.9247 +Khronos,5x5,ldr-rgb-metalrough2.png,37.5082,0.3022,0.1737,24.1443 +Khronos,5x5,ldr-rgba-base.png,38.3730,0.0758,0.0278,37.7677 +Khronos,5x5,ldr-rgba-diffuse.png,38.5202,0.0706,0.0253,41.4410 +Khronos,5x5,ldr-rgba-specgloss.png,38.0061,0.0876,0.0370,28.3697 +Khronos,5x5,ldr-xy-normal1.png,41.5496,0.1104,0.0356,29.4213 +Khronos,5x5,ldr-xy-normal2.png,46.0706,0.2830,0.0564,74.3919 +Khronos,6x6,ldr-l-occlusion.png,48.0811,0.0383,0.0061,172.2630 +Khronos,6x6,ldr-rgb-diffuse.png,43.1620,0.1629,0.0471,89.0320 +Khronos,6x6,ldr-rgb-emissive.png,48.9865,0.0349,0.0037,280.5950 +Khronos,6x6,ldr-rgb-metalrough.png,36.3834,0.0727,0.0270,38.8276 +Khronos,6x6,ldr-rgb-metalrough2.png,35.1859,0.2896,0.1609,26.0639 +Khronos,6x6,ldr-rgba-base.png,36.0451,0.0773,0.0294,35.6160 +Khronos,6x6,ldr-rgba-diffuse.png,35.9737,0.0743,0.0292,35.9497 +Khronos,6x6,ldr-rgba-specgloss.png,35.9510,0.0870,0.0369,28.3820 +Khronos,6x6,ldr-xy-normal1.png,39.2832,0.1090,0.0333,31.5256 +Khronos,6x6,ldr-xy-normal2.png,43.8887,0.2810,0.0524,79.9983 +Khronos,8x8,ldr-l-occlusion.png,43.4580,0.0387,0.0066,158.0383 +Khronos,8x8,ldr-rgb-diffuse.png,38.3059,0.1746,0.0586,71.5604 +Khronos,8x8,ldr-rgb-emissive.png,44.2656,0.0362,0.0045,230.7596 +Khronos,8x8,ldr-rgb-metalrough.png,32.2866,0.0833,0.0364,28.8253 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1313,0.2900,0.1613,25.9983 +Khronos,8x8,ldr-rgba-base.png,32.3652,0.0824,0.0352,29.7630 +Khronos,8x8,ldr-rgba-diffuse.png,32.0718,0.0885,0.0431,24.3260 +Khronos,8x8,ldr-rgba-specgloss.png,32.8799,0.0931,0.0427,24.5424 +Khronos,8x8,ldr-xy-normal1.png,36.3825,0.1059,0.0307,34.1500 +Khronos,8x8,ldr-xy-normal2.png,40.4241,0.2876,0.0597,70.2387 +Khronos,12x12,ldr-l-occlusion.png,40.2057,0.0384,0.0060,174.7962 +Khronos,12x12,ldr-rgb-diffuse.png,33.3359,0.1591,0.0439,95.5967 +Khronos,12x12,ldr-rgb-emissive.png,39.2731,0.0372,0.0044,237.6552 +Khronos,12x12,ldr-rgb-metalrough.png,28.6142,0.0678,0.0224,46.7385 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1800,0.2027,0.0801,52.3947 +Khronos,12x12,ldr-rgba-base.png,28.9932,0.0771,0.0284,36.9190 +Khronos,12x12,ldr-rgba-diffuse.png,28.5821,0.0798,0.0326,32.2043 +Khronos,12x12,ldr-rgba-specgloss.png,29.7831,0.0768,0.0249,42.1911 +Khronos,12x12,ldr-xy-normal1.png,32.6438,0.1002,0.0213,49.2128 +Khronos,12x12,ldr-xy-normal2.png,36.0512,0.2837,0.0511,82.0367 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-avx2_medium_results.csv new file mode 100644 index 0000000..00d0e8c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-avx2_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,62.6540,0.0503,0.0183,57.4525 +Khronos,4x4,ldr-rgb-diffuse.png,54.0236,0.2931,0.1729,24.2561 +Khronos,4x4,ldr-rgb-emissive.png,59.8931,0.0439,0.0112,93.7390 +Khronos,4x4,ldr-rgb-metalrough.png,44.9620,0.1895,0.1409,7.4427 +Khronos,4x4,ldr-rgb-metalrough2.png,43.8694,1.1121,0.9748,4.3028 +Khronos,4x4,ldr-rgba-base.png,43.9051,0.2299,0.1807,5.8022 +Khronos,4x4,ldr-rgba-diffuse.png,44.2751,0.1687,0.1218,8.6091 +Khronos,4x4,ldr-rgba-specgloss.png,42.4087,0.3079,0.2557,4.1000 +Khronos,4x4,ldr-xy-normal1.png,46.6523,0.2974,0.2229,4.7046 +Khronos,4x4,ldr-xy-normal2.png,50.4038,0.5950,0.3843,10.9153 +Khronos,5x5,ldr-l-occlusion.png,56.2813,0.0488,0.0167,62.7960 +Khronos,5x5,ldr-rgb-diffuse.png,49.0503,0.2695,0.1545,27.1501 +Khronos,5x5,ldr-rgb-emissive.png,55.4946,0.0423,0.0111,94.0678 +Khronos,5x5,ldr-rgb-metalrough.png,40.3604,0.1704,0.1236,8.4863 +Khronos,5x5,ldr-rgb-metalrough2.png,39.1705,1.0894,0.9609,4.3650 +Khronos,5x5,ldr-rgba-base.png,39.5053,0.2146,0.1648,6.3642 +Khronos,5x5,ldr-rgba-diffuse.png,39.6251,0.1749,0.1261,8.3129 +Khronos,5x5,ldr-rgba-specgloss.png,38.8345,0.2767,0.2232,4.6969 +Khronos,5x5,ldr-xy-normal1.png,43.1993,0.2520,0.1751,5.9870 +Khronos,5x5,ldr-xy-normal2.png,47.4061,0.5142,0.2896,14.4841 +Khronos,6x6,ldr-l-occlusion.png,50.5914,0.0506,0.0191,54.8645 +Khronos,6x6,ldr-rgb-diffuse.png,44.8576,0.2764,0.1556,26.9619 +Khronos,6x6,ldr-rgb-emissive.png,51.5504,0.0437,0.0122,85.7302 +Khronos,6x6,ldr-rgb-metalrough.png,36.8965,0.1696,0.1233,8.5029 +Khronos,6x6,ldr-rgb-metalrough2.png,36.5268,1.0263,0.8940,4.6916 +Khronos,6x6,ldr-rgba-base.png,36.7233,0.1970,0.1454,7.2092 +Khronos,6x6,ldr-rgba-diffuse.png,36.5399,0.1820,0.1363,7.6949 +Khronos,6x6,ldr-rgba-specgloss.png,36.5328,0.2615,0.2098,4.9979 +Khronos,6x6,ldr-xy-normal1.png,40.7199,0.2167,0.1386,7.5669 +Khronos,6x6,ldr-xy-normal2.png,45.3200,0.3870,0.1568,26.7482 +Khronos,8x8,ldr-l-occlusion.png,45.3887,0.0593,0.0270,38.8764 +Khronos,8x8,ldr-rgb-diffuse.png,40.2569,0.3605,0.2431,17.2514 +Khronos,8x8,ldr-rgb-emissive.png,46.6857,0.0489,0.0167,62.8795 +Khronos,8x8,ldr-rgb-metalrough.png,32.7170,0.2174,0.1695,6.1873 +Khronos,8x8,ldr-rgb-metalrough2.png,33.2520,1.1591,1.0282,4.0792 +Khronos,8x8,ldr-rgba-base.png,33.1110,0.2233,0.1731,6.0593 +Khronos,8x8,ldr-rgba-diffuse.png,32.5991,0.2305,0.1824,5.7476 +Khronos,8x8,ldr-rgba-specgloss.png,33.5088,0.2924,0.2405,4.3609 +Khronos,8x8,ldr-xy-normal1.png,37.4760,0.2272,0.1482,7.0740 +Khronos,8x8,ldr-xy-normal2.png,42.1661,0.4078,0.1730,24.2464 +Khronos,12x12,ldr-l-occlusion.png,41.6088,0.0518,0.0155,67.4889 +Khronos,12x12,ldr-rgb-diffuse.png,35.7801,0.3585,0.2428,17.2738 +Khronos,12x12,ldr-rgb-emissive.png,41.4140,0.0539,0.0197,53.2703 +Khronos,12x12,ldr-rgb-metalrough.png,29.1287,0.2054,0.1541,6.8048 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1830,0.8308,0.6962,6.0244 +Khronos,12x12,ldr-rgba-base.png,29.6585,0.2098,0.1575,6.6563 +Khronos,12x12,ldr-rgba-diffuse.png,29.0859,0.2576,0.2084,5.0316 +Khronos,12x12,ldr-rgba-specgloss.png,30.4963,0.2385,0.1835,5.7147 +Khronos,12x12,ldr-xy-normal1.png,33.5470,0.1986,0.1160,9.0413 +Khronos,12x12,ldr-xy-normal2.png,37.8631,0.4126,0.1765,23.7693 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-avx2_thorough_results.csv new file mode 100644 index 0000000..e3468f9 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-avx2_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.9044,0.1302,0.0985,10.6507 +Khronos,4x4,ldr-rgb-diffuse.png,54.9599,1.1894,1.0721,3.9123 +Khronos,4x4,ldr-rgb-emissive.png,60.9188,0.0593,0.0287,36.4735 +Khronos,4x4,ldr-rgb-metalrough.png,45.0994,0.3756,0.3284,3.1932 +Khronos,4x4,ldr-rgb-metalrough2.png,44.1518,2.2504,2.1214,1.9772 +Khronos,4x4,ldr-rgba-base.png,44.1046,0.4713,0.4215,2.4880 +Khronos,4x4,ldr-rgba-diffuse.png,44.4758,0.3330,0.2866,3.6590 +Khronos,4x4,ldr-rgba-specgloss.png,42.5749,0.5796,0.5281,1.9854 +Khronos,4x4,ldr-xy-normal1.png,46.8196,0.6755,0.6004,1.7465 +Khronos,4x4,ldr-xy-normal2.png,50.7622,1.2937,1.0823,3.8755 +Khronos,5x5,ldr-l-occlusion.png,58.0357,0.1583,0.1267,8.2789 +Khronos,5x5,ldr-rgb-diffuse.png,49.9121,0.9892,0.8657,4.8451 +Khronos,5x5,ldr-rgb-emissive.png,56.2144,0.0625,0.0315,33.3009 +Khronos,5x5,ldr-rgb-metalrough.png,40.5654,0.3701,0.3226,3.2499 +Khronos,5x5,ldr-rgb-metalrough2.png,39.6374,2.3189,2.1886,1.9164 +Khronos,5x5,ldr-rgba-base.png,39.8428,0.4838,0.4345,2.4131 +Khronos,5x5,ldr-rgba-diffuse.png,39.9543,0.3576,0.3100,3.3829 +Khronos,5x5,ldr-rgba-specgloss.png,39.0954,0.5737,0.5229,2.0055 +Khronos,5x5,ldr-xy-normal1.png,43.5257,0.8116,0.7341,1.4283 +Khronos,5x5,ldr-xy-normal2.png,48.0598,1.8577,1.6414,2.5553 +Khronos,6x6,ldr-l-occlusion.png,52.1122,0.1504,0.1183,8.8636 +Khronos,6x6,ldr-rgb-diffuse.png,45.8096,0.8727,0.7554,5.5527 +Khronos,6x6,ldr-rgb-emissive.png,52.7006,0.0688,0.0370,28.3652 +Khronos,6x6,ldr-rgb-metalrough.png,37.0909,0.4076,0.3610,2.9045 +Khronos,6x6,ldr-rgb-metalrough2.png,36.8453,2.5260,2.3930,1.7527 +Khronos,6x6,ldr-rgba-base.png,36.9420,0.5149,0.4658,2.2509 +Khronos,6x6,ldr-rgba-diffuse.png,36.7150,0.3871,0.3395,3.0882 +Khronos,6x6,ldr-rgba-specgloss.png,36.7245,0.6153,0.5634,1.8610 +Khronos,6x6,ldr-xy-normal1.png,41.1534,0.7547,0.6788,1.5448 +Khronos,6x6,ldr-xy-normal2.png,45.9258,1.8204,1.5924,2.6340 +Khronos,8x8,ldr-l-occlusion.png,46.0084,0.1785,0.1483,7.0716 +Khronos,8x8,ldr-rgb-diffuse.png,40.9086,1.0376,0.9199,4.5596 +Khronos,8x8,ldr-rgb-emissive.png,47.5382,0.0739,0.0422,24.8330 +Khronos,8x8,ldr-rgb-metalrough.png,32.8764,0.5261,0.4796,2.1863 +Khronos,8x8,ldr-rgb-metalrough2.png,33.6471,3.1370,3.0020,1.3972 +Khronos,8x8,ldr-rgba-base.png,33.3130,0.6586,0.6082,1.7240 +Khronos,8x8,ldr-rgba-diffuse.png,32.7517,0.5191,0.4708,2.2273 +Khronos,8x8,ldr-rgba-specgloss.png,33.6674,0.7750,0.7206,1.4551 +Khronos,8x8,ldr-xy-normal1.png,37.7688,0.5243,0.4469,2.3463 +Khronos,8x8,ldr-xy-normal2.png,42.5753,1.0899,0.8533,4.9156 +Khronos,12x12,ldr-l-occlusion.png,42.4252,0.1746,0.1358,7.7212 +Khronos,12x12,ldr-rgb-diffuse.png,36.6233,1.2161,1.0958,3.8277 +Khronos,12x12,ldr-rgb-emissive.png,42.3669,0.1054,0.0684,15.3218 +Khronos,12x12,ldr-rgb-metalrough.png,29.3131,0.7054,0.6543,1.6025 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7812,3.6695,3.5334,1.1870 +Khronos,12x12,ldr-rgba-base.png,29.9371,0.7537,0.6987,1.5007 +Khronos,12x12,ldr-rgba-diffuse.png,29.2718,0.7013,0.6486,1.6167 +Khronos,12x12,ldr-rgba-specgloss.png,30.7200,0.9701,0.9138,1.1475 +Khronos,12x12,ldr-xy-normal1.png,33.9704,0.5307,0.4460,2.3509 +Khronos,12x12,ldr-xy-normal2.png,38.4786,0.8802,0.6494,6.4588 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-neon_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-neon_fast_results.csv new file mode 100644 index 0000000..174ddfa --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-neon_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.4655,0.0375,0.0097,107.9461 +Khronos,4x4,ldr-rgb-diffuse.png,52.6045,0.2365,0.0891,47.0741 +Khronos,4x4,ldr-rgb-emissive.png,58.5113,0.0324,0.0057,183.2214 +Khronos,4x4,ldr-rgb-metalrough.png,44.4073,0.1155,0.0770,13.6223 +Khronos,4x4,ldr-rgb-metalrough2.png,43.0365,0.6645,0.5031,8.3367 +Khronos,4x4,ldr-rgba-base.png,43.3923,0.1444,0.1014,10.3448 +Khronos,4x4,ldr-rgba-diffuse.png,43.9493,0.1116,0.0703,14.9192 +Khronos,4x4,ldr-rgba-specgloss.png,41.7912,0.2111,0.1658,6.3227 +Khronos,4x4,ldr-xy-normal1.png,45.0926,0.1709,0.1186,8.8415 +Khronos,4x4,ldr-xy-normal2.png,48.8199,0.3735,0.1715,24.4566 +Khronos,5x5,ldr-l-occlusion.png,53.1348,0.0360,0.0082,127.8130 +Khronos,5x5,ldr-rgb-diffuse.png,47.1728,0.2183,0.0729,57.5491 +Khronos,5x5,ldr-rgb-emissive.png,52.6847,0.0315,0.0046,226.8203 +Khronos,5x5,ldr-rgb-metalrough.png,39.9533,0.0962,0.0582,18.0085 +Khronos,5x5,ldr-rgb-metalrough2.png,38.0161,0.6443,0.4854,8.6409 +Khronos,5x5,ldr-rgba-base.png,38.9983,0.1138,0.0711,14.7404 +Khronos,5x5,ldr-rgba-diffuse.png,39.2058,0.1099,0.0684,15.3348 +Khronos,5x5,ldr-rgba-specgloss.png,38.4784,0.1424,0.0982,10.6829 +Khronos,5x5,ldr-xy-normal1.png,42.0012,0.1420,0.0908,11.5439 +Khronos,5x5,ldr-xy-normal2.png,46.4491,0.3171,0.1198,35.0027 +Khronos,6x6,ldr-l-occlusion.png,48.1652,0.0384,0.0106,98.7815 +Khronos,6x6,ldr-rgb-diffuse.png,43.2161,0.2493,0.1032,40.6357 +Khronos,6x6,ldr-rgb-emissive.png,49.0922,0.0322,0.0056,188.2242 +Khronos,6x6,ldr-rgb-metalrough.png,36.5665,0.1071,0.0691,15.1750 +Khronos,6x6,ldr-rgb-metalrough2.png,35.3752,0.6446,0.4873,8.6074 +Khronos,6x6,ldr-rgba-base.png,36.2171,0.1224,0.0796,13.1706 +Khronos,6x6,ldr-rgba-diffuse.png,36.1683,0.1257,0.0843,12.4382 +Khronos,6x6,ldr-rgba-specgloss.png,36.1729,0.1495,0.1048,10.0034 +Khronos,6x6,ldr-xy-normal1.png,39.7098,0.1328,0.0827,12.6754 +Khronos,6x6,ldr-xy-normal2.png,44.2686,0.3142,0.1184,35.4246 +Khronos,8x8,ldr-l-occlusion.png,43.9539,0.0406,0.0128,81.8561 +Khronos,8x8,ldr-rgb-diffuse.png,38.4343,0.2848,0.1391,30.1562 +Khronos,8x8,ldr-rgb-emissive.png,44.6628,0.0355,0.0091,114.9756 +Khronos,8x8,ldr-rgb-metalrough.png,32.3691,0.1314,0.0934,11.2279 +Khronos,8x8,ldr-rgb-metalrough2.png,32.2370,0.6064,0.4505,9.3114 +Khronos,8x8,ldr-rgba-base.png,32.4906,0.1337,0.0905,11.5866 +Khronos,8x8,ldr-rgba-diffuse.png,32.1814,0.1581,0.1168,8.9787 +Khronos,8x8,ldr-rgba-specgloss.png,32.9771,0.1552,0.1110,9.4425 +Khronos,8x8,ldr-xy-normal1.png,36.6064,0.1255,0.0761,13.7827 +Khronos,8x8,ldr-xy-normal2.png,40.8606,0.3313,0.1402,29.9065 +Khronos,12x12,ldr-l-occlusion.png,40.5661,0.0404,0.0120,87.2230 +Khronos,12x12,ldr-rgb-diffuse.png,33.3873,0.2485,0.1048,40.0036 +Khronos,12x12,ldr-rgb-emissive.png,39.4684,0.0363,0.0090,116.2612 +Khronos,12x12,ldr-rgb-metalrough.png,28.6613,0.0953,0.0563,18.6374 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2734,0.3766,0.2170,19.3255 +Khronos,12x12,ldr-rgba-base.png,29.0545,0.1259,0.0815,12.8652 +Khronos,12x12,ldr-rgba-diffuse.png,28.6353,0.1406,0.0968,10.8355 +Khronos,12x12,ldr-rgba-specgloss.png,29.8286,0.1193,0.0694,15.1198 +Khronos,12x12,ldr-xy-normal1.png,32.7785,0.1156,0.0610,17.1929 +Khronos,12x12,ldr-xy-normal2.png,36.2721,0.3487,0.1540,27.2391 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-neon_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-neon_fastest_results.csv new file mode 100644 index 0000000..73a1803 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-neon_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.3133,0.0368,0.0090,116.5478 +Khronos,4x4,ldr-rgb-diffuse.png,52.3938,0.2256,0.0779,53.8457 +Khronos,4x4,ldr-rgb-emissive.png,57.9377,0.0308,0.0045,232.8610 +Khronos,4x4,ldr-rgb-metalrough.png,43.9316,0.0890,0.0509,20.6162 +Khronos,4x4,ldr-rgb-metalrough2.png,42.7512,0.4752,0.3152,13.3083 +Khronos,4x4,ldr-rgba-base.png,42.9570,0.1070,0.0641,16.3610 +Khronos,4x4,ldr-rgba-diffuse.png,43.3447,0.0853,0.0446,23.5118 +Khronos,4x4,ldr-rgba-specgloss.png,41.4899,0.1496,0.1051,9.9785 +Khronos,4x4,ldr-xy-normal1.png,44.9546,0.1298,0.0777,13.4914 +Khronos,4x4,ldr-xy-normal2.png,48.6052,0.3354,0.1335,31.4173 +Khronos,5x5,ldr-l-occlusion.png,53.0293,0.0356,0.0081,129.9506 +Khronos,5x5,ldr-rgb-diffuse.png,47.0203,0.2137,0.0687,61.0588 +Khronos,5x5,ldr-rgb-emissive.png,52.3745,0.0306,0.0040,260.2702 +Khronos,5x5,ldr-rgb-metalrough.png,39.4731,0.0795,0.0419,24.9988 +Khronos,5x5,ldr-rgb-metalrough2.png,37.5082,0.4720,0.3158,13.2831 +Khronos,5x5,ldr-rgba-base.png,38.3730,0.0919,0.0498,21.0633 +Khronos,5x5,ldr-rgba-diffuse.png,38.5202,0.0852,0.0448,23.3807 +Khronos,5x5,ldr-rgba-specgloss.png,38.0061,0.1100,0.0664,15.8025 +Khronos,5x5,ldr-xy-normal1.png,41.5496,0.1133,0.0631,16.6153 +Khronos,5x5,ldr-xy-normal2.png,46.0706,0.2983,0.1022,41.0366 +Khronos,6x6,ldr-l-occlusion.png,48.0811,0.0372,0.0097,107.9010 +Khronos,6x6,ldr-rgb-diffuse.png,43.1620,0.2347,0.0893,46.9676 +Khronos,6x6,ldr-rgb-emissive.png,48.9865,0.0307,0.0044,237.1298 +Khronos,6x6,ldr-rgb-metalrough.png,36.3834,0.0869,0.0492,21.2939 +Khronos,6x6,ldr-rgb-metalrough2.png,35.1859,0.4544,0.2985,14.0503 +Khronos,6x6,ldr-rgba-base.png,36.0451,0.0962,0.0539,19.4390 +Khronos,6x6,ldr-rgba-diffuse.png,35.9737,0.0938,0.0535,19.6160 +Khronos,6x6,ldr-rgba-specgloss.png,35.9510,0.1119,0.0684,15.3242 +Khronos,6x6,ldr-xy-normal1.png,39.2832,0.1094,0.0596,17.5873 +Khronos,6x6,ldr-xy-normal2.png,43.8887,0.2926,0.0986,42.5550 +Khronos,8x8,ldr-l-occlusion.png,43.4580,0.0387,0.0110,95.3155 +Khronos,8x8,ldr-rgb-diffuse.png,38.3059,0.2569,0.1119,37.4685 +Khronos,8x8,ldr-rgb-emissive.png,44.2656,0.0334,0.0069,151.4218 +Khronos,8x8,ldr-rgb-metalrough.png,32.2866,0.1061,0.0684,15.3253 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1313,0.4614,0.3067,13.6771 +Khronos,8x8,ldr-rgba-base.png,32.3652,0.1076,0.0654,16.0230 +Khronos,8x8,ldr-rgba-diffuse.png,32.0718,0.1216,0.0811,12.9250 +Khronos,8x8,ldr-rgba-specgloss.png,32.8799,0.1221,0.0786,13.3474 +Khronos,8x8,ldr-xy-normal1.png,36.3825,0.1065,0.0575,18.2231 +Khronos,8x8,ldr-xy-normal2.png,40.4241,0.3036,0.1150,36.4566 +Khronos,12x12,ldr-l-occlusion.png,40.2057,0.0383,0.0100,104.3650 +Khronos,12x12,ldr-rgb-diffuse.png,33.3359,0.2288,0.0854,49.1130 +Khronos,12x12,ldr-rgb-emissive.png,39.2731,0.0338,0.0067,155.9923 +Khronos,12x12,ldr-rgb-metalrough.png,28.6142,0.0805,0.0424,24.7487 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1800,0.3100,0.1562,26.8540 +Khronos,12x12,ldr-rgba-base.png,28.9932,0.0977,0.0552,19.0128 +Khronos,12x12,ldr-rgba-diffuse.png,28.5821,0.1037,0.0626,16.7510 +Khronos,12x12,ldr-rgba-specgloss.png,29.7831,0.0906,0.0468,22.4049 +Khronos,12x12,ldr-xy-normal1.png,32.6438,0.0891,0.0404,25.9637 +Khronos,12x12,ldr-xy-normal2.png,36.0512,0.2830,0.1003,41.8164 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-neon_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-neon_medium_results.csv new file mode 100644 index 0000000..eb829cb --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-neon_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,62.6540,0.0666,0.0345,30.4254 +Khronos,4x4,ldr-rgb-diffuse.png,54.0236,0.5213,0.3574,11.7342 +Khronos,4x4,ldr-rgb-emissive.png,59.8931,0.0472,0.0180,58.1706 +Khronos,4x4,ldr-rgb-metalrough.png,44.9620,0.3399,0.2931,3.5781 +Khronos,4x4,ldr-rgb-metalrough2.png,43.8694,2.1515,1.9756,2.1230 +Khronos,4x4,ldr-rgba-base.png,43.9051,0.4055,0.3581,2.9279 +Khronos,4x4,ldr-rgba-diffuse.png,44.2751,0.2809,0.2340,4.4805 +Khronos,4x4,ldr-rgba-specgloss.png,42.4087,0.5483,0.4980,2.1056 +Khronos,4x4,ldr-xy-normal1.png,46.6523,0.4716,0.4168,2.5156 +Khronos,4x4,ldr-xy-normal2.png,50.4038,0.9420,0.7391,5.6748 +Khronos,5x5,ldr-l-occlusion.png,56.2813,0.0578,0.0294,35.7205 +Khronos,5x5,ldr-rgb-diffuse.png,49.0503,0.4575,0.3082,13.6076 +Khronos,5x5,ldr-rgb-emissive.png,55.4946,0.0452,0.0182,57.4683 +Khronos,5x5,ldr-rgb-metalrough.png,40.3604,0.2858,0.2457,4.2682 +Khronos,5x5,ldr-rgb-metalrough2.png,39.1705,2.1394,1.9758,2.1229 +Khronos,5x5,ldr-rgba-base.png,39.5053,0.3746,0.3293,3.1838 +Khronos,5x5,ldr-rgba-diffuse.png,39.6251,0.3003,0.2577,4.0694 +Khronos,5x5,ldr-rgba-specgloss.png,38.8345,0.6364,0.5750,1.8235 +Khronos,5x5,ldr-xy-normal1.png,43.1993,0.5764,0.5016,2.0907 +Khronos,5x5,ldr-xy-normal2.png,47.4061,0.9960,0.7403,5.6658 +Khronos,6x6,ldr-l-occlusion.png,50.5914,0.0836,0.0471,22.2717 +Khronos,6x6,ldr-rgb-diffuse.png,44.8576,0.6125,0.4235,9.9047 +Khronos,6x6,ldr-rgb-emissive.png,51.5504,0.0617,0.0268,39.1390 +Khronos,6x6,ldr-rgb-metalrough.png,36.8965,0.3637,0.3131,3.3490 +Khronos,6x6,ldr-rgb-metalrough2.png,36.5268,2.4749,2.2749,1.8437 +Khronos,6x6,ldr-rgba-base.png,36.7233,0.4302,0.3709,2.8271 +Khronos,6x6,ldr-rgba-diffuse.png,36.5399,0.3839,0.3293,3.1843 +Khronos,6x6,ldr-rgba-specgloss.png,36.5328,0.5912,0.5311,1.9744 +Khronos,6x6,ldr-xy-normal1.png,40.7199,0.4068,0.3383,3.0999 +Khronos,6x6,ldr-xy-normal2.png,45.3200,0.6585,0.4027,10.4164 +Khronos,8x8,ldr-l-occlusion.png,45.3887,0.1063,0.0684,15.3254 +Khronos,8x8,ldr-rgb-diffuse.png,40.2569,0.8405,0.6534,6.4196 +Khronos,8x8,ldr-rgb-emissive.png,46.6857,0.0753,0.0397,26.4004 +Khronos,8x8,ldr-rgb-metalrough.png,32.7170,0.4956,0.4437,2.3634 +Khronos,8x8,ldr-rgb-metalrough2.png,33.2520,2.9036,2.7010,1.5529 +Khronos,8x8,ldr-rgba-base.png,33.1110,0.5041,0.4449,2.3570 +Khronos,8x8,ldr-rgba-diffuse.png,32.5991,0.5301,0.4739,2.2129 +Khronos,8x8,ldr-rgba-specgloss.png,33.5088,0.6907,0.6313,1.6609 +Khronos,8x8,ldr-xy-normal1.png,37.4760,0.4472,0.3792,2.7650 +Khronos,8x8,ldr-xy-normal2.png,42.1661,0.7027,0.4565,9.1881 +Khronos,12x12,ldr-l-occlusion.png,41.6088,0.0746,0.0363,28.8514 +Khronos,12x12,ldr-rgb-diffuse.png,35.7801,0.8962,0.7047,5.9516 +Khronos,12x12,ldr-rgb-emissive.png,41.4140,0.0867,0.0490,21.3908 +Khronos,12x12,ldr-rgb-metalrough.png,29.1287,0.4787,0.4251,2.4667 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1830,1.9063,1.7452,2.4033 +Khronos,12x12,ldr-rgba-base.png,29.6585,0.4244,0.3746,2.7990 +Khronos,12x12,ldr-rgba-diffuse.png,29.0859,0.5406,0.4927,2.1282 +Khronos,12x12,ldr-rgba-specgloss.png,30.4963,0.4952,0.4478,2.3414 +Khronos,12x12,ldr-xy-normal1.png,33.5470,0.3204,0.2663,3.9374 +Khronos,12x12,ldr-xy-normal2.png,37.8631,0.6084,0.4174,10.0477 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-neon_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-neon_thorough_results.csv new file mode 100644 index 0000000..21ad3c9 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-neon_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.9044,0.2104,0.1798,5.8328 +Khronos,4x4,ldr-rgb-diffuse.png,54.9599,2.2388,2.0840,2.0126 +Khronos,4x4,ldr-rgb-emissive.png,60.9188,0.0762,0.0479,21.8928 +Khronos,4x4,ldr-rgb-metalrough.png,45.0994,0.6011,0.5626,1.8640 +Khronos,4x4,ldr-rgb-metalrough2.png,44.1518,3.7371,3.5775,1.1724 +Khronos,4x4,ldr-rgba-base.png,44.1046,0.7667,0.7226,1.4511 +Khronos,4x4,ldr-rgba-diffuse.png,44.4758,0.5310,0.4898,2.1410 +Khronos,4x4,ldr-rgba-specgloss.png,42.5749,0.9457,0.9004,1.1645 +Khronos,4x4,ldr-xy-normal1.png,46.8196,1.0535,1.0016,1.0469 +Khronos,4x4,ldr-xy-normal2.png,50.7622,2.0019,1.8095,2.3180 +Khronos,5x5,ldr-l-occlusion.png,58.0357,0.2518,0.2231,4.6995 +Khronos,5x5,ldr-rgb-diffuse.png,49.9121,1.6742,1.5293,2.7427 +Khronos,5x5,ldr-rgb-emissive.png,56.2144,0.0806,0.0539,19.4447 +Khronos,5x5,ldr-rgb-metalrough.png,40.5654,0.6088,0.5707,1.8373 +Khronos,5x5,ldr-rgb-metalrough2.png,39.6374,3.9995,3.8434,1.0913 +Khronos,5x5,ldr-rgba-base.png,39.8428,0.8098,0.7660,1.3689 +Khronos,5x5,ldr-rgba-diffuse.png,39.9543,0.5849,0.5434,1.9297 +Khronos,5x5,ldr-rgba-specgloss.png,39.0954,0.9684,0.9230,1.1360 +Khronos,5x5,ldr-xy-normal1.png,43.5257,1.3286,1.2762,0.8217 +Khronos,5x5,ldr-xy-normal2.png,48.0598,3.0572,2.8563,1.4684 +Khronos,6x6,ldr-l-occlusion.png,52.1122,0.2438,0.2156,4.8644 +Khronos,6x6,ldr-rgb-diffuse.png,45.8096,1.5072,1.3611,3.0815 +Khronos,6x6,ldr-rgb-emissive.png,52.7006,0.0903,0.0637,16.4578 +Khronos,6x6,ldr-rgb-metalrough.png,37.0909,0.6849,0.6469,1.6208 +Khronos,6x6,ldr-rgb-metalrough2.png,36.8453,4.3922,4.2382,0.9897 +Khronos,6x6,ldr-rgba-base.png,36.9420,0.8726,0.8295,1.2642 +Khronos,6x6,ldr-rgba-diffuse.png,36.7150,0.6499,0.6086,1.7229 +Khronos,6x6,ldr-rgba-specgloss.png,36.7245,1.0434,0.9986,1.0501 +Khronos,6x6,ldr-xy-normal1.png,41.1534,1.2492,1.1978,0.8754 +Khronos,6x6,ldr-xy-normal2.png,45.9258,3.0135,2.8142,1.4904 +Khronos,8x8,ldr-l-occlusion.png,46.0084,0.3115,0.2823,3.7146 +Khronos,8x8,ldr-rgb-diffuse.png,40.9086,2.0452,1.8945,2.2139 +Khronos,8x8,ldr-rgb-emissive.png,47.5382,0.1071,0.0795,13.1961 +Khronos,8x8,ldr-rgb-metalrough.png,32.8764,1.0562,1.0127,1.0354 +Khronos,8x8,ldr-rgb-metalrough2.png,33.6471,6.5547,6.3896,0.6564 +Khronos,8x8,ldr-rgba-base.png,33.3130,1.3633,1.3141,0.7979 +Khronos,8x8,ldr-rgba-diffuse.png,32.7517,1.0724,1.0229,1.0251 +Khronos,8x8,ldr-rgba-specgloss.png,33.6674,1.6296,1.5771,0.6649 +Khronos,8x8,ldr-xy-normal1.png,37.7688,1.1053,1.0433,1.0050 +Khronos,8x8,ldr-xy-normal2.png,42.5753,1.8778,1.6763,2.5022 +Khronos,12x12,ldr-l-occlusion.png,42.4252,0.3062,0.2736,3.8327 +Khronos,12x12,ldr-rgb-diffuse.png,36.6233,2.4158,2.2632,1.8533 +Khronos,12x12,ldr-rgb-emissive.png,42.3669,0.1762,0.1412,7.4248 +Khronos,12x12,ldr-rgb-metalrough.png,29.3131,1.5724,1.5243,0.6879 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7812,8.8449,8.6600,0.4843 +Khronos,12x12,ldr-rgba-base.png,29.9371,1.9317,1.8721,0.5601 +Khronos,12x12,ldr-rgba-diffuse.png,29.2718,1.8302,1.7701,0.5924 +Khronos,12x12,ldr-rgba-specgloss.png,30.7200,2.6013,2.5335,0.4139 +Khronos,12x12,ldr-xy-normal1.png,33.9704,1.3148,1.2431,0.8435 +Khronos,12x12,ldr-xy-normal2.png,38.4786,2.1222,1.8788,2.2324 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse2_fast_results.csv new file mode 100644 index 0000000..6a7f241 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse2_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.4655,0.0409,0.0094,111.2894 +Khronos,4x4,ldr-rgb-diffuse.png,52.6045,0.2094,0.0804,52.1816 +Khronos,4x4,ldr-rgb-emissive.png,58.5113,0.0383,0.0053,196.9921 +Khronos,4x4,ldr-rgb-metalrough.png,44.4073,0.1097,0.0610,17.1822 +Khronos,4x4,ldr-rgb-metalrough2.png,43.0365,0.5337,0.3917,10.7090 +Khronos,4x4,ldr-rgba-base.png,43.3923,0.1297,0.0774,13.5459 +Khronos,4x4,ldr-rgba-diffuse.png,43.9493,0.1039,0.0545,19.2279 +Khronos,4x4,ldr-rgba-specgloss.png,41.7912,0.1772,0.1240,8.4582 +Khronos,4x4,ldr-xy-normal1.png,45.0926,0.1713,0.0902,11.6278 +Khronos,4x4,ldr-xy-normal2.png,48.8199,0.3769,0.1389,30.1953 +Khronos,5x5,ldr-l-occlusion.png,53.1348,0.0376,0.0069,153.0501 +Khronos,5x5,ldr-rgb-diffuse.png,47.1728,0.1863,0.0578,72.5984 +Khronos,5x5,ldr-rgb-emissive.png,52.6847,0.0364,0.0043,242.5572 +Khronos,5x5,ldr-rgb-metalrough.png,39.9533,0.0960,0.0480,21.8367 +Khronos,5x5,ldr-rgb-metalrough2.png,38.0161,0.5252,0.3830,10.9508 +Khronos,5x5,ldr-rgba-base.png,38.9983,0.1079,0.0573,18.3046 +Khronos,5x5,ldr-rgba-diffuse.png,39.2058,0.1027,0.0545,19.2300 +Khronos,5x5,ldr-rgba-specgloss.png,38.4784,0.1320,0.0788,13.3058 +Khronos,5x5,ldr-xy-normal1.png,42.0012,0.1512,0.0715,14.6621 +Khronos,5x5,ldr-xy-normal2.png,46.4491,0.3279,0.0918,45.6860 +Khronos,6x6,ldr-l-occlusion.png,48.1652,0.0395,0.0089,117.3282 +Khronos,6x6,ldr-rgb-diffuse.png,43.2161,0.2114,0.0841,49.8444 +Khronos,6x6,ldr-rgb-emissive.png,49.0922,0.0369,0.0051,204.2373 +Khronos,6x6,ldr-rgb-metalrough.png,36.5665,0.1047,0.0580,18.0889 +Khronos,6x6,ldr-rgb-metalrough2.png,35.3752,0.5328,0.3903,10.7461 +Khronos,6x6,ldr-rgba-base.png,36.2171,0.1176,0.0657,15.9640 +Khronos,6x6,ldr-rgba-diffuse.png,36.1683,0.1154,0.0691,15.1840 +Khronos,6x6,ldr-rgba-specgloss.png,36.1729,0.1404,0.0864,12.1297 +Khronos,6x6,ldr-xy-normal1.png,39.7098,0.1470,0.0673,15.5713 +Khronos,6x6,ldr-xy-normal2.png,44.2686,0.3366,0.0926,45.3032 +Khronos,8x8,ldr-l-occlusion.png,43.9539,0.0417,0.0104,100.6602 +Khronos,8x8,ldr-rgb-diffuse.png,38.4343,0.2388,0.1118,37.5023 +Khronos,8x8,ldr-rgb-emissive.png,44.6628,0.0405,0.0081,129.4685 +Khronos,8x8,ldr-rgb-metalrough.png,32.3691,0.1253,0.0775,13.5349 +Khronos,8x8,ldr-rgb-metalrough2.png,32.2370,0.4927,0.3517,11.9242 +Khronos,8x8,ldr-rgba-base.png,32.4906,0.1250,0.0733,14.3008 +Khronos,8x8,ldr-rgba-diffuse.png,32.1814,0.1448,0.0945,11.0922 +Khronos,8x8,ldr-rgba-specgloss.png,32.9771,0.1451,0.0889,11.7905 +Khronos,8x8,ldr-xy-normal1.png,36.6064,0.1412,0.0610,17.2010 +Khronos,8x8,ldr-xy-normal2.png,40.8606,0.3487,0.1069,39.2214 +Khronos,12x12,ldr-l-occlusion.png,40.5661,0.0431,0.0098,106.4851 +Khronos,12x12,ldr-rgb-diffuse.png,33.3873,0.2056,0.0801,52.3412 +Khronos,12x12,ldr-rgb-emissive.png,39.4684,0.0406,0.0076,137.6411 +Khronos,12x12,ldr-rgb-metalrough.png,28.6613,0.0942,0.0446,23.5070 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2734,0.3007,0.1601,26.1998 +Khronos,12x12,ldr-rgba-base.png,29.0545,0.1102,0.0579,18.0976 +Khronos,12x12,ldr-rgba-diffuse.png,28.6353,0.1189,0.0680,15.4232 +Khronos,12x12,ldr-rgba-specgloss.png,29.8286,0.1032,0.0491,21.3681 +Khronos,12x12,ldr-xy-normal1.png,32.7785,0.1237,0.0405,25.8798 +Khronos,12x12,ldr-xy-normal2.png,36.2721,0.3421,0.0938,44.6945 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse2_fastest_results.csv new file mode 100644 index 0000000..cff746a --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse2_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.3133,0.0394,0.0083,125.8779 +Khronos,4x4,ldr-rgb-diffuse.png,52.3938,0.1995,0.0693,60.5204 +Khronos,4x4,ldr-rgb-emissive.png,57.9377,0.0367,0.0042,248.4772 +Khronos,4x4,ldr-rgb-metalrough.png,43.9316,0.0877,0.0398,26.3587 +Khronos,4x4,ldr-rgb-metalrough2.png,42.7512,0.3960,0.2466,17.0079 +Khronos,4x4,ldr-rgba-base.png,42.9570,0.0977,0.0489,21.4569 +Khronos,4x4,ldr-rgba-diffuse.png,43.3447,0.0815,0.0344,30.5077 +Khronos,4x4,ldr-rgba-specgloss.png,41.4899,0.1313,0.0777,13.5035 +Khronos,4x4,ldr-xy-normal1.png,44.9546,0.1390,0.0585,17.9375 +Khronos,4x4,ldr-xy-normal2.png,48.6052,0.3450,0.1072,39.1340 +Khronos,5x5,ldr-l-occlusion.png,53.0293,0.0370,0.0067,155.9204 +Khronos,5x5,ldr-rgb-diffuse.png,47.0203,0.1820,0.0541,77.5058 +Khronos,5x5,ldr-rgb-emissive.png,52.3745,0.0358,0.0039,270.1005 +Khronos,5x5,ldr-rgb-metalrough.png,39.4731,0.0800,0.0339,30.9543 +Khronos,5x5,ldr-rgb-metalrough2.png,37.5082,0.3915,0.2501,16.7712 +Khronos,5x5,ldr-rgba-base.png,38.3730,0.0899,0.0394,26.6143 +Khronos,5x5,ldr-rgba-diffuse.png,38.5202,0.0824,0.0358,29.2973 +Khronos,5x5,ldr-rgba-specgloss.png,38.0061,0.1056,0.0530,19.8009 +Khronos,5x5,ldr-xy-normal1.png,41.5496,0.1277,0.0491,21.3554 +Khronos,5x5,ldr-xy-normal2.png,46.0706,0.3170,0.0777,53.9633 +Khronos,6x6,ldr-l-occlusion.png,48.0811,0.0388,0.0081,129.2137 +Khronos,6x6,ldr-rgb-diffuse.png,43.1620,0.2006,0.0722,58.0543 +Khronos,6x6,ldr-rgb-emissive.png,48.9865,0.0355,0.0042,250.6724 +Khronos,6x6,ldr-rgb-metalrough.png,36.3834,0.0885,0.0411,25.5383 +Khronos,6x6,ldr-rgb-metalrough2.png,35.1859,0.3889,0.2468,16.9976 +Khronos,6x6,ldr-rgba-base.png,36.0451,0.0938,0.0445,23.5698 +Khronos,6x6,ldr-rgba-diffuse.png,35.9737,0.0920,0.0443,23.6490 +Khronos,6x6,ldr-rgba-specgloss.png,35.9510,0.1100,0.0567,18.4915 +Khronos,6x6,ldr-xy-normal1.png,39.2832,0.1270,0.0478,21.9261 +Khronos,6x6,ldr-xy-normal2.png,43.8887,0.3189,0.0755,55.5411 +Khronos,8x8,ldr-l-occlusion.png,43.4580,0.0409,0.0090,116.6003 +Khronos,8x8,ldr-rgb-diffuse.png,38.3059,0.2180,0.0903,46.4501 +Khronos,8x8,ldr-rgb-emissive.png,44.2656,0.0375,0.0061,172.4656 +Khronos,8x8,ldr-rgb-metalrough.png,32.2866,0.1037,0.0560,18.7296 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1313,0.3927,0.2521,16.6365 +Khronos,8x8,ldr-rgba-base.png,32.3652,0.1042,0.0529,19.8199 +Khronos,8x8,ldr-rgba-diffuse.png,32.0718,0.1153,0.0664,15.7804 +Khronos,8x8,ldr-rgba-specgloss.png,32.8799,0.1187,0.0643,16.3081 +Khronos,8x8,ldr-xy-normal1.png,36.3825,0.1273,0.0459,22.8299 +Khronos,8x8,ldr-xy-normal2.png,40.4241,0.3327,0.0885,47.3885 +Khronos,12x12,ldr-l-occlusion.png,40.2057,0.0388,0.0082,127.8279 +Khronos,12x12,ldr-rgb-diffuse.png,33.3359,0.1923,0.0658,63.7606 +Khronos,12x12,ldr-rgb-emissive.png,39.2731,0.0391,0.0057,184.5128 +Khronos,12x12,ldr-rgb-metalrough.png,28.6142,0.0810,0.0331,31.7095 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1800,0.2597,0.1205,34.7956 +Khronos,12x12,ldr-rgba-base.png,28.9932,0.0938,0.0422,24.8195 +Khronos,12x12,ldr-rgba-diffuse.png,28.5821,0.0987,0.0484,21.6549 +Khronos,12x12,ldr-rgba-specgloss.png,29.7831,0.0918,0.0366,28.6136 +Khronos,12x12,ldr-xy-normal1.png,32.6438,0.1153,0.0305,34.4170 +Khronos,12x12,ldr-xy-normal2.png,36.0512,0.3250,0.0753,55.6835 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse2_medium_results.csv new file mode 100644 index 0000000..0764240 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse2_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,62.6540,0.0570,0.0253,41.3801 +Khronos,4x4,ldr-rgb-diffuse.png,54.0236,0.3708,0.2444,17.1621 +Khronos,4x4,ldr-rgb-emissive.png,59.8931,0.0460,0.0140,74.9139 +Khronos,4x4,ldr-rgb-metalrough.png,44.9620,0.2368,0.1882,5.5707 +Khronos,4x4,ldr-rgb-metalrough2.png,43.8694,1.4590,1.3125,3.1956 +Khronos,4x4,ldr-rgba-base.png,43.9051,0.2949,0.2438,4.3008 +Khronos,4x4,ldr-rgba-diffuse.png,44.2751,0.2099,0.1597,6.5680 +Khronos,4x4,ldr-rgba-specgloss.png,42.4087,0.3979,0.3430,3.0568 +Khronos,4x4,ldr-xy-normal1.png,46.6523,0.3684,0.2905,3.6094 +Khronos,4x4,ldr-xy-normal2.png,50.4038,0.7531,0.5244,7.9986 +Khronos,5x5,ldr-l-occlusion.png,56.2813,0.0568,0.0247,42.4145 +Khronos,5x5,ldr-rgb-diffuse.png,49.0503,0.3545,0.2253,18.6179 +Khronos,5x5,ldr-rgb-emissive.png,55.4946,0.0470,0.0154,67.8774 +Khronos,5x5,ldr-rgb-metalrough.png,40.3604,0.2273,0.1788,5.8658 +Khronos,5x5,ldr-rgb-metalrough2.png,39.1705,1.5428,1.4014,2.9930 +Khronos,5x5,ldr-rgba-base.png,39.5053,0.2918,0.2392,4.3828 +Khronos,5x5,ldr-rgba-diffuse.png,39.6251,0.2310,0.1815,5.7783 +Khronos,5x5,ldr-rgba-specgloss.png,38.8345,0.3728,0.3181,3.2964 +Khronos,5x5,ldr-xy-normal1.png,43.1993,0.3346,0.2538,4.1310 +Khronos,5x5,ldr-xy-normal2.png,47.4061,0.6639,0.4245,9.8795 +Khronos,6x6,ldr-l-occlusion.png,50.5914,0.0600,0.0291,36.0534 +Khronos,6x6,ldr-rgb-diffuse.png,44.8576,0.3732,0.2438,17.2020 +Khronos,6x6,ldr-rgb-emissive.png,51.5504,0.0496,0.0178,59.0215 +Khronos,6x6,ldr-rgb-metalrough.png,36.8965,0.2328,0.1859,5.6420 +Khronos,6x6,ldr-rgb-metalrough2.png,36.5268,1.4839,1.3406,3.1287 +Khronos,6x6,ldr-rgba-base.png,36.7233,0.2724,0.2201,4.7650 +Khronos,6x6,ldr-rgba-diffuse.png,36.5399,0.2473,0.1981,5.2934 +Khronos,6x6,ldr-rgba-specgloss.png,36.5328,0.3644,0.3104,3.3781 +Khronos,6x6,ldr-xy-normal1.png,40.7199,0.2859,0.2070,5.0663 +Khronos,6x6,ldr-xy-normal2.png,45.3200,0.4784,0.2392,17.5341 +Khronos,8x8,ldr-l-occlusion.png,45.3887,0.0745,0.0423,24.7643 +Khronos,8x8,ldr-rgb-diffuse.png,40.2569,0.5168,0.3912,10.7204 +Khronos,8x8,ldr-rgb-emissive.png,46.6857,0.0590,0.0258,40.6820 +Khronos,8x8,ldr-rgb-metalrough.png,32.7170,0.3114,0.2621,4.0000 +Khronos,8x8,ldr-rgb-metalrough2.png,33.2520,1.7228,1.5828,2.6500 +Khronos,8x8,ldr-rgba-base.png,33.1110,0.3203,0.2674,3.9221 +Khronos,8x8,ldr-rgba-diffuse.png,32.5991,0.3309,0.2809,3.7323 +Khronos,8x8,ldr-rgba-specgloss.png,33.5088,0.4244,0.3694,2.8389 +Khronos,8x8,ldr-xy-normal1.png,37.4760,0.3085,0.2248,4.6635 +Khronos,8x8,ldr-xy-normal2.png,42.1661,0.5158,0.2708,15.4882 +Khronos,12x12,ldr-l-occlusion.png,41.6088,0.0589,0.0230,45.5822 +Khronos,12x12,ldr-rgb-diffuse.png,35.7801,0.5122,0.3828,10.9562 +Khronos,12x12,ldr-rgb-emissive.png,41.4140,0.0647,0.0288,36.4164 +Khronos,12x12,ldr-rgb-metalrough.png,29.1287,0.2829,0.2325,4.5095 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1830,1.2069,1.0640,3.9419 +Khronos,12x12,ldr-rgba-base.png,29.6585,0.2889,0.2355,4.4519 +Khronos,12x12,ldr-rgba-diffuse.png,29.0859,0.3605,0.3080,3.4041 +Khronos,12x12,ldr-rgba-specgloss.png,30.4963,0.3378,0.2793,3.7539 +Khronos,12x12,ldr-xy-normal1.png,33.5470,0.2557,0.1705,6.1511 +Khronos,12x12,ldr-xy-normal2.png,37.8631,0.5143,0.2677,15.6660 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse2_thorough_results.csv new file mode 100644 index 0000000..b04e54c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse2_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.9044,0.1644,0.1321,7.9370 +Khronos,4x4,ldr-rgb-diffuse.png,54.9599,1.5801,1.4498,2.8931 +Khronos,4x4,ldr-rgb-emissive.png,60.9188,0.0700,0.0382,27.4792 +Khronos,4x4,ldr-rgb-metalrough.png,45.0994,0.4933,0.4440,2.3614 +Khronos,4x4,ldr-rgb-metalrough2.png,44.1518,3.0108,2.8634,1.4648 +Khronos,4x4,ldr-rgba-base.png,44.1046,0.6196,0.5667,1.8504 +Khronos,4x4,ldr-rgba-diffuse.png,44.4758,0.4298,0.3821,2.7439 +Khronos,4x4,ldr-rgba-specgloss.png,42.5749,0.7680,0.7118,1.4732 +Khronos,4x4,ldr-xy-normal1.png,46.8196,0.8667,0.7874,1.3316 +Khronos,4x4,ldr-xy-normal2.png,50.7622,1.6785,1.4510,2.8905 +Khronos,5x5,ldr-l-occlusion.png,58.0357,0.2176,0.1861,5.6340 +Khronos,5x5,ldr-rgb-diffuse.png,49.9121,1.3980,1.2640,3.3184 +Khronos,5x5,ldr-rgb-emissive.png,56.2144,0.0768,0.0450,23.2898 +Khronos,5x5,ldr-rgb-metalrough.png,40.5654,0.5153,0.4670,2.2452 +Khronos,5x5,ldr-rgb-metalrough2.png,39.6374,3.3254,3.1745,1.3213 +Khronos,5x5,ldr-rgba-base.png,39.8428,0.6738,0.6214,1.6875 +Khronos,5x5,ldr-rgba-diffuse.png,39.9543,0.4922,0.4415,2.3751 +Khronos,5x5,ldr-rgba-specgloss.png,39.0954,0.8028,0.7495,1.3990 +Khronos,5x5,ldr-xy-normal1.png,43.5257,1.1175,1.0364,1.0117 +Khronos,5x5,ldr-xy-normal2.png,48.0598,2.5754,2.3417,1.7912 +Khronos,6x6,ldr-l-occlusion.png,52.1122,0.2130,0.1836,5.7124 +Khronos,6x6,ldr-rgb-diffuse.png,45.8096,1.2905,1.1604,3.6145 +Khronos,6x6,ldr-rgb-emissive.png,52.7006,0.0866,0.0552,18.9805 +Khronos,6x6,ldr-rgb-metalrough.png,37.0909,0.5898,0.5420,1.9345 +Khronos,6x6,ldr-rgb-metalrough2.png,36.8453,3.6779,3.5380,1.1855 +Khronos,6x6,ldr-rgba-base.png,36.9420,0.7379,0.6861,1.5284 +Khronos,6x6,ldr-rgba-diffuse.png,36.7150,0.5560,0.5052,2.0755 +Khronos,6x6,ldr-rgba-specgloss.png,36.7245,0.8705,0.8163,1.2845 +Khronos,6x6,ldr-xy-normal1.png,41.1534,1.0791,0.9984,1.0502 +Khronos,6x6,ldr-xy-normal2.png,45.9258,2.5870,2.3528,1.7827 +Khronos,8x8,ldr-l-occlusion.png,46.0084,0.2658,0.2324,4.5122 +Khronos,8x8,ldr-rgb-diffuse.png,40.9086,1.5881,1.4524,2.8878 +Khronos,8x8,ldr-rgb-emissive.png,47.5382,0.0991,0.0656,15.9805 +Khronos,8x8,ldr-rgb-metalrough.png,32.8764,0.7866,0.7364,1.4239 +Khronos,8x8,ldr-rgb-metalrough2.png,33.6471,4.7016,4.5578,0.9203 +Khronos,8x8,ldr-rgba-base.png,33.3130,0.9709,0.9165,1.1442 +Khronos,8x8,ldr-rgba-diffuse.png,32.7517,0.7661,0.7152,1.4661 +Khronos,8x8,ldr-rgba-specgloss.png,33.6674,1.1387,1.0839,0.9674 +Khronos,8x8,ldr-xy-normal1.png,37.7688,0.7755,0.6930,1.5132 +Khronos,8x8,ldr-xy-normal2.png,42.5753,1.6232,1.3798,3.0398 +Khronos,12x12,ldr-l-occlusion.png,42.4252,0.2428,0.2059,5.0917 +Khronos,12x12,ldr-rgb-diffuse.png,36.6233,1.7952,1.6611,2.5251 +Khronos,12x12,ldr-rgb-emissive.png,42.3669,0.1395,0.1015,10.3268 +Khronos,12x12,ldr-rgb-metalrough.png,29.3131,1.0284,0.9702,1.0808 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7812,5.3247,5.1798,0.8097 +Khronos,12x12,ldr-rgba-base.png,29.9371,1.0919,1.0339,1.0142 +Khronos,12x12,ldr-rgba-diffuse.png,29.2718,1.0105,0.9526,1.1007 +Khronos,12x12,ldr-rgba-specgloss.png,30.7200,1.4002,1.3378,0.7838 +Khronos,12x12,ldr-xy-normal1.png,33.9704,0.7480,0.6619,1.5842 +Khronos,12x12,ldr-xy-normal2.png,38.4786,1.2446,0.9954,4.2138 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse4.1_fast_results.csv new file mode 100644 index 0000000..4ed54d6 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse4.1_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.4655,0.0385,0.0074,141.0896 +Khronos,4x4,ldr-rgb-diffuse.png,52.6045,0.1832,0.0637,65.8013 +Khronos,4x4,ldr-rgb-emissive.png,58.5113,0.0336,0.0044,237.0659 +Khronos,4x4,ldr-rgb-metalrough.png,44.4073,0.0948,0.0500,20.9540 +Khronos,4x4,ldr-rgb-metalrough2.png,43.0365,0.4592,0.3247,12.9180 +Khronos,4x4,ldr-rgba-base.png,43.3923,0.1119,0.0636,16.4842 +Khronos,4x4,ldr-rgba-diffuse.png,43.9493,0.0912,0.0448,23.4198 +Khronos,4x4,ldr-rgba-specgloss.png,41.7912,0.1530,0.1029,10.1876 +Khronos,4x4,ldr-xy-normal1.png,45.0926,0.1516,0.0745,14.0771 +Khronos,4x4,ldr-xy-normal2.png,48.8199,0.3398,0.1134,36.9709 +Khronos,5x5,ldr-l-occlusion.png,53.1348,0.0365,0.0059,177.8785 +Khronos,5x5,ldr-rgb-diffuse.png,47.1728,0.1656,0.0491,85.3488 +Khronos,5x5,ldr-rgb-emissive.png,52.6847,0.0332,0.0038,274.2095 +Khronos,5x5,ldr-rgb-metalrough.png,39.9533,0.0828,0.0387,27.0762 +Khronos,5x5,ldr-rgb-metalrough2.png,38.0161,0.4485,0.3146,13.3326 +Khronos,5x5,ldr-rgba-base.png,38.9983,0.0938,0.0460,22.7931 +Khronos,5x5,ldr-rgba-diffuse.png,39.2058,0.0898,0.0445,23.5729 +Khronos,5x5,ldr-rgba-specgloss.png,38.4784,0.1143,0.0640,16.3932 +Khronos,5x5,ldr-xy-normal1.png,42.0012,0.1351,0.0586,17.8944 +Khronos,5x5,ldr-xy-normal2.png,46.4491,0.3062,0.0771,54.4127 +Khronos,6x6,ldr-l-occlusion.png,48.1652,0.0385,0.0075,139.1083 +Khronos,6x6,ldr-rgb-diffuse.png,43.2161,0.1861,0.0696,60.3063 +Khronos,6x6,ldr-rgb-emissive.png,49.0922,0.0338,0.0043,243.0666 +Khronos,6x6,ldr-rgb-metalrough.png,36.5665,0.0904,0.0472,22.2316 +Khronos,6x6,ldr-rgb-metalrough2.png,35.3752,0.4521,0.3194,13.1314 +Khronos,6x6,ldr-rgba-base.png,36.2171,0.1018,0.0539,19.4628 +Khronos,6x6,ldr-rgba-diffuse.png,36.1683,0.1025,0.0566,18.5327 +Khronos,6x6,ldr-rgba-specgloss.png,36.1729,0.1212,0.0706,14.8496 +Khronos,6x6,ldr-xy-normal1.png,39.7098,0.1314,0.0556,18.8627 +Khronos,6x6,ldr-xy-normal2.png,44.2686,0.3107,0.0772,54.3417 +Khronos,8x8,ldr-l-occlusion.png,43.9539,0.0398,0.0089,117.8817 +Khronos,8x8,ldr-rgb-diffuse.png,38.4343,0.2113,0.0936,44.8287 +Khronos,8x8,ldr-rgb-emissive.png,44.6628,0.0367,0.0069,152.7842 +Khronos,8x8,ldr-rgb-metalrough.png,32.3691,0.1092,0.0648,16.1890 +Khronos,8x8,ldr-rgb-metalrough2.png,32.2370,0.4239,0.2946,14.2373 +Khronos,8x8,ldr-rgba-base.png,32.4906,0.1095,0.0617,17.0055 +Khronos,8x8,ldr-rgba-diffuse.png,32.1814,0.1247,0.0795,13.1881 +Khronos,8x8,ldr-rgba-specgloss.png,32.9771,0.1252,0.0751,13.9605 +Khronos,8x8,ldr-xy-normal1.png,36.6064,0.1260,0.0506,20.7179 +Khronos,8x8,ldr-xy-normal2.png,40.8606,0.3235,0.0905,46.3341 +Khronos,12x12,ldr-l-occlusion.png,40.5661,0.0418,0.0087,120.5142 +Khronos,12x12,ldr-rgb-diffuse.png,33.3873,0.1891,0.0702,59.7896 +Khronos,12x12,ldr-rgb-emissive.png,39.4684,0.0390,0.0068,153.5256 +Khronos,12x12,ldr-rgb-metalrough.png,28.6613,0.0833,0.0386,27.1377 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2734,0.2726,0.1403,29.9042 +Khronos,12x12,ldr-rgba-base.png,29.0545,0.1009,0.0513,20.4221 +Khronos,12x12,ldr-rgba-diffuse.png,28.6353,0.1063,0.0596,17.5823 +Khronos,12x12,ldr-rgba-specgloss.png,29.8286,0.0938,0.0427,24.5608 +Khronos,12x12,ldr-xy-normal1.png,32.7785,0.1155,0.0357,29.4123 +Khronos,12x12,ldr-xy-normal2.png,36.2721,0.3148,0.0826,50.8081 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse4.1_fastest_results.csv new file mode 100644 index 0000000..ecdc779 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse4.1_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.3133,0.0372,0.0067,155.9702 +Khronos,4x4,ldr-rgb-diffuse.png,52.3938,0.1730,0.0564,74.3331 +Khronos,4x4,ldr-rgb-emissive.png,57.9377,0.0334,0.0037,281.6552 +Khronos,4x4,ldr-rgb-metalrough.png,43.9316,0.0767,0.0330,31.8127 +Khronos,4x4,ldr-rgb-metalrough2.png,42.7512,0.3372,0.2045,20.5142 +Khronos,4x4,ldr-rgba-base.png,42.9570,0.0886,0.0406,25.8098 +Khronos,4x4,ldr-rgba-diffuse.png,43.3447,0.0736,0.0285,36.8022 +Khronos,4x4,ldr-rgba-specgloss.png,41.4899,0.1149,0.0644,16.2913 +Khronos,4x4,ldr-xy-normal1.png,44.9546,0.1254,0.0491,21.3581 +Khronos,4x4,ldr-xy-normal2.png,48.6052,0.3158,0.0892,47.0261 +Khronos,5x5,ldr-l-occlusion.png,53.0293,0.0362,0.0058,181.0343 +Khronos,5x5,ldr-rgb-diffuse.png,47.0203,0.1605,0.0460,91.1985 +Khronos,5x5,ldr-rgb-emissive.png,52.3745,0.0330,0.0035,302.0014 +Khronos,5x5,ldr-rgb-metalrough.png,39.4731,0.0709,0.0282,37.1648 +Khronos,5x5,ldr-rgb-metalrough2.png,37.5082,0.3376,0.2064,20.3218 +Khronos,5x5,ldr-rgba-base.png,38.3730,0.0798,0.0322,32.5172 +Khronos,5x5,ldr-rgba-diffuse.png,38.5202,0.0735,0.0291,36.0138 +Khronos,5x5,ldr-rgba-specgloss.png,38.0061,0.0938,0.0434,24.1541 +Khronos,5x5,ldr-xy-normal1.png,41.5496,0.1157,0.0404,25.9556 +Khronos,5x5,ldr-xy-normal2.png,46.0706,0.2903,0.0653,64.1880 +Khronos,6x6,ldr-l-occlusion.png,48.0811,0.0372,0.0070,150.2476 +Khronos,6x6,ldr-rgb-diffuse.png,43.1620,0.1764,0.0597,70.2269 +Khronos,6x6,ldr-rgb-emissive.png,48.9865,0.0331,0.0036,288.6236 +Khronos,6x6,ldr-rgb-metalrough.png,36.3834,0.0782,0.0333,31.4708 +Khronos,6x6,ldr-rgb-metalrough2.png,35.1859,0.3319,0.2009,20.8798 +Khronos,6x6,ldr-rgba-base.png,36.0451,0.0829,0.0361,29.0697 +Khronos,6x6,ldr-rgba-diffuse.png,35.9737,0.0812,0.0359,29.1804 +Khronos,6x6,ldr-rgba-specgloss.png,35.9510,0.0962,0.0465,22.5540 +Khronos,6x6,ldr-xy-normal1.png,39.2832,0.1153,0.0394,26.5913 +Khronos,6x6,ldr-xy-normal2.png,43.8887,0.2936,0.0638,65.7197 +Khronos,8x8,ldr-l-occlusion.png,43.4580,0.0387,0.0077,135.9352 +Khronos,8x8,ldr-rgb-diffuse.png,38.3059,0.1898,0.0752,55.8117 +Khronos,8x8,ldr-rgb-emissive.png,44.2656,0.0355,0.0051,204.1994 +Khronos,8x8,ldr-rgb-metalrough.png,32.2866,0.0915,0.0470,22.3163 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1313,0.3406,0.2096,20.0107 +Khronos,8x8,ldr-rgba-base.png,32.3652,0.0939,0.0446,23.4965 +Khronos,8x8,ldr-rgba-diffuse.png,32.0718,0.1004,0.0551,19.0252 +Khronos,8x8,ldr-rgba-specgloss.png,32.8799,0.1036,0.0536,19.5601 +Khronos,8x8,ldr-xy-normal1.png,36.3825,0.1152,0.0383,27.3880 +Khronos,8x8,ldr-xy-normal2.png,40.4241,0.3051,0.0751,55.8459 +Khronos,12x12,ldr-l-occlusion.png,40.2057,0.0399,0.0071,147.3580 +Khronos,12x12,ldr-rgb-diffuse.png,33.3359,0.1734,0.0576,72.8280 +Khronos,12x12,ldr-rgb-emissive.png,39.2731,0.0357,0.0051,206.7723 +Khronos,12x12,ldr-rgb-metalrough.png,28.6142,0.0746,0.0292,35.9605 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1800,0.2406,0.1069,39.2189 +Khronos,12x12,ldr-rgba-base.png,28.9932,0.0862,0.0372,28.1679 +Khronos,12x12,ldr-rgba-diffuse.png,28.5821,0.0890,0.0431,24.3154 +Khronos,12x12,ldr-rgba-specgloss.png,29.7831,0.0811,0.0319,32.8399 +Khronos,12x12,ldr-xy-normal1.png,32.6438,0.1055,0.0267,39.2564 +Khronos,12x12,ldr-xy-normal2.png,36.0512,0.3006,0.0659,63.6301 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse4.1_medium_results.csv new file mode 100644 index 0000000..96ec06f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse4.1_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,62.6540,0.0525,0.0206,50.8645 +Khronos,4x4,ldr-rgb-diffuse.png,54.0236,0.3204,0.1998,20.9904 +Khronos,4x4,ldr-rgb-emissive.png,59.8931,0.0430,0.0118,88.7043 +Khronos,4x4,ldr-rgb-metalrough.png,44.9620,0.2028,0.1564,6.7033 +Khronos,4x4,ldr-rgb-metalrough2.png,43.8694,1.2255,1.0907,3.8457 +Khronos,4x4,ldr-rgba-base.png,43.9051,0.2510,0.2026,5.1760 +Khronos,4x4,ldr-rgba-diffuse.png,44.2751,0.1810,0.1347,7.7818 +Khronos,4x4,ldr-rgba-specgloss.png,42.4087,0.3375,0.2858,3.6686 +Khronos,4x4,ldr-xy-normal1.png,46.6523,0.3196,0.2434,4.3074 +Khronos,4x4,ldr-xy-normal2.png,50.4038,0.6547,0.4364,9.6117 +Khronos,5x5,ldr-l-occlusion.png,56.2813,0.0505,0.0198,53.0684 +Khronos,5x5,ldr-rgb-diffuse.png,49.0503,0.3006,0.1834,22.8723 +Khronos,5x5,ldr-rgb-emissive.png,55.4946,0.0423,0.0125,83.6242 +Khronos,5x5,ldr-rgb-metalrough.png,40.3604,0.1897,0.1451,7.2256 +Khronos,5x5,ldr-rgb-metalrough2.png,39.1705,1.2670,1.1329,3.7023 +Khronos,5x5,ldr-rgba-base.png,39.5053,0.2419,0.1936,5.4150 +Khronos,5x5,ldr-rgba-diffuse.png,39.6251,0.1932,0.1464,7.1626 +Khronos,5x5,ldr-rgba-specgloss.png,38.8345,0.3101,0.2585,4.0570 +Khronos,5x5,ldr-xy-normal1.png,43.1993,0.2843,0.2071,5.0628 +Khronos,5x5,ldr-xy-normal2.png,47.4061,0.5730,0.3432,12.2216 +Khronos,6x6,ldr-l-occlusion.png,50.5914,0.0540,0.0233,44.9781 +Khronos,6x6,ldr-rgb-diffuse.png,44.8576,0.3142,0.1960,21.3949 +Khronos,6x6,ldr-rgb-emissive.png,51.5504,0.0445,0.0144,72.8286 +Khronos,6x6,ldr-rgb-metalrough.png,36.8965,0.1982,0.1512,6.9345 +Khronos,6x6,ldr-rgb-metalrough2.png,36.5268,1.2291,1.0931,3.8372 +Khronos,6x6,ldr-rgba-base.png,36.7233,0.2267,0.1784,5.8789 +Khronos,6x6,ldr-rgba-diffuse.png,36.5399,0.2082,0.1611,6.5071 +Khronos,6x6,ldr-rgba-specgloss.png,36.5328,0.3060,0.2546,4.1190 +Khronos,6x6,ldr-xy-normal1.png,40.7199,0.2475,0.1696,6.1842 +Khronos,6x6,ldr-xy-normal2.png,45.3200,0.4274,0.1949,21.5224 +Khronos,8x8,ldr-l-occlusion.png,45.3887,0.0664,0.0348,30.1193 +Khronos,8x8,ldr-rgb-diffuse.png,40.2569,0.4372,0.3223,13.0146 +Khronos,8x8,ldr-rgb-emissive.png,46.6857,0.0524,0.0214,48.9232 +Khronos,8x8,ldr-rgb-metalrough.png,32.7170,0.2620,0.2186,4.7965 +Khronos,8x8,ldr-rgb-metalrough2.png,33.2520,1.4599,1.3270,3.1606 +Khronos,8x8,ldr-rgba-base.png,33.1110,0.2738,0.2228,4.7063 +Khronos,8x8,ldr-rgba-diffuse.png,32.5991,0.2816,0.2344,4.4740 +Khronos,8x8,ldr-rgba-specgloss.png,33.5088,0.3606,0.3105,3.3773 +Khronos,8x8,ldr-xy-normal1.png,37.4760,0.2704,0.1897,5.5269 +Khronos,8x8,ldr-xy-normal2.png,42.1661,0.4588,0.2250,18.6437 +Khronos,12x12,ldr-l-occlusion.png,41.6088,0.0558,0.0202,51.9636 +Khronos,12x12,ldr-rgb-diffuse.png,35.7801,0.4539,0.3377,12.4218 +Khronos,12x12,ldr-rgb-emissive.png,41.4140,0.0599,0.0255,41.1949 +Khronos,12x12,ldr-rgb-metalrough.png,29.1287,0.2509,0.2041,5.1378 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1830,1.0641,0.9318,4.5014 +Khronos,12x12,ldr-rgba-base.png,29.6585,0.2615,0.2084,5.0308 +Khronos,12x12,ldr-rgba-diffuse.png,29.0859,0.3215,0.2715,3.8622 +Khronos,12x12,ldr-rgba-specgloss.png,30.4963,0.2987,0.2453,4.2753 +Khronos,12x12,ldr-xy-normal1.png,33.5470,0.2309,0.1503,6.9749 +Khronos,12x12,ldr-xy-normal2.png,37.8631,0.4733,0.2362,17.7549 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse4.1_thorough_results.csv new file mode 100644 index 0000000..429d583 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-4.8-sse4.1_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.9044,0.1414,0.1106,9.4825 +Khronos,4x4,ldr-rgb-diffuse.png,54.9599,1.3327,1.2123,3.4597 +Khronos,4x4,ldr-rgb-emissive.png,60.9188,0.0611,0.0316,33.2269 +Khronos,4x4,ldr-rgb-metalrough.png,45.0994,0.4140,0.3719,2.8196 +Khronos,4x4,ldr-rgb-metalrough2.png,44.1518,2.5179,2.3870,1.7572 +Khronos,4x4,ldr-rgba-base.png,44.1046,0.5234,0.4757,2.2044 +Khronos,4x4,ldr-rgba-diffuse.png,44.4758,0.3666,0.3226,3.2502 +Khronos,4x4,ldr-rgba-specgloss.png,42.5749,0.6502,0.5982,1.7530 +Khronos,4x4,ldr-xy-normal1.png,46.8196,0.7432,0.6710,1.5627 +Khronos,4x4,ldr-xy-normal2.png,50.7622,1.4384,1.2278,3.4162 +Khronos,5x5,ldr-l-occlusion.png,58.0357,0.1794,0.1484,7.0659 +Khronos,5x5,ldr-rgb-diffuse.png,49.9121,1.1463,1.0273,4.0829 +Khronos,5x5,ldr-rgb-emissive.png,56.2144,0.0670,0.0365,28.7525 +Khronos,5x5,ldr-rgb-metalrough.png,40.5654,0.4224,0.3791,2.7658 +Khronos,5x5,ldr-rgb-metalrough2.png,39.6374,2.7150,2.5758,1.6284 +Khronos,5x5,ldr-rgba-base.png,39.8428,0.5571,0.5074,2.0665 +Khronos,5x5,ldr-rgba-diffuse.png,39.9543,0.4094,0.3624,2.8937 +Khronos,5x5,ldr-rgba-specgloss.png,39.0954,0.6646,0.6163,1.7015 +Khronos,5x5,ldr-xy-normal1.png,43.5257,0.9349,0.8583,1.2216 +Khronos,5x5,ldr-xy-normal2.png,48.0598,2.1512,1.9311,2.1720 +Khronos,6x6,ldr-l-occlusion.png,52.1122,0.1791,0.1471,7.1288 +Khronos,6x6,ldr-rgb-diffuse.png,45.8096,1.0537,0.9393,4.4653 +Khronos,6x6,ldr-rgb-emissive.png,52.7006,0.0748,0.0450,23.3177 +Khronos,6x6,ldr-rgb-metalrough.png,37.0909,0.4898,0.4453,2.3545 +Khronos,6x6,ldr-rgb-metalrough2.png,36.8453,3.0518,2.9162,1.4383 +Khronos,6x6,ldr-rgba-base.png,36.9420,0.6170,0.5683,1.8450 +Khronos,6x6,ldr-rgba-diffuse.png,36.7150,0.4607,0.4167,2.5165 +Khronos,6x6,ldr-rgba-specgloss.png,36.7245,0.7339,0.6817,1.5383 +Khronos,6x6,ldr-xy-normal1.png,41.1534,0.9044,0.8266,1.2686 +Khronos,6x6,ldr-xy-normal2.png,45.9258,2.1697,1.9433,2.1584 +Khronos,8x8,ldr-l-occlusion.png,46.0084,0.2277,0.1948,5.3820 +Khronos,8x8,ldr-rgb-diffuse.png,40.9086,1.3403,1.2167,3.4472 +Khronos,8x8,ldr-rgb-emissive.png,47.5382,0.0856,0.0552,19.0063 +Khronos,8x8,ldr-rgb-metalrough.png,32.8764,0.6671,0.6208,1.6890 +Khronos,8x8,ldr-rgb-metalrough2.png,33.6471,3.9970,3.8642,1.0854 +Khronos,8x8,ldr-rgba-base.png,33.3130,0.8302,0.7770,1.3496 +Khronos,8x8,ldr-rgba-diffuse.png,32.7517,0.6512,0.6038,1.7366 +Khronos,8x8,ldr-rgba-specgloss.png,33.6674,0.9768,0.9237,1.1352 +Khronos,8x8,ldr-xy-normal1.png,37.7688,0.6603,0.5846,1.7937 +Khronos,8x8,ldr-xy-normal2.png,42.5753,1.3920,1.1497,3.6483 +Khronos,12x12,ldr-l-occlusion.png,42.4252,0.2165,0.1815,5.7786 +Khronos,12x12,ldr-rgb-diffuse.png,36.6233,1.5892,1.4632,2.8665 +Khronos,12x12,ldr-rgb-emissive.png,42.3669,0.1276,0.0908,11.5492 +Khronos,12x12,ldr-rgb-metalrough.png,29.3131,0.9143,0.8596,1.2199 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7812,4.7074,4.5716,0.9175 +Khronos,12x12,ldr-rgba-base.png,29.9371,0.9672,0.9112,1.1508 +Khronos,12x12,ldr-rgba-diffuse.png,29.2718,0.8908,0.8408,1.2471 +Khronos,12x12,ldr-rgba-specgloss.png,30.7200,1.2387,1.1839,0.8857 +Khronos,12x12,ldr-xy-normal1.png,33.9704,0.6727,0.5882,1.7827 +Khronos,12x12,ldr-xy-normal2.png,38.4786,1.1110,0.8735,4.8020 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-avx2_fast_results.csv new file mode 100644 index 0000000..529de17 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-avx2_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.4655,0.0363,0.0066,158.7341 +Khronos,4x4,ldr-rgb-diffuse.png,52.6047,0.1702,0.0549,76.3530 +Khronos,4x4,ldr-rgb-emissive.png,58.5114,0.0339,0.0046,228.4462 +Khronos,4x4,ldr-rgb-metalrough.png,44.4072,0.0913,0.0469,22.3453 +Khronos,4x4,ldr-rgb-metalrough2.png,43.0366,0.4438,0.3075,13.6420 +Khronos,4x4,ldr-rgba-base.png,43.3921,0.1084,0.0604,17.3611 +Khronos,4x4,ldr-rgba-diffuse.png,43.9490,0.0866,0.0421,24.8926 +Khronos,4x4,ldr-rgba-specgloss.png,41.7913,0.1457,0.0964,10.8771 +Khronos,4x4,ldr-xy-normal1.png,45.0915,0.1451,0.0698,15.0230 +Khronos,4x4,ldr-xy-normal2.png,48.8199,0.3312,0.1026,40.8949 +Khronos,5x5,ldr-l-occlusion.png,53.1330,0.0342,0.0053,196.4291 +Khronos,5x5,ldr-rgb-diffuse.png,47.1736,0.1566,0.0416,100.7571 +Khronos,5x5,ldr-rgb-emissive.png,52.6801,0.0326,0.0037,279.8452 +Khronos,5x5,ldr-rgb-metalrough.png,39.9526,0.0783,0.0350,29.9764 +Khronos,5x5,ldr-rgb-metalrough2.png,38.0173,0.4088,0.2780,15.0876 +Khronos,5x5,ldr-rgba-base.png,38.9978,0.0877,0.0407,25.7610 +Khronos,5x5,ldr-rgba-diffuse.png,39.2047,0.0843,0.0400,26.1999 +Khronos,5x5,ldr-rgba-specgloss.png,38.4777,0.1075,0.0577,18.1704 +Khronos,5x5,ldr-xy-normal1.png,41.9962,0.1280,0.0526,19.9395 +Khronos,5x5,ldr-xy-normal2.png,46.4593,0.2976,0.0700,59.9322 +Khronos,6x6,ldr-l-occlusion.png,48.1639,0.0364,0.0064,164.5298 +Khronos,6x6,ldr-rgb-diffuse.png,43.2116,0.1727,0.0566,74.1201 +Khronos,6x6,ldr-rgb-emissive.png,49.0988,0.0336,0.0041,257.7534 +Khronos,6x6,ldr-rgb-metalrough.png,36.5677,0.0843,0.0395,26.5704 +Khronos,6x6,ldr-rgb-metalrough2.png,35.3768,0.4028,0.2708,15.4909 +Khronos,6x6,ldr-rgba-base.png,36.2160,0.0926,0.0454,23.1213 +Khronos,6x6,ldr-rgba-diffuse.png,36.1676,0.0933,0.0479,21.8808 +Khronos,6x6,ldr-rgba-specgloss.png,36.1729,0.1085,0.0594,17.6433 +Khronos,6x6,ldr-xy-normal1.png,39.7051,0.1227,0.0481,21.8027 +Khronos,6x6,ldr-xy-normal2.png,44.2607,0.3083,0.0662,63.3868 +Khronos,8x8,ldr-l-occlusion.png,43.9516,0.0366,0.0076,138.4993 +Khronos,8x8,ldr-rgb-diffuse.png,38.4381,0.1934,0.0779,53.8567 +Khronos,8x8,ldr-rgb-emissive.png,44.6783,0.0337,0.0057,182.4613 +Khronos,8x8,ldr-rgb-metalrough.png,32.3676,0.0971,0.0532,19.7001 +Khronos,8x8,ldr-rgb-metalrough2.png,32.2344,0.3691,0.2356,17.8020 +Khronos,8x8,ldr-rgba-base.png,32.4934,0.0980,0.0503,20.8339 +Khronos,8x8,ldr-rgba-diffuse.png,32.1820,0.1087,0.0627,16.7248 +Khronos,8x8,ldr-rgba-specgloss.png,32.9784,0.1087,0.0595,17.6172 +Khronos,8x8,ldr-xy-normal1.png,36.6130,0.1168,0.0412,25.4477 +Khronos,8x8,ldr-xy-normal2.png,40.8661,0.3108,0.0751,55.8220 +Khronos,12x12,ldr-l-occlusion.png,40.5731,0.0370,0.0069,151.7719 +Khronos,12x12,ldr-rgb-diffuse.png,33.3900,0.1667,0.0544,77.0627 +Khronos,12x12,ldr-rgb-emissive.png,39.4755,0.0365,0.0054,195.2605 +Khronos,12x12,ldr-rgb-metalrough.png,28.6627,0.0753,0.0313,33.5222 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2736,0.2391,0.1102,38.0436 +Khronos,12x12,ldr-rgba-base.png,29.0526,0.0884,0.0402,26.1080 +Khronos,12x12,ldr-rgba-diffuse.png,28.6387,0.0914,0.0471,22.2581 +Khronos,12x12,ldr-rgba-specgloss.png,29.8295,0.0820,0.0339,30.9323 +Khronos,12x12,ldr-xy-normal1.png,32.7835,0.1069,0.0283,37.0349 +Khronos,12x12,ldr-xy-normal2.png,36.2804,0.3021,0.0656,63.9609 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-avx2_fastest_results.csv new file mode 100644 index 0000000..c615690 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-avx2_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.3133,0.0351,0.0062,168.1725 +Khronos,4x4,ldr-rgb-diffuse.png,52.3938,0.1623,0.0477,88.0102 +Khronos,4x4,ldr-rgb-emissive.png,57.9378,0.0319,0.0040,263.2615 +Khronos,4x4,ldr-rgb-metalrough.png,43.9316,0.0719,0.0297,35.3544 +Khronos,4x4,ldr-rgb-metalrough2.png,42.7504,0.3108,0.1824,22.9926 +Khronos,4x4,ldr-rgba-base.png,42.9568,0.0820,0.0362,28.9431 +Khronos,4x4,ldr-rgba-diffuse.png,43.3443,0.0690,0.0256,40.9456 +Khronos,4x4,ldr-rgba-specgloss.png,41.4901,0.1062,0.0578,18.1408 +Khronos,4x4,ldr-xy-normal1.png,44.9523,0.1167,0.0440,23.8480 +Khronos,4x4,ldr-xy-normal2.png,48.6050,0.2981,0.0770,54.4368 +Khronos,5x5,ldr-l-occlusion.png,53.0271,0.0334,0.0054,194.0372 +Khronos,5x5,ldr-rgb-diffuse.png,47.0186,0.1493,0.0385,109.0197 +Khronos,5x5,ldr-rgb-emissive.png,52.3745,0.0314,0.0035,299.2479 +Khronos,5x5,ldr-rgb-metalrough.png,39.4729,0.0661,0.0239,43.9488 +Khronos,5x5,ldr-rgb-metalrough2.png,37.5063,0.2939,0.1714,24.4660 +Khronos,5x5,ldr-rgba-base.png,38.3701,0.0726,0.0276,38.0401 +Khronos,5x5,ldr-rgba-diffuse.png,38.5192,0.0687,0.0252,41.6746 +Khronos,5x5,ldr-rgba-specgloss.png,38.0040,0.0845,0.0368,28.4838 +Khronos,5x5,ldr-xy-normal1.png,41.5445,0.1089,0.0356,29.4562 +Khronos,5x5,ldr-xy-normal2.png,46.0830,0.2769,0.0558,75.1584 +Khronos,6x6,ldr-l-occlusion.png,48.0792,0.0349,0.0062,169.1296 +Khronos,6x6,ldr-rgb-diffuse.png,43.1602,0.1593,0.0473,88.7607 +Khronos,6x6,ldr-rgb-emissive.png,48.9938,0.0311,0.0037,283.0874 +Khronos,6x6,ldr-rgb-metalrough.png,36.3829,0.0691,0.0268,39.1014 +Khronos,6x6,ldr-rgb-metalrough2.png,35.1849,0.2816,0.1601,26.2049 +Khronos,6x6,ldr-rgba-base.png,36.0449,0.0741,0.0292,35.9089 +Khronos,6x6,ldr-rgba-diffuse.png,35.9749,0.0732,0.0290,36.1378 +Khronos,6x6,ldr-rgba-specgloss.png,35.9511,0.0836,0.0369,28.3844 +Khronos,6x6,ldr-xy-normal1.png,39.2898,0.1066,0.0328,31.9677 +Khronos,6x6,ldr-xy-normal2.png,43.9097,0.2776,0.0523,80.2355 +Khronos,8x8,ldr-l-occlusion.png,43.4566,0.0357,0.0067,157.5852 +Khronos,8x8,ldr-rgb-diffuse.png,38.3134,0.1678,0.0579,72.4444 +Khronos,8x8,ldr-rgb-emissive.png,44.2810,0.0323,0.0046,227.5597 +Khronos,8x8,ldr-rgb-metalrough.png,32.2883,0.0793,0.0362,28.9597 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1325,0.2799,0.1608,26.0799 +Khronos,8x8,ldr-rgba-base.png,32.3687,0.0808,0.0353,29.6981 +Khronos,8x8,ldr-rgba-diffuse.png,32.0675,0.0863,0.0431,24.3493 +Khronos,8x8,ldr-rgba-specgloss.png,32.8798,0.0893,0.0418,25.0622 +Khronos,8x8,ldr-xy-normal1.png,36.3881,0.1045,0.0305,34.3447 +Khronos,8x8,ldr-xy-normal2.png,40.4360,0.2860,0.0595,70.5007 +Khronos,12x12,ldr-l-occlusion.png,40.2064,0.0360,0.0060,175.2280 +Khronos,12x12,ldr-rgb-diffuse.png,33.3391,0.1543,0.0434,96.5627 +Khronos,12x12,ldr-rgb-emissive.png,39.2909,0.0334,0.0044,235.7443 +Khronos,12x12,ldr-rgb-metalrough.png,28.6145,0.0673,0.0226,46.4179 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1853,0.2029,0.0793,52.8681 +Khronos,12x12,ldr-rgba-base.png,28.9945,0.0759,0.0286,36.7033 +Khronos,12x12,ldr-rgba-diffuse.png,28.5837,0.0767,0.0327,32.0518 +Khronos,12x12,ldr-rgba-specgloss.png,29.7824,0.0737,0.0249,42.1450 +Khronos,12x12,ldr-xy-normal1.png,32.6391,0.0978,0.0210,49.8583 +Khronos,12x12,ldr-xy-normal2.png,36.0570,0.2777,0.0512,81.8512 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-avx2_medium_results.csv new file mode 100644 index 0000000..5435659 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-avx2_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,62.6517,0.0478,0.0181,57.9774 +Khronos,4x4,ldr-rgb-diffuse.png,54.0238,0.2844,0.1719,24.4010 +Khronos,4x4,ldr-rgb-emissive.png,59.8933,0.0403,0.0113,92.7291 +Khronos,4x4,ldr-rgb-metalrough.png,44.9615,0.1822,0.1390,7.5425 +Khronos,4x4,ldr-rgb-metalrough2.png,43.8694,1.0930,0.9637,4.3524 +Khronos,4x4,ldr-rgba-base.png,43.9049,0.2249,0.1792,5.8511 +Khronos,4x4,ldr-rgba-diffuse.png,44.2752,0.1642,0.1197,8.7589 +Khronos,4x4,ldr-rgba-specgloss.png,42.4078,0.2992,0.2532,4.1413 +Khronos,4x4,ldr-xy-normal1.png,46.6452,0.2877,0.2171,4.8297 +Khronos,4x4,ldr-xy-normal2.png,50.4050,0.5939,0.3811,11.0070 +Khronos,5x5,ldr-l-occlusion.png,56.2869,0.0462,0.0167,62.7324 +Khronos,5x5,ldr-rgb-diffuse.png,49.0482,0.2643,0.1516,27.6620 +Khronos,5x5,ldr-rgb-emissive.png,55.4920,0.0395,0.0111,94.1443 +Khronos,5x5,ldr-rgb-metalrough.png,40.3595,0.1646,0.1220,8.5931 +Khronos,5x5,ldr-rgb-metalrough2.png,39.1705,1.0752,0.9499,4.4155 +Khronos,5x5,ldr-rgba-base.png,39.5058,0.2095,0.1638,6.4032 +Khronos,5x5,ldr-rgba-diffuse.png,39.6232,0.1653,0.1250,8.3916 +Khronos,5x5,ldr-rgba-specgloss.png,38.8340,0.2654,0.2184,4.8012 +Khronos,5x5,ldr-xy-normal1.png,43.1905,0.2467,0.1738,6.0318 +Khronos,5x5,ldr-xy-normal2.png,47.4075,0.5076,0.2880,14.5643 +Khronos,6x6,ldr-l-occlusion.png,50.5839,0.0481,0.0191,54.8481 +Khronos,6x6,ldr-rgb-diffuse.png,44.8590,0.2661,0.1552,27.0168 +Khronos,6x6,ldr-rgb-emissive.png,51.5485,0.0405,0.0122,85.9279 +Khronos,6x6,ldr-rgb-metalrough.png,36.8962,0.1642,0.1222,8.5823 +Khronos,6x6,ldr-rgb-metalrough2.png,36.5272,1.0083,0.8854,4.7370 +Khronos,6x6,ldr-rgba-base.png,36.7231,0.1895,0.1439,7.2865 +Khronos,6x6,ldr-rgba-diffuse.png,36.5382,0.1733,0.1300,8.0653 +Khronos,6x6,ldr-rgba-specgloss.png,36.5345,0.2548,0.2068,5.0702 +Khronos,6x6,ldr-xy-normal1.png,40.7063,0.2115,0.1378,7.6076 +Khronos,6x6,ldr-xy-normal2.png,45.3252,0.3801,0.1562,26.8483 +Khronos,8x8,ldr-l-occlusion.png,45.3897,0.0562,0.0270,38.8864 +Khronos,8x8,ldr-rgb-diffuse.png,40.2564,0.3512,0.2404,17.4496 +Khronos,8x8,ldr-rgb-emissive.png,46.6777,0.0468,0.0170,61.7426 +Khronos,8x8,ldr-rgb-metalrough.png,32.7159,0.2114,0.1681,6.2385 +Khronos,8x8,ldr-rgb-metalrough2.png,33.2510,1.1527,1.0242,4.0951 +Khronos,8x8,ldr-rgba-base.png,33.1143,0.2174,0.1711,6.1273 +Khronos,8x8,ldr-rgba-diffuse.png,32.5994,0.2242,0.1806,5.8076 +Khronos,8x8,ldr-rgba-specgloss.png,33.5064,0.2866,0.2379,4.4069 +Khronos,8x8,ldr-xy-normal1.png,37.4841,0.2232,0.1470,7.1355 +Khronos,8x8,ldr-xy-normal2.png,42.1725,0.4010,0.1714,24.4723 +Khronos,12x12,ldr-l-occlusion.png,41.6127,0.0492,0.0155,67.7196 +Khronos,12x12,ldr-rgb-diffuse.png,35.7805,0.3570,0.2433,17.2358 +Khronos,12x12,ldr-rgb-emissive.png,41.4057,0.0529,0.0193,54.3808 +Khronos,12x12,ldr-rgb-metalrough.png,29.1351,0.2029,0.1531,6.8488 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1839,0.8268,0.6924,6.0577 +Khronos,12x12,ldr-rgba-base.png,29.6573,0.2054,0.1562,6.7140 +Khronos,12x12,ldr-rgba-diffuse.png,29.0864,0.2517,0.2063,5.0839 +Khronos,12x12,ldr-rgba-specgloss.png,30.4978,0.2333,0.1844,5.6870 +Khronos,12x12,ldr-xy-normal1.png,33.5558,0.1921,0.1147,9.1397 +Khronos,12x12,ldr-xy-normal2.png,37.8709,0.4087,0.1767,23.7311 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-avx2_thorough_results.csv new file mode 100644 index 0000000..4d763cc --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-avx2_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.8996,0.1345,0.1039,10.0922 +Khronos,4x4,ldr-rgb-diffuse.png,54.9603,1.2494,1.1249,3.7288 +Khronos,4x4,ldr-rgb-emissive.png,60.9181,0.0595,0.0296,35.4595 +Khronos,4x4,ldr-rgb-metalrough.png,45.0987,0.3871,0.3418,3.0677 +Khronos,4x4,ldr-rgb-metalrough2.png,44.1518,2.3320,2.1922,1.9133 +Khronos,4x4,ldr-rgba-base.png,44.1046,0.4878,0.4387,2.3903 +Khronos,4x4,ldr-rgba-diffuse.png,44.4761,0.3414,0.2965,3.5366 +Khronos,4x4,ldr-rgba-specgloss.png,42.5739,0.5801,0.5325,1.9691 +Khronos,4x4,ldr-xy-normal1.png,46.8144,0.6789,0.6062,1.7298 +Khronos,4x4,ldr-xy-normal2.png,50.7588,1.2949,1.0839,3.8695 +Khronos,5x5,ldr-l-occlusion.png,58.0363,0.1569,0.1278,8.2075 +Khronos,5x5,ldr-rgb-diffuse.png,49.9112,0.9936,0.8729,4.8050 +Khronos,5x5,ldr-rgb-emissive.png,56.2124,0.0611,0.0323,32.4445 +Khronos,5x5,ldr-rgb-metalrough.png,40.5635,0.3823,0.3365,3.1163 +Khronos,5x5,ldr-rgb-metalrough2.png,39.6371,2.3425,2.2101,1.8978 +Khronos,5x5,ldr-rgba-base.png,39.8413,0.4829,0.4362,2.4041 +Khronos,5x5,ldr-rgba-diffuse.png,39.9539,0.3548,0.3098,3.3850 +Khronos,5x5,ldr-rgba-specgloss.png,39.0948,0.5810,0.5303,1.9774 +Khronos,5x5,ldr-xy-normal1.png,43.5133,0.8333,0.7602,1.3794 +Khronos,5x5,ldr-xy-normal2.png,48.0600,1.8731,1.6531,2.5373 +Khronos,6x6,ldr-l-occlusion.png,52.1065,0.1519,0.1231,8.5163 +Khronos,6x6,ldr-rgb-diffuse.png,45.8078,0.8843,0.7675,5.4648 +Khronos,6x6,ldr-rgb-emissive.png,52.6977,0.0672,0.0375,27.9292 +Khronos,6x6,ldr-rgb-metalrough.png,37.0882,0.4133,0.3687,2.8442 +Khronos,6x6,ldr-rgb-metalrough2.png,36.8454,2.5636,2.4275,1.7278 +Khronos,6x6,ldr-rgba-base.png,36.9415,0.5318,0.4850,2.1620 +Khronos,6x6,ldr-rgba-diffuse.png,36.7141,0.3895,0.3444,3.0445 +Khronos,6x6,ldr-rgba-specgloss.png,36.7244,0.6194,0.5693,1.8417 +Khronos,6x6,ldr-xy-normal1.png,41.1425,0.7653,0.6908,1.5179 +Khronos,6x6,ldr-xy-normal2.png,45.9242,1.8446,1.6180,2.5923 +Khronos,8x8,ldr-l-occlusion.png,46.0106,0.1870,0.1550,6.7642 +Khronos,8x8,ldr-rgb-diffuse.png,40.9093,1.0528,0.9379,4.4718 +Khronos,8x8,ldr-rgb-emissive.png,47.5346,0.0730,0.0432,24.2872 +Khronos,8x8,ldr-rgb-metalrough.png,32.8726,0.5342,0.4884,2.1469 +Khronos,8x8,ldr-rgb-metalrough2.png,33.6451,3.1912,3.0599,1.3707 +Khronos,8x8,ldr-rgba-base.png,33.3164,0.6698,0.6195,1.6925 +Khronos,8x8,ldr-rgba-diffuse.png,32.7505,0.5251,0.4783,2.1922 +Khronos,8x8,ldr-rgba-specgloss.png,33.6663,0.7860,0.7368,1.4232 +Khronos,8x8,ldr-xy-normal1.png,37.7905,0.5372,0.4601,2.2789 +Khronos,8x8,ldr-xy-normal2.png,42.5889,1.1077,0.8736,4.8010 +Khronos,12x12,ldr-l-occlusion.png,42.4176,0.1704,0.1361,7.7039 +Khronos,12x12,ldr-rgb-diffuse.png,36.6277,1.2489,1.1251,3.7280 +Khronos,12x12,ldr-rgb-emissive.png,42.3626,0.1034,0.0690,15.1987 +Khronos,12x12,ldr-rgb-metalrough.png,29.3167,0.7102,0.6633,1.5809 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7816,3.7204,3.5870,1.1693 +Khronos,12x12,ldr-rgba-base.png,29.9428,0.7667,0.7130,1.4707 +Khronos,12x12,ldr-rgba-diffuse.png,29.2728,0.7162,0.6668,1.5725 +Khronos,12x12,ldr-rgba-specgloss.png,30.7230,0.9943,0.9393,1.1164 +Khronos,12x12,ldr-xy-normal1.png,33.9744,0.5382,0.4582,2.2885 +Khronos,12x12,ldr-xy-normal2.png,38.4839,0.9021,0.6691,6.2684 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse2_fast_results.csv new file mode 100644 index 0000000..c3f8ff2 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse2_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.4655,0.0380,0.0098,107.3925 +Khronos,4x4,ldr-rgb-diffuse.png,52.6047,0.2043,0.0812,51.6304 +Khronos,4x4,ldr-rgb-emissive.png,58.5114,0.0321,0.0054,193.6101 +Khronos,4x4,ldr-rgb-metalrough.png,44.4072,0.1032,0.0615,17.0386 +Khronos,4x4,ldr-rgb-metalrough2.png,43.0366,0.5298,0.3915,10.7148 +Khronos,4x4,ldr-rgba-base.png,43.3921,0.1234,0.0772,13.5778 +Khronos,4x4,ldr-rgba-diffuse.png,43.9490,0.0986,0.0551,19.0404 +Khronos,4x4,ldr-rgba-specgloss.png,41.7913,0.1723,0.1242,8.4451 +Khronos,4x4,ldr-xy-normal1.png,45.0915,0.1658,0.0918,11.4284 +Khronos,4x4,ldr-xy-normal2.png,48.8199,0.3719,0.1402,29.9144 +Khronos,5x5,ldr-l-occlusion.png,53.1330,0.0353,0.0073,144.5917 +Khronos,5x5,ldr-rgb-diffuse.png,47.1736,0.1838,0.0583,71.9905 +Khronos,5x5,ldr-rgb-emissive.png,52.6801,0.0313,0.0045,232.7994 +Khronos,5x5,ldr-rgb-metalrough.png,39.9526,0.0906,0.0484,21.6768 +Khronos,5x5,ldr-rgb-metalrough2.png,38.0173,0.5212,0.3836,10.9337 +Khronos,5x5,ldr-rgba-base.png,38.9978,0.1033,0.0571,18.3484 +Khronos,5x5,ldr-rgba-diffuse.png,39.2047,0.0988,0.0549,19.1046 +Khronos,5x5,ldr-rgba-specgloss.png,38.4777,0.1275,0.0795,13.1945 +Khronos,5x5,ldr-xy-normal1.png,41.9962,0.1455,0.0719,14.5743 +Khronos,5x5,ldr-xy-normal2.png,46.4593,0.3227,0.0931,45.0749 +Khronos,6x6,ldr-l-occlusion.png,48.1639,0.0376,0.0093,112.1607 +Khronos,6x6,ldr-rgb-diffuse.png,43.2116,0.2079,0.0848,49.4588 +Khronos,6x6,ldr-rgb-emissive.png,49.0988,0.0328,0.0057,183.2596 +Khronos,6x6,ldr-rgb-metalrough.png,36.5677,0.1018,0.0587,17.8733 +Khronos,6x6,ldr-rgb-metalrough2.png,35.3768,0.5251,0.3902,10.7478 +Khronos,6x6,ldr-rgba-base.png,36.2160,0.1122,0.0659,15.9213 +Khronos,6x6,ldr-rgba-diffuse.png,36.1676,0.1131,0.0697,15.0515 +Khronos,6x6,ldr-rgba-specgloss.png,36.1729,0.1352,0.0873,12.0055 +Khronos,6x6,ldr-xy-normal1.png,39.7051,0.1431,0.0680,15.4295 +Khronos,6x6,ldr-xy-normal2.png,44.2607,0.3287,0.0924,45.4130 +Khronos,8x8,ldr-l-occlusion.png,43.9516,0.0391,0.0112,93.4661 +Khronos,8x8,ldr-rgb-diffuse.png,38.4381,0.2361,0.1134,36.9979 +Khronos,8x8,ldr-rgb-emissive.png,44.6783,0.0355,0.0089,118.2811 +Khronos,8x8,ldr-rgb-metalrough.png,32.3676,0.1203,0.0783,13.3872 +Khronos,8x8,ldr-rgb-metalrough2.png,32.2344,0.4875,0.3521,11.9135 +Khronos,8x8,ldr-rgba-base.png,32.4934,0.1208,0.0741,14.1552 +Khronos,8x8,ldr-rgba-diffuse.png,32.1820,0.1382,0.0951,11.0286 +Khronos,8x8,ldr-rgba-specgloss.png,32.9784,0.1385,0.0895,11.7172 +Khronos,8x8,ldr-xy-normal1.png,36.6130,0.1382,0.0613,17.0998 +Khronos,8x8,ldr-xy-normal2.png,40.8661,0.3426,0.1076,38.9848 +Khronos,12x12,ldr-l-occlusion.png,40.5731,0.0401,0.0104,101.0372 +Khronos,12x12,ldr-rgb-diffuse.png,33.3900,0.2042,0.0809,51.8347 +Khronos,12x12,ldr-rgb-emissive.png,39.4755,0.0361,0.0081,129.9352 +Khronos,12x12,ldr-rgb-metalrough.png,28.6627,0.0879,0.0445,23.5407 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2736,0.2927,0.1605,26.1355 +Khronos,12x12,ldr-rgba-base.png,29.0526,0.1063,0.0584,17.9535 +Khronos,12x12,ldr-rgba-diffuse.png,28.6387,0.1130,0.0686,15.2959 +Khronos,12x12,ldr-rgba-specgloss.png,29.8295,0.0980,0.0494,21.2203 +Khronos,12x12,ldr-xy-normal1.png,32.7835,0.1180,0.0409,25.6338 +Khronos,12x12,ldr-xy-normal2.png,36.2804,0.3321,0.0946,44.3288 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse2_fastest_results.csv new file mode 100644 index 0000000..0f4e6c0 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse2_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.3133,0.0365,0.0087,120.4845 +Khronos,4x4,ldr-rgb-diffuse.png,52.3938,0.1928,0.0699,59.9965 +Khronos,4x4,ldr-rgb-emissive.png,57.9378,0.0308,0.0046,226.6217 +Khronos,4x4,ldr-rgb-metalrough.png,43.9316,0.0827,0.0407,25.7806 +Khronos,4x4,ldr-rgb-metalrough2.png,42.7504,0.3864,0.2474,16.9530 +Khronos,4x4,ldr-rgba-base.png,42.9568,0.0951,0.0494,21.2270 +Khronos,4x4,ldr-rgba-diffuse.png,43.3443,0.0785,0.0352,29.7739 +Khronos,4x4,ldr-rgba-specgloss.png,41.4901,0.1264,0.0787,13.3196 +Khronos,4x4,ldr-xy-normal1.png,44.9523,0.1295,0.0590,17.7722 +Khronos,4x4,ldr-xy-normal2.png,48.6050,0.3387,0.1075,38.9990 +Khronos,5x5,ldr-l-occlusion.png,53.0271,0.0349,0.0072,145.1692 +Khronos,5x5,ldr-rgb-diffuse.png,47.0186,0.1746,0.0545,76.8990 +Khronos,5x5,ldr-rgb-emissive.png,52.3745,0.0308,0.0043,243.1741 +Khronos,5x5,ldr-rgb-metalrough.png,39.4729,0.0753,0.0345,30.3531 +Khronos,5x5,ldr-rgb-metalrough2.png,37.5063,0.3868,0.2502,16.7671 +Khronos,5x5,ldr-rgba-base.png,38.3701,0.0839,0.0399,26.2973 +Khronos,5x5,ldr-rgba-diffuse.png,38.5192,0.0799,0.0360,29.0899 +Khronos,5x5,ldr-rgba-specgloss.png,38.0040,0.1007,0.0539,19.4646 +Khronos,5x5,ldr-xy-normal1.png,41.5445,0.1213,0.0494,21.2224 +Khronos,5x5,ldr-xy-normal2.png,46.0830,0.3091,0.0785,53.4012 +Khronos,6x6,ldr-l-occlusion.png,48.0792,0.0369,0.0085,123.8572 +Khronos,6x6,ldr-rgb-diffuse.png,43.1602,0.1933,0.0732,57.3172 +Khronos,6x6,ldr-rgb-emissive.png,48.9938,0.0311,0.0044,237.0148 +Khronos,6x6,ldr-rgb-metalrough.png,36.3829,0.0837,0.0419,25.0413 +Khronos,6x6,ldr-rgb-metalrough2.png,35.1849,0.3830,0.2471,16.9727 +Khronos,6x6,ldr-rgba-base.png,36.0449,0.0897,0.0449,23.3339 +Khronos,6x6,ldr-rgba-diffuse.png,35.9749,0.0879,0.0449,23.3504 +Khronos,6x6,ldr-rgba-specgloss.png,35.9511,0.1040,0.0575,18.2361 +Khronos,6x6,ldr-xy-normal1.png,39.2898,0.1214,0.0483,21.6930 +Khronos,6x6,ldr-xy-normal2.png,43.9097,0.3109,0.0760,55.2239 +Khronos,8x8,ldr-l-occlusion.png,43.4566,0.0378,0.0095,110.2019 +Khronos,8x8,ldr-rgb-diffuse.png,38.3134,0.2099,0.0907,46.2487 +Khronos,8x8,ldr-rgb-emissive.png,44.2810,0.0336,0.0067,155.6390 +Khronos,8x8,ldr-rgb-metalrough.png,32.2883,0.0979,0.0564,18.5888 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1325,0.3850,0.2525,16.6137 +Khronos,8x8,ldr-rgba-base.png,32.3687,0.0997,0.0538,19.5000 +Khronos,8x8,ldr-rgba-diffuse.png,32.0675,0.1103,0.0669,15.6647 +Khronos,8x8,ldr-rgba-specgloss.png,32.8798,0.1124,0.0650,16.1292 +Khronos,8x8,ldr-xy-normal1.png,36.3881,0.1196,0.0463,22.6381 +Khronos,8x8,ldr-xy-normal2.png,40.4360,0.3215,0.0894,46.8941 +Khronos,12x12,ldr-l-occlusion.png,40.2064,0.0375,0.0085,123.2775 +Khronos,12x12,ldr-rgb-diffuse.png,33.3391,0.1846,0.0663,63.2719 +Khronos,12x12,ldr-rgb-emissive.png,39.2909,0.0338,0.0064,162.7700 +Khronos,12x12,ldr-rgb-metalrough.png,28.6145,0.0766,0.0335,31.2961 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1853,0.2534,0.1206,34.7752 +Khronos,12x12,ldr-rgba-base.png,28.9945,0.0889,0.0428,24.5079 +Khronos,12x12,ldr-rgba-diffuse.png,28.5837,0.0923,0.0490,21.3995 +Khronos,12x12,ldr-rgba-specgloss.png,29.7824,0.0857,0.0369,28.4352 +Khronos,12x12,ldr-xy-normal1.png,32.6391,0.1058,0.0308,34.0006 +Khronos,12x12,ldr-xy-normal2.png,36.0570,0.3177,0.0759,55.2866 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse2_medium_results.csv new file mode 100644 index 0000000..957e45f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse2_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,62.6517,0.0534,0.0257,40.7547 +Khronos,4x4,ldr-rgb-diffuse.png,54.0238,0.3734,0.2456,17.0785 +Khronos,4x4,ldr-rgb-emissive.png,59.8933,0.0411,0.0144,72.5906 +Khronos,4x4,ldr-rgb-metalrough.png,44.9615,0.2358,0.1931,5.4303 +Khronos,4x4,ldr-rgb-metalrough2.png,43.8694,1.4572,1.3160,3.1872 +Khronos,4x4,ldr-rgba-base.png,43.9049,0.2927,0.2479,4.2297 +Khronos,4x4,ldr-rgba-diffuse.png,44.2752,0.2039,0.1610,6.5135 +Khronos,4x4,ldr-rgba-specgloss.png,42.4078,0.3946,0.3453,3.0366 +Khronos,4x4,ldr-xy-normal1.png,46.6452,0.3624,0.2912,3.6009 +Khronos,4x4,ldr-xy-normal2.png,50.4050,0.7447,0.5251,7.9877 +Khronos,5x5,ldr-l-occlusion.png,56.2869,0.0532,0.0251,41.8344 +Khronos,5x5,ldr-rgb-diffuse.png,49.0482,0.3484,0.2271,18.4653 +Khronos,5x5,ldr-rgb-emissive.png,55.4920,0.0428,0.0158,66.5645 +Khronos,5x5,ldr-rgb-metalrough.png,40.3595,0.2228,0.1799,5.8281 +Khronos,5x5,ldr-rgb-metalrough2.png,39.1705,1.5364,1.3991,2.9979 +Khronos,5x5,ldr-rgba-base.png,39.5058,0.2888,0.2412,4.3474 +Khronos,5x5,ldr-rgba-diffuse.png,39.6232,0.2251,0.1822,5.7539 +Khronos,5x5,ldr-rgba-specgloss.png,38.8340,0.3653,0.3174,3.3039 +Khronos,5x5,ldr-xy-normal1.png,43.1905,0.3331,0.2590,4.0490 +Khronos,5x5,ldr-xy-normal2.png,47.4075,0.6561,0.4268,9.8265 +Khronos,6x6,ldr-l-occlusion.png,50.5839,0.0580,0.0297,35.3305 +Khronos,6x6,ldr-rgb-diffuse.png,44.8590,0.3670,0.2465,17.0161 +Khronos,6x6,ldr-rgb-emissive.png,51.5485,0.0450,0.0181,58.0769 +Khronos,6x6,ldr-rgb-metalrough.png,36.8962,0.2291,0.1864,5.6242 +Khronos,6x6,ldr-rgb-metalrough2.png,36.5272,1.4757,1.3398,3.1306 +Khronos,6x6,ldr-rgba-base.png,36.7231,0.2744,0.2280,4.5999 +Khronos,6x6,ldr-rgba-diffuse.png,36.5382,0.2428,0.1979,5.2974 +Khronos,6x6,ldr-rgba-specgloss.png,36.5345,0.3589,0.3106,3.3760 +Khronos,6x6,ldr-xy-normal1.png,40.7063,0.2848,0.2094,5.0083 +Khronos,6x6,ldr-xy-normal2.png,45.3252,0.4693,0.2387,17.5748 +Khronos,8x8,ldr-l-occlusion.png,45.3897,0.0729,0.0428,24.4755 +Khronos,8x8,ldr-rgb-diffuse.png,40.2564,0.5149,0.3930,10.6730 +Khronos,8x8,ldr-rgb-emissive.png,46.6777,0.0540,0.0265,39.6331 +Khronos,8x8,ldr-rgb-metalrough.png,32.7159,0.3074,0.2624,3.9959 +Khronos,8x8,ldr-rgb-metalrough2.png,33.2510,1.7120,1.5780,2.6580 +Khronos,8x8,ldr-rgba-base.png,33.1143,0.3144,0.2677,3.9165 +Khronos,8x8,ldr-rgba-diffuse.png,32.5994,0.3284,0.2835,3.6984 +Khronos,8x8,ldr-rgba-specgloss.png,33.5064,0.4200,0.3709,2.8273 +Khronos,8x8,ldr-xy-normal1.png,37.4841,0.3056,0.2266,4.6284 +Khronos,8x8,ldr-xy-normal2.png,42.1725,0.5156,0.2723,15.4039 +Khronos,12x12,ldr-l-occlusion.png,41.6127,0.0564,0.0233,44.9129 +Khronos,12x12,ldr-rgb-diffuse.png,35.7805,0.5055,0.3811,11.0056 +Khronos,12x12,ldr-rgb-emissive.png,41.4057,0.0581,0.0289,36.3367 +Khronos,12x12,ldr-rgb-metalrough.png,29.1351,0.2830,0.2366,4.4316 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1839,1.1942,1.0543,3.9782 +Khronos,12x12,ldr-rgba-base.png,29.6573,0.2848,0.2385,4.3966 +Khronos,12x12,ldr-rgba-diffuse.png,29.0864,0.3544,0.3078,3.4062 +Khronos,12x12,ldr-rgba-specgloss.png,30.4978,0.3329,0.2799,3.7468 +Khronos,12x12,ldr-xy-normal1.png,33.5558,0.2520,0.1728,6.0691 +Khronos,12x12,ldr-xy-normal2.png,37.8709,0.5093,0.2677,15.6655 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse2_thorough_results.csv new file mode 100644 index 0000000..bebb675 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse2_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.8996,0.1610,0.1330,7.8823 +Khronos,4x4,ldr-rgb-diffuse.png,54.9603,1.5766,1.4529,2.8869 +Khronos,4x4,ldr-rgb-emissive.png,60.9181,0.0638,0.0380,27.6101 +Khronos,4x4,ldr-rgb-metalrough.png,45.0987,0.4894,0.4478,2.3415 +Khronos,4x4,ldr-rgb-metalrough2.png,44.1518,3.0004,2.8646,1.4642 +Khronos,4x4,ldr-rgba-base.png,44.1046,0.6133,0.5672,1.8487 +Khronos,4x4,ldr-rgba-diffuse.png,44.4761,0.4276,0.3838,2.7320 +Khronos,4x4,ldr-rgba-specgloss.png,42.5739,0.7617,0.7119,1.4730 +Khronos,4x4,ldr-xy-normal1.png,46.8144,0.8593,0.7873,1.3319 +Khronos,4x4,ldr-xy-normal2.png,50.7588,1.6602,1.4476,2.8974 +Khronos,5x5,ldr-l-occlusion.png,58.0363,0.2133,0.1845,5.6835 +Khronos,5x5,ldr-rgb-diffuse.png,49.9112,1.3894,1.2619,3.3238 +Khronos,5x5,ldr-rgb-emissive.png,56.2124,0.0725,0.0455,23.0583 +Khronos,5x5,ldr-rgb-metalrough.png,40.5635,0.5107,0.4667,2.2470 +Khronos,5x5,ldr-rgb-metalrough2.png,39.6371,3.3007,3.1606,1.3270 +Khronos,5x5,ldr-rgba-base.png,39.8413,0.6657,0.6203,1.6905 +Khronos,5x5,ldr-rgba-diffuse.png,39.9539,0.4843,0.4405,2.3805 +Khronos,5x5,ldr-rgba-specgloss.png,39.0948,0.7911,0.7444,1.4087 +Khronos,5x5,ldr-xy-normal1.png,43.5133,1.1031,1.0289,1.0191 +Khronos,5x5,ldr-xy-normal2.png,48.0600,2.5543,2.3320,1.7986 +Khronos,6x6,ldr-l-occlusion.png,52.1065,0.2126,0.1840,5.6992 +Khronos,6x6,ldr-rgb-diffuse.png,45.8078,1.2811,1.1570,3.6251 +Khronos,6x6,ldr-rgb-emissive.png,52.6977,0.0820,0.0555,18.9045 +Khronos,6x6,ldr-rgb-metalrough.png,37.0882,0.5826,0.5404,1.9402 +Khronos,6x6,ldr-rgb-metalrough2.png,36.8454,3.6549,3.5149,1.1933 +Khronos,6x6,ldr-rgba-base.png,36.9415,0.7326,0.6846,1.5316 +Khronos,6x6,ldr-rgba-diffuse.png,36.7141,0.5501,0.5060,2.0722 +Khronos,6x6,ldr-rgba-specgloss.png,36.7244,0.8619,0.8128,1.2901 +Khronos,6x6,ldr-xy-normal1.png,41.1425,1.0732,0.9973,1.0514 +Khronos,6x6,ldr-xy-normal2.png,45.9242,2.5763,2.3473,1.7869 +Khronos,8x8,ldr-l-occlusion.png,46.0106,0.2712,0.2389,4.3891 +Khronos,8x8,ldr-rgb-diffuse.png,40.9093,1.5670,1.4428,2.9070 +Khronos,8x8,ldr-rgb-emissive.png,47.5346,0.0942,0.0656,15.9741 +Khronos,8x8,ldr-rgb-metalrough.png,32.8726,0.7779,0.7334,1.4298 +Khronos,8x8,ldr-rgb-metalrough2.png,33.6451,4.6643,4.5246,0.9270 +Khronos,8x8,ldr-rgba-base.png,33.3164,0.9580,0.9100,1.1523 +Khronos,8x8,ldr-rgba-diffuse.png,32.7505,0.7531,0.7089,1.4792 +Khronos,8x8,ldr-rgba-specgloss.png,33.6663,1.1323,1.0817,0.9694 +Khronos,8x8,ldr-xy-normal1.png,37.7905,0.7732,0.6937,1.5115 +Khronos,8x8,ldr-xy-normal2.png,42.5889,1.6107,1.3728,3.0552 +Khronos,12x12,ldr-l-occlusion.png,42.4176,0.2384,0.2045,5.1282 +Khronos,12x12,ldr-rgb-diffuse.png,36.6277,1.7717,1.6461,2.5481 +Khronos,12x12,ldr-rgb-emissive.png,42.3626,0.1382,0.1018,10.2986 +Khronos,12x12,ldr-rgb-metalrough.png,29.3167,1.0104,0.9632,1.0886 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7816,5.2839,5.1404,0.8159 +Khronos,12x12,ldr-rgba-base.png,29.9428,1.0768,1.0226,1.0254 +Khronos,12x12,ldr-rgba-diffuse.png,29.2728,0.9992,0.9493,1.1046 +Khronos,12x12,ldr-rgba-specgloss.png,30.7230,1.3859,1.3317,0.7874 +Khronos,12x12,ldr-xy-normal1.png,33.9744,0.7365,0.6579,1.5937 +Khronos,12x12,ldr-xy-normal2.png,38.4839,1.2277,0.9860,4.2536 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse4.1_fast_results.csv new file mode 100644 index 0000000..096a883 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse4.1_fast_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.4655,0.0365,0.0080,131.0385 +Khronos,4x4,ldr-rgb-diffuse.png,52.6047,0.2078,0.0813,51.5803 +Khronos,4x4,ldr-rgb-emissive.png,58.5114,0.0323,0.0052,203.4908 +Khronos,4x4,ldr-rgb-metalrough.png,44.4072,0.1069,0.0628,16.7091 +Khronos,4x4,ldr-rgb-metalrough2.png,43.0366,0.4857,0.3413,12.2878 +Khronos,4x4,ldr-rgba-base.png,43.3921,0.1117,0.0649,16.1461 +Khronos,4x4,ldr-rgba-diffuse.png,43.9490,0.0910,0.0467,22.4703 +Khronos,4x4,ldr-rgba-specgloss.png,41.7913,0.1558,0.1072,9.7780 +Khronos,4x4,ldr-xy-normal1.png,45.0915,0.1493,0.0762,13.7646 +Khronos,4x4,ldr-xy-normal2.png,48.8199,0.3468,0.1176,35.6601 +Khronos,5x5,ldr-l-occlusion.png,53.1330,0.0334,0.0058,179.4608 +Khronos,5x5,ldr-rgb-diffuse.png,47.1736,0.1650,0.0502,83.4785 +Khronos,5x5,ldr-rgb-emissive.png,52.6801,0.0318,0.0038,272.9163 +Khronos,5x5,ldr-rgb-metalrough.png,39.9526,0.0837,0.0402,26.0659 +Khronos,5x5,ldr-rgb-metalrough2.png,38.0173,0.4560,0.3248,12.9141 +Khronos,5x5,ldr-rgba-base.png,38.9978,0.0938,0.0478,21.9390 +Khronos,5x5,ldr-rgba-diffuse.png,39.2047,0.0890,0.0457,22.9532 +Khronos,5x5,ldr-rgba-specgloss.png,38.4777,0.1139,0.0663,15.8070 +Khronos,5x5,ldr-xy-normal1.png,41.9962,0.1346,0.0601,17.4504 +Khronos,5x5,ldr-xy-normal2.png,46.4593,0.3135,0.0798,52.5438 +Khronos,6x6,ldr-l-occlusion.png,48.1639,0.0369,0.0075,139.5674 +Khronos,6x6,ldr-rgb-diffuse.png,43.2116,0.1886,0.0711,58.9709 +Khronos,6x6,ldr-rgb-emissive.png,49.0988,0.0317,0.0043,243.0666 +Khronos,6x6,ldr-rgb-metalrough.png,36.5677,0.0896,0.0484,21.6518 +Khronos,6x6,ldr-rgb-metalrough2.png,35.3768,0.4677,0.3294,12.7322 +Khronos,6x6,ldr-rgba-base.png,36.2160,0.1006,0.0546,19.2085 +Khronos,6x6,ldr-rgba-diffuse.png,36.1676,0.1007,0.0580,18.0882 +Khronos,6x6,ldr-rgba-specgloss.png,36.1729,0.1197,0.0719,14.5861 +Khronos,6x6,ldr-xy-normal1.png,39.7051,0.1317,0.0575,18.2316 +Khronos,6x6,ldr-xy-normal2.png,44.2607,0.3143,0.0795,52.7765 +Khronos,8x8,ldr-l-occlusion.png,43.9516,0.0372,0.0089,118.0050 +Khronos,8x8,ldr-rgb-diffuse.png,38.4381,0.2122,0.0964,43.5044 +Khronos,8x8,ldr-rgb-emissive.png,44.6783,0.0342,0.0068,153.3649 +Khronos,8x8,ldr-rgb-metalrough.png,32.3676,0.1091,0.0674,15.5686 +Khronos,8x8,ldr-rgb-metalrough2.png,32.2344,0.4420,0.3108,13.4951 +Khronos,8x8,ldr-rgba-base.png,32.4934,0.1099,0.0639,16.4199 +Khronos,8x8,ldr-rgba-diffuse.png,32.1820,0.1247,0.0816,12.8543 +Khronos,8x8,ldr-rgba-specgloss.png,32.9784,0.1254,0.0765,13.7047 +Khronos,8x8,ldr-xy-normal1.png,36.6130,0.1270,0.0521,20.1196 +Khronos,8x8,ldr-xy-normal2.png,40.8661,0.3267,0.0937,44.7655 +Khronos,12x12,ldr-l-occlusion.png,40.5731,0.0391,0.0088,119.4797 +Khronos,12x12,ldr-rgb-diffuse.png,33.3900,0.1860,0.0717,58.4915 +Khronos,12x12,ldr-rgb-emissive.png,39.4755,0.0357,0.0068,154.4746 +Khronos,12x12,ldr-rgb-metalrough.png,28.6627,0.0830,0.0396,26.4638 +Khronos,12x12,ldr-rgb-metalrough2.png,29.2736,0.2684,0.1418,29.5890 +Khronos,12x12,ldr-rgba-base.png,29.0526,0.0991,0.0513,20.4217 +Khronos,12x12,ldr-rgba-diffuse.png,28.6387,0.1049,0.0598,17.5326 +Khronos,12x12,ldr-rgba-specgloss.png,29.8295,0.0915,0.0428,24.4886 +Khronos,12x12,ldr-xy-normal1.png,32.7835,0.1123,0.0359,29.2441 +Khronos,12x12,ldr-xy-normal2.png,36.2804,0.3181,0.0833,50.3324 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse4.1_fastest_results.csv new file mode 100644 index 0000000..dbb9a47 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse4.1_fastest_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,59.3133,0.0367,0.0072,145.6741 +Khronos,4x4,ldr-rgb-diffuse.png,52.3938,0.1800,0.0603,69.5607 +Khronos,4x4,ldr-rgb-emissive.png,57.9378,0.0315,0.0037,286.7979 +Khronos,4x4,ldr-rgb-metalrough.png,43.9316,0.0780,0.0354,29.5856 +Khronos,4x4,ldr-rgb-metalrough2.png,42.7504,0.3584,0.2201,19.0606 +Khronos,4x4,ldr-rgba-base.png,42.9568,0.0895,0.0425,24.6607 +Khronos,4x4,ldr-rgba-diffuse.png,43.3443,0.0746,0.0307,34.1689 +Khronos,4x4,ldr-rgba-specgloss.png,41.4901,0.1163,0.0689,15.2120 +Khronos,4x4,ldr-xy-normal1.png,44.9523,0.1263,0.0521,20.1324 +Khronos,4x4,ldr-xy-normal2.png,48.6050,0.3247,0.0945,44.3875 +Khronos,5x5,ldr-l-occlusion.png,53.0271,0.0333,0.0058,179.4901 +Khronos,5x5,ldr-rgb-diffuse.png,47.0186,0.1671,0.0496,84.5729 +Khronos,5x5,ldr-rgb-emissive.png,52.3745,0.0302,0.0034,308.0512 +Khronos,5x5,ldr-rgb-metalrough.png,39.4729,0.0701,0.0292,35.9482 +Khronos,5x5,ldr-rgb-metalrough2.png,37.5063,0.3522,0.2201,19.0577 +Khronos,5x5,ldr-rgba-base.png,38.3701,0.0797,0.0347,30.2321 +Khronos,5x5,ldr-rgba-diffuse.png,38.5192,0.0743,0.0313,33.4709 +Khronos,5x5,ldr-rgba-specgloss.png,38.0040,0.0943,0.0467,22.4505 +Khronos,5x5,ldr-xy-normal1.png,41.5445,0.1163,0.0435,24.1174 +Khronos,5x5,ldr-xy-normal2.png,46.0830,0.3056,0.0711,59.0181 +Khronos,6x6,ldr-l-occlusion.png,48.0792,0.0356,0.0071,148.6479 +Khronos,6x6,ldr-rgb-diffuse.png,43.1602,0.1831,0.0656,63.9142 +Khronos,6x6,ldr-rgb-emissive.png,48.9938,0.0310,0.0036,289.1739 +Khronos,6x6,ldr-rgb-metalrough.png,36.3829,0.0788,0.0363,28.8855 +Khronos,6x6,ldr-rgb-metalrough2.png,35.1849,0.3559,0.2207,19.0059 +Khronos,6x6,ldr-rgba-base.png,36.0449,0.0856,0.0392,26.7250 +Khronos,6x6,ldr-rgba-diffuse.png,35.9749,0.0838,0.0391,26.7953 +Khronos,6x6,ldr-rgba-specgloss.png,35.9511,0.0998,0.0513,20.4517 +Khronos,6x6,ldr-xy-normal1.png,39.2898,0.1179,0.0433,24.2249 +Khronos,6x6,ldr-xy-normal2.png,43.9097,0.3041,0.0681,61.6292 +Khronos,8x8,ldr-l-occlusion.png,43.4566,0.0363,0.0079,132.2959 +Khronos,8x8,ldr-rgb-diffuse.png,38.3134,0.2002,0.0821,51.1114 +Khronos,8x8,ldr-rgb-emissive.png,44.2810,0.0322,0.0052,203.3779 +Khronos,8x8,ldr-rgb-metalrough.png,32.2883,0.0922,0.0495,21.1761 +Khronos,8x8,ldr-rgb-metalrough2.png,32.1325,0.3638,0.2318,18.0936 +Khronos,8x8,ldr-rgba-base.png,32.3687,0.0938,0.0478,21.9202 +Khronos,8x8,ldr-rgba-diffuse.png,32.0675,0.1022,0.0591,17.7535 +Khronos,8x8,ldr-rgba-specgloss.png,32.8798,0.1040,0.0571,18.3481 +Khronos,8x8,ldr-xy-normal1.png,36.3881,0.1162,0.0414,25.3561 +Khronos,8x8,ldr-xy-normal2.png,40.4360,0.3198,0.0804,52.1958 +Khronos,12x12,ldr-l-occlusion.png,40.2064,0.0392,0.0080,130.8436 +Khronos,12x12,ldr-rgb-diffuse.png,33.3391,0.1948,0.0754,55.6363 +Khronos,12x12,ldr-rgb-emissive.png,39.2909,0.0334,0.0051,204.7984 +Khronos,12x12,ldr-rgb-metalrough.png,28.6145,0.0803,0.0371,28.2536 +Khronos,12x12,ldr-rgb-metalrough2.png,29.1853,0.2731,0.1386,30.2583 +Khronos,12x12,ldr-rgba-base.png,28.9945,0.0952,0.0473,22.1921 +Khronos,12x12,ldr-rgba-diffuse.png,28.5837,0.0997,0.0542,19.3439 +Khronos,12x12,ldr-rgba-specgloss.png,29.7824,0.0903,0.0392,26.7821 +Khronos,12x12,ldr-xy-normal1.png,32.6391,0.1119,0.0334,31.4068 +Khronos,12x12,ldr-xy-normal2.png,36.0570,0.3227,0.0827,50.7147 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse4.1_medium_results.csv new file mode 100644 index 0000000..268f29c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse4.1_medium_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,62.6517,0.0508,0.0215,48.7529 +Khronos,4x4,ldr-rgb-diffuse.png,54.0238,0.3267,0.2087,20.1011 +Khronos,4x4,ldr-rgb-emissive.png,59.8933,0.0389,0.0120,87.5059 +Khronos,4x4,ldr-rgb-metalrough.png,44.9615,0.2065,0.1641,6.3899 +Khronos,4x4,ldr-rgb-metalrough2.png,43.8694,1.2596,1.1241,3.7313 +Khronos,4x4,ldr-rgba-base.png,43.9049,0.2547,0.2078,5.0469 +Khronos,4x4,ldr-rgba-diffuse.png,44.2752,0.1826,0.1388,7.5532 +Khronos,4x4,ldr-rgba-specgloss.png,42.4078,0.3453,0.2960,3.5423 +Khronos,4x4,ldr-xy-normal1.png,46.6452,0.3245,0.2523,4.1567 +Khronos,4x4,ldr-xy-normal2.png,50.4050,0.6746,0.4543,9.2320 +Khronos,5x5,ldr-l-occlusion.png,56.2869,0.0501,0.0207,50.7641 +Khronos,5x5,ldr-rgb-diffuse.png,49.0482,0.3125,0.1914,21.9114 +Khronos,5x5,ldr-rgb-emissive.png,55.4920,0.0408,0.0128,82.0546 +Khronos,5x5,ldr-rgb-metalrough.png,40.3595,0.1943,0.1523,6.8845 +Khronos,5x5,ldr-rgb-metalrough2.png,39.1705,1.3857,1.2434,3.3732 +Khronos,5x5,ldr-rgba-base.png,39.5058,0.2776,0.2300,4.5599 +Khronos,5x5,ldr-rgba-diffuse.png,39.6232,0.2200,0.1737,6.0376 +Khronos,5x5,ldr-rgba-specgloss.png,38.8340,0.3641,0.3159,3.3196 +Khronos,5x5,ldr-xy-normal1.png,43.1905,0.3433,0.2650,3.9565 +Khronos,5x5,ldr-xy-normal2.png,47.4075,0.6965,0.4497,9.3273 +Khronos,6x6,ldr-l-occlusion.png,50.5839,0.0579,0.0292,35.8930 +Khronos,6x6,ldr-rgb-diffuse.png,44.8590,0.3760,0.2502,16.7624 +Khronos,6x6,ldr-rgb-emissive.png,51.5485,0.0460,0.0180,58.4132 +Khronos,6x6,ldr-rgb-metalrough.png,36.8962,0.2375,0.1925,5.4459 +Khronos,6x6,ldr-rgb-metalrough2.png,36.5272,1.2613,1.1286,3.7163 +Khronos,6x6,ldr-rgba-base.png,36.7231,0.2293,0.1839,5.7020 +Khronos,6x6,ldr-rgba-diffuse.png,36.5382,0.2098,0.1659,6.3214 +Khronos,6x6,ldr-rgba-specgloss.png,36.5345,0.3123,0.2618,4.0047 +Khronos,6x6,ldr-xy-normal1.png,40.7063,0.2520,0.1742,6.0201 +Khronos,6x6,ldr-xy-normal2.png,45.3252,0.4348,0.1999,20.9840 +Khronos,8x8,ldr-l-occlusion.png,45.3897,0.0659,0.0357,29.3473 +Khronos,8x8,ldr-rgb-diffuse.png,40.2564,0.4449,0.3271,12.8211 +Khronos,8x8,ldr-rgb-emissive.png,46.6777,0.0507,0.0224,46.8071 +Khronos,8x8,ldr-rgb-metalrough.png,32.7159,0.2670,0.2263,4.6327 +Khronos,8x8,ldr-rgb-metalrough2.png,33.2510,1.4930,1.3608,3.0822 +Khronos,8x8,ldr-rgba-base.png,33.1143,0.2738,0.2267,4.6251 +Khronos,8x8,ldr-rgba-diffuse.png,32.5994,0.2836,0.2397,4.3745 +Khronos,8x8,ldr-rgba-specgloss.png,33.5064,0.3627,0.3140,3.3399 +Khronos,8x8,ldr-xy-normal1.png,37.4841,0.2665,0.1895,5.5346 +Khronos,8x8,ldr-xy-normal2.png,42.1725,0.4762,0.2339,17.9300 +Khronos,12x12,ldr-l-occlusion.png,41.6127,0.0526,0.0205,51.2324 +Khronos,12x12,ldr-rgb-diffuse.png,35.7805,0.4646,0.3430,12.2270 +Khronos,12x12,ldr-rgb-emissive.png,41.4057,0.0574,0.0256,40.9772 +Khronos,12x12,ldr-rgb-metalrough.png,29.1351,0.2573,0.2084,5.0307 +Khronos,12x12,ldr-rgb-metalrough2.png,30.1839,1.0907,0.9515,4.4079 +Khronos,12x12,ldr-rgba-base.png,29.6573,0.2648,0.2159,4.8563 +Khronos,12x12,ldr-rgba-diffuse.png,29.0864,0.3260,0.2786,3.7639 +Khronos,12x12,ldr-rgba-specgloss.png,30.4978,0.2979,0.2501,4.1925 +Khronos,12x12,ldr-xy-normal1.png,33.5558,0.2373,0.1550,6.7668 +Khronos,12x12,ldr-xy-normal2.png,37.8709,0.4807,0.2413,17.3811 diff --git a/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse4.1_thorough_results.csv new file mode 100644 index 0000000..e55e2f4 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Khronos/astc_reference-5.0-sse4.1_thorough_results.csv @@ -0,0 +1,51 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Khronos,4x4,ldr-l-occlusion.png,67.8996,0.1384,0.1111,9.4386 +Khronos,4x4,ldr-rgb-diffuse.png,54.9603,1.3344,1.2165,3.4478 +Khronos,4x4,ldr-rgb-emissive.png,60.9181,0.0587,0.0319,32.8811 +Khronos,4x4,ldr-rgb-metalrough.png,45.0987,0.4143,0.3720,2.8187 +Khronos,4x4,ldr-rgb-metalrough2.png,44.1518,2.5281,2.3949,1.7514 +Khronos,4x4,ldr-rgba-base.png,44.1046,0.5204,0.4762,2.2022 +Khronos,4x4,ldr-rgba-diffuse.png,44.4761,0.3668,0.3233,3.2432 +Khronos,4x4,ldr-rgba-specgloss.png,42.5739,0.6478,0.5991,1.7501 +Khronos,4x4,ldr-xy-normal1.png,46.8144,0.7418,0.6716,1.5614 +Khronos,4x4,ldr-xy-normal2.png,50.7588,1.4267,1.2211,3.4348 +Khronos,5x5,ldr-l-occlusion.png,58.0363,0.1767,0.1480,7.0844 +Khronos,5x5,ldr-rgb-diffuse.png,49.9112,1.1387,1.0217,4.1054 +Khronos,5x5,ldr-rgb-emissive.png,56.2124,0.0628,0.0364,28.7896 +Khronos,5x5,ldr-rgb-metalrough.png,40.5635,0.4215,0.3792,2.7654 +Khronos,5x5,ldr-rgb-metalrough2.png,39.6371,2.7113,2.5736,1.6297 +Khronos,5x5,ldr-rgba-base.png,39.8413,0.5512,0.5073,2.0668 +Khronos,5x5,ldr-rgba-diffuse.png,39.9539,0.4038,0.3611,2.9036 +Khronos,5x5,ldr-rgba-specgloss.png,39.0948,0.6608,0.6145,1.7063 +Khronos,5x5,ldr-xy-normal1.png,43.5133,0.9237,0.8521,1.2305 +Khronos,5x5,ldr-xy-normal2.png,48.0600,2.1496,1.9262,2.1775 +Khronos,6x6,ldr-l-occlusion.png,52.1065,0.1756,0.1473,7.1205 +Khronos,6x6,ldr-rgb-diffuse.png,45.8078,1.0466,0.9337,4.4919 +Khronos,6x6,ldr-rgb-emissive.png,52.6977,0.0715,0.0447,23.4749 +Khronos,6x6,ldr-rgb-metalrough.png,37.0882,0.4853,0.4425,2.3698 +Khronos,6x6,ldr-rgb-metalrough2.png,36.8454,3.0258,2.8965,1.4481 +Khronos,6x6,ldr-rgba-base.png,36.9415,0.6084,0.5646,1.8572 +Khronos,6x6,ldr-rgba-diffuse.png,36.7141,0.4586,0.4142,2.5317 +Khronos,6x6,ldr-rgba-specgloss.png,36.7244,0.7221,0.6745,1.5547 +Khronos,6x6,ldr-xy-normal1.png,41.1425,0.8973,0.8223,1.2752 +Khronos,6x6,ldr-xy-normal2.png,45.9242,2.1551,1.9313,2.1717 +Khronos,8x8,ldr-l-occlusion.png,46.0106,0.2261,0.1946,5.3887 +Khronos,8x8,ldr-rgb-diffuse.png,40.9093,1.3278,1.2059,3.4781 +Khronos,8x8,ldr-rgb-emissive.png,47.5346,0.0831,0.0548,19.1398 +Khronos,8x8,ldr-rgb-metalrough.png,32.8726,0.6629,0.6198,1.6917 +Khronos,8x8,ldr-rgb-metalrough2.png,33.6451,3.9591,3.8239,1.0969 +Khronos,8x8,ldr-rgba-base.png,33.3164,0.8173,0.7701,1.3617 +Khronos,8x8,ldr-rgba-diffuse.png,32.7505,0.6453,0.5996,1.7489 +Khronos,8x8,ldr-rgba-specgloss.png,33.6663,0.9661,0.9156,1.1452 +Khronos,8x8,ldr-xy-normal1.png,37.7905,0.6575,0.5799,1.8083 +Khronos,8x8,ldr-xy-normal2.png,42.5889,1.3661,1.1398,3.6798 +Khronos,12x12,ldr-l-occlusion.png,42.4176,0.2123,0.1785,5.8759 +Khronos,12x12,ldr-rgb-diffuse.png,36.6277,1.5687,1.4473,2.8979 +Khronos,12x12,ldr-rgb-emissive.png,42.3626,0.1214,0.0892,11.7598 +Khronos,12x12,ldr-rgb-metalrough.png,29.3167,0.8959,0.8487,1.2355 +Khronos,12x12,ldr-rgb-metalrough2.png,30.7816,4.6654,4.5289,0.9261 +Khronos,12x12,ldr-rgba-base.png,29.9428,0.9532,0.9006,1.1643 +Khronos,12x12,ldr-rgba-diffuse.png,29.2728,0.8860,0.8374,1.2522 +Khronos,12x12,ldr-rgba-specgloss.png,30.7230,1.2258,1.1717,0.8949 +Khronos,12x12,ldr-xy-normal1.png,33.9744,0.6595,0.5804,1.8066 +Khronos,12x12,ldr-xy-normal2.png,38.4839,1.1009,0.8656,4.8457 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-1.7_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-1.7_fast_results.csv new file mode 100644 index 0000000..3780ff8 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-1.7_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.6825,0.2754,0.2543,1.5460 +Kodak,4x4,ldr-rgb-kodak02.png,43.8552,0.3876,0.3663,1.0736 +Kodak,4x4,ldr-rgb-kodak03.png,46.5384,0.2343,0.2147,1.8318 +Kodak,4x4,ldr-rgb-kodak04.png,44.3548,0.3680,0.3429,1.1468 +Kodak,4x4,ldr-rgb-kodak05.png,41.2578,0.4565,0.4347,0.9046 +Kodak,4x4,ldr-rgb-kodak06.png,44.5876,0.2611,0.2405,1.6348 +Kodak,4x4,ldr-rgb-kodak07.png,44.8157,0.2964,0.2721,1.4452 +Kodak,4x4,ldr-rgb-kodak08.png,41.8186,0.4809,0.4557,0.8629 +Kodak,4x4,ldr-rgb-kodak09.png,46.1310,0.2109,0.1875,2.0969 +Kodak,4x4,ldr-rgb-kodak10.png,45.9799,0.2175,0.1929,2.0383 +Kodak,4x4,ldr-rgb-kodak11.png,44.0252,0.2964,0.2759,1.4253 +Kodak,4x4,ldr-rgb-kodak12.png,47.0698,0.2047,0.1847,2.1294 +Kodak,4x4,ldr-rgb-kodak13.png,41.1887,0.4119,0.3900,1.0082 +Kodak,4x4,ldr-rgb-kodak14.png,41.3481,0.3891,0.3681,1.0681 +Kodak,4x4,ldr-rgb-kodak15.png,44.2577,0.3515,0.3287,1.1964 +Kodak,4x4,ldr-rgb-kodak16.png,47.1380,0.1841,0.1640,2.3970 +Kodak,4x4,ldr-rgb-kodak17.png,45.6428,0.2035,0.1782,2.2060 +Kodak,4x4,ldr-rgb-kodak18.png,41.3438,0.4436,0.4171,0.9428 +Kodak,4x4,ldr-rgb-kodak19.png,44.6995,0.2646,0.2399,1.6393 +Kodak,4x4,ldr-rgb-kodak20.png,46.1115,0.2207,0.2007,1.9594 +Kodak,4x4,ldr-rgb-kodak21.png,44.4220,0.2713,0.2506,1.5694 +Kodak,4x4,ldr-rgb-kodak22.png,42.8968,0.3728,0.3499,1.1238 +Kodak,4x4,ldr-rgb-kodak23.png,45.3849,0.2675,0.2464,1.5960 +Kodak,4x4,ldr-rgb-kodak24.png,41.4266,0.3688,0.3458,1.1370 +Kodak,5x5,ldr-rgb-kodak01.png,39.4557,0.2137,0.1927,2.0404 +Kodak,5x5,ldr-rgb-kodak02.png,40.3893,0.2197,0.1979,1.9870 +Kodak,5x5,ldr-rgb-kodak03.png,42.7215,0.1642,0.1446,2.7188 +Kodak,5x5,ldr-rgb-kodak04.png,41.1874,0.1909,0.1656,2.3750 +Kodak,5x5,ldr-rgb-kodak05.png,37.1809,0.3668,0.3444,1.1417 +Kodak,5x5,ldr-rgb-kodak06.png,40.4411,0.1838,0.1632,2.4101 +Kodak,5x5,ldr-rgb-kodak07.png,41.0915,0.2078,0.1834,2.1444 +Kodak,5x5,ldr-rgb-kodak08.png,37.5733,0.3791,0.3544,1.1096 +Kodak,5x5,ldr-rgb-kodak09.png,42.7885,0.1503,0.1270,3.0956 +Kodak,5x5,ldr-rgb-kodak10.png,42.6265,0.1495,0.1249,3.1495 +Kodak,5x5,ldr-rgb-kodak11.png,40.0961,0.2029,0.1823,2.1573 +Kodak,5x5,ldr-rgb-kodak12.png,43.2321,0.1452,0.1248,3.1519 +Kodak,5x5,ldr-rgb-kodak13.png,36.6939,0.3249,0.3029,1.2980 +Kodak,5x5,ldr-rgb-kodak14.png,37.6468,0.3285,0.3073,1.2797 +Kodak,5x5,ldr-rgb-kodak15.png,40.9355,0.2219,0.1991,1.9745 +Kodak,5x5,ldr-rgb-kodak16.png,43.2511,0.1267,0.1065,3.6921 +Kodak,5x5,ldr-rgb-kodak17.png,41.9496,0.1425,0.1178,3.3376 +Kodak,5x5,ldr-rgb-kodak18.png,38.0059,0.2781,0.2526,1.5564 +Kodak,5x5,ldr-rgb-kodak19.png,40.9881,0.1712,0.1464,2.6861 +Kodak,5x5,ldr-rgb-kodak20.png,42.1643,0.1543,0.1350,2.9121 +Kodak,5x5,ldr-rgb-kodak21.png,40.3226,0.2015,0.1797,2.1883 +Kodak,5x5,ldr-rgb-kodak22.png,39.6243,0.2226,0.1994,1.9723 +Kodak,5x5,ldr-rgb-kodak23.png,42.2959,0.1648,0.1437,2.7370 +Kodak,5x5,ldr-rgb-kodak24.png,37.7060,0.2702,0.2472,1.5904 +Kodak,6x6,ldr-rgb-kodak01.png,35.7677,0.3916,0.3707,1.0606 +Kodak,6x6,ldr-rgb-kodak02.png,37.9462,0.2648,0.2429,1.6185 +Kodak,6x6,ldr-rgb-kodak03.png,40.3349,0.2112,0.1913,2.0560 +Kodak,6x6,ldr-rgb-kodak04.png,38.5374,0.2126,0.1878,2.0938 +Kodak,6x6,ldr-rgb-kodak05.png,34.2726,0.7159,0.6946,0.5661 +Kodak,6x6,ldr-rgb-kodak06.png,37.2043,0.2866,0.2662,1.4772 +Kodak,6x6,ldr-rgb-kodak07.png,38.5434,0.2800,0.2558,1.5372 +Kodak,6x6,ldr-rgb-kodak08.png,34.3391,0.7667,0.7421,0.5299 +Kodak,6x6,ldr-rgb-kodak09.png,39.9473,0.2074,0.1845,2.1310 +Kodak,6x6,ldr-rgb-kodak10.png,39.7629,0.1921,0.1679,2.3421 +Kodak,6x6,ldr-rgb-kodak11.png,37.0499,0.3313,0.3107,1.2654 +Kodak,6x6,ldr-rgb-kodak12.png,40.5607,0.1704,0.1506,2.6108 +Kodak,6x6,ldr-rgb-kodak13.png,32.7448,0.7952,0.7737,0.5082 +Kodak,6x6,ldr-rgb-kodak14.png,35.0320,0.5602,0.5388,0.7298 +Kodak,6x6,ldr-rgb-kodak15.png,38.3376,0.2834,0.2606,1.5091 +Kodak,6x6,ldr-rgb-kodak16.png,40.3469,0.1447,0.1245,3.1576 +Kodak,6x6,ldr-rgb-kodak17.png,38.8503,0.1938,0.1690,2.3261 +Kodak,6x6,ldr-rgb-kodak18.png,35.0729,0.4821,0.4574,0.8597 +Kodak,6x6,ldr-rgb-kodak19.png,37.8829,0.2608,0.2366,1.6619 +Kodak,6x6,ldr-rgb-kodak20.png,39.1191,0.2298,0.2111,1.8630 +Kodak,6x6,ldr-rgb-kodak21.png,36.9100,0.4056,0.3850,1.0214 +Kodak,6x6,ldr-rgb-kodak22.png,36.9355,0.3902,0.3676,1.0696 +Kodak,6x6,ldr-rgb-kodak23.png,39.9832,0.2029,0.1822,2.1587 +Kodak,6x6,ldr-rgb-kodak24.png,34.7694,0.4799,0.4571,0.8603 +Kodak,8x8,ldr-rgb-kodak01.png,31.3018,0.4190,0.3987,0.9863 +Kodak,8x8,ldr-rgb-kodak02.png,34.8073,0.2080,0.1868,2.1049 +Kodak,8x8,ldr-rgb-kodak03.png,36.4754,0.1520,0.1321,2.9777 +Kodak,8x8,ldr-rgb-kodak04.png,35.0946,0.1699,0.1447,2.7168 +Kodak,8x8,ldr-rgb-kodak05.png,30.1830,0.6722,0.6507,0.6043 +Kodak,8x8,ldr-rgb-kodak06.png,32.8166,0.2859,0.2648,1.4851 +Kodak,8x8,ldr-rgb-kodak07.png,34.6892,0.2141,0.1903,2.0662 +Kodak,8x8,ldr-rgb-kodak08.png,29.9145,0.8276,0.8030,0.4897 +Kodak,8x8,ldr-rgb-kodak09.png,35.9414,0.1799,0.1567,2.5097 +Kodak,8x8,ldr-rgb-kodak10.png,35.7817,0.1787,0.1540,2.5531 +Kodak,8x8,ldr-rgb-kodak11.png,32.9231,0.3218,0.3013,1.3050 +Kodak,8x8,ldr-rgb-kodak12.png,36.5546,0.1527,0.1328,2.9609 +Kodak,8x8,ldr-rgb-kodak13.png,28.2225,0.8190,0.7980,0.4927 +Kodak,8x8,ldr-rgb-kodak14.png,31.3481,0.4978,0.4774,0.8236 +Kodak,8x8,ldr-rgb-kodak15.png,34.9134,0.2077,0.1855,2.1203 +Kodak,8x8,ldr-rgb-kodak16.png,35.7854,0.1487,0.1289,3.0500 +Kodak,8x8,ldr-rgb-kodak17.png,34.7590,0.2043,0.1800,2.1848 +Kodak,8x8,ldr-rgb-kodak18.png,31.2067,0.4201,0.3959,0.9931 +Kodak,8x8,ldr-rgb-kodak19.png,34.0444,0.2424,0.2182,1.8022 +Kodak,8x8,ldr-rgb-kodak20.png,35.1809,0.2035,0.1844,2.1324 +Kodak,8x8,ldr-rgb-kodak21.png,32.7626,0.3350,0.3143,1.2512 +Kodak,8x8,ldr-rgb-kodak22.png,33.3852,0.2567,0.2341,1.6796 +Kodak,8x8,ldr-rgb-kodak23.png,36.5371,0.1630,0.1422,2.7660 +Kodak,8x8,ldr-rgb-kodak24.png,30.8049,0.4357,0.4127,0.9528 +Kodak,12x12,ldr-rgb-kodak01.png,26.8422,0.1646,0.1435,2.7399 +Kodak,12x12,ldr-rgb-kodak02.png,30.9301,0.0978,0.0759,5.1789 +Kodak,12x12,ldr-rgb-kodak03.png,32.5958,0.0857,0.0659,5.9631 +Kodak,12x12,ldr-rgb-kodak04.png,31.5630,0.0856,0.0606,6.4896 +Kodak,12x12,ldr-rgb-kodak05.png,25.7139,0.2488,0.2266,1.7352 +Kodak,12x12,ldr-rgb-kodak06.png,28.4713,0.1528,0.1317,2.9865 +Kodak,12x12,ldr-rgb-kodak07.png,30.8014,0.0989,0.0745,5.2755 +Kodak,12x12,ldr-rgb-kodak08.png,25.3117,0.3370,0.3120,1.2605 +Kodak,12x12,ldr-rgb-kodak09.png,31.6014,0.1086,0.0854,4.6050 +Kodak,12x12,ldr-rgb-kodak10.png,31.4255,0.1096,0.0854,4.6055 +Kodak,12x12,ldr-rgb-kodak11.png,28.8394,0.1374,0.1168,3.3666 +Kodak,12x12,ldr-rgb-kodak12.png,32.3931,0.0898,0.0696,5.6505 +Kodak,12x12,ldr-rgb-kodak13.png,24.3095,0.3720,0.3501,1.1232 +Kodak,12x12,ldr-rgb-kodak14.png,27.4927,0.1897,0.1681,2.3390 +Kodak,12x12,ldr-rgb-kodak15.png,31.1385,0.1053,0.0826,4.7620 +Kodak,12x12,ldr-rgb-kodak16.png,31.1965,0.0856,0.0656,5.9932 +Kodak,12x12,ldr-rgb-kodak17.png,30.8057,0.1087,0.0837,4.6953 +Kodak,12x12,ldr-rgb-kodak18.png,27.3640,0.1756,0.1499,2.6226 +Kodak,12x12,ldr-rgb-kodak19.png,30.0278,0.1292,0.1044,3.7672 +Kodak,12x12,ldr-rgb-kodak20.png,30.9715,0.1159,0.0966,4.0694 +Kodak,12x12,ldr-rgb-kodak21.png,28.5578,0.1435,0.1223,3.2159 +Kodak,12x12,ldr-rgb-kodak22.png,29.7015,0.1118,0.0886,4.4386 +Kodak,12x12,ldr-rgb-kodak23.png,32.5760,0.0956,0.0743,5.2945 +Kodak,12x12,ldr-rgb-kodak24.png,26.7495,0.2457,0.2224,1.7681 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-1.7_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-1.7_fastest_results.csv new file mode 100644 index 0000000..0fac6a4 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-1.7_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.6825,0.2794,0.2587,1.5200 +Kodak,4x4,ldr-rgb-kodak02.png,43.8552,0.3882,0.3660,1.0743 +Kodak,4x4,ldr-rgb-kodak03.png,46.5384,0.2327,0.2128,1.8479 +Kodak,4x4,ldr-rgb-kodak04.png,44.3548,0.3640,0.3396,1.1579 +Kodak,4x4,ldr-rgb-kodak05.png,41.2578,0.4583,0.4365,0.9008 +Kodak,4x4,ldr-rgb-kodak06.png,44.5876,0.2614,0.2407,1.6334 +Kodak,4x4,ldr-rgb-kodak07.png,44.8157,0.2997,0.2707,1.4526 +Kodak,4x4,ldr-rgb-kodak08.png,41.8186,0.4805,0.4558,0.8627 +Kodak,4x4,ldr-rgb-kodak09.png,46.1310,0.2114,0.1879,2.0923 +Kodak,4x4,ldr-rgb-kodak10.png,45.9799,0.2184,0.1938,2.0292 +Kodak,4x4,ldr-rgb-kodak11.png,44.0252,0.3031,0.2819,1.3946 +Kodak,4x4,ldr-rgb-kodak12.png,47.0698,0.2043,0.1843,2.1334 +Kodak,4x4,ldr-rgb-kodak13.png,41.1887,0.4113,0.3891,1.0107 +Kodak,4x4,ldr-rgb-kodak14.png,41.3481,0.3956,0.3743,1.0505 +Kodak,4x4,ldr-rgb-kodak15.png,44.2577,0.3560,0.3331,1.1806 +Kodak,4x4,ldr-rgb-kodak16.png,47.1380,0.1882,0.1680,2.3405 +Kodak,4x4,ldr-rgb-kodak17.png,45.6428,0.2051,0.1801,2.1829 +Kodak,4x4,ldr-rgb-kodak18.png,41.3438,0.4448,0.4187,0.9392 +Kodak,4x4,ldr-rgb-kodak19.png,44.6995,0.2648,0.2399,1.6394 +Kodak,4x4,ldr-rgb-kodak20.png,46.1115,0.2212,0.2018,1.9483 +Kodak,4x4,ldr-rgb-kodak21.png,44.4220,0.2701,0.2493,1.5775 +Kodak,4x4,ldr-rgb-kodak22.png,42.8968,0.3770,0.3541,1.1104 +Kodak,4x4,ldr-rgb-kodak23.png,45.3849,0.2680,0.2469,1.5929 +Kodak,4x4,ldr-rgb-kodak24.png,41.4266,0.3684,0.3453,1.1389 +Kodak,5x5,ldr-rgb-kodak01.png,39.4557,0.2125,0.1913,2.0551 +Kodak,5x5,ldr-rgb-kodak02.png,40.3893,0.2184,0.1964,2.0016 +Kodak,5x5,ldr-rgb-kodak03.png,42.7215,0.1630,0.1433,2.7442 +Kodak,5x5,ldr-rgb-kodak04.png,41.1874,0.1899,0.1644,2.3913 +Kodak,5x5,ldr-rgb-kodak05.png,37.1809,0.3688,0.3470,1.1331 +Kodak,5x5,ldr-rgb-kodak06.png,40.4411,0.1851,0.1642,2.3944 +Kodak,5x5,ldr-rgb-kodak07.png,41.0915,0.2053,0.1811,2.1717 +Kodak,5x5,ldr-rgb-kodak08.png,37.5733,0.3754,0.3507,1.1212 +Kodak,5x5,ldr-rgb-kodak09.png,42.7885,0.1512,0.1274,3.0868 +Kodak,5x5,ldr-rgb-kodak10.png,42.6265,0.1507,0.1260,3.1201 +Kodak,5x5,ldr-rgb-kodak11.png,40.0961,0.2084,0.1877,2.0951 +Kodak,5x5,ldr-rgb-kodak12.png,43.2321,0.1453,0.1250,3.1446 +Kodak,5x5,ldr-rgb-kodak13.png,36.6939,0.3254,0.3036,1.2951 +Kodak,5x5,ldr-rgb-kodak14.png,37.6468,0.3289,0.3075,1.2786 +Kodak,5x5,ldr-rgb-kodak15.png,40.9355,0.2235,0.2008,1.9580 +Kodak,5x5,ldr-rgb-kodak16.png,43.2511,0.1266,0.1065,3.6939 +Kodak,5x5,ldr-rgb-kodak17.png,41.9496,0.1425,0.1178,3.3366 +Kodak,5x5,ldr-rgb-kodak18.png,38.0059,0.2798,0.2543,1.5463 +Kodak,5x5,ldr-rgb-kodak19.png,40.9881,0.1723,0.1470,2.6742 +Kodak,5x5,ldr-rgb-kodak20.png,42.1643,0.1545,0.1351,2.9099 +Kodak,5x5,ldr-rgb-kodak21.png,40.3226,0.2010,0.1795,2.1907 +Kodak,5x5,ldr-rgb-kodak22.png,39.6243,0.2224,0.1993,1.9725 +Kodak,5x5,ldr-rgb-kodak23.png,42.2959,0.1677,0.1462,2.6896 +Kodak,5x5,ldr-rgb-kodak24.png,37.7060,0.2740,0.2511,1.5659 +Kodak,6x6,ldr-rgb-kodak01.png,35.7677,0.3938,0.3729,1.0545 +Kodak,6x6,ldr-rgb-kodak02.png,37.9462,0.2649,0.2431,1.6173 +Kodak,6x6,ldr-rgb-kodak03.png,40.3349,0.2088,0.1890,2.0802 +Kodak,6x6,ldr-rgb-kodak04.png,38.5374,0.2123,0.1866,2.1069 +Kodak,6x6,ldr-rgb-kodak05.png,34.2726,0.7145,0.6927,0.5676 +Kodak,6x6,ldr-rgb-kodak06.png,37.2043,0.2862,0.2652,1.4824 +Kodak,6x6,ldr-rgb-kodak07.png,38.5434,0.2800,0.2556,1.5384 +Kodak,6x6,ldr-rgb-kodak08.png,34.3391,0.7660,0.7415,0.5303 +Kodak,6x6,ldr-rgb-kodak09.png,39.9473,0.2059,0.1824,2.1556 +Kodak,6x6,ldr-rgb-kodak10.png,39.7629,0.1924,0.1678,2.3440 +Kodak,6x6,ldr-rgb-kodak11.png,37.0499,0.3344,0.3140,1.2521 +Kodak,6x6,ldr-rgb-kodak12.png,40.5607,0.1716,0.1513,2.5982 +Kodak,6x6,ldr-rgb-kodak13.png,32.7448,0.7949,0.7733,0.5085 +Kodak,6x6,ldr-rgb-kodak14.png,35.0320,0.5648,0.5438,0.7231 +Kodak,6x6,ldr-rgb-kodak15.png,38.3376,0.2811,0.2584,1.5219 +Kodak,6x6,ldr-rgb-kodak16.png,40.3469,0.1437,0.1235,3.1836 +Kodak,6x6,ldr-rgb-kodak17.png,38.8503,0.1953,0.1704,2.3082 +Kodak,6x6,ldr-rgb-kodak18.png,35.0729,0.4808,0.4550,0.8643 +Kodak,6x6,ldr-rgb-kodak19.png,37.8829,0.2618,0.2372,1.6576 +Kodak,6x6,ldr-rgb-kodak20.png,39.1191,0.2284,0.2093,1.8789 +Kodak,6x6,ldr-rgb-kodak21.png,36.9100,0.3592,0.3390,1.1601 +Kodak,6x6,ldr-rgb-kodak22.png,36.9355,0.3164,0.2938,1.3384 +Kodak,6x6,ldr-rgb-kodak23.png,39.9832,0.2025,0.1814,2.1678 +Kodak,6x6,ldr-rgb-kodak24.png,34.7694,0.4866,0.4635,0.8484 +Kodak,8x8,ldr-rgb-kodak01.png,31.3018,0.4193,0.3986,0.9865 +Kodak,8x8,ldr-rgb-kodak02.png,34.8073,0.2082,0.1872,2.1005 +Kodak,8x8,ldr-rgb-kodak03.png,36.4754,0.1524,0.1328,2.9609 +Kodak,8x8,ldr-rgb-kodak04.png,35.0946,0.1710,0.1459,2.6954 +Kodak,8x8,ldr-rgb-kodak05.png,30.1830,0.6725,0.6510,0.6040 +Kodak,8x8,ldr-rgb-kodak06.png,32.8166,0.2886,0.2675,1.4700 +Kodak,8x8,ldr-rgb-kodak07.png,34.6892,0.2149,0.1903,2.0664 +Kodak,8x8,ldr-rgb-kodak08.png,29.9145,0.8269,0.8024,0.4901 +Kodak,8x8,ldr-rgb-kodak09.png,35.9414,0.1803,0.1575,2.4971 +Kodak,8x8,ldr-rgb-kodak10.png,35.7817,0.1816,0.1560,2.5208 +Kodak,8x8,ldr-rgb-kodak11.png,32.9231,0.3192,0.2989,1.3156 +Kodak,8x8,ldr-rgb-kodak12.png,36.5546,0.1544,0.1342,2.9310 +Kodak,8x8,ldr-rgb-kodak13.png,28.2225,0.8067,0.7847,0.5011 +Kodak,8x8,ldr-rgb-kodak14.png,31.3481,0.5018,0.4808,0.8179 +Kodak,8x8,ldr-rgb-kodak15.png,34.9134,0.2033,0.1810,2.1722 +Kodak,8x8,ldr-rgb-kodak16.png,35.7854,0.1472,0.1274,3.0855 +Kodak,8x8,ldr-rgb-kodak17.png,34.7590,0.2079,0.1837,2.1400 +Kodak,8x8,ldr-rgb-kodak18.png,31.2067,0.4203,0.3955,0.9942 +Kodak,8x8,ldr-rgb-kodak19.png,34.0444,0.2411,0.2167,1.8143 +Kodak,8x8,ldr-rgb-kodak20.png,35.1809,0.2025,0.1833,2.1458 +Kodak,8x8,ldr-rgb-kodak21.png,32.7626,0.3352,0.3148,1.2489 +Kodak,8x8,ldr-rgb-kodak22.png,33.3852,0.2571,0.2345,1.6766 +Kodak,8x8,ldr-rgb-kodak23.png,36.5371,0.1626,0.1407,2.7944 +Kodak,8x8,ldr-rgb-kodak24.png,30.8049,0.4387,0.4160,0.9453 +Kodak,12x12,ldr-rgb-kodak01.png,26.8422,0.1658,0.1446,2.7193 +Kodak,12x12,ldr-rgb-kodak02.png,30.9301,0.0984,0.0763,5.1502 +Kodak,12x12,ldr-rgb-kodak03.png,32.5958,0.0886,0.0684,5.7456 +Kodak,12x12,ldr-rgb-kodak04.png,31.5630,0.0873,0.0621,6.3314 +Kodak,12x12,ldr-rgb-kodak05.png,25.7139,0.2497,0.2275,1.7287 +Kodak,12x12,ldr-rgb-kodak06.png,28.4713,0.1558,0.1349,2.9140 +Kodak,12x12,ldr-rgb-kodak07.png,30.8014,0.0999,0.0754,5.2172 +Kodak,12x12,ldr-rgb-kodak08.png,25.3117,0.3371,0.3119,1.2607 +Kodak,12x12,ldr-rgb-kodak09.png,31.6014,0.1096,0.0862,4.5636 +Kodak,12x12,ldr-rgb-kodak10.png,31.4255,0.1099,0.0853,4.6110 +Kodak,12x12,ldr-rgb-kodak11.png,28.8394,0.1373,0.1168,3.3663 +Kodak,12x12,ldr-rgb-kodak12.png,32.3931,0.0900,0.0697,5.6414 +Kodak,12x12,ldr-rgb-kodak13.png,24.3095,0.3738,0.3515,1.1188 +Kodak,12x12,ldr-rgb-kodak14.png,27.4927,0.1892,0.1682,2.3379 +Kodak,12x12,ldr-rgb-kodak15.png,31.1385,0.1078,0.0847,4.6404 +Kodak,12x12,ldr-rgb-kodak16.png,31.1965,0.0863,0.0662,5.9377 +Kodak,12x12,ldr-rgb-kodak17.png,30.8057,0.1096,0.0844,4.6581 +Kodak,12x12,ldr-rgb-kodak18.png,27.3640,0.1737,0.1482,2.6532 +Kodak,12x12,ldr-rgb-kodak19.png,30.0278,0.1282,0.1031,3.8150 +Kodak,12x12,ldr-rgb-kodak20.png,30.9715,0.1163,0.0968,4.0634 +Kodak,12x12,ldr-rgb-kodak21.png,28.5578,0.1447,0.1238,3.1756 +Kodak,12x12,ldr-rgb-kodak22.png,29.7015,0.1127,0.0895,4.3957 +Kodak,12x12,ldr-rgb-kodak23.png,32.5760,0.0956,0.0743,5.2931 +Kodak,12x12,ldr-rgb-kodak24.png,26.7495,0.2464,0.2233,1.7612 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-1.7_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-1.7_medium_results.csv new file mode 100644 index 0000000..81aa1a0 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-1.7_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.2489,1.5518,1.5317,0.2567 +Kodak,4x4,ldr-rgb-kodak02.png,44.7543,2.3848,2.3635,0.1664 +Kodak,4x4,ldr-rgb-kodak03.png,47.4843,1.2743,1.2549,0.3133 +Kodak,4x4,ldr-rgb-kodak04.png,45.1510,2.0373,2.0128,0.1954 +Kodak,4x4,ldr-rgb-kodak05.png,42.0639,2.1280,2.1061,0.1867 +Kodak,4x4,ldr-rgb-kodak06.png,45.1401,1.4903,1.4700,0.2675 +Kodak,4x4,ldr-rgb-kodak07.png,45.7941,1.5521,1.5287,0.2572 +Kodak,4x4,ldr-rgb-kodak08.png,42.4940,2.1317,2.1076,0.1866 +Kodak,4x4,ldr-rgb-kodak09.png,47.0467,2.1410,2.1180,0.1857 +Kodak,4x4,ldr-rgb-kodak10.png,46.7922,2.0868,2.0603,0.1909 +Kodak,4x4,ldr-rgb-kodak11.png,44.7874,1.7864,1.7663,0.2226 +Kodak,4x4,ldr-rgb-kodak12.png,47.8582,1.4597,1.4402,0.2730 +Kodak,4x4,ldr-rgb-kodak13.png,41.5904,1.6261,1.6048,0.2450 +Kodak,4x4,ldr-rgb-kodak14.png,42.4450,1.9612,1.9385,0.2028 +Kodak,4x4,ldr-rgb-kodak15.png,45.1539,1.5892,1.5672,0.2509 +Kodak,4x4,ldr-rgb-kodak16.png,47.8445,1.4238,1.4043,0.2800 +Kodak,4x4,ldr-rgb-kodak17.png,46.2445,1.6053,1.5813,0.2487 +Kodak,4x4,ldr-rgb-kodak18.png,41.8938,2.4104,2.3828,0.1650 +Kodak,4x4,ldr-rgb-kodak19.png,45.2789,2.1534,2.1289,0.1847 +Kodak,4x4,ldr-rgb-kodak20.png,46.8082,1.1471,1.1281,0.3486 +Kodak,4x4,ldr-rgb-kodak21.png,45.1253,2.3566,2.3365,0.1683 +Kodak,4x4,ldr-rgb-kodak22.png,43.6355,2.6616,2.6376,0.1491 +Kodak,4x4,ldr-rgb-kodak23.png,46.5548,2.3078,2.2870,0.1719 +Kodak,4x4,ldr-rgb-kodak24.png,42.2980,1.8286,1.8064,0.2177 +Kodak,5x5,ldr-rgb-kodak01.png,40.1072,1.7491,1.7275,0.2276 +Kodak,5x5,ldr-rgb-kodak02.png,41.5262,2.0127,1.9915,0.1974 +Kodak,5x5,ldr-rgb-kodak03.png,43.9710,0.8644,0.8427,0.4666 +Kodak,5x5,ldr-rgb-kodak04.png,42.0180,1.6513,1.6267,0.2417 +Kodak,5x5,ldr-rgb-kodak05.png,38.0305,2.2712,2.2482,0.1749 +Kodak,5x5,ldr-rgb-kodak06.png,41.0573,1.3510,1.3305,0.2955 +Kodak,5x5,ldr-rgb-kodak07.png,42.3504,1.2027,1.1793,0.3334 +Kodak,5x5,ldr-rgb-kodak08.png,38.3721,2.2919,2.2656,0.1736 +Kodak,5x5,ldr-rgb-kodak09.png,43.7818,0.9026,0.8800,0.4468 +Kodak,5x5,ldr-rgb-kodak10.png,43.4914,1.0777,1.0538,0.3731 +Kodak,5x5,ldr-rgb-kodak11.png,40.8419,1.7241,1.7030,0.2309 +Kodak,5x5,ldr-rgb-kodak12.png,44.3023,0.8636,0.8438,0.4660 +Kodak,5x5,ldr-rgb-kodak13.png,36.9092,1.8679,1.8466,0.2129 +Kodak,5x5,ldr-rgb-kodak14.png,38.6805,2.0114,1.9908,0.1975 +Kodak,5x5,ldr-rgb-kodak15.png,41.7823,1.4509,1.4289,0.2752 +Kodak,5x5,ldr-rgb-kodak16.png,44.1188,0.9535,0.9337,0.4211 +Kodak,5x5,ldr-rgb-kodak17.png,42.5502,0.9430,0.9185,0.4281 +Kodak,5x5,ldr-rgb-kodak18.png,38.3942,2.1045,2.0799,0.1891 +Kodak,5x5,ldr-rgb-kodak19.png,41.6200,1.3416,1.3167,0.2986 +Kodak,5x5,ldr-rgb-kodak20.png,42.9123,0.9173,0.8982,0.4378 +Kodak,5x5,ldr-rgb-kodak21.png,40.7748,1.4194,1.3993,0.2810 +Kodak,5x5,ldr-rgb-kodak22.png,40.2643,2.1708,2.1468,0.1832 +Kodak,5x5,ldr-rgb-kodak23.png,43.4376,1.3145,1.2935,0.3040 +Kodak,5x5,ldr-rgb-kodak24.png,38.2129,1.6321,1.6082,0.2445 +Kodak,6x6,ldr-rgb-kodak01.png,36.2967,3.2592,3.2387,0.1214 +Kodak,6x6,ldr-rgb-kodak02.png,38.9857,1.7470,1.7258,0.2278 +Kodak,6x6,ldr-rgb-kodak03.png,41.3958,0.9636,0.9446,0.4163 +Kodak,6x6,ldr-rgb-kodak04.png,39.4770,1.5057,1.4816,0.2654 +Kodak,6x6,ldr-rgb-kodak05.png,34.9306,3.5503,3.5290,0.1114 +Kodak,6x6,ldr-rgb-kodak06.png,37.7042,2.0914,2.0707,0.1899 +Kodak,6x6,ldr-rgb-kodak07.png,39.7500,1.4230,1.3958,0.2817 +Kodak,6x6,ldr-rgb-kodak08.png,35.0954,3.9370,3.9124,0.1005 +Kodak,6x6,ldr-rgb-kodak09.png,40.9838,0.9555,0.9330,0.4215 +Kodak,6x6,ldr-rgb-kodak10.png,40.6509,0.9869,0.9627,0.4085 +Kodak,6x6,ldr-rgb-kodak11.png,37.6578,2.0977,2.0763,0.1894 +Kodak,6x6,ldr-rgb-kodak12.png,41.5092,0.8816,0.8621,0.4561 +Kodak,6x6,ldr-rgb-kodak13.png,32.9418,3.9551,3.9339,0.1000 +Kodak,6x6,ldr-rgb-kodak14.png,35.8438,2.5703,2.5495,0.1542 +Kodak,6x6,ldr-rgb-kodak15.png,39.1530,1.6445,1.6220,0.2424 +Kodak,6x6,ldr-rgb-kodak16.png,41.0774,1.0758,1.0562,0.3723 +Kodak,6x6,ldr-rgb-kodak17.png,39.4942,1.0536,1.0298,0.3818 +Kodak,6x6,ldr-rgb-kodak18.png,35.4161,2.7927,2.7682,0.1420 +Kodak,6x6,ldr-rgb-kodak19.png,38.5703,1.9363,1.9108,0.2058 +Kodak,6x6,ldr-rgb-kodak20.png,39.8488,1.3449,1.3261,0.2965 +Kodak,6x6,ldr-rgb-kodak21.png,37.2788,1.9661,1.9450,0.2022 +Kodak,6x6,ldr-rgb-kodak22.png,37.5799,2.4584,2.4353,0.1615 +Kodak,6x6,ldr-rgb-kodak23.png,41.0353,0.9574,0.9366,0.4198 +Kodak,6x6,ldr-rgb-kodak24.png,35.1604,2.4262,2.4036,0.1636 +Kodak,8x8,ldr-rgb-kodak01.png,31.9110,3.7087,3.6880,0.1066 +Kodak,8x8,ldr-rgb-kodak02.png,35.7825,1.4945,1.4733,0.2669 +Kodak,8x8,ldr-rgb-kodak03.png,37.8526,0.9876,0.9665,0.4069 +Kodak,8x8,ldr-rgb-kodak04.png,36.1309,1.3430,1.3169,0.2986 +Kodak,8x8,ldr-rgb-kodak05.png,30.8862,3.9585,3.9364,0.0999 +Kodak,8x8,ldr-rgb-kodak06.png,33.5421,2.2729,2.2528,0.1745 +Kodak,8x8,ldr-rgb-kodak07.png,36.2343,1.3840,1.3601,0.2891 +Kodak,8x8,ldr-rgb-kodak08.png,30.7040,4.0579,4.0334,0.0975 +Kodak,8x8,ldr-rgb-kodak09.png,37.3605,0.9259,0.9034,0.4353 +Kodak,8x8,ldr-rgb-kodak10.png,36.9859,0.9385,0.9129,0.4307 +Kodak,8x8,ldr-rgb-kodak11.png,33.7453,1.9689,1.9486,0.2018 +Kodak,8x8,ldr-rgb-kodak12.png,37.8554,0.8404,0.8207,0.4791 +Kodak,8x8,ldr-rgb-kodak13.png,28.5017,4.3923,4.3706,0.0900 +Kodak,8x8,ldr-rgb-kodak14.png,32.2263,2.6269,2.6060,0.1509 +Kodak,8x8,ldr-rgb-kodak15.png,35.9182,1.4148,1.3926,0.2824 +Kodak,8x8,ldr-rgb-kodak16.png,37.0713,1.0984,1.0788,0.3645 +Kodak,8x8,ldr-rgb-kodak17.png,35.7481,1.1261,1.1019,0.3569 +Kodak,8x8,ldr-rgb-kodak18.png,31.6479,2.7289,2.7042,0.1454 +Kodak,8x8,ldr-rgb-kodak19.png,34.8651,1.8771,1.8528,0.2122 +Kodak,8x8,ldr-rgb-kodak20.png,36.0346,1.3448,1.3258,0.2966 +Kodak,8x8,ldr-rgb-kodak21.png,33.2187,2.2704,2.2502,0.1747 +Kodak,8x8,ldr-rgb-kodak22.png,34.1186,2.0581,2.0356,0.1932 +Kodak,8x8,ldr-rgb-kodak23.png,37.7153,0.8126,0.7918,0.4966 +Kodak,8x8,ldr-rgb-kodak24.png,31.2301,2.4987,2.4759,0.1588 +Kodak,12x12,ldr-rgb-kodak01.png,27.8145,2.8098,2.7890,0.1410 +Kodak,12x12,ldr-rgb-kodak02.png,32.4832,0.5758,0.5549,0.7086 +Kodak,12x12,ldr-rgb-kodak03.png,33.8208,0.5197,0.5006,0.7855 +Kodak,12x12,ldr-rgb-kodak04.png,32.4685,0.5029,0.4784,0.8220 +Kodak,12x12,ldr-rgb-kodak05.png,26.4899,2.9372,2.9159,0.1349 +Kodak,12x12,ldr-rgb-kodak06.png,29.4140,1.5272,1.5071,0.2609 +Kodak,12x12,ldr-rgb-kodak07.png,32.0342,0.8980,0.8743,0.4498 +Kodak,12x12,ldr-rgb-kodak08.png,26.1973,3.0956,3.0711,0.1280 +Kodak,12x12,ldr-rgb-kodak09.png,33.2196,0.5866,0.5636,0.6977 +Kodak,12x12,ldr-rgb-kodak10.png,32.5262,0.6077,0.5835,0.6739 +Kodak,12x12,ldr-rgb-kodak11.png,29.8210,1.2112,1.1909,0.3302 +Kodak,12x12,ldr-rgb-kodak12.png,33.8975,0.4782,0.4584,0.8578 +Kodak,12x12,ldr-rgb-kodak13.png,24.5979,3.4543,3.4329,0.1145 +Kodak,12x12,ldr-rgb-kodak14.png,28.4178,1.7146,1.6942,0.2321 +Kodak,12x12,ldr-rgb-kodak15.png,32.1998,0.7619,0.7393,0.5319 +Kodak,12x12,ldr-rgb-kodak16.png,32.9853,0.4849,0.4653,0.8452 +Kodak,12x12,ldr-rgb-kodak17.png,31.7826,0.5727,0.5488,0.7165 +Kodak,12x12,ldr-rgb-kodak18.png,27.7892,1.7402,1.7158,0.2292 +Kodak,12x12,ldr-rgb-kodak19.png,30.9830,0.9455,0.9214,0.4267 +Kodak,12x12,ldr-rgb-kodak20.png,31.9231,0.7770,0.7574,0.5192 +Kodak,12x12,ldr-rgb-kodak21.png,29.2334,1.7758,1.7526,0.2244 +Kodak,12x12,ldr-rgb-kodak22.png,30.5600,1.1097,1.0873,0.3616 +Kodak,12x12,ldr-rgb-kodak23.png,33.6757,0.4154,0.3945,0.9968 +Kodak,12x12,ldr-rgb-kodak24.png,27.1333,1.6918,1.6667,0.2359 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-1.7_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-1.7_thorough_results.csv new file mode 100644 index 0000000..cda44b5 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-1.7_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.4888,4.5713,4.5504,0.0864 +Kodak,4x4,ldr-rgb-kodak02.png,45.2628,5.1195,5.0963,0.0772 +Kodak,4x4,ldr-rgb-kodak03.png,48.0062,5.9971,5.9781,0.0658 +Kodak,4x4,ldr-rgb-kodak04.png,45.5173,6.3865,6.3624,0.0618 +Kodak,4x4,ldr-rgb-kodak05.png,42.4684,5.6797,5.6583,0.0695 +Kodak,4x4,ldr-rgb-kodak06.png,45.3835,5.1904,5.1704,0.0761 +Kodak,4x4,ldr-rgb-kodak07.png,46.3167,6.5262,6.5028,0.0605 +Kodak,4x4,ldr-rgb-kodak08.png,42.8545,5.4052,5.3783,0.0731 +Kodak,4x4,ldr-rgb-kodak09.png,47.4274,6.8892,6.8665,0.0573 +Kodak,4x4,ldr-rgb-kodak10.png,47.0946,7.0091,6.9853,0.0563 +Kodak,4x4,ldr-rgb-kodak11.png,45.1248,5.7754,5.7539,0.0683 +Kodak,4x4,ldr-rgb-kodak12.png,48.2285,6.2450,6.2253,0.0632 +Kodak,4x4,ldr-rgb-kodak13.png,41.7349,4.9224,4.9012,0.0802 +Kodak,4x4,ldr-rgb-kodak14.png,42.9653,5.5743,5.5536,0.0708 +Kodak,4x4,ldr-rgb-kodak15.png,45.6409,5.9882,5.9658,0.0659 +Kodak,4x4,ldr-rgb-kodak16.png,48.0676,6.0245,6.0028,0.0655 +Kodak,4x4,ldr-rgb-kodak17.png,46.4417,6.4127,6.3890,0.0615 +Kodak,4x4,ldr-rgb-kodak18.png,42.1691,6.2240,6.1993,0.0634 +Kodak,4x4,ldr-rgb-kodak19.png,45.5341,6.4683,6.4439,0.0610 +Kodak,4x4,ldr-rgb-kodak20.png,47.1513,3.8636,3.8446,0.1023 +Kodak,4x4,ldr-rgb-kodak21.png,45.3224,6.6021,6.5816,0.0597 +Kodak,4x4,ldr-rgb-kodak22.png,43.9894,6.9720,6.9492,0.0566 +Kodak,4x4,ldr-rgb-kodak23.png,47.0265,6.9799,6.9567,0.0565 +Kodak,4x4,ldr-rgb-kodak24.png,42.6098,5.8791,5.8567,0.0671 +Kodak,5x5,ldr-rgb-kodak01.png,40.2372,5.5524,5.5321,0.0711 +Kodak,5x5,ldr-rgb-kodak02.png,41.8428,5.9198,5.8986,0.0667 +Kodak,5x5,ldr-rgb-kodak03.png,44.3680,6.7283,6.7044,0.0587 +Kodak,5x5,ldr-rgb-kodak04.png,42.2411,7.3937,7.3690,0.0534 +Kodak,5x5,ldr-rgb-kodak05.png,38.2728,6.8286,6.8075,0.0578 +Kodak,5x5,ldr-rgb-kodak06.png,41.1872,6.0360,6.0159,0.0654 +Kodak,5x5,ldr-rgb-kodak07.png,42.7516,7.2793,7.2559,0.0542 +Kodak,5x5,ldr-rgb-kodak08.png,38.5664,6.2940,6.2700,0.0627 +Kodak,5x5,ldr-rgb-kodak09.png,44.0633,7.9842,7.9616,0.0494 +Kodak,5x5,ldr-rgb-kodak10.png,43.6962,8.1048,8.0813,0.0487 +Kodak,5x5,ldr-rgb-kodak11.png,41.0278,6.7976,6.7744,0.0580 +Kodak,5x5,ldr-rgb-kodak12.png,44.5942,7.1934,7.1704,0.0548 +Kodak,5x5,ldr-rgb-kodak13.png,36.9674,5.8504,5.8290,0.0675 +Kodak,5x5,ldr-rgb-kodak14.png,38.9543,6.4038,6.3831,0.0616 +Kodak,5x5,ldr-rgb-kodak15.png,42.0724,6.9165,6.8913,0.0571 +Kodak,5x5,ldr-rgb-kodak16.png,44.2799,6.8320,6.8126,0.0577 +Kodak,5x5,ldr-rgb-kodak17.png,42.6542,7.2786,7.2520,0.0542 +Kodak,5x5,ldr-rgb-kodak18.png,38.5001,7.4058,7.3814,0.0533 +Kodak,5x5,ldr-rgb-kodak19.png,41.7874,7.5524,7.5282,0.0522 +Kodak,5x5,ldr-rgb-kodak20.png,43.2680,4.5892,4.5684,0.0861 +Kodak,5x5,ldr-rgb-kodak21.png,40.9004,7.7997,7.7778,0.0506 +Kodak,5x5,ldr-rgb-kodak22.png,40.4403,8.3635,8.3413,0.0471 +Kodak,5x5,ldr-rgb-kodak23.png,43.8325,8.0947,8.0725,0.0487 +Kodak,5x5,ldr-rgb-kodak24.png,38.3491,6.8702,6.8478,0.0574 +Kodak,6x6,ldr-rgb-kodak01.png,36.3958,9.2750,9.2509,0.0425 +Kodak,6x6,ldr-rgb-kodak02.png,39.3326,6.3790,6.3577,0.0618 +Kodak,6x6,ldr-rgb-kodak03.png,41.8057,5.7737,5.7516,0.0684 +Kodak,6x6,ldr-rgb-kodak04.png,39.7098,8.3652,8.3407,0.0471 +Kodak,6x6,ldr-rgb-kodak05.png,35.1214,9.8205,9.7995,0.0401 +Kodak,6x6,ldr-rgb-kodak06.png,37.8164,8.6271,8.6068,0.0457 +Kodak,6x6,ldr-rgb-kodak07.png,40.1017,7.1304,7.1068,0.0553 +Kodak,6x6,ldr-rgb-kodak08.png,35.2590,9.7251,9.7005,0.0405 +Kodak,6x6,ldr-rgb-kodak09.png,41.3708,9.6626,9.6401,0.0408 +Kodak,6x6,ldr-rgb-kodak10.png,40.9768,9.8171,9.7931,0.0402 +Kodak,6x6,ldr-rgb-kodak11.png,37.8425,8.4099,8.3899,0.0469 +Kodak,6x6,ldr-rgb-kodak12.png,41.8719,8.1255,8.1019,0.0485 +Kodak,6x6,ldr-rgb-kodak13.png,32.9868,9.8418,9.8205,0.0400 +Kodak,6x6,ldr-rgb-kodak14.png,36.0569,9.4282,9.4075,0.0418 +Kodak,6x6,ldr-rgb-kodak15.png,39.4497,6.8375,6.8154,0.0577 +Kodak,6x6,ldr-rgb-kodak16.png,41.2756,8.1452,8.1252,0.0484 +Kodak,6x6,ldr-rgb-kodak17.png,39.6566,9.0887,9.0647,0.0434 +Kodak,6x6,ldr-rgb-kodak18.png,35.5036,9.5551,9.5307,0.0413 +Kodak,6x6,ldr-rgb-kodak19.png,38.7496,9.9204,9.8946,0.0397 +Kodak,6x6,ldr-rgb-kodak20.png,40.1435,5.8973,5.8783,0.0669 +Kodak,6x6,ldr-rgb-kodak21.png,37.4049,10.0980,10.0777,0.0390 +Kodak,6x6,ldr-rgb-kodak22.png,37.7448,10.0570,10.0346,0.0392 +Kodak,6x6,ldr-rgb-kodak23.png,41.4675,8.0689,8.0483,0.0489 +Kodak,6x6,ldr-rgb-kodak24.png,35.2609,8.6651,8.6409,0.0455 +Kodak,8x8,ldr-rgb-kodak01.png,32.0036,8.9810,8.9607,0.0439 +Kodak,8x8,ldr-rgb-kodak02.png,36.2036,5.1360,5.1112,0.0769 +Kodak,8x8,ldr-rgb-kodak03.png,38.2809,3.4701,3.4479,0.1140 +Kodak,8x8,ldr-rgb-kodak04.png,36.4417,5.4494,5.4248,0.0725 +Kodak,8x8,ldr-rgb-kodak05.png,31.0496,8.9239,8.9006,0.0442 +Kodak,8x8,ldr-rgb-kodak06.png,33.6636,7.4671,7.4467,0.0528 +Kodak,8x8,ldr-rgb-kodak07.png,36.5939,4.0420,4.0185,0.0979 +Kodak,8x8,ldr-rgb-kodak08.png,30.8408,9.4845,9.4584,0.0416 +Kodak,8x8,ldr-rgb-kodak09.png,37.6558,4.0315,4.0088,0.0981 +Kodak,8x8,ldr-rgb-kodak10.png,37.3569,4.7377,4.7138,0.0834 +Kodak,8x8,ldr-rgb-kodak11.png,33.9220,7.6058,7.5857,0.0518 +Kodak,8x8,ldr-rgb-kodak12.png,38.3246,4.6602,4.6399,0.0847 +Kodak,8x8,ldr-rgb-kodak13.png,28.5441,9.9137,9.8864,0.0398 +Kodak,8x8,ldr-rgb-kodak14.png,32.4210,8.6986,8.6781,0.0453 +Kodak,8x8,ldr-rgb-kodak15.png,36.1296,5.0006,4.9786,0.0790 +Kodak,8x8,ldr-rgb-kodak16.png,37.3305,5.6860,5.6663,0.0694 +Kodak,8x8,ldr-rgb-kodak17.png,35.9749,5.1021,5.0775,0.0774 +Kodak,8x8,ldr-rgb-kodak18.png,31.7267,8.6451,8.6206,0.0456 +Kodak,8x8,ldr-rgb-kodak19.png,35.0194,6.1110,6.0873,0.0646 +Kodak,8x8,ldr-rgb-kodak20.png,36.2509,4.1276,4.1089,0.0957 +Kodak,8x8,ldr-rgb-kodak21.png,33.3103,6.0398,6.0185,0.0653 +Kodak,8x8,ldr-rgb-kodak22.png,34.3164,7.6081,7.5861,0.0518 +Kodak,8x8,ldr-rgb-kodak23.png,38.2762,3.5173,3.4969,0.1124 +Kodak,8x8,ldr-rgb-kodak24.png,31.3237,7.1897,7.1673,0.0549 +Kodak,12x12,ldr-rgb-kodak01.png,27.9682,7.7051,7.6847,0.0512 +Kodak,12x12,ldr-rgb-kodak02.png,33.0217,3.4642,3.4434,0.1142 +Kodak,12x12,ldr-rgb-kodak03.png,34.4032,2.5844,2.5654,0.1533 +Kodak,12x12,ldr-rgb-kodak04.png,32.9999,3.4384,3.4137,0.1152 +Kodak,12x12,ldr-rgb-kodak05.png,26.7014,7.5777,7.5568,0.0520 +Kodak,12x12,ldr-rgb-kodak06.png,29.6182,5.8284,5.8084,0.0677 +Kodak,12x12,ldr-rgb-kodak07.png,32.6525,3.1817,3.1583,0.1245 +Kodak,12x12,ldr-rgb-kodak08.png,26.3808,7.5944,7.5704,0.0519 +Kodak,12x12,ldr-rgb-kodak09.png,33.7583,2.5580,2.5349,0.1551 +Kodak,12x12,ldr-rgb-kodak10.png,33.0972,2.6170,2.5929,0.1516 +Kodak,12x12,ldr-rgb-kodak11.png,30.1526,5.3069,5.2866,0.0744 +Kodak,12x12,ldr-rgb-kodak12.png,34.5022,2.5662,2.5460,0.1544 +Kodak,12x12,ldr-rgb-kodak13.png,24.6492,9.0463,9.0250,0.0436 +Kodak,12x12,ldr-rgb-kodak14.png,28.6864,6.8615,6.8408,0.0575 +Kodak,12x12,ldr-rgb-kodak15.png,32.7192,3.4467,3.4243,0.1148 +Kodak,12x12,ldr-rgb-kodak16.png,33.3891,3.9866,3.9649,0.0992 +Kodak,12x12,ldr-rgb-kodak17.png,32.1893,3.2145,3.1902,0.1233 +Kodak,12x12,ldr-rgb-kodak18.png,27.9453,6.3770,6.3525,0.0619 +Kodak,12x12,ldr-rgb-kodak19.png,31.1852,5.1248,5.1005,0.0771 +Kodak,12x12,ldr-rgb-kodak20.png,32.2480,3.4326,3.4133,0.1152 +Kodak,12x12,ldr-rgb-kodak21.png,29.3696,4.4068,4.3865,0.0896 +Kodak,12x12,ldr-rgb-kodak22.png,30.8870,5.4251,5.4031,0.0728 +Kodak,12x12,ldr-rgb-kodak23.png,34.4615,1.9149,1.8943,0.2076 +Kodak,12x12,ldr-rgb-kodak24.png,27.2872,5.9108,5.8885,0.0668 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-avx2_fast_results.csv new file mode 100644 index 0000000..09cebeb --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-avx2_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.6362,0.0517,0.0310,12.6959 +Kodak,4x4,ldr-rgb-kodak02.png,43.9596,0.0693,0.0475,8.2730 +Kodak,4x4,ldr-rgb-kodak03.png,46.3784,0.0470,0.0278,14.1302 +Kodak,4x4,ldr-rgb-kodak04.png,44.3400,0.0667,0.0418,9.4046 +Kodak,4x4,ldr-rgb-kodak05.png,41.1974,0.0856,0.0636,6.1861 +Kodak,4x4,ldr-rgb-kodak06.png,44.5356,0.0508,0.0303,12.9839 +Kodak,4x4,ldr-rgb-kodak07.png,44.7761,0.0606,0.0369,10.6586 +Kodak,4x4,ldr-rgb-kodak08.png,41.7589,0.0909,0.0655,6.0045 +Kodak,4x4,ldr-rgb-kodak09.png,46.0465,0.0473,0.0242,16.2251 +Kodak,4x4,ldr-rgb-kodak10.png,45.8052,0.0490,0.0252,15.6299 +Kodak,4x4,ldr-rgb-kodak11.png,44.0023,0.0578,0.0374,10.5076 +Kodak,4x4,ldr-rgb-kodak12.png,46.9029,0.0437,0.0241,16.2849 +Kodak,4x4,ldr-rgb-kodak13.png,41.1448,0.0709,0.0488,8.0653 +Kodak,4x4,ldr-rgb-kodak14.png,41.3367,0.0765,0.0553,7.1070 +Kodak,4x4,ldr-rgb-kodak15.png,44.2560,0.0699,0.0474,8.2880 +Kodak,4x4,ldr-rgb-kodak16.png,47.0662,0.0395,0.0200,19.6873 +Kodak,4x4,ldr-rgb-kodak17.png,45.5399,0.0462,0.0219,17.9454 +Kodak,4x4,ldr-rgb-kodak18.png,41.2902,0.0837,0.0579,6.7879 +Kodak,4x4,ldr-rgb-kodak19.png,44.6098,0.0556,0.0308,12.7792 +Kodak,4x4,ldr-rgb-kodak20.png,46.0245,0.0457,0.0268,14.6629 +Kodak,4x4,ldr-rgb-kodak21.png,44.3823,0.0524,0.0318,12.3770 +Kodak,4x4,ldr-rgb-kodak22.png,42.8738,0.0732,0.0499,7.8738 +Kodak,4x4,ldr-rgb-kodak23.png,45.3386,0.0540,0.0331,11.8699 +Kodak,4x4,ldr-rgb-kodak24.png,41.2840,0.0738,0.0508,7.7423 +Kodak,5x5,ldr-rgb-kodak01.png,39.4696,0.0508,0.0293,13.4016 +Kodak,5x5,ldr-rgb-kodak02.png,40.4879,0.0493,0.0268,14.6585 +Kodak,5x5,ldr-rgb-kodak03.png,42.7782,0.0401,0.0202,19.4528 +Kodak,5x5,ldr-rgb-kodak04.png,41.0854,0.0501,0.0247,15.9294 +Kodak,5x5,ldr-rgb-kodak05.png,37.1642,0.0737,0.0510,7.7053 +Kodak,5x5,ldr-rgb-kodak06.png,40.4463,0.0455,0.0242,16.2634 +Kodak,5x5,ldr-rgb-kodak07.png,41.2332,0.0493,0.0249,15.8171 +Kodak,5x5,ldr-rgb-kodak08.png,37.5683,0.0788,0.0525,7.4954 +Kodak,5x5,ldr-rgb-kodak09.png,42.6821,0.0419,0.0187,21.0141 +Kodak,5x5,ldr-rgb-kodak10.png,42.4785,0.0440,0.0187,21.0084 +Kodak,5x5,ldr-rgb-kodak11.png,40.1373,0.0487,0.0276,14.2227 +Kodak,5x5,ldr-rgb-kodak12.png,43.2666,0.0378,0.0173,22.6859 +Kodak,5x5,ldr-rgb-kodak13.png,36.7049,0.0666,0.0436,9.0152 +Kodak,5x5,ldr-rgb-kodak14.png,37.6406,0.0683,0.0463,8.4970 +Kodak,5x5,ldr-rgb-kodak15.png,41.0230,0.0502,0.0271,14.5237 +Kodak,5x5,ldr-rgb-kodak16.png,43.3875,0.0361,0.0156,25.2255 +Kodak,5x5,ldr-rgb-kodak17.png,41.9060,0.0428,0.0177,22.1953 +Kodak,5x5,ldr-rgb-kodak18.png,37.9754,0.0638,0.0376,10.4701 +Kodak,5x5,ldr-rgb-kodak19.png,40.9776,0.0479,0.0223,17.6093 +Kodak,5x5,ldr-rgb-kodak20.png,42.1605,0.0396,0.0200,19.6756 +Kodak,5x5,ldr-rgb-kodak21.png,40.2880,0.0474,0.0260,15.1313 +Kodak,5x5,ldr-rgb-kodak22.png,39.6302,0.0546,0.0306,12.8422 +Kodak,5x5,ldr-rgb-kodak23.png,42.2432,0.0424,0.0209,18.8585 +Kodak,5x5,ldr-rgb-kodak24.png,37.6337,0.0606,0.0369,10.6632 +Kodak,6x6,ldr-rgb-kodak01.png,35.7062,0.0722,0.0494,7.9602 +Kodak,6x6,ldr-rgb-kodak02.png,38.0983,0.0551,0.0311,12.6375 +Kodak,6x6,ldr-rgb-kodak03.png,40.4255,0.0431,0.0219,17.9953 +Kodak,6x6,ldr-rgb-kodak04.png,38.4693,0.0556,0.0289,13.6222 +Kodak,6x6,ldr-rgb-kodak05.png,34.2092,0.1056,0.0815,4.8227 +Kodak,6x6,ldr-rgb-kodak06.png,37.2296,0.0575,0.0350,11.2411 +Kodak,6x6,ldr-rgb-kodak07.png,38.7204,0.0577,0.0317,12.4055 +Kodak,6x6,ldr-rgb-kodak08.png,34.3095,0.1146,0.0870,4.5221 +Kodak,6x6,ldr-rgb-kodak09.png,39.8453,0.0481,0.0232,16.9462 +Kodak,6x6,ldr-rgb-kodak10.png,39.6405,0.0500,0.0239,16.4347 +Kodak,6x6,ldr-rgb-kodak11.png,37.0549,0.0619,0.0394,9.9872 +Kodak,6x6,ldr-rgb-kodak12.png,40.6359,0.0415,0.0202,19.5096 +Kodak,6x6,ldr-rgb-kodak13.png,32.7172,0.1169,0.0928,4.2356 +Kodak,6x6,ldr-rgb-kodak14.png,35.0670,0.0877,0.0644,6.1027 +Kodak,6x6,ldr-rgb-kodak15.png,38.4497,0.0567,0.0324,12.1464 +Kodak,6x6,ldr-rgb-kodak16.png,40.4456,0.0401,0.0188,20.9056 +Kodak,6x6,ldr-rgb-kodak17.png,38.8641,0.0504,0.0246,15.9610 +Kodak,6x6,ldr-rgb-kodak18.png,35.0361,0.0827,0.0550,7.1551 +Kodak,6x6,ldr-rgb-kodak19.png,37.8965,0.0591,0.0324,12.1340 +Kodak,6x6,ldr-rgb-kodak20.png,39.0600,0.0489,0.0278,14.1216 +Kodak,6x6,ldr-rgb-kodak21.png,36.8326,0.0653,0.0426,9.2378 +Kodak,6x6,ldr-rgb-kodak22.png,36.8833,0.0641,0.0390,10.0713 +Kodak,6x6,ldr-rgb-kodak23.png,39.9669,0.0459,0.0231,17.0527 +Kodak,6x6,ldr-rgb-kodak24.png,34.6964,0.0809,0.0560,7.0201 +Kodak,8x8,ldr-rgb-kodak01.png,31.2727,0.0848,0.0571,6.8898 +Kodak,8x8,ldr-rgb-kodak02.png,34.8438,0.0577,0.0290,13.5372 +Kodak,8x8,ldr-rgb-kodak03.png,36.4894,0.0486,0.0224,17.5316 +Kodak,8x8,ldr-rgb-kodak04.png,35.1177,0.0589,0.0271,14.5275 +Kodak,8x8,ldr-rgb-kodak05.png,30.1259,0.1195,0.0905,4.3471 +Kodak,8x8,ldr-rgb-kodak06.png,32.8371,0.0688,0.0413,9.5111 +Kodak,8x8,ldr-rgb-kodak07.png,34.8925,0.0622,0.0316,12.4435 +Kodak,8x8,ldr-rgb-kodak08.png,29.8620,0.1373,0.1050,3.7441 +Kodak,8x8,ldr-rgb-kodak09.png,35.9887,0.0551,0.0253,15.5354 +Kodak,8x8,ldr-rgb-kodak10.png,35.7828,0.0555,0.0246,16.0143 +Kodak,8x8,ldr-rgb-kodak11.png,32.8947,0.0702,0.0433,9.0745 +Kodak,8x8,ldr-rgb-kodak12.png,36.6150,0.0486,0.0221,17.7556 +Kodak,8x8,ldr-rgb-kodak13.png,28.1483,0.1396,0.1109,3.5459 +Kodak,8x8,ldr-rgb-kodak14.png,31.3720,0.0955,0.0675,5.8267 +Kodak,8x8,ldr-rgb-kodak15.png,34.8334,0.0598,0.0306,12.8704 +Kodak,8x8,ldr-rgb-kodak16.png,35.9796,0.0494,0.0230,17.1059 +Kodak,8x8,ldr-rgb-kodak17.png,34.7832,0.0576,0.0272,14.4321 +Kodak,8x8,ldr-rgb-kodak18.png,31.1770,0.0896,0.0570,6.9024 +Kodak,8x8,ldr-rgb-kodak19.png,33.9922,0.0654,0.0337,11.6661 +Kodak,8x8,ldr-rgb-kodak20.png,35.1135,0.0544,0.0286,13.7686 +Kodak,8x8,ldr-rgb-kodak21.png,32.6736,0.0731,0.0456,8.6197 +Kodak,8x8,ldr-rgb-kodak22.png,33.3695,0.0673,0.0373,10.5318 +Kodak,8x8,ldr-rgb-kodak23.png,36.4675,0.0487,0.0216,18.1800 +Kodak,8x8,ldr-rgb-kodak24.png,30.7403,0.0892,0.0594,6.6179 +Kodak,12x12,ldr-rgb-kodak01.png,27.1278,0.0755,0.0395,9.9571 +Kodak,12x12,ldr-rgb-kodak02.png,31.0894,0.0536,0.0167,23.5136 +Kodak,12x12,ldr-rgb-kodak03.png,32.7039,0.0484,0.0143,27.4229 +Kodak,12x12,ldr-rgb-kodak04.png,31.5079,0.0531,0.0137,28.7209 +Kodak,12x12,ldr-rgb-kodak05.png,25.7719,0.0850,0.0482,8.1589 +Kodak,12x12,ldr-rgb-kodak06.png,28.6463,0.0652,0.0301,13.0533 +Kodak,12x12,ldr-rgb-kodak07.png,30.8159,0.0566,0.0185,21.2422 +Kodak,12x12,ldr-rgb-kodak08.png,25.3175,0.1014,0.0609,6.4562 +Kodak,12x12,ldr-rgb-kodak09.png,31.7731,0.0538,0.0165,23.8371 +Kodak,12x12,ldr-rgb-kodak10.png,31.4981,0.0561,0.0167,23.4785 +Kodak,12x12,ldr-rgb-kodak11.png,28.9301,0.0598,0.0246,15.9844 +Kodak,12x12,ldr-rgb-kodak12.png,32.5101,0.0502,0.0154,25.5316 +Kodak,12x12,ldr-rgb-kodak13.png,24.2865,0.1067,0.0693,5.6737 +Kodak,12x12,ldr-rgb-kodak14.png,27.5084,0.0682,0.0324,12.1198 +Kodak,12x12,ldr-rgb-kodak15.png,31.3106,0.0576,0.0201,19.5815 +Kodak,12x12,ldr-rgb-kodak16.png,31.4372,0.0500,0.0159,24.7571 +Kodak,12x12,ldr-rgb-kodak17.png,30.8227,0.0567,0.0175,22.4171 +Kodak,12x12,ldr-rgb-kodak18.png,27.3907,0.0728,0.0326,12.0444 +Kodak,12x12,ldr-rgb-kodak19.png,30.0601,0.0612,0.0221,17.8095 +Kodak,12x12,ldr-rgb-kodak20.png,31.0166,0.0544,0.0210,18.7594 +Kodak,12x12,ldr-rgb-kodak21.png,28.6979,0.0630,0.0279,14.1120 +Kodak,12x12,ldr-rgb-kodak22.png,29.7631,0.0574,0.0198,19.8875 +Kodak,12x12,ldr-rgb-kodak23.png,32.4815,0.0519,0.0166,23.6407 +Kodak,12x12,ldr-rgb-kodak24.png,26.7141,0.0768,0.0391,10.0520 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-avx2_fastest_results.csv new file mode 100644 index 0000000..e201772 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-avx2_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,43.5439,0.0349,0.0152,25.9192 +Kodak,4x4,ldr-rgb-kodak02.png,42.3910,0.0394,0.0188,20.9433 +Kodak,4x4,ldr-rgb-kodak03.png,44.7710,0.0353,0.0173,22.7422 +Kodak,4x4,ldr-rgb-kodak04.png,42.9605,0.0408,0.0179,21.9958 +Kodak,4x4,ldr-rgb-kodak05.png,39.9764,0.0468,0.0263,14.9455 +Kodak,4x4,ldr-rgb-kodak06.png,43.6529,0.0346,0.0155,25.3246 +Kodak,4x4,ldr-rgb-kodak07.png,43.4729,0.0404,0.0184,21.3459 +Kodak,4x4,ldr-rgb-kodak08.png,40.5055,0.0472,0.0237,16.5977 +Kodak,4x4,ldr-rgb-kodak09.png,45.0938,0.0367,0.0152,25.9001 +Kodak,4x4,ldr-rgb-kodak10.png,44.8382,0.0379,0.0152,25.9290 +Kodak,4x4,ldr-rgb-kodak11.png,42.8561,0.0362,0.0169,23.2409 +Kodak,4x4,ldr-rgb-kodak12.png,45.6610,0.0339,0.0153,25.6201 +Kodak,4x4,ldr-rgb-kodak13.png,40.3315,0.0418,0.0210,18.6899 +Kodak,4x4,ldr-rgb-kodak14.png,39.7166,0.0490,0.0293,13.4333 +Kodak,4x4,ldr-rgb-kodak15.png,42.9403,0.0399,0.0188,20.9425 +Kodak,4x4,ldr-rgb-kodak16.png,46.4214,0.0318,0.0133,29.6316 +Kodak,4x4,ldr-rgb-kodak17.png,44.8172,0.0373,0.0149,26.4153 +Kodak,4x4,ldr-rgb-kodak18.png,40.5153,0.0443,0.0204,19.2510 +Kodak,4x4,ldr-rgb-kodak19.png,43.7124,0.0376,0.0148,26.5045 +Kodak,4x4,ldr-rgb-kodak20.png,44.8759,0.0332,0.0154,25.5368 +Kodak,4x4,ldr-rgb-kodak21.png,43.5022,0.0355,0.0161,24.4144 +Kodak,4x4,ldr-rgb-kodak22.png,41.8493,0.0400,0.0181,21.7137 +Kodak,4x4,ldr-rgb-kodak23.png,44.0973,0.0363,0.0165,23.7623 +Kodak,4x4,ldr-rgb-kodak24.png,40.1136,0.0472,0.0257,15.2741 +Kodak,5x5,ldr-rgb-kodak01.png,38.3571,0.0301,0.0101,39.1137 +Kodak,5x5,ldr-rgb-kodak02.png,39.7704,0.0316,0.0104,37.9736 +Kodak,5x5,ldr-rgb-kodak03.png,41.5780,0.0292,0.0107,36.5886 +Kodak,5x5,ldr-rgb-kodak04.png,39.9202,0.0338,0.0104,37.7294 +Kodak,5x5,ldr-rgb-kodak05.png,36.0227,0.0350,0.0141,27.9570 +Kodak,5x5,ldr-rgb-kodak06.png,39.3863,0.0299,0.0103,38.1104 +Kodak,5x5,ldr-rgb-kodak07.png,39.9992,0.0329,0.0103,38.1766 +Kodak,5x5,ldr-rgb-kodak08.png,36.1442,0.0359,0.0119,32.9110 +Kodak,5x5,ldr-rgb-kodak09.png,41.5024,0.0317,0.0100,39.3695 +Kodak,5x5,ldr-rgb-kodak10.png,41.4638,0.0331,0.0102,38.6191 +Kodak,5x5,ldr-rgb-kodak11.png,39.2621,0.0303,0.0106,37.0505 +Kodak,5x5,ldr-rgb-kodak12.png,42.2647,0.0292,0.0103,38.2138 +Kodak,5x5,ldr-rgb-kodak13.png,36.1796,0.0331,0.0121,32.5242 +Kodak,5x5,ldr-rgb-kodak14.png,36.6143,0.0364,0.0162,24.2112 +Kodak,5x5,ldr-rgb-kodak15.png,39.9014,0.0322,0.0107,36.8181 +Kodak,5x5,ldr-rgb-kodak16.png,42.5270,0.0283,0.0094,41.7737 +Kodak,5x5,ldr-rgb-kodak17.png,41.0632,0.0332,0.0103,38.0761 +Kodak,5x5,ldr-rgb-kodak18.png,37.3941,0.0358,0.0116,33.8457 +Kodak,5x5,ldr-rgb-kodak19.png,39.5696,0.0338,0.0102,38.5019 +Kodak,5x5,ldr-rgb-kodak20.png,40.9808,0.0283,0.0101,39.0442 +Kodak,5x5,ldr-rgb-kodak21.png,39.3545,0.0299,0.0101,38.9741 +Kodak,5x5,ldr-rgb-kodak22.png,38.8716,0.0331,0.0108,36.3715 +Kodak,5x5,ldr-rgb-kodak23.png,41.0132,0.0306,0.0103,38.1431 +Kodak,5x5,ldr-rgb-kodak24.png,37.0072,0.0357,0.0137,28.6640 +Kodak,6x6,ldr-rgb-kodak01.png,34.1244,0.0309,0.0104,37.9552 +Kodak,6x6,ldr-rgb-kodak02.png,37.0151,0.0314,0.0095,41.1833 +Kodak,6x6,ldr-rgb-kodak03.png,39.2769,0.0286,0.0095,41.2998 +Kodak,6x6,ldr-rgb-kodak04.png,37.2082,0.0337,0.0095,41.3174 +Kodak,6x6,ldr-rgb-kodak05.png,32.8285,0.0359,0.0142,27.7030 +Kodak,6x6,ldr-rgb-kodak06.png,36.1262,0.0301,0.0101,39.0914 +Kodak,6x6,ldr-rgb-kodak07.png,37.3637,0.0326,0.0096,40.8842 +Kodak,6x6,ldr-rgb-kodak08.png,32.6248,0.0381,0.0137,28.6809 +Kodak,6x6,ldr-rgb-kodak09.png,38.0793,0.0317,0.0095,41.5046 +Kodak,6x6,ldr-rgb-kodak10.png,38.2970,0.0333,0.0099,39.7108 +Kodak,6x6,ldr-rgb-kodak11.png,35.9521,0.0306,0.0105,37.4459 +Kodak,6x6,ldr-rgb-kodak12.png,39.3986,0.0288,0.0092,42.5650 +Kodak,6x6,ldr-rgb-kodak13.png,31.8578,0.0365,0.0151,25.9842 +Kodak,6x6,ldr-rgb-kodak14.png,33.9144,0.0358,0.0152,25.8696 +Kodak,6x6,ldr-rgb-kodak15.png,37.0909,0.0319,0.0098,40.2879 +Kodak,6x6,ldr-rgb-kodak16.png,39.5325,0.0280,0.0087,45.4106 +Kodak,6x6,ldr-rgb-kodak17.png,37.6039,0.0334,0.0098,40.0424 +Kodak,6x6,ldr-rgb-kodak18.png,34.2009,0.0364,0.0116,33.7958 +Kodak,6x6,ldr-rgb-kodak19.png,36.1180,0.0339,0.0103,38.1722 +Kodak,6x6,ldr-rgb-kodak20.png,37.6829,0.0287,0.0095,41.1792 +Kodak,6x6,ldr-rgb-kodak21.png,35.8173,0.0300,0.0099,39.9203 +Kodak,6x6,ldr-rgb-kodak22.png,35.7856,0.0331,0.0104,37.7510 +Kodak,6x6,ldr-rgb-kodak23.png,38.7390,0.0302,0.0097,40.5375 +Kodak,6x6,ldr-rgb-kodak24.png,33.8259,0.0363,0.0134,29.3266 +Kodak,8x8,ldr-rgb-kodak01.png,29.2123,0.0354,0.0104,37.9736 +Kodak,8x8,ldr-rgb-kodak02.png,33.3692,0.0362,0.0105,37.4136 +Kodak,8x8,ldr-rgb-kodak03.png,35.0174,0.0319,0.0085,46.1140 +Kodak,8x8,ldr-rgb-kodak04.png,33.8136,0.0375,0.0094,41.9746 +Kodak,8x8,ldr-rgb-kodak05.png,28.4620,0.0394,0.0134,29.3647 +Kodak,8x8,ldr-rgb-kodak06.png,30.6937,0.0343,0.0101,39.0091 +Kodak,8x8,ldr-rgb-kodak07.png,33.0023,0.0363,0.0091,43.3687 +Kodak,8x8,ldr-rgb-kodak08.png,27.8612,0.0447,0.0156,25.1578 +Kodak,8x8,ldr-rgb-kodak09.png,33.9184,0.0358,0.0090,43.5703 +Kodak,8x8,ldr-rgb-kodak10.png,34.1882,0.0370,0.0092,42.7959 +Kodak,8x8,ldr-rgb-kodak11.png,31.4228,0.0344,0.0100,39.4326 +Kodak,8x8,ldr-rgb-kodak12.png,34.6499,0.0329,0.0092,42.9050 +Kodak,8x8,ldr-rgb-kodak13.png,27.2873,0.0430,0.0171,23.0570 +Kodak,8x8,ldr-rgb-kodak14.png,29.8587,0.0375,0.0123,31.9248 +Kodak,8x8,ldr-rgb-kodak15.png,33.0416,0.0372,0.0109,35.9271 +Kodak,8x8,ldr-rgb-kodak16.png,33.7001,0.0319,0.0084,46.9569 +Kodak,8x8,ldr-rgb-kodak17.png,33.3066,0.0373,0.0095,41.4660 +Kodak,8x8,ldr-rgb-kodak18.png,30.0964,0.0406,0.0116,34.0090 +Kodak,8x8,ldr-rgb-kodak19.png,31.7467,0.0383,0.0105,37.2750 +Kodak,8x8,ldr-rgb-kodak20.png,33.5181,0.0323,0.0093,42.3856 +Kodak,8x8,ldr-rgb-kodak21.png,31.1048,0.0345,0.0102,38.6825 +Kodak,8x8,ldr-rgb-kodak22.png,32.0928,0.0362,0.0095,41.3298 +Kodak,8x8,ldr-rgb-kodak23.png,35.0552,0.0343,0.0092,42.9184 +Kodak,8x8,ldr-rgb-kodak24.png,29.9371,0.0404,0.0135,29.2004 +Kodak,12x12,ldr-rgb-kodak01.png,25.3172,0.0375,0.0077,51.2609 +Kodak,12x12,ldr-rgb-kodak02.png,30.3378,0.0384,0.0079,49.9385 +Kodak,12x12,ldr-rgb-kodak03.png,31.7897,0.0358,0.0076,52.0339 +Kodak,12x12,ldr-rgb-kodak04.png,30.7778,0.0410,0.0081,48.3770 +Kodak,12x12,ldr-rgb-kodak05.png,24.5398,0.0388,0.0083,47.4965 +Kodak,12x12,ldr-rgb-kodak06.png,26.5395,0.0372,0.0082,47.9243 +Kodak,12x12,ldr-rgb-kodak07.png,30.0574,0.0396,0.0075,52.3378 +Kodak,12x12,ldr-rgb-kodak08.png,23.2566,0.0434,0.0100,39.2309 +Kodak,12x12,ldr-rgb-kodak09.png,30.3245,0.0391,0.0076,51.7320 +Kodak,12x12,ldr-rgb-kodak10.png,30.4108,0.0401,0.0077,50.9143 +Kodak,12x12,ldr-rgb-kodak11.png,27.8367,0.0369,0.0079,49.7232 +Kodak,12x12,ldr-rgb-kodak12.png,30.2343,0.0359,0.0078,50.4703 +Kodak,12x12,ldr-rgb-kodak13.png,23.3246,0.0402,0.0096,40.8923 +Kodak,12x12,ldr-rgb-kodak14.png,26.5712,0.0381,0.0078,50.4178 +Kodak,12x12,ldr-rgb-kodak15.png,29.1919,0.0393,0.0084,46.9008 +Kodak,12x12,ldr-rgb-kodak16.png,30.1981,0.0359,0.0077,51.2338 +Kodak,12x12,ldr-rgb-kodak17.png,30.0910,0.0402,0.0075,52.1096 +Kodak,12x12,ldr-rgb-kodak18.png,26.6954,0.0421,0.0083,47.6226 +Kodak,12x12,ldr-rgb-kodak19.png,27.4935,0.0409,0.0081,48.3770 +Kodak,12x12,ldr-rgb-kodak20.png,29.6676,0.0355,0.0077,51.3678 +Kodak,12x12,ldr-rgb-kodak21.png,27.3710,0.0374,0.0083,47.6281 +Kodak,12x12,ldr-rgb-kodak22.png,28.7849,0.0394,0.0079,49.7427 +Kodak,12x12,ldr-rgb-kodak23.png,31.5692,0.0388,0.0089,43.9781 +Kodak,12x12,ldr-rgb-kodak24.png,26.0587,0.0405,0.0090,43.8705 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-avx2_medium_results.csv new file mode 100644 index 0000000..2140d31 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-avx2_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.1468,0.2150,0.1949,2.0173 +Kodak,4x4,ldr-rgb-kodak02.png,45.0582,0.3491,0.3270,1.2023 +Kodak,4x4,ldr-rgb-kodak03.png,47.3861,0.1644,0.1459,2.6952 +Kodak,4x4,ldr-rgb-kodak04.png,45.1833,0.2518,0.2284,1.7218 +Kodak,4x4,ldr-rgb-kodak05.png,41.9665,0.2938,0.2731,1.4396 +Kodak,4x4,ldr-rgb-kodak06.png,45.0092,0.2034,0.1838,2.1391 +Kodak,4x4,ldr-rgb-kodak07.png,45.7464,0.2077,0.1854,2.1208 +Kodak,4x4,ldr-rgb-kodak08.png,42.3737,0.3158,0.2919,1.3470 +Kodak,4x4,ldr-rgb-kodak09.png,46.9783,0.2739,0.2519,1.5610 +Kodak,4x4,ldr-rgb-kodak10.png,46.6765,0.3242,0.3013,1.3052 +Kodak,4x4,ldr-rgb-kodak11.png,44.6907,0.2898,0.2702,1.4555 +Kodak,4x4,ldr-rgb-kodak12.png,47.7516,0.1892,0.1706,2.3052 +Kodak,4x4,ldr-rgb-kodak13.png,41.4622,0.2301,0.2090,1.8817 +Kodak,4x4,ldr-rgb-kodak14.png,42.3713,0.2644,0.2445,1.6082 +Kodak,4x4,ldr-rgb-kodak15.png,45.1851,0.2225,0.2010,1.9560 +Kodak,4x4,ldr-rgb-kodak16.png,47.7319,0.1893,0.1704,2.3075 +Kodak,4x4,ldr-rgb-kodak17.png,46.1732,0.2182,0.1953,2.0135 +Kodak,4x4,ldr-rgb-kodak18.png,41.8328,0.3327,0.3087,1.2740 +Kodak,4x4,ldr-rgb-kodak19.png,45.1811,0.2757,0.2523,1.5585 +Kodak,4x4,ldr-rgb-kodak20.png,46.7334,0.1615,0.1432,2.7468 +Kodak,4x4,ldr-rgb-kodak21.png,45.0262,0.2951,0.2757,1.4265 +Kodak,4x4,ldr-rgb-kodak22.png,43.5754,0.3486,0.3264,1.2045 +Kodak,4x4,ldr-rgb-kodak23.png,46.5536,0.2843,0.2641,1.4887 +Kodak,4x4,ldr-rgb-kodak24.png,42.1234,0.2597,0.2376,1.6552 +Kodak,5x5,ldr-rgb-kodak01.png,40.0595,0.2355,0.2142,1.8354 +Kodak,5x5,ldr-rgb-kodak02.png,41.5953,0.2706,0.2483,1.5833 +Kodak,5x5,ldr-rgb-kodak03.png,43.8592,0.1127,0.0932,4.2195 +Kodak,5x5,ldr-rgb-kodak04.png,41.9534,0.1979,0.1730,2.2730 +Kodak,5x5,ldr-rgb-kodak05.png,37.8994,0.2904,0.2683,1.4656 +Kodak,5x5,ldr-rgb-kodak06.png,40.8860,0.1808,0.1602,2.4542 +Kodak,5x5,ldr-rgb-kodak07.png,42.2937,0.1578,0.1344,2.9251 +Kodak,5x5,ldr-rgb-kodak08.png,38.2680,0.3093,0.2842,1.3834 +Kodak,5x5,ldr-rgb-kodak09.png,43.6779,0.1245,0.1013,3.8799 +Kodak,5x5,ldr-rgb-kodak10.png,43.3008,0.1471,0.1231,3.1943 +Kodak,5x5,ldr-rgb-kodak11.png,40.7541,0.2240,0.2033,1.9346 +Kodak,5x5,ldr-rgb-kodak12.png,44.2374,0.1124,0.0924,4.2551 +Kodak,5x5,ldr-rgb-kodak13.png,36.8520,0.2471,0.2250,1.7475 +Kodak,5x5,ldr-rgb-kodak14.png,38.5557,0.2577,0.2364,1.6631 +Kodak,5x5,ldr-rgb-kodak15.png,41.7817,0.1932,0.1706,2.3044 +Kodak,5x5,ldr-rgb-kodak16.png,44.0360,0.1229,0.1028,3.8238 +Kodak,5x5,ldr-rgb-kodak17.png,42.4423,0.1299,0.1060,3.7105 +Kodak,5x5,ldr-rgb-kodak18.png,38.3073,0.2696,0.2441,1.6111 +Kodak,5x5,ldr-rgb-kodak19.png,41.5356,0.1731,0.1484,2.6490 +Kodak,5x5,ldr-rgb-kodak20.png,42.8339,0.1251,0.1056,3.7229 +Kodak,5x5,ldr-rgb-kodak21.png,40.7045,0.1810,0.1602,2.4544 +Kodak,5x5,ldr-rgb-kodak22.png,40.2125,0.2632,0.2400,1.6384 +Kodak,5x5,ldr-rgb-kodak23.png,43.3590,0.1621,0.1409,2.7913 +Kodak,5x5,ldr-rgb-kodak24.png,38.0472,0.2228,0.1999,1.9669 +Kodak,6x6,ldr-rgb-kodak01.png,36.1493,0.3459,0.3233,1.2162 +Kodak,6x6,ldr-rgb-kodak02.png,38.9197,0.2234,0.1998,1.9678 +Kodak,6x6,ldr-rgb-kodak03.png,41.1619,0.1151,0.0944,4.1639 +Kodak,6x6,ldr-rgb-kodak04.png,39.2634,0.1921,0.1663,2.3648 +Kodak,6x6,ldr-rgb-kodak05.png,34.7198,0.3673,0.3439,1.1433 +Kodak,6x6,ldr-rgb-kodak06.png,37.5615,0.2239,0.2018,1.9487 +Kodak,6x6,ldr-rgb-kodak07.png,39.6600,0.1628,0.1377,2.8550 +Kodak,6x6,ldr-rgb-kodak08.png,34.9309,0.4079,0.3818,1.0300 +Kodak,6x6,ldr-rgb-kodak09.png,40.7136,0.1202,0.0958,4.1050 +Kodak,6x6,ldr-rgb-kodak10.png,40.3347,0.1283,0.1028,3.8269 +Kodak,6x6,ldr-rgb-kodak11.png,37.5085,0.2272,0.2054,1.9146 +Kodak,6x6,ldr-rgb-kodak12.png,41.2787,0.1019,0.0804,4.8901 +Kodak,6x6,ldr-rgb-kodak13.png,32.8322,0.4110,0.3876,1.0145 +Kodak,6x6,ldr-rgb-kodak14.png,35.7517,0.2827,0.2601,1.5117 +Kodak,6x6,ldr-rgb-kodak15.png,39.0601,0.1970,0.1732,2.2698 +Kodak,6x6,ldr-rgb-kodak16.png,40.8802,0.1282,0.1069,3.6767 +Kodak,6x6,ldr-rgb-kodak17.png,39.3467,0.1341,0.1088,3.6137 +Kodak,6x6,ldr-rgb-kodak18.png,35.2971,0.3016,0.2749,1.4305 +Kodak,6x6,ldr-rgb-kodak19.png,38.4283,0.2188,0.1930,2.0371 +Kodak,6x6,ldr-rgb-kodak20.png,39.6563,0.1525,0.1319,2.9821 +Kodak,6x6,ldr-rgb-kodak21.png,37.1184,0.2175,0.1953,2.0135 +Kodak,6x6,ldr-rgb-kodak22.png,37.3676,0.2638,0.2391,1.6444 +Kodak,6x6,ldr-rgb-kodak23.png,40.7804,0.1190,0.0964,4.0783 +Kodak,6x6,ldr-rgb-kodak24.png,34.9818,0.2596,0.2352,1.6716 +Kodak,8x8,ldr-rgb-kodak01.png,31.7277,0.4133,0.3856,1.0197 +Kodak,8x8,ldr-rgb-kodak02.png,35.5931,0.1915,0.1632,2.4092 +Kodak,8x8,ldr-rgb-kodak03.png,37.5035,0.1306,0.1048,3.7521 +Kodak,8x8,ldr-rgb-kodak04.png,35.8535,0.1806,0.1499,2.6238 +Kodak,8x8,ldr-rgb-kodak05.png,30.6505,0.4349,0.4066,0.9671 +Kodak,8x8,ldr-rgb-kodak06.png,33.3520,0.2462,0.2190,1.7955 +Kodak,8x8,ldr-rgb-kodak07.png,35.9153,0.1787,0.1488,2.6431 +Kodak,8x8,ldr-rgb-kodak08.png,30.5109,0.4532,0.4215,0.9329 +Kodak,8x8,ldr-rgb-kodak09.png,37.0162,0.1250,0.0955,4.1167 +Kodak,8x8,ldr-rgb-kodak10.png,36.6070,0.1251,0.0944,4.1633 +Kodak,8x8,ldr-rgb-kodak11.png,33.5011,0.2289,0.2019,1.9479 +Kodak,8x8,ldr-rgb-kodak12.png,37.5102,0.1110,0.0845,4.6519 +Kodak,8x8,ldr-rgb-kodak13.png,28.3333,0.4777,0.4491,0.8756 +Kodak,8x8,ldr-rgb-kodak14.png,32.0366,0.3090,0.2814,1.3973 +Kodak,8x8,ldr-rgb-kodak15.png,35.6876,0.1832,0.1542,2.5493 +Kodak,8x8,ldr-rgb-kodak16.png,36.7615,0.1368,0.1104,3.5619 +Kodak,8x8,ldr-rgb-kodak17.png,35.4203,0.1416,0.1110,3.5417 +Kodak,8x8,ldr-rgb-kodak18.png,31.4649,0.3101,0.2783,1.4127 +Kodak,8x8,ldr-rgb-kodak19.png,34.6426,0.2274,0.1964,2.0018 +Kodak,8x8,ldr-rgb-kodak20.png,35.7657,0.1702,0.1444,2.7233 +Kodak,8x8,ldr-rgb-kodak21.png,33.0156,0.2479,0.2206,1.7827 +Kodak,8x8,ldr-rgb-kodak22.png,33.8790,0.2449,0.2151,1.8277 +Kodak,8x8,ldr-rgb-kodak23.png,37.3540,0.1111,0.0835,4.7109 +Kodak,8x8,ldr-rgb-kodak24.png,31.0072,0.2718,0.2423,1.6230 +Kodak,12x12,ldr-rgb-kodak01.png,27.6608,0.3732,0.3354,1.1725 +Kodak,12x12,ldr-rgb-kodak02.png,32.1871,0.1106,0.0723,5.4362 +Kodak,12x12,ldr-rgb-kodak03.png,33.5190,0.1020,0.0661,5.9509 +Kodak,12x12,ldr-rgb-kodak04.png,32.1660,0.1033,0.0623,6.3166 +Kodak,12x12,ldr-rgb-kodak05.png,26.2987,0.4037,0.3654,1.0760 +Kodak,12x12,ldr-rgb-kodak06.png,29.1762,0.2129,0.1756,2.2388 +Kodak,12x12,ldr-rgb-kodak07.png,31.6474,0.1525,0.1124,3.4997 +Kodak,12x12,ldr-rgb-kodak08.png,25.9822,0.4317,0.3907,1.0065 +Kodak,12x12,ldr-rgb-kodak09.png,32.7718,0.1096,0.0697,5.6377 +Kodak,12x12,ldr-rgb-kodak10.png,32.1341,0.1091,0.0687,5.7268 +Kodak,12x12,ldr-rgb-kodak11.png,29.5158,0.1896,0.1528,2.5739 +Kodak,12x12,ldr-rgb-kodak12.png,33.4531,0.0922,0.0556,7.0772 +Kodak,12x12,ldr-rgb-kodak13.png,24.4685,0.4375,0.3992,0.9849 +Kodak,12x12,ldr-rgb-kodak14.png,28.1839,0.2475,0.2100,1.8720 +Kodak,12x12,ldr-rgb-kodak15.png,31.9836,0.1412,0.1028,3.8242 +Kodak,12x12,ldr-rgb-kodak16.png,32.5502,0.0936,0.0572,6.8717 +Kodak,12x12,ldr-rgb-kodak17.png,31.3724,0.1099,0.0693,5.6739 +Kodak,12x12,ldr-rgb-kodak18.png,27.6755,0.2489,0.2078,1.8920 +Kodak,12x12,ldr-rgb-kodak19.png,30.7195,0.1569,0.1159,3.3931 +Kodak,12x12,ldr-rgb-kodak20.png,31.6756,0.1320,0.0963,4.0826 +Kodak,12x12,ldr-rgb-kodak21.png,29.0798,0.2555,0.2184,1.8004 +Kodak,12x12,ldr-rgb-kodak22.png,30.2930,0.1673,0.1277,3.0793 +Kodak,12x12,ldr-rgb-kodak23.png,33.2872,0.0900,0.0520,7.5549 +Kodak,12x12,ldr-rgb-kodak24.png,26.9494,0.2217,0.1825,2.1552 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-avx2_thorough_results.csv new file mode 100644 index 0000000..77d1789 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-avx2_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.4689,0.7371,0.7171,0.5484 +Kodak,4x4,ldr-rgb-kodak02.png,45.6389,0.9643,0.9434,0.4168 +Kodak,4x4,ldr-rgb-kodak03.png,47.9597,0.8433,0.8250,0.4766 +Kodak,4x4,ldr-rgb-kodak04.png,45.6446,0.9102,0.8867,0.4435 +Kodak,4x4,ldr-rgb-kodak05.png,42.3992,0.8271,0.8063,0.4877 +Kodak,4x4,ldr-rgb-kodak06.png,45.3144,0.7624,0.7429,0.5293 +Kodak,4x4,ldr-rgb-kodak07.png,46.3216,0.8843,0.8619,0.4562 +Kodak,4x4,ldr-rgb-kodak08.png,42.7839,0.8286,0.8047,0.4887 +Kodak,4x4,ldr-rgb-kodak09.png,47.3967,0.9419,0.9198,0.4275 +Kodak,4x4,ldr-rgb-kodak10.png,47.0389,0.9312,0.9084,0.4329 +Kodak,4x4,ldr-rgb-kodak11.png,45.0948,0.8203,0.8007,0.4911 +Kodak,4x4,ldr-rgb-kodak12.png,48.2183,0.8680,0.8492,0.4631 +Kodak,4x4,ldr-rgb-kodak13.png,41.6683,0.7497,0.7287,0.5396 +Kodak,4x4,ldr-rgb-kodak14.png,42.9421,0.8259,0.8057,0.4880 +Kodak,4x4,ldr-rgb-kodak15.png,45.7691,0.8559,0.8344,0.4713 +Kodak,4x4,ldr-rgb-kodak16.png,48.0384,0.8426,0.8238,0.4773 +Kodak,4x4,ldr-rgb-kodak17.png,46.4432,0.8838,0.8606,0.4569 +Kodak,4x4,ldr-rgb-kodak18.png,42.1352,0.9287,0.9043,0.4348 +Kodak,4x4,ldr-rgb-kodak19.png,45.5097,0.8970,0.8736,0.4501 +Kodak,4x4,ldr-rgb-kodak20.png,47.1147,0.5565,0.5384,0.7304 +Kodak,4x4,ldr-rgb-kodak21.png,45.2793,0.8928,0.8732,0.4503 +Kodak,4x4,ldr-rgb-kodak22.png,43.9667,0.9567,0.9347,0.4207 +Kodak,4x4,ldr-rgb-kodak23.png,47.1078,0.9798,0.9597,0.4097 +Kodak,4x4,ldr-rgb-kodak24.png,42.4687,0.8388,0.8170,0.4813 +Kodak,5x5,ldr-rgb-kodak01.png,40.2410,0.8212,0.8000,0.4915 +Kodak,5x5,ldr-rgb-kodak02.png,41.9963,1.0436,1.0216,0.3849 +Kodak,5x5,ldr-rgb-kodak03.png,44.3301,0.8771,0.8575,0.4586 +Kodak,5x5,ldr-rgb-kodak04.png,42.2367,0.9658,0.9414,0.4177 +Kodak,5x5,ldr-rgb-kodak05.png,38.1792,0.8943,0.8724,0.4507 +Kodak,5x5,ldr-rgb-kodak06.png,41.0841,0.8107,0.7901,0.4977 +Kodak,5x5,ldr-rgb-kodak07.png,42.7250,0.9123,0.8887,0.4425 +Kodak,5x5,ldr-rgb-kodak08.png,38.5259,0.8706,0.8457,0.4649 +Kodak,5x5,ldr-rgb-kodak09.png,44.0229,0.9814,0.9584,0.4103 +Kodak,5x5,ldr-rgb-kodak10.png,43.5844,0.9756,0.9516,0.4132 +Kodak,5x5,ldr-rgb-kodak11.png,40.9972,0.8717,0.8511,0.4620 +Kodak,5x5,ldr-rgb-kodak12.png,44.5854,0.9099,0.8897,0.4420 +Kodak,5x5,ldr-rgb-kodak13.png,36.9410,0.8176,0.7955,0.4943 +Kodak,5x5,ldr-rgb-kodak14.png,38.8916,0.8810,0.8597,0.4574 +Kodak,5x5,ldr-rgb-kodak15.png,42.1272,0.9026,0.8802,0.4467 +Kodak,5x5,ldr-rgb-kodak16.png,44.2764,0.8751,0.8553,0.4598 +Kodak,5x5,ldr-rgb-kodak17.png,42.6089,0.9212,0.8972,0.4383 +Kodak,5x5,ldr-rgb-kodak18.png,38.4688,0.9928,0.9675,0.4064 +Kodak,5x5,ldr-rgb-kodak19.png,41.7655,0.9546,0.9301,0.4228 +Kodak,5x5,ldr-rgb-kodak20.png,43.2778,0.6047,0.5853,0.6719 +Kodak,5x5,ldr-rgb-kodak21.png,40.8686,0.9722,0.9514,0.4133 +Kodak,5x5,ldr-rgb-kodak22.png,40.4316,1.0342,1.0110,0.3889 +Kodak,5x5,ldr-rgb-kodak23.png,43.8709,1.0363,1.0151,0.3874 +Kodak,5x5,ldr-rgb-kodak24.png,38.2345,0.9001,0.8770,0.4484 +Kodak,6x6,ldr-rgb-kodak01.png,36.3184,1.1026,1.0801,0.3640 +Kodak,6x6,ldr-rgb-kodak02.png,39.3844,1.1035,1.0800,0.3641 +Kodak,6x6,ldr-rgb-kodak03.png,41.7426,0.7314,0.7101,0.5538 +Kodak,6x6,ldr-rgb-kodak04.png,39.6599,1.0317,1.0059,0.3909 +Kodak,6x6,ldr-rgb-kodak05.png,34.9822,1.1265,1.1031,0.3565 +Kodak,6x6,ldr-rgb-kodak06.png,37.7454,0.9974,0.9753,0.4032 +Kodak,6x6,ldr-rgb-kodak07.png,40.1138,0.8168,0.7919,0.4965 +Kodak,6x6,ldr-rgb-kodak08.png,35.1755,1.1253,1.0985,0.3580 +Kodak,6x6,ldr-rgb-kodak09.png,41.2705,1.0782,1.0535,0.3733 +Kodak,6x6,ldr-rgb-kodak10.png,40.8232,1.0842,1.0589,0.3714 +Kodak,6x6,ldr-rgb-kodak11.png,37.7675,0.9650,0.9430,0.4170 +Kodak,6x6,ldr-rgb-kodak12.png,41.8291,0.9539,0.9325,0.4217 +Kodak,6x6,ldr-rgb-kodak13.png,32.9284,1.1267,1.1031,0.3564 +Kodak,6x6,ldr-rgb-kodak14.png,36.0228,1.1182,1.0954,0.3590 +Kodak,6x6,ldr-rgb-kodak15.png,39.4628,0.8463,0.8224,0.4781 +Kodak,6x6,ldr-rgb-kodak16.png,41.2404,0.9329,0.9117,0.4313 +Kodak,6x6,ldr-rgb-kodak17.png,39.6589,1.0281,1.0027,0.3922 +Kodak,6x6,ldr-rgb-kodak18.png,35.4446,1.1605,1.1338,0.3468 +Kodak,6x6,ldr-rgb-kodak19.png,38.7005,1.1382,1.1121,0.3536 +Kodak,6x6,ldr-rgb-kodak20.png,40.1066,0.7029,0.6823,0.5764 +Kodak,6x6,ldr-rgb-kodak21.png,37.3406,1.1234,1.1014,0.3570 +Kodak,6x6,ldr-rgb-kodak22.png,37.6235,1.1522,1.1277,0.3487 +Kodak,6x6,ldr-rgb-kodak23.png,41.4124,0.9750,0.9525,0.4128 +Kodak,6x6,ldr-rgb-kodak24.png,35.1508,1.0075,0.9828,0.4001 +Kodak,8x8,ldr-rgb-kodak01.png,31.9053,1.1101,1.0819,0.3635 +Kodak,8x8,ldr-rgb-kodak02.png,36.1281,0.8728,0.8437,0.4661 +Kodak,8x8,ldr-rgb-kodak03.png,38.1768,0.4841,0.4575,0.8594 +Kodak,8x8,ldr-rgb-kodak04.png,36.3689,0.7843,0.7529,0.5223 +Kodak,8x8,ldr-rgb-kodak05.png,30.9093,1.1030,1.0741,0.3661 +Kodak,8x8,ldr-rgb-kodak06.png,33.5801,0.9388,0.9110,0.4316 +Kodak,8x8,ldr-rgb-kodak07.png,36.4981,0.5807,0.5500,0.7149 +Kodak,8x8,ldr-rgb-kodak08.png,30.7472,1.1828,1.1508,0.3417 +Kodak,8x8,ldr-rgb-kodak09.png,37.5488,0.5565,0.5265,0.7469 +Kodak,8x8,ldr-rgb-kodak10.png,37.2361,0.6267,0.5960,0.6598 +Kodak,8x8,ldr-rgb-kodak11.png,33.8144,0.9585,0.9307,0.4225 +Kodak,8x8,ldr-rgb-kodak12.png,38.2555,0.6156,0.5886,0.6681 +Kodak,8x8,ldr-rgb-kodak13.png,28.4474,1.2204,1.1912,0.3301 +Kodak,8x8,ldr-rgb-kodak14.png,32.3327,1.1085,1.0802,0.3640 +Kodak,8x8,ldr-rgb-kodak15.png,36.0576,0.6971,0.6676,0.5890 +Kodak,8x8,ldr-rgb-kodak16.png,37.2699,0.7395,0.7127,0.5517 +Kodak,8x8,ldr-rgb-kodak17.png,35.8620,0.6828,0.6518,0.6033 +Kodak,8x8,ldr-rgb-kodak18.png,31.6467,1.0812,1.0487,0.3750 +Kodak,8x8,ldr-rgb-kodak19.png,34.9131,0.7663,0.7349,0.5351 +Kodak,8x8,ldr-rgb-kodak20.png,36.1393,0.5671,0.5407,0.7272 +Kodak,8x8,ldr-rgb-kodak21.png,33.2240,0.7684,0.7408,0.5308 +Kodak,8x8,ldr-rgb-kodak22.png,34.2148,0.9405,0.9103,0.4320 +Kodak,8x8,ldr-rgb-kodak23.png,38.1898,0.5142,0.4860,0.8091 +Kodak,8x8,ldr-rgb-kodak24.png,31.2183,0.9088,0.8788,0.4474 +Kodak,12x12,ldr-rgb-kodak01.png,27.8784,1.0556,1.0168,0.3867 +Kodak,12x12,ldr-rgb-kodak02.png,32.9300,0.6549,0.6151,0.6393 +Kodak,12x12,ldr-rgb-kodak03.png,34.4061,0.4285,0.3917,1.0038 +Kodak,12x12,ldr-rgb-kodak04.png,32.9391,0.6057,0.5643,0.6969 +Kodak,12x12,ldr-rgb-kodak05.png,26.5676,1.0978,1.0585,0.3715 +Kodak,12x12,ldr-rgb-kodak06.png,29.5235,0.8198,0.7816,0.5031 +Kodak,12x12,ldr-rgb-kodak07.png,32.5964,0.5183,0.4769,0.8246 +Kodak,12x12,ldr-rgb-kodak08.png,26.2422,1.1004,1.0588,0.3714 +Kodak,12x12,ldr-rgb-kodak09.png,33.6131,0.4691,0.4294,0.9158 +Kodak,12x12,ldr-rgb-kodak10.png,32.9798,0.4618,0.4208,0.9345 +Kodak,12x12,ldr-rgb-kodak11.png,30.0089,0.7507,0.7129,0.5516 +Kodak,12x12,ldr-rgb-kodak12.png,34.4650,0.4320,0.3949,0.9958 +Kodak,12x12,ldr-rgb-kodak13.png,24.5667,1.2232,1.1833,0.3323 +Kodak,12x12,ldr-rgb-kodak14.png,28.5595,0.9767,0.9384,0.4190 +Kodak,12x12,ldr-rgb-kodak15.png,32.6860,0.5670,0.5267,0.7466 +Kodak,12x12,ldr-rgb-kodak16.png,33.3196,0.5888,0.5512,0.7133 +Kodak,12x12,ldr-rgb-kodak17.png,32.0937,0.5160,0.4750,0.8279 +Kodak,12x12,ldr-rgb-kodak18.png,27.9094,0.9080,0.8655,0.4543 +Kodak,12x12,ldr-rgb-kodak19.png,31.0768,0.7561,0.7146,0.5502 +Kodak,12x12,ldr-rgb-kodak20.png,32.1522,0.5482,0.5119,0.7682 +Kodak,12x12,ldr-rgb-kodak21.png,29.3175,0.6969,0.6590,0.5967 +Kodak,12x12,ldr-rgb-kodak22.png,30.7345,0.7866,0.7464,0.5268 +Kodak,12x12,ldr-rgb-kodak23.png,34.3768,0.3731,0.3344,1.1759 +Kodak,12x12,ldr-rgb-kodak24.png,27.2021,0.8519,0.8118,0.4844 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse2_fast_results.csv new file mode 100644 index 0000000..701ede1 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse2_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.6362,0.0605,0.0408,9.6339 +Kodak,4x4,ldr-rgb-kodak02.png,43.9596,0.0832,0.0623,6.3151 +Kodak,4x4,ldr-rgb-kodak03.png,46.3784,0.0549,0.0368,10.6832 +Kodak,4x4,ldr-rgb-kodak04.png,44.3400,0.0781,0.0552,7.1246 +Kodak,4x4,ldr-rgb-kodak05.png,41.1974,0.1045,0.0839,4.6883 +Kodak,4x4,ldr-rgb-kodak06.png,44.5356,0.0596,0.0403,9.7587 +Kodak,4x4,ldr-rgb-kodak07.png,44.7761,0.0705,0.0485,8.1128 +Kodak,4x4,ldr-rgb-kodak08.png,41.7589,0.1101,0.0867,4.5332 +Kodak,4x4,ldr-rgb-kodak09.png,46.0465,0.0536,0.0321,12.2574 +Kodak,4x4,ldr-rgb-kodak10.png,45.8052,0.0554,0.0330,11.9268 +Kodak,4x4,ldr-rgb-kodak11.png,44.0023,0.0688,0.0496,7.9258 +Kodak,4x4,ldr-rgb-kodak12.png,46.9029,0.0506,0.0321,12.2364 +Kodak,4x4,ldr-rgb-kodak13.png,41.1448,0.0862,0.0655,6.0044 +Kodak,4x4,ldr-rgb-kodak14.png,41.3367,0.0927,0.0728,5.4004 +Kodak,4x4,ldr-rgb-kodak15.png,44.2560,0.0841,0.0631,6.2330 +Kodak,4x4,ldr-rgb-kodak16.png,47.0662,0.0452,0.0267,14.7211 +Kodak,4x4,ldr-rgb-kodak17.png,45.5399,0.0519,0.0293,13.4277 +Kodak,4x4,ldr-rgb-kodak18.png,41.2902,0.1007,0.0769,5.1132 +Kodak,4x4,ldr-rgb-kodak19.png,44.6098,0.0638,0.0407,9.6622 +Kodak,4x4,ldr-rgb-kodak20.png,46.0245,0.0533,0.0354,11.1163 +Kodak,4x4,ldr-rgb-kodak21.png,44.3823,0.0692,0.0498,7.8919 +Kodak,4x4,ldr-rgb-kodak22.png,42.8738,0.1000,0.0777,5.0585 +Kodak,4x4,ldr-rgb-kodak23.png,45.3386,0.0682,0.0484,8.1253 +Kodak,4x4,ldr-rgb-kodak24.png,41.2840,0.0950,0.0733,5.3676 +Kodak,5x5,ldr-rgb-kodak01.png,39.4696,0.0589,0.0385,10.2160 +Kodak,5x5,ldr-rgb-kodak02.png,40.4879,0.0559,0.0344,11.4307 +Kodak,5x5,ldr-rgb-kodak03.png,42.7782,0.0444,0.0255,15.4475 +Kodak,5x5,ldr-rgb-kodak04.png,41.0854,0.0551,0.0316,12.4570 +Kodak,5x5,ldr-rgb-kodak05.png,37.1642,0.0903,0.0688,5.7159 +Kodak,5x5,ldr-rgb-kodak06.png,40.4463,0.0512,0.0312,12.5901 +Kodak,5x5,ldr-rgb-kodak07.png,41.2332,0.0550,0.0321,12.2673 +Kodak,5x5,ldr-rgb-kodak08.png,37.5683,0.0957,0.0714,5.5071 +Kodak,5x5,ldr-rgb-kodak09.png,42.6821,0.0452,0.0229,17.1477 +Kodak,5x5,ldr-rgb-kodak10.png,42.4785,0.0466,0.0234,16.8250 +Kodak,5x5,ldr-rgb-kodak11.png,40.1373,0.0554,0.0355,11.0646 +Kodak,5x5,ldr-rgb-kodak12.png,43.2666,0.0405,0.0213,18.4608 +Kodak,5x5,ldr-rgb-kodak13.png,36.7049,0.0809,0.0595,6.6090 +Kodak,5x5,ldr-rgb-kodak14.png,37.6406,0.0823,0.0617,6.3708 +Kodak,5x5,ldr-rgb-kodak15.png,41.0230,0.0570,0.0352,11.1744 +Kodak,5x5,ldr-rgb-kodak16.png,43.3875,0.0382,0.0192,20.4363 +Kodak,5x5,ldr-rgb-kodak17.png,41.9060,0.0452,0.0223,17.6322 +Kodak,5x5,ldr-rgb-kodak18.png,37.9754,0.0744,0.0497,7.9043 +Kodak,5x5,ldr-rgb-kodak19.png,40.9776,0.0519,0.0283,13.9132 +Kodak,5x5,ldr-rgb-kodak20.png,42.1605,0.0440,0.0253,15.5594 +Kodak,5x5,ldr-rgb-kodak21.png,40.2880,0.0540,0.0339,11.5968 +Kodak,5x5,ldr-rgb-kodak22.png,39.6302,0.0623,0.0397,9.9099 +Kodak,5x5,ldr-rgb-kodak23.png,42.2432,0.0469,0.0261,15.0369 +Kodak,5x5,ldr-rgb-kodak24.png,37.6337,0.0718,0.0494,7.9590 +Kodak,6x6,ldr-rgb-kodak01.png,35.7062,0.0887,0.0671,5.8616 +Kodak,6x6,ldr-rgb-kodak02.png,38.0983,0.0635,0.0408,9.6490 +Kodak,6x6,ldr-rgb-kodak03.png,40.4255,0.0482,0.0283,13.8921 +Kodak,6x6,ldr-rgb-kodak04.png,38.4693,0.0630,0.0381,10.3250 +Kodak,6x6,ldr-rgb-kodak05.png,34.2092,0.1342,0.1117,3.5212 +Kodak,6x6,ldr-rgb-kodak06.png,37.2296,0.0679,0.0465,8.4492 +Kodak,6x6,ldr-rgb-kodak07.png,38.7204,0.0649,0.0408,9.6419 +Kodak,6x6,ldr-rgb-kodak08.png,34.3095,0.1448,0.1193,3.2948 +Kodak,6x6,ldr-rgb-kodak09.png,39.8453,0.0537,0.0302,13.0019 +Kodak,6x6,ldr-rgb-kodak10.png,39.6405,0.0550,0.0307,12.8284 +Kodak,6x6,ldr-rgb-kodak11.png,37.0549,0.0739,0.0526,7.4713 +Kodak,6x6,ldr-rgb-kodak12.png,40.6359,0.0459,0.0254,15.4705 +Kodak,6x6,ldr-rgb-kodak13.png,32.7172,0.1511,0.1284,3.0613 +Kodak,6x6,ldr-rgb-kodak14.png,35.0670,0.1087,0.0870,4.5210 +Kodak,6x6,ldr-rgb-kodak15.png,38.4497,0.0656,0.0426,9.2311 +Kodak,6x6,ldr-rgb-kodak16.png,40.4456,0.0440,0.0235,16.7155 +Kodak,6x6,ldr-rgb-kodak17.png,38.8641,0.0561,0.0314,12.5256 +Kodak,6x6,ldr-rgb-kodak18.png,35.0361,0.1008,0.0750,5.2430 +Kodak,6x6,ldr-rgb-kodak19.png,37.8965,0.0682,0.0433,9.0867 +Kodak,6x6,ldr-rgb-kodak20.png,39.0600,0.0565,0.0366,10.7460 +Kodak,6x6,ldr-rgb-kodak21.png,36.8326,0.0790,0.0577,6.8108 +Kodak,6x6,ldr-rgb-kodak22.png,36.8833,0.0762,0.0523,7.5149 +Kodak,6x6,ldr-rgb-kodak23.png,39.9669,0.0515,0.0296,13.2637 +Kodak,6x6,ldr-rgb-kodak24.png,34.6964,0.0997,0.0760,5.1719 +Kodak,8x8,ldr-rgb-kodak01.png,31.2727,0.1062,0.0800,4.9172 +Kodak,8x8,ldr-rgb-kodak02.png,34.8438,0.0656,0.0382,10.2823 +Kodak,8x8,ldr-rgb-kodak03.png,36.4894,0.0536,0.0290,13.5512 +Kodak,8x8,ldr-rgb-kodak04.png,35.1177,0.0648,0.0352,11.1703 +Kodak,8x8,ldr-rgb-kodak05.png,30.1259,0.1554,0.1281,3.0695 +Kodak,8x8,ldr-rgb-kodak06.png,32.8371,0.0828,0.0569,6.9099 +Kodak,8x8,ldr-rgb-kodak07.png,34.8925,0.0713,0.0425,9.2452 +Kodak,8x8,ldr-rgb-kodak08.png,29.8620,0.1803,0.1503,2.6157 +Kodak,8x8,ldr-rgb-kodak09.png,35.9887,0.0614,0.0332,11.8385 +Kodak,8x8,ldr-rgb-kodak10.png,35.7828,0.0609,0.0317,12.3851 +Kodak,8x8,ldr-rgb-kodak11.png,32.8947,0.0848,0.0589,6.6765 +Kodak,8x8,ldr-rgb-kodak12.png,36.6150,0.0534,0.0283,13.9147 +Kodak,8x8,ldr-rgb-kodak13.png,28.1483,0.1835,0.1561,2.5184 +Kodak,8x8,ldr-rgb-kodak14.png,31.3720,0.1199,0.0934,4.2107 +Kodak,8x8,ldr-rgb-kodak15.png,34.8334,0.0685,0.0407,9.6703 +Kodak,8x8,ldr-rgb-kodak16.png,35.9796,0.0557,0.0306,12.8561 +Kodak,8x8,ldr-rgb-kodak17.png,34.7832,0.0640,0.0348,11.2967 +Kodak,8x8,ldr-rgb-kodak18.png,31.1770,0.1096,0.0793,4.9600 +Kodak,8x8,ldr-rgb-kodak19.png,33.9922,0.0751,0.0456,8.6313 +Kodak,8x8,ldr-rgb-kodak20.png,35.1135,0.0629,0.0384,10.2373 +Kodak,8x8,ldr-rgb-kodak21.png,32.6736,0.0887,0.0626,6.2798 +Kodak,8x8,ldr-rgb-kodak22.png,33.3695,0.0791,0.0505,7.7820 +Kodak,8x8,ldr-rgb-kodak23.png,36.4675,0.0539,0.0275,14.2785 +Kodak,8x8,ldr-rgb-kodak24.png,30.7403,0.1103,0.0819,4.7999 +Kodak,12x12,ldr-rgb-kodak01.png,27.1278,0.0892,0.0549,7.1609 +Kodak,12x12,ldr-rgb-kodak02.png,31.0894,0.0556,0.0210,18.7202 +Kodak,12x12,ldr-rgb-kodak03.png,32.7039,0.0499,0.0177,22.2031 +Kodak,12x12,ldr-rgb-kodak04.png,31.5079,0.0536,0.0166,23.6933 +Kodak,12x12,ldr-rgb-kodak05.png,25.7719,0.1011,0.0663,5.9275 +Kodak,12x12,ldr-rgb-kodak06.png,28.6463,0.0731,0.0393,10.0103 +Kodak,12x12,ldr-rgb-kodak07.png,30.8159,0.0588,0.0234,16.8106 +Kodak,12x12,ldr-rgb-kodak08.png,25.3175,0.1221,0.0849,4.6330 +Kodak,12x12,ldr-rgb-kodak09.png,31.7731,0.0559,0.0206,19.1067 +Kodak,12x12,ldr-rgb-kodak10.png,31.4981,0.0579,0.0216,18.1707 +Kodak,12x12,ldr-rgb-kodak11.png,28.9301,0.0658,0.0326,12.0619 +Kodak,12x12,ldr-rgb-kodak12.png,32.5101,0.0523,0.0192,20.4436 +Kodak,12x12,ldr-rgb-kodak13.png,24.2865,0.1316,0.0967,4.0677 +Kodak,12x12,ldr-rgb-kodak14.png,27.5084,0.0769,0.0424,9.2801 +Kodak,12x12,ldr-rgb-kodak15.png,31.3106,0.0614,0.0265,14.8305 +Kodak,12x12,ldr-rgb-kodak16.png,31.4372,0.0524,0.0200,19.7031 +Kodak,12x12,ldr-rgb-kodak17.png,30.8227,0.0590,0.0226,17.3975 +Kodak,12x12,ldr-rgb-kodak18.png,27.3907,0.0810,0.0433,9.0831 +Kodak,12x12,ldr-rgb-kodak19.png,30.0601,0.0659,0.0292,13.4746 +Kodak,12x12,ldr-rgb-kodak20.png,31.0166,0.0589,0.0271,14.5319 +Kodak,12x12,ldr-rgb-kodak21.png,28.6979,0.0703,0.0370,10.6280 +Kodak,12x12,ldr-rgb-kodak22.png,29.7631,0.0609,0.0252,15.6142 +Kodak,12x12,ldr-rgb-kodak23.png,32.4815,0.0548,0.0211,18.6712 +Kodak,12x12,ldr-rgb-kodak24.png,26.7141,0.0882,0.0524,7.4971 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse2_fastest_results.csv new file mode 100644 index 0000000..6a3ba79 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse2_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,43.5439,0.0399,0.0202,19.5048 +Kodak,4x4,ldr-rgb-kodak02.png,42.3910,0.0456,0.0247,15.8978 +Kodak,4x4,ldr-rgb-kodak03.png,44.7710,0.0409,0.0228,17.2395 +Kodak,4x4,ldr-rgb-kodak04.png,42.9605,0.0463,0.0233,16.8423 +Kodak,4x4,ldr-rgb-kodak05.png,39.9764,0.0559,0.0352,11.1570 +Kodak,4x4,ldr-rgb-kodak06.png,43.6529,0.0396,0.0205,19.2160 +Kodak,4x4,ldr-rgb-kodak07.png,43.4729,0.0463,0.0243,16.1812 +Kodak,4x4,ldr-rgb-kodak08.png,40.5055,0.0551,0.0316,12.4439 +Kodak,4x4,ldr-rgb-kodak09.png,45.0938,0.0418,0.0203,19.3626 +Kodak,4x4,ldr-rgb-kodak10.png,44.8382,0.0426,0.0203,19.3447 +Kodak,4x4,ldr-rgb-kodak11.png,42.8561,0.0418,0.0226,17.3614 +Kodak,4x4,ldr-rgb-kodak12.png,45.6610,0.0387,0.0203,19.4000 +Kodak,4x4,ldr-rgb-kodak13.png,40.3315,0.0486,0.0277,14.1843 +Kodak,4x4,ldr-rgb-kodak14.png,39.7166,0.0591,0.0392,10.0220 +Kodak,4x4,ldr-rgb-kodak15.png,42.9403,0.0461,0.0250,15.7242 +Kodak,4x4,ldr-rgb-kodak16.png,46.4214,0.0359,0.0176,22.3191 +Kodak,4x4,ldr-rgb-kodak17.png,44.8172,0.0420,0.0200,19.6725 +Kodak,4x4,ldr-rgb-kodak18.png,40.5153,0.0508,0.0274,14.3400 +Kodak,4x4,ldr-rgb-kodak19.png,43.7124,0.0428,0.0199,19.8094 +Kodak,4x4,ldr-rgb-kodak20.png,44.8759,0.0381,0.0202,19.4670 +Kodak,4x4,ldr-rgb-kodak21.png,43.5022,0.0406,0.0213,18.4573 +Kodak,4x4,ldr-rgb-kodak22.png,41.8493,0.0458,0.0239,16.4484 +Kodak,4x4,ldr-rgb-kodak23.png,44.0973,0.0416,0.0217,18.1481 +Kodak,4x4,ldr-rgb-kodak24.png,40.1136,0.0561,0.0343,11.4697 +Kodak,5x5,ldr-rgb-kodak01.png,38.3571,0.0315,0.0114,34.5715 +Kodak,5x5,ldr-rgb-kodak02.png,39.7704,0.0329,0.0118,33.1858 +Kodak,5x5,ldr-rgb-kodak03.png,41.5780,0.0308,0.0122,32.1338 +Kodak,5x5,ldr-rgb-kodak04.png,39.9202,0.0347,0.0120,32.8114 +Kodak,5x5,ldr-rgb-kodak05.png,36.0227,0.0376,0.0169,23.2684 +Kodak,5x5,ldr-rgb-kodak06.png,39.3863,0.0313,0.0120,32.6918 +Kodak,5x5,ldr-rgb-kodak07.png,39.9992,0.0342,0.0122,32.2974 +Kodak,5x5,ldr-rgb-kodak08.png,36.1442,0.0379,0.0143,27.4750 +Kodak,5x5,ldr-rgb-kodak09.png,41.5024,0.0334,0.0117,33.7060 +Kodak,5x5,ldr-rgb-kodak10.png,41.4638,0.0343,0.0119,32.9103 +Kodak,5x5,ldr-rgb-kodak11.png,39.2621,0.0316,0.0123,32.0576 +Kodak,5x5,ldr-rgb-kodak12.png,42.2647,0.0302,0.0114,34.4595 +Kodak,5x5,ldr-rgb-kodak13.png,36.1796,0.0354,0.0146,26.9418 +Kodak,5x5,ldr-rgb-kodak14.png,36.6143,0.0400,0.0200,19.6796 +Kodak,5x5,ldr-rgb-kodak15.png,39.9014,0.0337,0.0124,31.7962 +Kodak,5x5,ldr-rgb-kodak16.png,42.5270,0.0294,0.0110,35.7922 +Kodak,5x5,ldr-rgb-kodak17.png,41.0632,0.0345,0.0120,32.8749 +Kodak,5x5,ldr-rgb-kodak18.png,37.3941,0.0373,0.0136,28.8747 +Kodak,5x5,ldr-rgb-kodak19.png,39.5696,0.0347,0.0116,33.7902 +Kodak,5x5,ldr-rgb-kodak20.png,40.9808,0.0298,0.0116,33.7902 +Kodak,5x5,ldr-rgb-kodak21.png,39.3545,0.0312,0.0117,33.6167 +Kodak,5x5,ldr-rgb-kodak22.png,38.8716,0.0346,0.0128,30.8332 +Kodak,5x5,ldr-rgb-kodak23.png,41.0132,0.0320,0.0120,32.6349 +Kodak,5x5,ldr-rgb-kodak24.png,37.0072,0.0386,0.0168,23.4351 +Kodak,6x6,ldr-rgb-kodak01.png,34.1244,0.0327,0.0121,32.4755 +Kodak,6x6,ldr-rgb-kodak02.png,37.0151,0.0328,0.0111,35.5599 +Kodak,6x6,ldr-rgb-kodak03.png,39.2769,0.0302,0.0113,34.8321 +Kodak,6x6,ldr-rgb-kodak04.png,37.2082,0.0351,0.0116,33.9649 +Kodak,6x6,ldr-rgb-kodak05.png,32.8285,0.0391,0.0172,22.8709 +Kodak,6x6,ldr-rgb-kodak06.png,36.1262,0.0317,0.0115,34.2079 +Kodak,6x6,ldr-rgb-kodak07.png,37.3637,0.0343,0.0115,34.3240 +Kodak,6x6,ldr-rgb-kodak08.png,32.6248,0.0411,0.0167,23.5133 +Kodak,6x6,ldr-rgb-kodak09.png,38.0793,0.0333,0.0110,35.5852 +Kodak,6x6,ldr-rgb-kodak10.png,38.2970,0.0351,0.0116,33.8457 +Kodak,6x6,ldr-rgb-kodak11.png,35.9521,0.0324,0.0120,32.7925 +Kodak,6x6,ldr-rgb-kodak12.png,39.3986,0.0304,0.0110,35.5983 +Kodak,6x6,ldr-rgb-kodak13.png,31.8578,0.0402,0.0185,21.2941 +Kodak,6x6,ldr-rgb-kodak14.png,33.9144,0.0392,0.0185,21.2286 +Kodak,6x6,ldr-rgb-kodak15.png,37.0909,0.0337,0.0117,33.6427 +Kodak,6x6,ldr-rgb-kodak16.png,39.5325,0.0294,0.0100,39.2552 +Kodak,6x6,ldr-rgb-kodak17.png,37.6039,0.0351,0.0119,33.0992 +Kodak,6x6,ldr-rgb-kodak18.png,34.2009,0.0384,0.0137,28.6959 +Kodak,6x6,ldr-rgb-kodak19.png,36.1180,0.0359,0.0122,32.3183 +Kodak,6x6,ldr-rgb-kodak20.png,37.6829,0.0302,0.0115,34.1782 +Kodak,6x6,ldr-rgb-kodak21.png,35.8173,0.0320,0.0118,33.3098 +Kodak,6x6,ldr-rgb-kodak22.png,35.7856,0.0350,0.0122,32.1200 +Kodak,6x6,ldr-rgb-kodak23.png,38.7390,0.0319,0.0112,35.1686 +Kodak,6x6,ldr-rgb-kodak24.png,33.8259,0.0393,0.0168,23.3654 +Kodak,8x8,ldr-rgb-kodak01.png,29.2123,0.0371,0.0125,31.5631 +Kodak,8x8,ldr-rgb-kodak02.png,33.3692,0.0384,0.0128,30.6151 +Kodak,8x8,ldr-rgb-kodak03.png,35.0174,0.0330,0.0100,39.4203 +Kodak,8x8,ldr-rgb-kodak04.png,33.8136,0.0391,0.0109,35.9427 +Kodak,8x8,ldr-rgb-kodak05.png,28.4620,0.0425,0.0167,23.5220 +Kodak,8x8,ldr-rgb-kodak06.png,30.6937,0.0361,0.0118,33.2306 +Kodak,8x8,ldr-rgb-kodak07.png,33.0023,0.0374,0.0105,37.5636 +Kodak,8x8,ldr-rgb-kodak08.png,27.8612,0.0484,0.0197,19.9108 +Kodak,8x8,ldr-rgb-kodak09.png,33.9184,0.0370,0.0107,36.8041 +Kodak,8x8,ldr-rgb-kodak10.png,34.1882,0.0381,0.0111,35.5216 +Kodak,8x8,ldr-rgb-kodak11.png,31.4228,0.0362,0.0121,32.4653 +Kodak,8x8,ldr-rgb-kodak12.png,34.6499,0.0344,0.0107,36.6846 +Kodak,8x8,ldr-rgb-kodak13.png,27.2873,0.0481,0.0225,17.4989 +Kodak,8x8,ldr-rgb-kodak14.png,29.8587,0.0401,0.0154,25.6054 +Kodak,8x8,ldr-rgb-kodak15.png,33.0416,0.0395,0.0135,29.1983 +Kodak,8x8,ldr-rgb-kodak16.png,33.7001,0.0329,0.0095,41.4649 +Kodak,8x8,ldr-rgb-kodak17.png,33.3066,0.0388,0.0115,34.3297 +Kodak,8x8,ldr-rgb-kodak18.png,30.0964,0.0428,0.0143,27.5360 +Kodak,8x8,ldr-rgb-kodak19.png,31.7467,0.0400,0.0123,31.8909 +Kodak,8x8,ldr-rgb-kodak20.png,33.5181,0.0340,0.0110,35.8155 +Kodak,8x8,ldr-rgb-kodak21.png,31.1048,0.0365,0.0123,32.0576 +Kodak,8x8,ldr-rgb-kodak22.png,32.0928,0.0376,0.0111,35.5561 +Kodak,8x8,ldr-rgb-kodak23.png,35.0552,0.0361,0.0113,34.8719 +Kodak,8x8,ldr-rgb-kodak24.png,29.9371,0.0437,0.0171,22.9869 +Kodak,12x12,ldr-rgb-kodak01.png,25.3172,0.0384,0.0090,43.7739 +Kodak,12x12,ldr-rgb-kodak02.png,30.3378,0.0394,0.0088,44.6532 +Kodak,12x12,ldr-rgb-kodak03.png,31.7897,0.0363,0.0084,46.6171 +Kodak,12x12,ldr-rgb-kodak04.png,30.7778,0.0412,0.0088,44.4810 +Kodak,12x12,ldr-rgb-kodak05.png,24.5398,0.0397,0.0092,42.5793 +Kodak,12x12,ldr-rgb-kodak06.png,26.5395,0.0383,0.0092,42.8248 +Kodak,12x12,ldr-rgb-kodak07.png,30.0574,0.0405,0.0087,45.3332 +Kodak,12x12,ldr-rgb-kodak08.png,23.2566,0.0449,0.0116,33.8048 +Kodak,12x12,ldr-rgb-kodak09.png,30.3245,0.0402,0.0088,44.8719 +Kodak,12x12,ldr-rgb-kodak10.png,30.4108,0.0411,0.0088,44.7805 +Kodak,12x12,ldr-rgb-kodak11.png,27.8367,0.0379,0.0089,44.2970 +Kodak,12x12,ldr-rgb-kodak12.png,30.2343,0.0371,0.0088,44.7186 +Kodak,12x12,ldr-rgb-kodak13.png,23.3246,0.0417,0.0112,35.1431 +Kodak,12x12,ldr-rgb-kodak14.png,26.5712,0.0385,0.0090,43.7646 +Kodak,12x12,ldr-rgb-kodak15.png,29.1919,0.0402,0.0092,42.9463 +Kodak,12x12,ldr-rgb-kodak16.png,30.1981,0.0369,0.0085,46.0175 +Kodak,12x12,ldr-rgb-kodak17.png,30.0910,0.0411,0.0088,44.6230 +Kodak,12x12,ldr-rgb-kodak18.png,26.6954,0.0431,0.0095,41.5967 +Kodak,12x12,ldr-rgb-kodak19.png,27.4935,0.0418,0.0091,43.0686 +Kodak,12x12,ldr-rgb-kodak20.png,29.6676,0.0365,0.0085,46.2446 +Kodak,12x12,ldr-rgb-kodak21.png,27.3710,0.0385,0.0092,42.6663 +Kodak,12x12,ldr-rgb-kodak22.png,28.7849,0.0404,0.0089,44.2068 +Kodak,12x12,ldr-rgb-kodak23.png,31.5692,0.0403,0.0104,37.7294 +Kodak,12x12,ldr-rgb-kodak24.png,26.0587,0.0419,0.0105,37.6030 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse2_medium_results.csv new file mode 100644 index 0000000..ae6ad49 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse2_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.1468,0.2868,0.2669,1.4732 +Kodak,4x4,ldr-rgb-kodak02.png,45.0582,0.4741,0.4516,0.8708 +Kodak,4x4,ldr-rgb-kodak03.png,47.3861,0.2415,0.2229,1.7642 +Kodak,4x4,ldr-rgb-kodak04.png,45.1833,0.3817,0.3583,1.0974 +Kodak,4x4,ldr-rgb-kodak05.png,41.9665,0.3881,0.3673,1.0704 +Kodak,4x4,ldr-rgb-kodak06.png,45.0092,0.2714,0.2517,1.5623 +Kodak,4x4,ldr-rgb-kodak07.png,45.7464,0.2724,0.2500,1.5731 +Kodak,4x4,ldr-rgb-kodak08.png,42.3737,0.4146,0.3906,1.0066 +Kodak,4x4,ldr-rgb-kodak09.png,46.9783,0.3606,0.3385,1.1615 +Kodak,4x4,ldr-rgb-kodak10.png,46.6765,0.3612,0.3382,1.1627 +Kodak,4x4,ldr-rgb-kodak11.png,44.6907,0.3298,0.3100,1.2683 +Kodak,4x4,ldr-rgb-kodak12.png,47.7516,0.2476,0.2289,1.7178 +Kodak,4x4,ldr-rgb-kodak13.png,41.4622,0.3082,0.2873,1.3685 +Kodak,4x4,ldr-rgb-kodak14.png,42.3713,0.3524,0.3323,1.1834 +Kodak,4x4,ldr-rgb-kodak15.png,45.1851,0.2917,0.2701,1.4556 +Kodak,4x4,ldr-rgb-kodak16.png,47.7319,0.2520,0.2333,1.6856 +Kodak,4x4,ldr-rgb-kodak17.png,46.1732,0.2859,0.2629,1.4957 +Kodak,4x4,ldr-rgb-kodak18.png,41.8328,0.4399,0.4159,0.9455 +Kodak,4x4,ldr-rgb-kodak19.png,45.1811,0.3670,0.3436,1.1444 +Kodak,4x4,ldr-rgb-kodak20.png,46.7334,0.2126,0.1942,2.0244 +Kodak,4x4,ldr-rgb-kodak21.png,45.0262,0.3916,0.3714,1.0587 +Kodak,4x4,ldr-rgb-kodak22.png,43.5754,0.4592,0.4371,0.8996 +Kodak,4x4,ldr-rgb-kodak23.png,46.5536,0.3768,0.3564,1.1032 +Kodak,4x4,ldr-rgb-kodak24.png,42.1234,0.3427,0.3205,1.2270 +Kodak,5x5,ldr-rgb-kodak01.png,40.0595,0.3313,0.3103,1.2672 +Kodak,5x5,ldr-rgb-kodak02.png,41.5953,0.3767,0.3546,1.1089 +Kodak,5x5,ldr-rgb-kodak03.png,43.8592,0.1507,0.1310,3.0010 +Kodak,5x5,ldr-rgb-kodak04.png,41.9534,0.2708,0.2464,1.5956 +Kodak,5x5,ldr-rgb-kodak05.png,37.8994,0.4062,0.3842,1.0235 +Kodak,5x5,ldr-rgb-kodak06.png,40.8860,0.2525,0.2316,1.6976 +Kodak,5x5,ldr-rgb-kodak07.png,42.2937,0.2139,0.1904,2.0653 +Kodak,5x5,ldr-rgb-kodak08.png,38.2680,0.4320,0.4067,0.9668 +Kodak,5x5,ldr-rgb-kodak09.png,43.6779,0.1666,0.1434,2.7425 +Kodak,5x5,ldr-rgb-kodak10.png,43.3008,0.1993,0.1752,2.2441 +Kodak,5x5,ldr-rgb-kodak11.png,40.7541,0.3111,0.2905,1.3537 +Kodak,5x5,ldr-rgb-kodak12.png,44.2374,0.1509,0.1308,3.0055 +Kodak,5x5,ldr-rgb-kodak13.png,36.8520,0.3499,0.3279,1.1991 +Kodak,5x5,ldr-rgb-kodak14.png,38.5557,0.3601,0.3388,1.1605 +Kodak,5x5,ldr-rgb-kodak15.png,41.7817,0.2640,0.2413,1.6293 +Kodak,5x5,ldr-rgb-kodak16.png,44.0360,0.1670,0.1471,2.6735 +Kodak,5x5,ldr-rgb-kodak17.png,42.4423,0.1745,0.1502,2.6173 +Kodak,5x5,ldr-rgb-kodak18.png,38.3073,0.3737,0.3483,1.1290 +Kodak,5x5,ldr-rgb-kodak19.png,41.5356,0.2380,0.2135,1.8421 +Kodak,5x5,ldr-rgb-kodak20.png,42.8339,0.1706,0.1513,2.5985 +Kodak,5x5,ldr-rgb-kodak21.png,40.7045,0.2499,0.2292,1.7154 +Kodak,5x5,ldr-rgb-kodak22.png,40.2125,0.3671,0.3436,1.1445 +Kodak,5x5,ldr-rgb-kodak23.png,43.3590,0.2209,0.1993,1.9729 +Kodak,5x5,ldr-rgb-kodak24.png,38.0472,0.3083,0.2852,1.3786 +Kodak,6x6,ldr-rgb-kodak01.png,36.1493,0.4919,0.4696,0.8373 +Kodak,6x6,ldr-rgb-kodak02.png,38.9197,0.3089,0.2855,1.3775 +Kodak,6x6,ldr-rgb-kodak03.png,41.1619,0.1546,0.1338,2.9380 +Kodak,6x6,ldr-rgb-kodak04.png,39.2634,0.2649,0.2393,1.6431 +Kodak,6x6,ldr-rgb-kodak05.png,34.7198,0.5205,0.4972,0.7908 +Kodak,6x6,ldr-rgb-kodak06.png,37.5615,0.3139,0.2917,1.3479 +Kodak,6x6,ldr-rgb-kodak07.png,39.6600,0.2219,0.1969,1.9971 +Kodak,6x6,ldr-rgb-kodak08.png,34.9309,0.5768,0.5502,0.7147 +Kodak,6x6,ldr-rgb-kodak09.png,40.7136,0.1598,0.1353,2.9073 +Kodak,6x6,ldr-rgb-kodak10.png,40.3347,0.1717,0.1463,2.6874 +Kodak,6x6,ldr-rgb-kodak11.png,37.5085,0.3151,0.2932,1.3412 +Kodak,6x6,ldr-rgb-kodak12.png,41.2787,0.1349,0.1135,3.4653 +Kodak,6x6,ldr-rgb-kodak13.png,32.8322,0.5869,0.5633,0.6981 +Kodak,6x6,ldr-rgb-kodak14.png,35.7517,0.3962,0.3735,1.0527 +Kodak,6x6,ldr-rgb-kodak15.png,39.0601,0.2710,0.2471,1.5912 +Kodak,6x6,ldr-rgb-kodak16.png,40.8802,0.1752,0.1538,2.5568 +Kodak,6x6,ldr-rgb-kodak17.png,39.3467,0.1810,0.1555,2.5295 +Kodak,6x6,ldr-rgb-kodak18.png,35.2971,0.4214,0.3950,0.9955 +Kodak,6x6,ldr-rgb-kodak19.png,38.4283,0.3044,0.2784,1.4122 +Kodak,6x6,ldr-rgb-kodak20.png,39.6563,0.2097,0.1889,2.0814 +Kodak,6x6,ldr-rgb-kodak21.png,37.1184,0.3031,0.2809,1.4001 +Kodak,6x6,ldr-rgb-kodak22.png,37.3676,0.3671,0.3425,1.1480 +Kodak,6x6,ldr-rgb-kodak23.png,40.7804,0.1590,0.1361,2.8890 +Kodak,6x6,ldr-rgb-kodak24.png,34.9818,0.3628,0.3380,1.1632 +Kodak,8x8,ldr-rgb-kodak01.png,31.7277,0.5950,0.5676,0.6928 +Kodak,8x8,ldr-rgb-kodak02.png,35.5931,0.2681,0.2396,1.6411 +Kodak,8x8,ldr-rgb-kodak03.png,37.5035,0.1780,0.1520,2.5877 +Kodak,8x8,ldr-rgb-kodak04.png,35.8535,0.2480,0.2172,1.8105 +Kodak,8x8,ldr-rgb-kodak05.png,30.6505,0.6285,0.6000,0.6554 +Kodak,8x8,ldr-rgb-kodak06.png,33.3520,0.3467,0.3195,1.2306 +Kodak,8x8,ldr-rgb-kodak07.png,35.9153,0.2485,0.2185,1.7996 +Kodak,8x8,ldr-rgb-kodak08.png,30.5109,0.6535,0.6219,0.6323 +Kodak,8x8,ldr-rgb-kodak09.png,37.0162,0.1692,0.1397,2.8142 +Kodak,8x8,ldr-rgb-kodak10.png,36.6070,0.1687,0.1386,2.8380 +Kodak,8x8,ldr-rgb-kodak11.png,33.5011,0.3463,0.3188,1.2333 +Kodak,8x8,ldr-rgb-kodak12.png,37.5102,0.1681,0.1416,2.7763 +Kodak,8x8,ldr-rgb-kodak13.png,28.3333,0.6914,0.6627,0.5934 +Kodak,8x8,ldr-rgb-kodak14.png,32.0366,0.4449,0.4170,0.9430 +Kodak,8x8,ldr-rgb-kodak15.png,35.6876,0.2549,0.2258,1.7418 +Kodak,8x8,ldr-rgb-kodak16.png,36.7615,0.1872,0.1609,2.4444 +Kodak,8x8,ldr-rgb-kodak17.png,35.4203,0.1924,0.1618,2.4297 +Kodak,8x8,ldr-rgb-kodak18.png,31.4649,0.4399,0.4085,0.9626 +Kodak,8x8,ldr-rgb-kodak19.png,34.6426,0.3186,0.2877,1.3667 +Kodak,8x8,ldr-rgb-kodak20.png,35.7657,0.2361,0.2102,1.8711 +Kodak,8x8,ldr-rgb-kodak21.png,33.0156,0.3521,0.3249,1.2104 +Kodak,8x8,ldr-rgb-kodak22.png,33.8790,0.3472,0.3173,1.2393 +Kodak,8x8,ldr-rgb-kodak23.png,37.3540,0.1485,0.1207,3.2580 +Kodak,8x8,ldr-rgb-kodak24.png,31.0072,0.3848,0.3552,1.1070 +Kodak,12x12,ldr-rgb-kodak01.png,27.6608,0.5206,0.4829,0.8142 +Kodak,12x12,ldr-rgb-kodak02.png,32.1871,0.1397,0.1009,3.8984 +Kodak,12x12,ldr-rgb-kodak03.png,33.5190,0.1287,0.0929,4.2345 +Kodak,12x12,ldr-rgb-kodak04.png,32.1660,0.1276,0.0865,4.5448 +Kodak,12x12,ldr-rgb-kodak05.png,26.2987,0.5639,0.5259,0.7477 +Kodak,12x12,ldr-rgb-kodak06.png,29.1762,0.2897,0.2527,1.5563 +Kodak,12x12,ldr-rgb-kodak07.png,31.6474,0.1997,0.1606,2.4483 +Kodak,12x12,ldr-rgb-kodak08.png,25.9822,0.6047,0.5641,0.6971 +Kodak,12x12,ldr-rgb-kodak09.png,32.7718,0.1388,0.0994,3.9544 +Kodak,12x12,ldr-rgb-kodak10.png,32.1341,0.1374,0.0974,4.0373 +Kodak,12x12,ldr-rgb-kodak11.png,29.5158,0.2557,0.2187,1.7982 +Kodak,12x12,ldr-rgb-kodak12.png,33.4531,0.1144,0.0782,5.0287 +Kodak,12x12,ldr-rgb-kodak13.png,24.4685,0.6180,0.5794,0.6787 +Kodak,12x12,ldr-rgb-kodak14.png,28.1839,0.3375,0.2999,1.3110 +Kodak,12x12,ldr-rgb-kodak15.png,31.9836,0.1839,0.1449,2.7136 +Kodak,12x12,ldr-rgb-kodak16.png,32.5502,0.1178,0.0816,4.8183 +Kodak,12x12,ldr-rgb-kodak17.png,31.3724,0.1380,0.0975,4.0317 +Kodak,12x12,ldr-rgb-kodak18.png,27.6755,0.3404,0.2983,1.3182 +Kodak,12x12,ldr-rgb-kodak19.png,30.7195,0.2062,0.1654,2.3770 +Kodak,12x12,ldr-rgb-kodak20.png,31.6756,0.1742,0.1385,2.8396 +Kodak,12x12,ldr-rgb-kodak21.png,29.0798,0.3512,0.3139,1.2526 +Kodak,12x12,ldr-rgb-kodak22.png,30.2930,0.2213,0.1818,2.1624 +Kodak,12x12,ldr-rgb-kodak23.png,33.2872,0.1095,0.0720,5.4641 +Kodak,12x12,ldr-rgb-kodak24.png,26.9494,0.2999,0.2607,1.5085 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse2_thorough_results.csv new file mode 100644 index 0000000..7298fa8 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse2_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.4689,0.9316,0.9115,0.4314 +Kodak,4x4,ldr-rgb-kodak02.png,45.6389,1.2876,1.2662,0.3105 +Kodak,4x4,ldr-rgb-kodak03.png,47.9597,1.0758,1.0574,0.3719 +Kodak,4x4,ldr-rgb-kodak04.png,45.6446,1.1601,1.1368,0.3459 +Kodak,4x4,ldr-rgb-kodak05.png,42.3992,1.0453,1.0243,0.3839 +Kodak,4x4,ldr-rgb-kodak06.png,45.3144,0.9631,0.9435,0.4167 +Kodak,4x4,ldr-rgb-kodak07.png,46.3216,1.1218,1.0992,0.3577 +Kodak,4x4,ldr-rgb-kodak08.png,42.7839,1.0462,1.0224,0.3846 +Kodak,4x4,ldr-rgb-kodak09.png,47.3967,1.1940,1.1721,0.3355 +Kodak,4x4,ldr-rgb-kodak10.png,47.0389,1.1779,1.1550,0.3405 +Kodak,4x4,ldr-rgb-kodak11.png,45.0948,1.0397,1.0201,0.3855 +Kodak,4x4,ldr-rgb-kodak12.png,48.2183,1.1035,1.0846,0.3625 +Kodak,4x4,ldr-rgb-kodak13.png,41.6683,0.9443,0.9232,0.4259 +Kodak,4x4,ldr-rgb-kodak14.png,42.9421,1.0445,1.0242,0.3839 +Kodak,4x4,ldr-rgb-kodak15.png,45.7691,1.0868,1.0653,0.3691 +Kodak,4x4,ldr-rgb-kodak16.png,48.0384,1.0635,1.0446,0.3764 +Kodak,4x4,ldr-rgb-kodak17.png,46.4432,1.1188,1.0959,0.3588 +Kodak,4x4,ldr-rgb-kodak18.png,42.1352,1.1784,1.1542,0.3407 +Kodak,4x4,ldr-rgb-kodak19.png,45.5097,1.1325,1.1093,0.3545 +Kodak,4x4,ldr-rgb-kodak20.png,47.1147,0.7073,0.6889,0.5708 +Kodak,4x4,ldr-rgb-kodak21.png,45.2793,1.1323,1.1126,0.3534 +Kodak,4x4,ldr-rgb-kodak22.png,43.9667,1.2136,1.1913,0.3301 +Kodak,4x4,ldr-rgb-kodak23.png,47.1078,1.2464,1.2261,0.3207 +Kodak,4x4,ldr-rgb-kodak24.png,42.4687,1.0641,1.0420,0.3774 +Kodak,5x5,ldr-rgb-kodak01.png,40.2410,1.0908,1.0697,0.3676 +Kodak,5x5,ldr-rgb-kodak02.png,41.9963,1.3850,1.3628,0.2885 +Kodak,5x5,ldr-rgb-kodak03.png,44.3301,1.1651,1.1453,0.3433 +Kodak,5x5,ldr-rgb-kodak04.png,42.2367,1.2894,1.2651,0.3108 +Kodak,5x5,ldr-rgb-kodak05.png,38.1792,1.1877,1.1656,0.3374 +Kodak,5x5,ldr-rgb-kodak06.png,41.0841,1.0811,1.0605,0.3708 +Kodak,5x5,ldr-rgb-kodak07.png,42.7250,1.2189,1.1954,0.3289 +Kodak,5x5,ldr-rgb-kodak08.png,38.5259,1.1605,1.1355,0.3463 +Kodak,5x5,ldr-rgb-kodak09.png,44.0229,1.3093,1.2863,0.3057 +Kodak,5x5,ldr-rgb-kodak10.png,43.5844,1.2923,1.2682,0.3101 +Kodak,5x5,ldr-rgb-kodak11.png,40.9972,1.1598,1.1392,0.3452 +Kodak,5x5,ldr-rgb-kodak12.png,44.5854,1.2135,1.1935,0.3295 +Kodak,5x5,ldr-rgb-kodak13.png,36.9410,1.0897,1.0676,0.3683 +Kodak,5x5,ldr-rgb-kodak14.png,38.8916,1.1780,1.1564,0.3400 +Kodak,5x5,ldr-rgb-kodak15.png,42.1272,1.2046,1.1820,0.3327 +Kodak,5x5,ldr-rgb-kodak16.png,44.2764,1.1725,1.1525,0.3412 +Kodak,5x5,ldr-rgb-kodak17.png,42.6089,1.2280,1.2040,0.3266 +Kodak,5x5,ldr-rgb-kodak18.png,38.4688,1.3216,1.2964,0.3033 +Kodak,5x5,ldr-rgb-kodak19.png,41.7655,1.2714,1.2467,0.3154 +Kodak,5x5,ldr-rgb-kodak20.png,43.2778,0.8044,0.7847,0.5011 +Kodak,5x5,ldr-rgb-kodak21.png,40.8686,1.2891,1.2683,0.3100 +Kodak,5x5,ldr-rgb-kodak22.png,40.4316,1.3748,1.3516,0.2909 +Kodak,5x5,ldr-rgb-kodak23.png,43.8709,1.3873,1.3659,0.2879 +Kodak,5x5,ldr-rgb-kodak24.png,38.2345,1.1973,1.1741,0.3349 +Kodak,6x6,ldr-rgb-kodak01.png,36.3184,1.5074,1.4849,0.2648 +Kodak,6x6,ldr-rgb-kodak02.png,39.3844,1.5080,1.4844,0.2649 +Kodak,6x6,ldr-rgb-kodak03.png,41.7426,0.9974,0.9765,0.4027 +Kodak,6x6,ldr-rgb-kodak04.png,39.6599,1.4032,1.3774,0.2855 +Kodak,6x6,ldr-rgb-kodak05.png,34.9822,1.5332,1.5098,0.2605 +Kodak,6x6,ldr-rgb-kodak06.png,37.7454,1.3545,1.3323,0.2951 +Kodak,6x6,ldr-rgb-kodak07.png,40.1138,1.1097,1.0847,0.3625 +Kodak,6x6,ldr-rgb-kodak08.png,35.1755,1.5394,1.5131,0.2599 +Kodak,6x6,ldr-rgb-kodak09.png,41.2705,1.4741,1.4497,0.2712 +Kodak,6x6,ldr-rgb-kodak10.png,40.8232,1.4745,1.4491,0.2714 +Kodak,6x6,ldr-rgb-kodak11.png,37.7675,1.3092,1.2871,0.3055 +Kodak,6x6,ldr-rgb-kodak12.png,41.8291,1.2970,1.2757,0.3082 +Kodak,6x6,ldr-rgb-kodak13.png,32.9284,1.5353,1.5118,0.2601 +Kodak,6x6,ldr-rgb-kodak14.png,36.0228,1.5286,1.5058,0.2611 +Kodak,6x6,ldr-rgb-kodak15.png,39.4628,1.1509,1.1269,0.3489 +Kodak,6x6,ldr-rgb-kodak16.png,41.2404,1.2657,1.2444,0.3160 +Kodak,6x6,ldr-rgb-kodak17.png,39.6589,1.4054,1.3799,0.2850 +Kodak,6x6,ldr-rgb-kodak18.png,35.4446,1.5809,1.5541,0.2530 +Kodak,6x6,ldr-rgb-kodak19.png,38.7005,1.5516,1.5258,0.2577 +Kodak,6x6,ldr-rgb-kodak20.png,40.1066,0.9569,0.9361,0.4201 +Kodak,6x6,ldr-rgb-kodak21.png,37.3406,1.5316,1.5093,0.2605 +Kodak,6x6,ldr-rgb-kodak22.png,37.6235,1.5725,1.5478,0.2541 +Kodak,6x6,ldr-rgb-kodak23.png,41.4124,1.3254,1.3026,0.3019 +Kodak,6x6,ldr-rgb-kodak24.png,35.1508,1.3761,1.3515,0.2909 +Kodak,8x8,ldr-rgb-kodak01.png,31.9053,1.5831,1.5548,0.2529 +Kodak,8x8,ldr-rgb-kodak02.png,36.1281,1.2412,1.2121,0.3244 +Kodak,8x8,ldr-rgb-kodak03.png,38.1768,0.6829,0.6564,0.5991 +Kodak,8x8,ldr-rgb-kodak04.png,36.3689,1.1095,1.0786,0.3646 +Kodak,8x8,ldr-rgb-kodak05.png,30.9093,1.5730,1.5438,0.2547 +Kodak,8x8,ldr-rgb-kodak06.png,33.5801,1.3414,1.3137,0.2993 +Kodak,8x8,ldr-rgb-kodak07.png,36.4981,0.8193,0.7889,0.4985 +Kodak,8x8,ldr-rgb-kodak08.png,30.7472,1.6871,1.6551,0.2376 +Kodak,8x8,ldr-rgb-kodak09.png,37.5488,0.7824,0.7522,0.5228 +Kodak,8x8,ldr-rgb-kodak10.png,37.2361,0.8874,0.8564,0.4591 +Kodak,8x8,ldr-rgb-kodak11.png,33.8144,1.3690,1.3413,0.2932 +Kodak,8x8,ldr-rgb-kodak12.png,38.2555,0.8809,0.8538,0.4605 +Kodak,8x8,ldr-rgb-kodak13.png,28.4474,1.7279,1.6989,0.2314 +Kodak,8x8,ldr-rgb-kodak14.png,32.3327,1.5782,1.5496,0.2538 +Kodak,8x8,ldr-rgb-kodak15.png,36.0576,0.9871,0.9577,0.4106 +Kodak,8x8,ldr-rgb-kodak16.png,37.2699,1.0547,1.0278,0.3826 +Kodak,8x8,ldr-rgb-kodak17.png,35.8620,0.9652,0.9342,0.4209 +Kodak,8x8,ldr-rgb-kodak18.png,31.6467,1.5328,1.5007,0.2620 +Kodak,8x8,ldr-rgb-kodak19.png,34.9131,1.0915,1.0602,0.3709 +Kodak,8x8,ldr-rgb-kodak20.png,36.1393,0.8026,0.7763,0.5065 +Kodak,8x8,ldr-rgb-kodak21.png,33.2240,1.0984,1.0706,0.3673 +Kodak,8x8,ldr-rgb-kodak22.png,34.2148,1.3368,1.3068,0.3009 +Kodak,8x8,ldr-rgb-kodak23.png,38.1898,0.7243,0.6960,0.5650 +Kodak,8x8,ldr-rgb-kodak24.png,31.2183,1.2920,1.2617,0.3117 +Kodak,12x12,ldr-rgb-kodak01.png,27.8784,1.5026,1.4643,0.2685 +Kodak,12x12,ldr-rgb-kodak02.png,32.9300,0.9215,0.8824,0.4456 +Kodak,12x12,ldr-rgb-kodak03.png,34.4061,0.5988,0.5624,0.6992 +Kodak,12x12,ldr-rgb-kodak04.png,32.9391,0.8534,0.8123,0.4841 +Kodak,12x12,ldr-rgb-kodak05.png,26.5676,1.5608,1.5227,0.2582 +Kodak,12x12,ldr-rgb-kodak06.png,29.5235,1.1703,1.1323,0.3473 +Kodak,12x12,ldr-rgb-kodak07.png,32.5964,0.7315,0.6913,0.5688 +Kodak,12x12,ldr-rgb-kodak08.png,26.2422,1.5666,1.5254,0.2578 +Kodak,12x12,ldr-rgb-kodak09.png,33.6131,0.6591,0.6195,0.6347 +Kodak,12x12,ldr-rgb-kodak10.png,32.9798,0.6471,0.6063,0.6486 +Kodak,12x12,ldr-rgb-kodak11.png,30.0089,1.0659,1.0278,0.3826 +Kodak,12x12,ldr-rgb-kodak12.png,34.4650,0.6073,0.5696,0.6903 +Kodak,12x12,ldr-rgb-kodak13.png,24.5667,1.7448,1.7051,0.2306 +Kodak,12x12,ldr-rgb-kodak14.png,28.5595,1.3885,1.3503,0.2912 +Kodak,12x12,ldr-rgb-kodak15.png,32.6860,0.7961,0.7559,0.5202 +Kodak,12x12,ldr-rgb-kodak16.png,33.3196,0.8370,0.7996,0.4917 +Kodak,12x12,ldr-rgb-kodak17.png,32.0937,0.7257,0.6847,0.5743 +Kodak,12x12,ldr-rgb-kodak18.png,27.9094,1.2835,1.2414,0.3167 +Kodak,12x12,ldr-rgb-kodak19.png,31.0768,1.0738,1.0307,0.3815 +Kodak,12x12,ldr-rgb-kodak20.png,32.1522,0.7757,0.7382,0.5327 +Kodak,12x12,ldr-rgb-kodak21.png,29.3175,0.9851,0.9469,0.4153 +Kodak,12x12,ldr-rgb-kodak22.png,30.7345,1.1104,1.0702,0.3674 +Kodak,12x12,ldr-rgb-kodak23.png,34.3768,0.5187,0.4802,0.8188 +Kodak,12x12,ldr-rgb-kodak24.png,27.2021,1.2102,1.1706,0.3359 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse4.1_fast_results.csv new file mode 100644 index 0000000..ae5a64f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse4.1_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.6362,0.0543,0.0346,11.3571 +Kodak,4x4,ldr-rgb-kodak02.png,43.9596,0.0731,0.0523,7.5225 +Kodak,4x4,ldr-rgb-kodak03.png,46.3784,0.0495,0.0312,12.5829 +Kodak,4x4,ldr-rgb-kodak04.png,44.3400,0.0697,0.0462,8.5143 +Kodak,4x4,ldr-rgb-kodak05.png,41.1974,0.0904,0.0695,5.6580 +Kodak,4x4,ldr-rgb-kodak06.png,44.5356,0.0535,0.0340,11.5570 +Kodak,4x4,ldr-rgb-kodak07.png,44.7761,0.0632,0.0408,9.6436 +Kodak,4x4,ldr-rgb-kodak08.png,41.7589,0.0957,0.0716,5.4950 +Kodak,4x4,ldr-rgb-kodak09.png,46.0465,0.0494,0.0275,14.2753 +Kodak,4x4,ldr-rgb-kodak10.png,45.8052,0.0511,0.0285,13.7884 +Kodak,4x4,ldr-rgb-kodak11.png,44.0023,0.0611,0.0416,9.4484 +Kodak,4x4,ldr-rgb-kodak12.png,46.9029,0.0460,0.0275,14.3197 +Kodak,4x4,ldr-rgb-kodak13.png,41.1448,0.0750,0.0541,7.2646 +Kodak,4x4,ldr-rgb-kodak14.png,41.3367,0.0808,0.0609,6.4559 +Kodak,4x4,ldr-rgb-kodak15.png,44.2560,0.0737,0.0524,7.4971 +Kodak,4x4,ldr-rgb-kodak16.png,47.0662,0.0419,0.0231,17.0128 +Kodak,4x4,ldr-rgb-kodak17.png,45.5399,0.0483,0.0253,15.5433 +Kodak,4x4,ldr-rgb-kodak18.png,41.2902,0.0879,0.0635,6.1922 +Kodak,4x4,ldr-rgb-kodak19.png,44.6098,0.0579,0.0343,11.4603 +Kodak,4x4,ldr-rgb-kodak20.png,46.0245,0.0482,0.0302,13.0161 +Kodak,4x4,ldr-rgb-kodak21.png,44.3823,0.0551,0.0356,11.0569 +Kodak,4x4,ldr-rgb-kodak22.png,42.8738,0.0769,0.0548,7.1694 +Kodak,4x4,ldr-rgb-kodak23.png,45.3386,0.0566,0.0368,10.6829 +Kodak,4x4,ldr-rgb-kodak24.png,41.2840,0.0777,0.0558,7.0506 +Kodak,5x5,ldr-rgb-kodak01.png,39.4696,0.0534,0.0329,11.9395 +Kodak,5x5,ldr-rgb-kodak02.png,40.4879,0.0512,0.0297,13.2611 +Kodak,5x5,ldr-rgb-kodak03.png,42.7782,0.0411,0.0221,17.8128 +Kodak,5x5,ldr-rgb-kodak04.png,41.0854,0.0512,0.0271,14.4985 +Kodak,5x5,ldr-rgb-kodak05.png,37.1642,0.0786,0.0571,6.8895 +Kodak,5x5,ldr-rgb-kodak06.png,40.4463,0.0467,0.0267,14.7310 +Kodak,5x5,ldr-rgb-kodak07.png,41.2332,0.0508,0.0275,14.2806 +Kodak,5x5,ldr-rgb-kodak08.png,37.5683,0.0834,0.0586,6.7150 +Kodak,5x5,ldr-rgb-kodak09.png,42.6821,0.0423,0.0199,19.7725 +Kodak,5x5,ldr-rgb-kodak10.png,42.4785,0.0442,0.0210,18.7200 +Kodak,5x5,ldr-rgb-kodak11.png,40.1373,0.0504,0.0303,12.9804 +Kodak,5x5,ldr-rgb-kodak12.png,43.2666,0.0381,0.0191,20.6380 +Kodak,5x5,ldr-rgb-kodak13.png,36.7049,0.0709,0.0495,7.9510 +Kodak,5x5,ldr-rgb-kodak14.png,37.6406,0.0721,0.0513,7.6659 +Kodak,5x5,ldr-rgb-kodak15.png,41.0230,0.0520,0.0300,13.0903 +Kodak,5x5,ldr-rgb-kodak16.png,43.3875,0.0364,0.0172,22.8121 +Kodak,5x5,ldr-rgb-kodak17.png,41.9060,0.0434,0.0199,19.7210 +Kodak,5x5,ldr-rgb-kodak18.png,37.9754,0.0670,0.0420,9.3716 +Kodak,5x5,ldr-rgb-kodak19.png,40.9776,0.0486,0.0245,16.0707 +Kodak,5x5,ldr-rgb-kodak20.png,42.1605,0.0405,0.0219,17.9741 +Kodak,5x5,ldr-rgb-kodak21.png,40.2880,0.0491,0.0289,13.5835 +Kodak,5x5,ldr-rgb-kodak22.png,39.6302,0.0566,0.0338,11.6188 +Kodak,5x5,ldr-rgb-kodak23.png,42.2432,0.0435,0.0228,17.2199 +Kodak,5x5,ldr-rgb-kodak24.png,37.6337,0.0638,0.0411,9.5671 +Kodak,6x6,ldr-rgb-kodak01.png,35.7062,0.0791,0.0576,6.8276 +Kodak,6x6,ldr-rgb-kodak02.png,38.0983,0.0583,0.0355,11.0918 +Kodak,6x6,ldr-rgb-kodak03.png,40.4255,0.0450,0.0248,15.8492 +Kodak,6x6,ldr-rgb-kodak04.png,38.4693,0.0584,0.0332,11.8574 +Kodak,6x6,ldr-rgb-kodak05.png,34.2092,0.1179,0.0953,4.1265 +Kodak,6x6,ldr-rgb-kodak06.png,37.2296,0.0616,0.0402,9.7698 +Kodak,6x6,ldr-rgb-kodak07.png,38.7204,0.0600,0.0353,11.1288 +Kodak,6x6,ldr-rgb-kodak08.png,34.3095,0.1276,0.1014,3.8760 +Kodak,6x6,ldr-rgb-kodak09.png,39.8453,0.0503,0.0265,14.8210 +Kodak,6x6,ldr-rgb-kodak10.png,39.6405,0.0517,0.0268,14.6454 +Kodak,6x6,ldr-rgb-kodak11.png,37.0549,0.0665,0.0452,8.6920 +Kodak,6x6,ldr-rgb-kodak12.png,40.6359,0.0430,0.0223,17.6076 +Kodak,6x6,ldr-rgb-kodak13.png,32.7172,0.1325,0.1095,3.5913 +Kodak,6x6,ldr-rgb-kodak14.png,35.0670,0.0966,0.0746,5.2678 +Kodak,6x6,ldr-rgb-kodak15.png,38.4497,0.0601,0.0369,10.6594 +Kodak,6x6,ldr-rgb-kodak16.png,40.4456,0.0413,0.0208,18.9210 +Kodak,6x6,ldr-rgb-kodak17.png,38.8641,0.0526,0.0276,14.2609 +Kodak,6x6,ldr-rgb-kodak18.png,35.0361,0.0903,0.0641,6.1331 +Kodak,6x6,ldr-rgb-kodak19.png,37.8965,0.0629,0.0375,10.4961 +Kodak,6x6,ldr-rgb-kodak20.png,39.0600,0.0518,0.0319,12.3385 +Kodak,6x6,ldr-rgb-kodak21.png,36.8326,0.0709,0.0495,7.9444 +Kodak,6x6,ldr-rgb-kodak22.png,36.8833,0.0689,0.0450,8.7346 +Kodak,6x6,ldr-rgb-kodak23.png,39.9669,0.0478,0.0260,15.1202 +Kodak,6x6,ldr-rgb-kodak24.png,34.6964,0.0891,0.0651,6.0427 +Kodak,8x8,ldr-rgb-kodak01.png,31.2727,0.0962,0.0697,5.6434 +Kodak,8x8,ldr-rgb-kodak02.png,34.8438,0.0613,0.0339,11.5890 +Kodak,8x8,ldr-rgb-kodak03.png,36.4894,0.0509,0.0261,15.0918 +Kodak,8x8,ldr-rgb-kodak04.png,35.1177,0.0616,0.0315,12.4675 +Kodak,8x8,ldr-rgb-kodak05.png,30.1259,0.1400,0.1127,3.4893 +Kodak,8x8,ldr-rgb-kodak06.png,32.8371,0.0760,0.0498,7.8918 +Kodak,8x8,ldr-rgb-kodak07.png,34.8925,0.0669,0.0377,10.4182 +Kodak,8x8,ldr-rgb-kodak08.png,29.8620,0.1616,0.1308,3.0069 +Kodak,8x8,ldr-rgb-kodak09.png,35.9887,0.0581,0.0297,13.2526 +Kodak,8x8,ldr-rgb-kodak10.png,35.7828,0.0580,0.0283,13.8715 +Kodak,8x8,ldr-rgb-kodak11.png,32.8947,0.0778,0.0520,7.5547 +Kodak,8x8,ldr-rgb-kodak12.png,36.6150,0.0506,0.0253,15.5494 +Kodak,8x8,ldr-rgb-kodak13.png,28.1483,0.1649,0.1372,2.8650 +Kodak,8x8,ldr-rgb-kodak14.png,31.3720,0.1093,0.0825,4.7665 +Kodak,8x8,ldr-rgb-kodak15.png,34.8334,0.0641,0.0363,10.8372 +Kodak,8x8,ldr-rgb-kodak16.png,35.9796,0.0525,0.0271,14.4922 +Kodak,8x8,ldr-rgb-kodak17.png,34.7832,0.0608,0.0310,12.6725 +Kodak,8x8,ldr-rgb-kodak18.png,31.1770,0.1007,0.0696,5.6521 +Kodak,8x8,ldr-rgb-kodak19.png,33.9922,0.0706,0.0404,9.7325 +Kodak,8x8,ldr-rgb-kodak20.png,35.1135,0.0585,0.0338,11.6185 +Kodak,8x8,ldr-rgb-kodak21.png,32.6736,0.0815,0.0554,7.1034 +Kodak,8x8,ldr-rgb-kodak22.png,33.3695,0.0731,0.0443,8.8668 +Kodak,8x8,ldr-rgb-kodak23.png,36.4675,0.0511,0.0251,15.6791 +Kodak,8x8,ldr-rgb-kodak24.png,30.7403,0.1012,0.0723,5.4385 +Kodak,12x12,ldr-rgb-kodak01.png,27.1278,0.0838,0.0494,7.9557 +Kodak,12x12,ldr-rgb-kodak02.png,31.0894,0.0542,0.0197,19.9389 +Kodak,12x12,ldr-rgb-kodak03.png,32.7039,0.0490,0.0167,23.5546 +Kodak,12x12,ldr-rgb-kodak04.png,31.5079,0.0530,0.0151,26.0042 +Kodak,12x12,ldr-rgb-kodak05.png,25.7719,0.0950,0.0603,6.5181 +Kodak,12x12,ldr-rgb-kodak06.png,28.6463,0.0702,0.0364,10.7970 +Kodak,12x12,ldr-rgb-kodak07.png,30.8159,0.0579,0.0216,18.2087 +Kodak,12x12,ldr-rgb-kodak08.png,25.3175,0.1159,0.0778,5.0565 +Kodak,12x12,ldr-rgb-kodak09.png,31.7731,0.0546,0.0184,21.3705 +Kodak,12x12,ldr-rgb-kodak10.png,31.4981,0.0574,0.0203,19.3274 +Kodak,12x12,ldr-rgb-kodak11.png,28.9301,0.0632,0.0298,13.1823 +Kodak,12x12,ldr-rgb-kodak12.png,32.5101,0.0518,0.0189,20.7763 +Kodak,12x12,ldr-rgb-kodak13.png,24.2865,0.1231,0.0880,4.4661 +Kodak,12x12,ldr-rgb-kodak14.png,27.5084,0.0734,0.0386,10.1798 +Kodak,12x12,ldr-rgb-kodak15.png,31.3106,0.0597,0.0242,16.2232 +Kodak,12x12,ldr-rgb-kodak16.png,31.4372,0.0511,0.0183,21.5306 +Kodak,12x12,ldr-rgb-kodak17.png,30.8227,0.0580,0.0209,18.8161 +Kodak,12x12,ldr-rgb-kodak18.png,27.3907,0.0779,0.0395,9.9523 +Kodak,12x12,ldr-rgb-kodak19.png,30.0601,0.0639,0.0267,14.7471 +Kodak,12x12,ldr-rgb-kodak20.png,31.0166,0.0572,0.0252,15.6274 +Kodak,12x12,ldr-rgb-kodak21.png,28.6979,0.0675,0.0339,11.6007 +Kodak,12x12,ldr-rgb-kodak22.png,29.7631,0.0593,0.0233,16.8502 +Kodak,12x12,ldr-rgb-kodak23.png,32.4815,0.0535,0.0195,20.1206 +Kodak,12x12,ldr-rgb-kodak24.png,26.7141,0.0838,0.0478,8.2223 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse4.1_fastest_results.csv new file mode 100644 index 0000000..801d9f0 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse4.1_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,43.5439,0.0372,0.0177,22.1980 +Kodak,4x4,ldr-rgb-kodak02.png,42.3910,0.0420,0.0212,18.5831 +Kodak,4x4,ldr-rgb-kodak03.png,44.7710,0.0377,0.0195,20.1546 +Kodak,4x4,ldr-rgb-kodak04.png,42.9605,0.0434,0.0203,19.3847 +Kodak,4x4,ldr-rgb-kodak05.png,39.9764,0.0503,0.0300,13.1252 +Kodak,4x4,ldr-rgb-kodak06.png,43.6529,0.0371,0.0180,21.8330 +Kodak,4x4,ldr-rgb-kodak07.png,43.4729,0.0435,0.0209,18.8240 +Kodak,4x4,ldr-rgb-kodak08.png,40.5055,0.0504,0.0266,14.7825 +Kodak,4x4,ldr-rgb-kodak09.png,45.0938,0.0394,0.0178,22.0996 +Kodak,4x4,ldr-rgb-kodak10.png,44.8382,0.0403,0.0176,22.2823 +Kodak,4x4,ldr-rgb-kodak11.png,42.8561,0.0387,0.0194,20.3192 +Kodak,4x4,ldr-rgb-kodak12.png,45.6610,0.0362,0.0176,22.3620 +Kodak,4x4,ldr-rgb-kodak13.png,40.3315,0.0442,0.0233,16.8559 +Kodak,4x4,ldr-rgb-kodak14.png,39.7166,0.0524,0.0324,12.1449 +Kodak,4x4,ldr-rgb-kodak15.png,42.9403,0.0427,0.0213,18.4573 +Kodak,4x4,ldr-rgb-kodak16.png,46.4214,0.0341,0.0154,25.4721 +Kodak,4x4,ldr-rgb-kodak17.png,44.8172,0.0397,0.0172,22.8535 +Kodak,4x4,ldr-rgb-kodak18.png,40.5153,0.0470,0.0228,17.2116 +Kodak,4x4,ldr-rgb-kodak19.png,43.7124,0.0407,0.0178,22.1381 +Kodak,4x4,ldr-rgb-kodak20.png,44.8759,0.0351,0.0172,22.8827 +Kodak,4x4,ldr-rgb-kodak21.png,43.5022,0.0376,0.0184,21.3299 +Kodak,4x4,ldr-rgb-kodak22.png,41.8493,0.0423,0.0205,19.2057 +Kodak,4x4,ldr-rgb-kodak23.png,44.0973,0.0385,0.0187,21.0444 +Kodak,4x4,ldr-rgb-kodak24.png,40.1136,0.0503,0.0287,13.6932 +Kodak,5x5,ldr-rgb-kodak01.png,38.3571,0.0307,0.0106,37.2043 +Kodak,5x5,ldr-rgb-kodak02.png,39.7704,0.0321,0.0107,36.6121 +Kodak,5x5,ldr-rgb-kodak03.png,41.5780,0.0297,0.0110,35.6013 +Kodak,5x5,ldr-rgb-kodak04.png,39.9202,0.0344,0.0107,36.8354 +Kodak,5x5,ldr-rgb-kodak05.png,36.0227,0.0357,0.0147,26.8243 +Kodak,5x5,ldr-rgb-kodak06.png,39.3863,0.0302,0.0108,36.4793 +Kodak,5x5,ldr-rgb-kodak07.png,39.9992,0.0336,0.0108,36.2979 +Kodak,5x5,ldr-rgb-kodak08.png,36.1442,0.0372,0.0130,30.2868 +Kodak,5x5,ldr-rgb-kodak09.png,41.5024,0.0327,0.0106,37.1206 +Kodak,5x5,ldr-rgb-kodak10.png,41.4638,0.0337,0.0107,36.6325 +Kodak,5x5,ldr-rgb-kodak11.png,39.2621,0.0306,0.0110,35.5944 +Kodak,5x5,ldr-rgb-kodak12.png,42.2647,0.0295,0.0105,37.5311 +Kodak,5x5,ldr-rgb-kodak13.png,36.1796,0.0341,0.0129,30.5154 +Kodak,5x5,ldr-rgb-kodak14.png,36.6143,0.0374,0.0173,22.7291 +Kodak,5x5,ldr-rgb-kodak15.png,39.9014,0.0328,0.0112,35.0803 +Kodak,5x5,ldr-rgb-kodak16.png,42.5270,0.0287,0.0099,39.7749 +Kodak,5x5,ldr-rgb-kodak17.png,41.0632,0.0336,0.0107,36.6398 +Kodak,5x5,ldr-rgb-kodak18.png,37.3941,0.0367,0.0125,31.3346 +Kodak,5x5,ldr-rgb-kodak19.png,39.5696,0.0340,0.0107,36.9145 +Kodak,5x5,ldr-rgb-kodak20.png,40.9808,0.0291,0.0106,37.0714 +Kodak,5x5,ldr-rgb-kodak21.png,39.3545,0.0303,0.0107,36.9013 +Kodak,5x5,ldr-rgb-kodak22.png,38.8716,0.0340,0.0114,34.5838 +Kodak,5x5,ldr-rgb-kodak23.png,41.0132,0.0307,0.0108,36.5375 +Kodak,5x5,ldr-rgb-kodak24.png,37.0072,0.0369,0.0146,26.9881 +Kodak,6x6,ldr-rgb-kodak01.png,34.1244,0.0317,0.0113,34.9406 +Kodak,6x6,ldr-rgb-kodak02.png,37.0151,0.0325,0.0102,38.7097 +Kodak,6x6,ldr-rgb-kodak03.png,39.2769,0.0297,0.0104,37.8924 +Kodak,6x6,ldr-rgb-kodak04.png,37.2082,0.0347,0.0104,37.8238 +Kodak,6x6,ldr-rgb-kodak05.png,32.8285,0.0373,0.0153,25.7156 +Kodak,6x6,ldr-rgb-kodak06.png,36.1262,0.0311,0.0108,36.4254 +Kodak,6x6,ldr-rgb-kodak07.png,37.3637,0.0337,0.0102,38.4042 +Kodak,6x6,ldr-rgb-kodak08.png,32.6248,0.0398,0.0149,26.3285 +Kodak,6x6,ldr-rgb-kodak09.png,38.0793,0.0330,0.0104,37.7441 +Kodak,6x6,ldr-rgb-kodak10.png,38.2970,0.0345,0.0108,36.3419 +Kodak,6x6,ldr-rgb-kodak11.png,35.9521,0.0316,0.0111,35.3359 +Kodak,6x6,ldr-rgb-kodak12.png,39.3986,0.0295,0.0101,38.7944 +Kodak,6x6,ldr-rgb-kodak13.png,31.8578,0.0384,0.0164,23.9284 +Kodak,6x6,ldr-rgb-kodak14.png,33.9144,0.0376,0.0166,23.6678 +Kodak,6x6,ldr-rgb-kodak15.png,37.0909,0.0328,0.0107,36.6871 +Kodak,6x6,ldr-rgb-kodak16.png,39.5325,0.0289,0.0094,41.8585 +Kodak,6x6,ldr-rgb-kodak17.png,37.6039,0.0349,0.0110,35.7860 +Kodak,6x6,ldr-rgb-kodak18.png,34.2009,0.0378,0.0126,31.1535 +Kodak,6x6,ldr-rgb-kodak19.png,36.1180,0.0371,0.0128,30.7975 +Kodak,6x6,ldr-rgb-kodak20.png,37.6829,0.0314,0.0118,33.2219 +Kodak,6x6,ldr-rgb-kodak21.png,35.8173,0.0331,0.0126,31.2669 +Kodak,6x6,ldr-rgb-kodak22.png,35.7856,0.0352,0.0123,31.8447 +Kodak,6x6,ldr-rgb-kodak23.png,38.7390,0.0312,0.0102,38.6146 +Kodak,6x6,ldr-rgb-kodak24.png,33.8259,0.0380,0.0149,26.3234 +Kodak,8x8,ldr-rgb-kodak01.png,29.2123,0.0363,0.0116,33.8395 +Kodak,8x8,ldr-rgb-kodak02.png,33.3692,0.0378,0.0119,33.0740 +Kodak,8x8,ldr-rgb-kodak03.png,35.0174,0.0326,0.0094,41.6755 +Kodak,8x8,ldr-rgb-kodak04.png,33.8136,0.0389,0.0103,38.1545 +Kodak,8x8,ldr-rgb-kodak05.png,28.4620,0.0412,0.0153,25.7204 +Kodak,8x8,ldr-rgb-kodak06.png,30.6937,0.0357,0.0114,34.3927 +Kodak,8x8,ldr-rgb-kodak07.png,33.0023,0.0374,0.0098,39.9978 +Kodak,8x8,ldr-rgb-kodak08.png,27.8612,0.0475,0.0185,21.2699 +Kodak,8x8,ldr-rgb-kodak09.png,33.9184,0.0371,0.0102,38.5208 +Kodak,8x8,ldr-rgb-kodak10.png,34.1882,0.0381,0.0104,37.9369 +Kodak,8x8,ldr-rgb-kodak11.png,31.4228,0.0355,0.0112,34.9896 +Kodak,8x8,ldr-rgb-kodak12.png,34.6499,0.0338,0.0104,37.9736 +Kodak,8x8,ldr-rgb-kodak13.png,27.2873,0.0460,0.0201,19.5406 +Kodak,8x8,ldr-rgb-kodak14.png,29.8587,0.0391,0.0142,27.7813 +Kodak,8x8,ldr-rgb-kodak15.png,33.0416,0.0388,0.0123,31.9973 +Kodak,8x8,ldr-rgb-kodak16.png,33.7001,0.0328,0.0093,42.1635 +Kodak,8x8,ldr-rgb-kodak17.png,33.3066,0.0386,0.0108,36.5748 +Kodak,8x8,ldr-rgb-kodak18.png,30.0964,0.0423,0.0131,29.9067 +Kodak,8x8,ldr-rgb-kodak19.png,31.7467,0.0397,0.0116,33.8166 +Kodak,8x8,ldr-rgb-kodak20.png,33.5181,0.0335,0.0100,39.1378 +Kodak,8x8,ldr-rgb-kodak21.png,31.1048,0.0359,0.0115,34.1753 +Kodak,8x8,ldr-rgb-kodak22.png,32.0928,0.0373,0.0104,37.6674 +Kodak,8x8,ldr-rgb-kodak23.png,35.0552,0.0354,0.0107,36.9046 +Kodak,8x8,ldr-rgb-kodak24.png,29.9371,0.0425,0.0151,26.0977 +Kodak,12x12,ldr-rgb-kodak01.png,25.3172,0.0381,0.0084,46.6791 +Kodak,12x12,ldr-rgb-kodak02.png,30.3378,0.0391,0.0083,47.5293 +Kodak,12x12,ldr-rgb-kodak03.png,31.7897,0.0365,0.0083,47.2339 +Kodak,12x12,ldr-rgb-kodak04.png,30.7778,0.0416,0.0085,46.5185 +Kodak,12x12,ldr-rgb-kodak05.png,24.5398,0.0396,0.0089,44.1311 +Kodak,12x12,ldr-rgb-kodak06.png,26.5395,0.0381,0.0084,47.0185 +Kodak,12x12,ldr-rgb-kodak07.png,30.0574,0.0407,0.0083,47.6103 +Kodak,12x12,ldr-rgb-kodak08.png,23.2566,0.0454,0.0112,35.1776 +Kodak,12x12,ldr-rgb-kodak09.png,30.3245,0.0401,0.0084,46.8449 +Kodak,12x12,ldr-rgb-kodak10.png,30.4108,0.0411,0.0084,46.6119 +Kodak,12x12,ldr-rgb-kodak11.png,27.8367,0.0378,0.0084,46.9850 +Kodak,12x12,ldr-rgb-kodak12.png,30.2343,0.0370,0.0084,46.7334 +Kodak,12x12,ldr-rgb-kodak13.png,23.3246,0.0411,0.0103,38.1501 +Kodak,12x12,ldr-rgb-kodak14.png,26.5712,0.0390,0.0085,46.4569 +Kodak,12x12,ldr-rgb-kodak15.png,29.1919,0.0399,0.0085,45.9957 +Kodak,12x12,ldr-rgb-kodak16.png,30.1981,0.0368,0.0080,48.9063 +Kodak,12x12,ldr-rgb-kodak17.png,30.0910,0.0413,0.0082,47.9647 +Kodak,12x12,ldr-rgb-kodak18.png,26.6954,0.0432,0.0091,43.3539 +Kodak,12x12,ldr-rgb-kodak19.png,27.4935,0.0417,0.0085,46.1682 +Kodak,12x12,ldr-rgb-kodak20.png,29.6676,0.0361,0.0081,48.3245 +Kodak,12x12,ldr-rgb-kodak21.png,27.3710,0.0381,0.0087,45.4106 +Kodak,12x12,ldr-rgb-kodak22.png,28.7849,0.0403,0.0084,46.8782 +Kodak,12x12,ldr-rgb-kodak23.png,31.5692,0.0398,0.0099,39.7069 +Kodak,12x12,ldr-rgb-kodak24.png,26.0587,0.0417,0.0097,40.3876 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse4.1_medium_results.csv new file mode 100644 index 0000000..bb6b9ae --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse4.1_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.1468,0.2396,0.2200,1.7871 +Kodak,4x4,ldr-rgb-kodak02.png,45.0582,0.3837,0.3624,1.0851 +Kodak,4x4,ldr-rgb-kodak03.png,47.3861,0.1841,0.1658,2.3715 +Kodak,4x4,ldr-rgb-kodak04.png,45.1833,0.2816,0.2578,1.5252 +Kodak,4x4,ldr-rgb-kodak05.png,41.9665,0.3274,0.3063,1.2839 +Kodak,4x4,ldr-rgb-kodak06.png,45.0092,0.2274,0.2079,1.8914 +Kodak,4x4,ldr-rgb-kodak07.png,45.7464,0.2323,0.2092,1.8794 +Kodak,4x4,ldr-rgb-kodak08.png,42.3737,0.3492,0.3247,1.2112 +Kodak,4x4,ldr-rgb-kodak09.png,46.9783,0.3050,0.2826,1.3914 +Kodak,4x4,ldr-rgb-kodak10.png,46.6765,0.3044,0.2813,1.3977 +Kodak,4x4,ldr-rgb-kodak11.png,44.6907,0.2765,0.2570,1.5300 +Kodak,4x4,ldr-rgb-kodak12.png,47.7516,0.2098,0.1909,2.0600 +Kodak,4x4,ldr-rgb-kodak13.png,41.4622,0.2579,0.2368,1.6607 +Kodak,4x4,ldr-rgb-kodak14.png,42.3713,0.2964,0.2759,1.4253 +Kodak,4x4,ldr-rgb-kodak15.png,45.1851,0.2474,0.2260,1.7400 +Kodak,4x4,ldr-rgb-kodak16.png,47.7319,0.2116,0.1926,2.0420 +Kodak,4x4,ldr-rgb-kodak17.png,46.1732,0.2427,0.2196,1.7905 +Kodak,4x4,ldr-rgb-kodak18.png,41.8328,0.3705,0.3460,1.1365 +Kodak,4x4,ldr-rgb-kodak19.png,45.1811,0.3095,0.2857,1.3761 +Kodak,4x4,ldr-rgb-kodak20.png,46.7334,0.1801,0.1618,2.4306 +Kodak,4x4,ldr-rgb-kodak21.png,45.0262,0.3297,0.3100,1.2684 +Kodak,4x4,ldr-rgb-kodak22.png,43.5754,0.4326,0.4099,0.9593 +Kodak,4x4,ldr-rgb-kodak23.png,46.5536,0.3557,0.3351,1.1734 +Kodak,4x4,ldr-rgb-kodak24.png,42.1234,0.2884,0.2661,1.4778 +Kodak,5x5,ldr-rgb-kodak01.png,40.0595,0.2760,0.2547,1.5440 +Kodak,5x5,ldr-rgb-kodak02.png,41.5953,0.3160,0.2934,1.3400 +Kodak,5x5,ldr-rgb-kodak03.png,43.8592,0.1287,0.1091,3.6031 +Kodak,5x5,ldr-rgb-kodak04.png,41.9534,0.2281,0.2035,1.9322 +Kodak,5x5,ldr-rgb-kodak05.png,37.8994,0.3374,0.3154,1.2465 +Kodak,5x5,ldr-rgb-kodak06.png,40.8860,0.2109,0.1901,2.0682 +Kodak,5x5,ldr-rgb-kodak07.png,42.2937,0.1819,0.1580,2.4895 +Kodak,5x5,ldr-rgb-kodak08.png,38.2680,0.3582,0.3324,1.1828 +Kodak,5x5,ldr-rgb-kodak09.png,43.6779,0.1425,0.1191,3.3003 +Kodak,5x5,ldr-rgb-kodak10.png,43.3008,0.1694,0.1452,2.7085 +Kodak,5x5,ldr-rgb-kodak11.png,40.7541,0.2609,0.2402,1.6369 +Kodak,5x5,ldr-rgb-kodak12.png,44.2374,0.1290,0.1089,3.6119 +Kodak,5x5,ldr-rgb-kodak13.png,36.8520,0.2910,0.2688,1.4628 +Kodak,5x5,ldr-rgb-kodak14.png,38.5557,0.3013,0.2797,1.4060 +Kodak,5x5,ldr-rgb-kodak15.png,41.7817,0.2234,0.2005,1.9611 +Kodak,5x5,ldr-rgb-kodak16.png,44.0360,0.1417,0.1217,3.2306 +Kodak,5x5,ldr-rgb-kodak17.png,42.4423,0.1495,0.1251,3.1430 +Kodak,5x5,ldr-rgb-kodak18.png,38.3073,0.3147,0.2891,1.3602 +Kodak,5x5,ldr-rgb-kodak19.png,41.5356,0.2008,0.1759,2.2353 +Kodak,5x5,ldr-rgb-kodak20.png,42.8339,0.1442,0.1248,3.1498 +Kodak,5x5,ldr-rgb-kodak21.png,40.7045,0.2098,0.1888,2.0827 +Kodak,5x5,ldr-rgb-kodak22.png,40.2125,0.3064,0.2831,1.3891 +Kodak,5x5,ldr-rgb-kodak23.png,43.3590,0.1867,0.1651,2.3812 +Kodak,5x5,ldr-rgb-kodak24.png,38.0472,0.2584,0.2352,1.6718 +Kodak,6x6,ldr-rgb-kodak01.png,36.1493,0.4221,0.3998,0.9835 +Kodak,6x6,ldr-rgb-kodak02.png,38.9197,0.2665,0.2427,1.6203 +Kodak,6x6,ldr-rgb-kodak03.png,41.1619,0.1354,0.1142,3.4417 +Kodak,6x6,ldr-rgb-kodak04.png,39.2634,0.2293,0.2033,1.9338 +Kodak,6x6,ldr-rgb-kodak05.png,34.7198,0.4452,0.4215,0.9329 +Kodak,6x6,ldr-rgb-kodak06.png,37.5615,0.2691,0.2468,1.5935 +Kodak,6x6,ldr-rgb-kodak07.png,39.6600,0.1940,0.1685,2.3334 +Kodak,6x6,ldr-rgb-kodak08.png,34.9309,0.4949,0.4681,0.8401 +Kodak,6x6,ldr-rgb-kodak09.png,40.7136,0.1413,0.1166,3.3724 +Kodak,6x6,ldr-rgb-kodak10.png,40.3347,0.1506,0.1249,3.1475 +Kodak,6x6,ldr-rgb-kodak11.png,37.5085,0.2720,0.2498,1.5741 +Kodak,6x6,ldr-rgb-kodak12.png,41.2787,0.1182,0.0966,4.0725 +Kodak,6x6,ldr-rgb-kodak13.png,32.8322,0.5024,0.4785,0.8217 +Kodak,6x6,ldr-rgb-kodak14.png,35.7517,0.3399,0.3173,1.2395 +Kodak,6x6,ldr-rgb-kodak15.png,39.0601,0.2334,0.2093,1.8789 +Kodak,6x6,ldr-rgb-kodak16.png,40.8802,0.1516,0.1301,3.0219 +Kodak,6x6,ldr-rgb-kodak17.png,39.3467,0.1585,0.1325,2.9680 +Kodak,6x6,ldr-rgb-kodak18.png,35.2971,0.3639,0.3367,1.1677 +Kodak,6x6,ldr-rgb-kodak19.png,38.4283,0.2628,0.2366,1.6622 +Kodak,6x6,ldr-rgb-kodak20.png,39.6563,0.1807,0.1601,2.4562 +Kodak,6x6,ldr-rgb-kodak21.png,37.1184,0.2614,0.2391,1.6444 +Kodak,6x6,ldr-rgb-kodak22.png,37.3676,0.3151,0.2901,1.3556 +Kodak,6x6,ldr-rgb-kodak23.png,40.7804,0.1390,0.1164,3.3791 +Kodak,6x6,ldr-rgb-kodak24.png,34.9818,0.3124,0.2876,1.3673 +Kodak,8x8,ldr-rgb-kodak01.png,31.7277,0.5282,0.5005,0.7856 +Kodak,8x8,ldr-rgb-kodak02.png,35.5931,0.2400,0.2111,1.8623 +Kodak,8x8,ldr-rgb-kodak03.png,37.5035,0.1607,0.1344,2.9255 +Kodak,8x8,ldr-rgb-kodak04.png,35.8535,0.2244,0.1931,2.0362 +Kodak,8x8,ldr-rgb-kodak05.png,30.6505,0.5576,0.5289,0.7435 +Kodak,8x8,ldr-rgb-kodak06.png,33.3520,0.3120,0.2846,1.3816 +Kodak,8x8,ldr-rgb-kodak07.png,35.9153,0.2215,0.1909,2.0602 +Kodak,8x8,ldr-rgb-kodak08.png,30.5109,0.5782,0.5462,0.7199 +Kodak,8x8,ldr-rgb-kodak09.png,37.0162,0.1739,0.1437,2.7359 +Kodak,8x8,ldr-rgb-kodak10.png,36.6070,0.1709,0.1399,2.8102 +Kodak,8x8,ldr-rgb-kodak11.png,33.5011,0.3337,0.3060,1.2849 +Kodak,8x8,ldr-rgb-kodak12.png,37.5102,0.1350,0.1087,3.6188 +Kodak,8x8,ldr-rgb-kodak13.png,28.3333,0.6103,0.5814,0.6763 +Kodak,8x8,ldr-rgb-kodak14.png,32.0366,0.3951,0.3670,1.0715 +Kodak,8x8,ldr-rgb-kodak15.png,35.6876,0.2287,0.1994,1.9720 +Kodak,8x8,ldr-rgb-kodak16.png,36.7615,0.1689,0.1424,2.7615 +Kodak,8x8,ldr-rgb-kodak17.png,35.4203,0.1728,0.1416,2.7766 +Kodak,8x8,ldr-rgb-kodak18.png,31.4649,0.3918,0.3597,1.0931 +Kodak,8x8,ldr-rgb-kodak19.png,34.6426,0.2842,0.2528,1.5555 +Kodak,8x8,ldr-rgb-kodak20.png,35.7657,0.2107,0.1847,2.1287 +Kodak,8x8,ldr-rgb-kodak21.png,33.0156,0.3131,0.2857,1.3765 +Kodak,8x8,ldr-rgb-kodak22.png,33.8790,0.3087,0.2785,1.4119 +Kodak,8x8,ldr-rgb-kodak23.png,37.3540,0.1346,0.1065,3.6924 +Kodak,8x8,ldr-rgb-kodak24.png,31.0072,0.3441,0.3144,1.2507 +Kodak,12x12,ldr-rgb-kodak01.png,27.6608,0.4808,0.4431,0.8874 +Kodak,12x12,ldr-rgb-kodak02.png,32.1871,0.1315,0.0926,4.2460 +Kodak,12x12,ldr-rgb-kodak03.png,33.5190,0.1206,0.0846,4.6492 +Kodak,12x12,ldr-rgb-kodak04.png,32.1660,0.1204,0.0794,4.9544 +Kodak,12x12,ldr-rgb-kodak05.png,26.2987,0.5164,0.4778,0.8230 +Kodak,12x12,ldr-rgb-kodak06.png,29.1762,0.2688,0.2312,1.7008 +Kodak,12x12,ldr-rgb-kodak07.png,31.6474,0.1866,0.1466,2.6826 +Kodak,12x12,ldr-rgb-kodak08.png,25.9822,0.5551,0.5130,0.7665 +Kodak,12x12,ldr-rgb-kodak09.png,32.7718,0.1310,0.0911,4.3158 +Kodak,12x12,ldr-rgb-kodak10.png,32.1341,0.1298,0.0890,4.4164 +Kodak,12x12,ldr-rgb-kodak11.png,29.5158,0.2361,0.1990,1.9764 +Kodak,12x12,ldr-rgb-kodak12.png,33.4531,0.1086,0.0720,5.4648 +Kodak,12x12,ldr-rgb-kodak13.png,24.4685,0.5658,0.5272,0.7458 +Kodak,12x12,ldr-rgb-kodak14.png,28.1839,0.3139,0.2757,1.4263 +Kodak,12x12,ldr-rgb-kodak15.png,31.9836,0.1717,0.1331,2.9534 +Kodak,12x12,ldr-rgb-kodak16.png,32.5502,0.1106,0.0741,5.3099 +Kodak,12x12,ldr-rgb-kodak17.png,31.3724,0.1300,0.0890,4.4189 +Kodak,12x12,ldr-rgb-kodak18.png,27.6755,0.3146,0.2723,1.4440 +Kodak,12x12,ldr-rgb-kodak19.png,30.7195,0.1920,0.1507,2.6085 +Kodak,12x12,ldr-rgb-kodak20.png,31.6756,0.1623,0.1266,3.1069 +Kodak,12x12,ldr-rgb-kodak21.png,29.0798,0.3236,0.2862,1.3739 +Kodak,12x12,ldr-rgb-kodak22.png,30.2930,0.2067,0.1670,2.3552 +Kodak,12x12,ldr-rgb-kodak23.png,33.2872,0.1037,0.0659,5.9679 +Kodak,12x12,ldr-rgb-kodak24.png,26.9494,0.2774,0.2372,1.6576 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse4.1_thorough_results.csv new file mode 100644 index 0000000..b633bdb --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-2.5-sse4.1_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.4689,0.8130,0.7924,0.4963 +Kodak,4x4,ldr-rgb-kodak02.png,45.6389,1.0692,1.0480,0.3752 +Kodak,4x4,ldr-rgb-kodak03.png,47.9597,0.9376,0.9189,0.4279 +Kodak,4x4,ldr-rgb-kodak04.png,45.6446,1.0097,0.9861,0.3987 +Kodak,4x4,ldr-rgb-kodak05.png,42.3992,0.9125,0.8915,0.4411 +Kodak,4x4,ldr-rgb-kodak06.png,45.3144,0.8396,0.8199,0.4796 +Kodak,4x4,ldr-rgb-kodak07.png,46.3216,0.9793,0.9561,0.4113 +Kodak,4x4,ldr-rgb-kodak08.png,42.7839,0.9094,0.8849,0.4444 +Kodak,4x4,ldr-rgb-kodak09.png,47.3967,1.0467,1.0244,0.3838 +Kodak,4x4,ldr-rgb-kodak10.png,47.0389,1.0318,1.0085,0.3899 +Kodak,4x4,ldr-rgb-kodak11.png,45.0948,0.9068,0.8872,0.4432 +Kodak,4x4,ldr-rgb-kodak12.png,48.2183,0.9608,0.9419,0.4175 +Kodak,4x4,ldr-rgb-kodak13.png,41.6683,0.8232,0.8020,0.4903 +Kodak,4x4,ldr-rgb-kodak14.png,42.9421,0.9112,0.8907,0.4415 +Kodak,4x4,ldr-rgb-kodak15.png,45.7691,0.9481,0.9265,0.4244 +Kodak,4x4,ldr-rgb-kodak16.png,48.0384,0.9297,0.9107,0.4318 +Kodak,4x4,ldr-rgb-kodak17.png,46.4432,0.9768,0.9532,0.4125 +Kodak,4x4,ldr-rgb-kodak18.png,42.1352,1.0278,1.0030,0.3921 +Kodak,4x4,ldr-rgb-kodak19.png,45.5097,0.9898,0.9659,0.4071 +Kodak,4x4,ldr-rgb-kodak20.png,47.1147,0.6175,0.5991,0.6563 +Kodak,4x4,ldr-rgb-kodak21.png,45.2793,0.9847,0.9650,0.4075 +Kodak,4x4,ldr-rgb-kodak22.png,43.9667,1.0598,1.0375,0.3790 +Kodak,4x4,ldr-rgb-kodak23.png,47.1078,1.0905,1.0703,0.3674 +Kodak,4x4,ldr-rgb-kodak24.png,42.4687,0.9250,0.9028,0.4356 +Kodak,5x5,ldr-rgb-kodak01.png,40.2410,0.9361,0.9150,0.4297 +Kodak,5x5,ldr-rgb-kodak02.png,41.9963,1.1937,1.1714,0.3357 +Kodak,5x5,ldr-rgb-kodak03.png,44.3301,1.0067,0.9870,0.3984 +Kodak,5x5,ldr-rgb-kodak04.png,42.2367,1.1033,1.0786,0.3646 +Kodak,5x5,ldr-rgb-kodak05.png,38.1792,1.0200,0.9979,0.3940 +Kodak,5x5,ldr-rgb-kodak06.png,41.0841,0.9311,0.9104,0.4319 +Kodak,5x5,ldr-rgb-kodak07.png,42.7250,1.0440,1.0201,0.3855 +Kodak,5x5,ldr-rgb-kodak08.png,38.5259,0.9949,0.9693,0.4057 +Kodak,5x5,ldr-rgb-kodak09.png,44.0229,1.1240,1.1008,0.3572 +Kodak,5x5,ldr-rgb-kodak10.png,43.5844,1.1154,1.0908,0.3605 +Kodak,5x5,ldr-rgb-kodak11.png,40.9972,1.0010,0.9802,0.4011 +Kodak,5x5,ldr-rgb-kodak12.png,44.5854,1.0418,1.0217,0.3849 +Kodak,5x5,ldr-rgb-kodak13.png,36.9410,0.9322,0.9099,0.4321 +Kodak,5x5,ldr-rgb-kodak14.png,38.8916,1.0064,0.9849,0.3992 +Kodak,5x5,ldr-rgb-kodak15.png,42.1272,1.0346,1.0119,0.3886 +Kodak,5x5,ldr-rgb-kodak16.png,44.2764,1.0049,0.9845,0.3994 +Kodak,5x5,ldr-rgb-kodak17.png,42.6089,1.0550,1.0305,0.3816 +Kodak,5x5,ldr-rgb-kodak18.png,38.4688,1.1316,1.1058,0.3556 +Kodak,5x5,ldr-rgb-kodak19.png,41.7655,1.0957,1.0709,0.3672 +Kodak,5x5,ldr-rgb-kodak20.png,43.2778,0.6935,0.6739,0.5835 +Kodak,5x5,ldr-rgb-kodak21.png,40.8686,1.1125,1.0916,0.3602 +Kodak,5x5,ldr-rgb-kodak22.png,40.4316,1.1826,1.1591,0.3392 +Kodak,5x5,ldr-rgb-kodak23.png,43.8709,1.1888,1.1675,0.3368 +Kodak,5x5,ldr-rgb-kodak24.png,38.2345,1.0271,1.0037,0.3918 +Kodak,6x6,ldr-rgb-kodak01.png,36.3184,1.3196,1.2970,0.3032 +Kodak,6x6,ldr-rgb-kodak02.png,39.3844,1.3102,1.2865,0.3057 +Kodak,6x6,ldr-rgb-kodak03.png,41.7426,0.8681,0.8470,0.4642 +Kodak,6x6,ldr-rgb-kodak04.png,39.6599,1.2147,1.1884,0.3309 +Kodak,6x6,ldr-rgb-kodak05.png,34.9822,1.3310,1.3072,0.3008 +Kodak,6x6,ldr-rgb-kodak06.png,37.7454,1.1838,1.1615,0.3385 +Kodak,6x6,ldr-rgb-kodak07.png,40.1138,0.9689,0.9435,0.4168 +Kodak,6x6,ldr-rgb-kodak08.png,35.1755,1.3396,1.3126,0.2996 +Kodak,6x6,ldr-rgb-kodak09.png,41.2705,1.2824,1.2577,0.3126 +Kodak,6x6,ldr-rgb-kodak10.png,40.8232,1.2858,1.2601,0.3121 +Kodak,6x6,ldr-rgb-kodak11.png,37.7675,1.1418,1.1196,0.3512 +Kodak,6x6,ldr-rgb-kodak12.png,41.8291,1.1358,1.1144,0.3529 +Kodak,6x6,ldr-rgb-kodak13.png,32.9284,1.3351,1.3114,0.2998 +Kodak,6x6,ldr-rgb-kodak14.png,36.0228,1.3298,1.3069,0.3009 +Kodak,6x6,ldr-rgb-kodak15.png,39.4628,1.0050,0.9810,0.4009 +Kodak,6x6,ldr-rgb-kodak16.png,41.2404,1.1129,1.0914,0.3603 +Kodak,6x6,ldr-rgb-kodak17.png,39.6589,1.2156,1.1896,0.3306 +Kodak,6x6,ldr-rgb-kodak18.png,35.4446,1.3824,1.3552,0.2902 +Kodak,6x6,ldr-rgb-kodak19.png,38.7005,1.3498,1.3235,0.2971 +Kodak,6x6,ldr-rgb-kodak20.png,40.1066,0.8286,0.8077,0.4868 +Kodak,6x6,ldr-rgb-kodak21.png,37.3406,1.3304,1.3080,0.3006 +Kodak,6x6,ldr-rgb-kodak22.png,37.6235,1.3643,1.3393,0.2936 +Kodak,6x6,ldr-rgb-kodak23.png,41.4124,1.1559,1.1332,0.3470 +Kodak,6x6,ldr-rgb-kodak24.png,35.1508,1.1899,1.1652,0.3375 +Kodak,8x8,ldr-rgb-kodak01.png,31.9053,1.4118,1.3836,0.2842 +Kodak,8x8,ldr-rgb-kodak02.png,36.1281,1.0998,1.0706,0.3673 +Kodak,8x8,ldr-rgb-kodak03.png,38.1768,0.6063,0.5797,0.6783 +Kodak,8x8,ldr-rgb-kodak04.png,36.3689,0.9920,0.9602,0.4095 +Kodak,8x8,ldr-rgb-kodak05.png,30.9093,1.3963,1.3669,0.2877 +Kodak,8x8,ldr-rgb-kodak06.png,33.5801,1.1906,1.1628,0.3382 +Kodak,8x8,ldr-rgb-kodak07.png,36.4981,0.7290,0.6979,0.5634 +Kodak,8x8,ldr-rgb-kodak08.png,30.7472,1.5062,1.4739,0.2668 +Kodak,8x8,ldr-rgb-kodak09.png,37.5488,0.6967,0.6663,0.5902 +Kodak,8x8,ldr-rgb-kodak10.png,37.2361,0.7871,0.7558,0.5202 +Kodak,8x8,ldr-rgb-kodak11.png,33.8144,1.2107,1.1831,0.3324 +Kodak,8x8,ldr-rgb-kodak12.png,38.2555,0.7809,0.7539,0.5216 +Kodak,8x8,ldr-rgb-kodak13.png,28.4474,1.5487,1.5194,0.2588 +Kodak,8x8,ldr-rgb-kodak14.png,32.3327,1.4064,1.3779,0.2854 +Kodak,8x8,ldr-rgb-kodak15.png,36.0576,0.8785,0.8490,0.4632 +Kodak,8x8,ldr-rgb-kodak16.png,37.2699,0.9392,0.9121,0.4311 +Kodak,8x8,ldr-rgb-kodak17.png,35.8620,0.8620,0.8304,0.4735 +Kodak,8x8,ldr-rgb-kodak18.png,31.6467,1.3662,1.3332,0.2949 +Kodak,8x8,ldr-rgb-kodak19.png,34.9131,0.9703,0.9386,0.4189 +Kodak,8x8,ldr-rgb-kodak20.png,36.1393,0.7163,0.6898,0.5701 +Kodak,8x8,ldr-rgb-kodak21.png,33.2240,0.9723,0.9443,0.4164 +Kodak,8x8,ldr-rgb-kodak22.png,34.2148,1.1898,1.1592,0.3392 +Kodak,8x8,ldr-rgb-kodak23.png,38.1898,0.6424,0.6140,0.6405 +Kodak,8x8,ldr-rgb-kodak24.png,31.2183,1.1513,1.1210,0.3508 +Kodak,12x12,ldr-rgb-kodak01.png,27.8784,1.3689,1.3308,0.2955 +Kodak,12x12,ldr-rgb-kodak02.png,32.9300,0.8398,0.8000,0.4915 +Kodak,12x12,ldr-rgb-kodak03.png,34.4061,0.5470,0.5093,0.7720 +Kodak,12x12,ldr-rgb-kodak04.png,32.9391,0.7779,0.7365,0.5339 +Kodak,12x12,ldr-rgb-kodak05.png,26.5676,1.4259,1.3869,0.2835 +Kodak,12x12,ldr-rgb-kodak06.png,29.5235,1.0684,1.0308,0.3815 +Kodak,12x12,ldr-rgb-kodak07.png,32.5964,0.6688,0.6280,0.6262 +Kodak,12x12,ldr-rgb-kodak08.png,26.2422,1.4291,1.3875,0.2834 +Kodak,12x12,ldr-rgb-kodak09.png,33.6131,0.5979,0.5577,0.7050 +Kodak,12x12,ldr-rgb-kodak10.png,32.9798,0.5911,0.5495,0.7156 +Kodak,12x12,ldr-rgb-kodak11.png,30.0089,0.9721,0.9339,0.4210 +Kodak,12x12,ldr-rgb-kodak12.png,34.4650,0.5533,0.5156,0.7627 +Kodak,12x12,ldr-rgb-kodak13.png,24.5667,1.5868,1.5470,0.2542 +Kodak,12x12,ldr-rgb-kodak14.png,28.5595,1.2663,1.2277,0.3203 +Kodak,12x12,ldr-rgb-kodak15.png,32.6860,0.7259,0.6867,0.5726 +Kodak,12x12,ldr-rgb-kodak16.png,33.3196,0.7629,0.7257,0.5419 +Kodak,12x12,ldr-rgb-kodak17.png,32.0937,0.6630,0.6211,0.6331 +Kodak,12x12,ldr-rgb-kodak18.png,27.9094,1.1706,1.1274,0.3488 +Kodak,12x12,ldr-rgb-kodak19.png,31.0768,0.9746,0.9333,0.4213 +Kodak,12x12,ldr-rgb-kodak20.png,32.1522,0.7074,0.6706,0.5863 +Kodak,12x12,ldr-rgb-kodak21.png,29.3175,0.9007,0.8625,0.4559 +Kodak,12x12,ldr-rgb-kodak22.png,30.7345,1.0143,0.9736,0.4039 +Kodak,12x12,ldr-rgb-kodak23.png,34.3768,0.4716,0.4330,0.9081 +Kodak,12x12,ldr-rgb-kodak24.png,27.2021,1.1056,1.0646,0.3693 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-avx2_fast_results.csv new file mode 100644 index 0000000..a483546 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-avx2_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.8489,0.0350,0.0182,21.5624 +Kodak,4x4,ldr-rgb-kodak02.png,44.2380,0.0435,0.0252,15.6045 +Kodak,4x4,ldr-rgb-kodak03.png,46.6338,0.0304,0.0149,26.3125 +Kodak,4x4,ldr-rgb-kodak04.png,44.5665,0.0433,0.0226,17.3891 +Kodak,4x4,ldr-rgb-kodak05.png,41.5682,0.0514,0.0333,11.8175 +Kodak,4x4,ldr-rgb-kodak06.png,44.7452,0.0346,0.0179,21.9183 +Kodak,4x4,ldr-rgb-kodak07.png,45.0418,0.0397,0.0199,19.7248 +Kodak,4x4,ldr-rgb-kodak08.png,42.0821,0.0562,0.0346,11.3516 +Kodak,4x4,ldr-rgb-kodak09.png,46.2551,0.0330,0.0140,28.1248 +Kodak,4x4,ldr-rgb-kodak10.png,46.0288,0.0349,0.0146,26.9088 +Kodak,4x4,ldr-rgb-kodak11.png,44.2450,0.0378,0.0213,18.4548 +Kodak,4x4,ldr-rgb-kodak12.png,47.0135,0.0295,0.0137,28.6580 +Kodak,4x4,ldr-rgb-kodak13.png,41.4309,0.0479,0.0294,13.3965 +Kodak,4x4,ldr-rgb-kodak14.png,41.8065,0.0449,0.0273,14.3772 +Kodak,4x4,ldr-rgb-kodak15.png,44.5942,0.0433,0.0244,16.0896 +Kodak,4x4,ldr-rgb-kodak16.png,47.1801,0.0280,0.0123,32.0445 +Kodak,4x4,ldr-rgb-kodak17.png,45.7548,0.0336,0.0132,29.7262 +Kodak,4x4,ldr-rgb-kodak18.png,41.6128,0.0546,0.0329,11.9410 +Kodak,4x4,ldr-rgb-kodak19.png,44.8023,0.0383,0.0177,22.2748 +Kodak,4x4,ldr-rgb-kodak20.png,46.3894,0.0310,0.0154,25.4819 +Kodak,4x4,ldr-rgb-kodak21.png,44.5781,0.0353,0.0185,21.2021 +Kodak,4x4,ldr-rgb-kodak22.png,43.1599,0.0470,0.0279,14.1069 +Kodak,4x4,ldr-rgb-kodak23.png,45.5706,0.0348,0.0177,22.1893 +Kodak,4x4,ldr-rgb-kodak24.png,41.8541,0.0466,0.0275,14.2743 +Kodak,5x5,ldr-rgb-kodak01.png,39.6106,0.0354,0.0176,22.3979 +Kodak,5x5,ldr-rgb-kodak02.png,40.6312,0.0360,0.0164,23.9270 +Kodak,5x5,ldr-rgb-kodak03.png,43.0303,0.0282,0.0119,32.9906 +Kodak,5x5,ldr-rgb-kodak04.png,41.2378,0.0376,0.0158,24.9300 +Kodak,5x5,ldr-rgb-kodak05.png,37.4134,0.0484,0.0291,13.5336 +Kodak,5x5,ldr-rgb-kodak06.png,40.5758,0.0319,0.0144,27.3656 +Kodak,5x5,ldr-rgb-kodak07.png,41.4746,0.0357,0.0149,26.4183 +Kodak,5x5,ldr-rgb-kodak08.png,37.7544,0.0520,0.0297,13.2338 +Kodak,5x5,ldr-rgb-kodak09.png,42.9020,0.0309,0.0108,36.5716 +Kodak,5x5,ldr-rgb-kodak10.png,42.6178,0.0322,0.0110,35.7953 +Kodak,5x5,ldr-rgb-kodak11.png,40.2886,0.0340,0.0165,23.8340 +Kodak,5x5,ldr-rgb-kodak12.png,43.4048,0.0273,0.0102,38.4230 +Kodak,5x5,ldr-rgb-kodak13.png,36.8038,0.0451,0.0261,15.0703 +Kodak,5x5,ldr-rgb-kodak14.png,37.9374,0.0442,0.0256,15.3792 +Kodak,5x5,ldr-rgb-kodak15.png,41.1606,0.0366,0.0164,23.9590 +Kodak,5x5,ldr-rgb-kodak16.png,43.4729,0.0266,0.0094,41.7335 +Kodak,5x5,ldr-rgb-kodak17.png,42.0129,0.0325,0.0110,35.7860 +Kodak,5x5,ldr-rgb-kodak18.png,38.0842,0.0482,0.0232,16.9220 +Kodak,5x5,ldr-rgb-kodak19.png,41.1186,0.0348,0.0127,31.0474 +Kodak,5x5,ldr-rgb-kodak20.png,42.3441,0.0280,0.0119,33.0435 +Kodak,5x5,ldr-rgb-kodak21.png,40.4026,0.0331,0.0155,25.3999 +Kodak,5x5,ldr-rgb-kodak22.png,39.7574,0.0387,0.0184,21.3332 +Kodak,5x5,ldr-rgb-kodak23.png,42.4861,0.0308,0.0123,32.0414 +Kodak,5x5,ldr-rgb-kodak24.png,37.7908,0.0415,0.0214,18.3711 +Kodak,6x6,ldr-rgb-kodak01.png,35.7514,0.0421,0.0237,16.6074 +Kodak,6x6,ldr-rgb-kodak02.png,38.1633,0.0367,0.0166,23.6251 +Kodak,6x6,ldr-rgb-kodak03.png,40.5315,0.0284,0.0113,34.9310 +Kodak,6x6,ldr-rgb-kodak04.png,38.5310,0.0384,0.0158,24.9014 +Kodak,6x6,ldr-rgb-kodak05.png,34.3246,0.0542,0.0345,11.4115 +Kodak,6x6,ldr-rgb-kodak06.png,37.2781,0.0353,0.0169,23.2439 +Kodak,6x6,ldr-rgb-kodak07.png,38.8424,0.0367,0.0156,25.2209 +Kodak,6x6,ldr-rgb-kodak08.png,34.4294,0.0577,0.0349,11.2692 +Kodak,6x6,ldr-rgb-kodak09.png,39.9499,0.0325,0.0119,33.1325 +Kodak,6x6,ldr-rgb-kodak10.png,39.7100,0.0334,0.0118,33.4198 +Kodak,6x6,ldr-rgb-kodak11.png,37.1255,0.0366,0.0185,21.2045 +Kodak,6x6,ldr-rgb-kodak12.png,40.7229,0.0274,0.0101,39.0359 +Kodak,6x6,ldr-rgb-kodak13.png,32.7806,0.0571,0.0372,10.5714 +Kodak,6x6,ldr-rgb-kodak14.png,35.2350,0.0479,0.0288,13.6699 +Kodak,6x6,ldr-rgb-kodak15.png,38.5238,0.0366,0.0165,23.8069 +Kodak,6x6,ldr-rgb-kodak16.png,40.4988,0.0272,0.0098,40.0911 +Kodak,6x6,ldr-rgb-kodak17.png,38.9257,0.0337,0.0120,32.7463 +Kodak,6x6,ldr-rgb-kodak18.png,35.0961,0.0484,0.0253,15.5687 +Kodak,6x6,ldr-rgb-kodak19.png,37.9622,0.0380,0.0160,24.6328 +Kodak,6x6,ldr-rgb-kodak20.png,39.1651,0.0300,0.0135,29.1056 +Kodak,6x6,ldr-rgb-kodak21.png,36.8830,0.0369,0.0190,20.7184 +Kodak,6x6,ldr-rgb-kodak22.png,36.9688,0.0407,0.0198,19.8105 +Kodak,6x6,ldr-rgb-kodak23.png,40.0315,0.0305,0.0120,32.8690 +Kodak,6x6,ldr-rgb-kodak24.png,34.7652,0.0448,0.0242,16.2432 +Kodak,8x8,ldr-rgb-kodak01.png,31.3198,0.0554,0.0326,12.0438 +Kodak,8x8,ldr-rgb-kodak02.png,34.8859,0.0407,0.0173,22.7122 +Kodak,8x8,ldr-rgb-kodak03.png,36.5587,0.0338,0.0130,30.2963 +Kodak,8x8,ldr-rgb-kodak04.png,35.1631,0.0419,0.0160,24.5635 +Kodak,8x8,ldr-rgb-kodak05.png,30.2290,0.0686,0.0447,8.8055 +Kodak,8x8,ldr-rgb-kodak06.png,32.8875,0.0456,0.0230,17.0629 +Kodak,8x8,ldr-rgb-kodak07.png,34.9574,0.0430,0.0179,21.9920 +Kodak,8x8,ldr-rgb-kodak08.png,29.9727,0.0754,0.0486,8.0913 +Kodak,8x8,ldr-rgb-kodak09.png,36.0644,0.0386,0.0140,28.1090 +Kodak,8x8,ldr-rgb-kodak10.png,35.8574,0.0393,0.0136,28.9279 +Kodak,8x8,ldr-rgb-kodak11.png,32.9724,0.0455,0.0231,17.0511 +Kodak,8x8,ldr-rgb-kodak12.png,36.6491,0.0338,0.0122,32.1069 +Kodak,8x8,ldr-rgb-kodak13.png,28.2115,0.0787,0.0543,7.2382 +Kodak,8x8,ldr-rgb-kodak14.png,31.4868,0.0585,0.0354,11.0977 +Kodak,8x8,ldr-rgb-kodak15.png,34.9071,0.0418,0.0178,22.0573 +Kodak,8x8,ldr-rgb-kodak16.png,36.0183,0.0351,0.0139,28.2259 +Kodak,8x8,ldr-rgb-kodak17.png,34.8533,0.0409,0.0152,25.8170 +Kodak,8x8,ldr-rgb-kodak18.png,31.2426,0.0578,0.0309,12.7250 +Kodak,8x8,ldr-rgb-kodak19.png,34.0758,0.0455,0.0194,20.2792 +Kodak,8x8,ldr-rgb-kodak20.png,35.2054,0.0361,0.0155,25.3348 +Kodak,8x8,ldr-rgb-kodak21.png,32.7363,0.0464,0.0241,16.3336 +Kodak,8x8,ldr-rgb-kodak22.png,33.4351,0.0457,0.0212,18.5724 +Kodak,8x8,ldr-rgb-kodak23.png,36.4996,0.0345,0.0120,32.8337 +Kodak,8x8,ldr-rgb-kodak24.png,30.8082,0.0548,0.0303,12.9765 +Kodak,12x12,ldr-rgb-kodak01.png,27.1019,0.0531,0.0244,16.1406 +Kodak,12x12,ldr-rgb-kodak02.png,31.0998,0.0397,0.0092,42.8103 +Kodak,12x12,ldr-rgb-kodak03.png,32.6801,0.0359,0.0085,46.4465 +Kodak,12x12,ldr-rgb-kodak04.png,31.5605,0.0410,0.0082,47.7260 +Kodak,12x12,ldr-rgb-kodak05.png,25.8046,0.0599,0.0299,13.1361 +Kodak,12x12,ldr-rgb-kodak06.png,28.6329,0.0469,0.0180,21.8417 +Kodak,12x12,ldr-rgb-kodak07.png,30.8575,0.0422,0.0104,37.9552 +Kodak,12x12,ldr-rgb-kodak08.png,25.3858,0.0684,0.0343,11.4653 +Kodak,12x12,ldr-rgb-kodak09.png,31.8332,0.0403,0.0092,42.5233 +Kodak,12x12,ldr-rgb-kodak10.png,31.5261,0.0423,0.0099,39.7749 +Kodak,12x12,ldr-rgb-kodak11.png,28.9305,0.0431,0.0144,27.2498 +Kodak,12x12,ldr-rgb-kodak12.png,32.2648,0.0363,0.0083,47.4214 +Kodak,12x12,ldr-rgb-kodak13.png,24.3204,0.0711,0.0402,9.7812 +Kodak,12x12,ldr-rgb-kodak14.png,27.5269,0.0490,0.0199,19.7657 +Kodak,12x12,ldr-rgb-kodak15.png,31.2436,0.0418,0.0110,35.6144 +Kodak,12x12,ldr-rgb-kodak16.png,31.4839,0.0375,0.0093,42.2586 +Kodak,12x12,ldr-rgb-kodak17.png,30.8893,0.0430,0.0105,37.3425 +Kodak,12x12,ldr-rgb-kodak18.png,27.4177,0.0535,0.0200,19.7092 +Kodak,12x12,ldr-rgb-kodak19.png,30.1727,0.0460,0.0133,29.4680 +Kodak,12x12,ldr-rgb-kodak20.png,31.0405,0.0383,0.0110,35.7821 +Kodak,12x12,ldr-rgb-kodak21.png,28.7196,0.0459,0.0172,22.9014 +Kodak,12x12,ldr-rgb-kodak22.png,29.8238,0.0425,0.0112,35.2438 +Kodak,12x12,ldr-rgb-kodak23.png,32.5185,0.0375,0.0082,48.0304 +Kodak,12x12,ldr-rgb-kodak24.png,26.7652,0.0545,0.0232,16.9286 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-avx2_fastest_results.csv new file mode 100644 index 0000000..8623655 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-avx2_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.5072,0.0298,0.0138,28.5647 +Kodak,4x4,ldr-rgb-kodak02.png,43.8025,0.0349,0.0175,22.4926 +Kodak,4x4,ldr-rgb-kodak03.png,46.0406,0.0260,0.0110,35.6691 +Kodak,4x4,ldr-rgb-kodak04.png,44.1429,0.0360,0.0160,24.5179 +Kodak,4x4,ldr-rgb-kodak05.png,40.9879,0.0385,0.0211,18.6394 +Kodak,4x4,ldr-rgb-kodak06.png,44.4296,0.0298,0.0139,28.3887 +Kodak,4x4,ldr-rgb-kodak07.png,44.6051,0.0333,0.0140,28.0326 +Kodak,4x4,ldr-rgb-kodak08.png,41.5000,0.0423,0.0218,18.0159 +Kodak,4x4,ldr-rgb-kodak09.png,45.9005,0.0292,0.0108,36.2540 +Kodak,4x4,ldr-rgb-kodak10.png,45.6663,0.0312,0.0114,34.4049 +Kodak,4x4,ldr-rgb-kodak11.png,43.8292,0.0314,0.0154,25.4627 +Kodak,4x4,ldr-rgb-kodak12.png,46.4729,0.0263,0.0110,35.7759 +Kodak,4x4,ldr-rgb-kodak13.png,41.1509,0.0387,0.0213,18.4391 +Kodak,4x4,ldr-rgb-kodak14.png,41.0931,0.0340,0.0174,22.6194 +Kodak,4x4,ldr-rgb-kodak15.png,44.1027,0.0344,0.0164,24.0176 +Kodak,4x4,ldr-rgb-kodak16.png,47.0422,0.0255,0.0103,38.1757 +Kodak,4x4,ldr-rgb-kodak17.png,45.4973,0.0304,0.0106,36.9874 +Kodak,4x4,ldr-rgb-kodak18.png,41.2449,0.0426,0.0218,17.9978 +Kodak,4x4,ldr-rgb-kodak19.png,44.5301,0.0335,0.0135,29.2289 +Kodak,4x4,ldr-rgb-kodak20.png,45.8602,0.0261,0.0115,34.3268 +Kodak,4x4,ldr-rgb-kodak21.png,44.2614,0.0300,0.0138,28.5850 +Kodak,4x4,ldr-rgb-kodak22.png,42.7742,0.0372,0.0186,21.1770 +Kodak,4x4,ldr-rgb-kodak23.png,45.2565,0.0294,0.0128,30.7561 +Kodak,4x4,ldr-rgb-kodak24.png,41.2205,0.0365,0.0181,21.7487 +Kodak,5x5,ldr-rgb-kodak01.png,39.3652,0.0315,0.0145,27.0327 +Kodak,5x5,ldr-rgb-kodak02.png,40.3762,0.0314,0.0133,29.5118 +Kodak,5x5,ldr-rgb-kodak03.png,42.6004,0.0250,0.0095,41.3869 +Kodak,5x5,ldr-rgb-kodak04.png,40.7711,0.0334,0.0126,31.1853 +Kodak,5x5,ldr-rgb-kodak05.png,36.9823,0.0389,0.0207,18.9527 +Kodak,5x5,ldr-rgb-kodak06.png,40.4008,0.0289,0.0123,32.0053 +Kodak,5x5,ldr-rgb-kodak07.png,41.1154,0.0318,0.0120,32.6698 +Kodak,5x5,ldr-rgb-kodak08.png,37.3666,0.0427,0.0214,18.3814 +Kodak,5x5,ldr-rgb-kodak09.png,42.5422,0.0284,0.0092,42.7271 +Kodak,5x5,ldr-rgb-kodak10.png,42.3455,0.0298,0.0095,41.1874 +Kodak,5x5,ldr-rgb-kodak11.png,40.0401,0.0299,0.0132,29.8138 +Kodak,5x5,ldr-rgb-kodak12.png,43.1448,0.0248,0.0088,44.4463 +Kodak,5x5,ldr-rgb-kodak13.png,36.6876,0.0389,0.0209,18.8169 +Kodak,5x5,ldr-rgb-kodak14.png,37.3962,0.0341,0.0169,23.2203 +Kodak,5x5,ldr-rgb-kodak15.png,40.8535,0.0309,0.0123,31.9353 +Kodak,5x5,ldr-rgb-kodak16.png,43.3795,0.0245,0.0087,44.9907 +Kodak,5x5,ldr-rgb-kodak17.png,41.8560,0.0295,0.0092,42.6255 +Kodak,5x5,ldr-rgb-kodak18.png,37.9129,0.0391,0.0174,22.5661 +Kodak,5x5,ldr-rgb-kodak19.png,40.8503,0.0321,0.0114,34.5172 +Kodak,5x5,ldr-rgb-kodak20.png,42.0160,0.0252,0.0097,40.5504 +Kodak,5x5,ldr-rgb-kodak21.png,40.1806,0.0294,0.0126,31.2746 +Kodak,5x5,ldr-rgb-kodak22.png,39.4506,0.0332,0.0141,27.8461 +Kodak,5x5,ldr-rgb-kodak23.png,42.1119,0.0277,0.0104,37.8715 +Kodak,5x5,ldr-rgb-kodak24.png,37.5517,0.0349,0.0158,24.8635 +Kodak,6x6,ldr-rgb-kodak01.png,35.6562,0.0347,0.0175,22.4311 +Kodak,6x6,ldr-rgb-kodak02.png,38.0339,0.0310,0.0124,31.7161 +Kodak,6x6,ldr-rgb-kodak03.png,40.3032,0.0242,0.0085,46.1566 +Kodak,6x6,ldr-rgb-kodak04.png,38.2918,0.0328,0.0118,33.4083 +Kodak,6x6,ldr-rgb-kodak05.png,34.0896,0.0404,0.0218,18.0077 +Kodak,6x6,ldr-rgb-kodak06.png,37.2222,0.0299,0.0128,30.7848 +Kodak,6x6,ldr-rgb-kodak07.png,38.6336,0.0314,0.0114,34.4804 +Kodak,6x6,ldr-rgb-kodak08.png,34.2253,0.0439,0.0226,17.3911 +Kodak,6x6,ldr-rgb-kodak09.png,39.7573,0.0286,0.0092,42.7692 +Kodak,6x6,ldr-rgb-kodak10.png,39.5669,0.0298,0.0091,43.0922 +Kodak,6x6,ldr-rgb-kodak11.png,36.9968,0.0303,0.0134,29.2377 +Kodak,6x6,ldr-rgb-kodak12.png,40.5658,0.0245,0.0083,47.3696 +Kodak,6x6,ldr-rgb-kodak13.png,32.7154,0.0436,0.0252,15.6323 +Kodak,6x6,ldr-rgb-kodak14.png,34.8624,0.0351,0.0176,22.3596 +Kodak,6x6,ldr-rgb-kodak15.png,38.3699,0.0309,0.0120,32.6834 +Kodak,6x6,ldr-rgb-kodak16.png,40.4581,0.0246,0.0083,47.0977 +Kodak,6x6,ldr-rgb-kodak17.png,38.8420,0.0302,0.0095,41.2647 +Kodak,6x6,ldr-rgb-kodak18.png,35.0034,0.0397,0.0178,22.1007 +Kodak,6x6,ldr-rgb-kodak19.png,37.8298,0.0332,0.0123,31.9564 +Kodak,6x6,ldr-rgb-kodak20.png,39.0123,0.0257,0.0100,39.2786 +Kodak,6x6,ldr-rgb-kodak21.png,36.8075,0.0308,0.0139,28.3131 +Kodak,6x6,ldr-rgb-kodak22.png,36.8498,0.0337,0.0141,27.9295 +Kodak,6x6,ldr-rgb-kodak23.png,39.8307,0.0267,0.0093,42.4314 +Kodak,6x6,ldr-rgb-kodak24.png,34.6916,0.0362,0.0166,23.6964 +Kodak,8x8,ldr-rgb-kodak01.png,31.1792,0.0449,0.0241,16.2883 +Kodak,8x8,ldr-rgb-kodak02.png,34.7811,0.0351,0.0134,29.3840 +Kodak,8x8,ldr-rgb-kodak03.png,36.4262,0.0293,0.0103,38.3399 +Kodak,8x8,ldr-rgb-kodak04.png,35.0547,0.0370,0.0126,31.2349 +Kodak,8x8,ldr-rgb-kodak05.png,30.0205,0.0516,0.0298,13.2014 +Kodak,8x8,ldr-rgb-kodak06.png,32.7989,0.0381,0.0177,22.1631 +Kodak,8x8,ldr-rgb-kodak07.png,34.8360,0.0373,0.0137,28.6137 +Kodak,8x8,ldr-rgb-kodak08.png,29.7069,0.0569,0.0319,12.3153 +Kodak,8x8,ldr-rgb-kodak09.png,35.8914,0.0340,0.0108,36.3892 +Kodak,8x8,ldr-rgb-kodak10.png,35.7051,0.0347,0.0106,36.9807 +Kodak,8x8,ldr-rgb-kodak11.png,32.8451,0.0373,0.0169,23.2465 +Kodak,8x8,ldr-rgb-kodak12.png,36.5111,0.0297,0.0101,39.1109 +Kodak,8x8,ldr-rgb-kodak13.png,28.1364,0.0592,0.0369,10.6626 +Kodak,8x8,ldr-rgb-kodak14.png,31.2591,0.0447,0.0232,16.9307 +Kodak,8x8,ldr-rgb-kodak15.png,34.7599,0.0357,0.0133,29.5007 +Kodak,8x8,ldr-rgb-kodak16.png,35.9616,0.0310,0.0113,34.8196 +Kodak,8x8,ldr-rgb-kodak17.png,34.7164,0.0360,0.0119,32.9603 +Kodak,8x8,ldr-rgb-kodak18.png,31.1666,0.0474,0.0223,17.6464 +Kodak,8x8,ldr-rgb-kodak19.png,33.8904,0.0392,0.0148,26.5758 +Kodak,8x8,ldr-rgb-kodak20.png,35.0191,0.0310,0.0119,33.0932 +Kodak,8x8,ldr-rgb-kodak21.png,32.6198,0.0379,0.0177,22.2294 +Kodak,8x8,ldr-rgb-kodak22.png,33.3242,0.0388,0.0159,24.7947 +Kodak,8x8,ldr-rgb-kodak23.png,36.3894,0.0305,0.0096,40.9045 +Kodak,8x8,ldr-rgb-kodak24.png,30.7268,0.0444,0.0215,18.2500 +Kodak,12x12,ldr-rgb-kodak01.png,26.9930,0.0436,0.0184,21.3183 +Kodak,12x12,ldr-rgb-kodak02.png,31.0354,0.0340,0.0081,48.3770 +Kodak,12x12,ldr-rgb-kodak03.png,32.6215,0.0305,0.0072,54.9811 +Kodak,12x12,ldr-rgb-kodak04.png,31.4774,0.0358,0.0072,54.9499 +Kodak,12x12,ldr-rgb-kodak05.png,25.6941,0.0479,0.0218,18.0449 +Kodak,12x12,ldr-rgb-kodak06.png,28.4895,0.0387,0.0142,27.7594 +Kodak,12x12,ldr-rgb-kodak07.png,30.8016,0.0362,0.0085,46.3316 +Kodak,12x12,ldr-rgb-kodak08.png,25.2157,0.0542,0.0255,15.4058 +Kodak,12x12,ldr-rgb-kodak09.png,31.6339,0.0348,0.0078,50.4641 +Kodak,12x12,ldr-rgb-kodak10.png,31.4567,0.0364,0.0082,47.6915 +Kodak,12x12,ldr-rgb-kodak11.png,28.8572,0.0360,0.0114,34.5563 +Kodak,12x12,ldr-rgb-kodak12.png,32.1857,0.0307,0.0072,54.9335 +Kodak,12x12,ldr-rgb-kodak13.png,24.2396,0.0550,0.0290,13.5396 +Kodak,12x12,ldr-rgb-kodak14.png,27.4380,0.0403,0.0150,26.1481 +Kodak,12x12,ldr-rgb-kodak15.png,31.1533,0.0357,0.0092,42.8849 +Kodak,12x12,ldr-rgb-kodak16.png,31.3620,0.0318,0.0080,48.9615 +Kodak,12x12,ldr-rgb-kodak17.png,30.8364,0.0369,0.0085,46.1256 +Kodak,12x12,ldr-rgb-kodak18.png,27.3672,0.0444,0.0146,26.9567 +Kodak,12x12,ldr-rgb-kodak19.png,29.8648,0.0395,0.0108,36.3315 +Kodak,12x12,ldr-rgb-kodak20.png,30.9381,0.0322,0.0090,43.5025 +Kodak,12x12,ldr-rgb-kodak21.png,28.6166,0.0380,0.0133,29.6407 +Kodak,12x12,ldr-rgb-kodak22.png,29.7245,0.0364,0.0092,42.9184 +Kodak,12x12,ldr-rgb-kodak23.png,32.4842,0.0324,0.0073,53.8941 +Kodak,12x12,ldr-rgb-kodak24.png,26.6937,0.0440,0.0170,23.1058 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-avx2_medium_results.csv new file mode 100644 index 0000000..fae29ae --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-avx2_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.2910,0.1174,0.0994,3.9546 +Kodak,4x4,ldr-rgb-kodak02.png,45.3499,0.1594,0.1401,2.8069 +Kodak,4x4,ldr-rgb-kodak03.png,47.6132,0.0850,0.0686,5.7358 +Kodak,4x4,ldr-rgb-kodak04.png,45.4289,0.1290,0.1074,3.6614 +Kodak,4x4,ldr-rgb-kodak05.png,42.1296,0.1474,0.1284,3.0632 +Kodak,4x4,ldr-rgb-kodak06.png,45.1555,0.1114,0.0934,4.2107 +Kodak,4x4,ldr-rgb-kodak07.png,45.9745,0.1090,0.0879,4.4748 +Kodak,4x4,ldr-rgb-kodak08.png,42.5130,0.1643,0.1419,2.7712 +Kodak,4x4,ldr-rgb-kodak09.png,47.1616,0.1273,0.1069,3.6783 +Kodak,4x4,ldr-rgb-kodak10.png,46.8287,0.1315,0.1102,3.5698 +Kodak,4x4,ldr-rgb-kodak11.png,44.8668,0.1277,0.1097,3.5859 +Kodak,4x4,ldr-rgb-kodak12.png,47.9301,0.0961,0.0793,4.9613 +Kodak,4x4,ldr-rgb-kodak13.png,41.6152,0.1264,0.1072,3.6670 +Kodak,4x4,ldr-rgb-kodak14.png,42.6269,0.1365,0.1180,3.3331 +Kodak,4x4,ldr-rgb-kodak15.png,45.4386,0.1138,0.0938,4.1910 +Kodak,4x4,ldr-rgb-kodak16.png,47.8565,0.0981,0.0810,4.8534 +Kodak,4x4,ldr-rgb-kodak17.png,46.2901,0.1139,0.0924,4.2554 +Kodak,4x4,ldr-rgb-kodak18.png,41.9927,0.1670,0.1441,2.7278 +Kodak,4x4,ldr-rgb-kodak19.png,45.3392,0.1356,0.1135,3.4631 +Kodak,4x4,ldr-rgb-kodak20.png,46.8869,0.0832,0.0670,5.8712 +Kodak,4x4,ldr-rgb-kodak21.png,45.1510,0.1344,0.1166,3.3719 +Kodak,4x4,ldr-rgb-kodak22.png,43.7746,0.1666,0.1460,2.6931 +Kodak,4x4,ldr-rgb-kodak23.png,46.8184,0.1284,0.1102,3.5681 +Kodak,4x4,ldr-rgb-kodak24.png,42.2960,0.1333,0.1130,3.4806 +Kodak,5x5,ldr-rgb-kodak01.png,40.1121,0.1325,0.1129,3.4826 +Kodak,5x5,ldr-rgb-kodak02.png,41.6953,0.1416,0.1210,3.2506 +Kodak,5x5,ldr-rgb-kodak03.png,44.0360,0.0692,0.0513,7.6680 +Kodak,5x5,ldr-rgb-kodak04.png,42.0560,0.1135,0.0899,4.3716 +Kodak,5x5,ldr-rgb-kodak05.png,37.9816,0.1537,0.1331,2.9535 +Kodak,5x5,ldr-rgb-kodak06.png,40.9586,0.1067,0.0874,4.4972 +Kodak,5x5,ldr-rgb-kodak07.png,42.4607,0.0937,0.0710,5.5383 +Kodak,5x5,ldr-rgb-kodak08.png,38.3486,0.1678,0.1440,2.7302 +Kodak,5x5,ldr-rgb-kodak09.png,43.8038,0.0812,0.0592,6.6419 +Kodak,5x5,ldr-rgb-kodak10.png,43.4092,0.0916,0.0684,5.7500 +Kodak,5x5,ldr-rgb-kodak11.png,40.8377,0.1217,0.1023,3.8423 +Kodak,5x5,ldr-rgb-kodak12.png,44.3921,0.0702,0.0515,7.6329 +Kodak,5x5,ldr-rgb-kodak13.png,36.9078,0.1403,0.1192,3.2992 +Kodak,5x5,ldr-rgb-kodak14.png,38.6484,0.1374,0.1174,3.3493 +Kodak,5x5,ldr-rgb-kodak15.png,41.8912,0.1062,0.0847,4.6400 +Kodak,5x5,ldr-rgb-kodak16.png,44.1367,0.0767,0.0582,6.7603 +Kodak,5x5,ldr-rgb-kodak17.png,42.5213,0.0824,0.0589,6.6757 +Kodak,5x5,ldr-rgb-kodak18.png,38.3607,0.1511,0.1269,3.0998 +Kodak,5x5,ldr-rgb-kodak19.png,41.6469,0.1051,0.0818,4.8076 +Kodak,5x5,ldr-rgb-kodak20.png,42.9685,0.0753,0.0573,6.8682 +Kodak,5x5,ldr-rgb-kodak21.png,40.7620,0.1054,0.0859,4.5800 +Kodak,5x5,ldr-rgb-kodak22.png,40.2773,0.1440,0.1222,3.2171 +Kodak,5x5,ldr-rgb-kodak23.png,43.5488,0.0919,0.0723,5.4415 +Kodak,5x5,ldr-rgb-kodak24.png,38.1152,0.1239,0.1022,3.8465 +Kodak,6x6,ldr-rgb-kodak01.png,36.1951,0.1344,0.1142,3.4435 +Kodak,6x6,ldr-rgb-kodak02.png,39.0094,0.1106,0.0894,4.3989 +Kodak,6x6,ldr-rgb-kodak03.png,41.3262,0.0585,0.0398,9.8729 +Kodak,6x6,ldr-rgb-kodak04.png,39.3983,0.0968,0.0727,5.4106 +Kodak,6x6,ldr-rgb-kodak05.png,34.7867,0.1477,0.1264,3.1107 +Kodak,6x6,ldr-rgb-kodak06.png,37.6289,0.0939,0.0739,5.3213 +Kodak,6x6,ldr-rgb-kodak07.png,39.7726,0.0800,0.0570,6.9014 +Kodak,6x6,ldr-rgb-kodak08.png,34.9978,0.1644,0.1393,2.8238 +Kodak,6x6,ldr-rgb-kodak09.png,40.8821,0.0638,0.0414,9.5074 +Kodak,6x6,ldr-rgb-kodak10.png,40.5030,0.0678,0.0445,8.8379 +Kodak,6x6,ldr-rgb-kodak11.png,37.5798,0.1003,0.0805,4.8833 +Kodak,6x6,ldr-rgb-kodak12.png,41.4837,0.0554,0.0363,10.8190 +Kodak,6x6,ldr-rgb-kodak13.png,32.8829,0.1521,0.1307,3.0095 +Kodak,6x6,ldr-rgb-kodak14.png,35.8236,0.1244,0.1038,3.7896 +Kodak,6x6,ldr-rgb-kodak15.png,39.1953,0.0973,0.0756,5.2042 +Kodak,6x6,ldr-rgb-kodak16.png,41.0408,0.0629,0.0439,8.9497 +Kodak,6x6,ldr-rgb-kodak17.png,39.4928,0.0684,0.0448,8.7789 +Kodak,6x6,ldr-rgb-kodak18.png,35.3481,0.1332,0.1082,3.6338 +Kodak,6x6,ldr-rgb-kodak19.png,38.5316,0.0947,0.0707,5.5611 +Kodak,6x6,ldr-rgb-kodak20.png,39.7651,0.0694,0.0509,7.7313 +Kodak,6x6,ldr-rgb-kodak21.png,37.1926,0.0921,0.0721,5.4528 +Kodak,6x6,ldr-rgb-kodak22.png,37.4532,0.1203,0.0978,4.0207 +Kodak,6x6,ldr-rgb-kodak23.png,40.9705,0.0676,0.0471,8.3438 +Kodak,6x6,ldr-rgb-kodak24.png,35.0426,0.1099,0.0876,4.4912 +Kodak,8x8,ldr-rgb-kodak01.png,31.8012,0.1770,0.1531,2.5677 +Kodak,8x8,ldr-rgb-kodak02.png,35.7606,0.1071,0.0824,4.7745 +Kodak,8x8,ldr-rgb-kodak03.png,37.7459,0.0699,0.0478,8.2326 +Kodak,8x8,ldr-rgb-kodak04.png,36.0605,0.1055,0.0776,5.0656 +Kodak,8x8,ldr-rgb-kodak05.png,30.7416,0.1844,0.1595,2.4658 +Kodak,8x8,ldr-rgb-kodak06.png,33.4352,0.1170,0.0932,4.2212 +Kodak,8x8,ldr-rgb-kodak07.png,36.1304,0.0921,0.0652,6.0296 +Kodak,8x8,ldr-rgb-kodak08.png,30.5708,0.1872,0.1590,2.4732 +Kodak,8x8,ldr-rgb-kodak09.png,37.2646,0.0727,0.0467,8.4227 +Kodak,8x8,ldr-rgb-kodak10.png,36.9159,0.0751,0.0479,8.2012 +Kodak,8x8,ldr-rgb-kodak11.png,33.6569,0.1163,0.0923,4.2580 +Kodak,8x8,ldr-rgb-kodak12.png,37.8259,0.0670,0.0443,8.8830 +Kodak,8x8,ldr-rgb-kodak13.png,28.3927,0.2040,0.1789,2.1978 +Kodak,8x8,ldr-rgb-kodak14.png,32.1340,0.1491,0.1252,3.1416 +Kodak,8x8,ldr-rgb-kodak15.png,35.8359,0.0976,0.0720,5.4579 +Kodak,8x8,ldr-rgb-kodak16.png,37.0213,0.0771,0.0543,7.2435 +Kodak,8x8,ldr-rgb-kodak17.png,35.6807,0.0826,0.0552,7.1188 +Kodak,8x8,ldr-rgb-kodak18.png,31.5529,0.1503,0.1214,3.2391 +Kodak,8x8,ldr-rgb-kodak19.png,34.7649,0.1117,0.0836,4.7048 +Kodak,8x8,ldr-rgb-kodak20.png,35.8945,0.0842,0.0621,6.3292 +Kodak,8x8,ldr-rgb-kodak21.png,33.1150,0.1156,0.0916,4.2912 +Kodak,8x8,ldr-rgb-kodak22.png,34.0244,0.1268,0.1004,3.9148 +Kodak,8x8,ldr-rgb-kodak23.png,37.6470,0.0687,0.0447,8.8007 +Kodak,8x8,ldr-rgb-kodak24.png,31.1140,0.1304,0.1044,3.7653 +Kodak,12x12,ldr-rgb-kodak01.png,27.7578,0.1938,0.1613,2.4379 +Kodak,12x12,ldr-rgb-kodak02.png,32.4621,0.0836,0.0501,7.8431 +Kodak,12x12,ldr-rgb-kodak03.png,33.7766,0.0687,0.0381,10.3168 +Kodak,12x12,ldr-rgb-kodak04.png,32.4443,0.0801,0.0443,8.8842 +Kodak,12x12,ldr-rgb-kodak05.png,26.3986,0.2061,0.1731,2.2719 +Kodak,12x12,ldr-rgb-kodak06.png,29.3737,0.1269,0.0949,4.1453 +Kodak,12x12,ldr-rgb-kodak07.png,32.0414,0.0946,0.0594,6.6192 +Kodak,12x12,ldr-rgb-kodak08.png,26.0600,0.2085,0.1721,2.2846 +Kodak,12x12,ldr-rgb-kodak09.png,33.0989,0.0729,0.0386,10.1986 +Kodak,12x12,ldr-rgb-kodak10.png,32.4884,0.0753,0.0395,9.9463 +Kodak,12x12,ldr-rgb-kodak11.png,29.7433,0.1145,0.0823,4.7767 +Kodak,12x12,ldr-rgb-kodak12.png,33.8819,0.0658,0.0347,11.3306 +Kodak,12x12,ldr-rgb-kodak13.png,24.5282,0.2346,0.2010,1.9561 +Kodak,12x12,ldr-rgb-kodak14.png,28.4176,0.1516,0.1191,3.3017 +Kodak,12x12,ldr-rgb-kodak15.png,32.2342,0.0908,0.0569,6.9104 +Kodak,12x12,ldr-rgb-kodak16.png,32.9807,0.0722,0.0410,9.5958 +Kodak,12x12,ldr-rgb-kodak17.png,31.7805,0.0804,0.0446,8.8068 +Kodak,12x12,ldr-rgb-kodak18.png,27.7783,0.1501,0.1134,3.4671 +Kodak,12x12,ldr-rgb-kodak19.png,30.8882,0.1004,0.0644,6.1055 +Kodak,12x12,ldr-rgb-kodak20.png,31.8562,0.0781,0.0478,8.2278 +Kodak,12x12,ldr-rgb-kodak21.png,29.1771,0.1353,0.1033,3.8072 +Kodak,12x12,ldr-rgb-kodak22.png,30.4983,0.1091,0.0745,5.2800 +Kodak,12x12,ldr-rgb-kodak23.png,33.5464,0.0638,0.0316,12.4613 +Kodak,12x12,ldr-rgb-kodak24.png,27.0976,0.1355,0.1013,3.8835 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-avx2_thorough_results.csv new file mode 100644 index 0000000..bdb66b4 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-avx2_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.4944,0.3071,0.2885,1.3632 +Kodak,4x4,ldr-rgb-kodak02.png,45.6493,0.3620,0.3425,1.1481 +Kodak,4x4,ldr-rgb-kodak03.png,47.9884,0.3118,0.2948,1.3340 +Kodak,4x4,ldr-rgb-kodak04.png,45.6562,0.3425,0.3206,1.2266 +Kodak,4x4,ldr-rgb-kodak05.png,42.4063,0.3390,0.3199,1.2291 +Kodak,4x4,ldr-rgb-kodak06.png,45.3572,0.3047,0.2867,1.3713 +Kodak,4x4,ldr-rgb-kodak07.png,46.3419,0.3395,0.3177,1.2379 +Kodak,4x4,ldr-rgb-kodak08.png,42.8054,0.3640,0.3414,1.1519 +Kodak,4x4,ldr-rgb-kodak09.png,47.4208,0.3462,0.3254,1.2086 +Kodak,4x4,ldr-rgb-kodak10.png,47.0603,0.3450,0.3228,1.2183 +Kodak,4x4,ldr-rgb-kodak11.png,45.1121,0.3204,0.3026,1.2993 +Kodak,4x4,ldr-rgb-kodak12.png,48.2457,0.3182,0.3006,1.3080 +Kodak,4x4,ldr-rgb-kodak13.png,41.7174,0.3100,0.2907,1.3526 +Kodak,4x4,ldr-rgb-kodak14.png,42.9405,0.3301,0.3112,1.2635 +Kodak,4x4,ldr-rgb-kodak15.png,45.7858,0.3280,0.3077,1.2778 +Kodak,4x4,ldr-rgb-kodak16.png,48.0652,0.3160,0.2990,1.3151 +Kodak,4x4,ldr-rgb-kodak17.png,46.4610,0.3321,0.3106,1.2662 +Kodak,4x4,ldr-rgb-kodak18.png,42.1541,0.3619,0.3389,1.1603 +Kodak,4x4,ldr-rgb-kodak19.png,45.5439,0.3459,0.3240,1.2137 +Kodak,4x4,ldr-rgb-kodak20.png,47.1284,0.2186,0.2017,1.9495 +Kodak,4x4,ldr-rgb-kodak21.png,45.3018,0.3346,0.3166,1.2420 +Kodak,4x4,ldr-rgb-kodak22.png,43.9797,0.3679,0.3472,1.1324 +Kodak,4x4,ldr-rgb-kodak23.png,47.1533,0.3552,0.3368,1.1676 +Kodak,4x4,ldr-rgb-kodak24.png,42.5030,0.3316,0.3113,1.2630 +Kodak,5x5,ldr-rgb-kodak01.png,40.2326,0.3683,0.3481,1.1296 +Kodak,5x5,ldr-rgb-kodak02.png,41.9976,0.4272,0.4062,0.9681 +Kodak,5x5,ldr-rgb-kodak03.png,44.3239,0.3514,0.3329,1.1811 +Kodak,5x5,ldr-rgb-kodak04.png,42.2394,0.3900,0.3660,1.0744 +Kodak,5x5,ldr-rgb-kodak05.png,38.1756,0.4025,0.3820,1.0295 +Kodak,5x5,ldr-rgb-kodak06.png,41.0844,0.3501,0.3307,1.1890 +Kodak,5x5,ldr-rgb-kodak07.png,42.7249,0.3847,0.3619,1.0865 +Kodak,5x5,ldr-rgb-kodak08.png,38.5334,0.4128,0.3883,1.0126 +Kodak,5x5,ldr-rgb-kodak09.png,44.0288,0.3855,0.3632,1.0825 +Kodak,5x5,ldr-rgb-kodak10.png,43.5935,0.3918,0.3686,1.0669 +Kodak,5x5,ldr-rgb-kodak11.png,40.9987,0.3654,0.3462,1.1358 +Kodak,5x5,ldr-rgb-kodak12.png,44.5960,0.3597,0.3406,1.1544 +Kodak,5x5,ldr-rgb-kodak13.png,36.9510,0.3601,0.3392,1.1593 +Kodak,5x5,ldr-rgb-kodak14.png,38.8797,0.3856,0.3658,1.0751 +Kodak,5x5,ldr-rgb-kodak15.png,42.1246,0.3693,0.3474,1.1320 +Kodak,5x5,ldr-rgb-kodak16.png,44.2686,0.3576,0.3390,1.1600 +Kodak,5x5,ldr-rgb-kodak17.png,42.6009,0.3782,0.3549,1.1081 +Kodak,5x5,ldr-rgb-kodak18.png,38.4550,0.4186,0.3942,0.9975 +Kodak,5x5,ldr-rgb-kodak19.png,41.7719,0.3997,0.3761,1.0456 +Kodak,5x5,ldr-rgb-kodak20.png,43.2708,0.2539,0.2360,1.6660 +Kodak,5x5,ldr-rgb-kodak21.png,40.8630,0.3955,0.3760,1.0457 +Kodak,5x5,ldr-rgb-kodak22.png,40.4255,0.4260,0.4035,0.9744 +Kodak,5x5,ldr-rgb-kodak23.png,43.8841,0.4162,0.3965,0.9917 +Kodak,5x5,ldr-rgb-kodak24.png,38.2272,0.3812,0.3588,1.0958 +Kodak,6x6,ldr-rgb-kodak01.png,36.3116,0.4253,0.4049,0.9711 +Kodak,6x6,ldr-rgb-kodak02.png,39.3780,0.4874,0.4656,0.8444 +Kodak,6x6,ldr-rgb-kodak03.png,41.7331,0.3027,0.2838,1.3855 +Kodak,6x6,ldr-rgb-kodak04.png,39.6521,0.4248,0.4004,0.9822 +Kodak,6x6,ldr-rgb-kodak05.png,34.9741,0.4598,0.4384,0.8970 +Kodak,6x6,ldr-rgb-kodak06.png,37.7401,0.3812,0.3610,1.0893 +Kodak,6x6,ldr-rgb-kodak07.png,40.1032,0.3498,0.3260,1.2063 +Kodak,6x6,ldr-rgb-kodak08.png,35.1660,0.4647,0.4397,0.8942 +Kodak,6x6,ldr-rgb-kodak09.png,41.2613,0.4253,0.4030,0.9758 +Kodak,6x6,ldr-rgb-kodak10.png,40.8141,0.4333,0.4094,0.9604 +Kodak,6x6,ldr-rgb-kodak11.png,37.7541,0.3923,0.3722,1.0565 +Kodak,6x6,ldr-rgb-kodak12.png,41.8249,0.3665,0.3470,1.1333 +Kodak,6x6,ldr-rgb-kodak13.png,32.9256,0.4290,0.4073,0.9653 +Kodak,6x6,ldr-rgb-kodak14.png,36.0210,0.4456,0.4247,0.9259 +Kodak,6x6,ldr-rgb-kodak15.png,39.4514,0.3630,0.3405,1.1547 +Kodak,6x6,ldr-rgb-kodak16.png,41.2290,0.3540,0.3349,1.1740 +Kodak,6x6,ldr-rgb-kodak17.png,39.6521,0.4072,0.3837,1.0248 +Kodak,6x6,ldr-rgb-kodak18.png,35.4328,0.4882,0.4629,0.8494 +Kodak,6x6,ldr-rgb-kodak19.png,38.6954,0.4585,0.4343,0.9054 +Kodak,6x6,ldr-rgb-kodak20.png,40.0953,0.2829,0.2642,1.4886 +Kodak,6x6,ldr-rgb-kodak21.png,37.3344,0.4522,0.4314,0.9115 +Kodak,6x6,ldr-rgb-kodak22.png,37.6231,0.4924,0.4696,0.8374 +Kodak,6x6,ldr-rgb-kodak23.png,41.4033,0.4221,0.4015,0.9794 +Kodak,6x6,ldr-rgb-kodak24.png,35.1417,0.4048,0.3816,1.0303 +Kodak,8x8,ldr-rgb-kodak01.png,31.9071,0.5014,0.4760,0.8260 +Kodak,8x8,ldr-rgb-kodak02.png,36.1354,0.4438,0.4173,0.9423 +Kodak,8x8,ldr-rgb-kodak03.png,38.1744,0.2366,0.2124,1.8515 +Kodak,8x8,ldr-rgb-kodak04.png,36.3637,0.3795,0.3504,1.1222 +Kodak,8x8,ldr-rgb-kodak05.png,30.9009,0.5102,0.4837,0.8129 +Kodak,8x8,ldr-rgb-kodak06.png,33.5749,0.4135,0.3886,1.0119 +Kodak,8x8,ldr-rgb-kodak07.png,36.4888,0.2852,0.2569,1.5305 +Kodak,8x8,ldr-rgb-kodak08.png,30.7484,0.5461,0.5166,0.7612 +Kodak,8x8,ldr-rgb-kodak09.png,37.5499,0.2655,0.2376,1.6552 +Kodak,8x8,ldr-rgb-kodak10.png,37.2288,0.2978,0.2686,1.4639 +Kodak,8x8,ldr-rgb-kodak11.png,33.8276,0.4467,0.4214,0.9331 +Kodak,8x8,ldr-rgb-kodak12.png,38.2490,0.2786,0.2544,1.5456 +Kodak,8x8,ldr-rgb-kodak13.png,28.4502,0.5532,0.5267,0.7465 +Kodak,8x8,ldr-rgb-kodak14.png,32.3258,0.5107,0.4851,0.8105 +Kodak,8x8,ldr-rgb-kodak15.png,36.0605,0.3476,0.3207,1.2261 +Kodak,8x8,ldr-rgb-kodak16.png,37.2636,0.3277,0.3031,1.2973 +Kodak,8x8,ldr-rgb-kodak17.png,35.8722,0.3226,0.2936,1.3394 +Kodak,8x8,ldr-rgb-kodak18.png,31.6495,0.5213,0.4908,0.8012 +Kodak,8x8,ldr-rgb-kodak19.png,34.9142,0.3550,0.3261,1.2060 +Kodak,8x8,ldr-rgb-kodak20.png,36.1470,0.2724,0.2490,1.5792 +Kodak,8x8,ldr-rgb-kodak21.png,33.2221,0.3637,0.3384,1.1619 +Kodak,8x8,ldr-rgb-kodak22.png,34.2197,0.4615,0.4336,0.9068 +Kodak,8x8,ldr-rgb-kodak23.png,38.1768,0.2633,0.2377,1.6541 +Kodak,8x8,ldr-rgb-kodak24.png,31.2175,0.4210,0.3931,1.0004 +Kodak,12x12,ldr-rgb-kodak01.png,27.9058,0.5787,0.5435,0.7235 +Kodak,12x12,ldr-rgb-kodak02.png,32.9642,0.3910,0.3547,1.1085 +Kodak,12x12,ldr-rgb-kodak03.png,34.4219,0.2410,0.2068,1.9018 +Kodak,12x12,ldr-rgb-kodak04.png,32.9599,0.3496,0.3106,1.2660 +Kodak,12x12,ldr-rgb-kodak05.png,26.5927,0.6081,0.5713,0.6883 +Kodak,12x12,ldr-rgb-kodak06.png,29.5304,0.4335,0.3985,0.9868 +Kodak,12x12,ldr-rgb-kodak07.png,32.6109,0.2937,0.2558,1.5371 +Kodak,12x12,ldr-rgb-kodak08.png,26.2744,0.5969,0.5574,0.7055 +Kodak,12x12,ldr-rgb-kodak09.png,33.6251,0.2653,0.2278,1.7265 +Kodak,12x12,ldr-rgb-kodak10.png,32.9833,0.2631,0.2245,1.7519 +Kodak,12x12,ldr-rgb-kodak11.png,30.0468,0.4287,0.3930,1.0005 +Kodak,12x12,ldr-rgb-kodak12.png,34.4395,0.2355,0.2012,1.9540 +Kodak,12x12,ldr-rgb-kodak13.png,24.5820,0.6810,0.6443,0.6103 +Kodak,12x12,ldr-rgb-kodak14.png,28.6287,0.5464,0.5106,0.7701 +Kodak,12x12,ldr-rgb-kodak15.png,32.7197,0.3364,0.2995,1.3131 +Kodak,12x12,ldr-rgb-kodak16.png,33.3355,0.3194,0.2853,1.3784 +Kodak,12x12,ldr-rgb-kodak17.png,32.1409,0.2951,0.2561,1.5355 +Kodak,12x12,ldr-rgb-kodak18.png,27.9217,0.5240,0.4838,0.8127 +Kodak,12x12,ldr-rgb-kodak19.png,31.1006,0.4176,0.3786,1.0387 +Kodak,12x12,ldr-rgb-kodak20.png,32.1470,0.3093,0.2756,1.4266 +Kodak,12x12,ldr-rgb-kodak21.png,29.3170,0.3950,0.3604,1.0911 +Kodak,12x12,ldr-rgb-kodak22.png,30.7805,0.4519,0.4144,0.9490 +Kodak,12x12,ldr-rgb-kodak23.png,34.3635,0.2249,0.1894,2.0761 +Kodak,12x12,ldr-rgb-kodak24.png,27.2253,0.4728,0.4354,0.9032 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse2_fast_results.csv new file mode 100644 index 0000000..bc18ecd --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse2_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.8489,0.0410,0.0236,16.6722 +Kodak,4x4,ldr-rgb-kodak02.png,44.2380,0.0519,0.0328,11.9748 +Kodak,4x4,ldr-rgb-kodak03.png,46.6338,0.0357,0.0196,20.0458 +Kodak,4x4,ldr-rgb-kodak04.png,44.5665,0.0508,0.0296,13.2753 +Kodak,4x4,ldr-rgb-kodak05.png,41.5682,0.0622,0.0432,9.1079 +Kodak,4x4,ldr-rgb-kodak06.png,44.7452,0.0409,0.0233,16.8473 +Kodak,4x4,ldr-rgb-kodak07.png,45.0418,0.0467,0.0260,15.1260 +Kodak,4x4,ldr-rgb-kodak08.png,42.0821,0.0672,0.0451,8.7126 +Kodak,4x4,ldr-rgb-kodak09.png,46.2551,0.0381,0.0181,21.7235 +Kodak,4x4,ldr-rgb-kodak10.png,46.0288,0.0399,0.0192,20.5089 +Kodak,4x4,ldr-rgb-kodak11.png,44.2450,0.0453,0.0280,14.0269 +Kodak,4x4,ldr-rgb-kodak12.png,47.0135,0.0348,0.0179,21.9440 +Kodak,4x4,ldr-rgb-kodak13.png,41.4309,0.0577,0.0386,10.1864 +Kodak,4x4,ldr-rgb-kodak14.png,41.8065,0.0541,0.0356,11.0323 +Kodak,4x4,ldr-rgb-kodak15.png,44.5942,0.0511,0.0317,12.3859 +Kodak,4x4,ldr-rgb-kodak16.png,47.1801,0.0328,0.0161,24.4311 +Kodak,4x4,ldr-rgb-kodak17.png,45.7548,0.0383,0.0173,22.7147 +Kodak,4x4,ldr-rgb-kodak18.png,41.6128,0.0655,0.0429,9.1606 +Kodak,4x4,ldr-rgb-kodak19.png,44.8023,0.0444,0.0229,17.1845 +Kodak,4x4,ldr-rgb-kodak20.png,46.3894,0.0364,0.0202,19.4468 +Kodak,4x4,ldr-rgb-kodak21.png,44.5781,0.0419,0.0240,16.3909 +Kodak,4x4,ldr-rgb-kodak22.png,43.1599,0.0561,0.0360,10.9306 +Kodak,4x4,ldr-rgb-kodak23.png,45.5706,0.0411,0.0231,17.0275 +Kodak,4x4,ldr-rgb-kodak24.png,41.8541,0.0555,0.0356,11.0562 +Kodak,5x5,ldr-rgb-kodak01.png,39.6106,0.0423,0.0235,16.7398 +Kodak,5x5,ldr-rgb-kodak02.png,40.6312,0.0422,0.0221,17.7936 +Kodak,5x5,ldr-rgb-kodak03.png,43.0303,0.0327,0.0156,25.2209 +Kodak,5x5,ldr-rgb-kodak04.png,41.2378,0.0435,0.0209,18.7784 +Kodak,5x5,ldr-rgb-kodak05.png,37.4134,0.0601,0.0399,9.8531 +Kodak,5x5,ldr-rgb-kodak06.png,40.5758,0.0381,0.0194,20.2722 +Kodak,5x5,ldr-rgb-kodak07.png,41.4746,0.0411,0.0199,19.8082 +Kodak,5x5,ldr-rgb-kodak08.png,37.7544,0.0640,0.0410,9.5885 +Kodak,5x5,ldr-rgb-kodak09.png,42.9020,0.0350,0.0141,27.9651 +Kodak,5x5,ldr-rgb-kodak10.png,42.6178,0.0366,0.0149,26.4048 +Kodak,5x5,ldr-rgb-kodak11.png,40.2886,0.0405,0.0219,17.9953 +Kodak,5x5,ldr-rgb-kodak12.png,43.4048,0.0309,0.0133,29.5875 +Kodak,5x5,ldr-rgb-kodak13.png,36.8038,0.0567,0.0363,10.8178 +Kodak,5x5,ldr-rgb-kodak14.png,37.9374,0.0537,0.0343,11.4670 +Kodak,5x5,ldr-rgb-kodak15.png,41.1606,0.0420,0.0215,18.2475 +Kodak,5x5,ldr-rgb-kodak16.png,43.4729,0.0301,0.0121,32.5428 +Kodak,5x5,ldr-rgb-kodak17.png,42.0129,0.0357,0.0140,28.0626 +Kodak,5x5,ldr-rgb-kodak18.png,38.0842,0.0549,0.0313,12.5657 +Kodak,5x5,ldr-rgb-kodak19.png,41.1186,0.0394,0.0174,22.6626 +Kodak,5x5,ldr-rgb-kodak20.png,42.3441,0.0325,0.0158,24.8571 +Kodak,5x5,ldr-rgb-kodak21.png,40.4026,0.0395,0.0209,18.8404 +Kodak,5x5,ldr-rgb-kodak22.png,39.7574,0.0457,0.0243,16.1710 +Kodak,5x5,ldr-rgb-kodak23.png,42.4861,0.0351,0.0161,24.4568 +Kodak,5x5,ldr-rgb-kodak24.png,37.7908,0.0497,0.0293,13.4410 +Kodak,6x6,ldr-rgb-kodak01.png,35.7514,0.0540,0.0346,11.3692 +Kodak,6x6,ldr-rgb-kodak02.png,38.1633,0.0444,0.0236,16.6618 +Kodak,6x6,ldr-rgb-kodak03.png,40.5315,0.0333,0.0158,24.9424 +Kodak,6x6,ldr-rgb-kodak04.png,38.5310,0.0450,0.0222,17.7165 +Kodak,6x6,ldr-rgb-kodak05.png,34.3246,0.0706,0.0499,7.8749 +Kodak,6x6,ldr-rgb-kodak06.png,37.2781,0.0434,0.0240,16.3512 +Kodak,6x6,ldr-rgb-kodak07.png,38.8424,0.0437,0.0218,18.0252 +Kodak,6x6,ldr-rgb-kodak08.png,34.4294,0.0752,0.0517,7.6068 +Kodak,6x6,ldr-rgb-kodak09.png,39.9499,0.0378,0.0165,23.8069 +Kodak,6x6,ldr-rgb-kodak10.png,39.7100,0.0385,0.0162,24.2190 +Kodak,6x6,ldr-rgb-kodak11.png,37.1255,0.0456,0.0262,15.0271 +Kodak,6x6,ldr-rgb-kodak12.png,40.7229,0.0323,0.0139,28.2158 +Kodak,6x6,ldr-rgb-kodak13.png,32.7806,0.0766,0.0553,7.1073 +Kodak,6x6,ldr-rgb-kodak14.png,35.2350,0.0612,0.0412,9.5434 +Kodak,6x6,ldr-rgb-kodak15.png,38.5238,0.0438,0.0233,16.8415 +Kodak,6x6,ldr-rgb-kodak16.png,40.4988,0.0317,0.0139,28.3808 +Kodak,6x6,ldr-rgb-kodak17.png,38.9257,0.0393,0.0170,23.1645 +Kodak,6x6,ldr-rgb-kodak18.png,35.0961,0.0603,0.0367,10.7278 +Kodak,6x6,ldr-rgb-kodak19.png,37.9622,0.0453,0.0228,17.2409 +Kodak,6x6,ldr-rgb-kodak20.png,39.1651,0.0360,0.0187,21.0524 +Kodak,6x6,ldr-rgb-kodak21.png,36.8830,0.0469,0.0276,14.2227 +Kodak,6x6,ldr-rgb-kodak22.png,36.9688,0.0496,0.0277,14.1920 +Kodak,6x6,ldr-rgb-kodak23.png,40.0315,0.0356,0.0165,23.8371 +Kodak,6x6,ldr-rgb-kodak24.png,34.7652,0.0562,0.0347,11.3212 +Kodak,8x8,ldr-rgb-kodak01.png,31.3198,0.0725,0.0490,8.0183 +Kodak,8x8,ldr-rgb-kodak02.png,34.8859,0.0484,0.0242,16.2815 +Kodak,8x8,ldr-rgb-kodak03.png,36.5587,0.0401,0.0185,21.2916 +Kodak,8x8,ldr-rgb-kodak04.png,35.1631,0.0495,0.0228,17.2796 +Kodak,8x8,ldr-rgb-kodak05.png,30.2290,0.0919,0.0671,5.8628 +Kodak,8x8,ldr-rgb-kodak06.png,32.8875,0.0577,0.0343,11.4600 +Kodak,8x8,ldr-rgb-kodak07.png,34.9574,0.0517,0.0256,15.3792 +Kodak,8x8,ldr-rgb-kodak08.png,29.9727,0.1012,0.0735,5.3487 +Kodak,8x8,ldr-rgb-kodak09.png,36.0644,0.0452,0.0200,19.7003 +Kodak,8x8,ldr-rgb-kodak10.png,35.8574,0.0454,0.0192,20.5143 +Kodak,8x8,ldr-rgb-kodak11.png,32.9724,0.0568,0.0336,11.6955 +Kodak,8x8,ldr-rgb-kodak12.png,36.6491,0.0395,0.0174,22.5442 +Kodak,8x8,ldr-rgb-kodak13.png,28.2115,0.1062,0.0813,4.8349 +Kodak,8x8,ldr-rgb-kodak14.png,31.4868,0.0767,0.0527,7.4662 +Kodak,8x8,ldr-rgb-kodak15.png,34.9071,0.0497,0.0253,15.5643 +Kodak,8x8,ldr-rgb-kodak16.png,36.0183,0.0420,0.0199,19.7399 +Kodak,8x8,ldr-rgb-kodak17.png,34.8533,0.0475,0.0217,18.0789 +Kodak,8x8,ldr-rgb-kodak18.png,31.2426,0.0731,0.0451,8.7242 +Kodak,8x8,ldr-rgb-kodak19.png,34.0758,0.0550,0.0279,14.0807 +Kodak,8x8,ldr-rgb-kodak20.png,35.2054,0.0435,0.0221,17.8241 +Kodak,8x8,ldr-rgb-kodak21.png,32.7363,0.0588,0.0352,11.1747 +Kodak,8x8,ldr-rgb-kodak22.png,33.4351,0.0562,0.0303,12.9663 +Kodak,8x8,ldr-rgb-kodak23.png,36.4996,0.0395,0.0165,23.8471 +Kodak,8x8,ldr-rgb-kodak24.png,30.8082,0.0696,0.0441,8.9135 +Kodak,12x12,ldr-rgb-kodak01.png,27.1019,0.0660,0.0356,11.0408 +Kodak,12x12,ldr-rgb-kodak02.png,31.0998,0.0435,0.0128,30.6504 +Kodak,12x12,ldr-rgb-kodak03.png,32.6801,0.0397,0.0115,34.2584 +Kodak,12x12,ldr-rgb-kodak04.png,31.5605,0.0444,0.0111,35.3420 +Kodak,12x12,ldr-rgb-kodak05.png,25.8046,0.0746,0.0436,9.0214 +Kodak,12x12,ldr-rgb-kodak06.png,28.6329,0.0556,0.0261,15.0676 +Kodak,12x12,ldr-rgb-kodak07.png,30.8575,0.0469,0.0143,27.4878 +Kodak,12x12,ldr-rgb-kodak08.png,25.3858,0.0874,0.0531,7.3991 +Kodak,12x12,ldr-rgb-kodak09.png,31.8332,0.0441,0.0130,30.3403 +Kodak,12x12,ldr-rgb-kodak10.png,31.5261,0.0464,0.0137,28.7860 +Kodak,12x12,ldr-rgb-kodak11.png,28.9305,0.0501,0.0206,19.0475 +Kodak,12x12,ldr-rgb-kodak12.png,32.2648,0.0399,0.0113,34.8285 +Kodak,12x12,ldr-rgb-kodak13.png,24.3204,0.0915,0.0603,6.5249 +Kodak,12x12,ldr-rgb-kodak14.png,27.5269,0.0594,0.0287,13.7004 +Kodak,12x12,ldr-rgb-kodak15.png,31.2436,0.0472,0.0157,25.0409 +Kodak,12x12,ldr-rgb-kodak16.png,31.4839,0.0421,0.0133,29.6050 +Kodak,12x12,ldr-rgb-kodak17.png,30.8893,0.0473,0.0144,27.2197 +Kodak,12x12,ldr-rgb-kodak18.png,27.4177,0.0622,0.0283,13.9029 +Kodak,12x12,ldr-rgb-kodak19.png,30.1727,0.0523,0.0195,20.1280 +Kodak,12x12,ldr-rgb-kodak20.png,31.0405,0.0435,0.0154,25.4938 +Kodak,12x12,ldr-rgb-kodak21.png,28.7196,0.0546,0.0253,15.5625 +Kodak,12x12,ldr-rgb-kodak22.png,29.8238,0.0475,0.0158,24.8384 +Kodak,12x12,ldr-rgb-kodak23.png,32.5185,0.0415,0.0116,33.9593 +Kodak,12x12,ldr-rgb-kodak24.png,26.7652,0.0653,0.0335,11.7273 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse2_fastest_results.csv new file mode 100644 index 0000000..3a73149 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse2_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.5072,0.0352,0.0182,21.5661 +Kodak,4x4,ldr-rgb-kodak02.png,43.8025,0.0406,0.0226,17.3797 +Kodak,4x4,ldr-rgb-kodak03.png,46.0406,0.0303,0.0147,26.6695 +Kodak,4x4,ldr-rgb-kodak04.png,44.1429,0.0416,0.0210,18.7138 +Kodak,4x4,ldr-rgb-kodak05.png,40.9879,0.0464,0.0279,14.0892 +Kodak,4x4,ldr-rgb-kodak06.png,44.4296,0.0352,0.0182,21.6266 +Kodak,4x4,ldr-rgb-kodak07.png,44.6051,0.0383,0.0187,21.0624 +Kodak,4x4,ldr-rgb-kodak08.png,41.5000,0.0504,0.0287,13.6976 +Kodak,4x4,ldr-rgb-kodak09.png,45.9005,0.0333,0.0145,27.1542 +Kodak,4x4,ldr-rgb-kodak10.png,45.6663,0.0354,0.0152,25.9327 +Kodak,4x4,ldr-rgb-kodak11.png,43.8292,0.0370,0.0201,19.5980 +Kodak,4x4,ldr-rgb-kodak12.png,46.4729,0.0303,0.0142,27.6992 +Kodak,4x4,ldr-rgb-kodak13.png,41.1509,0.0467,0.0285,13.7937 +Kodak,4x4,ldr-rgb-kodak14.png,41.0931,0.0404,0.0224,17.5230 +Kodak,4x4,ldr-rgb-kodak15.png,44.1027,0.0400,0.0212,18.5515 +Kodak,4x4,ldr-rgb-kodak16.png,47.0422,0.0296,0.0136,28.8747 +Kodak,4x4,ldr-rgb-kodak17.png,45.4973,0.0344,0.0143,27.5263 +Kodak,4x4,ldr-rgb-kodak18.png,41.2449,0.0506,0.0286,13.7725 +Kodak,4x4,ldr-rgb-kodak19.png,44.5301,0.0383,0.0177,22.2723 +Kodak,4x4,ldr-rgb-kodak20.png,45.8602,0.0309,0.0154,25.5649 +Kodak,4x4,ldr-rgb-kodak21.png,44.2614,0.0353,0.0183,21.4639 +Kodak,4x4,ldr-rgb-kodak22.png,42.7742,0.0435,0.0244,16.0976 +Kodak,4x4,ldr-rgb-kodak23.png,45.2565,0.0341,0.0170,23.0641 +Kodak,4x4,ldr-rgb-kodak24.png,41.2205,0.0430,0.0239,16.4767 +Kodak,5x5,ldr-rgb-kodak01.png,39.3652,0.0377,0.0198,19.8695 +Kodak,5x5,ldr-rgb-kodak02.png,40.3762,0.0361,0.0178,22.1417 +Kodak,5x5,ldr-rgb-kodak03.png,42.6004,0.0286,0.0124,31.6394 +Kodak,5x5,ldr-rgb-kodak04.png,40.7711,0.0383,0.0171,22.9709 +Kodak,5x5,ldr-rgb-kodak05.png,36.9823,0.0480,0.0291,13.4959 +Kodak,5x5,ldr-rgb-kodak06.png,40.4008,0.0342,0.0168,23.3670 +Kodak,5x5,ldr-rgb-kodak07.png,41.1154,0.0367,0.0163,24.0692 +Kodak,5x5,ldr-rgb-kodak08.png,37.3666,0.0518,0.0296,13.2681 +Kodak,5x5,ldr-rgb-kodak09.png,42.5422,0.0317,0.0120,32.6808 +Kodak,5x5,ldr-rgb-kodak10.png,42.3455,0.0337,0.0127,31.0398 +Kodak,5x5,ldr-rgb-kodak11.png,40.0401,0.0349,0.0175,22.4555 +Kodak,5x5,ldr-rgb-kodak12.png,43.1448,0.0280,0.0113,34.6660 +Kodak,5x5,ldr-rgb-kodak13.png,36.6876,0.0485,0.0296,13.2709 +Kodak,5x5,ldr-rgb-kodak14.png,37.3962,0.0413,0.0227,17.2995 +Kodak,5x5,ldr-rgb-kodak15.png,40.8535,0.0360,0.0167,23.5233 +Kodak,5x5,ldr-rgb-kodak16.png,43.3795,0.0279,0.0111,35.4346 +Kodak,5x5,ldr-rgb-kodak17.png,41.8560,0.0328,0.0122,32.2469 +Kodak,5x5,ldr-rgb-kodak18.png,37.9129,0.0464,0.0242,16.2728 +Kodak,5x5,ldr-rgb-kodak19.png,40.8503,0.0367,0.0155,25.3636 +Kodak,5x5,ldr-rgb-kodak20.png,42.0160,0.0291,0.0129,30.3760 +Kodak,5x5,ldr-rgb-kodak21.png,40.1806,0.0350,0.0174,22.5779 +Kodak,5x5,ldr-rgb-kodak22.png,39.4506,0.0391,0.0192,20.4993 +Kodak,5x5,ldr-rgb-kodak23.png,42.1119,0.0314,0.0137,28.6640 +Kodak,5x5,ldr-rgb-kodak24.png,37.5517,0.0414,0.0217,18.0912 +Kodak,6x6,ldr-rgb-kodak01.png,35.6562,0.0435,0.0250,15.7073 +Kodak,6x6,ldr-rgb-kodak02.png,38.0339,0.0361,0.0171,23.0409 +Kodak,6x6,ldr-rgb-kodak03.png,40.3032,0.0283,0.0118,33.2500 +Kodak,6x6,ldr-rgb-kodak04.png,38.2918,0.0381,0.0161,24.4144 +Kodak,6x6,ldr-rgb-kodak05.png,34.0896,0.0508,0.0312,12.5906 +Kodak,6x6,ldr-rgb-kodak06.png,37.2222,0.0360,0.0181,21.6755 +Kodak,6x6,ldr-rgb-kodak07.png,38.6336,0.0367,0.0159,24.8055 +Kodak,6x6,ldr-rgb-kodak08.png,34.2253,0.0550,0.0324,12.1367 +Kodak,6x6,ldr-rgb-kodak09.png,39.7573,0.0326,0.0126,31.2592 +Kodak,6x6,ldr-rgb-kodak10.png,39.5669,0.0338,0.0123,31.9663 +Kodak,6x6,ldr-rgb-kodak11.png,36.9968,0.0363,0.0186,21.0896 +Kodak,6x6,ldr-rgb-kodak12.png,40.5658,0.0284,0.0110,35.7860 +Kodak,6x6,ldr-rgb-kodak13.png,32.7154,0.0566,0.0369,10.6490 +Kodak,6x6,ldr-rgb-kodak14.png,34.8624,0.0433,0.0244,16.1047 +Kodak,6x6,ldr-rgb-kodak15.png,38.3699,0.0362,0.0168,23.4028 +Kodak,6x6,ldr-rgb-kodak16.png,40.4581,0.0286,0.0116,34.0216 +Kodak,6x6,ldr-rgb-kodak17.png,38.8420,0.0344,0.0131,29.9643 +Kodak,6x6,ldr-rgb-kodak18.png,35.0034,0.0482,0.0251,15.6572 +Kodak,6x6,ldr-rgb-kodak19.png,37.8298,0.0393,0.0176,22.3493 +Kodak,6x6,ldr-rgb-kodak20.png,39.0123,0.0304,0.0139,28.3725 +Kodak,6x6,ldr-rgb-kodak21.png,36.8075,0.0374,0.0196,20.0446 +Kodak,6x6,ldr-rgb-kodak22.png,36.8498,0.0394,0.0194,20.2396 +Kodak,6x6,ldr-rgb-kodak23.png,39.8307,0.0305,0.0127,30.8719 +Kodak,6x6,ldr-rgb-kodak24.png,34.6916,0.0435,0.0237,16.6068 +Kodak,8x8,ldr-rgb-kodak01.png,31.1792,0.0569,0.0349,11.2524 +Kodak,8x8,ldr-rgb-kodak02.png,34.7811,0.0409,0.0183,21.4695 +Kodak,8x8,ldr-rgb-kodak03.png,36.4262,0.0343,0.0142,27.6116 +Kodak,8x8,ldr-rgb-kodak04.png,35.0547,0.0425,0.0173,22.7175 +Kodak,8x8,ldr-rgb-kodak05.png,30.0205,0.0666,0.0438,8.9853 +Kodak,8x8,ldr-rgb-kodak06.png,32.7989,0.0469,0.0252,15.5766 +Kodak,8x8,ldr-rgb-kodak07.png,34.8360,0.0435,0.0194,20.2929 +Kodak,8x8,ldr-rgb-kodak08.png,29.7069,0.0721,0.0466,8.4347 +Kodak,8x8,ldr-rgb-kodak09.png,35.8914,0.0388,0.0154,25.5803 +Kodak,8x8,ldr-rgb-kodak10.png,35.7051,0.0393,0.0147,26.6932 +Kodak,8x8,ldr-rgb-kodak11.png,32.8451,0.0454,0.0239,16.4622 +Kodak,8x8,ldr-rgb-kodak12.png,36.5111,0.0347,0.0139,28.2704 +Kodak,8x8,ldr-rgb-kodak13.png,28.1364,0.0783,0.0551,7.1301 +Kodak,8x8,ldr-rgb-kodak14.png,31.2591,0.0560,0.0336,11.7123 +Kodak,8x8,ldr-rgb-kodak15.png,34.7599,0.0414,0.0186,21.1407 +Kodak,8x8,ldr-rgb-kodak16.png,35.9616,0.0363,0.0158,24.9172 +Kodak,8x8,ldr-rgb-kodak17.png,34.7164,0.0412,0.0165,23.7595 +Kodak,8x8,ldr-rgb-kodak18.png,31.1666,0.0579,0.0318,12.3843 +Kodak,8x8,ldr-rgb-kodak19.png,33.8904,0.0462,0.0211,18.6527 +Kodak,8x8,ldr-rgb-kodak20.png,35.0191,0.0363,0.0165,23.7907 +Kodak,8x8,ldr-rgb-kodak21.png,32.6198,0.0468,0.0253,15.5146 +Kodak,8x8,ldr-rgb-kodak22.png,33.3242,0.0460,0.0222,17.6822 +Kodak,8x8,ldr-rgb-kodak23.png,36.3894,0.0348,0.0133,29.4786 +Kodak,8x8,ldr-rgb-kodak24.png,30.7268,0.0546,0.0307,12.8059 +Kodak,12x12,ldr-rgb-kodak01.png,26.9930,0.0531,0.0267,14.7211 +Kodak,12x12,ldr-rgb-kodak02.png,31.0354,0.0375,0.0109,36.1713 +Kodak,12x12,ldr-rgb-kodak03.png,32.6215,0.0340,0.0097,40.4718 +Kodak,12x12,ldr-rgb-kodak04.png,31.4774,0.0389,0.0096,41.0756 +Kodak,12x12,ldr-rgb-kodak05.png,25.6941,0.0588,0.0320,12.2839 +Kodak,12x12,ldr-rgb-kodak06.png,28.4895,0.0459,0.0204,19.2433 +Kodak,12x12,ldr-rgb-kodak07.png,30.8016,0.0402,0.0119,32.9570 +Kodak,12x12,ldr-rgb-kodak08.png,25.2157,0.0678,0.0373,10.5417 +Kodak,12x12,ldr-rgb-kodak09.png,31.6339,0.0383,0.0108,36.5513 +Kodak,12x12,ldr-rgb-kodak10.png,31.4567,0.0398,0.0112,35.2031 +Kodak,12x12,ldr-rgb-kodak11.png,28.8572,0.0413,0.0160,24.5928 +Kodak,12x12,ldr-rgb-kodak12.png,32.1857,0.0345,0.0098,40.0755 +Kodak,12x12,ldr-rgb-kodak13.png,24.2396,0.0700,0.0424,9.2693 +Kodak,12x12,ldr-rgb-kodak14.png,27.4380,0.0477,0.0213,18.4445 +Kodak,12x12,ldr-rgb-kodak15.png,31.1533,0.0397,0.0128,30.8044 +Kodak,12x12,ldr-rgb-kodak16.png,31.3620,0.0358,0.0112,34.9680 +Kodak,12x12,ldr-rgb-kodak17.png,30.8364,0.0406,0.0117,33.6998 +Kodak,12x12,ldr-rgb-kodak18.png,27.3672,0.0513,0.0211,18.6032 +Kodak,12x12,ldr-rgb-kodak19.png,29.8648,0.0444,0.0156,25.2645 +Kodak,12x12,ldr-rgb-kodak20.png,30.9381,0.0364,0.0126,31.0866 +Kodak,12x12,ldr-rgb-kodak21.png,28.6166,0.0447,0.0194,20.2857 +Kodak,12x12,ldr-rgb-kodak22.png,29.7245,0.0409,0.0130,30.3102 +Kodak,12x12,ldr-rgb-kodak23.png,32.4842,0.0358,0.0101,38.9511 +Kodak,12x12,ldr-rgb-kodak24.png,26.6937,0.0522,0.0242,16.2218 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse2_medium_results.csv new file mode 100644 index 0000000..ba5ad40 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse2_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.2910,0.1572,0.1386,2.8364 +Kodak,4x4,ldr-rgb-kodak02.png,45.3499,0.2118,0.1921,2.0474 +Kodak,4x4,ldr-rgb-kodak03.png,47.6132,0.1130,0.0958,4.1040 +Kodak,4x4,ldr-rgb-kodak04.png,45.4289,0.1709,0.1482,2.6526 +Kodak,4x4,ldr-rgb-kodak05.png,42.1296,0.1972,0.1769,2.2226 +Kodak,4x4,ldr-rgb-kodak06.png,45.1555,0.1498,0.1310,3.0019 +Kodak,4x4,ldr-rgb-kodak07.png,45.9745,0.1440,0.1223,3.2163 +Kodak,4x4,ldr-rgb-kodak08.png,42.5130,0.2190,0.1958,2.0082 +Kodak,4x4,ldr-rgb-kodak09.png,47.1616,0.1704,0.1497,2.6273 +Kodak,4x4,ldr-rgb-kodak10.png,46.8287,0.1749,0.1530,2.5696 +Kodak,4x4,ldr-rgb-kodak11.png,44.8668,0.1700,0.1511,2.6017 +Kodak,4x4,ldr-rgb-kodak12.png,47.9301,0.1286,0.1106,3.5552 +Kodak,4x4,ldr-rgb-kodak13.png,41.6152,0.1694,0.1494,2.6328 +Kodak,4x4,ldr-rgb-kodak14.png,42.6269,0.1819,0.1628,2.4147 +Kodak,4x4,ldr-rgb-kodak15.png,45.4386,0.1510,0.1305,3.0123 +Kodak,4x4,ldr-rgb-kodak16.png,47.8565,0.1319,0.1142,3.4445 +Kodak,4x4,ldr-rgb-kodak17.png,46.2901,0.1502,0.1280,3.0721 +Kodak,4x4,ldr-rgb-kodak18.png,41.9927,0.2219,0.1987,1.9790 +Kodak,4x4,ldr-rgb-kodak19.png,45.3392,0.1803,0.1575,2.4967 +Kodak,4x4,ldr-rgb-kodak20.png,46.8869,0.1105,0.0936,4.2021 +Kodak,4x4,ldr-rgb-kodak21.png,45.1510,0.1803,0.1614,2.4358 +Kodak,4x4,ldr-rgb-kodak22.png,43.7746,0.2231,0.2022,1.9450 +Kodak,4x4,ldr-rgb-kodak23.png,46.8184,0.1720,0.1534,2.5637 +Kodak,4x4,ldr-rgb-kodak24.png,42.2960,0.1761,0.1554,2.5299 +Kodak,5x5,ldr-rgb-kodak01.png,40.1121,0.1895,0.1693,2.3222 +Kodak,5x5,ldr-rgb-kodak02.png,41.6953,0.2006,0.1792,2.1947 +Kodak,5x5,ldr-rgb-kodak03.png,44.0360,0.0941,0.0750,5.2427 +Kodak,5x5,ldr-rgb-kodak04.png,42.0560,0.1571,0.1330,2.9575 +Kodak,5x5,ldr-rgb-kodak05.png,37.9816,0.2195,0.1977,1.9894 +Kodak,5x5,ldr-rgb-kodak06.png,40.9586,0.1509,0.1309,3.0034 +Kodak,5x5,ldr-rgb-kodak07.png,42.4607,0.1278,0.1046,3.7591 +Kodak,5x5,ldr-rgb-kodak08.png,38.3486,0.2388,0.2144,1.8339 +Kodak,5x5,ldr-rgb-kodak09.png,43.8038,0.1103,0.0879,4.4712 +Kodak,5x5,ldr-rgb-kodak10.png,43.4092,0.1244,0.1010,3.8916 +Kodak,5x5,ldr-rgb-kodak11.png,40.8377,0.1723,0.1521,2.5851 +Kodak,5x5,ldr-rgb-kodak12.png,44.3921,0.0952,0.0760,5.1748 +Kodak,5x5,ldr-rgb-kodak13.png,36.9078,0.2029,0.1813,2.1694 +Kodak,5x5,ldr-rgb-kodak14.png,38.6484,0.1957,0.1748,2.2491 +Kodak,5x5,ldr-rgb-kodak15.png,41.8912,0.1458,0.1241,3.1676 +Kodak,5x5,ldr-rgb-kodak16.png,44.1367,0.1065,0.0871,4.5140 +Kodak,5x5,ldr-rgb-kodak17.png,42.5213,0.1117,0.0880,4.4683 +Kodak,5x5,ldr-rgb-kodak18.png,38.3607,0.2141,0.1889,2.0813 +Kodak,5x5,ldr-rgb-kodak19.png,41.6469,0.1469,0.1229,3.1997 +Kodak,5x5,ldr-rgb-kodak20.png,42.9685,0.1045,0.0858,4.5855 +Kodak,5x5,ldr-rgb-kodak21.png,40.7620,0.1484,0.1281,3.0702 +Kodak,5x5,ldr-rgb-kodak22.png,40.2773,0.2028,0.1803,2.1811 +Kodak,5x5,ldr-rgb-kodak23.png,43.5488,0.1273,0.1071,3.6710 +Kodak,5x5,ldr-rgb-kodak24.png,38.1152,0.1738,0.1515,2.5950 +Kodak,6x6,ldr-rgb-kodak01.png,36.1951,0.1957,0.1748,2.2496 +Kodak,6x6,ldr-rgb-kodak02.png,39.0094,0.1554,0.1331,2.9533 +Kodak,6x6,ldr-rgb-kodak03.png,41.3262,0.0790,0.0597,6.5812 +Kodak,6x6,ldr-rgb-kodak04.png,39.3983,0.1336,0.1090,3.6074 +Kodak,6x6,ldr-rgb-kodak05.png,34.7867,0.2140,0.1919,2.0492 +Kodak,6x6,ldr-rgb-kodak06.png,37.6289,0.1337,0.1130,3.4785 +Kodak,6x6,ldr-rgb-kodak07.png,39.7726,0.1100,0.0864,4.5534 +Kodak,6x6,ldr-rgb-kodak08.png,34.9978,0.2367,0.2114,1.8598 +Kodak,6x6,ldr-rgb-kodak09.png,40.8821,0.0849,0.0623,6.3129 +Kodak,6x6,ldr-rgb-kodak10.png,40.5030,0.0911,0.0670,5.8729 +Kodak,6x6,ldr-rgb-kodak11.png,37.5798,0.1433,0.1227,3.2060 +Kodak,6x6,ldr-rgb-kodak12.png,41.4837,0.0744,0.0545,7.2129 +Kodak,6x6,ldr-rgb-kodak13.png,32.8829,0.2215,0.1996,1.9696 +Kodak,6x6,ldr-rgb-kodak14.png,35.8236,0.1789,0.1576,2.4943 +Kodak,6x6,ldr-rgb-kodak15.png,39.1953,0.1344,0.1122,3.5038 +Kodak,6x6,ldr-rgb-kodak16.png,41.0408,0.0870,0.0673,5.8468 +Kodak,6x6,ldr-rgb-kodak17.png,39.4928,0.0926,0.0684,5.7515 +Kodak,6x6,ldr-rgb-kodak18.png,35.3481,0.1891,0.1636,2.4037 +Kodak,6x6,ldr-rgb-kodak19.png,38.5316,0.1332,0.1084,3.6276 +Kodak,6x6,ldr-rgb-kodak20.png,39.7651,0.0956,0.0764,5.1471 +Kodak,6x6,ldr-rgb-kodak21.png,37.1926,0.1315,0.1106,3.5543 +Kodak,6x6,ldr-rgb-kodak22.png,37.4532,0.1686,0.1457,2.6988 +Kodak,6x6,ldr-rgb-kodak23.png,40.9705,0.0903,0.0694,5.6681 +Kodak,6x6,ldr-rgb-kodak24.png,35.0426,0.1559,0.1330,2.9559 +Kodak,8x8,ldr-rgb-kodak01.png,31.8012,0.2638,0.2393,1.6434 +Kodak,8x8,ldr-rgb-kodak02.png,35.7606,0.1516,0.1257,3.1280 +Kodak,8x8,ldr-rgb-kodak03.png,37.7459,0.0960,0.0729,5.3971 +Kodak,8x8,ldr-rgb-kodak04.png,36.0605,0.1462,0.1182,3.3278 +Kodak,8x8,ldr-rgb-kodak05.png,30.7416,0.2737,0.2478,1.5866 +Kodak,8x8,ldr-rgb-kodak06.png,33.4352,0.1694,0.1453,2.7065 +Kodak,8x8,ldr-rgb-kodak07.png,36.1304,0.1293,0.1017,3.8653 +Kodak,8x8,ldr-rgb-kodak08.png,30.5708,0.2757,0.2470,1.5918 +Kodak,8x8,ldr-rgb-kodak09.png,37.2646,0.0983,0.0716,5.4919 +Kodak,8x8,ldr-rgb-kodak10.png,36.9159,0.1019,0.0739,5.3214 +Kodak,8x8,ldr-rgb-kodak11.png,33.6569,0.1670,0.1426,2.7580 +Kodak,8x8,ldr-rgb-kodak12.png,37.8259,0.0918,0.0684,5.7511 +Kodak,8x8,ldr-rgb-kodak13.png,28.3927,0.3063,0.2805,1.4020 +Kodak,8x8,ldr-rgb-kodak14.png,32.1340,0.2180,0.1930,2.0369 +Kodak,8x8,ldr-rgb-kodak15.png,35.8359,0.1355,0.1096,3.5878 +Kodak,8x8,ldr-rgb-kodak16.png,37.0213,0.1075,0.0841,4.6754 +Kodak,8x8,ldr-rgb-kodak17.png,35.6807,0.1127,0.0850,4.6255 +Kodak,8x8,ldr-rgb-kodak18.png,31.5529,0.2194,0.1900,2.0694 +Kodak,8x8,ldr-rgb-kodak19.png,34.7649,0.1566,0.1279,3.0738 +Kodak,8x8,ldr-rgb-kodak20.png,35.8945,0.1173,0.0944,4.1675 +Kodak,8x8,ldr-rgb-kodak21.png,33.1150,0.1665,0.1422,2.7659 +Kodak,8x8,ldr-rgb-kodak22.png,34.0244,0.1827,0.1560,2.5211 +Kodak,8x8,ldr-rgb-kodak23.png,37.6470,0.0922,0.0675,5.8229 +Kodak,8x8,ldr-rgb-kodak24.png,31.1140,0.1886,0.1615,2.4343 +Kodak,12x12,ldr-rgb-kodak01.png,27.7578,0.2813,0.2480,1.5856 +Kodak,12x12,ldr-rgb-kodak02.png,32.4621,0.1102,0.0762,5.1581 +Kodak,12x12,ldr-rgb-kodak03.png,33.7766,0.0890,0.0576,6.8214 +Kodak,12x12,ldr-rgb-kodak04.png,32.4443,0.1043,0.0676,5.8164 +Kodak,12x12,ldr-rgb-kodak05.png,26.3986,0.2996,0.2656,1.4804 +Kodak,12x12,ldr-rgb-kodak06.png,29.3737,0.1796,0.1469,2.6762 +Kodak,12x12,ldr-rgb-kodak07.png,32.0414,0.1261,0.0902,4.3610 +Kodak,12x12,ldr-rgb-kodak08.png,26.0600,0.3002,0.2635,1.4925 +Kodak,12x12,ldr-rgb-kodak09.png,33.0989,0.0939,0.0590,6.6622 +Kodak,12x12,ldr-rgb-kodak10.png,32.4884,0.0965,0.0606,6.4909 +Kodak,12x12,ldr-rgb-kodak11.png,29.7433,0.1592,0.1266,3.1053 +Kodak,12x12,ldr-rgb-kodak12.png,33.8819,0.0847,0.0527,7.4588 +Kodak,12x12,ldr-rgb-kodak13.png,24.5282,0.3432,0.3092,1.2718 +Kodak,12x12,ldr-rgb-kodak14.png,28.4176,0.2150,0.1818,2.1625 +Kodak,12x12,ldr-rgb-kodak15.png,32.2342,0.1199,0.0857,4.5858 +Kodak,12x12,ldr-rgb-kodak16.png,32.9807,0.0944,0.0626,6.2826 +Kodak,12x12,ldr-rgb-kodak17.png,31.7805,0.1050,0.0690,5.6984 +Kodak,12x12,ldr-rgb-kodak18.png,27.7783,0.2126,0.1750,2.2466 +Kodak,12x12,ldr-rgb-kodak19.png,30.8882,0.1364,0.0998,3.9415 +Kodak,12x12,ldr-rgb-kodak20.png,31.8562,0.1047,0.0732,5.3682 +Kodak,12x12,ldr-rgb-kodak21.png,29.1771,0.1910,0.1584,2.4823 +Kodak,12x12,ldr-rgb-kodak22.png,30.4983,0.1482,0.1131,3.4758 +Kodak,12x12,ldr-rgb-kodak23.png,33.5464,0.0802,0.0475,8.2701 +Kodak,12x12,ldr-rgb-kodak24.png,27.0976,0.1918,0.1567,2.5086 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse2_thorough_results.csv new file mode 100644 index 0000000..1ae4037 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse2_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.4944,0.4098,0.3911,1.0055 +Kodak,4x4,ldr-rgb-kodak02.png,45.6493,0.4895,0.4697,0.8372 +Kodak,4x4,ldr-rgb-kodak03.png,47.9884,0.4219,0.4046,0.9719 +Kodak,4x4,ldr-rgb-kodak04.png,45.6562,0.4617,0.4391,0.8956 +Kodak,4x4,ldr-rgb-kodak05.png,42.4063,0.4574,0.4372,0.8993 +Kodak,4x4,ldr-rgb-kodak06.png,45.3572,0.4090,0.3905,1.0071 +Kodak,4x4,ldr-rgb-kodak07.png,46.3419,0.4590,0.4371,0.8995 +Kodak,4x4,ldr-rgb-kodak08.png,42.8054,0.4859,0.4626,0.8500 +Kodak,4x4,ldr-rgb-kodak09.png,47.4208,0.4680,0.4469,0.8799 +Kodak,4x4,ldr-rgb-kodak10.png,47.0603,0.4647,0.4428,0.8881 +Kodak,4x4,ldr-rgb-kodak11.png,45.1121,0.4325,0.4136,0.9507 +Kodak,4x4,ldr-rgb-kodak12.png,48.2457,0.4337,0.4159,0.9454 +Kodak,4x4,ldr-rgb-kodak13.png,41.7174,0.4160,0.3959,0.9933 +Kodak,4x4,ldr-rgb-kodak14.png,42.9405,0.4440,0.4248,0.9256 +Kodak,4x4,ldr-rgb-kodak15.png,45.7858,0.4420,0.4215,0.9330 +Kodak,4x4,ldr-rgb-kodak16.png,48.0652,0.4279,0.4096,0.9600 +Kodak,4x4,ldr-rgb-kodak17.png,46.4610,0.4467,0.4245,0.9263 +Kodak,4x4,ldr-rgb-kodak18.png,42.1541,0.4868,0.4631,0.8491 +Kodak,4x4,ldr-rgb-kodak19.png,45.5439,0.4639,0.4411,0.8914 +Kodak,4x4,ldr-rgb-kodak20.png,47.1284,0.2937,0.2766,1.4214 +Kodak,4x4,ldr-rgb-kodak21.png,45.3018,0.4541,0.4351,0.9038 +Kodak,4x4,ldr-rgb-kodak22.png,43.9797,0.4945,0.4733,0.8308 +Kodak,4x4,ldr-rgb-kodak23.png,47.1533,0.4800,0.4612,0.8527 +Kodak,4x4,ldr-rgb-kodak24.png,42.5030,0.4462,0.4254,0.9244 +Kodak,5x5,ldr-rgb-kodak01.png,40.2326,0.5264,0.5062,0.7769 +Kodak,5x5,ldr-rgb-kodak02.png,41.9976,0.6133,0.5915,0.6647 +Kodak,5x5,ldr-rgb-kodak03.png,44.3239,0.5081,0.4892,0.8039 +Kodak,5x5,ldr-rgb-kodak04.png,42.2394,0.5551,0.5313,0.7401 +Kodak,5x5,ldr-rgb-kodak05.png,38.1756,0.5761,0.5548,0.7088 +Kodak,5x5,ldr-rgb-kodak06.png,41.0844,0.5040,0.4835,0.8133 +Kodak,5x5,ldr-rgb-kodak07.png,42.7249,0.5528,0.5296,0.7424 +Kodak,5x5,ldr-rgb-kodak08.png,38.5334,0.5896,0.5649,0.6961 +Kodak,5x5,ldr-rgb-kodak09.png,44.0288,0.5546,0.5318,0.7394 +Kodak,5x5,ldr-rgb-kodak10.png,43.5935,0.5625,0.5385,0.7302 +Kodak,5x5,ldr-rgb-kodak11.png,40.9987,0.5261,0.5052,0.7783 +Kodak,5x5,ldr-rgb-kodak12.png,44.5960,0.5166,0.4972,0.7908 +Kodak,5x5,ldr-rgb-kodak13.png,36.9510,0.5165,0.4949,0.7945 +Kodak,5x5,ldr-rgb-kodak14.png,38.8797,0.5528,0.5313,0.7401 +Kodak,5x5,ldr-rgb-kodak15.png,42.1246,0.5281,0.5063,0.7767 +Kodak,5x5,ldr-rgb-kodak16.png,44.2686,0.5183,0.4991,0.7878 +Kodak,5x5,ldr-rgb-kodak17.png,42.6009,0.5407,0.5170,0.7606 +Kodak,5x5,ldr-rgb-kodak18.png,38.4550,0.5980,0.5726,0.6867 +Kodak,5x5,ldr-rgb-kodak19.png,41.7719,0.5753,0.5515,0.7130 +Kodak,5x5,ldr-rgb-kodak20.png,43.2708,0.3636,0.3448,1.1405 +Kodak,5x5,ldr-rgb-kodak21.png,40.8630,0.5701,0.5497,0.7154 +Kodak,5x5,ldr-rgb-kodak22.png,40.4255,0.6132,0.5907,0.6657 +Kodak,5x5,ldr-rgb-kodak23.png,43.8841,0.5957,0.5751,0.6837 +Kodak,5x5,ldr-rgb-kodak24.png,38.2272,0.5480,0.5257,0.7480 +Kodak,6x6,ldr-rgb-kodak01.png,36.3116,0.6281,0.6072,0.6476 +Kodak,6x6,ldr-rgb-kodak02.png,39.3780,0.7153,0.6933,0.5672 +Kodak,6x6,ldr-rgb-kodak03.png,41.7331,0.4458,0.4262,0.9227 +Kodak,6x6,ldr-rgb-kodak04.png,39.6521,0.6231,0.5987,0.6568 +Kodak,6x6,ldr-rgb-kodak05.png,34.9741,0.6786,0.6563,0.5991 +Kodak,6x6,ldr-rgb-kodak06.png,37.7401,0.5643,0.5433,0.7238 +Kodak,6x6,ldr-rgb-kodak07.png,40.1032,0.5147,0.4905,0.8016 +Kodak,6x6,ldr-rgb-kodak08.png,35.1660,0.6866,0.6611,0.5948 +Kodak,6x6,ldr-rgb-kodak09.png,41.2613,0.6273,0.6041,0.6509 +Kodak,6x6,ldr-rgb-kodak10.png,40.8141,0.6426,0.6185,0.6358 +Kodak,6x6,ldr-rgb-kodak11.png,37.7541,0.5795,0.5588,0.7037 +Kodak,6x6,ldr-rgb-kodak12.png,41.8249,0.5422,0.5220,0.7533 +Kodak,6x6,ldr-rgb-kodak13.png,32.9256,0.6354,0.6125,0.6420 +Kodak,6x6,ldr-rgb-kodak14.png,36.0210,0.6551,0.6335,0.6207 +Kodak,6x6,ldr-rgb-kodak15.png,39.4514,0.5306,0.5080,0.7741 +Kodak,6x6,ldr-rgb-kodak16.png,41.2290,0.5256,0.5056,0.7777 +Kodak,6x6,ldr-rgb-kodak17.png,39.6521,0.6038,0.5797,0.6783 +Kodak,6x6,ldr-rgb-kodak18.png,35.4328,0.7180,0.6923,0.5680 +Kodak,6x6,ldr-rgb-kodak19.png,38.6954,0.6789,0.6536,0.6016 +Kodak,6x6,ldr-rgb-kodak20.png,40.0953,0.4182,0.3985,0.9869 +Kodak,6x6,ldr-rgb-kodak21.png,37.3344,0.6675,0.6462,0.6085 +Kodak,6x6,ldr-rgb-kodak22.png,37.6231,0.7261,0.7028,0.5595 +Kodak,6x6,ldr-rgb-kodak23.png,41.4033,0.6239,0.6027,0.6525 +Kodak,6x6,ldr-rgb-kodak24.png,35.1417,0.5973,0.5740,0.6850 +Kodak,8x8,ldr-rgb-kodak01.png,31.9071,0.7634,0.7373,0.5333 +Kodak,8x8,ldr-rgb-kodak02.png,36.1354,0.6667,0.6392,0.6152 +Kodak,8x8,ldr-rgb-kodak03.png,38.1744,0.3553,0.3302,1.1909 +Kodak,8x8,ldr-rgb-kodak04.png,36.3637,0.5707,0.5407,0.7273 +Kodak,8x8,ldr-rgb-kodak05.png,30.9009,0.7740,0.7468,0.5265 +Kodak,8x8,ldr-rgb-kodak06.png,33.5749,0.6285,0.6025,0.6527 +Kodak,8x8,ldr-rgb-kodak07.png,36.4888,0.4268,0.3974,0.9894 +Kodak,8x8,ldr-rgb-kodak08.png,30.7484,0.8272,0.7968,0.4935 +Kodak,8x8,ldr-rgb-kodak09.png,37.5499,0.4015,0.3730,1.0542 +Kodak,8x8,ldr-rgb-kodak10.png,37.2288,0.4474,0.4180,0.9407 +Kodak,8x8,ldr-rgb-kodak11.png,33.8276,0.6812,0.6549,0.6004 +Kodak,8x8,ldr-rgb-kodak12.png,38.2490,0.4203,0.3954,0.9945 +Kodak,8x8,ldr-rgb-kodak13.png,28.4502,0.8473,0.8190,0.4801 +Kodak,8x8,ldr-rgb-kodak14.png,32.3258,0.7754,0.7485,0.5253 +Kodak,8x8,ldr-rgb-kodak15.png,36.0605,0.5259,0.4985,0.7888 +Kodak,8x8,ldr-rgb-kodak16.png,37.2636,0.4983,0.4728,0.8316 +Kodak,8x8,ldr-rgb-kodak17.png,35.8722,0.4829,0.4533,0.8674 +Kodak,8x8,ldr-rgb-kodak18.png,31.6495,0.7859,0.7549,0.5209 +Kodak,8x8,ldr-rgb-kodak19.png,34.9142,0.5389,0.5095,0.7718 +Kodak,8x8,ldr-rgb-kodak20.png,36.1470,0.4117,0.3872,1.0156 +Kodak,8x8,ldr-rgb-kodak21.png,33.2221,0.5529,0.5265,0.7469 +Kodak,8x8,ldr-rgb-kodak22.png,34.2197,0.6997,0.6711,0.5860 +Kodak,8x8,ldr-rgb-kodak23.png,38.1768,0.3932,0.3665,1.0728 +Kodak,8x8,ldr-rgb-kodak24.png,31.2175,0.6389,0.6108,0.6438 +Kodak,12x12,ldr-rgb-kodak01.png,27.9058,0.8665,0.8304,0.4735 +Kodak,12x12,ldr-rgb-kodak02.png,32.9642,0.5741,0.5372,0.7320 +Kodak,12x12,ldr-rgb-kodak03.png,34.4219,0.3530,0.3185,1.2346 +Kodak,12x12,ldr-rgb-kodak04.png,32.9599,0.5146,0.4749,0.8280 +Kodak,12x12,ldr-rgb-kodak05.png,26.5927,0.9079,0.8714,0.4513 +Kodak,12x12,ldr-rgb-kodak06.png,29.5304,0.6499,0.6142,0.6402 +Kodak,12x12,ldr-rgb-kodak07.png,32.6109,0.4292,0.3906,1.0068 +Kodak,12x12,ldr-rgb-kodak08.png,26.2744,0.8942,0.8539,0.4605 +Kodak,12x12,ldr-rgb-kodak09.png,33.6251,0.3877,0.3497,1.1245 +Kodak,12x12,ldr-rgb-kodak10.png,32.9833,0.3845,0.3449,1.1400 +Kodak,12x12,ldr-rgb-kodak11.png,30.0468,0.6591,0.6234,0.6307 +Kodak,12x12,ldr-rgb-kodak12.png,34.4395,0.3650,0.3298,1.1924 +Kodak,12x12,ldr-rgb-kodak13.png,24.5820,1.0253,0.9882,0.3979 +Kodak,12x12,ldr-rgb-kodak14.png,28.6287,0.8154,0.7792,0.5047 +Kodak,12x12,ldr-rgb-kodak15.png,32.7197,0.4926,0.4555,0.8632 +Kodak,12x12,ldr-rgb-kodak16.png,33.3355,0.4772,0.4421,0.8895 +Kodak,12x12,ldr-rgb-kodak17.png,32.1409,0.4333,0.3944,0.9970 +Kodak,12x12,ldr-rgb-kodak18.png,27.9217,0.7837,0.7423,0.5297 +Kodak,12x12,ldr-rgb-kodak19.png,31.1006,0.6179,0.5790,0.6791 +Kodak,12x12,ldr-rgb-kodak20.png,32.1470,0.4558,0.4221,0.9316 +Kodak,12x12,ldr-rgb-kodak21.png,29.3170,0.5895,0.5539,0.7100 +Kodak,12x12,ldr-rgb-kodak22.png,30.7805,0.6694,0.6312,0.6230 +Kodak,12x12,ldr-rgb-kodak23.png,34.3635,0.3280,0.2920,1.3467 +Kodak,12x12,ldr-rgb-kodak24.png,27.2253,0.7025,0.6647,0.5915 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse4.1_fast_results.csv new file mode 100644 index 0000000..5f3e7ba --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse4.1_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.8489,0.0384,0.0211,18.6482 +Kodak,4x4,ldr-rgb-kodak02.png,44.2380,0.0476,0.0292,13.4553 +Kodak,4x4,ldr-rgb-kodak03.png,46.6338,0.0334,0.0177,22.2067 +Kodak,4x4,ldr-rgb-kodak04.png,44.5665,0.0473,0.0264,14.8968 +Kodak,4x4,ldr-rgb-kodak05.png,41.5682,0.0563,0.0383,10.2676 +Kodak,4x4,ldr-rgb-kodak06.png,44.7452,0.0378,0.0208,18.9156 +Kodak,4x4,ldr-rgb-kodak07.png,45.0418,0.0435,0.0227,17.2857 +Kodak,4x4,ldr-rgb-kodak08.png,42.0821,0.0624,0.0399,9.8508 +Kodak,4x4,ldr-rgb-kodak09.png,46.2551,0.0359,0.0166,23.6678 +Kodak,4x4,ldr-rgb-kodak10.png,46.0288,0.0380,0.0173,22.7015 +Kodak,4x4,ldr-rgb-kodak11.png,44.2450,0.0417,0.0247,15.9210 +Kodak,4x4,ldr-rgb-kodak12.png,47.0135,0.0321,0.0162,24.2875 +Kodak,4x4,ldr-rgb-kodak13.png,41.4309,0.0526,0.0340,11.5539 +Kodak,4x4,ldr-rgb-kodak14.png,41.8065,0.0490,0.0313,12.5428 +Kodak,4x4,ldr-rgb-kodak15.png,44.5942,0.0475,0.0282,13.9612 +Kodak,4x4,ldr-rgb-kodak16.png,47.1801,0.0304,0.0145,27.2008 +Kodak,4x4,ldr-rgb-kodak17.png,45.7548,0.0366,0.0158,24.8227 +Kodak,4x4,ldr-rgb-kodak18.png,41.6128,0.0605,0.0380,10.3600 +Kodak,4x4,ldr-rgb-kodak19.png,44.8023,0.0416,0.0205,19.1784 +Kodak,4x4,ldr-rgb-kodak20.png,46.3894,0.0335,0.0182,21.6136 +Kodak,4x4,ldr-rgb-kodak21.png,44.5781,0.0386,0.0216,18.1836 +Kodak,4x4,ldr-rgb-kodak22.png,43.1599,0.0519,0.0319,12.3196 +Kodak,4x4,ldr-rgb-kodak23.png,45.5706,0.0384,0.0205,19.1635 +Kodak,4x4,ldr-rgb-kodak24.png,41.8541,0.0513,0.0315,12.4878 +Kodak,5x5,ldr-rgb-kodak01.png,39.6106,0.0393,0.0205,19.1802 +Kodak,5x5,ldr-rgb-kodak02.png,40.6312,0.0394,0.0200,19.6845 +Kodak,5x5,ldr-rgb-kodak03.png,43.0303,0.0303,0.0138,28.4754 +Kodak,5x5,ldr-rgb-kodak04.png,41.2378,0.0411,0.0190,20.7481 +Kodak,5x5,ldr-rgb-kodak05.png,37.4134,0.0540,0.0345,11.3913 +Kodak,5x5,ldr-rgb-kodak06.png,40.5758,0.0350,0.0173,22.7357 +Kodak,5x5,ldr-rgb-kodak07.png,41.4746,0.0391,0.0176,22.3584 +Kodak,5x5,ldr-rgb-kodak08.png,37.7544,0.0587,0.0357,11.0077 +Kodak,5x5,ldr-rgb-kodak09.png,42.9020,0.0331,0.0126,31.1435 +Kodak,5x5,ldr-rgb-kodak10.png,42.6178,0.0350,0.0134,29.3929 +Kodak,5x5,ldr-rgb-kodak11.png,40.2886,0.0369,0.0192,20.4299 +Kodak,5x5,ldr-rgb-kodak12.png,43.4048,0.0287,0.0118,33.3772 +Kodak,5x5,ldr-rgb-kodak13.png,36.8038,0.0511,0.0319,12.3293 +Kodak,5x5,ldr-rgb-kodak14.png,37.9374,0.0486,0.0300,13.1186 +Kodak,5x5,ldr-rgb-kodak15.png,41.1606,0.0391,0.0193,20.3951 +Kodak,5x5,ldr-rgb-kodak16.png,43.4729,0.0279,0.0109,35.9302 +Kodak,5x5,ldr-rgb-kodak17.png,42.0129,0.0341,0.0123,31.8983 +Kodak,5x5,ldr-rgb-kodak18.png,38.0842,0.0510,0.0275,14.3102 +Kodak,5x5,ldr-rgb-kodak19.png,41.1186,0.0377,0.0155,25.3068 +Kodak,5x5,ldr-rgb-kodak20.png,42.3441,0.0304,0.0142,27.6523 +Kodak,5x5,ldr-rgb-kodak21.png,40.4026,0.0362,0.0185,21.2872 +Kodak,5x5,ldr-rgb-kodak22.png,39.7574,0.0425,0.0219,17.9167 +Kodak,5x5,ldr-rgb-kodak23.png,42.4861,0.0330,0.0145,27.0678 +Kodak,5x5,ldr-rgb-kodak24.png,37.7908,0.0462,0.0252,15.5983 +Kodak,6x6,ldr-rgb-kodak01.png,35.7514,0.0497,0.0302,13.0285 +Kodak,6x6,ldr-rgb-kodak02.png,38.1633,0.0414,0.0212,18.5831 +Kodak,6x6,ldr-rgb-kodak03.png,40.5315,0.0312,0.0141,27.9508 +Kodak,6x6,ldr-rgb-kodak04.png,38.5310,0.0424,0.0198,19.8434 +Kodak,6x6,ldr-rgb-kodak05.png,34.3246,0.0639,0.0438,8.9851 +Kodak,6x6,ldr-rgb-kodak06.png,37.2781,0.0397,0.0210,18.7024 +Kodak,6x6,ldr-rgb-kodak07.png,38.8424,0.0413,0.0193,20.4110 +Kodak,6x6,ldr-rgb-kodak08.png,34.4294,0.0683,0.0446,8.8116 +Kodak,6x6,ldr-rgb-kodak09.png,39.9499,0.0356,0.0148,26.6570 +Kodak,6x6,ldr-rgb-kodak10.png,39.7100,0.0364,0.0142,27.7734 +Kodak,6x6,ldr-rgb-kodak11.png,37.1255,0.0417,0.0232,16.9739 +Kodak,6x6,ldr-rgb-kodak12.png,40.7229,0.0301,0.0122,32.1175 +Kodak,6x6,ldr-rgb-kodak13.png,32.7806,0.0683,0.0483,8.1487 +Kodak,6x6,ldr-rgb-kodak14.png,35.2350,0.0551,0.0359,10.9616 +Kodak,6x6,ldr-rgb-kodak15.png,38.5238,0.0411,0.0205,19.2131 +Kodak,6x6,ldr-rgb-kodak16.png,40.4988,0.0296,0.0122,32.1702 +Kodak,6x6,ldr-rgb-kodak17.png,38.9257,0.0369,0.0148,26.6514 +Kodak,6x6,ldr-rgb-kodak18.png,35.0961,0.0560,0.0317,12.3999 +Kodak,6x6,ldr-rgb-kodak19.png,37.9622,0.0427,0.0202,19.4778 +Kodak,6x6,ldr-rgb-kodak20.png,39.1651,0.0335,0.0167,23.5076 +Kodak,6x6,ldr-rgb-kodak21.png,36.8830,0.0425,0.0244,16.1280 +Kodak,6x6,ldr-rgb-kodak22.png,36.9688,0.0458,0.0244,16.0845 +Kodak,6x6,ldr-rgb-kodak23.png,40.0315,0.0335,0.0145,27.2085 +Kodak,6x6,ldr-rgb-kodak24.png,34.7652,0.0515,0.0303,12.9680 +Kodak,8x8,ldr-rgb-kodak01.png,31.3198,0.0661,0.0427,9.2101 +Kodak,8x8,ldr-rgb-kodak02.png,34.8859,0.0456,0.0216,18.1808 +Kodak,8x8,ldr-rgb-kodak03.png,36.5587,0.0369,0.0161,24.3931 +Kodak,8x8,ldr-rgb-kodak04.png,35.1631,0.0468,0.0200,19.6215 +Kodak,8x8,ldr-rgb-kodak05.png,30.2290,0.0824,0.0584,6.7293 +Kodak,8x8,ldr-rgb-kodak06.png,32.8875,0.0528,0.0301,13.0685 +Kodak,8x8,ldr-rgb-kodak07.png,34.9574,0.0480,0.0229,17.1838 +Kodak,8x8,ldr-rgb-kodak08.png,29.9727,0.0918,0.0640,6.1405 +Kodak,8x8,ldr-rgb-kodak09.png,36.0644,0.0426,0.0176,22.3040 +Kodak,8x8,ldr-rgb-kodak10.png,35.8574,0.0427,0.0166,23.7219 +Kodak,8x8,ldr-rgb-kodak11.png,32.9724,0.0519,0.0299,13.1357 +Kodak,8x8,ldr-rgb-kodak12.png,36.6491,0.0370,0.0157,25.0443 +Kodak,8x8,ldr-rgb-kodak13.png,28.2115,0.0954,0.0715,5.5019 +Kodak,8x8,ldr-rgb-kodak14.png,31.4868,0.0689,0.0456,8.6302 +Kodak,8x8,ldr-rgb-kodak15.png,34.9071,0.0469,0.0224,17.5785 +Kodak,8x8,ldr-rgb-kodak16.png,36.0183,0.0390,0.0177,22.2585 +Kodak,8x8,ldr-rgb-kodak17.png,34.8533,0.0454,0.0192,20.4525 +Kodak,8x8,ldr-rgb-kodak18.png,31.2426,0.0677,0.0398,9.8734 +Kodak,8x8,ldr-rgb-kodak19.png,34.0758,0.0519,0.0248,15.8364 +Kodak,8x8,ldr-rgb-kodak20.png,35.2054,0.0403,0.0194,20.2812 +Kodak,8x8,ldr-rgb-kodak21.png,32.7363,0.0530,0.0309,12.7180 +Kodak,8x8,ldr-rgb-kodak22.png,33.4351,0.0525,0.0267,14.7289 +Kodak,8x8,ldr-rgb-kodak23.png,36.4996,0.0376,0.0145,27.1203 +Kodak,8x8,ldr-rgb-kodak24.png,30.8082,0.0638,0.0387,10.1543 +Kodak,12x12,ldr-rgb-kodak01.png,27.1019,0.0619,0.0317,12.4153 +Kodak,12x12,ldr-rgb-kodak02.png,31.0998,0.0423,0.0115,34.2669 +Kodak,12x12,ldr-rgb-kodak03.png,32.6801,0.0379,0.0102,38.4597 +Kodak,12x12,ldr-rgb-kodak04.png,31.5605,0.0435,0.0100,39.3376 +Kodak,12x12,ldr-rgb-kodak05.png,25.8046,0.0693,0.0385,10.2107 +Kodak,12x12,ldr-rgb-kodak06.png,28.6329,0.0522,0.0233,16.9059 +Kodak,12x12,ldr-rgb-kodak07.png,30.8575,0.0453,0.0128,30.7080 +Kodak,12x12,ldr-rgb-kodak08.png,25.3858,0.0812,0.0464,8.4753 +Kodak,12x12,ldr-rgb-kodak09.png,31.8332,0.0430,0.0116,33.9272 +Kodak,12x12,ldr-rgb-kodak10.png,31.5261,0.0452,0.0121,32.5004 +Kodak,12x12,ldr-rgb-kodak11.png,28.9305,0.0471,0.0183,21.5084 +Kodak,12x12,ldr-rgb-kodak12.png,32.2648,0.0382,0.0102,38.3961 +Kodak,12x12,ldr-rgb-kodak13.png,24.3204,0.0844,0.0532,7.3974 +Kodak,12x12,ldr-rgb-kodak14.png,27.5269,0.0553,0.0258,15.2250 +Kodak,12x12,ldr-rgb-kodak15.png,31.2436,0.0452,0.0141,27.7949 +Kodak,12x12,ldr-rgb-kodak16.png,31.4839,0.0401,0.0118,33.2078 +Kodak,12x12,ldr-rgb-kodak17.png,30.8893,0.0461,0.0132,29.8661 +Kodak,12x12,ldr-rgb-kodak18.png,27.4177,0.0595,0.0253,15.5434 +Kodak,12x12,ldr-rgb-kodak19.png,30.1727,0.0509,0.0174,22.5649 +Kodak,12x12,ldr-rgb-kodak20.png,31.0405,0.0412,0.0138,28.5187 +Kodak,12x12,ldr-rgb-kodak21.png,28.7196,0.0517,0.0225,17.4531 +Kodak,12x12,ldr-rgb-kodak22.png,29.8238,0.0460,0.0142,27.7109 +Kodak,12x12,ldr-rgb-kodak23.png,32.5185,0.0401,0.0106,36.9426 +Kodak,12x12,ldr-rgb-kodak24.png,26.7652,0.0613,0.0296,13.2813 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse4.1_fastest_results.csv new file mode 100644 index 0000000..8192a51 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse4.1_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.5072,0.0328,0.0160,24.5961 +Kodak,4x4,ldr-rgb-kodak02.png,43.8025,0.0379,0.0202,19.4643 +Kodak,4x4,ldr-rgb-kodak03.png,46.0406,0.0281,0.0132,29.7439 +Kodak,4x4,ldr-rgb-kodak04.png,44.1429,0.0394,0.0189,20.8338 +Kodak,4x4,ldr-rgb-kodak05.png,40.9879,0.0425,0.0247,15.8875 +Kodak,4x4,ldr-rgb-kodak06.png,44.4296,0.0323,0.0162,24.2907 +Kodak,4x4,ldr-rgb-kodak07.png,44.6051,0.0362,0.0167,23.5600 +Kodak,4x4,ldr-rgb-kodak08.png,41.5000,0.0468,0.0254,15.4797 +Kodak,4x4,ldr-rgb-kodak09.png,45.9005,0.0316,0.0128,30.6248 +Kodak,4x4,ldr-rgb-kodak10.png,45.6663,0.0337,0.0135,29.0476 +Kodak,4x4,ldr-rgb-kodak11.png,43.8292,0.0340,0.0179,21.9245 +Kodak,4x4,ldr-rgb-kodak12.png,46.4729,0.0281,0.0127,30.9495 +Kodak,4x4,ldr-rgb-kodak13.png,41.1509,0.0425,0.0249,15.7873 +Kodak,4x4,ldr-rgb-kodak14.png,41.0931,0.0370,0.0202,19.5087 +Kodak,4x4,ldr-rgb-kodak15.png,44.1027,0.0373,0.0190,20.7207 +Kodak,4x4,ldr-rgb-kodak16.png,47.0422,0.0273,0.0120,32.6723 +Kodak,4x4,ldr-rgb-kodak17.png,45.4973,0.0326,0.0125,31.4200 +Kodak,4x4,ldr-rgb-kodak18.png,41.2449,0.0468,0.0253,15.5427 +Kodak,4x4,ldr-rgb-kodak19.png,44.5301,0.0365,0.0157,24.9870 +Kodak,4x4,ldr-rgb-kodak20.png,45.8602,0.0285,0.0137,28.6520 +Kodak,4x4,ldr-rgb-kodak21.png,44.2614,0.0325,0.0164,23.9316 +Kodak,4x4,ldr-rgb-kodak22.png,42.7742,0.0410,0.0216,18.2288 +Kodak,4x4,ldr-rgb-kodak23.png,45.2565,0.0320,0.0153,25.7103 +Kodak,4x4,ldr-rgb-kodak24.png,41.2205,0.0400,0.0210,18.7183 +Kodak,5x5,ldr-rgb-kodak01.png,39.3652,0.0351,0.0174,22.6221 +Kodak,5x5,ldr-rgb-kodak02.png,40.3762,0.0342,0.0155,25.3753 +Kodak,5x5,ldr-rgb-kodak03.png,42.6004,0.0264,0.0110,35.6429 +Kodak,5x5,ldr-rgb-kodak04.png,40.7711,0.0361,0.0150,26.1274 +Kodak,5x5,ldr-rgb-kodak05.png,36.9823,0.0434,0.0248,15.8773 +Kodak,5x5,ldr-rgb-kodak06.png,40.4008,0.0314,0.0144,27.3429 +Kodak,5x5,ldr-rgb-kodak07.png,41.1154,0.0344,0.0141,27.8998 +Kodak,5x5,ldr-rgb-kodak08.png,37.3666,0.0478,0.0256,15.3330 +Kodak,5x5,ldr-rgb-kodak09.png,42.5422,0.0301,0.0108,36.5618 +Kodak,5x5,ldr-rgb-kodak10.png,42.3455,0.0321,0.0112,35.0714 +Kodak,5x5,ldr-rgb-kodak11.png,40.0401,0.0319,0.0154,25.5336 +Kodak,5x5,ldr-rgb-kodak12.png,43.1448,0.0262,0.0102,38.7061 +Kodak,5x5,ldr-rgb-kodak13.png,36.6876,0.0436,0.0255,15.4221 +Kodak,5x5,ldr-rgb-kodak14.png,37.3962,0.0374,0.0200,19.6559 +Kodak,5x5,ldr-rgb-kodak15.png,40.8535,0.0337,0.0147,26.7638 +Kodak,5x5,ldr-rgb-kodak16.png,43.3795,0.0261,0.0101,38.9824 +Kodak,5x5,ldr-rgb-kodak17.png,41.8560,0.0317,0.0111,35.4475 +Kodak,5x5,ldr-rgb-kodak18.png,37.9129,0.0431,0.0210,18.6810 +Kodak,5x5,ldr-rgb-kodak19.png,40.8503,0.0349,0.0135,29.0200 +Kodak,5x5,ldr-rgb-kodak20.png,42.0160,0.0271,0.0117,33.5476 +Kodak,5x5,ldr-rgb-kodak21.png,40.1806,0.0323,0.0152,25.8134 +Kodak,5x5,ldr-rgb-kodak22.png,39.4506,0.0367,0.0168,23.3806 +Kodak,5x5,ldr-rgb-kodak23.png,42.1119,0.0299,0.0123,31.8576 +Kodak,5x5,ldr-rgb-kodak24.png,37.5517,0.0386,0.0191,20.5863 +Kodak,6x6,ldr-rgb-kodak01.png,35.6562,0.0399,0.0219,17.9706 +Kodak,6x6,ldr-rgb-kodak02.png,38.0339,0.0342,0.0153,25.7071 +Kodak,6x6,ldr-rgb-kodak03.png,40.3032,0.0264,0.0105,37.4136 +Kodak,6x6,ldr-rgb-kodak04.png,38.2918,0.0360,0.0143,27.4553 +Kodak,6x6,ldr-rgb-kodak05.png,34.0896,0.0460,0.0276,14.2258 +Kodak,6x6,ldr-rgb-kodak06.png,37.2222,0.0334,0.0162,24.2397 +Kodak,6x6,ldr-rgb-kodak07.png,38.6336,0.0348,0.0142,27.6969 +Kodak,6x6,ldr-rgb-kodak08.png,34.2253,0.0505,0.0285,13.8029 +Kodak,6x6,ldr-rgb-kodak09.png,39.7573,0.0311,0.0112,35.1589 +Kodak,6x6,ldr-rgb-kodak10.png,39.5669,0.0325,0.0112,34.9562 +Kodak,6x6,ldr-rgb-kodak11.png,36.9968,0.0335,0.0164,24.0292 +Kodak,6x6,ldr-rgb-kodak12.png,40.5658,0.0262,0.0101,39.1035 +Kodak,6x6,ldr-rgb-kodak13.png,32.7154,0.0511,0.0324,12.1506 +Kodak,6x6,ldr-rgb-kodak14.png,34.8624,0.0394,0.0213,18.4393 +Kodak,6x6,ldr-rgb-kodak15.png,38.3699,0.0341,0.0148,26.4917 +Kodak,6x6,ldr-rgb-kodak16.png,40.4581,0.0266,0.0103,38.1801 +Kodak,6x6,ldr-rgb-kodak17.png,38.8420,0.0327,0.0118,33.4537 +Kodak,6x6,ldr-rgb-kodak18.png,35.0034,0.0449,0.0224,17.5152 +Kodak,6x6,ldr-rgb-kodak19.png,37.8298,0.0371,0.0154,25.5170 +Kodak,6x6,ldr-rgb-kodak20.png,39.0123,0.0280,0.0125,31.4626 +Kodak,6x6,ldr-rgb-kodak21.png,36.8075,0.0343,0.0173,22.7674 +Kodak,6x6,ldr-rgb-kodak22.png,36.8498,0.0372,0.0173,22.7266 +Kodak,6x6,ldr-rgb-kodak23.png,39.8307,0.0290,0.0113,34.8410 +Kodak,6x6,ldr-rgb-kodak24.png,34.6916,0.0408,0.0209,18.8195 +Kodak,8x8,ldr-rgb-kodak01.png,31.1792,0.0521,0.0304,12.9364 +Kodak,8x8,ldr-rgb-kodak02.png,34.7811,0.0387,0.0164,24.0058 +Kodak,8x8,ldr-rgb-kodak03.png,36.4262,0.0319,0.0125,31.4050 +Kodak,8x8,ldr-rgb-kodak04.png,35.0547,0.0404,0.0155,25.4328 +Kodak,8x8,ldr-rgb-kodak05.png,30.0205,0.0602,0.0379,10.3641 +Kodak,8x8,ldr-rgb-kodak06.png,32.7989,0.0429,0.0223,17.6226 +Kodak,8x8,ldr-rgb-kodak07.png,34.8360,0.0412,0.0173,22.6675 +Kodak,8x8,ldr-rgb-kodak08.png,29.7069,0.0665,0.0407,9.6723 +Kodak,8x8,ldr-rgb-kodak09.png,35.8914,0.0371,0.0137,28.7459 +Kodak,8x8,ldr-rgb-kodak10.png,35.7051,0.0378,0.0132,29.8208 +Kodak,8x8,ldr-rgb-kodak11.png,32.8451,0.0417,0.0212,18.5384 +Kodak,8x8,ldr-rgb-kodak12.png,36.5111,0.0320,0.0124,31.8109 +Kodak,8x8,ldr-rgb-kodak13.png,28.1364,0.0699,0.0474,8.2901 +Kodak,8x8,ldr-rgb-kodak14.png,31.2591,0.0510,0.0295,13.3374 +Kodak,8x8,ldr-rgb-kodak15.png,34.7599,0.0393,0.0166,23.6552 +Kodak,8x8,ldr-rgb-kodak16.png,35.9616,0.0336,0.0139,28.2100 +Kodak,8x8,ldr-rgb-kodak17.png,34.7164,0.0390,0.0146,26.9920 +Kodak,8x8,ldr-rgb-kodak18.png,31.1666,0.0541,0.0277,14.1822 +Kodak,8x8,ldr-rgb-kodak19.png,33.8904,0.0437,0.0186,21.1692 +Kodak,8x8,ldr-rgb-kodak20.png,35.0191,0.0336,0.0147,26.7222 +Kodak,8x8,ldr-rgb-kodak21.png,32.6198,0.0428,0.0223,17.6313 +Kodak,8x8,ldr-rgb-kodak22.png,33.3242,0.0432,0.0197,19.9560 +Kodak,8x8,ldr-rgb-kodak23.png,36.3894,0.0331,0.0118,33.2165 +Kodak,8x8,ldr-rgb-kodak24.png,30.7268,0.0503,0.0271,14.4868 +Kodak,12x12,ldr-rgb-kodak01.png,26.9930,0.0498,0.0243,16.1710 +Kodak,12x12,ldr-rgb-kodak02.png,31.0354,0.0363,0.0098,39.9851 +Kodak,12x12,ldr-rgb-kodak03.png,32.6215,0.0322,0.0088,44.7186 +Kodak,12x12,ldr-rgb-kodak04.png,31.4774,0.0377,0.0084,46.8608 +Kodak,12x12,ldr-rgb-kodak05.png,25.6941,0.0547,0.0286,13.7580 +Kodak,12x12,ldr-rgb-kodak06.png,28.4895,0.0430,0.0184,21.3938 +Kodak,12x12,ldr-rgb-kodak07.png,30.8016,0.0389,0.0107,36.5983 +Kodak,12x12,ldr-rgb-kodak08.png,25.2157,0.0633,0.0335,11.7333 +Kodak,12x12,ldr-rgb-kodak09.png,31.6339,0.0370,0.0095,41.1792 +Kodak,12x12,ldr-rgb-kodak10.png,31.4567,0.0389,0.0100,39.1843 +Kodak,12x12,ldr-rgb-kodak11.png,28.8572,0.0389,0.0142,27.6579 +Kodak,12x12,ldr-rgb-kodak12.png,32.1857,0.0327,0.0085,46.0342 +Kodak,12x12,ldr-rgb-kodak13.png,24.2396,0.0644,0.0377,10.4309 +Kodak,12x12,ldr-rgb-kodak14.png,27.4380,0.0445,0.0190,20.7153 +Kodak,12x12,ldr-rgb-kodak15.png,31.1533,0.0382,0.0114,34.5744 +Kodak,12x12,ldr-rgb-kodak16.png,31.3620,0.0338,0.0100,39.3770 +Kodak,12x12,ldr-rgb-kodak17.png,30.8364,0.0395,0.0106,36.9534 +Kodak,12x12,ldr-rgb-kodak18.png,27.3672,0.0491,0.0189,20.8062 +Kodak,12x12,ldr-rgb-kodak19.png,29.8648,0.0431,0.0139,28.2278 +Kodak,12x12,ldr-rgb-kodak20.png,30.9381,0.0347,0.0113,34.8380 +Kodak,12x12,ldr-rgb-kodak21.png,28.6166,0.0418,0.0173,22.6847 +Kodak,12x12,ldr-rgb-kodak22.png,29.7245,0.0392,0.0115,34.1188 +Kodak,12x12,ldr-rgb-kodak23.png,32.4842,0.0344,0.0091,43.2958 +Kodak,12x12,ldr-rgb-kodak24.png,26.6937,0.0492,0.0217,18.0872 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse4.1_medium_results.csv new file mode 100644 index 0000000..25297c3 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse4.1_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.2910,0.1376,0.1193,3.2949 +Kodak,4x4,ldr-rgb-kodak02.png,45.3499,0.1867,0.1671,2.3533 +Kodak,4x4,ldr-rgb-kodak03.png,47.6132,0.1002,0.0834,4.7169 +Kodak,4x4,ldr-rgb-kodak04.png,45.4289,0.1508,0.1283,3.0637 +Kodak,4x4,ldr-rgb-kodak05.png,42.1296,0.1729,0.1538,2.5568 +Kodak,4x4,ldr-rgb-kodak06.png,45.1555,0.1312,0.1133,3.4697 +Kodak,4x4,ldr-rgb-kodak07.png,45.9745,0.1280,0.1065,3.6933 +Kodak,4x4,ldr-rgb-kodak08.png,42.5130,0.1922,0.1693,2.3222 +Kodak,4x4,ldr-rgb-kodak09.png,47.1616,0.1495,0.1287,3.0564 +Kodak,4x4,ldr-rgb-kodak10.png,46.8287,0.1543,0.1319,2.9816 +Kodak,4x4,ldr-rgb-kodak11.png,44.8668,0.1486,0.1307,3.0075 +Kodak,4x4,ldr-rgb-kodak12.png,47.9301,0.1128,0.0956,4.1114 +Kodak,4x4,ldr-rgb-kodak13.png,41.6152,0.1479,0.1284,3.0627 +Kodak,4x4,ldr-rgb-kodak14.png,42.6269,0.1601,0.1415,2.7798 +Kodak,4x4,ldr-rgb-kodak15.png,45.4386,0.1330,0.1132,3.4747 +Kodak,4x4,ldr-rgb-kodak16.png,47.8565,0.1150,0.0979,4.0181 +Kodak,4x4,ldr-rgb-kodak17.png,46.2901,0.1329,0.1109,3.5452 +Kodak,4x4,ldr-rgb-kodak18.png,41.9927,0.1953,0.1717,2.2907 +Kodak,4x4,ldr-rgb-kodak19.png,45.3392,0.1592,0.1366,2.8785 +Kodak,4x4,ldr-rgb-kodak20.png,46.8869,0.0973,0.0808,4.8669 +Kodak,4x4,ldr-rgb-kodak21.png,45.1510,0.1574,0.1395,2.8195 +Kodak,4x4,ldr-rgb-kodak22.png,43.7746,0.1958,0.1746,2.2527 +Kodak,4x4,ldr-rgb-kodak23.png,46.8184,0.1507,0.1319,2.9815 +Kodak,4x4,ldr-rgb-kodak24.png,42.2960,0.1548,0.1344,2.9264 +Kodak,5x5,ldr-rgb-kodak01.png,40.1121,0.1640,0.1439,2.7334 +Kodak,5x5,ldr-rgb-kodak02.png,41.6953,0.1737,0.1524,2.5802 +Kodak,5x5,ldr-rgb-kodak03.png,44.0360,0.0823,0.0642,6.1210 +Kodak,5x5,ldr-rgb-kodak04.png,42.0560,0.1377,0.1137,3.4571 +Kodak,5x5,ldr-rgb-kodak05.png,37.9816,0.1895,0.1687,2.3313 +Kodak,5x5,ldr-rgb-kodak06.png,40.9586,0.1310,0.1111,3.5392 +Kodak,5x5,ldr-rgb-kodak07.png,42.4607,0.1132,0.0902,4.3593 +Kodak,5x5,ldr-rgb-kodak08.png,38.3486,0.2082,0.1831,2.1470 +Kodak,5x5,ldr-rgb-kodak09.png,43.8038,0.0976,0.0754,5.2139 +Kodak,5x5,ldr-rgb-kodak10.png,43.4092,0.1107,0.0870,4.5171 +Kodak,5x5,ldr-rgb-kodak11.png,40.8377,0.1498,0.1305,3.0131 +Kodak,5x5,ldr-rgb-kodak12.png,44.3921,0.0839,0.0653,6.0197 +Kodak,5x5,ldr-rgb-kodak13.png,36.9078,0.1742,0.1534,2.5629 +Kodak,5x5,ldr-rgb-kodak14.png,38.6484,0.1702,0.1500,2.6209 +Kodak,5x5,ldr-rgb-kodak15.png,41.8912,0.1283,0.1063,3.6991 +Kodak,5x5,ldr-rgb-kodak16.png,44.1367,0.0939,0.0753,5.2228 +Kodak,5x5,ldr-rgb-kodak17.png,42.5213,0.0990,0.0754,5.2134 +Kodak,5x5,ldr-rgb-kodak18.png,38.3607,0.1872,0.1622,2.4248 +Kodak,5x5,ldr-rgb-kodak19.png,41.6469,0.1292,0.1052,3.7383 +Kodak,5x5,ldr-rgb-kodak20.png,42.9685,0.0913,0.0734,5.3553 +Kodak,5x5,ldr-rgb-kodak21.png,40.7620,0.1289,0.1095,3.5901 +Kodak,5x5,ldr-rgb-kodak22.png,40.2773,0.1765,0.1538,2.5559 +Kodak,5x5,ldr-rgb-kodak23.png,43.5488,0.1111,0.0909,4.3248 +Kodak,5x5,ldr-rgb-kodak24.png,38.1152,0.1524,0.1301,3.0227 +Kodak,6x6,ldr-rgb-kodak01.png,36.1951,0.1720,0.1511,2.6029 +Kodak,6x6,ldr-rgb-kodak02.png,39.0094,0.1369,0.1148,3.4258 +Kodak,6x6,ldr-rgb-kodak03.png,41.3262,0.0704,0.0516,7.6213 +Kodak,6x6,ldr-rgb-kodak04.png,39.3983,0.1184,0.0936,4.1988 +Kodak,6x6,ldr-rgb-kodak05.png,34.7867,0.1868,0.1654,2.3770 +Kodak,6x6,ldr-rgb-kodak06.png,37.6289,0.1179,0.0977,4.0249 +Kodak,6x6,ldr-rgb-kodak07.png,39.7726,0.0977,0.0743,5.2932 +Kodak,6x6,ldr-rgb-kodak08.png,34.9978,0.2092,0.1841,2.1362 +Kodak,6x6,ldr-rgb-kodak09.png,40.8821,0.0769,0.0539,7.2912 +Kodak,6x6,ldr-rgb-kodak10.png,40.5030,0.0822,0.0582,6.7575 +Kodak,6x6,ldr-rgb-kodak11.png,37.5798,0.1261,0.1063,3.7002 +Kodak,6x6,ldr-rgb-kodak12.png,41.4837,0.0666,0.0472,8.3383 +Kodak,6x6,ldr-rgb-kodak13.png,32.8829,0.1934,0.1719,2.2871 +Kodak,6x6,ldr-rgb-kodak14.png,35.8236,0.1575,0.1368,2.8754 +Kodak,6x6,ldr-rgb-kodak15.png,39.1953,0.1195,0.0973,4.0395 +Kodak,6x6,ldr-rgb-kodak16.png,41.0408,0.0774,0.0583,6.7484 +Kodak,6x6,ldr-rgb-kodak17.png,39.4928,0.0838,0.0597,6.5824 +Kodak,6x6,ldr-rgb-kodak18.png,35.3481,0.1665,0.1412,2.7858 +Kodak,6x6,ldr-rgb-kodak19.png,38.5316,0.1174,0.0929,4.2332 +Kodak,6x6,ldr-rgb-kodak20.png,39.7651,0.0841,0.0656,5.9971 +Kodak,6x6,ldr-rgb-kodak21.png,37.1926,0.1151,0.0953,4.1282 +Kodak,6x6,ldr-rgb-kodak22.png,37.4532,0.1499,0.1266,3.1052 +Kodak,6x6,ldr-rgb-kodak23.png,40.9705,0.0815,0.0607,6.4768 +Kodak,6x6,ldr-rgb-kodak24.png,35.0426,0.1379,0.1147,3.4270 +Kodak,8x8,ldr-rgb-kodak01.png,31.8012,0.2348,0.2104,1.8692 +Kodak,8x8,ldr-rgb-kodak02.png,35.7606,0.1367,0.1110,3.5434 +Kodak,8x8,ldr-rgb-kodak03.png,37.7459,0.0863,0.0639,6.1546 +Kodak,8x8,ldr-rgb-kodak04.png,36.0605,0.1334,0.1049,3.7493 +Kodak,8x8,ldr-rgb-kodak05.png,30.7416,0.2430,0.2182,1.8022 +Kodak,8x8,ldr-rgb-kodak06.png,33.4352,0.1512,0.1274,3.0857 +Kodak,8x8,ldr-rgb-kodak07.png,36.1304,0.1157,0.0884,4.4500 +Kodak,8x8,ldr-rgb-kodak08.png,30.5708,0.2448,0.2163,1.8181 +Kodak,8x8,ldr-rgb-kodak09.png,37.2646,0.0890,0.0625,6.2953 +Kodak,8x8,ldr-rgb-kodak10.png,36.9159,0.0926,0.0647,6.0747 +Kodak,8x8,ldr-rgb-kodak11.png,33.6569,0.1495,0.1257,3.1270 +Kodak,8x8,ldr-rgb-kodak12.png,37.8259,0.0826,0.0597,6.5879 +Kodak,8x8,ldr-rgb-kodak13.png,28.3927,0.2704,0.2454,1.6022 +Kodak,8x8,ldr-rgb-kodak14.png,32.1340,0.1937,0.1695,2.3197 +Kodak,8x8,ldr-rgb-kodak15.png,35.8359,0.1224,0.0965,4.0750 +Kodak,8x8,ldr-rgb-kodak16.png,37.0213,0.0968,0.0739,5.3229 +Kodak,8x8,ldr-rgb-kodak17.png,35.6807,0.1028,0.0749,5.2514 +Kodak,8x8,ldr-rgb-kodak18.png,31.5529,0.1948,0.1652,2.3799 +Kodak,8x8,ldr-rgb-kodak19.png,34.7649,0.1419,0.1133,3.4707 +Kodak,8x8,ldr-rgb-kodak20.png,35.8945,0.1045,0.0825,4.7667 +Kodak,8x8,ldr-rgb-kodak21.png,33.1150,0.1486,0.1246,3.1567 +Kodak,8x8,ldr-rgb-kodak22.png,34.0244,0.1634,0.1366,2.8782 +Kodak,8x8,ldr-rgb-kodak23.png,37.6470,0.0842,0.0599,6.5653 +Kodak,8x8,ldr-rgb-kodak24.png,31.1140,0.1710,0.1440,2.7304 +Kodak,12x12,ldr-rgb-kodak01.png,27.7578,0.2518,0.2191,1.7948 +Kodak,12x12,ldr-rgb-kodak02.png,32.4621,0.1012,0.0677,5.8044 +Kodak,12x12,ldr-rgb-kodak03.png,33.7766,0.0822,0.0512,7.6758 +Kodak,12x12,ldr-rgb-kodak04.png,32.4443,0.0964,0.0598,6.5726 +Kodak,12x12,ldr-rgb-kodak05.png,26.3986,0.2678,0.2345,1.6772 +Kodak,12x12,ldr-rgb-kodak06.png,29.3737,0.1622,0.1302,3.0202 +Kodak,12x12,ldr-rgb-kodak07.png,32.0414,0.1160,0.0805,4.8853 +Kodak,12x12,ldr-rgb-kodak08.png,26.0600,0.2698,0.2329,1.6884 +Kodak,12x12,ldr-rgb-kodak09.png,33.0989,0.0882,0.0531,7.4020 +Kodak,12x12,ldr-rgb-kodak10.png,32.4884,0.0894,0.0533,7.3757 +Kodak,12x12,ldr-rgb-kodak11.png,29.7433,0.1448,0.1126,3.4914 +Kodak,12x12,ldr-rgb-kodak12.png,33.8819,0.0779,0.0469,8.3881 +Kodak,12x12,ldr-rgb-kodak13.png,24.5282,0.3059,0.2723,1.4443 +Kodak,12x12,ldr-rgb-kodak14.png,28.4176,0.1936,0.1607,2.4466 +Kodak,12x12,ldr-rgb-kodak15.png,32.2342,0.1105,0.0764,5.1475 +Kodak,12x12,ldr-rgb-kodak16.png,32.9807,0.0869,0.0556,7.0767 +Kodak,12x12,ldr-rgb-kodak17.png,31.7805,0.0969,0.0608,6.4689 +Kodak,12x12,ldr-rgb-kodak18.png,27.7783,0.1927,0.1553,2.5324 +Kodak,12x12,ldr-rgb-kodak19.png,30.8882,0.1252,0.0884,4.4483 +Kodak,12x12,ldr-rgb-kodak20.png,31.8562,0.0952,0.0649,6.0568 +Kodak,12x12,ldr-rgb-kodak21.png,29.1771,0.1726,0.1406,2.7961 +Kodak,12x12,ldr-rgb-kodak22.png,30.4983,0.1351,0.1001,3.9269 +Kodak,12x12,ldr-rgb-kodak23.png,33.5464,0.0749,0.0423,9.3067 +Kodak,12x12,ldr-rgb-kodak24.png,27.0976,0.1732,0.1386,2.8365 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse4.1_thorough_results.csv new file mode 100644 index 0000000..4264ae8 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.6-sse4.1_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.4944,0.3616,0.3424,1.1485 +Kodak,4x4,ldr-rgb-kodak02.png,45.6493,0.4293,0.4095,0.9603 +Kodak,4x4,ldr-rgb-kodak03.png,47.9884,0.3696,0.3527,1.1150 +Kodak,4x4,ldr-rgb-kodak04.png,45.6562,0.4057,0.3826,1.0278 +Kodak,4x4,ldr-rgb-kodak05.png,42.4063,0.4001,0.3807,1.0328 +Kodak,4x4,ldr-rgb-kodak06.png,45.3572,0.3604,0.3420,1.1496 +Kodak,4x4,ldr-rgb-kodak07.png,46.3419,0.4036,0.3822,1.0288 +Kodak,4x4,ldr-rgb-kodak08.png,42.8054,0.4300,0.4066,0.9672 +Kodak,4x4,ldr-rgb-kodak09.png,47.4208,0.4108,0.3897,1.0090 +Kodak,4x4,ldr-rgb-kodak10.png,47.0603,0.4109,0.3885,1.0120 +Kodak,4x4,ldr-rgb-kodak11.png,45.1121,0.3790,0.3608,1.0900 +Kodak,4x4,ldr-rgb-kodak12.png,48.2457,0.3793,0.3622,1.0857 +Kodak,4x4,ldr-rgb-kodak13.png,41.7174,0.3648,0.3450,1.1399 +Kodak,4x4,ldr-rgb-kodak14.png,42.9405,0.3901,0.3710,1.0599 +Kodak,4x4,ldr-rgb-kodak15.png,45.7858,0.3883,0.3682,1.0680 +Kodak,4x4,ldr-rgb-kodak16.png,48.0652,0.3751,0.3577,1.0993 +Kodak,4x4,ldr-rgb-kodak17.png,46.4610,0.3937,0.3716,1.0583 +Kodak,4x4,ldr-rgb-kodak18.png,42.1541,0.4274,0.4037,0.9739 +Kodak,4x4,ldr-rgb-kodak19.png,45.5439,0.4082,0.3855,1.0200 +Kodak,4x4,ldr-rgb-kodak20.png,47.1284,0.2580,0.2415,1.6282 +Kodak,4x4,ldr-rgb-kodak21.png,45.3018,0.3986,0.3800,1.0347 +Kodak,4x4,ldr-rgb-kodak22.png,43.9797,0.4354,0.4141,0.9495 +Kodak,4x4,ldr-rgb-kodak23.png,47.1533,0.4225,0.4036,0.9743 +Kodak,4x4,ldr-rgb-kodak24.png,42.5030,0.3923,0.3716,1.0583 +Kodak,5x5,ldr-rgb-kodak01.png,40.2326,0.4602,0.4398,0.8940 +Kodak,5x5,ldr-rgb-kodak02.png,41.9976,0.5338,0.5127,0.7670 +Kodak,5x5,ldr-rgb-kodak03.png,44.3239,0.4411,0.4229,0.9298 +Kodak,5x5,ldr-rgb-kodak04.png,42.2394,0.4885,0.4642,0.8471 +Kodak,5x5,ldr-rgb-kodak05.png,38.1756,0.5028,0.4821,0.8157 +Kodak,5x5,ldr-rgb-kodak06.png,41.0844,0.4381,0.4182,0.9402 +Kodak,5x5,ldr-rgb-kodak07.png,42.7249,0.4815,0.4584,0.8577 +Kodak,5x5,ldr-rgb-kodak08.png,38.5334,0.5155,0.4908,0.8012 +Kodak,5x5,ldr-rgb-kodak09.png,44.0288,0.4842,0.4618,0.8515 +Kodak,5x5,ldr-rgb-kodak10.png,43.5935,0.4895,0.4657,0.8443 +Kodak,5x5,ldr-rgb-kodak11.png,40.9987,0.4578,0.4385,0.8966 +Kodak,5x5,ldr-rgb-kodak12.png,44.5960,0.4503,0.4312,0.9119 +Kodak,5x5,ldr-rgb-kodak13.png,36.9510,0.4522,0.4308,0.9128 +Kodak,5x5,ldr-rgb-kodak14.png,38.8797,0.4807,0.4605,0.8539 +Kodak,5x5,ldr-rgb-kodak15.png,42.1246,0.4597,0.4382,0.8973 +Kodak,5x5,ldr-rgb-kodak16.png,44.2686,0.4487,0.4301,0.9142 +Kodak,5x5,ldr-rgb-kodak17.png,42.6009,0.4744,0.4506,0.8727 +Kodak,5x5,ldr-rgb-kodak18.png,38.4550,0.5223,0.4972,0.7908 +Kodak,5x5,ldr-rgb-kodak19.png,41.7719,0.5023,0.4783,0.8221 +Kodak,5x5,ldr-rgb-kodak20.png,43.2708,0.3156,0.2978,1.3203 +Kodak,5x5,ldr-rgb-kodak21.png,40.8630,0.4953,0.4759,0.8263 +Kodak,5x5,ldr-rgb-kodak22.png,40.4255,0.5340,0.5117,0.7685 +Kodak,5x5,ldr-rgb-kodak23.png,43.8841,0.5193,0.4990,0.7881 +Kodak,5x5,ldr-rgb-kodak24.png,38.2272,0.4763,0.4540,0.8660 +Kodak,6x6,ldr-rgb-kodak01.png,36.3116,0.5504,0.5295,0.7426 +Kodak,6x6,ldr-rgb-kodak02.png,39.3780,0.6270,0.6044,0.6506 +Kodak,6x6,ldr-rgb-kodak03.png,41.7331,0.3903,0.3715,1.0584 +Kodak,6x6,ldr-rgb-kodak04.png,39.6521,0.5495,0.5243,0.7500 +Kodak,6x6,ldr-rgb-kodak05.png,34.9741,0.5935,0.5717,0.6878 +Kodak,6x6,ldr-rgb-kodak06.png,37.7401,0.4948,0.4745,0.8287 +Kodak,6x6,ldr-rgb-kodak07.png,40.1032,0.4495,0.4258,0.9234 +Kodak,6x6,ldr-rgb-kodak08.png,35.1660,0.6030,0.5775,0.6809 +Kodak,6x6,ldr-rgb-kodak09.png,41.2613,0.5508,0.5277,0.7451 +Kodak,6x6,ldr-rgb-kodak10.png,40.8141,0.5634,0.5389,0.7296 +Kodak,6x6,ldr-rgb-kodak11.png,37.7541,0.5065,0.4863,0.8087 +Kodak,6x6,ldr-rgb-kodak12.png,41.8249,0.4748,0.4546,0.8650 +Kodak,6x6,ldr-rgb-kodak13.png,32.9256,0.5560,0.5341,0.7362 +Kodak,6x6,ldr-rgb-kodak14.png,36.0210,0.5756,0.5549,0.7086 +Kodak,6x6,ldr-rgb-kodak15.png,39.4514,0.4663,0.4442,0.8853 +Kodak,6x6,ldr-rgb-kodak16.png,41.2290,0.4600,0.4405,0.8926 +Kodak,6x6,ldr-rgb-kodak17.png,39.6521,0.5310,0.5059,0.7773 +Kodak,6x6,ldr-rgb-kodak18.png,35.4328,0.6295,0.6039,0.6512 +Kodak,6x6,ldr-rgb-kodak19.png,38.6954,0.5947,0.5698,0.6902 +Kodak,6x6,ldr-rgb-kodak20.png,40.0953,0.3685,0.3494,1.1254 +Kodak,6x6,ldr-rgb-kodak21.png,37.3344,0.5848,0.5645,0.6966 +Kodak,6x6,ldr-rgb-kodak22.png,37.6231,0.6351,0.6120,0.6426 +Kodak,6x6,ldr-rgb-kodak23.png,41.4033,0.5453,0.5245,0.7497 +Kodak,6x6,ldr-rgb-kodak24.png,35.1417,0.5210,0.4982,0.7893 +Kodak,8x8,ldr-rgb-kodak01.png,31.9071,0.6763,0.6498,0.6051 +Kodak,8x8,ldr-rgb-kodak02.png,36.1354,0.5901,0.5632,0.6982 +Kodak,8x8,ldr-rgb-kodak03.png,38.1744,0.3113,0.2871,1.3698 +Kodak,8x8,ldr-rgb-kodak04.png,36.3637,0.5037,0.4740,0.8295 +Kodak,8x8,ldr-rgb-kodak05.png,30.9009,0.6860,0.6595,0.5963 +Kodak,8x8,ldr-rgb-kodak06.png,33.5749,0.5544,0.5288,0.7436 +Kodak,8x8,ldr-rgb-kodak07.png,36.4888,0.3805,0.3506,1.1214 +Kodak,8x8,ldr-rgb-kodak08.png,30.7484,0.7355,0.7047,0.5580 +Kodak,8x8,ldr-rgb-kodak09.png,37.5499,0.3555,0.3274,1.2010 +Kodak,8x8,ldr-rgb-kodak10.png,37.2288,0.3953,0.3659,1.0748 +Kodak,8x8,ldr-rgb-kodak11.png,33.8276,0.6013,0.5759,0.6828 +Kodak,8x8,ldr-rgb-kodak12.png,38.2490,0.3712,0.3465,1.1350 +Kodak,8x8,ldr-rgb-kodak13.png,28.4502,0.7471,0.7205,0.5458 +Kodak,8x8,ldr-rgb-kodak14.png,32.3258,0.6828,0.6571,0.5984 +Kodak,8x8,ldr-rgb-kodak15.png,36.0605,0.4675,0.4400,0.8938 +Kodak,8x8,ldr-rgb-kodak16.png,37.2636,0.4405,0.4154,0.9466 +Kodak,8x8,ldr-rgb-kodak17.png,35.8722,0.4248,0.3955,0.9941 +Kodak,8x8,ldr-rgb-kodak18.png,31.6495,0.6972,0.6661,0.5903 +Kodak,8x8,ldr-rgb-kodak19.png,34.9142,0.4758,0.4457,0.8823 +Kodak,8x8,ldr-rgb-kodak20.png,36.1470,0.3640,0.3400,1.1564 +Kodak,8x8,ldr-rgb-kodak21.png,33.2221,0.4870,0.4617,0.8517 +Kodak,8x8,ldr-rgb-kodak22.png,34.2197,0.6164,0.5883,0.6684 +Kodak,8x8,ldr-rgb-kodak23.png,38.1768,0.3478,0.3221,1.2209 +Kodak,8x8,ldr-rgb-kodak24.png,31.2175,0.5629,0.5346,0.7356 +Kodak,12x12,ldr-rgb-kodak01.png,27.9058,0.7718,0.7362,0.5341 +Kodak,12x12,ldr-rgb-kodak02.png,32.9642,0.5152,0.4778,0.8230 +Kodak,12x12,ldr-rgb-kodak03.png,34.4219,0.3155,0.2822,1.3935 +Kodak,12x12,ldr-rgb-kodak04.png,32.9599,0.4600,0.4208,0.9345 +Kodak,12x12,ldr-rgb-kodak05.png,26.5927,0.8084,0.7720,0.5093 +Kodak,12x12,ldr-rgb-kodak06.png,29.5304,0.5796,0.5441,0.7227 +Kodak,12x12,ldr-rgb-kodak07.png,32.6109,0.3845,0.3464,1.1352 +Kodak,12x12,ldr-rgb-kodak08.png,26.2744,0.8005,0.7603,0.5172 +Kodak,12x12,ldr-rgb-kodak09.png,33.6251,0.3488,0.3109,1.2647 +Kodak,12x12,ldr-rgb-kodak10.png,32.9833,0.3465,0.3076,1.2784 +Kodak,12x12,ldr-rgb-kodak11.png,30.0468,0.5686,0.5340,0.7364 +Kodak,12x12,ldr-rgb-kodak12.png,34.4395,0.3089,0.2746,1.4321 +Kodak,12x12,ldr-rgb-kodak13.png,24.5820,0.9118,0.8757,0.4491 +Kodak,12x12,ldr-rgb-kodak14.png,28.6287,0.7280,0.6922,0.5681 +Kodak,12x12,ldr-rgb-kodak15.png,32.7197,0.4445,0.4069,0.9663 +Kodak,12x12,ldr-rgb-kodak16.png,33.3355,0.4265,0.3920,1.0031 +Kodak,12x12,ldr-rgb-kodak17.png,32.1409,0.3887,0.3499,1.1237 +Kodak,12x12,ldr-rgb-kodak18.png,27.9217,0.6959,0.6559,0.5995 +Kodak,12x12,ldr-rgb-kodak19.png,31.1006,0.5518,0.5125,0.7672 +Kodak,12x12,ldr-rgb-kodak20.png,32.1470,0.4064,0.3727,1.0550 +Kodak,12x12,ldr-rgb-kodak21.png,29.3170,0.5272,0.4916,0.7998 +Kodak,12x12,ldr-rgb-kodak22.png,30.7805,0.5966,0.5587,0.7037 +Kodak,12x12,ldr-rgb-kodak23.png,34.3635,0.2927,0.2568,1.5311 +Kodak,12x12,ldr-rgb-kodak24.png,27.2253,0.6296,0.5920,0.6642 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-avx2_fast_results.csv new file mode 100644 index 0000000..da76adb --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-avx2_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.8489,0.0319,0.0186,21.0977 +Kodak,4x4,ldr-rgb-kodak02.png,44.2380,0.0398,0.0257,15.2871 +Kodak,4x4,ldr-rgb-kodak03.png,46.6338,0.0279,0.0154,25.4638 +Kodak,4x4,ldr-rgb-kodak04.png,44.5665,0.0375,0.0228,17.2705 +Kodak,4x4,ldr-rgb-kodak05.png,41.5682,0.0480,0.0334,11.7899 +Kodak,4x4,ldr-rgb-kodak06.png,44.7452,0.0316,0.0182,21.5613 +Kodak,4x4,ldr-rgb-kodak07.png,45.0418,0.0342,0.0202,19.4836 +Kodak,4x4,ldr-rgb-kodak08.png,42.0821,0.0502,0.0347,11.3377 +Kodak,4x4,ldr-rgb-kodak09.png,46.2551,0.0282,0.0144,27.4001 +Kodak,4x4,ldr-rgb-kodak10.png,46.0288,0.0294,0.0150,26.1639 +Kodak,4x4,ldr-rgb-kodak11.png,44.2450,0.0350,0.0216,18.1675 +Kodak,4x4,ldr-rgb-kodak12.png,47.0135,0.0268,0.0140,28.0149 +Kodak,4x4,ldr-rgb-kodak13.png,41.4309,0.0441,0.0297,13.2552 +Kodak,4x4,ldr-rgb-kodak14.png,41.8066,0.0414,0.0276,14.2464 +Kodak,4x4,ldr-rgb-kodak15.png,44.5942,0.0388,0.0244,16.0923 +Kodak,4x4,ldr-rgb-kodak16.png,47.1801,0.0249,0.0121,32.5781 +Kodak,4x4,ldr-rgb-kodak17.png,45.7548,0.0280,0.0136,28.8344 +Kodak,4x4,ldr-rgb-kodak18.png,41.6128,0.0484,0.0335,11.7543 +Kodak,4x4,ldr-rgb-kodak19.png,44.8023,0.0327,0.0179,21.9697 +Kodak,4x4,ldr-rgb-kodak20.png,46.3894,0.0284,0.0160,24.6145 +Kodak,4x4,ldr-rgb-kodak21.png,44.5781,0.0319,0.0188,20.9670 +Kodak,4x4,ldr-rgb-kodak22.png,43.1599,0.0427,0.0280,14.0303 +Kodak,4x4,ldr-rgb-kodak23.png,45.5706,0.0320,0.0183,21.4402 +Kodak,4x4,ldr-rgb-kodak24.png,41.8541,0.0421,0.0276,14.2253 +Kodak,5x5,ldr-rgb-kodak01.png,39.6107,0.0315,0.0170,23.1006 +Kodak,5x5,ldr-rgb-kodak02.png,40.6312,0.0319,0.0167,23.4798 +Kodak,5x5,ldr-rgb-kodak03.png,43.0303,0.0260,0.0123,31.9743 +Kodak,5x5,ldr-rgb-kodak04.png,41.2378,0.0315,0.0161,24.3614 +Kodak,5x5,ldr-rgb-kodak05.png,37.4134,0.0438,0.0287,13.7233 +Kodak,5x5,ldr-rgb-kodak06.png,40.5758,0.0287,0.0147,26.7365 +Kodak,5x5,ldr-rgb-kodak07.png,41.4746,0.0298,0.0147,26.6859 +Kodak,5x5,ldr-rgb-kodak08.png,37.7544,0.0457,0.0296,13.2924 +Kodak,5x5,ldr-rgb-kodak09.png,42.9020,0.0261,0.0108,36.3107 +Kodak,5x5,ldr-rgb-kodak10.png,42.6178,0.0267,0.0114,34.5375 +Kodak,5x5,ldr-rgb-kodak11.png,40.2886,0.0306,0.0164,23.9430 +Kodak,5x5,ldr-rgb-kodak12.png,43.4048,0.0240,0.0102,38.5433 +Kodak,5x5,ldr-rgb-kodak13.png,36.8044,0.0415,0.0260,15.1312 +Kodak,5x5,ldr-rgb-kodak14.png,37.9374,0.0398,0.0252,15.5743 +Kodak,5x5,ldr-rgb-kodak15.png,41.1606,0.0314,0.0163,24.1058 +Kodak,5x5,ldr-rgb-kodak16.png,43.4729,0.0231,0.0094,42.0099 +Kodak,5x5,ldr-rgb-kodak17.png,42.0129,0.0262,0.0101,39.0479 +Kodak,5x5,ldr-rgb-kodak18.png,38.0842,0.0389,0.0229,17.1972 +Kodak,5x5,ldr-rgb-kodak19.png,41.1186,0.0283,0.0125,31.4650 +Kodak,5x5,ldr-rgb-kodak20.png,42.3441,0.0257,0.0121,32.4998 +Kodak,5x5,ldr-rgb-kodak21.png,40.4026,0.0299,0.0155,25.3114 +Kodak,5x5,ldr-rgb-kodak22.png,39.7574,0.0337,0.0182,21.6539 +Kodak,5x5,ldr-rgb-kodak23.png,42.4861,0.0272,0.0124,31.7289 +Kodak,5x5,ldr-rgb-kodak24.png,37.7908,0.0369,0.0213,18.4589 +Kodak,6x6,ldr-rgb-kodak01.png,35.7518,0.0384,0.0234,16.8047 +Kodak,6x6,ldr-rgb-kodak02.png,38.1633,0.0323,0.0169,23.2658 +Kodak,6x6,ldr-rgb-kodak03.png,40.5311,0.0252,0.0111,35.3359 +Kodak,6x6,ldr-rgb-kodak04.png,38.5310,0.0314,0.0157,25.1145 +Kodak,6x6,ldr-rgb-kodak05.png,34.3245,0.0495,0.0337,11.6785 +Kodak,6x6,ldr-rgb-kodak06.png,37.2781,0.0313,0.0169,23.2839 +Kodak,6x6,ldr-rgb-kodak07.png,38.8424,0.0310,0.0153,25.6348 +Kodak,6x6,ldr-rgb-kodak08.png,34.4294,0.0509,0.0343,11.4657 +Kodak,6x6,ldr-rgb-kodak09.png,39.9541,0.0274,0.0117,33.4965 +Kodak,6x6,ldr-rgb-kodak10.png,39.7141,0.0276,0.0117,33.6228 +Kodak,6x6,ldr-rgb-kodak11.png,37.1267,0.0329,0.0183,21.5424 +Kodak,6x6,ldr-rgb-kodak12.png,40.7229,0.0242,0.0102,38.6453 +Kodak,6x6,ldr-rgb-kodak13.png,32.7806,0.0528,0.0366,10.7292 +Kodak,6x6,ldr-rgb-kodak14.png,35.2395,0.0437,0.0283,13.8910 +Kodak,6x6,ldr-rgb-kodak15.png,38.5238,0.0319,0.0162,24.2233 +Kodak,6x6,ldr-rgb-kodak16.png,40.4988,0.0239,0.0099,39.8798 +Kodak,6x6,ldr-rgb-kodak17.png,38.9257,0.0278,0.0120,32.9051 +Kodak,6x6,ldr-rgb-kodak18.png,35.0966,0.0415,0.0249,15.8171 +Kodak,6x6,ldr-rgb-kodak19.png,37.9638,0.0322,0.0161,24.4949 +Kodak,6x6,ldr-rgb-kodak20.png,39.1665,0.0273,0.0132,29.7171 +Kodak,6x6,ldr-rgb-kodak21.png,36.8836,0.0336,0.0188,20.8736 +Kodak,6x6,ldr-rgb-kodak22.png,36.9688,0.0353,0.0193,20.3729 +Kodak,6x6,ldr-rgb-kodak23.png,40.0317,0.0271,0.0121,32.5511 +Kodak,6x6,ldr-rgb-kodak24.png,34.7652,0.0391,0.0233,16.8704 +Kodak,8x8,ldr-rgb-kodak01.png,31.3202,0.0512,0.0319,12.3161 +Kodak,8x8,ldr-rgb-kodak02.png,34.8887,0.0366,0.0172,22.9052 +Kodak,8x8,ldr-rgb-kodak03.png,36.5578,0.0310,0.0128,30.6555 +Kodak,8x8,ldr-rgb-kodak04.png,35.1631,0.0357,0.0159,24.7259 +Kodak,8x8,ldr-rgb-kodak05.png,30.2292,0.0640,0.0441,8.9221 +Kodak,8x8,ldr-rgb-kodak06.png,32.8877,0.0419,0.0228,17.2168 +Kodak,8x8,ldr-rgb-kodak07.png,34.9572,0.0371,0.0175,22.5196 +Kodak,8x8,ldr-rgb-kodak08.png,29.9725,0.0687,0.0474,8.2997 +Kodak,8x8,ldr-rgb-kodak09.png,36.0644,0.0334,0.0137,28.7629 +Kodak,8x8,ldr-rgb-kodak10.png,35.8570,0.0330,0.0130,30.1594 +Kodak,8x8,ldr-rgb-kodak11.png,32.9725,0.0416,0.0229,17.1665 +Kodak,8x8,ldr-rgb-kodak12.png,36.6491,0.0300,0.0122,32.2810 +Kodak,8x8,ldr-rgb-kodak13.png,28.2120,0.0741,0.0538,7.3138 +Kodak,8x8,ldr-rgb-kodak14.png,31.4918,0.0539,0.0344,11.4142 +Kodak,8x8,ldr-rgb-kodak15.png,34.9071,0.0374,0.0175,22.4451 +Kodak,8x8,ldr-rgb-kodak16.png,36.0183,0.0318,0.0138,28.5479 +Kodak,8x8,ldr-rgb-kodak17.png,34.8539,0.0350,0.0151,26.0820 +Kodak,8x8,ldr-rgb-kodak18.png,31.2432,0.0508,0.0303,12.9912 +Kodak,8x8,ldr-rgb-kodak19.png,34.0762,0.0389,0.0190,20.7119 +Kodak,8x8,ldr-rgb-kodak20.png,35.2082,0.0336,0.0155,25.3620 +Kodak,8x8,ldr-rgb-kodak21.png,32.7363,0.0422,0.0236,16.6498 +Kodak,8x8,ldr-rgb-kodak22.png,33.4378,0.0408,0.0209,18.7728 +Kodak,8x8,ldr-rgb-kodak23.png,36.4996,0.0308,0.0117,33.7087 +Kodak,8x8,ldr-rgb-kodak24.png,30.8091,0.0499,0.0300,13.0971 +Kodak,12x12,ldr-rgb-kodak01.png,27.1016,0.0494,0.0237,16.5606 +Kodak,12x12,ldr-rgb-kodak02.png,31.0998,0.0355,0.0094,42.0367 +Kodak,12x12,ldr-rgb-kodak03.png,32.6801,0.0329,0.0080,48.8947 +Kodak,12x12,ldr-rgb-kodak04.png,31.5605,0.0349,0.0081,48.2891 +Kodak,12x12,ldr-rgb-kodak05.png,25.8047,0.0552,0.0287,13.7080 +Kodak,12x12,ldr-rgb-kodak06.png,28.6329,0.0431,0.0179,21.9882 +Kodak,12x12,ldr-rgb-kodak07.png,30.8575,0.0362,0.0098,40.0055 +Kodak,12x12,ldr-rgb-kodak08.png,25.3873,0.0615,0.0342,11.5137 +Kodak,12x12,ldr-rgb-kodak09.png,31.8330,0.0356,0.0088,44.6629 +Kodak,12x12,ldr-rgb-kodak10.png,31.5260,0.0364,0.0096,41.0879 +Kodak,12x12,ldr-rgb-kodak11.png,28.9305,0.0396,0.0141,27.9253 +Kodak,12x12,ldr-rgb-kodak12.png,32.2648,0.0331,0.0082,47.6791 +Kodak,12x12,ldr-rgb-kodak13.png,24.3206,0.0669,0.0403,9.7459 +Kodak,12x12,ldr-rgb-kodak14.png,27.5298,0.0455,0.0195,20.1649 +Kodak,12x12,ldr-rgb-kodak15.png,31.2436,0.0368,0.0107,36.7320 +Kodak,12x12,ldr-rgb-kodak16.png,31.4839,0.0340,0.0091,43.0641 +Kodak,12x12,ldr-rgb-kodak17.png,30.8893,0.0375,0.0107,36.6871 +Kodak,12x12,ldr-rgb-kodak18.png,27.4177,0.0465,0.0193,20.4087 +Kodak,12x12,ldr-rgb-kodak19.png,30.1727,0.0400,0.0132,29.8278 +Kodak,12x12,ldr-rgb-kodak20.png,31.0405,0.0355,0.0108,36.4189 +Kodak,12x12,ldr-rgb-kodak21.png,28.7169,0.0423,0.0168,23.3363 +Kodak,12x12,ldr-rgb-kodak22.png,29.8277,0.0377,0.0110,35.6760 +Kodak,12x12,ldr-rgb-kodak23.png,32.5185,0.0340,0.0082,48.0360 +Kodak,12x12,ldr-rgb-kodak24.png,26.7652,0.0496,0.0229,17.1874 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-avx2_fastest_results.csv new file mode 100644 index 0000000..bdb0ef5 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-avx2_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.5072,0.0267,0.0136,28.8475 +Kodak,4x4,ldr-rgb-kodak02.png,43.8025,0.0311,0.0178,22.0747 +Kodak,4x4,ldr-rgb-kodak03.png,46.0406,0.0236,0.0114,34.5715 +Kodak,4x4,ldr-rgb-kodak04.png,44.1430,0.0302,0.0164,23.9939 +Kodak,4x4,ldr-rgb-kodak05.png,40.9879,0.0350,0.0214,18.3368 +Kodak,4x4,ldr-rgb-kodak06.png,44.4296,0.0268,0.0141,27.8800 +Kodak,4x4,ldr-rgb-kodak07.png,44.6051,0.0279,0.0144,27.2291 +Kodak,4x4,ldr-rgb-kodak08.png,41.5000,0.0365,0.0217,18.0956 +Kodak,4x4,ldr-rgb-kodak09.png,45.9005,0.0248,0.0112,35.1874 +Kodak,4x4,ldr-rgb-kodak10.png,45.6663,0.0254,0.0117,33.5626 +Kodak,4x4,ldr-rgb-kodak11.png,43.8292,0.0283,0.0158,24.9424 +Kodak,4x4,ldr-rgb-kodak12.png,46.4729,0.0231,0.0109,35.9239 +Kodak,4x4,ldr-rgb-kodak13.png,41.1509,0.0354,0.0213,18.4496 +Kodak,4x4,ldr-rgb-kodak14.png,41.0931,0.0305,0.0176,22.3748 +Kodak,4x4,ldr-rgb-kodak15.png,44.1027,0.0302,0.0166,23.6393 +Kodak,4x4,ldr-rgb-kodak16.png,47.0422,0.0226,0.0107,36.9112 +Kodak,4x4,ldr-rgb-kodak17.png,45.4973,0.0252,0.0113,34.6477 +Kodak,4x4,ldr-rgb-kodak18.png,41.2449,0.0366,0.0219,17.9418 +Kodak,4x4,ldr-rgb-kodak19.png,44.5301,0.0279,0.0136,28.8687 +Kodak,4x4,ldr-rgb-kodak20.png,45.8602,0.0238,0.0117,33.5537 +Kodak,4x4,ldr-rgb-kodak21.png,44.2614,0.0266,0.0142,27.7067 +Kodak,4x4,ldr-rgb-kodak22.png,42.7742,0.0329,0.0190,20.6737 +Kodak,4x4,ldr-rgb-kodak23.png,45.2565,0.0264,0.0134,29.3313 +Kodak,4x4,ldr-rgb-kodak24.png,41.2205,0.0324,0.0184,21.3846 +Kodak,5x5,ldr-rgb-kodak01.png,39.3652,0.0280,0.0142,27.6816 +Kodak,5x5,ldr-rgb-kodak02.png,40.3764,0.0274,0.0134,29.4407 +Kodak,5x5,ldr-rgb-kodak03.png,42.6004,0.0221,0.0093,42.4325 +Kodak,5x5,ldr-rgb-kodak04.png,40.7713,0.0273,0.0126,31.1877 +Kodak,5x5,ldr-rgb-kodak05.png,36.9823,0.0348,0.0204,19.3170 +Kodak,5x5,ldr-rgb-kodak06.png,40.4008,0.0255,0.0123,31.9873 +Kodak,5x5,ldr-rgb-kodak07.png,41.1154,0.0260,0.0119,32.9682 +Kodak,5x5,ldr-rgb-kodak08.png,37.3666,0.0364,0.0212,18.5779 +Kodak,5x5,ldr-rgb-kodak09.png,42.5422,0.0233,0.0092,42.7271 +Kodak,5x5,ldr-rgb-kodak10.png,42.3455,0.0241,0.0095,41.2039 +Kodak,5x5,ldr-rgb-kodak11.png,40.0401,0.0261,0.0128,30.7201 +Kodak,5x5,ldr-rgb-kodak12.png,43.1448,0.0213,0.0086,45.4895 +Kodak,5x5,ldr-rgb-kodak13.png,36.6876,0.0353,0.0209,18.8096 +Kodak,5x5,ldr-rgb-kodak14.png,37.3962,0.0304,0.0166,23.6193 +Kodak,5x5,ldr-rgb-kodak15.png,40.8535,0.0267,0.0126,31.3245 +Kodak,5x5,ldr-rgb-kodak16.png,43.3795,0.0213,0.0086,45.8295 +Kodak,5x5,ldr-rgb-kodak17.png,41.8560,0.0238,0.0093,42.2131 +Kodak,5x5,ldr-rgb-kodak18.png,37.9129,0.0326,0.0174,22.6026 +Kodak,5x5,ldr-rgb-kodak19.png,40.8503,0.0261,0.0114,34.6412 +Kodak,5x5,ldr-rgb-kodak20.png,42.0160,0.0224,0.0100,39.5110 +Kodak,5x5,ldr-rgb-kodak21.png,40.1806,0.0259,0.0127,30.8574 +Kodak,5x5,ldr-rgb-kodak22.png,39.4506,0.0285,0.0141,27.9215 +Kodak,5x5,ldr-rgb-kodak23.png,42.1119,0.0241,0.0103,38.1025 +Kodak,5x5,ldr-rgb-kodak24.png,37.5516,0.0300,0.0157,25.0470 +Kodak,6x6,ldr-rgb-kodak01.png,35.6562,0.0310,0.0173,22.7859 +Kodak,6x6,ldr-rgb-kodak02.png,38.0339,0.0266,0.0122,32.1150 +Kodak,6x6,ldr-rgb-kodak03.png,40.3032,0.0217,0.0087,45.3482 +Kodak,6x6,ldr-rgb-kodak04.png,38.2918,0.0264,0.0116,33.9887 +Kodak,6x6,ldr-rgb-kodak05.png,34.0896,0.0361,0.0213,18.4686 +Kodak,6x6,ldr-rgb-kodak06.png,37.2222,0.0262,0.0127,30.9623 +Kodak,6x6,ldr-rgb-kodak07.png,38.6336,0.0255,0.0111,35.3548 +Kodak,6x6,ldr-rgb-kodak08.png,34.2253,0.0378,0.0221,17.8249 +Kodak,6x6,ldr-rgb-kodak09.png,39.7573,0.0234,0.0089,43.9687 +Kodak,6x6,ldr-rgb-kodak10.png,39.5662,0.0239,0.0092,42.8949 +Kodak,6x6,ldr-rgb-kodak11.png,36.9968,0.0267,0.0130,30.2030 +Kodak,6x6,ldr-rgb-kodak12.png,40.5658,0.0212,0.0082,47.7039 +Kodak,6x6,ldr-rgb-kodak13.png,32.7154,0.0397,0.0250,15.7532 +Kodak,6x6,ldr-rgb-kodak14.png,34.8624,0.0310,0.0171,23.0232 +Kodak,6x6,ldr-rgb-kodak15.png,38.3699,0.0261,0.0118,33.3232 +Kodak,6x6,ldr-rgb-kodak16.png,40.4581,0.0213,0.0084,46.7731 +Kodak,6x6,ldr-rgb-kodak17.png,38.8420,0.0242,0.0095,41.2049 +Kodak,6x6,ldr-rgb-kodak18.png,35.0034,0.0329,0.0176,22.3772 +Kodak,6x6,ldr-rgb-kodak19.png,37.8298,0.0272,0.0123,31.9687 +Kodak,6x6,ldr-rgb-kodak20.png,39.0123,0.0228,0.0101,38.9052 +Kodak,6x6,ldr-rgb-kodak21.png,36.8075,0.0272,0.0137,28.8006 +Kodak,6x6,ldr-rgb-kodak22.png,36.8498,0.0285,0.0137,28.6311 +Kodak,6x6,ldr-rgb-kodak23.png,39.8307,0.0233,0.0093,42.1538 +Kodak,6x6,ldr-rgb-kodak24.png,34.6916,0.0311,0.0164,24.0383 +Kodak,8x8,ldr-rgb-kodak01.png,31.1808,0.0411,0.0239,16.4415 +Kodak,8x8,ldr-rgb-kodak02.png,34.7814,0.0308,0.0131,30.0254 +Kodak,8x8,ldr-rgb-kodak03.png,36.4381,0.0264,0.0099,39.8076 +Kodak,8x8,ldr-rgb-kodak04.png,35.0562,0.0304,0.0123,32.0420 +Kodak,8x8,ldr-rgb-kodak05.png,30.0281,0.0477,0.0296,13.2861 +Kodak,8x8,ldr-rgb-kodak06.png,32.7989,0.0341,0.0174,22.6284 +Kodak,8x8,ldr-rgb-kodak07.png,34.8353,0.0314,0.0135,29.1529 +Kodak,8x8,ldr-rgb-kodak08.png,29.7076,0.0502,0.0313,12.5813 +Kodak,8x8,ldr-rgb-kodak09.png,35.8909,0.0287,0.0109,36.0354 +Kodak,8x8,ldr-rgb-kodak10.png,35.7101,0.0287,0.0106,37.0256 +Kodak,8x8,ldr-rgb-kodak11.png,32.8554,0.0338,0.0169,23.2370 +Kodak,8x8,ldr-rgb-kodak12.png,36.5111,0.0262,0.0098,39.9367 +Kodak,8x8,ldr-rgb-kodak13.png,28.1363,0.0546,0.0364,10.7987 +Kodak,8x8,ldr-rgb-kodak14.png,31.2698,0.0405,0.0231,17.0231 +Kodak,8x8,ldr-rgb-kodak15.png,34.7637,0.0308,0.0130,30.2707 +Kodak,8x8,ldr-rgb-kodak16.png,35.9616,0.0274,0.0112,35.1746 +Kodak,8x8,ldr-rgb-kodak17.png,34.7164,0.0297,0.0116,33.7819 +Kodak,8x8,ldr-rgb-kodak18.png,31.1666,0.0407,0.0219,17.9567 +Kodak,8x8,ldr-rgb-kodak19.png,33.8904,0.0330,0.0146,26.9163 +Kodak,8x8,ldr-rgb-kodak20.png,35.0294,0.0281,0.0119,33.0349 +Kodak,8x8,ldr-rgb-kodak21.png,32.6198,0.0342,0.0174,22.6377 +Kodak,8x8,ldr-rgb-kodak22.png,33.3292,0.0339,0.0156,25.2340 +Kodak,8x8,ldr-rgb-kodak23.png,36.3894,0.0268,0.0094,41.6366 +Kodak,8x8,ldr-rgb-kodak24.png,30.7285,0.0396,0.0215,18.3256 +Kodak,12x12,ldr-rgb-kodak01.png,26.9944,0.0398,0.0183,21.4849 +Kodak,12x12,ldr-rgb-kodak02.png,31.0354,0.0299,0.0077,51.0799 +Kodak,12x12,ldr-rgb-kodak03.png,32.6215,0.0277,0.0070,56.1816 +Kodak,12x12,ldr-rgb-kodak04.png,31.4774,0.0294,0.0070,55.9093 +Kodak,12x12,ldr-rgb-kodak05.png,25.6943,0.0434,0.0210,18.7236 +Kodak,12x12,ldr-rgb-kodak06.png,28.4895,0.0349,0.0138,28.4567 +Kodak,12x12,ldr-rgb-kodak07.png,30.8016,0.0305,0.0083,47.3234 +Kodak,12x12,ldr-rgb-kodak08.png,25.2157,0.0481,0.0249,15.8102 +Kodak,12x12,ldr-rgb-kodak09.png,31.6339,0.0295,0.0077,51.3742 +Kodak,12x12,ldr-rgb-kodak10.png,31.4566,0.0301,0.0078,50.7046 +Kodak,12x12,ldr-rgb-kodak11.png,28.8572,0.0323,0.0111,35.5499 +Kodak,12x12,ldr-rgb-kodak12.png,32.1857,0.0277,0.0071,55.3130 +Kodak,12x12,ldr-rgb-kodak13.png,24.2396,0.0505,0.0283,13.9019 +Kodak,12x12,ldr-rgb-kodak14.png,27.4380,0.0363,0.0148,26.6208 +Kodak,12x12,ldr-rgb-kodak15.png,31.1533,0.0311,0.0090,43.6950 +Kodak,12x12,ldr-rgb-kodak16.png,31.3620,0.0282,0.0076,51.7726 +Kodak,12x12,ldr-rgb-kodak17.png,30.8364,0.0310,0.0085,46.2887 +Kodak,12x12,ldr-rgb-kodak18.png,27.3672,0.0377,0.0146,26.8645 +Kodak,12x12,ldr-rgb-kodak19.png,29.8648,0.0334,0.0107,36.8420 +Kodak,12x12,ldr-rgb-kodak20.png,30.9381,0.0296,0.0089,44.0227 +Kodak,12x12,ldr-rgb-kodak21.png,28.6166,0.0343,0.0131,29.9894 +Kodak,12x12,ldr-rgb-kodak22.png,29.7425,0.0315,0.0092,42.8949 +Kodak,12x12,ldr-rgb-kodak23.png,32.4842,0.0287,0.0070,55.8544 +Kodak,12x12,ldr-rgb-kodak24.png,26.6937,0.0393,0.0169,23.2327 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-avx2_medium_results.csv new file mode 100644 index 0000000..834c833 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-avx2_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.2910,0.1128,0.0984,3.9965 +Kodak,4x4,ldr-rgb-kodak02.png,45.3498,0.1538,0.1388,2.8335 +Kodak,4x4,ldr-rgb-kodak03.png,47.6132,0.0824,0.0686,5.7346 +Kodak,4x4,ldr-rgb-kodak04.png,45.4289,0.1219,0.1064,3.6945 +Kodak,4x4,ldr-rgb-kodak05.png,42.1296,0.1419,0.1266,3.1055 +Kodak,4x4,ldr-rgb-kodak06.png,45.1555,0.1065,0.0924,4.2545 +Kodak,4x4,ldr-rgb-kodak07.png,45.9743,0.1026,0.0873,4.5045 +Kodak,4x4,ldr-rgb-kodak08.png,42.5130,0.1568,0.1404,2.8012 +Kodak,4x4,ldr-rgb-kodak09.png,47.1615,0.1215,0.1061,3.7048 +Kodak,4x4,ldr-rgb-kodak10.png,46.8286,0.1239,0.1084,3.6262 +Kodak,4x4,ldr-rgb-kodak11.png,44.8665,0.1226,0.1084,3.6262 +Kodak,4x4,ldr-rgb-kodak12.png,47.9301,0.0942,0.0804,4.8933 +Kodak,4x4,ldr-rgb-kodak13.png,41.6152,0.1216,0.1060,3.7079 +Kodak,4x4,ldr-rgb-kodak14.png,42.6269,0.1310,0.1161,3.3864 +Kodak,4x4,ldr-rgb-kodak15.png,45.4386,0.1086,0.0933,4.2141 +Kodak,4x4,ldr-rgb-kodak16.png,47.8564,0.0940,0.0805,4.8864 +Kodak,4x4,ldr-rgb-kodak17.png,46.2901,0.1064,0.0908,4.3314 +Kodak,4x4,ldr-rgb-kodak18.png,41.9927,0.1581,0.1419,2.7712 +Kodak,4x4,ldr-rgb-kodak19.png,45.3391,0.1276,0.1117,3.5195 +Kodak,4x4,ldr-rgb-kodak20.png,46.8869,0.0802,0.0666,5.9017 +Kodak,4x4,ldr-rgb-kodak21.png,45.1510,0.1294,0.1149,3.4224 +Kodak,4x4,ldr-rgb-kodak22.png,43.7745,0.1594,0.1439,2.7319 +Kodak,4x4,ldr-rgb-kodak23.png,46.8184,0.1241,0.1094,3.5936 +Kodak,4x4,ldr-rgb-kodak24.png,42.2960,0.1266,0.1110,3.5437 +Kodak,5x5,ldr-rgb-kodak01.png,40.1121,0.1268,0.1106,3.5546 +Kodak,5x5,ldr-rgb-kodak02.png,41.6954,0.1362,0.1193,3.2967 +Kodak,5x5,ldr-rgb-kodak03.png,44.0360,0.0663,0.0510,7.7065 +Kodak,5x5,ldr-rgb-kodak04.png,42.0561,0.1061,0.0889,4.4225 +Kodak,5x5,ldr-rgb-kodak05.png,37.9816,0.1482,0.1310,3.0022 +Kodak,5x5,ldr-rgb-kodak06.png,40.9586,0.1021,0.0862,4.5612 +Kodak,5x5,ldr-rgb-kodak07.png,42.4607,0.0870,0.0701,5.6095 +Kodak,5x5,ldr-rgb-kodak08.png,38.3486,0.1590,0.1411,2.7877 +Kodak,5x5,ldr-rgb-kodak09.png,43.8038,0.0757,0.0587,6.7024 +Kodak,5x5,ldr-rgb-kodak10.png,43.4092,0.0847,0.0674,5.8307 +Kodak,5x5,ldr-rgb-kodak11.png,40.8377,0.1163,0.1004,3.9151 +Kodak,5x5,ldr-rgb-kodak12.png,44.3922,0.0664,0.0508,7.7430 +Kodak,5x5,ldr-rgb-kodak13.png,36.9084,0.1342,0.1171,3.3578 +Kodak,5x5,ldr-rgb-kodak14.png,38.6484,0.1318,0.1155,3.4050 +Kodak,5x5,ldr-rgb-kodak15.png,41.8912,0.0998,0.0830,4.7394 +Kodak,5x5,ldr-rgb-kodak16.png,44.1367,0.0729,0.0576,6.8281 +Kodak,5x5,ldr-rgb-kodak17.png,42.5213,0.0757,0.0583,6.7441 +Kodak,5x5,ldr-rgb-kodak18.png,38.3608,0.1427,0.1248,3.1515 +Kodak,5x5,ldr-rgb-kodak19.png,41.6469,0.0979,0.0806,4.8764 +Kodak,5x5,ldr-rgb-kodak20.png,42.9685,0.0723,0.0569,6.9113 +Kodak,5x5,ldr-rgb-kodak21.png,40.7620,0.1018,0.0856,4.5913 +Kodak,5x5,ldr-rgb-kodak22.png,40.2773,0.1371,0.1200,3.2780 +Kodak,5x5,ldr-rgb-kodak23.png,43.5489,0.0883,0.0718,5.4766 +Kodak,5x5,ldr-rgb-kodak24.png,38.1152,0.1176,0.1003,3.9192 +Kodak,6x6,ldr-rgb-kodak01.png,36.1961,0.1276,0.1111,3.5393 +Kodak,6x6,ldr-rgb-kodak02.png,39.0094,0.1044,0.0872,4.5086 +Kodak,6x6,ldr-rgb-kodak03.png,41.3262,0.0551,0.0393,9.9948 +Kodak,6x6,ldr-rgb-kodak04.png,39.3983,0.0888,0.0709,5.5425 +Kodak,6x6,ldr-rgb-kodak05.png,34.7867,0.1408,0.1233,3.1892 +Kodak,6x6,ldr-rgb-kodak06.png,37.6289,0.0888,0.0726,5.4157 +Kodak,6x6,ldr-rgb-kodak07.png,39.7726,0.0731,0.0559,7.0356 +Kodak,6x6,ldr-rgb-kodak08.png,34.9978,0.1545,0.1357,2.8971 +Kodak,6x6,ldr-rgb-kodak09.png,40.8821,0.0582,0.0410,9.5897 +Kodak,6x6,ldr-rgb-kodak10.png,40.5029,0.0613,0.0438,8.9765 +Kodak,6x6,ldr-rgb-kodak11.png,37.5798,0.0960,0.0794,4.9511 +Kodak,6x6,ldr-rgb-kodak12.png,41.4837,0.0518,0.0361,10.8909 +Kodak,6x6,ldr-rgb-kodak13.png,32.8829,0.1464,0.1286,3.0568 +Kodak,6x6,ldr-rgb-kodak14.png,35.8236,0.1190,0.1020,3.8533 +Kodak,6x6,ldr-rgb-kodak15.png,39.1952,0.0905,0.0731,5.3824 +Kodak,6x6,ldr-rgb-kodak16.png,41.0408,0.0589,0.0430,9.1405 +Kodak,6x6,ldr-rgb-kodak17.png,39.4928,0.0621,0.0445,8.8425 +Kodak,6x6,ldr-rgb-kodak18.png,35.3481,0.1229,0.1046,3.7589 +Kodak,6x6,ldr-rgb-kodak19.png,38.5316,0.0873,0.0695,5.6557 +Kodak,6x6,ldr-rgb-kodak20.png,39.7651,0.0652,0.0493,7.9784 +Kodak,6x6,ldr-rgb-kodak21.png,37.1927,0.0874,0.0710,5.5346 +Kodak,6x6,ldr-rgb-kodak22.png,37.4532,0.1129,0.0952,4.1287 +Kodak,6x6,ldr-rgb-kodak23.png,40.9705,0.0632,0.0464,8.4665 +Kodak,6x6,ldr-rgb-kodak24.png,35.0426,0.1035,0.0857,4.5905 +Kodak,8x8,ldr-rgb-kodak01.png,31.8012,0.1703,0.1499,2.6240 +Kodak,8x8,ldr-rgb-kodak02.png,35.7606,0.1018,0.0809,4.8594 +Kodak,8x8,ldr-rgb-kodak03.png,37.7459,0.0674,0.0477,8.2486 +Kodak,8x8,ldr-rgb-kodak04.png,36.0605,0.0974,0.0759,5.1815 +Kodak,8x8,ldr-rgb-kodak05.png,30.7414,0.1766,0.1555,2.5283 +Kodak,8x8,ldr-rgb-kodak06.png,33.4352,0.1115,0.0918,4.2840 +Kodak,8x8,ldr-rgb-kodak07.png,36.1304,0.0857,0.0644,6.1031 +Kodak,8x8,ldr-rgb-kodak08.png,30.5703,0.1771,0.1550,2.5363 +Kodak,8x8,ldr-rgb-kodak09.png,37.2639,0.0675,0.0462,8.5200 +Kodak,8x8,ldr-rgb-kodak10.png,36.9159,0.0691,0.0475,8.2850 +Kodak,8x8,ldr-rgb-kodak11.png,33.6573,0.1107,0.0900,4.3667 +Kodak,8x8,ldr-rgb-kodak12.png,37.8259,0.0637,0.0439,8.9577 +Kodak,8x8,ldr-rgb-kodak13.png,28.3931,0.1963,0.1752,2.2448 +Kodak,8x8,ldr-rgb-kodak14.png,32.1339,0.1425,0.1222,3.2165 +Kodak,8x8,ldr-rgb-kodak15.png,35.8359,0.0920,0.0708,5.5568 +Kodak,8x8,ldr-rgb-kodak16.png,37.0213,0.0732,0.0535,7.3446 +Kodak,8x8,ldr-rgb-kodak17.png,35.6807,0.0758,0.0544,7.2277 +Kodak,8x8,ldr-rgb-kodak18.png,31.5529,0.1410,0.1192,3.2992 +Kodak,8x8,ldr-rgb-kodak19.png,34.7649,0.1025,0.0809,4.8617 +Kodak,8x8,ldr-rgb-kodak20.png,35.8951,0.0799,0.0605,6.4986 +Kodak,8x8,ldr-rgb-kodak21.png,33.1150,0.1095,0.0894,4.3968 +Kodak,8x8,ldr-rgb-kodak22.png,34.0285,0.1197,0.0982,4.0048 +Kodak,8x8,ldr-rgb-kodak23.png,37.6470,0.0645,0.0439,8.9583 +Kodak,8x8,ldr-rgb-kodak24.png,31.1140,0.1240,0.1026,3.8311 +Kodak,12x12,ldr-rgb-kodak01.png,27.7578,0.1863,0.1576,2.4944 +Kodak,12x12,ldr-rgb-kodak02.png,32.4621,0.0782,0.0488,8.0585 +Kodak,12x12,ldr-rgb-kodak03.png,33.7766,0.0653,0.0374,10.5198 +Kodak,12x12,ldr-rgb-kodak04.png,32.4443,0.0735,0.0436,9.0092 +Kodak,12x12,ldr-rgb-kodak05.png,26.3981,0.1996,0.1699,2.3148 +Kodak,12x12,ldr-rgb-kodak06.png,29.3737,0.1213,0.0929,4.2317 +Kodak,12x12,ldr-rgb-kodak07.png,32.0414,0.0874,0.0580,6.7789 +Kodak,12x12,ldr-rgb-kodak08.png,26.0612,0.1998,0.1692,2.3246 +Kodak,12x12,ldr-rgb-kodak09.png,33.0989,0.0674,0.0381,10.3250 +Kodak,12x12,ldr-rgb-kodak10.png,32.4879,0.0686,0.0388,10.1462 +Kodak,12x12,ldr-rgb-kodak11.png,29.7447,0.1096,0.0810,4.8534 +Kodak,12x12,ldr-rgb-kodak12.png,33.8819,0.0623,0.0343,11.4567 +Kodak,12x12,ldr-rgb-kodak13.png,24.5286,0.2268,0.1971,1.9947 +Kodak,12x12,ldr-rgb-kodak14.png,28.4212,0.1460,0.1171,3.3571 +Kodak,12x12,ldr-rgb-kodak15.png,32.2342,0.0846,0.0552,7.1193 +Kodak,12x12,ldr-rgb-kodak16.png,32.9807,0.0680,0.0402,9.7737 +Kodak,12x12,ldr-rgb-kodak17.png,31.7807,0.0739,0.0440,8.9452 +Kodak,12x12,ldr-rgb-kodak18.png,27.7794,0.1425,0.1121,3.5071 +Kodak,12x12,ldr-rgb-kodak19.png,30.8869,0.0930,0.0632,6.2241 +Kodak,12x12,ldr-rgb-kodak20.png,31.8552,0.0755,0.0475,8.2849 +Kodak,12x12,ldr-rgb-kodak21.png,29.1775,0.1292,0.1008,3.9025 +Kodak,12x12,ldr-rgb-kodak22.png,30.5009,0.1031,0.0733,5.3637 +Kodak,12x12,ldr-rgb-kodak23.png,33.5464,0.0601,0.0312,12.6007 +Kodak,12x12,ldr-rgb-kodak24.png,27.1012,0.1288,0.0990,3.9723 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-avx2_thorough_results.csv new file mode 100644 index 0000000..462393b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-avx2_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.4944,0.2957,0.2814,1.3972 +Kodak,4x4,ldr-rgb-kodak02.png,45.6493,0.3511,0.3355,1.1720 +Kodak,4x4,ldr-rgb-kodak03.png,47.9884,0.3014,0.2877,1.3668 +Kodak,4x4,ldr-rgb-kodak04.png,45.6562,0.3284,0.3125,1.2583 +Kodak,4x4,ldr-rgb-kodak05.png,42.4063,0.3288,0.3133,1.2549 +Kodak,4x4,ldr-rgb-kodak06.png,45.3572,0.2934,0.2792,1.4086 +Kodak,4x4,ldr-rgb-kodak07.png,46.3420,0.3264,0.3111,1.2640 +Kodak,4x4,ldr-rgb-kodak08.png,42.8054,0.3526,0.3362,1.1695 +Kodak,4x4,ldr-rgb-kodak09.png,47.4208,0.3339,0.3185,1.2347 +Kodak,4x4,ldr-rgb-kodak10.png,47.0603,0.3308,0.3153,1.2470 +Kodak,4x4,ldr-rgb-kodak11.png,45.1118,0.3098,0.2953,1.3316 +Kodak,4x4,ldr-rgb-kodak12.png,48.2457,0.3077,0.2939,1.3378 +Kodak,4x4,ldr-rgb-kodak13.png,41.7174,0.2996,0.2841,1.3843 +Kodak,4x4,ldr-rgb-kodak14.png,42.9405,0.3205,0.3058,1.2859 +Kodak,4x4,ldr-rgb-kodak15.png,45.7858,0.3170,0.3012,1.3056 +Kodak,4x4,ldr-rgb-kodak16.png,48.0651,0.3057,0.2920,1.3466 +Kodak,4x4,ldr-rgb-kodak17.png,46.4609,0.3188,0.3028,1.2987 +Kodak,4x4,ldr-rgb-kodak18.png,42.1541,0.3467,0.3305,1.1899 +Kodak,4x4,ldr-rgb-kodak19.png,45.5439,0.3322,0.3162,1.2436 +Kodak,4x4,ldr-rgb-kodak20.png,47.1284,0.2116,0.1980,1.9860 +Kodak,4x4,ldr-rgb-kodak21.png,45.3018,0.3251,0.3107,1.2654 +Kodak,4x4,ldr-rgb-kodak22.png,43.9797,0.3551,0.3394,1.1586 +Kodak,4x4,ldr-rgb-kodak23.png,47.1532,0.3455,0.3306,1.1895 +Kodak,4x4,ldr-rgb-kodak24.png,42.5029,0.3222,0.3067,1.2822 +Kodak,5x5,ldr-rgb-kodak01.png,40.2326,0.3562,0.3401,1.1562 +Kodak,5x5,ldr-rgb-kodak02.png,41.9976,0.4156,0.3988,0.9861 +Kodak,5x5,ldr-rgb-kodak03.png,44.3238,0.3407,0.3251,1.2094 +Kodak,5x5,ldr-rgb-kodak04.png,42.2393,0.3723,0.3547,1.1087 +Kodak,5x5,ldr-rgb-kodak05.png,38.1756,0.3894,0.3721,1.0569 +Kodak,5x5,ldr-rgb-kodak06.png,41.0844,0.3383,0.3222,1.2202 +Kodak,5x5,ldr-rgb-kodak07.png,42.7250,0.3708,0.3538,1.1113 +Kodak,5x5,ldr-rgb-kodak08.png,38.5334,0.3971,0.3793,1.0366 +Kodak,5x5,ldr-rgb-kodak09.png,44.0288,0.3719,0.3546,1.1089 +Kodak,5x5,ldr-rgb-kodak10.png,43.5935,0.3782,0.3605,1.0908 +Kodak,5x5,ldr-rgb-kodak11.png,40.9987,0.3547,0.3384,1.1621 +Kodak,5x5,ldr-rgb-kodak12.png,44.5960,0.3486,0.3332,1.1800 +Kodak,5x5,ldr-rgb-kodak13.png,36.9514,0.3512,0.3335,1.1790 +Kodak,5x5,ldr-rgb-kodak14.png,38.8797,0.3732,0.3566,1.1025 +Kodak,5x5,ldr-rgb-kodak15.png,42.1246,0.3584,0.3413,1.1523 +Kodak,5x5,ldr-rgb-kodak16.png,44.2686,0.3475,0.3322,1.1835 +Kodak,5x5,ldr-rgb-kodak17.png,42.6009,0.3624,0.3452,1.1391 +Kodak,5x5,ldr-rgb-kodak18.png,38.4550,0.4014,0.3834,1.0256 +Kodak,5x5,ldr-rgb-kodak19.png,41.7718,0.3853,0.3679,1.0688 +Kodak,5x5,ldr-rgb-kodak20.png,43.2705,0.2455,0.2301,1.7091 +Kodak,5x5,ldr-rgb-kodak21.png,40.8630,0.3830,0.3671,1.0711 +Kodak,5x5,ldr-rgb-kodak22.png,40.4255,0.4137,0.3964,0.9920 +Kodak,5x5,ldr-rgb-kodak23.png,43.8840,0.4037,0.3869,1.0163 +Kodak,5x5,ldr-rgb-kodak24.png,38.2271,0.3691,0.3518,1.1178 +Kodak,6x6,ldr-rgb-kodak01.png,36.3126,0.4121,0.3948,0.9959 +Kodak,6x6,ldr-rgb-kodak02.png,39.3780,0.4719,0.4545,0.8651 +Kodak,6x6,ldr-rgb-kodak03.png,41.7330,0.2939,0.2780,1.4147 +Kodak,6x6,ldr-rgb-kodak04.png,39.6521,0.4092,0.3911,1.0053 +Kodak,6x6,ldr-rgb-kodak05.png,34.9741,0.4462,0.4286,0.9175 +Kodak,6x6,ldr-rgb-kodak06.png,37.7401,0.3694,0.3528,1.1144 +Kodak,6x6,ldr-rgb-kodak07.png,40.1032,0.3360,0.3181,1.2361 +Kodak,6x6,ldr-rgb-kodak08.png,35.1660,0.4488,0.4301,0.9143 +Kodak,6x6,ldr-rgb-kodak09.png,41.2613,0.4087,0.3909,1.0059 +Kodak,6x6,ldr-rgb-kodak10.png,40.8140,0.4175,0.3999,0.9833 +Kodak,6x6,ldr-rgb-kodak11.png,37.7541,0.3766,0.3602,1.0918 +Kodak,6x6,ldr-rgb-kodak12.png,41.8249,0.3530,0.3368,1.1674 +Kodak,6x6,ldr-rgb-kodak13.png,32.9256,0.4145,0.3965,0.9917 +Kodak,6x6,ldr-rgb-kodak14.png,36.0211,0.4308,0.4137,0.9506 +Kodak,6x6,ldr-rgb-kodak15.png,39.4513,0.3492,0.3317,1.1856 +Kodak,6x6,ldr-rgb-kodak16.png,41.2290,0.3439,0.3276,1.2003 +Kodak,6x6,ldr-rgb-kodak17.png,39.6521,0.3932,0.3754,1.0474 +Kodak,6x6,ldr-rgb-kodak18.png,35.4328,0.4681,0.4492,0.8753 +Kodak,6x6,ldr-rgb-kodak19.png,38.6954,0.4439,0.4257,0.9237 +Kodak,6x6,ldr-rgb-kodak20.png,40.0953,0.2748,0.2590,1.5184 +Kodak,6x6,ldr-rgb-kodak21.png,37.3344,0.4376,0.4209,0.9341 +Kodak,6x6,ldr-rgb-kodak22.png,37.6231,0.4756,0.4577,0.8590 +Kodak,6x6,ldr-rgb-kodak23.png,41.4033,0.4098,0.3928,1.0011 +Kodak,6x6,ldr-rgb-kodak24.png,35.1417,0.3916,0.3736,1.0526 +Kodak,8x8,ldr-rgb-kodak01.png,31.9071,0.4890,0.4669,0.8421 +Kodak,8x8,ldr-rgb-kodak02.png,36.1354,0.4308,0.4081,0.9635 +Kodak,8x8,ldr-rgb-kodak03.png,38.1744,0.2289,0.2078,1.8926 +Kodak,8x8,ldr-rgb-kodak04.png,36.3637,0.3637,0.3407,1.1542 +Kodak,8x8,ldr-rgb-kodak05.png,30.9005,0.4961,0.4732,0.8310 +Kodak,8x8,ldr-rgb-kodak06.png,33.5749,0.4005,0.3786,1.0387 +Kodak,8x8,ldr-rgb-kodak07.png,36.4888,0.2733,0.2508,1.5680 +Kodak,8x8,ldr-rgb-kodak08.png,30.7484,0.5298,0.5063,0.7767 +Kodak,8x8,ldr-rgb-kodak09.png,37.5499,0.2559,0.2334,1.6844 +Kodak,8x8,ldr-rgb-kodak10.png,37.2288,0.2864,0.2634,1.4929 +Kodak,8x8,ldr-rgb-kodak11.png,33.8276,0.4342,0.4125,0.9533 +Kodak,8x8,ldr-rgb-kodak12.png,38.2490,0.2708,0.2496,1.5751 +Kodak,8x8,ldr-rgb-kodak13.png,28.4500,0.5398,0.5168,0.7609 +Kodak,8x8,ldr-rgb-kodak14.png,32.3258,0.4983,0.4758,0.8263 +Kodak,8x8,ldr-rgb-kodak15.png,36.0605,0.3396,0.3170,1.2404 +Kodak,8x8,ldr-rgb-kodak16.png,37.2636,0.3172,0.2959,1.3288 +Kodak,8x8,ldr-rgb-kodak17.png,35.8722,0.3074,0.2846,1.3816 +Kodak,8x8,ldr-rgb-kodak18.png,31.6494,0.5033,0.4799,0.8194 +Kodak,8x8,ldr-rgb-kodak19.png,34.9142,0.3430,0.3199,1.2291 +Kodak,8x8,ldr-rgb-kodak20.png,36.1470,0.2660,0.2444,1.6088 +Kodak,8x8,ldr-rgb-kodak21.png,33.2221,0.3541,0.3326,1.1824 +Kodak,8x8,ldr-rgb-kodak22.png,34.2203,0.4477,0.4246,0.9260 +Kodak,8x8,ldr-rgb-kodak23.png,38.1785,0.2561,0.2334,1.6844 +Kodak,8x8,ldr-rgb-kodak24.png,31.2174,0.4090,0.3862,1.0181 +Kodak,12x12,ldr-rgb-kodak01.png,27.9058,0.5626,0.5302,0.7416 +Kodak,12x12,ldr-rgb-kodak02.png,32.9642,0.3788,0.3463,1.1355 +Kodak,12x12,ldr-rgb-kodak03.png,34.4219,0.2331,0.2022,1.9450 +Kodak,12x12,ldr-rgb-kodak04.png,32.9599,0.3381,0.3050,1.2892 +Kodak,12x12,ldr-rgb-kodak05.png,26.5928,0.5899,0.5573,0.7056 +Kodak,12x12,ldr-rgb-kodak06.png,29.5304,0.4236,0.3920,1.0030 +Kodak,12x12,ldr-rgb-kodak07.png,32.6108,0.2812,0.2488,1.5806 +Kodak,12x12,ldr-rgb-kodak08.png,26.2752,0.5796,0.5457,0.7206 +Kodak,12x12,ldr-rgb-kodak09.png,33.6251,0.2562,0.2237,1.7582 +Kodak,12x12,ldr-rgb-kodak10.png,32.9828,0.2508,0.2180,1.8040 +Kodak,12x12,ldr-rgb-kodak11.png,30.0467,0.4158,0.3843,1.0232 +Kodak,12x12,ldr-rgb-kodak12.png,34.4395,0.2280,0.1966,2.0006 +Kodak,12x12,ldr-rgb-kodak13.png,24.5820,0.6632,0.6305,0.6236 +Kodak,12x12,ldr-rgb-kodak14.png,28.6295,0.5328,0.5009,0.7850 +Kodak,12x12,ldr-rgb-kodak15.png,32.7197,0.3251,0.2930,1.3423 +Kodak,12x12,ldr-rgb-kodak16.png,33.3355,0.3125,0.2816,1.3966 +Kodak,12x12,ldr-rgb-kodak17.png,32.1412,0.2838,0.2511,1.5661 +Kodak,12x12,ldr-rgb-kodak18.png,27.9215,0.5098,0.4766,0.8250 +Kodak,12x12,ldr-rgb-kodak19.png,31.1014,0.4032,0.3699,1.0630 +Kodak,12x12,ldr-rgb-kodak20.png,32.1471,0.2988,0.2681,1.4667 +Kodak,12x12,ldr-rgb-kodak21.png,29.3170,0.3851,0.3534,1.1126 +Kodak,12x12,ldr-rgb-kodak22.png,30.7805,0.4373,0.4045,0.9722 +Kodak,12x12,ldr-rgb-kodak23.png,34.3635,0.2180,0.1861,2.1129 +Kodak,12x12,ldr-rgb-kodak24.png,27.2288,0.4584,0.4257,0.9238 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse2_fast_results.csv new file mode 100644 index 0000000..5c65a1d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse2_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.8489,0.0382,0.0237,16.5969 +Kodak,4x4,ldr-rgb-kodak02.png,44.2380,0.0476,0.0325,12.0889 +Kodak,4x4,ldr-rgb-kodak03.png,46.6338,0.0333,0.0197,19.9602 +Kodak,4x4,ldr-rgb-kodak04.png,44.5665,0.0449,0.0295,13.3356 +Kodak,4x4,ldr-rgb-kodak05.png,41.5682,0.0584,0.0431,9.1295 +Kodak,4x4,ldr-rgb-kodak06.png,44.7452,0.0376,0.0235,16.7135 +Kodak,4x4,ldr-rgb-kodak07.png,45.0418,0.0408,0.0258,15.2262 +Kodak,4x4,ldr-rgb-kodak08.png,42.0821,0.0607,0.0446,8.8082 +Kodak,4x4,ldr-rgb-kodak09.png,46.2551,0.0331,0.0183,21.4603 +Kodak,4x4,ldr-rgb-kodak10.png,46.0288,0.0346,0.0194,20.2782 +Kodak,4x4,ldr-rgb-kodak11.png,44.2450,0.0418,0.0279,14.0715 +Kodak,4x4,ldr-rgb-kodak12.png,47.0135,0.0316,0.0179,21.9245 +Kodak,4x4,ldr-rgb-kodak13.png,41.4309,0.0541,0.0385,10.2084 +Kodak,4x4,ldr-rgb-kodak14.png,41.8066,0.0503,0.0356,11.0460 +Kodak,4x4,ldr-rgb-kodak15.png,44.5942,0.0470,0.0319,12.3080 +Kodak,4x4,ldr-rgb-kodak16.png,47.1801,0.0298,0.0164,23.9649 +Kodak,4x4,ldr-rgb-kodak17.png,45.7548,0.0329,0.0176,22.2796 +Kodak,4x4,ldr-rgb-kodak18.png,41.6128,0.0589,0.0428,9.1800 +Kodak,4x4,ldr-rgb-kodak19.png,44.8023,0.0386,0.0231,17.0453 +Kodak,4x4,ldr-rgb-kodak20.png,46.3894,0.0335,0.0200,19.6629 +Kodak,4x4,ldr-rgb-kodak21.png,44.5781,0.0383,0.0240,16.3574 +Kodak,4x4,ldr-rgb-kodak22.png,43.1599,0.0515,0.0359,10.9675 +Kodak,4x4,ldr-rgb-kodak23.png,45.5706,0.0378,0.0232,16.9592 +Kodak,4x4,ldr-rgb-kodak24.png,41.8541,0.0511,0.0355,11.0746 +Kodak,5x5,ldr-rgb-kodak01.png,39.6107,0.0388,0.0234,16.7883 +Kodak,5x5,ldr-rgb-kodak02.png,40.6312,0.0382,0.0220,17.8858 +Kodak,5x5,ldr-rgb-kodak03.png,43.0303,0.0302,0.0155,25.3348 +Kodak,5x5,ldr-rgb-kodak04.png,41.2378,0.0375,0.0211,18.6493 +Kodak,5x5,ldr-rgb-kodak05.png,37.4134,0.0562,0.0397,9.8945 +Kodak,5x5,ldr-rgb-kodak06.png,40.5758,0.0345,0.0193,20.3307 +Kodak,5x5,ldr-rgb-kodak07.png,41.4746,0.0358,0.0199,19.7735 +Kodak,5x5,ldr-rgb-kodak08.png,37.7544,0.0581,0.0407,9.6497 +Kodak,5x5,ldr-rgb-kodak09.png,42.9020,0.0301,0.0142,27.7692 +Kodak,5x5,ldr-rgb-kodak10.png,42.6178,0.0310,0.0148,26.6553 +Kodak,5x5,ldr-rgb-kodak11.png,40.2886,0.0373,0.0222,17.7004 +Kodak,5x5,ldr-rgb-kodak12.png,43.4048,0.0278,0.0130,30.3219 +Kodak,5x5,ldr-rgb-kodak13.png,36.8044,0.0531,0.0364,10.8050 +Kodak,5x5,ldr-rgb-kodak14.png,37.9374,0.0498,0.0341,11.5397 +Kodak,5x5,ldr-rgb-kodak15.png,41.1606,0.0375,0.0214,18.4072 +Kodak,5x5,ldr-rgb-kodak16.png,43.4729,0.0264,0.0122,32.1934 +Kodak,5x5,ldr-rgb-kodak17.png,42.0129,0.0302,0.0139,28.2622 +Kodak,5x5,ldr-rgb-kodak18.png,38.0842,0.0484,0.0310,12.6729 +Kodak,5x5,ldr-rgb-kodak19.png,41.1186,0.0337,0.0174,22.6063 +Kodak,5x5,ldr-rgb-kodak20.png,42.3441,0.0302,0.0154,25.5285 +Kodak,5x5,ldr-rgb-kodak21.png,40.4026,0.0360,0.0209,18.8221 +Kodak,5x5,ldr-rgb-kodak22.png,39.7574,0.0410,0.0242,16.2419 +Kodak,5x5,ldr-rgb-kodak23.png,42.4861,0.0317,0.0162,24.2247 +Kodak,5x5,ldr-rgb-kodak24.png,37.7908,0.0454,0.0289,13.6023 +Kodak,6x6,ldr-rgb-kodak01.png,35.7518,0.0508,0.0348,11.2841 +Kodak,6x6,ldr-rgb-kodak02.png,38.1633,0.0403,0.0236,16.6964 +Kodak,6x6,ldr-rgb-kodak03.png,40.5311,0.0304,0.0156,25.1839 +Kodak,6x6,ldr-rgb-kodak04.png,38.5310,0.0390,0.0218,18.0449 +Kodak,6x6,ldr-rgb-kodak05.png,34.3245,0.0668,0.0499,7.8774 +Kodak,6x6,ldr-rgb-kodak06.png,37.2781,0.0401,0.0241,16.3221 +Kodak,6x6,ldr-rgb-kodak07.png,38.8424,0.0384,0.0218,18.0053 +Kodak,6x6,ldr-rgb-kodak08.png,34.4294,0.0690,0.0512,7.6748 +Kodak,6x6,ldr-rgb-kodak09.png,39.9541,0.0330,0.0164,23.9984 +Kodak,6x6,ldr-rgb-kodak10.png,39.7141,0.0325,0.0161,24.4173 +Kodak,6x6,ldr-rgb-kodak11.png,37.1267,0.0420,0.0263,14.9427 +Kodak,6x6,ldr-rgb-kodak12.png,40.7229,0.0291,0.0139,28.2240 +Kodak,6x6,ldr-rgb-kodak13.png,32.7806,0.0730,0.0557,7.0550 +Kodak,6x6,ldr-rgb-kodak14.png,35.2395,0.0571,0.0409,9.6101 +Kodak,6x6,ldr-rgb-kodak15.png,38.5238,0.0399,0.0233,16.8609 +Kodak,6x6,ldr-rgb-kodak16.png,40.4988,0.0287,0.0139,28.3725 +Kodak,6x6,ldr-rgb-kodak17.png,38.9257,0.0335,0.0168,23.3975 +Kodak,6x6,ldr-rgb-kodak18.png,35.0966,0.0540,0.0366,10.7480 +Kodak,6x6,ldr-rgb-kodak19.png,37.9638,0.0402,0.0228,17.2206 +Kodak,6x6,ldr-rgb-kodak20.png,39.1665,0.0337,0.0188,20.9269 +Kodak,6x6,ldr-rgb-kodak21.png,36.8836,0.0432,0.0275,14.2910 +Kodak,6x6,ldr-rgb-kodak22.png,36.9688,0.0442,0.0272,14.4369 +Kodak,6x6,ldr-rgb-kodak23.png,40.0317,0.0322,0.0163,24.1160 +Kodak,6x6,ldr-rgb-kodak24.png,34.7652,0.0517,0.0346,11.3580 +Kodak,8x8,ldr-rgb-kodak01.png,31.3202,0.0691,0.0490,8.0314 +Kodak,8x8,ldr-rgb-kodak02.png,34.8887,0.0449,0.0242,16.2701 +Kodak,8x8,ldr-rgb-kodak03.png,36.5578,0.0372,0.0180,21.8016 +Kodak,8x8,ldr-rgb-kodak04.png,35.1631,0.0436,0.0229,17.1493 +Kodak,8x8,ldr-rgb-kodak05.png,30.2292,0.0880,0.0670,5.8660 +Kodak,8x8,ldr-rgb-kodak06.png,32.8877,0.0542,0.0345,11.3936 +Kodak,8x8,ldr-rgb-kodak07.png,34.9572,0.0461,0.0255,15.4348 +Kodak,8x8,ldr-rgb-kodak08.png,29.9725,0.0949,0.0728,5.4001 +Kodak,8x8,ldr-rgb-kodak09.png,36.0644,0.0403,0.0201,19.5738 +Kodak,8x8,ldr-rgb-kodak10.png,35.8570,0.0399,0.0193,20.3550 +Kodak,8x8,ldr-rgb-kodak11.png,32.9725,0.0540,0.0338,11.6494 +Kodak,8x8,ldr-rgb-kodak12.png,36.6491,0.0365,0.0175,22.4926 +Kodak,8x8,ldr-rgb-kodak13.png,28.2120,0.1034,0.0822,4.7820 +Kodak,8x8,ldr-rgb-kodak14.png,31.4918,0.0723,0.0521,7.5524 +Kodak,8x8,ldr-rgb-kodak15.png,34.9071,0.0456,0.0251,15.6779 +Kodak,8x8,ldr-rgb-kodak16.png,36.0183,0.0388,0.0200,19.6264 +Kodak,8x8,ldr-rgb-kodak17.png,34.8539,0.0424,0.0217,18.0922 +Kodak,8x8,ldr-rgb-kodak18.png,31.2432,0.0668,0.0451,8.7160 +Kodak,8x8,ldr-rgb-kodak19.png,34.0762,0.0492,0.0278,14.1420 +Kodak,8x8,ldr-rgb-kodak20.png,35.2082,0.0411,0.0218,18.0102 +Kodak,8x8,ldr-rgb-kodak21.png,32.7363,0.0546,0.0349,11.2527 +Kodak,8x8,ldr-rgb-kodak22.png,33.4378,0.0519,0.0306,12.8602 +Kodak,8x8,ldr-rgb-kodak23.png,36.4996,0.0363,0.0166,23.7349 +Kodak,8x8,ldr-rgb-kodak24.png,30.8091,0.0656,0.0443,8.8718 +Kodak,12x12,ldr-rgb-kodak01.png,27.1016,0.0627,0.0356,11.0367 +Kodak,12x12,ldr-rgb-kodak02.png,31.0998,0.0398,0.0127,31.0819 +Kodak,12x12,ldr-rgb-kodak03.png,32.6801,0.0371,0.0114,34.3841 +Kodak,12x12,ldr-rgb-kodak04.png,31.5605,0.0387,0.0111,35.5722 +Kodak,12x12,ldr-rgb-kodak05.png,25.8047,0.0713,0.0438,8.9677 +Kodak,12x12,ldr-rgb-kodak06.png,28.6329,0.0520,0.0259,15.1669 +Kodak,12x12,ldr-rgb-kodak07.png,30.8575,0.0415,0.0142,27.6190 +Kodak,12x12,ldr-rgb-kodak08.png,25.3873,0.0805,0.0519,7.5771 +Kodak,12x12,ldr-rgb-kodak09.png,31.8330,0.0397,0.0129,30.5601 +Kodak,12x12,ldr-rgb-kodak10.png,31.5260,0.0412,0.0138,28.4298 +Kodak,12x12,ldr-rgb-kodak11.png,28.9305,0.0468,0.0204,19.2962 +Kodak,12x12,ldr-rgb-kodak12.png,32.2648,0.0370,0.0113,34.6842 +Kodak,12x12,ldr-rgb-kodak13.png,24.3206,0.0882,0.0603,6.5216 +Kodak,12x12,ldr-rgb-kodak14.png,27.5298,0.0553,0.0283,13.9024 +Kodak,12x12,ldr-rgb-kodak15.png,31.2436,0.0428,0.0156,25.2823 +Kodak,12x12,ldr-rgb-kodak16.png,31.4839,0.0388,0.0131,29.9938 +Kodak,12x12,ldr-rgb-kodak17.png,30.8893,0.0419,0.0145,27.1614 +Kodak,12x12,ldr-rgb-kodak18.png,27.4177,0.0565,0.0282,13.9221 +Kodak,12x12,ldr-rgb-kodak19.png,30.1727,0.0470,0.0194,20.2459 +Kodak,12x12,ldr-rgb-kodak20.png,31.0405,0.0412,0.0154,25.4725 +Kodak,12x12,ldr-rgb-kodak21.png,28.7169,0.0513,0.0251,15.6492 +Kodak,12x12,ldr-rgb-kodak22.png,29.8277,0.0435,0.0160,24.6115 +Kodak,12x12,ldr-rgb-kodak23.png,32.5185,0.0382,0.0115,34.0687 +Kodak,12x12,ldr-rgb-kodak24.png,26.7652,0.0611,0.0335,11.7388 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse2_fastest_results.csv new file mode 100644 index 0000000..27782f7 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse2_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.5072,0.0318,0.0184,21.4193 +Kodak,4x4,ldr-rgb-kodak02.png,43.8025,0.0372,0.0227,17.3055 +Kodak,4x4,ldr-rgb-kodak03.png,46.0406,0.0279,0.0151,26.0890 +Kodak,4x4,ldr-rgb-kodak04.png,44.1430,0.0356,0.0212,18.5848 +Kodak,4x4,ldr-rgb-kodak05.png,40.9879,0.0426,0.0279,14.0987 +Kodak,4x4,ldr-rgb-kodak06.png,44.4296,0.0316,0.0184,21.3752 +Kodak,4x4,ldr-rgb-kodak07.png,44.6051,0.0329,0.0188,20.9046 +Kodak,4x4,ldr-rgb-kodak08.png,41.5000,0.0442,0.0287,13.7134 +Kodak,4x4,ldr-rgb-kodak09.png,45.9005,0.0290,0.0148,26.4862 +Kodak,4x4,ldr-rgb-kodak10.png,45.6663,0.0299,0.0154,25.5736 +Kodak,4x4,ldr-rgb-kodak11.png,43.8292,0.0337,0.0202,19.4894 +Kodak,4x4,ldr-rgb-kodak12.png,46.4729,0.0274,0.0145,27.0345 +Kodak,4x4,ldr-rgb-kodak13.png,41.1509,0.0431,0.0285,13.7937 +Kodak,4x4,ldr-rgb-kodak14.png,41.0931,0.0364,0.0225,17.4833 +Kodak,4x4,ldr-rgb-kodak15.png,44.1027,0.0357,0.0212,18.5760 +Kodak,4x4,ldr-rgb-kodak16.png,47.0422,0.0265,0.0137,28.7164 +Kodak,4x4,ldr-rgb-kodak17.png,45.4973,0.0290,0.0145,27.0416 +Kodak,4x4,ldr-rgb-kodak18.png,41.2449,0.0441,0.0288,13.6472 +Kodak,4x4,ldr-rgb-kodak19.png,44.5301,0.0326,0.0180,21.8965 +Kodak,4x4,ldr-rgb-kodak20.png,45.8602,0.0283,0.0156,25.1643 +Kodak,4x4,ldr-rgb-kodak21.png,44.2614,0.0321,0.0185,21.2710 +Kodak,4x4,ldr-rgb-kodak22.png,42.7742,0.0393,0.0245,16.0268 +Kodak,4x4,ldr-rgb-kodak23.png,45.2565,0.0311,0.0172,22.8004 +Kodak,4x4,ldr-rgb-kodak24.png,41.2205,0.0386,0.0238,16.5342 +Kodak,5x5,ldr-rgb-kodak01.png,39.3652,0.0344,0.0197,19.9715 +Kodak,5x5,ldr-rgb-kodak02.png,40.3764,0.0326,0.0174,22.5840 +Kodak,5x5,ldr-rgb-kodak03.png,42.6004,0.0259,0.0125,31.5251 +Kodak,5x5,ldr-rgb-kodak04.png,40.7713,0.0324,0.0170,23.1414 +Kodak,5x5,ldr-rgb-kodak05.png,36.9823,0.0438,0.0285,13.8116 +Kodak,5x5,ldr-rgb-kodak06.png,40.4008,0.0305,0.0165,23.7636 +Kodak,5x5,ldr-rgb-kodak07.png,41.1154,0.0310,0.0161,24.4474 +Kodak,5x5,ldr-rgb-kodak08.png,37.3666,0.0458,0.0298,13.2106 +Kodak,5x5,ldr-rgb-kodak09.png,42.5422,0.0268,0.0119,32.9083 +Kodak,5x5,ldr-rgb-kodak10.png,42.3455,0.0276,0.0125,31.3841 +Kodak,5x5,ldr-rgb-kodak11.png,40.0401,0.0313,0.0173,22.6744 +Kodak,5x5,ldr-rgb-kodak12.png,43.1448,0.0250,0.0115,34.2798 +Kodak,5x5,ldr-rgb-kodak13.png,36.6876,0.0447,0.0292,13.4593 +Kodak,5x5,ldr-rgb-kodak14.png,37.3962,0.0373,0.0225,17.4818 +Kodak,5x5,ldr-rgb-kodak15.png,40.8535,0.0318,0.0169,23.2164 +Kodak,5x5,ldr-rgb-kodak16.png,43.3795,0.0247,0.0112,35.0706 +Kodak,5x5,ldr-rgb-kodak17.png,41.8560,0.0275,0.0123,32.0029 +Kodak,5x5,ldr-rgb-kodak18.png,37.9129,0.0400,0.0241,16.3134 +Kodak,5x5,ldr-rgb-kodak19.png,40.8503,0.0308,0.0154,25.5352 +Kodak,5x5,ldr-rgb-kodak20.png,42.0160,0.0264,0.0131,29.9181 +Kodak,5x5,ldr-rgb-kodak21.png,40.1806,0.0312,0.0172,22.9039 +Kodak,5x5,ldr-rgb-kodak22.png,39.4506,0.0344,0.0191,20.6282 +Kodak,5x5,ldr-rgb-kodak23.png,42.1119,0.0284,0.0139,28.3399 +Kodak,5x5,ldr-rgb-kodak24.png,37.5516,0.0371,0.0218,18.0218 +Kodak,6x6,ldr-rgb-kodak01.png,35.6562,0.0401,0.0251,15.6834 +Kodak,6x6,ldr-rgb-kodak02.png,38.0339,0.0322,0.0170,23.1155 +Kodak,6x6,ldr-rgb-kodak03.png,40.3032,0.0256,0.0120,32.8526 +Kodak,6x6,ldr-rgb-kodak04.png,38.2918,0.0320,0.0164,24.0397 +Kodak,6x6,ldr-rgb-kodak05.png,34.0896,0.0469,0.0313,12.5616 +Kodak,6x6,ldr-rgb-kodak06.png,37.2222,0.0325,0.0182,21.6505 +Kodak,6x6,ldr-rgb-kodak07.png,38.6336,0.0309,0.0158,24.9420 +Kodak,6x6,ldr-rgb-kodak08.png,34.2253,0.0490,0.0325,12.1027 +Kodak,6x6,ldr-rgb-kodak09.png,39.7573,0.0279,0.0128,30.8136 +Kodak,6x6,ldr-rgb-kodak10.png,39.5662,0.0281,0.0126,31.1018 +Kodak,6x6,ldr-rgb-kodak11.png,36.9968,0.0330,0.0187,20.9996 +Kodak,6x6,ldr-rgb-kodak12.png,40.5658,0.0251,0.0110,35.5983 +Kodak,6x6,ldr-rgb-kodak13.png,32.7154,0.0526,0.0368,10.6751 +Kodak,6x6,ldr-rgb-kodak14.png,34.8624,0.0392,0.0242,16.2809 +Kodak,6x6,ldr-rgb-kodak15.png,38.3699,0.0319,0.0167,23.6068 +Kodak,6x6,ldr-rgb-kodak16.png,40.4581,0.0253,0.0116,33.9649 +Kodak,6x6,ldr-rgb-kodak17.png,38.8420,0.0287,0.0131,30.1038 +Kodak,6x6,ldr-rgb-kodak18.png,35.0034,0.0415,0.0250,15.7280 +Kodak,6x6,ldr-rgb-kodak19.png,37.8298,0.0332,0.0176,22.3939 +Kodak,6x6,ldr-rgb-kodak20.png,39.0123,0.0278,0.0142,27.7183 +Kodak,6x6,ldr-rgb-kodak21.png,36.8075,0.0339,0.0196,20.1103 +Kodak,6x6,ldr-rgb-kodak22.png,36.8498,0.0351,0.0193,20.3277 +Kodak,6x6,ldr-rgb-kodak23.png,39.8307,0.0275,0.0128,30.7992 +Kodak,6x6,ldr-rgb-kodak24.png,34.6916,0.0392,0.0232,16.9659 +Kodak,8x8,ldr-rgb-kodak01.png,31.1808,0.0535,0.0350,11.2408 +Kodak,8x8,ldr-rgb-kodak02.png,34.7814,0.0369,0.0182,21.6397 +Kodak,8x8,ldr-rgb-kodak03.png,36.4381,0.0313,0.0140,28.1714 +Kodak,8x8,ldr-rgb-kodak04.png,35.0562,0.0365,0.0175,22.4158 +Kodak,8x8,ldr-rgb-kodak05.png,30.0281,0.0628,0.0436,9.0218 +Kodak,8x8,ldr-rgb-kodak06.png,32.7989,0.0433,0.0252,15.6305 +Kodak,8x8,ldr-rgb-kodak07.png,34.8353,0.0382,0.0194,20.3014 +Kodak,8x8,ldr-rgb-kodak08.png,29.7076,0.0665,0.0462,8.5069 +Kodak,8x8,ldr-rgb-kodak09.png,35.8909,0.0340,0.0156,25.2858 +Kodak,8x8,ldr-rgb-kodak10.png,35.7101,0.0337,0.0148,26.5651 +Kodak,8x8,ldr-rgb-kodak11.png,32.8554,0.0421,0.0242,16.2238 +Kodak,8x8,ldr-rgb-kodak12.png,36.5111,0.0311,0.0138,28.4897 +Kodak,8x8,ldr-rgb-kodak13.png,28.1363,0.0737,0.0543,7.2357 +Kodak,8x8,ldr-rgb-kodak14.png,31.2698,0.0522,0.0337,11.6723 +Kodak,8x8,ldr-rgb-kodak15.png,34.7637,0.0372,0.0185,21.2114 +Kodak,8x8,ldr-rgb-kodak16.png,35.9616,0.0331,0.0159,24.6546 +Kodak,8x8,ldr-rgb-kodak17.png,34.7164,0.0355,0.0164,23.9402 +Kodak,8x8,ldr-rgb-kodak18.png,31.1666,0.0515,0.0316,12.4321 +Kodak,8x8,ldr-rgb-kodak19.png,33.8904,0.0400,0.0210,18.7308 +Kodak,8x8,ldr-rgb-kodak20.png,35.0294,0.0339,0.0167,23.5701 +Kodak,8x8,ldr-rgb-kodak21.png,32.6198,0.0435,0.0257,15.3128 +Kodak,8x8,ldr-rgb-kodak22.png,33.3292,0.0417,0.0224,17.5301 +Kodak,8x8,ldr-rgb-kodak23.png,36.3894,0.0317,0.0134,29.2356 +Kodak,8x8,ldr-rgb-kodak24.png,30.7285,0.0500,0.0307,12.8204 +Kodak,12x12,ldr-rgb-kodak01.png,26.9944,0.0496,0.0268,14.6493 +Kodak,12x12,ldr-rgb-kodak02.png,31.0354,0.0337,0.0107,36.7656 +Kodak,12x12,ldr-rgb-kodak03.png,32.6215,0.0312,0.0096,40.8578 +Kodak,12x12,ldr-rgb-kodak04.png,31.4774,0.0327,0.0095,41.5569 +Kodak,12x12,ldr-rgb-kodak05.png,25.6943,0.0551,0.0317,12.4070 +Kodak,12x12,ldr-rgb-kodak06.png,28.4895,0.0419,0.0203,19.3844 +Kodak,12x12,ldr-rgb-kodak07.png,30.8016,0.0347,0.0119,32.9880 +Kodak,12x12,ldr-rgb-kodak08.png,25.2157,0.0620,0.0377,10.4420 +Kodak,12x12,ldr-rgb-kodak09.png,31.6339,0.0335,0.0107,36.8354 +Kodak,12x12,ldr-rgb-kodak10.png,31.4566,0.0341,0.0111,35.5461 +Kodak,12x12,ldr-rgb-kodak11.png,28.8572,0.0382,0.0161,24.4217 +Kodak,12x12,ldr-rgb-kodak12.png,32.1857,0.0314,0.0098,40.2270 +Kodak,12x12,ldr-rgb-kodak13.png,24.2396,0.0660,0.0423,9.2976 +Kodak,12x12,ldr-rgb-kodak14.png,27.4380,0.0439,0.0213,18.4385 +Kodak,12x12,ldr-rgb-kodak15.png,31.1533,0.0358,0.0130,30.2053 +Kodak,12x12,ldr-rgb-kodak16.png,31.3620,0.0326,0.0112,35.0557 +Kodak,12x12,ldr-rgb-kodak17.png,30.8364,0.0349,0.0118,33.4483 +Kodak,12x12,ldr-rgb-kodak18.png,27.3672,0.0450,0.0212,18.5820 +Kodak,12x12,ldr-rgb-kodak19.png,29.8648,0.0391,0.0156,25.2757 +Kodak,12x12,ldr-rgb-kodak20.png,30.9381,0.0338,0.0126,31.2326 +Kodak,12x12,ldr-rgb-kodak21.png,28.6166,0.0412,0.0194,20.2854 +Kodak,12x12,ldr-rgb-kodak22.png,29.7425,0.0364,0.0129,30.4579 +Kodak,12x12,ldr-rgb-kodak23.png,32.4842,0.0322,0.0099,39.6869 +Kodak,12x12,ldr-rgb-kodak24.png,26.6937,0.0476,0.0243,16.1671 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse2_medium_results.csv new file mode 100644 index 0000000..3a62227 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse2_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.2910,0.1519,0.1366,2.8777 +Kodak,4x4,ldr-rgb-kodak02.png,45.3498,0.2092,0.1932,2.0352 +Kodak,4x4,ldr-rgb-kodak03.png,47.6132,0.1095,0.0951,4.1336 +Kodak,4x4,ldr-rgb-kodak04.png,45.4289,0.1633,0.1469,2.6767 +Kodak,4x4,ldr-rgb-kodak05.png,42.1296,0.1903,0.1739,2.2607 +Kodak,4x4,ldr-rgb-kodak06.png,45.1555,0.1436,0.1285,3.0603 +Kodak,4x4,ldr-rgb-kodak07.png,45.9743,0.1365,0.1204,3.2650 +Kodak,4x4,ldr-rgb-kodak08.png,42.5130,0.2106,0.1934,2.0337 +Kodak,4x4,ldr-rgb-kodak09.png,47.1615,0.1633,0.1473,2.6694 +Kodak,4x4,ldr-rgb-kodak10.png,46.8286,0.1664,0.1501,2.6192 +Kodak,4x4,ldr-rgb-kodak11.png,44.8665,0.1641,0.1489,2.6401 +Kodak,4x4,ldr-rgb-kodak12.png,47.9301,0.1244,0.1099,3.5773 +Kodak,4x4,ldr-rgb-kodak13.png,41.6152,0.1631,0.1469,2.6766 +Kodak,4x4,ldr-rgb-kodak14.png,42.6269,0.1756,0.1601,2.4556 +Kodak,4x4,ldr-rgb-kodak15.png,45.4386,0.1449,0.1291,3.0449 +Kodak,4x4,ldr-rgb-kodak16.png,47.8564,0.1273,0.1127,3.4900 +Kodak,4x4,ldr-rgb-kodak17.png,46.2901,0.1428,0.1263,3.1127 +Kodak,4x4,ldr-rgb-kodak18.png,41.9927,0.2119,0.1947,2.0194 +Kodak,4x4,ldr-rgb-kodak19.png,45.3391,0.1712,0.1548,2.5397 +Kodak,4x4,ldr-rgb-kodak20.png,46.8869,0.1073,0.0929,4.2326 +Kodak,4x4,ldr-rgb-kodak21.png,45.1510,0.1738,0.1587,2.4783 +Kodak,4x4,ldr-rgb-kodak22.png,43.7745,0.2162,0.1992,1.9741 +Kodak,4x4,ldr-rgb-kodak23.png,46.8184,0.1671,0.1514,2.5967 +Kodak,4x4,ldr-rgb-kodak24.png,42.2960,0.1683,0.1520,2.5864 +Kodak,5x5,ldr-rgb-kodak01.png,40.1121,0.1839,0.1666,2.3599 +Kodak,5x5,ldr-rgb-kodak02.png,41.6954,0.1935,0.1762,2.2322 +Kodak,5x5,ldr-rgb-kodak03.png,44.0360,0.0902,0.0739,5.3199 +Kodak,5x5,ldr-rgb-kodak04.png,42.0561,0.1492,0.1313,2.9939 +Kodak,5x5,ldr-rgb-kodak05.png,37.9816,0.2134,0.1955,2.0116 +Kodak,5x5,ldr-rgb-kodak06.png,40.9586,0.1453,0.1285,3.0596 +Kodak,5x5,ldr-rgb-kodak07.png,42.4607,0.1210,0.1031,3.8143 +Kodak,5x5,ldr-rgb-kodak08.png,38.3486,0.2297,0.2109,1.8648 +Kodak,5x5,ldr-rgb-kodak09.png,43.8038,0.1050,0.0873,4.5047 +Kodak,5x5,ldr-rgb-kodak10.png,43.4092,0.1188,0.1009,3.8957 +Kodak,5x5,ldr-rgb-kodak11.png,40.8377,0.1668,0.1500,2.6216 +Kodak,5x5,ldr-rgb-kodak12.png,44.3922,0.0917,0.0754,5.2123 +Kodak,5x5,ldr-rgb-kodak13.png,36.9084,0.1942,0.1764,2.2295 +Kodak,5x5,ldr-rgb-kodak14.png,38.6484,0.1890,0.1720,2.2862 +Kodak,5x5,ldr-rgb-kodak15.png,41.8912,0.1410,0.1233,3.1880 +Kodak,5x5,ldr-rgb-kodak16.png,44.1367,0.1039,0.0876,4.4887 +Kodak,5x5,ldr-rgb-kodak17.png,42.5213,0.1051,0.0873,4.5056 +Kodak,5x5,ldr-rgb-kodak18.png,38.3608,0.2056,0.1868,2.1054 +Kodak,5x5,ldr-rgb-kodak19.png,41.6469,0.1384,0.1204,3.2654 +Kodak,5x5,ldr-rgb-kodak20.png,42.9685,0.0999,0.0837,4.6985 +Kodak,5x5,ldr-rgb-kodak21.png,40.7620,0.1427,0.1259,3.1222 +Kodak,5x5,ldr-rgb-kodak22.png,40.2773,0.1970,0.1788,2.1991 +Kodak,5x5,ldr-rgb-kodak23.png,43.5489,0.1230,0.1057,3.7185 +Kodak,5x5,ldr-rgb-kodak24.png,38.1152,0.1677,0.1494,2.6327 +Kodak,6x6,ldr-rgb-kodak01.png,36.1961,0.1902,0.1729,2.2742 +Kodak,6x6,ldr-rgb-kodak02.png,39.0094,0.1504,0.1325,2.9686 +Kodak,6x6,ldr-rgb-kodak03.png,41.3262,0.0755,0.0589,6.6734 +Kodak,6x6,ldr-rgb-kodak04.png,39.3983,0.1255,0.1071,3.6703 +Kodak,6x6,ldr-rgb-kodak05.png,34.7867,0.2076,0.1895,2.0750 +Kodak,6x6,ldr-rgb-kodak06.png,37.6289,0.1291,0.1119,3.5148 +Kodak,6x6,ldr-rgb-kodak07.png,39.7726,0.1032,0.0851,4.6216 +Kodak,6x6,ldr-rgb-kodak08.png,34.9978,0.2276,0.2082,1.8885 +Kodak,6x6,ldr-rgb-kodak09.png,40.8821,0.0804,0.0623,6.3085 +Kodak,6x6,ldr-rgb-kodak10.png,40.5029,0.0854,0.0669,5.8735 +Kodak,6x6,ldr-rgb-kodak11.png,37.5798,0.1390,0.1216,3.2346 +Kodak,6x6,ldr-rgb-kodak12.png,41.4837,0.0713,0.0547,7.1825 +Kodak,6x6,ldr-rgb-kodak13.png,32.8829,0.2154,0.1971,1.9945 +Kodak,6x6,ldr-rgb-kodak14.png,35.8236,0.1732,0.1558,2.5245 +Kodak,6x6,ldr-rgb-kodak15.png,39.1952,0.1276,0.1097,3.5840 +Kodak,6x6,ldr-rgb-kodak16.png,41.0408,0.0835,0.0670,5.8713 +Kodak,6x6,ldr-rgb-kodak17.png,39.4928,0.0862,0.0677,5.8051 +Kodak,6x6,ldr-rgb-kodak18.png,35.3481,0.1802,0.1608,2.4446 +Kodak,6x6,ldr-rgb-kodak19.png,38.5316,0.1251,0.1065,3.6931 +Kodak,6x6,ldr-rgb-kodak20.png,39.7651,0.0921,0.0752,5.2286 +Kodak,6x6,ldr-rgb-kodak21.png,37.1927,0.1262,0.1085,3.6236 +Kodak,6x6,ldr-rgb-kodak22.png,37.4532,0.1632,0.1447,2.7173 +Kodak,6x6,ldr-rgb-kodak23.png,40.9705,0.0872,0.0695,5.6545 +Kodak,6x6,ldr-rgb-kodak24.png,35.0426,0.1503,0.1320,2.9800 +Kodak,8x8,ldr-rgb-kodak01.png,31.8012,0.2596,0.2380,1.6519 +Kodak,8x8,ldr-rgb-kodak02.png,35.7606,0.1472,0.1254,3.1346 +Kodak,8x8,ldr-rgb-kodak03.png,37.7459,0.0931,0.0725,5.4249 +Kodak,8x8,ldr-rgb-kodak04.png,36.0605,0.1404,0.1185,3.3195 +Kodak,8x8,ldr-rgb-kodak05.png,30.7414,0.2680,0.2460,1.5985 +Kodak,8x8,ldr-rgb-kodak06.png,33.4352,0.1645,0.1434,2.7419 +Kodak,8x8,ldr-rgb-kodak07.png,36.1304,0.1226,0.1007,3.9035 +Kodak,8x8,ldr-rgb-kodak08.png,30.5703,0.2693,0.2462,1.5971 +Kodak,8x8,ldr-rgb-kodak09.png,37.2639,0.0929,0.0713,5.5185 +Kodak,8x8,ldr-rgb-kodak10.png,36.9159,0.0949,0.0730,5.3836 +Kodak,8x8,ldr-rgb-kodak11.png,33.6573,0.1625,0.1415,2.7793 +Kodak,8x8,ldr-rgb-kodak12.png,37.8259,0.0883,0.0678,5.7993 +Kodak,8x8,ldr-rgb-kodak13.png,28.3931,0.3025,0.2802,1.4033 +Kodak,8x8,ldr-rgb-kodak14.png,32.1339,0.2144,0.1925,2.0423 +Kodak,8x8,ldr-rgb-kodak15.png,35.8359,0.1313,0.1095,3.5895 +Kodak,8x8,ldr-rgb-kodak16.png,37.0213,0.1043,0.0839,4.6856 +Kodak,8x8,ldr-rgb-kodak17.png,35.6807,0.1069,0.0848,4.6388 +Kodak,8x8,ldr-rgb-kodak18.png,31.5529,0.2108,0.1879,2.0924 +Kodak,8x8,ldr-rgb-kodak19.png,34.7649,0.1504,0.1279,3.0736 +Kodak,8x8,ldr-rgb-kodak20.png,35.8951,0.1151,0.0946,4.1575 +Kodak,8x8,ldr-rgb-kodak21.png,33.1150,0.1616,0.1405,2.7986 +Kodak,8x8,ldr-rgb-kodak22.png,34.0285,0.1767,0.1545,2.5443 +Kodak,8x8,ldr-rgb-kodak23.png,37.6470,0.0886,0.0670,5.8664 +Kodak,8x8,ldr-rgb-kodak24.png,31.1140,0.1830,0.1610,2.4425 +Kodak,12x12,ldr-rgb-kodak01.png,27.7578,0.2764,0.2458,1.6000 +Kodak,12x12,ldr-rgb-kodak02.png,32.4621,0.1066,0.0763,5.1517 +Kodak,12x12,ldr-rgb-kodak03.png,33.7766,0.0863,0.0576,6.8325 +Kodak,12x12,ldr-rgb-kodak04.png,32.4443,0.0979,0.0675,5.8269 +Kodak,12x12,ldr-rgb-kodak05.png,26.3981,0.2946,0.2642,1.4881 +Kodak,12x12,ldr-rgb-kodak06.png,29.3737,0.1750,0.1456,2.6998 +Kodak,12x12,ldr-rgb-kodak07.png,32.0414,0.1205,0.0903,4.3561 +Kodak,12x12,ldr-rgb-kodak08.png,26.0612,0.2932,0.2617,1.5023 +Kodak,12x12,ldr-rgb-kodak09.png,33.0989,0.0899,0.0592,6.6425 +Kodak,12x12,ldr-rgb-kodak10.png,32.4879,0.0906,0.0600,6.5586 +Kodak,12x12,ldr-rgb-kodak11.png,29.7447,0.1548,0.1254,3.1359 +Kodak,12x12,ldr-rgb-kodak12.png,33.8819,0.0817,0.0529,7.4350 +Kodak,12x12,ldr-rgb-kodak13.png,24.5286,0.3388,0.3080,1.2766 +Kodak,12x12,ldr-rgb-kodak14.png,28.4212,0.2094,0.1798,2.1875 +Kodak,12x12,ldr-rgb-kodak15.png,32.2342,0.1155,0.0854,4.6030 +Kodak,12x12,ldr-rgb-kodak16.png,32.9807,0.0920,0.0631,6.2353 +Kodak,12x12,ldr-rgb-kodak17.png,31.7807,0.0988,0.0683,5.7610 +Kodak,12x12,ldr-rgb-kodak18.png,27.7794,0.2062,0.1743,2.2555 +Kodak,12x12,ldr-rgb-kodak19.png,30.8869,0.1296,0.0987,3.9844 +Kodak,12x12,ldr-rgb-kodak20.png,31.8552,0.1018,0.0733,5.3644 +Kodak,12x12,ldr-rgb-kodak21.png,29.1775,0.1869,0.1576,2.4954 +Kodak,12x12,ldr-rgb-kodak22.png,30.5009,0.1436,0.1127,3.4876 +Kodak,12x12,ldr-rgb-kodak23.png,33.5464,0.0770,0.0473,8.3157 +Kodak,12x12,ldr-rgb-kodak24.png,27.1012,0.1865,0.1558,2.5239 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse2_thorough_results.csv new file mode 100644 index 0000000..198dcdd --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse2_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.4944,0.3938,0.3786,1.0387 +Kodak,4x4,ldr-rgb-kodak02.png,45.6493,0.4691,0.4531,0.8679 +Kodak,4x4,ldr-rgb-kodak03.png,47.9884,0.4071,0.3927,1.0014 +Kodak,4x4,ldr-rgb-kodak04.png,45.6562,0.4408,0.4243,0.9268 +Kodak,4x4,ldr-rgb-kodak05.png,42.4063,0.4384,0.4223,0.9312 +Kodak,4x4,ldr-rgb-kodak06.png,45.3572,0.3930,0.3779,1.0404 +Kodak,4x4,ldr-rgb-kodak07.png,46.3420,0.4392,0.4234,0.9288 +Kodak,4x4,ldr-rgb-kodak08.png,42.8054,0.4658,0.4486,0.8766 +Kodak,4x4,ldr-rgb-kodak09.png,47.4208,0.4477,0.4316,0.9111 +Kodak,4x4,ldr-rgb-kodak10.png,47.0603,0.4451,0.4289,0.9168 +Kodak,4x4,ldr-rgb-kodak11.png,45.1118,0.4213,0.4052,0.9704 +Kodak,4x4,ldr-rgb-kodak12.png,48.2457,0.4152,0.4006,0.9815 +Kodak,4x4,ldr-rgb-kodak13.png,41.7174,0.3986,0.3823,1.0285 +Kodak,4x4,ldr-rgb-kodak14.png,42.9405,0.4302,0.4144,0.9488 +Kodak,4x4,ldr-rgb-kodak15.png,45.7858,0.4254,0.4092,0.9610 +Kodak,4x4,ldr-rgb-kodak16.png,48.0651,0.4095,0.3948,0.9960 +Kodak,4x4,ldr-rgb-kodak17.png,46.4609,0.4269,0.4105,0.9579 +Kodak,4x4,ldr-rgb-kodak18.png,42.1541,0.4632,0.4462,0.8813 +Kodak,4x4,ldr-rgb-kodak19.png,45.5439,0.4458,0.4292,0.9162 +Kodak,4x4,ldr-rgb-kodak20.png,47.1284,0.2807,0.2661,1.4778 +Kodak,4x4,ldr-rgb-kodak21.png,45.3018,0.4347,0.4193,0.9377 +Kodak,4x4,ldr-rgb-kodak22.png,43.9797,0.4750,0.4584,0.8578 +Kodak,4x4,ldr-rgb-kodak23.png,47.1532,0.4627,0.4472,0.8793 +Kodak,4x4,ldr-rgb-kodak24.png,42.5029,0.4338,0.4171,0.9428 +Kodak,5x5,ldr-rgb-kodak01.png,40.2326,0.5107,0.4934,0.7970 +Kodak,5x5,ldr-rgb-kodak02.png,41.9976,0.5981,0.5807,0.6772 +Kodak,5x5,ldr-rgb-kodak03.png,44.3238,0.4951,0.4787,0.8215 +Kodak,5x5,ldr-rgb-kodak04.png,42.2393,0.5392,0.5212,0.7544 +Kodak,5x5,ldr-rgb-kodak05.png,38.1756,0.5592,0.5412,0.7265 +Kodak,5x5,ldr-rgb-kodak06.png,41.0844,0.4868,0.4698,0.8370 +Kodak,5x5,ldr-rgb-kodak07.png,42.7250,0.5362,0.5184,0.7585 +Kodak,5x5,ldr-rgb-kodak08.png,38.5334,0.5686,0.5494,0.7157 +Kodak,5x5,ldr-rgb-kodak09.png,44.0288,0.5378,0.5202,0.7559 +Kodak,5x5,ldr-rgb-kodak10.png,43.5935,0.5427,0.5245,0.7497 +Kodak,5x5,ldr-rgb-kodak11.png,40.9987,0.5099,0.4924,0.7986 +Kodak,5x5,ldr-rgb-kodak12.png,44.5960,0.5021,0.4860,0.8092 +Kodak,5x5,ldr-rgb-kodak13.png,36.9514,0.5018,0.4837,0.8129 +Kodak,5x5,ldr-rgb-kodak14.png,38.8797,0.5359,0.5189,0.7578 +Kodak,5x5,ldr-rgb-kodak15.png,42.1246,0.5150,0.4968,0.7915 +Kodak,5x5,ldr-rgb-kodak16.png,44.2686,0.5024,0.4861,0.8090 +Kodak,5x5,ldr-rgb-kodak17.png,42.6009,0.5229,0.5047,0.7792 +Kodak,5x5,ldr-rgb-kodak18.png,38.4550,0.5790,0.5603,0.7018 +Kodak,5x5,ldr-rgb-kodak19.png,41.7718,0.5543,0.5362,0.7333 +Kodak,5x5,ldr-rgb-kodak20.png,43.2705,0.3555,0.3394,1.1584 +Kodak,5x5,ldr-rgb-kodak21.png,40.8630,0.5532,0.5364,0.7330 +Kodak,5x5,ldr-rgb-kodak22.png,40.4255,0.5964,0.5782,0.6801 +Kodak,5x5,ldr-rgb-kodak23.png,43.8840,0.5809,0.5635,0.6978 +Kodak,5x5,ldr-rgb-kodak24.png,38.2271,0.5340,0.5160,0.7621 +Kodak,6x6,ldr-rgb-kodak01.png,36.3126,0.6136,0.5953,0.6606 +Kodak,6x6,ldr-rgb-kodak02.png,39.3780,0.6993,0.6810,0.5774 +Kodak,6x6,ldr-rgb-kodak03.png,41.7330,0.4386,0.4217,0.9324 +Kodak,6x6,ldr-rgb-kodak04.png,39.6521,0.6089,0.5904,0.6660 +Kodak,6x6,ldr-rgb-kodak05.png,34.9741,0.6617,0.6431,0.6115 +Kodak,6x6,ldr-rgb-kodak06.png,37.7401,0.5507,0.5330,0.7378 +Kodak,6x6,ldr-rgb-kodak07.png,40.1032,0.5000,0.4819,0.8159 +Kodak,6x6,ldr-rgb-kodak08.png,35.1660,0.6651,0.6458,0.6089 +Kodak,6x6,ldr-rgb-kodak09.png,41.2613,0.6048,0.5865,0.6705 +Kodak,6x6,ldr-rgb-kodak10.png,40.8140,0.6245,0.6055,0.6494 +Kodak,6x6,ldr-rgb-kodak11.png,37.7541,0.5632,0.5455,0.7208 +Kodak,6x6,ldr-rgb-kodak12.png,41.8249,0.5254,0.5082,0.7737 +Kodak,6x6,ldr-rgb-kodak13.png,32.9256,0.6175,0.5991,0.6564 +Kodak,6x6,ldr-rgb-kodak14.png,36.0211,0.6353,0.6176,0.6367 +Kodak,6x6,ldr-rgb-kodak15.png,39.4513,0.5203,0.5023,0.7829 +Kodak,6x6,ldr-rgb-kodak16.png,41.2290,0.5118,0.4949,0.7946 +Kodak,6x6,ldr-rgb-kodak17.png,39.6521,0.5873,0.5689,0.6912 +Kodak,6x6,ldr-rgb-kodak18.png,35.4328,0.6981,0.6787,0.5794 +Kodak,6x6,ldr-rgb-kodak19.png,38.6954,0.6565,0.6377,0.6166 +Kodak,6x6,ldr-rgb-kodak20.png,40.0953,0.4091,0.3921,1.0028 +Kodak,6x6,ldr-rgb-kodak21.png,37.3344,0.6525,0.6349,0.6193 +Kodak,6x6,ldr-rgb-kodak22.png,37.6231,0.7064,0.6876,0.5718 +Kodak,6x6,ldr-rgb-kodak23.png,41.4033,0.6100,0.5923,0.6639 +Kodak,6x6,ldr-rgb-kodak24.png,35.1417,0.5797,0.5609,0.7010 +Kodak,8x8,ldr-rgb-kodak01.png,31.9071,0.7453,0.7226,0.5442 +Kodak,8x8,ldr-rgb-kodak02.png,36.1354,0.6556,0.6322,0.6220 +Kodak,8x8,ldr-rgb-kodak03.png,38.1744,0.3476,0.3258,1.2070 +Kodak,8x8,ldr-rgb-kodak04.png,36.3637,0.5540,0.5303,0.7414 +Kodak,8x8,ldr-rgb-kodak05.png,30.9005,0.7610,0.7374,0.5332 +Kodak,8x8,ldr-rgb-kodak06.png,33.5749,0.6153,0.5928,0.6633 +Kodak,8x8,ldr-rgb-kodak07.png,36.4888,0.4141,0.3908,1.0061 +Kodak,8x8,ldr-rgb-kodak08.png,30.7484,0.8134,0.7888,0.4985 +Kodak,8x8,ldr-rgb-kodak09.png,37.5499,0.3884,0.3651,1.0769 +Kodak,8x8,ldr-rgb-kodak10.png,37.2288,0.4302,0.4066,0.9670 +Kodak,8x8,ldr-rgb-kodak11.png,33.8276,0.6658,0.6432,0.6113 +Kodak,8x8,ldr-rgb-kodak12.png,38.2490,0.4140,0.3921,1.0027 +Kodak,8x8,ldr-rgb-kodak13.png,28.4500,0.8296,0.8060,0.4879 +Kodak,8x8,ldr-rgb-kodak14.png,32.3258,0.7609,0.7381,0.5328 +Kodak,8x8,ldr-rgb-kodak15.png,36.0605,0.5150,0.4912,0.8006 +Kodak,8x8,ldr-rgb-kodak16.png,37.2636,0.4848,0.4628,0.8496 +Kodak,8x8,ldr-rgb-kodak17.png,35.8722,0.4708,0.4472,0.8793 +Kodak,8x8,ldr-rgb-kodak18.png,31.6494,0.7656,0.7406,0.5310 +Kodak,8x8,ldr-rgb-kodak19.png,34.9142,0.5276,0.5036,0.7808 +Kodak,8x8,ldr-rgb-kodak20.png,36.1470,0.4058,0.3842,1.0235 +Kodak,8x8,ldr-rgb-kodak21.png,33.2221,0.5399,0.5169,0.7607 +Kodak,8x8,ldr-rgb-kodak22.png,34.2203,0.6823,0.6580,0.5976 +Kodak,8x8,ldr-rgb-kodak23.png,38.1785,0.3878,0.3643,1.0793 +Kodak,8x8,ldr-rgb-kodak24.png,31.2174,0.6261,0.6023,0.6529 +Kodak,12x12,ldr-rgb-kodak01.png,27.9058,0.8563,0.8238,0.4773 +Kodak,12x12,ldr-rgb-kodak02.png,32.9642,0.5677,0.5345,0.7357 +Kodak,12x12,ldr-rgb-kodak03.png,34.4219,0.3473,0.3156,1.2461 +Kodak,12x12,ldr-rgb-kodak04.png,32.9599,0.5046,0.4698,0.8370 +Kodak,12x12,ldr-rgb-kodak05.png,26.5928,0.8968,0.8634,0.4554 +Kodak,12x12,ldr-rgb-kodak06.png,29.5304,0.6412,0.6088,0.6459 +Kodak,12x12,ldr-rgb-kodak07.png,32.6108,0.4229,0.3900,1.0084 +Kodak,12x12,ldr-rgb-kodak08.png,26.2752,0.8770,0.8429,0.4665 +Kodak,12x12,ldr-rgb-kodak09.png,33.6251,0.3811,0.3479,1.1303 +Kodak,12x12,ldr-rgb-kodak10.png,32.9828,0.3741,0.3404,1.1550 +Kodak,12x12,ldr-rgb-kodak11.png,30.0467,0.6285,0.5962,0.6595 +Kodak,12x12,ldr-rgb-kodak12.png,34.4395,0.3410,0.3092,1.2718 +Kodak,12x12,ldr-rgb-kodak13.png,24.5820,1.0095,0.9762,0.4028 +Kodak,12x12,ldr-rgb-kodak14.png,28.6295,0.8041,0.7711,0.5099 +Kodak,12x12,ldr-rgb-kodak15.png,32.7197,0.4875,0.4549,0.8645 +Kodak,12x12,ldr-rgb-kodak16.png,33.3355,0.4710,0.4393,0.8951 +Kodak,12x12,ldr-rgb-kodak17.png,32.1412,0.4269,0.3930,1.0005 +Kodak,12x12,ldr-rgb-kodak18.png,27.9215,0.7685,0.7346,0.5353 +Kodak,12x12,ldr-rgb-kodak19.png,31.1014,0.6079,0.5736,0.6855 +Kodak,12x12,ldr-rgb-kodak20.png,32.1471,0.4507,0.4184,0.9398 +Kodak,12x12,ldr-rgb-kodak21.png,29.3170,0.5808,0.5485,0.7170 +Kodak,12x12,ldr-rgb-kodak22.png,30.7805,0.6593,0.6254,0.6287 +Kodak,12x12,ldr-rgb-kodak23.png,34.3635,0.3214,0.2886,1.3623 +Kodak,12x12,ldr-rgb-kodak24.png,27.2288,0.6926,0.6589,0.5968 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse4.1_fast_results.csv new file mode 100644 index 0000000..a7d4cf1 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse4.1_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.8489,0.0350,0.0211,18.5971 +Kodak,4x4,ldr-rgb-kodak02.png,44.2380,0.0438,0.0292,13.4816 +Kodak,4x4,ldr-rgb-kodak03.png,46.6338,0.0309,0.0177,22.2043 +Kodak,4x4,ldr-rgb-kodak04.png,44.5665,0.0413,0.0265,14.8350 +Kodak,4x4,ldr-rgb-kodak05.png,41.5682,0.0528,0.0380,10.3472 +Kodak,4x4,ldr-rgb-kodak06.png,44.7452,0.0346,0.0209,18.8088 +Kodak,4x4,ldr-rgb-kodak07.png,45.0418,0.0373,0.0228,17.2714 +Kodak,4x4,ldr-rgb-kodak08.png,42.0821,0.0551,0.0394,9.9915 +Kodak,4x4,ldr-rgb-kodak09.png,46.2551,0.0307,0.0164,23.9998 +Kodak,4x4,ldr-rgb-kodak10.png,46.0288,0.0322,0.0174,22.5390 +Kodak,4x4,ldr-rgb-kodak11.png,44.2450,0.0385,0.0251,15.6535 +Kodak,4x4,ldr-rgb-kodak12.png,47.0135,0.0294,0.0163,24.0913 +Kodak,4x4,ldr-rgb-kodak13.png,41.4309,0.0491,0.0341,11.5445 +Kodak,4x4,ldr-rgb-kodak14.png,41.8066,0.0458,0.0315,12.4759 +Kodak,4x4,ldr-rgb-kodak15.png,44.5942,0.0426,0.0281,14.0123 +Kodak,4x4,ldr-rgb-kodak16.png,47.1801,0.0279,0.0149,26.3921 +Kodak,4x4,ldr-rgb-kodak17.png,45.7548,0.0305,0.0159,24.6915 +Kodak,4x4,ldr-rgb-kodak18.png,41.6128,0.0533,0.0377,10.4260 +Kodak,4x4,ldr-rgb-kodak19.png,44.8023,0.0355,0.0205,19.1972 +Kodak,4x4,ldr-rgb-kodak20.png,46.3894,0.0311,0.0182,21.5653 +Kodak,4x4,ldr-rgb-kodak21.png,44.5781,0.0354,0.0218,18.0110 +Kodak,4x4,ldr-rgb-kodak22.png,43.1599,0.0469,0.0317,12.3957 +Kodak,4x4,ldr-rgb-kodak23.png,45.5706,0.0348,0.0206,19.1075 +Kodak,4x4,ldr-rgb-kodak24.png,41.8541,0.0466,0.0315,12.5025 +Kodak,5x5,ldr-rgb-kodak01.png,39.6107,0.0359,0.0208,18.9127 +Kodak,5x5,ldr-rgb-kodak02.png,40.6312,0.0352,0.0195,20.1216 +Kodak,5x5,ldr-rgb-kodak03.png,43.0303,0.0282,0.0138,28.4033 +Kodak,5x5,ldr-rgb-kodak04.png,41.2378,0.0345,0.0187,21.0052 +Kodak,5x5,ldr-rgb-kodak05.png,37.4134,0.0504,0.0346,11.3492 +Kodak,5x5,ldr-rgb-kodak06.png,40.5758,0.0321,0.0175,22.5313 +Kodak,5x5,ldr-rgb-kodak07.png,41.4746,0.0331,0.0175,22.4094 +Kodak,5x5,ldr-rgb-kodak08.png,37.7544,0.0520,0.0353,11.1428 +Kodak,5x5,ldr-rgb-kodak09.png,42.9020,0.0280,0.0126,31.3019 +Kodak,5x5,ldr-rgb-kodak10.png,42.6178,0.0287,0.0130,30.1798 +Kodak,5x5,ldr-rgb-kodak11.png,40.2886,0.0340,0.0193,20.3234 +Kodak,5x5,ldr-rgb-kodak12.png,43.4048,0.0256,0.0116,33.9097 +Kodak,5x5,ldr-rgb-kodak13.png,36.8044,0.0476,0.0315,12.4727 +Kodak,5x5,ldr-rgb-kodak14.png,37.9374,0.0452,0.0299,13.1331 +Kodak,5x5,ldr-rgb-kodak15.png,41.1606,0.0345,0.0190,20.6945 +Kodak,5x5,ldr-rgb-kodak16.png,43.4729,0.0250,0.0110,35.8677 +Kodak,5x5,ldr-rgb-kodak17.png,42.0129,0.0282,0.0124,31.7210 +Kodak,5x5,ldr-rgb-kodak18.png,38.0842,0.0440,0.0275,14.2962 +Kodak,5x5,ldr-rgb-kodak19.png,41.1186,0.0315,0.0155,25.3037 +Kodak,5x5,ldr-rgb-kodak20.png,42.3441,0.0280,0.0139,28.2893 +Kodak,5x5,ldr-rgb-kodak21.png,40.4026,0.0329,0.0184,21.4157 +Kodak,5x5,ldr-rgb-kodak22.png,39.7574,0.0373,0.0214,18.3910 +Kodak,5x5,ldr-rgb-kodak23.png,42.4861,0.0293,0.0146,27.0141 +Kodak,5x5,ldr-rgb-kodak24.png,37.7908,0.0415,0.0256,15.3420 +Kodak,6x6,ldr-rgb-kodak01.png,35.7518,0.0458,0.0303,12.9728 +Kodak,6x6,ldr-rgb-kodak02.png,38.1633,0.0370,0.0208,18.9028 +Kodak,6x6,ldr-rgb-kodak03.png,40.5311,0.0284,0.0139,28.2423 +Kodak,6x6,ldr-rgb-kodak04.png,38.5310,0.0360,0.0198,19.8853 +Kodak,6x6,ldr-rgb-kodak05.png,34.3245,0.0598,0.0433,9.0720 +Kodak,6x6,ldr-rgb-kodak06.png,37.2781,0.0364,0.0212,18.5095 +Kodak,6x6,ldr-rgb-kodak07.png,38.8424,0.0350,0.0190,20.6577 +Kodak,6x6,ldr-rgb-kodak08.png,34.4294,0.0614,0.0440,8.9306 +Kodak,6x6,ldr-rgb-kodak09.png,39.9541,0.0306,0.0145,27.1462 +Kodak,6x6,ldr-rgb-kodak10.png,39.7141,0.0306,0.0145,27.1820 +Kodak,6x6,ldr-rgb-kodak11.png,37.1267,0.0381,0.0231,17.0488 +Kodak,6x6,ldr-rgb-kodak12.png,40.7229,0.0271,0.0125,31.4320 +Kodak,6x6,ldr-rgb-kodak13.png,32.7806,0.0644,0.0479,8.2137 +Kodak,6x6,ldr-rgb-kodak14.png,35.2395,0.0516,0.0358,10.9831 +Kodak,6x6,ldr-rgb-kodak15.png,38.5238,0.0361,0.0202,19.4189 +Kodak,6x6,ldr-rgb-kodak16.png,40.4988,0.0268,0.0122,32.2444 +Kodak,6x6,ldr-rgb-kodak17.png,38.9257,0.0311,0.0147,26.6768 +Kodak,6x6,ldr-rgb-kodak18.png,35.0966,0.0485,0.0318,12.3528 +Kodak,6x6,ldr-rgb-kodak19.png,37.9638,0.0366,0.0202,19.4903 +Kodak,6x6,ldr-rgb-kodak20.png,39.1665,0.0310,0.0167,23.6038 +Kodak,6x6,ldr-rgb-kodak21.png,36.8836,0.0394,0.0240,16.3555 +Kodak,6x6,ldr-rgb-kodak22.png,36.9688,0.0407,0.0238,16.5558 +Kodak,6x6,ldr-rgb-kodak23.png,40.0317,0.0300,0.0147,26.8095 +Kodak,6x6,ldr-rgb-kodak24.png,34.7652,0.0466,0.0302,13.0373 +Kodak,8x8,ldr-rgb-kodak01.png,31.3202,0.0622,0.0423,9.3044 +Kodak,8x8,ldr-rgb-kodak02.png,34.8887,0.0414,0.0212,18.5645 +Kodak,8x8,ldr-rgb-kodak03.png,36.5578,0.0347,0.0162,24.2829 +Kodak,8x8,ldr-rgb-kodak04.png,35.1631,0.0403,0.0201,19.5961 +Kodak,8x8,ldr-rgb-kodak05.png,30.2292,0.0784,0.0578,6.7988 +Kodak,8x8,ldr-rgb-kodak06.png,32.8877,0.0495,0.0300,13.1138 +Kodak,8x8,ldr-rgb-kodak07.png,34.9572,0.0425,0.0223,17.6362 +Kodak,8x8,ldr-rgb-kodak08.png,29.9725,0.0844,0.0629,6.2468 +Kodak,8x8,ldr-rgb-kodak09.png,36.0644,0.0373,0.0175,22.5297 +Kodak,8x8,ldr-rgb-kodak10.png,35.8570,0.0372,0.0170,23.0964 +Kodak,8x8,ldr-rgb-kodak11.png,32.9725,0.0489,0.0297,13.2423 +Kodak,8x8,ldr-rgb-kodak12.png,36.6491,0.0342,0.0155,25.3200 +Kodak,8x8,ldr-rgb-kodak13.png,28.2120,0.0914,0.0707,5.5636 +Kodak,8x8,ldr-rgb-kodak14.png,31.4918,0.0651,0.0451,8.7122 +Kodak,8x8,ldr-rgb-kodak15.png,34.9071,0.0423,0.0224,17.5598 +Kodak,8x8,ldr-rgb-kodak16.png,36.0183,0.0361,0.0177,22.2180 +Kodak,8x8,ldr-rgb-kodak17.png,34.8539,0.0392,0.0192,20.5281 +Kodak,8x8,ldr-rgb-kodak18.png,31.2432,0.0603,0.0395,9.9485 +Kodak,8x8,ldr-rgb-kodak19.png,34.0762,0.0451,0.0245,16.0300 +Kodak,8x8,ldr-rgb-kodak20.png,35.2082,0.0378,0.0195,20.1866 +Kodak,8x8,ldr-rgb-kodak21.png,32.7363,0.0495,0.0305,12.8724 +Kodak,8x8,ldr-rgb-kodak22.png,33.4378,0.0471,0.0268,14.6908 +Kodak,8x8,ldr-rgb-kodak23.png,36.4996,0.0342,0.0146,26.9193 +Kodak,8x8,ldr-rgb-kodak24.png,30.8091,0.0587,0.0385,10.2203 +Kodak,12x12,ldr-rgb-kodak01.png,27.1016,0.0579,0.0318,12.3665 +Kodak,12x12,ldr-rgb-kodak02.png,31.0998,0.0380,0.0113,34.8072 +Kodak,12x12,ldr-rgb-kodak03.png,32.6801,0.0356,0.0103,38.1245 +Kodak,12x12,ldr-rgb-kodak04.png,31.5605,0.0369,0.0099,39.5318 +Kodak,12x12,ldr-rgb-kodak05.png,25.8047,0.0655,0.0386,10.1967 +Kodak,12x12,ldr-rgb-kodak06.png,28.6329,0.0492,0.0235,16.7028 +Kodak,12x12,ldr-rgb-kodak07.png,30.8575,0.0397,0.0128,30.7178 +Kodak,12x12,ldr-rgb-kodak08.png,25.3873,0.0738,0.0456,8.6235 +Kodak,12x12,ldr-rgb-kodak09.png,31.8330,0.0380,0.0115,34.3268 +Kodak,12x12,ldr-rgb-kodak10.png,31.5260,0.0391,0.0121,32.5723 +Kodak,12x12,ldr-rgb-kodak11.png,28.9305,0.0443,0.0184,21.3891 +Kodak,12x12,ldr-rgb-kodak12.png,32.2648,0.0354,0.0097,40.4917 +Kodak,12x12,ldr-rgb-kodak13.png,24.3206,0.0807,0.0529,7.4334 +Kodak,12x12,ldr-rgb-kodak14.png,27.5298,0.0516,0.0254,15.4675 +Kodak,12x12,ldr-rgb-kodak15.png,31.2436,0.0401,0.0140,28.1469 +Kodak,12x12,ldr-rgb-kodak16.png,31.4839,0.0370,0.0117,33.5047 +Kodak,12x12,ldr-rgb-kodak17.png,30.8893,0.0399,0.0129,30.5437 +Kodak,12x12,ldr-rgb-kodak18.png,27.4177,0.0531,0.0255,15.4154 +Kodak,12x12,ldr-rgb-kodak19.png,30.1727,0.0447,0.0175,22.5002 +Kodak,12x12,ldr-rgb-kodak20.png,31.0405,0.0388,0.0138,28.4690 +Kodak,12x12,ldr-rgb-kodak21.png,28.7169,0.0480,0.0222,17.6767 +Kodak,12x12,ldr-rgb-kodak22.png,29.8277,0.0412,0.0141,27.8324 +Kodak,12x12,ldr-rgb-kodak23.png,32.5185,0.0367,0.0106,37.2430 +Kodak,12x12,ldr-rgb-kodak24.png,26.7652,0.0564,0.0294,13.3574 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse4.1_fastest_results.csv new file mode 100644 index 0000000..8d8a543 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse4.1_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.5072,0.0294,0.0163,24.1428 +Kodak,4x4,ldr-rgb-kodak02.png,43.8025,0.0341,0.0203,19.3922 +Kodak,4x4,ldr-rgb-kodak03.png,46.0406,0.0258,0.0135,29.1684 +Kodak,4x4,ldr-rgb-kodak04.png,44.1430,0.0327,0.0187,21.0173 +Kodak,4x4,ldr-rgb-kodak05.png,40.9879,0.0387,0.0247,15.9081 +Kodak,4x4,ldr-rgb-kodak06.png,44.4296,0.0292,0.0162,24.2936 +Kodak,4x4,ldr-rgb-kodak07.png,44.6051,0.0306,0.0168,23.4184 +Kodak,4x4,ldr-rgb-kodak08.png,41.5000,0.0403,0.0254,15.4675 +Kodak,4x4,ldr-rgb-kodak09.png,45.9005,0.0267,0.0131,30.0857 +Kodak,4x4,ldr-rgb-kodak10.png,45.6663,0.0278,0.0137,28.6346 +Kodak,4x4,ldr-rgb-kodak11.png,43.8292,0.0309,0.0180,21.8698 +Kodak,4x4,ldr-rgb-kodak12.png,46.4729,0.0255,0.0131,30.1176 +Kodak,4x4,ldr-rgb-kodak13.png,41.1509,0.0392,0.0251,15.6859 +Kodak,4x4,ldr-rgb-kodak14.png,41.0931,0.0333,0.0200,19.6796 +Kodak,4x4,ldr-rgb-kodak15.png,44.1027,0.0328,0.0191,20.5883 +Kodak,4x4,ldr-rgb-kodak16.png,47.0422,0.0247,0.0124,31.7234 +Kodak,4x4,ldr-rgb-kodak17.png,45.4973,0.0272,0.0131,29.9458 +Kodak,4x4,ldr-rgb-kodak18.png,41.2449,0.0400,0.0253,15.5552 +Kodak,4x4,ldr-rgb-kodak19.png,44.5301,0.0303,0.0159,24.7772 +Kodak,4x4,ldr-rgb-kodak20.png,45.8602,0.0263,0.0140,28.0007 +Kodak,4x4,ldr-rgb-kodak21.png,44.2614,0.0295,0.0164,23.9883 +Kodak,4x4,ldr-rgb-kodak22.png,42.7742,0.0360,0.0215,18.2951 +Kodak,4x4,ldr-rgb-kodak23.png,45.2565,0.0288,0.0155,25.4050 +Kodak,4x4,ldr-rgb-kodak24.png,41.2205,0.0353,0.0209,18.8268 +Kodak,5x5,ldr-rgb-kodak01.png,39.3652,0.0311,0.0175,22.4436 +Kodak,5x5,ldr-rgb-kodak02.png,40.3764,0.0301,0.0157,25.0824 +Kodak,5x5,ldr-rgb-kodak03.png,42.6004,0.0241,0.0111,35.2943 +Kodak,5x5,ldr-rgb-kodak04.png,40.7713,0.0299,0.0151,26.0461 +Kodak,5x5,ldr-rgb-kodak05.png,36.9823,0.0397,0.0246,15.9539 +Kodak,5x5,ldr-rgb-kodak06.png,40.4008,0.0283,0.0146,26.9070 +Kodak,5x5,ldr-rgb-kodak07.png,41.1154,0.0287,0.0142,27.7402 +Kodak,5x5,ldr-rgb-kodak08.png,37.3666,0.0413,0.0257,15.3019 +Kodak,5x5,ldr-rgb-kodak09.png,42.5422,0.0250,0.0106,36.9774 +Kodak,5x5,ldr-rgb-kodak10.png,42.3455,0.0261,0.0112,35.2536 +Kodak,5x5,ldr-rgb-kodak11.png,40.0401,0.0290,0.0153,25.6185 +Kodak,5x5,ldr-rgb-kodak12.png,43.1448,0.0235,0.0102,38.4185 +Kodak,5x5,ldr-rgb-kodak13.png,36.6876,0.0400,0.0253,15.5556 +Kodak,5x5,ldr-rgb-kodak14.png,37.3962,0.0339,0.0198,19.8363 +Kodak,5x5,ldr-rgb-kodak15.png,40.8535,0.0291,0.0147,26.7895 +Kodak,5x5,ldr-rgb-kodak16.png,43.3795,0.0231,0.0100,39.3846 +Kodak,5x5,ldr-rgb-kodak17.png,41.8560,0.0254,0.0108,36.5068 +Kodak,5x5,ldr-rgb-kodak18.png,37.9129,0.0363,0.0208,18.8701 +Kodak,5x5,ldr-rgb-kodak19.png,40.8503,0.0285,0.0135,29.0733 +Kodak,5x5,ldr-rgb-kodak20.png,42.0160,0.0248,0.0118,33.3745 +Kodak,5x5,ldr-rgb-kodak21.png,40.1806,0.0286,0.0150,26.1498 +Kodak,5x5,ldr-rgb-kodak22.png,39.4506,0.0316,0.0167,23.4838 +Kodak,5x5,ldr-rgb-kodak23.png,42.1119,0.0260,0.0121,32.4755 +Kodak,5x5,ldr-rgb-kodak24.png,37.5516,0.0334,0.0188,20.9011 +Kodak,6x6,ldr-rgb-kodak01.png,35.6562,0.0363,0.0217,18.0789 +Kodak,6x6,ldr-rgb-kodak02.png,38.0339,0.0299,0.0151,26.0322 +Kodak,6x6,ldr-rgb-kodak03.png,40.3032,0.0240,0.0106,37.2228 +Kodak,6x6,ldr-rgb-kodak04.png,38.2918,0.0295,0.0141,27.9036 +Kodak,6x6,ldr-rgb-kodak05.png,34.0896,0.0424,0.0274,14.3683 +Kodak,6x6,ldr-rgb-kodak06.png,37.2222,0.0300,0.0162,24.2308 +Kodak,6x6,ldr-rgb-kodak07.png,38.6336,0.0287,0.0140,28.0249 +Kodak,6x6,ldr-rgb-kodak08.png,34.2253,0.0441,0.0282,13.9671 +Kodak,6x6,ldr-rgb-kodak09.png,39.7573,0.0259,0.0113,34.8167 +Kodak,6x6,ldr-rgb-kodak10.png,39.5662,0.0263,0.0112,34.9680 +Kodak,6x6,ldr-rgb-kodak11.png,36.9968,0.0302,0.0164,24.0337 +Kodak,6x6,ldr-rgb-kodak12.png,40.5658,0.0234,0.0099,39.7462 +Kodak,6x6,ldr-rgb-kodak13.png,32.7154,0.0472,0.0319,12.3300 +Kodak,6x6,ldr-rgb-kodak14.png,34.8624,0.0356,0.0211,18.6085 +Kodak,6x6,ldr-rgb-kodak15.png,38.3699,0.0295,0.0147,26.8078 +Kodak,6x6,ldr-rgb-kodak16.png,40.4581,0.0237,0.0102,38.6336 +Kodak,6x6,ldr-rgb-kodak17.png,38.8420,0.0269,0.0119,33.1684 +Kodak,6x6,ldr-rgb-kodak18.png,35.0034,0.0380,0.0219,17.9526 +Kodak,6x6,ldr-rgb-kodak19.png,37.8298,0.0307,0.0155,25.3441 +Kodak,6x6,ldr-rgb-kodak20.png,39.0123,0.0258,0.0125,31.4644 +Kodak,6x6,ldr-rgb-kodak21.png,36.8075,0.0310,0.0172,22.8788 +Kodak,6x6,ldr-rgb-kodak22.png,36.8498,0.0327,0.0173,22.6990 +Kodak,6x6,ldr-rgb-kodak23.png,39.8307,0.0257,0.0114,34.5657 +Kodak,6x6,ldr-rgb-kodak24.png,34.6916,0.0360,0.0206,19.0447 +Kodak,8x8,ldr-rgb-kodak01.png,31.1808,0.0483,0.0306,12.8540 +Kodak,8x8,ldr-rgb-kodak02.png,34.7814,0.0344,0.0162,24.2607 +Kodak,8x8,ldr-rgb-kodak03.png,36.4381,0.0293,0.0126,31.2172 +Kodak,8x8,ldr-rgb-kodak04.png,35.0562,0.0340,0.0155,25.4426 +Kodak,8x8,ldr-rgb-kodak05.png,30.0281,0.0565,0.0378,10.4012 +Kodak,8x8,ldr-rgb-kodak06.png,32.7989,0.0396,0.0220,17.8363 +Kodak,8x8,ldr-rgb-kodak07.png,34.8353,0.0353,0.0172,22.9256 +Kodak,8x8,ldr-rgb-kodak08.png,29.7076,0.0599,0.0403,9.7606 +Kodak,8x8,ldr-rgb-kodak09.png,35.8909,0.0317,0.0134,29.3668 +Kodak,8x8,ldr-rgb-kodak10.png,35.7101,0.0317,0.0131,29.9894 +Kodak,8x8,ldr-rgb-kodak11.png,32.8554,0.0386,0.0212,18.5261 +Kodak,8x8,ldr-rgb-kodak12.png,36.5111,0.0292,0.0122,32.3075 +Kodak,8x8,ldr-rgb-kodak13.png,28.1363,0.0661,0.0471,8.3399 +Kodak,8x8,ldr-rgb-kodak14.png,31.2698,0.0476,0.0294,13.3842 +Kodak,8x8,ldr-rgb-kodak15.png,34.7637,0.0347,0.0164,23.9097 +Kodak,8x8,ldr-rgb-kodak16.png,35.9616,0.0308,0.0140,28.1114 +Kodak,8x8,ldr-rgb-kodak17.png,34.7164,0.0328,0.0143,27.4206 +Kodak,8x8,ldr-rgb-kodak18.png,31.1666,0.0471,0.0280,14.0550 +Kodak,8x8,ldr-rgb-kodak19.png,33.8904,0.0374,0.0185,21.2204 +Kodak,8x8,ldr-rgb-kodak20.png,35.0294,0.0314,0.0148,26.5075 +Kodak,8x8,ldr-rgb-kodak21.png,32.6198,0.0398,0.0223,17.6290 +Kodak,8x8,ldr-rgb-kodak22.png,33.3292,0.0382,0.0195,20.1359 +Kodak,8x8,ldr-rgb-kodak23.png,36.3894,0.0293,0.0118,33.4537 +Kodak,8x8,ldr-rgb-kodak24.png,30.7285,0.0456,0.0270,14.5587 +Kodak,12x12,ldr-rgb-kodak01.png,26.9944,0.0463,0.0239,16.4851 +Kodak,12x12,ldr-rgb-kodak02.png,31.0354,0.0322,0.0097,40.7186 +Kodak,12x12,ldr-rgb-kodak03.png,32.6215,0.0298,0.0087,45.1187 +Kodak,12x12,ldr-rgb-kodak04.png,31.4774,0.0314,0.0086,45.5322 +Kodak,12x12,ldr-rgb-kodak05.png,25.6943,0.0510,0.0284,13.8486 +Kodak,12x12,ldr-rgb-kodak06.png,28.4895,0.0396,0.0181,21.7246 +Kodak,12x12,ldr-rgb-kodak07.png,30.8016,0.0331,0.0106,36.9915 +Kodak,12x12,ldr-rgb-kodak08.png,25.2157,0.0567,0.0335,11.7437 +Kodak,12x12,ldr-rgb-kodak09.png,31.6339,0.0321,0.0095,41.2833 +Kodak,12x12,ldr-rgb-kodak10.png,31.4566,0.0327,0.0099,39.5546 +Kodak,12x12,ldr-rgb-kodak11.png,28.8572,0.0359,0.0143,27.4174 +Kodak,12x12,ldr-rgb-kodak12.png,32.1857,0.0298,0.0086,45.5737 +Kodak,12x12,ldr-rgb-kodak13.png,24.2396,0.0605,0.0376,10.4526 +Kodak,12x12,ldr-rgb-kodak14.png,27.4380,0.0408,0.0188,20.9324 +Kodak,12x12,ldr-rgb-kodak15.png,31.1533,0.0338,0.0114,34.4898 +Kodak,12x12,ldr-rgb-kodak16.png,31.3620,0.0310,0.0100,39.4675 +Kodak,12x12,ldr-rgb-kodak17.png,30.8364,0.0334,0.0106,37.2539 +Kodak,12x12,ldr-rgb-kodak18.png,27.3672,0.0422,0.0188,20.9391 +Kodak,12x12,ldr-rgb-kodak19.png,29.8648,0.0368,0.0139,28.2704 +Kodak,12x12,ldr-rgb-kodak20.png,30.9381,0.0324,0.0115,34.1838 +Kodak,12x12,ldr-rgb-kodak21.png,28.6166,0.0386,0.0171,23.0435 +Kodak,12x12,ldr-rgb-kodak22.png,29.7425,0.0344,0.0116,34.0329 +Kodak,12x12,ldr-rgb-kodak23.png,32.4842,0.0307,0.0087,44.9649 +Kodak,12x12,ldr-rgb-kodak24.png,26.6937,0.0445,0.0217,18.1316 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse4.1_medium_results.csv new file mode 100644 index 0000000..3ab4639 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse4.1_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.2910,0.1322,0.1173,3.3521 +Kodak,4x4,ldr-rgb-kodak02.png,45.3498,0.1791,0.1637,2.4014 +Kodak,4x4,ldr-rgb-kodak03.png,47.6132,0.0955,0.0815,4.8219 +Kodak,4x4,ldr-rgb-kodak04.png,45.4289,0.1420,0.1261,3.1177 +Kodak,4x4,ldr-rgb-kodak05.png,42.1296,0.1657,0.1501,2.6198 +Kodak,4x4,ldr-rgb-kodak06.png,45.1555,0.1245,0.1100,3.5734 +Kodak,4x4,ldr-rgb-kodak07.png,45.9743,0.1202,0.1044,3.7659 +Kodak,4x4,ldr-rgb-kodak08.png,42.5130,0.1825,0.1659,2.3696 +Kodak,4x4,ldr-rgb-kodak09.png,47.1615,0.1421,0.1267,3.1026 +Kodak,4x4,ldr-rgb-kodak10.png,46.8286,0.1448,0.1291,3.0461 +Kodak,4x4,ldr-rgb-kodak11.png,44.8665,0.1432,0.1285,3.0612 +Kodak,4x4,ldr-rgb-kodak12.png,47.9301,0.1080,0.0940,4.1815 +Kodak,4x4,ldr-rgb-kodak13.png,41.6152,0.1422,0.1263,3.1129 +Kodak,4x4,ldr-rgb-kodak14.png,42.6269,0.1531,0.1379,2.8511 +Kodak,4x4,ldr-rgb-kodak15.png,45.4386,0.1262,0.1108,3.5502 +Kodak,4x4,ldr-rgb-kodak16.png,47.8564,0.1103,0.0962,4.0860 +Kodak,4x4,ldr-rgb-kodak17.png,46.2901,0.1245,0.1088,3.6131 +Kodak,4x4,ldr-rgb-kodak18.png,41.9927,0.1837,0.1674,2.3491 +Kodak,4x4,ldr-rgb-kodak19.png,45.3391,0.1488,0.1329,2.9587 +Kodak,4x4,ldr-rgb-kodak20.png,46.8869,0.0944,0.0804,4.8894 +Kodak,4x4,ldr-rgb-kodak21.png,45.1510,0.1512,0.1366,2.8784 +Kodak,4x4,ldr-rgb-kodak22.png,43.7745,0.1876,0.1713,2.2951 +Kodak,4x4,ldr-rgb-kodak23.png,46.8184,0.1454,0.1301,3.0228 +Kodak,4x4,ldr-rgb-kodak24.png,42.2960,0.1473,0.1313,2.9958 +Kodak,5x5,ldr-rgb-kodak01.png,40.1121,0.1580,0.1410,2.7887 +Kodak,5x5,ldr-rgb-kodak02.png,41.6954,0.1676,0.1503,2.6158 +Kodak,5x5,ldr-rgb-kodak03.png,44.0360,0.0796,0.0639,6.1575 +Kodak,5x5,ldr-rgb-kodak04.png,42.0561,0.1294,0.1120,3.5116 +Kodak,5x5,ldr-rgb-kodak05.png,37.9816,0.1830,0.1656,2.3746 +Kodak,5x5,ldr-rgb-kodak06.png,40.9586,0.1256,0.1093,3.5960 +Kodak,5x5,ldr-rgb-kodak07.png,42.4607,0.1056,0.0881,4.4615 +Kodak,5x5,ldr-rgb-kodak08.png,38.3486,0.1976,0.1795,2.1910 +Kodak,5x5,ldr-rgb-kodak09.png,43.8038,0.0916,0.0743,5.2904 +Kodak,5x5,ldr-rgb-kodak10.png,43.4092,0.1033,0.0856,4.5914 +Kodak,5x5,ldr-rgb-kodak11.png,40.8377,0.1442,0.1279,3.0747 +Kodak,5x5,ldr-rgb-kodak12.png,44.3922,0.0799,0.0643,6.1162 +Kodak,5x5,ldr-rgb-kodak13.png,36.9084,0.1672,0.1499,2.6238 +Kodak,5x5,ldr-rgb-kodak14.png,38.6484,0.1629,0.1464,2.6860 +Kodak,5x5,ldr-rgb-kodak15.png,41.8912,0.1217,0.1047,3.7555 +Kodak,5x5,ldr-rgb-kodak16.png,44.1367,0.0898,0.0737,5.3381 +Kodak,5x5,ldr-rgb-kodak17.png,42.5213,0.0918,0.0743,5.2920 +Kodak,5x5,ldr-rgb-kodak18.png,38.3608,0.1765,0.1583,2.4843 +Kodak,5x5,ldr-rgb-kodak19.png,41.6469,0.1209,0.1032,3.8119 +Kodak,5x5,ldr-rgb-kodak20.png,42.9685,0.0871,0.0717,5.4879 +Kodak,5x5,ldr-rgb-kodak21.png,40.7620,0.1237,0.1074,3.6627 +Kodak,5x5,ldr-rgb-kodak22.png,40.2773,0.1691,0.1517,2.5925 +Kodak,5x5,ldr-rgb-kodak23.png,43.5489,0.1068,0.0903,4.3557 +Kodak,5x5,ldr-rgb-kodak24.png,38.1152,0.1462,0.1285,3.0593 +Kodak,6x6,ldr-rgb-kodak01.png,36.1961,0.1645,0.1472,2.6707 +Kodak,6x6,ldr-rgb-kodak02.png,39.0094,0.1307,0.1131,3.4757 +Kodak,6x6,ldr-rgb-kodak03.png,41.3262,0.0673,0.0511,7.6880 +Kodak,6x6,ldr-rgb-kodak04.png,39.3983,0.1102,0.0920,4.2726 +Kodak,6x6,ldr-rgb-kodak05.png,34.7867,0.1799,0.1622,2.4242 +Kodak,6x6,ldr-rgb-kodak06.png,37.6289,0.1129,0.0963,4.0835 +Kodak,6x6,ldr-rgb-kodak07.png,39.7726,0.0905,0.0730,5.3857 +Kodak,6x6,ldr-rgb-kodak08.png,34.9978,0.1987,0.1799,2.1855 +Kodak,6x6,ldr-rgb-kodak09.png,40.8821,0.0709,0.0532,7.3918 +Kodak,6x6,ldr-rgb-kodak10.png,40.5029,0.0750,0.0573,6.8624 +Kodak,6x6,ldr-rgb-kodak11.png,37.5798,0.1213,0.1047,3.7569 +Kodak,6x6,ldr-rgb-kodak12.png,41.4837,0.0630,0.0468,8.3979 +Kodak,6x6,ldr-rgb-kodak13.png,32.8829,0.1865,0.1686,2.3325 +Kodak,6x6,ldr-rgb-kodak14.png,35.8236,0.1512,0.1338,2.9388 +Kodak,6x6,ldr-rgb-kodak15.png,39.1952,0.1127,0.0951,4.1359 +Kodak,6x6,ldr-rgb-kodak16.png,41.0408,0.0729,0.0568,6.9167 +Kodak,6x6,ldr-rgb-kodak17.png,39.4928,0.0766,0.0586,6.7075 +Kodak,6x6,ldr-rgb-kodak18.png,35.3481,0.1563,0.1379,2.8523 +Kodak,6x6,ldr-rgb-kodak19.png,38.5316,0.1102,0.0917,4.2871 +Kodak,6x6,ldr-rgb-kodak20.png,39.7651,0.0808,0.0648,6.0710 +Kodak,6x6,ldr-rgb-kodak21.png,37.1927,0.1100,0.0932,4.2196 +Kodak,6x6,ldr-rgb-kodak22.png,37.4532,0.1422,0.1242,3.1653 +Kodak,6x6,ldr-rgb-kodak23.png,40.9705,0.0770,0.0599,6.5613 +Kodak,6x6,ldr-rgb-kodak24.png,35.0426,0.1308,0.1129,3.4841 +Kodak,8x8,ldr-rgb-kodak01.png,31.8012,0.2266,0.2061,1.9078 +Kodak,8x8,ldr-rgb-kodak02.png,35.7606,0.1303,0.1090,3.6076 +Kodak,8x8,ldr-rgb-kodak03.png,37.7459,0.0837,0.0634,6.1976 +Kodak,8x8,ldr-rgb-kodak04.png,36.0605,0.1243,0.1026,3.8316 +Kodak,8x8,ldr-rgb-kodak05.png,30.7414,0.2350,0.2134,1.8424 +Kodak,8x8,ldr-rgb-kodak06.png,33.4352,0.1461,0.1256,3.1305 +Kodak,8x8,ldr-rgb-kodak07.png,36.1304,0.1097,0.0878,4.4782 +Kodak,8x8,ldr-rgb-kodak08.png,30.5703,0.2352,0.2128,1.8479 +Kodak,8x8,ldr-rgb-kodak09.png,37.2639,0.0831,0.0617,6.3735 +Kodak,8x8,ldr-rgb-kodak10.png,36.9159,0.0854,0.0639,6.1492 +Kodak,8x8,ldr-rgb-kodak11.png,33.6573,0.1436,0.1231,3.1949 +Kodak,8x8,ldr-rgb-kodak12.png,37.8259,0.0788,0.0588,6.6838 +Kodak,8x8,ldr-rgb-kodak13.png,28.3931,0.2627,0.2411,1.6310 +Kodak,8x8,ldr-rgb-kodak14.png,32.1339,0.1876,0.1670,2.3552 +Kodak,8x8,ldr-rgb-kodak15.png,35.8359,0.1169,0.0956,4.1127 +Kodak,8x8,ldr-rgb-kodak16.png,37.0213,0.0926,0.0727,5.4122 +Kodak,8x8,ldr-rgb-kodak17.png,35.6807,0.0956,0.0738,5.3249 +Kodak,8x8,ldr-rgb-kodak18.png,31.5529,0.1865,0.1637,2.4025 +Kodak,8x8,ldr-rgb-kodak19.png,34.7649,0.1314,0.1095,3.5911 +Kodak,8x8,ldr-rgb-kodak20.png,35.8951,0.1024,0.0826,4.7626 +Kodak,8x8,ldr-rgb-kodak21.png,33.1150,0.1421,0.1217,3.2304 +Kodak,8x8,ldr-rgb-kodak22.png,34.0285,0.1563,0.1344,2.9258 +Kodak,8x8,ldr-rgb-kodak23.png,37.6470,0.0803,0.0593,6.6277 +Kodak,8x8,ldr-rgb-kodak24.png,31.1140,0.1617,0.1396,2.8169 +Kodak,12x12,ldr-rgb-kodak01.png,27.7578,0.2451,0.2160,1.8201 +Kodak,12x12,ldr-rgb-kodak02.png,32.4621,0.0968,0.0671,5.8600 +Kodak,12x12,ldr-rgb-kodak03.png,33.7766,0.0791,0.0508,7.7420 +Kodak,12x12,ldr-rgb-kodak04.png,32.4443,0.0897,0.0596,6.5979 +Kodak,12x12,ldr-rgb-kodak05.png,26.3981,0.2618,0.2320,1.6946 +Kodak,12x12,ldr-rgb-kodak06.png,29.3737,0.1567,0.1277,3.0797 +Kodak,12x12,ldr-rgb-kodak07.png,32.0414,0.1090,0.0792,4.9660 +Kodak,12x12,ldr-rgb-kodak08.png,26.0612,0.2617,0.2309,1.7030 +Kodak,12x12,ldr-rgb-kodak09.png,33.0989,0.0825,0.0526,7.4770 +Kodak,12x12,ldr-rgb-kodak10.png,32.4879,0.0834,0.0534,7.3593 +Kodak,12x12,ldr-rgb-kodak11.png,29.7447,0.1404,0.1113,3.5319 +Kodak,12x12,ldr-rgb-kodak12.png,33.8819,0.0752,0.0468,8.4100 +Kodak,12x12,ldr-rgb-kodak13.png,24.5286,0.3008,0.2704,1.4542 +Kodak,12x12,ldr-rgb-kodak14.png,28.4212,0.1891,0.1594,2.4667 +Kodak,12x12,ldr-rgb-kodak15.png,32.2342,0.1052,0.0753,5.2221 +Kodak,12x12,ldr-rgb-kodak16.png,32.9807,0.0842,0.0558,7.0432 +Kodak,12x12,ldr-rgb-kodak17.png,31.7807,0.0907,0.0607,6.4734 +Kodak,12x12,ldr-rgb-kodak18.png,27.7794,0.1836,0.1529,2.5725 +Kodak,12x12,ldr-rgb-kodak19.png,30.8869,0.1170,0.0868,4.5313 +Kodak,12x12,ldr-rgb-kodak20.png,31.8552,0.0927,0.0644,6.1086 +Kodak,12x12,ldr-rgb-kodak21.png,29.1775,0.1666,0.1378,2.8529 +Kodak,12x12,ldr-rgb-kodak22.png,30.5009,0.1296,0.0995,3.9512 +Kodak,12x12,ldr-rgb-kodak23.png,33.5464,0.0719,0.0421,9.3451 +Kodak,12x12,ldr-rgb-kodak24.png,27.1012,0.1661,0.1361,2.8894 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse4.1_thorough_results.csv new file mode 100644 index 0000000..796f8a7 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-3.7-sse4.1_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.4944,0.3493,0.3346,1.1752 +Kodak,4x4,ldr-rgb-kodak02.png,45.6493,0.4131,0.3969,0.9908 +Kodak,4x4,ldr-rgb-kodak03.png,47.9884,0.3562,0.3418,1.1503 +Kodak,4x4,ldr-rgb-kodak04.png,45.6562,0.3876,0.3717,1.0579 +Kodak,4x4,ldr-rgb-kodak05.png,42.4063,0.3869,0.3712,1.0592 +Kodak,4x4,ldr-rgb-kodak06.png,45.3572,0.3463,0.3317,1.1853 +Kodak,4x4,ldr-rgb-kodak07.png,46.3420,0.3871,0.3716,1.0581 +Kodak,4x4,ldr-rgb-kodak08.png,42.8054,0.4100,0.3932,1.0000 +Kodak,4x4,ldr-rgb-kodak09.png,47.4208,0.3946,0.3790,1.0374 +Kodak,4x4,ldr-rgb-kodak10.png,47.0603,0.3903,0.3745,1.0500 +Kodak,4x4,ldr-rgb-kodak11.png,45.1118,0.3649,0.3502,1.1228 +Kodak,4x4,ldr-rgb-kodak12.png,48.2457,0.3649,0.3502,1.1230 +Kodak,4x4,ldr-rgb-kodak13.png,41.7174,0.3507,0.3346,1.1753 +Kodak,4x4,ldr-rgb-kodak14.png,42.9405,0.3773,0.3622,1.0855 +Kodak,4x4,ldr-rgb-kodak15.png,45.7858,0.3723,0.3567,1.1023 +Kodak,4x4,ldr-rgb-kodak16.png,48.0651,0.3607,0.3464,1.1350 +Kodak,4x4,ldr-rgb-kodak17.png,46.4609,0.3746,0.3588,1.0960 +Kodak,4x4,ldr-rgb-kodak18.png,42.1541,0.4067,0.3899,1.0085 +Kodak,4x4,ldr-rgb-kodak19.png,45.5439,0.3900,0.3738,1.0521 +Kodak,4x4,ldr-rgb-kodak20.png,47.1284,0.2499,0.2355,1.6694 +Kodak,4x4,ldr-rgb-kodak21.png,45.3018,0.3819,0.3672,1.0709 +Kodak,4x4,ldr-rgb-kodak22.png,43.9797,0.4198,0.4037,0.9740 +Kodak,4x4,ldr-rgb-kodak23.png,47.1532,0.4074,0.3919,1.0033 +Kodak,4x4,ldr-rgb-kodak24.png,42.5029,0.3759,0.3600,1.0922 +Kodak,5x5,ldr-rgb-kodak01.png,40.2326,0.4466,0.4301,0.9143 +Kodak,5x5,ldr-rgb-kodak02.png,41.9976,0.5158,0.4984,0.7889 +Kodak,5x5,ldr-rgb-kodak03.png,44.3238,0.4292,0.4136,0.9508 +Kodak,5x5,ldr-rgb-kodak04.png,42.2393,0.4662,0.4488,0.8762 +Kodak,5x5,ldr-rgb-kodak05.png,38.1756,0.4863,0.4691,0.8382 +Kodak,5x5,ldr-rgb-kodak06.png,41.0844,0.4243,0.4077,0.9646 +Kodak,5x5,ldr-rgb-kodak07.png,42.7250,0.4660,0.4489,0.8759 +Kodak,5x5,ldr-rgb-kodak08.png,38.5334,0.4964,0.4775,0.8236 +Kodak,5x5,ldr-rgb-kodak09.png,44.0288,0.4651,0.4480,0.8777 +Kodak,5x5,ldr-rgb-kodak10.png,43.5935,0.4730,0.4556,0.8630 +Kodak,5x5,ldr-rgb-kodak11.png,40.9987,0.4475,0.4306,0.9131 +Kodak,5x5,ldr-rgb-kodak12.png,44.5960,0.4367,0.4206,0.9349 +Kodak,5x5,ldr-rgb-kodak13.png,36.9514,0.4378,0.4201,0.9360 +Kodak,5x5,ldr-rgb-kodak14.png,38.8797,0.4670,0.4498,0.8742 +Kodak,5x5,ldr-rgb-kodak15.png,42.1246,0.4460,0.4287,0.9172 +Kodak,5x5,ldr-rgb-kodak16.png,44.2686,0.4371,0.4214,0.9331 +Kodak,5x5,ldr-rgb-kodak17.png,42.6009,0.4554,0.4375,0.8988 +Kodak,5x5,ldr-rgb-kodak18.png,38.4550,0.5013,0.4829,0.8143 +Kodak,5x5,ldr-rgb-kodak19.png,41.7718,0.4824,0.4647,0.8462 +Kodak,5x5,ldr-rgb-kodak20.png,43.2705,0.3068,0.2909,1.3515 +Kodak,5x5,ldr-rgb-kodak21.png,40.8630,0.4791,0.4628,0.8496 +Kodak,5x5,ldr-rgb-kodak22.png,40.4255,0.5190,0.5015,0.7841 +Kodak,5x5,ldr-rgb-kodak23.png,43.8840,0.5061,0.4891,0.8039 +Kodak,5x5,ldr-rgb-kodak24.png,38.2271,0.4708,0.4527,0.8685 +Kodak,6x6,ldr-rgb-kodak01.png,36.3126,0.5430,0.5257,0.7480 +Kodak,6x6,ldr-rgb-kodak02.png,39.3780,0.6137,0.5950,0.6609 +Kodak,6x6,ldr-rgb-kodak03.png,41.7330,0.3812,0.3650,1.0774 +Kodak,6x6,ldr-rgb-kodak04.png,39.6521,0.5298,0.5115,0.7687 +Kodak,6x6,ldr-rgb-kodak05.png,34.9741,0.5808,0.5628,0.6987 +Kodak,6x6,ldr-rgb-kodak06.png,37.7401,0.4831,0.4663,0.8433 +Kodak,6x6,ldr-rgb-kodak07.png,40.1032,0.4365,0.4186,0.9394 +Kodak,6x6,ldr-rgb-kodak08.png,35.1660,0.5826,0.5638,0.6974 +Kodak,6x6,ldr-rgb-kodak09.png,41.2613,0.5323,0.5144,0.7644 +Kodak,6x6,ldr-rgb-kodak10.png,40.8140,0.5448,0.5269,0.7463 +Kodak,6x6,ldr-rgb-kodak11.png,37.7541,0.4959,0.4791,0.8207 +Kodak,6x6,ldr-rgb-kodak12.png,41.8249,0.4607,0.4442,0.8852 +Kodak,6x6,ldr-rgb-kodak13.png,32.9256,0.5417,0.5236,0.7510 +Kodak,6x6,ldr-rgb-kodak14.png,36.0211,0.5580,0.5408,0.7271 +Kodak,6x6,ldr-rgb-kodak15.png,39.4513,0.4520,0.4343,0.9054 +Kodak,6x6,ldr-rgb-kodak16.png,41.2290,0.4491,0.4329,0.9083 +Kodak,6x6,ldr-rgb-kodak17.png,39.6521,0.5131,0.4947,0.7949 +Kodak,6x6,ldr-rgb-kodak18.png,35.4328,0.6068,0.5881,0.6686 +Kodak,6x6,ldr-rgb-kodak19.png,38.6954,0.5798,0.5617,0.7001 +Kodak,6x6,ldr-rgb-kodak20.png,40.0953,0.3564,0.3403,1.1554 +Kodak,6x6,ldr-rgb-kodak21.png,37.3344,0.5689,0.5513,0.7132 +Kodak,6x6,ldr-rgb-kodak22.png,37.6231,0.6191,0.6010,0.6543 +Kodak,6x6,ldr-rgb-kodak23.png,41.4033,0.5308,0.5130,0.7665 +Kodak,6x6,ldr-rgb-kodak24.png,35.1417,0.5084,0.4898,0.8028 +Kodak,8x8,ldr-rgb-kodak01.png,31.9071,0.6561,0.6336,0.6206 +Kodak,8x8,ldr-rgb-kodak02.png,36.1354,0.5787,0.5556,0.7077 +Kodak,8x8,ldr-rgb-kodak03.png,38.1744,0.3072,0.2859,1.3754 +Kodak,8x8,ldr-rgb-kodak04.png,36.3637,0.4905,0.4674,0.8413 +Kodak,8x8,ldr-rgb-kodak05.png,30.9005,0.6723,0.6493,0.6056 +Kodak,8x8,ldr-rgb-kodak06.png,33.5749,0.5428,0.5210,0.7548 +Kodak,8x8,ldr-rgb-kodak07.png,36.4888,0.3685,0.3458,1.1372 +Kodak,8x8,ldr-rgb-kodak08.png,30.7484,0.7168,0.6922,0.5681 +Kodak,8x8,ldr-rgb-kodak09.png,37.5499,0.3445,0.3218,1.2219 +Kodak,8x8,ldr-rgb-kodak10.png,37.2288,0.3824,0.3593,1.0943 +Kodak,8x8,ldr-rgb-kodak11.png,33.8276,0.5855,0.5635,0.6978 +Kodak,8x8,ldr-rgb-kodak12.png,38.2490,0.3639,0.3418,1.1503 +Kodak,8x8,ldr-rgb-kodak13.png,28.4500,0.7304,0.7071,0.5561 +Kodak,8x8,ldr-rgb-kodak14.png,32.3258,0.6702,0.6480,0.6068 +Kodak,8x8,ldr-rgb-kodak15.png,36.0605,0.4568,0.4338,0.9065 +Kodak,8x8,ldr-rgb-kodak16.png,37.2636,0.4293,0.4077,0.9644 +Kodak,8x8,ldr-rgb-kodak17.png,35.8722,0.4139,0.3907,1.0063 +Kodak,8x8,ldr-rgb-kodak18.png,31.6494,0.6782,0.6545,0.6008 +Kodak,8x8,ldr-rgb-kodak19.png,34.9142,0.4651,0.4415,0.8907 +Kodak,8x8,ldr-rgb-kodak20.png,36.1470,0.3582,0.3365,1.1685 +Kodak,8x8,ldr-rgb-kodak21.png,33.2221,0.4782,0.4561,0.8621 +Kodak,8x8,ldr-rgb-kodak22.png,34.2203,0.6027,0.5794,0.6787 +Kodak,8x8,ldr-rgb-kodak23.png,38.1785,0.3428,0.3204,1.2274 +Kodak,8x8,ldr-rgb-kodak24.png,31.2174,0.5517,0.5285,0.7440 +Kodak,12x12,ldr-rgb-kodak01.png,27.9058,0.7601,0.7276,0.5404 +Kodak,12x12,ldr-rgb-kodak02.png,32.9642,0.5046,0.4713,0.8344 +Kodak,12x12,ldr-rgb-kodak03.png,34.4219,0.3108,0.2795,1.4071 +Kodak,12x12,ldr-rgb-kodak04.png,32.9599,0.4485,0.4153,0.9468 +Kodak,12x12,ldr-rgb-kodak05.png,26.5928,0.7967,0.7633,0.5151 +Kodak,12x12,ldr-rgb-kodak06.png,29.5304,0.5701,0.5383,0.7305 +Kodak,12x12,ldr-rgb-kodak07.png,32.6108,0.3755,0.3427,1.1473 +Kodak,12x12,ldr-rgb-kodak08.png,26.2752,0.7797,0.7456,0.5274 +Kodak,12x12,ldr-rgb-kodak09.png,33.6251,0.3397,0.3070,1.2810 +Kodak,12x12,ldr-rgb-kodak10.png,32.9828,0.3336,0.3004,1.3091 +Kodak,12x12,ldr-rgb-kodak11.png,30.0467,0.5591,0.5273,0.7458 +Kodak,12x12,ldr-rgb-kodak12.png,34.4395,0.3038,0.2722,1.4445 +Kodak,12x12,ldr-rgb-kodak13.png,24.5820,0.8966,0.8637,0.4553 +Kodak,12x12,ldr-rgb-kodak14.png,28.6295,0.7179,0.6855,0.5736 +Kodak,12x12,ldr-rgb-kodak15.png,32.7197,0.4330,0.3999,0.9833 +Kodak,12x12,ldr-rgb-kodak16.png,33.3355,0.4179,0.3864,1.0175 +Kodak,12x12,ldr-rgb-kodak17.png,32.1412,0.3774,0.3443,1.1422 +Kodak,12x12,ldr-rgb-kodak18.png,27.9215,0.6818,0.6483,0.6066 +Kodak,12x12,ldr-rgb-kodak19.png,31.1014,0.5401,0.5064,0.7765 +Kodak,12x12,ldr-rgb-kodak20.png,32.1471,0.4066,0.3751,1.0482 +Kodak,12x12,ldr-rgb-kodak21.png,29.3170,0.5478,0.5149,0.7637 +Kodak,12x12,ldr-rgb-kodak22.png,30.7805,0.6199,0.5862,0.6708 +Kodak,12x12,ldr-rgb-kodak23.png,34.3635,0.3038,0.2704,1.4539 +Kodak,12x12,ldr-rgb-kodak24.png,27.2288,0.6144,0.5808,0.6770 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-avx2_fast_results.csv new file mode 100644 index 0000000..be09400 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-avx2_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.9520,0.0427,0.0144,27.2197 +Kodak,4x4,ldr-rgb-kodak02.png,44.3434,0.0490,0.0211,18.6402 +Kodak,4x4,ldr-rgb-kodak03.png,46.8392,0.0385,0.0114,34.5809 +Kodak,4x4,ldr-rgb-kodak04.png,44.7718,0.0473,0.0188,20.9404 +Kodak,4x4,ldr-rgb-kodak05.png,41.6993,0.0566,0.0283,13.8833 +Kodak,4x4,ldr-rgb-kodak06.png,44.8560,0.0409,0.0142,27.6741 +Kodak,4x4,ldr-rgb-kodak07.png,45.2328,0.0432,0.0157,24.9946 +Kodak,4x4,ldr-rgb-kodak08.png,42.1952,0.0584,0.0292,13.4451 +Kodak,4x4,ldr-rgb-kodak09.png,46.4561,0.0393,0.0103,38.2244 +Kodak,4x4,ldr-rgb-kodak10.png,46.2386,0.0400,0.0111,35.4376 +Kodak,4x4,ldr-rgb-kodak11.png,44.3773,0.0470,0.0175,22.4415 +Kodak,4x4,ldr-rgb-kodak12.png,47.2692,0.0374,0.0102,38.5244 +Kodak,4x4,ldr-rgb-kodak13.png,41.5422,0.0531,0.0241,16.3255 +Kodak,4x4,ldr-rgb-kodak14.png,41.9751,0.0508,0.0233,16.8988 +Kodak,4x4,ldr-rgb-kodak15.png,44.7350,0.0482,0.0204,19.3102 +Kodak,4x4,ldr-rgb-kodak16.png,47.3501,0.0365,0.0090,43.7878 +Kodak,4x4,ldr-rgb-kodak17.png,45.8448,0.0390,0.0100,39.4128 +Kodak,4x4,ldr-rgb-kodak18.png,41.7291,0.0577,0.0283,13.9162 +Kodak,4x4,ldr-rgb-kodak19.png,44.9590,0.0433,0.0136,28.8788 +Kodak,4x4,ldr-rgb-kodak20.png,46.4220,0.0378,0.0119,33.0210 +Kodak,4x4,ldr-rgb-kodak21.png,44.7256,0.0420,0.0147,26.7205 +Kodak,4x4,ldr-rgb-kodak22.png,43.3125,0.0532,0.0233,16.8740 +Kodak,4x4,ldr-rgb-kodak23.png,45.7203,0.0414,0.0139,28.2341 +Kodak,4x4,ldr-rgb-kodak24.png,42.0603,0.0513,0.0225,17.4430 +Kodak,5x5,ldr-rgb-kodak01.png,39.6458,0.0412,0.0131,29.9567 +Kodak,5x5,ldr-rgb-kodak02.png,40.6591,0.0420,0.0126,31.1259 +Kodak,5x5,ldr-rgb-kodak03.png,43.1469,0.0354,0.0088,44.8670 +Kodak,5x5,ldr-rgb-kodak04.png,41.3472,0.0403,0.0117,33.6681 +Kodak,5x5,ldr-rgb-kodak05.png,37.4898,0.0517,0.0229,17.1996 +Kodak,5x5,ldr-rgb-kodak06.png,40.6532,0.0381,0.0108,36.5545 +Kodak,5x5,ldr-rgb-kodak07.png,41.5669,0.0393,0.0111,35.3586 +Kodak,5x5,ldr-rgb-kodak08.png,37.8105,0.0539,0.0229,17.1650 +Kodak,5x5,ldr-rgb-kodak09.png,42.9723,0.0365,0.0079,49.6558 +Kodak,5x5,ldr-rgb-kodak10.png,42.6976,0.0364,0.0081,48.5278 +Kodak,5x5,ldr-rgb-kodak11.png,40.3588,0.0404,0.0123,31.9502 +Kodak,5x5,ldr-rgb-kodak12.png,43.5782,0.0336,0.0072,54.3112 +Kodak,5x5,ldr-rgb-kodak13.png,36.8536,0.0492,0.0192,20.4365 +Kodak,5x5,ldr-rgb-kodak14.png,38.0505,0.0483,0.0207,18.9612 +Kodak,5x5,ldr-rgb-kodak15.png,41.2611,0.0412,0.0123,31.8810 +Kodak,5x5,ldr-rgb-kodak16.png,43.5297,0.0337,0.0066,59.9777 +Kodak,5x5,ldr-rgb-kodak17.png,42.0758,0.0365,0.0076,52.0060 +Kodak,5x5,ldr-rgb-kodak18.png,38.1330,0.0463,0.0172,22.7991 +Kodak,5x5,ldr-rgb-kodak19.png,41.1974,0.0389,0.0094,41.6461 +Kodak,5x5,ldr-rgb-kodak20.png,42.5501,0.0348,0.0084,46.7784 +Kodak,5x5,ldr-rgb-kodak21.png,40.4645,0.0376,0.0112,35.2092 +Kodak,5x5,ldr-rgb-kodak22.png,39.8284,0.0416,0.0138,28.4651 +Kodak,5x5,ldr-rgb-kodak23.png,42.5557,0.0370,0.0091,43.1294 +Kodak,5x5,ldr-rgb-kodak24.png,37.9277,0.0452,0.0160,24.5193 +Kodak,6x6,ldr-rgb-kodak01.png,35.7681,0.0462,0.0184,21.4182 +Kodak,6x6,ldr-rgb-kodak02.png,38.1838,0.0420,0.0128,30.7132 +Kodak,6x6,ldr-rgb-kodak03.png,40.5884,0.0350,0.0082,47.9007 +Kodak,6x6,ldr-rgb-kodak04.png,38.5847,0.0408,0.0119,33.1045 +Kodak,6x6,ldr-rgb-kodak05.png,34.3775,0.0541,0.0263,14.9587 +Kodak,6x6,ldr-rgb-kodak06.png,37.3251,0.0401,0.0124,31.5909 +Kodak,6x6,ldr-rgb-kodak07.png,38.9125,0.0412,0.0116,34.0413 +Kodak,6x6,ldr-rgb-kodak08.png,34.4660,0.0557,0.0262,14.9837 +Kodak,6x6,ldr-rgb-kodak09.png,40.0146,0.0383,0.0086,45.4908 +Kodak,6x6,ldr-rgb-kodak10.png,39.7566,0.0377,0.0085,46.4412 +Kodak,6x6,ldr-rgb-kodak11.png,37.1602,0.0413,0.0139,28.2971 +Kodak,6x6,ldr-rgb-kodak12.png,40.8079,0.0343,0.0075,52.5060 +Kodak,6x6,ldr-rgb-kodak13.png,32.8173,0.0558,0.0267,14.7150 +Kodak,6x6,ldr-rgb-kodak14.png,35.3132,0.0492,0.0228,17.2326 +Kodak,6x6,ldr-rgb-kodak15.png,38.5842,0.0404,0.0122,32.2305 +Kodak,6x6,ldr-rgb-kodak16.png,40.5096,0.0341,0.0074,53.3536 +Kodak,6x6,ldr-rgb-kodak17.png,38.9123,0.0374,0.0087,44.9759 +Kodak,6x6,ldr-rgb-kodak18.png,35.1244,0.0493,0.0186,21.1144 +Kodak,6x6,ldr-rgb-kodak19.png,38.0059,0.0423,0.0119,33.0601 +Kodak,6x6,ldr-rgb-kodak20.png,39.2852,0.0364,0.0097,40.4917 +Kodak,6x6,ldr-rgb-kodak21.png,36.9296,0.0432,0.0140,28.0426 +Kodak,6x6,ldr-rgb-kodak22.png,37.0116,0.0435,0.0146,27.0124 +Kodak,6x6,ldr-rgb-kodak23.png,40.0841,0.0362,0.0088,44.8866 +Kodak,6x6,ldr-rgb-kodak24.png,34.8195,0.0455,0.0173,22.7476 +Kodak,8x8,ldr-rgb-kodak01.png,31.3453,0.0540,0.0261,15.0542 +Kodak,8x8,ldr-rgb-kodak02.png,34.9512,0.0406,0.0125,31.4398 +Kodak,8x8,ldr-rgb-kodak03.png,36.6269,0.0362,0.0095,41.4920 +Kodak,8x8,ldr-rgb-kodak04.png,35.2101,0.0411,0.0119,32.9379 +Kodak,8x8,ldr-rgb-kodak05.png,30.2661,0.0605,0.0320,12.3057 +Kodak,8x8,ldr-rgb-kodak06.png,32.9625,0.0453,0.0180,21.8296 +Kodak,8x8,ldr-rgb-kodak07.png,35.0121,0.0426,0.0137,28.6645 +Kodak,8x8,ldr-rgb-kodak08.png,29.9795,0.0613,0.0327,12.0132 +Kodak,8x8,ldr-rgb-kodak09.png,36.2005,0.0377,0.0100,39.1425 +Kodak,8x8,ldr-rgb-kodak10.png,35.9067,0.0385,0.0097,40.6714 +Kodak,8x8,ldr-rgb-kodak11.png,33.0195,0.0449,0.0172,22.8257 +Kodak,8x8,ldr-rgb-kodak12.png,36.7730,0.0356,0.0088,44.4511 +Kodak,8x8,ldr-rgb-kodak13.png,28.2241,0.0658,0.0385,10.2205 +Kodak,8x8,ldr-rgb-kodak14.png,31.5140,0.0533,0.0259,15.1873 +Kodak,8x8,ldr-rgb-kodak15.png,34.9651,0.0407,0.0124,31.7931 +Kodak,8x8,ldr-rgb-kodak16.png,36.0662,0.0378,0.0111,35.5430 +Kodak,8x8,ldr-rgb-kodak17.png,34.9200,0.0398,0.0109,36.2245 +Kodak,8x8,ldr-rgb-kodak18.png,31.2513,0.0512,0.0226,17.4120 +Kodak,8x8,ldr-rgb-kodak19.png,34.2511,0.0444,0.0146,26.8479 +Kodak,8x8,ldr-rgb-kodak20.png,35.2908,0.0371,0.0110,35.7992 +Kodak,8x8,ldr-rgb-kodak21.png,32.7669,0.0462,0.0181,21.6900 +Kodak,8x8,ldr-rgb-kodak22.png,33.4684,0.0453,0.0163,24.1892 +Kodak,8x8,ldr-rgb-kodak23.png,36.5644,0.0374,0.0089,44.3113 +Kodak,8x8,ldr-rgb-kodak24.png,30.8378,0.0497,0.0209,18.8169 +Kodak,12x12,ldr-rgb-kodak01.png,27.1171,0.0517,0.0218,18.0508 +Kodak,12x12,ldr-rgb-kodak02.png,31.1137,0.0378,0.0071,55.4301 +Kodak,12x12,ldr-rgb-kodak03.png,32.7143,0.0358,0.0061,64.3541 +Kodak,12x12,ldr-rgb-kodak04.png,31.5844,0.0364,0.0057,68.9724 +Kodak,12x12,ldr-rgb-kodak05.png,25.8311,0.0549,0.0246,15.9754 +Kodak,12x12,ldr-rgb-kodak06.png,28.6467,0.0442,0.0153,25.7577 +Kodak,12x12,ldr-rgb-kodak07.png,30.8796,0.0392,0.0083,47.3927 +Kodak,12x12,ldr-rgb-kodak08.png,25.4259,0.0589,0.0285,13.7966 +Kodak,12x12,ldr-rgb-kodak09.png,31.8485,0.0372,0.0071,55.0637 +Kodak,12x12,ldr-rgb-kodak10.png,31.5514,0.0375,0.0066,59.1835 +Kodak,12x12,ldr-rgb-kodak11.png,28.9467,0.0412,0.0116,33.9181 +Kodak,12x12,ldr-rgb-kodak12.png,32.3174,0.0340,0.0059,66.5564 +Kodak,12x12,ldr-rgb-kodak13.png,24.3235,0.0602,0.0309,12.7436 +Kodak,12x12,ldr-rgb-kodak14.png,27.5493,0.0447,0.0163,24.1280 +Kodak,12x12,ldr-rgb-kodak15.png,31.2816,0.0380,0.0087,44.9441 +Kodak,12x12,ldr-rgb-kodak16.png,31.4940,0.0357,0.0075,52.0882 +Kodak,12x12,ldr-rgb-kodak17.png,30.9034,0.0379,0.0075,52.4209 +Kodak,12x12,ldr-rgb-kodak18.png,27.4301,0.0461,0.0154,25.5419 +Kodak,12x12,ldr-rgb-kodak19.png,30.2006,0.0421,0.0114,34.4963 +Kodak,12x12,ldr-rgb-kodak20.png,31.0717,0.0351,0.0083,47.5993 +Kodak,12x12,ldr-rgb-kodak21.png,28.7263,0.0432,0.0149,26.3091 +Kodak,12x12,ldr-rgb-kodak22.png,29.8492,0.0395,0.0090,43.9289 +Kodak,12x12,ldr-rgb-kodak23.png,32.5453,0.0365,0.0063,62.6336 +Kodak,12x12,ldr-rgb-kodak24.png,26.7832,0.0471,0.0160,24.6082 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-avx2_fastest_results.csv new file mode 100644 index 0000000..a1fb8b4 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-avx2_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.6152,0.0383,0.0103,38.2918 +Kodak,4x4,ldr-rgb-kodak02.png,43.9224,0.0423,0.0137,28.6078 +Kodak,4x4,ldr-rgb-kodak03.png,46.2368,0.0309,0.0082,48.0822 +Kodak,4x4,ldr-rgb-kodak04.png,44.3531,0.0406,0.0123,32.0576 +Kodak,4x4,ldr-rgb-kodak05.png,41.1551,0.0456,0.0167,23.5347 +Kodak,4x4,ldr-rgb-kodak06.png,44.5683,0.0384,0.0101,38.9052 +Kodak,4x4,ldr-rgb-kodak07.png,44.7745,0.0368,0.0102,38.5091 +Kodak,4x4,ldr-rgb-kodak08.png,41.6238,0.0465,0.0173,22.6912 +Kodak,4x4,ldr-rgb-kodak09.png,46.1082,0.0358,0.0078,50.2580 +Kodak,4x4,ldr-rgb-kodak10.png,45.8847,0.0363,0.0081,48.7920 +Kodak,4x4,ldr-rgb-kodak11.png,43.9616,0.0379,0.0114,34.5744 +Kodak,4x4,ldr-rgb-kodak12.png,46.7087,0.0337,0.0077,51.0736 +Kodak,4x4,ldr-rgb-kodak13.png,41.2762,0.0449,0.0158,24.9093 +Kodak,4x4,ldr-rgb-kodak14.png,41.3103,0.0414,0.0137,28.7464 +Kodak,4x4,ldr-rgb-kodak15.png,44.2711,0.0406,0.0128,30.6601 +Kodak,4x4,ldr-rgb-kodak16.png,47.2082,0.0326,0.0072,54.2826 +Kodak,4x4,ldr-rgb-kodak17.png,45.6054,0.0354,0.0077,50.8829 +Kodak,4x4,ldr-rgb-kodak18.png,41.3844,0.0456,0.0169,23.3168 +Kodak,4x4,ldr-rgb-kodak19.png,44.6830,0.0384,0.0098,40.1526 +Kodak,4x4,ldr-rgb-kodak20.png,45.9296,0.0336,0.0084,46.6897 +Kodak,4x4,ldr-rgb-kodak21.png,44.3989,0.0378,0.0102,38.4642 +Kodak,4x4,ldr-rgb-kodak22.png,42.9303,0.0435,0.0147,26.7530 +Kodak,4x4,ldr-rgb-kodak23.png,45.4033,0.0377,0.0098,39.9242 +Kodak,4x4,ldr-rgb-kodak24.png,41.4983,0.0421,0.0137,28.6058 +Kodak,5x5,ldr-rgb-kodak01.png,39.4204,0.0383,0.0108,36.4592 +Kodak,5x5,ldr-rgb-kodak02.png,40.4373,0.0385,0.0099,39.9077 +Kodak,5x5,ldr-rgb-kodak03.png,42.7911,0.0325,0.0067,58.4184 +Kodak,5x5,ldr-rgb-kodak04.png,40.9568,0.0375,0.0093,42.2672 +Kodak,5x5,ldr-rgb-kodak05.png,37.1419,0.0450,0.0160,24.5855 +Kodak,5x5,ldr-rgb-kodak06.png,40.4991,0.0360,0.0090,43.6568 +Kodak,5x5,ldr-rgb-kodak07.png,41.2599,0.0368,0.0088,44.7247 +Kodak,5x5,ldr-rgb-kodak08.png,37.4816,0.0460,0.0163,24.1580 +Kodak,5x5,ldr-rgb-kodak09.png,42.6721,0.0345,0.0065,60.5125 +Kodak,5x5,ldr-rgb-kodak10.png,42.5051,0.0356,0.0067,58.2801 +Kodak,5x5,ldr-rgb-kodak11.png,40.1347,0.0381,0.0098,40.2683 +Kodak,5x5,ldr-rgb-kodak12.png,43.3587,0.0319,0.0061,64.6087 +Kodak,5x5,ldr-rgb-kodak13.png,36.7643,0.0433,0.0152,25.8356 +Kodak,5x5,ldr-rgb-kodak14.png,37.6133,0.0404,0.0131,30.0233 +Kodak,5x5,ldr-rgb-kodak15.png,40.9873,0.0372,0.0093,42.1452 +Kodak,5x5,ldr-rgb-kodak16.png,43.4448,0.0291,0.0060,65.3382 +Kodak,5x5,ldr-rgb-kodak17.png,41.9440,0.0349,0.0066,59.8319 +Kodak,5x5,ldr-rgb-kodak18.png,37.9804,0.0421,0.0128,30.7006 +Kodak,5x5,ldr-rgb-kodak19.png,40.9586,0.0371,0.0082,47.6805 +Kodak,5x5,ldr-rgb-kodak20.png,42.2591,0.0326,0.0070,56.5612 +Kodak,5x5,ldr-rgb-kodak21.png,40.2790,0.0361,0.0093,42.1861 +Kodak,5x5,ldr-rgb-kodak22.png,39.5517,0.0398,0.0102,38.5019 +Kodak,5x5,ldr-rgb-kodak23.png,42.2620,0.0348,0.0077,51.2004 +Kodak,5x5,ldr-rgb-kodak24.png,37.7277,0.0400,0.0117,33.5394 +Kodak,6x6,ldr-rgb-kodak01.png,35.6776,0.0419,0.0139,28.1936 +Kodak,6x6,ldr-rgb-kodak02.png,38.0867,0.0379,0.0094,41.8224 +Kodak,6x6,ldr-rgb-kodak03.png,40.4245,0.0327,0.0065,60.1440 +Kodak,6x6,ldr-rgb-kodak04.png,38.3897,0.0348,0.0090,43.8169 +Kodak,6x6,ldr-rgb-kodak05.png,34.1774,0.0468,0.0176,22.2835 +Kodak,6x6,ldr-rgb-kodak06.png,37.2675,0.0374,0.0099,39.5233 +Kodak,6x6,ldr-rgb-kodak07.png,38.7256,0.0370,0.0086,45.9048 +Kodak,6x6,ldr-rgb-kodak08.png,34.2713,0.0472,0.0180,21.8710 +Kodak,6x6,ldr-rgb-kodak09.png,39.8360,0.0347,0.0070,56.5457 +Kodak,6x6,ldr-rgb-kodak10.png,39.6271,0.0350,0.0068,57.8934 +Kodak,6x6,ldr-rgb-kodak11.png,37.0482,0.0378,0.0101,38.7598 +Kodak,6x6,ldr-rgb-kodak12.png,40.6772,0.0325,0.0061,64.7381 +Kodak,6x6,ldr-rgb-kodak13.png,32.7550,0.0480,0.0195,20.1661 +Kodak,6x6,ldr-rgb-kodak14.png,35.0224,0.0420,0.0141,27.8720 +Kodak,6x6,ldr-rgb-kodak15.png,38.4599,0.0365,0.0092,42.6619 +Kodak,6x6,ldr-rgb-kodak16.png,40.4730,0.0332,0.0063,62.7742 +Kodak,6x6,ldr-rgb-kodak17.png,38.8345,0.0357,0.0073,53.8571 +Kodak,6x6,ldr-rgb-kodak18.png,35.0306,0.0431,0.0136,28.9325 +Kodak,6x6,ldr-rgb-kodak19.png,37.8819,0.0385,0.0097,40.4579 +Kodak,6x6,ldr-rgb-kodak20.png,39.1418,0.0337,0.0074,53.1799 +Kodak,6x6,ldr-rgb-kodak21.png,36.8511,0.0368,0.0106,37.0680 +Kodak,6x6,ldr-rgb-kodak22.png,36.9051,0.0406,0.0109,36.2206 +Kodak,6x6,ldr-rgb-kodak23.png,39.9301,0.0338,0.0069,57.0523 +Kodak,6x6,ldr-rgb-kodak24.png,34.7436,0.0402,0.0125,31.4098 +Kodak,8x8,ldr-rgb-kodak01.png,31.2082,0.0484,0.0196,20.0200 +Kodak,8x8,ldr-rgb-kodak02.png,34.8017,0.0390,0.0096,40.7901 +Kodak,8x8,ldr-rgb-kodak03.png,36.4985,0.0339,0.0075,52.7732 +Kodak,8x8,ldr-rgb-kodak04.png,35.1022,0.0382,0.0094,41.7557 +Kodak,8x8,ldr-rgb-kodak05.png,30.0751,0.0529,0.0238,16.5161 +Kodak,8x8,ldr-rgb-kodak06.png,32.8281,0.0419,0.0139,28.3175 +Kodak,8x8,ldr-rgb-kodak07.png,34.8646,0.0390,0.0106,37.0081 +Kodak,8x8,ldr-rgb-kodak08.png,29.7289,0.0578,0.0249,15.8095 +Kodak,8x8,ldr-rgb-kodak09.png,35.9623,0.0347,0.0080,49.0168 +Kodak,8x8,ldr-rgb-kodak10.png,35.7575,0.0364,0.0078,50.4132 +Kodak,8x8,ldr-rgb-kodak11.png,32.8944,0.0418,0.0132,29.7755 +Kodak,8x8,ldr-rgb-kodak12.png,36.5619,0.0345,0.0074,52.9936 +Kodak,8x8,ldr-rgb-kodak13.png,28.1501,0.0569,0.0279,14.1050 +Kodak,8x8,ldr-rgb-kodak14.png,31.3321,0.0455,0.0187,21.0750 +Kodak,8x8,ldr-rgb-kodak15.png,34.7918,0.0373,0.0096,40.7649 +Kodak,8x8,ldr-rgb-kodak16.png,35.9809,0.0356,0.0088,44.5014 +Kodak,8x8,ldr-rgb-kodak17.png,34.7507,0.0383,0.0086,45.6481 +Kodak,8x8,ldr-rgb-kodak18.png,31.1839,0.0461,0.0168,23.3766 +Kodak,8x8,ldr-rgb-kodak19.png,33.9323,0.0412,0.0116,33.8304 +Kodak,8x8,ldr-rgb-kodak20.png,35.1250,0.0356,0.0088,44.9245 +Kodak,8x8,ldr-rgb-kodak21.png,32.6633,0.0407,0.0137,28.8026 +Kodak,8x8,ldr-rgb-kodak22.png,33.3552,0.0419,0.0123,31.9298 +Kodak,8x8,ldr-rgb-kodak23.png,36.4364,0.0352,0.0069,57.3120 +Kodak,8x8,ldr-rgb-kodak24.png,30.7663,0.0469,0.0167,23.5984 +Kodak,12x12,ldr-rgb-kodak01.png,27.0008,0.0451,0.0171,23.0084 +Kodak,12x12,ldr-rgb-kodak02.png,31.0415,0.0357,0.0056,70.2055 +Kodak,12x12,ldr-rgb-kodak03.png,32.6513,0.0330,0.0051,77.4959 +Kodak,12x12,ldr-rgb-kodak04.png,31.4912,0.0344,0.0049,79.6440 +Kodak,12x12,ldr-rgb-kodak05.png,25.7162,0.0483,0.0180,21.8394 +Kodak,12x12,ldr-rgb-kodak06.png,28.4959,0.0411,0.0113,34.7302 +Kodak,12x12,ldr-rgb-kodak07.png,30.8219,0.0370,0.0067,59.1114 +Kodak,12x12,ldr-rgb-kodak08.png,25.2268,0.0525,0.0210,18.7557 +Kodak,12x12,ldr-rgb-kodak09.png,31.6541,0.0360,0.0058,68.1741 +Kodak,12x12,ldr-rgb-kodak10.png,31.4641,0.0359,0.0055,70.8631 +Kodak,12x12,ldr-rgb-kodak11.png,28.8804,0.0380,0.0089,44.1867 +Kodak,12x12,ldr-rgb-kodak12.png,32.2096,0.0331,0.0051,77.3469 +Kodak,12x12,ldr-rgb-kodak13.png,24.2505,0.0535,0.0223,17.6479 +Kodak,12x12,ldr-rgb-kodak14.png,27.4640,0.0407,0.0123,32.0333 +Kodak,12x12,ldr-rgb-kodak15.png,31.1808,0.0369,0.0069,57.3359 +Kodak,12x12,ldr-rgb-kodak16.png,31.3728,0.0348,0.0061,63.9896 +Kodak,12x12,ldr-rgb-kodak17.png,30.8456,0.0364,0.0061,64.9216 +Kodak,12x12,ldr-rgb-kodak18.png,27.3784,0.0434,0.0115,34.1867 +Kodak,12x12,ldr-rgb-kodak19.png,29.8837,0.0404,0.0088,44.6581 +Kodak,12x12,ldr-rgb-kodak20.png,30.9559,0.0339,0.0066,59.2282 +Kodak,12x12,ldr-rgb-kodak21.png,28.6284,0.0407,0.0111,35.4635 +Kodak,12x12,ldr-rgb-kodak22.png,29.7698,0.0382,0.0071,55.4133 +Kodak,12x12,ldr-rgb-kodak23.png,32.4950,0.0339,0.0052,75.8528 +Kodak,12x12,ldr-rgb-kodak24.png,26.7119,0.0423,0.0121,32.4864 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-avx2_medium_results.csv new file mode 100644 index 0000000..9403b69 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-avx2_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.3900,0.0961,0.0696,5.6487 +Kodak,4x4,ldr-rgb-kodak02.png,45.5266,0.1386,0.1116,3.5221 +Kodak,4x4,ldr-rgb-kodak03.png,47.8390,0.0784,0.0532,7.3857 +Kodak,4x4,ldr-rgb-kodak04.png,45.6293,0.1134,0.0856,4.5960 +Kodak,4x4,ldr-rgb-kodak05.png,42.2268,0.1231,0.0953,4.1272 +Kodak,4x4,ldr-rgb-kodak06.png,45.2804,0.0927,0.0664,5.9245 +Kodak,4x4,ldr-rgb-kodak07.png,46.1450,0.0923,0.0656,5.9954 +Kodak,4x4,ldr-rgb-kodak08.png,42.5929,0.1283,0.0997,3.9422 +Kodak,4x4,ldr-rgb-kodak09.png,47.3636,0.1117,0.0846,4.6465 +Kodak,4x4,ldr-rgb-kodak10.png,47.0403,0.1122,0.0846,4.6468 +Kodak,4x4,ldr-rgb-kodak11.png,44.9930,0.1088,0.0816,4.8205 +Kodak,4x4,ldr-rgb-kodak12.png,48.1508,0.0869,0.0614,6.4011 +Kodak,4x4,ldr-rgb-kodak13.png,41.7091,0.1016,0.0736,5.3456 +Kodak,4x4,ldr-rgb-kodak14.png,42.7747,0.1147,0.0877,4.4838 +Kodak,4x4,ldr-rgb-kodak15.png,45.6063,0.1025,0.0750,5.2451 +Kodak,4x4,ldr-rgb-kodak16.png,48.0286,0.0853,0.0599,6.5655 +Kodak,4x4,ldr-rgb-kodak17.png,46.4272,0.1014,0.0737,5.3385 +Kodak,4x4,ldr-rgb-kodak18.png,42.1025,0.1379,0.1092,3.6019 +Kodak,4x4,ldr-rgb-kodak19.png,45.4882,0.1129,0.0853,4.6082 +Kodak,4x4,ldr-rgb-kodak20.png,46.9603,0.0759,0.0506,7.7703 +Kodak,4x4,ldr-rgb-kodak21.png,45.3041,0.1104,0.0869,4.5262 +Kodak,4x4,ldr-rgb-kodak22.png,43.9220,0.1393,0.1113,3.5338 +Kodak,4x4,ldr-rgb-kodak23.png,47.0296,0.1160,0.0887,4.4348 +Kodak,4x4,ldr-rgb-kodak24.png,42.4676,0.1097,0.0823,4.7771 +Kodak,5x5,ldr-rgb-kodak01.png,40.1428,0.0946,0.0674,5.8304 +Kodak,5x5,ldr-rgb-kodak02.png,41.8098,0.1065,0.0799,4.9209 +Kodak,5x5,ldr-rgb-kodak03.png,44.1564,0.0589,0.0337,11.6685 +Kodak,5x5,ldr-rgb-kodak04.png,42.1557,0.0853,0.0580,6.7831 +Kodak,5x5,ldr-rgb-kodak05.png,38.0375,0.1093,0.0819,4.7984 +Kodak,5x5,ldr-rgb-kodak06.png,41.0310,0.0789,0.0527,7.4610 +Kodak,5x5,ldr-rgb-kodak07.png,42.5449,0.0722,0.0456,8.6234 +Kodak,5x5,ldr-rgb-kodak08.png,38.3909,0.1124,0.0836,4.7039 +Kodak,5x5,ldr-rgb-kodak09.png,43.8761,0.0651,0.0387,10.1609 +Kodak,5x5,ldr-rgb-kodak10.png,43.4926,0.0704,0.0435,9.0391 +Kodak,5x5,ldr-rgb-kodak11.png,40.9014,0.0887,0.0628,6.2648 +Kodak,5x5,ldr-rgb-kodak12.png,44.5087,0.0588,0.0339,11.6161 +Kodak,5x5,ldr-rgb-kodak13.png,36.9547,0.0967,0.0686,5.7283 +Kodak,5x5,ldr-rgb-kodak14.png,38.7244,0.0995,0.0726,5.4133 +Kodak,5x5,ldr-rgb-kodak15.png,41.9961,0.0822,0.0551,7.1395 +Kodak,5x5,ldr-rgb-kodak16.png,44.2004,0.0624,0.0368,10.6716 +Kodak,5x5,ldr-rgb-kodak17.png,42.5924,0.0656,0.0382,10.2807 +Kodak,5x5,ldr-rgb-kodak18.png,38.4191,0.1054,0.0776,5.0695 +Kodak,5x5,ldr-rgb-kodak19.png,41.7153,0.0775,0.0499,7.8774 +Kodak,5x5,ldr-rgb-kodak20.png,43.1410,0.0589,0.0340,11.5781 +Kodak,5x5,ldr-rgb-kodak21.png,40.8178,0.0782,0.0526,7.4746 +Kodak,5x5,ldr-rgb-kodak22.png,40.3445,0.1042,0.0760,5.1755 +Kodak,5x5,ldr-rgb-kodak23.png,43.6620,0.0759,0.0496,7.9274 +Kodak,5x5,ldr-rgb-kodak24.png,38.2488,0.0889,0.0615,6.3894 +Kodak,6x6,ldr-rgb-kodak01.png,36.2113,0.0942,0.0673,5.8468 +Kodak,6x6,ldr-rgb-kodak02.png,39.0614,0.0869,0.0595,6.6046 +Kodak,6x6,ldr-rgb-kodak03.png,41.3770,0.0515,0.0264,14.9206 +Kodak,6x6,ldr-rgb-kodak04.png,39.4395,0.0760,0.0480,8.1954 +Kodak,6x6,ldr-rgb-kodak05.png,34.8184,0.1048,0.0776,5.0662 +Kodak,6x6,ldr-rgb-kodak06.png,37.6639,0.0707,0.0450,8.7446 +Kodak,6x6,ldr-rgb-kodak07.png,39.8300,0.0644,0.0374,10.5048 +Kodak,6x6,ldr-rgb-kodak08.png,34.9957,0.1079,0.0794,4.9522 +Kodak,6x6,ldr-rgb-kodak09.png,40.9226,0.0543,0.0273,14.3914 +Kodak,6x6,ldr-rgb-kodak10.png,40.5493,0.0563,0.0291,13.4959 +Kodak,6x6,ldr-rgb-kodak11.png,37.6100,0.0771,0.0510,7.7036 +Kodak,6x6,ldr-rgb-kodak12.png,41.5485,0.0500,0.0247,15.9436 +Kodak,6x6,ldr-rgb-kodak13.png,32.9142,0.1043,0.0751,5.2372 +Kodak,6x6,ldr-rgb-kodak14.png,35.8636,0.0937,0.0667,5.8965 +Kodak,6x6,ldr-rgb-kodak15.png,39.2411,0.0744,0.0475,8.2761 +Kodak,6x6,ldr-rgb-kodak16.png,41.0644,0.0538,0.0285,13.8034 +Kodak,6x6,ldr-rgb-kodak17.png,39.4963,0.0568,0.0293,13.4135 +Kodak,6x6,ldr-rgb-kodak18.png,35.3775,0.0948,0.0665,5.9096 +Kodak,6x6,ldr-rgb-kodak19.png,38.5482,0.0698,0.0421,9.3465 +Kodak,6x6,ldr-rgb-kodak20.png,39.8612,0.0551,0.0302,13.0273 +Kodak,6x6,ldr-rgb-kodak21.png,37.2219,0.0698,0.0438,8.9743 +Kodak,6x6,ldr-rgb-kodak22.png,37.4990,0.0881,0.0603,6.5180 +Kodak,6x6,ldr-rgb-kodak23.png,41.0323,0.0588,0.0328,11.9975 +Kodak,6x6,ldr-rgb-kodak24.png,35.0904,0.0796,0.0525,7.4913 +Kodak,8x8,ldr-rgb-kodak01.png,31.8088,0.1217,0.0945,4.1611 +Kodak,8x8,ldr-rgb-kodak02.png,35.8041,0.0869,0.0593,6.6284 +Kodak,8x8,ldr-rgb-kodak03.png,37.7807,0.0597,0.0338,11.6312 +Kodak,8x8,ldr-rgb-kodak04.png,36.1152,0.0812,0.0534,7.3651 +Kodak,8x8,ldr-rgb-kodak05.png,30.7592,0.1324,0.1040,3.7816 +Kodak,8x8,ldr-rgb-kodak06.png,33.4597,0.0862,0.0598,6.5794 +Kodak,8x8,ldr-rgb-kodak07.png,36.1791,0.0750,0.0472,8.3299 +Kodak,8x8,ldr-rgb-kodak08.png,30.5504,0.1346,0.1055,3.7269 +Kodak,8x8,ldr-rgb-kodak09.png,37.2788,0.0612,0.0339,11.6140 +Kodak,8x8,ldr-rgb-kodak10.png,36.9460,0.0625,0.0342,11.4985 +Kodak,8x8,ldr-rgb-kodak11.png,33.6799,0.0888,0.0624,6.3058 +Kodak,8x8,ldr-rgb-kodak12.png,37.8704,0.0585,0.0324,12.1210 +Kodak,8x8,ldr-rgb-kodak13.png,28.4023,0.1307,0.1025,3.8359 +Kodak,8x8,ldr-rgb-kodak14.png,32.1597,0.1146,0.0872,4.5112 +Kodak,8x8,ldr-rgb-kodak15.png,35.8630,0.0758,0.0483,8.1435 +Kodak,8x8,ldr-rgb-kodak16.png,37.0443,0.0638,0.0378,10.3891 +Kodak,8x8,ldr-rgb-kodak17.png,35.6841,0.0651,0.0374,10.5141 +Kodak,8x8,ldr-rgb-kodak18.png,31.5638,0.1077,0.0788,4.9883 +Kodak,8x8,ldr-rgb-kodak19.png,34.7826,0.0804,0.0517,7.6123 +Kodak,8x8,ldr-rgb-kodak20.png,35.9506,0.0651,0.0390,10.0706 +Kodak,8x8,ldr-rgb-kodak21.png,33.1239,0.0842,0.0577,6.8178 +Kodak,8x8,ldr-rgb-kodak22.png,34.0587,0.0950,0.0665,5.9124 +Kodak,8x8,ldr-rgb-kodak23.png,37.7041,0.0614,0.0343,11.4610 +Kodak,8x8,ldr-rgb-kodak24.png,31.1428,0.0933,0.0653,6.0219 +Kodak,12x12,ldr-rgb-kodak01.png,27.7593,0.1325,0.1034,3.8027 +Kodak,12x12,ldr-rgb-kodak02.png,32.4650,0.0700,0.0414,9.5049 +Kodak,12x12,ldr-rgb-kodak03.png,33.8493,0.0548,0.0275,14.2832 +Kodak,12x12,ldr-rgb-kodak04.png,32.4639,0.0634,0.0338,11.6364 +Kodak,12x12,ldr-rgb-kodak05.png,26.4050,0.1442,0.1145,3.4346 +Kodak,12x12,ldr-rgb-kodak06.png,29.3844,0.0895,0.0615,6.3898 +Kodak,12x12,ldr-rgb-kodak07.png,32.0587,0.0734,0.0445,8.8319 +Kodak,12x12,ldr-rgb-kodak08.png,26.0674,0.1496,0.1187,3.3116 +Kodak,12x12,ldr-rgb-kodak09.png,33.1166,0.0588,0.0295,13.3193 +Kodak,12x12,ldr-rgb-kodak10.png,32.5013,0.0590,0.0291,13.5214 +Kodak,12x12,ldr-rgb-kodak11.png,29.7620,0.0859,0.0577,6.8090 +Kodak,12x12,ldr-rgb-kodak12.png,33.9091,0.0550,0.0270,14.5387 +Kodak,12x12,ldr-rgb-kodak13.png,24.5329,0.1483,0.1185,3.3186 +Kodak,12x12,ldr-rgb-kodak14.png,28.4363,0.1157,0.0879,4.4734 +Kodak,12x12,ldr-rgb-kodak15.png,32.2535,0.0701,0.0412,9.5529 +Kodak,12x12,ldr-rgb-kodak16.png,32.9949,0.0600,0.0325,12.1035 +Kodak,12x12,ldr-rgb-kodak17.png,31.7945,0.0625,0.0329,11.9435 +Kodak,12x12,ldr-rgb-kodak18.png,27.7879,0.1055,0.0750,5.2463 +Kodak,12x12,ldr-rgb-kodak19.png,30.9041,0.0773,0.0473,8.3048 +Kodak,12x12,ldr-rgb-kodak20.png,31.8897,0.0621,0.0349,11.2543 +Kodak,12x12,ldr-rgb-kodak21.png,29.1922,0.0926,0.0642,6.1272 +Kodak,12x12,ldr-rgb-kodak22.png,30.5213,0.0827,0.0530,7.4213 +Kodak,12x12,ldr-rgb-kodak23.png,33.5912,0.0529,0.0239,16.4450 +Kodak,12x12,ldr-rgb-kodak24.png,27.1145,0.0950,0.0646,6.0855 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-avx2_thorough_results.csv new file mode 100644 index 0000000..282d397 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-avx2_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.5922,0.1953,0.1685,2.3334 +Kodak,4x4,ldr-rgb-kodak02.png,45.8028,0.2731,0.2455,1.6016 +Kodak,4x4,ldr-rgb-kodak03.png,48.2430,0.2115,0.1856,2.1182 +Kodak,4x4,ldr-rgb-kodak04.png,45.8232,0.2457,0.2181,1.8032 +Kodak,4x4,ldr-rgb-kodak05.png,42.4987,0.2419,0.2136,1.8407 +Kodak,4x4,ldr-rgb-kodak06.png,45.4846,0.2019,0.1750,2.2469 +Kodak,4x4,ldr-rgb-kodak07.png,46.5250,0.2341,0.2070,1.8998 +Kodak,4x4,ldr-rgb-kodak08.png,42.8951,0.2529,0.2237,1.7579 +Kodak,4x4,ldr-rgb-kodak09.png,47.6390,0.2543,0.2271,1.7317 +Kodak,4x4,ldr-rgb-kodak10.png,47.2881,0.2525,0.2248,1.7495 +Kodak,4x4,ldr-rgb-kodak11.png,45.2534,0.2251,0.1993,1.9727 +Kodak,4x4,ldr-rgb-kodak12.png,48.4737,0.2211,0.1957,2.0092 +Kodak,4x4,ldr-rgb-kodak13.png,41.8173,0.1984,0.1733,2.2685 +Kodak,4x4,ldr-rgb-kodak14.png,43.0369,0.2277,0.2010,1.9561 +Kodak,4x4,ldr-rgb-kodak15.png,45.9032,0.2388,0.2116,1.8583 +Kodak,4x4,ldr-rgb-kodak16.png,48.2456,0.2143,0.1888,2.0830 +Kodak,4x4,ldr-rgb-kodak17.png,46.6010,0.2325,0.2073,1.8966 +Kodak,4x4,ldr-rgb-kodak18.png,42.2712,0.2676,0.2403,1.6362 +Kodak,4x4,ldr-rgb-kodak19.png,45.7045,0.2426,0.2172,1.8101 +Kodak,4x4,ldr-rgb-kodak20.png,47.2404,0.1657,0.1399,2.8099 +Kodak,4x4,ldr-rgb-kodak21.png,45.4559,0.2420,0.2158,1.8225 +Kodak,4x4,ldr-rgb-kodak22.png,44.1146,0.2750,0.2476,1.5884 +Kodak,4x4,ldr-rgb-kodak23.png,47.3579,0.2627,0.2373,1.6572 +Kodak,4x4,ldr-rgb-kodak24.png,42.6976,0.2376,0.2095,1.8765 +Kodak,5x5,ldr-rgb-kodak01.png,40.2582,0.2168,0.1892,2.0784 +Kodak,5x5,ldr-rgb-kodak02.png,42.0902,0.2802,0.2553,1.5403 +Kodak,5x5,ldr-rgb-kodak03.png,44.4690,0.2148,0.1912,2.0569 +Kodak,5x5,ldr-rgb-kodak04.png,42.3451,0.2380,0.2099,1.8736 +Kodak,5x5,ldr-rgb-kodak05.png,38.2336,0.2532,0.2252,1.7463 +Kodak,5x5,ldr-rgb-kodak06.png,41.1423,0.2039,0.1771,2.2208 +Kodak,5x5,ldr-rgb-kodak07.png,42.8235,0.2362,0.2101,1.8714 +Kodak,5x5,ldr-rgb-kodak08.png,38.5691,0.2534,0.2240,1.7552 +Kodak,5x5,ldr-rgb-kodak09.png,44.1096,0.2323,0.2071,1.8987 +Kodak,5x5,ldr-rgb-kodak10.png,43.6852,0.2399,0.2117,1.8571 +Kodak,5x5,ldr-rgb-kodak11.png,41.0686,0.2292,0.2028,1.9387 +Kodak,5x5,ldr-rgb-kodak12.png,44.7130,0.2174,0.1916,2.0520 +Kodak,5x5,ldr-rgb-kodak13.png,37.0068,0.1992,0.1706,2.3043 +Kodak,5x5,ldr-rgb-kodak14.png,38.9474,0.2342,0.2069,1.9001 +Kodak,5x5,ldr-rgb-kodak15.png,42.2161,0.2361,0.2089,1.8827 +Kodak,5x5,ldr-rgb-kodak16.png,44.3498,0.2116,0.1859,2.1156 +Kodak,5x5,ldr-rgb-kodak17.png,42.6976,0.2225,0.1947,2.0191 +Kodak,5x5,ldr-rgb-kodak18.png,38.5158,0.2570,0.2289,1.7179 +Kodak,5x5,ldr-rgb-kodak19.png,41.8549,0.2395,0.2109,1.8641 +Kodak,5x5,ldr-rgb-kodak20.png,43.3603,0.1553,0.1297,3.0312 +Kodak,5x5,ldr-rgb-kodak21.png,40.9302,0.2435,0.2166,1.8156 +Kodak,5x5,ldr-rgb-kodak22.png,40.4958,0.2740,0.2461,1.5978 +Kodak,5x5,ldr-rgb-kodak23.png,43.9970,0.2723,0.2452,1.6040 +Kodak,5x5,ldr-rgb-kodak24.png,38.3771,0.2399,0.2115,1.8588 +Kodak,6x6,ldr-rgb-kodak01.png,36.3296,0.2379,0.2109,1.8647 +Kodak,6x6,ldr-rgb-kodak02.png,39.4323,0.3003,0.2736,1.4372 +Kodak,6x6,ldr-rgb-kodak03.png,41.8030,0.1916,0.1659,2.3697 +Kodak,6x6,ldr-rgb-kodak04.png,39.7105,0.2462,0.2180,1.8034 +Kodak,6x6,ldr-rgb-kodak05.png,35.0194,0.2694,0.2438,1.6130 +Kodak,6x6,ldr-rgb-kodak06.png,37.7820,0.2139,0.1877,2.0951 +Kodak,6x6,ldr-rgb-kodak07.png,40.1759,0.2191,0.1916,2.0518 +Kodak,6x6,ldr-rgb-kodak08.png,35.1892,0.2658,0.2386,1.6483 +Kodak,6x6,ldr-rgb-kodak09.png,41.3074,0.2327,0.2060,1.9089 +Kodak,6x6,ldr-rgb-kodak10.png,40.8881,0.2474,0.2223,1.7687 +Kodak,6x6,ldr-rgb-kodak11.png,37.8001,0.2356,0.2093,1.8789 +Kodak,6x6,ldr-rgb-kodak12.png,41.8937,0.2183,0.1922,2.0456 +Kodak,6x6,ldr-rgb-kodak13.png,32.9664,0.2259,0.1974,1.9920 +Kodak,6x6,ldr-rgb-kodak14.png,36.0648,0.2563,0.2286,1.7203 +Kodak,6x6,ldr-rgb-kodak15.png,39.4992,0.2213,0.1963,2.0034 +Kodak,6x6,ldr-rgb-kodak16.png,41.2652,0.2049,0.1787,2.2004 +Kodak,6x6,ldr-rgb-kodak17.png,39.7005,0.2302,0.2024,1.9432 +Kodak,6x6,ldr-rgb-kodak18.png,35.4652,0.2731,0.2431,1.6175 +Kodak,6x6,ldr-rgb-kodak19.png,38.7403,0.2561,0.2280,1.7250 +Kodak,6x6,ldr-rgb-kodak20.png,40.1606,0.1616,0.1362,2.8872 +Kodak,6x6,ldr-rgb-kodak21.png,37.3715,0.2544,0.2274,1.7291 +Kodak,6x6,ldr-rgb-kodak22.png,37.6700,0.2877,0.2608,1.5079 +Kodak,6x6,ldr-rgb-kodak23.png,41.4972,0.2714,0.2444,1.6087 +Kodak,6x6,ldr-rgb-kodak24.png,35.2077,0.2443,0.2163,1.8175 +Kodak,8x8,ldr-rgb-kodak01.png,31.9182,0.2927,0.2645,1.4868 +Kodak,8x8,ldr-rgb-kodak02.png,36.1788,0.2934,0.2651,1.4831 +Kodak,8x8,ldr-rgb-kodak03.png,38.2256,0.1622,0.1356,2.9009 +Kodak,8x8,ldr-rgb-kodak04.png,36.4047,0.2367,0.2102,1.8703 +Kodak,8x8,ldr-rgb-kodak05.png,30.9271,0.3139,0.2874,1.3684 +Kodak,8x8,ldr-rgb-kodak06.png,33.5892,0.2439,0.2158,1.8217 +Kodak,8x8,ldr-rgb-kodak07.png,36.5323,0.1973,0.1683,2.3360 +Kodak,8x8,ldr-rgb-kodak08.png,30.7450,0.3424,0.3128,1.2570 +Kodak,8x8,ldr-rgb-kodak09.png,37.5746,0.1800,0.1516,2.5930 +Kodak,8x8,ldr-rgb-kodak10.png,37.2611,0.2041,0.1773,2.2180 +Kodak,8x8,ldr-rgb-kodak11.png,33.8471,0.2809,0.2545,1.5450 +Kodak,8x8,ldr-rgb-kodak12.png,38.2959,0.1847,0.1585,2.4802 +Kodak,8x8,ldr-rgb-kodak13.png,28.4658,0.3051,0.2759,1.4253 +Kodak,8x8,ldr-rgb-kodak14.png,32.3355,0.3037,0.2758,1.4258 +Kodak,8x8,ldr-rgb-kodak15.png,36.0844,0.2267,0.1983,1.9833 +Kodak,8x8,ldr-rgb-kodak16.png,37.2854,0.1981,0.1716,2.2914 +Kodak,8x8,ldr-rgb-kodak17.png,35.8833,0.1973,0.1684,2.3344 +Kodak,8x8,ldr-rgb-kodak18.png,31.6609,0.3134,0.2834,1.3873 +Kodak,8x8,ldr-rgb-kodak19.png,34.9459,0.2144,0.1855,2.1199 +Kodak,8x8,ldr-rgb-kodak20.png,36.1871,0.1740,0.1471,2.6726 +Kodak,8x8,ldr-rgb-kodak21.png,33.2364,0.2268,0.1990,1.9757 +Kodak,8x8,ldr-rgb-kodak22.png,34.2428,0.2951,0.2653,1.4821 +Kodak,8x8,ldr-rgb-kodak23.png,38.2266,0.1934,0.1682,2.3375 +Kodak,8x8,ldr-rgb-kodak24.png,31.2516,0.2564,0.2305,1.7063 +Kodak,12x12,ldr-rgb-kodak01.png,27.9177,0.3765,0.3460,1.1366 +Kodak,12x12,ldr-rgb-kodak02.png,33.0100,0.2838,0.2521,1.5597 +Kodak,12x12,ldr-rgb-kodak03.png,34.4665,0.1735,0.1442,2.7271 +Kodak,12x12,ldr-rgb-kodak04.png,32.9831,0.2481,0.2161,1.8200 +Kodak,12x12,ldr-rgb-kodak05.png,26.6116,0.4082,0.3745,1.0500 +Kodak,12x12,ldr-rgb-kodak06.png,29.5405,0.2777,0.2481,1.5849 +Kodak,12x12,ldr-rgb-kodak07.png,32.6427,0.2170,0.1862,2.1123 +Kodak,12x12,ldr-rgb-kodak08.png,26.2689,0.4124,0.3778,1.0408 +Kodak,12x12,ldr-rgb-kodak09.png,33.6395,0.1971,0.1657,2.3736 +Kodak,12x12,ldr-rgb-kodak10.png,33.0011,0.1951,0.1638,2.3999 +Kodak,12x12,ldr-rgb-kodak11.png,30.0591,0.2965,0.2666,1.4749 +Kodak,12x12,ldr-rgb-kodak12.png,34.4608,0.1796,0.1505,2.6133 +Kodak,12x12,ldr-rgb-kodak13.png,24.5896,0.4420,0.4089,0.9616 +Kodak,12x12,ldr-rgb-kodak14.png,28.6523,0.3596,0.3302,1.1910 +Kodak,12x12,ldr-rgb-kodak15.png,32.7473,0.2405,0.2091,1.8806 +Kodak,12x12,ldr-rgb-kodak16.png,33.3428,0.2076,0.1804,2.1801 +Kodak,12x12,ldr-rgb-kodak17.png,32.1405,0.2093,0.1776,2.2141 +Kodak,12x12,ldr-rgb-kodak18.png,27.9302,0.3581,0.3253,1.2089 +Kodak,12x12,ldr-rgb-kodak19.png,31.1152,0.2830,0.2500,1.5730 +Kodak,12x12,ldr-rgb-kodak20.png,32.1883,0.2209,0.1913,2.0555 +Kodak,12x12,ldr-rgb-kodak21.png,29.3322,0.2675,0.2370,1.6592 +Kodak,12x12,ldr-rgb-kodak22.png,30.7936,0.3169,0.2852,1.3786 +Kodak,12x12,ldr-rgb-kodak23.png,34.3943,0.1788,0.1486,2.6453 +Kodak,12x12,ldr-rgb-kodak24.png,27.2471,0.3240,0.2917,1.3481 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-neon_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-neon_fast_results.csv new file mode 100644 index 0000000..6a40ec8 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-neon_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.9520,0.0436,0.0266,14.7826 +Kodak,4x4,ldr-rgb-kodak02.png,44.3434,0.0604,0.0413,9.5145 +Kodak,4x4,ldr-rgb-kodak03.png,46.8392,0.0372,0.0212,18.5592 +Kodak,4x4,ldr-rgb-kodak04.png,44.7718,0.0566,0.0365,10.7595 +Kodak,4x4,ldr-rgb-kodak05.png,41.6993,0.0755,0.0575,6.8336 +Kodak,4x4,ldr-rgb-kodak06.png,44.8560,0.0444,0.0272,14.4681 +Kodak,4x4,ldr-rgb-kodak07.png,45.2328,0.0498,0.0306,12.8641 +Kodak,4x4,ldr-rgb-kodak08.png,42.1952,0.0802,0.0594,6.6237 +Kodak,4x4,ldr-rgb-kodak09.png,46.4561,0.0372,0.0190,20.7129 +Kodak,4x4,ldr-rgb-kodak10.png,46.2386,0.0395,0.0205,19.1486 +Kodak,4x4,ldr-rgb-kodak11.png,44.3773,0.0514,0.0346,11.3528 +Kodak,4x4,ldr-rgb-kodak12.png,47.2692,0.0354,0.0191,20.5432 +Kodak,4x4,ldr-rgb-kodak13.png,41.5422,0.0670,0.0486,8.0870 +Kodak,4x4,ldr-rgb-kodak14.png,41.9751,0.0642,0.0471,8.3537 +Kodak,4x4,ldr-rgb-kodak15.png,44.7350,0.0592,0.0400,9.8240 +Kodak,4x4,ldr-rgb-kodak16.png,47.3501,0.0322,0.0163,24.1015 +Kodak,4x4,ldr-rgb-kodak17.png,45.8448,0.0372,0.0183,21.4802 +Kodak,4x4,ldr-rgb-kodak18.png,41.7291,0.0796,0.0578,6.8008 +Kodak,4x4,ldr-rgb-kodak19.png,44.9590,0.0436,0.0250,15.7406 +Kodak,4x4,ldr-rgb-kodak20.png,46.4220,0.0372,0.0216,18.2383 +Kodak,4x4,ldr-rgb-kodak21.png,44.7256,0.0432,0.0270,14.5651 +Kodak,4x4,ldr-rgb-kodak22.png,43.3125,0.0643,0.0449,8.7522 +Kodak,4x4,ldr-rgb-kodak23.png,45.7203,0.0424,0.0259,15.1996 +Kodak,4x4,ldr-rgb-kodak24.png,42.0603,0.0616,0.0433,9.0840 +Kodak,5x5,ldr-rgb-kodak01.png,39.6458,0.0412,0.0245,16.0392 +Kodak,5x5,ldr-rgb-kodak02.png,40.6591,0.0422,0.0244,16.1148 +Kodak,5x5,ldr-rgb-kodak03.png,43.1469,0.0314,0.0157,25.0359 +Kodak,5x5,ldr-rgb-kodak04.png,41.3472,0.0418,0.0227,17.3483 +Kodak,5x5,ldr-rgb-kodak05.png,37.4898,0.0657,0.0472,8.3321 +Kodak,5x5,ldr-rgb-kodak06.png,40.6532,0.0375,0.0207,18.9730 +Kodak,5x5,ldr-rgb-kodak07.png,41.5669,0.0396,0.0213,18.4540 +Kodak,5x5,ldr-rgb-kodak08.png,37.8105,0.0690,0.0478,8.2225 +Kodak,5x5,ldr-rgb-kodak09.png,42.9723,0.0326,0.0145,27.1990 +Kodak,5x5,ldr-rgb-kodak10.png,42.6976,0.0334,0.0148,26.6316 +Kodak,5x5,ldr-rgb-kodak11.png,40.3588,0.0411,0.0245,16.0602 +Kodak,5x5,ldr-rgb-kodak12.png,43.5782,0.0292,0.0132,29.6855 +Kodak,5x5,ldr-rgb-kodak13.png,36.8536,0.0585,0.0402,9.7918 +Kodak,5x5,ldr-rgb-kodak14.png,38.0505,0.0599,0.0426,9.2207 +Kodak,5x5,ldr-rgb-kodak15.png,41.2611,0.0423,0.0239,16.4456 +Kodak,5x5,ldr-rgb-kodak16.png,43.5297,0.0279,0.0122,32.3316 +Kodak,5x5,ldr-rgb-kodak17.png,42.0758,0.0325,0.0139,28.2641 +Kodak,5x5,ldr-rgb-kodak18.png,38.1330,0.0544,0.0348,11.2919 +Kodak,5x5,ldr-rgb-kodak19.png,41.1974,0.0374,0.0181,21.6900 +Kodak,5x5,ldr-rgb-kodak20.png,42.5501,0.0317,0.0161,24.3510 +Kodak,5x5,ldr-rgb-kodak21.png,40.4645,0.0401,0.0233,16.8994 +Kodak,5x5,ldr-rgb-kodak22.png,39.8284,0.0480,0.0282,13.9266 +Kodak,5x5,ldr-rgb-kodak23.png,42.5557,0.0351,0.0176,22.3266 +Kodak,5x5,ldr-rgb-kodak24.png,37.9277,0.0525,0.0336,11.6907 +Kodak,6x6,ldr-rgb-kodak01.png,35.7681,0.0573,0.0395,9.9541 +Kodak,6x6,ldr-rgb-kodak02.png,38.1838,0.0440,0.0258,15.2574 +Kodak,6x6,ldr-rgb-kodak03.png,40.5884,0.0325,0.0164,24.0117 +Kodak,6x6,ldr-rgb-kodak04.png,38.5847,0.0427,0.0237,16.5969 +Kodak,6x6,ldr-rgb-kodak05.png,34.3775,0.0772,0.0590,6.6666 +Kodak,6x6,ldr-rgb-kodak06.png,37.3251,0.0422,0.0260,15.1295 +Kodak,6x6,ldr-rgb-kodak07.png,38.9125,0.0427,0.0238,16.4890 +Kodak,6x6,ldr-rgb-kodak08.png,34.4660,0.0789,0.0577,6.8168 +Kodak,6x6,ldr-rgb-kodak09.png,40.0146,0.0349,0.0166,23.6705 +Kodak,6x6,ldr-rgb-kodak10.png,39.7566,0.0337,0.0157,25.0839 +Kodak,6x6,ldr-rgb-kodak11.png,37.1602,0.0427,0.0265,14.8243 +Kodak,6x6,ldr-rgb-kodak12.png,40.8079,0.0292,0.0135,29.2092 +Kodak,6x6,ldr-rgb-kodak13.png,32.8173,0.0753,0.0565,6.9633 +Kodak,6x6,ldr-rgb-kodak14.png,35.3132,0.0650,0.0474,8.3037 +Kodak,6x6,ldr-rgb-kodak15.png,38.5842,0.0429,0.0245,16.0510 +Kodak,6x6,ldr-rgb-kodak16.png,40.5096,0.0286,0.0132,29.7460 +Kodak,6x6,ldr-rgb-kodak17.png,38.9123,0.0331,0.0156,25.1321 +Kodak,6x6,ldr-rgb-kodak18.png,35.1244,0.0586,0.0383,10.2595 +Kodak,6x6,ldr-rgb-kodak19.png,38.0059,0.0448,0.0250,15.6973 +Kodak,6x6,ldr-rgb-kodak20.png,39.2852,0.0353,0.0194,20.2563 +Kodak,6x6,ldr-rgb-kodak21.png,36.9296,0.0464,0.0298,13.2035 +Kodak,6x6,ldr-rgb-kodak22.png,37.0116,0.0495,0.0304,12.9263 +Kodak,6x6,ldr-rgb-kodak23.png,40.0841,0.0344,0.0170,23.1424 +Kodak,6x6,ldr-rgb-kodak24.png,34.8195,0.0551,0.0360,10.9257 +Kodak,8x8,ldr-rgb-kodak01.png,31.3453,0.0800,0.0625,6.2866 +Kodak,8x8,ldr-rgb-kodak02.png,34.9512,0.0456,0.0268,14.6969 +Kodak,8x8,ldr-rgb-kodak03.png,36.6269,0.0359,0.0195,20.1587 +Kodak,8x8,ldr-rgb-kodak04.png,35.2101,0.0450,0.0252,15.6074 +Kodak,8x8,ldr-rgb-kodak05.png,30.2661,0.0954,0.0762,5.1590 +Kodak,8x8,ldr-rgb-kodak06.png,32.9625,0.0591,0.0419,9.3830 +Kodak,8x8,ldr-rgb-kodak07.png,35.0121,0.0492,0.0298,13.2005 +Kodak,8x8,ldr-rgb-kodak08.png,29.9795,0.0992,0.0783,5.0227 +Kodak,8x8,ldr-rgb-kodak09.png,36.2005,0.0406,0.0219,17.9477 +Kodak,8x8,ldr-rgb-kodak10.png,35.9067,0.0386,0.0196,20.0385 +Kodak,8x8,ldr-rgb-kodak11.png,33.0195,0.0550,0.0383,10.2797 +Kodak,8x8,ldr-rgb-kodak12.png,36.7730,0.0345,0.0187,21.0457 +Kodak,8x8,ldr-rgb-kodak13.png,28.2241,0.1105,0.0920,4.2753 +Kodak,8x8,ldr-rgb-kodak14.png,31.5140,0.0781,0.0600,6.5522 +Kodak,8x8,ldr-rgb-kodak15.png,34.9651,0.0448,0.0258,15.2197 +Kodak,8x8,ldr-rgb-kodak16.png,36.0662,0.0403,0.0236,16.6541 +Kodak,8x8,ldr-rgb-kodak17.png,34.9200,0.0423,0.0231,17.0532 +Kodak,8x8,ldr-rgb-kodak18.png,31.2513,0.0725,0.0516,7.6132 +Kodak,8x8,ldr-rgb-kodak19.png,34.2511,0.0527,0.0324,12.1188 +Kodak,8x8,ldr-rgb-kodak20.png,35.2908,0.0389,0.0227,17.2993 +Kodak,8x8,ldr-rgb-kodak21.png,32.7669,0.0571,0.0399,9.8506 +Kodak,8x8,ldr-rgb-kodak22.png,33.4684,0.0541,0.0350,11.2328 +Kodak,8x8,ldr-rgb-kodak23.png,36.5644,0.0341,0.0168,23.4754 +Kodak,8x8,ldr-rgb-kodak24.png,30.8378,0.0662,0.0462,8.5044 +Kodak,12x12,ldr-rgb-kodak01.png,27.1171,0.0702,0.0515,7.6302 +Kodak,12x12,ldr-rgb-kodak02.png,31.1137,0.0326,0.0139,28.2869 +Kodak,12x12,ldr-rgb-kodak03.png,32.7143,0.0274,0.0112,35.0081 +Kodak,12x12,ldr-rgb-kodak04.png,31.5844,0.0299,0.0106,37.0364 +Kodak,12x12,ldr-rgb-kodak05.png,25.8311,0.0759,0.0565,6.9645 +Kodak,12x12,ldr-rgb-kodak06.png,28.6467,0.0533,0.0353,11.1481 +Kodak,12x12,ldr-rgb-kodak07.png,30.8796,0.0356,0.0161,24.3492 +Kodak,12x12,ldr-rgb-kodak08.png,25.4259,0.0886,0.0666,5.9022 +Kodak,12x12,ldr-rgb-kodak09.png,31.8485,0.0338,0.0143,27.4480 +Kodak,12x12,ldr-rgb-kodak10.png,31.5514,0.0320,0.0131,29.9665 +Kodak,12x12,ldr-rgb-kodak11.png,28.9467,0.0427,0.0245,16.0235 +Kodak,12x12,ldr-rgb-kodak12.png,32.3174,0.0275,0.0108,36.3651 +Kodak,12x12,ldr-rgb-kodak13.png,24.3235,0.0917,0.0723,5.4363 +Kodak,12x12,ldr-rgb-kodak14.png,27.5493,0.0560,0.0374,10.5060 +Kodak,12x12,ldr-rgb-kodak15.png,31.2816,0.0373,0.0182,21.5805 +Kodak,12x12,ldr-rgb-kodak16.png,31.4940,0.0315,0.0152,25.9466 +Kodak,12x12,ldr-rgb-kodak17.png,30.9034,0.0348,0.0148,26.5023 +Kodak,12x12,ldr-rgb-kodak18.png,27.4301,0.0549,0.0333,11.7962 +Kodak,12x12,ldr-rgb-kodak19.png,30.2006,0.0448,0.0241,16.3383 +Kodak,12x12,ldr-rgb-kodak20.png,31.0717,0.0334,0.0167,23.5613 +Kodak,12x12,ldr-rgb-kodak21.png,28.7263,0.0503,0.0323,12.1588 +Kodak,12x12,ldr-rgb-kodak22.png,29.8492,0.0384,0.0183,21.4989 +Kodak,12x12,ldr-rgb-kodak23.png,32.5453,0.0296,0.0116,33.8485 +Kodak,12x12,ldr-rgb-kodak24.png,26.7832,0.0549,0.0345,11.4079 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-neon_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-neon_fastest_results.csv new file mode 100644 index 0000000..7ea9e3e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-neon_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.6152,0.0308,0.0166,23.6281 +Kodak,4x4,ldr-rgb-kodak02.png,43.9224,0.0383,0.0231,17.0349 +Kodak,4x4,ldr-rgb-kodak03.png,46.2368,0.0261,0.0128,30.8332 +Kodak,4x4,ldr-rgb-kodak04.png,44.3531,0.0367,0.0205,19.2095 +Kodak,4x4,ldr-rgb-kodak05.png,41.1551,0.0437,0.0288,13.6396 +Kodak,4x4,ldr-rgb-kodak06.png,44.5683,0.0305,0.0166,23.6251 +Kodak,4x4,ldr-rgb-kodak07.png,44.7745,0.0329,0.0171,22.9668 +Kodak,4x4,ldr-rgb-kodak08.png,41.6238,0.0465,0.0294,13.3520 +Kodak,4x4,ldr-rgb-kodak09.png,46.1082,0.0277,0.0123,32.0551 +Kodak,4x4,ldr-rgb-kodak10.png,45.8847,0.0290,0.0130,30.2518 +Kodak,4x4,ldr-rgb-kodak11.png,43.9616,0.0331,0.0193,20.3633 +Kodak,4x4,ldr-rgb-kodak12.png,46.7087,0.0253,0.0120,32.8232 +Kodak,4x4,ldr-rgb-kodak13.png,41.2762,0.0423,0.0273,14.3856 +Kodak,4x4,ldr-rgb-kodak14.png,41.3103,0.0373,0.0230,17.0940 +Kodak,4x4,ldr-rgb-kodak15.png,44.2711,0.0365,0.0212,18.5488 +Kodak,4x4,ldr-rgb-kodak16.png,47.2082,0.0246,0.0113,34.8874 +Kodak,4x4,ldr-rgb-kodak17.png,45.6054,0.0282,0.0120,32.6458 +Kodak,4x4,ldr-rgb-kodak18.png,41.3844,0.0459,0.0289,13.5826 +Kodak,4x4,ldr-rgb-kodak19.png,44.6830,0.0323,0.0160,24.5928 +Kodak,4x4,ldr-rgb-kodak20.png,45.9296,0.0264,0.0132,29.7192 +Kodak,4x4,ldr-rgb-kodak21.png,44.3989,0.0309,0.0169,23.2095 +Kodak,4x4,ldr-rgb-kodak22.png,42.9303,0.0406,0.0247,15.9300 +Kodak,4x4,ldr-rgb-kodak23.png,45.4033,0.0307,0.0160,24.6082 +Kodak,4x4,ldr-rgb-kodak24.png,41.4983,0.0388,0.0230,17.0854 +Kodak,5x5,ldr-rgb-kodak01.png,39.4204,0.0322,0.0183,21.5273 +Kodak,5x5,ldr-rgb-kodak02.png,40.4373,0.0314,0.0165,23.8371 +Kodak,5x5,ldr-rgb-kodak03.png,42.7911,0.0239,0.0109,36.1412 +Kodak,5x5,ldr-rgb-kodak04.png,40.9568,0.0314,0.0153,25.6887 +Kodak,5x5,ldr-rgb-kodak05.png,37.1419,0.0421,0.0274,14.3322 +Kodak,5x5,ldr-rgb-kodak06.png,40.4991,0.0284,0.0148,26.6153 +Kodak,5x5,ldr-rgb-kodak07.png,41.2599,0.0300,0.0144,27.2345 +Kodak,5x5,ldr-rgb-kodak08.png,37.4816,0.0449,0.0281,13.9899 +Kodak,5x5,ldr-rgb-kodak09.png,42.6721,0.0257,0.0105,37.5782 +Kodak,5x5,ldr-rgb-kodak10.png,42.5051,0.0268,0.0109,36.0811 +Kodak,5x5,ldr-rgb-kodak11.png,40.1347,0.0297,0.0160,24.6409 +Kodak,5x5,ldr-rgb-kodak12.png,43.3587,0.0230,0.0099,39.8191 +Kodak,5x5,ldr-rgb-kodak13.png,36.7643,0.0416,0.0268,14.6991 +Kodak,5x5,ldr-rgb-kodak14.png,37.6133,0.0365,0.0224,17.5323 +Kodak,5x5,ldr-rgb-kodak15.png,40.9873,0.0305,0.0154,25.5570 +Kodak,5x5,ldr-rgb-kodak16.png,43.4448,0.0227,0.0096,41.0838 +Kodak,5x5,ldr-rgb-kodak17.png,41.9440,0.0265,0.0106,37.2438 +Kodak,5x5,ldr-rgb-kodak18.png,37.9804,0.0389,0.0223,17.6464 +Kodak,5x5,ldr-rgb-kodak19.png,40.9586,0.0295,0.0134,29.4281 +Kodak,5x5,ldr-rgb-kodak20.png,42.2591,0.0242,0.0112,34.9806 +Kodak,5x5,ldr-rgb-kodak21.png,40.2790,0.0293,0.0156,25.1739 +Kodak,5x5,ldr-rgb-kodak22.png,39.5517,0.0334,0.0177,22.2130 +Kodak,5x5,ldr-rgb-kodak23.png,42.2620,0.0269,0.0125,31.4476 +Kodak,5x5,ldr-rgb-kodak24.png,37.7277,0.0354,0.0199,19.7735 +Kodak,6x6,ldr-rgb-kodak01.png,35.6776,0.0388,0.0248,15.8580 +Kodak,6x6,ldr-rgb-kodak02.png,38.0867,0.0313,0.0162,24.2009 +Kodak,6x6,ldr-rgb-kodak03.png,40.4245,0.0237,0.0106,37.0647 +Kodak,6x6,ldr-rgb-kodak04.png,38.3897,0.0313,0.0153,25.7561 +Kodak,6x6,ldr-rgb-kodak05.png,34.1774,0.0459,0.0312,12.5837 +Kodak,6x6,ldr-rgb-kodak06.png,37.2675,0.0308,0.0172,22.8814 +Kodak,6x6,ldr-rgb-kodak07.png,38.7256,0.0304,0.0148,26.5887 +Kodak,6x6,ldr-rgb-kodak08.png,34.2713,0.0490,0.0322,12.2261 +Kodak,6x6,ldr-rgb-kodak09.png,39.8360,0.0268,0.0116,34.0097 +Kodak,6x6,ldr-rgb-kodak10.png,39.6271,0.0274,0.0115,34.2342 +Kodak,6x6,ldr-rgb-kodak11.png,37.0482,0.0314,0.0177,22.1569 +Kodak,6x6,ldr-rgb-kodak12.png,40.6772,0.0232,0.0100,39.3648 +Kodak,6x6,ldr-rgb-kodak13.png,32.7550,0.0503,0.0355,11.0665 +Kodak,6x6,ldr-rgb-kodak14.png,35.0224,0.0388,0.0248,15.8605 +Kodak,6x6,ldr-rgb-kodak15.png,38.4599,0.0305,0.0154,25.4886 +Kodak,6x6,ldr-rgb-kodak16.png,40.4730,0.0237,0.0105,37.4281 +Kodak,6x6,ldr-rgb-kodak17.png,38.8345,0.0280,0.0120,32.6944 +Kodak,6x6,ldr-rgb-kodak18.png,35.0306,0.0410,0.0243,16.1917 +Kodak,6x6,ldr-rgb-kodak19.png,37.8819,0.0329,0.0166,23.6220 +Kodak,6x6,ldr-rgb-kodak20.png,39.1418,0.0258,0.0128,30.8332 +Kodak,6x6,ldr-rgb-kodak21.png,36.8511,0.0324,0.0186,21.1087 +Kodak,6x6,ldr-rgb-kodak22.png,36.9051,0.0345,0.0189,20.8581 +Kodak,6x6,ldr-rgb-kodak23.png,39.9301,0.0260,0.0116,33.8568 +Kodak,6x6,ldr-rgb-kodak24.png,34.7436,0.0379,0.0223,17.6623 +Kodak,8x8,ldr-rgb-kodak01.png,31.2082,0.0508,0.0366,10.7292 +Kodak,8x8,ldr-rgb-kodak02.png,34.8017,0.0323,0.0171,23.0071 +Kodak,8x8,ldr-rgb-kodak03.png,36.4985,0.0263,0.0130,30.3453 +Kodak,8x8,ldr-rgb-kodak04.png,35.1022,0.0328,0.0165,23.8848 +Kodak,8x8,ldr-rgb-kodak05.png,30.0751,0.0595,0.0445,8.8276 +Kodak,8x8,ldr-rgb-kodak06.png,32.8281,0.0395,0.0256,15.3576 +Kodak,8x8,ldr-rgb-kodak07.png,34.8646,0.0347,0.0189,20.8328 +Kodak,8x8,ldr-rgb-kodak08.png,29.7289,0.0636,0.0466,8.4387 +Kodak,8x8,ldr-rgb-kodak09.png,35.9623,0.0301,0.0144,27.2800 +Kodak,8x8,ldr-rgb-kodak10.png,35.7575,0.0294,0.0134,29.4475 +Kodak,8x8,ldr-rgb-kodak11.png,32.8944,0.0375,0.0236,16.6744 +Kodak,8x8,ldr-rgb-kodak12.png,36.5619,0.0262,0.0128,30.7538 +Kodak,8x8,ldr-rgb-kodak13.png,28.1501,0.0682,0.0530,7.4134 +Kodak,8x8,ldr-rgb-kodak14.png,31.3321,0.0488,0.0344,11.4390 +Kodak,8x8,ldr-rgb-kodak15.png,34.7918,0.0324,0.0170,23.1821 +Kodak,8x8,ldr-rgb-kodak16.png,35.9809,0.0291,0.0157,24.9817 +Kodak,8x8,ldr-rgb-kodak17.png,34.7507,0.0317,0.0154,25.4690 +Kodak,8x8,ldr-rgb-kodak18.png,31.1839,0.0476,0.0307,12.8179 +Kodak,8x8,ldr-rgb-kodak19.png,33.9323,0.0375,0.0210,18.7183 +Kodak,8x8,ldr-rgb-kodak20.png,35.1250,0.0286,0.0153,25.7392 +Kodak,8x8,ldr-rgb-kodak21.png,32.6633,0.0391,0.0251,15.6822 +Kodak,8x8,ldr-rgb-kodak22.png,33.3552,0.0381,0.0222,17.7459 +Kodak,8x8,ldr-rgb-kodak23.png,36.4364,0.0266,0.0119,32.9906 +Kodak,8x8,ldr-rgb-kodak24.png,30.7663,0.0446,0.0287,13.6866 +Kodak,12x12,ldr-rgb-kodak01.png,27.0008,0.0454,0.0306,12.8561 +Kodak,12x12,ldr-rgb-kodak02.png,31.0415,0.0255,0.0098,40.1194 +Kodak,12x12,ldr-rgb-kodak03.png,32.6513,0.0222,0.0083,47.3247 +Kodak,12x12,ldr-rgb-kodak04.png,31.4912,0.0248,0.0080,49.0956 +Kodak,12x12,ldr-rgb-kodak05.png,25.7162,0.0498,0.0341,11.5181 +Kodak,12x12,ldr-rgb-kodak06.png,28.4959,0.0361,0.0217,18.1617 +Kodak,12x12,ldr-rgb-kodak07.png,30.8219,0.0274,0.0111,35.5308 +Kodak,12x12,ldr-rgb-kodak08.png,25.2268,0.0582,0.0405,9.7167 +Kodak,12x12,ldr-rgb-kodak09.png,31.6541,0.0260,0.0099,39.6993 +Kodak,12x12,ldr-rgb-kodak10.png,31.4641,0.0261,0.0094,41.6313 +Kodak,12x12,ldr-rgb-kodak11.png,28.8804,0.0305,0.0160,24.6222 +Kodak,12x12,ldr-rgb-kodak12.png,32.2096,0.0222,0.0082,47.7661 +Kodak,12x12,ldr-rgb-kodak13.png,24.2505,0.0587,0.0431,9.1270 +Kodak,12x12,ldr-rgb-kodak14.png,27.4640,0.0374,0.0226,17.3951 +Kodak,12x12,ldr-rgb-kodak15.png,31.1808,0.0281,0.0122,32.3341 +Kodak,12x12,ldr-rgb-kodak16.png,31.3728,0.0246,0.0107,36.8486 +Kodak,12x12,ldr-rgb-kodak17.png,30.8456,0.0270,0.0103,38.2581 +Kodak,12x12,ldr-rgb-kodak18.png,27.3784,0.0382,0.0207,18.9512 +Kodak,12x12,ldr-rgb-kodak19.png,29.8837,0.0328,0.0158,24.8414 +Kodak,12x12,ldr-rgb-kodak20.png,30.9559,0.0251,0.0114,34.6441 +Kodak,12x12,ldr-rgb-kodak21.png,28.6284,0.0346,0.0200,19.6657 +Kodak,12x12,ldr-rgb-kodak22.png,29.7698,0.0288,0.0122,32.1601 +Kodak,12x12,ldr-rgb-kodak23.png,32.4950,0.0235,0.0083,47.5540 +Kodak,12x12,ldr-rgb-kodak24.png,26.7119,0.0383,0.0219,17.9747 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-neon_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-neon_medium_results.csv new file mode 100644 index 0000000..16e56e9 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-neon_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.3900,0.1459,0.1284,3.0616 +Kodak,4x4,ldr-rgb-kodak02.png,45.5266,0.2259,0.2083,1.8876 +Kodak,4x4,ldr-rgb-kodak03.png,47.8390,0.1138,0.0990,3.9708 +Kodak,4x4,ldr-rgb-kodak04.png,45.6293,0.1808,0.1595,2.4649 +Kodak,4x4,ldr-rgb-kodak05.png,42.2268,0.1945,0.1773,2.2174 +Kodak,4x4,ldr-rgb-kodak06.png,45.2804,0.1446,0.1282,3.0669 +Kodak,4x4,ldr-rgb-kodak07.png,46.1450,0.1407,0.1235,3.1848 +Kodak,4x4,ldr-rgb-kodak08.png,42.5929,0.2087,0.1868,2.1045 +Kodak,4x4,ldr-rgb-kodak09.png,47.3636,0.1758,0.1557,2.5252 +Kodak,4x4,ldr-rgb-kodak10.png,47.0403,0.1804,0.1608,2.4447 +Kodak,4x4,ldr-rgb-kodak11.png,44.9930,0.1682,0.1531,2.5685 +Kodak,4x4,ldr-rgb-kodak12.png,48.1508,0.1314,0.1144,3.4367 +Kodak,4x4,ldr-rgb-kodak13.png,41.7091,0.1583,0.1386,2.8368 +Kodak,4x4,ldr-rgb-kodak14.png,42.7747,0.1834,0.1672,2.3525 +Kodak,4x4,ldr-rgb-kodak15.png,45.6063,0.1620,0.1428,2.7537 +Kodak,4x4,ldr-rgb-kodak16.png,48.0286,0.1270,0.1099,3.5790 +Kodak,4x4,ldr-rgb-kodak17.png,46.4272,0.1587,0.1401,2.8060 +Kodak,4x4,ldr-rgb-kodak18.png,42.1025,0.2285,0.2071,1.8985 +Kodak,4x4,ldr-rgb-kodak19.png,45.4882,0.1840,0.1629,2.4146 +Kodak,4x4,ldr-rgb-kodak20.png,46.9603,0.1105,0.0963,4.0828 +Kodak,4x4,ldr-rgb-kodak21.png,45.3041,0.1844,0.1668,2.3571 +Kodak,4x4,ldr-rgb-kodak22.png,43.9220,0.2326,0.2146,1.8325 +Kodak,4x4,ldr-rgb-kodak23.png,47.0296,0.1833,0.1673,2.3503 +Kodak,4x4,ldr-rgb-kodak24.png,42.4676,0.1731,0.1535,2.5613 +Kodak,5x5,ldr-rgb-kodak01.png,40.1428,0.1490,0.1339,2.9376 +Kodak,5x5,ldr-rgb-kodak02.png,41.8098,0.1753,0.1588,2.4769 +Kodak,5x5,ldr-rgb-kodak03.png,44.1564,0.0788,0.0648,6.0638 +Kodak,5x5,ldr-rgb-kodak04.png,42.1557,0.1298,0.1122,3.5035 +Kodak,5x5,ldr-rgb-kodak05.png,38.0375,0.1785,0.1618,2.4309 +Kodak,5x5,ldr-rgb-kodak06.png,41.0310,0.1193,0.1038,3.7899 +Kodak,5x5,ldr-rgb-kodak07.png,42.5449,0.1063,0.0887,4.4352 +Kodak,5x5,ldr-rgb-kodak08.png,38.3909,0.1833,0.1644,2.3918 +Kodak,5x5,ldr-rgb-kodak09.png,43.8761,0.0924,0.0758,5.1881 +Kodak,5x5,ldr-rgb-kodak10.png,43.4926,0.1039,0.0863,4.5556 +Kodak,5x5,ldr-rgb-kodak11.png,40.9014,0.1396,0.1237,3.1784 +Kodak,5x5,ldr-rgb-kodak12.png,44.5087,0.0794,0.0648,6.0712 +Kodak,5x5,ldr-rgb-kodak13.png,36.9547,0.1530,0.1361,2.8887 +Kodak,5x5,ldr-rgb-kodak14.png,38.7244,0.1593,0.1438,2.7347 +Kodak,5x5,ldr-rgb-kodak15.png,41.9961,0.1238,0.1062,3.7023 +Kodak,5x5,ldr-rgb-kodak16.png,44.2004,0.0860,0.0709,5.5469 +Kodak,5x5,ldr-rgb-kodak17.png,42.5924,0.0917,0.0741,5.3050 +Kodak,5x5,ldr-rgb-kodak18.png,38.4191,0.1741,0.1551,2.5356 +Kodak,5x5,ldr-rgb-kodak19.png,41.7153,0.1155,0.0978,4.0195 +Kodak,5x5,ldr-rgb-kodak20.png,43.1410,0.0805,0.0660,5.9586 +Kodak,5x5,ldr-rgb-kodak21.png,40.8178,0.1194,0.1043,3.7693 +Kodak,5x5,ldr-rgb-kodak22.png,40.3445,0.1676,0.1500,2.6219 +Kodak,5x5,ldr-rgb-kodak23.png,43.6620,0.1137,0.0977,4.0229 +Kodak,5x5,ldr-rgb-kodak24.png,38.2488,0.1379,0.1205,3.2639 +Kodak,6x6,ldr-rgb-kodak01.png,36.2113,0.1527,0.1366,2.8796 +Kodak,6x6,ldr-rgb-kodak02.png,39.0614,0.1404,0.1229,3.1994 +Kodak,6x6,ldr-rgb-kodak03.png,41.3770,0.0641,0.0497,7.9132 +Kodak,6x6,ldr-rgb-kodak04.png,39.4395,0.1123,0.0943,4.1715 +Kodak,6x6,ldr-rgb-kodak05.png,34.8184,0.1758,0.1591,2.4716 +Kodak,6x6,ldr-rgb-kodak06.png,37.6639,0.1082,0.0923,4.2618 +Kodak,6x6,ldr-rgb-kodak07.png,39.8300,0.0938,0.0757,5.1954 +Kodak,6x6,ldr-rgb-kodak08.png,34.9957,0.1825,0.1636,2.4042 +Kodak,6x6,ldr-rgb-kodak09.png,40.9226,0.0713,0.0546,7.2040 +Kodak,6x6,ldr-rgb-kodak10.png,40.5493,0.0739,0.0562,7.0025 +Kodak,6x6,ldr-rgb-kodak11.png,37.6100,0.1186,0.1028,3.8245 +Kodak,6x6,ldr-rgb-kodak12.png,41.5485,0.0608,0.0468,8.4110 +Kodak,6x6,ldr-rgb-kodak13.png,32.9142,0.1685,0.1518,2.5912 +Kodak,6x6,ldr-rgb-kodak14.png,35.8636,0.1530,0.1363,2.8847 +Kodak,6x6,ldr-rgb-kodak15.png,39.2411,0.1101,0.0933,4.2125 +Kodak,6x6,ldr-rgb-kodak16.png,41.0644,0.0696,0.0552,7.1265 +Kodak,6x6,ldr-rgb-kodak17.png,39.4963,0.0744,0.0563,6.9812 +Kodak,6x6,ldr-rgb-kodak18.png,35.3775,0.1514,0.1328,2.9610 +Kodak,6x6,ldr-rgb-kodak19.png,38.5482,0.1044,0.0859,4.5783 +Kodak,6x6,ldr-rgb-kodak20.png,39.8612,0.0743,0.0599,6.5693 +Kodak,6x6,ldr-rgb-kodak21.png,37.2219,0.1028,0.0871,4.5157 +Kodak,6x6,ldr-rgb-kodak22.png,37.4990,0.1403,0.1226,3.2070 +Kodak,6x6,ldr-rgb-kodak23.png,41.0323,0.0805,0.0647,6.0814 +Kodak,6x6,ldr-rgb-kodak24.png,35.0904,0.1250,0.1079,3.6452 +Kodak,8x8,ldr-rgb-kodak01.png,31.8088,0.2262,0.2085,1.8862 +Kodak,8x8,ldr-rgb-kodak02.png,35.8041,0.1471,0.1296,3.0349 +Kodak,8x8,ldr-rgb-kodak03.png,37.7807,0.0861,0.0702,5.6014 +Kodak,8x8,ldr-rgb-kodak04.png,36.1152,0.1297,0.1115,3.5271 +Kodak,8x8,ldr-rgb-kodak05.png,30.7592,0.2480,0.2300,1.7097 +Kodak,8x8,ldr-rgb-kodak06.png,33.4597,0.1465,0.1302,3.0205 +Kodak,8x8,ldr-rgb-kodak07.png,36.1791,0.1193,0.1012,3.8860 +Kodak,8x8,ldr-rgb-kodak08.png,30.5504,0.2490,0.2294,1.7144 +Kodak,8x8,ldr-rgb-kodak09.png,37.2788,0.0904,0.0730,5.3875 +Kodak,8x8,ldr-rgb-kodak10.png,36.9460,0.0913,0.0731,5.3774 +Kodak,8x8,ldr-rgb-kodak11.png,33.6799,0.1541,0.1377,2.8561 +Kodak,8x8,ldr-rgb-kodak12.png,37.8704,0.0856,0.0698,5.6374 +Kodak,8x8,ldr-rgb-kodak13.png,28.4023,0.2441,0.2268,1.7335 +Kodak,8x8,ldr-rgb-kodak14.png,32.1597,0.2070,0.1904,2.0648 +Kodak,8x8,ldr-rgb-kodak15.png,35.8630,0.1217,0.1032,3.8099 +Kodak,8x8,ldr-rgb-kodak16.png,37.0443,0.0969,0.0809,4.8630 +Kodak,8x8,ldr-rgb-kodak17.png,35.6841,0.0979,0.0790,4.9749 +Kodak,8x8,ldr-rgb-kodak18.png,31.5638,0.1927,0.1726,2.2788 +Kodak,8x8,ldr-rgb-kodak19.png,34.7826,0.1287,0.1106,3.5564 +Kodak,8x8,ldr-rgb-kodak20.png,35.9506,0.0994,0.0831,4.7313 +Kodak,8x8,ldr-rgb-kodak21.png,33.1239,0.1421,0.1249,3.1471 +Kodak,8x8,ldr-rgb-kodak22.png,34.0587,0.1678,0.1478,2.6597 +Kodak,8x8,ldr-rgb-kodak23.png,37.7041,0.0907,0.0736,5.3443 +Kodak,8x8,ldr-rgb-kodak24.png,31.1428,0.1587,0.1402,2.8048 +Kodak,12x12,ldr-rgb-kodak01.png,27.7593,0.2612,0.2424,1.6220 +Kodak,12x12,ldr-rgb-kodak02.png,32.4650,0.1092,0.0920,4.2750 +Kodak,12x12,ldr-rgb-kodak03.png,33.8493,0.0774,0.0606,6.4905 +Kodak,12x12,ldr-rgb-kodak04.png,32.4639,0.0945,0.0742,5.2983 +Kodak,12x12,ldr-rgb-kodak05.png,26.4050,0.2846,0.2650,1.4837 +Kodak,12x12,ldr-rgb-kodak06.png,29.3844,0.1598,0.1419,2.7715 +Kodak,12x12,ldr-rgb-kodak07.png,32.0587,0.1207,0.1018,3.8627 +Kodak,12x12,ldr-rgb-kodak08.png,26.0674,0.3014,0.2803,1.4030 +Kodak,12x12,ldr-rgb-kodak09.png,33.1166,0.0859,0.0662,5.9399 +Kodak,12x12,ldr-rgb-kodak10.png,32.5013,0.0835,0.0644,6.1085 +Kodak,12x12,ldr-rgb-kodak11.png,29.7620,0.1505,0.1319,2.9806 +Kodak,12x12,ldr-rgb-kodak12.png,33.9091,0.0793,0.0617,6.3753 +Kodak,12x12,ldr-rgb-kodak13.png,24.5329,0.2942,0.2738,1.4360 +Kodak,12x12,ldr-rgb-kodak14.png,28.4363,0.2228,0.2033,1.9340 +Kodak,12x12,ldr-rgb-kodak15.png,32.2535,0.1062,0.0869,4.5267 +Kodak,12x12,ldr-rgb-kodak16.png,32.9949,0.0899,0.0729,5.3907 +Kodak,12x12,ldr-rgb-kodak17.png,31.7945,0.0931,0.0727,5.4114 +Kodak,12x12,ldr-rgb-kodak18.png,27.7879,0.1872,0.1658,2.3718 +Kodak,12x12,ldr-rgb-kodak19.png,30.9041,0.1275,0.1066,3.6892 +Kodak,12x12,ldr-rgb-kodak20.png,31.8897,0.0985,0.0813,4.8337 +Kodak,12x12,ldr-rgb-kodak21.png,29.1922,0.1621,0.1447,2.7176 +Kodak,12x12,ldr-rgb-kodak22.png,30.5213,0.1431,0.1223,3.2144 +Kodak,12x12,ldr-rgb-kodak23.png,33.5912,0.0712,0.0529,7.4380 +Kodak,12x12,ldr-rgb-kodak24.png,27.1145,0.1674,0.1471,2.6735 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-neon_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-neon_thorough_results.csv new file mode 100644 index 0000000..ebe8667 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-neon_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.5922,0.2999,0.2855,1.3774 +Kodak,4x4,ldr-rgb-kodak02.png,45.8028,0.5463,0.5285,0.7441 +Kodak,4x4,ldr-rgb-kodak03.png,48.2430,0.3743,0.3599,1.0927 +Kodak,4x4,ldr-rgb-kodak04.png,45.8232,0.4083,0.3911,1.0055 +Kodak,4x4,ldr-rgb-kodak05.png,42.4987,0.3837,0.3673,1.0704 +Kodak,4x4,ldr-rgb-kodak06.png,45.4846,0.3211,0.3056,1.2866 +Kodak,4x4,ldr-rgb-kodak07.png,46.5250,0.3714,0.3545,1.1092 +Kodak,4x4,ldr-rgb-kodak08.png,42.8951,0.4044,0.3857,1.0195 +Kodak,4x4,ldr-rgb-kodak09.png,47.6390,0.4204,0.4035,0.9744 +Kodak,4x4,ldr-rgb-kodak10.png,47.2881,0.4089,0.3916,1.0040 +Kodak,4x4,ldr-rgb-kodak11.png,45.2534,0.3627,0.3475,1.1314 +Kodak,4x4,ldr-rgb-kodak12.png,48.4737,0.3531,0.3386,1.1613 +Kodak,4x4,ldr-rgb-kodak13.png,41.8173,0.3135,0.2971,1.3233 +Kodak,4x4,ldr-rgb-kodak14.png,43.0369,0.3615,0.3461,1.1361 +Kodak,4x4,ldr-rgb-kodak15.png,45.9032,0.3864,0.3694,1.0643 +Kodak,4x4,ldr-rgb-kodak16.png,48.2456,0.3448,0.3291,1.1947 +Kodak,4x4,ldr-rgb-kodak17.png,46.6010,0.3966,0.3765,1.0445 +Kodak,4x4,ldr-rgb-kodak18.png,42.2712,0.4845,0.4647,0.8462 +Kodak,4x4,ldr-rgb-kodak19.png,45.7045,0.4516,0.4318,0.9106 +Kodak,4x4,ldr-rgb-kodak20.png,47.2404,0.2944,0.2782,1.4132 +Kodak,4x4,ldr-rgb-kodak21.png,45.4559,0.4349,0.4178,0.9411 +Kodak,4x4,ldr-rgb-kodak22.png,44.1146,0.4997,0.4805,0.8184 +Kodak,4x4,ldr-rgb-kodak23.png,47.3579,0.4931,0.4740,0.8296 +Kodak,4x4,ldr-rgb-kodak24.png,42.6976,0.4422,0.4226,0.9304 +Kodak,5x5,ldr-rgb-kodak01.png,40.2582,0.4293,0.4103,0.9584 +Kodak,5x5,ldr-rgb-kodak02.png,42.0902,0.5756,0.5564,0.7067 +Kodak,5x5,ldr-rgb-kodak03.png,44.4690,0.4284,0.4109,0.9570 +Kodak,5x5,ldr-rgb-kodak04.png,42.3451,0.4785,0.4553,0.8637 +Kodak,5x5,ldr-rgb-kodak05.png,38.2336,0.5135,0.4928,0.7979 +Kodak,5x5,ldr-rgb-kodak06.png,41.1423,0.4160,0.3975,0.9892 +Kodak,5x5,ldr-rgb-kodak07.png,42.8235,0.4935,0.4726,0.8320 +Kodak,5x5,ldr-rgb-kodak08.png,38.5691,0.5124,0.4895,0.8032 +Kodak,5x5,ldr-rgb-kodak09.png,44.1096,0.4826,0.4606,0.8536 +Kodak,5x5,ldr-rgb-kodak10.png,43.6852,0.4927,0.4689,0.8385 +Kodak,5x5,ldr-rgb-kodak11.png,41.0686,0.4692,0.4502,0.8734 +Kodak,5x5,ldr-rgb-kodak12.png,44.7130,0.4564,0.4354,0.9031 +Kodak,5x5,ldr-rgb-kodak13.png,37.0068,0.4013,0.3809,1.0324 +Kodak,5x5,ldr-rgb-kodak14.png,38.9474,0.4864,0.4669,0.8422 +Kodak,5x5,ldr-rgb-kodak15.png,42.2161,0.4914,0.4703,0.8360 +Kodak,5x5,ldr-rgb-kodak16.png,44.3498,0.4400,0.4203,0.9356 +Kodak,5x5,ldr-rgb-kodak17.png,42.6976,0.4654,0.4429,0.8879 +Kodak,5x5,ldr-rgb-kodak18.png,38.5158,0.5477,0.5220,0.7533 +Kodak,5x5,ldr-rgb-kodak19.png,41.8549,0.5087,0.4858,0.8094 +Kodak,5x5,ldr-rgb-kodak20.png,43.3603,0.3157,0.2975,1.3216 +Kodak,5x5,ldr-rgb-kodak21.png,40.9302,0.5193,0.4994,0.7874 +Kodak,5x5,ldr-rgb-kodak22.png,40.4958,0.6011,0.5790,0.6792 +Kodak,5x5,ldr-rgb-kodak23.png,43.9970,0.5916,0.5709,0.6888 +Kodak,5x5,ldr-rgb-kodak24.png,38.3771,0.5187,0.4958,0.7932 +Kodak,6x6,ldr-rgb-kodak01.png,36.3296,0.5334,0.5128,0.7668 +Kodak,6x6,ldr-rgb-kodak02.png,39.4323,0.6871,0.6642,0.5920 +Kodak,6x6,ldr-rgb-kodak03.png,41.8030,0.4272,0.4077,0.9644 +Kodak,6x6,ldr-rgb-kodak04.png,39.7105,0.5563,0.5326,0.7383 +Kodak,6x6,ldr-rgb-kodak05.png,35.0194,0.6094,0.5883,0.6684 +Kodak,6x6,ldr-rgb-kodak06.png,37.7820,0.4718,0.4519,0.8701 +Kodak,6x6,ldr-rgb-kodak07.png,40.1759,0.4912,0.4684,0.8395 +Kodak,6x6,ldr-rgb-kodak08.png,35.1892,0.6058,0.5829,0.6746 +Kodak,6x6,ldr-rgb-kodak09.png,41.3074,0.5303,0.5082,0.7738 +Kodak,6x6,ldr-rgb-kodak10.png,40.8881,0.5436,0.5212,0.7544 +Kodak,6x6,ldr-rgb-kodak11.png,37.8001,0.4582,0.4407,0.8923 +Kodak,6x6,ldr-rgb-kodak12.png,41.8937,0.4192,0.4002,0.9826 +Kodak,6x6,ldr-rgb-kodak13.png,32.9664,0.4422,0.4204,0.9353 +Kodak,6x6,ldr-rgb-kodak14.png,36.0648,0.5220,0.5034,0.7811 +Kodak,6x6,ldr-rgb-kodak15.png,39.4992,0.4356,0.4164,0.9443 +Kodak,6x6,ldr-rgb-kodak16.png,41.2652,0.3988,0.3815,1.0306 +Kodak,6x6,ldr-rgb-kodak17.png,39.7005,0.4478,0.4276,0.9197 +Kodak,6x6,ldr-rgb-kodak18.png,35.4652,0.5460,0.5225,0.7526 +Kodak,6x6,ldr-rgb-kodak19.png,38.7403,0.5087,0.4881,0.8056 +Kodak,6x6,ldr-rgb-kodak20.png,40.1606,0.3015,0.2850,1.3795 +Kodak,6x6,ldr-rgb-kodak21.png,37.3715,0.4893,0.4718,0.8334 +Kodak,6x6,ldr-rgb-kodak22.png,37.6700,0.5721,0.5498,0.7152 +Kodak,6x6,ldr-rgb-kodak23.png,41.4972,0.5422,0.5211,0.7547 +Kodak,6x6,ldr-rgb-kodak24.png,35.2077,0.4845,0.4642,0.8470 +Kodak,8x8,ldr-rgb-kodak01.png,31.9182,0.6367,0.6176,0.6367 +Kodak,8x8,ldr-rgb-kodak02.png,36.1788,0.6423,0.6219,0.6323 +Kodak,8x8,ldr-rgb-kodak03.png,38.2256,0.3408,0.3218,1.2218 +Kodak,8x8,ldr-rgb-kodak04.png,36.4047,0.5123,0.4904,0.8018 +Kodak,8x8,ldr-rgb-kodak05.png,30.9271,0.6824,0.6629,0.5932 +Kodak,8x8,ldr-rgb-kodak06.png,33.5892,0.5141,0.4958,0.7931 +Kodak,8x8,ldr-rgb-kodak07.png,36.5323,0.4144,0.3938,0.9986 +Kodak,8x8,ldr-rgb-kodak08.png,30.7450,0.7490,0.7270,0.5409 +Kodak,8x8,ldr-rgb-kodak09.png,37.5746,0.3708,0.3501,1.1231 +Kodak,8x8,ldr-rgb-kodak10.png,37.2611,0.4252,0.4038,0.9737 +Kodak,8x8,ldr-rgb-kodak11.png,33.8471,0.6057,0.5874,0.6694 +Kodak,8x8,ldr-rgb-kodak12.png,38.2959,0.3947,0.3761,1.0454 +Kodak,8x8,ldr-rgb-kodak13.png,28.4658,0.6788,0.6574,0.5981 +Kodak,8x8,ldr-rgb-kodak14.png,32.3355,0.6468,0.6282,0.6260 +Kodak,8x8,ldr-rgb-kodak15.png,36.0844,0.4682,0.4481,0.8774 +Kodak,8x8,ldr-rgb-kodak16.png,37.2854,0.4179,0.3996,0.9840 +Kodak,8x8,ldr-rgb-kodak17.png,35.8833,0.4287,0.4061,0.9683 +Kodak,8x8,ldr-rgb-kodak18.png,31.6609,0.7002,0.6769,0.5809 +Kodak,8x8,ldr-rgb-kodak19.png,34.9459,0.4413,0.4199,0.9364 +Kodak,8x8,ldr-rgb-kodak20.png,36.1871,0.3497,0.3318,1.1850 +Kodak,8x8,ldr-rgb-kodak21.png,33.2364,0.4726,0.4542,0.8657 +Kodak,8x8,ldr-rgb-kodak22.png,34.2428,0.6522,0.6304,0.6237 +Kodak,8x8,ldr-rgb-kodak23.png,38.2266,0.4264,0.4057,0.9693 +Kodak,8x8,ldr-rgb-kodak24.png,31.2516,0.5503,0.5297,0.7423 +Kodak,12x12,ldr-rgb-kodak01.png,27.9177,0.8708,0.8489,0.4632 +Kodak,12x12,ldr-rgb-kodak02.png,33.0100,0.5235,0.5050,0.7786 +Kodak,12x12,ldr-rgb-kodak03.png,34.4665,0.2961,0.2797,1.4060 +Kodak,12x12,ldr-rgb-kodak04.png,32.9831,0.4501,0.4308,0.9127 +Kodak,12x12,ldr-rgb-kodak05.png,26.6116,0.7576,0.7396,0.5316 +Kodak,12x12,ldr-rgb-kodak06.png,29.5405,0.5111,0.4941,0.7959 +Kodak,12x12,ldr-rgb-kodak07.png,32.6427,0.3879,0.3689,1.0659 +Kodak,12x12,ldr-rgb-kodak08.png,26.2689,0.7653,0.7452,0.5277 +Kodak,12x12,ldr-rgb-kodak09.png,33.6395,0.3500,0.3311,1.1875 +Kodak,12x12,ldr-rgb-kodak10.png,33.0011,0.3465,0.3271,1.2022 +Kodak,12x12,ldr-rgb-kodak11.png,30.0591,0.5486,0.5313,0.7402 +Kodak,12x12,ldr-rgb-kodak12.png,34.4608,0.3158,0.2991,1.3146 +Kodak,12x12,ldr-rgb-kodak13.png,24.5896,0.8215,0.8031,0.4896 +Kodak,12x12,ldr-rgb-kodak14.png,28.6523,0.6656,0.6480,0.6068 +Kodak,12x12,ldr-rgb-kodak15.png,32.7473,0.4280,0.4093,0.9607 +Kodak,12x12,ldr-rgb-kodak16.png,33.3428,0.3769,0.3603,1.0915 +Kodak,12x12,ldr-rgb-kodak17.png,32.1405,0.3782,0.3588,1.0959 +Kodak,12x12,ldr-rgb-kodak18.png,27.9302,0.6643,0.6439,0.6107 +Kodak,12x12,ldr-rgb-kodak19.png,31.1152,0.5162,0.4965,0.7920 +Kodak,12x12,ldr-rgb-kodak20.png,32.1883,0.3880,0.3715,1.0585 +Kodak,12x12,ldr-rgb-kodak21.png,29.3322,0.4849,0.4678,0.8406 +Kodak,12x12,ldr-rgb-kodak22.png,30.7936,0.5840,0.5647,0.6963 +Kodak,12x12,ldr-rgb-kodak23.png,34.3943,0.3117,0.2938,1.3383 +Kodak,12x12,ldr-rgb-kodak24.png,27.2471,0.5927,0.5736,0.6855 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse2_fast_results.csv new file mode 100644 index 0000000..eb5be8b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse2_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.9520,0.0441,0.0191,20.6055 +Kodak,4x4,ldr-rgb-kodak02.png,44.3434,0.0548,0.0275,14.3086 +Kodak,4x4,ldr-rgb-kodak03.png,46.8392,0.0408,0.0152,25.8388 +Kodak,4x4,ldr-rgb-kodak04.png,44.7718,0.0517,0.0245,16.0397 +Kodak,4x4,ldr-rgb-kodak05.png,41.6993,0.0640,0.0368,10.6756 +Kodak,4x4,ldr-rgb-kodak06.png,44.8560,0.0443,0.0187,21.0489 +Kodak,4x4,ldr-rgb-kodak07.png,45.2328,0.0470,0.0209,18.8430 +Kodak,4x4,ldr-rgb-kodak08.png,42.1952,0.0659,0.0380,10.3391 +Kodak,4x4,ldr-rgb-kodak09.png,46.4561,0.0402,0.0140,28.1330 +Kodak,4x4,ldr-rgb-kodak10.png,46.2386,0.0418,0.0147,26.7127 +Kodak,4x4,ldr-rgb-kodak11.png,44.3773,0.0490,0.0230,17.0836 +Kodak,4x4,ldr-rgb-kodak12.png,47.2692,0.0401,0.0135,29.0645 +Kodak,4x4,ldr-rgb-kodak13.png,41.5422,0.0603,0.0314,12.5177 +Kodak,4x4,ldr-rgb-kodak14.png,41.9751,0.0558,0.0303,12.9672 +Kodak,4x4,ldr-rgb-kodak15.png,44.7350,0.0525,0.0265,14.8468 +Kodak,4x4,ldr-rgb-kodak16.png,47.3501,0.0366,0.0120,32.6568 +Kodak,4x4,ldr-rgb-kodak17.png,45.8448,0.0423,0.0134,29.4433 +Kodak,4x4,ldr-rgb-kodak18.png,41.7291,0.0642,0.0363,10.8235 +Kodak,4x4,ldr-rgb-kodak19.png,44.9590,0.0453,0.0182,21.6243 +Kodak,4x4,ldr-rgb-kodak20.png,46.4220,0.0397,0.0155,25.2905 +Kodak,4x4,ldr-rgb-kodak21.png,44.7256,0.0454,0.0193,20.4160 +Kodak,4x4,ldr-rgb-kodak22.png,43.3125,0.0583,0.0305,12.8754 +Kodak,4x4,ldr-rgb-kodak23.png,45.7203,0.0447,0.0186,21.1222 +Kodak,4x4,ldr-rgb-kodak24.png,42.0603,0.0566,0.0294,13.3529 +Kodak,5x5,ldr-rgb-kodak01.png,39.6458,0.0434,0.0186,21.1724 +Kodak,5x5,ldr-rgb-kodak02.png,40.6591,0.0443,0.0174,22.5430 +Kodak,5x5,ldr-rgb-kodak03.png,43.1469,0.0376,0.0115,34.1364 +Kodak,5x5,ldr-rgb-kodak04.png,41.3472,0.0444,0.0159,24.7400 +Kodak,5x5,ldr-rgb-kodak05.png,37.4898,0.0592,0.0319,12.3081 +Kodak,5x5,ldr-rgb-kodak06.png,40.6532,0.0404,0.0148,26.5023 +Kodak,5x5,ldr-rgb-kodak07.png,41.5669,0.0425,0.0151,25.9703 +Kodak,5x5,ldr-rgb-kodak08.png,37.8105,0.0613,0.0321,12.2677 +Kodak,5x5,ldr-rgb-kodak09.png,42.9723,0.0390,0.0106,37.0572 +Kodak,5x5,ldr-rgb-kodak10.png,42.6976,0.0402,0.0107,36.6708 +Kodak,5x5,ldr-rgb-kodak11.png,40.3588,0.0440,0.0170,23.1113 +Kodak,5x5,ldr-rgb-kodak12.png,43.5782,0.0354,0.0095,41.2957 +Kodak,5x5,ldr-rgb-kodak13.png,36.8536,0.0551,0.0273,14.4236 +Kodak,5x5,ldr-rgb-kodak14.png,38.0505,0.0544,0.0284,13.8353 +Kodak,5x5,ldr-rgb-kodak15.png,41.2611,0.0435,0.0167,23.4768 +Kodak,5x5,ldr-rgb-kodak16.png,43.5297,0.0344,0.0088,44.8207 +Kodak,5x5,ldr-rgb-kodak17.png,42.0758,0.0386,0.0101,38.8667 +Kodak,5x5,ldr-rgb-kodak18.png,38.1330,0.0542,0.0241,16.3019 +Kodak,5x5,ldr-rgb-kodak19.png,41.1974,0.0417,0.0130,30.2196 +Kodak,5x5,ldr-rgb-kodak20.png,42.5501,0.0379,0.0113,34.7024 +Kodak,5x5,ldr-rgb-kodak21.png,40.4645,0.0419,0.0157,25.0249 +Kodak,5x5,ldr-rgb-kodak22.png,39.8284,0.0473,0.0191,20.5732 +Kodak,5x5,ldr-rgb-kodak23.png,42.5557,0.0397,0.0123,31.8964 +Kodak,5x5,ldr-rgb-kodak24.png,37.9277,0.0511,0.0223,17.6568 +Kodak,6x6,ldr-rgb-kodak01.png,35.7681,0.0530,0.0279,14.0922 +Kodak,6x6,ldr-rgb-kodak02.png,38.1838,0.0468,0.0185,21.2998 +Kodak,6x6,ldr-rgb-kodak03.png,40.5884,0.0378,0.0116,33.9859 +Kodak,6x6,ldr-rgb-kodak04.png,38.5847,0.0449,0.0169,23.3280 +Kodak,6x6,ldr-rgb-kodak05.png,34.3775,0.0663,0.0393,10.0119 +Kodak,6x6,ldr-rgb-kodak06.png,37.3251,0.0442,0.0184,21.3497 +Kodak,6x6,ldr-rgb-kodak07.png,38.9125,0.0434,0.0166,23.7434 +Kodak,6x6,ldr-rgb-kodak08.png,34.4660,0.0682,0.0392,10.0320 +Kodak,6x6,ldr-rgb-kodak09.png,40.0146,0.0389,0.0124,31.6061 +Kodak,6x6,ldr-rgb-kodak10.png,39.7566,0.0413,0.0120,32.8036 +Kodak,6x6,ldr-rgb-kodak11.png,37.1602,0.0469,0.0202,19.5133 +Kodak,6x6,ldr-rgb-kodak12.png,40.8079,0.0365,0.0102,38.4257 +Kodak,6x6,ldr-rgb-kodak13.png,32.8173,0.0675,0.0404,9.7413 +Kodak,6x6,ldr-rgb-kodak14.png,35.3132,0.0592,0.0334,11.7613 +Kodak,6x6,ldr-rgb-kodak15.png,38.5842,0.0436,0.0178,22.0709 +Kodak,6x6,ldr-rgb-kodak16.png,40.5096,0.0370,0.0103,38.1766 +Kodak,6x6,ldr-rgb-kodak17.png,38.9123,0.0416,0.0126,31.2101 +Kodak,6x6,ldr-rgb-kodak18.png,35.1244,0.0571,0.0278,14.1271 +Kodak,6x6,ldr-rgb-kodak19.png,38.0059,0.0457,0.0179,21.9405 +Kodak,6x6,ldr-rgb-kodak20.png,39.2852,0.0391,0.0138,28.4014 +Kodak,6x6,ldr-rgb-kodak21.png,36.9296,0.0474,0.0208,18.9028 +Kodak,6x6,ldr-rgb-kodak22.png,37.0116,0.0500,0.0215,18.2866 +Kodak,6x6,ldr-rgb-kodak23.png,40.0841,0.0389,0.0122,32.1808 +Kodak,6x6,ldr-rgb-kodak24.png,34.8195,0.0534,0.0252,15.5975 +Kodak,8x8,ldr-rgb-kodak01.png,31.3453,0.0659,0.0413,9.5205 +Kodak,8x8,ldr-rgb-kodak02.png,34.9512,0.0464,0.0185,21.2894 +Kodak,8x8,ldr-rgb-kodak03.png,36.6269,0.0388,0.0136,28.9472 +Kodak,8x8,ldr-rgb-kodak04.png,35.2101,0.0460,0.0180,21.8988 +Kodak,8x8,ldr-rgb-kodak05.png,30.2661,0.0768,0.0500,7.8629 +Kodak,8x8,ldr-rgb-kodak06.png,32.9625,0.0535,0.0283,13.8961 +Kodak,8x8,ldr-rgb-kodak07.png,35.0121,0.0474,0.0206,19.0455 +Kodak,8x8,ldr-rgb-kodak08.png,29.9795,0.0793,0.0514,7.6474 +Kodak,8x8,ldr-rgb-kodak09.png,36.2005,0.0421,0.0151,26.0408 +Kodak,8x8,ldr-rgb-kodak10.png,35.9067,0.0418,0.0139,28.3399 +Kodak,8x8,ldr-rgb-kodak11.png,33.0195,0.0530,0.0260,15.1226 +Kodak,8x8,ldr-rgb-kodak12.png,36.7730,0.0396,0.0132,29.7621 +Kodak,8x8,ldr-rgb-kodak13.png,28.2241,0.0869,0.0600,6.5586 +Kodak,8x8,ldr-rgb-kodak14.png,31.5140,0.0659,0.0398,9.8686 +Kodak,8x8,ldr-rgb-kodak15.png,34.9651,0.0441,0.0187,21.0691 +Kodak,8x8,ldr-rgb-kodak16.png,36.0662,0.0420,0.0166,23.6661 +Kodak,8x8,ldr-rgb-kodak17.png,34.9200,0.0452,0.0163,24.0572 +Kodak,8x8,ldr-rgb-kodak18.png,31.2513,0.0633,0.0349,11.2666 +Kodak,8x8,ldr-rgb-kodak19.png,34.2511,0.0494,0.0229,17.1890 +Kodak,8x8,ldr-rgb-kodak20.png,35.2908,0.0415,0.0163,24.1177 +Kodak,8x8,ldr-rgb-kodak21.png,32.7669,0.0536,0.0277,14.1802 +Kodak,8x8,ldr-rgb-kodak22.png,33.4684,0.0531,0.0246,15.9772 +Kodak,8x8,ldr-rgb-kodak23.png,36.5644,0.0397,0.0127,31.0135 +Kodak,8x8,ldr-rgb-kodak24.png,30.8378,0.0601,0.0317,12.4156 +Kodak,12x12,ldr-rgb-kodak01.png,27.1171,0.0584,0.0328,11.9927 +Kodak,12x12,ldr-rgb-kodak02.png,31.1137,0.0380,0.0098,39.9968 +Kodak,12x12,ldr-rgb-kodak03.png,32.7143,0.0372,0.0087,45.3532 +Kodak,12x12,ldr-rgb-kodak04.png,31.5844,0.0383,0.0080,49.1775 +Kodak,12x12,ldr-rgb-kodak05.png,25.8311,0.0663,0.0373,10.5465 +Kodak,12x12,ldr-rgb-kodak06.png,28.6467,0.0501,0.0229,17.1920 +Kodak,12x12,ldr-rgb-kodak07.png,30.8796,0.0396,0.0118,33.3833 +Kodak,12x12,ldr-rgb-kodak08.png,25.4259,0.0721,0.0429,9.1601 +Kodak,12x12,ldr-rgb-kodak09.png,31.8485,0.0372,0.0100,39.4873 +Kodak,12x12,ldr-rgb-kodak10.png,31.5514,0.0391,0.0095,41.5140 +Kodak,12x12,ldr-rgb-kodak11.png,28.9467,0.0456,0.0169,23.3142 +Kodak,12x12,ldr-rgb-kodak12.png,32.3174,0.0364,0.0081,48.5450 +Kodak,12x12,ldr-rgb-kodak13.png,24.3235,0.0748,0.0461,8.5259 +Kodak,12x12,ldr-rgb-kodak14.png,27.5493,0.0515,0.0240,16.3971 +Kodak,12x12,ldr-rgb-kodak15.png,31.2816,0.0424,0.0126,31.2349 +Kodak,12x12,ldr-rgb-kodak16.png,31.4940,0.0390,0.0107,36.8626 +Kodak,12x12,ldr-rgb-kodak17.png,30.9034,0.0410,0.0104,37.7839 +Kodak,12x12,ldr-rgb-kodak18.png,27.4301,0.0543,0.0226,17.4345 +Kodak,12x12,ldr-rgb-kodak19.png,30.2006,0.0476,0.0168,23.4561 +Kodak,12x12,ldr-rgb-kodak20.png,31.0717,0.0385,0.0119,33.0906 +Kodak,12x12,ldr-rgb-kodak21.png,28.7263,0.0516,0.0228,17.2682 +Kodak,12x12,ldr-rgb-kodak22.png,29.8492,0.0443,0.0129,30.5392 +Kodak,12x12,ldr-rgb-kodak23.png,32.5453,0.0394,0.0087,45.3581 +Kodak,12x12,ldr-rgb-kodak24.png,26.7832,0.0532,0.0230,17.0942 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse2_fastest_results.csv new file mode 100644 index 0000000..bc84c4a --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse2_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.6152,0.0380,0.0134,29.3354 +Kodak,4x4,ldr-rgb-kodak02.png,43.9224,0.0446,0.0179,21.9195 +Kodak,4x4,ldr-rgb-kodak03.png,46.2368,0.0367,0.0107,36.8634 +Kodak,4x4,ldr-rgb-kodak04.png,44.3531,0.0448,0.0161,24.4445 +Kodak,4x4,ldr-rgb-kodak05.png,41.1551,0.0502,0.0219,17.9500 +Kodak,4x4,ldr-rgb-kodak06.png,44.5683,0.0414,0.0135,29.1766 +Kodak,4x4,ldr-rgb-kodak07.png,44.7745,0.0422,0.0137,28.6123 +Kodak,4x4,ldr-rgb-kodak08.png,41.6238,0.0511,0.0224,17.5433 +Kodak,4x4,ldr-rgb-kodak09.png,46.1082,0.0373,0.0103,38.0946 +Kodak,4x4,ldr-rgb-kodak10.png,45.8847,0.0400,0.0108,36.4600 +Kodak,4x4,ldr-rgb-kodak11.png,43.9616,0.0423,0.0153,25.7762 +Kodak,4x4,ldr-rgb-kodak12.png,46.7087,0.0362,0.0101,39.0877 +Kodak,4x4,ldr-rgb-kodak13.png,41.2762,0.0495,0.0207,19.0244 +Kodak,4x4,ldr-rgb-kodak14.png,41.3103,0.0444,0.0179,21.9797 +Kodak,4x4,ldr-rgb-kodak15.png,44.2711,0.0438,0.0167,23.5856 +Kodak,4x4,ldr-rgb-kodak16.png,47.2082,0.0347,0.0095,41.3827 +Kodak,4x4,ldr-rgb-kodak17.png,45.6054,0.0386,0.0101,39.1174 +Kodak,4x4,ldr-rgb-kodak18.png,41.3844,0.0519,0.0218,18.0641 +Kodak,4x4,ldr-rgb-kodak19.png,44.6830,0.0417,0.0129,30.5765 +Kodak,4x4,ldr-rgb-kodak20.png,45.9296,0.0353,0.0110,35.8833 +Kodak,4x4,ldr-rgb-kodak21.png,44.3989,0.0397,0.0135,29.1292 +Kodak,4x4,ldr-rgb-kodak22.png,42.9303,0.0461,0.0189,20.8228 +Kodak,4x4,ldr-rgb-kodak23.png,45.4033,0.0391,0.0128,30.6863 +Kodak,4x4,ldr-rgb-kodak24.png,41.4983,0.0449,0.0178,22.0558 +Kodak,5x5,ldr-rgb-kodak01.png,39.4204,0.0397,0.0152,25.9392 +Kodak,5x5,ldr-rgb-kodak02.png,40.4373,0.0403,0.0134,29.4391 +Kodak,5x5,ldr-rgb-kodak03.png,42.7911,0.0345,0.0089,44.1323 +Kodak,5x5,ldr-rgb-kodak04.png,40.9568,0.0397,0.0124,31.7570 +Kodak,5x5,ldr-rgb-kodak05.png,37.1419,0.0493,0.0221,17.7997 +Kodak,5x5,ldr-rgb-kodak06.png,40.4991,0.0386,0.0123,32.0944 +Kodak,5x5,ldr-rgb-kodak07.png,41.2599,0.0398,0.0117,33.5054 +Kodak,5x5,ldr-rgb-kodak08.png,37.4816,0.0521,0.0227,17.2941 +Kodak,5x5,ldr-rgb-kodak09.png,42.6721,0.0359,0.0087,45.4419 +Kodak,5x5,ldr-rgb-kodak10.png,42.5051,0.0369,0.0090,43.7344 +Kodak,5x5,ldr-rgb-kodak11.png,40.1347,0.0397,0.0130,30.3481 +Kodak,5x5,ldr-rgb-kodak12.png,43.3587,0.0338,0.0081,48.5579 +Kodak,5x5,ldr-rgb-kodak13.png,36.7643,0.0507,0.0217,18.1288 +Kodak,5x5,ldr-rgb-kodak14.png,37.6133,0.0447,0.0181,21.7536 +Kodak,5x5,ldr-rgb-kodak15.png,40.9873,0.0400,0.0124,31.7088 +Kodak,5x5,ldr-rgb-kodak16.png,43.4448,0.0337,0.0080,49.3615 +Kodak,5x5,ldr-rgb-kodak17.png,41.9440,0.0370,0.0087,45.1137 +Kodak,5x5,ldr-rgb-kodak18.png,37.9804,0.0470,0.0180,21.8672 +Kodak,5x5,ldr-rgb-kodak19.png,40.9586,0.0399,0.0110,35.6621 +Kodak,5x5,ldr-rgb-kodak20.png,42.2591,0.0353,0.0092,42.8671 +Kodak,5x5,ldr-rgb-kodak21.png,40.2790,0.0399,0.0127,30.8482 +Kodak,5x5,ldr-rgb-kodak22.png,39.5517,0.0430,0.0144,27.3026 +Kodak,5x5,ldr-rgb-kodak23.png,42.2620,0.0377,0.0101,39.0018 +Kodak,5x5,ldr-rgb-kodak24.png,37.7277,0.0445,0.0160,24.6299 +Kodak,6x6,ldr-rgb-kodak01.png,35.6776,0.0462,0.0212,18.5785 +Kodak,6x6,ldr-rgb-kodak02.png,38.0867,0.0416,0.0136,28.8218 +Kodak,6x6,ldr-rgb-kodak03.png,40.4245,0.0350,0.0089,44.3208 +Kodak,6x6,ldr-rgb-kodak04.png,38.3897,0.0416,0.0128,30.7659 +Kodak,6x6,ldr-rgb-kodak05.png,34.1774,0.0533,0.0262,15.0168 +Kodak,6x6,ldr-rgb-kodak06.png,37.2675,0.0395,0.0144,27.2161 +Kodak,6x6,ldr-rgb-kodak07.png,38.7256,0.0409,0.0125,31.5378 +Kodak,6x6,ldr-rgb-kodak08.png,34.2713,0.0553,0.0271,14.5136 +Kodak,6x6,ldr-rgb-kodak09.png,39.8360,0.0361,0.0098,40.2673 +Kodak,6x6,ldr-rgb-kodak10.png,39.6271,0.0380,0.0095,41.2049 +Kodak,6x6,ldr-rgb-kodak11.png,37.0482,0.0424,0.0147,26.6876 +Kodak,6x6,ldr-rgb-kodak12.png,40.6772,0.0355,0.0085,46.2070 +Kodak,6x6,ldr-rgb-kodak13.png,32.7550,0.0586,0.0299,13.1440 +Kodak,6x6,ldr-rgb-kodak14.png,35.0224,0.0478,0.0207,18.9593 +Kodak,6x6,ldr-rgb-kodak15.png,38.4599,0.0406,0.0131,30.1247 +Kodak,6x6,ldr-rgb-kodak16.png,40.4730,0.0350,0.0088,44.5664 +Kodak,6x6,ldr-rgb-kodak17.png,38.8345,0.0382,0.0101,38.8438 +Kodak,6x6,ldr-rgb-kodak18.png,35.0306,0.0505,0.0203,19.3635 +Kodak,6x6,ldr-rgb-kodak19.png,37.8819,0.0425,0.0141,27.9452 +Kodak,6x6,ldr-rgb-kodak20.png,39.1418,0.0356,0.0107,36.7869 +Kodak,6x6,ldr-rgb-kodak21.png,36.8511,0.0437,0.0158,24.9613 +Kodak,6x6,ldr-rgb-kodak22.png,36.9051,0.0448,0.0158,24.8605 +Kodak,6x6,ldr-rgb-kodak23.png,39.9301,0.0367,0.0097,40.3382 +Kodak,6x6,ldr-rgb-kodak24.png,34.7436,0.0472,0.0186,21.1144 +Kodak,8x8,ldr-rgb-kodak01.png,31.2082,0.0555,0.0303,12.9598 +Kodak,8x8,ldr-rgb-kodak02.png,34.8017,0.0418,0.0140,28.0411 +Kodak,8x8,ldr-rgb-kodak03.png,36.4985,0.0371,0.0107,36.8766 +Kodak,8x8,ldr-rgb-kodak04.png,35.1022,0.0420,0.0137,28.7860 +Kodak,8x8,ldr-rgb-kodak05.png,30.0751,0.0653,0.0366,10.7404 +Kodak,8x8,ldr-rgb-kodak06.png,32.8281,0.0472,0.0212,18.5917 +Kodak,8x8,ldr-rgb-kodak07.png,34.8646,0.0418,0.0156,25.2626 +Kodak,8x8,ldr-rgb-kodak08.png,29.7289,0.0664,0.0381,10.3288 +Kodak,8x8,ldr-rgb-kodak09.png,35.9623,0.0388,0.0119,32.9405 +Kodak,8x8,ldr-rgb-kodak10.png,35.7575,0.0394,0.0111,35.4125 +Kodak,8x8,ldr-rgb-kodak11.png,32.8944,0.0465,0.0196,20.0314 +Kodak,8x8,ldr-rgb-kodak12.png,36.5619,0.0366,0.0106,37.1591 +Kodak,8x8,ldr-rgb-kodak13.png,28.1501,0.0720,0.0441,8.9116 +Kodak,8x8,ldr-rgb-kodak14.png,31.3321,0.0540,0.0283,13.8925 +Kodak,8x8,ldr-rgb-kodak15.png,34.7918,0.0407,0.0140,28.1469 +Kodak,8x8,ldr-rgb-kodak16.png,35.9809,0.0391,0.0130,30.2030 +Kodak,8x8,ldr-rgb-kodak17.png,34.7507,0.0419,0.0127,30.9518 +Kodak,8x8,ldr-rgb-kodak18.png,31.1839,0.0540,0.0255,15.4293 +Kodak,8x8,ldr-rgb-kodak19.png,33.9323,0.0459,0.0174,22.5714 +Kodak,8x8,ldr-rgb-kodak20.png,35.1250,0.0379,0.0127,31.0083 +Kodak,8x8,ldr-rgb-kodak21.png,32.6633,0.0489,0.0207,18.9556 +Kodak,8x8,ldr-rgb-kodak22.png,33.3552,0.0464,0.0183,21.4578 +Kodak,8x8,ldr-rgb-kodak23.png,36.4364,0.0369,0.0099,39.6106 +Kodak,8x8,ldr-rgb-kodak24.png,30.7663,0.0534,0.0236,16.6420 +Kodak,12x12,ldr-rgb-kodak01.png,27.0008,0.0505,0.0239,16.4394 +Kodak,12x12,ldr-rgb-kodak02.png,31.0415,0.0365,0.0080,49.3926 +Kodak,12x12,ldr-rgb-kodak03.png,32.6513,0.0340,0.0069,56.7480 +Kodak,12x12,ldr-rgb-kodak04.png,31.4912,0.0369,0.0069,57.3618 +Kodak,12x12,ldr-rgb-kodak05.png,25.7162,0.0555,0.0266,14.7802 +Kodak,12x12,ldr-rgb-kodak06.png,28.4959,0.0443,0.0168,23.4671 +Kodak,12x12,ldr-rgb-kodak07.png,30.8219,0.0372,0.0093,42.4872 +Kodak,12x12,ldr-rgb-kodak08.png,25.2268,0.0617,0.0313,12.5704 +Kodak,12x12,ldr-rgb-kodak09.png,31.6541,0.0360,0.0079,49.8946 +Kodak,12x12,ldr-rgb-kodak10.png,31.4641,0.0394,0.0076,51.9160 +Kodak,12x12,ldr-rgb-kodak11.png,28.8804,0.0421,0.0127,31.0304 +Kodak,12x12,ldr-rgb-kodak12.png,32.2096,0.0344,0.0067,58.3915 +Kodak,12x12,ldr-rgb-kodak13.png,24.2505,0.0617,0.0329,11.9449 +Kodak,12x12,ldr-rgb-kodak14.png,27.4640,0.0447,0.0175,22.4158 +Kodak,12x12,ldr-rgb-kodak15.png,31.1808,0.0378,0.0097,40.5295 +Kodak,12x12,ldr-rgb-kodak16.png,31.3728,0.0360,0.0086,45.8831 +Kodak,12x12,ldr-rgb-kodak17.png,30.8456,0.0373,0.0082,48.2355 +Kodak,12x12,ldr-rgb-kodak18.png,27.3784,0.0473,0.0165,23.7866 +Kodak,12x12,ldr-rgb-kodak19.png,29.8837,0.0427,0.0129,30.5341 +Kodak,12x12,ldr-rgb-kodak20.png,30.9559,0.0372,0.0095,41.5527 +Kodak,12x12,ldr-rgb-kodak21.png,28.6284,0.0447,0.0162,24.2069 +Kodak,12x12,ldr-rgb-kodak22.png,29.7698,0.0398,0.0099,39.6068 +Kodak,12x12,ldr-rgb-kodak23.png,32.4950,0.0352,0.0070,56.5534 +Kodak,12x12,ldr-rgb-kodak24.png,26.7119,0.0460,0.0172,22.8960 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse2_medium_results.csv new file mode 100644 index 0000000..2db37ba --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse2_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.3900,0.1168,0.0918,4.2814 +Kodak,4x4,ldr-rgb-kodak02.png,45.5266,0.1737,0.1483,2.6512 +Kodak,4x4,ldr-rgb-kodak03.png,47.8390,0.0971,0.0723,5.4405 +Kodak,4x4,ldr-rgb-kodak04.png,45.6293,0.1421,0.1144,3.4373 +Kodak,4x4,ldr-rgb-kodak05.png,42.2268,0.1524,0.1255,3.1339 +Kodak,4x4,ldr-rgb-kodak06.png,45.2804,0.1133,0.0881,4.4652 +Kodak,4x4,ldr-rgb-kodak07.png,46.1450,0.1140,0.0878,4.4801 +Kodak,4x4,ldr-rgb-kodak08.png,42.5929,0.1587,0.1303,3.0170 +Kodak,4x4,ldr-rgb-kodak09.png,47.3636,0.1395,0.1136,3.4622 +Kodak,4x4,ldr-rgb-kodak10.png,47.0403,0.1402,0.1133,3.4712 +Kodak,4x4,ldr-rgb-kodak11.png,44.9930,0.1341,0.1087,3.6169 +Kodak,4x4,ldr-rgb-kodak12.png,48.1508,0.1082,0.0832,4.7260 +Kodak,4x4,ldr-rgb-kodak13.png,41.7091,0.1238,0.0968,4.0617 +Kodak,4x4,ldr-rgb-kodak14.png,42.7747,0.1425,0.1169,3.3632 +Kodak,4x4,ldr-rgb-kodak15.png,45.6063,0.1278,0.1012,3.8872 +Kodak,4x4,ldr-rgb-kodak16.png,48.0286,0.1053,0.0806,4.8802 +Kodak,4x4,ldr-rgb-kodak17.png,46.4272,0.1256,0.0990,3.9712 +Kodak,4x4,ldr-rgb-kodak18.png,42.1025,0.1730,0.1455,2.7023 +Kodak,4x4,ldr-rgb-kodak19.png,45.4882,0.1413,0.1140,3.4493 +Kodak,4x4,ldr-rgb-kodak20.png,46.9603,0.0926,0.0682,5.7662 +Kodak,4x4,ldr-rgb-kodak21.png,45.3041,0.1429,0.1169,3.3645 +Kodak,4x4,ldr-rgb-kodak22.png,43.9220,0.1769,0.1491,2.6373 +Kodak,4x4,ldr-rgb-kodak23.png,47.0296,0.1448,0.1189,3.3065 +Kodak,4x4,ldr-rgb-kodak24.png,42.4676,0.1367,0.1090,3.6065 +Kodak,5x5,ldr-rgb-kodak01.png,40.1428,0.1222,0.0978,4.0192 +Kodak,5x5,ldr-rgb-kodak02.png,41.8098,0.1439,0.1174,3.3498 +Kodak,5x5,ldr-rgb-kodak03.png,44.1564,0.0743,0.0495,7.9386 +Kodak,5x5,ldr-rgb-kodak04.png,42.1557,0.1115,0.0852,4.6173 +Kodak,5x5,ldr-rgb-kodak05.png,38.0375,0.1436,0.1190,3.3039 +Kodak,5x5,ldr-rgb-kodak06.png,41.0310,0.1023,0.0768,5.1190 +Kodak,5x5,ldr-rgb-kodak07.png,42.5449,0.0926,0.0668,5.8857 +Kodak,5x5,ldr-rgb-kodak08.png,38.3909,0.1491,0.1213,3.2405 +Kodak,5x5,ldr-rgb-kodak09.png,43.8761,0.0834,0.0573,6.8672 +Kodak,5x5,ldr-rgb-kodak10.png,43.4926,0.0907,0.0643,6.1116 +Kodak,5x5,ldr-rgb-kodak11.png,40.9014,0.1168,0.0913,4.3052 +Kodak,5x5,ldr-rgb-kodak12.png,44.5087,0.0751,0.0502,7.8366 +Kodak,5x5,ldr-rgb-kodak13.png,36.9547,0.1257,0.0987,3.9851 +Kodak,5x5,ldr-rgb-kodak14.png,38.7244,0.1322,0.1063,3.6987 +Kodak,5x5,ldr-rgb-kodak15.png,41.9961,0.1060,0.0799,4.9217 +Kodak,5x5,ldr-rgb-kodak16.png,44.2004,0.0794,0.0545,7.2138 +Kodak,5x5,ldr-rgb-kodak17.png,42.5924,0.0832,0.0567,6.9394 +Kodak,5x5,ldr-rgb-kodak18.png,38.4191,0.1396,0.1136,3.4628 +Kodak,5x5,ldr-rgb-kodak19.png,41.7153,0.0993,0.0725,5.4202 +Kodak,5x5,ldr-rgb-kodak20.png,43.1410,0.0734,0.0492,7.9937 +Kodak,5x5,ldr-rgb-kodak21.png,40.8178,0.1028,0.0772,5.0904 +Kodak,5x5,ldr-rgb-kodak22.png,40.3445,0.1376,0.1105,3.5591 +Kodak,5x5,ldr-rgb-kodak23.png,43.6620,0.0989,0.0731,5.3825 +Kodak,5x5,ldr-rgb-kodak24.png,38.2488,0.1159,0.0893,4.4034 +Kodak,6x6,ldr-rgb-kodak01.png,36.2113,0.1280,0.1032,3.8111 +Kodak,6x6,ldr-rgb-kodak02.png,39.0614,0.1164,0.0903,4.3525 +Kodak,6x6,ldr-rgb-kodak03.png,41.3770,0.0642,0.0396,9.9277 +Kodak,6x6,ldr-rgb-kodak04.png,39.4395,0.0997,0.0728,5.3994 +Kodak,6x6,ldr-rgb-kodak05.png,34.8184,0.1445,0.1180,3.3321 +Kodak,6x6,ldr-rgb-kodak06.png,37.6639,0.0958,0.0706,5.5728 +Kodak,6x6,ldr-rgb-kodak07.png,39.8300,0.0839,0.0574,6.8499 +Kodak,6x6,ldr-rgb-kodak08.png,34.9957,0.1500,0.1218,3.2278 +Kodak,6x6,ldr-rgb-kodak09.png,40.9226,0.0681,0.0419,9.3887 +Kodak,6x6,ldr-rgb-kodak10.png,40.5493,0.0712,0.0449,8.7611 +Kodak,6x6,ldr-rgb-kodak11.png,37.6100,0.1040,0.0785,5.0079 +Kodak,6x6,ldr-rgb-kodak12.png,41.5485,0.0629,0.0379,10.3666 +Kodak,6x6,ldr-rgb-kodak13.png,32.9142,0.1387,0.1116,3.5250 +Kodak,6x6,ldr-rgb-kodak14.png,35.8636,0.1269,0.1025,3.8373 +Kodak,6x6,ldr-rgb-kodak15.png,39.2411,0.0989,0.0721,5.4560 +Kodak,6x6,ldr-rgb-kodak16.png,41.0644,0.0687,0.0441,8.9221 +Kodak,6x6,ldr-rgb-kodak17.png,39.4963,0.0722,0.0455,8.6509 +Kodak,6x6,ldr-rgb-kodak18.png,35.3775,0.1305,0.1023,3.8434 +Kodak,6x6,ldr-rgb-kodak19.png,38.5482,0.0917,0.0646,6.0894 +Kodak,6x6,ldr-rgb-kodak20.png,39.8612,0.0701,0.0458,8.5784 +Kodak,6x6,ldr-rgb-kodak21.png,37.2219,0.0926,0.0671,5.8610 +Kodak,6x6,ldr-rgb-kodak22.png,37.4990,0.1194,0.0922,4.2665 +Kodak,6x6,ldr-rgb-kodak23.png,41.0323,0.0755,0.0502,7.8366 +Kodak,6x6,ldr-rgb-kodak24.png,35.0904,0.1072,0.0804,4.8902 +Kodak,8x8,ldr-rgb-kodak01.png,31.8088,0.1748,0.1497,2.6266 +Kodak,8x8,ldr-rgb-kodak02.png,35.8041,0.1200,0.0934,4.2105 +Kodak,8x8,ldr-rgb-kodak03.png,37.7807,0.0786,0.0531,7.4016 +Kodak,8x8,ldr-rgb-kodak04.png,36.1152,0.1117,0.0843,4.6668 +Kodak,8x8,ldr-rgb-kodak05.png,30.7592,0.1906,0.1647,2.3870 +Kodak,8x8,ldr-rgb-kodak06.png,33.4597,0.1220,0.0963,4.0852 +Kodak,8x8,ldr-rgb-kodak07.png,36.1791,0.1022,0.0749,5.2474 +Kodak,8x8,ldr-rgb-kodak08.png,30.5504,0.1957,0.1672,2.3521 +Kodak,8x8,ldr-rgb-kodak09.png,37.2788,0.0807,0.0536,7.3368 +Kodak,8x8,ldr-rgb-kodak10.png,36.9460,0.0822,0.0550,7.1489 +Kodak,8x8,ldr-rgb-kodak11.png,33.6799,0.1255,0.0991,3.9671 +Kodak,8x8,ldr-rgb-kodak12.png,37.8704,0.0773,0.0519,7.5774 +Kodak,8x8,ldr-rgb-kodak13.png,28.4023,0.1867,0.1614,2.4355 +Kodak,8x8,ldr-rgb-kodak14.png,32.1597,0.1647,0.1383,2.8425 +Kodak,8x8,ldr-rgb-kodak15.png,35.8630,0.1027,0.0757,5.1938 +Kodak,8x8,ldr-rgb-kodak16.png,37.0443,0.0864,0.0613,6.4157 +Kodak,8x8,ldr-rgb-kodak17.png,35.6841,0.0874,0.0599,6.5632 +Kodak,8x8,ldr-rgb-kodak18.png,31.5638,0.1538,0.1250,3.1454 +Kodak,8x8,ldr-rgb-kodak19.png,34.7826,0.1092,0.0815,4.8270 +Kodak,8x8,ldr-rgb-kodak20.png,35.9506,0.0871,0.0615,6.3977 +Kodak,8x8,ldr-rgb-kodak21.png,33.1239,0.1174,0.0909,4.3267 +Kodak,8x8,ldr-rgb-kodak22.png,34.0587,0.1322,0.1049,3.7469 +Kodak,8x8,ldr-rgb-kodak23.png,37.7041,0.0803,0.0539,7.2985 +Kodak,8x8,ldr-rgb-kodak24.png,31.1428,0.1307,0.1032,3.8107 +Kodak,12x12,ldr-rgb-kodak01.png,27.7593,0.1821,0.1554,2.5298 +Kodak,12x12,ldr-rgb-kodak02.png,32.4650,0.0922,0.0626,6.2776 +Kodak,12x12,ldr-rgb-kodak03.png,33.8493,0.0687,0.0415,9.4776 +Kodak,12x12,ldr-rgb-kodak04.png,32.4639,0.0800,0.0512,7.6763 +Kodak,12x12,ldr-rgb-kodak05.png,26.4050,0.1992,0.1706,2.3045 +Kodak,12x12,ldr-rgb-kodak06.png,29.3844,0.1214,0.0931,4.2242 +Kodak,12x12,ldr-rgb-kodak07.png,32.0587,0.0968,0.0683,5.7572 +Kodak,12x12,ldr-rgb-kodak08.png,26.0674,0.2070,0.1767,2.2254 +Kodak,12x12,ldr-rgb-kodak09.png,33.1166,0.0732,0.0446,8.8112 +Kodak,12x12,ldr-rgb-kodak10.png,32.5013,0.0728,0.0441,8.9246 +Kodak,12x12,ldr-rgb-kodak11.png,29.7620,0.1150,0.0875,4.4946 +Kodak,12x12,ldr-rgb-kodak12.png,33.9091,0.0683,0.0410,9.5951 +Kodak,12x12,ldr-rgb-kodak13.png,24.5329,0.2078,0.1780,2.2095 +Kodak,12x12,ldr-rgb-kodak14.png,28.4363,0.1601,0.1317,2.9857 +Kodak,12x12,ldr-rgb-kodak15.png,32.2535,0.0903,0.0616,6.3877 +Kodak,12x12,ldr-rgb-kodak16.png,32.9949,0.0779,0.0507,7.7564 +Kodak,12x12,ldr-rgb-kodak17.png,31.7945,0.0796,0.0504,7.8010 +Kodak,12x12,ldr-rgb-kodak18.png,27.7879,0.1425,0.1129,3.4837 +Kodak,12x12,ldr-rgb-kodak19.png,30.9041,0.1014,0.0720,5.4584 +Kodak,12x12,ldr-rgb-kodak20.png,31.8897,0.0794,0.0527,7.4601 +Kodak,12x12,ldr-rgb-kodak21.png,29.1922,0.1237,0.0962,4.0878 +Kodak,12x12,ldr-rgb-kodak22.png,30.5213,0.1098,0.0805,4.8861 +Kodak,12x12,ldr-rgb-kodak23.png,33.5912,0.0638,0.0358,10.9852 +Kodak,12x12,ldr-rgb-kodak24.png,27.1145,0.1262,0.0973,4.0405 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse2_thorough_results.csv new file mode 100644 index 0000000..5dcaa93 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse2_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.5922,0.2486,0.2239,1.7562 +Kodak,4x4,ldr-rgb-kodak02.png,45.8028,0.3573,0.3306,1.1894 +Kodak,4x4,ldr-rgb-kodak03.png,48.2430,0.2771,0.2524,1.5578 +Kodak,4x4,ldr-rgb-kodak04.png,45.8232,0.3201,0.2952,1.3320 +Kodak,4x4,ldr-rgb-kodak05.png,42.4987,0.3112,0.2859,1.3755 +Kodak,4x4,ldr-rgb-kodak06.png,45.4846,0.2624,0.2366,1.6620 +Kodak,4x4,ldr-rgb-kodak07.png,46.5250,0.3048,0.2784,1.4125 +Kodak,4x4,ldr-rgb-kodak08.png,42.8951,0.3270,0.2992,1.3143 +Kodak,4x4,ldr-rgb-kodak09.png,47.6390,0.3319,0.3055,1.2873 +Kodak,4x4,ldr-rgb-kodak10.png,47.2881,0.3281,0.3030,1.2978 +Kodak,4x4,ldr-rgb-kodak11.png,45.2534,0.2961,0.2696,1.4585 +Kodak,4x4,ldr-rgb-kodak12.png,48.4737,0.2873,0.2644,1.4873 +Kodak,4x4,ldr-rgb-kodak13.png,41.8173,0.2596,0.2326,1.6903 +Kodak,4x4,ldr-rgb-kodak14.png,43.0369,0.2926,0.2684,1.4651 +Kodak,4x4,ldr-rgb-kodak15.png,45.9032,0.3106,0.2844,1.3828 +Kodak,4x4,ldr-rgb-kodak16.png,48.2456,0.2790,0.2538,1.5493 +Kodak,4x4,ldr-rgb-kodak17.png,46.6010,0.3054,0.2785,1.4119 +Kodak,4x4,ldr-rgb-kodak18.png,42.2712,0.3543,0.3243,1.2126 +Kodak,4x4,ldr-rgb-kodak19.png,45.7045,0.3162,0.2888,1.3614 +Kodak,4x4,ldr-rgb-kodak20.png,47.2404,0.2135,0.1886,2.0852 +Kodak,4x4,ldr-rgb-kodak21.png,45.4559,0.3179,0.2919,1.3470 +Kodak,4x4,ldr-rgb-kodak22.png,44.1146,0.3633,0.3346,1.1753 +Kodak,4x4,ldr-rgb-kodak23.png,47.3579,0.3472,0.3209,1.2252 +Kodak,4x4,ldr-rgb-kodak24.png,42.6976,0.3095,0.2818,1.3955 +Kodak,5x5,ldr-rgb-kodak01.png,40.2582,0.2976,0.2723,1.4438 +Kodak,5x5,ldr-rgb-kodak02.png,42.0902,0.3953,0.3691,1.0654 +Kodak,5x5,ldr-rgb-kodak03.png,44.4690,0.3001,0.2763,1.4232 +Kodak,5x5,ldr-rgb-kodak04.png,42.3451,0.3329,0.3049,1.2895 +Kodak,5x5,ldr-rgb-kodak05.png,38.2336,0.3511,0.3257,1.2071 +Kodak,5x5,ldr-rgb-kodak06.png,41.1423,0.2821,0.2561,1.5351 +Kodak,5x5,ldr-rgb-kodak07.png,42.8235,0.3329,0.3051,1.2886 +Kodak,5x5,ldr-rgb-kodak08.png,38.5691,0.3491,0.3214,1.2236 +Kodak,5x5,ldr-rgb-kodak09.png,44.1096,0.3268,0.3000,1.3108 +Kodak,5x5,ldr-rgb-kodak10.png,43.6852,0.3352,0.3074,1.2792 +Kodak,5x5,ldr-rgb-kodak11.png,41.0686,0.3161,0.2903,1.3544 +Kodak,5x5,ldr-rgb-kodak12.png,44.7130,0.3000,0.2754,1.4279 +Kodak,5x5,ldr-rgb-kodak13.png,37.0068,0.2708,0.2434,1.6155 +Kodak,5x5,ldr-rgb-kodak14.png,38.9474,0.3245,0.2988,1.3159 +Kodak,5x5,ldr-rgb-kodak15.png,42.2161,0.3270,0.3009,1.3068 +Kodak,5x5,ldr-rgb-kodak16.png,44.3498,0.2925,0.2686,1.4637 +Kodak,5x5,ldr-rgb-kodak17.png,42.6976,0.3037,0.2784,1.4123 +Kodak,5x5,ldr-rgb-kodak18.png,38.5158,0.3558,0.3274,1.2012 +Kodak,5x5,ldr-rgb-kodak19.png,41.8549,0.3320,0.3036,1.2950 +Kodak,5x5,ldr-rgb-kodak20.png,43.3603,0.2130,0.1883,2.0887 +Kodak,5x5,ldr-rgb-kodak21.png,40.9302,0.3367,0.3116,1.2620 +Kodak,5x5,ldr-rgb-kodak22.png,40.4958,0.3826,0.3546,1.1089 +Kodak,5x5,ldr-rgb-kodak23.png,43.9970,0.3820,0.3550,1.1077 +Kodak,5x5,ldr-rgb-kodak24.png,38.3771,0.3302,0.3050,1.2891 +Kodak,6x6,ldr-rgb-kodak01.png,36.3296,0.3418,0.3168,1.2413 +Kodak,6x6,ldr-rgb-kodak02.png,39.4323,0.4304,0.4059,0.9688 +Kodak,6x6,ldr-rgb-kodak03.png,41.8030,0.2782,0.2531,1.5536 +Kodak,6x6,ldr-rgb-kodak04.png,39.7105,0.3564,0.3289,1.1955 +Kodak,6x6,ldr-rgb-kodak05.png,35.0194,0.3927,0.3650,1.0772 +Kodak,6x6,ldr-rgb-kodak06.png,37.7820,0.3094,0.2832,1.3883 +Kodak,6x6,ldr-rgb-kodak07.png,40.1759,0.3180,0.2908,1.3521 +Kodak,6x6,ldr-rgb-kodak08.png,35.1892,0.3861,0.3597,1.0931 +Kodak,6x6,ldr-rgb-kodak09.png,41.3074,0.3340,0.3075,1.2786 +Kodak,6x6,ldr-rgb-kodak10.png,40.8881,0.3604,0.3337,1.1782 +Kodak,6x6,ldr-rgb-kodak11.png,37.8001,0.3439,0.3176,1.2379 +Kodak,6x6,ldr-rgb-kodak12.png,41.8937,0.3137,0.2889,1.3609 +Kodak,6x6,ldr-rgb-kodak13.png,32.9664,0.3219,0.2958,1.3292 +Kodak,6x6,ldr-rgb-kodak14.png,36.0648,0.3685,0.3438,1.1437 +Kodak,6x6,ldr-rgb-kodak15.png,39.4992,0.3222,0.2954,1.3310 +Kodak,6x6,ldr-rgb-kodak16.png,41.2652,0.2981,0.2727,1.4420 +Kodak,6x6,ldr-rgb-kodak17.png,39.7005,0.3318,0.3043,1.2924 +Kodak,6x6,ldr-rgb-kodak18.png,35.4652,0.3942,0.3649,1.0777 +Kodak,6x6,ldr-rgb-kodak19.png,38.7403,0.3677,0.3399,1.1568 +Kodak,6x6,ldr-rgb-kodak20.png,40.1606,0.2332,0.2080,1.8909 +Kodak,6x6,ldr-rgb-kodak21.png,37.3715,0.3654,0.3390,1.1601 +Kodak,6x6,ldr-rgb-kodak22.png,37.6700,0.4182,0.3908,1.0061 +Kodak,6x6,ldr-rgb-kodak23.png,41.4972,0.3920,0.3655,1.0759 +Kodak,6x6,ldr-rgb-kodak24.png,35.2077,0.3538,0.3259,1.2066 +Kodak,8x8,ldr-rgb-kodak01.png,31.9182,0.4403,0.4140,0.9497 +Kodak,8x8,ldr-rgb-kodak02.png,36.1788,0.4387,0.4133,0.9514 +Kodak,8x8,ldr-rgb-kodak03.png,38.2256,0.2437,0.2174,1.8087 +Kodak,8x8,ldr-rgb-kodak04.png,36.4047,0.3586,0.3320,1.1845 +Kodak,8x8,ldr-rgb-kodak05.png,30.9271,0.4765,0.4497,0.8744 +Kodak,8x8,ldr-rgb-kodak06.png,33.5892,0.3624,0.3374,1.1656 +Kodak,8x8,ldr-rgb-kodak07.png,36.5323,0.2937,0.2685,1.4647 +Kodak,8x8,ldr-rgb-kodak08.png,30.7450,0.5158,0.4881,0.8056 +Kodak,8x8,ldr-rgb-kodak09.png,37.5746,0.2694,0.2412,1.6301 +Kodak,8x8,ldr-rgb-kodak10.png,37.2611,0.3084,0.2803,1.4028 +Kodak,8x8,ldr-rgb-kodak11.png,33.8471,0.4245,0.3978,0.9885 +Kodak,8x8,ldr-rgb-kodak12.png,38.2959,0.2784,0.2525,1.5570 +Kodak,8x8,ldr-rgb-kodak13.png,28.4658,0.4527,0.4237,0.9281 +Kodak,8x8,ldr-rgb-kodak14.png,32.3355,0.4639,0.4360,0.9020 +Kodak,8x8,ldr-rgb-kodak15.png,36.0844,0.3392,0.3111,1.2638 +Kodak,8x8,ldr-rgb-kodak16.png,37.2854,0.2985,0.2722,1.4444 +Kodak,8x8,ldr-rgb-kodak17.png,35.8833,0.2975,0.2685,1.4643 +Kodak,8x8,ldr-rgb-kodak18.png,31.6609,0.4716,0.4419,0.8899 +Kodak,8x8,ldr-rgb-kodak19.png,34.9459,0.3217,0.2923,1.3452 +Kodak,8x8,ldr-rgb-kodak20.png,36.1871,0.2579,0.2313,1.6997 +Kodak,8x8,ldr-rgb-kodak21.png,33.2364,0.3384,0.3117,1.2613 +Kodak,8x8,ldr-rgb-kodak22.png,34.2428,0.4389,0.4129,0.9523 +Kodak,8x8,ldr-rgb-kodak23.png,38.2266,0.2936,0.2660,1.4780 +Kodak,8x8,ldr-rgb-kodak24.png,31.2516,0.3862,0.3593,1.0943 +Kodak,12x12,ldr-rgb-kodak01.png,27.9177,0.5414,0.5123,0.7675 +Kodak,12x12,ldr-rgb-kodak02.png,33.0100,0.4082,0.3766,1.0441 +Kodak,12x12,ldr-rgb-kodak03.png,34.4665,0.2469,0.2163,1.8182 +Kodak,12x12,ldr-rgb-kodak04.png,32.9831,0.3554,0.3243,1.2125 +Kodak,12x12,ldr-rgb-kodak05.png,26.6116,0.5848,0.5559,0.7074 +Kodak,12x12,ldr-rgb-kodak06.png,29.5405,0.4013,0.3719,1.0573 +Kodak,12x12,ldr-rgb-kodak07.png,32.6427,0.3121,0.2791,1.4089 +Kodak,12x12,ldr-rgb-kodak08.png,26.2689,0.5958,0.5607,0.7013 +Kodak,12x12,ldr-rgb-kodak09.png,33.6395,0.2838,0.2533,1.5525 +Kodak,12x12,ldr-rgb-kodak10.png,33.0011,0.2790,0.2480,1.5858 +Kodak,12x12,ldr-rgb-kodak11.png,30.0591,0.4273,0.3969,0.9908 +Kodak,12x12,ldr-rgb-kodak12.png,34.4608,0.2562,0.2266,1.7354 +Kodak,12x12,ldr-rgb-kodak13.png,24.5896,0.6341,0.6011,0.6542 +Kodak,12x12,ldr-rgb-kodak14.png,28.6523,0.5261,0.4924,0.7986 +Kodak,12x12,ldr-rgb-kodak15.png,32.7473,0.3435,0.3114,1.2629 +Kodak,12x12,ldr-rgb-kodak16.png,33.3428,0.3003,0.2715,1.4483 +Kodak,12x12,ldr-rgb-kodak17.png,32.1405,0.3009,0.2698,1.4572 +Kodak,12x12,ldr-rgb-kodak18.png,27.9302,0.5155,0.4852,0.8104 +Kodak,12x12,ldr-rgb-kodak19.png,31.1152,0.4067,0.3738,1.0518 +Kodak,12x12,ldr-rgb-kodak20.png,32.1883,0.3157,0.2856,1.3770 +Kodak,12x12,ldr-rgb-kodak21.png,29.3322,0.3833,0.3537,1.1118 +Kodak,12x12,ldr-rgb-kodak22.png,30.7936,0.4535,0.4244,0.9265 +Kodak,12x12,ldr-rgb-kodak23.png,34.3943,0.2552,0.2249,1.7486 +Kodak,12x12,ldr-rgb-kodak24.png,27.2471,0.4635,0.4310,0.9124 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse4.1_fast_results.csv new file mode 100644 index 0000000..4d95e5e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse4.1_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.9520,0.0415,0.0156,25.1693 +Kodak,4x4,ldr-rgb-kodak02.png,44.3434,0.0487,0.0229,17.1493 +Kodak,4x4,ldr-rgb-kodak03.png,46.8392,0.0370,0.0125,31.4650 +Kodak,4x4,ldr-rgb-kodak04.png,44.7718,0.0463,0.0203,19.4123 +Kodak,4x4,ldr-rgb-kodak05.png,41.6993,0.0572,0.0311,12.6330 +Kodak,4x4,ldr-rgb-kodak06.png,44.8560,0.0394,0.0155,25.4030 +Kodak,4x4,ldr-rgb-kodak07.png,45.2328,0.0430,0.0171,22.9470 +Kodak,4x4,ldr-rgb-kodak08.png,42.1952,0.0582,0.0314,12.5132 +Kodak,4x4,ldr-rgb-kodak09.png,46.4561,0.0381,0.0116,33.8249 +Kodak,4x4,ldr-rgb-kodak10.png,46.2386,0.0395,0.0125,31.4974 +Kodak,4x4,ldr-rgb-kodak11.png,44.3773,0.0446,0.0192,20.4715 +Kodak,4x4,ldr-rgb-kodak12.png,47.2692,0.0367,0.0110,35.7992 +Kodak,4x4,ldr-rgb-kodak13.png,41.5422,0.0524,0.0259,15.1809 +Kodak,4x4,ldr-rgb-kodak14.png,41.9751,0.0501,0.0253,15.5300 +Kodak,4x4,ldr-rgb-kodak15.png,44.7350,0.0471,0.0221,17.8110 +Kodak,4x4,ldr-rgb-kodak16.png,47.3501,0.0341,0.0099,39.7548 +Kodak,4x4,ldr-rgb-kodak17.png,45.8448,0.0376,0.0109,35.9592 +Kodak,4x4,ldr-rgb-kodak18.png,41.7291,0.0584,0.0303,12.9616 +Kodak,4x4,ldr-rgb-kodak19.png,44.9590,0.0421,0.0149,26.4348 +Kodak,4x4,ldr-rgb-kodak20.png,46.4220,0.0368,0.0130,30.1848 +Kodak,4x4,ldr-rgb-kodak21.png,44.7256,0.0407,0.0158,24.9078 +Kodak,4x4,ldr-rgb-kodak22.png,43.3125,0.0523,0.0252,15.5735 +Kodak,4x4,ldr-rgb-kodak23.png,45.7203,0.0400,0.0153,25.7425 +Kodak,4x4,ldr-rgb-kodak24.png,42.0603,0.0504,0.0242,16.2520 +Kodak,5x5,ldr-rgb-kodak01.png,39.6458,0.0404,0.0151,26.0581 +Kodak,5x5,ldr-rgb-kodak02.png,40.6591,0.0395,0.0143,27.5227 +Kodak,5x5,ldr-rgb-kodak03.png,43.1469,0.0343,0.0097,40.3629 +Kodak,5x5,ldr-rgb-kodak04.png,41.3472,0.0395,0.0132,29.7825 +Kodak,5x5,ldr-rgb-kodak05.png,37.4898,0.0531,0.0259,15.1651 +Kodak,5x5,ldr-rgb-kodak06.png,40.6532,0.0372,0.0121,32.5428 +Kodak,5x5,ldr-rgb-kodak07.png,41.5669,0.0386,0.0126,31.1459 +Kodak,5x5,ldr-rgb-kodak08.png,37.8105,0.0535,0.0259,15.1593 +Kodak,5x5,ldr-rgb-kodak09.png,42.9723,0.0356,0.0087,45.2909 +Kodak,5x5,ldr-rgb-kodak10.png,42.6976,0.0364,0.0090,43.7739 +Kodak,5x5,ldr-rgb-kodak11.png,40.3588,0.0395,0.0142,27.7109 +Kodak,5x5,ldr-rgb-kodak12.png,43.5782,0.0323,0.0079,49.6678 +Kodak,5x5,ldr-rgb-kodak13.png,36.8536,0.0494,0.0220,17.8759 +Kodak,5x5,ldr-rgb-kodak14.png,38.0505,0.0492,0.0233,16.8988 +Kodak,5x5,ldr-rgb-kodak15.png,41.2611,0.0397,0.0138,28.4322 +Kodak,5x5,ldr-rgb-kodak16.png,43.5297,0.0324,0.0073,53.7553 +Kodak,5x5,ldr-rgb-kodak17.png,42.0758,0.0353,0.0088,44.5977 +Kodak,5x5,ldr-rgb-kodak18.png,38.1330,0.0477,0.0196,20.0436 +Kodak,5x5,ldr-rgb-kodak19.png,41.1974,0.0376,0.0106,37.1131 +Kodak,5x5,ldr-rgb-kodak20.png,42.5501,0.0332,0.0094,42.0463 +Kodak,5x5,ldr-rgb-kodak21.png,40.4645,0.0388,0.0129,30.3760 +Kodak,5x5,ldr-rgb-kodak22.png,39.8284,0.0421,0.0157,24.9836 +Kodak,5x5,ldr-rgb-kodak23.png,42.5557,0.0355,0.0102,38.5127 +Kodak,5x5,ldr-rgb-kodak24.png,37.9277,0.0458,0.0183,21.5014 +Kodak,6x6,ldr-rgb-kodak01.png,35.7681,0.0485,0.0225,17.4576 +Kodak,6x6,ldr-rgb-kodak02.png,38.1838,0.0417,0.0160,24.5697 +Kodak,6x6,ldr-rgb-kodak03.png,40.5884,0.0347,0.0097,40.5754 +Kodak,6x6,ldr-rgb-kodak04.png,38.5847,0.0419,0.0141,27.8522 +Kodak,6x6,ldr-rgb-kodak05.png,34.3775,0.0594,0.0320,12.3037 +Kodak,6x6,ldr-rgb-kodak06.png,37.3251,0.0401,0.0150,26.1656 +Kodak,6x6,ldr-rgb-kodak07.png,38.9125,0.0391,0.0136,28.8980 +Kodak,6x6,ldr-rgb-kodak08.png,34.4660,0.0592,0.0320,12.2823 +Kodak,6x6,ldr-rgb-kodak09.png,40.0146,0.0372,0.0103,38.1431 +Kodak,6x6,ldr-rgb-kodak10.png,39.7566,0.0369,0.0103,38.3283 +Kodak,6x6,ldr-rgb-kodak11.png,37.1602,0.0418,0.0164,23.9517 +Kodak,6x6,ldr-rgb-kodak12.png,40.8079,0.0341,0.0086,45.5473 +Kodak,6x6,ldr-rgb-kodak13.png,32.8173,0.0596,0.0330,11.9109 +Kodak,6x6,ldr-rgb-kodak14.png,35.3132,0.0538,0.0276,14.2620 +Kodak,6x6,ldr-rgb-kodak15.png,38.5842,0.0404,0.0147,26.6699 +Kodak,6x6,ldr-rgb-kodak16.png,40.5096,0.0332,0.0086,45.6481 +Kodak,6x6,ldr-rgb-kodak17.png,38.9123,0.0374,0.0103,38.2874 +Kodak,6x6,ldr-rgb-kodak18.png,35.1244,0.0503,0.0227,17.3253 +Kodak,6x6,ldr-rgb-kodak19.png,38.0059,0.0423,0.0147,26.7838 +Kodak,6x6,ldr-rgb-kodak20.png,39.2852,0.0358,0.0114,34.5013 +Kodak,6x6,ldr-rgb-kodak21.png,36.9296,0.0429,0.0169,23.2809 +Kodak,6x6,ldr-rgb-kodak22.png,37.0116,0.0441,0.0177,22.2219 +Kodak,6x6,ldr-rgb-kodak23.png,40.0841,0.0358,0.0103,38.2173 +Kodak,6x6,ldr-rgb-kodak24.png,34.8195,0.0475,0.0206,19.0680 +Kodak,8x8,ldr-rgb-kodak01.png,31.3453,0.0592,0.0345,11.3989 +Kodak,8x8,ldr-rgb-kodak02.png,34.9512,0.0404,0.0155,25.4097 +Kodak,8x8,ldr-rgb-kodak03.png,36.6269,0.0357,0.0114,34.3569 +Kodak,8x8,ldr-rgb-kodak04.png,35.2101,0.0412,0.0150,26.1863 +Kodak,8x8,ldr-rgb-kodak05.png,30.2661,0.0679,0.0419,9.3873 +Kodak,8x8,ldr-rgb-kodak06.png,32.9625,0.0481,0.0237,16.6243 +Kodak,8x8,ldr-rgb-kodak07.png,35.0121,0.0427,0.0172,22.8643 +Kodak,8x8,ldr-rgb-kodak08.png,29.9795,0.0699,0.0428,9.1802 +Kodak,8x8,ldr-rgb-kodak09.png,36.2005,0.0388,0.0127,30.9060 +Kodak,8x8,ldr-rgb-kodak10.png,35.9067,0.0387,0.0118,33.2695 +Kodak,8x8,ldr-rgb-kodak11.png,33.0195,0.0477,0.0218,18.0490 +Kodak,8x8,ldr-rgb-kodak12.png,36.7730,0.0358,0.0110,35.7728 +Kodak,8x8,ldr-rgb-kodak13.png,28.2241,0.0767,0.0503,7.8151 +Kodak,8x8,ldr-rgb-kodak14.png,31.5140,0.0578,0.0331,11.8923 +Kodak,8x8,ldr-rgb-kodak15.png,34.9651,0.0419,0.0156,25.2854 +Kodak,8x8,ldr-rgb-kodak16.png,36.0662,0.0387,0.0141,27.8819 +Kodak,8x8,ldr-rgb-kodak17.png,34.9200,0.0416,0.0139,28.2259 +Kodak,8x8,ldr-rgb-kodak18.png,31.2513,0.0572,0.0292,13.4663 +Kodak,8x8,ldr-rgb-kodak19.png,34.2511,0.0474,0.0197,20.0071 +Kodak,8x8,ldr-rgb-kodak20.png,35.2908,0.0381,0.0139,28.2830 +Kodak,8x8,ldr-rgb-kodak21.png,32.7669,0.0490,0.0233,16.9117 +Kodak,8x8,ldr-rgb-kodak22.png,33.4684,0.0484,0.0206,19.0927 +Kodak,8x8,ldr-rgb-kodak23.png,36.5644,0.0374,0.0106,36.9841 +Kodak,8x8,ldr-rgb-kodak24.png,30.8378,0.0537,0.0266,14.7648 +Kodak,12x12,ldr-rgb-kodak01.png,27.1171,0.0564,0.0289,13.5972 +Kodak,12x12,ldr-rgb-kodak02.png,31.1137,0.0373,0.0087,45.3856 +Kodak,12x12,ldr-rgb-kodak03.png,32.7143,0.0335,0.0077,51.3471 +Kodak,12x12,ldr-rgb-kodak04.png,31.5844,0.0367,0.0071,55.3278 +Kodak,12x12,ldr-rgb-kodak05.png,25.8311,0.0607,0.0328,11.9773 +Kodak,12x12,ldr-rgb-kodak06.png,28.6467,0.0462,0.0202,19.4758 +Kodak,12x12,ldr-rgb-kodak07.png,30.8796,0.0384,0.0104,37.8715 +Kodak,12x12,ldr-rgb-kodak08.png,25.4259,0.0667,0.0379,10.3751 +Kodak,12x12,ldr-rgb-kodak09.png,31.8485,0.0366,0.0088,44.8268 +Kodak,12x12,ldr-rgb-kodak10.png,31.5514,0.0366,0.0083,47.3764 +Kodak,12x12,ldr-rgb-kodak11.png,28.9467,0.0432,0.0150,26.1307 +Kodak,12x12,ldr-rgb-kodak12.png,32.3174,0.0336,0.0072,54.5970 +Kodak,12x12,ldr-rgb-kodak13.png,24.3235,0.0686,0.0405,9.6987 +Kodak,12x12,ldr-rgb-kodak14.png,27.5493,0.0476,0.0211,18.6729 +Kodak,12x12,ldr-rgb-kodak15.png,31.2816,0.0388,0.0110,35.8256 +Kodak,12x12,ldr-rgb-kodak16.png,31.4940,0.0366,0.0095,41.6019 +Kodak,12x12,ldr-rgb-kodak17.png,30.9034,0.0377,0.0095,41.5569 +Kodak,12x12,ldr-rgb-kodak18.png,27.4301,0.0497,0.0200,19.6707 +Kodak,12x12,ldr-rgb-kodak19.png,30.2006,0.0433,0.0148,26.6157 +Kodak,12x12,ldr-rgb-kodak20.png,31.0717,0.0367,0.0106,37.1867 +Kodak,12x12,ldr-rgb-kodak21.png,28.7263,0.0461,0.0195,20.1174 +Kodak,12x12,ldr-rgb-kodak22.png,29.8492,0.0392,0.0114,34.4682 +Kodak,12x12,ldr-rgb-kodak23.png,32.5453,0.0364,0.0077,51.2529 +Kodak,12x12,ldr-rgb-kodak24.png,26.7832,0.0491,0.0203,19.3674 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse4.1_fastest_results.csv new file mode 100644 index 0000000..025e935 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse4.1_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.6152,0.0363,0.0112,35.0461 +Kodak,4x4,ldr-rgb-kodak02.png,43.9224,0.0411,0.0151,26.0737 +Kodak,4x4,ldr-rgb-kodak03.png,46.2368,0.0325,0.0088,44.8524 +Kodak,4x4,ldr-rgb-kodak04.png,44.3531,0.0404,0.0136,28.8490 +Kodak,4x4,ldr-rgb-kodak05.png,41.1551,0.0448,0.0181,21.6718 +Kodak,4x4,ldr-rgb-kodak06.png,44.5683,0.0359,0.0110,35.8770 +Kodak,4x4,ldr-rgb-kodak07.png,44.7745,0.0366,0.0114,34.4228 +Kodak,4x4,ldr-rgb-kodak08.png,41.6238,0.0461,0.0193,20.4057 +Kodak,4x4,ldr-rgb-kodak09.png,46.1082,0.0341,0.0085,46.4242 +Kodak,4x4,ldr-rgb-kodak10.png,45.8847,0.0349,0.0090,43.9196 +Kodak,4x4,ldr-rgb-kodak11.png,43.9616,0.0377,0.0125,31.5076 +Kodak,4x4,ldr-rgb-kodak12.png,46.7087,0.0324,0.0083,47.6447 +Kodak,4x4,ldr-rgb-kodak13.png,41.2762,0.0440,0.0173,22.7426 +Kodak,4x4,ldr-rgb-kodak14.png,41.3103,0.0408,0.0149,26.4772 +Kodak,4x4,ldr-rgb-kodak15.png,44.2711,0.0395,0.0138,28.4219 +Kodak,4x4,ldr-rgb-kodak16.png,47.2082,0.0328,0.0079,49.6304 +Kodak,4x4,ldr-rgb-kodak17.png,45.6054,0.0352,0.0084,47.0292 +Kodak,4x4,ldr-rgb-kodak18.png,41.3844,0.0454,0.0184,21.4146 +Kodak,4x4,ldr-rgb-kodak19.png,44.6830,0.0376,0.0107,36.8667 +Kodak,4x4,ldr-rgb-kodak20.png,45.9296,0.0323,0.0090,43.8274 +Kodak,4x4,ldr-rgb-kodak21.png,44.3989,0.0366,0.0113,34.9310 +Kodak,4x4,ldr-rgb-kodak22.png,42.9303,0.0428,0.0158,24.9330 +Kodak,4x4,ldr-rgb-kodak23.png,45.4033,0.0369,0.0108,36.4157 +Kodak,4x4,ldr-rgb-kodak24.png,41.4983,0.0411,0.0147,26.6695 +Kodak,5x5,ldr-rgb-kodak01.png,39.4204,0.0388,0.0124,31.7619 +Kodak,5x5,ldr-rgb-kodak02.png,40.4373,0.0370,0.0111,35.3897 +Kodak,5x5,ldr-rgb-kodak03.png,42.7911,0.0312,0.0076,51.4351 +Kodak,5x5,ldr-rgb-kodak04.png,40.9568,0.0365,0.0108,36.5173 +Kodak,5x5,ldr-rgb-kodak05.png,37.1419,0.0452,0.0182,21.5591 +Kodak,5x5,ldr-rgb-kodak06.png,40.4991,0.0349,0.0101,38.9015 +Kodak,5x5,ldr-rgb-kodak07.png,41.2599,0.0346,0.0098,40.1077 +Kodak,5x5,ldr-rgb-kodak08.png,37.4816,0.0461,0.0183,21.4533 +Kodak,5x5,ldr-rgb-kodak09.png,42.6721,0.0334,0.0074,53.4262 +Kodak,5x5,ldr-rgb-kodak10.png,42.5051,0.0342,0.0075,52.5127 +Kodak,5x5,ldr-rgb-kodak11.png,40.1347,0.0355,0.0109,35.9764 +Kodak,5x5,ldr-rgb-kodak12.png,43.3587,0.0312,0.0067,58.3316 +Kodak,5x5,ldr-rgb-kodak13.png,36.7643,0.0449,0.0177,22.2031 +Kodak,5x5,ldr-rgb-kodak14.png,37.6133,0.0405,0.0148,26.5938 +Kodak,5x5,ldr-rgb-kodak15.png,40.9873,0.0364,0.0106,37.1097 +Kodak,5x5,ldr-rgb-kodak16.png,43.4448,0.0321,0.0068,57.8163 +Kodak,5x5,ldr-rgb-kodak17.png,41.9440,0.0334,0.0073,54.1845 +Kodak,5x5,ldr-rgb-kodak18.png,37.9804,0.0430,0.0149,26.3054 +Kodak,5x5,ldr-rgb-kodak19.png,40.9586,0.0365,0.0094,42.0378 +Kodak,5x5,ldr-rgb-kodak20.png,42.2591,0.0317,0.0076,51.5767 +Kodak,5x5,ldr-rgb-kodak21.png,40.2790,0.0355,0.0106,37.0364 +Kodak,5x5,ldr-rgb-kodak22.png,39.5517,0.0380,0.0119,33.0462 +Kodak,5x5,ldr-rgb-kodak23.png,42.2620,0.0340,0.0085,46.3916 +Kodak,5x5,ldr-rgb-kodak24.png,37.7277,0.0389,0.0131,30.0189 +Kodak,6x6,ldr-rgb-kodak01.png,35.6776,0.0420,0.0171,23.0020 +Kodak,6x6,ldr-rgb-kodak02.png,38.0867,0.0375,0.0114,34.6172 +Kodak,6x6,ldr-rgb-kodak03.png,40.4245,0.0320,0.0074,53.2967 +Kodak,6x6,ldr-rgb-kodak04.png,38.3897,0.0376,0.0107,36.5813 +Kodak,6x6,ldr-rgb-kodak05.png,34.1774,0.0489,0.0219,17.9855 +Kodak,6x6,ldr-rgb-kodak06.png,37.2675,0.0370,0.0119,33.0740 +Kodak,6x6,ldr-rgb-kodak07.png,38.7256,0.0360,0.0106,37.1273 +Kodak,6x6,ldr-rgb-kodak08.png,34.2713,0.0496,0.0221,17.7725 +Kodak,6x6,ldr-rgb-kodak09.png,39.8360,0.0340,0.0081,48.3713 +Kodak,6x6,ldr-rgb-kodak10.png,39.6271,0.0351,0.0081,48.3897 +Kodak,6x6,ldr-rgb-kodak11.png,37.0482,0.0375,0.0122,32.2627 +Kodak,6x6,ldr-rgb-kodak12.png,40.6772,0.0321,0.0071,55.6264 +Kodak,6x6,ldr-rgb-kodak13.png,32.7550,0.0512,0.0240,16.4093 +Kodak,6x6,ldr-rgb-kodak14.png,35.0224,0.0426,0.0169,23.2727 +Kodak,6x6,ldr-rgb-kodak15.png,38.4599,0.0365,0.0109,36.1975 +Kodak,6x6,ldr-rgb-kodak16.png,40.4730,0.0314,0.0074,53.1953 +Kodak,6x6,ldr-rgb-kodak17.png,38.8345,0.0352,0.0084,47.0024 +Kodak,6x6,ldr-rgb-kodak18.png,35.0306,0.0439,0.0167,23.5856 +Kodak,6x6,ldr-rgb-kodak19.png,37.8819,0.0385,0.0118,33.4286 +Kodak,6x6,ldr-rgb-kodak20.png,39.1418,0.0329,0.0088,44.5881 +Kodak,6x6,ldr-rgb-kodak21.png,36.8511,0.0352,0.0127,30.8915 +Kodak,6x6,ldr-rgb-kodak22.png,36.9051,0.0403,0.0130,30.1522 +Kodak,6x6,ldr-rgb-kodak23.png,39.9301,0.0334,0.0080,49.3187 +Kodak,6x6,ldr-rgb-kodak24.png,34.7436,0.0418,0.0153,25.7795 +Kodak,8x8,ldr-rgb-kodak01.png,31.2082,0.0518,0.0253,15.5693 +Kodak,8x8,ldr-rgb-kodak02.png,34.8017,0.0383,0.0117,33.5224 +Kodak,8x8,ldr-rgb-kodak03.png,36.4985,0.0335,0.0090,43.7054 +Kodak,8x8,ldr-rgb-kodak04.png,35.1022,0.0393,0.0116,33.9160 +Kodak,8x8,ldr-rgb-kodak05.png,30.0751,0.0573,0.0306,12.8343 +Kodak,8x8,ldr-rgb-kodak06.png,32.8281,0.0438,0.0178,22.0464 +Kodak,8x8,ldr-rgb-kodak07.png,34.8646,0.0386,0.0130,30.2401 +Kodak,8x8,ldr-rgb-kodak08.png,29.7289,0.0595,0.0319,12.3150 +Kodak,8x8,ldr-rgb-kodak09.png,35.9623,0.0371,0.0100,39.4713 +Kodak,8x8,ldr-rgb-kodak10.png,35.7575,0.0359,0.0094,41.8002 +Kodak,8x8,ldr-rgb-kodak11.png,32.8944,0.0419,0.0172,22.8643 +Kodak,8x8,ldr-rgb-kodak12.png,36.5619,0.0339,0.0093,42.3041 +Kodak,8x8,ldr-rgb-kodak13.png,28.1501,0.0630,0.0361,10.8822 +Kodak,8x8,ldr-rgb-kodak14.png,31.3321,0.0489,0.0236,16.6532 +Kodak,8x8,ldr-rgb-kodak15.png,34.7918,0.0373,0.0118,33.2447 +Kodak,8x8,ldr-rgb-kodak16.png,35.9809,0.0354,0.0111,35.4216 +Kodak,8x8,ldr-rgb-kodak17.png,34.7507,0.0377,0.0105,37.3070 +Kodak,8x8,ldr-rgb-kodak18.png,31.1839,0.0492,0.0213,18.4600 +Kodak,8x8,ldr-rgb-kodak19.png,33.9323,0.0423,0.0148,26.5062 +Kodak,8x8,ldr-rgb-kodak20.png,35.1250,0.0349,0.0106,37.2186 +Kodak,8x8,ldr-rgb-kodak21.png,32.6633,0.0423,0.0173,22.7806 +Kodak,8x8,ldr-rgb-kodak22.png,33.3552,0.0418,0.0153,25.7372 +Kodak,8x8,ldr-rgb-kodak23.png,36.4364,0.0345,0.0085,46.2770 +Kodak,8x8,ldr-rgb-kodak24.png,30.7663,0.0468,0.0198,19.8403 +Kodak,12x12,ldr-rgb-kodak01.png,27.0008,0.0483,0.0212,18.5741 +Kodak,12x12,ldr-rgb-kodak02.png,31.0415,0.0352,0.0072,54.9499 +Kodak,12x12,ldr-rgb-kodak03.png,32.6513,0.0326,0.0061,64.0418 +Kodak,12x12,ldr-rgb-kodak04.png,31.4912,0.0336,0.0059,66.6371 +Kodak,12x12,ldr-rgb-kodak05.png,25.7162,0.0513,0.0237,16.6230 +Kodak,12x12,ldr-rgb-kodak06.png,28.4959,0.0420,0.0148,26.6264 +Kodak,12x12,ldr-rgb-kodak07.png,30.8219,0.0356,0.0080,48.9499 +Kodak,12x12,ldr-rgb-kodak08.png,25.2268,0.0556,0.0276,14.2356 +Kodak,12x12,ldr-rgb-kodak09.png,31.6541,0.0348,0.0071,55.6658 +Kodak,12x12,ldr-rgb-kodak10.png,31.4641,0.0342,0.0067,58.8457 +Kodak,12x12,ldr-rgb-kodak11.png,28.8804,0.0383,0.0112,35.0677 +Kodak,12x12,ldr-rgb-kodak12.png,32.2096,0.0313,0.0060,65.7655 +Kodak,12x12,ldr-rgb-kodak13.png,24.2505,0.0584,0.0291,13.5038 +Kodak,12x12,ldr-rgb-kodak14.png,27.4640,0.0417,0.0155,25.3328 +Kodak,12x12,ldr-rgb-kodak15.png,31.1808,0.0363,0.0084,46.6224 +Kodak,12x12,ldr-rgb-kodak16.png,31.3728,0.0334,0.0075,52.4643 +Kodak,12x12,ldr-rgb-kodak17.png,30.8456,0.0357,0.0071,55.0416 +Kodak,12x12,ldr-rgb-kodak18.png,27.3784,0.0440,0.0146,26.9255 +Kodak,12x12,ldr-rgb-kodak19.png,29.8837,0.0388,0.0112,35.1020 +Kodak,12x12,ldr-rgb-kodak20.png,30.9559,0.0344,0.0082,48.2411 +Kodak,12x12,ldr-rgb-kodak21.png,28.6284,0.0411,0.0143,27.4864 +Kodak,12x12,ldr-rgb-kodak22.png,29.7698,0.0372,0.0087,45.0214 +Kodak,12x12,ldr-rgb-kodak23.png,32.4950,0.0334,0.0062,63.8533 +Kodak,12x12,ldr-rgb-kodak24.png,26.7119,0.0441,0.0152,25.7916 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse4.1_medium_results.csv new file mode 100644 index 0000000..bbea1f8 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse4.1_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.3900,0.1024,0.0771,5.0998 +Kodak,4x4,ldr-rgb-kodak02.png,45.5266,0.1492,0.1234,3.1876 +Kodak,4x4,ldr-rgb-kodak03.png,47.8390,0.0839,0.0597,6.5834 +Kodak,4x4,ldr-rgb-kodak04.png,45.6293,0.1213,0.0951,4.1341 +Kodak,4x4,ldr-rgb-kodak05.png,42.2268,0.1302,0.1042,3.7739 +Kodak,4x4,ldr-rgb-kodak06.png,45.2804,0.0976,0.0734,5.3542 +Kodak,4x4,ldr-rgb-kodak07.png,46.1450,0.0987,0.0729,5.3903 +Kodak,4x4,ldr-rgb-kodak08.png,42.5929,0.1365,0.1092,3.6013 +Kodak,4x4,ldr-rgb-kodak09.png,47.3636,0.1191,0.0934,4.2121 +Kodak,4x4,ldr-rgb-kodak10.png,47.0403,0.1194,0.0934,4.2117 +Kodak,4x4,ldr-rgb-kodak11.png,44.9930,0.1155,0.0905,4.3446 +Kodak,4x4,ldr-rgb-kodak12.png,48.1508,0.0927,0.0687,5.7196 +Kodak,4x4,ldr-rgb-kodak13.png,41.7091,0.1075,0.0810,4.8515 +Kodak,4x4,ldr-rgb-kodak14.png,42.7747,0.1220,0.0969,4.0565 +Kodak,4x4,ldr-rgb-kodak15.png,45.6063,0.1089,0.0836,4.7042 +Kodak,4x4,ldr-rgb-kodak16.png,48.0286,0.0905,0.0667,5.8971 +Kodak,4x4,ldr-rgb-kodak17.png,46.4272,0.1079,0.0822,4.7825 +Kodak,4x4,ldr-rgb-kodak18.png,42.1025,0.1495,0.1214,3.2389 +Kodak,4x4,ldr-rgb-kodak19.png,45.4882,0.1223,0.0954,4.1224 +Kodak,4x4,ldr-rgb-kodak20.png,46.9603,0.0807,0.0566,6.9436 +Kodak,4x4,ldr-rgb-kodak21.png,45.3041,0.1216,0.0970,4.0541 +Kodak,4x4,ldr-rgb-kodak22.png,43.9220,0.1509,0.1237,3.1783 +Kodak,4x4,ldr-rgb-kodak23.png,47.0296,0.1246,0.0991,3.9690 +Kodak,4x4,ldr-rgb-kodak24.png,42.4676,0.1184,0.0918,4.2834 +Kodak,5x5,ldr-rgb-kodak01.png,40.1428,0.1033,0.0782,5.0313 +Kodak,5x5,ldr-rgb-kodak02.png,41.8098,0.1202,0.0943,4.1697 +Kodak,5x5,ldr-rgb-kodak03.png,44.1564,0.0640,0.0398,9.8820 +Kodak,5x5,ldr-rgb-kodak04.png,42.1557,0.0948,0.0687,5.7277 +Kodak,5x5,ldr-rgb-kodak05.png,38.0375,0.1217,0.0956,4.1136 +Kodak,5x5,ldr-rgb-kodak06.png,41.0310,0.0862,0.0617,6.3688 +Kodak,5x5,ldr-rgb-kodak07.png,42.5449,0.0788,0.0535,7.3439 +Kodak,5x5,ldr-rgb-kodak08.png,38.3909,0.1248,0.0974,4.0371 +Kodak,5x5,ldr-rgb-kodak09.png,43.8761,0.0711,0.0455,8.6357 +Kodak,5x5,ldr-rgb-kodak10.png,43.4926,0.0773,0.0514,7.6544 +Kodak,5x5,ldr-rgb-kodak11.png,40.9014,0.0980,0.0735,5.3494 +Kodak,5x5,ldr-rgb-kodak12.png,44.5087,0.0643,0.0402,9.7863 +Kodak,5x5,ldr-rgb-kodak13.png,36.9547,0.1050,0.0789,4.9806 +Kodak,5x5,ldr-rgb-kodak14.png,38.7244,0.1104,0.0853,4.6087 +Kodak,5x5,ldr-rgb-kodak15.png,41.9961,0.0902,0.0642,6.1236 +Kodak,5x5,ldr-rgb-kodak16.png,44.2004,0.0674,0.0435,9.0415 +Kodak,5x5,ldr-rgb-kodak17.png,42.5924,0.0712,0.0452,8.7043 +Kodak,5x5,ldr-rgb-kodak18.png,38.4191,0.1183,0.0909,4.3279 +Kodak,5x5,ldr-rgb-kodak19.png,41.7153,0.0845,0.0577,6.8098 +Kodak,5x5,ldr-rgb-kodak20.png,43.1410,0.0635,0.0396,9.9402 +Kodak,5x5,ldr-rgb-kodak21.png,40.8178,0.0870,0.0620,6.3405 +Kodak,5x5,ldr-rgb-kodak22.png,40.3445,0.1143,0.0884,4.4488 +Kodak,5x5,ldr-rgb-kodak23.png,43.6620,0.0837,0.0587,6.6948 +Kodak,5x5,ldr-rgb-kodak24.png,38.2488,0.0983,0.0719,5.4679 +Kodak,6x6,ldr-rgb-kodak01.png,36.2113,0.1089,0.0836,4.7040 +Kodak,6x6,ldr-rgb-kodak02.png,39.0614,0.0997,0.0735,5.3530 +Kodak,6x6,ldr-rgb-kodak03.png,41.3770,0.0561,0.0322,12.1969 +Kodak,6x6,ldr-rgb-kodak04.png,39.4395,0.0860,0.0593,6.6321 +Kodak,6x6,ldr-rgb-kodak05.png,34.8184,0.1221,0.0957,4.1100 +Kodak,6x6,ldr-rgb-kodak06.png,37.6639,0.0805,0.0560,7.0185 +Kodak,6x6,ldr-rgb-kodak07.png,39.8300,0.0715,0.0464,8.4772 +Kodak,6x6,ldr-rgb-kodak08.png,34.9957,0.1245,0.0977,4.0257 +Kodak,6x6,ldr-rgb-kodak09.png,40.9226,0.0596,0.0339,11.6092 +Kodak,6x6,ldr-rgb-kodak10.png,40.5493,0.0619,0.0360,10.9163 +Kodak,6x6,ldr-rgb-kodak11.png,37.6100,0.0882,0.0634,6.2061 +Kodak,6x6,ldr-rgb-kodak12.png,41.5485,0.0545,0.0306,12.8514 +Kodak,6x6,ldr-rgb-kodak13.png,32.9142,0.1171,0.0901,4.3666 +Kodak,6x6,ldr-rgb-kodak14.png,35.8636,0.1083,0.0829,4.7416 +Kodak,6x6,ldr-rgb-kodak15.png,39.2411,0.0840,0.0583,6.7421 +Kodak,6x6,ldr-rgb-kodak16.png,41.0644,0.0591,0.0354,11.1191 +Kodak,6x6,ldr-rgb-kodak17.png,39.4963,0.0625,0.0365,10.7748 +Kodak,6x6,ldr-rgb-kodak18.png,35.3775,0.1100,0.0829,4.7418 +Kodak,6x6,ldr-rgb-kodak19.png,38.5482,0.0789,0.0523,7.5241 +Kodak,6x6,ldr-rgb-kodak20.png,39.8612,0.0606,0.0370,10.6212 +Kodak,6x6,ldr-rgb-kodak21.png,37.2219,0.0788,0.0541,7.2744 +Kodak,6x6,ldr-rgb-kodak22.png,37.4990,0.1005,0.0747,5.2615 +Kodak,6x6,ldr-rgb-kodak23.png,41.0323,0.0653,0.0406,9.6756 +Kodak,6x6,ldr-rgb-kodak24.png,35.0904,0.0909,0.0650,6.0497 +Kodak,8x8,ldr-rgb-kodak01.png,31.8088,0.1494,0.1233,3.1884 +Kodak,8x8,ldr-rgb-kodak02.png,35.8041,0.1042,0.0778,5.0519 +Kodak,8x8,ldr-rgb-kodak03.png,37.7807,0.0691,0.0441,8.9092 +Kodak,8x8,ldr-rgb-kodak04.png,36.1152,0.0973,0.0702,5.5975 +Kodak,8x8,ldr-rgb-kodak05.png,30.7592,0.1641,0.1370,2.8693 +Kodak,8x8,ldr-rgb-kodak06.png,33.4597,0.1044,0.0791,4.9697 +Kodak,8x8,ldr-rgb-kodak07.png,36.1791,0.0890,0.0623,6.3121 +Kodak,8x8,ldr-rgb-kodak08.png,30.5504,0.1662,0.1377,2.8546 +Kodak,8x8,ldr-rgb-kodak09.png,37.2788,0.0713,0.0444,8.8476 +Kodak,8x8,ldr-rgb-kodak10.png,36.9460,0.0721,0.0452,8.7025 +Kodak,8x8,ldr-rgb-kodak11.png,33.6799,0.1080,0.0821,4.7923 +Kodak,8x8,ldr-rgb-kodak12.png,37.8704,0.0676,0.0428,9.1804 +Kodak,8x8,ldr-rgb-kodak13.png,28.4023,0.1610,0.1339,2.9359 +Kodak,8x8,ldr-rgb-kodak14.png,32.1597,0.1404,0.1144,3.4379 +Kodak,8x8,ldr-rgb-kodak15.png,35.8630,0.0895,0.0631,6.2324 +Kodak,8x8,ldr-rgb-kodak16.png,37.0443,0.0753,0.0505,7.7937 +Kodak,8x8,ldr-rgb-kodak17.png,35.6841,0.0768,0.0495,7.9473 +Kodak,8x8,ldr-rgb-kodak18.png,31.5638,0.1307,0.1039,3.7850 +Kodak,8x8,ldr-rgb-kodak19.png,34.7826,0.0953,0.0675,5.8239 +Kodak,8x8,ldr-rgb-kodak20.png,35.9506,0.0750,0.0508,7.7402 +Kodak,8x8,ldr-rgb-kodak21.png,33.1239,0.1013,0.0756,5.1993 +Kodak,8x8,ldr-rgb-kodak22.png,34.0587,0.1144,0.0872,4.5078 +Kodak,8x8,ldr-rgb-kodak23.png,37.7041,0.0703,0.0446,8.8260 +Kodak,8x8,ldr-rgb-kodak24.png,31.1428,0.1119,0.0852,4.6157 +Kodak,12x12,ldr-rgb-kodak01.png,27.7593,0.1649,0.1371,2.8675 +Kodak,12x12,ldr-rgb-kodak02.png,32.4650,0.0828,0.0552,7.1209 +Kodak,12x12,ldr-rgb-kodak03.png,33.8493,0.0632,0.0365,10.7654 +Kodak,12x12,ldr-rgb-kodak04.png,32.4639,0.0739,0.0452,8.6952 +Kodak,12x12,ldr-rgb-kodak05.png,26.4050,0.1803,0.1511,2.6017 +Kodak,12x12,ldr-rgb-kodak06.png,29.3844,0.1100,0.0826,4.7591 +Kodak,12x12,ldr-rgb-kodak07.png,32.0587,0.0879,0.0595,6.6051 +Kodak,12x12,ldr-rgb-kodak08.png,26.0674,0.1839,0.1572,2.5012 +Kodak,12x12,ldr-rgb-kodak09.png,33.1166,0.0675,0.0394,9.9852 +Kodak,12x12,ldr-rgb-kodak10.png,32.5013,0.0677,0.0390,10.0719 +Kodak,12x12,ldr-rgb-kodak11.png,29.7620,0.1038,0.0770,5.1067 +Kodak,12x12,ldr-rgb-kodak12.png,33.9091,0.0630,0.0362,10.8650 +Kodak,12x12,ldr-rgb-kodak13.png,24.5329,0.1858,0.1568,2.5079 +Kodak,12x12,ldr-rgb-kodak14.png,28.4363,0.1438,0.1160,3.3901 +Kodak,12x12,ldr-rgb-kodak15.png,32.2535,0.0822,0.0543,7.2442 +Kodak,12x12,ldr-rgb-kodak16.png,32.9949,0.0705,0.0440,8.9453 +Kodak,12x12,ldr-rgb-kodak17.png,31.7945,0.0731,0.0445,8.8435 +Kodak,12x12,ldr-rgb-kodak18.png,27.7879,0.1279,0.0996,3.9481 +Kodak,12x12,ldr-rgb-kodak19.png,30.9041,0.0926,0.0635,6.1947 +Kodak,12x12,ldr-rgb-kodak20.png,31.8897,0.0729,0.0467,8.4155 +Kodak,12x12,ldr-rgb-kodak21.png,29.1922,0.1123,0.0853,4.6072 +Kodak,12x12,ldr-rgb-kodak22.png,30.5213,0.0995,0.0709,5.5465 +Kodak,12x12,ldr-rgb-kodak23.png,33.5912,0.0589,0.0315,12.4731 +Kodak,12x12,ldr-rgb-kodak24.png,27.1145,0.1146,0.0859,4.5798 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse4.1_thorough_results.csv new file mode 100644 index 0000000..ea14210 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-4.8-sse4.1_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.5922,0.2101,0.1869,2.1043 +Kodak,4x4,ldr-rgb-kodak02.png,45.8028,0.3035,0.2770,1.4197 +Kodak,4x4,ldr-rgb-kodak03.png,48.2430,0.2327,0.2103,1.8700 +Kodak,4x4,ldr-rgb-kodak04.png,45.8232,0.2711,0.2468,1.5933 +Kodak,4x4,ldr-rgb-kodak05.png,42.4987,0.2661,0.2399,1.6388 +Kodak,4x4,ldr-rgb-kodak06.png,45.4846,0.2214,0.1968,1.9981 +Kodak,4x4,ldr-rgb-kodak07.png,46.5250,0.2573,0.2312,1.7005 +Kodak,4x4,ldr-rgb-kodak08.png,42.8951,0.2762,0.2505,1.5700 +Kodak,4x4,ldr-rgb-kodak09.png,47.6390,0.2815,0.2554,1.5396 +Kodak,4x4,ldr-rgb-kodak10.png,47.2881,0.2773,0.2531,1.5536 +Kodak,4x4,ldr-rgb-kodak11.png,45.2534,0.2464,0.2238,1.7573 +Kodak,4x4,ldr-rgb-kodak12.png,48.4737,0.2440,0.2201,1.7863 +Kodak,4x4,ldr-rgb-kodak13.png,41.8173,0.2210,0.1943,2.0233 +Kodak,4x4,ldr-rgb-kodak14.png,43.0369,0.2501,0.2263,1.7378 +Kodak,4x4,ldr-rgb-kodak15.png,45.9032,0.2630,0.2376,1.6548 +Kodak,4x4,ldr-rgb-kodak16.png,48.2456,0.2355,0.2113,1.8611 +Kodak,4x4,ldr-rgb-kodak17.png,46.6010,0.2559,0.2315,1.6989 +Kodak,4x4,ldr-rgb-kodak18.png,42.2712,0.2959,0.2680,1.4675 +Kodak,4x4,ldr-rgb-kodak19.png,45.7045,0.2672,0.2422,1.6237 +Kodak,4x4,ldr-rgb-kodak20.png,47.2404,0.1817,0.1577,2.4942 +Kodak,4x4,ldr-rgb-kodak21.png,45.4559,0.2678,0.2423,1.6226 +Kodak,4x4,ldr-rgb-kodak22.png,44.1146,0.3042,0.2776,1.4167 +Kodak,4x4,ldr-rgb-kodak23.png,47.3579,0.2928,0.2674,1.4703 +Kodak,4x4,ldr-rgb-kodak24.png,42.6976,0.2618,0.2351,1.6727 +Kodak,5x5,ldr-rgb-kodak01.png,40.2582,0.2484,0.2227,1.7654 +Kodak,5x5,ldr-rgb-kodak02.png,42.0902,0.3239,0.2994,1.3135 +Kodak,5x5,ldr-rgb-kodak03.png,44.4690,0.2478,0.2252,1.7458 +Kodak,5x5,ldr-rgb-kodak04.png,42.3451,0.2742,0.2468,1.5930 +Kodak,5x5,ldr-rgb-kodak05.png,38.2336,0.2898,0.2653,1.4824 +Kodak,5x5,ldr-rgb-kodak06.png,41.1423,0.2335,0.2078,1.8923 +Kodak,5x5,ldr-rgb-kodak07.png,42.8235,0.2736,0.2489,1.5800 +Kodak,5x5,ldr-rgb-kodak08.png,38.5691,0.2873,0.2616,1.5029 +Kodak,5x5,ldr-rgb-kodak09.png,44.1096,0.2703,0.2441,1.6106 +Kodak,5x5,ldr-rgb-kodak10.png,43.6852,0.2764,0.2499,1.5738 +Kodak,5x5,ldr-rgb-kodak11.png,41.0686,0.2631,0.2375,1.6555 +Kodak,5x5,ldr-rgb-kodak12.png,44.7130,0.2501,0.2251,1.7471 +Kodak,5x5,ldr-rgb-kodak13.png,37.0068,0.2272,0.1997,1.9689 +Kodak,5x5,ldr-rgb-kodak14.png,38.9474,0.2696,0.2433,1.6164 +Kodak,5x5,ldr-rgb-kodak15.png,42.2161,0.2684,0.2441,1.6112 +Kodak,5x5,ldr-rgb-kodak16.png,44.3498,0.2431,0.2197,1.7900 +Kodak,5x5,ldr-rgb-kodak17.png,42.6976,0.2548,0.2275,1.7281 +Kodak,5x5,ldr-rgb-kodak18.png,38.5158,0.2955,0.2679,1.4676 +Kodak,5x5,ldr-rgb-kodak19.png,41.8549,0.2729,0.2461,1.5978 +Kodak,5x5,ldr-rgb-kodak20.png,43.3603,0.1777,0.1532,2.5667 +Kodak,5x5,ldr-rgb-kodak21.png,40.9302,0.2800,0.2551,1.5412 +Kodak,5x5,ldr-rgb-kodak22.png,40.4958,0.3139,0.2896,1.3578 +Kodak,5x5,ldr-rgb-kodak23.png,43.9970,0.3139,0.2882,1.3644 +Kodak,5x5,ldr-rgb-kodak24.png,38.3771,0.2744,0.2478,1.5868 +Kodak,6x6,ldr-rgb-kodak01.png,36.3296,0.2863,0.2599,1.5131 +Kodak,6x6,ldr-rgb-kodak02.png,39.4323,0.3596,0.3333,1.1797 +Kodak,6x6,ldr-rgb-kodak03.png,41.8030,0.2295,0.2048,1.9204 +Kodak,6x6,ldr-rgb-kodak04.png,39.7105,0.2936,0.2687,1.4636 +Kodak,6x6,ldr-rgb-kodak05.png,35.0194,0.3243,0.2987,1.3164 +Kodak,6x6,ldr-rgb-kodak06.png,37.7820,0.2561,0.2310,1.7025 +Kodak,6x6,ldr-rgb-kodak07.png,40.1759,0.2610,0.2377,1.6539 +Kodak,6x6,ldr-rgb-kodak08.png,35.1892,0.3212,0.2935,1.3396 +Kodak,6x6,ldr-rgb-kodak09.png,41.3074,0.2757,0.2518,1.5615 +Kodak,6x6,ldr-rgb-kodak10.png,40.8881,0.3006,0.2738,1.4362 +Kodak,6x6,ldr-rgb-kodak11.png,37.8001,0.2842,0.2589,1.5191 +Kodak,6x6,ldr-rgb-kodak12.png,41.8937,0.2594,0.2360,1.6661 +Kodak,6x6,ldr-rgb-kodak13.png,32.9664,0.2688,0.2435,1.6149 +Kodak,6x6,ldr-rgb-kodak14.png,36.0648,0.3072,0.2802,1.4035 +Kodak,6x6,ldr-rgb-kodak15.png,39.4992,0.2648,0.2405,1.6347 +Kodak,6x6,ldr-rgb-kodak16.png,41.2652,0.2468,0.2211,1.7783 +Kodak,6x6,ldr-rgb-kodak17.png,39.7005,0.2748,0.2475,1.5886 +Kodak,6x6,ldr-rgb-kodak18.png,35.4652,0.3274,0.2994,1.3136 +Kodak,6x6,ldr-rgb-kodak19.png,38.7403,0.3038,0.2781,1.4141 +Kodak,6x6,ldr-rgb-kodak20.png,40.1606,0.1919,0.1679,2.3414 +Kodak,6x6,ldr-rgb-kodak21.png,37.3715,0.3025,0.2769,1.4199 +Kodak,6x6,ldr-rgb-kodak22.png,37.6700,0.3469,0.3202,1.2282 +Kodak,6x6,ldr-rgb-kodak23.png,41.4972,0.3247,0.2991,1.3145 +Kodak,6x6,ldr-rgb-kodak24.png,35.2077,0.2889,0.2650,1.4841 +Kodak,8x8,ldr-rgb-kodak01.png,31.9182,0.3739,0.3469,1.1335 +Kodak,8x8,ldr-rgb-kodak02.png,36.1788,0.3748,0.3477,1.1310 +Kodak,8x8,ldr-rgb-kodak03.png,38.2256,0.2061,0.1805,2.1784 +Kodak,8x8,ldr-rgb-kodak04.png,36.4047,0.3046,0.2764,1.4227 +Kodak,8x8,ldr-rgb-kodak05.png,30.9271,0.4031,0.3747,1.0493 +Kodak,8x8,ldr-rgb-kodak06.png,33.5892,0.3078,0.2813,1.3978 +Kodak,8x8,ldr-rgb-kodak07.png,36.5323,0.2497,0.2243,1.7530 +Kodak,8x8,ldr-rgb-kodak08.png,30.7450,0.4379,0.4101,0.9587 +Kodak,8x8,ldr-rgb-kodak09.png,37.5746,0.2292,0.2018,1.9489 +Kodak,8x8,ldr-rgb-kodak10.png,37.2611,0.2585,0.2337,1.6823 +Kodak,8x8,ldr-rgb-kodak11.png,33.8471,0.3585,0.3323,1.1834 +Kodak,8x8,ldr-rgb-kodak12.png,38.2959,0.2374,0.2119,1.8557 +Kodak,8x8,ldr-rgb-kodak13.png,28.4658,0.3853,0.3570,1.1013 +Kodak,8x8,ldr-rgb-kodak14.png,32.3355,0.3916,0.3641,1.0800 +Kodak,8x8,ldr-rgb-kodak15.png,36.0844,0.2866,0.2596,1.5149 +Kodak,8x8,ldr-rgb-kodak16.png,37.2854,0.2540,0.2284,1.7217 +Kodak,8x8,ldr-rgb-kodak17.png,35.8833,0.2516,0.2239,1.7566 +Kodak,8x8,ldr-rgb-kodak18.png,31.6609,0.3996,0.3706,1.0610 +Kodak,8x8,ldr-rgb-kodak19.png,34.9459,0.2722,0.2439,1.6122 +Kodak,8x8,ldr-rgb-kodak20.png,36.1871,0.2187,0.1932,2.0350 +Kodak,8x8,ldr-rgb-kodak21.png,33.2364,0.2890,0.2624,1.4985 +Kodak,8x8,ldr-rgb-kodak22.png,34.2428,0.3755,0.3475,1.1315 +Kodak,8x8,ldr-rgb-kodak23.png,38.2266,0.2488,0.2222,1.7698 +Kodak,8x8,ldr-rgb-kodak24.png,31.2516,0.3302,0.3020,1.3018 +Kodak,12x12,ldr-rgb-kodak01.png,27.9177,0.4817,0.4524,0.8691 +Kodak,12x12,ldr-rgb-kodak02.png,33.0100,0.3632,0.3332,1.1803 +Kodak,12x12,ldr-rgb-kodak03.png,34.4665,0.2197,0.1909,2.0595 +Kodak,12x12,ldr-rgb-kodak04.png,32.9831,0.3153,0.2849,1.3804 +Kodak,12x12,ldr-rgb-kodak05.png,26.6116,0.5200,0.4917,0.7997 +Kodak,12x12,ldr-rgb-kodak06.png,29.5405,0.3548,0.3265,1.2045 +Kodak,12x12,ldr-rgb-kodak07.png,32.6427,0.2771,0.2461,1.5975 +Kodak,12x12,ldr-rgb-kodak08.png,26.2689,0.5272,0.4944,0.7953 +Kodak,12x12,ldr-rgb-kodak09.png,33.6395,0.2523,0.2225,1.7669 +Kodak,12x12,ldr-rgb-kodak10.png,33.0011,0.2489,0.2187,1.7982 +Kodak,12x12,ldr-rgb-kodak11.png,30.0591,0.3800,0.3506,1.1214 +Kodak,12x12,ldr-rgb-kodak12.png,34.4608,0.2280,0.1994,1.9722 +Kodak,12x12,ldr-rgb-kodak13.png,24.5896,0.5628,0.5298,0.7422 +Kodak,12x12,ldr-rgb-kodak14.png,28.6523,0.4633,0.4335,0.9071 +Kodak,12x12,ldr-rgb-kodak15.png,32.7473,0.3044,0.2740,1.4350 +Kodak,12x12,ldr-rgb-kodak16.png,33.3428,0.2686,0.2405,1.6353 +Kodak,12x12,ldr-rgb-kodak17.png,32.1405,0.2679,0.2375,1.6557 +Kodak,12x12,ldr-rgb-kodak18.png,27.9302,0.4595,0.4277,0.9193 +Kodak,12x12,ldr-rgb-kodak19.png,31.1152,0.3607,0.3293,1.1939 +Kodak,12x12,ldr-rgb-kodak20.png,32.1883,0.2795,0.2505,1.5695 +Kodak,12x12,ldr-rgb-kodak21.png,29.3322,0.3403,0.3117,1.2617 +Kodak,12x12,ldr-rgb-kodak22.png,30.7936,0.4035,0.3725,1.0556 +Kodak,12x12,ldr-rgb-kodak23.png,34.3943,0.2257,0.1968,1.9980 +Kodak,12x12,ldr-rgb-kodak24.png,27.2471,0.4108,0.3800,1.0346 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-avx2_fast_results.csv new file mode 100644 index 0000000..2537b8e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-avx2_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.9519,0.0393,0.0141,27.8757 +Kodak,4x4,ldr-rgb-kodak02.png,44.3432,0.0464,0.0209,18.8565 +Kodak,4x4,ldr-rgb-kodak03.png,46.8391,0.0349,0.0113,34.8933 +Kodak,4x4,ldr-rgb-kodak04.png,44.7725,0.0445,0.0186,21.1591 +Kodak,4x4,ldr-rgb-kodak05.png,41.6992,0.0529,0.0281,13.9980 +Kodak,4x4,ldr-rgb-kodak06.png,44.8554,0.0377,0.0141,27.8522 +Kodak,4x4,ldr-rgb-kodak07.png,45.2328,0.0411,0.0157,25.0649 +Kodak,4x4,ldr-rgb-kodak08.png,42.1951,0.0547,0.0289,13.5839 +Kodak,4x4,ldr-rgb-kodak09.png,46.4560,0.0356,0.0102,38.4409 +Kodak,4x4,ldr-rgb-kodak10.png,46.2383,0.0368,0.0108,36.2747 +Kodak,4x4,ldr-rgb-kodak11.png,44.3773,0.0418,0.0175,22.4760 +Kodak,4x4,ldr-rgb-kodak12.png,47.2693,0.0338,0.0101,38.8401 +Kodak,4x4,ldr-rgb-kodak13.png,41.5422,0.0489,0.0239,16.4388 +Kodak,4x4,ldr-rgb-kodak14.png,41.9752,0.0478,0.0232,16.9489 +Kodak,4x4,ldr-rgb-kodak15.png,44.7351,0.0454,0.0200,19.6381 +Kodak,4x4,ldr-rgb-kodak16.png,47.3501,0.0316,0.0089,43.9699 +Kodak,4x4,ldr-rgb-kodak17.png,45.8448,0.0362,0.0100,39.4156 +Kodak,4x4,ldr-rgb-kodak18.png,41.7294,0.0539,0.0278,14.1521 +Kodak,4x4,ldr-rgb-kodak19.png,44.9589,0.0402,0.0137,28.8011 +Kodak,4x4,ldr-rgb-kodak20.png,46.4220,0.0353,0.0117,33.6256 +Kodak,4x4,ldr-rgb-kodak21.png,44.7255,0.0388,0.0147,26.8352 +Kodak,4x4,ldr-rgb-kodak22.png,43.3126,0.0491,0.0231,16.9929 +Kodak,4x4,ldr-rgb-kodak23.png,45.7203,0.0385,0.0141,27.8282 +Kodak,4x4,ldr-rgb-kodak24.png,42.0604,0.0494,0.0225,17.4546 +Kodak,5x5,ldr-rgb-kodak01.png,39.6465,0.0382,0.0132,29.8883 +Kodak,5x5,ldr-rgb-kodak02.png,40.6568,0.0359,0.0127,30.9524 +Kodak,5x5,ldr-rgb-kodak03.png,43.1408,0.0324,0.0088,44.6992 +Kodak,5x5,ldr-rgb-kodak04.png,41.3451,0.0381,0.0116,33.8833 +Kodak,5x5,ldr-rgb-kodak05.png,37.4904,0.0485,0.0226,17.3675 +Kodak,5x5,ldr-rgb-kodak06.png,40.6520,0.0350,0.0106,36.9774 +Kodak,5x5,ldr-rgb-kodak07.png,41.5681,0.0373,0.0111,35.5783 +Kodak,5x5,ldr-rgb-kodak08.png,37.8112,0.0508,0.0231,17.0578 +Kodak,5x5,ldr-rgb-kodak09.png,42.9697,0.0333,0.0080,49.3985 +Kodak,5x5,ldr-rgb-kodak10.png,42.6970,0.0331,0.0079,49.9324 +Kodak,5x5,ldr-rgb-kodak11.png,40.3555,0.0363,0.0124,31.8262 +Kodak,5x5,ldr-rgb-kodak12.png,43.5755,0.0317,0.0071,55.3204 +Kodak,5x5,ldr-rgb-kodak13.png,36.8548,0.0456,0.0193,20.4024 +Kodak,5x5,ldr-rgb-kodak14.png,38.0484,0.0435,0.0203,19.3692 +Kodak,5x5,ldr-rgb-kodak15.png,41.2587,0.0361,0.0122,32.2311 +Kodak,5x5,ldr-rgb-kodak16.png,43.5286,0.0300,0.0064,61.3065 +Kodak,5x5,ldr-rgb-kodak17.png,42.0662,0.0335,0.0074,52.8307 +Kodak,5x5,ldr-rgb-kodak18.png,38.1339,0.0444,0.0171,22.9613 +Kodak,5x5,ldr-rgb-kodak19.png,41.1973,0.0352,0.0094,41.7652 +Kodak,5x5,ldr-rgb-kodak20.png,42.5551,0.0325,0.0083,47.3125 +Kodak,5x5,ldr-rgb-kodak21.png,40.4641,0.0352,0.0114,34.3963 +Kodak,5x5,ldr-rgb-kodak22.png,39.8261,0.0396,0.0138,28.4484 +Kodak,5x5,ldr-rgb-kodak23.png,42.5546,0.0337,0.0091,43.2243 +Kodak,5x5,ldr-rgb-kodak24.png,37.9288,0.0415,0.0160,24.5328 +Kodak,6x6,ldr-rgb-kodak01.png,35.7668,0.0425,0.0185,21.2595 +Kodak,6x6,ldr-rgb-kodak02.png,38.1854,0.0374,0.0128,30.7126 +Kodak,6x6,ldr-rgb-kodak03.png,40.5831,0.0325,0.0082,47.6626 +Kodak,6x6,ldr-rgb-kodak04.png,38.5804,0.0378,0.0115,34.1654 +Kodak,6x6,ldr-rgb-kodak05.png,34.3791,0.0524,0.0265,14.8603 +Kodak,6x6,ldr-rgb-kodak06.png,37.3260,0.0370,0.0125,31.5456 +Kodak,6x6,ldr-rgb-kodak07.png,38.9087,0.0375,0.0114,34.5411 +Kodak,6x6,ldr-rgb-kodak08.png,34.4618,0.0531,0.0260,15.0981 +Kodak,6x6,ldr-rgb-kodak09.png,40.0164,0.0340,0.0086,45.7127 +Kodak,6x6,ldr-rgb-kodak10.png,39.7563,0.0352,0.0086,45.4682 +Kodak,6x6,ldr-rgb-kodak11.png,37.1581,0.0371,0.0137,28.6431 +Kodak,6x6,ldr-rgb-kodak12.png,40.8050,0.0322,0.0073,53.5633 +Kodak,6x6,ldr-rgb-kodak13.png,32.8181,0.0518,0.0266,14.7710 +Kodak,6x6,ldr-rgb-kodak14.png,35.3145,0.0466,0.0227,17.3292 +Kodak,6x6,ldr-rgb-kodak15.png,38.5857,0.0375,0.0123,32.0420 +Kodak,6x6,ldr-rgb-kodak16.png,40.5081,0.0314,0.0074,53.4782 +Kodak,6x6,ldr-rgb-kodak17.png,38.9138,0.0339,0.0087,45.2127 +Kodak,6x6,ldr-rgb-kodak18.png,35.1226,0.0457,0.0187,21.0626 +Kodak,6x6,ldr-rgb-kodak19.png,38.0038,0.0373,0.0120,32.6458 +Kodak,6x6,ldr-rgb-kodak20.png,39.2846,0.0329,0.0094,41.7695 +Kodak,6x6,ldr-rgb-kodak21.png,36.9281,0.0383,0.0141,27.9508 +Kodak,6x6,ldr-rgb-kodak22.png,37.0091,0.0407,0.0145,27.0416 +Kodak,6x6,ldr-rgb-kodak23.png,40.0844,0.0334,0.0086,45.9572 +Kodak,6x6,ldr-rgb-kodak24.png,34.8167,0.0431,0.0171,23.0177 +Kodak,8x8,ldr-rgb-kodak01.png,31.3461,0.0510,0.0261,15.0404 +Kodak,8x8,ldr-rgb-kodak02.png,34.9486,0.0377,0.0126,31.3221 +Kodak,8x8,ldr-rgb-kodak03.png,36.6311,0.0334,0.0093,42.2131 +Kodak,8x8,ldr-rgb-kodak04.png,35.2152,0.0379,0.0121,32.6026 +Kodak,8x8,ldr-rgb-kodak05.png,30.2692,0.0575,0.0321,12.2539 +Kodak,8x8,ldr-rgb-kodak06.png,32.9640,0.0420,0.0182,21.6054 +Kodak,8x8,ldr-rgb-kodak07.png,35.0166,0.0390,0.0137,28.6162 +Kodak,8x8,ldr-rgb-kodak08.png,29.9764,0.0582,0.0327,12.0085 +Kodak,8x8,ldr-rgb-kodak09.png,36.2006,0.0360,0.0101,38.7780 +Kodak,8x8,ldr-rgb-kodak10.png,35.9087,0.0348,0.0097,40.3718 +Kodak,8x8,ldr-rgb-kodak11.png,33.0162,0.0412,0.0170,23.1658 +Kodak,8x8,ldr-rgb-kodak12.png,36.7625,0.0325,0.0090,43.5358 +Kodak,8x8,ldr-rgb-kodak13.png,28.2236,0.0645,0.0384,10.2456 +Kodak,8x8,ldr-rgb-kodak14.png,31.5083,0.0504,0.0259,15.1680 +Kodak,8x8,ldr-rgb-kodak15.png,34.9652,0.0371,0.0126,31.1141 +Kodak,8x8,ldr-rgb-kodak16.png,36.0601,0.0342,0.0110,35.8287 +Kodak,8x8,ldr-rgb-kodak17.png,34.9111,0.0372,0.0110,35.7891 +Kodak,8x8,ldr-rgb-kodak18.png,31.2566,0.0492,0.0225,17.4468 +Kodak,8x8,ldr-rgb-kodak19.png,34.2544,0.0417,0.0149,26.4577 +Kodak,8x8,ldr-rgb-kodak20.png,35.2997,0.0344,0.0111,35.3670 +Kodak,8x8,ldr-rgb-kodak21.png,32.7638,0.0431,0.0181,21.7584 +Kodak,8x8,ldr-rgb-kodak22.png,33.4680,0.0420,0.0162,24.2654 +Kodak,8x8,ldr-rgb-kodak23.png,36.5686,0.0338,0.0089,44.1808 +Kodak,8x8,ldr-rgb-kodak24.png,30.8392,0.0466,0.0209,18.8557 +Kodak,12x12,ldr-rgb-kodak01.png,27.1160,0.0493,0.0216,18.1860 +Kodak,12x12,ldr-rgb-kodak02.png,31.1111,0.0338,0.0071,55.7581 +Kodak,12x12,ldr-rgb-kodak03.png,32.7151,0.0318,0.0061,64.1140 +Kodak,12x12,ldr-rgb-kodak04.png,31.5900,0.0347,0.0058,67.5985 +Kodak,12x12,ldr-rgb-kodak05.png,25.8324,0.0529,0.0247,15.9410 +Kodak,12x12,ldr-rgb-kodak06.png,28.6450,0.0402,0.0153,25.7156 +Kodak,12x12,ldr-rgb-kodak07.png,30.8842,0.0357,0.0082,47.7205 +Kodak,12x12,ldr-rgb-kodak08.png,25.4216,0.0582,0.0286,13.7373 +Kodak,12x12,ldr-rgb-kodak09.png,31.8538,0.0342,0.0072,54.9042 +Kodak,12x12,ldr-rgb-kodak10.png,31.5491,0.0352,0.0069,57.0957 +Kodak,12x12,ldr-rgb-kodak11.png,28.9460,0.0375,0.0117,33.7005 +Kodak,12x12,ldr-rgb-kodak12.png,32.3141,0.0312,0.0060,65.0368 +Kodak,12x12,ldr-rgb-kodak13.png,24.3224,0.0571,0.0310,12.6951 +Kodak,12x12,ldr-rgb-kodak14.png,27.5422,0.0413,0.0164,24.0117 +Kodak,12x12,ldr-rgb-kodak15.png,31.2854,0.0362,0.0086,45.7177 +Kodak,12x12,ldr-rgb-kodak16.png,31.4889,0.0327,0.0076,51.9716 +Kodak,12x12,ldr-rgb-kodak17.png,30.9079,0.0359,0.0074,52.9868 +Kodak,12x12,ldr-rgb-kodak18.png,27.4297,0.0444,0.0154,25.6018 +Kodak,12x12,ldr-rgb-kodak19.png,30.2046,0.0395,0.0115,34.2847 +Kodak,12x12,ldr-rgb-kodak20.png,31.0781,0.0329,0.0084,47.0467 +Kodak,12x12,ldr-rgb-kodak21.png,28.7269,0.0413,0.0151,26.0857 +Kodak,12x12,ldr-rgb-kodak22.png,29.8450,0.0367,0.0092,42.9743 +Kodak,12x12,ldr-rgb-kodak23.png,32.5425,0.0333,0.0062,63.4529 +Kodak,12x12,ldr-rgb-kodak24.png,26.7820,0.0420,0.0157,25.0264 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-avx2_fastest_results.csv new file mode 100644 index 0000000..90f7782 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-avx2_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.6152,0.0343,0.0102,38.3667 +Kodak,4x4,ldr-rgb-kodak02.png,43.9221,0.0389,0.0137,28.6202 +Kodak,4x4,ldr-rgb-kodak03.png,46.2372,0.0308,0.0081,48.7862 +Kodak,4x4,ldr-rgb-kodak04.png,44.3537,0.0377,0.0122,32.3367 +Kodak,4x4,ldr-rgb-kodak05.png,41.1551,0.0427,0.0166,23.7434 +Kodak,4x4,ldr-rgb-kodak06.png,44.5675,0.0339,0.0100,39.2234 +Kodak,4x4,ldr-rgb-kodak07.png,44.7745,0.0354,0.0104,37.9151 +Kodak,4x4,ldr-rgb-kodak08.png,41.6237,0.0438,0.0168,23.3406 +Kodak,4x4,ldr-rgb-kodak09.png,46.1082,0.0321,0.0077,50.9552 +Kodak,4x4,ldr-rgb-kodak10.png,45.8849,0.0333,0.0082,47.8590 +Kodak,4x4,ldr-rgb-kodak11.png,43.9614,0.0350,0.0115,34.3354 +Kodak,4x4,ldr-rgb-kodak12.png,46.7086,0.0302,0.0076,52.0339 +Kodak,4x4,ldr-rgb-kodak13.png,41.2762,0.0414,0.0157,25.0630 +Kodak,4x4,ldr-rgb-kodak14.png,41.3103,0.0383,0.0135,29.1056 +Kodak,4x4,ldr-rgb-kodak15.png,44.2711,0.0376,0.0128,30.7035 +Kodak,4x4,ldr-rgb-kodak16.png,47.2082,0.0301,0.0073,53.6086 +Kodak,4x4,ldr-rgb-kodak17.png,45.6054,0.0333,0.0076,52.0684 +Kodak,4x4,ldr-rgb-kodak18.png,41.3846,0.0430,0.0167,23.4952 +Kodak,4x4,ldr-rgb-kodak19.png,44.6829,0.0359,0.0098,40.2054 +Kodak,4x4,ldr-rgb-kodak20.png,45.9296,0.0305,0.0083,47.5828 +Kodak,4x4,ldr-rgb-kodak21.png,44.3988,0.0340,0.0103,38.1687 +Kodak,4x4,ldr-rgb-kodak22.png,42.9304,0.0403,0.0144,27.2575 +Kodak,4x4,ldr-rgb-kodak23.png,45.4032,0.0326,0.0099,39.9087 +Kodak,4x4,ldr-rgb-kodak24.png,41.4984,0.0388,0.0135,29.2314 +Kodak,5x5,ldr-rgb-kodak01.png,39.4194,0.0350,0.0108,36.5003 +Kodak,5x5,ldr-rgb-kodak02.png,40.4363,0.0352,0.0097,40.5584 +Kodak,5x5,ldr-rgb-kodak03.png,42.7853,0.0298,0.0068,57.8082 +Kodak,5x5,ldr-rgb-kodak04.png,40.9556,0.0351,0.0092,42.6895 +Kodak,5x5,ldr-rgb-kodak05.png,37.1429,0.0407,0.0157,25.0614 +Kodak,5x5,ldr-rgb-kodak06.png,40.4962,0.0336,0.0088,44.4463 +Kodak,5x5,ldr-rgb-kodak07.png,41.2586,0.0339,0.0086,45.4745 +Kodak,5x5,ldr-rgb-kodak08.png,37.4830,0.0429,0.0160,24.5899 +Kodak,5x5,ldr-rgb-kodak09.png,42.6666,0.0316,0.0065,60.7487 +Kodak,5x5,ldr-rgb-kodak10.png,42.5017,0.0317,0.0067,58.7848 +Kodak,5x5,ldr-rgb-kodak11.png,40.1345,0.0333,0.0094,41.8766 +Kodak,5x5,ldr-rgb-kodak12.png,43.3613,0.0293,0.0061,63.9499 +Kodak,5x5,ldr-rgb-kodak13.png,36.7636,0.0408,0.0152,25.8510 +Kodak,5x5,ldr-rgb-kodak14.png,37.6096,0.0376,0.0131,30.0879 +Kodak,5x5,ldr-rgb-kodak15.png,40.9898,0.0342,0.0092,42.7548 +Kodak,5x5,ldr-rgb-kodak16.png,43.4443,0.0289,0.0059,66.1400 +Kodak,5x5,ldr-rgb-kodak17.png,41.9413,0.0319,0.0065,60.5970 +Kodak,5x5,ldr-rgb-kodak18.png,37.9787,0.0388,0.0127,30.9303 +Kodak,5x5,ldr-rgb-kodak19.png,40.9577,0.0342,0.0082,47.6860 +Kodak,5x5,ldr-rgb-kodak20.png,42.2618,0.0298,0.0069,57.2881 +Kodak,5x5,ldr-rgb-kodak21.png,40.2785,0.0336,0.0092,42.5969 +Kodak,5x5,ldr-rgb-kodak22.png,39.5529,0.0363,0.0104,37.6356 +Kodak,5x5,ldr-rgb-kodak23.png,42.2559,0.0317,0.0076,52.0257 +Kodak,5x5,ldr-rgb-kodak24.png,37.7275,0.0362,0.0116,33.9328 +Kodak,6x6,ldr-rgb-kodak01.png,35.6767,0.0387,0.0138,28.4612 +Kodak,6x6,ldr-rgb-kodak02.png,38.0882,0.0344,0.0094,42.0281 +Kodak,6x6,ldr-rgb-kodak03.png,40.4238,0.0291,0.0063,62.1778 +Kodak,6x6,ldr-rgb-kodak04.png,38.3891,0.0343,0.0090,43.7680 +Kodak,6x6,ldr-rgb-kodak05.png,34.1780,0.0432,0.0174,22.6336 +Kodak,6x6,ldr-rgb-kodak06.png,37.2643,0.0339,0.0098,39.9242 +Kodak,6x6,ldr-rgb-kodak07.png,38.7214,0.0341,0.0086,45.8232 +Kodak,6x6,ldr-rgb-kodak08.png,34.2669,0.0444,0.0179,21.9137 +Kodak,6x6,ldr-rgb-kodak09.png,39.8359,0.0319,0.0068,58.0646 +Kodak,6x6,ldr-rgb-kodak10.png,39.6247,0.0326,0.0068,57.6566 +Kodak,6x6,ldr-rgb-kodak11.png,37.0472,0.0342,0.0102,38.5658 +Kodak,6x6,ldr-rgb-kodak12.png,40.6771,0.0295,0.0061,64.2739 +Kodak,6x6,ldr-rgb-kodak13.png,32.7580,0.0456,0.0195,20.1701 +Kodak,6x6,ldr-rgb-kodak14.png,35.0174,0.0396,0.0139,28.3073 +Kodak,6x6,ldr-rgb-kodak15.png,38.4641,0.0345,0.0092,42.8715 +Kodak,6x6,ldr-rgb-kodak16.png,40.4696,0.0294,0.0063,62.5338 +Kodak,6x6,ldr-rgb-kodak17.png,38.8323,0.0331,0.0071,55.5627 +Kodak,6x6,ldr-rgb-kodak18.png,35.0273,0.0404,0.0137,28.7775 +Kodak,6x6,ldr-rgb-kodak19.png,37.8803,0.0354,0.0095,41.2131 +Kodak,6x6,ldr-rgb-kodak20.png,39.1443,0.0307,0.0075,52.5831 +Kodak,6x6,ldr-rgb-kodak21.png,36.8527,0.0350,0.0106,37.2295 +Kodak,6x6,ldr-rgb-kodak22.png,36.9018,0.0371,0.0107,36.6260 +Kodak,6x6,ldr-rgb-kodak23.png,39.9247,0.0311,0.0068,57.7576 +Kodak,6x6,ldr-rgb-kodak24.png,34.7442,0.0387,0.0126,31.2746 +Kodak,8x8,ldr-rgb-kodak01.png,31.2078,0.0449,0.0196,20.0804 +Kodak,8x8,ldr-rgb-kodak02.png,34.8058,0.0337,0.0098,40.1526 +Kodak,8x8,ldr-rgb-kodak03.png,36.5012,0.0306,0.0075,52.1656 +Kodak,8x8,ldr-rgb-kodak04.png,35.1078,0.0354,0.0092,42.5464 +Kodak,8x8,ldr-rgb-kodak05.png,30.0814,0.0495,0.0239,16.4622 +Kodak,8x8,ldr-rgb-kodak06.png,32.8277,0.0386,0.0138,28.4961 +Kodak,8x8,ldr-rgb-kodak07.png,34.8630,0.0378,0.0106,36.9733 +Kodak,8x8,ldr-rgb-kodak08.png,29.7286,0.0527,0.0248,15.8695 +Kodak,8x8,ldr-rgb-kodak09.png,35.9577,0.0327,0.0083,47.6281 +Kodak,8x8,ldr-rgb-kodak10.png,35.7560,0.0331,0.0079,49.8811 +Kodak,8x8,ldr-rgb-kodak11.png,32.8909,0.0373,0.0131,30.1291 +Kodak,8x8,ldr-rgb-kodak12.png,36.5503,0.0309,0.0073,54.1542 +Kodak,8x8,ldr-rgb-kodak13.png,28.1463,0.0535,0.0283,13.9118 +Kodak,8x8,ldr-rgb-kodak14.png,31.3282,0.0432,0.0186,21.1792 +Kodak,8x8,ldr-rgb-kodak15.png,34.7865,0.0351,0.0097,40.4292 +Kodak,8x8,ldr-rgb-kodak16.png,35.9764,0.0328,0.0088,44.6375 +Kodak,8x8,ldr-rgb-kodak17.png,34.7388,0.0347,0.0087,45.0583 +Kodak,8x8,ldr-rgb-kodak18.png,31.1872,0.0434,0.0169,23.2740 +Kodak,8x8,ldr-rgb-kodak19.png,33.9413,0.0380,0.0117,33.6998 +Kodak,8x8,ldr-rgb-kodak20.png,35.1346,0.0327,0.0086,45.4694 +Kodak,8x8,ldr-rgb-kodak21.png,32.6595,0.0377,0.0135,29.0390 +Kodak,8x8,ldr-rgb-kodak22.png,33.3561,0.0388,0.0121,32.3690 +Kodak,8x8,ldr-rgb-kodak23.png,36.4349,0.0318,0.0070,56.0537 +Kodak,8x8,ldr-rgb-kodak24.png,30.7648,0.0412,0.0156,25.2255 +Kodak,12x12,ldr-rgb-kodak01.png,26.9966,0.0434,0.0159,24.6900 +Kodak,12x12,ldr-rgb-kodak02.png,31.0404,0.0327,0.0058,67.5265 +Kodak,12x12,ldr-rgb-kodak03.png,32.6438,0.0310,0.0052,75.5159 +Kodak,12x12,ldr-rgb-kodak04.png,31.4939,0.0324,0.0047,83.6300 +Kodak,12x12,ldr-rgb-kodak05.png,25.7124,0.0438,0.0178,22.0682 +Kodak,12x12,ldr-rgb-kodak06.png,28.4949,0.0373,0.0115,34.2072 +Kodak,12x12,ldr-rgb-kodak07.png,30.8256,0.0332,0.0066,59.8776 +Kodak,12x12,ldr-rgb-kodak08.png,25.2230,0.0500,0.0211,18.6402 +Kodak,12x12,ldr-rgb-kodak09.png,31.6667,0.0317,0.0057,69.1198 +Kodak,12x12,ldr-rgb-kodak10.png,31.4721,0.0319,0.0057,69.4867 +Kodak,12x12,ldr-rgb-kodak11.png,28.8772,0.0345,0.0089,44.2661 +Kodak,12x12,ldr-rgb-kodak12.png,32.2086,0.0311,0.0049,80.2641 +Kodak,12x12,ldr-rgb-kodak13.png,24.2484,0.0478,0.0222,17.7203 +Kodak,12x12,ldr-rgb-kodak14.png,27.4544,0.0383,0.0121,32.4544 +Kodak,12x12,ldr-rgb-kodak15.png,31.1835,0.0334,0.0067,58.6281 +Kodak,12x12,ldr-rgb-kodak16.png,31.3677,0.0317,0.0062,63.7103 +Kodak,12x12,ldr-rgb-kodak17.png,30.8482,0.0332,0.0060,65.3719 +Kodak,12x12,ldr-rgb-kodak18.png,27.3787,0.0389,0.0113,34.6507 +Kodak,12x12,ldr-rgb-kodak19.png,29.8778,0.0366,0.0091,43.3254 +Kodak,12x12,ldr-rgb-kodak20.png,30.9672,0.0303,0.0067,58.9888 +Kodak,12x12,ldr-rgb-kodak21.png,28.6256,0.0378,0.0112,35.1934 +Kodak,12x12,ldr-rgb-kodak22.png,29.7644,0.0343,0.0071,55.6020 +Kodak,12x12,ldr-rgb-kodak23.png,32.4929,0.0314,0.0052,76.1154 +Kodak,12x12,ldr-rgb-kodak24.png,26.7164,0.0398,0.0121,32.5402 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-avx2_medium_results.csv new file mode 100644 index 0000000..3c51d0f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-avx2_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.3893,0.0923,0.0688,5.7186 +Kodak,4x4,ldr-rgb-kodak02.png,45.5264,0.1341,0.1099,3.5790 +Kodak,4x4,ldr-rgb-kodak03.png,47.8384,0.0747,0.0527,7.4595 +Kodak,4x4,ldr-rgb-kodak04.png,45.6272,0.1071,0.0845,4.6529 +Kodak,4x4,ldr-rgb-kodak05.png,42.2263,0.1172,0.0931,4.2222 +Kodak,4x4,ldr-rgb-kodak06.png,45.2803,0.0889,0.0657,5.9873 +Kodak,4x4,ldr-rgb-kodak07.png,46.1439,0.0888,0.0648,6.0723 +Kodak,4x4,ldr-rgb-kodak08.png,42.5930,0.1240,0.0981,4.0067 +Kodak,4x4,ldr-rgb-kodak09.png,47.3634,0.1063,0.0825,4.7684 +Kodak,4x4,ldr-rgb-kodak10.png,47.0404,0.1076,0.0835,4.7120 +Kodak,4x4,ldr-rgb-kodak11.png,44.9920,0.1033,0.0807,4.8727 +Kodak,4x4,ldr-rgb-kodak12.png,48.1506,0.0836,0.0610,6.4424 +Kodak,4x4,ldr-rgb-kodak13.png,41.7087,0.0977,0.0729,5.3924 +Kodak,4x4,ldr-rgb-kodak14.png,42.7740,0.1104,0.0867,4.5328 +Kodak,4x4,ldr-rgb-kodak15.png,45.6062,0.0985,0.0741,5.3096 +Kodak,4x4,ldr-rgb-kodak16.png,48.0286,0.0817,0.0591,6.6573 +Kodak,4x4,ldr-rgb-kodak17.png,46.4278,0.0958,0.0729,5.3913 +Kodak,4x4,ldr-rgb-kodak18.png,42.1021,0.1335,0.1079,3.6428 +Kodak,4x4,ldr-rgb-kodak19.png,45.4884,0.1088,0.0843,4.6663 +Kodak,4x4,ldr-rgb-kodak20.png,46.9601,0.0725,0.0502,7.8257 +Kodak,4x4,ldr-rgb-kodak21.png,45.3038,0.1094,0.0860,4.5702 +Kodak,4x4,ldr-rgb-kodak22.png,43.9210,0.1350,0.1101,3.5725 +Kodak,4x4,ldr-rgb-kodak23.png,47.0288,0.1108,0.0874,4.5002 +Kodak,4x4,ldr-rgb-kodak24.png,42.4674,0.1059,0.0814,4.8299 +Kodak,5x5,ldr-rgb-kodak01.png,40.1424,0.0897,0.0665,5.9115 +Kodak,5x5,ldr-rgb-kodak02.png,41.8065,0.1028,0.0792,4.9673 +Kodak,5x5,ldr-rgb-kodak03.png,44.1500,0.0556,0.0337,11.6661 +Kodak,5x5,ldr-rgb-kodak04.png,42.1538,0.0821,0.0579,6.7861 +Kodak,5x5,ldr-rgb-kodak05.png,38.0377,0.1060,0.0813,4.8348 +Kodak,5x5,ldr-rgb-kodak06.png,41.0310,0.0752,0.0523,7.5132 +Kodak,5x5,ldr-rgb-kodak07.png,42.5439,0.0689,0.0454,8.6594 +Kodak,5x5,ldr-rgb-kodak08.png,38.3925,0.1079,0.0826,4.7632 +Kodak,5x5,ldr-rgb-kodak09.png,43.8761,0.0619,0.0382,10.2985 +Kodak,5x5,ldr-rgb-kodak10.png,43.4929,0.0674,0.0432,9.1027 +Kodak,5x5,ldr-rgb-kodak11.png,40.9019,0.0856,0.0623,6.3092 +Kodak,5x5,ldr-rgb-kodak12.png,44.5108,0.0550,0.0338,11.6202 +Kodak,5x5,ldr-rgb-kodak13.png,36.9538,0.0920,0.0676,5.8179 +Kodak,5x5,ldr-rgb-kodak14.png,38.7248,0.0960,0.0724,5.4326 +Kodak,5x5,ldr-rgb-kodak15.png,41.9922,0.0781,0.0542,7.2544 +Kodak,5x5,ldr-rgb-kodak16.png,44.1998,0.0587,0.0365,10.7604 +Kodak,5x5,ldr-rgb-kodak17.png,42.5900,0.0621,0.0380,10.3494 +Kodak,5x5,ldr-rgb-kodak18.png,38.4188,0.1023,0.0770,5.1084 +Kodak,5x5,ldr-rgb-kodak19.png,41.7098,0.0733,0.0488,8.0585 +Kodak,5x5,ldr-rgb-kodak20.png,43.1430,0.0557,0.0336,11.7046 +Kodak,5x5,ldr-rgb-kodak21.png,40.8167,0.0756,0.0524,7.5077 +Kodak,5x5,ldr-rgb-kodak22.png,40.3455,0.0994,0.0748,5.2594 +Kodak,5x5,ldr-rgb-kodak23.png,43.6601,0.0726,0.0495,7.9473 +Kodak,5x5,ldr-rgb-kodak24.png,38.2507,0.0858,0.0613,6.4156 +Kodak,6x6,ldr-rgb-kodak01.png,36.2083,0.0898,0.0662,5.9364 +Kodak,6x6,ldr-rgb-kodak02.png,39.0602,0.0827,0.0591,6.6581 +Kodak,6x6,ldr-rgb-kodak03.png,41.3762,0.0480,0.0262,14.9910 +Kodak,6x6,ldr-rgb-kodak04.png,39.4344,0.0721,0.0477,8.2472 +Kodak,6x6,ldr-rgb-kodak05.png,34.8202,0.1010,0.0771,5.0978 +Kodak,6x6,ldr-rgb-kodak06.png,37.6602,0.0674,0.0447,8.7891 +Kodak,6x6,ldr-rgb-kodak07.png,39.8252,0.0609,0.0374,10.5192 +Kodak,6x6,ldr-rgb-kodak08.png,34.9947,0.1039,0.0787,4.9986 +Kodak,6x6,ldr-rgb-kodak09.png,40.9179,0.0509,0.0273,14.4216 +Kodak,6x6,ldr-rgb-kodak10.png,40.5456,0.0534,0.0293,13.4277 +Kodak,6x6,ldr-rgb-kodak11.png,37.6101,0.0737,0.0508,7.7481 +Kodak,6x6,ldr-rgb-kodak12.png,41.5399,0.0466,0.0246,15.9643 +Kodak,6x6,ldr-rgb-kodak13.png,32.9152,0.0969,0.0724,5.4344 +Kodak,6x6,ldr-rgb-kodak14.png,35.8561,0.0898,0.0666,5.9065 +Kodak,6x6,ldr-rgb-kodak15.png,39.2408,0.0712,0.0474,8.3006 +Kodak,6x6,ldr-rgb-kodak16.png,41.0666,0.0506,0.0283,13.9088 +Kodak,6x6,ldr-rgb-kodak17.png,39.5033,0.0531,0.0291,13.5199 +Kodak,6x6,ldr-rgb-kodak18.png,35.3736,0.0907,0.0659,5.9632 +Kodak,6x6,ldr-rgb-kodak19.png,38.5468,0.0667,0.0420,9.3540 +Kodak,6x6,ldr-rgb-kodak20.png,39.8569,0.0498,0.0300,13.1202 +Kodak,6x6,ldr-rgb-kodak21.png,37.2204,0.0668,0.0436,9.0084 +Kodak,6x6,ldr-rgb-kodak22.png,37.4959,0.0844,0.0600,6.5520 +Kodak,6x6,ldr-rgb-kodak23.png,41.0303,0.0557,0.0326,12.0501 +Kodak,6x6,ldr-rgb-kodak24.png,35.0929,0.0765,0.0520,7.5557 +Kodak,8x8,ldr-rgb-kodak01.png,31.8086,0.1185,0.0943,4.1719 +Kodak,8x8,ldr-rgb-kodak02.png,35.8003,0.0836,0.0593,6.6315 +Kodak,8x8,ldr-rgb-kodak03.png,37.7825,0.0568,0.0340,11.5584 +Kodak,8x8,ldr-rgb-kodak04.png,36.1248,0.0786,0.0536,7.3338 +Kodak,8x8,ldr-rgb-kodak05.png,30.7580,0.1295,0.1041,3.7756 +Kodak,8x8,ldr-rgb-kodak06.png,33.4623,0.0830,0.0598,6.5775 +Kodak,8x8,ldr-rgb-kodak07.png,36.1776,0.0718,0.0474,8.3002 +Kodak,8x8,ldr-rgb-kodak08.png,30.5494,0.1313,0.1053,3.7358 +Kodak,8x8,ldr-rgb-kodak09.png,37.2895,0.0583,0.0339,11.6143 +Kodak,8x8,ldr-rgb-kodak10.png,36.9400,0.0590,0.0342,11.5103 +Kodak,8x8,ldr-rgb-kodak11.png,33.6691,0.0856,0.0620,6.3390 +Kodak,8x8,ldr-rgb-kodak12.png,37.8675,0.0550,0.0325,12.1161 +Kodak,8x8,ldr-rgb-kodak13.png,28.3992,0.1276,0.1022,3.8474 +Kodak,8x8,ldr-rgb-kodak14.png,32.1615,0.1118,0.0875,4.4962 +Kodak,8x8,ldr-rgb-kodak15.png,35.8680,0.0729,0.0483,8.1376 +Kodak,8x8,ldr-rgb-kodak16.png,37.0407,0.0606,0.0377,10.4177 +Kodak,8x8,ldr-rgb-kodak17.png,35.6805,0.0620,0.0375,10.4967 +Kodak,8x8,ldr-rgb-kodak18.png,31.5716,0.1048,0.0788,4.9869 +Kodak,8x8,ldr-rgb-kodak19.png,34.7788,0.0764,0.0512,7.6816 +Kodak,8x8,ldr-rgb-kodak20.png,35.9522,0.0611,0.0387,10.1595 +Kodak,8x8,ldr-rgb-kodak21.png,33.1194,0.0809,0.0576,6.8269 +Kodak,8x8,ldr-rgb-kodak22.png,34.0651,0.0911,0.0662,5.9386 +Kodak,8x8,ldr-rgb-kodak23.png,37.7092,0.0580,0.0342,11.5141 +Kodak,8x8,ldr-rgb-kodak24.png,31.1382,0.0898,0.0649,6.0611 +Kodak,12x12,ldr-rgb-kodak01.png,27.7566,0.1297,0.1042,3.7748 +Kodak,12x12,ldr-rgb-kodak02.png,32.4637,0.0670,0.0412,9.5404 +Kodak,12x12,ldr-rgb-kodak03.png,33.8522,0.0517,0.0276,14.2455 +Kodak,12x12,ldr-rgb-kodak04.png,32.4647,0.0603,0.0337,11.6819 +Kodak,12x12,ldr-rgb-kodak05.png,26.4046,0.1420,0.1144,3.4370 +Kodak,12x12,ldr-rgb-kodak06.png,29.3819,0.0868,0.0618,6.3625 +Kodak,12x12,ldr-rgb-kodak07.png,32.0722,0.0707,0.0447,8.7958 +Kodak,12x12,ldr-rgb-kodak08.png,26.0673,0.1454,0.1179,3.3356 +Kodak,12x12,ldr-rgb-kodak09.png,33.1057,0.0552,0.0292,13.4691 +Kodak,12x12,ldr-rgb-kodak10.png,32.4968,0.0552,0.0291,13.5010 +Kodak,12x12,ldr-rgb-kodak11.png,29.7542,0.0827,0.0577,6.8168 +Kodak,12x12,ldr-rgb-kodak12.png,33.8881,0.0514,0.0269,14.6362 +Kodak,12x12,ldr-rgb-kodak13.png,24.5326,0.1453,0.1185,3.3178 +Kodak,12x12,ldr-rgb-kodak14.png,28.4367,0.1127,0.0869,4.5272 +Kodak,12x12,ldr-rgb-kodak15.png,32.2567,0.0674,0.0413,9.5152 +Kodak,12x12,ldr-rgb-kodak16.png,32.9956,0.0567,0.0323,12.1776 +Kodak,12x12,ldr-rgb-kodak17.png,31.7900,0.0591,0.0328,11.9762 +Kodak,12x12,ldr-rgb-kodak18.png,27.7883,0.1018,0.0740,5.3106 +Kodak,12x12,ldr-rgb-kodak19.png,30.8989,0.0744,0.0475,8.2784 +Kodak,12x12,ldr-rgb-kodak20.png,31.8905,0.0594,0.0348,11.3015 +Kodak,12x12,ldr-rgb-kodak21.png,29.1898,0.0889,0.0637,6.1744 +Kodak,12x12,ldr-rgb-kodak22.png,30.5216,0.0798,0.0529,7.4382 +Kodak,12x12,ldr-rgb-kodak23.png,33.5783,0.0494,0.0242,16.2695 +Kodak,12x12,ldr-rgb-kodak24.png,27.1088,0.0917,0.0647,6.0808 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-avx2_thorough_results.csv new file mode 100644 index 0000000..bd2da6f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-avx2_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.5922,0.1894,0.1659,2.3699 +Kodak,4x4,ldr-rgb-kodak02.png,45.8030,0.2671,0.2426,1.6211 +Kodak,4x4,ldr-rgb-kodak03.png,48.2411,0.2068,0.1844,2.1322 +Kodak,4x4,ldr-rgb-kodak04.png,45.8220,0.2422,0.2171,1.8116 +Kodak,4x4,ldr-rgb-kodak05.png,42.4990,0.2354,0.2125,1.8504 +Kodak,4x4,ldr-rgb-kodak06.png,45.4845,0.1978,0.1747,2.2510 +Kodak,4x4,ldr-rgb-kodak07.png,46.5232,0.2294,0.2050,1.9179 +Kodak,4x4,ldr-rgb-kodak08.png,42.8951,0.2476,0.2220,1.7709 +Kodak,4x4,ldr-rgb-kodak09.png,47.6380,0.2501,0.2261,1.7390 +Kodak,4x4,ldr-rgb-kodak10.png,47.2861,0.2465,0.2220,1.7715 +Kodak,4x4,ldr-rgb-kodak11.png,45.2527,0.2220,0.1985,1.9814 +Kodak,4x4,ldr-rgb-kodak12.png,48.4695,0.2157,0.1947,2.0201 +Kodak,4x4,ldr-rgb-kodak13.png,41.8177,0.1975,0.1726,2.2788 +Kodak,4x4,ldr-rgb-kodak14.png,43.0359,0.2221,0.1982,1.9842 +Kodak,4x4,ldr-rgb-kodak15.png,45.9001,0.2346,0.2105,1.8680 +Kodak,4x4,ldr-rgb-kodak16.png,48.2454,0.2088,0.1871,2.1018 +Kodak,4x4,ldr-rgb-kodak17.png,46.6018,0.2287,0.2058,1.9109 +Kodak,4x4,ldr-rgb-kodak18.png,42.2703,0.2626,0.2375,1.6558 +Kodak,4x4,ldr-rgb-kodak19.png,45.7040,0.2388,0.2140,1.8378 +Kodak,4x4,ldr-rgb-kodak20.png,47.2393,0.1607,0.1395,2.8192 +Kodak,4x4,ldr-rgb-kodak21.png,45.4554,0.2385,0.2150,1.8293 +Kodak,4x4,ldr-rgb-kodak22.png,44.1133,0.2697,0.2466,1.5943 +Kodak,4x4,ldr-rgb-kodak23.png,47.3572,0.2586,0.2358,1.6673 +Kodak,4x4,ldr-rgb-kodak24.png,42.6967,0.2317,0.2069,1.9006 +Kodak,5x5,ldr-rgb-kodak01.png,40.2586,0.2103,0.1878,2.0933 +Kodak,5x5,ldr-rgb-kodak02.png,42.0904,0.2762,0.2537,1.5501 +Kodak,5x5,ldr-rgb-kodak03.png,44.4615,0.2122,0.1901,2.0686 +Kodak,5x5,ldr-rgb-kodak04.png,42.3443,0.2320,0.2089,1.8819 +Kodak,5x5,ldr-rgb-kodak05.png,38.2346,0.2485,0.2235,1.7592 +Kodak,5x5,ldr-rgb-kodak06.png,41.1418,0.1988,0.1758,2.2369 +Kodak,5x5,ldr-rgb-kodak07.png,42.8229,0.2313,0.2085,1.8856 +Kodak,5x5,ldr-rgb-kodak08.png,38.5696,0.2469,0.2219,1.7723 +Kodak,5x5,ldr-rgb-kodak09.png,44.1115,0.2301,0.2057,1.9115 +Kodak,5x5,ldr-rgb-kodak10.png,43.6829,0.2357,0.2110,1.8640 +Kodak,5x5,ldr-rgb-kodak11.png,41.0699,0.2241,0.2004,1.9625 +Kodak,5x5,ldr-rgb-kodak12.png,44.7095,0.2126,0.1895,2.0749 +Kodak,5x5,ldr-rgb-kodak13.png,37.0063,0.1942,0.1693,2.3228 +Kodak,5x5,ldr-rgb-kodak14.png,38.9442,0.2293,0.2052,1.9159 +Kodak,5x5,ldr-rgb-kodak15.png,42.2117,0.2314,0.2070,1.8995 +Kodak,5x5,ldr-rgb-kodak16.png,44.3482,0.2080,0.1846,2.1300 +Kodak,5x5,ldr-rgb-kodak17.png,42.6961,0.2176,0.1924,2.0442 +Kodak,5x5,ldr-rgb-kodak18.png,38.5147,0.2526,0.2262,1.7383 +Kodak,5x5,ldr-rgb-kodak19.png,41.8527,0.2335,0.2082,1.8889 +Kodak,5x5,ldr-rgb-kodak20.png,43.3624,0.1516,0.1294,3.0395 +Kodak,5x5,ldr-rgb-kodak21.png,40.9291,0.2383,0.2150,1.8291 +Kodak,5x5,ldr-rgb-kodak22.png,40.4963,0.2684,0.2452,1.6035 +Kodak,5x5,ldr-rgb-kodak23.png,43.9946,0.2677,0.2437,1.6132 +Kodak,5x5,ldr-rgb-kodak24.png,38.3784,0.2338,0.2103,1.8701 +Kodak,6x6,ldr-rgb-kodak01.png,36.3246,0.2336,0.2094,1.8774 +Kodak,6x6,ldr-rgb-kodak02.png,39.4302,0.2965,0.2717,1.4472 +Kodak,6x6,ldr-rgb-kodak03.png,41.8065,0.1876,0.1649,2.3849 +Kodak,6x6,ldr-rgb-kodak04.png,39.7049,0.2412,0.2165,1.8159 +Kodak,6x6,ldr-rgb-kodak05.png,35.0174,0.2657,0.2410,1.6313 +Kodak,6x6,ldr-rgb-kodak06.png,37.7802,0.2100,0.1865,2.1080 +Kodak,6x6,ldr-rgb-kodak07.png,40.1739,0.2150,0.1906,2.0632 +Kodak,6x6,ldr-rgb-kodak08.png,35.1895,0.2628,0.2369,1.6599 +Kodak,6x6,ldr-rgb-kodak09.png,41.3054,0.2297,0.2051,1.9171 +Kodak,6x6,ldr-rgb-kodak10.png,40.8835,0.2456,0.2205,1.7832 +Kodak,6x6,ldr-rgb-kodak11.png,37.8029,0.2326,0.2087,1.8838 +Kodak,6x6,ldr-rgb-kodak12.png,41.8909,0.2128,0.1901,2.0682 +Kodak,6x6,ldr-rgb-kodak13.png,32.9679,0.2197,0.1966,2.0004 +Kodak,6x6,ldr-rgb-kodak14.png,36.0646,0.2502,0.2259,1.7408 +Kodak,6x6,ldr-rgb-kodak15.png,39.4965,0.2196,0.1953,2.0131 +Kodak,6x6,ldr-rgb-kodak16.png,41.2648,0.2000,0.1776,2.2140 +Kodak,6x6,ldr-rgb-kodak17.png,39.6991,0.2246,0.2000,1.9656 +Kodak,6x6,ldr-rgb-kodak18.png,35.4614,0.2665,0.2423,1.6227 +Kodak,6x6,ldr-rgb-kodak19.png,38.7373,0.2508,0.2253,1.7453 +Kodak,6x6,ldr-rgb-kodak20.png,40.1617,0.1588,0.1359,2.8932 +Kodak,6x6,ldr-rgb-kodak21.png,37.3694,0.2491,0.2256,1.7432 +Kodak,6x6,ldr-rgb-kodak22.png,37.6663,0.2850,0.2597,1.5141 +Kodak,6x6,ldr-rgb-kodak23.png,41.4926,0.2652,0.2427,1.6205 +Kodak,6x6,ldr-rgb-kodak24.png,35.2089,0.2391,0.2141,1.8370 +Kodak,8x8,ldr-rgb-kodak01.png,31.9145,0.2890,0.2637,1.4911 +Kodak,8x8,ldr-rgb-kodak02.png,36.1779,0.2891,0.2656,1.4804 +Kodak,8x8,ldr-rgb-kodak03.png,38.2215,0.1588,0.1351,2.9109 +Kodak,8x8,ldr-rgb-kodak04.png,36.4120,0.2355,0.2109,1.8647 +Kodak,8x8,ldr-rgb-kodak05.png,30.9292,0.3129,0.2869,1.3705 +Kodak,8x8,ldr-rgb-kodak06.png,33.5936,0.2366,0.2140,1.8377 +Kodak,8x8,ldr-rgb-kodak07.png,36.5361,0.1924,0.1680,2.3399 +Kodak,8x8,ldr-rgb-kodak08.png,30.7430,0.3361,0.3114,1.2626 +Kodak,8x8,ldr-rgb-kodak09.png,37.5825,0.1763,0.1508,2.6078 +Kodak,8x8,ldr-rgb-kodak10.png,37.2612,0.2001,0.1758,2.2367 +Kodak,8x8,ldr-rgb-kodak11.png,33.8424,0.2787,0.2543,1.5463 +Kodak,8x8,ldr-rgb-kodak12.png,38.2926,0.1826,0.1588,2.4757 +Kodak,8x8,ldr-rgb-kodak13.png,28.4632,0.3005,0.2746,1.4319 +Kodak,8x8,ldr-rgb-kodak14.png,32.3344,0.3007,0.2759,1.4250 +Kodak,8x8,ldr-rgb-kodak15.png,36.0889,0.2213,0.1975,1.9905 +Kodak,8x8,ldr-rgb-kodak16.png,37.2793,0.1948,0.1713,2.2954 +Kodak,8x8,ldr-rgb-kodak17.png,35.8741,0.1954,0.1695,2.3196 +Kodak,8x8,ldr-rgb-kodak18.png,31.6653,0.3093,0.2823,1.3931 +Kodak,8x8,ldr-rgb-kodak19.png,34.9446,0.2109,0.1847,2.1284 +Kodak,8x8,ldr-rgb-kodak20.png,36.1894,0.1706,0.1466,2.6817 +Kodak,8x8,ldr-rgb-kodak21.png,33.2320,0.3511,0.3242,1.2127 +Kodak,8x8,ldr-rgb-kodak22.png,34.2464,0.3838,0.3572,1.1007 +Kodak,8x8,ldr-rgb-kodak23.png,38.2357,0.2533,0.2285,1.7207 +Kodak,8x8,ldr-rgb-kodak24.png,31.2478,0.3448,0.3180,1.2365 +Kodak,12x12,ldr-rgb-kodak01.png,27.9181,0.5108,0.4819,0.8160 +Kodak,12x12,ldr-rgb-kodak02.png,33.0108,0.3755,0.3459,1.1369 +Kodak,12x12,ldr-rgb-kodak03.png,34.4642,0.2257,0.1982,1.9843 +Kodak,12x12,ldr-rgb-kodak04.png,32.9804,0.3295,0.2997,1.3119 +Kodak,12x12,ldr-rgb-kodak05.png,26.6113,0.5564,0.5266,0.7467 +Kodak,12x12,ldr-rgb-kodak06.png,29.5414,0.3239,0.2984,1.3178 +Kodak,12x12,ldr-rgb-kodak07.png,32.6520,0.2506,0.2225,1.7672 +Kodak,12x12,ldr-rgb-kodak08.png,26.2681,0.4742,0.4460,0.8816 +Kodak,12x12,ldr-rgb-kodak09.png,33.6376,0.2235,0.1951,2.0160 +Kodak,12x12,ldr-rgb-kodak10.png,32.9960,0.2247,0.1956,2.0105 +Kodak,12x12,ldr-rgb-kodak11.png,30.0542,0.3461,0.3184,1.2350 +Kodak,12x12,ldr-rgb-kodak12.png,34.4647,0.2024,0.1754,2.2423 +Kodak,12x12,ldr-rgb-kodak13.png,24.5895,0.5163,0.4868,0.8078 +Kodak,12x12,ldr-rgb-kodak14.png,28.6563,0.4164,0.3874,1.0150 +Kodak,12x12,ldr-rgb-kodak15.png,32.7482,0.2747,0.2456,1.6012 +Kodak,12x12,ldr-rgb-kodak16.png,33.3438,0.2409,0.2149,1.8300 +Kodak,12x12,ldr-rgb-kodak17.png,32.1376,0.2412,0.2141,1.8367 +Kodak,12x12,ldr-rgb-kodak18.png,27.9291,0.4165,0.3866,1.0172 +Kodak,12x12,ldr-rgb-kodak19.png,31.1197,0.3220,0.2924,1.3447 +Kodak,12x12,ldr-rgb-kodak20.png,32.1844,0.2526,0.2260,1.7401 +Kodak,12x12,ldr-rgb-kodak21.png,29.3333,0.3093,0.2817,1.3958 +Kodak,12x12,ldr-rgb-kodak22.png,30.7935,0.3717,0.3425,1.1480 +Kodak,12x12,ldr-rgb-kodak23.png,34.3801,0.2010,0.1732,2.2706 +Kodak,12x12,ldr-rgb-kodak24.png,27.2441,0.3754,0.3469,1.1335 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse2_fast_results.csv new file mode 100644 index 0000000..0d70319 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse2_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.9519,0.0416,0.0196,20.0702 +Kodak,4x4,ldr-rgb-kodak02.png,44.3432,0.0494,0.0282,13.9344 +Kodak,4x4,ldr-rgb-kodak03.png,46.8391,0.0357,0.0157,25.0664 +Kodak,4x4,ldr-rgb-kodak04.png,44.7725,0.0471,0.0252,15.5797 +Kodak,4x4,ldr-rgb-kodak05.png,41.6992,0.0590,0.0374,10.5110 +Kodak,4x4,ldr-rgb-kodak06.png,44.8554,0.0389,0.0193,20.3716 +Kodak,4x4,ldr-rgb-kodak07.png,45.2328,0.0427,0.0214,18.4134 +Kodak,4x4,ldr-rgb-kodak08.png,42.1951,0.0617,0.0386,10.1851 +Kodak,4x4,ldr-rgb-kodak09.png,46.4560,0.0356,0.0144,27.2197 +Kodak,4x4,ldr-rgb-kodak10.png,46.2383,0.0367,0.0153,25.7272 +Kodak,4x4,ldr-rgb-kodak11.png,44.3773,0.0441,0.0234,16.7712 +Kodak,4x4,ldr-rgb-kodak12.png,47.2693,0.0342,0.0143,27.5899 +Kodak,4x4,ldr-rgb-kodak13.png,41.5422,0.0539,0.0321,12.2483 +Kodak,4x4,ldr-rgb-kodak14.png,41.9752,0.0506,0.0309,12.7209 +Kodak,4x4,ldr-rgb-kodak15.png,44.7351,0.0480,0.0270,14.5739 +Kodak,4x4,ldr-rgb-kodak16.png,47.3501,0.0321,0.0125,31.4800 +Kodak,4x4,ldr-rgb-kodak17.png,45.8448,0.0360,0.0141,27.9750 +Kodak,4x4,ldr-rgb-kodak18.png,41.7294,0.0601,0.0371,10.5888 +Kodak,4x4,ldr-rgb-kodak19.png,44.9589,0.0402,0.0186,21.1417 +Kodak,4x4,ldr-rgb-kodak20.png,46.4220,0.0351,0.0160,24.5160 +Kodak,4x4,ldr-rgb-kodak21.png,44.7255,0.0402,0.0199,19.7448 +Kodak,4x4,ldr-rgb-kodak22.png,43.3126,0.0526,0.0310,12.7032 +Kodak,4x4,ldr-rgb-kodak23.png,45.7203,0.0394,0.0190,20.7054 +Kodak,4x4,ldr-rgb-kodak24.png,42.0604,0.0511,0.0298,13.2116 +Kodak,5x5,ldr-rgb-kodak01.png,39.6465,0.0395,0.0190,20.6750 +Kodak,5x5,ldr-rgb-kodak02.png,40.6568,0.0392,0.0180,21.8597 +Kodak,5x5,ldr-rgb-kodak03.png,43.1408,0.0315,0.0120,32.7431 +Kodak,5x5,ldr-rgb-kodak04.png,41.3451,0.0389,0.0165,23.7767 +Kodak,5x5,ldr-rgb-kodak05.png,37.4904,0.0542,0.0323,12.1837 +Kodak,5x5,ldr-rgb-kodak06.png,40.6520,0.0359,0.0153,25.6181 +Kodak,5x5,ldr-rgb-kodak07.png,41.5681,0.0371,0.0158,24.8792 +Kodak,5x5,ldr-rgb-kodak08.png,37.8112,0.0560,0.0327,12.0397 +Kodak,5x5,ldr-rgb-kodak09.png,42.9697,0.0324,0.0111,35.5691 +Kodak,5x5,ldr-rgb-kodak10.png,42.6970,0.0328,0.0111,35.4247 +Kodak,5x5,ldr-rgb-kodak11.png,40.3555,0.0379,0.0175,22.5122 +Kodak,5x5,ldr-rgb-kodak12.png,43.5755,0.0303,0.0101,38.9520 +Kodak,5x5,ldr-rgb-kodak13.png,36.8548,0.0497,0.0280,14.0635 +Kodak,5x5,ldr-rgb-kodak14.png,38.0484,0.0505,0.0290,13.5485 +Kodak,5x5,ldr-rgb-kodak15.png,41.2587,0.0387,0.0172,22.8785 +Kodak,5x5,ldr-rgb-kodak16.png,43.5286,0.0297,0.0094,41.7473 +Kodak,5x5,ldr-rgb-kodak17.png,42.0662,0.0334,0.0106,36.9526 +Kodak,5x5,ldr-rgb-kodak18.png,38.1339,0.0481,0.0248,15.8337 +Kodak,5x5,ldr-rgb-kodak19.png,41.1973,0.0359,0.0135,29.1529 +Kodak,5x5,ldr-rgb-kodak20.png,42.5551,0.0319,0.0119,32.9491 +Kodak,5x5,ldr-rgb-kodak21.png,40.4641,0.0376,0.0163,24.1029 +Kodak,5x5,ldr-rgb-kodak22.png,39.8261,0.0418,0.0196,20.1093 +Kodak,5x5,ldr-rgb-kodak23.png,42.5546,0.0339,0.0129,30.4018 +Kodak,5x5,ldr-rgb-kodak24.png,37.9288,0.0455,0.0229,17.1395 +Kodak,6x6,ldr-rgb-kodak01.png,35.7668,0.0504,0.0283,13.8936 +Kodak,6x6,ldr-rgb-kodak02.png,38.1854,0.0405,0.0191,20.6089 +Kodak,6x6,ldr-rgb-kodak03.png,40.5831,0.0319,0.0122,32.3208 +Kodak,6x6,ldr-rgb-kodak04.png,38.5804,0.0397,0.0172,22.8643 +Kodak,6x6,ldr-rgb-kodak05.png,34.3791,0.0624,0.0400,9.8380 +Kodak,6x6,ldr-rgb-kodak06.png,37.3260,0.0392,0.0188,20.8747 +Kodak,6x6,ldr-rgb-kodak07.png,38.9087,0.0386,0.0171,22.9869 +Kodak,6x6,ldr-rgb-kodak08.png,34.4618,0.0623,0.0394,9.9852 +Kodak,6x6,ldr-rgb-kodak09.png,40.0164,0.0334,0.0127,30.8476 +Kodak,6x6,ldr-rgb-kodak10.png,39.7563,0.0355,0.0126,31.1212 +Kodak,6x6,ldr-rgb-kodak11.png,37.1581,0.0417,0.0206,19.0513 +Kodak,6x6,ldr-rgb-kodak12.png,40.8050,0.0313,0.0107,36.6634 +Kodak,6x6,ldr-rgb-kodak13.png,32.8181,0.0632,0.0410,9.5995 +Kodak,6x6,ldr-rgb-kodak14.png,35.3145,0.0542,0.0338,11.6494 +Kodak,6x6,ldr-rgb-kodak15.png,38.5857,0.0392,0.0181,21.7343 +Kodak,6x6,ldr-rgb-kodak16.png,40.5081,0.0306,0.0108,36.4495 +Kodak,6x6,ldr-rgb-kodak17.png,38.9138,0.0355,0.0129,30.3828 +Kodak,6x6,ldr-rgb-kodak18.png,35.1226,0.0515,0.0282,13.9206 +Kodak,6x6,ldr-rgb-kodak19.png,38.0038,0.0415,0.0184,21.3379 +Kodak,6x6,ldr-rgb-kodak20.png,39.2846,0.0353,0.0143,27.4937 +Kodak,6x6,ldr-rgb-kodak21.png,36.9281,0.0421,0.0213,18.4401 +Kodak,6x6,ldr-rgb-kodak22.png,37.0091,0.0449,0.0221,17.7798 +Kodak,6x6,ldr-rgb-kodak23.png,40.0844,0.0344,0.0127,30.9298 +Kodak,6x6,ldr-rgb-kodak24.png,34.8167,0.0489,0.0258,15.2504 +Kodak,8x8,ldr-rgb-kodak01.png,31.3461,0.0632,0.0420,9.3639 +Kodak,8x8,ldr-rgb-kodak02.png,34.9486,0.0406,0.0188,20.8781 +Kodak,8x8,ldr-rgb-kodak03.png,36.6311,0.0339,0.0140,28.0726 +Kodak,8x8,ldr-rgb-kodak04.png,35.2152,0.0413,0.0186,21.1350 +Kodak,8x8,ldr-rgb-kodak05.png,30.2692,0.0723,0.0507,7.7525 +Kodak,8x8,ldr-rgb-kodak06.png,32.9640,0.0491,0.0287,13.6986 +Kodak,8x8,ldr-rgb-kodak07.png,35.0166,0.0424,0.0212,18.5601 +Kodak,8x8,ldr-rgb-kodak08.png,29.9764,0.0749,0.0520,7.5594 +Kodak,8x8,ldr-rgb-kodak09.png,36.2006,0.0372,0.0157,25.0534 +Kodak,8x8,ldr-rgb-kodak10.png,35.9087,0.0369,0.0144,27.3429 +Kodak,8x8,ldr-rgb-kodak11.png,33.0162,0.0483,0.0265,14.8294 +Kodak,8x8,ldr-rgb-kodak12.png,36.7625,0.0341,0.0135,29.0645 +Kodak,8x8,ldr-rgb-kodak13.png,28.2236,0.0826,0.0609,6.4584 +Kodak,8x8,ldr-rgb-kodak14.png,31.5083,0.0607,0.0399,9.8669 +Kodak,8x8,ldr-rgb-kodak15.png,34.9652,0.0404,0.0188,20.8824 +Kodak,8x8,ldr-rgb-kodak16.png,36.0601,0.0370,0.0172,22.8763 +Kodak,8x8,ldr-rgb-kodak17.png,34.9111,0.0385,0.0167,23.5415 +Kodak,8x8,ldr-rgb-kodak18.png,31.2566,0.0583,0.0352,11.1675 +Kodak,8x8,ldr-rgb-kodak19.png,34.2544,0.0460,0.0234,16.7998 +Kodak,8x8,ldr-rgb-kodak20.png,35.2997,0.0368,0.0168,23.3571 +Kodak,8x8,ldr-rgb-kodak21.png,32.7638,0.0483,0.0281,13.9735 +Kodak,8x8,ldr-rgb-kodak22.png,33.4680,0.0476,0.0250,15.7268 +Kodak,8x8,ldr-rgb-kodak23.png,36.5686,0.0340,0.0131,29.9388 +Kodak,8x8,ldr-rgb-kodak24.png,30.8392,0.0548,0.0320,12.2853 +Kodak,12x12,ldr-rgb-kodak01.png,27.1160,0.0556,0.0331,11.8688 +Kodak,12x12,ldr-rgb-kodak02.png,31.1111,0.0342,0.0104,37.7260 +Kodak,12x12,ldr-rgb-kodak03.png,32.7151,0.0328,0.0091,43.4018 +Kodak,12x12,ldr-rgb-kodak04.png,31.5900,0.0333,0.0086,45.9688 +Kodak,12x12,ldr-rgb-kodak05.png,25.8324,0.0626,0.0379,10.3869 +Kodak,12x12,ldr-rgb-kodak06.png,28.6450,0.0456,0.0232,16.9387 +Kodak,12x12,ldr-rgb-kodak07.png,30.8842,0.0360,0.0124,31.7442 +Kodak,12x12,ldr-rgb-kodak08.png,25.4216,0.0684,0.0434,9.0699 +Kodak,12x12,ldr-rgb-kodak09.png,31.8538,0.0337,0.0105,37.6244 +Kodak,12x12,ldr-rgb-kodak10.png,31.5491,0.0358,0.0100,39.2552 +Kodak,12x12,ldr-rgb-kodak11.png,28.9460,0.0398,0.0174,22.6504 +Kodak,12x12,ldr-rgb-kodak12.png,32.3141,0.0310,0.0088,44.8622 +Kodak,12x12,ldr-rgb-kodak13.png,24.3224,0.0705,0.0467,8.4190 +Kodak,12x12,ldr-rgb-kodak14.png,27.5422,0.0462,0.0242,16.2642 +Kodak,12x12,ldr-rgb-kodak15.png,31.2854,0.0366,0.0130,30.3247 +Kodak,12x12,ldr-rgb-kodak16.png,31.4889,0.0336,0.0111,35.3837 +Kodak,12x12,ldr-rgb-kodak17.png,30.9079,0.0352,0.0108,36.4423 +Kodak,12x12,ldr-rgb-kodak18.png,27.4297,0.0474,0.0229,17.1763 +Kodak,12x12,ldr-rgb-kodak19.png,30.2046,0.0418,0.0174,22.5677 +Kodak,12x12,ldr-rgb-kodak20.png,31.0781,0.0344,0.0125,31.3370 +Kodak,12x12,ldr-rgb-kodak21.png,28.7269,0.0462,0.0226,17.3920 +Kodak,12x12,ldr-rgb-kodak22.png,29.8450,0.0376,0.0133,29.4807 +Kodak,12x12,ldr-rgb-kodak23.png,32.5425,0.0328,0.0093,42.3356 +Kodak,12x12,ldr-rgb-kodak24.png,26.7820,0.0480,0.0235,16.7084 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse2_fastest_results.csv new file mode 100644 index 0000000..525a2dc --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse2_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.6152,0.0348,0.0139,28.3053 +Kodak,4x4,ldr-rgb-kodak02.png,43.9221,0.0404,0.0190,20.7184 +Kodak,4x4,ldr-rgb-kodak03.png,46.2372,0.0306,0.0113,34.8226 +Kodak,4x4,ldr-rgb-kodak04.png,44.3537,0.0384,0.0167,23.4855 +Kodak,4x4,ldr-rgb-kodak05.png,41.1551,0.0449,0.0228,17.2637 +Kodak,4x4,ldr-rgb-kodak06.png,44.5675,0.0346,0.0139,28.2365 +Kodak,4x4,ldr-rgb-kodak07.png,44.7745,0.0354,0.0142,27.6250 +Kodak,4x4,ldr-rgb-kodak08.png,41.6237,0.0455,0.0231,16.9863 +Kodak,4x4,ldr-rgb-kodak09.png,46.1082,0.0328,0.0109,36.0252 +Kodak,4x4,ldr-rgb-kodak10.png,45.8849,0.0332,0.0113,34.7456 +Kodak,4x4,ldr-rgb-kodak11.png,43.9614,0.0364,0.0157,24.9802 +Kodak,4x4,ldr-rgb-kodak12.png,46.7086,0.0301,0.0106,37.1482 +Kodak,4x4,ldr-rgb-kodak13.png,41.2762,0.0432,0.0215,18.3309 +Kodak,4x4,ldr-rgb-kodak14.png,41.3103,0.0395,0.0186,21.0853 +Kodak,4x4,ldr-rgb-kodak15.png,44.2711,0.0390,0.0173,22.7755 +Kodak,4x4,ldr-rgb-kodak16.png,47.2082,0.0293,0.0102,38.3667 +Kodak,4x4,ldr-rgb-kodak17.png,45.6054,0.0326,0.0106,37.2295 +Kodak,4x4,ldr-rgb-kodak18.png,41.3846,0.0453,0.0225,17.4500 +Kodak,4x4,ldr-rgb-kodak19.png,44.6829,0.0361,0.0134,29.4480 +Kodak,4x4,ldr-rgb-kodak20.png,45.9296,0.0306,0.0115,34.1272 +Kodak,4x4,ldr-rgb-kodak21.png,44.3988,0.0351,0.0141,27.9154 +Kodak,4x4,ldr-rgb-kodak22.png,42.9304,0.0414,0.0197,20.0091 +Kodak,4x4,ldr-rgb-kodak23.png,45.4032,0.0345,0.0133,29.6455 +Kodak,4x4,ldr-rgb-kodak24.png,41.4984,0.0408,0.0185,21.2354 +Kodak,5x5,ldr-rgb-kodak01.png,39.4194,0.0363,0.0156,25.2467 +Kodak,5x5,ldr-rgb-kodak02.png,40.4363,0.0361,0.0140,28.1796 +Kodak,5x5,ldr-rgb-kodak03.png,42.7853,0.0297,0.0095,41.3526 +Kodak,5x5,ldr-rgb-kodak04.png,40.9556,0.0347,0.0130,30.2479 +Kodak,5x5,ldr-rgb-kodak05.png,37.1429,0.0448,0.0227,17.3117 +Kodak,5x5,ldr-rgb-kodak06.png,40.4962,0.0328,0.0126,31.1306 +Kodak,5x5,ldr-rgb-kodak07.png,41.2586,0.0336,0.0123,32.0963 +Kodak,5x5,ldr-rgb-kodak08.png,37.4830,0.0469,0.0233,16.8711 +Kodak,5x5,ldr-rgb-kodak09.png,42.6666,0.0303,0.0092,42.6432 +Kodak,5x5,ldr-rgb-kodak10.png,42.5017,0.0312,0.0094,41.8139 +Kodak,5x5,ldr-rgb-kodak11.png,40.1345,0.0345,0.0134,29.4013 +Kodak,5x5,ldr-rgb-kodak12.png,43.3613,0.0288,0.0086,45.8295 +Kodak,5x5,ldr-rgb-kodak13.png,36.7636,0.0440,0.0222,17.6742 +Kodak,5x5,ldr-rgb-kodak14.png,37.6096,0.0393,0.0185,21.2171 +Kodak,5x5,ldr-rgb-kodak15.png,40.9898,0.0339,0.0131,30.0879 +Kodak,5x5,ldr-rgb-kodak16.png,43.4443,0.0286,0.0083,47.5060 +Kodak,5x5,ldr-rgb-kodak17.png,41.9413,0.0312,0.0091,43.0259 +Kodak,5x5,ldr-rgb-kodak18.png,37.9787,0.0414,0.0186,21.0853 +Kodak,5x5,ldr-rgb-kodak19.png,40.9577,0.0337,0.0115,34.2044 +Kodak,5x5,ldr-rgb-kodak20.png,42.2618,0.0291,0.0096,41.0582 +Kodak,5x5,ldr-rgb-kodak21.png,40.2785,0.0338,0.0134,29.3469 +Kodak,5x5,ldr-rgb-kodak22.png,39.5529,0.0378,0.0150,26.2777 +Kodak,5x5,ldr-rgb-kodak23.png,42.2559,0.0318,0.0104,37.6786 +Kodak,5x5,ldr-rgb-kodak24.png,37.7275,0.0384,0.0165,23.7983 +Kodak,6x6,ldr-rgb-kodak01.png,35.6767,0.0434,0.0217,18.1037 +Kodak,6x6,ldr-rgb-kodak02.png,38.0882,0.0354,0.0141,27.9693 +Kodak,6x6,ldr-rgb-kodak03.png,40.4238,0.0295,0.0092,42.6619 +Kodak,6x6,ldr-rgb-kodak04.png,38.3891,0.0350,0.0131,29.9545 +Kodak,6x6,ldr-rgb-kodak05.png,34.1780,0.0481,0.0268,14.6618 +Kodak,6x6,ldr-rgb-kodak06.png,37.2643,0.0346,0.0150,26.1971 +Kodak,6x6,ldr-rgb-kodak07.png,38.7214,0.0340,0.0130,30.2773 +Kodak,6x6,ldr-rgb-kodak08.png,34.2669,0.0507,0.0276,14.2537 +Kodak,6x6,ldr-rgb-kodak09.png,39.8359,0.0322,0.0103,38.0990 +Kodak,6x6,ldr-rgb-kodak10.png,39.6247,0.0319,0.0100,39.3020 +Kodak,6x6,ldr-rgb-kodak11.png,37.0472,0.0359,0.0154,25.5419 +Kodak,6x6,ldr-rgb-kodak12.png,40.6771,0.0287,0.0088,44.7453 +Kodak,6x6,ldr-rgb-kodak13.png,32.7580,0.0519,0.0302,13.0135 +Kodak,6x6,ldr-rgb-kodak14.png,35.0174,0.0413,0.0210,18.7451 +Kodak,6x6,ldr-rgb-kodak15.png,38.4641,0.0345,0.0134,29.3971 +Kodak,6x6,ldr-rgb-kodak16.png,40.4696,0.0291,0.0094,41.9875 +Kodak,6x6,ldr-rgb-kodak17.png,38.8323,0.0320,0.0106,37.0364 +Kodak,6x6,ldr-rgb-kodak18.png,35.0273,0.0438,0.0208,18.9019 +Kodak,6x6,ldr-rgb-kodak19.png,37.8803,0.0369,0.0147,26.7747 +Kodak,6x6,ldr-rgb-kodak20.png,39.1443,0.0308,0.0111,35.2943 +Kodak,6x6,ldr-rgb-kodak21.png,36.8527,0.0370,0.0162,24.3463 +Kodak,6x6,ldr-rgb-kodak22.png,36.9018,0.0380,0.0163,24.0955 +Kodak,6x6,ldr-rgb-kodak23.png,39.9247,0.0313,0.0101,38.9052 +Kodak,6x6,ldr-rgb-kodak24.png,34.7442,0.0405,0.0191,20.5937 +Kodak,8x8,ldr-rgb-kodak01.png,31.2078,0.0525,0.0308,12.7701 +Kodak,8x8,ldr-rgb-kodak02.png,34.8058,0.0366,0.0144,27.3919 +Kodak,8x8,ldr-rgb-kodak03.png,36.5012,0.0320,0.0113,34.8476 +Kodak,8x8,ldr-rgb-kodak04.png,35.1078,0.0374,0.0142,27.6079 +Kodak,8x8,ldr-rgb-kodak05.png,30.0814,0.0601,0.0372,10.5814 +Kodak,8x8,ldr-rgb-kodak06.png,32.8277,0.0423,0.0217,18.1314 +Kodak,8x8,ldr-rgb-kodak07.png,34.8630,0.0374,0.0162,24.3341 +Kodak,8x8,ldr-rgb-kodak08.png,29.7286,0.0618,0.0386,10.1785 +Kodak,8x8,ldr-rgb-kodak09.png,35.9577,0.0345,0.0124,31.7521 +Kodak,8x8,ldr-rgb-kodak10.png,35.7560,0.0348,0.0118,33.3462 +Kodak,8x8,ldr-rgb-kodak11.png,32.8909,0.0409,0.0199,19.7319 +Kodak,8x8,ldr-rgb-kodak12.png,36.5503,0.0314,0.0111,35.2724 +Kodak,8x8,ldr-rgb-kodak13.png,28.1463,0.0668,0.0441,8.9157 +Kodak,8x8,ldr-rgb-kodak14.png,31.3282,0.0492,0.0285,13.8053 +Kodak,8x8,ldr-rgb-kodak15.png,34.7865,0.0362,0.0144,27.3071 +Kodak,8x8,ldr-rgb-kodak16.png,35.9764,0.0338,0.0133,29.5605 +Kodak,8x8,ldr-rgb-kodak17.png,34.7388,0.0355,0.0130,30.2407 +Kodak,8x8,ldr-rgb-kodak18.png,31.1872,0.0492,0.0260,15.1324 +Kodak,8x8,ldr-rgb-kodak19.png,33.9413,0.0407,0.0179,21.9355 +Kodak,8x8,ldr-rgb-kodak20.png,35.1346,0.0333,0.0132,29.9002 +Kodak,8x8,ldr-rgb-kodak21.png,32.6595,0.0430,0.0213,18.4659 +Kodak,8x8,ldr-rgb-kodak22.png,33.3561,0.0411,0.0188,20.9078 +Kodak,8x8,ldr-rgb-kodak23.png,36.4349,0.0323,0.0104,37.8160 +Kodak,8x8,ldr-rgb-kodak24.png,30.7648,0.0467,0.0241,16.2891 +Kodak,12x12,ldr-rgb-kodak01.png,26.9966,0.0465,0.0240,16.3655 +Kodak,12x12,ldr-rgb-kodak02.png,31.0404,0.0312,0.0083,47.2962 +Kodak,12x12,ldr-rgb-kodak03.png,32.6438,0.0290,0.0075,52.3727 +Kodak,12x12,ldr-rgb-kodak04.png,31.4939,0.0303,0.0070,56.3987 +Kodak,12x12,ldr-rgb-kodak05.png,25.7124,0.0503,0.0271,14.5114 +Kodak,12x12,ldr-rgb-kodak06.png,28.4949,0.0399,0.0173,22.7554 +Kodak,12x12,ldr-rgb-kodak07.png,30.8256,0.0331,0.0096,40.8457 +Kodak,12x12,ldr-rgb-kodak08.png,25.2230,0.0567,0.0318,12.3654 +Kodak,12x12,ldr-rgb-kodak09.png,31.6667,0.0315,0.0084,46.9168 +Kodak,12x12,ldr-rgb-kodak10.png,31.4721,0.0317,0.0081,48.6237 +Kodak,12x12,ldr-rgb-kodak11.png,28.8772,0.0361,0.0132,29.7734 +Kodak,12x12,ldr-rgb-kodak12.png,32.2086,0.0294,0.0072,54.8111 +Kodak,12x12,ldr-rgb-kodak13.png,24.2484,0.0578,0.0336,11.7168 +Kodak,12x12,ldr-rgb-kodak14.png,27.4544,0.0401,0.0180,21.8137 +Kodak,12x12,ldr-rgb-kodak15.png,31.1835,0.0336,0.0101,39.0138 +Kodak,12x12,ldr-rgb-kodak16.png,31.3677,0.0310,0.0091,43.0214 +Kodak,12x12,ldr-rgb-kodak17.png,30.8482,0.0331,0.0085,46.1799 +Kodak,12x12,ldr-rgb-kodak18.png,27.3787,0.0419,0.0170,23.1155 +Kodak,12x12,ldr-rgb-kodak19.png,29.8778,0.0374,0.0133,29.4807 +Kodak,12x12,ldr-rgb-kodak20.png,30.9672,0.0314,0.0098,40.1937 +Kodak,12x12,ldr-rgb-kodak21.png,28.6256,0.0392,0.0168,23.4644 +Kodak,12x12,ldr-rgb-kodak22.png,29.7644,0.0343,0.0104,37.8637 +Kodak,12x12,ldr-rgb-kodak23.png,32.4929,0.0299,0.0074,52.7816 +Kodak,12x12,ldr-rgb-kodak24.png,26.7164,0.0415,0.0177,22.2669 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse2_medium_results.csv new file mode 100644 index 0000000..cd2c92b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse2_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.3893,0.1141,0.0928,4.2373 +Kodak,4x4,ldr-rgb-kodak02.png,45.5264,0.1713,0.1499,2.6234 +Kodak,4x4,ldr-rgb-kodak03.png,47.8384,0.0921,0.0727,5.4088 +Kodak,4x4,ldr-rgb-kodak04.png,45.6272,0.1370,0.1151,3.4168 +Kodak,4x4,ldr-rgb-kodak05.png,42.2263,0.1464,0.1261,3.1191 +Kodak,4x4,ldr-rgb-kodak06.png,45.2803,0.1095,0.0890,4.4172 +Kodak,4x4,ldr-rgb-kodak07.png,46.1439,0.1108,0.0891,4.4121 +Kodak,4x4,ldr-rgb-kodak08.png,42.5930,0.1555,0.1322,2.9742 +Kodak,4x4,ldr-rgb-kodak09.png,47.3634,0.1347,0.1132,3.4750 +Kodak,4x4,ldr-rgb-kodak10.png,47.0404,0.1357,0.1140,3.4507 +Kodak,4x4,ldr-rgb-kodak11.png,44.9920,0.1293,0.1092,3.6009 +Kodak,4x4,ldr-rgb-kodak12.png,48.1506,0.1033,0.0836,4.7049 +Kodak,4x4,ldr-rgb-kodak13.png,41.7087,0.1196,0.0975,4.0313 +Kodak,4x4,ldr-rgb-kodak14.png,42.7740,0.1379,0.1171,3.3566 +Kodak,4x4,ldr-rgb-kodak15.png,45.6062,0.1233,0.1019,3.8595 +Kodak,4x4,ldr-rgb-kodak16.png,48.0286,0.1005,0.0806,4.8797 +Kodak,4x4,ldr-rgb-kodak17.png,46.4278,0.1217,0.0999,3.9343 +Kodak,4x4,ldr-rgb-kodak18.png,42.1021,0.1690,0.1461,2.6909 +Kodak,4x4,ldr-rgb-kodak19.png,45.4884,0.1369,0.1148,3.4256 +Kodak,4x4,ldr-rgb-kodak20.png,46.9601,0.0878,0.0687,5.7253 +Kodak,4x4,ldr-rgb-kodak21.png,45.3038,0.1380,0.1174,3.3497 +Kodak,4x4,ldr-rgb-kodak22.png,43.9210,0.1715,0.1494,2.6324 +Kodak,4x4,ldr-rgb-kodak23.png,47.0288,0.1405,0.1195,3.2917 +Kodak,4x4,ldr-rgb-kodak24.png,42.4674,0.1323,0.1101,3.5703 +Kodak,5x5,ldr-rgb-kodak01.png,40.1424,0.1192,0.0982,4.0024 +Kodak,5x5,ldr-rgb-kodak02.png,41.8065,0.1390,0.1174,3.3484 +Kodak,5x5,ldr-rgb-kodak03.png,44.1500,0.0696,0.0499,7.8731 +Kodak,5x5,ldr-rgb-kodak04.png,42.1538,0.1072,0.0855,4.5983 +Kodak,5x5,ldr-rgb-kodak05.png,38.0377,0.1416,0.1197,3.2845 +Kodak,5x5,ldr-rgb-kodak06.png,41.0310,0.0976,0.0773,5.0868 +Kodak,5x5,ldr-rgb-kodak07.png,42.5439,0.0880,0.0672,5.8508 +Kodak,5x5,ldr-rgb-kodak08.png,38.3925,0.1445,0.1217,3.2305 +Kodak,5x5,ldr-rgb-kodak09.png,43.8761,0.0789,0.0577,6.8187 +Kodak,5x5,ldr-rgb-kodak10.png,43.4929,0.0864,0.0647,6.0817 +Kodak,5x5,ldr-rgb-kodak11.png,40.9019,0.1121,0.0917,4.2857 +Kodak,5x5,ldr-rgb-kodak12.png,44.5108,0.0708,0.0510,7.7089 +Kodak,5x5,ldr-rgb-kodak13.png,36.9538,0.1203,0.0989,3.9777 +Kodak,5x5,ldr-rgb-kodak14.png,38.7248,0.1276,0.1071,3.6712 +Kodak,5x5,ldr-rgb-kodak15.png,41.9922,0.1016,0.0802,4.9011 +Kodak,5x5,ldr-rgb-kodak16.png,44.1998,0.0742,0.0546,7.1962 +Kodak,5x5,ldr-rgb-kodak17.png,42.5900,0.0787,0.0570,6.9024 +Kodak,5x5,ldr-rgb-kodak18.png,38.4188,0.1365,0.1136,3.4603 +Kodak,5x5,ldr-rgb-kodak19.png,41.7098,0.0952,0.0730,5.3889 +Kodak,5x5,ldr-rgb-kodak20.png,43.1430,0.0690,0.0497,7.9171 +Kodak,5x5,ldr-rgb-kodak21.png,40.8167,0.0984,0.0778,5.0518 +Kodak,5x5,ldr-rgb-kodak22.png,40.3455,0.1327,0.1106,3.5552 +Kodak,5x5,ldr-rgb-kodak23.png,43.6601,0.0945,0.0736,5.3439 +Kodak,5x5,ldr-rgb-kodak24.png,38.2507,0.1115,0.0897,4.3861 +Kodak,6x6,ldr-rgb-kodak01.png,36.2083,0.1239,0.1033,3.8069 +Kodak,6x6,ldr-rgb-kodak02.png,39.0602,0.1121,0.0907,4.3340 +Kodak,6x6,ldr-rgb-kodak03.png,41.3762,0.0598,0.0401,9.7954 +Kodak,6x6,ldr-rgb-kodak04.png,39.4344,0.0948,0.0734,5.3588 +Kodak,6x6,ldr-rgb-kodak05.png,34.8202,0.1410,0.1188,3.3105 +Kodak,6x6,ldr-rgb-kodak06.png,37.6602,0.0906,0.0703,5.5964 +Kodak,6x6,ldr-rgb-kodak07.png,39.8252,0.0789,0.0577,6.8185 +Kodak,6x6,ldr-rgb-kodak08.png,34.9947,0.1446,0.1220,3.2240 +Kodak,6x6,ldr-rgb-kodak09.png,40.9179,0.0633,0.0422,9.3226 +Kodak,6x6,ldr-rgb-kodak10.png,40.5456,0.0668,0.0453,8.6868 +Kodak,6x6,ldr-rgb-kodak11.png,37.6101,0.0993,0.0789,4.9807 +Kodak,6x6,ldr-rgb-kodak12.png,41.5399,0.0579,0.0383,10.2734 +Kodak,6x6,ldr-rgb-kodak13.png,32.9152,0.1337,0.1118,3.5171 +Kodak,6x6,ldr-rgb-kodak14.png,35.8561,0.1235,0.1037,3.7926 +Kodak,6x6,ldr-rgb-kodak15.png,39.2408,0.0940,0.0728,5.4005 +Kodak,6x6,ldr-rgb-kodak16.png,41.0666,0.0643,0.0444,8.8509 +Kodak,6x6,ldr-rgb-kodak17.png,39.5033,0.0678,0.0458,8.5767 +Kodak,6x6,ldr-rgb-kodak18.png,35.3736,0.1257,0.1028,3.8263 +Kodak,6x6,ldr-rgb-kodak19.png,38.5468,0.0874,0.0652,6.0342 +Kodak,6x6,ldr-rgb-kodak20.png,39.8569,0.0654,0.0462,8.5171 +Kodak,6x6,ldr-rgb-kodak21.png,37.2204,0.0879,0.0675,5.8239 +Kodak,6x6,ldr-rgb-kodak22.png,37.4959,0.1136,0.0926,4.2475 +Kodak,6x6,ldr-rgb-kodak23.png,41.0303,0.0710,0.0504,7.7987 +Kodak,6x6,ldr-rgb-kodak24.png,35.0929,0.1025,0.0808,4.8642 +Kodak,8x8,ldr-rgb-kodak01.png,31.8086,0.1710,0.1505,2.6135 +Kodak,8x8,ldr-rgb-kodak02.png,35.8003,0.1160,0.0938,4.1902 +Kodak,8x8,ldr-rgb-kodak03.png,37.7825,0.0738,0.0536,7.3375 +Kodak,8x8,ldr-rgb-kodak04.png,36.1248,0.1072,0.0845,4.6520 +Kodak,8x8,ldr-rgb-kodak05.png,30.7580,0.1869,0.1646,2.3889 +Kodak,8x8,ldr-rgb-kodak06.png,33.4623,0.1168,0.0959,4.1001 +Kodak,8x8,ldr-rgb-kodak07.png,36.1776,0.0974,0.0756,5.2000 +Kodak,8x8,ldr-rgb-kodak08.png,30.5494,0.1906,0.1673,2.3504 +Kodak,8x8,ldr-rgb-kodak09.png,37.2895,0.0762,0.0540,7.2853 +Kodak,8x8,ldr-rgb-kodak10.png,36.9400,0.0776,0.0552,7.1232 +Kodak,8x8,ldr-rgb-kodak11.png,33.6691,0.1208,0.0993,3.9593 +Kodak,8x8,ldr-rgb-kodak12.png,37.8675,0.0730,0.0524,7.5103 +Kodak,8x8,ldr-rgb-kodak13.png,28.3992,0.1847,0.1621,2.4258 +Kodak,8x8,ldr-rgb-kodak14.png,32.1615,0.1606,0.1384,2.8406 +Kodak,8x8,ldr-rgb-kodak15.png,35.8680,0.0987,0.0765,5.1371 +Kodak,8x8,ldr-rgb-kodak16.png,37.0407,0.0817,0.0614,6.4011 +Kodak,8x8,ldr-rgb-kodak17.png,35.6805,0.0827,0.0601,6.5381 +Kodak,8x8,ldr-rgb-kodak18.png,31.5716,0.1482,0.1249,3.1480 +Kodak,8x8,ldr-rgb-kodak19.png,34.7788,0.1042,0.0817,4.8112 +Kodak,8x8,ldr-rgb-kodak20.png,35.9522,0.0815,0.0615,6.3918 +Kodak,8x8,ldr-rgb-kodak21.png,33.1194,0.1125,0.0912,4.3101 +Kodak,8x8,ldr-rgb-kodak22.png,34.0651,0.1281,0.1054,3.7305 +Kodak,8x8,ldr-rgb-kodak23.png,37.7092,0.0759,0.0541,7.2686 +Kodak,8x8,ldr-rgb-kodak24.png,31.1382,0.1264,0.1036,3.7971 +Kodak,12x12,ldr-rgb-kodak01.png,27.7566,0.1795,0.1563,2.5155 +Kodak,12x12,ldr-rgb-kodak02.png,32.4637,0.0865,0.0626,6.2789 +Kodak,12x12,ldr-rgb-kodak03.png,33.8522,0.0642,0.0420,9.3538 +Kodak,12x12,ldr-rgb-kodak04.png,32.4647,0.0755,0.0514,7.6463 +Kodak,12x12,ldr-rgb-kodak05.png,26.4046,0.1957,0.1717,2.2903 +Kodak,12x12,ldr-rgb-kodak06.png,29.3819,0.1165,0.0940,4.1833 +Kodak,12x12,ldr-rgb-kodak07.png,32.0722,0.0918,0.0680,5.7786 +Kodak,12x12,ldr-rgb-kodak08.png,26.0673,0.2025,0.1773,2.2182 +Kodak,12x12,ldr-rgb-kodak09.png,33.1057,0.0687,0.0447,8.7982 +Kodak,12x12,ldr-rgb-kodak10.png,32.4968,0.0684,0.0443,8.8824 +Kodak,12x12,ldr-rgb-kodak11.png,29.7542,0.1102,0.0873,4.5053 +Kodak,12x12,ldr-rgb-kodak12.png,33.8881,0.0632,0.0412,9.5359 +Kodak,12x12,ldr-rgb-kodak13.png,24.5326,0.2010,0.1765,2.2274 +Kodak,12x12,ldr-rgb-kodak14.png,28.4367,0.1536,0.1307,3.0085 +Kodak,12x12,ldr-rgb-kodak15.png,32.2567,0.0867,0.0629,6.2513 +Kodak,12x12,ldr-rgb-kodak16.png,32.9956,0.0723,0.0503,7.8235 +Kodak,12x12,ldr-rgb-kodak17.png,31.7900,0.0746,0.0503,7.8221 +Kodak,12x12,ldr-rgb-kodak18.png,27.7883,0.1367,0.1119,3.5156 +Kodak,12x12,ldr-rgb-kodak19.png,30.8989,0.0968,0.0728,5.3989 +Kodak,12x12,ldr-rgb-kodak20.png,31.8905,0.0750,0.0530,7.4214 +Kodak,12x12,ldr-rgb-kodak21.png,29.1898,0.1188,0.0961,4.0911 +Kodak,12x12,ldr-rgb-kodak22.png,30.5216,0.1045,0.0800,4.9132 +Kodak,12x12,ldr-rgb-kodak23.png,33.5783,0.0599,0.0366,10.7486 +Kodak,12x12,ldr-rgb-kodak24.png,27.1088,0.1222,0.0978,4.0224 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse2_thorough_results.csv new file mode 100644 index 0000000..d55c773 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse2_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.5922,0.2451,0.2243,1.7529 +Kodak,4x4,ldr-rgb-kodak02.png,45.8030,0.3521,0.3313,1.1869 +Kodak,4x4,ldr-rgb-kodak03.png,48.2411,0.2727,0.2527,1.5558 +Kodak,4x4,ldr-rgb-kodak04.png,45.8220,0.3169,0.2953,1.3314 +Kodak,4x4,ldr-rgb-kodak05.png,42.4990,0.3094,0.2875,1.3679 +Kodak,4x4,ldr-rgb-kodak06.png,45.4845,0.2557,0.2362,1.6648 +Kodak,4x4,ldr-rgb-kodak07.png,46.5232,0.2990,0.2791,1.4091 +Kodak,4x4,ldr-rgb-kodak08.png,42.8951,0.3214,0.2990,1.3149 +Kodak,4x4,ldr-rgb-kodak09.png,47.6380,0.3293,0.3075,1.2790 +Kodak,4x4,ldr-rgb-kodak10.png,47.2861,0.3249,0.3031,1.2972 +Kodak,4x4,ldr-rgb-kodak11.png,45.2527,0.2900,0.2694,1.4599 +Kodak,4x4,ldr-rgb-kodak12.png,48.4695,0.2843,0.2642,1.4884 +Kodak,4x4,ldr-rgb-kodak13.png,41.8177,0.2548,0.2327,1.6896 +Kodak,4x4,ldr-rgb-kodak14.png,43.0359,0.2907,0.2701,1.4560 +Kodak,4x4,ldr-rgb-kodak15.png,45.9001,0.3063,0.2853,1.3784 +Kodak,4x4,ldr-rgb-kodak16.png,48.2454,0.2735,0.2547,1.5440 +Kodak,4x4,ldr-rgb-kodak17.png,46.6018,0.3006,0.2786,1.4115 +Kodak,4x4,ldr-rgb-kodak18.png,42.2703,0.3457,0.3225,1.2192 +Kodak,4x4,ldr-rgb-kodak19.png,45.7040,0.3126,0.2904,1.3540 +Kodak,4x4,ldr-rgb-kodak20.png,47.2393,0.2087,0.1893,2.0768 +Kodak,4x4,ldr-rgb-kodak21.png,45.4554,0.3117,0.2913,1.3497 +Kodak,4x4,ldr-rgb-kodak22.png,44.1133,0.3577,0.3355,1.1721 +Kodak,4x4,ldr-rgb-kodak23.png,47.3572,0.3425,0.3217,1.2224 +Kodak,4x4,ldr-rgb-kodak24.png,42.6967,0.3032,0.2815,1.3969 +Kodak,5x5,ldr-rgb-kodak01.png,40.2586,0.2929,0.2719,1.4462 +Kodak,5x5,ldr-rgb-kodak02.png,42.0904,0.3891,0.3680,1.0686 +Kodak,5x5,ldr-rgb-kodak03.png,44.4615,0.2965,0.2766,1.4215 +Kodak,5x5,ldr-rgb-kodak04.png,42.3443,0.3259,0.3042,1.2928 +Kodak,5x5,ldr-rgb-kodak05.png,38.2346,0.3467,0.3244,1.2120 +Kodak,5x5,ldr-rgb-kodak06.png,41.1418,0.2762,0.2563,1.5345 +Kodak,5x5,ldr-rgb-kodak07.png,42.8229,0.3257,0.3046,1.2910 +Kodak,5x5,ldr-rgb-kodak08.png,38.5696,0.3432,0.3209,1.2253 +Kodak,5x5,ldr-rgb-kodak09.png,44.1115,0.3217,0.3001,1.3104 +Kodak,5x5,ldr-rgb-kodak10.png,43.6829,0.3286,0.3068,1.2817 +Kodak,5x5,ldr-rgb-kodak11.png,41.0699,0.3117,0.2905,1.3534 +Kodak,5x5,ldr-rgb-kodak12.png,44.7095,0.2958,0.2753,1.4284 +Kodak,5x5,ldr-rgb-kodak13.png,37.0063,0.2673,0.2439,1.6119 +Kodak,5x5,ldr-rgb-kodak14.png,38.9442,0.3199,0.2981,1.3189 +Kodak,5x5,ldr-rgb-kodak15.png,42.2117,0.3218,0.3002,1.3099 +Kodak,5x5,ldr-rgb-kodak16.png,44.3482,0.2890,0.2690,1.4618 +Kodak,5x5,ldr-rgb-kodak17.png,42.6961,0.3010,0.2788,1.4102 +Kodak,5x5,ldr-rgb-kodak18.png,38.5147,0.3506,0.3278,1.1996 +Kodak,5x5,ldr-rgb-kodak19.png,41.8527,0.3269,0.3036,1.2951 +Kodak,5x5,ldr-rgb-kodak20.png,43.3624,0.2085,0.1887,2.0836 +Kodak,5x5,ldr-rgb-kodak21.png,40.9291,0.3328,0.3120,1.2604 +Kodak,5x5,ldr-rgb-kodak22.png,40.4963,0.3780,0.3555,1.1061 +Kodak,5x5,ldr-rgb-kodak23.png,43.9946,0.3750,0.3536,1.1121 +Kodak,5x5,ldr-rgb-kodak24.png,38.3784,0.3270,0.3042,1.2927 +Kodak,6x6,ldr-rgb-kodak01.png,36.3246,0.3388,0.3182,1.2356 +Kodak,6x6,ldr-rgb-kodak02.png,39.4302,0.4284,0.4070,0.9662 +Kodak,6x6,ldr-rgb-kodak03.png,41.8065,0.2740,0.2537,1.5501 +Kodak,6x6,ldr-rgb-kodak04.png,39.7049,0.3518,0.3292,1.1944 +Kodak,6x6,ldr-rgb-kodak05.png,35.0174,0.3870,0.3646,1.0783 +Kodak,6x6,ldr-rgb-kodak06.png,37.7802,0.3041,0.2832,1.3884 +Kodak,6x6,ldr-rgb-kodak07.png,40.1739,0.3129,0.2907,1.3529 +Kodak,6x6,ldr-rgb-kodak08.png,35.1895,0.3803,0.3578,1.0989 +Kodak,6x6,ldr-rgb-kodak09.png,41.3054,0.3284,0.3080,1.2768 +Kodak,6x6,ldr-rgb-kodak10.png,40.8835,0.3555,0.3332,1.1800 +Kodak,6x6,ldr-rgb-kodak11.png,37.8029,0.3385,0.3175,1.2385 +Kodak,6x6,ldr-rgb-kodak12.png,41.8909,0.3076,0.2886,1.3626 +Kodak,6x6,ldr-rgb-kodak13.png,32.9679,0.3189,0.2970,1.3238 +Kodak,6x6,ldr-rgb-kodak14.png,36.0646,0.3655,0.3438,1.1437 +Kodak,6x6,ldr-rgb-kodak15.png,39.4965,0.3174,0.2958,1.3295 +Kodak,6x6,ldr-rgb-kodak16.png,41.2648,0.2920,0.2719,1.4460 +Kodak,6x6,ldr-rgb-kodak17.png,39.6991,0.3257,0.3037,1.2947 +Kodak,6x6,ldr-rgb-kodak18.png,35.4614,0.3890,0.3656,1.0754 +Kodak,6x6,ldr-rgb-kodak19.png,38.7373,0.3622,0.3394,1.1585 +Kodak,6x6,ldr-rgb-kodak20.png,40.1617,0.2270,0.2071,1.8990 +Kodak,6x6,ldr-rgb-kodak21.png,37.3694,0.3587,0.3377,1.1644 +Kodak,6x6,ldr-rgb-kodak22.png,37.6663,0.4127,0.3902,1.0078 +Kodak,6x6,ldr-rgb-kodak23.png,41.4926,0.3870,0.3655,1.0760 +Kodak,6x6,ldr-rgb-kodak24.png,35.2089,0.3460,0.3245,1.2118 +Kodak,8x8,ldr-rgb-kodak01.png,31.9145,0.4344,0.4115,0.9555 +Kodak,8x8,ldr-rgb-kodak02.png,36.1779,0.4333,0.4108,0.9572 +Kodak,8x8,ldr-rgb-kodak03.png,38.2215,0.2370,0.2157,1.8228 +Kodak,8x8,ldr-rgb-kodak04.png,36.4120,0.3537,0.3299,1.1918 +Kodak,8x8,ldr-rgb-kodak05.png,30.9292,0.4708,0.4474,0.8790 +Kodak,8x8,ldr-rgb-kodak06.png,33.5936,0.3585,0.3366,1.1683 +Kodak,8x8,ldr-rgb-kodak07.png,36.5361,0.2906,0.2675,1.4697 +Kodak,8x8,ldr-rgb-kodak08.png,30.7430,0.5097,0.4853,0.8102 +Kodak,8x8,ldr-rgb-kodak09.png,37.5825,0.2643,0.2414,1.6287 +Kodak,8x8,ldr-rgb-kodak10.png,37.2612,0.3030,0.2796,1.4063 +Kodak,8x8,ldr-rgb-kodak11.png,33.8424,0.4185,0.3963,0.9921 +Kodak,8x8,ldr-rgb-kodak12.png,38.2926,0.2739,0.2527,1.5562 +Kodak,8x8,ldr-rgb-kodak13.png,28.4632,0.4471,0.4243,0.9268 +Kodak,8x8,ldr-rgb-kodak14.png,32.3344,0.4533,0.4319,0.9105 +Kodak,8x8,ldr-rgb-kodak15.png,36.0889,0.3339,0.3107,1.2657 +Kodak,8x8,ldr-rgb-kodak16.png,37.2793,0.2940,0.2725,1.4431 +Kodak,8x8,ldr-rgb-kodak17.png,35.8741,0.2914,0.2679,1.4676 +Kodak,8x8,ldr-rgb-kodak18.png,31.6653,0.4636,0.4395,0.8948 +Kodak,8x8,ldr-rgb-kodak19.png,34.9446,0.3154,0.2918,1.3475 +Kodak,8x8,ldr-rgb-kodak20.png,36.1894,0.2528,0.2319,1.6957 +Kodak,8x8,ldr-rgb-kodak21.png,33.2320,0.3344,0.3122,1.2595 +Kodak,8x8,ldr-rgb-kodak22.png,34.2464,0.4327,0.4104,0.9582 +Kodak,8x8,ldr-rgb-kodak23.png,38.2357,0.2882,0.2657,1.4798 +Kodak,8x8,ldr-rgb-kodak24.png,31.2478,0.3823,0.3588,1.0958 +Kodak,12x12,ldr-rgb-kodak01.png,27.9181,0.5378,0.5127,0.7670 +Kodak,12x12,ldr-rgb-kodak02.png,33.0108,0.4022,0.3764,1.0446 +Kodak,12x12,ldr-rgb-kodak03.png,34.4642,0.2413,0.2172,1.8100 +Kodak,12x12,ldr-rgb-kodak04.png,32.9804,0.3479,0.3220,1.2210 +Kodak,12x12,ldr-rgb-kodak05.png,26.6113,0.5818,0.5527,0.7114 +Kodak,12x12,ldr-rgb-kodak06.png,29.5414,0.3927,0.3683,1.0677 +Kodak,12x12,ldr-rgb-kodak07.png,32.6520,0.3053,0.2790,1.4091 +Kodak,12x12,ldr-rgb-kodak08.png,26.2681,0.5874,0.5591,0.7033 +Kodak,12x12,ldr-rgb-kodak09.png,33.6376,0.2765,0.2507,1.5687 +Kodak,12x12,ldr-rgb-kodak10.png,32.9960,0.2734,0.2473,1.5898 +Kodak,12x12,ldr-rgb-kodak11.png,30.0542,0.4211,0.3962,0.9926 +Kodak,12x12,ldr-rgb-kodak12.png,34.4647,0.2509,0.2274,1.7292 +Kodak,12x12,ldr-rgb-kodak13.png,24.5895,0.6231,0.5973,0.6583 +Kodak,12x12,ldr-rgb-kodak14.png,28.6563,0.5138,0.4877,0.8062 +Kodak,12x12,ldr-rgb-kodak15.png,32.7482,0.3383,0.3120,1.2603 +Kodak,12x12,ldr-rgb-kodak16.png,33.3438,0.2949,0.2708,1.4519 +Kodak,12x12,ldr-rgb-kodak17.png,32.1376,0.2947,0.2685,1.4647 +Kodak,12x12,ldr-rgb-kodak18.png,27.9291,0.5097,0.4826,0.8148 +Kodak,12x12,ldr-rgb-kodak19.png,31.1197,0.4003,0.3741,1.0512 +Kodak,12x12,ldr-rgb-kodak20.png,32.1844,0.3097,0.2851,1.3793 +Kodak,12x12,ldr-rgb-kodak21.png,29.3333,0.4245,0.3982,0.9875 +Kodak,12x12,ldr-rgb-kodak22.png,30.7935,0.5334,0.5072,0.7753 +Kodak,12x12,ldr-rgb-kodak23.png,34.3801,0.2506,0.2256,1.7432 +Kodak,12x12,ldr-rgb-kodak24.png,27.2441,0.4552,0.4288,0.9170 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse4.1_fast_results.csv new file mode 100644 index 0000000..d74a118 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse4.1_fast_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.9519,0.0391,0.0170,23.0815 +Kodak,4x4,ldr-rgb-kodak02.png,44.3432,0.0494,0.0267,14.7178 +Kodak,4x4,ldr-rgb-kodak03.png,46.8391,0.0344,0.0132,29.7798 +Kodak,4x4,ldr-rgb-kodak04.png,44.7725,0.0465,0.0235,16.7626 +Kodak,4x4,ldr-rgb-kodak05.png,41.6992,0.0599,0.0365,10.7795 +Kodak,4x4,ldr-rgb-kodak06.png,44.8554,0.0390,0.0173,22.6794 +Kodak,4x4,ldr-rgb-kodak07.png,45.2328,0.0428,0.0205,19.2104 +Kodak,4x4,ldr-rgb-kodak08.png,42.1951,0.0609,0.0369,10.6705 +Kodak,4x4,ldr-rgb-kodak09.png,46.4560,0.0357,0.0127,31.0772 +Kodak,4x4,ldr-rgb-kodak10.png,46.2383,0.0364,0.0134,29.2833 +Kodak,4x4,ldr-rgb-kodak11.png,44.3773,0.0438,0.0217,18.1380 +Kodak,4x4,ldr-rgb-kodak12.png,47.2693,0.0338,0.0132,29.7326 +Kodak,4x4,ldr-rgb-kodak13.png,41.5422,0.0522,0.0289,13.5830 +Kodak,4x4,ldr-rgb-kodak14.png,41.9752,0.0534,0.0296,13.2925 +Kodak,4x4,ldr-rgb-kodak15.png,44.7351,0.0487,0.0262,14.9830 +Kodak,4x4,ldr-rgb-kodak16.png,47.3501,0.0305,0.0103,38.0647 +Kodak,4x4,ldr-rgb-kodak17.png,45.8448,0.0359,0.0119,33.0296 +Kodak,4x4,ldr-rgb-kodak18.png,41.7294,0.0584,0.0345,11.4124 +Kodak,4x4,ldr-rgb-kodak19.png,44.9589,0.0410,0.0166,23.6807 +Kodak,4x4,ldr-rgb-kodak20.png,46.4220,0.0340,0.0132,29.7820 +Kodak,4x4,ldr-rgb-kodak21.png,44.7255,0.0389,0.0184,21.3622 +Kodak,4x4,ldr-rgb-kodak22.png,43.3126,0.0521,0.0284,13.8603 +Kodak,4x4,ldr-rgb-kodak23.png,45.7203,0.0395,0.0170,23.1876 +Kodak,4x4,ldr-rgb-kodak24.png,42.0604,0.0507,0.0274,14.3714 +Kodak,5x5,ldr-rgb-kodak01.png,39.6465,0.0385,0.0165,23.8530 +Kodak,5x5,ldr-rgb-kodak02.png,40.6568,0.0386,0.0157,25.0839 +Kodak,5x5,ldr-rgb-kodak03.png,43.1408,0.0307,0.0097,40.3708 +Kodak,5x5,ldr-rgb-kodak04.png,41.3451,0.0397,0.0160,24.5943 +Kodak,5x5,ldr-rgb-kodak05.png,37.4904,0.0510,0.0282,13.9423 +Kodak,5x5,ldr-rgb-kodak06.png,40.6520,0.0347,0.0125,31.5257 +Kodak,5x5,ldr-rgb-kodak07.png,41.5681,0.0359,0.0130,30.1920 +Kodak,5x5,ldr-rgb-kodak08.png,37.8112,0.0550,0.0304,12.9297 +Kodak,5x5,ldr-rgb-kodak09.png,42.9697,0.0325,0.0091,43.4487 +Kodak,5x5,ldr-rgb-kodak10.png,42.6970,0.0319,0.0088,44.7854 +Kodak,5x5,ldr-rgb-kodak11.png,40.3555,0.0382,0.0150,26.2267 +Kodak,5x5,ldr-rgb-kodak12.png,43.5755,0.0293,0.0082,47.7661 +Kodak,5x5,ldr-rgb-kodak13.png,36.8548,0.0477,0.0239,16.4355 +Kodak,5x5,ldr-rgb-kodak14.png,38.0484,0.0488,0.0267,14.7332 +Kodak,5x5,ldr-rgb-kodak15.png,41.2587,0.0377,0.0152,25.8814 +Kodak,5x5,ldr-rgb-kodak16.png,43.5286,0.0293,0.0073,53.8220 +Kodak,5x5,ldr-rgb-kodak17.png,42.0662,0.0332,0.0097,40.6043 +Kodak,5x5,ldr-rgb-kodak18.png,38.1339,0.0458,0.0209,18.8557 +Kodak,5x5,ldr-rgb-kodak19.png,41.1973,0.0358,0.0126,31.0866 +Kodak,5x5,ldr-rgb-kodak20.png,42.5551,0.0302,0.0093,42.1635 +Kodak,5x5,ldr-rgb-kodak21.png,40.4641,0.0379,0.0153,25.6584 +Kodak,5x5,ldr-rgb-kodak22.png,39.8261,0.0396,0.0165,23.7623 +Kodak,5x5,ldr-rgb-kodak23.png,42.5546,0.0333,0.0106,37.1624 +Kodak,5x5,ldr-rgb-kodak24.png,37.9288,0.0449,0.0204,19.2773 +Kodak,6x6,ldr-rgb-kodak01.png,35.7668,0.0483,0.0259,15.1703 +Kodak,6x6,ldr-rgb-kodak02.png,38.1854,0.0407,0.0176,22.3927 +Kodak,6x6,ldr-rgb-kodak03.png,40.5831,0.0309,0.0096,40.7942 +Kodak,6x6,ldr-rgb-kodak04.png,38.5804,0.0372,0.0139,28.2748 +Kodak,6x6,ldr-rgb-kodak05.png,34.3791,0.0553,0.0322,12.1992 +Kodak,6x6,ldr-rgb-kodak06.png,37.3260,0.0377,0.0150,26.2894 +Kodak,6x6,ldr-rgb-kodak07.png,38.9087,0.0367,0.0137,28.7274 +Kodak,6x6,ldr-rgb-kodak08.png,34.4618,0.0561,0.0323,12.1776 +Kodak,6x6,ldr-rgb-kodak09.png,40.0164,0.0334,0.0104,37.9631 +Kodak,6x6,ldr-rgb-kodak10.png,39.7563,0.0334,0.0100,39.2356 +Kodak,6x6,ldr-rgb-kodak11.png,37.1581,0.0393,0.0165,23.7708 +Kodak,6x6,ldr-rgb-kodak12.png,40.8050,0.0301,0.0086,45.5385 +Kodak,6x6,ldr-rgb-kodak13.png,32.8181,0.0567,0.0330,11.9081 +Kodak,6x6,ldr-rgb-kodak14.png,35.3145,0.0497,0.0275,14.2857 +Kodak,6x6,ldr-rgb-kodak15.png,38.5857,0.0373,0.0147,26.7986 +Kodak,6x6,ldr-rgb-kodak16.png,40.5081,0.0298,0.0086,45.7444 +Kodak,6x6,ldr-rgb-kodak17.png,38.9138,0.0338,0.0104,37.9482 +Kodak,6x6,ldr-rgb-kodak18.png,35.1226,0.0464,0.0229,17.1958 +Kodak,6x6,ldr-rgb-kodak19.png,38.0038,0.0373,0.0146,26.9823 +Kodak,6x6,ldr-rgb-kodak20.png,39.2846,0.0322,0.0114,34.5107 +Kodak,6x6,ldr-rgb-kodak21.png,36.9281,0.0387,0.0170,23.1087 +Kodak,6x6,ldr-rgb-kodak22.png,37.0091,0.0409,0.0178,22.1081 +Kodak,6x6,ldr-rgb-kodak23.png,40.0844,0.0328,0.0101,38.7862 +Kodak,6x6,ldr-rgb-kodak24.png,34.8167,0.0438,0.0207,19.0163 +Kodak,8x8,ldr-rgb-kodak01.png,31.3461,0.0564,0.0346,11.3489 +Kodak,8x8,ldr-rgb-kodak02.png,34.9486,0.0380,0.0156,25.1336 +Kodak,8x8,ldr-rgb-kodak03.png,36.6311,0.0340,0.0114,34.5382 +Kodak,8x8,ldr-rgb-kodak04.png,35.2152,0.0389,0.0150,26.1656 +Kodak,8x8,ldr-rgb-kodak05.png,30.2692,0.0653,0.0416,9.4453 +Kodak,8x8,ldr-rgb-kodak06.png,32.9640,0.0446,0.0235,16.7626 +Kodak,8x8,ldr-rgb-kodak07.png,35.0166,0.0401,0.0175,22.5156 +Kodak,8x8,ldr-rgb-kodak08.png,29.9764,0.0677,0.0427,9.2131 +Kodak,8x8,ldr-rgb-kodak09.png,36.2006,0.0352,0.0126,31.1482 +Kodak,8x8,ldr-rgb-kodak10.png,35.9087,0.0355,0.0118,33.3799 +Kodak,8x8,ldr-rgb-kodak11.png,33.0162,0.0441,0.0217,18.1380 +Kodak,8x8,ldr-rgb-kodak12.png,36.7625,0.0324,0.0111,35.4857 +Kodak,8x8,ldr-rgb-kodak13.png,28.2236,0.0734,0.0501,7.8467 +Kodak,8x8,ldr-rgb-kodak14.png,31.5083,0.0549,0.0329,11.9471 +Kodak,8x8,ldr-rgb-kodak15.png,34.9652,0.0378,0.0155,25.3851 +Kodak,8x8,ldr-rgb-kodak16.png,36.0601,0.0349,0.0140,28.1455 +Kodak,8x8,ldr-rgb-kodak17.png,34.9111,0.0371,0.0139,28.3584 +Kodak,8x8,ldr-rgb-kodak18.png,31.2566,0.0537,0.0290,13.5628 +Kodak,8x8,ldr-rgb-kodak19.png,34.2544,0.0432,0.0190,20.6748 +Kodak,8x8,ldr-rgb-kodak20.png,35.2997,0.0356,0.0138,28.4136 +Kodak,8x8,ldr-rgb-kodak21.png,32.7638,0.0452,0.0230,17.1136 +Kodak,8x8,ldr-rgb-kodak22.png,33.4680,0.0442,0.0206,19.0826 +Kodak,8x8,ldr-rgb-kodak23.png,36.5686,0.0334,0.0109,36.2349 +Kodak,8x8,ldr-rgb-kodak24.png,30.8392,0.0499,0.0265,14.8490 +Kodak,12x12,ldr-rgb-kodak01.png,27.1160,0.0523,0.0285,13.8034 +Kodak,12x12,ldr-rgb-kodak02.png,31.1111,0.0324,0.0086,45.6330 +Kodak,12x12,ldr-rgb-kodak03.png,32.7151,0.0318,0.0076,51.7336 +Kodak,12x12,ldr-rgb-kodak04.png,31.5900,0.0324,0.0070,56.5127 +Kodak,12x12,ldr-rgb-kodak05.png,25.8324,0.0577,0.0322,12.1958 +Kodak,12x12,ldr-rgb-kodak06.png,28.6450,0.0428,0.0199,19.7548 +Kodak,12x12,ldr-rgb-kodak07.png,30.8842,0.0354,0.0103,38.1245 +Kodak,12x12,ldr-rgb-kodak08.png,25.4216,0.0643,0.0375,10.4785 +Kodak,12x12,ldr-rgb-kodak09.png,31.8538,0.0338,0.0088,44.8414 +Kodak,12x12,ldr-rgb-kodak10.png,31.5491,0.0342,0.0083,47.5471 +Kodak,12x12,ldr-rgb-kodak11.png,28.9460,0.0399,0.0147,26.6626 +Kodak,12x12,ldr-rgb-kodak12.png,32.3141,0.0314,0.0071,55.2111 +Kodak,12x12,ldr-rgb-kodak13.png,24.3224,0.0649,0.0402,9.7771 +Kodak,12x12,ldr-rgb-kodak14.png,27.5422,0.0442,0.0210,18.7673 +Kodak,12x12,ldr-rgb-kodak15.png,31.2854,0.0348,0.0109,36.1349 +Kodak,12x12,ldr-rgb-kodak16.png,31.4889,0.0334,0.0093,42.1861 +Kodak,12x12,ldr-rgb-kodak17.png,30.9079,0.0345,0.0093,42.3628 +Kodak,12x12,ldr-rgb-kodak18.png,27.4297,0.0467,0.0200,19.6255 +Kodak,12x12,ldr-rgb-kodak19.png,30.2046,0.0402,0.0146,26.8409 +Kodak,12x12,ldr-rgb-kodak20.png,31.0781,0.0342,0.0106,37.2329 +Kodak,12x12,ldr-rgb-kodak21.png,28.7269,0.0435,0.0193,20.3274 +Kodak,12x12,ldr-rgb-kodak22.png,29.8450,0.0375,0.0112,35.0930 +Kodak,12x12,ldr-rgb-kodak23.png,32.5425,0.0319,0.0076,51.9095 +Kodak,12x12,ldr-rgb-kodak24.png,26.7820,0.0462,0.0201,19.5309 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse4.1_fastest_results.csv new file mode 100644 index 0000000..6c87efd --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse4.1_fastest_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,44.6152,0.0338,0.0118,33.2500 +Kodak,4x4,ldr-rgb-kodak02.png,43.9221,0.0387,0.0161,24.4220 +Kodak,4x4,ldr-rgb-kodak03.png,46.2372,0.0304,0.0087,44.9759 +Kodak,4x4,ldr-rgb-kodak04.png,44.3537,0.0389,0.0144,27.3524 +Kodak,4x4,ldr-rgb-kodak05.png,41.1551,0.0439,0.0208,18.8917 +Kodak,4x4,ldr-rgb-kodak06.png,44.5675,0.0344,0.0120,32.6866 +Kodak,4x4,ldr-rgb-kodak07.png,44.7745,0.0350,0.0123,31.8964 +Kodak,4x4,ldr-rgb-kodak08.png,41.6237,0.0455,0.0209,18.7961 +Kodak,4x4,ldr-rgb-kodak09.png,46.1082,0.0317,0.0085,46.2006 +Kodak,4x4,ldr-rgb-kodak10.png,45.8849,0.0332,0.0105,37.6107 +Kodak,4x4,ldr-rgb-kodak11.png,43.9614,0.0353,0.0135,29.0257 +Kodak,4x4,ldr-rgb-kodak12.png,46.7086,0.0304,0.0084,46.7175 +Kodak,4x4,ldr-rgb-kodak13.png,41.2762,0.0422,0.0190,20.6543 +Kodak,4x4,ldr-rgb-kodak14.png,41.3103,0.0384,0.0162,24.2743 +Kodak,4x4,ldr-rgb-kodak15.png,44.2711,0.0390,0.0165,23.8299 +Kodak,4x4,ldr-rgb-kodak16.png,47.2082,0.0292,0.0082,48.1946 +Kodak,4x4,ldr-rgb-kodak17.png,45.6054,0.0320,0.0083,47.6336 +Kodak,4x4,ldr-rgb-kodak18.png,41.3846,0.0463,0.0216,18.1850 +Kodak,4x4,ldr-rgb-kodak19.png,44.6829,0.0351,0.0115,34.2612 +Kodak,4x4,ldr-rgb-kodak20.png,45.9296,0.0302,0.0092,42.8715 +Kodak,4x4,ldr-rgb-kodak21.png,44.3988,0.0353,0.0134,29.3511 +Kodak,4x4,ldr-rgb-kodak22.png,42.9304,0.0412,0.0175,22.4143 +Kodak,4x4,ldr-rgb-kodak23.png,45.4032,0.0345,0.0122,32.2488 +Kodak,4x4,ldr-rgb-kodak24.png,41.4984,0.0396,0.0161,24.4982 +Kodak,5x5,ldr-rgb-kodak01.png,39.4194,0.0357,0.0137,28.7710 +Kodak,5x5,ldr-rgb-kodak02.png,40.4363,0.0353,0.0130,30.1478 +Kodak,5x5,ldr-rgb-kodak03.png,42.7853,0.0287,0.0076,51.5638 +Kodak,5x5,ldr-rgb-kodak04.png,40.9556,0.0355,0.0106,36.9633 +Kodak,5x5,ldr-rgb-kodak05.png,37.1429,0.0434,0.0201,19.5473 +Kodak,5x5,ldr-rgb-kodak06.png,40.4962,0.0321,0.0103,38.1952 +Kodak,5x5,ldr-rgb-kodak07.png,41.2586,0.0332,0.0099,39.6783 +Kodak,5x5,ldr-rgb-kodak08.png,37.4830,0.0447,0.0204,19.2310 +Kodak,5x5,ldr-rgb-kodak09.png,42.6666,0.0303,0.0072,54.7184 +Kodak,5x5,ldr-rgb-kodak10.png,42.5017,0.0301,0.0074,52.9579 +Kodak,5x5,ldr-rgb-kodak11.png,40.1345,0.0344,0.0109,35.9498 +Kodak,5x5,ldr-rgb-kodak12.png,43.3613,0.0294,0.0073,53.7098 +Kodak,5x5,ldr-rgb-kodak13.png,36.7636,0.0433,0.0197,19.9672 +Kodak,5x5,ldr-rgb-kodak14.png,37.6096,0.0389,0.0168,23.3640 +Kodak,5x5,ldr-rgb-kodak15.png,40.9898,0.0346,0.0123,31.8447 +Kodak,5x5,ldr-rgb-kodak16.png,43.4443,0.0276,0.0066,59.2027 +Kodak,5x5,ldr-rgb-kodak17.png,41.9413,0.0308,0.0075,52.6116 +Kodak,5x5,ldr-rgb-kodak18.png,37.9787,0.0415,0.0177,22.2204 +Kodak,5x5,ldr-rgb-kodak19.png,40.9577,0.0340,0.0110,35.8934 +Kodak,5x5,ldr-rgb-kodak20.png,42.2618,0.0294,0.0082,47.6736 +Kodak,5x5,ldr-rgb-kodak21.png,40.2785,0.0339,0.0107,36.6431 +Kodak,5x5,ldr-rgb-kodak22.png,39.5529,0.0371,0.0132,29.8165 +Kodak,5x5,ldr-rgb-kodak23.png,42.2559,0.0315,0.0086,45.6810 +Kodak,5x5,ldr-rgb-kodak24.png,37.7275,0.0384,0.0147,26.7239 +Kodak,6x6,ldr-rgb-kodak01.png,35.6767,0.0420,0.0194,20.3202 +Kodak,6x6,ldr-rgb-kodak02.png,38.0882,0.0358,0.0132,29.8634 +Kodak,6x6,ldr-rgb-kodak03.png,40.4238,0.0298,0.0077,51.2338 +Kodak,6x6,ldr-rgb-kodak04.png,38.3891,0.0347,0.0108,36.2548 +Kodak,6x6,ldr-rgb-kodak05.png,34.1780,0.0480,0.0243,16.1931 +Kodak,6x6,ldr-rgb-kodak06.png,37.2643,0.0345,0.0127,30.9327 +Kodak,6x6,ldr-rgb-kodak07.png,38.7214,0.0343,0.0111,35.4475 +Kodak,6x6,ldr-rgb-kodak08.png,34.2669,0.0467,0.0228,17.2796 +Kodak,6x6,ldr-rgb-kodak09.png,39.8359,0.0325,0.0086,45.4694 +Kodak,6x6,ldr-rgb-kodak10.png,39.6247,0.0324,0.0088,44.5676 +Kodak,6x6,ldr-rgb-kodak11.png,37.0472,0.0355,0.0135,29.1488 +Kodak,6x6,ldr-rgb-kodak12.png,40.6771,0.0300,0.0070,56.1988 +Kodak,6x6,ldr-rgb-kodak13.png,32.7580,0.0527,0.0289,13.6188 +Kodak,6x6,ldr-rgb-kodak14.png,35.0174,0.0426,0.0201,19.5787 +Kodak,6x6,ldr-rgb-kodak15.png,38.4641,0.0373,0.0139,28.2341 +Kodak,6x6,ldr-rgb-kodak16.png,40.4696,0.0298,0.0081,48.7315 +Kodak,6x6,ldr-rgb-kodak17.png,38.8323,0.0331,0.0097,40.5914 +Kodak,6x6,ldr-rgb-kodak18.png,35.0273,0.0453,0.0213,18.5026 +Kodak,6x6,ldr-rgb-kodak19.png,37.8803,0.0387,0.0151,26.1047 +Kodak,6x6,ldr-rgb-kodak20.png,39.1443,0.0320,0.0108,36.2979 +Kodak,6x6,ldr-rgb-kodak21.png,36.8527,0.0395,0.0173,22.7451 +Kodak,6x6,ldr-rgb-kodak22.png,36.9018,0.0389,0.0151,26.0948 +Kodak,6x6,ldr-rgb-kodak23.png,39.9247,0.0330,0.0098,40.0055 +Kodak,6x6,ldr-rgb-kodak24.png,34.7442,0.0418,0.0187,20.9972 +Kodak,8x8,ldr-rgb-kodak01.png,31.2078,0.0569,0.0340,11.5492 +Kodak,8x8,ldr-rgb-kodak02.png,34.8058,0.0393,0.0156,25.1401 +Kodak,8x8,ldr-rgb-kodak03.png,36.5012,0.0342,0.0112,35.0766 +Kodak,8x8,ldr-rgb-kodak04.png,35.1078,0.0391,0.0148,26.6518 +Kodak,8x8,ldr-rgb-kodak05.png,30.0814,0.0640,0.0405,9.7145 +Kodak,8x8,ldr-rgb-kodak06.png,32.8277,0.0443,0.0221,17.8128 +Kodak,8x8,ldr-rgb-kodak07.png,34.8630,0.0386,0.0155,25.3870 +Kodak,8x8,ldr-rgb-kodak08.png,29.7286,0.0682,0.0429,9.1620 +Kodak,8x8,ldr-rgb-kodak09.png,35.9577,0.0354,0.0117,33.5879 +Kodak,8x8,ldr-rgb-kodak10.png,35.7560,0.0340,0.0101,38.9015 +Kodak,8x8,ldr-rgb-kodak11.png,32.8909,0.0428,0.0207,18.9711 +Kodak,8x8,ldr-rgb-kodak12.png,36.5503,0.0323,0.0103,38.3328 +Kodak,8x8,ldr-rgb-kodak13.png,28.1463,0.0719,0.0479,8.2060 +Kodak,8x8,ldr-rgb-kodak14.png,31.3282,0.0520,0.0289,13.6047 +Kodak,8x8,ldr-rgb-kodak15.png,34.7865,0.0364,0.0126,31.3269 +Kodak,8x8,ldr-rgb-kodak16.png,35.9764,0.0361,0.0146,27.0195 +Kodak,8x8,ldr-rgb-kodak17.png,34.7388,0.0361,0.0121,32.3875 +Kodak,8x8,ldr-rgb-kodak18.png,31.1872,0.0517,0.0266,14.7847 +Kodak,8x8,ldr-rgb-kodak19.png,33.9413,0.0429,0.0191,20.5644 +Kodak,8x8,ldr-rgb-kodak20.png,35.1346,0.0342,0.0131,30.0764 +Kodak,8x8,ldr-rgb-kodak21.png,32.6595,0.0441,0.0222,17.7173 +Kodak,8x8,ldr-rgb-kodak22.png,33.3561,0.0431,0.0188,20.8768 +Kodak,8x8,ldr-rgb-kodak23.png,36.4349,0.0314,0.0086,45.8028 +Kodak,8x8,ldr-rgb-kodak24.png,30.7648,0.0471,0.0229,17.1568 +Kodak,12x12,ldr-rgb-kodak01.png,26.9966,0.0586,0.0330,11.9170 +Kodak,12x12,ldr-rgb-kodak02.png,31.0404,0.0313,0.0070,56.4876 +Kodak,12x12,ldr-rgb-kodak03.png,32.6438,0.0287,0.0063,62.4557 +Kodak,12x12,ldr-rgb-kodak04.png,31.4939,0.0302,0.0059,66.7936 +Kodak,12x12,ldr-rgb-kodak05.png,25.7124,0.0553,0.0299,13.1612 +Kodak,12x12,ldr-rgb-kodak06.png,28.4949,0.0426,0.0198,19.8513 +Kodak,12x12,ldr-rgb-kodak07.png,30.8256,0.0337,0.0092,42.8203 +Kodak,12x12,ldr-rgb-kodak08.png,25.2230,0.0590,0.0328,11.9773 +Kodak,12x12,ldr-rgb-kodak09.png,31.6667,0.0310,0.0071,55.0637 +Kodak,12x12,ldr-rgb-kodak10.png,31.4721,0.0311,0.0067,59.0141 +Kodak,12x12,ldr-rgb-kodak11.png,28.8772,0.0370,0.0139,28.3891 +Kodak,12x12,ldr-rgb-kodak12.png,32.2086,0.0295,0.0064,61.1996 +Kodak,12x12,ldr-rgb-kodak13.png,24.2484,0.0663,0.0414,9.4879 +Kodak,12x12,ldr-rgb-kodak14.png,27.4544,0.0429,0.0190,20.7174 +Kodak,12x12,ldr-rgb-kodak15.png,31.1835,0.0335,0.0097,40.4659 +Kodak,12x12,ldr-rgb-kodak16.png,31.3677,0.0305,0.0082,47.7274 +Kodak,12x12,ldr-rgb-kodak17.png,30.8482,0.0315,0.0074,53.1747 +Kodak,12x12,ldr-rgb-kodak18.png,27.3787,0.0445,0.0192,20.4472 +Kodak,12x12,ldr-rgb-kodak19.png,29.8778,0.0384,0.0136,28.9087 +Kodak,12x12,ldr-rgb-kodak20.png,30.9672,0.0313,0.0093,42.4140 +Kodak,12x12,ldr-rgb-kodak21.png,28.6256,0.0400,0.0172,22.8361 +Kodak,12x12,ldr-rgb-kodak22.png,29.7644,0.0345,0.0101,38.7944 +Kodak,12x12,ldr-rgb-kodak23.png,32.4929,0.0307,0.0064,61.7773 +Kodak,12x12,ldr-rgb-kodak24.png,26.7164,0.0421,0.0176,22.2823 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse4.1_medium_results.csv new file mode 100644 index 0000000..c452b4f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse4.1_medium_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.3893,0.0990,0.0769,5.1120 +Kodak,4x4,ldr-rgb-kodak02.png,45.5264,0.1450,0.1240,3.1713 +Kodak,4x4,ldr-rgb-kodak03.png,47.8384,0.0807,0.0597,6.5886 +Kodak,4x4,ldr-rgb-kodak04.png,45.6272,0.1178,0.0949,4.1448 +Kodak,4x4,ldr-rgb-kodak05.png,42.2263,0.1273,0.1042,3.7740 +Kodak,4x4,ldr-rgb-kodak06.png,45.2803,0.0953,0.0735,5.3507 +Kodak,4x4,ldr-rgb-kodak07.png,46.1439,0.0954,0.0733,5.3674 +Kodak,4x4,ldr-rgb-kodak08.png,42.5930,0.1344,0.1102,3.5687 +Kodak,4x4,ldr-rgb-kodak09.png,47.3634,0.1156,0.0933,4.2160 +Kodak,4x4,ldr-rgb-kodak10.png,47.0404,0.1167,0.0938,4.1918 +Kodak,4x4,ldr-rgb-kodak11.png,44.9920,0.1111,0.0903,4.3545 +Kodak,4x4,ldr-rgb-kodak12.png,48.1506,0.0898,0.0687,5.7207 +Kodak,4x4,ldr-rgb-kodak13.png,41.7087,0.1046,0.0813,4.8376 +Kodak,4x4,ldr-rgb-kodak14.png,42.7740,0.1193,0.0974,4.0387 +Kodak,4x4,ldr-rgb-kodak15.png,45.6062,0.1059,0.0835,4.7097 +Kodak,4x4,ldr-rgb-kodak16.png,48.0286,0.0876,0.0666,5.9072 +Kodak,4x4,ldr-rgb-kodak17.png,46.4278,0.1047,0.0821,4.7907 +Kodak,4x4,ldr-rgb-kodak18.png,42.1021,0.1470,0.1226,3.2074 +Kodak,4x4,ldr-rgb-kodak19.png,45.4884,0.1183,0.0951,4.1366 +Kodak,4x4,ldr-rgb-kodak20.png,46.9601,0.0780,0.0572,6.8803 +Kodak,4x4,ldr-rgb-kodak21.png,45.3038,0.1190,0.0972,4.0469 +Kodak,4x4,ldr-rgb-kodak22.png,43.9210,0.1473,0.1242,3.1669 +Kodak,4x4,ldr-rgb-kodak23.png,47.0288,0.1209,0.0989,3.9762 +Kodak,4x4,ldr-rgb-kodak24.png,42.4674,0.1147,0.0915,4.2972 +Kodak,5x5,ldr-rgb-kodak01.png,40.1424,0.1003,0.0787,4.9956 +Kodak,5x5,ldr-rgb-kodak02.png,41.8065,0.1169,0.0945,4.1602 +Kodak,5x5,ldr-rgb-kodak03.png,44.1500,0.0608,0.0400,9.8343 +Kodak,5x5,ldr-rgb-kodak04.png,42.1538,0.0914,0.0688,5.7172 +Kodak,5x5,ldr-rgb-kodak05.png,38.0377,0.1189,0.0961,4.0899 +Kodak,5x5,ldr-rgb-kodak06.png,41.0310,0.0831,0.0618,6.3604 +Kodak,5x5,ldr-rgb-kodak07.png,42.5439,0.0762,0.0540,7.2789 +Kodak,5x5,ldr-rgb-kodak08.png,38.3925,0.1221,0.0981,4.0083 +Kodak,5x5,ldr-rgb-kodak09.png,43.8761,0.0682,0.0457,8.6126 +Kodak,5x5,ldr-rgb-kodak10.png,43.4929,0.0748,0.0520,7.5660 +Kodak,5x5,ldr-rgb-kodak11.png,40.9019,0.0957,0.0741,5.3048 +Kodak,5x5,ldr-rgb-kodak12.png,44.5108,0.0612,0.0405,9.7088 +Kodak,5x5,ldr-rgb-kodak13.png,36.9538,0.1023,0.0794,4.9552 +Kodak,5x5,ldr-rgb-kodak14.png,38.7248,0.1082,0.0858,4.5811 +Kodak,5x5,ldr-rgb-kodak15.png,41.9922,0.0867,0.0643,6.1122 +Kodak,5x5,ldr-rgb-kodak16.png,44.1998,0.0642,0.0435,9.0324 +Kodak,5x5,ldr-rgb-kodak17.png,42.5900,0.0681,0.0455,8.6359 +Kodak,5x5,ldr-rgb-kodak18.png,38.4188,0.1155,0.0919,4.2786 +Kodak,5x5,ldr-rgb-kodak19.png,41.7098,0.0812,0.0584,6.7305 +Kodak,5x5,ldr-rgb-kodak20.png,43.1430,0.0601,0.0398,9.8718 +Kodak,5x5,ldr-rgb-kodak21.png,40.8167,0.0853,0.0637,6.1738 +Kodak,5x5,ldr-rgb-kodak22.png,40.3455,0.1121,0.0888,4.4259 +Kodak,5x5,ldr-rgb-kodak23.png,43.6601,0.0816,0.0591,6.6527 +Kodak,5x5,ldr-rgb-kodak24.png,38.2507,0.0953,0.0722,5.4432 +Kodak,6x6,ldr-rgb-kodak01.png,36.2083,0.1070,0.0845,4.6533 +Kodak,6x6,ldr-rgb-kodak02.png,39.0602,0.0954,0.0733,5.3680 +Kodak,6x6,ldr-rgb-kodak03.png,41.3762,0.0532,0.0322,12.2019 +Kodak,6x6,ldr-rgb-kodak04.png,39.4344,0.0828,0.0598,6.5716 +Kodak,6x6,ldr-rgb-kodak05.png,34.8202,0.1195,0.0968,4.0618 +Kodak,6x6,ldr-rgb-kodak06.png,37.6602,0.0778,0.0561,7.0064 +Kodak,6x6,ldr-rgb-kodak07.png,39.8252,0.0684,0.0464,8.4787 +Kodak,6x6,ldr-rgb-kodak08.png,34.9947,0.1231,0.0992,3.9640 +Kodak,6x6,ldr-rgb-kodak09.png,40.9179,0.0563,0.0338,11.6357 +Kodak,6x6,ldr-rgb-kodak10.png,40.5456,0.0585,0.0361,10.8912 +Kodak,6x6,ldr-rgb-kodak11.png,37.6101,0.0845,0.0632,6.2261 +Kodak,6x6,ldr-rgb-kodak12.png,41.5399,0.0514,0.0305,12.8944 +Kodak,6x6,ldr-rgb-kodak13.png,32.9152,0.1137,0.0905,4.3453 +Kodak,6x6,ldr-rgb-kodak14.png,35.8561,0.1055,0.0833,4.7225 +Kodak,6x6,ldr-rgb-kodak15.png,39.2408,0.0808,0.0588,6.6853 +Kodak,6x6,ldr-rgb-kodak16.png,41.0666,0.0563,0.0354,11.1125 +Kodak,6x6,ldr-rgb-kodak17.png,39.5033,0.0592,0.0366,10.7542 +Kodak,6x6,ldr-rgb-kodak18.png,35.3736,0.1073,0.0834,4.7161 +Kodak,6x6,ldr-rgb-kodak19.png,38.5468,0.0756,0.0525,7.4902 +Kodak,6x6,ldr-rgb-kodak20.png,39.8569,0.0579,0.0371,10.6017 +Kodak,6x6,ldr-rgb-kodak21.png,37.2204,0.0754,0.0541,7.2628 +Kodak,6x6,ldr-rgb-kodak22.png,37.4959,0.0979,0.0747,5.2664 +Kodak,6x6,ldr-rgb-kodak23.png,41.0303,0.0624,0.0406,9.6830 +Kodak,6x6,ldr-rgb-kodak24.png,35.0929,0.0875,0.0647,6.0748 +Kodak,8x8,ldr-rgb-kodak01.png,31.8086,0.1467,0.1238,3.1771 +Kodak,8x8,ldr-rgb-kodak02.png,35.8003,0.1004,0.0774,5.0794 +Kodak,8x8,ldr-rgb-kodak03.png,37.7825,0.0655,0.0441,8.9090 +Kodak,8x8,ldr-rgb-kodak04.png,36.1248,0.0934,0.0703,5.5897 +Kodak,8x8,ldr-rgb-kodak05.png,30.7580,0.1595,0.1355,2.9018 +Kodak,8x8,ldr-rgb-kodak06.png,33.4623,0.1005,0.0786,5.0040 +Kodak,8x8,ldr-rgb-kodak07.png,36.1776,0.0849,0.0622,6.3224 +Kodak,8x8,ldr-rgb-kodak08.png,30.5494,0.1625,0.1377,2.8551 +Kodak,8x8,ldr-rgb-kodak09.png,37.2895,0.0675,0.0441,8.9098 +Kodak,8x8,ldr-rgb-kodak10.png,36.9400,0.0683,0.0450,8.7395 +Kodak,8x8,ldr-rgb-kodak11.png,33.6691,0.1037,0.0815,4.8276 +Kodak,8x8,ldr-rgb-kodak12.png,37.8675,0.0643,0.0426,9.2250 +Kodak,8x8,ldr-rgb-kodak13.png,28.3992,0.1574,0.1338,2.9397 +Kodak,8x8,ldr-rgb-kodak14.png,32.1615,0.1371,0.1145,3.4353 +Kodak,8x8,ldr-rgb-kodak15.png,35.8680,0.0866,0.0632,6.2233 +Kodak,8x8,ldr-rgb-kodak16.png,37.0407,0.0721,0.0502,7.8386 +Kodak,8x8,ldr-rgb-kodak17.png,35.6805,0.0730,0.0495,7.9405 +Kodak,8x8,ldr-rgb-kodak18.png,31.5716,0.1275,0.1032,3.8096 +Kodak,8x8,ldr-rgb-kodak19.png,34.7788,0.0916,0.0678,5.7957 +Kodak,8x8,ldr-rgb-kodak20.png,35.9522,0.0716,0.0504,7.7985 +Kodak,8x8,ldr-rgb-kodak21.png,33.1194,0.0974,0.0752,5.2315 +Kodak,8x8,ldr-rgb-kodak22.png,34.0651,0.1100,0.0867,4.5378 +Kodak,8x8,ldr-rgb-kodak23.png,37.7092,0.0674,0.0447,8.8011 +Kodak,8x8,ldr-rgb-kodak24.png,31.1382,0.1081,0.0849,4.6297 +Kodak,12x12,ldr-rgb-kodak01.png,27.7566,0.1595,0.1371,2.8680 +Kodak,12x12,ldr-rgb-kodak02.png,32.4637,0.0791,0.0544,7.2277 +Kodak,12x12,ldr-rgb-kodak03.png,33.8522,0.0601,0.0365,10.7745 +Kodak,12x12,ldr-rgb-kodak04.png,32.4647,0.0701,0.0449,8.7607 +Kodak,12x12,ldr-rgb-kodak05.png,26.4046,0.1758,0.1508,2.6075 +Kodak,12x12,ldr-rgb-kodak06.png,29.3819,0.1054,0.0819,4.8015 +Kodak,12x12,ldr-rgb-kodak07.png,32.0722,0.0832,0.0590,6.6610 +Kodak,12x12,ldr-rgb-kodak08.png,26.0673,0.1816,0.1552,2.5337 +Kodak,12x12,ldr-rgb-kodak09.png,33.1057,0.0633,0.0389,10.1198 +Kodak,12x12,ldr-rgb-kodak10.png,32.4968,0.0636,0.0385,10.2203 +Kodak,12x12,ldr-rgb-kodak11.png,29.7542,0.0996,0.0760,5.1731 +Kodak,12x12,ldr-rgb-kodak12.png,33.8881,0.0587,0.0359,10.9589 +Kodak,12x12,ldr-rgb-kodak13.png,24.5326,0.1812,0.1558,2.5240 +Kodak,12x12,ldr-rgb-kodak14.png,28.4367,0.1385,0.1139,3.4521 +Kodak,12x12,ldr-rgb-kodak15.png,32.2567,0.0786,0.0540,7.2865 +Kodak,12x12,ldr-rgb-kodak16.png,32.9956,0.0664,0.0434,9.0701 +Kodak,12x12,ldr-rgb-kodak17.png,31.7900,0.0687,0.0435,9.0334 +Kodak,12x12,ldr-rgb-kodak18.png,27.7883,0.1240,0.0982,4.0058 +Kodak,12x12,ldr-rgb-kodak19.png,30.8989,0.0887,0.0632,6.2184 +Kodak,12x12,ldr-rgb-kodak20.png,31.8905,0.0690,0.0461,8.5374 +Kodak,12x12,ldr-rgb-kodak21.png,29.1898,0.1081,0.0841,4.6752 +Kodak,12x12,ldr-rgb-kodak22.png,30.5216,0.0948,0.0698,5.6333 +Kodak,12x12,ldr-rgb-kodak23.png,33.5783,0.0555,0.0316,12.4577 +Kodak,12x12,ldr-rgb-kodak24.png,27.1088,0.1105,0.0851,4.6193 diff --git a/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse4.1_thorough_results.csv new file mode 100644 index 0000000..97753c2 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Kodak/astc_reference-5.0-sse4.1_thorough_results.csv @@ -0,0 +1,121 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Kodak,4x4,ldr-rgb-kodak01.png,45.5922,0.2097,0.1886,2.0853 +Kodak,4x4,ldr-rgb-kodak02.png,45.8030,0.2986,0.2761,1.4244 +Kodak,4x4,ldr-rgb-kodak03.png,48.2411,0.2305,0.2103,1.8701 +Kodak,4x4,ldr-rgb-kodak04.png,45.8220,0.2676,0.2463,1.5964 +Kodak,4x4,ldr-rgb-kodak05.png,42.4990,0.2630,0.2406,1.6341 +Kodak,4x4,ldr-rgb-kodak06.png,45.4845,0.2197,0.1979,1.9874 +Kodak,4x4,ldr-rgb-kodak07.png,46.5232,0.2544,0.2320,1.6949 +Kodak,4x4,ldr-rgb-kodak08.png,42.8951,0.2752,0.2511,1.5662 +Kodak,4x4,ldr-rgb-kodak09.png,47.6380,0.2778,0.2553,1.5400 +Kodak,4x4,ldr-rgb-kodak10.png,47.2861,0.2754,0.2528,1.5553 +Kodak,4x4,ldr-rgb-kodak11.png,45.2527,0.2467,0.2252,1.7464 +Kodak,4x4,ldr-rgb-kodak12.png,48.4695,0.2426,0.2217,1.7736 +Kodak,4x4,ldr-rgb-kodak13.png,41.8177,0.2180,0.1947,2.0193 +Kodak,4x4,ldr-rgb-kodak14.png,43.0359,0.2481,0.2258,1.7417 +Kodak,4x4,ldr-rgb-kodak15.png,45.9001,0.2605,0.2385,1.6490 +Kodak,4x4,ldr-rgb-kodak16.png,48.2454,0.2339,0.2122,1.8531 +Kodak,4x4,ldr-rgb-kodak17.png,46.6018,0.2554,0.2324,1.6918 +Kodak,4x4,ldr-rgb-kodak18.png,42.2703,0.2931,0.2696,1.4585 +Kodak,4x4,ldr-rgb-kodak19.png,45.7040,0.2661,0.2426,1.6207 +Kodak,4x4,ldr-rgb-kodak20.png,47.2393,0.1774,0.1576,2.4957 +Kodak,4x4,ldr-rgb-kodak21.png,45.4554,0.2656,0.2439,1.6125 +Kodak,4x4,ldr-rgb-kodak22.png,44.1133,0.3031,0.2794,1.4071 +Kodak,4x4,ldr-rgb-kodak23.png,47.3572,0.2897,0.2676,1.4694 +Kodak,4x4,ldr-rgb-kodak24.png,42.6967,0.2583,0.2353,1.6712 +Kodak,5x5,ldr-rgb-kodak01.png,40.2586,0.2444,0.2219,1.7724 +Kodak,5x5,ldr-rgb-kodak02.png,42.0904,0.3235,0.3003,1.3094 +Kodak,5x5,ldr-rgb-kodak03.png,44.4615,0.2468,0.2250,1.7473 +Kodak,5x5,ldr-rgb-kodak04.png,42.3443,0.2726,0.2488,1.5801 +Kodak,5x5,ldr-rgb-kodak05.png,38.2346,0.2882,0.2647,1.4857 +Kodak,5x5,ldr-rgb-kodak06.png,41.1418,0.2308,0.2087,1.8841 +Kodak,5x5,ldr-rgb-kodak07.png,42.8229,0.2703,0.2485,1.5823 +Kodak,5x5,ldr-rgb-kodak08.png,38.5696,0.2867,0.2623,1.4991 +Kodak,5x5,ldr-rgb-kodak09.png,44.1115,0.2678,0.2450,1.6050 +Kodak,5x5,ldr-rgb-kodak10.png,43.6829,0.2739,0.2505,1.5696 +Kodak,5x5,ldr-rgb-kodak11.png,41.0699,0.2596,0.2378,1.6535 +Kodak,5x5,ldr-rgb-kodak12.png,44.7095,0.2459,0.2246,1.7505 +Kodak,5x5,ldr-rgb-kodak13.png,37.0063,0.2233,0.1998,1.9684 +Kodak,5x5,ldr-rgb-kodak14.png,38.9442,0.2647,0.2424,1.6222 +Kodak,5x5,ldr-rgb-kodak15.png,42.2117,0.2678,0.2446,1.6079 +Kodak,5x5,ldr-rgb-kodak16.png,44.3482,0.2408,0.2191,1.7946 +Kodak,5x5,ldr-rgb-kodak17.png,42.6961,0.2518,0.2286,1.7199 +Kodak,5x5,ldr-rgb-kodak18.png,38.5147,0.2917,0.2672,1.4716 +Kodak,5x5,ldr-rgb-kodak19.png,41.8527,0.2706,0.2469,1.5928 +Kodak,5x5,ldr-rgb-kodak20.png,43.3624,0.1744,0.1534,2.5636 +Kodak,5x5,ldr-rgb-kodak21.png,40.9291,0.2770,0.2552,1.5410 +Kodak,5x5,ldr-rgb-kodak22.png,40.4963,0.3138,0.2901,1.3555 +Kodak,5x5,ldr-rgb-kodak23.png,43.9946,0.3108,0.2883,1.3641 +Kodak,5x5,ldr-rgb-kodak24.png,38.3784,0.2719,0.2482,1.5845 +Kodak,6x6,ldr-rgb-kodak01.png,36.3246,0.2823,0.2597,1.5142 +Kodak,6x6,ldr-rgb-kodak02.png,39.4302,0.3544,0.3326,1.1821 +Kodak,6x6,ldr-rgb-kodak03.png,41.8065,0.2257,0.2042,1.9256 +Kodak,6x6,ldr-rgb-kodak04.png,39.7049,0.2916,0.2682,1.4661 +Kodak,6x6,ldr-rgb-kodak05.png,35.0174,0.3199,0.2984,1.3180 +Kodak,6x6,ldr-rgb-kodak06.png,37.7802,0.2530,0.2311,1.7017 +Kodak,6x6,ldr-rgb-kodak07.png,40.1739,0.2590,0.2361,1.6655 +Kodak,6x6,ldr-rgb-kodak08.png,35.1895,0.3173,0.2924,1.3447 +Kodak,6x6,ldr-rgb-kodak09.png,41.3054,0.2737,0.2518,1.5615 +Kodak,6x6,ldr-rgb-kodak10.png,40.8835,0.2957,0.2723,1.4439 +Kodak,6x6,ldr-rgb-kodak11.png,37.8029,0.2801,0.2580,1.5240 +Kodak,6x6,ldr-rgb-kodak12.png,41.8909,0.2558,0.2348,1.6746 +Kodak,6x6,ldr-rgb-kodak13.png,32.9679,0.2662,0.2428,1.6198 +Kodak,6x6,ldr-rgb-kodak14.png,36.0646,0.3017,0.2796,1.4066 +Kodak,6x6,ldr-rgb-kodak15.png,39.4965,0.2620,0.2402,1.6372 +Kodak,6x6,ldr-rgb-kodak16.png,41.2648,0.2414,0.2204,1.7842 +Kodak,6x6,ldr-rgb-kodak17.png,39.6991,0.2706,0.2478,1.5871 +Kodak,6x6,ldr-rgb-kodak18.png,35.4614,0.3228,0.2989,1.3158 +Kodak,6x6,ldr-rgb-kodak19.png,38.7373,0.3020,0.2782,1.4132 +Kodak,6x6,ldr-rgb-kodak20.png,40.1617,0.1897,0.1685,2.3331 +Kodak,6x6,ldr-rgb-kodak21.png,37.3694,0.2984,0.2764,1.4226 +Kodak,6x6,ldr-rgb-kodak22.png,37.6663,0.3413,0.3189,1.2328 +Kodak,6x6,ldr-rgb-kodak23.png,41.4926,0.3190,0.2969,1.3244 +Kodak,6x6,ldr-rgb-kodak24.png,35.2089,0.2873,0.2639,1.4899 +Kodak,8x8,ldr-rgb-kodak01.png,31.9145,0.3682,0.3445,1.1415 +Kodak,8x8,ldr-rgb-kodak02.png,36.1779,0.3686,0.3447,1.1409 +Kodak,8x8,ldr-rgb-kodak03.png,38.2215,0.2018,0.1795,2.1902 +Kodak,8x8,ldr-rgb-kodak04.png,36.4120,0.3001,0.2756,1.4265 +Kodak,8x8,ldr-rgb-kodak05.png,30.9292,0.3984,0.3740,1.0514 +Kodak,8x8,ldr-rgb-kodak06.png,33.5936,0.3037,0.2810,1.3992 +Kodak,8x8,ldr-rgb-kodak07.png,36.5361,0.2473,0.2232,1.7614 +Kodak,8x8,ldr-rgb-kodak08.png,30.7430,0.4332,0.4078,0.9643 +Kodak,8x8,ldr-rgb-kodak09.png,37.5825,0.2236,0.1999,1.9669 +Kodak,8x8,ldr-rgb-kodak10.png,37.2612,0.2551,0.2326,1.6905 +Kodak,8x8,ldr-rgb-kodak11.png,33.8424,0.3534,0.3307,1.1890 +Kodak,8x8,ldr-rgb-kodak12.png,38.2926,0.2322,0.2097,1.8747 +Kodak,8x8,ldr-rgb-kodak13.png,28.4632,0.3815,0.3564,1.1034 +Kodak,8x8,ldr-rgb-kodak14.png,32.3344,0.3833,0.3609,1.0895 +Kodak,8x8,ldr-rgb-kodak15.png,36.0889,0.2831,0.2585,1.5209 +Kodak,8x8,ldr-rgb-kodak16.png,37.2793,0.2496,0.2268,1.7336 +Kodak,8x8,ldr-rgb-kodak17.png,35.8741,0.2480,0.2229,1.7645 +Kodak,8x8,ldr-rgb-kodak18.png,31.6653,0.3936,0.3682,1.0679 +Kodak,8x8,ldr-rgb-kodak19.png,34.9446,0.2683,0.2438,1.6131 +Kodak,8x8,ldr-rgb-kodak20.png,36.1894,0.2159,0.1934,2.0333 +Kodak,8x8,ldr-rgb-kodak21.png,33.2320,0.2826,0.2613,1.5049 +Kodak,8x8,ldr-rgb-kodak22.png,34.2464,0.3685,0.3439,1.1435 +Kodak,8x8,ldr-rgb-kodak23.png,38.2357,0.2445,0.2209,1.7802 +Kodak,8x8,ldr-rgb-kodak24.png,31.2478,0.3256,0.3012,1.3056 +Kodak,12x12,ldr-rgb-kodak01.png,27.9181,0.4767,0.4510,0.8719 +Kodak,12x12,ldr-rgb-kodak02.png,33.0108,0.3576,0.3310,1.1880 +Kodak,12x12,ldr-rgb-kodak03.png,34.4642,0.2153,0.1896,2.0743 +Kodak,12x12,ldr-rgb-kodak04.png,32.9804,0.3091,0.2824,1.3922 +Kodak,12x12,ldr-rgb-kodak05.png,26.6113,0.5157,0.4879,0.8059 +Kodak,12x12,ldr-rgb-kodak06.png,29.5414,0.3485,0.3230,1.2173 +Kodak,12x12,ldr-rgb-kodak07.png,32.6520,0.2735,0.2462,1.5973 +Kodak,12x12,ldr-rgb-kodak08.png,26.2681,0.5202,0.4919,0.7993 +Kodak,12x12,ldr-rgb-kodak09.png,33.6376,0.2452,0.2191,1.7949 +Kodak,12x12,ldr-rgb-kodak10.png,32.9960,0.2433,0.2169,1.8133 +Kodak,12x12,ldr-rgb-kodak11.png,30.0542,0.3733,0.3485,1.1282 +Kodak,12x12,ldr-rgb-kodak12.png,34.4647,0.2231,0.1982,1.9835 +Kodak,12x12,ldr-rgb-kodak13.png,24.5895,0.5551,0.5279,0.7448 +Kodak,12x12,ldr-rgb-kodak14.png,28.6563,0.4560,0.4278,0.9192 +Kodak,12x12,ldr-rgb-kodak15.png,32.7482,0.3014,0.2743,1.4334 +Kodak,12x12,ldr-rgb-kodak16.png,33.3438,0.2619,0.2386,1.6482 +Kodak,12x12,ldr-rgb-kodak17.png,32.1376,0.2627,0.2356,1.6688 +Kodak,12x12,ldr-rgb-kodak18.png,27.9291,0.4530,0.4246,0.9261 +Kodak,12x12,ldr-rgb-kodak19.png,31.1197,0.3551,0.3277,1.1998 +Kodak,12x12,ldr-rgb-kodak20.png,32.1844,0.2761,0.2504,1.5705 +Kodak,12x12,ldr-rgb-kodak21.png,29.3333,0.3353,0.3099,1.2689 +Kodak,12x12,ldr-rgb-kodak22.png,30.7935,0.3975,0.3700,1.0627 +Kodak,12x12,ldr-rgb-kodak23.png,34.3801,0.2217,0.1958,2.0085 +Kodak,12x12,ldr-rgb-kodak24.png,27.2441,0.4042,0.3776,1.0415 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-1.7_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-1.7_fast_results.csv new file mode 100644 index 0000000..a94c413 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-1.7_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.7808,7.3504,6.7122,1.4060 +KodakMnt,5x5,ldr-rgb-montage.png,39.9581,4.9533,4.3312,2.1789 +KodakMnt,6x6,ldr-rgb-montage.png,36.9142,8.1747,7.5856,1.2441 +KodakMnt,8x8,ldr-rgb-montage.png,32.8846,7.1381,6.5477,1.4413 +KodakMnt,12x12,ldr-rgb-montage.png,28.7427,3.1989,2.6102,3.6155 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-1.7_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-1.7_fastest_results.csv new file mode 100644 index 0000000..21a9c37 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-1.7_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.7808,7.3021,6.6737,1.4141 +KodakMnt,5x5,ldr-rgb-montage.png,39.9581,4.9444,4.3265,2.1813 +KodakMnt,6x6,ldr-rgb-montage.png,36.9142,8.1140,7.5256,1.2540 +KodakMnt,8x8,ldr-rgb-montage.png,32.8846,7.1667,6.5747,1.4354 +KodakMnt,12x12,ldr-rgb-montage.png,28.7427,3.2529,2.6451,3.5678 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-1.7_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-1.7_medium_results.csv new file mode 100644 index 0000000..b202291 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-1.7_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.5356,44.6777,44.0505,0.2142 +KodakMnt,5x5,ldr-rgb-montage.png,40.6797,35.6794,35.0907,0.2689 +KodakMnt,6x6,ldr-rgb-montage.png,37.5474,47.1187,46.5267,0.2028 +KodakMnt,8x8,ldr-rgb-montage.png,33.6287,46.9320,46.3471,0.2036 +KodakMnt,12x12,ldr-rgb-montage.png,29.5774,29.7376,29.1482,0.3238 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-1.7_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-1.7_thorough_results.csv new file mode 100644 index 0000000..b69a162 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-1.7_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.8752,139.9057,139.3120,0.0677 +KodakMnt,5x5,ldr-rgb-montage.png,40.8719,163.5855,162.9893,0.0579 +KodakMnt,6x6,ldr-rgb-montage.png,37.7237,205.3819,204.7851,0.0461 +KodakMnt,8x8,ldr-rgb-montage.png,33.7974,147.6903,147.1025,0.0642 +KodakMnt,12x12,ldr-rgb-montage.png,29.8410,111.7012,111.1064,0.0849 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-avx2_fast_results.csv new file mode 100644 index 0000000..6e0e062 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-avx2_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.7254,1.3271,0.8962,10.5298 +KodakMnt,5x5,ldr-rgb-montage.png,39.9070,1.0935,0.6622,14.2510 +KodakMnt,6x6,ldr-rgb-montage.png,36.8867,1.3822,0.9547,9.8848 +KodakMnt,8x8,ldr-rgb-montage.png,32.8627,1.4351,0.9996,9.4411 +KodakMnt,12x12,ldr-rgb-montage.png,28.7965,1.0260,0.5812,16.2367 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-avx2_fastest_results.csv new file mode 100644 index 0000000..0025fdf --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-avx2_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,42.5887,0.8325,0.4071,23.1828 +KodakMnt,5x5,ldr-rgb-montage.png,38.9199,0.6677,0.2393,39.4348 +KodakMnt,6x6,ldr-rgb-montage.png,35.6554,0.6651,0.2342,40.2975 +KodakMnt,8x8,ldr-rgb-montage.png,31.3085,0.6526,0.2204,42.8140 +KodakMnt,12x12,ldr-rgb-montage.png,27.4035,0.6009,0.1637,57.6556 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-avx2_medium_results.csv new file mode 100644 index 0000000..745f0df --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-avx2_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.4631,5.9458,5.5155,1.7110 +KodakMnt,5x5,ldr-rgb-montage.png,40.5573,4.5769,4.1434,2.2776 +KodakMnt,6x6,ldr-rgb-montage.png,37.3849,5.1261,4.6958,2.0097 +KodakMnt,8x8,ldr-rgb-montage.png,33.4026,5.2663,4.8277,1.9548 +KodakMnt,12x12,ldr-rgb-montage.png,29.3458,4.0278,3.5805,2.6357 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-avx2_thorough_results.csv new file mode 100644 index 0000000..2846e86 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-avx2_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.8574,20.3568,19.9265,0.4736 +KodakMnt,5x5,ldr-rgb-montage.png,40.8109,21.6795,21.2475,0.4442 +KodakMnt,6x6,ldr-rgb-montage.png,37.6570,24.2423,23.8140,0.3963 +KodakMnt,8x8,ldr-rgb-montage.png,33.6999,19.2777,18.8445,0.5008 +KodakMnt,12x12,ldr-rgb-montage.png,29.7419,16.3652,15.9165,0.5929 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse2_fast_results.csv new file mode 100644 index 0000000..89bc3b0 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse2_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.7254,1.6246,1.2015,7.8544 +KodakMnt,5x5,ldr-rgb-montage.png,39.9070,1.2966,0.8710,10.8349 +KodakMnt,6x6,ldr-rgb-montage.png,36.8867,1.7209,1.2971,7.2757 +KodakMnt,8x8,ldr-rgb-montage.png,32.8627,1.8244,1.3941,6.7696 +KodakMnt,12x12,ldr-rgb-montage.png,28.7965,1.2194,0.7845,12.0292 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse2_fastest_results.csv new file mode 100644 index 0000000..47b1369 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse2_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,42.5887,0.9761,0.5537,17.0434 +KodakMnt,5x5,ldr-rgb-montage.png,38.9199,0.7068,0.2816,33.5118 +KodakMnt,6x6,ldr-rgb-montage.png,35.6554,0.7043,0.2794,33.7748 +KodakMnt,8x8,ldr-rgb-montage.png,31.3085,0.6928,0.2676,35.2641 +KodakMnt,12x12,ldr-rgb-montage.png,27.4035,0.6129,0.1830,51.5716 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse2_medium_results.csv new file mode 100644 index 0000000..2f2c723 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse2_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.4631,7.8861,7.4638,1.2644 +KodakMnt,5x5,ldr-rgb-montage.png,40.5573,6.3547,5.9308,1.5912 +KodakMnt,6x6,ldr-rgb-montage.png,37.3849,7.1941,6.7680,1.3944 +KodakMnt,8x8,ldr-rgb-montage.png,33.4026,7.5310,7.1009,1.3290 +KodakMnt,12x12,ldr-rgb-montage.png,29.3458,5.5887,5.1497,1.8326 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse2_thorough_results.csv new file mode 100644 index 0000000..e0b22c9 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse2_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.8574,25.9319,25.5079,0.3700 +KodakMnt,5x5,ldr-rgb-montage.png,40.8109,28.7772,28.3513,0.3329 +KodakMnt,6x6,ldr-rgb-montage.png,37.6570,32.8741,32.4497,0.2908 +KodakMnt,8x8,ldr-rgb-montage.png,33.6999,27.5161,27.0861,0.3484 +KodakMnt,12x12,ldr-rgb-montage.png,29.7419,23.4117,22.9633,0.4110 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse4.1_fast_results.csv new file mode 100644 index 0000000..5996f37 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse4.1_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.7254,1.4406,1.0045,9.3947 +KodakMnt,5x5,ldr-rgb-montage.png,39.9070,1.1774,0.7390,12.7703 +KodakMnt,6x6,ldr-rgb-montage.png,36.8867,1.5507,1.1132,8.4777 +KodakMnt,8x8,ldr-rgb-montage.png,32.8627,1.6665,1.2278,7.6862 +KodakMnt,12x12,ldr-rgb-montage.png,28.7965,1.1623,0.7149,13.2005 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse4.1_fastest_results.csv new file mode 100644 index 0000000..1852629 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse4.1_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,42.5887,0.9029,0.4666,20.2250 +KodakMnt,5x5,ldr-rgb-montage.png,38.9199,0.6916,0.2530,37.2943 +KodakMnt,6x6,ldr-rgb-montage.png,35.6554,0.6923,0.2557,36.9087 +KodakMnt,8x8,ldr-rgb-montage.png,31.3085,0.6835,0.2457,38.4139 +KodakMnt,12x12,ldr-rgb-montage.png,27.4035,0.6178,0.1738,54.3125 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse4.1_medium_results.csv new file mode 100644 index 0000000..b37eed5 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse4.1_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.4631,6.6409,6.2037,1.5212 +KodakMnt,5x5,ldr-rgb-montage.png,40.5573,5.3212,4.8835,1.9325 +KodakMnt,6x6,ldr-rgb-montage.png,37.3849,6.1799,5.7382,1.6446 +KodakMnt,8x8,ldr-rgb-montage.png,33.4026,6.6786,6.2348,1.5136 +KodakMnt,12x12,ldr-rgb-montage.png,29.3458,5.1214,4.6724,2.0198 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse4.1_thorough_results.csv new file mode 100644 index 0000000..050b818 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-2.5-sse4.1_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.8574,22.5354,22.0968,0.4271 +KodakMnt,5x5,ldr-rgb-montage.png,40.8109,24.7484,24.3083,0.3882 +KodakMnt,6x6,ldr-rgb-montage.png,37.6570,28.7979,28.3570,0.3328 +KodakMnt,8x8,ldr-rgb-montage.png,33.6999,24.5443,24.0946,0.3917 +KodakMnt,12x12,ldr-rgb-montage.png,29.7419,21.1997,20.7461,0.4549 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-avx2_fast_results.csv new file mode 100644 index 0000000..e4c781d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-avx2_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.0285,0.9335,0.4855,19.4397 +KodakMnt,5x5,ldr-rgb-montage.png,40.0752,0.8331,0.3832,24.6246 +KodakMnt,6x6,ldr-rgb-montage.png,36.9706,0.8835,0.4352,21.6869 +KodakMnt,8x8,ldr-rgb-montage.png,32.9355,0.9718,0.5221,18.0745 +KodakMnt,12x12,ldr-rgb-montage.png,28.8476,0.7950,0.3383,27.8987 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-avx2_fastest_results.csv new file mode 100644 index 0000000..bfe7660 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-avx2_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.5838,0.7789,0.3348,28.1869 +KodakMnt,5x5,ldr-rgb-montage.png,39.7683,0.7431,0.2956,31.9224 +KodakMnt,6x6,ldr-rgb-montage.png,36.8150,0.7529,0.3055,30.8934 +KodakMnt,8x8,ldr-rgb-montage.png,32.7960,0.8211,0.3731,25.2920 +KodakMnt,12x12,ldr-rgb-montage.png,28.7205,0.7095,0.2570,36.7156 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-avx2_medium_results.csv new file mode 100644 index 0000000..181aed0 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-avx2_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.6446,2.9943,2.5459,3.7068 +KodakMnt,5x5,ldr-rgb-montage.png,40.6449,2.6102,2.1637,4.3617 +KodakMnt,6x6,ldr-rgb-montage.png,37.4701,2.2729,1.8186,5.1893 +KodakMnt,8x8,ldr-rgb-montage.png,33.5265,2.5586,2.1095,4.4737 +KodakMnt,12x12,ldr-rgb-montage.png,29.5216,2.3645,1.9069,4.9489 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-avx2_thorough_results.csv new file mode 100644 index 0000000..b2a1c6c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-avx2_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.8801,7.8539,7.4086,1.2738 +KodakMnt,5x5,ldr-rgb-montage.png,40.8097,9.0340,8.5810,1.0998 +KodakMnt,6x6,ldr-rgb-montage.png,37.6501,9.7971,9.3483,1.0095 +KodakMnt,8x8,ldr-rgb-montage.png,33.6999,8.9916,8.5375,1.1054 +KodakMnt,12x12,ldr-rgb-montage.png,29.7666,9.0339,8.5698,1.1012 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse2_fast_results.csv new file mode 100644 index 0000000..3a48b6a --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse2_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.0285,1.1007,0.6467,14.5933 +KodakMnt,5x5,ldr-rgb-montage.png,40.0752,0.9750,0.5187,18.1942 +KodakMnt,6x6,ldr-rgb-montage.png,36.9706,1.0866,0.6312,14.9516 +KodakMnt,8x8,ldr-rgb-montage.png,32.9355,1.2433,0.7827,12.0580 +KodakMnt,12x12,ldr-rgb-montage.png,28.8476,0.9715,0.5051,18.6835 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse2_fastest_results.csv new file mode 100644 index 0000000..af21b22 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse2_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.5838,0.9062,0.4529,20.8360 +KodakMnt,5x5,ldr-rgb-montage.png,39.7683,0.8594,0.4054,23.2783 +KodakMnt,6x6,ldr-rgb-montage.png,36.8150,0.8908,0.4366,21.6174 +KodakMnt,8x8,ldr-rgb-montage.png,32.7960,1.0091,0.5497,17.1667 +KodakMnt,12x12,ldr-rgb-montage.png,28.7205,0.8451,0.3833,24.6179 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse2_medium_results.csv new file mode 100644 index 0000000..445840b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse2_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.6446,3.9801,3.5268,2.6759 +KodakMnt,5x5,ldr-rgb-montage.png,40.6449,3.6625,3.2025,2.9468 +KodakMnt,6x6,ldr-rgb-montage.png,37.4701,3.2110,2.7550,3.4255 +KodakMnt,8x8,ldr-rgb-montage.png,33.5265,3.7268,3.2672,2.8884 +KodakMnt,12x12,ldr-rgb-montage.png,29.5216,3.4024,2.9362,3.2141 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse2_thorough_results.csv new file mode 100644 index 0000000..8615a67 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse2_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.8801,10.5664,10.1061,0.9338 +KodakMnt,5x5,ldr-rgb-montage.png,40.8097,12.9904,12.5321,0.7530 +KodakMnt,6x6,ldr-rgb-montage.png,37.6501,14.4621,14.0009,0.6740 +KodakMnt,8x8,ldr-rgb-montage.png,33.6999,13.7376,13.2725,0.7110 +KodakMnt,12x12,ldr-rgb-montage.png,29.7666,13.6335,13.1601,0.7171 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse4.1_fast_results.csv new file mode 100644 index 0000000..dbe5cb1 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse4.1_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.0285,1.0270,0.5693,16.5768 +KodakMnt,5x5,ldr-rgb-montage.png,40.0752,0.9151,0.4556,20.7128 +KodakMnt,6x6,ldr-rgb-montage.png,36.9706,1.0055,0.5490,17.1895 +KodakMnt,8x8,ldr-rgb-montage.png,32.9355,1.1473,0.6827,13.8223 +KodakMnt,12x12,ldr-rgb-montage.png,28.8476,0.9152,0.4457,21.1734 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse4.1_fastest_results.csv new file mode 100644 index 0000000..152b1af --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse4.1_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.5838,0.8555,0.3979,23.7169 +KodakMnt,5x5,ldr-rgb-montage.png,39.7683,0.8151,0.3537,26.6832 +KodakMnt,6x6,ldr-rgb-montage.png,36.8150,0.8408,0.3824,24.6811 +KodakMnt,8x8,ldr-rgb-montage.png,32.7960,0.9404,0.4783,19.7320 +KodakMnt,12x12,ldr-rgb-montage.png,28.7205,0.8029,0.3370,27.9999 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse4.1_medium_results.csv new file mode 100644 index 0000000..55153c4 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse4.1_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.6446,3.5124,3.0548,3.0893 +KodakMnt,5x5,ldr-rgb-montage.png,40.6449,3.2123,2.7489,3.4331 +KodakMnt,6x6,ldr-rgb-montage.png,37.4701,2.8508,2.3904,3.9480 +KodakMnt,8x8,ldr-rgb-montage.png,33.5265,3.3345,2.8688,3.2896 +KodakMnt,12x12,ldr-rgb-montage.png,29.5216,3.0703,2.5958,3.6356 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse4.1_thorough_results.csv new file mode 100644 index 0000000..2789a56 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.6-sse4.1_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.8801,9.3070,8.8486,1.0665 +KodakMnt,5x5,ldr-rgb-montage.png,40.8097,11.3270,10.8648,0.8686 +KodakMnt,6x6,ldr-rgb-montage.png,37.6501,12.6749,12.2157,0.7725 +KodakMnt,8x8,ldr-rgb-montage.png,33.6999,12.1330,11.6650,0.8090 +KodakMnt,12x12,ldr-rgb-montage.png,29.7666,12.1249,11.6488,0.8101 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-avx2_fast_results.csv new file mode 100644 index 0000000..dde27a7 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-avx2_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.0285,0.7899,0.4907,19.2312 +KodakMnt,5x5,ldr-rgb-montage.png,40.0752,0.6819,0.3821,24.6969 +KodakMnt,6x6,ldr-rgb-montage.png,36.9709,0.7273,0.4285,22.0261 +KodakMnt,8x8,ldr-rgb-montage.png,32.9363,0.8181,0.5148,18.3321 +KodakMnt,12x12,ldr-rgb-montage.png,28.8482,0.6406,0.3335,28.3014 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-avx2_fastest_results.csv new file mode 100644 index 0000000..90061ab --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-avx2_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.5838,0.6332,0.3359,28.0920 +KodakMnt,5x5,ldr-rgb-montage.png,39.7683,0.5930,0.2936,32.1475 +KodakMnt,6x6,ldr-rgb-montage.png,36.8150,0.6006,0.2992,31.5447 +KodakMnt,8x8,ldr-rgb-montage.png,32.7988,0.6707,0.3682,25.6272 +KodakMnt,12x12,ldr-rgb-montage.png,28.7212,0.5594,0.2536,37.2117 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-avx2_medium_results.csv new file mode 100644 index 0000000..9d28a11 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-avx2_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.6446,2.8190,2.5172,3.7491 +KodakMnt,5x5,ldr-rgb-montage.png,40.6449,2.4370,2.1314,4.4278 +KodakMnt,6x6,ldr-rgb-montage.png,37.4702,2.0893,1.7879,5.2783 +KodakMnt,8x8,ldr-rgb-montage.png,33.5266,2.3706,2.0660,4.5680 +KodakMnt,12x12,ldr-rgb-montage.png,29.5279,2.1932,1.8778,5.0255 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-avx2_thorough_results.csv new file mode 100644 index 0000000..a26b6ad --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-avx2_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.8801,7.5543,7.2543,1.3009 +KodakMnt,5x5,ldr-rgb-montage.png,40.8097,8.6912,8.3902,1.1248 +KodakMnt,6x6,ldr-rgb-montage.png,37.6502,9.4217,9.1220,1.0346 +KodakMnt,8x8,ldr-rgb-montage.png,33.6998,8.6751,8.3702,1.1275 +KodakMnt,12x12,ldr-rgb-montage.png,29.7670,8.7354,8.4162,1.1213 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse2_fast_results.csv new file mode 100644 index 0000000..690ebe1 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse2_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.0285,0.9566,0.6429,14.6799 +KodakMnt,5x5,ldr-rgb-montage.png,40.0752,0.8352,0.5173,18.2445 +KodakMnt,6x6,ldr-rgb-montage.png,36.9709,0.9441,0.6266,15.0606 +KodakMnt,8x8,ldr-rgb-montage.png,32.9363,1.1016,0.7824,12.0625 +KodakMnt,12x12,ldr-rgb-montage.png,28.8482,0.8293,0.5060,18.6522 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse2_fastest_results.csv new file mode 100644 index 0000000..60abeb9 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse2_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.5838,0.7674,0.4550,20.7416 +KodakMnt,5x5,ldr-rgb-montage.png,39.7683,0.7141,0.4036,23.3797 +KodakMnt,6x6,ldr-rgb-montage.png,36.8150,0.7501,0.4349,21.7001 +KodakMnt,8x8,ldr-rgb-montage.png,32.7988,0.8659,0.5489,17.1928 +KodakMnt,12x12,ldr-rgb-montage.png,28.7212,0.7039,0.3843,24.5575 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse2_medium_results.csv new file mode 100644 index 0000000..a7be250 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse2_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.6446,3.7980,3.4822,2.7101 +KodakMnt,5x5,ldr-rgb-montage.png,40.6449,3.4820,3.1646,2.9821 +KodakMnt,6x6,ldr-rgb-montage.png,37.4702,3.0474,2.7329,3.4532 +KodakMnt,8x8,ldr-rgb-montage.png,33.5266,3.5769,3.2558,2.8986 +KodakMnt,12x12,ldr-rgb-montage.png,29.5279,3.2504,2.9246,3.2268 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse2_thorough_results.csv new file mode 100644 index 0000000..69866f7 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse2_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.8801,10.1129,9.8001,0.9630 +KodakMnt,5x5,ldr-rgb-montage.png,40.8097,12.5580,12.2437,0.7708 +KodakMnt,6x6,ldr-rgb-montage.png,37.6502,14.0692,13.7487,0.6864 +KodakMnt,8x8,ldr-rgb-montage.png,33.6998,13.3725,13.0278,0.7244 +KodakMnt,12x12,ldr-rgb-montage.png,29.7670,13.3942,13.0660,0.7223 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse4.1_fast_results.csv new file mode 100644 index 0000000..b0dfc30 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse4.1_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.0285,0.8718,0.5687,16.5949 +KodakMnt,5x5,ldr-rgb-montage.png,40.0752,0.7585,0.4524,20.8587 +KodakMnt,6x6,ldr-rgb-montage.png,36.9709,0.8494,0.5462,17.2765 +KodakMnt,8x8,ldr-rgb-montage.png,32.9363,0.9880,0.6785,13.9093 +KodakMnt,12x12,ldr-rgb-montage.png,28.8482,0.7613,0.4463,21.1444 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse4.1_fastest_results.csv new file mode 100644 index 0000000..0f3d6c5 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse4.1_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.5838,0.7004,0.3984,23.6904 +KodakMnt,5x5,ldr-rgb-montage.png,39.7683,0.6604,0.3516,26.8417 +KodakMnt,6x6,ldr-rgb-montage.png,36.8150,0.6848,0.3803,24.8129 +KodakMnt,8x8,ldr-rgb-montage.png,32.7988,0.7841,0.4787,19.7157 +KodakMnt,12x12,ldr-rgb-montage.png,28.7212,0.6491,0.3385,27.8829 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse4.1_medium_results.csv new file mode 100644 index 0000000..00c509c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse4.1_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.6446,3.2988,2.9942,3.1519 +KodakMnt,5x5,ldr-rgb-montage.png,40.6449,3.0078,2.7000,3.4952 +KodakMnt,6x6,ldr-rgb-montage.png,37.4702,2.6570,2.3502,4.0156 +KodakMnt,8x8,ldr-rgb-montage.png,33.5266,3.1391,2.8276,3.3376 +KodakMnt,12x12,ldr-rgb-montage.png,29.5279,2.8964,2.5766,3.6626 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse4.1_thorough_results.csv new file mode 100644 index 0000000..dba375c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-3.7-sse4.1_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.8801,8.9053,8.5980,1.0976 +KodakMnt,5x5,ldr-rgb-montage.png,40.8097,10.9007,10.5918,0.8910 +KodakMnt,6x6,ldr-rgb-montage.png,37.6502,12.2468,11.9414,0.7903 +KodakMnt,8x8,ldr-rgb-montage.png,33.6998,11.7750,11.4620,0.8233 +KodakMnt,12x12,ldr-rgb-montage.png,29.7670,11.8407,11.5198,0.8192 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-avx2_fast_results.csv new file mode 100644 index 0000000..c99065e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-avx2_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.1743,0.7330,0.4066,23.2116 +KodakMnt,5x5,ldr-rgb-montage.png,40.1544,0.5992,0.2876,32.8179 +KodakMnt,6x6,ldr-rgb-montage.png,37.0138,0.6336,0.3230,29.2131 +KodakMnt,8x8,ldr-rgb-montage.png,32.9785,0.7010,0.3958,23.8441 +KodakMnt,12x12,ldr-rgb-montage.png,28.8670,0.5791,0.2803,33.6696 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-avx2_fastest_results.csv new file mode 100644 index 0000000..842c97f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-avx2_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.7477,0.5854,0.2622,35.9918 +KodakMnt,5x5,ldr-rgb-montage.png,39.8956,0.5273,0.2172,43.4565 +KodakMnt,6x6,ldr-rgb-montage.png,36.8765,0.5489,0.2336,40.4010 +KodakMnt,8x8,ldr-rgb-montage.png,32.8341,0.6024,0.2937,32.1268 +KodakMnt,12x12,ldr-rgb-montage.png,28.7366,0.5103,0.2074,45.5052 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-avx2_medium_results.csv new file mode 100644 index 0000000..a512efb --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-avx2_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.7850,2.2787,1.9545,4.8285 +KodakMnt,5x5,ldr-rgb-montage.png,40.7198,1.6795,1.3546,6.9668 +KodakMnt,6x6,ldr-rgb-montage.png,37.5055,1.4604,1.1469,8.2285 +KodakMnt,8x8,ldr-rgb-montage.png,33.5454,1.7325,1.4160,6.6647 +KodakMnt,12x12,ldr-rgb-montage.png,29.5440,1.6426,1.3343,7.0727 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-avx2_thorough_results.csv new file mode 100644 index 0000000..2a7b86e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-avx2_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,45.0196,5.3111,4.9944,1.8896 +KodakMnt,5x5,ldr-rgb-montage.png,40.8864,5.3033,4.9835,1.8937 +KodakMnt,6x6,ldr-rgb-montage.png,37.6947,5.4380,5.1351,1.8378 +KodakMnt,8x8,ldr-rgb-montage.png,33.7206,5.4622,5.1446,1.8344 +KodakMnt,12x12,ldr-rgb-montage.png,29.7827,6.1612,5.8504,1.6131 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-neon_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-neon_fast_results.csv new file mode 100644 index 0000000..8ca7c49 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-neon_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.1743,1.1701,0.7674,12.2978 +KodakMnt,5x5,ldr-rgb-montage.png,40.1544,1.9658,1.3478,7.0019 +KodakMnt,6x6,ldr-rgb-montage.png,37.0138,1.9878,1.4345,6.5789 +KodakMnt,8x8,ldr-rgb-montage.png,32.9785,2.2851,1.7355,5.4376 +KodakMnt,12x12,ldr-rgb-montage.png,28.8670,1.1142,0.7139,13.2198 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-neon_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-neon_fastest_results.csv new file mode 100644 index 0000000..a40991b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-neon_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.7477,0.8405,0.4537,20.8024 +KodakMnt,5x5,ldr-rgb-montage.png,39.8956,0.7683,0.3902,24.1831 +KodakMnt,6x6,ldr-rgb-montage.png,36.8765,0.8150,0.4367,21.6092 +KodakMnt,8x8,ldr-rgb-montage.png,32.8341,0.9461,0.5714,16.5153 +KodakMnt,12x12,ldr-rgb-montage.png,28.7366,0.7946,0.4199,22.4735 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-neon_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-neon_medium_results.csv new file mode 100644 index 0000000..a26f8de --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-neon_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.7850,4.2671,3.8675,2.4401 +KodakMnt,5x5,ldr-rgb-montage.png,40.7198,3.1681,2.7775,3.3978 +KodakMnt,6x6,ldr-rgb-montage.png,37.5055,2.8009,2.4175,3.9037 +KodakMnt,8x8,ldr-rgb-montage.png,33.5454,3.5704,3.1897,2.9586 +KodakMnt,12x12,ldr-rgb-montage.png,29.5440,3.5772,3.1981,2.9509 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-neon_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-neon_thorough_results.csv new file mode 100644 index 0000000..d14ff8e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-neon_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,45.0196,10.2539,9.8435,0.9587 +KodakMnt,5x5,ldr-rgb-montage.png,40.8864,10.7445,10.3434,0.9124 +KodakMnt,6x6,ldr-rgb-montage.png,37.6947,9.5335,9.1599,1.0303 +KodakMnt,8x8,ldr-rgb-montage.png,33.7206,10.1403,9.7667,0.9663 +KodakMnt,12x12,ldr-rgb-montage.png,29.7827,12.0622,11.6902,0.8073 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse2_fast_results.csv new file mode 100644 index 0000000..decb100 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse2_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.1743,0.8922,0.5483,17.2124 +KodakMnt,5x5,ldr-rgb-montage.png,40.1544,0.7551,0.4132,22.8388 +KodakMnt,6x6,ldr-rgb-montage.png,37.0138,0.8363,0.4974,18.9727 +KodakMnt,8x8,ldr-rgb-montage.png,32.9785,0.9635,0.6265,15.0629 +KodakMnt,12x12,ldr-rgb-montage.png,28.8670,0.7641,0.4287,22.0141 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse2_fastest_results.csv new file mode 100644 index 0000000..5ffba7f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse2_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.7477,0.7055,0.3597,26.2369 +KodakMnt,5x5,ldr-rgb-montage.png,39.8956,0.6540,0.3148,29.9762 +KodakMnt,6x6,ldr-rgb-montage.png,36.8765,0.7012,0.3636,25.9515 +KodakMnt,8x8,ldr-rgb-montage.png,32.8341,0.8083,0.4656,20.2670 +KodakMnt,12x12,ldr-rgb-montage.png,28.7366,0.6562,0.3174,29.7364 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse2_medium_results.csv new file mode 100644 index 0000000..9f4c702 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse2_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.7850,2.9601,2.6157,3.6078 +KodakMnt,5x5,ldr-rgb-montage.png,40.7198,2.3414,1.9991,4.7206 +KodakMnt,6x6,ldr-rgb-montage.png,37.5055,2.1199,1.7686,5.3360 +KodakMnt,8x8,ldr-rgb-montage.png,33.5454,2.5891,2.2471,4.1998 +KodakMnt,12x12,ldr-rgb-montage.png,29.5440,2.3679,2.0246,4.6613 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse2_thorough_results.csv new file mode 100644 index 0000000..eba4e01 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse2_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,45.0196,7.0704,6.7214,1.4041 +KodakMnt,5x5,ldr-rgb-montage.png,40.8864,7.5233,7.1766,1.3150 +KodakMnt,6x6,ldr-rgb-montage.png,37.6947,8.0573,7.7122,1.2237 +KodakMnt,8x8,ldr-rgb-montage.png,33.7206,8.4138,8.0721,1.1691 +KodakMnt,12x12,ldr-rgb-montage.png,29.7827,9.0797,8.7337,1.0805 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse4.1_fast_results.csv new file mode 100644 index 0000000..7c01b55 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse4.1_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.1743,0.7750,0.4519,20.8834 +KodakMnt,5x5,ldr-rgb-montage.png,40.1544,0.6557,0.3412,27.6572 +KodakMnt,6x6,ldr-rgb-montage.png,37.0138,0.7270,0.4071,23.1804 +KodakMnt,8x8,ldr-rgb-montage.png,32.9785,0.8378,0.5219,18.0819 +KodakMnt,12x12,ldr-rgb-montage.png,28.8670,0.6857,0.3774,25.0044 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse4.1_fastest_results.csv new file mode 100644 index 0000000..2e7d646 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse4.1_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.7477,0.6173,0.2954,31.9460 +KodakMnt,5x5,ldr-rgb-montage.png,39.8956,0.5779,0.2618,36.0528 +KodakMnt,6x6,ldr-rgb-montage.png,36.8765,0.6175,0.2963,31.8462 +KodakMnt,8x8,ldr-rgb-montage.png,32.8341,0.7032,0.3861,24.4441 +KodakMnt,12x12,ldr-rgb-montage.png,28.7366,0.5913,0.2794,33.7761 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse4.1_medium_results.csv new file mode 100644 index 0000000..5294f6a --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse4.1_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.7850,2.5141,2.1794,4.3301 +KodakMnt,5x5,ldr-rgb-montage.png,40.7198,1.9379,1.6099,5.8620 +KodakMnt,6x6,ldr-rgb-montage.png,37.5055,1.7474,1.4287,6.6054 +KodakMnt,8x8,ldr-rgb-montage.png,33.5454,2.1872,1.8701,5.0463 +KodakMnt,12x12,ldr-rgb-montage.png,29.5440,2.1009,1.7877,5.2790 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse4.1_thorough_results.csv new file mode 100644 index 0000000..5e941f5 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-4.8-sse4.1_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,45.0196,5.9428,5.6150,1.6807 +KodakMnt,5x5,ldr-rgb-montage.png,40.8864,6.1826,5.8581,1.6110 +KodakMnt,6x6,ldr-rgb-montage.png,37.6947,6.6312,6.3140,1.4946 +KodakMnt,8x8,ldr-rgb-montage.png,33.7206,7.0761,6.7613,1.3958 +KodakMnt,12x12,ldr-rgb-montage.png,29.7827,8.0072,7.6934,1.2267 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-avx2_fast_results.csv new file mode 100644 index 0000000..4873713 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-avx2_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.1743,0.7071,0.3984,23.6888 +KodakMnt,5x5,ldr-rgb-montage.png,40.1533,0.5896,0.2857,33.0271 +KodakMnt,6x6,ldr-rgb-montage.png,37.0133,0.6220,0.3219,29.3164 +KodakMnt,8x8,ldr-rgb-montage.png,32.9785,0.6904,0.3947,23.9101 +KodakMnt,12x12,ldr-rgb-montage.png,28.8664,0.5681,0.2793,33.7895 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-avx2_fastest_results.csv new file mode 100644 index 0000000..a225584 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-avx2_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.7477,0.5636,0.2585,36.5014 +KodakMnt,5x5,ldr-rgb-montage.png,39.8949,0.5063,0.2147,43.9609 +KodakMnt,6x6,ldr-rgb-montage.png,36.8759,0.5302,0.2331,40.4835 +KodakMnt,8x8,ldr-rgb-montage.png,32.8335,0.5912,0.2940,32.0961 +KodakMnt,12x12,ldr-rgb-montage.png,28.7346,0.4980,0.2088,45.1927 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-avx2_medium_results.csv new file mode 100644 index 0000000..8f1473f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-avx2_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.7845,2.2409,1.9263,4.8991 +KodakMnt,5x5,ldr-rgb-montage.png,40.7188,1.6466,1.3433,7.0252 +KodakMnt,6x6,ldr-rgb-montage.png,37.5042,1.4268,1.1332,8.3277 +KodakMnt,8x8,ldr-rgb-montage.png,33.5449,1.7147,1.4024,6.7291 +KodakMnt,12x12,ldr-rgb-montage.png,29.5428,1.6262,1.3304,7.0937 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-avx2_thorough_results.csv new file mode 100644 index 0000000..aa5a9f4 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-avx2_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,45.0189,5.2531,4.9455,1.9083 +KodakMnt,5x5,ldr-rgb-montage.png,40.8857,5.2261,4.9238,1.9167 +KodakMnt,6x6,ldr-rgb-montage.png,37.6931,5.3839,5.0744,1.8598 +KodakMnt,8x8,ldr-rgb-montage.png,33.7200,5.4298,5.1173,1.8442 +KodakMnt,12x12,ldr-rgb-montage.png,29.7824,6.1131,5.8115,1.6239 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse2_fast_results.csv new file mode 100644 index 0000000..97d945f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse2_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.1743,0.8799,0.5485,17.2039 +KodakMnt,5x5,ldr-rgb-montage.png,40.1533,0.7461,0.4132,22.8411 +KodakMnt,6x6,ldr-rgb-montage.png,37.0133,0.8257,0.4959,19.0311 +KodakMnt,8x8,ldr-rgb-montage.png,32.9785,0.9457,0.6241,15.1205 +KodakMnt,12x12,ldr-rgb-montage.png,28.8664,0.7529,0.4286,22.0172 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse2_fastest_results.csv new file mode 100644 index 0000000..6fc6130 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse2_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.7477,0.6933,0.3596,26.2449 +KodakMnt,5x5,ldr-rgb-montage.png,39.8949,0.6468,0.3157,29.8968 +KodakMnt,6x6,ldr-rgb-montage.png,36.8759,0.6923,0.3648,25.8665 +KodakMnt,8x8,ldr-rgb-montage.png,32.8335,0.7963,0.4654,20.2757 +KodakMnt,12x12,ldr-rgb-montage.png,28.7346,0.6451,0.3193,29.5573 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse2_medium_results.csv new file mode 100644 index 0000000..027f2e5 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse2_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.7845,2.9607,2.6194,3.6028 +KodakMnt,5x5,ldr-rgb-montage.png,40.7188,2.3316,1.9925,4.7363 +KodakMnt,6x6,ldr-rgb-montage.png,37.5042,2.1007,1.7677,5.3387 +KodakMnt,8x8,ldr-rgb-montage.png,33.5449,2.5814,2.2435,4.2065 +KodakMnt,12x12,ldr-rgb-montage.png,29.5428,2.3465,2.0179,4.6767 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse2_thorough_results.csv new file mode 100644 index 0000000..0828be3 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse2_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,45.0189,7.0507,6.7077,1.4069 +KodakMnt,5x5,ldr-rgb-montage.png,40.8857,7.4875,7.1526,1.3194 +KodakMnt,6x6,ldr-rgb-montage.png,37.6931,8.0151,7.6687,1.2306 +KodakMnt,8x8,ldr-rgb-montage.png,33.7200,8.3528,8.0197,1.1768 +KodakMnt,12x12,ldr-rgb-montage.png,29.7824,9.0239,8.6866,1.0864 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse4.1_fast_results.csv new file mode 100644 index 0000000..f5fbe3e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse4.1_fast_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.1743,0.7660,0.4503,20.9562 +KodakMnt,5x5,ldr-rgb-montage.png,40.1533,0.6470,0.3387,27.8665 +KodakMnt,6x6,ldr-rgb-montage.png,37.0133,0.7151,0.4058,23.2556 +KodakMnt,8x8,ldr-rgb-montage.png,32.9785,0.8159,0.5181,18.2138 +KodakMnt,12x12,ldr-rgb-montage.png,28.8664,0.6792,0.3723,25.3455 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse4.1_fastest_results.csv new file mode 100644 index 0000000..f2497d9 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse4.1_fastest_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,43.7477,0.6137,0.2935,32.1588 +KodakMnt,5x5,ldr-rgb-montage.png,39.8949,0.5660,0.2585,36.5007 +KodakMnt,6x6,ldr-rgb-montage.png,36.8759,0.6029,0.2949,32.0017 +KodakMnt,8x8,ldr-rgb-montage.png,32.8335,0.6923,0.3848,24.5237 +KodakMnt,12x12,ldr-rgb-montage.png,28.7346,0.5741,0.2763,34.1614 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse4.1_medium_results.csv new file mode 100644 index 0000000..6994ac5 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse4.1_medium_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,44.7845,2.5068,2.1790,4.3309 +KodakMnt,5x5,ldr-rgb-montage.png,40.7188,1.9172,1.6044,5.8820 +KodakMnt,6x6,ldr-rgb-montage.png,37.5042,1.7332,1.4235,6.6296 +KodakMnt,8x8,ldr-rgb-montage.png,33.5449,2.1636,1.8504,5.1001 +KodakMnt,12x12,ldr-rgb-montage.png,29.5428,2.0699,1.7660,5.3437 diff --git a/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse4.1_thorough_results.csv new file mode 100644 index 0000000..fc24405 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakMnt/astc_reference-5.0-sse4.1_thorough_results.csv @@ -0,0 +1,6 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakMnt,4x4,ldr-rgb-montage.png,45.0189,5.9395,5.6199,1.6792 +KodakMnt,5x5,ldr-rgb-montage.png,40.8857,6.1619,5.8439,1.6149 +KodakMnt,6x6,ldr-rgb-montage.png,37.6931,6.5811,6.2664,1.5060 +KodakMnt,8x8,ldr-rgb-montage.png,33.7200,7.0245,6.7093,1.4066 +KodakMnt,12x12,ldr-rgb-montage.png,29.7824,7.9643,7.6477,1.2340 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-1.7_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-1.7_fast_results.csv new file mode 100644 index 0000000..9b92581 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-1.7_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.2070,1.3173,1.2887,0.3051 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.5431,0.4082,0.3807,1.0328 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.0686,0.6376,0.6103,0.6443 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,44.7426,0.3099,0.2850,1.3796 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.8818,0.9865,0.9575,0.4107 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.0246,0.2841,0.2563,1.5341 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.1619,0.4133,0.3857,1.0196 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.3092,0.2111,0.1858,2.1165 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.8559,1.2855,1.2550,0.3133 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.3874,0.3299,0.3020,1.3021 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.9900,0.4603,0.4325,0.9091 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.7930,0.2229,0.1979,1.9873 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.1329,0.8180,0.7882,0.4989 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.1129,0.2624,0.2351,1.6726 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.1223,0.3127,0.2848,1.3807 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8757,0.1639,0.1387,2.8348 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.0798,0.2285,0.1991,1.9747 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6026,0.1267,0.0987,3.9836 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5131,0.1435,0.1158,3.3956 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2838,0.1034,0.0779,5.0493 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-1.7_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-1.7_fastest_results.csv new file mode 100644 index 0000000..205fff3 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-1.7_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.2070,1.3270,1.2974,0.3031 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.5431,0.4081,0.3805,1.0335 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.0686,0.6395,0.6118,0.6428 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,44.7426,0.3121,0.2869,1.3704 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.8818,0.9875,0.9580,0.4104 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.0246,0.2816,0.2542,1.5467 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.1619,0.4069,0.3797,1.0356 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.3092,0.2094,0.1839,2.1381 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.8559,1.2829,1.2542,0.3135 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.3874,0.3285,0.3005,1.3084 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.9900,0.4582,0.4309,0.9125 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.7930,0.2194,0.1940,2.0266 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.1329,0.8111,0.7821,0.5028 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.1129,0.2615,0.2341,1.6794 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.1223,0.3122,0.2848,1.3808 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8757,0.1659,0.1405,2.7980 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.0798,0.2291,0.1995,1.9706 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6026,0.1268,0.0990,3.9722 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5131,0.1429,0.1153,3.4118 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2838,0.1037,0.0780,5.0415 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-1.7_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-1.7_medium_results.csv new file mode 100644 index 0000000..a90ebfb --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-1.7_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.0644,4.6155,4.5868,0.0857 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.9026,1.9301,1.9031,0.2066 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.0875,3.3218,3.2943,0.1194 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.6153,2.1170,2.0926,0.1879 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7837,5.9108,5.8787,0.0669 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6413,1.8910,1.8641,0.2109 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.3100,3.3503,3.3221,0.1184 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.8288,1.5988,1.5742,0.2498 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.6087,5.5181,5.4891,0.0716 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0834,1.6265,1.5993,0.2459 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2219,2.5035,2.4770,0.1587 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.5768,1.1074,1.0834,0.3629 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7812,4.7559,4.7267,0.0832 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7632,1.3859,1.3590,0.2893 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2648,2.1263,2.0994,0.1873 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.2008,0.8724,0.8468,0.4643 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7602,2.5037,2.4746,0.1589 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.2905,0.8205,0.7932,0.4957 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.6254,0.9065,0.8779,0.4479 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3049,0.3835,0.3589,1.0956 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-1.7_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-1.7_thorough_results.csv new file mode 100644 index 0000000..848743f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-1.7_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.2793,9.0499,9.0215,0.0436 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.1376,6.8036,6.7767,0.0580 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.4295,8.0200,7.9923,0.0492 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.0358,6.2582,6.2305,0.0631 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,36.0035,10.5221,10.4935,0.0375 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7598,8.4613,8.4342,0.0466 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.5819,9.3362,9.3088,0.0422 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.1121,7.6452,7.6209,0.0516 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.7706,11.2050,11.1763,0.0352 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.2018,9.7495,9.7216,0.0404 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.4940,9.6756,9.6485,0.0408 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8921,8.4960,8.4711,0.0464 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.9557,10.9009,10.8723,0.0362 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.9169,8.1239,8.0969,0.0486 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.6657,6.5903,6.5631,0.0599 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.8550,4.4199,4.3953,0.0895 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0413,8.9155,8.8835,0.0443 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5775,6.3137,6.2868,0.0625 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.2468,4.8318,4.8045,0.0818 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.1104,2.4852,2.4610,0.1598 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-avx2_fast_results.csv new file mode 100644 index 0000000..d71ee3c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-avx2_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.2245,0.1993,0.1732,2.2707 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.5501,0.0709,0.0455,8.6360 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.1080,0.1008,0.0770,5.1063 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,44.8688,0.0560,0.0338,11.6419 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.8529,0.1488,0.1219,3.2266 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.0646,0.0625,0.0365,10.7792 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.2734,0.0754,0.0509,7.7295 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.5159,0.0495,0.0266,14.7903 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.8187,0.1661,0.1379,2.8525 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4028,0.0697,0.0425,9.2596 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.1001,0.0796,0.0538,7.3128 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.9771,0.0524,0.0284,13.8500 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.1129,0.1447,0.1121,3.5079 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.1265,0.0720,0.0400,9.8405 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.1559,0.0740,0.0435,9.0324 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.9241,0.0529,0.0243,16.1671 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1275,0.0862,0.0456,8.6202 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6724,0.0643,0.0245,16.0399 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.4537,0.0624,0.0248,15.8299 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2205,0.0542,0.0182,21.5653 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-avx2_fastest_results.csv new file mode 100644 index 0000000..888c733 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-avx2_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,35.2344,0.0839,0.0577,6.8198 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,41.7903,0.0423,0.0169,23.2987 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,40.2313,0.0492,0.0254,15.4724 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,43.9304,0.0377,0.0157,25.0283 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,33.3289,0.0564,0.0298,13.2099 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,37.9840,0.0372,0.0118,33.3179 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,37.5992,0.0385,0.0143,27.5631 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,39.8638,0.0336,0.0109,35.9365 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,31.4362,0.0523,0.0249,15.8064 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,35.1232,0.0371,0.0111,35.3905 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,35.4713,0.0376,0.0131,30.0670 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,37.3703,0.0331,0.0102,38.4489 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,28.9601,0.0470,0.0155,25.3671 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,31.8278,0.0403,0.0100,39.3686 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,32.7092,0.0401,0.0113,34.9280 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,34.5213,0.0368,0.0099,39.8557 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,26.3647,0.0448,0.0085,46.1837 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,28.7311,0.0437,0.0081,48.5207 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,29.5317,0.0434,0.0094,41.6766 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,31.3614,0.0415,0.0095,41.2647 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-avx2_medium_results.csv new file mode 100644 index 0000000..8b23667 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-avx2_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.0615,0.5110,0.4851,0.8105 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.8358,0.2168,0.1911,2.0576 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.1344,0.3551,0.3311,1.1877 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.5396,0.2140,0.1917,2.0509 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7188,0.6013,0.5734,0.6858 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.5523,0.2552,0.2284,1.7218 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.2977,0.4133,0.3877,1.0143 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.7335,0.1812,0.1575,2.4970 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5022,0.5789,0.5500,0.7149 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.8871,0.2047,0.1766,2.2271 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.1142,0.2905,0.2641,1.4890 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.1800,0.1330,0.1079,3.6441 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.6481,0.5397,0.5056,0.7778 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.5398,0.1959,0.1623,2.4224 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.0184,0.2583,0.2265,1.7360 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,36.7740,0.1177,0.0877,4.4859 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.6115,0.3499,0.3053,1.2881 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.0235,0.1434,0.0998,3.9389 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.3011,0.1514,0.1092,3.5997 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.8609,0.0922,0.0522,7.5307 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-avx2_thorough_results.csv new file mode 100644 index 0000000..9a72a28 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-avx2_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.2859,1.1268,1.1002,0.3574 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.1352,0.7860,0.7603,0.5172 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.5525,1.0201,0.9959,0.3948 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.0662,0.7022,0.6796,0.5786 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.9591,1.2287,1.2010,0.3274 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7341,0.9343,0.9076,0.4333 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.6111,1.1259,1.1006,0.3573 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.1001,0.8538,0.8301,0.4737 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.6923,1.3001,1.2711,0.3094 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0974,1.0793,1.0511,0.3741 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.4843,1.1671,1.1402,0.3449 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8215,0.9704,0.9451,0.4161 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8452,1.3630,1.3283,0.2960 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8256,1.0016,0.9677,0.4063 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.5612,0.9151,0.8827,0.4455 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7451,0.6031,0.5722,0.6872 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.9408,1.2462,1.2018,0.3272 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.4763,0.8489,0.8049,0.4885 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.0986,0.7598,0.7178,0.5478 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.0472,0.4315,0.3907,1.0065 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse2_fast_results.csv new file mode 100644 index 0000000..a96b06d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse2_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.2245,0.2526,0.2260,1.7400 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.5501,0.0873,0.0616,6.3861 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.1080,0.1252,0.1006,3.9068 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,44.8688,0.0678,0.0454,8.6682 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.8529,0.1946,0.1667,2.3585 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.0646,0.0753,0.0489,8.0473 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.2734,0.0928,0.0675,5.8237 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.5159,0.0577,0.0344,11.4300 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.8187,0.2199,0.1909,2.0595 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4028,0.0860,0.0584,6.7336 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.1001,0.0990,0.0726,5.4181 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.9771,0.0620,0.0376,10.4600 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.1129,0.1910,0.1574,2.4984 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.1265,0.0874,0.0552,7.1292 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.1559,0.0907,0.0594,6.6162 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.9241,0.0609,0.0318,12.3587 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1275,0.1036,0.0621,6.3365 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6724,0.0725,0.0325,12.1030 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.4537,0.0704,0.0321,12.2569 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2205,0.0601,0.0234,16.7704 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse2_fastest_results.csv new file mode 100644 index 0000000..6019492 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse2_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,35.2344,0.1043,0.0772,5.0903 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,41.7903,0.0478,0.0224,17.5794 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,40.2313,0.0584,0.0344,11.4420 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,43.9304,0.0434,0.0211,18.6579 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,33.3289,0.0647,0.0373,10.5502 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,37.9840,0.0395,0.0138,28.4528 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,37.5992,0.0420,0.0175,22.4067 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,39.8638,0.0351,0.0127,30.9158 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,31.4362,0.0597,0.0316,12.4502 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,35.1232,0.0400,0.0137,28.7735 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,35.4713,0.0409,0.0156,25.2707 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,37.3703,0.0354,0.0121,32.4972 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,28.9601,0.0513,0.0197,19.9722 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,31.8278,0.0423,0.0119,33.0375 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,32.7092,0.0427,0.0135,29.1380 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,34.5213,0.0387,0.0114,34.3719 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,26.3647,0.0465,0.0100,39.5157 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,28.7311,0.0447,0.0094,41.9341 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,29.5317,0.0459,0.0114,34.4869 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,31.3614,0.0432,0.0108,36.4125 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse2_medium_results.csv new file mode 100644 index 0000000..e065846 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse2_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.0615,0.6736,0.6463,0.6084 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.8358,0.2918,0.2656,1.4807 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.1344,0.4758,0.4512,0.8716 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.5396,0.2871,0.2642,1.4883 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7188,0.8452,0.8169,0.4814 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.5523,0.3158,0.2887,1.3618 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.2977,0.5089,0.4828,0.8144 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.7335,0.2512,0.2272,1.7310 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5022,0.8147,0.7848,0.5010 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.8871,0.2856,0.2572,1.5289 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.1142,0.4038,0.3765,1.0444 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.1800,0.1812,0.1560,2.5207 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.6481,0.7732,0.7386,0.5324 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.5398,0.2763,0.2427,1.6202 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.0184,0.3619,0.3290,1.1951 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,36.7740,0.1578,0.1274,3.0868 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.6115,0.4795,0.4351,0.9036 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.0235,0.1886,0.1453,2.7062 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.3011,0.1983,0.1560,2.5210 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.8609,0.1134,0.0731,5.3800 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse2_thorough_results.csv new file mode 100644 index 0000000..d34dcdf --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse2_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.2859,1.4315,1.4041,0.2800 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.1352,1.0043,0.9782,0.4020 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.5525,1.3008,1.2759,0.3082 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.0662,0.9077,0.8848,0.4444 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.9591,1.6303,1.6018,0.2455 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7341,1.2501,1.2228,0.3216 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.6111,1.4933,1.4672,0.2680 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.1001,1.1445,1.1205,0.3509 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.6923,1.7598,1.7299,0.2273 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0974,1.4617,1.4331,0.2744 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.4843,1.5751,1.5477,0.2541 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8215,1.3179,1.2925,0.3042 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8452,1.9186,1.8834,0.2088 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8256,1.4195,1.3849,0.2839 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.5612,1.2839,1.2513,0.3143 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7451,0.8489,0.8180,0.4807 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.9408,1.7557,1.7102,0.2299 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.4763,1.2024,1.1591,0.3393 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.0986,1.0702,1.0280,0.3825 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.0472,0.6031,0.5624,0.6992 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse4.1_fast_results.csv new file mode 100644 index 0000000..52379c4 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse4.1_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.2245,0.2158,0.1894,2.0758 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.5501,0.0771,0.0514,7.6516 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.1080,0.1091,0.0850,4.6269 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,44.8688,0.0608,0.0385,10.2158 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.8529,0.1671,0.1397,2.8143 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.0646,0.0678,0.0413,9.5171 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.2734,0.0824,0.0575,6.8444 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.5159,0.0528,0.0296,13.2713 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.8187,0.1907,0.1620,2.4270 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4028,0.0771,0.0495,7.9446 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.1001,0.0883,0.0623,6.3164 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.9771,0.0567,0.0324,12.1228 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.1129,0.1715,0.1381,2.8472 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.1265,0.0808,0.0484,8.1207 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.1559,0.0829,0.0522,7.5316 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.9241,0.0572,0.0283,13.8758 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1275,0.0976,0.0565,6.9608 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6724,0.0693,0.0299,13.1648 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.4537,0.0679,0.0297,13.2294 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2205,0.0580,0.0216,18.2451 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse4.1_fastest_results.csv new file mode 100644 index 0000000..4db9fdd --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse4.1_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,35.2344,0.0897,0.0633,6.2124 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,41.7903,0.0447,0.0197,19.9906 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,40.2313,0.0525,0.0287,13.7052 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,43.9304,0.0405,0.0186,21.1863 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,33.3289,0.0582,0.0314,12.5132 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,37.9840,0.0380,0.0126,31.3293 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,37.5992,0.0394,0.0150,26.2180 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,39.8638,0.0341,0.0116,33.9355 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,31.4362,0.0551,0.0276,14.2563 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,35.1232,0.0386,0.0124,31.7827 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,35.4713,0.0387,0.0139,28.2845 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,37.3703,0.0343,0.0112,34.9562 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,28.9601,0.0492,0.0180,21.8573 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,31.8278,0.0415,0.0113,34.7243 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,32.7092,0.0416,0.0123,32.0053 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,34.5213,0.0378,0.0107,36.8387 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,26.3647,0.0459,0.0092,42.7316 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,28.7311,0.0445,0.0090,43.6510 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,29.5317,0.0450,0.0110,35.7371 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,31.3614,0.0425,0.0102,38.6300 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse4.1_medium_results.csv new file mode 100644 index 0000000..8bc54ac --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse4.1_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.0615,0.5769,0.5505,0.7143 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.8358,0.2467,0.2209,1.7800 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.1344,0.4048,0.3802,1.0342 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.5396,0.2453,0.2224,1.7678 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7188,0.7120,0.6842,0.5747 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.5523,0.2660,0.2390,1.6452 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.2977,0.4294,0.4040,0.9734 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.7335,0.2134,0.1895,2.0752 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5022,0.7029,0.6737,0.5837 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.8871,0.2443,0.2160,1.8205 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.1142,0.3496,0.3226,1.2187 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.1800,0.1570,0.1319,2.9814 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.6481,0.6855,0.6509,0.6041 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.5398,0.2433,0.2096,1.8762 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.0184,0.3223,0.2901,1.3554 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,36.7740,0.1424,0.1119,3.5136 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.6115,0.4429,0.3991,0.9852 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.0235,0.1750,0.1317,2.9853 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.3011,0.1837,0.1413,2.7827 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.8609,0.1067,0.0667,5.8978 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse4.1_thorough_results.csv new file mode 100644 index 0000000..5606043 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-2.5-sse4.1_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.2859,1.2532,1.2263,0.3207 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.1352,0.8792,0.8531,0.4609 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.5525,1.1791,1.1545,0.3406 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.0662,0.7923,0.7694,0.5111 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.9591,1.4122,1.3842,0.2841 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7341,1.0792,1.0521,0.3737 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.6111,1.2964,1.2706,0.3095 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.1001,0.9899,0.9661,0.4070 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.6923,1.5317,1.5024,0.2617 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0974,1.2740,1.2455,0.3157 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.4843,1.3807,1.3536,0.2905 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8215,1.1521,1.1268,0.3490 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8452,1.7062,1.6711,0.2353 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8256,1.2628,1.2286,0.3200 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.5612,1.1479,1.1150,0.3527 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7451,0.7535,0.7227,0.5441 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.9408,1.6004,1.5556,0.2528 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.4763,1.0960,1.0525,0.3736 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.0986,0.9725,0.9306,0.4225 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.0472,0.5481,0.5084,0.7735 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-avx2_fast_results.csv new file mode 100644 index 0000000..2ea5f79 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-avx2_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3904,0.0970,0.0728,5.4050 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.6546,0.0502,0.0271,14.4831 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.2501,0.0577,0.0357,11.0259 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0122,0.0387,0.0188,20.8768 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0008,0.0845,0.0591,6.6564 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.1586,0.0455,0.0214,18.3713 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.3978,0.0494,0.0268,14.6920 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.6115,0.0364,0.0159,24.7772 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0451,0.0878,0.0620,6.3470 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4936,0.0475,0.0235,16.7241 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3128,0.0494,0.0264,14.9109 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1307,0.0375,0.0163,24.1846 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.1671,0.0878,0.0577,6.8109 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.1803,0.0538,0.0257,15.2758 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.2197,0.0512,0.0243,16.1923 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.9837,0.0404,0.0152,25.8538 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1854,0.0658,0.0298,13.1961 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7170,0.0501,0.0154,25.5649 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5222,0.0478,0.0145,27.1972 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2506,0.0416,0.0100,39.4043 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-avx2_fastest_results.csv new file mode 100644 index 0000000..1cf31f3 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-avx2_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.1024,0.0654,0.0418,9.4179 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.4493,0.0424,0.0204,19.2433 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,41.9861,0.0445,0.0236,16.6758 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,44.8288,0.0334,0.0142,27.6774 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.3178,0.0613,0.0370,10.6390 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,38.9569,0.0406,0.0177,22.2748 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.8333,0.0412,0.0193,20.4057 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.3913,0.0328,0.0131,30.0742 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.2760,0.0595,0.0352,11.1703 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.3528,0.0406,0.0179,21.9402 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.7630,0.0397,0.0177,22.2495 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8540,0.0325,0.0125,31.4776 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,29.9876,0.0672,0.0394,9.9778 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0581,0.0458,0.0192,20.5003 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.0146,0.0429,0.0178,22.1191 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8083,0.0357,0.0123,31.9873 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1132,0.0534,0.0215,18.2714 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6182,0.0432,0.0124,31.6242 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.4797,0.0408,0.0113,34.8911 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.1951,0.0361,0.0085,46.4517 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-avx2_medium_results.csv new file mode 100644 index 0000000..44e041b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-avx2_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.0887,0.2026,0.1775,2.2155 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.9182,0.1204,0.0964,4.0793 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.1886,0.1524,0.1297,3.0320 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.6672,0.1099,0.0890,4.4177 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7510,0.2513,0.2241,1.7547 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6013,0.1219,0.0965,4.0735 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.3581,0.1626,0.1378,2.8533 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.8509,0.0985,0.0760,5.1710 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5540,0.2516,0.2242,1.7539 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.9809,0.1132,0.0868,4.5322 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2172,0.1386,0.1136,3.4622 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.4889,0.0800,0.0564,6.9717 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7276,0.2657,0.2348,1.6750 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7027,0.1266,0.0970,4.0542 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2516,0.1422,0.1136,3.4610 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.2386,0.0847,0.0582,6.7508 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7761,0.2294,0.1898,2.0720 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3165,0.1190,0.0808,4.8662 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5646,0.1078,0.0706,5.5694 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3015,0.0743,0.0393,10.0053 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-avx2_thorough_results.csv new file mode 100644 index 0000000..da8015d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-avx2_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.2942,0.4121,0.3868,1.0167 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.1423,0.3012,0.2773,1.4182 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.5746,0.3746,0.3515,1.1187 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.1116,0.2878,0.2667,1.4744 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.9652,0.4950,0.4678,0.8405 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7378,0.3728,0.3469,1.1335 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.6371,0.4515,0.4271,0.9208 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.1312,0.3650,0.3421,1.1493 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.6962,0.5698,0.5419,0.7257 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0965,0.4537,0.4273,0.9202 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.4884,0.5080,0.4831,0.8140 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8247,0.4390,0.4159,0.9454 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8695,0.6628,0.6305,0.6237 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8404,0.4331,0.4019,0.9785 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.5648,0.4396,0.4095,0.9603 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7448,0.2907,0.2623,1.4991 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0242,0.7183,0.6768,0.5810 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5619,0.4395,0.3986,0.9866 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1782,0.4213,0.3814,1.0311 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.0794,0.2535,0.2157,1.8227 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse2_fast_results.csv new file mode 100644 index 0000000..2aab788 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse2_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3904,0.1174,0.0928,4.2366 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.6546,0.0590,0.0353,11.1415 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.2501,0.0678,0.0457,8.6007 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0122,0.0449,0.0245,16.0438 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0008,0.1071,0.0814,4.8299 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.1586,0.0546,0.0296,13.2646 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.3978,0.0590,0.0359,10.9654 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.6115,0.0420,0.0209,18.8150 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0451,0.1157,0.0896,4.3910 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4936,0.0599,0.0343,11.4590 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3128,0.0611,0.0369,10.6493 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1307,0.0440,0.0225,17.4408 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.1671,0.1156,0.0853,4.6115 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.1803,0.0667,0.0374,10.5147 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.2197,0.0622,0.0343,11.4617 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.9837,0.0469,0.0216,18.1625 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1854,0.0793,0.0424,9.2779 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7170,0.0569,0.0217,18.0841 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5222,0.0541,0.0203,19.3512 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2506,0.0464,0.0141,27.8998 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse2_fastest_results.csv new file mode 100644 index 0000000..5725ce5 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse2_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.1024,0.0784,0.0544,7.2264 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.4493,0.0493,0.0263,14.9597 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,41.9861,0.0517,0.0303,12.9928 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,44.8288,0.0379,0.0188,20.9569 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.3178,0.0771,0.0518,7.5871 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,38.9569,0.0482,0.0243,16.2071 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.8333,0.0483,0.0260,15.1191 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.3913,0.0375,0.0172,22.8361 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.2760,0.0756,0.0505,7.7832 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.3528,0.0498,0.0255,15.4354 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.7630,0.0469,0.0244,16.1386 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8540,0.0377,0.0173,22.7344 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,29.9876,0.0858,0.0570,6.8951 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0581,0.0551,0.0274,14.3416 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.0146,0.0504,0.0248,15.8863 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8083,0.0408,0.0170,23.1333 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1132,0.0633,0.0309,12.7246 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6182,0.0485,0.0174,22.5794 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.4797,0.0453,0.0159,24.7977 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.1951,0.0398,0.0119,33.0992 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse2_medium_results.csv new file mode 100644 index 0000000..8fad21e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse2_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.0887,0.2674,0.2429,1.6189 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.9182,0.1573,0.1328,2.9600 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.1886,0.2023,0.1795,2.1911 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.6672,0.1450,0.1237,3.1788 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7510,0.3569,0.3300,1.1915 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6013,0.1687,0.1424,2.7605 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.3581,0.2278,0.2030,1.9366 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.8509,0.1353,0.1125,3.4947 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5540,0.3600,0.3324,1.1829 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.9809,0.1591,0.1324,2.9704 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2172,0.1947,0.1693,2.3221 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.4889,0.1093,0.0861,4.5689 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7276,0.3902,0.3592,1.0946 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7027,0.1803,0.1501,2.6194 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2516,0.2024,0.1738,2.2624 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.2386,0.1157,0.0888,4.4295 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7761,0.3256,0.2863,1.3733 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3165,0.1639,0.1251,3.1421 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5646,0.1443,0.1074,3.6628 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3015,0.0947,0.0596,6.6029 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse2_thorough_results.csv new file mode 100644 index 0000000..da50d87 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse2_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.2942,0.5453,0.5196,0.7568 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.1423,0.4016,0.3766,1.0442 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.5746,0.4998,0.4765,0.8252 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.1116,0.3862,0.3649,1.0775 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.9652,0.6957,0.6686,0.5881 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7378,0.5260,0.4999,0.7867 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.6371,0.6391,0.6145,0.6399 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.1312,0.5192,0.4955,0.7935 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.6962,0.8181,0.7901,0.4977 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0965,0.6589,0.6314,0.6227 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.4884,0.7347,0.7096,0.5542 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8247,0.6369,0.6133,0.6412 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8695,0.9919,0.9590,0.4100 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8404,0.6475,0.6155,0.6389 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.5648,0.6559,0.6248,0.6293 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7448,0.4297,0.4010,0.9806 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0242,1.0631,1.0208,0.3852 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5619,0.6479,0.6056,0.6493 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1782,0.6180,0.5783,0.6799 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.0794,0.3675,0.3292,1.1945 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse4.1_fast_results.csv new file mode 100644 index 0000000..4800bc7 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse4.1_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3904,0.1071,0.0825,4.7685 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.6546,0.0550,0.0314,12.5216 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.2501,0.0629,0.0409,9.6199 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0122,0.0421,0.0219,17.9739 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0008,0.0962,0.0704,5.5856 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.1586,0.0510,0.0260,15.1149 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.3978,0.0546,0.0313,12.5464 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.6115,0.0396,0.0186,21.1931 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0451,0.1043,0.0779,5.0494 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4936,0.0552,0.0299,13.1375 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3128,0.0561,0.0324,12.1389 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1307,0.0412,0.0198,19.8203 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.1671,0.1050,0.0747,5.2617 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.1803,0.0620,0.0326,12.0563 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.2197,0.0581,0.0304,12.9338 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.9837,0.0446,0.0193,20.3643 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1854,0.0743,0.0380,10.3560 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7170,0.0550,0.0196,20.0612 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5222,0.0519,0.0183,21.5438 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2506,0.0446,0.0125,31.3519 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse4.1_fastest_results.csv new file mode 100644 index 0000000..1895c1f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse4.1_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.1024,0.0719,0.0480,8.1898 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.4493,0.0462,0.0232,16.9126 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,41.9861,0.0482,0.0267,14.7272 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,44.8288,0.0360,0.0167,23.5237 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.3178,0.0695,0.0448,8.7779 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,38.9569,0.0449,0.0212,18.5751 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.8333,0.0446,0.0228,17.2253 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.3913,0.0353,0.0153,25.7103 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.2760,0.0691,0.0439,8.9503 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.3528,0.0463,0.0226,17.3750 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.7630,0.0437,0.0218,18.0390 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8540,0.0357,0.0153,25.6265 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,29.9876,0.0789,0.0502,7.8272 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0581,0.0516,0.0242,16.2541 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.0146,0.0474,0.0221,17.7780 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8083,0.0386,0.0150,26.1880 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1132,0.0598,0.0276,14.2372 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6182,0.0469,0.0156,25.2205 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.4797,0.0439,0.0140,28.0808 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.1951,0.0385,0.0105,37.3391 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse4.1_medium_results.csv new file mode 100644 index 0000000..2eaf973 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse4.1_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.0887,0.2369,0.2117,1.8570 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.9182,0.1400,0.1156,3.4003 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.1886,0.1792,0.1560,2.5213 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.6672,0.1289,0.1072,3.6680 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7510,0.3097,0.2822,1.3936 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6013,0.1487,0.1225,3.2089 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.3581,0.1994,0.1750,2.2476 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.8509,0.1190,0.0964,4.0777 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5540,0.3186,0.2904,1.3538 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.9809,0.1413,0.1147,3.4297 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2172,0.1727,0.1476,2.6640 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.4889,0.0979,0.0747,5.2643 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7276,0.3488,0.3174,1.2389 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7027,0.1616,0.1313,2.9939 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2516,0.1819,0.1532,2.5675 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.2386,0.1047,0.0781,5.0324 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7761,0.2953,0.2558,1.5370 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3165,0.1493,0.1108,3.5486 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5646,0.1333,0.0956,4.1129 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3015,0.0879,0.0529,7.4316 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse4.1_thorough_results.csv new file mode 100644 index 0000000..57f6941 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.6-sse4.1_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.2942,0.4847,0.4596,0.8555 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.1423,0.3555,0.3306,1.1894 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.5746,0.4412,0.4181,0.9406 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.1116,0.3438,0.3224,1.2195 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.9652,0.6160,0.5888,0.6679 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7378,0.4642,0.4381,0.8976 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.6371,0.5630,0.5384,0.7304 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.1312,0.4541,0.4308,0.9127 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.6962,0.7258,0.6982,0.5632 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0965,0.5842,0.5574,0.7055 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.4884,0.6491,0.6238,0.6303 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8247,0.5602,0.5370,0.7323 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8695,0.8844,0.8515,0.4618 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8404,0.5758,0.5442,0.7226 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.5648,0.5837,0.5536,0.7103 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7448,0.3833,0.3549,1.1078 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0242,0.9534,0.9107,0.4318 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5619,0.5808,0.5388,0.7299 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1782,0.5531,0.5136,0.7656 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.0794,0.3297,0.2914,1.3495 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-avx2_fast_results.csv new file mode 100644 index 0000000..2be363e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-avx2_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3903,0.0896,0.0726,5.4142 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.6546,0.0440,0.0274,14.3536 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.2500,0.0520,0.0358,10.9751 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0123,0.0343,0.0191,20.5601 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0007,0.0761,0.0579,6.7866 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.1589,0.0388,0.0213,18.4912 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.3975,0.0431,0.0261,15.0923 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.6115,0.0318,0.0154,25.5316 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0498,0.0793,0.0607,6.4823 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.5038,0.0413,0.0233,16.9046 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3198,0.0431,0.0256,15.3883 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1307,0.0324,0.0160,24.5146 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.1756,0.0797,0.0569,6.9137 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.1871,0.0472,0.0250,15.7513 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.2337,0.0451,0.0234,16.8150 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.9954,0.0356,0.0149,26.3744 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1852,0.0578,0.0288,13.6419 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7171,0.0433,0.0149,26.4632 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5222,0.0419,0.0140,28.1272 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2506,0.0369,0.0096,40.8325 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-avx2_fastest_results.csv new file mode 100644 index 0000000..07d504b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-avx2_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.1020,0.0580,0.0415,9.4707 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.4493,0.0363,0.0203,19.3542 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,41.9856,0.0386,0.0234,16.8184 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,44.8290,0.0289,0.0144,27.2575 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.3207,0.0535,0.0364,10.8104 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,38.9922,0.0338,0.0175,22.4195 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.8300,0.0349,0.0192,20.5248 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.3913,0.0281,0.0129,30.5177 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.2778,0.0517,0.0346,11.3646 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.3638,0.0342,0.0176,22.3760 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.7609,0.0335,0.0173,22.7357 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8540,0.0277,0.0123,31.8699 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,29.9974,0.0596,0.0386,10.1967 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0644,0.0391,0.0190,20.7426 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.0182,0.0369,0.0174,22.6389 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8229,0.0308,0.0120,32.6782 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1147,0.0460,0.0212,18.5507 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6212,0.0364,0.0122,32.1990 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.4797,0.0347,0.0108,36.3347 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.1951,0.0312,0.0082,47.8659 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-avx2_medium_results.csv new file mode 100644 index 0000000..532611a --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-avx2_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.0887,0.1929,0.1750,2.2469 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.9182,0.1136,0.0959,4.1003 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.1886,0.1454,0.1283,3.0646 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.6672,0.1042,0.0878,4.4788 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7496,0.2382,0.2185,1.7994 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6013,0.1133,0.0943,4.1713 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.3582,0.1537,0.1352,2.9078 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.8509,0.0931,0.0752,5.2274 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5544,0.2401,0.2194,1.7925 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.9809,0.1049,0.0856,4.5951 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2175,0.1308,0.1115,3.5277 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.4889,0.0742,0.0559,7.0321 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7274,0.2543,0.2307,1.7045 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7027,0.1187,0.0951,4.1334 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2510,0.1351,0.1120,3.5121 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.2396,0.0797,0.0575,6.8389 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7798,0.2183,0.1861,2.1129 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3401,0.1118,0.0802,4.9049 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5669,0.1011,0.0700,5.6152 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3005,0.0692,0.0388,10.1261 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-avx2_thorough_results.csv new file mode 100644 index 0000000..964f0d1 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-avx2_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.2942,0.3944,0.3767,1.0439 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.1423,0.2885,0.2710,1.4512 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.5746,0.3579,0.3408,1.1537 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.1116,0.2756,0.2593,1.5166 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.9641,0.4775,0.4577,0.8591 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7378,0.3580,0.3387,1.1610 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.6387,0.4358,0.4172,0.9424 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.1312,0.3523,0.3341,1.1768 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.6958,0.5486,0.5277,0.7452 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0965,0.4382,0.4184,0.9399 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.4883,0.4912,0.4707,0.8354 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8247,0.4248,0.4058,0.9690 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8693,0.6434,0.6176,0.6367 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8400,0.4185,0.3938,0.9985 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.5630,0.4282,0.4034,0.9747 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7448,0.2804,0.2568,1.5310 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0242,0.7021,0.6664,0.5901 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5619,0.4240,0.3892,1.0103 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1776,0.4081,0.3738,1.0519 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.0794,0.2460,0.2123,1.8524 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse2_fast_results.csv new file mode 100644 index 0000000..dd7b4ae --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse2_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3903,0.1109,0.0933,4.2165 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.6546,0.0526,0.0355,11.0712 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.2500,0.0625,0.0458,8.5785 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0123,0.0404,0.0246,16.0131 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0007,0.0995,0.0808,4.8665 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.1589,0.0474,0.0294,13.3697 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.3975,0.0534,0.0357,11.0222 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.6115,0.0373,0.0206,19.1115 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0498,0.1090,0.0894,4.3965 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.5038,0.0532,0.0345,11.3949 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3198,0.0554,0.0370,10.6381 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1307,0.0396,0.0224,17.5676 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.1756,0.1090,0.0855,4.5976 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.1871,0.0604,0.0377,10.4324 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.2337,0.0568,0.0345,11.3909 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.9954,0.0425,0.0215,18.2756 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1852,0.0724,0.0426,9.2413 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7171,0.0511,0.0221,17.7918 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5222,0.0486,0.0205,19.2075 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2506,0.0417,0.0139,28.2462 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse2_fastest_results.csv new file mode 100644 index 0000000..77f11d1 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse2_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.1020,0.0714,0.0545,7.2163 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.4493,0.0429,0.0264,14.8918 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,41.9856,0.0462,0.0303,12.9783 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,44.8290,0.0337,0.0186,21.0853 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.3207,0.0691,0.0516,7.6215 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,38.9922,0.0414,0.0241,16.3052 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.8300,0.0428,0.0260,15.1166 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.3913,0.0329,0.0173,22.7488 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.2778,0.0683,0.0503,7.8151 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.3638,0.0428,0.0254,15.4513 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.7609,0.0415,0.0244,16.1380 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8540,0.0335,0.0172,22.9240 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,29.9974,0.0782,0.0567,6.9334 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0644,0.0487,0.0275,14.2904 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.0182,0.0452,0.0247,15.9222 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8229,0.0364,0.0172,22.8282 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1147,0.0563,0.0308,12.7552 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6212,0.0424,0.0174,22.5519 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.4797,0.0403,0.0158,24.8713 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.1951,0.0353,0.0117,33.7439 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse2_medium_results.csv new file mode 100644 index 0000000..b9d4a62 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse2_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.0887,0.2610,0.2426,1.6210 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.9182,0.1512,0.1333,2.9503 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.1886,0.1966,0.1792,2.1937 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.6672,0.1395,0.1229,3.1985 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7496,0.3472,0.3270,1.2026 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6013,0.1622,0.1424,2.7620 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.3582,0.2211,0.2020,1.9464 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.8509,0.1307,0.1123,3.5024 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5544,0.3515,0.3310,1.1879 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.9809,0.1521,0.1318,2.9841 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2175,0.1900,0.1705,2.3062 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.4889,0.1047,0.0860,4.5745 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7274,0.3843,0.3601,1.0919 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7027,0.1735,0.1500,2.6220 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2510,0.1977,0.1745,2.2528 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.2396,0.1124,0.0898,4.3808 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7798,0.3187,0.2861,1.3744 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3401,0.1569,0.1247,3.1544 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5669,0.1390,0.1070,3.6736 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3005,0.0903,0.0595,6.6132 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse2_thorough_results.csv new file mode 100644 index 0000000..9f83066 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse2_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.2942,0.5362,0.5170,0.7606 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.1423,0.3858,0.3677,1.0693 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.5746,0.4871,0.4697,0.8371 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.1116,0.3771,0.3601,1.0921 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.9641,0.6873,0.6671,0.5894 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7378,0.5135,0.4936,0.7967 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.6387,0.6280,0.6084,0.6463 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.1312,0.5095,0.4909,0.8010 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.6958,0.8094,0.7886,0.4986 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0965,0.6512,0.6309,0.6233 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.4883,0.7224,0.7027,0.5596 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8247,0.6301,0.6110,0.6436 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8693,0.9769,0.9511,0.4134 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8400,0.6414,0.6159,0.6384 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.5630,0.6471,0.6221,0.6321 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7448,0.4243,0.4002,0.9825 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0242,1.0557,1.0188,0.3860 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5619,0.6387,0.6035,0.6515 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1776,0.6090,0.5744,0.6845 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.0794,0.3630,0.3283,1.1977 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse4.1_fast_results.csv new file mode 100644 index 0000000..074f21d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse4.1_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3903,0.0992,0.0819,4.8038 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.6546,0.0483,0.0316,12.4279 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.2500,0.0568,0.0407,9.6554 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0123,0.0374,0.0221,17.8290 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0007,0.0882,0.0698,5.6310 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.1589,0.0435,0.0257,15.2776 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.3975,0.0484,0.0312,12.5930 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.6115,0.0344,0.0182,21.6051 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0498,0.0960,0.0772,5.0949 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.5038,0.0481,0.0298,13.2023 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3198,0.0501,0.0324,12.1449 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1307,0.0365,0.0199,19.7635 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.1756,0.0973,0.0744,5.2859 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.1871,0.0550,0.0326,12.0489 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.2337,0.0521,0.0302,13.0247 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.9954,0.0395,0.0190,20.6825 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1852,0.0673,0.0379,10.3764 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7171,0.0480,0.0195,20.1349 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5222,0.0462,0.0181,21.7533 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2506,0.0399,0.0125,31.4272 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse4.1_fastest_results.csv new file mode 100644 index 0000000..3d8aa1b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse4.1_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.1020,0.0643,0.0477,8.2392 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.4493,0.0393,0.0233,16.8638 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,41.9856,0.0423,0.0268,14.6782 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,44.8290,0.0312,0.0168,23.3793 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.3207,0.0615,0.0441,8.9144 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,38.9922,0.0378,0.0210,18.7459 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.8300,0.0389,0.0226,17.4137 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.3913,0.0303,0.0152,25.8356 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.2778,0.0611,0.0433,9.0781 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.3638,0.0391,0.0222,17.7046 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.7609,0.0379,0.0214,18.3660 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8540,0.0308,0.0154,25.5685 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,29.9974,0.0706,0.0494,7.9532 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0644,0.0445,0.0241,16.3465 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.0182,0.0416,0.0216,18.2423 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8229,0.0340,0.0151,26.0630 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1147,0.0522,0.0272,14.4422 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6212,0.0397,0.0154,25.5119 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.4797,0.0378,0.0139,28.1955 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.1951,0.0336,0.0104,37.8385 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse4.1_medium_results.csv new file mode 100644 index 0000000..f5ba5cb --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse4.1_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.0887,0.2276,0.2095,1.8769 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.9182,0.1314,0.1140,3.4498 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.1886,0.1712,0.1542,2.5494 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.6672,0.1221,0.1058,3.7172 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7496,0.2983,0.2783,1.4130 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6013,0.1397,0.1204,3.2669 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.3582,0.1925,0.1735,2.2659 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.8509,0.1137,0.0958,4.1025 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5544,0.3061,0.2859,1.3754 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.9809,0.1318,0.1121,3.5089 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2175,0.1645,0.1455,2.7017 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.4889,0.0932,0.0744,5.2850 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7274,0.3385,0.3147,1.2494 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7027,0.1533,0.1300,3.0255 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2510,0.1745,0.1516,2.5936 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.2396,0.1002,0.0782,5.0300 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7798,0.2860,0.2535,1.5511 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3401,0.1424,0.1104,3.5614 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5669,0.1263,0.0950,4.1373 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3005,0.0835,0.0529,7.4336 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse4.1_thorough_results.csv new file mode 100644 index 0000000..6b75de3 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-3.7-sse4.1_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.2942,0.4696,0.4519,0.8701 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.1423,0.3416,0.3241,1.2133 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.5746,0.4272,0.4099,0.9594 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.1116,0.3299,0.3136,1.2539 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.9641,0.5967,0.5769,0.6816 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7378,0.4482,0.4291,0.9163 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.6387,0.5454,0.5268,0.7465 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.1312,0.4421,0.4241,0.9273 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.6958,0.7055,0.6851,0.5739 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0965,0.5672,0.5470,0.7189 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.4883,0.6344,0.6150,0.6394 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8247,0.5491,0.5301,0.7417 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8693,0.8637,0.8383,0.4691 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8400,0.5655,0.5397,0.7286 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.5630,0.5728,0.5485,0.7168 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7448,0.3745,0.3509,1.1206 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0242,0.9367,0.9012,0.4363 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5619,0.5698,0.5350,0.7349 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1776,0.5433,0.5088,0.7728 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.0794,0.3234,0.2893,1.3591 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-avx2_fast_results.csv new file mode 100644 index 0000000..01416d2 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-avx2_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.5037,0.0930,0.0644,6.1072 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.7773,0.0507,0.0224,17.5832 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.3817,0.0684,0.0386,10.1904 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.1886,0.0415,0.0147,26.7969 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0664,0.0769,0.0476,8.2657 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.2079,0.0470,0.0167,23.5247 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.5015,0.0502,0.0206,19.0539 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.7220,0.0390,0.0120,32.7652 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0897,0.0754,0.0459,8.5683 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.5310,0.0477,0.0185,21.2124 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3965,0.0490,0.0202,19.4315 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1894,0.0406,0.0125,31.3567 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.2371,0.0728,0.0425,9.2564 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.2197,0.0494,0.0205,19.2084 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.3109,0.0468,0.0185,21.2954 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,36.0721,0.0394,0.0116,33.9209 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.2003,0.0552,0.0237,16.5971 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7467,0.0453,0.0125,31.3543 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5515,0.0428,0.0110,35.8023 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2875,0.0364,0.0077,50.9489 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-avx2_fastest_results.csv new file mode 100644 index 0000000..3f98894 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-avx2_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3575,0.0672,0.0377,10.4207 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.5882,0.0445,0.0159,24.7137 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.1919,0.0484,0.0196,20.0436 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0386,0.0390,0.0109,35.9631 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.5102,0.0598,0.0303,12.9933 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.0208,0.0425,0.0131,30.0945 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.9937,0.0441,0.0151,26.0235 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.4855,0.0370,0.0097,40.7186 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.4635,0.0562,0.0270,14.5900 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4175,0.0432,0.0138,28.4626 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.9089,0.0416,0.0135,29.1575 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8833,0.0370,0.0098,40.2761 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.0946,0.0591,0.0295,13.3393 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0858,0.0445,0.0151,25.9568 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.1187,0.0430,0.0136,28.9553 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8655,0.0370,0.0094,41.6145 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1258,0.0492,0.0171,22.9562 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6577,0.0397,0.0096,41.1740 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5098,0.0385,0.0087,45.0570 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2432,0.0355,0.0064,61.1633 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-avx2_medium_results.csv new file mode 100644 index 0000000..82a59d2 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-avx2_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.1655,0.1653,0.1363,2.8856 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.0334,0.1041,0.0748,5.2538 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.3144,0.1282,0.1001,3.9298 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.8271,0.0955,0.0678,5.7981 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7882,0.1747,0.1447,2.7168 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6707,0.0969,0.0680,5.7850 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.4398,0.1200,0.0920,4.2748 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.9749,0.0822,0.0550,7.1516 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5735,0.1726,0.1428,2.7542 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0183,0.0910,0.0621,6.3301 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2593,0.1063,0.0781,5.0360 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.5651,0.0711,0.0440,8.9441 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7470,0.1823,0.1525,2.5788 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7193,0.1011,0.0734,5.3565 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2897,0.1106,0.0817,4.8101 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.3060,0.0748,0.0471,8.3572 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7841,0.1520,0.1204,3.2665 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3456,0.0930,0.0621,6.3324 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5895,0.0841,0.0536,7.3352 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3363,0.0611,0.0316,12.4455 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-avx2_thorough_results.csv new file mode 100644 index 0000000..55d6a7f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-avx2_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.3484,0.3015,0.2708,1.4520 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.2464,0.1953,0.1660,2.3694 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.6892,0.2588,0.2297,1.7121 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.2835,0.1906,0.1633,2.4086 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,36.0014,0.3291,0.2989,1.3156 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7927,0.2142,0.1845,2.1315 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.7140,0.2813,0.2545,1.5450 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.2322,0.2158,0.1883,2.0885 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.7232,0.3527,0.3224,1.2195 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.1395,0.2443,0.2145,1.8334 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.5457,0.3055,0.2766,1.4218 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8797,0.2477,0.2201,1.7866 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8896,0.4174,0.3860,1.0187 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8625,0.2838,0.2543,1.5460 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.6007,0.2935,0.2633,1.4936 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7848,0.2100,0.1829,2.1501 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0271,0.4668,0.4355,0.9029 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5727,0.3127,0.2797,1.4059 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1969,0.3063,0.2761,1.4240 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.1088,0.2005,0.1704,2.3074 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-neon_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-neon_fast_results.csv new file mode 100644 index 0000000..074a08f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-neon_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.5037,0.1339,0.1150,3.4180 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.7773,0.0582,0.0398,9.8806 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.3817,0.0782,0.0593,6.6261 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.1886,0.0469,0.0285,13.7932 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0664,0.1041,0.0848,4.6350 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.2079,0.0477,0.0296,13.3041 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.5015,0.0540,0.0365,10.7709 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.7220,0.0371,0.0208,18.9447 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0897,0.1023,0.0830,4.7400 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.5310,0.0516,0.0337,11.6854 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3965,0.0537,0.0362,10.8482 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1894,0.0387,0.0223,17.6155 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.2371,0.0993,0.0803,4.8969 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.2197,0.0567,0.0387,10.1701 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.3109,0.0515,0.0341,11.5174 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,36.0721,0.0371,0.0208,18.9062 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.2003,0.0655,0.0460,8.5513 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7467,0.0415,0.0230,17.1104 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5515,0.0372,0.0194,20.2992 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2875,0.0297,0.0128,30.6481 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-neon_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-neon_fastest_results.csv new file mode 100644 index 0000000..83beed1 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-neon_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3575,0.0855,0.0670,5.8692 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.5882,0.0457,0.0281,14.0125 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.1919,0.0511,0.0341,11.5329 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0386,0.0342,0.0182,21.5768 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.5102,0.0724,0.0542,7.2494 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.0208,0.0403,0.0228,17.2100 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.9937,0.0431,0.0262,15.0037 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.4855,0.0322,0.0164,23.9737 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.4635,0.0667,0.0486,8.0856 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4175,0.0422,0.0248,15.8395 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.9089,0.0410,0.0241,16.3132 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8833,0.0325,0.0167,23.5515 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.0946,0.0731,0.0549,7.1610 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0858,0.0457,0.0281,14.0114 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.1187,0.0418,0.0247,15.8907 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8655,0.0323,0.0162,24.3205 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1258,0.0507,0.0319,12.3172 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6577,0.0352,0.0170,23.0951 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5098,0.0320,0.0145,27.0718 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2432,0.0269,0.0102,38.6725 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-neon_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-neon_medium_results.csv new file mode 100644 index 0000000..01d14a5 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-neon_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.1655,0.3165,0.2929,1.3425 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.0334,0.1861,0.1639,2.3987 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.3144,0.2396,0.2181,1.8028 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.8271,0.1681,0.1479,2.6581 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7882,0.3515,0.3281,1.1986 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6707,0.1773,0.1549,2.5387 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.4398,0.2299,0.2081,1.8895 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.9749,0.1445,0.1236,3.1807 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5735,0.3580,0.3342,1.1766 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0183,0.1651,0.1432,2.7462 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2593,0.2010,0.1791,2.1954 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.5651,0.1214,0.1015,3.8732 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7470,0.3963,0.3717,1.0579 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7193,0.2001,0.1767,2.2251 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2897,0.2229,0.1998,1.9676 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.3060,0.1345,0.1131,3.4770 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7841,0.3351,0.3096,1.2700 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3456,0.1817,0.1565,2.5119 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5895,0.1589,0.1348,2.9160 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3363,0.1011,0.0785,5.0115 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-neon_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-neon_thorough_results.csv new file mode 100644 index 0000000..2e2415c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-neon_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.3484,0.6275,0.6022,0.6530 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.2464,0.4007,0.3763,1.0448 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.6892,0.5409,0.5177,0.7595 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.2835,0.3975,0.3758,1.0465 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,36.0014,0.7360,0.7106,0.5533 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7927,0.4650,0.4407,0.8922 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.7140,0.6402,0.6161,0.6382 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.2322,0.4768,0.4545,0.8652 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.7232,0.8207,0.7953,0.4944 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.1395,0.5575,0.5325,0.7385 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.5457,0.7050,0.6813,0.5772 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8797,0.5641,0.5418,0.7258 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8896,1.0570,1.0302,0.3817 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8625,0.7134,0.6869,0.5725 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.6007,0.7308,0.7054,0.5575 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7848,0.5139,0.4883,0.8052 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0271,1.2826,1.2524,0.3140 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5727,0.8517,0.8222,0.4783 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1969,0.8085,0.7803,0.5039 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.1088,0.5198,0.4917,0.7996 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse2_fast_results.csv new file mode 100644 index 0000000..3b6909f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse2_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.5037,0.1131,0.0838,4.6914 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.7773,0.0582,0.0297,13.2227 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.3817,0.0657,0.0396,9.9380 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.1886,0.0468,0.0197,19.9127 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0664,0.0961,0.0668,5.8903 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.2079,0.0525,0.0237,16.5887 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.5015,0.0577,0.0290,13.5485 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.7220,0.0434,0.0163,24.1739 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0897,0.0971,0.0678,5.8020 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.5310,0.0560,0.0274,14.3378 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3965,0.0573,0.0296,13.2790 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1894,0.0442,0.0178,22.0611 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.2371,0.0945,0.0648,6.0665 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.2197,0.0602,0.0317,12.3999 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.3109,0.0559,0.0277,14.1945 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,36.0721,0.0444,0.0173,22.6716 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.2003,0.0655,0.0351,11.2117 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7467,0.0493,0.0183,21.5202 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5515,0.0460,0.0160,24.5760 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2875,0.0409,0.0108,36.5618 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse2_fastest_results.csv new file mode 100644 index 0000000..cc7f8b9 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse2_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3575,0.0790,0.0494,7.9660 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.5882,0.0491,0.0210,18.7334 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.1919,0.0530,0.0256,15.3781 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0386,0.0456,0.0178,22.1218 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.5102,0.0711,0.0424,9.2713 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.0208,0.0470,0.0183,21.4846 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.9937,0.0492,0.0208,18.9310 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.4855,0.0413,0.0130,30.1870 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.4635,0.0693,0.0400,9.8216 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4175,0.0496,0.0207,19.0198 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.9089,0.0476,0.0199,19.7198 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8833,0.0411,0.0135,29.0927 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.0946,0.0748,0.0452,8.6929 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0858,0.0516,0.0230,17.0836 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.1187,0.0490,0.0203,19.3417 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8655,0.0427,0.0134,29.4192 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1258,0.0582,0.0249,15.7607 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6577,0.0462,0.0137,28.7926 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5098,0.0442,0.0120,32.6510 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2432,0.0400,0.0086,45.5586 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse2_medium_results.csv new file mode 100644 index 0000000..9959838 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse2_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.1655,0.2124,0.1828,2.1507 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.0334,0.1288,0.1001,3.9288 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.3144,0.1638,0.1359,2.8943 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.8271,0.1188,0.0915,4.2997 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7882,0.2399,0.2123,1.8518 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6707,0.1280,0.0997,3.9428 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.4398,0.1629,0.1352,2.9089 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.9749,0.1089,0.0816,4.8207 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5735,0.2436,0.2151,1.8284 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0183,0.1245,0.0957,4.1091 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2593,0.1473,0.1195,3.2903 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.5651,0.0963,0.0688,5.7188 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7470,0.2667,0.2362,1.6645 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7193,0.1460,0.1169,3.3640 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2897,0.1569,0.1281,3.0694 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.3060,0.1035,0.0751,5.2336 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7841,0.2123,0.1795,2.1907 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3456,0.1257,0.0944,4.1657 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5895,0.1115,0.0810,4.8527 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3363,0.0767,0.0475,8.2742 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse2_thorough_results.csv new file mode 100644 index 0000000..52c8152 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse2_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.3484,0.4009,0.3698,1.0634 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.2464,0.2540,0.2272,1.7308 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.6892,0.3403,0.3123,1.2590 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.2835,0.2491,0.2214,1.7763 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,36.0014,0.4617,0.4308,0.9127 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7927,0.2976,0.2680,1.4670 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.7140,0.3961,0.3701,1.0625 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.2322,0.3000,0.2723,1.4442 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.7232,0.5112,0.4811,0.8174 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.1395,0.3489,0.3202,1.2281 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.5457,0.4392,0.4106,0.9578 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8797,0.3557,0.3278,1.1994 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8896,0.6234,0.5913,0.6650 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8625,0.4248,0.3963,0.9923 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.6007,0.4383,0.4080,0.9638 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7848,0.3159,0.2868,1.3712 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0271,0.6739,0.6387,0.6156 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5727,0.4520,0.4188,0.9390 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1969,0.4444,0.4091,0.9611 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.1088,0.2889,0.2575,1.5271 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse4.1_fast_results.csv new file mode 100644 index 0000000..9a33c8f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse4.1_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.5037,0.0985,0.0703,5.5896 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.7773,0.0521,0.0245,16.0286 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.3817,0.0602,0.0326,12.0548 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.1886,0.0423,0.0161,24.4477 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0664,0.0828,0.0543,7.2440 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.2079,0.0473,0.0191,20.5506 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.5015,0.0507,0.0237,16.5929 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.7220,0.0403,0.0137,28.6954 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0897,0.0851,0.0561,7.0052 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.5310,0.0509,0.0226,17.4198 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3965,0.0523,0.0250,15.7407 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1894,0.0423,0.0150,26.1378 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.2371,0.0831,0.0546,7.2037 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.2197,0.0545,0.0266,14.8058 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.3109,0.0506,0.0234,16.8293 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,36.0721,0.0409,0.0147,26.8147 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.2003,0.0619,0.0310,12.6648 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7467,0.0464,0.0161,24.4173 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5515,0.0447,0.0140,28.1392 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2875,0.0393,0.0098,40.2594 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse4.1_fastest_results.csv new file mode 100644 index 0000000..c9b783f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse4.1_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3575,0.0692,0.0409,9.6242 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.5882,0.0457,0.0175,22.5095 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.1919,0.0494,0.0214,18.3719 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0386,0.0380,0.0119,33.1691 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.5102,0.0634,0.0351,11.2158 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.0208,0.0472,0.0181,21.6758 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.9937,0.0438,0.0169,23.2288 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.4855,0.0371,0.0109,36.1943 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.4635,0.0613,0.0327,12.0316 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4175,0.0455,0.0168,23.3876 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.9089,0.0432,0.0162,24.3388 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8833,0.0381,0.0112,35.0803 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.0946,0.0668,0.0378,10.4139 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0858,0.0458,0.0193,20.4047 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.1187,0.0443,0.0170,23.0764 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8655,0.0380,0.0113,34.9251 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1258,0.0532,0.0221,17.8062 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6577,0.0427,0.0122,32.1676 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5098,0.0399,0.0107,36.7353 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2432,0.0340,0.0076,51.7190 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse4.1_medium_results.csv new file mode 100644 index 0000000..a5d7840 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse4.1_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.1655,0.1818,0.1533,2.5656 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.0334,0.1119,0.0836,4.7025 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.3144,0.1439,0.1156,3.4011 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.8271,0.1033,0.0763,5.1515 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7882,0.2001,0.1718,2.2890 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6707,0.1087,0.0807,4.8724 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.4398,0.1375,0.1102,3.5696 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.9749,0.0924,0.0657,5.9838 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5735,0.2035,0.1756,2.2396 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0183,0.1057,0.0776,5.0648 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2593,0.1231,0.0971,4.0491 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.5651,0.0820,0.0554,7.1022 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7470,0.2258,0.1986,1.9799 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7193,0.1257,0.0966,4.0717 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2897,0.1358,0.1076,3.6539 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.3060,0.0896,0.0622,6.3191 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7841,0.1901,0.1583,2.4842 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3456,0.1133,0.0831,4.7335 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5895,0.1012,0.0711,5.5330 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3363,0.0707,0.0419,9.3923 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse4.1_thorough_results.csv new file mode 100644 index 0000000..5b8d8f5 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-4.8-sse4.1_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.3484,0.3366,0.3093,1.2711 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.2464,0.2190,0.1902,2.0672 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.6892,0.2847,0.2599,1.5131 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.2835,0.2133,0.1858,2.1163 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,36.0014,0.3829,0.3530,1.1138 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7927,0.2492,0.2204,1.7844 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.7140,0.3293,0.3023,1.3005 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.2322,0.2487,0.2236,1.7588 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.7232,0.4256,0.3965,0.9918 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.1395,0.2928,0.2641,1.4891 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.5457,0.3641,0.3373,1.1657 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8797,0.2969,0.2701,1.4556 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8896,0.5275,0.4997,0.7869 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8625,0.3651,0.3351,1.1733 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.6007,0.3716,0.3438,1.1437 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7848,0.2693,0.2410,1.6316 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0271,0.6020,0.5660,0.6947 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5727,0.4022,0.3711,1.0597 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1969,0.3955,0.3638,1.0809 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.1088,0.2538,0.2258,1.7415 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-avx2_fast_results.csv new file mode 100644 index 0000000..d3fde0d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-avx2_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.5039,0.0944,0.0671,5.8569 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.7773,0.0490,0.0228,17.2789 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.3820,0.0570,0.0315,12.4866 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.1881,0.0400,0.0152,25.8340 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0641,0.0762,0.0493,7.9721 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.2066,0.0440,0.0170,23.1181 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.4967,0.0462,0.0211,18.6774 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.7256,0.0383,0.0121,32.5563 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0921,0.0745,0.0476,8.2675 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.5310,0.0464,0.0190,20.6945 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3931,0.0472,0.0209,18.8288 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1878,0.0384,0.0127,31.0380 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.2368,0.0726,0.0438,8.9765 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.2169,0.0482,0.0213,18.4782 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.3123,0.0458,0.0188,20.8858 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,36.0712,0.0379,0.0118,33.4117 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1998,0.0539,0.0243,16.1519 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7521,0.0431,0.0127,30.9060 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5479,0.0388,0.0112,35.1177 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2835,0.0353,0.0078,50.3932 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-avx2_fastest_results.csv new file mode 100644 index 0000000..494150d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-avx2_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3577,0.0633,0.0371,10.5919 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.5883,0.0420,0.0160,24.6023 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.1921,0.0448,0.0195,20.1990 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0381,0.0332,0.0108,36.2708 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.5086,0.0576,0.0304,12.9305 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.0209,0.0388,0.0131,29.9703 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.9861,0.0406,0.0150,26.2059 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.4885,0.0345,0.0096,41.0541 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.4699,0.0528,0.0268,14.6471 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4160,0.0400,0.0139,28.3335 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.9035,0.0397,0.0136,28.8661 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8842,0.0345,0.0096,41.1012 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.0906,0.0572,0.0294,13.3615 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0829,0.0419,0.0152,25.8170 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.1183,0.0399,0.0137,28.6098 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8663,0.0346,0.0093,42.3399 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1264,0.0456,0.0171,22.9841 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6623,0.0382,0.0096,40.8528 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.4993,0.0367,0.0086,45.9035 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2350,0.0326,0.0062,63.7817 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-avx2_medium_results.csv new file mode 100644 index 0000000..57a862a --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-avx2_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.1636,0.1809,0.1524,2.5805 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.0331,0.1121,0.0848,4.6356 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.3117,0.1400,0.1121,3.5084 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.8252,0.1028,0.0770,5.1095 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7899,0.1902,0.1644,2.3921 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6696,0.1030,0.0753,5.2196 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.4312,0.1306,0.1043,3.7712 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.9733,0.0878,0.0609,6.4619 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5755,0.1906,0.1613,2.4379 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0178,0.0968,0.0692,5.6840 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2570,0.1160,0.0892,4.4084 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.5606,0.0725,0.0478,8.2297 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7477,0.2010,0.1718,2.2885 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7189,0.1101,0.0822,4.7845 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2922,0.1182,0.0917,4.2904 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.3076,0.0777,0.0516,7.6194 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7853,0.1643,0.1335,2.9450 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3490,0.0980,0.0683,5.7598 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5826,0.0988,0.0698,5.6330 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3303,0.0687,0.0411,9.5747 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-avx2_thorough_results.csv new file mode 100644 index 0000000..65cd2b8 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-avx2_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.3473,0.3274,0.2993,1.3137 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.2450,0.2010,0.1735,2.2662 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.6851,0.2863,0.2603,1.5109 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.2825,0.1952,0.1702,2.3097 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,36.0014,0.3459,0.3181,1.2361 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7908,0.2200,0.1925,2.0424 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.7086,0.2992,0.2733,1.4390 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.2321,0.2401,0.2137,1.8402 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.7244,0.3852,0.3573,1.1006 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.1389,0.2632,0.2338,1.6819 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.5441,0.3574,0.3300,1.1917 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8787,0.2628,0.2369,1.6599 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8908,0.4606,0.4316,0.9110 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8627,0.3175,0.2910,1.3513 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.6055,0.3174,0.2893,1.3594 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7929,0.2178,0.1895,2.0747 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0311,0.5403,0.5072,0.7753 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5774,0.3524,0.3233,1.2162 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1959,0.3589,0.3291,1.1947 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.1096,0.2133,0.1865,2.1082 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse2_fast_results.csv new file mode 100644 index 0000000..a575b74 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse2_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.5039,0.1092,0.0844,4.6578 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.7773,0.0540,0.0302,13.0131 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.3820,0.0630,0.0399,9.8642 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.1881,0.0425,0.0202,19.5066 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0641,0.0915,0.0669,5.8735 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.2066,0.0475,0.0239,16.4760 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.4967,0.0522,0.0292,13.4718 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.7256,0.0387,0.0166,23.6237 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0921,0.0927,0.0683,5.7608 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.5310,0.0518,0.0279,14.0903 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3931,0.0534,0.0301,13.0485 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1878,0.0407,0.0184,21.3647 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.2368,0.0898,0.0654,6.0100 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.2169,0.0560,0.0321,12.2348 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.3123,0.0515,0.0282,13.9394 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,36.0712,0.0403,0.0177,22.1643 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1998,0.0607,0.0353,11.1361 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7521,0.0435,0.0187,21.0320 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5479,0.0419,0.0162,24.2041 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2835,0.0371,0.0112,35.0022 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse2_fastest_results.csv new file mode 100644 index 0000000..2788f94 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse2_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3577,0.0738,0.0496,7.9346 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.5883,0.0445,0.0214,18.4169 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.1921,0.0487,0.0260,15.1273 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0381,0.0368,0.0149,26.4632 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.5086,0.0668,0.0427,9.2027 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.0209,0.0420,0.0186,21.1179 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.9861,0.0438,0.0211,18.6438 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.4885,0.0354,0.0134,29.3840 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.4699,0.0645,0.0402,9.7822 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4160,0.0446,0.0210,18.7585 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.9035,0.0426,0.0203,19.3295 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8842,0.0362,0.0140,28.0650 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.0906,0.0706,0.0456,8.6154 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0829,0.0471,0.0234,16.8394 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.1183,0.0440,0.0209,18.8483 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8663,0.0367,0.0139,28.2646 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1264,0.0522,0.0255,15.4335 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6623,0.0401,0.0141,27.9196 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.4993,0.0376,0.0125,31.4548 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2350,0.0329,0.0092,42.7781 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse2_medium_results.csv new file mode 100644 index 0000000..eebf8e2 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse2_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.1636,0.2105,0.1852,2.1231 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.0331,0.1248,0.1007,3.9065 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.3117,0.1598,0.1376,2.8586 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.8252,0.1144,0.0917,4.2879 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7899,0.2367,0.2118,1.8566 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6696,0.1244,0.1001,3.9292 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.4312,0.1596,0.1362,2.8872 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.9733,0.1158,0.0929,4.2318 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5755,0.2424,0.2175,1.8082 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0178,0.1198,0.0961,4.0924 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2570,0.1420,0.1191,3.3008 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.5606,0.0917,0.0694,5.6658 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7477,0.2637,0.2366,1.6621 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7189,0.1423,0.1170,3.3620 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2922,0.1532,0.1293,3.0411 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.3076,0.0978,0.0749,5.2520 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7853,0.2076,0.1802,2.1815 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3490,0.1219,0.0950,4.1389 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5826,0.1064,0.0806,4.8770 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3303,0.0726,0.0478,8.2197 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse2_thorough_results.csv new file mode 100644 index 0000000..fb0ab91 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse2_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.3473,0.3963,0.3704,1.0616 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.2450,0.2522,0.2278,1.7263 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.6851,0.3353,0.3117,1.2614 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.2825,0.2487,0.2258,1.7417 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,36.0014,0.4589,0.4336,0.9068 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7908,0.2975,0.2721,1.4452 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.7086,0.3958,0.3718,1.0577 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.2321,0.2986,0.2752,1.4291 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.7244,0.5087,0.4833,0.8137 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.1389,0.3446,0.3199,1.2290 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.5441,0.4339,0.4100,0.9591 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8787,0.3525,0.3294,1.1936 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8908,0.6146,0.5887,0.6679 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8627,0.4213,0.3964,0.9920 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.6055,0.4308,0.4060,0.9686 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7929,0.3116,0.2876,1.3675 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0311,0.6671,0.6365,0.6178 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5774,0.4506,0.4219,0.9321 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1959,0.4376,0.4094,0.9605 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.1096,0.2873,0.2604,1.5103 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse4.1_fast_results.csv new file mode 100644 index 0000000..47f9402 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse4.1_fast_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.5039,0.0981,0.0738,5.3272 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.7773,0.0502,0.0255,15.4462 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.3820,0.0579,0.0339,11.5928 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.1881,0.0407,0.0164,23.9288 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.0641,0.0814,0.0557,7.0608 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.2066,0.0457,0.0195,20.1155 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,39.4967,0.0489,0.0246,15.9734 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.7256,0.0377,0.0141,27.9017 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.0921,0.0849,0.0582,6.7538 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.5310,0.0493,0.0234,16.7883 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,37.3931,0.0507,0.0261,15.0409 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,39.1878,0.0387,0.0154,25.5966 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.2368,0.0826,0.0562,7.0013 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.2169,0.0524,0.0271,14.4932 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.3123,0.0498,0.0243,16.1883 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,36.0712,0.0392,0.0148,26.5848 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1998,0.0590,0.0313,12.5467 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.7521,0.0436,0.0167,23.4771 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.5479,0.0421,0.0150,26.2146 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2835,0.0363,0.0095,41.4524 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse4.1_fastest_results.csv new file mode 100644 index 0000000..26e9581 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse4.1_fastest_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,38.3577,0.0690,0.0430,9.1460 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,42.5883,0.0430,0.0180,21.8916 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,42.1921,0.0465,0.0221,17.7579 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.0381,0.0357,0.0120,32.7437 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,34.5086,0.0617,0.0363,10.8208 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.0209,0.0414,0.0155,25.2940 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,38.9861,0.0425,0.0180,21.8466 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,41.4885,0.0352,0.0108,36.2684 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,32.4699,0.0609,0.0346,11.3692 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,36.4160,0.0423,0.0173,22.7686 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,36.9035,0.0421,0.0171,23.0030 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,38.8842,0.0349,0.0114,34.5983 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.0906,0.0657,0.0390,10.0817 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.0829,0.0458,0.0199,19.7854 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,34.1183,0.0437,0.0175,22.4231 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,35.8663,0.0352,0.0115,34.3326 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.1264,0.0509,0.0226,17.4142 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,29.6623,0.0393,0.0122,32.2362 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,30.4993,0.0372,0.0104,37.7874 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,32.2350,0.0330,0.0076,52.0142 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse4.1_medium_results.csv new file mode 100644 index 0000000..6e3e075 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse4.1_medium_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.1636,0.2087,0.1805,2.1790 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.0331,0.1222,0.0964,4.0780 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.3117,0.1575,0.1320,2.9787 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,45.8252,0.1108,0.0866,4.5410 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,35.7899,0.2255,0.1988,1.9776 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.6696,0.1195,0.0936,4.1991 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.4312,0.1555,0.1304,3.0165 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,42.9733,0.0980,0.0732,5.3703 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.5755,0.2276,0.2007,1.9591 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.0178,0.1129,0.0868,4.5284 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.2570,0.1393,0.1137,3.4580 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.5606,0.0866,0.0627,6.2761 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.7477,0.2831,0.2554,1.5396 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.7189,0.1532,0.1251,3.1422 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.2922,0.1641,0.1362,2.8876 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.3076,0.0974,0.0721,5.4573 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,27.7853,0.2212,0.1921,2.0468 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.3490,0.1120,0.0846,4.6495 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,31.5826,0.0986,0.0718,5.4733 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,33.3303,0.0680,0.0423,9.3032 diff --git a/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse4.1_thorough_results.csv new file mode 100644 index 0000000..48c29cf --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/KodakSim/astc_reference-5.0-sse4.1_thorough_results.csv @@ -0,0 +1,21 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +KodakSim,4x4,ldr-rgba-kodak22+24+nca.png,39.3473,0.3343,0.3084,1.2750 +KodakSim,4x4,ldr-rgba-kodak22+ca.png,43.2450,0.2152,0.1895,2.0752 +KodakSim,4x4,ldr-rgba-kodak23+20+nca.png,43.6851,0.2845,0.2609,1.5072 +KodakSim,4x4,ldr-rgba-kodak23+ca.png,46.2825,0.2103,0.1864,2.1093 +KodakSim,5x5,ldr-rgba-kodak22+24+nca.png,36.0014,0.3773,0.3526,1.1153 +KodakSim,5x5,ldr-rgba-kodak22+ca.png,39.7908,0.2445,0.2183,1.8010 +KodakSim,5x5,ldr-rgba-kodak23+20+nca.png,40.7086,0.3262,0.3008,1.3071 +KodakSim,5x5,ldr-rgba-kodak23+ca.png,43.2321,0.2462,0.2237,1.7576 +KodakSim,6x6,ldr-rgba-kodak22+24+nca.png,33.7244,0.4209,0.3948,0.9961 +KodakSim,6x6,ldr-rgba-kodak22+ca.png,37.1389,0.2873,0.2622,1.4996 +KodakSim,6x6,ldr-rgba-kodak23+20+nca.png,38.5441,0.3587,0.3356,1.1716 +KodakSim,6x6,ldr-rgba-kodak23+ca.png,40.8787,0.2921,0.2689,1.4622 +KodakSim,8x8,ldr-rgba-kodak22+24+nca.png,30.8908,0.5222,0.4962,0.7925 +KodakSim,8x8,ldr-rgba-kodak22+ca.png,33.8627,0.3599,0.3331,1.1806 +KodakSim,8x8,ldr-rgba-kodak23+20+nca.png,35.6055,0.3659,0.3407,1.1540 +KodakSim,8x8,ldr-rgba-kodak23+ca.png,37.7929,0.2656,0.2408,1.6329 +KodakSim,12x12,ldr-rgba-kodak22+24+nca.png,28.0311,0.5911,0.5610,0.7010 +KodakSim,12x12,ldr-rgba-kodak22+ca.png,30.5774,0.3939,0.3664,1.0731 +KodakSim,12x12,ldr-rgba-kodak23+20+nca.png,32.1959,0.3898,0.3590,1.0953 +KodakSim,12x12,ldr-rgba-kodak23+ca.png,34.1096,0.2519,0.2251,1.7466 diff --git a/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-00.hdr b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-00.hdr new file mode 100644 index 0000000..fb764df Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-00.hdr differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-r16.ktx b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-r16.ktx new file mode 100644 index 0000000..c3c2102 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-r16.ktx differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-r32.ktx b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-r32.ktx new file mode 100644 index 0000000..a5b660b Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-r32.ktx differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-rg16.ktx b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-rg16.ktx new file mode 100644 index 0000000..c0f651d Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-rg16.ktx differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-rg32.ktx b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-rg32.ktx new file mode 100644 index 0000000..6ffb19e Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-rg32.ktx differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-rgb16.ktx b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-rgb16.ktx new file mode 100644 index 0000000..e75ea02 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-rgb16.ktx differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-rgb32.ktx b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-rgb32.ktx new file mode 100644 index 0000000..5286bcb Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGB/hdr-rgb-rgb32.ktx differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/HDR-RGBA/hdr-rgba-rgba16.ktx b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGBA/hdr-rgba-rgba16.ktx new file mode 100644 index 0000000..8abff2c Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGBA/hdr-rgba-rgba16.ktx differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/HDR-RGBA/hdr-rgba-rgba32.ktx b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGBA/hdr-rgba-rgba32.ktx new file mode 100644 index 0000000..e40c3ec Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/HDR-RGBA/hdr-rgba-rgba32.ktx differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-L/ldr-l-00-3.dds b/ktx/external/astc-encoder/Test/Images/Small/LDR-L/ldr-l-00-3.dds new file mode 100644 index 0000000..508cf61 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-L/ldr-l-00-3.dds differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-L/ldr-l-01-3.dds b/ktx/external/astc-encoder/Test/Images/Small/LDR-L/ldr-l-01-3.dds new file mode 100644 index 0000000..ccf9902 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-L/ldr-l-01-3.dds differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-00.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-00.png new file mode 100644 index 0000000..3ea11ac Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-00.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-01.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-01.png new file mode 100644 index 0000000..3733345 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-01.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-02.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-02.png new file mode 100644 index 0000000..04cd547 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-02.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-03.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-03.png new file mode 100644 index 0000000..2d0e946 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-03.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-04.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-04.png new file mode 100644 index 0000000..2473b1a Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-04.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-05.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-05.png new file mode 100644 index 0000000..20b0e68 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-05.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-06.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-06.png new file mode 100644 index 0000000..f954767 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-06.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-07.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-07.png new file mode 100644 index 0000000..7a61974 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-07.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-08.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-08.png new file mode 100644 index 0000000..20ca5be Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-08.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-09.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-09.png new file mode 100644 index 0000000..846ca39 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-09.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-10.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-10.png new file mode 100644 index 0000000..19430de Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGB/ldr-rgb-10.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGBA/ldr-rgba-00.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGBA/ldr-rgba-00.png new file mode 100644 index 0000000..59a2a28 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGBA/ldr-rgba-00.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGBA/ldr-rgba-01.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGBA/ldr-rgba-01.png new file mode 100644 index 0000000..5db2264 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGBA/ldr-rgba-01.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-RGBA/ldr-rgba-02.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGBA/ldr-rgba-02.png new file mode 100644 index 0000000..5be39df Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-RGBA/ldr-rgba-02.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-XY/ldr-xy-00.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-XY/ldr-xy-00.png new file mode 100644 index 0000000..1307002 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-XY/ldr-xy-00.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-XY/ldr-xy-01.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-XY/ldr-xy-01.png new file mode 100644 index 0000000..0389d3c Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-XY/ldr-xy-01.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDR-XY/ldr-xy-02.png b/ktx/external/astc-encoder/Test/Images/Small/LDR-XY/ldr-xy-02.png new file mode 100644 index 0000000..32a6d48 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDR-XY/ldr-xy-02.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDRS-RGBA/ldrs-rgba-00.png b/ktx/external/astc-encoder/Test/Images/Small/LDRS-RGBA/ldrs-rgba-00.png new file mode 100644 index 0000000..59a2a28 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDRS-RGBA/ldrs-rgba-00.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDRS-RGBA/ldrs-rgba-01.png b/ktx/external/astc-encoder/Test/Images/Small/LDRS-RGBA/ldrs-rgba-01.png new file mode 100644 index 0000000..5db2264 Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDRS-RGBA/ldrs-rgba-01.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/LDRS-RGBA/ldrs-rgba-02.png b/ktx/external/astc-encoder/Test/Images/Small/LDRS-RGBA/ldrs-rgba-02.png new file mode 100644 index 0000000..5be39df Binary files /dev/null and b/ktx/external/astc-encoder/Test/Images/Small/LDRS-RGBA/ldrs-rgba-02.png differ diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-1.7_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-1.7_fast_results.csv new file mode 100644 index 0000000..83263ab --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-1.7_fast_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,31.0553,0.6692,0.2503,0.2619 +Small,4x4,ldr-rgb-00.png,37.6200,0.1356,0.1309,0.5005 +Small,4x4,ldr-rgb-01.png,39.4953,0.1044,0.1001,0.6546 +Small,4x4,ldr-rgb-02.png,34.6400,0.1665,0.1624,0.4037 +Small,4x4,ldr-rgb-03.png,45.5358,0.0501,0.0459,1.4267 +Small,4x4,ldr-rgb-04.png,41.6023,0.0808,0.0764,0.8580 +Small,4x4,ldr-rgb-05.png,36.9089,0.1650,0.1606,0.4081 +Small,4x4,ldr-rgb-06.png,34.7028,0.1517,0.1472,0.4452 +Small,4x4,ldr-rgb-07.png,37.7100,0.1807,0.1760,0.3725 +Small,4x4,ldr-rgb-08.png,42.9566,0.0679,0.0634,1.0336 +Small,4x4,ldr-rgb-09.png,41.6406,0.0818,0.0775,0.8455 +Small,4x4,ldr-rgb-10.png,44.2778,0.0259,0.0245,0.6646 +Small,4x4,ldr-rgba-00.png,35.1688,0.1950,0.1900,0.3449 +Small,4x4,ldr-rgba-01.png,38.6664,0.1033,0.0986,0.6646 +Small,4x4,ldr-rgba-02.png,34.6667,0.1921,0.1875,0.3495 +Small,4x4,ldr-xy-00.png,37.5029,0.0656,0.0610,1.0735 +Small,4x4,ldr-xy-01.png,43.8600,0.0762,0.0718,0.9133 +Small,4x4,ldr-xy-02.png,47.2646,0.0573,0.0526,1.2457 +Small,4x4,ldrs-rgba-00.png,35.1624,0.1954,0.1903,0.3444 +Small,4x4,ldrs-rgba-01.png,38.6938,0.1047,0.0999,0.6560 +Small,4x4,ldrs-rgba-02.png,34.6741,0.1934,0.1888,0.3471 +Small,5x5,hdr-rgb-00.hdr,25.4272,0.6881,0.2711,0.2418 +Small,5x5,ldr-rgb-00.png,33.8992,0.1390,0.1344,0.4876 +Small,5x5,ldr-rgb-01.png,36.0531,0.0853,0.0811,0.8085 +Small,5x5,ldr-rgb-02.png,30.9796,0.1393,0.1351,0.4850 +Small,5x5,ldr-rgb-03.png,42.5833,0.0405,0.0363,1.8062 +Small,5x5,ldr-rgb-04.png,37.1876,0.0726,0.0681,0.9622 +Small,5x5,ldr-rgb-05.png,33.0021,0.1656,0.1613,0.4063 +Small,5x5,ldr-rgb-06.png,30.9764,0.1341,0.1296,0.5058 +Small,5x5,ldr-rgb-07.png,34.2491,0.1274,0.1227,0.5343 +Small,5x5,ldr-rgb-08.png,39.4405,0.0552,0.0508,1.2912 +Small,5x5,ldr-rgb-09.png,37.2174,0.0776,0.0733,0.8940 +Small,5x5,ldr-rgb-10.png,39.9802,0.0245,0.0230,0.7074 +Small,5x5,ldr-rgba-00.png,31.6751,0.2022,0.1972,0.3323 +Small,5x5,ldr-rgba-01.png,35.0764,0.1010,0.0964,0.6801 +Small,5x5,ldr-rgba-02.png,31.0539,0.2233,0.2187,0.2996 +Small,5x5,ldr-xy-00.png,36.5131,0.0533,0.0485,1.3499 +Small,5x5,ldr-xy-01.png,39.5715,0.0628,0.0584,1.1214 +Small,5x5,ldr-xy-02.png,43.0065,0.0388,0.0341,1.9234 +Small,5x5,ldrs-rgba-00.png,31.6733,0.2017,0.1967,0.3331 +Small,5x5,ldrs-rgba-01.png,35.0832,0.1006,0.0959,0.6832 +Small,5x5,ldrs-rgba-02.png,31.0560,0.2291,0.2244,0.2920 +Small,6x6,hdr-rgb-00.hdr,23.6168,0.7869,0.3705,0.1769 +Small,6x6,ldr-rgb-00.png,31.4766,0.2454,0.2408,0.2722 +Small,6x6,ldr-rgb-01.png,32.8368,0.2019,0.1976,0.3317 +Small,6x6,ldr-rgb-02.png,27.4358,0.3391,0.3349,0.1957 +Small,6x6,ldr-rgb-03.png,40.3232,0.0489,0.0448,1.4641 +Small,6x6,ldr-rgb-04.png,33.9600,0.1421,0.1377,0.4759 +Small,6x6,ldr-rgb-05.png,29.9770,0.3787,0.3744,0.1750 +Small,6x6,ldr-rgb-06.png,27.4190,0.3341,0.3296,0.1988 +Small,6x6,ldr-rgb-07.png,33.0043,0.1879,0.1833,0.3576 +Small,6x6,ldr-rgb-08.png,37.6153,0.0820,0.0776,0.8450 +Small,6x6,ldr-rgb-09.png,33.4607,0.1827,0.1784,0.3673 +Small,6x6,ldr-rgb-10.png,36.4442,0.0355,0.0341,0.4764 +Small,6x6,ldr-rgba-00.png,29.1258,0.3264,0.3214,0.2039 +Small,6x6,ldr-rgba-01.png,32.0730,0.1287,0.1240,0.5283 +Small,6x6,ldr-rgba-02.png,27.8120,0.3382,0.3336,0.1964 +Small,6x6,ldr-xy-00.png,35.4841,0.0741,0.0695,0.9425 +Small,6x6,ldr-xy-01.png,37.2118,0.0906,0.0863,0.7596 +Small,6x6,ldr-xy-02.png,41.4333,0.0332,0.0285,2.3016 +Small,6x6,ldrs-rgba-00.png,29.1256,0.3285,0.3236,0.2025 +Small,6x6,ldrs-rgba-01.png,32.0791,0.1303,0.1256,0.5216 +Small,6x6,ldrs-rgba-02.png,27.8115,0.3431,0.3384,0.1937 +Small,8x8,hdr-rgb-00.hdr,21.2414,0.7851,0.3655,0.1793 +Small,8x8,ldr-rgb-00.png,27.8894,0.2607,0.2563,0.2557 +Small,8x8,ldr-rgb-01.png,28.7930,0.1879,0.1837,0.3567 +Small,8x8,ldr-rgb-02.png,23.0933,0.3388,0.3346,0.1959 +Small,8x8,ldr-rgb-03.png,37.1821,0.0491,0.0450,1.4562 +Small,8x8,ldr-rgb-04.png,29.3407,0.1786,0.1741,0.3764 +Small,8x8,ldr-rgb-05.png,25.8037,0.4316,0.4273,0.1534 +Small,8x8,ldr-rgb-06.png,23.1797,0.3465,0.3420,0.1916 +Small,8x8,ldr-rgb-07.png,29.8087,0.1416,0.1368,0.4790 +Small,8x8,ldr-rgb-08.png,34.2730,0.0761,0.0717,0.9146 +Small,8x8,ldr-rgb-09.png,28.6215,0.2112,0.2070,0.3166 +Small,8x8,ldr-rgb-10.png,32.1061,0.0325,0.0311,0.5225 +Small,8x8,ldr-rgba-00.png,24.8957,0.3155,0.3106,0.2110 +Small,8x8,ldr-rgba-01.png,28.2876,0.1351,0.1304,0.5025 +Small,8x8,ldr-rgba-02.png,23.9189,0.3317,0.3270,0.2004 +Small,8x8,ldr-xy-00.png,32.9890,0.0850,0.0803,0.8159 +Small,8x8,ldr-xy-01.png,33.9995,0.0886,0.0843,0.7774 +Small,8x8,ldr-xy-02.png,39.7110,0.0255,0.0209,3.1371 +Small,8x8,ldrs-rgba-00.png,24.8961,0.3178,0.3129,0.2094 +Small,8x8,ldrs-rgba-01.png,28.2913,0.1360,0.1313,0.4993 +Small,8x8,ldrs-rgba-02.png,23.9179,0.3349,0.3303,0.1984 +Small,12x12,hdr-rgb-00.hdr,18.6573,0.7497,0.3299,0.1987 +Small,12x12,ldr-rgb-00.png,23.6753,0.1035,0.0989,0.6630 +Small,12x12,ldr-rgb-01.png,24.7780,0.0625,0.0583,1.1246 +Small,12x12,ldr-rgb-02.png,19.2716,0.2333,0.2291,0.2860 +Small,12x12,ldr-rgb-03.png,33.2360,0.0307,0.0265,2.4691 +Small,12x12,ldr-rgb-04.png,24.4851,0.0767,0.0723,0.9061 +Small,12x12,ldr-rgb-05.png,21.5519,0.2195,0.2154,0.3043 +Small,12x12,ldr-rgb-06.png,19.2972,0.2711,0.2665,0.2459 +Small,12x12,ldr-rgb-07.png,25.2111,0.0641,0.0594,1.1032 +Small,12x12,ldr-rgb-08.png,30.2775,0.0417,0.0371,1.7673 +Small,12x12,ldr-rgb-09.png,23.6956,0.1359,0.1316,0.4978 +Small,12x12,ldr-rgb-10.png,27.0311,0.0252,0.0237,0.6857 +Small,12x12,ldr-rgba-00.png,21.1967,0.1838,0.1789,0.3663 +Small,12x12,ldr-rgba-01.png,24.5644,0.0789,0.0743,0.8821 +Small,12x12,ldr-rgba-02.png,20.2230,0.2485,0.2439,0.2687 +Small,12x12,ldr-xy-00.png,28.7395,0.0687,0.0641,1.0222 +Small,12x12,ldr-xy-01.png,30.1537,0.0590,0.0547,1.1973 +Small,12x12,ldr-xy-02.png,38.3004,0.0254,0.0206,3.1743 +Small,12x12,ldrs-rgba-00.png,21.1965,0.1873,0.1824,0.3593 +Small,12x12,ldrs-rgba-01.png,24.5668,0.0796,0.0750,0.8744 +Small,12x12,ldrs-rgba-02.png,20.2228,0.2524,0.2477,0.2646 +Small,3x3x3,ldr-l-00-3.dds,50.7625,0.1365,0.1313,1.9959 +Small,3x3x3,ldr-l-01-3.dds,55.3406,0.0595,0.0576,1.1965 +Small,6x6x6,ldr-l-00-3.dds,32.7203,0.2586,0.2534,1.0344 +Small,6x6x6,ldr-l-01-3.dds,42.1565,0.1021,0.1004,0.6867 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-1.7_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-1.7_fastest_results.csv new file mode 100644 index 0000000..d467f0d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-1.7_fastest_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,31.0553,0.6675,0.2495,0.2626 +Small,4x4,ldr-rgb-00.png,37.6200,0.1351,0.1305,0.5023 +Small,4x4,ldr-rgb-01.png,39.4953,0.1031,0.0988,0.6633 +Small,4x4,ldr-rgb-02.png,34.6400,0.1654,0.1610,0.4071 +Small,4x4,ldr-rgb-03.png,45.5358,0.0501,0.0460,1.4253 +Small,4x4,ldr-rgb-04.png,41.6023,0.0818,0.0773,0.8474 +Small,4x4,ldr-rgb-05.png,36.9089,0.1647,0.1603,0.4088 +Small,4x4,ldr-rgb-06.png,34.7028,0.1528,0.1483,0.4418 +Small,4x4,ldr-rgb-07.png,37.7100,0.1805,0.1758,0.3728 +Small,4x4,ldr-rgb-08.png,42.9566,0.0675,0.0631,1.0386 +Small,4x4,ldr-rgb-09.png,41.6406,0.0814,0.0771,0.8496 +Small,4x4,ldr-rgb-10.png,44.2778,0.0262,0.0248,0.6568 +Small,4x4,ldr-rgba-00.png,35.1688,0.1930,0.1880,0.3486 +Small,4x4,ldr-rgba-01.png,38.6664,0.1048,0.1002,0.6541 +Small,4x4,ldr-rgba-02.png,34.6667,0.1926,0.1879,0.3487 +Small,4x4,ldr-xy-00.png,37.5029,0.0657,0.0611,1.0726 +Small,4x4,ldr-xy-01.png,43.8600,0.0729,0.0686,0.9556 +Small,4x4,ldr-xy-02.png,47.2646,0.0564,0.0517,1.2675 +Small,4x4,ldrs-rgba-00.png,35.1624,0.1945,0.1894,0.3460 +Small,4x4,ldrs-rgba-01.png,38.6938,0.1043,0.0997,0.6576 +Small,4x4,ldrs-rgba-02.png,34.6741,0.1931,0.1885,0.3476 +Small,5x5,hdr-rgb-00.hdr,25.4272,0.6913,0.2717,0.2412 +Small,5x5,ldr-rgb-00.png,33.8992,0.1380,0.1333,0.4915 +Small,5x5,ldr-rgb-01.png,36.0531,0.0862,0.0820,0.7994 +Small,5x5,ldr-rgb-02.png,30.9796,0.1412,0.1370,0.4783 +Small,5x5,ldr-rgb-03.png,42.5833,0.0407,0.0365,1.7979 +Small,5x5,ldr-rgb-04.png,37.1876,0.0723,0.0678,0.9663 +Small,5x5,ldr-rgb-05.png,33.0021,0.1637,0.1593,0.4113 +Small,5x5,ldr-rgb-06.png,30.9764,0.1341,0.1297,0.5053 +Small,5x5,ldr-rgb-07.png,34.2491,0.1293,0.1246,0.5258 +Small,5x5,ldr-rgb-08.png,39.4405,0.0554,0.0510,1.2862 +Small,5x5,ldr-rgb-09.png,37.2174,0.0779,0.0737,0.8897 +Small,5x5,ldr-rgb-10.png,39.9802,0.0243,0.0229,0.7099 +Small,5x5,ldr-rgba-00.png,31.6751,0.2022,0.1973,0.3322 +Small,5x5,ldr-rgba-01.png,35.0764,0.1003,0.0957,0.6847 +Small,5x5,ldr-rgba-02.png,31.0539,0.2200,0.2153,0.3044 +Small,5x5,ldr-xy-00.png,36.5131,0.0533,0.0487,1.3461 +Small,5x5,ldr-xy-01.png,39.5715,0.0624,0.0581,1.1271 +Small,5x5,ldr-xy-02.png,43.0065,0.0391,0.0343,1.9101 +Small,5x5,ldrs-rgba-00.png,31.6733,0.2052,0.2002,0.3274 +Small,5x5,ldrs-rgba-01.png,35.0832,0.1013,0.0967,0.6779 +Small,5x5,ldrs-rgba-02.png,31.0560,0.2244,0.2197,0.2982 +Small,6x6,hdr-rgb-00.hdr,23.6168,0.7873,0.3678,0.1782 +Small,6x6,ldr-rgb-00.png,31.4766,0.2480,0.2435,0.2691 +Small,6x6,ldr-rgb-01.png,32.8368,0.2026,0.1984,0.3303 +Small,6x6,ldr-rgb-02.png,27.4358,0.3390,0.3348,0.1957 +Small,6x6,ldr-rgb-03.png,40.3232,0.0490,0.0448,1.4624 +Small,6x6,ldr-rgb-04.png,33.9600,0.1425,0.1381,0.4747 +Small,6x6,ldr-rgb-05.png,29.9770,0.3756,0.3713,0.1765 +Small,6x6,ldr-rgb-06.png,27.4190,0.3307,0.3263,0.2009 +Small,6x6,ldr-rgb-07.png,33.0043,0.1880,0.1833,0.3574 +Small,6x6,ldr-rgb-08.png,37.6153,0.0821,0.0775,0.8459 +Small,6x6,ldr-rgb-09.png,33.4607,0.1827,0.1784,0.3674 +Small,6x6,ldr-rgb-10.png,36.4442,0.0355,0.0341,0.4770 +Small,6x6,ldr-rgba-00.png,29.1258,0.3238,0.3188,0.2056 +Small,6x6,ldr-rgba-01.png,32.0730,0.1292,0.1246,0.5262 +Small,6x6,ldr-rgba-02.png,27.8120,0.3380,0.3333,0.1966 +Small,6x6,ldr-xy-00.png,35.4841,0.0743,0.0697,0.9405 +Small,6x6,ldr-xy-01.png,37.2118,0.0924,0.0881,0.7438 +Small,6x6,ldr-xy-02.png,41.4333,0.0335,0.0287,2.2802 +Small,6x6,ldrs-rgba-00.png,29.1256,0.3280,0.3230,0.2029 +Small,6x6,ldrs-rgba-01.png,32.0791,0.1288,0.1241,0.5279 +Small,6x6,ldrs-rgba-02.png,27.8115,0.3435,0.3390,0.1933 +Small,8x8,hdr-rgb-00.hdr,21.2414,0.7849,0.3676,0.1783 +Small,8x8,ldr-rgb-00.png,27.8894,0.2652,0.2607,0.2514 +Small,8x8,ldr-rgb-01.png,28.7930,0.1879,0.1838,0.3566 +Small,8x8,ldr-rgb-02.png,23.0933,0.3424,0.3382,0.1938 +Small,8x8,ldr-rgb-03.png,37.1821,0.0489,0.0448,1.4641 +Small,8x8,ldr-rgb-04.png,29.3407,0.1814,0.1770,0.3702 +Small,8x8,ldr-rgb-05.png,25.8037,0.4345,0.4301,0.1524 +Small,8x8,ldr-rgb-06.png,23.1797,0.3464,0.3420,0.1916 +Small,8x8,ldr-rgb-07.png,29.8087,0.1425,0.1377,0.4760 +Small,8x8,ldr-rgb-08.png,34.2730,0.0760,0.0715,0.9171 +Small,8x8,ldr-rgb-09.png,28.6215,0.2128,0.2085,0.3143 +Small,8x8,ldr-rgb-10.png,32.1061,0.0322,0.0307,0.5289 +Small,8x8,ldr-rgba-00.png,24.8957,0.3157,0.3106,0.2110 +Small,8x8,ldr-rgba-01.png,28.2876,0.1355,0.1309,0.5006 +Small,8x8,ldr-rgba-02.png,23.9189,0.3370,0.3323,0.1972 +Small,8x8,ldr-xy-00.png,32.9890,0.0847,0.0801,0.8183 +Small,8x8,ldr-xy-01.png,33.9995,0.0889,0.0846,0.7747 +Small,8x8,ldr-xy-02.png,39.7110,0.0252,0.0205,3.1936 +Small,8x8,ldrs-rgba-00.png,24.8961,0.3187,0.3139,0.2088 +Small,8x8,ldrs-rgba-01.png,28.2913,0.1361,0.1314,0.4987 +Small,8x8,ldrs-rgba-02.png,23.9179,0.3417,0.3370,0.1945 +Small,12x12,hdr-rgb-00.hdr,18.6573,0.7564,0.3354,0.1954 +Small,12x12,ldr-rgb-00.png,23.6753,0.1044,0.0999,0.6563 +Small,12x12,ldr-rgb-01.png,24.7780,0.0637,0.0594,1.1038 +Small,12x12,ldr-rgb-02.png,19.2716,0.2309,0.2266,0.2892 +Small,12x12,ldr-rgb-03.png,33.2360,0.0300,0.0258,2.5377 +Small,12x12,ldr-rgb-04.png,24.4851,0.0769,0.0723,0.9060 +Small,12x12,ldr-rgb-05.png,21.5519,0.2194,0.2151,0.3046 +Small,12x12,ldr-rgb-06.png,19.2972,0.2698,0.2653,0.2471 +Small,12x12,ldr-rgb-07.png,25.2111,0.0644,0.0597,1.0976 +Small,12x12,ldr-rgb-08.png,30.2775,0.0417,0.0373,1.7575 +Small,12x12,ldr-rgb-09.png,23.6956,0.1378,0.1333,0.4915 +Small,12x12,ldr-rgb-10.png,27.0311,0.0252,0.0238,0.6829 +Small,12x12,ldr-rgba-00.png,21.1967,0.1854,0.1805,0.3632 +Small,12x12,ldr-rgba-01.png,24.5644,0.0805,0.0755,0.8682 +Small,12x12,ldr-rgba-02.png,20.2230,0.2533,0.2486,0.2636 +Small,12x12,ldr-xy-00.png,28.7395,0.0683,0.0636,1.0298 +Small,12x12,ldr-xy-01.png,30.1537,0.0594,0.0551,1.1894 +Small,12x12,ldr-xy-02.png,38.3004,0.0258,0.0210,3.1150 +Small,12x12,ldrs-rgba-00.png,21.1965,0.1901,0.1852,0.3539 +Small,12x12,ldrs-rgba-01.png,24.5668,0.0802,0.0755,0.8675 +Small,12x12,ldrs-rgba-02.png,20.2228,0.2527,0.2480,0.2643 +Small,3x3x3,ldr-l-00-3.dds,50.7625,0.1345,0.1294,2.0251 +Small,3x3x3,ldr-l-01-3.dds,55.3406,0.0606,0.0588,1.1719 +Small,6x6x6,ldr-l-00-3.dds,32.7203,0.2586,0.2534,1.0344 +Small,6x6x6,ldr-l-01-3.dds,42.1565,0.1020,0.1003,0.6873 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-1.7_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-1.7_medium_results.csv new file mode 100644 index 0000000..f1e7124 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-1.7_medium_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,32.3717,0.9915,0.5722,0.1145 +Small,4x4,ldr-rgb-00.png,38.6656,0.5061,0.5001,0.1310 +Small,4x4,ldr-rgb-01.png,40.0979,0.3886,0.3845,0.1705 +Small,4x4,ldr-rgb-02.png,35.2514,0.3700,0.3658,0.1792 +Small,4x4,ldr-rgb-03.png,46.8483,0.2905,0.2863,0.2289 +Small,4x4,ldr-rgb-04.png,42.0686,0.3182,0.3138,0.2089 +Small,4x4,ldr-rgb-05.png,37.6922,0.4481,0.4435,0.1478 +Small,4x4,ldr-rgb-06.png,35.2940,0.3376,0.3331,0.1967 +Small,4x4,ldr-rgb-07.png,38.6812,0.5671,0.5624,0.1165 +Small,4x4,ldr-rgb-08.png,44.5950,0.3125,0.3080,0.2128 +Small,4x4,ldr-rgb-09.png,42.0326,0.3158,0.3115,0.2104 +Small,4x4,ldr-rgb-10.png,44.8957,0.0743,0.0729,0.2230 +Small,4x4,ldr-rgba-00.png,36.3660,0.6042,0.5989,0.1094 +Small,4x4,ldr-rgba-01.png,38.9011,0.3277,0.3231,0.2028 +Small,4x4,ldr-rgba-02.png,34.9397,0.5782,0.5736,0.1143 +Small,4x4,ldr-xy-00.png,37.7448,0.2462,0.2416,0.2712 +Small,4x4,ldr-xy-01.png,45.5242,0.3769,0.3726,0.1759 +Small,4x4,ldr-xy-02.png,51.0302,0.3527,0.3479,0.1884 +Small,4x4,ldrs-rgba-00.png,36.3560,0.6146,0.6096,0.1075 +Small,4x4,ldrs-rgba-01.png,38.9292,0.3247,0.3201,0.2048 +Small,4x4,ldrs-rgba-02.png,34.9481,0.5824,0.5778,0.1134 +Small,5x5,hdr-rgb-00.hdr,26.4926,1.1196,0.6974,0.0940 +Small,5x5,ldr-rgb-00.png,35.0586,0.6271,0.6210,0.1055 +Small,5x5,ldr-rgb-01.png,36.4425,0.4096,0.4053,0.1617 +Small,5x5,ldr-rgb-02.png,31.1293,0.4251,0.4182,0.1567 +Small,5x5,ldr-rgb-03.png,43.8713,0.1449,0.1407,0.4658 +Small,5x5,ldr-rgb-04.png,37.7846,0.3392,0.3347,0.1958 +Small,5x5,ldr-rgb-05.png,33.6141,0.6077,0.6034,0.1086 +Small,5x5,ldr-rgb-06.png,31.1253,0.3746,0.3701,0.1771 +Small,5x5,ldr-rgb-07.png,35.7241,0.6602,0.6555,0.1000 +Small,5x5,ldr-rgb-08.png,41.2970,0.2537,0.2492,0.2630 +Small,5x5,ldr-rgb-09.png,37.6144,0.3072,0.3029,0.2163 +Small,5x5,ldr-rgb-10.png,40.3846,0.0904,0.0890,0.1827 +Small,5x5,ldr-rgba-00.png,32.9919,0.8071,0.8021,0.0817 +Small,5x5,ldr-rgba-01.png,35.3154,0.3660,0.3613,0.1814 +Small,5x5,ldr-rgba-02.png,31.1445,0.7384,0.7338,0.0893 +Small,5x5,ldr-xy-00.png,37.0223,0.2629,0.2583,0.2537 +Small,5x5,ldr-xy-01.png,41.4188,0.3520,0.3477,0.1885 +Small,5x5,ldr-xy-02.png,48.8924,0.1827,0.1780,0.3681 +Small,5x5,ldrs-rgba-00.png,32.9881,0.8249,0.8201,0.0799 +Small,5x5,ldrs-rgba-01.png,35.3222,0.3714,0.3668,0.1787 +Small,5x5,ldrs-rgba-02.png,31.1471,0.7523,0.7477,0.0876 +Small,6x6,hdr-rgb-00.hdr,24.8937,1.0986,0.6783,0.0966 +Small,6x6,ldr-rgb-00.png,32.4341,0.7586,0.7542,0.0869 +Small,6x6,ldr-rgb-01.png,33.1821,0.6779,0.6737,0.0973 +Small,6x6,ldr-rgb-02.png,27.5325,0.8536,0.8496,0.0771 +Small,6x6,ldr-rgb-03.png,41.6104,0.1270,0.1223,0.5359 +Small,6x6,ldr-rgb-04.png,34.4102,0.5936,0.5892,0.1112 +Small,6x6,ldr-rgb-05.png,30.3499,0.9917,0.9875,0.0664 +Small,6x6,ldr-rgb-06.png,27.5472,0.8107,0.8063,0.0813 +Small,6x6,ldr-rgb-07.png,34.1762,0.8313,0.8266,0.0793 +Small,6x6,ldr-rgb-08.png,39.2197,0.2696,0.2652,0.2471 +Small,6x6,ldr-rgb-09.png,33.7940,0.5698,0.5656,0.1159 +Small,6x6,ldr-rgb-10.png,37.0151,0.0935,0.0920,0.1766 +Small,6x6,ldr-rgba-00.png,30.3157,0.9352,0.9303,0.0704 +Small,6x6,ldr-rgba-01.png,32.2939,0.3594,0.3548,0.1847 +Small,6x6,ldr-rgba-02.png,27.8804,0.8000,0.7955,0.0824 +Small,6x6,ldr-xy-00.png,36.3514,0.2336,0.2290,0.2862 +Small,6x6,ldr-xy-01.png,38.8772,0.2371,0.2327,0.2816 +Small,6x6,ldr-xy-02.png,44.9557,0.1332,0.1285,0.5098 +Small,6x6,ldrs-rgba-00.png,30.3147,0.9444,0.9395,0.0698 +Small,6x6,ldrs-rgba-01.png,32.3004,0.3553,0.3505,0.1870 +Small,6x6,ldrs-rgba-02.png,27.8812,0.8110,0.8065,0.0813 +Small,8x8,hdr-rgb-00.hdr,21.5694,1.0946,0.6636,0.0988 +Small,8x8,ldr-rgb-00.png,28.8388,0.8837,0.8792,0.0745 +Small,8x8,ldr-rgb-01.png,29.0739,0.7331,0.7286,0.0900 +Small,8x8,ldr-rgb-02.png,23.1994,0.9236,0.9189,0.0713 +Small,8x8,ldr-rgb-03.png,38.5081,0.1325,0.1284,0.5103 +Small,8x8,ldr-rgb-04.png,29.8073,0.6863,0.6819,0.0961 +Small,8x8,ldr-rgb-05.png,26.0760,1.0753,1.0710,0.0612 +Small,8x8,ldr-rgb-06.png,23.3022,0.8652,0.8607,0.0761 +Small,8x8,ldr-rgb-07.png,30.8974,0.7982,0.7936,0.0826 +Small,8x8,ldr-rgb-08.png,35.8865,0.2591,0.2548,0.2572 +Small,8x8,ldr-rgb-09.png,29.0886,0.6728,0.6686,0.0980 +Small,8x8,ldr-rgb-10.png,32.3667,0.1234,0.1220,0.1333 +Small,8x8,ldr-rgba-00.png,26.2918,1.0169,1.0115,0.0648 +Small,8x8,ldr-rgba-01.png,28.4828,0.3779,0.3733,0.1756 +Small,8x8,ldr-rgba-02.png,23.9713,0.8010,0.7965,0.0823 +Small,8x8,ldr-xy-00.png,33.9437,0.2704,0.2657,0.2466 +Small,8x8,ldr-xy-01.png,35.3494,0.2812,0.2768,0.2368 +Small,8x8,ldr-xy-02.png,40.8117,0.0866,0.0817,0.8021 +Small,8x8,ldrs-rgba-00.png,26.2916,1.0352,1.0304,0.0636 +Small,8x8,ldrs-rgba-01.png,28.4878,0.3808,0.3761,0.1742 +Small,8x8,ldrs-rgba-02.png,23.9716,0.7995,0.7950,0.0824 +Small,12x12,hdr-rgb-00.hdr,18.9036,1.0939,0.6701,0.0978 +Small,12x12,ldr-rgb-00.png,24.7261,0.6955,0.6911,0.0948 +Small,12x12,ldr-rgb-01.png,25.1947,0.7104,0.7063,0.0928 +Small,12x12,ldr-rgb-02.png,19.3404,0.8563,0.8521,0.0769 +Small,12x12,ldr-rgb-03.png,34.8452,0.1176,0.1132,0.5788 +Small,12x12,ldr-rgb-04.png,24.9876,0.6498,0.6455,0.1015 +Small,12x12,ldr-rgb-05.png,21.7610,0.9668,0.9626,0.0681 +Small,12x12,ldr-rgb-06.png,19.3670,0.8152,0.8108,0.0808 +Small,12x12,ldr-rgb-07.png,26.8426,0.6278,0.6232,0.1052 +Small,12x12,ldr-rgb-08.png,31.7481,0.2184,0.2124,0.3086 +Small,12x12,ldr-rgb-09.png,24.2891,0.6186,0.6144,0.1067 +Small,12x12,ldr-rgb-10.png,28.1804,0.1582,0.1568,0.1037 +Small,12x12,ldr-rgba-00.png,21.9587,0.7659,0.7610,0.0861 +Small,12x12,ldr-rgba-01.png,24.7688,0.3759,0.3713,0.1765 +Small,12x12,ldr-rgba-02.png,20.2501,0.6625,0.6580,0.0996 +Small,12x12,ldr-xy-00.png,29.9340,0.2290,0.2243,0.2921 +Small,12x12,ldr-xy-01.png,31.8431,0.2218,0.2173,0.3016 +Small,12x12,ldr-xy-02.png,38.4389,0.0289,0.0243,2.6931 +Small,12x12,ldrs-rgba-00.png,21.9596,0.7863,0.7815,0.0839 +Small,12x12,ldrs-rgba-01.png,24.7714,0.3736,0.3690,0.1776 +Small,12x12,ldrs-rgba-02.png,20.2501,0.6685,0.6639,0.0987 +Small,3x3x3,ldr-l-00-3.dds,52.3295,0.1968,0.1917,1.3674 +Small,3x3x3,ldr-l-01-3.dds,55.5234,0.0668,0.0651,1.0593 +Small,6x6x6,ldr-l-00-3.dds,33.0166,0.3979,0.3928,0.6673 +Small,6x6x6,ldr-l-01-3.dds,42.2307,0.1110,0.1092,0.6313 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-1.7_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-1.7_thorough_results.csv new file mode 100644 index 0000000..d91f74f --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-1.7_thorough_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,32.5862,1.5065,1.0874,0.0603 +Small,4x4,ldr-rgb-00.png,39.1931,1.0320,1.0275,0.0638 +Small,4x4,ldr-rgb-01.png,40.3696,0.9200,0.9158,0.0716 +Small,4x4,ldr-rgb-02.png,35.4577,0.8304,0.8264,0.0793 +Small,4x4,ldr-rgb-03.png,47.4831,1.0800,1.0760,0.0609 +Small,4x4,ldr-rgb-04.png,42.3004,0.8150,0.8106,0.0809 +Small,4x4,ldr-rgb-05.png,38.0026,0.9071,0.9028,0.0726 +Small,4x4,ldr-rgb-06.png,35.4518,0.7735,0.7692,0.0852 +Small,4x4,ldr-rgb-07.png,39.7622,1.1595,1.1549,0.0567 +Small,4x4,ldr-rgb-08.png,45.7811,1.0765,1.0720,0.0611 +Small,4x4,ldr-rgb-09.png,42.1623,0.8951,0.8907,0.0736 +Small,4x4,ldr-rgb-10.png,45.0422,0.1507,0.1493,0.1089 +Small,4x4,ldr-rgba-00.png,37.0647,1.1188,1.1138,0.0588 +Small,4x4,ldr-rgba-01.png,39.0321,0.9813,0.9767,0.0671 +Small,4x4,ldr-rgba-02.png,35.0248,1.3113,1.3067,0.0502 +Small,4x4,ldr-xy-00.png,37.7563,0.8972,0.8926,0.0734 +Small,4x4,ldr-xy-01.png,45.8014,0.9734,0.9691,0.0676 +Small,4x4,ldr-xy-02.png,51.0558,1.2771,1.2725,0.0515 +Small,4x4,ldrs-rgba-00.png,37.0530,1.1239,1.1189,0.0586 +Small,4x4,ldrs-rgba-01.png,39.0631,0.9919,0.9872,0.0664 +Small,4x4,ldrs-rgba-02.png,35.0293,1.3316,1.3269,0.0494 +Small,5x5,hdr-rgb-00.hdr,27.7392,1.6239,1.2049,0.0544 +Small,5x5,ldr-rgb-00.png,35.3874,1.2612,1.2560,0.0522 +Small,5x5,ldr-rgb-01.png,36.5440,1.1125,1.1082,0.0591 +Small,5x5,ldr-rgb-02.png,31.1891,1.0226,1.0153,0.0645 +Small,5x5,ldr-rgb-03.png,44.5467,1.2053,1.2012,0.0546 +Small,5x5,ldr-rgb-04.png,37.9473,0.9581,0.9532,0.0688 +Small,5x5,ldr-rgb-05.png,33.7613,1.1170,1.1126,0.0589 +Small,5x5,ldr-rgb-06.png,31.1556,0.9558,0.9480,0.0691 +Small,5x5,ldr-rgb-07.png,36.7171,1.3788,1.3741,0.0477 +Small,5x5,ldr-rgb-08.png,42.2987,1.2671,1.2629,0.0519 +Small,5x5,ldr-rgb-09.png,37.7091,1.0339,1.0297,0.0636 +Small,5x5,ldr-rgb-10.png,40.6657,0.2088,0.2073,0.0784 +Small,5x5,ldr-rgba-00.png,33.4897,1.3688,1.3634,0.0481 +Small,5x5,ldr-rgba-01.png,35.3813,1.1728,1.1683,0.0561 +Small,5x5,ldr-rgba-02.png,31.1843,1.7176,1.7113,0.0383 +Small,5x5,ldr-xy-00.png,37.2310,0.8054,0.8007,0.0818 +Small,5x5,ldr-xy-01.png,42.0645,1.2470,1.2428,0.0527 +Small,5x5,ldr-xy-02.png,49.3478,1.4859,1.4812,0.0442 +Small,5x5,ldrs-rgba-00.png,33.4860,1.3819,1.3766,0.0476 +Small,5x5,ldrs-rgba-01.png,35.3890,1.1751,1.1707,0.0560 +Small,5x5,ldrs-rgba-02.png,31.1856,1.7290,1.7245,0.0380 +Small,6x6,hdr-rgb-00.hdr,25.0867,1.6293,1.2110,0.0541 +Small,6x6,ldr-rgb-00.png,32.7392,1.5733,1.5689,0.0418 +Small,6x6,ldr-rgb-01.png,33.2455,1.5675,1.5631,0.0419 +Small,6x6,ldr-rgb-02.png,27.5686,1.6835,1.6794,0.0390 +Small,6x6,ldr-rgb-03.png,42.5253,0.8620,0.8578,0.0764 +Small,6x6,ldr-rgb-04.png,34.4960,1.5948,1.5905,0.0412 +Small,6x6,ldr-rgb-05.png,30.4437,1.6595,1.6547,0.0396 +Small,6x6,ldr-rgb-06.png,27.5722,1.6619,1.6575,0.0395 +Small,6x6,ldr-rgb-07.png,34.5492,1.6225,1.6178,0.0405 +Small,6x6,ldr-rgb-08.png,39.9386,0.9164,0.9120,0.0719 +Small,6x6,ldr-rgb-09.png,33.8611,1.5389,1.5346,0.0427 +Small,6x6,ldr-rgb-10.png,37.1921,0.2331,0.2316,0.0702 +Small,6x6,ldr-rgba-00.png,30.9592,1.6002,1.5953,0.0411 +Small,6x6,ldr-rgba-01.png,32.3438,1.3039,1.2991,0.0504 +Small,6x6,ldr-rgba-02.png,27.8999,1.9030,1.8977,0.0345 +Small,6x6,ldr-xy-00.png,36.6747,0.6713,0.6663,0.0984 +Small,6x6,ldr-xy-01.png,39.3293,1.0568,1.0525,0.0623 +Small,6x6,ldr-xy-02.png,47.5022,1.4244,1.4199,0.0462 +Small,6x6,ldrs-rgba-00.png,30.9598,1.6108,1.6060,0.0408 +Small,6x6,ldrs-rgba-01.png,32.3512,1.3075,1.3029,0.0503 +Small,6x6,ldrs-rgba-02.png,27.9010,1.9145,1.9100,0.0343 +Small,8x8,hdr-rgb-00.hdr,21.8376,1.5668,1.1460,0.0572 +Small,8x8,ldr-rgb-00.png,29.0957,1.6055,1.6010,0.0409 +Small,8x8,ldr-rgb-01.png,29.1354,1.5104,1.5063,0.0435 +Small,8x8,ldr-rgb-02.png,23.2232,1.6871,1.6830,0.0389 +Small,8x8,ldr-rgb-03.png,39.3433,0.3191,0.3120,0.2100 +Small,8x8,ldr-rgb-04.png,29.8754,1.5534,1.5491,0.0423 +Small,8x8,ldr-rgb-05.png,26.1502,1.6863,1.6821,0.0390 +Small,8x8,ldr-rgb-06.png,23.3255,1.6918,1.6874,0.0388 +Small,8x8,ldr-rgb-07.png,31.2971,1.5865,1.5820,0.0414 +Small,8x8,ldr-rgb-08.png,36.5740,0.6249,0.6205,0.1056 +Small,8x8,ldr-rgb-09.png,29.1767,1.2796,1.2754,0.0514 +Small,8x8,ldr-rgb-10.png,32.4890,0.2370,0.2355,0.0690 +Small,8x8,ldr-rgba-00.png,26.8918,1.6359,1.6311,0.0402 +Small,8x8,ldr-rgba-01.png,28.5195,1.2670,1.2624,0.0519 +Small,8x8,ldr-rgba-02.png,23.9879,1.7730,1.7685,0.0371 +Small,8x8,ldr-xy-00.png,34.2174,0.6430,0.6385,0.1026 +Small,8x8,ldr-xy-01.png,35.6365,0.5957,0.5915,0.1108 +Small,8x8,ldr-xy-02.png,44.4083,0.6492,0.6447,0.1017 +Small,8x8,ldrs-rgba-00.png,26.8926,1.6633,1.6585,0.0395 +Small,8x8,ldrs-rgba-01.png,28.5258,1.2759,1.2714,0.0515 +Small,8x8,ldrs-rgba-02.png,23.9885,1.8198,1.8154,0.0361 +Small,12x12,hdr-rgb-00.hdr,19.0059,1.4889,1.0615,0.0617 +Small,12x12,ldr-rgb-00.png,25.1256,1.5458,1.5412,0.0425 +Small,12x12,ldr-rgb-01.png,25.2855,1.3633,1.3593,0.0482 +Small,12x12,ldr-rgb-02.png,19.3587,1.6269,1.6227,0.0404 +Small,12x12,ldr-rgb-03.png,35.7967,0.2800,0.2758,0.2376 +Small,12x12,ldr-rgb-04.png,25.0983,1.3983,1.3934,0.0470 +Small,12x12,ldr-rgb-05.png,21.8032,1.5842,1.5801,0.0415 +Small,12x12,ldr-rgb-06.png,19.3919,1.6304,1.6261,0.0403 +Small,12x12,ldr-rgb-07.png,27.2710,1.5197,1.5151,0.0433 +Small,12x12,ldr-rgb-08.png,32.7068,0.5070,0.5026,0.1304 +Small,12x12,ldr-rgb-09.png,24.4067,1.2443,1.2402,0.0528 +Small,12x12,ldr-rgb-10.png,28.3483,0.2965,0.2951,0.0551 +Small,12x12,ldr-rgba-00.png,22.4158,1.5629,1.5580,0.0421 +Small,12x12,ldr-rgba-01.png,24.8324,1.1996,1.1950,0.0548 +Small,12x12,ldr-rgba-02.png,20.2637,1.3285,1.3239,0.0495 +Small,12x12,ldr-xy-00.png,30.4878,0.7159,0.7114,0.0921 +Small,12x12,ldr-xy-01.png,32.5543,0.4692,0.4634,0.1414 +Small,12x12,ldr-xy-02.png,39.7066,0.1667,0.1620,0.4046 +Small,12x12,ldrs-rgba-00.png,22.4166,1.5922,1.5857,0.0413 +Small,12x12,ldrs-rgba-01.png,24.8346,1.2177,1.2132,0.0540 +Small,12x12,ldrs-rgba-02.png,20.2635,1.3489,1.3444,0.0487 +Small,3x3x3,ldr-l-00-3.dds,52.5947,0.3950,0.3898,0.6724 +Small,3x3x3,ldr-l-01-3.dds,55.7323,0.1455,0.1437,0.4796 +Small,6x6x6,ldr-l-00-3.dds,33.2450,0.7023,0.6973,0.3759 +Small,6x6x6,ldr-l-01-3.dds,42.3190,0.1334,0.1316,0.5239 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-avx2_fast_results.csv new file mode 100644 index 0000000..8a7ff56 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-avx2_fast_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,31.2477,0.1291,0.0327,2.0040 +Small,4x4,ldr-rgb-00.png,37.6610,0.0280,0.0199,3.2987 +Small,4x4,ldr-rgb-01.png,39.4292,0.0220,0.0143,4.5903 +Small,4x4,ldr-rgb-02.png,34.5574,0.0313,0.0236,2.7811 +Small,4x4,ldr-rgb-03.png,45.5738,0.0135,0.0060,10.8970 +Small,4x4,ldr-rgb-04.png,41.5970,0.0181,0.0102,6.4536 +Small,4x4,ldr-rgb-05.png,36.8167,0.0313,0.0234,2.8040 +Small,4x4,ldr-rgb-06.png,34.6862,0.0292,0.0211,3.1007 +Small,4x4,ldr-rgb-07.png,37.6751,0.0353,0.0272,2.4119 +Small,4x4,ldr-rgb-08.png,43.0856,0.0171,0.0093,7.0552 +Small,4x4,ldr-rgb-09.png,41.5841,0.0182,0.0104,6.3053 +Small,4x4,ldr-rgb-10.png,44.2719,0.0088,0.0033,4.9958 +Small,4x4,ldr-rgba-00.png,35.1813,0.0363,0.0281,2.3330 +Small,4x4,ldr-rgba-01.png,38.6094,0.0207,0.0127,5.1482 +Small,4x4,ldr-rgba-02.png,34.5734,0.0296,0.0215,3.0431 +Small,4x4,ldr-xy-00.png,37.4323,0.0158,0.0080,8.2289 +Small,4x4,ldr-xy-01.png,43.7017,0.0167,0.0092,7.1120 +Small,4x4,ldr-xy-02.png,47.3356,0.0136,0.0057,11.5137 +Small,4x4,ldrs-rgba-00.png,35.1865,0.0365,0.0283,2.3170 +Small,4x4,ldrs-rgba-01.png,38.6273,0.0209,0.0129,5.0993 +Small,4x4,ldrs-rgba-02.png,34.5762,0.0296,0.0215,3.0454 +Small,5x5,hdr-rgb-00.hdr,25.5462,0.1316,0.0344,1.9071 +Small,5x5,ldr-rgb-00.png,33.8994,0.0270,0.0182,3.6057 +Small,5x5,ldr-rgb-01.png,36.0025,0.0200,0.0115,5.6967 +Small,5x5,ldr-rgb-02.png,30.8682,0.0268,0.0183,3.5717 +Small,5x5,ldr-rgb-03.png,42.3215,0.0129,0.0047,13.9794 +Small,5x5,ldr-rgb-04.png,37.0861,0.0186,0.0098,6.6983 +Small,5x5,ldr-rgb-05.png,32.9501,0.0307,0.0221,2.9684 +Small,5x5,ldr-rgb-06.png,30.8961,0.0270,0.0182,3.5991 +Small,5x5,ldr-rgb-07.png,34.2645,0.0266,0.0175,3.7372 +Small,5x5,ldr-rgb-08.png,39.4396,0.0156,0.0070,9.3078 +Small,5x5,ldr-rgb-09.png,37.1601,0.0192,0.0106,6.1844 +Small,5x5,ldr-rgb-10.png,40.0273,0.0092,0.0029,5.5370 +Small,5x5,ldr-rgba-00.png,31.4619,0.0363,0.0273,2.4016 +Small,5x5,ldr-rgba-01.png,35.0325,0.0212,0.0125,5.2425 +Small,5x5,ldr-rgba-02.png,31.0113,0.0329,0.0241,2.7185 +Small,5x5,ldr-xy-00.png,36.5528,0.0156,0.0071,9.2642 +Small,5x5,ldr-xy-01.png,39.4510,0.0167,0.0083,7.8523 +Small,5x5,ldr-xy-02.png,43.2162,0.0141,0.0055,11.8964 +Small,5x5,ldrs-rgba-00.png,31.4631,0.0365,0.0274,2.3908 +Small,5x5,ldrs-rgba-01.png,35.0396,0.0214,0.0127,5.1575 +Small,5x5,ldrs-rgba-02.png,31.0130,0.0332,0.0243,2.7002 +Small,6x6,hdr-rgb-00.hdr,23.7301,0.1412,0.0427,1.5361 +Small,6x6,ldr-rgb-00.png,31.3632,0.0373,0.0274,2.3951 +Small,6x6,ldr-rgb-01.png,32.7911,0.0306,0.0210,3.1146 +Small,6x6,ldr-rgb-02.png,27.3311,0.0461,0.0362,1.8081 +Small,6x6,ldr-rgb-03.png,40.3214,0.0154,0.0059,11.0388 +Small,6x6,ldr-rgb-04.png,33.8184,0.0262,0.0163,4.0115 +Small,6x6,ldr-rgb-05.png,29.8295,0.0504,0.0405,1.6179 +Small,6x6,ldr-rgb-06.png,27.3838,0.0467,0.0366,1.7902 +Small,6x6,ldr-rgb-07.png,32.9755,0.0315,0.0214,3.0630 +Small,6x6,ldr-rgb-08.png,37.5691,0.0191,0.0095,6.9094 +Small,6x6,ldr-rgb-09.png,33.4003,0.0289,0.0192,3.4206 +Small,6x6,ldr-rgb-10.png,36.4787,0.0112,0.0038,4.2732 +Small,6x6,ldr-rgba-00.png,28.9310,0.0464,0.0362,1.8125 +Small,6x6,ldr-rgba-01.png,31.9940,0.0262,0.0163,4.0216 +Small,6x6,ldr-rgba-02.png,27.7614,0.0464,0.0365,1.7940 +Small,6x6,ldr-xy-00.png,35.5246,0.0181,0.0083,7.9149 +Small,6x6,ldr-xy-01.png,36.8735,0.0204,0.0109,6.0047 +Small,6x6,ldr-xy-02.png,41.5957,0.0147,0.0049,13.3910 +Small,6x6,ldrs-rgba-00.png,28.9316,0.0472,0.0370,1.7725 +Small,6x6,ldrs-rgba-01.png,31.9999,0.0263,0.0162,4.0389 +Small,6x6,ldrs-rgba-02.png,27.7599,0.0467,0.0368,1.7819 +Small,8x8,hdr-rgb-00.hdr,21.1941,0.1518,0.0485,1.3509 +Small,8x8,ldr-rgb-00.png,27.7644,0.0448,0.0301,2.1743 +Small,8x8,ldr-rgb-01.png,28.6582,0.0394,0.0251,2.6160 +Small,8x8,ldr-rgb-02.png,23.0104,0.0570,0.0426,1.5397 +Small,8x8,ldr-rgb-03.png,37.1610,0.0205,0.0065,10.1450 +Small,8x8,ldr-rgb-04.png,29.2645,0.0379,0.0233,2.8072 +Small,8x8,ldr-rgb-05.png,25.6932,0.0657,0.0512,1.2796 +Small,8x8,ldr-rgb-06.png,23.0553,0.0581,0.0435,1.5081 +Small,8x8,ldr-rgb-07.png,29.7444,0.0337,0.0188,3.4945 +Small,8x8,ldr-rgb-08.png,34.2118,0.0252,0.0108,6.0530 +Small,8x8,ldr-rgb-09.png,28.6096,0.0408,0.0265,2.4717 +Small,8x8,ldr-rgb-10.png,31.9502,0.0169,0.0047,3.4225 +Small,8x8,ldr-rgba-00.png,24.7373,0.0534,0.0384,1.7056 +Small,8x8,ldr-rgba-01.png,28.1681,0.0343,0.0197,3.3277 +Small,8x8,ldr-rgba-02.png,23.8637,0.0571,0.0426,1.5386 +Small,8x8,ldr-xy-00.png,32.9800,0.0249,0.0104,6.2805 +Small,8x8,ldr-xy-01.png,34.1030,0.0265,0.0124,5.2946 +Small,8x8,ldr-xy-02.png,39.8270,0.0179,0.0035,18.6333 +Small,8x8,ldrs-rgba-00.png,24.7372,0.0538,0.0387,1.6947 +Small,8x8,ldrs-rgba-01.png,28.1702,0.0349,0.0205,3.1992 +Small,8x8,ldrs-rgba-02.png,23.8634,0.0573,0.0426,1.5383 +Small,12x12,hdr-rgb-00.hdr,18.6067,0.1675,0.0559,1.1717 +Small,12x12,ldr-rgb-00.png,23.6113,0.0398,0.0172,3.8213 +Small,12x12,ldr-rgb-01.png,24.7556,0.0353,0.0129,5.0688 +Small,12x12,ldr-rgb-02.png,19.2151,0.0597,0.0374,1.7522 +Small,12x12,ldr-rgb-03.png,33.0978,0.0261,0.0041,15.9850 +Small,12x12,ldr-rgb-04.png,24.5342,0.0369,0.0144,4.5556 +Small,12x12,ldr-rgb-05.png,21.4327,0.0541,0.0320,2.0453 +Small,12x12,ldr-rgb-06.png,19.1612,0.0625,0.0401,1.6362 +Small,12x12,ldr-rgb-07.png,25.3299,0.0339,0.0111,5.8829 +Small,12x12,ldr-rgb-08.png,29.9994,0.0294,0.0071,9.2880 +Small,12x12,ldr-rgb-09.png,23.7298,0.0451,0.0227,2.8899 +Small,12x12,ldr-rgb-10.png,27.3129,0.0239,0.0039,4.2114 +Small,12x12,ldr-rgba-00.png,21.0140,0.0519,0.0292,2.2478 +Small,12x12,ldr-rgba-01.png,24.4565,0.0366,0.0140,4.6718 +Small,12x12,ldr-rgba-02.png,20.1464,0.0623,0.0397,1.6497 +Small,12x12,ldr-xy-00.png,28.8186,0.0322,0.0098,6.6831 +Small,12x12,ldr-xy-01.png,30.5809,0.0315,0.0093,7.0355 +Small,12x12,ldr-xy-02.png,38.1333,0.0249,0.0026,24.8152 +Small,12x12,ldrs-rgba-00.png,21.0135,0.0520,0.0290,2.2564 +Small,12x12,ldrs-rgba-01.png,24.4577,0.0366,0.0140,4.6754 +Small,12x12,ldrs-rgba-02.png,20.1461,0.0628,0.0402,1.6308 +Small,3x3x3,ldr-l-00-3.dds,50.7196,0.0281,0.0191,13.7105 +Small,3x3x3,ldr-l-01-3.dds,54.1048,0.0143,0.0074,9.2998 +Small,6x6x6,ldr-l-00-3.dds,32.6133,0.0811,0.0516,5.0791 +Small,6x6x6,ldr-l-01-3.dds,40.8080,0.0476,0.0203,3.3938 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-avx2_fastest_results.csv new file mode 100644 index 0000000..85c4d4c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-avx2_fastest_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,25.9013,0.1178,0.0217,3.0247 +Small,4x4,ldr-rgb-00.png,35.5401,0.0185,0.0105,6.2321 +Small,4x4,ldr-rgb-01.png,38.6539,0.0139,0.0061,10.7228 +Small,4x4,ldr-rgb-02.png,33.9017,0.0220,0.0142,4.6068 +Small,4x4,ldr-rgb-03.png,44.3820,0.0115,0.0040,16.2170 +Small,4x4,ldr-rgb-04.png,40.6541,0.0123,0.0044,14.9252 +Small,4x4,ldr-rgb-05.png,35.3252,0.0166,0.0088,7.4693 +Small,4x4,ldr-rgb-06.png,33.9736,0.0211,0.0131,4.9967 +Small,4x4,ldr-rgb-07.png,35.7343,0.0191,0.0108,6.0474 +Small,4x4,ldr-rgb-08.png,41.1869,0.0129,0.0052,12.4950 +Small,4x4,ldr-rgb-09.png,40.8303,0.0125,0.0047,14.0001 +Small,4x4,ldr-rgb-10.png,42.1183,0.0076,0.0022,7.4574 +Small,4x4,ldr-rgba-00.png,32.3988,0.0235,0.0151,4.3261 +Small,4x4,ldr-rgba-01.png,38.1315,0.0137,0.0057,11.5340 +Small,4x4,ldr-rgba-02.png,33.8019,0.0194,0.0114,5.7599 +Small,4x4,ldr-xy-00.png,36.9627,0.0127,0.0050,13.2026 +Small,4x4,ldr-xy-01.png,40.4676,0.0132,0.0056,11.6341 +Small,4x4,ldr-xy-02.png,44.0312,0.0114,0.0035,18.4717 +Small,4x4,ldrs-rgba-00.png,32.4007,0.0233,0.0150,4.3650 +Small,4x4,ldrs-rgba-01.png,38.1423,0.0139,0.0059,11.1971 +Small,4x4,ldrs-rgba-02.png,33.8070,0.0195,0.0113,5.7751 +Small,5x5,hdr-rgb-00.hdr,24.4063,0.1181,0.0205,3.2034 +Small,5x5,ldr-rgb-00.png,32.7185,0.0151,0.0067,9.7568 +Small,5x5,ldr-rgb-01.png,35.3125,0.0113,0.0032,20.7722 +Small,5x5,ldr-rgb-02.png,30.5420,0.0152,0.0070,9.3397 +Small,5x5,ldr-rgb-03.png,41.0871,0.0109,0.0031,21.4581 +Small,5x5,ldr-rgb-04.png,35.6347,0.0113,0.0030,21.9253 +Small,5x5,ldr-rgb-05.png,31.6680,0.0140,0.0058,11.3347 +Small,5x5,ldr-rgb-06.png,30.5668,0.0158,0.0074,8.8419 +Small,5x5,ldr-rgb-07.png,32.5478,0.0140,0.0053,12.3280 +Small,5x5,ldr-rgb-08.png,38.1010,0.0116,0.0034,19.2195 +Small,5x5,ldr-rgb-09.png,35.6999,0.0115,0.0033,19.8468 +Small,5x5,ldr-rgb-10.png,39.1121,0.0076,0.0017,9.5015 +Small,5x5,ldr-rgba-00.png,29.7540,0.0191,0.0105,6.2332 +Small,5x5,ldr-rgba-01.png,34.3669,0.0125,0.0041,15.8834 +Small,5x5,ldr-rgba-02.png,30.6075,0.0162,0.0077,8.5400 +Small,5x5,ldr-xy-00.png,35.8831,0.0118,0.0036,18.3988 +Small,5x5,ldr-xy-01.png,37.6330,0.0125,0.0046,14.2468 +Small,5x5,ldr-xy-02.png,42.1351,0.0108,0.0026,25.5297 +Small,5x5,ldrs-rgba-00.png,29.7621,0.0193,0.0107,6.1391 +Small,5x5,ldrs-rgba-01.png,34.3681,0.0126,0.0042,15.7767 +Small,5x5,ldrs-rgba-02.png,30.6094,0.0161,0.0078,8.4228 +Small,6x6,hdr-rgb-00.hdr,22.8297,0.1207,0.0228,2.8804 +Small,6x6,ldr-rgb-00.png,29.8940,0.0162,0.0070,9.3382 +Small,6x6,ldr-rgb-01.png,31.7369,0.0126,0.0037,17.9202 +Small,6x6,ldr-rgb-02.png,26.8847,0.0194,0.0104,6.2822 +Small,6x6,ldr-rgb-03.png,39.0152,0.0114,0.0028,23.6515 +Small,6x6,ldr-rgb-04.png,32.1322,0.0128,0.0036,17.9941 +Small,6x6,ldr-rgb-05.png,28.5469,0.0160,0.0070,9.3972 +Small,6x6,ldr-rgb-06.png,26.8933,0.0197,0.0105,6.2343 +Small,6x6,ldr-rgb-07.png,30.5744,0.0140,0.0047,13.9468 +Small,6x6,ldr-rgb-08.png,35.8219,0.0123,0.0034,19.1847 +Small,6x6,ldr-rgb-09.png,31.5939,0.0141,0.0050,13.0003 +Small,6x6,ldr-rgb-10.png,34.7916,0.0084,0.0017,9.5454 +Small,6x6,ldr-rgba-00.png,27.0190,0.0208,0.0114,5.7568 +Small,6x6,ldr-rgba-01.png,31.3894,0.0135,0.0043,15.0659 +Small,6x6,ldr-rgba-02.png,27.4089,0.0201,0.0107,6.1009 +Small,6x6,ldr-xy-00.png,34.4437,0.0127,0.0038,17.4437 +Small,6x6,ldr-xy-01.png,34.9945,0.0130,0.0043,15.2481 +Small,6x6,ldr-xy-02.png,41.1217,0.0114,0.0024,27.6287 +Small,6x6,ldrs-rgba-00.png,27.0177,0.0209,0.0114,5.7570 +Small,6x6,ldrs-rgba-01.png,31.3930,0.0136,0.0044,14.9863 +Small,6x6,ldrs-rgba-02.png,27.4079,0.0198,0.0106,6.1851 +Small,8x8,hdr-rgb-00.hdr,20.7229,0.1339,0.0313,2.0965 +Small,8x8,ldr-rgb-00.png,26.0768,0.0194,0.0062,10.5893 +Small,8x8,ldr-rgb-01.png,27.6111,0.0168,0.0037,17.9004 +Small,8x8,ldr-rgb-02.png,22.6789,0.0265,0.0135,4.8498 +Small,8x8,ldr-rgb-03.png,35.3649,0.0152,0.0025,25.7908 +Small,8x8,ldr-rgb-04.png,27.5653,0.0174,0.0041,16.0907 +Small,8x8,ldr-rgb-05.png,24.6789,0.0205,0.0072,9.0432 +Small,8x8,ldr-rgb-06.png,22.6857,0.0262,0.0130,5.0443 +Small,8x8,ldr-rgb-07.png,26.9996,0.0173,0.0038,17.4625 +Small,8x8,ldr-rgb-08.png,32.3078,0.0164,0.0033,19.8525 +Small,8x8,ldr-rgb-09.png,26.9700,0.0181,0.0051,12.9617 +Small,8x8,ldr-rgb-10.png,30.5983,0.0126,0.0019,8.7447 +Small,8x8,ldr-rgba-00.png,23.2790,0.0239,0.0104,6.3179 +Small,8x8,ldr-rgba-01.png,27.5382,0.0179,0.0046,14.3061 +Small,8x8,ldr-rgba-02.png,23.5944,0.0272,0.0140,4.6761 +Small,8x8,ldr-xy-00.png,31.0189,0.0173,0.0042,15.5588 +Small,8x8,ldr-xy-01.png,31.6408,0.0163,0.0035,18.7771 +Small,8x8,ldr-xy-02.png,39.5041,0.0155,0.0024,27.4001 +Small,8x8,ldrs-rgba-00.png,23.2784,0.0239,0.0105,6.2540 +Small,8x8,ldrs-rgba-01.png,27.5393,0.0179,0.0045,14.4353 +Small,8x8,ldrs-rgba-02.png,23.5937,0.0273,0.0141,4.6410 +Small,12x12,hdr-rgb-00.hdr,18.4354,0.1416,0.0346,1.8915 +Small,12x12,ldr-rgb-00.png,22.2178,0.0215,0.0032,20.7722 +Small,12x12,ldr-rgb-01.png,23.9444,0.0204,0.0024,27.6760 +Small,12x12,ldr-rgb-02.png,18.8268,0.0233,0.0050,12.9954 +Small,12x12,ldr-rgb-03.png,32.1095,0.0200,0.0023,28.6063 +Small,12x12,ldr-rgb-04.png,23.1291,0.0209,0.0027,23.9003 +Small,12x12,ldr-rgb-05.png,20.3606,0.0212,0.0030,21.8382 +Small,12x12,ldr-rgb-06.png,18.7065,0.0234,0.0048,13.6932 +Small,12x12,ldr-rgb-07.png,23.8295,0.0212,0.0025,26.0375 +Small,12x12,ldr-rgb-08.png,28.6338,0.0203,0.0024,27.6037 +Small,12x12,ldr-rgb-09.png,21.9118,0.0212,0.0031,20.8320 +Small,12x12,ldr-rgb-10.png,26.3721,0.0173,0.0014,11.3751 +Small,12x12,ldr-rgba-00.png,20.0485,0.0259,0.0072,9.1480 +Small,12x12,ldr-rgba-01.png,23.8042,0.0211,0.0027,23.8320 +Small,12x12,ldr-rgba-02.png,19.8756,0.0237,0.0051,12.7631 +Small,12x12,ldr-xy-00.png,27.2775,0.0212,0.0031,21.0376 +Small,12x12,ldr-xy-01.png,27.5355,0.0214,0.0035,18.4866 +Small,12x12,ldr-xy-02.png,38.1044,0.0206,0.0024,26.8593 +Small,12x12,ldrs-rgba-00.png,20.0498,0.0260,0.0072,9.0420 +Small,12x12,ldrs-rgba-01.png,23.8055,0.0211,0.0028,23.7373 +Small,12x12,ldrs-rgba-02.png,19.8752,0.0237,0.0052,12.6102 +Small,3x3x3,ldr-l-00-3.dds,49.3077,0.0263,0.0172,15.2668 +Small,3x3x3,ldr-l-01-3.dds,53.8732,0.0143,0.0074,9.2974 +Small,6x6x6,ldr-l-00-3.dds,32.1173,0.0770,0.0475,5.5159 +Small,6x6x6,ldr-l-01-3.dds,40.5942,0.0472,0.0198,3.4740 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-avx2_medium_results.csv new file mode 100644 index 0000000..6570690 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-avx2_medium_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,32.3616,0.1604,0.0635,1.0316 +Small,4x4,ldr-rgb-00.png,38.6186,0.0692,0.0609,1.0756 +Small,4x4,ldr-rgb-01.png,39.9904,0.0613,0.0532,1.2313 +Small,4x4,ldr-rgb-02.png,35.0864,0.0616,0.0535,1.2239 +Small,4x4,ldr-rgb-03.png,46.9643,0.0391,0.0314,2.0842 +Small,4x4,ldr-rgb-04.png,41.9794,0.0508,0.0427,1.5355 +Small,4x4,ldr-rgb-05.png,37.6292,0.0680,0.0598,1.0956 +Small,4x4,ldr-rgb-06.png,35.2309,0.0555,0.0472,1.3871 +Small,4x4,ldr-rgb-07.png,38.6220,0.0812,0.0726,0.9025 +Small,4x4,ldr-rgb-08.png,44.5908,0.0443,0.0364,1.8027 +Small,4x4,ldr-rgb-09.png,41.9104,0.0510,0.0429,1.5278 +Small,4x4,ldr-rgb-10.png,44.8283,0.0139,0.0081,1.9995 +Small,4x4,ldr-rgba-00.png,36.1397,0.0786,0.0701,0.9355 +Small,4x4,ldr-rgba-01.png,38.8010,0.0433,0.0349,1.8765 +Small,4x4,ldr-rgba-02.png,34.7461,0.0644,0.0562,1.1665 +Small,4x4,ldr-xy-00.png,37.6959,0.0376,0.0296,2.2156 +Small,4x4,ldr-xy-01.png,44.9855,0.0510,0.0433,1.5139 +Small,4x4,ldr-xy-02.png,50.9056,0.0515,0.0434,1.5111 +Small,4x4,ldrs-rgba-00.png,36.1447,0.0796,0.0711,0.9213 +Small,4x4,ldrs-rgba-01.png,38.8178,0.0440,0.0358,1.8283 +Small,4x4,ldrs-rgba-02.png,34.7492,0.0649,0.0567,1.1568 +Small,5x5,hdr-rgb-00.hdr,26.5177,0.1721,0.0744,0.8811 +Small,5x5,ldr-rgb-00.png,35.0100,0.0764,0.0667,0.9822 +Small,5x5,ldr-rgb-01.png,36.3412,0.0578,0.0487,1.3448 +Small,5x5,ldr-rgb-02.png,30.9700,0.0602,0.0508,1.2890 +Small,5x5,ldr-rgb-03.png,43.5605,0.0242,0.0153,4.2904 +Small,5x5,ldr-rgb-04.png,37.5544,0.0508,0.0414,1.5818 +Small,5x5,ldr-rgb-05.png,33.4512,0.0825,0.0733,0.8945 +Small,5x5,ldr-rgb-06.png,30.9908,0.0569,0.0473,1.3843 +Small,5x5,ldr-rgb-07.png,35.6054,0.0847,0.0752,0.8718 +Small,5x5,ldr-rgb-08.png,41.1640,0.0383,0.0291,2.2539 +Small,5x5,ldr-rgb-09.png,37.4846,0.0484,0.0392,1.6723 +Small,5x5,ldr-rgb-10.png,40.4607,0.0164,0.0094,1.7209 +Small,5x5,ldr-rgba-00.png,32.7046,0.0968,0.0869,0.7541 +Small,5x5,ldr-rgba-01.png,35.2093,0.0512,0.0418,1.5671 +Small,5x5,ldr-rgba-02.png,31.0406,0.0823,0.0727,0.9015 +Small,5x5,ldr-xy-00.png,37.1119,0.0383,0.0291,2.2546 +Small,5x5,ldr-xy-01.png,40.9199,0.0473,0.0384,1.7070 +Small,5x5,ldr-xy-02.png,48.7008,0.0299,0.0206,3.1860 +Small,5x5,ldrs-rgba-00.png,32.7058,0.0969,0.0872,0.7513 +Small,5x5,ldrs-rgba-01.png,35.2165,0.0514,0.0419,1.5634 +Small,5x5,ldrs-rgba-02.png,31.0419,0.0825,0.0730,0.8982 +Small,6x6,hdr-rgb-00.hdr,24.7323,0.1751,0.0763,0.8594 +Small,6x6,ldr-rgb-00.png,32.3215,0.0877,0.0769,0.8523 +Small,6x6,ldr-rgb-01.png,33.0336,0.0772,0.0668,0.9809 +Small,6x6,ldr-rgb-02.png,27.3867,0.0922,0.0818,0.8013 +Small,6x6,ldr-rgb-03.png,41.4371,0.0244,0.0144,4.5413 +Small,6x6,ldr-rgb-04.png,34.1260,0.0692,0.0586,1.1186 +Small,6x6,ldr-rgb-05.png,30.1074,0.1266,0.1160,0.5651 +Small,6x6,ldr-rgb-06.png,27.4381,0.1050,0.0943,0.6947 +Small,6x6,ldr-rgb-07.png,33.9556,0.1079,0.0969,0.6767 +Small,6x6,ldr-rgb-08.png,39.0372,0.0411,0.0306,2.1397 +Small,6x6,ldr-rgb-09.png,33.6201,0.0811,0.0705,0.9295 +Small,6x6,ldr-rgb-10.png,36.8847,0.0222,0.0135,1.2033 +Small,6x6,ldr-rgba-00.png,30.1133,0.1274,0.1165,0.5628 +Small,6x6,ldr-rgba-01.png,32.1295,0.0605,0.0496,1.3200 +Small,6x6,ldr-rgba-02.png,27.7849,0.0981,0.0872,0.7519 +Small,6x6,ldr-xy-00.png,36.0271,0.0354,0.0249,2.6348 +Small,6x6,ldr-xy-01.png,37.9588,0.0394,0.0291,2.2559 +Small,6x6,ldr-xy-02.png,45.0705,0.0259,0.0153,4.2940 +Small,6x6,ldrs-rgba-00.png,30.1144,0.1093,0.0981,0.6679 +Small,6x6,ldrs-rgba-01.png,32.1349,0.0532,0.0424,1.5472 +Small,6x6,ldrs-rgba-02.png,27.7835,0.0891,0.0783,0.8367 +Small,8x8,hdr-rgb-00.hdr,21.4320,0.1818,0.0783,0.8371 +Small,8x8,ldr-rgb-00.png,28.6493,0.1132,0.0972,0.6741 +Small,8x8,ldr-rgb-01.png,28.8554,0.0939,0.0781,0.8391 +Small,8x8,ldr-rgb-02.png,23.0793,0.1098,0.0939,0.6982 +Small,8x8,ldr-rgb-03.png,38.2658,0.0316,0.0161,4.0779 +Small,8x8,ldr-rgb-04.png,29.5754,0.0887,0.0729,0.8989 +Small,8x8,ldr-rgb-05.png,25.8717,0.1265,0.1106,0.5927 +Small,8x8,ldr-rgb-06.png,23.1192,0.1080,0.0923,0.7102 +Small,8x8,ldr-rgb-07.png,30.6667,0.1016,0.0856,0.7653 +Small,8x8,ldr-rgb-08.png,35.6982,0.0443,0.0287,2.2865 +Small,8x8,ldr-rgb-09.png,28.9985,0.0869,0.0713,0.9190 +Small,8x8,ldr-rgb-10.png,32.1108,0.0276,0.0141,1.1529 +Small,8x8,ldr-rgba-00.png,26.0222,0.1320,0.1158,0.5660 +Small,8x8,ldr-rgba-01.png,28.2807,0.0601,0.0441,1.4849 +Small,8x8,ldr-rgba-02.png,23.8775,0.1000,0.0839,0.7808 +Small,8x8,ldr-xy-00.png,33.9706,0.0474,0.0316,2.0744 +Small,8x8,ldr-xy-01.png,35.0076,0.0462,0.0307,2.1340 +Small,8x8,ldr-xy-02.png,40.7561,0.0256,0.0096,6.8203 +Small,8x8,ldrs-rgba-00.png,26.0229,0.1325,0.1164,0.5628 +Small,8x8,ldrs-rgba-01.png,28.2841,0.0612,0.0452,1.4497 +Small,8x8,ldrs-rgba-02.png,23.8771,0.1003,0.0844,0.7769 +Small,12x12,hdr-rgb-00.hdr,18.7253,0.2130,0.0988,0.6634 +Small,12x12,ldr-rgb-00.png,24.4659,0.1174,0.0919,0.7128 +Small,12x12,ldr-rgb-01.png,24.9925,0.1111,0.0853,0.7684 +Small,12x12,ldr-rgb-02.png,19.2481,0.1265,0.1008,0.6502 +Small,12x12,ldr-rgb-03.png,34.6525,0.0405,0.0151,4.3543 +Small,12x12,ldr-rgb-04.png,24.8440,0.1044,0.0790,0.8298 +Small,12x12,ldr-rgb-05.png,21.5754,0.1447,0.1188,0.5514 +Small,12x12,ldr-rgb-06.png,19.1991,0.1223,0.0963,0.6808 +Small,12x12,ldr-rgb-07.png,26.5936,0.1052,0.0792,0.8278 +Small,12x12,ldr-rgb-08.png,31.1465,0.0533,0.0278,2.3544 +Small,12x12,ldr-rgb-09.png,24.2324,0.1105,0.0853,0.7683 +Small,12x12,ldr-rgb-10.png,27.8888,0.0452,0.0223,0.7305 +Small,12x12,ldr-rgba-00.png,21.7589,0.1226,0.0963,0.6803 +Small,12x12,ldr-rgba-01.png,24.5625,0.0709,0.0450,1.4554 +Small,12x12,ldr-rgba-02.png,20.1486,0.1136,0.0875,0.7487 +Small,12x12,ldr-xy-00.png,29.7046,0.0575,0.0319,2.0538 +Small,12x12,ldr-xy-01.png,31.9137,0.0514,0.0262,2.5025 +Small,12x12,ldr-xy-02.png,38.1657,0.0283,0.0027,24.1842 +Small,12x12,ldrs-rgba-00.png,21.7593,0.1229,0.0967,0.6780 +Small,12x12,ldrs-rgba-01.png,24.5645,0.0716,0.0456,1.4385 +Small,12x12,ldrs-rgba-02.png,20.1484,0.1148,0.0886,0.7396 +Small,3x3x3,ldr-l-00-3.dds,51.8519,0.0402,0.0310,8.4426 +Small,3x3x3,ldr-l-01-3.dds,54.3882,0.0152,0.0082,8.3987 +Small,6x6x6,ldr-l-00-3.dds,32.9180,0.0993,0.0699,3.7529 +Small,6x6x6,ldr-l-01-3.dds,40.8335,0.0476,0.0209,3.2989 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-avx2_thorough_results.csv new file mode 100644 index 0000000..50d317c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-avx2_thorough_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,32.6257,0.2388,0.1437,0.4562 +Small,4x4,ldr-rgb-00.png,39.1011,0.1573,0.1487,0.4408 +Small,4x4,ldr-rgb-01.png,40.2753,0.1491,0.1410,0.4647 +Small,4x4,ldr-rgb-02.png,35.3312,0.1361,0.1280,0.5120 +Small,4x4,ldr-rgb-03.png,47.6552,0.1589,0.1511,0.4338 +Small,4x4,ldr-rgb-04.png,42.2447,0.1342,0.1256,0.5218 +Small,4x4,ldr-rgb-05.png,37.9471,0.1481,0.1398,0.4687 +Small,4x4,ldr-rgb-06.png,35.4333,0.1282,0.1196,0.5480 +Small,4x4,ldr-rgb-07.png,39.6965,0.1707,0.1620,0.4044 +Small,4x4,ldr-rgb-08.png,45.6560,0.1463,0.1383,0.4740 +Small,4x4,ldr-rgb-09.png,42.1582,0.1401,0.1318,0.4971 +Small,4x4,ldr-rgb-10.png,44.9944,0.0257,0.0198,0.8203 +Small,4x4,ldr-rgba-00.png,36.7422,0.1604,0.1517,0.4320 +Small,4x4,ldr-rgba-01.png,39.0115,0.1390,0.1306,0.5017 +Small,4x4,ldr-rgba-02.png,34.9453,0.1605,0.1521,0.4307 +Small,4x4,ldr-xy-00.png,37.7350,0.1348,0.1266,0.5175 +Small,4x4,ldr-xy-01.png,45.4829,0.1331,0.1251,0.5239 +Small,4x4,ldr-xy-02.png,51.0007,0.1640,0.1558,0.4208 +Small,4x4,ldrs-rgba-00.png,36.7505,0.1611,0.1525,0.4298 +Small,4x4,ldrs-rgba-01.png,39.0325,0.1405,0.1320,0.4965 +Small,4x4,ldrs-rgba-02.png,34.9504,0.1611,0.1527,0.4291 +Small,5x5,hdr-rgb-00.hdr,27.4762,0.2431,0.1476,0.4440 +Small,5x5,ldr-rgb-00.png,35.3221,0.1712,0.1617,0.4054 +Small,5x5,ldr-rgb-01.png,36.4859,0.1637,0.1545,0.4241 +Small,5x5,ldr-rgb-02.png,31.1011,0.1486,0.1393,0.4704 +Small,5x5,ldr-rgb-03.png,44.4621,0.1643,0.1553,0.4221 +Small,5x5,ldr-rgb-04.png,37.7979,0.1431,0.1337,0.4903 +Small,5x5,ldr-rgb-05.png,33.6558,0.1632,0.1538,0.4260 +Small,5x5,ldr-rgb-06.png,31.0952,0.1431,0.1335,0.4908 +Small,5x5,ldr-rgb-07.png,36.5891,0.1852,0.1756,0.3733 +Small,5x5,ldr-rgb-08.png,42.2366,0.1527,0.1434,0.4569 +Small,5x5,ldr-rgb-09.png,37.6643,0.1519,0.1425,0.4600 +Small,5x5,ldr-rgb-10.png,40.7404,0.0312,0.0241,0.6736 +Small,5x5,ldr-rgba-00.png,33.1224,0.1803,0.1706,0.3842 +Small,5x5,ldr-rgba-01.png,35.3488,0.1587,0.1493,0.4391 +Small,5x5,ldr-rgba-02.png,31.1475,0.1932,0.1837,0.3567 +Small,5x5,ldr-xy-00.png,37.2677,0.1263,0.1170,0.5604 +Small,5x5,ldr-xy-01.png,41.7309,0.1571,0.1481,0.4425 +Small,5x5,ldr-xy-02.png,49.2472,0.1768,0.1673,0.3916 +Small,5x5,ldrs-rgba-00.png,33.1249,0.1827,0.1729,0.3790 +Small,5x5,ldrs-rgba-01.png,35.3573,0.1599,0.1505,0.4355 +Small,5x5,ldrs-rgba-02.png,31.1476,0.1941,0.1846,0.3550 +Small,6x6,hdr-rgb-00.hdr,24.8349,0.2435,0.1463,0.4479 +Small,6x6,ldr-rgb-00.png,32.6463,0.1972,0.1863,0.3518 +Small,6x6,ldr-rgb-01.png,33.1760,0.2010,0.1904,0.3441 +Small,6x6,ldr-rgb-02.png,27.4903,0.2030,0.1922,0.3410 +Small,6x6,ldr-rgb-03.png,42.5136,0.1188,0.1085,0.6042 +Small,6x6,ldr-rgb-04.png,34.3341,0.1911,0.1803,0.3634 +Small,6x6,ldr-rgb-05.png,30.2804,0.2054,0.1944,0.3371 +Small,6x6,ldr-rgb-06.png,27.5520,0.2008,0.1900,0.3449 +Small,6x6,ldr-rgb-07.png,34.3789,0.1999,0.1889,0.3470 +Small,6x6,ldr-rgb-08.png,39.8926,0.1175,0.1069,0.6130 +Small,6x6,ldr-rgb-09.png,33.8281,0.1837,0.1728,0.3792 +Small,6x6,ldr-rgb-10.png,37.1218,0.0368,0.0284,0.5732 +Small,6x6,ldr-rgba-00.png,30.4829,0.2018,0.1907,0.3437 +Small,6x6,ldr-rgba-01.png,32.2487,0.1726,0.1614,0.4060 +Small,6x6,ldr-rgba-02.png,27.8831,0.2172,0.2064,0.3176 +Small,6x6,ldr-xy-00.png,36.3665,0.0927,0.0821,0.7981 +Small,6x6,ldr-xy-01.png,38.4666,0.1341,0.1237,0.5298 +Small,6x6,ldr-xy-02.png,47.4520,0.1729,0.1621,0.4042 +Small,6x6,ldrs-rgba-00.png,30.4838,0.2031,0.1918,0.3416 +Small,6x6,ldrs-rgba-01.png,32.2549,0.1738,0.1628,0.4027 +Small,6x6,ldrs-rgba-02.png,27.8824,0.2174,0.2065,0.3173 +Small,8x8,hdr-rgb-00.hdr,21.7370,0.2560,0.1525,0.4299 +Small,8x8,ldr-rgb-00.png,28.9325,0.2218,0.2054,0.3190 +Small,8x8,ldr-rgb-01.png,29.0009,0.2116,0.1953,0.3356 +Small,8x8,ldr-rgb-02.png,23.1717,0.2272,0.2111,0.3105 +Small,8x8,ldr-rgb-03.png,39.4327,0.0649,0.0491,1.3337 +Small,8x8,ldr-rgb-04.png,29.7722,0.2113,0.1950,0.3360 +Small,8x8,ldr-rgb-05.png,26.0309,0.2299,0.2135,0.3070 +Small,8x8,ldr-rgb-06.png,23.2299,0.2273,0.2108,0.3109 +Small,8x8,ldr-rgb-07.png,31.1331,0.2161,0.1994,0.3286 +Small,8x8,ldr-rgb-08.png,36.4987,0.1037,0.0874,0.7501 +Small,8x8,ldr-rgb-09.png,29.1978,0.1782,0.1620,0.4046 +Small,8x8,ldr-rgb-10.png,32.3450,0.0452,0.0314,0.5175 +Small,8x8,ldr-rgba-00.png,26.4881,0.2278,0.2112,0.3103 +Small,8x8,ldr-rgba-01.png,28.3958,0.1890,0.1725,0.3800 +Small,8x8,ldr-rgba-02.png,23.9557,0.2249,0.2083,0.3146 +Small,8x8,ldr-xy-00.png,34.2722,0.1034,0.0873,0.7504 +Small,8x8,ldr-xy-01.png,35.4903,0.0961,0.0800,0.8193 +Small,8x8,ldr-xy-02.png,44.4205,0.1069,0.0906,0.7236 +Small,8x8,ldrs-rgba-00.png,26.4899,0.2286,0.2118,0.3094 +Small,8x8,ldrs-rgba-01.png,28.3990,0.1891,0.1724,0.3801 +Small,8x8,ldrs-rgba-02.png,23.9552,0.2253,0.2088,0.3139 +Small,12x12,hdr-rgb-00.hdr,18.8998,0.2796,0.1659,0.3951 +Small,12x12,ldr-rgb-00.png,24.9028,0.2381,0.2116,0.3097 +Small,12x12,ldr-rgb-01.png,25.1435,0.2169,0.1901,0.3448 +Small,12x12,ldr-rgb-02.png,19.3029,0.2500,0.2231,0.2938 +Small,12x12,ldr-rgb-03.png,36.1094,0.0730,0.0464,1.4124 +Small,12x12,ldr-rgb-04.png,25.0031,0.2235,0.1964,0.3336 +Small,12x12,ldr-rgb-05.png,21.7060,0.2516,0.2245,0.2919 +Small,12x12,ldr-rgb-06.png,19.2656,0.2479,0.2209,0.2967 +Small,12x12,ldr-rgb-07.png,27.0496,0.2289,0.2015,0.3253 +Small,12x12,ldr-rgb-08.png,32.1972,0.1002,0.0733,0.8941 +Small,12x12,ldr-rgb-09.png,24.4312,0.2121,0.1853,0.3538 +Small,12x12,ldr-rgb-10.png,28.1634,0.0691,0.0448,0.3628 +Small,12x12,ldr-rgba-00.png,22.2648,0.2420,0.2145,0.3055 +Small,12x12,ldr-rgba-01.png,24.6914,0.1809,0.1539,0.4258 +Small,12x12,ldr-rgba-02.png,20.2045,0.2061,0.1791,0.3660 +Small,12x12,ldr-xy-00.png,30.4261,0.1287,0.1016,0.6453 +Small,12x12,ldr-xy-01.png,32.4701,0.0935,0.0669,0.9794 +Small,12x12,ldr-xy-02.png,39.8495,0.0634,0.0363,1.8064 +Small,12x12,ldrs-rgba-00.png,22.2650,0.2426,0.2153,0.3044 +Small,12x12,ldrs-rgba-01.png,24.6931,0.1824,0.1553,0.4220 +Small,12x12,ldrs-rgba-02.png,20.2044,0.2075,0.1804,0.3633 +Small,3x3x3,ldr-l-00-3.dds,52.4074,0.0903,0.0811,3.2304 +Small,3x3x3,ldr-l-01-3.dds,55.4199,0.0396,0.0327,2.1108 +Small,6x6x6,ldr-l-00-3.dds,33.2677,0.1532,0.1235,2.1218 +Small,6x6x6,ldr-l-01-3.dds,41.7102,0.0580,0.0313,2.2044 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse2_fast_results.csv new file mode 100644 index 0000000..edd8339 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse2_fast_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,31.2477,0.1451,0.0412,1.5903 +Small,4x4,ldr-rgb-00.png,37.6610,0.0341,0.0261,2.5116 +Small,4x4,ldr-rgb-01.png,39.4292,0.0266,0.0187,3.4960 +Small,4x4,ldr-rgb-02.png,34.5574,0.0395,0.0317,2.0693 +Small,4x4,ldr-rgb-03.png,45.5738,0.0150,0.0075,8.7826 +Small,4x4,ldr-rgb-04.png,41.5970,0.0216,0.0135,4.8444 +Small,4x4,ldr-rgb-05.png,36.8167,0.0391,0.0312,2.1035 +Small,4x4,ldr-rgb-06.png,34.6862,0.0364,0.0284,2.3063 +Small,4x4,ldr-rgb-07.png,37.6751,0.0437,0.0356,1.8395 +Small,4x4,ldr-rgb-08.png,43.0856,0.0198,0.0120,5.4391 +Small,4x4,ldr-rgb-09.png,41.5841,0.0215,0.0136,4.8114 +Small,4x4,ldr-rgb-10.png,44.2719,0.0093,0.0038,4.2545 +Small,4x4,ldr-rgba-00.png,35.1813,0.0448,0.0364,1.8021 +Small,4x4,ldr-rgba-01.png,38.6094,0.0250,0.0170,3.8555 +Small,4x4,ldr-rgba-02.png,34.5734,0.0365,0.0284,2.3038 +Small,4x4,ldr-xy-00.png,37.4323,0.0179,0.0101,6.4957 +Small,4x4,ldr-xy-01.png,43.7017,0.0192,0.0116,5.6633 +Small,4x4,ldr-xy-02.png,47.3356,0.0148,0.0069,9.5354 +Small,4x4,ldrs-rgba-00.png,35.1865,0.0449,0.0365,1.7962 +Small,4x4,ldrs-rgba-01.png,38.6273,0.0251,0.0170,3.8503 +Small,4x4,ldrs-rgba-02.png,34.5762,0.0367,0.0286,2.2895 +Small,5x5,hdr-rgb-00.hdr,25.5462,0.1506,0.0460,1.4232 +Small,5x5,ldr-rgb-00.png,33.8994,0.0332,0.0245,2.6754 +Small,5x5,ldr-rgb-01.png,36.0025,0.0244,0.0158,4.1520 +Small,5x5,ldr-rgb-02.png,30.8682,0.0344,0.0258,2.5399 +Small,5x5,ldr-rgb-03.png,42.3215,0.0139,0.0056,11.7239 +Small,5x5,ldr-rgb-04.png,37.0861,0.0217,0.0130,5.0603 +Small,5x5,ldr-rgb-05.png,32.9501,0.0393,0.0306,2.1397 +Small,5x5,ldr-rgb-06.png,30.8961,0.0340,0.0253,2.5878 +Small,5x5,ldr-rgb-07.png,34.2645,0.0328,0.0238,2.7503 +Small,5x5,ldr-rgb-08.png,39.4396,0.0175,0.0091,7.2033 +Small,5x5,ldr-rgb-09.png,37.1601,0.0229,0.0143,4.5945 +Small,5x5,ldr-rgb-10.png,40.0273,0.0096,0.0034,4.7670 +Small,5x5,ldr-rgba-00.png,31.4619,0.0460,0.0369,1.7782 +Small,5x5,ldr-rgba-01.png,35.0325,0.0260,0.0172,3.8160 +Small,5x5,ldr-rgba-02.png,31.0113,0.0423,0.0335,1.9535 +Small,5x5,ldr-xy-00.png,36.5528,0.0175,0.0089,7.3412 +Small,5x5,ldr-xy-01.png,39.4510,0.0192,0.0108,6.0586 +Small,5x5,ldr-xy-02.png,43.2162,0.0153,0.0066,9.9568 +Small,5x5,ldrs-rgba-00.png,31.4631,0.0462,0.0370,1.7689 +Small,5x5,ldrs-rgba-01.png,35.0396,0.0258,0.0171,3.8314 +Small,5x5,ldrs-rgba-02.png,31.0130,0.0428,0.0339,1.9321 +Small,6x6,hdr-rgb-00.hdr,23.7301,0.1623,0.0577,1.1356 +Small,6x6,ldr-rgb-00.png,31.3632,0.0470,0.0371,1.7674 +Small,6x6,ldr-rgb-01.png,32.7911,0.0381,0.0283,2.3124 +Small,6x6,ldr-rgb-02.png,27.3311,0.0602,0.0504,1.3010 +Small,6x6,ldr-rgb-03.png,40.3214,0.0168,0.0073,8.9310 +Small,6x6,ldr-rgb-04.png,33.8184,0.0320,0.0222,2.9581 +Small,6x6,ldr-rgb-05.png,29.8295,0.0658,0.0560,1.1713 +Small,6x6,ldr-rgb-06.png,27.3838,0.0609,0.0509,1.2884 +Small,6x6,ldr-rgb-07.png,32.9755,0.0389,0.0289,2.2675 +Small,6x6,ldr-rgb-08.png,37.5691,0.0217,0.0122,5.3886 +Small,6x6,ldr-rgb-09.png,33.4003,0.0357,0.0258,2.5359 +Small,6x6,ldr-rgb-10.png,36.4787,0.0119,0.0044,3.6695 +Small,6x6,ldr-rgba-00.png,28.9310,0.0600,0.0496,1.3214 +Small,6x6,ldr-rgba-01.png,31.9940,0.0325,0.0225,2.9095 +Small,6x6,ldr-rgba-02.png,27.7614,0.0608,0.0505,1.2965 +Small,6x6,ldr-xy-00.png,35.5246,0.0205,0.0107,6.1455 +Small,6x6,ldr-xy-01.png,36.8735,0.0239,0.0144,4.5429 +Small,6x6,ldr-xy-02.png,41.5957,0.0160,0.0062,10.6546 +Small,6x6,ldrs-rgba-00.png,28.9316,0.0605,0.0501,1.3078 +Small,6x6,ldrs-rgba-01.png,31.9999,0.0326,0.0226,2.8971 +Small,6x6,ldrs-rgba-02.png,27.7599,0.0609,0.0508,1.2892 +Small,8x8,hdr-rgb-00.hdr,21.1941,0.1759,0.0661,0.9921 +Small,8x8,ldr-rgb-00.png,27.7644,0.0564,0.0417,1.5733 +Small,8x8,ldr-rgb-01.png,28.6582,0.0484,0.0340,1.9250 +Small,8x8,ldr-rgb-02.png,23.0104,0.0746,0.0601,1.0900 +Small,8x8,ldr-rgb-03.png,37.1610,0.0220,0.0080,8.2415 +Small,8x8,ldr-rgb-04.png,29.2645,0.0464,0.0318,2.0578 +Small,8x8,ldr-rgb-05.png,25.6932,0.0862,0.0717,0.9146 +Small,8x8,ldr-rgb-06.png,23.0553,0.0763,0.0616,1.0644 +Small,8x8,ldr-rgb-07.png,29.7444,0.0401,0.0254,2.5830 +Small,8x8,ldr-rgb-08.png,34.2118,0.0284,0.0141,4.6398 +Small,8x8,ldr-rgb-09.png,28.6096,0.0508,0.0364,1.8028 +Small,8x8,ldr-rgb-10.png,31.9502,0.0177,0.0055,2.9460 +Small,8x8,ldr-rgba-00.png,24.7373,0.0687,0.0538,1.2191 +Small,8x8,ldr-rgba-01.png,28.1681,0.0426,0.0279,2.3510 +Small,8x8,ldr-rgba-02.png,23.8637,0.0739,0.0593,1.1059 +Small,8x8,ldr-xy-00.png,32.9800,0.0281,0.0137,4.7945 +Small,8x8,ldr-xy-01.png,34.1030,0.0307,0.0165,3.9671 +Small,8x8,ldr-xy-02.png,39.8270,0.0184,0.0040,16.3676 +Small,8x8,ldrs-rgba-00.png,24.7372,0.0687,0.0538,1.2187 +Small,8x8,ldrs-rgba-01.png,28.1702,0.0427,0.0282,2.3237 +Small,8x8,ldrs-rgba-02.png,23.8634,0.0746,0.0598,1.0951 +Small,12x12,hdr-rgb-00.hdr,18.6067,0.1935,0.0774,0.8462 +Small,12x12,ldr-rgb-00.png,23.6113,0.0460,0.0239,2.7414 +Small,12x12,ldr-rgb-01.png,24.7556,0.0396,0.0173,3.7902 +Small,12x12,ldr-rgb-02.png,19.2151,0.0740,0.0517,1.2680 +Small,12x12,ldr-rgb-03.png,33.0978,0.0264,0.0047,13.9944 +Small,12x12,ldr-rgb-04.png,24.5342,0.0417,0.0191,3.4228 +Small,12x12,ldr-rgb-05.png,21.4327,0.0660,0.0440,1.4896 +Small,12x12,ldr-rgb-06.png,19.1612,0.0783,0.0556,1.1778 +Small,12x12,ldr-rgb-07.png,25.3299,0.0373,0.0146,4.4847 +Small,12x12,ldr-rgb-08.png,29.9994,0.0310,0.0088,7.4211 +Small,12x12,ldr-rgb-09.png,23.7298,0.0531,0.0309,2.1233 +Small,12x12,ldr-rgb-10.png,27.3129,0.0252,0.0052,3.0975 +Small,12x12,ldr-rgba-00.png,21.0140,0.0627,0.0399,1.6419 +Small,12x12,ldr-rgba-01.png,24.4565,0.0415,0.0191,3.4314 +Small,12x12,ldr-rgba-02.png,20.1464,0.0776,0.0549,1.1928 +Small,12x12,ldr-xy-00.png,28.8186,0.0352,0.0127,5.1494 +Small,12x12,ldr-xy-01.png,30.5809,0.0347,0.0126,5.2005 +Small,12x12,ldr-xy-02.png,38.1333,0.0250,0.0029,22.4116 +Small,12x12,ldrs-rgba-00.png,21.0135,0.0629,0.0401,1.6351 +Small,12x12,ldrs-rgba-01.png,24.4577,0.0418,0.0192,3.4183 +Small,12x12,ldrs-rgba-02.png,20.1461,0.0778,0.0552,1.1883 +Small,3x3x3,ldr-l-00-3.dds,50.7196,0.0373,0.0280,9.3737 +Small,3x3x3,ldr-l-01-3.dds,54.1048,0.0176,0.0107,6.4473 +Small,6x6x6,ldr-l-00-3.dds,32.6133,0.1098,0.0802,3.2669 +Small,6x6x6,ldr-l-01-3.dds,40.8080,0.0571,0.0300,2.2984 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse2_fastest_results.csv new file mode 100644 index 0000000..401a864 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse2_fastest_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,25.9013,0.1303,0.0273,2.4023 +Small,4x4,ldr-rgb-00.png,35.5401,0.0218,0.0138,4.7579 +Small,4x4,ldr-rgb-01.png,38.6539,0.0169,0.0090,7.2827 +Small,4x4,ldr-rgb-02.png,33.9017,0.0286,0.0206,3.1776 +Small,4x4,ldr-rgb-03.png,44.3820,0.0130,0.0055,11.8319 +Small,4x4,ldr-rgb-04.png,40.6541,0.0144,0.0064,10.2528 +Small,4x4,ldr-rgb-05.png,35.3252,0.0213,0.0132,4.9532 +Small,4x4,ldr-rgb-06.png,33.9736,0.0256,0.0176,3.7296 +Small,4x4,ldr-rgb-07.png,35.7343,0.0225,0.0144,4.5376 +Small,4x4,ldr-rgb-08.png,41.1869,0.0143,0.0066,9.9119 +Small,4x4,ldr-rgb-09.png,40.8303,0.0139,0.0060,10.8326 +Small,4x4,ldr-rgb-10.png,42.1183,0.0079,0.0024,6.7254 +Small,4x4,ldr-rgba-00.png,32.3988,0.0281,0.0198,3.3059 +Small,4x4,ldr-rgba-01.png,38.1315,0.0156,0.0075,8.6965 +Small,4x4,ldr-rgba-02.png,33.8019,0.0232,0.0151,4.3447 +Small,4x4,ldr-xy-00.png,36.9627,0.0140,0.0062,10.6336 +Small,4x4,ldr-xy-01.png,40.4676,0.0148,0.0072,9.1288 +Small,4x4,ldr-xy-02.png,44.0312,0.0123,0.0044,14.9350 +Small,4x4,ldrs-rgba-00.png,32.4007,0.0283,0.0200,3.2834 +Small,4x4,ldrs-rgba-01.png,38.1423,0.0157,0.0076,8.6209 +Small,4x4,ldrs-rgba-02.png,33.8070,0.0231,0.0151,4.3410 +Small,5x5,hdr-rgb-00.hdr,24.4063,0.1296,0.0253,2.5866 +Small,5x5,ldr-rgb-00.png,32.7185,0.0167,0.0083,7.9152 +Small,5x5,ldr-rgb-01.png,35.3125,0.0117,0.0035,18.4668 +Small,5x5,ldr-rgb-02.png,30.5420,0.0174,0.0092,7.1453 +Small,5x5,ldr-rgb-03.png,41.0871,0.0112,0.0033,19.6989 +Small,5x5,ldr-rgb-04.png,35.6347,0.0118,0.0034,19.1233 +Small,5x5,ldr-rgb-05.png,31.6680,0.0153,0.0070,9.3502 +Small,5x5,ldr-rgb-06.png,30.5668,0.0181,0.0097,6.7858 +Small,5x5,ldr-rgb-07.png,32.5478,0.0150,0.0064,10.1765 +Small,5x5,ldr-rgb-08.png,38.1010,0.0120,0.0038,17.0488 +Small,5x5,ldr-rgb-09.png,35.6999,0.0120,0.0038,17.4670 +Small,5x5,ldr-rgb-10.png,39.1121,0.0075,0.0017,9.6086 +Small,5x5,ldr-rgba-00.png,29.7540,0.0221,0.0133,4.9134 +Small,5x5,ldr-rgba-01.png,34.3669,0.0132,0.0048,13.5883 +Small,5x5,ldr-rgba-02.png,30.6075,0.0182,0.0097,6.7606 +Small,5x5,ldr-xy-00.png,35.8831,0.0124,0.0042,15.7127 +Small,5x5,ldr-xy-01.png,37.6330,0.0134,0.0054,12.0916 +Small,5x5,ldr-xy-02.png,42.1351,0.0110,0.0027,24.2546 +Small,5x5,ldrs-rgba-00.png,29.7621,0.0221,0.0134,4.8737 +Small,5x5,ldrs-rgba-01.png,34.3681,0.0133,0.0049,13.4685 +Small,5x5,ldrs-rgba-02.png,30.6094,0.0181,0.0097,6.7829 +Small,6x6,hdr-rgb-00.hdr,22.8297,0.1327,0.0282,2.3251 +Small,6x6,ldr-rgb-00.png,29.8940,0.0178,0.0086,7.5799 +Small,6x6,ldr-rgb-01.png,31.7369,0.0131,0.0042,15.6939 +Small,6x6,ldr-rgb-02.png,26.8847,0.0223,0.0133,4.9105 +Small,6x6,ldr-rgb-03.png,39.0152,0.0118,0.0032,20.5963 +Small,6x6,ldr-rgb-04.png,32.1322,0.0133,0.0042,15.7046 +Small,6x6,ldr-rgb-05.png,28.5469,0.0177,0.0086,7.6408 +Small,6x6,ldr-rgb-06.png,26.8933,0.0225,0.0133,4.9305 +Small,6x6,ldr-rgb-07.png,30.5744,0.0149,0.0056,11.6075 +Small,6x6,ldr-rgb-08.png,35.8219,0.0127,0.0038,17.1061 +Small,6x6,ldr-rgb-09.png,31.5939,0.0149,0.0059,11.0535 +Small,6x6,ldr-rgb-10.png,34.7916,0.0084,0.0017,9.3426 +Small,6x6,ldr-rgba-00.png,27.0190,0.0238,0.0144,4.5648 +Small,6x6,ldr-rgba-01.png,31.3894,0.0143,0.0052,12.6660 +Small,6x6,ldr-rgba-02.png,27.4089,0.0226,0.0133,4.9164 +Small,6x6,ldr-xy-00.png,34.4437,0.0132,0.0041,15.8030 +Small,6x6,ldr-xy-01.png,34.9945,0.0137,0.0050,13.1678 +Small,6x6,ldr-xy-02.png,41.1217,0.0118,0.0027,24.4902 +Small,6x6,ldrs-rgba-00.png,27.0177,0.0238,0.0143,4.5829 +Small,6x6,ldrs-rgba-01.png,31.3930,0.0145,0.0052,12.5791 +Small,6x6,ldrs-rgba-02.png,27.4079,0.0228,0.0134,4.8798 +Small,8x8,hdr-rgb-00.hdr,20.7229,0.1508,0.0420,1.5597 +Small,8x8,ldr-rgb-00.png,26.0768,0.0208,0.0075,8.7346 +Small,8x8,ldr-rgb-01.png,27.6111,0.0176,0.0046,14.3847 +Small,8x8,ldr-rgb-02.png,22.6789,0.0311,0.0181,3.6223 +Small,8x8,ldr-rgb-03.png,35.3649,0.0155,0.0028,23.7189 +Small,8x8,ldr-rgb-04.png,27.5653,0.0181,0.0050,13.1678 +Small,8x8,ldr-rgb-05.png,24.6789,0.0225,0.0093,7.0521 +Small,8x8,ldr-rgb-06.png,22.6857,0.0307,0.0173,3.7799 +Small,8x8,ldr-rgb-07.png,26.9996,0.0178,0.0044,15.0346 +Small,8x8,ldr-rgb-08.png,32.3078,0.0165,0.0035,18.5178 +Small,8x8,ldr-rgb-09.png,26.9700,0.0193,0.0062,10.6237 +Small,8x8,ldr-rgb-10.png,30.5983,0.0125,0.0018,9.0560 +Small,8x8,ldr-rgba-00.png,23.2790,0.0272,0.0136,4.8191 +Small,8x8,ldr-rgba-01.png,27.5382,0.0189,0.0056,11.6820 +Small,8x8,ldr-rgba-02.png,23.5944,0.0319,0.0185,3.5358 +Small,8x8,ldr-xy-00.png,31.0189,0.0178,0.0047,13.9024 +Small,8x8,ldr-xy-01.png,31.6408,0.0168,0.0039,16.6552 +Small,8x8,ldr-xy-02.png,39.5041,0.0157,0.0026,25.1305 +Small,8x8,ldrs-rgba-00.png,23.2784,0.0273,0.0137,4.7889 +Small,8x8,ldrs-rgba-01.png,27.5393,0.0188,0.0056,11.7867 +Small,8x8,ldrs-rgba-02.png,23.5937,0.0321,0.0187,3.5074 +Small,12x12,hdr-rgb-00.hdr,18.4354,0.1606,0.0463,1.4143 +Small,12x12,ldr-rgb-00.png,22.2178,0.0218,0.0036,18.0035 +Small,12x12,ldr-rgb-01.png,23.9444,0.0206,0.0026,25.0435 +Small,12x12,ldr-rgb-02.png,18.8268,0.0243,0.0061,10.6790 +Small,12x12,ldr-rgb-03.png,32.1095,0.0204,0.0026,25.3531 +Small,12x12,ldr-rgb-04.png,23.1291,0.0214,0.0030,21.5726 +Small,12x12,ldr-rgb-05.png,20.3606,0.0215,0.0033,19.8296 +Small,12x12,ldr-rgb-06.png,18.7065,0.0245,0.0062,10.5552 +Small,12x12,ldr-rgb-07.png,23.8295,0.0214,0.0029,22.4978 +Small,12x12,ldr-rgb-08.png,28.6338,0.0205,0.0025,25.7400 +Small,12x12,ldr-rgb-09.png,21.9118,0.0217,0.0035,18.6282 +Small,12x12,ldr-rgb-10.png,26.3721,0.0174,0.0016,10.0520 +Small,12x12,ldr-rgba-00.png,20.0485,0.0276,0.0090,7.2858 +Small,12x12,ldr-rgba-01.png,23.8042,0.0213,0.0030,21.9463 +Small,12x12,ldr-rgba-02.png,19.8756,0.0250,0.0064,10.1716 +Small,12x12,ldr-xy-00.png,27.2775,0.0215,0.0034,19.5156 +Small,12x12,ldr-xy-01.png,27.5355,0.0219,0.0038,17.1199 +Small,12x12,ldr-xy-02.png,38.1044,0.0208,0.0028,23.6923 +Small,12x12,ldrs-rgba-00.png,20.0498,0.0279,0.0090,7.2512 +Small,12x12,ldrs-rgba-01.png,23.8055,0.0212,0.0030,21.5219 +Small,12x12,ldrs-rgba-02.png,19.8752,0.0248,0.0063,10.3743 +Small,3x3x3,ldr-l-00-3.dds,49.3077,0.0342,0.0248,10.5546 +Small,3x3x3,ldr-l-01-3.dds,53.8732,0.0175,0.0106,6.5229 +Small,6x6x6,ldr-l-00-3.dds,32.1173,0.1033,0.0737,3.5547 +Small,6x6x6,ldr-l-01-3.dds,40.5942,0.0568,0.0299,2.3064 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse2_medium_results.csv new file mode 100644 index 0000000..cf99eb1 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse2_medium_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,32.3616,0.1866,0.0834,0.7855 +Small,4x4,ldr-rgb-00.png,38.6186,0.0909,0.0820,0.7990 +Small,4x4,ldr-rgb-01.png,39.9904,0.0781,0.0701,0.9353 +Small,4x4,ldr-rgb-02.png,35.0864,0.0794,0.0711,0.9213 +Small,4x4,ldr-rgb-03.png,46.9643,0.0499,0.0422,1.5534 +Small,4x4,ldr-rgb-04.png,41.9794,0.0648,0.0566,1.1571 +Small,4x4,ldr-rgb-05.png,37.6292,0.0879,0.0797,0.8220 +Small,4x4,ldr-rgb-06.png,35.2309,0.0718,0.0635,1.0319 +Small,4x4,ldr-rgb-07.png,38.6220,0.1053,0.0970,0.6757 +Small,4x4,ldr-rgb-08.png,44.5908,0.0563,0.0484,1.3528 +Small,4x4,ldr-rgb-09.png,41.9104,0.0661,0.0580,1.1305 +Small,4x4,ldr-rgb-10.png,44.8283,0.0164,0.0105,1.5451 +Small,4x4,ldr-rgba-00.png,36.1397,0.1017,0.0932,0.7035 +Small,4x4,ldr-rgba-01.png,38.8010,0.0560,0.0478,1.3724 +Small,4x4,ldr-rgba-02.png,34.7461,0.0855,0.0772,0.8494 +Small,4x4,ldr-xy-00.png,37.6959,0.0472,0.0390,1.6791 +Small,4x4,ldr-xy-01.png,44.9855,0.0652,0.0574,1.1424 +Small,4x4,ldr-xy-02.png,50.9056,0.0654,0.0572,1.1463 +Small,4x4,ldrs-rgba-00.png,36.1447,0.1028,0.0942,0.6958 +Small,4x4,ldrs-rgba-01.png,38.8178,0.0568,0.0485,1.3520 +Small,4x4,ldrs-rgba-02.png,34.7492,0.0854,0.0771,0.8503 +Small,5x5,hdr-rgb-00.hdr,26.5177,0.2090,0.1055,0.6215 +Small,5x5,ldr-rgb-00.png,35.0100,0.1041,0.0946,0.6925 +Small,5x5,ldr-rgb-01.png,36.3412,0.0781,0.0690,0.9495 +Small,5x5,ldr-rgb-02.png,30.9700,0.0823,0.0732,0.8956 +Small,5x5,ldr-rgb-03.png,43.5605,0.0295,0.0206,3.1868 +Small,5x5,ldr-rgb-04.png,37.5544,0.0689,0.0593,1.1048 +Small,5x5,ldr-rgb-05.png,33.4512,0.1133,0.1041,0.6298 +Small,5x5,ldr-rgb-06.png,30.9908,0.0776,0.0683,0.9601 +Small,5x5,ldr-rgb-07.png,35.6054,0.1159,0.1064,0.6159 +Small,5x5,ldr-rgb-08.png,41.1640,0.0501,0.0410,1.5976 +Small,5x5,ldr-rgb-09.png,37.4846,0.0654,0.0560,1.1709 +Small,5x5,ldr-rgb-10.png,40.4607,0.0195,0.0125,1.3000 +Small,5x5,ldr-rgba-00.png,32.7046,0.1328,0.1231,0.5323 +Small,5x5,ldr-rgba-01.png,35.2093,0.0696,0.0599,1.0936 +Small,5x5,ldr-rgba-02.png,31.0406,0.1147,0.1052,0.6228 +Small,5x5,ldr-xy-00.png,37.1119,0.0497,0.0405,1.6171 +Small,5x5,ldr-xy-01.png,40.9199,0.0626,0.0536,1.2229 +Small,5x5,ldr-xy-02.png,48.7008,0.0380,0.0286,2.2936 +Small,5x5,ldrs-rgba-00.png,32.7058,0.1332,0.1235,0.5307 +Small,5x5,ldrs-rgba-01.png,35.2165,0.0697,0.0600,1.0928 +Small,5x5,ldrs-rgba-02.png,31.0419,0.1148,0.1053,0.6223 +Small,6x6,hdr-rgb-00.hdr,24.7323,0.2110,0.1069,0.6132 +Small,6x6,ldr-rgb-00.png,32.3215,0.1192,0.1085,0.6041 +Small,6x6,ldr-rgb-01.png,33.0336,0.1058,0.0954,0.6869 +Small,6x6,ldr-rgb-02.png,27.3867,0.1282,0.1174,0.5580 +Small,6x6,ldr-rgb-03.png,41.4371,0.0290,0.0189,3.4738 +Small,6x6,ldr-rgb-04.png,34.1260,0.0933,0.0826,0.7930 +Small,6x6,ldr-rgb-05.png,30.1074,0.1468,0.1362,0.4811 +Small,6x6,ldr-rgb-06.png,27.4381,0.1250,0.1143,0.5735 +Small,6x6,ldr-rgb-07.png,33.9556,0.1284,0.1174,0.5580 +Small,6x6,ldr-rgb-08.png,39.0372,0.0466,0.0362,1.8123 +Small,6x6,ldr-rgb-09.png,33.6201,0.0936,0.0830,0.7894 +Small,6x6,ldr-rgb-10.png,36.8847,0.0218,0.0137,1.1895 +Small,6x6,ldr-rgba-00.png,30.1133,0.1488,0.1378,0.4757 +Small,6x6,ldr-rgba-01.png,32.1295,0.0718,0.0610,1.0750 +Small,6x6,ldr-rgba-02.png,27.7849,0.1222,0.1115,0.5879 +Small,6x6,ldr-xy-00.png,36.0271,0.0448,0.0343,1.9114 +Small,6x6,ldr-xy-01.png,37.9588,0.0509,0.0405,1.6188 +Small,6x6,ldr-xy-02.png,45.0705,0.0309,0.0203,3.2320 +Small,6x6,ldrs-rgba-00.png,30.1144,0.1484,0.1375,0.4767 +Small,6x6,ldrs-rgba-01.png,32.1349,0.0719,0.0612,1.0700 +Small,6x6,ldrs-rgba-02.png,27.7835,0.1228,0.1118,0.5860 +Small,8x8,hdr-rgb-00.hdr,21.4320,0.2210,0.1111,0.5897 +Small,8x8,ldr-rgb-00.png,28.6493,0.1821,0.1659,0.3951 +Small,8x8,ldr-rgb-01.png,28.8554,0.1490,0.1332,0.4919 +Small,8x8,ldr-rgb-02.png,23.0793,0.1772,0.1615,0.4057 +Small,8x8,ldr-rgb-03.png,38.2658,0.0387,0.0233,2.8077 +Small,8x8,ldr-rgb-04.png,29.5754,0.1408,0.1249,0.5247 +Small,8x8,ldr-rgb-05.png,25.8717,0.1774,0.1615,0.4057 +Small,8x8,ldr-rgb-06.png,23.1192,0.1517,0.1357,0.4829 +Small,8x8,ldr-rgb-07.png,30.6667,0.1410,0.1249,0.5245 +Small,8x8,ldr-rgb-08.png,35.6982,0.0560,0.0404,1.6236 +Small,8x8,ldr-rgb-09.png,28.9985,0.1198,0.1040,0.6301 +Small,8x8,ldr-rgb-10.png,32.1108,0.0322,0.0187,0.8683 +Small,8x8,ldr-rgba-00.png,26.0222,0.1858,0.1695,0.3866 +Small,8x8,ldr-rgba-01.png,28.2807,0.0824,0.0664,0.9864 +Small,8x8,ldr-rgba-02.png,23.8775,0.1380,0.1222,0.5363 +Small,8x8,ldr-xy-00.png,33.9706,0.0606,0.0451,1.4535 +Small,8x8,ldr-xy-01.png,35.0076,0.0591,0.0435,1.5072 +Small,8x8,ldr-xy-02.png,40.7561,0.0292,0.0136,4.8220 +Small,8x8,ldrs-rgba-00.png,26.0229,0.1849,0.1686,0.3888 +Small,8x8,ldrs-rgba-01.png,28.2841,0.0834,0.0675,0.9712 +Small,8x8,ldrs-rgba-02.png,23.8771,0.1381,0.1222,0.5362 +Small,12x12,hdr-rgb-00.hdr,18.7253,0.2592,0.1404,0.4668 +Small,12x12,ldr-rgb-00.png,24.4659,0.1563,0.1301,0.5037 +Small,12x12,ldr-rgb-01.png,24.9925,0.1468,0.1212,0.5408 +Small,12x12,ldr-rgb-02.png,19.2481,0.1709,0.1452,0.4512 +Small,12x12,ldr-rgb-03.png,34.6525,0.0450,0.0196,3.3389 +Small,12x12,ldr-rgb-04.png,24.8440,0.1376,0.1124,0.5831 +Small,12x12,ldr-rgb-05.png,21.5754,0.1966,0.1707,0.3840 +Small,12x12,ldr-rgb-06.png,19.1991,0.1643,0.1383,0.4739 +Small,12x12,ldr-rgb-07.png,26.5936,0.1390,0.1131,0.5794 +Small,12x12,ldr-rgb-08.png,31.1465,0.0630,0.0380,1.7266 +Small,12x12,ldr-rgb-09.png,24.2324,0.1469,0.1212,0.5409 +Small,12x12,ldr-rgb-10.png,27.8888,0.0530,0.0302,0.5384 +Small,12x12,ldr-rgba-00.png,21.7589,0.1637,0.1377,0.4761 +Small,12x12,ldr-rgba-01.png,24.5625,0.0912,0.0653,1.0030 +Small,12x12,ldr-rgba-02.png,20.1486,0.1515,0.1255,0.5220 +Small,12x12,ldr-xy-00.png,29.7046,0.0696,0.0440,1.4904 +Small,12x12,ldr-xy-01.png,31.9137,0.0620,0.0370,1.7718 +Small,12x12,ldr-xy-02.png,38.1657,0.0286,0.0035,18.8920 +Small,12x12,ldrs-rgba-00.png,21.7593,0.1632,0.1369,0.4786 +Small,12x12,ldrs-rgba-01.png,24.5645,0.0920,0.0662,0.9905 +Small,12x12,ldrs-rgba-02.png,20.1484,0.1513,0.1254,0.5226 +Small,3x3x3,ldr-l-00-3.dds,51.8519,0.0538,0.0445,5.8860 +Small,3x3x3,ldr-l-01-3.dds,54.3882,0.0186,0.0117,5.8706 +Small,6x6x6,ldr-l-00-3.dds,32.9180,0.1377,0.1081,2.4249 +Small,6x6x6,ldr-l-01-3.dds,40.8335,0.0572,0.0304,2.2659 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse2_thorough_results.csv new file mode 100644 index 0000000..afb0526 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse2_thorough_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,32.6257,0.2830,0.1815,0.3611 +Small,4x4,ldr-rgb-00.png,39.1011,0.1969,0.1882,0.3483 +Small,4x4,ldr-rgb-01.png,40.2753,0.1873,0.1788,0.3665 +Small,4x4,ldr-rgb-02.png,35.3312,0.1689,0.1607,0.4077 +Small,4x4,ldr-rgb-03.png,47.6552,0.2016,0.1938,0.3381 +Small,4x4,ldr-rgb-04.png,42.2447,0.1673,0.1589,0.4124 +Small,4x4,ldr-rgb-05.png,37.9471,0.1860,0.1778,0.3686 +Small,4x4,ldr-rgb-06.png,35.4333,0.1602,0.1516,0.4323 +Small,4x4,ldr-rgb-07.png,39.6965,0.2150,0.2065,0.3174 +Small,4x4,ldr-rgb-08.png,45.6560,0.1852,0.1771,0.3700 +Small,4x4,ldr-rgb-09.png,42.1582,0.1749,0.1667,0.3932 +Small,4x4,ldr-rgb-10.png,44.9944,0.0311,0.0252,0.6463 +Small,4x4,ldr-rgba-00.png,36.7422,0.2015,0.1928,0.3399 +Small,4x4,ldr-rgba-01.png,39.0115,0.1739,0.1654,0.3961 +Small,4x4,ldr-rgba-02.png,34.9453,0.2034,0.1949,0.3362 +Small,4x4,ldr-xy-00.png,37.7350,0.1683,0.1601,0.4092 +Small,4x4,ldr-xy-01.png,45.4829,0.1663,0.1582,0.4142 +Small,4x4,ldr-xy-02.png,51.0007,0.2045,0.1962,0.3341 +Small,4x4,ldrs-rgba-00.png,36.7505,0.2033,0.1946,0.3367 +Small,4x4,ldrs-rgba-01.png,39.0325,0.1753,0.1669,0.3926 +Small,4x4,ldrs-rgba-02.png,34.9504,0.2051,0.1963,0.3338 +Small,5x5,hdr-rgb-00.hdr,27.4762,0.2999,0.1968,0.3330 +Small,5x5,ldr-rgb-00.png,35.3221,0.2260,0.2164,0.3028 +Small,5x5,ldr-rgb-01.png,36.4859,0.2143,0.2051,0.3195 +Small,5x5,ldr-rgb-02.png,31.1011,0.1942,0.1850,0.3543 +Small,5x5,ldr-rgb-03.png,44.4621,0.2166,0.2076,0.3156 +Small,5x5,ldr-rgb-04.png,37.7979,0.1872,0.1776,0.3691 +Small,5x5,ldr-rgb-05.png,33.6558,0.2133,0.2040,0.3213 +Small,5x5,ldr-rgb-06.png,31.0952,0.1871,0.1775,0.3692 +Small,5x5,ldr-rgb-07.png,36.5891,0.2443,0.2347,0.2793 +Small,5x5,ldr-rgb-08.png,42.2366,0.2011,0.1919,0.3416 +Small,5x5,ldr-rgb-09.png,37.6643,0.1988,0.1895,0.3458 +Small,5x5,ldr-rgb-10.png,40.7404,0.0391,0.0321,0.5067 +Small,5x5,ldr-rgba-00.png,33.1224,0.2366,0.2268,0.2890 +Small,5x5,ldr-rgba-01.png,35.3488,0.2079,0.1983,0.3305 +Small,5x5,ldr-rgba-02.png,31.1475,0.2572,0.2476,0.2646 +Small,5x5,ldr-xy-00.png,37.2677,0.1645,0.1552,0.4224 +Small,5x5,ldr-xy-01.png,41.7309,0.2060,0.1969,0.3328 +Small,5x5,ldr-xy-02.png,49.2472,0.2304,0.2210,0.2966 +Small,5x5,ldrs-rgba-00.png,33.1249,0.2395,0.2297,0.2853 +Small,5x5,ldrs-rgba-01.png,35.3573,0.2095,0.1998,0.3280 +Small,5x5,ldrs-rgba-02.png,31.1476,0.2580,0.2485,0.2637 +Small,6x6,hdr-rgb-00.hdr,24.8349,0.3010,0.1980,0.3310 +Small,6x6,ldr-rgb-00.png,32.6463,0.2661,0.2553,0.2567 +Small,6x6,ldr-rgb-01.png,33.1760,0.2669,0.2563,0.2557 +Small,6x6,ldr-rgb-02.png,27.4903,0.2702,0.2595,0.2525 +Small,6x6,ldr-rgb-03.png,42.5136,0.1583,0.1480,0.4427 +Small,6x6,ldr-rgb-04.png,34.3341,0.2597,0.2485,0.2637 +Small,6x6,ldr-rgb-05.png,30.2804,0.2758,0.2651,0.2472 +Small,6x6,ldr-rgb-06.png,27.5520,0.2707,0.2599,0.2522 +Small,6x6,ldr-rgb-07.png,34.3789,0.2680,0.2570,0.2550 +Small,6x6,ldr-rgb-08.png,39.8926,0.1560,0.1454,0.4507 +Small,6x6,ldr-rgb-09.png,33.8281,0.2473,0.2366,0.2770 +Small,6x6,ldr-rgb-10.png,37.1218,0.0465,0.0382,0.4259 +Small,6x6,ldr-rgba-00.png,30.4829,0.2708,0.2592,0.2528 +Small,6x6,ldr-rgba-01.png,32.2487,0.2297,0.2186,0.2998 +Small,6x6,ldr-rgba-02.png,27.8831,0.2915,0.2805,0.2337 +Small,6x6,ldr-xy-00.png,36.3665,0.1216,0.1110,0.5906 +Small,6x6,ldr-xy-01.png,38.4666,0.1769,0.1661,0.3946 +Small,6x6,ldr-xy-02.png,47.4520,0.2286,0.2177,0.3011 +Small,6x6,ldrs-rgba-00.png,30.4838,0.2713,0.2601,0.2519 +Small,6x6,ldrs-rgba-01.png,32.2549,0.2316,0.2205,0.2972 +Small,6x6,ldrs-rgba-02.png,27.8824,0.2908,0.2797,0.2343 +Small,8x8,hdr-rgb-00.hdr,21.7370,0.3254,0.2171,0.3019 +Small,8x8,ldr-rgb-00.png,28.9325,0.3101,0.2941,0.2228 +Small,8x8,ldr-rgb-01.png,29.0009,0.2940,0.2780,0.2357 +Small,8x8,ldr-rgb-02.png,23.1717,0.3186,0.3025,0.2166 +Small,8x8,ldr-rgb-03.png,39.4327,0.0848,0.0687,0.9533 +Small,8x8,ldr-rgb-04.png,29.7722,0.2961,0.2796,0.2344 +Small,8x8,ldr-rgb-05.png,26.0309,0.3207,0.3043,0.2154 +Small,8x8,ldr-rgb-06.png,23.2299,0.3190,0.3028,0.2165 +Small,8x8,ldr-rgb-07.png,31.1331,0.3001,0.2838,0.2310 +Small,8x8,ldr-rgb-08.png,36.4987,0.1398,0.1235,0.5305 +Small,8x8,ldr-rgb-09.png,29.1978,0.2478,0.2315,0.2831 +Small,8x8,ldr-rgb-10.png,32.3450,0.0570,0.0432,0.3766 +Small,8x8,ldr-rgba-00.png,26.4881,0.3162,0.2994,0.2189 +Small,8x8,ldr-rgba-01.png,28.3958,0.2625,0.2462,0.2662 +Small,8x8,ldr-rgba-02.png,23.9557,0.3147,0.2979,0.2200 +Small,8x8,ldr-xy-00.png,34.2722,0.1404,0.1241,0.5283 +Small,8x8,ldr-xy-01.png,35.4903,0.1293,0.1132,0.5791 +Small,8x8,ldr-xy-02.png,44.4205,0.1440,0.1277,0.5131 +Small,8x8,ldrs-rgba-00.png,26.4899,0.3181,0.3012,0.2176 +Small,8x8,ldrs-rgba-01.png,28.3990,0.2641,0.2475,0.2648 +Small,8x8,ldrs-rgba-02.png,23.9552,0.3143,0.2977,0.2201 +Small,12x12,hdr-rgb-00.hdr,18.8998,0.3565,0.2364,0.2773 +Small,12x12,ldr-rgb-00.png,24.9028,0.3254,0.2984,0.2196 +Small,12x12,ldr-rgb-01.png,25.1435,0.2985,0.2716,0.2413 +Small,12x12,ldr-rgb-02.png,19.3029,0.3472,0.3205,0.2045 +Small,12x12,ldr-rgb-03.png,36.1094,0.0923,0.0658,0.9967 +Small,12x12,ldr-rgb-04.png,25.0031,0.3066,0.2795,0.2345 +Small,12x12,ldr-rgb-05.png,21.7060,0.3480,0.3212,0.2040 +Small,12x12,ldr-rgb-06.png,19.2656,0.3436,0.3165,0.2071 +Small,12x12,ldr-rgb-07.png,27.0496,0.3161,0.2890,0.2268 +Small,12x12,ldr-rgb-08.png,32.1972,0.1300,0.1034,0.6340 +Small,12x12,ldr-rgb-09.png,24.4312,0.2895,0.2632,0.2490 +Small,12x12,ldr-rgb-10.png,28.1634,0.0872,0.0632,0.2572 +Small,12x12,ldr-rgba-00.png,22.2648,0.3318,0.3045,0.2152 +Small,12x12,ldr-rgba-01.png,24.6914,0.2470,0.2199,0.2981 +Small,12x12,ldr-rgba-02.png,20.2045,0.2831,0.2561,0.2559 +Small,12x12,ldr-xy-00.png,30.4261,0.1712,0.1442,0.4544 +Small,12x12,ldr-xy-01.png,32.4701,0.1233,0.0967,0.6776 +Small,12x12,ldr-xy-02.png,39.8495,0.0765,0.0496,1.3221 +Small,12x12,ldrs-rgba-00.png,22.2650,0.3326,0.3053,0.2146 +Small,12x12,ldrs-rgba-01.png,24.6931,0.2476,0.2206,0.2971 +Small,12x12,ldrs-rgba-02.png,20.2044,0.2839,0.2569,0.2551 +Small,3x3x3,ldr-l-00-3.dds,52.4074,0.1413,0.1319,1.9867 +Small,3x3x3,ldr-l-01-3.dds,55.4199,0.0602,0.0532,1.2956 +Small,6x6x6,ldr-l-00-3.dds,33.2677,0.2432,0.2138,1.2264 +Small,6x6x6,ldr-l-01-3.dds,41.7102,0.0756,0.0484,1.4226 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse4.1_fast_results.csv new file mode 100644 index 0000000..eda4368 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse4.1_fast_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,31.2477,0.1296,0.0353,1.8548 +Small,4x4,ldr-rgb-00.png,37.6610,0.0297,0.0216,3.0355 +Small,4x4,ldr-rgb-01.png,39.4292,0.0234,0.0156,4.2048 +Small,4x4,ldr-rgb-02.png,34.5574,0.0336,0.0258,2.5396 +Small,4x4,ldr-rgb-03.png,45.5738,0.0142,0.0066,9.9843 +Small,4x4,ldr-rgb-04.png,41.5970,0.0192,0.0112,5.8629 +Small,4x4,ldr-rgb-05.png,36.8167,0.0336,0.0255,2.5657 +Small,4x4,ldr-rgb-06.png,34.6862,0.0313,0.0231,2.8312 +Small,4x4,ldr-rgb-07.png,37.6751,0.0375,0.0293,2.2383 +Small,4x4,ldr-rgb-08.png,43.0856,0.0180,0.0103,6.3738 +Small,4x4,ldr-rgb-09.png,41.5841,0.0193,0.0113,5.7807 +Small,4x4,ldr-rgb-10.png,44.2719,0.0089,0.0033,4.8758 +Small,4x4,ldr-rgba-00.png,35.1813,0.0386,0.0304,2.1587 +Small,4x4,ldr-rgba-01.png,38.6094,0.0220,0.0140,4.6882 +Small,4x4,ldr-rgba-02.png,34.5734,0.0319,0.0237,2.7621 +Small,4x4,ldr-xy-00.png,37.4323,0.0165,0.0087,7.5730 +Small,4x4,ldr-xy-01.png,43.7017,0.0175,0.0100,6.5732 +Small,4x4,ldr-xy-02.png,47.3356,0.0142,0.0062,10.6151 +Small,4x4,ldrs-rgba-00.png,35.1865,0.0389,0.0305,2.1473 +Small,4x4,ldrs-rgba-01.png,38.6273,0.0221,0.0141,4.6631 +Small,4x4,ldrs-rgba-02.png,34.5762,0.0319,0.0238,2.7494 +Small,5x5,hdr-rgb-00.hdr,25.5462,0.1345,0.0391,1.6746 +Small,5x5,ldr-rgb-00.png,33.8994,0.0289,0.0204,3.2149 +Small,5x5,ldr-rgb-01.png,36.0025,0.0215,0.0130,5.0561 +Small,5x5,ldr-rgb-02.png,30.8682,0.0295,0.0210,3.1261 +Small,5x5,ldr-rgb-03.png,42.3215,0.0130,0.0049,13.2714 +Small,5x5,ldr-rgb-04.png,37.0861,0.0197,0.0110,5.9621 +Small,5x5,ldr-rgb-05.png,32.9501,0.0338,0.0251,2.6147 +Small,5x5,ldr-rgb-06.png,30.8961,0.0293,0.0206,3.1740 +Small,5x5,ldr-rgb-07.png,34.2645,0.0287,0.0198,3.3057 +Small,5x5,ldr-rgb-08.png,39.4396,0.0163,0.0078,8.3720 +Small,5x5,ldr-rgb-09.png,37.1601,0.0204,0.0117,5.6153 +Small,5x5,ldr-rgb-10.png,40.0273,0.0093,0.0031,5.2900 +Small,5x5,ldr-rgba-00.png,31.4619,0.0396,0.0306,2.1449 +Small,5x5,ldr-rgba-01.png,35.0325,0.0229,0.0142,4.6029 +Small,5x5,ldr-rgba-02.png,31.0113,0.0369,0.0280,2.3366 +Small,5x5,ldr-xy-00.png,36.5528,0.0159,0.0075,8.7753 +Small,5x5,ldr-xy-01.png,39.4510,0.0177,0.0094,7.0077 +Small,5x5,ldr-xy-02.png,43.2162,0.0146,0.0060,10.9391 +Small,5x5,ldrs-rgba-00.png,31.4631,0.0398,0.0308,2.1280 +Small,5x5,ldrs-rgba-01.png,35.0396,0.0232,0.0144,4.5373 +Small,5x5,ldrs-rgba-02.png,31.0130,0.0370,0.0281,2.3315 +Small,6x6,hdr-rgb-00.hdr,23.7301,0.1453,0.0498,1.3168 +Small,6x6,ldr-rgb-00.png,31.3632,0.0421,0.0322,2.0350 +Small,6x6,ldr-rgb-01.png,32.7911,0.0341,0.0244,2.6826 +Small,6x6,ldr-rgb-02.png,27.3311,0.0522,0.0425,1.5423 +Small,6x6,ldr-rgb-03.png,40.3214,0.0160,0.0066,9.9446 +Small,6x6,ldr-rgb-04.png,33.8184,0.0290,0.0190,3.4458 +Small,6x6,ldr-rgb-05.png,29.8295,0.0575,0.0475,1.3791 +Small,6x6,ldr-rgb-06.png,27.3838,0.0529,0.0429,1.5265 +Small,6x6,ldr-rgb-07.png,32.9755,0.0350,0.0248,2.6459 +Small,6x6,ldr-rgb-08.png,37.5691,0.0204,0.0107,6.1181 +Small,6x6,ldr-rgb-09.png,33.4003,0.0320,0.0223,2.9449 +Small,6x6,ldr-rgb-10.png,36.4787,0.0116,0.0041,3.9303 +Small,6x6,ldr-rgba-00.png,28.9310,0.0526,0.0423,1.5496 +Small,6x6,ldr-rgba-01.png,31.9940,0.0289,0.0190,3.4507 +Small,6x6,ldr-rgba-02.png,27.7614,0.0531,0.0430,1.5236 +Small,6x6,ldr-xy-00.png,35.5246,0.0214,0.0115,5.6964 +Small,6x6,ldr-xy-01.png,36.8735,0.0238,0.0142,4.6263 +Small,6x6,ldr-xy-02.png,41.5957,0.0161,0.0062,10.5245 +Small,6x6,ldrs-rgba-00.png,28.9316,0.0609,0.0505,1.2985 +Small,6x6,ldrs-rgba-01.png,31.9999,0.0322,0.0222,2.9501 +Small,6x6,ldrs-rgba-02.png,27.7599,0.0588,0.0488,1.3436 +Small,8x8,hdr-rgb-00.hdr,21.1941,0.1608,0.0593,1.1060 +Small,8x8,ldr-rgb-00.png,27.7644,0.0514,0.0366,1.7895 +Small,8x8,ldr-rgb-01.png,28.6582,0.0449,0.0303,2.1624 +Small,8x8,ldr-rgb-02.png,23.0104,0.0675,0.0530,1.2370 +Small,8x8,ldr-rgb-03.png,37.1610,0.0214,0.0073,9.0074 +Small,8x8,ldr-rgb-04.png,29.2645,0.0433,0.0284,2.3100 +Small,8x8,ldr-rgb-05.png,25.6932,0.0772,0.0627,1.0455 +Small,8x8,ldr-rgb-06.png,23.0553,0.0690,0.0541,1.2117 +Small,8x8,ldr-rgb-07.png,29.7444,0.0373,0.0226,2.9049 +Small,8x8,ldr-rgb-08.png,34.2118,0.0274,0.0129,5.0898 +Small,8x8,ldr-rgb-09.png,28.6096,0.0465,0.0320,2.0497 +Small,8x8,ldr-rgb-10.png,31.9502,0.0176,0.0054,3.0299 +Small,8x8,ldr-rgba-00.png,24.7373,0.0624,0.0473,1.3855 +Small,8x8,ldr-rgba-01.png,28.1681,0.0386,0.0240,2.7342 +Small,8x8,ldr-rgba-02.png,23.8637,0.0672,0.0524,1.2515 +Small,8x8,ldr-xy-00.png,32.9800,0.0267,0.0123,5.3416 +Small,8x8,ldr-xy-01.png,34.1030,0.0291,0.0147,4.4435 +Small,8x8,ldr-xy-02.png,39.8270,0.0183,0.0037,17.6272 +Small,8x8,ldrs-rgba-00.png,24.7372,0.0620,0.0472,1.3899 +Small,8x8,ldrs-rgba-01.png,28.1702,0.0390,0.0244,2.6911 +Small,8x8,ldrs-rgba-02.png,23.8634,0.0674,0.0524,1.2502 +Small,12x12,hdr-rgb-00.hdr,18.6067,0.1811,0.0710,0.9233 +Small,12x12,ldr-rgb-00.png,23.6113,0.0441,0.0214,3.0594 +Small,12x12,ldr-rgb-01.png,24.7556,0.0384,0.0158,4.1418 +Small,12x12,ldr-rgb-02.png,19.2151,0.0704,0.0480,1.3655 +Small,12x12,ldr-rgb-03.png,33.0978,0.0267,0.0045,14.7135 +Small,12x12,ldr-rgb-04.png,24.5342,0.0401,0.0176,3.7213 +Small,12x12,ldr-rgb-05.png,21.4327,0.0626,0.0400,1.6389 +Small,12x12,ldr-rgb-06.png,19.1612,0.0739,0.0513,1.2787 +Small,12x12,ldr-rgb-07.png,25.3299,0.0360,0.0131,4.9849 +Small,12x12,ldr-rgb-08.png,29.9994,0.0306,0.0082,7.9543 +Small,12x12,ldr-rgb-09.png,23.7298,0.0507,0.0281,2.3290 +Small,12x12,ldr-rgb-10.png,27.3129,0.0250,0.0049,3.2919 +Small,12x12,ldr-rgba-00.png,21.0140,0.0589,0.0359,1.8259 +Small,12x12,ldr-rgba-01.png,24.4565,0.0402,0.0175,3.7475 +Small,12x12,ldr-rgba-02.png,20.1464,0.0734,0.0507,1.2929 +Small,12x12,ldr-xy-00.png,28.8186,0.0343,0.0118,5.5483 +Small,12x12,ldr-xy-01.png,30.5809,0.0336,0.0113,5.7833 +Small,12x12,ldr-xy-02.png,38.1333,0.0250,0.0027,24.1991 +Small,12x12,ldrs-rgba-00.png,21.0135,0.0593,0.0365,1.7979 +Small,12x12,ldrs-rgba-01.png,24.4577,0.0403,0.0176,3.7266 +Small,12x12,ldrs-rgba-02.png,20.1461,0.0735,0.0507,1.2938 +Small,3x3x3,ldr-l-00-3.dds,50.7196,0.0335,0.0240,10.9358 +Small,3x3x3,ldr-l-01-3.dds,54.1048,0.0161,0.0092,7.4677 +Small,6x6x6,ldr-l-00-3.dds,32.6133,0.1031,0.0731,3.5862 +Small,6x6x6,ldr-l-01-3.dds,40.8080,0.0545,0.0272,2.5332 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse4.1_fastest_results.csv new file mode 100644 index 0000000..45114e8 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse4.1_fastest_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,25.9013,0.1179,0.0231,2.8313 +Small,4x4,ldr-rgb-00.png,35.5401,0.0194,0.0114,5.7277 +Small,4x4,ldr-rgb-01.png,38.6539,0.0143,0.0066,9.9266 +Small,4x4,ldr-rgb-02.png,33.9017,0.0232,0.0154,4.2583 +Small,4x4,ldr-rgb-03.png,44.3820,0.0119,0.0045,14.6876 +Small,4x4,ldr-rgb-04.png,40.6541,0.0128,0.0048,13.6735 +Small,4x4,ldr-rgb-05.png,35.3252,0.0173,0.0095,6.9028 +Small,4x4,ldr-rgb-06.png,33.9736,0.0223,0.0142,4.6181 +Small,4x4,ldr-rgb-07.png,35.7343,0.0200,0.0118,5.5610 +Small,4x4,ldr-rgb-08.png,41.1869,0.0135,0.0057,11.4776 +Small,4x4,ldr-rgb-09.png,40.8303,0.0130,0.0052,12.7135 +Small,4x4,ldr-rgb-10.png,42.1183,0.0077,0.0022,7.3126 +Small,4x4,ldr-rgba-00.png,32.3988,0.0246,0.0163,4.0270 +Small,4x4,ldr-rgba-01.png,38.1315,0.0144,0.0063,10.3743 +Small,4x4,ldr-rgba-02.png,33.8019,0.0204,0.0122,5.3687 +Small,4x4,ldr-xy-00.png,36.9627,0.0131,0.0053,12.2752 +Small,4x4,ldr-xy-01.png,40.4676,0.0137,0.0062,10.6270 +Small,4x4,ldr-xy-02.png,44.0312,0.0119,0.0040,16.2823 +Small,4x4,ldrs-rgba-00.png,32.4007,0.0246,0.0164,4.0056 +Small,4x4,ldrs-rgba-01.png,38.1423,0.0145,0.0064,10.2835 +Small,4x4,ldrs-rgba-02.png,33.8070,0.0206,0.0125,5.2454 +Small,5x5,hdr-rgb-00.hdr,24.4063,0.1165,0.0217,3.0229 +Small,5x5,ldr-rgb-00.png,32.7185,0.0154,0.0070,9.3611 +Small,5x5,ldr-rgb-01.png,35.3125,0.0114,0.0033,20.1214 +Small,5x5,ldr-rgb-02.png,30.5420,0.0158,0.0076,8.6085 +Small,5x5,ldr-rgb-03.png,41.0871,0.0109,0.0030,21.7003 +Small,5x5,ldr-rgb-04.png,35.6347,0.0116,0.0032,20.5886 +Small,5x5,ldr-rgb-05.png,31.6680,0.0144,0.0060,10.8360 +Small,5x5,ldr-rgb-06.png,30.5668,0.0163,0.0079,8.2685 +Small,5x5,ldr-rgb-07.png,32.5478,0.0141,0.0055,11.8661 +Small,5x5,ldr-rgb-08.png,38.1010,0.0116,0.0035,18.9519 +Small,5x5,ldr-rgb-09.png,35.6999,0.0117,0.0035,18.8699 +Small,5x5,ldr-rgb-10.png,39.1121,0.0076,0.0017,9.6371 +Small,5x5,ldr-rgba-00.png,29.7540,0.0197,0.0111,5.9186 +Small,5x5,ldr-rgba-01.png,34.3669,0.0128,0.0043,15.2905 +Small,5x5,ldr-rgba-02.png,30.6075,0.0167,0.0082,7.9631 +Small,5x5,ldr-xy-00.png,35.8831,0.0120,0.0038,17.1520 +Small,5x5,ldr-xy-01.png,37.6330,0.0127,0.0048,13.6960 +Small,5x5,ldr-xy-02.png,42.1351,0.0109,0.0026,24.9390 +Small,5x5,ldrs-rgba-00.png,29.7621,0.0198,0.0111,5.8925 +Small,5x5,ldrs-rgba-01.png,34.3681,0.0127,0.0044,14.9626 +Small,5x5,ldrs-rgba-02.png,30.6094,0.0166,0.0082,7.9892 +Small,6x6,hdr-rgb-00.hdr,22.8297,0.1204,0.0250,2.6265 +Small,6x6,ldr-rgb-00.png,29.8940,0.0170,0.0076,8.6242 +Small,6x6,ldr-rgb-01.png,31.7369,0.0128,0.0039,16.9395 +Small,6x6,ldr-rgb-02.png,26.8847,0.0206,0.0114,5.7288 +Small,6x6,ldr-rgb-03.png,39.0152,0.0117,0.0030,22.1337 +Small,6x6,ldr-rgb-04.png,32.1322,0.0131,0.0039,16.7731 +Small,6x6,ldr-rgb-05.png,28.5469,0.0167,0.0075,8.7277 +Small,6x6,ldr-rgb-06.png,26.8933,0.0208,0.0116,5.6366 +Small,6x6,ldr-rgb-07.png,30.5744,0.0145,0.0051,12.8400 +Small,6x6,ldr-rgb-08.png,35.8219,0.0124,0.0035,18.8105 +Small,6x6,ldr-rgb-09.png,31.5939,0.0145,0.0054,12.1097 +Small,6x6,ldr-rgb-10.png,34.7916,0.0084,0.0017,9.6768 +Small,6x6,ldr-rgba-00.png,27.0190,0.0218,0.0123,5.3079 +Small,6x6,ldr-rgba-01.png,31.3894,0.0138,0.0046,14.1726 +Small,6x6,ldr-rgba-02.png,27.4089,0.0207,0.0115,5.6914 +Small,6x6,ldr-xy-00.png,34.4437,0.0130,0.0039,16.7486 +Small,6x6,ldr-xy-01.png,34.9945,0.0134,0.0045,14.5085 +Small,6x6,ldr-xy-02.png,41.1217,0.0116,0.0025,25.9245 +Small,6x6,ldrs-rgba-00.png,27.0177,0.0219,0.0125,5.2459 +Small,6x6,ldrs-rgba-01.png,31.3930,0.0140,0.0047,14.0065 +Small,6x6,ldrs-rgba-02.png,27.4079,0.0211,0.0118,5.5634 +Small,8x8,hdr-rgb-00.hdr,20.7229,0.1379,0.0372,1.7599 +Small,8x8,ldr-rgb-00.png,26.0768,0.0202,0.0068,9.5743 +Small,8x8,ldr-rgb-01.png,27.6111,0.0173,0.0041,15.8449 +Small,8x8,ldr-rgb-02.png,22.6789,0.0291,0.0161,4.0677 +Small,8x8,ldr-rgb-03.png,35.3649,0.0154,0.0027,24.4532 +Small,8x8,ldr-rgb-04.png,27.5653,0.0179,0.0046,14.2004 +Small,8x8,ldr-rgb-05.png,24.6789,0.0216,0.0084,7.7898 +Small,8x8,ldr-rgb-06.png,22.6857,0.0289,0.0154,4.2661 +Small,8x8,ldr-rgb-07.png,26.9996,0.0175,0.0040,16.1979 +Small,8x8,ldr-rgb-08.png,32.3078,0.0165,0.0035,18.8647 +Small,8x8,ldr-rgb-09.png,26.9700,0.0189,0.0057,11.4532 +Small,8x8,ldr-rgb-10.png,30.5983,0.0126,0.0017,9.2892 +Small,8x8,ldr-rgba-00.png,23.2790,0.0258,0.0119,5.5096 +Small,8x8,ldr-rgba-01.png,27.5382,0.0185,0.0051,12.7928 +Small,8x8,ldr-rgba-02.png,23.5944,0.0300,0.0166,3.9498 +Small,8x8,ldr-xy-00.png,31.0189,0.0176,0.0045,14.5608 +Small,8x8,ldr-xy-01.png,31.6408,0.0168,0.0038,17.0795 +Small,8x8,ldr-xy-02.png,39.5041,0.0157,0.0024,26.7599 +Small,8x8,ldrs-rgba-00.png,23.2784,0.0259,0.0122,5.3639 +Small,8x8,ldrs-rgba-01.png,27.5393,0.0185,0.0052,12.7205 +Small,8x8,ldrs-rgba-02.png,23.5937,0.0300,0.0167,3.9309 +Small,12x12,hdr-rgb-00.hdr,18.4354,0.1487,0.0433,1.5137 +Small,12x12,ldr-rgb-00.png,22.2178,0.0220,0.0035,18.7668 +Small,12x12,ldr-rgb-01.png,23.9444,0.0207,0.0025,26.6406 +Small,12x12,ldr-rgb-02.png,18.8268,0.0242,0.0058,11.3384 +Small,12x12,ldr-rgb-03.png,32.1095,0.0203,0.0024,27.8866 +Small,12x12,ldr-rgb-04.png,23.1291,0.0214,0.0027,23.9796 +Small,12x12,ldr-rgb-05.png,20.3606,0.0216,0.0031,20.8304 +Small,12x12,ldr-rgb-06.png,18.7065,0.0243,0.0057,11.4114 +Small,12x12,ldr-rgb-07.png,23.8295,0.0214,0.0027,24.0131 +Small,12x12,ldr-rgb-08.png,28.6338,0.0205,0.0026,25.2738 +Small,12x12,ldr-rgb-09.png,21.9118,0.0216,0.0034,19.5046 +Small,12x12,ldr-rgb-10.png,26.3721,0.0175,0.0016,10.3874 +Small,12x12,ldr-rgba-00.png,20.0485,0.0273,0.0084,7.8391 +Small,12x12,ldr-rgba-01.png,23.8042,0.0214,0.0028,23.1418 +Small,12x12,ldr-rgba-02.png,19.8756,0.0246,0.0060,10.9408 +Small,12x12,ldr-xy-00.png,27.2775,0.0215,0.0033,20.0612 +Small,12x12,ldr-xy-01.png,27.5355,0.0217,0.0037,17.9260 +Small,12x12,ldr-xy-02.png,38.1044,0.0209,0.0026,25.5700 +Small,12x12,ldrs-rgba-00.png,20.0498,0.0275,0.0086,7.6410 +Small,12x12,ldrs-rgba-01.png,23.8055,0.0214,0.0029,22.3678 +Small,12x12,ldrs-rgba-02.png,19.8752,0.0246,0.0060,10.9170 +Small,3x3x3,ldr-l-00-3.dds,49.3077,0.0310,0.0214,12.2761 +Small,3x3x3,ldr-l-01-3.dds,53.8732,0.0162,0.0091,7.6073 +Small,6x6x6,ldr-l-00-3.dds,32.1173,0.0969,0.0672,3.9028 +Small,6x6x6,ldr-l-01-3.dds,40.5942,0.0545,0.0273,2.5269 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse4.1_medium_results.csv new file mode 100644 index 0000000..cffdcb2 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse4.1_medium_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,32.3616,0.1658,0.0710,0.9226 +Small,4x4,ldr-rgb-00.png,38.6186,0.0761,0.0680,0.9631 +Small,4x4,ldr-rgb-01.png,39.9904,0.0665,0.0584,1.1227 +Small,4x4,ldr-rgb-02.png,35.0864,0.0672,0.0592,1.1077 +Small,4x4,ldr-rgb-03.png,46.9643,0.0434,0.0357,1.8360 +Small,4x4,ldr-rgb-04.png,41.9794,0.0557,0.0474,1.3823 +Small,4x4,ldr-rgb-05.png,37.6292,0.0749,0.0666,0.9838 +Small,4x4,ldr-rgb-06.png,35.2309,0.0606,0.0523,1.2528 +Small,4x4,ldr-rgb-07.png,38.6220,0.0899,0.0814,0.8050 +Small,4x4,ldr-rgb-08.png,44.5908,0.0486,0.0407,1.6104 +Small,4x4,ldr-rgb-09.png,41.9104,0.0558,0.0476,1.3780 +Small,4x4,ldr-rgb-10.png,44.8283,0.0149,0.0091,1.7807 +Small,4x4,ldr-rgba-00.png,36.1397,0.0873,0.0788,0.8319 +Small,4x4,ldr-rgba-01.png,38.8010,0.0482,0.0400,1.6395 +Small,4x4,ldr-rgba-02.png,34.7461,0.0735,0.0651,1.0067 +Small,4x4,ldr-xy-00.png,37.6959,0.0411,0.0331,1.9780 +Small,4x4,ldr-xy-01.png,44.9855,0.0564,0.0487,1.3465 +Small,4x4,ldr-xy-02.png,50.9056,0.0568,0.0486,1.3483 +Small,4x4,ldrs-rgba-00.png,36.1447,0.0881,0.0797,0.8228 +Small,4x4,ldrs-rgba-01.png,38.8178,0.0493,0.0408,1.6063 +Small,4x4,ldrs-rgba-02.png,34.7492,0.0738,0.0655,1.0004 +Small,5x5,hdr-rgb-00.hdr,26.5177,0.1855,0.0893,0.7339 +Small,5x5,ldr-rgb-00.png,35.0100,0.0881,0.0785,0.8353 +Small,5x5,ldr-rgb-01.png,36.3412,0.0658,0.0567,1.1562 +Small,5x5,ldr-rgb-02.png,30.9700,0.0689,0.0598,1.0967 +Small,5x5,ldr-rgb-03.png,43.5605,0.0265,0.0176,3.7154 +Small,5x5,ldr-rgb-04.png,37.5544,0.0586,0.0489,1.3412 +Small,5x5,ldr-rgb-05.png,33.4512,0.0955,0.0859,0.7629 +Small,5x5,ldr-rgb-06.png,30.9908,0.0654,0.0559,1.1725 +Small,5x5,ldr-rgb-07.png,35.6054,0.0977,0.0878,0.7463 +Small,5x5,ldr-rgb-08.png,41.1640,0.0428,0.0338,1.9415 +Small,5x5,ldr-rgb-09.png,37.4846,0.0552,0.0460,1.4236 +Small,5x5,ldr-rgb-10.png,40.4607,0.0175,0.0106,1.5294 +Small,5x5,ldr-rgba-00.png,32.7046,0.1127,0.1029,0.6369 +Small,5x5,ldr-rgba-01.png,35.2093,0.0588,0.0494,1.3256 +Small,5x5,ldr-rgba-02.png,31.0406,0.0973,0.0878,0.7464 +Small,5x5,ldr-xy-00.png,37.1119,0.0434,0.0342,1.9154 +Small,5x5,ldr-xy-01.png,40.9199,0.0540,0.0449,1.4592 +Small,5x5,ldr-xy-02.png,48.7008,0.0336,0.0244,2.6825 +Small,5x5,ldrs-rgba-00.png,32.7058,0.1130,0.1033,0.6343 +Small,5x5,ldrs-rgba-01.png,35.2165,0.0590,0.0496,1.3204 +Small,5x5,ldrs-rgba-02.png,31.0419,0.0976,0.0881,0.7440 +Small,6x6,hdr-rgb-00.hdr,24.7323,0.1886,0.0923,0.7100 +Small,6x6,ldr-rgb-00.png,32.3215,0.1038,0.0930,0.7048 +Small,6x6,ldr-rgb-01.png,33.0336,0.0914,0.0810,0.8093 +Small,6x6,ldr-rgb-02.png,27.3867,0.1104,0.1000,0.6555 +Small,6x6,ldr-rgb-03.png,41.4371,0.0262,0.0161,4.0810 +Small,6x6,ldr-rgb-04.png,34.1260,0.0815,0.0708,0.9254 +Small,6x6,ldr-rgb-05.png,30.1074,0.1269,0.1162,0.5638 +Small,6x6,ldr-rgb-06.png,27.4381,0.1075,0.0965,0.6788 +Small,6x6,ldr-rgb-07.png,33.9556,0.1109,0.1000,0.6553 +Small,6x6,ldr-rgb-08.png,39.0372,0.0413,0.0309,2.1241 +Small,6x6,ldr-rgb-09.png,33.6201,0.0821,0.0715,0.9162 +Small,6x6,ldr-rgb-10.png,36.8847,0.0202,0.0119,1.3651 +Small,6x6,ldr-rgba-00.png,30.1133,0.1285,0.1175,0.5579 +Small,6x6,ldr-rgba-01.png,32.1295,0.0620,0.0512,1.2793 +Small,6x6,ldr-rgba-02.png,27.7849,0.1058,0.0949,0.6908 +Small,6x6,ldr-xy-00.png,36.0271,0.0400,0.0294,2.2306 +Small,6x6,ldr-xy-01.png,37.9588,0.0452,0.0348,1.8813 +Small,6x6,ldr-xy-02.png,45.0705,0.0284,0.0178,3.6771 +Small,6x6,ldrs-rgba-00.png,30.1144,0.1294,0.1183,0.5539 +Small,6x6,ldrs-rgba-01.png,32.1349,0.0619,0.0512,1.2796 +Small,6x6,ldrs-rgba-02.png,27.7835,0.1068,0.0958,0.6840 +Small,8x8,hdr-rgb-00.hdr,21.4320,0.2009,0.0996,0.6583 +Small,8x8,ldr-rgb-00.png,28.6493,0.1406,0.1246,0.5259 +Small,8x8,ldr-rgb-01.png,28.8554,0.1162,0.1006,0.6515 +Small,8x8,ldr-rgb-02.png,23.0793,0.1361,0.1204,0.5445 +Small,8x8,ldr-rgb-03.png,38.2658,0.0354,0.0200,3.2726 +Small,8x8,ldr-rgb-04.png,29.5754,0.1089,0.0928,0.7058 +Small,8x8,ldr-rgb-05.png,25.8717,0.1584,0.1424,0.4601 +Small,8x8,ldr-rgb-06.png,23.1192,0.1345,0.1186,0.5528 +Small,8x8,ldr-rgb-07.png,30.6667,0.1259,0.1097,0.5972 +Small,8x8,ldr-rgb-08.png,35.6982,0.0513,0.0357,1.8366 +Small,8x8,ldr-rgb-09.png,28.9985,0.1073,0.0916,0.7154 +Small,8x8,ldr-rgb-10.png,32.1108,0.0306,0.0172,0.9451 +Small,8x8,ldr-rgba-00.png,26.0222,0.1656,0.1495,0.4383 +Small,8x8,ldr-rgba-01.png,28.2807,0.0730,0.0570,1.1505 +Small,8x8,ldr-rgba-02.png,23.8775,0.1233,0.1075,0.6098 +Small,8x8,ldr-xy-00.png,33.9706,0.0551,0.0396,1.6567 +Small,8x8,ldr-xy-01.png,35.0076,0.0541,0.0386,1.6983 +Small,8x8,ldr-xy-02.png,40.7561,0.0277,0.0119,5.5179 +Small,8x8,ldrs-rgba-00.png,26.0229,0.1652,0.1489,0.4401 +Small,8x8,ldrs-rgba-01.png,28.2841,0.0738,0.0577,1.1359 +Small,8x8,ldrs-rgba-02.png,23.8771,0.1247,0.1089,0.6020 +Small,12x12,hdr-rgb-00.hdr,18.7253,0.2396,0.1289,0.5085 +Small,12x12,ldr-rgb-00.png,24.4659,0.1445,0.1190,0.5507 +Small,12x12,ldr-rgb-01.png,24.9925,0.1371,0.1113,0.5887 +Small,12x12,ldr-rgb-02.png,19.2481,0.1587,0.1330,0.4928 +Small,12x12,ldr-rgb-03.png,34.6525,0.0436,0.0181,3.6168 +Small,12x12,ldr-rgb-04.png,24.8440,0.1287,0.1025,0.6394 +Small,12x12,ldr-rgb-05.png,21.5754,0.1826,0.1567,0.4181 +Small,12x12,ldr-rgb-06.png,19.1991,0.1528,0.1268,0.5169 +Small,12x12,ldr-rgb-07.png,26.5936,0.1295,0.1034,0.6340 +Small,12x12,ldr-rgb-08.png,31.1465,0.0603,0.0351,1.8687 +Small,12x12,ldr-rgb-09.png,24.2324,0.1360,0.1108,0.5917 +Small,12x12,ldr-rgb-10.png,27.8888,0.0508,0.0280,0.5805 +Small,12x12,ldr-rgba-00.png,21.7589,0.1507,0.1244,0.5267 +Small,12x12,ldr-rgba-01.png,24.5625,0.0853,0.0593,1.1045 +Small,12x12,ldr-rgba-02.png,20.1486,0.1411,0.1150,0.5696 +Small,12x12,ldr-xy-00.png,29.7046,0.0667,0.0410,1.5982 +Small,12x12,ldr-xy-01.png,31.9137,0.0587,0.0332,1.9750 +Small,12x12,ldr-xy-02.png,38.1657,0.0282,0.0031,20.9911 +Small,12x12,ldrs-rgba-00.png,21.7593,0.1511,0.1247,0.5255 +Small,12x12,ldrs-rgba-01.png,24.5645,0.0861,0.0601,1.0912 +Small,12x12,ldrs-rgba-02.png,20.1484,0.1414,0.1153,0.5682 +Small,3x3x3,ldr-l-00-3.dds,51.8519,0.0474,0.0376,6.9677 +Small,3x3x3,ldr-l-01-3.dds,54.3882,0.0171,0.0101,6.7949 +Small,6x6x6,ldr-l-00-3.dds,32.9180,0.1288,0.0985,2.6626 +Small,6x6x6,ldr-l-01-3.dds,40.8335,0.0551,0.0280,2.4607 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse4.1_thorough_results.csv new file mode 100644 index 0000000..066f84e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-2.5-sse4.1_thorough_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,32.6257,0.2529,0.1592,0.4116 +Small,4x4,ldr-rgb-00.png,39.1011,0.1729,0.1644,0.3986 +Small,4x4,ldr-rgb-01.png,40.2753,0.1646,0.1563,0.4194 +Small,4x4,ldr-rgb-02.png,35.3312,0.1482,0.1401,0.4679 +Small,4x4,ldr-rgb-03.png,47.6552,0.1769,0.1691,0.3876 +Small,4x4,ldr-rgb-04.png,42.2447,0.1463,0.1379,0.4754 +Small,4x4,ldr-rgb-05.png,37.9471,0.1621,0.1535,0.4269 +Small,4x4,ldr-rgb-06.png,35.4333,0.1388,0.1304,0.5025 +Small,4x4,ldr-rgb-07.png,39.6965,0.1886,0.1801,0.3639 +Small,4x4,ldr-rgb-08.png,45.6560,0.1615,0.1533,0.4274 +Small,4x4,ldr-rgb-09.png,42.1582,0.1529,0.1446,0.4534 +Small,4x4,ldr-rgb-10.png,44.9944,0.0281,0.0220,0.7378 +Small,4x4,ldr-rgba-00.png,36.7422,0.1778,0.1692,0.3874 +Small,4x4,ldr-rgba-01.png,39.0115,0.1537,0.1452,0.4513 +Small,4x4,ldr-rgba-02.png,34.9453,0.1792,0.1708,0.3838 +Small,4x4,ldr-xy-00.png,37.7350,0.1486,0.1404,0.4669 +Small,4x4,ldr-xy-01.png,45.4829,0.1467,0.1387,0.4726 +Small,4x4,ldr-xy-02.png,51.0007,0.1806,0.1723,0.3803 +Small,4x4,ldrs-rgba-00.png,36.7505,0.1777,0.1690,0.3877 +Small,4x4,ldrs-rgba-01.png,39.0325,0.1551,0.1467,0.4468 +Small,4x4,ldrs-rgba-02.png,34.9504,0.1808,0.1724,0.3802 +Small,5x5,hdr-rgb-00.hdr,27.4762,0.2654,0.1708,0.3836 +Small,5x5,ldr-rgb-00.png,35.3221,0.1955,0.1859,0.3526 +Small,5x5,ldr-rgb-01.png,36.4859,0.1851,0.1759,0.3726 +Small,5x5,ldr-rgb-02.png,31.1011,0.1677,0.1585,0.4136 +Small,5x5,ldr-rgb-03.png,44.4621,0.1876,0.1786,0.3669 +Small,5x5,ldr-rgb-04.png,37.7979,0.1614,0.1519,0.4313 +Small,5x5,ldr-rgb-05.png,33.6558,0.1851,0.1755,0.3734 +Small,5x5,ldr-rgb-06.png,31.0952,0.1618,0.1521,0.4308 +Small,5x5,ldr-rgb-07.png,36.5891,0.2117,0.2020,0.3244 +Small,5x5,ldr-rgb-08.png,42.2366,0.1740,0.1646,0.3981 +Small,5x5,ldr-rgb-09.png,37.6643,0.1708,0.1616,0.4056 +Small,5x5,ldr-rgb-10.png,40.7404,0.0348,0.0278,0.5844 +Small,5x5,ldr-rgba-00.png,33.1224,0.2056,0.1956,0.3350 +Small,5x5,ldr-rgba-01.png,35.3488,0.1810,0.1713,0.3825 +Small,5x5,ldr-rgba-02.png,31.1475,0.2230,0.2134,0.3071 +Small,5x5,ldr-xy-00.png,37.2677,0.1425,0.1333,0.4916 +Small,5x5,ldr-xy-01.png,41.7309,0.1783,0.1690,0.3879 +Small,5x5,ldr-xy-02.png,49.2472,0.2000,0.1906,0.3438 +Small,5x5,ldrs-rgba-00.png,33.1249,0.2082,0.1985,0.3302 +Small,5x5,ldrs-rgba-01.png,35.3573,0.1822,0.1725,0.3799 +Small,5x5,ldrs-rgba-02.png,31.1476,0.2252,0.2157,0.3038 +Small,6x6,hdr-rgb-00.hdr,24.8349,0.2684,0.1730,0.3788 +Small,6x6,ldr-rgb-00.png,32.6463,0.2327,0.2218,0.2955 +Small,6x6,ldr-rgb-01.png,33.1760,0.2340,0.2233,0.2935 +Small,6x6,ldr-rgb-02.png,27.4903,0.2353,0.2247,0.2917 +Small,6x6,ldr-rgb-03.png,42.5136,0.1398,0.1293,0.5067 +Small,6x6,ldr-rgb-04.png,34.3341,0.2259,0.2149,0.3049 +Small,6x6,ldr-rgb-05.png,30.2804,0.2397,0.2286,0.2867 +Small,6x6,ldr-rgb-06.png,27.5520,0.2357,0.2248,0.2915 +Small,6x6,ldr-rgb-07.png,34.3789,0.2332,0.2222,0.2949 +Small,6x6,ldr-rgb-08.png,39.8926,0.1372,0.1267,0.5174 +Small,6x6,ldr-rgb-09.png,33.8281,0.2145,0.2039,0.3215 +Small,6x6,ldr-rgb-10.png,37.1218,0.0418,0.0334,0.4871 +Small,6x6,ldr-rgba-00.png,30.4829,0.2358,0.2245,0.2920 +Small,6x6,ldr-rgba-01.png,32.2487,0.2015,0.1903,0.3444 +Small,6x6,ldr-rgba-02.png,27.8831,0.2548,0.2437,0.2690 +Small,6x6,ldr-xy-00.png,36.3665,0.1072,0.0966,0.6782 +Small,6x6,ldr-xy-01.png,38.4666,0.1553,0.1448,0.4526 +Small,6x6,ldr-xy-02.png,47.4520,0.2016,0.1907,0.3437 +Small,6x6,ldrs-rgba-00.png,30.4838,0.2364,0.2252,0.2910 +Small,6x6,ldrs-rgba-01.png,32.2549,0.2026,0.1916,0.3420 +Small,6x6,ldrs-rgba-02.png,27.8824,0.2557,0.2448,0.2677 +Small,8x8,hdr-rgb-00.hdr,21.7370,0.2919,0.1919,0.3415 +Small,8x8,ldr-rgb-00.png,28.9325,0.2762,0.2598,0.2523 +Small,8x8,ldr-rgb-01.png,29.0009,0.2634,0.2473,0.2650 +Small,8x8,ldr-rgb-02.png,23.1717,0.2847,0.2683,0.2443 +Small,8x8,ldr-rgb-03.png,39.4327,0.0767,0.0608,1.0779 +Small,8x8,ldr-rgb-04.png,29.7722,0.2647,0.2481,0.2641 +Small,8x8,ldr-rgb-05.png,26.0309,0.2870,0.2705,0.2422 +Small,8x8,ldr-rgb-06.png,23.2299,0.2857,0.2690,0.2436 +Small,8x8,ldr-rgb-07.png,31.1331,0.2696,0.2530,0.2591 +Small,8x8,ldr-rgb-08.png,36.4987,0.1254,0.1091,0.6004 +Small,8x8,ldr-rgb-09.png,29.1978,0.2206,0.2045,0.3204 +Small,8x8,ldr-rgb-10.png,32.3450,0.0531,0.0392,0.4151 +Small,8x8,ldr-rgba-00.png,26.4881,0.2825,0.2655,0.2468 +Small,8x8,ldr-rgba-01.png,28.3958,0.2356,0.2191,0.2992 +Small,8x8,ldr-rgba-02.png,23.9557,0.2791,0.2628,0.2494 +Small,8x8,ldr-xy-00.png,34.2722,0.1265,0.1101,0.5950 +Small,8x8,ldr-xy-01.png,35.4903,0.1165,0.1005,0.6520 +Small,8x8,ldr-xy-02.png,44.4205,0.1290,0.1127,0.5816 +Small,8x8,ldrs-rgba-00.png,26.4899,0.2836,0.2669,0.2456 +Small,8x8,ldrs-rgba-01.png,28.3990,0.2364,0.2201,0.2978 +Small,8x8,ldrs-rgba-02.png,23.9552,0.2820,0.2657,0.2467 +Small,12x12,hdr-rgb-00.hdr,18.8998,0.3260,0.2155,0.3041 +Small,12x12,ldr-rgb-00.png,24.9028,0.2982,0.2711,0.2418 +Small,12x12,ldr-rgb-01.png,25.1435,0.2724,0.2453,0.2672 +Small,12x12,ldr-rgb-02.png,19.3029,0.3171,0.2901,0.2259 +Small,12x12,ldr-rgb-03.png,36.1094,0.0867,0.0601,1.0896 +Small,12x12,ldr-rgb-04.png,25.0031,0.2843,0.2572,0.2548 +Small,12x12,ldr-rgb-05.png,21.7060,0.3189,0.2918,0.2246 +Small,12x12,ldr-rgb-06.png,19.2656,0.3143,0.2870,0.2283 +Small,12x12,ldr-rgb-07.png,27.0496,0.2901,0.2626,0.2496 +Small,12x12,ldr-rgb-08.png,32.1972,0.1210,0.0942,0.6958 +Small,12x12,ldr-rgb-09.png,24.4312,0.2669,0.2404,0.2727 +Small,12x12,ldr-rgb-10.png,28.1634,0.0826,0.0585,0.2780 +Small,12x12,ldr-rgba-00.png,22.2648,0.3040,0.2771,0.2365 +Small,12x12,ldr-rgba-01.png,24.6914,0.2284,0.2013,0.3256 +Small,12x12,ldr-rgba-02.png,20.2045,0.2622,0.2349,0.2790 +Small,12x12,ldr-xy-00.png,30.4261,0.1580,0.1310,0.5005 +Small,12x12,ldr-xy-01.png,32.4701,0.1144,0.0876,0.7481 +Small,12x12,ldr-xy-02.png,39.8495,0.0715,0.0446,1.4706 +Small,12x12,ldrs-rgba-00.png,22.2650,0.3045,0.2772,0.2365 +Small,12x12,ldrs-rgba-01.png,24.6931,0.2282,0.2010,0.3260 +Small,12x12,ldrs-rgba-02.png,20.2044,0.2629,0.2361,0.2776 +Small,3x3x3,ldr-l-00-3.dds,52.4074,0.1051,0.0953,2.7507 +Small,3x3x3,ldr-l-01-3.dds,55.4199,0.0453,0.0384,1.7958 +Small,6x6x6,ldr-l-00-3.dds,33.2677,0.1976,0.1676,1.5639 +Small,6x6x6,ldr-l-01-3.dds,41.7102,0.0687,0.0415,1.6624 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-avx2_fast_results.csv new file mode 100644 index 0000000..81d3cb6 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-avx2_fast_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.6884,0.1058,0.0154,4.2512 +Small,4x4,ldr-rgb-00.png,38.1103,0.0146,0.0096,6.8216 +Small,4x4,ldr-rgb-01.png,39.8105,0.0132,0.0085,7.7356 +Small,4x4,ldr-rgb-02.png,35.0374,0.0180,0.0133,4.9365 +Small,4x4,ldr-rgb-03.png,45.9704,0.0078,0.0032,20.1893 +Small,4x4,ldr-rgb-04.png,41.9106,0.0108,0.0058,11.3109 +Small,4x4,ldr-rgb-05.png,37.2317,0.0174,0.0125,5.2395 +Small,4x4,ldr-rgb-06.png,35.2059,0.0172,0.0122,5.3613 +Small,4x4,ldr-rgb-07.png,38.0309,0.0182,0.0129,5.0953 +Small,4x4,ldr-rgb-08.png,43.6358,0.0098,0.0049,13.3527 +Small,4x4,ldr-rgb-09.png,41.8533,0.0111,0.0063,10.3630 +Small,4x4,ldr-rgb-10.png,44.3464,0.0044,0.0018,8.8641 +Small,4x4,ldr-rgba-00.png,35.5182,0.0177,0.0123,5.3186 +Small,4x4,ldr-rgba-01.png,38.7956,0.0127,0.0076,8.6277 +Small,4x4,ldr-rgba-02.png,34.8333,0.0161,0.0110,5.9795 +Small,4x4,ldr-xy-00.png,37.5697,0.0135,0.0061,10.7404 +Small,4x4,ldr-xy-01.png,44.1378,0.0142,0.0071,9.2176 +Small,4x4,ldr-xy-02.png,48.1786,0.0120,0.0043,15.1107 +Small,4x4,ldrs-rgba-00.png,35.5254,0.0180,0.0126,5.2066 +Small,4x4,ldrs-rgba-01.png,38.8141,0.0131,0.0080,8.1758 +Small,4x4,ldrs-rgba-02.png,34.8386,0.0161,0.0111,5.8855 +Small,5x5,hdr-rgb-00.hdr,29.4686,0.1105,0.0175,3.7464 +Small,5x5,ldr-rgb-00.png,34.3042,0.0157,0.0096,6.8132 +Small,5x5,ldr-rgb-01.png,36.1808,0.0130,0.0072,9.0495 +Small,5x5,ldr-rgb-02.png,31.0160,0.0171,0.0112,5.8280 +Small,5x5,ldr-rgb-03.png,42.6231,0.0086,0.0031,20.9590 +Small,5x5,ldr-rgb-04.png,37.2434,0.0120,0.0058,11.2738 +Small,5x5,ldr-rgb-05.png,33.1823,0.0193,0.0133,4.9123 +Small,5x5,ldr-rgb-06.png,31.0247,0.0170,0.0109,6.0080 +Small,5x5,ldr-rgb-07.png,35.1883,0.0174,0.0111,5.9282 +Small,5x5,ldr-rgb-08.png,40.0310,0.0102,0.0043,15.0692 +Small,5x5,ldr-rgb-09.png,37.2810,0.0123,0.0065,10.1211 +Small,5x5,ldr-rgb-10.png,40.1234,0.0053,0.0017,9.6303 +Small,5x5,ldr-rgba-00.png,32.0072,0.0194,0.0131,5.0197 +Small,5x5,ldr-rgba-01.png,35.1428,0.0136,0.0076,8.6792 +Small,5x5,ldr-rgba-02.png,31.1062,0.0176,0.0115,5.7017 +Small,5x5,ldr-xy-00.png,36.7258,0.0140,0.0050,13.1546 +Small,5x5,ldr-xy-01.png,39.8638,0.0145,0.0058,11.3958 +Small,5x5,ldr-xy-02.png,43.9171,0.0132,0.0045,14.6321 +Small,5x5,ldrs-rgba-00.png,32.0096,0.0196,0.0133,4.9279 +Small,5x5,ldrs-rgba-01.png,35.1497,0.0139,0.0078,8.3710 +Small,5x5,ldrs-rgba-02.png,31.1070,0.0178,0.0116,5.6711 +Small,6x6,hdr-rgb-00.hdr,26.9904,0.1131,0.0192,3.4221 +Small,6x6,ldr-rgb-00.png,31.5938,0.0186,0.0120,5.4431 +Small,6x6,ldr-rgb-01.png,32.8896,0.0156,0.0094,6.9890 +Small,6x6,ldr-rgb-02.png,27.4079,0.0204,0.0140,4.6769 +Small,6x6,ldr-rgb-03.png,40.4899,0.0093,0.0032,20.4036 +Small,6x6,ldr-rgb-04.png,33.9065,0.0140,0.0075,8.7781 +Small,6x6,ldr-rgb-05.png,29.9329,0.0229,0.0164,4.0024 +Small,6x6,ldr-rgb-06.png,27.4651,0.0202,0.0136,4.8146 +Small,6x6,ldr-rgb-07.png,32.8824,0.0179,0.0112,5.8613 +Small,6x6,ldr-rgb-08.png,37.6380,0.0108,0.0044,14.8880 +Small,6x6,ldr-rgb-09.png,33.4716,0.0140,0.0075,8.7078 +Small,6x6,ldr-rgb-10.png,36.6590,0.0062,0.0021,7.6532 +Small,6x6,ldr-rgba-00.png,29.4788,0.0229,0.0160,4.0919 +Small,6x6,ldr-rgba-01.png,32.0575,0.0159,0.0092,7.1406 +Small,6x6,ldr-rgba-02.png,27.8275,0.0207,0.0138,4.7500 +Small,6x6,ldr-xy-00.png,35.6827,0.0146,0.0051,12.8598 +Small,6x6,ldr-xy-01.png,37.1053,0.0162,0.0071,9.1684 +Small,6x6,ldr-xy-02.png,41.9446,0.0133,0.0042,15.5818 +Small,6x6,ldrs-rgba-00.png,29.4790,0.0231,0.0163,4.0152 +Small,6x6,ldrs-rgba-01.png,32.0640,0.0157,0.0091,7.1749 +Small,6x6,ldrs-rgba-02.png,27.8273,0.0209,0.0144,4.5451 +Small,8x8,hdr-rgb-00.hdr,23.7216,0.1240,0.0256,2.5609 +Small,8x8,ldr-rgb-00.png,27.9814,0.0261,0.0155,4.2408 +Small,8x8,ldr-rgb-01.png,28.7458,0.0226,0.0123,5.3207 +Small,8x8,ldr-rgb-02.png,23.0937,0.0303,0.0199,3.2868 +Small,8x8,ldr-rgb-03.png,37.2544,0.0137,0.0034,19.4123 +Small,8x8,ldr-rgb-04.png,29.3419,0.0214,0.0107,6.1061 +Small,8x8,ldr-rgb-05.png,25.7747,0.0327,0.0223,2.9325 +Small,8x8,ldr-rgb-06.png,23.1468,0.0304,0.0199,3.2967 +Small,8x8,ldr-rgb-07.png,29.6508,0.0214,0.0106,6.1850 +Small,8x8,ldr-rgb-08.png,34.2150,0.0157,0.0053,12.2911 +Small,8x8,ldr-rgb-09.png,28.6635,0.0221,0.0117,5.6201 +Small,8x8,ldr-rgb-10.png,31.9974,0.0110,0.0027,5.9155 +Small,8x8,ldr-rgba-00.png,25.3599,0.0312,0.0203,3.2268 +Small,8x8,ldr-rgba-01.png,28.2399,0.0236,0.0131,4.9924 +Small,8x8,ldr-rgba-02.png,23.9241,0.0309,0.0201,3.2576 +Small,8x8,ldr-xy-00.png,33.3965,0.0206,0.0071,9.2331 +Small,8x8,ldr-xy-01.png,34.2472,0.0219,0.0085,7.6651 +Small,8x8,ldr-xy-02.png,39.9005,0.0167,0.0030,21.5152 +Small,8x8,ldrs-rgba-00.png,25.3610,0.0315,0.0208,3.1511 +Small,8x8,ldrs-rgba-01.png,28.2419,0.0236,0.0131,4.9841 +Small,8x8,ldrs-rgba-02.png,23.9237,0.0309,0.0201,3.2552 +Small,12x12,hdr-rgb-00.hdr,20.5637,0.1398,0.0343,1.9107 +Small,12x12,ldr-rgb-00.png,23.7825,0.0297,0.0123,5.3481 +Small,12x12,ldr-rgb-01.png,24.7588,0.0253,0.0084,7.8028 +Small,12x12,ldr-rgb-02.png,19.2226,0.0391,0.0221,2.9719 +Small,12x12,ldr-rgb-03.png,33.2364,0.0198,0.0027,24.6571 +Small,12x12,ldr-rgb-04.png,24.5606,0.0257,0.0086,7.6338 +Small,12x12,ldr-rgb-05.png,21.4885,0.0354,0.0181,3.6280 +Small,12x12,ldr-rgb-06.png,19.2097,0.0404,0.0233,2.8078 +Small,12x12,ldr-rgb-07.png,25.3456,0.0248,0.0072,9.1110 +Small,12x12,ldr-rgb-08.png,30.1535,0.0211,0.0042,15.5298 +Small,12x12,ldr-rgb-09.png,23.7136,0.0291,0.0120,5.4532 +Small,12x12,ldr-rgb-10.png,27.3052,0.0176,0.0030,5.3577 +Small,12x12,ldr-rgba-00.png,21.3632,0.0385,0.0207,3.1658 +Small,12x12,ldr-rgba-01.png,24.4867,0.0271,0.0096,6.8218 +Small,12x12,ldr-rgba-02.png,20.1666,0.0444,0.0273,2.4036 +Small,12x12,ldr-xy-00.png,29.0651,0.0280,0.0064,10.2079 +Small,12x12,ldr-xy-01.png,30.4241,0.0270,0.0057,11.4290 +Small,12x12,ldr-xy-02.png,37.9951,0.0229,0.0019,34.7507 +Small,12x12,ldrs-rgba-00.png,21.3658,0.0390,0.0213,3.0769 +Small,12x12,ldrs-rgba-01.png,24.4885,0.0273,0.0098,6.7024 +Small,12x12,ldrs-rgba-02.png,20.1665,0.0446,0.0272,2.4081 +Small,3x3x3,ldr-l-00-3.dds,50.7551,0.0179,0.0116,22.5559 +Small,3x3x3,ldr-l-01-3.dds,53.8676,0.0090,0.0051,13.5348 +Small,6x6x6,ldr-l-00-3.dds,32.5264,0.0630,0.0405,6.4724 +Small,6x6x6,ldr-l-01-3.dds,40.7893,0.0366,0.0164,4.1969 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-avx2_fastest_results.csv new file mode 100644 index 0000000..0822f91 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-avx2_fastest_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.2999,0.0997,0.0097,6.7375 +Small,4x4,ldr-rgb-00.png,37.0084,0.0102,0.0057,11.4614 +Small,4x4,ldr-rgb-01.png,39.4162,0.0097,0.0054,12.0980 +Small,4x4,ldr-rgb-02.png,34.6448,0.0122,0.0080,8.1675 +Small,4x4,ldr-rgb-03.png,45.3559,0.0066,0.0025,25.7618 +Small,4x4,ldr-rgb-04.png,41.6390,0.0086,0.0042,15.6706 +Small,4x4,ldr-rgb-05.png,36.7213,0.0119,0.0076,8.6516 +Small,4x4,ldr-rgb-06.png,34.6994,0.0118,0.0073,8.9249 +Small,4x4,ldr-rgb-07.png,37.1808,0.0122,0.0076,8.6767 +Small,4x4,ldr-rgb-08.png,42.6915,0.0077,0.0035,18.8531 +Small,4x4,ldr-rgb-09.png,41.6433,0.0086,0.0043,15.2617 +Small,4x4,ldr-rgb-10.png,43.8818,0.0034,0.0014,11.2494 +Small,4x4,ldr-rgba-00.png,34.5700,0.0118,0.0070,9.3985 +Small,4x4,ldr-rgba-01.png,38.5857,0.0101,0.0057,11.5953 +Small,4x4,ldr-rgba-02.png,34.5224,0.0127,0.0082,8.0018 +Small,4x4,ldr-xy-00.png,37.5264,0.0109,0.0041,15.9915 +Small,4x4,ldr-xy-01.png,43.8563,0.0112,0.0046,14.1763 +Small,4x4,ldr-xy-02.png,48.1786,0.0105,0.0034,19.0676 +Small,4x4,ldrs-rgba-00.png,34.5750,0.0118,0.0071,9.1942 +Small,4x4,ldrs-rgba-01.png,38.6025,0.0102,0.0057,11.4695 +Small,4x4,ldrs-rgba-02.png,34.5263,0.0125,0.0080,8.1675 +Small,5x5,hdr-rgb-00.hdr,28.8076,0.1032,0.0107,6.1191 +Small,5x5,ldr-rgb-00.png,33.4478,0.0110,0.0058,11.3840 +Small,5x5,ldr-rgb-01.png,35.9999,0.0099,0.0051,12.9287 +Small,5x5,ldr-rgb-02.png,30.8748,0.0129,0.0080,8.2412 +Small,5x5,ldr-rgb-03.png,42.2547,0.0071,0.0024,27.2291 +Small,5x5,ldr-rgb-04.png,36.9224,0.0097,0.0046,14.3285 +Small,5x5,ldr-rgb-05.png,32.6193,0.0137,0.0088,7.4610 +Small,5x5,ldr-rgb-06.png,30.8711,0.0132,0.0081,8.0977 +Small,5x5,ldr-rgb-07.png,34.2652,0.0126,0.0074,8.8756 +Small,5x5,ldr-rgb-08.png,39.3139,0.0081,0.0032,20.4477 +Small,5x5,ldr-rgb-09.png,36.9835,0.0094,0.0044,14.7277 +Small,5x5,ldr-rgb-10.png,39.7373,0.0041,0.0015,10.9460 +Small,5x5,ldr-rgba-00.png,30.7473,0.0127,0.0073,9.0145 +Small,5x5,ldr-rgba-01.png,34.9846,0.0112,0.0062,10.5548 +Small,5x5,ldr-rgba-02.png,31.0020,0.0142,0.0089,7.3289 +Small,5x5,ldr-xy-00.png,36.5568,0.0118,0.0038,17.1960 +Small,5x5,ldr-xy-01.png,38.8334,0.0119,0.0043,15.1531 +Small,5x5,ldr-xy-02.png,43.7233,0.0115,0.0036,18.3681 +Small,5x5,ldrs-rgba-00.png,30.7497,0.0129,0.0073,8.9738 +Small,5x5,ldrs-rgba-01.png,34.9913,0.0111,0.0060,10.8897 +Small,5x5,ldrs-rgba-02.png,31.0030,0.0142,0.0088,7.4854 +Small,6x6,hdr-rgb-00.hdr,26.7122,0.1034,0.0107,6.1220 +Small,6x6,ldr-rgb-00.png,31.1052,0.0119,0.0065,10.1088 +Small,6x6,ldr-rgb-01.png,32.7949,0.0109,0.0057,11.4997 +Small,6x6,ldr-rgb-02.png,27.3228,0.0141,0.0090,7.2956 +Small,6x6,ldr-rgb-03.png,40.2037,0.0073,0.0023,28.2854 +Small,6x6,ldr-rgb-04.png,33.7349,0.0104,0.0049,13.4652 +Small,6x6,ldr-rgb-05.png,29.5304,0.0145,0.0091,7.1978 +Small,6x6,ldr-rgb-06.png,27.3791,0.0143,0.0089,7.3727 +Small,6x6,ldr-rgb-07.png,32.0586,0.0125,0.0067,9.8537 +Small,6x6,ldr-rgb-08.png,37.0422,0.0082,0.0030,21.9990 +Small,6x6,ldr-rgb-09.png,33.2804,0.0105,0.0053,12.3797 +Small,6x6,ldr-rgb-10.png,36.4903,0.0046,0.0016,10.3810 +Small,6x6,ldr-rgba-00.png,28.4787,0.0138,0.0080,8.1503 +Small,6x6,ldr-rgba-01.png,31.9580,0.0121,0.0066,9.9417 +Small,6x6,ldr-rgba-02.png,27.7571,0.0148,0.0092,7.0997 +Small,6x6,ldr-xy-00.png,35.5281,0.0118,0.0039,16.9741 +Small,6x6,ldr-xy-01.png,36.2504,0.0123,0.0046,14.3278 +Small,6x6,ldr-xy-02.png,41.7327,0.0112,0.0031,20.9447 +Small,6x6,ldrs-rgba-00.png,28.4800,0.0136,0.0078,8.3924 +Small,6x6,ldrs-rgba-01.png,31.9643,0.0120,0.0064,10.2368 +Small,6x6,ldrs-rgba-02.png,27.7547,0.0148,0.0092,7.0980 +Small,8x8,hdr-rgb-00.hdr,23.5547,0.1126,0.0163,4.0226 +Small,8x8,ldr-rgb-00.png,27.6188,0.0183,0.0094,7.0092 +Small,8x8,ldr-rgb-01.png,28.6671,0.0169,0.0084,7.8188 +Small,8x8,ldr-rgb-02.png,23.0179,0.0217,0.0129,5.0634 +Small,8x8,ldr-rgb-03.png,37.0089,0.0113,0.0027,24.3621 +Small,8x8,ldr-rgb-04.png,29.0953,0.0164,0.0077,8.5036 +Small,8x8,ldr-rgb-05.png,25.5324,0.0223,0.0133,4.9365 +Small,8x8,ldr-rgb-06.png,23.0523,0.0223,0.0135,4.8692 +Small,8x8,ldr-rgb-07.png,29.3368,0.0166,0.0074,8.8983 +Small,8x8,ldr-rgb-08.png,33.7665,0.0124,0.0037,17.7788 +Small,8x8,ldr-rgb-09.png,28.4590,0.0160,0.0073,9.0230 +Small,8x8,ldr-rgb-10.png,31.8847,0.0088,0.0024,6.8560 +Small,8x8,ldr-rgba-00.png,24.9726,0.0210,0.0118,5.5638 +Small,8x8,ldr-rgba-01.png,28.1236,0.0179,0.0092,7.1375 +Small,8x8,ldr-rgba-02.png,23.8676,0.0232,0.0142,4.6120 +Small,8x8,ldr-xy-00.png,33.2085,0.0173,0.0051,12.7975 +Small,8x8,ldr-xy-01.png,33.9809,0.0175,0.0060,10.8433 +Small,8x8,ldr-xy-02.png,39.7786,0.0143,0.0026,25.2947 +Small,8x8,ldrs-rgba-00.png,24.9730,0.0213,0.0122,5.3635 +Small,8x8,ldrs-rgba-01.png,28.1260,0.0180,0.0089,7.3397 +Small,8x8,ldrs-rgba-02.png,23.8671,0.0230,0.0142,4.6302 +Small,12x12,hdr-rgb-00.hdr,20.4789,0.1228,0.0216,3.0361 +Small,12x12,ldr-rgb-00.png,23.6716,0.0212,0.0083,7.9017 +Small,12x12,ldr-rgb-01.png,24.7037,0.0187,0.0057,11.4138 +Small,12x12,ldr-rgb-02.png,19.1880,0.0277,0.0147,4.4494 +Small,12x12,ldr-rgb-03.png,33.1400,0.0152,0.0027,24.1206 +Small,12x12,ldr-rgb-04.png,24.3898,0.0192,0.0060,10.9282 +Small,12x12,ldr-rgb-05.png,21.3701,0.0254,0.0123,5.3118 +Small,12x12,ldr-rgb-06.png,19.1564,0.0286,0.0156,4.1878 +Small,12x12,ldr-rgb-07.png,25.2598,0.0191,0.0055,11.8359 +Small,12x12,ldr-rgb-08.png,29.9653,0.0161,0.0032,20.5824 +Small,12x12,ldr-rgb-09.png,23.5968,0.0213,0.0081,8.0560 +Small,12x12,ldr-rgb-10.png,27.2554,0.0128,0.0022,7.4844 +Small,12x12,ldr-rgba-00.png,21.1828,0.0267,0.0132,4.9634 +Small,12x12,ldr-rgba-01.png,24.4330,0.0207,0.0074,8.8453 +Small,12x12,ldr-rgba-02.png,20.1371,0.0322,0.0187,3.5059 +Small,12x12,ldr-xy-00.png,28.9405,0.0220,0.0050,12.9874 +Small,12x12,ldr-xy-01.png,29.6034,0.0214,0.0046,14.1639 +Small,12x12,ldr-xy-02.png,37.9716,0.0185,0.0019,33.7978 +Small,12x12,ldrs-rgba-00.png,21.1836,0.0270,0.0136,4.8288 +Small,12x12,ldrs-rgba-01.png,24.4339,0.0208,0.0078,8.4151 +Small,12x12,ldrs-rgba-02.png,20.1367,0.0319,0.0187,3.5140 +Small,3x3x3,ldr-l-00-3.dds,50.6012,0.0159,0.0104,25.1628 +Small,3x3x3,ldr-l-01-3.dds,53.7999,0.0075,0.0044,15.5367 +Small,6x6x6,ldr-l-00-3.dds,32.5074,0.0600,0.0394,6.6588 +Small,6x6x6,ldr-l-01-3.dds,40.7826,0.0340,0.0159,4.3448 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-avx2_medium_results.csv new file mode 100644 index 0000000..3f12338 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-avx2_medium_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1340,0.1179,0.0259,2.5263 +Small,4x4,ldr-rgb-00.png,38.7318,0.0335,0.0275,2.3851 +Small,4x4,ldr-rgb-01.png,40.1460,0.0304,0.0247,2.6583 +Small,4x4,ldr-rgb-02.png,35.2180,0.0315,0.0259,2.5346 +Small,4x4,ldr-rgb-03.png,47.1925,0.0191,0.0136,4.8178 +Small,4x4,ldr-rgb-04.png,42.1729,0.0260,0.0201,3.2553 +Small,4x4,ldr-rgb-05.png,37.7672,0.0335,0.0277,2.3659 +Small,4x4,ldr-rgb-06.png,35.3468,0.0283,0.0224,2.9263 +Small,4x4,ldr-rgb-07.png,39.2464,0.0394,0.0330,1.9855 +Small,4x4,ldr-rgb-08.png,45.1732,0.0222,0.0165,3.9796 +Small,4x4,ldr-rgb-09.png,42.0914,0.0266,0.0209,3.1357 +Small,4x4,ldr-rgb-10.png,44.8767,0.0069,0.0035,4.6285 +Small,4x4,ldr-rgba-00.png,36.2349,0.0358,0.0296,2.2162 +Small,4x4,ldr-rgba-01.png,38.8941,0.0227,0.0168,3.9005 +Small,4x4,ldr-rgba-02.png,34.9204,0.0253,0.0192,3.4075 +Small,4x4,ldr-xy-00.png,37.7446,0.0236,0.0160,4.0957 +Small,4x4,ldr-xy-01.png,45.1462,0.0320,0.0247,2.6517 +Small,4x4,ldr-xy-02.png,50.9226,0.0382,0.0304,2.1593 +Small,4x4,ldrs-rgba-00.png,36.2418,0.0360,0.0296,2.2111 +Small,4x4,ldrs-rgba-01.png,38.9101,0.0233,0.0171,3.8289 +Small,4x4,ldrs-rgba-02.png,34.9259,0.0253,0.0194,3.3734 +Small,5x5,hdr-rgb-00.hdr,29.8514,0.1270,0.0328,1.9974 +Small,5x5,ldr-rgb-00.png,35.0732,0.0376,0.0301,2.1773 +Small,5x5,ldr-rgb-01.png,36.3975,0.0319,0.0247,2.6561 +Small,5x5,ldr-rgb-02.png,31.0670,0.0335,0.0261,2.5122 +Small,5x5,ldr-rgb-03.png,43.9478,0.0158,0.0086,7.5843 +Small,5x5,ldr-rgb-04.png,37.6667,0.0295,0.0222,2.9518 +Small,5x5,ldr-rgb-05.png,33.5193,0.0422,0.0347,1.8890 +Small,5x5,ldr-rgb-06.png,31.0773,0.0319,0.0244,2.6833 +Small,5x5,ldr-rgb-07.png,36.2042,0.0457,0.0380,1.7256 +Small,5x5,ldr-rgb-08.png,41.5462,0.0226,0.0153,4.2751 +Small,5x5,ldr-rgb-09.png,37.5873,0.0279,0.0206,3.1845 +Small,5x5,ldr-rgb-10.png,40.4902,0.0091,0.0042,3.9104 +Small,5x5,ldr-rgba-00.png,32.7858,0.0446,0.0367,1.7846 +Small,5x5,ldr-rgba-01.png,35.2722,0.0266,0.0191,3.4348 +Small,5x5,ldr-rgba-02.png,31.1225,0.0310,0.0234,2.7967 +Small,5x5,ldr-xy-00.png,37.0726,0.0247,0.0154,4.2446 +Small,5x5,ldr-xy-01.png,40.7191,0.0317,0.0227,2.8854 +Small,5x5,ldr-xy-02.png,49.0675,0.0259,0.0165,3.9832 +Small,5x5,ldrs-rgba-00.png,32.7887,0.0452,0.0371,1.7671 +Small,5x5,ldrs-rgba-01.png,35.2789,0.0270,0.0193,3.3965 +Small,5x5,ldrs-rgba-02.png,31.1234,0.0314,0.0238,2.7535 +Small,6x6,hdr-rgb-00.hdr,27.4769,0.1311,0.0355,1.8453 +Small,6x6,ldr-rgb-00.png,32.3560,0.0400,0.0318,2.0620 +Small,6x6,ldr-rgb-01.png,33.0687,0.0323,0.0246,2.6617 +Small,6x6,ldr-rgb-02.png,27.4381,0.0357,0.0278,2.3546 +Small,6x6,ldr-rgb-03.png,41.6538,0.0146,0.0071,9.2864 +Small,6x6,ldr-rgb-04.png,34.2059,0.0297,0.0217,3.0194 +Small,6x6,ldr-rgb-05.png,30.1377,0.0454,0.0372,1.7634 +Small,6x6,ldr-rgb-06.png,27.5024,0.0353,0.0271,2.4211 +Small,6x6,ldr-rgb-07.png,33.8577,0.0428,0.0343,1.9094 +Small,6x6,ldr-rgb-08.png,39.0752,0.0192,0.0114,5.7732 +Small,6x6,ldr-rgb-09.png,33.6699,0.0292,0.0212,3.0933 +Small,6x6,ldr-rgb-10.png,36.9333,0.0100,0.0045,3.6140 +Small,6x6,ldr-rgba-00.png,30.2558,0.0494,0.0407,1.6101 +Small,6x6,ldr-rgba-01.png,32.1716,0.0280,0.0200,3.2740 +Small,6x6,ldr-rgba-02.png,27.8426,0.0348,0.0267,2.4503 +Small,6x6,ldr-xy-00.png,36.2518,0.0235,0.0135,4.8384 +Small,6x6,ldr-xy-01.png,37.7318,0.0266,0.0172,3.8171 +Small,6x6,ldr-xy-02.png,46.0639,0.0217,0.0120,5.4796 +Small,6x6,ldrs-rgba-00.png,30.2570,0.0494,0.0409,1.6011 +Small,6x6,ldrs-rgba-01.png,32.1777,0.0283,0.0200,3.2699 +Small,6x6,ldrs-rgba-02.png,27.8427,0.0352,0.0270,2.4258 +Small,8x8,hdr-rgb-00.hdr,24.1157,0.1462,0.0450,1.4577 +Small,8x8,ldr-rgb-00.png,28.7123,0.0537,0.0418,1.5690 +Small,8x8,ldr-rgb-01.png,28.9240,0.0418,0.0305,2.1456 +Small,8x8,ldr-rgb-02.png,23.1517,0.0478,0.0363,1.8048 +Small,8x8,ldr-rgb-03.png,38.4615,0.0192,0.0080,8.2105 +Small,8x8,ldr-rgb-04.png,29.6546,0.0396,0.0280,2.3430 +Small,8x8,ldr-rgb-05.png,25.9295,0.0546,0.0431,1.5200 +Small,8x8,ldr-rgb-06.png,23.1918,0.0481,0.0362,1.8097 +Small,8x8,ldr-rgb-07.png,30.5823,0.0483,0.0363,1.8039 +Small,8x8,ldr-rgb-08.png,35.7743,0.0241,0.0126,5.2045 +Small,8x8,ldr-rgb-09.png,29.0115,0.0380,0.0266,2.4653 +Small,8x8,ldr-rgb-10.png,32.1619,0.0156,0.0064,2.5536 +Small,8x8,ldr-rgba-00.png,26.3940,0.0609,0.0486,1.3477 +Small,8x8,ldr-rgba-01.png,28.3383,0.0372,0.0255,2.5706 +Small,8x8,ldr-rgba-02.png,23.9368,0.0501,0.0385,1.7004 +Small,8x8,ldr-xy-00.png,34.0144,0.0347,0.0197,3.3198 +Small,8x8,ldr-xy-01.png,34.9127,0.0339,0.0195,3.3555 +Small,8x8,ldr-xy-02.png,41.7218,0.0262,0.0114,5.7357 +Small,8x8,ldrs-rgba-00.png,26.3943,0.0615,0.0492,1.3308 +Small,8x8,ldrs-rgba-01.png,28.3412,0.0373,0.0257,2.5515 +Small,8x8,ldrs-rgba-02.png,23.9363,0.0506,0.0386,1.6961 +Small,12x12,hdr-rgb-00.hdr,20.7645,0.1705,0.0619,1.0591 +Small,12x12,ldr-rgb-00.png,24.6670,0.0681,0.0475,1.3805 +Small,12x12,ldr-rgb-01.png,25.0227,0.0575,0.0379,1.7303 +Small,12x12,ldr-rgb-02.png,19.2621,0.0762,0.0563,1.1649 +Small,12x12,ldr-rgb-03.png,34.9308,0.0283,0.0085,7.6958 +Small,12x12,ldr-rgb-04.png,24.9126,0.0545,0.0349,1.8754 +Small,12x12,ldr-rgb-05.png,21.6505,0.0778,0.0576,1.1377 +Small,12x12,ldr-rgb-06.png,19.2451,0.0730,0.0530,1.2364 +Small,12x12,ldr-rgb-07.png,26.5693,0.0579,0.0374,1.7516 +Small,12x12,ldr-rgb-08.png,31.4927,0.0341,0.0138,4.7517 +Small,12x12,ldr-rgb-09.png,24.1078,0.0549,0.0354,1.8521 +Small,12x12,ldr-rgb-10.png,27.9831,0.0302,0.0126,1.2924 +Small,12x12,ldr-rgba-00.png,22.0878,0.0754,0.0552,1.1874 +Small,12x12,ldr-rgba-01.png,24.6267,0.0555,0.0351,1.8648 +Small,12x12,ldr-rgba-02.png,20.1804,0.0822,0.0619,1.0594 +Small,12x12,ldr-xy-00.png,30.0722,0.0469,0.0230,2.8522 +Small,12x12,ldr-xy-01.png,31.8391,0.0458,0.0222,2.9566 +Small,12x12,ldr-xy-02.png,38.5216,0.0293,0.0050,13.2077 +Small,12x12,ldrs-rgba-00.png,22.0882,0.0752,0.0546,1.2002 +Small,12x12,ldrs-rgba-01.png,24.6285,0.0556,0.0357,1.8362 +Small,12x12,ldrs-rgba-02.png,20.1803,0.0821,0.0618,1.0609 +Small,3x3x3,ldr-l-00-3.dds,51.9681,0.0240,0.0169,15.5243 +Small,3x3x3,ldr-l-01-3.dds,54.3395,0.0100,0.0052,13.3129 +Small,6x6x6,ldr-l-00-3.dds,32.9129,0.0739,0.0508,5.1617 +Small,6x6x6,ldr-l-01-3.dds,40.8871,0.0369,0.0163,4.2405 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-avx2_thorough_results.csv new file mode 100644 index 0000000..2402002 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-avx2_thorough_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.3787,0.1460,0.0538,1.2176 +Small,4x4,ldr-rgb-00.png,39.1025,0.0650,0.0588,1.1145 +Small,4x4,ldr-rgb-01.png,40.3344,0.0634,0.0574,1.1420 +Small,4x4,ldr-rgb-02.png,35.3612,0.0595,0.0538,1.2188 +Small,4x4,ldr-rgb-03.png,47.6672,0.0590,0.0535,1.2256 +Small,4x4,ldr-rgb-04.png,42.3135,0.0584,0.0524,1.2507 +Small,4x4,ldr-rgb-05.png,37.9467,0.0673,0.0613,1.0692 +Small,4x4,ldr-rgb-06.png,35.4785,0.0559,0.0498,1.3165 +Small,4x4,ldr-rgb-07.png,39.8676,0.0735,0.0670,0.9779 +Small,4x4,ldr-rgb-08.png,45.7996,0.0564,0.0505,1.2987 +Small,4x4,ldr-rgb-09.png,42.2360,0.0622,0.0561,1.1684 +Small,4x4,ldr-rgb-10.png,44.9865,0.0107,0.0071,2.2809 +Small,4x4,ldr-rgba-00.png,36.7341,0.0670,0.0605,1.0830 +Small,4x4,ldr-rgba-01.png,39.0299,0.0547,0.0487,1.3449 +Small,4x4,ldr-rgba-02.png,34.9857,0.0543,0.0482,1.3603 +Small,4x4,ldr-xy-00.png,37.7552,0.0638,0.0561,1.1691 +Small,4x4,ldr-xy-01.png,45.2171,0.0713,0.0639,1.0249 +Small,4x4,ldr-xy-02.png,50.9992,0.0857,0.0778,0.8426 +Small,4x4,ldrs-rgba-00.png,36.7416,0.0675,0.0611,1.0729 +Small,4x4,ldrs-rgba-01.png,39.0514,0.0556,0.0494,1.3262 +Small,4x4,ldrs-rgba-02.png,34.9915,0.0544,0.0483,1.3559 +Small,5x5,hdr-rgb-00.hdr,30.2499,0.1593,0.0640,1.0237 +Small,5x5,ldr-rgb-00.png,35.3184,0.0780,0.0703,0.9318 +Small,5x5,ldr-rgb-01.png,36.4942,0.0745,0.0670,0.9778 +Small,5x5,ldr-rgb-02.png,31.1169,0.0710,0.0635,1.0328 +Small,5x5,ldr-rgb-03.png,44.4730,0.0685,0.0615,1.0657 +Small,5x5,ldr-rgb-04.png,37.8145,0.0707,0.0631,1.0384 +Small,5x5,ldr-rgb-05.png,33.6567,0.0798,0.0724,0.9055 +Small,5x5,ldr-rgb-06.png,31.1197,0.0677,0.0601,1.0904 +Small,5x5,ldr-rgb-07.png,36.7056,0.0885,0.0806,0.8127 +Small,5x5,ldr-rgb-08.png,42.2684,0.0653,0.0579,1.1310 +Small,5x5,ldr-rgb-09.png,37.6844,0.0730,0.0656,0.9996 +Small,5x5,ldr-rgb-10.png,40.6793,0.0145,0.0094,1.7368 +Small,5x5,ldr-rgba-00.png,33.1233,0.0816,0.0738,0.8886 +Small,5x5,ldr-rgba-01.png,35.3456,0.0673,0.0598,1.0963 +Small,5x5,ldr-rgba-02.png,31.1599,0.0670,0.0594,1.1034 +Small,5x5,ldr-xy-00.png,37.2902,0.0689,0.0596,1.0987 +Small,5x5,ldr-xy-01.png,41.5197,0.0845,0.0755,0.8684 +Small,5x5,ldr-xy-02.png,49.2647,0.0952,0.0856,0.7654 +Small,5x5,ldrs-rgba-00.png,33.1269,0.0828,0.0748,0.8760 +Small,5x5,ldrs-rgba-01.png,35.3541,0.0677,0.0601,1.0903 +Small,5x5,ldrs-rgba-02.png,31.1602,0.0676,0.0599,1.0946 +Small,6x6,hdr-rgb-00.hdr,27.6571,0.1700,0.0747,0.8769 +Small,6x6,ldr-rgb-00.png,32.6208,0.0899,0.0817,0.8018 +Small,6x6,ldr-rgb-01.png,33.1469,0.0829,0.0750,0.8733 +Small,6x6,ldr-rgb-02.png,27.4754,0.0811,0.0730,0.8975 +Small,6x6,ldr-rgb-03.png,42.5226,0.0574,0.0498,1.3170 +Small,6x6,ldr-rgb-04.png,34.3223,0.0801,0.0719,0.9111 +Small,6x6,ldr-rgb-05.png,30.2576,0.0907,0.0827,0.7924 +Small,6x6,ldr-rgb-06.png,27.5394,0.0784,0.0703,0.9323 +Small,6x6,ldr-rgb-07.png,34.3854,0.0954,0.0871,0.7528 +Small,6x6,ldr-rgb-08.png,39.8830,0.0569,0.0487,1.3461 +Small,6x6,ldr-rgb-09.png,33.7955,0.0776,0.0695,0.9436 +Small,6x6,ldr-rgb-10.png,37.1039,0.0177,0.0120,1.3545 +Small,6x6,ldr-rgba-00.png,30.5063,0.0954,0.0868,0.7550 +Small,6x6,ldr-rgba-01.png,32.2316,0.0789,0.0707,0.9263 +Small,6x6,ldr-rgba-02.png,27.8753,0.0815,0.0732,0.8949 +Small,6x6,ldr-xy-00.png,36.3838,0.0582,0.0481,1.3612 +Small,6x6,ldr-xy-01.png,38.0617,0.0824,0.0727,0.9011 +Small,6x6,ldr-xy-02.png,47.4738,0.1021,0.0920,0.7124 +Small,6x6,ldrs-rgba-00.png,30.5081,0.0951,0.0863,0.7590 +Small,6x6,ldrs-rgba-01.png,32.2377,0.0794,0.0712,0.9202 +Small,6x6,ldrs-rgba-02.png,27.8745,0.0817,0.0735,0.8920 +Small,8x8,hdr-rgb-00.hdr,24.3160,0.1959,0.0966,0.6786 +Small,8x8,ldr-rgb-00.png,28.9377,0.1142,0.1010,0.6492 +Small,8x8,ldr-rgb-01.png,28.9883,0.1019,0.0886,0.7399 +Small,8x8,ldr-rgb-02.png,23.1866,0.1062,0.0931,0.7043 +Small,8x8,ldr-rgb-03.png,39.3501,0.0393,0.0264,2.4834 +Small,8x8,ldr-rgb-04.png,29.7749,0.0947,0.0814,0.8054 +Small,8x8,ldr-rgb-05.png,26.0242,0.1114,0.0982,0.6674 +Small,8x8,ldr-rgb-06.png,23.2335,0.1062,0.0927,0.7073 +Small,8x8,ldr-rgb-07.png,31.1039,0.1068,0.0934,0.7018 +Small,8x8,ldr-rgb-08.png,36.4625,0.0551,0.0419,1.5655 +Small,8x8,ldr-rgb-09.png,29.1520,0.0819,0.0688,0.9526 +Small,8x8,ldr-rgb-10.png,32.3031,0.0266,0.0159,1.0210 +Small,8x8,ldr-rgba-00.png,26.6704,0.1200,0.1064,0.6159 +Small,8x8,ldr-rgba-01.png,28.3932,0.0943,0.0810,0.8086 +Small,8x8,ldr-rgba-02.png,23.9599,0.1129,0.0994,0.6596 +Small,8x8,ldr-xy-00.png,34.3120,0.0692,0.0539,1.2150 +Small,8x8,ldr-xy-01.png,35.2097,0.0717,0.0569,1.1515 +Small,8x8,ldr-xy-02.png,44.5878,0.0904,0.0751,0.8724 +Small,8x8,ldrs-rgba-00.png,26.6715,0.1208,0.1072,0.6111 +Small,8x8,ldrs-rgba-01.png,28.3959,0.0950,0.0817,0.8025 +Small,8x8,ldrs-rgba-02.png,23.9597,0.1132,0.0998,0.6566 +Small,12x12,hdr-rgb-00.hdr,21.0019,0.2375,0.1271,0.5158 +Small,12x12,ldr-rgb-00.png,25.0133,0.1454,0.1221,0.5367 +Small,12x12,ldr-rgb-01.png,25.1167,0.1226,0.0997,0.6572 +Small,12x12,ldr-rgb-02.png,19.2912,0.1467,0.1238,0.5295 +Small,12x12,ldr-rgb-03.png,36.1206,0.0493,0.0268,2.4446 +Small,12x12,ldr-rgb-04.png,25.0074,0.1225,0.0993,0.6599 +Small,12x12,ldr-rgb-05.png,21.7140,0.1455,0.1226,0.5345 +Small,12x12,ldr-rgb-06.png,19.2810,0.1436,0.1204,0.5445 +Small,12x12,ldr-rgb-07.png,27.0419,0.1313,0.1080,0.6068 +Small,12x12,ldr-rgb-08.png,32.3840,0.0654,0.0425,1.5438 +Small,12x12,ldr-rgb-09.png,24.3053,0.1157,0.0927,0.7071 +Small,12x12,ldr-rgb-10.png,28.1356,0.0468,0.0265,0.6144 +Small,12x12,ldr-rgba-00.png,22.7010,0.1541,0.1308,0.5012 +Small,12x12,ldr-rgba-01.png,24.7078,0.1159,0.0924,0.7092 +Small,12x12,ldr-rgba-02.png,20.1958,0.1509,0.1276,0.5134 +Small,12x12,ldr-xy-00.png,30.5742,0.0937,0.0687,0.9536 +Small,12x12,ldr-xy-01.png,32.1255,0.0721,0.0475,1.3803 +Small,12x12,ldr-xy-02.png,40.3053,0.0548,0.0300,2.1856 +Small,12x12,ldrs-rgba-00.png,22.7006,0.1559,0.1325,0.4948 +Small,12x12,ldrs-rgba-01.png,24.7093,0.1166,0.0933,0.7025 +Small,12x12,ldrs-rgba-02.png,20.1960,0.1511,0.1278,0.5129 +Small,3x3x3,ldr-l-00-3.dds,52.4159,0.0459,0.0385,6.8145 +Small,3x3x3,ldr-l-01-3.dds,55.3973,0.0203,0.0154,4.4842 +Small,6x6x6,ldr-l-00-3.dds,33.2725,0.1075,0.0821,3.1948 +Small,6x6x6,ldr-l-01-3.dds,41.5751,0.0410,0.0177,3.8888 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse2_fast_results.csv new file mode 100644 index 0000000..14b3480 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse2_fast_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.6884,0.1115,0.0192,3.4199 +Small,4x4,ldr-rgb-00.png,38.1103,0.0173,0.0121,5.4103 +Small,4x4,ldr-rgb-01.png,39.8105,0.0153,0.0104,6.2726 +Small,4x4,ldr-rgb-02.png,35.0374,0.0215,0.0166,3.9439 +Small,4x4,ldr-rgb-03.png,45.9704,0.0088,0.0042,15.6706 +Small,4x4,ldr-rgb-04.png,41.9106,0.0127,0.0076,8.5803 +Small,4x4,ldr-rgb-05.png,37.2317,0.0207,0.0156,4.1951 +Small,4x4,ldr-rgb-06.png,35.2059,0.0205,0.0152,4.3082 +Small,4x4,ldr-rgb-07.png,38.0309,0.0217,0.0161,4.0587 +Small,4x4,ldr-rgb-08.png,43.6358,0.0109,0.0060,10.8446 +Small,4x4,ldr-rgb-09.png,41.8533,0.0126,0.0076,8.5792 +Small,4x4,ldr-rgb-10.png,44.3464,0.0046,0.0019,8.3752 +Small,4x4,ldr-rgba-00.png,35.5182,0.0208,0.0154,4.2625 +Small,4x4,ldr-rgba-01.png,38.7956,0.0147,0.0095,6.8833 +Small,4x4,ldr-rgba-02.png,34.8333,0.0190,0.0138,4.7645 +Small,4x4,ldr-xy-00.png,37.5697,0.0150,0.0073,8.9715 +Small,4x4,ldr-xy-01.png,44.1378,0.0162,0.0089,7.3960 +Small,4x4,ldr-xy-02.png,48.1786,0.0131,0.0052,12.6666 +Small,4x4,ldrs-rgba-00.png,35.5254,0.0210,0.0155,4.2254 +Small,4x4,ldrs-rgba-01.png,38.8141,0.0149,0.0097,6.7445 +Small,4x4,ldrs-rgba-02.png,34.8386,0.0189,0.0137,4.7704 +Small,5x5,hdr-rgb-00.hdr,29.4686,0.1171,0.0234,2.7990 +Small,5x5,ldr-rgb-00.png,34.3042,0.0189,0.0127,5.1522 +Small,5x5,ldr-rgb-01.png,36.1808,0.0154,0.0096,6.8567 +Small,5x5,ldr-rgb-02.png,31.0160,0.0215,0.0156,4.2010 +Small,5x5,ldr-rgb-03.png,42.6231,0.0093,0.0036,18.2510 +Small,5x5,ldr-rgb-04.png,37.2434,0.0141,0.0080,8.1605 +Small,5x5,ldr-rgb-05.png,33.1823,0.0239,0.0178,3.6842 +Small,5x5,ldr-rgb-06.png,31.0247,0.0211,0.0148,4.4200 +Small,5x5,ldr-rgb-07.png,35.1883,0.0209,0.0144,4.5609 +Small,5x5,ldr-rgb-08.png,40.0310,0.0116,0.0055,11.8748 +Small,5x5,ldr-rgb-09.png,37.2810,0.0139,0.0081,8.0709 +Small,5x5,ldr-rgb-10.png,40.1234,0.0055,0.0020,8.3231 +Small,5x5,ldr-rgba-00.png,32.0072,0.0238,0.0174,3.7613 +Small,5x5,ldr-rgba-01.png,35.1428,0.0163,0.0101,6.4810 +Small,5x5,ldr-rgba-02.png,31.1062,0.0217,0.0154,4.2672 +Small,5x5,ldr-xy-00.png,36.7258,0.0155,0.0061,10.7207 +Small,5x5,ldr-xy-01.png,39.8638,0.0163,0.0074,8.8456 +Small,5x5,ldr-xy-02.png,43.9171,0.0144,0.0056,11.7469 +Small,5x5,ldrs-rgba-00.png,32.0096,0.0240,0.0175,3.7496 +Small,5x5,ldrs-rgba-01.png,35.1497,0.0164,0.0102,6.4064 +Small,5x5,ldrs-rgba-02.png,31.1070,0.0217,0.0155,4.2385 +Small,6x6,hdr-rgb-00.hdr,26.9904,0.1216,0.0273,2.3970 +Small,6x6,ldr-rgb-00.png,31.5938,0.0235,0.0167,3.9293 +Small,6x6,ldr-rgb-01.png,32.8896,0.0190,0.0125,5.2311 +Small,6x6,ldr-rgb-02.png,27.4079,0.0263,0.0196,3.3364 +Small,6x6,ldr-rgb-03.png,40.4899,0.0105,0.0041,16.0588 +Small,6x6,ldr-rgb-04.png,33.9065,0.0166,0.0100,6.5413 +Small,6x6,ldr-rgb-05.png,29.9329,0.0298,0.0230,2.8438 +Small,6x6,ldr-rgb-06.png,27.4651,0.0262,0.0195,3.3579 +Small,6x6,ldr-rgb-07.png,32.8824,0.0224,0.0155,4.2393 +Small,6x6,ldr-rgb-08.png,37.6380,0.0123,0.0060,10.9574 +Small,6x6,ldr-rgb-09.png,33.4716,0.0169,0.0105,6.2707 +Small,6x6,ldr-rgb-10.png,36.6590,0.0067,0.0026,6.2114 +Small,6x6,ldr-rgba-00.png,29.4788,0.0293,0.0222,2.9547 +Small,6x6,ldr-rgba-01.png,32.0575,0.0195,0.0128,5.1171 +Small,6x6,ldr-rgba-02.png,27.8275,0.0267,0.0199,3.2868 +Small,6x6,ldr-xy-00.png,35.6827,0.0165,0.0068,9.6195 +Small,6x6,ldr-xy-01.png,37.1053,0.0189,0.0099,6.6005 +Small,6x6,ldr-xy-02.png,41.9446,0.0146,0.0053,12.3864 +Small,6x6,ldrs-rgba-00.png,29.4790,0.0297,0.0223,2.9354 +Small,6x6,ldrs-rgba-01.png,32.0640,0.0196,0.0127,5.1575 +Small,6x6,ldrs-rgba-02.png,27.8273,0.0269,0.0201,3.2610 +Small,8x8,hdr-rgb-00.hdr,23.7216,0.1376,0.0383,1.7105 +Small,8x8,ldr-rgb-00.png,27.9814,0.0327,0.0219,2.9978 +Small,8x8,ldr-rgb-01.png,28.7458,0.0279,0.0177,3.7035 +Small,8x8,ldr-rgb-02.png,23.0937,0.0395,0.0287,2.2857 +Small,8x8,ldr-rgb-03.png,37.2544,0.0148,0.0045,14.5731 +Small,8x8,ldr-rgb-04.png,29.3419,0.0261,0.0156,4.2086 +Small,8x8,ldr-rgb-05.png,25.7747,0.0431,0.0325,2.0139 +Small,8x8,ldr-rgb-06.png,23.1468,0.0395,0.0288,2.2749 +Small,8x8,ldr-rgb-07.png,29.6508,0.0261,0.0152,4.3195 +Small,8x8,ldr-rgb-08.png,34.2150,0.0179,0.0075,8.7302 +Small,8x8,ldr-rgb-09.png,28.6635,0.0278,0.0174,3.7649 +Small,8x8,ldr-rgb-10.png,31.9974,0.0115,0.0034,4.8152 +Small,8x8,ldr-rgba-00.png,25.3599,0.0403,0.0292,2.2446 +Small,8x8,ldr-rgba-01.png,28.2399,0.0298,0.0189,3.4703 +Small,8x8,ldr-rgba-02.png,23.9241,0.0403,0.0294,2.2322 +Small,8x8,ldr-xy-00.png,33.3965,0.0239,0.0101,6.4670 +Small,8x8,ldr-xy-01.png,34.2472,0.0254,0.0120,5.4659 +Small,8x8,ldr-xy-02.png,39.9005,0.0176,0.0039,16.8823 +Small,8x8,ldrs-rgba-00.png,25.3610,0.0406,0.0294,2.2276 +Small,8x8,ldrs-rgba-01.png,28.2419,0.0296,0.0190,3.4522 +Small,8x8,ldrs-rgba-02.png,23.9237,0.0405,0.0297,2.2089 +Small,12x12,hdr-rgb-00.hdr,20.5637,0.1572,0.0515,1.2736 +Small,12x12,ldr-rgb-00.png,23.7825,0.0345,0.0170,3.8539 +Small,12x12,ldr-rgb-01.png,24.7588,0.0286,0.0116,5.6706 +Small,12x12,ldr-rgb-02.png,19.2226,0.0491,0.0315,2.0796 +Small,12x12,ldr-rgb-03.png,33.2364,0.0203,0.0032,20.4995 +Small,12x12,ldr-rgb-04.png,24.5606,0.0291,0.0116,5.6331 +Small,12x12,ldr-rgb-05.png,21.4885,0.0439,0.0268,2.4479 +Small,12x12,ldr-rgb-06.png,19.2097,0.0511,0.0334,1.9615 +Small,12x12,ldr-rgb-07.png,25.3456,0.0275,0.0100,6.5510 +Small,12x12,ldr-rgb-08.png,30.1535,0.0224,0.0049,13.4382 +Small,12x12,ldr-rgb-09.png,23.7136,0.0344,0.0171,3.8218 +Small,12x12,ldr-rgb-10.png,27.3052,0.0187,0.0041,3.9581 +Small,12x12,ldr-rgba-00.png,21.3632,0.0478,0.0296,2.2128 +Small,12x12,ldr-rgba-01.png,24.4867,0.0312,0.0140,4.6822 +Small,12x12,ldr-rgba-02.png,20.1666,0.0568,0.0392,1.6700 +Small,12x12,ldr-xy-00.png,29.0651,0.0302,0.0088,7.4195 +Small,12x12,ldr-xy-01.png,30.4241,0.0293,0.0081,8.1349 +Small,12x12,ldr-xy-02.png,37.9951,0.0235,0.0023,28.2100 +Small,12x12,ldrs-rgba-00.png,21.3658,0.0476,0.0300,2.1875 +Small,12x12,ldrs-rgba-01.png,24.4885,0.0316,0.0145,4.5250 +Small,12x12,ldrs-rgba-02.png,20.1665,0.0568,0.0393,1.6667 +Small,3x3x3,ldr-l-00-3.dds,50.7551,0.0237,0.0170,15.4639 +Small,3x3x3,ldr-l-01-3.dds,53.8676,0.0112,0.0072,9.5657 +Small,6x6x6,ldr-l-00-3.dds,32.5264,0.0908,0.0675,3.8859 +Small,6x6x6,ldr-l-01-3.dds,40.7893,0.0464,0.0260,2.6471 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse2_fastest_results.csv new file mode 100644 index 0000000..ee5a446 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse2_fastest_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.2999,0.1039,0.0122,5.3631 +Small,4x4,ldr-rgb-00.png,37.0084,0.0118,0.0073,9.0109 +Small,4x4,ldr-rgb-01.png,39.4162,0.0112,0.0069,9.4626 +Small,4x4,ldr-rgb-02.png,34.6448,0.0145,0.0103,6.3925 +Small,4x4,ldr-rgb-03.png,45.3559,0.0074,0.0033,20.1597 +Small,4x4,ldr-rgb-04.png,41.6390,0.0098,0.0053,12.4763 +Small,4x4,ldr-rgb-05.png,36.7213,0.0144,0.0100,6.5282 +Small,4x4,ldr-rgb-06.png,34.6994,0.0144,0.0098,6.6833 +Small,4x4,ldr-rgb-07.png,37.1808,0.0143,0.0095,6.9307 +Small,4x4,ldr-rgb-08.png,42.6915,0.0087,0.0044,14.8880 +Small,4x4,ldr-rgb-09.png,41.6433,0.0099,0.0054,12.1252 +Small,4x4,ldr-rgb-10.png,43.8818,0.0038,0.0018,8.9361 +Small,4x4,ldr-rgba-00.png,34.5700,0.0135,0.0088,7.4754 +Small,4x4,ldr-rgba-01.png,38.5857,0.0119,0.0072,9.1086 +Small,4x4,ldr-rgba-02.png,34.5224,0.0149,0.0102,6.4466 +Small,4x4,ldr-xy-00.png,37.5264,0.0122,0.0053,12.3419 +Small,4x4,ldr-xy-01.png,43.8563,0.0128,0.0061,10.7399 +Small,4x4,ldr-xy-02.png,48.1786,0.0116,0.0045,14.5377 +Small,4x4,ldrs-rgba-00.png,34.5750,0.0137,0.0087,7.5278 +Small,4x4,ldrs-rgba-01.png,38.6025,0.0120,0.0073,8.9493 +Small,4x4,ldrs-rgba-02.png,34.5263,0.0148,0.0102,6.3974 +Small,5x5,hdr-rgb-00.hdr,28.8076,0.1070,0.0146,4.4838 +Small,5x5,ldr-rgb-00.png,33.4478,0.0129,0.0076,8.6198 +Small,5x5,ldr-rgb-01.png,35.9999,0.0119,0.0069,9.5074 +Small,5x5,ldr-rgb-02.png,30.8748,0.0160,0.0110,5.9740 +Small,5x5,ldr-rgb-03.png,42.2547,0.0078,0.0031,20.8241 +Small,5x5,ldr-rgb-04.png,36.9224,0.0116,0.0064,10.2708 +Small,5x5,ldr-rgb-05.png,32.6193,0.0167,0.0116,5.6717 +Small,5x5,ldr-rgb-06.png,30.8711,0.0161,0.0108,6.0598 +Small,5x5,ldr-rgb-07.png,34.2652,0.0152,0.0098,6.7099 +Small,5x5,ldr-rgb-08.png,39.3139,0.0091,0.0040,16.2342 +Small,5x5,ldr-rgb-09.png,36.9835,0.0112,0.0061,10.7880 +Small,5x5,ldr-rgb-10.png,39.7373,0.0043,0.0016,9.8873 +Small,5x5,ldr-rgba-00.png,30.7473,0.0153,0.0097,6.7724 +Small,5x5,ldr-rgba-01.png,34.9846,0.0132,0.0081,8.0740 +Small,5x5,ldr-rgba-02.png,31.0020,0.0171,0.0119,5.5113 +Small,5x5,ldr-xy-00.png,36.5568,0.0132,0.0049,13.3042 +Small,5x5,ldr-xy-01.png,38.8334,0.0133,0.0054,12.0518 +Small,5x5,ldr-xy-02.png,43.7233,0.0123,0.0044,14.7967 +Small,5x5,ldrs-rgba-00.png,30.7497,0.0154,0.0099,6.6527 +Small,5x5,ldrs-rgba-01.png,34.9913,0.0136,0.0082,7.9728 +Small,5x5,ldrs-rgba-02.png,31.0030,0.0173,0.0120,5.4396 +Small,6x6,hdr-rgb-00.hdr,26.7122,0.1078,0.0151,4.3434 +Small,6x6,ldr-rgb-00.png,31.1052,0.0142,0.0087,7.5720 +Small,6x6,ldr-rgb-01.png,32.7949,0.0132,0.0078,8.4443 +Small,6x6,ldr-rgb-02.png,27.3228,0.0178,0.0126,5.2050 +Small,6x6,ldr-rgb-03.png,40.2037,0.0080,0.0029,22.7869 +Small,6x6,ldr-rgb-04.png,33.7349,0.0123,0.0070,9.4136 +Small,6x6,ldr-rgb-05.png,29.5304,0.0183,0.0129,5.0634 +Small,6x6,ldr-rgb-06.png,27.3791,0.0178,0.0122,5.3604 +Small,6x6,ldr-rgb-07.png,32.0586,0.0151,0.0095,6.8949 +Small,6x6,ldr-rgb-08.png,37.0422,0.0091,0.0038,17.1199 +Small,6x6,ldr-rgb-09.png,33.2804,0.0122,0.0067,9.7278 +Small,6x6,ldr-rgb-10.png,36.4903,0.0049,0.0019,8.5743 +Small,6x6,ldr-rgba-00.png,28.4787,0.0167,0.0109,6.0185 +Small,6x6,ldr-rgba-01.png,31.9580,0.0147,0.0091,7.1899 +Small,6x6,ldr-rgba-02.png,27.7571,0.0187,0.0129,5.0775 +Small,6x6,ldr-xy-00.png,35.5281,0.0135,0.0051,12.8881 +Small,6x6,ldr-xy-01.png,36.2504,0.0142,0.0062,10.5076 +Small,6x6,ldr-xy-02.png,41.7327,0.0122,0.0040,16.5579 +Small,6x6,ldrs-rgba-00.png,28.4800,0.0168,0.0110,5.9747 +Small,6x6,ldrs-rgba-01.png,31.9643,0.0147,0.0092,7.1151 +Small,6x6,ldrs-rgba-02.png,27.7547,0.0186,0.0128,5.1160 +Small,8x8,hdr-rgb-00.hdr,23.5547,0.1194,0.0234,2.8026 +Small,8x8,ldr-rgb-00.png,27.6188,0.0219,0.0129,5.0650 +Small,8x8,ldr-rgb-01.png,28.6671,0.0202,0.0117,5.5932 +Small,8x8,ldr-rgb-02.png,23.0179,0.0277,0.0190,3.4580 +Small,8x8,ldr-rgb-03.png,37.0089,0.0120,0.0035,18.5228 +Small,8x8,ldr-rgb-04.png,29.0953,0.0196,0.0108,6.0767 +Small,8x8,ldr-rgb-05.png,25.5324,0.0280,0.0189,3.4629 +Small,8x8,ldr-rgb-06.png,23.0523,0.0284,0.0191,3.4260 +Small,8x8,ldr-rgb-07.png,29.3368,0.0198,0.0105,6.2410 +Small,8x8,ldr-rgb-08.png,33.7665,0.0139,0.0049,13.4850 +Small,8x8,ldr-rgb-09.png,28.4590,0.0193,0.0105,6.2617 +Small,8x8,ldr-rgb-10.png,31.8847,0.0090,0.0027,6.0655 +Small,8x8,ldr-rgba-00.png,24.9726,0.0263,0.0169,3.8667 +Small,8x8,ldr-rgba-01.png,28.1236,0.0218,0.0125,5.2341 +Small,8x8,ldr-rgba-02.png,23.8676,0.0289,0.0197,3.3199 +Small,8x8,ldr-xy-00.png,33.2085,0.0195,0.0073,9.0245 +Small,8x8,ldr-xy-01.png,33.9809,0.0198,0.0081,8.1207 +Small,8x8,ldr-xy-02.png,39.7786,0.0150,0.0032,20.2697 +Small,8x8,ldrs-rgba-00.png,24.9730,0.0260,0.0167,3.9354 +Small,8x8,ldrs-rgba-01.png,28.1260,0.0218,0.0127,5.1542 +Small,8x8,ldrs-rgba-02.png,23.8671,0.0290,0.0199,3.2905 +Small,12x12,hdr-rgb-00.hdr,20.4789,0.1335,0.0315,2.0777 +Small,12x12,ldr-rgb-00.png,23.6716,0.0248,0.0117,5.6119 +Small,12x12,ldr-rgb-01.png,24.7037,0.0212,0.0084,7.7915 +Small,12x12,ldr-rgb-02.png,19.1880,0.0342,0.0212,3.0928 +Small,12x12,ldr-rgb-03.png,33.1400,0.0157,0.0031,20.8446 +Small,12x12,ldr-rgb-04.png,24.3898,0.0216,0.0087,7.5414 +Small,12x12,ldr-rgb-05.png,21.3701,0.0309,0.0176,3.7255 +Small,12x12,ldr-rgb-06.png,19.1564,0.0362,0.0226,2.9042 +Small,12x12,ldr-rgb-07.png,25.2598,0.0213,0.0077,8.4737 +Small,12x12,ldr-rgb-08.png,29.9653,0.0170,0.0042,15.5439 +Small,12x12,ldr-rgb-09.png,23.5968,0.0247,0.0116,5.6496 +Small,12x12,ldr-rgb-10.png,27.2554,0.0138,0.0032,5.0754 +Small,12x12,ldr-rgba-00.png,21.1828,0.0323,0.0186,3.5231 +Small,12x12,ldr-rgba-01.png,24.4330,0.0239,0.0104,6.2816 +Small,12x12,ldr-rgba-02.png,20.1371,0.0406,0.0271,2.4215 +Small,12x12,ldr-xy-00.png,28.9405,0.0241,0.0071,9.2071 +Small,12x12,ldr-xy-01.png,29.6034,0.0227,0.0063,10.3435 +Small,12x12,ldr-xy-02.png,37.9716,0.0188,0.0022,29.5727 +Small,12x12,ldrs-rgba-00.png,21.1836,0.0325,0.0189,3.4613 +Small,12x12,ldrs-rgba-01.png,24.4339,0.0241,0.0107,6.1163 +Small,12x12,ldrs-rgba-02.png,20.1367,0.0405,0.0271,2.4223 +Small,3x3x3,ldr-l-00-3.dds,50.6012,0.0210,0.0150,17.4379 +Small,3x3x3,ldr-l-01-3.dds,53.7999,0.0097,0.0065,10.6278 +Small,6x6x6,ldr-l-00-3.dds,32.5074,0.0872,0.0658,3.9842 +Small,6x6x6,ldr-l-01-3.dds,40.7826,0.0439,0.0255,2.7029 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse2_medium_results.csv new file mode 100644 index 0000000..9b2f333 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse2_medium_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1340,0.1279,0.0350,1.8729 +Small,4x4,ldr-rgb-00.png,38.7318,0.0421,0.0361,1.8164 +Small,4x4,ldr-rgb-01.png,40.1460,0.0391,0.0334,1.9646 +Small,4x4,ldr-rgb-02.png,35.2180,0.0407,0.0349,1.8779 +Small,4x4,ldr-rgb-03.png,47.1925,0.0241,0.0186,3.5295 +Small,4x4,ldr-rgb-04.png,42.1729,0.0334,0.0274,2.3937 +Small,4x4,ldr-rgb-05.png,37.7672,0.0435,0.0376,1.7432 +Small,4x4,ldr-rgb-06.png,35.3468,0.0366,0.0305,2.1457 +Small,4x4,ldr-rgb-07.png,39.2464,0.0506,0.0442,1.4819 +Small,4x4,ldr-rgb-08.png,45.1732,0.0282,0.0224,2.9244 +Small,4x4,ldr-rgb-09.png,42.0914,0.0342,0.0282,2.3269 +Small,4x4,ldr-rgb-10.png,44.8767,0.0079,0.0044,3.7022 +Small,4x4,ldr-rgba-00.png,36.2349,0.0458,0.0395,1.6588 +Small,4x4,ldr-rgba-01.png,38.8941,0.0283,0.0224,2.9266 +Small,4x4,ldr-rgba-02.png,34.9204,0.0321,0.0261,2.5156 +Small,4x4,ldr-xy-00.png,37.7446,0.0288,0.0211,3.1110 +Small,4x4,ldr-xy-01.png,45.1462,0.0398,0.0323,2.0269 +Small,4x4,ldr-xy-02.png,50.9226,0.0478,0.0398,1.6482 +Small,4x4,ldrs-rgba-00.png,36.2418,0.0465,0.0401,1.6357 +Small,4x4,ldrs-rgba-01.png,38.9101,0.0289,0.0228,2.8793 +Small,4x4,ldrs-rgba-02.png,34.9259,0.0326,0.0265,2.4741 +Small,5x5,hdr-rgb-00.hdr,29.8514,0.1424,0.0478,1.3714 +Small,5x5,ldr-rgb-00.png,35.0732,0.0515,0.0437,1.4991 +Small,5x5,ldr-rgb-01.png,36.3975,0.0436,0.0360,1.8218 +Small,5x5,ldr-rgb-02.png,31.0670,0.0459,0.0384,1.7070 +Small,5x5,ldr-rgb-03.png,43.9478,0.0193,0.0122,5.3551 +Small,5x5,ldr-rgb-04.png,37.6667,0.0401,0.0325,2.0193 +Small,5x5,ldr-rgb-05.png,33.5193,0.0593,0.0516,1.2694 +Small,5x5,ldr-rgb-06.png,31.0773,0.0436,0.0360,1.8196 +Small,5x5,ldr-rgb-07.png,36.2042,0.0635,0.0556,1.1785 +Small,5x5,ldr-rgb-08.png,41.5462,0.0291,0.0217,3.0183 +Small,5x5,ldr-rgb-09.png,37.5873,0.0373,0.0300,2.1850 +Small,5x5,ldr-rgb-10.png,40.4902,0.0103,0.0054,3.0329 +Small,5x5,ldr-rgba-00.png,32.7858,0.0608,0.0530,1.2363 +Small,5x5,ldr-rgba-01.png,35.2722,0.0352,0.0276,2.3705 +Small,5x5,ldr-rgba-02.png,31.1225,0.0419,0.0344,1.9064 +Small,5x5,ldr-xy-00.png,37.0726,0.0314,0.0220,2.9753 +Small,5x5,ldr-xy-01.png,40.7191,0.0418,0.0325,2.0150 +Small,5x5,ldr-xy-02.png,49.0675,0.0329,0.0231,2.8332 +Small,5x5,ldrs-rgba-00.png,32.7887,0.0625,0.0547,1.1983 +Small,5x5,ldrs-rgba-01.png,35.2789,0.0358,0.0280,2.3378 +Small,5x5,ldrs-rgba-02.png,31.1234,0.0422,0.0346,1.8950 +Small,6x6,hdr-rgb-00.hdr,27.4769,0.1489,0.0534,1.2276 +Small,6x6,ldr-rgb-00.png,32.3560,0.0546,0.0465,1.4083 +Small,6x6,ldr-rgb-01.png,33.0687,0.0445,0.0367,1.7867 +Small,6x6,ldr-rgb-02.png,27.4381,0.0499,0.0416,1.5756 +Small,6x6,ldr-rgb-03.png,41.6538,0.0174,0.0096,6.8473 +Small,6x6,ldr-rgb-04.png,34.2059,0.0398,0.0316,2.0710 +Small,6x6,ldr-rgb-05.png,30.1377,0.0642,0.0561,1.1675 +Small,6x6,ldr-rgb-06.png,27.5024,0.0487,0.0405,1.6198 +Small,6x6,ldr-rgb-07.png,33.8577,0.0600,0.0516,1.2702 +Small,6x6,ldr-rgb-08.png,39.0752,0.0239,0.0161,4.0784 +Small,6x6,ldr-rgb-09.png,33.6699,0.0389,0.0309,2.1237 +Small,6x6,ldr-rgb-10.png,36.9333,0.0116,0.0060,2.7120 +Small,6x6,ldr-rgba-00.png,30.2558,0.0679,0.0596,1.1001 +Small,6x6,ldr-rgba-01.png,32.1716,0.0378,0.0296,2.2150 +Small,6x6,ldr-rgba-02.png,27.8426,0.0480,0.0398,1.6463 +Small,6x6,ldr-xy-00.png,36.2518,0.0299,0.0197,3.3289 +Small,6x6,ldr-xy-01.png,37.7318,0.0341,0.0243,2.7022 +Small,6x6,ldr-xy-02.png,46.0639,0.0262,0.0161,4.0683 +Small,6x6,ldrs-rgba-00.png,30.2570,0.0694,0.0610,1.0736 +Small,6x6,ldrs-rgba-01.png,32.1777,0.0380,0.0297,2.2032 +Small,6x6,ldrs-rgba-02.png,27.8427,0.0479,0.0398,1.6449 +Small,8x8,hdr-rgb-00.hdr,24.1157,0.1696,0.0700,0.9368 +Small,8x8,ldr-rgb-00.png,28.7123,0.0743,0.0623,1.0512 +Small,8x8,ldr-rgb-01.png,28.9240,0.0576,0.0461,1.4225 +Small,8x8,ldr-rgb-02.png,23.1517,0.0677,0.0560,1.1703 +Small,8x8,ldr-rgb-03.png,38.4615,0.0226,0.0115,5.7217 +Small,8x8,ldr-rgb-04.png,29.6546,0.0549,0.0429,1.5285 +Small,8x8,ldr-rgb-05.png,25.9295,0.0771,0.0654,1.0019 +Small,8x8,ldr-rgb-06.png,23.1918,0.0670,0.0554,1.1836 +Small,8x8,ldr-rgb-07.png,30.5823,0.0669,0.0549,1.1928 +Small,8x8,ldr-rgb-08.png,35.7743,0.0302,0.0187,3.4968 +Small,8x8,ldr-rgb-09.png,29.0115,0.0511,0.0395,1.6584 +Small,8x8,ldr-rgb-10.png,32.1619,0.0185,0.0090,1.7986 +Small,8x8,ldr-rgba-00.png,26.3940,0.0861,0.0741,0.8849 +Small,8x8,ldr-rgba-01.png,28.3383,0.0507,0.0388,1.6886 +Small,8x8,ldr-rgba-02.png,23.9368,0.0707,0.0588,1.1143 +Small,8x8,ldr-xy-00.png,34.0144,0.0441,0.0291,2.2536 +Small,8x8,ldr-xy-01.png,34.9127,0.0433,0.0286,2.2919 +Small,8x8,ldr-xy-02.png,41.7218,0.0312,0.0162,4.0404 +Small,8x8,ldrs-rgba-00.png,26.3943,0.0858,0.0735,0.8910 +Small,8x8,ldrs-rgba-01.png,28.3412,0.0508,0.0389,1.6851 +Small,8x8,ldrs-rgba-02.png,23.9363,0.0710,0.0592,1.1077 +Small,12x12,hdr-rgb-00.hdr,20.7645,0.1993,0.0920,0.7123 +Small,12x12,ldr-rgb-00.png,24.6670,0.0911,0.0707,0.9266 +Small,12x12,ldr-rgb-01.png,25.0227,0.0778,0.0578,1.1329 +Small,12x12,ldr-rgb-02.png,19.2621,0.1046,0.0845,0.7752 +Small,12x12,ldr-rgb-03.png,34.9308,0.0312,0.0120,5.4654 +Small,12x12,ldr-rgb-04.png,24.9126,0.0718,0.0519,1.2637 +Small,12x12,ldr-rgb-05.png,21.6505,0.1057,0.0858,0.7640 +Small,12x12,ldr-rgb-06.png,19.2451,0.1013,0.0812,0.8068 +Small,12x12,ldr-rgb-07.png,26.5693,0.0767,0.0564,1.1621 +Small,12x12,ldr-rgb-08.png,31.4927,0.0400,0.0198,3.3163 +Small,12x12,ldr-rgb-09.png,24.1078,0.0731,0.0532,1.2311 +Small,12x12,ldr-rgb-10.png,27.9831,0.0364,0.0188,0.8651 +Small,12x12,ldr-rgba-00.png,22.0878,0.1026,0.0819,0.8001 +Small,12x12,ldr-rgba-01.png,24.6267,0.0741,0.0540,1.2146 +Small,12x12,ldr-rgba-02.png,20.1804,0.1108,0.0905,0.7244 +Small,12x12,ldr-xy-00.png,30.0722,0.0574,0.0332,1.9725 +Small,12x12,ldr-xy-01.png,31.8391,0.0563,0.0324,2.0225 +Small,12x12,ldr-xy-02.png,38.5216,0.0308,0.0064,10.1939 +Small,12x12,ldrs-rgba-00.png,22.0882,0.1030,0.0825,0.7947 +Small,12x12,ldrs-rgba-01.png,24.6285,0.0739,0.0537,1.2206 +Small,12x12,ldrs-rgba-02.png,20.1803,0.1108,0.0904,0.7246 +Small,3x3x3,ldr-l-00-3.dds,51.9681,0.0322,0.0246,10.6576 +Small,3x3x3,ldr-l-01-3.dds,54.3395,0.0125,0.0076,9.0376 +Small,6x6x6,ldr-l-00-3.dds,32.9129,0.1058,0.0826,3.1733 +Small,6x6x6,ldr-l-01-3.dds,40.8871,0.0467,0.0260,2.6486 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse2_thorough_results.csv new file mode 100644 index 0000000..1789210 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse2_thorough_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.3787,0.1650,0.0719,0.9109 +Small,4x4,ldr-rgb-00.png,39.1025,0.0850,0.0788,0.8312 +Small,4x4,ldr-rgb-01.png,40.3344,0.0839,0.0780,0.8397 +Small,4x4,ldr-rgb-02.png,35.3612,0.0789,0.0728,0.9005 +Small,4x4,ldr-rgb-03.png,47.6672,0.0791,0.0735,0.8919 +Small,4x4,ldr-rgb-04.png,42.3135,0.0766,0.0705,0.9302 +Small,4x4,ldr-rgb-05.png,37.9467,0.0883,0.0822,0.7972 +Small,4x4,ldr-rgb-06.png,35.4785,0.0729,0.0668,0.9813 +Small,4x4,ldr-rgb-07.png,39.8676,0.0975,0.0910,0.7202 +Small,4x4,ldr-rgb-08.png,45.7996,0.0752,0.0693,0.9461 +Small,4x4,ldr-rgb-09.png,42.2360,0.0819,0.0759,0.8635 +Small,4x4,ldr-rgb-10.png,44.9865,0.0129,0.0094,1.7305 +Small,4x4,ldr-rgba-00.png,36.7341,0.0876,0.0812,0.8074 +Small,4x4,ldr-rgba-01.png,39.0299,0.0706,0.0644,1.0172 +Small,4x4,ldr-rgba-02.png,34.9857,0.0696,0.0631,1.0381 +Small,4x4,ldr-xy-00.png,37.7552,0.0800,0.0720,0.9101 +Small,4x4,ldr-xy-01.png,45.2171,0.0906,0.0831,0.7890 +Small,4x4,ldr-xy-02.png,50.9992,0.1090,0.1009,0.6495 +Small,4x4,ldrs-rgba-00.png,36.7416,0.0882,0.0818,0.8010 +Small,4x4,ldrs-rgba-01.png,39.0514,0.0709,0.0648,1.0113 +Small,4x4,ldrs-rgba-02.png,34.9915,0.0707,0.0644,1.0182 +Small,5x5,hdr-rgb-00.hdr,30.2499,0.1884,0.0936,0.7000 +Small,5x5,ldr-rgb-00.png,35.3184,0.1087,0.1008,0.6501 +Small,5x5,ldr-rgb-01.png,36.4942,0.1056,0.0981,0.6681 +Small,5x5,ldr-rgb-02.png,31.1169,0.0996,0.0922,0.7107 +Small,5x5,ldr-rgb-03.png,44.4730,0.0957,0.0884,0.7411 +Small,5x5,ldr-rgb-04.png,37.8145,0.0978,0.0902,0.7262 +Small,5x5,ldr-rgb-05.png,33.6567,0.1121,0.1045,0.6273 +Small,5x5,ldr-rgb-06.png,31.1197,0.0949,0.0870,0.7531 +Small,5x5,ldr-rgb-07.png,36.7056,0.1251,0.1172,0.5590 +Small,5x5,ldr-rgb-08.png,42.2684,0.0926,0.0853,0.7683 +Small,5x5,ldr-rgb-09.png,37.6844,0.1041,0.0967,0.6774 +Small,5x5,ldr-rgb-10.png,40.6793,0.0179,0.0130,1.2511 +Small,5x5,ldr-rgba-00.png,33.1233,0.1144,0.1065,0.6155 +Small,5x5,ldr-rgba-01.png,35.3456,0.0915,0.0839,0.7812 +Small,5x5,ldr-rgba-02.png,31.1599,0.0924,0.0847,0.7742 +Small,5x5,ldr-xy-00.png,37.2902,0.0944,0.0849,0.7723 +Small,5x5,ldr-xy-01.png,41.5197,0.1147,0.1055,0.6213 +Small,5x5,ldr-xy-02.png,49.2647,0.1290,0.1194,0.5490 +Small,5x5,ldrs-rgba-00.png,33.1269,0.1157,0.1077,0.6082 +Small,5x5,ldrs-rgba-01.png,35.3541,0.0929,0.0851,0.7697 +Small,5x5,ldrs-rgba-02.png,31.1602,0.0928,0.0850,0.7712 +Small,6x6,hdr-rgb-00.hdr,27.6571,0.2063,0.1111,0.5899 +Small,6x6,ldr-rgb-00.png,32.6208,0.1294,0.1210,0.5416 +Small,6x6,ldr-rgb-01.png,33.1469,0.1211,0.1131,0.5795 +Small,6x6,ldr-rgb-02.png,27.4754,0.1172,0.1090,0.6014 +Small,6x6,ldr-rgb-03.png,42.5226,0.0802,0.0725,0.9038 +Small,6x6,ldr-rgb-04.png,34.3223,0.1154,0.1070,0.6124 +Small,6x6,ldr-rgb-05.png,30.2576,0.1317,0.1234,0.5312 +Small,6x6,ldr-rgb-06.png,27.5394,0.1146,0.1063,0.6164 +Small,6x6,ldr-rgb-07.png,34.3854,0.1380,0.1292,0.5074 +Small,6x6,ldr-rgb-08.png,39.8830,0.0806,0.0724,0.9050 +Small,6x6,ldr-rgb-09.png,33.7955,0.1125,0.1045,0.6270 +Small,6x6,ldr-rgb-10.png,37.1039,0.0227,0.0171,0.9501 +Small,6x6,ldr-rgba-00.png,30.5063,0.1351,0.1263,0.5189 +Small,6x6,ldr-rgba-01.png,32.2316,0.1125,0.1042,0.6287 +Small,6x6,ldr-rgba-02.png,27.8753,0.1161,0.1078,0.6077 +Small,6x6,ldr-xy-00.png,36.3838,0.0803,0.0700,0.9366 +Small,6x6,ldr-xy-01.png,38.0617,0.1164,0.1066,0.6147 +Small,6x6,ldr-xy-02.png,47.4738,0.1436,0.1331,0.4925 +Small,6x6,ldrs-rgba-00.png,30.5081,0.1360,0.1275,0.5141 +Small,6x6,ldrs-rgba-01.png,32.2377,0.1129,0.1047,0.6261 +Small,6x6,ldrs-rgba-02.png,27.8745,0.1175,0.1089,0.6018 +Small,8x8,hdr-rgb-00.hdr,24.3160,0.2483,0.1473,0.4449 +Small,8x8,ldr-rgb-00.png,28.9377,0.1668,0.1528,0.4290 +Small,8x8,ldr-rgb-01.png,28.9883,0.1495,0.1363,0.4809 +Small,8x8,ldr-rgb-02.png,23.1866,0.1572,0.1437,0.4561 +Small,8x8,ldr-rgb-03.png,39.3501,0.0527,0.0395,1.6573 +Small,8x8,ldr-rgb-04.png,29.7749,0.1414,0.1281,0.5118 +Small,8x8,ldr-rgb-05.png,26.0242,0.1650,0.1514,0.4330 +Small,8x8,ldr-rgb-06.png,23.2335,0.1565,0.1432,0.4577 +Small,8x8,ldr-rgb-07.png,31.1039,0.1574,0.1439,0.4555 +Small,8x8,ldr-rgb-08.png,36.4625,0.0773,0.0642,1.0205 +Small,8x8,ldr-rgb-09.png,29.1520,0.1192,0.1056,0.6204 +Small,8x8,ldr-rgb-10.png,32.3031,0.0330,0.0222,0.7315 +Small,8x8,ldr-rgba-00.png,26.6704,0.1756,0.1617,0.4054 +Small,8x8,ldr-rgba-01.png,28.3932,0.1359,0.1225,0.5351 +Small,8x8,ldr-rgba-02.png,23.9599,0.1660,0.1525,0.4298 +Small,8x8,ldr-xy-00.png,34.3120,0.0958,0.0806,0.8127 +Small,8x8,ldr-xy-01.png,35.2097,0.0989,0.0835,0.7847 +Small,8x8,ldr-xy-02.png,44.5878,0.1261,0.1109,0.5911 +Small,8x8,ldrs-rgba-00.png,26.6715,0.1765,0.1627,0.4028 +Small,8x8,ldrs-rgba-01.png,28.3959,0.1378,0.1241,0.5279 +Small,8x8,ldrs-rgba-02.png,23.9597,0.1654,0.1518,0.4317 +Small,12x12,hdr-rgb-00.hdr,21.0019,0.3020,0.1908,0.3435 +Small,12x12,ldr-rgb-00.png,25.0133,0.2074,0.1849,0.3545 +Small,12x12,ldr-rgb-01.png,25.1167,0.1746,0.1514,0.4328 +Small,12x12,ldr-rgb-02.png,19.2912,0.2119,0.1888,0.3471 +Small,12x12,ldr-rgb-03.png,36.1206,0.0624,0.0394,1.6641 +Small,12x12,ldr-rgb-04.png,25.0074,0.1748,0.1512,0.4336 +Small,12x12,ldr-rgb-05.png,21.7140,0.2104,0.1871,0.3503 +Small,12x12,ldr-rgb-06.png,19.2810,0.2060,0.1826,0.3588 +Small,12x12,ldr-rgb-07.png,27.0419,0.1870,0.1639,0.3999 +Small,12x12,ldr-rgb-08.png,32.3840,0.0866,0.0635,1.0324 +Small,12x12,ldr-rgb-09.png,24.3053,0.1656,0.1418,0.4620 +Small,12x12,ldr-rgb-10.png,28.1356,0.0596,0.0388,0.4185 +Small,12x12,ldr-rgba-00.png,22.7010,0.2213,0.1975,0.3318 +Small,12x12,ldr-rgba-01.png,24.7078,0.1637,0.1408,0.4654 +Small,12x12,ldr-rgba-02.png,20.1958,0.2170,0.1937,0.3384 +Small,12x12,ldr-xy-00.png,30.5742,0.1286,0.1034,0.6338 +Small,12x12,ldr-xy-01.png,32.1255,0.0968,0.0718,0.9122 +Small,12x12,ldr-xy-02.png,40.3053,0.0695,0.0444,1.4745 +Small,12x12,ldrs-rgba-00.png,22.7006,0.2215,0.1981,0.3308 +Small,12x12,ldrs-rgba-01.png,24.7093,0.1676,0.1441,0.4547 +Small,12x12,ldrs-rgba-02.png,20.1960,0.2189,0.1954,0.3354 +Small,3x3x3,ldr-l-00-3.dds,52.4159,0.0627,0.0550,4.7653 +Small,3x3x3,ldr-l-01-3.dds,55.3973,0.0269,0.0219,3.1406 +Small,6x6x6,ldr-l-00-3.dds,33.2725,0.1589,0.1327,1.9754 +Small,6x6x6,ldr-l-01-3.dds,41.5751,0.0503,0.0271,2.5473 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse4.1_fast_results.csv new file mode 100644 index 0000000..41c29c2 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse4.1_fast_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.6884,0.1096,0.0172,3.8067 +Small,4x4,ldr-rgb-00.png,38.1103,0.0158,0.0108,6.0732 +Small,4x4,ldr-rgb-01.png,39.8105,0.0142,0.0093,7.0386 +Small,4x4,ldr-rgb-02.png,35.0374,0.0195,0.0146,4.4805 +Small,4x4,ldr-rgb-03.png,45.9704,0.0086,0.0041,16.1731 +Small,4x4,ldr-rgb-04.png,41.9106,0.0119,0.0067,9.7120 +Small,4x4,ldr-rgb-05.png,37.2317,0.0190,0.0140,4.6956 +Small,4x4,ldr-rgb-06.png,35.2059,0.0187,0.0136,4.8220 +Small,4x4,ldr-rgb-07.png,38.0309,0.0199,0.0144,4.5413 +Small,4x4,ldr-rgb-08.png,43.6358,0.0105,0.0056,11.6716 +Small,4x4,ldr-rgb-09.png,41.8533,0.0119,0.0071,9.2343 +Small,4x4,ldr-rgb-10.png,44.3464,0.0045,0.0019,8.4364 +Small,4x4,ldr-rgba-00.png,35.5182,0.0191,0.0138,4.7531 +Small,4x4,ldr-rgba-01.png,38.7956,0.0139,0.0089,7.3894 +Small,4x4,ldr-rgba-02.png,34.8333,0.0175,0.0124,5.2881 +Small,4x4,ldr-xy-00.png,37.5697,0.0141,0.0066,9.8746 +Small,4x4,ldr-xy-01.png,44.1378,0.0150,0.0079,8.2790 +Small,4x4,ldr-xy-02.png,48.1786,0.0128,0.0052,12.5001 +Small,4x4,ldrs-rgba-00.png,35.5254,0.0196,0.0141,4.6519 +Small,4x4,ldrs-rgba-01.png,38.8141,0.0140,0.0088,7.4685 +Small,4x4,ldrs-rgba-02.png,34.8386,0.0176,0.0125,5.2488 +Small,5x5,hdr-rgb-00.hdr,29.4686,0.1130,0.0206,3.1783 +Small,5x5,ldr-rgb-00.png,34.3042,0.0173,0.0113,5.8223 +Small,5x5,ldr-rgb-01.png,36.1808,0.0145,0.0087,7.5555 +Small,5x5,ldr-rgb-02.png,31.0160,0.0193,0.0134,4.8918 +Small,5x5,ldr-rgb-03.png,42.6231,0.0091,0.0036,18.2959 +Small,5x5,ldr-rgb-04.png,37.2434,0.0130,0.0069,9.5258 +Small,5x5,ldr-rgb-05.png,33.1823,0.0217,0.0155,4.2162 +Small,5x5,ldr-rgb-06.png,31.0247,0.0191,0.0129,5.0831 +Small,5x5,ldr-rgb-07.png,35.1883,0.0189,0.0125,5.2479 +Small,5x5,ldr-rgb-08.png,40.0310,0.0108,0.0050,13.1125 +Small,5x5,ldr-rgb-09.png,37.2810,0.0129,0.0070,9.3315 +Small,5x5,ldr-rgb-10.png,40.1234,0.0055,0.0020,8.2766 +Small,5x5,ldr-rgba-00.png,32.0072,0.0218,0.0153,4.2769 +Small,5x5,ldr-rgba-01.png,35.1428,0.0151,0.0091,7.2152 +Small,5x5,ldr-rgba-02.png,31.1062,0.0198,0.0136,4.8334 +Small,5x5,ldr-xy-00.png,36.7258,0.0147,0.0054,12.1028 +Small,5x5,ldr-xy-01.png,39.8638,0.0155,0.0070,9.3050 +Small,5x5,ldr-xy-02.png,43.9171,0.0138,0.0049,13.4962 +Small,5x5,ldrs-rgba-00.png,32.0096,0.0218,0.0153,4.2784 +Small,5x5,ldrs-rgba-01.png,35.1497,0.0153,0.0091,7.2152 +Small,5x5,ldrs-rgba-02.png,31.1070,0.0201,0.0137,4.7708 +Small,6x6,hdr-rgb-00.hdr,26.9904,0.1185,0.0240,2.7328 +Small,6x6,ldr-rgb-00.png,31.5938,0.0215,0.0149,4.3987 +Small,6x6,ldr-rgb-01.png,32.8896,0.0175,0.0111,5.9121 +Small,6x6,ldr-rgb-02.png,27.4079,0.0241,0.0175,3.7502 +Small,6x6,ldr-rgb-03.png,40.4899,0.0100,0.0037,17.8759 +Small,6x6,ldr-rgb-04.png,33.9065,0.0154,0.0089,7.3340 +Small,6x6,ldr-rgb-05.png,29.9329,0.0269,0.0202,3.2384 +Small,6x6,ldr-rgb-06.png,27.4651,0.0235,0.0169,3.8850 +Small,6x6,ldr-rgb-07.png,32.8824,0.0202,0.0132,4.9713 +Small,6x6,ldr-rgb-08.png,37.6380,0.0117,0.0053,12.4003 +Small,6x6,ldr-rgb-09.png,33.4716,0.0157,0.0093,7.0523 +Small,6x6,ldr-rgb-10.png,36.6590,0.0064,0.0023,7.2120 +Small,6x6,ldr-rgba-00.png,29.4788,0.0264,0.0194,3.3763 +Small,6x6,ldr-rgba-01.png,32.0575,0.0180,0.0112,5.8452 +Small,6x6,ldr-rgba-02.png,27.8275,0.0245,0.0175,3.7464 +Small,6x6,ldr-xy-00.png,35.6827,0.0155,0.0061,10.7492 +Small,6x6,ldr-xy-01.png,37.1053,0.0179,0.0090,7.2512 +Small,6x6,ldr-xy-02.png,41.9446,0.0138,0.0045,14.7041 +Small,6x6,ldrs-rgba-00.png,29.4790,0.0266,0.0196,3.3451 +Small,6x6,ldrs-rgba-01.png,32.0640,0.0180,0.0114,5.7715 +Small,6x6,ldrs-rgba-02.png,27.8273,0.0245,0.0177,3.7053 +Small,8x8,hdr-rgb-00.hdr,23.7216,0.1326,0.0335,1.9540 +Small,8x8,ldr-rgb-00.png,27.9814,0.0299,0.0193,3.4030 +Small,8x8,ldr-rgb-01.png,28.7458,0.0259,0.0155,4.2290 +Small,8x8,ldr-rgb-02.png,23.0937,0.0357,0.0252,2.6016 +Small,8x8,ldr-rgb-03.png,37.2544,0.0142,0.0041,16.1181 +Small,8x8,ldr-rgb-04.png,29.3419,0.0247,0.0141,4.6516 +Small,8x8,ldr-rgb-05.png,25.7747,0.0393,0.0290,2.2612 +Small,8x8,ldr-rgb-06.png,23.1468,0.0359,0.0251,2.6119 +Small,8x8,ldr-rgb-07.png,29.6508,0.0245,0.0136,4.8202 +Small,8x8,ldr-rgb-08.png,34.2150,0.0170,0.0067,9.8519 +Small,8x8,ldr-rgb-09.png,28.6635,0.0254,0.0150,4.3735 +Small,8x8,ldr-rgb-10.png,31.9974,0.0113,0.0031,5.1752 +Small,8x8,ldr-rgba-00.png,25.3599,0.0369,0.0259,2.5322 +Small,8x8,ldr-rgba-01.png,28.2399,0.0271,0.0166,3.9570 +Small,8x8,ldr-rgba-02.png,23.9241,0.0365,0.0258,2.5394 +Small,8x8,ldr-xy-00.png,33.3965,0.0227,0.0088,7.4481 +Small,8x8,ldr-xy-01.png,34.2472,0.0244,0.0108,6.0827 +Small,8x8,ldr-xy-02.png,39.9005,0.0173,0.0034,19.0795 +Small,8x8,ldrs-rgba-00.png,25.3610,0.0370,0.0259,2.5259 +Small,8x8,ldrs-rgba-01.png,28.2419,0.0278,0.0169,3.8742 +Small,8x8,ldrs-rgba-02.png,23.9237,0.0370,0.0261,2.5067 +Small,12x12,hdr-rgb-00.hdr,20.5637,0.1512,0.0447,1.4657 +Small,12x12,ldr-rgb-00.png,23.7825,0.0327,0.0154,4.2644 +Small,12x12,ldr-rgb-01.png,24.7588,0.0274,0.0105,6.2345 +Small,12x12,ldr-rgb-02.png,19.2226,0.0456,0.0282,2.3205 +Small,12x12,ldr-rgb-03.png,33.2364,0.0201,0.0031,21.3266 +Small,12x12,ldr-rgb-04.png,24.5606,0.0279,0.0106,6.1611 +Small,12x12,ldr-rgb-05.png,21.4885,0.0408,0.0236,2.7793 +Small,12x12,ldr-rgb-06.png,19.2097,0.0472,0.0298,2.2025 +Small,12x12,ldr-rgb-07.png,25.3456,0.0269,0.0090,7.3013 +Small,12x12,ldr-rgb-08.png,30.1535,0.0220,0.0045,14.4414 +Small,12x12,ldr-rgb-09.png,23.7136,0.0324,0.0154,4.2471 +Small,12x12,ldr-rgb-10.png,27.3052,0.0186,0.0037,4.4211 +Small,12x12,ldr-rgba-00.png,21.3632,0.0442,0.0267,2.4534 +Small,12x12,ldr-rgba-01.png,24.4867,0.0304,0.0131,5.0215 +Small,12x12,ldr-rgba-02.png,20.1666,0.0525,0.0347,1.8879 +Small,12x12,ldr-xy-00.png,29.0651,0.0294,0.0078,8.3935 +Small,12x12,ldr-xy-01.png,30.4241,0.0283,0.0075,8.7815 +Small,12x12,ldr-xy-02.png,37.9951,0.0230,0.0020,32.2513 +Small,12x12,ldrs-rgba-00.png,21.3658,0.0442,0.0266,2.4684 +Small,12x12,ldrs-rgba-01.png,24.4885,0.0301,0.0129,5.0705 +Small,12x12,ldrs-rgba-02.png,20.1665,0.0528,0.0349,1.8759 +Small,3x3x3,ldr-l-00-3.dds,50.7551,0.0218,0.0150,17.4845 +Small,3x3x3,ldr-l-01-3.dds,53.8676,0.0102,0.0062,11.1811 +Small,6x6x6,ldr-l-00-3.dds,32.5264,0.0827,0.0593,4.4177 +Small,6x6x6,ldr-l-01-3.dds,40.7893,0.0435,0.0231,2.9774 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse4.1_fastest_results.csv new file mode 100644 index 0000000..0ad680d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse4.1_fastest_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.2999,0.1028,0.0107,6.1072 +Small,4x4,ldr-rgb-00.png,37.0084,0.0109,0.0064,10.2193 +Small,4x4,ldr-rgb-01.png,39.4162,0.0105,0.0062,10.5926 +Small,4x4,ldr-rgb-02.png,34.6448,0.0134,0.0092,7.1358 +Small,4x4,ldr-rgb-03.png,45.3559,0.0069,0.0029,22.6535 +Small,4x4,ldr-rgb-04.png,41.6390,0.0093,0.0047,13.8464 +Small,4x4,ldr-rgb-05.png,36.7213,0.0131,0.0087,7.5477 +Small,4x4,ldr-rgb-06.png,34.6994,0.0131,0.0084,7.7651 +Small,4x4,ldr-rgb-07.png,37.1808,0.0133,0.0085,7.7055 +Small,4x4,ldr-rgb-08.png,42.6915,0.0082,0.0039,16.9961 +Small,4x4,ldr-rgb-09.png,41.6433,0.0092,0.0048,13.5155 +Small,4x4,ldr-rgb-10.png,43.8818,0.0036,0.0016,10.0907 +Small,4x4,ldr-rgba-00.png,34.5700,0.0127,0.0078,8.3989 +Small,4x4,ldr-rgba-01.png,38.5857,0.0112,0.0066,9.8998 +Small,4x4,ldr-rgba-02.png,34.5224,0.0138,0.0092,7.1343 +Small,4x4,ldr-xy-00.png,37.5264,0.0117,0.0049,13.3449 +Small,4x4,ldr-xy-01.png,43.8563,0.0119,0.0054,12.2157 +Small,4x4,ldr-xy-02.png,48.1786,0.0110,0.0039,16.5999 +Small,4x4,ldrs-rgba-00.png,34.5750,0.0127,0.0078,8.4267 +Small,4x4,ldrs-rgba-01.png,38.6025,0.0112,0.0066,9.9009 +Small,4x4,ldrs-rgba-02.png,34.5263,0.0138,0.0093,7.0827 +Small,5x5,hdr-rgb-00.hdr,28.8076,0.1055,0.0129,5.0795 +Small,5x5,ldr-rgb-00.png,33.4478,0.0122,0.0069,9.4665 +Small,5x5,ldr-rgb-01.png,35.9999,0.0111,0.0062,10.5212 +Small,5x5,ldr-rgb-02.png,30.8748,0.0145,0.0095,6.8969 +Small,5x5,ldr-rgb-03.png,42.2547,0.0076,0.0029,22.6685 +Small,5x5,ldr-rgb-04.png,36.9224,0.0107,0.0055,12.0202 +Small,5x5,ldr-rgb-05.png,32.6193,0.0151,0.0100,6.5438 +Small,5x5,ldr-rgb-06.png,30.8711,0.0147,0.0095,6.9044 +Small,5x5,ldr-rgb-07.png,34.2652,0.0142,0.0084,7.7649 +Small,5x5,ldr-rgb-08.png,39.3139,0.0088,0.0039,16.6250 +Small,5x5,ldr-rgb-09.png,36.9835,0.0104,0.0055,11.8151 +Small,5x5,ldr-rgb-10.png,39.7373,0.0043,0.0016,9.8758 +Small,5x5,ldr-rgba-00.png,30.7473,0.0140,0.0084,7.7586 +Small,5x5,ldr-rgba-01.png,34.9846,0.0123,0.0070,9.3611 +Small,5x5,ldr-rgba-02.png,31.0020,0.0158,0.0106,6.1884 +Small,5x5,ldr-xy-00.png,36.5568,0.0125,0.0042,15.5044 +Small,5x5,ldr-xy-01.png,38.8334,0.0125,0.0049,13.4513 +Small,5x5,ldr-xy-02.png,43.7233,0.0120,0.0041,16.0195 +Small,5x5,ldrs-rgba-00.png,30.7497,0.0141,0.0087,7.5458 +Small,5x5,ldrs-rgba-01.png,34.9913,0.0125,0.0073,9.0047 +Small,5x5,ldrs-rgba-02.png,31.0030,0.0159,0.0103,6.3394 +Small,6x6,hdr-rgb-00.hdr,26.7122,0.1062,0.0128,5.1029 +Small,6x6,ldr-rgb-00.png,31.1052,0.0133,0.0077,8.4870 +Small,6x6,ldr-rgb-01.png,32.7949,0.0123,0.0072,9.1495 +Small,6x6,ldr-rgb-02.png,27.3228,0.0164,0.0111,5.8920 +Small,6x6,ldr-rgb-03.png,40.2037,0.0077,0.0026,24.8421 +Small,6x6,ldr-rgb-04.png,33.7349,0.0117,0.0063,10.3825 +Small,6x6,ldr-rgb-05.png,29.5304,0.0168,0.0113,5.7828 +Small,6x6,ldr-rgb-06.png,27.3791,0.0163,0.0108,6.0665 +Small,6x6,ldr-rgb-07.png,32.0586,0.0142,0.0083,7.9254 +Small,6x6,ldr-rgb-08.png,37.0422,0.0089,0.0036,18.4086 +Small,6x6,ldr-rgb-09.png,33.2804,0.0115,0.0060,10.8630 +Small,6x6,ldr-rgb-10.png,36.4903,0.0048,0.0019,8.7774 +Small,6x6,ldr-rgba-00.png,28.4787,0.0157,0.0099,6.6494 +Small,6x6,ldr-rgba-01.png,31.9580,0.0138,0.0080,8.1736 +Small,6x6,ldr-rgba-02.png,27.7571,0.0170,0.0113,5.7772 +Small,6x6,ldr-xy-00.png,35.5281,0.0127,0.0045,14.5123 +Small,6x6,ldr-xy-01.png,36.2504,0.0134,0.0056,11.7514 +Small,6x6,ldr-xy-02.png,41.7327,0.0117,0.0036,18.3069 +Small,6x6,ldrs-rgba-00.png,28.4800,0.0156,0.0097,6.7900 +Small,6x6,ldrs-rgba-01.png,31.9643,0.0138,0.0082,7.9612 +Small,6x6,ldrs-rgba-02.png,27.7547,0.0172,0.0116,5.6375 +Small,8x8,hdr-rgb-00.hdr,23.5547,0.1176,0.0204,3.2154 +Small,8x8,ldr-rgb-00.png,27.6188,0.0204,0.0114,5.7247 +Small,8x8,ldr-rgb-01.png,28.6671,0.0189,0.0104,6.3192 +Small,8x8,ldr-rgb-02.png,23.0179,0.0255,0.0167,3.9328 +Small,8x8,ldr-rgb-03.png,37.0089,0.0117,0.0032,20.6800 +Small,8x8,ldr-rgb-04.png,29.0953,0.0183,0.0094,6.9757 +Small,8x8,ldr-rgb-05.png,25.5324,0.0256,0.0166,3.9432 +Small,8x8,ldr-rgb-06.png,23.0523,0.0261,0.0170,3.8555 +Small,8x8,ldr-rgb-07.png,29.3368,0.0186,0.0094,6.9794 +Small,8x8,ldr-rgb-08.png,33.7665,0.0134,0.0047,13.9320 +Small,8x8,ldr-rgb-09.png,28.4590,0.0182,0.0094,6.9653 +Small,8x8,ldr-rgb-10.png,31.8847,0.0088,0.0025,6.5655 +Small,8x8,ldr-rgba-00.png,24.9726,0.0242,0.0149,4.4031 +Small,8x8,ldr-rgba-01.png,28.1236,0.0202,0.0114,5.7695 +Small,8x8,ldr-rgba-02.png,23.8676,0.0264,0.0174,3.7725 +Small,8x8,ldr-xy-00.png,33.2085,0.0185,0.0062,10.5060 +Small,8x8,ldr-xy-01.png,33.9809,0.0189,0.0072,9.0743 +Small,8x8,ldr-xy-02.png,39.7786,0.0148,0.0028,23.3640 +Small,8x8,ldrs-rgba-00.png,24.9730,0.0243,0.0151,4.3298 +Small,8x8,ldrs-rgba-01.png,28.1260,0.0202,0.0112,5.8636 +Small,8x8,ldrs-rgba-02.png,23.8671,0.0268,0.0179,3.6696 +Small,12x12,hdr-rgb-00.hdr,20.4789,0.1292,0.0280,2.3382 +Small,12x12,ldr-rgb-00.png,23.6716,0.0234,0.0103,6.3332 +Small,12x12,ldr-rgb-01.png,24.7037,0.0205,0.0075,8.7113 +Small,12x12,ldr-rgb-02.png,19.1880,0.0320,0.0189,3.4677 +Small,12x12,ldr-rgb-03.png,33.1400,0.0155,0.0028,23.1165 +Small,12x12,ldr-rgb-04.png,24.3898,0.0207,0.0077,8.5400 +Small,12x12,ldr-rgb-05.png,21.3701,0.0294,0.0160,4.0926 +Small,12x12,ldr-rgb-06.png,19.1564,0.0337,0.0204,3.2058 +Small,12x12,ldr-rgb-07.png,25.2598,0.0204,0.0071,9.1917 +Small,12x12,ldr-rgb-08.png,29.9653,0.0167,0.0039,16.7313 +Small,12x12,ldr-rgb-09.png,23.5968,0.0234,0.0106,6.1669 +Small,12x12,ldr-rgb-10.png,27.2554,0.0135,0.0026,6.1860 +Small,12x12,ldr-rgba-00.png,21.1828,0.0304,0.0169,3.8685 +Small,12x12,ldr-rgba-01.png,24.4330,0.0229,0.0095,6.9298 +Small,12x12,ldr-rgba-02.png,20.1371,0.0376,0.0239,2.7374 +Small,12x12,ldr-xy-00.png,28.9405,0.0230,0.0064,10.1954 +Small,12x12,ldr-xy-01.png,29.6034,0.0222,0.0058,11.2085 +Small,12x12,ldr-xy-02.png,37.9716,0.0187,0.0021,31.5082 +Small,12x12,ldrs-rgba-00.png,21.1836,0.0304,0.0170,3.8496 +Small,12x12,ldrs-rgba-01.png,24.4339,0.0226,0.0097,6.7849 +Small,12x12,ldrs-rgba-02.png,20.1367,0.0376,0.0241,2.7191 +Small,3x3x3,ldr-l-00-3.dds,50.6012,0.0193,0.0132,19.9288 +Small,3x3x3,ldr-l-01-3.dds,53.7999,0.0091,0.0059,11.6305 +Small,6x6x6,ldr-l-00-3.dds,32.5074,0.0803,0.0590,4.4415 +Small,6x6x6,ldr-l-01-3.dds,40.7826,0.0411,0.0229,3.0066 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse4.1_medium_results.csv new file mode 100644 index 0000000..8cfd869 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse4.1_medium_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1340,0.1239,0.0307,2.1365 +Small,4x4,ldr-rgb-00.png,38.7318,0.0378,0.0318,2.0599 +Small,4x4,ldr-rgb-01.png,40.1460,0.0348,0.0291,2.2545 +Small,4x4,ldr-rgb-02.png,35.2180,0.0361,0.0304,2.1562 +Small,4x4,ldr-rgb-03.png,47.1925,0.0216,0.0161,4.0683 +Small,4x4,ldr-rgb-04.png,42.1729,0.0298,0.0238,2.7534 +Small,4x4,ldr-rgb-05.png,37.7672,0.0387,0.0326,2.0087 +Small,4x4,ldr-rgb-06.png,35.3468,0.0327,0.0267,2.4589 +Small,4x4,ldr-rgb-07.png,39.2464,0.0449,0.0386,1.6958 +Small,4x4,ldr-rgb-08.png,45.1732,0.0253,0.0195,3.3534 +Small,4x4,ldr-rgb-09.png,42.0914,0.0302,0.0245,2.6775 +Small,4x4,ldr-rgb-10.png,44.8767,0.0073,0.0039,4.1712 +Small,4x4,ldr-rgba-00.png,36.2349,0.0410,0.0347,1.8895 +Small,4x4,ldr-rgba-01.png,38.8941,0.0257,0.0197,3.3299 +Small,4x4,ldr-rgba-02.png,34.9204,0.0291,0.0230,2.8488 +Small,4x4,ldr-xy-00.png,37.7446,0.0265,0.0188,3.4898 +Small,4x4,ldr-xy-01.png,45.1462,0.0359,0.0286,2.2903 +Small,4x4,ldr-xy-02.png,50.9226,0.0432,0.0350,1.8699 +Small,4x4,ldrs-rgba-00.png,36.2418,0.0413,0.0349,1.8765 +Small,4x4,ldrs-rgba-01.png,38.9101,0.0260,0.0200,3.2788 +Small,4x4,ldrs-rgba-02.png,34.9259,0.0294,0.0232,2.8274 +Small,5x5,hdr-rgb-00.hdr,29.8514,0.1364,0.0409,1.6007 +Small,5x5,ldr-rgb-00.png,35.0732,0.0457,0.0379,1.7312 +Small,5x5,ldr-rgb-01.png,36.3975,0.0384,0.0312,2.1022 +Small,5x5,ldr-rgb-02.png,31.0670,0.0405,0.0330,1.9850 +Small,5x5,ldr-rgb-03.png,43.9478,0.0177,0.0106,6.1646 +Small,5x5,ldr-rgb-04.png,37.6667,0.0357,0.0282,2.3255 +Small,5x5,ldr-rgb-05.png,33.5193,0.0513,0.0438,1.4973 +Small,5x5,ldr-rgb-06.png,31.0773,0.0384,0.0309,2.1195 +Small,5x5,ldr-rgb-07.png,36.2042,0.0549,0.0471,1.3922 +Small,5x5,ldr-rgb-08.png,41.5462,0.0265,0.0189,3.4637 +Small,5x5,ldr-rgb-09.png,37.5873,0.0331,0.0257,2.5489 +Small,5x5,ldr-rgb-10.png,40.4902,0.0098,0.0049,3.3161 +Small,5x5,ldr-rgba-00.png,32.7858,0.0539,0.0459,1.4285 +Small,5x5,ldr-rgba-01.png,35.2722,0.0315,0.0240,2.7328 +Small,5x5,ldr-rgba-02.png,31.1225,0.0375,0.0298,2.1957 +Small,5x5,ldr-xy-00.png,37.0726,0.0287,0.0193,3.3930 +Small,5x5,ldr-xy-01.png,40.7191,0.0372,0.0282,2.3281 +Small,5x5,ldr-xy-02.png,49.0675,0.0295,0.0201,3.2668 +Small,5x5,ldrs-rgba-00.png,32.7887,0.0551,0.0472,1.3894 +Small,5x5,ldrs-rgba-01.png,35.2789,0.0316,0.0241,2.7202 +Small,5x5,ldrs-rgba-02.png,31.1234,0.0376,0.0298,2.1957 +Small,6x6,hdr-rgb-00.hdr,27.4769,0.1416,0.0461,1.4227 +Small,6x6,ldr-rgb-00.png,32.3560,0.0486,0.0404,1.6212 +Small,6x6,ldr-rgb-01.png,33.0687,0.0399,0.0320,2.0509 +Small,6x6,ldr-rgb-02.png,27.4381,0.0441,0.0363,1.8046 +Small,6x6,ldr-rgb-03.png,41.6538,0.0160,0.0085,7.6956 +Small,6x6,ldr-rgb-04.png,34.2059,0.0358,0.0277,2.3653 +Small,6x6,ldr-rgb-05.png,30.1377,0.0567,0.0484,1.3546 +Small,6x6,ldr-rgb-06.png,27.5024,0.0432,0.0351,1.8676 +Small,6x6,ldr-rgb-07.png,33.8577,0.0528,0.0444,1.4768 +Small,6x6,ldr-rgb-08.png,39.0752,0.0221,0.0144,4.5590 +Small,6x6,ldr-rgb-09.png,33.6699,0.0344,0.0267,2.4576 +Small,6x6,ldr-rgb-10.png,36.9333,0.0112,0.0057,2.8671 +Small,6x6,ldr-rgba-00.png,30.2558,0.0607,0.0522,1.2545 +Small,6x6,ldr-rgba-01.png,32.1716,0.0338,0.0258,2.5378 +Small,6x6,ldr-rgba-02.png,27.8426,0.0427,0.0346,1.8935 +Small,6x6,ldr-xy-00.png,36.2518,0.0275,0.0174,3.7582 +Small,6x6,ldr-xy-01.png,37.7318,0.0309,0.0215,3.0496 +Small,6x6,ldr-xy-02.png,46.0639,0.0245,0.0146,4.4777 +Small,6x6,ldrs-rgba-00.png,30.2570,0.0615,0.0531,1.2352 +Small,6x6,ldrs-rgba-01.png,32.1777,0.0342,0.0261,2.5070 +Small,6x6,ldrs-rgba-02.png,27.8427,0.0429,0.0347,1.8888 +Small,8x8,hdr-rgb-00.hdr,24.1157,0.1613,0.0602,1.0891 +Small,8x8,ldr-rgb-00.png,28.7123,0.0666,0.0551,1.1888 +Small,8x8,ldr-rgb-01.png,28.9240,0.0526,0.0409,1.6037 +Small,8x8,ldr-rgb-02.png,23.1517,0.0604,0.0490,1.3377 +Small,8x8,ldr-rgb-03.png,38.4615,0.0213,0.0099,6.5872 +Small,8x8,ldr-rgb-04.png,29.6546,0.0490,0.0370,1.7691 +Small,8x8,ldr-rgb-05.png,25.9295,0.0691,0.0573,1.1441 +Small,8x8,ldr-rgb-06.png,23.1918,0.0606,0.0487,1.3445 +Small,8x8,ldr-rgb-07.png,30.5823,0.0603,0.0483,1.3562 +Small,8x8,ldr-rgb-08.png,35.7743,0.0279,0.0164,3.9854 +Small,8x8,ldr-rgb-09.png,29.0115,0.0462,0.0349,1.8787 +Small,8x8,ldr-rgb-10.png,32.1619,0.0173,0.0079,2.0601 +Small,8x8,ldr-rgba-00.png,26.3940,0.0774,0.0653,1.0042 +Small,8x8,ldr-rgba-01.png,28.3383,0.0462,0.0344,1.9057 +Small,8x8,ldr-rgba-02.png,23.9368,0.0638,0.0520,1.2615 +Small,8x8,ldr-xy-00.png,34.0144,0.0407,0.0258,2.5434 +Small,8x8,ldr-xy-01.png,34.9127,0.0399,0.0253,2.5945 +Small,8x8,ldr-xy-02.png,41.7218,0.0294,0.0149,4.4103 +Small,8x8,ldrs-rgba-00.png,26.3943,0.0772,0.0650,1.0086 +Small,8x8,ldrs-rgba-01.png,28.3412,0.0461,0.0342,1.9175 +Small,8x8,ldrs-rgba-02.png,23.9363,0.0636,0.0517,1.2675 +Small,12x12,hdr-rgb-00.hdr,20.7645,0.1928,0.0827,0.7929 +Small,12x12,ldr-rgb-00.png,24.6670,0.0831,0.0623,1.0517 +Small,12x12,ldr-rgb-01.png,25.0227,0.0712,0.0510,1.2862 +Small,12x12,ldr-rgb-02.png,19.2621,0.0955,0.0756,0.8669 +Small,12x12,ldr-rgb-03.png,34.9308,0.0305,0.0109,6.0075 +Small,12x12,ldr-rgb-04.png,24.9126,0.0670,0.0469,1.3980 +Small,12x12,ldr-rgb-05.png,21.6505,0.0964,0.0764,0.8583 +Small,12x12,ldr-rgb-06.png,19.2451,0.0915,0.0714,0.9175 +Small,12x12,ldr-rgb-07.png,26.5693,0.0706,0.0498,1.3148 +Small,12x12,ldr-rgb-08.png,31.4927,0.0382,0.0180,3.6358 +Small,12x12,ldr-rgb-09.png,24.1078,0.0676,0.0473,1.3847 +Small,12x12,ldr-rgb-10.png,27.9831,0.0338,0.0165,0.9835 +Small,12x12,ldr-rgba-00.png,22.0878,0.0937,0.0732,0.8949 +Small,12x12,ldr-rgba-01.png,24.6267,0.0690,0.0488,1.3428 +Small,12x12,ldr-rgba-02.png,20.1804,0.1020,0.0817,0.8026 +Small,12x12,ldr-xy-00.png,30.0722,0.0538,0.0297,2.2065 +Small,12x12,ldr-xy-01.png,31.8391,0.0525,0.0286,2.2878 +Small,12x12,ldr-xy-02.png,38.5216,0.0303,0.0059,11.1571 +Small,12x12,ldrs-rgba-00.png,22.0882,0.0937,0.0732,0.8947 +Small,12x12,ldrs-rgba-01.png,24.6285,0.0683,0.0480,1.3639 +Small,12x12,ldrs-rgba-02.png,20.1803,0.1013,0.0808,0.8107 +Small,3x3x3,ldr-l-00-3.dds,51.9681,0.0294,0.0215,12.1848 +Small,3x3x3,ldr-l-01-3.dds,54.3395,0.0116,0.0067,10.3175 +Small,6x6x6,ldr-l-00-3.dds,32.9129,0.0970,0.0737,3.5555 +Small,6x6x6,ldr-l-01-3.dds,40.8871,0.0435,0.0234,2.9516 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse4.1_thorough_results.csv new file mode 100644 index 0000000..26148c7 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.6-sse4.1_thorough_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.3787,0.1555,0.0634,1.0332 +Small,4x4,ldr-rgb-00.png,39.1025,0.0752,0.0691,0.9484 +Small,4x4,ldr-rgb-01.png,40.3344,0.0742,0.0683,0.9589 +Small,4x4,ldr-rgb-02.png,35.3612,0.0699,0.0640,1.0247 +Small,4x4,ldr-rgb-03.png,47.6672,0.0694,0.0636,1.0306 +Small,4x4,ldr-rgb-04.png,42.3135,0.0679,0.0619,1.0584 +Small,4x4,ldr-rgb-05.png,37.9467,0.0789,0.0729,0.8994 +Small,4x4,ldr-rgb-06.png,35.4785,0.0645,0.0585,1.1209 +Small,4x4,ldr-rgb-07.png,39.8676,0.0858,0.0794,0.8255 +Small,4x4,ldr-rgb-08.png,45.7996,0.0667,0.0609,1.0756 +Small,4x4,ldr-rgb-09.png,42.2360,0.0729,0.0669,0.9801 +Small,4x4,ldr-rgb-10.png,44.9865,0.0119,0.0083,1.9489 +Small,4x4,ldr-rgba-00.png,36.7341,0.0780,0.0716,0.9154 +Small,4x4,ldr-rgba-01.png,39.0299,0.0642,0.0581,1.1272 +Small,4x4,ldr-rgba-02.png,34.9857,0.0634,0.0572,1.1451 +Small,4x4,ldr-xy-00.png,37.7552,0.0731,0.0650,1.0075 +Small,4x4,ldr-xy-01.png,45.2171,0.0811,0.0737,0.8888 +Small,4x4,ldr-xy-02.png,50.9992,0.0981,0.0901,0.7270 +Small,4x4,ldrs-rgba-00.png,36.7416,0.0786,0.0722,0.9078 +Small,4x4,ldrs-rgba-01.png,39.0514,0.0641,0.0580,1.1298 +Small,4x4,ldrs-rgba-02.png,34.9915,0.0630,0.0568,1.1538 +Small,5x5,hdr-rgb-00.hdr,30.2499,0.1753,0.0809,0.8100 +Small,5x5,ldr-rgb-00.png,35.3184,0.0958,0.0883,0.7425 +Small,5x5,ldr-rgb-01.png,36.4942,0.0921,0.0847,0.7736 +Small,5x5,ldr-rgb-02.png,31.1169,0.0866,0.0792,0.8277 +Small,5x5,ldr-rgb-03.png,44.4730,0.0843,0.0772,0.8493 +Small,5x5,ldr-rgb-04.png,37.8145,0.0865,0.0789,0.8306 +Small,5x5,ldr-rgb-05.png,33.6567,0.0988,0.0914,0.7172 +Small,5x5,ldr-rgb-06.png,31.1197,0.0829,0.0752,0.8715 +Small,5x5,ldr-rgb-07.png,36.7056,0.1097,0.1016,0.6450 +Small,5x5,ldr-rgb-08.png,42.2684,0.0797,0.0723,0.9063 +Small,5x5,ldr-rgb-09.png,37.6844,0.0903,0.0829,0.7904 +Small,5x5,ldr-rgb-10.png,40.6793,0.0164,0.0114,1.4257 +Small,5x5,ldr-rgba-00.png,33.1233,0.1005,0.0925,0.7086 +Small,5x5,ldr-rgba-01.png,35.3456,0.0816,0.0738,0.8876 +Small,5x5,ldr-rgba-02.png,31.1599,0.0814,0.0737,0.8890 +Small,5x5,ldr-xy-00.png,37.2902,0.0831,0.0736,0.8909 +Small,5x5,ldr-xy-01.png,41.5197,0.1024,0.0933,0.7022 +Small,5x5,ldr-xy-02.png,49.2647,0.1145,0.1050,0.6242 +Small,5x5,ldrs-rgba-00.png,33.1269,0.1005,0.0926,0.7079 +Small,5x5,ldrs-rgba-01.png,35.3541,0.0827,0.0751,0.8729 +Small,5x5,ldrs-rgba-02.png,31.1602,0.0827,0.0749,0.8745 +Small,6x6,hdr-rgb-00.hdr,27.6571,0.1910,0.0968,0.6769 +Small,6x6,ldr-rgb-00.png,32.6208,0.1125,0.1043,0.6285 +Small,6x6,ldr-rgb-01.png,33.1469,0.1058,0.0978,0.6699 +Small,6x6,ldr-rgb-02.png,27.4754,0.1029,0.0948,0.6916 +Small,6x6,ldr-rgb-03.png,42.5226,0.0711,0.0632,1.0367 +Small,6x6,ldr-rgb-04.png,34.3223,0.1020,0.0937,0.6992 +Small,6x6,ldr-rgb-05.png,30.2576,0.1151,0.1070,0.6123 +Small,6x6,ldr-rgb-06.png,27.5394,0.0996,0.0913,0.7176 +Small,6x6,ldr-rgb-07.png,34.3854,0.1219,0.1130,0.5801 +Small,6x6,ldr-rgb-08.png,39.8830,0.0697,0.0618,1.0599 +Small,6x6,ldr-rgb-09.png,33.7955,0.0983,0.0903,0.7254 +Small,6x6,ldr-rgb-10.png,37.1039,0.0211,0.0156,1.0417 +Small,6x6,ldr-rgba-00.png,30.5063,0.1194,0.1108,0.5916 +Small,6x6,ldr-rgba-01.png,32.2316,0.1000,0.0916,0.7156 +Small,6x6,ldr-rgba-02.png,27.8753,0.1032,0.0949,0.6908 +Small,6x6,ldr-xy-00.png,36.3838,0.0726,0.0626,1.0473 +Small,6x6,ldr-xy-01.png,38.0617,0.1050,0.0951,0.6890 +Small,6x6,ldr-xy-02.png,47.4738,0.1331,0.1227,0.5340 +Small,6x6,ldrs-rgba-00.png,30.5081,0.1272,0.1186,0.5527 +Small,6x6,ldrs-rgba-01.png,32.2377,0.1047,0.0960,0.6830 +Small,6x6,ldrs-rgba-02.png,27.8745,0.1060,0.0971,0.6753 +Small,8x8,hdr-rgb-00.hdr,24.3160,0.2350,0.1290,0.5078 +Small,8x8,ldr-rgb-00.png,28.9377,0.1472,0.1338,0.4898 +Small,8x8,ldr-rgb-01.png,28.9883,0.1339,0.1207,0.5429 +Small,8x8,ldr-rgb-02.png,23.1866,0.1399,0.1268,0.5167 +Small,8x8,ldr-rgb-03.png,39.3501,0.0476,0.0349,1.8782 +Small,8x8,ldr-rgb-04.png,29.7749,0.1248,0.1113,0.5889 +Small,8x8,ldr-rgb-05.png,26.0242,0.1454,0.1320,0.4966 +Small,8x8,ldr-rgb-06.png,23.2335,0.1378,0.1244,0.5269 +Small,8x8,ldr-rgb-07.png,31.1039,0.1397,0.1260,0.5202 +Small,8x8,ldr-rgb-08.png,36.4625,0.0694,0.0563,1.1645 +Small,8x8,ldr-rgb-09.png,29.1520,0.1056,0.0925,0.7082 +Small,8x8,ldr-rgb-10.png,32.3031,0.0311,0.0203,0.7995 +Small,8x8,ldr-rgba-00.png,26.6704,0.1556,0.1416,0.4628 +Small,8x8,ldr-rgba-01.png,28.3932,0.1236,0.1102,0.5949 +Small,8x8,ldr-rgba-02.png,23.9599,0.1471,0.1334,0.4913 +Small,8x8,ldr-xy-00.png,34.3120,0.0871,0.0717,0.9146 +Small,8x8,ldr-xy-01.png,35.2097,0.0895,0.0744,0.8808 +Small,8x8,ldr-xy-02.png,44.5878,0.1132,0.0978,0.6698 +Small,8x8,ldrs-rgba-00.png,26.6715,0.1570,0.1430,0.4584 +Small,8x8,ldrs-rgba-01.png,28.3959,0.1228,0.1090,0.6010 +Small,8x8,ldrs-rgba-02.png,23.9597,0.1471,0.1338,0.4899 +Small,12x12,hdr-rgb-00.hdr,21.0019,0.2810,0.1700,0.3854 +Small,12x12,ldr-rgb-00.png,25.0133,0.1872,0.1642,0.3991 +Small,12x12,ldr-rgb-01.png,25.1167,0.1575,0.1347,0.4866 +Small,12x12,ldr-rgb-02.png,19.2912,0.1907,0.1677,0.3907 +Small,12x12,ldr-rgb-03.png,36.1206,0.0576,0.0350,1.8725 +Small,12x12,ldr-rgb-04.png,25.0074,0.1572,0.1344,0.4876 +Small,12x12,ldr-rgb-05.png,21.7140,0.1876,0.1645,0.3985 +Small,12x12,ldr-rgb-06.png,19.2810,0.1856,0.1624,0.4036 +Small,12x12,ldr-rgb-07.png,27.0419,0.1702,0.1466,0.4470 +Small,12x12,ldr-rgb-08.png,32.3840,0.0790,0.0561,1.1686 +Small,12x12,ldr-rgb-09.png,24.3053,0.1488,0.1257,0.5213 +Small,12x12,ldr-rgb-10.png,28.1356,0.0548,0.0348,0.4676 +Small,12x12,ldr-rgba-00.png,22.7010,0.2002,0.1765,0.3712 +Small,12x12,ldr-rgba-01.png,24.7078,0.1492,0.1256,0.5219 +Small,12x12,ldr-rgba-02.png,20.1958,0.1957,0.1723,0.3804 +Small,12x12,ldr-xy-00.png,30.5742,0.1175,0.0923,0.7104 +Small,12x12,ldr-xy-01.png,32.1255,0.0886,0.0639,1.0256 +Small,12x12,ldr-xy-02.png,40.3053,0.0645,0.0397,1.6525 +Small,12x12,ldrs-rgba-00.png,22.7006,0.1999,0.1760,0.3723 +Small,12x12,ldrs-rgba-01.png,24.7093,0.1483,0.1249,0.5247 +Small,12x12,ldrs-rgba-02.png,20.1960,0.1979,0.1736,0.3776 +Small,3x3x3,ldr-l-00-3.dds,52.4159,0.0563,0.0484,5.4142 +Small,3x3x3,ldr-l-01-3.dds,55.3973,0.0242,0.0191,3.6079 +Small,6x6x6,ldr-l-00-3.dds,33.2725,0.1434,0.1174,2.2327 +Small,6x6x6,ldr-l-01-3.dds,41.5751,0.0479,0.0245,2.8120 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-avx2_fast_results.csv new file mode 100644 index 0000000..cac5903 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-avx2_fast_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.6884,0.1059,0.0153,4.2895 +Small,4x4,ldr-rgb-00.png,38.1103,0.0142,0.0097,6.7676 +Small,4x4,ldr-rgb-01.png,39.8105,0.0126,0.0081,8.0501 +Small,4x4,ldr-rgb-02.png,35.0374,0.0176,0.0131,4.9898 +Small,4x4,ldr-rgb-03.png,45.9704,0.0076,0.0034,19.3372 +Small,4x4,ldr-rgb-04.png,41.9106,0.0110,0.0064,10.2318 +Small,4x4,ldr-rgb-05.png,37.2317,0.0177,0.0130,5.0385 +Small,4x4,ldr-rgb-06.png,35.2059,0.0167,0.0121,5.4260 +Small,4x4,ldr-rgb-07.png,38.0309,0.0177,0.0131,4.9841 +Small,4x4,ldr-rgb-08.png,43.6358,0.0096,0.0051,12.7975 +Small,4x4,ldr-rgb-09.png,41.8532,0.0111,0.0067,9.8494 +Small,4x4,ldr-rgb-10.png,44.3464,0.0047,0.0019,8.5239 +Small,4x4,ldr-rgba-00.png,35.5175,0.0175,0.0126,5.2175 +Small,4x4,ldr-rgba-01.png,38.7956,0.0131,0.0082,7.9874 +Small,4x4,ldr-rgba-02.png,34.8333,0.0161,0.0112,5.8629 +Small,4x4,ldr-xy-00.png,37.5698,0.0135,0.0063,10.4124 +Small,4x4,ldr-xy-01.png,44.1365,0.0147,0.0073,8.9800 +Small,4x4,ldr-xy-02.png,48.1780,0.0116,0.0046,14.2749 +Small,4x4,ldrs-rgba-00.png,35.5247,0.0174,0.0124,5.2766 +Small,4x4,ldrs-rgba-01.png,38.8141,0.0124,0.0076,8.5690 +Small,4x4,ldrs-rgba-02.png,34.8386,0.0157,0.0108,6.0653 +Small,5x5,hdr-rgb-00.hdr,29.4686,0.1098,0.0171,3.8330 +Small,5x5,ldr-rgb-00.png,34.3042,0.0151,0.0094,6.9630 +Small,5x5,ldr-rgb-01.png,36.1808,0.0123,0.0068,9.6918 +Small,5x5,ldr-rgb-02.png,31.0166,0.0166,0.0111,5.9016 +Small,5x5,ldr-rgb-03.png,42.6231,0.0082,0.0030,22.0431 +Small,5x5,ldr-rgb-04.png,37.2434,0.0113,0.0057,11.4015 +Small,5x5,ldr-rgb-05.png,33.1823,0.0185,0.0129,5.0705 +Small,5x5,ldr-rgb-06.png,31.0249,0.0164,0.0108,6.0653 +Small,5x5,ldr-rgb-07.png,35.1883,0.0162,0.0107,6.1129 +Small,5x5,ldr-rgb-08.png,40.0310,0.0096,0.0042,15.6039 +Small,5x5,ldr-rgb-09.png,37.2810,0.0115,0.0061,10.7119 +Small,5x5,ldr-rgb-10.png,40.1234,0.0055,0.0017,9.5561 +Small,5x5,ldr-rgba-00.png,32.0109,0.0185,0.0129,5.0953 +Small,5x5,ldr-rgba-01.png,35.1435,0.0132,0.0076,8.6402 +Small,5x5,ldr-rgba-02.png,31.1062,0.0167,0.0109,5.9954 +Small,5x5,ldr-xy-00.png,36.7258,0.0135,0.0050,13.2026 +Small,5x5,ldr-xy-01.png,39.8638,0.0141,0.0060,10.8484 +Small,5x5,ldr-xy-02.png,43.9172,0.0121,0.0040,16.2862 +Small,5x5,ldrs-rgba-00.png,32.0134,0.0188,0.0132,4.9615 +Small,5x5,ldrs-rgba-01.png,35.1504,0.0133,0.0077,8.4781 +Small,5x5,ldrs-rgba-02.png,31.1070,0.0171,0.0114,5.7347 +Small,6x6,hdr-rgb-00.hdr,26.9904,0.1127,0.0190,3.4478 +Small,6x6,ldr-rgb-00.png,31.5963,0.0180,0.0119,5.5106 +Small,6x6,ldr-rgb-01.png,32.8896,0.0147,0.0089,7.3430 +Small,6x6,ldr-rgb-02.png,27.4078,0.0194,0.0133,4.9242 +Small,6x6,ldr-rgb-03.png,40.4899,0.0088,0.0031,21.0055 +Small,6x6,ldr-rgb-04.png,33.9065,0.0129,0.0068,9.5984 +Small,6x6,ldr-rgb-05.png,29.9344,0.0223,0.0163,4.0197 +Small,6x6,ldr-rgb-06.png,27.4655,0.0195,0.0135,4.8445 +Small,6x6,ldr-rgb-07.png,32.8824,0.0169,0.0110,5.9626 +Small,6x6,ldr-rgb-08.png,37.6380,0.0101,0.0044,15.0379 +Small,6x6,ldr-rgb-09.png,33.4716,0.0133,0.0073,8.9263 +Small,6x6,ldr-rgb-10.png,36.6590,0.0063,0.0021,7.8724 +Small,6x6,ldr-rgba-00.png,29.5229,0.0218,0.0155,4.2161 +Small,6x6,ldr-rgba-01.png,32.0575,0.0154,0.0092,7.1438 +Small,6x6,ldr-rgba-02.png,27.8295,0.0204,0.0140,4.6649 +Small,6x6,ldr-xy-00.png,35.6842,0.0139,0.0051,12.7898 +Small,6x6,ldr-xy-01.png,37.1053,0.0155,0.0070,9.3091 +Small,6x6,ldr-xy-02.png,41.9446,0.0123,0.0040,16.2823 +Small,6x6,ldrs-rgba-00.png,29.5226,0.0220,0.0159,4.1285 +Small,6x6,ldrs-rgba-01.png,32.0640,0.0153,0.0092,7.1616 +Small,6x6,ldrs-rgba-02.png,27.8292,0.0201,0.0140,4.6761 +Small,8x8,hdr-rgb-00.hdr,23.7216,0.1234,0.0253,2.5952 +Small,8x8,ldr-rgb-00.png,28.0003,0.0252,0.0152,4.3110 +Small,8x8,ldr-rgb-01.png,28.7458,0.0219,0.0121,5.4154 +Small,8x8,ldr-rgb-02.png,23.0940,0.0295,0.0196,3.3503 +Small,8x8,ldr-rgb-03.png,37.2544,0.0132,0.0035,18.8868 +Small,8x8,ldr-rgb-04.png,29.3419,0.0205,0.0105,6.2404 +Small,8x8,ldr-rgb-05.png,25.7784,0.0319,0.0218,3.0091 +Small,8x8,ldr-rgb-06.png,23.1493,0.0298,0.0198,3.3054 +Small,8x8,ldr-rgb-07.png,29.6576,0.0203,0.0106,6.1570 +Small,8x8,ldr-rgb-08.png,34.2223,0.0154,0.0057,11.4552 +Small,8x8,ldr-rgb-09.png,28.6664,0.0216,0.0115,5.6983 +Small,8x8,ldr-rgb-10.png,31.9974,0.0110,0.0027,6.0142 +Small,8x8,ldr-rgba-00.png,25.6264,0.0308,0.0208,3.1449 +Small,8x8,ldr-rgba-01.png,28.2399,0.0229,0.0128,5.1056 +Small,8x8,ldr-rgba-02.png,23.9224,0.0302,0.0201,3.2596 +Small,8x8,ldr-xy-00.png,33.4070,0.0201,0.0068,9.6819 +Small,8x8,ldr-xy-01.png,34.2428,0.0211,0.0084,7.8326 +Small,8x8,ldr-xy-02.png,39.9005,0.0160,0.0032,20.3478 +Small,8x8,ldrs-rgba-00.png,25.6281,0.0307,0.0204,3.2119 +Small,8x8,ldrs-rgba-01.png,28.2419,0.0230,0.0129,5.0997 +Small,8x8,ldrs-rgba-02.png,23.9221,0.0302,0.0200,3.2827 +Small,12x12,hdr-rgb-00.hdr,20.5637,0.1391,0.0339,1.9352 +Small,12x12,ldr-rgb-00.png,23.7858,0.0285,0.0118,5.5643 +Small,12x12,ldr-rgb-01.png,24.7588,0.0249,0.0084,7.8485 +Small,12x12,ldr-rgb-02.png,19.2228,0.0386,0.0219,2.9918 +Small,12x12,ldr-rgb-03.png,33.2364,0.0191,0.0026,24.8331 +Small,12x12,ldr-rgb-04.png,24.5593,0.0250,0.0080,8.1919 +Small,12x12,ldr-rgb-05.png,21.4886,0.0348,0.0183,3.5883 +Small,12x12,ldr-rgb-06.png,19.2115,0.0398,0.0231,2.8360 +Small,12x12,ldr-rgb-07.png,25.3543,0.0242,0.0076,8.6074 +Small,12x12,ldr-rgb-08.png,30.1648,0.0204,0.0037,17.5798 +Small,12x12,ldr-rgb-09.png,23.7104,0.0283,0.0118,5.5370 +Small,12x12,ldr-rgb-10.png,27.3052,0.0179,0.0030,5.4402 +Small,12x12,ldr-rgba-00.png,21.4057,0.0372,0.0205,3.1967 +Small,12x12,ldr-rgba-01.png,24.4919,0.0266,0.0099,6.6279 +Small,12x12,ldr-rgba-02.png,20.1666,0.0435,0.0266,2.4644 +Small,12x12,ldr-xy-00.png,29.0822,0.0274,0.0068,9.6459 +Small,12x12,ldr-xy-01.png,30.5276,0.0270,0.0062,10.6459 +Small,12x12,ldr-xy-02.png,37.9951,0.0223,0.0019,35.0074 +Small,12x12,ldrs-rgba-00.png,21.4085,0.0374,0.0204,3.2203 +Small,12x12,ldrs-rgba-01.png,24.4936,0.0265,0.0097,6.7724 +Small,12x12,ldrs-rgba-02.png,20.1665,0.0437,0.0264,2.4813 +Small,3x3x3,ldr-l-00-3.dds,50.7540,0.0180,0.0115,22.8708 +Small,3x3x3,ldr-l-01-3.dds,53.8676,0.0091,0.0052,13.3282 +Small,6x6x6,ldr-l-00-3.dds,32.5264,0.0626,0.0396,6.6255 +Small,6x6x6,ldr-l-01-3.dds,40.7893,0.0366,0.0161,4.2736 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-avx2_fastest_results.csv new file mode 100644 index 0000000..74cd33a --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-avx2_fastest_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.2999,0.1007,0.0097,6.7814 +Small,4x4,ldr-rgb-00.png,37.0084,0.0097,0.0058,11.3958 +Small,4x4,ldr-rgb-01.png,39.4162,0.0091,0.0053,12.3230 +Small,4x4,ldr-rgb-02.png,34.6448,0.0118,0.0080,8.1663 +Small,4x4,ldr-rgb-03.png,45.3559,0.0061,0.0026,25.1974 +Small,4x4,ldr-rgb-04.png,41.6390,0.0081,0.0042,15.4669 +Small,4x4,ldr-rgb-05.png,36.7213,0.0117,0.0079,8.3072 +Small,4x4,ldr-rgb-06.png,34.6994,0.0112,0.0074,8.9044 +Small,4x4,ldr-rgb-07.png,37.1807,0.0111,0.0074,8.8266 +Small,4x4,ldr-rgb-08.png,42.6915,0.0070,0.0034,19.1967 +Small,4x4,ldr-rgb-09.png,41.6433,0.0081,0.0043,15.2803 +Small,4x4,ldr-rgb-10.png,43.8818,0.0036,0.0015,10.5155 +Small,4x4,ldr-rgba-00.png,34.5762,0.0108,0.0068,9.6081 +Small,4x4,ldr-rgba-01.png,38.5857,0.0099,0.0057,11.5607 +Small,4x4,ldr-rgba-02.png,34.5224,0.0122,0.0081,8.0522 +Small,4x4,ldr-xy-00.png,37.5264,0.0102,0.0042,15.5888 +Small,4x4,ldr-xy-01.png,43.8550,0.0108,0.0049,13.4237 +Small,4x4,ldr-xy-02.png,48.1780,0.0097,0.0037,17.8284 +Small,4x4,ldrs-rgba-00.png,34.5813,0.0111,0.0072,9.1657 +Small,4x4,ldrs-rgba-01.png,38.6025,0.0099,0.0059,11.0628 +Small,4x4,ldrs-rgba-02.png,34.5262,0.0122,0.0080,8.1789 +Small,5x5,hdr-rgb-00.hdr,28.8076,0.1034,0.0107,6.1340 +Small,5x5,ldr-rgb-00.png,33.4493,0.0105,0.0059,11.1323 +Small,5x5,ldr-rgb-01.png,35.9999,0.0096,0.0051,12.9057 +Small,5x5,ldr-rgb-02.png,30.8748,0.0126,0.0081,8.0581 +Small,5x5,ldr-rgb-03.png,42.2547,0.0065,0.0024,27.2832 +Small,5x5,ldr-rgb-04.png,36.9224,0.0093,0.0048,13.5515 +Small,5x5,ldr-rgb-05.png,32.6193,0.0129,0.0084,7.7816 +Small,5x5,ldr-rgb-06.png,30.8713,0.0124,0.0078,8.4375 +Small,5x5,ldr-rgb-07.png,34.2652,0.0115,0.0071,9.2278 +Small,5x5,ldr-rgb-08.png,39.3139,0.0074,0.0031,21.1266 +Small,5x5,ldr-rgb-09.png,36.9835,0.0090,0.0046,14.1304 +Small,5x5,ldr-rgb-10.png,39.7373,0.0044,0.0016,10.0283 +Small,5x5,ldr-rgba-00.png,30.8998,0.0120,0.0072,9.1137 +Small,5x5,ldr-rgba-01.png,34.9859,0.0107,0.0060,10.8755 +Small,5x5,ldr-rgba-02.png,31.0041,0.0135,0.0087,7.5181 +Small,5x5,ldr-xy-00.png,36.5882,0.0111,0.0036,18.1246 +Small,5x5,ldr-xy-01.png,38.8955,0.0113,0.0044,14.9593 +Small,5x5,ldr-xy-02.png,43.7233,0.0106,0.0036,18.1990 +Small,5x5,ldrs-rgba-00.png,30.9019,0.0123,0.0076,8.6778 +Small,5x5,ldrs-rgba-01.png,34.9927,0.0107,0.0058,11.2085 +Small,5x5,ldrs-rgba-02.png,31.0050,0.0137,0.0089,7.3314 +Small,6x6,hdr-rgb-00.hdr,26.7122,0.1022,0.0107,6.1322 +Small,6x6,ldr-rgb-00.png,31.1072,0.0113,0.0064,10.3078 +Small,6x6,ldr-rgb-01.png,32.7949,0.0103,0.0055,11.8405 +Small,6x6,ldr-rgb-02.png,27.3234,0.0136,0.0088,7.4497 +Small,6x6,ldr-rgb-03.png,40.2037,0.0069,0.0024,27.4658 +Small,6x6,ldr-rgb-04.png,33.7349,0.0098,0.0051,12.9239 +Small,6x6,ldr-rgb-05.png,29.5304,0.0140,0.0092,7.1019 +Small,6x6,ldr-rgb-06.png,27.3799,0.0136,0.0088,7.4507 +Small,6x6,ldr-rgb-07.png,32.0586,0.0115,0.0067,9.8227 +Small,6x6,ldr-rgb-08.png,37.0422,0.0077,0.0030,21.6712 +Small,6x6,ldr-rgb-09.png,33.2804,0.0098,0.0049,13.4382 +Small,6x6,ldr-rgb-10.png,36.4903,0.0047,0.0016,10.1538 +Small,6x6,ldr-rgba-00.png,28.6001,0.0128,0.0077,8.5233 +Small,6x6,ldr-rgba-01.png,31.9580,0.0115,0.0065,10.1073 +Small,6x6,ldr-rgba-02.png,27.7590,0.0141,0.0088,7.4269 +Small,6x6,ldr-xy-00.png,35.5363,0.0112,0.0037,17.8527 +Small,6x6,ldr-xy-01.png,36.2504,0.0120,0.0048,13.6816 +Small,6x6,ldr-xy-02.png,41.7327,0.0103,0.0032,20.5824 +Small,6x6,ldrs-rgba-00.png,28.6013,0.0129,0.0079,8.3390 +Small,6x6,ldrs-rgba-01.png,31.9643,0.0115,0.0064,10.2398 +Small,6x6,ldrs-rgba-02.png,27.7566,0.0140,0.0090,7.2648 +Small,8x8,hdr-rgb-00.hdr,23.5547,0.1124,0.0158,4.1407 +Small,8x8,ldr-rgb-00.png,27.6456,0.0177,0.0094,6.9920 +Small,8x8,ldr-rgb-01.png,28.6671,0.0165,0.0082,8.0107 +Small,8x8,ldr-rgb-02.png,23.0190,0.0217,0.0132,4.9499 +Small,8x8,ldr-rgb-03.png,37.0089,0.0109,0.0030,21.7089 +Small,8x8,ldr-rgb-04.png,29.0953,0.0157,0.0075,8.7708 +Small,8x8,ldr-rgb-05.png,25.5435,0.0216,0.0134,4.8726 +Small,8x8,ldr-rgb-06.png,23.0560,0.0215,0.0132,4.9762 +Small,8x8,ldr-rgb-07.png,29.3465,0.0158,0.0077,8.5368 +Small,8x8,ldr-rgb-08.png,33.8252,0.0118,0.0038,17.4437 +Small,8x8,ldr-rgb-09.png,28.4590,0.0156,0.0075,8.7874 +Small,8x8,ldr-rgb-10.png,31.8847,0.0088,0.0022,7.3687 +Small,8x8,ldr-rgba-00.png,25.1939,0.0204,0.0121,5.4122 +Small,8x8,ldr-rgba-01.png,28.1422,0.0171,0.0087,7.5528 +Small,8x8,ldr-rgba-02.png,23.8673,0.0222,0.0138,4.7322 +Small,8x8,ldr-xy-00.png,33.2085,0.0164,0.0050,13.0602 +Small,8x8,ldr-xy-01.png,33.9809,0.0170,0.0060,10.9815 +Small,8x8,ldr-xy-02.png,39.7786,0.0137,0.0027,23.9107 +Small,8x8,ldrs-rgba-00.png,25.1942,0.0204,0.0120,5.4673 +Small,8x8,ldrs-rgba-01.png,28.1449,0.0175,0.0090,7.2439 +Small,8x8,ldrs-rgba-02.png,23.8668,0.0222,0.0135,4.8567 +Small,12x12,hdr-rgb-00.hdr,20.4789,0.1217,0.0208,3.1544 +Small,12x12,ldr-rgb-00.png,23.6718,0.0208,0.0082,8.0060 +Small,12x12,ldr-rgb-01.png,24.7037,0.0185,0.0061,10.6807 +Small,12x12,ldr-rgb-02.png,19.1880,0.0273,0.0147,4.4492 +Small,12x12,ldr-rgb-03.png,33.1400,0.0148,0.0027,24.2440 +Small,12x12,ldr-rgb-04.png,24.3884,0.0187,0.0063,10.3501 +Small,12x12,ldr-rgb-05.png,21.3725,0.0249,0.0121,5.4123 +Small,12x12,ldr-rgb-06.png,19.1568,0.0282,0.0158,4.1539 +Small,12x12,ldr-rgb-07.png,25.2598,0.0183,0.0060,11.0070 +Small,12x12,ldr-rgb-08.png,30.0404,0.0155,0.0031,21.3830 +Small,12x12,ldr-rgb-09.png,23.5941,0.0208,0.0081,8.0461 +Small,12x12,ldr-rgb-10.png,27.2554,0.0132,0.0024,6.6513 +Small,12x12,ldr-rgba-00.png,21.2134,0.0257,0.0131,4.9890 +Small,12x12,ldr-rgba-01.png,24.4330,0.0201,0.0076,8.6677 +Small,12x12,ldr-rgba-02.png,20.1369,0.0313,0.0183,3.5781 +Small,12x12,ldr-xy-00.png,29.0083,0.0216,0.0056,11.7680 +Small,12x12,ldr-xy-01.png,29.7048,0.0207,0.0047,13.8940 +Small,12x12,ldr-xy-02.png,37.9716,0.0175,0.0017,38.2359 +Small,12x12,ldrs-rgba-00.png,21.2142,0.0258,0.0132,4.9675 +Small,12x12,ldrs-rgba-01.png,24.4339,0.0200,0.0071,9.2396 +Small,12x12,ldrs-rgba-02.png,20.1366,0.0313,0.0185,3.5364 +Small,3x3x3,ldr-l-00-3.dds,50.6008,0.0160,0.0103,25.3425 +Small,3x3x3,ldr-l-01-3.dds,53.7999,0.0077,0.0045,15.3772 +Small,6x6x6,ldr-l-00-3.dds,32.5074,0.0597,0.0390,6.7179 +Small,6x6x6,ldr-l-01-3.dds,40.7826,0.0340,0.0158,4.3547 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-avx2_medium_results.csv new file mode 100644 index 0000000..92a3d66 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-avx2_medium_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1340,0.1181,0.0260,2.5182 +Small,4x4,ldr-rgb-00.png,38.7318,0.0320,0.0266,2.4660 +Small,4x4,ldr-rgb-01.png,40.1460,0.0300,0.0247,2.6521 +Small,4x4,ldr-rgb-02.png,35.2180,0.0325,0.0265,2.4710 +Small,4x4,ldr-rgb-03.png,47.1925,0.0190,0.0136,4.8323 +Small,4x4,ldr-rgb-04.png,42.1729,0.0256,0.0200,3.2750 +Small,4x4,ldr-rgb-05.png,37.7672,0.0330,0.0276,2.3732 +Small,4x4,ldr-rgb-06.png,35.3468,0.0277,0.0223,2.9369 +Small,4x4,ldr-rgb-07.png,39.2464,0.0378,0.0326,2.0133 +Small,4x4,ldr-rgb-08.png,45.1731,0.0214,0.0164,4.0000 +Small,4x4,ldr-rgb-09.png,42.0914,0.0258,0.0205,3.2002 +Small,4x4,ldr-rgb-10.png,44.8767,0.0070,0.0034,4.7270 +Small,4x4,ldr-rgba-00.png,36.2349,0.0346,0.0292,2.2455 +Small,4x4,ldr-rgba-01.png,38.8941,0.0222,0.0167,3.9199 +Small,4x4,ldr-rgba-02.png,34.9204,0.0246,0.0190,3.4406 +Small,4x4,ldr-xy-00.png,37.7447,0.0229,0.0159,4.1184 +Small,4x4,ldr-xy-01.png,45.1463,0.0314,0.0246,2.6670 +Small,4x4,ldr-xy-02.png,50.9227,0.0372,0.0302,2.1705 +Small,4x4,ldrs-rgba-00.png,36.2418,0.0349,0.0294,2.2274 +Small,4x4,ldrs-rgba-01.png,38.9101,0.0224,0.0168,3.8926 +Small,4x4,ldrs-rgba-02.png,34.9259,0.0249,0.0192,3.4070 +Small,5x5,hdr-rgb-00.hdr,29.8514,0.1255,0.0324,2.0242 +Small,5x5,ldr-rgb-00.png,35.0732,0.0370,0.0300,2.1857 +Small,5x5,ldr-rgb-01.png,36.3975,0.0313,0.0244,2.6862 +Small,5x5,ldr-rgb-02.png,31.0676,0.0328,0.0258,2.5415 +Small,5x5,ldr-rgb-03.png,43.9478,0.0154,0.0087,7.5528 +Small,5x5,ldr-rgb-04.png,37.6668,0.0290,0.0222,2.9460 +Small,5x5,ldr-rgb-05.png,33.5193,0.0412,0.0342,1.9163 +Small,5x5,ldr-rgb-06.png,31.0778,0.0311,0.0240,2.7266 +Small,5x5,ldr-rgb-07.png,36.2042,0.0439,0.0367,1.7851 +Small,5x5,ldr-rgb-08.png,41.5462,0.0221,0.0155,4.2284 +Small,5x5,ldr-rgb-09.png,37.5873,0.0273,0.0205,3.1902 +Small,5x5,ldr-rgb-10.png,40.4902,0.0092,0.0039,4.1910 +Small,5x5,ldr-rgba-00.png,32.7845,0.0436,0.0364,1.7998 +Small,5x5,ldr-rgba-01.png,35.2722,0.0261,0.0188,3.4769 +Small,5x5,ldr-rgba-02.png,31.1225,0.0304,0.0231,2.8369 +Small,5x5,ldr-xy-00.png,37.0726,0.0242,0.0155,4.2181 +Small,5x5,ldr-xy-01.png,40.7212,0.0313,0.0228,2.8773 +Small,5x5,ldr-xy-02.png,49.0674,0.0248,0.0161,4.0582 +Small,5x5,ldrs-rgba-00.png,32.7875,0.0437,0.0365,1.7960 +Small,5x5,ldrs-rgba-01.png,35.2789,0.0262,0.0191,3.4330 +Small,5x5,ldrs-rgba-02.png,31.1234,0.0307,0.0234,2.8059 +Small,6x6,hdr-rgb-00.hdr,27.4769,0.1303,0.0354,1.8537 +Small,6x6,ldr-rgb-00.png,32.3560,0.0383,0.0307,2.1338 +Small,6x6,ldr-rgb-01.png,33.0687,0.0318,0.0244,2.6868 +Small,6x6,ldr-rgb-02.png,27.4390,0.0348,0.0273,2.4033 +Small,6x6,ldr-rgb-03.png,41.6538,0.0141,0.0068,9.6236 +Small,6x6,ldr-rgb-04.png,34.2059,0.0285,0.0212,3.0884 +Small,6x6,ldr-rgb-05.png,30.1377,0.0437,0.0363,1.8059 +Small,6x6,ldr-rgb-06.png,27.5024,0.0341,0.0266,2.4657 +Small,6x6,ldr-rgb-07.png,33.8577,0.0413,0.0340,1.9293 +Small,6x6,ldr-rgb-08.png,39.0752,0.0186,0.0114,5.7529 +Small,6x6,ldr-rgb-09.png,33.6699,0.0282,0.0206,3.1803 +Small,6x6,ldr-rgb-10.png,36.9333,0.0105,0.0048,3.3853 +Small,6x6,ldr-rgba-00.png,30.2619,0.0477,0.0400,1.6375 +Small,6x6,ldr-rgba-01.png,32.1735,0.0273,0.0196,3.3352 +Small,6x6,ldr-rgba-02.png,27.8421,0.0339,0.0261,2.5126 +Small,6x6,ldr-xy-00.png,36.2566,0.0231,0.0136,4.8138 +Small,6x6,ldr-xy-01.png,37.7340,0.0257,0.0166,3.9434 +Small,6x6,ldr-xy-02.png,46.0639,0.0202,0.0111,5.9143 +Small,6x6,ldrs-rgba-00.png,30.2627,0.0479,0.0403,1.6256 +Small,6x6,ldrs-rgba-01.png,32.1795,0.0274,0.0198,3.3115 +Small,6x6,ldrs-rgba-02.png,27.8421,0.0340,0.0262,2.4969 +Small,8x8,hdr-rgb-00.hdr,24.1157,0.1434,0.0441,1.4871 +Small,8x8,ldr-rgb-00.png,28.7156,0.0515,0.0402,1.6302 +Small,8x8,ldr-rgb-01.png,28.9240,0.0408,0.0299,2.1930 +Small,8x8,ldr-rgb-02.png,23.1515,0.0470,0.0360,1.8203 +Small,8x8,ldr-rgb-03.png,38.4615,0.0187,0.0079,8.3092 +Small,8x8,ldr-rgb-04.png,29.6531,0.0383,0.0272,2.4062 +Small,8x8,ldr-rgb-05.png,25.9297,0.0532,0.0420,1.5613 +Small,8x8,ldr-rgb-06.png,23.1926,0.0470,0.0355,1.8436 +Small,8x8,ldr-rgb-07.png,30.5823,0.0467,0.0354,1.8501 +Small,8x8,ldr-rgb-08.png,35.7743,0.0237,0.0127,5.1652 +Small,8x8,ldr-rgb-09.png,29.0113,0.0370,0.0258,2.5366 +Small,8x8,ldr-rgb-10.png,32.1619,0.0157,0.0061,2.6519 +Small,8x8,ldr-rgba-00.png,26.4317,0.0591,0.0481,1.3629 +Small,8x8,ldr-rgba-01.png,28.3388,0.0367,0.0253,2.5895 +Small,8x8,ldr-rgba-02.png,23.9365,0.0496,0.0381,1.7219 +Small,8x8,ldr-xy-00.png,34.0144,0.0341,0.0198,3.3044 +Small,8x8,ldr-xy-01.png,34.9127,0.0333,0.0194,3.3754 +Small,8x8,ldr-xy-02.png,41.7218,0.0251,0.0109,5.9965 +Small,8x8,ldrs-rgba-00.png,26.4317,0.0598,0.0484,1.3528 +Small,8x8,ldrs-rgba-01.png,28.3416,0.0366,0.0251,2.6078 +Small,8x8,ldrs-rgba-02.png,23.9360,0.0496,0.0382,1.7175 +Small,12x12,hdr-rgb-00.hdr,20.7645,0.1702,0.0611,1.0720 +Small,12x12,ldr-rgb-00.png,24.6914,0.0661,0.0468,1.4004 +Small,12x12,ldr-rgb-01.png,25.0227,0.0569,0.0377,1.7373 +Small,12x12,ldr-rgb-02.png,19.2638,0.0745,0.0550,1.1913 +Small,12x12,ldr-rgb-03.png,34.9308,0.0277,0.0084,7.7586 +Small,12x12,ldr-rgb-04.png,24.9112,0.0535,0.0345,1.9003 +Small,12x12,ldr-rgb-05.png,21.6503,0.0758,0.0563,1.1638 +Small,12x12,ldr-rgb-06.png,19.2463,0.0721,0.0523,1.2531 +Small,12x12,ldr-rgb-07.png,26.5698,0.0563,0.0368,1.7831 +Small,12x12,ldr-rgb-08.png,31.5209,0.0334,0.0139,4.7253 +Small,12x12,ldr-rgb-09.png,24.1037,0.0550,0.0359,1.8266 +Small,12x12,ldr-rgb-10.png,27.9966,0.0303,0.0127,1.2781 +Small,12x12,ldr-rgba-00.png,22.1195,0.0739,0.0542,1.2088 +Small,12x12,ldr-rgba-01.png,24.6314,0.0547,0.0350,1.8731 +Small,12x12,ldr-rgba-02.png,20.1799,0.0789,0.0591,1.1087 +Small,12x12,ldr-xy-00.png,30.0722,0.0463,0.0226,2.8982 +Small,12x12,ldr-xy-01.png,31.8391,0.0447,0.0216,3.0304 +Small,12x12,ldr-xy-02.png,38.5216,0.0285,0.0056,11.6444 +Small,12x12,ldrs-rgba-00.png,22.1198,0.0740,0.0542,1.2082 +Small,12x12,ldrs-rgba-01.png,24.6333,0.0547,0.0350,1.8711 +Small,12x12,ldrs-rgba-02.png,20.1799,0.0794,0.0597,1.0970 +Small,3x3x3,ldr-l-00-3.dds,51.9667,0.0245,0.0170,15.3823 +Small,3x3x3,ldr-l-01-3.dds,54.3395,0.0102,0.0052,13.2518 +Small,6x6x6,ldr-l-00-3.dds,32.9251,0.0728,0.0498,5.2680 +Small,6x6x6,ldr-l-01-3.dds,40.8871,0.0368,0.0167,4.1320 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-avx2_thorough_results.csv new file mode 100644 index 0000000..0f3e3e0 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-avx2_thorough_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.3787,0.1451,0.0528,1.2401 +Small,4x4,ldr-rgb-00.png,39.1025,0.0630,0.0575,1.1403 +Small,4x4,ldr-rgb-01.png,40.3344,0.0634,0.0579,1.1323 +Small,4x4,ldr-rgb-02.png,35.3612,0.0590,0.0534,1.2276 +Small,4x4,ldr-rgb-03.png,47.6672,0.0578,0.0526,1.2467 +Small,4x4,ldr-rgb-04.png,42.3135,0.0570,0.0516,1.2704 +Small,4x4,ldr-rgb-05.png,37.9467,0.0656,0.0601,1.0909 +Small,4x4,ldr-rgb-06.png,35.4785,0.0547,0.0491,1.3337 +Small,4x4,ldr-rgb-07.png,39.8676,0.0707,0.0653,1.0032 +Small,4x4,ldr-rgb-08.png,45.7996,0.0544,0.0492,1.3313 +Small,4x4,ldr-rgb-09.png,42.2360,0.0604,0.0550,1.1921 +Small,4x4,ldr-rgb-10.png,44.9865,0.0107,0.0070,2.3163 +Small,4x4,ldr-rgba-00.png,36.7343,0.0648,0.0593,1.1060 +Small,4x4,ldr-rgba-01.png,39.0299,0.0534,0.0477,1.3739 +Small,4x4,ldr-rgba-02.png,34.9857,0.0525,0.0468,1.4012 +Small,4x4,ldr-xy-00.png,37.7553,0.0618,0.0548,1.1964 +Small,4x4,ldr-xy-01.png,45.2160,0.0695,0.0627,1.0458 +Small,4x4,ldr-xy-02.png,50.9992,0.0832,0.0761,0.8613 +Small,4x4,ldrs-rgba-00.png,36.7417,0.0653,0.0597,1.0978 +Small,4x4,ldrs-rgba-01.png,39.0514,0.0541,0.0485,1.3526 +Small,4x4,ldrs-rgba-02.png,34.9915,0.0527,0.0470,1.3943 +Small,5x5,hdr-rgb-00.hdr,30.2499,0.1583,0.0633,1.0354 +Small,5x5,ldr-rgb-00.png,35.3184,0.0758,0.0686,0.9551 +Small,5x5,ldr-rgb-01.png,36.4942,0.0730,0.0660,0.9935 +Small,5x5,ldr-rgb-02.png,31.1180,0.0682,0.0613,1.0695 +Small,5x5,ldr-rgb-03.png,44.4730,0.0666,0.0598,1.0966 +Small,5x5,ldr-rgb-04.png,37.8146,0.0683,0.0612,1.0707 +Small,5x5,ldr-rgb-05.png,33.6567,0.0782,0.0711,0.9221 +Small,5x5,ldr-rgb-06.png,31.1202,0.0659,0.0589,1.1132 +Small,5x5,ldr-rgb-07.png,36.7056,0.0865,0.0795,0.8248 +Small,5x5,ldr-rgb-08.png,42.2683,0.0640,0.0572,1.1458 +Small,5x5,ldr-rgb-09.png,37.6844,0.0714,0.0645,1.0155 +Small,5x5,ldr-rgb-10.png,40.6793,0.0145,0.0092,1.7614 +Small,5x5,ldr-rgba-00.png,33.1193,0.0801,0.0731,0.8970 +Small,5x5,ldr-rgba-01.png,35.3456,0.0654,0.0581,1.1290 +Small,5x5,ldr-rgba-02.png,31.1599,0.0656,0.0582,1.1269 +Small,5x5,ldr-xy-00.png,37.2903,0.0677,0.0589,1.1117 +Small,5x5,ldr-xy-01.png,41.5203,0.0828,0.0741,0.8840 +Small,5x5,ldr-xy-02.png,49.2640,0.0925,0.0838,0.7824 +Small,5x5,ldrs-rgba-00.png,33.1229,0.0802,0.0730,0.8977 +Small,5x5,ldrs-rgba-01.png,35.3541,0.0657,0.0584,1.1218 +Small,5x5,ldrs-rgba-02.png,31.1602,0.0660,0.0585,1.1195 +Small,6x6,hdr-rgb-00.hdr,27.6571,0.1680,0.0735,0.8919 +Small,6x6,ldr-rgb-00.png,32.6208,0.0874,0.0794,0.8256 +Small,6x6,ldr-rgb-01.png,33.1469,0.0820,0.0745,0.8802 +Small,6x6,ldr-rgb-02.png,27.4754,0.0788,0.0712,0.9203 +Small,6x6,ldr-rgb-03.png,42.5226,0.0558,0.0486,1.3493 +Small,6x6,ldr-rgb-04.png,34.3223,0.0770,0.0695,0.9428 +Small,6x6,ldr-rgb-05.png,30.2576,0.0892,0.0817,0.8026 +Small,6x6,ldr-rgb-06.png,27.5390,0.0768,0.0692,0.9472 +Small,6x6,ldr-rgb-07.png,34.3854,0.0919,0.0842,0.7781 +Small,6x6,ldr-rgb-08.png,39.8830,0.0552,0.0478,1.3721 +Small,6x6,ldr-rgb-09.png,33.7955,0.0750,0.0675,0.9712 +Small,6x6,ldr-rgb-10.png,37.1039,0.0180,0.0121,1.3477 +Small,6x6,ldr-rgba-00.png,30.5113,0.0925,0.0847,0.7742 +Small,6x6,ldr-rgba-01.png,32.2316,0.0770,0.0691,0.9482 +Small,6x6,ldr-rgba-02.png,27.8753,0.0800,0.0720,0.9099 +Small,6x6,ldr-xy-00.png,36.3804,0.0564,0.0470,1.3929 +Small,6x6,ldr-xy-01.png,38.0614,0.0811,0.0718,0.9129 +Small,6x6,ldr-xy-02.png,47.4738,0.0992,0.0898,0.7297 +Small,6x6,ldrs-rgba-00.png,30.5130,0.0932,0.0854,0.7672 +Small,6x6,ldrs-rgba-01.png,32.2377,0.0774,0.0696,0.9414 +Small,6x6,ldrs-rgba-02.png,27.8745,0.0800,0.0721,0.9094 +Small,8x8,hdr-rgb-00.hdr,24.3160,0.1942,0.0948,0.6917 +Small,8x8,ldr-rgb-00.png,28.9383,0.1119,0.0989,0.6629 +Small,8x8,ldr-rgb-01.png,28.9883,0.0999,0.0873,0.7511 +Small,8x8,ldr-rgb-02.png,23.1859,0.1054,0.0924,0.7095 +Small,8x8,ldr-rgb-03.png,39.3501,0.0387,0.0263,2.4886 +Small,8x8,ldr-rgb-04.png,29.7733,0.0937,0.0808,0.8107 +Small,8x8,ldr-rgb-05.png,26.0247,0.1092,0.0965,0.6789 +Small,8x8,ldr-rgb-06.png,23.2333,0.1041,0.0913,0.7182 +Small,8x8,ldr-rgb-07.png,31.1039,0.1051,0.0922,0.7112 +Small,8x8,ldr-rgb-08.png,36.4625,0.0539,0.0414,1.5847 +Small,8x8,ldr-rgb-09.png,29.1557,0.0796,0.0670,0.9784 +Small,8x8,ldr-rgb-10.png,32.3031,0.0264,0.0154,1.0568 +Small,8x8,ldr-rgba-00.png,26.6905,0.1183,0.1054,0.6218 +Small,8x8,ldr-rgba-01.png,28.3935,0.0936,0.0804,0.8148 +Small,8x8,ldr-rgba-02.png,23.9597,0.1104,0.0974,0.6726 +Small,8x8,ldr-xy-00.png,34.3120,0.0681,0.0534,1.2267 +Small,8x8,ldr-xy-01.png,35.2097,0.0697,0.0554,1.1832 +Small,8x8,ldr-xy-02.png,44.5878,0.0878,0.0732,0.8949 +Small,8x8,ldrs-rgba-00.png,26.6912,0.1183,0.1052,0.6228 +Small,8x8,ldrs-rgba-01.png,28.3962,0.0933,0.0802,0.8170 +Small,8x8,ldrs-rgba-02.png,23.9595,0.1110,0.0980,0.6687 +Small,12x12,hdr-rgb-00.hdr,21.0023,0.2343,0.1239,0.5290 +Small,12x12,ldr-rgb-00.png,25.0193,0.1431,0.1202,0.5452 +Small,12x12,ldr-rgb-01.png,25.1167,0.1206,0.0980,0.6691 +Small,12x12,ldr-rgb-02.png,19.2919,0.1441,0.1212,0.5407 +Small,12x12,ldr-rgb-03.png,36.1206,0.0486,0.0263,2.4947 +Small,12x12,ldr-rgb-04.png,25.0063,0.1191,0.0965,0.6789 +Small,12x12,ldr-rgb-05.png,21.7165,0.1433,0.1207,0.5431 +Small,12x12,ldr-rgb-06.png,19.2807,0.1394,0.1168,0.5610 +Small,12x12,ldr-rgb-07.png,27.0419,0.1300,0.1070,0.6127 +Small,12x12,ldr-rgb-08.png,32.3840,0.0645,0.0421,1.5559 +Small,12x12,ldr-rgb-09.png,24.3010,0.1145,0.0916,0.7155 +Small,12x12,ldr-rgb-10.png,28.1496,0.0463,0.0257,0.6317 +Small,12x12,ldr-rgba-00.png,22.7076,0.1526,0.1303,0.5030 +Small,12x12,ldr-rgba-01.png,24.7112,0.1131,0.0903,0.7261 +Small,12x12,ldr-rgba-02.png,20.1958,0.1478,0.1251,0.5240 +Small,12x12,ldr-xy-00.png,30.5742,0.0923,0.0678,0.9672 +Small,12x12,ldr-xy-01.png,32.1254,0.0713,0.0469,1.3960 +Small,12x12,ldr-xy-02.png,40.3053,0.0539,0.0294,2.2287 +Small,12x12,ldrs-rgba-00.png,22.7071,0.1532,0.1302,0.5034 +Small,12x12,ldrs-rgba-01.png,24.7127,0.1140,0.0913,0.7179 +Small,12x12,ldrs-rgba-02.png,20.1960,0.1489,0.1259,0.5205 +Small,3x3x3,ldr-l-00-3.dds,52.4155,0.0457,0.0383,6.8420 +Small,3x3x3,ldr-l-01-3.dds,55.3973,0.0202,0.0152,4.5411 +Small,6x6x6,ldr-l-00-3.dds,33.2725,0.1071,0.0813,3.2251 +Small,6x6x6,ldr-l-01-3.dds,41.5751,0.0413,0.0182,3.7909 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse2_fast_results.csv new file mode 100644 index 0000000..2f9668d --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse2_fast_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.6884,0.1110,0.0192,3.4115 +Small,4x4,ldr-rgb-00.png,38.1103,0.0172,0.0123,5.3281 +Small,4x4,ldr-rgb-01.png,39.8105,0.0148,0.0103,6.3781 +Small,4x4,ldr-rgb-02.png,35.0374,0.0211,0.0165,3.9735 +Small,4x4,ldr-rgb-03.png,45.9704,0.0085,0.0042,15.7271 +Small,4x4,ldr-rgb-04.png,41.9106,0.0118,0.0072,9.0719 +Small,4x4,ldr-rgb-05.png,37.2317,0.0204,0.0158,4.1387 +Small,4x4,ldr-rgb-06.png,35.2059,0.0198,0.0152,4.3176 +Small,4x4,ldr-rgb-07.png,38.0309,0.0207,0.0162,4.0492 +Small,4x4,ldr-rgb-08.png,43.6358,0.0105,0.0062,10.6513 +Small,4x4,ldr-rgb-09.png,41.8532,0.0122,0.0078,8.4043 +Small,4x4,ldr-rgb-10.png,44.3464,0.0047,0.0020,8.2806 +Small,4x4,ldr-rgba-00.png,35.5175,0.0204,0.0157,4.1756 +Small,4x4,ldr-rgba-01.png,38.7956,0.0144,0.0098,6.6976 +Small,4x4,ldr-rgba-02.png,34.8333,0.0187,0.0139,4.7257 +Small,4x4,ldr-xy-00.png,37.5698,0.0141,0.0073,8.9616 +Small,4x4,ldr-xy-01.png,44.1365,0.0155,0.0088,7.4592 +Small,4x4,ldr-xy-02.png,48.1780,0.0124,0.0054,12.1498 +Small,4x4,ldrs-rgba-00.png,35.5247,0.0204,0.0157,4.1847 +Small,4x4,ldrs-rgba-01.png,38.8141,0.0145,0.0097,6.7619 +Small,4x4,ldrs-rgba-02.png,34.8386,0.0188,0.0140,4.6871 +Small,5x5,hdr-rgb-00.hdr,29.4686,0.1164,0.0233,2.8139 +Small,5x5,ldr-rgb-00.png,34.3042,0.0182,0.0125,5.2312 +Small,5x5,ldr-rgb-01.png,36.1808,0.0149,0.0094,6.9846 +Small,5x5,ldr-rgb-02.png,31.0166,0.0211,0.0154,4.2509 +Small,5x5,ldr-rgb-03.png,42.6231,0.0091,0.0039,16.9218 +Small,5x5,ldr-rgb-04.png,37.2434,0.0132,0.0076,8.6288 +Small,5x5,ldr-rgb-05.png,33.1823,0.0233,0.0175,3.7383 +Small,5x5,ldr-rgb-06.png,31.0249,0.0206,0.0148,4.4320 +Small,5x5,ldr-rgb-07.png,35.1883,0.0201,0.0145,4.5310 +Small,5x5,ldr-rgb-08.png,40.0310,0.0110,0.0055,11.8789 +Small,5x5,ldr-rgb-09.png,37.2810,0.0137,0.0079,8.2715 +Small,5x5,ldr-rgb-10.png,40.1234,0.0056,0.0019,8.6790 +Small,5x5,ldr-rgba-00.png,32.0109,0.0231,0.0172,3.8021 +Small,5x5,ldr-rgba-01.png,35.1435,0.0159,0.0101,6.5165 +Small,5x5,ldr-rgba-02.png,31.1062,0.0215,0.0154,4.2531 +Small,5x5,ldr-xy-00.png,36.7258,0.0148,0.0061,10.7437 +Small,5x5,ldr-xy-01.png,39.8638,0.0159,0.0077,8.5247 +Small,5x5,ldr-xy-02.png,43.9172,0.0136,0.0052,12.5785 +Small,5x5,ldrs-rgba-00.png,32.0134,0.0234,0.0177,3.7108 +Small,5x5,ldrs-rgba-01.png,35.1504,0.0160,0.0102,6.4064 +Small,5x5,ldrs-rgba-02.png,31.1070,0.0214,0.0154,4.2468 +Small,6x6,hdr-rgb-00.hdr,26.9904,0.1214,0.0269,2.4346 +Small,6x6,ldr-rgb-00.png,31.5963,0.0227,0.0166,3.9489 +Small,6x6,ldr-rgb-01.png,32.8896,0.0188,0.0128,5.1288 +Small,6x6,ldr-rgb-02.png,27.4078,0.0258,0.0195,3.3581 +Small,6x6,ldr-rgb-03.png,40.4899,0.0099,0.0040,16.3307 +Small,6x6,ldr-rgb-04.png,33.9065,0.0161,0.0099,6.5932 +Small,6x6,ldr-rgb-05.png,29.9344,0.0291,0.0230,2.8506 +Small,6x6,ldr-rgb-06.png,27.4655,0.0259,0.0196,3.3505 +Small,6x6,ldr-rgb-07.png,32.8824,0.0214,0.0153,4.2787 +Small,6x6,ldr-rgb-08.png,37.6380,0.0118,0.0059,11.0909 +Small,6x6,ldr-rgb-09.png,33.4716,0.0165,0.0104,6.3016 +Small,6x6,ldr-rgb-10.png,36.6590,0.0067,0.0025,6.5731 +Small,6x6,ldr-rgba-00.png,29.5229,0.0286,0.0222,2.9547 +Small,6x6,ldr-rgba-01.png,32.0575,0.0188,0.0125,5.2413 +Small,6x6,ldr-rgba-02.png,27.8295,0.0263,0.0198,3.3057 +Small,6x6,ldr-xy-00.png,35.6842,0.0157,0.0068,9.6448 +Small,6x6,ldr-xy-01.png,37.1053,0.0185,0.0099,6.6367 +Small,6x6,ldr-xy-02.png,41.9446,0.0136,0.0052,12.6346 +Small,6x6,ldrs-rgba-00.png,29.5226,0.0285,0.0223,2.9374 +Small,6x6,ldrs-rgba-01.png,32.0640,0.0190,0.0126,5.2191 +Small,6x6,ldrs-rgba-02.png,27.8292,0.0266,0.0200,3.2817 +Small,8x8,hdr-rgb-00.hdr,23.7216,0.1370,0.0380,1.7242 +Small,8x8,ldr-rgb-00.png,28.0003,0.0324,0.0223,2.9363 +Small,8x8,ldr-rgb-01.png,28.7458,0.0274,0.0174,3.7578 +Small,8x8,ldr-rgb-02.png,23.0940,0.0390,0.0287,2.2867 +Small,8x8,ldr-rgb-03.png,37.2544,0.0146,0.0045,14.6813 +Small,8x8,ldr-rgb-04.png,29.3419,0.0259,0.0158,4.1395 +Small,8x8,ldr-rgb-05.png,25.7784,0.0429,0.0326,2.0111 +Small,8x8,ldr-rgb-06.png,23.1493,0.0392,0.0290,2.2619 +Small,8x8,ldr-rgb-07.png,29.6576,0.0255,0.0151,4.3301 +Small,8x8,ldr-rgb-08.png,34.2223,0.0173,0.0074,8.8289 +Small,8x8,ldr-rgb-09.png,28.6664,0.0269,0.0169,3.8802 +Small,8x8,ldr-rgb-10.png,31.9974,0.0116,0.0033,4.8744 +Small,8x8,ldr-rgba-00.png,25.6264,0.0401,0.0298,2.2011 +Small,8x8,ldr-rgba-01.png,28.2399,0.0291,0.0190,3.4580 +Small,8x8,ldr-rgba-02.png,23.9224,0.0396,0.0292,2.2425 +Small,8x8,ldr-xy-00.png,33.4070,0.0233,0.0097,6.7369 +Small,8x8,ldr-xy-01.png,34.2428,0.0253,0.0120,5.4445 +Small,8x8,ldr-xy-02.png,39.9005,0.0167,0.0033,19.8239 +Small,8x8,ldrs-rgba-00.png,25.6281,0.0405,0.0301,2.1799 +Small,8x8,ldrs-rgba-01.png,28.2419,0.0292,0.0188,3.4809 +Small,8x8,ldrs-rgba-02.png,23.9221,0.0399,0.0294,2.2269 +Small,12x12,hdr-rgb-00.hdr,20.5637,0.1566,0.0505,1.2979 +Small,12x12,ldr-rgb-00.png,23.7858,0.0338,0.0170,3.8537 +Small,12x12,ldr-rgb-01.png,24.7588,0.0283,0.0115,5.6944 +Small,12x12,ldr-rgb-02.png,19.2228,0.0485,0.0316,2.0768 +Small,12x12,ldr-rgb-03.png,33.2364,0.0201,0.0033,19.8110 +Small,12x12,ldr-rgb-04.png,24.5593,0.0287,0.0119,5.5151 +Small,12x12,ldr-rgb-05.png,21.4886,0.0438,0.0270,2.4308 +Small,12x12,ldr-rgb-06.png,19.2115,0.0507,0.0336,1.9487 +Small,12x12,ldr-rgb-07.png,25.3543,0.0268,0.0100,6.5411 +Small,12x12,ldr-rgb-08.png,30.1648,0.0218,0.0053,12.3026 +Small,12x12,ldr-rgb-09.png,23.7104,0.0339,0.0171,3.8272 +Small,12x12,ldr-rgb-10.png,27.3052,0.0190,0.0038,4.3269 +Small,12x12,ldr-rgba-00.png,21.4057,0.0471,0.0298,2.1959 +Small,12x12,ldr-rgba-01.png,24.4919,0.0313,0.0140,4.6705 +Small,12x12,ldr-rgba-02.png,20.1666,0.0564,0.0389,1.6850 +Small,12x12,ldr-xy-00.png,29.0822,0.0303,0.0094,7.0040 +Small,12x12,ldr-xy-01.png,30.5276,0.0295,0.0088,7.4135 +Small,12x12,ldr-xy-02.png,37.9951,0.0226,0.0022,30.4405 +Small,12x12,ldrs-rgba-00.png,21.4085,0.0475,0.0305,2.1510 +Small,12x12,ldrs-rgba-01.png,24.4936,0.0314,0.0145,4.5194 +Small,12x12,ldrs-rgba-02.png,20.1665,0.0568,0.0392,1.6698 +Small,3x3x3,ldr-l-00-3.dds,50.7540,0.0240,0.0172,15.2196 +Small,3x3x3,ldr-l-01-3.dds,53.8676,0.0115,0.0073,9.4723 +Small,6x6x6,ldr-l-00-3.dds,32.5264,0.0898,0.0665,3.9424 +Small,6x6x6,ldr-l-01-3.dds,40.7893,0.0467,0.0260,2.6468 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse2_fastest_results.csv new file mode 100644 index 0000000..408a61e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse2_fastest_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.2999,0.1038,0.0122,5.3683 +Small,4x4,ldr-rgb-00.png,37.0084,0.0113,0.0072,9.0584 +Small,4x4,ldr-rgb-01.png,39.4162,0.0110,0.0070,9.3985 +Small,4x4,ldr-rgb-02.png,34.6448,0.0142,0.0103,6.3572 +Small,4x4,ldr-rgb-03.png,45.3559,0.0070,0.0033,19.6566 +Small,4x4,ldr-rgb-04.png,41.6390,0.0093,0.0052,12.5018 +Small,4x4,ldr-rgb-05.png,36.7213,0.0139,0.0099,6.6084 +Small,4x4,ldr-rgb-06.png,34.6994,0.0136,0.0095,6.8675 +Small,4x4,ldr-rgb-07.png,37.1807,0.0133,0.0095,6.9241 +Small,4x4,ldr-rgb-08.png,42.6915,0.0081,0.0045,14.6978 +Small,4x4,ldr-rgb-09.png,41.6433,0.0095,0.0057,11.5709 +Small,4x4,ldr-rgb-10.png,43.8818,0.0038,0.0017,9.6878 +Small,4x4,ldr-rgba-00.png,34.5762,0.0129,0.0088,7.4085 +Small,4x4,ldr-rgba-01.png,38.5857,0.0114,0.0072,9.1037 +Small,4x4,ldr-rgba-02.png,34.5224,0.0146,0.0104,6.3228 +Small,4x4,ldr-xy-00.png,37.5264,0.0115,0.0054,12.2244 +Small,4x4,ldr-xy-01.png,43.8550,0.0122,0.0060,10.9793 +Small,4x4,ldr-xy-02.png,48.1780,0.0107,0.0044,14.7736 +Small,4x4,ldrs-rgba-00.png,34.5813,0.0129,0.0087,7.5406 +Small,4x4,ldrs-rgba-01.png,38.6025,0.0116,0.0074,8.8502 +Small,4x4,ldrs-rgba-02.png,34.5262,0.0147,0.0105,6.2297 +Small,5x5,hdr-rgb-00.hdr,28.8076,0.1072,0.0143,4.5711 +Small,5x5,ldr-rgb-00.png,33.4493,0.0123,0.0076,8.6174 +Small,5x5,ldr-rgb-01.png,35.9999,0.0117,0.0069,9.4337 +Small,5x5,ldr-rgb-02.png,30.8748,0.0157,0.0112,5.8598 +Small,5x5,ldr-rgb-03.png,42.2547,0.0073,0.0029,22.7623 +Small,5x5,ldr-rgb-04.png,36.9224,0.0108,0.0061,10.6666 +Small,5x5,ldr-rgb-05.png,32.6193,0.0161,0.0114,5.7437 +Small,5x5,ldr-rgb-06.png,30.8713,0.0157,0.0110,5.9632 +Small,5x5,ldr-rgb-07.png,34.2652,0.0144,0.0098,6.6825 +Small,5x5,ldr-rgb-08.png,39.3139,0.0084,0.0040,16.5539 +Small,5x5,ldr-rgb-09.png,36.9835,0.0106,0.0061,10.7190 +Small,5x5,ldr-rgb-10.png,39.7373,0.0044,0.0016,10.0847 +Small,5x5,ldr-rgba-00.png,30.8998,0.0144,0.0096,6.8247 +Small,5x5,ldr-rgba-01.png,34.9859,0.0128,0.0079,8.2832 +Small,5x5,ldr-rgba-02.png,31.0041,0.0171,0.0122,5.3873 +Small,5x5,ldr-xy-00.png,36.5882,0.0124,0.0048,13.7942 +Small,5x5,ldr-xy-01.png,38.8955,0.0128,0.0055,11.8599 +Small,5x5,ldr-xy-02.png,43.7233,0.0116,0.0043,15.1598 +Small,5x5,ldrs-rgba-00.png,30.9019,0.0146,0.0097,6.7230 +Small,5x5,ldrs-rgba-01.png,34.9927,0.0129,0.0081,8.0520 +Small,5x5,ldrs-rgba-02.png,31.0050,0.0171,0.0121,5.3953 +Small,6x6,hdr-rgb-00.hdr,26.7122,0.1069,0.0147,4.4570 +Small,6x6,ldr-rgb-00.png,31.1072,0.0137,0.0086,7.6517 +Small,6x6,ldr-rgb-01.png,32.7949,0.0126,0.0076,8.6107 +Small,6x6,ldr-rgb-02.png,27.3234,0.0176,0.0125,5.2320 +Small,6x6,ldr-rgb-03.png,40.2037,0.0077,0.0030,21.7226 +Small,6x6,ldr-rgb-04.png,33.7349,0.0119,0.0070,9.3741 +Small,6x6,ldr-rgb-05.png,29.5304,0.0179,0.0130,5.0308 +Small,6x6,ldr-rgb-06.png,27.3799,0.0172,0.0121,5.4144 +Small,6x6,ldr-rgb-07.png,32.0586,0.0142,0.0093,7.0621 +Small,6x6,ldr-rgb-08.png,37.0422,0.0086,0.0038,17.0308 +Small,6x6,ldr-rgb-09.png,33.2804,0.0117,0.0069,9.4776 +Small,6x6,ldr-rgb-10.png,36.4903,0.0051,0.0019,8.3793 +Small,6x6,ldr-rgba-00.png,28.6001,0.0161,0.0108,6.0675 +Small,6x6,ldr-rgba-01.png,31.9580,0.0142,0.0092,7.1304 +Small,6x6,ldr-rgba-02.png,27.7590,0.0182,0.0130,5.0393 +Small,6x6,ldr-xy-00.png,35.5363,0.0125,0.0048,13.6389 +Small,6x6,ldr-xy-01.png,36.2504,0.0137,0.0063,10.3384 +Small,6x6,ldr-xy-02.png,41.7327,0.0114,0.0041,16.0120 +Small,6x6,ldrs-rgba-00.png,28.6013,0.0161,0.0108,6.0491 +Small,6x6,ldrs-rgba-01.png,31.9643,0.0141,0.0091,7.1946 +Small,6x6,ldrs-rgba-02.png,27.7566,0.0183,0.0130,5.0338 +Small,8x8,hdr-rgb-00.hdr,23.5547,0.1204,0.0230,2.8452 +Small,8x8,ldr-rgb-00.png,27.6456,0.0213,0.0128,5.1092 +Small,8x8,ldr-rgb-01.png,28.6671,0.0198,0.0114,5.7502 +Small,8x8,ldr-rgb-02.png,23.0190,0.0274,0.0189,3.4741 +Small,8x8,ldr-rgb-03.png,37.0089,0.0119,0.0037,17.7949 +Small,8x8,ldr-rgb-04.png,29.0953,0.0188,0.0104,6.3125 +Small,8x8,ldr-rgb-05.png,25.5435,0.0274,0.0191,3.4346 +Small,8x8,ldr-rgb-06.png,23.0560,0.0275,0.0191,3.4319 +Small,8x8,ldr-rgb-07.png,29.3465,0.0188,0.0104,6.3247 +Small,8x8,ldr-rgb-08.png,33.8252,0.0132,0.0050,13.2153 +Small,8x8,ldr-rgb-09.png,28.4590,0.0186,0.0102,6.4119 +Small,8x8,ldr-rgb-10.png,31.8847,0.0093,0.0027,6.0905 +Small,8x8,ldr-rgba-00.png,25.1939,0.0256,0.0168,3.9016 +Small,8x8,ldr-rgba-01.png,28.1422,0.0216,0.0129,5.0751 +Small,8x8,ldr-rgba-02.png,23.8673,0.0287,0.0199,3.2918 +Small,8x8,ldr-xy-00.png,33.2085,0.0186,0.0069,9.5035 +Small,8x8,ldr-xy-01.png,33.9809,0.0191,0.0080,8.1532 +Small,8x8,ldr-xy-02.png,39.7786,0.0144,0.0034,19.4990 +Small,8x8,ldrs-rgba-00.png,25.1942,0.0254,0.0168,3.8908 +Small,8x8,ldrs-rgba-01.png,28.1449,0.0214,0.0128,5.1321 +Small,8x8,ldrs-rgba-02.png,23.8668,0.0286,0.0198,3.3064 +Small,12x12,hdr-rgb-00.hdr,20.4789,0.1334,0.0315,2.0820 +Small,12x12,ldr-rgb-00.png,23.6718,0.0239,0.0109,5.9970 +Small,12x12,ldr-rgb-01.png,24.7037,0.0214,0.0086,7.6346 +Small,12x12,ldr-rgb-02.png,19.1880,0.0340,0.0212,3.0975 +Small,12x12,ldr-rgb-03.png,33.1400,0.0154,0.0031,21.0393 +Small,12x12,ldr-rgb-04.png,24.3884,0.0212,0.0086,7.5914 +Small,12x12,ldr-rgb-05.png,21.3725,0.0307,0.0181,3.6254 +Small,12x12,ldr-rgb-06.png,19.1568,0.0354,0.0226,2.9049 +Small,12x12,ldr-rgb-07.png,25.2598,0.0206,0.0076,8.5915 +Small,12x12,ldr-rgb-08.png,30.0404,0.0165,0.0039,16.7058 +Small,12x12,ldr-rgb-09.png,23.5941,0.0243,0.0115,5.6835 +Small,12x12,ldr-rgb-10.png,27.2554,0.0140,0.0031,5.2356 +Small,12x12,ldr-rgba-00.png,21.2134,0.0316,0.0186,3.5240 +Small,12x12,ldr-rgba-01.png,24.4330,0.0235,0.0107,6.1421 +Small,12x12,ldr-rgba-02.png,20.1369,0.0403,0.0273,2.3967 +Small,12x12,ldr-xy-00.png,29.0083,0.0235,0.0068,9.5783 +Small,12x12,ldr-xy-01.png,29.7048,0.0226,0.0064,10.2273 +Small,12x12,ldr-xy-02.png,37.9716,0.0182,0.0020,32.8526 +Small,12x12,ldrs-rgba-00.png,21.2142,0.0316,0.0189,3.4647 +Small,12x12,ldrs-rgba-01.png,24.4339,0.0233,0.0107,6.1299 +Small,12x12,ldrs-rgba-02.png,20.1366,0.0404,0.0274,2.3954 +Small,3x3x3,ldr-l-00-3.dds,50.6008,0.0210,0.0151,17.3720 +Small,3x3x3,ldr-l-01-3.dds,53.7999,0.0096,0.0064,10.7172 +Small,6x6x6,ldr-l-00-3.dds,32.5074,0.0867,0.0656,3.9974 +Small,6x6x6,ldr-l-01-3.dds,40.7826,0.0438,0.0254,2.7091 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse2_medium_results.csv new file mode 100644 index 0000000..7455681 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse2_medium_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1340,0.1271,0.0343,1.9086 +Small,4x4,ldr-rgb-00.png,38.7318,0.0411,0.0356,1.8433 +Small,4x4,ldr-rgb-01.png,40.1460,0.0388,0.0333,1.9652 +Small,4x4,ldr-rgb-02.png,35.2180,0.0405,0.0349,1.8756 +Small,4x4,ldr-rgb-03.png,47.1925,0.0239,0.0187,3.4973 +Small,4x4,ldr-rgb-04.png,42.1729,0.0326,0.0271,2.4163 +Small,4x4,ldr-rgb-05.png,37.7672,0.0425,0.0370,1.7689 +Small,4x4,ldr-rgb-06.png,35.3468,0.0356,0.0301,2.1796 +Small,4x4,ldr-rgb-07.png,39.2464,0.0494,0.0441,1.4875 +Small,4x4,ldr-rgb-08.png,45.1731,0.0273,0.0221,2.9697 +Small,4x4,ldr-rgb-09.png,42.0914,0.0332,0.0278,2.3557 +Small,4x4,ldr-rgb-10.png,44.8767,0.0079,0.0043,3.7682 +Small,4x4,ldr-rgba-00.png,36.2349,0.0450,0.0394,1.6646 +Small,4x4,ldr-rgba-01.png,38.8941,0.0280,0.0223,2.9413 +Small,4x4,ldr-rgba-02.png,34.9204,0.0319,0.0261,2.5130 +Small,4x4,ldr-xy-00.png,37.7447,0.0282,0.0209,3.1330 +Small,4x4,ldr-xy-01.png,45.1463,0.0393,0.0324,2.0250 +Small,4x4,ldr-xy-02.png,50.9227,0.0469,0.0397,1.6521 +Small,4x4,ldrs-rgba-00.png,36.2418,0.0455,0.0398,1.6487 +Small,4x4,ldrs-rgba-01.png,38.9101,0.0285,0.0229,2.8668 +Small,4x4,ldrs-rgba-02.png,34.9259,0.0319,0.0261,2.5109 +Small,5x5,hdr-rgb-00.hdr,29.8514,0.1422,0.0471,1.3901 +Small,5x5,ldr-rgb-00.png,35.0732,0.0512,0.0440,1.4897 +Small,5x5,ldr-rgb-01.png,36.3975,0.0431,0.0359,1.8269 +Small,5x5,ldr-rgb-02.png,31.0676,0.0449,0.0376,1.7409 +Small,5x5,ldr-rgb-03.png,43.9478,0.0190,0.0122,5.3735 +Small,5x5,ldr-rgb-04.png,37.6668,0.0392,0.0321,2.0412 +Small,5x5,ldr-rgb-05.png,33.5193,0.0579,0.0509,1.2886 +Small,5x5,ldr-rgb-06.png,31.0778,0.0425,0.0352,1.8610 +Small,5x5,ldr-rgb-07.png,36.2042,0.0613,0.0543,1.2069 +Small,5x5,ldr-rgb-08.png,41.5462,0.0285,0.0216,3.0365 +Small,5x5,ldr-rgb-09.png,37.5873,0.0369,0.0298,2.2001 +Small,5x5,ldr-rgb-10.png,40.4902,0.0106,0.0054,3.0209 +Small,5x5,ldr-rgba-00.png,32.7845,0.0611,0.0536,1.2232 +Small,5x5,ldr-rgba-01.png,35.2722,0.0350,0.0277,2.3677 +Small,5x5,ldr-rgba-02.png,31.1225,0.0418,0.0344,1.9050 +Small,5x5,ldr-xy-00.png,37.0726,0.0307,0.0219,2.9924 +Small,5x5,ldr-xy-01.png,40.7212,0.0412,0.0322,2.0341 +Small,5x5,ldr-xy-02.png,49.0674,0.0320,0.0231,2.8405 +Small,5x5,ldrs-rgba-00.png,32.7875,0.0606,0.0530,1.2369 +Small,5x5,ldrs-rgba-01.png,35.2789,0.0348,0.0274,2.3892 +Small,5x5,ldrs-rgba-02.png,31.1234,0.0418,0.0343,1.9088 +Small,6x6,hdr-rgb-00.hdr,27.4769,0.1483,0.0524,1.2505 +Small,6x6,ldr-rgb-00.png,32.3560,0.0544,0.0467,1.4043 +Small,6x6,ldr-rgb-01.png,33.0687,0.0439,0.0364,1.8027 +Small,6x6,ldr-rgb-02.png,27.4390,0.0495,0.0419,1.5659 +Small,6x6,ldr-rgb-03.png,41.6538,0.0168,0.0094,6.9447 +Small,6x6,ldr-rgb-04.png,34.2059,0.0390,0.0313,2.0915 +Small,6x6,ldr-rgb-05.png,30.1377,0.0627,0.0552,1.1881 +Small,6x6,ldr-rgb-06.png,27.5024,0.0476,0.0396,1.6532 +Small,6x6,ldr-rgb-07.png,33.8577,0.0583,0.0506,1.2943 +Small,6x6,ldr-rgb-08.png,39.0752,0.0234,0.0160,4.1019 +Small,6x6,ldr-rgb-09.png,33.6699,0.0381,0.0306,2.1419 +Small,6x6,ldr-rgb-10.png,36.9333,0.0117,0.0060,2.6915 +Small,6x6,ldr-rgba-00.png,30.2619,0.0685,0.0605,1.0829 +Small,6x6,ldr-rgba-01.png,32.1735,0.0373,0.0294,2.2268 +Small,6x6,ldr-rgba-02.png,27.8421,0.0473,0.0394,1.6634 +Small,6x6,ldr-xy-00.png,36.2566,0.0290,0.0196,3.3433 +Small,6x6,ldr-xy-01.png,37.7340,0.0335,0.0243,2.6937 +Small,6x6,ldr-xy-02.png,46.0639,0.0256,0.0161,4.0820 +Small,6x6,ldrs-rgba-00.png,30.2627,0.0677,0.0600,1.0920 +Small,6x6,ldrs-rgba-01.png,32.1795,0.0372,0.0295,2.2193 +Small,6x6,ldrs-rgba-02.png,27.8421,0.0476,0.0398,1.6478 +Small,8x8,hdr-rgb-00.hdr,24.1157,0.1682,0.0682,0.9616 +Small,8x8,ldr-rgb-00.png,28.7156,0.0730,0.0615,1.0653 +Small,8x8,ldr-rgb-01.png,28.9240,0.0575,0.0464,1.4120 +Small,8x8,ldr-rgb-02.png,23.1515,0.0666,0.0553,1.1855 +Small,8x8,ldr-rgb-03.png,38.4615,0.0222,0.0113,5.8104 +Small,8x8,ldr-rgb-04.png,29.6531,0.0533,0.0420,1.5595 +Small,8x8,ldr-rgb-05.png,25.9297,0.0774,0.0659,0.9950 +Small,8x8,ldr-rgb-06.png,23.1926,0.0667,0.0553,1.1854 +Small,8x8,ldr-rgb-07.png,30.5823,0.0669,0.0554,1.1828 +Small,8x8,ldr-rgb-08.png,35.7743,0.0300,0.0189,3.4692 +Small,8x8,ldr-rgb-09.png,29.0113,0.0508,0.0396,1.6561 +Small,8x8,ldr-rgb-10.png,32.1619,0.0183,0.0089,1.8340 +Small,8x8,ldr-rgba-00.png,26.4317,0.0857,0.0743,0.8820 +Small,8x8,ldr-rgba-01.png,28.3388,0.0505,0.0389,1.6850 +Small,8x8,ldr-rgba-02.png,23.9365,0.0700,0.0585,1.1204 +Small,8x8,ldr-xy-00.png,34.0144,0.0433,0.0287,2.2842 +Small,8x8,ldr-xy-01.png,34.9127,0.0429,0.0286,2.2926 +Small,8x8,ldr-xy-02.png,41.7218,0.0306,0.0164,4.0076 +Small,8x8,ldrs-rgba-00.png,26.4317,0.0859,0.0745,0.8792 +Small,8x8,ldrs-rgba-01.png,28.3416,0.0503,0.0388,1.6891 +Small,8x8,ldrs-rgba-02.png,23.9360,0.0704,0.0587,1.1156 +Small,12x12,hdr-rgb-00.hdr,20.7645,0.2022,0.0931,0.7041 +Small,12x12,ldr-rgb-00.png,24.6914,0.0916,0.0715,0.9168 +Small,12x12,ldr-rgb-01.png,25.0227,0.0768,0.0572,1.1464 +Small,12x12,ldr-rgb-02.png,19.2638,0.1045,0.0848,0.7725 +Small,12x12,ldr-rgb-03.png,34.9308,0.0314,0.0119,5.4897 +Small,12x12,ldr-rgb-04.png,24.9112,0.0712,0.0515,1.2730 +Small,12x12,ldr-rgb-05.png,21.6503,0.1057,0.0861,0.7615 +Small,12x12,ldr-rgb-06.png,19.2463,0.1001,0.0803,0.8159 +Small,12x12,ldr-rgb-07.png,26.5698,0.0753,0.0559,1.1731 +Small,12x12,ldr-rgb-08.png,31.5209,0.0397,0.0202,3.2453 +Small,12x12,ldr-rgb-09.png,24.1037,0.0732,0.0537,1.2200 +Small,12x12,ldr-rgb-10.png,27.9966,0.0363,0.0190,0.8543 +Small,12x12,ldr-rgba-00.png,22.1195,0.1019,0.0819,0.7998 +Small,12x12,ldr-rgba-01.png,24.6314,0.0741,0.0540,1.2146 +Small,12x12,ldr-rgba-02.png,20.1799,0.1104,0.0904,0.7252 +Small,12x12,ldr-xy-00.png,30.0722,0.0567,0.0331,1.9771 +Small,12x12,ldr-xy-01.png,31.8391,0.0560,0.0322,2.0334 +Small,12x12,ldr-xy-02.png,38.5216,0.0302,0.0064,10.2654 +Small,12x12,ldrs-rgba-00.png,22.1198,0.1016,0.0819,0.8004 +Small,12x12,ldrs-rgba-01.png,24.6333,0.0735,0.0532,1.2311 +Small,12x12,ldrs-rgba-02.png,20.1799,0.1106,0.0907,0.7226 +Small,3x3x3,ldr-l-00-3.dds,51.9667,0.0326,0.0248,10.5827 +Small,3x3x3,ldr-l-01-3.dds,54.3395,0.0128,0.0076,9.0651 +Small,6x6x6,ldr-l-00-3.dds,32.9251,0.1063,0.0828,3.1656 +Small,6x6x6,ldr-l-01-3.dds,40.8871,0.0466,0.0261,2.6443 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse2_thorough_results.csv new file mode 100644 index 0000000..02f7bae --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse2_thorough_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.3787,0.1632,0.0702,0.9338 +Small,4x4,ldr-rgb-00.png,39.1025,0.0818,0.0761,0.8609 +Small,4x4,ldr-rgb-01.png,40.3344,0.0814,0.0759,0.8638 +Small,4x4,ldr-rgb-02.png,35.3612,0.0760,0.0704,0.9313 +Small,4x4,ldr-rgb-03.png,47.6672,0.0759,0.0706,0.9277 +Small,4x4,ldr-rgb-04.png,42.3135,0.0738,0.0683,0.9595 +Small,4x4,ldr-rgb-05.png,37.9467,0.0853,0.0797,0.8227 +Small,4x4,ldr-rgb-06.png,35.4785,0.0706,0.0649,1.0098 +Small,4x4,ldr-rgb-07.png,39.8676,0.0938,0.0883,0.7424 +Small,4x4,ldr-rgb-08.png,45.7996,0.0720,0.0666,0.9837 +Small,4x4,ldr-rgb-09.png,42.2360,0.0779,0.0723,0.9061 +Small,4x4,ldr-rgb-10.png,44.9865,0.0129,0.0092,1.7645 +Small,4x4,ldr-rgba-00.png,36.7343,0.0850,0.0793,0.8266 +Small,4x4,ldr-rgba-01.png,39.0299,0.0691,0.0633,1.0359 +Small,4x4,ldr-rgba-02.png,34.9857,0.0680,0.0621,1.0548 +Small,4x4,ldr-xy-00.png,37.7553,0.0786,0.0715,0.9169 +Small,4x4,ldr-xy-01.png,45.2160,0.0878,0.0809,0.8103 +Small,4x4,ldr-xy-02.png,50.9992,0.1060,0.0988,0.6636 +Small,4x4,ldrs-rgba-00.png,36.7417,0.0860,0.0802,0.8171 +Small,4x4,ldrs-rgba-01.png,39.0514,0.0696,0.0639,1.0262 +Small,4x4,ldrs-rgba-02.png,34.9915,0.0684,0.0625,1.0485 +Small,5x5,hdr-rgb-00.hdr,30.2499,0.1854,0.0906,0.7237 +Small,5x5,ldr-rgb-00.png,35.3184,0.1074,0.1001,0.6545 +Small,5x5,ldr-rgb-01.png,36.4942,0.1026,0.0955,0.6861 +Small,5x5,ldr-rgb-02.png,31.1180,0.0964,0.0892,0.7349 +Small,5x5,ldr-rgb-03.png,44.4730,0.0935,0.0866,0.7571 +Small,5x5,ldr-rgb-04.png,37.8146,0.0964,0.0892,0.7347 +Small,5x5,ldr-rgb-05.png,33.6567,0.1099,0.1028,0.6376 +Small,5x5,ldr-rgb-06.png,31.1202,0.0921,0.0849,0.7723 +Small,5x5,ldr-rgb-07.png,36.7056,0.1219,0.1148,0.5710 +Small,5x5,ldr-rgb-08.png,42.2683,0.0893,0.0823,0.7963 +Small,5x5,ldr-rgb-09.png,37.6844,0.1005,0.0933,0.7021 +Small,5x5,ldr-rgb-10.png,40.6793,0.0181,0.0127,1.2778 +Small,5x5,ldr-rgba-00.png,33.1193,0.1121,0.1047,0.6257 +Small,5x5,ldr-rgba-01.png,35.3456,0.0908,0.0834,0.7856 +Small,5x5,ldr-rgba-02.png,31.1599,0.0915,0.0841,0.7794 +Small,5x5,ldr-xy-00.png,37.2903,0.0927,0.0838,0.7816 +Small,5x5,ldr-xy-01.png,41.5203,0.1128,0.1041,0.6298 +Small,5x5,ldr-xy-02.png,49.2640,0.1266,0.1177,0.5570 +Small,5x5,ldrs-rgba-00.png,33.1229,0.1127,0.1054,0.6220 +Small,5x5,ldrs-rgba-01.png,35.3541,0.0918,0.0844,0.7767 +Small,5x5,ldrs-rgba-02.png,31.1602,0.0910,0.0836,0.7841 +Small,6x6,hdr-rgb-00.hdr,27.6571,0.2017,0.1077,0.6083 +Small,6x6,ldr-rgb-00.png,32.6208,0.1245,0.1166,0.5620 +Small,6x6,ldr-rgb-01.png,33.1469,0.1183,0.1105,0.5928 +Small,6x6,ldr-rgb-02.png,27.4754,0.1143,0.1066,0.6149 +Small,6x6,ldr-rgb-03.png,42.5226,0.0785,0.0710,0.9237 +Small,6x6,ldr-rgb-04.png,34.3223,0.1130,0.1054,0.6220 +Small,6x6,ldr-rgb-05.png,30.2576,0.1279,0.1200,0.5460 +Small,6x6,ldr-rgb-06.png,27.5390,0.1110,0.1033,0.6345 +Small,6x6,ldr-rgb-07.png,34.3854,0.1341,0.1265,0.5182 +Small,6x6,ldr-rgb-08.png,39.8830,0.0776,0.0702,0.9336 +Small,6x6,ldr-rgb-09.png,33.7955,0.1093,0.1017,0.6444 +Small,6x6,ldr-rgb-10.png,37.1039,0.0228,0.0168,0.9649 +Small,6x6,ldr-rgba-00.png,30.5113,0.1340,0.1261,0.5196 +Small,6x6,ldr-rgba-01.png,32.2316,0.1109,0.1030,0.6364 +Small,6x6,ldr-rgba-02.png,27.8753,0.1145,0.1066,0.6150 +Small,6x6,ldr-xy-00.png,36.3804,0.0786,0.0689,0.9507 +Small,6x6,ldr-xy-01.png,38.0614,0.1144,0.1046,0.6263 +Small,6x6,ldr-xy-02.png,47.4738,0.1407,0.1312,0.4994 +Small,6x6,ldrs-rgba-00.png,30.5130,0.1344,0.1262,0.5192 +Small,6x6,ldrs-rgba-01.png,32.2377,0.1111,0.1030,0.6363 +Small,6x6,ldrs-rgba-02.png,27.8745,0.1143,0.1064,0.6161 +Small,8x8,hdr-rgb-00.hdr,24.3160,0.2449,0.1448,0.4526 +Small,8x8,ldr-rgb-00.png,28.9383,0.1653,0.1523,0.4302 +Small,8x8,ldr-rgb-01.png,28.9883,0.1475,0.1344,0.4876 +Small,8x8,ldr-rgb-02.png,23.1859,0.1555,0.1423,0.4604 +Small,8x8,ldr-rgb-03.png,39.3501,0.0522,0.0395,1.6578 +Small,8x8,ldr-rgb-04.png,29.7733,0.1377,0.1247,0.5253 +Small,8x8,ldr-rgb-05.png,26.0247,0.1599,0.1468,0.4464 +Small,8x8,ldr-rgb-06.png,23.2333,0.1539,0.1407,0.4656 +Small,8x8,ldr-rgb-07.png,31.1039,0.1541,0.1413,0.4638 +Small,8x8,ldr-rgb-08.png,36.4625,0.0755,0.0625,1.0479 +Small,8x8,ldr-rgb-09.png,29.1557,0.1162,0.1034,0.6341 +Small,8x8,ldr-rgb-10.png,32.3031,0.0335,0.0223,0.7284 +Small,8x8,ldr-rgba-00.png,26.6905,0.1721,0.1589,0.4125 +Small,8x8,ldr-rgba-01.png,28.3935,0.1353,0.1223,0.5361 +Small,8x8,ldr-rgba-02.png,23.9597,0.1635,0.1502,0.4363 +Small,8x8,ldr-xy-00.png,34.3120,0.0950,0.0801,0.8182 +Small,8x8,ldr-xy-01.png,35.2097,0.0974,0.0830,0.7900 +Small,8x8,ldr-xy-02.png,44.5878,0.1259,0.1108,0.5912 +Small,8x8,ldrs-rgba-00.png,26.6912,0.1738,0.1606,0.4081 +Small,8x8,ldrs-rgba-01.png,28.3962,0.1353,0.1221,0.5366 +Small,8x8,ldrs-rgba-02.png,23.9595,0.1627,0.1490,0.4399 +Small,12x12,hdr-rgb-00.hdr,21.0023,0.2981,0.1879,0.3488 +Small,12x12,ldr-rgb-00.png,25.0193,0.2058,0.1829,0.3584 +Small,12x12,ldr-rgb-01.png,25.1167,0.1736,0.1508,0.4346 +Small,12x12,ldr-rgb-02.png,19.2919,0.2115,0.1887,0.3473 +Small,12x12,ldr-rgb-03.png,36.1206,0.0616,0.0391,1.6740 +Small,12x12,ldr-rgb-04.png,25.0063,0.1732,0.1504,0.4356 +Small,12x12,ldr-rgb-05.png,21.7165,0.2078,0.1850,0.3542 +Small,12x12,ldr-rgb-06.png,19.2807,0.2040,0.1812,0.3616 +Small,12x12,ldr-rgb-07.png,27.0419,0.1843,0.1614,0.4060 +Small,12x12,ldr-rgb-08.png,32.3840,0.0851,0.0624,1.0496 +Small,12x12,ldr-rgb-09.png,24.3010,0.1636,0.1409,0.4652 +Small,12x12,ldr-rgb-10.png,28.1496,0.0588,0.0382,0.4259 +Small,12x12,ldr-rgba-00.png,22.7076,0.2194,0.1963,0.3339 +Small,12x12,ldr-rgba-01.png,24.7112,0.1619,0.1389,0.4717 +Small,12x12,ldr-rgba-02.png,20.1958,0.2152,0.1919,0.3415 +Small,12x12,ldr-xy-00.png,30.5742,0.1284,0.1036,0.6323 +Small,12x12,ldr-xy-01.png,32.1254,0.0961,0.0716,0.9156 +Small,12x12,ldr-xy-02.png,40.3053,0.0690,0.0444,1.4762 +Small,12x12,ldrs-rgba-00.png,22.7071,0.2195,0.1966,0.3334 +Small,12x12,ldrs-rgba-01.png,24.7127,0.1623,0.1392,0.4706 +Small,12x12,ldrs-rgba-02.png,20.1960,0.2155,0.1921,0.3411 +Small,3x3x3,ldr-l-00-3.dds,52.4155,0.0616,0.0538,4.8721 +Small,3x3x3,ldr-l-01-3.dds,55.3973,0.0264,0.0212,3.2438 +Small,6x6x6,ldr-l-00-3.dds,33.2725,0.1579,0.1317,1.9911 +Small,6x6x6,ldr-l-01-3.dds,41.5751,0.0509,0.0271,2.5449 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse4.1_fast_results.csv new file mode 100644 index 0000000..c5901d8 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse4.1_fast_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.6884,0.1093,0.0170,3.8610 +Small,4x4,ldr-rgb-00.png,38.1103,0.0153,0.0106,6.1763 +Small,4x4,ldr-rgb-01.png,39.8105,0.0138,0.0094,6.9778 +Small,4x4,ldr-rgb-02.png,35.0374,0.0193,0.0148,4.4191 +Small,4x4,ldr-rgb-03.png,45.9704,0.0079,0.0037,17.5037 +Small,4x4,ldr-rgb-04.png,41.9106,0.0113,0.0068,9.5730 +Small,4x4,ldr-rgb-05.png,37.2317,0.0183,0.0139,4.7305 +Small,4x4,ldr-rgb-06.png,35.2059,0.0179,0.0133,4.9443 +Small,4x4,ldr-rgb-07.png,38.0309,0.0188,0.0142,4.6025 +Small,4x4,ldr-rgb-08.png,43.6358,0.0098,0.0056,11.7953 +Small,4x4,ldr-rgb-09.png,41.8532,0.0112,0.0067,9.7554 +Small,4x4,ldr-rgb-10.png,44.3464,0.0047,0.0020,8.1568 +Small,4x4,ldr-rgba-00.png,35.5175,0.0183,0.0136,4.8181 +Small,4x4,ldr-rgba-01.png,38.7956,0.0134,0.0087,7.5720 +Small,4x4,ldr-rgba-02.png,34.8333,0.0170,0.0123,5.3425 +Small,4x4,ldr-xy-00.png,37.5698,0.0136,0.0068,9.5703 +Small,4x4,ldr-xy-01.png,44.1365,0.0143,0.0078,8.3751 +Small,4x4,ldr-xy-02.png,48.1780,0.0120,0.0052,12.5814 +Small,4x4,ldrs-rgba-00.png,35.5247,0.0184,0.0139,4.7264 +Small,4x4,ldrs-rgba-01.png,38.8141,0.0136,0.0089,7.3662 +Small,4x4,ldrs-rgba-02.png,34.8386,0.0172,0.0125,5.2290 +Small,5x5,hdr-rgb-00.hdr,29.4686,0.1125,0.0199,3.2875 +Small,5x5,ldr-rgb-00.png,34.3042,0.0167,0.0110,5.9497 +Small,5x5,ldr-rgb-01.png,36.1808,0.0137,0.0081,8.0939 +Small,5x5,ldr-rgb-02.png,31.0166,0.0188,0.0133,4.9109 +Small,5x5,ldr-rgb-03.png,42.6231,0.0085,0.0033,20.0173 +Small,5x5,ldr-rgb-04.png,37.2434,0.0123,0.0067,9.7727 +Small,5x5,ldr-rgb-05.png,33.1823,0.0212,0.0157,4.1876 +Small,5x5,ldr-rgb-06.png,31.0249,0.0185,0.0128,5.1321 +Small,5x5,ldr-rgb-07.png,35.1883,0.0181,0.0126,5.2200 +Small,5x5,ldr-rgb-08.png,40.0310,0.0104,0.0051,12.8448 +Small,5x5,ldr-rgb-09.png,37.2810,0.0127,0.0073,9.0083 +Small,5x5,ldr-rgb-10.png,40.1234,0.0056,0.0019,8.7729 +Small,5x5,ldr-rgba-00.png,32.0109,0.0210,0.0152,4.3065 +Small,5x5,ldr-rgba-01.png,35.1435,0.0146,0.0088,7.4187 +Small,5x5,ldr-rgba-02.png,31.1062,0.0194,0.0136,4.8135 +Small,5x5,ldr-xy-00.png,36.7258,0.0139,0.0054,12.1794 +Small,5x5,ldr-xy-01.png,39.8638,0.0147,0.0067,9.7495 +Small,5x5,ldr-xy-02.png,43.9172,0.0133,0.0051,12.8376 +Small,5x5,ldrs-rgba-00.png,32.0134,0.0210,0.0154,4.2614 +Small,5x5,ldrs-rgba-01.png,35.1504,0.0148,0.0091,7.2050 +Small,5x5,ldrs-rgba-02.png,31.1070,0.0194,0.0136,4.8302 +Small,6x6,hdr-rgb-00.hdr,26.9904,0.1179,0.0236,2.7758 +Small,6x6,ldr-rgb-00.png,31.5963,0.0209,0.0147,4.4494 +Small,6x6,ldr-rgb-01.png,32.8896,0.0172,0.0111,5.9094 +Small,6x6,ldr-rgb-02.png,27.4078,0.0232,0.0172,3.8127 +Small,6x6,ldr-rgb-03.png,40.4899,0.0094,0.0036,18.1749 +Small,6x6,ldr-rgb-04.png,33.9065,0.0150,0.0087,7.5268 +Small,6x6,ldr-rgb-05.png,29.9344,0.0264,0.0202,3.2403 +Small,6x6,ldr-rgb-06.png,27.4655,0.0232,0.0170,3.8630 +Small,6x6,ldr-rgb-07.png,32.8824,0.0194,0.0133,4.9168 +Small,6x6,ldr-rgb-08.png,37.6380,0.0110,0.0053,12.3214 +Small,6x6,ldr-rgb-09.png,33.4716,0.0152,0.0091,7.2369 +Small,6x6,ldr-rgb-10.png,36.6590,0.0067,0.0026,6.3722 +Small,6x6,ldr-rgba-00.png,29.5229,0.0256,0.0193,3.4001 +Small,6x6,ldr-rgba-01.png,32.0575,0.0175,0.0113,5.8083 +Small,6x6,ldr-rgba-02.png,27.8295,0.0239,0.0175,3.7389 +Small,6x6,ldr-xy-00.png,35.6842,0.0150,0.0061,10.7559 +Small,6x6,ldr-xy-01.png,37.1053,0.0171,0.0088,7.4831 +Small,6x6,ldr-xy-02.png,41.9446,0.0131,0.0047,13.9468 +Small,6x6,ldrs-rgba-00.png,29.5226,0.0259,0.0195,3.3669 +Small,6x6,ldrs-rgba-01.png,32.0640,0.0175,0.0112,5.8546 +Small,6x6,ldrs-rgba-02.png,27.8292,0.0239,0.0175,3.7481 +Small,8x8,hdr-rgb-00.hdr,23.7216,0.1319,0.0330,1.9873 +Small,8x8,ldr-rgb-00.png,28.0003,0.0294,0.0192,3.4045 +Small,8x8,ldr-rgb-01.png,28.7458,0.0254,0.0155,4.2292 +Small,8x8,ldr-rgb-02.png,23.0940,0.0354,0.0252,2.6001 +Small,8x8,ldr-rgb-03.png,37.2544,0.0142,0.0045,14.5824 +Small,8x8,ldr-rgb-04.png,29.3419,0.0239,0.0140,4.6774 +Small,8x8,ldr-rgb-05.png,25.7784,0.0390,0.0287,2.2867 +Small,8x8,ldr-rgb-06.png,23.1493,0.0355,0.0252,2.5977 +Small,8x8,ldr-rgb-07.png,29.6576,0.0235,0.0135,4.8491 +Small,8x8,ldr-rgb-08.png,34.2223,0.0165,0.0068,9.6121 +Small,8x8,ldr-rgb-09.png,28.6664,0.0250,0.0150,4.3557 +Small,8x8,ldr-rgb-10.png,31.9974,0.0113,0.0031,5.3197 +Small,8x8,ldr-rgba-00.png,25.6264,0.0365,0.0264,2.4778 +Small,8x8,ldr-rgba-01.png,28.2399,0.0269,0.0168,3.9035 +Small,8x8,ldr-rgba-02.png,23.9224,0.0363,0.0261,2.5113 +Small,8x8,ldr-xy-00.png,33.4070,0.0219,0.0085,7.7128 +Small,8x8,ldr-xy-01.png,34.2428,0.0235,0.0106,6.1669 +Small,8x8,ldr-xy-02.png,39.9005,0.0163,0.0034,19.3317 +Small,8x8,ldrs-rgba-00.png,25.6281,0.0367,0.0267,2.4580 +Small,8x8,ldrs-rgba-01.png,28.2419,0.0267,0.0165,3.9806 +Small,8x8,ldrs-rgba-02.png,23.9221,0.0364,0.0261,2.5145 +Small,12x12,hdr-rgb-00.hdr,20.5637,0.1521,0.0444,1.4762 +Small,12x12,ldr-rgb-00.png,23.7858,0.0320,0.0150,4.3560 +Small,12x12,ldr-rgb-01.png,24.7588,0.0270,0.0103,6.3869 +Small,12x12,ldr-rgb-02.png,19.2228,0.0452,0.0280,2.3387 +Small,12x12,ldr-rgb-03.png,33.2364,0.0201,0.0036,18.1234 +Small,12x12,ldr-rgb-04.png,24.5593,0.0275,0.0107,6.0981 +Small,12x12,ldr-rgb-05.png,21.4886,0.0404,0.0236,2.7739 +Small,12x12,ldr-rgb-06.png,19.2115,0.0468,0.0297,2.2090 +Small,12x12,ldr-rgb-07.png,25.3543,0.0259,0.0091,7.2177 +Small,12x12,ldr-rgb-08.png,30.1648,0.0216,0.0051,12.8833 +Small,12x12,ldr-rgb-09.png,23.7104,0.0320,0.0154,4.2650 +Small,12x12,ldr-rgb-10.png,27.3052,0.0185,0.0036,4.5106 +Small,12x12,ldr-rgba-00.png,21.4057,0.0436,0.0268,2.4463 +Small,12x12,ldr-rgba-01.png,24.4919,0.0298,0.0129,5.0673 +Small,12x12,ldr-rgba-02.png,20.1666,0.0518,0.0347,1.8863 +Small,12x12,ldr-xy-00.png,29.0822,0.0293,0.0087,7.5452 +Small,12x12,ldr-xy-01.png,30.5276,0.0286,0.0080,8.1950 +Small,12x12,ldr-xy-02.png,37.9951,0.0225,0.0020,33.2139 +Small,12x12,ldrs-rgba-00.png,21.4085,0.0440,0.0270,2.4260 +Small,12x12,ldrs-rgba-01.png,24.4936,0.0297,0.0129,5.0831 +Small,12x12,ldrs-rgba-02.png,20.1665,0.0522,0.0348,1.8838 +Small,3x3x3,ldr-l-00-3.dds,50.7540,0.0220,0.0150,17.5160 +Small,3x3x3,ldr-l-01-3.dds,53.8676,0.0105,0.0063,10.8553 +Small,6x6x6,ldr-l-00-3.dds,32.5264,0.0825,0.0589,4.4501 +Small,6x6x6,ldr-l-01-3.dds,40.7893,0.0440,0.0233,2.9580 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse4.1_fastest_results.csv new file mode 100644 index 0000000..43752ed --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse4.1_fastest_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.2999,0.1022,0.0105,6.2273 +Small,4x4,ldr-rgb-00.png,37.0084,0.0104,0.0064,10.2098 +Small,4x4,ldr-rgb-01.png,39.4162,0.0100,0.0062,10.5313 +Small,4x4,ldr-rgb-02.png,34.6448,0.0130,0.0091,7.2239 +Small,4x4,ldr-rgb-03.png,45.3559,0.0067,0.0031,20.9718 +Small,4x4,ldr-rgb-04.png,41.6390,0.0087,0.0047,13.8554 +Small,4x4,ldr-rgb-05.png,36.7213,0.0126,0.0087,7.5589 +Small,4x4,ldr-rgb-06.png,34.6994,0.0125,0.0086,7.5824 +Small,4x4,ldr-rgb-07.png,37.1807,0.0122,0.0084,7.8279 +Small,4x4,ldr-rgb-08.png,42.6915,0.0075,0.0039,16.7221 +Small,4x4,ldr-rgb-09.png,41.6433,0.0090,0.0052,12.6567 +Small,4x4,ldr-rgb-10.png,43.8818,0.0036,0.0015,10.7155 +Small,4x4,ldr-rgba-00.png,34.5762,0.0118,0.0078,8.4344 +Small,4x4,ldr-rgba-01.png,38.5857,0.0107,0.0067,9.8448 +Small,4x4,ldr-rgba-02.png,34.5224,0.0134,0.0092,7.1149 +Small,4x4,ldr-xy-00.png,37.5264,0.0109,0.0048,13.6193 +Small,4x4,ldr-xy-01.png,43.8550,0.0113,0.0051,12.7678 +Small,4x4,ldr-xy-02.png,48.1780,0.0102,0.0039,16.8513 +Small,4x4,ldrs-rgba-00.png,34.5813,0.0121,0.0080,8.2156 +Small,4x4,ldrs-rgba-01.png,38.6025,0.0108,0.0067,9.8003 +Small,4x4,ldrs-rgba-02.png,34.5262,0.0134,0.0092,7.0903 +Small,5x5,hdr-rgb-00.hdr,28.8076,0.1053,0.0125,5.2581 +Small,5x5,ldr-rgb-00.png,33.4493,0.0114,0.0067,9.7247 +Small,5x5,ldr-rgb-01.png,35.9999,0.0104,0.0059,11.1494 +Small,5x5,ldr-rgb-02.png,30.8748,0.0143,0.0097,6.7702 +Small,5x5,ldr-rgb-03.png,42.2547,0.0071,0.0028,23.5825 +Small,5x5,ldr-rgb-04.png,36.9224,0.0100,0.0054,12.1337 +Small,5x5,ldr-rgb-05.png,32.6193,0.0148,0.0102,6.4484 +Small,5x5,ldr-rgb-06.png,30.8713,0.0143,0.0096,6.8274 +Small,5x5,ldr-rgb-07.png,34.2652,0.0131,0.0086,7.6634 +Small,5x5,ldr-rgb-08.png,39.3139,0.0079,0.0036,18.2546 +Small,5x5,ldr-rgb-09.png,36.9835,0.0099,0.0053,12.4121 +Small,5x5,ldr-rgb-10.png,39.7373,0.0045,0.0016,9.9059 +Small,5x5,ldr-rgba-00.png,30.8998,0.0131,0.0083,7.8768 +Small,5x5,ldr-rgba-01.png,34.9859,0.0119,0.0072,9.0971 +Small,5x5,ldr-rgba-02.png,31.0041,0.0154,0.0106,6.1658 +Small,5x5,ldr-xy-00.png,36.5882,0.0119,0.0044,14.7538 +Small,5x5,ldr-xy-01.png,38.8955,0.0120,0.0048,13.5796 +Small,5x5,ldr-xy-02.png,43.7233,0.0112,0.0042,15.5738 +Small,5x5,ldrs-rgba-00.png,30.9019,0.0133,0.0084,7.7953 +Small,5x5,ldrs-rgba-01.png,34.9927,0.0118,0.0072,9.1480 +Small,5x5,ldrs-rgba-02.png,31.0050,0.0155,0.0104,6.2877 +Small,6x6,hdr-rgb-00.hdr,26.7122,0.1060,0.0132,4.9593 +Small,6x6,ldr-rgb-00.png,31.1072,0.0126,0.0077,8.5255 +Small,6x6,ldr-rgb-01.png,32.7949,0.0118,0.0070,9.3207 +Small,6x6,ldr-rgb-02.png,27.3234,0.0159,0.0109,5.9872 +Small,6x6,ldr-rgb-03.png,40.2037,0.0071,0.0025,25.8830 +Small,6x6,ldr-rgb-04.png,33.7349,0.0110,0.0062,10.5483 +Small,6x6,ldr-rgb-05.png,29.5304,0.0162,0.0114,5.7453 +Small,6x6,ldr-rgb-06.png,27.3799,0.0156,0.0106,6.1879 +Small,6x6,ldr-rgb-07.png,32.0586,0.0132,0.0083,7.8667 +Small,6x6,ldr-rgb-08.png,37.0422,0.0083,0.0037,17.4948 +Small,6x6,ldr-rgb-09.png,33.2804,0.0111,0.0063,10.3928 +Small,6x6,ldr-rgb-10.png,36.4903,0.0049,0.0018,9.0959 +Small,6x6,ldr-rgba-00.png,28.6001,0.0145,0.0095,6.8639 +Small,6x6,ldr-rgba-01.png,31.9580,0.0130,0.0080,8.1938 +Small,6x6,ldr-rgba-02.png,27.7590,0.0167,0.0116,5.6717 +Small,6x6,ldr-xy-00.png,35.5363,0.0119,0.0043,15.2795 +Small,6x6,ldr-xy-01.png,36.2504,0.0128,0.0056,11.6508 +Small,6x6,ldr-xy-02.png,41.7327,0.0108,0.0036,18.1533 +Small,6x6,ldrs-rgba-00.png,28.6013,0.0144,0.0093,7.0100 +Small,6x6,ldrs-rgba-01.png,31.9643,0.0129,0.0078,8.3807 +Small,6x6,ldrs-rgba-02.png,27.7566,0.0166,0.0115,5.7112 +Small,8x8,hdr-rgb-00.hdr,23.5547,0.1174,0.0203,3.2344 +Small,8x8,ldr-rgb-00.png,27.6456,0.0199,0.0115,5.6903 +Small,8x8,ldr-rgb-01.png,28.6671,0.0187,0.0104,6.3063 +Small,8x8,ldr-rgb-02.png,23.0190,0.0249,0.0167,3.9241 +Small,8x8,ldr-rgb-03.png,37.0089,0.0114,0.0032,20.2146 +Small,8x8,ldr-rgb-04.png,29.0953,0.0177,0.0095,6.8963 +Small,8x8,ldr-rgb-05.png,25.5435,0.0251,0.0166,3.9366 +Small,8x8,ldr-rgb-06.png,23.0560,0.0249,0.0164,3.9953 +Small,8x8,ldr-rgb-07.png,29.3465,0.0175,0.0090,7.2769 +Small,8x8,ldr-rgb-08.png,33.8252,0.0127,0.0045,14.6939 +Small,8x8,ldr-rgb-09.png,28.4590,0.0175,0.0093,7.0188 +Small,8x8,ldr-rgb-10.png,31.8847,0.0091,0.0025,6.6056 +Small,8x8,ldr-rgba-00.png,25.1939,0.0233,0.0148,4.4338 +Small,8x8,ldr-rgba-01.png,28.1422,0.0198,0.0113,5.8027 +Small,8x8,ldr-rgba-02.png,23.8673,0.0262,0.0177,3.7041 +Small,8x8,ldr-xy-00.png,33.2085,0.0179,0.0065,10.0163 +Small,8x8,ldr-xy-01.png,33.9809,0.0182,0.0071,9.2278 +Small,8x8,ldr-xy-02.png,39.7786,0.0141,0.0030,21.6082 +Small,8x8,ldrs-rgba-00.png,25.1942,0.0234,0.0147,4.4573 +Small,8x8,ldrs-rgba-01.png,28.1449,0.0199,0.0113,5.8032 +Small,8x8,ldrs-rgba-02.png,23.8668,0.0262,0.0176,3.7306 +Small,12x12,hdr-rgb-00.hdr,20.4789,0.1296,0.0278,2.3564 +Small,12x12,ldr-rgb-00.png,23.6718,0.0230,0.0103,6.3473 +Small,12x12,ldr-rgb-01.png,24.7037,0.0202,0.0078,8.4365 +Small,12x12,ldr-rgb-02.png,19.1880,0.0316,0.0188,3.4780 +Small,12x12,ldr-rgb-03.png,33.1400,0.0149,0.0027,24.4184 +Small,12x12,ldr-rgb-04.png,24.3884,0.0201,0.0077,8.5057 +Small,12x12,ldr-rgb-05.png,21.3725,0.0286,0.0160,4.0945 +Small,12x12,ldr-rgb-06.png,19.1568,0.0328,0.0203,3.2285 +Small,12x12,ldr-rgb-07.png,25.2598,0.0197,0.0073,8.9962 +Small,12x12,ldr-rgb-08.png,30.0404,0.0162,0.0038,17.2879 +Small,12x12,ldr-rgb-09.png,23.5941,0.0231,0.0105,6.2160 +Small,12x12,ldr-rgb-10.png,27.2554,0.0136,0.0026,6.1832 +Small,12x12,ldr-rgba-00.png,21.2134,0.0293,0.0166,3.9375 +Small,12x12,ldr-rgba-01.png,24.4330,0.0224,0.0097,6.7534 +Small,12x12,ldr-rgba-02.png,20.1369,0.0368,0.0238,2.7541 +Small,12x12,ldr-xy-00.png,29.0083,0.0228,0.0063,10.4843 +Small,12x12,ldr-xy-01.png,29.7048,0.0219,0.0059,11.1246 +Small,12x12,ldr-xy-02.png,37.9716,0.0179,0.0020,32.2854 +Small,12x12,ldrs-rgba-00.png,21.2142,0.0297,0.0169,3.8771 +Small,12x12,ldrs-rgba-01.png,24.4339,0.0222,0.0092,7.1328 +Small,12x12,ldrs-rgba-02.png,20.1366,0.0368,0.0238,2.7519 +Small,3x3x3,ldr-l-00-3.dds,50.6008,0.0192,0.0131,20.0232 +Small,3x3x3,ldr-l-01-3.dds,53.7999,0.0090,0.0058,11.8096 +Small,6x6x6,ldr-l-00-3.dds,32.5074,0.0795,0.0582,4.5080 +Small,6x6x6,ldr-l-01-3.dds,40.7826,0.0414,0.0231,2.9788 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse4.1_medium_results.csv new file mode 100644 index 0000000..940eec8 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse4.1_medium_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1340,0.1228,0.0301,2.1809 +Small,4x4,ldr-rgb-00.png,38.7318,0.0367,0.0311,2.1067 +Small,4x4,ldr-rgb-01.png,40.1460,0.0340,0.0287,2.2822 +Small,4x4,ldr-rgb-02.png,35.2180,0.0353,0.0299,2.1882 +Small,4x4,ldr-rgb-03.png,47.1925,0.0209,0.0159,4.1301 +Small,4x4,ldr-rgb-04.png,42.1729,0.0289,0.0235,2.7870 +Small,4x4,ldr-rgb-05.png,37.7672,0.0376,0.0321,2.0435 +Small,4x4,ldr-rgb-06.png,35.3468,0.0316,0.0262,2.5046 +Small,4x4,ldr-rgb-07.png,39.2464,0.0434,0.0380,1.7224 +Small,4x4,ldr-rgb-08.png,45.1731,0.0248,0.0196,3.3439 +Small,4x4,ldr-rgb-09.png,42.0914,0.0296,0.0242,2.7111 +Small,4x4,ldr-rgb-10.png,44.8767,0.0075,0.0039,4.1618 +Small,4x4,ldr-rgba-00.png,36.2349,0.0400,0.0344,1.9058 +Small,4x4,ldr-rgba-01.png,38.8941,0.0251,0.0195,3.3611 +Small,4x4,ldr-rgba-02.png,34.9204,0.0285,0.0228,2.8764 +Small,4x4,ldr-xy-00.png,37.7447,0.0257,0.0186,3.5306 +Small,4x4,ldr-xy-01.png,45.1463,0.0349,0.0282,2.3240 +Small,4x4,ldr-xy-02.png,50.9227,0.0419,0.0349,1.8804 +Small,4x4,ldrs-rgba-00.png,36.2418,0.0399,0.0344,1.9048 +Small,4x4,ldrs-rgba-01.png,38.9101,0.0256,0.0200,3.2822 +Small,4x4,ldrs-rgba-02.png,34.9259,0.0285,0.0228,2.8764 +Small,5x5,hdr-rgb-00.hdr,29.8514,0.1346,0.0406,1.6153 +Small,5x5,ldr-rgb-00.png,35.0732,0.0447,0.0375,1.7475 +Small,5x5,ldr-rgb-01.png,36.3975,0.0375,0.0306,2.1426 +Small,5x5,ldr-rgb-02.png,31.0676,0.0399,0.0328,1.9979 +Small,5x5,ldr-rgb-03.png,43.9478,0.0173,0.0107,6.1501 +Small,5x5,ldr-rgb-04.png,37.6668,0.0346,0.0275,2.3788 +Small,5x5,ldr-rgb-05.png,33.5193,0.0500,0.0428,1.5329 +Small,5x5,ldr-rgb-06.png,31.0778,0.0377,0.0304,2.1546 +Small,5x5,ldr-rgb-07.png,36.2042,0.0534,0.0463,1.4159 +Small,5x5,ldr-rgb-08.png,41.5462,0.0254,0.0187,3.5082 +Small,5x5,ldr-rgb-09.png,37.5873,0.0325,0.0254,2.5753 +Small,5x5,ldr-rgb-10.png,40.4902,0.0098,0.0047,3.4831 +Small,5x5,ldr-rgba-00.png,32.7845,0.0529,0.0456,1.4387 +Small,5x5,ldr-rgba-01.png,35.2722,0.0310,0.0236,2.7772 +Small,5x5,ldr-rgba-02.png,31.1225,0.0368,0.0295,2.2187 +Small,5x5,ldr-xy-00.png,37.0726,0.0276,0.0189,3.4595 +Small,5x5,ldr-xy-01.png,40.7212,0.0362,0.0276,2.3735 +Small,5x5,ldr-xy-02.png,49.0674,0.0289,0.0200,3.2802 +Small,5x5,ldrs-rgba-00.png,32.7875,0.0530,0.0458,1.4297 +Small,5x5,ldrs-rgba-01.png,35.2789,0.0309,0.0237,2.7599 +Small,5x5,ldrs-rgba-02.png,31.1234,0.0368,0.0296,2.2153 +Small,6x6,hdr-rgb-00.hdr,27.4769,0.1401,0.0449,1.4599 +Small,6x6,ldr-rgb-00.png,32.3560,0.0474,0.0396,1.6547 +Small,6x6,ldr-rgb-01.png,33.0687,0.0392,0.0317,2.0656 +Small,6x6,ldr-rgb-02.png,27.4390,0.0431,0.0354,1.8511 +Small,6x6,ldr-rgb-03.png,41.6538,0.0156,0.0083,7.8789 +Small,6x6,ldr-rgb-04.png,34.2059,0.0353,0.0280,2.3444 +Small,6x6,ldr-rgb-05.png,30.1377,0.0550,0.0475,1.3804 +Small,6x6,ldr-rgb-06.png,27.5024,0.0430,0.0353,1.8565 +Small,6x6,ldr-rgb-07.png,33.8577,0.0510,0.0435,1.5074 +Small,6x6,ldr-rgb-08.png,39.0752,0.0217,0.0143,4.5990 +Small,6x6,ldr-rgb-09.png,33.6699,0.0340,0.0268,2.4493 +Small,6x6,ldr-rgb-10.png,36.9333,0.0112,0.0055,2.9811 +Small,6x6,ldr-rgba-00.png,30.2619,0.0597,0.0519,1.2626 +Small,6x6,ldr-rgba-01.png,32.1735,0.0331,0.0255,2.5698 +Small,6x6,ldr-rgba-02.png,27.8421,0.0416,0.0339,1.9329 +Small,6x6,ldr-xy-00.png,36.2566,0.0264,0.0171,3.8377 +Small,6x6,ldr-xy-01.png,37.7340,0.0302,0.0211,3.1097 +Small,6x6,ldr-xy-02.png,46.0639,0.0232,0.0141,4.6635 +Small,6x6,ldrs-rgba-00.png,30.2627,0.0594,0.0515,1.2721 +Small,6x6,ldrs-rgba-01.png,32.1795,0.0333,0.0256,2.5585 +Small,6x6,ldrs-rgba-02.png,27.8421,0.0418,0.0341,1.9205 +Small,8x8,hdr-rgb-00.hdr,24.1157,0.1591,0.0597,1.0980 +Small,8x8,ldr-rgb-00.png,28.7156,0.0657,0.0545,1.2029 +Small,8x8,ldr-rgb-01.png,28.9240,0.0512,0.0402,1.6317 +Small,8x8,ldr-rgb-02.png,23.1515,0.0601,0.0488,1.3419 +Small,8x8,ldr-rgb-03.png,38.4615,0.0207,0.0099,6.6099 +Small,8x8,ldr-rgb-04.png,29.6531,0.0482,0.0370,1.7730 +Small,8x8,ldr-rgb-05.png,25.9297,0.0682,0.0569,1.1517 +Small,8x8,ldr-rgb-06.png,23.1926,0.0599,0.0486,1.3496 +Small,8x8,ldr-rgb-07.png,30.5823,0.0592,0.0480,1.3647 +Small,8x8,ldr-rgb-08.png,35.7743,0.0276,0.0165,3.9834 +Small,8x8,ldr-rgb-09.png,29.0113,0.0460,0.0347,1.8913 +Small,8x8,ldr-rgb-10.png,32.1619,0.0178,0.0083,1.9666 +Small,8x8,ldr-rgba-00.png,26.4317,0.0758,0.0644,1.0175 +Small,8x8,ldr-rgba-01.png,28.3388,0.0450,0.0336,1.9497 +Small,8x8,ldr-rgba-02.png,23.9365,0.0623,0.0508,1.2904 +Small,8x8,ldr-xy-00.png,34.0144,0.0401,0.0256,2.5646 +Small,8x8,ldr-xy-01.png,34.9127,0.0393,0.0251,2.6065 +Small,8x8,ldr-xy-02.png,41.7218,0.0285,0.0148,4.4257 +Small,8x8,ldrs-rgba-00.png,26.4317,0.0766,0.0651,1.0069 +Small,8x8,ldrs-rgba-01.png,28.3416,0.0456,0.0340,1.9290 +Small,8x8,ldrs-rgba-02.png,23.9360,0.0626,0.0510,1.2847 +Small,12x12,hdr-rgb-00.hdr,20.7645,0.1921,0.0822,0.7975 +Small,12x12,ldr-rgb-00.png,24.6914,0.0823,0.0624,1.0496 +Small,12x12,ldr-rgb-01.png,25.0227,0.0700,0.0504,1.3011 +Small,12x12,ldr-rgb-02.png,19.2638,0.0940,0.0744,0.8804 +Small,12x12,ldr-rgb-03.png,34.9308,0.0298,0.0107,6.1444 +Small,12x12,ldr-rgb-04.png,24.9112,0.0658,0.0465,1.4079 +Small,12x12,ldr-rgb-05.png,21.6503,0.0958,0.0761,0.8616 +Small,12x12,ldr-rgb-06.png,19.2463,0.0912,0.0714,0.9181 +Small,12x12,ldr-rgb-07.png,26.5698,0.0693,0.0497,1.3197 +Small,12x12,ldr-rgb-08.png,31.5209,0.0374,0.0179,3.6588 +Small,12x12,ldr-rgb-09.png,24.1037,0.0667,0.0474,1.3823 +Small,12x12,ldr-rgb-10.png,27.9966,0.0349,0.0169,0.9634 +Small,12x12,ldr-rgba-00.png,22.1195,0.0923,0.0723,0.9063 +Small,12x12,ldr-rgba-01.png,24.6314,0.0672,0.0473,1.3862 +Small,12x12,ldr-rgba-02.png,20.1799,0.1005,0.0806,0.8130 +Small,12x12,ldr-xy-00.png,30.0722,0.0532,0.0294,2.2263 +Small,12x12,ldr-xy-01.png,31.8391,0.0521,0.0285,2.3024 +Small,12x12,ldr-xy-02.png,38.5216,0.0295,0.0058,11.3268 +Small,12x12,ldrs-rgba-00.png,22.1198,0.0923,0.0725,0.9036 +Small,12x12,ldrs-rgba-01.png,24.6333,0.0673,0.0475,1.3786 +Small,12x12,ldrs-rgba-02.png,20.1799,0.1003,0.0804,0.8151 +Small,3x3x3,ldr-l-00-3.dds,51.9667,0.0296,0.0216,12.1335 +Small,3x3x3,ldr-l-01-3.dds,54.3395,0.0116,0.0065,10.6243 +Small,6x6x6,ldr-l-00-3.dds,32.9251,0.0969,0.0735,3.5652 +Small,6x6x6,ldr-l-01-3.dds,40.8871,0.0439,0.0233,2.9577 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse4.1_thorough_results.csv new file mode 100644 index 0000000..0abc285 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-3.7-sse4.1_thorough_results.csv @@ -0,0 +1,110 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.3787,0.1558,0.0619,1.0581 +Small,4x4,ldr-rgb-00.png,39.1025,0.0734,0.0677,0.9686 +Small,4x4,ldr-rgb-01.png,40.3344,0.0730,0.0675,0.9704 +Small,4x4,ldr-rgb-02.png,35.3612,0.0679,0.0622,1.0535 +Small,4x4,ldr-rgb-03.png,47.6672,0.0673,0.0621,1.0557 +Small,4x4,ldr-rgb-04.png,42.3135,0.0659,0.0604,1.0856 +Small,4x4,ldr-rgb-05.png,37.9467,0.0758,0.0703,0.9323 +Small,4x4,ldr-rgb-06.png,35.4785,0.0628,0.0572,1.1462 +Small,4x4,ldr-rgb-07.png,39.8676,0.0823,0.0768,0.8531 +Small,4x4,ldr-rgb-08.png,45.7996,0.0635,0.0583,1.1242 +Small,4x4,ldr-rgb-09.png,42.2360,0.0694,0.0640,1.0244 +Small,4x4,ldr-rgb-10.png,44.9865,0.0121,0.0084,1.9339 +Small,4x4,ldr-rgba-00.png,36.7343,0.0753,0.0697,0.9404 +Small,4x4,ldr-rgba-01.png,39.0299,0.0619,0.0563,1.1647 +Small,4x4,ldr-rgba-02.png,34.9857,0.0605,0.0547,1.1988 +Small,4x4,ldr-xy-00.png,37.7553,0.0708,0.0637,1.0296 +Small,4x4,ldr-xy-01.png,45.2160,0.0796,0.0726,0.9025 +Small,4x4,ldr-xy-02.png,50.9992,0.0950,0.0878,0.7467 +Small,4x4,ldrs-rgba-00.png,36.7417,0.0758,0.0702,0.9335 +Small,4x4,ldrs-rgba-01.png,39.0514,0.0625,0.0568,1.1533 +Small,4x4,ldrs-rgba-02.png,34.9915,0.0611,0.0553,1.1844 +Small,5x5,hdr-rgb-00.hdr,30.2499,0.1734,0.0788,0.8313 +Small,5x5,ldr-rgb-00.png,35.3184,0.0935,0.0864,0.7587 +Small,5x5,ldr-rgb-01.png,36.4942,0.0895,0.0822,0.7971 +Small,5x5,ldr-rgb-02.png,31.1180,0.0851,0.0780,0.8403 +Small,5x5,ldr-rgb-03.png,44.4730,0.0828,0.0761,0.8616 +Small,5x5,ldr-rgb-04.png,37.8146,0.0846,0.0776,0.8447 +Small,5x5,ldr-rgb-05.png,33.6567,0.0967,0.0896,0.7312 +Small,5x5,ldr-rgb-06.png,31.1202,0.0809,0.0737,0.8888 +Small,5x5,ldr-rgb-07.png,36.7056,0.1059,0.0988,0.6633 +Small,5x5,ldr-rgb-08.png,42.2683,0.0780,0.0711,0.9213 +Small,5x5,ldr-rgb-09.png,37.6844,0.0883,0.0813,0.8065 +Small,5x5,ldr-rgb-10.png,40.6793,0.0166,0.0111,1.4592 +Small,5x5,ldr-rgba-00.png,33.1193,0.0973,0.0901,0.7272 +Small,5x5,ldr-rgba-01.png,35.3456,0.0793,0.0720,0.9106 +Small,5x5,ldr-rgba-02.png,31.1599,0.0805,0.0731,0.8969 +Small,5x5,ldr-xy-00.png,37.2903,0.0814,0.0727,0.9018 +Small,5x5,ldr-xy-01.png,41.5203,0.1006,0.0918,0.7139 +Small,5x5,ldr-xy-02.png,49.2640,0.1115,0.1027,0.6381 +Small,5x5,ldrs-rgba-00.png,33.1229,0.0989,0.0916,0.7152 +Small,5x5,ldrs-rgba-01.png,35.3541,0.0806,0.0732,0.8950 +Small,5x5,ldrs-rgba-02.png,31.1602,0.0806,0.0732,0.8951 +Small,6x6,hdr-rgb-00.hdr,27.6571,0.1891,0.0945,0.6935 +Small,6x6,ldr-rgb-00.png,32.6208,0.1137,0.1058,0.6196 +Small,6x6,ldr-rgb-01.png,33.1469,0.1041,0.0964,0.6801 +Small,6x6,ldr-rgb-02.png,27.4754,0.1010,0.0931,0.7043 +Small,6x6,ldr-rgb-03.png,42.5226,0.0694,0.0620,1.0576 +Small,6x6,ldr-rgb-04.png,34.3223,0.0997,0.0921,0.7113 +Small,6x6,ldr-rgb-05.png,30.2576,0.1127,0.1051,0.6236 +Small,6x6,ldr-rgb-06.png,27.5390,0.0974,0.0897,0.7310 +Small,6x6,ldr-rgb-07.png,34.3854,0.1182,0.1106,0.5926 +Small,6x6,ldr-rgb-08.png,39.8830,0.0693,0.0618,1.0609 +Small,6x6,ldr-rgb-09.png,33.7955,0.0954,0.0878,0.7467 +Small,6x6,ldr-rgb-10.png,37.1039,0.0206,0.0149,1.0934 +Small,6x6,ldr-rgba-00.png,30.5113,0.1168,0.1089,0.6016 +Small,6x6,ldr-rgba-01.png,32.2316,0.0972,0.0893,0.7335 +Small,6x6,ldr-rgba-02.png,27.8753,0.1012,0.0933,0.7027 +Small,6x6,ldr-xy-00.png,36.3804,0.0706,0.0608,1.0786 +Small,6x6,ldr-xy-01.png,38.0614,0.1012,0.0918,0.7142 +Small,6x6,ldr-xy-02.png,47.4738,0.1244,0.1149,0.5705 +Small,6x6,ldrs-rgba-00.png,30.5130,0.1172,0.1090,0.6012 +Small,6x6,ldrs-rgba-01.png,32.2377,0.0983,0.0903,0.7260 +Small,6x6,ldrs-rgba-02.png,27.8745,0.1025,0.0946,0.6927 +Small,8x8,hdr-rgb-00.hdr,24.3160,0.2278,0.1271,0.5156 +Small,8x8,ldr-rgb-00.png,28.9383,0.1462,0.1332,0.4921 +Small,8x8,ldr-rgb-01.png,28.9883,0.1311,0.1184,0.5537 +Small,8x8,ldr-rgb-02.png,23.1859,0.1375,0.1248,0.5253 +Small,8x8,ldr-rgb-03.png,39.3501,0.0473,0.0348,1.8841 +Small,8x8,ldr-rgb-04.png,29.7733,0.1225,0.1097,0.5974 +Small,8x8,ldr-rgb-05.png,26.0247,0.1433,0.1304,0.5026 +Small,8x8,ldr-rgb-06.png,23.2333,0.1362,0.1234,0.5309 +Small,8x8,ldr-rgb-07.png,31.1039,0.1376,0.1249,0.5249 +Small,8x8,ldr-rgb-08.png,36.4625,0.0679,0.0553,1.1860 +Small,8x8,ldr-rgb-09.png,29.1557,0.1047,0.0917,0.7147 +Small,8x8,ldr-rgb-10.png,32.3031,0.0312,0.0202,0.8044 +Small,8x8,ldr-rgba-00.png,26.6905,0.1532,0.1402,0.4675 +Small,8x8,ldr-rgba-01.png,28.3935,0.1220,0.1088,0.6022 +Small,8x8,ldr-rgba-02.png,23.9597,0.1459,0.1326,0.4942 +Small,8x8,ldr-xy-00.png,34.3120,0.0855,0.0710,0.9229 +Small,8x8,ldr-xy-01.png,35.2097,0.0881,0.0737,0.8891 +Small,8x8,ldr-xy-02.png,44.5878,0.1111,0.0965,0.6793 +Small,8x8,ldrs-rgba-00.png,26.6912,0.1536,0.1407,0.4658 +Small,8x8,ldrs-rgba-01.png,28.3962,0.1204,0.1075,0.6096 +Small,8x8,ldrs-rgba-02.png,23.9595,0.1444,0.1312,0.4996 +Small,12x12,hdr-rgb-00.hdr,21.0023,0.2773,0.1667,0.3930 +Small,12x12,ldr-rgb-00.png,25.0193,0.1845,0.1620,0.4044 +Small,12x12,ldr-rgb-01.png,25.1167,0.1561,0.1335,0.4911 +Small,12x12,ldr-rgb-02.png,19.2919,0.1887,0.1659,0.3950 +Small,12x12,ldr-rgb-03.png,36.1206,0.0574,0.0349,1.8765 +Small,12x12,ldr-rgb-04.png,25.0063,0.1546,0.1319,0.4968 +Small,12x12,ldr-rgb-05.png,21.7165,0.1866,0.1637,0.4004 +Small,12x12,ldr-rgb-06.png,19.2807,0.1824,0.1595,0.4109 +Small,12x12,ldr-rgb-07.png,27.0419,0.1660,0.1433,0.4575 +Small,12x12,ldr-rgb-08.png,32.3840,0.0784,0.0559,1.1715 +Small,12x12,ldr-rgb-09.png,24.3010,0.1482,0.1254,0.5224 +Small,12x12,ldr-rgb-10.png,28.1496,0.0552,0.0344,0.4720 +Small,12x12,ldr-rgba-00.png,22.7076,0.1981,0.1751,0.3744 +Small,12x12,ldr-rgba-01.png,24.7112,0.1472,0.1240,0.5284 +Small,12x12,ldr-rgba-02.png,20.1958,0.1922,0.1692,0.3873 +Small,12x12,ldr-xy-00.png,30.5742,0.1162,0.0917,0.7145 +Small,12x12,ldr-xy-01.png,32.1254,0.0878,0.0634,1.0337 +Small,12x12,ldr-xy-02.png,40.3053,0.0639,0.0394,1.6636 +Small,12x12,ldrs-rgba-00.png,22.7071,0.1975,0.1747,0.3751 +Small,12x12,ldrs-rgba-01.png,24.7127,0.1461,0.1232,0.5318 +Small,12x12,ldrs-rgba-02.png,20.1960,0.1930,0.1699,0.3857 +Small,3x3x3,ldr-l-00-3.dds,52.4155,0.0553,0.0473,5.5424 +Small,3x3x3,ldr-l-01-3.dds,55.3973,0.0239,0.0188,3.6664 +Small,6x6x6,ldr-l-00-3.dds,33.2725,0.1435,0.1172,2.2360 +Small,6x6x6,ldr-l-01-3.dds,41.5751,0.0476,0.0243,2.8379 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-avx2_fast_results.csv new file mode 100644 index 0000000..43bff8b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-avx2_fast_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.7281,0.1472,0.0126,5.2115 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0097,0.0013,0.1984 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0099,0.0010,0.2540 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0080,0.0010,0.2586 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0095,0.0010,0.2584 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0098,0.0011,0.2349 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0096,0.0010,0.2614 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0098,0.0010,0.2653 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0097,0.0011,0.2413 +Small,4x4,ldr-rgb-00.png,38.2700,0.0241,0.0081,8.1229 +Small,4x4,ldr-rgb-01.png,39.9568,0.0228,0.0068,9.6703 +Small,4x4,ldr-rgb-02.png,35.1963,0.0256,0.0110,5.9665 +Small,4x4,ldr-rgb-03.png,46.0467,0.0184,0.0025,25.8417 +Small,4x4,ldr-rgb-04.png,42.0037,0.0211,0.0048,13.7418 +Small,4x4,ldr-rgb-05.png,37.3577,0.0273,0.0106,6.1606 +Small,4x4,ldr-rgb-06.png,35.3918,0.0266,0.0099,6.6091 +Small,4x4,ldr-rgb-07.png,38.1916,0.0273,0.0111,5.8787 +Small,4x4,ldr-rgb-08.png,43.9030,0.0198,0.0039,16.6462 +Small,4x4,ldr-rgb-09.png,41.9061,0.0181,0.0048,13.7014 +Small,4x4,ldr-rgb-10.png,44.4858,0.0155,0.0013,12.5037 +Small,4x4,ldr-rgba-00.png,35.6075,0.0270,0.0108,6.0682 +Small,4x4,ldr-rgba-01.png,38.8915,0.0230,0.0064,10.3140 +Small,4x4,ldr-rgba-02.png,34.9103,0.0256,0.0091,7.2407 +Small,4x4,ldr-xy-00.png,37.6561,0.0224,0.0045,14.7072 +Small,4x4,ldr-xy-01.png,44.2119,0.0233,0.0053,12.3396 +Small,4x4,ldr-xy-02.png,48.3459,0.0205,0.0032,20.2399 +Small,4x4,ldrs-rgba-00.png,35.6094,0.0277,0.0107,6.1163 +Small,4x4,ldrs-rgba-01.png,38.8931,0.0226,0.0064,10.2962 +Small,4x4,ldrs-rgba-02.png,34.8940,0.0257,0.0090,7.2600 +Small,5x5,hdr-rgb-00.hdr,29.5418,0.1508,0.0118,5.5427 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0101,0.0011,0.2321 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0095,0.0010,0.2591 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0095,0.0009,0.2750 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0092,0.0010,0.2594 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0097,0.0009,0.2759 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0095,0.0010,0.2550 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0092,0.0010,0.2639 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0095,0.0011,0.2435 +Small,5x5,ldr-rgb-00.png,34.4434,0.0236,0.0077,8.5025 +Small,5x5,ldr-rgb-01.png,36.2670,0.0215,0.0051,12.7850 +Small,5x5,ldr-rgb-02.png,31.1094,0.0250,0.0081,8.0432 +Small,5x5,ldr-rgb-03.png,42.8398,0.0186,0.0021,30.7676 +Small,5x5,ldr-rgb-04.png,37.2876,0.0214,0.0043,15.1389 +Small,5x5,ldr-rgb-05.png,33.2882,0.0281,0.0106,6.1908 +Small,5x5,ldr-rgb-06.png,31.1492,0.0245,0.0079,8.2623 +Small,5x5,ldr-rgb-07.png,35.1044,0.0257,0.0085,7.7485 +Small,5x5,ldr-rgb-08.png,40.2560,0.0199,0.0032,20.2086 +Small,5x5,ldr-rgb-09.png,37.2934,0.0215,0.0044,14.7768 +Small,5x5,ldr-rgb-10.png,40.2099,0.0159,0.0011,14.3482 +Small,5x5,ldr-rgba-00.png,32.1563,0.0278,0.0108,6.0686 +Small,5x5,ldr-rgba-01.png,35.2201,0.0220,0.0059,11.0553 +Small,5x5,ldr-rgba-02.png,31.1519,0.0253,0.0085,7.7448 +Small,5x5,ldr-xy-00.png,36.7408,0.0212,0.0035,18.7094 +Small,5x5,ldr-xy-01.png,39.8426,0.0221,0.0044,15.0626 +Small,5x5,ldr-xy-02.png,43.9819,0.0212,0.0030,21.7449 +Small,5x5,ldrs-rgba-00.png,32.1540,0.0279,0.0109,5.9872 +Small,5x5,ldrs-rgba-01.png,35.2189,0.0222,0.0059,11.1589 +Small,5x5,ldrs-rgba-02.png,31.1450,0.0255,0.0084,7.7955 +Small,6x6,hdr-rgb-00.hdr,27.0785,0.1497,0.0114,5.7624 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0099,0.0010,0.2620 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0098,0.0010,0.2681 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0102,0.0010,0.2583 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0096,0.0010,0.2492 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0098,0.0010,0.2441 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0103,0.0011,0.2368 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0098,0.0010,0.2471 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0100,0.0010,0.2612 +Small,6x6,ldr-rgb-00.png,31.7201,0.0253,0.0091,7.2018 +Small,6x6,ldr-rgb-01.png,32.9461,0.0228,0.0060,10.8609 +Small,6x6,ldr-rgb-02.png,27.4945,0.0252,0.0088,7.4261 +Small,6x6,ldr-rgb-03.png,40.6123,0.0188,0.0022,29.9921 +Small,6x6,ldr-rgb-04.png,33.9447,0.0222,0.0049,13.4540 +Small,6x6,ldr-rgb-05.png,29.9962,0.0296,0.0118,5.5337 +Small,6x6,ldr-rgb-06.png,27.5637,0.0258,0.0087,7.5373 +Small,6x6,ldr-rgb-07.png,32.9859,0.0248,0.0083,7.8999 +Small,6x6,ldr-rgb-08.png,37.8899,0.0193,0.0033,19.9144 +Small,6x6,ldr-rgb-09.png,33.4975,0.0219,0.0052,12.6416 +Small,6x6,ldr-rgb-10.png,36.7053,0.0159,0.0012,13.0468 +Small,6x6,ldr-rgba-00.png,29.6096,0.0291,0.0123,5.3147 +Small,6x6,ldr-rgba-01.png,32.1075,0.0231,0.0066,9.9539 +Small,6x6,ldr-rgba-02.png,27.8547,0.0260,0.0093,7.0599 +Small,6x6,ldr-xy-00.png,35.9052,0.0215,0.0037,17.5093 +Small,6x6,ldr-xy-01.png,37.1922,0.0230,0.0052,12.5423 +Small,6x6,ldr-xy-02.png,41.9609,0.0210,0.0029,22.4757 +Small,6x6,ldrs-rgba-00.png,29.6069,0.0277,0.0123,5.3234 +Small,6x6,ldrs-rgba-01.png,32.1031,0.0239,0.0066,9.8699 +Small,6x6,ldrs-rgba-02.png,27.8398,0.0252,0.0095,6.8912 +Small,8x8,hdr-rgb-00.hdr,23.7878,0.1462,0.0137,4.7771 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0083,0.0011,0.2273 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0084,0.0011,0.2388 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0098,0.0013,0.1984 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0100,0.0010,0.2560 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0089,0.0011,0.2427 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0098,0.0010,0.2537 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0100,0.0010,0.2450 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0103,0.0010,0.2480 +Small,8x8,ldr-rgb-00.png,28.0747,0.0267,0.0099,6.6271 +Small,8x8,ldr-rgb-01.png,28.7890,0.0250,0.0078,8.3958 +Small,8x8,ldr-rgb-02.png,23.1132,0.0291,0.0118,5.5581 +Small,8x8,ldr-rgb-03.png,37.3786,0.0190,0.0023,28.9986 +Small,8x8,ldr-rgb-04.png,29.3571,0.0242,0.0070,9.3315 +Small,8x8,ldr-rgb-05.png,25.8131,0.0301,0.0139,4.7288 +Small,8x8,ldr-rgb-06.png,23.1776,0.0301,0.0121,5.3979 +Small,8x8,ldr-rgb-07.png,29.8769,0.0243,0.0078,8.3590 +Small,8x8,ldr-rgb-08.png,34.5214,0.0205,0.0036,18.1798 +Small,8x8,ldr-rgb-09.png,28.6522,0.0236,0.0067,9.7672 +Small,8x8,ldr-rgb-10.png,32.0068,0.0170,0.0016,10.0772 +Small,8x8,ldr-rgba-00.png,25.7092,0.0306,0.0135,4.8667 +Small,8x8,ldr-rgba-01.png,28.3054,0.0255,0.0092,7.1538 +Small,8x8,ldr-rgba-02.png,23.9438,0.0293,0.0130,5.0564 +Small,8x8,ldr-xy-00.png,33.3643,0.0231,0.0046,14.3840 +Small,8x8,ldr-xy-01.png,34.3964,0.0245,0.0055,11.9398 +Small,8x8,ldr-xy-02.png,39.8866,0.0206,0.0020,32.7041 +Small,8x8,ldrs-rgba-00.png,25.7053,0.0303,0.0135,4.8664 +Small,8x8,ldrs-rgba-01.png,28.2955,0.0255,0.0091,7.1710 +Small,8x8,ldrs-rgba-02.png,23.9365,0.0296,0.0131,4.9997 +Small,12x12,hdr-rgb-00.hdr,20.5371,0.1562,0.0202,3.2386 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0119,0.0010,0.2498 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0110,0.0011,0.2359 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0098,0.0011,0.2250 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0113,0.0010,0.2555 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0116,0.0011,0.2362 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0099,0.0013,0.1998 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0115,0.0012,0.2205 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0115,0.0011,0.2404 +Small,12x12,ldr-rgb-00.png,23.8044,0.0276,0.0084,7.8066 +Small,12x12,ldr-rgb-01.png,24.7859,0.0251,0.0060,10.8519 +Small,12x12,ldr-rgb-02.png,19.2338,0.0343,0.0137,4.7896 +Small,12x12,ldr-rgb-03.png,33.2733,0.0195,0.0017,39.0341 +Small,12x12,ldr-rgb-04.png,24.5789,0.0249,0.0059,11.1116 +Small,12x12,ldr-rgb-05.png,21.4954,0.0310,0.0120,5.4586 +Small,12x12,ldr-rgb-06.png,19.2327,0.0330,0.0144,4.5515 +Small,12x12,ldr-rgb-07.png,25.4006,0.0237,0.0059,11.1003 +Small,12x12,ldr-rgb-08.png,30.3089,0.0210,0.0027,23.8837 +Small,12x12,ldr-rgb-09.png,23.7455,0.0269,0.0077,8.5400 +Small,12x12,ldr-rgb-10.png,27.3338,0.0192,0.0021,7.7331 +Small,12x12,ldr-rgba-00.png,21.6156,0.0328,0.0138,4.7607 +Small,12x12,ldr-rgba-01.png,24.5339,0.0260,0.0075,8.7944 +Small,12x12,ldr-rgba-02.png,20.1778,0.0336,0.0163,4.0211 +Small,12x12,ldr-xy-00.png,29.2438,0.0261,0.0047,14.0840 +Small,12x12,ldr-xy-01.png,30.5551,0.0272,0.0040,16.2505 +Small,12x12,ldr-xy-02.png,37.9965,0.0234,0.0010,63.9400 +Small,12x12,ldrs-rgba-00.png,21.6151,0.0318,0.0137,4.7792 +Small,12x12,ldrs-rgba-01.png,24.5310,0.0259,0.0075,8.7955 +Small,12x12,ldrs-rgba-02.png,20.1749,0.0349,0.0164,4.0020 +Small,3x3x3,ldr-l-00-3.dds,50.2752,0.0210,0.0076,34.6390 +Small,3x3x3,ldr-l-01-3.dds,51.8763,0.0127,0.0033,21.0712 +Small,6x6x6,ldr-l-00-3.dds,32.5486,0.0494,0.0354,7.4121 +Small,6x6x6,ldr-l-01-3.dds,40.8686,0.0260,0.0139,4.9484 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-avx2_fastest_results.csv new file mode 100644 index 0000000..c031a2c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-avx2_fastest_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.3455,0.1405,0.0076,8.6152 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0090,0.0011,0.2230 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0091,0.0010,0.2614 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0089,0.0010,0.2505 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0094,0.0010,0.2628 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0085,0.0011,0.2263 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0096,0.0011,0.2294 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0092,0.0010,0.2604 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0092,0.0010,0.2462 +Small,4x4,ldr-rgb-00.png,37.2582,0.0209,0.0045,14.4255 +Small,4x4,ldr-rgb-01.png,39.5673,0.0206,0.0042,15.7127 +Small,4x4,ldr-rgb-02.png,34.8275,0.0225,0.0059,11.0704 +Small,4x4,ldr-rgb-03.png,45.4522,0.0181,0.0019,33.9230 +Small,4x4,ldr-rgb-04.png,41.7305,0.0195,0.0033,19.9984 +Small,4x4,ldr-rgb-05.png,36.8931,0.0224,0.0062,10.5893 +Small,4x4,ldr-rgb-06.png,35.0002,0.0216,0.0055,11.8789 +Small,4x4,ldr-rgb-07.png,37.4123,0.0223,0.0059,11.0811 +Small,4x4,ldr-rgb-08.png,43.0339,0.0190,0.0027,24.3535 +Small,4x4,ldr-rgb-09.png,41.7131,0.0192,0.0032,20.3719 +Small,4x4,ldr-rgb-10.png,43.9533,0.0153,0.0010,16.0467 +Small,4x4,ldr-rgba-00.png,34.7402,0.0196,0.0059,11.0459 +Small,4x4,ldr-rgba-01.png,38.6972,0.0200,0.0044,14.9626 +Small,4x4,ldr-rgba-02.png,34.6012,0.0223,0.0062,10.5076 +Small,4x4,ldr-xy-00.png,37.6163,0.0212,0.0033,19.6918 +Small,4x4,ldr-xy-01.png,43.9354,0.0210,0.0038,17.3742 +Small,4x4,ldr-xy-02.png,48.3675,0.0200,0.0027,24.0404 +Small,4x4,ldrs-rgba-00.png,34.7410,0.0221,0.0060,10.9356 +Small,4x4,ldrs-rgba-01.png,38.6988,0.0202,0.0044,14.9724 +Small,4x4,ldrs-rgba-02.png,34.5841,0.0220,0.0062,10.5617 +Small,5x5,hdr-rgb-00.hdr,28.8645,0.1407,0.0068,9.6037 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0099,0.0011,0.2244 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0093,0.0011,0.2397 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0089,0.0010,0.2614 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0091,0.0010,0.2576 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0090,0.0010,0.2615 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0079,0.0010,0.2565 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0094,0.0011,0.2359 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0091,0.0010,0.2634 +Small,5x5,ldr-rgb-00.png,33.7346,0.0200,0.0045,14.6484 +Small,5x5,ldr-rgb-01.png,36.0898,0.0206,0.0037,17.9015 +Small,5x5,ldr-rgb-02.png,31.0129,0.0226,0.0058,11.3699 +Small,5x5,ldr-rgb-03.png,42.4476,0.0175,0.0017,38.5739 +Small,5x5,ldr-rgb-04.png,37.0450,0.0195,0.0033,19.7569 +Small,5x5,ldr-rgb-05.png,32.9822,0.0229,0.0064,10.1750 +Small,5x5,ldr-rgb-06.png,31.0536,0.0224,0.0056,11.6385 +Small,5x5,ldr-rgb-07.png,34.4588,0.0218,0.0053,12.2544 +Small,5x5,ldr-rgb-08.png,39.6603,0.0180,0.0022,29.4680 +Small,5x5,ldr-rgb-09.png,37.0769,0.0196,0.0033,19.7102 +Small,5x5,ldr-rgb-10.png,39.9359,0.0160,0.0010,15.6634 +Small,5x5,ldr-rgba-00.png,31.1232,0.0213,0.0061,10.7488 +Small,5x5,ldr-rgba-01.png,35.0597,0.0207,0.0044,15.0346 +Small,5x5,ldr-rgba-02.png,31.0601,0.0220,0.0063,10.3959 +Small,5x5,ldr-xy-00.png,36.6317,0.0206,0.0028,23.4818 +Small,5x5,ldr-xy-01.png,39.3017,0.0207,0.0034,19.3781 +Small,5x5,ldr-xy-02.png,43.8850,0.0208,0.0026,25.4894 +Small,5x5,ldrs-rgba-00.png,31.1191,0.0220,0.0060,10.9009 +Small,5x5,ldrs-rgba-01.png,35.0595,0.0207,0.0043,15.3298 +Small,5x5,ldrs-rgba-02.png,31.0449,0.0228,0.0064,10.2563 +Small,6x6,hdr-rgb-00.hdr,26.7568,0.1436,0.0063,10.4759 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0095,0.0010,0.2618 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0088,0.0010,0.2532 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0093,0.0010,0.2612 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0091,0.0010,0.2584 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0097,0.0010,0.2604 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0096,0.0010,0.2459 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0092,0.0010,0.2576 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0092,0.0011,0.2417 +Small,6x6,ldr-rgb-00.png,31.3522,0.0207,0.0049,13.3475 +Small,6x6,ldr-rgb-01.png,32.8566,0.0200,0.0041,15.7958 +Small,6x6,ldr-rgb-02.png,27.4076,0.0238,0.0062,10.5649 +Small,6x6,ldr-rgb-03.png,40.3684,0.0171,0.0016,42.0689 +Small,6x6,ldr-rgb-04.png,33.7717,0.0205,0.0037,17.5742 +Small,6x6,ldr-rgb-05.png,29.7603,0.0236,0.0071,9.2474 +Small,6x6,ldr-rgb-06.png,27.4861,0.0236,0.0063,10.3338 +Small,6x6,ldr-rgb-07.png,32.3756,0.0222,0.0051,12.9696 +Small,6x6,ldr-rgb-08.png,37.5033,0.0177,0.0023,28.6809 +Small,6x6,ldr-rgb-09.png,33.3194,0.0207,0.0036,18.2449 +Small,6x6,ldr-rgb-10.png,36.5829,0.0153,0.0010,15.9978 +Small,6x6,ldr-rgba-00.png,28.8481,0.0229,0.0063,10.3716 +Small,6x6,ldr-rgba-01.png,32.0167,0.0204,0.0047,14.0876 +Small,6x6,ldr-rgba-02.png,27.7951,0.0221,0.0063,10.4441 +Small,6x6,ldr-xy-00.png,35.6742,0.0197,0.0029,22.7869 +Small,6x6,ldr-xy-01.png,36.5951,0.0215,0.0036,18.1294 +Small,6x6,ldr-xy-02.png,41.8228,0.0200,0.0023,28.7800 +Small,6x6,ldrs-rgba-00.png,28.8448,0.0221,0.0063,10.3599 +Small,6x6,ldrs-rgba-01.png,32.0125,0.0204,0.0047,13.8081 +Small,6x6,ldrs-rgba-02.png,27.7831,0.0228,0.0064,10.2528 +Small,8x8,hdr-rgb-00.hdr,23.6169,0.1361,0.0093,7.0735 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0101,0.0010,0.2500 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0098,0.0010,0.2642 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0095,0.0010,0.2450 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0097,0.0010,0.2568 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0094,0.0010,0.2613 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0088,0.0010,0.2547 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0098,0.0010,0.2459 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0084,0.0011,0.2228 +Small,8x8,ldr-rgb-00.png,27.7216,0.0227,0.0070,9.4269 +Small,8x8,ldr-rgb-01.png,28.7030,0.0229,0.0058,11.2104 +Small,8x8,ldr-rgb-02.png,23.0366,0.0251,0.0089,7.3745 +Small,8x8,ldr-rgb-03.png,37.0954,0.0186,0.0018,36.0496 +Small,8x8,ldr-rgb-04.png,29.1352,0.0217,0.0054,12.0693 +Small,8x8,ldr-rgb-05.png,25.6104,0.0271,0.0101,6.4715 +Small,8x8,ldr-rgb-06.png,23.0940,0.0255,0.0091,7.2407 +Small,8x8,ldr-rgb-07.png,29.5040,0.0227,0.0057,11.5870 +Small,8x8,ldr-rgb-08.png,33.9884,0.0194,0.0026,25.2529 +Small,8x8,ldr-rgb-09.png,28.4595,0.0226,0.0051,12.7702 +Small,8x8,ldr-rgb-10.png,31.9190,0.0167,0.0013,12.7994 +Small,8x8,ldr-rgba-00.png,25.3524,0.0258,0.0092,7.1336 +Small,8x8,ldr-rgba-01.png,28.2082,0.0233,0.0066,9.9252 +Small,8x8,ldr-rgba-02.png,23.8815,0.0259,0.0091,7.2192 +Small,8x8,ldr-xy-00.png,33.2419,0.0225,0.0036,18.2752 +Small,8x8,ldr-xy-01.png,34.1451,0.0231,0.0042,15.5448 +Small,8x8,ldr-xy-02.png,39.7693,0.0208,0.0017,38.4606 +Small,8x8,ldrs-rgba-00.png,25.3487,0.0253,0.0092,7.1120 +Small,8x8,ldrs-rgba-01.png,28.1979,0.0228,0.0066,9.9781 +Small,8x8,ldrs-rgba-02.png,23.8757,0.0256,0.0088,7.4354 +Small,12x12,hdr-rgb-00.hdr,20.4537,0.1507,0.0140,4.6731 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0117,0.0010,0.2537 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0107,0.0011,0.2370 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0110,0.0010,0.2568 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0112,0.0010,0.2615 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0109,0.0011,0.2397 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0103,0.0010,0.2486 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0107,0.0010,0.2540 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0110,0.0011,0.2362 +Small,12x12,ldr-rgb-00.png,23.7273,0.0244,0.0061,10.7152 +Small,12x12,ldr-rgb-01.png,24.7394,0.0235,0.0044,14.8703 +Small,12x12,ldr-rgb-02.png,19.1996,0.0281,0.0096,6.7962 +Small,12x12,ldr-rgb-03.png,33.1771,0.0194,0.0016,40.5784 +Small,12x12,ldr-rgb-04.png,24.3899,0.0222,0.0044,14.9390 +Small,12x12,ldr-rgb-05.png,21.3900,0.0270,0.0087,7.5591 +Small,12x12,ldr-rgb-06.png,19.1751,0.0260,0.0103,6.3701 +Small,12x12,ldr-rgb-07.png,25.3358,0.0231,0.0043,15.4166 +Small,12x12,ldr-rgb-08.png,30.1393,0.0202,0.0021,30.9547 +Small,12x12,ldr-rgb-09.png,23.6063,0.0241,0.0057,11.4237 +Small,12x12,ldr-rgb-10.png,27.2944,0.0184,0.0016,10.0475 +Small,12x12,ldr-rgba-00.png,21.3688,0.0266,0.0095,6.9190 +Small,12x12,ldr-rgba-01.png,24.4942,0.0227,0.0054,12.0868 +Small,12x12,ldr-rgba-02.png,20.1436,0.0298,0.0116,5.6472 +Small,12x12,ldr-xy-00.png,28.8952,0.0267,0.0037,17.9495 +Small,12x12,ldr-xy-01.png,29.6655,0.0251,0.0033,20.1523 +Small,12x12,ldr-xy-02.png,37.9744,0.0218,0.0011,60.4526 +Small,12x12,ldrs-rgba-00.png,21.3639,0.0275,0.0093,7.0099 +Small,12x12,ldrs-rgba-01.png,24.4913,0.0247,0.0054,12.1316 +Small,12x12,ldrs-rgba-02.png,20.1416,0.0296,0.0115,5.6795 +Small,3x3x3,ldr-l-00-3.dds,50.1569,0.0200,0.0073,35.9988 +Small,3x3x3,ldr-l-01-3.dds,51.8557,0.0129,0.0032,21.3766 +Small,6x6x6,ldr-l-00-3.dds,32.5328,0.0494,0.0350,7.4834 +Small,6x6x6,ldr-l-01-3.dds,40.8686,0.0252,0.0135,5.0879 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-avx2_medium_results.csv new file mode 100644 index 0000000..7357db7 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-avx2_medium_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1462,0.1536,0.0185,3.5408 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0102,0.0011,0.2411 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0088,0.0011,0.2434 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0099,0.0010,0.2500 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0095,0.0011,0.2361 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0096,0.0010,0.2497 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0096,0.0010,0.2586 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0082,0.0010,0.2573 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0091,0.0009,0.2729 +Small,4x4,ldr-rgb-00.png,38.8542,0.0367,0.0204,3.2078 +Small,4x4,ldr-rgb-01.png,40.2577,0.0347,0.0176,3.7251 +Small,4x4,ldr-rgb-02.png,35.3269,0.0346,0.0176,3.7152 +Small,4x4,ldr-rgb-03.png,47.3379,0.0282,0.0114,5.7307 +Small,4x4,ldr-rgb-04.png,42.2428,0.0306,0.0139,4.7257 +Small,4x4,ldr-rgb-05.png,37.8423,0.0367,0.0193,3.3913 +Small,4x4,ldr-rgb-06.png,35.5075,0.0323,0.0155,4.2282 +Small,4x4,ldr-rgb-07.png,39.3480,0.0424,0.0251,2.6142 +Small,4x4,ldr-rgb-08.png,45.3018,0.0300,0.0133,4.9131 +Small,4x4,ldr-rgb-09.png,42.1528,0.0321,0.0151,4.3445 +Small,4x4,ldr-rgb-10.png,44.9871,0.0173,0.0024,6.8217 +Small,4x4,ldr-rgba-00.png,36.2694,0.0392,0.0227,2.8888 +Small,4x4,ldr-rgba-01.png,38.9985,0.0293,0.0131,4.9929 +Small,4x4,ldr-rgba-02.png,34.9757,0.0318,0.0144,4.5667 +Small,4x4,ldr-xy-00.png,37.8045,0.0298,0.0123,5.3442 +Small,4x4,ldr-xy-01.png,45.2632,0.0364,0.0182,3.5934 +Small,4x4,ldr-xy-02.png,51.3220,0.0399,0.0225,2.9110 +Small,4x4,ldrs-rgba-00.png,36.2680,0.0402,0.0228,2.8693 +Small,4x4,ldrs-rgba-01.png,39.0001,0.0293,0.0131,5.0051 +Small,4x4,ldrs-rgba-02.png,34.9625,0.0312,0.0146,4.4872 +Small,5x5,hdr-rgb-00.hdr,29.9041,0.1550,0.0190,3.4480 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0099,0.0010,0.2488 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0097,0.0010,0.2512 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0099,0.0010,0.2545 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0096,0.0010,0.2544 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0097,0.0010,0.2602 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0100,0.0010,0.2589 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0103,0.0010,0.2438 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0095,0.0010,0.2571 +Small,5x5,ldr-rgb-00.png,35.1529,0.0364,0.0196,3.3406 +Small,5x5,ldr-rgb-01.png,36.4665,0.0316,0.0144,4.5508 +Small,5x5,ldr-rgb-02.png,31.1516,0.0313,0.0146,4.4931 +Small,5x5,ldr-rgb-03.png,44.0943,0.0226,0.0063,10.4739 +Small,5x5,ldr-rgb-04.png,37.6982,0.0300,0.0133,4.9142 +Small,5x5,ldr-rgb-05.png,33.5609,0.0372,0.0207,3.1695 +Small,5x5,ldr-rgb-06.png,31.1959,0.0307,0.0139,4.6997 +Small,5x5,ldr-rgb-07.png,36.2015,0.0410,0.0241,2.7222 +Small,5x5,ldr-rgb-08.png,41.7238,0.0270,0.0103,6.3826 +Small,5x5,ldr-rgb-09.png,37.5901,0.0288,0.0123,5.3208 +Small,5x5,ldr-rgb-10.png,40.6034,0.0170,0.0026,6.2940 +Small,5x5,ldr-rgba-00.png,32.8000,0.0403,0.0238,2.7541 +Small,5x5,ldr-rgba-01.png,35.3406,0.0308,0.0135,4.8556 +Small,5x5,ldr-rgba-02.png,31.1660,0.0318,0.0153,4.2957 +Small,5x5,ldr-xy-00.png,37.0972,0.0295,0.0110,5.9465 +Small,5x5,ldr-xy-01.png,40.7204,0.0340,0.0159,4.1204 +Small,5x5,ldr-xy-02.png,49.2422,0.0311,0.0123,5.3329 +Small,5x5,ldrs-rgba-00.png,32.7983,0.0402,0.0237,2.7640 +Small,5x5,ldrs-rgba-01.png,35.3390,0.0300,0.0136,4.8019 +Small,5x5,ldrs-rgba-02.png,31.1587,0.0325,0.0154,4.2570 +Small,6x6,hdr-rgb-00.hdr,27.5191,0.1557,0.0193,3.3885 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0095,0.0010,0.2512 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0096,0.0010,0.2515 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0096,0.0010,0.2510 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0097,0.0010,0.2540 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0103,0.0010,0.2515 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0103,0.0011,0.2296 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0101,0.0010,0.2585 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0100,0.0010,0.2493 +Small,6x6,ldr-rgb-00.png,32.4060,0.0371,0.0205,3.1935 +Small,6x6,ldr-rgb-01.png,33.1131,0.0308,0.0141,4.6351 +Small,6x6,ldr-rgb-02.png,27.5242,0.0318,0.0151,4.3496 +Small,6x6,ldr-rgb-03.png,41.7488,0.0212,0.0046,14.2779 +Small,6x6,ldr-rgb-04.png,34.2222,0.0299,0.0120,5.4527 +Small,6x6,ldr-rgb-05.png,30.1609,0.0380,0.0211,3.1014 +Small,6x6,ldr-rgb-06.png,27.5925,0.0320,0.0145,4.5145 +Small,6x6,ldr-rgb-07.png,33.9274,0.0401,0.0230,2.8475 +Small,6x6,ldr-rgb-08.png,39.2801,0.0242,0.0080,8.2393 +Small,6x6,ldr-rgb-09.png,33.6765,0.0286,0.0117,5.5965 +Small,6x6,ldr-rgb-10.png,37.0112,0.0175,0.0024,6.6977 +Small,6x6,ldr-rgba-00.png,30.2369,0.0421,0.0261,2.5118 +Small,6x6,ldr-rgba-01.png,32.2229,0.0299,0.0140,4.6871 +Small,6x6,ldr-rgba-02.png,27.8684,0.0341,0.0164,3.9895 +Small,6x6,ldr-xy-00.png,36.2311,0.0286,0.0093,7.0521 +Small,6x6,ldr-xy-01.png,38.0476,0.0300,0.0118,5.5728 +Small,6x6,ldr-xy-02.png,46.2056,0.0265,0.0084,7.7953 +Small,6x6,ldrs-rgba-00.png,30.2315,0.0423,0.0264,2.4856 +Small,6x6,ldrs-rgba-01.png,32.2177,0.0301,0.0138,4.7466 +Small,6x6,ldrs-rgba-02.png,27.8515,0.0341,0.0163,4.0273 +Small,8x8,hdr-rgb-00.hdr,24.1401,0.1579,0.0249,2.6309 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0104,0.0011,0.2351 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0111,0.0010,0.2576 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0111,0.0011,0.2364 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0107,0.0010,0.2578 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0106,0.0011,0.2411 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0108,0.0010,0.2466 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0103,0.0010,0.2450 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0107,0.0012,0.2069 +Small,8x8,ldr-rgb-00.png,28.7679,0.0449,0.0277,2.3696 +Small,8x8,ldr-rgb-01.png,28.9616,0.0352,0.0179,3.6653 +Small,8x8,ldr-rgb-02.png,23.1756,0.0375,0.0195,3.3574 +Small,8x8,ldr-rgb-03.png,38.6059,0.0248,0.0057,11.3977 +Small,8x8,ldr-rgb-04.png,29.6621,0.0370,0.0176,3.7222 +Small,8x8,ldr-rgb-05.png,25.9492,0.0454,0.0266,2.4621 +Small,8x8,ldr-rgb-06.png,23.2148,0.0376,0.0201,3.2637 +Small,8x8,ldr-rgb-07.png,30.7938,0.0453,0.0277,2.3635 +Small,8x8,ldr-rgb-08.png,35.9674,0.0279,0.0098,6.7065 +Small,8x8,ldr-rgb-09.png,28.9937,0.0351,0.0158,4.1488 +Small,8x8,ldr-rgb-10.png,32.1931,0.0193,0.0031,5.2916 +Small,8x8,ldr-rgba-00.png,26.4788,0.0520,0.0337,1.9451 +Small,8x8,ldr-rgba-01.png,28.3965,0.0350,0.0177,3.7054 +Small,8x8,ldr-rgba-02.png,23.9517,0.0384,0.0214,3.0654 +Small,8x8,ldr-xy-00.png,34.0124,0.0327,0.0126,5.1811 +Small,8x8,ldr-xy-01.png,35.0062,0.0328,0.0128,5.1029 +Small,8x8,ldr-xy-02.png,41.7281,0.0296,0.0083,7.8552 +Small,8x8,ldrs-rgba-00.png,26.4777,0.0508,0.0335,1.9555 +Small,8x8,ldrs-rgba-01.png,28.3866,0.0349,0.0179,3.6660 +Small,8x8,ldrs-rgba-02.png,23.9442,0.0386,0.0215,3.0489 +Small,12x12,hdr-rgb-00.hdr,20.7667,0.1778,0.0365,1.7975 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0142,0.0011,0.2244 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0139,0.0013,0.1998 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0147,0.0017,0.1505 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0138,0.0010,0.2510 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0146,0.0012,0.2074 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0147,0.0014,0.1813 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0147,0.0012,0.2148 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0146,0.0014,0.1773 +Small,12x12,ldr-rgb-00.png,24.6963,0.0543,0.0333,1.9688 +Small,12x12,ldr-rgb-01.png,25.0511,0.0430,0.0231,2.8414 +Small,12x12,ldr-rgb-02.png,19.2753,0.0473,0.0277,2.3660 +Small,12x12,ldr-rgb-03.png,35.0157,0.0264,0.0061,10.6911 +Small,12x12,ldr-rgb-04.png,24.9056,0.0438,0.0218,3.0023 +Small,12x12,ldr-rgb-05.png,21.6572,0.0527,0.0338,1.9413 +Small,12x12,ldr-rgb-06.png,19.2621,0.0497,0.0294,2.2324 +Small,12x12,ldr-rgb-07.png,26.7652,0.0495,0.0298,2.2020 +Small,12x12,ldr-rgb-08.png,31.7024,0.0298,0.0103,6.3578 +Small,12x12,ldr-rgb-09.png,24.1625,0.0416,0.0209,3.1417 +Small,12x12,ldr-rgb-10.png,28.0564,0.0254,0.0067,2.4119 +Small,12x12,ldr-rgba-00.png,22.2658,0.0568,0.0378,1.7331 +Small,12x12,ldr-rgba-01.png,24.6578,0.0406,0.0221,2.9704 +Small,12x12,ldr-rgba-02.png,20.1912,0.0499,0.0310,2.1138 +Small,12x12,ldr-xy-00.png,30.2800,0.0366,0.0145,4.5206 +Small,12x12,ldr-xy-01.png,31.8596,0.0398,0.0158,4.1539 +Small,12x12,ldr-xy-02.png,38.5099,0.0274,0.0037,17.9541 +Small,12x12,ldrs-rgba-00.png,22.2653,0.0569,0.0380,1.7259 +Small,12x12,ldrs-rgba-01.png,24.6575,0.0414,0.0221,2.9707 +Small,12x12,ldrs-rgba-02.png,20.1877,0.0495,0.0307,2.1329 +Small,3x3x3,ldr-l-00-3.dds,51.2242,0.0232,0.0106,24.7911 +Small,3x3x3,ldr-l-01-3.dds,52.5323,0.0130,0.0036,19.3698 +Small,6x6x6,ldr-l-00-3.dds,32.9798,0.0587,0.0426,6.1471 +Small,6x6x6,ldr-l-01-3.dds,40.9689,0.0270,0.0137,5.0374 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-avx2_thorough_results.csv new file mode 100644 index 0000000..992df9a --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-avx2_thorough_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.4205,0.1701,0.0362,1.8107 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0104,0.0010,0.2450 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0098,0.0010,0.2678 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0099,0.0009,0.2735 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0096,0.0010,0.2615 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0095,0.0010,0.2634 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0094,0.0011,0.2419 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0093,0.0010,0.2607 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0096,0.0011,0.2427 +Small,4x4,ldr-rgb-00.png,39.1774,0.0583,0.0413,1.5875 +Small,4x4,ldr-rgb-01.png,40.4449,0.0561,0.0395,1.6605 +Small,4x4,ldr-rgb-02.png,35.5044,0.0533,0.0365,1.7939 +Small,4x4,ldr-rgb-03.png,47.8124,0.0534,0.0373,1.7549 +Small,4x4,ldr-rgb-04.png,42.3889,0.0500,0.0333,1.9683 +Small,4x4,ldr-rgb-05.png,38.0196,0.0568,0.0403,1.6247 +Small,4x4,ldr-rgb-06.png,35.6706,0.0486,0.0321,2.0442 +Small,4x4,ldr-rgb-07.png,39.9554,0.0655,0.0494,1.3271 +Small,4x4,ldr-rgb-08.png,45.9894,0.0513,0.0354,1.8534 +Small,4x4,ldr-rgb-09.png,42.2994,0.0528,0.0362,1.8126 +Small,4x4,ldr-rgb-10.png,45.2039,0.0200,0.0047,3.4609 +Small,4x4,ldr-rgba-00.png,36.7547,0.0596,0.0435,1.5067 +Small,4x4,ldr-rgba-01.png,39.1435,0.0466,0.0304,2.1567 +Small,4x4,ldr-rgba-02.png,35.0657,0.0457,0.0295,2.2180 +Small,4x4,ldr-xy-00.png,37.7734,0.0531,0.0357,1.8375 +Small,4x4,ldr-xy-01.png,45.4427,0.0574,0.0402,1.6291 +Small,4x4,ldr-xy-02.png,51.3374,0.0721,0.0547,1.1980 +Small,4x4,ldrs-rgba-00.png,36.7550,0.0597,0.0435,1.5081 +Small,4x4,ldrs-rgba-01.png,39.1433,0.0463,0.0303,2.1643 +Small,4x4,ldrs-rgba-02.png,35.0530,0.0460,0.0297,2.2039 +Small,5x5,hdr-rgb-00.hdr,30.2973,0.1752,0.0381,1.7201 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0098,0.0010,0.2505 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0107,0.0011,0.2248 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0101,0.0010,0.2443 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0104,0.0010,0.2464 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0102,0.0011,0.2336 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0104,0.0011,0.2319 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0111,0.0010,0.2481 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0101,0.0010,0.2448 +Small,5x5,ldr-rgb-00.png,35.3997,0.0619,0.0454,1.4447 +Small,5x5,ldr-rgb-01.png,36.5650,0.0569,0.0394,1.6631 +Small,5x5,ldr-rgb-02.png,31.2263,0.0506,0.0334,1.9625 +Small,5x5,ldr-rgb-03.png,44.6479,0.0570,0.0403,1.6280 +Small,5x5,ldr-rgb-04.png,37.8497,0.0522,0.0351,1.8646 +Small,5x5,ldr-rgb-05.png,33.7130,0.0622,0.0453,1.4481 +Small,5x5,ldr-rgb-06.png,31.2577,0.0470,0.0311,2.1102 +Small,5x5,ldr-rgb-07.png,36.7807,0.0724,0.0556,1.1795 +Small,5x5,ldr-rgb-08.png,42.4775,0.0551,0.0386,1.6959 +Small,5x5,ldr-rgb-09.png,37.7193,0.0567,0.0394,1.6635 +Small,5x5,ldr-rgb-10.png,40.7723,0.0206,0.0054,3.0160 +Small,5x5,ldr-rgba-00.png,33.1334,0.0659,0.0494,1.3275 +Small,5x5,ldr-rgba-01.png,35.4400,0.0491,0.0327,2.0058 +Small,5x5,ldr-rgba-02.png,31.2027,0.0483,0.0315,2.0808 +Small,5x5,ldr-xy-00.png,37.1948,0.0584,0.0404,1.6222 +Small,5x5,ldr-xy-01.png,41.4468,0.0665,0.0486,1.3494 +Small,5x5,ldr-xy-02.png,49.4347,0.0770,0.0590,1.1102 +Small,5x5,ldrs-rgba-00.png,33.1290,0.0660,0.0495,1.3235 +Small,5x5,ldrs-rgba-01.png,35.4379,0.0495,0.0328,1.9991 +Small,5x5,ldrs-rgba-02.png,31.1988,0.0482,0.0315,2.0836 +Small,6x6,hdr-rgb-00.hdr,27.7236,0.1824,0.0400,1.6365 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0111,0.0011,0.2280 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0110,0.0011,0.2263 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0106,0.0012,0.2066 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0105,0.0010,0.2581 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0105,0.0011,0.2311 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0104,0.0013,0.1944 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0107,0.0011,0.2272 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0107,0.0010,0.2445 +Small,6x6,ldr-rgb-00.png,32.6611,0.0655,0.0486,1.3489 +Small,6x6,ldr-rgb-01.png,33.2151,0.0578,0.0409,1.6007 +Small,6x6,ldr-rgb-02.png,27.5730,0.0517,0.0345,1.8982 +Small,6x6,ldr-rgb-03.png,42.6044,0.0505,0.0340,1.9252 +Small,6x6,ldr-rgb-04.png,34.3610,0.0524,0.0355,1.8444 +Small,6x6,ldr-rgb-05.png,30.3091,0.0635,0.0463,1.4151 +Small,6x6,ldr-rgb-06.png,27.6509,0.0503,0.0331,1.9793 +Small,6x6,ldr-rgb-07.png,34.4860,0.0757,0.0586,1.1186 +Small,6x6,ldr-rgb-08.png,40.0928,0.0493,0.0326,2.0094 +Small,6x6,ldr-rgb-09.png,33.8320,0.0563,0.0394,1.6630 +Small,6x6,ldr-rgb-10.png,37.2019,0.0218,0.0060,2.6932 +Small,6x6,ldr-rgba-00.png,30.5217,0.0709,0.0540,1.2134 +Small,6x6,ldr-rgba-01.png,32.2966,0.0532,0.0362,1.8097 +Small,6x6,ldr-rgba-02.png,27.9025,0.0499,0.0332,1.9733 +Small,6x6,ldr-xy-00.png,36.3131,0.0512,0.0334,1.9633 +Small,6x6,ldr-xy-01.png,38.0748,0.0647,0.0469,1.3962 +Small,6x6,ldr-xy-02.png,47.6588,0.0795,0.0616,1.0639 +Small,6x6,ldrs-rgba-00.png,30.5178,0.0708,0.0541,1.2107 +Small,6x6,ldrs-rgba-01.png,32.2891,0.0534,0.0363,1.8049 +Small,6x6,ldrs-rgba-02.png,27.8879,0.0509,0.0336,1.9529 +Small,8x8,hdr-rgb-00.hdr,24.3456,0.1901,0.0515,1.2717 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0127,0.0012,0.2095 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0129,0.0013,0.1938 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0134,0.0012,0.2133 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0116,0.0011,0.2284 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0127,0.0011,0.2370 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0128,0.0011,0.2256 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0136,0.0011,0.2364 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0129,0.0011,0.2366 +Small,8x8,ldr-rgb-00.png,28.9872,0.0795,0.0617,1.0629 +Small,8x8,ldr-rgb-01.png,29.0418,0.0685,0.0502,1.3048 +Small,8x8,ldr-rgb-02.png,23.2150,0.0645,0.0460,1.4249 +Small,8x8,ldr-rgb-03.png,39.4501,0.0375,0.0198,3.3163 +Small,8x8,ldr-rgb-04.png,29.7910,0.0618,0.0437,1.4994 +Small,8x8,ldr-rgb-05.png,26.0513,0.0735,0.0553,1.1855 +Small,8x8,ldr-rgb-06.png,23.2667,0.0628,0.0446,1.4701 +Small,8x8,ldr-rgb-07.png,31.2555,0.0867,0.0688,0.9526 +Small,8x8,ldr-rgb-08.png,36.6163,0.0496,0.0318,2.0616 +Small,8x8,ldr-rgb-09.png,29.1587,0.0557,0.0378,1.7333 +Small,8x8,ldr-rgb-10.png,32.3435,0.0247,0.0078,2.0841 +Small,8x8,ldr-rgba-00.png,26.7519,0.0869,0.0686,0.9559 +Small,8x8,ldr-rgba-01.png,28.4593,0.0651,0.0474,1.3826 +Small,8x8,ldr-rgba-02.png,23.9778,0.0591,0.0436,1.5018 +Small,8x8,ldr-xy-00.png,34.2195,0.0561,0.0370,1.7730 +Small,8x8,ldr-xy-01.png,35.3357,0.0581,0.0388,1.6894 +Small,8x8,ldr-xy-02.png,44.6504,0.0690,0.0501,1.3085 +Small,8x8,ldrs-rgba-00.png,26.7482,0.0864,0.0686,0.9558 +Small,8x8,ldrs-rgba-01.png,28.4511,0.0651,0.0473,1.3868 +Small,8x8,ldrs-rgba-02.png,23.9705,0.0618,0.0435,1.5054 +Small,12x12,hdr-rgb-00.hdr,21.0293,0.2205,0.0775,0.8456 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0160,0.0012,0.2105 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0140,0.0013,0.1918 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0172,0.0014,0.1785 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0161,0.0010,0.2462 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0163,0.0012,0.2150 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0143,0.0013,0.1972 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0162,0.0011,0.2277 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0145,0.0014,0.1888 +Small,12x12,ldr-rgb-00.png,25.0590,0.1023,0.0820,0.7997 +Small,12x12,ldr-rgb-01.png,25.1523,0.0862,0.0655,1.0011 +Small,12x12,ldr-rgb-02.png,19.2946,0.0943,0.0735,0.8918 +Small,12x12,ldr-rgb-03.png,36.1989,0.0416,0.0215,3.0530 +Small,12x12,ldr-rgb-04.png,25.0024,0.0786,0.0577,1.1349 +Small,12x12,ldr-rgb-05.png,21.7425,0.0910,0.0728,0.9000 +Small,12x12,ldr-rgb-06.png,19.3024,0.0913,0.0708,0.9257 +Small,12x12,ldr-rgb-07.png,27.1383,0.1041,0.0833,0.7863 +Small,12x12,ldr-rgb-08.png,32.5503,0.0500,0.0293,2.2393 +Small,12x12,ldr-rgb-09.png,24.3118,0.0745,0.0541,1.2122 +Small,12x12,ldr-rgb-10.png,28.1897,0.0340,0.0136,1.1997 +Small,12x12,ldr-rgba-00.png,22.7626,0.1080,0.0872,0.7514 +Small,12x12,ldr-rgba-01.png,24.7534,0.0869,0.0666,0.9836 +Small,12x12,ldr-rgba-02.png,20.2087,0.0910,0.0707,0.9268 +Small,12x12,ldr-xy-00.png,30.5427,0.0708,0.0497,1.3195 +Small,12x12,ldr-xy-01.png,32.2466,0.0578,0.0364,1.8024 +Small,12x12,ldr-xy-02.png,40.3262,0.0448,0.0233,2.8143 +Small,12x12,ldrs-rgba-00.png,22.7580,0.1073,0.0872,0.7513 +Small,12x12,ldrs-rgba-01.png,24.7479,0.0868,0.0665,0.9857 +Small,12x12,ldrs-rgba-02.png,20.2070,0.0910,0.0706,0.9281 +Small,3x3x3,ldr-l-00-3.dds,52.1075,0.0478,0.0350,7.4922 +Small,3x3x3,ldr-l-01-3.dds,54.5135,0.0263,0.0164,4.2136 +Small,6x6x6,ldr-l-00-3.dds,33.2902,0.0801,0.0617,4.2472 +Small,6x6x6,ldr-l-01-3.dds,41.6644,0.0299,0.0141,4.9051 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-neon_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-neon_fast_results.csv new file mode 100644 index 0000000..d39f9e8 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-neon_fast_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.7281,0.0645,0.0200,3.2815 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0007,0.0000,5.3156 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0007,0.0000,7.7248 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0007,0.0000,7.3544 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0007,0.0000,7.3044 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0007,0.0000,6.7531 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0007,0.0000,5.8356 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0007,0.0000,5.7114 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0007,0.0000,7.1109 +Small,4x4,ldr-rgb-00.png,38.2700,0.0160,0.0127,5.1608 +Small,4x4,ldr-rgb-01.png,39.9568,0.0140,0.0107,6.1043 +Small,4x4,ldr-rgb-02.png,35.1963,0.0211,0.0178,3.6884 +Small,4x4,ldr-rgb-03.png,46.0467,0.0063,0.0033,19.8282 +Small,4x4,ldr-rgb-04.png,42.0037,0.0103,0.0071,9.2617 +Small,4x4,ldr-rgb-05.png,37.3577,0.0205,0.0172,3.8104 +Small,4x4,ldr-rgb-06.png,35.3918,0.0193,0.0160,4.0855 +Small,4x4,ldr-rgb-07.png,38.1916,0.0213,0.0179,3.6527 +Small,4x4,ldr-rgb-08.png,43.9030,0.0088,0.0055,11.8339 +Small,4x4,ldr-rgb-09.png,41.9061,0.0107,0.0074,8.8753 +Small,4x4,ldr-rgb-10.png,44.4858,0.0024,0.0012,13.3039 +Small,4x4,ldr-rgba-00.png,35.6075,0.0212,0.0175,3.7504 +Small,4x4,ldr-rgba-01.png,38.8915,0.0138,0.0102,6.3956 +Small,4x4,ldr-rgba-02.png,34.9103,0.0186,0.0151,4.3336 +Small,4x4,ldr-xy-00.png,37.6561,0.0105,0.0065,10.0751 +Small,4x4,ldr-xy-01.png,44.2119,0.0122,0.0081,8.0889 +Small,4x4,ldr-xy-02.png,48.3459,0.0089,0.0048,13.5883 +Small,4x4,ldrs-rgba-00.png,35.6094,0.0210,0.0174,3.7621 +Small,4x4,ldrs-rgba-01.png,38.8931,0.0138,0.0104,6.3246 +Small,4x4,ldrs-rgba-02.png,34.8940,0.0187,0.0151,4.3347 +Small,5x5,hdr-rgb-00.hdr,29.5418,0.0639,0.0194,3.3867 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0010,0.0000,5.2378 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0010,0.0000,5.6812 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0010,0.0000,5.8040 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0010,0.0000,5.3420 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0010,0.0000,5.4505 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0010,0.0000,5.4505 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0010,0.0000,5.8040 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0010,0.0001,4.6482 +Small,5x5,ldr-rgb-00.png,34.4434,0.0155,0.0119,5.4953 +Small,5x5,ldr-rgb-01.png,36.2670,0.0114,0.0080,8.2301 +Small,5x5,ldr-rgb-02.png,31.1094,0.0170,0.0135,4.8574 +Small,5x5,ldr-rgb-03.png,42.8398,0.0057,0.0026,25.6392 +Small,5x5,ldr-rgb-04.png,37.2876,0.0101,0.0066,9.9464 +Small,5x5,ldr-rgb-05.png,33.2882,0.0208,0.0173,3.7902 +Small,5x5,ldr-rgb-06.png,31.1492,0.0168,0.0132,4.9510 +Small,5x5,ldr-rgb-07.png,35.1044,0.0171,0.0135,4.8542 +Small,5x5,ldr-rgb-08.png,40.2560,0.0076,0.0043,15.1389 +Small,5x5,ldr-rgb-09.png,37.2934,0.0103,0.0068,9.6547 +Small,5x5,ldr-rgb-10.png,40.2099,0.0024,0.0010,16.7237 +Small,5x5,ldr-rgba-00.png,32.1563,0.0214,0.0176,3.7311 +Small,5x5,ldr-rgba-01.png,35.2201,0.0131,0.0095,6.9234 +Small,5x5,ldr-rgba-02.png,31.1519,0.0178,0.0141,4.6332 +Small,5x5,ldr-xy-00.png,36.7408,0.0092,0.0050,13.0994 +Small,5x5,ldr-xy-01.png,39.8426,0.0109,0.0066,9.9901 +Small,5x5,ldr-xy-02.png,43.9819,0.0086,0.0044,14.9732 +Small,5x5,ldrs-rgba-00.png,32.1540,0.0213,0.0176,3.7241 +Small,5x5,ldrs-rgba-01.png,35.2189,0.0131,0.0095,6.8675 +Small,5x5,ldrs-rgba-02.png,31.1450,0.0179,0.0142,4.5993 +Small,6x6,hdr-rgb-00.hdr,27.0785,0.0631,0.0188,3.4884 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0010,0.0001,4.8367 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0010,0.0000,5.3156 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0010,0.0000,5.1375 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0010,0.0001,5.1131 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0010,0.0001,4.5886 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0010,0.0001,4.8367 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0010,0.0001,4.7511 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0010,0.0001,5.1131 +Small,6x6,ldr-rgb-00.png,31.7201,0.0184,0.0149,4.4093 +Small,6x6,ldr-rgb-01.png,32.9461,0.0130,0.0097,6.7858 +Small,6x6,ldr-rgb-02.png,27.4945,0.0183,0.0149,4.4034 +Small,6x6,ldr-rgb-03.png,40.6123,0.0057,0.0025,25.8928 +Small,6x6,ldr-rgb-04.png,33.9447,0.0114,0.0080,8.1982 +Small,6x6,ldr-rgb-05.png,29.9962,0.0237,0.0202,3.2386 +Small,6x6,ldr-rgb-06.png,27.5637,0.0185,0.0149,4.3960 +Small,6x6,ldr-rgb-07.png,32.9859,0.0168,0.0133,4.9264 +Small,6x6,ldr-rgb-08.png,37.8899,0.0078,0.0045,14.6289 +Small,6x6,ldr-rgb-09.png,33.4975,0.0119,0.0084,7.8037 +Small,6x6,ldr-rgb-10.png,36.7053,0.0027,0.0013,12.9822 +Small,6x6,ldr-rgba-00.png,29.6096,0.0241,0.0204,3.2066 +Small,6x6,ldr-rgba-01.png,32.1075,0.0145,0.0109,6.0303 +Small,6x6,ldr-rgba-02.png,27.8547,0.0196,0.0158,4.1487 +Small,6x6,ldr-xy-00.png,35.9052,0.0096,0.0054,12.1746 +Small,6x6,ldr-xy-01.png,37.1922,0.0123,0.0080,8.1695 +Small,6x6,ldr-xy-02.png,41.9609,0.0082,0.0041,15.8495 +Small,6x6,ldrs-rgba-00.png,29.6069,0.0243,0.0206,3.1823 +Small,6x6,ldrs-rgba-01.png,32.1031,0.0147,0.0111,5.9265 +Small,6x6,ldrs-rgba-02.png,27.8398,0.0197,0.0160,4.1024 +Small,8x8,hdr-rgb-00.hdr,23.7878,0.0696,0.0246,2.6593 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0011,0.0001,5.1131 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0011,0.0000,5.9652 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0011,0.0000,5.5634 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0011,0.0000,5.3156 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0011,0.0000,5.8040 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0011,0.0000,6.7109 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0011,0.0000,6.2427 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0011,0.0000,5.4505 +Small,8x8,ldr-rgb-00.png,28.0747,0.0207,0.0171,3.8406 +Small,8x8,ldr-rgb-01.png,28.7890,0.0168,0.0133,4.9328 +Small,8x8,ldr-rgb-02.png,23.1132,0.0249,0.0213,3.0769 +Small,8x8,ldr-rgb-03.png,37.3786,0.0065,0.0029,22.5606 +Small,8x8,ldr-rgb-04.png,29.3571,0.0159,0.0123,5.3372 +Small,8x8,ldr-rgb-05.png,25.8131,0.0282,0.0246,2.6597 +Small,8x8,ldr-rgb-06.png,23.1776,0.0259,0.0222,2.9499 +Small,8x8,ldr-rgb-07.png,29.8769,0.0175,0.0139,4.7043 +Small,8x8,ldr-rgb-08.png,34.5214,0.0082,0.0048,13.6612 +Small,8x8,ldr-rgb-09.png,28.6522,0.0149,0.0114,5.7660 +Small,8x8,ldr-rgb-10.png,32.0068,0.0032,0.0017,9.7935 +Small,8x8,ldr-rgba-00.png,25.7092,0.0276,0.0239,2.7454 +Small,8x8,ldr-rgba-01.png,28.3054,0.0195,0.0159,4.1334 +Small,8x8,ldr-rgba-02.png,23.9438,0.0273,0.0235,2.7882 +Small,8x8,ldr-xy-00.png,33.3643,0.0119,0.0074,8.8158 +Small,8x8,ldr-xy-01.png,34.3964,0.0138,0.0093,7.0440 +Small,8x8,ldr-xy-02.png,39.8866,0.0068,0.0025,26.6303 +Small,8x8,ldrs-rgba-00.png,25.7053,0.0277,0.0240,2.7332 +Small,8x8,ldrs-rgba-01.png,28.2955,0.0195,0.0158,4.1465 +Small,8x8,ldrs-rgba-02.png,23.9365,0.0272,0.0235,2.7947 +Small,12x12,hdr-rgb-00.hdr,20.5371,0.0841,0.0383,1.7127 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0019,0.0001,4.4187 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0019,0.0001,5.1131 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0018,0.0001,5.1131 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0018,0.0000,6.7531 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0019,0.0000,5.1375 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0018,0.0000,5.4505 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0019,0.0001,5.1131 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0019,0.0000,5.6812 +Small,12x12,ldr-rgb-00.png,23.8044,0.0192,0.0149,4.4108 +Small,12x12,ldr-rgb-01.png,24.7859,0.0147,0.0105,6.2570 +Small,12x12,ldr-rgb-02.png,19.2338,0.0292,0.0250,2.6263 +Small,12x12,ldr-rgb-03.png,33.2733,0.0058,0.0018,35.9694 +Small,12x12,ldr-rgb-04.png,24.5789,0.0144,0.0101,6.4971 +Small,12x12,ldr-rgb-05.png,21.4954,0.0272,0.0227,2.8866 +Small,12x12,ldr-rgb-06.png,19.2327,0.0323,0.0276,2.3714 +Small,12x12,ldr-rgb-07.png,25.4006,0.0145,0.0101,6.4657 +Small,12x12,ldr-rgb-08.png,30.3089,0.0078,0.0036,18.2050 +Small,12x12,ldr-rgb-09.png,23.7455,0.0175,0.0132,4.9619 +Small,12x12,ldr-rgb-10.png,27.3338,0.0040,0.0017,9.7404 +Small,12x12,ldr-rgba-00.png,21.6156,0.0299,0.0254,2.5837 +Small,12x12,ldr-rgba-01.png,24.5339,0.0175,0.0129,5.0772 +Small,12x12,ldr-rgba-02.png,20.1778,0.0347,0.0301,2.1780 +Small,12x12,ldr-xy-00.png,29.2438,0.0133,0.0076,8.6803 +Small,12x12,ldr-xy-01.png,30.5551,0.0125,0.0067,9.7206 +Small,12x12,ldr-xy-02.png,37.9965,0.0065,0.0009,73.0670 +Small,12x12,ldrs-rgba-00.png,21.6151,0.0302,0.0256,2.5581 +Small,12x12,ldrs-rgba-01.png,24.5310,0.0174,0.0129,5.0989 +Small,12x12,ldrs-rgba-02.png,20.1749,0.0346,0.0299,2.1929 +Small,3x3x3,ldr-l-00-3.dds,50.2752,0.0197,0.0126,20.7494 +Small,3x3x3,ldr-l-01-3.dds,51.8763,0.0074,0.0048,14.3883 +Small,6x6x6,ldr-l-00-3.dds,32.5486,0.0865,0.0772,3.3935 +Small,6x6x6,ldr-l-01-3.dds,40.8686,0.0314,0.0271,2.5433 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-neon_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-neon_fastest_results.csv new file mode 100644 index 0000000..0553f94 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-neon_fastest_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.3455,0.0557,0.0120,5.4681 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0005,0.0000,5.4229 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0005,0.0000,7.5616 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0005,0.0000,7.5616 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0006,0.0000,7.5087 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0005,0.0000,6.3913 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0005,0.0000,7.5616 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0005,0.0000,7.7807 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0005,0.0000,7.9536 +Small,4x4,ldr-rgb-00.png,37.2582,0.0100,0.0070,9.4201 +Small,4x4,ldr-rgb-01.png,39.5673,0.0093,0.0064,10.3190 +Small,4x4,ldr-rgb-02.png,34.8275,0.0126,0.0096,6.8232 +Small,4x4,ldr-rgb-03.png,45.4522,0.0050,0.0023,28.7199 +Small,4x4,ldr-rgb-04.png,41.7305,0.0076,0.0045,14.4353 +Small,4x4,ldr-rgb-05.png,36.8931,0.0130,0.0100,6.5635 +Small,4x4,ldr-rgb-06.png,35.0002,0.0120,0.0090,7.3176 +Small,4x4,ldr-rgb-07.png,37.4123,0.0125,0.0094,6.9995 +Small,4x4,ldr-rgb-08.png,43.0339,0.0063,0.0034,19.1566 +Small,4x4,ldr-rgb-09.png,41.7131,0.0077,0.0047,14.0610 +Small,4x4,ldr-rgb-10.png,43.9533,0.0017,0.0008,21.1092 +Small,4x4,ldr-rgba-00.png,34.7402,0.0127,0.0095,6.9227 +Small,4x4,ldr-rgba-01.png,38.6972,0.0102,0.0070,9.3569 +Small,4x4,ldr-rgba-02.png,34.6012,0.0136,0.0104,6.3155 +Small,4x4,ldr-xy-00.png,37.6163,0.0082,0.0045,14.5446 +Small,4x4,ldr-xy-01.png,43.9354,0.0092,0.0054,12.0471 +Small,4x4,ldr-xy-02.png,48.3675,0.0074,0.0037,17.8620 +Small,4x4,ldrs-rgba-00.png,34.7410,0.0127,0.0095,6.9270 +Small,4x4,ldrs-rgba-01.png,38.6988,0.0103,0.0071,9.2748 +Small,4x4,ldrs-rgba-02.png,34.5841,0.0136,0.0104,6.2768 +Small,5x5,hdr-rgb-00.hdr,28.8645,0.0551,0.0112,5.8420 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0007,0.0000,5.6812 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0006,0.0000,5.9323 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0007,0.0000,5.4505 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0007,0.0000,5.8356 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0007,0.0000,5.9323 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0007,0.0000,5.4505 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0007,0.0000,5.3156 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0007,0.0001,4.5691 +Small,5x5,ldr-rgb-00.png,33.7346,0.0100,0.0068,9.5923 +Small,5x5,ldr-rgb-01.png,36.0898,0.0086,0.0056,11.7489 +Small,5x5,ldr-rgb-02.png,31.0129,0.0127,0.0096,6.8516 +Small,5x5,ldr-rgb-03.png,42.4476,0.0048,0.0020,33.5217 +Small,5x5,ldr-rgb-04.png,37.0450,0.0081,0.0049,13.2503 +Small,5x5,ldr-rgb-05.png,32.9822,0.0138,0.0107,6.1443 +Small,5x5,ldr-rgb-06.png,31.0536,0.0126,0.0093,7.0317 +Small,5x5,ldr-rgb-07.png,34.4588,0.0118,0.0086,7.6497 +Small,5x5,ldr-rgb-08.png,39.6603,0.0058,0.0029,22.4061 +Small,5x5,ldr-rgb-09.png,37.0769,0.0080,0.0049,13.3969 +Small,5x5,ldr-rgb-10.png,39.9359,0.0018,0.0007,22.7351 +Small,5x5,ldr-rgba-00.png,31.1232,0.0130,0.0097,6.7696 +Small,5x5,ldr-rgba-01.png,35.0597,0.0102,0.0069,9.5368 +Small,5x5,ldr-rgba-02.png,31.0601,0.0140,0.0106,6.1866 +Small,5x5,ldr-xy-00.png,36.6317,0.0077,0.0038,17.1328 +Small,5x5,ldr-xy-01.png,39.3017,0.0086,0.0046,14.1821 +Small,5x5,ldr-xy-02.png,43.8850,0.0072,0.0035,18.8699 +Small,5x5,ldrs-rgba-00.png,31.1191,0.0131,0.0097,6.7410 +Small,5x5,ldrs-rgba-01.png,35.0595,0.0102,0.0069,9.4923 +Small,5x5,ldrs-rgba-02.png,31.0449,0.0140,0.0106,6.1589 +Small,6x6,hdr-rgb-00.hdr,26.7568,0.0539,0.0101,6.4798 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0007,0.0000,5.8040 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0007,0.0000,6.2427 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0007,0.0000,5.2123 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0007,0.0000,6.2427 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0007,0.0000,6.5874 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0007,0.0000,5.5634 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0007,0.0000,5.3156 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0007,0.0000,5.8356 +Small,6x6,ldr-rgb-00.png,31.3522,0.0112,0.0079,8.2581 +Small,6x6,ldr-rgb-01.png,32.8566,0.0097,0.0065,10.0284 +Small,6x6,ldr-rgb-02.png,27.4076,0.0136,0.0105,6.2636 +Small,6x6,ldr-rgb-03.png,40.3684,0.0047,0.0018,35.6568 +Small,6x6,ldr-rgb-04.png,33.7717,0.0090,0.0059,11.1377 +Small,6x6,ldr-rgb-05.png,29.7603,0.0151,0.0120,5.4718 +Small,6x6,ldr-rgb-06.png,27.4861,0.0137,0.0105,6.2367 +Small,6x6,ldr-rgb-07.png,32.3756,0.0115,0.0083,7.9371 +Small,6x6,ldr-rgb-08.png,37.5033,0.0059,0.0029,22.5291 +Small,6x6,ldr-rgb-09.png,33.3194,0.0088,0.0057,11.4237 +Small,6x6,ldr-rgb-10.png,36.5829,0.0020,0.0009,17.8255 +Small,6x6,ldr-rgba-00.png,28.8481,0.0135,0.0102,6.4176 +Small,6x6,ldr-rgba-01.png,32.0167,0.0108,0.0076,8.6434 +Small,6x6,ldr-rgba-02.png,27.7951,0.0139,0.0106,6.1756 +Small,6x6,ldr-xy-00.png,35.6742,0.0077,0.0039,16.5959 +Small,6x6,ldr-xy-01.png,36.5951,0.0090,0.0052,12.5401 +Small,6x6,ldr-xy-02.png,41.8228,0.0068,0.0032,20.7392 +Small,6x6,ldrs-rgba-00.png,28.8448,0.0135,0.0102,6.3982 +Small,6x6,ldrs-rgba-01.png,32.0125,0.0108,0.0076,8.6491 +Small,6x6,ldrs-rgba-02.png,27.7831,0.0140,0.0106,6.1537 +Small,8x8,hdr-rgb-00.hdr,23.6169,0.0608,0.0164,3.9927 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0010,0.0000,5.6812 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0010,0.0000,6.4296 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0010,0.0000,5.8040 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0010,0.0000,5.3420 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0010,0.0000,5.4505 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0010,0.0000,5.6812 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0010,0.0001,4.5691 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0010,0.0000,5.6812 +Small,8x8,ldr-rgb-00.png,27.7216,0.0153,0.0117,5.5938 +Small,8x8,ldr-rgb-01.png,28.7030,0.0131,0.0097,6.7786 +Small,8x8,ldr-rgb-02.png,23.0366,0.0188,0.0154,4.2570 +Small,8x8,ldr-rgb-03.png,37.0954,0.0053,0.0021,31.5082 +Small,8x8,ldr-rgb-04.png,29.1352,0.0126,0.0091,7.2321 +Small,8x8,ldr-rgb-05.png,25.6104,0.0209,0.0174,3.7634 +Small,8x8,ldr-rgb-06.png,23.0940,0.0197,0.0161,4.0724 +Small,8x8,ldr-rgb-07.png,29.5040,0.0132,0.0097,6.7480 +Small,8x8,ldr-rgb-08.png,33.9884,0.0067,0.0035,18.8816 +Small,8x8,ldr-rgb-09.png,28.4595,0.0120,0.0085,7.6958 +Small,8x8,ldr-rgb-10.png,31.9190,0.0028,0.0012,13.1728 +Small,8x8,ldr-rgba-00.png,25.3524,0.0196,0.0159,4.1199 +Small,8x8,ldr-rgba-01.png,28.2082,0.0148,0.0112,5.8467 +Small,8x8,ldr-rgba-02.png,23.8815,0.0197,0.0160,4.0866 +Small,8x8,ldr-xy-00.png,33.2419,0.0100,0.0056,11.6657 +Small,8x8,ldr-xy-01.png,34.1451,0.0112,0.0068,9.6081 +Small,8x8,ldr-xy-02.png,39.7693,0.0063,0.0021,31.9366 +Small,8x8,ldrs-rgba-00.png,25.3487,0.0196,0.0159,4.1200 +Small,8x8,ldrs-rgba-01.png,28.1979,0.0148,0.0112,5.8567 +Small,8x8,ldrs-rgba-02.png,23.8757,0.0197,0.0160,4.0870 +Small,12x12,hdr-rgb-00.hdr,20.4537,0.0717,0.0266,2.4678 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0017,0.0001,4.8367 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0017,0.0000,5.3420 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0017,0.0000,5.9323 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0017,0.0000,5.9652 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0017,0.0000,5.6812 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0017,0.0000,5.7114 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0017,0.0000,5.9323 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0017,0.0000,5.5634 +Small,12x12,ldr-rgb-00.png,23.7273,0.0146,0.0104,6.2737 +Small,12x12,ldr-rgb-01.png,24.7394,0.0114,0.0074,8.8705 +Small,12x12,ldr-rgb-02.png,19.1996,0.0216,0.0175,3.7437 +Small,12x12,ldr-rgb-03.png,33.1771,0.0053,0.0015,44.5507 +Small,12x12,ldr-rgb-04.png,24.3899,0.0115,0.0074,8.8505 +Small,12x12,ldr-rgb-05.png,21.3900,0.0204,0.0163,4.0310 +Small,12x12,ldr-rgb-06.png,19.1751,0.0234,0.0192,3.4052 +Small,12x12,ldr-rgb-07.png,25.3358,0.0114,0.0072,9.0671 +Small,12x12,ldr-rgb-08.png,30.1393,0.0066,0.0026,24.7393 +Small,12x12,ldr-rgb-09.png,23.6063,0.0138,0.0096,6.8061 +Small,12x12,ldr-rgb-10.png,27.2944,0.0034,0.0012,13.6721 +Small,12x12,ldr-rgba-00.png,21.3688,0.0215,0.0172,3.8193 +Small,12x12,ldr-rgba-01.png,24.4942,0.0134,0.0091,7.2287 +Small,12x12,ldr-rgba-02.png,20.1436,0.0254,0.0210,3.1135 +Small,12x12,ldr-xy-00.png,28.8952,0.0110,0.0055,11.9181 +Small,12x12,ldr-xy-01.png,29.6655,0.0105,0.0050,13.1918 +Small,12x12,ldr-xy-02.png,37.9744,0.0063,0.0009,74.7357 +Small,12x12,ldrs-rgba-00.png,21.3639,0.0215,0.0172,3.8120 +Small,12x12,ldrs-rgba-01.png,24.4913,0.0134,0.0091,7.2169 +Small,12x12,ldrs-rgba-02.png,20.1416,0.0253,0.0210,3.1191 +Small,3x3x3,ldr-l-00-3.dds,50.1569,0.0187,0.0121,21.7312 +Small,3x3x3,ldr-l-01-3.dds,51.8557,0.0069,0.0047,14.7045 +Small,6x6x6,ldr-l-00-3.dds,32.5328,0.0819,0.0734,3.5694 +Small,6x6x6,ldr-l-01-3.dds,40.8686,0.0298,0.0258,2.6711 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-neon_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-neon_medium_results.csv new file mode 100644 index 0000000..704d765 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-neon_medium_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1462,0.0881,0.0350,1.8742 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0011,0.0000,6.5472 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0010,0.0000,7.5616 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0010,0.0000,6.1008 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0010,0.0000,5.9323 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0010,0.0000,5.4505 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0010,0.0000,7.5087 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0010,0.0000,7.5087 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0010,0.0000,6.2427 +Small,4x4,ldr-rgb-00.png,38.8542,0.0443,0.0401,1.6346 +Small,4x4,ldr-rgb-01.png,40.2577,0.0399,0.0356,1.8397 +Small,4x4,ldr-rgb-02.png,35.3269,0.0403,0.0359,1.8232 +Small,4x4,ldr-rgb-03.png,47.3379,0.0264,0.0225,2.9167 +Small,4x4,ldr-rgb-04.png,42.2428,0.0326,0.0284,2.3101 +Small,4x4,ldr-rgb-05.png,37.8423,0.0433,0.0390,1.6789 +Small,4x4,ldr-rgb-06.png,35.5075,0.0358,0.0313,2.0934 +Small,4x4,ldr-rgb-07.png,39.3480,0.0567,0.0521,1.2585 +Small,4x4,ldr-rgb-08.png,45.3018,0.0306,0.0264,2.4851 +Small,4x4,ldr-rgb-09.png,42.1528,0.0347,0.0303,2.1646 +Small,4x4,ldr-rgb-10.png,44.9871,0.0052,0.0034,4.7172 +Small,4x4,ldr-rgba-00.png,36.2694,0.0514,0.0465,1.4080 +Small,4x4,ldr-rgba-01.png,38.9985,0.0309,0.0264,2.4806 +Small,4x4,ldr-rgba-02.png,34.9757,0.0342,0.0296,2.2171 +Small,4x4,ldr-xy-00.png,37.8045,0.0280,0.0230,2.8518 +Small,4x4,ldr-xy-01.png,45.2632,0.0410,0.0358,1.8299 +Small,4x4,ldr-xy-02.png,51.3220,0.0507,0.0453,1.4466 +Small,4x4,ldrs-rgba-00.png,36.2680,0.0518,0.0470,1.3949 +Small,4x4,ldrs-rgba-01.png,39.0001,0.0312,0.0266,2.4683 +Small,4x4,ldrs-rgba-02.png,34.9625,0.0341,0.0295,2.2234 +Small,5x5,hdr-rgb-00.hdr,29.9041,0.0915,0.0378,1.7360 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0012,0.0000,7.1109 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0011,0.0000,6.5472 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0011,0.0000,6.7531 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0011,0.0000,5.6812 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0011,0.0000,6.7531 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0011,0.0000,7.5087 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0011,0.0000,5.8356 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0011,0.0000,7.1109 +Small,5x5,ldr-rgb-00.png,35.1529,0.0441,0.0399,1.6434 +Small,5x5,ldr-rgb-01.png,36.4665,0.0346,0.0301,2.1784 +Small,5x5,ldr-rgb-02.png,31.1516,0.0350,0.0306,2.1439 +Small,5x5,ldr-rgb-03.png,44.0943,0.0161,0.0121,5.4252 +Small,5x5,ldr-rgb-04.png,37.6982,0.0316,0.0271,2.4174 +Small,5x5,ldr-rgb-05.png,33.5609,0.0486,0.0441,1.4867 +Small,5x5,ldr-rgb-06.png,31.1959,0.0342,0.0295,2.2198 +Small,5x5,ldr-rgb-07.png,36.2015,0.0566,0.0519,1.2631 +Small,5x5,ldr-rgb-08.png,41.7238,0.0251,0.0209,3.1379 +Small,5x5,ldr-rgb-09.png,37.5901,0.0296,0.0253,2.5941 +Small,5x5,ldr-rgb-10.png,40.6034,0.0053,0.0036,4.5662 +Small,5x5,ldr-rgba-00.png,32.8000,0.0555,0.0507,1.2939 +Small,5x5,ldr-rgba-01.png,35.3406,0.0329,0.0283,2.3171 +Small,5x5,ldr-rgba-02.png,31.1660,0.0369,0.0322,2.0384 +Small,5x5,ldr-xy-00.png,37.0972,0.0271,0.0217,3.0194 +Small,5x5,ldr-xy-01.png,40.7204,0.0385,0.0328,1.9968 +Small,5x5,ldr-xy-02.png,49.2422,0.0305,0.0249,2.6345 +Small,5x5,ldrs-rgba-00.png,32.7983,0.0549,0.0503,1.3017 +Small,5x5,ldrs-rgba-01.png,35.3390,0.0333,0.0287,2.2849 +Small,5x5,ldrs-rgba-02.png,31.1587,0.0374,0.0326,2.0131 +Small,6x6,hdr-rgb-00.hdr,27.5191,0.0935,0.0397,1.6492 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0012,0.0000,5.6812 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0012,0.0000,6.5472 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0011,0.0000,7.7248 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0011,0.0000,7.7807 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0011,0.0000,5.8040 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0011,0.0000,6.7531 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0011,0.0000,7.5087 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0011,0.0000,6.2427 +Small,6x6,ldr-rgb-00.png,32.4060,0.0472,0.0428,1.5297 +Small,6x6,ldr-rgb-01.png,33.1131,0.0346,0.0301,2.1751 +Small,6x6,ldr-rgb-02.png,27.5242,0.0365,0.0319,2.0526 +Small,6x6,ldr-rgb-03.png,41.7488,0.0124,0.0085,7.7285 +Small,6x6,ldr-rgb-04.png,34.2222,0.0298,0.0253,2.5858 +Small,6x6,ldr-rgb-05.png,30.1609,0.0505,0.0460,1.4255 +Small,6x6,ldr-rgb-06.png,27.5925,0.0365,0.0319,2.0559 +Small,6x6,ldr-rgb-07.png,33.9274,0.0553,0.0508,1.2896 +Small,6x6,ldr-rgb-08.png,39.2801,0.0199,0.0157,4.1772 +Small,6x6,ldr-rgb-09.png,33.6765,0.0292,0.0249,2.6308 +Small,6x6,ldr-rgb-10.png,37.0112,0.0056,0.0038,4.2700 +Small,6x6,ldr-rgba-00.png,30.2369,0.0624,0.0576,1.1386 +Small,6x6,ldr-rgba-01.png,32.2229,0.0342,0.0295,2.2247 +Small,6x6,ldr-rgba-02.png,27.8684,0.0403,0.0357,1.8366 +Small,6x6,ldr-xy-00.png,36.2311,0.0242,0.0189,3.4589 +Small,6x6,ldr-xy-01.png,38.0476,0.0296,0.0241,2.7165 +Small,6x6,ldr-xy-02.png,46.2056,0.0226,0.0172,3.8127 +Small,6x6,ldrs-rgba-00.png,30.2315,0.0629,0.0581,1.1273 +Small,6x6,ldrs-rgba-01.png,32.2177,0.0351,0.0303,2.1658 +Small,6x6,ldrs-rgba-02.png,27.8515,0.0405,0.0359,1.8253 +Small,8x8,hdr-rgb-00.hdr,24.1401,0.1103,0.0554,1.1840 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0019,0.0000,6.8830 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0018,0.0000,6.1008 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0018,0.0000,5.5634 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0018,0.0000,7.3044 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0018,0.0000,6.7109 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0018,0.0000,6.9274 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0018,0.0000,7.3044 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0018,0.0000,7.1109 +Small,8x8,ldr-rgb-00.png,28.7679,0.0681,0.0632,1.0376 +Small,8x8,ldr-rgb-01.png,28.9616,0.0457,0.0404,1.6231 +Small,8x8,ldr-rgb-02.png,23.1756,0.0508,0.0456,1.4368 +Small,8x8,ldr-rgb-03.png,38.6059,0.0148,0.0099,6.5951 +Small,8x8,ldr-rgb-04.png,29.6621,0.0451,0.0401,1.6361 +Small,8x8,ldr-rgb-05.png,25.9492,0.0675,0.0621,1.0552 +Small,8x8,ldr-rgb-06.png,23.2148,0.0521,0.0466,1.4058 +Small,8x8,ldr-rgb-07.png,30.7938,0.0721,0.0665,0.9850 +Small,8x8,ldr-rgb-08.png,35.9674,0.0250,0.0201,3.2589 +Small,8x8,ldr-rgb-09.png,28.9937,0.0409,0.0354,1.8501 +Small,8x8,ldr-rgb-10.png,32.1931,0.0083,0.0055,2.9519 +Small,8x8,ldr-rgba-00.png,26.4788,0.0839,0.0782,0.8375 +Small,8x8,ldr-rgba-01.png,28.3965,0.0466,0.0409,1.6006 +Small,8x8,ldr-rgba-02.png,23.9517,0.0555,0.0497,1.3199 +Small,8x8,ldr-xy-00.png,34.0124,0.0357,0.0290,2.2568 +Small,8x8,ldr-xy-01.png,35.0062,0.0348,0.0283,2.3140 +Small,8x8,ldr-xy-02.png,41.7281,0.0242,0.0177,3.7089 +Small,8x8,ldrs-rgba-00.png,26.4777,0.0849,0.0793,0.8267 +Small,8x8,ldrs-rgba-01.png,28.3866,0.0476,0.0420,1.5622 +Small,8x8,ldrs-rgba-02.png,23.9442,0.0554,0.0497,1.3181 +Small,12x12,hdr-rgb-00.hdr,20.7667,0.1464,0.0886,0.7397 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0032,0.0000,6.1008 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0031,0.0001,5.0175 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0030,0.0000,5.8040 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0031,0.0000,5.3156 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0031,0.0000,6.5472 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0031,0.0000,6.1008 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0031,0.0000,6.1008 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0031,0.0000,5.9323 +Small,12x12,ldr-rgb-00.png,24.6963,0.0856,0.0788,0.8321 +Small,12x12,ldr-rgb-01.png,25.0511,0.0617,0.0545,1.2021 +Small,12x12,ldr-rgb-02.png,19.2753,0.0780,0.0707,0.9263 +Small,12x12,ldr-rgb-03.png,35.0157,0.0173,0.0109,6.0003 +Small,12x12,ldr-rgb-04.png,24.9056,0.0571,0.0502,1.3054 +Small,12x12,ldr-rgb-05.png,21.6572,0.0924,0.0850,0.7712 +Small,12x12,ldr-rgb-06.png,19.2621,0.0799,0.0726,0.9021 +Small,12x12,ldr-rgb-07.png,26.7652,0.0850,0.0780,0.8405 +Small,12x12,ldr-rgb-08.png,31.7024,0.0290,0.0223,2.9392 +Small,12x12,ldr-rgb-09.png,24.1625,0.0567,0.0496,1.3226 +Small,12x12,ldr-rgb-10.png,28.0564,0.0123,0.0079,2.0484 +Small,12x12,ldr-rgba-00.png,22.2658,0.1032,0.0955,0.6861 +Small,12x12,ldr-rgba-01.png,24.6578,0.0627,0.0549,1.1940 +Small,12x12,ldr-rgba-02.png,20.1912,0.0870,0.0799,0.8200 +Small,12x12,ldr-xy-00.png,30.2800,0.0430,0.0341,1.9238 +Small,12x12,ldr-xy-01.png,31.8596,0.0459,0.0371,1.7656 +Small,12x12,ldr-xy-02.png,38.5099,0.0139,0.0057,11.4671 +Small,12x12,ldrs-rgba-00.png,22.2653,0.0989,0.0918,0.7139 +Small,12x12,ldrs-rgba-01.png,24.6575,0.0598,0.0528,1.2423 +Small,12x12,ldrs-rgba-02.png,20.1877,0.0846,0.0774,0.8469 +Small,3x3x3,ldr-l-00-3.dds,51.2242,0.0300,0.0213,12.3055 +Small,3x3x3,ldr-l-01-3.dds,52.5323,0.0092,0.0061,11.3899 +Small,6x6x6,ldr-l-00-3.dds,32.9798,0.1260,0.1132,2.3164 +Small,6x6x6,ldr-l-01-3.dds,40.9689,0.0389,0.0322,2.1375 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-neon_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-neon_thorough_results.csv new file mode 100644 index 0000000..cecc23c --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-neon_thorough_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.4205,0.1104,0.0633,1.0354 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0010,0.0000,5.5634 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0010,0.0000,7.5087 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0010,0.0000,5.4505 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0010,0.0000,5.6812 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0010,0.0000,5.6812 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0010,0.0000,7.5616 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0010,0.0000,7.1109 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0010,0.0000,5.4505 +Small,4x4,ldr-rgb-00.png,39.1774,0.0781,0.0736,0.8904 +Small,4x4,ldr-rgb-01.png,40.4449,0.0769,0.0731,0.8968 +Small,4x4,ldr-rgb-02.png,35.5044,0.0720,0.0677,0.9680 +Small,4x4,ldr-rgb-03.png,47.8124,0.0721,0.0684,0.9575 +Small,4x4,ldr-rgb-04.png,42.3889,0.0661,0.0619,1.0589 +Small,4x4,ldr-rgb-05.png,38.0196,0.0796,0.0753,0.8703 +Small,4x4,ldr-rgb-06.png,35.6706,0.0645,0.0604,1.0857 +Small,4x4,ldr-rgb-07.png,39.9554,0.0958,0.0915,0.7165 +Small,4x4,ldr-rgb-08.png,45.9894,0.0700,0.0661,0.9910 +Small,4x4,ldr-rgb-09.png,42.2994,0.0714,0.0673,0.9733 +Small,4x4,ldr-rgb-10.png,45.2039,0.0095,0.0077,2.1038 +Small,4x4,ldr-rgba-00.png,36.7547,0.0857,0.0802,0.8172 +Small,4x4,ldr-rgba-01.png,39.1435,0.0600,0.0560,1.1702 +Small,4x4,ldr-rgba-02.png,35.0657,0.0594,0.0552,1.1875 +Small,4x4,ldr-xy-00.png,37.7734,0.0685,0.0639,1.0257 +Small,4x4,ldr-xy-01.png,45.4427,0.0785,0.0741,0.8848 +Small,4x4,ldr-xy-02.png,51.3374,0.1049,0.0999,0.6558 +Small,4x4,ldrs-rgba-00.png,36.7550,0.0861,0.0817,0.8017 +Small,4x4,ldrs-rgba-01.png,39.1433,0.0605,0.0563,1.1633 +Small,4x4,ldrs-rgba-02.png,35.0530,0.0605,0.0563,1.1641 +Small,5x5,hdr-rgb-00.hdr,30.2973,0.1204,0.0696,0.9419 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0014,0.0000,5.1375 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0014,0.0001,4.8150 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0014,0.0000,5.5634 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0014,0.0001,4.8367 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0015,0.0000,5.6812 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0014,0.0000,5.5634 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0014,0.0000,5.2123 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0014,0.0000,5.1375 +Small,5x5,ldr-rgb-00.png,35.3997,0.0870,0.0828,0.7916 +Small,5x5,ldr-rgb-01.png,36.5650,0.0800,0.0758,0.8650 +Small,5x5,ldr-rgb-02.png,31.2263,0.0701,0.0654,1.0017 +Small,5x5,ldr-rgb-03.png,44.6479,0.0840,0.0796,0.8229 +Small,5x5,ldr-rgb-04.png,37.8497,0.0723,0.0677,0.9673 +Small,5x5,ldr-rgb-05.png,33.7130,0.0932,0.0885,0.7407 +Small,5x5,ldr-rgb-06.png,31.2577,0.0631,0.0587,1.1164 +Small,5x5,ldr-rgb-07.png,36.7807,0.1127,0.1082,0.6057 +Small,5x5,ldr-rgb-08.png,42.4775,0.0798,0.0756,0.8673 +Small,5x5,ldr-rgb-09.png,37.7193,0.0799,0.0757,0.8662 +Small,5x5,ldr-rgb-10.png,40.7723,0.0107,0.0085,1.9143 +Small,5x5,ldr-rgba-00.png,33.1334,0.1015,0.0967,0.6777 +Small,5x5,ldr-rgba-01.png,35.4400,0.0676,0.0630,1.0400 +Small,5x5,ldr-rgba-02.png,31.2027,0.0674,0.0624,1.0504 +Small,5x5,ldr-xy-00.png,37.1948,0.0817,0.0764,0.8573 +Small,5x5,ldr-xy-01.png,41.4468,0.1000,0.0949,0.6906 +Small,5x5,ldr-xy-02.png,49.4347,0.1214,0.1159,0.5655 +Small,5x5,ldrs-rgba-00.png,33.1290,0.1051,0.0998,0.6565 +Small,5x5,ldrs-rgba-01.png,35.4379,0.0688,0.0642,1.0204 +Small,5x5,ldrs-rgba-02.png,31.1988,0.0664,0.0620,1.0567 +Small,6x6,hdr-rgb-00.hdr,27.7236,0.1242,0.0747,0.8770 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0014,0.0000,5.3420 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0014,0.0001,4.9254 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0015,0.0001,4.9254 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0014,0.0001,5.0175 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0014,0.0000,5.4229 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0015,0.0000,5.5634 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0014,0.0000,5.6812 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0014,0.0001,5.0410 +Small,6x6,ldr-rgb-00.png,32.6611,0.0940,0.0898,0.7300 +Small,6x6,ldr-rgb-01.png,33.2151,0.0856,0.0812,0.8070 +Small,6x6,ldr-rgb-02.png,27.5730,0.0745,0.0699,0.9372 +Small,6x6,ldr-rgb-03.png,42.6044,0.0733,0.0689,0.9513 +Small,6x6,ldr-rgb-04.png,34.3610,0.0752,0.0708,0.9261 +Small,6x6,ldr-rgb-05.png,30.3091,0.1011,0.0965,0.6795 +Small,6x6,ldr-rgb-06.png,27.6509,0.0713,0.0667,0.9827 +Small,6x6,ldr-rgb-07.png,34.4860,0.1248,0.1201,0.5458 +Small,6x6,ldr-rgb-08.png,40.0928,0.0687,0.0642,1.0201 +Small,6x6,ldr-rgb-09.png,33.8320,0.0832,0.0786,0.8335 +Small,6x6,ldr-rgb-10.png,37.2019,0.0124,0.0103,1.5761 +Small,6x6,ldr-rgba-00.png,30.5217,0.1135,0.1089,0.6016 +Small,6x6,ldr-rgba-01.png,32.2966,0.0762,0.0717,0.9135 +Small,6x6,ldr-rgba-02.png,27.9025,0.0707,0.0662,0.9906 +Small,6x6,ldr-xy-00.png,36.3131,0.0709,0.0656,0.9983 +Small,6x6,ldr-xy-01.png,38.0748,0.0994,0.0944,0.6942 +Small,6x6,ldr-xy-02.png,47.6588,0.1273,0.1223,0.5357 +Small,6x6,ldrs-rgba-00.png,30.5178,0.1144,0.1094,0.5991 +Small,6x6,ldrs-rgba-01.png,32.2891,0.0776,0.0728,0.8996 +Small,6x6,ldrs-rgba-02.png,27.8879,0.0723,0.0675,0.9703 +Small,8x8,hdr-rgb-00.hdr,24.3456,0.1628,0.1089,0.6017 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0024,0.0001,4.9254 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0024,0.0000,5.3156 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0024,0.0000,5.4505 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0025,0.0000,5.4505 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0024,0.0001,4.5691 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0024,0.0000,5.2378 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0024,0.0001,4.9254 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0024,0.0001,4.7511 +Small,8x8,ldr-rgb-00.png,28.9872,0.1303,0.1250,0.5242 +Small,8x8,ldr-rgb-01.png,29.0418,0.1144,0.1087,0.6031 +Small,8x8,ldr-rgb-02.png,23.2150,0.1029,0.0976,0.6714 +Small,8x8,ldr-rgb-03.png,39.4501,0.0478,0.0423,1.5483 +Small,8x8,ldr-rgb-04.png,29.7910,0.0997,0.0939,0.6983 +Small,8x8,ldr-rgb-05.png,26.0513,0.1253,0.1199,0.5465 +Small,8x8,ldr-rgb-06.png,23.2667,0.1026,0.0968,0.6771 +Small,8x8,ldr-rgb-07.png,31.2555,0.1611,0.1553,0.4220 +Small,8x8,ldr-rgb-08.png,36.6163,0.0734,0.0680,0.9634 +Small,8x8,ldr-rgb-09.png,29.1587,0.0885,0.0827,0.7920 +Small,8x8,ldr-rgb-10.png,32.3435,0.0182,0.0149,1.0937 +Small,8x8,ldr-rgba-00.png,26.7519,0.1555,0.1495,0.4384 +Small,8x8,ldr-rgba-01.png,28.4593,0.1121,0.1061,0.6176 +Small,8x8,ldr-rgba-02.png,23.9778,0.1003,0.0947,0.6917 +Small,8x8,ldr-xy-00.png,34.2195,0.0833,0.0772,0.8493 +Small,8x8,ldr-xy-01.png,35.3357,0.0890,0.0829,0.7909 +Small,8x8,ldr-xy-02.png,44.6504,0.1156,0.1094,0.5991 +Small,8x8,ldrs-rgba-00.png,26.7482,0.1543,0.1483,0.4420 +Small,8x8,ldrs-rgba-01.png,28.4511,0.1104,0.1043,0.6283 +Small,8x8,ldrs-rgba-02.png,23.9705,0.1013,0.0951,0.6890 +Small,12x12,hdr-rgb-00.hdr,21.0293,0.2301,0.1735,0.3777 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0045,0.0001,4.3471 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0044,0.0000,5.2378 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0044,0.0000,5.3156 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0044,0.0001,4.9254 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0044,0.0000,5.2378 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0043,0.0001,5.1131 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0043,0.0001,5.0175 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0043,0.0000,5.3156 +Small,12x12,ldr-rgb-00.png,25.0590,0.1834,0.1761,0.3722 +Small,12x12,ldr-rgb-01.png,25.1523,0.1610,0.1524,0.4300 +Small,12x12,ldr-rgb-02.png,19.2946,0.1755,0.1672,0.3919 +Small,12x12,ldr-rgb-03.png,36.1989,0.0527,0.0454,1.4441 +Small,12x12,ldr-rgb-04.png,25.0024,0.1443,0.1355,0.4838 +Small,12x12,ldr-rgb-05.png,21.7425,0.1760,0.1675,0.3913 +Small,12x12,ldr-rgb-06.png,19.3024,0.1728,0.1650,0.3973 +Small,12x12,ldr-rgb-07.png,27.1383,0.2007,0.1919,0.3415 +Small,12x12,ldr-rgb-08.png,32.5503,0.0713,0.0640,1.0243 +Small,12x12,ldr-rgb-09.png,24.3118,0.1265,0.1182,0.5545 +Small,12x12,ldr-rgb-10.png,28.1897,0.0265,0.0210,0.7753 +Small,12x12,ldr-rgba-00.png,22.7626,0.2112,0.2031,0.3228 +Small,12x12,ldr-rgba-01.png,24.7534,0.1673,0.1595,0.4110 +Small,12x12,ldr-rgba-02.png,20.2087,0.1730,0.1640,0.3995 +Small,12x12,ldr-xy-00.png,30.5427,0.1169,0.1089,0.6017 +Small,12x12,ldr-xy-01.png,32.2466,0.0876,0.0792,0.8271 +Small,12x12,ldr-xy-02.png,40.3262,0.0568,0.0490,1.3368 +Small,12x12,ldrs-rgba-00.png,22.7580,0.2106,0.2021,0.3243 +Small,12x12,ldrs-rgba-01.png,24.7479,0.1896,0.1803,0.3635 +Small,12x12,ldrs-rgba-02.png,20.2070,0.1921,0.1832,0.3577 +Small,3x3x3,ldr-l-00-3.dds,52.1075,0.0871,0.0772,3.3935 +Small,3x3x3,ldr-l-01-3.dds,54.5135,0.0381,0.0343,2.0108 +Small,6x6x6,ldr-l-00-3.dds,33.2902,0.1894,0.1745,1.5021 +Small,6x6x6,ldr-l-01-3.dds,41.6644,0.0464,0.0371,1.8574 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse2_fast_results.csv new file mode 100644 index 0000000..28a1197 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse2_fast_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.7281,0.1421,0.0152,4.3235 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0084,0.0003,0.9378 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0084,0.0003,1.0197 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0088,0.0002,1.0364 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0087,0.0003,0.9107 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0088,0.0003,0.9046 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0085,0.0003,0.8918 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0084,0.0002,1.1472 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0084,0.0003,0.9272 +Small,4x4,ldr-rgb-00.png,38.2700,0.0245,0.0100,6.5860 +Small,4x4,ldr-rgb-01.png,39.9568,0.0226,0.0084,7.7796 +Small,4x4,ldr-rgb-02.png,35.1963,0.0278,0.0136,4.8299 +Small,4x4,ldr-rgb-03.png,46.0467,0.0171,0.0030,22.1640 +Small,4x4,ldr-rgb-04.png,42.0037,0.0201,0.0057,11.3977 +Small,4x4,ldr-rgb-05.png,37.3577,0.0275,0.0133,4.9323 +Small,4x4,ldr-rgb-06.png,35.3918,0.0269,0.0122,5.3701 +Small,4x4,ldr-rgb-07.png,38.1916,0.0285,0.0139,4.7193 +Small,4x4,ldr-rgb-08.png,43.9030,0.0186,0.0047,13.9972 +Small,4x4,ldr-rgb-09.png,41.9061,0.0204,0.0059,11.0464 +Small,4x4,ldr-rgb-10.png,44.4858,0.0133,0.0012,13.3351 +Small,4x4,ldr-rgba-00.png,35.6075,0.0277,0.0133,4.9191 +Small,4x4,ldr-rgba-01.png,38.8915,0.0223,0.0078,8.4311 +Small,4x4,ldr-rgba-02.png,34.9103,0.0260,0.0113,5.7900 +Small,4x4,ldr-xy-00.png,37.6561,0.0213,0.0053,12.2708 +Small,4x4,ldr-xy-01.png,44.2119,0.0226,0.0065,10.0887 +Small,4x4,ldr-xy-02.png,48.3459,0.0203,0.0038,17.1061 +Small,4x4,ldrs-rgba-00.png,35.6094,0.0277,0.0134,4.8940 +Small,4x4,ldrs-rgba-01.png,38.8931,0.0232,0.0079,8.3359 +Small,4x4,ldrs-rgba-02.png,34.8940,0.0257,0.0114,5.7603 +Small,5x5,hdr-rgb-00.hdr,29.5418,0.1538,0.0154,4.2675 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0087,0.0003,1.0120 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0089,0.0003,0.9146 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0092,0.0003,0.9305 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0088,0.0003,0.9107 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0091,0.0003,0.9485 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0088,0.0003,0.9138 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0088,0.0003,0.8801 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0089,0.0003,0.8744 +Small,5x5,ldr-rgb-00.png,34.4434,0.0249,0.0101,6.4618 +Small,5x5,ldr-rgb-01.png,36.2670,0.0217,0.0068,9.6703 +Small,5x5,ldr-rgb-02.png,31.1094,0.0259,0.0109,5.9865 +Small,5x5,ldr-rgb-03.png,42.8398,0.0164,0.0024,27.0150 +Small,5x5,ldr-rgb-04.png,37.2876,0.0203,0.0057,11.5055 +Small,5x5,ldr-rgb-05.png,33.2882,0.0292,0.0141,4.6449 +Small,5x5,ldr-rgb-06.png,31.1492,0.0258,0.0107,6.1129 +Small,5x5,ldr-rgb-07.png,35.1044,0.0258,0.0114,5.7463 +Small,5x5,ldr-rgb-08.png,40.2560,0.0182,0.0040,16.3715 +Small,5x5,ldr-rgb-09.png,37.2934,0.0200,0.0058,11.2200 +Small,5x5,ldr-rgb-10.png,40.2099,0.0133,0.0011,15.3357 +Small,5x5,ldr-rgba-00.png,32.1563,0.0291,0.0145,4.5178 +Small,5x5,ldr-rgba-01.png,35.2201,0.0226,0.0078,8.4375 +Small,5x5,ldr-rgba-02.png,31.1519,0.0260,0.0113,5.7772 +Small,5x5,ldr-xy-00.png,36.7408,0.0211,0.0042,15.4313 +Small,5x5,ldr-xy-01.png,39.8426,0.0223,0.0055,11.8125 +Small,5x5,ldr-xy-02.png,43.9819,0.0203,0.0038,17.1296 +Small,5x5,ldrs-rgba-00.png,32.1540,0.0292,0.0146,4.5027 +Small,5x5,ldrs-rgba-01.png,35.2189,0.0222,0.0078,8.3881 +Small,5x5,ldrs-rgba-02.png,31.1450,0.0261,0.0114,5.7241 +Small,6x6,hdr-rgb-00.hdr,27.0785,0.1524,0.0156,4.2137 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0087,0.0003,0.8680 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0090,0.0003,0.9806 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0090,0.0003,0.8209 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0089,0.0003,1.0007 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0090,0.0003,0.8889 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0089,0.0003,0.8128 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0090,0.0003,0.8948 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0088,0.0003,0.8737 +Small,6x6,ldr-rgb-00.png,31.7201,0.0274,0.0129,5.0843 +Small,6x6,ldr-rgb-01.png,32.9461,0.0237,0.0085,7.6973 +Small,6x6,ldr-rgb-02.png,27.4945,0.0272,0.0126,5.1963 +Small,6x6,ldr-rgb-03.png,40.6123,0.0168,0.0025,26.4891 +Small,6x6,ldr-rgb-04.png,33.9447,0.0214,0.0070,9.4269 +Small,6x6,ldr-rgb-05.png,29.9962,0.0320,0.0172,3.8113 +Small,6x6,ldr-rgb-06.png,27.5637,0.0274,0.0125,5.2483 +Small,6x6,ldr-rgb-07.png,32.9859,0.0264,0.0116,5.6467 +Small,6x6,ldr-rgb-08.png,37.8899,0.0192,0.0041,15.9073 +Small,6x6,ldr-rgb-09.png,33.4975,0.0221,0.0072,9.0782 +Small,6x6,ldr-rgb-10.png,36.7053,0.0139,0.0013,12.0677 +Small,6x6,ldr-rgba-00.png,29.6096,0.0324,0.0175,3.7479 +Small,6x6,ldr-rgba-01.png,32.1075,0.0239,0.0092,7.1249 +Small,6x6,ldr-rgba-02.png,27.8547,0.0280,0.0133,4.9338 +Small,6x6,ldr-xy-00.png,35.9052,0.0212,0.0048,13.7942 +Small,6x6,ldr-xy-01.png,37.1922,0.0240,0.0070,9.4081 +Small,6x6,ldr-xy-02.png,41.9609,0.0200,0.0036,18.2655 +Small,6x6,ldrs-rgba-00.png,29.6069,0.0340,0.0176,3.7181 +Small,6x6,ldrs-rgba-01.png,32.1031,0.0241,0.0092,7.1158 +Small,6x6,ldrs-rgba-02.png,27.8398,0.0289,0.0133,4.9105 +Small,8x8,hdr-rgb-00.hdr,23.7878,0.1581,0.0201,3.2619 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0090,0.0003,0.9444 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0090,0.0003,0.8652 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0091,0.0003,0.9700 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0076,0.0003,0.9076 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0092,0.0003,0.9700 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0093,0.0003,0.8311 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0091,0.0003,0.9665 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0090,0.0003,0.9177 +Small,8x8,ldr-rgb-00.png,28.0747,0.0298,0.0145,4.5060 +Small,8x8,ldr-rgb-01.png,28.7890,0.0262,0.0113,5.7935 +Small,8x8,ldr-rgb-02.png,23.1132,0.0331,0.0177,3.7108 +Small,8x8,ldr-rgb-03.png,37.3786,0.0174,0.0028,23.3382 +Small,8x8,ldr-rgb-04.png,29.3571,0.0254,0.0105,6.2529 +Small,8x8,ldr-rgb-05.png,25.8131,0.0358,0.0209,3.1323 +Small,8x8,ldr-rgb-06.png,23.1776,0.0338,0.0183,3.5781 +Small,8x8,ldr-rgb-07.png,29.8769,0.0263,0.0117,5.5814 +Small,8x8,ldr-rgb-08.png,34.5214,0.0192,0.0047,13.8961 +Small,8x8,ldr-rgb-09.png,28.6522,0.0247,0.0097,6.7375 +Small,8x8,ldr-rgb-10.png,32.0068,0.0140,0.0018,9.0416 +Small,8x8,ldr-rgba-00.png,25.7092,0.0349,0.0199,3.2868 +Small,8x8,ldr-rgba-01.png,28.3054,0.0281,0.0132,4.9528 +Small,8x8,ldr-rgba-02.png,23.9438,0.0347,0.0193,3.4038 +Small,8x8,ldr-xy-00.png,33.3643,0.0234,0.0064,10.2018 +Small,8x8,ldr-xy-01.png,34.3964,0.0249,0.0080,8.2188 +Small,8x8,ldr-xy-02.png,39.8866,0.0191,0.0023,28.3818 +Small,8x8,ldrs-rgba-00.png,25.7053,0.0348,0.0198,3.3034 +Small,8x8,ldrs-rgba-01.png,28.2955,0.0298,0.0134,4.9040 +Small,8x8,ldrs-rgba-02.png,23.9365,0.0347,0.0193,3.3981 +Small,12x12,hdr-rgb-00.hdr,20.5371,0.1728,0.0292,2.2442 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0106,0.0003,0.8049 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0110,0.0003,0.7314 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0106,0.0003,0.9305 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0089,0.0003,1.0007 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0112,0.0003,0.9046 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0109,0.0003,0.9553 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0103,0.0003,0.8535 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0104,0.0003,0.8708 +Small,12x12,ldr-rgb-00.png,23.8044,0.0295,0.0122,5.3647 +Small,12x12,ldr-rgb-01.png,24.7859,0.0247,0.0087,7.5216 +Small,12x12,ldr-rgb-02.png,19.2338,0.0361,0.0197,3.3243 +Small,12x12,ldr-rgb-03.png,33.2733,0.0182,0.0019,35.1013 +Small,12x12,ldr-rgb-04.png,24.5789,0.0259,0.0082,7.9447 +Small,12x12,ldr-rgb-05.png,21.4954,0.0335,0.0173,3.7807 +Small,12x12,ldr-rgb-06.png,19.2327,0.0364,0.0208,3.1450 +Small,12x12,ldr-rgb-07.png,25.4006,0.0248,0.0083,7.9293 +Small,12x12,ldr-rgb-08.png,30.3089,0.0196,0.0035,18.7412 +Small,12x12,ldr-rgb-09.png,23.7455,0.0275,0.0108,6.0414 +Small,12x12,ldr-rgb-10.png,27.3338,0.0166,0.0025,6.4665 +Small,12x12,ldr-rgba-00.png,21.6156,0.0357,0.0197,3.3301 +Small,12x12,ldr-rgba-01.png,24.5339,0.0280,0.0107,6.1318 +Small,12x12,ldr-rgba-02.png,20.1778,0.0409,0.0238,2.7575 +Small,12x12,ldr-xy-00.png,29.2438,0.0265,0.0064,10.2448 +Small,12x12,ldr-xy-01.png,30.5551,0.0260,0.0057,11.4935 +Small,12x12,ldr-xy-02.png,37.9965,0.0215,0.0009,69.3436 +Small,12x12,ldrs-rgba-00.png,21.6151,0.0376,0.0195,3.3529 +Small,12x12,ldrs-rgba-01.png,24.5310,0.0291,0.0106,6.1698 +Small,12x12,ldrs-rgba-02.png,20.1749,0.0400,0.0238,2.7500 +Small,3x3x3,ldr-l-00-3.dds,50.2752,0.0246,0.0117,22.3960 +Small,3x3x3,ldr-l-01-3.dds,51.8763,0.0143,0.0047,14.6242 +Small,6x6x6,ldr-l-00-3.dds,32.5486,0.0715,0.0562,4.6651 +Small,6x6x6,ldr-l-01-3.dds,40.8686,0.0333,0.0214,3.2199 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse2_fastest_results.csv new file mode 100644 index 0000000..4552f40 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse2_fastest_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.3455,0.1447,0.0090,7.2810 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0080,0.0003,0.9851 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0081,0.0003,0.9046 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0081,0.0003,0.9924 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0075,0.0003,1.0073 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0084,0.0003,0.9656 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0082,0.0002,1.0324 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0082,0.0003,0.9587 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0080,0.0003,1.0082 +Small,4x4,ldr-rgb-00.png,37.2582,0.0182,0.0056,11.7680 +Small,4x4,ldr-rgb-01.png,39.5673,0.0188,0.0050,13.0676 +Small,4x4,ldr-rgb-02.png,34.8275,0.0208,0.0072,9.0860 +Small,4x4,ldr-rgb-03.png,45.4522,0.0160,0.0022,30.3263 +Small,4x4,ldr-rgb-04.png,41.7305,0.0178,0.0037,17.5282 +Small,4x4,ldr-rgb-05.png,36.8931,0.0214,0.0076,8.6071 +Small,4x4,ldr-rgb-06.png,35.0002,0.0215,0.0068,9.6081 +Small,4x4,ldr-rgb-07.png,37.4123,0.0212,0.0073,8.9862 +Small,4x4,ldr-rgb-08.png,43.0339,0.0173,0.0030,22.0361 +Small,4x4,ldr-rgb-09.png,41.7131,0.0178,0.0038,17.3556 +Small,4x4,ldr-rgb-10.png,43.9533,0.0127,0.0009,18.2014 +Small,4x4,ldr-rgba-00.png,34.7402,0.0227,0.0073,8.9566 +Small,4x4,ldr-rgba-01.png,38.6972,0.0197,0.0054,12.2065 +Small,4x4,ldr-rgba-02.png,34.6012,0.0227,0.0077,8.5368 +Small,4x4,ldr-xy-00.png,37.6163,0.0195,0.0038,17.3053 +Small,4x4,ldr-xy-01.png,43.9354,0.0204,0.0046,14.3562 +Small,4x4,ldr-xy-02.png,48.3675,0.0189,0.0030,21.8226 +Small,4x4,ldrs-rgba-00.png,34.7410,0.0219,0.0073,8.9627 +Small,4x4,ldrs-rgba-01.png,38.6988,0.0202,0.0054,12.2201 +Small,4x4,ldrs-rgba-02.png,34.5841,0.0222,0.0077,8.4651 +Small,5x5,hdr-rgb-00.hdr,28.8645,0.1448,0.0089,7.3611 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0084,0.0003,0.9924 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0084,0.0003,0.8830 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0070,0.0003,0.8978 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0085,0.0003,0.9735 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0082,0.0003,0.9444 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0084,0.0003,0.8253 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0082,0.0003,0.8422 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0083,0.0003,0.8563 +Small,5x5,ldr-rgb-00.png,33.7346,0.0197,0.0057,11.4095 +Small,5x5,ldr-rgb-01.png,36.0898,0.0189,0.0048,13.7887 +Small,5x5,ldr-rgb-02.png,31.0129,0.0232,0.0076,8.5972 +Small,5x5,ldr-rgb-03.png,42.4476,0.0155,0.0019,34.4588 +Small,5x5,ldr-rgb-04.png,37.0450,0.0184,0.0043,15.2270 +Small,5x5,ldr-rgb-05.png,32.9822,0.0230,0.0087,7.5249 +Small,5x5,ldr-rgb-06.png,31.0536,0.0226,0.0076,8.5733 +Small,5x5,ldr-rgb-07.png,34.4588,0.0210,0.0071,9.1748 +Small,5x5,ldr-rgb-08.png,39.6603,0.0163,0.0027,24.4184 +Small,5x5,ldr-rgb-09.png,37.0769,0.0186,0.0041,15.8760 +Small,5x5,ldr-rgb-10.png,39.9359,0.0127,0.0009,18.5178 +Small,5x5,ldr-rgba-00.png,31.1232,0.0223,0.0080,8.2373 +Small,5x5,ldr-rgba-01.png,35.0597,0.0197,0.0055,11.8405 +Small,5x5,ldr-rgba-02.png,31.0601,0.0226,0.0084,7.8476 +Small,5x5,ldr-xy-00.png,36.6317,0.0199,0.0033,20.0173 +Small,5x5,ldr-xy-01.png,39.3017,0.0198,0.0039,16.7608 +Small,5x5,ldr-xy-02.png,43.8850,0.0198,0.0031,21.2441 +Small,5x5,ldrs-rgba-00.png,31.1191,0.0222,0.0079,8.2571 +Small,5x5,ldrs-rgba-01.png,35.0595,0.0199,0.0056,11.6632 +Small,5x5,ldrs-rgba-02.png,31.0449,0.0231,0.0084,7.8028 +Small,6x6,hdr-rgb-00.hdr,26.7568,0.1426,0.0085,7.7092 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0082,0.0003,0.7924 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0082,0.0003,0.8563 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0084,0.0003,0.8744 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0084,0.0003,0.8317 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0084,0.0003,0.9272 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0085,0.0003,0.9272 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0084,0.0003,0.9735 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0084,0.0003,0.8737 +Small,6x6,ldr-rgb-00.png,31.3522,0.0214,0.0070,9.4201 +Small,6x6,ldr-rgb-01.png,32.8566,0.0197,0.0058,11.2664 +Small,6x6,ldr-rgb-02.png,27.4076,0.0230,0.0089,7.3811 +Small,6x6,ldr-rgb-03.png,40.3684,0.0155,0.0019,35.0654 +Small,6x6,ldr-rgb-04.png,33.7717,0.0196,0.0052,12.7052 +Small,6x6,ldr-rgb-05.png,29.7603,0.0251,0.0102,6.4044 +Small,6x6,ldr-rgb-06.png,27.4861,0.0251,0.0092,7.1019 +Small,6x6,ldr-rgb-07.png,32.3756,0.0219,0.0073,8.9985 +Small,6x6,ldr-rgb-08.png,37.5033,0.0166,0.0028,23.6413 +Small,6x6,ldr-rgb-09.png,33.3194,0.0193,0.0050,13.1150 +Small,6x6,ldr-rgb-10.png,36.5829,0.0133,0.0010,15.7067 +Small,6x6,ldr-rgba-00.png,28.8481,0.0231,0.0088,7.4261 +Small,6x6,ldr-rgba-01.png,32.0167,0.0210,0.0066,9.9374 +Small,6x6,ldr-rgba-02.png,27.7951,0.0234,0.0089,7.3373 +Small,6x6,ldr-xy-00.png,35.6742,0.0197,0.0035,18.9689 +Small,6x6,ldr-xy-01.png,36.5951,0.0217,0.0047,14.0094 +Small,6x6,ldr-xy-02.png,41.8228,0.0193,0.0028,23.1398 +Small,6x6,ldrs-rgba-00.png,28.8448,0.0242,0.0088,7.4388 +Small,6x6,ldrs-rgba-01.png,32.0125,0.0210,0.0066,9.9963 +Small,6x6,ldrs-rgba-02.png,27.7831,0.0243,0.0089,7.3389 +Small,8x8,hdr-rgb-00.hdr,23.6169,0.1534,0.0135,4.8552 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0089,0.0003,0.8055 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0093,0.0003,0.9378 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0092,0.0003,0.8823 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0091,0.0003,0.9553 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0093,0.0003,0.9280 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0087,0.0003,0.9806 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0095,0.0003,0.9280 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0091,0.0003,0.8737 +Small,8x8,ldr-rgb-00.png,27.7216,0.0255,0.0100,6.5211 +Small,8x8,ldr-rgb-01.png,28.7030,0.0232,0.0083,7.9120 +Small,8x8,ldr-rgb-02.png,23.0366,0.0278,0.0128,5.1236 +Small,8x8,ldr-rgb-03.png,37.0954,0.0162,0.0022,29.3861 +Small,8x8,ldr-rgb-04.png,29.1352,0.0226,0.0078,8.3656 +Small,8x8,ldr-rgb-05.png,25.6104,0.0300,0.0149,4.3931 +Small,8x8,ldr-rgb-06.png,23.0940,0.0280,0.0133,4.9435 +Small,8x8,ldr-rgb-07.png,29.5040,0.0228,0.0083,7.8644 +Small,8x8,ldr-rgb-08.png,33.9884,0.0183,0.0034,19.4191 +Small,8x8,ldr-rgb-09.png,28.4595,0.0220,0.0073,8.9876 +Small,8x8,ldr-rgb-10.png,31.9190,0.0134,0.0013,12.3721 +Small,8x8,ldr-rgba-00.png,25.3524,0.0282,0.0135,4.8570 +Small,8x8,ldr-rgba-01.png,28.2082,0.0243,0.0095,6.8711 +Small,8x8,ldr-rgba-02.png,23.8815,0.0285,0.0131,4.9981 +Small,8x8,ldr-xy-00.png,33.2419,0.0214,0.0049,13.3068 +Small,8x8,ldr-xy-01.png,34.1451,0.0236,0.0059,11.1210 +Small,8x8,ldr-xy-02.png,39.7693,0.0184,0.0019,34.3984 +Small,8x8,ldrs-rgba-00.png,25.3487,0.0284,0.0134,4.8748 +Small,8x8,ldrs-rgba-01.png,28.1979,0.0240,0.0094,6.9498 +Small,8x8,ldrs-rgba-02.png,23.8757,0.0287,0.0131,4.9951 +Small,12x12,hdr-rgb-00.hdr,20.4537,0.1605,0.0199,3.2868 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0104,0.0003,0.8618 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0098,0.0003,0.9842 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0107,0.0003,0.9806 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0106,0.0003,0.9851 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0102,0.0003,0.8889 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0098,0.0003,0.8948 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0100,0.0003,0.9411 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0096,0.0003,0.9924 +Small,12x12,ldr-rgb-00.png,23.7273,0.0240,0.0086,7.6649 +Small,12x12,ldr-rgb-01.png,24.7394,0.0223,0.0062,10.5366 +Small,12x12,ldr-rgb-02.png,19.1996,0.0303,0.0139,4.7067 +Small,12x12,ldr-rgb-03.png,33.1771,0.0186,0.0015,43.0034 +Small,12x12,ldr-rgb-04.png,24.3899,0.0236,0.0060,10.8450 +Small,12x12,ldr-rgb-05.png,21.3900,0.0284,0.0125,5.2513 +Small,12x12,ldr-rgb-06.png,19.1751,0.0309,0.0146,4.4817 +Small,12x12,ldr-rgb-07.png,25.3358,0.0218,0.0059,11.1399 +Small,12x12,ldr-rgb-08.png,30.1393,0.0181,0.0026,25.0527 +Small,12x12,ldr-rgb-09.png,23.6063,0.0241,0.0081,8.0780 +Small,12x12,ldr-rgb-10.png,27.2944,0.0164,0.0018,9.1226 +Small,12x12,ldr-rgba-00.png,21.3688,0.0301,0.0134,4.9069 +Small,12x12,ldr-rgba-01.png,24.4942,0.0257,0.0076,8.5771 +Small,12x12,ldr-rgba-02.png,20.1436,0.0332,0.0166,3.9403 +Small,12x12,ldr-xy-00.png,28.8952,0.0256,0.0048,13.6762 +Small,12x12,ldr-xy-01.png,29.6655,0.0249,0.0044,14.8134 +Small,12x12,ldr-xy-02.png,37.9744,0.0211,0.0010,65.9971 +Small,12x12,ldrs-rgba-00.png,21.3639,0.0296,0.0135,4.8650 +Small,12x12,ldrs-rgba-01.png,24.4913,0.0242,0.0076,8.6674 +Small,12x12,ldrs-rgba-02.png,20.1416,0.0341,0.0166,3.9441 +Small,3x3x3,ldr-l-00-3.dds,50.1569,0.0246,0.0114,23.0723 +Small,3x3x3,ldr-l-01-3.dds,51.8557,0.0145,0.0048,14.5096 +Small,6x6x6,ldr-l-00-3.dds,32.5328,0.0719,0.0564,4.6497 +Small,6x6x6,ldr-l-01-3.dds,40.8686,0.0335,0.0213,3.2321 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse2_medium_results.csv new file mode 100644 index 0000000..83861ff --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse2_medium_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1462,0.1612,0.0237,2.7691 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0086,0.0003,0.8772 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0089,0.0003,0.8701 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0091,0.0003,0.8708 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0088,0.0003,0.9444 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0089,0.0003,0.8918 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0090,0.0003,0.9280 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0088,0.0003,0.9553 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0092,0.0003,0.9587 +Small,4x4,ldr-rgb-00.png,38.8542,0.0416,0.0267,2.4563 +Small,4x4,ldr-rgb-01.png,40.2577,0.0373,0.0226,2.9060 +Small,4x4,ldr-rgb-02.png,35.3269,0.0371,0.0224,2.9248 +Small,4x4,ldr-rgb-03.png,47.3379,0.0291,0.0150,4.3653 +Small,4x4,ldr-rgb-04.png,42.2428,0.0336,0.0179,3.6564 +Small,4x4,ldr-rgb-05.png,37.8423,0.0395,0.0249,2.6312 +Small,4x4,ldr-rgb-06.png,35.5075,0.0345,0.0196,3.3466 +Small,4x4,ldr-rgb-07.png,39.3480,0.0476,0.0330,1.9857 +Small,4x4,ldr-rgb-08.png,45.3018,0.0316,0.0172,3.8003 +Small,4x4,ldr-rgb-09.png,42.1528,0.0339,0.0194,3.3820 +Small,4x4,ldr-rgb-10.png,44.9871,0.0156,0.0027,6.0521 +Small,4x4,ldr-rgba-00.png,36.2694,0.0446,0.0298,2.2022 +Small,4x4,ldr-rgba-01.png,38.9985,0.0315,0.0167,3.9342 +Small,4x4,ldr-rgba-02.png,34.9757,0.0339,0.0187,3.5082 +Small,4x4,ldr-xy-00.png,37.8045,0.0326,0.0157,4.1857 +Small,4x4,ldr-xy-01.png,45.2632,0.0393,0.0236,2.7798 +Small,4x4,ldr-xy-02.png,51.3220,0.0454,0.0289,2.2674 +Small,4x4,ldrs-rgba-00.png,36.2680,0.0449,0.0299,2.1907 +Small,4x4,ldrs-rgba-01.png,39.0001,0.0315,0.0167,3.9236 +Small,4x4,ldrs-rgba-02.png,34.9625,0.0335,0.0187,3.4964 +Small,5x5,hdr-rgb-00.hdr,29.9041,0.1622,0.0262,2.5053 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0087,0.0003,0.9076 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0090,0.0003,0.8830 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0090,0.0003,0.9046 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0090,0.0003,0.9587 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0089,0.0003,0.8852 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0094,0.0003,0.8765 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0088,0.0003,0.9209 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0092,0.0003,0.8955 +Small,5x5,ldr-rgb-00.png,35.1529,0.0433,0.0281,2.3355 +Small,5x5,ldr-rgb-01.png,36.4665,0.0350,0.0216,3.0356 +Small,5x5,ldr-rgb-02.png,31.1516,0.0375,0.0228,2.8785 +Small,5x5,ldr-rgb-03.png,44.0943,0.0235,0.0092,7.1404 +Small,5x5,ldr-rgb-04.png,37.6982,0.0336,0.0190,3.4447 +Small,5x5,ldr-rgb-05.png,33.5609,0.0440,0.0292,2.2445 +Small,5x5,ldr-rgb-06.png,31.1959,0.0341,0.0194,3.3839 +Small,5x5,ldr-rgb-07.png,36.2015,0.0491,0.0345,1.8992 +Small,5x5,ldr-rgb-08.png,41.7238,0.0291,0.0147,4.4628 +Small,5x5,ldr-rgb-09.png,37.5901,0.0318,0.0171,3.8300 +Small,5x5,ldr-rgb-10.png,40.6034,0.0158,0.0028,5.8331 +Small,5x5,ldr-rgba-00.png,32.8000,0.0488,0.0338,1.9371 +Small,5x5,ldr-rgba-01.png,35.3406,0.0339,0.0189,3.4714 +Small,5x5,ldr-rgba-02.png,31.1660,0.0364,0.0214,3.0573 +Small,5x5,ldr-xy-00.png,37.0972,0.0325,0.0154,4.2553 +Small,5x5,ldr-xy-01.png,40.7204,0.0387,0.0222,2.9533 +Small,5x5,ldr-xy-02.png,49.2422,0.0335,0.0174,3.7651 +Small,5x5,ldrs-rgba-00.png,32.7983,0.0485,0.0337,1.9461 +Small,5x5,ldrs-rgba-01.png,35.3390,0.0338,0.0189,3.4714 +Small,5x5,ldrs-rgba-02.png,31.1587,0.0364,0.0215,3.0490 +Small,6x6,hdr-rgb-00.hdr,27.5191,0.1660,0.0278,2.3574 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0088,0.0003,0.8535 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0088,0.0003,0.9345 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0090,0.0003,0.9485 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0089,0.0003,0.8794 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0090,0.0003,0.8889 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0087,0.0003,0.9851 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0089,0.0003,0.9084 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0090,0.0003,0.9656 +Small,6x6,ldr-rgb-00.png,32.4060,0.0450,0.0302,2.1724 +Small,6x6,ldr-rgb-01.png,33.1131,0.0357,0.0208,3.1574 +Small,6x6,ldr-rgb-02.png,27.5242,0.0366,0.0220,2.9726 +Small,6x6,ldr-rgb-03.png,41.7488,0.0208,0.0065,10.1274 +Small,6x6,ldr-rgb-04.png,34.2222,0.0323,0.0179,3.6590 +Small,6x6,ldr-rgb-05.png,30.1609,0.0461,0.0313,2.0963 +Small,6x6,ldr-rgb-06.png,27.5925,0.0363,0.0214,3.0603 +Small,6x6,ldr-rgb-07.png,33.9274,0.0490,0.0343,1.9082 +Small,6x6,ldr-rgb-08.png,39.2801,0.0255,0.0113,5.7796 +Small,6x6,ldr-rgb-09.png,33.6765,0.0327,0.0173,3.7895 +Small,6x6,ldr-rgb-10.png,37.0112,0.0159,0.0031,5.3122 +Small,6x6,ldr-rgba-00.png,30.2369,0.0536,0.0388,1.6874 +Small,6x6,ldr-rgba-01.png,32.2229,0.0354,0.0203,3.2252 +Small,6x6,ldr-rgba-02.png,27.8684,0.0394,0.0242,2.7050 +Small,6x6,ldr-xy-00.png,36.2311,0.0299,0.0133,4.9113 +Small,6x6,ldr-xy-01.png,38.0476,0.0333,0.0169,3.8829 +Small,6x6,ldr-xy-02.png,46.2056,0.0293,0.0123,5.3368 +Small,6x6,ldrs-rgba-00.png,30.2315,0.0541,0.0389,1.6828 +Small,6x6,ldrs-rgba-01.png,32.2177,0.0351,0.0203,3.2231 +Small,6x6,ldrs-rgba-02.png,27.8515,0.0396,0.0243,2.6988 +Small,8x8,hdr-rgb-00.hdr,24.1401,0.1760,0.0371,1.7641 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0101,0.0003,0.9313 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0108,0.0003,0.8859 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0100,0.0003,0.9411 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0102,0.0003,0.9477 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0107,0.0003,0.8859 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0099,0.0003,0.9587 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0099,0.0003,0.9046 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0102,0.0003,0.9248 +Small,8x8,ldr-rgb-00.png,28.7679,0.0577,0.0420,1.5586 +Small,8x8,ldr-rgb-01.png,28.9616,0.0431,0.0273,2.3994 +Small,8x8,ldr-rgb-02.png,23.1756,0.0456,0.0298,2.1995 +Small,8x8,ldr-rgb-03.png,38.6059,0.0240,0.0081,8.1078 +Small,8x8,ldr-rgb-04.png,29.6621,0.0428,0.0275,2.3864 +Small,8x8,ldr-rgb-05.png,25.9492,0.0567,0.0411,1.5935 +Small,8x8,ldr-rgb-06.png,23.2148,0.0457,0.0304,2.1569 +Small,8x8,ldr-rgb-07.png,30.7938,0.0586,0.0430,1.5229 +Small,8x8,ldr-rgb-08.png,35.9674,0.0301,0.0144,4.5514 +Small,8x8,ldr-rgb-09.png,28.9937,0.0400,0.0240,2.7298 +Small,8x8,ldr-rgb-10.png,32.1931,0.0178,0.0043,3.8053 +Small,8x8,ldr-rgba-00.png,26.4788,0.0668,0.0510,1.2846 +Small,8x8,ldr-rgba-01.png,28.3965,0.0430,0.0274,2.3927 +Small,8x8,ldr-rgba-02.png,23.9517,0.0479,0.0321,2.0390 +Small,8x8,ldr-xy-00.png,34.0124,0.0369,0.0191,3.4323 +Small,8x8,ldr-xy-01.png,35.0062,0.0374,0.0193,3.3976 +Small,8x8,ldr-xy-02.png,41.7281,0.0309,0.0128,5.1132 +Small,8x8,ldrs-rgba-00.png,26.4777,0.0662,0.0515,1.2727 +Small,8x8,ldrs-rgba-01.png,28.3866,0.0431,0.0273,2.4017 +Small,8x8,ldrs-rgba-02.png,23.9442,0.0483,0.0321,2.0417 +Small,12x12,hdr-rgb-00.hdr,20.7667,0.1975,0.0529,1.2386 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0134,0.0003,0.8708 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0128,0.0003,0.8178 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0137,0.0003,0.9378 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0138,0.0003,0.8624 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0144,0.0003,0.9621 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0134,0.0003,0.8025 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0143,0.0003,0.8801 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0130,0.0003,0.8369 +Small,12x12,ldr-rgb-00.png,24.6963,0.0658,0.0485,1.3516 +Small,12x12,ldr-rgb-01.png,25.0511,0.0509,0.0338,1.9392 +Small,12x12,ldr-rgb-02.png,19.2753,0.0580,0.0411,1.5963 +Small,12x12,ldr-rgb-03.png,35.0157,0.0256,0.0085,7.7066 +Small,12x12,ldr-rgb-04.png,24.9056,0.0506,0.0320,2.0474 +Small,12x12,ldr-rgb-05.png,21.6572,0.0668,0.0496,1.3221 +Small,12x12,ldr-rgb-06.png,19.2621,0.0602,0.0431,1.5208 +Small,12x12,ldr-rgb-07.png,26.7652,0.0608,0.0440,1.4908 +Small,12x12,ldr-rgb-08.png,31.7024,0.0317,0.0145,4.5166 +Small,12x12,ldr-rgb-09.png,24.1625,0.0498,0.0303,2.1638 +Small,12x12,ldr-rgb-10.png,28.0564,0.0266,0.0091,1.7858 +Small,12x12,ldr-rgba-00.png,22.2658,0.0739,0.0555,1.1815 +Small,12x12,ldr-rgba-01.png,24.6578,0.0495,0.0320,2.0504 +Small,12x12,ldr-rgba-02.png,20.1912,0.0634,0.0458,1.4303 +Small,12x12,ldr-xy-00.png,30.2800,0.0417,0.0212,3.0856 +Small,12x12,ldr-xy-01.png,31.8596,0.0437,0.0233,2.8161 +Small,12x12,ldr-xy-02.png,38.5099,0.0272,0.0046,14.2564 +Small,12x12,ldrs-rgba-00.png,22.2653,0.0726,0.0553,1.1851 +Small,12x12,ldrs-rgba-01.png,24.6575,0.0501,0.0324,2.0234 +Small,12x12,ldrs-rgba-02.png,20.1877,0.0627,0.0453,1.4454 +Small,3x3x3,ldr-l-00-3.dds,51.2242,0.0293,0.0161,16.2953 +Small,3x3x3,ldr-l-01-3.dds,52.5323,0.0149,0.0052,13.3776 +Small,6x6x6,ldr-l-00-3.dds,32.9798,0.0846,0.0673,3.8940 +Small,6x6x6,ldr-l-01-3.dds,40.9689,0.0351,0.0214,3.2233 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse2_thorough_results.csv new file mode 100644 index 0000000..1505dad --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse2_thorough_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.4205,0.1848,0.0471,1.3919 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0098,0.0003,0.8395 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0093,0.0003,0.9553 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0091,0.0003,0.9115 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0089,0.0003,0.7901 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0094,0.0003,0.9107 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0088,0.0003,0.8079 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0088,0.0003,0.9485 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0094,0.0003,0.9046 +Small,4x4,ldr-rgb-00.png,39.1774,0.0703,0.0554,1.1834 +Small,4x4,ldr-rgb-01.png,40.4449,0.0670,0.0523,1.2532 +Small,4x4,ldr-rgb-02.png,35.5044,0.0629,0.0482,1.3592 +Small,4x4,ldr-rgb-03.png,47.8124,0.0643,0.0502,1.3050 +Small,4x4,ldr-rgb-04.png,42.3889,0.0586,0.0437,1.5006 +Small,4x4,ldr-rgb-05.png,38.0196,0.0683,0.0534,1.2283 +Small,4x4,ldr-rgb-06.png,35.6706,0.0570,0.0423,1.5481 +Small,4x4,ldr-rgb-07.png,39.9554,0.0793,0.0663,0.9884 +Small,4x4,ldr-rgb-08.png,45.9894,0.0623,0.0474,1.3827 +Small,4x4,ldr-rgb-09.png,42.2994,0.0623,0.0477,1.3745 +Small,4x4,ldr-rgb-10.png,45.2039,0.0191,0.0058,2.8037 +Small,4x4,ldr-rgba-00.png,36.7547,0.0736,0.0589,1.1120 +Small,4x4,ldr-rgba-01.png,39.1435,0.0545,0.0398,1.6454 +Small,4x4,ldr-rgba-02.png,35.0657,0.0546,0.0394,1.6635 +Small,4x4,ldr-xy-00.png,37.7734,0.0624,0.0463,1.4144 +Small,4x4,ldr-xy-01.png,45.4427,0.0683,0.0523,1.2529 +Small,4x4,ldr-xy-02.png,51.3374,0.0878,0.0716,0.9155 +Small,4x4,ldrs-rgba-00.png,36.7550,0.0733,0.0583,1.1234 +Small,4x4,ldrs-rgba-01.png,39.1433,0.0537,0.0399,1.6407 +Small,4x4,ldrs-rgba-02.png,35.0530,0.0544,0.0395,1.6575 +Small,5x5,hdr-rgb-00.hdr,30.2973,0.1930,0.0532,1.2329 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0098,0.0003,0.9378 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0092,0.0003,0.9806 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0102,0.0003,0.9177 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0094,0.0003,0.9587 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0094,0.0003,0.9411 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0098,0.0003,0.9735 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0095,0.0003,0.8535 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0096,0.0003,0.9519 +Small,5x5,ldr-rgb-00.png,35.3997,0.0811,0.0653,1.0044 +Small,5x5,ldr-rgb-01.png,36.5650,0.0713,0.0557,1.1775 +Small,5x5,ldr-rgb-02.png,31.2263,0.0623,0.0471,1.3912 +Small,5x5,ldr-rgb-03.png,44.6479,0.0728,0.0580,1.1302 +Small,5x5,ldr-rgb-04.png,37.8497,0.0655,0.0498,1.3159 +Small,5x5,ldr-rgb-05.png,33.7130,0.0797,0.0641,1.0218 +Small,5x5,ldr-rgb-06.png,31.2577,0.0591,0.0437,1.4998 +Small,5x5,ldr-rgb-07.png,36.7807,0.0962,0.0810,0.8091 +Small,5x5,ldr-rgb-08.png,42.4775,0.0714,0.0567,1.1567 +Small,5x5,ldr-rgb-09.png,37.7193,0.0711,0.0559,1.1720 +Small,5x5,ldr-rgb-10.png,40.7723,0.0199,0.0069,2.3495 +Small,5x5,ldr-rgba-00.png,33.1334,0.0863,0.0709,0.9240 +Small,5x5,ldr-rgba-01.png,35.4400,0.0615,0.0462,1.4189 +Small,5x5,ldr-rgba-02.png,31.2027,0.0605,0.0449,1.4603 +Small,5x5,ldr-xy-00.png,37.1948,0.0742,0.0572,1.1454 +Small,5x5,ldr-xy-01.png,41.4468,0.0851,0.0684,0.9583 +Small,5x5,ldr-xy-02.png,49.4347,0.0999,0.0835,0.7848 +Small,5x5,ldrs-rgba-00.png,33.1290,0.0868,0.0709,0.9240 +Small,5x5,ldrs-rgba-01.png,35.4379,0.0616,0.0461,1.4209 +Small,5x5,ldrs-rgba-02.png,31.1988,0.0607,0.0449,1.4597 +Small,6x6,hdr-rgb-00.hdr,27.7236,0.1971,0.0574,1.1414 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0093,0.0003,0.8590 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0099,0.0003,0.8985 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0096,0.0003,0.9621 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0095,0.0003,0.9280 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0093,0.0002,1.0455 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0095,0.0003,0.8985 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0093,0.0003,0.8859 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0094,0.0003,0.8955 +Small,6x6,ldr-rgb-00.png,32.6611,0.0878,0.0723,0.9068 +Small,6x6,ldr-rgb-01.png,33.2151,0.0761,0.0609,1.0769 +Small,6x6,ldr-rgb-02.png,27.5730,0.0667,0.0510,1.2842 +Small,6x6,ldr-rgb-03.png,42.6044,0.0671,0.0518,1.2658 +Small,6x6,ldr-rgb-04.png,34.3610,0.0684,0.0531,1.2330 +Small,6x6,ldr-rgb-05.png,30.3091,0.0841,0.0688,0.9532 +Small,6x6,ldr-rgb-06.png,27.6509,0.0648,0.0492,1.3330 +Small,6x6,ldr-rgb-07.png,34.4860,0.1015,0.0877,0.7474 +Small,6x6,ldr-rgb-08.png,40.0928,0.0646,0.0490,1.3376 +Small,6x6,ldr-rgb-09.png,33.8320,0.0738,0.0586,1.1178 +Small,6x6,ldr-rgb-10.png,37.2019,0.0221,0.0085,1.9229 +Small,6x6,ldr-rgba-00.png,30.5217,0.0952,0.0795,0.8242 +Small,6x6,ldr-rgba-01.png,32.2966,0.0688,0.0535,1.2260 +Small,6x6,ldr-rgba-02.png,27.9025,0.0652,0.0495,1.3246 +Small,6x6,ldr-xy-00.png,36.3131,0.0662,0.0493,1.3295 +Small,6x6,ldr-xy-01.png,38.0748,0.0850,0.0684,0.9578 +Small,6x6,ldr-xy-02.png,47.6588,0.1077,0.0907,0.7227 +Small,6x6,ldrs-rgba-00.png,30.5178,0.0962,0.0808,0.8107 +Small,6x6,ldrs-rgba-01.png,32.2891,0.0691,0.0535,1.2249 +Small,6x6,ldrs-rgba-02.png,27.8879,0.0650,0.0494,1.3268 +Small,8x8,hdr-rgb-00.hdr,24.3456,0.2198,0.0772,0.8489 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0129,0.0003,0.8049 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0125,0.0003,0.9700 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0126,0.0003,0.9477 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0121,0.0003,0.8590 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0118,0.0003,0.7642 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0121,0.0003,0.9015 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0117,0.0003,0.9735 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0118,0.0003,0.9887 +Small,8x8,ldr-rgb-00.png,28.9872,0.1113,0.0945,0.6934 +Small,8x8,ldr-rgb-01.png,29.0418,0.0926,0.0779,0.8411 +Small,8x8,ldr-rgb-02.png,23.2150,0.0864,0.0697,0.9397 +Small,8x8,ldr-rgb-03.png,39.4501,0.0472,0.0311,2.1070 +Small,8x8,ldr-rgb-04.png,29.7910,0.0857,0.0691,0.9485 +Small,8x8,ldr-rgb-05.png,26.0513,0.1023,0.0856,0.7661 +Small,8x8,ldr-rgb-06.png,23.2667,0.0853,0.0686,0.9550 +Small,8x8,ldr-rgb-07.png,31.2555,0.1245,0.1076,0.6093 +Small,8x8,ldr-rgb-08.png,36.6163,0.0664,0.0501,1.3084 +Small,8x8,ldr-rgb-09.png,29.1587,0.0752,0.0585,1.1208 +Small,8x8,ldr-rgb-10.png,32.3435,0.0261,0.0113,1.4373 +Small,8x8,ldr-rgba-00.png,26.7519,0.1214,0.1045,0.6269 +Small,8x8,ldr-rgba-01.png,28.4593,0.0893,0.0727,0.9013 +Small,8x8,ldr-rgba-02.png,23.9778,0.0826,0.0657,0.9971 +Small,8x8,ldr-xy-00.png,34.2195,0.0754,0.0575,1.1393 +Small,8x8,ldr-xy-01.png,35.3357,0.0781,0.0600,1.0920 +Small,8x8,ldr-xy-02.png,44.6504,0.0951,0.0770,0.8507 +Small,8x8,ldrs-rgba-00.png,26.7482,0.1212,0.1046,0.6265 +Small,8x8,ldrs-rgba-01.png,28.4511,0.0898,0.0728,0.9001 +Small,8x8,ldrs-rgba-02.png,23.9705,0.0833,0.0662,0.9894 +Small,12x12,hdr-rgb-00.hdr,21.0293,0.2511,0.1123,0.5838 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0152,0.0003,0.8985 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0151,0.0003,0.8049 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0161,0.0003,0.7901 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0158,0.0003,0.9177 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0151,0.0003,0.7878 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0162,0.0003,0.8178 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0159,0.0003,0.8422 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0160,0.0003,0.8260 +Small,12x12,ldr-rgb-00.png,25.0590,0.1399,0.1205,0.5440 +Small,12x12,ldr-rgb-01.png,25.1523,0.1162,0.0970,0.6759 +Small,12x12,ldr-rgb-02.png,19.2946,0.1262,0.1071,0.6121 +Small,12x12,ldr-rgb-03.png,36.1989,0.0498,0.0311,2.1073 +Small,12x12,ldr-rgb-04.png,25.0024,0.1051,0.0860,0.7622 +Small,12x12,ldr-rgb-05.png,21.7425,0.1445,0.1250,0.5243 +Small,12x12,ldr-rgb-06.png,19.3024,0.1227,0.1035,0.6332 +Small,12x12,ldr-rgb-07.png,27.1383,0.1441,0.1254,0.5226 +Small,12x12,ldr-rgb-08.png,32.5503,0.0618,0.0433,1.5122 +Small,12x12,ldr-rgb-09.png,24.3118,0.0973,0.0784,0.8361 +Small,12x12,ldr-rgb-10.png,28.1897,0.0376,0.0194,0.8394 +Small,12x12,ldr-rgba-00.png,22.7626,0.1471,0.1275,0.5138 +Small,12x12,ldr-rgba-01.png,24.7534,0.1183,0.0987,0.6638 +Small,12x12,ldr-rgba-02.png,20.2087,0.1232,0.1035,0.6330 +Small,12x12,ldr-xy-00.png,30.5427,0.0944,0.0735,0.8919 +Small,12x12,ldr-xy-01.png,32.2466,0.0759,0.0553,1.1853 +Small,12x12,ldr-xy-02.png,40.3262,0.0553,0.0348,1.8820 +Small,12x12,ldrs-rgba-00.png,22.7580,0.1461,0.1268,0.5168 +Small,12x12,ldrs-rgba-01.png,24.7479,0.1174,0.0979,0.6694 +Small,12x12,ldrs-rgba-02.png,20.2070,0.1221,0.1028,0.6376 +Small,3x3x3,ldr-l-00-3.dds,52.1075,0.0633,0.0497,5.2759 +Small,3x3x3,ldr-l-01-3.dds,54.5135,0.0330,0.0229,3.0159 +Small,6x6x6,ldr-l-00-3.dds,33.2902,0.1159,0.0967,2.7120 +Small,6x6x6,ldr-l-01-3.dds,41.6644,0.0378,0.0221,3.1234 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse4.1_fast_results.csv new file mode 100644 index 0000000..1994f1e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse4.1_fast_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.7281,0.1486,0.0127,5.1429 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0085,0.0003,0.9046 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0087,0.0003,0.8889 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0086,0.0003,0.8624 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0087,0.0003,1.0236 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0083,0.0003,0.9209 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0090,0.0003,0.8153 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0085,0.0003,0.8852 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0086,0.0003,0.9345 +Small,4x4,ldr-rgb-00.png,38.2700,0.0234,0.0083,7.8543 +Small,4x4,ldr-rgb-01.png,39.9568,0.0228,0.0070,9.3318 +Small,4x4,ldr-rgb-02.png,35.1963,0.0261,0.0113,5.8054 +Small,4x4,ldr-rgb-03.png,46.0467,0.0164,0.0025,26.0153 +Small,4x4,ldr-rgb-04.png,42.0037,0.0196,0.0048,13.7908 +Small,4x4,ldr-rgb-05.png,37.3577,0.0259,0.0111,5.9181 +Small,4x4,ldr-rgb-06.png,35.3918,0.0248,0.0102,6.4395 +Small,4x4,ldr-rgb-07.png,38.1916,0.0255,0.0117,5.6029 +Small,4x4,ldr-rgb-08.png,43.9030,0.0186,0.0041,16.0279 +Small,4x4,ldr-rgb-09.png,41.9061,0.0192,0.0049,13.4100 +Small,4x4,ldr-rgb-10.png,44.4858,0.0133,0.0011,15.1922 +Small,4x4,ldr-rgba-00.png,35.6075,0.0256,0.0112,5.8614 +Small,4x4,ldr-rgba-01.png,38.8915,0.0215,0.0065,10.0776 +Small,4x4,ldr-rgba-02.png,34.9103,0.0242,0.0094,6.9616 +Small,4x4,ldr-xy-00.png,37.6561,0.0207,0.0044,14.7633 +Small,4x4,ldr-xy-01.png,44.2119,0.0216,0.0054,12.1930 +Small,4x4,ldr-xy-02.png,48.3459,0.0199,0.0033,20.0729 +Small,4x4,ldrs-rgba-00.png,35.6094,0.0262,0.0112,5.8384 +Small,4x4,ldrs-rgba-01.png,38.8931,0.0220,0.0066,9.9130 +Small,4x4,ldrs-rgba-02.png,34.8940,0.0239,0.0095,6.9044 +Small,5x5,hdr-rgb-00.hdr,29.5418,0.1504,0.0125,5.2261 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0089,0.0003,1.0236 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0091,0.0003,0.9240 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0081,0.0003,1.0007 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0090,0.0003,0.8859 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0088,0.0003,0.9411 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0089,0.0003,0.9008 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0090,0.0003,0.8178 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0089,0.0003,0.8590 +Small,5x5,ldr-rgb-00.png,34.4434,0.0232,0.0083,7.8635 +Small,5x5,ldr-rgb-01.png,36.2670,0.0202,0.0055,11.9113 +Small,5x5,ldr-rgb-02.png,31.1094,0.0231,0.0088,7.4187 +Small,5x5,ldr-rgb-03.png,42.8398,0.0167,0.0020,32.8487 +Small,5x5,ldr-rgb-04.png,37.2876,0.0201,0.0046,14.2564 +Small,5x5,ldr-rgb-05.png,33.2882,0.0261,0.0114,5.7705 +Small,5x5,ldr-rgb-06.png,31.1492,0.0242,0.0087,7.5643 +Small,5x5,ldr-rgb-07.png,35.1044,0.0244,0.0092,7.0997 +Small,5x5,ldr-rgb-08.png,40.2560,0.0178,0.0033,19.7996 +Small,5x5,ldr-rgb-09.png,37.2934,0.0192,0.0047,13.8498 +Small,5x5,ldr-rgb-10.png,40.2099,0.0144,0.0010,17.0755 +Small,5x5,ldr-rgba-00.png,32.1563,0.0273,0.0119,5.5003 +Small,5x5,ldr-rgba-01.png,35.2201,0.0212,0.0063,10.3404 +Small,5x5,ldr-rgba-02.png,31.1519,0.0247,0.0092,7.1358 +Small,5x5,ldr-xy-00.png,36.7408,0.0204,0.0036,18.2195 +Small,5x5,ldr-xy-01.png,39.8426,0.0214,0.0046,14.3780 +Small,5x5,ldr-xy-02.png,43.9819,0.0202,0.0032,20.4036 +Small,5x5,ldrs-rgba-00.png,32.1540,0.0270,0.0119,5.5231 +Small,5x5,ldrs-rgba-01.png,35.2189,0.0217,0.0063,10.4124 +Small,5x5,ldrs-rgba-02.png,31.1450,0.0251,0.0093,7.0167 +Small,6x6,hdr-rgb-00.hdr,27.0785,0.1504,0.0129,5.0902 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0093,0.0003,0.8563 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0092,0.0003,0.8859 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0092,0.0003,0.8794 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0090,0.0003,0.9046 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0089,0.0003,0.8918 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0088,0.0003,0.9665 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0088,0.0003,0.9770 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0094,0.0003,0.9378 +Small,6x6,ldr-rgb-00.png,31.7201,0.0258,0.0105,6.2416 +Small,6x6,ldr-rgb-01.png,32.9461,0.0223,0.0070,9.3946 +Small,6x6,ldr-rgb-02.png,27.4945,0.0250,0.0102,6.4422 +Small,6x6,ldr-rgb-03.png,40.6123,0.0165,0.0021,30.7092 +Small,6x6,ldr-rgb-04.png,33.9447,0.0199,0.0057,11.5485 +Small,6x6,ldr-rgb-05.png,29.9962,0.0291,0.0140,4.6936 +Small,6x6,ldr-rgb-06.png,27.5637,0.0261,0.0101,6.4778 +Small,6x6,ldr-rgb-07.png,32.9859,0.0243,0.0095,6.9028 +Small,6x6,ldr-rgb-08.png,37.8899,0.0179,0.0036,18.4556 +Small,6x6,ldr-rgb-09.png,33.4975,0.0210,0.0059,11.0851 +Small,6x6,ldr-rgb-10.png,36.7053,0.0128,0.0011,14.3603 +Small,6x6,ldr-rgba-00.png,29.6096,0.0291,0.0144,4.5366 +Small,6x6,ldr-rgba-01.png,32.1075,0.0227,0.0077,8.5046 +Small,6x6,ldr-rgba-02.png,27.8547,0.0260,0.0109,6.0219 +Small,6x6,ldr-xy-00.png,35.9052,0.0215,0.0040,16.4953 +Small,6x6,ldr-xy-01.png,37.1922,0.0231,0.0059,11.1912 +Small,6x6,ldr-xy-02.png,41.9609,0.0198,0.0031,20.9383 +Small,6x6,ldrs-rgba-00.png,29.6069,0.0302,0.0145,4.5325 +Small,6x6,ldrs-rgba-01.png,32.1031,0.0227,0.0076,8.5870 +Small,6x6,ldrs-rgba-02.png,27.8398,0.0263,0.0110,5.9626 +Small,8x8,hdr-rgb-00.hdr,23.7878,0.1561,0.0168,3.8917 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0087,0.0003,0.8985 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0089,0.0003,0.9553 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0092,0.0003,0.9272 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0090,0.0003,0.9411 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0093,0.0003,0.8772 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0090,0.0003,0.8701 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0092,0.0003,0.8955 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0091,0.0003,0.8889 +Small,8x8,ldr-rgb-00.png,28.0747,0.0276,0.0122,5.3586 +Small,8x8,ldr-rgb-01.png,28.7890,0.0243,0.0095,6.8987 +Small,8x8,ldr-rgb-02.png,23.1132,0.0301,0.0148,4.4428 +Small,8x8,ldr-rgb-03.png,37.3786,0.0176,0.0024,26.8043 +Small,8x8,ldr-rgb-04.png,29.3571,0.0246,0.0088,7.4711 +Small,8x8,ldr-rgb-05.png,25.8131,0.0334,0.0174,3.7625 +Small,8x8,ldr-rgb-06.png,23.1776,0.0308,0.0151,4.3399 +Small,8x8,ldr-rgb-07.png,29.8769,0.0245,0.0099,6.6453 +Small,8x8,ldr-rgb-08.png,34.5214,0.0185,0.0039,16.6210 +Small,8x8,ldr-rgb-09.png,28.6522,0.0232,0.0082,7.9855 +Small,8x8,ldr-rgb-10.png,32.0068,0.0147,0.0015,10.5350 +Small,8x8,ldr-rgba-00.png,25.7092,0.0322,0.0168,3.8926 +Small,8x8,ldr-rgba-01.png,28.3054,0.0264,0.0112,5.8347 +Small,8x8,ldr-rgba-02.png,23.9438,0.0319,0.0162,4.0514 +Small,8x8,ldr-xy-00.png,33.3643,0.0232,0.0055,11.9243 +Small,8x8,ldr-xy-01.png,34.3964,0.0245,0.0067,9.8445 +Small,8x8,ldr-xy-02.png,39.8866,0.0197,0.0020,32.2022 +Small,8x8,ldrs-rgba-00.png,25.7053,0.0325,0.0169,3.8882 +Small,8x8,ldrs-rgba-01.png,28.2955,0.0262,0.0112,5.8493 +Small,8x8,ldrs-rgba-02.png,23.9365,0.0315,0.0162,4.0485 +Small,12x12,hdr-rgb-00.hdr,20.5371,0.1659,0.0256,2.5629 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0114,0.0003,0.7878 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0107,0.0003,0.9485 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0106,0.0003,0.8253 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0115,0.0003,0.9209 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0104,0.0003,0.9209 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0109,0.0003,0.9656 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0107,0.0003,0.9169 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0118,0.0003,0.7901 +Small,12x12,ldr-rgb-00.png,23.8044,0.0274,0.0106,6.1542 +Small,12x12,ldr-rgb-01.png,24.7859,0.0240,0.0077,8.5189 +Small,12x12,ldr-rgb-02.png,19.2338,0.0352,0.0176,3.7293 +Small,12x12,ldr-rgb-03.png,33.2733,0.0184,0.0017,39.5508 +Small,12x12,ldr-rgb-04.png,24.5789,0.0239,0.0073,8.9420 +Small,12x12,ldr-rgb-05.png,21.4954,0.0335,0.0153,4.2792 +Small,12x12,ldr-rgb-06.png,19.2327,0.0347,0.0185,3.5499 +Small,12x12,ldr-rgb-07.png,25.4006,0.0237,0.0074,8.8516 +Small,12x12,ldr-rgb-08.png,30.3089,0.0199,0.0031,21.3813 +Small,12x12,ldr-rgb-09.png,23.7455,0.0270,0.0097,6.7807 +Small,12x12,ldr-rgb-10.png,27.3338,0.0174,0.0023,7.1801 +Small,12x12,ldr-rgba-00.png,21.6156,0.0351,0.0173,3.7917 +Small,12x12,ldr-rgba-01.png,24.5339,0.0263,0.0094,6.9808 +Small,12x12,ldr-rgba-02.png,20.1778,0.0379,0.0208,3.1573 +Small,12x12,ldr-xy-00.png,29.2438,0.0255,0.0058,11.3958 +Small,12x12,ldr-xy-01.png,30.5551,0.0252,0.0050,13.0422 +Small,12x12,ldr-xy-02.png,37.9965,0.0222,0.0009,70.9362 +Small,12x12,ldrs-rgba-00.png,21.6151,0.0334,0.0171,3.8305 +Small,12x12,ldrs-rgba-01.png,24.5310,0.0272,0.0093,7.0251 +Small,12x12,ldrs-rgba-02.png,20.1749,0.0385,0.0207,3.1620 +Small,3x3x3,ldr-l-00-3.dds,50.2752,0.0221,0.0088,29.8496 +Small,3x3x3,ldr-l-01-3.dds,51.8763,0.0138,0.0036,19.1771 +Small,6x6x6,ldr-l-00-3.dds,32.5486,0.0661,0.0509,5.1451 +Small,6x6x6,ldr-l-01-3.dds,40.8686,0.0317,0.0193,3.5679 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse4.1_fastest_results.csv new file mode 100644 index 0000000..102a4b3 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse4.1_fastest_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.3455,0.1415,0.0076,8.6163 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0079,0.0003,0.9240 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0082,0.0003,0.9313 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0083,0.0003,0.8508 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0082,0.0003,0.9272 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0083,0.0003,0.9177 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0081,0.0003,0.9378 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0086,0.0003,0.9378 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0083,0.0003,0.8618 +Small,4x4,ldr-rgb-00.png,37.2582,0.0194,0.0046,14.1792 +Small,4x4,ldr-rgb-01.png,39.5673,0.0188,0.0042,15.5333 +Small,4x4,ldr-rgb-02.png,34.8275,0.0207,0.0059,11.0216 +Small,4x4,ldr-rgb-03.png,45.4522,0.0156,0.0018,36.1681 +Small,4x4,ldr-rgb-04.png,41.7305,0.0176,0.0031,21.0796 +Small,4x4,ldr-rgb-05.png,36.8931,0.0210,0.0063,10.3876 +Small,4x4,ldr-rgb-06.png,35.0002,0.0193,0.0056,11.6820 +Small,4x4,ldr-rgb-07.png,37.4123,0.0199,0.0061,10.7719 +Small,4x4,ldr-rgb-08.png,43.0339,0.0168,0.0025,26.3091 +Small,4x4,ldr-rgb-09.png,41.7131,0.0175,0.0032,20.5179 +Small,4x4,ldr-rgb-10.png,43.9533,0.0129,0.0008,20.3409 +Small,4x4,ldr-rgba-00.png,34.7402,0.0212,0.0062,10.6044 +Small,4x4,ldr-rgba-01.png,38.6972,0.0189,0.0045,14.6844 +Small,4x4,ldr-rgba-02.png,34.6012,0.0205,0.0064,10.2589 +Small,4x4,ldr-xy-00.png,37.6163,0.0193,0.0031,20.9590 +Small,4x4,ldr-xy-01.png,43.9354,0.0201,0.0038,17.1874 +Small,4x4,ldr-xy-02.png,48.3675,0.0188,0.0026,25.1489 +Small,4x4,ldrs-rgba-00.png,34.7410,0.0208,0.0062,10.5877 +Small,4x4,ldrs-rgba-01.png,38.6988,0.0195,0.0045,14.5600 +Small,4x4,ldrs-rgba-02.png,34.5841,0.0217,0.0064,10.2689 +Small,5x5,hdr-rgb-00.hdr,28.8645,0.1398,0.0073,9.0136 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0078,0.0003,0.9553 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0085,0.0003,0.9553 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0084,0.0003,0.8529 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0086,0.0003,0.9378 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0089,0.0003,1.0035 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0089,0.0003,0.9477 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0086,0.0003,0.8253 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0087,0.0003,0.7642 +Small,5x5,ldr-rgb-00.png,33.7346,0.0190,0.0048,13.7970 +Small,5x5,ldr-rgb-01.png,36.0898,0.0182,0.0039,16.9521 +Small,5x5,ldr-rgb-02.png,31.0129,0.0210,0.0063,10.4723 +Small,5x5,ldr-rgb-03.png,42.4476,0.0153,0.0016,41.7684 +Small,5x5,ldr-rgb-04.png,37.0450,0.0176,0.0035,18.6928 +Small,5x5,ldr-rgb-05.png,32.9822,0.0218,0.0070,9.2971 +Small,5x5,ldr-rgb-06.png,31.0536,0.0184,0.0061,10.8075 +Small,5x5,ldr-rgb-07.png,34.4588,0.0202,0.0059,11.1305 +Small,5x5,ldr-rgb-08.png,39.6603,0.0161,0.0023,28.7559 +Small,5x5,ldr-rgb-09.png,37.0769,0.0180,0.0035,18.8531 +Small,5x5,ldr-rgb-10.png,39.9359,0.0127,0.0008,20.0714 +Small,5x5,ldr-rgba-00.png,31.1232,0.0216,0.0066,9.9662 +Small,5x5,ldr-rgba-01.png,35.0597,0.0192,0.0046,14.3562 +Small,5x5,ldr-rgba-02.png,31.0601,0.0221,0.0068,9.7079 +Small,5x5,ldr-xy-00.png,36.6317,0.0195,0.0028,23.6089 +Small,5x5,ldr-xy-01.png,39.3017,0.0201,0.0033,19.9563 +Small,5x5,ldr-xy-02.png,43.8850,0.0189,0.0026,25.4305 +Small,5x5,ldrs-rgba-00.png,31.1191,0.0211,0.0066,9.9767 +Small,5x5,ldrs-rgba-01.png,35.0595,0.0193,0.0046,14.1851 +Small,5x5,ldrs-rgba-02.png,31.0449,0.0220,0.0068,9.6094 +Small,6x6,hdr-rgb-00.hdr,26.7568,0.1411,0.0069,9.4580 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0087,0.0003,0.9084 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0089,0.0003,0.9924 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0087,0.0003,0.9519 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0087,0.0003,0.9419 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0086,0.0003,0.9444 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0088,0.0003,0.9015 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0090,0.0003,0.8801 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0084,0.0003,0.8765 +Small,6x6,ldr-rgb-00.png,31.3522,0.0206,0.0056,11.7299 +Small,6x6,ldr-rgb-01.png,32.8566,0.0193,0.0047,13.9256 +Small,6x6,ldr-rgb-02.png,27.4076,0.0215,0.0072,9.1647 +Small,6x6,ldr-rgb-03.png,40.3684,0.0151,0.0015,43.3698 +Small,6x6,ldr-rgb-04.png,33.7717,0.0195,0.0043,15.4201 +Small,6x6,ldr-rgb-05.png,29.7603,0.0225,0.0083,7.8694 +Small,6x6,ldr-rgb-06.png,27.4861,0.0228,0.0072,9.0495 +Small,6x6,ldr-rgb-07.png,32.3756,0.0205,0.0059,11.0869 +Small,6x6,ldr-rgb-08.png,37.5033,0.0169,0.0023,28.3350 +Small,6x6,ldr-rgb-09.png,33.3194,0.0189,0.0041,15.9999 +Small,6x6,ldr-rgb-10.png,36.5829,0.0130,0.0009,17.3096 +Small,6x6,ldr-rgba-00.png,28.8481,0.0216,0.0072,9.0746 +Small,6x6,ldr-rgba-01.png,32.0167,0.0202,0.0053,12.4166 +Small,6x6,ldr-rgba-02.png,27.7951,0.0217,0.0073,9.0370 +Small,6x6,ldr-xy-00.png,35.6742,0.0195,0.0029,22.6386 +Small,6x6,ldr-xy-01.png,36.5951,0.0203,0.0038,17.0795 +Small,6x6,ldr-xy-02.png,41.8228,0.0186,0.0024,27.1699 +Small,6x6,ldrs-rgba-00.png,28.8448,0.0217,0.0072,9.0971 +Small,6x6,ldrs-rgba-01.png,32.0125,0.0199,0.0054,12.2429 +Small,6x6,ldrs-rgba-02.png,27.7831,0.0218,0.0073,9.0382 +Small,8x8,hdr-rgb-00.hdr,23.6169,0.1461,0.0112,5.8525 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0090,0.0003,0.8178 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0092,0.0003,0.9146 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0092,0.0003,0.9587 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0092,0.0003,0.8859 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0095,0.0003,0.8311 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0089,0.0003,0.9770 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0088,0.0003,0.8285 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0094,0.0003,0.8563 +Small,8x8,ldr-rgb-00.png,27.7216,0.0233,0.0085,7.6947 +Small,8x8,ldr-rgb-01.png,28.7030,0.0213,0.0069,9.4418 +Small,8x8,ldr-rgb-02.png,23.0366,0.0250,0.0107,6.1374 +Small,8x8,ldr-rgb-03.png,37.0954,0.0165,0.0018,35.5967 +Small,8x8,ldr-rgb-04.png,29.1352,0.0230,0.0066,9.9059 +Small,8x8,ldr-rgb-05.png,25.6104,0.0272,0.0123,5.3272 +Small,8x8,ldr-rgb-06.png,23.0940,0.0268,0.0110,5.9703 +Small,8x8,ldr-rgb-07.png,29.5040,0.0218,0.0068,9.5953 +Small,8x8,ldr-rgb-08.png,33.9884,0.0174,0.0028,23.0990 +Small,8x8,ldr-rgb-09.png,28.4595,0.0209,0.0061,10.7454 +Small,8x8,ldr-rgb-10.png,31.9190,0.0140,0.0011,14.6189 +Small,8x8,ldr-rgba-00.png,25.3524,0.0270,0.0111,5.8978 +Small,8x8,ldr-rgba-01.png,28.2082,0.0230,0.0079,8.2934 +Small,8x8,ldr-rgba-02.png,23.8815,0.0267,0.0109,6.0009 +Small,8x8,ldr-xy-00.png,33.2419,0.0220,0.0042,15.5184 +Small,8x8,ldr-xy-01.png,34.1451,0.0225,0.0048,13.6024 +Small,8x8,ldr-xy-02.png,39.7693,0.0194,0.0018,37.2161 +Small,8x8,ldrs-rgba-00.png,25.3487,0.0264,0.0113,5.8094 +Small,8x8,ldrs-rgba-01.png,28.1979,0.0240,0.0079,8.3030 +Small,8x8,ldrs-rgba-02.png,23.8757,0.0264,0.0109,6.0092 +Small,12x12,hdr-rgb-00.hdr,20.4537,0.1569,0.0175,3.7438 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0103,0.0003,0.8228 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0102,0.0003,0.9444 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0100,0.0003,0.8475 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0106,0.0003,0.8369 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0100,0.0003,0.8337 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0104,0.0003,1.0073 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0101,0.0003,0.9280 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0103,0.0002,1.1583 +Small,12x12,ldr-rgb-00.png,23.7273,0.0249,0.0076,8.6720 +Small,12x12,ldr-rgb-01.png,24.7394,0.0222,0.0056,11.7259 +Small,12x12,ldr-rgb-02.png,19.1996,0.0295,0.0123,5.3408 +Small,12x12,ldr-rgb-03.png,33.1771,0.0169,0.0014,47.1812 +Small,12x12,ldr-rgb-04.png,24.3899,0.0218,0.0054,12.1520 +Small,12x12,ldr-rgb-05.png,21.3900,0.0273,0.0110,5.9513 +Small,12x12,ldr-rgb-06.png,19.1751,0.0296,0.0129,5.0819 +Small,12x12,ldr-rgb-07.png,25.3358,0.0213,0.0053,12.4188 +Small,12x12,ldr-rgb-08.png,30.1393,0.0182,0.0023,28.7079 +Small,12x12,ldr-rgb-09.png,23.6063,0.0246,0.0071,9.1660 +Small,12x12,ldr-rgb-10.png,27.2944,0.0167,0.0016,9.8687 +Small,12x12,ldr-rgba-00.png,21.3688,0.0291,0.0117,5.6167 +Small,12x12,ldr-rgba-01.png,24.4942,0.0227,0.0068,9.7061 +Small,12x12,ldr-rgba-02.png,20.1436,0.0322,0.0145,4.5138 +Small,12x12,ldr-xy-00.png,28.8952,0.0243,0.0042,15.5044 +Small,12x12,ldr-xy-01.png,29.6655,0.0261,0.0038,17.2283 +Small,12x12,ldr-xy-02.png,37.9744,0.0227,0.0009,75.4952 +Small,12x12,ldrs-rgba-00.png,21.3639,0.0291,0.0118,5.5699 +Small,12x12,ldrs-rgba-01.png,24.4913,0.0237,0.0067,9.7947 +Small,12x12,ldrs-rgba-02.png,20.1416,0.0324,0.0145,4.5119 +Small,3x3x3,ldr-l-00-3.dds,50.1569,0.0215,0.0085,30.9347 +Small,3x3x3,ldr-l-01-3.dds,51.8557,0.0128,0.0035,19.4795 +Small,6x6x6,ldr-l-00-3.dds,32.5328,0.0672,0.0508,5.1608 +Small,6x6x6,ldr-l-01-3.dds,40.8686,0.0312,0.0193,3.5710 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse4.1_medium_results.csv new file mode 100644 index 0000000..96abfb7 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse4.1_medium_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1462,0.1550,0.0202,3.2452 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0094,0.0003,0.8178 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0088,0.0003,0.9553 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0089,0.0003,0.8823 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0091,0.0003,0.9735 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0089,0.0003,0.9700 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0093,0.0003,0.8673 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0091,0.0003,0.9452 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0091,0.0003,0.9209 +Small,4x4,ldr-rgb-00.png,38.8542,0.0370,0.0222,2.9454 +Small,4x4,ldr-rgb-01.png,40.2577,0.0336,0.0190,3.4424 +Small,4x4,ldr-rgb-02.png,35.3269,0.0347,0.0189,3.4642 +Small,4x4,ldr-rgb-03.png,47.3379,0.0277,0.0124,5.2792 +Small,4x4,ldr-rgb-04.png,42.2428,0.0294,0.0151,4.3430 +Small,4x4,ldr-rgb-05.png,37.8423,0.0366,0.0209,3.1306 +Small,4x4,ldr-rgb-06.png,35.5075,0.0319,0.0166,3.9465 +Small,4x4,ldr-rgb-07.png,39.3480,0.0421,0.0275,2.3858 +Small,4x4,ldr-rgb-08.png,45.3018,0.0286,0.0144,4.5476 +Small,4x4,ldr-rgb-09.png,42.1528,0.0316,0.0165,3.9659 +Small,4x4,ldr-rgb-10.png,44.9871,0.0149,0.0023,7.1991 +Small,4x4,ldr-rgba-00.png,36.2694,0.0407,0.0250,2.6245 +Small,4x4,ldr-rgba-01.png,38.9985,0.0286,0.0141,4.6345 +Small,4x4,ldr-rgba-02.png,34.9757,0.0307,0.0158,4.1554 +Small,4x4,ldr-xy-00.png,37.8045,0.0291,0.0132,4.9765 +Small,4x4,ldr-xy-01.png,45.2632,0.0371,0.0199,3.2923 +Small,4x4,ldr-xy-02.png,51.3220,0.0410,0.0245,2.6770 +Small,4x4,ldrs-rgba-00.png,36.2680,0.0404,0.0249,2.6302 +Small,4x4,ldrs-rgba-01.png,39.0001,0.0294,0.0141,4.6602 +Small,4x4,ldrs-rgba-02.png,34.9625,0.0308,0.0157,4.1793 +Small,5x5,hdr-rgb-00.hdr,29.9041,0.1549,0.0214,3.0610 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0088,0.0003,0.9621 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0090,0.0003,0.7686 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0090,0.0003,0.8422 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0092,0.0003,0.9240 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0095,0.0003,0.9240 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0096,0.0003,0.8737 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0088,0.0003,0.9209 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0091,0.0003,0.9337 +Small,5x5,ldr-rgb-00.png,35.1529,0.0374,0.0226,2.9031 +Small,5x5,ldr-rgb-01.png,36.4665,0.0316,0.0164,3.9974 +Small,5x5,ldr-rgb-02.png,31.1516,0.0316,0.0165,3.9811 +Small,5x5,ldr-rgb-03.png,44.0943,0.0215,0.0070,9.3943 +Small,5x5,ldr-rgb-04.png,37.6982,0.0297,0.0149,4.3884 +Small,5x5,ldr-rgb-05.png,33.5609,0.0386,0.0236,2.7737 +Small,5x5,ldr-rgb-06.png,31.1959,0.0305,0.0158,4.1571 +Small,5x5,ldr-rgb-07.png,36.2015,0.0424,0.0279,2.3525 +Small,5x5,ldr-rgb-08.png,41.7238,0.0259,0.0118,5.5380 +Small,5x5,ldr-rgb-09.png,37.5901,0.0281,0.0139,4.7247 +Small,5x5,ldr-rgb-10.png,40.6034,0.0151,0.0023,7.1366 +Small,5x5,ldr-rgba-00.png,32.8000,0.0421,0.0277,2.3660 +Small,5x5,ldr-rgba-01.png,35.3406,0.0305,0.0156,4.2088 +Small,5x5,ldr-rgba-02.png,31.1660,0.0325,0.0175,3.7359 +Small,5x5,ldr-xy-00.png,37.0972,0.0289,0.0126,5.2034 +Small,5x5,ldr-xy-01.png,40.7204,0.0352,0.0181,3.6302 +Small,5x5,ldr-xy-02.png,49.2422,0.0306,0.0142,4.6009 +Small,5x5,ldrs-rgba-00.png,32.7983,0.0429,0.0276,2.3718 +Small,5x5,ldrs-rgba-01.png,35.3390,0.0302,0.0155,4.2279 +Small,5x5,ldrs-rgba-02.png,31.1587,0.0330,0.0176,3.7232 +Small,6x6,hdr-rgb-00.hdr,27.5191,0.1575,0.0230,2.8539 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0089,0.0003,0.8362 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0091,0.0002,1.0285 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0093,0.0003,0.9485 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0091,0.0003,0.8859 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0091,0.0003,0.8985 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0093,0.0003,0.9553 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0089,0.0003,0.8918 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0085,0.0003,0.8859 +Small,6x6,ldr-rgb-00.png,32.4060,0.0404,0.0246,2.6628 +Small,6x6,ldr-rgb-01.png,33.1131,0.0318,0.0168,3.8991 +Small,6x6,ldr-rgb-02.png,27.5242,0.0323,0.0179,3.6576 +Small,6x6,ldr-rgb-03.png,41.7488,0.0200,0.0053,12.3746 +Small,6x6,ldr-rgb-04.png,34.2222,0.0293,0.0145,4.5089 +Small,6x6,ldr-rgb-05.png,30.1609,0.0414,0.0254,2.5846 +Small,6x6,ldr-rgb-06.png,27.5925,0.0334,0.0176,3.7211 +Small,6x6,ldr-rgb-07.png,33.9274,0.0421,0.0278,2.3575 +Small,6x6,ldr-rgb-08.png,39.2801,0.0244,0.0091,7.1867 +Small,6x6,ldr-rgb-09.png,33.6765,0.0286,0.0140,4.6801 +Small,6x6,ldr-rgb-10.png,37.0112,0.0153,0.0026,6.3373 +Small,6x6,ldr-rgba-00.png,30.2369,0.0468,0.0318,2.0602 +Small,6x6,ldr-rgba-01.png,32.2229,0.0314,0.0167,3.9187 +Small,6x6,ldr-rgba-02.png,27.8684,0.0346,0.0200,3.2768 +Small,6x6,ldr-xy-00.png,36.2311,0.0286,0.0110,5.9368 +Small,6x6,ldr-xy-01.png,38.0476,0.0313,0.0138,4.7517 +Small,6x6,ldr-xy-02.png,46.2056,0.0274,0.0101,6.4854 +Small,6x6,ldrs-rgba-00.png,30.2315,0.0470,0.0320,2.0481 +Small,6x6,ldrs-rgba-01.png,32.2177,0.0317,0.0166,3.9508 +Small,6x6,ldrs-rgba-02.png,27.8515,0.0354,0.0198,3.3112 +Small,8x8,hdr-rgb-00.hdr,24.1401,0.1702,0.0310,2.1130 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0101,0.0003,0.8563 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0108,0.0003,0.8055 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0106,0.0003,0.8203 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0099,0.0003,0.8475 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0098,0.0003,0.8590 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0103,0.0003,0.8823 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0090,0.0003,0.9378 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0099,0.0003,0.8311 +Small,8x8,ldr-rgb-00.png,28.7679,0.0511,0.0351,1.8671 +Small,8x8,ldr-rgb-01.png,28.9616,0.0387,0.0229,2.8628 +Small,8x8,ldr-rgb-02.png,23.1756,0.0404,0.0246,2.6603 +Small,8x8,ldr-rgb-03.png,38.6059,0.0222,0.0068,9.7048 +Small,8x8,ldr-rgb-04.png,29.6621,0.0386,0.0227,2.8860 +Small,8x8,ldr-rgb-05.png,25.9492,0.0503,0.0340,1.9271 +Small,8x8,ldr-rgb-06.png,23.2148,0.0413,0.0252,2.5968 +Small,8x8,ldr-rgb-07.png,30.7938,0.0511,0.0357,1.8356 +Small,8x8,ldr-rgb-08.png,35.9674,0.0274,0.0121,5.4073 +Small,8x8,ldr-rgb-09.png,28.9937,0.0357,0.0200,3.2829 +Small,8x8,ldr-rgb-10.png,32.1931,0.0183,0.0036,4.5169 +Small,8x8,ldr-rgba-00.png,26.4788,0.0588,0.0428,1.5310 +Small,8x8,ldr-rgba-01.png,28.3965,0.0387,0.0228,2.8727 +Small,8x8,ldr-rgba-02.png,23.9517,0.0429,0.0270,2.4271 +Small,8x8,ldr-xy-00.png,34.0124,0.0344,0.0159,4.1251 +Small,8x8,ldr-xy-01.png,35.0062,0.0345,0.0161,4.0696 +Small,8x8,ldr-xy-02.png,41.7281,0.0293,0.0107,6.1038 +Small,8x8,ldrs-rgba-00.png,26.4777,0.0588,0.0426,1.5381 +Small,8x8,ldrs-rgba-01.png,28.3866,0.0391,0.0229,2.8646 +Small,8x8,ldrs-rgba-02.png,23.9442,0.0428,0.0268,2.4457 +Small,12x12,hdr-rgb-00.hdr,20.7667,0.1905,0.0468,1.3990 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0143,0.0003,0.9076 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0132,0.0003,0.8955 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0131,0.0003,0.8978 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0134,0.0003,0.7781 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0135,0.0003,0.8673 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0127,0.0003,0.8311 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0136,0.0003,0.9272 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0126,0.0003,0.8955 +Small,12x12,ldr-rgb-00.png,24.6963,0.0607,0.0427,1.5355 +Small,12x12,ldr-rgb-01.png,25.0511,0.0468,0.0298,2.1971 +Small,12x12,ldr-rgb-02.png,19.2753,0.0535,0.0363,1.8074 +Small,12x12,ldr-rgb-03.png,35.0157,0.0247,0.0075,8.7009 +Small,12x12,ldr-rgb-04.png,24.9056,0.0470,0.0283,2.3118 +Small,12x12,ldr-rgb-05.png,21.6572,0.0611,0.0436,1.5015 +Small,12x12,ldr-rgb-06.png,19.2621,0.0548,0.0377,1.7390 +Small,12x12,ldr-rgb-07.png,26.7652,0.0559,0.0389,1.6849 +Small,12x12,ldr-rgb-08.png,31.7024,0.0303,0.0128,5.1192 +Small,12x12,ldr-rgb-09.png,24.1625,0.0446,0.0269,2.4361 +Small,12x12,ldr-rgb-10.png,28.0564,0.0253,0.0081,2.0074 +Small,12x12,ldr-rgba-00.png,22.2658,0.0665,0.0486,1.3472 +Small,12x12,ldr-rgba-01.png,24.6578,0.0458,0.0284,2.3061 +Small,12x12,ldr-rgba-02.png,20.1912,0.0586,0.0409,1.6020 +Small,12x12,ldr-xy-00.png,30.2800,0.0397,0.0190,3.4487 +Small,12x12,ldr-xy-01.png,31.8596,0.0414,0.0204,3.2160 +Small,12x12,ldr-xy-02.png,38.5099,0.0267,0.0041,15.9147 +Small,12x12,ldrs-rgba-00.png,22.2653,0.0662,0.0489,1.3411 +Small,12x12,ldrs-rgba-01.png,24.6575,0.0463,0.0289,2.2705 +Small,12x12,ldrs-rgba-02.png,20.1877,0.0573,0.0398,1.6463 +Small,3x3x3,ldr-l-00-3.dds,51.2242,0.0256,0.0122,21.4313 +Small,3x3x3,ldr-l-01-3.dds,52.5323,0.0137,0.0038,18.2083 +Small,6x6x6,ldr-l-00-3.dds,32.9798,0.0775,0.0607,4.3179 +Small,6x6x6,ldr-l-01-3.dds,40.9689,0.0328,0.0193,3.5695 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse4.1_thorough_results.csv new file mode 100644 index 0000000..f60d01b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-4.8-sse4.1_thorough_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.4205,0.1724,0.0399,1.6428 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0086,0.0003,0.9411 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0091,0.0003,0.8343 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0092,0.0003,0.9015 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0090,0.0003,0.8708 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0093,0.0003,0.8475 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0087,0.0003,0.8001 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0090,0.0003,0.9240 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0089,0.0003,0.9272 +Small,4x4,ldr-rgb-00.png,39.1774,0.0612,0.0463,1.4169 +Small,4x4,ldr-rgb-01.png,40.4449,0.0586,0.0439,1.4920 +Small,4x4,ldr-rgb-02.png,35.5044,0.0527,0.0404,1.6233 +Small,4x4,ldr-rgb-03.png,47.8124,0.0560,0.0416,1.5737 +Small,4x4,ldr-rgb-04.png,42.3889,0.0514,0.0367,1.7853 +Small,4x4,ldr-rgb-05.png,38.0196,0.0596,0.0446,1.4686 +Small,4x4,ldr-rgb-06.png,35.6706,0.0504,0.0357,1.8374 +Small,4x4,ldr-rgb-07.png,39.9554,0.0696,0.0552,1.1868 +Small,4x4,ldr-rgb-08.png,45.9894,0.0540,0.0395,1.6580 +Small,4x4,ldr-rgb-09.png,42.2994,0.0548,0.0399,1.6406 +Small,4x4,ldr-rgb-10.png,45.2039,0.0173,0.0049,3.3284 +Small,4x4,ldr-rgba-00.png,36.7547,0.0634,0.0486,1.3481 +Small,4x4,ldr-rgba-01.png,39.1435,0.0486,0.0338,1.9361 +Small,4x4,ldr-rgba-02.png,35.0657,0.0483,0.0333,1.9701 +Small,4x4,ldr-xy-00.png,37.7734,0.0561,0.0395,1.6587 +Small,4x4,ldr-xy-01.png,45.4427,0.0607,0.0446,1.4704 +Small,4x4,ldr-xy-02.png,51.3374,0.0775,0.0610,1.0740 +Small,4x4,ldrs-rgba-00.png,36.7550,0.0636,0.0487,1.3463 +Small,4x4,ldrs-rgba-01.png,39.1433,0.0487,0.0339,1.9315 +Small,4x4,ldrs-rgba-02.png,35.0530,0.0482,0.0334,1.9649 +Small,5x5,hdr-rgb-00.hdr,30.2973,0.1799,0.0437,1.4987 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0098,0.0003,0.8001 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0094,0.0003,0.9700 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0097,0.0003,0.8448 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0100,0.0003,0.9519 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0095,0.0003,0.9477 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0094,0.0003,0.9960 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0095,0.0003,0.8680 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0095,0.0003,0.9511 +Small,5x5,ldr-rgb-00.png,35.3997,0.0683,0.0528,1.2414 +Small,5x5,ldr-rgb-01.png,36.5650,0.0603,0.0457,1.4347 +Small,5x5,ldr-rgb-02.png,31.2263,0.0535,0.0385,1.7040 +Small,5x5,ldr-rgb-03.png,44.6479,0.0616,0.0468,1.4007 +Small,5x5,ldr-rgb-04.png,37.8497,0.0556,0.0406,1.6122 +Small,5x5,ldr-rgb-05.png,33.7130,0.0675,0.0524,1.2498 +Small,5x5,ldr-rgb-06.png,31.2577,0.0514,0.0360,1.8185 +Small,5x5,ldr-rgb-07.png,36.7807,0.0805,0.0654,1.0020 +Small,5x5,ldr-rgb-08.png,42.4775,0.0635,0.0475,1.3793 +Small,5x5,ldr-rgb-09.png,37.7193,0.0628,0.0475,1.3803 +Small,5x5,ldr-rgb-10.png,40.7723,0.0189,0.0057,2.8599 +Small,5x5,ldr-rgba-00.png,33.1334,0.0732,0.0579,1.1322 +Small,5x5,ldr-rgba-01.png,35.4400,0.0526,0.0380,1.7229 +Small,5x5,ldr-rgba-02.png,31.2027,0.0523,0.0369,1.7751 +Small,5x5,ldr-xy-00.png,37.1948,0.0634,0.0469,1.3973 +Small,5x5,ldr-xy-01.png,41.4468,0.0738,0.0573,1.1430 +Small,5x5,ldr-xy-02.png,49.4347,0.0855,0.0686,0.9549 +Small,5x5,ldrs-rgba-00.png,33.1290,0.0733,0.0579,1.1317 +Small,5x5,ldrs-rgba-01.png,35.4379,0.0537,0.0384,1.7081 +Small,5x5,ldrs-rgba-02.png,31.1988,0.0525,0.0370,1.7697 +Small,6x6,hdr-rgb-00.hdr,27.7236,0.1824,0.0476,1.3760 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0099,0.0003,0.8652 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0099,0.0003,0.9411 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0097,0.0003,0.9138 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0096,0.0003,0.8978 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0095,0.0003,0.9444 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0097,0.0003,0.9587 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0095,0.0003,0.9842 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0094,0.0003,0.8708 +Small,6x6,ldr-rgb-00.png,32.6611,0.0747,0.0589,1.1122 +Small,6x6,ldr-rgb-01.png,33.2151,0.0649,0.0499,1.3142 +Small,6x6,ldr-rgb-02.png,27.5730,0.0575,0.0418,1.5669 +Small,6x6,ldr-rgb-03.png,42.6044,0.0568,0.0418,1.5685 +Small,6x6,ldr-rgb-04.png,34.3610,0.0585,0.0432,1.5181 +Small,6x6,ldr-rgb-05.png,30.3091,0.0717,0.0562,1.1660 +Small,6x6,ldr-rgb-06.png,27.6509,0.0556,0.0402,1.6322 +Small,6x6,ldr-rgb-07.png,34.4860,0.0840,0.0712,0.9203 +Small,6x6,ldr-rgb-08.png,40.0928,0.0547,0.0396,1.6564 +Small,6x6,ldr-rgb-09.png,33.8320,0.0631,0.0481,1.3622 +Small,6x6,ldr-rgb-10.png,37.2019,0.0201,0.0069,2.3407 +Small,6x6,ldr-rgba-00.png,30.5217,0.0818,0.0661,0.9916 +Small,6x6,ldr-rgba-01.png,32.2966,0.0596,0.0442,1.4831 +Small,6x6,ldr-rgba-02.png,27.9025,0.0570,0.0413,1.5883 +Small,6x6,ldr-xy-00.png,36.3131,0.0578,0.0405,1.6162 +Small,6x6,ldr-xy-01.png,38.0748,0.0741,0.0566,1.1571 +Small,6x6,ldr-xy-02.png,47.6588,0.0917,0.0746,0.8779 +Small,6x6,ldrs-rgba-00.png,30.5178,0.0814,0.0660,0.9929 +Small,6x6,ldrs-rgba-01.png,32.2891,0.0598,0.0444,1.4759 +Small,6x6,ldrs-rgba-02.png,27.8879,0.0574,0.0418,1.5679 +Small,8x8,hdr-rgb-00.hdr,24.3456,0.1912,0.0655,1.0003 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0116,0.0003,0.8234 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0118,0.0003,0.7803 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0120,0.0003,0.8737 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0127,0.0003,0.8362 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0128,0.0003,0.9046 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0124,0.0003,0.8502 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0116,0.0003,0.8475 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0126,0.0003,0.8422 +Small,8x8,ldr-rgb-00.png,28.9872,0.0960,0.0795,0.8240 +Small,8x8,ldr-rgb-01.png,29.0418,0.0811,0.0649,1.0102 +Small,8x8,ldr-rgb-02.png,23.2150,0.0755,0.0592,1.1075 +Small,8x8,ldr-rgb-03.png,39.4501,0.0418,0.0260,2.5236 +Small,8x8,ldr-rgb-04.png,29.7910,0.0735,0.0572,1.1452 +Small,8x8,ldr-rgb-05.png,26.0513,0.0879,0.0714,0.9185 +Small,8x8,ldr-rgb-06.png,23.2667,0.0737,0.0574,1.1419 +Small,8x8,ldr-rgb-07.png,31.2555,0.1062,0.0901,0.7277 +Small,8x8,ldr-rgb-08.png,36.6163,0.0578,0.0418,1.5666 +Small,8x8,ldr-rgb-09.png,29.1587,0.0651,0.0490,1.3382 +Small,8x8,ldr-rgb-10.png,32.3435,0.0242,0.0096,1.6988 +Small,8x8,ldr-rgba-00.png,26.7519,0.1049,0.0886,0.7393 +Small,8x8,ldr-rgba-01.png,28.4593,0.0779,0.0614,1.0679 +Small,8x8,ldr-rgba-02.png,23.9778,0.0728,0.0560,1.1711 +Small,8x8,ldr-xy-00.png,34.2195,0.0664,0.0480,1.3649 +Small,8x8,ldr-xy-01.png,35.3357,0.0684,0.0506,1.2960 +Small,8x8,ldr-xy-02.png,44.6504,0.0828,0.0648,1.0107 +Small,8x8,ldrs-rgba-00.png,26.7482,0.1051,0.0889,0.7373 +Small,8x8,ldrs-rgba-01.png,28.4511,0.0781,0.0616,1.0636 +Small,8x8,ldrs-rgba-02.png,23.9705,0.0728,0.0561,1.1684 +Small,12x12,hdr-rgb-00.hdr,21.0293,0.2403,0.1001,0.6545 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0151,0.0003,0.8369 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0157,0.0003,0.9887 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0154,0.0003,0.8098 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0147,0.0003,0.8652 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0154,0.0003,0.7621 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0150,0.0003,0.8680 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0151,0.0003,0.9735 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0153,0.0004,0.7294 +Small,12x12,ldr-rgb-00.png,25.0590,0.1255,0.1064,0.6158 +Small,12x12,ldr-rgb-01.png,25.1523,0.1034,0.0847,0.7740 +Small,12x12,ldr-rgb-02.png,19.2946,0.1137,0.0949,0.6907 +Small,12x12,ldr-rgb-03.png,36.1989,0.0463,0.0277,2.3668 +Small,12x12,ldr-rgb-04.png,25.0024,0.0942,0.0753,0.8703 +Small,12x12,ldr-rgb-05.png,21.7425,0.1140,0.0950,0.6901 +Small,12x12,ldr-rgb-06.png,19.3024,0.1085,0.0918,0.7137 +Small,12x12,ldr-rgb-07.png,27.1383,0.1295,0.1107,0.5920 +Small,12x12,ldr-rgb-08.png,32.5503,0.0564,0.0383,1.7131 +Small,12x12,ldr-rgb-09.png,24.3118,0.0891,0.0700,0.9358 +Small,12x12,ldr-rgb-10.png,28.1897,0.0348,0.0173,0.9417 +Small,12x12,ldr-rgba-00.png,22.7626,0.1324,0.1135,0.5776 +Small,12x12,ldr-rgba-01.png,24.7534,0.1068,0.0876,0.7485 +Small,12x12,ldr-rgba-02.png,20.2087,0.1111,0.0917,0.7147 +Small,12x12,ldr-xy-00.png,30.5427,0.0856,0.0651,1.0064 +Small,12x12,ldr-xy-01.png,32.2466,0.0686,0.0479,1.3689 +Small,12x12,ldr-xy-02.png,40.3262,0.0516,0.0307,2.1326 +Small,12x12,ldrs-rgba-00.png,22.7580,0.1320,0.1128,0.5812 +Small,12x12,ldrs-rgba-01.png,24.7479,0.1060,0.0869,0.7540 +Small,12x12,ldrs-rgba-02.png,20.2070,0.1109,0.0915,0.7166 +Small,3x3x3,ldr-l-00-3.dds,52.1075,0.0543,0.0406,6.4604 +Small,3x3x3,ldr-l-01-3.dds,54.5135,0.0272,0.0185,3.7202 +Small,6x6x6,ldr-l-00-3.dds,33.2902,0.1052,0.0859,3.0525 +Small,6x6x6,ldr-l-01-3.dds,41.6644,0.0356,0.0199,3.4587 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-avx2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-avx2_fast_results.csv new file mode 100644 index 0000000..4eac885 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-avx2_fast_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.7281,0.1483,0.0126,5.2021 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0068,0.0011,0.2399 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0065,0.0010,0.2615 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0064,0.0010,0.2537 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0066,0.0010,0.2692 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0066,0.0010,0.2459 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0068,0.0011,0.2433 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0067,0.0010,0.2495 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0067,0.0010,0.2532 +Small,4x4,ldr-rgb-00.png,38.2700,0.0219,0.0081,8.1279 +Small,4x4,ldr-rgb-01.png,39.9568,0.0215,0.0068,9.6560 +Small,4x4,ldr-rgb-02.png,35.1963,0.0259,0.0109,6.0345 +Small,4x4,ldr-rgb-03.png,46.0468,0.0161,0.0025,25.9637 +Small,4x4,ldr-rgb-04.png,42.0037,0.0190,0.0047,13.9320 +Small,4x4,ldr-rgb-05.png,37.3577,0.0241,0.0106,6.1669 +Small,4x4,ldr-rgb-06.png,35.3918,0.0250,0.0099,6.6373 +Small,4x4,ldr-rgb-07.png,38.1915,0.0252,0.0112,5.8368 +Small,4x4,ldr-rgb-08.png,43.9030,0.0170,0.0040,16.4538 +Small,4x4,ldr-rgb-09.png,41.9060,0.0191,0.0048,13.7936 +Small,4x4,ldr-rgb-10.png,44.4833,0.0132,0.0013,12.4285 +Small,4x4,ldr-rgba-00.png,35.6074,0.0244,0.0108,6.0958 +Small,4x4,ldr-rgba-01.png,38.8915,0.0203,0.0063,10.4326 +Small,4x4,ldr-rgba-02.png,34.9103,0.0236,0.0090,7.2592 +Small,4x4,ldr-xy-00.png,37.6559,0.0195,0.0043,15.1181 +Small,4x4,ldr-xy-01.png,44.2121,0.0207,0.0052,12.5906 +Small,4x4,ldr-xy-02.png,48.3456,0.0186,0.0032,20.3267 +Small,4x4,ldrs-rgba-00.png,35.6094,0.0243,0.0108,6.0958 +Small,4x4,ldrs-rgba-01.png,38.8931,0.0197,0.0063,10.3388 +Small,4x4,ldrs-rgba-02.png,34.8940,0.0231,0.0092,7.1523 +Small,5x5,hdr-rgb-00.hdr,29.5408,0.1478,0.0120,5.4404 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0068,0.0010,0.2498 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0071,0.0010,0.2625 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0069,0.0010,0.2507 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0073,0.0010,0.2534 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0069,0.0010,0.2483 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0069,0.0010,0.2448 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0068,0.0010,0.2547 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0068,0.0010,0.2493 +Small,5x5,ldr-rgb-00.png,34.4428,0.0213,0.0077,8.5278 +Small,5x5,ldr-rgb-01.png,36.2681,0.0197,0.0051,12.7524 +Small,5x5,ldr-rgb-02.png,31.1084,0.0229,0.0083,7.9140 +Small,5x5,ldr-rgb-03.png,42.8306,0.0161,0.0020,32.4416 +Small,5x5,ldr-rgb-04.png,37.2853,0.0186,0.0044,14.8543 +Small,5x5,ldr-rgb-05.png,33.2825,0.0251,0.0105,6.2685 +Small,5x5,ldr-rgb-06.png,31.1484,0.0222,0.0079,8.2914 +Small,5x5,ldr-rgb-07.png,35.0995,0.0229,0.0085,7.7109 +Small,5x5,ldr-rgb-08.png,40.2476,0.0174,0.0033,19.8296 +Small,5x5,ldr-rgb-09.png,37.2955,0.0188,0.0045,14.7143 +Small,5x5,ldr-rgb-10.png,40.2090,0.0139,0.0012,13.4456 +Small,5x5,ldr-rgba-00.png,32.1528,0.0251,0.0108,6.0593 +Small,5x5,ldr-rgba-01.png,35.2203,0.0196,0.0060,10.9705 +Small,5x5,ldr-rgba-02.png,31.1534,0.0227,0.0085,7.7376 +Small,5x5,ldr-xy-00.png,36.7449,0.0189,0.0035,18.9793 +Small,5x5,ldr-xy-01.png,39.8543,0.0201,0.0043,15.1707 +Small,5x5,ldr-xy-02.png,43.9848,0.0190,0.0031,21.3746 +Small,5x5,ldrs-rgba-00.png,32.1509,0.0247,0.0111,5.9159 +Small,5x5,ldrs-rgba-01.png,35.2197,0.0195,0.0059,11.1703 +Small,5x5,ldrs-rgba-02.png,31.1463,0.0230,0.0084,7.8121 +Small,6x6,hdr-rgb-00.hdr,27.0804,0.1443,0.0114,5.7635 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0071,0.0010,0.2547 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0074,0.0010,0.2450 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0071,0.0011,0.2409 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0071,0.0011,0.2397 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0070,0.0010,0.2560 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0069,0.0010,0.2672 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0073,0.0010,0.2490 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0072,0.0010,0.2625 +Small,6x6,ldr-rgb-00.png,31.7206,0.0232,0.0092,7.1460 +Small,6x6,ldr-rgb-01.png,32.9366,0.0207,0.0061,10.7504 +Small,6x6,ldr-rgb-02.png,27.4940,0.0234,0.0088,7.4675 +Small,6x6,ldr-rgb-03.png,40.6226,0.0159,0.0021,31.3287 +Small,6x6,ldr-rgb-04.png,33.9446,0.0189,0.0050,13.2261 +Small,6x6,ldr-rgb-05.png,30.0005,0.0267,0.0120,5.4733 +Small,6x6,ldr-rgb-06.png,27.5678,0.0236,0.0087,7.5183 +Small,6x6,ldr-rgb-07.png,32.9834,0.0225,0.0083,7.8929 +Small,6x6,ldr-rgb-08.png,37.8944,0.0181,0.0033,19.9071 +Small,6x6,ldr-rgb-09.png,33.4981,0.0193,0.0053,12.4026 +Small,6x6,ldr-rgb-10.png,36.7079,0.0137,0.0013,12.6217 +Small,6x6,ldr-rgba-00.png,29.6014,0.0262,0.0126,5.2017 +Small,6x6,ldr-rgba-01.png,32.1034,0.0208,0.0066,9.8848 +Small,6x6,ldr-rgba-02.png,27.8517,0.0234,0.0093,7.0812 +Small,6x6,ldr-xy-00.png,35.8913,0.0195,0.0036,18.1990 +Small,6x6,ldr-xy-01.png,37.1368,0.0219,0.0052,12.4922 +Small,6x6,ldr-xy-02.png,41.9613,0.0185,0.0029,22.7172 +Small,6x6,ldrs-rgba-00.png,29.6022,0.0263,0.0126,5.2021 +Small,6x6,ldrs-rgba-01.png,32.0949,0.0216,0.0065,10.0394 +Small,6x6,ldrs-rgba-02.png,27.8391,0.0234,0.0094,6.9951 +Small,8x8,hdr-rgb-00.hdr,23.7860,0.1521,0.0145,4.5235 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0067,0.0010,0.2618 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0073,0.0010,0.2457 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0074,0.0010,0.2540 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0071,0.0011,0.2397 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0072,0.0010,0.2540 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0071,0.0010,0.2540 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0072,0.0010,0.2500 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0063,0.0010,0.2667 +Small,8x8,ldr-rgb-00.png,28.0746,0.0235,0.0100,6.5386 +Small,8x8,ldr-rgb-01.png,28.7937,0.0219,0.0078,8.4205 +Small,8x8,ldr-rgb-02.png,23.1086,0.0268,0.0122,5.3814 +Small,8x8,ldr-rgb-03.png,37.3624,0.0160,0.0023,28.1897 +Small,8x8,ldr-rgb-04.png,29.3811,0.0222,0.0071,9.2564 +Small,8x8,ldr-rgb-05.png,25.8265,0.0285,0.0140,4.6821 +Small,8x8,ldr-rgb-06.png,23.1833,0.0257,0.0127,5.1551 +Small,8x8,ldr-rgb-07.png,29.8952,0.0220,0.0082,7.9999 +Small,8x8,ldr-rgb-08.png,34.5261,0.0179,0.0036,18.2352 +Small,8x8,ldr-rgb-09.png,28.6875,0.0208,0.0067,9.7741 +Small,8x8,ldr-rgb-10.png,32.0105,0.0136,0.0016,10.1659 +Small,8x8,ldr-rgba-00.png,25.7145,0.0280,0.0137,4.7851 +Small,8x8,ldr-rgba-01.png,28.3047,0.0235,0.0092,7.1328 +Small,8x8,ldr-rgba-02.png,23.9459,0.0278,0.0134,4.8794 +Small,8x8,ldr-xy-00.png,33.2938,0.0210,0.0046,14.3464 +Small,8x8,ldr-xy-01.png,34.3730,0.0220,0.0055,11.8446 +Small,8x8,ldr-xy-02.png,39.8922,0.0174,0.0020,32.5415 +Small,8x8,ldrs-rgba-00.png,25.7105,0.0282,0.0139,4.7002 +Small,8x8,ldrs-rgba-01.png,28.2986,0.0227,0.0090,7.2817 +Small,8x8,ldrs-rgba-02.png,23.9396,0.0278,0.0132,4.9732 +Small,12x12,hdr-rgb-00.hdr,20.5382,0.1557,0.0205,3.1995 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0087,0.0011,0.2372 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0086,0.0010,0.2466 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0088,0.0010,0.2486 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0082,0.0011,0.2422 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0086,0.0012,0.2185 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0087,0.0010,0.2471 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0084,0.0011,0.2377 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0081,0.0010,0.2502 +Small,12x12,ldr-rgb-00.png,23.7948,0.0241,0.0085,7.7254 +Small,12x12,ldr-rgb-01.png,24.7851,0.0219,0.0062,10.6439 +Small,12x12,ldr-rgb-02.png,19.2303,0.0294,0.0138,4.7425 +Small,12x12,ldr-rgb-03.png,33.2866,0.0172,0.0016,40.8315 +Small,12x12,ldr-rgb-04.png,24.5840,0.0221,0.0060,10.9885 +Small,12x12,ldr-rgb-05.png,21.4892,0.0292,0.0125,5.2341 +Small,12x12,ldr-rgb-06.png,19.2330,0.0300,0.0153,4.2938 +Small,12x12,ldr-rgb-07.png,25.4183,0.0216,0.0058,11.2181 +Small,12x12,ldr-rgb-08.png,30.2497,0.0180,0.0027,24.1121 +Small,12x12,ldr-rgb-09.png,23.7480,0.0235,0.0078,8.4401 +Small,12x12,ldr-rgb-10.png,27.3233,0.0165,0.0021,7.7410 +Small,12x12,ldr-rgba-00.png,21.5940,0.0305,0.0140,4.6675 +Small,12x12,ldr-rgba-01.png,24.5318,0.0230,0.0077,8.5480 +Small,12x12,ldr-rgba-02.png,20.1834,0.0328,0.0169,3.8724 +Small,12x12,ldr-xy-00.png,29.2789,0.0234,0.0046,14.1668 +Small,12x12,ldr-xy-01.png,30.5408,0.0224,0.0042,15.7010 +Small,12x12,ldr-xy-02.png,37.9893,0.0198,0.0012,56.7461 +Small,12x12,ldrs-rgba-00.png,21.5954,0.0308,0.0141,4.6601 +Small,12x12,ldrs-rgba-01.png,24.5289,0.0234,0.0076,8.6231 +Small,12x12,ldrs-rgba-02.png,20.1810,0.0321,0.0167,3.9170 +Small,3x3x3,ldr-l-00-3.dds,50.2792,0.0176,0.0077,34.1644 +Small,3x3x3,ldr-l-01-3.dds,51.8778,0.0101,0.0033,20.7714 +Small,6x6x6,ldr-l-00-3.dds,32.5382,0.0486,0.0365,7.1745 +Small,6x6x6,ldr-l-01-3.dds,40.8480,0.0235,0.0143,4.8345 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-avx2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-avx2_fastest_results.csv new file mode 100644 index 0000000..39d0fdd --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-avx2_fastest_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.3455,0.1360,0.0073,8.9313 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0062,0.0012,0.2081 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0061,0.0010,0.2495 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0067,0.0010,0.2525 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0061,0.0010,0.2530 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0062,0.0010,0.2586 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0063,0.0011,0.2311 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0055,0.0010,0.2634 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0061,0.0010,0.2568 +Small,4x4,ldr-rgb-00.png,37.2582,0.0173,0.0045,14.7041 +Small,4x4,ldr-rgb-01.png,39.5673,0.0173,0.0041,15.8185 +Small,4x4,ldr-rgb-02.png,34.8275,0.0200,0.0059,11.1834 +Small,4x4,ldr-rgb-03.png,45.4522,0.0151,0.0020,33.4564 +Small,4x4,ldr-rgb-04.png,41.7305,0.0160,0.0032,20.4675 +Small,4x4,ldr-rgb-05.png,36.8931,0.0195,0.0061,10.7471 +Small,4x4,ldr-rgb-06.png,35.0002,0.0189,0.0054,12.1209 +Small,4x4,ldr-rgb-07.png,37.4127,0.0190,0.0060,10.9317 +Small,4x4,ldr-rgb-08.png,43.0312,0.0153,0.0026,24.7950 +Small,4x4,ldr-rgb-09.png,41.7130,0.0170,0.0033,19.9984 +Small,4x4,ldr-rgb-10.png,43.9511,0.0123,0.0010,15.9231 +Small,4x4,ldr-rgba-00.png,34.7402,0.0191,0.0059,11.1454 +Small,4x4,ldr-rgba-01.png,38.6972,0.0172,0.0044,14.8977 +Small,4x4,ldr-rgba-02.png,34.6012,0.0196,0.0063,10.4373 +Small,4x4,ldr-xy-00.png,37.6162,0.0176,0.0033,19.6805 +Small,4x4,ldr-xy-01.png,43.9365,0.0184,0.0039,16.9041 +Small,4x4,ldr-xy-02.png,48.3672,0.0181,0.0027,24.5822 +Small,4x4,ldrs-rgba-00.png,34.7410,0.0192,0.0060,10.9960 +Small,4x4,ldrs-rgba-01.png,38.6987,0.0177,0.0044,14.7999 +Small,4x4,ldrs-rgba-02.png,34.5841,0.0200,0.0062,10.6525 +Small,5x5,hdr-rgb-00.hdr,28.8643,0.1402,0.0067,9.7874 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0068,0.0011,0.2340 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0066,0.0011,0.2292 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0074,0.0013,0.1980 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0064,0.0010,0.2508 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0076,0.0013,0.1978 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0066,0.0011,0.2368 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0068,0.0011,0.2373 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0065,0.0011,0.2377 +Small,5x5,ldr-rgb-00.png,33.7309,0.0180,0.0046,14.3938 +Small,5x5,ldr-rgb-01.png,36.0941,0.0180,0.0037,17.8864 +Small,5x5,ldr-rgb-02.png,31.0119,0.0197,0.0058,11.3680 +Small,5x5,ldr-rgb-03.png,42.4377,0.0151,0.0017,37.7528 +Small,5x5,ldr-rgb-04.png,37.0451,0.0172,0.0033,19.8899 +Small,5x5,ldr-rgb-05.png,32.9781,0.0212,0.0070,9.3825 +Small,5x5,ldr-rgb-06.png,31.0536,0.0203,0.0059,11.0535 +Small,5x5,ldr-rgb-07.png,34.4657,0.0199,0.0055,11.9331 +Small,5x5,ldr-rgb-08.png,39.6318,0.0159,0.0025,26.2038 +Small,5x5,ldr-rgb-09.png,37.0745,0.0170,0.0033,19.8597 +Small,5x5,ldr-rgb-10.png,39.9327,0.0125,0.0010,16.5532 +Small,5x5,ldr-rgba-00.png,31.1179,0.0199,0.0061,10.8198 +Small,5x5,ldr-rgba-01.png,35.0621,0.0172,0.0043,15.3735 +Small,5x5,ldr-rgba-02.png,31.0579,0.0204,0.0063,10.4338 +Small,5x5,ldr-xy-00.png,36.6252,0.0176,0.0027,24.0215 +Small,5x5,ldr-xy-01.png,39.2899,0.0188,0.0032,20.7127 +Small,5x5,ldr-xy-02.png,43.8853,0.0182,0.0028,23.6923 +Small,5x5,ldrs-rgba-00.png,31.1140,0.0205,0.0061,10.8198 +Small,5x5,ldrs-rgba-01.png,35.0617,0.0180,0.0044,15.0346 +Small,5x5,ldrs-rgba-02.png,31.0429,0.0203,0.0067,9.7523 +Small,6x6,hdr-rgb-00.hdr,26.7571,0.1427,0.0061,10.6769 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0067,0.0011,0.2386 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0066,0.0010,0.2537 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0066,0.0010,0.2495 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0067,0.0010,0.2510 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0065,0.0010,0.2672 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0064,0.0010,0.2544 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0069,0.0011,0.2306 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0065,0.0011,0.2340 +Small,6x6,ldr-rgb-00.png,31.3524,0.0189,0.0050,13.2261 +Small,6x6,ldr-rgb-01.png,32.8547,0.0181,0.0041,15.8532 +Small,6x6,ldr-rgb-02.png,27.4165,0.0210,0.0062,10.5394 +Small,6x6,ldr-rgb-03.png,40.3501,0.0150,0.0017,38.5739 +Small,6x6,ldr-rgb-04.png,33.7683,0.0178,0.0037,17.7891 +Small,6x6,ldr-rgb-05.png,29.7573,0.0221,0.0071,9.2564 +Small,6x6,ldr-rgb-06.png,27.4890,0.0206,0.0063,10.4322 +Small,6x6,ldr-rgb-07.png,32.3734,0.0191,0.0051,12.9160 +Small,6x6,ldr-rgb-08.png,37.5098,0.0162,0.0023,28.8859 +Small,6x6,ldr-rgb-09.png,33.3229,0.0182,0.0038,17.0795 +Small,6x6,ldr-rgb-10.png,36.5829,0.0140,0.0011,14.6440 +Small,6x6,ldr-rgba-00.png,28.8653,0.0197,0.0063,10.3892 +Small,6x6,ldr-rgba-01.png,32.0118,0.0176,0.0047,13.8876 +Small,6x6,ldr-rgba-02.png,27.7975,0.0205,0.0063,10.3618 +Small,6x6,ldr-xy-00.png,35.6703,0.0180,0.0028,23.3303 +Small,6x6,ldr-xy-01.png,36.5669,0.0187,0.0035,18.5503 +Small,6x6,ldr-xy-02.png,41.8230,0.0181,0.0025,26.1739 +Small,6x6,ldrs-rgba-00.png,28.8588,0.0203,0.0063,10.4457 +Small,6x6,ldrs-rgba-01.png,32.0060,0.0188,0.0049,13.4929 +Small,6x6,ldrs-rgba-02.png,27.7847,0.0212,0.0066,9.8611 +Small,8x8,hdr-rgb-00.hdr,23.6223,0.1457,0.0094,6.9906 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0074,0.0015,0.1713 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0077,0.0012,0.2159 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0077,0.0010,0.2468 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0071,0.0010,0.2486 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0075,0.0013,0.1957 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0077,0.0013,0.2014 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0075,0.0012,0.2061 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0072,0.0010,0.2476 +Small,8x8,ldr-rgb-00.png,27.7275,0.0229,0.0071,9.2502 +Small,8x8,ldr-rgb-01.png,28.7129,0.0208,0.0060,10.9740 +Small,8x8,ldr-rgb-02.png,23.0425,0.0229,0.0087,7.4915 +Small,8x8,ldr-rgb-03.png,37.0898,0.0166,0.0019,34.1506 +Small,8x8,ldr-rgb-04.png,29.1776,0.0205,0.0056,11.6464 +Small,8x8,ldr-rgb-05.png,25.6293,0.0252,0.0104,6.3082 +Small,8x8,ldr-rgb-06.png,23.0989,0.0239,0.0090,7.2931 +Small,8x8,ldr-rgb-07.png,29.5159,0.0199,0.0059,11.1875 +Small,8x8,ldr-rgb-08.png,34.0104,0.0179,0.0027,24.4249 +Small,8x8,ldr-rgb-09.png,28.4945,0.0198,0.0051,12.7282 +Small,8x8,ldr-rgb-10.png,31.9035,0.0141,0.0014,11.7719 +Small,8x8,ldr-rgba-00.png,25.3547,0.0245,0.0097,6.7731 +Small,8x8,ldr-rgba-01.png,28.2032,0.0207,0.0067,9.8136 +Small,8x8,ldr-rgba-02.png,23.8879,0.0237,0.0091,7.1922 +Small,8x8,ldr-xy-00.png,33.2442,0.0204,0.0042,15.7849 +Small,8x8,ldr-xy-01.png,34.2088,0.0214,0.0042,15.5298 +Small,8x8,ldr-xy-02.png,39.7685,0.0172,0.0017,38.5253 +Small,8x8,ldrs-rgba-00.png,25.3518,0.0243,0.0095,6.9079 +Small,8x8,ldrs-rgba-01.png,28.1928,0.0219,0.0066,9.9752 +Small,8x8,ldrs-rgba-02.png,23.8821,0.0239,0.0093,7.0460 +Small,12x12,hdr-rgb-00.hdr,20.4606,0.1569,0.0159,4.1088 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0087,0.0012,0.2078 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0083,0.0010,0.2522 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0086,0.0011,0.2388 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0086,0.0014,0.1783 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0089,0.0014,0.1863 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0086,0.0013,0.1898 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0093,0.0012,0.2209 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0082,0.0011,0.2431 +Small,12x12,ldr-rgb-00.png,23.7264,0.0232,0.0065,10.1435 +Small,12x12,ldr-rgb-01.png,24.7407,0.0206,0.0045,14.6219 +Small,12x12,ldr-rgb-02.png,19.1965,0.0267,0.0108,6.0593 +Small,12x12,ldr-rgb-03.png,33.1663,0.0164,0.0014,46.9075 +Small,12x12,ldr-rgb-04.png,24.3920,0.0203,0.0045,14.6844 +Small,12x12,ldr-rgb-05.png,21.3893,0.0257,0.0100,6.5831 +Small,12x12,ldr-rgb-06.png,19.1765,0.0265,0.0113,5.7848 +Small,12x12,ldr-rgb-07.png,25.3504,0.0205,0.0044,14.7601 +Small,12x12,ldr-rgb-08.png,30.1545,0.0175,0.0021,30.7126 +Small,12x12,ldr-rgb-09.png,23.5954,0.0213,0.0057,11.5176 +Small,12x12,ldr-rgb-10.png,27.2800,0.0151,0.0017,9.7809 +Small,12x12,ldr-rgba-00.png,21.3728,0.0250,0.0102,6.4264 +Small,12x12,ldr-rgba-01.png,24.4832,0.0215,0.0063,10.4855 +Small,12x12,ldr-rgba-02.png,20.1479,0.0291,0.0138,4.7659 +Small,12x12,ldr-xy-00.png,28.9003,0.0206,0.0036,18.3008 +Small,12x12,ldr-xy-01.png,29.7608,0.0225,0.0032,20.3222 +Small,12x12,ldr-xy-02.png,37.9676,0.0194,0.0012,56.7930 +Small,12x12,ldrs-rgba-00.png,21.3686,0.0266,0.0106,6.1589 +Small,12x12,ldrs-rgba-01.png,24.4810,0.0208,0.0057,11.4992 +Small,12x12,ldrs-rgba-02.png,20.1455,0.0276,0.0126,5.1901 +Small,3x3x3,ldr-l-00-3.dds,50.1595,0.0192,0.0087,30.0175 +Small,3x3x3,ldr-l-01-3.dds,51.8572,0.0099,0.0032,21.3371 +Small,6x6x6,ldr-l-00-3.dds,32.5210,0.0495,0.0365,7.1730 +Small,6x6x6,ldr-l-01-3.dds,40.8480,0.0238,0.0141,4.8815 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-avx2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-avx2_medium_results.csv new file mode 100644 index 0000000..84c2971 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-avx2_medium_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1456,0.1644,0.0231,2.8325 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0072,0.0011,0.2427 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0075,0.0010,0.2466 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0072,0.0010,0.2544 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0076,0.0010,0.2464 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0075,0.0011,0.2272 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0076,0.0012,0.2224 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0078,0.0011,0.2260 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0074,0.0011,0.2397 +Small,4x4,ldr-rgb-00.png,38.8513,0.0396,0.0256,2.5608 +Small,4x4,ldr-rgb-01.png,40.2580,0.0371,0.0212,3.0903 +Small,4x4,ldr-rgb-02.png,35.3269,0.0364,0.0218,3.0080 +Small,4x4,ldr-rgb-03.png,47.3369,0.0272,0.0124,5.2839 +Small,4x4,ldr-rgb-04.png,42.2423,0.0319,0.0170,3.8600 +Small,4x4,ldr-rgb-05.png,37.8450,0.0341,0.0194,3.3783 +Small,4x4,ldr-rgb-06.png,35.5074,0.0299,0.0155,4.2416 +Small,4x4,ldr-rgb-07.png,39.3473,0.0401,0.0257,2.5520 +Small,4x4,ldr-rgb-08.png,45.3043,0.0275,0.0135,4.8524 +Small,4x4,ldr-rgb-09.png,42.1529,0.0303,0.0153,4.2711 +Small,4x4,ldr-rgb-10.png,44.9880,0.0147,0.0023,6.9411 +Small,4x4,ldr-rgba-00.png,36.2682,0.0380,0.0236,2.7803 +Small,4x4,ldr-rgba-01.png,38.9989,0.0268,0.0130,5.0522 +Small,4x4,ldr-rgba-02.png,34.9755,0.0290,0.0145,4.5073 +Small,4x4,ldr-xy-00.png,37.8046,0.0269,0.0121,5.4189 +Small,4x4,ldr-xy-01.png,45.2627,0.0337,0.0190,3.4471 +Small,4x4,ldr-xy-02.png,51.3219,0.0373,0.0224,2.9211 +Small,4x4,ldrs-rgba-00.png,36.2670,0.0376,0.0237,2.7652 +Small,4x4,ldrs-rgba-01.png,38.9998,0.0271,0.0132,4.9667 +Small,4x4,ldrs-rgba-02.png,34.9622,0.0292,0.0148,4.4188 +Small,5x5,hdr-rgb-00.hdr,29.8960,0.1510,0.0195,3.3538 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0069,0.0010,0.2625 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0069,0.0011,0.2315 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0071,0.0010,0.2500 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0068,0.0010,0.2615 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0070,0.0010,0.2547 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0072,0.0010,0.2492 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0073,0.0010,0.2560 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0069,0.0010,0.2517 +Small,5x5,ldr-rgb-00.png,35.1560,0.0343,0.0201,3.2660 +Small,5x5,ldr-rgb-01.png,36.4651,0.0288,0.0146,4.4968 +Small,5x5,ldr-rgb-02.png,31.1519,0.0291,0.0149,4.3925 +Small,5x5,ldr-rgb-03.png,44.1065,0.0204,0.0063,10.4807 +Small,5x5,ldr-rgb-04.png,37.6960,0.0281,0.0136,4.8295 +Small,5x5,ldr-rgb-05.png,33.5625,0.0359,0.0209,3.1325 +Small,5x5,ldr-rgb-06.png,31.1954,0.0293,0.0143,4.5909 +Small,5x5,ldr-rgb-07.png,36.2028,0.0390,0.0247,2.6495 +Small,5x5,ldr-rgb-08.png,41.7251,0.0243,0.0106,6.2119 +Small,5x5,ldr-rgb-09.png,37.5911,0.0270,0.0123,5.3416 +Small,5x5,ldr-rgb-10.png,40.6060,0.0146,0.0024,6.8422 +Small,5x5,ldr-rgba-00.png,32.8029,0.0376,0.0237,2.7701 +Small,5x5,ldr-rgba-01.png,35.3460,0.0282,0.0140,4.6738 +Small,5x5,ldr-rgba-02.png,31.1673,0.0296,0.0155,4.2416 +Small,5x5,ldr-xy-00.png,37.0976,0.0278,0.0111,5.9201 +Small,5x5,ldr-xy-01.png,40.7362,0.0316,0.0162,4.0382 +Small,5x5,ldr-xy-02.png,49.2303,0.0282,0.0125,5.2400 +Small,5x5,ldrs-rgba-00.png,32.8008,0.0384,0.0241,2.7183 +Small,5x5,ldrs-rgba-01.png,35.3451,0.0276,0.0139,4.7284 +Small,5x5,ldrs-rgba-02.png,31.1597,0.0294,0.0154,4.2650 +Small,6x6,hdr-rgb-00.hdr,27.5178,0.1542,0.0197,3.3227 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0078,0.0012,0.2182 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0072,0.0011,0.2292 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0073,0.0010,0.2443 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0077,0.0011,0.2431 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0069,0.0010,0.2500 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0075,0.0010,0.2532 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0071,0.0010,0.2650 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0071,0.0010,0.2594 +Small,6x6,ldr-rgb-00.png,32.4055,0.0354,0.0209,3.1330 +Small,6x6,ldr-rgb-01.png,33.1088,0.0292,0.0144,4.5511 +Small,6x6,ldr-rgb-02.png,27.5242,0.0298,0.0150,4.3755 +Small,6x6,ldr-rgb-03.png,41.7669,0.0185,0.0047,13.9645 +Small,6x6,ldr-rgb-04.png,34.2170,0.0262,0.0120,5.4677 +Small,6x6,ldr-rgb-05.png,30.1610,0.0365,0.0213,3.0839 +Small,6x6,ldr-rgb-06.png,27.5989,0.0297,0.0147,4.4640 +Small,6x6,ldr-rgb-07.png,33.9304,0.0376,0.0231,2.8422 +Small,6x6,ldr-rgb-08.png,39.2751,0.0218,0.0080,8.2053 +Small,6x6,ldr-rgb-09.png,33.6804,0.0263,0.0118,5.5704 +Small,6x6,ldr-rgb-10.png,37.0384,0.0146,0.0025,6.5203 +Small,6x6,ldr-rgba-00.png,30.2356,0.0411,0.0267,2.4509 +Small,6x6,ldr-rgba-01.png,32.2252,0.0283,0.0141,4.6427 +Small,6x6,ldr-rgba-02.png,27.8666,0.0312,0.0169,3.8781 +Small,6x6,ldr-xy-00.png,36.2425,0.0253,0.0093,7.0726 +Small,6x6,ldr-xy-01.png,38.0098,0.0281,0.0120,5.4741 +Small,6x6,ldr-xy-02.png,46.1924,0.0237,0.0085,7.6848 +Small,6x6,ldrs-rgba-00.png,30.2304,0.0413,0.0271,2.4192 +Small,6x6,ldrs-rgba-01.png,32.2181,0.0283,0.0139,4.7046 +Small,6x6,ldrs-rgba-02.png,27.8512,0.0307,0.0165,3.9794 +Small,8x8,hdr-rgb-00.hdr,24.1376,0.1583,0.0255,2.5718 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0081,0.0013,0.1989 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0077,0.0011,0.2383 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0084,0.0010,0.2599 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0082,0.0011,0.2267 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0085,0.0010,0.2550 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0086,0.0011,0.2415 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0081,0.0011,0.2331 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0081,0.0010,0.2493 +Small,8x8,ldr-rgb-00.png,28.7714,0.0436,0.0288,2.2780 +Small,8x8,ldr-rgb-01.png,28.9669,0.0332,0.0182,3.6036 +Small,8x8,ldr-rgb-02.png,23.1676,0.0355,0.0204,3.2173 +Small,8x8,ldr-rgb-03.png,38.5942,0.0209,0.0056,11.6469 +Small,8x8,ldr-rgb-04.png,29.6864,0.0333,0.0177,3.6932 +Small,8x8,ldr-rgb-05.png,25.9572,0.0431,0.0272,2.4131 +Small,8x8,ldr-rgb-06.png,23.2220,0.0359,0.0205,3.2011 +Small,8x8,ldr-rgb-07.png,30.7945,0.0445,0.0282,2.3233 +Small,8x8,ldr-rgb-08.png,35.9533,0.0243,0.0096,6.8012 +Small,8x8,ldr-rgb-09.png,29.0250,0.0317,0.0163,4.0239 +Small,8x8,ldr-rgb-10.png,32.2021,0.0164,0.0032,5.1428 +Small,8x8,ldr-rgba-00.png,26.4617,0.0488,0.0347,1.8910 +Small,8x8,ldr-rgba-01.png,28.3979,0.0325,0.0181,3.6124 +Small,8x8,ldr-rgba-02.png,23.9546,0.0367,0.0220,2.9828 +Small,8x8,ldr-xy-00.png,34.0327,0.0302,0.0131,4.9893 +Small,8x8,ldr-xy-01.png,34.9901,0.0313,0.0131,4.9924 +Small,8x8,ldr-xy-02.png,41.7418,0.0259,0.0084,7.7632 +Small,8x8,ldrs-rgba-00.png,26.4585,0.0487,0.0337,1.9470 +Small,8x8,ldrs-rgba-01.png,28.3890,0.0329,0.0184,3.5564 +Small,8x8,ldrs-rgba-02.png,23.9483,0.0363,0.0218,3.0094 +Small,12x12,hdr-rgb-00.hdr,20.7711,0.1803,0.0382,1.7152 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0109,0.0014,0.1774 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0116,0.0012,0.2131 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0110,0.0013,0.1908 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0103,0.0011,0.2346 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0105,0.0012,0.2097 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0114,0.0015,0.1734 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0118,0.0016,0.1606 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0111,0.0015,0.1748 +Small,12x12,ldr-rgb-00.png,24.7065,0.0518,0.0339,1.9326 +Small,12x12,ldr-rgb-01.png,25.0522,0.0408,0.0236,2.7798 +Small,12x12,ldr-rgb-02.png,19.2748,0.0468,0.0284,2.3044 +Small,12x12,ldr-rgb-03.png,35.0223,0.0230,0.0062,10.6303 +Small,12x12,ldr-rgb-04.png,24.9003,0.0408,0.0220,2.9737 +Small,12x12,ldr-rgb-05.png,21.6546,0.0557,0.0375,1.7457 +Small,12x12,ldr-rgb-06.png,19.2632,0.0464,0.0293,2.2342 +Small,12x12,ldr-rgb-07.png,26.7793,0.0470,0.0303,2.1640 +Small,12x12,ldr-rgb-08.png,31.7409,0.0271,0.0103,6.3479 +Small,12x12,ldr-rgb-09.png,24.1684,0.0399,0.0211,3.1029 +Small,12x12,ldr-rgb-10.png,28.0441,0.0228,0.0066,2.4567 +Small,12x12,ldr-rgba-00.png,22.2726,0.0560,0.0403,1.6254 +Small,12x12,ldr-rgba-01.png,24.6716,0.0388,0.0229,2.8646 +Small,12x12,ldr-rgba-02.png,20.1919,0.0497,0.0332,1.9740 +Small,12x12,ldr-xy-00.png,30.2042,0.0351,0.0148,4.4344 +Small,12x12,ldr-xy-01.png,31.9775,0.0367,0.0158,4.1573 +Small,12x12,ldr-xy-02.png,38.5097,0.0243,0.0035,18.6548 +Small,12x12,ldrs-rgba-00.png,22.2700,0.0564,0.0400,1.6404 +Small,12x12,ldrs-rgba-01.png,24.6720,0.0401,0.0234,2.7973 +Small,12x12,ldrs-rgba-02.png,20.1895,0.0492,0.0321,2.0390 +Small,3x3x3,ldr-l-00-3.dds,51.2292,0.0213,0.0111,23.5573 +Small,3x3x3,ldr-l-01-3.dds,52.5354,0.0110,0.0035,19.4638 +Small,6x6x6,ldr-l-00-3.dds,32.9609,0.0577,0.0443,5.9191 +Small,6x6x6,ldr-l-01-3.dds,40.9534,0.0242,0.0137,5.0289 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-avx2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-avx2_thorough_results.csv new file mode 100644 index 0000000..ac1be10 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-avx2_thorough_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.4181,0.1753,0.0384,1.7053 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0071,0.0010,0.2555 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0071,0.0010,0.2500 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0075,0.0011,0.2411 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0070,0.0011,0.2377 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0069,0.0010,0.2462 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0077,0.0010,0.2560 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0070,0.0010,0.2528 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0077,0.0011,0.2302 +Small,4x4,ldr-rgb-00.png,39.1728,0.0621,0.0498,1.3166 +Small,4x4,ldr-rgb-01.png,40.4449,0.0590,0.0440,1.4911 +Small,4x4,ldr-rgb-02.png,35.5045,0.0529,0.0379,1.7280 +Small,4x4,ldr-rgb-03.png,47.8117,0.0519,0.0381,1.7194 +Small,4x4,ldr-rgb-04.png,42.3894,0.0490,0.0346,1.8924 +Small,4x4,ldr-rgb-05.png,38.0197,0.0625,0.0485,1.3521 +Small,4x4,ldr-rgb-06.png,35.6707,0.0529,0.0383,1.7119 +Small,4x4,ldr-rgb-07.png,39.9565,0.0658,0.0512,1.2791 +Small,4x4,ldr-rgb-08.png,45.9978,0.0513,0.0371,1.7685 +Small,4x4,ldr-rgb-09.png,42.3000,0.0527,0.0385,1.7010 +Small,4x4,ldr-rgb-10.png,45.1911,0.0175,0.0048,3.3851 +Small,4x4,ldr-rgba-00.png,36.7550,0.0614,0.0465,1.4085 +Small,4x4,ldr-rgba-01.png,39.1428,0.0521,0.0377,1.7361 +Small,4x4,ldr-rgba-02.png,35.0643,0.0487,0.0342,1.9177 +Small,4x4,ldr-xy-00.png,37.7684,0.0575,0.0420,1.5591 +Small,4x4,ldr-xy-01.png,45.5023,0.0605,0.0445,1.4725 +Small,4x4,ldr-xy-02.png,51.3360,0.0767,0.0602,1.0887 +Small,4x4,ldrs-rgba-00.png,36.7558,0.0660,0.0518,1.2661 +Small,4x4,ldrs-rgba-01.png,39.1418,0.0494,0.0348,1.8812 +Small,4x4,ldrs-rgba-02.png,35.0521,0.0480,0.0339,1.9314 +Small,5x5,hdr-rgb-00.hdr,30.3023,0.1860,0.0450,1.4562 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0067,0.0011,0.2409 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0078,0.0011,0.2415 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0086,0.0011,0.2290 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0080,0.0011,0.2436 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0079,0.0010,0.2478 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0074,0.0010,0.2560 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0084,0.0011,0.2313 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0078,0.0010,0.2517 +Small,5x5,ldr-rgb-00.png,35.4087,0.0639,0.0490,1.3388 +Small,5x5,ldr-rgb-01.png,36.5693,0.0609,0.0457,1.4331 +Small,5x5,ldr-rgb-02.png,31.2265,0.0551,0.0394,1.6641 +Small,5x5,ldr-rgb-03.png,44.6467,0.0620,0.0477,1.3745 +Small,5x5,ldr-rgb-04.png,37.8494,0.0551,0.0399,1.6423 +Small,5x5,ldr-rgb-05.png,33.7109,0.0689,0.0539,1.2164 +Small,5x5,ldr-rgb-06.png,31.2594,0.0470,0.0320,2.0487 +Small,5x5,ldr-rgb-07.png,36.7772,0.0848,0.0695,0.9429 +Small,5x5,ldr-rgb-08.png,42.4862,0.0584,0.0431,1.5219 +Small,5x5,ldr-rgb-09.png,37.7207,0.0650,0.0497,1.3192 +Small,5x5,ldr-rgb-10.png,40.7712,0.0193,0.0053,3.0706 +Small,5x5,ldr-rgba-00.png,33.1370,0.0718,0.0564,1.1619 +Small,5x5,ldr-rgba-01.png,35.4402,0.0549,0.0405,1.6173 +Small,5x5,ldr-rgba-02.png,31.2042,0.0514,0.0361,1.8175 +Small,5x5,ldr-xy-00.png,37.2094,0.0585,0.0422,1.5538 +Small,5x5,ldr-xy-01.png,41.5252,0.0745,0.0588,1.1149 +Small,5x5,ldr-xy-02.png,49.4271,0.0891,0.0721,0.9096 +Small,5x5,ldrs-rgba-00.png,33.1344,0.0736,0.0582,1.1266 +Small,5x5,ldrs-rgba-01.png,35.4371,0.0540,0.0389,1.6840 +Small,5x5,ldrs-rgba-02.png,31.2008,0.0485,0.0334,1.9612 +Small,6x6,hdr-rgb-00.hdr,27.7108,0.1833,0.0436,1.5026 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0080,0.0011,0.2399 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0079,0.0011,0.2422 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0078,0.0011,0.2359 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0080,0.0010,0.2597 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0077,0.0010,0.2543 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0081,0.0011,0.2236 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0079,0.0011,0.2287 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0082,0.0014,0.1812 +Small,6x6,ldr-rgb-00.png,32.6620,0.0698,0.0548,1.1950 +Small,6x6,ldr-rgb-01.png,33.2164,0.0592,0.0439,1.4915 +Small,6x6,ldr-rgb-02.png,27.5725,0.0532,0.0383,1.7116 +Small,6x6,ldr-rgb-03.png,42.5991,0.0559,0.0409,1.6026 +Small,6x6,ldr-rgb-04.png,34.3577,0.0588,0.0437,1.4994 +Small,6x6,ldr-rgb-05.png,30.3096,0.0631,0.0480,1.3640 +Small,6x6,ldr-rgb-06.png,27.6511,0.0523,0.0369,1.7765 +Small,6x6,ldr-rgb-07.png,34.4830,0.0869,0.0718,0.9130 +Small,6x6,ldr-rgb-08.png,40.0915,0.0537,0.0382,1.7177 +Small,6x6,ldr-rgb-09.png,33.8253,0.0633,0.0472,1.3882 +Small,6x6,ldr-rgb-10.png,37.2042,0.0188,0.0059,2.7367 +Small,6x6,ldr-rgba-00.png,30.5236,0.0755,0.0589,1.1124 +Small,6x6,ldr-rgba-01.png,32.2957,0.0525,0.0381,1.7202 +Small,6x6,ldr-rgba-02.png,27.9010,0.0496,0.0345,1.8971 +Small,6x6,ldr-xy-00.png,36.3195,0.0496,0.0343,1.9121 +Small,6x6,ldr-xy-01.png,38.0890,0.0642,0.0489,1.3403 +Small,6x6,ldr-xy-02.png,47.6556,0.0798,0.0646,1.0139 +Small,6x6,ldrs-rgba-00.png,30.5201,0.0720,0.0575,1.1391 +Small,6x6,ldrs-rgba-01.png,32.2889,0.0535,0.0382,1.7143 +Small,6x6,ldrs-rgba-02.png,27.8878,0.0540,0.0391,1.6767 +Small,8x8,hdr-rgb-00.hdr,24.3507,0.2044,0.0560,1.1708 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0092,0.0011,0.2260 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0101,0.0012,0.2203 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0101,0.0010,0.2615 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0099,0.0012,0.2194 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0102,0.0013,0.1992 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0096,0.0010,0.2440 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0099,0.0011,0.2226 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0097,0.0013,0.2035 +Small,8x8,ldr-rgb-00.png,28.9964,0.0901,0.0745,0.8795 +Small,8x8,ldr-rgb-01.png,29.0587,0.0751,0.0594,1.1037 +Small,8x8,ldr-rgb-02.png,23.2109,0.0750,0.0570,1.1505 +Small,8x8,ldr-rgb-03.png,39.4631,0.0400,0.0237,2.7697 +Small,8x8,ldr-rgb-04.png,29.8053,0.0711,0.0538,1.2180 +Small,8x8,ldr-rgb-05.png,26.0720,0.0776,0.0613,1.0699 +Small,8x8,ldr-rgb-06.png,23.2757,0.0680,0.0514,1.2747 +Small,8x8,ldr-rgb-07.png,31.2666,0.0942,0.0771,0.8499 +Small,8x8,ldr-rgb-08.png,36.6034,0.0493,0.0328,1.9977 +Small,8x8,ldr-rgb-09.png,29.1793,0.0591,0.0429,1.5276 +Small,8x8,ldr-rgb-10.png,32.3590,0.0230,0.0085,1.9129 +Small,8x8,ldr-rgba-00.png,26.7577,0.0948,0.0789,0.8307 +Small,8x8,ldr-rgba-01.png,28.4704,0.0732,0.0571,1.1486 +Small,8x8,ldr-rgba-02.png,23.9802,0.0768,0.0607,1.0795 +Small,8x8,ldr-xy-00.png,34.2040,0.0625,0.0449,1.4609 +Small,8x8,ldr-xy-01.png,35.2494,0.0608,0.0435,1.5072 +Small,8x8,ldr-xy-02.png,44.6459,0.0889,0.0726,0.9027 +Small,8x8,ldrs-rgba-00.png,26.7543,0.1126,0.0964,0.6797 +Small,8x8,ldrs-rgba-01.png,28.4623,0.0744,0.0589,1.1135 +Small,8x8,ldrs-rgba-02.png,23.9736,0.0675,0.0517,1.2687 +Small,12x12,hdr-rgb-00.hdr,21.0175,0.2429,0.0961,0.6819 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0124,0.0011,0.2232 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0124,0.0012,0.2205 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0138,0.0013,0.1949 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0140,0.0014,0.1882 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0135,0.0013,0.1942 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0138,0.0014,0.1775 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0131,0.0014,0.1825 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0129,0.0010,0.2480 +Small,12x12,ldr-rgb-00.png,25.0738,0.1215,0.0994,0.6593 +Small,12x12,ldr-rgb-01.png,25.1477,0.1025,0.0836,0.7837 +Small,12x12,ldr-rgb-02.png,19.2950,0.1080,0.0896,0.7311 +Small,12x12,ldr-rgb-03.png,36.2051,0.0395,0.0215,3.0419 +Small,12x12,ldr-rgb-04.png,25.0000,0.0881,0.0683,0.9599 +Small,12x12,ldr-rgb-05.png,21.7395,0.1082,0.0900,0.7284 +Small,12x12,ldr-rgb-06.png,19.3020,0.1072,0.0882,0.7429 +Small,12x12,ldr-rgb-07.png,27.1599,0.1181,0.1002,0.6542 +Small,12x12,ldr-rgb-08.png,32.5575,0.0482,0.0299,2.1940 +Small,12x12,ldr-rgb-09.png,24.3246,0.0832,0.0636,1.0305 +Small,12x12,ldr-rgb-10.png,28.2270,0.0318,0.0138,1.1807 +Small,12x12,ldr-rgba-00.png,22.7316,0.1305,0.1123,0.5833 +Small,12x12,ldr-rgba-01.png,24.7496,0.0960,0.0773,0.8480 +Small,12x12,ldr-rgba-02.png,20.2177,0.1091,0.0900,0.7282 +Small,12x12,ldr-xy-00.png,30.4621,0.0696,0.0506,1.2958 +Small,12x12,ldr-xy-01.png,32.2515,0.0622,0.0413,1.5867 +Small,12x12,ldr-xy-02.png,40.3186,0.0439,0.0243,2.6962 +Small,12x12,ldrs-rgba-00.png,22.7268,0.1259,0.1043,0.6283 +Small,12x12,ldrs-rgba-01.png,24.7447,0.0926,0.0746,0.8789 +Small,12x12,ldrs-rgba-02.png,20.2148,0.1016,0.0828,0.7920 +Small,3x3x3,ldr-l-00-3.dds,52.1052,0.0600,0.0488,5.3768 +Small,3x3x3,ldr-l-01-3.dds,54.5179,0.0297,0.0215,3.2110 +Small,6x6x6,ldr-l-00-3.dds,33.2856,0.0934,0.0777,3.3736 +Small,6x6x6,ldr-l-01-3.dds,41.6471,0.0283,0.0153,4.5026 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse2_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse2_fast_results.csv new file mode 100644 index 0000000..24e78c3 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse2_fast_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.7281,0.1497,0.0154,4.2564 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0062,0.0009,0.2826 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0060,0.0009,0.2939 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0058,0.0009,0.2915 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0054,0.0009,0.2789 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0061,0.0009,0.2853 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0064,0.0009,0.2762 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0060,0.0009,0.2780 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0060,0.0009,0.2879 +Small,4x4,ldr-rgb-00.png,38.2700,0.0199,0.0103,6.3541 +Small,4x4,ldr-rgb-01.png,39.9568,0.0185,0.0089,7.3538 +Small,4x4,ldr-rgb-02.png,35.1963,0.0240,0.0141,4.6539 +Small,4x4,ldr-rgb-03.png,46.0468,0.0125,0.0032,20.3012 +Small,4x4,ldr-rgb-04.png,42.0037,0.0165,0.0063,10.4338 +Small,4x4,ldr-rgb-05.png,37.3577,0.0233,0.0138,4.7548 +Small,4x4,ldr-rgb-06.png,35.3918,0.0216,0.0128,5.1216 +Small,4x4,ldr-rgb-07.png,38.1915,0.0239,0.0145,4.5138 +Small,4x4,ldr-rgb-08.png,43.9030,0.0145,0.0053,12.3630 +Small,4x4,ldr-rgb-09.png,41.9060,0.0165,0.0062,10.5483 +Small,4x4,ldr-rgb-10.png,44.4833,0.0090,0.0015,10.6038 +Small,4x4,ldr-rgba-00.png,35.6074,0.0235,0.0138,4.7566 +Small,4x4,ldr-rgba-01.png,38.8915,0.0182,0.0082,7.9555 +Small,4x4,ldr-rgba-02.png,34.9103,0.0216,0.0117,5.6028 +Small,4x4,ldr-xy-00.png,37.6559,0.0169,0.0056,11.6326 +Small,4x4,ldr-xy-01.png,44.2121,0.0176,0.0069,9.4366 +Small,4x4,ldr-xy-02.png,48.3456,0.0155,0.0041,16.0635 +Small,4x4,ldrs-rgba-00.png,35.6094,0.0239,0.0138,4.7500 +Small,4x4,ldrs-rgba-01.png,38.8931,0.0186,0.0082,7.9592 +Small,4x4,ldrs-rgba-02.png,34.8940,0.0218,0.0115,5.6815 +Small,5x5,hdr-rgb-00.hdr,29.5408,0.1503,0.0157,4.1780 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0059,0.0009,0.2750 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0066,0.0010,0.2647 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0062,0.0009,0.2838 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0062,0.0009,0.2795 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0063,0.0009,0.2720 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0063,0.0009,0.2829 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0064,0.0010,0.2498 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0065,0.0009,0.2729 +Small,5x5,ldr-rgb-00.png,34.4428,0.0205,0.0104,6.2732 +Small,5x5,ldr-rgb-01.png,36.2681,0.0171,0.0070,9.3343 +Small,5x5,ldr-rgb-02.png,31.1084,0.0221,0.0114,5.7428 +Small,5x5,ldr-rgb-03.png,42.8306,0.0127,0.0027,24.0320 +Small,5x5,ldr-rgb-04.png,37.2853,0.0163,0.0061,10.7420 +Small,5x5,ldr-rgb-05.png,33.2825,0.0246,0.0147,4.4717 +Small,5x5,ldr-rgb-06.png,31.1484,0.0210,0.0111,5.9223 +Small,5x5,ldr-rgb-07.png,35.0995,0.0213,0.0118,5.5319 +Small,5x5,ldr-rgb-08.png,40.2476,0.0141,0.0044,14.7673 +Small,5x5,ldr-rgb-09.png,37.2955,0.0162,0.0061,10.6720 +Small,5x5,ldr-rgb-10.png,40.2090,0.0092,0.0015,11.0132 +Small,5x5,ldr-rgba-00.png,32.1528,0.0251,0.0149,4.4108 +Small,5x5,ldr-rgba-01.png,35.2203,0.0180,0.0080,8.1867 +Small,5x5,ldr-rgba-02.png,31.1534,0.0221,0.0118,5.5709 +Small,5x5,ldr-xy-00.png,36.7449,0.0163,0.0047,14.0423 +Small,5x5,ldr-xy-01.png,39.8543,0.0178,0.0059,11.1530 +Small,5x5,ldr-xy-02.png,43.9848,0.0162,0.0041,15.9027 +Small,5x5,ldrs-rgba-00.png,32.1509,0.0253,0.0149,4.4090 +Small,5x5,ldrs-rgba-01.png,35.2197,0.0181,0.0081,8.0531 +Small,5x5,ldrs-rgba-02.png,31.1463,0.0221,0.0117,5.5871 +Small,6x6,hdr-rgb-00.hdr,27.0804,0.1515,0.0159,4.1233 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0065,0.0010,0.2630 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0064,0.0009,0.2767 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0064,0.0009,0.2783 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0062,0.0009,0.2947 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0064,0.0010,0.2602 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0066,0.0010,0.2547 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0060,0.0010,0.2658 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0064,0.0009,0.2773 +Small,6x6,ldr-rgb-00.png,31.7206,0.0237,0.0132,4.9682 +Small,6x6,ldr-rgb-01.png,32.9366,0.0190,0.0088,7.4582 +Small,6x6,ldr-rgb-02.png,27.4940,0.0230,0.0131,5.0203 +Small,6x6,ldr-rgb-03.png,40.6226,0.0124,0.0029,22.4353 +Small,6x6,ldr-rgb-04.png,33.9446,0.0173,0.0073,8.9630 +Small,6x6,ldr-rgb-05.png,30.0005,0.0278,0.0174,3.7662 +Small,6x6,ldr-rgb-06.png,27.5678,0.0228,0.0130,5.0513 +Small,6x6,ldr-rgb-07.png,32.9834,0.0224,0.0122,5.3908 +Small,6x6,ldr-rgb-08.png,37.8944,0.0149,0.0045,14.4505 +Small,6x6,ldr-rgb-09.png,33.4981,0.0175,0.0076,8.5701 +Small,6x6,ldr-rgb-10.png,36.7079,0.0101,0.0016,10.2499 +Small,6x6,ldr-rgba-00.png,29.6014,0.0283,0.0180,3.6322 +Small,6x6,ldr-rgba-01.png,32.1034,0.0201,0.0096,6.8466 +Small,6x6,ldr-rgba-02.png,27.8517,0.0242,0.0136,4.8306 +Small,6x6,ldr-xy-00.png,35.8913,0.0175,0.0050,13.1439 +Small,6x6,ldr-xy-01.png,37.1368,0.0192,0.0073,8.9689 +Small,6x6,ldr-xy-02.png,41.9613,0.0165,0.0039,16.6593 +Small,6x6,ldrs-rgba-00.png,29.6022,0.0287,0.0180,3.6490 +Small,6x6,ldrs-rgba-01.png,32.0949,0.0204,0.0095,6.8709 +Small,6x6,ldrs-rgba-02.png,27.8391,0.0244,0.0137,4.7945 +Small,8x8,hdr-rgb-00.hdr,23.7860,0.1565,0.0205,3.1975 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0063,0.0010,0.2469 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0063,0.0009,0.2826 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0064,0.0009,0.2789 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0064,0.0009,0.2750 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0067,0.0009,0.2720 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0066,0.0009,0.2873 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0062,0.0009,0.2832 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0067,0.0011,0.2286 +Small,8x8,ldr-rgb-00.png,28.0746,0.0253,0.0150,4.3563 +Small,8x8,ldr-rgb-01.png,28.7937,0.0222,0.0118,5.5543 +Small,8x8,ldr-rgb-02.png,23.1086,0.0287,0.0182,3.6080 +Small,8x8,ldr-rgb-03.png,37.3624,0.0130,0.0032,20.3162 +Small,8x8,ldr-rgb-04.png,29.3811,0.0214,0.0109,5.9882 +Small,8x8,ldr-rgb-05.png,25.8265,0.0311,0.0211,3.1122 +Small,8x8,ldr-rgb-06.png,23.1833,0.0293,0.0186,3.5236 +Small,8x8,ldr-rgb-07.png,29.8952,0.0221,0.0123,5.3303 +Small,8x8,ldr-rgb-08.png,34.5261,0.0156,0.0050,13.1282 +Small,8x8,ldr-rgb-09.png,28.6875,0.0204,0.0102,6.4498 +Small,8x8,ldr-rgb-10.png,32.0105,0.0102,0.0021,7.8380 +Small,8x8,ldr-rgba-00.png,25.7145,0.0311,0.0205,3.1997 +Small,8x8,ldr-rgba-01.png,28.3047,0.0250,0.0139,4.7017 +Small,8x8,ldr-rgba-02.png,23.9459,0.0304,0.0199,3.2979 +Small,8x8,ldr-xy-00.png,33.2938,0.0190,0.0069,9.5338 +Small,8x8,ldr-xy-01.png,34.3730,0.0214,0.0082,7.9661 +Small,8x8,ldr-xy-02.png,39.8922,0.0156,0.0026,24.9368 +Small,8x8,ldrs-rgba-00.png,25.7105,0.0308,0.0203,3.2206 +Small,8x8,ldrs-rgba-01.png,28.2986,0.0242,0.0140,4.6956 +Small,8x8,ldrs-rgba-02.png,23.9396,0.0304,0.0199,3.2989 +Small,12x12,hdr-rgb-00.hdr,20.5382,0.1680,0.0295,2.2213 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0081,0.0010,0.2615 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0079,0.0010,0.2529 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0081,0.0009,0.2738 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0085,0.0010,0.2607 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0084,0.0010,0.2515 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0082,0.0011,0.2429 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0094,0.0011,0.2424 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0090,0.0011,0.2313 +Small,12x12,ldr-rgb-00.png,23.7948,0.0250,0.0125,5.2240 +Small,12x12,ldr-rgb-01.png,24.7851,0.0216,0.0093,7.0597 +Small,12x12,ldr-rgb-02.png,19.2303,0.0324,0.0203,3.2325 +Small,12x12,ldr-rgb-03.png,33.2866,0.0134,0.0022,30.2996 +Small,12x12,ldr-rgb-04.png,24.5840,0.0209,0.0087,7.5251 +Small,12x12,ldr-rgb-05.png,21.4892,0.0307,0.0179,3.6512 +Small,12x12,ldr-rgb-06.png,19.2330,0.0343,0.0216,3.0323 +Small,12x12,ldr-rgb-07.png,25.4183,0.0210,0.0088,7.4559 +Small,12x12,ldr-rgb-08.png,30.2497,0.0157,0.0038,17.4481 +Small,12x12,ldr-rgb-09.png,23.7480,0.0233,0.0113,5.8094 +Small,12x12,ldr-rgb-10.png,27.3233,0.0130,0.0031,5.3052 +Small,12x12,ldr-rgba-00.png,21.5940,0.0320,0.0204,3.2197 +Small,12x12,ldr-rgba-01.png,24.5318,0.0237,0.0112,5.8416 +Small,12x12,ldr-rgba-02.png,20.1834,0.0367,0.0242,2.7051 +Small,12x12,ldr-xy-00.png,29.2789,0.0233,0.0066,9.9583 +Small,12x12,ldr-xy-01.png,30.5408,0.0222,0.0060,10.8970 +Small,12x12,ldr-xy-02.png,37.9893,0.0168,0.0012,52.8510 +Small,12x12,ldrs-rgba-00.png,21.5954,0.0321,0.0204,3.2065 +Small,12x12,ldrs-rgba-01.png,24.5289,0.0254,0.0113,5.7986 +Small,12x12,ldrs-rgba-02.png,20.1810,0.0370,0.0241,2.7175 +Small,3x3x3,ldr-l-00-3.dds,50.2792,0.0219,0.0121,21.6324 +Small,3x3x3,ldr-l-01-3.dds,51.8778,0.0116,0.0051,13.3831 +Small,6x6x6,ldr-l-00-3.dds,32.5382,0.0687,0.0567,4.6200 +Small,6x6x6,ldr-l-01-3.dds,40.8480,0.0304,0.0217,3.1737 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse2_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse2_fastest_results.csv new file mode 100644 index 0000000..8347fdb --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse2_fastest_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.3455,0.1438,0.0094,6.9498 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0061,0.0010,0.2542 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0057,0.0009,0.2998 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0054,0.0009,0.2804 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0057,0.0010,0.2537 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0058,0.0010,0.2653 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0056,0.0009,0.2835 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0055,0.0009,0.3002 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0053,0.0009,0.2923 +Small,4x4,ldr-rgb-00.png,37.2582,0.0155,0.0060,10.9885 +Small,4x4,ldr-rgb-01.png,39.5673,0.0145,0.0055,12.0118 +Small,4x4,ldr-rgb-02.png,34.8275,0.0168,0.0075,8.6860 +Small,4x4,ldr-rgb-03.png,45.4522,0.0113,0.0025,26.3621 +Small,4x4,ldr-rgb-04.png,41.7305,0.0140,0.0041,15.9027 +Small,4x4,ldr-rgb-05.png,36.8931,0.0174,0.0082,8.0195 +Small,4x4,ldr-rgb-06.png,35.0002,0.0170,0.0071,9.1669 +Small,4x4,ldr-rgb-07.png,37.4127,0.0175,0.0077,8.5278 +Small,4x4,ldr-rgb-08.png,43.0312,0.0121,0.0034,19.2128 +Small,4x4,ldr-rgb-09.png,41.7130,0.0136,0.0042,15.5412 +Small,4x4,ldr-rgb-10.png,43.9511,0.0084,0.0012,13.5015 +Small,4x4,ldr-rgba-00.png,34.7402,0.0175,0.0077,8.5154 +Small,4x4,ldr-rgba-01.png,38.6972,0.0153,0.0056,11.6321 +Small,4x4,ldr-rgba-02.png,34.6012,0.0181,0.0081,8.0590 +Small,4x4,ldr-xy-00.png,37.6162,0.0150,0.0042,15.6039 +Small,4x4,ldr-xy-01.png,43.9365,0.0159,0.0050,13.1571 +Small,4x4,ldr-xy-02.png,48.3672,0.0147,0.0034,19.3671 +Small,4x4,ldrs-rgba-00.png,34.7410,0.0171,0.0076,8.6288 +Small,4x4,ldrs-rgba-01.png,38.6987,0.0153,0.0057,11.4432 +Small,4x4,ldrs-rgba-02.png,34.5841,0.0179,0.0080,8.1992 +Small,5x5,hdr-rgb-00.hdr,28.8643,0.1463,0.0093,7.0681 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0057,0.0010,0.2500 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0059,0.0010,0.2583 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0061,0.0009,0.2718 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0061,0.0009,0.2870 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0059,0.0009,0.2823 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0059,0.0009,0.2695 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0061,0.0009,0.2785 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0059,0.0011,0.2383 +Small,5x5,ldr-rgb-00.png,33.7309,0.0157,0.0060,10.9374 +Small,5x5,ldr-rgb-01.png,36.0941,0.0143,0.0051,12.7975 +Small,5x5,ldr-rgb-02.png,31.0119,0.0176,0.0082,8.0207 +Small,5x5,ldr-rgb-03.png,42.4377,0.0112,0.0022,30.4102 +Small,5x5,ldr-rgb-04.png,37.0451,0.0143,0.0046,14.1639 +Small,5x5,ldr-rgb-05.png,32.9781,0.0187,0.0092,7.1010 +Small,5x5,ldr-rgb-06.png,31.0536,0.0179,0.0080,8.2114 +Small,5x5,ldr-rgb-07.png,34.4657,0.0168,0.0075,8.7569 +Small,5x5,ldr-rgb-08.png,39.6318,0.0124,0.0031,21.2770 +Small,5x5,ldr-rgb-09.png,37.0745,0.0140,0.0046,14.3622 +Small,5x5,ldr-rgb-10.png,39.9327,0.0083,0.0012,14.0265 +Small,5x5,ldr-rgba-00.png,31.1179,0.0178,0.0084,7.8282 +Small,5x5,ldr-rgba-01.png,35.0621,0.0155,0.0060,10.9191 +Small,5x5,ldr-rgba-02.png,31.0579,0.0191,0.0088,7.4813 +Small,5x5,ldr-xy-00.png,36.6252,0.0147,0.0036,18.0686 +Small,5x5,ldr-xy-01.png,39.2899,0.0155,0.0042,15.4452 +Small,5x5,ldr-xy-02.png,43.8853,0.0152,0.0034,19.4480 +Small,5x5,ldrs-rgba-00.png,31.1140,0.0179,0.0083,7.8730 +Small,5x5,ldrs-rgba-01.png,35.0617,0.0160,0.0058,11.2181 +Small,5x5,ldrs-rgba-02.png,31.0429,0.0188,0.0087,7.5433 +Small,6x6,hdr-rgb-00.hdr,26.7571,0.1426,0.0088,7.4762 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0059,0.0011,0.2357 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0059,0.0010,0.2540 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0060,0.0010,0.2672 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0062,0.0009,0.2718 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0060,0.0009,0.2854 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0057,0.0009,0.2867 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0057,0.0009,0.2860 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0057,0.0009,0.2860 +Small,6x6,ldr-rgb-00.png,31.3524,0.0170,0.0072,9.1237 +Small,6x6,ldr-rgb-01.png,32.8547,0.0162,0.0062,10.6167 +Small,6x6,ldr-rgb-02.png,27.4165,0.0188,0.0092,7.1219 +Small,6x6,ldr-rgb-03.png,40.3501,0.0114,0.0021,30.7814 +Small,6x6,ldr-rgb-04.png,33.7683,0.0150,0.0055,11.8166 +Small,6x6,ldr-rgb-05.png,29.7573,0.0203,0.0107,6.1168 +Small,6x6,ldr-rgb-06.png,27.4890,0.0196,0.0096,6.8517 +Small,6x6,ldr-rgb-07.png,32.3734,0.0170,0.0076,8.6277 +Small,6x6,ldr-rgb-08.png,37.5098,0.0125,0.0031,21.0861 +Small,6x6,ldr-rgb-09.png,33.3229,0.0158,0.0054,12.1859 +Small,6x6,ldr-rgb-10.png,36.5829,0.0089,0.0013,12.0592 +Small,6x6,ldr-rgba-00.png,28.8653,0.0187,0.0091,7.1892 +Small,6x6,ldr-rgba-01.png,32.0118,0.0166,0.0069,9.4897 +Small,6x6,ldr-rgba-02.png,27.7975,0.0202,0.0092,7.1389 +Small,6x6,ldr-xy-00.png,35.6703,0.0155,0.0038,17.3973 +Small,6x6,ldr-xy-01.png,36.5669,0.0163,0.0050,13.1175 +Small,6x6,ldr-xy-02.png,41.8230,0.0145,0.0032,20.7926 +Small,6x6,ldrs-rgba-00.png,28.8588,0.0190,0.0091,7.1835 +Small,6x6,ldrs-rgba-01.png,32.0060,0.0172,0.0069,9.5354 +Small,6x6,ldrs-rgba-02.png,27.7847,0.0196,0.0093,7.0272 +Small,8x8,hdr-rgb-00.hdr,23.6223,0.1493,0.0140,4.6832 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0062,0.0010,0.2498 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0064,0.0009,0.2813 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0067,0.0009,0.2750 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0063,0.0009,0.2912 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0063,0.0009,0.2750 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0063,0.0009,0.2715 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0062,0.0009,0.2700 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0069,0.0009,0.2758 +Small,8x8,ldr-rgb-00.png,27.7275,0.0211,0.0104,6.2980 +Small,8x8,ldr-rgb-01.png,28.7129,0.0191,0.0087,7.5293 +Small,8x8,ldr-rgb-02.png,23.0425,0.0234,0.0134,4.8904 +Small,8x8,ldr-rgb-03.png,37.0898,0.0121,0.0026,25.4823 +Small,8x8,ldr-rgb-04.png,29.1776,0.0185,0.0083,7.9083 +Small,8x8,ldr-rgb-05.png,25.6293,0.0257,0.0152,4.3093 +Small,8x8,ldr-rgb-06.png,23.0989,0.0244,0.0139,4.7206 +Small,8x8,ldr-rgb-07.png,29.5159,0.0190,0.0089,7.3471 +Small,8x8,ldr-rgb-08.png,34.0104,0.0138,0.0039,16.9301 +Small,8x8,ldr-rgb-09.png,28.4945,0.0179,0.0078,8.4194 +Small,8x8,ldr-rgb-10.png,31.9035,0.0094,0.0016,10.0535 +Small,8x8,ldr-rgba-00.png,25.3547,0.0240,0.0136,4.8057 +Small,8x8,ldr-rgba-01.png,28.2032,0.0202,0.0098,6.6669 +Small,8x8,ldr-rgba-02.png,23.8879,0.0239,0.0135,4.8650 +Small,8x8,ldr-xy-00.png,33.2442,0.0178,0.0054,12.1230 +Small,8x8,ldr-xy-01.png,34.2088,0.0190,0.0063,10.4124 +Small,8x8,ldr-xy-02.png,39.7685,0.0148,0.0024,27.3402 +Small,8x8,ldrs-rgba-00.png,25.3518,0.0241,0.0137,4.7708 +Small,8x8,ldrs-rgba-01.png,28.1928,0.0208,0.0099,6.5897 +Small,8x8,ldrs-rgba-02.png,23.8821,0.0243,0.0136,4.8309 +Small,12x12,hdr-rgb-00.hdr,20.4606,0.1561,0.0202,3.2389 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0079,0.0011,0.2298 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0078,0.0011,0.2424 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0075,0.0010,0.2607 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0078,0.0009,0.2785 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0070,0.0010,0.2555 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0074,0.0010,0.2647 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0076,0.0010,0.2555 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0079,0.0009,0.2782 +Small,12x12,ldr-rgb-00.png,23.7264,0.0212,0.0089,7.3595 +Small,12x12,ldr-rgb-01.png,24.7407,0.0176,0.0066,9.8611 +Small,12x12,ldr-rgb-02.png,19.1965,0.0257,0.0143,4.5717 +Small,12x12,ldr-rgb-03.png,33.1663,0.0132,0.0019,33.9565 +Small,12x12,ldr-rgb-04.png,24.3920,0.0179,0.0063,10.3353 +Small,12x12,ldr-rgb-05.png,21.3893,0.0243,0.0128,5.1152 +Small,12x12,ldr-rgb-06.png,19.1765,0.0264,0.0150,4.3711 +Small,12x12,ldr-rgb-07.png,25.3504,0.0175,0.0064,10.1984 +Small,12x12,ldr-rgb-08.png,30.1545,0.0141,0.0030,21.6576 +Small,12x12,ldr-rgb-09.png,23.5954,0.0203,0.0084,7.7999 +Small,12x12,ldr-rgb-10.png,27.2800,0.0118,0.0022,7.3032 +Small,12x12,ldr-rgba-00.png,21.3728,0.0272,0.0139,4.7097 +Small,12x12,ldr-rgba-01.png,24.4832,0.0200,0.0083,7.8714 +Small,12x12,ldr-rgba-02.png,20.1479,0.0291,0.0170,3.8567 +Small,12x12,ldr-xy-00.png,28.9003,0.0208,0.0051,12.7779 +Small,12x12,ldr-xy-01.png,29.7608,0.0202,0.0047,13.9766 +Small,12x12,ldr-xy-02.png,37.9676,0.0161,0.0013,49.7607 +Small,12x12,ldrs-rgba-00.png,21.3686,0.0266,0.0138,4.7552 +Small,12x12,ldrs-rgba-01.png,24.4810,0.0194,0.0082,7.9834 +Small,12x12,ldrs-rgba-02.png,20.1455,0.0297,0.0170,3.8496 +Small,3x3x3,ldr-l-00-3.dds,50.1595,0.0215,0.0119,22.0976 +Small,3x3x3,ldr-l-01-3.dds,51.8572,0.0112,0.0050,13.7872 +Small,6x6x6,ldr-l-00-3.dds,32.5210,0.0683,0.0565,4.6434 +Small,6x6x6,ldr-l-01-3.dds,40.8480,0.0301,0.0215,3.1995 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse2_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse2_medium_results.csv new file mode 100644 index 0000000..2cf9881 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse2_medium_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1456,0.1592,0.0242,2.7034 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0068,0.0010,0.2522 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0067,0.0009,0.2715 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0064,0.0009,0.2810 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0065,0.0009,0.2866 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0063,0.0009,0.2735 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0062,0.0009,0.2743 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0065,0.0009,0.2820 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0065,0.0009,0.2765 +Small,4x4,ldr-rgb-00.png,38.8513,0.0380,0.0273,2.3981 +Small,4x4,ldr-rgb-01.png,40.2580,0.0328,0.0229,2.8602 +Small,4x4,ldr-rgb-02.png,35.3269,0.0332,0.0229,2.8618 +Small,4x4,ldr-rgb-03.png,47.3369,0.0247,0.0153,4.2899 +Small,4x4,ldr-rgb-04.png,42.2423,0.0284,0.0184,3.5563 +Small,4x4,ldr-rgb-05.png,37.8450,0.0353,0.0253,2.5911 +Small,4x4,ldr-rgb-06.png,35.5074,0.0300,0.0200,3.2703 +Small,4x4,ldr-rgb-07.png,39.3473,0.0432,0.0335,1.9559 +Small,4x4,ldr-rgb-08.png,45.3043,0.0274,0.0178,3.6785 +Small,4x4,ldr-rgb-09.png,42.1529,0.0295,0.0198,3.3168 +Small,4x4,ldr-rgb-10.png,44.9880,0.0107,0.0029,5.6541 +Small,4x4,ldr-rgba-00.png,36.2682,0.0401,0.0302,2.1719 +Small,4x4,ldr-rgba-01.png,38.9989,0.0269,0.0170,3.8614 +Small,4x4,ldr-rgba-02.png,34.9755,0.0292,0.0190,3.4442 +Small,4x4,ldr-xy-00.png,37.8046,0.0273,0.0161,4.0734 +Small,4x4,ldr-xy-01.png,45.2627,0.0352,0.0240,2.7311 +Small,4x4,ldr-xy-02.png,51.3219,0.0406,0.0292,2.2420 +Small,4x4,ldrs-rgba-00.png,36.2670,0.0402,0.0303,2.1615 +Small,4x4,ldrs-rgba-01.png,38.9998,0.0270,0.0169,3.8692 +Small,4x4,ldrs-rgba-02.png,34.9622,0.0294,0.0191,3.4224 +Small,5x5,hdr-rgb-00.hdr,29.8960,0.1641,0.0267,2.4580 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0071,0.0012,0.2117 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0065,0.0009,0.2873 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0062,0.0009,0.2866 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0064,0.0011,0.2384 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0064,0.0009,0.2798 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0063,0.0009,0.2714 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0065,0.0009,0.2798 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0064,0.0009,0.2755 +Small,5x5,ldr-rgb-00.png,35.1560,0.0387,0.0285,2.3026 +Small,5x5,ldr-rgb-01.png,36.4651,0.0304,0.0207,3.1688 +Small,5x5,ldr-rgb-02.png,31.1519,0.0305,0.0207,3.1688 +Small,5x5,ldr-rgb-03.png,44.1065,0.0189,0.0091,7.2145 +Small,5x5,ldr-rgb-04.png,37.6960,0.0290,0.0190,3.4509 +Small,5x5,ldr-rgb-05.png,33.5625,0.0395,0.0296,2.2152 +Small,5x5,ldr-rgb-06.png,31.1954,0.0300,0.0198,3.3096 +Small,5x5,ldr-rgb-07.png,36.2028,0.0447,0.0349,1.8768 +Small,5x5,ldr-rgb-08.png,41.7251,0.0245,0.0148,4.4210 +Small,5x5,ldr-rgb-09.png,37.5911,0.0274,0.0174,3.7608 +Small,5x5,ldr-rgb-10.png,40.6060,0.0110,0.0032,5.1540 +Small,5x5,ldr-rgba-00.png,32.8029,0.0443,0.0343,1.9123 +Small,5x5,ldr-rgba-01.png,35.3460,0.0294,0.0193,3.3986 +Small,5x5,ldr-rgba-02.png,31.1673,0.0320,0.0217,3.0216 +Small,5x5,ldr-xy-00.png,37.0976,0.0275,0.0158,4.1608 +Small,5x5,ldr-xy-01.png,40.7362,0.0344,0.0227,2.8854 +Small,5x5,ldr-xy-02.png,49.2303,0.0297,0.0178,3.6907 +Small,5x5,ldrs-rgba-00.png,32.8008,0.0442,0.0341,1.9207 +Small,5x5,ldrs-rgba-01.png,35.3451,0.0295,0.0192,3.4185 +Small,5x5,ldrs-rgba-02.png,31.1597,0.0321,0.0218,3.0108 +Small,6x6,hdr-rgb-00.hdr,27.5178,0.1626,0.0285,2.3002 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0063,0.0010,0.2555 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0064,0.0009,0.2698 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0063,0.0009,0.2804 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0065,0.0009,0.2774 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0068,0.0010,0.2563 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0066,0.0010,0.2519 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0067,0.0009,0.2759 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0065,0.0009,0.2758 +Small,6x6,ldr-rgb-00.png,32.4055,0.0407,0.0306,2.1425 +Small,6x6,ldr-rgb-01.png,33.1088,0.0306,0.0209,3.1317 +Small,6x6,ldr-rgb-02.png,27.5242,0.0325,0.0225,2.9167 +Small,6x6,ldr-rgb-03.png,41.7669,0.0166,0.0068,9.6788 +Small,6x6,ldr-rgb-04.png,34.2170,0.0283,0.0183,3.5748 +Small,6x6,ldr-rgb-05.png,30.1610,0.0413,0.0315,2.0797 +Small,6x6,ldr-rgb-06.png,27.5989,0.0318,0.0218,3.0043 +Small,6x6,ldr-rgb-07.png,33.9304,0.0444,0.0346,1.8937 +Small,6x6,ldr-rgb-08.png,39.2751,0.0214,0.0115,5.6786 +Small,6x6,ldr-rgb-09.png,33.6804,0.0274,0.0175,3.7423 +Small,6x6,ldr-rgb-10.png,37.0384,0.0113,0.0033,4.8845 +Small,6x6,ldr-rgba-00.png,30.2356,0.0492,0.0391,1.6752 +Small,6x6,ldr-rgba-01.png,32.2252,0.0307,0.0205,3.2006 +Small,6x6,ldr-rgba-02.png,27.8666,0.0347,0.0245,2.6733 +Small,6x6,ldr-xy-00.png,36.2425,0.0256,0.0137,4.7867 +Small,6x6,ldr-xy-01.png,38.0098,0.0302,0.0173,3.7966 +Small,6x6,ldr-xy-02.png,46.1924,0.0246,0.0127,5.1482 +Small,6x6,ldrs-rgba-00.png,30.2304,0.0496,0.0394,1.6645 +Small,6x6,ldrs-rgba-01.png,32.2181,0.0308,0.0205,3.1913 +Small,6x6,ldrs-rgba-02.png,27.8512,0.0348,0.0247,2.6575 +Small,8x8,hdr-rgb-00.hdr,24.1376,0.1736,0.0375,1.7459 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0081,0.0010,0.2625 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0076,0.0010,0.2537 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0075,0.0009,0.2899 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0073,0.0010,0.2560 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0077,0.0009,0.2844 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0080,0.0009,0.2756 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0081,0.0011,0.2317 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0079,0.0010,0.2586 +Small,8x8,ldr-rgb-00.png,28.7714,0.0535,0.0426,1.5370 +Small,8x8,ldr-rgb-01.png,28.9669,0.0384,0.0278,2.3532 +Small,8x8,ldr-rgb-02.png,23.1676,0.0411,0.0301,2.1806 +Small,8x8,ldr-rgb-03.png,38.5942,0.0191,0.0085,7.7219 +Small,8x8,ldr-rgb-04.png,29.6864,0.0386,0.0278,2.3577 +Small,8x8,ldr-rgb-05.png,25.9572,0.0522,0.0413,1.5856 +Small,8x8,ldr-rgb-06.png,23.2220,0.0415,0.0306,2.1383 +Small,8x8,ldr-rgb-07.png,30.7945,0.0536,0.0430,1.5228 +Small,8x8,ldr-rgb-08.png,35.9533,0.0251,0.0148,4.4404 +Small,8x8,ldr-rgb-09.png,29.0250,0.0353,0.0244,2.6839 +Small,8x8,ldr-rgb-10.png,32.2021,0.0134,0.0045,3.5925 +Small,8x8,ldr-rgba-00.png,26.4617,0.0627,0.0516,1.2693 +Small,8x8,ldr-rgba-01.png,28.3979,0.0385,0.0275,2.3827 +Small,8x8,ldr-rgba-02.png,23.9546,0.0440,0.0327,2.0071 +Small,8x8,ldr-xy-00.png,34.0327,0.0326,0.0194,3.3825 +Small,8x8,ldr-xy-01.png,34.9901,0.0334,0.0197,3.3258 +Small,8x8,ldr-xy-02.png,41.7418,0.0270,0.0132,4.9693 +Small,8x8,ldrs-rgba-00.png,26.4585,0.0624,0.0515,1.2723 +Small,8x8,ldrs-rgba-01.png,28.3890,0.0386,0.0276,2.3748 +Small,8x8,ldrs-rgba-02.png,23.9483,0.0437,0.0326,2.0094 +Small,12x12,hdr-rgb-00.hdr,20.7711,0.1987,0.0541,1.2110 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0103,0.0012,0.2164 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0106,0.0012,0.2133 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0114,0.0013,0.1938 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0116,0.0013,0.1959 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0118,0.0013,0.1916 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0115,0.0014,0.1818 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0111,0.0013,0.1991 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0117,0.0015,0.1714 +Small,12x12,ldr-rgb-00.png,24.7065,0.0606,0.0478,1.3719 +Small,12x12,ldr-rgb-01.png,25.0522,0.0466,0.0344,1.9055 +Small,12x12,ldr-rgb-02.png,19.2748,0.0534,0.0410,1.5967 +Small,12x12,ldr-rgb-03.png,35.0223,0.0207,0.0087,7.5027 +Small,12x12,ldr-rgb-04.png,24.9003,0.0464,0.0318,2.0610 +Small,12x12,ldr-rgb-05.png,21.6546,0.0629,0.0506,1.2949 +Small,12x12,ldr-rgb-06.png,19.2632,0.0553,0.0429,1.5290 +Small,12x12,ldr-rgb-07.png,26.7793,0.0563,0.0440,1.4882 +Small,12x12,ldr-rgb-08.png,31.7409,0.0279,0.0151,4.3485 +Small,12x12,ldr-rgb-09.png,24.1684,0.0438,0.0306,2.1431 +Small,12x12,ldr-rgb-10.png,28.0441,0.0215,0.0094,1.7231 +Small,12x12,ldr-rgba-00.png,22.2726,0.0688,0.0562,1.1668 +Small,12x12,ldr-rgba-01.png,24.6716,0.0456,0.0327,2.0013 +Small,12x12,ldr-rgba-02.png,20.1919,0.0591,0.0463,1.4160 +Small,12x12,ldr-xy-00.png,30.2042,0.0373,0.0216,3.0379 +Small,12x12,ldr-xy-01.png,31.9775,0.0403,0.0236,2.7732 +Small,12x12,ldr-xy-02.png,38.5097,0.0213,0.0050,13.0732 +Small,12x12,ldrs-rgba-00.png,22.2700,0.0689,0.0562,1.1657 +Small,12x12,ldrs-rgba-01.png,24.6720,0.0454,0.0326,2.0104 +Small,12x12,ldrs-rgba-02.png,20.1895,0.0591,0.0462,1.4191 +Small,3x3x3,ldr-l-00-3.dds,51.2292,0.0264,0.0165,15.9308 +Small,3x3x3,ldr-l-01-3.dds,52.5354,0.0120,0.0055,12.4790 +Small,6x6x6,ldr-l-00-3.dds,32.9609,0.0816,0.0675,3.8864 +Small,6x6x6,ldr-l-01-3.dds,40.9534,0.0320,0.0216,3.1886 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse2_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse2_thorough_results.csv new file mode 100644 index 0000000..0e8d77b --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse2_thorough_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.4181,0.1825,0.0476,1.3757 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0072,0.0011,0.2413 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0064,0.0009,0.2777 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0064,0.0009,0.2701 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0062,0.0009,0.2916 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0063,0.0009,0.2850 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0068,0.0009,0.2829 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0062,0.0009,0.2786 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0064,0.0010,0.2555 +Small,4x4,ldr-rgb-00.png,39.1728,0.0660,0.0559,1.1726 +Small,4x4,ldr-rgb-01.png,40.4449,0.0625,0.0529,1.2399 +Small,4x4,ldr-rgb-02.png,35.5045,0.0585,0.0489,1.3405 +Small,4x4,ldr-rgb-03.png,47.8117,0.0600,0.0507,1.2928 +Small,4x4,ldr-rgb-04.png,42.3894,0.0539,0.0441,1.4865 +Small,4x4,ldr-rgb-05.png,38.0197,0.0638,0.0539,1.2154 +Small,4x4,ldr-rgb-06.png,35.6707,0.0525,0.0426,1.5384 +Small,4x4,ldr-rgb-07.png,39.9565,0.0766,0.0670,0.9783 +Small,4x4,ldr-rgb-08.png,45.9978,0.0574,0.0479,1.3692 +Small,4x4,ldr-rgb-09.png,42.3000,0.0582,0.0482,1.3588 +Small,4x4,ldr-rgb-10.png,45.1911,0.0139,0.0062,2.6132 +Small,4x4,ldr-rgba-00.png,36.7550,0.0687,0.0586,1.1184 +Small,4x4,ldr-rgba-01.png,39.1428,0.0500,0.0401,1.6348 +Small,4x4,ldr-rgba-02.png,35.0643,0.0499,0.0398,1.6470 +Small,4x4,ldr-xy-00.png,37.7684,0.0578,0.0467,1.4040 +Small,4x4,ldr-xy-01.png,45.5023,0.0638,0.0528,1.2423 +Small,4x4,ldr-xy-02.png,51.3360,0.0836,0.0721,0.9090 +Small,4x4,ldrs-rgba-00.png,36.7558,0.0689,0.0588,1.1146 +Small,4x4,ldrs-rgba-01.png,39.1418,0.0503,0.0402,1.6289 +Small,4x4,ldrs-rgba-02.png,35.0521,0.0502,0.0399,1.6413 +Small,5x5,hdr-rgb-00.hdr,30.3023,0.1904,0.0537,1.2213 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0074,0.0010,0.2457 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0066,0.0009,0.2847 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0070,0.0011,0.2370 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0068,0.0010,0.2694 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0071,0.0010,0.2692 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0073,0.0010,0.2471 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0069,0.0010,0.2495 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0070,0.0010,0.2488 +Small,5x5,ldr-rgb-00.png,35.4087,0.0761,0.0654,1.0018 +Small,5x5,ldr-rgb-01.png,36.5693,0.0664,0.0561,1.1674 +Small,5x5,ldr-rgb-02.png,31.2265,0.0577,0.0476,1.3782 +Small,5x5,ldr-rgb-03.png,44.6467,0.0681,0.0582,1.1266 +Small,5x5,ldr-rgb-04.png,37.8494,0.0604,0.0501,1.3083 +Small,5x5,ldr-rgb-05.png,33.7109,0.0751,0.0646,1.0138 +Small,5x5,ldr-rgb-06.png,31.2594,0.0549,0.0442,1.4836 +Small,5x5,ldr-rgb-07.png,36.7772,0.0918,0.0811,0.8076 +Small,5x5,ldr-rgb-08.png,42.4862,0.0664,0.0564,1.1624 +Small,5x5,ldr-rgb-09.png,37.7207,0.0665,0.0561,1.1674 +Small,5x5,ldr-rgb-10.png,40.7712,0.0156,0.0073,2.2382 +Small,5x5,ldr-rgba-00.png,33.1370,0.0816,0.0712,0.9199 +Small,5x5,ldr-rgba-01.png,35.4402,0.0569,0.0464,1.4139 +Small,5x5,ldr-rgba-02.png,31.2042,0.0559,0.0450,1.4571 +Small,5x5,ldr-xy-00.png,37.2094,0.0693,0.0573,1.1427 +Small,5x5,ldr-xy-01.png,41.5252,0.0805,0.0686,0.9548 +Small,5x5,ldr-xy-02.png,49.4271,0.0956,0.0838,0.7822 +Small,5x5,ldrs-rgba-00.png,33.1344,0.0820,0.0714,0.9179 +Small,5x5,ldrs-rgba-01.png,35.4371,0.0568,0.0464,1.4124 +Small,5x5,ldrs-rgba-02.png,31.2008,0.0559,0.0451,1.4525 +Small,6x6,hdr-rgb-00.hdr,27.7108,0.1984,0.0582,1.1256 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0070,0.0011,0.2258 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0070,0.0010,0.2591 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0075,0.0009,0.2755 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0064,0.0010,0.2512 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0071,0.0010,0.2680 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0074,0.0011,0.2417 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0074,0.0009,0.2741 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0070,0.0010,0.2607 +Small,6x6,ldr-rgb-00.png,32.6620,0.0833,0.0725,0.9040 +Small,6x6,ldr-rgb-01.png,33.2164,0.0717,0.0613,1.0696 +Small,6x6,ldr-rgb-02.png,27.5725,0.0621,0.0517,1.2686 +Small,6x6,ldr-rgb-03.png,42.5991,0.0610,0.0510,1.2862 +Small,6x6,ldr-rgb-04.png,34.3577,0.0644,0.0538,1.2184 +Small,6x6,ldr-rgb-05.png,30.3096,0.0793,0.0689,0.9510 +Small,6x6,ldr-rgb-06.png,27.6511,0.0597,0.0492,1.3320 +Small,6x6,ldr-rgb-07.png,34.4830,0.0985,0.0880,0.7451 +Small,6x6,ldr-rgb-08.png,40.0915,0.0599,0.0497,1.3180 +Small,6x6,ldr-rgb-09.png,33.8253,0.0697,0.0590,1.1100 +Small,6x6,ldr-rgb-10.png,37.2042,0.0175,0.0087,1.8621 +Small,6x6,ldr-rgba-00.png,30.5236,0.0908,0.0802,0.8170 +Small,6x6,ldr-rgba-01.png,32.2957,0.0646,0.0539,1.2166 +Small,6x6,ldr-rgba-02.png,27.9010,0.0606,0.0498,1.3159 +Small,6x6,ldr-xy-00.png,36.3195,0.0617,0.0496,1.3209 +Small,6x6,ldr-xy-01.png,38.0890,0.0807,0.0689,0.9515 +Small,6x6,ldr-xy-02.png,47.6556,0.1031,0.0910,0.7199 +Small,6x6,ldrs-rgba-00.png,30.5201,0.0910,0.0804,0.8147 +Small,6x6,ldrs-rgba-01.png,32.2889,0.0646,0.0539,1.2164 +Small,6x6,ldrs-rgba-02.png,27.8878,0.0609,0.0500,1.3097 +Small,8x8,hdr-rgb-00.hdr,24.3507,0.2193,0.0776,0.8445 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0092,0.0012,0.2132 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0096,0.0013,0.1898 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0094,0.0010,0.2573 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0093,0.0012,0.2059 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0090,0.0010,0.2503 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0091,0.0012,0.2107 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0103,0.0013,0.2034 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0094,0.0011,0.2261 +Small,8x8,ldr-rgb-00.png,28.9964,0.1063,0.0943,0.6949 +Small,8x8,ldr-rgb-01.png,29.0587,0.0893,0.0775,0.8454 +Small,8x8,ldr-rgb-02.png,23.2109,0.0819,0.0702,0.9333 +Small,8x8,ldr-rgb-03.png,39.4631,0.0424,0.0313,2.0957 +Small,8x8,ldr-rgb-04.png,29.8053,0.0803,0.0687,0.9533 +Small,8x8,ldr-rgb-05.png,26.0720,0.0978,0.0859,0.7629 +Small,8x8,ldr-rgb-06.png,23.2757,0.0805,0.0686,0.9548 +Small,8x8,ldr-rgb-07.png,31.2666,0.1190,0.1074,0.6100 +Small,8x8,ldr-rgb-08.png,36.6034,0.0613,0.0501,1.3088 +Small,8x8,ldr-rgb-09.png,29.1793,0.0707,0.0590,1.1101 +Small,8x8,ldr-rgb-10.png,32.3590,0.0218,0.0116,1.4005 +Small,8x8,ldr-rgba-00.png,26.7577,0.1195,0.1058,0.6194 +Small,8x8,ldr-rgba-01.png,28.4704,0.0851,0.0733,0.8939 +Small,8x8,ldr-rgba-02.png,23.9802,0.0781,0.0660,0.9924 +Small,8x8,ldr-xy-00.png,34.2040,0.0705,0.0573,1.1435 +Small,8x8,ldr-xy-01.png,35.2494,0.0732,0.0603,1.0862 +Small,8x8,ldr-xy-02.png,44.6459,0.0903,0.0771,0.8500 +Small,8x8,ldrs-rgba-00.png,26.7543,0.1173,0.1056,0.6207 +Small,8x8,ldrs-rgba-01.png,28.4623,0.0848,0.0731,0.8965 +Small,8x8,ldrs-rgba-02.png,23.9736,0.0779,0.0659,0.9951 +Small,12x12,hdr-rgb-00.hdr,21.0175,0.2584,0.1136,0.5767 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0129,0.0014,0.1873 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0133,0.0014,0.1882 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0134,0.0015,0.1661 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0130,0.0014,0.1800 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0130,0.0012,0.2071 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0132,0.0015,0.1749 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0132,0.0015,0.1699 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0135,0.0013,0.1977 +Small,12x12,ldr-rgb-00.png,25.0738,0.1365,0.1220,0.5374 +Small,12x12,ldr-rgb-01.png,25.1477,0.1121,0.0979,0.6695 +Small,12x12,ldr-rgb-02.png,19.2950,0.1211,0.1071,0.6117 +Small,12x12,ldr-rgb-03.png,36.2051,0.0452,0.0315,2.0785 +Small,12x12,ldr-rgb-04.png,25.0000,0.1010,0.0869,0.7537 +Small,12x12,ldr-rgb-05.png,21.7395,0.1221,0.1081,0.6062 +Small,12x12,ldr-rgb-06.png,19.3020,0.1160,0.1021,0.6420 +Small,12x12,ldr-rgb-07.png,27.1599,0.1401,0.1257,0.5215 +Small,12x12,ldr-rgb-08.png,32.5575,0.0564,0.0428,1.5321 +Small,12x12,ldr-rgb-09.png,24.3246,0.0939,0.0798,0.8214 +Small,12x12,ldr-rgb-10.png,28.2270,0.0340,0.0193,0.8442 +Small,12x12,ldr-rgba-00.png,22.7316,0.1438,0.1293,0.5068 +Small,12x12,ldr-rgba-01.png,24.7496,0.1146,0.0997,0.6574 +Small,12x12,ldr-rgba-02.png,20.2177,0.1176,0.1030,0.6363 +Small,12x12,ldr-xy-00.png,30.4621,0.0896,0.0740,0.8852 +Small,12x12,ldr-xy-01.png,32.2515,0.0703,0.0549,1.1937 +Small,12x12,ldr-xy-02.png,40.3186,0.0505,0.0346,1.8926 +Small,12x12,ldrs-rgba-00.png,22.7268,0.1437,0.1294,0.5066 +Small,12x12,ldrs-rgba-01.png,24.7447,0.1137,0.0995,0.6584 +Small,12x12,ldrs-rgba-02.png,20.2148,0.1164,0.1018,0.6438 +Small,3x3x3,ldr-l-00-3.dds,52.1052,0.0605,0.0501,5.2350 +Small,3x3x3,ldr-l-01-3.dds,54.5179,0.0302,0.0232,2.9689 +Small,6x6x6,ldr-l-00-3.dds,33.2856,0.1113,0.0955,2.7441 +Small,6x6x6,ldr-l-01-3.dds,41.6471,0.0348,0.0224,3.0821 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse4.1_fast_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse4.1_fast_results.csv new file mode 100644 index 0000000..2be6ec3 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse4.1_fast_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.7281,0.1482,0.0130,5.0393 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0061,0.0003,0.7753 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0059,0.0003,0.8978 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0062,0.0003,0.8772 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0060,0.0003,0.7832 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0060,0.0003,0.8590 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0059,0.0003,0.9209 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0060,0.0003,0.8395 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0059,0.0003,0.9146 +Small,4x4,ldr-rgb-00.png,38.2700,0.0203,0.0086,7.6480 +Small,4x4,ldr-rgb-01.png,39.9568,0.0195,0.0070,9.3553 +Small,4x4,ldr-rgb-02.png,35.1963,0.0233,0.0116,5.6642 +Small,4x4,ldr-rgb-03.png,46.0468,0.0142,0.0025,26.1614 +Small,4x4,ldr-rgb-04.png,42.0037,0.0165,0.0048,13.6105 +Small,4x4,ldr-rgb-05.png,37.3577,0.0230,0.0111,5.9079 +Small,4x4,ldr-rgb-06.png,35.3918,0.0227,0.0106,6.1961 +Small,4x4,ldr-rgb-07.png,38.1915,0.0233,0.0118,5.5562 +Small,4x4,ldr-rgb-08.png,43.9030,0.0155,0.0040,16.4460 +Small,4x4,ldr-rgb-09.png,41.9060,0.0167,0.0050,13.1363 +Small,4x4,ldr-rgb-10.png,44.4833,0.0111,0.0011,15.0947 +Small,4x4,ldr-rgba-00.png,35.6074,0.0242,0.0116,5.6370 +Small,4x4,ldr-rgba-01.png,38.8915,0.0196,0.0073,8.9543 +Small,4x4,ldr-rgba-02.png,34.9103,0.0222,0.0096,6.8132 +Small,4x4,ldr-xy-00.png,37.6559,0.0182,0.0045,14.4924 +Small,4x4,ldr-xy-01.png,44.2121,0.0193,0.0055,11.8856 +Small,4x4,ldr-xy-02.png,48.3456,0.0173,0.0033,19.6341 +Small,4x4,ldrs-rgba-00.png,35.6094,0.0245,0.0118,5.5714 +Small,4x4,ldrs-rgba-01.png,38.8931,0.0175,0.0067,9.8199 +Small,4x4,ldrs-rgba-02.png,34.8940,0.0225,0.0097,6.7807 +Small,5x5,hdr-rgb-00.hdr,29.5408,0.1495,0.0128,5.1341 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0066,0.0003,0.8830 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0062,0.0003,0.8362 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0062,0.0003,0.8362 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0063,0.0003,0.8737 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0067,0.0003,0.8830 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0067,0.0003,0.9477 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0064,0.0003,0.8563 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0065,0.0003,0.8563 +Small,5x5,ldr-rgb-00.png,34.4428,0.0215,0.0083,7.8629 +Small,5x5,ldr-rgb-01.png,36.2681,0.0174,0.0055,11.8871 +Small,5x5,ldr-rgb-02.png,31.1084,0.0221,0.0089,7.3495 +Small,5x5,ldr-rgb-03.png,42.8306,0.0141,0.0020,32.8330 +Small,5x5,ldr-rgb-04.png,37.2853,0.0170,0.0047,13.8701 +Small,5x5,ldr-rgb-05.png,33.2825,0.0243,0.0118,5.5704 +Small,5x5,ldr-rgb-06.png,31.1484,0.0209,0.0088,7.4119 +Small,5x5,ldr-rgb-07.png,35.0995,0.0217,0.0094,6.9972 +Small,5x5,ldr-rgb-08.png,40.2476,0.0153,0.0034,19.1900 +Small,5x5,ldr-rgb-09.png,37.2955,0.0174,0.0048,13.6789 +Small,5x5,ldr-rgb-10.png,40.2090,0.0111,0.0010,16.8145 +Small,5x5,ldr-rgba-00.png,32.1528,0.0243,0.0120,5.4791 +Small,5x5,ldr-rgba-01.png,35.2203,0.0187,0.0064,10.3043 +Small,5x5,ldr-rgba-02.png,31.1534,0.0217,0.0093,7.0197 +Small,5x5,ldr-xy-00.png,36.7449,0.0181,0.0036,18.0248 +Small,5x5,ldr-xy-01.png,39.8543,0.0189,0.0047,14.0847 +Small,5x5,ldr-xy-02.png,43.9848,0.0177,0.0033,20.0100 +Small,5x5,ldrs-rgba-00.png,32.1509,0.0246,0.0120,5.4450 +Small,5x5,ldrs-rgba-01.png,35.2197,0.0194,0.0065,10.1588 +Small,5x5,ldrs-rgba-02.png,31.1463,0.0223,0.0093,7.0197 +Small,6x6,hdr-rgb-00.hdr,27.0804,0.1496,0.0134,4.8824 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0064,0.0003,0.8708 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0066,0.0003,0.8535 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0063,0.0003,0.8448 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0065,0.0003,0.8830 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0067,0.0003,0.8362 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0068,0.0003,0.8234 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0065,0.0003,0.8508 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0061,0.0003,0.8823 +Small,6x6,ldr-rgb-00.png,31.7206,0.0232,0.0109,6.0081 +Small,6x6,ldr-rgb-01.png,32.9366,0.0179,0.0071,9.2393 +Small,6x6,ldr-rgb-02.png,27.4940,0.0231,0.0104,6.3027 +Small,6x6,ldr-rgb-03.png,40.6226,0.0139,0.0022,30.2296 +Small,6x6,ldr-rgb-04.png,33.9446,0.0184,0.0058,11.3445 +Small,6x6,ldr-rgb-05.png,30.0005,0.0267,0.0144,4.5663 +Small,6x6,ldr-rgb-06.png,27.5678,0.0234,0.0105,6.2570 +Small,6x6,ldr-rgb-07.png,32.9834,0.0222,0.0097,6.7347 +Small,6x6,ldr-rgb-08.png,37.8944,0.0154,0.0035,18.6118 +Small,6x6,ldr-rgb-09.png,33.4981,0.0187,0.0060,10.9300 +Small,6x6,ldr-rgb-10.png,36.7079,0.0117,0.0011,14.1752 +Small,6x6,ldr-rgba-00.png,29.6014,0.0273,0.0147,4.4540 +Small,6x6,ldr-rgba-01.png,32.1034,0.0206,0.0078,8.3623 +Small,6x6,ldr-rgba-02.png,27.8517,0.0243,0.0110,5.9555 +Small,6x6,ldr-xy-00.png,35.8913,0.0187,0.0040,16.2371 +Small,6x6,ldr-xy-01.png,37.1368,0.0207,0.0057,11.4413 +Small,6x6,ldr-xy-02.png,41.9613,0.0168,0.0031,21.3879 +Small,6x6,ldrs-rgba-00.png,29.6022,0.0272,0.0147,4.4709 +Small,6x6,ldrs-rgba-01.png,32.0949,0.0203,0.0079,8.3261 +Small,6x6,ldrs-rgba-02.png,27.8391,0.0236,0.0111,5.9181 +Small,8x8,hdr-rgb-00.hdr,23.7860,0.1516,0.0177,3.7037 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0063,0.0003,0.8624 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0061,0.0003,0.8025 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0063,0.0003,0.8285 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0063,0.0003,0.7948 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0066,0.0003,0.8369 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0065,0.0003,0.8311 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0064,0.0003,0.8765 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0065,0.0003,0.8508 +Small,8x8,ldr-rgb-00.png,28.0746,0.0254,0.0127,5.1684 +Small,8x8,ldr-rgb-01.png,28.7937,0.0219,0.0096,6.8041 +Small,8x8,ldr-rgb-02.png,23.1086,0.0280,0.0152,4.3238 +Small,8x8,ldr-rgb-03.png,37.3624,0.0148,0.0024,27.0257 +Small,8x8,ldr-rgb-04.png,29.3811,0.0214,0.0090,7.3158 +Small,8x8,ldr-rgb-05.png,25.8265,0.0315,0.0180,3.6509 +Small,8x8,ldr-rgb-06.png,23.1833,0.0279,0.0156,4.2046 +Small,8x8,ldr-rgb-07.png,29.8952,0.0220,0.0100,6.5307 +Small,8x8,ldr-rgb-08.png,34.5261,0.0158,0.0040,16.2736 +Small,8x8,ldr-rgb-09.png,28.6875,0.0209,0.0082,7.9534 +Small,8x8,ldr-rgb-10.png,32.0105,0.0114,0.0015,10.6602 +Small,8x8,ldr-rgba-00.png,25.7145,0.0300,0.0174,3.7682 +Small,8x8,ldr-rgba-01.png,28.3047,0.0246,0.0112,5.8363 +Small,8x8,ldr-rgba-02.png,23.9459,0.0294,0.0163,4.0129 +Small,8x8,ldr-xy-00.png,33.2938,0.0211,0.0055,11.9699 +Small,8x8,ldr-xy-01.png,34.3730,0.0216,0.0066,9.9116 +Small,8x8,ldr-xy-02.png,39.8922,0.0169,0.0024,27.6760 +Small,8x8,ldrs-rgba-00.png,25.7105,0.0309,0.0175,3.7385 +Small,8x8,ldrs-rgba-01.png,28.2986,0.0245,0.0114,5.7407 +Small,8x8,ldrs-rgba-02.png,23.9396,0.0300,0.0167,3.9260 +Small,12x12,hdr-rgb-00.hdr,20.5382,0.1628,0.0263,2.4951 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0079,0.0003,0.8590 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0081,0.0003,0.8475 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0076,0.0003,0.8652 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0080,0.0003,0.8311 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0081,0.0003,0.7901 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0079,0.0003,0.8203 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0077,0.0003,0.8209 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0079,0.0003,0.8362 +Small,12x12,ldr-rgb-00.png,23.7948,0.0251,0.0107,6.1065 +Small,12x12,ldr-rgb-01.png,24.7851,0.0233,0.0078,8.4355 +Small,12x12,ldr-rgb-02.png,19.2303,0.0315,0.0179,3.6586 +Small,12x12,ldr-rgb-03.png,33.2866,0.0150,0.0017,39.3357 +Small,12x12,ldr-rgb-04.png,24.5840,0.0209,0.0074,8.8587 +Small,12x12,ldr-rgb-05.png,21.4892,0.0301,0.0158,4.1400 +Small,12x12,ldr-rgb-06.png,19.2330,0.0331,0.0191,3.4291 +Small,12x12,ldr-rgb-07.png,25.4183,0.0216,0.0076,8.6301 +Small,12x12,ldr-rgb-08.png,30.2497,0.0166,0.0030,21.5303 +Small,12x12,ldr-rgb-09.png,23.7480,0.0238,0.0096,6.7997 +Small,12x12,ldr-rgb-10.png,27.3233,0.0146,0.0023,7.1455 +Small,12x12,ldr-rgba-00.png,21.5940,0.0313,0.0175,3.7374 +Small,12x12,ldr-rgba-01.png,24.5318,0.0229,0.0096,6.8495 +Small,12x12,ldr-rgba-02.png,20.1834,0.0359,0.0207,3.1604 +Small,12x12,ldr-xy-00.png,29.2789,0.0222,0.0056,11.7429 +Small,12x12,ldr-xy-01.png,30.5408,0.0233,0.0050,13.0757 +Small,12x12,ldr-xy-02.png,37.9893,0.0180,0.0009,73.5558 +Small,12x12,ldrs-rgba-00.png,21.5954,0.0321,0.0178,3.6731 +Small,12x12,ldrs-rgba-01.png,24.5289,0.0243,0.0096,6.8145 +Small,12x12,ldrs-rgba-02.png,20.1810,0.0350,0.0208,3.1558 +Small,3x3x3,ldr-l-00-3.dds,50.2792,0.0206,0.0090,29.2641 +Small,3x3x3,ldr-l-01-3.dds,51.8778,0.0111,0.0036,19.0231 +Small,6x6x6,ldr-l-00-3.dds,32.5382,0.0651,0.0518,5.0619 +Small,6x6x6,ldr-l-01-3.dds,40.8480,0.0289,0.0192,3.5924 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse4.1_fastest_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse4.1_fastest_results.csv new file mode 100644 index 0000000..21269bc --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse4.1_fastest_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,33.3455,0.1442,0.0077,8.5467 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0057,0.0003,0.8337 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0058,0.0003,0.8737 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0057,0.0003,0.8926 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0058,0.0003,0.8652 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0059,0.0003,0.8859 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0055,0.0003,0.8765 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0057,0.0003,0.8369 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0059,0.0003,0.8311 +Small,4x4,ldr-rgb-00.png,37.2582,0.0162,0.0047,13.9645 +Small,4x4,ldr-rgb-01.png,39.5673,0.0155,0.0041,15.9183 +Small,4x4,ldr-rgb-02.png,34.8275,0.0177,0.0061,10.6998 +Small,4x4,ldr-rgb-03.png,45.4522,0.0132,0.0019,35.0654 +Small,4x4,ldr-rgb-04.png,41.7305,0.0147,0.0032,20.6489 +Small,4x4,ldr-rgb-05.png,36.8931,0.0186,0.0065,10.0057 +Small,4x4,ldr-rgb-06.png,35.0002,0.0181,0.0057,11.5238 +Small,4x4,ldr-rgb-07.png,37.4127,0.0182,0.0062,10.6439 +Small,4x4,ldr-rgb-08.png,43.0312,0.0139,0.0026,25.6105 +Small,4x4,ldr-rgb-09.png,41.7130,0.0148,0.0032,20.6086 +Small,4x4,ldr-rgb-10.png,43.9511,0.0100,0.0008,19.5590 +Small,4x4,ldr-rgba-00.png,34.7402,0.0183,0.0063,10.4807 +Small,4x4,ldr-rgba-01.png,38.6972,0.0162,0.0045,14.4323 +Small,4x4,ldr-rgba-02.png,34.6012,0.0189,0.0065,10.0563 +Small,4x4,ldr-xy-00.png,37.6162,0.0152,0.0032,20.4675 +Small,4x4,ldr-xy-01.png,43.9365,0.0177,0.0038,17.2554 +Small,4x4,ldr-xy-02.png,48.3672,0.0156,0.0026,24.8152 +Small,4x4,ldrs-rgba-00.png,34.7410,0.0181,0.0062,10.6254 +Small,4x4,ldrs-rgba-01.png,38.6987,0.0164,0.0045,14.5346 +Small,4x4,ldrs-rgba-02.png,34.5841,0.0185,0.0065,10.0965 +Small,5x5,hdr-rgb-00.hdr,28.8643,0.1432,0.0072,9.1364 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0057,0.0003,0.8889 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0062,0.0003,0.8508 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0059,0.0003,0.8285 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0060,0.0003,0.8597 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0060,0.0003,0.8765 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0058,0.0003,0.8708 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0060,0.0003,0.8889 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0062,0.0003,0.8362 +Small,5x5,ldr-rgb-00.png,33.7309,0.0175,0.0047,13.8262 +Small,5x5,ldr-rgb-01.png,36.0941,0.0158,0.0039,16.6341 +Small,5x5,ldr-rgb-02.png,31.0119,0.0185,0.0063,10.3552 +Small,5x5,ldr-rgb-03.png,42.4377,0.0133,0.0016,40.7046 +Small,5x5,ldr-rgb-04.png,37.0451,0.0162,0.0035,18.6080 +Small,5x5,ldr-rgb-05.png,32.9781,0.0189,0.0071,9.2908 +Small,5x5,ldr-rgb-06.png,31.0536,0.0178,0.0061,10.7525 +Small,5x5,ldr-rgb-07.png,34.4657,0.0186,0.0059,11.0477 +Small,5x5,ldr-rgb-08.png,39.6318,0.0141,0.0023,28.4966 +Small,5x5,ldr-rgb-09.png,37.0745,0.0159,0.0035,18.6548 +Small,5x5,ldr-rgb-10.png,39.9327,0.0105,0.0007,21.7905 +Small,5x5,ldr-rgba-00.png,31.1179,0.0189,0.0066,9.8657 +Small,5x5,ldr-rgba-01.png,35.0621,0.0164,0.0046,14.1580 +Small,5x5,ldr-rgba-02.png,31.0579,0.0194,0.0069,9.4609 +Small,5x5,ldr-xy-00.png,36.6252,0.0170,0.0029,22.8836 +Small,5x5,ldr-xy-01.png,39.2899,0.0180,0.0032,20.1834 +Small,5x5,ldr-xy-02.png,43.8853,0.0167,0.0026,24.8803 +Small,5x5,ldrs-rgba-00.png,31.1140,0.0190,0.0067,9.7989 +Small,5x5,ldrs-rgba-01.png,35.0617,0.0168,0.0047,14.0819 +Small,5x5,ldrs-rgba-02.png,31.0429,0.0202,0.0071,9.1736 +Small,6x6,hdr-rgb-00.hdr,26.7571,0.1439,0.0069,9.4405 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0058,0.0003,0.8049 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0061,0.0003,0.8369 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0060,0.0003,0.9138 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0059,0.0003,0.8448 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0059,0.0003,0.8680 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0063,0.0003,0.8055 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0061,0.0003,0.8918 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0054,0.0003,0.8680 +Small,6x6,ldr-rgb-00.png,31.3524,0.0178,0.0058,11.3953 +Small,6x6,ldr-rgb-01.png,32.8547,0.0165,0.0048,13.7853 +Small,6x6,ldr-rgb-02.png,27.4165,0.0199,0.0074,8.8453 +Small,6x6,ldr-rgb-03.png,40.3501,0.0131,0.0016,41.8766 +Small,6x6,ldr-rgb-04.png,33.7683,0.0161,0.0043,15.3443 +Small,6x6,ldr-rgb-05.png,29.7573,0.0206,0.0084,7.8019 +Small,6x6,ldr-rgb-06.png,27.4890,0.0183,0.0073,9.0269 +Small,6x6,ldr-rgb-07.png,32.3734,0.0178,0.0060,11.0035 +Small,6x6,ldr-rgb-08.png,37.5098,0.0139,0.0024,27.7458 +Small,6x6,ldr-rgb-09.png,33.3229,0.0163,0.0042,15.7876 +Small,6x6,ldr-rgb-10.png,36.5829,0.0096,0.0009,17.8442 +Small,6x6,ldr-rgba-00.png,28.8653,0.0198,0.0074,8.9032 +Small,6x6,ldr-rgba-01.png,32.0118,0.0171,0.0053,12.4188 +Small,6x6,ldr-rgba-02.png,27.7975,0.0194,0.0073,8.9321 +Small,6x6,ldr-xy-00.png,35.6703,0.0174,0.0034,19.2694 +Small,6x6,ldr-xy-01.png,36.5669,0.0175,0.0038,17.0615 +Small,6x6,ldr-xy-02.png,41.8230,0.0158,0.0025,26.1938 +Small,6x6,ldrs-rgba-00.png,28.8588,0.0196,0.0073,9.0009 +Small,6x6,ldrs-rgba-01.png,32.0060,0.0175,0.0054,12.1568 +Small,6x6,ldrs-rgba-02.png,27.7847,0.0197,0.0072,9.0782 +Small,8x8,hdr-rgb-00.hdr,23.6223,0.1460,0.0114,5.7654 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0067,0.0003,0.8708 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0066,0.0003,0.8337 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0064,0.0003,0.8652 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0064,0.0003,0.8830 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0063,0.0003,0.8618 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0064,0.0003,0.8772 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0064,0.0003,0.8535 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0067,0.0003,0.7995 +Small,8x8,ldr-rgb-00.png,27.7275,0.0213,0.0084,7.8037 +Small,8x8,ldr-rgb-01.png,28.7129,0.0193,0.0071,9.2043 +Small,8x8,ldr-rgb-02.png,23.0425,0.0240,0.0108,6.0890 +Small,8x8,ldr-rgb-03.png,37.0898,0.0135,0.0019,35.0654 +Small,8x8,ldr-rgb-04.png,29.1776,0.0192,0.0066,9.9601 +Small,8x8,ldr-rgb-05.png,25.6293,0.0254,0.0126,5.2066 +Small,8x8,ldr-rgb-06.png,23.0989,0.0242,0.0116,5.6727 +Small,8x8,ldr-rgb-07.png,29.5159,0.0190,0.0070,9.3569 +Small,8x8,ldr-rgb-08.png,34.0104,0.0149,0.0029,22.6144 +Small,8x8,ldr-rgb-09.png,28.4945,0.0189,0.0062,10.6562 +Small,8x8,ldr-rgb-10.png,31.9035,0.0110,0.0012,13.6147 +Small,8x8,ldr-rgba-00.png,25.3547,0.0235,0.0112,5.8456 +Small,8x8,ldr-rgba-01.png,28.2032,0.0209,0.0080,8.2063 +Small,8x8,ldr-rgba-02.png,23.8879,0.0246,0.0110,5.9351 +Small,8x8,ldr-xy-00.png,33.2442,0.0191,0.0041,15.8641 +Small,8x8,ldr-xy-01.png,34.2088,0.0198,0.0048,13.5997 +Small,8x8,ldr-xy-02.png,39.7685,0.0164,0.0017,38.4122 +Small,8x8,ldrs-rgba-00.png,25.3518,0.0245,0.0117,5.6008 +Small,8x8,ldrs-rgba-01.png,28.1928,0.0212,0.0079,8.2725 +Small,8x8,ldrs-rgba-02.png,23.8821,0.0237,0.0110,5.9336 +Small,12x12,hdr-rgb-00.hdr,20.4606,0.1524,0.0181,3.6282 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0072,0.0003,0.7995 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0076,0.0003,0.8260 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0074,0.0003,0.8079 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0076,0.0003,0.8502 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0075,0.0003,0.7781 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0075,0.0003,0.8369 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0074,0.0003,0.9272 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0072,0.0003,0.8260 +Small,12x12,ldr-rgb-00.png,23.7264,0.0213,0.0075,8.7720 +Small,12x12,ldr-rgb-01.png,24.7407,0.0192,0.0056,11.7827 +Small,12x12,ldr-rgb-02.png,19.1965,0.0255,0.0123,5.3269 +Small,12x12,ldr-rgb-03.png,33.1663,0.0140,0.0014,47.1408 +Small,12x12,ldr-rgb-04.png,24.3920,0.0197,0.0054,12.2016 +Small,12x12,ldr-rgb-05.png,21.3893,0.0257,0.0113,5.7940 +Small,12x12,ldr-rgb-06.png,19.1765,0.0273,0.0131,5.0070 +Small,12x12,ldr-rgb-07.png,25.3504,0.0188,0.0053,12.4284 +Small,12x12,ldr-rgb-08.png,30.1545,0.0164,0.0023,28.4700 +Small,12x12,ldr-rgb-09.png,23.5954,0.0216,0.0072,9.1595 +Small,12x12,ldr-rgb-10.png,27.2800,0.0129,0.0016,10.1795 +Small,12x12,ldr-rgba-00.png,21.3728,0.0261,0.0123,5.3446 +Small,12x12,ldr-rgba-01.png,24.4832,0.0214,0.0070,9.4214 +Small,12x12,ldr-rgba-02.png,20.1479,0.0298,0.0149,4.4115 +Small,12x12,ldr-xy-00.png,28.9003,0.0221,0.0042,15.6261 +Small,12x12,ldr-xy-01.png,29.7608,0.0213,0.0039,16.7568 +Small,12x12,ldr-xy-02.png,37.9676,0.0180,0.0009,75.7657 +Small,12x12,ldrs-rgba-00.png,21.3686,0.0264,0.0121,5.4369 +Small,12x12,ldrs-rgba-01.png,24.4810,0.0217,0.0071,9.2896 +Small,12x12,ldrs-rgba-02.png,20.1455,0.0289,0.0148,4.4419 +Small,3x3x3,ldr-l-00-3.dds,50.1595,0.0192,0.0086,30.5709 +Small,3x3x3,ldr-l-01-3.dds,51.8572,0.0104,0.0036,19.3116 +Small,6x6x6,ldr-l-00-3.dds,32.5210,0.0647,0.0521,5.0298 +Small,6x6x6,ldr-l-01-3.dds,40.8480,0.0285,0.0193,3.5692 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse4.1_medium_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse4.1_medium_results.csv new file mode 100644 index 0000000..0992fb4 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse4.1_medium_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.1456,0.1582,0.0209,3.1294 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0066,0.0003,0.8025 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0067,0.0003,0.8765 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0066,0.0003,0.8184 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0069,0.0003,0.8049 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0069,0.0003,0.8001 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0067,0.0003,0.8422 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0065,0.0003,0.8508 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0068,0.0003,0.8049 +Small,4x4,ldr-rgb-00.png,38.8513,0.0428,0.0294,2.2315 +Small,4x4,ldr-rgb-01.png,40.2580,0.0361,0.0232,2.8237 +Small,4x4,ldr-rgb-02.png,35.3269,0.0359,0.0236,2.7818 +Small,4x4,ldr-rgb-03.png,47.3369,0.0259,0.0133,4.9198 +Small,4x4,ldr-rgb-04.png,42.2423,0.0293,0.0171,3.8223 +Small,4x4,ldr-rgb-05.png,37.8450,0.0339,0.0217,3.0253 +Small,4x4,ldr-rgb-06.png,35.5074,0.0291,0.0169,3.8866 +Small,4x4,ldr-rgb-07.png,39.3473,0.0411,0.0286,2.2901 +Small,4x4,ldr-rgb-08.png,45.3043,0.0262,0.0147,4.4492 +Small,4x4,ldr-rgb-09.png,42.1529,0.0294,0.0172,3.8145 +Small,4x4,ldr-rgb-10.png,44.9880,0.0131,0.0023,7.0524 +Small,4x4,ldr-rgba-00.png,36.2682,0.0383,0.0257,2.5504 +Small,4x4,ldr-rgba-01.png,38.9989,0.0271,0.0144,4.5442 +Small,4x4,ldr-rgba-02.png,34.9755,0.0284,0.0159,4.1306 +Small,4x4,ldr-xy-00.png,37.8046,0.0275,0.0137,4.7743 +Small,4x4,ldr-xy-01.png,45.2627,0.0335,0.0201,3.2607 +Small,4x4,ldr-xy-02.png,51.3219,0.0386,0.0252,2.6048 +Small,4x4,ldrs-rgba-00.png,36.2670,0.0386,0.0262,2.5013 +Small,4x4,ldrs-rgba-01.png,38.9998,0.0267,0.0144,4.5599 +Small,4x4,ldrs-rgba-02.png,34.9622,0.0297,0.0172,3.8078 +Small,5x5,hdr-rgb-00.hdr,29.8960,0.1605,0.0222,2.9534 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0062,0.0003,0.8178 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0067,0.0003,0.8203 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0065,0.0003,0.8918 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0068,0.0003,0.8652 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0068,0.0003,0.8153 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0067,0.0003,0.8128 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0069,0.0003,0.8502 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0067,0.0003,0.8765 +Small,5x5,ldr-rgb-00.png,35.1560,0.0411,0.0276,2.3709 +Small,5x5,ldr-rgb-01.png,36.4651,0.0321,0.0190,3.4531 +Small,5x5,ldr-rgb-02.png,31.1519,0.0314,0.0185,3.5339 +Small,5x5,ldr-rgb-03.png,44.1065,0.0195,0.0074,8.8622 +Small,5x5,ldr-rgb-04.png,37.6960,0.0291,0.0165,3.9690 +Small,5x5,ldr-rgb-05.png,33.5625,0.0420,0.0290,2.2593 +Small,5x5,ldr-rgb-06.png,31.1954,0.0310,0.0184,3.5569 +Small,5x5,ldr-rgb-07.png,36.2028,0.0471,0.0345,1.9019 +Small,5x5,ldr-rgb-08.png,41.7251,0.0260,0.0141,4.6361 +Small,5x5,ldr-rgb-09.png,37.5911,0.0273,0.0148,4.4335 +Small,5x5,ldr-rgb-10.png,40.6060,0.0130,0.0024,6.6984 +Small,5x5,ldr-rgba-00.png,32.8029,0.0509,0.0346,1.8943 +Small,5x5,ldr-rgba-01.png,35.3460,0.0293,0.0164,3.9913 +Small,5x5,ldr-rgba-02.png,31.1673,0.0324,0.0188,3.4889 +Small,5x5,ldr-xy-00.png,37.0976,0.0285,0.0137,4.7878 +Small,5x5,ldr-xy-01.png,40.7362,0.0338,0.0189,3.4751 +Small,5x5,ldr-xy-02.png,49.2303,0.0290,0.0149,4.4114 +Small,5x5,ldrs-rgba-00.png,32.8008,0.0440,0.0313,2.0953 +Small,5x5,ldrs-rgba-01.png,35.3451,0.0305,0.0179,3.6666 +Small,5x5,ldrs-rgba-02.png,31.1597,0.0307,0.0180,3.6492 +Small,6x6,hdr-rgb-00.hdr,27.5178,0.1623,0.0247,2.6566 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0066,0.0003,0.7708 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0065,0.0003,0.7781 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0071,0.0003,0.8260 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0069,0.0003,0.7849 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0066,0.0003,0.8645 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0065,0.0003,0.8153 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0069,0.0003,0.8178 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0066,0.0003,0.8708 +Small,6x6,ldr-rgb-00.png,32.4055,0.0375,0.0252,2.6010 +Small,6x6,ldr-rgb-01.png,33.1088,0.0298,0.0175,3.7466 +Small,6x6,ldr-rgb-02.png,27.5242,0.0308,0.0188,3.4895 +Small,6x6,ldr-rgb-03.png,41.7669,0.0183,0.0055,11.8964 +Small,6x6,ldr-rgb-04.png,34.2170,0.0276,0.0147,4.4601 +Small,6x6,ldr-rgb-05.png,30.1610,0.0376,0.0256,2.5591 +Small,6x6,ldr-rgb-06.png,27.5989,0.0344,0.0214,3.0658 +Small,6x6,ldr-rgb-07.png,33.9304,0.0482,0.0356,1.8406 +Small,6x6,ldr-rgb-08.png,39.2751,0.0237,0.0109,6.0208 +Small,6x6,ldr-rgb-09.png,33.6804,0.0300,0.0168,3.9077 +Small,6x6,ldr-rgb-10.png,37.0384,0.0135,0.0026,6.2789 +Small,6x6,ldr-rgba-00.png,30.2356,0.0567,0.0429,1.5270 +Small,6x6,ldr-rgba-01.png,32.2252,0.0339,0.0207,3.1646 +Small,6x6,ldr-rgba-02.png,27.8666,0.0331,0.0201,3.2550 +Small,6x6,ldr-xy-00.png,36.2425,0.0262,0.0114,5.7493 +Small,6x6,ldr-xy-01.png,38.0098,0.0294,0.0140,4.6751 +Small,6x6,ldr-xy-02.png,46.1924,0.0256,0.0103,6.3851 +Small,6x6,ldrs-rgba-00.png,30.2304,0.0453,0.0325,2.0166 +Small,6x6,ldrs-rgba-01.png,32.2181,0.0303,0.0174,3.7749 +Small,6x6,ldrs-rgba-02.png,27.8512,0.0340,0.0206,3.1784 +Small,8x8,hdr-rgb-00.hdr,24.1376,0.1756,0.0351,1.8656 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0079,0.0003,0.8260 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0079,0.0003,0.8153 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0081,0.0003,0.8122 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0081,0.0003,0.7736 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0078,0.0003,0.7621 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0080,0.0003,0.8049 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0077,0.0003,0.8079 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0082,0.0003,0.8025 +Small,8x8,ldr-rgb-00.png,28.7714,0.0509,0.0371,1.7668 +Small,8x8,ldr-rgb-01.png,28.9669,0.0399,0.0259,2.5274 +Small,8x8,ldr-rgb-02.png,23.1676,0.0408,0.0266,2.4604 +Small,8x8,ldr-rgb-03.png,38.5942,0.0208,0.0068,9.6819 +Small,8x8,ldr-rgb-04.png,29.6864,0.0394,0.0246,2.6648 +Small,8x8,ldr-rgb-05.png,25.9572,0.0503,0.0376,1.7425 +Small,8x8,ldr-rgb-06.png,23.2220,0.0413,0.0273,2.3984 +Small,8x8,ldr-rgb-07.png,30.7945,0.0530,0.0395,1.6575 +Small,8x8,ldr-rgb-08.png,35.9533,0.0262,0.0122,5.3556 +Small,8x8,ldr-rgb-09.png,29.0250,0.0361,0.0223,2.9386 +Small,8x8,ldr-rgb-10.png,32.2021,0.0152,0.0036,4.5726 +Small,8x8,ldr-rgba-00.png,26.4617,0.0636,0.0478,1.3705 +Small,8x8,ldr-rgba-01.png,28.3979,0.0401,0.0260,2.5174 +Small,8x8,ldr-rgba-02.png,23.9546,0.0446,0.0301,2.1798 +Small,8x8,ldr-xy-00.png,34.0327,0.0337,0.0176,3.7277 +Small,8x8,ldr-xy-01.png,34.9901,0.0339,0.0175,3.7411 +Small,8x8,ldr-xy-02.png,41.7418,0.0274,0.0106,6.1727 +Small,8x8,ldrs-rgba-00.png,26.4585,0.0607,0.0461,1.4229 +Small,8x8,ldrs-rgba-01.png,28.3890,0.0396,0.0255,2.5748 +Small,8x8,ldrs-rgba-02.png,23.9483,0.0429,0.0289,2.2704 +Small,12x12,hdr-rgb-00.hdr,20.7711,0.2009,0.0538,1.2171 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0106,0.0003,0.7642 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0110,0.0003,0.7714 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0108,0.0003,0.7530 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0099,0.0003,0.8362 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0105,0.0003,0.8049 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0105,0.0003,0.8178 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0104,0.0003,0.7488 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0105,0.0003,0.8178 +Small,12x12,ldr-rgb-00.png,24.7065,0.0635,0.0466,1.4071 +Small,12x12,ldr-rgb-01.png,25.0522,0.0485,0.0328,1.9985 +Small,12x12,ldr-rgb-02.png,19.2748,0.0571,0.0416,1.5768 +Small,12x12,ldr-rgb-03.png,35.0223,0.0225,0.0075,8.7778 +Small,12x12,ldr-rgb-04.png,24.9003,0.0472,0.0293,2.2341 +Small,12x12,ldr-rgb-05.png,21.6546,0.0670,0.0507,1.2920 +Small,12x12,ldr-rgb-06.png,19.2632,0.0585,0.0428,1.5313 +Small,12x12,ldr-rgb-07.png,26.7793,0.0582,0.0433,1.5152 +Small,12x12,ldr-rgb-08.png,31.7409,0.0288,0.0132,4.9498 +Small,12x12,ldr-rgb-09.png,24.1684,0.0441,0.0289,2.2715 +Small,12x12,ldr-rgb-10.png,28.0441,0.0220,0.0081,2.0022 +Small,12x12,ldr-rgba-00.png,22.2726,0.0699,0.0526,1.2470 +Small,12x12,ldr-rgba-01.png,24.6716,0.0483,0.0326,2.0115 +Small,12x12,ldr-rgba-02.png,20.1919,0.0608,0.0452,1.4501 +Small,12x12,ldr-xy-00.png,30.2042,0.0393,0.0205,3.2031 +Small,12x12,ldr-xy-01.png,31.9775,0.0405,0.0220,2.9808 +Small,12x12,ldr-xy-02.png,38.5097,0.0241,0.0041,16.0157 +Small,12x12,ldrs-rgba-00.png,22.2700,0.0718,0.0546,1.1997 +Small,12x12,ldrs-rgba-01.png,24.6720,0.0477,0.0316,2.0709 +Small,12x12,ldrs-rgba-02.png,20.1895,0.0619,0.0458,1.4307 +Small,3x3x3,ldr-l-00-3.dds,51.2292,0.0245,0.0131,20.0721 +Small,3x3x3,ldr-l-01-3.dds,52.5354,0.0117,0.0040,17.1233 +Small,6x6x6,ldr-l-00-3.dds,32.9609,0.0832,0.0680,3.8560 +Small,6x6x6,ldr-l-01-3.dds,40.9534,0.0308,0.0194,3.5441 diff --git a/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse4.1_thorough_results.csv b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse4.1_thorough_results.csv new file mode 100644 index 0000000..7be420e --- /dev/null +++ b/ktx/external/astc-encoder/Test/Images/Small/astc_reference-5.0-sse4.1_thorough_results.csv @@ -0,0 +1,150 @@ +Image Set,Block Size,Name,PSNR,Total Time,Coding Time,Coding Rate +Small,4x4,hdr-rgb-00.hdr,34.4181,0.1719,0.0401,1.6346 +Small,4x4,hdr-rgb-r16.ktx,999.0000,0.0064,0.0003,0.8079 +Small,4x4,hdr-rgb-r32.ktx,999.0000,0.0063,0.0003,0.8645 +Small,4x4,hdr-rgb-rg16.ktx,999.0000,0.0066,0.0003,0.8448 +Small,4x4,hdr-rgb-rg32.ktx,999.0000,0.0066,0.0003,0.8311 +Small,4x4,hdr-rgb-rgb16.ktx,999.0000,0.0065,0.0003,0.8955 +Small,4x4,hdr-rgb-rgb32.ktx,999.0000,0.0063,0.0003,0.8708 +Small,4x4,hdr-rgba-rgba16.ktx,999.0000,0.0063,0.0003,0.9046 +Small,4x4,hdr-rgba-rgba32.ktx,999.0000,0.0065,0.0003,0.8395 +Small,4x4,ldr-rgb-00.png,39.1728,0.0585,0.0465,1.4095 +Small,4x4,ldr-rgb-01.png,40.4449,0.0559,0.0441,1.4853 +Small,4x4,ldr-rgb-02.png,35.5045,0.0529,0.0408,1.6052 +Small,4x4,ldr-rgb-03.png,47.8117,0.0539,0.0421,1.5580 +Small,4x4,ldr-rgb-04.png,42.3894,0.0487,0.0368,1.7820 +Small,4x4,ldr-rgb-05.png,38.0197,0.0569,0.0449,1.4590 +Small,4x4,ldr-rgb-06.png,35.6707,0.0476,0.0358,1.8325 +Small,4x4,ldr-rgb-07.png,39.9565,0.0673,0.0554,1.1836 +Small,4x4,ldr-rgb-08.png,45.9978,0.0514,0.0398,1.6478 +Small,4x4,ldr-rgb-09.png,42.3000,0.0524,0.0403,1.6260 +Small,4x4,ldr-rgb-10.png,45.1911,0.0148,0.0050,3.2669 +Small,4x4,ldr-rgba-00.png,36.7550,0.0613,0.0491,1.3342 +Small,4x4,ldr-rgba-01.png,39.1428,0.0462,0.0339,1.9311 +Small,4x4,ldr-rgba-02.png,35.0643,0.0461,0.0335,1.9549 +Small,4x4,ldr-xy-00.png,37.7684,0.0528,0.0395,1.6607 +Small,4x4,ldr-xy-01.png,45.5023,0.0581,0.0450,1.4569 +Small,4x4,ldr-xy-02.png,51.3360,0.0746,0.0611,1.0724 +Small,4x4,ldrs-rgba-00.png,36.7558,0.0608,0.0490,1.3377 +Small,4x4,ldrs-rgba-01.png,39.1418,0.0461,0.0339,1.9321 +Small,4x4,ldrs-rgba-02.png,35.0521,0.0461,0.0337,1.9449 +Small,5x5,hdr-rgb-00.hdr,30.3023,0.1639,0.0443,1.4792 +Small,5x5,hdr-rgb-r16.ktx,999.0000,0.0069,0.0004,0.7149 +Small,5x5,hdr-rgb-r32.ktx,999.0000,0.0066,0.0003,0.8985 +Small,5x5,hdr-rgb-rg16.ktx,999.0000,0.0072,0.0003,0.8563 +Small,5x5,hdr-rgb-rg32.ktx,999.0000,0.0067,0.0003,0.8475 +Small,5x5,hdr-rgb-rgb16.ktx,999.0000,0.0065,0.0003,0.9700 +Small,5x5,hdr-rgb-rgb32.ktx,999.0000,0.0066,0.0003,0.8680 +Small,5x5,hdr-rgba-rgba16.ktx,999.0000,0.0068,0.0002,1.0364 +Small,5x5,hdr-rgba-rgba32.ktx,999.0000,0.0068,0.0003,0.9084 +Small,5x5,ldr-rgb-00.png,35.4087,0.0655,0.0531,1.2347 +Small,5x5,ldr-rgb-01.png,36.5693,0.0580,0.0457,1.4332 +Small,5x5,ldr-rgb-02.png,31.2265,0.0511,0.0387,1.6931 +Small,5x5,ldr-rgb-03.png,44.6467,0.0592,0.0471,1.3926 +Small,5x5,ldr-rgb-04.png,37.8494,0.0532,0.0408,1.6045 +Small,5x5,ldr-rgb-05.png,33.7109,0.0653,0.0525,1.2481 +Small,5x5,ldr-rgb-06.png,31.2594,0.0489,0.0361,1.8153 +Small,5x5,ldr-rgb-07.png,36.7772,0.0774,0.0656,0.9994 +Small,5x5,ldr-rgb-08.png,42.4862,0.0576,0.0456,1.4379 +Small,5x5,ldr-rgb-09.png,37.7207,0.0585,0.0458,1.4306 +Small,5x5,ldr-rgb-10.png,40.7712,0.0164,0.0058,2.8203 +Small,5x5,ldr-rgba-00.png,33.1370,0.0707,0.0580,1.1292 +Small,5x5,ldr-rgba-01.png,35.4402,0.0510,0.0385,1.7021 +Small,5x5,ldr-rgba-02.png,31.2042,0.0497,0.0369,1.7753 +Small,5x5,ldr-xy-00.png,37.2094,0.0607,0.0470,1.3944 +Small,5x5,ldr-xy-01.png,41.5252,0.0701,0.0567,1.1564 +Small,5x5,ldr-xy-02.png,49.4271,0.0827,0.0689,0.9507 +Small,5x5,ldrs-rgba-00.png,33.1344,0.0713,0.0582,1.1256 +Small,5x5,ldrs-rgba-01.png,35.4371,0.0507,0.0380,1.7239 +Small,5x5,ldrs-rgba-02.png,31.2008,0.0496,0.0370,1.7719 +Small,6x6,hdr-rgb-00.hdr,27.7108,0.1811,0.0478,1.3713 +Small,6x6,hdr-rgb-r16.ktx,999.0000,0.0073,0.0003,0.8362 +Small,6x6,hdr-rgb-r32.ktx,999.0000,0.0071,0.0003,0.8502 +Small,6x6,hdr-rgb-rg16.ktx,999.0000,0.0071,0.0003,0.9076 +Small,6x6,hdr-rgb-rg32.ktx,999.0000,0.0068,0.0003,0.8422 +Small,6x6,hdr-rgb-rgb16.ktx,999.0000,0.0070,0.0003,0.8624 +Small,6x6,hdr-rgb-rgb32.ktx,999.0000,0.0071,0.0003,0.8508 +Small,6x6,hdr-rgba-rgba16.ktx,999.0000,0.0068,0.0003,0.9477 +Small,6x6,hdr-rgba-rgba32.ktx,999.0000,0.0071,0.0003,0.8680 +Small,6x6,ldr-rgb-00.png,32.6620,0.0717,0.0591,1.1093 +Small,6x6,ldr-rgb-01.png,33.2164,0.0626,0.0502,1.3059 +Small,6x6,ldr-rgb-02.png,27.5725,0.0550,0.0424,1.5460 +Small,6x6,ldr-rgb-03.png,42.5991,0.0533,0.0412,1.5889 +Small,6x6,ldr-rgb-04.png,34.3577,0.0562,0.0438,1.4977 +Small,6x6,ldr-rgb-05.png,30.3096,0.0688,0.0560,1.1700 +Small,6x6,ldr-rgb-06.png,27.6511,0.0525,0.0400,1.6398 +Small,6x6,ldr-rgb-07.png,34.4830,0.0833,0.0710,0.9227 +Small,6x6,ldr-rgb-08.png,40.0915,0.0520,0.0401,1.6345 +Small,6x6,ldr-rgb-09.png,33.8253,0.0600,0.0477,1.3730 +Small,6x6,ldr-rgb-10.png,37.2042,0.0182,0.0069,2.3485 +Small,6x6,ldr-rgba-00.png,30.5236,0.0781,0.0655,1.0005 +Small,6x6,ldr-rgba-01.png,32.2957,0.0567,0.0441,1.4873 +Small,6x6,ldr-rgba-02.png,27.9010,0.0535,0.0409,1.6027 +Small,6x6,ldr-xy-00.png,36.3195,0.0542,0.0405,1.6196 +Small,6x6,ldr-xy-01.png,38.0890,0.0704,0.0566,1.1574 +Small,6x6,ldr-xy-02.png,47.6556,0.0888,0.0744,0.8804 +Small,6x6,ldrs-rgba-00.png,30.5201,0.0785,0.0659,0.9944 +Small,6x6,ldrs-rgba-01.png,32.2889,0.0573,0.0443,1.4787 +Small,6x6,ldrs-rgba-02.png,27.8878,0.0539,0.0409,1.6020 +Small,8x8,hdr-rgb-00.hdr,24.3507,0.2019,0.0652,1.0050 +Small,8x8,hdr-rgb-r16.ktx,999.0000,0.0089,0.0004,0.7111 +Small,8x8,hdr-rgb-r32.ktx,999.0000,0.0101,0.0003,0.8279 +Small,8x8,hdr-rgb-rg16.ktx,999.0000,0.0089,0.0003,0.8535 +Small,8x8,hdr-rgb-rg32.ktx,999.0000,0.0088,0.0003,0.9240 +Small,8x8,hdr-rgb-rgb16.ktx,999.0000,0.0099,0.0003,0.8001 +Small,8x8,hdr-rgb-rgb32.ktx,999.0000,0.0097,0.0004,0.6649 +Small,8x8,hdr-rgba-rgba16.ktx,999.0000,0.0087,0.0003,0.8311 +Small,8x8,hdr-rgba-rgba32.ktx,999.0000,0.0090,0.0003,0.8031 +Small,8x8,ldr-rgb-00.png,28.9964,0.0933,0.0794,0.8250 +Small,8x8,ldr-rgb-01.png,29.0587,0.0788,0.0653,1.0044 +Small,8x8,ldr-rgb-02.png,23.2109,0.0727,0.0588,1.1152 +Small,8x8,ldr-rgb-03.png,39.4631,0.0393,0.0258,2.5430 +Small,8x8,ldr-rgb-04.png,29.8053,0.0711,0.0573,1.1428 +Small,8x8,ldr-rgb-05.png,26.0720,0.0857,0.0721,0.9094 +Small,8x8,ldr-rgb-06.png,23.2757,0.0711,0.0575,1.1401 +Small,8x8,ldr-rgb-07.png,31.2666,0.1033,0.0898,0.7300 +Small,8x8,ldr-rgb-08.png,36.6034,0.0553,0.0417,1.5708 +Small,8x8,ldr-rgb-09.png,29.1793,0.0630,0.0494,1.3261 +Small,8x8,ldr-rgb-10.png,32.3590,0.0217,0.0095,1.7182 +Small,8x8,ldr-rgba-00.png,26.7577,0.1022,0.0883,0.7422 +Small,8x8,ldr-rgba-01.png,28.4704,0.0756,0.0616,1.0646 +Small,8x8,ldr-rgba-02.png,23.9802,0.0698,0.0558,1.1749 +Small,8x8,ldr-xy-00.png,34.2040,0.0630,0.0480,1.3640 +Small,8x8,ldr-xy-01.png,35.2494,0.0658,0.0507,1.2937 +Small,8x8,ldr-xy-02.png,44.6459,0.0797,0.0646,1.0150 +Small,8x8,ldrs-rgba-00.png,26.7543,0.1028,0.0887,0.7387 +Small,8x8,ldrs-rgba-01.png,28.4623,0.0750,0.0613,1.0698 +Small,8x8,ldrs-rgba-02.png,23.9736,0.0696,0.0557,1.1760 +Small,12x12,hdr-rgb-00.hdr,21.0175,0.2402,0.1020,0.6428 +Small,12x12,hdr-rgb-r16.ktx,999.0000,0.0129,0.0003,0.7462 +Small,12x12,hdr-rgb-r32.ktx,999.0000,0.0129,0.0003,0.7803 +Small,12x12,hdr-rgb-rg16.ktx,999.0000,0.0126,0.0003,0.8285 +Small,12x12,hdr-rgb-rg32.ktx,999.0000,0.0124,0.0003,0.9337 +Small,12x12,hdr-rgb-rgb16.ktx,999.0000,0.0129,0.0003,0.9138 +Small,12x12,hdr-rgb-rgb32.ktx,999.0000,0.0124,0.0003,0.8311 +Small,12x12,hdr-rgba-rgba16.ktx,999.0000,0.0122,0.0003,0.8234 +Small,12x12,hdr-rgba-rgba32.ktx,999.0000,0.0129,0.0003,0.8475 +Small,12x12,ldr-rgb-00.png,25.0738,0.1226,0.1062,0.6171 +Small,12x12,ldr-rgb-01.png,25.1477,0.1006,0.0845,0.7757 +Small,12x12,ldr-rgb-02.png,19.2950,0.1100,0.0939,0.6979 +Small,12x12,ldr-rgb-03.png,36.2051,0.0428,0.0274,2.3946 +Small,12x12,ldr-rgb-04.png,25.0000,0.0931,0.0771,0.8496 +Small,12x12,ldr-rgb-05.png,21.7395,0.1114,0.0952,0.6882 +Small,12x12,ldr-rgb-06.png,19.3020,0.1069,0.0905,0.7245 +Small,12x12,ldr-rgb-07.png,27.1599,0.1267,0.1108,0.5915 +Small,12x12,ldr-rgb-08.png,32.5575,0.0538,0.0377,1.7373 +Small,12x12,ldr-rgb-09.png,24.3246,0.0869,0.0706,0.9276 +Small,12x12,ldr-rgb-10.png,28.2270,0.0316,0.0167,0.9714 +Small,12x12,ldr-rgba-00.png,22.7316,0.1306,0.1144,0.5729 +Small,12x12,ldr-rgba-01.png,24.7496,0.1044,0.0882,0.7427 +Small,12x12,ldr-rgba-02.png,20.2177,0.1071,0.0903,0.7254 +Small,12x12,ldr-xy-00.png,30.4621,0.0823,0.0648,1.0116 +Small,12x12,ldr-xy-01.png,32.2515,0.0653,0.0479,1.3686 +Small,12x12,ldr-xy-02.png,40.3186,0.0475,0.0301,2.1805 +Small,12x12,ldrs-rgba-00.png,22.7268,0.1298,0.1133,0.5786 +Small,12x12,ldrs-rgba-01.png,24.7447,0.1047,0.0882,0.7432 +Small,12x12,ldrs-rgba-02.png,20.2148,0.1060,0.0894,0.7329 +Small,3x3x3,ldr-l-00-3.dds,52.1052,0.0517,0.0405,6.4727 +Small,3x3x3,ldr-l-01-3.dds,54.5179,0.0265,0.0187,3.6874 +Small,6x6x6,ldr-l-00-3.dds,33.2856,0.1025,0.0859,3.0507 +Small,6x6x6,ldr-l-01-3.dds,41.6471,0.0330,0.0196,3.5228 diff --git a/ktx/external/astc-encoder/Test/Makefile b/ktx/external/astc-encoder/Test/Makefile new file mode 100644 index 0000000..2ffd335 --- /dev/null +++ b/ktx/external/astc-encoder/Test/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = DocSource +BUILDDIR = DocOut + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/ktx/external/astc-encoder/Test/astc_dump_binary.py b/ktx/external/astc-encoder/Test/astc_dump_binary.py new file mode 100644 index 0000000..1e83991 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_dump_binary.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2021-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. +# ----------------------------------------------------------------------------- +""" +The ``astc_dump_binary`` utility provides a wrapper around the ``objdump`` +utility to extract disassembly of specific functions. Currently only matches +the root name, for sake of command line sanity, so all overloads get dumped. + +Using __attribute__((noinline)) can be useful during profiling to stop any +functions of interest getting inlined once they get too small ... +""" + + +import argparse +import re +import shutil +import subprocess as sp +import sys + + +def run_objdump(binary, symbol): + """ + Run objdump on a single binary and extract the range for a given symbol. + + Output is printed to stdout. + + Args: + binary (str): The path of the binary file to process. + symbol (str): The symbol to match. + + Raises: + CalledProcessException: The ``objdump`` subprocess failed for any reason. + """ + args = [ + "objdump", "-C", + "-M", "intel", + "--no-show-raw", + "-d", "-S", + binary + ] + + result = sp.run(args, stdout=sp.PIPE, stderr=sp.PIPE, + check=True, universal_newlines=True) + + funcPattern = re.compile(r"^[0-9a-f]{16} <(.*?)\(.*\)>:$") + + funcLines = [] + funcActive = False + lines = result.stdout.splitlines() + + for line in lines: + match = funcPattern.match(line) + if match: + funcName = match.group(1) + if funcName == symbol: + funcActive = True + else: + funcActive = False + + if funcActive: + funcLines.append(line) + + print("\n".join(funcLines)) + +def parse_command_line(): + """ + Parse the command line. + + Returns: + Namespace: The parsed command line container. + """ + parser = argparse.ArgumentParser() + + parser.add_argument("binary", type=argparse.FileType("r"), + help="The new binary to dump") + + parser.add_argument("symbol", type=str, + help="The function name to dump") + + return parser.parse_args() + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + args = parse_command_line() + + # Preflight - check that size exists. Note that size might still fail at + # runtime later, e.g. if the binary is not of the correct format + path = shutil.which("objdump") + if not path: + print("ERROR: The 'objdump' utility is not installed on the PATH") + return 1 + + # Collect the data + try: + run_objdump(args.binary.name, args.symbol) + except sp.CalledProcessError as ex: + print("ERROR: The 'objdump' utility failed") + print(" %s" % ex.stderr.strip()) + return 1 + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_image_info.py b/ktx/external/astc-encoder/Test/astc_image_info.py new file mode 100644 index 0000000..1fc42f9 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_image_info.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2020 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. +# ----------------------------------------------------------------------------- +""" +The ``astc_image_info`` utility provides basic image query capabilities. It is +a modal command line utility, exposing multiple available operators. + +* ``info``: Query structural information about the image, such as image + dimensions, number of color channels, and the min/max of each channel. +* ``color``: Query the stored color value at a specific pixel coordinate, and + print the result in a variety of different formats. + +Both modes allow multiple images to be specified on the command line. +""" + +import argparse +import sys + +from PIL import Image + + +def main_color(args): + """ + Main function for the "color" mode. + + This mode prints the color at a specific pixel coordinate in each image. + The color value is printed in a variety of color formats (decimal, HTML + string, float). + + Args: + args (Namespace): The parsed command line arguments. + + Returns: + int: The process return code. + """ + retCode = 0 + + for i, image in enumerate(args.images): + if i != 0: + print("") + + img = Image.open(image.name) + x = args.location[0] + y = args.location[1] + + print(image.name) + print("=" * len(image.name)) + + if (x >= img.size[0]) or (y >= img.size[1]): + print("- ERROR: location out-of-bounds [%ux%u]" % img.size) + retCode = 1 + else: + color = img.getpixel((x, y)) + + # Print byte values + print("+ Byte: %s" % str(color)) + + # Print hex values + fmtString = "+ Hex: #" + ("%02X" * len(color)) + print(fmtString % color) + + # Print float values + parts = ["%g"] * len(color) + parts = ", ".join(parts) + fmtString = "+ Float: (" + parts + ")" + print(fmtString % tuple(float(x)/255.0 for x in color)) + + return retCode + + +def main_info(args): + """ + Main function for the "info" mode. + + This mode prints the basic metadata of an image: + + - the overall image size. + - the number of color channels. + - the min/max value in each color channel. + + Args: + args (Namespace): The parsed command line arguments. + + Returns: + int: The process return code. + """ + for i, image in enumerate(args.images): + if i != 0: + print("") + + img = Image.open(image.name) + minmax = img.getextrema() + + print(image.name) + print("=" * len(image.name)) + print("+ Size: %ux%u" % (img.size[0], img.size[1])) + print("+ Channels: %s" % ("".join(img.getbands()))) + for j, channel in enumerate(img.getbands()): + print(" + %s: %u - %u" % (channel, *minmax[j])) + + return 0 + + +def parse_loc(value): + """ + Command line argument parser for position arguments. + + Args: + value (str): The command line argument string to parse. Must be of the + form x", where both integers must be zero or positive. + + Returns: + list(int, int): The parsed location. + + Raises: + ArgumentTypeError: The value is not a valid location. + """ + error = argparse.ArgumentTypeError("%s is an invalid location" % value) + svalue = value.split("x") + + if len(svalue) != 2: + raise error + + try: + ivalue = [int(x) for x in svalue if int(x) >= 0] + except ValueError: + raise error + + if len(ivalue) != len(svalue): + raise error + + return ivalue + + +def parse_command_line(): + """ + Parse the command line. + + Returns: + Namespace: The parsed command line container. + """ + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers( + title="Operations") + + # Create the parser for the "pipette" command + parserA = subparsers.add_parser( + "color", + help="Print color at given coordinate") + + parserA.set_defaults(func=main_color) + + parserA.add_argument( + "location", metavar="loc", type=parse_loc, + help="The location spec XxY") + + parserA.add_argument( + "images", metavar="image", nargs="+", type=argparse.FileType("r"), + help="The images to query") + + # Create the parser for the "size" command + parserB = subparsers.add_parser( + "info", + help="Print image metadata info") + + parserB.set_defaults(func=main_info) + + parserB.add_argument( + "images", metavar="image", nargs="+", type=argparse.FileType("r"), + help="The images to query") + + # Cope with the user failing to specify any sub-command. Note on Python 3.8 + # we could use required=True on the add_subparsers call, but we cannot do + # this on 3.6 which is our current min-spec. + args = parser.parse_args() + if not hasattr(args, "func"): + parser.print_help() + return None + + return args + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + args = parse_command_line() + if args: + return args.func(args) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_image_sweep.py b/ktx/external/astc-encoder/Test/astc_image_sweep.py new file mode 100644 index 0000000..575a75a --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_image_sweep.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2021-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. +# ----------------------------------------------------------------------------- +""" +A benchmarking sweep helper, which can generate a performance-vs-quality sweep +for a single input images. Like other test functionality, this uses structured +image directory layouts for determining image settings to pass to the codec. +""" + +import argparse +import os +import platform +import sys + +import testlib.encoder as te +import testlib.image as ti + + +def parse_command_line(): + """ + Parse the command line. + + Returns: + Namespace: The parsed command line container. + """ + parser = argparse.ArgumentParser() + + # All reference encoders + parser.add_argument("--step", dest="step", default="10", type=int, help="step size") + parser.add_argument("--repeats", dest="repeats", type=int, default=1, help="repeats") + + parser.add_argument(dest="image", default=None, + help="select the test image to run") + + args = parser.parse_args() + return args + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + # Parse command lines + args = parse_command_line() + + blockSizes = ["4x4", "5x5", "6x6", "8x8", "10x10"] + repeats = max(args.repeats, 1) + step = max(args.step, 1) + + image = ti.TestImage(args.image) + codec = te.Encoder2x("avx2") + + print("Block Size, Quality, PSNR (dB), Coding Time (s), Coding Rate (MT/s)") + + for blockSize in blockSizes: + for quality in range(0, 101, args.step): + localRepeats = repeats + if quality < 20: + localRepeats = localRepeats * 2 + if quality < 40: + localRepeats = localRepeats * 2 + + results = codec.run_test(image, blockSize, f"{quality}", localRepeats, False) + psnr = results[0] + codingTime = results[2] + mts = results[3] + + print(f"{blockSize}, {quality}, {psnr}, {codingTime}, {mts}") + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_minify_test.sh b/ktx/external/astc-encoder/Test/astc_minify_test.sh new file mode 100644 index 0000000..27b6f50 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_minify_test.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +GOOD=astcenc-good.exe +BAD=astcenc-avx2.exe +BLOCK_SIZE=4x4 +QUALITY=-fastest + +./bin/${GOOD} -tl in.png out-good.png ${BLOCK_SIZE} ${QUALITY} -silent + +./bin/${BAD} -tl in.png out-bad.png ${BLOCK_SIZE} ${QUALITY} -silent + +compare out-good.png out-bad.png out-vs-out-diff.png +compare in.png out-bad.png out-vs-in-diff.png + +./bin/astc_test_autoextract ${BLOCK_SIZE} in.png out-good.png out-bad.png in-min.png + +./bin/${GOOD} -tl in-min.png out-min-good.png ${BLOCK_SIZE} ${QUALITY} -silent + +./bin/${BAD} -tl in-min.png out-min-bad.png ${BLOCK_SIZE} ${QUALITY} -silent + +compare out-min-good.png out-min-bad.png out-min-diff.png diff --git a/ktx/external/astc-encoder/Test/astc_profile_valgrind.py b/ktx/external/astc-encoder/Test/astc_profile_valgrind.py new file mode 100644 index 0000000..3cd0844 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_profile_valgrind.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2020-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. +# ----------------------------------------------------------------------------- +""" +A simple wrapper utility to run a callgrind profile over a test image, and +post-process the output into an call graph image. + +Only runs on Linux and requires the following tools available on the PATH: + + * valgrind + * gprof2dot + * dot +""" + + +import argparse +import os +import re +import subprocess as sp +import sys + +def postprocess_cga(lines, outfile): + """ + Postprocess the output of callgrind_annotate. + + Args: + lines ([str]): The output of callgrind_annotate. + outfile (str): The output file path to write. + """ + pattern = re.compile("^\s*([0-9,]+)\s+\([ 0-9.]+%\)\s+Source/(\S+):(\S+)\(.*\).*$") + + totalCost = 0.0 + functionTable = [] + functionMap = {} + + for line in lines: + line = line.strip() + match = pattern.match(line) + if not match: + continue + + cost = float(match.group(1).replace(",", "")) + sourceFile = match.group(2) + function = match.group(3) + + # Filter out library code we don't want to change + if function.startswith("stbi__"): + continue + + totalCost += cost + + # Accumulate the scores from functions in multiple call chains + if function in functionMap: + index = functionMap[function] + functionTable[index][1] += cost + functionTable[index][2] += cost + # Else add new functions to the end of the table + else: + functionMap[function] = len(functionTable) + functionTable.append([function, cost, cost]) + + # Sort the table by accumulated cost + functionTable.sort(key=lambda x: 101.0 - x[2]) + + for function in functionTable: + function[2] /= totalCost + function[2] *= 100.0 + + with open(outfile, "w") as fileHandle: + + totals = 0.0 + for function in functionTable: + # Omit entries less than 1% load + if function[2] < 1: + break + + totals += function[2] + fileHandle.write("%5.2f%% %s\n" % (function[2], function[0])) + + fileHandle.write("======\n") + fileHandle.write(f"{totals:5.2f}%\n") + + +def run_pass(image, noStartup, encoder, blocksize, quality): + """ + Run Valgrind on a single binary. + + Args: + image (str): The path of the image to compress. + noStartup (bool): Exclude startup from reported data. + encoder (str): The name of the encoder variant to run. + blocksize (str): The block size to use. + quality (str): The encoding quality to use. + + Raises: + CalledProcessException: Any subprocess failed. + """ + binary = "./bin/astcenc-%s" % encoder + args = ["valgrind", "--tool=callgrind", "--callgrind-out-file=callgrind.txt", + binary, "-cl", image, "out.astc", blocksize, quality, "-j", "1"] + + result = sp.run(args, check=True, universal_newlines=True) + + args = ["callgrind_annotate", "callgrind.txt"] + ret = sp.run(args, stdout=sp.PIPE, check=True, encoding="utf-8") + lines = ret.stdout.splitlines() + with open("perf_%s_cga.txt" % quality.replace("-", ""), "w") as handle: + handle.write("\n".join(lines)) + + postprocess_cga(lines, "perf_%s.txt" % quality.replace("-", "")) + + if noStartup: + args = ["gprof2dot", "--format=callgrind", "--output=out.dot", "callgrind.txt", + "-s", "-z", "compress_block(astcenc_contexti const&, image_block const&, unsigned char*, compression_working_buffers&)"] + else: + args = ["gprof2dot", "--format=callgrind", "--output=out.dot", "callgrind.txt", + "-s", "-z", "main"] + + result = sp.run(args, check=True, universal_newlines=True) + + args = ["dot", "-Tpng", "out.dot", "-o", "perf_%s.png" % quality.replace("-", "")] + result = sp.run(args, check=True, universal_newlines=True) + + os.remove("out.astc") + os.remove("out.dot") + os.remove("callgrind.txt") + + +def parse_command_line(): + """ + Parse the command line. + + Returns: + Namespace: The parsed command line container. + """ + parser = argparse.ArgumentParser() + + parser.add_argument("img", type=argparse.FileType("r"), + help="The image file to test") + + encoders = ["sse2", "sse4.1", "avx2"] + parser.add_argument("--encoder", dest="encoder", default="avx2", + choices=encoders, help="select encoder variant") + + testquant = [str(x) for x in range (0, 101, 10)] + testqual = ["-fastest", "-fast", "-medium", "-thorough", "-exhaustive"] + qualities = testqual + testquant + parser.add_argument("--test-quality", dest="quality", default="medium", + choices=qualities, help="select compression quality") + + parser.add_argument("--no-startup", dest="noStartup", default=False, + action="store_true", help="Exclude init") + + args = parser.parse_args() + + return args + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + args = parse_command_line() + run_pass(args.img.name, args.noStartup, args.encoder, "6x6", args.quality) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_quality_test.py b/ktx/external/astc-encoder/Test/astc_quality_test.py new file mode 100644 index 0000000..6d06419 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_quality_test.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2021-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. +# ----------------------------------------------------------------------------- +""" +The ``astc_quality_test`` utility provides a tool to sweep quality settings. +""" + +import numpy as np +import re +import subprocess as sp +import sys + + +def get_psnr_pattern(): + return r"\s*PSNR \(LDR-RGB\):\s*([0-9.]*) dB" + + +def get_coding_rate_pattern(): + return r"\s*Coding rate:\s*([0-9.]*) MT/s" + + +def parse_output(output): + # Regex pattern for image quality + patternPSNR = re.compile(get_psnr_pattern()) + patternCRate = re.compile(get_coding_rate_pattern()) + + # Extract results from the log + runPSNR = None + runCRate = None + + for line in output: + match = patternPSNR.match(line) + if match: + runPSNR = float(match.group(1)) + + match = patternCRate.match(line) + if match: + runCRate = float(match.group(1)) + + assert runPSNR is not None, "No coding PSNR found" + assert runCRate is not None, "No coding rate found" + return (runPSNR, runCRate) + +def execute(command): + """ + Run a subprocess with the specified command. + + Args: + command (list(str)): The list of command line arguments. + + Returns: + list(str): The output log (stdout) split into lines. + """ + try: + result = sp.run(command, stdout=sp.PIPE, stderr=sp.PIPE, + check=True, universal_newlines=True) + except (OSError, sp.CalledProcessError): + print("ERROR: Test run failed") + print(" + %s" % " ".join(command)) + qcommand = ["\"%s\"" % x for x in command] + print(" + %s" % ", ".join(qcommand)) + sys.exit(1) + + return result.stdout.splitlines() + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + for block in ("4x4", "5x5", "6x6", "8x8", "10x10"): + + for quality in range (0, 101, 2): + + resultsQ = [] + resultsS = [] + + if (quality < 40): + repeats = 20 + elif (quality < 75): + repeats = 10 + else: + repeats = 5 + + for _ in range(0, repeats): + command = [ + "./bin/astcenc-avx2", + "-tl", + "./Test/Images/Kodak/LDR-RGB/ldr-rgb-kodak23.png", + "/dev/null", + block, + "%s" % quality, + "-silent" + ] + + stdout = execute(command) + psnr, mts = parse_output(stdout) + resultsQ.append(psnr) + resultsS.append(mts) + + print("%s, %u, %0.3f, %0.3f" % (block, quality, np.mean(resultsS), np.mean(resultsQ))) + + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_size_binary.py b/ktx/external/astc-encoder/Test/astc_size_binary.py new file mode 100644 index 0000000..d757d75 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_size_binary.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2019-2020 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. +# ----------------------------------------------------------------------------- +""" +The ``astc_size_binary`` utility provides a wrapper around the Linux ``size`` +utility to view binary section sizes, and optionally compare the section sizes +of two binaries. Section sizes are given for code (``.text``), read-only data +(``.rodata``), and zero initialized data (``.bss``). All other sections are +ignored. + +A typical report comparing the size of a new binary against a reference looks +like this: + +.. code-block:: + + Code RO Data ZI Data + Ref 411298 374560 128576 + New 560530 89552 31744 + Abs D 149232 -285008 -96832 + Rel D 36.28% -76.09% -75.31% +""" + + +import argparse +import platform +import shutil +import subprocess as sp +import sys + + +def run_size_linux(binary): + """ + Run size on a single binary. + + Args: + binary (str): The path of the binary file to process. + + Returns: + tuple(int, int, int): A triplet of code size, read-only data size, and + zero-init data size, all in bytes. + + Raises: + CalledProcessException: The ``size`` subprocess failed for any reason. + """ + args = ["size", "--format=sysv", binary] + result = sp.run(args, stdout=sp.PIPE, stderr=sp.PIPE, + check=True, universal_newlines=True) + + data = {} + patterns = {"Code": ".text", "RO": ".rodata", "ZI": ".bss"} + + lines = result.stdout.splitlines() + for line in lines: + for key, value in patterns.items(): + if line.startswith(value): + size = float(line.split()[1]) + data[key] = size + + return (data["Code"], data["RO"], data["ZI"]) + + +def run_size_macos(binary): + """ + Run size on a single binary. + + Args: + binary (str): The path of the binary file to process. + + Returns: + tuple(int, int, int): A triplet of code size, read-only data size, and + zero-init data size, all in bytes. + + Raises: + CalledProcessException: The ``size`` subprocess failed for any reason. + """ + args = ["size", "-m", binary] + result = sp.run(args, stdout=sp.PIPE, stderr=sp.PIPE, + check=True, universal_newlines=True) + + code = 0 + dataRO = 0 + dataZI = 0 + + currentSegment = None + + lines = result.stdout.splitlines() + for line in lines: + line = line.strip() + + if line.startswith("Segment"): + parts = line.split() + assert len(parts) >= 3, parts + + currentSegment = parts[1] + size = int(parts[2]) + + if currentSegment == "__TEXT:": + code += size + + if currentSegment == "__DATA_CONST:": + dataRO += size + + if currentSegment == "__DATA:": + dataZI += size + + if line.startswith("Section"): + parts = line.split() + assert len(parts) >= 3, parts + + section = parts[1] + size = int(parts[2]) + + if currentSegment == "__TEXT:" and section == "__const:": + code -= size + dataRO += size + + return (code, dataRO, dataZI) + + +def parse_command_line(): + """ + Parse the command line. + + Returns: + Namespace: The parsed command line container. + """ + parser = argparse.ArgumentParser() + + parser.add_argument("bin", type=argparse.FileType("r"), + help="The new binary to size") + + parser.add_argument("ref", nargs="?", type=argparse.FileType("r"), + help="The reference binary to compare against") + + return parser.parse_args() + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + args = parse_command_line() + + # Preflight - check that size exists. Note that size might still fail at + # runtime later, e.g. if the binary is not of the correct format + path = shutil.which("size") + if not path: + print("ERROR: The 'size' utility is not installed on the PATH") + return 1 + + if platform.system() == "Darwin": + run_size = run_size_macos + else: + run_size = run_size_linux + + # Collect the data + try: + newSize = run_size(args.bin.name) + if args.ref: + refSize = run_size(args.ref.name) + except sp.CalledProcessError as ex: + print("ERROR: The 'size' utility failed") + print(" %s" % ex.stderr.strip()) + return 1 + + # Print the basic table of absolute values + print("%8s % 8s % 8s % 8s" % ("", "Code", "RO Data", "ZI Data")) + if args.ref: + print("%8s % 8u % 8u % 8u" % ("Ref", *refSize)) + print("%8s % 8u % 8u % 8u" % ("New", *newSize)) + + # Print the difference if we have a reference + if args.ref: + diffAbs = [] + diffRel = [] + for refVal, newVal in zip(refSize, newSize): + diff = newVal - refVal + diffAbs.append(diff) + diffRel.append((diff / refVal) * 100.0) + + dat = ("Abs D", diffAbs[0], diffAbs[1], diffAbs[2]) + print("%8s % 8u % 8u % 8u" % dat) + dat = ("Rel D", diffRel[0], diffRel[1], diffRel[2]) + print("%8s % 7.2f%% % 7.2f%% % 7.2f%%" % dat) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_test_competitive.py b/ktx/external/astc-encoder/Test/astc_test_competitive.py new file mode 100644 index 0000000..188f432 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_test_competitive.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 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. +# ----------------------------------------------------------------------------- +""" +This script is a simple test runner for sweeps on multiple compressors. +""" + +import os +import subprocess as sp +import re +import sys + +LOG_COMMANDS = False +LOG_PATTERN = re.compile(r"\s*Coding rate:\s*(.*)\s*MT/s") + +ISPC_BIN = "./Binaries/ISPC/ispc_astc.exe" +ISPC_QUALITY = ["rgba", "rgb"] + +ASTC_BIN = "./bin/astcenc-avx2" +ASTC_QUALITY = ["0", "8", "10", "20", "30", "40", "50", "60"] + +TEST_BLOCK_SIZES = ["4x4", "6x6", "8x8"] + +TEST_IMAGE = "./Test/Images/Kodak/LDR-RGB/ldr-rgb-kodak%02u.png" +TEST_RANGE = 24 +TEST_REPEATS = 5 + +OUT_CIMAGE = "out.astc" +OUT_DIMAGE = "out.png" + + +def run(command): + if LOG_COMMANDS: + print(" ".join(command)) + + return sp.run(command, capture_output=True, universal_newlines=True) + + +def run_astcenc(in_image, out_image, block_size, quality): + args = [ASTC_BIN, "-tl", in_image, out_image, block_size, quality, "-j", "1"] + result = run(args) + return float(LOG_PATTERN.search(result.stdout).group(1)) + + +def run_ispc(in_image, out_image, block_size, quality): + args = [ISPC_BIN, in_image, out_image, block_size, quality] + result = run(args) + return float(LOG_PATTERN.search(result.stdout).group(1)) + + +def decompress(in_image, out_image): + args = [ASTC_BIN, "-dl", in_image, out_image] + result = run(args) + os.remove(in_image) + + +def compare(in_image, out_image): + args = ["compare", "-metric", "PSNR", in_image, out_image, "diff.png"] + result = run(args) + os.remove("diff.png") + os.remove(out_image) + return float(result.stderr) + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + # ISPC Tests + for block_size in TEST_BLOCK_SIZES: + for quality in ISPC_QUALITY: + print(f"ISPC {quality} {block_size}") + print(f"ISPC {quality} {block_size}", file=sys.stderr) + for index in range(1, TEST_RANGE + 1): + result_rate = 0.0 + for repeat in range(0, TEST_REPEATS): + image = TEST_IMAGE % index + result_rate += run_ispc(image, OUT_CIMAGE, block_size, quality) + decompress(OUT_CIMAGE, OUT_DIMAGE) + result_error = compare(image, OUT_DIMAGE) + result_rate /= TEST_REPEATS + + print("%s,Kodak%02u,%0.4f,%0.4f" % (block_size, index, result_rate, result_error)) + + # ASTCENC Tests + for block_size in TEST_BLOCK_SIZES: + for quality in ASTC_QUALITY: + print(f"ASTC {quality} {block_size}") + print(f"ASTC {quality} {block_size}", file=sys.stderr) + for index in range(1, TEST_RANGE + 1): + result_rate = 0.0 + for repeat in range(0, TEST_REPEATS): + image = TEST_IMAGE % index + result_rate += run_astcenc(image, OUT_DIMAGE, block_size, quality) + result_error = compare(image, OUT_DIMAGE) + result_rate /= TEST_REPEATS + + print("%s,Kodak%02u,%0.4f,%0.4f" % (block_size, index, result_rate, result_error)) + + return 0 + + +if __name__ == "__main__": + try: + sys.exit(main()) + except sp.CalledProcessError as ex: + print(ex.stdout) + print(ex.stderr) diff --git a/ktx/external/astc-encoder/Test/astc_test_competitive_plot.py b/ktx/external/astc-encoder/Test/astc_test_competitive_plot.py new file mode 100644 index 0000000..d412713 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_test_competitive_plot.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 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. +# ----------------------------------------------------------------------------- +""" +This script is a simple test result plotter for sweeps on multiple compressors. +""" +import csv +import numpy as np +import matplotlib.pyplot as plt +import sys + +DATABASE = "competitive.csv" + + +class Series: + + def __init__(self, name, perf, qual): + self.name = name + self.perf = perf + self.qual = qual + + +def get_series(database, compressor, quality, block_size): + title = f"{compressor} {quality} {block_size}" + in_section = False + + perf = [] + qual = [] + + with open(database) as csvfile: + reader = csv.reader(csvfile) + for row in reader: + if len(row) == 1: + in_section = row[0] == title + continue + + if in_section: + perf.append(float(row[2])) + qual.append(float(row[3])) + + return (perf, qual) + + +def plot(block_size, series_set): + + for series in series_set: + plt.scatter(series.perf, series.qual, s=2, label=series.name) + + plt.xlabel("Speed (MT/s)") + plt.ylabel("PSNR dB") + plt.legend(loc='lower right', prop={'size': 6}) + + plt.tight_layout() + plt.savefig(f"ASTC_v_ISPC_{block_size}.png") + plt.clf() + + +def plot_diff(series_a, series_b): + + diff_perf = np.divide(series_a.perf, series_b.perf) + diff_qual = np.subtract(series_a.qual, series_b.qual) + label = f"{series_a.name} vs {series_b.name}" + + plt.scatter(diff_perf, diff_qual, s=2, c="#0091BD", label=label) + plt.scatter(np.mean(diff_perf), np.mean(diff_qual), s=10, c="#FFA500", marker="*") + + plt.axhline(y=0, color="r", linestyle="dotted", lw=0.5) + plt.axvline(x=1, color="r", linestyle="dotted", lw=0.5) + + plt.xlabel("Relative speed") + plt.ylabel("PSNR diff (dB)") + plt.legend(loc='lower right', prop={'size': 6}) + + plt.tight_layout() + file_name = label.replace(" ", "_") + ".png" + plt.savefig(file_name) + plt.clf() + + +def main(): + + block_sizes = ["4x4", "6x6", "8x8"] + + for block_size in block_sizes: + series_set = [] + + perf, qual = get_series(DATABASE, "ISPC", "rgba", block_size) + series_set.append(Series(f"{block_size} IPSC Slow", perf, qual)) + + perf, qual = get_series(DATABASE, "ISPC", "rgb", block_size) + series_set.append(Series(f"{block_size} IPSC Fast", perf, qual)) + + perf, qual = get_series(DATABASE, "ASTC", "60", block_size) + series_set.append(Series(f"{block_size} ASTC 60", perf, qual)) + + perf, qual = get_series(DATABASE, "ASTC", "50", block_size) + series_set.append(Series(f"{block_size} ASTC 50", perf, qual)) + + perf, qual = get_series(DATABASE, "ASTC", "10", block_size) + series_set.append(Series(f"{block_size} ASTC 10", perf, qual)) + + perf, qual = get_series(DATABASE, "ASTC", "8", block_size) + series_set.append(Series(f"{block_size} ASTC 8", perf, qual)) + + plot(block_size, series_set) + + plot_diff(series_set[3], series_set[0]) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_test_functional.py b/ktx/external/astc-encoder/Test/astc_test_functional.py new file mode 100644 index 0000000..8019803 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_test_functional.py @@ -0,0 +1,2202 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2020-2025 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. +# ----------------------------------------------------------------------------- +""" +The functional test runner is a set of tests that validate the ``astcenc`` +command line is correctly handled, under both valid and invalid usage +scenarios. These tests do NOT validate the compression codec itself, beyond +some very basic incidental usage needed to validate the command line. + +Due to the need to validate pixel colors in test images for both LDR and HDR +images, these tests rely on an HDRI-enabled build of ImageMagic being available +on the system path. To test if the version of ImageMagic on your system is +HDRI-enabled run: + + convert --version + +... and check that the string "HDRI" is present in the listed features. + +Test Tiles +========== + +Some basic test images, each 8x8 texels and built up from 4 no. 4x4 texel +constant color blocks, are used to help determine that the command line is +being processed correctly. + +LDR Test Pattern +---------------- + +LDR images are an 8x8 image containing 4 4x4 constant color blocks. Assuming +(0, 0) is the top left (TL), the component uncompressed block colors are: + +* (0, 0) TL = Black, opaque = (0.00, 0.00, 0.00, 1.00) +* (7, 0) TR = Red, opaque = (1.00, 0.00, 0.00, 1.00) +* (0, 7) BL = White, opaque = (1.00, 1.00, 1.00, 1.00) +* (7, 7) BR = Green, trans = (0.25, 0.75, 0.00, 0.87) + +HDR Test Pattern +---------------- + +HDR images are an 8x8 image containing 4 4x4 constant color blocks. Assuming +(0, 0) is the top left (TL), the component uncompressed block colors are: + +* (0, 0) TL = LDR Black, opaque = (0.00, 0.00, 0.00, 1.00) +* (7, 0) TR = HDR Red, opaque = (8.00, 0.00, 0.00, 1.00) +* (0, 7) BL = HDR White, opaque = (3.98, 3.98, 3.98, 1.00) +* (7, 7) BR = LDR Green, trans = (0.25, 0.75, 0.00, 0.87) +""" + +import argparse +import filecmp +import os +import re +import signal +import string +import subprocess as sp +import sys +import tempfile +import time +import unittest + +import numpy +from PIL import Image + +import testlib.encoder as te +import testlib.image as tli + +# Enable these to always write out, irrespective of test result +ASTCENC_CLI_ALWAYS = False +ASTCENC_LOG_ALWAYS = False + +# Enable these to write out on failure for positive tests +ASTCENC_CLI_ON_ERROR = True +ASTCENC_LOG_ON_ERROR = True + +# Enable these to write out on failure for negative tests +ASTCENC_CLI_ON_ERROR_NEG = True +ASTCENC_LOG_ON_ERROR_NEG = True + +# LDR test pattern +ASTCENC_TEST_PATTERN_LDR = { + "TL": (0.00, 0.00, 0.00, 1.00), + "TR": (1.00, 0.00, 0.00, 1.00), + "BL": (1.00, 1.00, 1.00, 1.00), + "BR": (0.25, 0.75, 0.00, 0.87) +} + +# HDR test pattern +ASTCENC_TEST_PATTERN_HDR = { + "TL": (0.00, 0.00, 0.00, 1.00), + "TR": (8.00, 0.00, 0.00, 1.00), + "BL": (3.98, 3.98, 3.98, 1.00), + "BR": (0.25, 0.75, 0.00, 0.87) +} + +LDR_RGB_PSNR_PATTERN = re.compile(r"\s*PSNR \(LDR-RGB\): (.*) dB") + +g_TestEncoder = "avx2" + +class CLITestBase(unittest.TestCase): + """ + Command line interface base class. + + These tests are designed to test the command line is handled correctly. + They are not detailed tests of the codec itself; only basic sanity checks + that some type of processing occurred are used. + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + encoder = te.Encoder2x(g_TestEncoder) + self.binary = encoder.binary + + def setUp(self): + """ + Set up a test case. + + Create a new temporary directory for output files. + """ + self.tempDir = tempfile.TemporaryDirectory() + + def tearDown(self): + """ + Tear down a test case. + + Clean up the temporary directory created for output files. + """ + self.tempDir.cleanup() + self.tempDir = None + + @staticmethod + def get_ref_image_path(profile, mode, image): + """ + Get the path of a reference image on disk. + + Args: + profile (str): The color profile. + mode (str): The type of image to load. + image (str): The image variant to load. + + Returns: + str: The path to the test image file on disk. + """ + nameMux = { + "LDR": { + "input": "png", + "comp": "astc" + }, + "LDRS": { + "input": "png", + "comp": "astc" + }, + "HDR": { + "input": "exr", + "comp": "astc" + } + } + + assert profile in nameMux.keys() + assert mode in nameMux["LDR"].keys() + + scriptDir = os.path.dirname(__file__) + fileName = "%s-%s-1x1.%s" % (profile, image, nameMux[profile][mode]) + return os.path.join(scriptDir, "Data", fileName) + + def get_tmp_image_path(self, profile, mode): + """ + Get the path of a temporary output image on disk. + + Temporary files are automatically cleaned up when the test tearDown + occurs. + + Args: + profile (str): The color profile. "EXP" means explicit which means + the "mode" parameter is interpreted as a literal file + extension not a symbolic mode. + mode (str): The type of image to load. + + Returns: + str: The path to the test image file on disk. + """ + # Handle explicit mode + if profile == "EXP": + tmpFile, tmpPath = tempfile.mkstemp(mode, dir=self.tempDir.name) + os.close(tmpFile) + os.remove(tmpPath) + return tmpPath + + # Handle symbolic modes + nameMux = { + "LDR": { + "comp": ".astc", + "decomp": ".png", + "bad": ".foo" + }, + "LDRS": { + "comp": ".astc", + "decomp": ".png", + "bad": ".foo" + }, + "HDR": { + "comp": ".astc", + "decomp": ".exr", + "bad": ".foo" + } + } + + assert profile in nameMux.keys() + assert mode in nameMux["LDR"].keys() + + suffix = nameMux[profile][mode] + tmpFile, tmpPath = tempfile.mkstemp(suffix, dir=self.tempDir.name) + os.close(tmpFile) + os.remove(tmpPath) + return tmpPath + + +class CLIPTest(CLITestBase): + """ + Command line interface positive tests. + + These tests are designed to test the command line is handled correctly. + They are not detailed tests of the codec itself; only basic sanity checks + that some type of processing occurred are used. + """ + + def compare(self, image1, image2): + """ + Utility function to compare two images. + + Note that this comparison tests only decoded color values; any file + metadata is ignored, and encoding methods are not compared. + + Args: + image1 (str): Path to the first image. + image2 (str): Path to the second image. + + Returns: + bool: ``True` if the images are the same, ``False`` otherwise. + """ + img1 = Image.open(image1) + img2 = Image.open(image2) + + # Images must have same size + if img1.size != img2.size: + print("Size") + return False + + # Images must have same number of color channels + if img1.getbands() != img2.getbands(): + # ... unless the only different is alpha + self.assertEqual(img1.getbands(), ("R", "G", "B")) + self.assertEqual(img2.getbands(), ("R", "G", "B", "A")) + + # ... and the alpha is always one + bands = img2.split() + alphaHist = bands[3].histogram() + self.assertEqual(sum(alphaHist[:-1]), 0) + + # Generate a version of img2 without alpha + img2 = Image.merge("RGB", (bands[0], bands[1], bands[2])) + + # Compute sum of absolute differences + dat1 = numpy.array(img1) + dat2 = numpy.array(img2) + sad = numpy.sum(numpy.abs(dat1 - dat2)) + + if sad != 0: + print(img1.load()[0, 0]) + print(img2.load()[0, 0]) + + return sad == 0 + + def get_channel_rmse(self, image1, image2): + """ + Get the channel-by-channel root mean square error. + + Args: + image1 (str): Path to the first image. + image2 (str): Path to the second image. + + Returns: + tuple: Tuple of floats containing the RMSE per channel. + None: Images could not be compared because they are different size. + """ + img1 = Image.open(image1) + img2 = Image.open(image2) + + # Images must have same size + if img1.size != img2.size: + return None + + # Images must have same number of color channels + if img1.getbands() != img2.getbands(): + # ... unless the only different is alpha + self.assertEqual(img1.getbands(), ("R", "G", "B")) + self.assertEqual(img2.getbands(), ("R", "G", "B", "A")) + + # ... and the alpha is always one + bands = img2.split() + alphaHist = bands[3].histogram() + self.assertEqual(sum(alphaHist[:-1]), 0) + + # Generate a version of img2 without alpha + img2 = Image.merge("RGB", (bands[0], bands[1], bands[2])) + + # Compute root mean square error + img1bands = img1.split() + img2bands = img2.split() + + rmseVals = [] + imgBands = zip(img1bands, img2bands) + for img1Ch, img2Ch in imgBands: + imSz = numpy.prod(img1Ch.size) + dat1 = numpy.array(img1Ch) + dat2 = numpy.array(img2Ch) + + sad = numpy.sum(numpy.square(dat1 - dat2)) + mse = numpy.divide(sad, imSz) + rmse = numpy.sqrt(mse) + rmseVals.append(rmse) + + return rmseVals + + @staticmethod + def get_color_refs(mode, corners): + """ + Build a set of reference colors from apriori color list. + + Args: + mode (str): The color mode (LDR, or HDR) + corners (str or list): The corner or list of corners -- named TL, + TR, BL, and BR -- to return. + + Returns: + tuple: The color value, if corners was a name. + [tuple]: List of color values, if corners was a list of names. + """ + modes = { + "LDR": ASTCENC_TEST_PATTERN_LDR, + "HDR": ASTCENC_TEST_PATTERN_HDR + } + + if isinstance(corners, str): + return [modes[mode][corners]] + + return [modes[mode][corner] for corner in corners] + + def assertColorSame(self, colorRef, colorNew, threshold=0.02, swiz=None): + """ + Test if a color is the similar to a reference. + + Will trigger a test failure if the colors are not within threshold. + + Args: + colorRef (tuple): The reference color to compare with. + colorNew (tuple): The new color. + threshold (float): The allowed deviation from colorRef (ratio). + swiz (str): The swizzle string (4 characters from the set + `rgba01`), applied to the reference color. + """ + self.assertEqual(len(colorRef), len(colorNew)) + + # Swizzle the reference color if needed + if swiz: + self.assertEqual(len(swiz), len(colorRef)) + + remap = { + "0": len(colorRef), + "1": len(colorRef) + 1 + } + + if len(colorRef) >= 1: + remap["r"] = 0 + if len(colorRef) >= 2: + remap["g"] = 1 + if len(colorRef) >= 3: + remap["b"] = 2 + if len(colorRef) >= 4: + remap["a"] = 3 + + colorRefExt = list(colorRef) + [0.0, 1.0] + colorRef = [colorRefExt[remap[s]] for s in swiz] + + for chRef, chNew in zip(colorRef, colorNew): + deltaMax = chRef * threshold + self.assertAlmostEqual(chRef, chNew, delta=deltaMax) + + def exec(self, command, pattern=None): + """ + Execute a positive test. + + Will trigger a test failure if the subprocess return code is any value + other than zero. + + Args: + command (list(str)): The command to execute. + pattern (re.Pattern): The regex pattern to search for, must + contain a single group (this is returned to the caller). The + test will fail if no pattern match is found. + + Returns: + str: The stdout output of the child process, or the first group + from the passed regex pattern. + """ + try: + result = sp.run(command, stdout=sp.PIPE, stderr=sp.PIPE, + universal_newlines=True, check=True) + error = False + except sp.CalledProcessError as ex: + result = ex + error = True + + # Emit debug logging if needed + if ASTCENC_CLI_ALWAYS or (error and ASTCENC_CLI_ON_ERROR): + # Format for shell replay + print("\n" + " ".join(command)) + # Format for script command list replay + print("\n" + ", ".join(("\"%s\"" % x for x in command))) + + if ASTCENC_LOG_ALWAYS or (error and ASTCENC_LOG_ON_ERROR): + print(result.stdout) + + rcode = result.returncode + + if rcode < 0: + msg = "Exec died with signal %s" % signal.Signals(-rcode).name + self.assertGreaterEqual(rcode, 0, msg) + + if rcode > 0: + msg = "Exec died with application error %u" % rcode + self.assertEqual(rcode, 0, msg) + + # If there is a regex pattern provided, then search for it + if pattern: + match = pattern.search(result.stdout) + self.assertIsNotNone(match) + return match.group(1) + + return result.stdout + + def test_ldr_compress(self): + """ + Test basic LDR compression. + """ + imIn = self.get_ref_image_path("LDR", "input", "A") + imOut = self.get_tmp_image_path("LDR", "comp") + imRef = self.get_ref_image_path("LDR", "comp", "A") + + command = [self.binary, "-cl", imIn, imOut, "6x6", "-exhaustive"] + self.exec(command) + self.assertTrue(filecmp.cmp(imRef, imOut, False)) + + def test_srgb_compress(self): + """ + Test basic LDR sRGB compression. + """ + imIn = self.get_ref_image_path("LDRS", "input", "A") + imOut = self.get_tmp_image_path("LDRS", "comp") + imRef = self.get_ref_image_path("LDRS", "comp", "A") + + command = [self.binary, "-cs", imIn, imOut, "6x6", "-exhaustive"] + self.exec(command) + self.assertTrue(filecmp.cmp(imRef, imOut, False)) + + def test_hdr_compress1(self): + """ + Test basic HDR + LDR alpha compression. + """ + imIn = self.get_ref_image_path("HDR", "input", "A") + imOut = self.get_tmp_image_path("HDR", "comp") + imRef = self.get_ref_image_path("HDR", "comp", "A") + + command = [self.binary, "-ch", imIn, imOut, "6x6", "-exhaustive"] + self.exec(command) + self.assertTrue(filecmp.cmp(imRef, imOut, False)) + + def test_hdr_compress2(self): + """ + Test basic HDR + HDR alpha compression. + """ + imIn = self.get_ref_image_path("HDR", "input", "A") + imOut = self.get_tmp_image_path("HDR", "comp") + imRef = self.get_ref_image_path("HDR", "comp", "A") + + command = [self.binary, "-cH", imIn, imOut, "6x6", "-exhaustive"] + self.exec(command) + self.assertTrue(filecmp.cmp(imRef, imOut, False)) + + def test_ldr_decompress(self): + """ + Test basic LDR decompression. + """ + imIn = self.get_ref_image_path("LDR", "comp", "A") + imOut = self.get_tmp_image_path("LDR", "decomp") + imRef = self.get_ref_image_path("LDR", "input", "A") + + command = [self.binary, "-dl", imIn, imOut] + self.exec(command) + self.assertTrue(self.compare(imRef, imOut)) + + def test_srgb_decompress(self): + """ + Test basic LDR sRGB decompression. + """ + imIn = self.get_ref_image_path("LDRS", "comp", "A") + imOut = self.get_tmp_image_path("LDRS", "decomp") + imRef = self.get_ref_image_path("LDRS", "input", "A") + + command = [self.binary, "-ds", imIn, imOut] + self.exec(command) + self.assertTrue(self.compare(imRef, imOut)) + + def test_hdr_decompress1(self): + """ + Test basic HDR + LDR alpha decompression. + """ + imIn = self.get_ref_image_path("HDR", "comp", "A") + imOut = self.get_tmp_image_path("HDR", "decomp") + imRef = self.get_ref_image_path("HDR", "input", "A") + + command = [self.binary, "-dh", imIn, imOut] + self.exec(command) + + colRef = tli.Image(imRef).get_colors((0, 0)) + colOut = tli.Image(imOut).get_colors((0, 0)) + self.assertColorSame(colRef, colOut) + + def test_hdr_decompress2(self): + """ + Test basic HDR + HDR alpha decompression. + """ + imIn = self.get_ref_image_path("HDR", "comp", "A") + imOut = self.get_tmp_image_path("HDR", "decomp") + imRef = self.get_ref_image_path("HDR", "input", "A") + + command = [self.binary, "-dH", imIn, imOut] + self.exec(command) + + colRef = tli.Image(imRef).get_colors((0, 0)) + colOut = tli.Image(imOut).get_colors((0, 0)) + self.assertColorSame(colRef, colOut) + + def test_ldr_roundtrip(self): + """ + Test basic LDR round-trip + """ + imIn = self.get_ref_image_path("LDR", "input", "A") + imOut = self.get_tmp_image_path("LDR", "decomp") + + command = [self.binary, "-tl", imIn, imOut, "6x6", "-exhaustive"] + self.exec(command) + self.assertTrue(self.compare(imIn, imOut)) + + def test_srgb_roundtrip(self): + """ + Test basic LDR sRGB round-trip + """ + imIn = self.get_ref_image_path("LDRS", "input", "A") + imOut = self.get_tmp_image_path("LDRS", "decomp") + + command = [self.binary, "-ts", imIn, imOut, "6x6", "-exhaustive"] + self.exec(command) + self.assertTrue(self.compare(imIn, imOut)) + + def test_hdr_roundtrip1(self): + """ + Test basic HDR + LDR alpha round-trip. + """ + imIn = self.get_ref_image_path("HDR", "input", "A") + imOut = self.get_tmp_image_path("HDR", "decomp") + + command = [self.binary, "-th", imIn, imOut, "6x6", "-exhaustive"] + self.exec(command) + colIn = tli.Image(imIn).get_colors((0, 0)) + colOut = tli.Image(imOut).get_colors((0, 0)) + self.assertColorSame(colIn, colOut) + + def test_hdr_roundtrip2(self): + """ + Test basic HDR + HDR alpha round-trip. + """ + imIn = self.get_ref_image_path("HDR", "input", "A") + imOut = self.get_tmp_image_path("HDR", "decomp") + + command = [self.binary, "-tH", imIn, imOut, "6x6", "-exhaustive"] + self.exec(command) + colIn = tli.Image(imIn).get_colors((0, 0)) + colOut = tli.Image(imOut).get_colors((0, 0)) + self.assertColorSame(colIn, colOut) + + def test_valid_2d_block_sizes(self): + """ + Test all valid block sizes are accepted (2D images). + """ + blockSizes = [ + "4x4", "5x4", "5x5", "6x5", "6x6", "8x5", "8x6", + "10x5", "10x6", "8x8", "10x8", "10x10", "12x10", "12x12" + ] + + imIn = self.get_ref_image_path("LDR", "input", "A") + imOut = self.get_tmp_image_path("LDR", "decomp") + + for blk in blockSizes: + with self.subTest(blockSize=blk): + command = [self.binary, "-tl", imIn, imOut, blk, "-exhaustive"] + self.exec(command) + colIn = tli.Image(imIn).get_colors((0, 0)) + colOut = tli.Image(imOut).get_colors((0, 0)) + self.assertColorSame(colIn, colOut) + + def test_valid_3d_block_sizes(self): + """ + Test all valid block sizes are accepted (3D images). + """ + blockSizes = [ + "3x3x3", + "4x3x3", "4x4x3", "4x4x4", + "5x4x4", "5x5x4", "5x5x5", + "6x5x5", "6x6x5", "6x6x6" + ] + + imIn = self.get_ref_image_path("LDR", "input", "A") + imOut = self.get_tmp_image_path("LDR", "decomp") + + for blk in blockSizes: + with self.subTest(blockSize=blk): + command = [self.binary, "-tl", imIn, imOut, blk, "-exhaustive"] + self.exec(command) + colIn = tli.Image(imIn).get_colors((0, 0)) + colOut = tli.Image(imOut).get_colors((0, 0)) + self.assertColorSame(colIn, colOut) + + def test_valid_presets(self): + """ + Test all valid presets are accepted + """ + presets = ["-fastest", "-fast", "-medium", + "-thorough", "-verythorough", "-exhaustive"] + + imIn = self.get_ref_image_path("LDR", "input", "A") + imOut = self.get_tmp_image_path("LDR", "decomp") + + for preset in presets: + with self.subTest(preset=preset): + command = [self.binary, "-tl", imIn, imOut, "4x4", preset] + self.exec(command) + colIn = tli.Image(imIn).get_colors((0, 0)) + colOut = tli.Image(imOut).get_colors((0, 0)) + self.assertColorSame(colIn, colOut) + + def test_valid_ldr_input_formats(self): + """ + Test valid LDR input file formats. + """ + imgFormats = ["bmp", "dds", "jpg", "ktx", "png", "tga"] + + for imgFormat in imgFormats: + with self.subTest(imgFormat=imgFormat): + imIn = "./Test/Data/Tiles/ldr.%s" % imgFormat + imOut = self.get_tmp_image_path("LDR", "decomp") + + command = [self.binary, "-tl", imIn, imOut, "4x4", "-fast"] + self.exec(command) + + # Check colors if image wrapper supports it + if tli.Image.is_format_supported(imgFormat): + colIn = tli.Image(imIn).get_colors((7, 7)) + colOut = tli.Image(imOut).get_colors((7, 7)) + + # Catch exception and add fallback for tga handling + # having unstable origin in ImageMagick + try: + self.assertColorSame(colIn, colOut) + continue + except AssertionError as ex: + if imgFormat != "tga": + raise ex + + # Try yflipped TGA image + colIn = tli.Image(imIn).get_colors((7, 7)) + colOut = tli.Image(imOut).get_colors((7, 1)) + self.assertColorSame(colIn, colOut) + + def test_valid_uncomp_ldr_output_formats(self): + """ + Test valid uncompressed LDR output file formats. + """ + imgFormats = ["bmp", "dds", "ktx", "png", "tga"] + + for imgFormat in imgFormats: + with self.subTest(imgFormat=imgFormat): + imIn = self.get_ref_image_path("LDR", "input", "A") + imOut = self.get_tmp_image_path("EXP", ".%s" % imgFormat) + + command = [self.binary, "-tl", imIn, imOut, "4x4", "-fast"] + self.exec(command) + + # Check colors if image wrapper supports it + if tli.Image.is_format_supported(imgFormat): + colIn = tli.Image(imIn).get_colors((7, 7)) + colOut = tli.Image(imOut).get_colors((7, 7)) + self.assertColorSame(colIn, colOut) + + def test_valid_comp_ldr_output_formats(self): + """ + Test valid compressed LDR output file formats. + """ + imgFormats = ["astc", "ktx"] + + for imgFormat in imgFormats: + with self.subTest(imgFormat=imgFormat): + imIn = self.get_ref_image_path("LDR", "input", "A") + imOut = self.get_tmp_image_path("EXP", ".%s" % imgFormat) + imOut2 = self.get_tmp_image_path("LDR", "decomp") + + command = [self.binary, "-cl", imIn, imOut, "4x4", "-fast"] + self.exec(command) + + command = [self.binary, "-dl", imOut, imOut2] + self.exec(command) + + # Check colors if image wrapper supports it + if tli.Image.is_format_supported(imgFormat): + colIn = tli.Image(imIn).get_colors((7, 7)) + colOut = tli.Image(imOut2).get_colors((7, 7)) + self.assertColorSame(colIn, colOut2) + + def test_valid_hdr_input_formats(self): + """ + Test valid HDR input file formats. + """ + imgFormats = ["exr", "hdr"] + + for imgFormat in imgFormats: + with self.subTest(imgFormat=imgFormat): + imIn = "./Test/Data/Tiles/hdr.%s" % imgFormat + imOut = self.get_tmp_image_path("HDR", "decomp") + + command = [self.binary, "-th", imIn, imOut, "4x4", "-fast"] + self.exec(command) + + # Check colors if image wrapper supports it + if tli.Image.is_format_supported(imgFormat, profile="hdr"): + colIn = tli.Image(imIn).get_colors((7, 7)) + colOut = tli.Image(imOut).get_colors((7, 7)) + self.assertColorSame(colIn, colOut) + + def test_valid_uncomp_hdr_output_formats(self): + """ + Test valid uncompressed HDR output file formats. + """ + imgFormats = ["dds", "exr", "hdr", "ktx"] + + for imgFormat in imgFormats: + with self.subTest(imgFormat=imgFormat): + imIn = self.get_ref_image_path("HDR", "input", "A") + imOut = self.get_tmp_image_path("EXP", ".%s" % imgFormat) + + command = [self.binary, "-th", imIn, imOut, "4x4", "-fast"] + self.exec(command) + + # Check colors if image wrapper supports it + if tli.Image.is_format_supported(imgFormat, profile="hdr"): + colIn = tli.Image(imIn).get_colors((7, 7)) + colOut = tli.Image(imOut).get_colors((7, 7)) + self.assertColorSame(colIn, colOut) + + def test_valid_comp_hdr_output_formats(self): + """ + Test valid compressed HDR output file formats. + """ + imgFormats = ["astc", "ktx"] + + for imgFormat in imgFormats: + with self.subTest(imgFormat=imgFormat): + imIn = self.get_ref_image_path("HDR", "input", "A") + imOut = self.get_tmp_image_path("EXP", ".%s" % imgFormat) + imOut2 = self.get_tmp_image_path("HDR", "decomp") + + command = [self.binary, "-ch", imIn, imOut, "4x4", "-fast"] + self.exec(command) + + command = [self.binary, "-dh", imOut, imOut2] + self.exec(command) + + # Check colors if image wrapper supports it + if tli.Image.is_format_supported(imgFormat): + colIn = tli.Image(imIn).get_colors((7, 7)) + colOut = tli.Image(imOut2).get_colors((7, 7)) + self.assertColorSame(colIn, colOut2) + + def test_compress_normal_psnr(self): + """ + Test compression of normal textures using PSNR error metrics. + """ + decompFile = self.get_tmp_image_path("LDR", "decomp") + + command = [ + self.binary, "-tl", + "./Test/Images/Small/LDR-XY/ldr-xy-00.png", + decompFile, "5x5", "-exhaustive"] + + refdB = float(self.exec(command, LDR_RGB_PSNR_PATTERN)) + + command.append("-normal") + testdB = float(self.exec(command, LDR_RGB_PSNR_PATTERN)) + + # Note that this test simply asserts that the "-normal_psnr" is + # connected and affects the output. We don't test it does something + # useful; that it outside the scope of this test case. + self.assertNotEqual(refdB, testdB) + + def test_compress_normal_percep(self): + """ + Test compression of normal textures using perceptual error metrics. + """ + decompFile = self.get_tmp_image_path("LDR", "decomp") + + command = [ + self.binary, "-tl", + "./Test/Images/Small/LDR-XY/ldr-xy-00.png", + decompFile, "4x4", "-exhaustive"] + + refdB = float(self.exec(command, LDR_RGB_PSNR_PATTERN)) + + command.append("-normal") + command.append("-perceptual") + testdB = float(self.exec(command, LDR_RGB_PSNR_PATTERN)) + + # Note that this test simply asserts that the "-normal -percep" is + # connected and affects the output. We don't test it does something + # useful; that it outside the scope of this test case. + self.assertNotEqual(refdB, testdB) + + def test_compress_esw(self): + """ + Test compression swizzles. + """ + # The swizzles to test + swizzles = ["rgba", "g0r1", "rrrg"] + + # Compress a swizzled image + for swizzle in swizzles: + with self.subTest(swizzle=swizzle): + decompFile = self.get_tmp_image_path("LDR", "decomp") + + command = [ + self.binary, "-tl", + "./Test/Data/Tiles/ldr.png", + decompFile, "4x4", "-exhaustive", + "-esw", swizzle] + + self.exec(command) + + # Fetch the three color + img = tli.Image(decompFile) + colorVal = img.get_colors([(7, 7)]) + colorRef = self.get_color_refs("LDR", "BR") + self.assertColorSame(colorRef[0], colorVal[0], swiz=swizzle) + + def test_compress_dsw(self): + """ + Test decompression swizzles. + """ + # The swizzles to test + swizzles = ["rgba", "g0r1", "rrrg"] + + # Decompress a swizzled image + for swizzle in swizzles: + with self.subTest(swizzle=swizzle): + decompFile = self.get_tmp_image_path("LDR", "decomp") + + command = [ + self.binary, "-tl", + "./Test/Data/Tiles/ldr.png", + decompFile, "4x4", "-exhaustive", + "-dsw", swizzle] + + self.exec(command) + + # Fetch the three color + img = tli.Image(decompFile) + colorVal = img.get_colors([(7, 7)]) + colorRef = self.get_color_refs("LDR", "BR") + self.assertColorSame(colorRef[0], colorVal[0], swiz=swizzle) + + def test_compress_esw_dsw(self): + """ + Test compression and decompression swizzles + """ + # Compress a swizzled image, and swizzle back in decompression + decompFile = self.get_tmp_image_path("LDR", "decomp") + + command = [ + self.binary, "-tl", + "./Test/Data/Tiles/ldr.png", + decompFile, "4x4", "-exhaustive", + "-esw", "gbar", "-dsw", "argb"] + + self.exec(command) + + # Fetch the three color + img = tli.Image(decompFile) + colorVal = img.get_colors([(7, 7)]) + colorRef = self.get_color_refs("LDR", "BR") + self.assertColorSame(colorRef[0], colorVal[0]) + + def test_compress_flip(self): + """ + Test LDR image flip on compression. + """ + # Compress a flipped image + compFile = self.get_tmp_image_path("LDR", "comp") + + command = [ + self.binary, "-cl", + "./Test/Data/Tiles/ldr.png", + compFile, "4x4", "-fast", "-yflip"] + + self.exec(command) + + # Decompress a non-flipped image + decompFile = self.get_tmp_image_path("LDR", "decomp") + + command = [ + self.binary, "-dl", + compFile, + decompFile] + + self.exec(command) + + # Compare TL (0, 0) with BL - should match + colorRef = self.get_color_refs("LDR", "BL") + + img = tli.Image(decompFile) + colorVal = img.get_colors([(0, 0)]) + self.assertColorSame(colorRef[0], colorVal[0]) + + def test_decompress_flip(self): + """ + Test LDR image flip on decompression. + """ + # Compress a non-flipped image + compFile = self.get_tmp_image_path("LDR", "comp") + + command = [ + self.binary, "-cl", + "./Test/Data/Tiles/ldr.png", + compFile, "4x4", "-fast"] + + self.exec(command) + + # Decompress a flipped image + decompFile = self.get_tmp_image_path("LDR", "decomp") + + command = [ + self.binary, "-dl", + compFile, + decompFile, "-yflip"] + + self.exec(command) + + # Compare TL (0, 0) with BL - should match + colorRef = self.get_color_refs("LDR", "BL") + + img = tli.Image(decompFile) + colorVal = img.get_colors([(0, 0)]) + self.assertColorSame(colorRef[0], colorVal[0]) + + def test_roundtrip_flip(self): + """ + Test LDR image flip on roundtrip (no flip should occur). + """ + # Compress and decompressed a flipped LDR image + decompFile = self.get_tmp_image_path("LDR", "decomp") + + command = [ + self.binary, "-tl", + "./Test/Data/Tiles/ldr.png", + decompFile, "4x4", "-fast", "-yflip"] + + self.exec(command) + + # Compare TL (0, 0) with TL - should match - i.e. no flip + colorRef = self.get_color_refs("LDR", "TL") + + img = tli.Image(decompFile) + colorVal = img.get_colors([(0, 0)]) + + self.assertColorSame(colorRef[0], colorVal[0]) + + def test_channel_weighting(self): + """ + Test channel weighting. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + baseRMSE = self.get_channel_rmse(inputFile, decompFile) + + # Note: Using -cw can result in a worse result than not using -cw, + # with regressions in RMSE for the high-weighted channel. This is + # particularly an issue in synthetic images, as they are more likely to + # hit corner cases in the heuristics. It happens to "work" for the + # selected test image and these settings, but might start to fail in + # future due to compressor changes. + + # Test each channel with a high weight + for chIdx, chName in ((0, "R"), (1, "G"), (2, "B"), (3, "A")): + with self.subTest(channel=chName): + cwArg = ["%s" % (10 if x == chIdx else 1) for x in range(0, 4)] + command2 = command + ["-cw"] + cwArg + self.exec(command2) + chRMSE = self.get_channel_rmse(inputFile, decompFile) + self.assertLess(chRMSE[chIdx], baseRMSE[chIdx]) + + def test_partition_count_limit(self): + """ + Test partition count limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-partitioncountlimit", "1"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce search space + self.assertGreater(testRMSE, refRMSE) + + def test_2partition_index_limit(self): + """ + Test partition index limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-2partitionindexlimit", "1"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce search space + self.assertGreater(testRMSE, refRMSE) + + def test_3partition_index_limit(self): + """ + Test partition index limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-3partitionindexlimit", "1"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce search space + self.assertGreater(testRMSE, refRMSE) + + def test_4partition_index_limit(self): + """ + Test partition index limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-4partitionindexlimit", "1"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce search space + self.assertGreater(testRMSE, refRMSE) + + def test_blockmode_limit(self): + """ + Test block mode limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-blockmodelimit", "25"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce search space + self.assertGreater(testRMSE, refRMSE) + + def test_refinement_limit(self): + """ + Test refinement limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-refinementlimit", "1"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce search space + self.assertGreater(testRMSE, refRMSE) + + def test_candidate_limit(self): + """ + Test candidate limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-candidatelimit", "1"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce search space + self.assertGreater(testRMSE, refRMSE) + + def test_db_cutoff_limit(self): + """ + Test db cutoff limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-dblimit", "10"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce cutoff quality + self.assertGreater(testRMSE, refRMSE) + + def test_2partition_early_limit(self): + """ + Test 2 partition early limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-2partitionlimitfactor", "1.0"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce search space + self.assertGreater(testRMSE, refRMSE) + + def test_3partition_early_limit(self): + """ + Test 3 partition early limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-3partitionlimitfactor", "1.0"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce search space + self.assertNotEqual(testRMSE, refRMSE) + + def test_2plane_correlation_limit(self): + """ + Test 2 plane correlation limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-2planelimitcorrelation", "0.1"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce search space + self.assertGreater(testRMSE, refRMSE) + + def test_2partition_candidate_limit(self): + """ + Test 2 partition partitioning candidate limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-2partitioncandidatelimit", "1"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce search space + self.assertGreater(testRMSE, refRMSE) + + def test_3partition_candidate_limit(self): + """ + Test 3 partition partitioning candidate limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-3partitioncandidatelimit", "1"] + self.exec(command) + testRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + # RMSE should get worse (higher) if we reduce search space + self.assertGreater(testRMSE, refRMSE) + + def test_4partition_candidate_limit(self): + """ + Test 4 partition partitioning candidate limit. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + self.exec(command) + refRMSE = sum(self.get_channel_rmse(inputFile, decompFile)) + + command += ["-4partitioncandidatelimit", "1"] + self.exec(command) + + # RMSE should get worse (higher) if we reduce search space + # Don't check this here, as 4 partitions not used in any Small image + # even for -exhaustive, BUT command line option must be accepted and + # not error ... + # self.assertGreater(testRMSE, refRMSE) + + @unittest.skipIf(os.cpu_count() == 1, "Cannot test on single core host") + def test_thread_count(self): + """ + Test codec thread count. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + + start = time.time() + self.exec(command) + refTime = time.time() - start + + command += ["-j", "1"] + start = time.time() + self.exec(command) + testTime = time.time() - start + + # Test time should get slower with fewer threads + self.assertGreater(testTime, refTime) + + def test_silent(self): + """ + Test silent + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + decompFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the basic image without any channel weights + command = [ + self.binary, "-tl", + inputFile, decompFile, "4x4", "-medium"] + stdout = self.exec(command) + + command += ["-silent"] + stdoutSilent = self.exec(command) + + # Check that stdout is shorter in silent mode. Note that this doesn't + # check that it is as silent as it should be, just that silent is wired + # somewhere ... + self.assertLess(len(stdoutSilent), len(stdout)) + + def test_image_quality_stability(self): + """ + Test that a round-trip and a file-based round-trip give same result. + """ + inputFile = "./Test/Images/Small/LDR-RGBA/ldr-rgba-00.png" + p1DecFile = self.get_tmp_image_path("LDR", "decomp") + p2CompFile = self.get_tmp_image_path("LDR", "comp") + p2DecFile = self.get_tmp_image_path("LDR", "decomp") + + # Compute the first image using a direct round-trip + command = [self.binary, "-tl", inputFile, p1DecFile, "4x4", "-medium"] + self.exec(command) + + # Compute the first image using a file-based round-trip + command = [self.binary, "-cl", inputFile, p2CompFile, "4x4", "-medium", + "-decode_unorm8"] + self.exec(command) + command = [self.binary, "-dl", p2CompFile, p2DecFile] + self.exec(command) + + # RMSE should be the same + p1RMSE = sum(self.get_channel_rmse(inputFile, p1DecFile)) + p2RMSE = sum(self.get_channel_rmse(inputFile, p2DecFile)) + self.assertEqual(p1RMSE, p2RMSE) + + +class CLINTest(CLITestBase): + """ + Command line interface negative tests. + + These tests are designed to test that bad inputs to the command line are + handled cleanly and that errors are correctly thrown. + + Note that many tests are mutations of a valid positive test command line, + to ensure that the base command line is valid before it is mutated many + of these tests include a *positive test* to ensure that the starting point + is actually a valid command line (otherwise we could be throwing an + arbitrary error). + """ + + def exec(self, command, expectPass=False): + """ + Execute a negative test. + + Test will automatically fail if: + + * The subprocess return code is zero, unless ``expectPass==True``. + * The subprocess correctly returned non-zero, but without any error + message. + * The subprocess dies with any kind of signal. + + Args: + command (list(str)): The command to execute. + expectPass (bool): ``True`` if this command is actually expected to + pass, which is used to validate commands before mutating them. + """ + try: + result = sp.run(command, stdout=sp.PIPE, stderr=sp.PIPE, + universal_newlines=True, check=True) + error = False + except sp.CalledProcessError as ex: + # Pop out of the CPE scope to handle the error, as this reduces + # test log verbosity on failure by avoiding nested exceptions + result = ex + error = True + + rcode = result.returncode + + # Emit debug logging if needed (negative rcode is a signal) + badResult = (error == expectPass) or (rcode < 0) + + if ASTCENC_CLI_ALWAYS or (badResult and ASTCENC_CLI_ON_ERROR_NEG): + # Format for shell replay + print("\n" + " ".join(command)) + # Format for script command list replay + print("\n" + ", ".join(("\"%s\"" % x for x in command))) + + if ASTCENC_LOG_ALWAYS or (badResult and ASTCENC_LOG_ON_ERROR_NEG): + print(result.stdout) + + # If we expected a pass, then rcode == 0 + if expectPass: + self.assertEqual(rcode, 0, "Exec did not pass as expected") + self.assertNotIn("ERROR", result.stderr) + return + + # If we got a negative that's always bad (signal of some kind) + if rcode < 0: + msg = "Exec died with signal %s" % signal.Signals(-rcode).name + self.assertGreaterEqual(rcode, 0, msg) + + # Otherwise just assert that we got an error log, and some positive + # return code value was returned + self.assertIn("ERROR", result.stderr) + self.assertGreater(rcode, 0, "Exec did not fail as expected") + + def exec_with_omit(self, command, startOmit): + """ + Execute a negative test with command line argument omission. + + These tests aim to prove that the command fails if arguments are + missing. However the passed command MUST be a valid command which + passes if no argument are omitted (this is checked, to ensure that + the test case is a valid test). + + Test will automatically fail if: + + * A partial command doesn't fail. + * The full command doesn't pass. + """ + # Run the command, incrementally omitting arguments + commandLen = len(command) + for subLen in range(startOmit, commandLen + 1): + omit = len(command) - subLen + with self.subTest(omit=omit): + testCommand = command[:subLen] + expectPass = omit == 0 + self.exec(testCommand, expectPass) + + def test_cl_missing_args(self): + """ + Test -cl with missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast"] + + self.exec_with_omit(command, 2) + + def test_cl_missing_input(self): + """ + Test -cl with a missing input file. + """ + # Build a valid command with a missing input file + command = [ + self.binary, "-cl", + "./Test/Data/missing.png", + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast"] + + self.exec(command) + + def test_cl_missing_input_array_slice(self): + """ + Test -cl with a missing input file in an array slice. + """ + # Build a valid command with a missing input file + command = [ + self.binary, "-cl", + "./Test/Data/Tiles/ldr.png", + self.get_tmp_image_path("LDR", "comp"), + "3x3x3", "-fast", "-zdim", "3"] + + self.exec(command) + + def test_cl_unknown_input(self): + """ + Test -cl with an unknown input file extension. + """ + # Build an otherwise valid command with the test flaw + command = [ + self.binary, "-cl", + "./Test/Data/empty.unk", + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast"] + + self.exec(command) + + def test_cl_missing_output(self): + """ + Test -cl with a missing output directory. + """ + # Build an otherwise valid command with the test flaw + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + "./DoesNotExist/test.astc", + "4x4", "-fast"] + + self.exec(command) + + def test_cl_unknown_output(self): + """ + Test -cl with an unknown output file extension. + """ + # Build an otherwise valid command with the test flaw + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + "./test.aastc", + "4x4", "-fast"] + + self.exec(command) + + def test_cl_bad_block_size(self): + """ + Test -cl with an invalid block size. + """ + badSizes = [ + "4x5", # Illegal 2D block size + "3x3x4", # Illegal 3D block size + "4x4x4x4", # Too many dimensions + "4x", # Incomplete 2D block size + "4x4x", # Incomplete 3D block size + "4x4x4x", # Over-long 3D block size + "4xe", # Illegal non-numeric character + "4x4e" # Additional non-numeric character + ] + + # Build an otherwise valid command with the test flaw + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast"] + + # Test that the underlying command is valid + self.exec(command, True) + + blockIndex = command.index("4x4") + for badSize in badSizes: + with self.subTest(blockSize=badSize): + command[blockIndex] = badSize + self.exec(command) + + def test_cl_bad_preset(self): + """ + Test -cl with an invalid encoding preset. + """ + # Build an otherwise valid command with the test flaw + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fastt"] + + self.exec(command) + + def test_cl_bad_argument(self): + """ + Test -cl with an unknown additional argument. + """ + # Build an otherwise valid command with the test flaw + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", "-unknown"] + + self.exec(command) + + def test_cl_2d_block_with_array(self): + """ + Test -cl with a 2D block size and 3D input data. + """ + # Build an otherwise valid command with the test flaw + + # TODO: This fails late (i.e. the data is still loaded, and we fail + # at processing time when we see a 3D array). We could fail earlier at + # parse time, which might consolidate the error handling code. + command = [ + self.binary, "-cl", + "./Test/Data/Tiles/ldr.png", + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", "-zdim", "2"] + + self.exec(command) + + def test_cl_array_missing_args(self): + """ + Test -cl with a 2D block size and 3D input data. + """ + # Build an otherwise valid command + command = [ + self.binary, "-cl", + "./Test/Data/Tiles/ldr.png", + self.get_tmp_image_path("LDR", "comp"), + "4x4x4", "-fast", "-zdim", "2"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_tl_missing_args(self): + """ + Test -tl with missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-tl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "decomp"), + "4x4", "-fast"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 2) + + def test_tl_missing_input(self): + """ + Test -tl with a missing input file. + """ + # Build a valid command with a missing input file + command = [ + self.binary, "-tl", + "./Test/Data/missing.png", + self.get_tmp_image_path("LDR", "decomp"), + "4x4", "-fast"] + + self.exec(command) + + def test_tl_unknown_input(self): + """ + Test -tl with an unknown input file extension. + """ + # Build an otherwise valid command with the test flaw + command = [ + self.binary, "-tl", + "./Test/Data/empty.unk", + self.get_tmp_image_path("LDR", "decomp"), + "4x4", "-fast"] + + self.exec(command) + + def test_tl_missing_output(self): + """ + Test -tl with a missing output directory. + """ + # Build an otherwise valid command with the test flaw + command = [ + self.binary, "-tl", + self.get_ref_image_path("LDR", "input", "A"), + "./DoesNotExist/test.png", + "4x4", "-fast"] + + self.exec(command) + + def test_tl_bad_block_size(self): + """ + Test -tl with an invalid block size. + """ + badSizes = [ + "4x5", # Illegal 2D block size + "3x3x4", # Illegal 3D block size + "4x4x4x4", # Too many dimensions + "4x", # Incomplete 2D block size + "4x4x", # Incomplete 3D block size + "4x4x4x", # Over-long 3D block size + "4xe", # Illegal non-numeric character + "4x4e" # Additional non-numeric character + ] + + # Build an otherwise valid command with the test flaw + command = [ + self.binary, "-tl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "decomp"), + "4x4", "-fast"] + + # Test that the underlying command is valid + self.exec(command, True) + + blockIndex = command.index("4x4") + for badSize in badSizes: + with self.subTest(blockSize=badSize): + command[blockIndex] = badSize + self.exec(command) + + def test_tl_bad_preset(self): + """ + Test -tl with an invalid encoding preset. + """ + # Build an otherwise valid command with the test flaw + command = [ + self.binary, "-tl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "decomp"), + "4x4", "-fastt"] + + self.exec(command) + + def test_tl_bad_argument(self): + """ + Test -tl with an unknown additional argument. + """ + # Build an otherwise valid command with the test flaw + command = [ + self.binary, "-tl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "decomp"), + "4x4", "-fast", "-unknown"] + + self.exec(command) + + def test_dl_missing_args(self): + """ + Test -dl with missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-dl", + self.get_ref_image_path("LDR", "comp", "A"), + self.get_tmp_image_path("LDR", "decomp")] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 2) + + def test_dl_missing_output(self): + """ + Test -dl with a missing output directory. + """ + # Build an otherwise valid command with the test flaw + command = [ + self.binary, "-dl", + self.get_ref_image_path("LDR", "comp", "A"), + "./DoesNotExist/test.png"] + + self.exec(command) + + def test_cl_a_missing_args(self): + """ + Test -cl with -a and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-a", "2"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_cw_missing_args(self): + """ + Test -cl with -cw and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-cw", "0", "1", "2", "3"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_2partitionindexlimit_missing_args(self): + """ + Test -cl with -2partitionindexlimit and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-2partitionindexlimit", "3"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_3partitionindexlimit_missing_args(self): + """ + Test -cl with -3partitionindexlimit and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-3partitionindexlimit", "3"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_4partitionindexlimit_missing_args(self): + """ + Test -cl with -4partitionindexlimit and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-4partitionindexlimit", "3"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_2partitioncandidatelimit_missing_args(self): + """ + Test -cl with -2partitioncandidatelimit and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-2partitioncandidatelimit", "1"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_3partitioncandidatelimit_missing_args(self): + """ + Test -cl with -3partitioncandidatelimit and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-3partitioncandidatelimit", "3"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + + def test_cl_4partitioncandidatelimit_missing_args(self): + """ + Test -cl with -4partitioncandidatelimit and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-4partitioncandidatelimit", "3"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_blockmodelimit_missing_args(self): + """ + Test -cl with -blockmodelimit and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-blockmodelimit", "3"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_refinementlimit_missing_args(self): + """ + Test -cl with -refinementlimit and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-refinementlimit", "3"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_dblimit_missing_args(self): + """ + Test -cl with -dblimit and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-dblimit", "3"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_2partitionearlylimit_missing_args(self): + """ + Test -cl with -2partitionlimitfactor and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-2partitionlimitfactor", "3"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_3partitionearlylimit_missing_args(self): + """ + Test -cl with -3partitionlimitfactor and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-3partitionlimitfactor", "3"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_2planeearlylimit_missing_args(self): + """ + Test -cl with -2planelimitcorrelation and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-2planelimitcorrelation", "0.66"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_esw_missing_args(self): + """ + Test -cl with -esw and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-esw", "rgb1"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_esw_invalid_swizzle(self): + """ + Test -cl with -esw and invalid swizzles. + """ + badSwizzles = [ + "", # Short swizzles + "r", + "rr", + "rrr", + "rrrrr", # Long swizzles + ] + + # Create swizzles with all invalid printable ascii codes + good = ["r", "g", "b", "a", "0", "1"] + for channel in string.printable: + if channel not in good: + badSwizzles.append(channel * 4) + + # Build a valid base command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-esw", "rgba"] + + blockIndex = command.index("rgba") + for badSwizzle in badSwizzles: + with self.subTest(swizzle=badSwizzle): + command[blockIndex] = badSwizzle + self.exec(command) + + def test_cl_ssw_missing_args(self): + """ + Test -cl with -ssw and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-ssw", "rgba"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + def test_cl_ssw_invalid_swizzle(self): + """ + Test -cl with -ssw and invalid swizzles. + """ + badSwizzles = [ + "", # Short swizzles + "rrrrr", # Long swizzles + ] + + # Create swizzles with all invalid printable ascii codes + good = ["r", "g", "b", "a"] + for channel in string.printable: + if channel not in good: + badSwizzles.append(channel * 4) + + # Build a valid base command + command = [ + self.binary, "-cl", + self.get_ref_image_path("LDR", "input", "A"), + self.get_tmp_image_path("LDR", "comp"), + "4x4", "-fast", + "-ssw", "rgba"] + + blockIndex = command.index("rgba") + for badSwizzle in badSwizzles: + with self.subTest(swizzle=badSwizzle): + command[blockIndex] = badSwizzle + self.exec(command) + + def test_dl_dsw_missing_args(self): + """ + Test -dl with -dsw and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-dl", + self.get_ref_image_path("LDR", "comp", "A"), + self.get_tmp_image_path("LDR", "decomp"), + "-dsw", "rgb1"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 5) + + def test_dl_dsw_invalid_swizzle(self): + """ + Test -dl with -dsw and invalid swizzles. + """ + badSwizzles = [ + "", # Short swizzles + "r", + "rr", + "rrr", + "rrrrr", # Long swizzles + ] + + # Create swizzles with all invalid printable ascii codes + good = ["r", "g", "b", "a", "z", "0", "1"] + for channel in string.printable: + if channel not in good: + badSwizzles.append(channel * 4) + + # Build a valid base command + command = [ + self.binary, "-dl", + self.get_ref_image_path("LDR", "comp", "A"), + self.get_tmp_image_path("LDR", "decomp"), + "-dsw", "rgba"] + + blockIndex = command.index("rgba") + for badSwizzle in badSwizzles: + with self.subTest(swizzle=badSwizzle): + command[blockIndex] = badSwizzle + self.exec(command) + + def test_ch_mpsnr_missing_args(self): + """ + Test -ch with -mpsnr and missing arguments. + """ + # Build a valid command + command = [ + self.binary, "-ch", + self.get_ref_image_path("HDR", "input", "A"), + self.get_tmp_image_path("HDR", "comp"), + "4x4", "-fast", + "-mpsnr", "-5", "5"] + + # Run the command, incrementally omitting arguments + self.exec_with_omit(command, 7) + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + global g_TestEncoder + + parser = argparse.ArgumentParser() + + coders = ["none", "neon", "sve_128", "sve_256", "sse2", "sse4.1", "avx2"] + parser.add_argument("--encoder", dest="encoder", default="avx2", + choices=coders, help="test encoder variant") + args = parser.parse_known_args() + + # Set the encoder for this test run + g_TestEncoder = args[0].encoder + + # Set the sys.argv to remaining args (leave sys.argv[0] alone) + sys.argv[1:] = args[1] + + results = unittest.main(exit=False) + return 0 if results.result.wasSuccessful() else 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_test_image.py b/ktx/external/astc-encoder/Test/astc_test_image.py new file mode 100644 index 0000000..0bd04d2 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_test_image.py @@ -0,0 +1,459 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2019-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. +# ----------------------------------------------------------------------------- +""" +The image test runner is used for image quality and performance testing. + +It is designed to process directories of arbitrary test images, using the +directory structure and path naming conventions to self-describe how each image +is to be compressed. Some built-in test sets are provided in the ./Test/Images +directory, and others can be downloaded by running the astc_test_image_dl +script. + +Attributes: + RESULT_THRESHOLD_WARN: The result threshold (dB) for getting a WARN. + RESULT_THRESHOLD_FAIL: The result threshold (dB) for getting a FAIL. + TEST_BLOCK_SIZES: The block sizes we can test. This is a subset of the + block sizes supported by ASTC, simply to keep test run times + manageable. +""" + +import argparse +import os +import platform +import sys + +import testlib.encoder as te +import testlib.testset as tts +import testlib.resultset as trs + +# Require bit exact with reference scores +RESULT_THRESHOLD_WARN = -0.00 +RESULT_THRESHOLD_FAIL = -0.00 +RESULT_THRESHOLD_3D_FAIL = -0.00 + + +TEST_BLOCK_SIZES = ["4x4", "5x5", "6x6", "8x8", "12x12", "3x3x3", "6x6x6"] + +TEST_QUALITIES = ["fastest", "fast", "medium", "thorough", "verythorough", "exhaustive"] + + +def is_3d(blockSize): + """ + Is the given block size a 3D block type? + + Args: + blockSize (str): The block size. + + Returns: + bool: ``True`` if the block string is a 3D block size, ``False`` if 2D. + """ + return blockSize.count("x") == 2 + + +def count_test_set(testSet, blockSizes): + """ + Count the number of test executions needed for a test set. + + Args: + testSet (TestSet): The test set to run. + blockSizes (list(str)): The block sizes to run. + + Returns: + int: The number of test executions needed. + """ + count = 0 + for blkSz in blockSizes: + for image in testSet.tests: + # 3D block sizes require 3D images + if is_3d(blkSz) != image.is3D: + continue + + count += 1 + + return count + + +def determine_result(image, reference, result): + """ + Determine a test result against a reference and thresholds. + + Args: + image (TestImage): The image being compressed. + reference (Record): The reference result to compare against. + result (Record): The test result. + + Returns: + Result: The result code. + """ + dPSNR = result.psnr - reference.psnr + + if (dPSNR < RESULT_THRESHOLD_FAIL) and (not image.is3D): + return trs.Result.FAIL + + if (dPSNR < RESULT_THRESHOLD_3D_FAIL) and image.is3D: + return trs.Result.FAIL + + if dPSNR < RESULT_THRESHOLD_WARN: + return trs.Result.WARN + + return trs.Result.PASS + + +def format_solo_result(image, result): + """ + Format a metrics string for a single (no compare) result. + + Args: + image (TestImage): The image being tested. + result (Record): The test result. + + Returns: + str: The metrics string. + """ + name = "%5s %s" % (result.blkSz, result.name) + tPSNR = "%2.3f dB" % result.psnr + tTTime = "%.3f s" % result.tTime + tCTime = "%.3f s" % result.cTime + tCMTS = "%.3f MT/s" % result.cRate + + return "%-32s | %8s | %9s | %9s | %11s" % \ + (name, tPSNR, tTTime, tCTime, tCMTS) + + +def format_result(image, reference, result): + """ + Format a metrics string for a comparison result. + + Args: + image (TestImage): The image being tested. + reference (Record): The reference result to compare against. + result (Record): The test result. + + Returns: + str: The metrics string. + """ + dPSNR = result.psnr - reference.psnr + + try: + sTTime = reference.tTime / result.tTime + except ZeroDivisionError: + sTTime = float('NaN') + + try: + sCTime = reference.cTime / result.cTime + except ZeroDivisionError: + sCTime = float('NaN') + + name = "%5s %s" % (result.blkSz, result.name) + tPSNR = "%2.3f dB (% 1.3f dB)" % (result.psnr, dPSNR) + tTTime = "%.3f s (%1.2fx)" % (result.tTime, sTTime) + tCTime = "%.3f s (%1.2fx)" % (result.cTime, sCTime) + tCMTS = "%.3f MT/s" % (result.cRate) + result = determine_result(image, reference, result) + + return "%-32s | %22s | %15s | %15s | %11s | %s" % \ + (name, tPSNR, tTTime, tCTime, tCMTS, result.name) + + +def run_test_set(encoder, testRef, testSet, quality, blockSizes, testRuns, + keepOutput, threads): + """ + Execute all tests in the test set. + + Args: + encoder (EncoderBase): The encoder to use. + testRef (ResultSet): The test reference results. + testSet (TestSet): The test set. + quality (str): The quality level to execute the test against. + blockSizes (list(str)): The block sizes to execute each test against. + testRuns (int): The number of test repeats to run for each image test. + keepOutput (bool): Should the test preserve output images? This is + only a hint and discarding output may be ignored if the encoder + version used can't do it natively. + threads (int or None): The thread count to use. + + Returns: + ResultSet: The test results. + """ + resultSet = trs.ResultSet(testSet.name) + + curCount = 0 + maxCount = count_test_set(testSet, blockSizes) + + dat = (testSet.name, encoder.name, quality) + title = "Test Set: %s / Encoder: %s -%s" % dat + print(title) + print("=" * len(title)) + + for blkSz in blockSizes: + for image in testSet.tests: + # 3D block sizes require 3D images + if is_3d(blkSz) != image.is3D: + continue + + curCount += 1 + + dat = (curCount, maxCount, blkSz, image.testFile) + print("Running %u/%u %s %s ... " % dat, end='', flush=True) + res = encoder.run_test(image, blkSz, "-%s" % quality, testRuns, + keepOutput, threads) + res = trs.Record(blkSz, image.testFile, res[0], res[1], res[2], res[3]) + resultSet.add_record(res) + + if testRef: + refResult = testRef.get_matching_record(res) + res.set_status(determine_result(image, refResult, res)) + + try: + res.tTimeRel = refResult.tTime / res.tTime + except ZeroDivisionError: + res.tTimeRel = float('NaN') + + try: + res.cTimeRel = refResult.cTime / res.cTime + except ZeroDivisionError: + res.cTimeRel = float('NaN') + + res.psnrRel = res.psnr - refResult.psnr + + res = format_result(image, refResult, res) + else: + res = format_solo_result(image, res) + + print("\r[%3u] %s" % (curCount, res)) + + return resultSet + + +def get_encoder_params(encoderName, referenceName, imageSet): + """ + The the encoder and image set parameters for a test run. + + Args: + encoderName (str): The encoder name. + referenceName (str): The reference encoder name. + imageSet (str): The test image set. + + Returns: + tuple(EncoderBase, str, str, str): The test parameters for the + requested encoder and test set. An instance of the encoder wrapper + class, the output data name, the output result directory, and the + reference to use. + """ + # 1.7 variants + if encoderName == "ref-1.7": + encoder = te.Encoder1_7() + name = "reference-1.7" + outDir = "Test/Images/%s" % imageSet + refName = None + return (encoder, name, outDir, refName) + + if encoderName.startswith("ref"): + _, version, simd = encoderName.split("-") + + # 2.x, 3.x, and 4.x variants + compatible2xPrefixes = ["2.", "3.", "4.", "5."] + if any(True for x in compatible2xPrefixes if version.startswith(x)): + encoder = te.Encoder2xRel(version, simd) + name = f"reference-{version}-{simd}" + outDir = "Test/Images/%s" % imageSet + refName = None + return (encoder, name, outDir, refName) + + # Latest main + if version == "main": + encoder = te.Encoder2x(simd) + name = f"reference-{version}-{simd}" + outDir = "Test/Images/%s" % imageSet + refName = None + return (encoder, name, outDir, refName) + + assert False, f"Encoder {encoderName} not recognized" + + encoder = te.Encoder2x(encoderName) + name = "develop-%s" % encoderName + outDir = "TestOutput/%s" % imageSet + refName = referenceName.replace("ref", "reference") + return (encoder, name, outDir, refName) + + +def parse_command_line(): + """ + Parse the command line. + + Returns: + Namespace: The parsed command line container. + """ + parser = argparse.ArgumentParser() + + # All reference encoders + refcoders = ["ref-1.7", + "ref-2.5-neon", "ref-2.5-sse2", "ref-2.5-sse4.1", "ref-2.5-avx2", + "ref-3.7-neon", "ref-3.7-sse2", "ref-3.7-sse4.1", "ref-3.7-avx2", + "ref-4.8-neon", "ref-4.8-sse2", "ref-4.8-sse4.1", "ref-4.8-avx2", + "ref-5.0-neon", "ref-5.0-sse2", "ref-5.0-sse4.1", "ref-5.0-avx2", + "ref-main-neon", "ref-main-sve_256", "ref-main-sve_128", "ref-main-sse2", "ref-main-sse4.1", "ref-main-avx2"] + + # All test encoders + testcoders = ["none", "neon", "sve_256", "sve_128", "sse2", "sse4.1", "avx2", "native", "universal"] + testcodersAArch64 = ["neon", "sve_256", "sve_128"] + testcodersX86 = ["sse2", "sse4.1", "avx2"] + + coders = refcoders + testcoders + ["all-aarch64", "all-x86"] + + parser.add_argument("--encoder", dest="encoders", default="avx2", + choices=coders, help="test encoder variant") + + parser.add_argument("--reference", dest="reference", default="ref-main-avx2", + choices=refcoders, help="reference encoder variant") + + astcProfile = ["ldr", "ldrs", "hdr", "all"] + parser.add_argument("--color-profile", dest="profiles", default="all", + choices=astcProfile, help="test color profile") + + imgFormat = ["l", "xy", "rgb", "rgba", "all"] + parser.add_argument("--color-format", dest="formats", default="all", + choices=imgFormat, help="test color format") + + choices = list(TEST_BLOCK_SIZES) + ["all"] + parser.add_argument("--block-size", dest="blockSizes", + action="append", choices=choices, + help="test block size") + + testDir = os.path.dirname(__file__) + testDir = os.path.join(testDir, "Images") + testSets = [] + for path in os.listdir(testDir): + fqPath = os.path.join(testDir, path) + if os.path.isdir(fqPath): + testSets.append(path) + testSets.append("all") + + parser.add_argument("--test-set", dest="testSets", default="Small", + choices=testSets, help="test image test set") + + parser.add_argument("--test-image", dest="testImage", default=None, + help="select a specific test image from the test set") + + choices = list(TEST_QUALITIES) + ["all", "all+"] + parser.add_argument("--test-quality", dest="testQual", default="thorough", + choices=choices, help="select a specific test quality") + + parser.add_argument("--repeats", dest="testRepeats", default=1, + type=int, help="test iteration count") + + parser.add_argument("--keep-output", dest="keepOutput", default=False, + action="store_true", help="keep image output") + + parser.add_argument("-j", dest="threads", default=None, + type=int, help="thread count") + + + args = parser.parse_args() + + # Turn things into canonical format lists + if args.encoders == "all-aarch64": + args.encoders = testcodersAArch64 + elif args.encoders == "all-x86": + args.encoders = testcodersX86 + else: + args.encoders = [args.encoders] + + if args.testQual == "all+": + args.testQual = TEST_QUALITIES + elif args.testQual == "all": + args.testQual = TEST_QUALITIES + args.testQual.remove("verythorough") + args.testQual.remove("exhaustive") + else: + args.testQual = [args.testQual] + + if not args.blockSizes or ("all" in args.blockSizes): + args.blockSizes = TEST_BLOCK_SIZES + + args.testSets = testSets[:-1] if args.testSets == "all" \ + else [args.testSets] + + args.profiles = astcProfile[:-1] if args.profiles == "all" \ + else [args.profiles] + + args.formats = imgFormat[:-1] if args.formats == "all" \ + else [args.formats] + + return args + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + # Parse command lines + args = parse_command_line() + + testSetCount = 0 + worstResult = trs.Result.NOTRUN + + for quality in args.testQual: + for imageSet in args.testSets: + for encoderName in args.encoders: + (encoder, name, outDir, refName) = \ + get_encoder_params(encoderName, args.reference, imageSet) + + testDir = "Test/Images/%s" % imageSet + testRes = "%s/astc_%s_%s_results.csv" % (outDir, name, quality) + + testRef = None + if refName: + dat = (testDir, refName, quality) + testRefPath = "%s/astc_%s_%s_results.csv" % dat + testRef = trs.ResultSet(imageSet) + testRef.load_from_file(testRefPath) + + testSetCount += 1 + testSet = tts.TestSet(imageSet, testDir, + args.profiles, args.formats, args.testImage) + + resultSet = run_test_set(encoder, testRef, testSet, quality, + args.blockSizes, args.testRepeats, + args.keepOutput, args.threads) + + resultSet.save_to_file(testRes) + + if refName: + summary = resultSet.get_results_summary() + worstResult = max(summary.get_worst_result(), worstResult) + print(summary) + + if (testSetCount > 1) and (worstResult != trs.Result.NOTRUN): + print("OVERALL STATUS: %s" % worstResult.name) + + if worstResult == trs.Result.FAIL: + return 1 + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_test_image_dl.py b/ktx/external/astc-encoder/Test/astc_test_image_dl.py new file mode 100644 index 0000000..03e7237 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_test_image_dl.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2019-2020 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. +# ----------------------------------------------------------------------------- +""" +The ``astc_test_image_dl`` utility provides a means to programatically download +test images that are available online, avoiding the need to duplicate them in +the git repository. +""" + + +import os +import sys +import urllib.request + +from PIL import Image + + +TEST_IMAGE_DIR = os.path.join("Test", "Images") + + +def download(testSet, index, srcUrl, dstPath): + """ + Download a single image. + + Args: + testSet (str): The test set name. + index (int): The download index. + srcUrl (str): The download URL. + dstPath (str): The destination path. + """ + dirName = os.path.dirname(dstPath) + if not os.path.exists(dirName): + os.makedirs(dirName) + + # Skip downloads if the file already exists + if not os.path.exists(dstPath): + print("%s image %u: Downloading" % (testSet, index)) + urllib.request.urlretrieve(srcUrl, dstPath) + else: + print("%s image %u: Skipping" % (testSet, index)) + + +def make_landscape(imgPath): + """ + Make an image on disk landscape aspect (edit in place) + + Args: + imgPath: The pth of the image on disk. + """ + img = Image.open(imgPath) + if img.size[0] < img.size[1]: + img = img.rotate(90, expand=True) + img.save(imgPath) + + +def make_mixed_image(imgPathA, imgPathB, dstPath): + """ + Make image consisting of RGB from A's RGB, and alpha from B's luminance. + + Args: + imgPathA: The path of input A on disk. + imgPathB: The path of input B on disk. + dstPath: The path of the destination. + """ + imgA = Image.open(imgPathA) + imgB = Image.open(imgPathB).convert("L") + + imgA.putalpha(imgB) + + dirs = os.path.dirname(dstPath) + if not os.path.exists(dirs): + os.makedirs(dirs) + + imgA.save(dstPath) + + +def make_montage(imageDir, dstPath): + """ + Make a single mosaic montage consisting of all of the Kodak images. + + Args: + imgDir: The directory path of the Kodak images on disk. + dstPth: The file path of the resulting montage. + """ + cols = 6 + rows = 4 + + width = 768 + height = 512 + + images = os.listdir(imageDir) + images.sort() + + montage = Image.new('RGB', (width * cols, height * rows)) + + for i, src in enumerate(images): + im = Image.open(os.path.join(imageDir, src)) + col = i % cols + row = i // cols + montage.paste(im, (width * col, height * row)) + + dirs = os.path.dirname(dstPath) + if not os.path.exists(dirs): + os.makedirs(dirs) + + montage.save(dstPath) + + +def retrieve_kodak_set(): + """ + Download the public domain Kodak image set. + + To make test set mosaics easier to build we rotate images to make + everything landscape. + """ + testSet = "Kodak" + + # Download the original RGB images + for i in range(1, 25): + fle = "ldr-rgb-kodak%02u.png" % i + dst = os.path.join(TEST_IMAGE_DIR, "Kodak", "LDR-RGB", fle) + src = "http://r0k.us/graphics/kodak/kodak/kodim%02u.png" % i + download(testSet, i, src, dst) + + # Canonicalize image aspect + make_landscape(dst) + + # Make some correlated alpha RGBA images + fle = "ldr-rgb-kodak%02u.png" # Expand later + pattern = os.path.join(TEST_IMAGE_DIR, "Kodak", "LDR-RGB", fle) + + for i in (22, 23): + imgA = pattern % i + fle = "ldr-rgba-kodak%02u+ca.png" % i + dst = os.path.join(TEST_IMAGE_DIR, "KodakSim", "LDR-RGBA", fle) + make_mixed_image(imgA, imgA, dst) + + # Make some non-correlated alpha RGBA images + for i, j in ((22, 24), (23, 20)): + imgA = pattern % i + imgB = pattern % j + fle = "ldr-rgba-kodak%02u+%02u+nca.png" % (i, j) + dst = os.path.join(TEST_IMAGE_DIR, "KodakSim", "LDR-RGBA", fle) + make_mixed_image(imgA, imgB, dst) + + # Make a large montage + srcDir = os.path.join(TEST_IMAGE_DIR, "Kodak", "LDR-RGB") + fle = "ldr-rgb-montage.png" + dst = os.path.join(TEST_IMAGE_DIR, "KodakMnt", "LDR-RGB", fle) + make_montage(srcDir, dst) + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + retrieve_kodak_set() + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_test_python.py b/ktx/external/astc-encoder/Test/astc_test_python.py new file mode 100644 index 0000000..1abc8e6 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_test_python.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2020 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. +# ----------------------------------------------------------------------------- +""" +The python test runner is designed to run some basic tests against the Python +test code base. +""" + +import re +import sys +import unittest + +import pycodestyle +import pylint.epylint as lint + + +class PythonTests(unittest.TestCase): + """ + Some basic Python static analysis and style checks. + """ + + def test_pylint(self): + """ + Run pylint over the codebase. + """ + pylintOut, _ = lint.py_run("./Test", True) + pattern = re.compile(r"Your code has been rated at (.*?)/10") + match = pattern.search(pylintOut.getvalue()) + self.assertIsNotNone(match) + score = float(match.group(1)) + self.assertGreaterEqual(score, 9.8) + + with open("pylint.log", "w") as fileHandle: + fileHandle.write(pylintOut.getvalue()) + + def test_pycodestyle(self): + """ + Test that we conform to PEP-8. + """ + style = pycodestyle.StyleGuide() + result = style.check_files(["./Test"]) + self.assertEqual(result.total_errors, 0, + "Found code style errors (and warnings).") + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + results = unittest.main(exit=False) + return 0 if results.result.wasSuccessful() else 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_test_result_plot.py b/ktx/external/astc-encoder/Test/astc_test_result_plot.py new file mode 100644 index 0000000..7d5fdc6 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_test_result_plot.py @@ -0,0 +1,427 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2020-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. +# ----------------------------------------------------------------------------- +""" +The ``astc_test_result_plot.py`` script consolidates all current sets of +reference results into a single graphical plot. +""" + +import re +import os +import sys + +import numpy as np +import matplotlib.pyplot as plt + +import testlib.resultset as trs +from collections import defaultdict as ddict + + +def find_reference_results(): + """ + Scrape the Test/Images directory for result CSV files and return an + mapping of the result sets. + + Returns: + Returns a three deep tree of dictionaries, with the final dict + pointing at a `ResultSet` object. The hierarchy is: + + imageSet => quality => encoder => result + """ + scriptDir = os.path.dirname(__file__) + imageDir = os.path.join(scriptDir, "Images") + + # Pattern for extracting useful data from the CSV file name + filePat = re.compile(r"astc_reference-(.+)_(.+)_results\.csv") + + # Build a three level dictionary we can write into + results = ddict(lambda: ddict(lambda: ddict())) + + # Final all CSVs, load them and store them in the dict tree + for root, dirs, files in os.walk(imageDir): + for name in files: + match = filePat.match(name) + if match: + fullPath = os.path.join(root, name) + + encoder = match.group(1) + quality = match.group(2) + imageSet = os.path.basename(root) + + if imageSet not in ["Kodak", "Khronos", "HDRIHaven", "KodakSim"]: + continue + + testRef = trs.ResultSet(imageSet) + testRef.load_from_file(fullPath) + + results[imageSet][quality]["ref-%s" % encoder] = testRef + + return results + + +def get_series(results, tgtEncoder, tgtQuality, resFilter=lambda x: True): + psnrData = [] + mtsData = [] + marker = [] + records = [] + + for imageSet, iResults in results.items(): + + for quality, qResults in iResults.items(): + if quality != tgtQuality: + continue + + for encoder, eResults in qResults.items(): + if encoder != tgtEncoder: + continue + + for record in eResults.records: + if resFilter(record): + records.append(record) + psnrData.append(record.psnr) + mtsData.append(record.cRate) + + if "ldr-xy" in record.name: + marker.append('$N$') + elif "ldr-l" in record.name: + marker.append('$G$') + elif "ldr" in record.name: + marker.append('$L$') + elif "hdr" in record.name: + marker.append('$H$') + else: + marker.append('$?$') + + + return mtsData, psnrData, marker, records + + +def get_series_rel(results, refEncoder, refQuality, tgtEncoder, tgtQuality, resFilter=lambda x: True): + + mts1, psnr1, marker1, rec1 = get_series(results, tgtEncoder, tgtQuality, resFilter) + + if refEncoder is None: + refEncoder = tgtEncoder + + if refQuality is None: + refQuality = tgtQuality + + mts2, psnr2, marker2, rec2 = get_series(results, refEncoder, refQuality, resFilter) + + mtsm = [x/mts2[i] for i, x in enumerate(mts1)] + psnrm = [x - psnr2[i] for i, x in enumerate(psnr1)] + + return mtsm, psnrm, marker1, rec1 + + +def get_human_eq_name(encoder, quality): + parts = encoder.split("-") + if len(parts) == 2: + return "astcenc %s -%s" % (parts[1], quality) + else: + return "astcenc-%s %s -%s" % (parts[2], parts[1], quality) + + +def get_human_e_name(encoder): + parts = encoder.split("-") + if len(parts) == 2: + return "astcenc %s" % parts[1] + else: + return "astcenc-%s %s" % (parts[2], parts[1]) + + +def get_human_q_name(quality): + return "-%s" % quality + + +def plot(results, chartRows, chartCols, blockSizes, + relative, pivotEncoder, pivotQuality, fileName, limits): + + fig, axs = plt.subplots(nrows=len(chartRows), ncols=len(chartCols), + sharex=True, sharey=True, figsize=(15, 8.43)) + + for a in fig.axes: + a.tick_params( + axis="x", which="both", + bottom=True, top=False, labelbottom=True) + + a.tick_params( + axis="y", which="both", + left=True, right=False, labelleft=True) + + for i, row in enumerate(chartRows): + for j, col in enumerate(chartCols): + if row == "fastest" and (("1.7" in col) or ("2.0" in col)): + if len(chartCols) == 1: + fig.delaxes(axs[i]) + else: + fig.delaxes(axs[i][j]) + continue + + if len(chartRows) == 1 and len(chartCols) == 1: + ax = axs + elif len(chartCols) == 1: + ax = axs[i] + else: + ax = axs[i, j] + + title = get_human_eq_name(col, row) + + if not relative: + ax.set_title(title, y=0.97, backgroundcolor="white") + ax.set_xlabel('Coding performance (MTex/s)') + ax.set_ylabel('PSNR (dB)') + else: + if pivotEncoder and pivotQuality: + tag = get_human_eq_name(pivotEncoder, pivotQuality) + elif pivotEncoder: + tag = get_human_e_name(pivotEncoder) + else: + assert(pivotQuality) + tag = get_human_q_name(pivotQuality) + + ax.set_title("%s vs. %s" % (title, tag), y=0.97, backgroundcolor="white") + ax.set_xlabel('Performance scaling') + ax.set_ylabel('PSNR delta (dB)') + + for k, series in enumerate(blockSizes): + fn = lambda x: x.blkSz == series + + if not relative: + x, y, m, r = get_series(results, col, row, fn) + else: + x, y, m, r = get_series_rel(results, pivotEncoder, pivotQuality, + col, row, fn) + + color = None + label = "%s blocks" % series + for xp, yp, mp in zip(x, y, m): + ax.scatter([xp],[yp], s=16, marker=mp, + color="C%u" % k, label=label) + label = None + + if i == 0 and j == 0: + ax.legend(loc="lower right") + + for i, row in enumerate(chartRows): + for j, col in enumerate(chartCols): + + if len(chartRows) == 1 and len(chartCols) == 1: + ax = axs + elif len(chartCols) == 1: + ax = axs[i] + else: + ax = axs[i, j] + + ax.grid(ls=':') + + if limits and limits[0]: + ax.set_xlim(left=limits[0][0], right=limits[0][1]) + if limits and limits[1]: + ax.set_ylim(bottom=limits[1][0], top=limits[1][1]) + + fig.tight_layout() + fig.savefig(fileName) + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + absXMin = 0 + absXMax = 80 + absXLimits = (absXMin, absXMax) + + relXMin = 0.8 + relXMax = None + relXLimits = (relXMin, relXMax) + + last1x = "1.7" + last2x = "2.5" + last3x = "3.7" + prev4x = "4.3" + last4x = "4.4" + lastMain = "main" + + charts = [ + # -------------------------------------------------------- + # Latest in stable series charts + [ + # Relative scores + ["thorough", "medium", "fast"], + [f"ref-{last2x}-avx2", f"ref-{last3x}-avx2", f"ref-{last4x}-avx2"], + ["4x4", "6x6", "8x8"], + True, + f"ref-{last1x}", + None, + "results-relative-stable-series.png", + (None, None) + ], [ + # Absolute scores + ["thorough", "medium", "fast"], + [f"ref-{last1x}", f"ref-{last2x}-avx2", f"ref-{last3x}-avx2", f"ref-{last4x}-avx2"], + ["4x4", "6x6", "8x8"], + False, + None, + None, + "results-absolute-stable-series.png", + (absXLimits, None) + ], + # -------------------------------------------------------- + # Latest 2.x vs 1.x release charts + [ + # Relative scores + ["thorough", "medium", "fast"], + [f"ref-{last2x}-avx2"], + ["4x4", "6x6", "8x8"], + True, + f"ref-{last1x}", + None, + "results-relative-2.x-vs-1.x.png", + (None, None) + ], + # -------------------------------------------------------- + # Latest 3.x vs 1.x release charts + [ + # Relative scores + ["thorough", "medium", "fast"], + [f"ref-{last3x}-avx2"], + ["4x4", "6x6", "8x8"], + True, + f"ref-{last1x}", + None, + "results-relative-3.x-vs-1.x.png", + (None, None) + ], + # -------------------------------------------------------- + # Latest 4.x vs 1.x release charts + [ + # Relative scores + ["thorough", "medium", "fast"], + [f"ref-{last4x}-avx2"], + ["4x4", "6x6", "8x8"], + True, + f"ref-{last1x}", + None, + "results-relative-4.x-vs-1.x.png", + (None, None) + ], + # -------------------------------------------------------- + # Latest 3.x vs 2.x release charts + [ + # Relative scores + ["thorough", "medium", "fast", "fastest"], + [f"ref-{last3x}-avx2"], + ["4x4", "6x6", "8x8"], + True, + f"ref-{last2x}-avx2", + None, + "results-relative-3.x-vs-2.x.png", + (None, None) + ], + # -------------------------------------------------------- + # Latest 4.x vs 3.x release charts + [ + # Relative scores + ["thorough", "medium", "fast", "fastest"], + [f"ref-{last4x}-avx2"], + ["4x4", "6x6", "8x8"], + True, + f"ref-{last3x}-avx2", + None, + "results-relative-4.x-vs-3.x.png", + (relXLimits, None), + ], [ + # Relative ISAs of latest + ["thorough", "medium", "fast", "fastest"], + [f"ref-{last4x}-sse4.1", f"ref-{last4x}-avx2"], + ["4x4", "6x6", "8x8"], + True, + f"ref-{last4x}-sse2", + None, + "results-relative-4.x-isa.png", + (None, None) + ], [ + # Relative quality of latest + ["medium", "fast", "fastest"], + [f"ref-{last4x}-avx2"], + ["4x4", "6x6", "8x8"], + True, + None, + "thorough", + "results-relative-4.x-quality.png", + (None, None) + ], + # -------------------------------------------------------- + # Latest 4.x vs previous 4.x release charts + [ + # Relative scores + ["thorough", "medium", "fast", "fastest"], + [f"ref-{last4x}-avx2"], + ["4x4", "6x6", "8x8"], + True, + f"ref-{prev4x}-avx2", + None, + "results-relative-4.x-vs-4.x.png", + (relXLimits, None) + ], + # -------------------------------------------------------- + # Latest 4.x vs previous 4.x release charts + [ + # Relative scores + ["thorough", "medium", "fast", "fastest"], + [f"ref-{lastMain}-avx2"], + ["4x4", "6x6", "8x8"], + True, + f"ref-{last4x}-avx2", + None, + "results-relative-main-vs-4.x.png", + (relXLimits, None) + ] + ] + + results = find_reference_results() + + # Force select is triggered by adding a trailing entry to the argument list + # of the charts that you want rendered; designed for debugging use cases + maxIndex = 0 + expectedLength = 8 + for chart in charts: + maxIndex = max(maxIndex, len(chart)) + + for chart in charts: + # If force select is enabled then only keep the forced ones + if len(chart) != maxIndex: + print("Skipping %s" % chart[6]) + continue + else: + print("Generating %s" % chart[6]) + + # If force select is enabled then strip the dummy force option + if maxIndex != expectedLength: + chart = chart[:expectedLength] + + plot(results, *chart) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_test_result_report.py b/ktx/external/astc-encoder/Test/astc_test_result_report.py new file mode 100644 index 0000000..94721d8 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_test_result_report.py @@ -0,0 +1,315 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2020-2021 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. +# ----------------------------------------------------------------------------- +""" +The ``astc_test_result_report.py`` script consolidates all current sets of +reference results into a single report giving PSNR diffs (absolute) and +performance diffs (relative speedup, 1 = no change). +""" + +import re +import os +import sys + + +import testlib.resultset as trs +from collections import defaultdict as ddict + + +CONFIG_FILTER = [ + re.compile(r"^.*1\.7.*$"), + re.compile(r"^.*sse.*$") +] + +TESTSET_FILTER = [ + re.compile(r"^Small$"), + re.compile(r"^Frymire$"), +] + +QUALITY_FILTER = [ +] + +BLOCKSIZE_FILTER = [ + re.compile(r"^12x12$") +] + + +def find_reference_results(): + """ + Scrape the Test/Images directory for result CSV files and return an + mapping of the result sets. + + Returns: + Returns a three deep tree of dictionaries, with the final dict + pointing at a `ResultSet` object. The hierarchy is: + + imageSet => quality => encoder => result + """ + scriptDir = os.path.dirname(__file__) + imageDir = os.path.join(scriptDir, "Images") + + # Pattern for extracting useful data from the CSV file name + filePat = re.compile(r"astc_reference-(.+)_(.+)_results\.csv") + + # Build a three level dictionary we can write into + results = ddict(lambda: ddict(lambda: ddict())) + + # Final all CSVs, load them and store them in the dict tree + for root, dirs, files in os.walk(imageDir): + for name in files: + match = filePat.match(name) + if match: + + # Skip results set in the filter + skip = [1 for filt in CONFIG_FILTER if filt.match(name)] + if skip: + continue + + fullPath = os.path.join(root, name) + + encoder = match.group(1) + quality = match.group(2) + imageSet = os.path.basename(root) + + # Skip results set in the filter + skip = [1 for filt in TESTSET_FILTER if filt.match(imageSet)] + if skip: + continue + + # Skip results set in the filter + skip = [1 for filt in QUALITY_FILTER if filt.match(quality)] + if skip: + continue + + testRef = trs.ResultSet(imageSet) + testRef.load_from_file(fullPath) + + patchedRef = trs.ResultSet(imageSet) + + for result in testRef.records: + skip = [1 for filt in BLOCKSIZE_FILTER if filt.match(result.blkSz)] + if not skip: + patchedRef.add_record(result) + + results[imageSet][quality]["ref-%s" % encoder] = patchedRef + + return results + + +class DeltaRecord(): + """ + Record a single image result from N different encoders. + + Attributes: + imageSet: The image set this cme from. + quality: The compressor quality used. + encoders: The names of the encoders used. The first encoder in this + list will be used as the reference result. + records: The raw records for the encoders. The order of records in this + list matches the order of the `encoders` list. + """ + + def __init__(self, imageSet, quality, encoders, records): + self.imageSet = imageSet + self.quality = quality + + self.encoders = list(encoders) + self.records = list(records) + + assert(len(self.encoders) == len(self.records)) + + def get_delta_header(self, tag): + """ + Get the delta encoding header. + + Args: + tag: The field name to include in the tag. + + Return: + The array of strings, providing the header names. + """ + result = [] + + for encoder in self.encoders[1:]: + result.append("%s %s" % (tag, encoder)) + + return result + + def get_abs_delta(self, field): + """ + Get an absolute delta result. + + Args: + field: The Record attribute name to diff. + + Return: + The array of float delta values. + """ + result = [] + + root = self.records[0] + for record in self.records[1:]: + result.append(getattr(record, field) - getattr(root, field)) + + return result + + def get_rel_delta(self, field): + """ + Get an relative delta result (score / ref). + + Args: + field: The Record attribute name to diff. + + Return: + The array of float delta values. + """ + result = [] + + root = self.records[0] + for record in self.records[1:]: + result.append(getattr(record, field) / getattr(root, field)) + + return result + + def get_irel_delta(self, field): + """ + Get an inverse relative delta result (ref / score). + + Args: + field: The Record attribute name to diff. + + Return: + The array of float delta values. + """ + return [1.0 / x for x in self.get_rel_delta(field)] + + def get_full_row_header_csv(self): + """ + Get a CSV encoded delta record header. + + Return: + The string for the row. + """ + rows = [ + "Image Set", + "Quality", + "Size", + "Name" + ] + + rows.append("") + rows.extend(self.get_delta_header("PSNR")) + + rows.append("") + rows.extend(self.get_delta_header("Speed")) + + return ",".join(rows) + + def get_full_row_csv(self): + """ + Get a CSV encoded delta record. + + Return: + The string for the row. + """ + rows = [ + self.imageSet, + self.quality, + self.records[0].name, + self.records[0].blkSz + ] + + rows.append("") + data = ["%0.3f" % x for x in self.get_abs_delta("psnr")] + rows.extend(data) + + rows.append("") + data = ["%0.3f" % x for x in self.get_irel_delta("cTime")] + rows.extend(data) + + return ",".join(rows) + + +def print_result_set(imageSet, quality, encoders, results, printHeader): + """ + Attributes: + imageSet: The image set name. + quality: The compressor quality used. + encoders: The names of the encoders used. The first encoder in this + list will be used as the reference result. + results: The dict of results, indexed by encoder. + printHeader: True if the table header should be printed, else False. + """ + results = [results[x] for x in encoders] + recordSizes = [len(x.records) for x in results] + + # Skip result sets that are not the same size + # TODO: We can take the set intersection here to report what we can + if min(recordSizes) != max(recordSizes): + return + + # Interleave all result records + recordSets = zip(*[x.records for x in results]) + + # Iterate each image + for recordSet in recordSets: + base = recordSet[0] + + # Sanity check consistency + for record in recordSet[1:]: + assert(record.blkSz == base.blkSz) + assert(record.name == base.name) + + dr = DeltaRecord(imageSet, quality, encoders, recordSet) + + if printHeader: + print(dr.get_full_row_header_csv()) + printHeader = False + + print(dr.get_full_row_csv()) + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + + results = find_reference_results() + + imageSet = sorted(results.keys()) + + first = True + for image in imageSet: + qualityTree = results[image] + qualitySet = sorted(qualityTree.keys()) + + for qual in qualitySet: + encoderTree = qualityTree[qual] + encoderSet = sorted(encoderTree.keys()) + + if len(encoderSet) > 1: + print_result_set(image, qual, encoderSet, encoderTree, first) + first = False + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_trace_analysis.py b/ktx/external/astc-encoder/Test/astc_trace_analysis.py new file mode 100644 index 0000000..e0854a8 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_trace_analysis.py @@ -0,0 +1,560 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2021 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. +# ----------------------------------------------------------------------------- +""" +The ``astc_trace_analysis`` utility provides a tool to analyze trace files. + +WARNING: Trace files are an engineering tool, and not part of the standard +product, so traces and their associated tools are volatile and may change +significantly without notice. +""" + +import argparse +from collections import defaultdict as ddict +import json +import numpy as np +import sys + +QUANT_TABLE = { + 0: 2, + 1: 3, + 2: 4, + 3: 5, + 4: 6, + 5: 8, + 6: 10, + 7: 12, + 8: 16, + 9: 20, + 10: 24, + 11: 32 +} + +CHANNEL_TABLE = { + 0: "R", + 1: "G", + 2: "B", + 3: "A" +} + +class Trace: + + def __init__(self, block_x, block_y, block_z): + self.block_x = block_x + self.block_y = block_y + self.block_z = block_z + self.blocks = [] + + def add_block(self, block): + self.blocks.append(block) + + def __getitem__(self, i): + return self.blocks[i] + + def __delitem__(self, i): + del self.blocks[i] + + def __len__(self): + return len(self.blocks) + +class Block: + + def __init__(self, pos_x, pos_y, pos_z, error_target): + self.pos_x = pos_x + self.pos_y = pos_y + self.pos_z = pos_z + + self.raw_min = None + self.raw_max = None + + self.ldr_min = None + self.ldr_max = None + + self.error_target = error_target + self.passes = [] + self.qualityHit = None + + def add_minimums(self, r, g, b, a): + self.raw_min = (r, g, b, a) + + def ldr(x): + cmax = 65535.0 + return int((r / cmax) * 255.0) + + self.ldr_min = (ldr(r), ldr(g), ldr(b), ldr(a)) + + def add_maximums(self, r, g, b, a): + self.raw_max = (r, g, b, a) + + def ldr(x): + cmax = 65535.0 + return int((r / cmax) * 255.0) + + self.ldr_max = (ldr(r), ldr(g), ldr(b), ldr(a)) + + def add_pass(self, pas): + self.passes.append(pas) + + def __getitem__(self, i): + return self.passes[i] + + def __delitem__(self, i): + del self.passes[i] + + def __len__(self): + return len(self.passes) + + +class Pass: + + def __init__(self, partitions, partition, planes, target_hit, mode, component): + self.partitions = partitions + self.partition_index = 0 if partition is None else partition + self.planes = planes + self.plane2_component = component + self.target_hit = target_hit + self.search_mode = mode + self.candidates = [] + + def add_candidate(self, candidate): + self.candidates.append(candidate) + + def __getitem__(self, i): + return self.candidates[i] + + def __delitem__(self, i): + del self.candidates[i] + + def __len__(self): + return len(self.candidates) + + +class Candidate: + + def __init__(self, weight_x, weight_y, weight_z, weight_quant): + self.weight_x = weight_x + self.weight_y = weight_y + self.weight_z = weight_z + self.weight_quant = weight_quant + self.refinement_errors = [] + + def add_refinement(self, errorval): + self.refinement_errors.append(errorval) + + +def get_attrib(data, name, multiple=False, hard_fail=True): + results = [] + for attrib in data: + if len(attrib) == 2 and attrib[0] == name: + results.append(attrib[1]) + + if not results: + if hard_fail: + print(json.dumps(data, indent=2)) + assert False, "Attribute %s not found" % name + if multiple: + return list() + return None + + if not multiple: + if len(results) > 1: + print(json.dumps(data, indent=2)) + assert False, "Attribute %s found %u times" % (name, len(results)) + return results[0] + + return results + + +def rev_enumerate(seq): + return zip(reversed(range(len(seq))), reversed(seq)) + +def foreach_block(data): + + for block in data: + yield block + +def foreach_pass(data): + + for block in data: + for pas in block: + yield (block, pas) + +def foreach_candidate(data): + + for block in data: + for pas in block: + # Special case - None candidates for 0 partition + if not len(pas): + yield (block, pas, None) + + for candidate in pas: + yield (block, pas, candidate) + +def get_node(data, name, multiple=False, hard_fail=True): + results = [] + for attrib in data: + if len(attrib) == 3 and attrib[0] == "node" and attrib[1] == name: + results.append(attrib[2]) + + if not results: + if hard_fail: + print(json.dumps(data, indent=2)) + assert False, "Node %s not found" % name + return None + + if not multiple: + if len(results) > 1: + print(json.dumps(data, indent=2)) + assert False, "Node %s found %u times" % (name, len(results)) + return results[0] + + return results + + +def find_best_pass_and_candidate(block): + explicit_pass = None + + best_error = 1e30 + best_pass = None + best_candidate = None + + for pas in block: + # Special case for constant color blocks - no trial candidates + if pas.target_hit and pas.partitions == 0: + return (pas, None) + + for candidate in pas: + errorval = candidate.refinement_errors[-1] + if errorval <= best_error: + best_error = errorval + best_pass = pas + best_candidate = candidate + + # Every other return type must have both best pass and best candidate + assert (best_pass and best_candidate) + return (best_pass, best_candidate) + + +def generate_database(data): + # Skip header + assert(data[0] == "node") + assert(data[1] == "root") + data = data[2] + + bx = get_attrib(data, "block_x") + by = get_attrib(data, "block_y") + bz = get_attrib(data, "block_z") + dbStruct = Trace(bx, by, bz) + + for block in get_node(data, "block", True): + px = get_attrib(block, "pos_x") + py = get_attrib(block, "pos_y") + pz = get_attrib(block, "pos_z") + + minr = get_attrib(block, "min_r") + ming = get_attrib(block, "min_g") + minb = get_attrib(block, "min_b") + mina = get_attrib(block, "min_a") + + maxr = get_attrib(block, "max_r") + maxg = get_attrib(block, "max_g") + maxb = get_attrib(block, "max_b") + maxa = get_attrib(block, "max_a") + + et = get_attrib(block, "tune_error_threshold") + + blockStruct = Block(px, py, pz, et) + blockStruct.add_minimums(minr, ming, minb, mina) + blockStruct.add_maximums(maxr, maxg, maxb, maxa) + dbStruct.add_block(blockStruct) + + for pas in get_node(block, "pass", True): + # Don't copy across passes we skipped due to heuristics + skipped = get_attrib(pas, "skip", False, False) + if skipped: + continue + + prts = get_attrib(pas, "partition_count") + prti = get_attrib(pas, "partition_index", False, False) + plns = get_attrib(pas, "plane_count") + chan = get_attrib(pas, "plane_component", False, plns > 2) + mode = get_attrib(pas, "search_mode", False, False) + ehit = get_attrib(pas, "exit", False, False) == "quality hit" + + passStruct = Pass(prts, prti, plns, ehit, mode, chan) + blockStruct.add_pass(passStruct) + + # Constant color blocks don't have any candidates + if prts == 0: + continue + + for candidate in get_node(pas, "candidate", True): + # Don't copy across candidates we couldn't encode + failed = get_attrib(candidate, "failed", False, False) + if failed: + continue + + wx = get_attrib(candidate, "weight_x") + wy = get_attrib(candidate, "weight_y") + wz = get_attrib(candidate, "weight_z") + wq = QUANT_TABLE[get_attrib(candidate, "weight_quant")] + epre = get_attrib(candidate, "error_prerealign", True, False) + epst = get_attrib(candidate, "error_postrealign", True, False) + + candStruct = Candidate(wx, wy, wz, wq) + passStruct.add_candidate(candStruct) + for value in epre: + candStruct.add_refinement(value) + for value in epst: + candStruct.add_refinement(value) + + return dbStruct + + +def filter_database(data): + + for block in data: + best_pass, best_candidate = find_best_pass_and_candidate(block) + + for i, pas in rev_enumerate(block): + if pas != best_pass: + del block[i] + continue + + if best_candidate is None: + continue + + for j, candidate in rev_enumerate(pas): + if candidate != best_candidate: + del pas[j] + + +def generate_pass_statistics(data): + pass + + +def generate_feature_statistics(data): + # ------------------------------------------------------------------------- + # Config + print("Compressor Config") + print("=================") + + if data.block_z > 1: + dat = (data.block_x, data.block_y, data.block_z) + print(" - Block size: %ux%ux%u" % dat) + else: + dat = (data.block_x, data.block_y) + print(" - Block size: %ux%u" % dat) + + print("") + + # ------------------------------------------------------------------------- + # Block metrics + result = ddict(int) + + RANGE_QUANT = 16 + + for block in foreach_block(data): + ranges = [] + for i in range(0, 4): + ranges.append(block.ldr_max[i] - block.ldr_min[i]) + + max_range = max(ranges) + max_range = int(max_range / RANGE_QUANT) * RANGE_QUANT + + result[max_range] += 1 + + print("Channel Range") + print("=============") + keys = sorted(result.keys()) + for key in keys: + dat = (key, key + RANGE_QUANT - 1, result[key]) + print(" - %3u-%3u dynamic range = %6u blocks" % dat) + + print("") + + # ------------------------------------------------------------------------- + # Partition usage + result_totals = ddict(int) + results = ddict(lambda: ddict(int)) + + for _, pas in foreach_pass(data): + result_totals[pas.partitions] += 1 + results[pas.partitions][pas.partition_index] += 1 + + print("Partition Count") + print("===============") + keys = sorted(result_totals.keys()) + for key in keys: + dat = (key, result_totals[key], len(results[key])) + print(" - %u partition(s) = %6u blocks / %4u indicies" % dat) + + print("") + + # ------------------------------------------------------------------------- + # Plane usage + result_count = ddict(lambda: ddict(int)) + result_channel = ddict(lambda: ddict(int)) + + for _, pas in foreach_pass(data): + result_count[pas.partitions][pas.planes] += 1 + if (pas.planes > 1): + result_channel[pas.partitions][pas.plane2_component] += 1 + + print("Plane Usage") + print("===========") + keys = sorted(result_count.keys()) + for key in keys: + keys2 = sorted(result_count[key]) + for key2 in keys2: + val2 = result_count[key][key2] + dat = (key, key2, val2) + print(" - %u partition(s) %u plane(s) = %6u blocks" % dat) + if key2 == 2: + keys3 = sorted(result_channel[key]) + for key3 in keys3: + dat = (CHANNEL_TABLE[key3], result_channel[key][key3]) + print(" - %s plane = %6u blocks" % dat) + + print("") + + # ------------------------------------------------------------------------- + # Decimation usage + decim_count = ddict(lambda: ddict(int)) + quant_count = ddict(lambda: ddict(lambda: ddict(int))) + + + MERGE_ROTATIONS = True + + for _, pas, can in foreach_candidate(data): + # Skip constant color blocks + if can is None: + continue + + wx = can.weight_x + wy = can.weight_y + + if MERGE_ROTATIONS and wx < wy: + wx, wy = wy, wx + + decim_count[wx][wy] += 1 + quant_count[wx][wy][can.weight_quant] += 1 + + print("Decimation Usage") + print("================") + + if MERGE_ROTATIONS: + print(" - Note: data merging grid rotations") + + x_keys = sorted(decim_count.keys()) + for x_key in x_keys: + y_keys = sorted(decim_count[x_key]) + + for y_key in y_keys: + count = decim_count[x_key][y_key] + dat = (x_key, y_key, count) + print(" - %ux%u weights = %6u blocks" % dat) + + q_keys = sorted(quant_count[x_key][y_key]) + for q_key in q_keys: + count = quant_count[x_key][y_key][q_key] + dat = (q_key, count) + print(" - %2u quant range = %6u blocks" % dat) + + print("") + + # ------------------------------------------------------------------------- + # Refinement usage + + total_count = 0 + better_count = 0 + could_have_count = 0 + success_count = 0 + + refinement_step = [] + + for block, pas, candidate in foreach_candidate(data): + # Ignore zero partition blocks - they don't use refinement + if not candidate: + continue + + target_error = block.error_target + start_error = candidate.refinement_errors[0] + end_error = candidate.refinement_errors[-1] + + rpf = float(start_error - end_error) / float(len(candidate.refinement_errors)) + rpf = abs(rpf) + refinement_step.append(rpf / start_error) + + total_count += 1 + if end_error <= start_error: + better_count += 1 + + if end_error <= target_error: + success_count += 1 + else: + for refinement in candidate.refinement_errors: + if refinement <= target_error: + could_have_count += 1 + break + + + print("Refinement Usage") + print("================") + print(" - %u refinements(s)" % total_count) + print(" - %u refinements(s) improved" % better_count) + print(" - %u refinements(s) worsened" % (total_count - better_count)) + print(" - %u refinements(s) could hit target, but didn't" % could_have_count) + print(" - %u refinements(s) hit target" % success_count) + print(" - %f mean step improvement" % np.mean(refinement_step)) + + +def parse_command_line(): + """ + Parse the command line. + + Returns: + Namespace: The parsed command line container. + """ + parser = argparse.ArgumentParser() + + parser.add_argument("trace", type=argparse.FileType("r"), + help="The trace file to analyze") + + return parser.parse_args() + + +def main(): + """ + The main function. + + Returns: + int: The process return code. + """ + args = parse_command_line() + + data = json.load(args.trace) + db = generate_database(data) + filter_database(db) + + generate_feature_statistics(db) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ktx/external/astc-encoder/Test/astc_update_ref.sh b/ktx/external/astc-encoder/Test/astc_update_ref.sh new file mode 100644 index 0000000..205af97 --- /dev/null +++ b/ktx/external/astc-encoder/Test/astc_update_ref.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +if [ -z "$1" ]; then + echo "ERROR: Missing root; e.g. for ref-main-avx2 set 'main'" + exit 1 +fi + +echo "Generating new ref-$1 results" + +if [ "$1" = "main" ]; then + echo "Using binary from ./bin/${1}/" +else + echo "Using binary from ./Binaries/${1}/" +fi + +echo "" + +TARGET_ROOT=${1} + +python3 ./Test/astc_test_image.py --test-set all --block-size all --test-quality all --repeats 6 --encoder ref-$1-avx2 +#python3 ./Test/astc_test_image.py --test-set all --block-size all --test-quality all --repeats 6 --encoder ref-$1-sse4.1 +#python3 ./Test/astc_test_image.py --test-set all --block-size all --test-quality all --repeats 6 --encoder ref-$1-sse2 +#python3 ./Test/astc_test_image.py --test-set all --block-size all --test-quality all --repeats 6 --encoder ref-$1-neon -j3 diff --git a/ktx/external/astc-encoder/Test/make.bat b/ktx/external/astc-encoder/Test/make.bat new file mode 100644 index 0000000..8634eff --- /dev/null +++ b/ktx/external/astc-encoder/Test/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=DocSource +set BUILDDIR=DocOut + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/ktx/external/astc-encoder/Test/testlib/__init__.py b/ktx/external/astc-encoder/Test/testlib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ktx/external/astc-encoder/Test/testlib/encoder.py b/ktx/external/astc-encoder/Test/testlib/encoder.py new file mode 100644 index 0000000..f0bd089 --- /dev/null +++ b/ktx/external/astc-encoder/Test/testlib/encoder.py @@ -0,0 +1,427 @@ +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2019-2023 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. +# ----------------------------------------------------------------------------- +""" +These classes provide an abstraction around the astcenc command line tool, +allowing the rest of the image test suite to ignore changes in the command line +interface. +""" + +import os +import re +import subprocess as sp +import sys + + +class EncoderBase(): + """ + This class is a Python wrapper for the `astcenc` binary, providing an + abstract means to set command line options and parse key results. + + This is an abstract base class providing some generic helper functionality + used by concrete instantiations of subclasses. + + Attributes: + binary: The encoder binary path. + variant: The encoder SIMD variant being tested. + name: The encoder name to use in reports. + VERSION: The encoder version or branch. + SWITCHES: Dict of switch replacements for different color formats. + OUTPUTS: Dict of output file extensions for different color formats. + """ + + VERSION = None + SWITCHES = None + OUTPUTS = None + + def __init__(self, name, variant, binary): + """ + Create a new encoder instance. + + Args: + name (str): The name of the encoder. + variant (str): The SIMD variant of the encoder. + binary (str): The path to the binary on the file system. + """ + self.name = name + self.variant = variant + self.binary = binary + + def build_cli(self, image, blockSize="6x6", preset="-thorough", + keepOutput=True, threads=None): + """ + Build the command line needed for the given test. + + Args: + image (TestImage): The test image to compress. + blockSize (str): The block size to use. + preset (str): The quality-performance preset to use. + keepOutput (bool): Should the test preserve output images? This is + only a hint and discarding output may be ignored if the encoder + version used can't do it natively. + threads (int or None): The thread count to use. + + Returns: + list(str): A list of command line arguments. + """ + # pylint: disable=unused-argument,no-self-use,redundant-returns-doc + assert False, "Missing subclass implementation" + + def execute(self, command): + """ + Run a subprocess with the specified command. + + Args: + command (list(str)): The list of command line arguments. + + Returns: + list(str): The output log (stdout) split into lines. + """ + # pylint: disable=no-self-use + try: + result = sp.run(command, stdout=sp.PIPE, stderr=sp.PIPE, + check=True, universal_newlines=True) + except (OSError, sp.CalledProcessError): + print("ERROR: Test run failed") + print(" + %s" % " ".join(command)) + qcommand = ["\"%s\"" % x for x in command] + print(" + %s" % ", ".join(qcommand)) + sys.exit(1) + + return result.stdout.splitlines() + + def parse_output(self, image, output): + """ + Parse the log output for PSNR and performance metrics. + + Args: + image (TestImage): The test image to compress. + output (list(str)): The output log from the compression process. + + Returns: + tuple(float, float, float): PSNR in dB, TotalTime in seconds, and + CodingTime in seconds. + """ + # Regex pattern for image quality + patternPSNR = re.compile(self.get_psnr_pattern(image)) + patternTTime = re.compile(self.get_total_time_pattern()) + patternCTime = re.compile(self.get_coding_time_pattern()) + patternCRate = re.compile(self.get_coding_rate_pattern()) + + # Extract results from the log + runPSNR = None + runTTime = None + runCTime = None + runCRate = None + + for line in output: + match = patternPSNR.match(line) + if match: + runPSNR = float(match.group(1)) + + match = patternTTime.match(line) + if match: + runTTime = float(match.group(1)) + + match = patternCTime.match(line) + if match: + runCTime = float(match.group(1)) + + match = patternCRate.match(line) + if match: + runCRate = float(match.group(1)) + + stdout = "\n".join(output) + assert runPSNR is not None, "No coding PSNR found %s" % stdout + assert runTTime is not None, "No total time found %s" % stdout + assert runCTime is not None, "No coding time found %s" % stdout + assert runCRate is not None, "No coding rate found %s" % stdout + return (runPSNR, runTTime, runCTime, runCRate) + + def get_psnr_pattern(self, image): + """ + Get the regex pattern to match the image quality metric. + + Note, while this function is called PSNR for some images we may choose + to match another metric (e.g. mPSNR for HDR images). + + Args: + image (TestImage): The test image we are compressing. + + Returns: + str: The string for a regex pattern. + """ + # pylint: disable=unused-argument,no-self-use,redundant-returns-doc + assert False, "Missing subclass implementation" + + def get_total_time_pattern(self): + """ + Get the regex pattern to match the total compression time. + + Returns: + str: The string for a regex pattern. + """ + # pylint: disable=unused-argument,no-self-use,redundant-returns-doc + assert False, "Missing subclass implementation" + + def get_coding_time_pattern(self): + """ + Get the regex pattern to match the coding compression time. + + Returns: + str: The string for a regex pattern. + """ + # pylint: disable=unused-argument,no-self-use,redundant-returns-doc + assert False, "Missing subclass implementation" + + def run_test(self, image, blockSize, preset, testRuns, keepOutput=True, + threads=None): + """ + Run the test N times. + + Args: + image (TestImage): The test image to compress. + blockSize (str): The block size to use. + preset (str): The quality-performance preset to use. + testRuns (int): The number of test runs. + keepOutput (bool): Should the test preserve output images? This is + only a hint and discarding output may be ignored if the encoder + version used can't do it natively. + threads (int or None): The thread count to use. + + Returns: + tuple(float, float, float, float): Returns the best results from + the N test runs, as PSNR (dB), total time (seconds), coding time + (seconds), and coding rate (M pixels/s). + """ + # pylint: disable=assignment-from-no-return + command = self.build_cli(image, blockSize, preset, keepOutput, threads) + + # Execute test runs + bestPSNR = 0 + bestTTime = sys.float_info.max + bestCTime = sys.float_info.max + bestCRate = 0 + + for _ in range(0, testRuns): + output = self.execute(command) + result = self.parse_output(image, output) + + # Keep the best results (highest PSNR, lowest times, highest rate) + bestPSNR = max(bestPSNR, result[0]) + bestTTime = min(bestTTime, result[1]) + bestCTime = min(bestCTime, result[2]) + bestCRate = max(bestCRate, result[3]) + + return (bestPSNR, bestTTime, bestCTime, bestCRate) + + +class Encoder2x(EncoderBase): + """ + This class wraps the latest `astcenc` 2.x series binaries from main branch. + """ + VERSION = "main" + + SWITCHES = { + "ldr": "-tl", + "ldrs": "-ts", + "hdr": "-th", + "hdra": "-tH" + } + + OUTPUTS = { + "ldr": ".png", + "ldrs": ".png", + "hdr": ".exr", + "hdra": ".exr" + } + + def __init__(self, variant, binary=None): + name = "astcenc-%s-%s" % (variant, self.VERSION) + + if binary is None: + if variant != "universal": + binary = f"./bin/astcenc-{variant}" + else: + binary = "./bin/astcenc" + + if os.name == 'nt': + binary = f"{binary}.exe" + + super().__init__(name, variant, binary) + + def build_cli(self, image, blockSize="6x6", preset="-thorough", + keepOutput=True, threads=None): + opmode = self.SWITCHES[image.colorProfile] + srcPath = image.filePath + + if keepOutput: + dstPath = image.outFilePath + self.OUTPUTS[image.colorProfile] + dstDir = os.path.dirname(dstPath) + dstFile = os.path.basename(dstPath) + dstPath = os.path.join(dstDir, self.name, preset[1:], blockSize, dstFile) + + dstDir = os.path.dirname(dstPath) + os.makedirs(dstDir, exist_ok=True) + elif sys.platform == "win32": + dstPath = "nul" + else: + dstPath = "/dev/null" + + command = [ + self.binary, opmode, srcPath, dstPath, + blockSize, preset, "-silent" + ] + + if image.colorFormat == "xy": + command.append("-normal") + + if image.isAlphaScaled: + command.append("-a") + command.append("1") + + if threads is not None: + command.append("-j") + command.append("%u" % threads) + + return command + + def get_psnr_pattern(self, image): + if image.colorProfile != "hdr": + if image.colorFormat != "rgba": + patternPSNR = r"\s*PSNR \(LDR-RGB\):\s*([0-9.]*) dB" + else: + patternPSNR = r"\s*PSNR \(LDR-RGBA\):\s*([0-9.]*) dB" + else: + patternPSNR = r"\s*mPSNR \(RGB\)(?: \[.*?\] )?:\s*([0-9.]*) dB.*" + return patternPSNR + + def get_total_time_pattern(self): + return r"\s*Total time:\s*([0-9.]*) s" + + def get_coding_time_pattern(self): + return r"\s*Coding time:\s*([0-9.]*) s" + + def get_coding_rate_pattern(self): + return r"\s*Coding rate:\s*([0-9.]*) MT/s" + + +class Encoder2xRel(Encoder2x): + """ + This class wraps a released 2.x series binary. + """ + def __init__(self, version, variant): + + self.VERSION = version + + if variant != "universal": + binary = f"./Binaries/{version}/astcenc-{variant}" + else: + binary = f"./Binaries/{version}/astcenc" + + if os.name == 'nt': + binary = f"{binary}.exe" + + super().__init__(variant, binary) + + +class Encoder1_7(EncoderBase): + """ + This class wraps the 1.7 series binaries. + """ + VERSION = "1.7" + + SWITCHES = { + "ldr": "-tl", + "ldrs": "-ts", + "hdr": "-t" + } + + OUTPUTS = { + "ldr": ".tga", + "ldrs": ".tga", + "hdr": ".htga" + } + + def __init__(self): + name = "astcenc-%s" % self.VERSION + if os.name == 'nt': + binary = "./Binaries/1.7/astcenc.exe" + else: + binary = "./Binaries/1.7/astcenc" + + super().__init__(name, None, binary) + + def build_cli(self, image, blockSize="6x6", preset="-thorough", + keepOutput=True, threads=None): + + if preset == "-fastest": + preset = "-fast" + + opmode = self.SWITCHES[image.colorProfile] + srcPath = image.filePath + + dstPath = image.outFilePath + self.OUTPUTS[image.colorProfile] + dstDir = os.path.dirname(dstPath) + dstFile = os.path.basename(dstPath) + dstPath = os.path.join(dstDir, self.name, preset[1:], blockSize, dstFile) + + dstDir = os.path.dirname(dstPath) + os.makedirs(dstDir, exist_ok=True) + + command = [ + self.binary, opmode, srcPath, dstPath, + blockSize, preset, "-silentmode", "-time", "-showpsnr" + ] + + if image.colorFormat == "xy": + command.append("-normal_psnr") + + if image.colorProfile == "hdr": + command.append("-hdr") + + if image.isAlphaScaled: + command.append("-alphablend") + + if threads is not None: + command.append("-j") + command.append("%u" % threads) + + return command + + def get_psnr_pattern(self, image): + if image.colorProfile != "hdr": + if image.colorFormat != "rgba": + patternPSNR = r"PSNR \(LDR-RGB\):\s*([0-9.]*) dB" + else: + patternPSNR = r"PSNR \(LDR-RGBA\):\s*([0-9.]*) dB" + else: + patternPSNR = r"mPSNR \(RGB\)(?: \[.*?\] )?:\s*([0-9.]*) dB.*" + return patternPSNR + + def get_total_time_pattern(self): + # Pattern match on a new pattern for a 2.1 compatible variant + # return r"Elapsed time:\s*([0-9.]*) seconds.*" + return r"\s*Total time:\s*([0-9.]*) s" + + def get_coding_time_pattern(self): + # Pattern match on a new pattern for a 2.1 compatible variant + # return r".* coding time: \s*([0-9.]*) seconds" + return r"\s*Coding time:\s*([0-9.]*) s" + + def get_coding_rate_pattern(self): + # Pattern match on a new pattern for a 2.1 compatible variant + return r"\s*Coding rate:\s*([0-9.]*) MT/s" diff --git a/ktx/external/astc-encoder/Test/testlib/image.py b/ktx/external/astc-encoder/Test/testlib/image.py new file mode 100644 index 0000000..153de09 --- /dev/null +++ b/ktx/external/astc-encoder/Test/testlib/image.py @@ -0,0 +1,361 @@ +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2019-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. +# ----------------------------------------------------------------------------- +""" +This module contains code for loading image metadata from a file path on disk. + +The directory path is structured: + + TestSetName/TestFormat/FileName + +... and the file name is structured: + + colorProfile-colorFormat-name[-flags].extension +""" + +from collections.abc import Iterable +import os +import re +import subprocess as sp + +from PIL import Image as PILImage + +import testlib.misc as misc + + +CONVERT_BINARY = ["convert"] + + +class ImageException(Exception): + """ + Exception thrown for bad image specification. + """ + + +class TestImage(): + """ + Objects of this type contain metadata for a single test image on disk. + + Attributes: + filePath: The path of the file on disk. + outFilePath: The path of the output file on disk. + testSet: The name of the test set. + testFormat: The test format group. + testFile: The test file name. + colorProfile: The image compression color profile. + colorFormat: The image color format. + name: The image human name. + is3D: True if the image is 3D, else False. + isAlphaScaled: True if the image wants alpha scaling, else False. + TEST_EXTS: Expected test image extensions. + PROFILES: Tuple of valid color profile values. + FORMATS: Tuple of valid color format values. + FLAGS: Map of valid flags (key) and their meaning (value). + """ + TEST_EXTS = (".jpg", ".png", ".tga", ".dds", ".hdr", ".ktx") + + PROFILES = ("ldr", "ldrs", "hdr") + + FORMATS = ("l", "la", "xy", "rgb", "rgba") + + FLAGS = { + # Flags for image compression control + "3": "3D image", + "m": "Mask image", + "a": "Alpha scaled image" + } + + def __init__(self, filePath): + """ + Create a new image definition, based on a structured file path. + + Args: + filePath (str): The path of the image on disk. + + Raises: + ImageException: The image couldn't be found or is unstructured. + """ + self.filePath = os.path.abspath(filePath) + if not os.path.exists(self.filePath): + raise ImageException("Image doesn't exist (%s)" % filePath) + + # Decode the path + scriptDir = os.path.dirname(__file__) + rootInDir = os.path.join(scriptDir, "..", "Images") + partialPath = os.path.relpath(self.filePath, rootInDir) + parts = misc.path_splitall(partialPath) + if len(parts) != 3: + raise ImageException("Image path not path triplet (%s)" % parts) + self.testSet = parts[0] + self.testFormat = parts[1] + self.testFile = parts[2] + + # Decode the file name + self.decode_file_name(self.testFile) + + # Output file path (store base without extension) + rootOutDir = os.path.join(scriptDir, "..", "..", "TestOutput") + outFilePath = os.path.join(rootOutDir, partialPath) + outFilePath = os.path.abspath(outFilePath) + outFilePath = os.path.splitext(outFilePath)[0] + self.outFilePath = outFilePath + + def decode_file_name(self, fileName): + """ + Utility function to decode metadata from an encoded file name. + + Args: + fileName (str): The file name to tokenize. + + Raises: + ImageException: The image file path is badly structured. + """ + # Strip off the extension + rootName = os.path.splitext(fileName)[0] + + parts = rootName.split("-") + + # Decode the mandatory fields + if len(parts) >= 3: + self.colorProfile = parts[0] + if self.colorProfile not in self.PROFILES: + raise ImageException("Unknown color profile (%s)" % parts[0]) + + self.colorFormat = parts[1] + if self.colorFormat not in self.FORMATS: + raise ImageException("Unknown color format (%s)" % parts[1]) + + # Consistency check between directory and file names + reencode = "%s-%s" % (self.colorProfile, self.colorFormat) + compare = self.testFormat.lower() + if reencode != compare: + dat = (self.testFormat, reencode) + raise ImageException("Mismatched test and image (%s:%s)" % dat) + + self.name = parts[2] + + # Set default values for the optional fields + self.is3D = False + self.isAlphaScaled = False + + # Decode the flags field if present + if len(parts) >= 4: + flags = parts[3] + seenFlags = set() + for flag in flags: + if flag in seenFlags: + raise ImageException("Duplicate flag (%s)" % flag) + if flag not in self.FLAGS: + raise ImageException("Unknown flag (%s)" % flag) + seenFlags.add(flag) + + self.is3D = "3" in seenFlags + self.isAlphaScaled = "a" in seenFlags + + def get_size(self): + """ + Get the dimensions of this test image, if format is known. + + Known cases today where the format is not known: + + * 3D .dds files. + * Any .ktx, .hdr, .exr, or .astc file. + + Returns: + tuple(int, int): The dimensions of a 2D image, or ``None`` if PIL + could not open the file. + """ + try: + img = PILImage.open(self.filePath) + except IOError: + # HDR files + return None + except NotImplementedError: + # DDS files + return None + + return (img.size[0], img.size[1]) + + +class Image(): + """ + Wrapper around an image on the file system. + """ + + # TODO: We don't support KTX yet, as ImageMagick doesn't. + SUPPORTED_LDR = ["bmp", "jpg", "png", "tga"] + SUPPORTED_HDR = ["exr", "hdr"] + + @classmethod + def is_format_supported(cls, fileFormat, profile=None): + """ + Test if a given file format is supported by the library. + + Args: + fileFormat (str): The file extension (excluding the "."). + profile (str or None): The profile (ldr or hdr) of the image. + + Returns: + bool: `True` if the image is supported, `False` otherwise. + """ + assert profile in [None, "ldr", "hdr"] + + if profile == "ldr": + return fileFormat in cls.SUPPORTED_LDR + + if profile == "hdr": + return fileFormat in cls.SUPPORTED_HDR + + return fileFormat in cls.SUPPORTED_LDR or \ + fileFormat in cls.SUPPORTED_HDR + + def __init__(self, filePath): + """ + Construct a new Image. + + Args: + filePath (str): The path to the image on disk. + """ + self.filePath = filePath + self.proxyPath = None + + def get_colors(self, coords): + """ + Get the image colors at the given coordinate. + + Args: + coords (tuple or list): A single coordinate, or a list of + coordinates to sample. + + Returns: + tuple: A single sample color (if `coords` was a coordinate). + list: A list of sample colors (if `coords` was a list). + + Colors are returned as float values between 0.0 and 1.0 for LDR, + and float values which may exceed 1.0 for HDR. + """ + colors = [] + + # We accept both a list of positions and a single position; + # canonicalize here so the main processing only handles lists + isList = len(coords) != 0 and isinstance(coords[0], Iterable) + + if not isList: + coords = [coords] + + for (x, y) in coords: + command = list(CONVERT_BINARY) + command += [self.filePath] + + # Ensure convert factors in format origin if needed + command += ["-auto-orient"] + + command += [ + "-format", "%%[pixel:p{%u,%u}]" % (x, y), + "info:" + ] + + if os.name == 'nt': + command.insert(0, "magick") + + result = sp.run(command, stdout=sp.PIPE, stderr=sp.PIPE, + check=True, universal_newlines=True) + + rawcolor = result.stdout.strip() + + # Decode ImageMagick's annoying named color outputs. Note that this + # only handles "known" cases triggered by our test images, we don't + # support the entire ImageMagick named color table. + if rawcolor == "black": + colors.append([0.0, 0.0, 0.0, 1.0]) + elif rawcolor == "white": + colors.append([1.0, 1.0, 1.0, 1.0]) + elif rawcolor == "red": + colors.append([1.0, 0.0, 0.0, 1.0]) + elif rawcolor == "blue": + colors.append([0.0, 0.0, 1.0, 1.0]) + + # Decode ImageMagick's format tuples + elif rawcolor.startswith("srgba"): + rawcolor = rawcolor[6:] + rawcolor = rawcolor[:-1] + channels = rawcolor.split(",") + for i, channel in enumerate(channels): + if (i < 3) and channel.endswith("%"): + channels[i] = float(channel[:-1]) / 100.0 + elif (i < 3) and not channel.endswith("%"): + channels[i] = float(channel) / 255.0 + else: + channels[i] = float(channel) + colors.append(channels) + elif rawcolor.startswith("srgb"): + rawcolor = rawcolor[5:] + rawcolor = rawcolor[:-1] + channels = rawcolor.split(",") + for i, channel in enumerate(channels): + if (i < 3) and channel.endswith("%"): + channels[i] = float(channel[:-1]) / 100.0 + if (i < 3) and not channel.endswith("%"): + channels[i] = float(channel) / 255.0 + channels.append(1.0) + colors.append(channels) + elif rawcolor.startswith("rgba"): + rawcolor = rawcolor[5:] + rawcolor = rawcolor[:-1] + channels = rawcolor.split(",") + for i, channel in enumerate(channels): + if (i < 3) and channel.endswith("%"): + channels[i] = float(channel[:-1]) / 100.0 + elif (i < 3) and not channel.endswith("%"): + channels[i] = float(channel) / 255.0 + else: + channels[i] = float(channel) + colors.append(channels) + elif rawcolor.startswith("rgb"): + rawcolor = rawcolor[4:] + rawcolor = rawcolor[:-1] + channels = rawcolor.split(",") + for i, channel in enumerate(channels): + if (i < 3) and channel.endswith("%"): + channels[i] = float(channel[:-1]) / 100.0 + if (i < 3) and not channel.endswith("%"): + channels[i] = float(channel) / 255.0 + channels.append(1.0) + colors.append(channels) + else: + print(x, y) + print(rawcolor) + assert False + + # ImageMagick decodes DDS files as BGRA not RGBA; manually correct + if self.filePath.endswith("dds"): + for color in colors: + tmp = color[0] + color[0] = color[2] + color[2] = tmp + + # ImageMagick decodes EXR files with premult alpha; manually correct + if self.filePath.endswith("exr"): + for color in colors: + color[0] /= color[3] + color[1] /= color[3] + color[2] /= color[3] + + # Undo list canonicalization if we were given a single scalar coord + if not isList: + return colors[0] + + return colors diff --git a/ktx/external/astc-encoder/Test/testlib/misc.py b/ktx/external/astc-encoder/Test/testlib/misc.py new file mode 100644 index 0000000..98a5c01 --- /dev/null +++ b/ktx/external/astc-encoder/Test/testlib/misc.py @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2020 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. +# ----------------------------------------------------------------------------- +""" +A collection of useful utility functions that are not module specific. +""" + +import os + + +def path_splitall(path): + """ + Utility function to split a relative path into its component pieces. + + Args: + path(str): The relative path to split. + + Returns: + list(str): An array of path parts. + """ + # Sanity check we have a relative path on Windows + assert ":" not in path + + parts = [] + while path: + head, tail = os.path.split(path) + path = head + parts.insert(0, tail) + + return parts diff --git a/ktx/external/astc-encoder/Test/testlib/resultset.py b/ktx/external/astc-encoder/Test/testlib/resultset.py new file mode 100644 index 0000000..9b2fb18 --- /dev/null +++ b/ktx/external/astc-encoder/Test/testlib/resultset.py @@ -0,0 +1,354 @@ +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2020-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. +# ----------------------------------------------------------------------------- +""" +A ResultSet stores a set of results about the performance of a TestSet. Each +set keeps result Records for each image and block size tested, that store the +PSNR and coding time. + +ResultSets are often backed by a CSV file on disk, and a ResultSet can be +compared against a set of reference results created by an earlier test run. +""" + + +import csv +import enum +import numpy as np +import os + + +@enum.unique +class Result(enum.IntEnum): + """ + An enumeration of test result status values. + + Attributes: + NOTRUN: The test has not been run. + PASS: The test passed. + WARN: The test image quality was below the pass threshold but above + the fail threshold. + FAIL: The test image quality was below the fail threshold. + """ + NOTRUN = 0 + PASS = 1 + WARN = 2 + FAIL = 3 + + +class ResultSummary(): + """ + An result summary data container, storing number of results of each type. + + Attributes: + notruns: The number of tests that did not run. + passes: The number of tests that passed. + warnings: The number of tests that produced a warning. + fails: The number of tests that failed. + tTimes: Total time speedup vs reference (<1 is slower, >1 is faster). + cTimes: Coding time speedup vs reference (<1 is slower, >1 is faster). + psnrs: Coding time quality vs reference (<0 is worse, >0 is better). + """ + + def __init__(self): + """ + Create a new result summary. + """ + # Pass fail metrics + self.notruns = 0 + self.passes = 0 + self.warnings = 0 + self.fails = 0 + + # Relative results + self.tTimesRel = [] + self.cTimesRel = [] + self.psnrRel = [] + + # Absolute results + self.cTime = [] + self.psnr = [] + + def add_record(self, record): + """ + Add a record to this summary. + + Args: + record (Record): The Record to add. + """ + if record.status == Result.PASS: + self.passes += 1 + elif record.status == Result.WARN: + self.warnings += 1 + elif record.status == Result.FAIL: + self.fails += 1 + else: + self.notruns += 1 + + if record.tTimeRel is not None: + self.tTimesRel.append(record.tTimeRel) + self.cTimesRel.append(record.cTimeRel) + self.psnrRel.append(record.psnrRel) + + self.cTime.append(record.cTime) + self.psnr.append(record.psnr) + + def get_worst_result(self): + """ + Get the worst result in this set. + + Returns: + Result: The worst test result. + """ + if self.fails: + return Result.FAIL + + if self.warnings: + return Result.WARN + + if self.passes: + return Result.PASS + + return Result.NOTRUN + + def __str__(self): + # Overall pass/fail results + overall = self.get_worst_result().name + dat = (overall, self.passes, self.warnings, self.fails) + result = ["\nSet Status: %s (Pass: %u | Warn: %u | Fail: %u)" % dat] + + if (self.tTimesRel): + # Performance summaries + dat = (np.mean(self.tTimesRel), np.std(self.tTimesRel)) + result.append("\nTotal speed: Mean: %+0.3f x Std: %0.2f x" % dat) + + dat = (np.mean(self.cTimesRel), np.std(self.cTimesRel)) + result.append("Coding speed: Mean: %+0.3f x Std: %0.2f x" % dat) + + dat = (np.mean(self.psnrRel), np.std(self.psnrRel)) + result.append("Quality diff: Mean: %+0.3f dB Std: %0.2f dB" % dat) + + dat = (np.mean(self.cTime), np.std(self.cTime)) + result.append("Coding time: Mean: %+0.3f s Std: %0.2f s" % dat) + + dat = (np.mean(self.psnr), np.std(self.psnr)) + result.append("Quality: Mean: %+0.3f dB Std: %0.2f dB" % dat) + + return "\n".join(result) + + +class Record(): + """ + A single result record, sotring results for a singel image and block size. + + Attributes: + blkSz: The block size. + name: The test image name. + psnr: The image quality (PSNR dB) + tTime: The total compression time. + cTime: The coding compression time. + cRate: The coding compression rate. + status: The test Result. + """ + + def __init__(self, blkSz, name, psnr, tTime, cTime, cRate): + """ + Create a result record, initially in the NOTRUN status. + + Args: + blkSz (str): The block size. + name (str): The test image name. + psnr (float): The image quality PSNR, in dB. + tTime (float): The total compression time, in seconds. + cTime (float): The coding compression time, in seconds. + cRate (float): The coding compression rate, in MPix/s. + tTimeRel (float): The relative total time speedup vs reference. + cTimeRel (float): The relative coding time speedup vs reference. + cRateRel (float): The relative rate speedup vs reference. + psnrRel (float): The relative PSNR dB vs reference. + """ + self.blkSz = blkSz + self.name = name + self.psnr = psnr + self.tTime = tTime + self.cTime = cTime + self.cRate = cRate + self.status = Result.NOTRUN + + self.tTimeRel = None + self.cTimeRel = None + self.cRateRel = None + self.psnrRel = None + + def set_status(self, result): + """ + Set the result status. + + Args: + result (Result): The test result. + """ + self.status = result + + def __str__(self): + return "'%s' / '%s'" % (self.blkSz, self.name) + + +class ResultSet(): + """ + A set of results for a TestSet, across one or more block sizes. + + Attributes: + testSet: The test set these results are linked to. + records: The list of test results. + """ + + def __init__(self, testSet): + """ + Create a new empty ResultSet. + + Args: + testSet (TestSet): The test set these results are linked to. + """ + self.testSet = testSet + self.records = [] + + def add_record(self, record): + """ + Add a new test record to this result set. + + Args: + record (Record): The test record to add. + """ + self.records.append(record) + + def get_record(self, testSet, blkSz, name): + """ + Get a record matching the arguments. + + Args: + testSet (TestSet): The test set to get results from. + blkSz (str): The block size. + name (str): The test name. + + Returns: + Record: The test result, if present. + + Raises: + KeyError: No match could be found. + """ + if testSet != self.testSet: + raise KeyError() + + for record in self.records: + if record.blkSz == blkSz and record.name == name: + return record + + raise KeyError() + + def get_matching_record(self, other): + """ + Get a record matching the config of another record. + + Args: + other (Record): The pattern result record to match. + + Returns: + Record: The result, if present. + + Raises: + KeyError: No match could be found. + """ + for record in self.records: + if record.blkSz == other.blkSz and record.name == other.name: + return record + + raise KeyError() + + def get_results_summary(self): + """ + Get a results summary of all the records in this result set. + + Returns: + ResultSummary: The result summary. + """ + summary = ResultSummary() + for record in self.records: + summary.add_record(record) + + return summary + + def save_to_file(self, filePath): + """ + Save this result set to a CSV file. + + Args: + filePath (str): The output file path. + """ + dirName = os.path.dirname(filePath) + if not os.path.exists(dirName): + os.makedirs(dirName) + + with open(filePath, "w", newline="") as csvfile: + writer = csv.writer(csvfile) + self._save_header(writer) + for record in self.records: + self._save_record(writer, record) + + @staticmethod + def _save_header(writer): + """ + Write the header to the CSV file. + + Args: + writer (csv.writer): The CSV writer. + """ + row = ["Image Set", "Block Size", "Name", + "PSNR", "Total Time", "Coding Time", "Coding Rate"] + writer.writerow(row) + + def _save_record(self, writer, record): + """ + Write a record to the CSV file. + + Args: + writer (csv.writer): The CSV writer. + record (Record): The record to write. + """ + row = [self.testSet, + record.blkSz, + record.name, + "%0.4f" % record.psnr, + "%0.4f" % record.tTime, + "%0.4f" % record.cTime, + "%0.4f" % record.cRate] + writer.writerow(row) + + def load_from_file(self, filePath): + """ + Load a reference result set from a CSV file on disk. + + Args: + filePath (str): The input file path. + """ + with open(filePath, "r") as csvfile: + reader = csv.reader(csvfile) + # Skip the header + next(reader) + for row in reader: + assert row[0] == self.testSet + record = Record(row[1], row[2], + float(row[3]), float(row[4]), + float(row[5]), float(row[6])) + self.add_record(record) diff --git a/ktx/external/astc-encoder/Test/testlib/testset.py b/ktx/external/astc-encoder/Test/testlib/testset.py new file mode 100644 index 0000000..0c54689 --- /dev/null +++ b/ktx/external/astc-encoder/Test/testlib/testset.py @@ -0,0 +1,96 @@ +# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Copyright 2020 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. +# ----------------------------------------------------------------------------- +""" +An ASTC TestSet is comprised of a set of TestImages. Images are stored in a +structured directory layout. This structure encodes important metadata about +each image - such as color profile and data encoding - in the directory and +file names used. + +TestSets are built by using reflection on a root directory to automatically +find all of the test images that comprise the set. +""" + +import os + +from testlib.image import TestImage + + +class TSetException(Exception): + """ + Exception thrown for bad test set specification. + """ + + +class TestSet(): + """ + Generate a list of images that are test candidates. + + This reflection is built automatically based on a directory of images on + disk, provided that the images follow a standard structure. + + Attributes: + name: The name of the test set. + tests: The list of TestImages forming the set. + """ + + def __init__(self, name, rootDir, profiles, formats, imageFilter=None): + """ + Create a new TestSet through reflection. + + Args: + name (str): The name of the test set. + rootDir (str): The root directory of the test set. + profiles (list(str)): The ASTC profiles to allow. + formats (list(str)): The image formats to allow. + imageFilter (str): The name of the image to include (for bug repo). + + Raises: + TSetException: The specified TestSet could not be loaded. + """ + self.name = name + + if not os.path.exists(rootDir) and not os.path.isdir(rootDir): + raise TSetException("Bad test set root directory (%s)" % rootDir) + + self.tests = [] + + for (dirPath, dirNames, fileNames) in os.walk(rootDir): + for fileName in fileNames: + # Only select image files + fileExt = os.path.splitext(fileName)[1] + if fileExt not in TestImage.TEST_EXTS: + continue + + # Create the TestImage for each file on disk + filePath = os.path.join(dirPath, fileName) + image = TestImage(filePath) + + # Filter out the ones we don't want to allow + if image.colorProfile not in profiles: + continue + + if image.colorFormat not in formats: + continue + + if imageFilter and image.testFile != imageFilter: + continue + + self.tests.append((filePath, image)) + + # Sort the TestImages so they are in a stable order + self.tests.sort() + self.tests = [x[1] for x in self.tests] diff --git a/ktx/external/astc-encoder/Utils/Example/CMakeLists.txt b/ktx/external/astc-encoder/Utils/Example/CMakeLists.txt new file mode 100644 index 0000000..00437b0 --- /dev/null +++ b/ktx/external/astc-encoder/Utils/Example/CMakeLists.txt @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: Apache-2.0 +# ---------------------------------------------------------------------------- +# Copyright 2021 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. +# ---------------------------------------------------------------------------- + +# CMake configuration +cmake_minimum_required(VERSION 3.15) +include(ExternalProject) + +project(astcencoder_example VERSION 1.1.0) + +# Add the external project and pull out the project directories we need + +# The default build is a native build which supports the highest level of SIMD +# exposed by the compiler when using default compiler flags. Add a single +# SIMD enable to the CMAKE_CACHE_ARGS option to force something specific, but +# remember to change the link library in target_link_libraries() to match. +# +# * Add "-DASTCENC_ISA_SSE2:String=ON" and link against "astcenc-sse2-static" +# * Add "-DASTCENC_ISA_SSE41:String=ON" and link against "astcenc-sse4.1-static" +# * Add "-DASTCENC_ISA_AVX2:String=ON" and link against "astcenc-avx2-static" +# * Add "-DASTCENC_ISA_NEON:String=ON" and link against "astcenc-neon-static" +ExternalProject_Add(astcencoder + GIT_REPOSITORY https://github.com/ARM-software/astc-encoder + GIT_TAG main + CMAKE_CACHE_ARGS -DASTCENC_CLI:STRING=OFF -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + INSTALL_COMMAND "") + +ExternalProject_Get_property(astcencoder + SOURCE_DIR) + +ExternalProject_Get_property(astcencoder + BINARY_DIR) + +# Build the command line +add_executable(astcenc_example astc_api_example.cpp) + +# ... with astcencoder as a dependency +add_dependencies(astcenc_example astcencoder) + +# ... with astcencoder Source dir on the include path +target_include_directories(astcenc_example + PRIVATE + ${SOURCE_DIR}/Source) + +# ... with astcencoder Binary dir on the library path and as a library dep +target_link_directories(astcenc_example + PRIVATE + ${BINARY_DIR}/Source) + +target_link_libraries(astcenc_example + PRIVATE + astcenc-native-static) diff --git a/ktx/external/astc-encoder/Utils/Example/README.md b/ktx/external/astc-encoder/Utils/Example/README.md new file mode 100644 index 0000000..2620e4b --- /dev/null +++ b/ktx/external/astc-encoder/Utils/Example/README.md @@ -0,0 +1,55 @@ +# Library usage example + +This is a minimal example of using the astcenc codec as a library in another +project. This sample shows: + + * How to include astcenc as an external project CMake dependency. + * How to use the API to compress and decompress an image. + +For sake of simplicity the example application uses fixed compression settings, +reading an uncompressed LDR image, compressing using 6x6 blocks at medium +quality, and then decompressing and writing the decompressed image back to disk +as a PNG file. + +## Building + +:warning: For sake of simplicity the example CMake project uses the CMake +`ExternalProject` mechanism to import the astcenc project from GitHub. This is +trivial to integrate, but requires network access during the build to pull the +astcenc project. + +Most users will want to store a copy of astcenc in a project sub-directory, +e.g. by using git submodules, and then use `add_subdirectory()` to include the +project in their build. This allows the user to directly use the astcenc core +library as a link requirement via `target_link_libraries()`, without the +additional plumbing that `ExternalProject` requires. + +### Linux and macOS + +From the `./Utils/Example` directory. + +``` +mkdir build +cd build +cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release .. +make -j8 +``` + +### Windows + +From the `./Utils/Example` directory, in a Visual Studio command prompt. + +``` +mkdir build +cd build +cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release .. +nmake +``` + +## Running + +From the build directory above. + +``` +astcenc_example +``` diff --git a/ktx/external/astc-encoder/Utils/Example/astc_api_example.cpp b/ktx/external/astc-encoder/Utils/Example/astc_api_example.cpp new file mode 100644 index 0000000..438915b --- /dev/null +++ b/ktx/external/astc-encoder/Utils/Example/astc_api_example.cpp @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2021-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. +// ---------------------------------------------------------------------------- + +// This is a minimal example of using the astcenc library. +// +// This sample shows how to include the astcenc library in your CMake project +// as an external dependency, and how to compress and decompress images using +// the C library API. +// +// For sake of clarity the command line exposed by the sample is minimalistic, +// and the compression uses a fixed set of options, but the code is commented +// to indicate where extension would be possible. Errors handling points are +// detected and logged, but resources are not cleaned up on error paths to keep +// the sample control path simple, so resources will leak on error. + +#include + +#include "astcenc.h" + +#define STB_IMAGE_IMPLEMENTATION +#include "ThirdParty/stb_image.h" + +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "ThirdParty/stb_image_write.h" + +int main(int argc, char **argv) +{ + // Parse command line + if (argc != 3) + { + printf("Usage:\n" + " %s \n\n" + " : Uncompressed LDR source image.\n" + " : Uncompressed LDR destination image (png).\n" + , argv[0]); + return 1; + } + + // ------------------------------------------------------------------------ + // For the purposes of this sample we hard-code the compressor settings + static const unsigned int thread_count = 1; + static const unsigned int block_x = 6; + static const unsigned int block_y = 6; + static const unsigned int block_z = 1; + static const astcenc_profile profile = ASTCENC_PRF_LDR; + static const float quality = ASTCENC_PRE_MEDIUM; + static const astcenc_swizzle swizzle { + ASTCENC_SWZ_R, ASTCENC_SWZ_G, ASTCENC_SWZ_B, ASTCENC_SWZ_A + }; + + // ------------------------------------------------------------------------ + // Load input image, forcing 4 components + int image_x, image_y, image_c; + uint8_t *image_data = (uint8_t*)stbi_load(argv[1], &image_x, &image_y, &image_c, 4); + if (!image_data) + { + printf("Failed to load image \"%s\"\n", argv[1]); + return 1; + } + + // Compute the number of ASTC blocks in each dimension + unsigned int block_count_x = (image_x + block_x - 1) / block_x; + unsigned int block_count_y = (image_y + block_y - 1) / block_y; + + // ------------------------------------------------------------------------ + // Initialize the default configuration for the block size and quality + astcenc_config config; + astcenc_error status; + status = astcenc_config_init(profile, block_x, block_y, block_z, quality, 0, &config); + if (status != ASTCENC_SUCCESS) + { + printf("ERROR: Codec config init failed: %s\n", astcenc_get_error_string(status)); + return 1; + } + + // ... power users can customize any config settings after calling + // config_init() and before calling context alloc(). + + // ------------------------------------------------------------------------ + // Create a context based on the configuration + astcenc_context* context; + status = astcenc_context_alloc(&config, thread_count, &context); + if (status != ASTCENC_SUCCESS) + { + printf("ERROR: Codec context alloc failed: %s\n", astcenc_get_error_string(status)); + return 1; + } + + // ------------------------------------------------------------------------ + // Compress the image + astcenc_image image; + image.dim_x = image_x; + image.dim_y = image_y; + image.dim_z = 1; + image.data_type = ASTCENC_TYPE_U8; + uint8_t* slices = image_data; + image.data = reinterpret_cast(&slices); + + // Space needed for 16 bytes of output per compressed block + size_t comp_len = block_count_x * block_count_y * 16; + uint8_t* comp_data = new uint8_t[comp_len]; + + status = astcenc_compress_image(context, &image, &swizzle, comp_data, comp_len, 0); + if (status != ASTCENC_SUCCESS) + { + printf("ERROR: Codec compress failed: %s\n", astcenc_get_error_string(status)); + return 1; + } + + // ... the comp_data array contains the raw compressed data you would pass + // to the graphics API, or pack into a wrapper format such as a KTX file. + + // If using multithreaded compression to sequentially compress multiple + // images you should reuse the same context, calling the function + // astcenc_compress_reset() between each image in the series. + + // ------------------------------------------------------------------------ + // Decompress the image + // Note we just reuse the image structure to store the output here ... + status = astcenc_decompress_image(context, comp_data, comp_len, &image, &swizzle, 0); + if (status != ASTCENC_SUCCESS) + { + printf("ERROR: Codec decompress failed: %s\n", astcenc_get_error_string(status)); + return 1; + } + + // If using multithreaded decompression to sequentially decompress multiple + // images you should reuse the same context, calling the function + // astcenc_decompress_reset() between each image in the series. + + // ------------------------------------------------------------------------ + // Store the result back to disk + stbi_write_png(argv[2], image_x, image_y, 4, image_data, 4 * image_x); + + // ------------------------------------------------------------------------ + // Cleanup library resources + stbi_image_free(image_data); + astcenc_context_free(context); + delete[] comp_data; + + return 0; +} diff --git a/ktx/external/astc-encoder/Utils/astc_blend_test.cpp b/ktx/external/astc-encoder/Utils/astc_blend_test.cpp new file mode 100644 index 0000000..1db6042 --- /dev/null +++ b/ktx/external/astc-encoder/Utils/astc_blend_test.cpp @@ -0,0 +1,298 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2021-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. +// ---------------------------------------------------------------------------- + +// This is a utility tool to test blend modes. + +#include +#include +#include + +#include "astcenc_mathlib.h" + +#define STB_IMAGE_IMPLEMENTATION +#include "ThirdParty/stb_image.h" + +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "ThirdParty/stb_image_write.h" + +/** + * @brief Linearize an sRGB value. + * + * @return The linearized value. + */ +static float srgb_to_linear( + float a +) { + if (a <= 0.04045f) + { + return a * (1.0f / 12.92f); + } + + return powf((a + 0.055f) * (1.0f / 1.055f), 2.4f); +} + +/** + * @brief sRGB gamma-encode a linear value. + * + * @return The gamma encoded value. + */ +static float linear_to_srgb( + float a +) { + if (a <= 0.0031308f) + { + return a * 12.92f; + } + + return 1.055f * powf(a, 1.0f / 2.4f) - 0.055f; +} + +int main(int argc, char **argv) +{ + // Parse command line + if (argc != 6) + { + printf("Usage: astc_blend_test \n"); + exit(1); + } + + const char* src_file = argv[1]; + const char* dst_file = argv[2]; + + bool use_linear = false; + if (!strcmp(argv[3], "linear")) + { + use_linear = true; + } + else if (!strcmp(argv[3], "srgb")) + { + use_linear = false; + } + else + { + printf(" must be either 'linear' or 'srgb'\n"); + exit(1); + } + + bool use_post_blend = false; + if (!strcmp(argv[4], "post")) + { + use_post_blend = true; + } + else if (!strcmp(argv[4], "pre")) + { + use_post_blend = false; + } + else + { + printf(" must be either 'post' or 'pre'\n"); + exit(1); + } + + bool use_filter = false; + if (!strcmp(argv[5], "on")) + { + use_filter = true; + } + else if (!strcmp(argv[5], "off")) + { + use_filter = false; + } + else + { + printf(" must be either 'on' or 'off'\n"); + exit(1); + } + + // Load the input image + int dim_x; + int dim_y; + const uint8_t* data_in = stbi_load(src_file, &dim_x, &dim_y, nullptr, 4); + if (!data_in) + { + printf("ERROR: Failed to load input image.\n"); + exit(1); + } + + // Allocate the output image + uint8_t* data_out = (uint8_t*)malloc(4 * dim_y * dim_x); + if (!data_out) + { + printf("ERROR: Failed to allocate output image.\n"); + exit(1); + } + + // For each pixel blending and filtering + if (!use_filter) + { + for (int y = 0; y < dim_y; y++) + { + const uint8_t* row_in = data_in + (4 * dim_x * y); + uint8_t* row_out = data_out + (4 * dim_x * y); + + for (int x = 0; x < dim_x; x++) + { + const uint8_t* pixel_in = row_in + 4 * x; + uint8_t* pixel_out = row_out + 4 * x; + + float r_src = static_cast(pixel_in[0]) / 255.0f; + float g_src = static_cast(pixel_in[1]) / 255.0f; + float b_src = static_cast(pixel_in[2]) / 255.0f; + float a_src = static_cast(pixel_in[3]) / 255.0f; + + if (use_linear == false) + { + r_src = srgb_to_linear(r_src); + g_src = srgb_to_linear(g_src); + b_src = srgb_to_linear(b_src); + } + + float r_dst = 0.53f; + float g_dst = 0.53f; + float b_dst = 0.53f; + + float r_out; + float g_out; + float b_out; + float a_out; + + // Post-multiply blending + if (use_post_blend) + { + r_out = (r_dst * (1.0f - a_src)) + (r_src * a_src); + g_out = (g_dst * (1.0f - a_src)) + (g_src * a_src); + b_out = (b_dst * (1.0f - a_src)) + (b_src * a_src); + a_out = 1.0f; + } + // Pre-multiply blending + else + { + r_out = (r_dst * (1.0f - a_src)) + (r_src * 1.0f); + g_out = (g_dst * (1.0f - a_src)) + (g_src * 1.0f); + b_out = (b_dst * (1.0f - a_src)) + (b_src * 1.0f); + a_out = 1.0f; + } + + // Clamp color between 0 and 1.0f + r_out = astc::min(r_out, 1.0f); + g_out = astc::min(g_out, 1.0f); + b_out = astc::min(b_out, 1.0f); + + if (use_linear == false) + { + r_out = linear_to_srgb(r_out); + g_out = linear_to_srgb(g_out); + b_out = linear_to_srgb(b_out); + } + + pixel_out[0] = (uint8_t)(r_out * 255.0f); + pixel_out[1] = (uint8_t)(g_out * 255.0f); + pixel_out[2] = (uint8_t)(b_out * 255.0f); + pixel_out[3] = (uint8_t)(a_out * 255.0f); + } + } + } + else + { + for (int y = 0; y < dim_y - 1; y++) + { + const uint8_t* row_in_0 = data_in + (4 * dim_x * y); + const uint8_t* row_in_1 = data_in + (4 * dim_x * (y + 1)); + + uint8_t* row_out = data_out + (4 * (dim_x - 1) * y); + + for (int x = 0; x < dim_x - 1; x++) + { + const uint8_t* pixel_in_00 = row_in_0 + 4 * x; + const uint8_t* pixel_in_01 = row_in_0 + 4 * (x + 1); + const uint8_t* pixel_in_10 = row_in_1 + 4 * x; + const uint8_t* pixel_in_11 = row_in_1 + 4 * (x + 1); + + uint8_t* pixel_out = row_out + 4 * x; + + // Bilinear filter with a half-pixel offset + float r_src = static_cast(pixel_in_00[0] + pixel_in_01[0] + pixel_in_10[0] + pixel_in_11[0]) / (255.0f * 4.0f); + float g_src = static_cast(pixel_in_00[1] + pixel_in_01[1] + pixel_in_10[1] + pixel_in_11[1]) / (255.0f * 4.0f); + float b_src = static_cast(pixel_in_00[2] + pixel_in_01[2] + pixel_in_10[2] + pixel_in_11[2]) / (255.0f * 4.0f); + float a_src = static_cast(pixel_in_00[3] + pixel_in_01[3] + pixel_in_10[3] + pixel_in_11[3]) / (255.0f * 4.0f); + + if (use_linear == false) + { + r_src = srgb_to_linear(r_src); + g_src = srgb_to_linear(g_src); + b_src = srgb_to_linear(b_src); + } + + float r_dst = 0.8f; + float g_dst = 1.0f; + float b_dst = 0.8f; + + float r_out; + float g_out; + float b_out; + float a_out; + + // Post-multiply blending + if (use_post_blend) + { + r_out = (r_dst * (1.0f - a_src)) + (r_src * a_src); + g_out = (g_dst * (1.0f - a_src)) + (g_src * a_src); + b_out = (b_dst * (1.0f - a_src)) + (b_src * a_src); + a_out = 1.0f; + } + // Pre-multiply blending + else + { + r_out = (r_dst * (1.0f - a_src)) + (r_src * 1.0f); + g_out = (g_dst * (1.0f - a_src)) + (g_src * 1.0f); + b_out = (b_dst * (1.0f - a_src)) + (b_src * 1.0f); + a_out = 1.0f; + } + + // Clamp color between 0 and 1.0f + r_out = astc::min(r_out, 1.0f); + g_out = astc::min(g_out, 1.0f); + b_out = astc::min(b_out, 1.0f); + + if (use_linear == false) + { + r_out = linear_to_srgb(r_out); + g_out = linear_to_srgb(g_out); + b_out = linear_to_srgb(b_out); + } + + pixel_out[0] = (uint8_t)(r_out * 255.0f); + pixel_out[1] = (uint8_t)(g_out * 255.0f); + pixel_out[2] = (uint8_t)(b_out * 255.0f); + pixel_out[3] = (uint8_t)(a_out * 255.0f); + } + } + } + + // Write out the result + if (!use_filter) + { + stbi_write_png(dst_file, dim_x, dim_y, 4, data_out, 4 * dim_x); + } + else + { + stbi_write_png(dst_file, dim_x - 1, dim_y - 1, 4, data_out, 4 * (dim_x - 1)); + } + + + return 0; +} diff --git a/ktx/external/astc-encoder/Utils/astc_quant_generator.cpp b/ktx/external/astc-encoder/Utils/astc_quant_generator.cpp new file mode 100644 index 0000000..ae9b4b0 --- /dev/null +++ b/ktx/external/astc-encoder/Utils/astc_quant_generator.cpp @@ -0,0 +1,406 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2023 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. +// ---------------------------------------------------------------------------- + +// This is a utility tool to generate quant tables +#include +#include +#include +#include + +/** + * @brief The ASTC quantization methods. + * + * Note, the values here are used directly in the encoding in the format so do not rearrange. + */ +enum quant_method +{ + QUANT_2 = 0, + QUANT_3 = 1, + QUANT_4 = 2, + QUANT_5 = 3, + QUANT_6 = 4, + QUANT_8 = 5, + QUANT_10 = 6, + QUANT_12 = 7, + QUANT_16 = 8, + QUANT_20 = 9, + QUANT_24 = 10, + QUANT_32 = 11, + QUANT_40 = 12, + QUANT_48 = 13, + QUANT_64 = 14, + QUANT_80 = 15, + QUANT_96 = 16, + QUANT_128 = 17, + QUANT_160 = 18, + QUANT_192 = 19, + QUANT_256 = 20 +}; + +static inline unsigned int get_quant_level(quant_method method) +{ + switch (method) + { + case QUANT_2: return 2; + case QUANT_3: return 3; + case QUANT_4: return 4; + case QUANT_5: return 5; + case QUANT_6: return 6; + case QUANT_8: return 8; + case QUANT_10: return 10; + case QUANT_12: return 12; + case QUANT_16: return 16; + case QUANT_20: return 20; + case QUANT_24: return 24; + case QUANT_32: return 32; + case QUANT_40: return 40; + case QUANT_48: return 48; + case QUANT_64: return 64; + case QUANT_80: return 80; + case QUANT_96: return 96; + case QUANT_128: return 128; + case QUANT_160: return 160; + case QUANT_192: return 192; + case QUANT_256: return 256; + } + + // Unreachable - the enum is fully described + return 0; +} + +struct quant_config { + quant_method quant; + unsigned int bits; + unsigned int trits; + unsigned int quints; + unsigned int C; + unsigned int masks[6]; +}; + +const std::array quant_configs {{ + { + QUANT_6, + 1, 1, 0, + 204, + { + 0b000000000, + 0b000000000, + 0b000000000, + 0b000000000, + 0b000000000, + 0b000000000 + } + }, { + QUANT_8, + 3, 0, 0, + 0, + { 0 } + }, { + QUANT_10, + 1, 0, 1, + 113, + { + 0b000000000, + 0b000000000, + 0b000000000, + 0b000000000, + 0b000000000, + 0b000000000 + } + }, { + QUANT_12, + 2, 1, 0, + 93, + { + 0b000000000, + 0b100010110, + 0b000000000, + 0b000000000, + 0b000000000, + 0b000000000 + } + }, { + QUANT_16, + 4, 0, 0, + 0, + { 0 } + }, { + QUANT_20, + 2, 0, 1, + 54, + { + 0b000000000, + 0b100001100, + 0b000000000, + 0b000000000, + 0b000000000, + 0b000000000 + } + }, { + QUANT_24, + 3, 1, 0, + 44, + { + 0b000000000, + 0b010000101, + 0b100001010, + 0b000000000, + 0b000000000, + 0b000000000 + } + }, { + QUANT_32, + 5, 0, 0, + 0, + { 0 } + }, + { + QUANT_40, + 3, 0, 1, + 26, + { + 0b000000000, + 0b010000010, + 0b100000101, + 0b000000000, + 0b000000000, + 0b000000000 + } + }, { + QUANT_48, + 4, 1, 0, + 22, + { + 0b000000000, + 0b001000001, + 0b010000010, + 0b100000100, + 0b000000000, + 0b000000000 + } + }, { + QUANT_64, + 6, 0, 0, + 0, + { 0 } + }, { + QUANT_80, + 4, 0, 1, + 13, + { + 0b000000000, + 0b001000000, + 0b010000001, + 0b100000010, + 0b000000000, + 0b000000000 + } + }, { + QUANT_96, + 5, 1, 0, + 11, + { + 0b000000000, + 0b000100000, + 0b001000000, + 0b010000001, + 0b100000010, + 0b000000000 + } + }, { + QUANT_128, + 7, 0, 0, + 0, + { 0 } + }, { + QUANT_160, + 5, 0, 1, + 6, + { + 0b000000000, + 0b000100000, + 0b001000000, + 0b010000000, + 0b100000001, + 0b000000000 + } + }, { + QUANT_192, + 6, 1, 0, + 5, + { + 0b000000000, + 0b000010000, + 0b000100000, + 0b001000000, + 0b010000000, + 0b100000001 + } + }, { + QUANT_256, + 8, 0, 0, + 0, + { 0 } + } +}}; + +void generate_unpacked_quant( + const quant_config& config, + std::set& set +) { + unsigned int levels = get_quant_level(config.quant); + unsigned int emitted = 0; + + // Value has 1 trit and N bits + if (config.trits) + { + for (unsigned int D = 0; D < 3; D++) + { + unsigned int max_bits = 1 << config.bits; + for (unsigned int bits = 0; bits < max_bits; bits++) + { + unsigned int A = (bits & 1) * 0b111111111; + unsigned int B = 0; + unsigned int bit = bits; + for (const auto& mask_n: config.masks) + { + unsigned int bit_n = bit & 1; + bit >>= 1; + B += bit_n * mask_n; + } + + unsigned int T = D * config.C + B; + T = T ^ A; + T = (A & 0x80) | (T >> 2); + set.insert(T); + } + } + } + // Value has 1 quint and N bits + else if (config.quints) + { + for (unsigned int D = 0; D < 5; D++) + { + unsigned int max_bits = 1 << config.bits; + for (unsigned int bits = 0; bits < max_bits; bits++) + { + unsigned int A = (bits & 1) * 0b111111111; + unsigned int B = 0; + unsigned int bit = bits; + for (const auto& mask_n: config.masks) + { + unsigned int bit_n = bit & 1; + bit >>= 1; + B += bit_n * mask_n; + } + + unsigned int T = D * config.C + B; + T = T ^ A; + T = (A & 0x80) | (T >> 2); + set.insert(T); + } + } + } + // Value has N bits + else + { + unsigned int max_bits = 1 << config.bits; + for (unsigned int bits = 0; bits < max_bits; bits++) + { + unsigned int T = bits << (8 - config.bits); + int bits_remaining = 8 - config.bits; + + while (bits_remaining > 0) + { + int shift = bits_remaining - config.bits; + bits_remaining -= config.bits; + if (shift > 0) + { + T |= bits << shift; + } + else + { + T |= bits >> -shift; + } + } + set.insert(T); + } + } +} + +void generate_unquant_to_unpacked_quant( + const quant_config& config, + const std::set& set +) { + for (unsigned int i = 0; i < 256; i++) + { + unsigned int min_dist = 256; + unsigned int val_lo = 256; + unsigned int val_hi = 0; + + for (const auto& val: set) + { + unsigned int dist = std::max(i, val) - std::min(i, val); + + if (dist < min_dist) + { + min_dist = dist; + val_lo = val; + val_hi = val; + } + else if (dist == min_dist) + { + val_lo = std::min(val_lo, val); + val_hi = std::max(val_hi, val); + } + } + + if ((i % 16) == 0) + { + printf("\t\t"); + } + + printf("%3u, %3u", val_lo, val_hi); + + if (i != 255) + { + printf(", "); + } + + if ((i % 16) == 15) + { + printf("\n"); + } + } +} + +int main(void) +{ + printf("const uint8_t color_unquant_to_uquant_tables[17][512] {\n"); + for (size_t i = 0; i < quant_configs.size(); i++) + { + const auto& config = quant_configs[i]; + std::set set; + + printf("\t{ // QUANT_%u\n", get_quant_level(config.quant)); + generate_unpacked_quant(config, set); + generate_unquant_to_unpacked_quant(config, set); + printf("\t},\n"); + } + printf("};\n"); + return 0; +} diff --git a/ktx/external/astc-encoder/Utils/astc_rgbm_codec.cpp b/ktx/external/astc-encoder/Utils/astc_rgbm_codec.cpp new file mode 100644 index 0000000..6d2760c --- /dev/null +++ b/ktx/external/astc-encoder/Utils/astc_rgbm_codec.cpp @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2021 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. +// ---------------------------------------------------------------------------- + +// This is a utility tool to encode HDR into RGBM, or decode RGBM into HDR. + +#include +#include +#include + +#include "astcenc_mathlib.h" + +#define STB_IMAGE_IMPLEMENTATION +#include "ThirdParty/stb_image.h" + +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "ThirdParty/stb_image_write.h" + +#define MODE_ENCODE 0 +#define MODE_DECODE 1 + +int main(int argc, char **argv) +{ + // Parse command line + if (argc != 6) + { + printf("Usage: astc_rgbm_codec [-ch|-dh] \n"); + exit(1); + } + + int opmode; + if (strcmp(argv[1], "-ch") == 0) + { + opmode = MODE_ENCODE; + } + else if (strcmp(argv[1], "-dh") == 0) + { + opmode = MODE_DECODE; + } + else + { + printf("ERROR: Bad operation mode\n"); + exit(1); + } + + float rgbm_multiplier = atof(argv[2]); + float low_clamp = atof(argv[3]); + + const char* src_file = argv[4]; + const char* dst_file = argv[5]; + + // Convert an HDR input file into an RGBM encoded LDR file + if (opmode == MODE_ENCODE) + { + // Load the input image + int dim_x; + int dim_y; + const float* data_in = stbi_loadf(src_file, &dim_x, &dim_y, nullptr, 4); + if (!data_in) + { + printf("ERROR: Failed to load input image.\n"); + exit(1); + } + + // Allocate the output image + uint8_t* data_out = (uint8_t*)malloc(4 * dim_y * dim_x); + if (!data_out) + { + printf("ERROR: Failed to allow output image.\n"); + exit(1); + } + + // For each pixel apply RGBM encoding + for (int y = 0; y < dim_y; y++) + { + const float* row_in = data_in + (4 * dim_x * y); + uint8_t* row_out = data_out + (4 * dim_x * y); + + for (int x = 0; x < dim_x; x++) + { + const float* pixel_in = row_in + 4 * x; + uint8_t* pixel_out = row_out + 4 * x; + + float r_in = pixel_in[0] / rgbm_multiplier; + float g_in = pixel_in[1] / rgbm_multiplier; + float b_in = pixel_in[2] / rgbm_multiplier; + + float max_rgb = astc::max(r_in, g_in, b_in); + + // Ensure we always round up to next largest M + float m_scale = astc::min(1.0f, ceil(max_rgb * 255.0f) / 255.0f); + + // But keep well above zero to avoid clamps in the compressor + m_scale = astc::max(m_scale, low_clamp / 255.0f); + + float r_scale = astc::min(1.0f, r_in / m_scale); + float g_scale = astc::min(1.0f, g_in / m_scale); + float b_scale = astc::min(1.0f, b_in / m_scale); + + pixel_out[0] = (uint8_t)(r_scale * 255.0f); + pixel_out[1] = (uint8_t)(g_scale * 255.0f); + pixel_out[2] = (uint8_t)(b_scale * 255.0f); + pixel_out[3] = (uint8_t)(m_scale * 255.0f); + } + } + + // Write out the result + stbi_write_png(dst_file, dim_x, dim_y, 4, data_out, 4 * dim_x); + } + // Convert an RGBM encoded LDR file into an HDR file + else + { + // Load the input image + int dim_x; + int dim_y; + const uint8_t* data_in = stbi_load(src_file, &dim_x, &dim_y, nullptr, 4); + if (!data_in) + { + printf("ERROR: Failed to load input image.\n"); + exit(1); + } + + // Allocate the output image + float* data_out = (float*)malloc(4 * dim_y * dim_x * sizeof(float)); + if (!data_out) + { + printf("ERROR: Failed to allow output image.\n"); + exit(1); + } + + // For each pixel apply RGBM decoding + for (int y = 0; y < dim_y; y++) + { + const uint8_t* row_in = data_in + (4 * dim_x * y); + float* row_out = data_out + (4 * dim_x * y); + + for (int x = 0; x < dim_x; x++) + { + const uint8_t* pixel_in = row_in + 4 * x; + float* pixel_out = row_out + 4 * x; + + float r_scale = ((float)pixel_in[0]) / 255.0f; + float g_scale = ((float)pixel_in[1]) / 255.0f; + float b_scale = ((float)pixel_in[2]) / 255.0f; + + float m_scale = ((float)pixel_in[3]) / 255.0f; + + pixel_out[0] = r_scale * (m_scale * rgbm_multiplier); + pixel_out[1] = g_scale * (m_scale * rgbm_multiplier); + pixel_out[2] = b_scale * (m_scale * rgbm_multiplier); + pixel_out[3] = 1.0f; + } + } + + // Write out the result + stbi_write_hdr(dst_file, dim_x, dim_y, 4, data_out); + } + + return 0; +} diff --git a/ktx/external/astc-encoder/Utils/astc_test_autoextract.cpp b/ktx/external/astc-encoder/Utils/astc_test_autoextract.cpp new file mode 100644 index 0000000..6575812 --- /dev/null +++ b/ktx/external/astc-encoder/Utils/astc_test_autoextract.cpp @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2021 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. +// ---------------------------------------------------------------------------- + +// Overview +// ======== +// +// This is a utility tool to automatically generate single tile test vectors +// out of a larger test image. This tool takes three input images: +// +// - the uncompressed referenced, +// - the known-good compressed reference, +// - a new compressed image. +// +// The two compressed images are compared block-by-block, and if any block +// differences are found the worst block is extracted from the uncompressed +// reference and written back to disk as a single tile output image. +// +// Limitations +// =========== +// +// This tool only currently supports 2D LDR images. +// +// Build +// ===== +// +// g++ astc_test_autoextract.cpp -I../Source -o astc_test_autoextract + +#include +#include + +#define STB_IMAGE_IMPLEMENTATION +#include "ThirdParty/stb_image.h" + +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "ThirdParty/stb_image_write.h" + +/** + * @brief Compute the array offset in a 2D image + */ +int pix(int x_pix, int y_idx, int x_idx, int chans, int p_idx) +{ + return ((y_idx * x_pix) + x_idx) * chans + p_idx; +} + +int main(int argc, char **argv) +{ + + // Parse command line + if (argc < 6) + { + printf("Usage: astc_test_extract \n"); + return 1; + } + + int blockdim_x, blockdim_y; + if (sscanf(argv[1], "%dx%d", &blockdim_x, &blockdim_y) < 2) + { + printf("blocksize must be of form WxH; e.g. 8x4\n"); + return 1; + } + + // Load the original reference image + int ref_dim_x, ref_dim_y, ref_ncomp; + uint8_t* data_ref = (uint8_t*)stbi_load(argv[2], &ref_dim_x, &ref_dim_y, &ref_ncomp, 4); + if (!data_ref) + { + printf("Failed to load reference image.\n"); + return 1; + } + + // Load the good test image + int good_dim_x, good_dim_y, good_ncomp; + uint8_t* data_good = (uint8_t*)stbi_load(argv[3], &good_dim_x, &good_dim_y, &good_ncomp, 4); + if (!data_good) + { + printf("Failed to load good test image.\n"); + return 1; + } + + // Load the bad test image + int bad_dim_x, bad_dim_y, bad_ncomp; + uint8_t* data_bad = (uint8_t*)stbi_load(argv[4], &bad_dim_x, &bad_dim_y, &bad_ncomp, 4); + if (!data_bad) + { + printf("Failed to load bad test image.\n"); + return 1; + } + + if (ref_dim_x != good_dim_x || ref_dim_x != bad_dim_x || + ref_dim_y != good_dim_y || ref_dim_y != bad_dim_y) + { + printf("Failed as images are different resolutions.\n"); + return 1; + } + + + int x_blocks = (ref_dim_x + blockdim_x - 1) / blockdim_x; + int y_blocks = (ref_dim_y + blockdim_y - 1) / blockdim_y; + + int *errorsums = (int*)malloc(x_blocks * y_blocks * 4); + for (int i = 0; i < x_blocks * y_blocks; i++) + { + errorsums[i] = 0; + } + + // Diff the two test images to find blocks that differ + for (int y = 0; y < ref_dim_y; y++) + { + for (int x = 0; x < ref_dim_x; x++) + { + int x_block = x / blockdim_x; + int y_block = y / blockdim_y; + + int r_gd = data_good[pix(ref_dim_x, y, x, 4, 0)]; + int g_gd = data_good[pix(ref_dim_x, y, x, 4, 1)]; + int b_gd = data_good[pix(ref_dim_x, y, x, 4, 2)]; + int a_gd = data_good[pix(ref_dim_x, y, x, 4, 3)]; + + int r_bd = data_bad[pix(ref_dim_x, y, x, 4, 0)]; + int g_bd = data_bad[pix(ref_dim_x, y, x, 4, 1)]; + int b_bd = data_bad[pix(ref_dim_x, y, x, 4, 2)]; + int a_bd = data_bad[pix(ref_dim_x, y, x, 4, 3)]; + + int r_diff = (r_gd - r_bd) * (r_gd - r_bd); + int g_diff = (g_gd - g_bd) * (g_gd - g_bd); + int b_diff = (b_gd - b_bd) * (b_gd - b_bd); + int a_diff = (a_gd - a_bd) * (a_gd - a_bd); + + int diff = r_diff + g_diff + b_diff + a_diff; + errorsums[pix(x_blocks, y_block, x_block, 1, 0)] += diff; + } + } + + // Diff the two test images to find blocks that differ + float worst_error = 0.0f; + int worst_x_block = 0; + int worst_y_block = 0; + for (int y = 0; y < y_blocks; y++) + { + for (int x = 0; x < x_blocks; x++) + { + float error = errorsums[pix(x_blocks, y, x, 1, 0)]; + if (error > worst_error) + { + worst_error = error; + worst_x_block = x; + worst_y_block = y; + } + } + } + + if (worst_error == 0.0f) + { + printf("No block errors found\n"); + } + else + { + int start_y = worst_y_block * blockdim_y; + int start_x = worst_x_block * blockdim_x; + + int end_y = (worst_y_block + 1) * blockdim_y; + int end_x = (worst_x_block + 1) * blockdim_x; + + if (end_x > ref_dim_x) + { + end_x = ref_dim_x; + } + + if (end_y > ref_dim_y) + { + end_y = ref_dim_y; + } + + int outblk_x = end_x - start_x; + int outblk_y = end_y - start_y; + + printf("Block errors found at ~(%u, %u) px\n", start_x, start_y); + + // Write out the worst bad block (from original reference) + uint8_t* data_out = &(data_ref[pix(ref_dim_x, start_y, start_x, 4, 0)]); + stbi_write_png(argv[5], outblk_x, outblk_y, 4, data_out, 4 * ref_dim_x); + } + + free(errorsums); + stbi_image_free(data_ref); + stbi_image_free(data_good); + stbi_image_free(data_bad); + return 0; +} diff --git a/ktx/external/astc-encoder/Utils/astc_test_autoextract_hdr.cpp b/ktx/external/astc-encoder/Utils/astc_test_autoextract_hdr.cpp new file mode 100644 index 0000000..a5d7761 --- /dev/null +++ b/ktx/external/astc-encoder/Utils/astc_test_autoextract_hdr.cpp @@ -0,0 +1,216 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2021 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. +// ---------------------------------------------------------------------------- + +// Overview +// ======== +// +// This is a utility tool to automatically generate single tile test vectors +// out of a larger test image. This tool takes three input images: +// +// - the uncompressed referenced, +// - the known-good compressed reference, +// - a new compressed image. +// +// The two compressed images are compared block-by-block, and if any block +// differences are found the worst block is extracted from the uncompressed +// reference and written back to disk as a single tile output image. +// +// Limitations +// =========== +// +// This tool only currently supports 2D LDR images. +// +// Build +// ===== +// +// g++ astc_test_autoextract_hdr.cpp -I../Source -o astc_test_autoextract_hdr + +#include +#include + +#define STB_IMAGE_IMPLEMENTATION +#include "ThirdParty/stb_image.h" + +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "ThirdParty/stb_image_write.h" + +/** + * @brief Compute the array offset in a 2D image + */ +int pix(int x_pix, int y_idx, int x_idx, int chans, int p_idx) +{ + return ((y_idx * x_pix) + x_idx) * chans + p_idx; +} + +int main(int argc, char **argv) +{ + + // Parse command line + if (argc < 6) + { + printf("Usage: astc_test_extract \n"); + return 1; + } + + int blockdim_x, blockdim_y; + if (sscanf(argv[1], "%dx%d", &blockdim_x, &blockdim_y) < 2) + { + printf("blocksize must be of form WxH; e.g. 8x4\n"); + return 1; + } + + // Load the original reference image + int ref_dim_x, ref_dim_y, ref_ncomp; + float* data_ref = (float*)stbi_loadf(argv[2], &ref_dim_x, &ref_dim_y, &ref_ncomp, 4); + if (!data_ref) + { + printf("Failed to load reference image.\n"); + return 1; + } + + // Load the good test image + int good_dim_x, good_dim_y, good_ncomp; + float* data_good = (float*)stbi_loadf(argv[3], &good_dim_x, &good_dim_y, &good_ncomp, 4); + if (!data_good) + { + printf("Failed to load good test image.\n"); + return 1; + } + + // Load the bad test image + int bad_dim_x, bad_dim_y, bad_ncomp; + float* data_bad = (float*)stbi_loadf(argv[4], &bad_dim_x, &bad_dim_y, &bad_ncomp, 4); + if (!data_bad) + { + printf("Failed to load bad test image.\n"); + return 1; + } + + if (ref_dim_x != good_dim_x || ref_dim_x != bad_dim_x || + ref_dim_y != good_dim_y || ref_dim_y != bad_dim_y) + { + printf("Failed as images are different resolutions.\n"); + return 1; + } + + + int x_blocks = (ref_dim_x + blockdim_x - 1) / blockdim_x; + int y_blocks = (ref_dim_y + blockdim_y - 1) / blockdim_y; + + float* errorsums = (float*)malloc(x_blocks * y_blocks * 4); + for (int i = 0; i < x_blocks * y_blocks; i++) + { + errorsums[i] = 0; + } + + // Diff the two test images to find blocks that differ + for (int y = 0; y < ref_dim_y; y++) + { + for (int x = 0; x < ref_dim_x; x++) + { + int x_block = x / blockdim_x; + int y_block = y / blockdim_y; + + float r_gd = data_good[pix(ref_dim_x, y, x, 4, 0)]; + float g_gd = data_good[pix(ref_dim_x, y, x, 4, 1)]; + float b_gd = data_good[pix(ref_dim_x, y, x, 4, 2)]; + float a_gd = data_good[pix(ref_dim_x, y, x, 4, 3)]; + + float r_bd = data_bad[pix(ref_dim_x, y, x, 4, 0)]; + float g_bd = data_bad[pix(ref_dim_x, y, x, 4, 1)]; + float b_bd = data_bad[pix(ref_dim_x, y, x, 4, 2)]; + float a_bd = data_bad[pix(ref_dim_x, y, x, 4, 3)]; + + float r_diff = (r_gd - r_bd) * (r_gd - r_bd); + float g_diff = (g_gd - g_bd) * (g_gd - g_bd); + float b_diff = (b_gd - b_bd) * (b_gd - b_bd); + float a_diff = (a_gd - a_bd) * (a_gd - a_bd); + + float diff = abs(r_diff) + abs(g_diff) + abs(b_diff) + abs(a_diff); + errorsums[pix(x_blocks, y_block, x_block, 1, 0)] += diff; + } + } + + // Diff the two test images to find blocks that differ + float worst_error = 0.0f; + int worst_x_block = 0; + int worst_y_block = 0; + for (int y = 0; y < y_blocks; y++) + { + for (int x = 0; x < x_blocks; x++) + { + float error = errorsums[pix(x_blocks, y, x, 1, 0)]; + if (error > worst_error) + { + worst_error = error; + worst_x_block = x; + worst_y_block = y; + } + } + } + + if (worst_error == 0.0f) + { + printf("No block errors found\n"); + } + else + { + int start_y = worst_y_block * blockdim_y; + int start_x = worst_x_block * blockdim_x; + + int end_y = (worst_y_block + 1) * blockdim_y; + int end_x = (worst_x_block + 1) * blockdim_x; + + if (end_x > ref_dim_x) + { + end_x = ref_dim_x; + } + + if (end_y > ref_dim_y) + { + end_y = ref_dim_y; + } + + int outblk_x = end_x - start_x; + int outblk_y = end_y - start_y; + + printf("Block errors found at ~(%u, %u) px\n", start_x, start_y); + + float* data_out = (float*)malloc(blockdim_x * blockdim_y * 4 * 4); + for (int y = 0; y < outblk_y; y++) + { + for (int x = 0; x < outblk_x; x++) + { + data_out[(y * outblk_x * 4) + (x * 4) + 0] = data_ref[((start_y + y) * ref_dim_x * 4) + ((start_x + x) * 4) + 0]; + data_out[(y * outblk_x * 4) + (x * 4) + 1] = data_ref[((start_y + y) * ref_dim_x * 4) + ((start_x + x) * 4) + 1]; + data_out[(y * outblk_x * 4) + (x * 4) + 2] = data_ref[((start_y + y) * ref_dim_x * 4) + ((start_x + x) * 4) + 2]; + data_out[(y * outblk_x * 4) + (x * 4) + 3] = data_ref[((start_y + y) * ref_dim_x * 4) + ((start_x + x) * 4) + 3]; + } + } + + // Write out the worst bad block (from original reference) + stbi_write_hdr(argv[5], outblk_x, outblk_y, 4, data_out); + + free(data_out); + } + + free(errorsums); + stbi_image_free(data_ref); + stbi_image_free(data_good); + stbi_image_free(data_bad); + return 0; +} diff --git a/ktx/external/astc-encoder/Utils/astcenc_u8_test_bench.cpp b/ktx/external/astc-encoder/Utils/astcenc_u8_test_bench.cpp new file mode 100644 index 0000000..b44d695 --- /dev/null +++ b/ktx/external/astc-encoder/Utils/astcenc_u8_test_bench.cpp @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: Apache-2.0 +// ---------------------------------------------------------------------------- +// Copyright 2023 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. +// ---------------------------------------------------------------------------- + +// astcenc doesn't use the top 8 integer bits directly for sRGB RGB components +// or when using the decode_unorm8 decode mode. An alterantive is used which +// allows a common code path to be used. This test program shows that the two +// produce equivalent output once rounded to a decode_unorm8 output. + +// Compile with e.g. clang++ astcenc_u8_test_bench.cpp -o astcenc_u8_test_bench -mavx2 -mf16c + +#define ASTCENC_AVX 2 +#define ASTCENC_F16C 1 +#define ASTCENC_SSE 41 + +#include "../Source/astcenc_mathlib.cpp" +#include "../Source/astcenc_color_unquantize.cpp" +#include "../Source/astcenc_decompress_symbolic.cpp" + +int main() +{ + printf("Decode mode test bench\n"); + + for (int ep0 = 0; ep0 < 256; ep0++) + { + for (int ep1 = 0; ep1 < 256; ep1++) + { + for (int wt1 = 0; wt1 < 65; wt1++) + { + // Validate linear data with decode_unorm8 mode + { + // Expand 8 bit to 16 bit + vint4 weights(wt1); + int ep0_v0 = ep0 * 257; + int ep1_v0 = ep1 * 257; + + // Linear with decode_u8 handling + vmask4 decode_u8_v0(true, true, true, true); + vint4 ep0v0(ep0_v0, ep0_v0, ep0_v0, ep0_v0); + vint4 ep1v0(ep1_v0, ep1_v0, ep1_v0, ep1_v0); + + // Linear without decode_u8 handling + vmask4 decode_u8_v1(false, false, false, false); + vint4 ep0v1(ep0_v0, ep0_v0, ep0_v0, ep0_v0); + vint4 ep1v1(ep1_v0, ep1_v0, ep1_v0, ep1_v0); + + // Lerp both styles + vint4 colorv0 = lerp_color_int(decode_u8_v0, ep0v0, ep1v0, weights); + vint4 colorv1 = lerp_color_int(decode_u8_v1, ep0v1, ep1v1, weights); + + // Validate top 8 integer bits match in both cases + // - Shows that astcenc-style U8 doesn't differ from Khronos-style U8 + vint4 cs0 = lsr<8>(colorv0); + vint4 cs1 = lsr<8>(colorv1); + assert(cs0.lane<0>() == cs1.lane<0>()); + assert(cs0.lane<3>() == cs1.lane<3>()); + + // Validate that astcenc output matches the top 8 integer bits + vfloat4 colorv0f = decode_texel(colorv0, vmask4(false)); + vint4 colorv0_out = float_to_int_rtn(colorv0f * 255.0f); + assert(colorv0_out.lane<0>() == cs0.lane<0>()); + } + + // Validate sRGB data with decode_unorm8 mode + { + // Expand 8 bit to 16 bit + vint4 weights(wt1); + int ep0_v0s = (ep0 << 8) | 0x80; + int ep1_v0s = (ep1 << 8) | 0x80; + int ep0_v0 = ep0 * 257; + int ep1_v0 = ep1 * 257; + + // sRGB RGB and linear A with decode_u8 handling + vmask4 decode_u8_v0(true, true, true, true); + vint4 ep0v0(ep0_v0s, ep0_v0s, ep0_v0s, ep0_v0); + vint4 ep1v0(ep1_v0s, ep1_v0s, ep1_v0s, ep1_v0); + + // sRGB RGB and linear A without decode_u8 handling + vmask4 decode_u8_v1(false, false, false, false); + vint4 ep0v1(ep0_v0s, ep0_v0s, ep0_v0s, ep0_v0); + vint4 ep1v1(ep1_v0s, ep1_v0s, ep1_v0s, ep1_v0); + + // Lerp both styles + vint4 colorv0 = lerp_color_int(decode_u8_v0, ep0v0, ep1v0, weights); + vint4 colorv1 = lerp_color_int(decode_u8_v1, ep0v1, ep1v1, weights); + + // Validate top 8 integer bits match in both cases + // - Shows that astcenc-style U8 doesn't differ from Khronos-style U8 + vint4 cs0 = lsr<8>(colorv0); + vint4 cs1 = lsr<8>(colorv1); + assert(cs0.lane<0>() == cs1.lane<0>()); + assert(cs0.lane<3>() == cs1.lane<3>()); + + // Validate that astcenc output matches the top 8 integer bits + vfloat4 colorv0f = decode_texel(colorv0, vmask4(false)); + vint4 colorv0_out = float_to_int_rtn(colorv0f * 255.0f); + assert(colorv0_out.lane<0>() == cs0.lane<0>()); + } + } + } + } + + return 0; +} diff --git a/ktx/external/basisu/.gitignore b/ktx/external/basisu/.gitignore new file mode 100644 index 0000000..149177e --- /dev/null +++ b/ktx/external/basisu/.gitignore @@ -0,0 +1,11 @@ +build/ + +# VS project and working files +*.vcxproj.user +.vs/ +Debug/ +Release/ + + +# Mac finder +.DS_Store diff --git a/ktx/external/basisu/.gitrepo b/ktx/external/basisu/.gitrepo new file mode 100644 index 0000000..eba0962 --- /dev/null +++ b/ktx/external/basisu/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme +; +[subrepo] + remote = https://github.com/BinomialLLC/basis_universal.git + branch = master + commit = 1f4b564ae0b8ec1e67f21f058e53112d0405a25a + parent = cb45eadca7fed568d9f6f51477ca897d1ec2732a + method = merge + cmdver = 0.4.3 diff --git a/ktx/external/basisu/.reuse/dep5 b/ktx/external/basisu/.reuse/dep5 new file mode 100644 index 0000000..0884014 --- /dev/null +++ b/ktx/external/basisu/.reuse/dep5 @@ -0,0 +1,17 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: basis_universal +Source: https://github.com/BinomialLLC/basis_universal + +# We have asked Binomial about REUSE compliance for their repo, see https://github.com/BinomialLLC/basis_universal/issues/165 +Files: * +Copyright: 2019-2021 Binomial LLC +License: Apache-2.0 + +Files: zstd/* +Copyright: 2016-present, Facebook, Inc. +License: BSD + +Files: OpenCL/* +Copyright: Copyright (c) 2008-2020 The Khronos Group Inc. +License: Apache-2.0 + diff --git a/ktx/external/basisu/CMakeLists.txt b/ktx/external/basisu/CMakeLists.txt new file mode 100644 index 0000000..492233a --- /dev/null +++ b/ktx/external/basisu/CMakeLists.txt @@ -0,0 +1,211 @@ +project(basisu) + +cmake_minimum_required(VERSION 3.0) +option(STATIC "static linking" FALSE) +option(SAN "sanitize" FALSE) + +# For MSVC builds default to SSE enabled, and determine if it's a 64-bit (-A x64) vs. 32-bit (-A Win32) build. +if (MSVC) + option(SSE "SSE 4.1 support" TRUE) + if ( CMAKE_GENERATOR_PLATFORM STREQUAL Win32 ) + set(BUILD_X64 0) + else() + set(BUILD_X64 1) + endif() +else() + option(SSE "SSE 4.1 support" FALSE) + option(BUILD_X64 "build 64-bit" TRUE) +endif() + +option(ZSTD "ZSTD support for KTX2 transcoding/encoding" TRUE) +option(OPENCL "OpenCL support in encoder" FALSE) + +message("Initial BUILD_X64=${BUILD_X64}") +message("Initial CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") +message("Initial SSE=${SSE}") +message("Initial ZSTD=${ZSTD}") +message("Initial OPENCL=${OPENCL}") +message("Initial SAN=${SAN}") + +if (NOT MSVC) + # With MSVC builds we use the Khronos lib/include files in the project's "OpenCL" directory, to completely avoid requiring fiddly to install vendor SDK's. + # Otherwise we use the system's (if any). + find_package( OpenCL ) + message(STATUS "OpenCL found: ${OPENCL_FOUND}") + message(STATUS "OpenCL includes: ${OpenCL_INCLUDE_DIRS}") + message(STATUS "OpenCL libraries: ${OpenCL_LIBRARIES}") +endif() + +if( NOT CMAKE_BUILD_TYPE ) + set( CMAKE_BUILD_TYPE Release ) +endif() + +message( ${PROJECT_NAME} " build type: " ${CMAKE_BUILD_TYPE} ) + +if (BUILD_X64) + message("Building 64-bit") +else() + message("Building 32-bit") +endif() + +if (SSE) + message("SSE enabled") +else() + message("SSE disabled") +endif() + +if (ZSTD) + message("Zstandard enabled") +else() + message("Zstandard disabled") +endif() + +if (NOT MSVC) + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g") + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g") + + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") + + if (SAN) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined") + endif() + + set(CMAKE_CXX_FLAGS -std=c++11) + set(GCC_COMPILE_FLAGS "-fvisibility=hidden -fPIC -fno-strict-aliasing -D_LARGEFILE64_SOURCE=1 -D_FILE_OFFSET_BITS=64 -Wall -Wextra -Wno-unused-local-typedefs -Wno-unused-value -Wno-unused-parameter -Wno-unused-variable") + + if (NOT BUILD_X64) + set(GCC_COMPILE_FLAGS "${GCC_COMPILE_FLAGS} -m32") + endif() + + if (EMSCRIPTEN) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s ALLOW_MEMORY_GROWTH=1 -DBASISU_SUPPORT_SSE=0") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ALLOW_MEMORY_GROWTH=1 -DBASISU_SUPPORT_SSE=0") + + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_LINK_FLAGS}") + elseif (STATIC) + if (SSE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBASISU_SUPPORT_SSE=1 -msse4.1") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBASISU_SUPPORT_SSE=1 -msse4.1") + else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBASISU_SUPPORT_SSE=0") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBASISU_SUPPORT_SSE=0") + endif() + + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_LINK_FLAGS} -static-libgcc -static-libstdc++ -static") + else() + if (SSE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBASISU_SUPPORT_SSE=1 -msse4.1") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBASISU_SUPPORT_SSE=1 -msse4.1") + else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBASISU_SUPPORT_SSE=0") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBASISU_SUPPORT_SSE=0") + endif() + + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_LINK_FLAGS} -Wl,-rpath .") + endif() + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COMPILE_FLAGS}") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${GCC_COMPILE_FLAGS}") + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${GCC_COMPILE_FLAGS} -D_DEBUG") + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COMPILE_FLAGS}") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${GCC_COMPILE_FLAGS}") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${GCC_COMPILE_FLAGS} -D_DEBUG") +else() + if (SSE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBASISU_SUPPORT_SSE=1") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBASISU_SUPPORT_SSE=1") + else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBASISU_SUPPORT_SSE=0") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBASISU_SUPPORT_SSE=0") + endif() +endif() + +set(BASISU_SRC_LIST ${COMMON_SRC_LIST} + basisu_tool.cpp + encoder/basisu_backend.cpp + encoder/basisu_basis_file.cpp + encoder/basisu_comp.cpp + encoder/basisu_enc.cpp + encoder/basisu_etc.cpp + encoder/basisu_frontend.cpp + encoder/basisu_gpu_texture.cpp + encoder/basisu_pvrtc1_4.cpp + encoder/basisu_resampler.cpp + encoder/basisu_resample_filters.cpp + encoder/basisu_ssim.cpp + encoder/basisu_uastc_enc.cpp + encoder/basisu_bc7enc.cpp + encoder/jpgd.cpp + encoder/basisu_kernels_sse.cpp + encoder/basisu_opencl.cpp + encoder/pvpngreader.cpp + transcoder/basisu_transcoder.cpp + ) + +if (ZSTD) + set(BASISU_SRC_LIST ${BASISU_SRC_LIST} zstd/zstd.c) +endif() + +if (APPLE) + set(BIN_DIRECTORY "bin_osx") +else() + set(BIN_DIRECTORY "bin") +endif() + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${BIN_DIRECTORY}) + +add_executable(basisu ${BASISU_SRC_LIST}) + +if (ZSTD) + target_compile_definitions(basisu PRIVATE BASISD_SUPPORT_KTX2_ZSTD=1) +else() + target_compile_definitions(basisu PRIVATE BASISD_SUPPORT_KTX2_ZSTD=0) +endif() + +if (NOT MSVC) + # For Non-Windows builds, let cmake try and find the system OpenCL headers/libs for us. + if (OPENCL_FOUND) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBASISU_SUPPORT_OPENCL=1") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBASISU_SUPPORT_OPENCL=1") + + target_include_directories( basisu PRIVATE ${OpenCL_INCLUDE_DIRS} ) + set(BASISU_EXTRA_LIBS ${OpenCL_LIBRARIES}) + endif() + +else() + # For Windows builds, we use our local copies of the OpenCL import lib and Khronos headers. + if (OPENCL) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBASISU_SUPPORT_OPENCL=1") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBASISU_SUPPORT_OPENCL=1") + + target_include_directories( basisu PRIVATE "OpenCL" ) + + if ( BUILD_X64 ) + target_link_libraries( basisu PRIVATE "OpenCL/lib/OpenCL64" ) + else() + target_link_libraries( basisu PRIVATE "OpenCL/lib/OpenCL" ) + endif() + + endif() +endif() + +if (NOT MSVC) + target_link_libraries(basisu m pthread ${BASISU_EXTRA_LIBS}) +endif() + +if (NOT EMSCRIPTEN) + install(TARGETS basisu DESTINATION bin) + + if (UNIX) + if (CMAKE_BUILD_TYPE STREQUAL Release) + if (APPLE) + add_custom_command(TARGET basisu POST_BUILD COMMAND strip -X -x ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/basisu) + else() + add_custom_command(TARGET basisu POST_BUILD COMMAND strip -g -X -x ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/basisu) + endif() + endif() + endif() +endif() diff --git a/ktx/external/basisu/CppProperties.json b/ktx/external/basisu/CppProperties.json new file mode 100644 index 0000000..6017def --- /dev/null +++ b/ktx/external/basisu/CppProperties.json @@ -0,0 +1,21 @@ +{ + "configurations": [ + { + "inheritEnvironments": [ + "msvc_x64" + ], + "name": "x64-Release", + "includePath": [ + "${env.INCLUDE}", + "${workspaceRoot}\\**" + ], + "defines": [ + "WIN32", + "NDEBUG", + "UNICODE", + "_UNICODE" + ], + "intelliSenseMode": "windows-msvc-x64" + } + ] +} \ No newline at end of file diff --git a/ktx/external/basisu/LICENSE b/ktx/external/basisu/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/ktx/external/basisu/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/ktx/external/basisu/LICENSES/Apache-2.0.txt b/ktx/external/basisu/LICENSES/Apache-2.0.txt new file mode 100644 index 0000000..4ed90b9 --- /dev/null +++ b/ktx/external/basisu/LICENSES/Apache-2.0.txt @@ -0,0 +1,208 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, +AND DISTRIBUTION + + 1. Definitions. + + + +"License" shall mean the terms and conditions for use, reproduction, and distribution +as defined by Sections 1 through 9 of this document. + + + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + + + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct +or indirect, to cause the direction or management of such entity, whether +by contract or otherwise, or (ii) ownership of fifty percent (50%) or more +of the outstanding shares, or (iii) beneficial ownership of such entity. + + + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions +granted by this License. + + + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + + + +"Object" form shall mean any form resulting from mechanical transformation +or translation of a Source form, including but not limited to compiled object +code, generated documentation, and conversions to other media types. + + + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice that +is included in or attached to the work (an example is provided in the Appendix +below). + + + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative +Works shall not include works that remain separable from, or merely link (or +bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative +Works thereof, that is intentionally submitted to Licensor for inclusion in +the Work by the copyright owner or by an individual or Legal Entity authorized +to submit on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication +sent to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor +for the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + + + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently incorporated +within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this +License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable copyright license to reproduce, prepare +Derivative Works of, publicly display, publicly perform, sublicense, and distribute +the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, +each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) patent +license to make, have made, use, offer to sell, sell, import, and otherwise +transfer the Work, where such license applies only to those patent claims +licensable by such Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work to which such +Contribution(s) was submitted. If You institute patent litigation against +any entity (including a cross-claim or counterclaim in a lawsuit) alleging +that the Work or a Contribution incorporated within the Work constitutes direct +or contributory patent infringement, then any patent licenses granted to You +under this License for that Work shall terminate as of the date such litigation +is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or +Derivative Works thereof in any medium, with or without modifications, and +in Source or Object form, provided that You meet the following conditions: + +(a) You must give any other recipients of the Work or Derivative Works a copy +of this License; and + +(b) You must cause any modified files to carry prominent notices stating that +You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source +form of the Work, excluding those notices that do not pertain to any part +of the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its distribution, +then any Derivative Works that You distribute must include a readable copy +of the attribution notices contained within such NOTICE file, excluding those +notices that do not pertain to any part of the Derivative Works, in at least +one of the following places: within a NOTICE text file distributed as part +of the Derivative Works; within the Source form or documentation, if provided +along with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works +that You distribute, alongside or as an addendum to the NOTICE text from the +Work, provided that such additional attribution notices cannot be construed +as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, +or distribution of Your modifications, or for any such Derivative Works as +a whole, provided Your use, reproduction, and distribution of the Work otherwise +complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any +Contribution intentionally submitted for inclusion in the Work by You to the +Licensor shall be under the terms and conditions of this License, without +any additional terms or conditions. Notwithstanding the above, nothing herein +shall supersede or modify the terms of any separate license agreement you +may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, +trademarks, service marks, or product names of the Licensor, except as required +for reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to +in writing, Licensor provides the Work (and each Contributor provides its +Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied, including, without limitation, any warranties +or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR +A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness +of using or redistributing the Work and assume any risks associated with Your +exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether +in tort (including negligence), contract, or otherwise, unless required by +applicable law (such as deliberate and grossly negligent acts) or agreed to +in writing, shall any Contributor be liable to You for damages, including +any direct, indirect, special, incidental, or consequential damages of any +character arising as a result of this License or out of the use or inability +to use the Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all other commercial +damages or losses), even if such Contributor has been advised of the possibility +of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work +or Derivative Works thereof, You may choose to offer, and charge a fee for, +acceptance of support, warranty, indemnity, or other liability obligations +and/or rights consistent with this License. However, in accepting such obligations, +You may act only on Your own behalf and on Your sole responsibility, not on +behalf of any other Contributor, and only if You agree to indemnify, defend, +and hold each Contributor harmless for any liability incurred by, or claims +asserted against, such Contributor by reason of your accepting any such warranty +or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own identifying +information. (Don't include the brackets!) The text should be enclosed in +the appropriate comment syntax for the file format. We also recommend that +a file or class name and description of purpose be included on the same "printed +page" as the copyright notice for easier identification within third-party +archives. + +Copyright [yyyy] [name of copyright owner] + +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. diff --git a/ktx/external/basisu/LICENSES/BSD.txt b/ktx/external/basisu/LICENSES/BSD.txt new file mode 100644 index 0000000..18a8814 --- /dev/null +++ b/ktx/external/basisu/LICENSES/BSD.txt @@ -0,0 +1,28 @@ +BSD License + +Copyright (c) All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ktx/external/basisu/LICENSES/Zlib.txt b/ktx/external/basisu/LICENSES/Zlib.txt new file mode 100644 index 0000000..508a9b5 --- /dev/null +++ b/ktx/external/basisu/LICENSES/Zlib.txt @@ -0,0 +1,20 @@ +Copyright (c) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. diff --git a/ktx/external/basisu/OpenCL/CL/cl.h b/ktx/external/basisu/OpenCL/CL/cl.h new file mode 100644 index 0000000..0018a0f --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl.h @@ -0,0 +1,1929 @@ +/******************************************************************************* + * Copyright (c) 2008-2020 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#ifndef __OPENCL_CL_H +#define __OPENCL_CL_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************/ + +typedef struct _cl_platform_id * cl_platform_id; +typedef struct _cl_device_id * cl_device_id; +typedef struct _cl_context * cl_context; +typedef struct _cl_command_queue * cl_command_queue; +typedef struct _cl_mem * cl_mem; +typedef struct _cl_program * cl_program; +typedef struct _cl_kernel * cl_kernel; +typedef struct _cl_event * cl_event; +typedef struct _cl_sampler * cl_sampler; + +typedef cl_uint cl_bool; /* WARNING! Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */ +typedef cl_ulong cl_bitfield; +typedef cl_ulong cl_properties; +typedef cl_bitfield cl_device_type; +typedef cl_uint cl_platform_info; +typedef cl_uint cl_device_info; +typedef cl_bitfield cl_device_fp_config; +typedef cl_uint cl_device_mem_cache_type; +typedef cl_uint cl_device_local_mem_type; +typedef cl_bitfield cl_device_exec_capabilities; +#ifdef CL_VERSION_2_0 +typedef cl_bitfield cl_device_svm_capabilities; +#endif +typedef cl_bitfield cl_command_queue_properties; +#ifdef CL_VERSION_1_2 +typedef intptr_t cl_device_partition_property; +typedef cl_bitfield cl_device_affinity_domain; +#endif + +typedef intptr_t cl_context_properties; +typedef cl_uint cl_context_info; +#ifdef CL_VERSION_2_0 +typedef cl_properties cl_queue_properties; +#endif +typedef cl_uint cl_command_queue_info; +typedef cl_uint cl_channel_order; +typedef cl_uint cl_channel_type; +typedef cl_bitfield cl_mem_flags; +#ifdef CL_VERSION_2_0 +typedef cl_bitfield cl_svm_mem_flags; +#endif +typedef cl_uint cl_mem_object_type; +typedef cl_uint cl_mem_info; +#ifdef CL_VERSION_1_2 +typedef cl_bitfield cl_mem_migration_flags; +#endif +typedef cl_uint cl_image_info; +#ifdef CL_VERSION_1_1 +typedef cl_uint cl_buffer_create_type; +#endif +typedef cl_uint cl_addressing_mode; +typedef cl_uint cl_filter_mode; +typedef cl_uint cl_sampler_info; +typedef cl_bitfield cl_map_flags; +#ifdef CL_VERSION_2_0 +typedef intptr_t cl_pipe_properties; +typedef cl_uint cl_pipe_info; +#endif +typedef cl_uint cl_program_info; +typedef cl_uint cl_program_build_info; +#ifdef CL_VERSION_1_2 +typedef cl_uint cl_program_binary_type; +#endif +typedef cl_int cl_build_status; +typedef cl_uint cl_kernel_info; +#ifdef CL_VERSION_1_2 +typedef cl_uint cl_kernel_arg_info; +typedef cl_uint cl_kernel_arg_address_qualifier; +typedef cl_uint cl_kernel_arg_access_qualifier; +typedef cl_bitfield cl_kernel_arg_type_qualifier; +#endif +typedef cl_uint cl_kernel_work_group_info; +#ifdef CL_VERSION_2_1 +typedef cl_uint cl_kernel_sub_group_info; +#endif +typedef cl_uint cl_event_info; +typedef cl_uint cl_command_type; +typedef cl_uint cl_profiling_info; +#ifdef CL_VERSION_2_0 +typedef cl_properties cl_sampler_properties; +typedef cl_uint cl_kernel_exec_info; +#endif +#ifdef CL_VERSION_3_0 +typedef cl_bitfield cl_device_atomic_capabilities; +typedef cl_bitfield cl_device_device_enqueue_capabilities; +typedef cl_uint cl_khronos_vendor_id; +typedef cl_properties cl_mem_properties; +typedef cl_uint cl_version; +#endif + +typedef struct _cl_image_format { + cl_channel_order image_channel_order; + cl_channel_type image_channel_data_type; +} cl_image_format; + +#ifdef CL_VERSION_1_2 + +typedef struct _cl_image_desc { + cl_mem_object_type image_type; + size_t image_width; + size_t image_height; + size_t image_depth; + size_t image_array_size; + size_t image_row_pitch; + size_t image_slice_pitch; + cl_uint num_mip_levels; + cl_uint num_samples; +#ifdef CL_VERSION_2_0 +#if defined(__GNUC__) + __extension__ /* Prevents warnings about anonymous union in -pedantic builds */ +#endif +#if defined(_MSC_VER) && !defined(__STDC__) +#pragma warning( push ) +#pragma warning( disable : 4201 ) /* Prevents warning about nameless struct/union in /W4 builds */ +#endif +#if defined(_MSC_VER) && defined(__STDC__) + /* Anonymous unions are not supported in /Za builds */ +#else + union { +#endif +#endif + cl_mem buffer; +#ifdef CL_VERSION_2_0 +#if defined(_MSC_VER) && defined(__STDC__) + /* Anonymous unions are not supported in /Za builds */ +#else + cl_mem mem_object; + }; +#endif +#if defined(_MSC_VER) && !defined(__STDC__) +#pragma warning( pop ) +#endif +#endif +} cl_image_desc; + +#endif + +#ifdef CL_VERSION_1_1 + +typedef struct _cl_buffer_region { + size_t origin; + size_t size; +} cl_buffer_region; + +#endif + +#ifdef CL_VERSION_3_0 + +#define CL_NAME_VERSION_MAX_NAME_SIZE 64 + +typedef struct _cl_name_version { + cl_version version; + char name[CL_NAME_VERSION_MAX_NAME_SIZE]; +} cl_name_version; + +#endif + +/******************************************************************************/ + +/* Error Codes */ +#define CL_SUCCESS 0 +#define CL_DEVICE_NOT_FOUND -1 +#define CL_DEVICE_NOT_AVAILABLE -2 +#define CL_COMPILER_NOT_AVAILABLE -3 +#define CL_MEM_OBJECT_ALLOCATION_FAILURE -4 +#define CL_OUT_OF_RESOURCES -5 +#define CL_OUT_OF_HOST_MEMORY -6 +#define CL_PROFILING_INFO_NOT_AVAILABLE -7 +#define CL_MEM_COPY_OVERLAP -8 +#define CL_IMAGE_FORMAT_MISMATCH -9 +#define CL_IMAGE_FORMAT_NOT_SUPPORTED -10 +#define CL_BUILD_PROGRAM_FAILURE -11 +#define CL_MAP_FAILURE -12 +#ifdef CL_VERSION_1_1 +#define CL_MISALIGNED_SUB_BUFFER_OFFSET -13 +#define CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST -14 +#endif +#ifdef CL_VERSION_1_2 +#define CL_COMPILE_PROGRAM_FAILURE -15 +#define CL_LINKER_NOT_AVAILABLE -16 +#define CL_LINK_PROGRAM_FAILURE -17 +#define CL_DEVICE_PARTITION_FAILED -18 +#define CL_KERNEL_ARG_INFO_NOT_AVAILABLE -19 +#endif + +#define CL_INVALID_VALUE -30 +#define CL_INVALID_DEVICE_TYPE -31 +#define CL_INVALID_PLATFORM -32 +#define CL_INVALID_DEVICE -33 +#define CL_INVALID_CONTEXT -34 +#define CL_INVALID_QUEUE_PROPERTIES -35 +#define CL_INVALID_COMMAND_QUEUE -36 +#define CL_INVALID_HOST_PTR -37 +#define CL_INVALID_MEM_OBJECT -38 +#define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR -39 +#define CL_INVALID_IMAGE_SIZE -40 +#define CL_INVALID_SAMPLER -41 +#define CL_INVALID_BINARY -42 +#define CL_INVALID_BUILD_OPTIONS -43 +#define CL_INVALID_PROGRAM -44 +#define CL_INVALID_PROGRAM_EXECUTABLE -45 +#define CL_INVALID_KERNEL_NAME -46 +#define CL_INVALID_KERNEL_DEFINITION -47 +#define CL_INVALID_KERNEL -48 +#define CL_INVALID_ARG_INDEX -49 +#define CL_INVALID_ARG_VALUE -50 +#define CL_INVALID_ARG_SIZE -51 +#define CL_INVALID_KERNEL_ARGS -52 +#define CL_INVALID_WORK_DIMENSION -53 +#define CL_INVALID_WORK_GROUP_SIZE -54 +#define CL_INVALID_WORK_ITEM_SIZE -55 +#define CL_INVALID_GLOBAL_OFFSET -56 +#define CL_INVALID_EVENT_WAIT_LIST -57 +#define CL_INVALID_EVENT -58 +#define CL_INVALID_OPERATION -59 +#define CL_INVALID_GL_OBJECT -60 +#define CL_INVALID_BUFFER_SIZE -61 +#define CL_INVALID_MIP_LEVEL -62 +#define CL_INVALID_GLOBAL_WORK_SIZE -63 +#ifdef CL_VERSION_1_1 +#define CL_INVALID_PROPERTY -64 +#endif +#ifdef CL_VERSION_1_2 +#define CL_INVALID_IMAGE_DESCRIPTOR -65 +#define CL_INVALID_COMPILER_OPTIONS -66 +#define CL_INVALID_LINKER_OPTIONS -67 +#define CL_INVALID_DEVICE_PARTITION_COUNT -68 +#endif +#ifdef CL_VERSION_2_0 +#define CL_INVALID_PIPE_SIZE -69 +#define CL_INVALID_DEVICE_QUEUE -70 +#endif +#ifdef CL_VERSION_2_2 +#define CL_INVALID_SPEC_ID -71 +#define CL_MAX_SIZE_RESTRICTION_EXCEEDED -72 +#endif + + +/* cl_bool */ +#define CL_FALSE 0 +#define CL_TRUE 1 +#ifdef CL_VERSION_1_2 +#define CL_BLOCKING CL_TRUE +#define CL_NON_BLOCKING CL_FALSE +#endif + +/* cl_platform_info */ +#define CL_PLATFORM_PROFILE 0x0900 +#define CL_PLATFORM_VERSION 0x0901 +#define CL_PLATFORM_NAME 0x0902 +#define CL_PLATFORM_VENDOR 0x0903 +#define CL_PLATFORM_EXTENSIONS 0x0904 +#ifdef CL_VERSION_2_1 +#define CL_PLATFORM_HOST_TIMER_RESOLUTION 0x0905 +#endif +#ifdef CL_VERSION_3_0 +#define CL_PLATFORM_NUMERIC_VERSION 0x0906 +#define CL_PLATFORM_EXTENSIONS_WITH_VERSION 0x0907 +#endif + +/* cl_device_type - bitfield */ +#define CL_DEVICE_TYPE_DEFAULT (1 << 0) +#define CL_DEVICE_TYPE_CPU (1 << 1) +#define CL_DEVICE_TYPE_GPU (1 << 2) +#define CL_DEVICE_TYPE_ACCELERATOR (1 << 3) +#ifdef CL_VERSION_1_2 +#define CL_DEVICE_TYPE_CUSTOM (1 << 4) +#endif +#define CL_DEVICE_TYPE_ALL 0xFFFFFFFF + +/* cl_device_info */ +#define CL_DEVICE_TYPE 0x1000 +#define CL_DEVICE_VENDOR_ID 0x1001 +#define CL_DEVICE_MAX_COMPUTE_UNITS 0x1002 +#define CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS 0x1003 +#define CL_DEVICE_MAX_WORK_GROUP_SIZE 0x1004 +#define CL_DEVICE_MAX_WORK_ITEM_SIZES 0x1005 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR 0x1006 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT 0x1007 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT 0x1008 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG 0x1009 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 0x100A +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE 0x100B +#define CL_DEVICE_MAX_CLOCK_FREQUENCY 0x100C +#define CL_DEVICE_ADDRESS_BITS 0x100D +#define CL_DEVICE_MAX_READ_IMAGE_ARGS 0x100E +#define CL_DEVICE_MAX_WRITE_IMAGE_ARGS 0x100F +#define CL_DEVICE_MAX_MEM_ALLOC_SIZE 0x1010 +#define CL_DEVICE_IMAGE2D_MAX_WIDTH 0x1011 +#define CL_DEVICE_IMAGE2D_MAX_HEIGHT 0x1012 +#define CL_DEVICE_IMAGE3D_MAX_WIDTH 0x1013 +#define CL_DEVICE_IMAGE3D_MAX_HEIGHT 0x1014 +#define CL_DEVICE_IMAGE3D_MAX_DEPTH 0x1015 +#define CL_DEVICE_IMAGE_SUPPORT 0x1016 +#define CL_DEVICE_MAX_PARAMETER_SIZE 0x1017 +#define CL_DEVICE_MAX_SAMPLERS 0x1018 +#define CL_DEVICE_MEM_BASE_ADDR_ALIGN 0x1019 +#define CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE 0x101A +#define CL_DEVICE_SINGLE_FP_CONFIG 0x101B +#define CL_DEVICE_GLOBAL_MEM_CACHE_TYPE 0x101C +#define CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE 0x101D +#define CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 0x101E +#define CL_DEVICE_GLOBAL_MEM_SIZE 0x101F +#define CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 0x1020 +#define CL_DEVICE_MAX_CONSTANT_ARGS 0x1021 +#define CL_DEVICE_LOCAL_MEM_TYPE 0x1022 +#define CL_DEVICE_LOCAL_MEM_SIZE 0x1023 +#define CL_DEVICE_ERROR_CORRECTION_SUPPORT 0x1024 +#define CL_DEVICE_PROFILING_TIMER_RESOLUTION 0x1025 +#define CL_DEVICE_ENDIAN_LITTLE 0x1026 +#define CL_DEVICE_AVAILABLE 0x1027 +#define CL_DEVICE_COMPILER_AVAILABLE 0x1028 +#define CL_DEVICE_EXECUTION_CAPABILITIES 0x1029 +#define CL_DEVICE_QUEUE_PROPERTIES 0x102A /* deprecated */ +#ifdef CL_VERSION_2_0 +#define CL_DEVICE_QUEUE_ON_HOST_PROPERTIES 0x102A +#endif +#define CL_DEVICE_NAME 0x102B +#define CL_DEVICE_VENDOR 0x102C +#define CL_DRIVER_VERSION 0x102D +#define CL_DEVICE_PROFILE 0x102E +#define CL_DEVICE_VERSION 0x102F +#define CL_DEVICE_EXTENSIONS 0x1030 +#define CL_DEVICE_PLATFORM 0x1031 +#ifdef CL_VERSION_1_2 +#define CL_DEVICE_DOUBLE_FP_CONFIG 0x1032 +#endif +/* 0x1033 reserved for CL_DEVICE_HALF_FP_CONFIG which is already defined in "cl_ext.h" */ +#ifdef CL_VERSION_1_1 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF 0x1034 +#define CL_DEVICE_HOST_UNIFIED_MEMORY 0x1035 /* deprecated */ +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR 0x1036 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT 0x1037 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_INT 0x1038 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG 0x1039 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT 0x103A +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE 0x103B +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF 0x103C +#define CL_DEVICE_OPENCL_C_VERSION 0x103D +#endif +#ifdef CL_VERSION_1_2 +#define CL_DEVICE_LINKER_AVAILABLE 0x103E +#define CL_DEVICE_BUILT_IN_KERNELS 0x103F +#define CL_DEVICE_IMAGE_MAX_BUFFER_SIZE 0x1040 +#define CL_DEVICE_IMAGE_MAX_ARRAY_SIZE 0x1041 +#define CL_DEVICE_PARENT_DEVICE 0x1042 +#define CL_DEVICE_PARTITION_MAX_SUB_DEVICES 0x1043 +#define CL_DEVICE_PARTITION_PROPERTIES 0x1044 +#define CL_DEVICE_PARTITION_AFFINITY_DOMAIN 0x1045 +#define CL_DEVICE_PARTITION_TYPE 0x1046 +#define CL_DEVICE_REFERENCE_COUNT 0x1047 +#define CL_DEVICE_PREFERRED_INTEROP_USER_SYNC 0x1048 +#define CL_DEVICE_PRINTF_BUFFER_SIZE 0x1049 +#endif +#ifdef CL_VERSION_2_0 +#define CL_DEVICE_IMAGE_PITCH_ALIGNMENT 0x104A +#define CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT 0x104B +#define CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS 0x104C +#define CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE 0x104D +#define CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES 0x104E +#define CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE 0x104F +#define CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE 0x1050 +#define CL_DEVICE_MAX_ON_DEVICE_QUEUES 0x1051 +#define CL_DEVICE_MAX_ON_DEVICE_EVENTS 0x1052 +#define CL_DEVICE_SVM_CAPABILITIES 0x1053 +#define CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE 0x1054 +#define CL_DEVICE_MAX_PIPE_ARGS 0x1055 +#define CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS 0x1056 +#define CL_DEVICE_PIPE_MAX_PACKET_SIZE 0x1057 +#define CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT 0x1058 +#define CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT 0x1059 +#define CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT 0x105A +#endif +#ifdef CL_VERSION_2_1 +#define CL_DEVICE_IL_VERSION 0x105B +#define CL_DEVICE_MAX_NUM_SUB_GROUPS 0x105C +#define CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS 0x105D +#endif +#ifdef CL_VERSION_3_0 +#define CL_DEVICE_NUMERIC_VERSION 0x105E +#define CL_DEVICE_EXTENSIONS_WITH_VERSION 0x1060 +#define CL_DEVICE_ILS_WITH_VERSION 0x1061 +#define CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION 0x1062 +#define CL_DEVICE_ATOMIC_MEMORY_CAPABILITIES 0x1063 +#define CL_DEVICE_ATOMIC_FENCE_CAPABILITIES 0x1064 +#define CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT 0x1065 +#define CL_DEVICE_OPENCL_C_ALL_VERSIONS 0x1066 +#define CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 0x1067 +#define CL_DEVICE_WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT 0x1068 +#define CL_DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT 0x1069 +/* 0x106A to 0x106E - Reserved for upcoming KHR extension */ +#define CL_DEVICE_OPENCL_C_FEATURES 0x106F +#define CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES 0x1070 +#define CL_DEVICE_PIPE_SUPPORT 0x1071 +#define CL_DEVICE_LATEST_CONFORMANCE_VERSION_PASSED 0x1072 +#endif + +/* cl_device_fp_config - bitfield */ +#define CL_FP_DENORM (1 << 0) +#define CL_FP_INF_NAN (1 << 1) +#define CL_FP_ROUND_TO_NEAREST (1 << 2) +#define CL_FP_ROUND_TO_ZERO (1 << 3) +#define CL_FP_ROUND_TO_INF (1 << 4) +#define CL_FP_FMA (1 << 5) +#ifdef CL_VERSION_1_1 +#define CL_FP_SOFT_FLOAT (1 << 6) +#endif +#ifdef CL_VERSION_1_2 +#define CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT (1 << 7) +#endif + +/* cl_device_mem_cache_type */ +#define CL_NONE 0x0 +#define CL_READ_ONLY_CACHE 0x1 +#define CL_READ_WRITE_CACHE 0x2 + +/* cl_device_local_mem_type */ +#define CL_LOCAL 0x1 +#define CL_GLOBAL 0x2 + +/* cl_device_exec_capabilities - bitfield */ +#define CL_EXEC_KERNEL (1 << 0) +#define CL_EXEC_NATIVE_KERNEL (1 << 1) + +/* cl_command_queue_properties - bitfield */ +#define CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE (1 << 0) +#define CL_QUEUE_PROFILING_ENABLE (1 << 1) +#ifdef CL_VERSION_2_0 +#define CL_QUEUE_ON_DEVICE (1 << 2) +#define CL_QUEUE_ON_DEVICE_DEFAULT (1 << 3) +#endif + +/* cl_context_info */ +#define CL_CONTEXT_REFERENCE_COUNT 0x1080 +#define CL_CONTEXT_DEVICES 0x1081 +#define CL_CONTEXT_PROPERTIES 0x1082 +#ifdef CL_VERSION_1_1 +#define CL_CONTEXT_NUM_DEVICES 0x1083 +#endif + +/* cl_context_properties */ +#define CL_CONTEXT_PLATFORM 0x1084 +#ifdef CL_VERSION_1_2 +#define CL_CONTEXT_INTEROP_USER_SYNC 0x1085 +#endif + +#ifdef CL_VERSION_1_2 + +/* cl_device_partition_property */ +#define CL_DEVICE_PARTITION_EQUALLY 0x1086 +#define CL_DEVICE_PARTITION_BY_COUNTS 0x1087 +#define CL_DEVICE_PARTITION_BY_COUNTS_LIST_END 0x0 +#define CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN 0x1088 + +#endif + +#ifdef CL_VERSION_1_2 + +/* cl_device_affinity_domain */ +#define CL_DEVICE_AFFINITY_DOMAIN_NUMA (1 << 0) +#define CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE (1 << 1) +#define CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE (1 << 2) +#define CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE (1 << 3) +#define CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE (1 << 4) +#define CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE (1 << 5) + +#endif + +#ifdef CL_VERSION_2_0 + +/* cl_device_svm_capabilities */ +#define CL_DEVICE_SVM_COARSE_GRAIN_BUFFER (1 << 0) +#define CL_DEVICE_SVM_FINE_GRAIN_BUFFER (1 << 1) +#define CL_DEVICE_SVM_FINE_GRAIN_SYSTEM (1 << 2) +#define CL_DEVICE_SVM_ATOMICS (1 << 3) + +#endif + +/* cl_command_queue_info */ +#define CL_QUEUE_CONTEXT 0x1090 +#define CL_QUEUE_DEVICE 0x1091 +#define CL_QUEUE_REFERENCE_COUNT 0x1092 +#define CL_QUEUE_PROPERTIES 0x1093 +#ifdef CL_VERSION_2_0 +#define CL_QUEUE_SIZE 0x1094 +#endif +#ifdef CL_VERSION_2_1 +#define CL_QUEUE_DEVICE_DEFAULT 0x1095 +#endif +#ifdef CL_VERSION_3_0 +#define CL_QUEUE_PROPERTIES_ARRAY 0x1098 +#endif + +/* cl_mem_flags and cl_svm_mem_flags - bitfield */ +#define CL_MEM_READ_WRITE (1 << 0) +#define CL_MEM_WRITE_ONLY (1 << 1) +#define CL_MEM_READ_ONLY (1 << 2) +#define CL_MEM_USE_HOST_PTR (1 << 3) +#define CL_MEM_ALLOC_HOST_PTR (1 << 4) +#define CL_MEM_COPY_HOST_PTR (1 << 5) +/* reserved (1 << 6) */ +#ifdef CL_VERSION_1_2 +#define CL_MEM_HOST_WRITE_ONLY (1 << 7) +#define CL_MEM_HOST_READ_ONLY (1 << 8) +#define CL_MEM_HOST_NO_ACCESS (1 << 9) +#endif +#ifdef CL_VERSION_2_0 +#define CL_MEM_SVM_FINE_GRAIN_BUFFER (1 << 10) /* used by cl_svm_mem_flags only */ +#define CL_MEM_SVM_ATOMICS (1 << 11) /* used by cl_svm_mem_flags only */ +#define CL_MEM_KERNEL_READ_AND_WRITE (1 << 12) +#endif + +#ifdef CL_VERSION_1_2 + +/* cl_mem_migration_flags - bitfield */ +#define CL_MIGRATE_MEM_OBJECT_HOST (1 << 0) +#define CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED (1 << 1) + +#endif + +/* cl_channel_order */ +#define CL_R 0x10B0 +#define CL_A 0x10B1 +#define CL_RG 0x10B2 +#define CL_RA 0x10B3 +#define CL_RGB 0x10B4 +#define CL_RGBA 0x10B5 +#define CL_BGRA 0x10B6 +#define CL_ARGB 0x10B7 +#define CL_INTENSITY 0x10B8 +#define CL_LUMINANCE 0x10B9 +#ifdef CL_VERSION_1_1 +#define CL_Rx 0x10BA +#define CL_RGx 0x10BB +#define CL_RGBx 0x10BC +#endif +#ifdef CL_VERSION_1_2 +#define CL_DEPTH 0x10BD +#define CL_DEPTH_STENCIL 0x10BE +#endif +#ifdef CL_VERSION_2_0 +#define CL_sRGB 0x10BF +#define CL_sRGBx 0x10C0 +#define CL_sRGBA 0x10C1 +#define CL_sBGRA 0x10C2 +#define CL_ABGR 0x10C3 +#endif + +/* cl_channel_type */ +#define CL_SNORM_INT8 0x10D0 +#define CL_SNORM_INT16 0x10D1 +#define CL_UNORM_INT8 0x10D2 +#define CL_UNORM_INT16 0x10D3 +#define CL_UNORM_SHORT_565 0x10D4 +#define CL_UNORM_SHORT_555 0x10D5 +#define CL_UNORM_INT_101010 0x10D6 +#define CL_SIGNED_INT8 0x10D7 +#define CL_SIGNED_INT16 0x10D8 +#define CL_SIGNED_INT32 0x10D9 +#define CL_UNSIGNED_INT8 0x10DA +#define CL_UNSIGNED_INT16 0x10DB +#define CL_UNSIGNED_INT32 0x10DC +#define CL_HALF_FLOAT 0x10DD +#define CL_FLOAT 0x10DE +#ifdef CL_VERSION_1_2 +#define CL_UNORM_INT24 0x10DF +#endif +#ifdef CL_VERSION_2_1 +#define CL_UNORM_INT_101010_2 0x10E0 +#endif + +/* cl_mem_object_type */ +#define CL_MEM_OBJECT_BUFFER 0x10F0 +#define CL_MEM_OBJECT_IMAGE2D 0x10F1 +#define CL_MEM_OBJECT_IMAGE3D 0x10F2 +#ifdef CL_VERSION_1_2 +#define CL_MEM_OBJECT_IMAGE2D_ARRAY 0x10F3 +#define CL_MEM_OBJECT_IMAGE1D 0x10F4 +#define CL_MEM_OBJECT_IMAGE1D_ARRAY 0x10F5 +#define CL_MEM_OBJECT_IMAGE1D_BUFFER 0x10F6 +#endif +#ifdef CL_VERSION_2_0 +#define CL_MEM_OBJECT_PIPE 0x10F7 +#endif + +/* cl_mem_info */ +#define CL_MEM_TYPE 0x1100 +#define CL_MEM_FLAGS 0x1101 +#define CL_MEM_SIZE 0x1102 +#define CL_MEM_HOST_PTR 0x1103 +#define CL_MEM_MAP_COUNT 0x1104 +#define CL_MEM_REFERENCE_COUNT 0x1105 +#define CL_MEM_CONTEXT 0x1106 +#ifdef CL_VERSION_1_1 +#define CL_MEM_ASSOCIATED_MEMOBJECT 0x1107 +#define CL_MEM_OFFSET 0x1108 +#endif +#ifdef CL_VERSION_2_0 +#define CL_MEM_USES_SVM_POINTER 0x1109 +#endif +#ifdef CL_VERSION_3_0 +#define CL_MEM_PROPERTIES 0x110A +#endif + +/* cl_image_info */ +#define CL_IMAGE_FORMAT 0x1110 +#define CL_IMAGE_ELEMENT_SIZE 0x1111 +#define CL_IMAGE_ROW_PITCH 0x1112 +#define CL_IMAGE_SLICE_PITCH 0x1113 +#define CL_IMAGE_WIDTH 0x1114 +#define CL_IMAGE_HEIGHT 0x1115 +#define CL_IMAGE_DEPTH 0x1116 +#ifdef CL_VERSION_1_2 +#define CL_IMAGE_ARRAY_SIZE 0x1117 +#define CL_IMAGE_BUFFER 0x1118 +#define CL_IMAGE_NUM_MIP_LEVELS 0x1119 +#define CL_IMAGE_NUM_SAMPLES 0x111A +#endif + + +/* cl_pipe_info */ +#ifdef CL_VERSION_2_0 +#define CL_PIPE_PACKET_SIZE 0x1120 +#define CL_PIPE_MAX_PACKETS 0x1121 +#endif +#ifdef CL_VERSION_3_0 +#define CL_PIPE_PROPERTIES 0x1122 +#endif + +/* cl_addressing_mode */ +#define CL_ADDRESS_NONE 0x1130 +#define CL_ADDRESS_CLAMP_TO_EDGE 0x1131 +#define CL_ADDRESS_CLAMP 0x1132 +#define CL_ADDRESS_REPEAT 0x1133 +#ifdef CL_VERSION_1_1 +#define CL_ADDRESS_MIRRORED_REPEAT 0x1134 +#endif + +/* cl_filter_mode */ +#define CL_FILTER_NEAREST 0x1140 +#define CL_FILTER_LINEAR 0x1141 + +/* cl_sampler_info */ +#define CL_SAMPLER_REFERENCE_COUNT 0x1150 +#define CL_SAMPLER_CONTEXT 0x1151 +#define CL_SAMPLER_NORMALIZED_COORDS 0x1152 +#define CL_SAMPLER_ADDRESSING_MODE 0x1153 +#define CL_SAMPLER_FILTER_MODE 0x1154 +#ifdef CL_VERSION_2_0 +/* These enumerants are for the cl_khr_mipmap_image extension. + They have since been added to cl_ext.h with an appropriate + KHR suffix, but are left here for backwards compatibility. */ +#define CL_SAMPLER_MIP_FILTER_MODE 0x1155 +#define CL_SAMPLER_LOD_MIN 0x1156 +#define CL_SAMPLER_LOD_MAX 0x1157 +#endif +#ifdef CL_VERSION_3_0 +#define CL_SAMPLER_PROPERTIES 0x1158 +#endif + +/* cl_map_flags - bitfield */ +#define CL_MAP_READ (1 << 0) +#define CL_MAP_WRITE (1 << 1) +#ifdef CL_VERSION_1_2 +#define CL_MAP_WRITE_INVALIDATE_REGION (1 << 2) +#endif + +/* cl_program_info */ +#define CL_PROGRAM_REFERENCE_COUNT 0x1160 +#define CL_PROGRAM_CONTEXT 0x1161 +#define CL_PROGRAM_NUM_DEVICES 0x1162 +#define CL_PROGRAM_DEVICES 0x1163 +#define CL_PROGRAM_SOURCE 0x1164 +#define CL_PROGRAM_BINARY_SIZES 0x1165 +#define CL_PROGRAM_BINARIES 0x1166 +#ifdef CL_VERSION_1_2 +#define CL_PROGRAM_NUM_KERNELS 0x1167 +#define CL_PROGRAM_KERNEL_NAMES 0x1168 +#endif +#ifdef CL_VERSION_2_1 +#define CL_PROGRAM_IL 0x1169 +#endif +#ifdef CL_VERSION_2_2 +#define CL_PROGRAM_SCOPE_GLOBAL_CTORS_PRESENT 0x116A +#define CL_PROGRAM_SCOPE_GLOBAL_DTORS_PRESENT 0x116B +#endif + +/* cl_program_build_info */ +#define CL_PROGRAM_BUILD_STATUS 0x1181 +#define CL_PROGRAM_BUILD_OPTIONS 0x1182 +#define CL_PROGRAM_BUILD_LOG 0x1183 +#ifdef CL_VERSION_1_2 +#define CL_PROGRAM_BINARY_TYPE 0x1184 +#endif +#ifdef CL_VERSION_2_0 +#define CL_PROGRAM_BUILD_GLOBAL_VARIABLE_TOTAL_SIZE 0x1185 +#endif + +#ifdef CL_VERSION_1_2 + +/* cl_program_binary_type */ +#define CL_PROGRAM_BINARY_TYPE_NONE 0x0 +#define CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT 0x1 +#define CL_PROGRAM_BINARY_TYPE_LIBRARY 0x2 +#define CL_PROGRAM_BINARY_TYPE_EXECUTABLE 0x4 + +#endif + +/* cl_build_status */ +#define CL_BUILD_SUCCESS 0 +#define CL_BUILD_NONE -1 +#define CL_BUILD_ERROR -2 +#define CL_BUILD_IN_PROGRESS -3 + +/* cl_kernel_info */ +#define CL_KERNEL_FUNCTION_NAME 0x1190 +#define CL_KERNEL_NUM_ARGS 0x1191 +#define CL_KERNEL_REFERENCE_COUNT 0x1192 +#define CL_KERNEL_CONTEXT 0x1193 +#define CL_KERNEL_PROGRAM 0x1194 +#ifdef CL_VERSION_1_2 +#define CL_KERNEL_ATTRIBUTES 0x1195 +#endif + +#ifdef CL_VERSION_1_2 + +/* cl_kernel_arg_info */ +#define CL_KERNEL_ARG_ADDRESS_QUALIFIER 0x1196 +#define CL_KERNEL_ARG_ACCESS_QUALIFIER 0x1197 +#define CL_KERNEL_ARG_TYPE_NAME 0x1198 +#define CL_KERNEL_ARG_TYPE_QUALIFIER 0x1199 +#define CL_KERNEL_ARG_NAME 0x119A + +#endif + +#ifdef CL_VERSION_1_2 + +/* cl_kernel_arg_address_qualifier */ +#define CL_KERNEL_ARG_ADDRESS_GLOBAL 0x119B +#define CL_KERNEL_ARG_ADDRESS_LOCAL 0x119C +#define CL_KERNEL_ARG_ADDRESS_CONSTANT 0x119D +#define CL_KERNEL_ARG_ADDRESS_PRIVATE 0x119E + +#endif + +#ifdef CL_VERSION_1_2 + +/* cl_kernel_arg_access_qualifier */ +#define CL_KERNEL_ARG_ACCESS_READ_ONLY 0x11A0 +#define CL_KERNEL_ARG_ACCESS_WRITE_ONLY 0x11A1 +#define CL_KERNEL_ARG_ACCESS_READ_WRITE 0x11A2 +#define CL_KERNEL_ARG_ACCESS_NONE 0x11A3 + +#endif + +#ifdef CL_VERSION_1_2 + +/* cl_kernel_arg_type_qualifier */ +#define CL_KERNEL_ARG_TYPE_NONE 0 +#define CL_KERNEL_ARG_TYPE_CONST (1 << 0) +#define CL_KERNEL_ARG_TYPE_RESTRICT (1 << 1) +#define CL_KERNEL_ARG_TYPE_VOLATILE (1 << 2) +#ifdef CL_VERSION_2_0 +#define CL_KERNEL_ARG_TYPE_PIPE (1 << 3) +#endif + +#endif + +/* cl_kernel_work_group_info */ +#define CL_KERNEL_WORK_GROUP_SIZE 0x11B0 +#define CL_KERNEL_COMPILE_WORK_GROUP_SIZE 0x11B1 +#define CL_KERNEL_LOCAL_MEM_SIZE 0x11B2 +#define CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 0x11B3 +#define CL_KERNEL_PRIVATE_MEM_SIZE 0x11B4 +#ifdef CL_VERSION_1_2 +#define CL_KERNEL_GLOBAL_WORK_SIZE 0x11B5 +#endif + +#ifdef CL_VERSION_2_1 + +/* cl_kernel_sub_group_info */ +#define CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE 0x2033 +#define CL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE 0x2034 +#define CL_KERNEL_LOCAL_SIZE_FOR_SUB_GROUP_COUNT 0x11B8 +#define CL_KERNEL_MAX_NUM_SUB_GROUPS 0x11B9 +#define CL_KERNEL_COMPILE_NUM_SUB_GROUPS 0x11BA + +#endif + +#ifdef CL_VERSION_2_0 + +/* cl_kernel_exec_info */ +#define CL_KERNEL_EXEC_INFO_SVM_PTRS 0x11B6 +#define CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM 0x11B7 + +#endif + +/* cl_event_info */ +#define CL_EVENT_COMMAND_QUEUE 0x11D0 +#define CL_EVENT_COMMAND_TYPE 0x11D1 +#define CL_EVENT_REFERENCE_COUNT 0x11D2 +#define CL_EVENT_COMMAND_EXECUTION_STATUS 0x11D3 +#ifdef CL_VERSION_1_1 +#define CL_EVENT_CONTEXT 0x11D4 +#endif + +/* cl_command_type */ +#define CL_COMMAND_NDRANGE_KERNEL 0x11F0 +#define CL_COMMAND_TASK 0x11F1 +#define CL_COMMAND_NATIVE_KERNEL 0x11F2 +#define CL_COMMAND_READ_BUFFER 0x11F3 +#define CL_COMMAND_WRITE_BUFFER 0x11F4 +#define CL_COMMAND_COPY_BUFFER 0x11F5 +#define CL_COMMAND_READ_IMAGE 0x11F6 +#define CL_COMMAND_WRITE_IMAGE 0x11F7 +#define CL_COMMAND_COPY_IMAGE 0x11F8 +#define CL_COMMAND_COPY_IMAGE_TO_BUFFER 0x11F9 +#define CL_COMMAND_COPY_BUFFER_TO_IMAGE 0x11FA +#define CL_COMMAND_MAP_BUFFER 0x11FB +#define CL_COMMAND_MAP_IMAGE 0x11FC +#define CL_COMMAND_UNMAP_MEM_OBJECT 0x11FD +#define CL_COMMAND_MARKER 0x11FE +#define CL_COMMAND_ACQUIRE_GL_OBJECTS 0x11FF +#define CL_COMMAND_RELEASE_GL_OBJECTS 0x1200 +#ifdef CL_VERSION_1_1 +#define CL_COMMAND_READ_BUFFER_RECT 0x1201 +#define CL_COMMAND_WRITE_BUFFER_RECT 0x1202 +#define CL_COMMAND_COPY_BUFFER_RECT 0x1203 +#define CL_COMMAND_USER 0x1204 +#endif +#ifdef CL_VERSION_1_2 +#define CL_COMMAND_BARRIER 0x1205 +#define CL_COMMAND_MIGRATE_MEM_OBJECTS 0x1206 +#define CL_COMMAND_FILL_BUFFER 0x1207 +#define CL_COMMAND_FILL_IMAGE 0x1208 +#endif +#ifdef CL_VERSION_2_0 +#define CL_COMMAND_SVM_FREE 0x1209 +#define CL_COMMAND_SVM_MEMCPY 0x120A +#define CL_COMMAND_SVM_MEMFILL 0x120B +#define CL_COMMAND_SVM_MAP 0x120C +#define CL_COMMAND_SVM_UNMAP 0x120D +#endif +#ifdef CL_VERSION_3_0 +#define CL_COMMAND_SVM_MIGRATE_MEM 0x120E +#endif + +/* command execution status */ +#define CL_COMPLETE 0x0 +#define CL_RUNNING 0x1 +#define CL_SUBMITTED 0x2 +#define CL_QUEUED 0x3 + +/* cl_buffer_create_type */ +#ifdef CL_VERSION_1_1 +#define CL_BUFFER_CREATE_TYPE_REGION 0x1220 +#endif + +/* cl_profiling_info */ +#define CL_PROFILING_COMMAND_QUEUED 0x1280 +#define CL_PROFILING_COMMAND_SUBMIT 0x1281 +#define CL_PROFILING_COMMAND_START 0x1282 +#define CL_PROFILING_COMMAND_END 0x1283 +#ifdef CL_VERSION_2_0 +#define CL_PROFILING_COMMAND_COMPLETE 0x1284 +#endif + +/* cl_device_atomic_capabilities - bitfield */ +#ifdef CL_VERSION_3_0 +#define CL_DEVICE_ATOMIC_ORDER_RELAXED (1 << 0) +#define CL_DEVICE_ATOMIC_ORDER_ACQ_REL (1 << 1) +#define CL_DEVICE_ATOMIC_ORDER_SEQ_CST (1 << 2) +#define CL_DEVICE_ATOMIC_SCOPE_WORK_ITEM (1 << 3) +#define CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP (1 << 4) +#define CL_DEVICE_ATOMIC_SCOPE_DEVICE (1 << 5) +#define CL_DEVICE_ATOMIC_SCOPE_ALL_DEVICES (1 << 6) +#endif + +/* cl_device_device_enqueue_capabilities - bitfield */ +#ifdef CL_VERSION_3_0 +#define CL_DEVICE_QUEUE_SUPPORTED (1 << 0) +#define CL_DEVICE_QUEUE_REPLACEABLE_DEFAULT (1 << 1) +#endif + +/* cl_khronos_vendor_id */ +#define CL_KHRONOS_VENDOR_ID_CODEPLAY 0x10004 + +#ifdef CL_VERSION_3_0 + +/* cl_version */ +#define CL_VERSION_MAJOR_BITS (10) +#define CL_VERSION_MINOR_BITS (10) +#define CL_VERSION_PATCH_BITS (12) + +#define CL_VERSION_MAJOR_MASK ((1 << CL_VERSION_MAJOR_BITS) - 1) +#define CL_VERSION_MINOR_MASK ((1 << CL_VERSION_MINOR_BITS) - 1) +#define CL_VERSION_PATCH_MASK ((1 << CL_VERSION_PATCH_BITS) - 1) + +#define CL_VERSION_MAJOR(version) \ + ((version) >> (CL_VERSION_MINOR_BITS + CL_VERSION_PATCH_BITS)) + +#define CL_VERSION_MINOR(version) \ + (((version) >> CL_VERSION_PATCH_BITS) & CL_VERSION_MINOR_MASK) + +#define CL_VERSION_PATCH(version) ((version) & CL_VERSION_PATCH_MASK) + +#define CL_MAKE_VERSION(major, minor, patch) \ + ((((major) & CL_VERSION_MAJOR_MASK) \ + << (CL_VERSION_MINOR_BITS + CL_VERSION_PATCH_BITS)) | \ + (((minor) & CL_VERSION_MINOR_MASK) << CL_VERSION_PATCH_BITS) | \ + ((patch) & CL_VERSION_PATCH_MASK)) + +#endif + +/********************************************************************************************************/ + +/* Platform API */ +extern CL_API_ENTRY cl_int CL_API_CALL +clGetPlatformIDs(cl_uint num_entries, + cl_platform_id * platforms, + cl_uint * num_platforms) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetPlatformInfo(cl_platform_id platform, + cl_platform_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +/* Device APIs */ +extern CL_API_ENTRY cl_int CL_API_CALL +clGetDeviceIDs(cl_platform_id platform, + cl_device_type device_type, + cl_uint num_entries, + cl_device_id * devices, + cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetDeviceInfo(cl_device_id device, + cl_device_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +extern CL_API_ENTRY cl_int CL_API_CALL +clCreateSubDevices(cl_device_id in_device, + const cl_device_partition_property * properties, + cl_uint num_devices, + cl_device_id * out_devices, + cl_uint * num_devices_ret) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainDevice(cl_device_id device) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseDevice(cl_device_id device) CL_API_SUFFIX__VERSION_1_2; + +#endif + +#ifdef CL_VERSION_2_1 + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetDefaultDeviceCommandQueue(cl_context context, + cl_device_id device, + cl_command_queue command_queue) CL_API_SUFFIX__VERSION_2_1; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetDeviceAndHostTimer(cl_device_id device, + cl_ulong* device_timestamp, + cl_ulong* host_timestamp) CL_API_SUFFIX__VERSION_2_1; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetHostTimer(cl_device_id device, + cl_ulong * host_timestamp) CL_API_SUFFIX__VERSION_2_1; + +#endif + +/* Context APIs */ +extern CL_API_ENTRY cl_context CL_API_CALL +clCreateContext(const cl_context_properties * properties, + cl_uint num_devices, + const cl_device_id * devices, + void (CL_CALLBACK * pfn_notify)(const char * errinfo, + const void * private_info, + size_t cb, + void * user_data), + void * user_data, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_context CL_API_CALL +clCreateContextFromType(const cl_context_properties * properties, + cl_device_type device_type, + void (CL_CALLBACK * pfn_notify)(const char * errinfo, + const void * private_info, + size_t cb, + void * user_data), + void * user_data, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainContext(cl_context context) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseContext(cl_context context) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetContextInfo(cl_context context, + cl_context_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_3_0 + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetContextDestructorCallback(cl_context context, + void (CL_CALLBACK* pfn_notify)(cl_context context, + void* user_data), + void* user_data) CL_API_SUFFIX__VERSION_3_0; + +#endif + +/* Command Queue APIs */ + +#ifdef CL_VERSION_2_0 + +extern CL_API_ENTRY cl_command_queue CL_API_CALL +clCreateCommandQueueWithProperties(cl_context context, + cl_device_id device, + const cl_queue_properties * properties, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_2_0; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainCommandQueue(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseCommandQueue(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetCommandQueueInfo(cl_command_queue command_queue, + cl_command_queue_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +/* Memory Object APIs */ +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateBuffer(cl_context context, + cl_mem_flags flags, + size_t size, + void * host_ptr, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_1 + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateSubBuffer(cl_mem buffer, + cl_mem_flags flags, + cl_buffer_create_type buffer_create_type, + const void * buffer_create_info, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_1; + +#endif + +#ifdef CL_VERSION_1_2 + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateImage(cl_context context, + cl_mem_flags flags, + const cl_image_format * image_format, + const cl_image_desc * image_desc, + void * host_ptr, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +#endif + +#ifdef CL_VERSION_2_0 + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreatePipe(cl_context context, + cl_mem_flags flags, + cl_uint pipe_packet_size, + cl_uint pipe_max_packets, + const cl_pipe_properties * properties, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_2_0; + +#endif + +#ifdef CL_VERSION_3_0 + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateBufferWithProperties(cl_context context, + const cl_mem_properties * properties, + cl_mem_flags flags, + size_t size, + void * host_ptr, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_3_0; + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateImageWithProperties(cl_context context, + const cl_mem_properties * properties, + cl_mem_flags flags, + const cl_image_format * image_format, + const cl_image_desc * image_desc, + void * host_ptr, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_3_0; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainMemObject(cl_mem memobj) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseMemObject(cl_mem memobj) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetSupportedImageFormats(cl_context context, + cl_mem_flags flags, + cl_mem_object_type image_type, + cl_uint num_entries, + cl_image_format * image_formats, + cl_uint * num_image_formats) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetMemObjectInfo(cl_mem memobj, + cl_mem_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetImageInfo(cl_mem image, + cl_image_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_2_0 + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetPipeInfo(cl_mem pipe, + cl_pipe_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_2_0; + +#endif + +#ifdef CL_VERSION_1_1 + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetMemObjectDestructorCallback(cl_mem memobj, + void (CL_CALLBACK * pfn_notify)(cl_mem memobj, + void * user_data), + void * user_data) CL_API_SUFFIX__VERSION_1_1; + +#endif + +/* SVM Allocation APIs */ + +#ifdef CL_VERSION_2_0 + +extern CL_API_ENTRY void * CL_API_CALL +clSVMAlloc(cl_context context, + cl_svm_mem_flags flags, + size_t size, + cl_uint alignment) CL_API_SUFFIX__VERSION_2_0; + +extern CL_API_ENTRY void CL_API_CALL +clSVMFree(cl_context context, + void * svm_pointer) CL_API_SUFFIX__VERSION_2_0; + +#endif + +/* Sampler APIs */ + +#ifdef CL_VERSION_2_0 + +extern CL_API_ENTRY cl_sampler CL_API_CALL +clCreateSamplerWithProperties(cl_context context, + const cl_sampler_properties * sampler_properties, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_2_0; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainSampler(cl_sampler sampler) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseSampler(cl_sampler sampler) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetSamplerInfo(cl_sampler sampler, + cl_sampler_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +/* Program Object APIs */ +extern CL_API_ENTRY cl_program CL_API_CALL +clCreateProgramWithSource(cl_context context, + cl_uint count, + const char ** strings, + const size_t * lengths, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_program CL_API_CALL +clCreateProgramWithBinary(cl_context context, + cl_uint num_devices, + const cl_device_id * device_list, + const size_t * lengths, + const unsigned char ** binaries, + cl_int * binary_status, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +extern CL_API_ENTRY cl_program CL_API_CALL +clCreateProgramWithBuiltInKernels(cl_context context, + cl_uint num_devices, + const cl_device_id * device_list, + const char * kernel_names, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +#endif + +#ifdef CL_VERSION_2_1 + +extern CL_API_ENTRY cl_program CL_API_CALL +clCreateProgramWithIL(cl_context context, + const void* il, + size_t length, + cl_int* errcode_ret) CL_API_SUFFIX__VERSION_2_1; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainProgram(cl_program program) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseProgram(cl_program program) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clBuildProgram(cl_program program, + cl_uint num_devices, + const cl_device_id * device_list, + const char * options, + void (CL_CALLBACK * pfn_notify)(cl_program program, + void * user_data), + void * user_data) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +extern CL_API_ENTRY cl_int CL_API_CALL +clCompileProgram(cl_program program, + cl_uint num_devices, + const cl_device_id * device_list, + const char * options, + cl_uint num_input_headers, + const cl_program * input_headers, + const char ** header_include_names, + void (CL_CALLBACK * pfn_notify)(cl_program program, + void * user_data), + void * user_data) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_program CL_API_CALL +clLinkProgram(cl_context context, + cl_uint num_devices, + const cl_device_id * device_list, + const char * options, + cl_uint num_input_programs, + const cl_program * input_programs, + void (CL_CALLBACK * pfn_notify)(cl_program program, + void * user_data), + void * user_data, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +#endif + +#ifdef CL_VERSION_2_2 + +extern CL_API_ENTRY CL_API_PREFIX__VERSION_2_2_DEPRECATED cl_int CL_API_CALL +clSetProgramReleaseCallback(cl_program program, + void (CL_CALLBACK * pfn_notify)(cl_program program, + void * user_data), + void * user_data) CL_API_SUFFIX__VERSION_2_2_DEPRECATED; + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetProgramSpecializationConstant(cl_program program, + cl_uint spec_id, + size_t spec_size, + const void* spec_value) CL_API_SUFFIX__VERSION_2_2; + +#endif + +#ifdef CL_VERSION_1_2 + +extern CL_API_ENTRY cl_int CL_API_CALL +clUnloadPlatformCompiler(cl_platform_id platform) CL_API_SUFFIX__VERSION_1_2; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetProgramInfo(cl_program program, + cl_program_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetProgramBuildInfo(cl_program program, + cl_device_id device, + cl_program_build_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +/* Kernel Object APIs */ +extern CL_API_ENTRY cl_kernel CL_API_CALL +clCreateKernel(cl_program program, + const char * kernel_name, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clCreateKernelsInProgram(cl_program program, + cl_uint num_kernels, + cl_kernel * kernels, + cl_uint * num_kernels_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_2_1 + +extern CL_API_ENTRY cl_kernel CL_API_CALL +clCloneKernel(cl_kernel source_kernel, + cl_int* errcode_ret) CL_API_SUFFIX__VERSION_2_1; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainKernel(cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseKernel(cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetKernelArg(cl_kernel kernel, + cl_uint arg_index, + size_t arg_size, + const void * arg_value) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_2_0 + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetKernelArgSVMPointer(cl_kernel kernel, + cl_uint arg_index, + const void * arg_value) CL_API_SUFFIX__VERSION_2_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetKernelExecInfo(cl_kernel kernel, + cl_kernel_exec_info param_name, + size_t param_value_size, + const void * param_value) CL_API_SUFFIX__VERSION_2_0; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetKernelInfo(cl_kernel kernel, + cl_kernel_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetKernelArgInfo(cl_kernel kernel, + cl_uint arg_indx, + cl_kernel_arg_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_2; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetKernelWorkGroupInfo(cl_kernel kernel, + cl_device_id device, + cl_kernel_work_group_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_2_1 + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetKernelSubGroupInfo(cl_kernel kernel, + cl_device_id device, + cl_kernel_sub_group_info param_name, + size_t input_value_size, + const void* input_value, + size_t param_value_size, + void* param_value, + size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_2_1; + +#endif + +/* Event Object APIs */ +extern CL_API_ENTRY cl_int CL_API_CALL +clWaitForEvents(cl_uint num_events, + const cl_event * event_list) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetEventInfo(cl_event event, + cl_event_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_1 + +extern CL_API_ENTRY cl_event CL_API_CALL +clCreateUserEvent(cl_context context, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_1; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainEvent(cl_event event) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseEvent(cl_event event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_1 + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetUserEventStatus(cl_event event, + cl_int execution_status) CL_API_SUFFIX__VERSION_1_1; + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetEventCallback(cl_event event, + cl_int command_exec_callback_type, + void (CL_CALLBACK * pfn_notify)(cl_event event, + cl_int event_command_status, + void * user_data), + void * user_data) CL_API_SUFFIX__VERSION_1_1; + +#endif + +/* Profiling APIs */ +extern CL_API_ENTRY cl_int CL_API_CALL +clGetEventProfilingInfo(cl_event event, + cl_profiling_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +/* Flush and Finish APIs */ +extern CL_API_ENTRY cl_int CL_API_CALL +clFlush(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clFinish(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0; + +/* Enqueued Commands APIs */ +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueReadBuffer(cl_command_queue command_queue, + cl_mem buffer, + cl_bool blocking_read, + size_t offset, + size_t size, + void * ptr, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_1 + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueReadBufferRect(cl_command_queue command_queue, + cl_mem buffer, + cl_bool blocking_read, + const size_t * buffer_origin, + const size_t * host_origin, + const size_t * region, + size_t buffer_row_pitch, + size_t buffer_slice_pitch, + size_t host_row_pitch, + size_t host_slice_pitch, + void * ptr, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_1; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueWriteBuffer(cl_command_queue command_queue, + cl_mem buffer, + cl_bool blocking_write, + size_t offset, + size_t size, + const void * ptr, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_1 + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueWriteBufferRect(cl_command_queue command_queue, + cl_mem buffer, + cl_bool blocking_write, + const size_t * buffer_origin, + const size_t * host_origin, + const size_t * region, + size_t buffer_row_pitch, + size_t buffer_slice_pitch, + size_t host_row_pitch, + size_t host_slice_pitch, + const void * ptr, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_1; + +#endif + +#ifdef CL_VERSION_1_2 + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueFillBuffer(cl_command_queue command_queue, + cl_mem buffer, + const void * pattern, + size_t pattern_size, + size_t offset, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueCopyBuffer(cl_command_queue command_queue, + cl_mem src_buffer, + cl_mem dst_buffer, + size_t src_offset, + size_t dst_offset, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_1 + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueCopyBufferRect(cl_command_queue command_queue, + cl_mem src_buffer, + cl_mem dst_buffer, + const size_t * src_origin, + const size_t * dst_origin, + const size_t * region, + size_t src_row_pitch, + size_t src_slice_pitch, + size_t dst_row_pitch, + size_t dst_slice_pitch, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_1; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueReadImage(cl_command_queue command_queue, + cl_mem image, + cl_bool blocking_read, + const size_t * origin, + const size_t * region, + size_t row_pitch, + size_t slice_pitch, + void * ptr, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueWriteImage(cl_command_queue command_queue, + cl_mem image, + cl_bool blocking_write, + const size_t * origin, + const size_t * region, + size_t input_row_pitch, + size_t input_slice_pitch, + const void * ptr, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueFillImage(cl_command_queue command_queue, + cl_mem image, + const void * fill_color, + const size_t * origin, + const size_t * region, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueCopyImage(cl_command_queue command_queue, + cl_mem src_image, + cl_mem dst_image, + const size_t * src_origin, + const size_t * dst_origin, + const size_t * region, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueCopyImageToBuffer(cl_command_queue command_queue, + cl_mem src_image, + cl_mem dst_buffer, + const size_t * src_origin, + const size_t * region, + size_t dst_offset, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueCopyBufferToImage(cl_command_queue command_queue, + cl_mem src_buffer, + cl_mem dst_image, + size_t src_offset, + const size_t * dst_origin, + const size_t * region, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY void * CL_API_CALL +clEnqueueMapBuffer(cl_command_queue command_queue, + cl_mem buffer, + cl_bool blocking_map, + cl_map_flags map_flags, + size_t offset, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY void * CL_API_CALL +clEnqueueMapImage(cl_command_queue command_queue, + cl_mem image, + cl_bool blocking_map, + cl_map_flags map_flags, + const size_t * origin, + const size_t * region, + size_t * image_row_pitch, + size_t * image_slice_pitch, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueUnmapMemObject(cl_command_queue command_queue, + cl_mem memobj, + void * mapped_ptr, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueMigrateMemObjects(cl_command_queue command_queue, + cl_uint num_mem_objects, + const cl_mem * mem_objects, + cl_mem_migration_flags flags, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueNDRangeKernel(cl_command_queue command_queue, + cl_kernel kernel, + cl_uint work_dim, + const size_t * global_work_offset, + const size_t * global_work_size, + const size_t * local_work_size, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueNativeKernel(cl_command_queue command_queue, + void (CL_CALLBACK * user_func)(void *), + void * args, + size_t cb_args, + cl_uint num_mem_objects, + const cl_mem * mem_list, + const void ** args_mem_loc, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueMarkerWithWaitList(cl_command_queue command_queue, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueBarrierWithWaitList(cl_command_queue command_queue, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +#endif + +#ifdef CL_VERSION_2_0 + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueSVMFree(cl_command_queue command_queue, + cl_uint num_svm_pointers, + void * svm_pointers[], + void (CL_CALLBACK * pfn_free_func)(cl_command_queue queue, + cl_uint num_svm_pointers, + void * svm_pointers[], + void * user_data), + void * user_data, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_2_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueSVMMemcpy(cl_command_queue command_queue, + cl_bool blocking_copy, + void * dst_ptr, + const void * src_ptr, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_2_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueSVMMemFill(cl_command_queue command_queue, + void * svm_ptr, + const void * pattern, + size_t pattern_size, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_2_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueSVMMap(cl_command_queue command_queue, + cl_bool blocking_map, + cl_map_flags flags, + void * svm_ptr, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_2_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueSVMUnmap(cl_command_queue command_queue, + void * svm_ptr, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_2_0; + +#endif + +#ifdef CL_VERSION_2_1 + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueSVMMigrateMem(cl_command_queue command_queue, + cl_uint num_svm_pointers, + const void ** svm_pointers, + const size_t * sizes, + cl_mem_migration_flags flags, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_2_1; + +#endif + +#ifdef CL_VERSION_1_2 + +/* Extension function access + * + * Returns the extension function address for the given function name, + * or NULL if a valid function can not be found. The client must + * check to make sure the address is not NULL, before using or + * calling the returned function address. + */ +extern CL_API_ENTRY void * CL_API_CALL +clGetExtensionFunctionAddressForPlatform(cl_platform_id platform, + const char * func_name) CL_API_SUFFIX__VERSION_1_2; + +#endif + +#ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS + /* + * WARNING: + * This API introduces mutable state into the OpenCL implementation. It has been REMOVED + * to better facilitate thread safety. The 1.0 API is not thread safe. It is not tested by the + * OpenCL 1.1 conformance test, and consequently may not work or may not work dependably. + * It is likely to be non-performant. Use of this API is not advised. Use at your own risk. + * + * Software developers previously relying on this API are instructed to set the command queue + * properties when creating the queue, instead. + */ + extern CL_API_ENTRY cl_int CL_API_CALL + clSetCommandQueueProperty(cl_command_queue command_queue, + cl_command_queue_properties properties, + cl_bool enable, + cl_command_queue_properties * old_properties) CL_API_SUFFIX__VERSION_1_0_DEPRECATED; +#endif /* CL_USE_DEPRECATED_OPENCL_1_0_APIS */ + +/* Deprecated OpenCL 1.1 APIs */ +extern CL_API_ENTRY CL_API_PREFIX__VERSION_1_1_DEPRECATED cl_mem CL_API_CALL +clCreateImage2D(cl_context context, + cl_mem_flags flags, + const cl_image_format * image_format, + size_t image_width, + size_t image_height, + size_t image_row_pitch, + void * host_ptr, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +extern CL_API_ENTRY CL_API_PREFIX__VERSION_1_1_DEPRECATED cl_mem CL_API_CALL +clCreateImage3D(cl_context context, + cl_mem_flags flags, + const cl_image_format * image_format, + size_t image_width, + size_t image_height, + size_t image_depth, + size_t image_row_pitch, + size_t image_slice_pitch, + void * host_ptr, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +extern CL_API_ENTRY CL_API_PREFIX__VERSION_1_1_DEPRECATED cl_int CL_API_CALL +clEnqueueMarker(cl_command_queue command_queue, + cl_event * event) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +extern CL_API_ENTRY CL_API_PREFIX__VERSION_1_1_DEPRECATED cl_int CL_API_CALL +clEnqueueWaitForEvents(cl_command_queue command_queue, + cl_uint num_events, + const cl_event * event_list) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +extern CL_API_ENTRY CL_API_PREFIX__VERSION_1_1_DEPRECATED cl_int CL_API_CALL +clEnqueueBarrier(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +extern CL_API_ENTRY CL_API_PREFIX__VERSION_1_1_DEPRECATED cl_int CL_API_CALL +clUnloadCompiler(void) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +extern CL_API_ENTRY CL_API_PREFIX__VERSION_1_1_DEPRECATED void * CL_API_CALL +clGetExtensionFunctionAddress(const char * func_name) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +/* Deprecated OpenCL 2.0 APIs */ +extern CL_API_ENTRY CL_API_PREFIX__VERSION_1_2_DEPRECATED cl_command_queue CL_API_CALL +clCreateCommandQueue(cl_context context, + cl_device_id device, + cl_command_queue_properties properties, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2_DEPRECATED; + +extern CL_API_ENTRY CL_API_PREFIX__VERSION_1_2_DEPRECATED cl_sampler CL_API_CALL +clCreateSampler(cl_context context, + cl_bool normalized_coords, + cl_addressing_mode addressing_mode, + cl_filter_mode filter_mode, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2_DEPRECATED; + +extern CL_API_ENTRY CL_API_PREFIX__VERSION_1_2_DEPRECATED cl_int CL_API_CALL +clEnqueueTask(cl_command_queue command_queue, + cl_kernel kernel, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2_DEPRECATED; + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENCL_CL_H */ diff --git a/ktx/external/basisu/OpenCL/CL/cl_d3d10.h b/ktx/external/basisu/OpenCL/CL/cl_d3d10.h new file mode 100644 index 0000000..6adedb0 --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_d3d10.h @@ -0,0 +1,128 @@ +/******************************************************************************* + * Copyright (c) 2008-2020 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#ifndef __OPENCL_CL_D3D10_H +#define __OPENCL_CL_D3D10_H + +#if defined(_MSC_VER) +#if _MSC_VER >=1500 +#pragma warning( push ) +#pragma warning( disable : 4201 ) +#endif +#endif +#include +#if defined(_MSC_VER) +#if _MSC_VER >=1500 +#pragma warning( pop ) +#endif +#endif +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * cl_khr_d3d10_sharing */ +#define cl_khr_d3d10_sharing 1 + +typedef cl_uint cl_d3d10_device_source_khr; +typedef cl_uint cl_d3d10_device_set_khr; + +/******************************************************************************/ + +/* Error Codes */ +#define CL_INVALID_D3D10_DEVICE_KHR -1002 +#define CL_INVALID_D3D10_RESOURCE_KHR -1003 +#define CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR -1004 +#define CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR -1005 + +/* cl_d3d10_device_source_nv */ +#define CL_D3D10_DEVICE_KHR 0x4010 +#define CL_D3D10_DXGI_ADAPTER_KHR 0x4011 + +/* cl_d3d10_device_set_nv */ +#define CL_PREFERRED_DEVICES_FOR_D3D10_KHR 0x4012 +#define CL_ALL_DEVICES_FOR_D3D10_KHR 0x4013 + +/* cl_context_info */ +#define CL_CONTEXT_D3D10_DEVICE_KHR 0x4014 +#define CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR 0x402C + +/* cl_mem_info */ +#define CL_MEM_D3D10_RESOURCE_KHR 0x4015 + +/* cl_image_info */ +#define CL_IMAGE_D3D10_SUBRESOURCE_KHR 0x4016 + +/* cl_command_type */ +#define CL_COMMAND_ACQUIRE_D3D10_OBJECTS_KHR 0x4017 +#define CL_COMMAND_RELEASE_D3D10_OBJECTS_KHR 0x4018 + +/******************************************************************************/ + +typedef cl_int (CL_API_CALL *clGetDeviceIDsFromD3D10KHR_fn)( + cl_platform_id platform, + cl_d3d10_device_source_khr d3d_device_source, + void * d3d_object, + cl_d3d10_device_set_khr d3d_device_set, + cl_uint num_entries, + cl_device_id * devices, + cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_mem (CL_API_CALL *clCreateFromD3D10BufferKHR_fn)( + cl_context context, + cl_mem_flags flags, + ID3D10Buffer * resource, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_mem (CL_API_CALL *clCreateFromD3D10Texture2DKHR_fn)( + cl_context context, + cl_mem_flags flags, + ID3D10Texture2D * resource, + UINT subresource, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_mem (CL_API_CALL *clCreateFromD3D10Texture3DKHR_fn)( + cl_context context, + cl_mem_flags flags, + ID3D10Texture3D * resource, + UINT subresource, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int (CL_API_CALL *clEnqueueAcquireD3D10ObjectsKHR_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int (CL_API_CALL *clEnqueueReleaseD3D10ObjectsKHR_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENCL_CL_D3D10_H */ + diff --git a/ktx/external/basisu/OpenCL/CL/cl_d3d11.h b/ktx/external/basisu/OpenCL/CL/cl_d3d11.h new file mode 100644 index 0000000..50ed906 --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_d3d11.h @@ -0,0 +1,128 @@ +/******************************************************************************* + * Copyright (c) 2008-2020 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#ifndef __OPENCL_CL_D3D11_H +#define __OPENCL_CL_D3D11_H + +#if defined(_MSC_VER) +#if _MSC_VER >=1500 +#pragma warning( push ) +#pragma warning( disable : 4201 ) +#endif +#endif +#include +#if defined(_MSC_VER) +#if _MSC_VER >=1500 +#pragma warning( pop ) +#endif +#endif +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * cl_khr_d3d11_sharing */ +#define cl_khr_d3d11_sharing 1 + +typedef cl_uint cl_d3d11_device_source_khr; +typedef cl_uint cl_d3d11_device_set_khr; + +/******************************************************************************/ + +/* Error Codes */ +#define CL_INVALID_D3D11_DEVICE_KHR -1006 +#define CL_INVALID_D3D11_RESOURCE_KHR -1007 +#define CL_D3D11_RESOURCE_ALREADY_ACQUIRED_KHR -1008 +#define CL_D3D11_RESOURCE_NOT_ACQUIRED_KHR -1009 + +/* cl_d3d11_device_source */ +#define CL_D3D11_DEVICE_KHR 0x4019 +#define CL_D3D11_DXGI_ADAPTER_KHR 0x401A + +/* cl_d3d11_device_set */ +#define CL_PREFERRED_DEVICES_FOR_D3D11_KHR 0x401B +#define CL_ALL_DEVICES_FOR_D3D11_KHR 0x401C + +/* cl_context_info */ +#define CL_CONTEXT_D3D11_DEVICE_KHR 0x401D +#define CL_CONTEXT_D3D11_PREFER_SHARED_RESOURCES_KHR 0x402D + +/* cl_mem_info */ +#define CL_MEM_D3D11_RESOURCE_KHR 0x401E + +/* cl_image_info */ +#define CL_IMAGE_D3D11_SUBRESOURCE_KHR 0x401F + +/* cl_command_type */ +#define CL_COMMAND_ACQUIRE_D3D11_OBJECTS_KHR 0x4020 +#define CL_COMMAND_RELEASE_D3D11_OBJECTS_KHR 0x4021 + +/******************************************************************************/ + +typedef cl_int (CL_API_CALL *clGetDeviceIDsFromD3D11KHR_fn)( + cl_platform_id platform, + cl_d3d11_device_source_khr d3d_device_source, + void * d3d_object, + cl_d3d11_device_set_khr d3d_device_set, + cl_uint num_entries, + cl_device_id * devices, + cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_mem (CL_API_CALL *clCreateFromD3D11BufferKHR_fn)( + cl_context context, + cl_mem_flags flags, + ID3D11Buffer * resource, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_mem (CL_API_CALL *clCreateFromD3D11Texture2DKHR_fn)( + cl_context context, + cl_mem_flags flags, + ID3D11Texture2D * resource, + UINT subresource, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_mem (CL_API_CALL *clCreateFromD3D11Texture3DKHR_fn)( + cl_context context, + cl_mem_flags flags, + ID3D11Texture3D * resource, + UINT subresource, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int (CL_API_CALL *clEnqueueAcquireD3D11ObjectsKHR_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int (CL_API_CALL *clEnqueueReleaseD3D11ObjectsKHR_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENCL_CL_D3D11_H */ + diff --git a/ktx/external/basisu/OpenCL/CL/cl_dx9_media_sharing.h b/ktx/external/basisu/OpenCL/CL/cl_dx9_media_sharing.h new file mode 100644 index 0000000..b0d2b23 --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_dx9_media_sharing.h @@ -0,0 +1,229 @@ +/******************************************************************************* + * Copyright (c) 2008-2020 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#ifndef __OPENCL_CL_DX9_MEDIA_SHARING_H +#define __OPENCL_CL_DX9_MEDIA_SHARING_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************/ +/* cl_khr_dx9_media_sharing */ +#define cl_khr_dx9_media_sharing 1 + +typedef cl_uint cl_dx9_media_adapter_type_khr; +typedef cl_uint cl_dx9_media_adapter_set_khr; + +#if defined(_WIN32) +#include +typedef struct _cl_dx9_surface_info_khr +{ + IDirect3DSurface9 *resource; + HANDLE shared_handle; +} cl_dx9_surface_info_khr; +#endif + + +/******************************************************************************/ + +/* Error Codes */ +#define CL_INVALID_DX9_MEDIA_ADAPTER_KHR -1010 +#define CL_INVALID_DX9_MEDIA_SURFACE_KHR -1011 +#define CL_DX9_MEDIA_SURFACE_ALREADY_ACQUIRED_KHR -1012 +#define CL_DX9_MEDIA_SURFACE_NOT_ACQUIRED_KHR -1013 + +/* cl_media_adapter_type_khr */ +#define CL_ADAPTER_D3D9_KHR 0x2020 +#define CL_ADAPTER_D3D9EX_KHR 0x2021 +#define CL_ADAPTER_DXVA_KHR 0x2022 + +/* cl_media_adapter_set_khr */ +#define CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR 0x2023 +#define CL_ALL_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR 0x2024 + +/* cl_context_info */ +#define CL_CONTEXT_ADAPTER_D3D9_KHR 0x2025 +#define CL_CONTEXT_ADAPTER_D3D9EX_KHR 0x2026 +#define CL_CONTEXT_ADAPTER_DXVA_KHR 0x2027 + +/* cl_mem_info */ +#define CL_MEM_DX9_MEDIA_ADAPTER_TYPE_KHR 0x2028 +#define CL_MEM_DX9_MEDIA_SURFACE_INFO_KHR 0x2029 + +/* cl_image_info */ +#define CL_IMAGE_DX9_MEDIA_PLANE_KHR 0x202A + +/* cl_command_type */ +#define CL_COMMAND_ACQUIRE_DX9_MEDIA_SURFACES_KHR 0x202B +#define CL_COMMAND_RELEASE_DX9_MEDIA_SURFACES_KHR 0x202C + +/******************************************************************************/ + +typedef cl_int (CL_API_CALL *clGetDeviceIDsFromDX9MediaAdapterKHR_fn)( + cl_platform_id platform, + cl_uint num_media_adapters, + cl_dx9_media_adapter_type_khr * media_adapter_type, + void * media_adapters, + cl_dx9_media_adapter_set_khr media_adapter_set, + cl_uint num_entries, + cl_device_id * devices, + cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_mem (CL_API_CALL *clCreateFromDX9MediaSurfaceKHR_fn)( + cl_context context, + cl_mem_flags flags, + cl_dx9_media_adapter_type_khr adapter_type, + void * surface_info, + cl_uint plane, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int (CL_API_CALL *clEnqueueAcquireDX9MediaSurfacesKHR_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int (CL_API_CALL *clEnqueueReleaseDX9MediaSurfacesKHR_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +/*************************************** +* cl_intel_dx9_media_sharing extension * +****************************************/ + +#define cl_intel_dx9_media_sharing 1 + +typedef cl_uint cl_dx9_device_source_intel; +typedef cl_uint cl_dx9_device_set_intel; + +/* error codes */ +#define CL_INVALID_DX9_DEVICE_INTEL -1010 +#define CL_INVALID_DX9_RESOURCE_INTEL -1011 +#define CL_DX9_RESOURCE_ALREADY_ACQUIRED_INTEL -1012 +#define CL_DX9_RESOURCE_NOT_ACQUIRED_INTEL -1013 + +/* cl_dx9_device_source_intel */ +#define CL_D3D9_DEVICE_INTEL 0x4022 +#define CL_D3D9EX_DEVICE_INTEL 0x4070 +#define CL_DXVA_DEVICE_INTEL 0x4071 + +/* cl_dx9_device_set_intel */ +#define CL_PREFERRED_DEVICES_FOR_DX9_INTEL 0x4024 +#define CL_ALL_DEVICES_FOR_DX9_INTEL 0x4025 + +/* cl_context_info */ +#define CL_CONTEXT_D3D9_DEVICE_INTEL 0x4026 +#define CL_CONTEXT_D3D9EX_DEVICE_INTEL 0x4072 +#define CL_CONTEXT_DXVA_DEVICE_INTEL 0x4073 + +/* cl_mem_info */ +#define CL_MEM_DX9_RESOURCE_INTEL 0x4027 +#define CL_MEM_DX9_SHARED_HANDLE_INTEL 0x4074 + +/* cl_image_info */ +#define CL_IMAGE_DX9_PLANE_INTEL 0x4075 + +/* cl_command_type */ +#define CL_COMMAND_ACQUIRE_DX9_OBJECTS_INTEL 0x402A +#define CL_COMMAND_RELEASE_DX9_OBJECTS_INTEL 0x402B +/******************************************************************************/ + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetDeviceIDsFromDX9INTEL( + cl_platform_id platform, + cl_dx9_device_source_intel dx9_device_source, + void* dx9_object, + cl_dx9_device_set_intel dx9_device_set, + cl_uint num_entries, + cl_device_id* devices, + cl_uint* num_devices) CL_API_SUFFIX__VERSION_1_1; + +typedef cl_int (CL_API_CALL* clGetDeviceIDsFromDX9INTEL_fn)( + cl_platform_id platform, + cl_dx9_device_source_intel dx9_device_source, + void* dx9_object, + cl_dx9_device_set_intel dx9_device_set, + cl_uint num_entries, + cl_device_id* devices, + cl_uint* num_devices) CL_API_SUFFIX__VERSION_1_1; + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateFromDX9MediaSurfaceINTEL( + cl_context context, + cl_mem_flags flags, + IDirect3DSurface9* resource, + HANDLE sharedHandle, + UINT plane, + cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_1; + +typedef cl_mem (CL_API_CALL *clCreateFromDX9MediaSurfaceINTEL_fn)( + cl_context context, + cl_mem_flags flags, + IDirect3DSurface9* resource, + HANDLE sharedHandle, + UINT plane, + cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_1; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueAcquireDX9ObjectsINTEL( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem* mem_objects, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event) CL_API_SUFFIX__VERSION_1_1; + +typedef cl_int (CL_API_CALL *clEnqueueAcquireDX9ObjectsINTEL_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem* mem_objects, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event) CL_API_SUFFIX__VERSION_1_1; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueReleaseDX9ObjectsINTEL( + cl_command_queue command_queue, + cl_uint num_objects, + cl_mem* mem_objects, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event) CL_API_SUFFIX__VERSION_1_1; + +typedef cl_int (CL_API_CALL *clEnqueueReleaseDX9ObjectsINTEL_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + cl_mem* mem_objects, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event) CL_API_SUFFIX__VERSION_1_1; + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENCL_CL_DX9_MEDIA_SHARING_H */ + diff --git a/ktx/external/basisu/OpenCL/CL/cl_dx9_media_sharing_intel.h b/ktx/external/basisu/OpenCL/CL/cl_dx9_media_sharing_intel.h new file mode 100644 index 0000000..f6518d7 --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_dx9_media_sharing_intel.h @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright (c) 2008-2020 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#include +#pragma message("The Intel DX9 media sharing extensions have been moved into cl_dx9_media_sharing.h. Please include cl_dx9_media_sharing.h directly.") diff --git a/ktx/external/basisu/OpenCL/CL/cl_egl.h b/ktx/external/basisu/OpenCL/CL/cl_egl.h new file mode 100644 index 0000000..357a37c --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_egl.h @@ -0,0 +1,120 @@ +/******************************************************************************* + * Copyright (c) 2008-2020 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#ifndef __OPENCL_CL_EGL_H +#define __OPENCL_CL_EGL_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Command type for events created with clEnqueueAcquireEGLObjectsKHR */ +#define CL_COMMAND_EGL_FENCE_SYNC_OBJECT_KHR 0x202F +#define CL_COMMAND_ACQUIRE_EGL_OBJECTS_KHR 0x202D +#define CL_COMMAND_RELEASE_EGL_OBJECTS_KHR 0x202E + +/* Error type for clCreateFromEGLImageKHR */ +#define CL_INVALID_EGL_OBJECT_KHR -1093 +#define CL_EGL_RESOURCE_NOT_ACQUIRED_KHR -1092 + +/* CLeglImageKHR is an opaque handle to an EGLImage */ +typedef void* CLeglImageKHR; + +/* CLeglDisplayKHR is an opaque handle to an EGLDisplay */ +typedef void* CLeglDisplayKHR; + +/* CLeglSyncKHR is an opaque handle to an EGLSync object */ +typedef void* CLeglSyncKHR; + +/* properties passed to clCreateFromEGLImageKHR */ +typedef intptr_t cl_egl_image_properties_khr; + + +#define cl_khr_egl_image 1 + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateFromEGLImageKHR(cl_context context, + CLeglDisplayKHR egldisplay, + CLeglImageKHR eglimage, + cl_mem_flags flags, + const cl_egl_image_properties_khr * properties, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_mem (CL_API_CALL *clCreateFromEGLImageKHR_fn)( + cl_context context, + CLeglDisplayKHR egldisplay, + CLeglImageKHR eglimage, + cl_mem_flags flags, + const cl_egl_image_properties_khr * properties, + cl_int * errcode_ret); + + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueAcquireEGLObjectsKHR(cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int (CL_API_CALL *clEnqueueAcquireEGLObjectsKHR_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event); + + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueReleaseEGLObjectsKHR(cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int (CL_API_CALL *clEnqueueReleaseEGLObjectsKHR_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event); + + +#define cl_khr_egl_event 1 + +extern CL_API_ENTRY cl_event CL_API_CALL +clCreateEventFromEGLSyncKHR(cl_context context, + CLeglSyncKHR sync, + CLeglDisplayKHR display, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_event (CL_API_CALL *clCreateEventFromEGLSyncKHR_fn)( + cl_context context, + CLeglSyncKHR sync, + CLeglDisplayKHR display, + cl_int * errcode_ret); + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENCL_CL_EGL_H */ diff --git a/ktx/external/basisu/OpenCL/CL/cl_ext.h b/ktx/external/basisu/OpenCL/CL/cl_ext.h new file mode 100644 index 0000000..36d0256 --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_ext.h @@ -0,0 +1,1723 @@ +/******************************************************************************* + * Copyright (c) 2008-2020 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +/* cl_ext.h contains OpenCL extensions which don't have external */ +/* (OpenGL, D3D) dependencies. */ + +#ifndef __CL_EXT_H +#define __CL_EXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* cl_khr_fp64 extension - no extension #define since it has no functions */ +/* CL_DEVICE_DOUBLE_FP_CONFIG is defined in CL.h for OpenCL >= 120 */ + +#if CL_TARGET_OPENCL_VERSION <= 110 +#define CL_DEVICE_DOUBLE_FP_CONFIG 0x1032 +#endif + +/* cl_khr_fp16 extension - no extension #define since it has no functions */ +#define CL_DEVICE_HALF_FP_CONFIG 0x1033 + +/* Memory object destruction + * + * Apple extension for use to manage externally allocated buffers used with cl_mem objects with CL_MEM_USE_HOST_PTR + * + * Registers a user callback function that will be called when the memory object is deleted and its resources + * freed. Each call to clSetMemObjectCallbackFn registers the specified user callback function on a callback + * stack associated with memobj. The registered user callback functions are called in the reverse order in + * which they were registered. The user callback functions are called and then the memory object is deleted + * and its resources freed. This provides a mechanism for the application (and libraries) using memobj to be + * notified when the memory referenced by host_ptr, specified when the memory object is created and used as + * the storage bits for the memory object, can be reused or freed. + * + * The application may not call CL api's with the cl_mem object passed to the pfn_notify. + * + * Please check for the "cl_APPLE_SetMemObjectDestructor" extension using clGetDeviceInfo(CL_DEVICE_EXTENSIONS) + * before using. + */ +#define cl_APPLE_SetMemObjectDestructor 1 +extern CL_API_ENTRY cl_int CL_API_CALL clSetMemObjectDestructorAPPLE( cl_mem memobj, + void (* pfn_notify)(cl_mem memobj, void * user_data), + void * user_data) CL_API_SUFFIX__VERSION_1_0; + + +/* Context Logging Functions + * + * The next three convenience functions are intended to be used as the pfn_notify parameter to clCreateContext(). + * Please check for the "cl_APPLE_ContextLoggingFunctions" extension using clGetDeviceInfo(CL_DEVICE_EXTENSIONS) + * before using. + * + * clLogMessagesToSystemLog forwards on all log messages to the Apple System Logger + */ +#define cl_APPLE_ContextLoggingFunctions 1 +extern CL_API_ENTRY void CL_API_CALL clLogMessagesToSystemLogAPPLE( const char * errstr, + const void * private_info, + size_t cb, + void * user_data) CL_API_SUFFIX__VERSION_1_0; + +/* clLogMessagesToStdout sends all log messages to the file descriptor stdout */ +extern CL_API_ENTRY void CL_API_CALL clLogMessagesToStdoutAPPLE( const char * errstr, + const void * private_info, + size_t cb, + void * user_data) CL_API_SUFFIX__VERSION_1_0; + +/* clLogMessagesToStderr sends all log messages to the file descriptor stderr */ +extern CL_API_ENTRY void CL_API_CALL clLogMessagesToStderrAPPLE( const char * errstr, + const void * private_info, + size_t cb, + void * user_data) CL_API_SUFFIX__VERSION_1_0; + + +/************************ +* cl_khr_icd extension * +************************/ +#define cl_khr_icd 1 + +/* cl_platform_info */ +#define CL_PLATFORM_ICD_SUFFIX_KHR 0x0920 + +/* Additional Error Codes */ +#define CL_PLATFORM_NOT_FOUND_KHR -1001 + +extern CL_API_ENTRY cl_int CL_API_CALL +clIcdGetPlatformIDsKHR(cl_uint num_entries, + cl_platform_id * platforms, + cl_uint * num_platforms); + +typedef cl_int +(CL_API_CALL *clIcdGetPlatformIDsKHR_fn)(cl_uint num_entries, + cl_platform_id * platforms, + cl_uint * num_platforms); + + +/******************************* + * cl_khr_il_program extension * + *******************************/ +#define cl_khr_il_program 1 + +/* New property to clGetDeviceInfo for retrieving supported intermediate + * languages + */ +#define CL_DEVICE_IL_VERSION_KHR 0x105B + +/* New property to clGetProgramInfo for retrieving for retrieving the IL of a + * program + */ +#define CL_PROGRAM_IL_KHR 0x1169 + +extern CL_API_ENTRY cl_program CL_API_CALL +clCreateProgramWithILKHR(cl_context context, + const void * il, + size_t length, + cl_int * errcode_ret); + +typedef cl_program +(CL_API_CALL *clCreateProgramWithILKHR_fn)(cl_context context, + const void * il, + size_t length, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +/* Extension: cl_khr_image2d_from_buffer + * + * This extension allows a 2D image to be created from a cl_mem buffer without + * a copy. The type associated with a 2D image created from a buffer in an + * OpenCL program is image2d_t. Both the sampler and sampler-less read_image + * built-in functions are supported for 2D images and 2D images created from + * a buffer. Similarly, the write_image built-ins are also supported for 2D + * images created from a buffer. + * + * When the 2D image from buffer is created, the client must specify the + * width, height, image format (i.e. channel order and channel data type) + * and optionally the row pitch. + * + * The pitch specified must be a multiple of + * CL_DEVICE_IMAGE_PITCH_ALIGNMENT_KHR pixels. + * The base address of the buffer must be aligned to + * CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT_KHR pixels. + */ + +#define CL_DEVICE_IMAGE_PITCH_ALIGNMENT_KHR 0x104A +#define CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT_KHR 0x104B + + +/************************************** + * cl_khr_initialize_memory extension * + **************************************/ + +#define CL_CONTEXT_MEMORY_INITIALIZE_KHR 0x2030 + + +/************************************** + * cl_khr_terminate_context extension * + **************************************/ + +#define CL_CONTEXT_TERMINATED_KHR -1121 + +#define CL_DEVICE_TERMINATE_CAPABILITY_KHR 0x2031 +#define CL_CONTEXT_TERMINATE_KHR 0x2032 + +#define cl_khr_terminate_context 1 +extern CL_API_ENTRY cl_int CL_API_CALL +clTerminateContextKHR(cl_context context) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int +(CL_API_CALL *clTerminateContextKHR_fn)(cl_context context) CL_API_SUFFIX__VERSION_1_2; + + +/* + * Extension: cl_khr_spir + * + * This extension adds support to create an OpenCL program object from a + * Standard Portable Intermediate Representation (SPIR) instance + */ + +#define CL_DEVICE_SPIR_VERSIONS 0x40E0 +#define CL_PROGRAM_BINARY_TYPE_INTERMEDIATE 0x40E1 + + +/***************************************** + * cl_khr_create_command_queue extension * + *****************************************/ +#define cl_khr_create_command_queue 1 + +typedef cl_properties cl_queue_properties_khr; + +extern CL_API_ENTRY cl_command_queue CL_API_CALL +clCreateCommandQueueWithPropertiesKHR(cl_context context, + cl_device_id device, + const cl_queue_properties_khr* properties, + cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_command_queue +(CL_API_CALL *clCreateCommandQueueWithPropertiesKHR_fn)(cl_context context, + cl_device_id device, + const cl_queue_properties_khr* properties, + cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2; + + +/****************************************** +* cl_nv_device_attribute_query extension * +******************************************/ + +/* cl_nv_device_attribute_query extension - no extension #define since it has no functions */ +#define CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV 0x4000 +#define CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV 0x4001 +#define CL_DEVICE_REGISTERS_PER_BLOCK_NV 0x4002 +#define CL_DEVICE_WARP_SIZE_NV 0x4003 +#define CL_DEVICE_GPU_OVERLAP_NV 0x4004 +#define CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV 0x4005 +#define CL_DEVICE_INTEGRATED_MEMORY_NV 0x4006 + + +/********************************* +* cl_amd_device_attribute_query * +*********************************/ + +#define CL_DEVICE_PROFILING_TIMER_OFFSET_AMD 0x4036 +#define CL_DEVICE_TOPOLOGY_AMD 0x4037 +#define CL_DEVICE_BOARD_NAME_AMD 0x4038 +#define CL_DEVICE_GLOBAL_FREE_MEMORY_AMD 0x4039 +#define CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD 0x4040 +#define CL_DEVICE_SIMD_WIDTH_AMD 0x4041 +#define CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD 0x4042 +#define CL_DEVICE_WAVEFRONT_WIDTH_AMD 0x4043 +#define CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD 0x4044 +#define CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD 0x4045 +#define CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD 0x4046 +#define CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD 0x4047 +#define CL_DEVICE_LOCAL_MEM_BANKS_AMD 0x4048 +#define CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD 0x4049 +#define CL_DEVICE_GFXIP_MAJOR_AMD 0x404A +#define CL_DEVICE_GFXIP_MINOR_AMD 0x404B +#define CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD 0x404C +#define CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_AMD 0x4030 +#define CL_DEVICE_MAX_WORK_GROUP_SIZE_AMD 0x4031 +#define CL_DEVICE_PREFERRED_CONSTANT_BUFFER_SIZE_AMD 0x4033 +#define CL_DEVICE_PCIE_ID_AMD 0x4034 + + +/********************************* +* cl_arm_printf extension +*********************************/ + +#define CL_PRINTF_CALLBACK_ARM 0x40B0 +#define CL_PRINTF_BUFFERSIZE_ARM 0x40B1 + + +/*********************************** +* cl_ext_device_fission extension +***********************************/ +#define cl_ext_device_fission 1 + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseDeviceEXT(cl_device_id device) CL_API_SUFFIX__VERSION_1_1; + +typedef cl_int +(CL_API_CALL *clReleaseDeviceEXT_fn)(cl_device_id device) CL_API_SUFFIX__VERSION_1_1; + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainDeviceEXT(cl_device_id device) CL_API_SUFFIX__VERSION_1_1; + +typedef cl_int +(CL_API_CALL *clRetainDeviceEXT_fn)(cl_device_id device) CL_API_SUFFIX__VERSION_1_1; + +typedef cl_ulong cl_device_partition_property_ext; +extern CL_API_ENTRY cl_int CL_API_CALL +clCreateSubDevicesEXT(cl_device_id in_device, + const cl_device_partition_property_ext * properties, + cl_uint num_entries, + cl_device_id * out_devices, + cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_1; + +typedef cl_int +(CL_API_CALL * clCreateSubDevicesEXT_fn)(cl_device_id in_device, + const cl_device_partition_property_ext * properties, + cl_uint num_entries, + cl_device_id * out_devices, + cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_1; + +/* cl_device_partition_property_ext */ +#define CL_DEVICE_PARTITION_EQUALLY_EXT 0x4050 +#define CL_DEVICE_PARTITION_BY_COUNTS_EXT 0x4051 +#define CL_DEVICE_PARTITION_BY_NAMES_EXT 0x4052 +#define CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN_EXT 0x4053 + +/* clDeviceGetInfo selectors */ +#define CL_DEVICE_PARENT_DEVICE_EXT 0x4054 +#define CL_DEVICE_PARTITION_TYPES_EXT 0x4055 +#define CL_DEVICE_AFFINITY_DOMAINS_EXT 0x4056 +#define CL_DEVICE_REFERENCE_COUNT_EXT 0x4057 +#define CL_DEVICE_PARTITION_STYLE_EXT 0x4058 + +/* error codes */ +#define CL_DEVICE_PARTITION_FAILED_EXT -1057 +#define CL_INVALID_PARTITION_COUNT_EXT -1058 +#define CL_INVALID_PARTITION_NAME_EXT -1059 + +/* CL_AFFINITY_DOMAINs */ +#define CL_AFFINITY_DOMAIN_L1_CACHE_EXT 0x1 +#define CL_AFFINITY_DOMAIN_L2_CACHE_EXT 0x2 +#define CL_AFFINITY_DOMAIN_L3_CACHE_EXT 0x3 +#define CL_AFFINITY_DOMAIN_L4_CACHE_EXT 0x4 +#define CL_AFFINITY_DOMAIN_NUMA_EXT 0x10 +#define CL_AFFINITY_DOMAIN_NEXT_FISSIONABLE_EXT 0x100 + +/* cl_device_partition_property_ext list terminators */ +#define CL_PROPERTIES_LIST_END_EXT ((cl_device_partition_property_ext) 0) +#define CL_PARTITION_BY_COUNTS_LIST_END_EXT ((cl_device_partition_property_ext) 0) +#define CL_PARTITION_BY_NAMES_LIST_END_EXT ((cl_device_partition_property_ext) 0 - 1) + + +/*********************************** + * cl_ext_migrate_memobject extension definitions + ***********************************/ +#define cl_ext_migrate_memobject 1 + +typedef cl_bitfield cl_mem_migration_flags_ext; + +#define CL_MIGRATE_MEM_OBJECT_HOST_EXT 0x1 + +#define CL_COMMAND_MIGRATE_MEM_OBJECT_EXT 0x4040 + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueMigrateMemObjectEXT(cl_command_queue command_queue, + cl_uint num_mem_objects, + const cl_mem * mem_objects, + cl_mem_migration_flags_ext flags, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event); + +typedef cl_int +(CL_API_CALL *clEnqueueMigrateMemObjectEXT_fn)(cl_command_queue command_queue, + cl_uint num_mem_objects, + const cl_mem * mem_objects, + cl_mem_migration_flags_ext flags, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event); + + +/********************************* +* cl_ext_cxx_for_opencl extension +*********************************/ +#define cl_ext_cxx_for_opencl 1 + +#define CL_DEVICE_CXX_FOR_OPENCL_NUMERIC_VERSION_EXT 0x4230 + +/********************************* +* cl_qcom_ext_host_ptr extension +*********************************/ +#define cl_qcom_ext_host_ptr 1 + +#define CL_MEM_EXT_HOST_PTR_QCOM (1 << 29) + +#define CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM 0x40A0 +#define CL_DEVICE_PAGE_SIZE_QCOM 0x40A1 +#define CL_IMAGE_ROW_ALIGNMENT_QCOM 0x40A2 +#define CL_IMAGE_SLICE_ALIGNMENT_QCOM 0x40A3 +#define CL_MEM_HOST_UNCACHED_QCOM 0x40A4 +#define CL_MEM_HOST_WRITEBACK_QCOM 0x40A5 +#define CL_MEM_HOST_WRITETHROUGH_QCOM 0x40A6 +#define CL_MEM_HOST_WRITE_COMBINING_QCOM 0x40A7 + +typedef cl_uint cl_image_pitch_info_qcom; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetDeviceImageInfoQCOM(cl_device_id device, + size_t image_width, + size_t image_height, + const cl_image_format *image_format, + cl_image_pitch_info_qcom param_name, + size_t param_value_size, + void *param_value, + size_t *param_value_size_ret); + +typedef struct _cl_mem_ext_host_ptr +{ + /* Type of external memory allocation. */ + /* Legal values will be defined in layered extensions. */ + cl_uint allocation_type; + + /* Host cache policy for this external memory allocation. */ + cl_uint host_cache_policy; + +} cl_mem_ext_host_ptr; + + +/******************************************* +* cl_qcom_ext_host_ptr_iocoherent extension +********************************************/ + +/* Cache policy specifying io-coherence */ +#define CL_MEM_HOST_IOCOHERENT_QCOM 0x40A9 + + +/********************************* +* cl_qcom_ion_host_ptr extension +*********************************/ + +#define CL_MEM_ION_HOST_PTR_QCOM 0x40A8 + +typedef struct _cl_mem_ion_host_ptr +{ + /* Type of external memory allocation. */ + /* Must be CL_MEM_ION_HOST_PTR_QCOM for ION allocations. */ + cl_mem_ext_host_ptr ext_host_ptr; + + /* ION file descriptor */ + int ion_filedesc; + + /* Host pointer to the ION allocated memory */ + void* ion_hostptr; + +} cl_mem_ion_host_ptr; + + +/********************************* +* cl_qcom_android_native_buffer_host_ptr extension +*********************************/ + +#define CL_MEM_ANDROID_NATIVE_BUFFER_HOST_PTR_QCOM 0x40C6 + +typedef struct _cl_mem_android_native_buffer_host_ptr +{ + /* Type of external memory allocation. */ + /* Must be CL_MEM_ANDROID_NATIVE_BUFFER_HOST_PTR_QCOM for Android native buffers. */ + cl_mem_ext_host_ptr ext_host_ptr; + + /* Virtual pointer to the android native buffer */ + void* anb_ptr; + +} cl_mem_android_native_buffer_host_ptr; + + +/****************************************** + * cl_img_yuv_image extension * + ******************************************/ + +/* Image formats used in clCreateImage */ +#define CL_NV21_IMG 0x40D0 +#define CL_YV12_IMG 0x40D1 + + +/****************************************** + * cl_img_cached_allocations extension * + ******************************************/ + +/* Flag values used by clCreateBuffer */ +#define CL_MEM_USE_UNCACHED_CPU_MEMORY_IMG (1 << 26) +#define CL_MEM_USE_CACHED_CPU_MEMORY_IMG (1 << 27) + + +/****************************************** + * cl_img_use_gralloc_ptr extension * + ******************************************/ +#define cl_img_use_gralloc_ptr 1 + +/* Flag values used by clCreateBuffer */ +#define CL_MEM_USE_GRALLOC_PTR_IMG (1 << 28) + +/* To be used by clGetEventInfo: */ +#define CL_COMMAND_ACQUIRE_GRALLOC_OBJECTS_IMG 0x40D2 +#define CL_COMMAND_RELEASE_GRALLOC_OBJECTS_IMG 0x40D3 + +/* Error codes from clEnqueueAcquireGrallocObjectsIMG and clEnqueueReleaseGrallocObjectsIMG */ +#define CL_GRALLOC_RESOURCE_NOT_ACQUIRED_IMG 0x40D4 +#define CL_INVALID_GRALLOC_OBJECT_IMG 0x40D5 + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueAcquireGrallocObjectsIMG(cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueReleaseGrallocObjectsIMG(cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +/****************************************** + * cl_img_generate_mipmap extension * + ******************************************/ +#define cl_img_generate_mipmap 1 + +typedef cl_uint cl_mipmap_filter_mode_img; + +/* To be used by clEnqueueGenerateMipmapIMG */ +#define CL_MIPMAP_FILTER_ANY_IMG 0x0 +#define CL_MIPMAP_FILTER_BOX_IMG 0x1 + +/* To be used by clGetEventInfo */ +#define CL_COMMAND_GENERATE_MIPMAP_IMG 0x40D6 + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueGenerateMipmapIMG(cl_command_queue command_queue, + cl_mem src_image, + cl_mem dst_image, + cl_mipmap_filter_mode_img mipmap_filter_mode, + const size_t *array_region, + const size_t *mip_region, + cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_2; + +/****************************************** + * cl_img_mem_properties extension * + ******************************************/ +#define cl_img_mem_properties 1 + +/* To be used by clCreateBufferWithProperties */ +#define CL_MEM_ALLOC_FLAGS_IMG 0x40D7 + +/* To be used wiith the CL_MEM_ALLOC_FLAGS_IMG property */ +typedef cl_bitfield cl_mem_alloc_flags_img; + +/* To be used with cl_mem_alloc_flags_img */ +#define CL_MEM_ALLOC_RELAX_REQUIREMENTS_IMG (1 << 0) + +/********************************* +* cl_khr_subgroups extension +*********************************/ +#define cl_khr_subgroups 1 + +#if !defined(CL_VERSION_2_1) +/* For OpenCL 2.1 and newer, cl_kernel_sub_group_info is declared in CL.h. + In hindsight, there should have been a khr suffix on this type for + the extension, but keeping it un-suffixed to maintain backwards + compatibility. */ +typedef cl_uint cl_kernel_sub_group_info; +#endif + +/* cl_kernel_sub_group_info */ +#define CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE_KHR 0x2033 +#define CL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE_KHR 0x2034 + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetKernelSubGroupInfoKHR(cl_kernel in_kernel, + cl_device_id in_device, + cl_kernel_sub_group_info param_name, + size_t input_value_size, + const void * input_value, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_2_0_DEPRECATED; + +typedef cl_int +(CL_API_CALL * clGetKernelSubGroupInfoKHR_fn)(cl_kernel in_kernel, + cl_device_id in_device, + cl_kernel_sub_group_info param_name, + size_t input_value_size, + const void * input_value, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_2_0_DEPRECATED; + + +/********************************* +* cl_khr_mipmap_image extension +*********************************/ + +/* cl_sampler_properties */ +#define CL_SAMPLER_MIP_FILTER_MODE_KHR 0x1155 +#define CL_SAMPLER_LOD_MIN_KHR 0x1156 +#define CL_SAMPLER_LOD_MAX_KHR 0x1157 + + +/********************************* +* cl_khr_priority_hints extension +*********************************/ +/* This extension define is for backwards compatibility. + It shouldn't be required since this extension has no new functions. */ +#define cl_khr_priority_hints 1 + +typedef cl_uint cl_queue_priority_khr; + +/* cl_command_queue_properties */ +#define CL_QUEUE_PRIORITY_KHR 0x1096 + +/* cl_queue_priority_khr */ +#define CL_QUEUE_PRIORITY_HIGH_KHR (1<<0) +#define CL_QUEUE_PRIORITY_MED_KHR (1<<1) +#define CL_QUEUE_PRIORITY_LOW_KHR (1<<2) + + +/********************************* +* cl_khr_throttle_hints extension +*********************************/ +/* This extension define is for backwards compatibility. + It shouldn't be required since this extension has no new functions. */ +#define cl_khr_throttle_hints 1 + +typedef cl_uint cl_queue_throttle_khr; + +/* cl_command_queue_properties */ +#define CL_QUEUE_THROTTLE_KHR 0x1097 + +/* cl_queue_throttle_khr */ +#define CL_QUEUE_THROTTLE_HIGH_KHR (1<<0) +#define CL_QUEUE_THROTTLE_MED_KHR (1<<1) +#define CL_QUEUE_THROTTLE_LOW_KHR (1<<2) + + +/********************************* +* cl_khr_subgroup_named_barrier +*********************************/ +/* This extension define is for backwards compatibility. + It shouldn't be required since this extension has no new functions. */ +#define cl_khr_subgroup_named_barrier 1 + +/* cl_device_info */ +#define CL_DEVICE_MAX_NAMED_BARRIER_COUNT_KHR 0x2035 + + +/********************************* +* cl_khr_extended_versioning +*********************************/ + +#define cl_khr_extended_versioning 1 + +#define CL_VERSION_MAJOR_BITS_KHR (10) +#define CL_VERSION_MINOR_BITS_KHR (10) +#define CL_VERSION_PATCH_BITS_KHR (12) + +#define CL_VERSION_MAJOR_MASK_KHR ((1 << CL_VERSION_MAJOR_BITS_KHR) - 1) +#define CL_VERSION_MINOR_MASK_KHR ((1 << CL_VERSION_MINOR_BITS_KHR) - 1) +#define CL_VERSION_PATCH_MASK_KHR ((1 << CL_VERSION_PATCH_BITS_KHR) - 1) + +#define CL_VERSION_MAJOR_KHR(version) ((version) >> (CL_VERSION_MINOR_BITS_KHR + CL_VERSION_PATCH_BITS_KHR)) +#define CL_VERSION_MINOR_KHR(version) (((version) >> CL_VERSION_PATCH_BITS_KHR) & CL_VERSION_MINOR_MASK_KHR) +#define CL_VERSION_PATCH_KHR(version) ((version) & CL_VERSION_PATCH_MASK_KHR) + +#define CL_MAKE_VERSION_KHR(major, minor, patch) \ + ((((major) & CL_VERSION_MAJOR_MASK_KHR) << (CL_VERSION_MINOR_BITS_KHR + CL_VERSION_PATCH_BITS_KHR)) | \ + (((minor) & CL_VERSION_MINOR_MASK_KHR) << CL_VERSION_PATCH_BITS_KHR) | \ + ((patch) & CL_VERSION_PATCH_MASK_KHR)) + +typedef cl_uint cl_version_khr; + +#define CL_NAME_VERSION_MAX_NAME_SIZE_KHR 64 + +typedef struct _cl_name_version_khr +{ + cl_version_khr version; + char name[CL_NAME_VERSION_MAX_NAME_SIZE_KHR]; +} cl_name_version_khr; + +/* cl_platform_info */ +#define CL_PLATFORM_NUMERIC_VERSION_KHR 0x0906 +#define CL_PLATFORM_EXTENSIONS_WITH_VERSION_KHR 0x0907 + +/* cl_device_info */ +#define CL_DEVICE_NUMERIC_VERSION_KHR 0x105E +#define CL_DEVICE_OPENCL_C_NUMERIC_VERSION_KHR 0x105F +#define CL_DEVICE_EXTENSIONS_WITH_VERSION_KHR 0x1060 +#define CL_DEVICE_ILS_WITH_VERSION_KHR 0x1061 +#define CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION_KHR 0x1062 + + +/********************************* +* cl_khr_device_uuid extension +*********************************/ +#define cl_khr_device_uuid 1 + +#define CL_UUID_SIZE_KHR 16 +#define CL_LUID_SIZE_KHR 8 + +#define CL_DEVICE_UUID_KHR 0x106A +#define CL_DRIVER_UUID_KHR 0x106B +#define CL_DEVICE_LUID_VALID_KHR 0x106C +#define CL_DEVICE_LUID_KHR 0x106D +#define CL_DEVICE_NODE_MASK_KHR 0x106E + + +/*************************************************************** +* cl_khr_pci_bus_info +***************************************************************/ +#define cl_khr_pci_bus_info 1 + +typedef struct _cl_device_pci_bus_info_khr { + cl_uint pci_domain; + cl_uint pci_bus; + cl_uint pci_device; + cl_uint pci_function; +} cl_device_pci_bus_info_khr; + +/* cl_device_info */ +#define CL_DEVICE_PCI_BUS_INFO_KHR 0x410F + + +/*************************************************************** +* cl_khr_suggested_local_work_size +***************************************************************/ +#define cl_khr_suggested_local_work_size 1 + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetKernelSuggestedLocalWorkSizeKHR( + cl_command_queue command_queue, + cl_kernel kernel, + cl_uint work_dim, + const size_t* global_work_offset, + const size_t* global_work_size, + size_t* suggested_local_work_size) CL_API_SUFFIX__VERSION_3_0; + +typedef cl_int (CL_API_CALL * +clGetKernelSuggestedLocalWorkSizeKHR_fn)( + cl_command_queue command_queue, + cl_kernel kernel, + cl_uint work_dim, + const size_t* global_work_offset, + const size_t* global_work_size, + size_t* suggested_local_work_size) CL_API_SUFFIX__VERSION_3_0; + + +/*************************************************************** +* cl_khr_integer_dot_product +***************************************************************/ +#define cl_khr_integer_dot_product 1 + +typedef cl_bitfield cl_device_integer_dot_product_capabilities_khr; + +/* cl_device_integer_dot_product_capabilities_khr */ +#define CL_DEVICE_INTEGER_DOT_PRODUCT_INPUT_4x8BIT_PACKED_KHR (1 << 0) +#define CL_DEVICE_INTEGER_DOT_PRODUCT_INPUT_4x8BIT_KHR (1 << 1) + +/* cl_device_info */ +#define CL_DEVICE_INTEGER_DOT_PRODUCT_CAPABILITIES_KHR 0x1073 + + +/********************************** + * cl_arm_import_memory extension * + **********************************/ +#define cl_arm_import_memory 1 + +typedef intptr_t cl_import_properties_arm; + +/* Default and valid proporties name for cl_arm_import_memory */ +#define CL_IMPORT_TYPE_ARM 0x40B2 + +/* Host process memory type default value for CL_IMPORT_TYPE_ARM property */ +#define CL_IMPORT_TYPE_HOST_ARM 0x40B3 + +/* DMA BUF memory type value for CL_IMPORT_TYPE_ARM property */ +#define CL_IMPORT_TYPE_DMA_BUF_ARM 0x40B4 + +/* Protected memory property */ +#define CL_IMPORT_TYPE_PROTECTED_ARM 0x40B5 + +/* Android hardware buffer type value for CL_IMPORT_TYPE_ARM property */ +#define CL_IMPORT_TYPE_ANDROID_HARDWARE_BUFFER_ARM 0x41E2 + +/* Data consistency with host property */ +#define CL_IMPORT_DMA_BUF_DATA_CONSISTENCY_WITH_HOST_ARM 0x41E3 + +/* Index of plane in a multiplanar hardware buffer */ +#define CL_IMPORT_ANDROID_HARDWARE_BUFFER_PLANE_INDEX_ARM 0x41EF + +/* Index of layer in a multilayer hardware buffer */ +#define CL_IMPORT_ANDROID_HARDWARE_BUFFER_LAYER_INDEX_ARM 0x41F0 + +/* Import memory size value to indicate a size for the whole buffer */ +#define CL_IMPORT_MEMORY_WHOLE_ALLOCATION_ARM SIZE_MAX + +/* This extension adds a new function that allows for direct memory import into + * OpenCL via the clImportMemoryARM function. + * + * Memory imported through this interface will be mapped into the device's page + * tables directly, providing zero copy access. It will never fall back to copy + * operations and aliased buffers. + * + * Types of memory supported for import are specified as additional extension + * strings. + * + * This extension produces cl_mem allocations which are compatible with all other + * users of cl_mem in the standard API. + * + * This extension maps pages with the same properties as the normal buffer creation + * function clCreateBuffer. + */ +extern CL_API_ENTRY cl_mem CL_API_CALL +clImportMemoryARM( cl_context context, + cl_mem_flags flags, + const cl_import_properties_arm *properties, + void *memory, + size_t size, + cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + + +/****************************************** + * cl_arm_shared_virtual_memory extension * + ******************************************/ +#define cl_arm_shared_virtual_memory 1 + +/* Used by clGetDeviceInfo */ +#define CL_DEVICE_SVM_CAPABILITIES_ARM 0x40B6 + +/* Used by clGetMemObjectInfo */ +#define CL_MEM_USES_SVM_POINTER_ARM 0x40B7 + +/* Used by clSetKernelExecInfoARM: */ +#define CL_KERNEL_EXEC_INFO_SVM_PTRS_ARM 0x40B8 +#define CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM_ARM 0x40B9 + +/* To be used by clGetEventInfo: */ +#define CL_COMMAND_SVM_FREE_ARM 0x40BA +#define CL_COMMAND_SVM_MEMCPY_ARM 0x40BB +#define CL_COMMAND_SVM_MEMFILL_ARM 0x40BC +#define CL_COMMAND_SVM_MAP_ARM 0x40BD +#define CL_COMMAND_SVM_UNMAP_ARM 0x40BE + +/* Flag values returned by clGetDeviceInfo with CL_DEVICE_SVM_CAPABILITIES_ARM as the param_name. */ +#define CL_DEVICE_SVM_COARSE_GRAIN_BUFFER_ARM (1 << 0) +#define CL_DEVICE_SVM_FINE_GRAIN_BUFFER_ARM (1 << 1) +#define CL_DEVICE_SVM_FINE_GRAIN_SYSTEM_ARM (1 << 2) +#define CL_DEVICE_SVM_ATOMICS_ARM (1 << 3) + +/* Flag values used by clSVMAllocARM: */ +#define CL_MEM_SVM_FINE_GRAIN_BUFFER_ARM (1 << 10) +#define CL_MEM_SVM_ATOMICS_ARM (1 << 11) + +typedef cl_bitfield cl_svm_mem_flags_arm; +typedef cl_uint cl_kernel_exec_info_arm; +typedef cl_bitfield cl_device_svm_capabilities_arm; + +extern CL_API_ENTRY void * CL_API_CALL +clSVMAllocARM(cl_context context, + cl_svm_mem_flags_arm flags, + size_t size, + cl_uint alignment) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY void CL_API_CALL +clSVMFreeARM(cl_context context, + void * svm_pointer) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueSVMFreeARM(cl_command_queue command_queue, + cl_uint num_svm_pointers, + void * svm_pointers[], + void (CL_CALLBACK * pfn_free_func)(cl_command_queue queue, + cl_uint num_svm_pointers, + void * svm_pointers[], + void * user_data), + void * user_data, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueSVMMemcpyARM(cl_command_queue command_queue, + cl_bool blocking_copy, + void * dst_ptr, + const void * src_ptr, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueSVMMemFillARM(cl_command_queue command_queue, + void * svm_ptr, + const void * pattern, + size_t pattern_size, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueSVMMapARM(cl_command_queue command_queue, + cl_bool blocking_map, + cl_map_flags flags, + void * svm_ptr, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueSVMUnmapARM(cl_command_queue command_queue, + void * svm_ptr, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetKernelArgSVMPointerARM(cl_kernel kernel, + cl_uint arg_index, + const void * arg_value) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetKernelExecInfoARM(cl_kernel kernel, + cl_kernel_exec_info_arm param_name, + size_t param_value_size, + const void * param_value) CL_API_SUFFIX__VERSION_1_2; + +/******************************** + * cl_arm_get_core_id extension * + ********************************/ + +#ifdef CL_VERSION_1_2 + +#define cl_arm_get_core_id 1 + +/* Device info property for bitfield of cores present */ +#define CL_DEVICE_COMPUTE_UNITS_BITFIELD_ARM 0x40BF + +#endif /* CL_VERSION_1_2 */ + +/********************************* +* cl_arm_job_slot_selection +*********************************/ + +#define cl_arm_job_slot_selection 1 + +/* cl_device_info */ +#define CL_DEVICE_JOB_SLOTS_ARM 0x41E0 + +/* cl_command_queue_properties */ +#define CL_QUEUE_JOB_SLOT_ARM 0x41E1 + +/********************************* +* cl_arm_scheduling_controls +*********************************/ + +#define cl_arm_scheduling_controls 1 + +typedef cl_bitfield cl_device_scheduling_controls_capabilities_arm; + +/* cl_device_info */ +#define CL_DEVICE_SCHEDULING_CONTROLS_CAPABILITIES_ARM 0x41E4 + +#define CL_DEVICE_SCHEDULING_KERNEL_BATCHING_ARM (1 << 0) +#define CL_DEVICE_SCHEDULING_WORKGROUP_BATCH_SIZE_ARM (1 << 1) +#define CL_DEVICE_SCHEDULING_WORKGROUP_BATCH_SIZE_MODIFIER_ARM (1 << 2) +#define CL_DEVICE_SCHEDULING_DEFERRED_FLUSH_ARM (1 << 3) +#define CL_DEVICE_SCHEDULING_REGISTER_ALLOCATION_ARM (1 << 4) + +#define CL_DEVICE_SUPPORTED_REGISTER_ALLOCATIONS_ARM 0x41EB + +/* cl_kernel_info */ +#define CL_KERNEL_EXEC_INFO_WORKGROUP_BATCH_SIZE_ARM 0x41E5 +#define CL_KERNEL_EXEC_INFO_WORKGROUP_BATCH_SIZE_MODIFIER_ARM 0x41E6 + +/* cl_queue_properties */ +#define CL_QUEUE_KERNEL_BATCHING_ARM 0x41E7 +#define CL_QUEUE_DEFERRED_FLUSH_ARM 0x41EC + +/************************************** +* cl_arm_controlled_kernel_termination +***************************************/ + +#define cl_arm_controlled_kernel_termination 1 + +/* Error code to indicate kernel terminated with failure */ +#define CL_COMMAND_TERMINATED_ITSELF_WITH_FAILURE_ARM -1108 + +/* cl_device_info */ +#define CL_DEVICE_CONTROLLED_TERMINATION_CAPABILITIES_ARM 0x41EE + +/* Bit fields for controlled termination feature query */ +typedef cl_bitfield cl_device_controlled_termination_capabilities_arm; + +#define CL_DEVICE_CONTROLLED_TERMINATION_SUCCESS_ARM (1 << 0) +#define CL_DEVICE_CONTROLLED_TERMINATION_FAILURE_ARM (1 << 1) +#define CL_DEVICE_CONTROLLED_TERMINATION_QUERY_ARM (1 << 2) + +/* cl_event_info */ +#define CL_EVENT_COMMAND_TERMINATION_REASON_ARM 0x41ED + +/* Values returned for event termination reason query */ +typedef cl_uint cl_command_termination_reason_arm; + +#define CL_COMMAND_TERMINATION_COMPLETION_ARM 0 +#define CL_COMMAND_TERMINATION_CONTROLLED_SUCCESS_ARM 1 +#define CL_COMMAND_TERMINATION_CONTROLLED_FAILURE_ARM 2 +#define CL_COMMAND_TERMINATION_ERROR_ARM 3 + +/*************************************** +* cl_intel_thread_local_exec extension * +****************************************/ + +#define cl_intel_thread_local_exec 1 + +#define CL_QUEUE_THREAD_LOCAL_EXEC_ENABLE_INTEL (((cl_bitfield)1) << 31) + +/*********************************************** +* cl_intel_device_partition_by_names extension * +************************************************/ + +#define cl_intel_device_partition_by_names 1 + +#define CL_DEVICE_PARTITION_BY_NAMES_INTEL 0x4052 +#define CL_PARTITION_BY_NAMES_LIST_END_INTEL -1 + +/************************************************ +* cl_intel_accelerator extension * +* cl_intel_motion_estimation extension * +* cl_intel_advanced_motion_estimation extension * +*************************************************/ + +#define cl_intel_accelerator 1 +#define cl_intel_motion_estimation 1 +#define cl_intel_advanced_motion_estimation 1 + +typedef struct _cl_accelerator_intel* cl_accelerator_intel; +typedef cl_uint cl_accelerator_type_intel; +typedef cl_uint cl_accelerator_info_intel; + +typedef struct _cl_motion_estimation_desc_intel { + cl_uint mb_block_type; + cl_uint subpixel_mode; + cl_uint sad_adjust_mode; + cl_uint search_path_type; +} cl_motion_estimation_desc_intel; + +/* error codes */ +#define CL_INVALID_ACCELERATOR_INTEL -1094 +#define CL_INVALID_ACCELERATOR_TYPE_INTEL -1095 +#define CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL -1096 +#define CL_ACCELERATOR_TYPE_NOT_SUPPORTED_INTEL -1097 + +/* cl_accelerator_type_intel */ +#define CL_ACCELERATOR_TYPE_MOTION_ESTIMATION_INTEL 0x0 + +/* cl_accelerator_info_intel */ +#define CL_ACCELERATOR_DESCRIPTOR_INTEL 0x4090 +#define CL_ACCELERATOR_REFERENCE_COUNT_INTEL 0x4091 +#define CL_ACCELERATOR_CONTEXT_INTEL 0x4092 +#define CL_ACCELERATOR_TYPE_INTEL 0x4093 + +/* cl_motion_detect_desc_intel flags */ +#define CL_ME_MB_TYPE_16x16_INTEL 0x0 +#define CL_ME_MB_TYPE_8x8_INTEL 0x1 +#define CL_ME_MB_TYPE_4x4_INTEL 0x2 + +#define CL_ME_SUBPIXEL_MODE_INTEGER_INTEL 0x0 +#define CL_ME_SUBPIXEL_MODE_HPEL_INTEL 0x1 +#define CL_ME_SUBPIXEL_MODE_QPEL_INTEL 0x2 + +#define CL_ME_SAD_ADJUST_MODE_NONE_INTEL 0x0 +#define CL_ME_SAD_ADJUST_MODE_HAAR_INTEL 0x1 + +#define CL_ME_SEARCH_PATH_RADIUS_2_2_INTEL 0x0 +#define CL_ME_SEARCH_PATH_RADIUS_4_4_INTEL 0x1 +#define CL_ME_SEARCH_PATH_RADIUS_16_12_INTEL 0x5 + +#define CL_ME_SKIP_BLOCK_TYPE_16x16_INTEL 0x0 +#define CL_ME_CHROMA_INTRA_PREDICT_ENABLED_INTEL 0x1 +#define CL_ME_LUMA_INTRA_PREDICT_ENABLED_INTEL 0x2 +#define CL_ME_SKIP_BLOCK_TYPE_8x8_INTEL 0x4 + +#define CL_ME_FORWARD_INPUT_MODE_INTEL 0x1 +#define CL_ME_BACKWARD_INPUT_MODE_INTEL 0x2 +#define CL_ME_BIDIRECTION_INPUT_MODE_INTEL 0x3 + +#define CL_ME_BIDIR_WEIGHT_QUARTER_INTEL 16 +#define CL_ME_BIDIR_WEIGHT_THIRD_INTEL 21 +#define CL_ME_BIDIR_WEIGHT_HALF_INTEL 32 +#define CL_ME_BIDIR_WEIGHT_TWO_THIRD_INTEL 43 +#define CL_ME_BIDIR_WEIGHT_THREE_QUARTER_INTEL 48 + +#define CL_ME_COST_PENALTY_NONE_INTEL 0x0 +#define CL_ME_COST_PENALTY_LOW_INTEL 0x1 +#define CL_ME_COST_PENALTY_NORMAL_INTEL 0x2 +#define CL_ME_COST_PENALTY_HIGH_INTEL 0x3 + +#define CL_ME_COST_PRECISION_QPEL_INTEL 0x0 +#define CL_ME_COST_PRECISION_HPEL_INTEL 0x1 +#define CL_ME_COST_PRECISION_PEL_INTEL 0x2 +#define CL_ME_COST_PRECISION_DPEL_INTEL 0x3 + +#define CL_ME_LUMA_PREDICTOR_MODE_VERTICAL_INTEL 0x0 +#define CL_ME_LUMA_PREDICTOR_MODE_HORIZONTAL_INTEL 0x1 +#define CL_ME_LUMA_PREDICTOR_MODE_DC_INTEL 0x2 +#define CL_ME_LUMA_PREDICTOR_MODE_DIAGONAL_DOWN_LEFT_INTEL 0x3 + +#define CL_ME_LUMA_PREDICTOR_MODE_DIAGONAL_DOWN_RIGHT_INTEL 0x4 +#define CL_ME_LUMA_PREDICTOR_MODE_PLANE_INTEL 0x4 +#define CL_ME_LUMA_PREDICTOR_MODE_VERTICAL_RIGHT_INTEL 0x5 +#define CL_ME_LUMA_PREDICTOR_MODE_HORIZONTAL_DOWN_INTEL 0x6 +#define CL_ME_LUMA_PREDICTOR_MODE_VERTICAL_LEFT_INTEL 0x7 +#define CL_ME_LUMA_PREDICTOR_MODE_HORIZONTAL_UP_INTEL 0x8 + +#define CL_ME_CHROMA_PREDICTOR_MODE_DC_INTEL 0x0 +#define CL_ME_CHROMA_PREDICTOR_MODE_HORIZONTAL_INTEL 0x1 +#define CL_ME_CHROMA_PREDICTOR_MODE_VERTICAL_INTEL 0x2 +#define CL_ME_CHROMA_PREDICTOR_MODE_PLANE_INTEL 0x3 + +/* cl_device_info */ +#define CL_DEVICE_ME_VERSION_INTEL 0x407E + +#define CL_ME_VERSION_LEGACY_INTEL 0x0 +#define CL_ME_VERSION_ADVANCED_VER_1_INTEL 0x1 +#define CL_ME_VERSION_ADVANCED_VER_2_INTEL 0x2 + +extern CL_API_ENTRY cl_accelerator_intel CL_API_CALL +clCreateAcceleratorINTEL( + cl_context context, + cl_accelerator_type_intel accelerator_type, + size_t descriptor_size, + const void* descriptor, + cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_accelerator_intel (CL_API_CALL *clCreateAcceleratorINTEL_fn)( + cl_context context, + cl_accelerator_type_intel accelerator_type, + size_t descriptor_size, + const void* descriptor, + cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetAcceleratorInfoINTEL( + cl_accelerator_intel accelerator, + cl_accelerator_info_intel param_name, + size_t param_value_size, + void* param_value, + size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int (CL_API_CALL *clGetAcceleratorInfoINTEL_fn)( + cl_accelerator_intel accelerator, + cl_accelerator_info_intel param_name, + size_t param_value_size, + void* param_value, + size_t* param_value_size_ret) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainAcceleratorINTEL( + cl_accelerator_intel accelerator) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int (CL_API_CALL *clRetainAcceleratorINTEL_fn)( + cl_accelerator_intel accelerator) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseAcceleratorINTEL( + cl_accelerator_intel accelerator) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int (CL_API_CALL *clReleaseAcceleratorINTEL_fn)( + cl_accelerator_intel accelerator) CL_API_SUFFIX__VERSION_1_2; + +/****************************************** +* cl_intel_simultaneous_sharing extension * +*******************************************/ + +#define cl_intel_simultaneous_sharing 1 + +#define CL_DEVICE_SIMULTANEOUS_INTEROPS_INTEL 0x4104 +#define CL_DEVICE_NUM_SIMULTANEOUS_INTEROPS_INTEL 0x4105 + +/*********************************** +* cl_intel_egl_image_yuv extension * +************************************/ + +#define cl_intel_egl_image_yuv 1 + +#define CL_EGL_YUV_PLANE_INTEL 0x4107 + +/******************************** +* cl_intel_packed_yuv extension * +*********************************/ + +#define cl_intel_packed_yuv 1 + +#define CL_YUYV_INTEL 0x4076 +#define CL_UYVY_INTEL 0x4077 +#define CL_YVYU_INTEL 0x4078 +#define CL_VYUY_INTEL 0x4079 + +/******************************************** +* cl_intel_required_subgroup_size extension * +*********************************************/ + +#define cl_intel_required_subgroup_size 1 + +#define CL_DEVICE_SUB_GROUP_SIZES_INTEL 0x4108 +#define CL_KERNEL_SPILL_MEM_SIZE_INTEL 0x4109 +#define CL_KERNEL_COMPILE_SUB_GROUP_SIZE_INTEL 0x410A + +/**************************************** +* cl_intel_driver_diagnostics extension * +*****************************************/ + +#define cl_intel_driver_diagnostics 1 + +typedef cl_uint cl_diagnostics_verbose_level; + +#define CL_CONTEXT_SHOW_DIAGNOSTICS_INTEL 0x4106 + +#define CL_CONTEXT_DIAGNOSTICS_LEVEL_ALL_INTEL ( 0xff ) +#define CL_CONTEXT_DIAGNOSTICS_LEVEL_GOOD_INTEL ( 1 ) +#define CL_CONTEXT_DIAGNOSTICS_LEVEL_BAD_INTEL ( 1 << 1 ) +#define CL_CONTEXT_DIAGNOSTICS_LEVEL_NEUTRAL_INTEL ( 1 << 2 ) + +/******************************** +* cl_intel_planar_yuv extension * +*********************************/ + +#define CL_NV12_INTEL 0x410E + +#define CL_MEM_NO_ACCESS_INTEL ( 1 << 24 ) +#define CL_MEM_ACCESS_FLAGS_UNRESTRICTED_INTEL ( 1 << 25 ) + +#define CL_DEVICE_PLANAR_YUV_MAX_WIDTH_INTEL 0x417E +#define CL_DEVICE_PLANAR_YUV_MAX_HEIGHT_INTEL 0x417F + +/******************************************************* +* cl_intel_device_side_avc_motion_estimation extension * +********************************************************/ + +#define CL_DEVICE_AVC_ME_VERSION_INTEL 0x410B +#define CL_DEVICE_AVC_ME_SUPPORTS_TEXTURE_SAMPLER_USE_INTEL 0x410C +#define CL_DEVICE_AVC_ME_SUPPORTS_PREEMPTION_INTEL 0x410D + +#define CL_AVC_ME_VERSION_0_INTEL 0x0 /* No support. */ +#define CL_AVC_ME_VERSION_1_INTEL 0x1 /* First supported version. */ + +#define CL_AVC_ME_MAJOR_16x16_INTEL 0x0 +#define CL_AVC_ME_MAJOR_16x8_INTEL 0x1 +#define CL_AVC_ME_MAJOR_8x16_INTEL 0x2 +#define CL_AVC_ME_MAJOR_8x8_INTEL 0x3 + +#define CL_AVC_ME_MINOR_8x8_INTEL 0x0 +#define CL_AVC_ME_MINOR_8x4_INTEL 0x1 +#define CL_AVC_ME_MINOR_4x8_INTEL 0x2 +#define CL_AVC_ME_MINOR_4x4_INTEL 0x3 + +#define CL_AVC_ME_MAJOR_FORWARD_INTEL 0x0 +#define CL_AVC_ME_MAJOR_BACKWARD_INTEL 0x1 +#define CL_AVC_ME_MAJOR_BIDIRECTIONAL_INTEL 0x2 + +#define CL_AVC_ME_PARTITION_MASK_ALL_INTEL 0x0 +#define CL_AVC_ME_PARTITION_MASK_16x16_INTEL 0x7E +#define CL_AVC_ME_PARTITION_MASK_16x8_INTEL 0x7D +#define CL_AVC_ME_PARTITION_MASK_8x16_INTEL 0x7B +#define CL_AVC_ME_PARTITION_MASK_8x8_INTEL 0x77 +#define CL_AVC_ME_PARTITION_MASK_8x4_INTEL 0x6F +#define CL_AVC_ME_PARTITION_MASK_4x8_INTEL 0x5F +#define CL_AVC_ME_PARTITION_MASK_4x4_INTEL 0x3F + +#define CL_AVC_ME_SEARCH_WINDOW_EXHAUSTIVE_INTEL 0x0 +#define CL_AVC_ME_SEARCH_WINDOW_SMALL_INTEL 0x1 +#define CL_AVC_ME_SEARCH_WINDOW_TINY_INTEL 0x2 +#define CL_AVC_ME_SEARCH_WINDOW_EXTRA_TINY_INTEL 0x3 +#define CL_AVC_ME_SEARCH_WINDOW_DIAMOND_INTEL 0x4 +#define CL_AVC_ME_SEARCH_WINDOW_LARGE_DIAMOND_INTEL 0x5 +#define CL_AVC_ME_SEARCH_WINDOW_RESERVED0_INTEL 0x6 +#define CL_AVC_ME_SEARCH_WINDOW_RESERVED1_INTEL 0x7 +#define CL_AVC_ME_SEARCH_WINDOW_CUSTOM_INTEL 0x8 +#define CL_AVC_ME_SEARCH_WINDOW_16x12_RADIUS_INTEL 0x9 +#define CL_AVC_ME_SEARCH_WINDOW_4x4_RADIUS_INTEL 0x2 +#define CL_AVC_ME_SEARCH_WINDOW_2x2_RADIUS_INTEL 0xa + +#define CL_AVC_ME_SAD_ADJUST_MODE_NONE_INTEL 0x0 +#define CL_AVC_ME_SAD_ADJUST_MODE_HAAR_INTEL 0x2 + +#define CL_AVC_ME_SUBPIXEL_MODE_INTEGER_INTEL 0x0 +#define CL_AVC_ME_SUBPIXEL_MODE_HPEL_INTEL 0x1 +#define CL_AVC_ME_SUBPIXEL_MODE_QPEL_INTEL 0x3 + +#define CL_AVC_ME_COST_PRECISION_QPEL_INTEL 0x0 +#define CL_AVC_ME_COST_PRECISION_HPEL_INTEL 0x1 +#define CL_AVC_ME_COST_PRECISION_PEL_INTEL 0x2 +#define CL_AVC_ME_COST_PRECISION_DPEL_INTEL 0x3 + +#define CL_AVC_ME_BIDIR_WEIGHT_QUARTER_INTEL 0x10 +#define CL_AVC_ME_BIDIR_WEIGHT_THIRD_INTEL 0x15 +#define CL_AVC_ME_BIDIR_WEIGHT_HALF_INTEL 0x20 +#define CL_AVC_ME_BIDIR_WEIGHT_TWO_THIRD_INTEL 0x2B +#define CL_AVC_ME_BIDIR_WEIGHT_THREE_QUARTER_INTEL 0x30 + +#define CL_AVC_ME_BORDER_REACHED_LEFT_INTEL 0x0 +#define CL_AVC_ME_BORDER_REACHED_RIGHT_INTEL 0x2 +#define CL_AVC_ME_BORDER_REACHED_TOP_INTEL 0x4 +#define CL_AVC_ME_BORDER_REACHED_BOTTOM_INTEL 0x8 + +#define CL_AVC_ME_SKIP_BLOCK_PARTITION_16x16_INTEL 0x0 +#define CL_AVC_ME_SKIP_BLOCK_PARTITION_8x8_INTEL 0x4000 + +#define CL_AVC_ME_SKIP_BLOCK_16x16_FORWARD_ENABLE_INTEL ( 0x1 << 24 ) +#define CL_AVC_ME_SKIP_BLOCK_16x16_BACKWARD_ENABLE_INTEL ( 0x2 << 24 ) +#define CL_AVC_ME_SKIP_BLOCK_16x16_DUAL_ENABLE_INTEL ( 0x3 << 24 ) +#define CL_AVC_ME_SKIP_BLOCK_8x8_FORWARD_ENABLE_INTEL ( 0x55 << 24 ) +#define CL_AVC_ME_SKIP_BLOCK_8x8_BACKWARD_ENABLE_INTEL ( 0xAA << 24 ) +#define CL_AVC_ME_SKIP_BLOCK_8x8_DUAL_ENABLE_INTEL ( 0xFF << 24 ) +#define CL_AVC_ME_SKIP_BLOCK_8x8_0_FORWARD_ENABLE_INTEL ( 0x1 << 24 ) +#define CL_AVC_ME_SKIP_BLOCK_8x8_0_BACKWARD_ENABLE_INTEL ( 0x2 << 24 ) +#define CL_AVC_ME_SKIP_BLOCK_8x8_1_FORWARD_ENABLE_INTEL ( 0x1 << 26 ) +#define CL_AVC_ME_SKIP_BLOCK_8x8_1_BACKWARD_ENABLE_INTEL ( 0x2 << 26 ) +#define CL_AVC_ME_SKIP_BLOCK_8x8_2_FORWARD_ENABLE_INTEL ( 0x1 << 28 ) +#define CL_AVC_ME_SKIP_BLOCK_8x8_2_BACKWARD_ENABLE_INTEL ( 0x2 << 28 ) +#define CL_AVC_ME_SKIP_BLOCK_8x8_3_FORWARD_ENABLE_INTEL ( 0x1 << 30 ) +#define CL_AVC_ME_SKIP_BLOCK_8x8_3_BACKWARD_ENABLE_INTEL ( 0x2 << 30 ) + +#define CL_AVC_ME_BLOCK_BASED_SKIP_4x4_INTEL 0x00 +#define CL_AVC_ME_BLOCK_BASED_SKIP_8x8_INTEL 0x80 + +#define CL_AVC_ME_INTRA_16x16_INTEL 0x0 +#define CL_AVC_ME_INTRA_8x8_INTEL 0x1 +#define CL_AVC_ME_INTRA_4x4_INTEL 0x2 + +#define CL_AVC_ME_INTRA_LUMA_PARTITION_MASK_16x16_INTEL 0x6 +#define CL_AVC_ME_INTRA_LUMA_PARTITION_MASK_8x8_INTEL 0x5 +#define CL_AVC_ME_INTRA_LUMA_PARTITION_MASK_4x4_INTEL 0x3 + +#define CL_AVC_ME_INTRA_NEIGHBOR_LEFT_MASK_ENABLE_INTEL 0x60 +#define CL_AVC_ME_INTRA_NEIGHBOR_UPPER_MASK_ENABLE_INTEL 0x10 +#define CL_AVC_ME_INTRA_NEIGHBOR_UPPER_RIGHT_MASK_ENABLE_INTEL 0x8 +#define CL_AVC_ME_INTRA_NEIGHBOR_UPPER_LEFT_MASK_ENABLE_INTEL 0x4 + +#define CL_AVC_ME_LUMA_PREDICTOR_MODE_VERTICAL_INTEL 0x0 +#define CL_AVC_ME_LUMA_PREDICTOR_MODE_HORIZONTAL_INTEL 0x1 +#define CL_AVC_ME_LUMA_PREDICTOR_MODE_DC_INTEL 0x2 +#define CL_AVC_ME_LUMA_PREDICTOR_MODE_DIAGONAL_DOWN_LEFT_INTEL 0x3 +#define CL_AVC_ME_LUMA_PREDICTOR_MODE_DIAGONAL_DOWN_RIGHT_INTEL 0x4 +#define CL_AVC_ME_LUMA_PREDICTOR_MODE_PLANE_INTEL 0x4 +#define CL_AVC_ME_LUMA_PREDICTOR_MODE_VERTICAL_RIGHT_INTEL 0x5 +#define CL_AVC_ME_LUMA_PREDICTOR_MODE_HORIZONTAL_DOWN_INTEL 0x6 +#define CL_AVC_ME_LUMA_PREDICTOR_MODE_VERTICAL_LEFT_INTEL 0x7 +#define CL_AVC_ME_LUMA_PREDICTOR_MODE_HORIZONTAL_UP_INTEL 0x8 +#define CL_AVC_ME_CHROMA_PREDICTOR_MODE_DC_INTEL 0x0 +#define CL_AVC_ME_CHROMA_PREDICTOR_MODE_HORIZONTAL_INTEL 0x1 +#define CL_AVC_ME_CHROMA_PREDICTOR_MODE_VERTICAL_INTEL 0x2 +#define CL_AVC_ME_CHROMA_PREDICTOR_MODE_PLANE_INTEL 0x3 + +#define CL_AVC_ME_FRAME_FORWARD_INTEL 0x1 +#define CL_AVC_ME_FRAME_BACKWARD_INTEL 0x2 +#define CL_AVC_ME_FRAME_DUAL_INTEL 0x3 + +#define CL_AVC_ME_SLICE_TYPE_PRED_INTEL 0x0 +#define CL_AVC_ME_SLICE_TYPE_BPRED_INTEL 0x1 +#define CL_AVC_ME_SLICE_TYPE_INTRA_INTEL 0x2 + +#define CL_AVC_ME_INTERLACED_SCAN_TOP_FIELD_INTEL 0x0 +#define CL_AVC_ME_INTERLACED_SCAN_BOTTOM_FIELD_INTEL 0x1 + +/******************************************* +* cl_intel_unified_shared_memory extension * +********************************************/ + +/* These APIs are in sync with Revision Q of the cl_intel_unified_shared_memory spec! */ + +#define cl_intel_unified_shared_memory 1 + +/* cl_device_info */ +#define CL_DEVICE_HOST_MEM_CAPABILITIES_INTEL 0x4190 +#define CL_DEVICE_DEVICE_MEM_CAPABILITIES_INTEL 0x4191 +#define CL_DEVICE_SINGLE_DEVICE_SHARED_MEM_CAPABILITIES_INTEL 0x4192 +#define CL_DEVICE_CROSS_DEVICE_SHARED_MEM_CAPABILITIES_INTEL 0x4193 +#define CL_DEVICE_SHARED_SYSTEM_MEM_CAPABILITIES_INTEL 0x4194 + +typedef cl_bitfield cl_device_unified_shared_memory_capabilities_intel; + +/* cl_device_unified_shared_memory_capabilities_intel - bitfield */ +#define CL_UNIFIED_SHARED_MEMORY_ACCESS_INTEL (1 << 0) +#define CL_UNIFIED_SHARED_MEMORY_ATOMIC_ACCESS_INTEL (1 << 1) +#define CL_UNIFIED_SHARED_MEMORY_CONCURRENT_ACCESS_INTEL (1 << 2) +#define CL_UNIFIED_SHARED_MEMORY_CONCURRENT_ATOMIC_ACCESS_INTEL (1 << 3) + +typedef cl_properties cl_mem_properties_intel; + +/* cl_mem_properties_intel */ +#define CL_MEM_ALLOC_FLAGS_INTEL 0x4195 + +typedef cl_bitfield cl_mem_alloc_flags_intel; + +/* cl_mem_alloc_flags_intel - bitfield */ +#define CL_MEM_ALLOC_WRITE_COMBINED_INTEL (1 << 0) + +typedef cl_uint cl_mem_info_intel; + +/* cl_mem_alloc_info_intel */ +#define CL_MEM_ALLOC_TYPE_INTEL 0x419A +#define CL_MEM_ALLOC_BASE_PTR_INTEL 0x419B +#define CL_MEM_ALLOC_SIZE_INTEL 0x419C +#define CL_MEM_ALLOC_DEVICE_INTEL 0x419D +/* Enum values 0x419E-0x419F are reserved for future queries. */ + +typedef cl_uint cl_unified_shared_memory_type_intel; + +/* cl_unified_shared_memory_type_intel */ +#define CL_MEM_TYPE_UNKNOWN_INTEL 0x4196 +#define CL_MEM_TYPE_HOST_INTEL 0x4197 +#define CL_MEM_TYPE_DEVICE_INTEL 0x4198 +#define CL_MEM_TYPE_SHARED_INTEL 0x4199 + +typedef cl_uint cl_mem_advice_intel; + +/* cl_mem_advice_intel */ +/* Enum values 0x4208-0x420F are reserved for future memory advices. */ + +/* cl_kernel_exec_info */ +#define CL_KERNEL_EXEC_INFO_INDIRECT_HOST_ACCESS_INTEL 0x4200 +#define CL_KERNEL_EXEC_INFO_INDIRECT_DEVICE_ACCESS_INTEL 0x4201 +#define CL_KERNEL_EXEC_INFO_INDIRECT_SHARED_ACCESS_INTEL 0x4202 +#define CL_KERNEL_EXEC_INFO_USM_PTRS_INTEL 0x4203 + +/* cl_command_type */ +#define CL_COMMAND_MEMFILL_INTEL 0x4204 +#define CL_COMMAND_MEMCPY_INTEL 0x4205 +#define CL_COMMAND_MIGRATEMEM_INTEL 0x4206 +#define CL_COMMAND_MEMADVISE_INTEL 0x4207 + +extern CL_API_ENTRY void* CL_API_CALL +clHostMemAllocINTEL( + cl_context context, + const cl_mem_properties_intel* properties, + size_t size, + cl_uint alignment, + cl_int* errcode_ret); + +typedef void* (CL_API_CALL * +clHostMemAllocINTEL_fn)( + cl_context context, + const cl_mem_properties_intel* properties, + size_t size, + cl_uint alignment, + cl_int* errcode_ret); + +extern CL_API_ENTRY void* CL_API_CALL +clDeviceMemAllocINTEL( + cl_context context, + cl_device_id device, + const cl_mem_properties_intel* properties, + size_t size, + cl_uint alignment, + cl_int* errcode_ret); + +typedef void* (CL_API_CALL * +clDeviceMemAllocINTEL_fn)( + cl_context context, + cl_device_id device, + const cl_mem_properties_intel* properties, + size_t size, + cl_uint alignment, + cl_int* errcode_ret); + +extern CL_API_ENTRY void* CL_API_CALL +clSharedMemAllocINTEL( + cl_context context, + cl_device_id device, + const cl_mem_properties_intel* properties, + size_t size, + cl_uint alignment, + cl_int* errcode_ret); + +typedef void* (CL_API_CALL * +clSharedMemAllocINTEL_fn)( + cl_context context, + cl_device_id device, + const cl_mem_properties_intel* properties, + size_t size, + cl_uint alignment, + cl_int* errcode_ret); + +extern CL_API_ENTRY cl_int CL_API_CALL +clMemFreeINTEL( + cl_context context, + void* ptr); + +typedef cl_int (CL_API_CALL * +clMemFreeINTEL_fn)( + cl_context context, + void* ptr); + +extern CL_API_ENTRY cl_int CL_API_CALL +clMemBlockingFreeINTEL( + cl_context context, + void* ptr); + +typedef cl_int (CL_API_CALL * +clMemBlockingFreeINTEL_fn)( + cl_context context, + void* ptr); + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetMemAllocInfoINTEL( + cl_context context, + const void* ptr, + cl_mem_info_intel param_name, + size_t param_value_size, + void* param_value, + size_t* param_value_size_ret); + +typedef cl_int (CL_API_CALL * +clGetMemAllocInfoINTEL_fn)( + cl_context context, + const void* ptr, + cl_mem_info_intel param_name, + size_t param_value_size, + void* param_value, + size_t* param_value_size_ret); + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetKernelArgMemPointerINTEL( + cl_kernel kernel, + cl_uint arg_index, + const void* arg_value); + +typedef cl_int (CL_API_CALL * +clSetKernelArgMemPointerINTEL_fn)( + cl_kernel kernel, + cl_uint arg_index, + const void* arg_value); + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueMemsetINTEL( /* Deprecated */ + cl_command_queue command_queue, + void* dst_ptr, + cl_int value, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event); + +typedef cl_int (CL_API_CALL * +clEnqueueMemsetINTEL_fn)( /* Deprecated */ + cl_command_queue command_queue, + void* dst_ptr, + cl_int value, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event); + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueMemFillINTEL( + cl_command_queue command_queue, + void* dst_ptr, + const void* pattern, + size_t pattern_size, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event); + +typedef cl_int (CL_API_CALL * +clEnqueueMemFillINTEL_fn)( + cl_command_queue command_queue, + void* dst_ptr, + const void* pattern, + size_t pattern_size, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event); + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueMemcpyINTEL( + cl_command_queue command_queue, + cl_bool blocking, + void* dst_ptr, + const void* src_ptr, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event); + +typedef cl_int (CL_API_CALL * +clEnqueueMemcpyINTEL_fn)( + cl_command_queue command_queue, + cl_bool blocking, + void* dst_ptr, + const void* src_ptr, + size_t size, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event); + +#ifdef CL_VERSION_1_2 + +/* Because these APIs use cl_mem_migration_flags, they require + OpenCL 1.2: */ + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueMigrateMemINTEL( + cl_command_queue command_queue, + const void* ptr, + size_t size, + cl_mem_migration_flags flags, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event); + +typedef cl_int (CL_API_CALL * +clEnqueueMigrateMemINTEL_fn)( + cl_command_queue command_queue, + const void* ptr, + size_t size, + cl_mem_migration_flags flags, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event); + +#endif + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueMemAdviseINTEL( + cl_command_queue command_queue, + const void* ptr, + size_t size, + cl_mem_advice_intel advice, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event); + +typedef cl_int (CL_API_CALL * +clEnqueueMemAdviseINTEL_fn)( + cl_command_queue command_queue, + const void* ptr, + size_t size, + cl_mem_advice_intel advice, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event); + +/*************************************************** +* cl_intel_create_buffer_with_properties extension * +****************************************************/ + +#define cl_intel_create_buffer_with_properties 1 + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateBufferWithPropertiesINTEL( + cl_context context, + const cl_mem_properties_intel* properties, + cl_mem_flags flags, + size_t size, + void * host_ptr, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_mem (CL_API_CALL * +clCreateBufferWithPropertiesINTEL_fn)( + cl_context context, + const cl_mem_properties_intel* properties, + cl_mem_flags flags, + size_t size, + void * host_ptr, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +/****************************************** +* cl_intel_mem_channel_property extension * +*******************************************/ + +#define CL_MEM_CHANNEL_INTEL 0x4213 + +/********************************* +* cl_intel_mem_force_host_memory * +**********************************/ + +#define cl_intel_mem_force_host_memory 1 + +/* cl_mem_flags */ +#define CL_MEM_FORCE_HOST_MEMORY_INTEL (1 << 20) + +/*************************************************************** +* cl_intel_command_queue_families +***************************************************************/ +#define cl_intel_command_queue_families 1 + +typedef cl_bitfield cl_command_queue_capabilities_intel; + +#define CL_QUEUE_FAMILY_MAX_NAME_SIZE_INTEL 64 + +typedef struct _cl_queue_family_properties_intel { + cl_command_queue_properties properties; + cl_command_queue_capabilities_intel capabilities; + cl_uint count; + char name[CL_QUEUE_FAMILY_MAX_NAME_SIZE_INTEL]; +} cl_queue_family_properties_intel; + +/* cl_device_info */ +#define CL_DEVICE_QUEUE_FAMILY_PROPERTIES_INTEL 0x418B + +/* cl_queue_properties */ +#define CL_QUEUE_FAMILY_INTEL 0x418C +#define CL_QUEUE_INDEX_INTEL 0x418D + +/* cl_command_queue_capabilities_intel */ +#define CL_QUEUE_DEFAULT_CAPABILITIES_INTEL 0 +#define CL_QUEUE_CAPABILITY_CREATE_SINGLE_QUEUE_EVENTS_INTEL (1 << 0) +#define CL_QUEUE_CAPABILITY_CREATE_CROSS_QUEUE_EVENTS_INTEL (1 << 1) +#define CL_QUEUE_CAPABILITY_SINGLE_QUEUE_EVENT_WAIT_LIST_INTEL (1 << 2) +#define CL_QUEUE_CAPABILITY_CROSS_QUEUE_EVENT_WAIT_LIST_INTEL (1 << 3) +#define CL_QUEUE_CAPABILITY_TRANSFER_BUFFER_INTEL (1 << 8) +#define CL_QUEUE_CAPABILITY_TRANSFER_BUFFER_RECT_INTEL (1 << 9) +#define CL_QUEUE_CAPABILITY_MAP_BUFFER_INTEL (1 << 10) +#define CL_QUEUE_CAPABILITY_FILL_BUFFER_INTEL (1 << 11) +#define CL_QUEUE_CAPABILITY_TRANSFER_IMAGE_INTEL (1 << 12) +#define CL_QUEUE_CAPABILITY_MAP_IMAGE_INTEL (1 << 13) +#define CL_QUEUE_CAPABILITY_FILL_IMAGE_INTEL (1 << 14) +#define CL_QUEUE_CAPABILITY_TRANSFER_BUFFER_IMAGE_INTEL (1 << 15) +#define CL_QUEUE_CAPABILITY_TRANSFER_IMAGE_BUFFER_INTEL (1 << 16) +#define CL_QUEUE_CAPABILITY_MARKER_INTEL (1 << 24) +#define CL_QUEUE_CAPABILITY_BARRIER_INTEL (1 << 25) +#define CL_QUEUE_CAPABILITY_KERNEL_INTEL (1 << 26) + +#ifdef __cplusplus +} +#endif + + +#endif /* __CL_EXT_H */ diff --git a/ktx/external/basisu/OpenCL/CL/cl_ext_intel.h b/ktx/external/basisu/OpenCL/CL/cl_ext_intel.h new file mode 100644 index 0000000..a7ae87a --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_ext_intel.h @@ -0,0 +1,19 @@ +/******************************************************************************* + * Copyright (c) 2008-2020 The Khronos Group Inc. + * + * 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. + * + ******************************************************************************/ + +#include +#pragma message("The Intel extensions have been moved into cl_ext.h. Please include cl_ext.h directly.") diff --git a/ktx/external/basisu/OpenCL/CL/cl_gl.h b/ktx/external/basisu/OpenCL/CL/cl_gl.h new file mode 100644 index 0000000..5ea0fd8 --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_gl.h @@ -0,0 +1,169 @@ +/******************************************************************************* + * Copyright (c) 2008-2021 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#ifndef __OPENCL_CL_GL_H +#define __OPENCL_CL_GL_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef cl_uint cl_gl_object_type; +typedef cl_uint cl_gl_texture_info; +typedef cl_uint cl_gl_platform_info; +typedef struct __GLsync *cl_GLsync; + +/* cl_gl_object_type = 0x2000 - 0x200F enum values are currently taken */ +#define CL_GL_OBJECT_BUFFER 0x2000 +#define CL_GL_OBJECT_TEXTURE2D 0x2001 +#define CL_GL_OBJECT_TEXTURE3D 0x2002 +#define CL_GL_OBJECT_RENDERBUFFER 0x2003 +#ifdef CL_VERSION_1_2 +#define CL_GL_OBJECT_TEXTURE2D_ARRAY 0x200E +#define CL_GL_OBJECT_TEXTURE1D 0x200F +#define CL_GL_OBJECT_TEXTURE1D_ARRAY 0x2010 +#define CL_GL_OBJECT_TEXTURE_BUFFER 0x2011 +#endif + +/* cl_gl_texture_info */ +#define CL_GL_TEXTURE_TARGET 0x2004 +#define CL_GL_MIPMAP_LEVEL 0x2005 +#ifdef CL_VERSION_1_2 +#define CL_GL_NUM_SAMPLES 0x2012 +#endif + + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateFromGLBuffer(cl_context context, + cl_mem_flags flags, + cl_GLuint bufobj, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateFromGLTexture(cl_context context, + cl_mem_flags flags, + cl_GLenum target, + cl_GLint miplevel, + cl_GLuint texture, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +#endif + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateFromGLRenderbuffer(cl_context context, + cl_mem_flags flags, + cl_GLuint renderbuffer, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetGLObjectInfo(cl_mem memobj, + cl_gl_object_type * gl_object_type, + cl_GLuint * gl_object_name) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetGLTextureInfo(cl_mem memobj, + cl_gl_texture_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueAcquireGLObjects(cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueReleaseGLObjects(cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + + +/* Deprecated OpenCL 1.1 APIs */ +extern CL_API_ENTRY CL_API_PREFIX__VERSION_1_1_DEPRECATED cl_mem CL_API_CALL +clCreateFromGLTexture2D(cl_context context, + cl_mem_flags flags, + cl_GLenum target, + cl_GLint miplevel, + cl_GLuint texture, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +extern CL_API_ENTRY CL_API_PREFIX__VERSION_1_1_DEPRECATED cl_mem CL_API_CALL +clCreateFromGLTexture3D(cl_context context, + cl_mem_flags flags, + cl_GLenum target, + cl_GLint miplevel, + cl_GLuint texture, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +/* cl_khr_gl_sharing extension */ + +#define cl_khr_gl_sharing 1 + +typedef cl_uint cl_gl_context_info; + +/* Additional Error Codes */ +#define CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR -1000 + +/* cl_gl_context_info */ +#define CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR 0x2006 +#define CL_DEVICES_FOR_GL_CONTEXT_KHR 0x2007 + +/* Additional cl_context_properties */ +#define CL_GL_CONTEXT_KHR 0x2008 +#define CL_EGL_DISPLAY_KHR 0x2009 +#define CL_GLX_DISPLAY_KHR 0x200A +#define CL_WGL_HDC_KHR 0x200B +#define CL_CGL_SHAREGROUP_KHR 0x200C + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetGLContextInfoKHR(const cl_context_properties * properties, + cl_gl_context_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int (CL_API_CALL *clGetGLContextInfoKHR_fn)( + const cl_context_properties * properties, + cl_gl_context_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret); + +/* + * cl_khr_gl_event extension + */ +#define CL_COMMAND_GL_FENCE_SYNC_OBJECT_KHR 0x200D + +extern CL_API_ENTRY cl_event CL_API_CALL +clCreateEventFromGLsyncKHR(cl_context context, + cl_GLsync sync, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_1; + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENCL_CL_GL_H */ diff --git a/ktx/external/basisu/OpenCL/CL/cl_gl_ext.h b/ktx/external/basisu/OpenCL/CL/cl_gl_ext.h new file mode 100644 index 0000000..8ec8181 --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_gl_ext.h @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright (c) 2008-2021 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#include +#pragma message("All OpenGL-related extensions have been moved into cl_gl.h. Please include cl_gl.h directly.") diff --git a/ktx/external/basisu/OpenCL/CL/cl_half.h b/ktx/external/basisu/OpenCL/CL/cl_half.h new file mode 100644 index 0000000..ecc4223 --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_half.h @@ -0,0 +1,440 @@ +/******************************************************************************* + * Copyright (c) 2019-2020 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +/** + * This is a header-only utility library that provides OpenCL host code with + * routines for converting to/from cl_half values. + * + * Example usage: + * + * #include + * ... + * cl_half h = cl_half_from_float(0.5f, CL_HALF_RTE); + * cl_float f = cl_half_to_float(h); + */ + +#ifndef OPENCL_CL_HALF_H +#define OPENCL_CL_HALF_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * Rounding mode used when converting to cl_half. + */ +typedef enum +{ + CL_HALF_RTE, // round to nearest even + CL_HALF_RTZ, // round towards zero + CL_HALF_RTP, // round towards positive infinity + CL_HALF_RTN, // round towards negative infinity +} cl_half_rounding_mode; + + +/* Private utility macros. */ +#define CL_HALF_EXP_MASK 0x7C00 +#define CL_HALF_MAX_FINITE_MAG 0x7BFF + + +/* + * Utility to deal with values that overflow when converting to half precision. + */ +static inline cl_half cl_half_handle_overflow(cl_half_rounding_mode rounding_mode, + uint16_t sign) +{ + if (rounding_mode == CL_HALF_RTZ) + { + // Round overflow towards zero -> largest finite number (preserving sign) + return (sign << 15) | CL_HALF_MAX_FINITE_MAG; + } + else if (rounding_mode == CL_HALF_RTP && sign) + { + // Round negative overflow towards positive infinity -> most negative finite number + return (1 << 15) | CL_HALF_MAX_FINITE_MAG; + } + else if (rounding_mode == CL_HALF_RTN && !sign) + { + // Round positive overflow towards negative infinity -> largest finite number + return CL_HALF_MAX_FINITE_MAG; + } + + // Overflow to infinity + return (sign << 15) | CL_HALF_EXP_MASK; +} + +/* + * Utility to deal with values that underflow when converting to half precision. + */ +static inline cl_half cl_half_handle_underflow(cl_half_rounding_mode rounding_mode, + uint16_t sign) +{ + if (rounding_mode == CL_HALF_RTP && !sign) + { + // Round underflow towards positive infinity -> smallest positive value + return (sign << 15) | 1; + } + else if (rounding_mode == CL_HALF_RTN && sign) + { + // Round underflow towards negative infinity -> largest negative value + return (sign << 15) | 1; + } + + // Flush to zero + return (sign << 15); +} + + +/** + * Convert a cl_float to a cl_half. + */ +static inline cl_half cl_half_from_float(cl_float f, cl_half_rounding_mode rounding_mode) +{ + // Type-punning to get direct access to underlying bits + union + { + cl_float f; + uint32_t i; + } f32; + f32.f = f; + + // Extract sign bit + uint16_t sign = f32.i >> 31; + + // Extract FP32 exponent and mantissa + uint32_t f_exp = (f32.i >> (CL_FLT_MANT_DIG - 1)) & 0xFF; + uint32_t f_mant = f32.i & ((1 << (CL_FLT_MANT_DIG - 1)) - 1); + + // Remove FP32 exponent bias + int32_t exp = f_exp - CL_FLT_MAX_EXP + 1; + + // Add FP16 exponent bias + uint16_t h_exp = (uint16_t)(exp + CL_HALF_MAX_EXP - 1); + + // Position of the bit that will become the FP16 mantissa LSB + uint32_t lsb_pos = CL_FLT_MANT_DIG - CL_HALF_MANT_DIG; + + // Check for NaN / infinity + if (f_exp == 0xFF) + { + if (f_mant) + { + // NaN -> propagate mantissa and silence it + uint16_t h_mant = (uint16_t)(f_mant >> lsb_pos); + h_mant |= 0x200; + return (sign << 15) | CL_HALF_EXP_MASK | h_mant; + } + else + { + // Infinity -> zero mantissa + return (sign << 15) | CL_HALF_EXP_MASK; + } + } + + // Check for zero + if (!f_exp && !f_mant) + { + return (sign << 15); + } + + // Check for overflow + if (exp >= CL_HALF_MAX_EXP) + { + return cl_half_handle_overflow(rounding_mode, sign); + } + + // Check for underflow + if (exp < (CL_HALF_MIN_EXP - CL_HALF_MANT_DIG - 1)) + { + return cl_half_handle_underflow(rounding_mode, sign); + } + + // Check for value that will become denormal + if (exp < -14) + { + // Denormal -> include the implicit 1 from the FP32 mantissa + h_exp = 0; + f_mant |= 1 << (CL_FLT_MANT_DIG - 1); + + // Mantissa shift amount depends on exponent + lsb_pos = -exp + (CL_FLT_MANT_DIG - 25); + } + + // Generate FP16 mantissa by shifting FP32 mantissa + uint16_t h_mant = (uint16_t)(f_mant >> lsb_pos); + + // Check whether we need to round + uint32_t halfway = 1 << (lsb_pos - 1); + uint32_t mask = (halfway << 1) - 1; + switch (rounding_mode) + { + case CL_HALF_RTE: + if ((f_mant & mask) > halfway) + { + // More than halfway -> round up + h_mant += 1; + } + else if ((f_mant & mask) == halfway) + { + // Exactly halfway -> round to nearest even + if (h_mant & 0x1) + h_mant += 1; + } + break; + case CL_HALF_RTZ: + // Mantissa has already been truncated -> do nothing + break; + case CL_HALF_RTP: + if ((f_mant & mask) && !sign) + { + // Round positive numbers up + h_mant += 1; + } + break; + case CL_HALF_RTN: + if ((f_mant & mask) && sign) + { + // Round negative numbers down + h_mant += 1; + } + break; + } + + // Check for mantissa overflow + if (h_mant & 0x400) + { + h_exp += 1; + h_mant = 0; + } + + return (sign << 15) | (h_exp << 10) | h_mant; +} + + +/** + * Convert a cl_double to a cl_half. + */ +static inline cl_half cl_half_from_double(cl_double d, cl_half_rounding_mode rounding_mode) +{ + // Type-punning to get direct access to underlying bits + union + { + cl_double d; + uint64_t i; + } f64; + f64.d = d; + + // Extract sign bit + uint16_t sign = f64.i >> 63; + + // Extract FP64 exponent and mantissa + uint64_t d_exp = (f64.i >> (CL_DBL_MANT_DIG - 1)) & 0x7FF; + uint64_t d_mant = f64.i & (((uint64_t)1 << (CL_DBL_MANT_DIG - 1)) - 1); + + // Remove FP64 exponent bias + int64_t exp = d_exp - CL_DBL_MAX_EXP + 1; + + // Add FP16 exponent bias + uint16_t h_exp = (uint16_t)(exp + CL_HALF_MAX_EXP - 1); + + // Position of the bit that will become the FP16 mantissa LSB + uint32_t lsb_pos = CL_DBL_MANT_DIG - CL_HALF_MANT_DIG; + + // Check for NaN / infinity + if (d_exp == 0x7FF) + { + if (d_mant) + { + // NaN -> propagate mantissa and silence it + uint16_t h_mant = (uint16_t)(d_mant >> lsb_pos); + h_mant |= 0x200; + return (sign << 15) | CL_HALF_EXP_MASK | h_mant; + } + else + { + // Infinity -> zero mantissa + return (sign << 15) | CL_HALF_EXP_MASK; + } + } + + // Check for zero + if (!d_exp && !d_mant) + { + return (sign << 15); + } + + // Check for overflow + if (exp >= CL_HALF_MAX_EXP) + { + return cl_half_handle_overflow(rounding_mode, sign); + } + + // Check for underflow + if (exp < (CL_HALF_MIN_EXP - CL_HALF_MANT_DIG - 1)) + { + return cl_half_handle_underflow(rounding_mode, sign); + } + + // Check for value that will become denormal + if (exp < -14) + { + // Include the implicit 1 from the FP64 mantissa + h_exp = 0; + d_mant |= (uint64_t)1 << (CL_DBL_MANT_DIG - 1); + + // Mantissa shift amount depends on exponent + lsb_pos = (uint32_t)(-exp + (CL_DBL_MANT_DIG - 25)); + } + + // Generate FP16 mantissa by shifting FP64 mantissa + uint16_t h_mant = (uint16_t)(d_mant >> lsb_pos); + + // Check whether we need to round + uint64_t halfway = (uint64_t)1 << (lsb_pos - 1); + uint64_t mask = (halfway << 1) - 1; + switch (rounding_mode) + { + case CL_HALF_RTE: + if ((d_mant & mask) > halfway) + { + // More than halfway -> round up + h_mant += 1; + } + else if ((d_mant & mask) == halfway) + { + // Exactly halfway -> round to nearest even + if (h_mant & 0x1) + h_mant += 1; + } + break; + case CL_HALF_RTZ: + // Mantissa has already been truncated -> do nothing + break; + case CL_HALF_RTP: + if ((d_mant & mask) && !sign) + { + // Round positive numbers up + h_mant += 1; + } + break; + case CL_HALF_RTN: + if ((d_mant & mask) && sign) + { + // Round negative numbers down + h_mant += 1; + } + break; + } + + // Check for mantissa overflow + if (h_mant & 0x400) + { + h_exp += 1; + h_mant = 0; + } + + return (sign << 15) | (h_exp << 10) | h_mant; +} + + +/** + * Convert a cl_half to a cl_float. + */ +static inline cl_float cl_half_to_float(cl_half h) +{ + // Type-punning to get direct access to underlying bits + union + { + cl_float f; + uint32_t i; + } f32; + + // Extract sign bit + uint16_t sign = h >> 15; + + // Extract FP16 exponent and mantissa + uint16_t h_exp = (h >> (CL_HALF_MANT_DIG - 1)) & 0x1F; + uint16_t h_mant = h & 0x3FF; + + // Remove FP16 exponent bias + int32_t exp = h_exp - CL_HALF_MAX_EXP + 1; + + // Add FP32 exponent bias + uint32_t f_exp = exp + CL_FLT_MAX_EXP - 1; + + // Check for NaN / infinity + if (h_exp == 0x1F) + { + if (h_mant) + { + // NaN -> propagate mantissa and silence it + uint32_t f_mant = h_mant << (CL_FLT_MANT_DIG - CL_HALF_MANT_DIG); + f_mant |= 0x400000; + f32.i = (sign << 31) | 0x7F800000 | f_mant; + return f32.f; + } + else + { + // Infinity -> zero mantissa + f32.i = (sign << 31) | 0x7F800000; + return f32.f; + } + } + + // Check for zero / denormal + if (h_exp == 0) + { + if (h_mant == 0) + { + // Zero -> zero exponent + f_exp = 0; + } + else + { + // Denormal -> normalize it + // - Shift mantissa to make most-significant 1 implicit + // - Adjust exponent accordingly + uint32_t shift = 0; + while ((h_mant & 0x400) == 0) + { + h_mant <<= 1; + shift++; + } + h_mant &= 0x3FF; + f_exp -= shift - 1; + } + } + + f32.i = (sign << 31) | (f_exp << 23) | (h_mant << 13); + return f32.f; +} + + +#undef CL_HALF_EXP_MASK +#undef CL_HALF_MAX_FINITE_MAG + + +#ifdef __cplusplus +} +#endif + + +#endif /* OPENCL_CL_HALF_H */ diff --git a/ktx/external/basisu/OpenCL/CL/cl_icd.h b/ktx/external/basisu/OpenCL/CL/cl_icd.h new file mode 100644 index 0000000..d5ac1de --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_icd.h @@ -0,0 +1,1294 @@ +/******************************************************************************* + * Copyright (c) 2019-2020 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#ifndef OPENCL_CL_ICD_H +#define OPENCL_CL_ICD_H + +#include +#include +#include +#include + +#if defined(_WIN32) +#include +#include +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This file contains pointer type definitions for each of the CL API calls as + * well as a type definition for the dispatch table used by the Khronos ICD + * loader (see cl_khr_icd extension specification for background). + */ + +/* API function pointer definitions */ + +// Platform APIs +typedef cl_int(CL_API_CALL *cl_api_clGetPlatformIDs)( + cl_uint num_entries, cl_platform_id *platforms, + cl_uint *num_platforms) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetPlatformInfo)( + cl_platform_id platform, cl_platform_info param_name, + size_t param_value_size, void *param_value, + size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +// Device APIs +typedef cl_int(CL_API_CALL *cl_api_clGetDeviceIDs)( + cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, + cl_device_id *devices, cl_uint *num_devices) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetDeviceInfo)( + cl_device_id device, cl_device_info param_name, size_t param_value_size, + void *param_value, size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +typedef cl_int(CL_API_CALL *cl_api_clCreateSubDevices)( + cl_device_id in_device, + const cl_device_partition_property *partition_properties, + cl_uint num_entries, cl_device_id *out_devices, cl_uint *num_devices); + +typedef cl_int(CL_API_CALL *cl_api_clRetainDevice)( + cl_device_id device) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int(CL_API_CALL *cl_api_clReleaseDevice)( + cl_device_id device) CL_API_SUFFIX__VERSION_1_2; + +#else + +typedef void *cl_api_clCreateSubDevices; +typedef void *cl_api_clRetainDevice; +typedef void *cl_api_clReleaseDevice; + +#endif + +// Context APIs +typedef cl_context(CL_API_CALL *cl_api_clCreateContext)( + const cl_context_properties *properties, cl_uint num_devices, + const cl_device_id *devices, + void(CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *), + void *user_data, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_context(CL_API_CALL *cl_api_clCreateContextFromType)( + const cl_context_properties *properties, cl_device_type device_type, + void(CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *), + void *user_data, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clRetainContext)( + cl_context context) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clReleaseContext)( + cl_context context) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetContextInfo)( + cl_context context, cl_context_info param_name, size_t param_value_size, + void *param_value, size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +// Command Queue APIs +typedef cl_command_queue(CL_API_CALL *cl_api_clCreateCommandQueue)( + cl_context context, cl_device_id device, + cl_command_queue_properties properties, + cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_2_0 + +typedef +cl_command_queue(CL_API_CALL *cl_api_clCreateCommandQueueWithProperties)( + cl_context /* context */, cl_device_id /* device */, + const cl_queue_properties * /* properties */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_2_0; + +#else + +typedef void *cl_api_clCreateCommandQueueWithProperties; + +#endif + +typedef cl_int(CL_API_CALL *cl_api_clRetainCommandQueue)( + cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clReleaseCommandQueue)( + cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetCommandQueueInfo)( + cl_command_queue command_queue, cl_command_queue_info param_name, + size_t param_value_size, void *param_value, + size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +// Memory Object APIs +typedef cl_mem(CL_API_CALL *cl_api_clCreateBuffer)( + cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, + cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +typedef cl_mem(CL_API_CALL *cl_api_clCreateImage)( + cl_context context, cl_mem_flags flags, const cl_image_format *image_format, + const cl_image_desc *image_desc, void *host_ptr, + cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +#else + +typedef void *cl_api_clCreateImage; + +#endif + +#ifdef CL_VERSION_3_0 + +typedef cl_mem(CL_API_CALL *cl_api_clCreateBufferWithProperties)( + cl_context context, const cl_mem_properties *properties, cl_mem_flags flags, + size_t size, void *host_ptr, + cl_int *errcode_ret) CL_API_SUFFIX__VERSION_3_0; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateImageWithProperties)( + cl_context context, const cl_mem_properties *properties, cl_mem_flags flags, + const cl_image_format *image_format, const cl_image_desc *image_desc, + void *host_ptr, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_3_0; + +typedef cl_int(CL_API_CALL* cl_api_clSetContextDestructorCallback)( + cl_context context, + void(CL_CALLBACK* pfn_notify)(cl_context context, void* user_data), + void* user_data) CL_API_SUFFIX__VERSION_3_0; + +#else + +typedef void *cl_api_clCreateBufferWithProperties; +typedef void *cl_api_clCreateImageWithProperties; +typedef void *cl_api_clSetContextDestructorCallback; + +#endif + +typedef cl_int(CL_API_CALL *cl_api_clRetainMemObject)( + cl_mem memobj) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clReleaseMemObject)( + cl_mem memobj) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetSupportedImageFormats)( + cl_context context, cl_mem_flags flags, cl_mem_object_type image_type, + cl_uint num_entries, cl_image_format *image_formats, + cl_uint *num_image_formats) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetMemObjectInfo)( + cl_mem memobj, cl_mem_info param_name, size_t param_value_size, + void *param_value, size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetImageInfo)( + cl_mem image, cl_image_info param_name, size_t param_value_size, + void *param_value, size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_2_0 + +typedef cl_mem(CL_API_CALL *cl_api_clCreatePipe)( + cl_context /* context */, cl_mem_flags /* flags */, + cl_uint /* pipe_packet_size */, cl_uint /* pipe_max_packets */, + const cl_pipe_properties * /* properties */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_2_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetPipeInfo)( + cl_mem /* pipe */, cl_pipe_info /* param_name */, + size_t /* param_value_size */, void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_2_0; + +typedef void *(CL_API_CALL *cl_api_clSVMAlloc)( + cl_context /* context */, cl_svm_mem_flags /* flags */, size_t /* size */, + unsigned int /* alignment */)CL_API_SUFFIX__VERSION_2_0; + +typedef void(CL_API_CALL *cl_api_clSVMFree)( + cl_context /* context */, + void * /* svm_pointer */) CL_API_SUFFIX__VERSION_2_0; + +#else + +typedef void *cl_api_clCreatePipe; +typedef void *cl_api_clGetPipeInfo; +typedef void *cl_api_clSVMAlloc; +typedef void *cl_api_clSVMFree; + +#endif + +// Sampler APIs +typedef cl_sampler(CL_API_CALL *cl_api_clCreateSampler)( + cl_context context, cl_bool normalized_coords, + cl_addressing_mode addressing_mode, cl_filter_mode filter_mode, + cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clRetainSampler)( + cl_sampler sampler) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clReleaseSampler)( + cl_sampler sampler) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetSamplerInfo)( + cl_sampler sampler, cl_sampler_info param_name, size_t param_value_size, + void *param_value, size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_2_0 + +typedef +cl_sampler(CL_API_CALL *cl_api_clCreateSamplerWithProperties)( + cl_context /* context */, + const cl_sampler_properties * /* sampler_properties */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_2_0; + +#else + +typedef void *cl_api_clCreateSamplerWithProperties; + +#endif + +// Program Object APIs +typedef cl_program(CL_API_CALL *cl_api_clCreateProgramWithSource)( + cl_context context, cl_uint count, const char **strings, + const size_t *lengths, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_program(CL_API_CALL *cl_api_clCreateProgramWithBinary)( + cl_context context, cl_uint num_devices, const cl_device_id *device_list, + const size_t *lengths, const unsigned char **binaries, + cl_int *binary_status, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +typedef +cl_program(CL_API_CALL *cl_api_clCreateProgramWithBuiltInKernels)( + cl_context context, cl_uint num_devices, const cl_device_id *device_list, + const char *kernel_names, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +#else + +typedef void *cl_api_clCreateProgramWithBuiltInKernels; + +#endif + +typedef cl_int(CL_API_CALL *cl_api_clRetainProgram)( + cl_program program) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clReleaseProgram)( + cl_program program) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clBuildProgram)( + cl_program program, cl_uint num_devices, const cl_device_id *device_list, + const char *options, + void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data), + void *user_data) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +typedef cl_int(CL_API_CALL *cl_api_clCompileProgram)( + cl_program program, cl_uint num_devices, const cl_device_id *device_list, + const char *options, cl_uint num_input_headers, + const cl_program *input_headers, const char **header_include_names, + void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data), + void *user_data) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_program(CL_API_CALL *cl_api_clLinkProgram)( + cl_context context, cl_uint num_devices, const cl_device_id *device_list, + const char *options, cl_uint num_input_programs, + const cl_program *input_programs, + void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data), + void *user_data, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +#else + +typedef void *cl_api_clCompileProgram; +typedef void *cl_api_clLinkProgram; + +#endif + +#ifdef CL_VERSION_2_2 + +typedef +cl_int(CL_API_CALL *cl_api_clSetProgramSpecializationConstant)( + cl_program program, cl_uint spec_id, size_t spec_size, + const void *spec_value) CL_API_SUFFIX__VERSION_2_2; + +typedef cl_int(CL_API_CALL *cl_api_clSetProgramReleaseCallback)( + cl_program program, + void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data), + void *user_data) CL_API_SUFFIX__VERSION_2_2; + +#else + +typedef void *cl_api_clSetProgramSpecializationConstant; +typedef void *cl_api_clSetProgramReleaseCallback; + +#endif + +#ifdef CL_VERSION_1_2 + +typedef cl_int(CL_API_CALL *cl_api_clUnloadPlatformCompiler)( + cl_platform_id platform) CL_API_SUFFIX__VERSION_1_2; + +#else + +typedef void *cl_api_clUnloadPlatformCompiler; + +#endif + +typedef cl_int(CL_API_CALL *cl_api_clGetProgramInfo)( + cl_program program, cl_program_info param_name, size_t param_value_size, + void *param_value, size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetProgramBuildInfo)( + cl_program program, cl_device_id device, cl_program_build_info param_name, + size_t param_value_size, void *param_value, + size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +// Kernel Object APIs +typedef cl_kernel(CL_API_CALL *cl_api_clCreateKernel)( + cl_program program, const char *kernel_name, + cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clCreateKernelsInProgram)( + cl_program program, cl_uint num_kernels, cl_kernel *kernels, + cl_uint *num_kernels_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clRetainKernel)( + cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clReleaseKernel)( + cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clSetKernelArg)( + cl_kernel kernel, cl_uint arg_index, size_t arg_size, + const void *arg_value) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetKernelInfo)( + cl_kernel kernel, cl_kernel_info param_name, size_t param_value_size, + void *param_value, size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +typedef cl_int(CL_API_CALL *cl_api_clGetKernelArgInfo)( + cl_kernel kernel, cl_uint arg_indx, cl_kernel_arg_info param_name, + size_t param_value_size, void *param_value, + size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_2; + +#else + +typedef void *cl_api_clGetKernelArgInfo; + +#endif + +typedef cl_int(CL_API_CALL *cl_api_clGetKernelWorkGroupInfo)( + cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info param_name, + size_t param_value_size, void *param_value, + size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_2_0 + +typedef cl_int(CL_API_CALL *cl_api_clSetKernelArgSVMPointer)( + cl_kernel /* kernel */, cl_uint /* arg_index */, + const void * /* arg_value */) CL_API_SUFFIX__VERSION_2_0; + +typedef cl_int(CL_API_CALL *cl_api_clSetKernelExecInfo)( + cl_kernel /* kernel */, cl_kernel_exec_info /* param_name */, + size_t /* param_value_size */, + const void * /* param_value */) CL_API_SUFFIX__VERSION_2_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetKernelSubGroupInfoKHR)( + cl_kernel /* in_kernel */, cl_device_id /*in_device*/, + cl_kernel_sub_group_info /* param_name */, size_t /*input_value_size*/, + const void * /*input_value*/, size_t /*param_value_size*/, + void * /*param_value*/, + size_t * /*param_value_size_ret*/) CL_API_SUFFIX__VERSION_2_0; + +#else + +typedef void *cl_api_clSetKernelArgSVMPointer; +typedef void *cl_api_clSetKernelExecInfo; +typedef void *cl_api_clGetKernelSubGroupInfoKHR; + +#endif + +// Event Object APIs +typedef cl_int(CL_API_CALL *cl_api_clWaitForEvents)( + cl_uint num_events, const cl_event *event_list) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetEventInfo)( + cl_event event, cl_event_info param_name, size_t param_value_size, + void *param_value, size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clRetainEvent)(cl_event event) + CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clReleaseEvent)(cl_event event) + CL_API_SUFFIX__VERSION_1_0; + +// Profiling APIs +typedef cl_int(CL_API_CALL *cl_api_clGetEventProfilingInfo)( + cl_event event, cl_profiling_info param_name, size_t param_value_size, + void *param_value, size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +// Flush and Finish APIs +typedef cl_int(CL_API_CALL *cl_api_clFlush)( + cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clFinish)( + cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0; + +// Enqueued Commands APIs +typedef cl_int(CL_API_CALL *cl_api_clEnqueueReadBuffer)( + cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, + size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_1 + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueReadBufferRect)( + cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, + const size_t *buffer_origin, const size_t *host_origin, + const size_t *region, size_t buffer_row_pitch, size_t buffer_slice_pitch, + size_t host_row_pitch, size_t host_slice_pitch, void *ptr, + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_1; + +#else + +typedef void *cl_api_clEnqueueReadBufferRect; + +#endif + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueWriteBuffer)( + cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, + size_t offset, size_t cb, const void *ptr, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_1 + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueWriteBufferRect)( + cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, + const size_t *buffer_origin, const size_t *host_origin, + const size_t *region, size_t buffer_row_pitch, size_t buffer_slice_pitch, + size_t host_row_pitch, size_t host_slice_pitch, const void *ptr, + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_1; + +#else + +typedef void *cl_api_clEnqueueWriteBufferRect; + +#endif + +#ifdef CL_VERSION_1_2 + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueFillBuffer)( + cl_command_queue command_queue, cl_mem buffer, const void *pattern, + size_t pattern_size, size_t offset, size_t cb, + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_2; + +#else + +typedef void *cl_api_clEnqueueFillBuffer; + +#endif + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueCopyBuffer)( + cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, + size_t src_offset, size_t dst_offset, size_t cb, + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_1 + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueCopyBufferRect)( + cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, + const size_t *src_origin, const size_t *dst_origin, const size_t *region, + size_t src_row_pitch, size_t src_slice_pitch, size_t dst_row_pitch, + size_t dst_slice_pitch, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_1; + +#else + +typedef void *cl_api_clEnqueueCopyBufferRect; + +#endif + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueReadImage)( + cl_command_queue command_queue, cl_mem image, cl_bool blocking_read, + const size_t *origin, const size_t *region, size_t row_pitch, + size_t slice_pitch, void *ptr, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueWriteImage)( + cl_command_queue command_queue, cl_mem image, cl_bool blocking_write, + const size_t *origin, const size_t *region, size_t input_row_pitch, + size_t input_slice_pitch, const void *ptr, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueFillImage)( + cl_command_queue command_queue, cl_mem image, const void *fill_color, + const size_t origin[3], const size_t region[3], + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_2; + +#else + +typedef void *cl_api_clEnqueueFillImage; + +#endif + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueCopyImage)( + cl_command_queue command_queue, cl_mem src_image, cl_mem dst_image, + const size_t *src_origin, const size_t *dst_origin, const size_t *region, + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueCopyImageToBuffer)( + cl_command_queue command_queue, cl_mem src_image, cl_mem dst_buffer, + const size_t *src_origin, const size_t *region, size_t dst_offset, + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueCopyBufferToImage)( + cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_image, + size_t src_offset, const size_t *dst_origin, const size_t *region, + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +typedef void *(CL_API_CALL *cl_api_clEnqueueMapBuffer)( + cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_map, + cl_map_flags map_flags, size_t offset, size_t cb, + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event, cl_int *errcode_ret)CL_API_SUFFIX__VERSION_1_0; + +typedef void *(CL_API_CALL *cl_api_clEnqueueMapImage)( + cl_command_queue command_queue, cl_mem image, cl_bool blocking_map, + cl_map_flags map_flags, const size_t *origin, const size_t *region, + size_t *image_row_pitch, size_t *image_slice_pitch, + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event, cl_int *errcode_ret)CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueUnmapMemObject)( + cl_command_queue command_queue, cl_mem memobj, void *mapped_ptr, + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueMigrateMemObjects)( + cl_command_queue command_queue, cl_uint num_mem_objects, + const cl_mem *mem_objects, cl_mem_migration_flags flags, + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_2; + +#else + +typedef void *cl_api_clEnqueueMigrateMemObjects; + +#endif + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueNDRangeKernel)( + cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim, + const size_t *global_work_offset, const size_t *global_work_size, + const size_t *local_work_size, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueTask)( + cl_command_queue command_queue, cl_kernel kernel, + cl_uint num_events_in_wait_list, const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueNativeKernel)( + cl_command_queue command_queue, void(CL_CALLBACK *user_func)(void *), + void *args, size_t cb_args, cl_uint num_mem_objects, const cl_mem *mem_list, + const void **args_mem_loc, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_VERSION_1_2 + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueMarkerWithWaitList)( + cl_command_queue command_queue, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueBarrierWithWaitList)( + cl_command_queue command_queue, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_2; + +typedef void *( + CL_API_CALL *cl_api_clGetExtensionFunctionAddressForPlatform)( + cl_platform_id platform, + const char *function_name)CL_API_SUFFIX__VERSION_1_2; + +#else + +typedef void *cl_api_clEnqueueMarkerWithWaitList; +typedef void *cl_api_clEnqueueBarrierWithWaitList; +typedef void *cl_api_clGetExtensionFunctionAddressForPlatform; + +#endif + +// Shared Virtual Memory APIs + +#ifdef CL_VERSION_2_0 + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueSVMFree)( + cl_command_queue /* command_queue */, cl_uint /* num_svm_pointers */, + void ** /* svm_pointers */, + void(CL_CALLBACK *pfn_free_func)(cl_command_queue /* queue */, + cl_uint /* num_svm_pointers */, + void ** /* svm_pointers[] */, + void * /* user_data */), + void * /* user_data */, cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueSVMMemcpy)( + cl_command_queue /* command_queue */, cl_bool /* blocking_copy */, + void * /* dst_ptr */, const void * /* src_ptr */, size_t /* size */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueSVMMemFill)( + cl_command_queue /* command_queue */, void * /* svm_ptr */, + const void * /* pattern */, size_t /* pattern_size */, size_t /* size */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueSVMMap)( + cl_command_queue /* command_queue */, cl_bool /* blocking_map */, + cl_map_flags /* map_flags */, void * /* svm_ptr */, size_t /* size */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueSVMUnmap)( + cl_command_queue /* command_queue */, void * /* svm_ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0; + +#else + +typedef void *cl_api_clEnqueueSVMFree; +typedef void *cl_api_clEnqueueSVMMemcpy; +typedef void *cl_api_clEnqueueSVMMemFill; +typedef void *cl_api_clEnqueueSVMMap; +typedef void *cl_api_clEnqueueSVMUnmap; + +#endif + +// Deprecated APIs +typedef cl_int(CL_API_CALL *cl_api_clSetCommandQueueProperty)( + cl_command_queue command_queue, cl_command_queue_properties properties, + cl_bool enable, cl_command_queue_properties *old_properties) + CL_API_SUFFIX__VERSION_1_0_DEPRECATED; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateImage2D)( + cl_context context, cl_mem_flags flags, const cl_image_format *image_format, + size_t image_width, size_t image_height, size_t image_row_pitch, + void *host_ptr, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateImage3D)( + cl_context context, cl_mem_flags flags, const cl_image_format *image_format, + size_t image_width, size_t image_height, size_t image_depth, + size_t image_row_pitch, size_t image_slice_pitch, void *host_ptr, + cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef cl_int(CL_API_CALL *cl_api_clUnloadCompiler)(void) + CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueMarker)( + cl_command_queue command_queue, + cl_event *event) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueWaitForEvents)( + cl_command_queue command_queue, cl_uint num_events, + const cl_event *event_list) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueBarrier)( + cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +typedef void *(CL_API_CALL *cl_api_clGetExtensionFunctionAddress)( + const char *function_name)CL_API_SUFFIX__VERSION_1_1_DEPRECATED; + +// GL and other APIs +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromGLBuffer)( + cl_context context, cl_mem_flags flags, cl_GLuint bufobj, + int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromGLTexture)( + cl_context context, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, + cl_GLuint texture, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromGLTexture2D)( + cl_context context, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, + cl_GLuint texture, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromGLTexture3D)( + cl_context context, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, + cl_GLuint texture, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromGLRenderbuffer)( + cl_context context, cl_mem_flags flags, cl_GLuint renderbuffer, + cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetGLObjectInfo)( + cl_mem memobj, cl_gl_object_type *gl_object_type, + cl_GLuint *gl_object_name) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clGetGLTextureInfo)( + cl_mem memobj, cl_gl_texture_info param_name, size_t param_value_size, + void *param_value, size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueAcquireGLObjects)( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueReleaseGLObjects)( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +/* cl_khr_gl_sharing */ +typedef cl_int(CL_API_CALL *cl_api_clGetGLContextInfoKHR)( + const cl_context_properties *properties, cl_gl_context_info param_name, + size_t param_value_size, void *param_value, size_t *param_value_size_ret); + +/* cl_khr_gl_event */ +typedef cl_event(CL_API_CALL *cl_api_clCreateEventFromGLsyncKHR)( + cl_context context, cl_GLsync sync, cl_int *errcode_ret); + +#if defined(_WIN32) + +/* cl_khr_d3d10_sharing */ + +typedef cl_int(CL_API_CALL *cl_api_clGetDeviceIDsFromD3D10KHR)( + cl_platform_id platform, cl_d3d10_device_source_khr d3d_device_source, + void *d3d_object, cl_d3d10_device_set_khr d3d_device_set, + cl_uint num_entries, cl_device_id *devices, + cl_uint *num_devices) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromD3D10BufferKHR)( + cl_context context, cl_mem_flags flags, ID3D10Buffer *resource, + cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromD3D10Texture2DKHR)( + cl_context context, cl_mem_flags flags, ID3D10Texture2D *resource, + UINT subresource, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromD3D10Texture3DKHR)( + cl_context context, cl_mem_flags flags, ID3D10Texture3D *resource, + UINT subresource, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef +cl_int(CL_API_CALL *cl_api_clEnqueueAcquireD3D10ObjectsKHR)( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +typedef +cl_int(CL_API_CALL *cl_api_clEnqueueReleaseD3D10ObjectsKHR)( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL clGetDeviceIDsFromD3D10KHR( + cl_platform_id platform, cl_d3d10_device_source_khr d3d_device_source, + void *d3d_object, cl_d3d10_device_set_khr d3d_device_set, + cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices); + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateFromD3D10BufferKHR(cl_context context, cl_mem_flags flags, + ID3D10Buffer *resource, cl_int *errcode_ret); + +extern CL_API_ENTRY cl_mem CL_API_CALL clCreateFromD3D10Texture2DKHR( + cl_context context, cl_mem_flags flags, ID3D10Texture2D *resource, + UINT subresource, cl_int *errcode_ret); + +extern CL_API_ENTRY cl_mem CL_API_CALL clCreateFromD3D10Texture3DKHR( + cl_context context, cl_mem_flags flags, ID3D10Texture3D *resource, + UINT subresource, cl_int *errcode_ret); + +extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueAcquireD3D10ObjectsKHR( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, cl_event *event); + +extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueReleaseD3D10ObjectsKHR( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, cl_event *event); + +/* cl_khr_d3d11_sharing */ +typedef cl_int(CL_API_CALL *cl_api_clGetDeviceIDsFromD3D11KHR)( + cl_platform_id platform, cl_d3d11_device_source_khr d3d_device_source, + void *d3d_object, cl_d3d11_device_set_khr d3d_device_set, + cl_uint num_entries, cl_device_id *devices, + cl_uint *num_devices) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromD3D11BufferKHR)( + cl_context context, cl_mem_flags flags, ID3D11Buffer *resource, + cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromD3D11Texture2DKHR)( + cl_context context, cl_mem_flags flags, ID3D11Texture2D *resource, + UINT subresource, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromD3D11Texture3DKHR)( + cl_context context, cl_mem_flags flags, ID3D11Texture3D *resource, + UINT subresource, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef +cl_int(CL_API_CALL *cl_api_clEnqueueAcquireD3D11ObjectsKHR)( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_2; + +typedef +cl_int(CL_API_CALL *cl_api_clEnqueueReleaseD3D11ObjectsKHR)( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_2; + +/* cl_khr_dx9_media_sharing */ +typedef +cl_int(CL_API_CALL *cl_api_clGetDeviceIDsFromDX9MediaAdapterKHR)( + cl_platform_id platform, cl_uint num_media_adapters, + cl_dx9_media_adapter_type_khr *media_adapters_type, void *media_adapters, + cl_dx9_media_adapter_set_khr media_adapter_set, cl_uint num_entries, + cl_device_id *devices, cl_uint *num_devices) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromDX9MediaSurfaceKHR)( + cl_context context, cl_mem_flags flags, + cl_dx9_media_adapter_type_khr adapter_type, void *surface_info, + cl_uint plane, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef +cl_int(CL_API_CALL *cl_api_clEnqueueAcquireDX9MediaSurfacesKHR)( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_2; + +typedef +cl_int(CL_API_CALL *cl_api_clEnqueueReleaseDX9MediaSurfacesKHR)( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_1_2; + +/* cl_khr_d3d11_sharing */ +extern CL_API_ENTRY cl_int CL_API_CALL clGetDeviceIDsFromD3D11KHR( + cl_platform_id platform, cl_d3d11_device_source_khr d3d_device_source, + void *d3d_object, cl_d3d11_device_set_khr d3d_device_set, + cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices); + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateFromD3D11BufferKHR(cl_context context, cl_mem_flags flags, + ID3D11Buffer *resource, cl_int *errcode_ret); + +extern CL_API_ENTRY cl_mem CL_API_CALL clCreateFromD3D11Texture2DKHR( + cl_context context, cl_mem_flags flags, ID3D11Texture2D *resource, + UINT subresource, cl_int *errcode_ret); + +extern CL_API_ENTRY cl_mem CL_API_CALL clCreateFromD3D11Texture3DKHR( + cl_context context, cl_mem_flags flags, ID3D11Texture3D *resource, + UINT subresource, cl_int *errcode_ret); + +extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueAcquireD3D11ObjectsKHR( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, cl_event *event); + +extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueReleaseD3D11ObjectsKHR( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, cl_event *event); + +/* cl_khr_dx9_media_sharing */ +extern CL_API_ENTRY cl_int CL_API_CALL clGetDeviceIDsFromDX9MediaAdapterKHR( + cl_platform_id platform, cl_uint num_media_adapters, + cl_dx9_media_adapter_type_khr *media_adapter_type, void *media_adapters, + cl_dx9_media_adapter_set_khr media_adapter_set, cl_uint num_entries, + cl_device_id *devices, cl_uint *num_devices); + +extern CL_API_ENTRY cl_mem CL_API_CALL clCreateFromDX9MediaSurfaceKHR( + cl_context context, cl_mem_flags flags, + cl_dx9_media_adapter_type_khr adapter_type, void *surface_info, + cl_uint plane, cl_int *errcode_ret); + +extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueAcquireDX9MediaSurfacesKHR( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, cl_event *event); + +extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueReleaseDX9MediaSurfacesKHR( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, cl_event *event); + +#else + +/* cl_khr_d3d10_sharing */ +typedef void *cl_api_clGetDeviceIDsFromD3D10KHR; +typedef void *cl_api_clCreateFromD3D10BufferKHR; +typedef void *cl_api_clCreateFromD3D10Texture2DKHR; +typedef void *cl_api_clCreateFromD3D10Texture3DKHR; +typedef void *cl_api_clEnqueueAcquireD3D10ObjectsKHR; +typedef void *cl_api_clEnqueueReleaseD3D10ObjectsKHR; + +/* cl_khr_d3d11_sharing */ +typedef void *cl_api_clGetDeviceIDsFromD3D11KHR; +typedef void *cl_api_clCreateFromD3D11BufferKHR; +typedef void *cl_api_clCreateFromD3D11Texture2DKHR; +typedef void *cl_api_clCreateFromD3D11Texture3DKHR; +typedef void *cl_api_clEnqueueAcquireD3D11ObjectsKHR; +typedef void *cl_api_clEnqueueReleaseD3D11ObjectsKHR; + +/* cl_khr_dx9_media_sharing */ +typedef void *cl_api_clCreateFromDX9MediaSurfaceKHR; +typedef void *cl_api_clEnqueueAcquireDX9MediaSurfacesKHR; +typedef void *cl_api_clEnqueueReleaseDX9MediaSurfacesKHR; +typedef void *cl_api_clGetDeviceIDsFromDX9MediaAdapterKHR; + +#endif + +/* OpenCL 1.1 */ + +#ifdef CL_VERSION_1_1 + +typedef cl_int(CL_API_CALL *cl_api_clSetEventCallback)( + cl_event /* event */, cl_int /* command_exec_callback_type */, + void(CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *), + void * /* user_data */) CL_API_SUFFIX__VERSION_1_1; + +typedef cl_mem(CL_API_CALL *cl_api_clCreateSubBuffer)( + cl_mem /* buffer */, cl_mem_flags /* flags */, + cl_buffer_create_type /* buffer_create_type */, + const void * /* buffer_create_info */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1; + +typedef +cl_int(CL_API_CALL *cl_api_clSetMemObjectDestructorCallback)( + cl_mem /* memobj */, + void(CL_CALLBACK * /*pfn_notify*/)(cl_mem /* memobj */, + void * /*user_data*/), + void * /*user_data */) CL_API_SUFFIX__VERSION_1_1; + +typedef cl_event(CL_API_CALL *cl_api_clCreateUserEvent)( + cl_context /* context */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1; + +typedef cl_int(CL_API_CALL *cl_api_clSetUserEventStatus)( + cl_event /* event */, + cl_int /* execution_status */) CL_API_SUFFIX__VERSION_1_1; + +#else + +typedef void *cl_api_clSetEventCallback; +typedef void *cl_api_clCreateSubBuffer; +typedef void *cl_api_clSetMemObjectDestructorCallback; +typedef void *cl_api_clCreateUserEvent; +typedef void *cl_api_clSetUserEventStatus; + +#endif + +typedef cl_int(CL_API_CALL *cl_api_clCreateSubDevicesEXT)( + cl_device_id in_device, + const cl_device_partition_property_ext *partition_properties, + cl_uint num_entries, cl_device_id *out_devices, cl_uint *num_devices); + +typedef cl_int(CL_API_CALL *cl_api_clRetainDeviceEXT)( + cl_device_id device) CL_API_SUFFIX__VERSION_1_0; + +typedef cl_int(CL_API_CALL *cl_api_clReleaseDeviceEXT)( + cl_device_id device) CL_API_SUFFIX__VERSION_1_0; + +/* cl_khr_egl_image */ +typedef cl_mem(CL_API_CALL *cl_api_clCreateFromEGLImageKHR)( + cl_context context, CLeglDisplayKHR display, CLeglImageKHR image, + cl_mem_flags flags, const cl_egl_image_properties_khr *properties, + cl_int *errcode_ret); + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueAcquireEGLObjectsKHR)( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, cl_event *event); + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueReleaseEGLObjectsKHR)( + cl_command_queue command_queue, cl_uint num_objects, + const cl_mem *mem_objects, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, cl_event *event); + +/* cl_khr_egl_event */ +typedef cl_event(CL_API_CALL *cl_api_clCreateEventFromEGLSyncKHR)( + cl_context context, CLeglSyncKHR sync, CLeglDisplayKHR display, + cl_int *errcode_ret); + +#ifdef CL_VERSION_2_1 + +typedef cl_int(CL_API_CALL *cl_api_clSetDefaultDeviceCommandQueue)( + cl_context context, cl_device_id device, + cl_command_queue command_queue) CL_API_SUFFIX__VERSION_2_1; + +typedef cl_program(CL_API_CALL *cl_api_clCreateProgramWithIL)( + cl_context context, const void *il, size_t length, + cl_int *errcode_ret) CL_API_SUFFIX__VERSION_2_1; + +typedef cl_int(CL_API_CALL *cl_api_clGetKernelSubGroupInfo)( + cl_kernel kernel, cl_device_id device, cl_kernel_sub_group_info param_name, + size_t input_value_size, const void *input_value, size_t param_value_size, + void *param_value, size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_2_1; + +typedef cl_kernel(CL_API_CALL *cl_api_clCloneKernel)( + cl_kernel source_kernel, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_2_1; + +typedef cl_int(CL_API_CALL *cl_api_clEnqueueSVMMigrateMem)( + cl_command_queue command_queue, cl_uint num_svm_pointers, + const void **svm_pointers, const size_t *sizes, + cl_mem_migration_flags flags, cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event) CL_API_SUFFIX__VERSION_2_1; + +typedef cl_int(CL_API_CALL *cl_api_clGetDeviceAndHostTimer)( + cl_device_id device, cl_ulong *device_timestamp, + cl_ulong *host_timestamp) CL_API_SUFFIX__VERSION_2_1; + +typedef cl_int(CL_API_CALL *cl_api_clGetHostTimer)( + cl_device_id device, cl_ulong *host_timestamp) CL_API_SUFFIX__VERSION_2_1; + +#else + +typedef void *cl_api_clSetDefaultDeviceCommandQueue; +typedef void *cl_api_clCreateProgramWithIL; +typedef void *cl_api_clGetKernelSubGroupInfo; +typedef void *cl_api_clCloneKernel; +typedef void *cl_api_clEnqueueSVMMigrateMem; +typedef void *cl_api_clGetDeviceAndHostTimer; +typedef void *cl_api_clGetHostTimer; + +#endif + +/* Vendor dispatch table struture */ + +typedef struct _cl_icd_dispatch { + /* OpenCL 1.0 */ + cl_api_clGetPlatformIDs clGetPlatformIDs; + cl_api_clGetPlatformInfo clGetPlatformInfo; + cl_api_clGetDeviceIDs clGetDeviceIDs; + cl_api_clGetDeviceInfo clGetDeviceInfo; + cl_api_clCreateContext clCreateContext; + cl_api_clCreateContextFromType clCreateContextFromType; + cl_api_clRetainContext clRetainContext; + cl_api_clReleaseContext clReleaseContext; + cl_api_clGetContextInfo clGetContextInfo; + cl_api_clCreateCommandQueue clCreateCommandQueue; + cl_api_clRetainCommandQueue clRetainCommandQueue; + cl_api_clReleaseCommandQueue clReleaseCommandQueue; + cl_api_clGetCommandQueueInfo clGetCommandQueueInfo; + cl_api_clSetCommandQueueProperty clSetCommandQueueProperty; + cl_api_clCreateBuffer clCreateBuffer; + cl_api_clCreateImage2D clCreateImage2D; + cl_api_clCreateImage3D clCreateImage3D; + cl_api_clRetainMemObject clRetainMemObject; + cl_api_clReleaseMemObject clReleaseMemObject; + cl_api_clGetSupportedImageFormats clGetSupportedImageFormats; + cl_api_clGetMemObjectInfo clGetMemObjectInfo; + cl_api_clGetImageInfo clGetImageInfo; + cl_api_clCreateSampler clCreateSampler; + cl_api_clRetainSampler clRetainSampler; + cl_api_clReleaseSampler clReleaseSampler; + cl_api_clGetSamplerInfo clGetSamplerInfo; + cl_api_clCreateProgramWithSource clCreateProgramWithSource; + cl_api_clCreateProgramWithBinary clCreateProgramWithBinary; + cl_api_clRetainProgram clRetainProgram; + cl_api_clReleaseProgram clReleaseProgram; + cl_api_clBuildProgram clBuildProgram; + cl_api_clUnloadCompiler clUnloadCompiler; + cl_api_clGetProgramInfo clGetProgramInfo; + cl_api_clGetProgramBuildInfo clGetProgramBuildInfo; + cl_api_clCreateKernel clCreateKernel; + cl_api_clCreateKernelsInProgram clCreateKernelsInProgram; + cl_api_clRetainKernel clRetainKernel; + cl_api_clReleaseKernel clReleaseKernel; + cl_api_clSetKernelArg clSetKernelArg; + cl_api_clGetKernelInfo clGetKernelInfo; + cl_api_clGetKernelWorkGroupInfo clGetKernelWorkGroupInfo; + cl_api_clWaitForEvents clWaitForEvents; + cl_api_clGetEventInfo clGetEventInfo; + cl_api_clRetainEvent clRetainEvent; + cl_api_clReleaseEvent clReleaseEvent; + cl_api_clGetEventProfilingInfo clGetEventProfilingInfo; + cl_api_clFlush clFlush; + cl_api_clFinish clFinish; + cl_api_clEnqueueReadBuffer clEnqueueReadBuffer; + cl_api_clEnqueueWriteBuffer clEnqueueWriteBuffer; + cl_api_clEnqueueCopyBuffer clEnqueueCopyBuffer; + cl_api_clEnqueueReadImage clEnqueueReadImage; + cl_api_clEnqueueWriteImage clEnqueueWriteImage; + cl_api_clEnqueueCopyImage clEnqueueCopyImage; + cl_api_clEnqueueCopyImageToBuffer clEnqueueCopyImageToBuffer; + cl_api_clEnqueueCopyBufferToImage clEnqueueCopyBufferToImage; + cl_api_clEnqueueMapBuffer clEnqueueMapBuffer; + cl_api_clEnqueueMapImage clEnqueueMapImage; + cl_api_clEnqueueUnmapMemObject clEnqueueUnmapMemObject; + cl_api_clEnqueueNDRangeKernel clEnqueueNDRangeKernel; + cl_api_clEnqueueTask clEnqueueTask; + cl_api_clEnqueueNativeKernel clEnqueueNativeKernel; + cl_api_clEnqueueMarker clEnqueueMarker; + cl_api_clEnqueueWaitForEvents clEnqueueWaitForEvents; + cl_api_clEnqueueBarrier clEnqueueBarrier; + cl_api_clGetExtensionFunctionAddress clGetExtensionFunctionAddress; + cl_api_clCreateFromGLBuffer clCreateFromGLBuffer; + cl_api_clCreateFromGLTexture2D clCreateFromGLTexture2D; + cl_api_clCreateFromGLTexture3D clCreateFromGLTexture3D; + cl_api_clCreateFromGLRenderbuffer clCreateFromGLRenderbuffer; + cl_api_clGetGLObjectInfo clGetGLObjectInfo; + cl_api_clGetGLTextureInfo clGetGLTextureInfo; + cl_api_clEnqueueAcquireGLObjects clEnqueueAcquireGLObjects; + cl_api_clEnqueueReleaseGLObjects clEnqueueReleaseGLObjects; + cl_api_clGetGLContextInfoKHR clGetGLContextInfoKHR; + + /* cl_khr_d3d10_sharing */ + cl_api_clGetDeviceIDsFromD3D10KHR clGetDeviceIDsFromD3D10KHR; + cl_api_clCreateFromD3D10BufferKHR clCreateFromD3D10BufferKHR; + cl_api_clCreateFromD3D10Texture2DKHR clCreateFromD3D10Texture2DKHR; + cl_api_clCreateFromD3D10Texture3DKHR clCreateFromD3D10Texture3DKHR; + cl_api_clEnqueueAcquireD3D10ObjectsKHR clEnqueueAcquireD3D10ObjectsKHR; + cl_api_clEnqueueReleaseD3D10ObjectsKHR clEnqueueReleaseD3D10ObjectsKHR; + + /* OpenCL 1.1 */ + cl_api_clSetEventCallback clSetEventCallback; + cl_api_clCreateSubBuffer clCreateSubBuffer; + cl_api_clSetMemObjectDestructorCallback clSetMemObjectDestructorCallback; + cl_api_clCreateUserEvent clCreateUserEvent; + cl_api_clSetUserEventStatus clSetUserEventStatus; + cl_api_clEnqueueReadBufferRect clEnqueueReadBufferRect; + cl_api_clEnqueueWriteBufferRect clEnqueueWriteBufferRect; + cl_api_clEnqueueCopyBufferRect clEnqueueCopyBufferRect; + + /* cl_ext_device_fission */ + cl_api_clCreateSubDevicesEXT clCreateSubDevicesEXT; + cl_api_clRetainDeviceEXT clRetainDeviceEXT; + cl_api_clReleaseDeviceEXT clReleaseDeviceEXT; + + /* cl_khr_gl_event */ + cl_api_clCreateEventFromGLsyncKHR clCreateEventFromGLsyncKHR; + + /* OpenCL 1.2 */ + cl_api_clCreateSubDevices clCreateSubDevices; + cl_api_clRetainDevice clRetainDevice; + cl_api_clReleaseDevice clReleaseDevice; + cl_api_clCreateImage clCreateImage; + cl_api_clCreateProgramWithBuiltInKernels clCreateProgramWithBuiltInKernels; + cl_api_clCompileProgram clCompileProgram; + cl_api_clLinkProgram clLinkProgram; + cl_api_clUnloadPlatformCompiler clUnloadPlatformCompiler; + cl_api_clGetKernelArgInfo clGetKernelArgInfo; + cl_api_clEnqueueFillBuffer clEnqueueFillBuffer; + cl_api_clEnqueueFillImage clEnqueueFillImage; + cl_api_clEnqueueMigrateMemObjects clEnqueueMigrateMemObjects; + cl_api_clEnqueueMarkerWithWaitList clEnqueueMarkerWithWaitList; + cl_api_clEnqueueBarrierWithWaitList clEnqueueBarrierWithWaitList; + cl_api_clGetExtensionFunctionAddressForPlatform + clGetExtensionFunctionAddressForPlatform; + cl_api_clCreateFromGLTexture clCreateFromGLTexture; + + /* cl_khr_d3d11_sharing */ + cl_api_clGetDeviceIDsFromD3D11KHR clGetDeviceIDsFromD3D11KHR; + cl_api_clCreateFromD3D11BufferKHR clCreateFromD3D11BufferKHR; + cl_api_clCreateFromD3D11Texture2DKHR clCreateFromD3D11Texture2DKHR; + cl_api_clCreateFromD3D11Texture3DKHR clCreateFromD3D11Texture3DKHR; + cl_api_clCreateFromDX9MediaSurfaceKHR clCreateFromDX9MediaSurfaceKHR; + cl_api_clEnqueueAcquireD3D11ObjectsKHR clEnqueueAcquireD3D11ObjectsKHR; + cl_api_clEnqueueReleaseD3D11ObjectsKHR clEnqueueReleaseD3D11ObjectsKHR; + + /* cl_khr_dx9_media_sharing */ + cl_api_clGetDeviceIDsFromDX9MediaAdapterKHR + clGetDeviceIDsFromDX9MediaAdapterKHR; + cl_api_clEnqueueAcquireDX9MediaSurfacesKHR + clEnqueueAcquireDX9MediaSurfacesKHR; + cl_api_clEnqueueReleaseDX9MediaSurfacesKHR + clEnqueueReleaseDX9MediaSurfacesKHR; + + /* cl_khr_egl_image */ + cl_api_clCreateFromEGLImageKHR clCreateFromEGLImageKHR; + cl_api_clEnqueueAcquireEGLObjectsKHR clEnqueueAcquireEGLObjectsKHR; + cl_api_clEnqueueReleaseEGLObjectsKHR clEnqueueReleaseEGLObjectsKHR; + + /* cl_khr_egl_event */ + cl_api_clCreateEventFromEGLSyncKHR clCreateEventFromEGLSyncKHR; + + /* OpenCL 2.0 */ + cl_api_clCreateCommandQueueWithProperties clCreateCommandQueueWithProperties; + cl_api_clCreatePipe clCreatePipe; + cl_api_clGetPipeInfo clGetPipeInfo; + cl_api_clSVMAlloc clSVMAlloc; + cl_api_clSVMFree clSVMFree; + cl_api_clEnqueueSVMFree clEnqueueSVMFree; + cl_api_clEnqueueSVMMemcpy clEnqueueSVMMemcpy; + cl_api_clEnqueueSVMMemFill clEnqueueSVMMemFill; + cl_api_clEnqueueSVMMap clEnqueueSVMMap; + cl_api_clEnqueueSVMUnmap clEnqueueSVMUnmap; + cl_api_clCreateSamplerWithProperties clCreateSamplerWithProperties; + cl_api_clSetKernelArgSVMPointer clSetKernelArgSVMPointer; + cl_api_clSetKernelExecInfo clSetKernelExecInfo; + + /* cl_khr_sub_groups */ + cl_api_clGetKernelSubGroupInfoKHR clGetKernelSubGroupInfoKHR; + + /* OpenCL 2.1 */ + cl_api_clCloneKernel clCloneKernel; + cl_api_clCreateProgramWithIL clCreateProgramWithIL; + cl_api_clEnqueueSVMMigrateMem clEnqueueSVMMigrateMem; + cl_api_clGetDeviceAndHostTimer clGetDeviceAndHostTimer; + cl_api_clGetHostTimer clGetHostTimer; + cl_api_clGetKernelSubGroupInfo clGetKernelSubGroupInfo; + cl_api_clSetDefaultDeviceCommandQueue clSetDefaultDeviceCommandQueue; + + /* OpenCL 2.2 */ + cl_api_clSetProgramReleaseCallback clSetProgramReleaseCallback; + cl_api_clSetProgramSpecializationConstant clSetProgramSpecializationConstant; + + /* OpenCL 3.0 */ + cl_api_clCreateBufferWithProperties clCreateBufferWithProperties; + cl_api_clCreateImageWithProperties clCreateImageWithProperties; + cl_api_clSetContextDestructorCallback clSetContextDestructorCallback; + +} cl_icd_dispatch; + +#ifdef __cplusplus +} +#endif + +#endif /* #ifndef OPENCL_CL_ICD_H */ diff --git a/ktx/external/basisu/OpenCL/CL/cl_layer.h b/ktx/external/basisu/OpenCL/CL/cl_layer.h new file mode 100644 index 0000000..59dae75 --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_layer.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020 The Khronos Group Inc. + * + * 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. + * + * OpenCL is a trademark of Apple Inc. used under license by Khronos. + */ + +#ifndef OPENCL_CL_LAYER_H +#define OPENCL_CL_LAYER_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef cl_uint cl_layer_info; +typedef cl_uint cl_layer_api_version; +#define CL_LAYER_API_VERSION 0x4240 +#define CL_LAYER_API_VERSION_100 100 + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetLayerInfo(cl_layer_info param_name, + size_t param_value_size, + void *param_value, + size_t *param_value_size_ret); + +typedef cl_int +(CL_API_CALL *pfn_clGetLayerInfo)(cl_layer_info param_name, + size_t param_value_size, + void *param_value, + size_t *param_value_size_ret); + +extern CL_API_ENTRY cl_int CL_API_CALL +clInitLayer(cl_uint num_entries, + const cl_icd_dispatch *target_dispatch, + cl_uint *num_entries_ret, + const cl_icd_dispatch **layer_dispatch_ret); + +typedef cl_int +(CL_API_CALL *pfn_clInitLayer)(cl_uint num_entries, + const cl_icd_dispatch *target_dispatch, + cl_uint *num_entries_ret, + const cl_icd_dispatch **layer_dispatch_ret); + +#ifdef __cplusplus +} +#endif + +#endif /* OPENCL_CL_LAYER_H */ diff --git a/ktx/external/basisu/OpenCL/CL/cl_platform.h b/ktx/external/basisu/OpenCL/CL/cl_platform.h new file mode 100644 index 0000000..8ae655d --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_platform.h @@ -0,0 +1,1404 @@ +/******************************************************************************* + * Copyright (c) 2008-2020 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#ifndef __CL_PLATFORM_H +#define __CL_PLATFORM_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) + #if !defined(CL_API_ENTRY) + #define CL_API_ENTRY + #endif + #if !defined(CL_API_CALL) + #define CL_API_CALL __stdcall + #endif + #if !defined(CL_CALLBACK) + #define CL_CALLBACK __stdcall + #endif +#else + #if !defined(CL_API_ENTRY) + #define CL_API_ENTRY + #endif + #if !defined(CL_API_CALL) + #define CL_API_CALL + #endif + #if !defined(CL_CALLBACK) + #define CL_CALLBACK + #endif +#endif + +/* + * Deprecation flags refer to the last version of the header in which the + * feature was not deprecated. + * + * E.g. VERSION_1_1_DEPRECATED means the feature is present in 1.1 without + * deprecation but is deprecated in versions later than 1.1. + */ + +#ifndef CL_API_SUFFIX_USER +#define CL_API_SUFFIX_USER +#endif + +#ifndef CL_API_PREFIX_USER +#define CL_API_PREFIX_USER +#endif + +#define CL_API_SUFFIX_COMMON CL_API_SUFFIX_USER +#define CL_API_PREFIX_COMMON CL_API_PREFIX_USER + +#define CL_API_SUFFIX__VERSION_1_0 CL_API_SUFFIX_COMMON +#define CL_API_SUFFIX__VERSION_1_1 CL_API_SUFFIX_COMMON +#define CL_API_SUFFIX__VERSION_1_2 CL_API_SUFFIX_COMMON +#define CL_API_SUFFIX__VERSION_2_0 CL_API_SUFFIX_COMMON +#define CL_API_SUFFIX__VERSION_2_1 CL_API_SUFFIX_COMMON +#define CL_API_SUFFIX__VERSION_2_2 CL_API_SUFFIX_COMMON +#define CL_API_SUFFIX__VERSION_3_0 CL_API_SUFFIX_COMMON +#define CL_API_SUFFIX__EXPERIMENTAL CL_API_SUFFIX_COMMON + + +#ifdef __GNUC__ + #define CL_API_SUFFIX_DEPRECATED __attribute__((deprecated)) + #define CL_API_PREFIX_DEPRECATED +#elif defined(_WIN32) + #define CL_API_SUFFIX_DEPRECATED + #define CL_API_PREFIX_DEPRECATED __declspec(deprecated) +#else + #define CL_API_SUFFIX_DEPRECATED + #define CL_API_PREFIX_DEPRECATED +#endif + +#ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS + #define CL_API_SUFFIX__VERSION_1_0_DEPRECATED CL_API_SUFFIX_COMMON + #define CL_API_PREFIX__VERSION_1_0_DEPRECATED CL_API_PREFIX_COMMON +#else + #define CL_API_SUFFIX__VERSION_1_0_DEPRECATED CL_API_SUFFIX_COMMON CL_API_SUFFIX_DEPRECATED + #define CL_API_PREFIX__VERSION_1_0_DEPRECATED CL_API_PREFIX_COMMON CL_API_PREFIX_DEPRECATED +#endif + +#ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS + #define CL_API_SUFFIX__VERSION_1_1_DEPRECATED CL_API_SUFFIX_COMMON + #define CL_API_PREFIX__VERSION_1_1_DEPRECATED CL_API_PREFIX_COMMON +#else + #define CL_API_SUFFIX__VERSION_1_1_DEPRECATED CL_API_SUFFIX_COMMON CL_API_SUFFIX_DEPRECATED + #define CL_API_PREFIX__VERSION_1_1_DEPRECATED CL_API_PREFIX_COMMON CL_API_PREFIX_DEPRECATED +#endif + +#ifdef CL_USE_DEPRECATED_OPENCL_1_2_APIS + #define CL_API_SUFFIX__VERSION_1_2_DEPRECATED CL_API_SUFFIX_COMMON + #define CL_API_PREFIX__VERSION_1_2_DEPRECATED CL_API_PREFIX_COMMON +#else + #define CL_API_SUFFIX__VERSION_1_2_DEPRECATED CL_API_SUFFIX_COMMON CL_API_SUFFIX_DEPRECATED + #define CL_API_PREFIX__VERSION_1_2_DEPRECATED CL_API_PREFIX_COMMON CL_API_PREFIX_DEPRECATED + #endif + +#ifdef CL_USE_DEPRECATED_OPENCL_2_0_APIS + #define CL_API_SUFFIX__VERSION_2_0_DEPRECATED CL_API_SUFFIX_COMMON + #define CL_API_PREFIX__VERSION_2_0_DEPRECATED CL_API_PREFIX_COMMON +#else + #define CL_API_SUFFIX__VERSION_2_0_DEPRECATED CL_API_SUFFIX_COMMON CL_API_SUFFIX_DEPRECATED + #define CL_API_PREFIX__VERSION_2_0_DEPRECATED CL_API_PREFIX_COMMON CL_API_PREFIX_DEPRECATED +#endif + +#ifdef CL_USE_DEPRECATED_OPENCL_2_1_APIS + #define CL_API_SUFFIX__VERSION_2_1_DEPRECATED CL_API_SUFFIX_COMMON + #define CL_API_PREFIX__VERSION_2_1_DEPRECATED CL_API_PREFIX_COMMON +#else + #define CL_API_SUFFIX__VERSION_2_1_DEPRECATED CL_API_SUFFIX_COMMON CL_API_SUFFIX_DEPRECATED + #define CL_API_PREFIX__VERSION_2_1_DEPRECATED CL_API_PREFIX_COMMON CL_API_PREFIX_DEPRECATED +#endif + +#ifdef CL_USE_DEPRECATED_OPENCL_2_2_APIS + #define CL_API_SUFFIX__VERSION_2_2_DEPRECATED CL_API_SUFFIX_COMMON + #define CL_API_PREFIX__VERSION_2_2_DEPRECATED CL_API_PREFIX_COMMON +#else + #define CL_API_SUFFIX__VERSION_2_2_DEPRECATED CL_API_SUFFIX_COMMON CL_API_SUFFIX_DEPRECATED + #define CL_API_PREFIX__VERSION_2_2_DEPRECATED CL_API_PREFIX_COMMON CL_API_PREFIX_DEPRECATED +#endif + +#if (defined (_WIN32) && defined(_MSC_VER)) + +/* intptr_t is used in cl.h and provided by stddef.h in Visual C++, but not in clang */ +/* stdint.h was missing before Visual Studio 2010, include it for later versions and for clang */ +#if defined(__clang__) || _MSC_VER >= 1600 + #include +#endif + +/* scalar types */ +typedef signed __int8 cl_char; +typedef unsigned __int8 cl_uchar; +typedef signed __int16 cl_short; +typedef unsigned __int16 cl_ushort; +typedef signed __int32 cl_int; +typedef unsigned __int32 cl_uint; +typedef signed __int64 cl_long; +typedef unsigned __int64 cl_ulong; + +typedef unsigned __int16 cl_half; +typedef float cl_float; +typedef double cl_double; + +/* Macro names and corresponding values defined by OpenCL */ +#define CL_CHAR_BIT 8 +#define CL_SCHAR_MAX 127 +#define CL_SCHAR_MIN (-127-1) +#define CL_CHAR_MAX CL_SCHAR_MAX +#define CL_CHAR_MIN CL_SCHAR_MIN +#define CL_UCHAR_MAX 255 +#define CL_SHRT_MAX 32767 +#define CL_SHRT_MIN (-32767-1) +#define CL_USHRT_MAX 65535 +#define CL_INT_MAX 2147483647 +#define CL_INT_MIN (-2147483647-1) +#define CL_UINT_MAX 0xffffffffU +#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) +#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) +#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) + +#define CL_FLT_DIG 6 +#define CL_FLT_MANT_DIG 24 +#define CL_FLT_MAX_10_EXP +38 +#define CL_FLT_MAX_EXP +128 +#define CL_FLT_MIN_10_EXP -37 +#define CL_FLT_MIN_EXP -125 +#define CL_FLT_RADIX 2 +#define CL_FLT_MAX 340282346638528859811704183484516925440.0f +#define CL_FLT_MIN 1.175494350822287507969e-38f +#define CL_FLT_EPSILON 1.1920928955078125e-7f + +#define CL_HALF_DIG 3 +#define CL_HALF_MANT_DIG 11 +#define CL_HALF_MAX_10_EXP +4 +#define CL_HALF_MAX_EXP +16 +#define CL_HALF_MIN_10_EXP -4 +#define CL_HALF_MIN_EXP -13 +#define CL_HALF_RADIX 2 +#define CL_HALF_MAX 65504.0f +#define CL_HALF_MIN 6.103515625e-05f +#define CL_HALF_EPSILON 9.765625e-04f + +#define CL_DBL_DIG 15 +#define CL_DBL_MANT_DIG 53 +#define CL_DBL_MAX_10_EXP +308 +#define CL_DBL_MAX_EXP +1024 +#define CL_DBL_MIN_10_EXP -307 +#define CL_DBL_MIN_EXP -1021 +#define CL_DBL_RADIX 2 +#define CL_DBL_MAX 1.7976931348623158e+308 +#define CL_DBL_MIN 2.225073858507201383090e-308 +#define CL_DBL_EPSILON 2.220446049250313080847e-16 + +#define CL_M_E 2.7182818284590452354 +#define CL_M_LOG2E 1.4426950408889634074 +#define CL_M_LOG10E 0.43429448190325182765 +#define CL_M_LN2 0.69314718055994530942 +#define CL_M_LN10 2.30258509299404568402 +#define CL_M_PI 3.14159265358979323846 +#define CL_M_PI_2 1.57079632679489661923 +#define CL_M_PI_4 0.78539816339744830962 +#define CL_M_1_PI 0.31830988618379067154 +#define CL_M_2_PI 0.63661977236758134308 +#define CL_M_2_SQRTPI 1.12837916709551257390 +#define CL_M_SQRT2 1.41421356237309504880 +#define CL_M_SQRT1_2 0.70710678118654752440 + +#define CL_M_E_F 2.718281828f +#define CL_M_LOG2E_F 1.442695041f +#define CL_M_LOG10E_F 0.434294482f +#define CL_M_LN2_F 0.693147181f +#define CL_M_LN10_F 2.302585093f +#define CL_M_PI_F 3.141592654f +#define CL_M_PI_2_F 1.570796327f +#define CL_M_PI_4_F 0.785398163f +#define CL_M_1_PI_F 0.318309886f +#define CL_M_2_PI_F 0.636619772f +#define CL_M_2_SQRTPI_F 1.128379167f +#define CL_M_SQRT2_F 1.414213562f +#define CL_M_SQRT1_2_F 0.707106781f + +#define CL_NAN (CL_INFINITY - CL_INFINITY) +#define CL_HUGE_VALF ((cl_float) 1e50) +#define CL_HUGE_VAL ((cl_double) 1e500) +#define CL_MAXFLOAT CL_FLT_MAX +#define CL_INFINITY CL_HUGE_VALF + +#else + +#include + +/* scalar types */ +typedef int8_t cl_char; +typedef uint8_t cl_uchar; +typedef int16_t cl_short; +typedef uint16_t cl_ushort; +typedef int32_t cl_int; +typedef uint32_t cl_uint; +typedef int64_t cl_long; +typedef uint64_t cl_ulong; + +typedef uint16_t cl_half; +typedef float cl_float; +typedef double cl_double; + +/* Macro names and corresponding values defined by OpenCL */ +#define CL_CHAR_BIT 8 +#define CL_SCHAR_MAX 127 +#define CL_SCHAR_MIN (-127-1) +#define CL_CHAR_MAX CL_SCHAR_MAX +#define CL_CHAR_MIN CL_SCHAR_MIN +#define CL_UCHAR_MAX 255 +#define CL_SHRT_MAX 32767 +#define CL_SHRT_MIN (-32767-1) +#define CL_USHRT_MAX 65535 +#define CL_INT_MAX 2147483647 +#define CL_INT_MIN (-2147483647-1) +#define CL_UINT_MAX 0xffffffffU +#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) +#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) +#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) + +#define CL_FLT_DIG 6 +#define CL_FLT_MANT_DIG 24 +#define CL_FLT_MAX_10_EXP +38 +#define CL_FLT_MAX_EXP +128 +#define CL_FLT_MIN_10_EXP -37 +#define CL_FLT_MIN_EXP -125 +#define CL_FLT_RADIX 2 +#define CL_FLT_MAX 340282346638528859811704183484516925440.0f +#define CL_FLT_MIN 1.175494350822287507969e-38f +#define CL_FLT_EPSILON 1.1920928955078125e-7f + +#define CL_HALF_DIG 3 +#define CL_HALF_MANT_DIG 11 +#define CL_HALF_MAX_10_EXP +4 +#define CL_HALF_MAX_EXP +16 +#define CL_HALF_MIN_10_EXP -4 +#define CL_HALF_MIN_EXP -13 +#define CL_HALF_RADIX 2 +#define CL_HALF_MAX 65504.0f +#define CL_HALF_MIN 6.103515625e-05f +#define CL_HALF_EPSILON 9.765625e-04f + +#define CL_DBL_DIG 15 +#define CL_DBL_MANT_DIG 53 +#define CL_DBL_MAX_10_EXP +308 +#define CL_DBL_MAX_EXP +1024 +#define CL_DBL_MIN_10_EXP -307 +#define CL_DBL_MIN_EXP -1021 +#define CL_DBL_RADIX 2 +#define CL_DBL_MAX 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0 +#define CL_DBL_MIN 2.225073858507201383090e-308 +#define CL_DBL_EPSILON 2.220446049250313080847e-16 + +#define CL_M_E 2.7182818284590452354 +#define CL_M_LOG2E 1.4426950408889634074 +#define CL_M_LOG10E 0.43429448190325182765 +#define CL_M_LN2 0.69314718055994530942 +#define CL_M_LN10 2.30258509299404568402 +#define CL_M_PI 3.14159265358979323846 +#define CL_M_PI_2 1.57079632679489661923 +#define CL_M_PI_4 0.78539816339744830962 +#define CL_M_1_PI 0.31830988618379067154 +#define CL_M_2_PI 0.63661977236758134308 +#define CL_M_2_SQRTPI 1.12837916709551257390 +#define CL_M_SQRT2 1.41421356237309504880 +#define CL_M_SQRT1_2 0.70710678118654752440 + +#define CL_M_E_F 2.718281828f +#define CL_M_LOG2E_F 1.442695041f +#define CL_M_LOG10E_F 0.434294482f +#define CL_M_LN2_F 0.693147181f +#define CL_M_LN10_F 2.302585093f +#define CL_M_PI_F 3.141592654f +#define CL_M_PI_2_F 1.570796327f +#define CL_M_PI_4_F 0.785398163f +#define CL_M_1_PI_F 0.318309886f +#define CL_M_2_PI_F 0.636619772f +#define CL_M_2_SQRTPI_F 1.128379167f +#define CL_M_SQRT2_F 1.414213562f +#define CL_M_SQRT1_2_F 0.707106781f + +#if defined( __GNUC__ ) + #define CL_HUGE_VALF __builtin_huge_valf() + #define CL_HUGE_VAL __builtin_huge_val() + #define CL_NAN __builtin_nanf( "" ) +#else + #define CL_HUGE_VALF ((cl_float) 1e50) + #define CL_HUGE_VAL ((cl_double) 1e500) + float nanf( const char * ); + #define CL_NAN nanf( "" ) +#endif +#define CL_MAXFLOAT CL_FLT_MAX +#define CL_INFINITY CL_HUGE_VALF + +#endif + +#include + +/* Mirror types to GL types. Mirror types allow us to avoid deciding which 87s to load based on whether we are using GL or GLES here. */ +typedef unsigned int cl_GLuint; +typedef int cl_GLint; +typedef unsigned int cl_GLenum; + +/* + * Vector types + * + * Note: OpenCL requires that all types be naturally aligned. + * This means that vector types must be naturally aligned. + * For example, a vector of four floats must be aligned to + * a 16 byte boundary (calculated as 4 * the natural 4-byte + * alignment of the float). The alignment qualifiers here + * will only function properly if your compiler supports them + * and if you don't actively work to defeat them. For example, + * in order for a cl_float4 to be 16 byte aligned in a struct, + * the start of the struct must itself be 16-byte aligned. + * + * Maintaining proper alignment is the user's responsibility. + */ + +/* Define basic vector types */ +#if defined( __VEC__ ) + #if !defined(__clang__) + #include /* may be omitted depending on compiler. AltiVec spec provides no way to detect whether the header is required. */ + #endif + typedef __vector unsigned char __cl_uchar16; + typedef __vector signed char __cl_char16; + typedef __vector unsigned short __cl_ushort8; + typedef __vector signed short __cl_short8; + typedef __vector unsigned int __cl_uint4; + typedef __vector signed int __cl_int4; + typedef __vector float __cl_float4; + #define __CL_UCHAR16__ 1 + #define __CL_CHAR16__ 1 + #define __CL_USHORT8__ 1 + #define __CL_SHORT8__ 1 + #define __CL_UINT4__ 1 + #define __CL_INT4__ 1 + #define __CL_FLOAT4__ 1 +#endif + +#if defined( __SSE__ ) + #if defined( __MINGW64__ ) + #include + #else + #include + #endif + #if defined( __GNUC__ ) + typedef float __cl_float4 __attribute__((vector_size(16))); + #else + typedef __m128 __cl_float4; + #endif + #define __CL_FLOAT4__ 1 +#endif + +#if defined( __SSE2__ ) + #if defined( __MINGW64__ ) + #include + #else + #include + #endif + #if defined( __GNUC__ ) + typedef cl_uchar __cl_uchar16 __attribute__((vector_size(16))); + typedef cl_char __cl_char16 __attribute__((vector_size(16))); + typedef cl_ushort __cl_ushort8 __attribute__((vector_size(16))); + typedef cl_short __cl_short8 __attribute__((vector_size(16))); + typedef cl_uint __cl_uint4 __attribute__((vector_size(16))); + typedef cl_int __cl_int4 __attribute__((vector_size(16))); + typedef cl_ulong __cl_ulong2 __attribute__((vector_size(16))); + typedef cl_long __cl_long2 __attribute__((vector_size(16))); + typedef cl_double __cl_double2 __attribute__((vector_size(16))); + #else + typedef __m128i __cl_uchar16; + typedef __m128i __cl_char16; + typedef __m128i __cl_ushort8; + typedef __m128i __cl_short8; + typedef __m128i __cl_uint4; + typedef __m128i __cl_int4; + typedef __m128i __cl_ulong2; + typedef __m128i __cl_long2; + typedef __m128d __cl_double2; + #endif + #define __CL_UCHAR16__ 1 + #define __CL_CHAR16__ 1 + #define __CL_USHORT8__ 1 + #define __CL_SHORT8__ 1 + #define __CL_INT4__ 1 + #define __CL_UINT4__ 1 + #define __CL_ULONG2__ 1 + #define __CL_LONG2__ 1 + #define __CL_DOUBLE2__ 1 +#endif + +#if defined( __MMX__ ) + #include + #if defined( __GNUC__ ) + typedef cl_uchar __cl_uchar8 __attribute__((vector_size(8))); + typedef cl_char __cl_char8 __attribute__((vector_size(8))); + typedef cl_ushort __cl_ushort4 __attribute__((vector_size(8))); + typedef cl_short __cl_short4 __attribute__((vector_size(8))); + typedef cl_uint __cl_uint2 __attribute__((vector_size(8))); + typedef cl_int __cl_int2 __attribute__((vector_size(8))); + typedef cl_ulong __cl_ulong1 __attribute__((vector_size(8))); + typedef cl_long __cl_long1 __attribute__((vector_size(8))); + typedef cl_float __cl_float2 __attribute__((vector_size(8))); + #else + typedef __m64 __cl_uchar8; + typedef __m64 __cl_char8; + typedef __m64 __cl_ushort4; + typedef __m64 __cl_short4; + typedef __m64 __cl_uint2; + typedef __m64 __cl_int2; + typedef __m64 __cl_ulong1; + typedef __m64 __cl_long1; + typedef __m64 __cl_float2; + #endif + #define __CL_UCHAR8__ 1 + #define __CL_CHAR8__ 1 + #define __CL_USHORT4__ 1 + #define __CL_SHORT4__ 1 + #define __CL_INT2__ 1 + #define __CL_UINT2__ 1 + #define __CL_ULONG1__ 1 + #define __CL_LONG1__ 1 + #define __CL_FLOAT2__ 1 +#endif + +#if defined( __AVX__ ) + #if defined( __MINGW64__ ) + #include + #else + #include + #endif + #if defined( __GNUC__ ) + typedef cl_float __cl_float8 __attribute__((vector_size(32))); + typedef cl_double __cl_double4 __attribute__((vector_size(32))); + #else + typedef __m256 __cl_float8; + typedef __m256d __cl_double4; + #endif + #define __CL_FLOAT8__ 1 + #define __CL_DOUBLE4__ 1 +#endif + +/* Define capabilities for anonymous struct members. */ +#if !defined(__cplusplus) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#define __CL_HAS_ANON_STRUCT__ 1 +#define __CL_ANON_STRUCT__ +#elif defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) +#define __CL_HAS_ANON_STRUCT__ 1 +#define __CL_ANON_STRUCT__ __extension__ +#elif defined( _WIN32) && defined(_MSC_VER) && ! defined(__STDC__) + #if _MSC_VER >= 1500 + /* Microsoft Developer Studio 2008 supports anonymous structs, but + * complains by default. */ + #define __CL_HAS_ANON_STRUCT__ 1 + #define __CL_ANON_STRUCT__ + /* Disable warning C4201: nonstandard extension used : nameless + * struct/union */ + #pragma warning( push ) + #pragma warning( disable : 4201 ) + #endif +#else +#define __CL_HAS_ANON_STRUCT__ 0 +#define __CL_ANON_STRUCT__ +#endif + +/* Define alignment keys */ +#if defined( __GNUC__ ) || defined(__INTEGRITY) + #define CL_ALIGNED(_x) __attribute__ ((aligned(_x))) +#elif defined( _WIN32) && (_MSC_VER) + /* Alignment keys neutered on windows because MSVC can't swallow function arguments with alignment requirements */ + /* http://msdn.microsoft.com/en-us/library/373ak2y1%28VS.71%29.aspx */ + /* #include */ + /* #define CL_ALIGNED(_x) _CRT_ALIGN(_x) */ + #define CL_ALIGNED(_x) +#else + #warning Need to implement some method to align data here + #define CL_ALIGNED(_x) +#endif + +/* Indicate whether .xyzw, .s0123 and .hi.lo are supported */ +#if __CL_HAS_ANON_STRUCT__ + /* .xyzw and .s0123...{f|F} are supported */ + #define CL_HAS_NAMED_VECTOR_FIELDS 1 + /* .hi and .lo are supported */ + #define CL_HAS_HI_LO_VECTOR_FIELDS 1 +#endif + +/* Define cl_vector types */ + +/* ---- cl_charn ---- */ +typedef union +{ + cl_char CL_ALIGNED(2) s[2]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_char x, y; }; + __CL_ANON_STRUCT__ struct{ cl_char s0, s1; }; + __CL_ANON_STRUCT__ struct{ cl_char lo, hi; }; +#endif +#if defined( __CL_CHAR2__) + __cl_char2 v2; +#endif +}cl_char2; + +typedef union +{ + cl_char CL_ALIGNED(4) s[4]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_char x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_char s0, s1, s2, s3; }; + __CL_ANON_STRUCT__ struct{ cl_char2 lo, hi; }; +#endif +#if defined( __CL_CHAR2__) + __cl_char2 v2[2]; +#endif +#if defined( __CL_CHAR4__) + __cl_char4 v4; +#endif +}cl_char4; + +/* cl_char3 is identical in size, alignment and behavior to cl_char4. See section 6.1.5. */ +typedef cl_char4 cl_char3; + +typedef union +{ + cl_char CL_ALIGNED(8) s[8]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_char x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7; }; + __CL_ANON_STRUCT__ struct{ cl_char4 lo, hi; }; +#endif +#if defined( __CL_CHAR2__) + __cl_char2 v2[4]; +#endif +#if defined( __CL_CHAR4__) + __cl_char4 v4[2]; +#endif +#if defined( __CL_CHAR8__ ) + __cl_char8 v8; +#endif +}cl_char8; + +typedef union +{ + cl_char CL_ALIGNED(16) s[16]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_char x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __CL_ANON_STRUCT__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __CL_ANON_STRUCT__ struct{ cl_char8 lo, hi; }; +#endif +#if defined( __CL_CHAR2__) + __cl_char2 v2[8]; +#endif +#if defined( __CL_CHAR4__) + __cl_char4 v4[4]; +#endif +#if defined( __CL_CHAR8__ ) + __cl_char8 v8[2]; +#endif +#if defined( __CL_CHAR16__ ) + __cl_char16 v16; +#endif +}cl_char16; + + +/* ---- cl_ucharn ---- */ +typedef union +{ + cl_uchar CL_ALIGNED(2) s[2]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_uchar x, y; }; + __CL_ANON_STRUCT__ struct{ cl_uchar s0, s1; }; + __CL_ANON_STRUCT__ struct{ cl_uchar lo, hi; }; +#endif +#if defined( __cl_uchar2__) + __cl_uchar2 v2; +#endif +}cl_uchar2; + +typedef union +{ + cl_uchar CL_ALIGNED(4) s[4]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_uchar x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_uchar s0, s1, s2, s3; }; + __CL_ANON_STRUCT__ struct{ cl_uchar2 lo, hi; }; +#endif +#if defined( __CL_UCHAR2__) + __cl_uchar2 v2[2]; +#endif +#if defined( __CL_UCHAR4__) + __cl_uchar4 v4; +#endif +}cl_uchar4; + +/* cl_uchar3 is identical in size, alignment and behavior to cl_uchar4. See section 6.1.5. */ +typedef cl_uchar4 cl_uchar3; + +typedef union +{ + cl_uchar CL_ALIGNED(8) s[8]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_uchar x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7; }; + __CL_ANON_STRUCT__ struct{ cl_uchar4 lo, hi; }; +#endif +#if defined( __CL_UCHAR2__) + __cl_uchar2 v2[4]; +#endif +#if defined( __CL_UCHAR4__) + __cl_uchar4 v4[2]; +#endif +#if defined( __CL_UCHAR8__ ) + __cl_uchar8 v8; +#endif +}cl_uchar8; + +typedef union +{ + cl_uchar CL_ALIGNED(16) s[16]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_uchar x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __CL_ANON_STRUCT__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __CL_ANON_STRUCT__ struct{ cl_uchar8 lo, hi; }; +#endif +#if defined( __CL_UCHAR2__) + __cl_uchar2 v2[8]; +#endif +#if defined( __CL_UCHAR4__) + __cl_uchar4 v4[4]; +#endif +#if defined( __CL_UCHAR8__ ) + __cl_uchar8 v8[2]; +#endif +#if defined( __CL_UCHAR16__ ) + __cl_uchar16 v16; +#endif +}cl_uchar16; + + +/* ---- cl_shortn ---- */ +typedef union +{ + cl_short CL_ALIGNED(4) s[2]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_short x, y; }; + __CL_ANON_STRUCT__ struct{ cl_short s0, s1; }; + __CL_ANON_STRUCT__ struct{ cl_short lo, hi; }; +#endif +#if defined( __CL_SHORT2__) + __cl_short2 v2; +#endif +}cl_short2; + +typedef union +{ + cl_short CL_ALIGNED(8) s[4]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_short x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_short s0, s1, s2, s3; }; + __CL_ANON_STRUCT__ struct{ cl_short2 lo, hi; }; +#endif +#if defined( __CL_SHORT2__) + __cl_short2 v2[2]; +#endif +#if defined( __CL_SHORT4__) + __cl_short4 v4; +#endif +}cl_short4; + +/* cl_short3 is identical in size, alignment and behavior to cl_short4. See section 6.1.5. */ +typedef cl_short4 cl_short3; + +typedef union +{ + cl_short CL_ALIGNED(16) s[8]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_short x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7; }; + __CL_ANON_STRUCT__ struct{ cl_short4 lo, hi; }; +#endif +#if defined( __CL_SHORT2__) + __cl_short2 v2[4]; +#endif +#if defined( __CL_SHORT4__) + __cl_short4 v4[2]; +#endif +#if defined( __CL_SHORT8__ ) + __cl_short8 v8; +#endif +}cl_short8; + +typedef union +{ + cl_short CL_ALIGNED(32) s[16]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_short x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __CL_ANON_STRUCT__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __CL_ANON_STRUCT__ struct{ cl_short8 lo, hi; }; +#endif +#if defined( __CL_SHORT2__) + __cl_short2 v2[8]; +#endif +#if defined( __CL_SHORT4__) + __cl_short4 v4[4]; +#endif +#if defined( __CL_SHORT8__ ) + __cl_short8 v8[2]; +#endif +#if defined( __CL_SHORT16__ ) + __cl_short16 v16; +#endif +}cl_short16; + + +/* ---- cl_ushortn ---- */ +typedef union +{ + cl_ushort CL_ALIGNED(4) s[2]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_ushort x, y; }; + __CL_ANON_STRUCT__ struct{ cl_ushort s0, s1; }; + __CL_ANON_STRUCT__ struct{ cl_ushort lo, hi; }; +#endif +#if defined( __CL_USHORT2__) + __cl_ushort2 v2; +#endif +}cl_ushort2; + +typedef union +{ + cl_ushort CL_ALIGNED(8) s[4]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_ushort x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_ushort s0, s1, s2, s3; }; + __CL_ANON_STRUCT__ struct{ cl_ushort2 lo, hi; }; +#endif +#if defined( __CL_USHORT2__) + __cl_ushort2 v2[2]; +#endif +#if defined( __CL_USHORT4__) + __cl_ushort4 v4; +#endif +}cl_ushort4; + +/* cl_ushort3 is identical in size, alignment and behavior to cl_ushort4. See section 6.1.5. */ +typedef cl_ushort4 cl_ushort3; + +typedef union +{ + cl_ushort CL_ALIGNED(16) s[8]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_ushort x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7; }; + __CL_ANON_STRUCT__ struct{ cl_ushort4 lo, hi; }; +#endif +#if defined( __CL_USHORT2__) + __cl_ushort2 v2[4]; +#endif +#if defined( __CL_USHORT4__) + __cl_ushort4 v4[2]; +#endif +#if defined( __CL_USHORT8__ ) + __cl_ushort8 v8; +#endif +}cl_ushort8; + +typedef union +{ + cl_ushort CL_ALIGNED(32) s[16]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_ushort x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __CL_ANON_STRUCT__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __CL_ANON_STRUCT__ struct{ cl_ushort8 lo, hi; }; +#endif +#if defined( __CL_USHORT2__) + __cl_ushort2 v2[8]; +#endif +#if defined( __CL_USHORT4__) + __cl_ushort4 v4[4]; +#endif +#if defined( __CL_USHORT8__ ) + __cl_ushort8 v8[2]; +#endif +#if defined( __CL_USHORT16__ ) + __cl_ushort16 v16; +#endif +}cl_ushort16; + + +/* ---- cl_halfn ---- */ +typedef union +{ + cl_half CL_ALIGNED(4) s[2]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_half x, y; }; + __CL_ANON_STRUCT__ struct{ cl_half s0, s1; }; + __CL_ANON_STRUCT__ struct{ cl_half lo, hi; }; +#endif +#if defined( __CL_HALF2__) + __cl_half2 v2; +#endif +}cl_half2; + +typedef union +{ + cl_half CL_ALIGNED(8) s[4]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_half x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_half s0, s1, s2, s3; }; + __CL_ANON_STRUCT__ struct{ cl_half2 lo, hi; }; +#endif +#if defined( __CL_HALF2__) + __cl_half2 v2[2]; +#endif +#if defined( __CL_HALF4__) + __cl_half4 v4; +#endif +}cl_half4; + +/* cl_half3 is identical in size, alignment and behavior to cl_half4. See section 6.1.5. */ +typedef cl_half4 cl_half3; + +typedef union +{ + cl_half CL_ALIGNED(16) s[8]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_half x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_half s0, s1, s2, s3, s4, s5, s6, s7; }; + __CL_ANON_STRUCT__ struct{ cl_half4 lo, hi; }; +#endif +#if defined( __CL_HALF2__) + __cl_half2 v2[4]; +#endif +#if defined( __CL_HALF4__) + __cl_half4 v4[2]; +#endif +#if defined( __CL_HALF8__ ) + __cl_half8 v8; +#endif +}cl_half8; + +typedef union +{ + cl_half CL_ALIGNED(32) s[16]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_half x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __CL_ANON_STRUCT__ struct{ cl_half s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __CL_ANON_STRUCT__ struct{ cl_half8 lo, hi; }; +#endif +#if defined( __CL_HALF2__) + __cl_half2 v2[8]; +#endif +#if defined( __CL_HALF4__) + __cl_half4 v4[4]; +#endif +#if defined( __CL_HALF8__ ) + __cl_half8 v8[2]; +#endif +#if defined( __CL_HALF16__ ) + __cl_half16 v16; +#endif +}cl_half16; + +/* ---- cl_intn ---- */ +typedef union +{ + cl_int CL_ALIGNED(8) s[2]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_int x, y; }; + __CL_ANON_STRUCT__ struct{ cl_int s0, s1; }; + __CL_ANON_STRUCT__ struct{ cl_int lo, hi; }; +#endif +#if defined( __CL_INT2__) + __cl_int2 v2; +#endif +}cl_int2; + +typedef union +{ + cl_int CL_ALIGNED(16) s[4]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_int x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_int s0, s1, s2, s3; }; + __CL_ANON_STRUCT__ struct{ cl_int2 lo, hi; }; +#endif +#if defined( __CL_INT2__) + __cl_int2 v2[2]; +#endif +#if defined( __CL_INT4__) + __cl_int4 v4; +#endif +}cl_int4; + +/* cl_int3 is identical in size, alignment and behavior to cl_int4. See section 6.1.5. */ +typedef cl_int4 cl_int3; + +typedef union +{ + cl_int CL_ALIGNED(32) s[8]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_int x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7; }; + __CL_ANON_STRUCT__ struct{ cl_int4 lo, hi; }; +#endif +#if defined( __CL_INT2__) + __cl_int2 v2[4]; +#endif +#if defined( __CL_INT4__) + __cl_int4 v4[2]; +#endif +#if defined( __CL_INT8__ ) + __cl_int8 v8; +#endif +}cl_int8; + +typedef union +{ + cl_int CL_ALIGNED(64) s[16]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_int x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __CL_ANON_STRUCT__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __CL_ANON_STRUCT__ struct{ cl_int8 lo, hi; }; +#endif +#if defined( __CL_INT2__) + __cl_int2 v2[8]; +#endif +#if defined( __CL_INT4__) + __cl_int4 v4[4]; +#endif +#if defined( __CL_INT8__ ) + __cl_int8 v8[2]; +#endif +#if defined( __CL_INT16__ ) + __cl_int16 v16; +#endif +}cl_int16; + + +/* ---- cl_uintn ---- */ +typedef union +{ + cl_uint CL_ALIGNED(8) s[2]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_uint x, y; }; + __CL_ANON_STRUCT__ struct{ cl_uint s0, s1; }; + __CL_ANON_STRUCT__ struct{ cl_uint lo, hi; }; +#endif +#if defined( __CL_UINT2__) + __cl_uint2 v2; +#endif +}cl_uint2; + +typedef union +{ + cl_uint CL_ALIGNED(16) s[4]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_uint x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_uint s0, s1, s2, s3; }; + __CL_ANON_STRUCT__ struct{ cl_uint2 lo, hi; }; +#endif +#if defined( __CL_UINT2__) + __cl_uint2 v2[2]; +#endif +#if defined( __CL_UINT4__) + __cl_uint4 v4; +#endif +}cl_uint4; + +/* cl_uint3 is identical in size, alignment and behavior to cl_uint4. See section 6.1.5. */ +typedef cl_uint4 cl_uint3; + +typedef union +{ + cl_uint CL_ALIGNED(32) s[8]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_uint x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7; }; + __CL_ANON_STRUCT__ struct{ cl_uint4 lo, hi; }; +#endif +#if defined( __CL_UINT2__) + __cl_uint2 v2[4]; +#endif +#if defined( __CL_UINT4__) + __cl_uint4 v4[2]; +#endif +#if defined( __CL_UINT8__ ) + __cl_uint8 v8; +#endif +}cl_uint8; + +typedef union +{ + cl_uint CL_ALIGNED(64) s[16]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_uint x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __CL_ANON_STRUCT__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __CL_ANON_STRUCT__ struct{ cl_uint8 lo, hi; }; +#endif +#if defined( __CL_UINT2__) + __cl_uint2 v2[8]; +#endif +#if defined( __CL_UINT4__) + __cl_uint4 v4[4]; +#endif +#if defined( __CL_UINT8__ ) + __cl_uint8 v8[2]; +#endif +#if defined( __CL_UINT16__ ) + __cl_uint16 v16; +#endif +}cl_uint16; + +/* ---- cl_longn ---- */ +typedef union +{ + cl_long CL_ALIGNED(16) s[2]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_long x, y; }; + __CL_ANON_STRUCT__ struct{ cl_long s0, s1; }; + __CL_ANON_STRUCT__ struct{ cl_long lo, hi; }; +#endif +#if defined( __CL_LONG2__) + __cl_long2 v2; +#endif +}cl_long2; + +typedef union +{ + cl_long CL_ALIGNED(32) s[4]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_long x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_long s0, s1, s2, s3; }; + __CL_ANON_STRUCT__ struct{ cl_long2 lo, hi; }; +#endif +#if defined( __CL_LONG2__) + __cl_long2 v2[2]; +#endif +#if defined( __CL_LONG4__) + __cl_long4 v4; +#endif +}cl_long4; + +/* cl_long3 is identical in size, alignment and behavior to cl_long4. See section 6.1.5. */ +typedef cl_long4 cl_long3; + +typedef union +{ + cl_long CL_ALIGNED(64) s[8]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_long x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7; }; + __CL_ANON_STRUCT__ struct{ cl_long4 lo, hi; }; +#endif +#if defined( __CL_LONG2__) + __cl_long2 v2[4]; +#endif +#if defined( __CL_LONG4__) + __cl_long4 v4[2]; +#endif +#if defined( __CL_LONG8__ ) + __cl_long8 v8; +#endif +}cl_long8; + +typedef union +{ + cl_long CL_ALIGNED(128) s[16]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_long x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __CL_ANON_STRUCT__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __CL_ANON_STRUCT__ struct{ cl_long8 lo, hi; }; +#endif +#if defined( __CL_LONG2__) + __cl_long2 v2[8]; +#endif +#if defined( __CL_LONG4__) + __cl_long4 v4[4]; +#endif +#if defined( __CL_LONG8__ ) + __cl_long8 v8[2]; +#endif +#if defined( __CL_LONG16__ ) + __cl_long16 v16; +#endif +}cl_long16; + + +/* ---- cl_ulongn ---- */ +typedef union +{ + cl_ulong CL_ALIGNED(16) s[2]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_ulong x, y; }; + __CL_ANON_STRUCT__ struct{ cl_ulong s0, s1; }; + __CL_ANON_STRUCT__ struct{ cl_ulong lo, hi; }; +#endif +#if defined( __CL_ULONG2__) + __cl_ulong2 v2; +#endif +}cl_ulong2; + +typedef union +{ + cl_ulong CL_ALIGNED(32) s[4]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_ulong x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_ulong s0, s1, s2, s3; }; + __CL_ANON_STRUCT__ struct{ cl_ulong2 lo, hi; }; +#endif +#if defined( __CL_ULONG2__) + __cl_ulong2 v2[2]; +#endif +#if defined( __CL_ULONG4__) + __cl_ulong4 v4; +#endif +}cl_ulong4; + +/* cl_ulong3 is identical in size, alignment and behavior to cl_ulong4. See section 6.1.5. */ +typedef cl_ulong4 cl_ulong3; + +typedef union +{ + cl_ulong CL_ALIGNED(64) s[8]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_ulong x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7; }; + __CL_ANON_STRUCT__ struct{ cl_ulong4 lo, hi; }; +#endif +#if defined( __CL_ULONG2__) + __cl_ulong2 v2[4]; +#endif +#if defined( __CL_ULONG4__) + __cl_ulong4 v4[2]; +#endif +#if defined( __CL_ULONG8__ ) + __cl_ulong8 v8; +#endif +}cl_ulong8; + +typedef union +{ + cl_ulong CL_ALIGNED(128) s[16]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_ulong x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __CL_ANON_STRUCT__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __CL_ANON_STRUCT__ struct{ cl_ulong8 lo, hi; }; +#endif +#if defined( __CL_ULONG2__) + __cl_ulong2 v2[8]; +#endif +#if defined( __CL_ULONG4__) + __cl_ulong4 v4[4]; +#endif +#if defined( __CL_ULONG8__ ) + __cl_ulong8 v8[2]; +#endif +#if defined( __CL_ULONG16__ ) + __cl_ulong16 v16; +#endif +}cl_ulong16; + + +/* --- cl_floatn ---- */ + +typedef union +{ + cl_float CL_ALIGNED(8) s[2]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_float x, y; }; + __CL_ANON_STRUCT__ struct{ cl_float s0, s1; }; + __CL_ANON_STRUCT__ struct{ cl_float lo, hi; }; +#endif +#if defined( __CL_FLOAT2__) + __cl_float2 v2; +#endif +}cl_float2; + +typedef union +{ + cl_float CL_ALIGNED(16) s[4]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_float x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_float s0, s1, s2, s3; }; + __CL_ANON_STRUCT__ struct{ cl_float2 lo, hi; }; +#endif +#if defined( __CL_FLOAT2__) + __cl_float2 v2[2]; +#endif +#if defined( __CL_FLOAT4__) + __cl_float4 v4; +#endif +}cl_float4; + +/* cl_float3 is identical in size, alignment and behavior to cl_float4. See section 6.1.5. */ +typedef cl_float4 cl_float3; + +typedef union +{ + cl_float CL_ALIGNED(32) s[8]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_float x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7; }; + __CL_ANON_STRUCT__ struct{ cl_float4 lo, hi; }; +#endif +#if defined( __CL_FLOAT2__) + __cl_float2 v2[4]; +#endif +#if defined( __CL_FLOAT4__) + __cl_float4 v4[2]; +#endif +#if defined( __CL_FLOAT8__ ) + __cl_float8 v8; +#endif +}cl_float8; + +typedef union +{ + cl_float CL_ALIGNED(64) s[16]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_float x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __CL_ANON_STRUCT__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __CL_ANON_STRUCT__ struct{ cl_float8 lo, hi; }; +#endif +#if defined( __CL_FLOAT2__) + __cl_float2 v2[8]; +#endif +#if defined( __CL_FLOAT4__) + __cl_float4 v4[4]; +#endif +#if defined( __CL_FLOAT8__ ) + __cl_float8 v8[2]; +#endif +#if defined( __CL_FLOAT16__ ) + __cl_float16 v16; +#endif +}cl_float16; + +/* --- cl_doublen ---- */ + +typedef union +{ + cl_double CL_ALIGNED(16) s[2]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_double x, y; }; + __CL_ANON_STRUCT__ struct{ cl_double s0, s1; }; + __CL_ANON_STRUCT__ struct{ cl_double lo, hi; }; +#endif +#if defined( __CL_DOUBLE2__) + __cl_double2 v2; +#endif +}cl_double2; + +typedef union +{ + cl_double CL_ALIGNED(32) s[4]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_double x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_double s0, s1, s2, s3; }; + __CL_ANON_STRUCT__ struct{ cl_double2 lo, hi; }; +#endif +#if defined( __CL_DOUBLE2__) + __cl_double2 v2[2]; +#endif +#if defined( __CL_DOUBLE4__) + __cl_double4 v4; +#endif +}cl_double4; + +/* cl_double3 is identical in size, alignment and behavior to cl_double4. See section 6.1.5. */ +typedef cl_double4 cl_double3; + +typedef union +{ + cl_double CL_ALIGNED(64) s[8]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_double x, y, z, w; }; + __CL_ANON_STRUCT__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7; }; + __CL_ANON_STRUCT__ struct{ cl_double4 lo, hi; }; +#endif +#if defined( __CL_DOUBLE2__) + __cl_double2 v2[4]; +#endif +#if defined( __CL_DOUBLE4__) + __cl_double4 v4[2]; +#endif +#if defined( __CL_DOUBLE8__ ) + __cl_double8 v8; +#endif +}cl_double8; + +typedef union +{ + cl_double CL_ALIGNED(128) s[16]; +#if __CL_HAS_ANON_STRUCT__ + __CL_ANON_STRUCT__ struct{ cl_double x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __CL_ANON_STRUCT__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __CL_ANON_STRUCT__ struct{ cl_double8 lo, hi; }; +#endif +#if defined( __CL_DOUBLE2__) + __cl_double2 v2[8]; +#endif +#if defined( __CL_DOUBLE4__) + __cl_double4 v4[4]; +#endif +#if defined( __CL_DOUBLE8__ ) + __cl_double8 v8[2]; +#endif +#if defined( __CL_DOUBLE16__ ) + __cl_double16 v16; +#endif +}cl_double16; + +/* Macro to facilitate debugging + * Usage: + * Place CL_PROGRAM_STRING_DEBUG_INFO on the line before the first line of your source. + * The first line ends with: CL_PROGRAM_STRING_DEBUG_INFO \" + * Each line thereafter of OpenCL C source must end with: \n\ + * The last line ends in "; + * + * Example: + * + * const char *my_program = CL_PROGRAM_STRING_DEBUG_INFO "\ + * kernel void foo( int a, float * b ) \n\ + * { \n\ + * // my comment \n\ + * *b[ get_global_id(0)] = a; \n\ + * } \n\ + * "; + * + * This should correctly set up the line, (column) and file information for your source + * string so you can do source level debugging. + */ +#define __CL_STRINGIFY( _x ) # _x +#define _CL_STRINGIFY( _x ) __CL_STRINGIFY( _x ) +#define CL_PROGRAM_STRING_DEBUG_INFO "#line " _CL_STRINGIFY(__LINE__) " \"" __FILE__ "\" \n\n" + +#ifdef __cplusplus +} +#endif + +#if defined( _WIN32) && defined(_MSC_VER) && ! defined(__STDC__) + #if _MSC_VER >=1500 + #pragma warning( pop ) + #endif +#endif + +#endif /* __CL_PLATFORM_H */ diff --git a/ktx/external/basisu/OpenCL/CL/cl_va_api_media_sharing_intel.h b/ktx/external/basisu/OpenCL/CL/cl_va_api_media_sharing_intel.h new file mode 100644 index 0000000..7ba2ec8 --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_va_api_media_sharing_intel.h @@ -0,0 +1,136 @@ +/******************************************************************************* + * Copyright (c) 2008-2020 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#ifndef __OPENCL_CL_VA_API_MEDIA_SHARING_INTEL_H +#define __OPENCL_CL_VA_API_MEDIA_SHARING_INTEL_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************** +* cl_intel_va_api_media_sharing extension * +*******************************************/ + +#define cl_intel_va_api_media_sharing 1 + +/* error codes */ +#define CL_INVALID_VA_API_MEDIA_ADAPTER_INTEL -1098 +#define CL_INVALID_VA_API_MEDIA_SURFACE_INTEL -1099 +#define CL_VA_API_MEDIA_SURFACE_ALREADY_ACQUIRED_INTEL -1100 +#define CL_VA_API_MEDIA_SURFACE_NOT_ACQUIRED_INTEL -1101 + +/* cl_va_api_device_source_intel */ +#define CL_VA_API_DISPLAY_INTEL 0x4094 + +/* cl_va_api_device_set_intel */ +#define CL_PREFERRED_DEVICES_FOR_VA_API_INTEL 0x4095 +#define CL_ALL_DEVICES_FOR_VA_API_INTEL 0x4096 + +/* cl_context_info */ +#define CL_CONTEXT_VA_API_DISPLAY_INTEL 0x4097 + +/* cl_mem_info */ +#define CL_MEM_VA_API_MEDIA_SURFACE_INTEL 0x4098 + +/* cl_image_info */ +#define CL_IMAGE_VA_API_PLANE_INTEL 0x4099 + +/* cl_command_type */ +#define CL_COMMAND_ACQUIRE_VA_API_MEDIA_SURFACES_INTEL 0x409A +#define CL_COMMAND_RELEASE_VA_API_MEDIA_SURFACES_INTEL 0x409B + +typedef cl_uint cl_va_api_device_source_intel; +typedef cl_uint cl_va_api_device_set_intel; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetDeviceIDsFromVA_APIMediaAdapterINTEL( + cl_platform_id platform, + cl_va_api_device_source_intel media_adapter_type, + void* media_adapter, + cl_va_api_device_set_intel media_adapter_set, + cl_uint num_entries, + cl_device_id* devices, + cl_uint* num_devices) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int (CL_API_CALL * clGetDeviceIDsFromVA_APIMediaAdapterINTEL_fn)( + cl_platform_id platform, + cl_va_api_device_source_intel media_adapter_type, + void* media_adapter, + cl_va_api_device_set_intel media_adapter_set, + cl_uint num_entries, + cl_device_id* devices, + cl_uint* num_devices) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateFromVA_APIMediaSurfaceINTEL( + cl_context context, + cl_mem_flags flags, + VASurfaceID* surface, + cl_uint plane, + cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_mem (CL_API_CALL * clCreateFromVA_APIMediaSurfaceINTEL_fn)( + cl_context context, + cl_mem_flags flags, + VASurfaceID* surface, + cl_uint plane, + cl_int* errcode_ret) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueAcquireVA_APIMediaSurfacesINTEL( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem* mem_objects, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int (CL_API_CALL *clEnqueueAcquireVA_APIMediaSurfacesINTEL_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem* mem_objects, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event) CL_API_SUFFIX__VERSION_1_2; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueReleaseVA_APIMediaSurfacesINTEL( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem* mem_objects, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event) CL_API_SUFFIX__VERSION_1_2; + +typedef cl_int (CL_API_CALL *clEnqueueReleaseVA_APIMediaSurfacesINTEL_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem* mem_objects, + cl_uint num_events_in_wait_list, + const cl_event* event_wait_list, + cl_event* event) CL_API_SUFFIX__VERSION_1_2; + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENCL_CL_VA_API_MEDIA_SHARING_INTEL_H */ + diff --git a/ktx/external/basisu/OpenCL/CL/cl_version.h b/ktx/external/basisu/OpenCL/CL/cl_version.h new file mode 100644 index 0000000..3844938 --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/cl_version.h @@ -0,0 +1,81 @@ +/******************************************************************************* + * Copyright (c) 2018-2020 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#ifndef __CL_VERSION_H +#define __CL_VERSION_H + +/* Detect which version to target */ +#if !defined(CL_TARGET_OPENCL_VERSION) +#pragma message("cl_version.h: CL_TARGET_OPENCL_VERSION is not defined. Defaulting to 300 (OpenCL 3.0)") +#define CL_TARGET_OPENCL_VERSION 300 +#endif +#if CL_TARGET_OPENCL_VERSION != 100 && \ + CL_TARGET_OPENCL_VERSION != 110 && \ + CL_TARGET_OPENCL_VERSION != 120 && \ + CL_TARGET_OPENCL_VERSION != 200 && \ + CL_TARGET_OPENCL_VERSION != 210 && \ + CL_TARGET_OPENCL_VERSION != 220 && \ + CL_TARGET_OPENCL_VERSION != 300 +#pragma message("cl_version: CL_TARGET_OPENCL_VERSION is not a valid value (100, 110, 120, 200, 210, 220, 300). Defaulting to 300 (OpenCL 3.0)") +#undef CL_TARGET_OPENCL_VERSION +#define CL_TARGET_OPENCL_VERSION 300 +#endif + + +/* OpenCL Version */ +#if CL_TARGET_OPENCL_VERSION >= 300 && !defined(CL_VERSION_3_0) +#define CL_VERSION_3_0 1 +#endif +#if CL_TARGET_OPENCL_VERSION >= 220 && !defined(CL_VERSION_2_2) +#define CL_VERSION_2_2 1 +#endif +#if CL_TARGET_OPENCL_VERSION >= 210 && !defined(CL_VERSION_2_1) +#define CL_VERSION_2_1 1 +#endif +#if CL_TARGET_OPENCL_VERSION >= 200 && !defined(CL_VERSION_2_0) +#define CL_VERSION_2_0 1 +#endif +#if CL_TARGET_OPENCL_VERSION >= 120 && !defined(CL_VERSION_1_2) +#define CL_VERSION_1_2 1 +#endif +#if CL_TARGET_OPENCL_VERSION >= 110 && !defined(CL_VERSION_1_1) +#define CL_VERSION_1_1 1 +#endif +#if CL_TARGET_OPENCL_VERSION >= 100 && !defined(CL_VERSION_1_0) +#define CL_VERSION_1_0 1 +#endif + +/* Allow deprecated APIs for older OpenCL versions. */ +#if CL_TARGET_OPENCL_VERSION <= 220 && !defined(CL_USE_DEPRECATED_OPENCL_2_2_APIS) +#define CL_USE_DEPRECATED_OPENCL_2_2_APIS +#endif +#if CL_TARGET_OPENCL_VERSION <= 210 && !defined(CL_USE_DEPRECATED_OPENCL_2_1_APIS) +#define CL_USE_DEPRECATED_OPENCL_2_1_APIS +#endif +#if CL_TARGET_OPENCL_VERSION <= 200 && !defined(CL_USE_DEPRECATED_OPENCL_2_0_APIS) +#define CL_USE_DEPRECATED_OPENCL_2_0_APIS +#endif +#if CL_TARGET_OPENCL_VERSION <= 120 && !defined(CL_USE_DEPRECATED_OPENCL_1_2_APIS) +#define CL_USE_DEPRECATED_OPENCL_1_2_APIS +#endif +#if CL_TARGET_OPENCL_VERSION <= 110 && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) +#define CL_USE_DEPRECATED_OPENCL_1_1_APIS +#endif +#if CL_TARGET_OPENCL_VERSION <= 100 && !defined(CL_USE_DEPRECATED_OPENCL_1_0_APIS) +#define CL_USE_DEPRECATED_OPENCL_1_0_APIS +#endif + +#endif /* __CL_VERSION_H */ diff --git a/ktx/external/basisu/OpenCL/CL/opencl.h b/ktx/external/basisu/OpenCL/CL/opencl.h new file mode 100644 index 0000000..ef8dd1e --- /dev/null +++ b/ktx/external/basisu/OpenCL/CL/opencl.h @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2008-2021 The Khronos Group Inc. + * + * 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. + ******************************************************************************/ + +#ifndef __OPENCL_H +#define __OPENCL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENCL_H */ diff --git a/ktx/external/basisu/OpenCL/lib/OpenCL.lib b/ktx/external/basisu/OpenCL/lib/OpenCL.lib new file mode 100644 index 0000000..704194d Binary files /dev/null and b/ktx/external/basisu/OpenCL/lib/OpenCL.lib differ diff --git a/ktx/external/basisu/OpenCL/lib/OpenCL64.lib b/ktx/external/basisu/OpenCL/lib/OpenCL64.lib new file mode 100644 index 0000000..b30ea48 Binary files /dev/null and b/ktx/external/basisu/OpenCL/lib/OpenCL64.lib differ diff --git a/ktx/external/basisu/OpenCL/license.txt b/ktx/external/basisu/OpenCL/license.txt new file mode 100644 index 0000000..9d69cfc --- /dev/null +++ b/ktx/external/basisu/OpenCL/license.txt @@ -0,0 +1,4 @@ +These optional files (which are only needed when compiling with OpenCL support enabled in the encoder) are from the +Khronos Group OpenCL headers github repo. They are Copyright (c) 2008-2020 The Khronos Group Inc. +https://github.com/KhronosGroup/OpenCL-Headers + diff --git a/ktx/external/basisu/README.md b/ktx/external/basisu/README.md new file mode 100644 index 0000000..a96cdd8 --- /dev/null +++ b/ktx/external/basisu/README.md @@ -0,0 +1,318 @@ +# basis_universal +Basis Universal Supercompressed GPU Texture Codec + +(This software is available under a free and permissive license (Apache 2.0), but like many other large open source projects it needs financial support to sustain its continued security, bug fixes and improvements. In addition to maintenance and stability there are many desirable features and new interchange formats we would like to add. If your company is using Basis Universal in a product, please consider reaching out.) + +Businesses: support continued development and maintenance via invoiced technical support, maintenance, or sponsoring contracts: +
              _E-mail: info @ binomial dot info_ or contact us on [Twitter](https://twitter.com/_binomial) + +Also see the [Sponsors](https://github.com/BinomialLLC/basis_universal/wiki/Sponsors-and-Supporters) wiki page. + +---- + +[![Build status](https://ci.appveyor.com/api/projects/status/87eb0o96pjho4sh0?svg=true)](https://ci.appveyor.com/project/BinomialLLC/basis-universal) + +Basis Universal is a ["supercompressed"](http://gamma.cs.unc.edu/GST/gst.pdf) GPU texture data interchange system that supports two highly compressed intermediate file formats (.basis or the [.KTX2 open standard from the Khronos Group](https://github.khronos.org/KTX-Specification/)) that can be quickly transcoded to a [very wide variety](https://github.com/BinomialLLC/basis_universal/wiki/OpenGL-texture-format-enums-table) of GPU compressed and uncompressed pixel formats: ASTC 4x4 L/LA/RGB/RGBA, PVRTC1 4bpp RGB/RGBA, PVRTC2 RGB/RGBA, BC7 mode 6 RGB, BC7 mode 5 RGB/RGBA, BC1-5 RGB/RGBA/X/XY, ETC1 RGB, ETC2 RGBA, ATC RGB/RGBA, ETC2 EAC R11 and RG11, FXT1 RGB, and uncompressed raster image formats 8888/565/4444. + +The system now supports two modes: a high quality mode which is internally based off the [UASTC compressed texture format](https://richg42.blogspot.com/2020/01/uastc-block-format-encoding.html), and the original lower quality mode which is based off a subset of ETC1 called "ETC1S". UASTC is for extremely high quality (similar to BC7 quality) textures, and ETC1S is for very small files. The ETC1S system includes built-in data compression, while the UASTC system includes an optional Rate Distortion Optimization (RDO) post-process stage that conditions the encoded UASTC texture data in the .basis file so it can be more effectively LZ compressed by the end user. More technical details about UASTC integration are [here](https://github.com/BinomialLLC/basis_universal/wiki/UASTC-implementation-details). + +Basis files support non-uniform texture arrays, so cubemaps, volume textures, texture arrays, mipmap levels, video sequences, or arbitrary texture "tiles" can be stored in a single file. The compressor is able to exploit color and pattern correlations across the entire file, so multiple images with mipmaps can be stored very efficiently in a single file. + +The system's bitrate depends on the quality setting and image content, but common usable ETC1S bitrates are .3-1.25 bits/texel. ETC1S .basis files are typically 10-25% smaller than using RDO texture compression of the internal texture data stored in the .basis file followed by LZMA. For UASTC files, the bitrate is fixed at 8bpp, but with RDO post-processing and user-provided LZ compression on the .basis file the effective bitrate can be as low as 2bpp for video or for individual textures approximately 4-6bpp. + +The .basis and .KTX2 transcoders have been fuzz tested using [zzuf](https://www.linux.com/news/fuzz-testing-zzuf). + +So far, we've compiled the code using MSVC 2019, under Ubuntu 18.04 and 20 x64 using cmake with either clang 3.8 or gcc 5.4, and emscripten 1.35 to asm.js. (Be sure to use this version or later of emcc, as earlier versions fail with internal errors/exceptions during compilation.) + +Basis Universal supports "skip blocks" in ETC1S compressed texture arrays, which makes it useful for basic [compressed texture video](http://gamma.cs.unc.edu/MPTC/) applications. Note that Basis Universal is still at heart a GPU texture compression system, not a dedicated video codec, so bitrates will be larger than even MPEG1. +1/10/21 release notes: + +For v1.13, we've added numerous ETC1S encoder optimizations designed to greatly speed up single threaded encoding time, as well as greatly reducing overall CPU utilization when multithreading is enabled. For benchmarking, we're using "-q 128 -no_multithreading -mip_fast". The encoder now uses approximately 1/3rd as much total CPU time for the same PSNR. The encoder can now optionally utilize SSE 4.1 - see the "-no_sse" command line option. + +[Release Notes](https://github.com/BinomialLLC/basis_universal/wiki/Release-Notes) + +### The first texture (and possibly image/video) compression codec developed without "Lena" + +We retired Lena years ago. No testing is done with this image: + +https://www.losinglena.com/ + +### Quick Introduction + +Probably the most important concept to understand about Basis Universal before using it: The system supports **two** very different universal texture modes: The original "ETC1S" mode is low/medium quality, but the resulting file sizes are very small because the system has built-in compression for ETC1S texture format files. This is the command line encoding tool's default mode. ETC1S textures work best on images, photos, map data, or albedo/specular/etc. textures, but don't work as well on normal maps. + +There's the second "UASTC" mode, which is significantly higher quality (comparable to BC7 and highest quality LDR ASTC 4x4), and is usable on all texture types including complex normal maps. UASTC mode purposely does not have built-in file compression like ETC1S mode does, so the resulting files are quite large (8-bits/texel - same as BC7) compared to ETC1S mode. The UASTC encoder has an optional Rate Distortion Optimization (RDO) encoding mode (implemented as a post-process over the encoded UASTC texture data), which conditions the output texture data in a way that results in better lossless compression when UASTC .basis files are compressed with Deflate/Zstd, etc. In UASTC mode, you must losslessly compress .basis files yourself. .KTX2 files have built-in lossless compression support using [Zstandard](https://facebook.github.io/zstd/), which is used by default on UASTC textures. + +Basis Universal is not an image compression codec, but a GPU texture compression codec. It can be used just like an image compression codec, but that's not the only use case. Here's a [good intro](http://renderingpipeline.com/2012/07/texture-compression/) to GPU texture compression. If you're looking to primarily use the system as an image compression codec on sRGB photographic content, use the default ETC1S mode, because it has built-in compression. + +**The "-q X" option controls the output quality in ETC1S mode.** The default is quality level 128. "-q 255" will increase quality quite a bit. If you want even higher quality, try "-max_selectors 16128 -max_endpoints 16128" instead of -q. -q internally tries to set the codebook sizes (or the # of quantization intervals for endpoints/selectors) for you. You need to experiment with the quality level on your content. + +For tangent space normal maps, you should separate X into RGB and Y into Alpha, and provide the compressor with 32-bit/pixel input images. Or use the "-separate_rg_to_color_alpha" command line option which does this for you. The internal texture format that Basis Universal uses (ETC1S) doesn't handle tangent space normal maps encoded into RGB well. You need to separate the channels and recover Z in the pixel shader using z=sqrt(1-x^2-y^2). + +### License and 3rd party code dependencies + +Detailed legal, license, and IP information is [here](https://github.com/BinomialLLC/basis_universal/wiki/Legal-IP-License-Information). Basis Universal itself uses the Apache 2.0 licenses, but it also utilizes some optional BSD code (Zstandard). The supported texture formats are [open Khronos Group standards](https://www.khronos.org/registry/DataFormat/specs/1.1/dataformat.1.1.html). + +All C/C++ code dependencies are present inside the Basis Universal repo itself to simplify building. + +The encoder optionally uses Zstandard's single source file compressor (in zstd/zstd.c) to support compressing supercompressed KTX2 files. The stand-alone transcoder (in the "transcoder" directory) is a single .cpp source file library which has no 3rd party code dependencies apart from zstd/zstddeclib.c, which is also technically optional. It's only used for decompressing UASTC KTX2 files that use Zstandard. + +### Command Line Compression Tool + +The command line tool used to create, validate, and transcode/unpack .basis/.KTX2 files is named "basisu". Run basisu without any parameters for help. + +The library and command line tool have no other 3rd party dependencies (that are not already in the repo), so it's pretty easy to build. + +To build basisu (without SSE 4.1 support - the default): + +``` +cmake CMakeLists.txt +make +``` +To build with SSE 4.1 support on x86/x64 systems (encoding is roughly 15-30% faster): +``` +cmake -D SSE=TRUE CMakeLists.txt +make +``` + +For Visual Studio 2019, you can now either use the CMakeLists.txt file or the included `basisu.sln` file. Earlier versions of Visual Studio (particularly 2017) should work but aren't actively tested. We develop with the most up to date version of 2019. + +To compress a sRGB PNG/BMP/TGA/JPEG image to an ETC1S .KTX2 file: + +`basisu -ktx2 x.png` + +To compress a sRGB PNG/BMP/TGA/JPEG image to an UASTC .KTX2 file: + +`basisu -ktx2 -uastc x.png` + +To compress a sRGB PNG/BMP/TGA/JPEG image to an RDO UASTC .KTX2 file with mipmaps: + +`basisu -ktx2 -uastc -uastc_rdo_l 1.0 -mipmap x.png` + +To compress a sRGB PNG/BMP/TGA/JPEG image to an ETC1S .basis file: + +`basisu x.png` + +To compress a image to a higher quality UASTC .basis file: + +`basisu -uastc -uastc_level 2 x.png` + +To compress a image to a higher quality UASTC .basis file with RDO post processing, so the .basis file is more compressible: + +`basisu -uastc -uastc_level 2 -uastc_rdo_l .75 x.png` + +-uastc_level X ranges from 0-4 and controls the UASTC encoder's performance vs. quality tradeoff. Level 0 is very fast, but low quality, level 2 is the default quality, while level 3 is the highest practical quality. Level 4 is impractically slow, but highest quality. + +-uastc_rdo_l X controls the rate distortion stage's quality setting. The lower this value, the higher the quality, but the larger the compressed file size. Good values to try are between .2-3.0. The default is 1.0. RDO post-processing is currently pretty slow, but we'll be optimizing it over time. + +UASTC texture video is supported and has been tested. In RDO mode with 7zip LZMA, we've seen average bitrates between 1-2 bpp. ETC1S mode is recommended for texture video, which gets bitrates around .25-.3 bpp. + +Note that basisu defaults to sRGB colorspace metrics. If the input is a normal map, or some other type of non-sRGB (non-photographic) texture content, be sure to use -linear to avoid extra unnecessary artifacts. (Note: Currently, UASTC mode always uses linear colorspace metrics. sRGB and angulate metrics are comming soon.) + +To add automatically generated mipmaps to the .basis file, at a higher than default quality level (which ranges from [1,255]): + +`basisu -mipmap -q 190 x.png` + +There are several mipmap options that allow you to change the filter kernel, the filter colorspace for the RGB channels (linear vs. sRGB), the smallest mipmap dimension, etc. The tool also supports generating cubemap files, 2D/cubemap texture arrays, etc. + +To create a slightly higher quality ETC1S .basis file (one with better codebooks) at the default quality level (128) - note this is much slower to encode: + +`basisu -comp_level 2 x.png` + +On some rare images (ones with blue sky gradients come to bind), you may need to increase the ETC1S `-comp_level` setting. This controls the amount of overall effort the encoder uses to optimize the ETC1S codebooks (palettes) and compressed data stream. Higher comp_level's are *significantly* slower, and shouldn't be used unless necessary: + +`basisu -ktx2 x.png -comp_level 5 -q 255` + +Or try: +`basisu -ktx2 x.png -comp_level 5 -max_endpoints 16128 -max_selectors 16128` + +Note `-comp_level`'s 3-4 are almost as good as 5 and are a lot faster. + +The compressor is multithreaded by default, but this can be disabled using the `-no_multithreading` command line option. The transcoder is currently single threaded although it supports multithreading decompression of multiple texture slices in parallel. + +### Unpacking .basis/.KTX2 files to .PNG/.KTX files + +You can either use the command line tool or [call the transcoder directly](https://github.com/BinomialLLC/basis_universal/wiki/How-to-Use-and-Configure-the-Transcoder) from JavaScript or C/C++ code to decompress .basis/.KTX2 files to GPU texture data or uncompressed images. + +To use the command line tool to unpack a .basis or .KTX2 file to multiple .png/.ktx files: + +`basisu x.basis` + +Use the `-no_ktx` and `-etc1_only` options to unpack to less files. `-info` and `-validate` will just display file information and not output any files. The output .KTX1 files are currently in the KTX1 file format, not KTX2. + +The mipmapped or cubemap .KTX files will be in a wide variety of compressed GPU texture formats (PVRTC1 4bpp, ETC1-2, BC1-5, BC7, etc.), and to my knowledge there is no single .KTX viewer tool that correctly and reliably supports every GPU texture format that we support. BC1-5 and BC7 files are viewable using AMD's Compressonator, ETC1/2 using Mali's Texture Compression Tool, and PVRTC1 using Imagination Tech's PVRTexTool. Links: + +[Mali Texture Compression Tool](https://developer.arm.com/tools-and-software/graphics-and-gaming/graphics-development-tools/mali-texture-compression-tool) + +[Compressonator](https://gpuopen.com/gaming-product/compressonator/) + +[PVRTexTool](https://www.imgtec.com/developers/powervr-sdk-tools/pvrtextool/) + +After compression, the compressor transcodes all slices in the output .basis file to validate that the file decompresses correctly. It also validates all header, compressed data, and slice data CRC16's. + +For best quality, you must **supply basisu with original uncompressed source images**. Any other type of lossy compression applied before basisu (including ETC1/BC1-5, BC7, JPEG, etc.) will cause multi-generational artifacts to appear in the final output textures. + +For the maximum possible achievable ETC1S mode quality with the current format and encoder (completely ignoring encoding speed!), use: + +`basisu x.png -comp_level 5 -max_endpoints 16128 -max_selectors 16128 -no_selector_rdo -no_endpoint_rdo` + +Level 5 is extremely slow, so unless you have a very powerful machine, levels 1-4 are recommended. + +Note that "-no_selector_rdo -no_endpoint_rdo" are optional. Using them hurts rate distortion performance, but increases quality. An alternative is to use -selector_rdo_thresh X and -endpoint_rdo_thresh, with X ranging from [1,2] (higher=lower quality/better compression - see the tool's help text). + +To compress small video sequences, say using tools like ffmpeg and VirtualDub: + +`basisu -comp_level 2 -tex_type video -stats -debug -multifile_printf "pic%04u.png" -multifile_num 200 -multifile_first 1 -max_selectors 16128 -max_endpoints 16128 -endpoint_rdo_thresh 1.05 -selector_rdo_thresh 1.05` + +For video, the more cores your machine has, the better. Basis is intended for smaller videos of a few dozen seconds or so. If you are very patient and have a Threadripper or Xeon workstation, you should be able to encode up to a few thousand 720P frames. The "webgl_videotest" directory contains a very simple video viewer. +For texture video, use -comp_level 2 or 3. The default is 1, which isn't quite good enough for texture video. Higher comp_level's result in reduced ETC1S artifacts. + +The .basis file will contain multiple images (all using the same global codebooks), which you can retrieve using the transcoder's image API. The system now supports [conditional replenisment](https://en.wikipedia.org/wiki/MPEG-1) (CR, or "skip blocks"). CR can reduce the bitrate of some videos (highly dependent on how dynamic the content is) by over 50%. For videos using CR, the images must be requested from the transcoder in sequence from first to last, and random access is only allowed to I-Frames. + +If you are doing rate distortion comparisons vs. other similar systems, be sure to experiment with increasing the endpoint RDO threshold (-endpoint_rdo_thresh X). This setting controls how aggressively the compressor's backend will combine together nearby blocks so they use the same block endpoint codebook vectors, for better coding efficiency. X defaults to a modest 1.5, which means the backend is allowed to increase the overall color distance by 1.5x while searching for merge candidates. The higher this setting, the better the compression, with the tradeoff of more block artifacts. Settings up to ~2.25 can work well, and make the codec more competitive. "-endpoint_rdo_thresh 1.75" is a good setting on many textures. + +For video, level 1 should result in decent results on most clips. For less banding, level 2 can make a big difference. This is still an active area of development, and quality/encoding perf. will improve over time. + +To control the ETC1S encoder's quality vs. encoding speed tradeoff, see [ETC1S Compression Effort Levels](https://github.com/BinomialLLC/basis_universal/wiki/ETC1S-Compression-Effort-Levels). + +### More Examples + +`basisu x.png`\ +Compress sRGB image x.png to a ETC1S format x.basis file using default settings (multiple filenames OK). ETC1S format files are typically very small on disk (around .5-1.5 bits/texel). + +`basisu -uastc x.png`\ +Compress image x.png to a UASTC format x.basis file using default settings (multiple filenames OK). UASTC files are the same size as BC7 on disk (8-bpp). Be sure to compress UASTC .basis files yourself using Deflate, zstd, etc. To increase .basis file compressibility (trading off quality for smaller compressed files) use the "-uastc_rdo_q X" command line parameter. + +`basisu -q 255 x.png`\ +Compress sRGB image x.png to x.basis at max quality level achievable without manually setting the codebook sizes (multiple filenames OK) + +`basisu x.basis`\ +Unpack x.basis to PNG/KTX files (multiple filenames OK) + +`basisu -validate -file x.basis`\ +Validate x.basis (check header, check file CRC's, attempt to transcode all slices) + +`basisu -unpack -file x.basis`\ +Validates, transcodes and unpacks x.basis to mipmapped .KTX and RGB/A .PNG files (transcodes to all supported GPU texture formats) + +`basisu -q 255 -file x.png -mipmap -debug -stats`\ +Compress sRGB x.png to x.basis at quality level 255 with compressor debug output/statistics + +`basisu -linear -max_endpoints 16128 -max_selectors 16128 -file x.png`\ +Compress non-sRGB x.png to x.basis using the largest supported manually specified codebook sizes + +`basisu -linear -global_sel_pal -no_hybrid_sel_cb -file x.png`\ +Compress a non-sRGB image, use virtual selector codebooks for improved compression (but slower encoding) + +`basisu -linear -global_sel_pal -file x.png`\ +Compress a non-sRGB image, use hybrid selector codebooks for slightly improved compression (but slower encoding) + +`basisu -tex_type video -comp_level 2 -framerate 20 -multifile_printf "x%02u.png" -multifile_first 1 -multifile_count 20 -selector_rdo_thresh 1.05 -endpoint_rdo_thresh 1.05`\ +Compress a 20 sRGB source image video sequence (x01.png, x02.png, x03.png, etc.) to x01.basis + +`basisu -comp_level 2 -q 255 -file x.png -mipmap -y_flip`\ +Compress a mipmapped x.basis file from an sRGB image named x.png, Y flip each source image, set encoder to level 2 for slightly higher quality (but slower encoding). + +### WebGL test + +The "WebGL" directory contains three simple WebGL demos that use the transcoder and compressor compiled to wasm with [emscripten](https://emscripten.org/). See more details [here](webgl/README.md). + +![Screenshot of 'texture' example running in a browser.](webgl/texture/preview.png) +![Screenshot of 'gltf' example running in a browser.](webgl/gltf/preview.png) +![Screenshot of 'encode_test' example running in a browser.](webgl/encode_test/preview.png) + +### Installation using the vcpkg dependency manager + +You can download and install Basis Universal using the [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager: + + git clone https://github.com/Microsoft/vcpkg.git + cd vcpkg + ./bootstrap-vcpkg.sh + ./vcpkg integrate install + vcpkg install basisu + +The Basis Universal port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. + +### WebAssembly Support Using Emscripten + +Both the transcoder and now the compressor (as of 12/17/2020) may be compiled using emscripten to WebAssembly and used on the web. Currently, multithreading is not supported by the compressor when compiled with emscripten. A simple Web compression demo is in webgl/encode_test. All compressor features, including texture video, are supported and fully exposed. + +To enable compression support compile the JavaScript wrappers in `webgl/transcoding/basis_wrappers.cpp` with `BASISU_SUPPORT_ENCODING` set to 1. See the webgl/encoding directory. + +### Low-level C++ encoder API + +You can call the encoder directly, instead of using the command line tool. We'll be adding documentation and some examples by the end of the year. For now, some important notes: + +First, ALWAYS call ```basisu::basisu_encoder_init()``` to initialize the library. Otherwise, you'll get undefined behavior or black textures. + +Create a job pool, fill in the ```basis_compress_params``` struct, then call ```basisu::basis_compressor::init()```, then ```basisu::basis_compressor::process()```. Like this for UASTC: + +``` +bool test() +{ + basisu_encoder_init(); + + image img; + if (!load_image("test.png", img)) + { + printf("Can't load image\n"); + return false; + } + + basis_compressor_params basisCompressorParams; + + basisCompressorParams.m_source_images.push_back(img); + basisCompressorParams.m_perceptual = false; + basisCompressorParams.m_mip_srgb = false; + + basisCompressorParams.m_write_output_basis_files = true; + basisCompressorParams.m_out_filename = "test.basis"; + + basisCompressorParams.m_uastc = true; + basisCompressorParams.m_rdo_uastc_multithreading = false; + basisCompressorParams.m_multithreading = false; + basisCompressorParams.m_debug = true; + basisCompressorParams.m_status_output = true; + basisCompressorParams.m_compute_stats = true; + + basisu::job_pool jpool(1); + basisCompressorParams.m_pJob_pool = &jpool; + + basisu::basis_compressor basisCompressor; + basisu::enable_debug_printf(true); + + bool ok = basisCompressor.init(basisCompressorParams); + if (ok) + { + basisu::basis_compressor::error_code result = basisCompressor.process(); + + if (result == basisu::basis_compressor::cECSuccess) + printf("Success\n"); + else + { + printf("Failure\n"); + ok = false; + } + } + else + printf("Failure\n"); + return ok; +} +``` + +The command line tool uses this API too, so you can always look at that to see what it does given a set of command line options. + +### Repository Licensing with REUSE + +The repository has been updated to be compliant with the REUSE licenese +checking tool (https://reuse.software/). This was done by adding the complete +text of all licenses used under the LICENSES/ directory and adding the +.reuse/dep5 file which specifies licenses for files which don't contain +them in a form which can be automatically parse by the reuse tool. REUSE +does not alter copyrights or licenses, simply captures information about +licensing to ensure the entire repository has explicit licensing information. + +To ensure continued REUSE compliance, run `reuse lint` at the root of +a clean, checked-out repository periodically, or run it during CI tests +before any build artifacts have been created. + diff --git a/ktx/external/basisu/appveyor.yml b/ktx/external/basisu/appveyor.yml new file mode 100644 index 0000000..d790c2e --- /dev/null +++ b/ktx/external/basisu/appveyor.yml @@ -0,0 +1,48 @@ +--- + +image: + - macos + - Ubuntu2004 + - Visual Studio 2019 + +configuration: Release + +environment: + APPVEYOR_YML_DISABLE_PS_LINUX: true + +install: +- sh: | + if [ "$(uname)" != "Darwin" ]; then + sudo apt-get update -y + sudo apt-get install -y dos2unix recode + fi + +build_script: + - ps: | + New-Item -Path . -Name "build" -ItemType "directory" + cd build + cmake --version + cmake ../ -DCMAKE_BUILD_TYPE:STRING="$env:CONFIGURATION" + cmake --build . --config $env:CONFIGURATION + cd ../ + - sh: | + mkdir build + cd build + cmake --version + cmake ../ -DCMAKE_BUILD_TYPE:STRING="${CONFIGURATION}" + cmake --build . --config ${CONFIGURATION} + cd ../ + +test_script: + - sh: | + if [ "$(uname)" != "Darwin" ]; then + bash ./format.sh + fi + +artifacts: + # Linux + - path: bin/basisu + # MacOS + - path: bin_osx/basisu + # Windows + - path: bin\$(configuration)\basisu.exe diff --git a/ktx/external/basisu/basisu.sln b/ktx/external/basisu/basisu.sln new file mode 100644 index 0000000..dfe1a40 --- /dev/null +++ b/ktx/external/basisu/basisu.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.202 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basisu", "basisu.vcxproj", "{59586A07-8E7E-411D-BC3D-387E039AA423}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {59586A07-8E7E-411D-BC3D-387E039AA423}.Debug|x64.ActiveCfg = Debug|x64 + {59586A07-8E7E-411D-BC3D-387E039AA423}.Debug|x64.Build.0 = Debug|x64 + {59586A07-8E7E-411D-BC3D-387E039AA423}.Debug|x86.ActiveCfg = Debug|Win32 + {59586A07-8E7E-411D-BC3D-387E039AA423}.Debug|x86.Build.0 = Debug|Win32 + {59586A07-8E7E-411D-BC3D-387E039AA423}.Release|x64.ActiveCfg = Release|x64 + {59586A07-8E7E-411D-BC3D-387E039AA423}.Release|x64.Build.0 = Release|x64 + {59586A07-8E7E-411D-BC3D-387E039AA423}.Release|x86.ActiveCfg = Release|Win32 + {59586A07-8E7E-411D-BC3D-387E039AA423}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5E583429-7830-4B3A-9DDE-F01B115CE0D8} + EndGlobalSection +EndGlobal diff --git a/ktx/external/basisu/basisu.vcxproj b/ktx/external/basisu/basisu.vcxproj new file mode 100644 index 0000000..f3fa203 --- /dev/null +++ b/ktx/external/basisu/basisu.vcxproj @@ -0,0 +1,234 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {59586A07-8E7E-411D-BC3D-387E039AA423} + basisu + 10.0 + + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + MultiByte + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)\bin\ + + + $(SolutionDir)\bin\ + + + $(SolutionDir)\bin\ + + + $(SolutionDir)\bin\ + $(ProjectName)D + + + + Level4 + Disabled + true + true + OpenCL + _MBCS;%(PreprocessorDefinitions);BASISU_SUPPORT_SSE=1;BASISU_SUPPORT_OPENCL=1 + StreamingSIMDExtensions + + + Console + OpenCL\lib + opencl.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + Level4 + Disabled + true + OpenCL + true + true + _MBCS;%(PreprocessorDefinitions);BASISU_SUPPORT_SSE=1;BASISU_SUPPORT_OPENCL=1 + + + Console + OpenCL\lib + opencl64.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + Level4 + MaxSpeed + true + true + true + OpenCL + NDEBUG;_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions);BASISU_SUPPORT_SSE=1;BASISU_SUPPORT_OPENCL=1 + false + AnySuitable + StreamingSIMDExtensions + Fast + false + true + + + true + true + Console + OpenCL\lib + opencl.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + Level4 + Full + true + true + OpenCL + NDEBUG;_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions);BASISU_SUPPORT_SSE=1;BASISU_SUPPORT_OPENCL=1 + false + true + AnySuitable + false + Fast + true + Speed + + + true + true + Console + OpenCL\lib + opencl64.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ktx/external/basisu/basisu.vcxproj.filters b/ktx/external/basisu/basisu.vcxproj.filters new file mode 100644 index 0000000..7c9eabc --- /dev/null +++ b/ktx/external/basisu/basisu.vcxproj.filters @@ -0,0 +1,201 @@ + + + + + + transcoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + + + transcoder + + + transcoder + + + transcoder + + + transcoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder + + + encoder\cppspmd + + + encoder\cppspmd + + + encoder\cppspmd + + + encoder\cppspmd + + + encoder\cppspmd + + + transcoder + + + transcoder + + + transcoder + + + encoder + + + encoder + + + encoder + + + + + transcoder + + + transcoder + + + transcoder + + + transcoder + + + transcoder + + + transcoder + + + transcoder + + + transcoder + + + encoder + + + + + {7a54aaad-1d10-4bdf-b8e9-c14ed2263ed8} + + + {518dd5c5-a7e1-4e79-8bb4-253e2d540c2c} + + + {ab12ac82-9c39-494d-a36b-129dd1b2dec5} + + + \ No newline at end of file diff --git a/ktx/external/basisu/basisu_tool.cpp b/ktx/external/basisu/basisu_tool.cpp new file mode 100644 index 0000000..13ed340 --- /dev/null +++ b/ktx/external/basisu/basisu_tool.cpp @@ -0,0 +1,4489 @@ +// basisu_tool.cpp +// Copyright (C) 2019-2022 Binomial LLC. All Rights Reserved. +// 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 _MSC_VER +// For sprintf(), strcpy() +#define _CRT_SECURE_NO_WARNINGS (1) +#endif + +#include "transcoder/basisu.h" +#include "transcoder/basisu_transcoder_internal.h" +#include "encoder/basisu_enc.h" +#include "encoder/basisu_etc.h" +#include "encoder/basisu_gpu_texture.h" +#include "encoder/basisu_frontend.h" +#include "encoder/basisu_backend.h" +#include "encoder/basisu_comp.h" +#include "transcoder/basisu_transcoder.h" +#include "encoder/basisu_ssim.h" +#include "encoder/basisu_opencl.h" + +#define MINIZ_HEADER_FILE_ONLY +#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES +#include "encoder/basisu_miniz.h" + +// Set BASISU_CATCH_EXCEPTIONS if you want exceptions to crash the app, otherwise main() catches them. +#ifndef BASISU_CATCH_EXCEPTIONS + #define BASISU_CATCH_EXCEPTIONS 0 +#endif + +using namespace basisu; +using namespace buminiz; + +#define BASISU_TOOL_VERSION "1.16.3" + +enum tool_mode +{ + cDefault, + cCompress, + cValidate, + cInfo, + cUnpack, + cCompare, + cVersion, + cBench, + cCompSize, + cTest, + cSplitImage, + cCombineImages +}; + +static void print_usage() +{ + printf("\nUsage: basisu filename [filename ...] \n"); + + puts("\n" + "The default mode is compression of one or more PNG/BMP/TGA/JPG files to a .basis file. Alternate modes:\n" + " -unpack: Use transcoder to unpack .basis file to one or more .ktx/.png files\n" + " -validate: Validate and display information about a .basis file\n" + " -info: Display high-level information about a .basis file\n" + " -compare: Compare two PNG/BMP/TGA/JPG images specified with -file, output PSNR and SSIM statistics and RGB/A delta images\n" + " -version: Print basisu version and exit\n" + "Unless an explicit mode is specified, if one or more files have the .basis extension this tool defaults to unpack mode.\n" + "\n" + "Important: By default, the compressor assumes the input is in the sRGB colorspace (like photos/albedo textures).\n" + "If the input is NOT sRGB (like a normal map), be sure to specify -linear for less artifacts. Depending on the content type, some experimentation may be needed.\n" + "\n" + "Filenames prefixed with a @ symbol are read as filename listing files. Listing text files specify which actual filenames to process (one filename per line).\n" + "\n" + "Options:\n" + " -opencl: Enable OpenCL usage\n" + " -opencl_serialize: Serialize all calls to the OpenCL driver (to work around buggy drivers, only useful with -parallel)\n" + " -parallel: Compress multiple textures simumtanously (one per thread), instead of one at a time. Compatible with OpenCL mode. This is much faster, but in OpenCL mode the driver is pushed harder, and the CLI output will be jumbled.\n" + " -ktx2: Write .KTX2 ETC1S/UASTC files instead of .basis files. By default, UASTC files will be compressed using Zstandard unless -ktx2_no_zstandard is specified.\n" + " -ktx2_no_zstandard: Don't compress UASTC texture data using Zstandard, store it uncompressed instead.\n" + " -ktx2_zstandard_level X: Set ZStandard compression level to X (see Zstandard documentation, default level is 6)\n" + " -ktx2_animdata_duration X: Set KTX2animData duration field to integer value X (only valid/useful for -tex_type video, default is 1)\n" + " -ktx2_animdata_timescale X: Set KTX2animData timescale field to integer value X (only valid/useful for -tex_type video, default is 15)\n" + " -ktx2_animdata_loopcount X: Set KTX2animData loopcount field to integer value X (only valid/useful for -tex_type video, default is 0)\n" + " -file filename.png/bmp/tga/jpg/qoi: Input image filename, multiple images are OK, use -file X for each input filename (prefixing input filenames with -file is optional)\n" + " -alpha_file filename.png/bmp/tga/jpg/qoi: Input alpha image filename, multiple images are OK, use -file X for each input filename (must be paired with -file), images converted to REC709 grayscale and used as input alpha\n" + " -multifile_printf: printf() format strint to use to compose multiple filenames\n" + " -multifile_first: The index of the first file to process, default is 0 (must specify -multifile_printf and -multifile_num)\n" + " -multifile_num: The total number of files to process.\n" + " -q X: Set ETC1S quality level, 1-255, default is 128, lower=better compression/lower quality/faster, higher=less compression/higher quality/slower, default is 128. For even higher quality, use -max_endpoints/-max_selectors.\n" + " -linear: Use linear colorspace metrics (instead of the default sRGB), and by default linear (not sRGB) mipmap filtering.\n" + " -output_file filename: Output .basis/.ktx filename\n" + " -output_path: Output .basis/.ktx files to specified directory.\n" + " -debug: Enable codec debug print to stdout (slightly slower).\n" + " -verbose: Same as -debug (debug output to stdout).\n" + " -debug_images: Enable codec debug images (much slower).\n" + " -stats: Compute and display image quality metrics (slightly slower).\n" + " -tex_type <2d, 2darray, 3d, video, cubemap>: Set Basis file header's texture type field. Cubemap arrays require multiples of 6 images, in X+, X-, Y+, Y-, Z+, Z- order, each image must be the same resolutions.\n" + " 2d=arbitrary 2D images, 2darray=2D array, 3D=volume texture slices, video=video frames, cubemap=array of faces. For 2darray/3d/cubemaps/video, each source image's dimensions and # of mipmap levels must be the same.\n" + " For video, the .basis file will be written with the first frame being an I-Frame, and subsequent frames being P-Frames (using conditional replenishment). Playback must always occur in order from first to last image.\n" + " -framerate X: Set framerate in .basis header to X/frames sec.\n" + " -individual: Process input images individually and output multiple .basis/.ktx2 files (not as a texture array - this is now the default as of v1.16)\n" + " -tex_array: Process input images as a single texture array and write a single .basis/.ktx2 file (the former default before v1.16)\n" + " -comp_level X: Set ETC1S encoding speed vs. quality tradeoff. Range is 0-6, default is 1. Higher values=MUCH slower, but slightly higher quality. Higher levels intended for videos. Use -q first!\n" + " -fuzz_testing: Use with -validate: Disables CRC16 validation of file contents before transcoding\n" + "\nUASTC options:\n" + " -uastc: Enable UASTC texture mode, instead of the default ETC1S mode. Significantly higher texture quality, but larger files. (Note that UASTC .basis files must be losslessly compressed by the user.)\n" + " -uastc_level: Set UASTC encoding level. Range is [0,4], default is 2, higher=slower but higher quality. 0=fastest/lowest quality, 3=slowest practical option, 4=impractically slow/highest achievable quality\n" + " -uastc_rdo_l X: Enable UASTC RDO post-processing and set UASTC RDO quality scalar (lambda) to X. Lower values=higher quality/larger LZ\n" + " compressed files, higher values=lower quality/smaller LZ compressed files. Good range to try is [.25-10].\n" + " Note: Previous versons used the -uastc_rdo_q option, which was removed because the RDO algorithm was changed.\n" + " -uastc_rdo_d X: Set UASTC RDO dictionary size in bytes. Default is 4096, max is 65536. Lower values=faster, but less compression.\n" + " -uastc_rdo_b X: Set UASTC RDO max smooth block error scale. Range is [1,300]. Default is 10.0, 1.0=disabled. Larger values suppress more artifacts (and allocate more bits) on smooth blocks.\n" + " -uastc_rdo_s X: Set UASTC RDO max smooth block standard deviation. Range is [.01,65536]. Default is 18.0. Larger values expand the range of blocks considered smooth.\n" + " -uastc_rdo_f: Don't favor simpler UASTC modes in RDO mode.\n" + " -uastc_rdo_m: Disable RDO multithreading (slightly higher compression, deterministic).\n" + "\n" + "More options:\n" + " -test: Run an automated ETC1S/UASTC encoding and transcoding test. Returns EXIT_FAILURE if any failures\n" + " -test_dir: Optional directory of test files. Defaults to \"../test_files\".\n" + " -max_endpoints X: Manually set the max number of color endpoint clusters from 1-16128, use instead of -q\n" + " -max_selectors X: Manually set the max number of color selector clusters from 1-16128, use instead of -q\n" + " -y_flip: Flip input images vertically before compression\n" + " -normal_map: Tunes codec parameters for better quality on normal maps (linear colorspace metrics, linear mipmap filtering, no selector RDO, no sRGB)\n" + " -no_alpha: Always output non-alpha basis files, even if one or more inputs has alpha\n" + " -force_alpha: Always output alpha basis files, even if no inputs has alpha\n" + " -separate_rg_to_color_alpha: Separate input R and G channels to RGB and A (for tangent space XY normal maps)\n" + " -swizzle rgba: Specify swizzle for the 4 input color channels using r, g, b and a (the -separate_rg_to_color_alpha flag is equivalent to rrrg)\n" + " -renorm: Renormalize each input image before any further processing/compression\n" + " -no_multithreading: Disable multithreading\n" + " -max_threads X: Use at most X threads total when multithreading is enabled (this includes the main thread)\n" + " -no_ktx: Disable KTX writing when unpacking (faster, less output files)\n" + " -ktx_only: Only write KTX files when unpacking (faster, less output files)\n" + " -write_out: Write 3dfx OUT files when unpacking FXT1 textures\n" + " -etc1_only: Only unpack to ETC1, skipping the other texture formats during -unpack\n" + " -disable_hierarchical_endpoint_codebooks: Disable hierarchical endpoint codebook usage, slower but higher quality on some compression levels\n" + " -compare_ssim: Compute and display SSIM of image comparison (slow)\n" + " -bench: UASTC benchmark mode, for development only\n" + " -resample X Y: Resample all input textures to XxY pixels using a box filter\n" + " -resample_factor X: Resample all input textures by scale factor X using a box filter\n" + " -no_sse: Forbid all SSE instruction set usage\n" + " -validate_etc1s: Validate internal ETC1S compressor's data structures during compression (slower, intended for development).\n" + "\n" + "Mipmap generation options:\n" + " -mipmap: Generate mipmaps for each source image\n" + " -mip_srgb: Convert image to linear before filtering, then back to sRGB\n" + " -mip_linear: Keep image in linear light during mipmap filtering (i.e. do not convert to/from sRGB for filtering purposes)\n" + " -mip_scale X: Set mipmap filter kernel's scale, lower=sharper, higher=more blurry, default is 1.0\n" + " -mip_filter X: Set mipmap filter kernel, default is kaiser, filters: box, tent, bell, blackman, catmullrom, mitchell, etc.\n" + " -mip_renorm: Renormalize normal map to unit length vectors after filtering\n" + " -mip_clamp: Use clamp addressing on borders, instead of wrapping\n" + " -mip_fast: Use faster mipmap generation (resample from previous mip, not always first/largest mip level). The default (as of 1/2021)\n" + " -mip_slow: Always resample each mipmap level starting from the largest mipmap. Higher quality, but slower. Opposite of -mip_fast. Was the prior default before 1/2021.\n" + " -mip_smallest X: Set smallest pixel dimension for generated mipmaps, default is 1 pixel\n" + "By default, textures will be converted from sRGB to linear light before mipmap filtering, then back to sRGB (for the RGB color channels) unless -linear is specified.\n" + "You can override this behavior with -mip_srgb/-mip_linear.\n" + "\n" + "Backend endpoint/selector RDO codec options:\n" + " -no_selector_rdo: Disable backend's selector rate distortion optimizations (slightly faster, less noisy output, but lower quality per output bit)\n" + " -selector_rdo_thresh X: Set selector RDO quality threshold, default is 1.25, lower is higher quality but less quality per output bit (try 1.0-3.0)\n" + " -no_endpoint_rdo: Disable backend's endpoint rate distortion optimizations (slightly faster, less noisy output, but lower quality per output bit)\n" + " -endpoint_rdo_thresh X: Set endpoint RDO quality threshold, default is 1.5, lower is higher quality but less quality per output bit (try 1.0-3.0)\n" + "\n" + "Set various fields in the Basis file header:\n" + " -userdata0 X: Set 32-bit userdata0 field in Basis file header to X (X is a signed 32-bit int)\n" + " -userdata1 X: Set 32-bit userdata1 field in Basis file header to X (X is a signed 32-bit int)\n" + "\n" + "Various command line examples:\n" + " basisu x.png : Compress sRGB image x.png to x.basis using default settings (multiple filenames OK, use -tex_array if you want a tex array vs. multiple output files)\n" + " basisu x.basis : Unpack x.basis to PNG/KTX files (multiple filenames OK)\n" + " basisu -file x.png -mipmap -y_flip : Compress a mipmapped x.basis file from an sRGB image named x.png, Y flip each source image\n" + " basisu -validate -file x.basis : Validate x.basis (check header, check file CRC's, attempt to transcode all slices)\n" + " basisu -unpack -file x.basis : Validates, transcodes and unpacks x.basis to mipmapped .KTX and RGB/A .PNG files (transcodes to all supported GPU texture formats)\n" + " basisu -q 255 -file x.png -mipmap -debug -stats : Compress sRGB x.png to x.basis at quality level 255 with compressor debug output/statistics\n" + " basisu -linear -max_endpoints 16128 -max_selectors 16128 -file x.png : Compress non-sRGB x.png to x.basis using the largest supported manually specified codebook sizes\n" + " basisu -comp_level 2 -max_selectors 8192 -max_endpoints 8192 -tex_type video -framerate 20 -multifile_printf \"x%02u.png\" -multifile_first 1 -multifile_count 20 : Compress a 20 sRGB source image video sequence (x01.png, x02.png, x03.png, etc.) to x01.basis\n" + "\n" + "Note: For video use, it's recommended you use a very powerful machine with many cores. Use -comp_level 2 or higher for better codebook\n" + "generation, specify very large codebooks using -max_endpoints and -max_selectors, and reduce the default endpoint RDO threshold\n" + "(-endpoint_rdo_thresh) to around 1.25. Videos may have mipmaps and alpha channels. Videos must always be played back by the transcoder\n" + "in first to last image order.\n" + "Video files currently use I-Frames on the first image, and P-Frames using conditional replenishment on subsequent frames.\n" + "\nCompression level (-comp_level X) details:\n" + " Level 0: Fastest, but has marginal quality and can be brittle on complex images. Avg. Y dB: 35.45\n" + " Level 1: Hierarchical codebook searching, faster ETC1S encoding. 36.87 dB, ~1.4x slower vs. level 0. (This is the default setting.)\n" + " Level 2: Use this or higher for video. Hierarchical codebook searching. 36.87 dB, ~1.4x slower vs. level 0. (This is the v1.12's default setting.)\n" + " Level 3: Full codebook searching. 37.13 dB, ~1.8x slower vs. level 0. (Equivalent the the initial release's default settings.)\n" + " Level 4: Hierarchical codebook searching, codebook k-means iterations. 37.15 dB, ~4x slower vs. level 0\n" + " Level 5: Full codebook searching, codebook k-means iterations. 37.41 dB, ~5.5x slower vs. level 0. (Equivalent to the initial release's -slower setting.)\n" + " Level 6: Full codebook searching, twice as many codebook k-means iterations, best ETC1 endpoint opt. 37.43 dB, ~12x slower vs. level 0\n" + ); +} + +static bool load_listing_file(const std::string &f, basisu::vector &filenames) +{ + std::string filename(f); + filename.erase(0, 1); + + FILE *pFile = nullptr; +#ifdef _WIN32 + fopen_s(&pFile, filename.c_str(), "r"); +#else + pFile = fopen(filename.c_str(), "r"); +#endif + + if (!pFile) + { + error_printf("Failed opening listing file: \"%s\"\n", filename.c_str()); + return false; + } + + uint32_t total_filenames = 0; + + for ( ; ; ) + { + char buf[3072]; + buf[0] = '\0'; + + char *p = fgets(buf, sizeof(buf), pFile); + if (!p) + { + if (ferror(pFile)) + { + error_printf("Failed reading from listing file: \"%s\"\n", filename.c_str()); + + fclose(pFile); + return false; + } + else + break; + } + + std::string read_filename(p); + while (read_filename.size()) + { + if (read_filename[0] == ' ') + read_filename.erase(0, 1); + else + break; + } + + while (read_filename.size()) + { + const char c = read_filename.back(); + if ((c == ' ') || (c == '\n') || (c == '\r')) + read_filename.erase(read_filename.size() - 1, 1); + else + break; + } + + if (read_filename.size()) + { + filenames.push_back(read_filename); + total_filenames++; + } + } + + fclose(pFile); + + printf("Successfully read %u filenames(s) from listing file \"%s\"\n", total_filenames, filename.c_str()); + + return true; +} + +class command_line_params +{ + BASISU_NO_EQUALS_OR_COPY_CONSTRUCT(command_line_params); + +public: + command_line_params() : + m_mode(cDefault), + m_ktx2_mode(false), + m_ktx2_zstandard(true), + m_ktx2_zstandard_level(6), + m_ktx2_animdata_duration(1), + m_ktx2_animdata_timescale(15), + m_ktx2_animdata_loopcount(0), + m_multifile_first(0), + m_multifile_num(0), + m_max_threads(1024), // surely this is high enough + m_individual(true), + m_no_ktx(false), + m_ktx_only(false), + m_write_out(false), + m_etc1_only(false), + m_fuzz_testing(false), + m_compare_ssim(false), + m_bench(false), + m_parallel_compression(false) + { + m_comp_params.m_compression_level = basisu::maximum(0, BASISU_DEFAULT_COMPRESSION_LEVEL - 1); + m_test_file_dir = "../test_files"; + } + + bool parse(int arg_c, const char **arg_v) + { + int arg_index = 1; + while (arg_index < arg_c) + { + const char *pArg = arg_v[arg_index]; + const int num_remaining_args = arg_c - (arg_index + 1); + int arg_count = 1; + +#define REMAINING_ARGS_CHECK(n) if (num_remaining_args < (n)) { error_printf("Error: Expected %u values to follow %s!\n", n, pArg); return false; } + + if (strcasecmp(pArg, "-ktx2") == 0) + { + m_ktx2_mode = true; + } + else if (strcasecmp(pArg, "-ktx2_no_zstandard") == 0) + { + m_ktx2_zstandard = false; + } + else if (strcasecmp(pArg, "-ktx2_zstandard_level") == 0) + { + REMAINING_ARGS_CHECK(1); + m_ktx2_zstandard_level = atoi(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-ktx2_animdata_duration") == 0) + { + REMAINING_ARGS_CHECK(1); + m_ktx2_animdata_duration = atoi(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-ktx2_animdata_timescale") == 0) + { + REMAINING_ARGS_CHECK(1); + m_ktx2_animdata_timescale = atoi(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-ktx2_animdata_loopcount") == 0) + { + REMAINING_ARGS_CHECK(1); + m_ktx2_animdata_loopcount = atoi(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-compress") == 0) + m_mode = cCompress; + else if (strcasecmp(pArg, "-compare") == 0) + m_mode = cCompare; + else if (strcasecmp(pArg, "-split") == 0) + m_mode = cSplitImage; + else if (strcasecmp(pArg, "-combine") == 0) + m_mode = cCombineImages; + else if (strcasecmp(pArg, "-unpack") == 0) + m_mode = cUnpack; + else if (strcasecmp(pArg, "-validate") == 0) + m_mode = cValidate; + else if (strcasecmp(pArg, "-info") == 0) + m_mode = cInfo; + else if (strcasecmp(pArg, "-version") == 0) + m_mode = cVersion; + else if (strcasecmp(pArg, "-compare_ssim") == 0) + m_compare_ssim = true; + else if (strcasecmp(pArg, "-bench") == 0) + m_mode = cBench; + else if (strcasecmp(pArg, "-comp_size") == 0) + m_mode = cCompSize; + else if (strcasecmp(pArg, "-test") == 0) + m_mode = cTest; + else if (strcasecmp(pArg, "-test_dir") == 0) + { + REMAINING_ARGS_CHECK(1); + m_test_file_dir = std::string(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-no_sse") == 0) + { +#if BASISU_SUPPORT_SSE + g_cpu_supports_sse41 = false; +#endif + } + else if (strcasecmp(pArg, "-no_status_output") == 0) + { + m_comp_params.m_status_output = false; + } + else if (strcasecmp(pArg, "-file") == 0) + { + REMAINING_ARGS_CHECK(1); + m_input_filenames.push_back(std::string(arg_v[arg_index + 1])); + arg_count++; + } + else if (strcasecmp(pArg, "-alpha_file") == 0) + { + REMAINING_ARGS_CHECK(1); + m_input_alpha_filenames.push_back(std::string(arg_v[arg_index + 1])); + arg_count++; + } + else if (strcasecmp(pArg, "-multifile_printf") == 0) + { + REMAINING_ARGS_CHECK(1); + m_multifile_printf = std::string(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-multifile_first") == 0) + { + REMAINING_ARGS_CHECK(1); + m_multifile_first = atoi(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-multifile_num") == 0) + { + REMAINING_ARGS_CHECK(1); + m_multifile_num = atoi(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-uastc") == 0) + m_comp_params.m_uastc = true; + else if (strcasecmp(pArg, "-uastc_level") == 0) + { + REMAINING_ARGS_CHECK(1); + + int uastc_level = atoi(arg_v[arg_index + 1]); + + uastc_level = clamp(uastc_level, 0, TOTAL_PACK_UASTC_LEVELS - 1); + + static_assert(TOTAL_PACK_UASTC_LEVELS == 5, "TOTAL_PACK_UASTC_LEVELS==5"); + static const uint32_t s_level_flags[TOTAL_PACK_UASTC_LEVELS] = { cPackUASTCLevelFastest, cPackUASTCLevelFaster, cPackUASTCLevelDefault, cPackUASTCLevelSlower, cPackUASTCLevelVerySlow }; + + m_comp_params.m_pack_uastc_flags &= ~cPackUASTCLevelMask; + m_comp_params.m_pack_uastc_flags |= s_level_flags[uastc_level]; + + arg_count++; + } + else if (strcasecmp(pArg, "-resample") == 0) + { + REMAINING_ARGS_CHECK(2); + m_comp_params.m_resample_width = atoi(arg_v[arg_index + 1]); + m_comp_params.m_resample_height = atoi(arg_v[arg_index + 2]); + arg_count += 2; + } + else if (strcasecmp(pArg, "-resample_factor") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_resample_factor = (float)atof(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-uastc_rdo_l") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_rdo_uastc_quality_scalar = (float)atof(arg_v[arg_index + 1]); + m_comp_params.m_rdo_uastc = true; + arg_count++; + } + else if (strcasecmp(pArg, "-uastc_rdo_d") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_rdo_uastc_dict_size = atoi(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-uastc_rdo_b") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_rdo_uastc_max_smooth_block_error_scale = (float)atof(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-uastc_rdo_s") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_rdo_uastc_smooth_block_max_std_dev = (float)atof(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-uastc_rdo_f") == 0) + m_comp_params.m_rdo_uastc_favor_simpler_modes_in_rdo_mode = false; + else if (strcasecmp(pArg, "-uastc_rdo_m") == 0) + m_comp_params.m_rdo_uastc_multithreading = false; + else if (strcasecmp(pArg, "-linear") == 0) + m_comp_params.m_perceptual = false; + else if (strcasecmp(pArg, "-srgb") == 0) + m_comp_params.m_perceptual = true; + else if (strcasecmp(pArg, "-q") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_quality_level = clamp(atoi(arg_v[arg_index + 1]), BASISU_QUALITY_MIN, BASISU_QUALITY_MAX); + arg_count++; + } + else if (strcasecmp(pArg, "-output_file") == 0) + { + REMAINING_ARGS_CHECK(1); + m_output_filename = arg_v[arg_index + 1]; + arg_count++; + } + else if (strcasecmp(pArg, "-output_path") == 0) + { + REMAINING_ARGS_CHECK(1); + m_output_path = arg_v[arg_index + 1]; + arg_count++; + } + else if ((strcasecmp(pArg, "-debug") == 0) || (strcasecmp(pArg, "-verbose") == 0)) + { + m_comp_params.m_debug = true; + enable_debug_printf(true); + } + else if (strcasecmp(pArg, "-validate_etc1s") == 0) + { + m_comp_params.m_validate_etc1s = true; + } + else if (strcasecmp(pArg, "-validate_output") == 0) + { + m_comp_params.m_validate_output_data = true; + } + else if (strcasecmp(pArg, "-debug_images") == 0) + m_comp_params.m_debug_images = true; + else if (strcasecmp(pArg, "-stats") == 0) + m_comp_params.m_compute_stats = true; + else if (strcasecmp(pArg, "-gen_global_codebooks") == 0) + { + // TODO + } + else if (strcasecmp(pArg, "-use_global_codebooks") == 0) + { + REMAINING_ARGS_CHECK(1); + m_etc1s_use_global_codebooks_file = arg_v[arg_index + 1]; + arg_count++; + } + else if (strcasecmp(pArg, "-comp_level") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_compression_level = atoi(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-slower") == 0) + { + // This option is gone, but we'll do something reasonable with it anyway. Level 4 is equivalent to the original release's -slower, but let's just go to level 2. + m_comp_params.m_compression_level = BASISU_DEFAULT_COMPRESSION_LEVEL + 1; + } + else if (strcasecmp(pArg, "-max_endpoints") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_max_endpoint_clusters = clamp(atoi(arg_v[arg_index + 1]), 1, BASISU_MAX_ENDPOINT_CLUSTERS); + arg_count++; + } + else if (strcasecmp(pArg, "-max_selectors") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_max_selector_clusters = clamp(atoi(arg_v[arg_index + 1]), 1, BASISU_MAX_SELECTOR_CLUSTERS); + arg_count++; + } + else if (strcasecmp(pArg, "-y_flip") == 0) + m_comp_params.m_y_flip = true; + else if (strcasecmp(pArg, "-normal_map") == 0) + { + m_comp_params.m_perceptual = false; + m_comp_params.m_mip_srgb = false; + m_comp_params.m_no_selector_rdo = true; + m_comp_params.m_no_endpoint_rdo = true; + } + else if (strcasecmp(pArg, "-no_alpha") == 0) + m_comp_params.m_check_for_alpha = false; + else if (strcasecmp(pArg, "-force_alpha") == 0) + m_comp_params.m_force_alpha = true; + else if ((strcasecmp(pArg, "-separate_rg_to_color_alpha") == 0) || + (strcasecmp(pArg, "-seperate_rg_to_color_alpha") == 0)) // was mispelled for a while - whoops! + { + m_comp_params.m_swizzle[0] = 0; + m_comp_params.m_swizzle[1] = 0; + m_comp_params.m_swizzle[2] = 0; + m_comp_params.m_swizzle[3] = 1; + } + else if (strcasecmp(pArg, "-swizzle") == 0) + { + REMAINING_ARGS_CHECK(1); + const char *swizzle = arg_v[arg_index + 1]; + if (strlen(swizzle) != 4) + { + error_printf("Swizzle requires exactly 4 characters\n"); + return false; + } + for (int i=0; i<4; ++i) + { + if (swizzle[i] == 'r') + m_comp_params.m_swizzle[i] = 0; + else if (swizzle[i] == 'g') + m_comp_params.m_swizzle[i] = 1; + else if (swizzle[i] == 'b') + m_comp_params.m_swizzle[i] = 2; + else if (swizzle[i] == 'a') + m_comp_params.m_swizzle[i] = 3; + else + { + error_printf("Swizzle must be one of [rgba]"); + return false; + } + } + arg_count++; + } + else if (strcasecmp(pArg, "-renorm") == 0) + m_comp_params.m_renormalize = true; + else if (strcasecmp(pArg, "-no_multithreading") == 0) + { + m_comp_params.m_multithreading = false; + } + else if (strcasecmp(pArg, "-parallel") == 0) + { + m_parallel_compression = true; + } + else if (strcasecmp(pArg, "-max_threads") == 0) + { + REMAINING_ARGS_CHECK(1); + m_max_threads = atoi(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-mipmap") == 0) + m_comp_params.m_mip_gen = true; + else if (strcasecmp(pArg, "-no_ktx") == 0) + m_no_ktx = true; + else if (strcasecmp(pArg, "-ktx_only") == 0) + m_ktx_only = true; + else if (strcasecmp(pArg, "-write_out") == 0) + m_write_out = true; + else if (strcasecmp(pArg, "-etc1_only") == 0) + m_etc1_only = true; + else if (strcasecmp(pArg, "-disable_hierarchical_endpoint_codebooks") == 0) + m_comp_params.m_disable_hierarchical_endpoint_codebooks = true; + else if (strcasecmp(pArg, "-opencl") == 0) + { + m_comp_params.m_use_opencl = true; + } + else if (strcasecmp(pArg, "-opencl_serialize") == 0) + { + } + else if (strcasecmp(pArg, "-mip_scale") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_mip_scale = (float)atof(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-mip_filter") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_mip_filter = arg_v[arg_index + 1]; + // TODO: Check filter + arg_count++; + } + else if (strcasecmp(pArg, "-mip_renorm") == 0) + m_comp_params.m_mip_renormalize = true; + else if (strcasecmp(pArg, "-mip_clamp") == 0) + m_comp_params.m_mip_wrapping = false; + else if (strcasecmp(pArg, "-mip_fast") == 0) + m_comp_params.m_mip_fast = true; + else if (strcasecmp(pArg, "-mip_slow") == 0) + m_comp_params.m_mip_fast = false; + else if (strcasecmp(pArg, "-mip_smallest") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_mip_smallest_dimension = atoi(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-mip_srgb") == 0) + m_comp_params.m_mip_srgb = true; + else if (strcasecmp(pArg, "-mip_linear") == 0) + m_comp_params.m_mip_srgb = false; + else if (strcasecmp(pArg, "-no_selector_rdo") == 0) + m_comp_params.m_no_selector_rdo = true; + else if (strcasecmp(pArg, "-selector_rdo_thresh") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_selector_rdo_thresh = (float)atof(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-no_endpoint_rdo") == 0) + m_comp_params.m_no_endpoint_rdo = true; + else if (strcasecmp(pArg, "-endpoint_rdo_thresh") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_endpoint_rdo_thresh = (float)atof(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-userdata0") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_userdata0 = atoi(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-userdata1") == 0) + { + REMAINING_ARGS_CHECK(1); + m_comp_params.m_userdata1 = atoi(arg_v[arg_index + 1]); + arg_count++; + } + else if (strcasecmp(pArg, "-framerate") == 0) + { + REMAINING_ARGS_CHECK(1); + double fps = atof(arg_v[arg_index + 1]); + double us_per_frame = 0; + if (fps > 0) + us_per_frame = 1000000.0f / fps; + + m_comp_params.m_us_per_frame = clamp(static_cast(us_per_frame + .5f), 0, basist::cBASISMaxUSPerFrame); + arg_count++; + } + else if (strcasecmp(pArg, "-tex_type") == 0) + { + REMAINING_ARGS_CHECK(1); + const char* pType = arg_v[arg_index + 1]; + if (strcasecmp(pType, "2d") == 0) + m_comp_params.m_tex_type = basist::cBASISTexType2D; + else if (strcasecmp(pType, "2darray") == 0) + { + m_comp_params.m_tex_type = basist::cBASISTexType2DArray; + m_individual = false; + } + else if (strcasecmp(pType, "3d") == 0) + { + m_comp_params.m_tex_type = basist::cBASISTexTypeVolume; + m_individual = false; + } + else if (strcasecmp(pType, "cubemap") == 0) + { + m_comp_params.m_tex_type = basist::cBASISTexTypeCubemapArray; + m_individual = false; + } + else if (strcasecmp(pType, "video") == 0) + { + m_comp_params.m_tex_type = basist::cBASISTexTypeVideoFrames; + m_individual = false; + } + else + { + error_printf("Invalid texture type: %s\n", pType); + return false; + } + arg_count++; + } + else if (strcasecmp(pArg, "-individual") == 0) + m_individual = true; + else if (strcasecmp(pArg, "-tex_array") == 0) + m_individual = false; + else if (strcasecmp(pArg, "-fuzz_testing") == 0) + m_fuzz_testing = true; + else if (strcasecmp(pArg, "-csv_file") == 0) + { + REMAINING_ARGS_CHECK(1); + m_csv_file = arg_v[arg_index + 1]; + m_comp_params.m_compute_stats = true; + + arg_count++; + } + else if (pArg[0] == '-') + { + error_printf("Unrecognized command line option: %s\n", pArg); + return false; + } + else + { + // Let's assume it's a source filename, so globbing works + //error_printf("Unrecognized command line option: %s\n", pArg); + m_input_filenames.push_back(pArg); + } + + arg_index += arg_count; + } + + if (m_comp_params.m_quality_level != -1) + { + m_comp_params.m_max_endpoint_clusters = 0; + m_comp_params.m_max_selector_clusters = 0; + } + else if ((!m_comp_params.m_max_endpoint_clusters) || (!m_comp_params.m_max_selector_clusters)) + { + m_comp_params.m_max_endpoint_clusters = 0; + m_comp_params.m_max_selector_clusters = 0; + + m_comp_params.m_quality_level = 128; + } + + if (!m_comp_params.m_mip_srgb.was_changed()) + { + // They didn't specify what colorspace to do mipmap filtering in, so choose sRGB if they've specified that the texture is sRGB. + if (m_comp_params.m_perceptual) + m_comp_params.m_mip_srgb = true; + else + m_comp_params.m_mip_srgb = false; + } + + return true; + } + + bool process_listing_files() + { + basisu::vector new_input_filenames; + for (uint32_t i = 0; i < m_input_filenames.size(); i++) + { + if (m_input_filenames[i][0] == '@') + { + if (!load_listing_file(m_input_filenames[i], new_input_filenames)) + return false; + } + else + new_input_filenames.push_back(m_input_filenames[i]); + } + new_input_filenames.swap(m_input_filenames); + + basisu::vector new_input_alpha_filenames; + for (uint32_t i = 0; i < m_input_alpha_filenames.size(); i++) + { + if (m_input_alpha_filenames[i][0] == '@') + { + if (!load_listing_file(m_input_alpha_filenames[i], new_input_alpha_filenames)) + return false; + } + else + new_input_alpha_filenames.push_back(m_input_alpha_filenames[i]); + } + new_input_alpha_filenames.swap(m_input_alpha_filenames); + + return true; + } + + basis_compressor_params m_comp_params; + + tool_mode m_mode; + + bool m_ktx2_mode; + bool m_ktx2_zstandard; + int m_ktx2_zstandard_level; + uint32_t m_ktx2_animdata_duration; + uint32_t m_ktx2_animdata_timescale; + uint32_t m_ktx2_animdata_loopcount; + + basisu::vector m_input_filenames; + basisu::vector m_input_alpha_filenames; + + std::string m_output_filename; + std::string m_output_path; + + std::string m_multifile_printf; + uint32_t m_multifile_first; + uint32_t m_multifile_num; + + std::string m_csv_file; + + std::string m_etc1s_use_global_codebooks_file; + + std::string m_test_file_dir; + + uint32_t m_max_threads; + + bool m_individual; + bool m_no_ktx; + bool m_ktx_only; + bool m_write_out; + bool m_etc1_only; + bool m_fuzz_testing; + bool m_compare_ssim; + bool m_bench; + bool m_parallel_compression; +}; + +static bool expand_multifile(command_line_params &opts) +{ + if (!opts.m_multifile_printf.size()) + return true; + + if (!opts.m_multifile_num) + { + error_printf("-multifile_printf specified, but not -multifile_num\n"); + return false; + } + + std::string fmt(opts.m_multifile_printf); + // Workaround for MSVC debugger issues. Questionable to leave in here. + size_t x = fmt.find_first_of('!'); + if (x != std::string::npos) + fmt[x] = '%'; + + if (string_find_right(fmt, '%') == -1) + { + error_printf("Must include C-style printf() format character '%%' in -multifile_printf string\n"); + return false; + } + + for (uint32_t i = opts.m_multifile_first; i < opts.m_multifile_first + opts.m_multifile_num; i++) + { + char buf[1024]; +#ifdef _WIN32 + sprintf_s(buf, sizeof(buf), fmt.c_str(), i); +#else + snprintf(buf, sizeof(buf), fmt.c_str(), i); +#endif + + if (buf[0]) + opts.m_input_filenames.push_back(buf); + } + + return true; +} + +struct basis_data +{ + basis_data() : + m_transcoder() + { + } + uint8_vec m_file_data; + basist::basisu_transcoder m_transcoder; +}; + +static basis_data *load_basis_file(const char *pInput_filename, bool force_etc1s) +{ + basis_data* p = new basis_data; + uint8_vec &basis_data = p->m_file_data; + if (!basisu::read_file_to_vec(pInput_filename, basis_data)) + { + error_printf("Failed reading file \"%s\"\n", pInput_filename); + delete p; + return nullptr; + } + printf("Input file \"%s\"\n", pInput_filename); + if (!basis_data.size()) + { + error_printf("File is empty!\n"); + delete p; + return nullptr; + } + if (basis_data.size() > UINT32_MAX) + { + error_printf("File is too large!\n"); + delete p; + return nullptr; + } + if (force_etc1s) + { + if (p->m_transcoder.get_tex_format((const void*)&p->m_file_data[0], (uint32_t)p->m_file_data.size()) != basist::basis_tex_format::cETC1S) + { + error_printf("Global codebook file must be in ETC1S format!\n"); + delete p; + return nullptr; + } + } + if (!p->m_transcoder.start_transcoding(&basis_data[0], (uint32_t)basis_data.size())) + { + error_printf("start_transcoding() failed!\n"); + delete p; + return nullptr; + } + return p; +} + +static bool compress_mode(command_line_params &opts) +{ + uint32_t num_threads = 1; + + if (opts.m_comp_params.m_multithreading) + { + // We use std::thread::hardware_concurrency() as a hint to determine the default # of threads to put into a pool. + num_threads = std::thread::hardware_concurrency(); + if (num_threads < 1) + num_threads = 1; + if (num_threads > opts.m_max_threads) + num_threads = opts.m_max_threads; + } + + job_pool compressor_jpool(opts.m_parallel_compression ? 1 : num_threads); + if (!opts.m_parallel_compression) + opts.m_comp_params.m_pJob_pool = &compressor_jpool; + + if (!expand_multifile(opts)) + { + error_printf("-multifile expansion failed!\n"); + return false; + } + + if (!opts.m_input_filenames.size()) + { + error_printf("No input files to process!\n"); + return false; + } + + basis_data* pGlobal_codebook_data = nullptr; + if (opts.m_etc1s_use_global_codebooks_file.size()) + { + pGlobal_codebook_data = load_basis_file(opts.m_etc1s_use_global_codebooks_file.c_str(), true); + if (!pGlobal_codebook_data) + return false; + + printf("Loaded global codebooks from .basis file \"%s\"\n", opts.m_etc1s_use_global_codebooks_file.c_str()); + +#if 0 + // Development/test code. TODO: Remove. + basis_data* pGlobal_codebook_data2 = load_basis_file("xmen_1024.basis", sel_codebook, true); + const basist::basisu_lowlevel_etc1s_transcoder &ta = pGlobal_codebook_data->m_transcoder.get_lowlevel_etc1s_decoder(); + const basist::basisu_lowlevel_etc1s_transcoder &tb = pGlobal_codebook_data2->m_transcoder.get_lowlevel_etc1s_decoder(); + if (ta.get_endpoints().size() != tb.get_endpoints().size()) + { + printf("Endpoint CB's don't match\n"); + } + else if (ta.get_selectors().size() != tb.get_selectors().size()) + { + printf("Selector CB's don't match\n"); + } + else + { + for (uint32_t i = 0; i < ta.get_endpoints().size(); i++) + { + if (ta.get_endpoints()[i] != tb.get_endpoints()[i]) + { + printf("Endoint CB mismatch entry %u\n", i); + } + } + for (uint32_t i = 0; i < ta.get_selectors().size(); i++) + { + if (ta.get_selectors()[i] != tb.get_selectors()[i]) + { + printf("Selector CB mismatch entry %u\n", i); + } + } + } + delete pGlobal_codebook_data2; + pGlobal_codebook_data2 = nullptr; +#endif + } + + basis_compressor_params ¶ms = opts.m_comp_params; + + if (opts.m_ktx2_mode) + { + params.m_create_ktx2_file = true; + if (opts.m_ktx2_zstandard) + params.m_ktx2_uastc_supercompression = basist::KTX2_SS_ZSTANDARD; + else + params.m_ktx2_uastc_supercompression = basist::KTX2_SS_NONE; + + params.m_ktx2_srgb_transfer_func = opts.m_comp_params.m_perceptual; + + if (params.m_tex_type == basist::basis_texture_type::cBASISTexTypeVideoFrames) + { + // Create KTXanimData key value entry + // TODO: Move this to basisu_comp.h + basist::ktx2_transcoder::key_value kv; + + const char* pAD = "KTXanimData"; + kv.m_key.resize(strlen(pAD) + 1); + strcpy((char*)kv.m_key.data(), pAD); + + basist::ktx2_animdata ad; + ad.m_duration = opts.m_ktx2_animdata_duration; + ad.m_timescale = opts.m_ktx2_animdata_timescale; + ad.m_loopcount = opts.m_ktx2_animdata_loopcount; + + kv.m_value.resize(sizeof(ad)); + memcpy(kv.m_value.data(), &ad, sizeof(ad)); + + params.m_ktx2_key_values.push_back(kv); + } + + // TODO- expose this to command line. + params.m_ktx2_zstd_supercompression_level = opts.m_ktx2_zstandard_level; + } + + params.m_read_source_images = true; + params.m_write_output_basis_files = true; + params.m_pGlobal_codebooks = pGlobal_codebook_data ? &pGlobal_codebook_data->m_transcoder.get_lowlevel_etc1s_decoder() : nullptr; + FILE *pCSV_file = nullptr; + if (opts.m_csv_file.size()) + { + //pCSV_file = fopen_safe(opts.m_csv_file.c_str(), "a"); + pCSV_file = fopen_safe(opts.m_csv_file.c_str(), "w"); + if (!pCSV_file) + { + error_printf("Failed opening CVS file \"%s\"\n", opts.m_csv_file.c_str()); + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + fprintf(pCSV_file, "Filename, Size, Slices, Width, Height, HasAlpha, BitsPerTexel, Slice0RGBAvgPSNR, Slice0RGBAAvgPSNR, Slice0Luma709PSNR, Slice0BestETC1SLuma709PSNR, Q, CL, Time, RGBAvgPSNRMin, RGBAvgPSNRAvg, AAvgPSNRMin, AAvgPSNRAvg, Luma709PSNRMin, Luma709PSNRAvg\n"); + } + + printf("Processing %u total file(s)\n", (uint32_t)opts.m_input_filenames.size()); + + interval_timer all_tm; + all_tm.start(); + + basisu::vector comp_params_vec; + + const size_t total_files = (opts.m_individual ? opts.m_input_filenames.size() : 1U); + bool result = true; + + if ((opts.m_individual) && (opts.m_output_filename.size())) + { + if (total_files > 1) + { + error_printf("-output_file specified in individual mode, but multiple input files have been specified which would cause the output file to be written multiple times.\n"); + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + } + + for (size_t file_index = 0; file_index < total_files; file_index++) + { + if (opts.m_individual) + { + params.m_source_filenames.resize(1); + params.m_source_filenames[0] = opts.m_input_filenames[file_index]; + + if (file_index < opts.m_input_alpha_filenames.size()) + { + params.m_source_alpha_filenames.resize(1); + params.m_source_alpha_filenames[0] = opts.m_input_alpha_filenames[file_index]; + + if (params.m_status_output) + printf("Processing source file \"%s\", alpha file \"%s\"\n", params.m_source_filenames[0].c_str(), params.m_source_alpha_filenames[0].c_str()); + } + else + { + params.m_source_alpha_filenames.resize(0); + + if (params.m_status_output) + printf("Processing source file \"%s\"\n", params.m_source_filenames[0].c_str()); + } + } + else + { + params.m_source_filenames = opts.m_input_filenames; + params.m_source_alpha_filenames = opts.m_input_alpha_filenames; + } + + if (opts.m_output_filename.size()) + params.m_out_filename = opts.m_output_filename; + else + { + std::string filename; + + string_get_filename(opts.m_input_filenames[file_index].c_str(), filename); + string_remove_extension(filename); + + if (opts.m_ktx2_mode) + filename += ".ktx2"; + else + filename += ".basis"; + + if (opts.m_output_path.size()) + string_combine_path(filename, opts.m_output_path.c_str(), filename.c_str()); + + params.m_out_filename = filename; + } + + if (opts.m_parallel_compression) + { + comp_params_vec.push_back(params); + } + else + { + basis_compressor c; + + if (!c.init(opts.m_comp_params)) + { + error_printf("basis_compressor::init() failed!\n"); + + if (pCSV_file) + { + fclose(pCSV_file); + pCSV_file = nullptr; + } + + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + + interval_timer tm; + tm.start(); + + basis_compressor::error_code ec = c.process(); + + tm.stop(); + + if (ec == basis_compressor::cECSuccess) + { + if (params.m_status_output) + { + printf("Compression succeeded to file \"%s\" size %u bytes in %3.3f secs\n", params.m_out_filename.c_str(), + opts.m_ktx2_mode ? c.get_output_ktx2_file().size() : c.get_output_basis_file().size(), + tm.get_elapsed_secs()); + } + } + else + { + result = false; + + if (!params.m_status_output) + { + error_printf("Compression failed on file \"%s\"\n", params.m_out_filename.c_str()); + } + + bool exit_flag = true; + + switch (ec) + { + case basis_compressor::cECFailedReadingSourceImages: + { + error_printf("Compressor failed reading a source image!\n"); + + if (opts.m_individual) + exit_flag = false; + + break; + } + case basis_compressor::cECFailedValidating: + error_printf("Compressor failed 2darray/cubemap/video validation checks!\n"); + break; + case basis_compressor::cECFailedEncodeUASTC: + error_printf("Compressor UASTC encode failed!\n"); + break; + case basis_compressor::cECFailedFrontEnd: + error_printf("Compressor frontend stage failed!\n"); + break; + case basis_compressor::cECFailedFontendExtract: + error_printf("Compressor frontend data extraction failed!\n"); + break; + case basis_compressor::cECFailedBackend: + error_printf("Compressor backend stage failed!\n"); + break; + case basis_compressor::cECFailedCreateBasisFile: + error_printf("Compressor failed creating Basis file data!\n"); + break; + case basis_compressor::cECFailedWritingOutput: + error_printf("Compressor failed writing to output Basis file!\n"); + break; + case basis_compressor::cECFailedUASTCRDOPostProcess: + error_printf("Compressor failed during the UASTC post process step!\n"); + break; + case basis_compressor::cECFailedCreateKTX2File: + error_printf("Compressor failed creating KTX2 file data!\n"); + break; + default: + error_printf("basis_compress::process() failed!\n"); + break; + } + + if (exit_flag) + { + if (pCSV_file) + { + fclose(pCSV_file); + pCSV_file = nullptr; + } + + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + } + + if ((pCSV_file) && (c.get_stats().size())) + { + if (c.get_stats().size()) + { + float rgb_avg_psnr_min = 1e+9f, rgb_avg_psnr_avg = 0.0f; + float a_avg_psnr_min = 1e+9f, a_avg_psnr_avg = 0.0f; + float luma_709_psnr_min = 1e+9f, luma_709_psnr_avg = 0.0f; + + for (size_t slice_index = 0; slice_index < c.get_stats().size(); slice_index++) + { + rgb_avg_psnr_min = basisu::minimum(rgb_avg_psnr_min, c.get_stats()[slice_index].m_basis_rgb_avg_psnr); + rgb_avg_psnr_avg += c.get_stats()[slice_index].m_basis_rgb_avg_psnr; + + a_avg_psnr_min = basisu::minimum(a_avg_psnr_min, c.get_stats()[slice_index].m_basis_a_avg_psnr); + a_avg_psnr_avg += c.get_stats()[slice_index].m_basis_a_avg_psnr; + + luma_709_psnr_min = basisu::minimum(luma_709_psnr_min, c.get_stats()[slice_index].m_basis_luma_709_psnr); + luma_709_psnr_avg += c.get_stats()[slice_index].m_basis_luma_709_psnr; + } + + rgb_avg_psnr_avg /= c.get_stats().size(); + a_avg_psnr_avg /= c.get_stats().size(); + luma_709_psnr_avg /= c.get_stats().size(); + + fprintf(pCSV_file, "\"%s\", %u, %u, %u, %u, %u, %f, %f, %f, %f, %f, %u, %u, %f, %f, %f, %f, %f, %f, %f\n", + params.m_out_filename.c_str(), + c.get_basis_file_size(), + (uint32_t)c.get_stats().size(), + c.get_stats()[0].m_width, c.get_stats()[0].m_height, (uint32_t)c.get_any_source_image_has_alpha(), + c.get_basis_bits_per_texel(), + c.get_stats()[0].m_basis_rgb_avg_psnr, + c.get_stats()[0].m_basis_rgba_avg_psnr, + c.get_stats()[0].m_basis_luma_709_psnr, + c.get_stats()[0].m_best_etc1s_luma_709_psnr, + params.m_quality_level, (int)params.m_compression_level, tm.get_elapsed_secs(), + rgb_avg_psnr_min, rgb_avg_psnr_avg, + a_avg_psnr_min, a_avg_psnr_avg, + luma_709_psnr_min, luma_709_psnr_avg); + fflush(pCSV_file); + } + } + + //if ((opts.m_individual) && (params.m_status_output)) + // printf("\n"); + + } // if (opts.m_parallel_compression) + + } // file_index + + if (opts.m_parallel_compression) + { + basisu::vector results; + + bool any_failed = basis_parallel_compress( + num_threads, + comp_params_vec, + results); + BASISU_NOTE_UNUSED(any_failed); + + uint32_t total_successes = 0, total_failures = 0; + for (uint32_t i = 0; i < comp_params_vec.size(); i++) + { + if (results[i].m_error_code != basis_compressor::cECSuccess) + { + result = false; + + total_failures++; + + error_printf("File %u (first source image: \"%s\", output file: \"%s\") failed with error code %i!\n", i, + comp_params_vec[i].m_source_filenames[0].c_str(), + comp_params_vec[i].m_out_filename.c_str(), + (int)results[i].m_error_code); + } + else + { + total_successes++; + } + } + + printf("Total successes: %u failures: %u\n", total_successes, total_failures); + + } // if (opts.m_parallel_compression) + + all_tm.stop(); + + if (total_files > 1) + printf("Total compression time: %3.3f secs\n", all_tm.get_elapsed_secs()); + + if (pCSV_file) + { + fclose(pCSV_file); + pCSV_file = nullptr; + } + delete pGlobal_codebook_data; + pGlobal_codebook_data = nullptr; + + return result; +} + +static bool unpack_and_validate_ktx2_file( + uint32_t file_index, + const std::string& base_filename, + uint8_vec& ktx2_file_data, + command_line_params& opts, + FILE* pCSV_file, + basis_data* pGlobal_codebook_data, + uint32_t& total_unpack_warnings, + uint32_t& total_pvrtc_nonpow2_warnings) +{ + // TODO + (void)pCSV_file; + (void)file_index; + + const bool validate_flag = (opts.m_mode == cValidate); + + basist::ktx2_transcoder dec; + + if (!dec.init(ktx2_file_data.data(), ktx2_file_data.size())) + { + error_printf("ktx2_transcoder::init() failed! File either uses an unsupported feature, is invalid, was corrupted, or this is a bug.\n"); + return false; + } + + if (!dec.start_transcoding()) + { + error_printf("ktx2_transcoder::start_transcoding() failed! File either uses an unsupported feature, is invalid, was corrupted, or this is a bug.\n"); + return false; + } + + printf("Resolution: %ux%u\n", dec.get_width(), dec.get_height()); + printf("Mipmap Levels: %u\n", dec.get_levels()); + printf("Texture Array Size (layers): %u\n", dec.get_layers()); + printf("Total Faces: %u (%s)\n", dec.get_faces(), (dec.get_faces() == 6) ? "CUBEMAP" : "2D"); + printf("Is Texture Video: %u\n", dec.is_video()); + + const bool is_etc1s = dec.get_format() == basist::basis_tex_format::cETC1S; + printf("Supercompression Format: %s\n", is_etc1s ? "ETC1S" : "UASTC"); + + printf("Supercompression Scheme: "); + switch (dec.get_header().m_supercompression_scheme) + { + case basist::KTX2_SS_NONE: printf("NONE\n"); break; + case basist::KTX2_SS_BASISLZ: printf("BASISLZ\n"); break; + case basist::KTX2_SS_ZSTANDARD: printf("ZSTANDARD\n"); break; + default: + error_printf("Invalid/unknown/unsupported\n"); + return false; + } + + printf("Has Alpha: %u\n", (uint32_t)dec.get_has_alpha()); + + printf("\nData Format Descriptor (DFD):\n"); + printf("DFD length in bytes: %u\n", dec.get_dfd().size()); + printf("DFD color model: %u\n", dec.get_dfd_color_model()); + printf("DFD color primaries: %u (%s)\n", dec.get_dfd_color_primaries(), basist::ktx2_get_df_color_primaries_str(dec.get_dfd_color_primaries())); + printf("DFD transfer func: %u (%s)\n", dec.get_dfd_transfer_func(), + (dec.get_dfd_transfer_func() == basist::KTX2_KHR_DF_TRANSFER_LINEAR) ? "LINEAR" : ((dec.get_dfd_transfer_func() == basist::KTX2_KHR_DF_TRANSFER_SRGB) ? "SRGB" : "?")); + printf("DFD flags: %u\n", dec.get_dfd_flags()); + printf("DFD samples: %u\n", dec.get_dfd_total_samples()); + if (is_etc1s) + { + printf("DFD chan0: %s\n", basist::ktx2_get_etc1s_df_channel_id_str(dec.get_dfd_channel_id0())); + if (dec.get_dfd_total_samples() == 2) + printf("DFD chan1: %s\n", basist::ktx2_get_etc1s_df_channel_id_str(dec.get_dfd_channel_id1())); + } + else + printf("DFD chan0: %s\n", basist::ktx2_get_uastc_df_channel_id_str(dec.get_dfd_channel_id0())); + + printf("DFD hex values:\n"); + for (uint32_t i = 0; i < dec.get_dfd().size(); i++) + { + if (i) + printf(","); + printf("0x%X", dec.get_dfd()[i]); + } + printf("\n\n"); + + + printf("Total key values: %u\n", dec.get_key_values().size()); + for (uint32_t i = 0; i < dec.get_key_values().size(); i++) + { + printf("%u. Key: \"%s\", Value length in bytes: %u", i, (const char*)dec.get_key_values()[i].m_key.data(), dec.get_key_values()[i].m_value.size()); + + if (dec.get_key_values()[i].m_value.size() > 256) + continue; + + bool is_ascii = true; + for (uint32_t j = 0; j < dec.get_key_values()[i].m_value.size(); j++) + { + uint8_t c = dec.get_key_values()[i].m_value[j]; + if (!( + ((c >= ' ') && (c < 0x80)) || + ((j == dec.get_key_values()[i].m_value.size() - 1) && (!c)) + )) + { + is_ascii = false; + break; + } + } + + if (is_ascii) + { + uint8_vec s(dec.get_key_values()[i].m_value); + s.push_back(0); + printf(" Value String: \"%s\"", (const char *)s.data()); + } + else + { + printf(" Value Bytes: "); + for (uint32_t j = 0; j < dec.get_key_values()[i].m_value.size(); j++) + { + if (j) + printf(","); + printf("0x%X", dec.get_key_values()[i].m_value[j]); + } + } + printf("\n"); + } + + if (is_etc1s) + { + printf("ETC1S header:\n"); + + printf("Endpoint Count: %u, Selector Count: %u, Endpoint Length: %u, Selector Length: %u, Tables Length: %u, Extended Length: %u\n", + (uint32_t)dec.get_etc1s_header().m_endpoint_count, (uint32_t)dec.get_etc1s_header().m_selector_count, + (uint32_t)dec.get_etc1s_header().m_endpoints_byte_length, (uint32_t)dec.get_etc1s_header().m_selectors_byte_length, + (uint32_t)dec.get_etc1s_header().m_tables_byte_length, (uint32_t)dec.get_etc1s_header().m_extended_byte_length); + + printf("Total ETC1S image descs: %u\n", dec.get_etc1s_image_descs().size()); + for (uint32_t i = 0; i < dec.get_etc1s_image_descs().size(); i++) + { + printf("%u. Flags: 0x%X, RGB Ofs: %u Len: %u, Alpha Ofs: %u, Len: %u\n", i, + (uint32_t)dec.get_etc1s_image_descs()[i].m_image_flags, + (uint32_t)dec.get_etc1s_image_descs()[i].m_rgb_slice_byte_offset, (uint32_t)dec.get_etc1s_image_descs()[i].m_rgb_slice_byte_length, + (uint32_t)dec.get_etc1s_image_descs()[i].m_alpha_slice_byte_offset, (uint32_t)dec.get_etc1s_image_descs()[i].m_alpha_slice_byte_length); + } + } + + printf("Levels:\n"); + for (uint32_t i = 0; i < dec.get_levels(); i++) + { + printf("%u. Offset: %llu, Length: %llu, Uncompressed Length: %llu\n", + i, (long long unsigned int)dec.get_level_index()[i].m_byte_offset, + (long long unsigned int)dec.get_level_index()[i].m_byte_length, + (long long unsigned int)dec.get_level_index()[i].m_uncompressed_byte_length); + } + + if (opts.m_mode == cInfo) + { + return true; + } + + // gpu_images[format][face][layer][level] + + basisu::vector< gpu_image_vec > gpu_images[(int)basist::transcoder_texture_format::cTFTotalTextureFormats][6]; + + int first_format = 0; + int last_format = (int)basist::transcoder_texture_format::cTFTotalTextureFormats; + + if (opts.m_etc1_only) + { + first_format = (int)basist::transcoder_texture_format::cTFETC1_RGB; + last_format = first_format + 1; + } + + const uint32_t total_layers = maximum(1, dec.get_layers()); + + for (int format_iter = first_format; format_iter < last_format; format_iter++) + { + basist::transcoder_texture_format tex_fmt = static_cast(format_iter); + + if (basist::basis_transcoder_format_is_uncompressed(tex_fmt)) + continue; + + if (!basis_is_format_supported(tex_fmt, dec.get_format())) + continue; + + if (tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT) + continue; + + for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++) + { + gpu_images[(int)tex_fmt][face_index].resize(total_layers); + + for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++) + gpu_images[(int)tex_fmt][face_index][layer_index].resize(dec.get_levels()); + } + } + + // Now transcode the file to all supported texture formats and save mipmapped KTX files + for (int format_iter = first_format; format_iter < last_format; format_iter++) + { + const basist::transcoder_texture_format transcoder_tex_fmt = static_cast(format_iter); + + if (basist::basis_transcoder_format_is_uncompressed(transcoder_tex_fmt)) + continue; + if (!basis_is_format_supported(transcoder_tex_fmt, dec.get_format())) + continue; + if (transcoder_tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT) + continue; + + for (uint32_t level_index = 0; level_index < dec.get_levels(); level_index++) + { + for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++) + { + for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++) + { + basist::ktx2_image_level_info level_info; + + if (!dec.get_image_level_info(level_info, level_index, layer_index, face_index)) + { + error_printf("Failed retrieving image level information (%u %u %u)!\n", layer_index, level_index, face_index); + return false; + } + + if ((transcoder_tex_fmt == basist::transcoder_texture_format::cTFPVRTC1_4_RGB) || (transcoder_tex_fmt == basist::transcoder_texture_format::cTFPVRTC1_4_RGBA)) + { + if (!is_pow2(level_info.m_width) || !is_pow2(level_info.m_height)) + { + total_pvrtc_nonpow2_warnings++; + + printf("Warning: Will not transcode image %u level %u res %ux%u to PVRTC1 (one or more dimension is not a power of 2)\n", layer_index, level_index, level_info.m_width, level_info.m_height); + + // Can't transcode this image level to PVRTC because it's not a pow2 (we're going to support transcoding non-pow2 to the next larger pow2 soon) + continue; + } + } + + basisu::texture_format tex_fmt = basis_get_basisu_texture_format(transcoder_tex_fmt); + + gpu_image& gi = gpu_images[(int)transcoder_tex_fmt][face_index][layer_index][level_index]; + gi.init(tex_fmt, level_info.m_orig_width, level_info.m_orig_height); + + // Fill the buffer with psuedo-random bytes, to help more visibly detect cases where the transcoder fails to write to part of the output. + fill_buffer_with_random_bytes(gi.get_ptr(), gi.get_size_in_bytes()); + + uint32_t decode_flags = 0; + + if (!dec.transcode_image_level(level_index, layer_index, face_index, gi.get_ptr(), gi.get_total_blocks(), transcoder_tex_fmt, decode_flags)) + { + error_printf("Failed transcoding image level (%u %u %u %u)!\n", layer_index, level_index, face_index, format_iter); + return false; + } + + printf("Transcode of layer %u level %u face %u res %ux%u format %s succeeded\n", layer_index, level_index, face_index, level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt)); + } + + } // format_iter + + } // level_index + + } // image_info + + if (!validate_flag) + { + // Now write KTX files and unpack them to individual PNG's + const bool is_cubemap_array = (dec.get_faces() > 1) && (total_layers > 1); + + for (int format_iter = first_format; format_iter < last_format; format_iter++) + { + const basist::transcoder_texture_format transcoder_tex_fmt = static_cast(format_iter); + + if (basist::basis_transcoder_format_is_uncompressed(transcoder_tex_fmt)) + continue; + if (!basis_is_format_supported(transcoder_tex_fmt, dec.get_format())) + continue; + if (transcoder_tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT) + continue; + + if ((!opts.m_no_ktx) && (is_cubemap_array)) + { + // No KTX tool that we know of supports cubemap arrays, so write individual cubemap files. + for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++) + { + basisu::vector cubemap; + for (uint32_t face_index = 0; face_index < 6; face_index++) + cubemap.push_back(gpu_images[format_iter][face_index][layer_index]); + + std::string ktx_filename(base_filename + string_format("_transcoded_cubemap_%s_%u.ktx", basist::basis_get_format_name(transcoder_tex_fmt), layer_index)); + + if (!write_compressed_texture_file(ktx_filename.c_str(), cubemap, true)) + { + error_printf("Failed writing KTX file \"%s\"!\n", ktx_filename.c_str()); + return false; + } + printf("Wrote KTX file \"%s\"\n", ktx_filename.c_str()); + } + } + + for (uint32_t layer_index = 0; layer_index < total_layers; layer_index++) + { + for (uint32_t face_index = 0; face_index < dec.get_faces(); face_index++) + { + gpu_image_vec& gi = gpu_images[format_iter][face_index][layer_index]; + + if (!gi.size()) + continue; + + uint32_t level; + for (level = 0; level < gi.size(); level++) + if (!gi[level].get_total_blocks()) + break; + + if (level < gi.size()) + continue; + + if ((!opts.m_no_ktx) && (!is_cubemap_array)) + { + std::string ktx_filename(base_filename + string_format("_transcoded_%s_%04u.ktx", basist::basis_get_format_name(transcoder_tex_fmt), layer_index)); + if (!write_compressed_texture_file(ktx_filename.c_str(), gi)) + { + error_printf("Failed writing KTX file \"%s\"!\n", ktx_filename.c_str()); + return false; + } + printf("Wrote KTX file \"%s\"\n", ktx_filename.c_str()); + } + + for (uint32_t level_index = 0; level_index < gi.size(); level_index++) + { + basist::ktx2_image_level_info level_info; + + if (!dec.get_image_level_info(level_info, level_index, layer_index, face_index)) + { + error_printf("Failed retrieving image level information (%u %u %u)!\n", layer_index, level_index, face_index); + return false; + } + + image u; + if (!gi[level_index].unpack(u)) + { + printf("Warning: Failed unpacking GPU texture data (%u %u %u %u). Unpacking as much as possible.\n", format_iter, layer_index, level_index, face_index); + total_unpack_warnings++; + } + //u.crop(level_info.m_orig_width, level_info.m_orig_height); + + bool is_astc = (transcoder_tex_fmt == basist::transcoder_texture_format::cTFASTC_4x4_RGBA); + bool write_png = true; +#if !BASISU_USE_ASTC_DECOMPRESS + if (is_astc) + write_png = false; +#endif + + if ((!opts.m_ktx_only) && (write_png)) + { + std::string rgb_filename; + if (gi.size() > 1) + rgb_filename = base_filename + string_format("_unpacked_rgb_%s_%u_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index); + else + rgb_filename = base_filename + string_format("_unpacked_rgb_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index); + if (!save_png(rgb_filename, u, cImageSaveIgnoreAlpha)) + { + error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str()); + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + printf("Wrote PNG file \"%s\"\n", rgb_filename.c_str()); + } + + if ((transcoder_tex_fmt == basist::transcoder_texture_format::cTFFXT1_RGB) && (opts.m_write_out)) + { + std::string out_filename; + if (gi.size() > 1) + out_filename = base_filename + string_format("_unpacked_rgb_%s_%u_%u_%04u.out", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index); + else + out_filename = base_filename + string_format("_unpacked_rgb_%s_%u_%04u.out", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index); + if (!write_3dfx_out_file(out_filename.c_str(), gi[level_index])) + { + error_printf("Failed writing to OUT file \"%s\"\n", out_filename.c_str()); + return false; + } + printf("Wrote .OUT file \"%s\"\n", out_filename.c_str()); + } + + if (basis_transcoder_format_has_alpha(transcoder_tex_fmt) && (!opts.m_ktx_only) && (write_png)) + { + std::string a_filename; + if (gi.size() > 1) + a_filename = base_filename + string_format("_unpacked_a_%s_%u_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index); + else + a_filename = base_filename + string_format("_unpacked_a_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index); + if (!save_png(a_filename, u, cImageSaveGrayscale, 3)) + { + error_printf("Failed writing to PNG file \"%s\"\n", a_filename.c_str()); + return false; + } + printf("Wrote PNG file \"%s\"\n", a_filename.c_str()); + + std::string rgba_filename; + if (gi.size() > 1) + rgba_filename = base_filename + string_format("_unpacked_rgba_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, face_index, layer_index); + else + rgba_filename = base_filename + string_format("_unpacked_rgba_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), face_index, layer_index); + if (!save_png(rgba_filename, u)) + { + error_printf("Failed writing to PNG file \"%s\"\n", rgba_filename.c_str()); + return false; + } + printf("Wrote PNG file \"%s\"\n", rgba_filename.c_str()); + } + + } // level_index + + } // face_index + + } // layer_index + + } // format_iter + + } // if (!validate_flag) + + return true; +} + +static bool unpack_and_validate_basis_file( + uint32_t file_index, + const std::string &base_filename, + uint8_vec &basis_file_data, + command_line_params& opts, + FILE *pCSV_file, + basis_data* pGlobal_codebook_data, + uint32_t &total_unpack_warnings, + uint32_t &total_pvrtc_nonpow2_warnings) +{ + const bool validate_flag = (opts.m_mode == cValidate); + + basist::basisu_transcoder dec; + + if (pGlobal_codebook_data) + { + dec.set_global_codebooks(&pGlobal_codebook_data->m_transcoder.get_lowlevel_etc1s_decoder()); + } + + if (!opts.m_fuzz_testing) + { + // Skip the full validation, which CRC16's the entire file. + + // Validate the file - note this isn't necessary for transcoding + if (!dec.validate_file_checksums(&basis_file_data[0], (uint32_t)basis_file_data.size(), true)) + { + error_printf("File version is unsupported, or file failed one or more CRC checks!\n"); + + return false; + } + } + + printf("File version and CRC checks succeeded\n"); + + basist::basisu_file_info fileinfo; + if (!dec.get_file_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), fileinfo)) + { + error_printf("Failed retrieving Basis file information!\n"); + return false; + } + + assert(fileinfo.m_total_images == fileinfo.m_image_mipmap_levels.size()); + assert(fileinfo.m_total_images == dec.get_total_images(&basis_file_data[0], (uint32_t)basis_file_data.size())); + + printf("File info:\n"); + printf(" Version: %X\n", fileinfo.m_version); + printf(" Total header size: %u\n", fileinfo.m_total_header_size); + printf(" Total selectors: %u\n", fileinfo.m_total_selectors); + printf(" Selector codebook size: %u\n", fileinfo.m_selector_codebook_size); + printf(" Total endpoints: %u\n", fileinfo.m_total_endpoints); + printf(" Endpoint codebook size: %u\n", fileinfo.m_endpoint_codebook_size); + printf(" Tables size: %u\n", fileinfo.m_tables_size); + printf(" Slices size: %u\n", fileinfo.m_slices_size); + printf(" Texture format: %s\n", (fileinfo.m_tex_format == basist::basis_tex_format::cUASTC4x4) ? "UASTC" : "ETC1S"); + printf(" Texture type: %s\n", basist::basis_get_texture_type_name(fileinfo.m_tex_type)); + printf(" us per frame: %u (%f fps)\n", fileinfo.m_us_per_frame, fileinfo.m_us_per_frame ? (1.0f / ((float)fileinfo.m_us_per_frame / 1000000.0f)) : 0.0f); + printf(" Total slices: %u\n", (uint32_t)fileinfo.m_slice_info.size()); + printf(" Total images: %i\n", fileinfo.m_total_images); + printf(" Y Flipped: %u, Has alpha slices: %u\n", fileinfo.m_y_flipped, fileinfo.m_has_alpha_slices); + printf(" userdata0: 0x%X userdata1: 0x%X\n", fileinfo.m_userdata0, fileinfo.m_userdata1); + printf(" Per-image mipmap levels: "); + for (uint32_t i = 0; i < fileinfo.m_total_images; i++) + printf("%u ", fileinfo.m_image_mipmap_levels[i]); + printf("\n"); + + uint32_t total_texels = 0; + + printf("\nImage info:\n"); + for (uint32_t i = 0; i < fileinfo.m_total_images; i++) + { + basist::basisu_image_info ii; + if (!dec.get_image_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), ii, i)) + { + error_printf("get_image_info() failed!\n"); + return false; + } + + printf("Image %u: MipLevels: %u OrigDim: %ux%u, BlockDim: %ux%u, FirstSlice: %u, HasAlpha: %u\n", i, ii.m_total_levels, ii.m_orig_width, ii.m_orig_height, + ii.m_num_blocks_x, ii.m_num_blocks_y, ii.m_first_slice_index, (uint32_t)ii.m_alpha_flag); + + total_texels += ii.m_width * ii.m_height; + } + + printf("\nSlice info:\n"); + + for (uint32_t i = 0; i < fileinfo.m_slice_info.size(); i++) + { + const basist::basisu_slice_info& sliceinfo = fileinfo.m_slice_info[i]; + printf("%u: OrigWidthHeight: %ux%u, BlockDim: %ux%u, TotalBlocks: %u, Compressed size: %u, Image: %u, Level: %u, UnpackedCRC16: 0x%X, alpha: %u, iframe: %i\n", + i, + sliceinfo.m_orig_width, sliceinfo.m_orig_height, + sliceinfo.m_num_blocks_x, sliceinfo.m_num_blocks_y, + sliceinfo.m_total_blocks, + sliceinfo.m_compressed_size, + sliceinfo.m_image_index, sliceinfo.m_level_index, + sliceinfo.m_unpacked_slice_crc16, + (uint32_t)sliceinfo.m_alpha_flag, + (uint32_t)sliceinfo.m_iframe_flag); + } + printf("\n"); + + size_t comp_size = 0; + void* pComp_data = tdefl_compress_mem_to_heap(&basis_file_data[0], basis_file_data.size(), &comp_size, TDEFL_MAX_PROBES_MASK);// TDEFL_DEFAULT_MAX_PROBES); + mz_free(pComp_data); + + const float basis_bits_per_texel = basis_file_data.size() * 8.0f / total_texels; + const float comp_bits_per_texel = comp_size * 8.0f / total_texels; + + printf("Original size: %u, bits per texel: %3.3f\nCompressed size (Deflate): %u, bits per texel: %3.3f\n", (uint32_t)basis_file_data.size(), basis_bits_per_texel, (uint32_t)comp_size, comp_bits_per_texel); + + if (opts.m_mode == cInfo) + { + return true; + } + + if ((fileinfo.m_etc1s) && (fileinfo.m_selector_codebook_size == 0) && (fileinfo.m_endpoint_codebook_size == 0)) + { + // File is ETC1S and uses global codebooks - make sure we loaded one + if (!pGlobal_codebook_data) + { + error_printf("ETC1S file uses global codebooks, but none were loaded (see the -use_global_codebooks option)\n"); + return false; + } + + if ((pGlobal_codebook_data->m_transcoder.get_lowlevel_etc1s_decoder().get_endpoints().size() != fileinfo.m_total_endpoints) || + (pGlobal_codebook_data->m_transcoder.get_lowlevel_etc1s_decoder().get_selectors().size() != fileinfo.m_total_selectors)) + { + error_printf("Supplied global codebook is not compatible with this file\n"); + return false; + } + } + + interval_timer tm; + tm.start(); + + if (!dec.start_transcoding(&basis_file_data[0], (uint32_t)basis_file_data.size())) + { + error_printf("start_transcoding() failed!\n"); + return false; + } + + const double start_transcoding_time_ms = tm.get_elapsed_ms(); + + printf("start_transcoding time: %3.3f ms\n", start_transcoding_time_ms); + + basisu::vector< gpu_image_vec > gpu_images[(int)basist::transcoder_texture_format::cTFTotalTextureFormats]; + + double total_format_transcoding_time_ms[(int)basist::transcoder_texture_format::cTFTotalTextureFormats]; + clear_obj(total_format_transcoding_time_ms); + + int first_format = 0; + int last_format = (int)basist::transcoder_texture_format::cTFTotalTextureFormats; + + if (opts.m_etc1_only) + { + first_format = (int)basist::transcoder_texture_format::cTFETC1_RGB; + last_format = first_format + 1; + } + + if ((pCSV_file) && (file_index == 0)) + { + std::string desc; + desc = "filename,basis_bitrate,comp_bitrate,images,levels,slices,start_transcoding_time,"; + for (int format_iter = first_format; format_iter < last_format; format_iter++) + { + const basist::transcoder_texture_format transcoder_tex_fmt = static_cast(format_iter); + + if (!basis_is_format_supported(transcoder_tex_fmt, fileinfo.m_tex_format)) + continue; + if (transcoder_tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT) + continue; + + desc += std::string(basis_get_format_name(transcoder_tex_fmt)); + if (format_iter != last_format - 1) + desc += ","; + } + fprintf(pCSV_file, "%s\n", desc.c_str()); + } + + for (int format_iter = first_format; format_iter < last_format; format_iter++) + { + basist::transcoder_texture_format tex_fmt = static_cast(format_iter); + + if (basist::basis_transcoder_format_is_uncompressed(tex_fmt)) + continue; + + if (!basis_is_format_supported(tex_fmt, fileinfo.m_tex_format)) + continue; + + if (tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT) + continue; + + gpu_images[(int)tex_fmt].resize(fileinfo.m_total_images); + + for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++) + gpu_images[(int)tex_fmt][image_index].resize(fileinfo.m_image_mipmap_levels[image_index]); + } + + // Now transcode the file to all supported texture formats and save mipmapped KTX files + for (int format_iter = first_format; format_iter < last_format; format_iter++) + { + const basist::transcoder_texture_format transcoder_tex_fmt = static_cast(format_iter); + + if (basist::basis_transcoder_format_is_uncompressed(transcoder_tex_fmt)) + continue; + if (!basis_is_format_supported(transcoder_tex_fmt, fileinfo.m_tex_format)) + continue; + if (transcoder_tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT) + continue; + + for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++) + { + for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++) + { + basist::basisu_image_level_info level_info; + + if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index)) + { + error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index); + return false; + } + + if ((transcoder_tex_fmt == basist::transcoder_texture_format::cTFPVRTC1_4_RGB) || (transcoder_tex_fmt == basist::transcoder_texture_format::cTFPVRTC1_4_RGBA)) + { + if (!is_pow2(level_info.m_width) || !is_pow2(level_info.m_height)) + { + total_pvrtc_nonpow2_warnings++; + + printf("Warning: Will not transcode image %u level %u res %ux%u to PVRTC1 (one or more dimension is not a power of 2)\n", image_index, level_index, level_info.m_width, level_info.m_height); + + // Can't transcode this image level to PVRTC because it's not a pow2 (we're going to support transcoding non-pow2 to the next larger pow2 soon) + continue; + } + } + + basisu::texture_format tex_fmt = basis_get_basisu_texture_format(transcoder_tex_fmt); + + gpu_image& gi = gpu_images[(int)transcoder_tex_fmt][image_index][level_index]; + gi.init(tex_fmt, level_info.m_orig_width, level_info.m_orig_height); + + // Fill the buffer with psuedo-random bytes, to help more visibly detect cases where the transcoder fails to write to part of the output. + fill_buffer_with_random_bytes(gi.get_ptr(), gi.get_size_in_bytes()); + + uint32_t decode_flags = 0; + + tm.start(); + + if (!dec.transcode_image_level(&basis_file_data[0], (uint32_t)basis_file_data.size(), image_index, level_index, gi.get_ptr(), gi.get_total_blocks(), transcoder_tex_fmt, decode_flags)) + { + error_printf("Failed transcoding image level (%u %u %u)!\n", image_index, level_index, format_iter); + return false; + } + + double total_transcode_time = tm.get_elapsed_ms(); + + total_format_transcoding_time_ms[format_iter] += total_transcode_time; + + printf("Transcode of image %u level %u res %ux%u format %s succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time); + + } // format_iter + + } // level_index + + } // image_info + + // Upack UASTC files separarely, to validate we can transcode slices to UASTC and unpack them to pixels. + // This is a special path because UASTC is not yet a valid transcoder_texture_format, but a lower-level block_format. + if (fileinfo.m_tex_format == basist::basis_tex_format::cUASTC4x4) + { + for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++) + { + for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++) + { + basist::basisu_image_level_info level_info; + + if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index)) + { + error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index); + return false; + } + + gpu_image gi; + gi.init(basisu::texture_format::cUASTC4x4, level_info.m_orig_width, level_info.m_orig_height); + + // Fill the buffer with psuedo-random bytes, to help more visibly detect cases where the transcoder fails to write to part of the output. + fill_buffer_with_random_bytes(gi.get_ptr(), gi.get_size_in_bytes()); + + //uint32_t decode_flags = 0; + + tm.start(); + + if (!dec.transcode_slice( + &basis_file_data[0], (uint32_t)basis_file_data.size(), + level_info.m_first_slice_index, gi.get_ptr(), gi.get_total_blocks(), basist::block_format::cUASTC_4x4, gi.get_bytes_per_block())) + { + error_printf("Failed transcoding image level (%u %u) to UASTC!\n", image_index, level_index); + return false; + } + + double total_transcode_time = tm.get_elapsed_ms(); + + printf("Transcode of image %u level %u res %ux%u format UASTC_4x4 succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, total_transcode_time); + + if ((!validate_flag) && (!opts.m_ktx_only)) + { + image u; + if (!gi.unpack(u)) + { + error_printf("Warning: Failed unpacking GPU texture data (%u %u) to UASTC. \n", image_index, level_index); + return false; + } + //u.crop(level_info.m_orig_width, level_info.m_orig_height); + + std::string rgb_filename; + if (fileinfo.m_image_mipmap_levels[image_index] > 1) + rgb_filename = base_filename + string_format("_unpacked_rgb_UASTC_4x4_%u_%04u.png", level_index, image_index); + else + rgb_filename = base_filename + string_format("_unpacked_rgb_UASTC_4x4_%04u.png", image_index); + + if (!save_png(rgb_filename, u, cImageSaveIgnoreAlpha)) + { + error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str()); + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + printf("Wrote PNG file \"%s\"\n", rgb_filename.c_str()); + + std::string alpha_filename; + if (fileinfo.m_image_mipmap_levels[image_index] > 1) + alpha_filename = base_filename + string_format("_unpacked_a_UASTC_4x4_%u_%04u.png", level_index, image_index); + else + alpha_filename = base_filename + string_format("_unpacked_a_UASTC_4x4_%04u.png", image_index); + if (!save_png(alpha_filename, u, cImageSaveGrayscale, 3)) + { + error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str()); + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + printf("Wrote PNG file \"%s\"\n", alpha_filename.c_str()); + + } + } + } + } + + if (!validate_flag) + { + // Now write KTX files and unpack them to individual PNG's + + for (int format_iter = first_format; format_iter < last_format; format_iter++) + { + const basist::transcoder_texture_format transcoder_tex_fmt = static_cast(format_iter); + + if (basist::basis_transcoder_format_is_uncompressed(transcoder_tex_fmt)) + continue; + if (!basis_is_format_supported(transcoder_tex_fmt, fileinfo.m_tex_format)) + continue; + if (transcoder_tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT) + continue; + + if ((!opts.m_no_ktx) && (fileinfo.m_tex_type == basist::cBASISTexTypeCubemapArray)) + { + // No KTX tool that we know of supports cubemap arrays, so write individual cubemap files. + for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index += 6) + { + basisu::vector cubemap; + for (uint32_t i = 0; i < 6; i++) + cubemap.push_back(gpu_images[format_iter][image_index + i]); + + std::string ktx_filename(base_filename + string_format("_transcoded_cubemap_%s_%u.ktx", basist::basis_get_format_name(transcoder_tex_fmt), image_index / 6)); + if (!write_compressed_texture_file(ktx_filename.c_str(), cubemap, true)) + { + error_printf("Failed writing KTX file \"%s\"!\n", ktx_filename.c_str()); + return false; + } + printf("Wrote KTX file \"%s\"\n", ktx_filename.c_str()); + } + } + + for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++) + { + gpu_image_vec& gi = gpu_images[format_iter][image_index]; + + if (!gi.size()) + continue; + + uint32_t level; + for (level = 0; level < gi.size(); level++) + if (!gi[level].get_total_blocks()) + break; + + if (level < gi.size()) + continue; + + if ((!opts.m_no_ktx) && (fileinfo.m_tex_type != basist::cBASISTexTypeCubemapArray)) + { + std::string ktx_filename(base_filename + string_format("_transcoded_%s_%04u.ktx", basist::basis_get_format_name(transcoder_tex_fmt), image_index)); + if (!write_compressed_texture_file(ktx_filename.c_str(), gi)) + { + error_printf("Failed writing KTX file \"%s\"!\n", ktx_filename.c_str()); + return false; + } + printf("Wrote KTX file \"%s\"\n", ktx_filename.c_str()); + } + + for (uint32_t level_index = 0; level_index < gi.size(); level_index++) + { + basist::basisu_image_level_info level_info; + + if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index)) + { + error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index); + return false; + } + + image u; + if (!gi[level_index].unpack(u)) + { + printf("Warning: Failed unpacking GPU texture data (%u %u %u). Unpacking as much as possible.\n", format_iter, image_index, level_index); + total_unpack_warnings++; + } + //u.crop(level_info.m_orig_width, level_info.m_orig_height); + + bool is_astc = (transcoder_tex_fmt == basist::transcoder_texture_format::cTFASTC_4x4_RGBA); + bool write_png = true; +#if !BASISU_USE_ASTC_DECOMPRESS + if (is_astc) + write_png = false; +#endif + + if ((!opts.m_ktx_only) && (write_png)) + { + std::string rgb_filename; + if (gi.size() > 1) + rgb_filename = base_filename + string_format("_unpacked_rgb_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index); + else + rgb_filename = base_filename + string_format("_unpacked_rgb_%s_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), image_index); + if (!save_png(rgb_filename, u, cImageSaveIgnoreAlpha)) + { + error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str()); + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + printf("Wrote PNG file \"%s\"\n", rgb_filename.c_str()); + } + + if ((transcoder_tex_fmt == basist::transcoder_texture_format::cTFFXT1_RGB) && (opts.m_write_out)) + { + std::string out_filename; + if (gi.size() > 1) + out_filename = base_filename + string_format("_unpacked_rgb_%s_%u_%04u.out", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index); + else + out_filename = base_filename + string_format("_unpacked_rgb_%s_%04u.out", basist::basis_get_format_name(transcoder_tex_fmt), image_index); + if (!write_3dfx_out_file(out_filename.c_str(), gi[level_index])) + { + error_printf("Failed writing to OUT file \"%s\"\n", out_filename.c_str()); + return false; + } + printf("Wrote .OUT file \"%s\"\n", out_filename.c_str()); + } + + if (basis_transcoder_format_has_alpha(transcoder_tex_fmt) && (!opts.m_ktx_only) && (write_png)) + { + std::string a_filename; + if (gi.size() > 1) + a_filename = base_filename + string_format("_unpacked_a_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index); + else + a_filename = base_filename + string_format("_unpacked_a_%s_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), image_index); + if (!save_png(a_filename, u, cImageSaveGrayscale, 3)) + { + error_printf("Failed writing to PNG file \"%s\"\n", a_filename.c_str()); + return false; + } + printf("Wrote PNG file \"%s\"\n", a_filename.c_str()); + + std::string rgba_filename; + if (gi.size() > 1) + rgba_filename = base_filename + string_format("_unpacked_rgba_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index); + else + rgba_filename = base_filename + string_format("_unpacked_rgba_%s_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), image_index); + if (!save_png(rgba_filename, u)) + { + error_printf("Failed writing to PNG file \"%s\"\n", rgba_filename.c_str()); + return false; + } + printf("Wrote PNG file \"%s\"\n", rgba_filename.c_str()); + } + + } // level_index + + } // image_index + + } // format_iter + + } // if (!validate_flag) + + uint32_t max_mipmap_levels = 0; + + if (!opts.m_etc1_only) + { + // Now unpack to RGBA using the transcoder itself to do the unpacking to raster images + for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++) + { + for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++) + { + const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGBA32; + + basist::basisu_image_level_info level_info; + + if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index)) + { + error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index); + return false; + } + + image img(level_info.m_orig_width, level_info.m_orig_height); + + fill_buffer_with_random_bytes(&img(0, 0), img.get_total_pixels() * sizeof(uint32_t)); + + tm.start(); + + if (!dec.transcode_image_level(&basis_file_data[0], (uint32_t)basis_file_data.size(), image_index, level_index, &img(0, 0).r, img.get_total_pixels(), transcoder_tex_fmt, 0, img.get_pitch(), nullptr, img.get_height())) + { + error_printf("Failed transcoding image level (%u %u %u)!\n", image_index, level_index, transcoder_tex_fmt); + return false; + } + + double total_transcode_time = tm.get_elapsed_ms(); + + total_format_transcoding_time_ms[(int)transcoder_tex_fmt] += total_transcode_time; + + printf("Transcode of image %u level %u res %ux%u format %s succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time); + + if ((!validate_flag) && (!opts.m_ktx_only)) + { + std::string rgb_filename(base_filename + string_format("_unpacked_rgb_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index)); + if (!save_png(rgb_filename, img, cImageSaveIgnoreAlpha)) + { + error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str()); + return false; + } + printf("Wrote PNG file \"%s\"\n", rgb_filename.c_str()); + + std::string a_filename(base_filename + string_format("_unpacked_a_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index)); + if (!save_png(a_filename, img, cImageSaveGrayscale, 3)) + { + error_printf("Failed writing to PNG file \"%s\"\n", a_filename.c_str()); + return false; + } + printf("Wrote PNG file \"%s\"\n", a_filename.c_str()); + } + + } // level_index + } // image_index + + // Now unpack to RGB565 using the transcoder itself to do the unpacking to raster images + for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++) + { + for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++) + { + const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGB565; + + basist::basisu_image_level_info level_info; + + if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index)) + { + error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index); + return false; + } + + basisu::vector packed_img(level_info.m_orig_width * level_info.m_orig_height); + + fill_buffer_with_random_bytes(&packed_img[0], packed_img.size() * sizeof(uint16_t)); + + tm.start(); + + if (!dec.transcode_image_level(&basis_file_data[0], (uint32_t)basis_file_data.size(), image_index, level_index, &packed_img[0], (uint32_t)packed_img.size(), transcoder_tex_fmt, 0, level_info.m_orig_width, nullptr, level_info.m_orig_height)) + { + error_printf("Failed transcoding image level (%u %u %u)!\n", image_index, level_index, transcoder_tex_fmt); + return false; + } + + double total_transcode_time = tm.get_elapsed_ms(); + + total_format_transcoding_time_ms[(int)transcoder_tex_fmt] += total_transcode_time; + + image img(level_info.m_orig_width, level_info.m_orig_height); + for (uint32_t y = 0; y < level_info.m_orig_height; y++) + { + for (uint32_t x = 0; x < level_info.m_orig_width; x++) + { + const uint16_t p = packed_img[x + y * level_info.m_orig_width]; + uint32_t r = p >> 11, g = (p >> 5) & 63, b = p & 31; + r = (r << 3) | (r >> 2); + g = (g << 2) | (g >> 4); + b = (b << 3) | (b >> 2); + img(x, y).set(r, g, b, 255); + } + } + + printf("Transcode of image %u level %u res %ux%u format %s succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time); + + if ((!validate_flag) && (!opts.m_ktx_only)) + { + std::string rgb_filename(base_filename + string_format("_unpacked_rgb_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index)); + if (!save_png(rgb_filename, img, cImageSaveIgnoreAlpha)) + { + error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str()); + return false; + } + printf("Wrote PNG file \"%s\"\n", rgb_filename.c_str()); + } + + } // level_index + } // image_index + + // Now unpack to RGBA4444 using the transcoder itself to do the unpacking to raster images + for (uint32_t image_index = 0; image_index < fileinfo.m_total_images; image_index++) + { + for (uint32_t level_index = 0; level_index < fileinfo.m_image_mipmap_levels[image_index]; level_index++) + { + max_mipmap_levels = basisu::maximum(max_mipmap_levels, fileinfo.m_image_mipmap_levels[image_index]); + + const basist::transcoder_texture_format transcoder_tex_fmt = basist::transcoder_texture_format::cTFRGBA4444; + + basist::basisu_image_level_info level_info; + + if (!dec.get_image_level_info(&basis_file_data[0], (uint32_t)basis_file_data.size(), level_info, image_index, level_index)) + { + error_printf("Failed retrieving image level information (%u %u)!\n", image_index, level_index); + return false; + } + + basisu::vector packed_img(level_info.m_orig_width * level_info.m_orig_height); + + fill_buffer_with_random_bytes(&packed_img[0], packed_img.size() * sizeof(uint16_t)); + + tm.start(); + + if (!dec.transcode_image_level(&basis_file_data[0], (uint32_t)basis_file_data.size(), image_index, level_index, &packed_img[0], (uint32_t)packed_img.size(), transcoder_tex_fmt, 0, level_info.m_orig_width, nullptr, level_info.m_orig_height)) + { + error_printf("Failed transcoding image level (%u %u %u)!\n", image_index, level_index, transcoder_tex_fmt); + return false; + } + + double total_transcode_time = tm.get_elapsed_ms(); + + total_format_transcoding_time_ms[(int)transcoder_tex_fmt] += total_transcode_time; + + image img(level_info.m_orig_width, level_info.m_orig_height); + for (uint32_t y = 0; y < level_info.m_orig_height; y++) + { + for (uint32_t x = 0; x < level_info.m_orig_width; x++) + { + const uint16_t p = packed_img[x + y * level_info.m_orig_width]; + uint32_t r = p >> 12, g = (p >> 8) & 15, b = (p >> 4) & 15, a = p & 15; + r = (r << 4) | r; + g = (g << 4) | g; + b = (b << 4) | b; + a = (a << 4) | a; + img(x, y).set(r, g, b, a); + } + } + + printf("Transcode of image %u level %u res %ux%u format %s succeeded in %3.3f ms\n", image_index, level_index, level_info.m_orig_width, level_info.m_orig_height, basist::basis_get_format_name(transcoder_tex_fmt), total_transcode_time); + + if ((!validate_flag) && (!opts.m_ktx_only)) + { + std::string rgb_filename(base_filename + string_format("_unpacked_rgb_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index)); + if (!save_png(rgb_filename, img, cImageSaveIgnoreAlpha)) + { + error_printf("Failed writing to PNG file \"%s\"\n", rgb_filename.c_str()); + return false; + } + printf("Wrote PNG file \"%s\"\n", rgb_filename.c_str()); + + std::string a_filename(base_filename + string_format("_unpacked_a_%s_%u_%04u.png", basist::basis_get_format_name(transcoder_tex_fmt), level_index, image_index)); + if (!save_png(a_filename, img, cImageSaveGrayscale, 3)) + { + error_printf("Failed writing to PNG file \"%s\"\n", a_filename.c_str()); + return false; + } + printf("Wrote PNG file \"%s\"\n", a_filename.c_str()); + } + + } // level_index + } // image_index + + } // if (!m_etc1_only) + + if (pCSV_file) + { + fprintf(pCSV_file, "%s, %3.3f, %3.3f, %u, %u, %u, %3.3f, ", + base_filename.c_str(), + basis_bits_per_texel, + comp_bits_per_texel, + fileinfo.m_total_images, + max_mipmap_levels, + (uint32_t)fileinfo.m_slice_info.size(), + start_transcoding_time_ms); + + for (int format_iter = first_format; format_iter < last_format; format_iter++) + { + const basist::transcoder_texture_format transcoder_tex_fmt = static_cast(format_iter); + + if (!basis_is_format_supported(transcoder_tex_fmt, fileinfo.m_tex_format)) + continue; + if (transcoder_tex_fmt == basist::transcoder_texture_format::cTFBC7_ALT) + continue; + + fprintf(pCSV_file, "%3.3f", total_format_transcoding_time_ms[format_iter]); + if (format_iter != (last_format - 1)) + fprintf(pCSV_file, ","); + } + fprintf(pCSV_file, "\n"); + } + + return true; +} + +static bool unpack_and_validate_mode(command_line_params &opts) +{ + interval_timer tm; + tm.start(); + + //const bool validate_flag = (opts.m_mode == cValidate); + + basis_data* pGlobal_codebook_data = nullptr; + if (opts.m_etc1s_use_global_codebooks_file.size()) + { + pGlobal_codebook_data = load_basis_file(opts.m_etc1s_use_global_codebooks_file.c_str(), true); + if (!pGlobal_codebook_data) + { + error_printf("Failed loading global codebook data from file \"%s\"\n", opts.m_etc1s_use_global_codebooks_file.c_str()); + return false; + } + printf("Loaded global codebooks from file \"%s\"\n", opts.m_etc1s_use_global_codebooks_file.c_str()); + } + + if (!opts.m_input_filenames.size()) + { + error_printf("No input files to process!\n"); + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + + FILE* pCSV_file = nullptr; + if ((opts.m_csv_file.size()) && (opts.m_mode == cValidate)) + { + pCSV_file = fopen_safe(opts.m_csv_file.c_str(), "w"); + if (!pCSV_file) + { + error_printf("Failed opening CVS file \"%s\"\n", opts.m_csv_file.c_str()); + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + //fprintf(pCSV_file, "Filename, Size, Slices, Width, Height, HasAlpha, BitsPerTexel, Slice0RGBAvgPSNR, Slice0RGBAAvgPSNR, Slice0Luma709PSNR, Slice0BestETC1SLuma709PSNR, Q, CL, Time, RGBAvgPSNRMin, RGBAvgPSNRAvg, AAvgPSNRMin, AAvgPSNRAvg, Luma709PSNRMin, Luma709PSNRAvg\n"); + } + + uint32_t total_unpack_warnings = 0; + uint32_t total_pvrtc_nonpow2_warnings = 0; + + for (uint32_t file_index = 0; file_index < opts.m_input_filenames.size(); file_index++) + { + const char* pInput_filename = opts.m_input_filenames[file_index].c_str(); + + std::string base_filename; + string_split_path(pInput_filename, nullptr, nullptr, &base_filename, nullptr); + + uint8_vec file_data; + if (!basisu::read_file_to_vec(pInput_filename, file_data)) + { + error_printf("Failed reading file \"%s\"\n", pInput_filename); + if (pCSV_file) fclose(pCSV_file); + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + + if (!file_data.size()) + { + error_printf("File is empty!\n"); + if (pCSV_file) fclose(pCSV_file); + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + + if (file_data.size() > UINT32_MAX) + { + error_printf("File is too large!\n"); + if (pCSV_file) fclose(pCSV_file); + delete pGlobal_codebook_data; pGlobal_codebook_data = nullptr; + return false; + } + + bool is_ktx2 = false; + if (file_data.size() >= sizeof(basist::g_ktx2_file_identifier)) + { + is_ktx2 = (memcmp(file_data.data(), basist::g_ktx2_file_identifier, sizeof(basist::g_ktx2_file_identifier)) == 0); + } + + printf("Input file \"%s\", KTX2: %u\n", pInput_filename, is_ktx2); + + bool status; + if (is_ktx2) + { + status = unpack_and_validate_ktx2_file( + file_index, + base_filename, + file_data, + opts, + pCSV_file, + pGlobal_codebook_data, + total_unpack_warnings, + total_pvrtc_nonpow2_warnings); + } + else + { + status = unpack_and_validate_basis_file( + file_index, + base_filename, + file_data, + opts, + pCSV_file, + pGlobal_codebook_data, + total_unpack_warnings, + total_pvrtc_nonpow2_warnings); + } + + if (!status) + { + if (pCSV_file) + fclose(pCSV_file); + + delete pGlobal_codebook_data; + pGlobal_codebook_data = nullptr; + + return false; + } + + } // file_index + + if (total_pvrtc_nonpow2_warnings) + printf("Warning: %u images could not be transcoded to PVRTC1 because one or both dimensions were not a power of 2\n", total_pvrtc_nonpow2_warnings); + + if (total_unpack_warnings) + printf("ATTENTION: %u total images had invalid GPU texture data!\n", total_unpack_warnings); + else + printf("Success\n"); + + debug_printf("Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + + if (pCSV_file) + { + fclose(pCSV_file); + pCSV_file = nullptr; + } + delete pGlobal_codebook_data; + pGlobal_codebook_data = nullptr; + + return true; +} + +static bool compare_mode(command_line_params &opts) +{ + if (opts.m_input_filenames.size() != 2) + { + error_printf("Must specify two PNG filenames using -file\n"); + return false; + } + + image a, b; + if (!load_image(opts.m_input_filenames[0].c_str(), a)) + { + error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[0].c_str()); + return false; + } + + printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[0].c_str(), a.get_width(), a.get_height(), a.has_alpha()); + + if (!load_image(opts.m_input_filenames[1].c_str(), b)) + { + error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[1].c_str()); + return false; + } + + printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[1].c_str(), b.get_width(), b.get_height(), b.has_alpha()); + + if ((a.get_width() != b.get_width()) || (a.get_height() != b.get_height())) + { + printf("Images don't have the same dimensions - cropping input images to smallest common dimensions\n"); + + uint32_t w = minimum(a.get_width(), b.get_width()); + uint32_t h = minimum(a.get_height(), b.get_height()); + + a.crop(w, h); + b.crop(w, h); + } + + printf("Comparison image res: %ux%u\n", a.get_width(), a.get_height()); + + image_metrics im; + im.calc(a, b, 0, 3); + im.print("RGB "); + + im.calc(a, b, 0, 4); + im.print("RGBA "); + + im.calc(a, b, 0, 1); + im.print("R "); + + im.calc(a, b, 1, 1); + im.print("G "); + + im.calc(a, b, 2, 1); + im.print("B "); + + im.calc(a, b, 3, 1); + im.print("A "); + + im.calc(a, b, 0, 0); + im.print("Y 709 " ); + + im.calc(a, b, 0, 0, true, true); + im.print("Y 601 " ); + + if (opts.m_compare_ssim) + { + vec4F s_rgb(compute_ssim(a, b, false, false)); + + printf("R SSIM: %f\n", s_rgb[0]); + printf("G SSIM: %f\n", s_rgb[1]); + printf("B SSIM: %f\n", s_rgb[2]); + printf("RGB Avg SSIM: %f\n", (s_rgb[0] + s_rgb[1] + s_rgb[2]) / 3.0f); + printf("A SSIM: %f\n", s_rgb[3]); + + vec4F s_y_709(compute_ssim(a, b, true, false)); + printf("Y 709 SSIM: %f\n", s_y_709[0]); + + vec4F s_y_601(compute_ssim(a, b, true, true)); + printf("Y 601 SSIM: %f\n", s_y_601[0]); + } + + image delta_img(a.get_width(), a.get_height()); + + const int X = 2; + + for (uint32_t y = 0; y < a.get_height(); y++) + { + for (uint32_t x = 0; x < a.get_width(); x++) + { + color_rgba &d = delta_img(x, y); + + for (int c = 0; c < 4; c++) + d[c] = (uint8_t)clamp((a(x, y)[c] - b(x, y)[c]) * X + 128, 0, 255); + } // x + } // y + + save_png("a_rgb.png", a, cImageSaveIgnoreAlpha); + save_png("a_alpha.png", a, cImageSaveGrayscale, 3); + printf("Wrote a_rgb.png and a_alpha.png\n"); + + save_png("b_rgb.png", b, cImageSaveIgnoreAlpha); + save_png("b_alpha.png", b, cImageSaveGrayscale, 3); + printf("Wrote b_rgb.png and b_alpha.png\n"); + + save_png("delta_img_rgb.png", delta_img, cImageSaveIgnoreAlpha); + printf("Wrote delta_img_rgb.png\n"); + + save_png("delta_img_a.png", delta_img, cImageSaveGrayscale, 3); + printf("Wrote delta_img_a.png\n"); + + uint32_t bins[5][512]; + clear_obj(bins); + + running_stat delta_stats[5]; + basisu::rand rm; + + double avg[5]; + clear_obj(avg); + + for (uint32_t y = 0; y < a.get_height(); y++) + { + for (uint32_t x = 0; x < a.get_width(); x++) + { + //color_rgba& d = delta_img(x, y); + + for (int c = 0; c < 4; c++) + { + int delta = a(x, y)[c] - b(x, y)[c]; + + //delta = clamp((int)std::round(rm.gaussian(70.0f, 10.0f)), -255, 255); + + bins[c][delta + 256]++; + delta_stats[c].push(delta); + + avg[c] += delta; + } + + int y_delta = a(x, y).get_709_luma() - b(x, y).get_709_luma(); + bins[4][y_delta + 256]++; + delta_stats[4].push(y_delta); + + avg[4] += y_delta; + + } // x + } // y + + for (uint32_t i = 0; i <= 4; i++) + avg[i] /= a.get_total_pixels(); + + printf("\n"); + + //bins[2][256+-255] = 100000; + //bins[2][256-56] = 50000; + + const uint32_t X_SIZE = 128, Y_SIZE = 40; + + for (uint32_t c = 0; c <= 4; c++) + { + std::vector plot[Y_SIZE + 1]; + for (uint32_t i = 0; i < Y_SIZE; i++) + { + plot[i].resize(X_SIZE + 2); + memset(plot[i].data(), ' ', X_SIZE + 1); + } + + uint32_t max_val = 0; + int max_val_bin_index = 0; + int lowest_bin_index = INT_MAX, highest_bin_index = INT_MIN; + double avg_val = 0; + double total_val = 0; + running_stat bin_stats; + + for (int y = -255; y <= 255; y++) + { + uint32_t val = bins[c][256 + y]; + if (!val) + continue; + + bin_stats.push(y); + + total_val += (double)val; + + lowest_bin_index = minimum(lowest_bin_index, y); + highest_bin_index = maximum(highest_bin_index, y); + + if (val > max_val) + { + max_val = val; + max_val_bin_index = y; + } + avg_val += y * (double)val; + } + avg_val /= total_val; + + int lo_limit = -(int)X_SIZE / 2; + int hi_limit = X_SIZE / 2; + for (int x = lo_limit; x <= hi_limit; x++) + { + uint32_t total = 0; + if (x == lo_limit) + { + for (int i = -255; i <= lo_limit; i++) + total += bins[c][256 + i]; + } + else if (x == hi_limit) + { + for (int i = hi_limit; i <= 255; i++) + total += bins[c][256 + i]; + } + else + { + total = bins[c][256 + x]; + } + + uint32_t height = max_val ? (total * Y_SIZE + max_val - 1) / max_val : 0; + + if (height) + { + for (uint32_t y = (Y_SIZE - 1) - (height - 1); y <= (Y_SIZE - 1); y++) + plot[y][x + X_SIZE / 2] = '*'; + } + } + + printf("%c delta histogram: total samples: %5.0f, max bin value: %u index: %i (%3.3f%% of total), range %i [%i,%i], weighted mean: %f\n", "RGBAY"[c], total_val, max_val, max_val_bin_index, max_val * 100.0f / total_val, highest_bin_index - lowest_bin_index + 1, lowest_bin_index, highest_bin_index, avg_val); + printf("bin mean: %f, bin std deviation: %f, non-zero bins: %u\n", bin_stats.get_mean(), bin_stats.get_std_dev(), bin_stats.get_num()); + printf("delta mean: %f, delta std deviation: %f\n", delta_stats[c].get_mean(), delta_stats[c].get_std_dev()); + printf("\n"); + + for (uint32_t y = 0; y < Y_SIZE; y++) + printf("%s\n", (char*)plot[y].data()); + + char tics[1024]; + tics[0] = '\0'; + char tics2[1024]; + tics2[0] = '\0'; + + for (int x = 0; x <= (int)X_SIZE; x++) + { + char buf[64]; + if (x == X_SIZE / 2) + { + while ((int)strlen(tics) < x) + strcat(tics, "."); + + while ((int)strlen(tics2) < x) + strcat(tics2, " "); + + sprintf(buf, "0"); + strcat(tics, buf); + } + else if (((x & 7) == 0) || (x == X_SIZE)) + { + while ((int)strlen(tics) < x) + strcat(tics, "."); + + while ((int)strlen(tics2) < x) + strcat(tics2, " "); + + int v = (x - (int)X_SIZE / 2); + sprintf(buf, "%i", v / 10); + strcat(tics, buf); + + if (v < 0) + { + if (-v < 10) + sprintf(buf, "%i", v % 10); + else + sprintf(buf, " %i", -v % 10); + } + else + sprintf(buf, "%i", v % 10); + strcat(tics2, buf); + } + else + { + while ((int)strlen(tics) < x) + strcat(tics, "."); + } + } + printf("%s\n", tics); + printf("%s\n", tics2); + + printf("\n"); + } + + return true; +} + +static bool split_image_mode(command_line_params& opts) +{ + if (opts.m_input_filenames.size() != 1) + { + error_printf("Must specify one image filename using -file\n"); + return false; + } + + image a; + if (!load_image(opts.m_input_filenames[0].c_str(), a)) + { + error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[0].c_str()); + return false; + } + + printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[0].c_str(), a.get_width(), a.get_height(), a.has_alpha()); + + if (!save_png("split_rgb.png", a, cImageSaveIgnoreAlpha)) + { + fprintf(stderr, "Failed writing file split_rgb.png\n"); + return false; + } + printf("Wrote file split_rgb.png\n"); + + for (uint32_t i = 0; i < 4; i++) + { + char buf[256]; + snprintf(buf, sizeof(buf), "split_%c.png", "RGBA"[i]); + if (!save_png(buf, a, cImageSaveGrayscale, i)) + { + fprintf(stderr, "Failed writing file %s\n", buf); + return false; + } + printf("Wrote file %s\n", buf); + } + + return true; +} + +static bool combine_images_mode(command_line_params& opts) +{ + if (opts.m_input_filenames.size() != 2) + { + error_printf("Must specify two image filename using -file\n"); + return false; + } + + image a, b; + if (!load_image(opts.m_input_filenames[0].c_str(), a)) + { + error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[0].c_str()); + return false; + } + + printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[0].c_str(), a.get_width(), a.get_height(), a.has_alpha()); + + if (!load_image(opts.m_input_filenames[1].c_str(), b)) + { + error_printf("Failed loading image from file \"%s\"!\n", opts.m_input_filenames[1].c_str()); + return false; + } + + printf("Loaded \"%s\", %ux%u, has alpha: %u\n", opts.m_input_filenames[1].c_str(), b.get_width(), b.get_height(), b.has_alpha()); + + const uint32_t width = minimum(a.get_width(), b.get_width()); + const uint32_t height = minimum(b.get_height(), b.get_height()); + + image combined_img(width, height); + for (uint32_t y = 0; y < height; y++) + { + for (uint32_t x = 0; x < width; x++) + { + combined_img(x, y) = a(x, y); + combined_img(x, y).a = b(x, y).g; + } + } + + const char* pOutput_filename = "combined.png"; + if (opts.m_output_filename.size()) + pOutput_filename = opts.m_output_filename.c_str(); + + if (!save_png(pOutput_filename, combined_img)) + { + fprintf(stderr, "Failed writing file %s\n", pOutput_filename); + return false; + } + printf("Wrote file %s\n", pOutput_filename); + + return true; +} + +//#include "encoder/basisu_astc_decomp.h" +#include "encoder/basisu_pvrtc1_4.h" + +static bool bench_mode(command_line_params& opts) +{ +#if 0 + ispc::bc7e_compress_block_init(); + + ispc::bc7e_compress_block_params pack_params; + memset(&pack_params, 0, sizeof(pack_params)); + ispc::bc7e_compress_block_params_init_slow(&pack_params, false); +#endif + + const uint32_t JOB_POOL_SIZE = 7; + job_pool jpool(JOB_POOL_SIZE); + + float total_uastc_psnr = 0, total_uastc_a_psnr = 0, total_uastc_rgba_psnr = 0; + float total_rdo_uastc_psnr = 0, total_rdo_uastc_a_psnr = 0, total_rdo_uastc_rgba_psnr = 0; + float total_uastc2_psnr = 0, total_uastc2_a_psnr = 0, total_uastc2_rgba_psnr = 0; + float total_bc7_psnr = 0, total_bc7_a_psnr = 0, total_bc7_rgba_psnr = 0; + float total_rdo_bc7_psnr = 0, total_rdo_bc7_a_psnr = 0, total_rdo_bc7_rgba_psnr = 0; + float total_obc1_psnr = 0; + float total_obc1_2_psnr = 0; + float total_obc1_psnr_sq = 0; + float total_obc1_2_psnr_sq = 0; + float total_bc1_psnr = 0; + float total_bc1_psnr_sq = 0; + //float total_obc7_psnr = 0, total_obc7_rgba_psnr = 0; + //float total_obc7_a_psnr = 0; + //float total_oastc_psnr = 0, total_oastc_rgba_psnr = 0; + float total_bc7enc_psnr = 0, total_bc7enc_rgba_psnr = 0, total_bc7enc_a_psnr = 0; + //float total_oastc_a_psnr = 0; + float total_etc1_psnr = 0; + float total_etc1_y_psnr = 0; + float total_etc1_g_psnr = 0; + float total_etc2_psnr = 0, total_etc2_rgba_psnr = 0; + float total_etc2_a_psnr = 0; + float total_bc3_psnr = 0, total_bc3_rgba_psnr = 0; + float total_bc3_a_psnr = 0; + float total_eac_r11_psnr = 0; + float total_eac_rg11_psnr = 0; + float total_pvrtc1_rgb_psnr = 0, total_pvrtc1_rgba_psnr = 0; + float total_pvrtc1_a_psnr = 0; + uint32_t total_images = 0; + uint32_t total_a_images = 0; + uint32_t total_pvrtc1_images = 0; + + uint64_t overall_mode_hist[basist::TOTAL_UASTC_MODES]; + memset(overall_mode_hist, 0, sizeof(overall_mode_hist)); + + std::mutex mode_hist_mutex; + + uint32_t etc1_hint_hist[32]; + memset(etc1_hint_hist, 0, sizeof(etc1_hint_hist)); + + srand(1023); + uint32_t first_image = 96; + uint32_t last_image = 96; //34 + + if (opts.m_input_filenames.size() >= 1) + { + first_image = 1; + last_image = 1; + } + + const bool perceptual = false; + const bool force_la = false; + + interval_timer otm; + otm.start(); + + //const uint32_t flags = cPackUASTCLevelFastest;// | cPackUASTCETC1DisableFlipAndIndividual;// Slower; + //const uint32_t flags = cPackUASTCLevelFaster; + //const uint32_t flags = cPackUASTCLevelVerySlow; + const uint32_t flags = cPackUASTCLevelDefault; + + uint32_t etc1_inten_hist[8] = { 0,0,0,0,0,0,0,0 }; + uint32_t etc1_flip_hist[2] = { 0, 0 }; + uint32_t etc1_diff_hist[2] = { 0, 0 }; + + double overall_total_enc_time = 0; + double overall_total_bench_time = 0; + double overall_total_bench2_time = 0; + uint64_t overall_blocks = 0; + + //bc7enc_compress_block_params bc7enc_p; + //bc7enc_compress_block_params_init(&bc7enc_p); + //bc7enc_compress_block_params_init_linear_weights(&bc7enc_p); + //bc7enc_p.m_uber_level = 3; + + uint64_t total_comp_size = 0; + uint64_t total_raw_size = 0; + uint64_t total_rdo_comp_size = 0; + uint64_t total_rdo_raw_size = 0; + uint64_t total_comp_blocks = 0; + + for (uint32_t image_index = first_image; image_index <= last_image; image_index++) + { + uint64_t mode_hist[basist::TOTAL_UASTC_MODES]; + memset(mode_hist, 0, sizeof(mode_hist)); + + char buf[1024]; + if (opts.m_input_filenames.size() >= 1) + strcpy(buf, opts.m_input_filenames[0].c_str()); + else + sprintf(buf, "c:/dev/test_images/photo_png/kodim%02u.png", image_index); + + printf("Image: %s\n", buf); + + image img; + if (!load_image(buf, img)) + return 0; + + if (opts.m_input_filenames.size() == 2) + { + image alpha_img; + if (!load_image(opts.m_input_filenames[1].c_str(), alpha_img)) + return 0; + + printf("Alpha image: %s, %ux%u\n", opts.m_input_filenames[1].c_str(), alpha_img.get_width(), alpha_img.get_height()); + + for (uint32_t x = 0; x < alpha_img.get_width(); x++) + for (uint32_t y = 0; y < alpha_img.get_height(); y++) + { + if (x < img.get_width() && y < img.get_height()) + img(x, y)[3] = (uint8_t)alpha_img(x, y).get_709_luma(); + } + } + + if (force_la) + { + for (uint32_t x = 0; x < img.get_width(); x++) + { + for (uint32_t y = 0; y < img.get_height(); y++) + { + const color_rgba& c = img(x, y); + img(x, y).set(c.r, c.r, c.r, c.g); + } + } + } + + // HACK HACK + //if (!img.has_alpha()) + // continue; + + // HACK HACK + //img.crop(1024, 1024); + + const uint32_t num_blocks_x = img.get_block_width(4); + const uint32_t num_blocks_y = img.get_block_height(4); + const uint32_t total_blocks = num_blocks_x * num_blocks_y; + const bool img_has_alpha = img.has_alpha(); + + img.crop_dup_borders(num_blocks_x * 4, num_blocks_y * 4); + + printf("%ux%u, has alpha: %u\n", img.get_width(), img.get_height(), img_has_alpha); + + image uastc_img(num_blocks_x * 4, num_blocks_y * 4); + image rdo_uastc_img(num_blocks_x * 4, num_blocks_y * 4); + image uastc2_img(num_blocks_x * 4, num_blocks_y * 4); + image opt_bc1_img(num_blocks_x * 4, num_blocks_y * 4); + image opt_bc1_2_img(num_blocks_x * 4, num_blocks_y * 4); + image bc1_img(num_blocks_x * 4, num_blocks_y * 4); + image bc3_img(num_blocks_x * 4, num_blocks_y * 4); + image eac_r11_img(num_blocks_x * 4, num_blocks_y * 4); + image eac_rg11_img(num_blocks_x * 4, num_blocks_y * 4); + image bc7_img(num_blocks_x * 4, num_blocks_y * 4); + image rdo_bc7_img(num_blocks_x * 4, num_blocks_y * 4); + image opt_bc7_img(num_blocks_x * 4, num_blocks_y * 4); + image etc1_img(num_blocks_x * 4, num_blocks_y * 4); + image etc1_g_img(num_blocks_x * 4, num_blocks_y * 4); + image etc2_img(num_blocks_x * 4, num_blocks_y * 4); + image part_img(num_blocks_x * 4, num_blocks_y * 4); + image opt_astc_img(num_blocks_x * 4, num_blocks_y * 4); + image bc7enc_img(num_blocks_x * 4, num_blocks_y * 4); + + uint32_t total_bc1_hint0s = 0; + uint32_t total_bc1_hint1s = 0; + uint32_t total_bc1_hint01s = 0; + + double total_enc_time = 0; + double total_bench_time = 0; + double total_bench2_time = 0; + + basisu::vector ublocks(total_blocks); + +#if 0 + astc_enc_settings astc_settings; + //if (img_has_alpha) + GetProfile_astc_alpha_slow(&astc_settings, 4, 4); + //else + // GetProfile_astc_fast(&astc_settings, 4, 4); +#endif + +#if 0 +//#pragma omp parallel for + for (int by = 0; by < (int)num_blocks_y; by++) + { + // Process 64 blocks at a time, for efficient SIMD processing. + // Ideally, N >= 8 (or more) and (N % 8) == 0. + const int N = 64; + + for (uint32_t bx = 0; bx < num_blocks_x; bx += N) + { + const uint32_t num_blocks_to_process = basisu::minimum(num_blocks_x - bx, N); + + color_rgba pixels[16 * N]; + +#if 0 + // BC7E + // Extract num_blocks_to_process 4x4 pixel blocks from the source image and put them into the pixels[] array. + for (uint32_t b = 0; b < num_blocks_to_process; b++) + img.extract_block_clamped(pixels + b * 16, (bx + b) * 4, by * 4, 4, 4); + + // Compress the blocks to BC7. + // Note: If you've used Intel's ispc_texcomp, the input pixels are different. BC7E requires a pointer to an array of 16 pixels for each block. + basist::bc7_block packed_blocks[N]; + ispc::bc7e_compress_blocks(num_blocks_to_process, (uint64_t*)packed_blocks, reinterpret_cast(pixels), &pack_params); + + for (uint32_t i = 0; i < num_blocks_to_process; i++) + { + color_rgba decoded_block[4][4]; + + //detexDecompressBlockBPTC((uint8_t *)&packed_blocks[i], 0xFF, 0, (uint8_t *)&decoded_block[0][0]); + unpack_block(texture_format::cBC7, &packed_blocks[i], &decoded_block[0][0]); + + opt_bc7_img.set_block_clipped(&decoded_block[0][0], (bx + i) * 4, by * 4, 4, 4); + } +#endif + +#if 0 + // ispc_texcomp + color_rgba raster_pixels[(N * 4) * 4]; + + const uint32_t raster_width = num_blocks_to_process * 4; + const uint32_t raster_height = 4; + + rgba_surface surf; + surf.ptr = &raster_pixels[0].r; + surf.width = raster_width; + surf.height = 4; + surf.stride = raster_width * 4; + + for (uint32_t b = 0; b < num_blocks_to_process; b++) + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + raster_pixels[y * raster_width + b * 4 + x] = pixels[b * 16 + y * 4 + x]; + + uint8_t astc_blocks[16 * N]; + CompressBlocksASTC(&surf, astc_blocks, &astc_settings); + + for (uint32_t i = 0; i < num_blocks_to_process; i++) + { + color_rgba decoded_astc_block[4][4]; + basisu_astc::astc::decompress((uint8_t*)decoded_astc_block, (uint8_t*)&astc_blocks[i * 16], false, 4, 4); + + opt_astc_img.set_block_clipped(&decoded_astc_block[0][0], (bx + i) * 4, by * 4, 4, 4); + } +#endif + } + } +#endif + + const uint32_t N = 128; + for (uint32_t block_index_iter = 0; block_index_iter < total_blocks; block_index_iter += N) + { + const uint32_t first_index = block_index_iter; + const uint32_t last_index = minimum(total_blocks, block_index_iter + N); + + jpool.add_job([first_index, last_index, &img, num_blocks_x, num_blocks_y, + &opt_bc1_img, &opt_bc1_2_img, &mode_hist, &overall_mode_hist, &uastc_img, &uastc2_img, &bc7_img, &part_img, &mode_hist_mutex, &bc1_img, &etc1_img, &etc1_g_img, &etc2_img, &etc1_hint_hist, &perceptual, + &total_bc1_hint0s, &total_bc1_hint1s, &total_bc1_hint01s, &bc3_img, &total_enc_time, &eac_r11_img, &eac_rg11_img, &ublocks, &flags, &etc1_inten_hist, &etc1_flip_hist, &etc1_diff_hist, &total_bench_time, &total_bench2_time, + //&bc7enc_p, &bc7enc_img] { + &bc7enc_img] { + + BASISU_NOTE_UNUSED(num_blocks_y); + BASISU_NOTE_UNUSED(perceptual); + BASISU_NOTE_UNUSED(flags); + + for (uint32_t block_index = first_index; block_index < last_index; block_index++) + { + const uint32_t block_x = block_index % num_blocks_x; + const uint32_t block_y = block_index / num_blocks_x; + + //uint32_t block_x = 170; + //uint32_t block_y = 167; + + // HACK HACK + //if ((block_x == 77) && (block_y == 54)) + // printf("!"); + + color_rgba block[4][4]; + img.extract_block_clamped(&block[0][0], block_x * 4, block_y * 4, 4, 4); + + uint8_t bc7_block[16]; + //bc7enc_compress_block(bc7_block, block, &bc7enc_p); + color_rgba decoded_bc7enc_blk[4][4]; + unpack_block(texture_format::cBC7, &bc7_block, &decoded_bc7enc_blk[0][0]); + bc7enc_img.set_block_clipped(&decoded_bc7enc_blk[0][0], block_x * 4, block_y * 4, 4, 4); + + // Pack near-optimal BC1 + // stb_dxt BC1 encoder + uint8_t bc1_block[8]; + + interval_timer btm; + btm.start(); + + //stb_compress_dxt_block(bc1_block, (uint8_t*)&block[0][0], 0, STB_DXT_HIGHQUAL); + basist::encode_bc1(bc1_block, (uint8_t*)&block[0][0], 0);// basist::cEncodeBC1HighQuality); + double total_b_time = btm.get_elapsed_secs(); + { + std::lock_guard lck(mode_hist_mutex); + total_bench_time += total_b_time; + } + + color_rgba block_bc1[4][4]; + unpack_block(texture_format::cBC1, bc1_block, &block_bc1[0][0]); + opt_bc1_img.set_block_clipped(&block_bc1[0][0], block_x * 4, block_y * 4, 4, 4); + + //uint64_t e1 = 0; + //for (uint32_t i = 0; i < 16; i++) + // e1 += color_distance(((color_rgba*)block_bc1)[i], ((color_rgba*)block)[i], false); + + // My BC1 encoder + uint8_t bc1_block_2[8]; + color_rgba block_bc1_2[4][4]; + + btm.start(); + basist::encode_bc1_alt(bc1_block_2, (uint8_t*)&block[0][0], basist::cEncodeBC1HighQuality); + double total_b2_time = btm.get_elapsed_secs(); + { + std::lock_guard lck(mode_hist_mutex); + total_bench2_time += total_b2_time; + } + + unpack_block(texture_format::cBC1, bc1_block_2, &block_bc1_2[0][0]); + //uint64_t e2 = 0; + //for (uint32_t i = 0; i < 16; i++) + // e2 += color_distance(((color_rgba *)block_bc1_2)[i], ((color_rgba*)block)[i], false); + + opt_bc1_2_img.set_block_clipped(&block_bc1_2[0][0], block_x * 4, block_y * 4, 4, 4); + + // Encode to UASTC + basist::uastc_block encoded_uastc_blk; + + interval_timer tm; + tm.start(); + encode_uastc(&block[0][0].r, encoded_uastc_blk, flags); + double total_time = tm.get_elapsed_secs(); + { + std::lock_guard lck(mode_hist_mutex); + total_enc_time += total_time; + } + + ublocks[block_x + block_y * num_blocks_x] = encoded_uastc_blk; + +#if 0 + for (uint32_t i = 0; i < 16; i++) + printf("0x%X,", encoded_uastc_blk.m_bytes[i]); + printf("\n"); +#endif + + // Unpack UASTC + basist::unpacked_uastc_block unpacked_uastc_blk; + unpack_uastc(encoded_uastc_blk, unpacked_uastc_blk, false); + + color_rgba unpacked_uastc_block_pixels[4][4]; + bool success = basist::unpack_uastc(unpacked_uastc_blk, (basist::color32*) & unpacked_uastc_block_pixels[0][0], false); + (void)success; + assert(success); + + uastc_img.set_block_clipped(&unpacked_uastc_block_pixels[0][0], block_x * 4, block_y * 4, 4, 4); + + const uint32_t best_mode = unpacked_uastc_blk.m_mode; + + { + std::lock_guard lck(mode_hist_mutex); + assert(best_mode < basist::TOTAL_UASTC_MODES); + if (best_mode < basist::TOTAL_UASTC_MODES) + { + mode_hist[best_mode]++; + overall_mode_hist[best_mode]++; + } + + if (basist::g_uastc_mode_has_etc1_bias[best_mode]) + etc1_hint_hist[unpacked_uastc_blk.m_etc1_bias]++; + + total_bc1_hint0s += unpacked_uastc_blk.m_bc1_hint0; + total_bc1_hint1s += unpacked_uastc_blk.m_bc1_hint1; + total_bc1_hint01s += (unpacked_uastc_blk.m_bc1_hint0 || unpacked_uastc_blk.m_bc1_hint1); + + etc1_inten_hist[unpacked_uastc_blk.m_etc1_inten0]++; + etc1_inten_hist[unpacked_uastc_blk.m_etc1_inten1]++; + + etc1_flip_hist[unpacked_uastc_blk.m_etc1_flip]++; + etc1_diff_hist[unpacked_uastc_blk.m_etc1_diff]++; + } + + // Transcode to BC1 + color_rgba tblock_bc1[4][4]; + + uint8_t tbc1_block[8]; + transcode_uastc_to_bc1(encoded_uastc_blk, tbc1_block, false); + unpack_block(texture_format::cBC1, tbc1_block, &tblock_bc1[0][0]); + bc1_img.set_block_clipped(&tblock_bc1[0][0], block_x * 4, block_y * 4, 4, 4); + + // Transcode to BC7 + basist::bc7_optimization_results best_bc7_results; + transcode_uastc_to_bc7(unpacked_uastc_blk, best_bc7_results); + + { + basist::bc7_block bc7_data; + encode_bc7_block(&bc7_data, &best_bc7_results); + + color_rgba decoded_bc7_blk[4][4]; + unpack_block(texture_format::cBC7, &bc7_data, &decoded_bc7_blk[0][0]); + + bc7_img.set_block_clipped(&decoded_bc7_blk[0][0], block_x * 4, block_y * 4, 4, 4); + + // Compute partition visualization image + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t part = 0; + switch (best_bc7_results.m_mode) + { + case 1: + case 3: + case 7: + part = basist::g_bc7_partition2[best_bc7_results.m_partition * 16 + x + y * 4]; + break; + case 0: + case 2: + part = basist::g_bc7_partition3[best_bc7_results.m_partition * 16 + x + y * 4]; + break; + } + + color_rgba c(0, 255, 0, 255); + if (part == 1) + c.set(255, 0, 0, 255); + else if (part == 2) + c.set(0, 0, 255, 255); + + part_img.set_clipped(block_x * 4 + x, block_y * 4 + y, c); + } + } + } + + bool high_quality = false; + + // Transcode UASTC->BC3 + uint8_t ublock_bc3[16]; + transcode_uastc_to_bc3(encoded_uastc_blk, ublock_bc3, high_quality); + color_rgba ublock_bc3_unpacked[4][4]; + unpack_block(texture_format::cBC3, &ublock_bc3, &ublock_bc3_unpacked[0][0]); + bc3_img.set_block_clipped(&ublock_bc3_unpacked[0][0], block_x * 4, block_y * 4, 4, 4); + + // Transcode UASTC->R11 + uint8_t ublock_eac_r11[8]; + transcode_uastc_to_etc2_eac_r11(encoded_uastc_blk, ublock_eac_r11, high_quality, 0); + color_rgba ublock_eac_r11_unpacked[4][4]; + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + ublock_eac_r11_unpacked[y][x].set(0, 0, 0, 255); + unpack_block(texture_format::cETC2_R11_EAC, &ublock_eac_r11, &ublock_eac_r11_unpacked[0][0]); + eac_r11_img.set_block_clipped(&ublock_eac_r11_unpacked[0][0], block_x * 4, block_y * 4, 4, 4); + + // Transcode UASTC->RG11 + uint8_t ublock_eac_rg11[16]; + transcode_uastc_to_etc2_eac_rg11(encoded_uastc_blk, ublock_eac_rg11, high_quality, 0, 1); + color_rgba ublock_eac_rg11_unpacked[4][4]; + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + ublock_eac_rg11_unpacked[y][x].set(0, 0, 0, 255); + unpack_block(texture_format::cETC2_RG11_EAC, &ublock_eac_rg11, &ublock_eac_rg11_unpacked[0][0]); + eac_rg11_img.set_block_clipped(&ublock_eac_rg11_unpacked[0][0], block_x * 4, block_y * 4, 4, 4); + + // ETC1 + etc_block unpacked_etc1; + transcode_uastc_to_etc1(encoded_uastc_blk, &unpacked_etc1); + color_rgba unpacked_etc1_block[16]; + unpack_etc1(unpacked_etc1, unpacked_etc1_block); + etc1_img.set_block_clipped(unpacked_etc1_block, block_x * 4, block_y * 4, 4, 4); + + // ETC1 Y + etc_block unpacked_etc1_g; + + transcode_uastc_to_etc1(encoded_uastc_blk, &unpacked_etc1_g, 1); + + color_rgba unpacked_etc1_g_block[16]; + unpack_etc1(unpacked_etc1_g, unpacked_etc1_g_block); + etc1_g_img.set_block_clipped(unpacked_etc1_g_block, block_x * 4, block_y * 4, 4, 4); + + // ETC2 + etc2_rgba_block unpacked_etc2; + transcode_uastc_to_etc2_rgba(encoded_uastc_blk, &unpacked_etc2); + + color_rgba unpacked_etc2_block[16]; + unpack_block(texture_format::cETC2_RGBA, &unpacked_etc2, unpacked_etc2_block); + etc2_img.set_block_clipped(unpacked_etc2_block, block_x * 4, block_y * 4, 4, 4); + + // UASTC->ASTC + uint32_t tastc_data[4]; + + transcode_uastc_to_astc(encoded_uastc_blk, tastc_data); + + color_rgba decoded_tastc_block[4][4]; + //basisu_astc::astc::decompress((uint8_t*)decoded_tastc_block, (uint8_t*)&tastc_data, false, 4, 4); + + uastc2_img.set_block_clipped(&decoded_tastc_block[0][0], block_x * 4, block_y * 4, 4, 4); + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + if (decoded_tastc_block[y][x] != unpacked_uastc_block_pixels[y][x]) + { + printf("UASTC!=ASTC!\n"); + } + } + } + + } // block_index + + }); + + } // block_index_iter + + jpool.wait_for_all(); + + { + size_t comp_size = 0; + void* pComp_data = tdefl_compress_mem_to_heap(&ublocks[0], ublocks.size() * 16, &comp_size, TDEFL_MAX_PROBES_MASK);// TDEFL_DEFAULT_MAX_PROBES); + + size_t decomp_size; + void* pDecomp_data = tinfl_decompress_mem_to_heap(pComp_data, comp_size, &decomp_size, 0); + + if ((decomp_size != ublocks.size() * 16) || (memcmp(pDecomp_data, &ublocks[0], decomp_size) != 0)) + { + printf("Compression or decompression failed!\n"); + exit(1); + } + + mz_free(pComp_data); + mz_free(pDecomp_data); + + printf("Pre-RDO UASTC size: %u, compressed size: %u, %3.2f bits/texel\n", + (uint32_t)ublocks.size() * 16, + (uint32_t)comp_size, + comp_size * 8.0f / img.get_total_pixels()); + + total_comp_size += comp_size; + total_raw_size += ublocks.size() * 16; + } + + basisu::vector orig_block_pixels(ublocks.size() * 16); + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + img.extract_block_clamped(&orig_block_pixels[(block_x + block_y * num_blocks_x) * 16], block_x * 4, block_y * 4, 4, 4); + + // HACK HACK + const uint32_t max_rdo_jobs = 4; + + char rdo_fname[256]; + FILE* pFile = nullptr; + for (uint32_t try_index = 0; try_index < 100; try_index++) + { + sprintf(rdo_fname, "rdo_%02u_%u.csv", image_index, try_index); + pFile = fopen(rdo_fname, "rb"); + if (pFile) + { + fclose(pFile); + continue; + } + + pFile = fopen(rdo_fname, "w"); + if (!pFile) + printf("Cannot open CSV file %s\n", rdo_fname); + else + { + printf("Opened CSV file %s\n", rdo_fname); + break; + } + } + + for (float q = .2f; q <= 10.0f; q += (q >= 1.0f ? .5f : .1f)) + { + printf("Q: %f\n", q); + + uastc_rdo_params p; + p.m_lambda = q; + p.m_max_allowed_rms_increase_ratio = 10.0f; + p.m_skip_block_rms_thresh = 8.0f; + + bool rdo_status = uastc_rdo((uint32_t)ublocks.size(), &ublocks[0], &orig_block_pixels[0], p, flags, &jpool, max_rdo_jobs); + if (!rdo_status) + { + printf("uastc_rdo() failed!\n"); + return false; + } + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + const basist::uastc_block& blk = ublocks[block_x + block_y * num_blocks_x]; + + color_rgba unpacked_block[4][4]; + if (!basist::unpack_uastc(blk, (basist::color32*)unpacked_block, false)) + { + printf("Block unpack failed!\n"); + exit(1); + } + + rdo_uastc_img.set_block_clipped(&unpacked_block[0][0], block_x * 4, block_y * 4, 4, 4); + + basist::bc7_optimization_results best_bc7_results; + transcode_uastc_to_bc7(blk, best_bc7_results); + + basist::bc7_block bc7_data; + encode_bc7_block(&bc7_data, &best_bc7_results); + + color_rgba decoded_bc7_blk[4][4]; + unpack_block(texture_format::cBC7, &bc7_data, &decoded_bc7_blk[0][0]); + + rdo_bc7_img.set_block_clipped(&decoded_bc7_blk[0][0], block_x * 4, block_y * 4, 4, 4); + } + } + + image_metrics em; + em.calc(img, rdo_uastc_img, 0, 3); + em.print("RDOUASTC RGB "); + + size_t comp_size = 0; + void* pComp_data = tdefl_compress_mem_to_heap(&ublocks[0], ublocks.size() * 16, &comp_size, TDEFL_MAX_PROBES_MASK);// TDEFL_DEFAULT_MAX_PROBES); + + size_t decomp_size; + void* pDecomp_data = tinfl_decompress_mem_to_heap(pComp_data, comp_size, &decomp_size, 0); + + if ((decomp_size != ublocks.size() * 16) || (memcmp(pDecomp_data, &ublocks[0], decomp_size) != 0)) + { + printf("Compression or decompression failed!\n"); + exit(1); + } + + mz_free(pComp_data); + mz_free(pDecomp_data); + + printf("RDO UASTC size: %u, compressed size: %u, %3.2f bits/texel\n", + (uint32_t)ublocks.size() * 16, + (uint32_t)comp_size, + comp_size * 8.0f / img.get_total_pixels()); + + if (pFile) + fprintf(pFile, "%f, %f, %f\n", q, comp_size * 8.0f / img.get_total_pixels(), em.m_psnr); + } + if (pFile) + fclose(pFile); + + { + size_t comp_size = 0; + void* pComp_data = tdefl_compress_mem_to_heap(&ublocks[0], ublocks.size() * 16, &comp_size, TDEFL_MAX_PROBES_MASK);// TDEFL_DEFAULT_MAX_PROBES); + + size_t decomp_size; + void* pDecomp_data = tinfl_decompress_mem_to_heap(pComp_data, comp_size, &decomp_size, 0); + + if ((decomp_size != ublocks.size() * 16) || (memcmp(pDecomp_data, &ublocks[0], decomp_size) != 0)) + { + printf("Compression or decompression failed!\n"); + exit(1); + } + + mz_free(pComp_data); + mz_free(pDecomp_data); + + printf("RDO UASTC size: %u, compressed size: %u, %3.2f bits/texel\n", + (uint32_t)ublocks.size() * 16, + (uint32_t)comp_size, + comp_size * 8.0f / img.get_total_pixels()); + + total_rdo_comp_size += comp_size; + total_rdo_raw_size += ublocks.size() * 16; + total_comp_blocks += ublocks.size(); + } + + printf("Total blocks: %u\n", total_blocks); + printf("Total BC1 hint 0's: %u %3.1f%%\n", total_bc1_hint0s, total_bc1_hint0s * 100.0f / total_blocks); + printf("Total BC1 hint 1's: %u %3.1f%%\n", total_bc1_hint1s, total_bc1_hint1s * 100.0f / total_blocks); + printf("Total BC1 hint 01's: %u %3.1f%%\n", total_bc1_hint01s, total_bc1_hint01s * 100.0f / total_blocks); + printf("Total enc time per block: %f us\n", total_enc_time / total_blocks * 1000000.0f); + printf("Total bench time per block: %f us\n", total_bench_time / total_blocks * 1000000.0f); + printf("Total bench2 time per block: %f us\n", total_bench2_time / total_blocks * 1000000.0f); + + overall_total_enc_time += total_enc_time; + overall_total_bench_time += total_bench_time; + overall_total_bench2_time += total_bench2_time; + overall_blocks += total_blocks; + + printf("ETC1 inten hist: %u %u %u %u %u %u %u %u\n", etc1_inten_hist[0], etc1_inten_hist[1], etc1_inten_hist[2], etc1_inten_hist[3], + etc1_inten_hist[4], etc1_inten_hist[5], etc1_inten_hist[6], etc1_inten_hist[7]); + printf("ETC1 flip hist: %u %u\n", etc1_flip_hist[0], etc1_flip_hist[1]); + printf("ETC1 diff hist: %u %u\n", etc1_diff_hist[0], etc1_diff_hist[1]); + + printf("UASTC mode histogram:\n"); + uint64_t total_hist = 0; + for (uint32_t i = 0; i < basist::TOTAL_UASTC_MODES; i++) + total_hist += mode_hist[i]; + for (uint32_t i = 0; i < basist::TOTAL_UASTC_MODES; i++) + printf("%u: %u %3.2f%%\n", i, (uint32_t)mode_hist[i], mode_hist[i] * 100.0f / total_hist); + + char fn[256]; + +#if 0 + for (uint32_t y = 0; y < img.get_height(); y++) + for (uint32_t x = 0; x < img.get_width(); x++) + { + //static inline uint8_t to_5(uint32_t v) { ; } + color_rgba &c = img(x, y); + + for (uint32_t i = 0; i < 3; i++) + { + const uint32_t limit = (i == 1) ? 63 : 31; + + uint32_t v = c[i]; + v = v * limit + 128; v = (uint8_t)((v + (v >> 8)) >> 8); + v = (v * 255 + (limit / 2)) / limit; + + c[i] = (uint8_t)v; + } + + } +#endif + + sprintf(fn, "orig_%02u.png", image_index); + save_png(fn, img, cImageSaveIgnoreAlpha); + + sprintf(fn, "orig_a_%02u.png", image_index); + save_png(fn, img, cImageSaveGrayscale, 3); + + sprintf(fn, "unpacked_uastc_%02u.png", image_index); + save_png(fn, uastc_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_uastc_a_%02u.png", image_index); + save_png(fn, uastc_img, cImageSaveGrayscale, 3); + + sprintf(fn, "unpacked_rdo_uastc_%02u.png", image_index); + save_png(fn, rdo_uastc_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_rdo_uastc_a_%02u.png", image_index); + save_png(fn, rdo_uastc_img, cImageSaveGrayscale, 3); + + sprintf(fn, "unpacked_uastc2_%02u.png", image_index); + save_png(fn, uastc2_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_bc7_%02u.png", image_index); + save_png(fn, bc7_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_bc7_a_%02u.png", image_index); + save_png(fn, bc7_img, cImageSaveGrayscale, 3); + + sprintf(fn, "unpacked_rdo_bc7_%02u.png", image_index); + save_png(fn, rdo_bc7_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_rdo_bc7_a_%02u.png", image_index); + save_png(fn, rdo_bc7_img, cImageSaveGrayscale, 3); + + sprintf(fn, "unpacked_opt_bc7_%02u.png", image_index); + save_png(fn, opt_bc7_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_opt_bc7_a_%02u.png", image_index); + save_png(fn, opt_bc7_img, cImageSaveGrayscale, 3); + + sprintf(fn, "unpacked_opt_astc_%02u.png", image_index); + save_png(fn, opt_astc_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_opt_astc_a_%02u.png", image_index); + save_png(fn, opt_astc_img, cImageSaveGrayscale, 3); + + sprintf(fn, "unpacked_bc7enc_%02u.png", image_index); + save_png(fn, bc7enc_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_bc7enc_a_%02u.png", image_index); + save_png(fn, bc7enc_img, cImageSaveGrayscale, 3); + + sprintf(fn, "unpacked_opt_bc1_%02u.png", image_index); + save_png(fn, opt_bc1_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_opt_bc1_2_%02u.png", image_index); + save_png(fn, opt_bc1_2_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_tbc1_%02u.png", image_index); + save_png(fn, bc1_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_bc3_%02u.png", image_index); + save_png(fn, bc3_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_eac_r11_%02u.png", image_index); + save_png(fn, eac_r11_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_eac_rg11_%02u.png", image_index); + save_png(fn, eac_rg11_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_bc3_a_%02u.png", image_index); + save_png(fn, bc3_img, cImageSaveGrayscale, 3); + + sprintf(fn, "part_vis_%02u.png", image_index); + save_png(fn, part_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_etc1_%02u.png", image_index); + save_png(fn, etc1_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_etc1_g_%02u.png", image_index); + save_png(fn, etc1_g_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_etc2_%02u.png", image_index); + save_png(fn, etc2_img, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_etc2_a_%02u.png", image_index); + save_png(fn, etc2_img, cImageSaveGrayscale, 3); + + image_metrics em; + + // UASTC + em.calc(img, uastc_img, 0, 3); + em.print("UASTC RGB "); + total_uastc_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, uastc_img, 3, 1); + em.print("UASTC A "); + if (img_has_alpha) + total_uastc_a_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, uastc_img, 0, 4); + em.print("UASTC RGBA "); + total_uastc_rgba_psnr += basisu::minimum(99.0f, em.m_psnr); + + // RDO UASTC + em.calc(img, rdo_uastc_img, 0, 3); + em.print("RDOUASTC RGB "); + total_rdo_uastc_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, rdo_uastc_img, 3, 1); + em.print("RDOUASTC A "); + if (img_has_alpha) + total_rdo_uastc_a_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, rdo_uastc_img, 0, 4); + em.print("RDOUASTC RGBA "); + total_rdo_uastc_rgba_psnr += basisu::minimum(99.0f, em.m_psnr); + + // UASTC2 + em.calc(img, uastc2_img, 0, 3); + em.print("UASTC2 RGB "); + total_uastc2_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, uastc2_img, 3, 1); + em.print("UASTC2 A "); + if (img_has_alpha) + total_uastc2_a_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, uastc2_img, 0, 4); + em.print("UASTC2 RGBA "); + total_uastc2_rgba_psnr += basisu::minimum(99.0f, em.m_psnr); + + // BC7 + em.calc(img, bc7_img, 0, 3); + em.print("BC7 RGB "); + total_bc7_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, bc7_img, 3, 1); + em.print("BC7 A "); + if (img_has_alpha) + total_bc7_a_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, bc7_img, 0, 4); + em.print("BC7 RGBA "); + total_bc7_rgba_psnr += basisu::minimum(99.0f, em.m_psnr); + + // RDO BC7 + em.calc(img, rdo_bc7_img, 0, 3); + em.print("RDOBC7 RGB "); + total_rdo_bc7_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, rdo_bc7_img, 3, 1); + em.print("RDOBC7 A "); + if (img_has_alpha) + total_rdo_bc7_a_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, rdo_bc7_img, 0, 4); + em.print("RDOBC7 RGBA "); + total_rdo_bc7_rgba_psnr += basisu::minimum(99.0f, em.m_psnr); + +#if 0 + // OBC7 + em.calc(img, opt_bc7_img, 0, 3); + em.print("OBC7 RGB "); + total_obc7_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, opt_bc7_img, 3, 1); + em.print("OBC7 A "); + if (img_has_alpha) + total_obc7_a_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, opt_bc7_img, 0, 4); + em.print("OBC7 RGBA "); + total_obc7_rgba_psnr += basisu::minimum(99.0f, em.m_psnr); + + // OASTC + em.calc(img, opt_astc_img, 0, 3); + em.print("OASTC RGB "); + total_oastc_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, opt_astc_img, 3, 1); + em.print("OASTC A "); + if (img_has_alpha) + total_oastc_a_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, opt_astc_img, 0, 4); + em.print("OASTC RGBA "); + total_oastc_rgba_psnr += basisu::minimum(99.0f, em.m_psnr); +#endif + + // bc7enc + em.calc(img, bc7enc_img, 0, 3); + em.print("BC7ENC RGB "); + total_bc7enc_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, bc7enc_img, 3, 1); + em.print("BC7ENC A "); + if (img_has_alpha) + total_bc7enc_a_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, bc7enc_img, 0, 4); + em.print("BC7ENC RGBA "); + total_bc7enc_rgba_psnr += basisu::minimum(99.0f, em.m_psnr); + +#if 1 + // OBC1 + em.calc(img, opt_bc1_img, 0, 3); + em.print("OBC1 RGB "); + total_obc1_psnr += basisu::minimum(99.0f, em.m_psnr); + total_obc1_psnr_sq += basisu::minimum(99.0f, em.m_psnr) * basisu::minimum(99.0f, em.m_psnr); +#endif + + em.calc(img, opt_bc1_2_img, 0, 3); + em.print("OBC1 2 RGB "); + total_obc1_2_psnr += basisu::minimum(99.0f, em.m_psnr); + total_obc1_2_psnr_sq += basisu::minimum(99.0f, em.m_psnr) * basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, bc1_img, 0, 3); + em.print("BC1 RGB "); + total_bc1_psnr += basisu::minimum(99.0f, em.m_psnr); + total_bc1_psnr_sq += basisu::minimum(99.0f, em.m_psnr) * basisu::minimum(99.0f, em.m_psnr); + + // ETC1 + em.calc(img, etc1_img, 0, 3); + em.print("ETC1 RGB "); + total_etc1_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, etc1_img, 0, 0); + em.print("ETC1 Y "); + total_etc1_y_psnr += basisu::minimum(99.0f, em.m_psnr); + + // ETC1 + em.calc(img, etc1_g_img, 1, 1); + em.print("ETC1 G "); + total_etc1_g_psnr += basisu::minimum(99.0f, em.m_psnr); + + // ETC2 + em.calc(img, etc2_img, 0, 3); + em.print("ETC2 RGB "); + total_etc2_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, etc2_img, 3, 1); + em.print("ETC2 A "); + if (img_has_alpha) + total_etc2_a_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, etc2_img, 0, 4); + em.print("ETC2 RGBA "); + total_etc2_rgba_psnr += basisu::minimum(99.0f, em.m_psnr); + + // BC3 + em.calc(img, bc3_img, 0, 3); + em.print("BC3 RGB "); + total_bc3_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, bc3_img, 3, 1); + em.print("BC3 A "); + if (img_has_alpha) + total_bc3_a_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, bc3_img, 0, 4); + em.print("BC3 RGBA "); + total_bc3_rgba_psnr += basisu::minimum(99.0f, em.m_psnr); + + // EAC R11 + em.calc(img, eac_r11_img, 0, 1); + em.print("EAC R11 "); + total_eac_r11_psnr += basisu::minimum(99.0f, em.m_psnr); + + // EAC RG11 + em.calc(img, eac_rg11_img, 0, 2); + em.print("EAC RG11 "); + total_eac_rg11_psnr += basisu::minimum(99.0f, em.m_psnr); + + const uint32_t width = num_blocks_x * 4; + const uint32_t height = num_blocks_y * 4; + if (is_pow2(width) && is_pow2(height)) + { + pvrtc4_image pi(width, height); + + transcode_uastc_to_pvrtc1_4_rgba(&ublocks[0], pi.get_blocks().get_ptr(), num_blocks_x, num_blocks_y, false); + + pi.deswizzle(); + + //pi.map_all_pixels(img, perceptual, false); + + image pi_unpacked; + pi.unpack_all_pixels(pi_unpacked); + +#if 0 + sprintf(fn, "unpacked_pvrtc1_rgb_before_%02u.png", image_index); + save_png(fn, pi_unpacked, cImageSaveIgnoreAlpha); + + em.calc(img, pi_unpacked, 0, 3); + em.print("PVRTC1 RGB Before "); + + for (uint32_t pass = 0; pass < 1; pass++) + { + for (uint32_t by = 0; by < num_blocks_y; by++) + { + for (uint32_t bx = 0; bx < num_blocks_x; bx++) + { + pi.local_endpoint_optimization_opaque(bx, by, img, perceptual, false); + } + } + } + + //pi.map_all_pixels(img, perceptual, false); + + pi.unpack_all_pixels(pi_unpacked); +#endif + + sprintf(fn, "unpacked_pvrtc1_%02u.png", image_index); + save_png(fn, pi_unpacked, cImageSaveIgnoreAlpha); + + sprintf(fn, "unpacked_pvrtc1_a_%02u.png", image_index); + save_png(fn, pi_unpacked, cImageSaveGrayscale, 3); + + em.calc(img, pi_unpacked, 0, 3); + em.print("PVRTC1 After RGB "); + total_pvrtc1_rgb_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, pi_unpacked, 3, 1); + em.print("PVRTC1 After A "); + total_pvrtc1_a_psnr += basisu::minimum(99.0f, em.m_psnr); + + em.calc(img, pi_unpacked, 0, 4); + em.print("PVRTC1 After RGBA "); + total_pvrtc1_rgba_psnr += basisu::minimum(99.0f, em.m_psnr); + + total_pvrtc1_images++; + } + + printf("ETC1 hint histogram:\n"); + for (uint32_t i = 0; i < 32; i++) + printf("%u ", etc1_hint_hist[i]); + printf("\n"); + + total_images++; + if (img_has_alpha) + total_a_images++; + + } // image_index + + printf("Total time: %f secs\n", otm.get_elapsed_secs()); + + printf("Total Non-RDO UASTC size: %llu, compressed size: %llu, %3.2f bits/texel\n", + (unsigned long long)total_raw_size, + (unsigned long long)total_comp_size, + total_comp_size * 8.0f / (total_comp_blocks * 16)); + + printf("Total RDO UASTC size: %llu, compressed size: %llu, %3.2f bits/texel\n", + (unsigned long long)total_rdo_raw_size, + (unsigned long long)total_rdo_comp_size, + total_rdo_comp_size * 8.0f / (total_comp_blocks * 16)); + + printf("Overall enc time per block: %f us\n", overall_total_enc_time / overall_blocks * 1000000.0f); + printf("Overall bench time per block: %f us\n", overall_total_bench_time / overall_blocks * 1000000.0f); + printf("Overall bench2 time per block: %f us\n", overall_total_bench2_time / overall_blocks * 1000000.0f); + + printf("Overall ASTC mode histogram:\n"); + uint64_t total_hist = 0; + for (uint32_t i = 0; i < basist::TOTAL_UASTC_MODES; i++) + total_hist += overall_mode_hist[i]; + + for (uint32_t i = 0; i < basist::TOTAL_UASTC_MODES; i++) + printf("%u: %u %3.2f%%\n", i, (uint32_t)overall_mode_hist[i], overall_mode_hist[i] * 100.0f / total_hist); + + printf("Total images: %u, total images with alpha: %u, total PVRTC1 images: %u\n", total_images, total_a_images, total_pvrtc1_images); + + if (!total_a_images) + total_a_images = 1; + + printf("Avg UASTC RGB PSNR: %f, A PSNR: %f, RGBA PSNR: %f\n", total_uastc_psnr / total_images, total_uastc_a_psnr / total_a_images, total_uastc_rgba_psnr / total_images); + printf("Avg UASTC2 RGB PSNR: %f, A PSNR: %f, RGBA PSNR: %f\n", total_uastc2_psnr / total_images, total_uastc2_a_psnr / total_a_images, total_uastc2_rgba_psnr / total_images); + printf("Avg RDO UASTC RGB PSNR: %f, A PSNR: %f, RGBA PSNR: %f\n", total_rdo_uastc_psnr / total_images, total_rdo_uastc_a_psnr / total_a_images, total_rdo_uastc_rgba_psnr / total_images); + printf("Avg BC7 RGB PSNR: %f, A PSNR: %f, RGBA PSNR: %f\n", total_bc7_psnr / total_images, total_bc7_a_psnr / total_a_images, total_bc7_rgba_psnr / total_images); + printf("Avg RDO BC7 RGB PSNR: %f, A PSNR: %f, RGBA PSNR: %f\n", total_rdo_bc7_psnr / total_images, total_rdo_bc7_a_psnr / total_a_images, total_rdo_bc7_rgba_psnr / total_images); + //printf("Avg Opt BC7 RGB PSNR: %f, A PSNR: %f, RGBA PSNR: %f\n", total_obc7_psnr / total_images, total_obc7_a_psnr / total_a_images, total_obc7_rgba_psnr / total_images); + //printf("Avg Opt ASTC RGB PSNR: %f, A PSNR: %f, RGBA PSNR: %f\n", total_oastc_psnr / total_images, total_oastc_a_psnr / total_a_images, total_oastc_rgba_psnr / total_images); + printf("Avg BC7ENC RGB PSNR: %f, A PSNR: %f, RGBA PSNR: %f\n", total_bc7enc_psnr / total_images, total_bc7enc_a_psnr / total_a_images, total_bc7enc_rgba_psnr / total_images); + + printf("Avg Opt BC1 PSNR: %f, std dev: %f\n", total_obc1_psnr / total_images, sqrtf(basisu::maximum(0.0f, (total_obc1_psnr_sq / total_images) - (total_obc1_psnr / total_images) * (total_obc1_psnr / total_images)))); + + printf("Avg Opt BC1 2 PSNR: %f, std dev: %f\n", total_obc1_2_psnr / total_images, sqrtf(basisu::maximum(0.0f, (total_obc1_2_psnr_sq / total_images) - (total_obc1_2_psnr / total_images) * (total_obc1_2_psnr / total_images)))); + + printf("Avg BC1 PSNR: %f, std dev: %f\n", total_bc1_psnr / total_images, sqrtf(basisu::maximum(0.0f, (total_bc1_psnr_sq / total_images) - (total_bc1_psnr / total_images) * (total_bc1_psnr / total_images)))); + + printf("Avg ETC1 RGB PSNR: %f\n", total_etc1_psnr / total_images); + printf("Avg ETC1 Y PSNR: %f\n", total_etc1_y_psnr / total_images); + printf("Avg ETC1 G PSNR: %f\n", total_etc1_g_psnr / total_images); + + printf("Avg ETC2 RGB PSNR: %f\n", total_etc2_psnr / total_images); + printf("Avg ETC2 A PSNR: %f\n", total_etc2_a_psnr / total_a_images); + printf("Avg ETC2 RGBA PSNR: %f\n", total_etc2_rgba_psnr / total_images); + + printf("Avg BC3 RGB PSNR: %f\n", total_bc3_psnr / total_images); + printf("Avg BC3 A PSNR: %f\n", total_bc3_a_psnr / total_a_images); + printf("Avg BC3 RGBA PSNR: %f\n", total_bc3_rgba_psnr / total_images); + + printf("Avg EAC R11 PSNR: %f\n", total_eac_r11_psnr / total_images); + printf("Avg EAC RG11 PSNR: %f\n", total_eac_rg11_psnr / total_images); + + if (total_pvrtc1_images) + { + printf("Avg PVRTC1 RGB PSNR: %f\n", total_pvrtc1_rgb_psnr / total_pvrtc1_images); + printf("Avg PVRTC1 A PSNR: %f\n", total_pvrtc1_a_psnr / total_pvrtc1_images); + printf("Avg PVRTC1 RGBA PSNR: %f\n", total_pvrtc1_rgba_psnr / total_pvrtc1_images); + } + + return true; +} + +static uint32_t compute_miniz_compressed_size(const char* pFilename, uint32_t &orig_size) +{ + orig_size = 0; + + uint8_vec buf; + if (!read_file_to_vec(pFilename, buf)) + return 0; + + if (!buf.size()) + return 0; + + orig_size = buf.size(); + + size_t comp_size = 0; + void* pComp_data = tdefl_compress_mem_to_heap(&buf[0], buf.size(), &comp_size, TDEFL_MAX_PROBES_MASK);// TDEFL_DEFAULT_MAX_PROBES); + + mz_free(pComp_data); + + return (uint32_t)comp_size; +} + +static bool compsize_mode(command_line_params& opts) +{ + if (opts.m_input_filenames.size() != 1) + { + error_printf("Must specify a filename using -file\n"); + return false; + } + + uint32_t orig_size; + uint32_t comp_size = compute_miniz_compressed_size(opts.m_input_filenames[0].c_str(), orig_size); + printf("Original file size: %u bytes\n", orig_size); + printf("miniz compressed size: %u bytes\n", comp_size); + + return true; +} + +const struct test_file +{ + const char* m_pFilename; + uint32_t m_etc1s_size; + float m_etc1s_psnr; + float m_uastc_psnr; +} g_test_files[] = +{ + { "black_1x1.png", 189, 100.0f, 100.0f }, + { "kodim01.png", 30993, 27.40f, 44.14f }, + { "kodim02.png", 28529, 32.20f, 41.06f }, + { "kodim03.png", 23411, 32.57f, 44.87f }, + { "kodim04.png", 28256, 31.76f, 43.02f }, + { "kodim05.png", 32646, 25.94f, 40.28f }, + { "kodim06.png", 27336, 28.66f, 44.57f }, + { "kodim07.png", 26618, 31.51f, 43.94f }, + { "kodim08.png", 31133, 25.28f, 41.15f }, + { "kodim09.png", 24777, 32.05f, 45.85f }, + { "kodim10.png", 27247, 32.20f, 45.77f }, + { "kodim11.png", 26579, 29.22f, 43.68f }, + { "kodim12.png", 25102, 32.96f, 46.77f }, + { "kodim13.png", 31604, 24.25f, 41.25f }, + { "kodim14.png", 31162, 27.81f, 39.65f }, + { "kodim15.png", 25528, 31.26f, 42.87f }, + { "kodim16.png", 26894, 32.21f, 47.78f }, + { "kodim17.png", 29334, 31.40f, 45.66f }, + { "kodim18.png", 30929, 27.46f, 41.54f }, + { "kodim19.png", 27889, 29.69f, 44.95f }, + { "kodim20.png", 21104, 31.30f, 45.31f }, + { "kodim21.png", 25943, 28.53f, 44.45f }, + { "kodim22.png", 29277, 29.85f, 42.63f }, + { "kodim23.png", 23550, 31.69f, 45.11f }, + { "kodim24.png", 29613, 26.75f, 40.61f }, + { "white_1x1.png", 189, 100.0f, 100.0f }, + { "wikipedia.png", 38961, 24.10f, 30.47f }, + { "alpha0.png", 766, 100.0f, 56.16f } +}; +const uint32_t TOTAL_TEST_FILES = sizeof(g_test_files) / sizeof(g_test_files[0]); + +static bool test_mode(command_line_params& opts) +{ + uint32_t total_mismatches = 0; + + // TODO: Record min/max/avgs + // TODO: Add another ETC1S quality level + + for (uint32_t i = 0; i < TOTAL_TEST_FILES; i++) + { + std::string filename(opts.m_test_file_dir); + if (filename.size()) + { + filename.push_back('/'); + } + filename += std::string(g_test_files[i].m_pFilename); + + basisu::vector source_images(1); + + image& source_image = source_images[0]; + if (!load_png(filename.c_str(), source_image)) + { + error_printf("Failed loading test image \"%s\"\n", filename.c_str()); + return false; + } + + printf("Loaded file \"%s\", dimemsions %ux%u has alpha: %u\n", filename.c_str(), source_image.get_width(), source_image.get_height(), source_image.has_alpha()); + + image_stats stats; + + uint32_t flags_and_quality; + float uastc_rdo_quality = 0.0f; + size_t data_size = 0; + + // Test ETC1S + flags_and_quality = (opts.m_comp_params.m_multithreading ? cFlagThreaded : 0); + + void* pData = basis_compress(source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats); + if (!pData) + { + error_printf("basis_compress() failed!\n"); + return false; + } + basis_free_data(pData); + + printf("ETC1S Size: %u, PSNR: %f\n", (uint32_t)data_size, stats.m_basis_rgba_avg_psnr); + + float file_size_ratio = fabs((data_size / (float)g_test_files[i].m_etc1s_size) - 1.0f); + if (file_size_ratio > .015f) + { + error_printf("Expected ETC1S file size was %u, but got %u instead!\n", g_test_files[i].m_etc1s_size, (uint32_t)data_size); + total_mismatches++; + } + + if (fabs(stats.m_basis_rgba_avg_psnr - g_test_files[i].m_etc1s_psnr) > .02f) + { + error_printf("Expected ETC1S RGBA Avg PSNR was %f, but got %f instead!\n", g_test_files[i].m_etc1s_psnr, stats.m_basis_rgba_avg_psnr); + total_mismatches++; + } + + if (opencl_is_available()) + { + flags_and_quality = (opts.m_comp_params.m_multithreading ? cFlagThreaded : 0) | cFlagUseOpenCL; + + pData = basis_compress(source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats); + if (!pData) + { + error_printf("basis_compress() failed!\n"); + return false; + } + basis_free_data(pData); + + printf("ETC1S+OpenCL Size: %u, PSNR: %f\n", (uint32_t)data_size, stats.m_basis_rgba_avg_psnr); + + file_size_ratio = fabs((data_size / (float)g_test_files[i].m_etc1s_size) - 1.0f); + if (file_size_ratio > .04f) + { + error_printf("Expected ETC1S+OpenCL file size was %u, but got %u instead!\n", g_test_files[i].m_etc1s_size, (uint32_t)data_size); + total_mismatches++; + } + + if (g_test_files[i].m_etc1s_psnr == 100.0f) + { + // TODO + if (stats.m_basis_rgba_avg_psnr < 69.0f) + { + error_printf("Expected ETC1S+OpenCL RGBA Avg PSNR was %f, but got %f instead!\n", g_test_files[i].m_etc1s_psnr, stats.m_basis_rgba_avg_psnr); + total_mismatches++; + } + } + else if (fabs(stats.m_basis_rgba_avg_psnr - g_test_files[i].m_etc1s_psnr) > .2f) + { + error_printf("Expected ETC1S+OpenCL RGBA Avg PSNR was %f, but got %f instead!\n", g_test_files[i].m_etc1s_psnr, stats.m_basis_rgba_avg_psnr); + total_mismatches++; + } + } + + // Test UASTC + flags_and_quality = (opts.m_comp_params.m_multithreading ? cFlagThreaded : 0) | cFlagUASTC; + + pData = basis_compress(source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats); + if (!pData) + { + error_printf("basis_compress() failed!\n"); + return false; + } + basis_free_data(pData); + + printf("UASTC Size: %u, PSNR: %f\n", (uint32_t)data_size, stats.m_basis_rgba_avg_psnr); + + if (fabs(stats.m_basis_rgba_avg_psnr - g_test_files[i].m_uastc_psnr) > .005f) + { + error_printf("Expected UASTC RGBA Avg PSNR was %f, but got %f instead!\n", g_test_files[i].m_etc1s_psnr, stats.m_basis_rgba_avg_psnr); + total_mismatches++; + } + } + + printf("Total mismatches: %u\n", total_mismatches); + + bool result = true; + if (total_mismatches) + { + error_printf("Test FAILED\n"); + result = false; + } + else + printf("Test succeeded\n"); + + return result; +} + +static int main_internal(int argc, const char **argv) +{ + printf("Basis Universal GPU Texture Compressor v" BASISU_TOOL_VERSION "\nCopyright (C) 2019-2022 Binomial LLC, All rights reserved\n"); + + //interval_timer tm; + //tm.start(); + + // See if OpenCL support has been disabled. We don't want to parse the command line until the lib is initialized + bool use_opencl = false; + bool opencl_force_serialization = false; + for (int i = 1; i < argc; i++) + { + if (strcmp(argv[i], "-opencl") == 0) + use_opencl = true; + if (strcmp(argv[i], "-opencl_serialize") == 0) + opencl_force_serialization = true; + } + +#ifndef BASISU_SUPPORT_OPENCL + if (use_opencl) + { + fprintf(stderr, "WARNING: -opencl specified, but OpenCL support was not enabled at compile time! With cmake, use -D OPENCL=1. Falling back to CPU compression.\n"); + } +#endif + + basisu_encoder_init(use_opencl, opencl_force_serialization); + + //printf("Encoder and transcoder libraries initialized in %3.3f ms\n", tm.get_elapsed_ms()); + +#if defined(DEBUG) || defined(_DEBUG) + printf("DEBUG build\n"); +#endif + + if (argc == 1) + { + print_usage(); + return EXIT_FAILURE; + } + + command_line_params opts; + if (!opts.parse(argc, argv)) + { + //print_usage(); + return EXIT_FAILURE; + } + +#if BASISU_SUPPORT_SSE + printf("Using SSE 4.1: %u, Multithreading: %u, Zstandard support: %u, OpenCL: %u\n", g_cpu_supports_sse41, (uint32_t)opts.m_comp_params.m_multithreading, basist::basisu_transcoder_supports_ktx2_zstd(), opencl_is_available()); +#else + printf("Multithreading: %u, Zstandard support: %u, OpenCL: %u\n", (uint32_t)opts.m_comp_params.m_multithreading, basist::basisu_transcoder_supports_ktx2_zstd(), opencl_is_available()); +#endif + + if (!opts.process_listing_files()) + return EXIT_FAILURE; + + if (opts.m_mode == cDefault) + { + for (size_t i = 0; i < opts.m_input_filenames.size(); i++) + { + std::string ext(string_get_extension(opts.m_input_filenames[i])); + if ((strcasecmp(ext.c_str(), "basis") == 0) || (strcasecmp(ext.c_str(), "ktx") == 0) || (strcasecmp(ext.c_str(), "ktx2") == 0)) + { + // If they haven't specified any modes, and they give us a .basis file, then assume they want to unpack it. + opts.m_mode = cUnpack; + break; + } + } + } + + bool status = false; + + switch (opts.m_mode) + { + case cDefault: + case cCompress: + status = compress_mode(opts); + break; + case cValidate: + case cInfo: + case cUnpack: + status = unpack_and_validate_mode(opts); + break; + case cCompare: + status = compare_mode(opts); + break; + case cVersion: + status = true; // We printed the version at the beginning of main_internal + break; + case cBench: + status = bench_mode(opts); + break; + case cCompSize: + status = compsize_mode(opts); + break; + case cTest: + status = test_mode(opts); + break; + case cSplitImage: + status = split_image_mode(opts); + break; + case cCombineImages: + status = combine_images_mode(opts); + break; + default: + assert(0); + break; + } + + return status ? EXIT_SUCCESS : EXIT_FAILURE; +} + +int main(int argc, const char** argv) +{ +#ifdef _DEBUG + printf("DEBUG\n"); +#endif + + int status = EXIT_FAILURE; + +#if BASISU_CATCH_EXCEPTIONS + try + { + status = main_internal(argc, argv); + } + catch (const std::exception &exc) + { + fprintf(stderr, "Fatal error: Caught exception \"%s\"\n", exc.what()); + } + catch (...) + { + fprintf(stderr, "Fatal error: Uncaught exception!\n"); + } +#else + status = main_internal(argc, argv); +#endif + + return status; +} + diff --git a/ktx/external/basisu/bin/ocl_kernels.cl b/ktx/external/basisu/bin/ocl_kernels.cl new file mode 100644 index 0000000..6eda24f --- /dev/null +++ b/ktx/external/basisu/bin/ocl_kernels.cl @@ -0,0 +1,1290 @@ +//#define _DEBUG + +#ifndef NULL + #define NULL 0L +#endif + +typedef char int8_t; +typedef uchar uint8_t; + +typedef short int16_t; +typedef ushort uint16_t; + +typedef int int32_t; +typedef uint uint32_t; + +typedef long int64_t; +typedef ulong uint64_t; + +typedef uchar4 color_rgba; + +#define UINT32_MAX 0xFFFFFFFFUL +#define INT64_MAX LONG_MAX +#define UINT64_MAX ULONG_MAX + +int squarei(int a) { return a * a; } + +#ifdef _DEBUG + inline void internal_assert(bool x, constant char *pMsg, int line) + { + if (!x) + printf("assert() failed on line %i: %s\n", line, pMsg); + } + #define assert(x) internal_assert(x, #x, __LINE__) +#else + #define assert(x) +#endif + +inline uint8_t clamp255(int x) +{ + return clamp(x, 0, 255); +} + +inline uint8_t clamp255_flag(int x, bool *pDid_clamp) +{ + if (x < 0) + { + *pDid_clamp = true; + return 0; + } + else if (x > 255) + { + *pDid_clamp = true; + return 255; + } + + return (uint8_t)(x); +} + +typedef struct __attribute__ ((packed)) encode_etc1s_param_struct_tag +{ + uint32_t m_total_blocks; + int m_perceptual; + int m_total_perms; +} encode_etc1s_param_struct; + +typedef struct __attribute__ ((packed)) pixel_block_tag +{ + color_rgba m_pixels[16]; // [y*4+x] +} pixel_block; + +uint color_distance(bool perceptual, color_rgba e1, color_rgba e2, bool alpha) +{ + if (perceptual) + { +#if 0 + float3 delta_rgb = (float3)(e1.x - e2.x, e1.y - e2.y, e1.z - e2.z); + + float3 delta_ycbcr; + delta_ycbcr.x = dot(delta_rgb, (float3)(.2126f, .7152f, .0722f)); // y + delta_ycbcr.y = delta_rgb.x - delta_ycbcr.x; // cr + delta_ycbcr.z = delta_rgb.z - delta_ycbcr.x; // cb + + delta_ycbcr *= delta_ycbcr; + + float d = dot(delta_ycbcr, (float3)(1.0f, 0.203125f, 0.0234375f)); + + if (alpha) + { + int delta_a = e1.w - e2.w; + d += delta_a * delta_a; + } + + d = clamp(d * 256.0f + .5f, 0.0f, (float)UINT32_MAX); + + return (uint)(d); +#else + // This matches the CPU code, which is useful for testing. + int dr = e1.x - e2.x; + int dg = e1.y - e2.y; + int db = e1.z - e2.z; + + int delta_l = dr * 27 + dg * 92 + db * 9; + int delta_cr = dr * 128 - delta_l; + int delta_cb = db * 128 - delta_l; + + uint id = ((uint)(delta_l * delta_l) >> 7U) + + ((((uint)(delta_cr * delta_cr) >> 7U) * 26U) >> 7U) + + ((((uint)(delta_cb * delta_cb) >> 7U) * 3U) >> 7U); + + if (alpha) + { + int da = (e1.w - e2.w) << 7; + id += ((uint)(da * da) >> 7U); + } + + return id; +#endif + } + else if (alpha) + { + int dr = e1.x - e2.x; + int dg = e1.y - e2.y; + int db = e1.z - e2.z; + int da = e1.w - e2.w; + return dr * dr + dg * dg + db * db + da * da; + } + else + { + int dr = e1.x - e2.x; + int dg = e1.y - e2.y; + int db = e1.z - e2.z; + return dr * dr + dg * dg + db * db; + } +} + +typedef struct __attribute__ ((packed)) etc_block_tag +{ + // big endian uint64: + // bit ofs: 56 48 40 32 24 16 8 0 + // byte ofs: b0, b1, b2, b3, b4, b5, b6, b7 + union + { + uint64_t m_uint64; + uint8_t m_bytes[8]; + }; + +} etc_block; + +enum etc_constants +{ + cETC1BytesPerBlock = 8U, + + cETC1SelectorBits = 2U, + cETC1SelectorValues = 1U << cETC1SelectorBits, + cETC1SelectorMask = cETC1SelectorValues - 1U, + + cETC1BlockShift = 2U, + cETC1BlockSize = 1U << cETC1BlockShift, + + cETC1LSBSelectorIndicesBitOffset = 0, + cETC1MSBSelectorIndicesBitOffset = 16, + + cETC1FlipBitOffset = 32, + cETC1DiffBitOffset = 33, + + cETC1IntenModifierNumBits = 3, + cETC1IntenModifierValues = 1 << cETC1IntenModifierNumBits, + cETC1RightIntenModifierTableBitOffset = 34, + cETC1LeftIntenModifierTableBitOffset = 37, + + // Base+Delta encoding (5 bit bases, 3 bit delta) + cETC1BaseColorCompNumBits = 5, + cETC1BaseColorCompMax = 1 << cETC1BaseColorCompNumBits, + + cETC1DeltaColorCompNumBits = 3, + cETC1DeltaColorComp = 1 << cETC1DeltaColorCompNumBits, + cETC1DeltaColorCompMax = 1 << cETC1DeltaColorCompNumBits, + + cETC1BaseColor5RBitOffset = 59, + cETC1BaseColor5GBitOffset = 51, + cETC1BaseColor5BBitOffset = 43, + + cETC1DeltaColor3RBitOffset = 56, + cETC1DeltaColor3GBitOffset = 48, + cETC1DeltaColor3BBitOffset = 40, + + // Absolute (non-delta) encoding (two 4-bit per component bases) + cETC1AbsColorCompNumBits = 4, + cETC1AbsColorCompMax = 1 << cETC1AbsColorCompNumBits, + + cETC1AbsColor4R1BitOffset = 60, + cETC1AbsColor4G1BitOffset = 52, + cETC1AbsColor4B1BitOffset = 44, + + cETC1AbsColor4R2BitOffset = 56, + cETC1AbsColor4G2BitOffset = 48, + cETC1AbsColor4B2BitOffset = 40, + + cETC1ColorDeltaMin = -4, + cETC1ColorDeltaMax = 3, + + // Delta3: + // 0 1 2 3 4 5 6 7 + // 000 001 010 011 100 101 110 111 + // 0 1 2 3 -4 -3 -2 -1 +}; + +#define BASISU_ETC1_CLUSTER_FIT_ORDER_TABLE_SIZE (165) +constant struct { uint8_t m_v[4]; } g_cluster_fit_order_tab[BASISU_ETC1_CLUSTER_FIT_ORDER_TABLE_SIZE] = +{ + { { 0, 0, 0, 8 } },{ { 0, 5, 2, 1 } },{ { 0, 6, 1, 1 } },{ { 0, 7, 0, 1 } },{ { 0, 7, 1, 0 } }, + { { 0, 0, 8, 0 } },{ { 0, 0, 3, 5 } },{ { 0, 1, 7, 0 } },{ { 0, 0, 4, 4 } },{ { 0, 0, 2, 6 } }, + { { 0, 0, 7, 1 } },{ { 0, 0, 1, 7 } },{ { 0, 0, 5, 3 } },{ { 1, 6, 0, 1 } },{ { 0, 0, 6, 2 } }, + { { 0, 2, 6, 0 } },{ { 2, 4, 2, 0 } },{ { 0, 3, 5, 0 } },{ { 3, 3, 1, 1 } },{ { 4, 2, 0, 2 } }, + { { 1, 5, 2, 0 } },{ { 0, 5, 3, 0 } },{ { 0, 6, 2, 0 } },{ { 2, 4, 1, 1 } },{ { 5, 1, 0, 2 } }, + { { 6, 1, 1, 0 } },{ { 3, 3, 0, 2 } },{ { 6, 0, 0, 2 } },{ { 0, 8, 0, 0 } },{ { 6, 1, 0, 1 } }, + { { 0, 1, 6, 1 } },{ { 1, 6, 1, 0 } },{ { 4, 1, 3, 0 } },{ { 0, 2, 5, 1 } },{ { 5, 0, 3, 0 } }, + { { 5, 3, 0, 0 } },{ { 0, 1, 5, 2 } },{ { 0, 3, 4, 1 } },{ { 2, 5, 1, 0 } },{ { 1, 7, 0, 0 } }, + { { 0, 1, 4, 3 } },{ { 6, 0, 2, 0 } },{ { 0, 4, 4, 0 } },{ { 2, 6, 0, 0 } },{ { 0, 2, 4, 2 } }, + { { 0, 5, 1, 2 } },{ { 0, 6, 0, 2 } },{ { 3, 5, 0, 0 } },{ { 0, 4, 3, 1 } },{ { 3, 4, 1, 0 } }, + { { 4, 3, 1, 0 } },{ { 1, 5, 0, 2 } },{ { 0, 3, 3, 2 } },{ { 1, 4, 1, 2 } },{ { 0, 4, 2, 2 } }, + { { 2, 3, 3, 0 } },{ { 4, 4, 0, 0 } },{ { 1, 2, 4, 1 } },{ { 0, 5, 0, 3 } },{ { 0, 1, 3, 4 } }, + { { 1, 5, 1, 1 } },{ { 1, 4, 2, 1 } },{ { 1, 3, 2, 2 } },{ { 5, 2, 1, 0 } },{ { 1, 3, 3, 1 } }, + { { 0, 1, 2, 5 } },{ { 1, 1, 5, 1 } },{ { 0, 3, 2, 3 } },{ { 2, 5, 0, 1 } },{ { 3, 2, 2, 1 } }, + { { 2, 3, 0, 3 } },{ { 1, 4, 3, 0 } },{ { 2, 2, 1, 3 } },{ { 6, 2, 0, 0 } },{ { 1, 0, 6, 1 } }, + { { 3, 3, 2, 0 } },{ { 7, 1, 0, 0 } },{ { 3, 1, 4, 0 } },{ { 0, 2, 3, 3 } },{ { 0, 4, 1, 3 } }, + { { 0, 4, 0, 4 } },{ { 0, 1, 0, 7 } },{ { 2, 0, 5, 1 } },{ { 2, 0, 4, 2 } },{ { 3, 0, 2, 3 } }, + { { 2, 2, 4, 0 } },{ { 2, 2, 3, 1 } },{ { 4, 0, 3, 1 } },{ { 3, 2, 3, 0 } },{ { 2, 3, 2, 1 } }, + { { 1, 3, 4, 0 } },{ { 7, 0, 1, 0 } },{ { 3, 0, 4, 1 } },{ { 1, 0, 5, 2 } },{ { 8, 0, 0, 0 } }, + { { 3, 0, 1, 4 } },{ { 4, 1, 1, 2 } },{ { 4, 0, 2, 2 } },{ { 1, 2, 5, 0 } },{ { 4, 2, 1, 1 } }, + { { 3, 4, 0, 1 } },{ { 2, 0, 3, 3 } },{ { 5, 0, 1, 2 } },{ { 5, 0, 0, 3 } },{ { 2, 4, 0, 2 } }, + { { 2, 1, 4, 1 } },{ { 4, 0, 1, 3 } },{ { 2, 1, 5, 0 } },{ { 4, 2, 2, 0 } },{ { 4, 0, 4, 0 } }, + { { 1, 0, 4, 3 } },{ { 1, 4, 0, 3 } },{ { 3, 0, 3, 2 } },{ { 4, 3, 0, 1 } },{ { 0, 1, 1, 6 } }, + { { 1, 3, 1, 3 } },{ { 0, 2, 2, 4 } },{ { 2, 0, 2, 4 } },{ { 5, 1, 1, 1 } },{ { 3, 0, 5, 0 } }, + { { 2, 3, 1, 2 } },{ { 3, 0, 0, 5 } },{ { 0, 3, 1, 4 } },{ { 5, 0, 2, 1 } },{ { 2, 1, 3, 2 } }, + { { 2, 0, 6, 0 } },{ { 3, 1, 3, 1 } },{ { 5, 1, 2, 0 } },{ { 1, 0, 3, 4 } },{ { 1, 1, 6, 0 } }, + { { 4, 0, 0, 4 } },{ { 2, 0, 1, 5 } },{ { 0, 3, 0, 5 } },{ { 1, 3, 0, 4 } },{ { 4, 1, 2, 1 } }, + { { 1, 2, 3, 2 } },{ { 3, 1, 0, 4 } },{ { 5, 2, 0, 1 } },{ { 1, 2, 2, 3 } },{ { 3, 2, 1, 2 } }, + { { 2, 2, 2, 2 } },{ { 6, 0, 1, 1 } },{ { 1, 2, 1, 4 } },{ { 1, 1, 4, 2 } },{ { 3, 2, 0, 3 } }, + { { 1, 2, 0, 5 } },{ { 1, 0, 7, 0 } },{ { 3, 1, 2, 2 } },{ { 1, 0, 2, 5 } },{ { 2, 0, 0, 6 } }, + { { 2, 1, 1, 4 } },{ { 2, 2, 0, 4 } },{ { 1, 1, 3, 3 } },{ { 7, 0, 0, 1 } },{ { 1, 0, 0, 7 } }, + { { 2, 1, 2, 3 } },{ { 4, 1, 0, 3 } },{ { 3, 1, 1, 3 } },{ { 1, 1, 2, 4 } },{ { 2, 1, 0, 5 } }, + { { 1, 0, 1, 6 } },{ { 0, 2, 1, 5 } },{ { 0, 2, 0, 6 } },{ { 1, 1, 1, 5 } },{ { 1, 1, 0, 6 } } +}; + +constant int g_etc1_inten_tables[cETC1IntenModifierValues][cETC1SelectorValues] = +{ + { -8, -2, 2, 8 }, { -17, -5, 5, 17 }, { -29, -9, 9, 29 }, { -42, -13, 13, 42 }, + { -60, -18, 18, 60 }, { -80, -24, 24, 80 }, { -106, -33, 33, 106 }, { -183, -47, 47, 183 } +}; + +constant uint8_t g_etc1_to_selector_index[cETC1SelectorValues] = { 2, 3, 1, 0 }; +constant uint8_t g_selector_index_to_etc1[cETC1SelectorValues] = { 3, 2, 0, 1 }; + +uint32_t etc_block_get_byte_bits(const etc_block *p, uint32_t ofs, uint32_t num) +{ + assert((ofs + num) <= 64U); + assert(num && (num <= 8U)); + assert((ofs >> 3) == ((ofs + num - 1) >> 3)); + const uint32_t byte_ofs = 7 - (ofs >> 3); + const uint32_t byte_bit_ofs = ofs & 7; + return (p->m_bytes[byte_ofs] >> byte_bit_ofs) & ((1 << num) - 1); +} + +void etc_block_set_byte_bits(etc_block *p, uint32_t ofs, uint32_t num, uint32_t bits) +{ + assert((ofs + num) <= 64U); + assert(num && (num < 32U)); + assert((ofs >> 3) == ((ofs + num - 1) >> 3)); + assert(bits < (1U << num)); + const uint32_t byte_ofs = 7 - (ofs >> 3); + const uint32_t byte_bit_ofs = ofs & 7; + const uint32_t mask = (1 << num) - 1; + p->m_bytes[byte_ofs] &= ~(mask << byte_bit_ofs); + p->m_bytes[byte_ofs] |= (bits << byte_bit_ofs); +} + +bool etc_block_get_flip_bit(const etc_block *p) +{ + return (p->m_bytes[3] & 1) != 0; +} + +void etc_block_set_flip_bit(etc_block *p, bool flip) +{ + p->m_bytes[3] &= ~1; + p->m_bytes[3] |= (uint8_t)(flip); +} + +bool etc_block_get_diff_bit(const etc_block *p) +{ + return (p->m_bytes[3] & 2) != 0; +} + +void etc_block_set_diff_bit(etc_block *p, bool diff) +{ + p->m_bytes[3] &= ~2; + p->m_bytes[3] |= ((uint32_t)(diff) << 1); +} + +// Returns intensity modifier table (0-7) used by subblock subblock_id. +// subblock_id=0 left/top (CW 1), 1=right/bottom (CW 2) +uint32_t etc_block_get_inten_table(const etc_block *p, uint32_t subblock_id) +{ + assert(subblock_id < 2); + const uint32_t ofs = subblock_id ? 2 : 5; + return (p->m_bytes[3] >> ofs) & 7; +} + +// Sets intensity modifier table (0-7) used by subblock subblock_id (0 or 1) +void etc_block_set_inten_table(etc_block *p, uint32_t subblock_id, uint32_t t) +{ + assert(subblock_id < 2); + assert(t < 8); + const uint32_t ofs = subblock_id ? 2 : 5; + p->m_bytes[3] &= ~(7 << ofs); + p->m_bytes[3] |= (t << ofs); +} + +void etc_block_set_inten_tables_etc1s(etc_block *p, uint32_t t) +{ + etc_block_set_inten_table(p, 0, t); + etc_block_set_inten_table(p, 1, t); +} + +uint32_t etc_block_get_raw_selector(const etc_block *pBlock, uint32_t x, uint32_t y) +{ + assert((x | y) < 4); + + const uint32_t bit_index = x * 4 + y; + const uint32_t byte_bit_ofs = bit_index & 7; + const uint8_t *p = &pBlock->m_bytes[7 - (bit_index >> 3)]; + const uint32_t lsb = (p[0] >> byte_bit_ofs) & 1; + const uint32_t msb = (p[-2] >> byte_bit_ofs) & 1; + const uint32_t val = lsb | (msb << 1); + + return val; +} + +// Returned selector value ranges from 0-3 and is a direct index into g_etc1_inten_tables. +uint32_t etc_block_get_selector(const etc_block *pBlock, uint32_t x, uint32_t y) +{ + return g_etc1_to_selector_index[etc_block_get_raw_selector(pBlock, x, y)]; +} + +// Selector "val" ranges from 0-3 and is a direct index into g_etc1_inten_tables. +void etc_block_set_selector(etc_block *pBlock, uint32_t x, uint32_t y, uint32_t val) +{ + assert((x | y | val) < 4); + const uint32_t bit_index = x * 4 + y; + + uint8_t *p = &pBlock->m_bytes[7 - (bit_index >> 3)]; + + const uint32_t byte_bit_ofs = bit_index & 7; + const uint32_t mask = 1 << byte_bit_ofs; + + const uint32_t etc1_val = g_selector_index_to_etc1[val]; + + const uint32_t lsb = etc1_val & 1; + const uint32_t msb = etc1_val >> 1; + + p[0] &= ~mask; + p[0] |= (lsb << byte_bit_ofs); + + p[-2] &= ~mask; + p[-2] |= (msb << byte_bit_ofs); +} + +void etc_block_set_base4_color(etc_block *pBlock, uint32_t idx, uint16_t c) +{ + if (idx) + { + etc_block_set_byte_bits(pBlock, cETC1AbsColor4R2BitOffset, 4, (c >> 8) & 15); + etc_block_set_byte_bits(pBlock, cETC1AbsColor4G2BitOffset, 4, (c >> 4) & 15); + etc_block_set_byte_bits(pBlock, cETC1AbsColor4B2BitOffset, 4, c & 15); + } + else + { + etc_block_set_byte_bits(pBlock, cETC1AbsColor4R1BitOffset, 4, (c >> 8) & 15); + etc_block_set_byte_bits(pBlock, cETC1AbsColor4G1BitOffset, 4, (c >> 4) & 15); + etc_block_set_byte_bits(pBlock, cETC1AbsColor4B1BitOffset, 4, c & 15); + } +} + +uint16_t etc_block_get_base4_color(const etc_block *pBlock, uint32_t idx) +{ + uint32_t r, g, b; + if (idx) + { + r = etc_block_get_byte_bits(pBlock, cETC1AbsColor4R2BitOffset, 4); + g = etc_block_get_byte_bits(pBlock, cETC1AbsColor4G2BitOffset, 4); + b = etc_block_get_byte_bits(pBlock, cETC1AbsColor4B2BitOffset, 4); + } + else + { + r = etc_block_get_byte_bits(pBlock, cETC1AbsColor4R1BitOffset, 4); + g = etc_block_get_byte_bits(pBlock, cETC1AbsColor4G1BitOffset, 4); + b = etc_block_get_byte_bits(pBlock, cETC1AbsColor4B1BitOffset, 4); + } + return (uint16_t)(b | (g << 4U) | (r << 8U)); +} + +void etc_block_set_base5_color(etc_block *pBlock, uint16_t c) +{ + etc_block_set_byte_bits(pBlock, cETC1BaseColor5RBitOffset, 5, (c >> 10) & 31); + etc_block_set_byte_bits(pBlock, cETC1BaseColor5GBitOffset, 5, (c >> 5) & 31); + etc_block_set_byte_bits(pBlock, cETC1BaseColor5BBitOffset, 5, c & 31); +} + +uint16_t etc_block_get_base5_color(const etc_block *pBlock) +{ + const uint32_t r = etc_block_get_byte_bits(pBlock, cETC1BaseColor5RBitOffset, 5); + const uint32_t g = etc_block_get_byte_bits(pBlock, cETC1BaseColor5GBitOffset, 5); + const uint32_t b = etc_block_get_byte_bits(pBlock, cETC1BaseColor5BBitOffset, 5); + return (uint16_t)(b | (g << 5U) | (r << 10U)); +} + +void etc_block_set_delta3_color(etc_block *pBlock, uint16_t c) +{ + etc_block_set_byte_bits(pBlock, cETC1DeltaColor3RBitOffset, 3, (c >> 6) & 7); + etc_block_set_byte_bits(pBlock, cETC1DeltaColor3GBitOffset, 3, (c >> 3) & 7); + etc_block_set_byte_bits(pBlock, cETC1DeltaColor3BBitOffset, 3, c & 7); +} + +uint16_t etc_block_get_delta3_color(const etc_block *pBlock) +{ + const uint32_t r = etc_block_get_byte_bits(pBlock, cETC1DeltaColor3RBitOffset, 3); + const uint32_t g = etc_block_get_byte_bits(pBlock, cETC1DeltaColor3GBitOffset, 3); + const uint32_t b = etc_block_get_byte_bits(pBlock, cETC1DeltaColor3BBitOffset, 3); + return (uint16_t)(b | (g << 3U) | (r << 6U)); +} + +void etc_block_unpack_delta3(int *pR, int *pG, int *pB, uint16_t packed_delta3) +{ + int r = (packed_delta3 >> 6) & 7; + int g = (packed_delta3 >> 3) & 7; + int b = packed_delta3 & 7; + if (r >= 4) r -= 8; + if (g >= 4) g -= 8; + if (b >= 4) b -= 8; + *pR = r; + *pG = g; + *pB = b; +} + +bool etc_block_unpack_color5_delta3(color_rgba *pResult, uint16_t packed_color5, uint16_t packed_delta3, bool scaled, uint32_t alpha) +{ + int dr, dg, db; + etc_block_unpack_delta3(&dr, &dg, &db, packed_delta3); + + int b = (packed_color5 & 31U) + db; + int g = ((packed_color5 >> 5U) & 31U) + dg; + int r = ((packed_color5 >> 10U) & 31U) + dr; + + bool success = true; + if ((uint32_t)(r | g | b) > 31U) + { + success = false; + r = clamp(r, 0, 31); + g = clamp(g, 0, 31); + b = clamp(b, 0, 31); + } + + if (scaled) + { + b = (b << 3U) | (b >> 2U); + g = (g << 3U) | (g >> 2U); + r = (r << 3U) | (r >> 2U); + } + + *pResult = (color_rgba)(r, g, b, min(alpha, 255U)); + return success; +} + +color_rgba etc_block_unpack_color5(uint16_t packed_color5, bool scaled, uint32_t alpha) +{ + uint32_t b = packed_color5 & 31U; + uint32_t g = (packed_color5 >> 5U) & 31U; + uint32_t r = (packed_color5 >> 10U) & 31U; + + if (scaled) + { + b = (b << 3U) | (b >> 2U); + g = (g << 3U) | (g >> 2U); + r = (r << 3U) | (r >> 2U); + } + + return (color_rgba)(r, g, b, min(alpha, 255U)); +} + +color_rgba etc_block_unpack_color4(uint16_t packed_color4, bool scaled, uint32_t alpha) +{ + uint32_t b = packed_color4 & 15U; + uint32_t g = (packed_color4 >> 4U) & 15U; + uint32_t r = (packed_color4 >> 8U) & 15U; + + if (scaled) + { + b = (b << 4U) | b; + g = (g << 4U) | g; + r = (r << 4U) | r; + } + + return (color_rgba)(r, g, b, min(alpha, 255U)); +} + +// false if didn't clamp, true if any component clamped +bool etc_block_get_block_colors(const etc_block *pBlock, color_rgba* pBlock_colors, uint32_t subblock_index) +{ + color_rgba b; + + if (etc_block_get_diff_bit(pBlock)) + { + if (subblock_index) + etc_block_unpack_color5_delta3(&b, etc_block_get_base5_color(pBlock), etc_block_get_delta3_color(pBlock), true, 255); + else + b = etc_block_unpack_color5(etc_block_get_base5_color(pBlock), true, 255); + } + else + { + b = etc_block_unpack_color4(etc_block_get_base4_color(pBlock, subblock_index), true, 255); + } + + constant int* pInten_table = g_etc1_inten_tables[etc_block_get_inten_table(pBlock, subblock_index)]; + + bool dc = false; + pBlock_colors[0] = (color_rgba)(clamp255_flag(b.x + pInten_table[0], &dc), clamp255_flag(b.y + pInten_table[0], &dc), clamp255_flag(b.z + pInten_table[0], &dc), 255); + pBlock_colors[1] = (color_rgba)(clamp255_flag(b.x + pInten_table[1], &dc), clamp255_flag(b.y + pInten_table[1], &dc), clamp255_flag(b.z + pInten_table[1], &dc), 255); + pBlock_colors[2] = (color_rgba)(clamp255_flag(b.x + pInten_table[2], &dc), clamp255_flag(b.y + pInten_table[2], &dc), clamp255_flag(b.z + pInten_table[2], &dc), 255); + pBlock_colors[3] = (color_rgba)(clamp255_flag(b.x + pInten_table[3], &dc), clamp255_flag(b.y + pInten_table[3], &dc), clamp255_flag(b.z + pInten_table[3], &dc), 255); + return dc; +} + +void get_block_colors5(color_rgba *pBlock_colors, const color_rgba *pBase_color5, uint32_t inten_table, bool scaled /* false */) +{ + color_rgba b = *pBase_color5; + + if (!scaled) + { + b.x = (b.x << 3) | (b.x >> 2); + b.y = (b.y << 3) | (b.y >> 2); + b.z = (b.z << 3) | (b.z >> 2); + } + + constant int* pInten_table = g_etc1_inten_tables[inten_table]; + + pBlock_colors[0] = (color_rgba)(clamp255(b.x + pInten_table[0]), clamp255(b.y + pInten_table[0]), clamp255(b.z + pInten_table[0]), 255); + pBlock_colors[1] = (color_rgba)(clamp255(b.x + pInten_table[1]), clamp255(b.y + pInten_table[1]), clamp255(b.z + pInten_table[1]), 255); + pBlock_colors[2] = (color_rgba)(clamp255(b.x + pInten_table[2]), clamp255(b.y + pInten_table[2]), clamp255(b.z + pInten_table[2]), 255); + pBlock_colors[3] = (color_rgba)(clamp255(b.x + pInten_table[3]), clamp255(b.y + pInten_table[3]), clamp255(b.z + pInten_table[3]), 255); +} + +uint64_t etc_block_determine_selectors(etc_block *pBlock, const color_rgba* pSource_pixels, bool perceptual, uint32_t begin_subblock /*= 0*/, uint32_t end_subblock /*= 2*/) +{ + uint64_t total_error = 0; + + for (uint32_t subblock = begin_subblock; subblock < end_subblock; subblock++) + { + color_rgba block_colors[4]; + etc_block_get_block_colors(pBlock, block_colors, subblock); + + if (etc_block_get_flip_bit(pBlock)) + { + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t best_selector = 0; + uint64_t best_error = UINT64_MAX; + + for (uint32_t s = 0; s < 4; s++) + { + uint64_t err = color_distance(perceptual, block_colors[s], pSource_pixels[x + (subblock * 2 + y) * 4], false); + if (err < best_error) + { + best_error = err; + best_selector = s; + } + } + + etc_block_set_selector(pBlock, x, subblock * 2 + y, best_selector); + + total_error += best_error; + } + } + } + else + { + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 2; x++) + { + uint32_t best_selector = 0; + uint64_t best_error = UINT64_MAX; + + for (uint32_t s = 0; s < 4; s++) + { + uint64_t err = color_distance(perceptual, block_colors[s], pSource_pixels[(subblock * 2) + x + y * 4], false); + if (err < best_error) + { + best_error = err; + best_selector = s; + } + } + + etc_block_set_selector(pBlock, subblock * 2 + x, y, best_selector); + + total_error += best_error; + } + } + } + } + + return total_error; +} + +uint16_t etc_block_pack_color4_rgb(uint32_t r, uint32_t g, uint32_t b, bool scaled) +{ + uint32_t bias = 127; + + if (scaled) + { + r = (r * 15U + bias) / 255U; + g = (g * 15U + bias) / 255U; + b = (b * 15U + bias) / 255U; + } + + r = min(r, 15U); + g = min(g, 15U); + b = min(b, 15U); + + return (uint16_t)(b | (g << 4U) | (r << 8U)); +} + +uint16_t etc_block_pack_color4(color_rgba color, bool scaled) +{ + uint32_t bias = 127; + return etc_block_pack_color4_rgb(color.x, color.y, color.z, scaled); +} + +uint16_t etc_block_pack_delta3(int r, int g, int b) +{ + assert((r >= cETC1ColorDeltaMin) && (r <= cETC1ColorDeltaMax)); + assert((g >= cETC1ColorDeltaMin) && (g <= cETC1ColorDeltaMax)); + assert((b >= cETC1ColorDeltaMin) && (b <= cETC1ColorDeltaMax)); + if (r < 0) r += 8; + if (g < 0) g += 8; + if (b < 0) b += 8; + return (uint16_t)(b | (g << 3) | (r << 6)); +} + +void etc_block_set_block_color4(etc_block *pBlock, color_rgba c0_unscaled, color_rgba c1_unscaled) +{ + etc_block_set_diff_bit(pBlock, false); + + etc_block_set_base4_color(pBlock, 0, etc_block_pack_color4(c0_unscaled, false)); + etc_block_set_base4_color(pBlock, 1, etc_block_pack_color4(c1_unscaled, false)); +} + +uint16_t etc_block_pack_color5_rgb(uint32_t r, uint32_t g, uint32_t b, bool scaled) +{ + uint32_t bias = 127; + + if (scaled) + { + r = (r * 31U + bias) / 255U; + g = (g * 31U + bias) / 255U; + b = (b * 31U + bias) / 255U; + } + + r = min(r, 31U); + g = min(g, 31U); + b = min(b, 31U); + + return (uint16_t)(b | (g << 5U) | (r << 10U)); +} + +uint16_t etc_block_pack_color5(color_rgba c, bool scaled) +{ + return etc_block_pack_color5_rgb(c.x, c.y, c.z, scaled); +} + +void etc_block_set_block_color5(etc_block *pBlock, color_rgba c0_unscaled, color_rgba c1_unscaled) +{ + etc_block_set_diff_bit(pBlock, true); + + etc_block_set_base5_color(pBlock, etc_block_pack_color5(c0_unscaled, false)); + + int dr = c1_unscaled.x - c0_unscaled.x; + int dg = c1_unscaled.y - c0_unscaled.y; + int db = c1_unscaled.z - c0_unscaled.z; + + etc_block_set_delta3_color(pBlock, etc_block_pack_delta3(dr, dg, db)); +} + +void etc_block_set_block_color5_etc1s(etc_block *pBlock, color_rgba c_unscaled) +{ + etc_block_set_diff_bit(pBlock, true); + + etc_block_set_base5_color(pBlock, etc_block_pack_color5(c_unscaled, false)); + etc_block_set_delta3_color(pBlock, etc_block_pack_delta3(0, 0, 0)); +} + +bool etc_block_set_block_color5_check(etc_block *pBlock, color_rgba c0_unscaled, color_rgba c1_unscaled) +{ + etc_block_set_diff_bit(pBlock, true); + + etc_block_set_base5_color(pBlock, etc_block_pack_color5(c0_unscaled, false)); + + int dr = c1_unscaled.x - c0_unscaled.x; + int dg = c1_unscaled.y - c0_unscaled.y; + int db = c1_unscaled.z - c0_unscaled.z; + + if (((dr < cETC1ColorDeltaMin) || (dr > cETC1ColorDeltaMax)) || + ((dg < cETC1ColorDeltaMin) || (dg > cETC1ColorDeltaMax)) || + ((db < cETC1ColorDeltaMin) || (db > cETC1ColorDeltaMax))) + return false; + + etc_block_set_delta3_color(pBlock, etc_block_pack_delta3(dr, dg, db)); + + return true; +} + +void etc_block_pack_raw_selectors(etc_block *pBlock, const uint8_t *pSelectors) +{ + uint32_t word3 = 0, word2 = 0; + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t bit_index = x * 4 + y; + const uint32_t s = pSelectors[x + y * 4]; + + const uint32_t lsb = s & 1, msb = s >> 1; + + word3 |= (lsb << bit_index); + word2 |= (msb << bit_index); + } + } + + pBlock->m_bytes[7] = (uint8_t)(word3); + pBlock->m_bytes[6] = (uint8_t)(word3 >> 8); + pBlock->m_bytes[5] = (uint8_t)(word2); + pBlock->m_bytes[4] = (uint8_t)(word2 >> 8); +} + +// ---- EC1S block encoding/endpoint optimization + +constant uint8_t g_eval_dist_tables[8][256] = +{ + // 99% threshold + { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,}, + { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,}, + { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,}, + { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,}, + { 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,}, + { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,1,1,1,1,1,0,1,1,1,0,1,1,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}, + { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,} +}; + +typedef struct etc1s_optimizer_solution_coordinates_tag +{ + color_rgba m_unscaled_color; + uint32_t m_inten_table; +} etc1s_optimizer_solution_coordinates; + +color_rgba get_scaled_color(color_rgba unscaled_color) +{ + int br, bg, bb; + + br = (unscaled_color.x >> 2) | (unscaled_color.x << 3); + bg = (unscaled_color.y >> 2) | (unscaled_color.y << 3); + bb = (unscaled_color.z >> 2) | (unscaled_color.z << 3); + + return (color_rgba)((uint8_t)br, (uint8_t)bg, (uint8_t)bb, 255); +} + +typedef struct etc1s_optimizer_potential_solution_tag +{ + uint64_t m_error; + etc1s_optimizer_solution_coordinates m_coords; + + uint8_t m_selectors[16]; + bool m_valid; +} etc1s_optimizer_potential_solution; + +typedef struct etc1s_optimizer_state_tag +{ + int m_br, m_bg, m_bb; + float3 m_avg_color; + int m_max_comp_spread; + etc1s_optimizer_potential_solution m_best_solution; +} etc1s_optimizer_state; + +bool etc1s_optimizer_evaluate_solution( + etc1s_optimizer_state *pState, + const global encode_etc1s_param_struct *pParams, + uint64_t num_pixels, const global color_rgba *pPixels, + const global uint32_t *pWeights, + etc1s_optimizer_solution_coordinates coords, + etc1s_optimizer_potential_solution* pTrial_solution, + etc1s_optimizer_potential_solution* pBest_solution) +{ + uint8_t temp_selectors[16]; + + pTrial_solution->m_valid = false; + + const color_rgba base_color = get_scaled_color(coords.m_unscaled_color); + + pTrial_solution->m_error = INT64_MAX; + + for (uint32_t inten_table = 0; inten_table < cETC1IntenModifierValues; inten_table++) + { + // TODO: This check is equivalent to medium quality in the C++ version. + if (!g_eval_dist_tables[inten_table][pState->m_max_comp_spread]) + continue; + + constant int* pInten_table = g_etc1_inten_tables[inten_table]; + + color_rgba block_colors[4]; + for (uint32_t s = 0; s < 4; s++) + { + int yd = pInten_table[s]; + block_colors[s] = (color_rgba)(clamp255(base_color.x + yd), clamp255(base_color.y + yd), clamp255(base_color.z + yd), 255); + } + + uint64_t total_error = 0; + + for (uint64_t c = 0; c < num_pixels; c++) + { + color_rgba src_pixel = pPixels[c]; + + uint32_t best_selector_index = 3; + uint32_t best_error = color_distance(pParams->m_perceptual, src_pixel, block_colors[0], false); + + uint32_t trial_error = color_distance(pParams->m_perceptual, src_pixel, block_colors[1], false); + if (trial_error < best_error) + { + best_error = trial_error; + best_selector_index = 2; + } + + trial_error = color_distance(pParams->m_perceptual, src_pixel, block_colors[2], false); + if (trial_error < best_error) + { + best_error = trial_error; + best_selector_index = 0; + } + + trial_error = color_distance(pParams->m_perceptual, src_pixel, block_colors[3], false); + if (trial_error < best_error) + { + best_error = trial_error; + best_selector_index = 1; + } + + if (num_pixels <= 16) + temp_selectors[c] = (uint8_t)(best_selector_index); + + total_error += pWeights ? (best_error * (uint64_t)pWeights[c]) : best_error; + + if (total_error >= pTrial_solution->m_error) + break; + } + + if (total_error < pTrial_solution->m_error) + { + pTrial_solution->m_error = total_error; + pTrial_solution->m_coords.m_inten_table = inten_table; + if (num_pixels <= 16) + { + for (uint32_t i = 0; i < num_pixels; i++) + pTrial_solution->m_selectors[i] = temp_selectors[i]; + } + pTrial_solution->m_valid = true; + } + } + pTrial_solution->m_coords.m_unscaled_color = coords.m_unscaled_color; + + bool success = false; + if (pBest_solution) + { + if (pTrial_solution->m_error < pBest_solution->m_error) + { + *pBest_solution = *pTrial_solution; + success = true; + } + } + + return success; +} + +void etc1s_optimizer_init( + etc1s_optimizer_state *pState, + const global encode_etc1s_param_struct *pParams, + uint64_t num_pixels, const global color_rgba *pPixels, + const global uint32_t *pWeights) +{ + const int LIMIT = 31; + + color_rgba min_color = 255; + color_rgba max_color = 0; + uint64_t total_weight = 0; + uint64_t sum_r = 0, sum_g = 0, sum_b = 0; + + for (uint64_t i = 0; i < num_pixels; i++) + { + const color_rgba c = pPixels[i]; + + min_color = min(min_color, c); + max_color = max(max_color, c); + + if (pWeights) + { + uint64_t weight = pWeights[i]; + + sum_r += weight * c.x; + sum_g += weight * c.y; + sum_b += weight * c.z; + + total_weight += weight; + } + else + { + sum_r += c.x; + sum_g += c.y; + sum_b += c.z; + + total_weight++; + } + } + + float3 avg_color; + avg_color.x = (float)sum_r / total_weight; + avg_color.y = (float)sum_g / total_weight; + avg_color.z = (float)sum_b / total_weight; + + pState->m_avg_color = avg_color; + pState->m_max_comp_spread = max(max((int)max_color.x - (int)min_color.x, (int)max_color.y - (int)min_color.y), (int)max_color.z - (int)min_color.z); + + // TODO: The rounding here could be improved, like with DXT1/BC1. + pState->m_br = clamp((int)(avg_color.x * (LIMIT / 255.0f) + .5f), 0, LIMIT); + pState->m_bg = clamp((int)(avg_color.y * (LIMIT / 255.0f) + .5f), 0, LIMIT); + pState->m_bb = clamp((int)(avg_color.z * (LIMIT / 255.0f) + .5f), 0, LIMIT); + + pState->m_best_solution.m_valid = false; + pState->m_best_solution.m_error = UINT64_MAX; +} + +void etc1s_optimizer_internal_cluster_fit( + uint32_t total_perms_to_try, + etc1s_optimizer_state *pState, + const global encode_etc1s_param_struct *pParams, + uint64_t num_pixels, const global color_rgba *pPixels, + const global uint32_t *pWeights) +{ + const int LIMIT = 31; + + etc1s_optimizer_potential_solution trial_solution; + + etc1s_optimizer_solution_coordinates cur_coords; + cur_coords.m_unscaled_color = (color_rgba)(pState->m_br, pState->m_bg, pState->m_bb, 255); + etc1s_optimizer_evaluate_solution(pState, pParams, num_pixels, pPixels, pWeights, cur_coords, &trial_solution, &pState->m_best_solution); + + if (pState->m_best_solution.m_error == 0) + return; + + for (uint32_t i = 0; i < total_perms_to_try; i++) + { + int delta_sum_r = 0, delta_sum_g = 0, delta_sum_b = 0; + + constant int *pInten_table = g_etc1_inten_tables[pState->m_best_solution.m_coords.m_inten_table]; + const color_rgba base_color = get_scaled_color(pState->m_best_solution.m_coords.m_unscaled_color); + + constant uint8_t *pNum_selectors = g_cluster_fit_order_tab[i].m_v; + + for (uint32_t q = 0; q < 4; q++) + { + const int yd_temp = pInten_table[q]; + + delta_sum_r += pNum_selectors[q] * (clamp(base_color.x + yd_temp, 0, 255) - base_color.x); + delta_sum_g += pNum_selectors[q] * (clamp(base_color.y + yd_temp, 0, 255) - base_color.y); + delta_sum_b += pNum_selectors[q] * (clamp(base_color.z + yd_temp, 0, 255) - base_color.z); + } + + if ((!delta_sum_r) && (!delta_sum_g) && (!delta_sum_b)) + continue; + + const float avg_delta_r_f = (float)(delta_sum_r) / 8; + const float avg_delta_g_f = (float)(delta_sum_g) / 8; + const float avg_delta_b_f = (float)(delta_sum_b) / 8; + + const int br1 = clamp((int)((pState->m_avg_color.x - avg_delta_r_f) * (LIMIT / 255.0f) + .5f), 0, LIMIT); + const int bg1 = clamp((int)((pState->m_avg_color.y - avg_delta_g_f) * (LIMIT / 255.0f) + .5f), 0, LIMIT); + const int bb1 = clamp((int)((pState->m_avg_color.z - avg_delta_b_f) * (LIMIT / 255.0f) + .5f), 0, LIMIT); + + cur_coords.m_unscaled_color = (color_rgba)(br1, bg1, bb1, 255); + + etc1s_optimizer_evaluate_solution(pState, pParams, num_pixels, pPixels, pWeights, cur_coords, &trial_solution, &pState->m_best_solution); + + if (pState->m_best_solution.m_error == 0) + break; + } +} + +// Encode an ETC1S block given a 4x4 pixel block. +kernel void encode_etc1s_blocks( + const global encode_etc1s_param_struct *pParams, + const global pixel_block *pInput_blocks, + global etc_block *pOutput_blocks) +{ + const uint32_t block_index = get_global_id(0); + + const global pixel_block *pInput_block = &pInput_blocks[block_index]; + + etc1s_optimizer_state state; + etc1s_optimizer_init(&state, pParams, 16, pInput_block->m_pixels, NULL); + etc1s_optimizer_internal_cluster_fit(pParams->m_total_perms, &state, pParams, 16, pInput_block->m_pixels, NULL); + + etc_block blk; + etc_block_set_flip_bit(&blk, true); + etc_block_set_block_color5_etc1s(&blk, state.m_best_solution.m_coords.m_unscaled_color); + etc_block_set_inten_tables_etc1s(&blk, state.m_best_solution.m_coords.m_inten_table); + etc_block_pack_raw_selectors(&blk, state.m_best_solution.m_selectors); + + pOutput_blocks[block_index] = blk; +} + +typedef struct __attribute__ ((packed)) pixel_cluster_tag +{ + uint64_t m_total_pixels; + uint64_t m_first_pixel_index; +} pixel_cluster; + +// Determine the optimal ETC1S color5/intensity given an arbitrary large array of 4x4 input pixel blocks. +kernel void encode_etc1s_from_pixel_cluster( + const global encode_etc1s_param_struct *pParams, + const global pixel_cluster *pInput_pixel_clusters, + const global color_rgba *pInput_pixels, + const global uint32_t *pInput_weights, + global etc_block *pOutput_blocks) +{ + const uint32_t cluster_index = get_global_id(0); + + const global pixel_cluster *pInput_cluster = &pInput_pixel_clusters[cluster_index]; + + uint64_t total_pixels = pInput_cluster->m_total_pixels; + const global color_rgba *pPixels = pInput_pixels + pInput_cluster->m_first_pixel_index; + const global uint32_t *pWeights = pInput_weights + pInput_cluster->m_first_pixel_index; + + etc1s_optimizer_state state; + etc1s_optimizer_init(&state, pParams, total_pixels, pPixels, pWeights); + etc1s_optimizer_internal_cluster_fit(pParams->m_total_perms, &state, pParams, total_pixels, pPixels, pWeights); + + etc_block blk; + etc_block_set_flip_bit(&blk, true); + etc_block_set_block_color5_etc1s(&blk, state.m_best_solution.m_coords.m_unscaled_color); + etc_block_set_inten_tables_etc1s(&blk, state.m_best_solution.m_coords.m_inten_table); + + pOutput_blocks[cluster_index] = blk; +} + +// ---- refine_endpoint_clusterization +typedef struct __attribute__ ((packed)) rec_block_struct_tag +{ + uint16_t m_first_cluster_ofs; + uint16_t m_num_clusters; + uint16_t m_cur_cluster_index; + uint8_t m_cur_cluster_etc_inten; +} rec_block_struct; + +typedef struct __attribute__ ((packed)) rec_endpoint_cluster_struct_tag +{ + color_rgba m_unscaled_color; + uint8_t m_etc_inten; + uint16_t m_cluster_index; +} rec_endpoint_cluster_struct; + +typedef struct __attribute__ ((packed)) rec_param_struct_tag +{ + uint32_t m_total_blocks; + int m_perceptual; +} rec_param_struct; + +// For each input block: find the best endpoint cluster that encodes it. +kernel void refine_endpoint_clusterization( + const rec_param_struct params, + const global pixel_block *pInput_blocks, + const global rec_block_struct *pInput_block_info, + const global rec_endpoint_cluster_struct *pInput_clusters, + const global uint32_t *pSorted_block_indices, + global uint32_t *pOutput_indices) +{ + const uint32_t sorted_block_index = get_global_id(0); + const uint32_t block_index = pSorted_block_indices[sorted_block_index]; + const int perceptual = params.m_perceptual; + + const global pixel_block *pInput_block = &pInput_blocks[block_index]; + + pixel_block priv_pixel_block; + priv_pixel_block = *pInput_block; + + const uint32_t first_cluster_ofs = pInput_block_info[block_index].m_first_cluster_ofs; + const uint32_t num_clusters = pInput_block_info[block_index].m_num_clusters; + const uint32_t cur_block_cluster_index = pInput_block_info[block_index].m_cur_cluster_index; + const uint32_t cur_block_cluster_etc_inten = pInput_block_info[block_index].m_cur_cluster_etc_inten; + + uint64_t overall_best_err = UINT64_MAX; + uint32_t best_cluster_index = 0; + + for (uint32_t i = 0; i < num_clusters; i++) + { + const uint32_t cluster_index = first_cluster_ofs + i; + color_rgba unscaled_color = pInput_clusters[cluster_index].m_unscaled_color; + const uint8_t etc_inten = pInput_clusters[cluster_index].m_etc_inten; + const uint16_t orig_cluster_index = pInput_clusters[cluster_index].m_cluster_index; + + if (etc_inten > cur_block_cluster_etc_inten) + continue; + + color_rgba block_colors[4]; + get_block_colors5(block_colors, &unscaled_color, etc_inten, false); + + uint64_t total_error = 0; + + for (uint32_t c = 0; c < 16; c++) + { + color_rgba src_pixel = priv_pixel_block.m_pixels[c]; + + uint32_t best_error = color_distance(perceptual, src_pixel, block_colors[0], false); + + uint32_t trial_error = color_distance(perceptual, src_pixel, block_colors[1], false); + if (trial_error < best_error) + best_error = trial_error; + + trial_error = color_distance(perceptual, src_pixel, block_colors[2], false); + if (trial_error < best_error) + best_error = trial_error; + + trial_error = color_distance(perceptual, src_pixel, block_colors[3], false); + if (trial_error < best_error) + best_error = trial_error; + + total_error += best_error; + } + + if ( (total_error < overall_best_err) || + ((orig_cluster_index == cur_block_cluster_index) && (total_error == overall_best_err)) + ) + { + overall_best_err = total_error; + best_cluster_index = orig_cluster_index; + if (!overall_best_err) + break; + } + } + + pOutput_indices[block_index] = best_cluster_index; +} + +// ---- find_optimal_selector_clusters_for_each_block + +typedef struct __attribute__ ((packed)) fosc_selector_struct_tag +{ + uint32_t m_packed_selectors; // 4x4 grid of 2-bit selectors +} fosc_selector_struct; + +typedef struct __attribute__ ((packed)) fosc_block_struct_tag +{ + color_rgba m_etc_color5_inten; // unscaled 5-bit block color in RGB, alpha has block's intensity index + uint32_t m_first_selector; // offset into selector table + uint32_t m_num_selectors; // number of selectors to check +} fosc_block_struct; + +typedef struct __attribute__ ((packed)) fosc_param_struct_tag +{ + uint32_t m_total_blocks; + int m_perceptual; +} fosc_param_struct; + +// For each input block: Find the quantized selector which results in the lowest error. +kernel void find_optimal_selector_clusters_for_each_block( + const fosc_param_struct params, + const global pixel_block *pInput_blocks, + const global fosc_block_struct *pInput_block_info, + const global fosc_selector_struct *pInput_selectors, + const global uint32_t *pSelector_cluster_indices, + global uint32_t *pOutput_selector_cluster_indices) +{ + const uint32_t block_index = get_global_id(0); + + const global color_rgba *pBlock_pixels = pInput_blocks[block_index].m_pixels; + const global fosc_block_struct *pBlock_info = &pInput_block_info[block_index]; + + const global fosc_selector_struct *pSelectors = &pInput_selectors[pBlock_info->m_first_selector]; + const uint32_t num_selectors = pBlock_info->m_num_selectors; + + color_rgba trial_block_colors[4]; + color_rgba etc_color5_inten = pBlock_info->m_etc_color5_inten; + get_block_colors5(trial_block_colors, &etc_color5_inten, etc_color5_inten.w, false); + + uint32_t trial_errors[4][16]; + + if (params.m_perceptual) + { + for (uint32_t sel = 0; sel < 4; ++sel) + for (uint32_t i = 0; i < 16; ++i) + trial_errors[sel][i] = color_distance(true, pBlock_pixels[i], trial_block_colors[sel], false); + } + else + { + for (uint32_t sel = 0; sel < 4; ++sel) + for (uint32_t i = 0; i < 16; ++i) + trial_errors[sel][i] = color_distance(false, pBlock_pixels[i], trial_block_colors[sel], false); + } + + uint64_t best_err = UINT64_MAX; + uint32_t best_index = 0; + + for (uint32_t sel_index = 0; sel_index < num_selectors; sel_index++) + { + uint32_t sels = pSelectors[sel_index].m_packed_selectors; + + uint64_t total_err = 0; + for (uint32_t i = 0; i < 16; i++, sels >>= 2) + total_err += trial_errors[sels & 3][i]; + + if (total_err < best_err) + { + best_err = total_err; + best_index = sel_index; + + if (!best_err) + break; + } + } + + pOutput_selector_cluster_indices[block_index] = pSelector_cluster_indices[pBlock_info->m_first_selector + best_index]; +} + +// determine_selectors + +typedef struct __attribute__ ((packed)) ds_param_struct_tag +{ + uint32_t m_total_blocks; + int m_perceptual; +} ds_param_struct; + +// For each input block: Determine the ETC1S selectors that result in the lowest error, given each block's predetermined ETC1S color5/intensities. +kernel void determine_selectors( + const ds_param_struct params, + const global pixel_block *pInput_blocks, + const global color_rgba *pInput_etc_color5_and_inten, + global etc_block *pOutput_blocks) +{ + const uint32_t block_index = get_global_id(0); + + const global color_rgba *pBlock_pixels = pInput_blocks[block_index].m_pixels; + + color_rgba etc_color5_inten = pInput_etc_color5_and_inten[block_index]; + + color_rgba block_colors[4]; + get_block_colors5(block_colors, &etc_color5_inten, etc_color5_inten.w, false); + + etc_block output_block; + etc_block_set_flip_bit(&output_block, true); + etc_block_set_block_color5_etc1s(&output_block, etc_color5_inten); + etc_block_set_inten_tables_etc1s(&output_block, etc_color5_inten.w); + + for (uint32_t i = 0; i < 16; i++) + { + color_rgba pixel_color = pBlock_pixels[i]; + + uint err0 = color_distance(params.m_perceptual, pixel_color, block_colors[0], false); + uint err1 = color_distance(params.m_perceptual, pixel_color, block_colors[1], false); + uint err2 = color_distance(params.m_perceptual, pixel_color, block_colors[2], false); + uint err3 = color_distance(params.m_perceptual, pixel_color, block_colors[3], false); + + uint best_err = min(min(min(err0, err1), err2), err3); + + uint32_t best_sel = (best_err == err2) ? 2 : 3; + best_sel = (best_err == err1) ? 1 : best_sel; + best_sel = (best_err == err0) ? 0 : best_sel; + + etc_block_set_selector(&output_block, i & 3, i >> 2, best_sel); + } + + pOutput_blocks[block_index] = output_block; +} + diff --git a/ktx/external/basisu/bin/readme.txt b/ktx/external/basisu/bin/readme.txt new file mode 100644 index 0000000..c33ed9f --- /dev/null +++ b/ktx/external/basisu/bin/readme.txt @@ -0,0 +1 @@ +executable files go here diff --git a/ktx/external/basisu/build_clang.sh b/ktx/external/basisu/build_clang.sh new file mode 100644 index 0000000..91e8a79 --- /dev/null +++ b/ktx/external/basisu/build_clang.sh @@ -0,0 +1 @@ +cmake -D CMAKE_C_COMPILER=/usr/bin/clang -D CMAKE_CXX_COMPILER=/usr/bin/clang++ . diff --git a/ktx/external/basisu/build_emscripten.sh b/ktx/external/basisu/build_emscripten.sh new file mode 100644 index 0000000..7b0cfb7 --- /dev/null +++ b/ktx/external/basisu/build_emscripten.sh @@ -0,0 +1,9 @@ +#!/bin/sh +if ! emcc --version +then + echo "Emscripten not found on PATH. Please follow instructions on https://emscripten.org/docs/getting_started/downloads.html" + exit +fi + +emcmake cmake . +emcmake make diff --git a/ktx/external/basisu/contrib/.gitignore b/ktx/external/basisu/contrib/.gitignore new file mode 100644 index 0000000..61937bd --- /dev/null +++ b/ktx/external/basisu/contrib/.gitignore @@ -0,0 +1,2 @@ +# Mac finder +.DS_Store diff --git a/ktx/external/basisu/contrib/previewers/lib/README.md b/ktx/external/basisu/contrib/previewers/lib/README.md new file mode 100644 index 0000000..bbd2508 --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/lib/README.md @@ -0,0 +1,3 @@ +# Single File Basis Universal Transcoder + +Header and implementation generated using the [single file transcoder](../../single_file_transcoder) post-process script. Unlike the examples in that subproject here the transcoder header was kept as a seperate file (using the `-k` option, see the [README](../../single_file_transcoder/README.md)). diff --git a/ktx/external/basisu/contrib/previewers/lib/basisu_transcoder.cpp b/ktx/external/basisu/contrib/previewers/lib/basisu_transcoder.cpp new file mode 100644 index 0000000..37640ee --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/lib/basisu_transcoder.cpp @@ -0,0 +1,26897 @@ +/** + * Basis Universal single file library. Generated using: + * \code + * ./combine.sh -r ../../transcoder -o basisu_transcoder.cpp basisu_transcoder-in.cpp + * \endcode + */ + +/* + * Transcoder build options for known platforms (iOS has ETC, ASTC and PVRTC; + * Emscripten adds DXT to iOS's options; Android adds PVRTC2 to Emscripten's + * options; other platforms build all except FXT1). + * + * See https://github.com/BinomialLLC/basis_universal#shrinking-the-transcoders-compiled-size + */ +#ifdef __APPLE__ + #include +#endif +#if TARGET_OS_IPHONE + #define BASISD_SUPPORT_DXT1 0 + #define BASISD_SUPPORT_DXT5A 0 +#endif +#if TARGET_OS_IPHONE || defined(__EMSCRIPTEN__) || defined(__ANDROID__) + #define BASISD_SUPPORT_BC7 0 + #define BASISD_SUPPORT_ATC 0 + #ifndef __ANDROID__ + #define BASISD_SUPPORT_PVRTC2 0 + #endif +#endif +#define BASISD_SUPPORT_FXT1 0 + +/* + * KTX2 support disabled. + */ +#define BASISD_SUPPORT_KTX2 0 + +/**** start inlining basisu_transcoder.cpp ****/ +// basisu_transcoder.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. + +/**** start inlining basisu_transcoder.h ****/ +// basisu_transcoder.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// Important: If compiling with gcc, be sure strict aliasing is disabled: -fno-strict-aliasing +// +// 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. + +// By default KTX2 support is enabled to simplify compilation. This implies the need for the Zstandard library (which we distribute as a single source file in the "zstd" directory) by default. +// Set BASISD_SUPPORT_KTX2 to 0 to completely disable KTX2 support as well as Zstd/miniz usage which is only required for UASTC supercompression in KTX2 files. +// Also see BASISD_SUPPORT_KTX2_ZSTD in basisu_transcoder.cpp, which individually disables Zstd usage. +#ifndef BASISD_SUPPORT_KTX2 + #define BASISD_SUPPORT_KTX2 1 +#endif + +// Set BASISD_SUPPORT_KTX2_ZSTD to 0 to disable Zstd usage and KTX2 UASTC Zstd supercompression support +#ifndef BASISD_SUPPORT_KTX2_ZSTD + #define BASISD_SUPPORT_KTX2_ZSTD 1 +#endif + +// Set BASISU_FORCE_DEVEL_MESSAGES to 1 to enable debug printf()'s whenever an error occurs, for easier debugging during development. +#ifndef BASISU_FORCE_DEVEL_MESSAGES + #define BASISU_FORCE_DEVEL_MESSAGES 0 +#endif + +/**** start inlining basisu_transcoder_internal.h ****/ +// basisu_transcoder_internal.h - Universal texture format transcoder library. +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// Important: If compiling with gcc, be sure strict aliasing is disabled: -fno-strict-aliasing +// +// 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. + +#ifdef _MSC_VER +#pragma warning (disable: 4127) // conditional expression is constant +#endif + +#define BASISD_LIB_VERSION 116 +#define BASISD_VERSION_STRING "01.16" + +#ifdef _DEBUG +#define BASISD_BUILD_DEBUG +#else +#define BASISD_BUILD_RELEASE +#endif + +/**** start inlining basisu.h ****/ +// basisu.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// Important: If compiling with gcc, be sure strict aliasing is disabled: -fno-strict-aliasing +// +// 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. + +#ifdef _MSC_VER + + #pragma warning (disable : 4201) + #pragma warning (disable : 4127) // warning C4127: conditional expression is constant + #pragma warning (disable : 4530) // C++ exception handler used, but unwind semantics are not enabled. + + // Slamming this off always for v1.16 because we've gotten rid of most std containers. + #ifndef BASISU_NO_ITERATOR_DEBUG_LEVEL + #define BASISU_NO_ITERATOR_DEBUG_LEVEL (1) + #endif + + #ifndef BASISU_NO_ITERATOR_DEBUG_LEVEL + //#define _HAS_ITERATOR_DEBUGGING 0 + + #if defined(_DEBUG) || defined(DEBUG) + // This is madness, but we need to disable iterator debugging in debug builds or the encoder is unsable because MSVC's iterator debugging implementation is totally broken. + #ifndef _ITERATOR_DEBUG_LEVEL + #define _ITERATOR_DEBUG_LEVEL 1 + #endif + #ifndef _SECURE_SCL + #define _SECURE_SCL 1 + #endif + #else // defined(_DEBUG) || defined(DEBUG) + #ifndef _SECURE_SCL + #define _SECURE_SCL 0 + #endif + #ifndef _ITERATOR_DEBUG_LEVEL + #define _ITERATOR_DEBUG_LEVEL 0 + #endif + #endif // defined(_DEBUG) || defined(DEBUG) + + #endif // BASISU_NO_ITERATOR_DEBUG_LEVEL + +#endif // _MSC_VER + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/**** start inlining basisu_containers.h ****/ +// basisu_containers.h +#include +#include +#include +#include +#include + +#if defined(__linux__) && !defined(ANDROID) +// Only for malloc_usable_size() in basisu_containers_impl.h +#include +#define HAS_MALLOC_USABLE_SIZE 1 +#endif + +// Set to 1 to always check vector operator[], front(), and back() even in release. +#define BASISU_VECTOR_FORCE_CHECKING 0 + +// If 1, the vector container will not query the CRT to get the size of resized memory blocks. +#define BASISU_VECTOR_DETERMINISTIC 1 + +#ifdef _MSC_VER +#define BASISU_FORCE_INLINE __forceinline +#else +#define BASISU_FORCE_INLINE inline +#endif + +namespace basisu +{ + enum { cInvalidIndex = -1 }; + + namespace helpers + { + inline bool is_power_of_2(uint32_t x) { return x && ((x & (x - 1U)) == 0U); } + inline bool is_power_of_2(uint64_t x) { return x && ((x & (x - 1U)) == 0U); } + template const T& minimum(const T& a, const T& b) { return (b < a) ? b : a; } + template const T& maximum(const T& a, const T& b) { return (a < b) ? b : a; } + + inline uint32_t floor_log2i(uint32_t v) + { + uint32_t l = 0; + while (v > 1U) + { + v >>= 1; + l++; + } + return l; + } + + inline uint32_t next_pow2(uint32_t val) + { + val--; + val |= val >> 16; + val |= val >> 8; + val |= val >> 4; + val |= val >> 2; + val |= val >> 1; + return val + 1; + } + + inline uint64_t next_pow2(uint64_t val) + { + val--; + val |= val >> 32; + val |= val >> 16; + val |= val >> 8; + val |= val >> 4; + val |= val >> 2; + val |= val >> 1; + return val + 1; + } + } // namespace helpers + + template + inline T* construct(T* p) + { + return new (static_cast(p)) T; + } + + template + inline T* construct(T* p, const U& init) + { + return new (static_cast(p)) T(init); + } + + template + inline void construct_array(T* p, size_t n) + { + T* q = p + n; + for (; p != q; ++p) + new (static_cast(p)) T; + } + + template + inline void construct_array(T* p, size_t n, const U& init) + { + T* q = p + n; + for (; p != q; ++p) + new (static_cast(p)) T(init); + } + + template + inline void destruct(T* p) + { + (void)p; + p->~T(); + } + + template inline void destruct_array(T* p, size_t n) + { + T* q = p + n; + for (; p != q; ++p) + p->~T(); + } + + template struct int_traits { enum { cMin = INT32_MIN, cMax = INT32_MAX, cSigned = true }; }; + + template<> struct int_traits { enum { cMin = INT8_MIN, cMax = INT8_MAX, cSigned = true }; }; + template<> struct int_traits { enum { cMin = INT16_MIN, cMax = INT16_MAX, cSigned = true }; }; + template<> struct int_traits { enum { cMin = INT32_MIN, cMax = INT32_MAX, cSigned = true }; }; + + template<> struct int_traits { enum { cMin = 0, cMax = UINT8_MAX, cSigned = false }; }; + template<> struct int_traits { enum { cMin = 0, cMax = UINT16_MAX, cSigned = false }; }; + template<> struct int_traits { enum { cMin = 0, cMax = UINT32_MAX, cSigned = false }; }; + + template + struct scalar_type + { + enum { cFlag = false }; + static inline void construct(T* p) { basisu::construct(p); } + static inline void construct(T* p, const T& init) { basisu::construct(p, init); } + static inline void construct_array(T* p, size_t n) { basisu::construct_array(p, n); } + static inline void destruct(T* p) { basisu::destruct(p); } + static inline void destruct_array(T* p, size_t n) { basisu::destruct_array(p, n); } + }; + + template struct scalar_type + { + enum { cFlag = true }; + static inline void construct(T** p) { memset(p, 0, sizeof(T*)); } + static inline void construct(T** p, T* init) { *p = init; } + static inline void construct_array(T** p, size_t n) { memset(p, 0, sizeof(T*) * n); } + static inline void destruct(T** p) { p; } + static inline void destruct_array(T** p, size_t n) { p, n; } + }; + +#define BASISU_DEFINE_BUILT_IN_TYPE(X) \ + template<> struct scalar_type { \ + enum { cFlag = true }; \ + static inline void construct(X* p) { memset(p, 0, sizeof(X)); } \ + static inline void construct(X* p, const X& init) { memcpy(p, &init, sizeof(X)); } \ + static inline void construct_array(X* p, size_t n) { memset(p, 0, sizeof(X) * n); } \ + static inline void destruct(X* p) { p; } \ + static inline void destruct_array(X* p, size_t n) { p, n; } }; + + BASISU_DEFINE_BUILT_IN_TYPE(bool) + BASISU_DEFINE_BUILT_IN_TYPE(char) + BASISU_DEFINE_BUILT_IN_TYPE(unsigned char) + BASISU_DEFINE_BUILT_IN_TYPE(short) + BASISU_DEFINE_BUILT_IN_TYPE(unsigned short) + BASISU_DEFINE_BUILT_IN_TYPE(int) + BASISU_DEFINE_BUILT_IN_TYPE(unsigned int) + BASISU_DEFINE_BUILT_IN_TYPE(long) + BASISU_DEFINE_BUILT_IN_TYPE(unsigned long) +#ifdef __GNUC__ + BASISU_DEFINE_BUILT_IN_TYPE(long long) + BASISU_DEFINE_BUILT_IN_TYPE(unsigned long long) +#else + BASISU_DEFINE_BUILT_IN_TYPE(__int64) + BASISU_DEFINE_BUILT_IN_TYPE(unsigned __int64) +#endif + BASISU_DEFINE_BUILT_IN_TYPE(float) + BASISU_DEFINE_BUILT_IN_TYPE(double) + BASISU_DEFINE_BUILT_IN_TYPE(long double) + +#undef BASISU_DEFINE_BUILT_IN_TYPE + + template + struct bitwise_movable { enum { cFlag = false }; }; + +#define BASISU_DEFINE_BITWISE_MOVABLE(Q) template<> struct bitwise_movable { enum { cFlag = true }; }; + + template + struct bitwise_copyable { enum { cFlag = false }; }; + +#define BASISU_DEFINE_BITWISE_COPYABLE(Q) template<> struct bitwise_copyable { enum { cFlag = true }; }; + +#define BASISU_IS_POD(T) __is_pod(T) + +#define BASISU_IS_SCALAR_TYPE(T) (scalar_type::cFlag) + +#if defined(__GNUC__) && __GNUC__<5 + #define BASISU_IS_TRIVIALLY_COPYABLE(...) __has_trivial_copy(__VA_ARGS__) +#else + #define BASISU_IS_TRIVIALLY_COPYABLE(...) std::is_trivially_copyable<__VA_ARGS__>::value +#endif + +// TODO: clean this up +#define BASISU_IS_BITWISE_COPYABLE(T) (BASISU_IS_SCALAR_TYPE(T) || BASISU_IS_POD(T) || BASISU_IS_TRIVIALLY_COPYABLE(T) || (bitwise_copyable::cFlag)) + +#define BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(T) (BASISU_IS_BITWISE_COPYABLE(T) || (bitwise_movable::cFlag)) + +#define BASISU_HAS_DESTRUCTOR(T) ((!scalar_type::cFlag) && (!__is_pod(T))) + + typedef char(&yes_t)[1]; + typedef char(&no_t)[2]; + + template yes_t class_test(int U::*); + template no_t class_test(...); + + template struct is_class + { + enum { value = (sizeof(class_test(0)) == sizeof(yes_t)) }; + }; + + template struct is_pointer + { + enum { value = false }; + }; + + template struct is_pointer + { + enum { value = true }; + }; + + struct empty_type { }; + + BASISU_DEFINE_BITWISE_COPYABLE(empty_type); + BASISU_DEFINE_BITWISE_MOVABLE(empty_type); + + template struct rel_ops + { + friend bool operator!=(const T& x, const T& y) { return (!(x == y)); } + friend bool operator> (const T& x, const T& y) { return (y < x); } + friend bool operator<=(const T& x, const T& y) { return (!(y < x)); } + friend bool operator>=(const T& x, const T& y) { return (!(x < y)); } + }; + + struct elemental_vector + { + void* m_p; + uint32_t m_size; + uint32_t m_capacity; + + typedef void (*object_mover)(void* pDst, void* pSrc, uint32_t num); + + bool increase_capacity(uint32_t min_new_capacity, bool grow_hint, uint32_t element_size, object_mover pRelocate, bool nofail); + }; + + template + class vector : public rel_ops< vector > + { + public: + typedef T* iterator; + typedef const T* const_iterator; + typedef T value_type; + typedef T& reference; + typedef const T& const_reference; + typedef T* pointer; + typedef const T* const_pointer; + + inline vector() : + m_p(NULL), + m_size(0), + m_capacity(0) + { + } + + inline vector(uint32_t n, const T& init) : + m_p(NULL), + m_size(0), + m_capacity(0) + { + increase_capacity(n, false); + construct_array(m_p, n, init); + m_size = n; + } + + inline vector(const vector& other) : + m_p(NULL), + m_size(0), + m_capacity(0) + { + increase_capacity(other.m_size, false); + + m_size = other.m_size; + + if (BASISU_IS_BITWISE_COPYABLE(T)) + memcpy(m_p, other.m_p, m_size * sizeof(T)); + else + { + T* pDst = m_p; + const T* pSrc = other.m_p; + for (uint32_t i = m_size; i > 0; i--) + construct(pDst++, *pSrc++); + } + } + + inline explicit vector(size_t size) : + m_p(NULL), + m_size(0), + m_capacity(0) + { + resize(size); + } + + inline ~vector() + { + if (m_p) + { + scalar_type::destruct_array(m_p, m_size); + free(m_p); + } + } + + inline vector& operator= (const vector& other) + { + if (this == &other) + return *this; + + if (m_capacity >= other.m_size) + resize(0); + else + { + clear(); + increase_capacity(other.m_size, false); + } + + if (BASISU_IS_BITWISE_COPYABLE(T)) + memcpy(m_p, other.m_p, other.m_size * sizeof(T)); + else + { + T* pDst = m_p; + const T* pSrc = other.m_p; + for (uint32_t i = other.m_size; i > 0; i--) + construct(pDst++, *pSrc++); + } + + m_size = other.m_size; + + return *this; + } + + BASISU_FORCE_INLINE const T* begin() const { return m_p; } + BASISU_FORCE_INLINE T* begin() { return m_p; } + + BASISU_FORCE_INLINE const T* end() const { return m_p + m_size; } + BASISU_FORCE_INLINE T* end() { return m_p + m_size; } + + BASISU_FORCE_INLINE bool empty() const { return !m_size; } + BASISU_FORCE_INLINE uint32_t size() const { return m_size; } + BASISU_FORCE_INLINE uint32_t size_in_bytes() const { return m_size * sizeof(T); } + BASISU_FORCE_INLINE uint32_t capacity() const { return m_capacity; } + + // operator[] will assert on out of range indices, but in final builds there is (and will never be) any range checking on this method. + //BASISU_FORCE_INLINE const T& operator[] (uint32_t i) const { assert(i < m_size); return m_p[i]; } + //BASISU_FORCE_INLINE T& operator[] (uint32_t i) { assert(i < m_size); return m_p[i]; } + +#if !BASISU_VECTOR_FORCE_CHECKING + BASISU_FORCE_INLINE const T& operator[] (size_t i) const { assert(i < m_size); return m_p[i]; } + BASISU_FORCE_INLINE T& operator[] (size_t i) { assert(i < m_size); return m_p[i]; } +#else + BASISU_FORCE_INLINE const T& operator[] (size_t i) const + { + if (i >= m_size) + { + fprintf(stderr, "operator[] invalid index: %u, max entries %u, type size %u\n", (uint32_t)i, m_size, (uint32_t)sizeof(T)); + abort(); + } + return m_p[i]; + } + BASISU_FORCE_INLINE T& operator[] (size_t i) + { + if (i >= m_size) + { + fprintf(stderr, "operator[] invalid index: %u, max entries %u, type size %u\n", (uint32_t)i, m_size, (uint32_t)sizeof(T)); + abort(); + } + return m_p[i]; + } +#endif + + // at() always includes range checking, even in final builds, unlike operator []. + // The first element is returned if the index is out of range. + BASISU_FORCE_INLINE const T& at(size_t i) const { assert(i < m_size); return (i >= m_size) ? m_p[0] : m_p[i]; } + BASISU_FORCE_INLINE T& at(size_t i) { assert(i < m_size); return (i >= m_size) ? m_p[0] : m_p[i]; } + +#if !BASISU_VECTOR_FORCE_CHECKING + BASISU_FORCE_INLINE const T& front() const { assert(m_size); return m_p[0]; } + BASISU_FORCE_INLINE T& front() { assert(m_size); return m_p[0]; } + + BASISU_FORCE_INLINE const T& back() const { assert(m_size); return m_p[m_size - 1]; } + BASISU_FORCE_INLINE T& back() { assert(m_size); return m_p[m_size - 1]; } +#else + BASISU_FORCE_INLINE const T& front() const + { + if (!m_size) + { + fprintf(stderr, "front: vector is empty, type size %u\n", (uint32_t)sizeof(T)); + abort(); + } + return m_p[0]; + } + BASISU_FORCE_INLINE T& front() + { + if (!m_size) + { + fprintf(stderr, "front: vector is empty, type size %u\n", (uint32_t)sizeof(T)); + abort(); + } + return m_p[0]; + } + + BASISU_FORCE_INLINE const T& back() const + { + if(!m_size) + { + fprintf(stderr, "back: vector is empty, type size %u\n", (uint32_t)sizeof(T)); + abort(); + } + return m_p[m_size - 1]; + } + BASISU_FORCE_INLINE T& back() + { + if (!m_size) + { + fprintf(stderr, "back: vector is empty, type size %u\n", (uint32_t)sizeof(T)); + abort(); + } + return m_p[m_size - 1]; + } +#endif + + BASISU_FORCE_INLINE const T* get_ptr() const { return m_p; } + BASISU_FORCE_INLINE T* get_ptr() { return m_p; } + + BASISU_FORCE_INLINE const T* data() const { return m_p; } + BASISU_FORCE_INLINE T* data() { return m_p; } + + // clear() sets the container to empty, then frees the allocated block. + inline void clear() + { + if (m_p) + { + scalar_type::destruct_array(m_p, m_size); + free(m_p); + m_p = NULL; + m_size = 0; + m_capacity = 0; + } + } + + inline void clear_no_destruction() + { + if (m_p) + { + free(m_p); + m_p = NULL; + m_size = 0; + m_capacity = 0; + } + } + + inline void reserve(size_t new_capacity_size_t) + { + if (new_capacity_size_t > UINT32_MAX) + { + assert(0); + return; + } + + uint32_t new_capacity = (uint32_t)new_capacity_size_t; + + if (new_capacity > m_capacity) + increase_capacity(new_capacity, false); + else if (new_capacity < m_capacity) + { + // Must work around the lack of a "decrease_capacity()" method. + // This case is rare enough in practice that it's probably not worth implementing an optimized in-place resize. + vector tmp; + tmp.increase_capacity(helpers::maximum(m_size, new_capacity), false); + tmp = *this; + swap(tmp); + } + } + + inline bool try_reserve(size_t new_capacity_size_t) + { + if (new_capacity_size_t > UINT32_MAX) + { + assert(0); + return false; + } + + uint32_t new_capacity = (uint32_t)new_capacity_size_t; + + if (new_capacity > m_capacity) + { + if (!increase_capacity(new_capacity, false)) + return false; + } + else if (new_capacity < m_capacity) + { + // Must work around the lack of a "decrease_capacity()" method. + // This case is rare enough in practice that it's probably not worth implementing an optimized in-place resize. + vector tmp; + tmp.increase_capacity(helpers::maximum(m_size, new_capacity), false); + tmp = *this; + swap(tmp); + } + + return true; + } + + // resize(0) sets the container to empty, but does not free the allocated block. + inline void resize(size_t new_size_size_t, bool grow_hint = false) + { + if (new_size_size_t > UINT32_MAX) + { + assert(0); + return; + } + + uint32_t new_size = (uint32_t)new_size_size_t; + + if (m_size != new_size) + { + if (new_size < m_size) + scalar_type::destruct_array(m_p + new_size, m_size - new_size); + else + { + if (new_size > m_capacity) + increase_capacity(new_size, (new_size == (m_size + 1)) || grow_hint); + + scalar_type::construct_array(m_p + m_size, new_size - m_size); + } + + m_size = new_size; + } + } + + inline bool try_resize(size_t new_size_size_t, bool grow_hint = false) + { + if (new_size_size_t > UINT32_MAX) + { + assert(0); + return false; + } + + uint32_t new_size = (uint32_t)new_size_size_t; + + if (m_size != new_size) + { + if (new_size < m_size) + scalar_type::destruct_array(m_p + new_size, m_size - new_size); + else + { + if (new_size > m_capacity) + { + if (!increase_capacity(new_size, (new_size == (m_size + 1)) || grow_hint, true)) + return false; + } + + scalar_type::construct_array(m_p + m_size, new_size - m_size); + } + + m_size = new_size; + } + + return true; + } + + // If size >= capacity/2, reset() sets the container's size to 0 but doesn't free the allocated block (because the container may be similarly loaded in the future). + // Otherwise it blows away the allocated block. See http://www.codercorner.com/blog/?p=494 + inline void reset() + { + if (m_size >= (m_capacity >> 1)) + resize(0); + else + clear(); + } + + inline T* enlarge(uint32_t i) + { + uint32_t cur_size = m_size; + resize(cur_size + i, true); + return get_ptr() + cur_size; + } + + inline T* try_enlarge(uint32_t i) + { + uint32_t cur_size = m_size; + if (!try_resize(cur_size + i, true)) + return NULL; + return get_ptr() + cur_size; + } + + BASISU_FORCE_INLINE void push_back(const T& obj) + { + assert(!m_p || (&obj < m_p) || (&obj >= (m_p + m_size))); + + if (m_size >= m_capacity) + increase_capacity(m_size + 1, true); + + scalar_type::construct(m_p + m_size, obj); + m_size++; + } + + inline bool try_push_back(const T& obj) + { + assert(!m_p || (&obj < m_p) || (&obj >= (m_p + m_size))); + + if (m_size >= m_capacity) + { + if (!increase_capacity(m_size + 1, true, true)) + return false; + } + + scalar_type::construct(m_p + m_size, obj); + m_size++; + + return true; + } + + inline void push_back_value(T obj) + { + if (m_size >= m_capacity) + increase_capacity(m_size + 1, true); + + scalar_type::construct(m_p + m_size, obj); + m_size++; + } + + inline void pop_back() + { + assert(m_size); + + if (m_size) + { + m_size--; + scalar_type::destruct(&m_p[m_size]); + } + } + + inline void insert(uint32_t index, const T* p, uint32_t n) + { + assert(index <= m_size); + if (!n) + return; + + const uint32_t orig_size = m_size; + resize(m_size + n, true); + + const uint32_t num_to_move = orig_size - index; + + if (BASISU_IS_BITWISE_COPYABLE(T)) + { + // This overwrites the destination object bits, but bitwise copyable means we don't need to worry about destruction. + memmove(m_p + index + n, m_p + index, sizeof(T) * num_to_move); + } + else + { + const T* pSrc = m_p + orig_size - 1; + T* pDst = const_cast(pSrc) + n; + + for (uint32_t i = 0; i < num_to_move; i++) + { + assert((pDst - m_p) < (int)m_size); + *pDst-- = *pSrc--; + } + } + + T* pDst = m_p + index; + + if (BASISU_IS_BITWISE_COPYABLE(T)) + { + // This copies in the new bits, overwriting the existing objects, which is OK for copyable types that don't need destruction. + memcpy(pDst, p, sizeof(T) * n); + } + else + { + for (uint32_t i = 0; i < n; i++) + { + assert((pDst - m_p) < (int)m_size); + *pDst++ = *p++; + } + } + } + + inline void insert(T* p, const T& obj) + { + int64_t ofs = p - begin(); + if ((ofs < 0) || (ofs > UINT32_MAX)) + { + assert(0); + return; + } + + insert((uint32_t)ofs, &obj, 1); + } + + // push_front() isn't going to be very fast - it's only here for usability. + inline void push_front(const T& obj) + { + insert(0, &obj, 1); + } + + vector& append(const vector& other) + { + if (other.m_size) + insert(m_size, &other[0], other.m_size); + return *this; + } + + vector& append(const T* p, uint32_t n) + { + if (n) + insert(m_size, p, n); + return *this; + } + + inline void erase(uint32_t start, uint32_t n) + { + assert((start + n) <= m_size); + if ((start + n) > m_size) + return; + + if (!n) + return; + + const uint32_t num_to_move = m_size - (start + n); + + T* pDst = m_p + start; + + const T* pSrc = m_p + start + n; + + if (BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(T)) + { + // This test is overly cautious. + if ((!BASISU_IS_BITWISE_COPYABLE(T)) || (BASISU_HAS_DESTRUCTOR(T))) + { + // Type has been marked explictly as bitwise movable, which means we can move them around but they may need to be destructed. + // First destroy the erased objects. + scalar_type::destruct_array(pDst, n); + } + + // Copy "down" the objects to preserve, filling in the empty slots. + memmove(pDst, pSrc, num_to_move * sizeof(T)); + } + else + { + // Type is not bitwise copyable or movable. + // Move them down one at a time by using the equals operator, and destroying anything that's left over at the end. + T* pDst_end = pDst + num_to_move; + while (pDst != pDst_end) + *pDst++ = *pSrc++; + + scalar_type::destruct_array(pDst_end, n); + } + + m_size -= n; + } + + inline void erase(uint32_t index) + { + erase(index, 1); + } + + inline void erase(T* p) + { + assert((p >= m_p) && (p < (m_p + m_size))); + erase(static_cast(p - m_p)); + } + + inline void erase(T *pFirst, T *pEnd) + { + assert(pFirst <= pEnd); + assert(pFirst >= begin() && pFirst <= end()); + assert(pEnd >= begin() && pEnd <= end()); + + int64_t ofs = pFirst - begin(); + if ((ofs < 0) || (ofs > UINT32_MAX)) + { + assert(0); + return; + } + + int64_t n = pEnd - pFirst; + if ((n < 0) || (n > UINT32_MAX)) + { + assert(0); + return; + } + + erase((uint32_t)ofs, (uint32_t)n); + } + + void erase_unordered(uint32_t index) + { + assert(index < m_size); + + if ((index + 1) < m_size) + (*this)[index] = back(); + + pop_back(); + } + + inline bool operator== (const vector& rhs) const + { + if (m_size != rhs.m_size) + return false; + else if (m_size) + { + if (scalar_type::cFlag) + return memcmp(m_p, rhs.m_p, sizeof(T) * m_size) == 0; + else + { + const T* pSrc = m_p; + const T* pDst = rhs.m_p; + for (uint32_t i = m_size; i; i--) + if (!(*pSrc++ == *pDst++)) + return false; + } + } + + return true; + } + + inline bool operator< (const vector& rhs) const + { + const uint32_t min_size = helpers::minimum(m_size, rhs.m_size); + + const T* pSrc = m_p; + const T* pSrc_end = m_p + min_size; + const T* pDst = rhs.m_p; + + while ((pSrc < pSrc_end) && (*pSrc == *pDst)) + { + pSrc++; + pDst++; + } + + if (pSrc < pSrc_end) + return *pSrc < *pDst; + + return m_size < rhs.m_size; + } + + inline void swap(vector& other) + { + std::swap(m_p, other.m_p); + std::swap(m_size, other.m_size); + std::swap(m_capacity, other.m_capacity); + } + + inline void sort() + { + std::sort(begin(), end()); + } + + inline void unique() + { + if (!empty()) + { + sort(); + + resize(std::unique(begin(), end()) - begin()); + } + } + + inline void reverse() + { + uint32_t j = m_size >> 1; + for (uint32_t i = 0; i < j; i++) + std::swap(m_p[i], m_p[m_size - 1 - i]); + } + + inline int find(const T& key) const + { + const T* p = m_p; + const T* p_end = m_p + m_size; + + uint32_t index = 0; + + while (p != p_end) + { + if (key == *p) + return index; + + p++; + index++; + } + + return cInvalidIndex; + } + + inline int find_sorted(const T& key) const + { + if (m_size) + { + // Uniform binary search - Knuth Algorithm 6.2.1 U, unrolled twice. + int i = ((m_size + 1) >> 1) - 1; + int m = m_size; + + for (; ; ) + { + assert(i >= 0 && i < (int)m_size); + const T* pKey_i = m_p + i; + int cmp = key < *pKey_i; +#if defined(_DEBUG) || defined(DEBUG) + int cmp2 = *pKey_i < key; + assert((cmp != cmp2) || (key == *pKey_i)); +#endif + if ((!cmp) && (key == *pKey_i)) return i; + m >>= 1; + if (!m) break; + cmp = -cmp; + i += (((m + 1) >> 1) ^ cmp) - cmp; + if (i < 0) + break; + + assert(i >= 0 && i < (int)m_size); + pKey_i = m_p + i; + cmp = key < *pKey_i; +#if defined(_DEBUG) || defined(DEBUG) + cmp2 = *pKey_i < key; + assert((cmp != cmp2) || (key == *pKey_i)); +#endif + if ((!cmp) && (key == *pKey_i)) return i; + m >>= 1; + if (!m) break; + cmp = -cmp; + i += (((m + 1) >> 1) ^ cmp) - cmp; + if (i < 0) + break; + } + } + + return cInvalidIndex; + } + + template + inline int find_sorted(const T& key, Q less_than) const + { + if (m_size) + { + // Uniform binary search - Knuth Algorithm 6.2.1 U, unrolled twice. + int i = ((m_size + 1) >> 1) - 1; + int m = m_size; + + for (; ; ) + { + assert(i >= 0 && i < (int)m_size); + const T* pKey_i = m_p + i; + int cmp = less_than(key, *pKey_i); + if ((!cmp) && (!less_than(*pKey_i, key))) return i; + m >>= 1; + if (!m) break; + cmp = -cmp; + i += (((m + 1) >> 1) ^ cmp) - cmp; + if (i < 0) + break; + + assert(i >= 0 && i < (int)m_size); + pKey_i = m_p + i; + cmp = less_than(key, *pKey_i); + if ((!cmp) && (!less_than(*pKey_i, key))) return i; + m >>= 1; + if (!m) break; + cmp = -cmp; + i += (((m + 1) >> 1) ^ cmp) - cmp; + if (i < 0) + break; + } + } + + return cInvalidIndex; + } + + inline uint32_t count_occurences(const T& key) const + { + uint32_t c = 0; + + const T* p = m_p; + const T* p_end = m_p + m_size; + + while (p != p_end) + { + if (key == *p) + c++; + + p++; + } + + return c; + } + + inline void set_all(const T& o) + { + if ((sizeof(T) == 1) && (scalar_type::cFlag)) + memset(m_p, *reinterpret_cast(&o), m_size); + else + { + T* pDst = m_p; + T* pDst_end = pDst + m_size; + while (pDst != pDst_end) + *pDst++ = o; + } + } + + // Caller assumes ownership of the heap block associated with the container. Container is cleared. + inline void* assume_ownership() + { + T* p = m_p; + m_p = NULL; + m_size = 0; + m_capacity = 0; + return p; + } + + // Caller is granting ownership of the indicated heap block. + // Block must have size constructed elements, and have enough room for capacity elements. + // The block must have been allocated using malloc(). + // Important: This method is used in Basis Universal. If you change how this container allocates memory, you'll need to change any users of this method. + inline bool grant_ownership(T* p, uint32_t size, uint32_t capacity) + { + // To to prevent the caller from obviously shooting themselves in the foot. + if (((p + capacity) > m_p) && (p < (m_p + m_capacity))) + { + // Can grant ownership of a block inside the container itself! + assert(0); + return false; + } + + if (size > capacity) + { + assert(0); + return false; + } + + if (!p) + { + if (capacity) + { + assert(0); + return false; + } + } + else if (!capacity) + { + assert(0); + return false; + } + + clear(); + m_p = p; + m_size = size; + m_capacity = capacity; + return true; + } + + private: + T* m_p; + uint32_t m_size; + uint32_t m_capacity; + + template struct is_vector { enum { cFlag = false }; }; + template struct is_vector< vector > { enum { cFlag = true }; }; + + static void object_mover(void* pDst_void, void* pSrc_void, uint32_t num) + { + T* pSrc = static_cast(pSrc_void); + T* const pSrc_end = pSrc + num; + T* pDst = static_cast(pDst_void); + + while (pSrc != pSrc_end) + { + // placement new + new (static_cast(pDst)) T(*pSrc); + pSrc->~T(); + ++pSrc; + ++pDst; + } + } + + inline bool increase_capacity(uint32_t min_new_capacity, bool grow_hint, bool nofail = false) + { + return reinterpret_cast(this)->increase_capacity( + min_new_capacity, grow_hint, sizeof(T), + (BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(T) || (is_vector::cFlag)) ? NULL : object_mover, nofail); + } + }; + + template struct bitwise_movable< vector > { enum { cFlag = true }; }; + + // Hash map + + template + struct hasher + { + inline size_t operator() (const T& key) const { return static_cast(key); } + }; + + template + struct equal_to + { + inline bool operator()(const T& a, const T& b) const { return a == b; } + }; + + // Important: The Hasher and Equals objects must be bitwise movable! + template, typename Equals = equal_to > + class hash_map + { + public: + class iterator; + class const_iterator; + + private: + friend class iterator; + friend class const_iterator; + + enum state + { + cStateInvalid = 0, + cStateValid = 1 + }; + + enum + { + cMinHashSize = 4U + }; + + public: + typedef hash_map hash_map_type; + typedef std::pair value_type; + typedef Key key_type; + typedef Value referent_type; + typedef Hasher hasher_type; + typedef Equals equals_type; + + hash_map() : + m_hash_shift(32), m_num_valid(0), m_grow_threshold(0) + { + } + + hash_map(const hash_map& other) : + m_values(other.m_values), + m_hash_shift(other.m_hash_shift), + m_hasher(other.m_hasher), + m_equals(other.m_equals), + m_num_valid(other.m_num_valid), + m_grow_threshold(other.m_grow_threshold) + { + } + + hash_map& operator= (const hash_map& other) + { + if (this == &other) + return *this; + + clear(); + + m_values = other.m_values; + m_hash_shift = other.m_hash_shift; + m_num_valid = other.m_num_valid; + m_grow_threshold = other.m_grow_threshold; + m_hasher = other.m_hasher; + m_equals = other.m_equals; + + return *this; + } + + inline ~hash_map() + { + clear(); + } + + const Equals& get_equals() const { return m_equals; } + Equals& get_equals() { return m_equals; } + + void set_equals(const Equals& equals) { m_equals = equals; } + + const Hasher& get_hasher() const { return m_hasher; } + Hasher& get_hasher() { return m_hasher; } + + void set_hasher(const Hasher& hasher) { m_hasher = hasher; } + + inline void clear() + { + if (!m_values.empty()) + { + if (BASISU_HAS_DESTRUCTOR(Key) || BASISU_HAS_DESTRUCTOR(Value)) + { + node* p = &get_node(0); + node* p_end = p + m_values.size(); + + uint32_t num_remaining = m_num_valid; + while (p != p_end) + { + if (p->state) + { + destruct_value_type(p); + num_remaining--; + if (!num_remaining) + break; + } + + p++; + } + } + + m_values.clear_no_destruction(); + + m_hash_shift = 32; + m_num_valid = 0; + m_grow_threshold = 0; + } + } + + inline void reset() + { + if (!m_num_valid) + return; + + if (BASISU_HAS_DESTRUCTOR(Key) || BASISU_HAS_DESTRUCTOR(Value)) + { + node* p = &get_node(0); + node* p_end = p + m_values.size(); + + uint32_t num_remaining = m_num_valid; + while (p != p_end) + { + if (p->state) + { + destruct_value_type(p); + p->state = cStateInvalid; + + num_remaining--; + if (!num_remaining) + break; + } + + p++; + } + } + else if (sizeof(node) <= 32) + { + memset(&m_values[0], 0, m_values.size_in_bytes()); + } + else + { + node* p = &get_node(0); + node* p_end = p + m_values.size(); + + uint32_t num_remaining = m_num_valid; + while (p != p_end) + { + if (p->state) + { + p->state = cStateInvalid; + + num_remaining--; + if (!num_remaining) + break; + } + + p++; + } + } + + m_num_valid = 0; + } + + inline uint32_t size() + { + return m_num_valid; + } + + inline uint32_t get_table_size() + { + return m_values.size(); + } + + inline bool empty() + { + return !m_num_valid; + } + + inline void reserve(uint32_t new_capacity) + { + uint64_t new_hash_size = helpers::maximum(1U, new_capacity); + + new_hash_size = new_hash_size * 2ULL; + + if (!helpers::is_power_of_2(new_hash_size)) + new_hash_size = helpers::next_pow2(new_hash_size); + + new_hash_size = helpers::maximum(cMinHashSize, new_hash_size); + + new_hash_size = helpers::minimum(0x80000000UL, new_hash_size); + + if (new_hash_size > m_values.size()) + rehash((uint32_t)new_hash_size); + } + + class iterator + { + friend class hash_map; + friend class hash_map::const_iterator; + + public: + inline iterator() : m_pTable(NULL), m_index(0) { } + inline iterator(hash_map_type& table, uint32_t index) : m_pTable(&table), m_index(index) { } + inline iterator(const iterator& other) : m_pTable(other.m_pTable), m_index(other.m_index) { } + + inline iterator& operator= (const iterator& other) + { + m_pTable = other.m_pTable; + m_index = other.m_index; + return *this; + } + + // post-increment + inline iterator operator++(int) + { + iterator result(*this); + ++*this; + return result; + } + + // pre-increment + inline iterator& operator++() + { + probe(); + return *this; + } + + inline value_type& operator*() const { return *get_cur(); } + inline value_type* operator->() const { return get_cur(); } + + inline bool operator == (const iterator& b) const { return (m_pTable == b.m_pTable) && (m_index == b.m_index); } + inline bool operator != (const iterator& b) const { return !(*this == b); } + inline bool operator == (const const_iterator& b) const { return (m_pTable == b.m_pTable) && (m_index == b.m_index); } + inline bool operator != (const const_iterator& b) const { return !(*this == b); } + + private: + hash_map_type* m_pTable; + uint32_t m_index; + + inline value_type* get_cur() const + { + assert(m_pTable && (m_index < m_pTable->m_values.size())); + assert(m_pTable->get_node_state(m_index) == cStateValid); + + return &m_pTable->get_node(m_index); + } + + inline void probe() + { + assert(m_pTable); + m_index = m_pTable->find_next(m_index); + } + }; + + class const_iterator + { + friend class hash_map; + friend class hash_map::iterator; + + public: + inline const_iterator() : m_pTable(NULL), m_index(0) { } + inline const_iterator(const hash_map_type& table, uint32_t index) : m_pTable(&table), m_index(index) { } + inline const_iterator(const iterator& other) : m_pTable(other.m_pTable), m_index(other.m_index) { } + inline const_iterator(const const_iterator& other) : m_pTable(other.m_pTable), m_index(other.m_index) { } + + inline const_iterator& operator= (const const_iterator& other) + { + m_pTable = other.m_pTable; + m_index = other.m_index; + return *this; + } + + inline const_iterator& operator= (const iterator& other) + { + m_pTable = other.m_pTable; + m_index = other.m_index; + return *this; + } + + // post-increment + inline const_iterator operator++(int) + { + const_iterator result(*this); + ++*this; + return result; + } + + // pre-increment + inline const_iterator& operator++() + { + probe(); + return *this; + } + + inline const value_type& operator*() const { return *get_cur(); } + inline const value_type* operator->() const { return get_cur(); } + + inline bool operator == (const const_iterator& b) const { return (m_pTable == b.m_pTable) && (m_index == b.m_index); } + inline bool operator != (const const_iterator& b) const { return !(*this == b); } + inline bool operator == (const iterator& b) const { return (m_pTable == b.m_pTable) && (m_index == b.m_index); } + inline bool operator != (const iterator& b) const { return !(*this == b); } + + private: + const hash_map_type* m_pTable; + uint32_t m_index; + + inline const value_type* get_cur() const + { + assert(m_pTable && (m_index < m_pTable->m_values.size())); + assert(m_pTable->get_node_state(m_index) == cStateValid); + + return &m_pTable->get_node(m_index); + } + + inline void probe() + { + assert(m_pTable); + m_index = m_pTable->find_next(m_index); + } + }; + + inline const_iterator begin() const + { + if (!m_num_valid) + return end(); + + return const_iterator(*this, find_next(UINT32_MAX)); + } + + inline const_iterator end() const + { + return const_iterator(*this, m_values.size()); + } + + inline iterator begin() + { + if (!m_num_valid) + return end(); + + return iterator(*this, find_next(UINT32_MAX)); + } + + inline iterator end() + { + return iterator(*this, m_values.size()); + } + + // insert_result.first will always point to inserted key/value (or the already existing key/value). + // insert_resutt.second will be true if a new key/value was inserted, or false if the key already existed (in which case first will point to the already existing value). + typedef std::pair insert_result; + + inline insert_result insert(const Key& k, const Value& v = Value()) + { + insert_result result; + if (!insert_no_grow(result, k, v)) + { + grow(); + + // This must succeed. + if (!insert_no_grow(result, k, v)) + { + fprintf(stderr, "insert() failed"); + abort(); + } + } + + return result; + } + + inline insert_result insert(const value_type& v) + { + return insert(v.first, v.second); + } + + inline const_iterator find(const Key& k) const + { + return const_iterator(*this, find_index(k)); + } + + inline iterator find(const Key& k) + { + return iterator(*this, find_index(k)); + } + + inline bool erase(const Key& k) + { + uint32_t i = find_index(k); + + if (i >= m_values.size()) + return false; + + node* pDst = &get_node(i); + destruct_value_type(pDst); + pDst->state = cStateInvalid; + + m_num_valid--; + + for (; ; ) + { + uint32_t r, j = i; + + node* pSrc = pDst; + + do + { + if (!i) + { + i = m_values.size() - 1; + pSrc = &get_node(i); + } + else + { + i--; + pSrc--; + } + + if (!pSrc->state) + return true; + + r = hash_key(pSrc->first); + + } while ((i <= r && r < j) || (r < j && j < i) || (j < i && i <= r)); + + move_node(pDst, pSrc); + + pDst = pSrc; + } + } + + inline void swap(hash_map_type& other) + { + m_values.swap(other.m_values); + std::swap(m_hash_shift, other.m_hash_shift); + std::swap(m_num_valid, other.m_num_valid); + std::swap(m_grow_threshold, other.m_grow_threshold); + std::swap(m_hasher, other.m_hasher); + std::swap(m_equals, other.m_equals); + } + + private: + struct node : public value_type + { + uint8_t state; + }; + + static inline void construct_value_type(value_type* pDst, const Key& k, const Value& v) + { + if (BASISU_IS_BITWISE_COPYABLE(Key)) + memcpy(&pDst->first, &k, sizeof(Key)); + else + scalar_type::construct(&pDst->first, k); + + if (BASISU_IS_BITWISE_COPYABLE(Value)) + memcpy(&pDst->second, &v, sizeof(Value)); + else + scalar_type::construct(&pDst->second, v); + } + + static inline void construct_value_type(value_type* pDst, const value_type* pSrc) + { + if ((BASISU_IS_BITWISE_COPYABLE(Key)) && (BASISU_IS_BITWISE_COPYABLE(Value))) + { + memcpy(pDst, pSrc, sizeof(value_type)); + } + else + { + if (BASISU_IS_BITWISE_COPYABLE(Key)) + memcpy(&pDst->first, &pSrc->first, sizeof(Key)); + else + scalar_type::construct(&pDst->first, pSrc->first); + + if (BASISU_IS_BITWISE_COPYABLE(Value)) + memcpy(&pDst->second, &pSrc->second, sizeof(Value)); + else + scalar_type::construct(&pDst->second, pSrc->second); + } + } + + static inline void destruct_value_type(value_type* p) + { + scalar_type::destruct(&p->first); + scalar_type::destruct(&p->second); + } + + // Moves *pSrc to *pDst efficiently. + // pDst should NOT be constructed on entry. + static inline void move_node(node* pDst, node* pSrc, bool update_src_state = true) + { + assert(!pDst->state); + + if (BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(Key) && BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(Value)) + { + memcpy(pDst, pSrc, sizeof(node)); + } + else + { + if (BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(Key)) + memcpy(&pDst->first, &pSrc->first, sizeof(Key)); + else + { + scalar_type::construct(&pDst->first, pSrc->first); + scalar_type::destruct(&pSrc->first); + } + + if (BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(Value)) + memcpy(&pDst->second, &pSrc->second, sizeof(Value)); + else + { + scalar_type::construct(&pDst->second, pSrc->second); + scalar_type::destruct(&pSrc->second); + } + + pDst->state = cStateValid; + } + + if (update_src_state) + pSrc->state = cStateInvalid; + } + + struct raw_node + { + inline raw_node() + { + node* p = reinterpret_cast(this); + p->state = cStateInvalid; + } + + inline ~raw_node() + { + node* p = reinterpret_cast(this); + if (p->state) + hash_map_type::destruct_value_type(p); + } + + inline raw_node(const raw_node& other) + { + node* pDst = reinterpret_cast(this); + const node* pSrc = reinterpret_cast(&other); + + if (pSrc->state) + { + hash_map_type::construct_value_type(pDst, pSrc); + pDst->state = cStateValid; + } + else + pDst->state = cStateInvalid; + } + + inline raw_node& operator= (const raw_node& rhs) + { + if (this == &rhs) + return *this; + + node* pDst = reinterpret_cast(this); + const node* pSrc = reinterpret_cast(&rhs); + + if (pSrc->state) + { + if (pDst->state) + { + pDst->first = pSrc->first; + pDst->second = pSrc->second; + } + else + { + hash_map_type::construct_value_type(pDst, pSrc); + pDst->state = cStateValid; + } + } + else if (pDst->state) + { + hash_map_type::destruct_value_type(pDst); + pDst->state = cStateInvalid; + } + + return *this; + } + + uint8_t m_bits[sizeof(node)]; + }; + + typedef basisu::vector node_vector; + + node_vector m_values; + uint32_t m_hash_shift; + + Hasher m_hasher; + Equals m_equals; + + uint32_t m_num_valid; + + uint32_t m_grow_threshold; + + inline uint32_t hash_key(const Key& k) const + { + assert((1U << (32U - m_hash_shift)) == m_values.size()); + + uint32_t hash = static_cast(m_hasher(k)); + + // Fibonacci hashing + hash = (2654435769U * hash) >> m_hash_shift; + + assert(hash < m_values.size()); + return hash; + } + + inline const node& get_node(uint32_t index) const + { + return *reinterpret_cast(&m_values[index]); + } + + inline node& get_node(uint32_t index) + { + return *reinterpret_cast(&m_values[index]); + } + + inline state get_node_state(uint32_t index) const + { + return static_cast(get_node(index).state); + } + + inline void set_node_state(uint32_t index, bool valid) + { + get_node(index).state = valid; + } + + inline void grow() + { + uint64_t n = m_values.size() * 3ULL; // was * 2 + + if (!helpers::is_power_of_2(n)) + n = helpers::next_pow2(n); + + if (n > 0x80000000UL) + n = 0x80000000UL; + + rehash(helpers::maximum(cMinHashSize, (uint32_t)n)); + } + + inline void rehash(uint32_t new_hash_size) + { + assert(new_hash_size >= m_num_valid); + assert(helpers::is_power_of_2(new_hash_size)); + + if ((new_hash_size < m_num_valid) || (new_hash_size == m_values.size())) + return; + + hash_map new_map; + new_map.m_values.resize(new_hash_size); + new_map.m_hash_shift = 32U - helpers::floor_log2i(new_hash_size); + assert(new_hash_size == (1U << (32U - new_map.m_hash_shift))); + new_map.m_grow_threshold = UINT_MAX; + + node* pNode = reinterpret_cast(m_values.begin()); + node* pNode_end = pNode + m_values.size(); + + while (pNode != pNode_end) + { + if (pNode->state) + { + new_map.move_into(pNode); + + if (new_map.m_num_valid == m_num_valid) + break; + } + + pNode++; + } + + new_map.m_grow_threshold = (new_hash_size + 1U) >> 1U; + + m_values.clear_no_destruction(); + m_hash_shift = 32; + + swap(new_map); + } + + inline uint32_t find_next(uint32_t index) const + { + index++; + + if (index >= m_values.size()) + return index; + + const node* pNode = &get_node(index); + + for (; ; ) + { + if (pNode->state) + break; + + if (++index >= m_values.size()) + break; + + pNode++; + } + + return index; + } + + inline uint32_t find_index(const Key& k) const + { + if (m_num_valid) + { + uint32_t index = hash_key(k); + const node* pNode = &get_node(index); + + if (pNode->state) + { + if (m_equals(pNode->first, k)) + return index; + + const uint32_t orig_index = index; + + for (; ; ) + { + if (!index) + { + index = m_values.size() - 1; + pNode = &get_node(index); + } + else + { + index--; + pNode--; + } + + if (index == orig_index) + break; + + if (!pNode->state) + break; + + if (m_equals(pNode->first, k)) + return index; + } + } + } + + return m_values.size(); + } + + inline bool insert_no_grow(insert_result& result, const Key& k, const Value& v = Value()) + { + if (!m_values.size()) + return false; + + uint32_t index = hash_key(k); + node* pNode = &get_node(index); + + if (pNode->state) + { + if (m_equals(pNode->first, k)) + { + result.first = iterator(*this, index); + result.second = false; + return true; + } + + const uint32_t orig_index = index; + + for (; ; ) + { + if (!index) + { + index = m_values.size() - 1; + pNode = &get_node(index); + } + else + { + index--; + pNode--; + } + + if (orig_index == index) + return false; + + if (!pNode->state) + break; + + if (m_equals(pNode->first, k)) + { + result.first = iterator(*this, index); + result.second = false; + return true; + } + } + } + + if (m_num_valid >= m_grow_threshold) + return false; + + construct_value_type(pNode, k, v); + + pNode->state = cStateValid; + + m_num_valid++; + assert(m_num_valid <= m_values.size()); + + result.first = iterator(*this, index); + result.second = true; + + return true; + } + + inline void move_into(node* pNode) + { + uint32_t index = hash_key(pNode->first); + node* pDst_node = &get_node(index); + + if (pDst_node->state) + { + const uint32_t orig_index = index; + + for (; ; ) + { + if (!index) + { + index = m_values.size() - 1; + pDst_node = &get_node(index); + } + else + { + index--; + pDst_node--; + } + + if (index == orig_index) + { + assert(false); + return; + } + + if (!pDst_node->state) + break; + } + } + + move_node(pDst_node, pNode, false); + + m_num_valid++; + } + }; + + template + struct bitwise_movable< hash_map > { enum { cFlag = true }; }; + +#if BASISU_HASHMAP_TEST + extern void hash_map_test(); +#endif + +} // namespace basisu + +namespace std +{ + template + inline void swap(basisu::vector& a, basisu::vector& b) + { + a.swap(b); + } + + template + inline void swap(basisu::hash_map& a, basisu::hash_map& b) + { + a.swap(b); + } + +} // namespace std +/**** ended inlining basisu_containers.h ****/ + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +#ifdef _WIN32 +#define strcasecmp _stricmp +#endif + +// Set to one to enable debug printf()'s when any errors occur, for development/debugging. Especially useful for WebGL development. +#ifndef BASISU_FORCE_DEVEL_MESSAGES +#define BASISU_FORCE_DEVEL_MESSAGES 0 +#endif + +#define BASISU_NOTE_UNUSED(x) (void)(x) +#define BASISU_ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) +#define BASISU_NO_EQUALS_OR_COPY_CONSTRUCT(x) x(const x &) = delete; x& operator= (const x &) = delete; +#define BASISU_ASSUME(x) static_assert(x, #x); +#define BASISU_OFFSETOF(s, m) offsetof(s, m) +#define BASISU_STRINGIZE(x) #x +#define BASISU_STRINGIZE2(x) BASISU_STRINGIZE(x) + +#if BASISU_FORCE_DEVEL_MESSAGES + #define BASISU_DEVEL_ERROR(...) do { basisu::debug_printf(__VA_ARGS__); } while(0) +#else + #define BASISU_DEVEL_ERROR(...) +#endif + +namespace basisu +{ + // Types/utilities + +#ifdef _WIN32 + const char BASISU_PATH_SEPERATOR_CHAR = '\\'; +#else + const char BASISU_PATH_SEPERATOR_CHAR = '/'; +#endif + + typedef basisu::vector uint8_vec; + typedef basisu::vector int16_vec; + typedef basisu::vector uint16_vec; + typedef basisu::vector uint_vec; + typedef basisu::vector uint64_vec; + typedef basisu::vector int_vec; + typedef basisu::vector bool_vec; + + void enable_debug_printf(bool enabled); + void debug_printf(const char *pFmt, ...); + + + template inline void clear_obj(T& obj) { memset(&obj, 0, sizeof(obj)); } + + template inline T0 lerp(T0 a, T0 b, T1 c) { return a + (b - a) * c; } + + template inline S maximum(S a, S b) { return (a > b) ? a : b; } + template inline S maximum(S a, S b, S c) { return maximum(maximum(a, b), c); } + template inline S maximum(S a, S b, S c, S d) { return maximum(maximum(maximum(a, b), c), d); } + + template inline S minimum(S a, S b) { return (a < b) ? a : b; } + template inline S minimum(S a, S b, S c) { return minimum(minimum(a, b), c); } + template inline S minimum(S a, S b, S c, S d) { return minimum(minimum(minimum(a, b), c), d); } + + inline float clampf(float value, float low, float high) { if (value < low) value = low; else if (value > high) value = high; return value; } + inline float saturate(float value) { return clampf(value, 0, 1.0f); } + inline uint8_t minimumub(uint8_t a, uint8_t b) { return (a < b) ? a : b; } + inline uint32_t minimumu(uint32_t a, uint32_t b) { return (a < b) ? a : b; } + inline int32_t minimumi(int32_t a, int32_t b) { return (a < b) ? a : b; } + inline float minimumf(float a, float b) { return (a < b) ? a : b; } + inline uint8_t maximumub(uint8_t a, uint8_t b) { return (a > b) ? a : b; } + inline uint32_t maximumu(uint32_t a, uint32_t b) { return (a > b) ? a : b; } + inline int32_t maximumi(int32_t a, int32_t b) { return (a > b) ? a : b; } + inline float maximumf(float a, float b) { return (a > b) ? a : b; } + inline int squarei(int i) { return i * i; } + inline float squaref(float i) { return i * i; } + template inline T square(T a) { return a * a; } + + template inline S clamp(S value, S low, S high) { return (value < low) ? low : ((value > high) ? high : value); } + + inline uint32_t iabs(int32_t i) { return (i < 0) ? static_cast(-i) : static_cast(i); } + inline uint64_t iabs64(int64_t i) { return (i < 0) ? static_cast(-i) : static_cast(i); } + + template inline void clear_vector(T &vec) { vec.erase(vec.begin(), vec.end()); } + template inline typename T::value_type *enlarge_vector(T &vec, size_t n) { size_t cs = vec.size(); vec.resize(cs + n); return &vec[cs]; } + + inline bool is_pow2(uint32_t x) { return x && ((x & (x - 1U)) == 0U); } + inline bool is_pow2(uint64_t x) { return x && ((x & (x - 1U)) == 0U); } + + template inline T open_range_check(T v, T minv, T maxv) { assert(v >= minv && v < maxv); BASISU_NOTE_UNUSED(minv); BASISU_NOTE_UNUSED(maxv); return v; } + template inline T open_range_check(T v, T maxv) { assert(v < maxv); BASISU_NOTE_UNUSED(maxv); return v; } + + inline uint32_t total_bits(uint32_t v) { uint32_t l = 0; for ( ; v > 0U; ++l) v >>= 1; return l; } + + template inline T saturate(T val) { return clamp(val, 0.0f, 1.0f); } + + template inline void append_vector(T &vec, const R *pObjs, size_t n) + { + if (n) + { + if (vec.size()) + { + assert((pObjs + n) <= vec.begin() || (pObjs >= vec.end())); + } + const size_t cur_s = vec.size(); + vec.resize(cur_s + n); + memcpy(&vec[cur_s], pObjs, sizeof(R) * n); + } + } + + template inline void append_vector(T &vec, const T &other_vec) + { + assert(&vec != &other_vec); + if (other_vec.size()) + append_vector(vec, &other_vec[0], other_vec.size()); + } + + template inline void vector_ensure_element_is_valid(T &vec, size_t idx) + { + if (idx >= vec.size()) + vec.resize(idx + 1); + } + + template inline void vector_sort(T &vec) + { + if (vec.size()) + std::sort(vec.begin(), vec.end()); + } + + template inline bool unordered_set_contains(T& set, const U&obj) + { + return set.find(obj) != set.end(); + } + + template int vector_find(const T &vec, const typename T::value_type &obj) + { + assert(vec.size() <= INT_MAX); + for (size_t i = 0; i < vec.size(); i++) + if (vec[i] == obj) + return static_cast(i); + return -1; + } + + template void vector_set_all(T &vec, const typename T::value_type &obj) + { + for (size_t i = 0; i < vec.size(); i++) + vec[i] = obj; + } + + inline uint64_t read_be64(const void *p) + { + uint64_t val = 0; + for (uint32_t i = 0; i < 8; i++) + val |= (static_cast(static_cast(p)[7 - i]) << (i * 8)); + return val; + } + + inline void write_be64(void *p, uint64_t x) + { + for (uint32_t i = 0; i < 8; i++) + static_cast(p)[7 - i] = static_cast(x >> (i * 8)); + } + + static inline uint16_t byteswap16(uint16_t x) { return static_cast((x << 8) | (x >> 8)); } + static inline uint32_t byteswap32(uint32_t x) { return ((x << 24) | ((x << 8) & 0x00FF0000) | ((x >> 8) & 0x0000FF00) | (x >> 24)); } + + inline uint32_t floor_log2i(uint32_t v) + { + uint32_t b = 0; + for (; v > 1U; ++b) + v >>= 1; + return b; + } + + inline uint32_t ceil_log2i(uint32_t v) + { + uint32_t b = floor_log2i(v); + if ((b != 32) && (v > (1U << b))) + ++b; + return b; + } + + inline int posmod(int x, int y) + { + if (x >= 0) + return (x < y) ? x : (x % y); + int m = (-x) % y; + return (m != 0) ? (y - m) : m; + } + + inline bool do_excl_ranges_overlap(int la, int ha, int lb, int hb) + { + assert(la < ha && lb < hb); + if ((ha <= lb) || (la >= hb)) return false; + return true; + } + + static inline uint32_t read_le_dword(const uint8_t *pBytes) + { + return (pBytes[3] << 24U) | (pBytes[2] << 16U) | (pBytes[1] << 8U) | (pBytes[0]); + } + + static inline void write_le_dword(uint8_t* pBytes, uint32_t val) + { + pBytes[0] = (uint8_t)val; + pBytes[1] = (uint8_t)(val >> 8U); + pBytes[2] = (uint8_t)(val >> 16U); + pBytes[3] = (uint8_t)(val >> 24U); + } + + // Always little endian 1-8 byte unsigned int + template + struct packed_uint + { + uint8_t m_bytes[NumBytes]; + + inline packed_uint() { static_assert(NumBytes <= sizeof(uint64_t), "Invalid NumBytes"); } + inline packed_uint(uint64_t v) { *this = v; } + inline packed_uint(const packed_uint& other) { *this = other; } + + inline packed_uint& operator= (uint64_t v) + { + for (uint32_t i = 0; i < NumBytes; i++) + m_bytes[i] = static_cast(v >> (i * 8)); + return *this; + } + + inline packed_uint& operator= (const packed_uint& rhs) + { + memcpy(m_bytes, rhs.m_bytes, sizeof(m_bytes)); + return *this; + } + + inline operator uint32_t() const + { + switch (NumBytes) + { + case 1: + { + return m_bytes[0]; + } + case 2: + { + return (m_bytes[1] << 8U) | m_bytes[0]; + } + case 3: + { + return (m_bytes[2] << 16U) | (m_bytes[1] << 8U) | m_bytes[0]; + } + case 4: + { + return read_le_dword(m_bytes); + } + case 5: + { + uint32_t l = read_le_dword(m_bytes); + uint32_t h = m_bytes[4]; + return static_cast(l) | (static_cast(h) << 32U); + } + case 6: + { + uint32_t l = read_le_dword(m_bytes); + uint32_t h = (m_bytes[5] << 8U) | m_bytes[4]; + return static_cast(l) | (static_cast(h) << 32U); + } + case 7: + { + uint32_t l = read_le_dword(m_bytes); + uint32_t h = (m_bytes[6] << 16U) | (m_bytes[5] << 8U) | m_bytes[4]; + return static_cast(l) | (static_cast(h) << 32U); + } + case 8: + { + uint32_t l = read_le_dword(m_bytes); + uint32_t h = read_le_dword(m_bytes + 4); + return static_cast(l) | (static_cast(h) << 32U); + } + default: + { + assert(0); + return 0; + } + } + } + }; + + enum eZero { cZero }; + enum eNoClamp { cNoClamp }; + + // Rice/Huffman entropy coding + + // This is basically Deflate-style canonical Huffman, except we allow for a lot more symbols. + enum + { + cHuffmanMaxSupportedCodeSize = 16, cHuffmanMaxSupportedInternalCodeSize = 31, + cHuffmanFastLookupBits = 10, + cHuffmanMaxSymsLog2 = 14, cHuffmanMaxSyms = 1 << cHuffmanMaxSymsLog2, + + // Small zero runs + cHuffmanSmallZeroRunSizeMin = 3, cHuffmanSmallZeroRunSizeMax = 10, cHuffmanSmallZeroRunExtraBits = 3, + + // Big zero run + cHuffmanBigZeroRunSizeMin = 11, cHuffmanBigZeroRunSizeMax = 138, cHuffmanBigZeroRunExtraBits = 7, + + // Small non-zero run + cHuffmanSmallRepeatSizeMin = 3, cHuffmanSmallRepeatSizeMax = 6, cHuffmanSmallRepeatExtraBits = 2, + + // Big non-zero run + cHuffmanBigRepeatSizeMin = 7, cHuffmanBigRepeatSizeMax = 134, cHuffmanBigRepeatExtraBits = 7, + + cHuffmanTotalCodelengthCodes = 21, cHuffmanSmallZeroRunCode = 17, cHuffmanBigZeroRunCode = 18, cHuffmanSmallRepeatCode = 19, cHuffmanBigRepeatCode = 20 + }; + + static const uint8_t g_huffman_sorted_codelength_codes[] = { cHuffmanSmallZeroRunCode, cHuffmanBigZeroRunCode, cHuffmanSmallRepeatCode, cHuffmanBigRepeatCode, 0, 8, 7, 9, 6, 0xA, 5, 0xB, 4, 0xC, 3, 0xD, 2, 0xE, 1, 0xF, 0x10 }; + const uint32_t cHuffmanTotalSortedCodelengthCodes = sizeof(g_huffman_sorted_codelength_codes) / sizeof(g_huffman_sorted_codelength_codes[0]); + + // GPU texture formats + + enum class texture_format + { + cInvalidTextureFormat = -1, + + // Block-based formats + cETC1, // ETC1 + cETC1S, // ETC1 (subset: diff colors only, no subblocks) + cETC2_RGB, // ETC2 color block (basisu doesn't support ETC2 planar/T/H modes - just basic ETC1) + cETC2_RGBA, // ETC2 EAC alpha block followed by ETC2 color block + cETC2_ALPHA, // ETC2 EAC alpha block + cBC1, // DXT1 + cBC3, // DXT5 (BC4/DXT5A block followed by a BC1/DXT1 block) + cBC4, // DXT5A + cBC5, // 3DC/DXN (two BC4/DXT5A blocks) + cBC7, + cASTC4x4, // LDR only + cPVRTC1_4_RGB, + cPVRTC1_4_RGBA, + cATC_RGB, + cATC_RGBA_INTERPOLATED_ALPHA, + cFXT1_RGB, + cPVRTC2_4_RGBA, + cETC2_R11_EAC, + cETC2_RG11_EAC, + cUASTC4x4, + cBC1_NV, + cBC1_AMD, + + // Uncompressed/raw pixels + cRGBA32, + cRGB565, + cBGR565, + cRGBA4444, + cABGR4444 + }; + + inline uint32_t get_bytes_per_block(texture_format fmt) + { + switch (fmt) + { + case texture_format::cETC1: + case texture_format::cETC1S: + case texture_format::cETC2_RGB: + case texture_format::cETC2_ALPHA: + case texture_format::cBC1: + case texture_format::cBC1_NV: + case texture_format::cBC1_AMD: + case texture_format::cBC4: + case texture_format::cPVRTC1_4_RGB: + case texture_format::cPVRTC1_4_RGBA: + case texture_format::cATC_RGB: + case texture_format::cPVRTC2_4_RGBA: + case texture_format::cETC2_R11_EAC: + return 8; + case texture_format::cRGBA32: + return sizeof(uint32_t) * 16; + default: + break; + } + return 16; + } + + inline uint32_t get_qwords_per_block(texture_format fmt) + { + return get_bytes_per_block(fmt) >> 3; + } + + inline uint32_t get_block_width(texture_format fmt) + { + BASISU_NOTE_UNUSED(fmt); + switch (fmt) + { + case texture_format::cFXT1_RGB: + return 8; + default: + break; + } + return 4; + } + + inline uint32_t get_block_height(texture_format fmt) + { + BASISU_NOTE_UNUSED(fmt); + return 4; + } + +} // namespace basisu + +/**** ended inlining basisu.h ****/ + +#define BASISD_znew (z = 36969 * (z & 65535) + (z >> 16)) + +namespace basisu +{ + extern bool g_debug_printf; +} + +namespace basist +{ + // Low-level formats directly supported by the transcoder (other supported texture formats are combinations of these low-level block formats). + // You probably don't care about these enum's unless you are going pretty low-level and calling the transcoder to decode individual slices. + enum class block_format + { + cETC1, // ETC1S RGB + cETC2_RGBA, // full ETC2 EAC RGBA8 block + cBC1, // DXT1 RGB + cBC3, // BC4 block followed by a four color BC1 block + cBC4, // DXT5A (alpha block only) + cBC5, // two BC4 blocks + cPVRTC1_4_RGB, // opaque-only PVRTC1 4bpp + cPVRTC1_4_RGBA, // PVRTC1 4bpp RGBA + cBC7, // Full BC7 block, any mode + cBC7_M5_COLOR, // RGB BC7 mode 5 color (writes an opaque mode 5 block) + cBC7_M5_ALPHA, // alpha portion of BC7 mode 5 (cBC7_M5_COLOR output data must have been written to the output buffer first to set the mode/rot fields etc.) + cETC2_EAC_A8, // alpha block of ETC2 EAC (first 8 bytes of the 16-bit ETC2 EAC RGBA format) + cASTC_4x4, // ASTC 4x4 (either color-only or color+alpha). Note that the transcoder always currently assumes sRGB is not enabled when outputting ASTC + // data. If you use a sRGB ASTC format you'll get ~1 LSB of additional error, because of the different way ASTC decoders scale 8-bit endpoints to 16-bits during unpacking. + + cATC_RGB, + cATC_RGBA_INTERPOLATED_ALPHA, + cFXT1_RGB, // Opaque-only, has oddball 8x4 pixel block size + + cPVRTC2_4_RGB, + cPVRTC2_4_RGBA, + + cETC2_EAC_R11, + cETC2_EAC_RG11, + + cIndices, // Used internally: Write 16-bit endpoint and selector indices directly to output (output block must be at least 32-bits) + + cRGB32, // Writes RGB components to 32bpp output pixels + cRGBA32, // Writes RGB255 components to 32bpp output pixels + cA32, // Writes alpha component to 32bpp output pixels + + cRGB565, + cBGR565, + + cRGBA4444_COLOR, + cRGBA4444_ALPHA, + cRGBA4444_COLOR_OPAQUE, + cRGBA4444, + + cTotalBlockFormats + }; + + const int COLOR5_PAL0_PREV_HI = 9, COLOR5_PAL0_DELTA_LO = -9, COLOR5_PAL0_DELTA_HI = 31; + const int COLOR5_PAL1_PREV_HI = 21, COLOR5_PAL1_DELTA_LO = -21, COLOR5_PAL1_DELTA_HI = 21; + const int COLOR5_PAL2_PREV_HI = 31, COLOR5_PAL2_DELTA_LO = -31, COLOR5_PAL2_DELTA_HI = 9; + const int COLOR5_PAL_MIN_DELTA_B_RUNLEN = 3, COLOR5_PAL_DELTA_5_RUNLEN_VLC_BITS = 3; + + const uint32_t ENDPOINT_PRED_TOTAL_SYMBOLS = (4 * 4 * 4 * 4) + 1; + const uint32_t ENDPOINT_PRED_REPEAT_LAST_SYMBOL = ENDPOINT_PRED_TOTAL_SYMBOLS - 1; + const uint32_t ENDPOINT_PRED_MIN_REPEAT_COUNT = 3; + const uint32_t ENDPOINT_PRED_COUNT_VLC_BITS = 4; + + const uint32_t NUM_ENDPOINT_PREDS = 3;// BASISU_ARRAY_SIZE(g_endpoint_preds); + const uint32_t CR_ENDPOINT_PRED_INDEX = NUM_ENDPOINT_PREDS - 1; + const uint32_t NO_ENDPOINT_PRED_INDEX = 3;//NUM_ENDPOINT_PREDS; + const uint32_t MAX_SELECTOR_HISTORY_BUF_SIZE = 64; + const uint32_t SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH = 3; + const uint32_t SELECTOR_HISTORY_BUF_RLE_COUNT_BITS = 6; + const uint32_t SELECTOR_HISTORY_BUF_RLE_COUNT_TOTAL = (1 << SELECTOR_HISTORY_BUF_RLE_COUNT_BITS); + + uint16_t crc16(const void *r, size_t size, uint16_t crc); + + class huffman_decoding_table + { + friend class bitwise_decoder; + + public: + huffman_decoding_table() + { + } + + void clear() + { + basisu::clear_vector(m_code_sizes); + basisu::clear_vector(m_lookup); + basisu::clear_vector(m_tree); + } + + bool init(uint32_t total_syms, const uint8_t *pCode_sizes, uint32_t fast_lookup_bits = basisu::cHuffmanFastLookupBits) + { + if (!total_syms) + { + clear(); + return true; + } + + m_code_sizes.resize(total_syms); + memcpy(&m_code_sizes[0], pCode_sizes, total_syms); + + const uint32_t huffman_fast_lookup_size = 1 << fast_lookup_bits; + + m_lookup.resize(0); + m_lookup.resize(huffman_fast_lookup_size); + + m_tree.resize(0); + m_tree.resize(total_syms * 2); + + uint32_t syms_using_codesize[basisu::cHuffmanMaxSupportedInternalCodeSize + 1]; + basisu::clear_obj(syms_using_codesize); + for (uint32_t i = 0; i < total_syms; i++) + { + if (pCode_sizes[i] > basisu::cHuffmanMaxSupportedInternalCodeSize) + return false; + syms_using_codesize[pCode_sizes[i]]++; + } + + uint32_t next_code[basisu::cHuffmanMaxSupportedInternalCodeSize + 1]; + next_code[0] = next_code[1] = 0; + + uint32_t used_syms = 0, total = 0; + for (uint32_t i = 1; i < basisu::cHuffmanMaxSupportedInternalCodeSize; i++) + { + used_syms += syms_using_codesize[i]; + next_code[i + 1] = (total = ((total + syms_using_codesize[i]) << 1)); + } + + if (((1U << basisu::cHuffmanMaxSupportedInternalCodeSize) != total) && (used_syms > 1U)) + return false; + + for (int tree_next = -1, sym_index = 0; sym_index < (int)total_syms; ++sym_index) + { + uint32_t rev_code = 0, l, cur_code, code_size = pCode_sizes[sym_index]; + if (!code_size) + continue; + + cur_code = next_code[code_size]++; + + for (l = code_size; l > 0; l--, cur_code >>= 1) + rev_code = (rev_code << 1) | (cur_code & 1); + + if (code_size <= fast_lookup_bits) + { + uint32_t k = (code_size << 16) | sym_index; + while (rev_code < huffman_fast_lookup_size) + { + if (m_lookup[rev_code] != 0) + { + // Supplied codesizes can't create a valid prefix code. + return false; + } + + m_lookup[rev_code] = k; + rev_code += (1 << code_size); + } + continue; + } + + int tree_cur; + if (0 == (tree_cur = m_lookup[rev_code & (huffman_fast_lookup_size - 1)])) + { + const uint32_t idx = rev_code & (huffman_fast_lookup_size - 1); + if (m_lookup[idx] != 0) + { + // Supplied codesizes can't create a valid prefix code. + return false; + } + + m_lookup[idx] = tree_next; + tree_cur = tree_next; + tree_next -= 2; + } + + if (tree_cur >= 0) + { + // Supplied codesizes can't create a valid prefix code. + return false; + } + + rev_code >>= (fast_lookup_bits - 1); + + for (int j = code_size; j > ((int)fast_lookup_bits + 1); j--) + { + tree_cur -= ((rev_code >>= 1) & 1); + + const int idx = -tree_cur - 1; + if (idx < 0) + return false; + else if (idx >= (int)m_tree.size()) + m_tree.resize(idx + 1); + + if (!m_tree[idx]) + { + m_tree[idx] = (int16_t)tree_next; + tree_cur = tree_next; + tree_next -= 2; + } + else + { + tree_cur = m_tree[idx]; + if (tree_cur >= 0) + { + // Supplied codesizes can't create a valid prefix code. + return false; + } + } + } + + tree_cur -= ((rev_code >>= 1) & 1); + + const int idx = -tree_cur - 1; + if (idx < 0) + return false; + else if (idx >= (int)m_tree.size()) + m_tree.resize(idx + 1); + + if (m_tree[idx] != 0) + { + // Supplied codesizes can't create a valid prefix code. + return false; + } + + m_tree[idx] = (int16_t)sym_index; + } + + return true; + } + + const basisu::uint8_vec &get_code_sizes() const { return m_code_sizes; } + const basisu::int_vec get_lookup() const { return m_lookup; } + const basisu::int16_vec get_tree() const { return m_tree; } + + bool is_valid() const { return m_code_sizes.size() > 0; } + + private: + basisu::uint8_vec m_code_sizes; + basisu::int_vec m_lookup; + basisu::int16_vec m_tree; + }; + + class bitwise_decoder + { + public: + bitwise_decoder() : + m_buf_size(0), + m_pBuf(nullptr), + m_pBuf_start(nullptr), + m_pBuf_end(nullptr), + m_bit_buf(0), + m_bit_buf_size(0) + { + } + + void clear() + { + m_buf_size = 0; + m_pBuf = nullptr; + m_pBuf_start = nullptr; + m_pBuf_end = nullptr; + m_bit_buf = 0; + m_bit_buf_size = 0; + } + + bool init(const uint8_t *pBuf, uint32_t buf_size) + { + if ((!pBuf) && (buf_size)) + return false; + + m_buf_size = buf_size; + m_pBuf = pBuf; + m_pBuf_start = pBuf; + m_pBuf_end = pBuf + buf_size; + m_bit_buf = 0; + m_bit_buf_size = 0; + return true; + } + + void stop() + { + } + + inline uint32_t peek_bits(uint32_t num_bits) + { + if (!num_bits) + return 0; + + assert(num_bits <= 25); + + while (m_bit_buf_size < num_bits) + { + uint32_t c = 0; + if (m_pBuf < m_pBuf_end) + c = *m_pBuf++; + + m_bit_buf |= (c << m_bit_buf_size); + m_bit_buf_size += 8; + assert(m_bit_buf_size <= 32); + } + + return m_bit_buf & ((1 << num_bits) - 1); + } + + void remove_bits(uint32_t num_bits) + { + assert(m_bit_buf_size >= num_bits); + + m_bit_buf >>= num_bits; + m_bit_buf_size -= num_bits; + } + + uint32_t get_bits(uint32_t num_bits) + { + if (num_bits > 25) + { + assert(num_bits <= 32); + + const uint32_t bits0 = peek_bits(25); + m_bit_buf >>= 25; + m_bit_buf_size -= 25; + num_bits -= 25; + + const uint32_t bits = peek_bits(num_bits); + m_bit_buf >>= num_bits; + m_bit_buf_size -= num_bits; + + return bits0 | (bits << 25); + } + + const uint32_t bits = peek_bits(num_bits); + + m_bit_buf >>= num_bits; + m_bit_buf_size -= num_bits; + + return bits; + } + + uint32_t decode_truncated_binary(uint32_t n) + { + assert(n >= 2); + + const uint32_t k = basisu::floor_log2i(n); + const uint32_t u = (1 << (k + 1)) - n; + + uint32_t result = get_bits(k); + + if (result >= u) + result = ((result << 1) | get_bits(1)) - u; + + return result; + } + + uint32_t decode_rice(uint32_t m) + { + assert(m); + + uint32_t q = 0; + for (;;) + { + uint32_t k = peek_bits(16); + + uint32_t l = 0; + while (k & 1) + { + l++; + k >>= 1; + } + + q += l; + + remove_bits(l); + + if (l < 16) + break; + } + + return (q << m) + (get_bits(m + 1) >> 1); + } + + inline uint32_t decode_vlc(uint32_t chunk_bits) + { + assert(chunk_bits); + + const uint32_t chunk_size = 1 << chunk_bits; + const uint32_t chunk_mask = chunk_size - 1; + + uint32_t v = 0; + uint32_t ofs = 0; + + for ( ; ; ) + { + uint32_t s = get_bits(chunk_bits + 1); + v |= ((s & chunk_mask) << ofs); + ofs += chunk_bits; + + if ((s & chunk_size) == 0) + break; + + if (ofs >= 32) + { + assert(0); + break; + } + } + + return v; + } + + inline uint32_t decode_huffman(const huffman_decoding_table &ct, int fast_lookup_bits = basisu::cHuffmanFastLookupBits) + { + assert(ct.m_code_sizes.size()); + + const uint32_t huffman_fast_lookup_size = 1 << fast_lookup_bits; + + while (m_bit_buf_size < 16) + { + uint32_t c = 0; + if (m_pBuf < m_pBuf_end) + c = *m_pBuf++; + + m_bit_buf |= (c << m_bit_buf_size); + m_bit_buf_size += 8; + assert(m_bit_buf_size <= 32); + } + + int code_len; + + int sym; + if ((sym = ct.m_lookup[m_bit_buf & (huffman_fast_lookup_size - 1)]) >= 0) + { + code_len = sym >> 16; + sym &= 0xFFFF; + } + else + { + code_len = fast_lookup_bits; + do + { + sym = ct.m_tree[~sym + ((m_bit_buf >> code_len++) & 1)]; // ~sym = -sym - 1 + } while (sym < 0); + } + + m_bit_buf >>= code_len; + m_bit_buf_size -= code_len; + + return sym; + } + + bool read_huffman_table(huffman_decoding_table &ct) + { + ct.clear(); + + const uint32_t total_used_syms = get_bits(basisu::cHuffmanMaxSymsLog2); + + if (!total_used_syms) + return true; + if (total_used_syms > basisu::cHuffmanMaxSyms) + return false; + + uint8_t code_length_code_sizes[basisu::cHuffmanTotalCodelengthCodes]; + basisu::clear_obj(code_length_code_sizes); + + const uint32_t num_codelength_codes = get_bits(5); + if ((num_codelength_codes < 1) || (num_codelength_codes > basisu::cHuffmanTotalCodelengthCodes)) + return false; + + for (uint32_t i = 0; i < num_codelength_codes; i++) + code_length_code_sizes[basisu::g_huffman_sorted_codelength_codes[i]] = static_cast(get_bits(3)); + + huffman_decoding_table code_length_table; + if (!code_length_table.init(basisu::cHuffmanTotalCodelengthCodes, code_length_code_sizes)) + return false; + + if (!code_length_table.is_valid()) + return false; + + basisu::uint8_vec code_sizes(total_used_syms); + + uint32_t cur = 0; + while (cur < total_used_syms) + { + int c = decode_huffman(code_length_table); + + if (c <= 16) + code_sizes[cur++] = static_cast(c); + else if (c == basisu::cHuffmanSmallZeroRunCode) + cur += get_bits(basisu::cHuffmanSmallZeroRunExtraBits) + basisu::cHuffmanSmallZeroRunSizeMin; + else if (c == basisu::cHuffmanBigZeroRunCode) + cur += get_bits(basisu::cHuffmanBigZeroRunExtraBits) + basisu::cHuffmanBigZeroRunSizeMin; + else + { + if (!cur) + return false; + + uint32_t l; + if (c == basisu::cHuffmanSmallRepeatCode) + l = get_bits(basisu::cHuffmanSmallRepeatExtraBits) + basisu::cHuffmanSmallRepeatSizeMin; + else + l = get_bits(basisu::cHuffmanBigRepeatExtraBits) + basisu::cHuffmanBigRepeatSizeMin; + + const uint8_t prev = code_sizes[cur - 1]; + if (prev == 0) + return false; + do + { + if (cur >= total_used_syms) + return false; + code_sizes[cur++] = prev; + } while (--l > 0); + } + } + + if (cur != total_used_syms) + return false; + + return ct.init(total_used_syms, &code_sizes[0]); + } + + private: + uint32_t m_buf_size; + const uint8_t *m_pBuf; + const uint8_t *m_pBuf_start; + const uint8_t *m_pBuf_end; + + uint32_t m_bit_buf; + uint32_t m_bit_buf_size; + }; + + inline uint32_t basisd_rand(uint32_t seed) + { + if (!seed) + seed++; + uint32_t z = seed; + BASISD_znew; + return z; + } + + // Returns random number in [0,limit). Max limit is 0xFFFF. + inline uint32_t basisd_urand(uint32_t& seed, uint32_t limit) + { + seed = basisd_rand(seed); + return (((seed ^ (seed >> 16)) & 0xFFFF) * limit) >> 16; + } + + class approx_move_to_front + { + public: + approx_move_to_front(uint32_t n) + { + init(n); + } + + void init(uint32_t n) + { + m_values.resize(n); + m_rover = n / 2; + } + + const basisu::int_vec& get_values() const { return m_values; } + basisu::int_vec& get_values() { return m_values; } + + uint32_t size() const { return (uint32_t)m_values.size(); } + + const int& operator[] (uint32_t index) const { return m_values[index]; } + int operator[] (uint32_t index) { return m_values[index]; } + + void add(int new_value) + { + m_values[m_rover++] = new_value; + if (m_rover == m_values.size()) + m_rover = (uint32_t)m_values.size() / 2; + } + + void use(uint32_t index) + { + if (index) + { + //std::swap(m_values[index / 2], m_values[index]); + int x = m_values[index / 2]; + int y = m_values[index]; + m_values[index / 2] = y; + m_values[index] = x; + } + } + + // returns -1 if not found + int find(int value) const + { + for (uint32_t i = 0; i < m_values.size(); i++) + if (m_values[i] == value) + return i; + return -1; + } + + void reset() + { + const uint32_t n = (uint32_t)m_values.size(); + + m_values.clear(); + + init(n); + } + + private: + basisu::int_vec m_values; + uint32_t m_rover; + }; + + struct decoder_etc_block; + + inline uint8_t clamp255(int32_t i) + { + return (uint8_t)((i & 0xFFFFFF00U) ? (~(i >> 31)) : i); + } + + enum eNoClamp + { + cNoClamp = 0 + }; + + struct color32 + { + union + { + struct + { + uint8_t r; + uint8_t g; + uint8_t b; + uint8_t a; + }; + + uint8_t c[4]; + + uint32_t m; + }; + + color32() { } + + color32(uint32_t vr, uint32_t vg, uint32_t vb, uint32_t va) { set(vr, vg, vb, va); } + color32(eNoClamp unused, uint32_t vr, uint32_t vg, uint32_t vb, uint32_t va) { (void)unused; set_noclamp_rgba(vr, vg, vb, va); } + + void set(uint32_t vr, uint32_t vg, uint32_t vb, uint32_t va) { c[0] = static_cast(vr); c[1] = static_cast(vg); c[2] = static_cast(vb); c[3] = static_cast(va); } + + void set_noclamp_rgb(uint32_t vr, uint32_t vg, uint32_t vb) { c[0] = static_cast(vr); c[1] = static_cast(vg); c[2] = static_cast(vb); } + void set_noclamp_rgba(uint32_t vr, uint32_t vg, uint32_t vb, uint32_t va) { set(vr, vg, vb, va); } + + void set_clamped(int vr, int vg, int vb, int va) { c[0] = clamp255(vr); c[1] = clamp255(vg); c[2] = clamp255(vb); c[3] = clamp255(va); } + + uint8_t operator[] (uint32_t idx) const { assert(idx < 4); return c[idx]; } + uint8_t &operator[] (uint32_t idx) { assert(idx < 4); return c[idx]; } + + bool operator== (const color32&rhs) const { return m == rhs.m; } + + static color32 comp_min(const color32& a, const color32& b) { return color32(cNoClamp, basisu::minimum(a[0], b[0]), basisu::minimum(a[1], b[1]), basisu::minimum(a[2], b[2]), basisu::minimum(a[3], b[3])); } + static color32 comp_max(const color32& a, const color32& b) { return color32(cNoClamp, basisu::maximum(a[0], b[0]), basisu::maximum(a[1], b[1]), basisu::maximum(a[2], b[2]), basisu::maximum(a[3], b[3])); } + }; + + struct endpoint + { + color32 m_color5; + uint8_t m_inten5; + bool operator== (const endpoint& rhs) const + { + return (m_color5.r == rhs.m_color5.r) && (m_color5.g == rhs.m_color5.g) && (m_color5.b == rhs.m_color5.b) && (m_inten5 == rhs.m_inten5); + } + bool operator!= (const endpoint& rhs) const { return !(*this == rhs); } + }; + + struct selector + { + // Plain selectors (2-bits per value) + uint8_t m_selectors[4]; + + // ETC1 selectors + uint8_t m_bytes[4]; + + uint8_t m_lo_selector, m_hi_selector; + uint8_t m_num_unique_selectors; + bool operator== (const selector& rhs) const + { + return (m_selectors[0] == rhs.m_selectors[0]) && + (m_selectors[1] == rhs.m_selectors[1]) && + (m_selectors[2] == rhs.m_selectors[2]) && + (m_selectors[3] == rhs.m_selectors[3]); + } + bool operator!= (const selector& rhs) const + { + return !(*this == rhs); + } + + void init_flags() + { + uint32_t hist[4] = { 0, 0, 0, 0 }; + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = get_selector(x, y); + hist[s]++; + } + } + + m_lo_selector = 3; + m_hi_selector = 0; + m_num_unique_selectors = 0; + + for (uint32_t i = 0; i < 4; i++) + { + if (hist[i]) + { + m_num_unique_selectors++; + if (i < m_lo_selector) m_lo_selector = static_cast(i); + if (i > m_hi_selector) m_hi_selector = static_cast(i); + } + } + } + + // Returned selector value ranges from 0-3 and is a direct index into g_etc1_inten_tables. + inline uint32_t get_selector(uint32_t x, uint32_t y) const + { + assert((x < 4) && (y < 4)); + return (m_selectors[y] >> (x * 2)) & 3; + } + + void set_selector(uint32_t x, uint32_t y, uint32_t val) + { + static const uint8_t s_selector_index_to_etc1[4] = { 3, 2, 0, 1 }; + + assert((x | y | val) < 4); + + m_selectors[y] &= ~(3 << (x * 2)); + m_selectors[y] |= (val << (x * 2)); + + const uint32_t etc1_bit_index = x * 4 + y; + + uint8_t *p = &m_bytes[3 - (etc1_bit_index >> 3)]; + + const uint32_t byte_bit_ofs = etc1_bit_index & 7; + const uint32_t mask = 1 << byte_bit_ofs; + + const uint32_t etc1_val = s_selector_index_to_etc1[val]; + + const uint32_t lsb = etc1_val & 1; + const uint32_t msb = etc1_val >> 1; + + p[0] &= ~mask; + p[0] |= (lsb << byte_bit_ofs); + + p[-2] &= ~mask; + p[-2] |= (msb << byte_bit_ofs); + } + }; + + bool basis_block_format_is_uncompressed(block_format tex_type); + +} // namespace basist + + + +/**** ended inlining basisu_transcoder_internal.h ****/ +/**** start inlining basisu_transcoder_uastc.h ****/ +// basisu_transcoder_uastc.h +/**** skipping file: basisu_transcoder_internal.h ****/ + +namespace basist +{ + struct color_quad_u8 + { + uint8_t m_c[4]; + }; + + const uint32_t TOTAL_UASTC_MODES = 19; + const uint32_t UASTC_MODE_INDEX_SOLID_COLOR = 8; + + const uint32_t TOTAL_ASTC_BC7_COMMON_PARTITIONS2 = 30; + const uint32_t TOTAL_ASTC_BC7_COMMON_PARTITIONS3 = 11; + const uint32_t TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS = 19; + + extern const uint8_t g_uastc_mode_weight_bits[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_weight_ranges[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_endpoint_ranges[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_subsets[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_planes[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_comps[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_has_etc1_bias[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_has_bc1_hint0[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_has_bc1_hint1[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_has_alpha[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_is_la[TOTAL_UASTC_MODES]; + + struct astc_bc7_common_partition2_desc + { + uint8_t m_bc7; + uint16_t m_astc; + bool m_invert; + }; + + extern const astc_bc7_common_partition2_desc g_astc_bc7_common_partitions2[TOTAL_ASTC_BC7_COMMON_PARTITIONS2]; + + struct bc73_astc2_common_partition_desc + { + uint8_t m_bc73; + uint16_t m_astc2; + uint8_t k; // 0-5 - how to modify the BC7 3-subset pattern to match the ASTC pattern (LSB=invert) + }; + + extern const bc73_astc2_common_partition_desc g_bc7_3_astc2_common_partitions[TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS]; + + struct astc_bc7_common_partition3_desc + { + uint8_t m_bc7; + uint16_t m_astc; + uint8_t m_astc_to_bc7_perm; // converts ASTC to BC7 partition using g_astc_bc7_partition_index_perm_tables[][] + }; + + extern const astc_bc7_common_partition3_desc g_astc_bc7_common_partitions3[TOTAL_ASTC_BC7_COMMON_PARTITIONS3]; + + extern const uint8_t g_astc_bc7_patterns2[TOTAL_ASTC_BC7_COMMON_PARTITIONS2][16]; + extern const uint8_t g_astc_bc7_patterns3[TOTAL_ASTC_BC7_COMMON_PARTITIONS3][16]; + extern const uint8_t g_bc7_3_astc2_patterns2[TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS][16]; + + extern const uint8_t g_astc_bc7_pattern2_anchors[TOTAL_ASTC_BC7_COMMON_PARTITIONS2][3]; + extern const uint8_t g_astc_bc7_pattern3_anchors[TOTAL_ASTC_BC7_COMMON_PARTITIONS3][3]; + extern const uint8_t g_bc7_3_astc2_patterns2_anchors[TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS][3]; + + extern const uint32_t g_uastc_mode_huff_codes[TOTAL_UASTC_MODES + 1][2]; + + extern const uint8_t g_astc_to_bc7_partition_index_perm_tables[6][3]; + extern const uint8_t g_bc7_to_astc_partition_index_perm_tables[6][3]; // inverse of g_astc_to_bc7_partition_index_perm_tables + + extern const uint8_t* s_uastc_to_bc1_weights[6]; + + uint32_t bc7_convert_partition_index_3_to_2(uint32_t p, uint32_t k); + + inline uint32_t astc_interpolate(uint32_t l, uint32_t h, uint32_t w, bool srgb) + { + if (srgb) + { + l = (l << 8) | 0x80; + h = (h << 8) | 0x80; + } + else + { + l = (l << 8) | l; + h = (h << 8) | h; + } + + uint32_t k = (l * (64 - w) + h * w + 32) >> 6; + + return k >> 8; + } + + struct astc_block_desc + { + int m_weight_range; // weight BISE range + + int m_subsets; // number of ASTC partitions + int m_partition_seed; // partition pattern seed + int m_cem; // color endpoint mode used by all subsets + + int m_ccs; // color component selector (dual plane only) + bool m_dual_plane; // true if dual plane + + // Weight and endpoint BISE values. + // Note these values are NOT linear, they must be BISE encoded. See Table 97 and Table 107. + uint8_t m_endpoints[18]; // endpoint values, in RR GG BB etc. order + uint8_t m_weights[64]; // weight index values, raster order, in P0 P1, P0 P1, etc. or P0, P0, P0, P0, etc. order + }; + + const uint32_t BC7ENC_TOTAL_ASTC_RANGES = 21; + + // See tables 81, 93, 18.13.Endpoint Unquantization + const uint32_t TOTAL_ASTC_RANGES = 21; + extern const int g_astc_bise_range_table[TOTAL_ASTC_RANGES][3]; + + struct astc_quant_bin + { + uint8_t m_unquant; // unquantized value + uint8_t m_index; // sorted index + }; + + extern astc_quant_bin g_astc_unquant[BC7ENC_TOTAL_ASTC_RANGES][256]; // [ASTC encoded endpoint index] + + int astc_get_levels(int range); + bool astc_is_valid_endpoint_range(uint32_t range); + uint32_t unquant_astc_endpoint(uint32_t packed_bits, uint32_t packed_trits, uint32_t packed_quints, uint32_t range); + uint32_t unquant_astc_endpoint_val(uint32_t packed_val, uint32_t range); + + const uint8_t* get_anchor_indices(uint32_t subsets, uint32_t mode, uint32_t common_pattern, const uint8_t*& pPartition_pattern); + + // BC7 + const uint32_t BC7ENC_BLOCK_SIZE = 16; + + struct bc7_block + { + uint64_t m_qwords[2]; + }; + + struct bc7_optimization_results + { + uint32_t m_mode; + uint32_t m_partition; + uint8_t m_selectors[16]; + uint8_t m_alpha_selectors[16]; + color_quad_u8 m_low[3]; + color_quad_u8 m_high[3]; + uint32_t m_pbits[3][2]; + uint32_t m_index_selector; + uint32_t m_rotation; + }; + + extern const uint32_t g_bc7_weights1[2]; + extern const uint32_t g_bc7_weights2[4]; + extern const uint32_t g_bc7_weights3[8]; + extern const uint32_t g_bc7_weights4[16]; + extern const uint32_t g_astc_weights4[16]; + extern const uint32_t g_astc_weights5[32]; + extern const uint32_t g_astc_weights_3levels[3]; + extern const uint8_t g_bc7_partition1[16]; + extern const uint8_t g_bc7_partition2[64 * 16]; + extern const uint8_t g_bc7_partition3[64 * 16]; + extern const uint8_t g_bc7_table_anchor_index_second_subset[64]; + extern const uint8_t g_bc7_table_anchor_index_third_subset_1[64]; + extern const uint8_t g_bc7_table_anchor_index_third_subset_2[64]; + extern const uint8_t g_bc7_num_subsets[8]; + extern const uint8_t g_bc7_partition_bits[8]; + extern const uint8_t g_bc7_color_index_bitcount[8]; + extern const uint8_t g_bc7_mode_has_p_bits[8]; + extern const uint8_t g_bc7_mode_has_shared_p_bits[8]; + extern const uint8_t g_bc7_color_precision_table[8]; + extern const int8_t g_bc7_alpha_precision_table[8]; + extern const uint8_t g_bc7_alpha_index_bitcount[8]; + + inline bool get_bc7_mode_has_seperate_alpha_selectors(int mode) { return (mode == 4) || (mode == 5); } + inline int get_bc7_color_index_size(int mode, int index_selection_bit) { return g_bc7_color_index_bitcount[mode] + index_selection_bit; } + inline int get_bc7_alpha_index_size(int mode, int index_selection_bit) { return g_bc7_alpha_index_bitcount[mode] - index_selection_bit; } + + struct endpoint_err + { + uint16_t m_error; uint8_t m_lo; uint8_t m_hi; + }; + + extern endpoint_err g_bc7_mode_6_optimal_endpoints[256][2]; // [c][pbit] + const uint32_t BC7ENC_MODE_6_OPTIMAL_INDEX = 5; + + extern endpoint_err g_bc7_mode_5_optimal_endpoints[256]; // [c] + const uint32_t BC7ENC_MODE_5_OPTIMAL_INDEX = 1; + + // Packs a BC7 block from a high-level description. Handles all BC7 modes. + void encode_bc7_block(void* pBlock, const bc7_optimization_results* pResults); + + // Packs an ASTC block + // Constraints: Always 4x4, all subset CEM's must be equal, only tested with LDR CEM's. + bool pack_astc_block(uint32_t* pDst, const astc_block_desc* pBlock, uint32_t mode); + + void pack_astc_solid_block(void* pDst_block, const color32& color); + +#ifdef _DEBUG + int astc_compute_texel_partition(int seed, int x, int y, int z, int partitioncount, bool small_block); +#endif + + struct uastc_block + { + union + { + uint8_t m_bytes[16]; + uint32_t m_dwords[4]; + +#ifndef __EMSCRIPTEN__ + uint64_t m_qwords[2]; +#endif + }; + }; + + struct unpacked_uastc_block + { + astc_block_desc m_astc; + + uint32_t m_mode; + uint32_t m_common_pattern; + + color32 m_solid_color; + + bool m_bc1_hint0; + bool m_bc1_hint1; + + bool m_etc1_flip; + bool m_etc1_diff; + uint32_t m_etc1_inten0; + uint32_t m_etc1_inten1; + + uint32_t m_etc1_bias; + + uint32_t m_etc2_hints; + + uint32_t m_etc1_selector; + uint32_t m_etc1_r, m_etc1_g, m_etc1_b; + }; + + color32 apply_etc1_bias(const color32 &block_color, uint32_t bias, uint32_t limit, uint32_t subblock); + + struct decoder_etc_block; + struct eac_block; + + bool unpack_uastc(uint32_t mode, uint32_t common_pattern, const color32& solid_color, const astc_block_desc& astc, color32* pPixels, bool srgb); + bool unpack_uastc(const unpacked_uastc_block& unpacked_blk, color32* pPixels, bool srgb); + + bool unpack_uastc(const uastc_block& blk, color32* pPixels, bool srgb); + bool unpack_uastc(const uastc_block& blk, unpacked_uastc_block& unpacked, bool undo_blue_contract, bool read_hints = true); + + bool transcode_uastc_to_astc(const uastc_block& src_blk, void* pDst); + + bool transcode_uastc_to_bc7(const unpacked_uastc_block& unpacked_src_blk, bc7_optimization_results& dst_blk); + bool transcode_uastc_to_bc7(const uastc_block& src_blk, bc7_optimization_results& dst_blk); + bool transcode_uastc_to_bc7(const uastc_block& src_blk, void* pDst); + + void transcode_uastc_to_etc1(unpacked_uastc_block& unpacked_src_blk, color32 block_pixels[4][4], void* pDst); + bool transcode_uastc_to_etc1(const uastc_block& src_blk, void* pDst); + bool transcode_uastc_to_etc1(const uastc_block& src_blk, void* pDst, uint32_t channel); + + void transcode_uastc_to_etc2_eac_a8(unpacked_uastc_block& unpacked_src_blk, color32 block_pixels[4][4], void* pDst); + bool transcode_uastc_to_etc2_rgba(const uastc_block& src_blk, void* pDst); + + // Packs 16 scalar values to BC4. Same PSNR as stb_dxt's BC4 encoder, around 13% faster. + void encode_bc4(void* pDst, const uint8_t* pPixels, uint32_t stride); + + void encode_bc1_solid_block(void* pDst, uint32_t fr, uint32_t fg, uint32_t fb); + + enum + { + cEncodeBC1HighQuality = 1, + cEncodeBC1HigherQuality = 2, + cEncodeBC1UseSelectors = 4, + }; + void encode_bc1(void* pDst, const uint8_t* pPixels, uint32_t flags); + + // Alternate PCA-free encoder, around 15% faster, same (or slightly higher) avg. PSNR + void encode_bc1_alt(void* pDst, const uint8_t* pPixels, uint32_t flags); + + void transcode_uastc_to_bc1_hint0(const unpacked_uastc_block& unpacked_src_blk, void* pDst); + void transcode_uastc_to_bc1_hint1(const unpacked_uastc_block& unpacked_src_blk, const color32 block_pixels[4][4], void* pDst, bool high_quality); + + bool transcode_uastc_to_bc1(const uastc_block& src_blk, void* pDst, bool high_quality); + bool transcode_uastc_to_bc3(const uastc_block& src_blk, void* pDst, bool high_quality); + bool transcode_uastc_to_bc4(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0); + bool transcode_uastc_to_bc5(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0, uint32_t chan1); + + bool transcode_uastc_to_etc2_eac_r11(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0); + bool transcode_uastc_to_etc2_eac_rg11(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0, uint32_t chan1); + + bool transcode_uastc_to_pvrtc1_4_rgb(const uastc_block* pSrc_blocks, void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, bool high_quality, bool from_alpha); + bool transcode_uastc_to_pvrtc1_4_rgba(const uastc_block* pSrc_blocks, void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, bool high_quality); + + // uastc_init() MUST be called before using this module. + void uastc_init(); + +} // namespace basist +/**** ended inlining basisu_transcoder_uastc.h ****/ +/**** start inlining basisu_file_headers.h ****/ +// basis_file_headers.h +// Copyright (C) 2019-2020 Binomial LLC. All Rights Reserved. +// +// 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. +/**** skipping file: basisu_transcoder_internal.h ****/ + +namespace basist +{ + // Slice desc header flags + enum basis_slice_desc_flags + { + cSliceDescFlagsHasAlpha = 1, + + // Video only: Frame doesn't refer to previous frame (no usage of conditional replenishment pred symbols) + // Currently the first frame is always an I-Frame, all subsequent frames are P-Frames. This will eventually be changed to periodic I-Frames. + cSliceDescFlagsFrameIsIFrame = 2 + }; + +#pragma pack(push) +#pragma pack(1) + struct basis_slice_desc + { + basisu::packed_uint<3> m_image_index; // The index of the source image provided to the encoder (will always appear in order from first to last, first image index is 0, no skipping allowed) + basisu::packed_uint<1> m_level_index; // The mipmap level index (mipmaps will always appear from largest to smallest) + basisu::packed_uint<1> m_flags; // enum basis_slice_desc_flags + + basisu::packed_uint<2> m_orig_width; // The original image width (may not be a multiple of 4 pixels) + basisu::packed_uint<2> m_orig_height; // The original image height (may not be a multiple of 4 pixels) + + basisu::packed_uint<2> m_num_blocks_x; // The slice's block X dimensions. Each block is 4x4 pixels. The slice's pixel resolution may or may not be a power of 2. + basisu::packed_uint<2> m_num_blocks_y; // The slice's block Y dimensions. + + basisu::packed_uint<4> m_file_ofs; // Offset from the start of the file to the start of the slice's data + basisu::packed_uint<4> m_file_size; // The size of the compressed slice data in bytes + + basisu::packed_uint<2> m_slice_data_crc16; // The CRC16 of the compressed slice data, for extra-paranoid use cases + }; + + // File header files + enum basis_header_flags + { + // Always set for ETC1S files. Not set for UASTC files. + cBASISHeaderFlagETC1S = 1, + + // Set if the texture had to be Y flipped before encoding. The actual interpretation of this (is Y up or down?) is up to the user. + cBASISHeaderFlagYFlipped = 2, + + // Set if any slices contain alpha (for ETC1S, if the odd slices contain alpha data) + cBASISHeaderFlagHasAlphaSlices = 4, + + // For ETC1S files, this will be true if the file utilizes a codebook from another .basis file. + cBASISHeaderFlagUsesGlobalCodebook = 8, + + // Set if the texture data is sRGB, otherwise it's linear. + // In reality, we have no idea if the texture data is actually linear or sRGB. This is the m_perceptual parameter passed to the compressor. + cBASISHeaderFlagSRGB = 16, + }; + + // The image type field attempts to describe how to interpret the image data in a Basis file. + // The encoder library doesn't really do anything special or different with these texture types, this is mostly here for the benefit of the user. + // We do make sure the various constraints are followed (2DArray/cubemap/videoframes/volume implies that each image has the same resolution and # of mipmap levels, etc., cubemap implies that the # of image slices is a multiple of 6) + enum basis_texture_type + { + cBASISTexType2D = 0, // An arbitrary array of 2D RGB or RGBA images with optional mipmaps, array size = # images, each image may have a different resolution and # of mipmap levels + cBASISTexType2DArray = 1, // An array of 2D RGB or RGBA images with optional mipmaps, array size = # images, each image has the same resolution and mipmap levels + cBASISTexTypeCubemapArray = 2, // an array of cubemap levels, total # of images must be divisable by 6, in X+, X-, Y+, Y-, Z+, Z- order, with optional mipmaps + cBASISTexTypeVideoFrames = 3, // An array of 2D video frames, with optional mipmaps, # frames = # images, each image has the same resolution and # of mipmap levels + cBASISTexTypeVolume = 4, // A 3D texture with optional mipmaps, Z dimension = # images, each image has the same resolution and # of mipmap levels + + cBASISTexTypeTotal + }; + + enum + { + cBASISMaxUSPerFrame = 0xFFFFFF + }; + + enum class basis_tex_format + { + cETC1S = 0, + cUASTC4x4 = 1 + }; + + struct basis_file_header + { + enum + { + cBASISSigValue = ('B' << 8) | 's', + cBASISFirstVersion = 0x10 + }; + + basisu::packed_uint<2> m_sig; // 2 byte file signature + basisu::packed_uint<2> m_ver; // Baseline file version + basisu::packed_uint<2> m_header_size; // Header size in bytes, sizeof(basis_file_header) + basisu::packed_uint<2> m_header_crc16; // CRC16 of the remaining header data + + basisu::packed_uint<4> m_data_size; // The total size of all data after the header + basisu::packed_uint<2> m_data_crc16; // The CRC16 of all data after the header + + basisu::packed_uint<3> m_total_slices; // The total # of compressed slices (1 slice per image, or 2 for alpha .basis files) + + basisu::packed_uint<3> m_total_images; // The total # of images + + basisu::packed_uint<1> m_tex_format; // enum basis_tex_format + basisu::packed_uint<2> m_flags; // enum basist::header_flags + basisu::packed_uint<1> m_tex_type; // enum basist::basis_texture_type + basisu::packed_uint<3> m_us_per_frame; // Framerate of video, in microseconds per frame + + basisu::packed_uint<4> m_reserved; // For future use + basisu::packed_uint<4> m_userdata0; // For client use + basisu::packed_uint<4> m_userdata1; // For client use + + basisu::packed_uint<2> m_total_endpoints; // The number of endpoints in the endpoint codebook + basisu::packed_uint<4> m_endpoint_cb_file_ofs; // The compressed endpoint codebook's file offset relative to the start of the file + basisu::packed_uint<3> m_endpoint_cb_file_size; // The compressed endpoint codebook's size in bytes + + basisu::packed_uint<2> m_total_selectors; // The number of selectors in the endpoint codebook + basisu::packed_uint<4> m_selector_cb_file_ofs; // The compressed selectors codebook's file offset relative to the start of the file + basisu::packed_uint<3> m_selector_cb_file_size; // The compressed selector codebook's size in bytes + + basisu::packed_uint<4> m_tables_file_ofs; // The file offset of the compressed Huffman codelength tables, for decompressing slices + basisu::packed_uint<4> m_tables_file_size; // The file size in bytes of the compressed huffman codelength tables + + basisu::packed_uint<4> m_slice_desc_file_ofs; // The file offset to the slice description array, usually follows the header + + basisu::packed_uint<4> m_extended_file_ofs; // The file offset of the "extended" header and compressed data, for future use + basisu::packed_uint<4> m_extended_file_size; // The file size in bytes of the "extended" header and compressed data, for future use + }; +#pragma pack (pop) + +} // namespace basist +/**** ended inlining basisu_file_headers.h ****/ + +namespace basist +{ + // High-level composite texture formats supported by the transcoder. + // Each of these texture formats directly correspond to OpenGL/D3D/Vulkan etc. texture formats. + // Notes: + // - If you specify a texture format that supports alpha, but the .basis file doesn't have alpha, the transcoder will automatically output a + // fully opaque (255) alpha channel. + // - The PVRTC1 texture formats only support power of 2 dimension .basis files, but this may be relaxed in a future version. + // - The PVRTC1 transcoders are real-time encoders, so don't expect the highest quality. We may add a slower encoder with improved quality. + // - These enums must be kept in sync with Javascript code that calls the transcoder. + enum class transcoder_texture_format + { + // Compressed formats + + // ETC1-2 + cTFETC1_RGB = 0, // Opaque only, returns RGB or alpha data if cDecodeFlagsTranscodeAlphaDataToOpaqueFormats flag is specified + cTFETC2_RGBA = 1, // Opaque+alpha, ETC2_EAC_A8 block followed by a ETC1 block, alpha channel will be opaque for opaque .basis files + + // BC1-5, BC7 (desktop, some mobile devices) + cTFBC1_RGB = 2, // Opaque only, no punchthrough alpha support yet, transcodes alpha slice if cDecodeFlagsTranscodeAlphaDataToOpaqueFormats flag is specified + cTFBC3_RGBA = 3, // Opaque+alpha, BC4 followed by a BC1 block, alpha channel will be opaque for opaque .basis files + cTFBC4_R = 4, // Red only, alpha slice is transcoded to output if cDecodeFlagsTranscodeAlphaDataToOpaqueFormats flag is specified + cTFBC5_RG = 5, // XY: Two BC4 blocks, X=R and Y=Alpha, .basis file should have alpha data (if not Y will be all 255's) + cTFBC7_RGBA = 6, // RGB or RGBA, mode 5 for ETC1S, modes (1,2,3,5,6,7) for UASTC + + // PVRTC1 4bpp (mobile, PowerVR devices) + cTFPVRTC1_4_RGB = 8, // Opaque only, RGB or alpha if cDecodeFlagsTranscodeAlphaDataToOpaqueFormats flag is specified, nearly lowest quality of any texture format. + cTFPVRTC1_4_RGBA = 9, // Opaque+alpha, most useful for simple opacity maps. If .basis file doesn't have alpha cTFPVRTC1_4_RGB will be used instead. Lowest quality of any supported texture format. + + // ASTC (mobile, Intel devices, hopefully all desktop GPU's one day) + cTFASTC_4x4_RGBA = 10, // Opaque+alpha, ASTC 4x4, alpha channel will be opaque for opaque .basis files. Transcoder uses RGB/RGBA/L/LA modes, void extent, and up to two ([0,47] and [0,255]) endpoint precisions. + + // ATC (mobile, Adreno devices, this is a niche format) + cTFATC_RGB = 11, // Opaque, RGB or alpha if cDecodeFlagsTranscodeAlphaDataToOpaqueFormats flag is specified. ATI ATC (GL_ATC_RGB_AMD) + cTFATC_RGBA = 12, // Opaque+alpha, alpha channel will be opaque for opaque .basis files. ATI ATC (GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD) + + // FXT1 (desktop, Intel devices, this is a super obscure format) + cTFFXT1_RGB = 17, // Opaque only, uses exclusively CC_MIXED blocks. Notable for having a 8x4 block size. GL_3DFX_texture_compression_FXT1 is supported on Intel integrated GPU's (such as HD 630). + // Punch-through alpha is relatively easy to support, but full alpha is harder. This format is only here for completeness so opaque-only is fine for now. + // See the BASISU_USE_ORIGINAL_3DFX_FXT1_ENCODING macro in basisu_transcoder_internal.h. + + cTFPVRTC2_4_RGB = 18, // Opaque-only, almost BC1 quality, much faster to transcode and supports arbitrary texture dimensions (unlike PVRTC1 RGB). + cTFPVRTC2_4_RGBA = 19, // Opaque+alpha, slower to encode than cTFPVRTC2_4_RGB. Premultiplied alpha is highly recommended, otherwise the color channel can leak into the alpha channel on transparent blocks. + + cTFETC2_EAC_R11 = 20, // R only (ETC2 EAC R11 unsigned) + cTFETC2_EAC_RG11 = 21, // RG only (ETC2 EAC RG11 unsigned), R=opaque.r, G=alpha - for tangent space normal maps + + // Uncompressed (raw pixel) formats + cTFRGBA32 = 13, // 32bpp RGBA image stored in raster (not block) order in memory, R is first byte, A is last byte. + cTFRGB565 = 14, // 16bpp RGB image stored in raster (not block) order in memory, R at bit position 11 + cTFBGR565 = 15, // 16bpp RGB image stored in raster (not block) order in memory, R at bit position 0 + cTFRGBA4444 = 16, // 16bpp RGBA image stored in raster (not block) order in memory, R at bit position 12, A at bit position 0 + + cTFTotalTextureFormats = 22, + + // Old enums for compatibility with code compiled against previous versions + cTFETC1 = cTFETC1_RGB, + cTFETC2 = cTFETC2_RGBA, + cTFBC1 = cTFBC1_RGB, + cTFBC3 = cTFBC3_RGBA, + cTFBC4 = cTFBC4_R, + cTFBC5 = cTFBC5_RG, + + // Previously, the caller had some control over which BC7 mode the transcoder output. We've simplified this due to UASTC, which supports numerous modes. + cTFBC7_M6_RGB = cTFBC7_RGBA, // Opaque only, RGB or alpha if cDecodeFlagsTranscodeAlphaDataToOpaqueFormats flag is specified. Highest quality of all the non-ETC1 formats. + cTFBC7_M5_RGBA = cTFBC7_RGBA, // Opaque+alpha, alpha channel will be opaque for opaque .basis files + cTFBC7_M6_OPAQUE_ONLY = cTFBC7_RGBA, + cTFBC7_M5 = cTFBC7_RGBA, + cTFBC7_ALT = 7, + + cTFASTC_4x4 = cTFASTC_4x4_RGBA, + + cTFATC_RGBA_INTERPOLATED_ALPHA = cTFATC_RGBA, + }; + + // For compressed texture formats, this returns the # of bytes per block. For uncompressed, it returns the # of bytes per pixel. + // NOTE: Previously, this function was called basis_get_bytes_per_block(), and it always returned 16*bytes_per_pixel for uncompressed formats which was confusing. + uint32_t basis_get_bytes_per_block_or_pixel(transcoder_texture_format fmt); + + // Returns format's name in ASCII + const char* basis_get_format_name(transcoder_texture_format fmt); + + // Returns block format name in ASCII + const char* basis_get_block_format_name(block_format fmt); + + // Returns true if the format supports an alpha channel. + bool basis_transcoder_format_has_alpha(transcoder_texture_format fmt); + + // Returns the basisu::texture_format corresponding to the specified transcoder_texture_format. + basisu::texture_format basis_get_basisu_texture_format(transcoder_texture_format fmt); + + // Returns the texture type's name in ASCII. + const char* basis_get_texture_type_name(basis_texture_type tex_type); + + // Returns true if the transcoder texture type is an uncompressed (raw pixel) format. + bool basis_transcoder_format_is_uncompressed(transcoder_texture_format tex_type); + + // Returns the # of bytes per pixel for uncompressed formats, or 0 for block texture formats. + uint32_t basis_get_uncompressed_bytes_per_pixel(transcoder_texture_format fmt); + + // Returns the block width for the specified texture format, which is currently either 4 or 8 for FXT1. + uint32_t basis_get_block_width(transcoder_texture_format tex_type); + + // Returns the block height for the specified texture format, which is currently always 4. + uint32_t basis_get_block_height(transcoder_texture_format tex_type); + + // Returns true if the specified format was enabled at compile time. + bool basis_is_format_supported(transcoder_texture_format tex_type, basis_tex_format fmt = basis_tex_format::cETC1S); + + // Validates that the output buffer is large enough to hold the entire transcoded texture. + // For uncompressed texture formats, most input parameters are in pixels, not blocks. Blocks are 4x4 pixels. + bool basis_validate_output_buffer_size(transcoder_texture_format target_format, + uint32_t output_blocks_buf_size_in_blocks_or_pixels, + uint32_t orig_width, uint32_t orig_height, + uint32_t output_row_pitch_in_blocks_or_pixels, + uint32_t output_rows_in_pixels, + uint32_t total_slice_blocks); + + class basisu_transcoder; + + // This struct holds all state used during transcoding. For video, it needs to persist between image transcodes (it holds the previous frame). + // For threading you can use one state per thread. + struct basisu_transcoder_state + { + struct block_preds + { + uint16_t m_endpoint_index; + uint8_t m_pred_bits; + }; + + basisu::vector m_block_endpoint_preds[2]; + + enum { cMaxPrevFrameLevels = 16 }; + basisu::vector m_prev_frame_indices[2][cMaxPrevFrameLevels]; // [alpha_flag][level_index] + + void clear() + { + for (uint32_t i = 0; i < 2; i++) + { + m_block_endpoint_preds[i].clear(); + + for (uint32_t j = 0; j < cMaxPrevFrameLevels; j++) + m_prev_frame_indices[i][j].clear(); + } + } + }; + + // Low-level helper class that does the actual transcoding. + class basisu_lowlevel_etc1s_transcoder + { + friend class basisu_transcoder; + + public: + basisu_lowlevel_etc1s_transcoder(); + + void set_global_codebooks(const basisu_lowlevel_etc1s_transcoder* pGlobal_codebook) { m_pGlobal_codebook = pGlobal_codebook; } + const basisu_lowlevel_etc1s_transcoder* get_global_codebooks() const { return m_pGlobal_codebook; } + + bool decode_palettes( + uint32_t num_endpoints, const uint8_t* pEndpoints_data, uint32_t endpoints_data_size, + uint32_t num_selectors, const uint8_t* pSelectors_data, uint32_t selectors_data_size); + + bool decode_tables(const uint8_t* pTable_data, uint32_t table_data_size); + + bool transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, const bool is_video, const bool is_alpha_slice, const uint32_t level_index, const uint32_t orig_width, const uint32_t orig_height, uint32_t output_row_pitch_in_blocks_or_pixels = 0, + basisu_transcoder_state* pState = nullptr, bool astc_transcode_alpha = false, void* pAlpha_blocks = nullptr, uint32_t output_rows_in_pixels = 0); + + bool transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, const basis_file_header& header, const basis_slice_desc& slice_desc, uint32_t output_row_pitch_in_blocks_or_pixels = 0, + basisu_transcoder_state* pState = nullptr, bool astc_transcode_alpha = false, void* pAlpha_blocks = nullptr, uint32_t output_rows_in_pixels = 0) + { + return transcode_slice(pDst_blocks, num_blocks_x, num_blocks_y, pImage_data, image_data_size, fmt, output_block_or_pixel_stride_in_bytes, bc1_allow_threecolor_blocks, + header.m_tex_type == cBASISTexTypeVideoFrames, (slice_desc.m_flags & cSliceDescFlagsHasAlpha) != 0, slice_desc.m_level_index, + slice_desc.m_orig_width, slice_desc.m_orig_height, output_row_pitch_in_blocks_or_pixels, pState, + astc_transcode_alpha, + pAlpha_blocks, + output_rows_in_pixels); + } + + // Container independent transcoding + bool transcode_image( + transcoder_texture_format target_format, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + const uint8_t* pCompressed_data, uint32_t compressed_data_length, + uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, + uint32_t rgb_offset, uint32_t rgb_length, uint32_t alpha_offset, uint32_t alpha_length, + uint32_t decode_flags = 0, + bool basis_file_has_alpha_slices = false, + bool is_video = false, + uint32_t output_row_pitch_in_blocks_or_pixels = 0, + basisu_transcoder_state* pState = nullptr, + uint32_t output_rows_in_pixels = 0); + + void clear() + { + m_local_endpoints.clear(); + m_local_selectors.clear(); + m_endpoint_pred_model.clear(); + m_delta_endpoint_model.clear(); + m_selector_model.clear(); + m_selector_history_buf_rle_model.clear(); + m_selector_history_buf_size = 0; + } + + // Low-level methods + typedef basisu::vector endpoint_vec; + const endpoint_vec& get_endpoints() const { return m_local_endpoints; } + + typedef basisu::vector selector_vec; + const selector_vec& get_selectors() const { return m_local_selectors; } + + private: + const basisu_lowlevel_etc1s_transcoder* m_pGlobal_codebook; + + endpoint_vec m_local_endpoints; + selector_vec m_local_selectors; + + huffman_decoding_table m_endpoint_pred_model, m_delta_endpoint_model, m_selector_model, m_selector_history_buf_rle_model; + + uint32_t m_selector_history_buf_size; + + basisu_transcoder_state m_def_state; + }; + + enum basisu_decode_flags + { + // PVRTC1: decode non-pow2 ETC1S texture level to the next larger power of 2 (not implemented yet, but we're going to support it). Ignored if the slice's dimensions are already a power of 2. + cDecodeFlagsPVRTCDecodeToNextPow2 = 2, + + // When decoding to an opaque texture format, if the basis file has alpha, decode the alpha slice instead of the color slice to the output texture format. + // This is primarily to allow decoding of textures with alpha to multiple ETC1 textures (one for color, another for alpha). + cDecodeFlagsTranscodeAlphaDataToOpaqueFormats = 4, + + // Forbid usage of BC1 3 color blocks (we don't support BC1 punchthrough alpha yet). + // This flag is used internally when decoding to BC3. + cDecodeFlagsBC1ForbidThreeColorBlocks = 8, + + // The output buffer contains alpha endpoint/selector indices. + // Used internally when decoding formats like ASTC that require both color and alpha data to be available when transcoding to the output format. + cDecodeFlagsOutputHasAlphaIndices = 16, + + cDecodeFlagsHighQuality = 32 + }; + + class basisu_lowlevel_uastc_transcoder + { + friend class basisu_transcoder; + + public: + basisu_lowlevel_uastc_transcoder(); + + bool transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, bool has_alpha, const uint32_t orig_width, const uint32_t orig_height, uint32_t output_row_pitch_in_blocks_or_pixels = 0, + basisu_transcoder_state* pState = nullptr, uint32_t output_rows_in_pixels = 0, int channel0 = -1, int channel1 = -1, uint32_t decode_flags = 0); + + bool transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, const basis_file_header& header, const basis_slice_desc& slice_desc, uint32_t output_row_pitch_in_blocks_or_pixels = 0, + basisu_transcoder_state* pState = nullptr, uint32_t output_rows_in_pixels = 0, int channel0 = -1, int channel1 = -1, uint32_t decode_flags = 0) + { + return transcode_slice(pDst_blocks, num_blocks_x, num_blocks_y, pImage_data, image_data_size, fmt, + output_block_or_pixel_stride_in_bytes, bc1_allow_threecolor_blocks, (header.m_flags & cBASISHeaderFlagHasAlphaSlices) != 0, slice_desc.m_orig_width, slice_desc.m_orig_height, output_row_pitch_in_blocks_or_pixels, + pState, output_rows_in_pixels, channel0, channel1, decode_flags); + } + + // Container independent transcoding + bool transcode_image( + transcoder_texture_format target_format, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + const uint8_t* pCompressed_data, uint32_t compressed_data_length, + uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, + uint32_t slice_offset, uint32_t slice_length, + uint32_t decode_flags = 0, + bool has_alpha = false, + bool is_video = false, + uint32_t output_row_pitch_in_blocks_or_pixels = 0, + basisu_transcoder_state* pState = nullptr, + uint32_t output_rows_in_pixels = 0, + int channel0 = -1, int channel1 = -1); + }; + + struct basisu_slice_info + { + uint32_t m_orig_width; + uint32_t m_orig_height; + + uint32_t m_width; + uint32_t m_height; + + uint32_t m_num_blocks_x; + uint32_t m_num_blocks_y; + uint32_t m_total_blocks; + + uint32_t m_compressed_size; + + uint32_t m_slice_index; // the slice index in the .basis file + uint32_t m_image_index; // the source image index originally provided to the encoder + uint32_t m_level_index; // the mipmap level within this image + + uint32_t m_unpacked_slice_crc16; + + bool m_alpha_flag; // true if the slice has alpha data + bool m_iframe_flag; // true if the slice is an I-Frame + }; + + typedef basisu::vector basisu_slice_info_vec; + + struct basisu_image_info + { + uint32_t m_image_index; + uint32_t m_total_levels; + + uint32_t m_orig_width; + uint32_t m_orig_height; + + uint32_t m_width; + uint32_t m_height; + + uint32_t m_num_blocks_x; + uint32_t m_num_blocks_y; + uint32_t m_total_blocks; + + uint32_t m_first_slice_index; + + bool m_alpha_flag; // true if the image has alpha data + bool m_iframe_flag; // true if the image is an I-Frame + }; + + struct basisu_image_level_info + { + uint32_t m_image_index; + uint32_t m_level_index; + + uint32_t m_orig_width; + uint32_t m_orig_height; + + uint32_t m_width; + uint32_t m_height; + + uint32_t m_num_blocks_x; + uint32_t m_num_blocks_y; + uint32_t m_total_blocks; + + uint32_t m_first_slice_index; + + uint32_t m_rgb_file_ofs; + uint32_t m_rgb_file_len; + uint32_t m_alpha_file_ofs; + uint32_t m_alpha_file_len; + + bool m_alpha_flag; // true if the image has alpha data + bool m_iframe_flag; // true if the image is an I-Frame + }; + + struct basisu_file_info + { + uint32_t m_version; + uint32_t m_total_header_size; + + uint32_t m_total_selectors; + // will be 0 for UASTC or if the file uses global codebooks + uint32_t m_selector_codebook_ofs; + uint32_t m_selector_codebook_size; + + uint32_t m_total_endpoints; + // will be 0 for UASTC or if the file uses global codebooks + uint32_t m_endpoint_codebook_ofs; + uint32_t m_endpoint_codebook_size; + + uint32_t m_tables_ofs; + uint32_t m_tables_size; + + uint32_t m_slices_size; + + basis_texture_type m_tex_type; + uint32_t m_us_per_frame; + + // Low-level slice information (1 slice per image for color-only basis files, 2 for alpha basis files) + basisu_slice_info_vec m_slice_info; + + uint32_t m_total_images; // total # of images + basisu::vector m_image_mipmap_levels; // the # of mipmap levels for each image + + uint32_t m_userdata0; + uint32_t m_userdata1; + + basis_tex_format m_tex_format; // ETC1S, UASTC, etc. + + bool m_y_flipped; // true if the image was Y flipped + bool m_etc1s; // true if the file is ETC1S + bool m_has_alpha_slices; // true if the texture has alpha slices (for ETC1S: even slices RGB, odd slices alpha) + }; + + // High-level transcoder class which accepts .basis file data and allows the caller to query information about the file and transcode image levels to various texture formats. + // If you're just starting out this is the class you care about. + class basisu_transcoder + { + basisu_transcoder(basisu_transcoder&); + basisu_transcoder& operator= (const basisu_transcoder&); + + public: + basisu_transcoder(); + + // Validates the .basis file. This computes a crc16 over the entire file, so it's slow. + bool validate_file_checksums(const void* pData, uint32_t data_size, bool full_validation) const; + + // Quick header validation - no crc16 checks. + bool validate_header(const void* pData, uint32_t data_size) const; + + basis_texture_type get_texture_type(const void* pData, uint32_t data_size) const; + bool get_userdata(const void* pData, uint32_t data_size, uint32_t& userdata0, uint32_t& userdata1) const; + + // Returns the total number of images in the basis file (always 1 or more). + // Note that the number of mipmap levels for each image may differ, and that images may have different resolutions. + uint32_t get_total_images(const void* pData, uint32_t data_size) const; + + basis_tex_format get_tex_format(const void* pData, uint32_t data_size) const; + + // Returns the number of mipmap levels in an image. + uint32_t get_total_image_levels(const void* pData, uint32_t data_size, uint32_t image_index) const; + + // Returns basic information about an image. Note that orig_width/orig_height may not be a multiple of 4. + bool get_image_level_desc(const void* pData, uint32_t data_size, uint32_t image_index, uint32_t level_index, uint32_t& orig_width, uint32_t& orig_height, uint32_t& total_blocks) const; + + // Returns information about the specified image. + bool get_image_info(const void* pData, uint32_t data_size, basisu_image_info& image_info, uint32_t image_index) const; + + // Returns information about the specified image's mipmap level. + bool get_image_level_info(const void* pData, uint32_t data_size, basisu_image_level_info& level_info, uint32_t image_index, uint32_t level_index) const; + + // Get a description of the basis file and low-level information about each slice. + bool get_file_info(const void* pData, uint32_t data_size, basisu_file_info& file_info) const; + + // start_transcoding() must be called before calling transcode_slice() or transcode_image_level(). + // For ETC1S files, this call decompresses the selector/endpoint codebooks, so ideally you would only call this once per .basis file (not each image/mipmap level). + bool start_transcoding(const void* pData, uint32_t data_size); + + bool stop_transcoding(); + + // Returns true if start_transcoding() has been called. + bool get_ready_to_transcode() const { return m_ready_to_transcode; } + + // transcode_image_level() decodes a single mipmap level from the .basis file to any of the supported output texture formats. + // It'll first find the slice(s) to transcode, then call transcode_slice() one or two times to decode both the color and alpha texture data (or RG texture data from two slices for BC5). + // If the .basis file doesn't have alpha slices, the output alpha blocks will be set to fully opaque (all 255's). + // Currently, to decode to PVRTC1 the basis texture's dimensions in pixels must be a power of 2, due to PVRTC1 format requirements. + // output_blocks_buf_size_in_blocks_or_pixels should be at least the image level's total_blocks (num_blocks_x * num_blocks_y), or the total number of output pixels if fmt==cTFRGBA32. + // output_row_pitch_in_blocks_or_pixels: Number of blocks or pixels per row. If 0, the transcoder uses the slice's num_blocks_x or orig_width (NOT num_blocks_x * 4). Ignored for PVRTC1 (due to texture swizzling). + // output_rows_in_pixels: Ignored unless fmt is uncompressed (cRGBA32, etc.). The total number of output rows in the output buffer. If 0, the transcoder assumes the slice's orig_height (NOT num_blocks_y * 4). + // Notes: + // - basisu_transcoder_init() must have been called first to initialize the transcoder lookup tables before calling this function. + // - This method assumes the output texture buffer is readable. In some cases to handle alpha, the transcoder will write temporary data to the output texture in + // a first pass, which will be read in a second pass. + bool transcode_image_level( + const void* pData, uint32_t data_size, + uint32_t image_index, uint32_t level_index, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + transcoder_texture_format fmt, + uint32_t decode_flags = 0, uint32_t output_row_pitch_in_blocks_or_pixels = 0, basisu_transcoder_state* pState = nullptr, uint32_t output_rows_in_pixels = 0) const; + + // Finds the basis slice corresponding to the specified image/level/alpha params, or -1 if the slice can't be found. + int find_slice(const void* pData, uint32_t data_size, uint32_t image_index, uint32_t level_index, bool alpha_data) const; + + // transcode_slice() decodes a single slice from the .basis file. It's a low-level API - most likely you want to use transcode_image_level(). + // This is a low-level API, and will be needed to be called multiple times to decode some texture formats (like BC3, BC5, or ETC2). + // output_blocks_buf_size_in_blocks_or_pixels is just used for verification to make sure the output buffer is large enough. + // output_blocks_buf_size_in_blocks_or_pixels should be at least the image level's total_blocks (num_blocks_x * num_blocks_y), or the total number of output pixels if fmt==cTFRGBA32. + // output_block_stride_in_bytes: Number of bytes between each output block. + // output_row_pitch_in_blocks_or_pixels: Number of blocks or pixels per row. If 0, the transcoder uses the slice's num_blocks_x or orig_width (NOT num_blocks_x * 4). Ignored for PVRTC1 (due to texture swizzling). + // output_rows_in_pixels: Ignored unless fmt is cRGBA32. The total number of output rows in the output buffer. If 0, the transcoder assumes the slice's orig_height (NOT num_blocks_y * 4). + // Notes: + // - basisu_transcoder_init() must have been called first to initialize the transcoder lookup tables before calling this function. + bool transcode_slice(const void* pData, uint32_t data_size, uint32_t slice_index, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + block_format fmt, uint32_t output_block_stride_in_bytes, uint32_t decode_flags = 0, uint32_t output_row_pitch_in_blocks_or_pixels = 0, basisu_transcoder_state* pState = nullptr, void* pAlpha_blocks = nullptr, + uint32_t output_rows_in_pixels = 0, int channel0 = -1, int channel1 = -1) const; + + static void write_opaque_alpha_blocks( + uint32_t num_blocks_x, uint32_t num_blocks_y, + void* pOutput_blocks, block_format fmt, + uint32_t block_stride_in_bytes, uint32_t output_row_pitch_in_blocks_or_pixels); + + void set_global_codebooks(const basisu_lowlevel_etc1s_transcoder* pGlobal_codebook) { m_lowlevel_etc1s_decoder.set_global_codebooks(pGlobal_codebook); } + const basisu_lowlevel_etc1s_transcoder* get_global_codebooks() const { return m_lowlevel_etc1s_decoder.get_global_codebooks(); } + + const basisu_lowlevel_etc1s_transcoder& get_lowlevel_etc1s_decoder() const { return m_lowlevel_etc1s_decoder; } + basisu_lowlevel_etc1s_transcoder& get_lowlevel_etc1s_decoder() { return m_lowlevel_etc1s_decoder; } + + const basisu_lowlevel_uastc_transcoder& get_lowlevel_uastc_decoder() const { return m_lowlevel_uastc_decoder; } + basisu_lowlevel_uastc_transcoder& get_lowlevel_uastc_decoder() { return m_lowlevel_uastc_decoder; } + + private: + mutable basisu_lowlevel_etc1s_transcoder m_lowlevel_etc1s_decoder; + mutable basisu_lowlevel_uastc_transcoder m_lowlevel_uastc_decoder; + + bool m_ready_to_transcode; + + int find_first_slice_index(const void* pData, uint32_t data_size, uint32_t image_index, uint32_t level_index) const; + + bool validate_header_quick(const void* pData, uint32_t data_size) const; + }; + + // basisu_transcoder_init() MUST be called before a .basis file can be transcoded. + void basisu_transcoder_init(); + + enum debug_flags_t + { + cDebugFlagVisCRs = 1, + cDebugFlagVisBC1Sels = 2, + cDebugFlagVisBC1Endpoints = 4 + }; + uint32_t get_debug_flags(); + void set_debug_flags(uint32_t f); + + // ------------------------------------------------------------------------------------------------------ + // Optional .KTX2 file format support + // KTX2 reading optionally requires miniz or Zstd decompressors for supercompressed UASTC files. + // ------------------------------------------------------------------------------------------------------ +#if BASISD_SUPPORT_KTX2 +#pragma pack(push) +#pragma pack(1) + struct ktx2_header + { + uint8_t m_identifier[12]; + basisu::packed_uint<4> m_vk_format; + basisu::packed_uint<4> m_type_size; + basisu::packed_uint<4> m_pixel_width; + basisu::packed_uint<4> m_pixel_height; + basisu::packed_uint<4> m_pixel_depth; + basisu::packed_uint<4> m_layer_count; + basisu::packed_uint<4> m_face_count; + basisu::packed_uint<4> m_level_count; + basisu::packed_uint<4> m_supercompression_scheme; + basisu::packed_uint<4> m_dfd_byte_offset; + basisu::packed_uint<4> m_dfd_byte_length; + basisu::packed_uint<4> m_kvd_byte_offset; + basisu::packed_uint<4> m_kvd_byte_length; + basisu::packed_uint<8> m_sgd_byte_offset; + basisu::packed_uint<8> m_sgd_byte_length; + }; + + struct ktx2_level_index + { + basisu::packed_uint<8> m_byte_offset; + basisu::packed_uint<8> m_byte_length; + basisu::packed_uint<8> m_uncompressed_byte_length; + }; + + struct ktx2_etc1s_global_data_header + { + basisu::packed_uint<2> m_endpoint_count; + basisu::packed_uint<2> m_selector_count; + basisu::packed_uint<4> m_endpoints_byte_length; + basisu::packed_uint<4> m_selectors_byte_length; + basisu::packed_uint<4> m_tables_byte_length; + basisu::packed_uint<4> m_extended_byte_length; + }; + + struct ktx2_etc1s_image_desc + { + basisu::packed_uint<4> m_image_flags; + basisu::packed_uint<4> m_rgb_slice_byte_offset; + basisu::packed_uint<4> m_rgb_slice_byte_length; + basisu::packed_uint<4> m_alpha_slice_byte_offset; + basisu::packed_uint<4> m_alpha_slice_byte_length; + }; + + struct ktx2_animdata + { + basisu::packed_uint<4> m_duration; + basisu::packed_uint<4> m_timescale; + basisu::packed_uint<4> m_loopcount; + }; +#pragma pack(pop) + + const uint32_t KTX2_VK_FORMAT_UNDEFINED = 0; + const uint32_t KTX2_KDF_DF_MODEL_UASTC = 166; + const uint32_t KTX2_KDF_DF_MODEL_ETC1S = 163; + const uint32_t KTX2_IMAGE_IS_P_FRAME = 2; + const uint32_t KTX2_UASTC_BLOCK_SIZE = 16; + const uint32_t KTX2_MAX_SUPPORTED_LEVEL_COUNT = 16; // this is an implementation specific constraint and can be increased + + // The KTX2 transfer functions supported by KTX2 + const uint32_t KTX2_KHR_DF_TRANSFER_LINEAR = 1; + const uint32_t KTX2_KHR_DF_TRANSFER_SRGB = 2; + + enum ktx2_supercompression + { + KTX2_SS_NONE = 0, + KTX2_SS_BASISLZ = 1, + KTX2_SS_ZSTANDARD = 2 + }; + + extern const uint8_t g_ktx2_file_identifier[12]; + + enum ktx2_df_channel_id + { + KTX2_DF_CHANNEL_ETC1S_RGB = 0U, + KTX2_DF_CHANNEL_ETC1S_RRR = 3U, + KTX2_DF_CHANNEL_ETC1S_GGG = 4U, + KTX2_DF_CHANNEL_ETC1S_AAA = 15U, + + KTX2_DF_CHANNEL_UASTC_DATA = 0U, + KTX2_DF_CHANNEL_UASTC_RGB = 0U, + KTX2_DF_CHANNEL_UASTC_RGBA = 3U, + KTX2_DF_CHANNEL_UASTC_RRR = 4U, + KTX2_DF_CHANNEL_UASTC_RRRG = 5U, + KTX2_DF_CHANNEL_UASTC_RG = 6U, + }; + + inline const char* ktx2_get_etc1s_df_channel_id_str(ktx2_df_channel_id id) + { + switch (id) + { + case KTX2_DF_CHANNEL_ETC1S_RGB: return "RGB"; + case KTX2_DF_CHANNEL_ETC1S_RRR: return "RRR"; + case KTX2_DF_CHANNEL_ETC1S_GGG: return "GGG"; + case KTX2_DF_CHANNEL_ETC1S_AAA: return "AAA"; + default: break; + } + return "?"; + } + + inline const char* ktx2_get_uastc_df_channel_id_str(ktx2_df_channel_id id) + { + switch (id) + { + case KTX2_DF_CHANNEL_UASTC_RGB: return "RGB"; + case KTX2_DF_CHANNEL_UASTC_RGBA: return "RGBA"; + case KTX2_DF_CHANNEL_UASTC_RRR: return "RRR"; + case KTX2_DF_CHANNEL_UASTC_RRRG: return "RRRG"; + case KTX2_DF_CHANNEL_UASTC_RG: return "RG"; + default: break; + } + return "?"; + } + + enum ktx2_df_color_primaries + { + KTX2_DF_PRIMARIES_UNSPECIFIED = 0, + KTX2_DF_PRIMARIES_BT709 = 1, + KTX2_DF_PRIMARIES_SRGB = 1, + KTX2_DF_PRIMARIES_BT601_EBU = 2, + KTX2_DF_PRIMARIES_BT601_SMPTE = 3, + KTX2_DF_PRIMARIES_BT2020 = 4, + KTX2_DF_PRIMARIES_CIEXYZ = 5, + KTX2_DF_PRIMARIES_ACES = 6, + KTX2_DF_PRIMARIES_ACESCC = 7, + KTX2_DF_PRIMARIES_NTSC1953 = 8, + KTX2_DF_PRIMARIES_PAL525 = 9, + KTX2_DF_PRIMARIES_DISPLAYP3 = 10, + KTX2_DF_PRIMARIES_ADOBERGB = 11 + }; + + inline const char* ktx2_get_df_color_primaries_str(ktx2_df_color_primaries p) + { + switch (p) + { + case KTX2_DF_PRIMARIES_UNSPECIFIED: return "UNSPECIFIED"; + case KTX2_DF_PRIMARIES_BT709: return "BT709"; + case KTX2_DF_PRIMARIES_BT601_EBU: return "EBU"; + case KTX2_DF_PRIMARIES_BT601_SMPTE: return "SMPTE"; + case KTX2_DF_PRIMARIES_BT2020: return "BT2020"; + case KTX2_DF_PRIMARIES_CIEXYZ: return "CIEXYZ"; + case KTX2_DF_PRIMARIES_ACES: return "ACES"; + case KTX2_DF_PRIMARIES_ACESCC: return "ACESCC"; + case KTX2_DF_PRIMARIES_NTSC1953: return "NTSC1953"; + case KTX2_DF_PRIMARIES_PAL525: return "PAL525"; + case KTX2_DF_PRIMARIES_DISPLAYP3: return "DISPLAYP3"; + case KTX2_DF_PRIMARIES_ADOBERGB: return "ADOBERGB"; + default: break; + } + return "?"; + } + + // Information about a single 2D texture "image" in a KTX2 file. + struct ktx2_image_level_info + { + // The mipmap level index (0=largest), texture array layer index, and cubemap face index of the image. + uint32_t m_level_index; + uint32_t m_layer_index; + uint32_t m_face_index; + + // The image's actual (or the original source image's) width/height in pixels, which may not be divisible by 4 pixels. + uint32_t m_orig_width; + uint32_t m_orig_height; + + // The image's physical width/height, which will always be divisible by 4 pixels. + uint32_t m_width; + uint32_t m_height; + + // The texture's dimensions in 4x4 texel blocks. + uint32_t m_num_blocks_x; + uint32_t m_num_blocks_y; + + // The total number of blocks + uint32_t m_total_blocks; + + // true if the image has alpha data + bool m_alpha_flag; + + // true if the image is an I-Frame. Currently, for ETC1S textures, the first frame will always be an I-Frame, and subsequent frames will always be P-Frames. + bool m_iframe_flag; + }; + + // Thread-specific ETC1S/supercompressed UASTC transcoder state. (If you're not doing multithreading transcoding you can ignore this.) + struct ktx2_transcoder_state + { + basist::basisu_transcoder_state m_transcoder_state; + basisu::uint8_vec m_level_uncomp_data; + int m_uncomp_data_level_index; + + void clear() + { + m_transcoder_state.clear(); + m_level_uncomp_data.clear(); + m_uncomp_data_level_index = -1; + } + }; + + // This class is quite similar to basisu_transcoder. It treats KTX2 files as a simple container for ETC1S/UASTC texture data. + // It does not support 1D or 3D textures. + // It only supports 2D and cubemap textures, with or without mipmaps, texture arrays of 2D/cubemap textures, and texture video files. + // It only supports raw non-supercompressed UASTC, ETC1S, UASTC+Zstd, or UASTC+zlib compressed files. + // DFD (Data Format Descriptor) parsing is purposely as simple as possible. + // If you need to know how to interpret the texture channels you'll need to parse the DFD yourself after calling get_dfd(). + class ktx2_transcoder + { + public: + ktx2_transcoder(); + + // Frees all allocations, resets object. + void clear(); + + // init() parses the KTX2 header, level index array, DFD, and key values, but nothing else. + // Importantly, it does not parse or decompress the ETC1S global supercompressed data, so some things (like which frames are I/P-Frames) won't be available until start_transcoding() is called. + // This method holds a pointer to the file data until clear() is called. + bool init(const void* pData, uint32_t data_size); + + // Returns the data/size passed to init(). + const uint8_t* get_data() const { return m_pData; } + uint32_t get_data_size() const { return m_data_size; } + + // Returns the KTX2 header. Valid after init(). + const ktx2_header& get_header() const { return m_header; } + + // Returns the KTX2 level index array. There will be one entry for each mipmap level. Valid after init(). + const basisu::vector& get_level_index() const { return m_levels; } + + // Returns the texture's width in texels. Always non-zero, might not be divisible by 4. Valid after init(). + uint32_t get_width() const { return m_header.m_pixel_width; } + + // Returns the texture's height in texels. Always non-zero, might not be divisible by 4. Valid after init(). + uint32_t get_height() const { return m_header.m_pixel_height; } + + // Returns the texture's number of mipmap levels. Always returns 1 or higher. Valid after init(). + uint32_t get_levels() const { return m_header.m_level_count; } + + // Returns the number of faces. Returns 1 for 2D textures and or 6 for cubemaps. Valid after init(). + uint32_t get_faces() const { return m_header.m_face_count; } + + // Returns 0 or the number of layers in the texture array or texture video. Valid after init(). + uint32_t get_layers() const { return m_header.m_layer_count; } + + // Returns cETC1S or cUASTC4x4. Valid after init(). + basist::basis_tex_format get_format() const { return m_format; } + + bool is_etc1s() const { return get_format() == basist::basis_tex_format::cETC1S; } + + bool is_uastc() const { return get_format() == basist::basis_tex_format::cUASTC4x4; } + + // Returns true if the ETC1S file has two planes (typically RGBA, or RRRG), or true if the UASTC file has alpha data. Valid after init(). + uint32_t get_has_alpha() const { return m_has_alpha; } + + // Returns the entire Data Format Descriptor (DFD) from the KTX2 file. Valid after init(). + // See https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html#_the_khronos_data_format_descriptor_overview + const basisu::uint8_vec& get_dfd() const { return m_dfd; } + + // Some basic DFD accessors. Valid after init(). + uint32_t get_dfd_color_model() const { return m_dfd_color_model; } + + // Returns the DFD color primary. + // We do not validate the color primaries, so the returned value may not be in the ktx2_df_color_primaries enum. + ktx2_df_color_primaries get_dfd_color_primaries() const { return m_dfd_color_prims; } + + // Returns KTX2_KHR_DF_TRANSFER_LINEAR or KTX2_KHR_DF_TRANSFER_SRGB. + uint32_t get_dfd_transfer_func() const { return m_dfd_transfer_func; } + + uint32_t get_dfd_flags() const { return m_dfd_flags; } + + // Returns 1 (ETC1S/UASTC) or 2 (ETC1S with an internal alpha channel). + uint32_t get_dfd_total_samples() const { return m_dfd_samples; } + + // Returns the channel mapping for each DFD "sample". UASTC always has 1 sample, ETC1S can have one or two. + // Note the returned value SHOULD be one of the ktx2_df_channel_id enums, but we don't validate that. + // It's up to the caller to decide what to do if the value isn't in the enum. + ktx2_df_channel_id get_dfd_channel_id0() const { return m_dfd_chan0; } + ktx2_df_channel_id get_dfd_channel_id1() const { return m_dfd_chan1; } + + // Key value field data. + struct key_value + { + // The key field is UTF8 and always zero terminated. + basisu::uint8_vec m_key; + + // The value may be empty. It consists of raw bytes which may or may not be zero terminated. + basisu::uint8_vec m_value; + + bool operator< (const key_value& rhs) const { return strcmp((const char*)m_key.data(), (const char *)rhs.m_key.data()) < 0; } + }; + typedef basisu::vector key_value_vec; + + // Returns the array of key-value entries. This may be empty. Valid after init(). + // The order of key values fields in this array exactly matches the order they were stored in the file. The keys are supposed to be sorted by their Unicode code points. + const key_value_vec& get_key_values() const { return m_key_values; } + + const basisu::uint8_vec *find_key(const std::string& key_name) const; + + // Low-level ETC1S specific accessors + + // Returns the ETC1S global supercompression data header, which is only valid after start_transcoding() is called. + const ktx2_etc1s_global_data_header& get_etc1s_header() const { return m_etc1s_header; } + + // Returns the array of ETC1S image descriptors, which is only valid after get_etc1s_image_descs() is called. + const basisu::vector& get_etc1s_image_descs() const { return m_etc1s_image_descs; } + + // Must have called startTranscoding() first + uint32_t get_etc1s_image_descs_image_flags(uint32_t level_index, uint32_t layer_index, uint32_t face_index) const; + + // is_video() is only valid after start_transcoding() is called. + // For ETC1S data, if this returns true you must currently transcode the file from first to last frame, in order, without skipping any frames. + bool is_video() const { return m_is_video; } + + // start_transcoding() MUST be called before calling transcode_image(). + // This method decompresses the ETC1S global endpoint/selector codebooks, which is not free, so try to avoid calling it excessively. + bool start_transcoding(); + + // get_image_level_info() be called after init(), but the m_iframe_flag's won't be valid until start_transcoding() is called. + // You can call this method before calling transcode_image_level() to retrieve basic information about the mipmap level's dimensions, etc. + bool get_image_level_info(ktx2_image_level_info& level_info, uint32_t level_index, uint32_t layer_index, uint32_t face_index) const; + + // transcode_image_level() transcodes a single 2D texture or cubemap face from the KTX2 file. + // Internally it uses the same low-level transcode API's as basisu_transcoder::transcode_image_level(). + // If the file is UASTC and is supercompressed with Zstandard, and the file is a texture array or cubemap, it's highly recommended that each mipmap level is + // completely transcoded before switching to another level. Every time the mipmap level is changed all supercompressed level data must be decompressed using Zstandard as a single unit. + // Currently ETC1S videos must always be transcoded from first to last frame (or KTX2 "layer"), in order, with no skipping of frames. + // By default this method is not thread safe unless you specify a pointer to a user allocated thread-specific transcoder_state struct. + bool transcode_image_level( + uint32_t level_index, uint32_t layer_index, uint32_t face_index, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + basist::transcoder_texture_format fmt, + uint32_t decode_flags = 0, uint32_t output_row_pitch_in_blocks_or_pixels = 0, uint32_t output_rows_in_pixels = 0, int channel0 = -1, int channel1 = -1, + ktx2_transcoder_state *pState = nullptr); + + private: + const uint8_t* m_pData; + uint32_t m_data_size; + + ktx2_header m_header; + basisu::vector m_levels; + basisu::uint8_vec m_dfd; + key_value_vec m_key_values; + + ktx2_etc1s_global_data_header m_etc1s_header; + basisu::vector m_etc1s_image_descs; + + basist::basis_tex_format m_format; + + uint32_t m_dfd_color_model; + ktx2_df_color_primaries m_dfd_color_prims; + uint32_t m_dfd_transfer_func; + uint32_t m_dfd_flags; + uint32_t m_dfd_samples; + ktx2_df_channel_id m_dfd_chan0, m_dfd_chan1; + + basist::basisu_lowlevel_etc1s_transcoder m_etc1s_transcoder; + basist::basisu_lowlevel_uastc_transcoder m_uastc_transcoder; + + ktx2_transcoder_state m_def_transcoder_state; + + bool m_has_alpha; + bool m_is_video; + + bool decompress_level_data(uint32_t level_index, basisu::uint8_vec& uncomp_data); + bool decompress_etc1s_global_data(); + bool read_key_values(); + }; + +#endif // BASISD_SUPPORT_KTX2 + + // Returns true if the transcoder was compiled with KTX2 support. + bool basisu_transcoder_supports_ktx2(); + + // Returns true if the transcoder was compiled with Zstandard support. + bool basisu_transcoder_supports_ktx2_zstd(); + +} // namespace basisu + +/**** ended inlining basisu_transcoder.h ****/ +#include +/**** start inlining basisu_containers_impl.h ****/ +// basisu_containers_impl.h +// Do not include directly + +#ifdef _MSC_VER +#pragma warning (disable:4127) // warning C4127: conditional expression is constant +#endif + +namespace basisu +{ + bool elemental_vector::increase_capacity(uint32_t min_new_capacity, bool grow_hint, uint32_t element_size, object_mover pMover, bool nofail) + { + assert(m_size <= m_capacity); + + if (sizeof(void *) == sizeof(uint64_t)) + assert(min_new_capacity < (0x400000000ULL / element_size)); + else + assert(min_new_capacity < (0x7FFF0000U / element_size)); + + if (m_capacity >= min_new_capacity) + return true; + + size_t new_capacity = min_new_capacity; + if ((grow_hint) && (!helpers::is_power_of_2((uint64_t)new_capacity))) + { + new_capacity = (size_t)helpers::next_pow2((uint64_t)new_capacity); + + assert(new_capacity && (new_capacity > m_capacity)); + + if (new_capacity < min_new_capacity) + { + if (nofail) + return false; + fprintf(stderr, "vector too large\n"); + abort(); + } + } + + const size_t desired_size = element_size * new_capacity; + size_t actual_size = 0; + if (!pMover) + { + void* new_p = realloc(m_p, desired_size); + if (!new_p) + { + if (nofail) + return false; + + char buf[256]; +#ifdef _MSC_VER + sprintf_s(buf, sizeof(buf), "vector: realloc() failed allocating %u bytes", (uint32_t)desired_size); +#else + sprintf(buf, "vector: realloc() failed allocating %u bytes", (uint32_t)desired_size); +#endif + fprintf(stderr, "%s", buf); + abort(); + } + +#if BASISU_VECTOR_DETERMINISTIC + actual_size = desired_size; +#elif defined(_MSC_VER) + actual_size = _msize(new_p); +#elif HAS_MALLOC_USABLE_SIZE + actual_size = malloc_usable_size(new_p); +#else + actual_size = desired_size; +#endif + m_p = new_p; + } + else + { + void* new_p = malloc(desired_size); + if (!new_p) + { + if (nofail) + return false; + + char buf[256]; +#ifdef _MSC_VER + sprintf_s(buf, sizeof(buf), "vector: malloc() failed allocating %u bytes", (uint32_t)desired_size); +#else + sprintf(buf, "vector: malloc() failed allocating %u bytes", (uint32_t)desired_size); +#endif + fprintf(stderr, "%s", buf); + abort(); + } + +#if BASISU_VECTOR_DETERMINISTIC + actual_size = desired_size; +#elif defined(_MSC_VER) + actual_size = _msize(new_p); +#elif HAS_MALLOC_USABLE_SIZE + actual_size = malloc_usable_size(new_p); +#else + actual_size = desired_size; +#endif + + (*pMover)(new_p, m_p, m_size); + + if (m_p) + free(m_p); + + m_p = new_p; + } + + if (actual_size > desired_size) + m_capacity = static_cast(actual_size / element_size); + else + m_capacity = static_cast(new_capacity); + + return true; + } + +#if BASISU_HASHMAP_TEST + +#define HASHMAP_TEST_VERIFY(c) do { if (!(c)) handle_hashmap_test_verify_failure(__LINE__); } while(0) + + static void handle_hashmap_test_verify_failure(int line) + { + fprintf(stderr, "HASHMAP_TEST_VERIFY() faild on line %i\n", line); + abort(); + } + + class counted_obj + { + public: + counted_obj(uint32_t v = 0) : + m_val(v) + { + m_count++; + } + + counted_obj(const counted_obj& obj) : + m_val(obj.m_val) + { + m_count++; + } + + ~counted_obj() + { + assert(m_count > 0); + m_count--; + } + + static uint32_t m_count; + + uint32_t m_val; + + operator size_t() const { return m_val; } + + bool operator== (const counted_obj& rhs) const { return m_val == rhs.m_val; } + bool operator== (const uint32_t rhs) const { return m_val == rhs; } + + }; + + uint32_t counted_obj::m_count; + + static uint32_t urand32() + { + uint32_t a = rand(); + uint32_t b = rand() << 15; + uint32_t c = rand() << (32 - 15); + return a ^ b ^ c; + } + + static int irand32(int l, int h) + { + assert(l < h); + if (l >= h) + return l; + + uint32_t range = static_cast(h - l); + + uint32_t rnd = urand32(); + + uint32_t rnd_range = static_cast((((uint64_t)range) * ((uint64_t)rnd)) >> 32U); + + int result = l + rnd_range; + assert((result >= l) && (result < h)); + return result; + } + + void hash_map_test() + { + { + basisu::hash_map k; + basisu::hash_map l; + std::swap(k, l); + + k.begin(); + k.end(); + k.clear(); + k.empty(); + k.erase(0); + k.insert(0, 1); + k.find(0); + k.get_equals(); + k.get_hasher(); + k.get_table_size(); + k.reset(); + k.reserve(1); + k = l; + k.set_equals(l.get_equals()); + k.set_hasher(l.get_hasher()); + k.get_table_size(); + } + + uint32_t seed = 0; + for (; ; ) + { + seed++; + + typedef basisu::hash_map my_hash_map; + my_hash_map m; + + const uint32_t n = irand32(0, 100000); + + printf("%u\n", n); + + srand(seed); // r1.seed(seed); + + basisu::vector q; + + uint32_t count = 0; + for (uint32_t i = 0; i < n; i++) + { + uint32_t v = urand32() & 0x7FFFFFFF; + my_hash_map::insert_result res = m.insert(counted_obj(v), counted_obj(v ^ 0xdeadbeef)); + if (res.second) + { + count++; + q.push_back(v); + } + } + + HASHMAP_TEST_VERIFY(m.size() == count); + + srand(seed); + + my_hash_map cm(m); + m.clear(); + m = cm; + cm.reset(); + + for (uint32_t i = 0; i < n; i++) + { + uint32_t v = urand32() & 0x7FFFFFFF; + my_hash_map::const_iterator it = m.find(counted_obj(v)); + HASHMAP_TEST_VERIFY(it != m.end()); + HASHMAP_TEST_VERIFY(it->first == v); + HASHMAP_TEST_VERIFY(it->second == (v ^ 0xdeadbeef)); + } + + for (uint32_t t = 0; t < 2; t++) + { + const uint32_t nd = irand32(1, q.size() + 1); + for (uint32_t i = 0; i < nd; i++) + { + uint32_t p = irand32(0, q.size()); + + int k = q[p]; + if (k >= 0) + { + q[p] = -k - 1; + + bool s = m.erase(counted_obj(k)); + HASHMAP_TEST_VERIFY(s); + } + } + + typedef basisu::hash_map uint_hash_set; + uint_hash_set s; + + for (uint32_t i = 0; i < q.size(); i++) + { + int v = q[i]; + + if (v >= 0) + { + my_hash_map::const_iterator it = m.find(counted_obj(v)); + HASHMAP_TEST_VERIFY(it != m.end()); + HASHMAP_TEST_VERIFY(it->first == (uint32_t)v); + HASHMAP_TEST_VERIFY(it->second == ((uint32_t)v ^ 0xdeadbeef)); + + s.insert(v); + } + else + { + my_hash_map::const_iterator it = m.find(counted_obj(-v - 1)); + HASHMAP_TEST_VERIFY(it == m.end()); + } + } + + uint32_t found_count = 0; + for (my_hash_map::const_iterator it = m.begin(); it != m.end(); ++it) + { + HASHMAP_TEST_VERIFY(it->second == ((uint32_t)it->first ^ 0xdeadbeef)); + + uint_hash_set::const_iterator fit(s.find((uint32_t)it->first)); + HASHMAP_TEST_VERIFY(fit != s.end()); + + HASHMAP_TEST_VERIFY(fit->first == it->first); + + found_count++; + } + + HASHMAP_TEST_VERIFY(found_count == s.size()); + } + + HASHMAP_TEST_VERIFY(counted_obj::m_count == m.size() * 2); + } + } + +#endif // BASISU_HASHMAP_TEST + +} // namespace basisu +/**** ended inlining basisu_containers_impl.h ****/ + +#ifndef BASISD_IS_BIG_ENDIAN +// TODO: This doesn't work on OSX. How can this be so difficult? +//#if defined(__BIG_ENDIAN__) || defined(_BIG_ENDIAN) || defined(BIG_ENDIAN) +// #define BASISD_IS_BIG_ENDIAN (1) +//#else + #define BASISD_IS_BIG_ENDIAN (0) +//#endif +#endif + +#ifndef BASISD_USE_UNALIGNED_WORD_READS + #ifdef __EMSCRIPTEN__ + // Can't use unaligned loads/stores with WebAssembly. + #define BASISD_USE_UNALIGNED_WORD_READS (0) + #elif defined(_M_AMD64) || defined(_M_IX86) || defined(__i386__) || defined(__x86_64__) + #define BASISD_USE_UNALIGNED_WORD_READS (1) + #else + #define BASISD_USE_UNALIGNED_WORD_READS (0) + #endif +#endif + +#define BASISD_SUPPORTED_BASIS_VERSION (0x13) + +#ifndef BASISD_SUPPORT_KTX2 + #error Must have defined BASISD_SUPPORT_KTX2 +#endif + +#ifndef BASISD_SUPPORT_KTX2_ZSTD +#error Must have defined BASISD_SUPPORT_KTX2_ZSTD +#endif + +// Set to 1 for fuzz testing. This will disable all CRC16 checks on headers and compressed data. +#ifndef BASISU_NO_HEADER_OR_DATA_CRC16_CHECKS + #define BASISU_NO_HEADER_OR_DATA_CRC16_CHECKS 0 +#endif + +#ifndef BASISD_SUPPORT_DXT1 + #define BASISD_SUPPORT_DXT1 1 +#endif + +#ifndef BASISD_SUPPORT_DXT5A + #define BASISD_SUPPORT_DXT5A 1 +#endif + +// Disable all BC7 transcoders if necessary (useful when cross compiling to Javascript) +#if defined(BASISD_SUPPORT_BC7) && !BASISD_SUPPORT_BC7 + #ifndef BASISD_SUPPORT_BC7_MODE5 + #define BASISD_SUPPORT_BC7_MODE5 0 + #endif +#endif // !BASISD_SUPPORT_BC7 + +// BC7 mode 5 supports both opaque and opaque+alpha textures, and uses less memory BC1. +#ifndef BASISD_SUPPORT_BC7_MODE5 + #define BASISD_SUPPORT_BC7_MODE5 1 +#endif + +#ifndef BASISD_SUPPORT_PVRTC1 + #define BASISD_SUPPORT_PVRTC1 1 +#endif + +#ifndef BASISD_SUPPORT_ETC2_EAC_A8 + #define BASISD_SUPPORT_ETC2_EAC_A8 1 +#endif + +// Set BASISD_SUPPORT_UASTC to 0 to completely disable support for transcoding UASTC files. +#ifndef BASISD_SUPPORT_UASTC + #define BASISD_SUPPORT_UASTC 1 +#endif + +#ifndef BASISD_SUPPORT_ASTC + #define BASISD_SUPPORT_ASTC 1 +#endif + +// Note that if BASISD_SUPPORT_ATC is enabled, BASISD_SUPPORT_DXT5A should also be enabled for alpha support. +#ifndef BASISD_SUPPORT_ATC + #define BASISD_SUPPORT_ATC 1 +#endif + +// Support for ETC2 EAC R11 and ETC2 EAC RG11 +#ifndef BASISD_SUPPORT_ETC2_EAC_RG11 + #define BASISD_SUPPORT_ETC2_EAC_RG11 1 +#endif + +// If BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY is 1, opaque blocks will be transcoded to ASTC at slightly higher quality (higher than BC1), but the transcoder tables will be 2x as large. +// This impacts grayscale and grayscale+alpha textures the most. +#ifndef BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + #ifdef __EMSCRIPTEN__ + // Let's assume size matters more than quality when compiling with emscripten. + #define BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY 0 + #else + // Compiling native, so an extra 64K lookup table is probably acceptable. + #define BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY 1 + #endif +#endif + +#ifndef BASISD_SUPPORT_FXT1 + #define BASISD_SUPPORT_FXT1 1 +#endif + +#ifndef BASISD_SUPPORT_PVRTC2 + #define BASISD_SUPPORT_PVRTC2 1 +#endif + +#if BASISD_SUPPORT_PVRTC2 + #if !BASISD_SUPPORT_ATC + #error BASISD_SUPPORT_ATC must be 1 if BASISD_SUPPORT_PVRTC2 is 1 + #endif +#endif + +#if BASISD_SUPPORT_ATC + #if !BASISD_SUPPORT_DXT5A + #error BASISD_SUPPORT_DXT5A must be 1 if BASISD_SUPPORT_ATC is 1 + #endif +#endif + +#define BASISD_WRITE_NEW_BC7_MODE5_TABLES 0 +#define BASISD_WRITE_NEW_DXT1_TABLES 0 +#define BASISD_WRITE_NEW_ETC2_EAC_A8_TABLES 0 +#define BASISD_WRITE_NEW_ASTC_TABLES 0 +#define BASISD_WRITE_NEW_ATC_TABLES 0 +#define BASISD_WRITE_NEW_ETC2_EAC_R11_TABLES 0 + +#ifndef BASISD_ENABLE_DEBUG_FLAGS + #define BASISD_ENABLE_DEBUG_FLAGS 0 +#endif + +// If KTX2 support is enabled, we may need Zstd for decompression of supercompressed UASTC files. Include this header. +#if BASISD_SUPPORT_KTX2 + // If BASISD_SUPPORT_KTX2_ZSTD is 0, UASTC files compressed with Zstd cannot be loaded. + #if BASISD_SUPPORT_KTX2_ZSTD + // We only use two Zstd API's: ZSTD_decompress() and ZSTD_isError() +/**** start inlining zstd ****/ +#error Unable to find "zstd" +/**** ended inlining zstd ****/ + #endif +#endif + +namespace basisu +{ + bool g_debug_printf; + + void enable_debug_printf(bool enabled) + { + g_debug_printf = enabled; + } + + void debug_printf(const char* pFmt, ...) + { +#if BASISU_FORCE_DEVEL_MESSAGES + g_debug_printf = true; +#endif + if (g_debug_printf) + { + va_list args; + va_start(args, pFmt); + vprintf(pFmt, args); + va_end(args); + } + } +} // namespace basisu + +namespace basist +{ + +#if BASISD_ENABLE_DEBUG_FLAGS + static uint32_t g_debug_flags = 0; +#endif + + uint32_t get_debug_flags() + { +#if BASISD_ENABLE_DEBUG_FLAGS + return g_debug_flags; +#else + return 0; +#endif + } + + void set_debug_flags(uint32_t f) + { + BASISU_NOTE_UNUSED(f); +#if BASISD_ENABLE_DEBUG_FLAGS + g_debug_flags = f; +#endif + } + + inline uint16_t byteswap_uint16(uint16_t v) + { + return static_cast((v >> 8) | (v << 8)); + } + + static inline int32_t clampi(int32_t value, int32_t low, int32_t high) { if (value < low) value = low; else if (value > high) value = high; return value; } + static inline float clampf(float value, float low, float high) { if (value < low) value = low; else if (value > high) value = high; return value; } + static inline float saturate(float value) { return clampf(value, 0, 1.0f); } + + static inline uint8_t mul_8(uint32_t v, uint32_t q) { v = v * q + 128; return (uint8_t)((v + (v >> 8)) >> 8); } + + uint16_t crc16(const void* r, size_t size, uint16_t crc) + { + crc = ~crc; + + const uint8_t* p = static_cast(r); + for (; size; --size) + { + const uint16_t q = *p++ ^ (crc >> 8); + uint16_t k = (q >> 4) ^ q; + crc = (((crc << 8) ^ k) ^ (k << 5)) ^ (k << 12); + } + + return static_cast(~crc); + } + + enum etc_constants + { + cETC1BytesPerBlock = 8U, + + cETC1SelectorBits = 2U, + cETC1SelectorValues = 1U << cETC1SelectorBits, + cETC1SelectorMask = cETC1SelectorValues - 1U, + + cETC1BlockShift = 2U, + cETC1BlockSize = 1U << cETC1BlockShift, + + cETC1LSBSelectorIndicesBitOffset = 0, + cETC1MSBSelectorIndicesBitOffset = 16, + + cETC1FlipBitOffset = 32, + cETC1DiffBitOffset = 33, + + cETC1IntenModifierNumBits = 3, + cETC1IntenModifierValues = 1 << cETC1IntenModifierNumBits, + cETC1RightIntenModifierTableBitOffset = 34, + cETC1LeftIntenModifierTableBitOffset = 37, + + // Base+Delta encoding (5 bit bases, 3 bit delta) + cETC1BaseColorCompNumBits = 5, + cETC1BaseColorCompMax = 1 << cETC1BaseColorCompNumBits, + + cETC1DeltaColorCompNumBits = 3, + cETC1DeltaColorComp = 1 << cETC1DeltaColorCompNumBits, + cETC1DeltaColorCompMax = 1 << cETC1DeltaColorCompNumBits, + + cETC1BaseColor5RBitOffset = 59, + cETC1BaseColor5GBitOffset = 51, + cETC1BaseColor5BBitOffset = 43, + + cETC1DeltaColor3RBitOffset = 56, + cETC1DeltaColor3GBitOffset = 48, + cETC1DeltaColor3BBitOffset = 40, + + // Absolute (non-delta) encoding (two 4-bit per component bases) + cETC1AbsColorCompNumBits = 4, + cETC1AbsColorCompMax = 1 << cETC1AbsColorCompNumBits, + + cETC1AbsColor4R1BitOffset = 60, + cETC1AbsColor4G1BitOffset = 52, + cETC1AbsColor4B1BitOffset = 44, + + cETC1AbsColor4R2BitOffset = 56, + cETC1AbsColor4G2BitOffset = 48, + cETC1AbsColor4B2BitOffset = 40, + + cETC1ColorDeltaMin = -4, + cETC1ColorDeltaMax = 3, + + // Delta3: + // 0 1 2 3 4 5 6 7 + // 000 001 010 011 100 101 110 111 + // 0 1 2 3 -4 -3 -2 -1 + }; + +#define DECLARE_ETC1_INTEN_TABLE(name, N) \ + static const int name[cETC1IntenModifierValues][cETC1SelectorValues] = \ + { \ + { N * -8, N * -2, N * 2, N * 8 },{ N * -17, N * -5, N * 5, N * 17 },{ N * -29, N * -9, N * 9, N * 29 },{ N * -42, N * -13, N * 13, N * 42 }, \ + { N * -60, N * -18, N * 18, N * 60 },{ N * -80, N * -24, N * 24, N * 80 },{ N * -106, N * -33, N * 33, N * 106 },{ N * -183, N * -47, N * 47, N * 183 } \ + }; + + DECLARE_ETC1_INTEN_TABLE(g_etc1_inten_tables, 1); + DECLARE_ETC1_INTEN_TABLE(g_etc1_inten_tables16, 16); + DECLARE_ETC1_INTEN_TABLE(g_etc1_inten_tables48, 3 * 16); + + //const uint8_t g_etc1_to_selector_index[cETC1SelectorValues] = { 2, 3, 1, 0 }; + const uint8_t g_selector_index_to_etc1[cETC1SelectorValues] = { 3, 2, 0, 1 }; + + static const uint8_t g_etc_5_to_8[32] = { 0, 8, 16, 24, 33, 41, 49, 57, 66, 74, 82, 90, 99, 107, 115, 123, 132, 140, 148, 156, 165, 173, 181, 189, 198, 206, 214, 222, 231, 239, 247, 255 }; + + struct decoder_etc_block + { + // big endian uint64: + // bit ofs: 56 48 40 32 24 16 8 0 + // byte ofs: b0, b1, b2, b3, b4, b5, b6, b7 + union + { + uint64_t m_uint64; + + uint32_t m_uint32[2]; + + uint8_t m_bytes[8]; + + struct + { + signed m_dred2 : 3; + uint32_t m_red1 : 5; + + signed m_dgreen2 : 3; + uint32_t m_green1 : 5; + + signed m_dblue2 : 3; + uint32_t m_blue1 : 5; + + uint32_t m_flip : 1; + uint32_t m_diff : 1; + uint32_t m_cw2 : 3; + uint32_t m_cw1 : 3; + + uint32_t m_selectors; + } m_differential; + }; + + inline void clear() + { + assert(sizeof(*this) == 8); + basisu::clear_obj(*this); + } + + inline void set_byte_bits(uint32_t ofs, uint32_t num, uint32_t bits) + { + assert((ofs + num) <= 64U); + assert(num && (num < 32U)); + assert((ofs >> 3) == ((ofs + num - 1) >> 3)); + assert(bits < (1U << num)); + const uint32_t byte_ofs = 7 - (ofs >> 3); + const uint32_t byte_bit_ofs = ofs & 7; + const uint32_t mask = (1 << num) - 1; + m_bytes[byte_ofs] &= ~(mask << byte_bit_ofs); + m_bytes[byte_ofs] |= (bits << byte_bit_ofs); + } + + inline void set_flip_bit(bool flip) + { + m_bytes[3] &= ~1; + m_bytes[3] |= static_cast(flip); + } + + inline void set_diff_bit(bool diff) + { + m_bytes[3] &= ~2; + m_bytes[3] |= (static_cast(diff) << 1); + } + + // Sets intensity modifier table (0-7) used by subblock subblock_id (0 or 1) + inline void set_inten_table(uint32_t subblock_id, uint32_t t) + { + assert(subblock_id < 2); + assert(t < 8); + const uint32_t ofs = subblock_id ? 2 : 5; + m_bytes[3] &= ~(7 << ofs); + m_bytes[3] |= (t << ofs); + } + + // Selector "val" ranges from 0-3 and is a direct index into g_etc1_inten_tables. + inline void set_selector(uint32_t x, uint32_t y, uint32_t val) + { + assert((x | y | val) < 4); + const uint32_t bit_index = x * 4 + y; + + uint8_t* p = &m_bytes[7 - (bit_index >> 3)]; + + const uint32_t byte_bit_ofs = bit_index & 7; + const uint32_t mask = 1 << byte_bit_ofs; + + static const uint8_t s_selector_index_to_etc1[4] = { 3, 2, 0, 1 }; + const uint32_t etc1_val = s_selector_index_to_etc1[val]; + + const uint32_t lsb = etc1_val & 1; + const uint32_t msb = etc1_val >> 1; + + p[0] &= ~mask; + p[0] |= (lsb << byte_bit_ofs); + + p[-2] &= ~mask; + p[-2] |= (msb << byte_bit_ofs); + } + + // Returned encoded selector value ranges from 0-3 (this is NOT a direct index into g_etc1_inten_tables, see get_selector()) + inline uint32_t get_raw_selector(uint32_t x, uint32_t y) const + { + assert((x | y) < 4); + + const uint32_t bit_index = x * 4 + y; + const uint32_t byte_bit_ofs = bit_index & 7; + const uint8_t* p = &m_bytes[7 - (bit_index >> 3)]; + const uint32_t lsb = (p[0] >> byte_bit_ofs) & 1; + const uint32_t msb = (p[-2] >> byte_bit_ofs) & 1; + const uint32_t val = lsb | (msb << 1); + + return val; + } + + // Returned selector value ranges from 0-3 and is a direct index into g_etc1_inten_tables. + inline uint32_t get_selector(uint32_t x, uint32_t y) const + { + static const uint8_t s_etc1_to_selector_index[cETC1SelectorValues] = { 2, 3, 1, 0 }; + return s_etc1_to_selector_index[get_raw_selector(x, y)]; + } + + inline void set_raw_selector_bits(uint32_t bits) + { + m_bytes[4] = static_cast(bits); + m_bytes[5] = static_cast(bits >> 8); + m_bytes[6] = static_cast(bits >> 16); + m_bytes[7] = static_cast(bits >> 24); + } + + inline bool are_all_selectors_the_same() const + { + uint32_t v = *reinterpret_cast(&m_bytes[4]); + + if ((v == 0xFFFFFFFF) || (v == 0xFFFF) || (!v) || (v == 0xFFFF0000)) + return true; + + return false; + } + + inline void set_raw_selector_bits(uint8_t byte0, uint8_t byte1, uint8_t byte2, uint8_t byte3) + { + m_bytes[4] = byte0; + m_bytes[5] = byte1; + m_bytes[6] = byte2; + m_bytes[7] = byte3; + } + + inline uint32_t get_raw_selector_bits() const + { + return m_bytes[4] | (m_bytes[5] << 8) | (m_bytes[6] << 16) | (m_bytes[7] << 24); + } + + inline void set_base4_color(uint32_t idx, uint16_t c) + { + if (idx) + { + set_byte_bits(cETC1AbsColor4R2BitOffset, 4, (c >> 8) & 15); + set_byte_bits(cETC1AbsColor4G2BitOffset, 4, (c >> 4) & 15); + set_byte_bits(cETC1AbsColor4B2BitOffset, 4, c & 15); + } + else + { + set_byte_bits(cETC1AbsColor4R1BitOffset, 4, (c >> 8) & 15); + set_byte_bits(cETC1AbsColor4G1BitOffset, 4, (c >> 4) & 15); + set_byte_bits(cETC1AbsColor4B1BitOffset, 4, c & 15); + } + } + + inline void set_base5_color(uint16_t c) + { + set_byte_bits(cETC1BaseColor5RBitOffset, 5, (c >> 10) & 31); + set_byte_bits(cETC1BaseColor5GBitOffset, 5, (c >> 5) & 31); + set_byte_bits(cETC1BaseColor5BBitOffset, 5, c & 31); + } + + void set_delta3_color(uint16_t c) + { + set_byte_bits(cETC1DeltaColor3RBitOffset, 3, (c >> 6) & 7); + set_byte_bits(cETC1DeltaColor3GBitOffset, 3, (c >> 3) & 7); + set_byte_bits(cETC1DeltaColor3BBitOffset, 3, c & 7); + } + + void set_block_color4(const color32& c0_unscaled, const color32& c1_unscaled) + { + set_diff_bit(false); + + set_base4_color(0, pack_color4(c0_unscaled, false)); + set_base4_color(1, pack_color4(c1_unscaled, false)); + } + + void set_block_color5(const color32& c0_unscaled, const color32& c1_unscaled) + { + set_diff_bit(true); + + set_base5_color(pack_color5(c0_unscaled, false)); + + int dr = c1_unscaled.r - c0_unscaled.r; + int dg = c1_unscaled.g - c0_unscaled.g; + int db = c1_unscaled.b - c0_unscaled.b; + + set_delta3_color(pack_delta3(dr, dg, db)); + } + + bool set_block_color5_check(const color32& c0_unscaled, const color32& c1_unscaled) + { + set_diff_bit(true); + + set_base5_color(pack_color5(c0_unscaled, false)); + + int dr = c1_unscaled.r - c0_unscaled.r; + int dg = c1_unscaled.g - c0_unscaled.g; + int db = c1_unscaled.b - c0_unscaled.b; + + if (((dr < cETC1ColorDeltaMin) || (dr > cETC1ColorDeltaMax)) || + ((dg < cETC1ColorDeltaMin) || (dg > cETC1ColorDeltaMax)) || + ((db < cETC1ColorDeltaMin) || (db > cETC1ColorDeltaMax))) + return false; + + set_delta3_color(pack_delta3(dr, dg, db)); + + return true; + } + + inline uint32_t get_byte_bits(uint32_t ofs, uint32_t num) const + { + assert((ofs + num) <= 64U); + assert(num && (num <= 8U)); + assert((ofs >> 3) == ((ofs + num - 1) >> 3)); + const uint32_t byte_ofs = 7 - (ofs >> 3); + const uint32_t byte_bit_ofs = ofs & 7; + return (m_bytes[byte_ofs] >> byte_bit_ofs) & ((1 << num) - 1); + } + + inline uint16_t get_base5_color() const + { + const uint32_t r = get_byte_bits(cETC1BaseColor5RBitOffset, 5); + const uint32_t g = get_byte_bits(cETC1BaseColor5GBitOffset, 5); + const uint32_t b = get_byte_bits(cETC1BaseColor5BBitOffset, 5); + return static_cast(b | (g << 5U) | (r << 10U)); + } + + inline uint16_t get_base4_color(uint32_t idx) const + { + uint32_t r, g, b; + if (idx) + { + r = get_byte_bits(cETC1AbsColor4R2BitOffset, 4); + g = get_byte_bits(cETC1AbsColor4G2BitOffset, 4); + b = get_byte_bits(cETC1AbsColor4B2BitOffset, 4); + } + else + { + r = get_byte_bits(cETC1AbsColor4R1BitOffset, 4); + g = get_byte_bits(cETC1AbsColor4G1BitOffset, 4); + b = get_byte_bits(cETC1AbsColor4B1BitOffset, 4); + } + return static_cast(b | (g << 4U) | (r << 8U)); + } + + inline color32 get_base5_color_unscaled() const + { + return color32(m_differential.m_red1, m_differential.m_green1, m_differential.m_blue1, 255); + } + + inline bool get_flip_bit() const + { + return (m_bytes[3] & 1) != 0; + } + + inline bool get_diff_bit() const + { + return (m_bytes[3] & 2) != 0; + } + + inline uint32_t get_inten_table(uint32_t subblock_id) const + { + assert(subblock_id < 2); + const uint32_t ofs = subblock_id ? 2 : 5; + return (m_bytes[3] >> ofs) & 7; + } + + inline uint16_t get_delta3_color() const + { + const uint32_t r = get_byte_bits(cETC1DeltaColor3RBitOffset, 3); + const uint32_t g = get_byte_bits(cETC1DeltaColor3GBitOffset, 3); + const uint32_t b = get_byte_bits(cETC1DeltaColor3BBitOffset, 3); + return static_cast(b | (g << 3U) | (r << 6U)); + } + + void get_block_colors(color32* pBlock_colors, uint32_t subblock_index) const + { + color32 b; + + if (get_diff_bit()) + { + if (subblock_index) + unpack_color5(b, get_base5_color(), get_delta3_color(), true, 255); + else + unpack_color5(b, get_base5_color(), true); + } + else + { + b = unpack_color4(get_base4_color(subblock_index), true, 255); + } + + const int* pInten_table = g_etc1_inten_tables[get_inten_table(subblock_index)]; + + pBlock_colors[0].set_noclamp_rgba(clamp255(b.r + pInten_table[0]), clamp255(b.g + pInten_table[0]), clamp255(b.b + pInten_table[0]), 255); + pBlock_colors[1].set_noclamp_rgba(clamp255(b.r + pInten_table[1]), clamp255(b.g + pInten_table[1]), clamp255(b.b + pInten_table[1]), 255); + pBlock_colors[2].set_noclamp_rgba(clamp255(b.r + pInten_table[2]), clamp255(b.g + pInten_table[2]), clamp255(b.b + pInten_table[2]), 255); + pBlock_colors[3].set_noclamp_rgba(clamp255(b.r + pInten_table[3]), clamp255(b.g + pInten_table[3]), clamp255(b.b + pInten_table[3]), 255); + } + + static uint16_t pack_color4(const color32& color, bool scaled, uint32_t bias = 127U) + { + return pack_color4(color.r, color.g, color.b, scaled, bias); + } + + static uint16_t pack_color4(uint32_t r, uint32_t g, uint32_t b, bool scaled, uint32_t bias = 127U) + { + if (scaled) + { + r = (r * 15U + bias) / 255U; + g = (g * 15U + bias) / 255U; + b = (b * 15U + bias) / 255U; + } + + r = basisu::minimum(r, 15U); + g = basisu::minimum(g, 15U); + b = basisu::minimum(b, 15U); + + return static_cast(b | (g << 4U) | (r << 8U)); + } + + static uint16_t pack_color5(const color32& color, bool scaled, uint32_t bias = 127U) + { + return pack_color5(color.r, color.g, color.b, scaled, bias); + } + + static uint16_t pack_color5(uint32_t r, uint32_t g, uint32_t b, bool scaled, uint32_t bias = 127U) + { + if (scaled) + { + r = (r * 31U + bias) / 255U; + g = (g * 31U + bias) / 255U; + b = (b * 31U + bias) / 255U; + } + + r = basisu::minimum(r, 31U); + g = basisu::minimum(g, 31U); + b = basisu::minimum(b, 31U); + + return static_cast(b | (g << 5U) | (r << 10U)); + } + + uint16_t pack_delta3(const color32& color) + { + return pack_delta3(color.r, color.g, color.b); + } + + uint16_t pack_delta3(int r, int g, int b) + { + assert((r >= cETC1ColorDeltaMin) && (r <= cETC1ColorDeltaMax)); + assert((g >= cETC1ColorDeltaMin) && (g <= cETC1ColorDeltaMax)); + assert((b >= cETC1ColorDeltaMin) && (b <= cETC1ColorDeltaMax)); + if (r < 0) r += 8; + if (g < 0) g += 8; + if (b < 0) b += 8; + return static_cast(b | (g << 3) | (r << 6)); + } + + static void unpack_delta3(int& r, int& g, int& b, uint16_t packed_delta3) + { + r = (packed_delta3 >> 6) & 7; + g = (packed_delta3 >> 3) & 7; + b = packed_delta3 & 7; + if (r >= 4) r -= 8; + if (g >= 4) g -= 8; + if (b >= 4) b -= 8; + } + + static color32 unpack_color5(uint16_t packed_color5, bool scaled, uint32_t alpha) + { + uint32_t b = packed_color5 & 31U; + uint32_t g = (packed_color5 >> 5U) & 31U; + uint32_t r = (packed_color5 >> 10U) & 31U; + + if (scaled) + { + b = (b << 3U) | (b >> 2U); + g = (g << 3U) | (g >> 2U); + r = (r << 3U) | (r >> 2U); + } + + assert(alpha <= 255); + + return color32(cNoClamp, r, g, b, alpha); + } + + static void unpack_color5(uint32_t& r, uint32_t& g, uint32_t& b, uint16_t packed_color5, bool scaled) + { + color32 c(unpack_color5(packed_color5, scaled, 0)); + r = c.r; + g = c.g; + b = c.b; + } + + static void unpack_color5(color32& result, uint16_t packed_color5, bool scaled) + { + result = unpack_color5(packed_color5, scaled, 255); + } + + static bool unpack_color5(color32& result, uint16_t packed_color5, uint16_t packed_delta3, bool scaled, uint32_t alpha) + { + int dr, dg, db; + unpack_delta3(dr, dg, db, packed_delta3); + + int r = ((packed_color5 >> 10U) & 31U) + dr; + int g = ((packed_color5 >> 5U) & 31U) + dg; + int b = (packed_color5 & 31U) + db; + + bool success = true; + if (static_cast(r | g | b) > 31U) + { + success = false; + r = basisu::clamp(r, 0, 31); + g = basisu::clamp(g, 0, 31); + b = basisu::clamp(b, 0, 31); + } + + if (scaled) + { + b = (b << 3U) | (b >> 2U); + g = (g << 3U) | (g >> 2U); + r = (r << 3U) | (r >> 2U); + } + + result.set_noclamp_rgba(r, g, b, basisu::minimum(alpha, 255U)); + return success; + } + + static color32 unpack_color4(uint16_t packed_color4, bool scaled, uint32_t alpha) + { + uint32_t b = packed_color4 & 15U; + uint32_t g = (packed_color4 >> 4U) & 15U; + uint32_t r = (packed_color4 >> 8U) & 15U; + + if (scaled) + { + b = (b << 4U) | b; + g = (g << 4U) | g; + r = (r << 4U) | r; + } + + return color32(cNoClamp, r, g, b, basisu::minimum(alpha, 255U)); + } + + static void unpack_color4(uint32_t& r, uint32_t& g, uint32_t& b, uint16_t packed_color4, bool scaled) + { + color32 c(unpack_color4(packed_color4, scaled, 0)); + r = c.r; + g = c.g; + b = c.b; + } + + static void get_diff_subblock_colors(color32* pDst, uint16_t packed_color5, uint32_t table_idx) + { + assert(table_idx < cETC1IntenModifierValues); + const int* pInten_modifer_table = &g_etc1_inten_tables[table_idx][0]; + + uint32_t r, g, b; + unpack_color5(r, g, b, packed_color5, true); + + const int ir = static_cast(r), ig = static_cast(g), ib = static_cast(b); + + const int y0 = pInten_modifer_table[0]; + pDst[0].set(clamp255(ir + y0), clamp255(ig + y0), clamp255(ib + y0), 255); + + const int y1 = pInten_modifer_table[1]; + pDst[1].set(clamp255(ir + y1), clamp255(ig + y1), clamp255(ib + y1), 255); + + const int y2 = pInten_modifer_table[2]; + pDst[2].set(clamp255(ir + y2), clamp255(ig + y2), clamp255(ib + y2), 255); + + const int y3 = pInten_modifer_table[3]; + pDst[3].set(clamp255(ir + y3), clamp255(ig + y3), clamp255(ib + y3), 255); + } + + static int clamp255(int x) + { + if (x & 0xFFFFFF00) + { + if (x < 0) + x = 0; + else if (x > 255) + x = 255; + } + + return x; + } + + static void get_block_colors5(color32* pBlock_colors, const color32& base_color5, uint32_t inten_table) + { + color32 b(base_color5); + + b.r = (b.r << 3) | (b.r >> 2); + b.g = (b.g << 3) | (b.g >> 2); + b.b = (b.b << 3) | (b.b >> 2); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + pBlock_colors[0].set(clamp255(b.r + pInten_table[0]), clamp255(b.g + pInten_table[0]), clamp255(b.b + pInten_table[0]), 255); + pBlock_colors[1].set(clamp255(b.r + pInten_table[1]), clamp255(b.g + pInten_table[1]), clamp255(b.b + pInten_table[1]), 255); + pBlock_colors[2].set(clamp255(b.r + pInten_table[2]), clamp255(b.g + pInten_table[2]), clamp255(b.b + pInten_table[2]), 255); + pBlock_colors[3].set(clamp255(b.r + pInten_table[3]), clamp255(b.g + pInten_table[3]), clamp255(b.b + pInten_table[3]), 255); + } + + static void get_block_color5(const color32& base_color5, uint32_t inten_table, uint32_t index, uint32_t& r, uint32_t &g, uint32_t &b) + { + assert(index < 4); + + uint32_t br = (base_color5.r << 3) | (base_color5.r >> 2); + uint32_t bg = (base_color5.g << 3) | (base_color5.g >> 2); + uint32_t bb = (base_color5.b << 3) | (base_color5.b >> 2); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + r = clamp255(br + pInten_table[index]); + g = clamp255(bg + pInten_table[index]); + b = clamp255(bb + pInten_table[index]); + } + + static void get_block_color5_r(const color32& base_color5, uint32_t inten_table, uint32_t index, uint32_t &r) + { + assert(index < 4); + + uint32_t br = (base_color5.r << 3) | (base_color5.r >> 2); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + r = clamp255(br + pInten_table[index]); + } + + static void get_block_colors5_g(int* pBlock_colors, const color32& base_color5, uint32_t inten_table) + { + const int g = (base_color5.g << 3) | (base_color5.g >> 2); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + pBlock_colors[0] = clamp255(g + pInten_table[0]); + pBlock_colors[1] = clamp255(g + pInten_table[1]); + pBlock_colors[2] = clamp255(g + pInten_table[2]); + pBlock_colors[3] = clamp255(g + pInten_table[3]); + } + + static void get_block_colors5_bounds(color32* pBlock_colors, const color32& base_color5, uint32_t inten_table, uint32_t l = 0, uint32_t h = 3) + { + color32 b(base_color5); + + b.r = (b.r << 3) | (b.r >> 2); + b.g = (b.g << 3) | (b.g >> 2); + b.b = (b.b << 3) | (b.b >> 2); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + pBlock_colors[0].set(clamp255(b.r + pInten_table[l]), clamp255(b.g + pInten_table[l]), clamp255(b.b + pInten_table[l]), 255); + pBlock_colors[1].set(clamp255(b.r + pInten_table[h]), clamp255(b.g + pInten_table[h]), clamp255(b.b + pInten_table[h]), 255); + } + + static void get_block_colors5_bounds_g(uint32_t* pBlock_colors, const color32& base_color5, uint32_t inten_table, uint32_t l = 0, uint32_t h = 3) + { + color32 b(base_color5); + + b.g = (b.g << 3) | (b.g >> 2); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + pBlock_colors[0] = clamp255(b.g + pInten_table[l]); + pBlock_colors[1] = clamp255(b.g + pInten_table[h]); + } + }; + + enum dxt_constants + { + cDXT1SelectorBits = 2U, cDXT1SelectorValues = 1U << cDXT1SelectorBits, cDXT1SelectorMask = cDXT1SelectorValues - 1U, + cDXT5SelectorBits = 3U, cDXT5SelectorValues = 1U << cDXT5SelectorBits, cDXT5SelectorMask = cDXT5SelectorValues - 1U, + }; + + static const uint8_t g_etc1_x_selector_unpack[4][256] = + { + { + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + }, + { + 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, + 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, + 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, + 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, + }, + + { + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + } + }; + + struct dxt1_block + { + enum { cTotalEndpointBytes = 2, cTotalSelectorBytes = 4 }; + + uint8_t m_low_color[cTotalEndpointBytes]; + uint8_t m_high_color[cTotalEndpointBytes]; + uint8_t m_selectors[cTotalSelectorBytes]; + + inline void clear() { basisu::clear_obj(*this); } + + inline uint32_t get_high_color() const { return m_high_color[0] | (m_high_color[1] << 8U); } + inline uint32_t get_low_color() const { return m_low_color[0] | (m_low_color[1] << 8U); } + inline void set_low_color(uint16_t c) { m_low_color[0] = static_cast(c & 0xFF); m_low_color[1] = static_cast((c >> 8) & 0xFF); } + inline void set_high_color(uint16_t c) { m_high_color[0] = static_cast(c & 0xFF); m_high_color[1] = static_cast((c >> 8) & 0xFF); } + inline uint32_t get_selector(uint32_t x, uint32_t y) const { assert((x < 4U) && (y < 4U)); return (m_selectors[y] >> (x * cDXT1SelectorBits)) & cDXT1SelectorMask; } + inline void set_selector(uint32_t x, uint32_t y, uint32_t val) { assert((x < 4U) && (y < 4U) && (val < 4U)); m_selectors[y] &= (~(cDXT1SelectorMask << (x * cDXT1SelectorBits))); m_selectors[y] |= (val << (x * cDXT1SelectorBits)); } + + static uint16_t pack_color(const color32& color, bool scaled, uint32_t bias = 127U) + { + uint32_t r = color.r, g = color.g, b = color.b; + if (scaled) + { + r = (r * 31U + bias) / 255U; + g = (g * 63U + bias) / 255U; + b = (b * 31U + bias) / 255U; + } + return static_cast(basisu::minimum(b, 31U) | (basisu::minimum(g, 63U) << 5U) | (basisu::minimum(r, 31U) << 11U)); + } + + static uint16_t pack_unscaled_color(uint32_t r, uint32_t g, uint32_t b) { return static_cast(b | (g << 5U) | (r << 11U)); } + }; + + struct dxt_selector_range + { + uint32_t m_low; + uint32_t m_high; + }; + + struct etc1_to_dxt1_56_solution + { + uint8_t m_lo; + uint8_t m_hi; + uint16_t m_err; + }; + +#if BASISD_SUPPORT_DXT1 + static dxt_selector_range g_etc1_to_dxt1_selector_ranges[] = + { + { 0, 3 }, + + { 1, 3 }, + { 0, 2 }, + + { 1, 2 }, + + { 2, 3 }, + { 0, 1 }, + }; + + const uint32_t NUM_ETC1_TO_DXT1_SELECTOR_RANGES = sizeof(g_etc1_to_dxt1_selector_ranges) / sizeof(g_etc1_to_dxt1_selector_ranges[0]); + + static uint32_t g_etc1_to_dxt1_selector_range_index[4][4]; + + const uint32_t NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS = 10; + static const uint8_t g_etc1_to_dxt1_selector_mappings[NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS][4] = + { + { 0, 0, 1, 1 }, + { 0, 0, 1, 2 }, + { 0, 0, 1, 3 }, + { 0, 0, 2, 3 }, + { 0, 1, 1, 1 }, + { 0, 1, 2, 2 }, + { 0, 1, 2, 3 }, + { 0, 2, 3, 3 }, + { 1, 2, 2, 2 }, + { 1, 2, 3, 3 }, + }; + + static uint8_t g_etc1_to_dxt1_selector_mappings_raw_dxt1_256[NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS][256]; + static uint8_t g_etc1_to_dxt1_selector_mappings_raw_dxt1_inv_256[NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS][256]; + + static const etc1_to_dxt1_56_solution g_etc1_to_dxt_6[32 * 8 * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS * NUM_ETC1_TO_DXT1_SELECTOR_RANGES] = { +/**** start inlining basisu_transcoder_tables_dxt1_6.inc ****/ +// Copyright (C) 2017-2019 Binomial LLC. All Rights Reserved. +// +// 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. +{0,4,18},{0,3,4},{0,2,0},{0,2,9},{0,3,36},{0,2,22},{0,2,13},{0,1,24},{0,1,41},{0,1,25},{0,4,18},{0,3,4},{0,2,0},{0,2,9},{1,1,36},{0,2,22},{0,2,13},{0,1,24},{3,0,36},{0,1,24},{0,2,0},{0,2,0},{0,2,0},{0,1,0},{0,1,2},{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{0,2,0}, +{0,2,0},{0,2,0},{0,1,0},{0,1,2},{0,1,1},{0,1,1},{0,0,4},{1,0,2},{0,0,4},{2,0,18},{0,3,4},{0,2,0},{0,2,9},{2,0,18},{4,0,18},{0,2,9},{0,1,20},{4,0,18},{0,1,20},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,8,38},{1,6,21},{1,4,24}, +{1,4,24},{0,8,52},{0,5,18},{0,4,1},{0,3,24},{0,4,77},{0,3,40},{2,6,22},{1,6,5},{2,4,4},{1,4,8},{4,0,52},{0,5,18},{0,4,1},{0,3,24},{8,0,52},{0,3,24},{1,6,20},{1,6,20},{1,6,20},{1,3,21},{0,6,8},{0,4,1},{0,4,1},{0,2,5},{0,3,24},{0,2,9},{2,4,4},{2,4,4},{2,4,4},{2,3,4},{3,0,8}, +{1,3,1},{1,3,1},{1,2,4},{6,0,8},{1,2,4},{5,0,18},{1,6,1},{2,4,0},{0,4,0},{5,0,18},{10,0,18},{0,4,0},{0,3,20},{10,0,18},{0,3,20},{1,0,20},{1,0,20},{1,0,20},{1,0,20},{0,5,0},{0,5,0},{0,5,0},{0,2,1},{0,2,5},{0,2,5},{3,10,38},{3,8,21},{3,6,24},{3,6,24},{2,10,52},{2,7,18},{2,6,1}, +{2,5,24},{0,7,53},{1,5,21},{4,8,22},{3,8,5},{4,6,4},{3,6,8},{7,0,52},{2,7,18},{2,6,1},{1,5,20},{14,0,52},{1,5,20},{3,8,20},{3,8,20},{3,8,20},{3,5,21},{2,8,8},{2,6,1},{2,6,1},{2,4,5},{0,6,8},{1,5,5},{4,6,4},{4,6,4},{4,6,4},{4,5,4},{6,0,8},{3,5,1},{3,5,1},{3,4,4},{12,0,8}, +{3,4,4},{8,0,18},{3,8,1},{4,6,0},{2,6,0},{8,0,18},{16,0,18},{2,6,0},{0,5,20},{16,0,18},{0,5,20},{3,0,20},{3,0,20},{3,0,20},{3,0,20},{2,7,0},{2,7,0},{2,7,0},{2,4,1},{1,5,1},{1,5,1},{5,12,38},{5,10,21},{5,8,24},{5,8,24},{4,12,52},{4,9,18},{4,8,1},{4,7,24},{2,9,53},{3,7,21},{6,10,22}, +{5,10,5},{6,8,4},{5,8,8},{2,16,51},{4,9,18},{4,8,1},{3,7,20},{20,0,51},{3,7,20},{5,10,20},{5,10,20},{5,10,20},{5,7,21},{4,10,8},{4,8,1},{4,8,1},{4,6,5},{2,8,8},{3,7,5},{6,8,4},{6,8,4},{6,8,4},{6,7,4},{9,0,8},{5,7,1},{5,7,1},{5,6,4},{18,0,8},{5,6,4},{11,0,18},{5,10,1},{6,8,0}, +{4,8,0},{11,0,18},{22,0,18},{4,8,0},{0,7,20},{22,0,18},{0,7,20},{5,0,20},{5,0,20},{5,0,20},{5,0,20},{4,9,0},{4,9,0},{4,9,0},{4,6,1},{3,7,1},{3,7,1},{7,15,36},{7,12,19},{7,10,28},{7,10,20},{6,15,52},{6,11,22},{6,10,7},{6,9,28},{3,12,52},{5,9,27},{8,13,19},{8,11,3},{8,10,3},{8,10,6},{13,1,51}, +{6,11,21},{7,10,3},{5,9,27},{27,0,51},{5,9,27},{7,12,19},{7,12,19},{7,12,19},{7,10,19},{6,13,9},{6,10,6},{6,10,6},{6,9,3},{5,10,9},{5,9,2},{8,10,2},{8,10,2},{8,10,2},{8,9,2},{12,1,8},{7,10,2},{7,10,2},{5,9,2},{25,0,8},{5,9,2},{14,1,18},{7,12,1},{8,10,2},{6,10,2},{14,1,18},{15,7,18},{6,10,2}, +{0,9,26},{15,7,18},{0,9,26},{7,0,18},{7,0,18},{7,0,18},{7,0,18},{6,11,2},{6,11,2},{6,11,2},{6,9,2},{5,9,1},{5,9,1},{9,16,38},{9,14,19},{9,12,28},{9,12,20},{8,17,52},{8,13,22},{8,12,7},{8,11,28},{5,14,52},{7,11,27},{10,15,19},{10,13,3},{10,12,3},{10,12,6},{16,1,51},{8,13,21},{9,12,3},{7,11,27},{33,0,51}, +{7,11,27},{9,14,19},{9,14,19},{9,14,19},{9,12,19},{8,15,9},{8,12,6},{8,12,6},{8,11,3},{7,12,9},{7,11,2},{10,12,2},{10,12,2},{10,12,2},{10,11,2},{15,1,8},{9,12,2},{9,12,2},{7,11,2},{31,0,8},{7,11,2},{17,0,18},{9,14,1},{10,12,2},{8,12,2},{17,0,18},{34,0,18},{8,12,2},{0,11,26},{34,0,18},{0,11,26},{9,0,18}, +{9,0,18},{9,0,18},{9,0,18},{8,13,2},{8,13,2},{8,13,2},{8,11,2},{7,11,1},{7,11,1},{11,18,38},{11,16,19},{11,14,28},{11,14,20},{10,19,52},{10,15,22},{10,14,7},{10,13,28},{7,16,52},{9,13,27},{12,16,21},{12,15,3},{12,14,3},{12,14,6},{19,1,51},{10,15,21},{11,14,3},{9,13,27},{39,0,51},{9,13,27},{11,16,18},{11,16,18},{11,16,18}, +{11,14,19},{10,17,9},{10,14,6},{10,14,6},{10,13,3},{9,14,9},{9,13,2},{12,14,2},{12,14,2},{12,14,2},{12,13,2},{15,7,8},{11,14,2},{11,14,2},{9,13,2},{31,3,8},{9,13,2},{20,0,18},{11,16,1},{12,14,2},{10,14,2},{20,0,18},{40,0,18},{10,14,2},{0,13,26},{40,0,18},{0,13,26},{11,0,18},{11,0,18},{11,0,18},{11,0,18},{10,15,2}, +{10,15,2},{10,15,2},{10,13,2},{9,13,1},{9,13,1},{13,20,38},{13,18,19},{13,16,27},{13,16,19},{12,21,52},{12,17,19},{12,16,5},{12,15,28},{10,17,52},{11,15,27},{14,18,21},{14,17,3},{14,16,1},{13,16,10},{22,1,51},{12,17,18},{13,16,2},{11,15,27},{45,0,51},{11,15,27},{13,18,18},{13,18,18},{13,18,18},{13,16,19},{12,19,9},{12,16,5},{12,16,5}, +{12,15,3},{10,16,11},{11,15,2},{14,16,1},{14,16,1},{14,16,1},{14,15,2},{15,13,8},{13,16,2},{13,16,2},{11,15,2},{31,6,8},{11,15,2},{23,0,18},{13,18,1},{14,16,0},{12,16,0},{23,0,18},{46,0,18},{12,16,0},{0,15,26},{46,0,18},{0,15,26},{13,0,18},{13,0,18},{13,0,18},{13,0,18},{12,17,1},{12,17,1},{12,17,1},{12,15,2},{11,15,1}, +{11,15,1},{15,23,38},{15,20,21},{15,18,37},{15,18,21},{15,22,55},{15,19,23},{15,18,5},{14,17,30},{13,19,56},{13,17,28},{16,21,19},{16,19,3},{16,18,3},{16,18,6},{17,17,51},{15,19,19},{15,18,1},{14,17,26},{51,0,51},{14,17,26},{15,21,20},{15,21,20},{15,21,20},{15,18,20},{15,19,14},{15,18,4},{15,18,4},{14,17,5},{13,18,9},{13,17,3},{16,18,2}, +{16,18,2},{16,18,2},{16,17,2},{24,1,8},{15,18,0},{15,18,0},{14,17,1},{49,0,8},{14,17,1},{26,1,18},{15,20,1},{16,18,2},{15,18,1},{26,1,18},{53,0,18},{15,18,1},{0,17,26},{53,0,18},{0,17,26},{15,0,20},{15,0,20},{15,0,20},{15,0,20},{15,18,4},{15,18,4},{15,18,4},{14,17,4},{13,17,2},{13,17,2},{17,25,36},{17,22,19},{17,20,28}, +{17,20,20},{16,25,52},{16,21,22},{16,20,7},{16,19,28},{15,21,56},{15,19,28},{18,23,19},{18,21,3},{18,20,3},{18,20,6},{20,17,51},{16,21,21},{17,20,3},{14,20,26},{57,0,51},{14,20,26},{17,22,19},{17,22,19},{17,22,19},{17,20,19},{16,23,9},{16,20,6},{16,20,6},{16,19,3},{15,20,9},{15,19,3},{18,20,2},{18,20,2},{18,20,2},{18,19,2},{27,1,8}, +{17,20,2},{17,20,2},{15,19,2},{55,0,8},{15,19,2},{29,1,18},{17,22,1},{18,20,2},{16,20,2},{29,1,18},{59,0,18},{16,20,2},{0,19,26},{59,0,18},{0,19,26},{17,0,18},{17,0,18},{17,0,18},{17,0,18},{16,21,2},{16,21,2},{16,21,2},{16,19,2},{15,19,2},{15,19,2},{19,27,36},{19,24,19},{19,22,28},{19,22,20},{18,27,52},{18,23,22},{18,22,7}, +{18,21,28},{15,24,56},{17,21,27},{20,25,19},{20,23,3},{20,22,3},{20,22,6},{23,17,51},{18,23,21},{19,22,3},{17,21,27},{63,0,51},{17,21,27},{19,24,19},{19,24,19},{19,24,19},{19,22,19},{18,25,9},{18,22,6},{18,22,6},{18,21,3},{17,22,9},{17,21,2},{20,22,2},{20,22,2},{20,22,2},{20,21,2},{30,1,8},{19,22,2},{19,22,2},{17,21,2},{61,0,8}, +{17,21,2},{31,3,18},{19,24,1},{20,22,2},{18,22,2},{31,3,18},{63,1,18},{18,22,2},{0,21,26},{63,1,18},{0,21,26},{19,0,18},{19,0,18},{19,0,18},{19,0,18},{18,23,2},{18,23,2},{18,23,2},{18,21,2},{17,21,1},{17,21,1},{21,29,36},{21,26,19},{21,24,28},{21,24,20},{20,29,52},{20,25,22},{20,24,7},{20,23,28},{17,26,52},{19,23,27},{22,27,19}, +{22,25,3},{22,24,3},{22,24,6},{34,1,51},{20,25,21},{21,24,3},{19,23,27},{63,3,51},{19,23,27},{21,26,19},{21,26,19},{21,26,19},{21,24,19},{20,27,9},{20,24,6},{20,24,6},{20,23,3},{19,24,9},{19,23,2},{22,24,2},{22,24,2},{22,24,2},{22,23,2},{33,1,8},{21,24,2},{21,24,2},{19,23,2},{63,2,8},{19,23,2},{31,9,18},{21,26,1},{22,24,2}, +{20,24,2},{31,9,18},{63,4,18},{20,24,2},{0,23,26},{63,4,18},{0,23,26},{21,0,18},{21,0,18},{21,0,18},{21,0,18},{20,25,2},{20,25,2},{20,25,2},{20,23,2},{19,23,1},{19,23,1},{23,31,40},{23,29,24},{23,27,33},{23,26,24},{23,30,55},{22,28,24},{23,26,8},{22,26,28},{20,28,51},{21,26,21},{24,29,20},{24,28,1},{24,27,4},{24,26,5},{38,0,51}, +{22,28,20},{23,26,4},{20,26,20},{62,7,51},{20,26,20},{23,29,20},{23,29,20},{23,29,20},{23,26,20},{23,28,12},{23,26,4},{23,26,4},{22,25,4},{20,27,9},{22,25,4},{24,27,0},{24,27,0},{24,27,0},{24,26,1},{31,12,8},{23,26,0},{23,26,0},{22,25,0},{62,6,8},{22,25,0},{38,1,18},{24,28,1},{24,27,4},{23,26,4},{38,1,18},{45,16,18},{23,26,4}, +{0,26,20},{45,16,18},{0,26,20},{23,0,20},{23,0,20},{23,0,20},{23,0,20},{23,26,4},{23,26,4},{23,26,4},{22,25,4},{21,26,1},{21,26,1},{25,33,38},{25,31,24},{25,29,33},{25,28,24},{25,32,55},{24,30,24},{25,28,8},{24,28,28},{22,30,51},{23,28,21},{26,31,20},{26,30,1},{26,29,4},{26,28,5},{41,0,51},{24,30,20},{25,28,4},{22,28,20},{62,10,51}, +{22,28,20},{25,31,20},{25,31,20},{25,31,20},{25,28,20},{25,30,12},{25,28,4},{25,28,4},{24,27,4},{22,29,9},{24,27,4},{26,29,0},{26,29,0},{26,29,0},{26,28,1},{31,18,8},{25,28,0},{25,28,0},{24,27,0},{62,9,8},{24,27,0},{41,1,18},{26,30,1},{26,29,4},{25,28,4},{41,1,18},{51,16,18},{25,28,4},{0,28,20},{51,16,18},{0,28,20},{25,0,20}, +{25,0,20},{25,0,20},{25,0,20},{25,28,4},{25,28,4},{25,28,4},{24,27,4},{23,28,1},{23,28,1},{27,35,38},{27,32,21},{27,31,33},{27,30,24},{27,34,55},{26,32,24},{27,30,8},{26,30,28},{25,31,56},{25,30,21},{28,33,18},{28,32,2},{28,31,4},{28,30,5},{44,0,51},{26,32,20},{27,30,4},{24,30,20},{62,13,51},{24,30,20},{27,33,20},{27,33,20},{27,33,20}, +{27,30,20},{27,31,14},{27,30,4},{27,30,4},{26,29,4},{24,31,9},{26,29,4},{28,31,0},{28,31,0},{28,31,0},{28,30,1},{34,17,8},{27,30,0},{27,30,0},{26,29,0},{62,12,8},{26,29,0},{44,1,18},{27,32,1},{28,31,4},{27,30,4},{44,1,18},{57,16,18},{27,30,4},{0,30,20},{57,16,18},{0,30,20},{27,0,20},{27,0,20},{27,0,20},{27,0,20},{27,30,4}, +{27,30,4},{27,30,4},{26,29,4},{25,30,1},{25,30,1},{29,37,38},{29,34,21},{29,32,37},{29,32,21},{29,36,55},{29,33,23},{29,32,5},{28,32,39},{27,33,56},{26,32,30},{30,35,18},{30,34,2},{30,32,2},{30,32,5},{47,0,51},{29,33,19},{29,32,1},{26,32,26},{46,24,51},{26,32,26},{29,35,20},{29,35,20},{29,35,20},{29,32,20},{29,33,14},{29,32,4},{29,32,4}, +{28,31,4},{27,32,9},{28,31,4},{30,33,0},{30,33,0},{30,33,0},{30,31,4},{37,17,8},{29,32,0},{29,32,0},{28,31,0},{62,15,8},{28,31,0},{47,1,18},{29,34,1},{30,32,2},{29,32,1},{47,1,18},{63,16,18},{29,32,1},{0,32,26},{63,16,18},{0,32,26},{29,0,20},{29,0,20},{29,0,20},{29,0,20},{29,32,4},{29,32,4},{29,32,4},{28,31,4},{28,31,4}, +{28,31,4},{31,40,44},{31,37,28},{32,35,40},{31,34,31},{31,38,53},{31,35,21},{31,34,7},{31,34,30},{28,36,51},{29,34,21},{32,37,20},{32,36,1},{32,35,4},{32,34,5},{50,0,51},{30,36,19},{31,34,6},{28,34,21},{62,19,51},{28,34,21},{31,38,26},{31,38,26},{31,38,26},{31,34,27},{31,36,9},{31,34,3},{31,34,3},{31,33,2},{29,34,10},{30,33,2},{32,35,0}, +{32,35,0},{32,35,0},{32,34,1},{49,0,8},{31,34,2},{31,34,2},{30,33,1},{62,18,8},{30,33,1},{47,8,18},{32,36,1},{32,35,4},{31,34,5},{47,8,18},{62,20,18},{31,34,5},{0,34,20},{62,20,18},{0,34,20},{31,0,26},{31,0,26},{31,0,26},{31,0,26},{31,35,1},{31,35,1},{31,35,1},{31,33,2},{29,34,1},{29,34,1},{33,41,40},{33,39,24},{33,37,33}, +{33,36,24},{33,40,55},{32,38,24},{33,36,8},{32,36,28},{30,38,51},{31,36,21},{34,39,20},{34,38,1},{34,37,4},{34,36,5},{53,0,51},{32,38,20},{33,36,4},{30,36,21},{62,22,51},{30,36,21},{33,39,20},{33,39,20},{33,39,20},{33,36,20},{33,38,12},{33,36,4},{33,36,4},{32,35,4},{31,36,10},{32,35,4},{34,37,0},{34,37,0},{34,37,0},{34,36,1},{52,0,8}, +{33,36,0},{33,36,0},{32,35,0},{62,21,8},{32,35,0},{47,14,18},{34,38,1},{34,37,4},{33,36,4},{47,14,18},{62,23,18},{33,36,4},{0,36,20},{62,23,18},{0,36,20},{33,0,20},{33,0,20},{33,0,20},{33,0,20},{33,36,4},{33,36,4},{33,36,4},{32,35,4},{31,36,1},{31,36,1},{35,43,40},{35,41,24},{35,39,33},{35,38,24},{35,42,55},{34,40,24},{35,38,8}, +{34,38,28},{32,40,51},{33,38,21},{36,41,20},{36,40,1},{36,39,4},{36,38,5},{56,0,51},{34,40,20},{35,38,4},{32,38,20},{62,25,51},{32,38,20},{35,41,20},{35,41,20},{35,41,20},{35,38,20},{35,40,12},{35,38,4},{35,38,4},{34,37,4},{32,39,9},{34,37,4},{36,39,0},{36,39,0},{36,39,0},{36,38,1},{55,0,8},{35,38,0},{35,38,0},{34,37,0},{62,24,8}, +{34,37,0},{48,17,18},{36,40,1},{36,39,4},{35,38,4},{48,17,18},{62,26,18},{35,38,4},{0,38,20},{62,26,18},{0,38,20},{35,0,20},{35,0,20},{35,0,20},{35,0,20},{35,38,4},{35,38,4},{35,38,4},{34,37,4},{33,38,1},{33,38,1},{37,45,40},{37,43,24},{37,41,33},{37,40,24},{37,44,55},{36,42,24},{37,40,8},{36,40,28},{34,42,51},{35,40,21},{38,43,20}, +{38,42,1},{38,41,4},{38,40,5},{59,0,51},{36,42,20},{37,40,4},{34,40,20},{62,28,51},{34,40,20},{37,43,20},{37,43,20},{37,43,20},{37,40,20},{37,42,12},{37,40,4},{37,40,4},{36,39,4},{34,41,9},{36,39,4},{38,41,0},{38,41,0},{38,41,0},{38,40,1},{58,0,8},{37,40,0},{37,40,0},{36,39,0},{62,27,8},{36,39,0},{51,17,18},{38,42,1},{38,41,4}, +{37,40,4},{51,17,18},{62,29,18},{37,40,4},{0,40,20},{62,29,18},{0,40,20},{37,0,20},{37,0,20},{37,0,20},{37,0,20},{37,40,4},{37,40,4},{37,40,4},{36,39,4},{35,40,1},{35,40,1},{40,46,44},{40,44,27},{40,43,28},{39,43,28},{39,47,52},{39,44,22},{39,43,3},{38,42,28},{36,44,53},{37,42,19},{40,46,19},{40,44,2},{40,43,3},{40,42,10},{62,1,51}, +{38,44,19},{39,43,2},{37,42,18},{63,31,51},{37,42,18},{40,44,26},{40,44,26},{40,44,26},{40,42,26},{39,44,11},{39,43,2},{39,43,2},{39,41,2},{37,43,11},{38,41,3},{40,44,1},{40,44,1},{40,44,1},{40,42,1},{53,16,8},{40,42,1},{40,42,1},{39,41,1},{63,30,8},{39,41,1},{63,0,18},{40,44,1},{40,43,2},{38,43,1},{63,0,18},{62,32,18},{38,43,1}, +{0,42,18},{62,32,18},{0,42,18},{39,0,26},{39,0,26},{39,0,26},{39,0,26},{39,43,1},{39,43,1},{39,43,1},{39,41,1},{37,42,1},{37,42,1},{42,48,44},{42,46,27},{42,45,28},{41,45,28},{41,48,53},{41,46,22},{41,45,3},{40,44,28},{38,46,53},{39,44,19},{42,48,19},{42,46,2},{42,45,3},{42,44,10},{63,5,51},{40,46,19},{41,45,2},{39,44,18},{47,42,51}, +{39,44,18},{42,46,26},{42,46,26},{42,46,26},{42,44,26},{41,46,11},{41,45,2},{41,45,2},{41,43,2},{39,45,11},{40,43,3},{42,46,1},{42,46,1},{42,46,1},{42,44,1},{56,16,8},{42,44,1},{42,44,1},{41,43,1},{62,33,8},{41,43,1},{63,6,18},{42,46,1},{42,45,2},{40,45,1},{63,6,18},{62,35,18},{40,45,1},{0,44,18},{62,35,18},{0,44,18},{41,0,26}, +{41,0,26},{41,0,26},{41,0,26},{41,45,1},{41,45,1},{41,45,1},{41,43,1},{39,44,1},{39,44,1},{44,50,44},{44,48,26},{44,47,28},{43,47,28},{43,50,53},{43,47,27},{43,47,3},{42,46,28},{40,48,51},{41,46,19},{44,50,19},{44,48,1},{44,47,3},{44,46,10},{63,11,51},{42,48,19},{43,47,2},{41,46,18},{47,45,51},{41,46,18},{44,48,26},{44,48,26},{44,48,26}, +{44,46,26},{43,48,9},{43,47,2},{43,47,2},{43,45,2},{41,47,11},{42,45,3},{44,48,1},{44,48,1},{44,48,1},{44,46,1},{59,16,8},{44,46,1},{44,46,1},{43,45,1},{62,36,8},{43,45,1},{63,12,18},{44,48,0},{44,47,2},{42,47,1},{63,12,18},{62,38,18},{42,47,1},{0,46,18},{62,38,18},{0,46,18},{43,0,26},{43,0,26},{43,0,26},{43,0,26},{43,47,1}, +{43,47,1},{43,47,1},{43,45,1},{41,46,1},{41,46,1},{46,52,44},{46,50,26},{46,49,31},{45,48,31},{45,52,53},{45,49,21},{45,48,7},{45,48,30},{42,50,51},{43,48,21},{46,52,19},{46,50,1},{46,49,6},{46,48,6},{55,32,51},{44,50,19},{45,48,6},{42,48,21},{46,48,51},{42,48,21},{46,50,26},{46,50,26},{46,50,26},{45,48,27},{45,50,9},{45,48,3},{45,48,3}, +{45,47,2},{43,48,10},{44,47,3},{46,50,1},{46,50,1},{46,50,1},{46,48,2},{62,16,8},{45,48,2},{45,48,2},{45,47,1},{62,39,8},{45,47,1},{63,18,18},{46,50,0},{47,48,4},{45,48,5},{63,18,18},{62,41,18},{45,48,5},{0,48,20},{62,41,18},{0,48,20},{45,0,26},{45,0,26},{45,0,26},{45,0,26},{45,49,1},{45,49,1},{45,49,1},{45,47,1},{43,48,1}, +{43,48,1},{48,54,44},{48,52,27},{48,51,28},{48,50,35},{47,55,51},{47,52,21},{47,51,3},{47,50,22},{45,52,52},{45,50,19},{48,54,19},{48,52,2},{48,51,3},{48,50,10},{63,23,51},{47,52,21},{47,51,3},{45,50,18},{63,43,51},{45,50,18},{48,52,26},{48,52,26},{48,52,26},{48,50,26},{47,53,8},{47,51,2},{47,51,2},{47,49,1},{45,51,8},{46,49,5},{48,52,1}, +{48,52,1},{48,52,1},{48,50,1},{63,21,8},{48,50,1},{48,50,1},{47,49,1},{63,42,8},{47,49,1},{63,25,18},{48,52,1},{48,51,2},{46,51,1},{63,25,18},{63,44,18},{46,51,1},{0,50,18},{63,44,18},{0,50,18},{48,0,26},{48,0,26},{48,0,26},{48,0,26},{47,51,1},{47,51,1},{47,51,1},{47,49,0},{45,50,1},{45,50,1},{50,56,44},{50,54,27},{50,53,28}, +{49,53,28},{49,57,52},{49,54,22},{49,53,3},{48,52,28},{47,54,52},{47,52,19},{50,56,19},{50,54,2},{50,53,3},{50,52,10},{63,29,51},{48,54,19},{49,53,2},{47,52,18},{63,46,51},{47,52,18},{50,54,26},{50,54,26},{50,54,26},{50,52,26},{49,54,11},{49,53,2},{49,53,2},{49,51,2},{47,53,8},{48,51,3},{50,54,1},{50,54,1},{50,54,1},{50,52,1},{63,27,8}, +{50,52,1},{50,52,1},{49,51,1},{63,45,8},{49,51,1},{63,31,18},{50,54,1},{50,53,2},{48,53,1},{63,31,18},{63,47,18},{48,53,1},{0,52,18},{63,47,18},{0,52,18},{49,0,26},{49,0,26},{49,0,26},{49,0,26},{49,53,1},{49,53,1},{49,53,1},{49,51,1},{47,52,1},{47,52,1},{52,58,44},{52,56,27},{52,55,28},{51,55,28},{51,59,52},{51,56,22},{51,55,3}, +{50,54,28},{48,56,53},{49,54,19},{52,58,19},{52,56,2},{52,55,3},{52,54,10},{63,35,51},{50,56,19},{51,55,2},{49,54,18},{63,49,51},{49,54,18},{52,56,26},{52,56,26},{52,56,26},{52,54,26},{51,56,11},{51,55,2},{51,55,2},{51,53,2},{49,55,11},{50,53,3},{52,56,1},{52,56,1},{52,56,1},{52,54,1},{63,33,8},{52,54,1},{52,54,1},{51,53,1},{47,56,8}, +{51,53,1},{57,48,18},{52,56,1},{52,55,2},{50,55,1},{57,48,18},{62,50,18},{50,55,1},{0,54,18},{62,50,18},{0,54,18},{51,0,26},{51,0,26},{51,0,26},{51,0,26},{51,55,1},{51,55,1},{51,55,1},{51,53,1},{49,54,1},{49,54,1},{54,60,44},{54,58,27},{54,57,28},{53,57,28},{53,61,52},{53,58,22},{53,57,3},{52,56,28},{50,58,53},{51,56,19},{54,60,19}, +{54,58,2},{54,57,3},{54,56,10},{63,41,51},{52,58,19},{53,57,2},{51,56,18},{63,52,51},{51,56,18},{54,58,26},{54,58,26},{54,58,26},{54,56,26},{53,58,11},{53,57,2},{53,57,2},{53,55,2},{51,57,11},{52,55,3},{54,58,1},{54,58,1},{54,58,1},{54,56,1},{63,39,8},{54,56,1},{54,56,1},{53,55,1},{47,59,8},{53,55,1},{60,48,18},{54,58,1},{54,57,2}, +{52,57,1},{60,48,18},{62,53,18},{52,57,1},{0,56,18},{62,53,18},{0,56,18},{53,0,26},{53,0,26},{53,0,26},{53,0,26},{53,57,1},{53,57,1},{53,57,1},{53,55,1},{51,56,1},{51,56,1},{56,63,38},{56,61,21},{56,59,24},{56,59,24},{55,63,52},{55,60,18},{55,59,1},{55,58,24},{53,60,53},{54,58,21},{57,61,22},{56,61,5},{57,59,4},{56,59,8},{63,47,52}, +{55,60,18},{55,59,1},{54,58,20},{63,55,52},{54,58,20},{56,61,20},{56,61,20},{56,61,20},{56,58,21},{55,61,8},{55,59,1},{55,59,1},{55,57,5},{53,59,8},{54,58,5},{57,59,4},{57,59,4},{57,59,4},{57,58,4},{61,49,8},{56,58,1},{56,58,1},{56,57,4},{63,54,8},{56,57,4},{63,49,18},{56,61,1},{57,59,0},{55,59,0},{63,49,18},{63,56,18},{55,59,0}, +{0,58,20},{63,56,18},{0,58,20},{56,0,20},{56,0,20},{56,0,20},{56,0,20},{55,60,0},{55,60,0},{55,60,0},{55,57,1},{54,58,1},{54,58,1},{58,63,56},{58,63,21},{58,61,24},{58,61,24},{58,63,68},{57,62,18},{57,61,1},{57,60,24},{55,62,53},{56,60,21},{59,63,22},{58,63,5},{59,61,4},{58,61,8},{63,53,52},{57,62,18},{57,61,1},{56,60,20},{63,58,52}, +{56,60,20},{58,63,20},{58,63,20},{58,63,20},{58,60,21},{57,63,8},{57,61,1},{57,61,1},{57,59,5},{55,61,8},{56,60,5},{59,61,4},{59,61,4},{59,61,4},{59,60,4},{63,51,8},{58,60,1},{58,60,1},{58,59,4},{63,57,8},{58,59,4},{63,55,18},{58,63,1},{59,61,0},{57,61,0},{63,55,18},{63,59,18},{57,61,0},{0,60,20},{63,59,18},{0,60,20},{58,0,20}, +{58,0,20},{58,0,20},{58,0,20},{57,62,0},{57,62,0},{57,62,0},{57,59,1},{56,60,1},{56,60,1},{60,63,88},{60,63,40},{60,63,24},{60,63,24},{60,63,88},{59,63,37},{59,63,1},{59,62,24},{58,63,63},{58,62,21},{61,63,40},{61,63,13},{61,63,4},{60,63,8},{63,59,52},{60,63,24},{59,63,1},{58,62,20},{63,61,52},{58,62,20},{60,63,24},{60,63,24},{60,63,24}, +{60,62,21},{60,63,24},{59,63,1},{59,63,1},{59,61,5},{57,63,8},{58,62,5},{61,63,4},{61,63,4},{61,63,4},{61,62,4},{63,57,8},{60,62,1},{60,62,1},{60,61,4},{63,60,8},{60,61,4},{63,61,18},{61,63,9},{61,63,0},{59,63,0},{63,61,18},{63,62,18},{59,63,0},{0,62,20},{63,62,18},{0,62,20},{60,0,20},{60,0,20},{60,0,20},{60,0,20},{59,63,1}, +{59,63,1},{59,63,1},{59,61,1},{58,62,1},{58,62,1},{62,63,38},{62,63,33},{62,63,29},{62,63,24},{62,63,35},{62,63,25},{62,63,21},{61,63,1},{61,63,23},{60,63,4},{63,63,4},{63,63,4},{63,63,4},{63,63,4},{63,63,4},{63,63,4},{63,63,4},{62,63,0},{63,63,4},{62,63,0},{62,63,29},{62,63,29},{62,63,29},{62,63,24},{62,63,26},{62,63,21},{62,63,21}, +{61,63,1},{61,63,14},{60,63,4},{63,63,4},{63,63,4},{63,63,4},{63,63,4},{63,62,4},{63,63,4},{63,63,4},{62,63,0},{62,63,4},{62,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{62,0,20},{62,0,20},{62,0,20},{62,0,20},{61,63,16},{61,63,16},{61,63,16},{61,63,1},{60,63,4}, +{60,63,4},{0,8,74},{0,6,10},{0,4,1},{0,4,26},{0,6,154},{0,4,99},{0,3,50},{0,2,115},{0,3,170},{0,2,119},{0,8,74},{0,6,10},{0,4,1},{0,4,26},{3,0,154},{0,4,99},{0,3,50},{0,2,115},{6,0,154},{0,2,115},{0,4,0},{0,4,0},{0,4,0},{0,2,0},{0,2,13},{0,2,4},{0,2,4},{0,1,5},{0,1,14},{0,1,6},{0,4,0}, +{0,4,0},{0,4,0},{0,2,0},{1,0,13},{0,2,4},{0,2,4},{0,1,5},{2,0,13},{0,1,5},{4,0,74},{0,6,10},{0,4,1},{0,4,26},{4,0,74},{8,0,74},{0,4,26},{0,3,74},{8,0,74},{0,3,74},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,14,83},{0,10,10},{1,6,27}, +{0,6,19},{0,11,243},{0,7,110},{0,5,34},{0,4,139},{0,5,280},{0,4,164},{1,12,75},{1,9,2},{1,6,11},{1,6,18},{5,1,243},{0,7,110},{0,5,34},{0,4,139},{11,0,243},{0,4,139},{0,10,9},{0,10,9},{0,10,9},{0,5,9},{0,6,50},{0,5,9},{0,5,9},{0,3,26},{0,3,66},{0,2,33},{1,8,1},{1,8,1},{1,8,1},{1,4,2},{3,0,50}, +{0,5,9},{0,5,9},{0,3,26},{6,0,50},{0,3,26},{7,0,74},{1,9,1},{2,6,1},{0,6,10},{7,0,74},{14,0,74},{0,6,10},{0,5,74},{14,0,74},{0,5,74},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,2,1},{0,2,1},{0,2,1},{0,1,1},{0,1,2},{0,1,2},{1,18,137},{1,12,74},{2,9,98},{1,8,67},{0,16,244},{0,10,78},{0,8,2}, +{0,6,115},{0,8,344},{0,6,179},{3,14,75},{3,11,2},{3,8,11},{3,8,18},{8,1,243},{0,10,78},{0,8,2},{0,6,115},{15,1,243},{0,6,115},{1,14,65},{1,14,65},{1,14,65},{1,7,66},{0,12,50},{0,8,1},{0,8,1},{0,5,5},{0,5,104},{0,5,41},{3,10,1},{3,10,1},{3,10,1},{3,6,2},{6,0,50},{0,8,1},{0,8,1},{0,5,5},{12,0,50}, +{0,5,5},{2,16,72},{3,11,1},{4,8,1},{0,8,1},{2,16,72},{20,0,72},{0,8,1},{0,7,74},{20,0,72},{0,7,74},{1,0,65},{1,0,65},{1,0,65},{1,0,65},{0,8,1},{0,8,1},{0,8,1},{0,4,1},{0,3,25},{0,3,25},{3,20,146},{3,14,83},{4,11,115},{3,10,76},{2,18,245},{2,12,79},{2,10,3},{1,8,108},{0,11,293},{0,8,103},{5,16,73}, +{5,13,2},{5,10,11},{5,10,18},{11,1,243},{1,13,75},{2,10,2},{0,8,94},{15,4,243},{0,8,94},{3,16,74},{3,16,74},{3,16,74},{3,9,75},{2,14,51},{2,10,2},{2,10,2},{2,7,6},{0,9,75},{0,7,6},{5,12,1},{5,12,1},{5,12,1},{5,8,2},{9,0,50},{2,10,1},{2,10,1},{0,7,2},{18,0,50},{0,7,2},{5,16,72},{5,13,1},{6,10,1}, +{2,10,1},{5,16,72},{26,0,72},{2,10,1},{0,9,74},{26,0,72},{0,9,74},{3,0,74},{3,0,74},{3,0,74},{3,0,74},{2,10,2},{2,10,2},{2,10,2},{2,6,2},{0,7,5},{0,7,5},{6,21,152},{6,16,82},{6,13,109},{5,12,84},{4,21,243},{4,15,78},{4,13,8},{4,11,108},{0,14,255},{0,11,77},{7,19,72},{7,15,1},{7,13,8},{7,12,13},{6,17,243}, +{3,15,72},{5,12,5},{0,11,73},{29,0,243},{0,11,73},{6,16,81},{6,16,81},{6,16,81},{5,12,80},{4,17,50},{4,13,4},{4,13,4},{4,9,5},{0,12,52},{1,10,4},{7,15,0},{7,15,0},{7,15,0},{7,11,0},{12,1,50},{5,12,1},{5,12,1},{3,9,4},{25,0,50},{3,9,4},{16,1,72},{7,15,1},{8,13,4},{5,12,4},{16,1,72},{33,0,72},{5,12,4}, +{0,11,72},{33,0,72},{0,11,72},{5,0,80},{5,0,80},{5,0,80},{5,0,80},{4,13,0},{4,13,0},{4,13,0},{4,9,1},{1,10,0},{1,10,0},{8,23,152},{8,18,82},{8,15,109},{7,14,84},{6,23,243},{6,16,75},{6,15,8},{6,13,108},{1,17,244},{2,13,77},{9,21,72},{9,17,1},{9,15,8},{9,14,13},{17,1,243},{5,17,72},{7,14,5},{1,13,72},{35,0,243}, +{1,13,72},{8,18,81},{8,18,81},{8,18,81},{7,14,80},{6,19,50},{6,15,4},{6,15,4},{6,11,5},{2,14,52},{3,12,4},{9,16,1},{9,16,1},{9,16,1},{9,13,0},{15,1,50},{7,14,1},{7,14,1},{5,11,4},{31,0,50},{5,11,4},{19,1,72},{9,17,1},{10,15,4},{7,14,4},{19,1,72},{39,0,72},{7,14,4},{0,13,72},{39,0,72},{0,13,72},{7,0,80}, +{7,0,80},{7,0,80},{7,0,80},{6,15,0},{6,15,0},{6,15,0},{6,11,1},{3,12,0},{3,12,0},{10,25,152},{10,20,82},{10,17,114},{9,16,82},{8,25,243},{8,18,75},{8,16,2},{8,15,108},{3,19,244},{4,15,77},{11,23,72},{11,19,1},{11,16,10},{11,16,17},{20,1,243},{7,19,72},{8,16,2},{3,15,72},{41,0,243},{3,15,72},{10,20,81},{10,20,81},{10,20,81}, +{10,15,81},{8,21,50},{8,16,1},{8,16,1},{8,13,5},{4,16,52},{5,14,4},{11,18,1},{11,18,1},{11,18,1},{11,15,0},{15,7,50},{8,16,1},{8,16,1},{7,13,4},{31,3,50},{7,13,4},{22,1,72},{11,19,1},{12,16,2},{8,16,1},{22,1,72},{45,0,72},{8,16,1},{0,15,72},{45,0,72},{0,15,72},{9,0,80},{9,0,80},{9,0,80},{9,0,80},{8,17,0}, +{8,17,0},{8,17,0},{8,13,1},{5,14,0},{5,14,0},{12,27,152},{12,22,82},{12,19,114},{11,18,82},{10,27,243},{10,20,75},{10,18,2},{10,16,106},{5,21,244},{6,17,79},{13,25,72},{13,21,1},{13,18,10},{13,18,17},{23,1,243},{9,21,72},{10,18,2},{5,17,74},{47,0,243},{5,17,74},{12,22,81},{12,22,81},{12,22,81},{12,17,80},{10,23,50},{10,18,1},{10,18,1}, +{10,15,5},{6,18,52},{8,15,9},{13,20,1},{13,20,1},{13,20,1},{13,17,1},{15,13,50},{10,18,1},{10,18,1},{9,15,4},{31,6,50},{9,15,4},{25,1,72},{13,21,1},{14,18,2},{10,18,1},{25,1,72},{47,2,72},{10,18,1},{0,17,74},{47,2,72},{0,17,74},{11,0,80},{11,0,80},{11,0,80},{11,0,80},{10,19,0},{10,19,0},{10,19,0},{10,15,1},{7,16,0}, +{7,16,0},{14,30,146},{14,24,78},{14,21,114},{14,20,79},{12,30,244},{12,23,79},{12,21,7},{12,19,109},{7,23,244},{9,19,76},{15,28,73},{15,23,2},{15,21,14},{15,20,14},{27,0,243},{11,23,75},{13,20,4},{7,19,73},{46,4,243},{7,19,73},{14,25,74},{14,25,74},{14,25,74},{14,19,75},{12,25,53},{12,21,3},{12,21,3},{12,17,6},{8,21,52},{9,18,6},{15,23,1}, +{15,23,1},{15,23,1},{15,19,1},{24,1,50},{13,20,0},{13,20,0},{11,17,5},{49,0,50},{11,17,5},{20,17,72},{15,23,1},{16,21,4},{13,20,4},{20,17,72},{57,0,72},{13,20,4},{0,19,72},{57,0,72},{0,19,72},{14,0,74},{14,0,74},{14,0,74},{14,0,74},{12,22,1},{12,22,1},{12,22,1},{12,17,2},{9,18,2},{9,18,2},{16,31,152},{16,26,81},{16,23,109}, +{16,22,88},{14,32,244},{14,25,79},{14,23,7},{14,21,109},{9,25,244},{11,21,76},{17,29,72},{17,25,1},{17,23,8},{17,22,13},{30,0,243},{13,25,75},{15,22,4},{9,21,73},{46,7,243},{9,21,73},{16,27,80},{16,27,80},{16,27,80},{16,21,81},{14,27,53},{14,23,3},{14,23,3},{14,19,6},{10,23,52},{11,20,6},{17,25,0},{17,25,0},{17,25,0},{17,21,0},{27,1,50}, +{15,22,0},{15,22,0},{13,19,5},{55,0,50},{13,19,5},{23,17,72},{17,25,1},{18,23,4},{15,22,4},{23,17,72},{63,0,72},{15,22,4},{0,21,72},{63,0,72},{0,21,72},{16,0,80},{16,0,80},{16,0,80},{16,0,80},{14,24,1},{14,24,1},{14,24,1},{14,19,2},{11,20,2},{11,20,2},{18,33,152},{18,28,81},{18,25,109},{17,24,84},{16,33,243},{16,27,78},{16,25,8}, +{16,23,108},{11,27,244},{13,23,76},{19,31,72},{19,27,1},{19,25,8},{19,24,13},{32,1,243},{15,27,75},{17,24,5},{11,23,73},{46,10,243},{11,23,73},{18,29,80},{18,29,80},{18,29,80},{17,24,80},{16,29,50},{16,25,4},{16,25,4},{16,21,5},{12,25,52},{13,22,6},{19,27,0},{19,27,0},{19,27,0},{19,23,0},{30,1,50},{17,24,1},{17,24,1},{15,21,5},{61,0,50}, +{15,21,5},{34,1,72},{19,27,1},{20,25,4},{17,24,4},{34,1,72},{63,3,72},{17,24,4},{0,23,72},{63,3,72},{0,23,72},{17,0,80},{17,0,80},{17,0,80},{17,0,80},{16,25,0},{16,25,0},{16,25,0},{16,21,1},{13,22,2},{13,22,2},{20,35,152},{20,30,81},{20,27,109},{19,26,84},{18,35,243},{18,29,78},{18,27,8},{18,25,108},{13,29,244},{15,25,76},{21,33,72}, +{21,29,1},{21,27,8},{21,26,13},{35,1,243},{17,29,72},{19,26,5},{13,25,73},{46,13,243},{13,25,73},{20,31,80},{20,31,80},{20,31,80},{19,26,80},{18,31,50},{18,27,4},{18,27,4},{18,23,5},{14,27,52},{15,24,6},{21,29,0},{21,29,0},{21,29,0},{21,25,0},{33,1,50},{19,26,1},{19,26,1},{17,23,4},{63,2,50},{17,23,4},{37,1,72},{21,29,1},{22,27,4}, +{19,26,4},{37,1,72},{63,6,72},{19,26,4},{0,25,72},{63,6,72},{0,25,72},{19,0,80},{19,0,80},{19,0,80},{19,0,80},{18,27,0},{18,27,0},{18,27,0},{18,23,1},{15,24,2},{15,24,2},{22,38,146},{22,32,78},{22,29,111},{22,28,84},{20,38,244},{20,31,74},{20,29,4},{20,27,100},{14,32,247},{17,27,75},{23,36,73},{23,32,3},{23,29,11},{23,28,14},{39,0,243}, +{20,31,73},{20,29,3},{16,27,74},{62,8,243},{16,27,74},{22,33,74},{22,33,74},{22,33,74},{22,28,75},{20,33,53},{20,29,3},{20,29,3},{20,25,10},{16,29,50},{18,26,2},{23,31,2},{23,31,2},{23,31,2},{23,27,2},{31,12,50},{21,28,1},{21,28,1},{18,26,1},{62,6,50},{18,26,1},{41,0,72},{23,32,2},{24,29,2},{19,29,2},{41,0,72},{62,10,72},{19,29,2}, +{0,27,74},{62,10,72},{0,27,74},{22,0,74},{22,0,74},{22,0,74},{22,0,74},{20,30,1},{20,30,1},{20,30,1},{20,25,1},{18,26,1},{18,26,1},{24,40,146},{24,34,78},{24,31,111},{24,30,84},{22,40,244},{22,33,79},{22,31,4},{22,29,100},{17,33,244},{19,29,75},{25,38,73},{25,33,2},{25,31,11},{25,30,14},{42,0,243},{21,33,75},{22,31,3},{18,29,74},{62,11,243}, +{18,29,74},{24,35,74},{24,35,74},{24,35,74},{24,30,75},{22,35,53},{22,31,3},{22,31,3},{22,27,10},{18,31,50},{20,28,2},{25,33,1},{25,33,1},{25,33,1},{25,29,2},{31,18,50},{23,30,1},{23,30,1},{20,28,1},{62,9,50},{20,28,1},{44,0,72},{25,33,1},{26,31,2},{21,31,2},{44,0,72},{62,13,72},{21,31,2},{0,29,74},{62,13,72},{0,29,74},{24,0,74}, +{24,0,74},{24,0,74},{24,0,74},{22,32,1},{22,32,1},{22,32,1},{22,27,1},{20,28,1},{20,28,1},{26,42,146},{26,36,78},{26,33,114},{26,32,79},{24,42,244},{24,35,79},{24,33,7},{24,31,100},{19,35,244},{21,31,75},{27,40,73},{27,35,2},{28,33,13},{27,32,14},{45,0,243},{23,35,75},{25,32,4},{20,31,74},{62,14,243},{20,31,74},{26,37,74},{26,37,74},{26,37,74}, +{26,32,75},{24,37,53},{24,33,3},{24,33,3},{24,29,10},{20,33,52},{22,30,2},{27,35,1},{27,35,1},{27,35,1},{27,31,2},{34,17,50},{25,32,0},{25,32,0},{22,30,1},{62,12,50},{22,30,1},{47,0,72},{27,35,1},{28,33,4},{25,32,4},{47,0,72},{46,24,72},{25,32,4},{0,31,74},{46,24,72},{0,31,74},{26,0,74},{26,0,74},{26,0,74},{26,0,74},{24,34,1}, +{24,34,1},{24,34,1},{24,29,1},{22,30,1},{22,30,1},{28,44,146},{28,38,78},{28,35,114},{28,34,79},{26,44,244},{26,37,79},{26,35,7},{26,33,109},{21,37,244},{23,33,76},{29,42,73},{29,37,2},{30,35,13},{29,34,14},{47,2,243},{25,37,75},{27,34,4},{21,33,73},{62,17,243},{21,33,73},{28,39,74},{28,39,74},{28,39,74},{28,33,75},{26,39,53},{26,35,3},{26,35,3}, +{26,31,10},{22,35,52},{23,32,6},{29,37,1},{29,37,1},{29,37,1},{29,33,1},{37,17,50},{27,34,0},{27,34,0},{23,32,5},{62,15,50},{23,32,5},{49,1,72},{29,37,1},{30,35,4},{27,34,4},{49,1,72},{46,27,72},{27,34,4},{0,33,72},{46,27,72},{0,33,72},{28,0,74},{28,0,74},{28,0,74},{28,0,74},{26,36,1},{26,36,1},{26,36,1},{26,31,1},{23,32,2}, +{23,32,2},{30,46,146},{30,41,77},{31,37,121},{30,36,81},{29,45,247},{28,39,77},{28,37,9},{28,35,103},{24,39,248},{25,35,76},{31,44,78},{31,40,4},{32,37,11},{31,36,17},{51,0,243},{28,39,73},{28,37,5},{24,35,74},{47,28,243},{24,35,74},{30,42,72},{30,42,72},{30,42,72},{30,36,72},{29,40,54},{29,36,6},{29,36,6},{28,34,9},{24,37,51},{26,34,2},{31,40,4}, +{31,40,4},{31,40,4},{31,35,5},{49,0,50},{29,36,2},{29,36,2},{26,34,1},{62,18,50},{26,34,1},{53,0,72},{31,40,0},{32,37,2},{28,37,1},{53,0,72},{62,22,72},{28,37,1},{0,35,74},{62,22,72},{0,35,74},{30,0,72},{30,0,72},{30,0,72},{30,0,72},{29,36,5},{29,36,5},{29,36,5},{28,33,4},{26,34,1},{26,34,1},{32,48,146},{32,42,79},{32,39,111}, +{32,38,84},{31,47,247},{30,41,77},{30,39,9},{30,37,103},{26,41,248},{27,37,76},{33,46,73},{33,42,3},{33,39,11},{33,38,14},{54,0,243},{30,41,73},{30,39,5},{26,37,74},{47,31,243},{26,37,74},{32,43,75},{32,43,75},{32,43,75},{32,38,75},{31,42,54},{31,38,6},{31,38,6},{30,36,9},{26,39,51},{28,36,2},{33,41,2},{33,41,2},{33,41,2},{33,37,2},{52,0,50}, +{31,38,2},{31,38,2},{28,36,1},{62,21,50},{28,36,1},{56,0,72},{33,42,2},{34,39,2},{30,39,1},{56,0,72},{62,25,72},{30,39,1},{0,37,74},{62,25,72},{0,37,74},{32,0,74},{32,0,74},{32,0,74},{32,0,74},{31,38,5},{31,38,5},{31,38,5},{30,35,4},{28,36,1},{28,36,1},{34,50,146},{34,44,79},{34,41,111},{34,40,84},{32,50,244},{32,43,74},{32,41,4}, +{32,39,100},{28,43,248},{29,39,76},{35,48,73},{35,44,3},{35,41,11},{35,40,14},{57,0,243},{32,43,73},{32,41,3},{28,39,74},{50,32,243},{28,39,74},{34,45,75},{34,45,75},{34,45,75},{34,40,75},{32,46,51},{32,41,3},{32,41,3},{32,37,10},{28,41,51},{30,38,2},{35,43,2},{35,43,2},{35,43,2},{35,39,2},{55,0,50},{33,40,1},{33,40,1},{30,38,1},{62,24,50}, +{30,38,1},{59,0,72},{35,44,2},{36,41,2},{31,41,2},{59,0,72},{62,28,72},{31,41,2},{0,39,74},{62,28,72},{0,39,74},{34,0,74},{34,0,74},{34,0,74},{34,0,74},{32,42,1},{32,42,1},{32,42,1},{32,37,1},{30,38,1},{30,38,1},{36,52,146},{36,46,79},{36,43,111},{36,42,84},{34,52,244},{34,45,74},{34,43,4},{34,41,100},{30,45,248},{31,41,76},{37,50,73}, +{37,46,3},{37,43,11},{37,42,14},{60,0,243},{34,45,73},{34,43,3},{30,41,74},{56,32,243},{30,41,74},{36,47,75},{36,47,75},{36,47,75},{36,42,75},{34,47,53},{34,43,3},{34,43,3},{34,39,10},{30,43,51},{32,40,2},{37,45,2},{37,45,2},{37,45,2},{37,41,2},{58,0,50},{35,42,1},{35,42,1},{32,40,1},{62,27,50},{32,40,1},{62,0,72},{37,46,2},{38,43,2}, +{33,43,2},{62,0,72},{62,31,72},{33,43,2},{0,41,74},{62,31,72},{0,41,74},{36,0,74},{36,0,74},{36,0,74},{36,0,74},{34,44,1},{34,44,1},{34,44,1},{34,39,1},{32,40,1},{32,40,1},{38,54,146},{38,49,77},{39,45,120},{38,45,76},{37,53,247},{36,47,78},{37,45,5},{36,43,100},{31,48,243},{33,43,81},{40,50,78},{39,48,4},{40,45,8},{39,45,20},{63,1,243}, +{36,47,74},{37,45,1},{33,43,80},{63,32,243},{33,43,80},{38,50,72},{38,50,72},{38,50,72},{38,44,72},{37,48,54},{37,45,5},{37,45,5},{36,42,8},{32,45,53},{34,42,1},{40,46,4},{40,46,4},{40,46,4},{40,43,4},{53,16,50},{37,45,1},{37,45,1},{35,42,0},{63,30,50},{35,42,0},{63,5,72},{39,48,0},{41,45,1},{36,45,0},{63,5,72},{47,42,72},{36,45,0}, +{0,43,80},{47,42,72},{0,43,80},{38,0,72},{38,0,72},{38,0,72},{38,0,72},{37,45,4},{37,45,4},{37,45,4},{37,41,4},{34,42,1},{34,42,1},{40,56,146},{40,51,77},{41,47,120},{40,47,76},{39,55,247},{38,49,77},{39,47,5},{38,45,100},{34,49,248},{35,45,81},{42,52,78},{41,50,4},{42,47,8},{41,47,20},{63,7,243},{38,49,73},{39,47,1},{35,45,80},{63,35,243}, +{35,45,80},{40,52,72},{40,52,72},{40,52,72},{40,46,72},{39,50,54},{39,47,5},{39,47,5},{38,44,8},{34,47,53},{36,44,1},{42,48,4},{42,48,4},{42,48,4},{42,45,4},{56,16,50},{39,47,1},{39,47,1},{37,44,0},{62,33,50},{37,44,0},{63,11,72},{41,50,0},{43,47,1},{38,47,0},{63,11,72},{47,45,72},{38,47,0},{0,45,80},{47,45,72},{0,45,80},{40,0,72}, +{40,0,72},{40,0,72},{40,0,72},{39,47,4},{39,47,4},{39,47,4},{39,43,4},{36,44,1},{36,44,1},{42,58,146},{42,53,77},{43,49,121},{42,48,81},{41,57,247},{40,51,77},{40,49,9},{40,47,100},{36,51,248},{37,47,81},{44,54,78},{43,52,4},{44,49,6},{43,48,17},{63,13,243},{40,51,73},{40,49,5},{37,47,80},{63,38,243},{37,47,80},{42,54,72},{42,54,72},{42,54,72}, +{42,48,72},{41,52,54},{41,48,6},{41,48,6},{40,46,8},{36,49,51},{38,46,1},{44,50,4},{44,50,4},{44,50,4},{44,47,4},{59,16,50},{41,48,2},{41,48,2},{39,46,0},{62,36,50},{39,46,0},{55,32,72},{43,52,0},{44,49,2},{40,49,1},{55,32,72},{46,48,72},{40,49,1},{0,47,80},{46,48,72},{0,47,80},{42,0,72},{42,0,72},{42,0,72},{42,0,72},{41,48,5}, +{41,48,5},{41,48,5},{41,45,4},{38,46,1},{38,46,1},{44,60,146},{44,55,77},{45,51,121},{44,50,81},{43,59,247},{42,53,77},{42,51,9},{42,49,103},{38,53,248},{39,49,76},{46,56,78},{45,54,4},{46,51,6},{45,50,17},{63,19,243},{42,53,73},{42,51,5},{38,49,74},{63,41,243},{38,49,74},{44,56,72},{44,56,72},{44,56,72},{44,50,72},{43,54,54},{43,50,6},{43,50,6}, +{42,48,9},{38,51,51},{40,48,2},{46,52,4},{46,52,4},{46,52,4},{46,49,4},{62,16,50},{43,50,2},{43,50,2},{40,48,1},{62,39,50},{40,48,1},{58,32,72},{45,54,0},{46,51,2},{42,51,1},{58,32,72},{52,48,72},{42,51,1},{0,49,74},{52,48,72},{0,49,74},{44,0,72},{44,0,72},{44,0,72},{44,0,72},{43,50,5},{43,50,5},{43,50,5},{43,47,4},{40,48,1}, +{40,48,1},{46,63,146},{46,57,79},{47,53,115},{46,53,78},{45,61,245},{45,55,77},{45,53,2},{44,51,105},{39,56,243},{42,51,82},{48,59,76},{48,55,9},{48,53,8},{47,53,18},{59,33,243},{44,55,74},{45,53,1},{41,51,80},{55,48,243},{41,51,80},{46,59,74},{46,59,74},{46,59,74},{46,52,75},{45,57,51},{45,53,2},{45,53,2},{44,50,10},{41,53,51},{42,50,1},{48,54,4}, +{48,54,4},{48,54,4},{48,51,4},{63,21,50},{45,53,1},{45,53,1},{43,50,0},{63,42,50},{43,50,0},{63,29,72},{47,56,2},{49,53,1},{44,53,1},{63,29,72},{63,46,72},{44,53,1},{0,51,80},{63,46,72},{0,51,80},{46,0,74},{46,0,74},{46,0,74},{46,0,74},{45,53,1},{45,53,1},{45,53,1},{45,49,1},{42,50,1},{42,50,1},{48,63,152},{48,59,77},{49,55,120}, +{48,55,76},{47,63,245},{47,57,77},{47,55,2},{46,53,105},{41,58,243},{44,53,82},{50,61,76},{49,58,4},{50,55,8},{49,55,20},{62,33,243},{46,57,74},{47,55,1},{43,53,80},{61,48,243},{43,53,80},{48,60,72},{48,60,72},{48,60,72},{48,54,72},{47,59,51},{47,55,2},{47,55,2},{46,52,10},{43,55,51},{44,52,1},{50,56,4},{50,56,4},{50,56,4},{50,53,4},{63,27,50}, +{47,55,1},{47,55,1},{45,52,0},{63,45,50},{45,52,0},{63,35,72},{49,58,0},{51,55,1},{46,55,1},{63,35,72},{63,49,72},{46,55,1},{0,53,80},{63,49,72},{0,53,80},{48,0,72},{48,0,72},{48,0,72},{48,0,72},{47,55,1},{47,55,1},{47,55,1},{47,51,1},{44,52,1},{44,52,1},{51,63,184},{50,61,77},{51,57,120},{50,57,76},{49,63,268},{48,59,78},{49,57,5}, +{48,55,100},{43,60,243},{46,55,82},{52,63,76},{51,60,4},{52,57,8},{51,57,20},{63,37,243},{48,59,74},{49,57,1},{45,55,80},{63,50,243},{45,55,80},{50,62,72},{50,62,72},{50,62,72},{50,56,72},{49,60,56},{49,57,5},{49,57,5},{48,54,8},{45,57,51},{46,54,1},{52,58,4},{52,58,4},{52,58,4},{52,55,4},{63,33,50},{49,57,1},{49,57,1},{47,54,0},{47,56,50}, +{47,54,0},{63,41,72},{51,60,0},{53,57,1},{48,57,0},{63,41,72},{63,52,72},{48,57,0},{0,55,80},{63,52,72},{0,55,80},{50,0,72},{50,0,72},{50,0,72},{50,0,72},{49,57,4},{49,57,4},{49,57,4},{49,53,4},{46,54,1},{46,54,1},{53,63,226},{52,63,77},{53,59,120},{52,59,76},{52,63,300},{50,61,78},{51,59,5},{50,57,100},{45,62,243},{47,57,84},{54,63,84}, +{53,62,4},{54,59,8},{53,59,20},{63,43,243},{49,62,73},{51,59,1},{47,57,80},{63,53,243},{47,57,80},{52,63,76},{52,63,76},{52,63,76},{52,58,72},{51,62,56},{51,59,5},{51,59,5},{50,56,8},{47,59,51},{48,56,1},{54,60,4},{54,60,4},{54,60,4},{54,57,4},{63,39,50},{51,59,1},{51,59,1},{49,56,0},{47,59,50},{49,56,0},{63,47,72},{53,62,0},{55,59,1}, +{50,59,0},{63,47,72},{63,55,72},{50,59,0},{0,57,80},{63,55,72},{0,57,80},{52,0,72},{52,0,72},{52,0,72},{52,0,72},{51,59,4},{51,59,4},{51,59,4},{51,55,4},{48,56,1},{48,56,1},{56,63,314},{55,63,115},{55,62,115},{54,61,76},{54,63,364},{53,63,79},{53,61,3},{52,59,108},{48,63,252},{49,60,79},{57,63,115},{56,63,10},{56,61,11},{56,61,18},{63,50,243}, +{53,63,78},{53,61,2},{47,60,75},{62,57,243},{47,60,75},{54,63,99},{54,63,99},{54,63,99},{54,60,75},{53,63,69},{53,61,2},{53,61,2},{53,58,6},{49,61,51},{50,58,6},{56,63,1},{56,63,1},{56,63,1},{56,59,2},{61,49,50},{53,61,1},{53,61,1},{51,58,2},{63,54,50},{51,58,2},{63,53,74},{56,63,9},{57,61,1},{53,61,1},{63,53,74},{63,58,74},{53,61,1}, +{0,60,74},{63,58,74},{0,60,74},{54,0,74},{54,0,74},{54,0,74},{54,0,74},{53,61,2},{53,61,2},{53,61,2},{53,57,2},{50,59,2},{50,59,2},{57,63,371},{57,63,179},{57,63,115},{56,63,75},{57,63,387},{55,63,123},{55,63,2},{54,61,91},{52,63,286},{51,62,70},{59,63,146},{58,63,59},{58,63,10},{58,63,17},{63,55,221},{57,63,98},{55,63,1},{49,62,66},{63,59,221}, +{49,62,66},{57,63,115},{57,63,115},{57,63,115},{56,62,75},{56,63,93},{55,63,2},{55,63,2},{55,60,6},{51,63,51},{52,60,6},{58,63,10},{58,63,10},{58,63,10},{58,61,2},{63,51,50},{55,63,1},{55,63,1},{53,60,2},{63,57,50},{53,60,2},{63,59,61},{60,63,25},{59,63,0},{55,63,0},{63,59,61},{63,61,61},{55,63,0},{0,62,65},{63,61,61},{0,62,65},{56,0,74}, +{56,0,74},{56,0,74},{56,0,74},{55,63,2},{55,63,2},{55,63,2},{55,59,2},{52,61,2},{52,61,2},{60,63,259},{59,63,190},{59,63,154},{58,63,90},{59,63,270},{58,63,91},{57,63,35},{57,62,22},{56,63,194},{54,63,11},{61,63,70},{60,63,42},{60,63,26},{60,63,2},{63,59,94},{60,63,42},{59,63,13},{53,63,10},{63,61,94},{53,63,10},{59,63,154},{59,63,154},{59,63,154}, +{58,63,90},{58,63,147},{57,63,35},{57,63,35},{57,62,6},{55,63,77},{54,62,6},{60,63,26},{60,63,26},{60,63,26},{60,63,2},{63,57,50},{59,63,13},{59,63,13},{55,62,2},{63,60,50},{55,62,2},{63,62,5},{62,63,4},{62,63,0},{61,63,0},{63,62,5},{62,63,5},{61,63,0},{0,63,9},{62,63,5},{0,63,9},{58,0,74},{58,0,74},{58,0,74},{58,0,74},{57,63,10}, +{57,63,10},{57,63,10},{57,61,2},{54,63,2},{54,63,2},{61,63,162},{61,63,135},{61,63,126},{60,63,90},{61,63,154},{60,63,66},{60,63,50},{59,63,2},{59,63,109},{57,63,10},{62,63,19},{62,63,14},{62,63,10},{62,63,5},{63,62,17},{62,63,12},{62,63,8},{59,63,1},{62,63,17},{59,63,1},{61,63,126},{61,63,126},{61,63,126},{60,63,90},{60,63,98},{60,63,50},{60,63,50}, +{59,63,2},{58,63,62},{57,63,10},{62,63,10},{62,63,10},{62,63,10},{62,63,5},{63,61,13},{62,63,8},{62,63,8},{59,63,1},{63,62,13},{59,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{60,0,74},{60,0,74},{60,0,74},{60,0,74},{60,63,34},{60,63,34},{60,63,34},{59,63,2},{57,63,10}, +{57,63,10},{0,14,202},{0,10,25},{0,7,1},{0,6,74},{0,10,441},{0,6,282},{0,5,133},{0,4,318},{0,5,477},{0,4,343},{0,14,202},{0,10,25},{0,7,1},{0,6,74},{5,0,441},{0,6,282},{0,5,133},{0,4,318},{10,0,441},{0,4,318},{0,7,0},{0,7,0},{0,7,0},{0,3,1},{0,3,41},{0,3,17},{0,3,17},{0,2,26},{0,2,45},{0,1,30},{0,7,0}, +{0,7,0},{0,7,0},{0,3,1},{2,0,41},{0,3,17},{0,3,17},{0,2,26},{3,0,41},{0,2,26},{7,0,202},{0,10,25},{0,7,1},{0,6,74},{7,0,202},{14,0,202},{0,6,74},{0,5,202},{14,0,202},{0,5,202},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,20,200},{0,14,1},{0,10,25}, +{0,8,41},{0,14,686},{0,9,362},{0,8,141},{0,5,467},{0,6,762},{0,5,503},{0,20,200},{0,14,1},{0,10,25},{0,8,41},{7,0,686},{0,9,362},{0,8,141},{0,5,467},{14,0,686},{0,5,467},{0,13,0},{0,13,0},{0,13,0},{0,6,1},{0,6,145},{0,5,52},{0,5,52},{0,3,89},{0,3,161},{0,3,105},{0,13,0},{0,13,0},{0,13,0},{0,6,1},{3,0,145}, +{0,5,52},{0,5,52},{0,3,89},{6,0,145},{0,3,89},{2,16,200},{0,14,1},{2,9,1},{0,8,41},{2,16,200},{20,0,200},{0,8,41},{0,7,202},{20,0,200},{0,7,202},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,24,225},{1,16,27},{1,12,83},{1,11,51},{0,19,724},{0,12,299},{0,10,62}, +{0,8,414},{0,9,875},{0,7,500},{2,22,201},{2,16,6},{2,12,26},{1,11,35},{10,0,723},{0,12,299},{0,10,62},{0,8,414},{14,3,723},{0,8,414},{1,17,25},{1,17,25},{1,17,25},{1,9,25},{0,12,162},{0,8,25},{0,8,25},{0,5,61},{0,5,216},{0,5,97},{2,15,1},{2,15,1},{2,15,1},{2,8,2},{6,0,162},{0,8,25},{0,8,25},{0,5,61},{12,0,162}, +{0,5,61},{5,16,200},{1,16,2},{4,11,1},{0,11,17},{5,16,200},{26,0,200},{0,11,17},{0,9,202},{26,0,200},{0,9,202},{1,0,25},{1,0,25},{1,0,25},{1,0,25},{0,5,1},{0,5,1},{0,5,1},{0,3,1},{0,2,8},{0,2,8},{2,28,313},{2,19,118},{2,14,203},{2,13,130},{0,25,724},{0,16,236},{0,13,6},{0,10,339},{0,11,984},{0,10,508},{4,24,201}, +{4,17,5},{4,14,26},{3,13,35},{13,0,723},{0,16,236},{0,13,6},{0,10,339},{14,6,723},{0,10,339},{2,21,113},{2,21,113},{2,21,113},{2,11,114},{0,18,162},{0,12,2},{0,12,2},{0,7,34},{0,8,280},{0,7,115},{4,17,1},{4,17,1},{4,17,1},{4,10,2},{9,0,162},{0,12,2},{0,12,2},{0,7,34},{18,0,162},{0,7,34},{16,0,200},{3,18,2},{6,13,1}, +{0,13,2},{16,0,200},{32,0,200},{0,13,2},{0,11,202},{32,0,200},{0,11,202},{2,0,113},{2,0,113},{2,0,113},{2,0,113},{0,11,1},{0,11,1},{0,11,1},{0,6,1},{0,5,40},{0,5,40},{4,31,408},{4,22,216},{4,16,317},{3,15,216},{1,30,723},{1,19,216},{1,15,9},{0,12,312},{0,15,1000},{0,12,440},{6,27,200},{6,20,1},{7,16,29},{5,15,36},{16,0,723}, +{0,19,203},{2,15,5},{0,12,296},{32,0,723},{0,12,296},{4,23,209},{4,23,209},{4,23,209},{4,14,208},{1,23,162},{1,16,4},{1,16,4},{1,10,20},{0,11,294},{0,10,89},{6,19,1},{6,19,1},{6,19,1},{6,13,0},{12,1,162},{2,15,1},{2,15,1},{0,10,8},{25,0,162},{0,10,8},{19,1,200},{6,20,1},{8,15,5},{2,15,4},{19,1,200},{39,0,200},{2,15,4}, +{0,13,200},{39,0,200},{0,13,200},{3,0,208},{3,0,208},{3,0,208},{3,0,208},{1,16,0},{1,16,0},{1,16,0},{1,9,1},{0,8,45},{0,8,45},{6,33,408},{6,24,216},{6,18,317},{5,17,213},{3,32,723},{3,21,216},{3,17,2},{2,14,312},{0,18,888},{0,14,293},{8,29,200},{8,22,1},{9,17,26},{8,17,37},{19,0,723},{1,22,200},{3,17,2},{0,14,257},{38,0,723}, +{0,14,257},{6,25,209},{6,25,209},{6,25,209},{5,16,208},{3,25,162},{3,17,1},{3,17,1},{3,12,20},{0,15,228},{0,12,20},{8,21,1},{8,21,1},{8,21,1},{8,15,0},{15,1,162},{3,17,1},{3,17,1},{0,12,4},{31,0,162},{0,12,4},{22,1,200},{8,22,1},{10,17,2},{3,17,1},{22,1,200},{45,0,200},{3,17,1},{0,15,200},{45,0,200},{0,15,200},{5,0,208}, +{5,0,208},{5,0,208},{5,0,208},{3,18,0},{3,18,0},{3,18,0},{3,11,1},{0,11,13},{0,11,13},{8,35,408},{8,26,216},{8,20,317},{7,19,213},{5,34,723},{5,23,216},{5,19,2},{4,16,298},{0,22,804},{0,16,228},{10,31,200},{10,24,1},{11,19,26},{10,19,37},{22,0,723},{3,24,200},{5,19,2},{0,16,227},{44,0,723},{0,16,227},{8,27,209},{8,27,209},{8,27,209}, +{7,18,208},{5,27,162},{5,19,1},{5,19,1},{5,14,20},{0,18,180},{0,15,4},{10,23,1},{10,23,1},{10,23,1},{10,17,1},{15,7,162},{5,19,1},{5,19,1},{2,14,4},{31,3,162},{2,14,4},{25,1,200},{10,24,1},{12,19,2},{5,19,1},{25,1,200},{47,2,200},{5,19,1},{0,17,202},{47,2,200},{0,17,202},{7,0,208},{7,0,208},{7,0,208},{7,0,208},{5,20,0}, +{5,20,0},{5,20,0},{5,13,1},{0,15,0},{0,15,0},{10,37,408},{10,28,216},{10,22,317},{9,21,213},{7,36,723},{7,25,216},{7,21,2},{6,18,298},{0,25,748},{1,19,218},{12,33,200},{12,26,1},{13,21,26},{12,21,37},{25,0,723},{5,26,200},{7,21,2},{0,19,211},{50,0,723},{0,19,211},{10,29,209},{10,29,209},{10,29,209},{9,20,208},{7,29,162},{7,21,1},{7,21,1}, +{7,16,17},{0,21,164},{3,16,3},{12,25,1},{12,25,1},{12,25,1},{12,19,1},{15,13,162},{7,21,1},{7,21,1},{4,16,1},{31,6,162},{4,16,1},{28,1,200},{12,26,1},{14,21,2},{7,21,1},{28,1,200},{47,5,200},{7,21,1},{0,19,202},{47,5,200},{0,19,202},{9,0,208},{9,0,208},{9,0,208},{9,0,208},{7,22,0},{7,22,0},{7,22,0},{7,15,1},{2,17,0}, +{2,17,0},{12,39,404},{12,30,212},{13,24,318},{12,23,215},{9,39,724},{9,27,212},{9,24,7},{8,20,306},{0,28,724},{3,21,210},{14,35,203},{14,28,2},{15,24,22},{14,23,30},{28,1,723},{7,28,203},{10,23,4},{0,21,201},{47,5,723},{0,21,201},{12,32,202},{12,32,202},{12,32,202},{12,22,202},{9,31,165},{9,24,3},{9,24,3},{9,18,14},{2,24,164},{4,19,6},{14,28,1}, +{14,28,1},{14,28,1},{14,21,1},{24,1,162},{10,23,0},{10,23,0},{6,18,5},{49,0,162},{6,18,5},{23,17,200},{14,28,1},{16,24,4},{10,23,4},{23,17,200},{63,0,200},{10,23,4},{0,21,200},{63,0,200},{0,21,200},{12,0,202},{12,0,202},{12,0,202},{12,0,202},{9,25,1},{9,25,1},{9,25,1},{9,17,2},{4,19,2},{4,19,2},{14,41,404},{14,32,215},{15,26,318}, +{14,25,215},{11,41,724},{11,29,212},{11,26,7},{10,22,306},{2,30,724},{5,23,210},{16,37,200},{16,30,1},{17,26,24},{16,25,40},{31,1,723},{9,30,203},{12,25,4},{2,23,201},{47,8,723},{2,23,201},{14,34,202},{14,34,202},{14,34,202},{14,24,202},{11,33,163},{11,26,3},{11,26,3},{11,20,14},{4,26,164},{6,21,6},{16,30,0},{16,30,0},{16,30,0},{16,23,0},{27,1,162}, +{12,25,0},{12,25,0},{8,20,5},{55,0,162},{8,20,5},{34,1,200},{16,30,1},{18,26,4},{12,25,4},{34,1,200},{63,3,200},{12,25,4},{0,23,200},{63,3,200},{0,23,200},{14,0,202},{14,0,202},{14,0,202},{14,0,202},{11,27,1},{11,27,1},{11,27,1},{11,19,2},{6,21,2},{6,21,2},{16,43,408},{16,34,216},{16,28,312},{16,27,221},{13,43,724},{13,31,212},{13,28,7}, +{12,24,306},{4,32,724},{7,25,210},{18,39,200},{18,32,1},{19,28,24},{17,27,36},{34,0,723},{11,32,201},{14,27,4},{4,25,201},{47,11,723},{4,25,201},{16,35,209},{16,35,209},{16,35,209},{16,26,208},{13,35,163},{13,28,3},{13,28,3},{13,22,14},{6,28,164},{8,23,6},{18,31,1},{18,31,1},{18,31,1},{18,25,0},{30,1,162},{14,27,0},{14,27,0},{10,22,5},{61,0,162}, +{10,22,5},{37,1,200},{18,32,1},{20,28,4},{14,27,4},{37,1,200},{63,6,200},{14,27,4},{0,25,200},{63,6,200},{0,25,200},{16,0,208},{16,0,208},{16,0,208},{16,0,208},{13,29,1},{13,29,1},{13,29,1},{13,21,2},{8,23,2},{8,23,2},{18,45,408},{18,36,216},{18,30,312},{17,29,216},{15,45,724},{15,33,210},{15,30,7},{14,26,306},{6,34,724},{9,27,210},{20,41,200}, +{20,34,1},{21,30,24},{19,29,36},{37,0,723},{13,34,201},{16,29,5},{6,27,201},{47,14,723},{6,27,201},{18,37,209},{18,37,209},{18,37,209},{18,28,208},{15,37,163},{15,30,3},{15,30,3},{15,24,14},{8,30,164},{10,25,6},{20,33,1},{20,33,1},{20,33,1},{20,27,0},{33,1,162},{16,29,1},{16,29,1},{12,24,5},{63,2,162},{12,24,5},{40,1,200},{20,34,1},{22,30,4}, +{16,29,4},{40,1,200},{63,9,200},{16,29,4},{0,27,200},{63,9,200},{0,27,200},{17,0,208},{17,0,208},{17,0,208},{17,0,208},{15,31,1},{15,31,1},{15,31,1},{15,23,2},{10,25,2},{10,25,2},{20,47,404},{20,38,212},{21,32,318},{20,31,215},{17,47,724},{17,35,212},{17,32,7},{16,29,308},{8,36,724},{11,29,210},{22,44,201},{22,36,2},{23,32,22},{22,31,35},{40,1,723}, +{15,36,206},{17,32,6},{9,29,202},{63,9,723},{9,29,202},{20,40,202},{20,40,202},{20,40,202},{20,30,203},{17,39,165},{17,32,3},{17,32,3},{17,26,19},{10,32,164},{13,27,2},{22,36,1},{22,36,1},{22,36,1},{22,29,2},{31,12,162},{18,31,1},{18,31,1},{13,27,1},{62,6,162},{13,27,1},{44,0,200},{22,36,1},{24,32,4},{16,32,4},{44,0,200},{62,13,200},{16,32,4}, +{0,29,202},{62,13,200},{0,29,202},{20,0,202},{20,0,202},{20,0,202},{20,0,202},{17,33,1},{17,33,1},{17,33,1},{17,25,1},{13,27,1},{13,27,1},{22,49,404},{22,40,212},{23,34,318},{22,33,215},{19,49,724},{19,37,212},{19,34,7},{18,31,308},{10,38,724},{13,31,210},{24,46,201},{24,38,2},{25,34,22},{24,33,30},{43,1,723},{17,38,203},{20,33,4},{11,31,202},{63,12,723}, +{11,31,202},{22,42,202},{22,42,202},{22,42,202},{22,32,202},{19,41,165},{19,34,3},{19,34,3},{19,28,19},{12,34,164},{15,29,2},{24,38,1},{24,38,1},{24,38,1},{24,31,2},{31,18,162},{20,33,0},{20,33,0},{15,29,1},{62,9,162},{15,29,1},{47,0,200},{24,38,1},{26,34,4},{20,33,4},{47,0,200},{46,24,200},{20,33,4},{0,31,202},{46,24,200},{0,31,202},{22,0,202}, +{22,0,202},{22,0,202},{22,0,202},{19,35,1},{19,35,1},{19,35,1},{19,27,1},{15,29,1},{15,29,1},{24,51,404},{24,42,212},{25,36,318},{24,35,215},{21,51,724},{21,39,212},{21,36,7},{20,32,306},{12,40,724},{15,33,213},{26,47,203},{26,40,2},{27,36,22},{26,35,30},{46,1,723},{19,40,203},{22,35,4},{13,33,200},{63,15,723},{13,33,200},{24,44,202},{24,44,202},{24,44,202}, +{24,34,202},{21,43,165},{21,36,3},{21,36,3},{21,30,19},{14,36,164},{17,31,2},{26,40,1},{26,40,1},{26,40,1},{26,33,1},{34,17,162},{22,35,0},{22,35,0},{17,31,1},{62,12,162},{17,31,1},{49,1,200},{26,40,1},{28,36,4},{22,35,4},{49,1,200},{46,27,200},{22,35,4},{0,33,200},{46,27,200},{0,33,200},{24,0,202},{24,0,202},{24,0,202},{24,0,202},{21,37,1}, +{21,37,1},{21,37,1},{21,29,1},{17,31,1},{17,31,1},{26,53,404},{26,44,212},{27,38,318},{26,37,215},{23,53,724},{23,41,212},{23,38,7},{22,34,306},{14,42,724},{17,35,210},{28,49,203},{28,42,2},{29,38,22},{28,37,30},{47,5,723},{21,42,203},{24,37,4},{15,35,200},{63,18,723},{15,35,200},{26,46,202},{26,46,202},{26,46,202},{26,36,202},{23,45,165},{23,38,3},{23,38,3}, +{23,32,14},{16,38,164},{18,33,6},{28,42,1},{28,42,1},{28,42,1},{28,35,1},{37,17,162},{24,37,0},{24,37,0},{20,32,5},{62,15,162},{20,32,5},{52,1,200},{28,42,1},{30,38,4},{24,37,4},{52,1,200},{46,30,200},{24,37,4},{0,35,200},{46,30,200},{0,35,200},{26,0,202},{26,0,202},{26,0,202},{26,0,202},{23,39,1},{23,39,1},{23,39,1},{23,31,1},{18,33,2}, +{18,33,2},{28,56,400},{28,46,216},{29,40,314},{28,39,213},{26,53,728},{25,44,215},{25,40,9},{25,37,306},{17,44,728},{19,37,210},{31,50,204},{30,45,4},{31,40,21},{30,39,29},{52,1,723},{24,44,201},{25,40,5},{17,37,202},{46,30,723},{17,37,202},{28,49,200},{28,49,200},{28,49,200},{28,38,201},{26,46,166},{26,39,6},{26,39,6},{25,34,17},{18,40,163},{21,35,2},{31,43,4}, +{31,43,4},{31,43,4},{31,37,4},{49,0,162},{26,39,2},{26,39,2},{21,35,1},{62,18,162},{21,35,1},{56,0,200},{30,45,0},{32,40,2},{25,40,1},{56,0,200},{62,25,200},{25,40,1},{0,37,202},{62,25,200},{0,37,202},{28,0,200},{28,0,200},{28,0,200},{28,0,200},{26,39,5},{26,39,5},{26,39,5},{25,33,4},{21,35,1},{21,35,1},{30,58,400},{30,48,217},{31,42,314}, +{30,41,213},{28,55,728},{27,46,215},{27,42,9},{27,39,306},{19,46,728},{21,39,210},{32,54,201},{32,47,3},{33,42,19},{32,41,35},{55,1,723},{26,46,201},{27,42,5},{19,39,202},{47,32,723},{19,39,202},{30,51,200},{30,51,200},{30,51,200},{30,40,201},{28,48,166},{28,41,6},{28,41,6},{27,36,17},{20,42,163},{23,37,2},{32,46,2},{32,46,2},{32,46,2},{32,39,2},{52,0,162}, +{28,41,2},{28,41,2},{23,37,1},{62,21,162},{23,37,1},{59,0,200},{32,47,2},{34,42,2},{27,42,1},{59,0,200},{62,28,200},{27,42,1},{0,39,202},{62,28,200},{0,39,202},{30,0,200},{30,0,200},{30,0,200},{30,0,200},{28,41,5},{28,41,5},{28,41,5},{27,35,4},{23,37,1},{23,37,1},{32,60,402},{32,50,212},{32,44,324},{32,43,215},{30,57,728},{29,47,216},{29,44,9}, +{29,41,306},{20,48,724},{23,41,210},{34,56,201},{34,48,2},{35,44,19},{34,43,35},{58,1,723},{28,48,201},{29,44,5},{21,41,202},{53,32,723},{21,41,202},{32,52,202},{32,52,202},{32,52,202},{32,42,203},{30,50,166},{30,43,6},{30,43,6},{29,38,17},{22,44,163},{25,39,2},{34,48,1},{34,48,1},{34,48,1},{34,41,2},{55,0,162},{30,43,2},{30,43,2},{25,39,1},{62,24,162}, +{25,39,1},{62,0,200},{34,48,1},{36,44,2},{29,44,1},{62,0,200},{62,31,200},{29,44,1},{0,41,202},{62,31,200},{0,41,202},{32,0,202},{32,0,202},{32,0,202},{32,0,202},{30,43,5},{30,43,5},{30,43,5},{29,37,4},{25,39,1},{25,39,1},{34,62,402},{34,52,212},{34,46,324},{34,45,215},{31,61,728},{31,49,210},{31,46,9},{31,43,306},{22,50,724},{25,43,210},{36,58,201}, +{36,50,2},{37,46,19},{36,45,35},{61,1,723},{30,50,201},{31,46,5},{23,43,202},{59,32,723},{23,43,202},{34,54,202},{34,54,202},{34,54,202},{34,44,203},{31,54,166},{31,46,8},{31,46,8},{31,40,17},{24,46,163},{27,41,2},{36,50,1},{36,50,1},{36,50,1},{36,43,2},{58,0,162},{32,45,1},{32,45,1},{27,41,1},{62,27,162},{27,41,1},{63,4,200},{36,50,1},{38,46,2}, +{31,46,1},{63,4,200},{62,34,200},{31,46,1},{0,43,202},{62,34,200},{0,43,202},{34,0,202},{34,0,202},{34,0,202},{34,0,202},{31,47,5},{31,47,5},{31,47,5},{31,39,4},{27,41,1},{27,41,1},{36,63,408},{36,54,216},{37,48,314},{36,47,217},{34,62,727},{33,52,215},{33,48,9},{32,45,308},{24,53,723},{28,45,217},{39,58,206},{38,53,4},{39,48,21},{38,47,36},{63,4,723}, +{32,52,201},{33,48,5},{26,45,208},{62,34,723},{26,45,208},{36,57,200},{36,57,200},{36,57,200},{36,47,201},{34,54,166},{33,48,8},{33,48,8},{33,43,20},{26,48,163},{29,43,1},{39,51,4},{39,51,4},{39,51,4},{39,45,4},{53,16,162},{35,47,4},{35,47,4},{30,43,0},{63,30,162},{30,43,0},{63,11,200},{38,53,0},{40,48,2},{33,48,1},{63,11,200},{47,45,200},{33,48,1}, +{0,45,208},{47,45,200},{0,45,208},{36,0,200},{36,0,200},{36,0,200},{36,0,200},{34,47,5},{34,47,5},{34,47,5},{34,41,4},{29,43,1},{29,43,1},{39,63,440},{38,56,216},{39,50,314},{38,49,213},{36,63,728},{35,54,215},{35,50,9},{34,47,308},{26,55,723},{30,47,217},{41,60,206},{40,55,4},{41,50,21},{40,49,29},{63,10,723},{34,54,201},{35,50,5},{28,47,208},{62,37,723}, +{28,47,208},{38,59,200},{38,59,200},{38,59,200},{38,48,201},{36,56,166},{36,49,6},{36,49,6},{35,45,20},{28,50,163},{31,45,1},{41,53,4},{41,53,4},{41,53,4},{41,47,4},{56,16,162},{36,49,2},{36,49,2},{32,45,0},{62,33,162},{32,45,0},{55,32,200},{40,55,0},{42,50,2},{35,50,1},{55,32,200},{46,48,200},{35,50,1},{0,47,208},{46,48,200},{0,47,208},{38,0,200}, +{38,0,200},{38,0,200},{38,0,200},{36,49,5},{36,49,5},{36,49,5},{36,43,4},{31,45,1},{31,45,1},{41,63,482},{40,58,216},{41,52,314},{40,51,213},{39,63,760},{37,56,215},{37,52,9},{37,49,306},{28,57,723},{31,49,215},{43,62,206},{42,57,4},{43,52,21},{42,51,29},{63,16,723},{36,56,201},{37,52,5},{29,49,203},{62,40,723},{29,49,203},{40,61,200},{40,61,200},{40,61,200}, +{40,50,201},{38,58,166},{38,51,6},{38,51,6},{37,47,20},{30,52,163},{33,47,1},{43,55,4},{43,55,4},{43,55,4},{43,49,4},{59,16,162},{38,51,2},{38,51,2},{34,47,0},{62,36,162},{34,47,0},{58,32,200},{42,57,0},{44,52,2},{37,52,1},{58,32,200},{52,48,200},{37,52,1},{0,49,202},{52,48,200},{0,49,202},{40,0,200},{40,0,200},{40,0,200},{40,0,200},{38,51,5}, +{38,51,5},{38,51,5},{38,45,4},{33,47,1},{33,47,1},{43,63,530},{42,60,216},{43,54,314},{42,53,213},{41,63,799},{39,58,215},{39,54,9},{39,51,306},{30,59,723},{33,51,210},{45,63,212},{44,59,4},{45,54,21},{44,53,29},{63,22,723},{38,58,201},{39,54,5},{31,51,203},{62,43,723},{31,51,203},{42,63,200},{42,63,200},{42,63,200},{42,52,201},{40,60,166},{40,53,6},{40,53,6}, +{39,48,17},{32,54,163},{35,49,2},{45,57,4},{45,57,4},{45,57,4},{45,51,4},{62,16,162},{40,53,2},{40,53,2},{35,49,1},{62,39,162},{35,49,1},{61,32,200},{44,59,0},{46,54,2},{39,54,1},{61,32,200},{58,48,200},{39,54,1},{0,51,202},{58,48,200},{0,51,202},{42,0,200},{42,0,200},{42,0,200},{42,0,200},{40,53,5},{40,53,5},{40,53,5},{40,47,4},{35,49,1}, +{35,49,1},{46,63,626},{44,63,222},{45,57,315},{44,56,211},{44,63,869},{41,60,213},{42,56,2},{41,53,298},{32,61,723},{36,53,217},{48,63,244},{47,60,5},{47,56,26},{46,55,34},{61,32,723},{40,60,202},{42,56,1},{34,53,208},{58,48,723},{34,53,208},{44,63,218},{44,63,218},{44,63,218},{44,55,203},{42,63,163},{42,56,2},{42,56,2},{41,51,25},{35,56,163},{37,51,1},{47,60,1}, +{47,60,1},{47,60,1},{47,53,2},{63,21,162},{42,56,1},{42,56,1},{38,51,0},{63,42,162},{38,51,0},{63,35,200},{46,61,2},{49,56,1},{41,56,1},{63,35,200},{63,49,200},{41,56,1},{0,53,208},{63,49,200},{0,53,208},{44,0,202},{44,0,202},{44,0,202},{44,0,202},{42,56,1},{42,56,1},{42,56,1},{42,49,1},{37,51,1},{37,51,1},{48,63,728},{47,63,238},{47,59,315}, +{46,58,211},{46,63,937},{43,62,213},{44,58,2},{43,55,298},{34,63,723},{38,55,217},{50,63,286},{48,63,4},{49,58,20},{48,57,36},{63,34,723},{42,62,202},{44,58,1},{36,55,208},{62,49,723},{36,55,208},{47,63,234},{47,63,234},{47,63,234},{46,57,203},{44,63,181},{44,58,2},{44,58,2},{43,53,25},{37,58,163},{39,53,1},{49,61,4},{49,61,4},{49,61,4},{49,55,4},{63,27,162}, +{44,58,1},{44,58,1},{40,53,0},{63,45,162},{40,53,0},{63,41,200},{48,63,0},{51,58,1},{43,58,1},{63,41,200},{63,52,200},{43,58,1},{0,55,208},{63,52,200},{0,55,208},{46,0,202},{46,0,202},{46,0,202},{46,0,202},{44,58,1},{44,58,1},{44,58,1},{44,51,1},{39,53,1},{39,53,1},{50,63,866},{49,63,317},{49,61,312},{48,60,216},{48,63,1048},{46,63,219},{46,60,2}, +{45,57,298},{38,63,748},{40,57,217},{53,63,350},{51,63,20},{51,60,20},{50,59,36},{63,40,723},{46,63,218},{46,60,1},{38,57,208},{62,52,723},{38,57,208},{48,63,264},{48,63,264},{48,63,264},{48,59,201},{47,63,205},{46,60,2},{46,60,2},{45,55,25},{39,60,163},{41,55,1},{51,63,4},{51,63,4},{51,63,4},{51,57,4},{63,33,162},{46,60,1},{46,60,1},{42,55,0},{47,56,162}, +{42,55,0},{63,47,200},{52,63,13},{53,60,1},{45,60,1},{63,47,200},{63,55,200},{45,60,1},{0,57,208},{63,55,200},{0,57,208},{48,0,200},{48,0,200},{48,0,200},{48,0,200},{46,60,1},{46,60,1},{46,60,1},{46,53,1},{41,55,1},{41,55,1},{53,63,1026},{51,63,440},{51,63,312},{50,62,216},{51,63,1144},{48,63,280},{48,62,5},{47,59,298},{43,63,827},{42,59,217},{55,63,428}, +{54,63,100},{53,62,20},{52,61,36},{63,46,723},{49,63,266},{48,62,1},{40,59,208},{62,55,723},{40,59,208},{51,63,296},{51,63,296},{51,63,296},{50,61,201},{49,63,248},{48,62,5},{48,62,5},{47,57,25},{41,62,163},{43,57,1},{53,63,13},{53,63,13},{53,63,13},{53,59,4},{63,39,162},{48,62,1},{48,62,1},{44,57,0},{47,59,162},{44,57,0},{63,53,200},{55,63,53},{55,62,1}, +{47,62,1},{63,53,200},{63,58,200},{47,62,1},{0,59,208},{63,58,200},{0,59,208},{50,0,200},{50,0,200},{50,0,200},{50,0,200},{48,62,4},{48,62,4},{48,62,4},{48,55,4},{43,57,1},{43,57,1},{54,63,955},{54,63,523},{53,63,362},{52,63,202},{54,63,1027},{51,63,283},{50,63,14},{49,60,198},{47,63,735},{44,61,118},{57,63,338},{56,63,141},{56,63,41},{55,63,17},{63,51,546}, +{53,63,233},{51,63,2},{43,61,113},{63,57,546},{43,61,113},{53,63,362},{53,63,362},{53,63,362},{52,63,202},{51,63,315},{50,63,14},{50,63,14},{49,59,19},{44,63,171},{46,59,3},{56,63,41},{56,63,41},{56,63,41},{55,61,2},{61,49,162},{51,63,2},{51,63,2},{47,59,1},{63,54,162},{47,59,1},{63,57,113},{58,63,50},{57,63,1},{52,63,0},{63,57,113},{63,60,113},{52,63,0}, +{0,61,113},{63,60,113},{0,61,113},{52,0,202},{52,0,202},{52,0,202},{52,0,202},{50,63,5},{50,63,5},{50,63,5},{50,57,2},{45,60,0},{45,60,0},{57,63,779},{56,63,542},{56,63,442},{54,63,227},{56,63,830},{54,63,251},{53,63,78},{51,62,70},{51,63,587},{47,62,25},{59,63,218},{58,63,123},{58,63,74},{57,63,2},{63,55,333},{56,63,145},{55,63,25},{47,62,25},{63,59,333}, +{47,62,25},{56,63,442},{56,63,442},{56,63,442},{54,63,227},{54,63,371},{53,63,78},{53,63,78},{51,61,19},{48,63,219},{47,61,6},{58,63,74},{58,63,74},{58,63,74},{57,63,2},{63,51,162},{55,63,25},{55,63,25},{48,61,2},{63,57,162},{48,61,2},{63,60,25},{61,63,10},{60,63,1},{58,63,0},{63,60,25},{62,62,25},{58,63,0},{0,62,25},{62,62,25},{0,62,25},{54,0,202}, +{54,0,202},{54,0,202},{54,0,202},{52,63,26},{52,63,26},{52,63,26},{52,59,2},{47,62,0},{47,62,0},{59,63,684},{57,63,538},{57,63,474},{57,63,282},{57,63,682},{56,63,285},{55,63,171},{53,63,18},{54,63,482},{49,63,5},{60,63,153},{60,63,105},{60,63,89},{59,63,37},{63,59,193},{58,63,107},{58,63,58},{50,63,1},{63,61,193},{50,63,1},{57,63,474},{57,63,474},{57,63,474}, +{57,63,282},{57,63,426},{55,63,171},{55,63,171},{53,63,18},{52,63,278},{49,63,5},{60,63,89},{60,63,89},{60,63,89},{59,63,37},{63,57,145},{58,63,58},{58,63,58},{50,63,1},{63,60,145},{50,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{56,0,202},{56,0,202},{56,0,202},{56,0,202},{54,63,50}, +{54,63,50},{54,63,50},{54,61,2},{49,63,5},{49,63,5},{60,63,426},{59,63,375},{59,63,339},{58,63,251},{59,63,415},{57,63,202},{57,63,138},{56,63,2},{55,63,295},{53,63,29},{62,63,43},{62,63,38},{62,63,34},{61,63,10},{63,61,54},{61,63,27},{60,63,17},{56,63,1},{63,62,54},{56,63,1},{59,63,339},{59,63,339},{59,63,339},{58,63,251},{59,63,294},{57,63,138},{57,63,138}, +{56,63,2},{55,63,174},{53,63,29},{62,63,34},{62,63,34},{62,63,34},{61,63,10},{63,60,41},{60,63,17},{60,63,17},{56,63,1},{62,62,41},{56,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{58,0,202},{58,0,202},{58,0,202},{58,0,202},{57,63,74},{57,63,74},{57,63,74},{56,63,2},{53,63,29}, +{53,63,29},{0,20,421},{0,14,50},{0,10,4},{0,9,157},{0,14,925},{0,9,589},{0,8,264},{0,6,701},{0,6,1005},{0,5,738},{0,20,421},{0,14,50},{0,10,4},{0,9,157},{7,0,925},{0,9,589},{0,8,264},{0,6,701},{14,0,925},{0,6,701},{0,10,0},{0,10,0},{0,10,0},{0,5,0},{0,5,85},{0,4,34},{0,4,34},{0,2,50},{0,2,93},{0,2,54},{0,10,0}, +{0,10,0},{0,10,0},{0,5,0},{2,1,85},{0,4,34},{0,4,34},{0,2,50},{5,0,85},{0,2,50},{10,1,421},{0,14,50},{0,10,4},{0,9,157},{10,1,421},{20,0,421},{0,9,157},{0,7,421},{20,0,421},{0,7,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,26,421},{0,18,13},{0,13,20}, +{0,11,100},{0,18,1261},{0,11,701},{0,10,294},{0,7,857},{0,8,1382},{0,7,938},{0,26,421},{0,18,13},{0,13,20},{0,11,100},{9,0,1261},{0,11,701},{0,10,294},{0,7,857},{18,0,1261},{0,7,857},{0,16,0},{0,16,0},{0,16,0},{0,8,0},{0,8,221},{0,6,89},{0,6,89},{0,4,125},{0,4,246},{0,4,150},{0,16,0},{0,16,0},{0,16,0},{0,8,0},{4,0,221}, +{0,6,89},{0,6,89},{0,4,125},{8,0,221},{0,4,125},{13,1,421},{0,18,13},{2,12,4},{0,11,100},{13,1,421},{26,0,421},{0,11,100},{0,9,421},{26,0,421},{0,9,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,32,430},{0,22,10},{1,15,70},{0,13,70},{0,22,1517},{0,14,730},{0,13,257}, +{0,9,974},{0,11,1713},{0,8,1109},{1,30,422},{1,21,5},{2,15,45},{0,13,70},{11,1,1514},{0,14,730},{0,13,257},{0,9,974},{15,4,1514},{0,9,974},{0,22,9},{0,22,9},{0,22,9},{0,11,9},{0,12,338},{0,9,106},{0,9,106},{0,5,181},{0,5,392},{0,5,217},{1,20,1},{1,20,1},{1,20,1},{1,10,2},{6,0,338},{0,9,106},{0,9,106},{0,5,181},{12,0,338}, +{0,5,181},{16,0,421},{0,22,1},{4,14,4},{0,13,61},{16,0,421},{32,0,421},{0,13,61},{0,11,421},{32,0,421},{0,11,421},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,2,1},{0,2,1},{0,2,1},{0,1,1},{0,1,2},{0,1,2},{1,36,486},{1,24,69},{2,17,163},{1,16,115},{0,28,1517},{0,18,614},{0,15,126},{0,11,857},{0,14,1841},{0,11,1053},{3,32,422}, +{3,23,5},{3,17,46},{2,15,70},{14,1,1514},{0,18,614},{0,15,126},{0,11,857},{15,7,1514},{0,11,857},{1,26,65},{1,26,65},{1,26,65},{1,13,66},{0,18,338},{0,13,45},{0,13,45},{0,8,125},{0,8,456},{0,7,211},{3,22,1},{3,22,1},{3,22,1},{3,12,2},{9,0,338},{0,13,45},{0,13,45},{0,8,125},{18,0,338},{0,8,125},{19,0,421},{2,24,1},{6,16,1}, +{0,16,37},{19,0,421},{38,0,421},{0,16,37},{0,13,421},{38,0,421},{0,13,421},{1,0,65},{1,0,65},{1,0,65},{1,0,65},{0,8,1},{0,8,1},{0,8,1},{0,4,1},{0,3,25},{0,3,25},{3,39,629},{3,27,213},{3,20,365},{2,18,237},{0,35,1514},{0,22,506},{0,18,24},{0,14,750},{0,16,2003},{0,13,1050},{5,35,421},{5,25,2},{6,19,45},{5,17,72},{17,1,1514}, +{0,22,506},{0,18,24},{0,14,750},{35,0,1514},{0,14,750},{3,28,209},{3,28,209},{3,28,209},{2,16,208},{0,25,338},{0,17,9},{0,17,9},{0,10,72},{0,11,566},{0,10,241},{5,24,1},{5,24,1},{5,24,1},{5,15,0},{12,1,338},{0,17,9},{0,17,9},{0,10,72},{25,0,338},{0,10,72},{22,1,421},{4,26,1},{8,18,5},{0,18,8},{22,1,421},{45,0,421},{0,18,8}, +{0,15,421},{45,0,421},{0,15,421},{2,0,208},{2,0,208},{2,0,208},{2,0,208},{0,15,0},{0,15,0},{0,15,0},{0,8,1},{0,6,80},{0,6,80},{4,43,821},{4,30,418},{5,22,621},{3,20,420},{0,41,1514},{0,25,450},{0,20,5},{0,16,670},{0,19,2187},{0,15,1109},{7,37,421},{7,27,2},{8,21,45},{7,19,72},{20,1,1514},{0,25,450},{0,20,5},{0,16,670},{41,0,1514}, +{0,16,670},{4,32,400},{4,32,400},{4,32,400},{4,18,400},{0,31,338},{0,20,1},{0,20,1},{0,13,40},{0,14,694},{0,11,297},{7,26,1},{7,26,1},{7,26,1},{7,17,1},{15,1,338},{0,20,1},{0,20,1},{0,13,40},{31,0,338},{0,13,40},{25,1,421},{6,28,1},{10,20,5},{0,20,4},{25,1,421},{51,0,421},{0,20,4},{0,17,421},{51,0,421},{0,17,421},{3,0,400}, +{3,0,400},{3,0,400},{3,0,400},{0,21,0},{0,21,0},{0,21,0},{0,11,1},{0,8,149},{0,8,149},{5,47,846},{6,32,451},{6,23,662},{5,22,445},{2,43,1515},{1,28,446},{2,22,6},{0,18,638},{0,22,2046},{0,18,878},{9,39,421},{9,29,2},{10,23,45},{9,21,72},{23,1,1514},{0,28,426},{2,22,5},{0,18,589},{47,0,1514},{0,18,589},{5,36,425},{5,36,425},{5,36,425}, +{5,21,426},{2,32,341},{2,22,2},{2,22,2},{1,15,38},{0,16,606},{0,14,158},{9,28,1},{9,28,1},{9,28,1},{9,19,1},{15,7,338},{2,22,1},{2,22,1},{0,15,20},{31,3,338},{0,15,20},{28,1,421},{8,30,1},{12,22,5},{2,22,4},{28,1,421},{57,0,421},{2,22,4},{0,19,421},{57,0,421},{0,19,421},{5,0,425},{5,0,425},{5,0,425},{5,0,425},{2,23,1}, +{2,23,1},{2,23,1},{2,13,2},{0,12,97},{0,12,97},{7,49,846},{8,33,450},{8,25,662},{7,24,445},{4,45,1515},{3,30,446},{4,24,6},{2,20,638},{0,25,1886},{0,19,682},{11,41,421},{11,31,2},{12,25,45},{11,23,72},{26,1,1514},{1,31,421},{4,24,5},{0,20,545},{53,0,1514},{0,20,545},{7,38,425},{7,38,425},{7,38,425},{7,23,426},{4,34,341},{4,24,2},{4,24,2}, +{4,16,42},{0,20,500},{0,16,62},{11,30,1},{11,30,1},{11,30,1},{11,21,1},{15,13,338},{4,24,1},{4,24,1},{0,17,5},{31,6,338},{0,17,5},{31,1,421},{10,32,1},{14,24,5},{4,24,4},{31,1,421},{63,0,421},{4,24,4},{0,21,421},{63,0,421},{0,21,421},{7,0,425},{7,0,425},{7,0,425},{7,0,425},{4,25,1},{4,25,1},{4,25,1},{4,15,2},{0,16,37}, +{0,16,37},{10,49,846},{10,36,445},{11,28,650},{10,26,450},{6,47,1517},{5,32,446},{6,27,3},{4,22,646},{0,29,1751},{0,22,522},{13,44,422},{13,34,3},{14,27,46},{13,26,74},{30,0,1514},{3,33,422},{6,27,3},{0,22,497},{46,7,1514},{0,22,497},{10,39,425},{10,39,425},{10,39,425},{10,24,426},{6,37,338},{6,27,2},{6,27,2},{6,19,40},{0,24,410},{0,19,9},{13,33,1}, +{13,33,1},{13,33,1},{13,23,1},{24,1,338},{7,26,0},{7,26,0},{1,19,5},{49,0,338},{1,19,5},{35,0,421},{12,34,1},{16,27,1},{5,27,1},{35,0,421},{63,3,421},{5,27,1},{0,23,421},{63,3,421},{0,23,421},{10,0,425},{10,0,425},{10,0,425},{10,0,425},{6,28,0},{6,28,0},{6,28,0},{6,17,1},{0,19,5},{0,19,5},{12,51,846},{12,38,445},{13,30,650}, +{12,28,450},{8,49,1517},{7,34,446},{8,29,3},{6,24,646},{0,32,1647},{0,25,458},{15,46,422},{15,36,3},{16,29,42},{15,28,74},{32,1,1514},{5,35,422},{8,29,3},{0,25,457},{46,10,1514},{0,25,457},{12,41,425},{12,41,425},{12,41,425},{12,26,426},{8,39,338},{8,29,2},{8,29,2},{8,21,40},{0,27,362},{1,22,5},{15,35,1},{15,35,1},{15,35,1},{15,25,1},{27,1,338}, +{9,28,0},{9,28,0},{3,21,5},{55,0,338},{3,21,5},{38,0,421},{14,36,1},{18,29,1},{7,29,1},{38,0,421},{63,6,421},{7,29,1},{0,25,421},{63,6,421},{0,25,421},{12,0,425},{12,0,425},{12,0,425},{12,0,425},{8,30,0},{8,30,0},{8,30,0},{8,19,1},{1,22,1},{1,22,1},{14,53,846},{14,40,445},{15,32,661},{14,30,450},{10,51,1517},{9,36,446},{10,31,3}, +{8,26,646},{0,35,1575},{0,27,446},{17,47,421},{17,37,2},{18,31,42},{17,30,73},{35,1,1514},{7,37,422},{10,31,3},{0,27,430},{46,13,1514},{0,27,430},{14,43,425},{14,43,425},{14,43,425},{14,28,426},{10,41,338},{10,31,2},{10,31,2},{10,23,40},{0,31,341},{3,24,5},{17,36,1},{17,36,1},{17,36,1},{17,27,0},{30,1,338},{11,30,0},{11,30,0},{5,23,5},{61,0,338}, +{5,23,5},{41,0,421},{16,38,1},{20,31,1},{9,31,1},{41,0,421},{63,9,421},{9,31,1},{0,27,421},{63,9,421},{0,27,421},{14,0,425},{14,0,425},{14,0,425},{14,0,425},{10,31,1},{10,31,1},{10,31,1},{10,21,1},{3,24,1},{3,24,1},{16,55,854},{16,42,451},{16,33,662},{15,32,446},{12,53,1517},{11,38,446},{12,32,9},{10,28,646},{0,39,1533},{2,29,446},{19,49,421}, +{19,39,2},{20,33,45},{18,31,81},{38,1,1514},{9,39,422},{13,32,6},{0,29,422},{45,16,1514},{0,29,422},{15,47,433},{15,47,433},{15,47,433},{15,31,433},{12,43,338},{12,32,5},{12,32,5},{12,25,40},{1,33,339},{5,26,5},{19,38,1},{19,38,1},{19,38,1},{19,29,0},{33,1,338},{13,32,2},{13,32,2},{7,25,5},{63,2,338},{7,25,5},{44,0,421},{18,40,1},{22,32,5}, +{12,32,5},{44,0,421},{63,12,421},{12,32,5},{0,29,421},{63,12,421},{0,29,421},{15,0,433},{15,0,433},{15,0,433},{15,0,433},{12,33,1},{12,33,1},{12,33,1},{12,23,1},{5,26,1},{5,26,1},{18,58,846},{18,44,445},{19,36,650},{18,34,450},{14,56,1515},{14,40,447},{14,35,7},{13,31,646},{0,42,1515},{5,31,445},{21,52,422},{21,42,2},{22,35,46},{21,34,74},{42,0,1514}, +{12,41,422},{14,35,6},{2,31,425},{62,11,1514},{2,31,425},{18,47,425},{18,47,425},{18,47,425},{18,32,426},{14,46,339},{14,35,6},{14,35,6},{14,27,35},{4,35,341},{8,28,5},{21,41,1},{21,41,1},{21,41,1},{21,31,2},{31,12,338},{15,34,0},{15,34,0},{8,28,1},{62,6,338},{8,28,1},{47,0,421},{21,42,1},{24,35,1},{13,35,1},{47,0,421},{62,16,421},{13,35,1}, +{0,31,425},{62,16,421},{0,31,425},{18,0,425},{18,0,425},{18,0,425},{18,0,425},{14,36,1},{14,36,1},{14,36,1},{14,25,1},{7,29,1},{7,29,1},{20,60,846},{20,46,445},{21,38,650},{20,36,450},{16,58,1514},{16,41,449},{16,37,3},{15,32,630},{2,44,1515},{7,33,441},{23,54,422},{23,44,2},{24,37,46},{23,36,74},{45,0,1514},{14,43,422},{16,37,3},{4,33,421},{62,14,1514}, +{4,33,421},{20,49,425},{20,49,425},{20,49,425},{20,34,426},{16,47,340},{16,37,2},{16,37,2},{16,29,34},{6,37,341},{10,30,5},{23,43,1},{23,43,1},{23,43,1},{23,33,1},{31,18,338},{17,36,0},{17,36,0},{10,30,1},{62,9,338},{10,30,1},{50,0,421},{23,44,1},{26,37,1},{15,37,1},{50,0,421},{62,19,421},{15,37,1},{0,33,421},{62,19,421},{0,33,421},{20,0,425}, +{20,0,425},{20,0,425},{20,0,425},{16,38,0},{16,38,0},{16,38,0},{16,27,0},{9,31,1},{9,31,1},{22,62,846},{22,48,445},{23,40,650},{22,38,450},{18,60,1514},{18,43,449},{18,39,3},{16,34,646},{4,46,1515},{9,35,441},{25,56,422},{25,46,2},{26,39,46},{25,38,74},{47,2,1514},{16,45,425},{18,39,3},{6,35,421},{62,17,1514},{6,35,421},{22,51,425},{22,51,425},{22,51,425}, +{22,36,426},{18,49,338},{18,39,2},{18,39,2},{18,31,34},{8,39,341},{11,32,6},{25,45,1},{25,45,1},{25,45,1},{25,35,1},{34,17,338},{19,38,0},{19,38,0},{12,32,4},{62,12,338},{12,32,4},{53,0,421},{25,46,1},{28,39,1},{17,39,1},{53,0,421},{62,22,421},{17,39,1},{0,35,421},{62,22,421},{0,35,421},{22,0,425},{22,0,425},{22,0,425},{22,0,425},{18,40,0}, +{18,40,0},{18,40,0},{18,29,0},{11,32,2},{11,32,2},{24,63,850},{24,50,445},{25,42,650},{24,40,450},{20,62,1514},{20,45,449},{20,41,3},{18,36,646},{6,48,1517},{11,37,441},{27,58,422},{27,48,3},{28,41,46},{27,40,74},{47,8,1514},{18,47,425},{20,41,3},{8,37,421},{62,20,1514},{8,37,421},{24,53,425},{24,53,425},{24,53,425},{24,38,426},{20,51,338},{20,41,2},{20,41,2}, +{20,33,40},{10,41,341},{13,34,6},{27,47,1},{27,47,1},{27,47,1},{27,37,1},{37,17,338},{21,40,0},{21,40,0},{14,34,4},{62,15,338},{14,34,4},{56,0,421},{26,48,1},{30,41,1},{19,41,1},{56,0,421},{62,25,421},{19,41,1},{0,37,421},{62,25,421},{0,37,421},{24,0,425},{24,0,425},{24,0,425},{24,0,425},{20,42,0},{20,42,0},{20,42,0},{20,31,0},{13,34,2}, +{13,34,2},{26,63,882},{26,52,447},{27,44,646},{26,42,446},{23,62,1526},{22,48,447},{22,43,5},{21,39,646},{8,50,1515},{13,39,443},{30,58,425},{29,50,4},{30,44,45},{29,42,69},{54,0,1514},{20,49,422},{22,43,4},{10,39,426},{47,31,1514},{10,39,426},{26,56,421},{26,56,421},{26,56,421},{26,41,421},{22,54,339},{22,43,5},{22,43,5},{22,35,35},{12,43,338},{16,36,5},{30,48,4}, +{30,48,4},{30,48,4},{30,39,4},{49,0,338},{23,42,2},{23,42,2},{16,36,1},{62,18,338},{16,36,1},{59,0,421},{29,50,0},{32,43,1},{22,43,0},{59,0,421},{62,28,421},{22,43,0},{0,39,425},{62,28,421},{0,39,425},{26,0,421},{26,0,421},{26,0,421},{26,0,421},{22,44,2},{22,44,2},{22,44,2},{22,33,1},{15,37,1},{15,37,1},{29,63,922},{28,54,447},{29,46,646}, +{28,44,446},{25,63,1535},{24,50,447},{24,45,5},{23,41,646},{10,52,1515},{15,41,443},{31,62,425},{31,52,4},{32,45,45},{31,44,69},{57,0,1514},{22,51,422},{24,45,4},{12,41,426},{50,32,1514},{12,41,426},{28,58,421},{28,58,421},{28,58,421},{28,43,421},{24,56,339},{24,45,5},{24,45,5},{24,37,35},{14,45,338},{18,38,5},{31,52,4},{31,52,4},{31,52,4},{31,41,5},{52,0,338}, +{25,44,2},{25,44,2},{18,38,1},{62,21,338},{18,38,1},{62,0,421},{31,52,0},{34,45,1},{24,45,0},{62,0,421},{62,31,421},{24,45,0},{0,41,425},{62,31,421},{0,41,425},{28,0,421},{28,0,421},{28,0,421},{28,0,421},{24,46,2},{24,46,2},{24,46,2},{24,35,1},{17,39,1},{17,39,1},{31,63,994},{30,56,447},{31,48,655},{30,46,446},{28,63,1575},{26,52,447},{26,47,5}, +{25,43,646},{12,54,1515},{17,43,445},{33,63,426},{33,54,2},{34,47,45},{33,46,66},{60,0,1514},{24,53,422},{26,47,4},{14,43,426},{56,32,1514},{14,43,426},{30,60,421},{30,60,421},{30,60,421},{30,45,421},{26,58,339},{26,47,5},{26,47,5},{26,39,35},{16,47,338},{20,40,5},{33,53,1},{33,53,1},{33,53,1},{33,43,2},{55,0,338},{27,46,2},{27,46,2},{20,40,1},{62,24,338}, +{20,40,1},{63,4,421},{33,54,1},{36,47,1},{26,47,0},{63,4,421},{62,34,421},{26,47,0},{0,43,425},{62,34,421},{0,43,425},{30,0,421},{30,0,421},{30,0,421},{30,0,421},{26,48,1},{26,48,1},{26,48,1},{26,37,1},{19,41,1},{19,41,1},{33,63,1082},{32,58,445},{33,50,650},{32,48,450},{30,63,1638},{28,54,447},{28,49,7},{27,45,646},{14,56,1515},{19,45,445},{36,63,434}, +{35,56,2},{36,49,46},{35,48,74},{63,0,1514},{26,55,422},{28,49,6},{16,45,425},{62,32,1514},{16,45,425},{32,61,425},{32,61,425},{32,61,425},{32,47,426},{28,60,339},{28,49,6},{28,49,6},{28,41,35},{18,49,341},{22,42,5},{35,55,1},{35,55,1},{35,55,1},{35,45,2},{58,0,338},{29,48,0},{29,48,0},{22,42,1},{62,27,338},{22,42,1},{63,10,421},{35,56,1},{38,49,1}, +{27,49,1},{63,10,421},{62,37,421},{27,49,1},{0,45,425},{62,37,421},{0,45,425},{32,0,425},{32,0,425},{32,0,425},{32,0,425},{28,50,1},{28,50,1},{28,50,1},{28,39,1},{21,43,1},{21,43,1},{36,63,1206},{34,61,446},{35,52,646},{34,50,446},{33,63,1710},{30,56,445},{31,51,5},{29,47,638},{17,58,1515},{22,47,450},{39,63,469},{37,58,5},{38,52,45},{37,50,69},{63,7,1514}, +{27,58,422},{31,51,1},{19,47,433},{63,35,1514},{19,47,433},{34,63,422},{34,63,422},{34,63,422},{34,49,421},{31,61,342},{31,51,5},{31,51,5},{30,43,36},{20,51,338},{24,44,2},{38,56,4},{38,56,4},{38,56,4},{38,47,4},{53,16,338},{31,51,1},{31,51,1},{25,44,0},{63,30,338},{25,44,0},{63,17,421},{37,58,1},{40,51,1},{30,51,0},{63,17,421},{63,40,421},{30,51,0}, +{0,47,433},{63,40,421},{0,47,433},{34,0,421},{34,0,421},{34,0,421},{34,0,421},{31,51,4},{31,51,4},{31,51,4},{31,41,4},{23,45,1},{23,45,1},{38,63,1350},{36,63,446},{37,54,646},{36,52,446},{36,63,1814},{32,58,447},{32,53,5},{31,48,638},{19,60,1515},{23,49,443},{41,63,517},{39,60,5},{40,54,45},{39,52,69},{63,13,1514},{29,60,422},{32,53,4},{20,49,426},{63,38,1514}, +{20,49,426},{36,63,437},{36,63,437},{36,63,437},{36,51,421},{33,62,347},{32,53,5},{32,53,5},{32,45,33},{22,53,338},{26,46,2},{40,58,4},{40,58,4},{40,58,4},{40,49,4},{56,16,338},{33,52,2},{33,52,2},{27,46,0},{62,33,338},{27,46,0},{63,23,421},{39,60,1},{42,53,1},{32,53,0},{63,23,421},{63,43,421},{32,53,0},{0,49,425},{63,43,421},{0,49,425},{36,0,421}, +{36,0,421},{36,0,421},{36,0,421},{32,54,2},{32,54,2},{32,54,2},{32,43,2},{25,47,1},{25,47,1},{40,63,1466},{38,63,474},{39,56,646},{38,54,446},{38,63,1931},{34,60,447},{34,55,5},{33,51,646},{21,62,1515},{25,51,443},{43,63,569},{41,62,5},{42,56,45},{41,54,69},{63,19,1514},{32,61,422},{34,55,4},{22,51,426},{63,41,1514},{22,51,426},{38,63,470},{38,63,470},{38,63,470}, +{38,53,421},{35,63,355},{34,55,5},{34,55,5},{34,47,33},{24,55,338},{28,48,3},{42,60,4},{42,60,4},{42,60,4},{42,51,4},{59,16,338},{35,54,2},{35,54,2},{28,48,2},{62,36,338},{28,48,2},{63,29,421},{41,62,1},{44,55,1},{34,55,0},{63,29,421},{63,46,421},{34,55,0},{0,51,425},{63,46,421},{0,51,425},{38,0,421},{38,0,421},{38,0,421},{38,0,421},{34,56,2}, +{34,56,2},{34,56,2},{34,45,2},{27,49,1},{27,49,1},{43,63,1634},{41,63,546},{41,58,646},{40,56,446},{40,63,2039},{36,62,447},{36,57,5},{35,53,646},{24,63,1521},{27,53,443},{46,63,633},{44,63,9},{44,58,45},{43,56,69},{63,25,1514},{34,63,422},{36,57,4},{24,53,426},{63,44,1514},{24,53,426},{40,63,502},{40,63,502},{40,63,502},{40,55,421},{37,63,379},{36,57,5},{36,57,5}, +{36,49,35},{26,57,338},{30,50,3},{44,62,4},{44,62,4},{44,62,4},{44,53,4},{62,16,338},{37,56,2},{37,56,2},{30,50,2},{62,39,338},{30,50,2},{63,34,421},{44,63,5},{46,57,1},{36,57,0},{63,34,421},{62,49,421},{36,57,0},{0,53,425},{62,49,421},{0,53,425},{40,0,421},{40,0,421},{40,0,421},{40,0,421},{36,58,2},{36,58,2},{36,58,2},{36,47,2},{29,51,1}, +{29,51,1},{45,63,1866},{43,63,689},{43,60,650},{42,59,447},{43,63,2201},{38,63,469},{39,59,6},{37,55,638},{29,63,1590},{30,55,450},{48,63,741},{46,63,69},{46,60,46},{45,58,70},{62,33,1514},{38,63,465},{39,59,2},{25,56,425},{61,48,1514},{25,56,425},{43,63,545},{43,63,545},{43,63,545},{42,57,422},{40,63,424},{39,59,5},{39,59,5},{38,51,36},{29,59,339},{32,52,2},{46,63,5}, +{46,63,5},{46,63,5},{46,55,2},{63,21,338},{39,59,1},{39,59,1},{33,52,0},{63,42,338},{33,52,0},{63,41,421},{48,63,41},{49,59,2},{38,59,2},{63,41,421},{63,52,421},{38,59,2},{0,56,425},{63,52,421},{0,56,425},{42,0,421},{42,0,421},{42,0,421},{42,0,421},{39,59,4},{39,59,4},{39,59,4},{39,49,4},{31,53,1},{31,53,1},{48,63,2070},{46,63,889},{45,62,650}, +{44,61,447},{46,63,2361},{41,63,573},{41,61,6},{39,57,638},{32,63,1710},{32,57,450},{51,63,837},{49,63,184},{48,62,49},{47,60,70},{63,37,1514},{43,63,545},{41,61,2},{27,58,425},{63,50,1514},{27,58,425},{45,63,614},{45,63,614},{45,63,614},{44,59,422},{43,63,488},{41,61,5},{41,61,5},{40,53,36},{31,61,339},{34,54,2},{48,63,20},{48,63,20},{48,63,20},{48,57,4},{63,27,338}, +{41,61,1},{41,61,1},{35,54,0},{63,45,338},{35,54,0},{63,47,421},{51,63,97},{51,61,2},{40,61,2},{63,47,421},{63,55,421},{40,61,2},{0,58,425},{63,55,421},{0,58,425},{44,0,421},{44,0,421},{44,0,421},{44,0,421},{41,61,4},{41,61,4},{41,61,4},{41,51,4},{33,55,1},{33,55,1},{50,63,2239},{48,63,1109},{47,63,701},{46,62,441},{48,63,2469},{44,63,720},{43,63,5}, +{41,59,605},{37,63,1804},{34,59,417},{54,63,916},{51,63,308},{51,63,52},{49,62,56},{63,43,1459},{46,63,618},{43,63,1},{31,59,400},{63,53,1459},{31,59,400},{47,63,701},{47,63,701},{47,63,701},{46,61,422},{45,63,566},{43,63,5},{43,63,5},{42,55,36},{32,63,341},{36,56,2},{51,63,52},{51,63,52},{51,63,52},{50,59,4},{63,33,338},{43,63,1},{43,63,1},{37,56,0},{47,56,338}, +{37,56,0},{63,53,392},{55,63,157},{53,63,1},{42,63,1},{63,53,392},{63,58,392},{42,63,1},{0,59,400},{63,58,392},{0,59,400},{46,0,421},{46,0,421},{46,0,421},{46,0,421},{43,63,4},{43,63,4},{43,63,4},{43,53,4},{35,57,1},{35,57,1},{51,63,1901},{50,63,1114},{49,63,785},{48,63,421},{51,63,2093},{46,63,574},{45,63,38},{44,60,356},{40,63,1476},{36,60,213},{55,63,684}, +{54,63,260},{53,63,85},{51,63,20},{63,47,1064},{49,63,426},{47,63,8},{35,60,208},{63,55,1064},{35,60,208},{49,63,785},{49,63,785},{49,63,785},{48,63,421},{48,63,661},{45,63,38},{45,63,38},{44,57,36},{37,63,371},{38,58,2},{53,63,85},{53,63,85},{53,63,85},{52,61,4},{63,39,338},{47,63,8},{47,63,8},{39,58,0},{47,59,338},{39,58,0},{63,56,200},{57,63,80},{56,63,1}, +{48,63,0},{63,56,200},{62,60,200},{48,63,0},{0,60,208},{62,60,200},{0,60,208},{48,0,421},{48,0,421},{48,0,421},{48,0,421},{45,63,13},{45,63,13},{45,63,13},{45,55,4},{37,59,1},{37,59,1},{54,63,1646},{52,63,1119},{51,63,886},{50,63,470},{53,63,1761},{48,63,526},{48,63,126},{46,61,146},{44,63,1218},{39,62,69},{57,63,450},{56,63,245},{56,63,145},{54,63,2},{63,51,722}, +{52,63,290},{51,63,50},{38,62,65},{63,57,722},{38,62,65},{51,63,886},{51,63,886},{51,63,886},{50,63,470},{50,63,776},{48,63,126},{48,63,126},{47,59,42},{41,63,446},{40,60,5},{56,63,145},{56,63,145},{56,63,145},{54,63,2},{61,49,338},{51,63,50},{51,63,50},{42,60,1},{63,54,338},{42,60,1},{63,59,61},{60,63,25},{59,63,0},{55,63,0},{63,59,61},{63,61,61},{55,63,0}, +{0,62,65},{63,61,61},{0,62,65},{50,0,421},{50,0,421},{50,0,421},{50,0,421},{48,63,45},{48,63,45},{48,63,45},{47,57,2},{40,61,1},{40,61,1},{56,63,1518},{54,63,1118},{54,63,974},{52,63,565},{54,63,1526},{51,63,534},{51,63,278},{48,62,57},{47,63,1090},{42,63,10},{59,63,354},{58,63,251},{57,63,194},{56,63,50},{63,55,509},{55,63,234},{54,63,106},{42,63,9},{63,59,509}, +{42,63,9},{54,63,974},{54,63,974},{54,63,974},{52,63,565},{53,63,904},{51,63,278},{51,63,278},{48,61,38},{44,63,574},{42,62,5},{57,63,194},{57,63,194},{57,63,194},{56,63,50},{63,51,338},{54,63,106},{54,63,106},{44,62,1},{63,57,338},{44,62,1},{63,62,5},{62,63,4},{62,63,0},{61,63,0},{63,62,5},{62,63,5},{61,63,0},{0,63,9},{62,63,5},{0,63,9},{52,0,421}, +{52,0,421},{52,0,421},{52,0,421},{50,63,72},{50,63,72},{50,63,72},{49,59,5},{42,63,1},{42,63,1},{57,63,1197},{56,63,994},{56,63,894},{54,63,565},{56,63,1210},{54,63,493},{53,63,332},{50,63,13},{51,63,861},{45,63,17},{60,63,209},{60,63,161},{60,63,145},{58,63,50},{63,58,294},{58,63,147},{57,63,89},{47,63,1},{62,61,294},{47,63,1},{56,63,894},{56,63,894},{56,63,894}, +{54,63,565},{54,63,781},{53,63,332},{53,63,332},{50,63,13},{48,63,501},{45,63,17},{60,63,145},{60,63,145},{60,63,145},{58,63,50},{63,55,221},{57,63,89},{57,63,89},{47,63,1},{63,59,221},{47,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{54,0,421},{54,0,421},{54,0,421},{54,0,421},{52,63,117}, +{52,63,117},{52,63,117},{51,61,5},{45,63,17},{45,63,17},{58,63,925},{57,63,765},{57,63,701},{57,63,509},{57,63,845},{55,63,423},{54,63,301},{53,63,5},{52,63,598},{49,63,52},{61,63,97},{61,63,70},{61,63,61},{60,63,17},{63,60,113},{60,63,57},{59,63,40},{53,63,1},{62,62,113},{53,63,1},{57,63,701},{57,63,701},{57,63,701},{57,63,509},{57,63,589},{54,63,301},{54,63,301}, +{53,63,5},{51,63,365},{49,63,52},{61,63,61},{61,63,61},{61,63,61},{60,63,17},{63,58,85},{59,63,40},{59,63,40},{53,63,1},{62,61,85},{53,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{56,0,421},{56,0,421},{56,0,421},{56,0,421},{54,63,157},{54,63,157},{54,63,157},{53,63,5},{49,63,52}, +{49,63,52},{0,29,882},{0,21,116},{0,15,4},{0,13,320},{0,19,1899},{0,14,1214},{0,11,573},{0,8,1421},{0,9,2052},{0,8,1521},{0,29,882},{0,21,116},{0,15,4},{0,13,320},{10,0,1896},{0,14,1214},{0,11,573},{0,8,1421},{14,3,1896},{0,8,1421},{0,14,0},{0,14,0},{0,14,0},{0,7,0},{0,7,162},{0,5,61},{0,5,61},{0,3,100},{0,3,180},{0,3,116},{0,14,0}, +{0,14,0},{0,14,0},{0,7,0},{3,1,162},{0,5,61},{0,5,61},{0,3,100},{7,0,162},{0,3,100},{6,17,882},{0,21,116},{0,15,4},{0,13,320},{6,17,882},{29,0,882},{0,13,320},{0,10,884},{29,0,882},{0,10,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,35,882},{0,25,50},{0,17,10}, +{0,15,260},{0,23,2355},{0,16,1355},{0,14,589},{0,10,1656},{0,11,2567},{0,10,1825},{0,35,882},{0,25,50},{0,17,10},{0,15,260},{3,17,2355},{0,16,1355},{0,14,589},{0,10,1656},{23,0,2355},{0,10,1656},{0,19,1},{0,19,1},{0,19,1},{0,10,0},{0,10,338},{0,8,125},{0,8,125},{0,4,200},{0,5,374},{0,4,225},{0,19,1},{0,19,1},{0,19,1},{0,10,0},{5,0,338}, +{0,8,125},{0,8,125},{0,4,200},{10,0,338},{0,4,200},{17,1,882},{0,25,50},{1,17,2},{0,15,260},{17,1,882},{35,0,882},{0,15,260},{0,12,884},{35,0,882},{0,12,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,41,882},{0,28,10},{1,19,69},{0,17,193},{0,28,2899},{0,19,1539},{0,16,643}, +{0,11,1965},{0,13,3209},{0,11,2161},{0,41,882},{0,28,10},{1,19,53},{0,17,193},{14,0,2899},{0,19,1539},{0,16,643},{0,11,1965},{28,0,2899},{0,11,1965},{0,25,1},{0,25,1},{0,25,1},{0,13,0},{0,13,578},{0,11,221},{0,11,221},{0,6,356},{0,6,644},{0,5,401},{0,25,1},{0,25,1},{0,25,1},{0,13,0},{6,1,578},{0,11,221},{0,11,221},{0,6,356},{13,0,578}, +{0,6,356},{20,1,882},{0,28,10},{3,19,2},{0,17,193},{20,1,882},{41,0,882},{0,17,193},{0,14,884},{41,0,882},{0,14,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,45,902},{1,31,24},{1,21,142},{0,19,166},{0,33,3048},{0,22,1443},{0,18,481},{0,13,1908},{0,16,3492},{0,13,2197},{2,43,886}, +{1,31,8},{3,21,73},{1,19,153},{16,1,3048},{0,22,1443},{0,18,481},{0,13,1908},{33,0,3048},{0,13,1908},{1,29,21},{1,29,21},{1,29,21},{1,15,21},{0,18,648},{0,14,169},{0,14,169},{0,8,325},{0,8,766},{0,7,421},{2,27,5},{2,27,5},{2,27,5},{2,15,4},{9,0,648},{0,14,169},{0,14,169},{0,8,325},{18,0,648},{0,8,325},{23,1,882},{0,31,2},{5,21,2}, +{0,19,130},{23,1,882},{47,0,882},{0,19,130},{0,16,890},{47,0,882},{0,16,890},{1,0,20},{1,0,20},{1,0,20},{1,0,20},{0,5,0},{0,5,0},{0,5,0},{0,2,1},{0,2,5},{0,2,5},{2,49,997},{2,34,114},{3,24,290},{1,22,234},{0,39,3051},{0,25,1256},{0,21,258},{0,16,1764},{0,19,3685},{0,15,2195},{4,46,883},{3,33,10},{5,23,74},{3,21,154},{15,10,3048}, +{0,25,1256},{0,21,258},{0,16,1764},{30,5,3048},{0,16,1764},{2,34,113},{2,34,113},{2,34,113},{2,18,113},{0,25,648},{0,17,89},{0,17,89},{0,10,242},{0,11,876},{0,10,411},{4,30,1},{4,30,1},{4,30,1},{4,17,1},{12,1,648},{0,17,89},{0,17,89},{0,10,242},{25,0,648},{0,10,242},{27,0,882},{3,33,1},{8,23,1},{0,22,80},{27,0,882},{46,4,882},{0,22,80}, +{0,18,884},{46,4,882},{0,18,884},{2,0,113},{2,0,113},{2,0,113},{2,0,113},{0,11,1},{0,11,1},{0,11,1},{0,6,1},{0,5,40},{0,5,40},{3,53,1149},{3,36,274},{4,27,513},{3,24,362},{0,45,3051},{0,28,1128},{0,24,122},{0,18,1605},{0,22,3901},{0,16,2173},{6,47,885},{5,35,10},{7,25,74},{5,23,154},{15,16,3048},{0,28,1128},{0,24,122},{0,18,1605},{30,8,3048}, +{0,18,1605},{3,38,265},{3,38,265},{3,38,265},{3,20,266},{0,31,648},{0,21,34},{0,21,34},{0,13,170},{0,14,1004},{0,11,457},{6,32,1},{6,32,1},{6,32,1},{6,19,1},{15,1,648},{0,21,34},{0,21,34},{0,13,170},{31,0,648},{0,13,170},{30,0,882},{5,35,1},{10,25,1},{0,24,41},{30,0,882},{46,7,882},{0,24,41},{0,20,884},{46,7,882},{0,20,884},{3,0,265}, +{3,0,265},{3,0,265},{3,0,265},{0,17,0},{0,17,0},{0,17,0},{0,9,1},{0,8,104},{0,8,104},{4,57,1365},{4,39,498},{5,28,793},{4,26,561},{0,51,3048},{0,31,1032},{0,26,41},{0,20,1509},{0,24,4147},{0,19,2149},{8,49,885},{7,37,10},{9,27,74},{7,25,154},{17,17,3048},{0,31,1032},{0,26,41},{0,20,1509},{51,0,3048},{0,20,1509},{4,42,481},{4,42,481},{4,42,481}, +{4,23,481},{0,36,650},{0,25,4},{0,25,4},{0,15,130},{0,16,1161},{0,14,481},{8,34,1},{8,34,1},{8,34,1},{8,21,1},{15,7,648},{0,25,4},{0,25,4},{0,15,130},{31,3,648},{0,15,130},{32,1,882},{7,37,1},{12,27,1},{0,26,25},{32,1,882},{46,10,882},{0,26,25},{0,22,884},{46,10,882},{0,22,884},{4,0,481},{4,0,481},{4,0,481},{4,0,481},{0,23,0}, +{0,23,0},{0,23,0},{0,12,1},{0,9,193},{0,9,193},{5,61,1645},{5,42,795},{7,30,1177},{4,28,826},{0,57,3048},{0,35,954},{0,29,9},{0,22,1380},{0,27,4419},{0,21,2197},{10,51,885},{9,39,10},{11,29,74},{9,27,154},{20,17,3048},{0,35,954},{0,29,9},{0,22,1380},{57,0,3048},{0,22,1380},{5,46,761},{5,46,761},{5,46,761},{5,25,762},{0,42,650},{0,28,4},{0,28,4}, +{0,17,85},{0,19,1345},{0,16,557},{10,36,1},{10,36,1},{10,36,1},{10,23,1},{15,13,648},{1,27,1},{1,27,1},{0,17,85},{31,6,648},{0,17,85},{35,1,882},{9,39,1},{14,29,1},{0,29,9},{35,1,882},{46,13,882},{0,29,9},{0,24,884},{46,13,882},{0,24,884},{5,0,761},{5,0,761},{5,0,761},{5,0,761},{0,29,0},{0,29,0},{0,29,0},{0,15,1},{0,11,296}, +{0,11,296},{7,63,1774},{7,44,924},{8,33,1320},{6,30,941},{2,60,3052},{1,38,924},{2,31,10},{0,24,1302},{0,31,4300},{0,24,1942},{12,54,882},{12,40,8},{13,32,68},{11,29,161},{32,0,3048},{0,39,898},{2,31,6},{0,24,1266},{62,1,3048},{0,24,1266},{7,48,885},{7,48,885},{7,48,885},{7,28,884},{2,45,652},{2,31,9},{2,31,9},{1,20,62},{0,22,1275},{0,19,419},{12,39,0}, +{12,39,0},{12,39,0},{12,25,1},{24,1,648},{3,30,0},{3,30,0},{0,20,45},{49,0,648},{0,20,45},{39,0,882},{11,41,1},{16,31,2},{1,31,1},{39,0,882},{62,8,882},{1,31,1},{0,26,882},{62,8,882},{0,26,882},{7,0,884},{7,0,884},{7,0,884},{7,0,884},{2,32,4},{2,32,4},{2,32,4},{2,17,4},{0,16,250},{0,16,250},{9,63,1798},{9,46,924},{10,35,1320}, +{9,32,936},{4,62,3052},{3,40,924},{4,33,9},{2,26,1302},{0,33,4023},{0,26,1647},{14,56,882},{14,42,8},{15,34,68},{13,31,161},{35,0,3048},{0,42,882},{4,33,5},{0,27,1170},{62,4,3048},{0,27,1170},{9,50,885},{9,50,885},{9,50,885},{9,30,884},{4,47,652},{4,32,8},{4,32,8},{3,22,62},{0,25,1107},{0,22,243},{14,41,0},{14,41,0},{14,41,0},{14,27,1},{27,1,648}, +{5,32,1},{5,32,1},{0,22,18},{55,0,648},{0,22,18},{42,0,882},{13,43,1},{18,33,1},{2,33,0},{42,0,882},{62,11,882},{2,33,0},{0,28,882},{62,11,882},{0,28,882},{9,0,884},{9,0,884},{9,0,884},{9,0,884},{4,34,4},{4,34,4},{4,34,4},{4,19,4},{0,19,146},{0,19,146},{12,63,1846},{11,48,924},{12,37,1320},{11,34,936},{6,63,3055},{5,42,924},{6,35,9}, +{4,28,1302},{0,36,3799},{0,28,1356},{16,58,883},{16,44,9},{17,35,74},{15,33,161},{38,0,3048},{2,44,882},{6,35,5},{0,29,1110},{62,7,3048},{0,29,1110},{11,52,885},{11,52,885},{11,52,885},{11,32,885},{6,49,652},{6,34,8},{6,34,8},{5,24,62},{0,29,969},{0,24,109},{16,42,1},{16,42,1},{16,42,1},{16,29,2},{30,1,648},{7,34,1},{7,34,1},{0,24,9},{61,0,648}, +{0,24,9},{45,0,882},{15,45,1},{20,35,1},{4,35,0},{45,0,882},{62,14,882},{4,35,0},{0,30,882},{62,14,882},{0,30,882},{11,0,884},{11,0,884},{11,0,884},{11,0,884},{6,36,4},{6,36,4},{6,36,4},{6,21,4},{0,22,74},{0,22,74},{14,63,1912},{13,50,924},{14,39,1320},{13,36,936},{9,63,3087},{7,44,924},{8,37,9},{6,30,1302},{0,39,3607},{0,31,1156},{18,60,883}, +{18,46,9},{19,37,74},{17,35,154},{41,0,3048},{4,46,882},{8,37,5},{0,31,1035},{62,10,3048},{0,31,1035},{13,54,885},{13,54,885},{13,54,885},{13,34,885},{8,51,652},{8,36,8},{8,36,8},{7,26,62},{0,33,846},{0,27,37},{18,44,1},{18,44,1},{18,44,1},{18,31,2},{33,1,648},{9,36,1},{9,36,1},{0,27,1},{63,2,648},{0,27,1},{47,2,882},{16,48,1},{22,37,1}, +{6,37,0},{47,2,882},{62,17,882},{6,37,0},{0,32,884},{62,17,882},{0,32,884},{13,0,884},{13,0,884},{13,0,884},{13,0,884},{8,38,4},{8,38,4},{8,38,4},{8,23,4},{0,26,29},{0,26,29},{16,63,2014},{15,52,932},{16,40,1341},{15,38,932},{12,63,3141},{9,46,924},{10,39,7},{9,32,1308},{0,43,3436},{0,33,1003},{20,62,884},{20,48,8},{21,40,74},{19,37,161},{36,16,3048}, +{6,48,882},{10,39,6},{0,33,978},{63,13,3048},{0,33,978},{15,57,882},{15,57,882},{15,57,882},{15,36,882},{10,54,649},{10,39,6},{10,39,6},{9,28,61},{0,36,737},{1,29,8},{20,47,0},{20,47,0},{20,47,0},{20,33,1},{31,12,648},{11,38,1},{11,38,1},{2,29,1},{62,6,648},{2,29,1},{51,0,882},{19,49,1},{24,39,1},{9,39,1},{51,0,882},{47,28,882},{9,39,1}, +{0,34,882},{47,28,882},{0,34,882},{15,0,882},{15,0,882},{15,0,882},{15,0,882},{10,40,2},{10,40,2},{10,40,2},{10,25,2},{0,30,2},{0,30,2},{19,63,2126},{17,54,924},{18,42,1341},{16,40,941},{14,63,3204},{11,48,924},{12,41,7},{11,34,1308},{0,46,3300},{0,35,939},{22,63,890},{22,50,8},{23,42,74},{21,39,161},{39,16,3048},{8,50,882},{12,41,6},{0,35,939},{62,16,3048}, +{0,35,939},{17,59,884},{17,59,884},{17,59,884},{17,38,884},{12,56,649},{12,41,6},{12,41,6},{11,30,61},{0,39,681},{3,31,8},{22,49,0},{22,49,0},{22,49,0},{22,35,1},{31,18,648},{13,40,1},{13,40,1},{4,31,1},{62,9,648},{4,31,1},{54,0,882},{21,51,1},{26,41,1},{11,41,1},{54,0,882},{47,31,882},{11,41,1},{0,36,882},{47,31,882},{0,36,882},{17,0,884}, +{17,0,884},{17,0,884},{17,0,884},{12,42,2},{12,42,2},{12,42,2},{12,27,2},{2,32,1},{2,32,1},{20,63,2264},{19,56,924},{20,44,1341},{18,42,941},{17,63,3292},{13,50,924},{14,43,7},{13,36,1308},{0,50,3192},{0,38,923},{25,63,906},{24,52,8},{25,44,74},{23,41,161},{50,0,3048},{10,52,882},{14,43,6},{0,38,907},{62,19,3048},{0,38,907},{19,61,884},{19,61,884},{19,61,884}, +{19,40,884},{14,58,649},{14,43,6},{14,43,6},{13,32,67},{0,42,657},{4,33,10},{24,51,0},{24,51,0},{24,51,0},{24,37,1},{34,17,648},{15,42,1},{15,42,1},{6,33,1},{62,12,648},{6,33,1},{57,0,882},{23,53,1},{28,43,1},{13,43,1},{57,0,882},{50,32,882},{13,43,1},{0,38,882},{50,32,882},{0,38,882},{19,0,884},{19,0,884},{19,0,884},{19,0,884},{14,44,2}, +{14,44,2},{14,44,2},{14,29,2},{4,34,1},{4,34,1},{23,63,2376},{21,58,924},{22,46,1341},{20,44,941},{19,63,3391},{15,52,924},{16,45,10},{15,38,1308},{0,53,3112},{2,40,923},{27,63,948},{26,54,8},{27,46,74},{25,43,161},{53,0,3048},{12,54,882},{16,45,6},{0,40,891},{62,22,3048},{0,40,891},{21,63,884},{21,63,884},{21,63,884},{21,42,884},{16,59,652},{16,45,9},{16,45,9}, +{15,34,67},{1,45,650},{6,35,10},{26,53,0},{26,53,0},{26,53,0},{26,39,1},{37,17,648},{17,44,0},{17,44,0},{8,35,1},{62,15,648},{8,35,1},{60,0,882},{25,55,1},{30,45,1},{15,45,1},{60,0,882},{56,32,882},{15,45,1},{0,40,882},{56,32,882},{0,40,882},{21,0,884},{21,0,884},{21,0,884},{21,0,884},{16,46,4},{16,46,4},{16,46,4},{16,31,4},{6,36,1}, +{6,36,1},{26,63,2564},{23,61,927},{24,49,1324},{23,47,935},{22,63,3529},{17,54,924},{18,47,10},{17,41,1302},{0,56,3060},{5,42,924},{30,63,1003},{28,57,6},{29,48,67},{28,46,158},{56,1,3048},{15,56,883},{19,47,8},{1,42,884},{63,25,3048},{1,42,884},{23,63,891},{23,63,891},{23,63,891},{23,44,883},{18,62,649},{18,47,6},{18,47,6},{17,36,61},{4,47,652},{9,37,8},{28,55,2}, +{28,55,2},{28,55,2},{28,42,2},{49,0,648},{19,46,2},{19,46,2},{11,37,0},{62,18,648},{11,37,0},{63,1,882},{27,58,2},{32,47,4},{17,47,5},{63,1,882},{63,32,882},{17,47,5},{0,42,884},{63,32,882},{0,42,884},{23,0,882},{23,0,882},{23,0,882},{23,0,882},{18,48,2},{18,48,2},{18,48,2},{18,33,2},{8,38,1},{8,38,1},{28,63,2774},{25,63,927},{26,51,1324}, +{25,48,932},{25,63,3681},{19,56,924},{20,49,7},{19,43,1302},{0,59,3052},{7,44,924},{32,63,1074},{30,59,6},{31,50,67},{30,48,170},{59,1,3048},{16,58,885},{20,49,6},{3,44,884},{63,28,3048},{3,44,884},{25,63,918},{25,63,918},{25,63,918},{25,46,883},{20,63,651},{20,49,6},{20,49,6},{19,38,61},{5,49,651},{11,39,8},{30,57,2},{30,57,2},{30,57,2},{30,44,2},{52,0,648}, +{21,48,1},{21,48,1},{13,39,0},{62,21,648},{13,39,0},{63,7,882},{29,60,2},{34,49,1},{19,49,1},{63,7,882},{63,35,882},{19,49,1},{0,44,884},{63,35,882},{0,44,884},{25,0,882},{25,0,882},{25,0,882},{25,0,882},{20,50,2},{20,50,2},{20,50,2},{20,35,2},{10,40,1},{10,40,1},{31,63,2998},{28,63,951},{28,53,1324},{27,50,932},{26,63,3844},{21,58,924},{22,51,7}, +{21,45,1302},{2,61,3052},{9,46,924},{34,63,1146},{32,61,9},{33,52,74},{32,50,169},{62,1,3048},{18,60,885},{22,51,6},{5,46,884},{63,31,3048},{5,46,884},{28,63,950},{28,63,950},{28,63,950},{27,48,882},{23,63,675},{22,51,6},{22,51,6},{21,40,61},{7,51,651},{13,41,8},{32,59,0},{32,59,0},{32,59,0},{32,46,1},{55,0,648},{23,50,1},{23,50,1},{15,41,0},{62,24,648}, +{15,41,0},{63,13,882},{31,62,2},{36,51,1},{21,51,1},{63,13,882},{63,38,882},{21,51,1},{0,46,884},{63,38,882},{0,46,884},{27,0,882},{27,0,882},{27,0,882},{27,0,882},{22,52,2},{22,52,2},{22,52,2},{22,37,2},{12,42,1},{12,42,1},{33,63,3224},{30,63,1031},{30,55,1324},{29,52,932},{29,63,3996},{23,60,924},{24,53,7},{23,47,1302},{4,63,3052},{11,48,922},{37,63,1226}, +{34,63,9},{35,54,74},{33,51,161},{63,5,3048},{20,62,885},{24,53,6},{6,48,882},{47,42,3048},{6,48,882},{30,63,995},{30,63,995},{30,63,995},{29,50,882},{25,63,705},{24,53,6},{24,53,6},{23,42,61},{9,53,651},{15,43,8},{34,61,0},{34,61,0},{34,61,0},{34,47,4},{58,0,648},{25,52,1},{25,52,1},{16,43,1},{62,27,648},{16,43,1},{63,19,882},{33,63,4},{38,53,1}, +{23,53,1},{63,19,882},{63,41,882},{23,53,1},{0,48,882},{63,41,882},{0,48,882},{29,0,882},{29,0,882},{29,0,882},{29,0,882},{24,54,2},{24,54,2},{24,54,2},{24,39,2},{14,44,1},{14,44,1},{34,63,3510},{32,63,1202},{33,57,1335},{31,54,936},{33,63,4252},{25,63,925},{26,55,13},{25,49,1309},{9,63,3091},{13,50,918},{40,63,1349},{37,63,38},{37,56,77},{36,54,158},{60,17,3048}, +{24,63,894},{27,55,8},{9,50,884},{63,37,3048},{9,50,884},{32,63,1058},{32,63,1058},{32,63,1058},{31,52,885},{28,63,762},{26,55,9},{26,55,9},{26,44,61},{11,56,650},{17,45,11},{36,63,2},{36,63,2},{36,63,2},{36,50,2},{53,16,648},{28,54,1},{28,54,1},{19,45,1},{63,30,648},{19,45,1},{59,33,882},{37,63,29},{40,56,4},{26,55,4},{59,33,882},{55,48,882},{26,55,4}, +{0,50,884},{55,48,882},{0,50,884},{31,0,884},{31,0,884},{31,0,884},{31,0,884},{26,57,0},{26,57,0},{26,57,0},{26,42,1},{16,47,2},{16,47,2},{37,63,3734},{34,63,1399},{35,59,1335},{33,57,935},{34,63,4441},{28,63,957},{28,57,13},{27,51,1309},{13,63,3192},{15,52,918},{43,63,1485},{39,63,131},{39,58,77},{38,56,158},{63,17,3048},{28,63,957},{29,57,8},{11,52,884},{63,40,3048}, +{11,52,884},{34,63,1110},{34,63,1110},{34,63,1110},{33,54,883},{30,63,840},{28,57,9},{28,57,9},{28,46,61},{13,58,650},{19,47,11},{39,63,10},{39,63,10},{39,63,10},{38,52,2},{56,16,648},{30,56,1},{30,56,1},{21,47,1},{62,33,648},{21,47,1},{62,33,882},{41,63,80},{42,58,4},{28,57,4},{62,33,882},{61,48,882},{28,57,4},{0,52,884},{61,48,882},{0,52,884},{33,0,882}, +{33,0,882},{33,0,882},{33,0,882},{28,59,0},{28,59,0},{28,59,0},{28,44,1},{18,48,1},{18,48,1},{40,63,4022},{37,63,1647},{37,61,1335},{35,59,935},{37,63,4657},{31,63,1085},{30,59,13},{29,53,1309},{18,63,3339},{17,54,924},{45,63,1635},{42,63,275},{41,60,77},{40,58,158},{63,23,3048},{32,63,1044},{31,59,8},{13,54,884},{63,43,3048},{13,54,884},{36,63,1203},{36,63,1203},{36,63,1203}, +{35,56,883},{33,63,915},{30,59,9},{30,59,9},{30,48,65},{15,60,650},{21,49,8},{41,63,25},{41,63,25},{41,63,25},{40,54,2},{59,16,648},{32,57,4},{32,57,4},{23,49,0},{62,36,648},{23,49,0},{63,37,882},{44,63,160},{44,60,4},{30,59,4},{63,37,882},{63,50,882},{30,59,4},{0,54,884},{63,50,882},{0,54,884},{35,0,882},{35,0,882},{35,0,882},{35,0,882},{30,61,0}, +{30,61,0},{30,61,0},{30,46,1},{20,50,1},{20,50,1},{42,63,4364},{40,63,1991},{39,63,1335},{37,61,935},{40,63,4905},{34,63,1287},{32,61,10},{31,55,1309},{21,63,3555},{19,56,924},{48,63,1796},{44,63,465},{43,62,77},{42,60,158},{63,29,3048},{35,63,1188},{33,61,8},{15,56,884},{63,46,3048},{15,56,884},{39,63,1299},{39,63,1299},{39,63,1299},{37,58,883},{34,63,1017},{32,61,6},{32,61,6}, +{32,50,66},{17,62,650},{23,51,8},{43,63,45},{43,63,45},{43,63,45},{42,56,2},{62,16,648},{33,60,2},{33,60,2},{25,51,0},{62,39,648},{25,51,0},{63,43,882},{48,63,260},{46,62,4},{30,62,4},{63,43,882},{63,53,882},{30,62,4},{0,56,884},{63,53,882},{0,56,884},{37,0,882},{37,0,882},{37,0,882},{37,0,882},{32,63,1},{32,63,1},{32,63,1},{32,47,2},{22,52,1}, +{22,52,1},{45,63,4441},{43,63,2286},{41,63,1421},{39,62,916},{43,63,4878},{37,63,1410},{34,63,9},{33,57,1141},{26,63,3535},{21,58,795},{50,63,1770},{47,63,609},{46,63,85},{44,62,120},{63,35,2814},{40,63,1194},{35,63,2},{17,58,762},{63,49,2814},{17,58,762},{41,63,1421},{41,63,1421},{41,63,1421},{39,61,885},{37,63,1130},{34,63,9},{34,63,9},{34,52,61},{20,63,651},{25,53,11},{46,63,85}, +{46,63,85},{46,63,85},{44,58,4},{63,21,648},{36,62,1},{36,62,1},{27,53,2},{63,42,648},{27,53,2},{63,48,761},{51,63,305},{48,63,1},{34,63,0},{63,48,761},{62,56,761},{34,63,0},{0,58,761},{62,56,761},{0,58,761},{39,0,884},{39,0,884},{39,0,884},{39,0,884},{34,63,9},{34,63,9},{34,63,9},{34,50,1},{24,55,2},{24,55,2},{46,63,3945},{43,63,2238},{43,63,1509}, +{41,63,885},{45,63,4345},{38,63,1230},{37,63,41},{34,58,781},{30,63,3066},{24,59,494},{51,63,1386},{48,63,530},{48,63,130},{46,62,45},{63,39,2249},{43,63,914},{39,63,8},{21,59,482},{47,59,2249},{21,59,482},{43,63,1509},{43,63,1509},{43,63,1509},{41,63,885},{40,63,1242},{37,63,41},{37,63,41},{36,54,61},{24,63,689},{27,55,11},{48,63,130},{48,63,130},{48,63,130},{46,60,4},{63,27,648}, +{39,63,8},{39,63,8},{29,55,2},{63,45,648},{29,55,2},{63,51,481},{54,63,193},{51,63,1},{40,63,0},{63,51,481},{63,57,481},{40,63,0},{0,59,481},{63,57,481},{0,59,481},{41,0,884},{41,0,884},{41,0,884},{41,0,884},{37,63,25},{37,63,25},{37,63,25},{36,52,1},{26,57,2},{26,57,2},{48,63,3571},{46,63,2182},{46,63,1653},{43,63,900},{46,63,3838},{41,63,1094},{40,63,137}, +{37,59,490},{32,63,2703},{27,60,270},{53,63,1106},{51,63,458},{50,63,193},{48,63,10},{63,43,1769},{46,63,698},{42,63,40},{25,60,266},{63,53,1769},{25,60,266},{46,63,1653},{46,63,1653},{46,63,1653},{43,63,900},{43,63,1386},{40,63,137},{40,63,137},{38,56,61},{29,63,779},{29,57,11},{50,63,193},{50,63,193},{50,63,193},{48,62,1},{63,33,648},{42,63,40},{42,63,40},{31,57,2},{47,56,648}, +{31,57,2},{63,54,265},{57,63,113},{54,63,1},{46,63,0},{63,54,265},{62,59,265},{46,63,0},{0,60,265},{62,59,265},{0,60,265},{43,0,884},{43,0,884},{43,0,884},{43,0,884},{39,63,52},{39,63,52},{39,63,52},{38,54,1},{28,59,2},{28,59,2},{50,63,3307},{48,63,2195},{48,63,1795},{46,63,964},{48,63,3435},{43,63,1026},{42,63,296},{39,60,269},{37,63,2410},{30,61,115},{54,63,882}, +{54,63,450},{53,63,265},{50,63,10},{63,47,1374},{48,63,546},{46,63,89},{29,61,114},{63,55,1374},{29,61,114},{48,63,1795},{48,63,1795},{48,63,1795},{46,63,964},{45,63,1560},{42,63,296},{42,63,296},{40,58,61},{32,63,891},{31,59,11},{53,63,265},{53,63,265},{53,63,265},{50,63,10},{63,39,648},{46,63,89},{46,63,89},{33,59,1},{47,59,648},{33,59,1},{63,57,113},{58,63,50},{57,63,1}, +{52,63,0},{63,57,113},{63,60,113},{52,63,0},{0,61,113},{63,60,113},{0,61,113},{45,0,884},{45,0,884},{45,0,884},{45,0,884},{41,63,97},{41,63,97},{41,63,97},{40,56,1},{30,61,2},{30,61,2},{51,63,3032},{51,63,2264},{50,63,1965},{48,63,1096},{51,63,3096},{46,63,1059},{46,63,530},{41,62,126},{40,63,2191},{33,62,25},{57,63,680},{56,63,465},{55,63,356},{53,63,68},{63,51,1032}, +{52,63,450},{49,63,185},{34,62,20},{63,57,1032},{34,62,20},{50,63,1965},{50,63,1965},{50,63,1965},{48,63,1096},{48,63,1736},{46,63,530},{46,63,530},{42,60,62},{37,63,1086},{33,62,9},{55,63,356},{55,63,356},{55,63,356},{53,63,68},{61,49,648},{49,63,185},{49,63,185},{36,61,4},{63,54,648},{36,61,4},{63,61,18},{61,63,9},{61,63,0},{59,63,0},{63,61,18},{63,62,18},{59,63,0}, +{0,62,20},{63,62,18},{0,62,20},{47,0,890},{47,0,890},{47,0,890},{47,0,890},{44,63,149},{44,63,149},{44,63,149},{42,58,1},{32,63,0},{32,63,0},{54,63,2756},{52,63,2249},{51,63,2004},{50,63,1224},{53,63,2803},{48,63,1092},{48,63,692},{44,62,58},{43,63,1991},{35,63,16},{59,63,566},{57,63,420},{57,63,356},{55,63,125},{63,55,771},{55,63,386},{52,63,241},{38,63,0},{63,59,771}, +{38,63,0},{51,63,2004},{51,63,2004},{51,63,2004},{50,63,1224},{50,63,1802},{48,63,692},{48,63,692},{44,62,42},{40,63,1166},{35,63,16},{57,63,356},{57,63,356},{57,63,356},{55,63,125},{63,50,580},{52,63,241},{52,63,241},{38,63,0},{62,57,580},{38,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{49,0,884}, +{49,0,884},{49,0,884},{49,0,884},{46,63,193},{46,63,193},{46,63,193},{44,60,1},{35,63,16},{35,63,16},{54,63,2276},{54,63,1844},{54,63,1700},{52,63,1125},{54,63,2180},{51,63,948},{49,63,649},{46,63,10},{46,63,1551},{39,63,58},{60,63,324},{59,63,257},{59,63,221},{57,63,68},{63,57,452},{57,63,228},{55,63,137},{44,63,0},{63,60,452},{44,63,0},{54,63,1700},{54,63,1700},{54,63,1700}, +{52,63,1125},{51,63,1460},{49,63,649},{49,63,649},{46,63,10},{43,63,926},{39,63,58},{59,63,221},{59,63,221},{59,63,221},{57,63,68},{63,53,340},{55,63,137},{55,63,137},{44,63,0},{63,58,340},{44,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{51,0,884},{51,0,884},{51,0,884},{51,0,884},{48,63,260}, +{48,63,260},{48,63,260},{46,62,1},{39,63,58},{39,63,58},{57,63,1844},{55,63,1585},{55,63,1464},{54,63,1044},{56,63,1747},{52,63,850},{51,63,596},{48,63,4},{48,63,1204},{43,63,117},{60,63,164},{60,63,116},{60,63,100},{59,63,40},{63,59,216},{58,63,114},{58,63,65},{50,63,0},{63,61,216},{50,63,0},{55,63,1464},{55,63,1464},{55,63,1464},{54,63,1044},{54,63,1188},{51,63,596},{51,63,596}, +{48,63,4},{46,63,750},{43,63,117},{60,63,100},{60,63,100},{60,63,100},{59,63,40},{63,56,164},{58,63,65},{58,63,65},{50,63,0},{62,60,164},{50,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{53,0,884},{53,0,884},{53,0,884},{53,0,884},{51,63,340},{51,63,340},{51,63,340},{48,63,4},{43,63,117}, +{43,63,117},{0,39,1568},{0,28,194},{0,19,10},{0,16,586},{0,26,3371},{0,17,2169},{0,16,1027},{0,10,2532},{0,12,3648},{0,10,2701},{0,39,1568},{0,28,194},{0,19,10},{0,16,586},{5,16,3371},{0,17,2169},{0,16,1027},{0,10,2532},{26,0,3371},{0,10,2532},{0,18,0},{0,18,0},{0,18,0},{0,9,0},{0,9,288},{0,8,109},{0,8,109},{0,4,164},{0,4,321},{0,4,189},{0,18,0}, +{0,18,0},{0,18,0},{0,9,0},{4,1,288},{0,8,109},{0,8,109},{0,4,164},{9,0,288},{0,4,164},{19,1,1568},{0,28,194},{0,19,10},{0,16,586},{19,1,1568},{39,0,1568},{0,16,586},{0,13,1568},{39,0,1568},{0,13,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,45,1568},{0,31,106},{0,22,10}, +{0,18,481},{0,30,3968},{0,19,2355},{0,18,1057},{0,13,2852},{0,14,4319},{0,11,3117},{0,45,1568},{0,31,106},{0,22,10},{0,18,481},{15,0,3968},{0,19,2355},{0,18,1057},{0,13,2852},{30,0,3968},{0,13,2852},{0,24,0},{0,24,0},{0,24,0},{0,12,0},{0,12,512},{0,10,205},{0,10,205},{0,5,313},{0,5,566},{0,5,349},{0,24,0},{0,24,0},{0,24,0},{0,12,0},{6,0,512}, +{0,10,205},{0,10,205},{0,5,313},{12,0,512},{0,5,313},{22,1,1568},{0,31,106},{1,22,1},{0,18,481},{22,1,1568},{45,0,1568},{0,18,481},{0,15,1568},{45,0,1568},{0,15,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,50,1570},{0,34,52},{1,24,58},{0,21,377},{0,34,4652},{0,22,2571},{0,19,1107}, +{0,14,3225},{0,16,5108},{0,13,3525},{0,50,1570},{0,34,52},{1,24,42},{0,21,377},{15,4,4651},{0,22,2571},{0,19,1107},{0,14,3225},{30,2,4651},{0,14,3225},{0,30,0},{0,30,0},{0,30,0},{0,15,0},{0,15,800},{0,11,317},{0,11,317},{0,7,468},{0,7,889},{0,7,549},{0,30,0},{0,30,0},{0,30,0},{0,15,0},{7,1,800},{0,11,317},{0,11,317},{0,7,468},{15,0,800}, +{0,7,468},{25,1,1568},{0,34,52},{3,24,1},{0,21,377},{25,1,1568},{47,2,1568},{0,21,377},{0,17,1570},{47,2,1568},{0,17,1570},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,56,1570},{0,38,13},{1,27,138},{0,24,305},{0,38,5419},{0,25,2819},{0,22,1187},{0,16,3659},{0,17,6013},{0,14,4061},{0,56,1570}, +{0,38,13},{1,27,122},{0,24,305},{19,0,5419},{0,25,2819},{0,22,1187},{0,16,3659},{38,0,5419},{0,16,3659},{0,36,0},{0,36,0},{0,36,0},{0,18,0},{0,18,1152},{0,14,445},{0,14,445},{0,8,697},{0,8,1270},{0,8,797},{0,36,0},{0,36,0},{0,36,0},{0,18,0},{9,0,1152},{0,14,445},{0,14,445},{0,8,697},{18,0,1152},{0,8,697},{28,1,1568},{0,38,13},{5,26,1}, +{0,24,305},{28,1,1568},{47,5,1568},{0,24,305},{0,19,1570},{47,5,1568},{0,19,1570},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,61,1609},{1,41,43},{2,29,250},{1,26,301},{0,45,5419},{0,28,2552},{0,25,820},{0,18,3377},{0,21,6243},{0,18,3953},{2,59,1569},{2,41,10},{3,29,125},{1,26,285},{22,1,5419}, +{0,28,2552},{0,25,820},{0,18,3377},{45,0,5419},{0,18,3377},{1,40,42},{1,40,42},{1,40,42},{1,21,42},{0,25,1152},{0,19,292},{0,19,292},{0,11,569},{0,11,1380},{0,10,747},{2,38,2},{2,38,2},{2,38,2},{2,20,2},{12,1,1152},{0,19,292},{0,19,292},{0,11,569},{25,0,1152},{0,11,569},{23,17,1568},{0,42,1},{7,28,1},{0,26,233},{23,17,1568},{63,0,1568},{0,26,233}, +{0,21,1568},{63,0,1568},{0,21,1568},{1,0,41},{1,0,41},{1,0,41},{1,0,41},{0,7,0},{0,7,0},{0,7,0},{0,3,1},{0,3,17},{0,3,17},{2,63,1731},{2,44,146},{3,31,441},{1,28,370},{0,50,5420},{0,33,2329},{0,27,554},{0,21,3217},{0,23,6476},{0,19,3861},{4,61,1569},{4,43,10},{5,31,125},{3,28,285},{25,1,5419},{0,33,2329},{0,27,554},{0,21,3217},{47,2,5419}, +{0,21,3217},{2,44,146},{2,44,146},{2,44,146},{2,23,146},{0,31,1152},{0,22,180},{0,22,180},{0,13,458},{0,14,1508},{0,13,747},{4,40,2},{4,40,2},{4,40,2},{4,22,2},{15,1,1152},{0,22,180},{0,22,180},{0,13,458},{31,0,1152},{0,13,458},{34,1,1568},{2,44,1},{9,30,1},{0,28,164},{34,1,1568},{63,3,1568},{0,28,164},{0,23,1568},{63,3,1568},{0,23,1568},{2,0,145}, +{2,0,145},{2,0,145},{2,0,145},{0,13,0},{0,13,0},{0,13,0},{0,6,1},{0,5,52},{0,5,52},{4,63,1977},{3,47,318},{5,33,675},{3,30,498},{0,56,5420},{0,36,2129},{0,30,338},{0,22,3012},{0,25,6733},{0,21,3825},{6,63,1569},{6,45,10},{8,33,123},{5,30,285},{28,1,5419},{0,36,2129},{0,30,338},{0,22,3012},{47,5,5419},{0,22,3012},{3,48,313},{3,48,313},{3,48,313}, +{3,26,314},{0,36,1154},{0,25,100},{0,25,100},{0,16,388},{0,16,1665},{0,14,757},{6,42,2},{6,42,2},{6,42,2},{6,24,2},{15,7,1152},{0,25,100},{0,25,100},{0,16,388},{31,3,1152},{0,16,388},{37,1,1568},{4,46,1},{11,32,2},{0,30,113},{37,1,1568},{63,6,1568},{0,30,113},{0,25,1568},{63,6,1568},{0,25,1568},{3,0,313},{3,0,313},{3,0,313},{3,0,313},{0,19,0}, +{0,19,0},{0,19,0},{0,9,1},{0,8,116},{0,8,116},{6,63,2353},{4,49,562},{6,35,1006},{3,32,715},{0,62,5420},{0,39,1961},{0,32,174},{0,24,2817},{0,28,7013},{0,24,3841},{9,63,1577},{8,47,10},{10,35,123},{7,31,290},{31,1,5419},{0,39,1961},{0,32,174},{0,24,2817},{47,8,5419},{0,24,2817},{4,52,545},{4,52,545},{4,52,545},{4,28,546},{0,42,1154},{0,29,45},{0,29,45}, +{0,18,289},{0,19,1849},{0,16,797},{8,44,2},{8,44,2},{8,44,2},{8,26,2},{15,13,1152},{0,29,45},{0,29,45},{0,18,289},{31,6,1152},{0,18,289},{40,1,1568},{6,48,1},{13,34,2},{0,33,73},{40,1,1568},{63,9,1568},{0,33,73},{0,27,1568},{63,9,1568},{0,27,1568},{4,0,545},{4,0,545},{4,0,545},{4,0,545},{0,25,0},{0,25,0},{0,25,0},{0,12,1},{0,11,212}, +{0,11,212},{8,63,2980},{6,52,920},{7,38,1444},{5,34,1012},{2,63,5504},{0,42,1814},{0,35,57},{0,27,2630},{0,31,7380},{0,25,3860},{11,63,1604},{10,49,13},{12,37,116},{10,33,292},{34,1,5419},{0,42,1814},{0,35,57},{0,27,2630},{63,3,5419},{0,27,2630},{5,57,884},{5,57,884},{5,57,884},{5,31,884},{0,49,1152},{0,33,5},{0,33,5},{0,21,221},{0,22,2091},{0,19,875},{11,45,4}, +{11,45,4},{11,45,4},{11,28,4},{24,1,1152},{0,33,5},{0,33,5},{0,21,221},{49,0,1152},{0,21,221},{44,0,1568},{8,50,1},{15,36,4},{0,35,32},{44,0,1568},{62,13,1568},{0,35,32},{0,29,1570},{62,13,1568},{0,29,1570},{5,0,884},{5,0,884},{5,0,884},{5,0,884},{0,31,1},{0,31,1},{0,31,1},{0,16,1},{0,14,349},{0,14,349},{9,63,3638},{7,55,1309},{8,39,1940}, +{6,36,1365},{3,63,5739},{0,45,1718},{0,38,17},{0,29,2514},{0,34,7760},{0,28,3900},{14,63,1636},{12,51,13},{14,39,116},{12,35,292},{37,1,5419},{0,45,1718},{0,38,17},{0,29,2514},{63,6,5419},{0,29,2514},{6,61,1252},{6,61,1252},{6,61,1252},{6,33,1253},{0,55,1152},{0,37,4},{0,37,4},{0,22,162},{0,25,2339},{0,21,989},{13,47,4},{13,47,4},{13,47,4},{13,30,4},{27,1,1152}, +{1,36,1},{1,36,1},{0,22,162},{55,0,1152},{0,22,162},{47,0,1568},{10,52,1},{17,38,1},{0,38,16},{47,0,1568},{46,24,1568},{0,38,16},{0,31,1570},{46,24,1568},{0,31,1570},{6,0,1252},{6,0,1252},{6,0,1252},{6,0,1252},{0,37,0},{0,37,0},{0,37,0},{0,19,1},{0,16,490},{0,16,490},{11,63,4328},{8,57,1644},{10,41,2360},{7,39,1656},{6,63,6079},{0,49,1644},{1,40,17}, +{0,31,2359},{0,36,7943},{0,30,3834},{16,63,1689},{14,53,13},{16,41,129},{14,37,292},{40,1,5419},{0,49,1640},{1,40,13},{0,31,2355},{63,9,5419},{0,31,2355},{8,63,1576},{8,63,1576},{8,63,1576},{7,36,1576},{1,59,1156},{1,39,13},{1,39,13},{0,25,110},{0,28,2475},{0,24,1017},{15,49,4},{15,49,4},{15,49,4},{15,32,4},{30,1,1152},{3,38,1},{3,38,1},{0,25,106},{61,0,1152}, +{0,25,106},{49,1,1568},{12,54,1},{19,40,1},{0,40,4},{49,1,1568},{46,27,1568},{0,40,4},{0,33,1568},{46,27,1568},{0,33,1568},{7,0,1576},{7,0,1576},{7,0,1576},{7,0,1576},{1,41,4},{1,41,4},{1,41,4},{1,21,4},{0,19,578},{0,19,578},{14,63,4584},{10,59,1644},{12,43,2360},{9,41,1656},{8,63,6244},{2,51,1644},{3,42,17},{1,33,2308},{0,42,7575},{0,32,3345},{19,63,1761}, +{16,55,10},{17,43,125},{16,40,290},{43,1,5419},{0,52,1592},{3,42,13},{0,33,2225},{63,12,5419},{0,33,2225},{10,63,1585},{10,63,1585},{10,63,1585},{9,38,1576},{3,61,1156},{3,41,13},{3,41,13},{2,27,110},{0,31,2211},{0,25,699},{16,52,2},{16,52,2},{16,52,2},{16,34,2},{33,1,1152},{5,40,1},{5,40,1},{0,27,61},{63,2,1152},{0,27,61},{52,1,1568},{14,56,1},{21,42,1}, +{1,42,0},{52,1,1568},{46,30,1568},{1,42,0},{0,35,1568},{46,30,1568},{0,35,1568},{9,0,1576},{9,0,1576},{9,0,1576},{9,0,1576},{3,43,4},{3,43,4},{3,43,4},{3,23,4},{0,22,410},{0,22,410},{15,63,4826},{12,62,1650},{14,46,2355},{11,43,1660},{11,63,6452},{4,54,1641},{5,44,15},{3,35,2308},{0,45,7165},{0,35,2875},{22,63,1862},{18,57,9},{20,45,126},{18,42,281},{47,0,5419}, +{0,56,1568},{6,44,10},{0,35,2091},{46,24,5419},{0,35,2091},{12,63,1606},{12,63,1606},{12,63,1606},{12,40,1571},{5,63,1155},{5,44,14},{5,44,14},{4,29,109},{0,33,1977},{0,28,424},{19,53,4},{19,53,4},{19,53,4},{19,36,4},{31,12,1152},{7,42,1},{7,42,1},{0,30,29},{62,6,1152},{0,30,29},{56,0,1568},{17,58,1},{24,44,2},{3,44,2},{56,0,1568},{62,25,1568},{3,44,2}, +{0,37,1570},{62,25,1568},{0,37,1570},{12,0,1570},{12,0,1570},{12,0,1570},{12,0,1570},{5,46,1},{5,46,1},{5,46,1},{5,25,2},{0,25,260},{0,25,260},{17,63,5096},{14,63,1652},{15,48,2358},{13,45,1660},{14,63,6668},{6,56,1641},{7,46,15},{5,37,2308},{0,47,6891},{0,36,2543},{23,63,1956},{20,59,9},{22,47,126},{20,44,281},{49,1,5419},{2,58,1568},{8,46,10},{0,38,1979},{46,27,5419}, +{0,38,1979},{14,63,1651},{14,63,1651},{14,63,1651},{14,42,1571},{8,63,1179},{7,46,14},{7,46,14},{6,31,109},{0,38,1778},{0,31,232},{21,55,4},{21,55,4},{21,55,4},{21,38,4},{31,18,1152},{9,44,1},{9,44,1},{0,32,10},{62,9,1152},{0,32,10},{59,0,1568},{19,60,1},{26,46,2},{5,46,2},{59,0,1568},{62,28,1568},{5,46,2},{0,39,1570},{62,28,1568},{0,39,1570},{14,0,1570}, +{14,0,1570},{14,0,1570},{14,0,1570},{7,48,1},{7,48,1},{7,48,1},{7,27,2},{0,28,164},{0,28,164},{20,63,5352},{17,63,1708},{18,49,2360},{15,47,1660},{15,63,6877},{8,58,1641},{9,48,14},{7,39,2308},{0,50,6576},{0,39,2215},{26,63,2052},{22,61,9},{24,49,116},{22,46,281},{52,1,5419},{4,60,1568},{9,48,13},{0,40,1907},{46,30,5419},{0,40,1907},{16,63,1697},{16,63,1697},{16,63,1697}, +{16,44,1577},{10,63,1209},{9,48,14},{9,48,14},{8,33,115},{0,42,1601},{0,33,110},{23,57,4},{23,57,4},{23,57,4},{23,40,4},{34,17,1152},{11,46,1},{11,46,1},{0,34,2},{62,12,1152},{0,34,2},{62,0,1568},{21,62,1},{28,48,1},{7,48,0},{62,0,1568},{62,31,1568},{7,48,0},{0,41,1570},{62,31,1568},{0,41,1570},{16,0,1576},{16,0,1576},{16,0,1576},{16,0,1576},{9,50,1}, +{9,50,1},{9,50,1},{9,29,2},{0,33,85},{0,33,85},{23,63,5672},{19,63,1825},{20,51,2360},{17,49,1656},{19,63,7135},{10,60,1641},{11,50,14},{9,41,2308},{0,53,6336},{0,42,1983},{29,63,2180},{24,63,9},{26,51,116},{24,48,293},{55,1,5419},{6,62,1568},{11,50,13},{0,42,1814},{47,32,5419},{0,42,1814},{19,63,1761},{19,63,1761},{19,63,1761},{17,46,1576},{12,63,1249},{11,50,14},{11,50,14}, +{10,35,115},{0,45,1449},{0,36,30},{25,59,4},{25,59,4},{25,59,4},{25,42,4},{37,17,1152},{13,48,0},{13,48,0},{1,36,2},{62,15,1152},{1,36,2},{63,4,1568},{23,63,4},{30,50,1},{9,50,0},{63,4,1568},{62,34,1568},{9,50,0},{0,43,1570},{62,34,1568},{0,43,1570},{17,0,1576},{17,0,1576},{17,0,1576},{17,0,1576},{11,52,1},{11,52,1},{11,52,1},{11,31,2},{0,36,29}, +{0,36,29},{25,63,6066},{21,63,2039},{22,54,2355},{19,51,1660},{20,63,7420},{12,62,1635},{13,52,14},{11,43,2316},{0,57,6109},{0,44,1789},{31,63,2369},{27,63,38},{28,53,115},{26,50,286},{59,0,5419},{9,63,1577},{14,52,11},{0,44,1740},{62,28,5419},{0,44,1740},{21,63,1843},{21,63,1843},{21,63,1843},{20,48,1571},{15,63,1314},{13,52,13},{13,52,13},{12,37,116},{0,48,1329},{0,39,13},{27,62,1}, +{27,62,1},{27,62,1},{27,44,2},{49,0,1152},{15,50,2},{15,50,2},{4,38,4},{62,18,1152},{4,38,4},{63,11,1568},{27,63,37},{32,52,2},{12,52,1},{63,11,1568},{47,45,1568},{12,52,1},{0,45,1576},{47,45,1568},{0,45,1576},{20,0,1570},{20,0,1570},{20,0,1570},{20,0,1570},{13,54,1},{13,54,1},{13,54,1},{13,34,1},{0,40,4},{0,40,4},{28,63,6434},{23,63,2268},{24,56,2355}, +{21,53,1660},{23,63,7668},{14,63,1652},{15,54,14},{13,45,2316},{0,61,5924},{0,47,1685},{34,63,2502},{29,63,123},{30,55,115},{28,52,286},{62,0,5419},{13,63,1627},{16,54,10},{0,47,1676},{62,31,5419},{0,47,1676},{23,63,1907},{23,63,1907},{23,63,1907},{22,50,1571},{17,63,1395},{15,54,13},{15,54,13},{14,39,116},{0,51,1241},{2,41,13},{29,63,2},{29,63,2},{29,63,2},{29,46,2},{52,0,1152}, +{17,52,1},{17,52,1},{6,40,4},{62,21,1152},{6,40,4},{55,32,1568},{31,63,97},{34,54,2},{14,54,1},{55,32,1568},{46,48,1568},{14,54,1},{0,47,1576},{46,48,1568},{0,47,1576},{22,0,1570},{22,0,1570},{22,0,1570},{22,0,1570},{15,56,1},{15,56,1},{15,56,1},{15,36,1},{1,43,1},{1,43,1},{29,63,6756},{26,63,2548},{26,58,2355},{23,55,1660},{26,63,7948},{17,63,1716},{17,56,15}, +{15,47,2316},{0,63,5773},{0,49,1638},{37,63,2694},{32,63,262},{32,57,126},{30,54,286},{63,4,5419},{17,63,1715},{18,56,10},{0,49,1634},{62,34,5419},{0,49,1634},{25,63,2018},{25,63,2018},{25,63,2018},{24,52,1571},{20,63,1483},{17,56,14},{17,56,14},{16,41,109},{0,54,1185},{4,43,13},{31,63,17},{31,63,17},{31,63,17},{31,48,2},{55,0,1152},{19,54,1},{19,54,1},{8,42,4},{62,24,1152}, +{8,42,4},{58,32,1568},{34,63,169},{36,56,2},{15,56,2},{58,32,1568},{52,48,1568},{15,56,2},{0,49,1570},{52,48,1568},{0,49,1570},{24,0,1570},{24,0,1570},{24,0,1570},{24,0,1570},{17,58,1},{17,58,1},{17,58,1},{17,37,2},{3,45,1},{3,45,1},{31,63,7218},{29,63,2924},{28,60,2355},{25,57,1660},{29,63,8260},{20,63,1884},{19,58,15},{17,49,2308},{3,63,5933},{2,51,1638},{39,63,2892}, +{34,63,445},{34,59,126},{32,56,281},{63,10,5419},{21,63,1849},{20,58,10},{0,51,1606},{62,37,5419},{0,51,1606},{28,63,2130},{28,63,2130},{28,63,2130},{26,54,1571},{23,63,1603},{19,58,14},{19,58,14},{18,43,109},{0,58,1156},{6,45,13},{33,63,40},{33,63,40},{33,63,40},{33,50,4},{58,0,1152},{21,56,1},{21,56,1},{10,44,4},{62,27,1152},{10,44,4},{61,32,1568},{38,63,274},{38,58,2}, +{17,58,2},{61,32,1568},{58,48,1568},{17,58,2},{0,51,1570},{58,48,1568},{0,51,1570},{26,0,1570},{26,0,1570},{26,0,1570},{26,0,1570},{19,60,1},{19,60,1},{19,60,1},{19,39,2},{5,47,1},{5,47,1},{34,63,7586},{31,63,3453},{30,62,2357},{28,59,1668},{31,63,8699},{23,63,2180},{21,60,21},{19,51,2316},{7,63,6224},{4,53,1634},{42,63,3131},{37,63,722},{36,62,125},{34,58,278},{55,32,5419}, +{26,63,2052},{22,60,9},{0,53,1580},{46,48,5419},{0,53,1580},{30,63,2272},{30,63,2272},{30,63,2272},{28,56,1568},{25,63,1746},{21,60,17},{21,60,17},{21,45,113},{1,61,1154},{9,47,14},{36,63,74},{36,63,74},{36,63,74},{35,52,2},{53,16,1152},{23,59,1},{23,59,1},{11,47,1},{63,30,1152},{11,47,1},{63,35,1568},{43,63,433},{40,60,4},{20,60,4},{63,35,1568},{63,49,1568},{20,60,4}, +{0,53,1576},{63,49,1568},{0,53,1576},{28,0,1568},{28,0,1568},{28,0,1568},{28,0,1568},{21,63,0},{21,63,0},{21,63,0},{21,42,0},{7,49,1},{7,49,1},{37,63,8018},{34,63,3915},{32,63,2410},{30,61,1668},{34,63,8985},{26,63,2548},{23,62,21},{21,53,2316},{12,63,6555},{6,55,1634},{43,63,3345},{40,63,1026},{38,63,129},{36,60,278},{58,32,5419},{30,63,2274},{24,62,9},{0,55,1577},{52,48,5419}, +{0,55,1577},{32,63,2406},{32,63,2406},{32,63,2406},{30,58,1568},{28,63,1890},{23,62,17},{23,62,17},{23,47,113},{3,63,1154},{11,49,12},{38,63,125},{38,63,125},{38,63,125},{37,54,2},{56,16,1152},{25,61,1},{25,61,1},{14,48,5},{62,33,1152},{14,48,5},{63,41,1568},{46,63,585},{42,62,4},{22,62,4},{63,41,1568},{63,52,1568},{22,62,4},{0,55,1576},{63,52,1568},{0,55,1576},{30,0,1568}, +{30,0,1568},{30,0,1568},{30,0,1568},{23,63,4},{23,63,4},{23,63,4},{23,44,0},{9,51,1},{9,51,1},{39,63,7700},{35,63,4026},{34,63,2514},{32,62,1611},{37,63,8485},{29,63,2424},{26,63,20},{23,55,1896},{15,63,6115},{9,56,1308},{46,63,2973},{43,63,1034},{40,63,169},{37,61,194},{63,27,4803},{32,63,2024},{27,63,1},{2,57,1253},{63,45,4803},{2,57,1253},{34,63,2514},{34,63,2514},{34,63,2514}, +{32,60,1570},{29,63,2056},{26,63,20},{26,63,20},{24,49,116},{7,63,1164},{13,51,12},{40,63,169},{40,63,169},{40,63,169},{39,56,2},{59,16,1152},{27,63,1},{27,63,1},{16,50,4},{62,36,1152},{16,50,4},{63,45,1250},{48,63,500},{45,63,1},{26,63,0},{63,45,1250},{47,62,1250},{26,63,0},{0,57,1252},{47,62,1250},{0,57,1252},{32,0,1570},{32,0,1570},{32,0,1570},{32,0,1570},{26,63,20}, +{26,63,20},{26,63,20},{25,46,0},{11,53,1},{11,53,1},{40,63,7062},{37,63,3915},{37,63,2690},{34,63,1579},{37,63,7765},{30,63,2178},{28,63,77},{26,56,1437},{18,63,5499},{11,57,918},{48,63,2504},{44,63,945},{43,63,225},{40,62,89},{63,31,4056},{35,63,1656},{30,63,9},{6,58,885},{63,47,4056},{6,58,885},{37,63,2690},{37,63,2690},{37,63,2690},{34,62,1570},{33,63,2227},{28,63,77},{28,63,77}, +{26,51,116},{11,63,1227},{15,53,12},{43,63,225},{43,63,225},{43,63,225},{41,58,2},{62,16,1152},{30,63,9},{30,63,9},{18,52,4},{62,39,1152},{18,52,4},{63,47,884},{51,63,356},{47,63,4},{32,63,0},{63,47,884},{63,55,884},{32,63,0},{0,58,884},{63,55,884},{0,58,884},{34,0,1570},{34,0,1570},{34,0,1570},{34,0,1570},{28,63,41},{28,63,41},{28,63,41},{27,48,1},{13,55,1}, +{13,55,1},{43,63,6493},{40,63,3882},{39,63,2880},{36,63,1584},{40,63,6982},{34,63,1966},{31,63,206},{28,57,971},{23,63,4927},{14,59,562},{50,63,2070},{46,63,842},{46,63,313},{43,62,25},{63,35,3318},{38,63,1326},{34,63,45},{11,59,545},{63,49,3318},{11,59,545},{39,63,2880},{39,63,2880},{39,63,2880},{36,63,1584},{34,63,2434},{31,63,206},{31,63,206},{29,53,114},{15,63,1329},{17,55,14},{46,63,313}, +{46,63,313},{46,63,313},{43,61,0},{63,21,1152},{34,63,45},{34,63,45},{19,55,1},{63,42,1152},{19,55,1},{63,51,545},{54,63,225},{51,63,1},{39,63,0},{63,51,545},{63,57,545},{39,63,0},{0,59,545},{63,57,545},{0,59,545},{36,0,1568},{36,0,1568},{36,0,1568},{36,0,1568},{31,63,85},{31,63,85},{31,63,85},{29,50,1},{15,57,1},{15,57,1},{45,63,6113},{43,63,3938},{40,63,3065}, +{38,63,1649},{43,63,6422},{35,63,1878},{34,63,365},{30,59,651},{26,63,4495},{16,60,318},{51,63,1698},{48,63,794},{48,63,394},{45,63,0},{63,39,2753},{41,63,1094},{38,63,106},{15,60,313},{47,59,2753},{15,60,313},{40,63,3065},{40,63,3065},{40,63,3065},{38,63,1649},{37,63,2610},{34,63,365},{34,63,365},{31,55,114},{20,63,1483},{19,57,14},{48,63,394},{48,63,394},{48,63,394},{45,63,0},{63,27,1152}, +{38,63,106},{38,63,106},{21,57,1},{63,45,1152},{21,57,1},{63,54,313},{55,63,130},{54,63,1},{45,63,0},{63,54,313},{62,59,313},{45,63,0},{0,60,313},{62,59,313},{0,60,313},{38,0,1568},{38,0,1568},{38,0,1568},{38,0,1568},{33,63,128},{33,63,128},{33,63,128},{31,52,1},{17,59,1},{17,59,1},{46,63,5677},{43,63,3954},{43,63,3225},{40,63,1764},{45,63,5985},{37,63,1830},{37,63,605}, +{32,60,410},{29,63,4159},{19,61,146},{53,63,1454},{51,63,770},{50,63,493},{47,63,25},{63,43,2273},{44,63,926},{41,63,194},{19,61,145},{63,53,2273},{19,61,145},{43,63,3225},{43,63,3225},{43,63,3225},{40,63,1764},{40,63,2818},{37,63,605},{37,63,605},{33,57,113},{23,63,1659},{21,59,14},{50,63,493},{50,63,493},{50,63,493},{47,63,25},{63,33,1152},{41,63,194},{41,63,194},{23,59,1},{47,56,1152}, +{23,59,1},{63,57,145},{58,63,58},{57,63,1},{50,63,1},{63,57,145},{63,60,145},{50,63,1},{0,61,145},{63,60,145},{0,61,145},{40,0,1568},{40,0,1568},{40,0,1568},{40,0,1568},{34,63,185},{34,63,185},{34,63,185},{33,54,0},{19,61,1},{19,61,1},{48,63,5379},{46,63,3978},{46,63,3449},{43,63,1924},{46,63,5542},{40,63,1870},{38,63,890},{34,61,225},{32,63,3919},{22,62,43},{54,63,1242}, +{53,63,809},{51,63,610},{49,63,101},{63,47,1878},{48,63,810},{44,63,314},{23,62,41},{63,55,1878},{23,62,41},{46,63,3449},{46,63,3449},{46,63,3449},{43,63,1924},{43,63,3058},{38,63,890},{38,63,890},{35,59,113},{27,63,1889},{23,61,14},{51,63,610},{51,63,610},{51,63,610},{49,63,101},{63,39,1152},{44,63,314},{44,63,314},{25,61,1},{47,59,1152},{25,61,1},{63,60,41},{60,63,17},{60,63,1}, +{56,63,1},{63,60,41},{62,62,41},{56,63,1},{0,62,41},{62,62,41},{0,62,41},{42,0,1568},{42,0,1568},{42,0,1568},{42,0,1568},{37,63,233},{37,63,233},{37,63,233},{35,56,0},{21,63,1},{21,63,1},{50,63,5170},{48,63,4080},{48,63,3680},{46,63,2195},{48,63,5200},{43,63,2023},{41,63,1269},{37,62,133},{35,63,3772},{25,63,17},{57,63,1088},{55,63,861},{54,63,720},{52,63,241},{63,51,1536}, +{51,63,768},{49,63,461},{28,63,0},{63,57,1536},{28,63,0},{48,63,3680},{48,63,3680},{48,63,3680},{46,63,2195},{46,63,3345},{41,63,1269},{41,63,1269},{37,61,114},{32,63,2200},{25,63,17},{54,63,720},{54,63,720},{54,63,720},{52,63,241},{61,49,1152},{49,63,461},{49,63,461},{28,63,0},{63,54,1152},{28,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0}, +{0,63,0},{63,63,0},{0,63,0},{44,0,1570},{44,0,1570},{44,0,1570},{44,0,1570},{40,63,317},{40,63,317},{40,63,317},{37,58,2},{25,63,17},{25,63,17},{51,63,4416},{50,63,3629},{48,63,3296},{47,63,2070},{50,63,4411},{46,63,1823},{43,63,1150},{39,63,50},{38,63,3132},{29,63,52},{57,63,768},{57,63,576},{56,63,505},{54,63,160},{63,53,1068},{54,63,544},{51,63,320},{33,63,1},{63,58,1068}, +{33,63,1},{48,63,3296},{48,63,3296},{48,63,3296},{47,63,2070},{46,63,2881},{43,63,1150},{43,63,1150},{39,62,42},{34,63,1846},{29,63,52},{56,63,505},{56,63,505},{56,63,505},{54,63,160},{63,48,800},{51,63,320},{51,63,320},{33,63,1},{62,56,800},{33,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{46,0,1570}, +{46,0,1570},{46,0,1570},{46,0,1570},{42,63,410},{42,63,410},{42,63,410},{39,60,2},{29,63,52},{29,63,52},{53,63,3826},{51,63,3136},{51,63,2880},{49,63,1961},{51,63,3648},{46,63,1615},{46,63,1086},{41,63,5},{41,63,2588},{32,63,116},{59,63,498},{57,63,384},{57,63,320},{56,63,116},{63,55,683},{55,63,342},{54,63,208},{39,63,1},{63,59,683},{39,63,1},{51,63,2880},{51,63,2880},{51,63,2880}, +{49,63,1961},{48,63,2448},{46,63,1086},{46,63,1086},{41,63,5},{37,63,1558},{32,63,116},{57,63,320},{57,63,320},{57,63,320},{56,63,116},{63,51,512},{54,63,208},{54,63,208},{39,63,1},{63,57,512},{39,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{48,0,1568},{48,0,1568},{48,0,1568},{48,0,1568},{45,63,514}, +{45,63,514},{45,63,514},{41,62,2},{32,63,116},{32,63,116},{54,63,3232},{53,63,2781},{53,63,2585},{51,63,1856},{53,63,3067},{48,63,1456},{48,63,1056},{43,63,10},{44,63,2140},{35,63,212},{60,63,272},{59,63,221},{59,63,185},{57,63,64},{63,57,384},{57,63,192},{55,63,125},{45,63,1},{63,60,384},{45,63,1},{53,63,2585},{53,63,2585},{53,63,2585},{51,63,1856},{51,63,2112},{48,63,1056},{48,63,1056}, +{43,63,10},{40,63,1334},{35,63,212},{59,63,185},{59,63,185},{59,63,185},{57,63,64},{63,54,288},{55,63,125},{55,63,125},{45,63,1},{62,59,288},{45,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{50,0,1568},{50,0,1568},{50,0,1568},{50,0,1568},{46,63,605},{46,63,605},{46,63,605},{43,63,10},{35,63,212}, +{35,63,212},{0,51,2665},{0,36,306},{0,26,5},{0,22,965},{0,34,5885},{0,22,3726},{0,21,1754},{0,14,4398},{0,16,6359},{0,13,4722},{0,51,2665},{0,36,306},{0,26,5},{0,22,965},{17,0,5885},{0,22,3726},{0,21,1754},{0,14,4398},{34,0,5885},{0,14,4398},{0,25,0},{0,25,0},{0,25,0},{0,12,1},{0,12,545},{0,11,212},{0,11,212},{0,6,337},{0,5,605},{0,5,374},{0,25,0}, +{0,25,0},{0,25,0},{0,12,1},{6,0,545},{0,11,212},{0,11,212},{0,6,337},{12,0,545},{0,6,337},{26,0,2665},{0,36,306},{0,26,5},{0,22,965},{26,0,2665},{51,0,2665},{0,22,965},{0,17,2665},{51,0,2665},{0,17,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,57,2665},{0,39,202},{0,29,13}, +{0,24,818},{0,39,6669},{0,25,3974},{0,22,1790},{0,16,4826},{0,18,7285},{0,16,5267},{0,57,2665},{0,39,202},{0,29,13},{0,24,818},{19,1,6669},{0,25,3974},{0,22,1790},{0,16,4826},{39,0,6669},{0,16,4826},{0,31,0},{0,31,0},{0,31,0},{0,15,1},{0,15,841},{0,12,337},{0,12,337},{0,7,493},{0,7,934},{0,7,574},{0,31,0},{0,31,0},{0,31,0},{0,15,1},{8,0,841}, +{0,12,337},{0,12,337},{0,7,493},{15,0,841},{0,7,493},{29,0,2665},{0,39,202},{1,28,2},{0,24,818},{29,0,2665},{57,0,2665},{0,24,818},{0,19,2665},{57,0,2665},{0,19,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,63,2665},{0,44,116},{1,31,66},{0,27,698},{0,42,7541},{0,28,4254},{0,25,1854}, +{0,18,5281},{0,19,8271},{0,16,5795},{0,63,2665},{0,44,116},{1,31,50},{0,27,698},{15,13,7538},{0,28,4254},{0,25,1854},{0,18,5281},{31,6,7538},{0,18,5281},{0,36,1},{0,36,1},{0,36,1},{0,18,1},{0,18,1201},{0,14,468},{0,14,468},{0,8,730},{0,8,1325},{0,8,830},{0,36,1},{0,36,1},{0,36,1},{0,18,1},{9,0,1201},{0,14,468},{0,14,468},{0,8,730},{18,0,1201}, +{0,8,730},{32,0,2665},{0,44,116},{3,30,2},{0,27,698},{32,0,2665},{63,0,2665},{0,27,698},{0,21,2665},{63,0,2665},{0,21,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,63,2781},{0,47,52},{1,33,148},{0,29,610},{0,46,8493},{0,31,4566},{0,27,1962},{0,18,5809},{0,22,9367},{0,18,6385},{2,63,2753}, +{0,47,52},{2,33,129},{0,29,610},{23,0,8493},{0,31,4566},{0,27,1962},{0,18,5809},{46,0,8493},{0,18,5809},{0,42,1},{0,42,1},{0,42,1},{0,21,1},{0,21,1625},{0,16,637},{0,16,637},{0,10,965},{0,10,1806},{0,10,1134},{0,42,1},{0,42,1},{0,42,1},{0,21,1},{11,0,1625},{0,16,637},{0,16,637},{0,10,965},{21,0,1625},{0,10,965},{35,0,2665},{0,47,52},{5,32,1}, +{0,29,610},{35,0,2665},{63,3,2665},{0,29,610},{0,23,2665},{63,3,2665},{0,23,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,63,3105},{0,51,10},{1,35,297},{0,32,481},{0,51,9670},{0,33,4965},{0,30,2120},{0,21,6413},{0,24,10749},{0,19,7191},{3,63,2989},{0,51,10},{2,36,257},{0,32,481},{25,1,9669}, +{0,33,4965},{0,30,2120},{0,21,6413},{47,2,9669},{0,21,6413},{0,49,0},{0,49,0},{0,49,0},{0,25,1},{0,25,2178},{0,19,850},{0,19,850},{0,11,1325},{0,11,2406},{0,10,1521},{0,49,0},{0,49,0},{0,49,0},{0,25,1},{12,1,2178},{0,19,850},{0,19,850},{0,11,1325},{25,0,2178},{0,11,1325},{38,0,2665},{0,51,10},{8,34,2},{0,32,481},{38,0,2665},{62,7,2665},{0,32,481}, +{0,25,2669},{62,7,2665},{0,25,2669},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,63,3437},{1,54,33},{3,37,425},{1,33,457},{0,57,9670},{0,36,4629},{0,31,1654},{0,24,6165},{0,26,11014},{0,22,7031},{6,63,3101},{2,53,10},{4,38,257},{1,33,441},{28,1,9669},{0,36,4629},{0,31,1654},{0,24,6165},{47,5,9669}, +{0,24,6165},{1,53,32},{1,53,32},{1,53,32},{1,27,32},{0,31,2178},{0,22,666},{0,22,666},{0,13,1160},{0,14,2534},{0,13,1449},{2,51,0},{2,51,0},{2,51,0},{2,27,1},{15,1,2178},{0,22,666},{0,22,666},{0,13,1160},{31,0,2178},{0,13,1160},{41,0,2665},{1,54,1},{10,36,2},{0,33,394},{41,0,2665},{62,10,2665},{0,33,394},{0,27,2669},{62,10,2665},{0,27,2669},{1,0,32}, +{1,0,32},{1,0,32},{1,0,32},{0,6,0},{0,6,0},{0,6,0},{0,3,0},{0,2,13},{0,2,13},{6,63,3917},{2,57,129},{3,40,609},{1,36,497},{0,63,9670},{0,39,4325},{0,33,1274},{0,25,5878},{0,28,11299},{0,24,6917},{8,63,3233},{4,55,10},{6,40,257},{3,35,441},{31,1,9669},{0,39,4325},{0,33,1274},{0,25,5878},{47,8,9669},{0,25,5878},{2,57,128},{2,57,128},{2,57,128}, +{2,30,129},{0,36,2180},{0,28,490},{0,28,490},{0,16,1018},{0,16,2691},{0,14,1441},{4,53,0},{4,53,0},{4,53,0},{4,29,1},{15,7,2178},{0,28,490},{0,28,490},{0,16,1018},{31,3,2178},{0,16,1018},{44,0,2665},{3,56,1},{12,38,2},{0,36,306},{44,0,2665},{62,13,2665},{0,36,306},{0,29,2669},{62,13,2665},{0,29,2669},{2,0,128},{2,0,128},{2,0,128},{2,0,128},{0,12,0}, +{0,12,0},{0,12,0},{0,6,0},{0,5,45},{0,5,45},{6,63,4541},{3,59,297},{5,42,865},{3,38,625},{2,63,9749},{0,45,4021},{0,36,914},{0,27,5581},{0,31,11611},{0,27,6877},{11,63,3377},{6,57,10},{8,42,257},{5,37,441},{34,0,9669},{0,45,4021},{0,36,914},{0,27,5581},{47,11,9669},{0,27,5581},{3,61,288},{3,61,288},{3,61,288},{3,32,288},{0,42,2180},{0,31,338},{0,31,338}, +{0,18,865},{0,19,2875},{0,16,1427},{6,55,0},{6,55,0},{6,55,0},{6,31,1},{15,13,2178},{0,31,338},{0,31,338},{0,18,865},{31,6,2178},{0,18,865},{47,0,2665},{5,58,1},{14,40,2},{0,38,225},{47,0,2665},{62,16,2665},{0,38,225},{0,31,2669},{62,16,2665},{0,31,2669},{3,0,288},{3,0,288},{3,0,288},{3,0,288},{0,18,0},{0,18,0},{0,18,0},{0,9,0},{0,8,109}, +{0,8,109},{9,63,5374},{4,62,570},{6,44,1269},{4,40,841},{3,63,10021},{0,47,3745},{0,39,593},{0,30,5294},{0,36,12029},{0,28,6810},{14,63,3558},{8,59,9},{10,44,254},{7,39,446},{37,1,9669},{0,47,3745},{0,39,593},{0,30,5294},{63,6,9669},{0,30,5294},{4,63,561},{4,63,561},{4,63,561},{4,35,546},{0,49,2178},{0,34,218},{0,34,218},{0,21,725},{0,22,3117},{0,19,1433},{8,58,1}, +{8,58,1},{8,58,1},{8,33,2},{24,1,2178},{0,34,218},{0,34,218},{0,21,725},{49,0,2178},{0,21,725},{50,0,2665},{7,60,1},{16,42,5},{0,41,157},{50,0,2665},{62,19,2665},{0,41,157},{0,33,2669},{62,19,2665},{0,33,2669},{4,0,545},{4,0,545},{4,0,545},{4,0,545},{0,25,0},{0,25,0},{0,25,0},{0,12,1},{0,11,212},{0,11,212},{11,63,6350},{6,63,905},{7,47,1678}, +{4,42,1102},{6,63,10453},{0,50,3485},{0,42,361},{0,32,5054},{0,36,12429},{0,31,6794},{15,63,3710},{10,61,9},{12,46,254},{9,41,446},{40,1,9669},{0,50,3485},{0,42,361},{0,32,5054},{63,9,9669},{0,32,5054},{6,63,901},{6,63,901},{6,63,901},{5,37,842},{0,55,2178},{0,38,125},{0,38,125},{0,24,629},{0,25,3365},{0,22,1489},{10,60,1},{10,60,1},{10,60,1},{10,35,2},{27,1,2178}, +{0,38,125},{0,38,125},{0,24,629},{55,0,2178},{0,24,629},{53,0,2665},{9,62,1},{18,44,5},{0,43,117},{53,0,2665},{62,22,2665},{0,43,117},{0,35,2669},{62,22,2665},{0,35,2669},{5,0,841},{5,0,841},{5,0,841},{5,0,841},{0,31,0},{0,31,0},{0,31,0},{0,15,1},{0,12,337},{0,12,337},{12,63,7350},{7,63,1450},{9,48,2190},{6,44,1422},{6,63,11045},{0,53,3293},{0,45,193}, +{0,35,4870},{0,39,12829},{0,32,6807},{17,63,3905},{12,63,9},{14,48,267},{11,43,446},{43,1,9669},{0,53,3293},{0,45,193},{0,35,4870},{63,12,9669},{0,35,4870},{7,63,1369},{7,63,1369},{7,63,1369},{6,40,1202},{0,61,2178},{0,42,53},{0,42,53},{0,25,520},{0,28,3645},{0,24,1573},{12,62,1},{12,62,1},{12,62,1},{12,37,2},{30,1,2178},{0,42,53},{0,42,53},{0,25,520},{61,0,2178}, +{0,25,520},{56,0,2665},{12,63,8},{20,46,5},{0,45,72},{56,0,2665},{62,25,2665},{0,45,72},{0,37,2669},{62,25,2665},{0,37,2669},{6,0,1201},{6,0,1201},{6,0,1201},{6,0,1201},{0,36,1},{0,36,1},{0,36,1},{0,18,1},{0,14,468},{0,14,468},{14,63,8614},{9,63,2129},{9,51,2758},{6,47,1822},{9,63,11765},{0,57,3125},{0,47,81},{0,36,4629},{0,42,13261},{0,35,6855},{20,63,4081}, +{15,63,49},{16,50,257},{13,45,446},{46,1,9669},{0,57,3125},{0,47,81},{0,36,4629},{63,15,9669},{0,36,4629},{9,63,1933},{9,63,1933},{9,63,1933},{7,42,1626},{1,63,2212},{0,45,13},{0,45,13},{0,27,421},{0,31,3957},{0,25,1673},{14,63,2},{14,63,2},{14,63,2},{14,39,2},{33,1,2178},{0,45,13},{0,45,13},{0,27,421},{63,2,2178},{0,27,421},{59,0,2665},{15,63,40},{22,48,2}, +{0,47,45},{59,0,2665},{62,28,2665},{0,47,45},{0,39,2669},{62,28,2665},{0,39,2669},{7,0,1625},{7,0,1625},{7,0,1625},{7,0,1625},{0,42,1},{0,42,1},{0,42,1},{0,21,1},{0,16,637},{0,16,637},{15,63,10085},{11,63,3185},{11,53,3481},{8,49,2337},{11,63,12845},{0,62,2958},{0,50,14},{0,38,4381},{0,45,13802},{0,36,6942},{23,63,4318},{17,63,154},{18,52,254},{14,48,456},{49,1,9669}, +{0,62,2958},{0,50,14},{0,38,4381},{46,27,9669},{0,38,4381},{10,63,2717},{10,63,2717},{10,63,2717},{8,45,2180},{3,63,2394},{0,49,0},{0,49,0},{0,30,317},{0,33,4314},{0,28,1811},{17,63,10},{17,63,10},{17,63,10},{16,41,1},{31,12,2178},{0,49,0},{0,49,0},{0,30,317},{62,6,2178},{0,30,317},{62,1,2665},{20,63,113},{24,50,4},{0,50,13},{62,1,2665},{63,31,2665},{0,50,13}, +{0,42,2669},{63,31,2665},{0,42,2669},{8,0,2180},{8,0,2180},{8,0,2180},{8,0,2180},{0,49,0},{0,49,0},{0,49,0},{0,25,1},{0,19,850},{0,19,850},{17,63,11454},{12,63,4143},{12,55,4141},{9,51,2805},{12,63,13803},{0,63,2871},{1,52,18},{0,41,4182},{0,50,14186},{0,39,6911},{26,63,4550},{20,63,306},{20,54,254},{17,49,446},{52,1,9669},{0,63,2870},{1,52,9},{0,41,4181},{46,30,9669}, +{0,41,4181},{12,63,3414},{12,63,3414},{12,63,3414},{9,47,2673},{3,63,2691},{1,52,14},{1,52,14},{0,32,245},{0,36,4587},{0,31,1906},{19,63,25},{19,63,25},{19,63,25},{18,43,1},{31,18,2178},{2,51,0},{2,51,0},{0,32,244},{62,9,2178},{0,32,244},{63,5,2665},{23,63,193},{26,52,4},{0,52,4},{63,5,2665},{63,34,2665},{0,52,4},{0,44,2669},{63,34,2665},{0,44,2669},{9,0,2669}, +{9,0,2669},{9,0,2669},{9,0,2669},{0,55,1},{0,55,1},{0,55,1},{0,28,2},{0,22,1009},{0,22,1009},{20,63,11990},{15,63,4575},{14,57,4141},{11,53,2805},{15,63,14195},{3,63,3015},{3,54,18},{0,43,4122},{0,53,13674},{0,41,6249},{29,63,4814},{23,63,522},{22,56,254},{19,51,446},{55,1,9669},{3,63,3006},{3,54,9},{0,43,4041},{47,32,9669},{0,43,4041},{14,63,3561},{14,63,3561},{14,63,3561}, +{11,49,2670},{6,63,2795},{3,54,14},{3,54,14},{2,34,245},{0,39,4227},{0,33,1470},{21,63,58},{21,63,58},{21,63,58},{20,45,1},{34,17,2178},{4,53,0},{4,53,0},{0,35,180},{62,12,2178},{0,35,180},{63,11,2665},{26,63,305},{28,54,4},{2,54,4},{63,11,2665},{63,37,2665},{2,54,4},{0,46,2669},{63,37,2665},{0,46,2669},{11,0,2669},{11,0,2669},{11,0,2669},{11,0,2669},{2,57,1}, +{2,57,1},{2,57,1},{2,30,2},{0,25,801},{0,25,801},{22,63,12554},{17,63,5066},{16,59,4118},{13,55,2805},{17,63,14614},{6,63,3255},{5,56,18},{1,45,4078},{0,56,13194},{0,44,5633},{31,63,5090},{26,63,802},{24,58,254},{21,53,446},{58,1,9669},{7,63,3198},{5,56,9},{0,45,3846},{53,32,9669},{0,45,3846},{15,63,3710},{15,63,3710},{15,63,3710},{13,51,2670},{9,63,2931},{5,56,14},{5,56,14}, +{4,36,245},{0,42,3899},{0,36,1110},{23,63,90},{23,63,90},{23,63,90},{22,47,1},{37,17,2178},{6,55,0},{6,55,0},{0,37,136},{62,15,2178},{0,37,136},{63,17,2665},{30,63,442},{30,56,4},{4,56,4},{63,17,2665},{63,40,2665},{4,56,4},{0,47,2677},{63,40,2665},{0,47,2677},{13,0,2669},{13,0,2669},{13,0,2669},{13,0,2669},{4,59,1},{4,59,1},{4,59,1},{4,31,5},{0,28,625}, +{0,28,625},{23,63,13130},{20,63,5706},{18,61,4122},{15,57,2807},{20,63,15102},{9,63,3625},{7,59,15},{3,47,4086},{0,59,12686},{0,47,5027},{34,63,5386},{29,63,1169},{26,60,257},{23,56,446},{62,0,9669},{12,63,3469},{7,59,11},{0,47,3658},{62,31,9669},{0,47,3658},{17,63,3905},{17,63,3905},{17,63,3905},{16,53,2677},{12,63,3112},{7,58,9},{7,58,9},{6,38,246},{0,45,3576},{0,38,755},{26,63,136}, +{26,63,136},{26,63,136},{24,49,4},{49,0,2178},{8,57,2},{8,57,2},{0,39,85},{62,18,2178},{0,39,85},{63,23,2665},{34,63,628},{32,59,2},{4,59,2},{63,23,2665},{63,43,2665},{4,59,2},{0,50,2669},{63,43,2665},{0,50,2669},{15,0,2677},{15,0,2677},{15,0,2677},{15,0,2677},{7,60,4},{7,60,4},{7,60,4},{7,33,5},{0,33,424},{0,33,424},{26,63,13650},{23,63,6378},{20,63,4122}, +{17,59,2799},{23,63,15558},{12,63,4065},{9,61,15},{6,49,4074},{0,62,12278},{0,49,4534},{36,63,5698},{30,63,1556},{28,62,257},{25,58,446},{63,4,9669},{15,63,3749},{9,61,11},{0,49,3510},{62,34,9669},{0,49,3510},{20,63,4041},{20,63,4041},{20,63,4041},{17,56,2670},{15,63,3304},{9,60,9},{9,60,9},{8,40,246},{0,50,3317},{0,41,499},{29,63,200},{29,63,200},{29,63,200},{26,51,4},{52,0,2178}, +{10,59,2},{10,59,2},{0,42,45},{62,21,2178},{0,42,45},{63,29,2665},{37,63,820},{34,61,2},{6,61,2},{63,29,2665},{63,46,2665},{6,61,2},{0,52,2669},{63,46,2665},{0,52,2669},{17,0,2669},{17,0,2669},{17,0,2669},{17,0,2669},{9,62,4},{9,62,4},{9,62,4},{9,35,5},{0,36,296},{0,36,296},{29,63,14234},{23,63,7050},{23,63,4242},{19,61,2799},{26,63,16046},{15,63,4601},{11,63,15}, +{8,51,4074},{0,63,12051},{0,50,4110},{37,63,6002},{34,63,1989},{31,63,270},{27,60,446},{63,10,9669},{20,63,4081},{11,63,11},{0,52,3374},{62,37,9669},{0,52,3374},{23,63,4241},{23,63,4241},{23,63,4241},{19,58,2670},{17,63,3485},{11,62,9},{11,62,9},{10,42,246},{0,53,3069},{0,43,306},{31,63,269},{31,63,269},{31,63,269},{28,53,4},{55,0,2178},{12,61,2},{12,61,2},{0,44,18},{62,24,2178}, +{0,44,18},{63,35,2665},{41,63,1037},{36,63,2},{8,63,2},{63,35,2665},{63,49,2665},{8,63,2},{0,54,2669},{63,49,2665},{0,54,2669},{19,0,2669},{19,0,2669},{19,0,2669},{19,0,2669},{11,63,5},{11,63,5},{11,63,5},{11,37,5},{0,40,193},{0,40,193},{31,63,13639},{26,63,7005},{25,63,4454},{21,62,2721},{28,63,15204},{17,63,4285},{13,63,24},{9,52,3457},{0,63,11020},{0,52,3109},{40,63,5381}, +{34,63,1890},{33,63,346},{29,61,296},{62,16,8712},{23,63,3636},{14,63,2},{0,53,2676},{62,39,8712},{0,53,2676},{25,63,4454},{25,63,4454},{25,63,4454},{21,60,2670},{19,63,3707},{13,63,24},{13,63,24},{12,44,246},{0,56,2853},{0,45,153},{33,63,346},{33,63,346},{33,63,346},{30,55,4},{58,0,2178},{14,63,2},{14,63,2},{0,46,10},{62,27,2178},{0,46,10},{63,39,2178},{44,63,872},{39,63,1}, +{14,63,1},{63,39,2178},{47,59,2178},{14,63,1},{0,55,2180},{47,59,2178},{0,55,2180},{21,0,2669},{21,0,2669},{21,0,2669},{21,0,2669},{13,63,20},{13,63,20},{13,63,20},{13,39,5},{0,45,104},{0,45,104},{33,63,12766},{29,63,6930},{26,63,4694},{24,63,2685},{29,63,14014},{20,63,3898},{16,63,101},{13,53,2722},{3,63,10057},{0,54,2129},{43,63,4689},{37,63,1718},{36,63,452},{32,62,164},{63,19,7578}, +{26,63,3078},{18,63,17},{0,55,1905},{63,41,7578},{0,55,1905},{26,63,4694},{26,63,4694},{26,63,4694},{24,61,2670},{22,63,3960},{16,63,101},{16,63,101},{14,47,242},{0,59,2650},{0,48,49},{36,63,452},{36,63,452},{36,63,452},{33,57,4},{53,16,2178},{18,63,17},{18,63,17},{0,49,1},{63,30,2178},{0,49,1},{63,42,1625},{46,63,650},{42,63,0},{21,63,0},{63,42,1625},{62,53,1625},{21,63,0}, +{0,56,1625},{62,53,1625},{0,56,1625},{24,0,2669},{24,0,2669},{24,0,2669},{24,0,2669},{15,63,50},{15,63,50},{15,63,50},{15,42,2},{0,48,40},{0,48,40},{34,63,11970},{31,63,6969},{29,63,4878},{26,63,2670},{31,63,13161},{21,63,3638},{18,63,229},{15,55,2146},{6,63,9313},{0,56,1410},{43,63,4097},{40,63,1614},{37,63,541},{34,62,69},{58,32,6661},{29,63,2654},{21,63,65},{0,56,1346},{52,48,6661}, +{0,56,1346},{29,63,4878},{29,63,4878},{29,63,4878},{26,63,2670},{23,63,4206},{18,63,229},{18,63,229},{15,49,242},{0,62,2506},{0,51,9},{37,63,541},{37,63,541},{37,63,541},{35,59,4},{56,16,2178},{21,63,65},{21,63,65},{2,51,1},{62,33,2178},{2,51,1},{63,45,1201},{48,63,481},{45,63,0},{27,63,0},{63,45,1201},{63,54,1201},{27,63,0},{0,57,1201},{63,54,1201},{0,57,1201},{26,0,2669}, +{26,0,2669},{26,0,2669},{26,0,2669},{17,63,85},{17,63,85},{17,63,85},{16,44,4},{0,51,8},{0,51,8},{37,63,11370},{33,63,6958},{31,63,5145},{28,63,2718},{34,63,12263},{23,63,3410},{21,63,405},{17,56,1665},{9,63,8665},{0,57,905},{46,63,3585},{43,63,1574},{40,63,637},{36,63,20},{63,27,5829},{32,63,2294},{26,63,130},{0,57,901},{63,45,5829},{0,57,901},{31,63,5145},{31,63,5145},{31,63,5145}, +{28,63,2718},{26,63,4430},{21,63,405},{21,63,405},{18,50,246},{0,63,2520},{2,53,9},{40,63,637},{40,63,637},{40,63,637},{37,61,4},{59,16,2178},{26,63,130},{26,63,130},{4,53,1},{62,36,2178},{4,53,1},{63,48,841},{51,63,337},{48,63,1},{33,63,0},{63,48,841},{62,56,841},{33,63,0},{0,58,841},{62,56,841},{0,58,841},{28,0,2669},{28,0,2669},{28,0,2669},{28,0,2669},{20,63,117}, +{20,63,117},{20,63,117},{18,46,4},{1,54,1},{1,54,1},{37,63,10794},{34,63,6895},{34,63,5374},{30,63,2813},{36,63,11574},{26,63,3274},{23,63,622},{19,57,1222},{13,63,8106},{1,59,562},{48,63,3170},{43,63,1494},{43,63,765},{39,63,4},{63,31,5082},{34,63,1998},{29,63,218},{0,59,554},{63,47,5082},{0,59,554},{34,63,5374},{34,63,5374},{34,63,5374},{30,63,2813},{29,63,4686},{23,63,622},{23,63,622}, +{20,52,246},{4,63,2714},{4,55,9},{43,63,765},{43,63,765},{43,63,765},{39,63,4},{62,16,2178},{29,63,218},{29,63,218},{6,55,1},{62,39,2178},{6,55,1},{63,51,545},{54,63,225},{51,63,1},{39,63,0},{63,51,545},{63,57,545},{39,63,0},{0,59,545},{63,57,545},{0,59,545},{30,0,2669},{30,0,2669},{30,0,2669},{30,0,2669},{22,63,180},{22,63,180},{22,63,180},{21,47,5},{3,56,1}, +{3,56,1},{40,63,10197},{37,63,6930},{36,63,5678},{32,63,2993},{37,63,10780},{29,63,3229},{26,63,945},{21,59,853},{17,63,7593},{4,60,293},{48,63,2756},{46,63,1454},{45,63,914},{41,63,37},{63,35,4344},{38,63,1740},{32,63,360},{2,60,289},{63,49,4344},{2,60,289},{36,63,5678},{36,63,5678},{36,63,5678},{32,63,2993},{31,63,5067},{26,63,945},{26,63,945},{22,55,242},{9,63,2979},{6,57,10},{45,63,914}, +{45,63,914},{45,63,914},{41,63,37},{63,21,2178},{32,63,360},{32,63,360},{8,57,1},{63,42,2178},{8,57,1},{63,54,288},{55,63,125},{54,63,0},{45,63,1},{63,54,288},{62,59,288},{45,63,1},{0,60,288},{62,59,288},{0,60,288},{32,0,2669},{32,0,2669},{32,0,2669},{32,0,2669},{25,63,250},{25,63,250},{25,63,250},{23,50,2},{5,59,2},{5,59,2},{43,63,9837},{40,63,7042},{37,63,5945}, +{34,63,3198},{40,63,10204},{32,63,3344},{29,63,1289},{24,59,589},{20,63,7225},{7,61,130},{51,63,2436},{48,63,1460},{48,63,1060},{43,63,122},{63,39,3779},{41,63,1580},{37,63,505},{6,61,129},{47,59,3779},{6,61,129},{37,63,5945},{37,63,5945},{37,63,5945},{34,63,3198},{34,63,5304},{29,63,1289},{29,63,1289},{24,57,242},{13,63,3261},{8,59,10},{48,63,1060},{48,63,1060},{48,63,1060},{43,63,122},{63,27,2178}, +{37,63,505},{37,63,505},{10,59,1},{63,45,2178},{10,59,1},{63,57,128},{58,63,53},{57,63,0},{51,63,0},{63,57,128},{63,60,128},{51,63,0},{0,61,128},{63,60,128},{0,61,128},{34,0,2669},{34,0,2669},{34,0,2669},{34,0,2669},{27,63,337},{27,63,337},{27,63,337},{25,52,2},{7,61,2},{7,61,2},{43,63,9437},{40,63,7154},{40,63,6193},{37,63,3454},{42,63,9783},{34,63,3398},{32,63,1740}, +{26,61,397},{23,63,6953},{9,62,37},{53,63,2246},{51,63,1508},{50,63,1213},{46,63,250},{63,43,3299},{44,63,1484},{40,63,673},{10,62,33},{63,53,3299},{10,62,33},{40,63,6193},{40,63,6193},{40,63,6193},{37,63,3454},{37,63,5624},{32,63,1740},{32,63,1740},{26,59,242},{17,63,3589},{10,61,10},{50,63,1213},{50,63,1213},{50,63,1213},{46,63,250},{63,33,2178},{40,63,673},{40,63,673},{12,61,1},{47,56,2178}, +{12,61,1},{63,60,32},{61,63,13},{60,63,0},{57,63,0},{63,60,32},{62,62,32},{57,63,0},{0,62,32},{62,62,32},{0,62,32},{36,0,2669},{36,0,2669},{36,0,2669},{36,0,2669},{29,63,405},{29,63,405},{29,63,405},{27,54,2},{9,63,2},{9,63,2},{46,63,9141},{43,63,7234},{43,63,6505},{40,63,3806},{43,63,9340},{37,63,3622},{34,63,2149},{27,62,277},{27,63,6772},{12,63,10},{54,63,2052}, +{53,63,1601},{51,63,1348},{48,63,436},{63,47,2904},{47,63,1452},{44,63,872},{14,63,1},{63,55,2904},{14,63,1},{43,63,6505},{43,63,6505},{43,63,6505},{40,63,3806},{40,63,5976},{34,63,2149},{34,63,2149},{28,61,242},{21,63,3955},{12,63,10},{51,63,1348},{51,63,1348},{51,63,1348},{48,63,436},{63,39,2178},{44,63,872},{44,63,872},{14,63,1},{47,59,2178},{14,63,1},{63,63,0},{63,63,0},{63,63,0}, +{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{38,0,2669},{38,0,2669},{38,0,2669},{38,0,2669},{32,63,520},{32,63,520},{32,63,520},{29,56,2},{12,63,10},{12,63,10},{46,63,8097},{46,63,6510},{43,63,5893},{41,63,3605},{46,63,8074},{37,63,3244},{37,63,2019},{30,62,129},{30,63,5794},{16,63,58},{56,63,1563},{54,63,1161},{54,63,1017},{51,63,337},{63,49,2166}, +{49,63,1083},{46,63,650},{21,63,0},{63,56,2166},{21,63,0},{43,63,5893},{43,63,5893},{43,63,5893},{41,63,3605},{40,63,5238},{37,63,2019},{37,63,2019},{30,62,113},{24,63,3401},{16,63,58},{54,63,1017},{54,63,1017},{54,63,1017},{51,63,337},{63,42,1625},{46,63,650},{46,63,650},{21,63,0},{62,53,1625},{21,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0}, +{0,63,0},{63,63,0},{0,63,0},{40,0,2665},{40,0,2665},{40,0,2665},{40,0,2665},{34,63,610},{34,63,610},{34,63,610},{31,58,0},{16,63,58},{16,63,58},{48,63,7165},{46,63,5854},{46,63,5325},{43,63,3434},{46,63,7050},{40,63,2932},{37,63,1955},{32,62,57},{32,63,5021},{20,63,117},{57,63,1137},{54,63,889},{54,63,745},{52,63,250},{63,51,1601},{51,63,801},{48,63,481},{27,63,0},{63,57,1601}, +{27,63,0},{46,63,5325},{46,63,5325},{46,63,5325},{43,63,3434},{43,63,4622},{37,63,1955},{37,63,1955},{32,62,41},{27,63,2977},{20,63,117},{54,63,745},{54,63,745},{54,63,745},{52,63,250},{63,45,1201},{48,63,481},{48,63,481},{27,63,0},{63,54,1201},{27,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{42,0,2665}, +{42,0,2665},{42,0,2665},{42,0,2665},{37,63,730},{37,63,730},{37,63,730},{33,60,1},{20,63,117},{20,63,117},{50,63,6415},{48,63,5277},{48,63,4877},{45,63,3330},{48,63,6117},{43,63,2716},{40,63,1843},{35,63,10},{35,63,4341},{23,63,205},{57,63,801},{57,63,609},{56,63,530},{54,63,169},{63,53,1121},{52,63,571},{51,63,337},{33,63,0},{63,58,1121},{33,63,0},{48,63,4877},{48,63,4877},{48,63,4877}, +{45,63,3330},{45,63,4146},{40,63,1843},{40,63,1843},{35,63,10},{30,63,2617},{23,63,205},{56,63,530},{56,63,530},{56,63,530},{54,63,169},{63,48,841},{51,63,337},{51,63,337},{33,63,0},{62,56,841},{33,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{44,0,2665},{44,0,2665},{44,0,2665},{44,0,2665},{39,63,865}, +{39,63,865},{39,63,865},{35,62,1},{23,63,205},{23,63,205},{51,63,5637},{50,63,4826},{48,63,4445},{47,63,3189},{48,63,5365},{43,63,2524},{43,63,1795},{37,63,5},{37,63,3750},{27,63,320},{59,63,531},{57,63,401},{57,63,337},{55,63,122},{63,55,726},{55,63,363},{54,63,225},{39,63,0},{63,59,726},{39,63,0},{48,63,4445},{48,63,4445},{48,63,4445},{47,63,3189},{46,63,3654},{43,63,1795},{43,63,1795}, +{37,63,5},{32,63,2329},{27,63,320},{57,63,337},{57,63,337},{57,63,337},{55,63,122},{63,51,545},{54,63,225},{54,63,225},{39,63,0},{63,57,545},{39,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{46,0,2665},{46,0,2665},{46,0,2665},{46,0,2665},{40,63,1010},{40,63,1010},{40,63,1010},{37,63,5},{27,63,320}, +{27,63,320},{3,63,10504},{0,62,1552},{0,44,169},{0,38,3866},{0,57,18065},{0,39,12152},{0,35,6099},{0,24,13992},{0,26,19423},{0,22,14922},{6,63,10216},{0,62,1552},{0,44,169},{0,38,3866},{20,17,18065},{0,39,12152},{0,35,6099},{0,24,13992},{57,0,18065},{0,24,13992},{0,35,0},{0,35,0},{0,35,0},{0,17,1},{0,17,1105},{0,14,424},{0,14,424},{0,8,666},{0,8,1217},{0,7,766},{0,35,0}, +{0,35,0},{0,35,0},{0,17,1},{9,0,1105},{0,14,424},{0,14,424},{0,8,666},{17,0,1105},{0,8,666},{34,17,9248},{0,62,1552},{0,44,169},{0,38,3866},{34,17,9248},{62,12,9248},{0,38,3866},{0,28,9256},{62,12,9248},{0,28,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{5,63,11298},{0,63,1341},{0,47,65}, +{0,38,3578},{0,61,19334},{0,42,12584},{0,36,6093},{0,24,14696},{0,28,20850},{0,24,15720},{6,63,10792},{0,63,1341},{0,47,65},{0,38,3578},{30,1,19334},{0,42,12584},{0,36,6093},{0,24,14696},{61,0,19334},{0,24,14696},{0,41,0},{0,41,0},{0,41,0},{0,20,1},{0,20,1513},{0,16,585},{0,16,585},{0,10,901},{0,9,1681},{0,8,1070},{0,41,0},{0,41,0},{0,41,0},{0,20,1},{10,1,1513}, +{0,16,585},{0,16,585},{0,10,901},{20,0,1513},{0,10,901},{37,17,9248},{0,63,1341},{0,47,65},{0,38,3578},{37,17,9248},{62,15,9248},{0,38,3578},{0,30,9256},{62,15,9248},{0,30,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,63,12200},{0,63,1325},{0,49,9},{0,41,3298},{0,63,20705},{0,42,13032},{0,38,6147}, +{0,27,15400},{0,31,22426},{0,25,16626},{9,63,11512},{0,63,1325},{0,49,9},{0,41,3298},{31,3,20689},{0,42,13032},{0,38,6147},{0,27,15400},{63,1,20689},{0,27,15400},{0,47,0},{0,47,0},{0,47,0},{0,23,1},{0,23,1985},{0,19,769},{0,19,769},{0,11,1202},{0,11,2193},{0,10,1374},{0,47,0},{0,47,0},{0,47,0},{0,23,1},{12,0,1985},{0,19,769},{0,19,769},{0,11,1202},{23,0,1985}, +{0,11,1202},{48,1,9248},{0,63,1325},{0,49,9},{0,41,3298},{48,1,9248},{63,17,9248},{0,41,3298},{0,32,9250},{63,17,9248},{0,32,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,63,13288},{0,63,1565},{0,51,4},{0,44,3050},{2,63,22214},{0,45,13496},{0,41,6227},{0,28,16225},{0,31,24090},{0,27,17528},{9,63,12344}, +{0,63,1565},{0,51,4},{0,44,3050},{34,1,22129},{0,45,13496},{0,41,6227},{0,28,16225},{63,3,22129},{0,28,16225},{0,53,0},{0,53,0},{0,53,0},{0,26,1},{0,26,2521},{0,22,985},{0,22,985},{0,13,1517},{0,11,2801},{0,11,1766},{0,53,0},{0,53,0},{0,53,0},{0,26,1},{13,1,2521},{0,22,985},{0,22,985},{0,13,1517},{26,0,2521},{0,13,1517},{51,1,9248},{1,63,1552},{1,51,0}, +{0,44,3050},{51,1,9248},{63,20,9248},{0,44,3050},{0,34,9250},{63,20,9248},{0,34,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,63,14818},{1,63,2106},{0,54,58},{0,47,2792},{3,63,24091},{0,50,14075},{0,42,6341},{0,30,17106},{0,33,26067},{0,28,18692},{12,63,13474},{3,63,2077},{1,54,50},{0,47,2792},{31,12,23851}, +{0,50,14075},{0,42,6341},{0,30,17106},{62,6,23851},{0,30,17106},{0,59,1},{0,59,1},{0,59,1},{0,30,0},{0,30,3200},{0,25,1258},{0,25,1258},{0,13,1940},{0,14,3542},{0,13,2229},{0,59,1},{0,59,1},{0,59,1},{0,30,0},{15,0,3200},{0,25,1258},{0,25,1258},{0,13,1940},{30,0,3200},{0,13,1940},{55,0,9248},{6,63,1885},{3,53,2},{0,47,2792},{55,0,9248},{62,24,9248},{0,47,2792}, +{0,36,9256},{62,24,9248},{0,36,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{9,63,16258},{3,63,2813},{1,56,141},{0,49,2561},{4,63,25971},{0,50,14619},{0,45,6453},{0,32,17996},{0,36,27923},{0,30,19698},{12,63,14594},{3,63,2669},{2,56,122},{0,49,2561},{38,1,25472},{0,50,14619},{0,45,6453},{0,32,17996},{45,16,25472}, +{0,32,17996},{0,63,9},{0,63,9},{0,63,9},{0,33,1},{0,33,3872},{0,25,1530},{0,25,1530},{0,16,2378},{0,14,4294},{0,14,2717},{0,63,9},{0,63,9},{0,63,9},{0,33,1},{16,1,3872},{0,25,1530},{0,25,1530},{0,16,2378},{33,0,3872},{0,16,2378},{58,0,9248},{9,63,2205},{5,55,2},{0,49,2561},{58,0,9248},{62,27,9248},{0,49,2561},{0,38,9256},{62,27,9248},{0,38,9256},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{9,63,17750},{3,63,3617},{1,58,254},{0,50,2366},{6,63,27563},{0,53,14891},{0,47,6385},{0,32,18616},{0,39,29523},{0,32,20465},{15,63,15654},{6,63,3425},{2,59,206},{0,50,2366},{41,0,26744},{0,53,14891},{0,47,6385},{0,32,18616},{62,10,26744},{0,32,18616},{1,63,101},{1,63,101},{1,63,101}, +{0,36,5},{0,36,4420},{0,28,1666},{0,28,1666},{0,16,2642},{0,16,4931},{0,16,3083},{2,63,72},{2,63,72},{2,63,72},{1,35,4},{15,7,4418},{0,28,1666},{0,28,1666},{0,16,2642},{31,3,4418},{0,16,2642},{61,0,9248},{13,63,2554},{7,57,2},{0,50,2362},{61,0,9248},{62,30,9248},{0,50,2362},{0,40,9256},{62,30,9248},{0,40,9256},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,2,0}, +{0,2,0},{0,2,0},{0,1,0},{0,1,1},{0,1,1},{12,63,19046},{4,63,4598},{3,60,382},{0,52,2237},{6,63,28187},{0,59,14347},{0,50,5579},{0,35,18104},{0,39,29955},{0,33,20313},{17,63,16091},{7,63,4046},{4,61,206},{0,52,2237},{44,0,26744},{0,59,14347},{0,50,5579},{0,35,18104},{62,13,26744},{0,35,18104},{2,63,264},{2,63,264},{2,63,264},{1,38,52},{0,42,4420},{0,33,1381},{0,33,1381}, +{0,18,2405},{0,19,5115},{0,18,2981},{4,63,117},{4,63,117},{4,63,117},{3,37,4},{15,13,4418},{0,33,1381},{0,33,1381},{0,18,2405},{31,6,4418},{0,18,2405},{63,2,9248},{17,63,2938},{9,59,2},{0,52,2137},{63,2,9248},{46,41,9248},{0,52,2137},{0,42,9256},{46,41,9248},{0,42,9256},{1,0,52},{1,0,52},{1,0,52},{1,0,52},{0,8,0},{0,8,0},{0,8,0},{0,4,0},{0,3,20}, +{0,3,20},{12,63,20585},{6,63,5786},{4,63,625},{1,56,2246},{9,63,29012},{0,62,13736},{0,53,4760},{0,38,17595},{0,45,30452},{0,36,20086},{20,63,16620},{9,63,4794},{6,63,205},{1,56,2230},{39,16,26744},{0,62,13736},{0,53,4760},{0,38,17595},{62,16,26744},{0,38,17595},{4,63,589},{4,63,589},{4,63,589},{2,41,185},{0,49,4418},{0,36,1097},{0,36,1097},{0,21,2153},{0,22,5357},{0,21,2937},{6,63,169}, +{6,63,169},{6,63,169},{5,39,2},{24,1,4418},{0,36,1097},{0,36,1097},{0,21,2153},{49,0,4418},{0,21,2153},{59,16,9248},{20,63,3380},{11,62,4},{0,55,1901},{59,16,9248},{62,36,9248},{0,55,1901},{0,45,9250},{62,36,9248},{0,45,9250},{2,0,185},{2,0,185},{2,0,185},{2,0,185},{0,14,1},{0,14,1},{0,14,1},{0,7,1},{0,5,72},{0,5,72},{15,63,21605},{9,63,6850},{5,63,978}, +{2,57,2226},{11,63,29435},{0,63,12990},{0,55,3962},{0,41,16835},{0,45,30392},{0,38,19516},{22,63,16694},{12,63,5218},{9,63,225},{4,56,2130},{49,1,26259},{0,63,12990},{0,55,3962},{0,41,16835},{46,27,26259},{0,41,16835},{5,63,978},{5,63,978},{5,63,978},{3,43,370},{0,55,4418},{0,39,881},{0,39,881},{0,24,1945},{0,25,5605},{0,22,2889},{9,63,225},{9,63,225},{9,63,225},{7,41,2},{27,1,4418}, +{0,39,881},{0,39,881},{0,24,1945},{55,0,4418},{0,24,1945},{63,14,8978},{23,63,3592},{14,63,1},{0,58,1625},{63,14,8978},{46,47,8978},{0,58,1625},{0,46,8986},{46,47,8978},{0,46,8986},{3,0,369},{3,0,369},{3,0,369},{3,0,369},{0,20,0},{0,20,0},{0,20,0},{0,10,1},{0,8,136},{0,8,136},{15,63,21141},{9,63,7026},{6,63,1481},{3,58,2034},{12,63,28216},{0,63,11406},{0,56,2868}, +{0,41,14915},{0,48,28876},{0,39,17854},{23,63,15352},{15,63,4866},{11,63,306},{6,58,1746},{52,0,24371},{0,63,11406},{0,56,2868},{0,41,14915},{62,21,24371},{0,41,14915},{6,63,1481},{6,63,1481},{6,63,1481},{4,46,617},{0,61,4418},{0,45,689},{0,45,689},{0,27,1769},{0,28,5885},{0,24,2889},{11,63,306},{11,63,306},{11,63,306},{9,43,2},{30,1,4418},{0,45,689},{0,45,689},{0,27,1769},{61,0,4418}, +{0,27,1769},{55,32,7938},{26,63,3176},{16,63,1},{0,58,1129},{55,32,7938},{46,48,7938},{0,58,1129},{0,47,7946},{46,48,7938},{0,47,7946},{4,0,617},{4,0,617},{4,0,617},{4,0,617},{0,26,0},{0,26,0},{0,26,0},{0,13,1},{0,11,232},{0,11,232},{17,63,20849},{9,63,7458},{8,63,2106},{4,59,1970},{12,63,27224},{0,63,10078},{0,58,1986},{0,42,13214},{0,50,27357},{0,41,16276},{26,63,14168}, +{17,63,4556},{14,63,394},{9,58,1410},{47,14,22568},{0,63,10078},{0,58,1986},{0,42,13214},{62,23,22568},{0,42,13214},{8,63,2106},{8,63,2106},{8,63,2106},{5,48,930},{1,63,4452},{0,47,521},{0,47,521},{0,28,1600},{0,31,6197},{0,27,2921},{14,63,394},{14,63,394},{14,63,394},{11,45,2},{33,1,4418},{0,47,521},{0,47,521},{0,28,1600},{63,2,4418},{0,28,1600},{56,33,6962},{29,63,2792},{19,63,1}, +{0,59,740},{56,33,6962},{49,48,6962},{0,59,740},{0,48,6964},{49,48,6962},{0,48,6964},{5,0,929},{5,0,929},{5,0,929},{5,0,929},{0,32,0},{0,32,0},{0,32,0},{0,16,0},{0,14,360},{0,14,360},{17,63,20651},{12,63,7922},{9,63,2921},{5,60,2052},{15,63,26270},{0,63,8890},{0,59,1154},{0,44,11309},{0,53,25875},{0,42,14658},{26,63,12890},{20,63,4254},{16,63,493},{10,59,1076},{56,0,20642}, +{0,63,8890},{0,59,1154},{0,44,11309},{62,25,20642},{0,44,11309},{9,63,2921},{9,63,2921},{9,63,2921},{6,51,1360},{3,63,4634},{0,50,346},{0,50,346},{0,31,1402},{0,33,6554},{0,28,2987},{16,63,493},{16,63,493},{16,63,493},{13,48,1},{31,12,4418},{0,50,346},{0,50,346},{0,31,1402},{62,6,4418},{0,31,1402},{63,23,5941},{30,63,2386},{23,63,1},{0,61,388},{63,23,5941},{63,43,5941},{0,61,388}, +{0,49,5945},{63,43,5941},{0,49,5945},{6,0,1360},{6,0,1360},{6,0,1360},{6,0,1360},{0,39,0},{0,39,0},{0,39,0},{0,19,1},{0,16,522},{0,16,522},{20,63,20683},{12,63,8578},{11,63,3792},{7,60,2241},{15,63,25566},{1,63,8090},{0,59,642},{0,45,9834},{0,53,24595},{0,44,13350},{29,63,11794},{20,63,4030},{17,63,610},{13,59,804},{58,0,19021},{3,63,8050},{0,59,642},{0,45,9834},{62,27,19021}, +{0,45,9834},{11,63,3792},{11,63,3792},{11,63,3792},{8,53,1808},{3,63,4954},{0,55,232},{0,55,232},{0,33,1241},{0,36,6922},{0,31,3051},{17,63,610},{17,63,610},{17,63,610},{15,50,1},{31,18,4418},{0,55,232},{0,55,232},{0,33,1241},{62,9,4418},{0,33,1241},{63,26,5101},{34,63,2050},{26,63,1},{0,61,164},{63,26,5101},{62,45,5101},{0,61,164},{0,50,5105},{62,45,5101},{0,50,5105},{7,0,1808}, +{7,0,1808},{7,0,1808},{7,0,1808},{0,45,0},{0,45,0},{0,45,0},{0,22,1},{0,19,706},{0,19,706},{20,63,20715},{15,63,9258},{12,63,4729},{8,61,2553},{17,63,25067},{3,63,7474},{0,61,264},{0,47,8373},{0,56,23451},{0,45,12138},{31,63,10854},{23,63,3766},{20,63,698},{16,60,594},{60,0,17485},{6,63,7274},{0,61,264},{0,47,8373},{56,32,17485},{0,47,8373},{12,63,4729},{12,63,4729},{12,63,4729}, +{8,56,2320},{6,63,5386},{0,59,130},{0,59,130},{0,35,1076},{0,39,7322},{0,33,3161},{20,63,698},{20,63,698},{20,63,698},{17,51,2},{34,17,4418},{0,59,130},{0,59,130},{0,35,1076},{62,12,4418},{0,35,1076},{63,29,4325},{35,63,1733},{29,63,1},{0,62,41},{63,29,4325},{63,46,4325},{0,62,41},{0,51,4329},{63,46,4325},{0,51,4329},{8,0,2320},{8,0,2320},{8,0,2320},{8,0,2320},{0,50,1}, +{0,50,1},{0,50,1},{0,25,1},{0,19,914},{0,19,914},{20,63,21003},{15,63,10106},{14,63,5840},{9,62,2993},{17,63,24683},{3,63,7010},{0,62,74},{0,49,7113},{0,56,22427},{0,47,11094},{33,63,9941},{26,63,3566},{23,63,818},{17,61,402},{62,0,16034},{9,63,6562},{0,62,74},{0,49,7113},{62,31,16034},{0,49,7113},{14,63,5840},{14,63,5840},{14,63,5840},{10,58,2896},{6,63,5962},{0,62,58},{0,62,58}, +{0,38,932},{0,42,7754},{0,35,3317},{23,63,818},{23,63,818},{23,63,818},{19,53,2},{37,17,4418},{0,62,58},{0,62,58},{0,38,932},{62,15,4418},{0,38,932},{63,32,3613},{38,63,1445},{32,63,1},{0,63,0},{63,32,3613},{61,48,3613},{0,63,0},{0,52,3617},{61,48,3613},{0,52,3617},{9,0,2896},{9,0,2896},{9,0,2896},{9,0,2896},{0,56,1},{0,56,1},{0,56,1},{0,28,1},{0,22,1130}, +{0,22,1130},{23,63,21401},{17,63,11165},{15,63,7141},{10,63,3641},{20,63,24533},{6,63,6762},{0,63,81},{0,49,5745},{0,59,21333},{0,47,9996},{34,63,8897},{29,63,3396},{26,63,976},{20,61,224},{56,16,14504},{12,63,5834},{1,63,68},{0,49,5745},{62,33,14504},{0,49,5745},{15,63,7141},{15,63,7141},{15,63,7141},{11,61,3617},{9,63,6772},{0,63,81},{0,63,81},{0,41,794},{0,45,8260},{0,38,3515},{26,63,976}, +{26,63,976},{26,63,976},{21,56,0},{49,0,4418},{1,63,68},{1,63,68},{0,41,794},{62,18,4418},{0,41,794},{63,35,2888},{41,63,1156},{35,63,0},{7,63,0},{63,35,2888},{63,49,2888},{7,63,0},{0,53,2896},{63,49,2888},{0,53,2896},{11,0,3617},{11,0,3617},{11,0,3617},{11,0,3617},{0,63,0},{0,63,0},{0,63,0},{0,32,1},{0,25,1413},{0,25,1413},{23,63,21913},{17,63,12317},{17,63,8473}, +{12,63,4330},{20,63,24437},{6,63,6650},{2,63,298},{0,52,4721},{0,62,20509},{0,49,9157},{37,63,8153},{29,63,3268},{28,63,1129},{23,61,128},{63,6,13235},{15,63,5258},{6,63,145},{0,52,4721},{62,35,13235},{0,52,4721},{17,63,8473},{17,63,8473},{17,63,8473},{12,63,4330},{9,63,7636},{2,63,298},{2,63,298},{0,42,689},{0,45,8740},{0,39,3689},{28,63,1129},{28,63,1129},{28,63,1129},{23,58,0},{52,0,4418}, +{6,63,145},{6,63,145},{0,42,689},{62,21,4418},{0,42,689},{63,38,2312},{43,63,925},{38,63,0},{13,63,0},{63,38,2312},{62,51,2312},{13,63,0},{0,54,2320},{62,51,2312},{0,54,2320},{12,0,4329},{12,0,4329},{12,0,4329},{12,0,4329},{1,63,52},{1,63,52},{1,63,52},{0,34,1},{0,28,1693},{0,28,1693},{26,63,22641},{20,63,13461},{17,63,9881},{13,63,5169},{20,63,24597},{6,63,6794},{3,63,649}, +{0,52,3713},{0,62,19773},{0,50,8413},{37,63,7401},{32,63,3181},{29,63,1280},{24,62,48},{63,11,12051},{18,63,4746},{9,63,233},{0,52,3713},{47,45,12051},{0,52,3713},{17,63,9881},{17,63,9881},{17,63,9881},{13,63,5169},{12,63,8644},{3,63,649},{3,63,649},{0,45,569},{0,50,9245},{0,42,3905},{29,63,1280},{29,63,1280},{29,63,1280},{25,60,0},{55,0,4418},{9,63,233},{9,63,233},{0,45,569},{62,24,4418}, +{0,45,569},{63,41,1800},{46,63,725},{41,63,0},{19,63,0},{63,41,1800},{63,52,1800},{19,63,0},{0,55,1808},{63,52,1800},{0,55,1808},{13,0,5105},{13,0,5105},{13,0,5105},{13,0,5105},{2,63,185},{2,63,185},{2,63,185},{0,37,1},{0,31,2005},{0,31,2005},{26,63,23345},{20,63,14805},{20,63,11441},{14,63,6170},{23,63,24893},{9,63,7066},{4,63,1236},{0,53,2900},{0,63,19260},{0,52,7861},{40,63,6753}, +{34,63,3038},{32,63,1465},{27,63,9},{62,16,10952},{21,63,4298},{12,63,353},{0,53,2900},{62,39,10952},{0,53,2900},{20,63,11441},{20,63,11441},{20,63,11441},{14,63,6170},{12,63,9764},{4,63,1236},{4,63,1236},{0,47,458},{0,50,9789},{0,45,4185},{32,63,1465},{32,63,1465},{32,63,1465},{27,62,0},{58,0,4418},{12,63,353},{12,63,353},{0,47,458},{62,27,4418},{0,47,458},{63,44,1352},{48,63,544},{44,63,0}, +{25,63,0},{63,44,1352},{62,54,1352},{25,63,0},{0,56,1360},{62,54,1352},{0,56,1360},{14,0,5945},{14,0,5945},{14,0,5945},{14,0,5945},{3,63,400},{3,63,400},{3,63,400},{0,40,1},{0,33,2336},{0,33,2336},{26,63,24443},{23,63,16415},{20,63,13259},{15,63,7448},{23,63,25379},{9,63,7606},{6,63,2021},{0,55,2045},{0,63,18918},{0,53,7275},{40,63,6141},{37,63,2978},{34,63,1625},{29,63,10},{63,19,9818}, +{24,63,3870},{17,63,530},{0,55,2045},{63,41,9818},{0,55,2045},{20,63,13259},{20,63,13259},{20,63,13259},{15,63,7448},{15,63,11218},{6,63,2021},{6,63,2021},{0,49,365},{0,53,10427},{0,45,4509},{34,63,1625},{34,63,1625},{34,63,1625},{29,63,10},{53,16,4418},{17,63,530},{17,63,530},{0,49,365},{63,30,4418},{0,49,365},{63,47,925},{51,63,377},{47,63,1},{31,63,1},{63,47,925},{63,55,925},{31,63,1}, +{0,58,929},{63,55,925},{0,58,929},{15,0,6964},{15,0,6964},{15,0,6964},{15,0,6964},{3,63,769},{3,63,769},{3,63,769},{0,44,0},{0,36,2745},{0,36,2745},{29,63,25483},{23,63,17983},{22,63,15066},{17,63,8739},{23,63,26083},{12,63,8302},{6,63,2965},{0,56,1458},{0,63,18886},{0,53,6955},{43,63,5581},{40,63,2986},{37,63,1801},{32,63,65},{58,32,8901},{27,63,3558},{20,63,698},{0,56,1458},{52,48,8901}, +{0,56,1458},{22,63,15066},{22,63,15066},{22,63,15066},{17,63,8739},{15,63,12626},{6,63,2965},{6,63,2965},{0,52,277},{0,56,11011},{0,49,4833},{37,63,1801},{37,63,1801},{37,63,1801},{32,63,65},{56,16,4418},{20,63,698},{20,63,698},{0,52,277},{62,33,4418},{0,52,277},{63,50,613},{52,63,250},{50,63,0},{37,63,0},{63,50,613},{62,57,613},{37,63,0},{0,59,617},{62,57,613},{0,59,617},{16,0,7946}, +{16,0,7946},{16,0,7946},{16,0,7946},{5,63,1184},{5,63,1184},{5,63,1184},{0,47,0},{0,36,3145},{0,36,3145},{29,63,26667},{26,63,19695},{23,63,16891},{18,63,10206},{26,63,26795},{12,63,9118},{9,63,4037},{0,58,933},{0,63,19110},{0,56,6699},{46,63,5181},{40,63,2970},{40,63,2009},{34,63,160},{63,27,8069},{30,63,3310},{23,63,898},{0,58,933},{63,45,8069},{0,58,933},{23,63,16891},{23,63,16891},{23,63,16891}, +{18,63,10206},{17,63,14179},{9,63,4037},{9,63,4037},{0,55,221},{0,59,11627},{0,50,5115},{40,63,2009},{40,63,2009},{40,63,2009},{34,63,160},{59,16,4418},{23,63,898},{23,63,898},{0,55,221},{62,36,4418},{0,55,221},{63,53,365},{55,63,146},{53,63,0},{43,63,0},{63,53,365},{63,58,365},{43,63,0},{0,60,369},{63,58,365},{0,60,369},{16,0,8986},{16,0,8986},{16,0,8986},{16,0,8986},{6,63,1665}, +{6,63,1665},{6,63,1665},{0,50,1},{0,39,3545},{0,39,3545},{31,63,26643},{26,63,20231},{26,63,17731},{20,63,10867},{26,63,26531},{15,63,9546},{12,63,4889},{0,59,590},{0,63,18606},{0,56,5707},{46,63,4781},{43,63,2978},{42,63,2228},{37,63,320},{63,31,7322},{32,63,3134},{27,63,1125},{0,59,554},{63,47,7322},{0,59,554},{26,63,17731},{26,63,17731},{26,63,17731},{20,63,10867},{20,63,15043},{12,63,4889},{12,63,4889}, +{1,56,185},{0,62,11315},{0,53,4667},{42,63,2228},{42,63,2228},{42,63,2228},{37,63,320},{62,16,4418},{27,63,1125},{27,63,1125},{0,56,162},{62,39,4418},{0,56,162},{63,56,181},{57,63,73},{56,63,0},{49,63,0},{63,56,181},{62,60,181},{49,63,0},{0,61,185},{62,60,181},{0,61,185},{18,0,9250},{18,0,9250},{18,0,9250},{18,0,9250},{8,63,1972},{8,63,1972},{8,63,1972},{1,52,4},{0,42,3341}, +{0,42,3341},{34,63,26006},{29,63,20400},{28,63,18273},{23,63,11384},{29,63,25736},{17,63,9864},{12,63,5726},{2,60,366},{0,63,18111},{0,59,4452},{48,63,4436},{46,63,3050},{43,63,2465},{40,63,562},{63,35,6584},{37,63,3006},{30,63,1421},{0,61,237},{63,49,6584},{0,61,237},{28,63,18273},{28,63,18273},{28,63,18273},{23,63,11384},{23,63,15704},{12,63,5726},{12,63,5726},{3,59,189},{0,63,10886},{0,56,3924},{43,63,2465}, +{43,63,2465},{43,63,2465},{40,63,562},{63,21,4418},{30,63,1421},{30,63,1421},{0,59,100},{63,42,4418},{0,59,100},{63,59,52},{60,63,20},{59,63,1},{56,63,0},{63,59,52},{63,61,52},{56,63,0},{0,62,52},{63,61,52},{0,62,52},{20,0,9256},{20,0,9256},{20,0,9256},{20,0,9256},{9,63,2205},{9,63,2205},{9,63,2205},{4,54,1},{0,45,2925},{0,45,2925},{34,63,25526},{31,63,20721},{29,63,18700}, +{24,63,11921},{31,63,25279},{20,63,10264},{15,63,6494},{4,62,238},{4,63,17924},{0,59,3588},{51,63,4228},{48,63,3140},{46,63,2665},{41,63,833},{63,39,6019},{40,63,2958},{34,63,1693},{0,62,84},{47,59,6019},{0,62,84},{29,63,18700},{29,63,18700},{29,63,18700},{24,63,11921},{23,63,16280},{15,63,6494},{15,63,6494},{5,61,189},{0,63,10854},{0,59,3332},{46,63,2665},{46,63,2665},{46,63,2665},{41,63,833},{63,27,4418}, +{34,63,1693},{34,63,1693},{0,61,61},{63,45,4418},{0,61,61},{63,62,4},{63,63,4},{62,63,1},{62,63,0},{63,62,4},{62,63,4},{62,63,0},{0,63,4},{62,63,4},{0,63,4},{22,0,9256},{22,0,9256},{22,0,9256},{22,0,9256},{12,63,2389},{12,63,2389},{12,63,2389},{6,56,1},{0,50,2512},{0,50,2512},{37,63,24250},{34,63,19895},{31,63,18169},{26,63,11820},{34,63,23717},{20,63,10012},{17,63,6584}, +{7,62,122},{6,63,16879},{0,62,2736},{51,63,3648},{48,63,2784},{48,63,2384},{43,63,778},{63,42,5163},{41,63,2584},{37,63,1549},{0,63,9},{46,61,5163},{0,63,9},{31,63,18169},{31,63,18169},{31,63,18169},{26,63,11820},{26,63,15620},{17,63,6584},{17,63,6584},{7,62,106},{0,63,10150},{0,59,2624},{48,63,2384},{48,63,2384},{48,63,2384},{43,63,778},{63,31,3872},{37,63,1549},{37,63,1549},{0,63,9},{63,47,3872}, +{0,63,9},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{24,0,9256},{24,0,9256},{24,0,9256},{24,0,9256},{15,63,2605},{15,63,2605},{15,63,2605},{8,58,1},{0,53,2176},{0,53,2176},{37,63,22746},{34,63,18775},{34,63,17254},{29,63,11564},{34,63,21973},{23,63,9532},{20,63,6424},{9,62,57},{9,63,15607},{0,62,2032},{53,63,3058}, +{51,63,2304},{48,63,2000},{46,63,650},{63,43,4267},{43,63,2134},{40,63,1285},{4,63,0},{63,53,4267},{4,63,0},{34,63,17254},{34,63,17254},{34,63,17254},{29,63,11564},{29,63,14692},{20,63,6424},{20,63,6424},{9,62,41},{0,63,9366},{0,62,2016},{48,63,2000},{48,63,2000},{48,63,2000},{46,63,650},{55,49,3200},{40,63,1285},{40,63,1285},{4,63,0},{63,48,3200},{4,63,0},{63,63,0},{63,63,0},{63,63,0}, +{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{26,0,9256},{26,0,9256},{26,0,9256},{26,0,9256},{17,63,2836},{17,63,2836},{17,63,2836},{10,60,1},{0,59,1856},{0,59,1856},{40,63,21168},{37,63,17685},{34,63,16300},{30,63,11323},{37,63,20205},{26,63,9090},{23,63,6310},{12,63,4},{12,63,14287},{0,62,1546},{54,63,2377},{51,63,1809},{51,63,1553},{47,63,520},{61,49,3361}, +{46,63,1683},{43,63,1018},{11,63,0},{63,54,3361},{11,63,0},{34,63,16300},{34,63,16300},{34,63,16300},{30,63,11323},{29,63,13666},{23,63,6310},{23,63,6310},{12,63,4},{3,63,8686},{0,62,1530},{51,63,1553},{51,63,1553},{51,63,1553},{47,63,520},{63,37,2521},{43,63,1018},{43,63,1018},{11,63,0},{62,50,2521},{11,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0}, +{0,63,0},{63,63,0},{0,63,0},{29,0,9250},{29,0,9250},{29,0,9250},{29,0,9250},{20,63,3114},{20,63,3114},{20,63,3114},{12,62,1},{0,62,1514},{0,62,1514},{40,63,19824},{37,63,16725},{37,63,15500},{32,63,11084},{37,63,18685},{26,63,8770},{26,63,6270},{14,63,16},{15,63,13215},{0,63,1325},{54,63,1881},{54,63,1449},{51,63,1249},{48,63,409},{63,47,2649},{47,63,1329},{44,63,797},{16,63,1},{63,55,2649}, +{16,63,1},{37,63,15500},{37,63,15500},{37,63,15500},{32,63,11084},{31,63,12906},{26,63,6270},{26,63,6270},{14,63,16},{6,63,8150},{0,63,1325},{51,63,1249},{51,63,1249},{51,63,1249},{48,63,409},{63,40,1985},{44,63,797},{44,63,797},{16,63,1},{63,51,1985},{16,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{31,0,9250}, +{31,0,9250},{31,0,9250},{31,0,9250},{22,63,3393},{22,63,3393},{22,63,3393},{14,63,16},{0,63,1325},{0,63,1325},{43,63,18608},{40,63,15853},{37,63,14796},{34,63,10841},{40,63,17341},{29,63,8410},{26,63,6206},{17,63,74},{17,63,12226},{0,63,1341},{56,63,1451},{54,63,1081},{54,63,937},{51,63,305},{63,50,2017},{49,63,1011},{47,63,605},{22,63,1},{62,57,2017},{22,63,1},{37,63,14796},{37,63,14796},{37,63,14796}, +{34,63,10841},{34,63,12089},{26,63,6206},{26,63,6206},{17,63,74},{9,63,7678},{0,63,1341},{54,63,937},{54,63,937},{54,63,937},{51,63,305},{63,43,1513},{47,63,605},{47,63,605},{22,63,1},{62,53,1513},{22,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{32,0,9256},{32,0,9256},{32,0,9256},{32,0,9256},{23,63,3650}, +{23,63,3650},{23,63,3650},{17,63,74},{0,63,1341},{0,63,1341},{43,63,17392},{40,63,15021},{40,63,14060},{37,63,10673},{40,63,16013},{32,63,8261},{29,63,6166},{19,63,194},{20,63,11338},{1,63,1594},{57,63,1041},{56,63,822},{54,63,697},{52,63,234},{63,51,1473},{51,63,737},{49,63,442},{28,63,1},{63,57,1473},{28,63,1},{40,63,14060},{40,63,14060},{40,63,14060},{37,63,10673},{34,63,11401},{29,63,6166},{29,63,6166}, +{19,63,194},{12,63,7270},{1,63,1594},{54,63,697},{54,63,697},{54,63,697},{52,63,234},{63,46,1105},{49,63,442},{49,63,442},{28,63,1},{63,54,1105},{28,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{34,0,9256},{34,0,9256},{34,0,9256},{34,0,9256},{26,63,3898},{26,63,3898},{26,63,3898},{19,63,194},{1,63,1594}, +{1,63,1594}, +/**** ended inlining basisu_transcoder_tables_dxt1_6.inc ****/ + }; + + static const etc1_to_dxt1_56_solution g_etc1_to_dxt_5[32 * 8 * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS * NUM_ETC1_TO_DXT1_SELECTOR_RANGES] = { +/**** start inlining basisu_transcoder_tables_dxt1_5.inc ****/ +// Copyright (C) 2017-2019 Binomial LLC. All Rights Reserved. +// +// 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. +{0,2,18},{0,1,9},{0,1,0},{0,1,9},{0,1,40},{0,1,22},{0,1,13},{0,1,61},{0,1,47},{0,1,65},{0,2,18},{0,1,9},{0,1,0},{0,1,9},{0,1,40},{0,1,22},{0,1,13},{0,1,61},{1,0,40},{0,1,61},{0,1,0},{0,1,0},{0,1,0},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,0}, +{0,1,0},{0,1,0},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{1,0,18},{0,1,9},{0,1,0},{0,1,9},{1,0,18},{2,0,18},{0,1,9},{0,1,36},{2,0,18},{0,1,36},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,5,54},{0,3,40},{0,2,61}, +{0,2,36},{0,4,51},{0,2,37},{0,2,1},{0,2,52},{0,2,77},{0,1,73},{1,3,22},{1,2,13},{1,2,4},{1,2,13},{0,4,51},{1,2,34},{0,2,1},{0,2,52},{4,0,51},{0,2,52},{0,4,37},{0,4,37},{0,4,37},{0,2,36},{0,3,8},{0,2,1},{0,2,1},{0,1,5},{0,1,30},{0,1,9},{1,2,4},{1,2,4},{1,2,4},{1,1,8},{1,1,8}, +{0,2,1},{0,2,1},{0,1,5},{3,0,8},{0,1,5},{2,1,18},{0,3,4},{1,2,0},{0,2,0},{2,1,18},{5,0,18},{0,2,0},{0,2,36},{5,0,18},{0,2,36},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,2,1},{0,2,1},{0,2,1},{0,1,1},{0,1,5},{0,1,5},{1,6,54},{1,4,40},{1,3,61},{1,3,36},{1,5,51},{1,3,37},{1,3,1}, +{1,3,52},{0,3,72},{0,3,40},{2,4,22},{2,3,13},{2,3,4},{2,3,13},{1,5,51},{0,4,29},{1,3,1},{0,3,40},{7,0,51},{0,3,40},{1,5,37},{1,5,37},{1,5,37},{1,3,36},{1,4,8},{1,3,1},{1,3,1},{1,2,5},{0,3,8},{1,2,9},{2,3,4},{2,3,4},{2,3,4},{2,2,8},{3,0,8},{1,3,1},{1,3,1},{1,2,5},{6,0,8}, +{1,2,5},{3,2,18},{1,4,4},{2,3,0},{1,3,0},{3,2,18},{6,1,18},{1,3,0},{0,3,36},{6,1,18},{0,3,36},{1,0,36},{1,0,36},{1,0,36},{1,0,36},{1,3,1},{1,3,1},{1,3,1},{1,2,1},{0,3,4},{0,3,4},{2,7,54},{2,5,40},{2,4,62},{2,4,38},{2,6,51},{2,4,27},{2,4,3},{2,3,69},{0,5,60},{1,4,54},{3,5,22}, +{3,4,9},{3,4,6},{3,4,21},{5,0,51},{2,4,27},{2,4,3},{0,4,50},{10,0,51},{0,4,50},{2,6,37},{2,6,37},{2,6,37},{2,4,37},{2,5,8},{2,4,2},{2,4,2},{2,3,5},{1,4,8},{2,3,9},{3,4,5},{3,4,5},{3,4,5},{3,3,8},{4,1,8},{2,4,2},{2,4,2},{2,3,5},{9,0,8},{2,3,5},{3,5,18},{2,5,4},{3,4,2}, +{2,4,2},{3,5,18},{7,2,18},{2,4,2},{0,4,50},{7,2,18},{0,4,50},{2,0,36},{2,0,36},{2,0,36},{2,0,36},{2,4,1},{2,4,1},{2,4,1},{2,3,1},{1,4,4},{1,4,4},{3,8,68},{3,6,60},{4,5,68},{3,5,50},{3,7,53},{3,6,28},{3,5,5},{3,5,53},{3,5,68},{2,5,38},{4,6,22},{4,5,13},{4,5,4},{4,5,13},{6,1,52}, +{3,6,27},{3,5,4},{1,5,37},{13,0,52},{1,5,37},{3,7,50},{3,7,50},{3,7,50},{3,5,50},{3,6,11},{3,5,5},{3,5,5},{3,4,6},{2,5,11},{3,4,9},{4,5,4},{4,5,4},{4,5,4},{4,4,8},{4,4,8},{3,5,4},{3,5,4},{3,4,5},{12,0,8},{3,4,5},{7,0,18},{4,5,9},{4,5,0},{3,5,0},{7,0,18},{14,0,18},{3,5,0}, +{0,5,36},{14,0,18},{0,5,36},{3,0,50},{3,0,50},{3,0,50},{3,0,50},{3,6,2},{3,6,2},{3,6,2},{3,4,2},{2,5,2},{2,5,2},{4,9,54},{4,7,40},{4,6,61},{4,6,36},{4,8,51},{4,6,37},{4,6,1},{4,6,52},{2,7,68},{3,6,38},{5,7,22},{5,6,13},{5,6,4},{5,6,13},{8,0,51},{5,6,34},{4,6,1},{2,6,37},{16,0,51}, +{2,6,37},{4,8,37},{4,8,37},{4,8,37},{4,6,36},{4,7,8},{4,6,1},{4,6,1},{4,5,5},{3,6,11},{4,5,9},{5,6,4},{5,6,4},{5,6,4},{5,5,8},{5,5,8},{4,6,1},{4,6,1},{4,5,5},{15,0,8},{4,5,5},{8,1,18},{4,7,4},{5,6,0},{4,6,0},{8,1,18},{17,0,18},{4,6,0},{0,6,36},{17,0,18},{0,6,36},{4,0,36}, +{4,0,36},{4,0,36},{4,0,36},{4,6,1},{4,6,1},{4,6,1},{4,5,1},{3,6,2},{3,6,2},{5,10,54},{5,8,40},{5,7,61},{5,7,36},{5,9,51},{5,7,37},{5,7,1},{5,7,52},{3,8,60},{4,7,40},{6,8,22},{6,7,13},{6,7,4},{6,7,13},{9,1,51},{4,8,29},{5,7,1},{3,7,37},{19,0,51},{3,7,37},{5,9,37},{5,9,37},{5,9,37}, +{5,7,36},{5,8,8},{5,7,1},{5,7,1},{5,6,5},{4,7,8},{5,6,9},{6,7,4},{6,7,4},{6,7,4},{6,6,8},{9,0,8},{5,7,1},{5,7,1},{5,6,5},{18,0,8},{5,6,5},{10,0,18},{5,8,4},{6,7,0},{5,7,0},{10,0,18},{18,1,18},{5,7,0},{0,7,36},{18,1,18},{0,7,36},{5,0,36},{5,0,36},{5,0,36},{5,0,36},{5,7,1}, +{5,7,1},{5,7,1},{5,6,1},{4,7,4},{4,7,4},{6,11,54},{6,9,40},{6,8,62},{6,8,38},{6,10,51},{6,8,27},{6,8,3},{6,7,69},{4,9,60},{5,8,54},{7,9,22},{7,8,9},{7,8,6},{7,8,21},{11,0,51},{6,8,27},{6,8,3},{4,8,50},{22,0,51},{4,8,50},{6,10,37},{6,10,37},{6,10,37},{6,8,37},{6,9,8},{6,8,2},{6,8,2}, +{6,7,5},{5,8,8},{6,7,9},{7,8,5},{7,8,5},{7,8,5},{7,7,8},{10,1,8},{6,8,2},{6,8,2},{6,7,5},{21,0,8},{6,7,5},{11,1,18},{6,9,4},{7,8,2},{6,8,2},{11,1,18},{19,2,18},{6,8,2},{0,8,50},{19,2,18},{0,8,50},{6,0,36},{6,0,36},{6,0,36},{6,0,36},{6,8,1},{6,8,1},{6,8,1},{6,7,1},{5,8,4}, +{5,8,4},{7,12,68},{7,10,60},{8,9,68},{7,9,50},{7,11,53},{7,10,28},{7,9,5},{7,9,53},{7,9,68},{6,9,38},{8,10,22},{8,9,13},{8,9,4},{8,9,13},{12,1,52},{7,10,27},{7,9,4},{5,9,37},{25,0,52},{5,9,37},{7,11,50},{7,11,50},{7,11,50},{7,9,50},{7,10,11},{7,9,5},{7,9,5},{7,8,6},{6,9,11},{7,8,9},{8,9,4}, +{8,9,4},{8,9,4},{8,8,8},{12,0,8},{7,9,4},{7,9,4},{7,8,5},{24,0,8},{7,8,5},{13,0,18},{8,9,9},{8,9,0},{7,9,0},{13,0,18},{26,0,18},{7,9,0},{0,9,36},{26,0,18},{0,9,36},{7,0,50},{7,0,50},{7,0,50},{7,0,50},{7,10,2},{7,10,2},{7,10,2},{7,8,2},{6,9,2},{6,9,2},{8,13,54},{8,11,40},{8,10,61}, +{8,10,36},{8,12,51},{8,10,37},{8,10,1},{8,10,52},{6,11,68},{7,10,38},{9,11,22},{9,10,13},{9,10,4},{9,10,13},{12,4,51},{9,10,34},{8,10,1},{6,10,37},{28,0,51},{6,10,37},{8,12,37},{8,12,37},{8,12,37},{8,10,36},{8,11,8},{8,10,1},{8,10,1},{8,9,5},{7,10,11},{8,9,9},{9,10,4},{9,10,4},{9,10,4},{9,9,8},{13,1,8}, +{8,10,1},{8,10,1},{8,9,5},{27,0,8},{8,9,5},{14,1,18},{8,11,4},{9,10,0},{8,10,0},{14,1,18},{29,0,18},{8,10,0},{0,10,36},{29,0,18},{0,10,36},{8,0,36},{8,0,36},{8,0,36},{8,0,36},{8,10,1},{8,10,1},{8,10,1},{8,9,1},{7,10,2},{7,10,2},{9,14,54},{9,12,40},{9,11,61},{9,11,36},{9,13,51},{9,11,37},{9,11,1}, +{9,11,52},{7,12,60},{8,11,40},{10,12,22},{10,11,13},{10,11,4},{10,11,13},{13,5,51},{8,12,29},{9,11,1},{7,11,37},{31,0,51},{7,11,37},{9,13,37},{9,13,37},{9,13,37},{9,11,36},{9,12,8},{9,11,1},{9,11,1},{9,10,5},{8,11,8},{9,10,9},{10,11,4},{10,11,4},{10,11,4},{10,10,8},{15,0,8},{9,11,1},{9,11,1},{9,10,5},{30,0,8}, +{9,10,5},{15,2,18},{9,12,4},{10,11,0},{9,11,0},{15,2,18},{30,1,18},{9,11,0},{0,11,36},{30,1,18},{0,11,36},{9,0,36},{9,0,36},{9,0,36},{9,0,36},{9,11,1},{9,11,1},{9,11,1},{9,10,1},{8,11,4},{8,11,4},{10,15,54},{10,13,40},{10,12,62},{10,12,38},{10,14,51},{10,12,27},{10,12,3},{10,11,69},{8,13,60},{9,12,54},{11,13,22}, +{11,12,9},{11,12,6},{11,12,21},{17,0,51},{10,12,27},{10,12,3},{8,12,50},{30,2,51},{8,12,50},{10,14,37},{10,14,37},{10,14,37},{10,12,37},{10,13,8},{10,12,2},{10,12,2},{10,11,5},{9,12,8},{10,11,9},{11,12,5},{11,12,5},{11,12,5},{11,11,8},{16,1,8},{10,12,2},{10,12,2},{10,11,5},{31,1,8},{10,11,5},{15,5,18},{10,13,4},{11,12,2}, +{10,12,2},{15,5,18},{31,2,18},{10,12,2},{0,12,50},{31,2,18},{0,12,50},{10,0,36},{10,0,36},{10,0,36},{10,0,36},{10,12,1},{10,12,1},{10,12,1},{10,11,1},{9,12,4},{9,12,4},{11,16,68},{11,14,60},{12,13,68},{11,13,50},{11,15,53},{11,14,28},{11,13,5},{11,13,53},{11,13,68},{10,13,38},{12,14,22},{12,13,13},{12,13,4},{12,13,13},{18,1,52}, +{11,14,27},{11,13,4},{9,13,37},{31,3,52},{9,13,37},{11,15,50},{11,15,50},{11,15,50},{11,13,50},{11,14,11},{11,13,5},{11,13,5},{11,12,6},{10,13,11},{11,12,9},{12,13,4},{12,13,4},{12,13,4},{12,12,8},{16,4,8},{11,13,4},{11,13,4},{11,12,5},{28,4,8},{11,12,5},{19,0,18},{12,13,9},{12,13,0},{11,13,0},{19,0,18},{30,4,18},{11,13,0}, +{0,13,36},{30,4,18},{0,13,36},{11,0,50},{11,0,50},{11,0,50},{11,0,50},{11,14,2},{11,14,2},{11,14,2},{11,12,2},{10,13,2},{10,13,2},{12,17,54},{12,15,40},{12,14,61},{12,14,36},{12,16,51},{12,14,37},{12,14,1},{12,14,52},{10,15,68},{11,14,38},{13,15,22},{13,14,13},{13,14,4},{13,14,13},{20,0,51},{13,14,34},{12,14,1},{10,14,37},{24,8,51}, +{10,14,37},{12,16,37},{12,16,37},{12,16,37},{12,14,36},{12,15,8},{12,14,1},{12,14,1},{12,13,5},{11,14,11},{12,13,9},{13,14,4},{13,14,4},{13,14,4},{13,13,8},{17,5,8},{12,14,1},{12,14,1},{12,13,5},{31,4,8},{12,13,5},{20,1,18},{12,15,4},{13,14,0},{12,14,0},{20,1,18},{31,5,18},{12,14,0},{0,14,36},{31,5,18},{0,14,36},{12,0,36}, +{12,0,36},{12,0,36},{12,0,36},{12,14,1},{12,14,1},{12,14,1},{12,13,1},{11,14,2},{11,14,2},{13,18,54},{13,16,40},{13,15,61},{13,15,36},{13,17,51},{13,15,37},{13,15,1},{13,15,52},{11,16,60},{12,15,40},{14,16,22},{14,15,13},{14,15,4},{14,15,13},{21,1,51},{12,16,29},{13,15,1},{11,15,37},{27,8,51},{11,15,37},{13,17,37},{13,17,37},{13,17,37}, +{13,15,36},{13,16,8},{13,15,1},{13,15,1},{13,14,5},{12,15,8},{13,14,9},{14,15,4},{14,15,4},{14,15,4},{14,14,8},{21,0,8},{13,15,1},{13,15,1},{13,14,5},{30,6,8},{13,14,5},{22,0,18},{13,16,4},{14,15,0},{13,15,0},{22,0,18},{30,7,18},{13,15,0},{0,15,36},{30,7,18},{0,15,36},{13,0,36},{13,0,36},{13,0,36},{13,0,36},{13,15,1}, +{13,15,1},{13,15,1},{13,14,1},{12,15,4},{12,15,4},{14,19,54},{14,17,40},{14,16,62},{14,16,38},{14,18,51},{14,16,27},{14,16,3},{14,15,69},{12,17,60},{13,16,54},{15,17,22},{15,16,9},{15,16,6},{15,16,21},{23,0,51},{14,16,27},{14,16,3},{12,16,50},{30,8,51},{12,16,50},{14,18,37},{14,18,37},{14,18,37},{14,16,37},{14,17,8},{14,16,2},{14,16,2}, +{14,15,5},{13,16,8},{14,15,9},{15,16,5},{15,16,5},{15,16,5},{15,15,8},{22,1,8},{14,16,2},{14,16,2},{14,15,5},{31,7,8},{14,15,5},{23,1,18},{14,17,4},{15,16,2},{14,16,2},{23,1,18},{27,10,18},{14,16,2},{0,16,50},{27,10,18},{0,16,50},{14,0,36},{14,0,36},{14,0,36},{14,0,36},{14,16,1},{14,16,1},{14,16,1},{14,15,1},{13,16,4}, +{13,16,4},{15,20,68},{15,18,60},{16,17,68},{15,17,50},{15,19,53},{15,18,28},{15,17,5},{15,17,53},{15,17,68},{14,17,38},{16,18,22},{16,17,13},{16,17,4},{16,17,13},{24,1,52},{15,18,27},{15,17,4},{13,17,37},{31,9,52},{13,17,37},{15,19,50},{15,19,50},{15,19,50},{15,17,50},{15,18,11},{15,17,5},{15,17,5},{15,16,6},{14,17,11},{15,16,9},{16,17,4}, +{16,17,4},{16,17,4},{16,16,8},{24,0,8},{15,17,4},{15,17,4},{15,16,5},{24,12,8},{15,16,5},{25,0,18},{16,17,9},{16,17,0},{15,17,0},{25,0,18},{30,10,18},{15,17,0},{0,17,36},{30,10,18},{0,17,36},{15,0,50},{15,0,50},{15,0,50},{15,0,50},{15,18,2},{15,18,2},{15,18,2},{15,16,2},{14,17,2},{14,17,2},{16,21,54},{16,19,40},{16,18,61}, +{16,18,36},{16,20,51},{16,18,37},{16,18,1},{16,18,52},{14,19,68},{15,18,38},{17,19,22},{17,18,13},{17,18,4},{17,18,13},{24,4,51},{17,18,34},{16,18,1},{14,18,37},{28,12,51},{14,18,37},{16,20,37},{16,20,37},{16,20,37},{16,18,36},{16,19,8},{16,18,1},{16,18,1},{16,17,5},{15,18,11},{16,17,9},{17,18,4},{17,18,4},{17,18,4},{17,17,8},{25,1,8}, +{16,18,1},{16,18,1},{16,17,5},{27,12,8},{16,17,5},{26,1,18},{16,19,4},{17,18,0},{16,18,0},{26,1,18},{31,11,18},{16,18,0},{0,18,36},{31,11,18},{0,18,36},{16,0,36},{16,0,36},{16,0,36},{16,0,36},{16,18,1},{16,18,1},{16,18,1},{16,17,1},{15,18,2},{15,18,2},{17,22,54},{17,20,40},{17,19,61},{17,19,36},{17,21,51},{17,19,37},{17,19,1}, +{17,19,52},{15,20,60},{16,19,40},{18,20,22},{18,19,13},{18,19,4},{18,19,13},{25,5,51},{16,20,29},{17,19,1},{15,19,37},{31,12,51},{15,19,37},{17,21,37},{17,21,37},{17,21,37},{17,19,36},{17,20,8},{17,19,1},{17,19,1},{17,18,5},{16,19,8},{17,18,9},{18,19,4},{18,19,4},{18,19,4},{18,18,8},{27,0,8},{17,19,1},{17,19,1},{17,18,5},{30,12,8}, +{17,18,5},{27,2,18},{17,20,4},{18,19,0},{17,19,0},{27,2,18},{30,13,18},{17,19,0},{0,19,36},{30,13,18},{0,19,36},{17,0,36},{17,0,36},{17,0,36},{17,0,36},{17,19,1},{17,19,1},{17,19,1},{17,18,1},{16,19,4},{16,19,4},{18,23,54},{18,21,40},{18,20,62},{18,20,38},{18,22,51},{18,20,27},{18,20,3},{18,19,69},{16,21,60},{17,20,54},{19,21,22}, +{19,20,9},{19,20,6},{19,20,21},{29,0,51},{18,20,27},{18,20,3},{16,20,50},{30,14,51},{16,20,50},{18,22,37},{18,22,37},{18,22,37},{18,20,37},{18,21,8},{18,20,2},{18,20,2},{18,19,5},{17,20,8},{18,19,9},{19,20,5},{19,20,5},{19,20,5},{19,19,8},{28,1,8},{18,20,2},{18,20,2},{18,19,5},{31,13,8},{18,19,5},{27,5,18},{18,21,4},{19,20,2}, +{18,20,2},{27,5,18},{31,14,18},{18,20,2},{0,20,50},{31,14,18},{0,20,50},{18,0,36},{18,0,36},{18,0,36},{18,0,36},{18,20,1},{18,20,1},{18,20,1},{18,19,1},{17,20,4},{17,20,4},{19,24,68},{19,22,60},{20,21,68},{19,21,50},{19,23,53},{19,22,28},{19,21,5},{19,21,53},{19,21,68},{18,21,38},{20,22,22},{20,21,13},{20,21,4},{20,21,13},{30,1,52}, +{19,22,27},{19,21,4},{17,21,37},{31,15,52},{17,21,37},{19,23,50},{19,23,50},{19,23,50},{19,21,50},{19,22,11},{19,21,5},{19,21,5},{19,20,6},{18,21,11},{19,20,9},{20,21,4},{20,21,4},{20,21,4},{20,20,8},{28,4,8},{19,21,4},{19,21,4},{19,20,5},{28,16,8},{19,20,5},{31,0,18},{20,21,9},{20,21,0},{19,21,0},{31,0,18},{30,16,18},{19,21,0}, +{0,21,36},{30,16,18},{0,21,36},{19,0,50},{19,0,50},{19,0,50},{19,0,50},{19,22,2},{19,22,2},{19,22,2},{19,20,2},{18,21,2},{18,21,2},{20,25,54},{20,23,40},{20,22,61},{20,22,36},{20,24,51},{20,22,37},{20,22,1},{20,22,52},{18,23,68},{19,22,38},{21,23,22},{21,22,13},{21,22,4},{21,22,13},{28,8,51},{21,22,34},{20,22,1},{18,22,37},{24,20,51}, +{18,22,37},{20,24,37},{20,24,37},{20,24,37},{20,22,36},{20,23,8},{20,22,1},{20,22,1},{20,21,5},{19,22,11},{20,21,9},{21,22,4},{21,22,4},{21,22,4},{21,21,8},{29,5,8},{20,22,1},{20,22,1},{20,21,5},{31,16,8},{20,21,5},{31,3,18},{20,23,4},{21,22,0},{20,22,0},{31,3,18},{31,17,18},{20,22,0},{0,22,36},{31,17,18},{0,22,36},{20,0,36}, +{20,0,36},{20,0,36},{20,0,36},{20,22,1},{20,22,1},{20,22,1},{20,21,1},{19,22,2},{19,22,2},{21,26,54},{21,24,40},{21,23,61},{21,23,36},{21,25,51},{21,23,37},{21,23,1},{21,23,52},{19,24,60},{20,23,40},{22,24,22},{22,23,13},{22,23,4},{22,23,13},{29,9,51},{20,24,29},{21,23,1},{19,23,37},{27,20,51},{19,23,37},{21,25,37},{21,25,37},{21,25,37}, +{21,23,36},{21,24,8},{21,23,1},{21,23,1},{21,22,5},{20,23,8},{21,22,9},{22,23,4},{22,23,4},{22,23,4},{22,22,8},{31,4,8},{21,23,1},{21,23,1},{21,22,5},{30,18,8},{21,22,5},{31,6,18},{21,24,4},{22,23,0},{21,23,0},{31,6,18},{30,19,18},{21,23,0},{0,23,36},{30,19,18},{0,23,36},{21,0,36},{21,0,36},{21,0,36},{21,0,36},{21,23,1}, +{21,23,1},{21,23,1},{21,22,1},{20,23,4},{20,23,4},{22,27,54},{22,25,40},{22,24,62},{22,24,38},{22,26,51},{22,24,27},{22,24,3},{22,23,69},{20,25,60},{21,24,54},{23,25,22},{23,24,9},{23,24,6},{23,24,21},{31,8,51},{22,24,27},{22,24,3},{20,24,50},{30,20,51},{20,24,50},{22,26,37},{22,26,37},{22,26,37},{22,24,37},{22,25,8},{22,24,2},{22,24,2}, +{22,23,5},{21,24,8},{22,23,9},{23,24,5},{23,24,5},{23,24,5},{23,23,8},{31,7,8},{22,24,2},{22,24,2},{22,23,5},{31,19,8},{22,23,5},{31,9,18},{22,25,4},{23,24,2},{22,24,2},{31,9,18},{27,22,18},{22,24,2},{0,24,50},{27,22,18},{0,24,50},{22,0,36},{22,0,36},{22,0,36},{22,0,36},{22,24,1},{22,24,1},{22,24,1},{22,23,1},{21,24,4}, +{21,24,4},{23,28,68},{23,26,60},{24,25,68},{23,25,50},{23,27,53},{23,26,28},{23,25,5},{23,25,53},{23,25,68},{22,25,38},{24,26,22},{24,25,13},{24,25,4},{24,25,13},{31,11,52},{23,26,27},{23,25,4},{21,25,37},{31,21,52},{21,25,37},{23,27,50},{23,27,50},{23,27,50},{23,25,50},{23,26,11},{23,25,5},{23,25,5},{23,24,6},{22,25,11},{23,24,9},{24,25,4}, +{24,25,4},{24,25,4},{24,24,8},{28,16,8},{23,25,4},{23,25,4},{23,24,5},{24,24,8},{23,24,5},{31,12,18},{24,25,9},{24,25,0},{23,25,0},{31,12,18},{30,22,18},{23,25,0},{0,25,36},{30,22,18},{0,25,36},{23,0,50},{23,0,50},{23,0,50},{23,0,50},{23,26,2},{23,26,2},{23,26,2},{23,24,2},{22,25,2},{22,25,2},{24,29,54},{24,27,40},{24,26,61}, +{24,26,36},{24,28,51},{24,26,37},{24,26,1},{24,26,52},{22,27,68},{23,26,38},{25,27,22},{25,26,13},{25,26,4},{25,26,13},{28,20,51},{25,26,34},{24,26,1},{22,26,37},{28,24,51},{22,26,37},{24,28,37},{24,28,37},{24,28,37},{24,26,36},{24,27,8},{24,26,1},{24,26,1},{24,25,5},{23,26,11},{24,25,9},{25,26,4},{25,26,4},{25,26,4},{25,25,8},{29,17,8}, +{24,26,1},{24,26,1},{24,25,5},{27,24,8},{24,25,5},{31,15,18},{24,27,4},{25,26,0},{24,26,0},{31,15,18},{31,23,18},{24,26,0},{0,26,36},{31,23,18},{0,26,36},{24,0,36},{24,0,36},{24,0,36},{24,0,36},{24,26,1},{24,26,1},{24,26,1},{24,25,1},{23,26,2},{23,26,2},{25,30,54},{25,28,40},{25,27,61},{25,27,36},{25,29,51},{25,27,37},{25,27,1}, +{25,27,52},{23,28,60},{24,27,40},{26,28,22},{26,27,13},{26,27,4},{26,27,13},{29,21,51},{24,28,29},{25,27,1},{23,27,37},{31,24,51},{23,27,37},{25,29,37},{25,29,37},{25,29,37},{25,27,36},{25,28,8},{25,27,1},{25,27,1},{25,26,5},{24,27,8},{25,26,9},{26,27,4},{26,27,4},{26,27,4},{26,26,8},{31,16,8},{25,27,1},{25,27,1},{25,26,5},{30,24,8}, +{25,26,5},{31,18,18},{25,28,4},{26,27,0},{25,27,0},{31,18,18},{30,25,18},{25,27,0},{0,27,36},{30,25,18},{0,27,36},{25,0,36},{25,0,36},{25,0,36},{25,0,36},{25,27,1},{25,27,1},{25,27,1},{25,26,1},{24,27,4},{24,27,4},{26,31,54},{26,29,40},{26,28,62},{26,28,38},{26,30,51},{26,28,27},{26,28,3},{26,27,69},{24,29,60},{25,28,54},{27,29,22}, +{27,28,9},{27,28,6},{27,28,21},{31,20,51},{26,28,27},{26,28,3},{24,28,50},{30,26,51},{24,28,50},{26,30,37},{26,30,37},{26,30,37},{26,28,37},{26,29,8},{26,28,2},{26,28,2},{26,27,5},{25,28,8},{26,27,9},{27,28,5},{27,28,5},{27,28,5},{27,27,8},{31,19,8},{26,28,2},{26,28,2},{26,27,5},{31,25,8},{26,27,5},{31,21,18},{26,29,4},{27,28,2}, +{26,28,2},{31,21,18},{31,26,18},{26,28,2},{0,28,50},{31,26,18},{0,28,50},{26,0,36},{26,0,36},{26,0,36},{26,0,36},{26,28,1},{26,28,1},{26,28,1},{26,27,1},{25,28,4},{25,28,4},{28,30,86},{27,30,60},{28,29,68},{27,29,50},{27,31,53},{27,30,28},{27,29,5},{27,29,53},{27,29,68},{26,29,38},{28,30,22},{28,29,13},{28,29,4},{28,29,13},{31,23,52}, +{27,30,27},{27,29,4},{25,29,37},{31,27,52},{25,29,37},{27,31,50},{27,31,50},{27,31,50},{27,29,50},{27,30,11},{27,29,5},{27,29,5},{27,28,6},{26,29,11},{27,28,9},{28,29,4},{28,29,4},{28,29,4},{28,28,8},{28,28,8},{27,29,4},{27,29,4},{27,28,5},{28,28,8},{27,28,5},{31,24,18},{28,29,9},{28,29,0},{27,29,0},{31,24,18},{30,28,18},{27,29,0}, +{0,29,36},{30,28,18},{0,29,36},{27,0,50},{27,0,50},{27,0,50},{27,0,50},{27,30,2},{27,30,2},{27,30,2},{27,28,2},{26,29,2},{26,29,2},{29,31,86},{28,31,40},{28,30,61},{28,30,36},{28,31,72},{28,30,37},{28,30,1},{28,30,52},{26,31,68},{27,30,38},{29,31,22},{29,30,13},{29,30,4},{29,30,13},{31,26,52},{29,30,34},{28,30,1},{26,30,37},{30,29,52}, +{26,30,37},{28,31,40},{28,31,40},{28,31,40},{28,30,36},{28,31,8},{28,30,1},{28,30,1},{28,29,5},{27,30,11},{28,29,9},{29,30,4},{29,30,4},{29,30,4},{29,29,8},{29,29,8},{28,30,1},{28,30,1},{28,29,5},{31,28,8},{28,29,5},{31,27,18},{28,31,4},{29,30,0},{28,30,0},{31,27,18},{31,29,18},{28,30,0},{0,30,36},{31,29,18},{0,30,36},{28,0,36}, +{28,0,36},{28,0,36},{28,0,36},{28,30,1},{28,30,1},{28,30,1},{28,29,1},{27,30,2},{27,30,2},{30,31,104},{30,31,77},{29,31,61},{29,31,36},{30,31,116},{29,31,37},{29,31,1},{29,31,52},{28,31,72},{28,31,40},{30,31,40},{30,31,13},{30,31,4},{30,31,13},{31,29,52},{30,31,34},{29,31,1},{27,31,37},{31,30,52},{27,31,37},{29,31,61},{29,31,61},{29,31,61}, +{29,31,36},{29,31,26},{29,31,1},{29,31,1},{29,30,5},{28,31,8},{29,30,9},{30,31,4},{30,31,4},{30,31,4},{30,30,8},{31,28,8},{29,31,1},{29,31,1},{29,30,5},{30,30,8},{29,30,5},{31,30,18},{30,31,9},{30,31,0},{29,31,0},{31,30,18},{30,31,18},{29,31,0},{0,31,36},{30,31,18},{0,31,36},{29,0,36},{29,0,36},{29,0,36},{29,0,36},{29,31,1}, +{29,31,1},{29,31,1},{29,30,1},{28,31,4},{28,31,4},{31,31,68},{31,31,68},{31,31,68},{30,31,45},{31,31,68},{30,31,34},{30,31,25},{30,31,1},{30,31,23},{30,31,5},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{30,31,1},{31,31,4},{30,31,1},{31,31,68},{31,31,68},{31,31,68},{30,31,45},{30,31,52},{30,31,25},{30,31,25}, +{30,31,1},{30,31,14},{30,31,5},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{30,31,1},{31,31,4},{30,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{30,0,36},{30,0,36},{30,0,36},{30,0,36},{30,31,16},{30,31,16},{30,31,16},{30,31,1},{30,31,5}, +{30,31,5},{0,4,72},{0,3,10},{0,2,1},{0,2,26},{0,3,154},{0,2,99},{0,2,51},{0,1,115},{0,1,173},{0,1,119},{0,4,72},{0,3,10},{0,2,1},{0,2,26},{1,1,154},{0,2,99},{0,2,51},{0,1,115},{3,0,154},{0,1,115},{0,2,0},{0,2,0},{0,2,0},{0,1,0},{0,1,13},{0,1,4},{0,1,4},{0,0,25},{0,0,25},{0,0,25},{0,2,0}, +{0,2,0},{0,2,0},{0,1,0},{0,1,13},{0,1,4},{0,1,4},{0,0,25},{1,0,13},{0,0,25},{0,4,72},{0,3,10},{0,2,1},{0,2,26},{0,4,72},{4,0,72},{0,2,26},{0,1,90},{4,0,72},{0,1,90},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,7,81},{0,5,13},{0,3,35}, +{0,3,19},{0,5,244},{0,3,115},{0,3,35},{0,2,139},{0,2,308},{0,2,164},{0,7,81},{0,5,13},{1,3,26},{0,3,19},{2,1,244},{0,3,115},{0,3,35},{0,2,139},{5,0,244},{0,2,139},{0,5,9},{0,5,9},{0,5,9},{0,2,18},{0,3,50},{0,2,13},{0,2,13},{0,1,29},{0,1,72},{0,1,33},{0,5,9},{0,5,9},{0,5,9},{0,2,18},{1,1,50}, +{0,2,13},{0,2,13},{0,1,29},{3,0,50},{0,1,29},{1,5,72},{0,5,4},{1,3,1},{0,3,10},{1,5,72},{7,0,72},{0,3,10},{0,2,90},{7,0,72},{0,2,90},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,1,1},{0,1,1},{0,1,1},{0,1,4},{0,1,8},{0,1,8},{1,8,145},{1,6,77},{1,4,98},{1,4,82},{0,8,243},{0,5,76},{0,4,1}, +{0,3,115},{0,4,364},{0,3,179},{1,8,81},{1,6,13},{2,4,25},{1,4,18},{4,0,243},{0,5,76},{0,4,1},{0,3,115},{8,0,243},{0,3,115},{1,6,73},{1,6,73},{1,6,73},{1,3,82},{0,6,50},{0,4,1},{0,4,1},{0,2,26},{0,3,114},{0,2,51},{1,6,9},{1,6,9},{1,6,9},{1,3,18},{3,0,50},{0,4,1},{0,4,1},{0,2,26},{6,0,50}, +{0,2,26},{5,0,72},{1,6,4},{2,4,0},{0,4,1},{5,0,72},{10,0,72},{0,4,1},{0,3,90},{10,0,72},{0,3,90},{1,0,73},{1,0,73},{1,0,73},{1,0,73},{0,4,0},{0,4,0},{0,4,0},{0,2,1},{0,2,26},{0,2,26},{2,9,162},{2,7,94},{2,5,115},{2,5,99},{1,9,244},{1,6,77},{1,5,2},{1,4,106},{0,5,300},{0,4,105},{2,9,81}, +{2,7,13},{3,5,25},{2,5,18},{5,1,243},{1,6,76},{1,5,1},{0,4,89},{11,0,243},{0,4,89},{2,7,90},{2,7,90},{2,7,90},{2,4,94},{1,7,51},{1,5,2},{1,5,2},{1,3,27},{0,4,74},{0,3,35},{2,7,9},{2,7,9},{2,7,9},{2,4,13},{4,1,50},{1,5,1},{1,5,1},{0,4,25},{9,0,50},{0,4,25},{6,1,72},{2,7,4},{3,5,0}, +{1,5,1},{6,1,72},{13,0,72},{1,5,1},{0,4,80},{13,0,72},{0,4,80},{2,0,90},{2,0,90},{2,0,90},{2,0,90},{1,5,1},{1,5,1},{1,5,1},{1,3,2},{0,3,10},{0,3,10},{3,10,154},{3,8,84},{3,6,117},{3,6,85},{2,10,244},{2,7,75},{2,6,2},{2,5,106},{0,7,253},{0,5,100},{3,10,90},{3,8,20},{4,6,26},{3,6,21},{7,0,244}, +{2,7,75},{2,6,2},{0,5,91},{14,0,244},{0,5,91},{3,8,80},{3,8,80},{3,8,80},{3,6,84},{2,8,52},{2,6,1},{2,6,1},{2,5,25},{0,6,52},{0,5,19},{3,8,16},{3,8,16},{3,8,16},{3,6,20},{4,4,50},{2,6,1},{2,6,1},{0,5,10},{12,0,50},{0,5,10},{8,0,72},{3,8,4},{4,6,1},{2,6,1},{8,0,72},{16,0,72},{2,6,1}, +{0,5,90},{16,0,72},{0,5,90},{3,0,80},{3,0,80},{3,0,80},{3,0,80},{2,6,1},{2,6,1},{2,6,1},{2,4,1},{0,5,10},{0,5,10},{4,11,162},{4,9,94},{4,7,116},{4,7,100},{3,11,244},{3,8,76},{3,7,2},{3,6,106},{1,8,253},{1,6,100},{4,11,81},{4,9,13},{5,7,26},{4,7,19},{8,1,244},{3,8,76},{3,7,2},{1,6,91},{17,0,244}, +{1,6,91},{4,9,90},{4,9,90},{4,9,90},{4,6,99},{3,9,52},{3,7,1},{3,7,1},{3,6,25},{1,7,52},{1,6,19},{4,9,9},{4,9,9},{4,9,9},{4,6,18},{5,5,50},{3,7,1},{3,7,1},{1,6,10},{15,0,50},{1,6,10},{9,1,72},{4,9,4},{5,7,1},{3,7,1},{9,1,72},{19,0,72},{3,7,1},{0,6,90},{19,0,72},{0,6,90},{4,0,90}, +{4,0,90},{4,0,90},{4,0,90},{3,7,1},{3,7,1},{3,7,1},{3,5,1},{1,6,10},{1,6,10},{5,12,162},{5,10,94},{5,8,115},{5,8,99},{4,12,244},{4,9,77},{4,8,2},{4,7,116},{2,9,253},{2,7,100},{5,12,81},{5,10,13},{6,8,25},{5,8,18},{8,4,243},{4,9,76},{4,8,1},{2,7,91},{20,0,243},{2,7,91},{5,10,90},{5,10,90},{5,10,90}, +{5,7,99},{4,10,51},{4,8,2},{4,8,2},{4,6,27},{2,8,50},{2,7,19},{5,10,9},{5,10,9},{5,10,9},{5,7,18},{9,0,50},{4,8,1},{4,8,1},{2,7,10},{18,0,50},{2,7,10},{11,0,72},{5,10,4},{6,8,0},{4,8,1},{11,0,72},{22,0,72},{4,8,1},{0,7,90},{22,0,72},{0,7,90},{5,0,90},{5,0,90},{5,0,90},{5,0,90},{4,8,1}, +{4,8,1},{4,8,1},{4,6,2},{2,7,10},{2,7,10},{6,13,162},{6,11,94},{6,9,115},{6,9,99},{5,13,244},{5,10,77},{5,9,2},{5,8,106},{3,10,253},{3,8,84},{6,13,81},{6,11,13},{7,9,25},{6,9,18},{9,5,243},{5,10,76},{5,9,1},{3,8,80},{23,0,243},{3,8,80},{6,11,90},{6,11,90},{6,11,90},{6,8,94},{5,11,51},{5,9,2},{5,9,2}, +{5,7,27},{3,9,50},{3,8,20},{6,11,9},{6,11,9},{6,11,9},{6,8,13},{10,1,50},{5,9,1},{5,9,1},{3,8,16},{21,0,50},{3,8,16},{12,1,72},{6,11,4},{7,9,0},{5,9,1},{12,1,72},{25,0,72},{5,9,1},{0,8,80},{25,0,72},{0,8,80},{6,0,90},{6,0,90},{6,0,90},{6,0,90},{5,9,1},{5,9,1},{5,9,1},{5,7,2},{3,8,4}, +{3,8,4},{7,14,154},{7,12,84},{7,10,117},{7,10,85},{6,14,244},{6,11,75},{6,10,2},{6,9,106},{4,11,253},{4,9,100},{7,14,90},{7,12,20},{8,10,26},{7,10,21},{13,0,244},{6,11,75},{6,10,2},{4,9,91},{26,0,244},{4,9,91},{7,12,80},{7,12,80},{7,12,80},{7,10,84},{6,12,52},{6,10,1},{6,10,1},{6,9,25},{4,10,52},{4,9,19},{7,12,16}, +{7,12,16},{7,12,16},{7,10,20},{12,0,50},{6,10,1},{6,10,1},{4,9,10},{24,0,50},{4,9,10},{12,4,72},{7,12,4},{8,10,1},{6,10,1},{12,4,72},{28,0,72},{6,10,1},{0,9,90},{28,0,72},{0,9,90},{7,0,80},{7,0,80},{7,0,80},{7,0,80},{6,10,1},{6,10,1},{6,10,1},{6,8,1},{4,9,10},{4,9,10},{8,15,162},{8,13,94},{8,11,116}, +{8,11,100},{7,15,244},{7,12,76},{7,11,2},{7,10,106},{5,12,253},{5,10,100},{8,15,81},{8,13,13},{9,11,26},{8,11,19},{14,1,244},{7,12,76},{7,11,2},{5,10,91},{29,0,244},{5,10,91},{8,13,90},{8,13,90},{8,13,90},{8,10,99},{7,13,52},{7,11,1},{7,11,1},{7,10,25},{5,11,52},{5,10,19},{8,13,9},{8,13,9},{8,13,9},{8,10,18},{13,1,50}, +{7,11,1},{7,11,1},{5,10,10},{27,0,50},{5,10,10},{13,5,72},{8,13,4},{9,11,1},{7,11,1},{13,5,72},{31,0,72},{7,11,1},{0,10,90},{31,0,72},{0,10,90},{8,0,90},{8,0,90},{8,0,90},{8,0,90},{7,11,1},{7,11,1},{7,11,1},{7,9,1},{5,10,10},{5,10,10},{9,16,162},{9,14,94},{9,12,115},{9,12,99},{8,16,244},{8,13,77},{8,12,2}, +{8,11,116},{6,13,253},{6,11,100},{9,16,81},{9,14,13},{10,12,25},{9,12,18},{16,0,243},{8,13,76},{8,12,1},{6,11,91},{24,4,243},{6,11,91},{9,14,90},{9,14,90},{9,14,90},{9,11,99},{8,14,51},{8,12,2},{8,12,2},{8,10,27},{6,12,50},{6,11,19},{9,14,9},{9,14,9},{9,14,9},{9,11,18},{15,0,50},{8,12,1},{8,12,1},{6,11,10},{30,0,50}, +{6,11,10},{17,0,72},{9,14,4},{10,12,0},{8,12,1},{17,0,72},{30,2,72},{8,12,1},{0,11,90},{30,2,72},{0,11,90},{9,0,90},{9,0,90},{9,0,90},{9,0,90},{8,12,1},{8,12,1},{8,12,1},{8,10,2},{6,11,10},{6,11,10},{10,17,162},{10,15,94},{10,13,115},{10,13,99},{9,17,244},{9,14,77},{9,13,2},{9,12,106},{7,14,253},{7,12,84},{10,17,81}, +{10,15,13},{11,13,25},{10,13,18},{17,1,243},{9,14,76},{9,13,1},{7,12,80},{27,4,243},{7,12,80},{10,15,90},{10,15,90},{10,15,90},{10,12,94},{9,15,51},{9,13,2},{9,13,2},{9,11,27},{7,13,50},{7,12,20},{10,15,9},{10,15,9},{10,15,9},{10,12,13},{16,1,50},{9,13,1},{9,13,1},{7,12,16},{31,1,50},{7,12,16},{18,1,72},{10,15,4},{11,13,0}, +{9,13,1},{18,1,72},{31,3,72},{9,13,1},{0,12,80},{31,3,72},{0,12,80},{10,0,90},{10,0,90},{10,0,90},{10,0,90},{9,13,1},{9,13,1},{9,13,1},{9,11,2},{7,12,4},{7,12,4},{11,18,154},{11,16,84},{11,14,117},{11,14,85},{10,18,244},{10,15,75},{10,14,2},{10,13,106},{8,15,253},{8,13,100},{11,18,90},{11,16,20},{12,14,26},{11,14,21},{19,0,244}, +{10,15,75},{10,14,2},{8,13,91},{30,4,244},{8,13,91},{11,16,80},{11,16,80},{11,16,80},{11,14,84},{10,16,52},{10,14,1},{10,14,1},{10,13,25},{8,14,52},{8,13,19},{11,16,16},{11,16,16},{11,16,16},{11,14,20},{16,4,50},{10,14,1},{10,14,1},{8,13,10},{28,4,50},{8,13,10},{20,0,72},{11,16,4},{12,14,1},{10,14,1},{20,0,72},{24,8,72},{10,14,1}, +{0,13,90},{24,8,72},{0,13,90},{11,0,80},{11,0,80},{11,0,80},{11,0,80},{10,14,1},{10,14,1},{10,14,1},{10,12,1},{8,13,10},{8,13,10},{12,19,162},{12,17,94},{12,15,116},{12,15,100},{11,19,244},{11,16,76},{11,15,2},{11,14,106},{9,16,253},{9,14,100},{12,19,81},{12,17,13},{13,15,26},{12,15,19},{20,1,244},{11,16,76},{11,15,2},{9,14,91},{31,5,244}, +{9,14,91},{12,17,90},{12,17,90},{12,17,90},{12,14,99},{11,17,52},{11,15,1},{11,15,1},{11,14,25},{9,15,52},{9,14,19},{12,17,9},{12,17,9},{12,17,9},{12,14,18},{17,5,50},{11,15,1},{11,15,1},{9,14,10},{31,4,50},{9,14,10},{21,1,72},{12,17,4},{13,15,1},{11,15,1},{21,1,72},{27,8,72},{11,15,1},{0,14,90},{27,8,72},{0,14,90},{12,0,90}, +{12,0,90},{12,0,90},{12,0,90},{11,15,1},{11,15,1},{11,15,1},{11,13,1},{9,14,10},{9,14,10},{13,20,162},{13,18,94},{13,16,115},{13,16,99},{12,20,244},{12,17,77},{12,16,2},{12,15,116},{10,17,253},{10,15,100},{13,20,81},{13,18,13},{14,16,25},{13,16,18},{20,4,243},{12,17,76},{12,16,1},{10,15,91},{28,8,243},{10,15,91},{13,18,90},{13,18,90},{13,18,90}, +{13,15,99},{12,18,51},{12,16,2},{12,16,2},{12,14,27},{10,16,50},{10,15,19},{13,18,9},{13,18,9},{13,18,9},{13,15,18},{21,0,50},{12,16,1},{12,16,1},{10,15,10},{30,6,50},{10,15,10},{23,0,72},{13,18,4},{14,16,0},{12,16,1},{23,0,72},{30,8,72},{12,16,1},{0,15,90},{30,8,72},{0,15,90},{13,0,90},{13,0,90},{13,0,90},{13,0,90},{12,16,1}, +{12,16,1},{12,16,1},{12,14,2},{10,15,10},{10,15,10},{14,21,162},{14,19,94},{14,17,115},{14,17,99},{13,21,244},{13,18,77},{13,17,2},{13,16,106},{11,18,253},{11,16,84},{14,21,81},{14,19,13},{15,17,25},{14,17,18},{21,5,243},{13,18,76},{13,17,1},{11,16,80},{31,8,243},{11,16,80},{14,19,90},{14,19,90},{14,19,90},{14,16,94},{13,19,51},{13,17,2},{13,17,2}, +{13,15,27},{11,17,50},{11,16,20},{14,19,9},{14,19,9},{14,19,9},{14,16,13},{22,1,50},{13,17,1},{13,17,1},{11,16,16},{31,7,50},{11,16,16},{24,1,72},{14,19,4},{15,17,0},{13,17,1},{24,1,72},{31,9,72},{13,17,1},{0,16,80},{31,9,72},{0,16,80},{14,0,90},{14,0,90},{14,0,90},{14,0,90},{13,17,1},{13,17,1},{13,17,1},{13,15,2},{11,16,4}, +{11,16,4},{15,22,154},{15,20,84},{15,18,117},{15,18,85},{14,22,244},{14,19,75},{14,18,2},{14,17,106},{12,19,253},{12,17,100},{15,22,90},{15,20,20},{16,18,26},{15,18,21},{25,0,244},{14,19,75},{14,18,2},{12,17,91},{30,10,244},{12,17,91},{15,20,80},{15,20,80},{15,20,80},{15,18,84},{14,20,52},{14,18,1},{14,18,1},{14,17,25},{12,18,52},{12,17,19},{15,20,16}, +{15,20,16},{15,20,16},{15,18,20},{24,0,50},{14,18,1},{14,18,1},{12,17,10},{24,12,50},{12,17,10},{24,4,72},{15,20,4},{16,18,1},{14,18,1},{24,4,72},{28,12,72},{14,18,1},{0,17,90},{28,12,72},{0,17,90},{15,0,80},{15,0,80},{15,0,80},{15,0,80},{14,18,1},{14,18,1},{14,18,1},{14,16,1},{12,17,10},{12,17,10},{16,23,162},{16,21,94},{16,19,116}, +{16,19,100},{15,23,244},{15,20,76},{15,19,2},{15,18,106},{13,20,253},{13,18,100},{16,23,81},{16,21,13},{17,19,26},{16,19,19},{26,1,244},{15,20,76},{15,19,2},{13,18,91},{31,11,244},{13,18,91},{16,21,90},{16,21,90},{16,21,90},{16,18,99},{15,21,52},{15,19,1},{15,19,1},{15,18,25},{13,19,52},{13,18,19},{16,21,9},{16,21,9},{16,21,9},{16,18,18},{25,1,50}, +{15,19,1},{15,19,1},{13,18,10},{27,12,50},{13,18,10},{25,5,72},{16,21,4},{17,19,1},{15,19,1},{25,5,72},{31,12,72},{15,19,1},{0,18,90},{31,12,72},{0,18,90},{16,0,90},{16,0,90},{16,0,90},{16,0,90},{15,19,1},{15,19,1},{15,19,1},{15,17,1},{13,18,10},{13,18,10},{17,24,162},{17,22,94},{17,20,115},{17,20,99},{16,24,244},{16,21,77},{16,20,2}, +{16,19,116},{14,21,253},{14,19,100},{17,24,81},{17,22,13},{18,20,25},{17,20,18},{28,0,243},{16,21,76},{16,20,1},{14,19,91},{24,16,243},{14,19,91},{17,22,90},{17,22,90},{17,22,90},{17,19,99},{16,22,51},{16,20,2},{16,20,2},{16,18,27},{14,20,50},{14,19,19},{17,22,9},{17,22,9},{17,22,9},{17,19,18},{27,0,50},{16,20,1},{16,20,1},{14,19,10},{30,12,50}, +{14,19,10},{29,0,72},{17,22,4},{18,20,0},{16,20,1},{29,0,72},{30,14,72},{16,20,1},{0,19,90},{30,14,72},{0,19,90},{17,0,90},{17,0,90},{17,0,90},{17,0,90},{16,20,1},{16,20,1},{16,20,1},{16,18,2},{14,19,10},{14,19,10},{18,25,162},{18,23,94},{18,21,115},{18,21,99},{17,25,244},{17,22,77},{17,21,2},{17,20,106},{15,22,253},{15,20,84},{18,25,81}, +{18,23,13},{19,21,25},{18,21,18},{29,1,243},{17,22,76},{17,21,1},{15,20,80},{27,16,243},{15,20,80},{18,23,90},{18,23,90},{18,23,90},{18,20,94},{17,23,51},{17,21,2},{17,21,2},{17,19,27},{15,21,50},{15,20,20},{18,23,9},{18,23,9},{18,23,9},{18,20,13},{28,1,50},{17,21,1},{17,21,1},{15,20,16},{31,13,50},{15,20,16},{30,1,72},{18,23,4},{19,21,0}, +{17,21,1},{30,1,72},{31,15,72},{17,21,1},{0,20,80},{31,15,72},{0,20,80},{18,0,90},{18,0,90},{18,0,90},{18,0,90},{17,21,1},{17,21,1},{17,21,1},{17,19,2},{15,20,4},{15,20,4},{19,26,154},{19,24,84},{19,22,117},{19,22,85},{18,26,244},{18,23,75},{18,22,2},{18,21,106},{16,23,253},{16,21,100},{19,26,90},{19,24,20},{20,22,26},{19,22,21},{31,0,244}, +{18,23,75},{18,22,2},{16,21,91},{30,16,244},{16,21,91},{19,24,80},{19,24,80},{19,24,80},{19,22,84},{18,24,52},{18,22,1},{18,22,1},{18,21,25},{16,22,52},{16,21,19},{19,24,16},{19,24,16},{19,24,16},{19,22,20},{28,4,50},{18,22,1},{18,22,1},{16,21,10},{28,16,50},{16,21,10},{28,8,72},{19,24,4},{20,22,1},{18,22,1},{28,8,72},{24,20,72},{18,22,1}, +{0,21,90},{24,20,72},{0,21,90},{19,0,80},{19,0,80},{19,0,80},{19,0,80},{18,22,1},{18,22,1},{18,22,1},{18,20,1},{16,21,10},{16,21,10},{20,27,162},{20,25,94},{20,23,116},{20,23,100},{19,27,244},{19,24,76},{19,23,2},{19,22,106},{17,24,253},{17,22,100},{20,27,81},{20,25,13},{21,23,26},{20,23,19},{31,3,244},{19,24,76},{19,23,2},{17,22,91},{31,17,244}, +{17,22,91},{20,25,90},{20,25,90},{20,25,90},{20,22,99},{19,25,52},{19,23,1},{19,23,1},{19,22,25},{17,23,52},{17,22,19},{20,25,9},{20,25,9},{20,25,9},{20,22,18},{29,5,50},{19,23,1},{19,23,1},{17,22,10},{31,16,50},{17,22,10},{29,9,72},{20,25,4},{21,23,1},{19,23,1},{29,9,72},{27,20,72},{19,23,1},{0,22,90},{27,20,72},{0,22,90},{20,0,90}, +{20,0,90},{20,0,90},{20,0,90},{19,23,1},{19,23,1},{19,23,1},{19,21,1},{17,22,10},{17,22,10},{21,28,162},{21,26,94},{21,24,115},{21,24,99},{20,28,244},{20,25,77},{20,24,2},{20,23,116},{18,25,253},{18,23,100},{21,28,81},{21,26,13},{22,24,25},{21,24,18},{28,12,243},{20,25,76},{20,24,1},{18,23,91},{28,20,243},{18,23,91},{21,26,90},{21,26,90},{21,26,90}, +{21,23,99},{20,26,51},{20,24,2},{20,24,2},{20,22,27},{18,24,50},{18,23,19},{21,26,9},{21,26,9},{21,26,9},{21,23,18},{31,4,50},{20,24,1},{20,24,1},{18,23,10},{30,18,50},{18,23,10},{31,8,72},{21,26,4},{22,24,0},{20,24,1},{31,8,72},{30,20,72},{20,24,1},{0,23,90},{30,20,72},{0,23,90},{21,0,90},{21,0,90},{21,0,90},{21,0,90},{20,24,1}, +{20,24,1},{20,24,1},{20,22,2},{18,23,10},{18,23,10},{22,29,162},{22,27,94},{22,25,115},{22,25,99},{21,29,244},{21,26,77},{21,25,2},{21,24,106},{19,26,253},{19,24,84},{22,29,81},{22,27,13},{23,25,25},{22,25,18},{29,13,243},{21,26,76},{21,25,1},{19,24,80},{31,20,243},{19,24,80},{22,27,90},{22,27,90},{22,27,90},{22,24,94},{21,27,51},{21,25,2},{21,25,2}, +{21,23,27},{19,25,50},{19,24,20},{22,27,9},{22,27,9},{22,27,9},{22,24,13},{31,7,50},{21,25,1},{21,25,1},{19,24,16},{31,19,50},{19,24,16},{31,11,72},{22,27,4},{23,25,0},{21,25,1},{31,11,72},{31,21,72},{21,25,1},{0,24,80},{31,21,72},{0,24,80},{22,0,90},{22,0,90},{22,0,90},{22,0,90},{21,25,1},{21,25,1},{21,25,1},{21,23,2},{19,24,4}, +{19,24,4},{23,30,154},{23,28,84},{23,26,117},{23,26,85},{22,30,244},{22,27,75},{22,26,2},{22,25,106},{20,27,253},{20,25,100},{23,30,90},{23,28,20},{24,26,26},{23,26,21},{31,12,244},{22,27,75},{22,26,2},{20,25,91},{30,22,244},{20,25,91},{23,28,80},{23,28,80},{23,28,80},{23,26,84},{22,28,52},{22,26,1},{22,26,1},{22,25,25},{20,26,52},{20,25,19},{23,28,16}, +{23,28,16},{23,28,16},{23,26,20},{28,16,50},{22,26,1},{22,26,1},{20,25,10},{24,24,50},{20,25,10},{28,20,72},{23,28,4},{24,26,1},{22,26,1},{28,20,72},{28,24,72},{22,26,1},{0,25,90},{28,24,72},{0,25,90},{23,0,80},{23,0,80},{23,0,80},{23,0,80},{22,26,1},{22,26,1},{22,26,1},{22,24,1},{20,25,10},{20,25,10},{24,31,162},{24,29,94},{24,27,116}, +{24,27,100},{23,31,244},{23,28,76},{23,27,2},{23,26,106},{21,28,253},{21,26,100},{24,31,81},{24,29,13},{25,27,26},{24,27,19},{31,15,244},{23,28,76},{23,27,2},{21,26,91},{31,23,244},{21,26,91},{24,29,90},{24,29,90},{24,29,90},{24,26,99},{23,29,52},{23,27,1},{23,27,1},{23,26,25},{21,27,52},{21,26,19},{24,29,9},{24,29,9},{24,29,9},{24,26,18},{29,17,50}, +{23,27,1},{23,27,1},{21,26,10},{27,24,50},{21,26,10},{29,21,72},{24,29,4},{25,27,1},{23,27,1},{29,21,72},{31,24,72},{23,27,1},{0,26,90},{31,24,72},{0,26,90},{24,0,90},{24,0,90},{24,0,90},{24,0,90},{23,27,1},{23,27,1},{23,27,1},{23,25,1},{21,26,10},{21,26,10},{25,31,180},{25,30,94},{25,28,115},{25,28,99},{24,31,265},{24,29,77},{24,28,2}, +{24,27,116},{22,29,253},{22,27,100},{26,30,97},{25,30,13},{26,28,25},{25,28,18},{28,24,243},{24,29,76},{24,28,1},{22,27,91},{24,28,243},{22,27,91},{25,30,90},{25,30,90},{25,30,90},{25,27,99},{24,30,51},{24,28,2},{24,28,2},{24,26,27},{22,28,50},{22,27,19},{25,30,9},{25,30,9},{25,30,9},{25,27,18},{31,16,50},{24,28,1},{24,28,1},{22,27,10},{30,24,50}, +{22,27,10},{31,20,72},{25,30,4},{26,28,0},{24,28,1},{31,20,72},{30,26,72},{24,28,1},{0,27,90},{30,26,72},{0,27,90},{25,0,90},{25,0,90},{25,0,90},{25,0,90},{24,28,1},{24,28,1},{24,28,1},{24,26,2},{22,27,10},{22,27,10},{26,31,234},{26,31,94},{26,29,115},{26,29,99},{26,31,325},{25,30,77},{25,29,2},{25,28,106},{23,30,253},{23,28,84},{27,31,97}, +{26,31,13},{27,29,25},{26,29,18},{29,25,243},{25,30,76},{25,29,1},{23,28,80},{27,28,243},{23,28,80},{26,31,90},{26,31,90},{26,31,90},{26,28,94},{25,31,51},{25,29,2},{25,29,2},{25,27,27},{23,29,50},{23,28,20},{26,31,9},{26,31,9},{26,31,9},{26,28,13},{31,19,50},{25,29,1},{25,29,1},{23,28,16},{31,25,50},{23,28,16},{31,23,72},{26,31,4},{27,29,0}, +{25,29,1},{31,23,72},{31,27,72},{25,29,1},{0,28,80},{31,27,72},{0,28,80},{26,0,90},{26,0,90},{26,0,90},{26,0,90},{25,29,1},{25,29,1},{25,29,1},{25,27,2},{23,28,4},{23,28,4},{27,31,314},{27,31,105},{27,30,117},{27,30,85},{27,31,347},{26,31,75},{26,30,2},{26,29,106},{24,31,253},{24,29,100},{28,31,115},{28,31,35},{28,30,26},{27,30,21},{31,24,244}, +{26,31,75},{26,30,2},{24,29,91},{30,28,244},{24,29,91},{27,31,89},{27,31,89},{27,31,89},{27,30,84},{26,31,82},{26,30,1},{26,30,1},{26,29,25},{24,30,52},{24,29,19},{28,30,25},{28,30,25},{28,30,25},{27,30,20},{28,28,50},{26,30,1},{26,30,1},{24,29,10},{28,28,50},{24,29,10},{31,26,74},{28,31,10},{28,30,1},{26,30,1},{31,26,74},{30,29,74},{26,30,1}, +{0,29,90},{30,29,74},{0,29,90},{27,0,80},{27,0,80},{27,0,80},{27,0,80},{26,30,1},{26,30,1},{26,30,1},{26,28,1},{24,29,10},{24,29,10},{28,31,371},{28,31,179},{28,31,115},{28,31,99},{28,31,387},{27,31,122},{27,31,1},{27,30,89},{26,31,279},{25,30,83},{29,31,146},{29,31,61},{29,31,25},{28,31,18},{31,27,221},{28,31,98},{27,31,1},{25,30,74},{31,29,221}, +{25,30,74},{28,31,115},{28,31,115},{28,31,115},{28,30,99},{27,31,122},{27,31,1},{27,31,1},{27,30,25},{25,31,52},{25,30,19},{29,31,25},{29,31,25},{29,31,25},{28,30,18},{29,29,50},{27,31,1},{27,31,1},{25,30,10},{31,28,50},{25,30,10},{31,29,61},{30,31,34},{29,31,0},{27,31,0},{31,29,61},{31,30,61},{27,31,0},{0,30,73},{31,30,61},{0,30,73},{28,0,90}, +{28,0,90},{28,0,90},{28,0,90},{27,31,1},{27,31,1},{27,31,1},{27,29,1},{25,30,10},{25,30,10},{29,31,275},{29,31,190},{29,31,154},{29,31,99},{29,31,270},{28,31,99},{28,31,35},{28,31,35},{28,31,195},{26,31,19},{30,31,70},{30,31,43},{30,31,34},{29,31,18},{31,29,94},{29,31,49},{29,31,13},{26,31,10},{31,30,94},{26,31,10},{29,31,154},{29,31,154},{29,31,154}, +{29,31,99},{29,31,149},{28,31,35},{28,31,35},{28,30,27},{27,31,77},{26,31,19},{30,31,34},{30,31,34},{30,31,34},{29,31,18},{31,28,50},{29,31,13},{29,31,13},{26,31,10},{30,30,50},{26,31,10},{31,30,9},{31,31,9},{30,31,9},{30,31,0},{31,30,9},{30,31,9},{30,31,0},{0,31,9},{30,31,9},{0,31,9},{29,0,90},{29,0,90},{29,0,90},{29,0,90},{28,31,10}, +{28,31,10},{28,31,10},{28,30,2},{26,31,10},{26,31,10},{30,31,162},{30,31,135},{30,31,126},{30,31,99},{30,31,154},{30,31,100},{29,31,73},{29,31,2},{29,31,109},{28,31,10},{31,31,25},{31,31,25},{31,31,25},{30,31,18},{31,30,22},{30,31,19},{30,31,10},{29,31,1},{30,31,22},{29,31,1},{30,31,126},{30,31,126},{30,31,126},{30,31,99},{30,31,118},{29,31,73},{29,31,73}, +{29,31,2},{29,31,73},{28,31,10},{31,31,25},{31,31,25},{31,31,25},{30,31,18},{31,30,13},{30,31,10},{30,31,10},{29,31,1},{30,31,13},{29,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{30,0,90},{30,0,90},{30,0,90},{30,0,90},{29,31,37},{29,31,37},{29,31,37},{29,31,2},{28,31,10}, +{28,31,10},{0,7,200},{0,5,20},{0,4,20},{0,3,74},{0,5,441},{0,3,282},{0,3,138},{0,2,318},{0,2,487},{0,2,343},{0,7,200},{0,5,20},{0,4,20},{0,3,74},{2,1,441},{0,3,282},{0,3,138},{0,2,318},{5,0,441},{0,2,318},{0,3,1},{0,3,1},{0,3,1},{0,2,1},{0,2,41},{0,1,20},{0,1,20},{0,1,26},{0,1,45},{0,1,30},{0,3,1}, +{0,3,1},{0,3,1},{0,2,1},{1,0,41},{0,1,20},{0,1,20},{0,1,26},{2,0,41},{0,1,26},{1,5,200},{0,5,20},{0,4,20},{0,3,74},{1,5,200},{7,0,200},{0,3,74},{0,2,218},{7,0,200},{0,2,218},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,10,200},{0,7,5},{0,5,32}, +{0,4,41},{0,7,689},{0,5,369},{0,4,162},{0,3,474},{0,3,762},{0,3,538},{0,10,200},{0,7,5},{0,5,32},{0,4,41},{3,1,686},{0,5,369},{0,4,162},{0,3,474},{3,2,686},{0,3,474},{0,6,1},{0,6,1},{0,6,1},{0,3,1},{0,3,145},{0,3,65},{0,3,65},{0,2,101},{0,1,173},{0,1,110},{0,6,1},{0,6,1},{0,6,1},{0,3,1},{1,1,145}, +{0,3,65},{0,3,65},{0,2,101},{3,0,145},{0,2,101},{5,0,200},{0,7,5},{1,4,17},{0,4,41},{5,0,200},{10,0,200},{0,4,41},{0,3,218},{10,0,200},{0,3,218},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,13,249},{0,8,59},{1,6,97},{0,5,69},{0,10,728},{0,6,299},{0,5,56}, +{0,4,433},{0,4,884},{0,4,554},{1,11,201},{1,8,6},{1,6,33},{1,5,42},{5,0,728},{0,6,299},{0,5,56},{0,4,433},{10,0,728},{0,4,433},{0,9,50},{0,9,50},{0,9,50},{0,5,53},{0,6,162},{0,4,25},{0,4,25},{0,3,82},{0,3,226},{0,2,115},{1,7,2},{1,7,2},{1,7,2},{1,4,2},{3,0,162},{0,4,25},{0,4,25},{0,3,82},{6,0,162}, +{0,3,82},{6,1,200},{1,8,5},{2,5,17},{0,5,20},{6,1,200},{13,0,200},{0,5,20},{0,4,208},{13,0,200},{0,4,208},{0,0,49},{0,0,49},{0,0,49},{0,0,49},{0,3,1},{0,3,1},{0,3,1},{0,1,4},{0,1,8},{0,1,8},{1,14,313},{1,9,123},{1,7,210},{1,6,133},{0,12,724},{0,8,251},{0,6,18},{0,5,352},{0,6,987},{0,5,521},{2,12,201}, +{2,9,6},{2,7,33},{2,6,42},{4,4,724},{0,8,251},{0,6,18},{0,5,352},{12,0,724},{0,5,352},{1,10,114},{1,10,114},{1,10,114},{1,6,117},{0,9,162},{0,6,2},{0,6,2},{0,4,49},{0,4,291},{0,3,146},{2,8,2},{2,8,2},{2,8,2},{2,5,2},{4,1,162},{0,6,2},{0,6,2},{0,4,49},{9,0,162},{0,4,49},{7,2,200},{2,9,5},{3,6,17}, +{0,6,17},{7,2,200},{14,1,200},{0,6,17},{0,5,208},{14,1,200},{0,5,208},{1,0,113},{1,0,113},{1,0,113},{1,0,113},{0,6,1},{0,6,1},{0,6,1},{0,3,1},{0,2,50},{0,2,50},{2,15,410},{2,11,221},{2,8,324},{2,7,234},{1,14,739},{0,10,233},{0,8,40},{0,6,298},{0,7,1013},{0,6,426},{3,13,202},{3,10,1},{3,8,32},{3,7,41},{7,2,723}, +{0,10,217},{0,8,24},{0,6,282},{14,1,723},{0,6,282},{2,12,209},{2,12,209},{2,12,209},{2,7,209},{0,12,178},{1,7,20},{1,7,20},{0,5,26},{0,6,308},{0,5,91},{3,10,1},{3,10,1},{3,10,1},{3,6,4},{4,4,162},{1,7,4},{1,7,4},{0,5,10},{12,0,162},{0,5,10},{9,1,200},{3,10,1},{4,8,20},{0,8,20},{9,1,200},{19,0,200},{0,8,20}, +{0,6,218},{19,0,200},{0,6,218},{2,0,208},{2,0,208},{2,0,208},{2,0,208},{1,7,16},{1,7,16},{1,7,16},{1,4,16},{0,4,53},{0,4,53},{3,16,408},{3,12,225},{3,9,324},{3,8,228},{2,15,739},{1,11,233},{2,8,33},{1,7,298},{0,9,875},{0,7,303},{4,14,201},{4,11,6},{4,9,33},{4,8,42},{7,5,723},{0,11,204},{2,8,17},{0,7,254},{15,2,723}, +{0,7,254},{3,12,209},{3,12,209},{3,12,209},{3,8,212},{1,13,178},{2,8,17},{2,8,17},{1,6,26},{0,7,229},{0,6,17},{4,10,2},{4,10,2},{4,10,2},{4,7,2},{5,5,162},{2,8,1},{2,8,1},{0,6,1},{15,0,162},{0,6,1},{11,0,200},{4,11,5},{5,8,17},{2,8,17},{11,0,200},{22,0,200},{2,8,17},{0,7,218},{22,0,200},{0,7,218},{3,0,208}, +{3,0,208},{3,0,208},{3,0,208},{2,8,16},{2,8,16},{2,8,16},{2,5,16},{0,6,16},{0,6,16},{4,17,418},{4,12,228},{4,10,315},{4,9,238},{3,16,744},{2,11,234},{3,9,33},{2,8,305},{0,11,828},{0,8,228},{5,15,201},{5,12,6},{5,10,33},{5,9,42},{11,0,728},{1,12,204},{3,9,17},{0,8,224},{22,0,728},{0,8,224},{4,13,219},{4,13,219},{4,13,219}, +{4,9,222},{3,12,178},{3,9,17},{3,9,17},{2,7,26},{0,9,178},{0,7,6},{5,11,2},{5,11,2},{5,11,2},{5,8,2},{9,0,162},{3,9,1},{3,9,1},{1,7,1},{18,0,162},{1,7,1},{12,1,200},{5,12,5},{6,9,17},{3,9,17},{12,1,200},{25,0,200},{3,9,17},{0,8,208},{25,0,200},{0,8,208},{4,0,218},{4,0,218},{4,0,218},{4,0,218},{3,9,16}, +{3,9,16},{3,9,16},{3,6,16},{0,7,5},{0,7,5},{5,18,418},{5,13,228},{5,11,315},{5,10,238},{3,19,744},{3,12,225},{3,11,40},{3,9,305},{0,12,749},{0,9,225},{6,16,201},{6,13,6},{6,11,33},{6,10,42},{12,0,724},{2,13,204},{4,10,18},{0,9,209},{24,0,724},{0,9,209},{5,14,219},{5,14,219},{5,14,219},{5,10,222},{3,15,178},{3,11,24},{3,11,24}, +{3,8,32},{1,10,178},{1,8,5},{6,12,2},{6,12,2},{6,12,2},{6,9,2},{10,1,162},{4,10,2},{4,10,2},{2,8,1},{21,0,162},{2,8,1},{14,0,200},{6,13,5},{7,10,17},{4,10,17},{14,0,200},{26,1,200},{4,10,17},{0,9,208},{26,1,200},{0,9,208},{5,0,218},{5,0,218},{5,0,218},{5,0,218},{3,12,17},{3,12,17},{3,12,17},{3,7,20},{1,8,5}, +{1,8,5},{6,19,410},{6,15,221},{6,12,324},{6,11,234},{5,18,739},{4,14,233},{4,12,40},{4,10,298},{0,14,724},{2,10,228},{7,17,202},{7,14,1},{7,12,32},{7,11,41},{14,0,723},{3,14,211},{4,12,24},{1,10,218},{26,1,723},{1,10,218},{6,16,209},{6,16,209},{6,16,209},{6,11,209},{4,16,178},{5,11,20},{5,11,20},{4,9,26},{1,12,171},{3,9,10},{7,14,1}, +{7,14,1},{7,14,1},{7,10,4},{12,0,162},{5,11,4},{5,11,4},{3,9,1},{24,0,162},{3,9,1},{13,5,200},{7,14,1},{8,12,20},{3,12,17},{13,5,200},{31,0,200},{3,12,17},{0,10,218},{31,0,200},{0,10,218},{6,0,208},{6,0,208},{6,0,208},{6,0,208},{5,11,16},{5,11,16},{5,11,16},{5,8,16},{3,9,9},{3,9,9},{7,20,408},{7,16,225},{7,13,324}, +{7,12,228},{6,19,739},{5,15,233},{6,12,33},{5,11,298},{1,15,724},{3,11,228},{8,18,201},{8,15,6},{8,13,33},{8,12,42},{15,1,723},{4,15,204},{6,12,17},{2,11,218},{27,2,723},{2,11,218},{7,16,209},{7,16,209},{7,16,209},{7,12,212},{5,17,178},{6,12,17},{6,12,17},{5,10,26},{2,13,171},{3,10,14},{8,14,2},{8,14,2},{8,14,2},{8,11,2},{13,1,162}, +{6,12,1},{6,12,1},{4,10,1},{27,0,162},{4,10,1},{17,0,200},{8,15,5},{9,12,17},{6,12,17},{17,0,200},{30,2,200},{6,12,17},{0,11,218},{30,2,200},{0,11,218},{7,0,208},{7,0,208},{7,0,208},{7,0,208},{6,12,16},{6,12,16},{6,12,16},{6,9,16},{3,11,10},{3,11,10},{8,21,418},{8,16,228},{8,14,315},{8,13,238},{7,20,744},{6,15,234},{7,13,33}, +{6,12,305},{2,16,729},{3,12,225},{9,19,201},{9,16,6},{9,14,33},{9,13,42},{17,0,728},{5,16,204},{7,13,17},{3,12,209},{30,2,728},{3,12,209},{8,17,219},{8,17,219},{8,17,219},{8,13,222},{7,16,178},{7,13,17},{7,13,17},{6,11,26},{3,14,171},{4,11,6},{9,15,2},{9,15,2},{9,15,2},{9,12,2},{15,0,162},{7,13,1},{7,13,1},{5,11,1},{30,0,162}, +{5,11,1},{18,1,200},{9,16,5},{10,13,17},{7,13,17},{18,1,200},{31,3,200},{7,13,17},{0,12,208},{31,3,200},{0,12,208},{8,0,218},{8,0,218},{8,0,218},{8,0,218},{7,13,16},{7,13,16},{7,13,16},{7,10,16},{4,11,5},{4,11,5},{9,22,418},{9,17,228},{9,15,315},{9,14,238},{7,23,744},{7,16,225},{7,15,40},{7,13,305},{3,17,729},{4,13,225},{10,20,201}, +{10,17,6},{10,15,33},{10,14,42},{16,4,724},{6,17,204},{8,14,18},{4,13,209},{28,4,724},{4,13,209},{9,18,219},{9,18,219},{9,18,219},{9,14,222},{7,19,178},{7,15,24},{7,15,24},{7,12,32},{5,14,178},{5,12,5},{10,16,2},{10,16,2},{10,16,2},{10,13,2},{16,1,162},{8,14,2},{8,14,2},{6,12,1},{31,1,162},{6,12,1},{19,2,200},{10,17,5},{11,14,17}, +{8,14,17},{19,2,200},{30,5,200},{8,14,17},{0,13,208},{30,5,200},{0,13,208},{9,0,218},{9,0,218},{9,0,218},{9,0,218},{7,16,17},{7,16,17},{7,16,17},{7,11,20},{5,12,5},{5,12,5},{10,23,410},{10,19,221},{10,16,324},{10,15,234},{9,22,739},{8,18,233},{8,16,40},{8,14,298},{4,18,724},{6,14,228},{11,21,202},{11,18,1},{11,16,32},{11,15,41},{19,2,723}, +{7,18,211},{8,16,24},{5,14,218},{30,5,723},{5,14,218},{10,20,209},{10,20,209},{10,20,209},{10,15,209},{8,20,178},{9,15,20},{9,15,20},{8,13,26},{5,16,171},{7,13,10},{11,18,1},{11,18,1},{11,18,1},{11,14,4},{16,4,162},{9,15,4},{9,15,4},{7,13,1},{28,4,162},{7,13,1},{21,1,200},{11,18,1},{12,16,20},{7,16,17},{21,1,200},{27,8,200},{7,16,17}, +{0,14,218},{27,8,200},{0,14,218},{10,0,208},{10,0,208},{10,0,208},{10,0,208},{9,15,16},{9,15,16},{9,15,16},{9,12,16},{7,13,9},{7,13,9},{11,24,408},{11,20,225},{11,17,324},{11,16,228},{10,23,739},{9,19,233},{10,16,33},{9,15,298},{5,19,724},{7,15,228},{12,22,201},{12,19,6},{12,17,33},{12,16,42},{19,5,723},{8,19,204},{10,16,17},{6,15,218},{31,6,723}, +{6,15,218},{11,20,209},{11,20,209},{11,20,209},{11,16,212},{9,21,178},{10,16,17},{10,16,17},{9,14,26},{6,17,171},{7,14,14},{12,18,2},{12,18,2},{12,18,2},{12,15,2},{17,5,162},{10,16,1},{10,16,1},{8,14,1},{31,4,162},{8,14,1},{23,0,200},{12,19,5},{13,16,17},{10,16,17},{23,0,200},{30,8,200},{10,16,17},{0,15,218},{30,8,200},{0,15,218},{11,0,208}, +{11,0,208},{11,0,208},{11,0,208},{10,16,16},{10,16,16},{10,16,16},{10,13,16},{7,15,10},{7,15,10},{12,25,418},{12,20,228},{12,18,315},{12,17,238},{11,24,744},{10,19,234},{11,17,33},{10,16,305},{6,20,729},{7,16,225},{13,23,201},{13,20,6},{13,18,33},{13,17,42},{23,0,728},{9,20,204},{11,17,17},{7,16,209},{30,8,728},{7,16,209},{12,21,219},{12,21,219},{12,21,219}, +{12,17,222},{11,20,178},{11,17,17},{11,17,17},{10,15,26},{7,18,171},{8,15,6},{13,19,2},{13,19,2},{13,19,2},{13,16,2},{21,0,162},{11,17,1},{11,17,1},{9,15,1},{30,6,162},{9,15,1},{24,1,200},{13,20,5},{14,17,17},{11,17,17},{24,1,200},{31,9,200},{11,17,17},{0,16,208},{31,9,200},{0,16,208},{12,0,218},{12,0,218},{12,0,218},{12,0,218},{11,17,16}, +{11,17,16},{11,17,16},{11,14,16},{8,15,5},{8,15,5},{13,26,418},{13,21,228},{13,19,315},{13,18,238},{11,27,744},{11,20,225},{11,19,40},{11,17,305},{7,21,729},{8,17,225},{14,24,201},{14,21,6},{14,19,33},{14,18,42},{24,0,724},{10,21,204},{12,18,18},{8,17,209},{24,12,724},{8,17,209},{13,22,219},{13,22,219},{13,22,219},{13,18,222},{11,23,178},{11,19,24},{11,19,24}, +{11,16,32},{9,18,178},{9,16,5},{14,20,2},{14,20,2},{14,20,2},{14,17,2},{22,1,162},{12,18,2},{12,18,2},{10,16,1},{31,7,162},{10,16,1},{26,0,200},{14,21,5},{15,18,17},{12,18,17},{26,0,200},{30,11,200},{12,18,17},{0,17,208},{30,11,200},{0,17,208},{13,0,218},{13,0,218},{13,0,218},{13,0,218},{11,20,17},{11,20,17},{11,20,17},{11,15,20},{9,16,5}, +{9,16,5},{14,27,410},{14,23,221},{14,20,324},{14,19,234},{13,26,739},{12,22,233},{12,20,40},{12,18,298},{8,22,724},{10,18,228},{15,25,202},{15,22,1},{15,20,32},{15,19,41},{26,0,723},{11,22,211},{12,20,24},{9,18,218},{30,11,723},{9,18,218},{14,24,209},{14,24,209},{14,24,209},{14,19,209},{12,24,178},{13,19,20},{13,19,20},{12,17,26},{9,20,171},{11,17,10},{15,22,1}, +{15,22,1},{15,22,1},{15,18,4},{24,0,162},{13,19,4},{13,19,4},{11,17,1},{24,12,162},{11,17,1},{25,5,200},{15,22,1},{16,20,20},{11,20,17},{25,5,200},{31,12,200},{11,20,17},{0,18,218},{31,12,200},{0,18,218},{14,0,208},{14,0,208},{14,0,208},{14,0,208},{13,19,16},{13,19,16},{13,19,16},{13,16,16},{11,17,9},{11,17,9},{15,28,408},{15,24,225},{15,21,324}, +{15,20,228},{14,27,739},{13,23,233},{14,20,33},{13,19,298},{9,23,724},{11,19,228},{16,26,201},{16,23,6},{16,21,33},{16,20,42},{27,1,723},{12,23,204},{14,20,17},{10,19,218},{27,14,723},{10,19,218},{15,24,209},{15,24,209},{15,24,209},{15,20,212},{13,25,178},{14,20,17},{14,20,17},{13,18,26},{10,21,171},{11,18,14},{16,22,2},{16,22,2},{16,22,2},{16,19,2},{25,1,162}, +{14,20,1},{14,20,1},{12,18,1},{27,12,162},{12,18,1},{29,0,200},{16,23,5},{17,20,17},{14,20,17},{29,0,200},{30,14,200},{14,20,17},{0,19,218},{30,14,200},{0,19,218},{15,0,208},{15,0,208},{15,0,208},{15,0,208},{14,20,16},{14,20,16},{14,20,16},{14,17,16},{11,19,10},{11,19,10},{16,29,418},{16,24,228},{16,22,315},{16,21,238},{15,28,744},{14,23,234},{15,21,33}, +{14,20,305},{10,24,729},{11,20,225},{17,27,201},{17,24,6},{17,22,33},{17,21,42},{29,0,728},{13,24,204},{15,21,17},{11,20,209},{30,14,728},{11,20,209},{16,25,219},{16,25,219},{16,25,219},{16,21,222},{15,24,178},{15,21,17},{15,21,17},{14,19,26},{11,22,171},{12,19,6},{17,23,2},{17,23,2},{17,23,2},{17,20,2},{27,0,162},{15,21,1},{15,21,1},{13,19,1},{30,12,162}, +{13,19,1},{30,1,200},{17,24,5},{18,21,17},{15,21,17},{30,1,200},{31,15,200},{15,21,17},{0,20,208},{31,15,200},{0,20,208},{16,0,218},{16,0,218},{16,0,218},{16,0,218},{15,21,16},{15,21,16},{15,21,16},{15,18,16},{12,19,5},{12,19,5},{17,30,418},{17,25,228},{17,23,315},{17,22,238},{15,31,744},{15,24,225},{15,23,40},{15,21,305},{11,25,729},{12,21,225},{18,28,201}, +{18,25,6},{18,23,33},{18,22,42},{28,4,724},{14,25,204},{16,22,18},{12,21,209},{28,16,724},{12,21,209},{17,26,219},{17,26,219},{17,26,219},{17,22,222},{15,27,178},{15,23,24},{15,23,24},{15,20,32},{13,22,178},{13,20,5},{18,24,2},{18,24,2},{18,24,2},{18,21,2},{28,1,162},{16,22,2},{16,22,2},{14,20,1},{31,13,162},{14,20,1},{31,2,200},{18,25,5},{19,22,17}, +{16,22,17},{31,2,200},{30,17,200},{16,22,17},{0,21,208},{30,17,200},{0,21,208},{17,0,218},{17,0,218},{17,0,218},{17,0,218},{15,24,17},{15,24,17},{15,24,17},{15,19,20},{13,20,5},{13,20,5},{18,31,410},{18,27,221},{18,24,324},{18,23,234},{17,30,739},{16,26,233},{16,24,40},{16,22,298},{12,26,724},{14,22,228},{19,29,202},{19,26,1},{19,24,32},{19,23,41},{31,2,723}, +{15,26,211},{16,24,24},{13,22,218},{30,17,723},{13,22,218},{18,28,209},{18,28,209},{18,28,209},{18,23,209},{16,28,178},{17,23,20},{17,23,20},{16,21,26},{13,24,171},{15,21,10},{19,26,1},{19,26,1},{19,26,1},{19,22,4},{28,4,162},{17,23,4},{17,23,4},{15,21,1},{28,16,162},{15,21,1},{29,9,200},{19,26,1},{20,24,20},{15,24,17},{29,9,200},{27,20,200},{15,24,17}, +{0,22,218},{27,20,200},{0,22,218},{18,0,208},{18,0,208},{18,0,208},{18,0,208},{17,23,16},{17,23,16},{17,23,16},{17,20,16},{15,21,9},{15,21,9},{19,31,426},{19,28,225},{19,25,324},{19,24,228},{18,31,739},{17,27,233},{18,24,33},{17,23,298},{13,27,724},{15,23,228},{20,30,201},{20,27,6},{20,25,33},{20,24,42},{31,5,723},{16,27,204},{18,24,17},{14,23,218},{31,18,723}, +{14,23,218},{19,28,209},{19,28,209},{19,28,209},{19,24,212},{17,29,178},{18,24,17},{18,24,17},{17,22,26},{14,25,171},{15,22,14},{20,26,2},{20,26,2},{20,26,2},{20,23,2},{29,5,162},{18,24,1},{18,24,1},{16,22,1},{31,16,162},{16,22,1},{31,8,200},{20,27,5},{21,24,17},{18,24,17},{31,8,200},{30,20,200},{18,24,17},{0,23,218},{30,20,200},{0,23,218},{19,0,208}, +{19,0,208},{19,0,208},{19,0,208},{18,24,16},{18,24,16},{18,24,16},{18,21,16},{15,23,10},{15,23,10},{20,31,468},{20,28,228},{20,26,315},{20,25,238},{19,31,747},{18,27,234},{19,25,33},{18,24,305},{14,28,729},{15,24,225},{21,31,201},{21,28,6},{21,26,33},{21,25,42},{31,8,728},{17,28,204},{19,25,17},{15,24,209},{30,20,728},{15,24,209},{20,29,219},{20,29,219},{20,29,219}, +{20,25,222},{19,28,178},{19,25,17},{19,25,17},{18,23,26},{15,26,171},{16,23,6},{21,27,2},{21,27,2},{21,27,2},{21,24,2},{31,4,162},{19,25,1},{19,25,1},{17,23,1},{30,18,162},{17,23,1},{31,11,200},{21,28,5},{22,25,17},{19,25,17},{31,11,200},{31,21,200},{19,25,17},{0,24,208},{31,21,200},{0,24,208},{20,0,218},{20,0,218},{20,0,218},{20,0,218},{19,25,16}, +{19,25,16},{19,25,16},{19,22,16},{16,23,5},{16,23,5},{21,31,546},{21,29,228},{21,27,315},{21,26,238},{20,31,788},{19,28,225},{19,27,40},{19,25,305},{15,29,729},{16,25,225},{22,31,219},{22,29,6},{22,27,33},{22,26,42},{28,16,724},{18,29,204},{20,26,18},{16,25,209},{24,24,724},{16,25,209},{21,30,219},{21,30,219},{21,30,219},{21,26,222},{19,31,178},{19,27,24},{19,27,24}, +{19,24,32},{17,26,178},{17,24,5},{22,28,2},{22,28,2},{22,28,2},{22,25,2},{31,7,162},{20,26,2},{20,26,2},{18,24,1},{31,19,162},{18,24,1},{31,14,200},{22,29,5},{23,26,17},{20,26,17},{31,14,200},{30,23,200},{20,26,17},{0,25,208},{30,23,200},{0,25,208},{21,0,218},{21,0,218},{21,0,218},{21,0,218},{19,28,17},{19,28,17},{19,28,17},{19,23,20},{17,24,5}, +{17,24,5},{23,31,672},{22,31,221},{22,28,324},{22,27,234},{22,31,888},{20,30,233},{20,28,40},{20,26,298},{16,30,724},{18,26,228},{23,31,272},{23,30,1},{23,28,32},{23,27,41},{31,14,723},{19,30,211},{20,28,24},{17,26,218},{30,23,723},{17,26,218},{22,31,212},{22,31,212},{22,31,212},{22,27,209},{21,30,180},{21,27,20},{21,27,20},{20,25,26},{17,28,171},{19,25,10},{23,30,1}, +{23,30,1},{23,30,1},{23,26,4},{28,16,162},{21,27,4},{21,27,4},{19,25,1},{24,24,162},{19,25,1},{29,21,200},{23,30,1},{24,28,20},{19,28,17},{29,21,200},{31,24,200},{19,28,17},{0,26,218},{31,24,200},{0,26,218},{22,0,208},{22,0,208},{22,0,208},{22,0,208},{21,27,16},{21,27,16},{21,27,16},{21,24,16},{19,25,9},{19,25,9},{24,31,770},{23,31,228},{23,29,324}, +{23,28,228},{23,31,932},{21,31,233},{22,28,33},{21,27,298},{17,31,724},{19,27,228},{25,31,299},{24,31,6},{24,29,33},{24,28,42},{31,17,723},{20,31,204},{22,28,17},{18,27,218},{27,26,723},{18,27,218},{23,31,224},{23,31,224},{23,31,224},{23,28,212},{22,31,180},{22,28,17},{22,28,17},{21,26,26},{18,29,171},{19,26,14},{24,30,2},{24,30,2},{24,30,2},{24,27,2},{29,17,162}, +{22,28,1},{22,28,1},{20,26,1},{27,24,162},{20,26,1},{31,20,200},{24,31,5},{25,28,17},{22,28,17},{31,20,200},{30,26,200},{22,28,17},{0,27,218},{30,26,200},{0,27,218},{23,0,208},{23,0,208},{23,0,208},{23,0,208},{22,28,16},{22,28,16},{22,28,16},{22,25,16},{19,27,10},{19,27,10},{25,31,884},{24,31,303},{24,30,315},{24,29,238},{24,31,1025},{22,31,234},{23,29,33}, +{22,28,305},{19,31,747},{19,28,225},{26,31,353},{25,31,27},{25,30,33},{25,29,42},{31,20,728},{22,31,218},{23,29,17},{19,28,209},{30,26,728},{19,28,209},{24,31,254},{24,31,254},{24,31,254},{24,29,222},{23,31,196},{23,29,17},{23,29,17},{22,27,26},{19,30,171},{20,27,6},{25,31,2},{25,31,2},{25,31,2},{25,28,2},{31,16,162},{23,29,1},{23,29,1},{21,27,1},{30,24,162}, +{21,27,1},{31,23,200},{26,31,20},{26,29,17},{23,29,17},{31,23,200},{31,27,200},{23,29,17},{0,28,208},{31,27,200},{0,28,208},{24,0,218},{24,0,218},{24,0,218},{24,0,218},{23,29,16},{23,29,16},{23,29,16},{23,26,16},{20,27,5},{20,27,5},{26,31,1034},{25,31,468},{25,31,315},{25,30,238},{25,31,1172},{24,31,291},{23,31,40},{23,29,305},{21,31,837},{20,29,225},{27,31,409}, +{26,31,117},{26,31,33},{26,30,42},{28,28,724},{24,31,266},{24,30,18},{20,29,209},{28,28,724},{20,29,209},{25,31,299},{25,31,299},{25,31,299},{25,30,222},{24,31,237},{23,31,24},{23,31,24},{23,28,32},{21,30,178},{21,28,5},{26,31,17},{26,31,17},{26,31,17},{26,29,2},{31,19,162},{24,30,2},{24,30,2},{22,28,1},{31,25,162},{22,28,1},{31,26,200},{27,31,53},{27,30,17}, +{24,30,17},{31,26,200},{30,29,200},{24,30,17},{0,29,208},{30,29,200},{0,29,208},{25,0,218},{25,0,218},{25,0,218},{25,0,218},{23,31,20},{23,31,20},{23,31,20},{23,27,20},{21,28,5},{21,28,5},{27,31,933},{27,31,570},{26,31,377},{26,31,209},{27,31,1054},{25,31,309},{25,31,20},{24,30,193},{23,31,735},{22,30,123},{28,31,338},{28,31,146},{27,31,49},{27,31,16},{29,29,546}, +{26,31,222},{25,31,4},{21,30,113},{31,28,546},{21,30,113},{26,31,377},{26,31,377},{26,31,377},{26,31,209},{26,31,338},{25,31,20},{25,31,20},{24,29,26},{22,31,173},{23,29,10},{27,31,49},{27,31,49},{27,31,49},{27,30,4},{28,28,162},{25,31,4},{25,31,4},{23,29,1},{28,28,162},{23,29,1},{31,28,113},{29,31,52},{28,31,1},{26,31,1},{31,28,113},{30,30,113},{26,31,1}, +{0,30,113},{30,30,113},{0,30,113},{26,0,208},{26,0,208},{26,0,208},{26,0,208},{25,31,16},{25,31,16},{25,31,16},{25,28,16},{23,29,9},{23,29,9},{28,31,779},{27,31,554},{27,31,433},{27,31,224},{28,31,859},{26,31,270},{26,31,74},{25,30,90},{24,31,590},{23,31,59},{29,31,218},{29,31,133},{28,31,82},{28,31,2},{31,27,333},{27,31,146},{27,31,25},{22,31,49},{31,29,333}, +{22,31,49},{27,31,433},{27,31,433},{27,31,433},{27,31,224},{27,31,378},{26,31,74},{26,31,74},{25,30,26},{24,31,229},{23,30,14},{28,31,82},{28,31,82},{28,31,82},{28,31,2},{29,29,162},{27,31,25},{27,31,25},{24,30,1},{31,28,162},{24,30,1},{31,30,25},{30,31,10},{30,31,1},{28,31,1},{31,30,25},{30,31,25},{28,31,1},{0,31,49},{30,31,25},{0,31,49},{27,0,208}, +{27,0,208},{27,0,208},{27,0,208},{26,31,25},{26,31,25},{26,31,25},{26,29,16},{23,31,10},{23,31,10},{29,31,684},{28,31,538},{28,31,474},{28,31,282},{28,31,682},{27,31,283},{27,31,162},{26,31,25},{26,31,482},{24,31,5},{30,31,153},{30,31,126},{30,31,117},{29,31,37},{31,29,193},{29,31,108},{28,31,65},{25,31,0},{31,30,193},{25,31,0},{28,31,474},{28,31,474},{28,31,474}, +{28,31,282},{28,31,426},{27,31,162},{27,31,162},{26,31,25},{26,31,286},{24,31,5},{30,31,117},{30,31,117},{30,31,117},{29,31,37},{31,28,145},{28,31,65},{28,31,65},{25,31,0},{30,30,145},{25,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{28,0,218},{28,0,218},{28,0,218},{28,0,218},{27,31,41}, +{27,31,41},{27,31,41},{27,30,16},{24,31,5},{24,31,5},{29,31,460},{29,31,375},{29,31,339},{29,31,254},{29,31,415},{28,31,202},{28,31,138},{27,31,20},{27,31,295},{26,31,26},{30,31,73},{30,31,46},{30,31,37},{30,31,10},{31,30,54},{30,31,27},{30,31,18},{28,31,1},{30,31,54},{28,31,1},{29,31,339},{29,31,339},{29,31,339},{29,31,254},{29,31,294},{28,31,138},{28,31,138}, +{27,31,20},{27,31,174},{26,31,26},{30,31,37},{30,31,37},{30,31,37},{30,31,10},{31,29,45},{30,31,18},{30,31,18},{28,31,1},{31,30,45},{28,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{29,0,218},{29,0,218},{29,0,218},{29,0,218},{28,31,74},{28,31,74},{28,31,74},{27,31,20},{26,31,26}, +{26,31,26},{0,10,421},{0,7,52},{0,5,1},{0,4,162},{0,7,926},{0,5,590},{0,4,283},{0,3,701},{0,3,1005},{0,3,765},{0,10,421},{0,7,52},{0,5,1},{0,4,162},{3,1,925},{0,5,590},{0,4,283},{0,3,701},{3,2,925},{0,3,701},{0,5,0},{0,5,0},{0,5,0},{0,2,9},{0,2,89},{0,2,34},{0,2,34},{0,1,50},{0,1,93},{0,1,54},{0,5,0}, +{0,5,0},{0,5,0},{0,2,9},{1,0,89},{0,2,34},{0,2,34},{0,1,50},{2,0,89},{0,1,50},{5,0,421},{0,7,52},{0,5,1},{0,4,162},{5,0,421},{10,0,421},{0,4,162},{0,3,445},{10,0,421},{0,3,445},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,13,421},{0,9,10},{0,6,26}, +{0,5,117},{0,9,1261},{0,6,701},{0,5,286},{0,4,917},{0,4,1390},{0,3,1005},{0,13,421},{0,9,10},{0,6,26},{0,5,117},{4,1,1261},{0,6,701},{0,5,286},{0,4,917},{9,0,1261},{0,4,917},{0,8,1},{0,8,1},{0,8,1},{0,4,1},{0,4,221},{0,3,89},{0,3,89},{0,2,125},{0,2,246},{0,2,150},{0,8,1},{0,8,1},{0,8,1},{0,4,1},{2,0,221}, +{0,3,89},{0,3,89},{0,2,125},{4,0,221},{0,2,125},{6,1,421},{0,9,10},{1,6,1},{0,5,117},{6,1,421},{13,0,421},{0,5,117},{0,4,433},{13,0,421},{0,4,433},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,16,430},{0,11,14},{0,7,110},{0,7,91},{0,11,1514},{0,7,737},{0,6,259}, +{0,4,1002},{0,5,1710},{0,4,1123},{0,16,430},{0,11,14},{1,7,51},{0,7,91},{5,1,1514},{0,7,737},{0,6,259},{0,4,1002},{11,0,1514},{0,4,1002},{0,11,10},{0,11,10},{0,11,10},{0,5,13},{0,6,338},{0,5,104},{0,5,104},{0,3,194},{0,3,402},{0,2,243},{0,11,10},{0,11,10},{0,11,10},{0,5,13},{3,0,338},{0,5,104},{0,5,104},{0,3,194},{6,0,338}, +{0,3,194},{8,0,421},{0,11,5},{2,7,1},{0,7,82},{8,0,421},{16,0,421},{0,7,82},{0,5,433},{16,0,421},{0,5,433},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,1,1},{0,1,1},{0,1,1},{0,1,4},{0,1,8},{0,1,8},{1,17,494},{1,12,78},{1,8,173},{1,8,154},{0,14,1514},{0,9,602},{0,7,146},{0,6,874},{0,7,1875},{0,5,1066},{1,17,430}, +{1,12,14},{2,8,50},{1,8,90},{7,0,1514},{0,9,602},{0,7,146},{0,6,874},{14,0,1514},{0,6,874},{1,12,74},{1,12,74},{1,12,74},{1,6,77},{0,9,338},{0,6,50},{0,6,50},{0,4,137},{0,4,467},{0,3,258},{1,12,10},{1,12,10},{1,12,10},{1,6,13},{4,1,338},{0,6,50},{0,6,50},{0,4,137},{9,0,338},{0,4,137},{9,1,421},{1,12,5},{3,8,1}, +{0,8,49},{9,1,421},{19,0,421},{0,8,49},{0,6,433},{19,0,421},{0,6,433},{1,0,73},{1,0,73},{1,0,73},{1,0,73},{0,4,0},{0,4,0},{0,4,0},{0,2,1},{0,2,26},{0,2,26},{1,20,629},{1,14,233},{2,10,385},{1,9,245},{0,17,1517},{0,11,521},{0,9,26},{0,7,769},{0,8,2025},{0,6,1085},{3,16,437},{2,13,17},{3,9,53},{2,9,81},{8,1,1517}, +{0,11,521},{0,9,26},{0,7,769},{17,0,1517},{0,7,769},{1,15,208},{1,15,208},{1,15,208},{1,8,208},{0,12,338},{0,8,8},{0,8,8},{0,5,74},{0,5,579},{0,5,243},{3,11,16},{3,11,16},{3,11,16},{3,7,16},{4,4,338},{0,8,8},{0,8,8},{0,5,74},{12,0,338},{0,5,74},{11,0,421},{2,13,1},{4,9,1},{0,9,10},{11,0,421},{22,0,421},{0,9,10}, +{0,7,445},{22,0,421},{0,7,445},{1,0,208},{1,0,208},{1,0,208},{1,0,208},{0,7,1},{0,7,1},{0,7,1},{0,4,4},{0,3,80},{0,3,80},{2,21,821},{2,15,425},{2,11,645},{2,10,437},{0,20,1514},{0,12,458},{0,10,2},{0,8,689},{0,9,2198},{0,7,1146},{3,19,437},{3,14,17},{4,10,51},{3,10,81},{8,4,1514},{0,12,458},{0,10,2},{0,8,689},{20,0,1514}, +{0,8,689},{2,16,400},{2,16,400},{2,16,400},{2,9,400},{0,15,338},{0,10,1},{0,10,1},{0,6,41},{0,7,717},{0,6,297},{3,14,16},{3,14,16},{3,14,16},{3,8,20},{5,5,338},{0,10,1},{0,10,1},{0,6,41},{15,0,338},{0,6,41},{12,1,421},{3,14,1},{5,10,1},{0,10,1},{12,1,421},{25,0,421},{0,10,1},{0,8,433},{25,0,421},{0,8,433},{2,0,400}, +{2,0,400},{2,0,400},{2,0,400},{0,10,1},{0,10,1},{0,10,1},{0,5,1},{0,4,157},{0,4,157},{3,22,854},{3,15,459},{3,12,666},{3,11,470},{1,21,1515},{1,13,459},{1,11,3},{0,9,651},{0,11,2070},{0,9,891},{4,20,430},{4,15,14},{5,11,51},{4,11,91},{9,5,1514},{0,14,425},{1,11,2},{0,9,602},{23,0,1514},{0,9,602},{3,17,433},{3,17,433},{3,17,433}, +{3,10,433},{1,16,339},{1,11,2},{1,11,2},{1,7,42},{0,8,613},{0,7,173},{4,15,10},{4,15,10},{4,15,10},{4,9,13},{9,0,338},{1,11,1},{1,11,1},{0,7,29},{18,0,338},{0,7,29},{14,0,421},{4,15,5},{6,11,1},{1,11,1},{14,0,421},{28,0,421},{1,11,1},{0,9,433},{28,0,421},{0,9,433},{3,0,433},{3,0,433},{3,0,433},{3,0,433},{1,11,2}, +{1,11,2},{1,11,2},{1,6,2},{0,6,97},{0,6,97},{4,23,866},{4,16,461},{4,12,670},{4,12,494},{2,22,1515},{2,14,459},{2,12,3},{1,10,651},{0,12,1913},{0,10,677},{5,21,430},{5,16,14},{6,12,50},{5,12,90},{13,0,1514},{1,15,425},{2,12,2},{0,10,533},{26,0,1514},{0,10,533},{4,18,446},{4,18,446},{4,18,446},{4,11,446},{2,17,339},{2,12,3},{2,12,3}, +{2,8,42},{0,10,500},{0,8,65},{5,16,10},{5,16,10},{5,16,10},{5,10,13},{10,1,338},{2,12,2},{2,12,2},{0,8,16},{21,0,338},{0,8,16},{15,1,421},{5,16,5},{7,12,1},{2,12,1},{15,1,421},{31,0,421},{2,12,1},{0,10,433},{31,0,421},{0,10,433},{4,0,445},{4,0,445},{4,0,445},{4,0,445},{2,12,2},{2,12,2},{2,12,2},{2,7,2},{0,8,49}, +{0,8,49},{5,24,854},{5,18,458},{5,14,678},{5,13,470},{3,23,1517},{3,15,461},{3,13,5},{2,11,653},{0,14,1758},{0,11,530},{7,20,437},{6,17,17},{7,13,53},{6,13,81},{14,1,1517},{2,16,422},{3,13,5},{0,11,494},{29,0,1517},{0,11,494},{5,19,433},{5,19,433},{5,19,433},{5,12,433},{3,18,340},{3,13,4},{3,13,4},{3,9,41},{0,12,419},{0,10,19},{7,15,16}, +{7,15,16},{7,15,16},{7,11,16},{12,0,338},{3,13,4},{3,13,4},{0,10,10},{24,0,338},{0,10,10},{17,0,421},{6,17,1},{8,13,1},{3,13,1},{17,0,421},{30,2,421},{3,13,1},{0,11,445},{30,2,421},{0,11,445},{5,0,433},{5,0,433},{5,0,433},{5,0,433},{3,14,1},{3,14,1},{3,14,1},{3,8,1},{0,10,10},{0,10,10},{6,25,854},{6,19,458},{6,15,678}, +{6,14,470},{4,24,1515},{4,16,459},{4,14,3},{3,12,666},{0,16,1658},{0,12,459},{7,23,437},{7,18,17},{8,14,51},{7,14,81},{16,0,1514},{3,17,422},{4,14,2},{0,12,458},{24,4,1514},{0,12,458},{6,20,433},{6,20,433},{6,20,433},{6,13,433},{4,19,339},{4,14,2},{4,14,2},{4,10,42},{0,13,365},{0,11,14},{7,18,16},{7,18,16},{7,18,16},{7,12,20},{13,1,338}, +{4,14,1},{4,14,1},{0,11,10},{27,0,338},{0,11,10},{18,1,421},{7,18,1},{9,14,1},{4,14,1},{18,1,421},{31,3,421},{4,14,1},{0,12,433},{31,3,421},{0,12,433},{6,0,433},{6,0,433},{6,0,433},{6,0,433},{4,14,2},{4,14,2},{4,14,2},{4,9,2},{0,11,5},{0,11,5},{7,26,854},{7,19,459},{7,16,666},{7,15,470},{5,25,1515},{5,17,459},{5,15,3}, +{4,13,651},{0,17,1577},{1,13,459},{8,24,430},{8,19,14},{9,15,51},{8,15,91},{17,1,1514},{4,18,425},{5,15,2},{0,13,437},{27,4,1514},{0,13,437},{7,21,433},{7,21,433},{7,21,433},{7,14,433},{5,20,339},{5,15,2},{5,15,2},{5,11,42},{0,15,339},{1,12,21},{8,19,10},{8,19,10},{8,19,10},{8,13,13},{15,0,338},{5,15,1},{5,15,1},{1,12,17},{30,0,338}, +{1,12,17},{20,0,421},{8,19,5},{10,15,1},{5,15,1},{20,0,421},{30,5,421},{5,15,1},{0,13,433},{30,5,421},{0,13,433},{7,0,433},{7,0,433},{7,0,433},{7,0,433},{5,15,2},{5,15,2},{5,15,2},{5,10,2},{1,12,5},{1,12,5},{8,27,866},{8,20,461},{8,16,670},{8,16,494},{6,26,1515},{6,18,459},{6,16,3},{5,14,651},{0,19,1530},{2,14,459},{9,25,430}, +{9,20,14},{10,16,50},{9,16,90},{19,0,1514},{5,19,425},{6,16,2},{0,14,434},{30,4,1514},{0,14,434},{8,22,446},{8,22,446},{8,22,446},{8,15,446},{6,21,339},{6,16,3},{6,16,3},{6,12,42},{1,16,339},{2,13,21},{9,20,10},{9,20,10},{9,20,10},{9,14,13},{16,1,338},{6,16,2},{6,16,2},{4,12,16},{31,1,338},{4,12,16},{21,1,421},{9,20,5},{11,16,1}, +{6,16,1},{21,1,421},{31,6,421},{6,16,1},{0,14,433},{31,6,421},{0,14,433},{8,0,445},{8,0,445},{8,0,445},{8,0,445},{6,16,2},{6,16,2},{6,16,2},{6,11,2},{2,13,5},{2,13,5},{9,28,854},{9,22,458},{9,18,678},{9,17,470},{7,27,1517},{7,19,461},{7,17,5},{6,15,653},{1,20,1526},{3,15,461},{11,24,437},{10,21,17},{11,17,53},{10,17,81},{20,1,1517}, +{6,20,422},{7,17,5},{2,15,446},{31,5,1517},{2,15,446},{9,23,433},{9,23,433},{9,23,433},{9,16,433},{7,22,340},{7,17,4},{7,17,4},{7,13,41},{2,17,340},{4,14,19},{11,19,16},{11,19,16},{11,19,16},{11,15,16},{16,4,338},{7,17,4},{7,17,4},{4,14,10},{28,4,338},{4,14,10},{23,0,421},{10,21,1},{12,17,1},{7,17,1},{23,0,421},{30,8,421},{7,17,1}, +{0,15,445},{30,8,421},{0,15,445},{9,0,433},{9,0,433},{9,0,433},{9,0,433},{7,18,1},{7,18,1},{7,18,1},{7,12,1},{4,14,10},{4,14,10},{10,29,854},{10,23,458},{10,19,678},{10,18,470},{8,28,1515},{8,20,459},{8,18,3},{7,16,666},{2,21,1526},{4,16,459},{11,27,437},{11,22,17},{12,18,51},{11,18,81},{20,4,1514},{7,21,422},{8,18,2},{2,16,434},{28,8,1514}, +{2,16,434},{10,24,433},{10,24,433},{10,24,433},{10,17,433},{8,23,339},{8,18,2},{8,18,2},{8,14,42},{3,18,340},{4,15,14},{11,22,16},{11,22,16},{11,22,16},{11,16,20},{17,5,338},{8,18,1},{8,18,1},{4,15,10},{31,4,338},{4,15,10},{24,1,421},{11,22,1},{13,18,1},{8,18,1},{24,1,421},{31,9,421},{8,18,1},{0,16,433},{31,9,421},{0,16,433},{10,0,433}, +{10,0,433},{10,0,433},{10,0,433},{8,18,2},{8,18,2},{8,18,2},{8,13,2},{4,15,5},{4,15,5},{11,30,854},{11,23,459},{11,20,666},{11,19,470},{9,29,1515},{9,21,459},{9,19,3},{8,17,651},{3,22,1526},{5,17,459},{12,28,430},{12,23,14},{13,19,51},{12,19,91},{21,5,1514},{8,22,425},{9,19,2},{3,17,434},{31,8,1514},{3,17,434},{11,25,433},{11,25,433},{11,25,433}, +{11,18,433},{9,24,339},{9,19,2},{9,19,2},{9,15,42},{4,19,339},{5,16,21},{12,23,10},{12,23,10},{12,23,10},{12,17,13},{21,0,338},{9,19,1},{9,19,1},{5,16,17},{30,6,338},{5,16,17},{26,0,421},{12,23,5},{14,19,1},{9,19,1},{26,0,421},{30,11,421},{9,19,1},{0,17,433},{30,11,421},{0,17,433},{11,0,433},{11,0,433},{11,0,433},{11,0,433},{9,19,2}, +{9,19,2},{9,19,2},{9,14,2},{5,16,5},{5,16,5},{12,31,866},{12,24,461},{12,20,670},{12,20,494},{10,30,1515},{10,22,459},{10,20,3},{9,18,651},{4,23,1530},{6,18,459},{13,29,430},{13,24,14},{14,20,50},{13,20,90},{25,0,1514},{9,23,425},{10,20,2},{4,18,434},{30,10,1514},{4,18,434},{12,26,446},{12,26,446},{12,26,446},{12,19,446},{10,25,339},{10,20,3},{10,20,3}, +{10,16,42},{5,20,339},{6,17,21},{13,24,10},{13,24,10},{13,24,10},{13,18,13},{22,1,338},{10,20,2},{10,20,2},{8,16,16},{31,7,338},{8,16,16},{27,1,421},{13,24,5},{15,20,1},{10,20,1},{27,1,421},{31,12,421},{10,20,1},{0,18,433},{31,12,421},{0,18,433},{12,0,445},{12,0,445},{12,0,445},{12,0,445},{10,20,2},{10,20,2},{10,20,2},{10,15,2},{6,17,5}, +{6,17,5},{13,31,878},{13,26,458},{13,22,678},{13,21,470},{11,31,1517},{11,23,461},{11,21,5},{10,19,653},{5,24,1526},{7,19,461},{15,28,437},{14,25,17},{15,21,53},{14,21,81},{26,1,1517},{10,24,422},{11,21,5},{6,19,446},{31,11,1517},{6,19,446},{13,27,433},{13,27,433},{13,27,433},{13,20,433},{11,26,340},{11,21,4},{11,21,4},{11,17,41},{6,21,340},{8,18,19},{15,23,16}, +{15,23,16},{15,23,16},{15,19,16},{24,0,338},{11,21,4},{11,21,4},{8,18,10},{24,12,338},{8,18,10},{29,0,421},{14,25,1},{16,21,1},{11,21,1},{29,0,421},{30,14,421},{11,21,1},{0,19,445},{30,14,421},{0,19,445},{13,0,433},{13,0,433},{13,0,433},{13,0,433},{11,22,1},{11,22,1},{11,22,1},{11,16,1},{8,18,10},{8,18,10},{14,31,938},{14,27,458},{14,23,678}, +{14,22,470},{12,31,1542},{12,24,459},{12,22,3},{11,20,666},{6,25,1526},{8,20,459},{15,31,437},{15,26,17},{16,22,51},{15,22,81},{28,0,1514},{11,25,422},{12,22,2},{6,20,434},{24,16,1514},{6,20,434},{14,28,433},{14,28,433},{14,28,433},{14,21,433},{12,27,339},{12,22,2},{12,22,2},{12,18,42},{7,22,340},{8,19,14},{15,26,16},{15,26,16},{15,26,16},{15,20,20},{25,1,338}, +{12,22,1},{12,22,1},{8,19,10},{27,12,338},{8,19,10},{30,1,421},{15,26,1},{17,22,1},{12,22,1},{30,1,421},{31,15,421},{12,22,1},{0,20,433},{31,15,421},{0,20,433},{14,0,433},{14,0,433},{14,0,433},{14,0,433},{12,22,2},{12,22,2},{12,22,2},{12,17,2},{8,19,5},{8,19,5},{15,31,998},{15,27,459},{15,24,666},{15,23,470},{14,31,1598},{13,25,459},{13,23,3}, +{12,21,651},{7,26,1526},{9,21,459},{16,31,442},{16,27,14},{17,23,51},{16,23,91},{29,1,1514},{12,26,425},{13,23,2},{7,21,434},{27,16,1514},{7,21,434},{15,29,433},{15,29,433},{15,29,433},{15,22,433},{13,28,339},{13,23,2},{13,23,2},{13,19,42},{8,23,339},{9,20,21},{16,27,10},{16,27,10},{16,27,10},{16,21,13},{27,0,338},{13,23,1},{13,23,1},{9,20,17},{30,12,338}, +{9,20,17},{31,2,421},{16,27,5},{18,23,1},{13,23,1},{31,2,421},{30,17,421},{13,23,1},{0,21,433},{30,17,421},{0,21,433},{15,0,433},{15,0,433},{15,0,433},{15,0,433},{13,23,2},{13,23,2},{13,23,2},{13,18,2},{9,20,5},{9,20,5},{16,31,1086},{16,28,461},{16,24,670},{16,24,494},{15,31,1622},{14,26,459},{14,24,3},{13,22,651},{8,27,1530},{10,22,459},{18,31,446}, +{17,28,14},{18,24,50},{17,24,90},{31,0,1514},{13,27,425},{14,24,2},{8,22,434},{30,16,1514},{8,22,434},{16,30,446},{16,30,446},{16,30,446},{16,23,446},{14,29,339},{14,24,3},{14,24,3},{14,20,42},{9,24,339},{10,21,21},{17,28,10},{17,28,10},{17,28,10},{17,22,13},{28,1,338},{14,24,2},{14,24,2},{12,20,16},{31,13,338},{12,20,16},{31,5,421},{17,28,5},{19,24,1}, +{14,24,1},{31,5,421},{31,18,421},{14,24,1},{0,22,433},{31,18,421},{0,22,433},{16,0,445},{16,0,445},{16,0,445},{16,0,445},{14,24,2},{14,24,2},{14,24,2},{14,19,2},{10,21,5},{10,21,5},{18,31,1242},{17,30,458},{17,26,678},{17,25,470},{16,31,1703},{15,27,461},{15,25,5},{14,23,653},{9,28,1526},{11,23,461},{19,31,461},{18,29,17},{19,25,53},{18,25,81},{31,3,1517}, +{14,28,422},{15,25,5},{10,23,446},{31,17,1517},{10,23,446},{17,31,433},{17,31,433},{17,31,433},{17,24,433},{15,30,340},{15,25,4},{15,25,4},{15,21,41},{10,25,340},{12,22,19},{19,27,16},{19,27,16},{19,27,16},{19,23,16},{28,4,338},{15,25,4},{15,25,4},{12,22,10},{28,16,338},{12,22,10},{31,8,421},{18,29,1},{20,25,1},{15,25,1},{31,8,421},{30,20,421},{15,25,1}, +{0,23,445},{30,20,421},{0,23,445},{17,0,433},{17,0,433},{17,0,433},{17,0,433},{15,26,1},{15,26,1},{15,26,1},{15,20,1},{12,22,10},{12,22,10},{19,31,1326},{18,31,458},{18,27,678},{18,26,470},{17,31,1838},{16,28,459},{16,26,3},{15,24,666},{10,29,1526},{12,24,459},{20,31,506},{19,30,17},{20,26,51},{19,26,81},{28,12,1514},{15,29,422},{16,26,2},{10,24,434},{28,20,1514}, +{10,24,434},{18,31,442},{18,31,442},{18,31,442},{18,25,433},{16,31,339},{16,26,2},{16,26,2},{16,22,42},{11,26,340},{12,23,14},{19,30,16},{19,30,16},{19,30,16},{19,24,20},{29,5,338},{16,26,1},{16,26,1},{12,23,10},{31,16,338},{12,23,10},{31,11,421},{19,30,1},{21,26,1},{16,26,1},{31,11,421},{31,21,421},{16,26,1},{0,24,433},{31,21,421},{0,24,433},{18,0,433}, +{18,0,433},{18,0,433},{18,0,433},{16,26,2},{16,26,2},{16,26,2},{16,21,2},{12,23,5},{12,23,5},{20,31,1470},{19,31,459},{19,28,666},{19,27,470},{19,31,1911},{17,29,459},{17,27,3},{16,25,651},{11,30,1526},{13,25,459},{21,31,590},{20,31,14},{21,27,51},{20,27,91},{29,13,1514},{16,30,425},{17,27,2},{11,25,434},{31,20,1514},{11,25,434},{19,31,458},{19,31,458},{19,31,458}, +{19,26,433},{17,31,357},{17,27,2},{17,27,2},{17,23,42},{12,27,339},{13,24,21},{20,31,10},{20,31,10},{20,31,10},{20,25,13},{31,4,338},{17,27,1},{17,27,1},{13,24,17},{30,18,338},{13,24,17},{31,14,421},{20,31,5},{22,27,1},{17,27,1},{31,14,421},{30,23,421},{17,27,1},{0,25,433},{30,23,421},{0,25,433},{19,0,433},{19,0,433},{19,0,433},{19,0,433},{17,27,2}, +{17,27,2},{17,27,2},{17,22,2},{13,24,5},{13,24,5},{21,31,1650},{20,31,530},{20,28,670},{20,28,494},{20,31,2030},{18,30,459},{18,28,3},{17,26,651},{12,31,1530},{14,26,459},{23,31,650},{21,31,29},{22,28,50},{21,28,90},{31,12,1514},{17,31,425},{18,28,2},{12,26,434},{30,22,1514},{12,26,434},{20,31,494},{20,31,494},{20,31,494},{20,27,446},{18,31,411},{18,28,3},{18,28,3}, +{18,24,42},{13,28,339},{14,25,21},{21,31,13},{21,31,13},{21,31,13},{21,26,13},{31,7,338},{18,28,2},{18,28,2},{16,24,16},{31,19,338},{16,24,16},{31,17,421},{22,31,10},{23,28,1},{18,28,1},{31,17,421},{31,24,421},{18,28,1},{0,26,433},{31,24,421},{0,26,433},{20,0,445},{20,0,445},{20,0,445},{20,0,445},{18,28,2},{18,28,2},{18,28,2},{18,23,2},{14,25,5}, +{14,25,5},{22,31,1902},{21,31,723},{21,30,678},{21,29,470},{21,31,2235},{19,31,461},{19,29,5},{18,27,653},{14,31,1587},{15,27,461},{24,31,734},{23,31,65},{23,29,53},{22,29,81},{31,15,1517},{19,31,461},{19,29,5},{14,27,446},{31,23,1517},{14,27,446},{21,31,554},{21,31,554},{21,31,554},{21,28,433},{20,31,437},{19,29,4},{19,29,4},{19,25,41},{14,29,340},{16,26,19},{23,31,16}, +{23,31,16},{23,31,16},{23,27,16},{28,16,338},{19,29,4},{19,29,4},{16,26,10},{24,24,338},{16,26,10},{31,20,421},{23,31,49},{24,29,1},{19,29,1},{31,20,421},{30,26,421},{19,29,1},{0,27,445},{30,26,421},{0,27,445},{21,0,433},{21,0,433},{21,0,433},{21,0,433},{19,30,1},{19,30,1},{19,30,1},{19,24,1},{16,26,10},{16,26,10},{23,31,2074},{23,31,930},{22,31,678}, +{22,30,470},{23,31,2382},{20,31,570},{20,30,3},{19,28,666},{16,31,1703},{16,28,459},{25,31,854},{24,31,173},{24,30,51},{23,30,81},{28,24,1514},{21,31,554},{20,30,2},{14,28,434},{24,28,1514},{14,28,434},{22,31,629},{22,31,629},{22,31,629},{22,29,433},{21,31,491},{20,30,2},{20,30,2},{20,26,42},{15,30,340},{16,27,14},{24,31,29},{24,31,29},{24,31,29},{23,28,20},{29,17,338}, +{20,30,1},{20,30,1},{16,27,10},{27,24,338},{16,27,10},{31,23,421},{25,31,109},{25,30,1},{20,30,1},{31,23,421},{31,27,421},{20,30,1},{0,28,433},{31,27,421},{0,28,433},{22,0,433},{22,0,433},{22,0,433},{22,0,433},{20,30,2},{20,30,2},{20,30,2},{20,25,2},{16,27,5},{16,27,5},{24,31,2229},{24,31,1146},{23,31,689},{23,31,469},{24,31,2476},{22,31,731},{21,31,2}, +{20,29,618},{18,31,1805},{17,29,426},{26,31,953},{25,31,339},{25,31,50},{24,30,82},{29,25,1459},{23,31,620},{21,31,1},{15,29,401},{27,28,1459},{15,29,401},{23,31,689},{23,31,689},{23,31,689},{23,30,433},{22,31,581},{21,31,2},{21,31,2},{21,27,42},{16,31,339},{17,28,21},{25,31,50},{25,31,50},{25,31,50},{24,29,13},{31,16,338},{21,31,1},{21,31,1},{17,28,17},{30,24,338}, +{17,28,17},{31,26,392},{27,31,157},{26,31,0},{21,31,0},{31,26,392},{30,29,392},{21,31,0},{0,29,400},{30,29,392},{0,29,400},{23,0,433},{23,0,433},{23,0,433},{23,0,433},{21,31,2},{21,31,2},{21,31,2},{21,26,2},{17,28,5},{17,28,5},{25,31,1943},{24,31,1130},{24,31,769},{24,31,446},{25,31,2103},{23,31,573},{22,31,42},{22,29,373},{20,31,1481},{18,30,234},{27,31,657}, +{26,31,285},{26,31,89},{25,31,18},{31,23,1064},{24,31,426},{23,31,8},{16,30,209},{31,27,1064},{16,30,209},{24,31,769},{24,31,769},{24,31,769},{24,31,446},{23,31,661},{22,31,42},{22,31,42},{22,28,42},{18,31,365},{18,29,21},{26,31,89},{26,31,89},{26,31,89},{25,30,13},{31,19,338},{23,31,8},{23,31,8},{20,28,16},{31,25,338},{20,28,16},{31,27,202},{28,31,80},{27,31,4}, +{24,31,1},{31,27,202},{31,29,202},{24,31,1},{0,30,208},{31,29,202},{0,30,208},{24,0,445},{24,0,445},{24,0,445},{24,0,445},{22,31,17},{22,31,17},{22,31,17},{22,27,2},{18,29,5},{18,29,5},{27,31,1710},{26,31,1126},{25,31,917},{25,31,469},{26,31,1779},{24,31,507},{24,31,146},{23,30,154},{22,31,1221},{20,30,83},{28,31,450},{27,31,258},{27,31,137},{27,31,16},{29,29,722}, +{26,31,286},{25,31,52},{20,30,74},{31,28,722},{20,30,74},{25,31,917},{25,31,917},{25,31,917},{25,31,469},{25,31,789},{24,31,146},{24,31,146},{23,29,41},{20,31,446},{20,30,19},{27,31,137},{27,31,137},{27,31,137},{27,31,16},{28,28,338},{25,31,52},{25,31,52},{20,30,10},{28,28,338},{20,30,10},{31,29,61},{30,31,34},{29,31,0},{27,31,0},{31,29,61},{31,30,61},{27,31,0}, +{0,30,73},{31,30,61},{0,30,73},{25,0,433},{25,0,433},{25,0,433},{25,0,433},{23,31,49},{23,31,49},{23,31,49},{23,28,1},{20,30,10},{20,30,10},{27,31,1486},{27,31,1123},{27,31,1002},{26,31,554},{27,31,1519},{25,31,582},{25,31,293},{24,30,106},{23,31,1090},{20,31,14},{29,31,354},{28,31,258},{28,31,194},{28,31,50},{31,27,509},{27,31,234},{27,31,113},{20,31,10},{31,29,509}, +{20,31,10},{27,31,1002},{27,31,1002},{27,31,1002},{26,31,554},{26,31,915},{25,31,293},{25,31,293},{24,30,42},{22,31,564},{20,31,14},{28,31,194},{28,31,194},{28,31,194},{28,31,50},{29,29,338},{27,31,113},{27,31,113},{20,31,10},{31,28,338},{20,31,10},{31,30,9},{31,31,9},{30,31,9},{30,31,0},{31,30,9},{30,31,9},{30,31,0},{0,31,9},{30,31,9},{0,31,9},{26,0,433}, +{26,0,433},{26,0,433},{26,0,433},{24,31,82},{24,31,82},{24,31,82},{24,29,2},{20,31,5},{20,31,5},{28,31,1197},{28,31,1005},{27,31,917},{27,31,554},{28,31,1213},{26,31,522},{26,31,326},{25,31,17},{24,31,870},{22,31,16},{30,31,241},{29,31,182},{29,31,146},{29,31,61},{31,28,297},{28,31,153},{28,31,89},{23,31,1},{30,30,297},{23,31,1},{27,31,917},{27,31,917},{27,31,917}, +{27,31,554},{27,31,774},{26,31,326},{26,31,326},{25,31,17},{24,31,509},{22,31,16},{29,31,146},{29,31,146},{29,31,146},{29,31,61},{31,27,221},{28,31,89},{28,31,89},{23,31,1},{31,29,221},{23,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{27,0,433},{27,0,433},{27,0,433},{27,0,433},{26,31,130}, +{26,31,130},{26,31,130},{25,30,2},{22,31,16},{22,31,16},{29,31,927},{28,31,765},{28,31,701},{28,31,509},{28,31,845},{27,31,404},{27,31,283},{26,31,2},{26,31,589},{24,31,52},{30,31,97},{30,31,70},{30,31,61},{30,31,34},{31,30,118},{30,31,67},{29,31,40},{26,31,1},{30,31,118},{26,31,1},{28,31,701},{28,31,701},{28,31,701},{28,31,509},{28,31,589},{27,31,283},{27,31,283}, +{26,31,2},{25,31,386},{24,31,52},{30,31,61},{30,31,61},{30,31,61},{30,31,34},{31,29,85},{29,31,40},{29,31,40},{26,31,1},{31,30,85},{26,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{28,0,445},{28,0,445},{28,0,445},{28,0,445},{27,31,162},{27,31,162},{27,31,162},{26,31,2},{24,31,52}, +{24,31,52},{0,14,884},{0,10,117},{0,7,10},{0,6,317},{0,10,1899},{0,6,1236},{0,6,573},{0,4,1438},{0,4,2065},{0,4,1559},{0,14,884},{0,10,117},{0,7,10},{0,6,317},{5,0,1899},{0,6,1236},{0,6,573},{0,4,1438},{10,0,1899},{0,4,1438},{0,7,1},{0,7,1},{0,7,1},{0,3,4},{0,3,164},{0,3,68},{0,3,68},{0,2,104},{0,2,189},{0,1,129},{0,7,1}, +{0,7,1},{0,7,1},{0,3,4},{2,0,164},{0,3,68},{0,3,68},{0,2,104},{3,0,164},{0,2,104},{7,0,884},{0,10,117},{0,7,10},{0,6,317},{7,0,884},{14,0,884},{0,6,317},{0,5,890},{14,0,884},{0,5,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,17,884},{0,12,53},{0,8,20}, +{0,7,265},{0,11,2360},{0,8,1384},{0,7,626},{0,5,1683},{0,5,2580},{0,5,1852},{0,17,884},{0,12,53},{0,8,20},{0,7,265},{6,0,2356},{0,8,1384},{0,7,626},{0,5,1683},{10,1,2356},{0,5,1683},{0,10,1},{0,10,1},{0,10,1},{0,5,1},{0,5,338},{0,4,137},{0,4,137},{0,2,200},{0,2,381},{0,2,225},{0,10,1},{0,10,1},{0,10,1},{0,5,1},{2,1,338}, +{0,4,137},{0,4,137},{0,2,200},{5,0,338},{0,2,200},{8,1,884},{0,12,53},{1,8,5},{0,7,265},{8,1,884},{17,0,884},{0,7,265},{0,6,890},{17,0,884},{0,6,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,20,882},{0,14,16},{0,10,85},{0,8,200},{0,14,2904},{0,9,1530},{0,8,684}, +{0,6,1978},{0,6,3220},{0,5,2172},{0,20,882},{0,14,16},{1,9,84},{0,8,200},{7,0,2904},{0,9,1530},{0,8,684},{0,6,1978},{14,0,2904},{0,6,1978},{0,12,1},{0,12,1},{0,12,1},{0,6,4},{0,6,580},{0,5,218},{0,5,218},{0,3,356},{0,3,644},{0,3,420},{0,12,1},{0,12,1},{0,12,1},{0,6,4},{3,0,580},{0,5,218},{0,5,218},{0,3,356},{6,0,580}, +{0,3,356},{8,4,882},{0,14,16},{2,9,5},{0,8,200},{8,4,882},{20,0,882},{0,8,200},{0,7,890},{20,0,882},{0,7,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,23,918},{0,15,41},{1,11,153},{0,10,184},{0,16,3048},{0,11,1476},{0,9,473},{0,6,1950},{0,7,3517},{0,6,2206},{1,21,886}, +{1,15,20},{1,11,89},{0,10,184},{8,0,3048},{0,11,1476},{0,9,473},{0,6,1950},{16,0,3048},{0,6,1950},{0,15,37},{0,15,37},{0,15,37},{0,8,40},{0,9,648},{0,7,185},{0,7,185},{0,4,337},{0,4,777},{0,4,458},{1,13,5},{1,13,5},{1,13,5},{1,7,8},{4,1,648},{0,7,185},{0,7,185},{0,4,337},{9,0,648},{0,4,337},{9,5,882},{0,15,5},{3,10,5}, +{0,10,148},{9,5,882},{23,0,882},{0,10,148},{0,8,900},{23,0,882},{0,8,900},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,2,1},{0,2,1},{0,2,1},{0,1,1},{0,1,5},{0,1,5},{1,24,997},{1,17,123},{1,12,318},{1,11,243},{0,19,3051},{0,12,1278},{0,10,274},{0,8,1795},{0,9,3672},{0,7,2222},{2,22,885},{2,16,10},{2,12,101},{1,11,179},{10,0,3051}, +{0,12,1278},{0,10,274},{0,8,1795},{19,0,3051},{0,8,1795},{1,17,114},{1,17,114},{1,17,114},{1,9,114},{0,12,648},{0,9,85},{0,9,85},{0,5,244},{0,5,889},{0,5,413},{2,15,1},{2,15,1},{2,15,1},{2,8,5},{4,4,648},{0,9,85},{0,9,85},{0,5,244},{12,0,648},{0,5,244},{13,0,884},{2,16,9},{4,11,10},{0,11,90},{13,0,884},{26,0,884},{0,11,90}, +{0,9,890},{26,0,884},{0,9,890},{1,0,113},{1,0,113},{1,0,113},{1,0,113},{0,6,1},{0,6,1},{0,6,1},{0,3,1},{0,2,50},{0,2,50},{1,27,1173},{1,18,314},{2,13,510},{1,12,374},{0,22,3051},{0,14,1139},{0,12,153},{0,9,1630},{0,10,3924},{0,8,2199},{3,23,885},{3,17,10},{3,13,101},{2,12,197},{11,0,3051},{0,14,1139},{0,12,153},{0,9,1630},{22,0,3051}, +{0,9,1630},{1,20,290},{1,20,290},{1,20,290},{1,10,293},{0,15,648},{0,10,41},{0,10,41},{0,6,181},{0,7,1027},{0,6,437},{3,16,2},{3,16,2},{3,16,2},{3,9,5},{5,5,648},{0,10,41},{0,10,41},{0,6,181},{15,0,648},{0,6,181},{14,1,884},{3,17,9},{5,12,5},{0,12,53},{14,1,884},{29,0,884},{0,12,53},{0,10,890},{29,0,884},{0,10,890},{1,0,289}, +{1,0,289},{1,0,289},{1,0,289},{0,8,1},{0,8,1},{0,8,1},{0,4,1},{0,3,113},{0,3,113},{2,28,1365},{2,19,506},{3,14,830},{2,13,566},{0,25,3051},{0,16,1051},{0,13,36},{0,10,1483},{0,12,4164},{0,9,2174},{4,24,886},{4,18,20},{4,14,89},{3,13,197},{12,1,3051},{0,16,1051},{0,13,36},{0,10,1483},{25,0,3051},{0,10,1483},{2,21,482},{2,21,482},{2,21,482}, +{2,11,485},{0,18,648},{0,12,5},{0,12,5},{0,7,149},{0,8,1182},{0,7,510},{4,16,5},{4,16,5},{4,16,5},{4,10,8},{9,0,648},{0,12,5},{0,12,5},{0,7,149},{18,0,648},{0,7,149},{16,0,882},{3,19,10},{6,13,5},{0,13,20},{16,0,882},{24,4,882},{0,13,20},{0,11,890},{24,4,882},{0,11,890},{2,0,481},{2,0,481},{2,0,481},{2,0,481},{0,11,1}, +{0,11,1},{0,11,1},{0,6,1},{0,5,185},{0,5,185},{2,31,1669},{3,20,818},{3,15,1161},{2,14,838},{0,28,3048},{0,17,949},{0,14,6},{0,11,1395},{0,13,4381},{0,10,2228},{5,25,886},{5,19,20},{5,15,89},{4,14,184},{12,4,3048},{0,17,949},{0,14,6},{0,11,1395},{28,0,3048},{0,11,1395},{2,24,786},{2,24,786},{2,24,786},{2,13,786},{0,21,648},{0,14,2},{0,14,2}, +{0,9,101},{0,9,1352},{0,8,590},{5,17,5},{5,17,5},{5,17,5},{5,11,8},{10,1,648},{0,14,2},{0,14,2},{0,9,101},{21,0,648},{0,9,101},{17,1,882},{4,19,5},{7,14,5},{0,14,5},{17,1,882},{27,4,882},{0,14,5},{0,12,900},{27,4,882},{0,12,900},{2,0,785},{2,0,785},{2,0,785},{2,0,785},{0,14,1},{0,14,1},{0,14,1},{0,7,1},{0,6,305}, +{0,6,305},{3,31,1814},{3,22,968},{4,16,1314},{3,15,945},{1,29,3055},{0,19,936},{1,15,17},{0,12,1314},{0,15,4321},{0,12,2007},{6,26,885},{6,20,10},{6,16,101},{5,15,179},{15,2,3051},{0,19,900},{1,15,13},{0,12,1278},{31,0,3051},{0,12,1278},{3,25,900},{3,25,900},{3,25,900},{3,14,900},{1,22,654},{1,15,8},{1,15,8},{0,10,76},{0,11,1296},{0,9,425},{6,19,1}, +{6,19,1},{6,19,1},{6,12,5},{12,0,648},{1,15,4},{1,15,4},{0,10,40},{24,0,648},{0,10,40},{19,0,884},{6,20,9},{8,15,10},{1,15,9},{19,0,884},{30,4,884},{1,15,9},{0,13,890},{30,4,884},{0,13,890},{3,0,900},{3,0,900},{3,0,900},{3,0,900},{1,16,5},{1,16,5},{1,16,5},{1,8,8},{0,7,269},{0,7,269},{5,31,1838},{4,23,948},{5,17,1314}, +{4,16,943},{2,30,3055},{1,20,936},{2,16,13},{1,13,1314},{0,16,4056},{0,13,1620},{7,27,885},{7,21,10},{7,17,101},{6,16,197},{17,0,3051},{0,21,891},{2,16,9},{0,13,1179},{30,2,3051},{0,13,1179},{4,26,891},{4,26,891},{4,26,891},{4,15,891},{2,23,654},{2,16,9},{2,16,9},{1,11,76},{0,13,1107},{0,10,273},{7,20,2},{7,20,2},{7,20,2},{7,13,5},{13,1,648}, +{3,15,5},{3,15,5},{0,11,20},{27,0,648},{0,11,20},{20,1,884},{7,21,9},{9,16,5},{2,16,5},{20,1,884},{31,5,884},{2,16,5},{0,14,890},{31,5,884},{0,14,890},{4,0,890},{4,0,890},{4,0,890},{4,0,890},{2,17,5},{2,17,5},{2,17,5},{2,9,8},{0,9,149},{0,9,149},{6,31,1868},{5,24,948},{6,18,1314},{5,17,943},{3,31,3055},{2,21,936},{3,17,13}, +{2,14,1314},{0,18,3825},{0,14,1354},{8,28,886},{8,22,20},{8,18,89},{7,17,197},{18,1,3051},{1,22,891},{3,17,9},{0,14,1098},{31,3,3051},{0,14,1098},{5,27,891},{5,27,891},{5,27,891},{5,16,891},{3,24,652},{3,17,9},{3,17,9},{2,12,86},{0,14,976},{0,12,126},{8,20,5},{8,20,5},{8,20,5},{8,14,8},{15,0,648},{4,16,5},{4,16,5},{0,12,5},{30,0,648}, +{0,12,5},{20,4,882},{7,23,10},{10,17,5},{3,17,5},{20,4,882},{28,8,882},{3,17,5},{0,15,890},{28,8,882},{0,15,890},{5,0,890},{5,0,890},{5,0,890},{5,0,890},{3,18,5},{3,18,5},{3,18,5},{3,10,8},{0,11,80},{0,11,80},{7,31,1908},{6,25,948},{7,19,1314},{6,18,943},{4,31,3084},{3,22,936},{4,18,15},{3,15,1314},{0,19,3640},{0,15,1175},{9,29,886}, +{9,23,20},{9,19,89},{8,18,184},{20,0,3048},{2,23,891},{4,18,6},{0,15,1054},{24,8,3048},{0,15,1054},{6,28,891},{6,28,891},{6,28,891},{6,17,891},{4,25,657},{4,18,11},{4,18,11},{3,13,86},{0,16,852},{0,13,27},{9,21,5},{9,21,5},{9,21,5},{9,15,8},{16,1,648},{4,18,2},{4,18,2},{0,13,2},{31,1,648},{0,13,2},{21,5,882},{8,23,5},{11,18,5}, +{4,18,5},{21,5,882},{31,8,882},{4,18,5},{0,16,900},{31,8,882},{0,16,900},{6,0,890},{6,0,890},{6,0,890},{6,0,890},{4,18,10},{4,18,10},{4,18,10},{4,11,10},{0,13,26},{0,13,26},{8,31,1998},{7,26,968},{8,20,1314},{7,19,945},{6,31,3160},{4,23,936},{5,19,17},{4,16,1314},{0,21,3420},{0,16,1028},{10,30,885},{10,24,10},{10,20,101},{9,19,179},{22,0,3051}, +{3,24,891},{5,19,13},{0,16,1003},{30,7,3051},{0,16,1003},{7,29,900},{7,29,900},{7,29,900},{7,18,900},{5,26,654},{5,19,8},{5,19,8},{4,14,76},{0,18,750},{1,14,24},{10,23,1},{10,23,1},{10,23,1},{10,16,5},{16,4,648},{5,19,4},{5,19,4},{2,14,5},{28,4,648},{2,14,5},{25,0,884},{10,24,9},{12,19,10},{5,19,9},{25,0,884},{30,10,884},{5,19,9}, +{0,17,890},{30,10,884},{0,17,890},{7,0,900},{7,0,900},{7,0,900},{7,0,900},{5,20,5},{5,20,5},{5,20,5},{5,12,8},{0,15,5},{0,15,5},{9,31,2124},{8,27,948},{9,21,1314},{8,20,943},{7,31,3196},{5,24,936},{6,20,13},{5,17,1314},{0,23,3307},{0,17,971},{11,31,885},{11,25,10},{11,21,101},{10,20,197},{23,0,3051},{4,25,891},{6,20,9},{0,17,970},{30,8,3051}, +{0,17,970},{8,30,891},{8,30,891},{8,30,891},{8,19,891},{6,27,654},{6,20,9},{6,20,9},{5,15,76},{0,19,691},{2,15,24},{11,24,2},{11,24,2},{11,24,2},{11,17,5},{17,5,648},{7,19,5},{7,19,5},{3,15,5},{31,4,648},{3,15,5},{26,1,884},{11,25,9},{13,20,5},{6,20,5},{26,1,884},{31,11,884},{6,20,5},{0,18,890},{31,11,884},{0,18,890},{8,0,890}, +{8,0,890},{8,0,890},{8,0,890},{6,21,5},{6,21,5},{6,21,5},{6,13,8},{1,16,5},{1,16,5},{10,31,2286},{9,28,948},{10,22,1314},{9,21,943},{8,31,3277},{6,25,936},{7,21,13},{6,18,1314},{0,24,3196},{0,19,948},{12,31,904},{12,26,20},{12,22,89},{11,21,197},{24,1,3051},{5,26,891},{7,21,9},{0,19,939},{31,9,3051},{0,19,939},{9,31,891},{9,31,891},{9,31,891}, +{9,20,891},{7,28,652},{7,21,9},{7,21,9},{6,16,86},{0,21,652},{2,16,18},{12,24,5},{12,24,5},{12,24,5},{12,18,8},{21,0,648},{8,20,5},{8,20,5},{3,16,2},{30,6,648},{3,16,2},{28,0,882},{11,27,10},{14,21,5},{7,21,5},{28,0,882},{24,16,882},{7,21,5},{0,19,890},{24,16,882},{0,19,890},{9,0,890},{9,0,890},{9,0,890},{9,0,890},{7,22,5}, +{7,22,5},{7,22,5},{7,14,8},{2,17,5},{2,17,5},{11,31,2414},{10,29,948},{11,23,1314},{10,22,943},{9,31,3412},{7,26,936},{8,22,15},{7,19,1314},{0,26,3115},{1,20,958},{13,31,958},{13,27,20},{13,23,89},{12,22,184},{24,4,3048},{6,27,891},{8,22,6},{0,20,925},{28,12,3048},{0,20,925},{10,31,894},{10,31,894},{10,31,894},{10,21,891},{8,29,657},{8,22,11},{8,22,11}, +{7,17,86},{1,22,652},{3,17,18},{13,25,5},{13,25,5},{13,25,5},{13,19,8},{22,1,648},{8,22,2},{8,22,2},{4,17,2},{31,7,648},{4,17,2},{29,1,882},{12,27,5},{15,22,5},{8,22,5},{29,1,882},{27,16,882},{8,22,5},{0,20,900},{27,16,882},{0,20,900},{10,0,890},{10,0,890},{10,0,890},{10,0,890},{8,22,10},{8,22,10},{8,22,10},{8,15,10},{3,18,5}, +{3,18,5},{13,31,2606},{11,30,968},{12,24,1314},{11,23,945},{11,31,3519},{8,27,936},{9,23,17},{8,20,1314},{0,28,3085},{2,21,942},{15,31,995},{14,28,10},{14,24,101},{13,23,179},{27,2,3051},{7,28,891},{9,23,13},{0,21,891},{31,12,3051},{0,21,891},{11,31,925},{11,31,925},{11,31,925},{11,22,900},{9,30,654},{9,23,8},{9,23,8},{8,18,76},{2,23,651},{5,18,24},{14,27,1}, +{14,27,1},{14,27,1},{14,20,5},{24,0,648},{9,23,4},{9,23,4},{6,18,5},{24,12,648},{6,18,5},{31,0,884},{14,28,9},{16,23,10},{9,23,9},{31,0,884},{30,16,884},{9,23,9},{0,21,890},{30,16,884},{0,21,890},{11,0,900},{11,0,900},{11,0,900},{11,0,900},{9,24,5},{9,24,5},{9,24,5},{9,16,8},{4,19,5},{4,19,5},{14,31,2804},{12,31,948},{13,25,1314}, +{12,24,943},{12,31,3652},{9,28,936},{10,24,13},{9,21,1314},{0,29,3052},{3,22,942},{16,31,1054},{15,29,10},{15,25,101},{14,24,197},{29,0,3051},{8,29,891},{10,24,9},{1,22,891},{30,14,3051},{1,22,891},{12,31,939},{12,31,939},{12,31,939},{12,23,891},{10,31,654},{10,24,9},{10,24,9},{9,19,76},{3,24,652},{6,19,24},{15,28,2},{15,28,2},{15,28,2},{15,21,5},{25,1,648}, +{11,23,5},{11,23,5},{7,19,5},{27,12,648},{7,19,5},{31,3,884},{15,29,9},{17,24,5},{10,24,5},{31,3,884},{31,17,884},{10,24,5},{0,22,890},{31,17,884},{0,22,890},{12,0,890},{12,0,890},{12,0,890},{12,0,890},{10,25,5},{10,25,5},{10,25,5},{10,17,8},{5,20,5},{5,20,5},{15,31,2956},{14,31,979},{14,26,1314},{13,25,943},{13,31,3841},{10,29,936},{11,25,13}, +{10,22,1314},{1,30,3052},{4,23,948},{17,31,1144},{16,30,20},{16,26,89},{15,25,197},{30,1,3051},{9,30,891},{11,25,9},{2,23,891},{31,15,3051},{2,23,891},{14,31,979},{14,31,979},{14,31,979},{13,24,891},{11,31,670},{11,25,9},{11,25,9},{10,20,86},{4,25,652},{6,20,18},{16,28,5},{16,28,5},{16,28,5},{16,22,8},{27,0,648},{12,24,5},{12,24,5},{7,20,2},{30,12,648}, +{7,20,2},{28,12,882},{15,31,10},{18,25,5},{11,25,5},{28,12,882},{28,20,882},{11,25,5},{0,23,890},{28,20,882},{0,23,890},{13,0,890},{13,0,890},{13,0,890},{13,0,890},{11,26,5},{11,26,5},{11,26,5},{11,18,8},{6,21,5},{6,21,5},{16,31,3182},{15,31,1028},{15,27,1314},{14,26,943},{15,31,4020},{11,30,936},{12,26,15},{11,23,1314},{2,31,3052},{5,24,958},{18,31,1270}, +{17,31,20},{17,27,89},{16,26,184},{28,8,3048},{10,31,891},{12,26,6},{2,24,901},{24,20,3048},{2,24,901},{15,31,1003},{15,31,1003},{15,31,1003},{14,25,891},{12,31,707},{12,26,11},{12,26,11},{11,21,86},{5,26,652},{7,21,18},{17,29,5},{17,29,5},{17,29,5},{17,23,8},{28,1,648},{12,26,2},{12,26,2},{8,21,2},{31,13,648},{8,21,2},{29,13,882},{16,31,5},{19,26,5}, +{12,26,5},{29,13,882},{31,20,882},{12,26,5},{0,24,900},{31,20,882},{0,24,900},{14,0,890},{14,0,890},{14,0,890},{14,0,890},{12,26,10},{12,26,10},{12,26,10},{12,19,10},{7,22,5},{7,22,5},{17,31,3508},{16,31,1175},{16,28,1314},{15,27,945},{16,31,4209},{12,31,936},{13,27,17},{12,24,1314},{4,31,3100},{6,25,942},{20,31,1368},{18,31,37},{18,28,101},{17,27,179},{31,6,3051}, +{12,31,900},{13,27,13},{4,25,891},{30,19,3051},{4,25,891},{16,31,1054},{16,31,1054},{16,31,1054},{15,26,900},{14,31,780},{13,27,8},{13,27,8},{12,22,76},{6,27,651},{9,22,24},{18,31,1},{18,31,1},{18,31,1},{18,24,5},{28,4,648},{13,27,4},{13,27,4},{10,22,5},{28,16,648},{10,22,5},{31,12,884},{18,31,36},{20,27,10},{13,27,9},{31,12,884},{30,22,884},{13,27,9}, +{0,25,890},{30,22,884},{0,25,890},{15,0,900},{15,0,900},{15,0,900},{15,0,900},{13,28,5},{13,28,5},{13,28,5},{13,20,8},{8,23,5},{8,23,5},{19,31,3790},{17,31,1412},{17,29,1314},{16,28,943},{17,31,4452},{14,31,954},{14,28,13},{13,25,1314},{7,31,3196},{7,26,942},{21,31,1494},{19,31,126},{19,29,101},{18,28,197},{31,8,3051},{14,31,950},{14,28,9},{5,26,891},{30,20,3051}, +{5,26,891},{17,31,1123},{17,31,1123},{17,31,1123},{16,27,891},{15,31,820},{14,28,9},{14,28,9},{13,23,76},{7,28,652},{10,23,24},{19,31,5},{19,31,5},{19,31,5},{19,25,5},{29,5,648},{15,27,5},{15,27,5},{11,23,5},{31,16,648},{11,23,5},{31,15,884},{20,31,80},{21,28,5},{14,28,5},{31,15,884},{31,23,884},{14,28,5},{0,26,890},{31,23,884},{0,26,890},{16,0,890}, +{16,0,890},{16,0,890},{16,0,890},{14,29,5},{14,29,5},{14,29,5},{14,21,8},{9,24,5},{9,24,5},{20,31,4072},{18,31,1694},{18,30,1314},{17,29,943},{19,31,4705},{15,31,1064},{15,29,13},{14,26,1314},{8,31,3355},{8,27,948},{22,31,1656},{20,31,276},{20,30,89},{19,29,197},{31,11,3051},{16,31,1054},{15,29,9},{6,27,891},{31,21,3051},{6,27,891},{18,31,1210},{18,31,1210},{18,31,1210}, +{17,28,891},{16,31,897},{15,29,9},{15,29,9},{14,24,86},{8,29,652},{10,24,18},{20,31,20},{20,31,20},{20,31,20},{20,26,8},{31,4,648},{16,28,5},{16,28,5},{11,24,2},{30,18,648},{11,24,2},{28,24,882},{22,31,157},{22,29,5},{15,29,5},{28,24,882},{24,28,882},{15,29,5},{0,27,890},{24,28,882},{0,27,890},{17,0,890},{17,0,890},{17,0,890},{17,0,890},{15,30,5}, +{15,30,5},{15,30,5},{15,22,8},{10,25,5},{10,25,5},{21,31,4390},{19,31,2007},{19,31,1314},{18,30,943},{20,31,4932},{16,31,1287},{16,30,15},{15,27,1314},{11,31,3547},{9,28,958},{23,31,1784},{22,31,465},{21,31,89},{20,30,184},{28,20,3048},{18,31,1188},{16,30,6},{6,28,901},{28,24,3048},{6,28,901},{19,31,1278},{19,31,1278},{19,31,1278},{18,29,891},{17,31,1011},{16,30,11},{16,30,11}, +{15,25,86},{9,30,652},{11,25,18},{21,31,53},{21,31,53},{21,31,53},{21,27,8},{31,7,648},{16,30,2},{16,30,2},{12,25,2},{31,19,648},{12,25,2},{29,25,882},{24,31,269},{23,30,5},{16,30,5},{29,25,882},{27,28,882},{16,30,5},{0,28,900},{27,28,882},{0,28,900},{18,0,890},{18,0,890},{18,0,890},{18,0,890},{16,30,10},{16,30,10},{16,30,10},{16,23,10},{11,26,5}, +{11,26,5},{22,31,4471},{20,31,2295},{20,31,1395},{19,31,936},{21,31,4906},{18,31,1414},{17,31,8},{16,28,1161},{13,31,3570},{11,28,818},{24,31,1769},{23,31,590},{23,31,106},{22,30,146},{29,21,2814},{19,31,1206},{17,31,4},{8,29,786},{31,24,2814},{8,29,786},{20,31,1395},{20,31,1395},{20,31,1395},{19,30,900},{19,31,1134},{17,31,8},{17,31,8},{16,26,76},{10,31,651},{13,26,24},{23,31,106}, +{23,31,106},{23,31,106},{22,28,5},{28,16,648},{17,31,4},{17,31,4},{14,26,5},{24,24,648},{14,26,5},{31,24,761},{26,31,317},{24,31,1},{17,31,0},{31,24,761},{30,28,761},{17,31,0},{0,29,785},{30,28,761},{0,29,785},{19,0,900},{19,0,900},{19,0,900},{19,0,900},{17,31,8},{17,31,8},{17,31,8},{17,24,8},{12,27,5},{12,27,5},{23,31,3955},{22,31,2260},{21,31,1530}, +{20,31,891},{22,31,4375},{19,31,1194},{18,31,54},{17,28,805},{15,31,3075},{12,29,498},{25,31,1417},{24,31,510},{24,31,149},{23,30,74},{31,19,2249},{21,31,937},{19,31,5},{11,29,482},{31,25,2249},{11,29,482},{21,31,1530},{21,31,1530},{21,31,1530},{20,31,891},{20,31,1251},{18,31,54},{18,31,54},{17,27,76},{12,31,691},{14,27,24},{24,31,149},{24,31,149},{24,31,149},{23,29,5},{29,17,648}, +{19,31,5},{19,31,5},{15,27,5},{27,24,648},{15,27,5},{29,29,481},{27,31,202},{25,31,4},{20,31,1},{29,29,481},{31,28,481},{20,31,1},{0,29,481},{31,28,481},{0,29,481},{20,0,890},{20,0,890},{20,0,890},{20,0,890},{18,31,29},{18,31,29},{18,31,29},{18,25,8},{13,28,5},{13,28,5},{24,31,3609},{23,31,2199},{22,31,1683},{21,31,915},{23,31,3827},{20,31,1071},{19,31,153}, +{18,29,485},{16,31,2690},{13,30,306},{26,31,1133},{25,31,489},{25,31,200},{24,31,20},{29,25,1769},{22,31,710},{21,31,41},{12,30,290},{27,28,1769},{12,30,290},{22,31,1683},{22,31,1683},{22,31,1683},{21,31,915},{21,31,1401},{19,31,153},{19,31,153},{18,28,86},{14,31,769},{14,28,18},{25,31,200},{25,31,200},{25,31,200},{24,30,8},{31,16,648},{21,31,41},{21,31,41},{15,28,2},{30,24,648}, +{15,28,2},{31,27,265},{28,31,113},{27,31,1},{23,31,1},{31,27,265},{31,29,265},{23,31,1},{0,30,289},{31,29,265},{0,30,289},{21,0,890},{21,0,890},{21,0,890},{21,0,890},{19,31,53},{19,31,53},{19,31,53},{19,26,8},{14,29,5},{14,29,5},{24,31,3305},{24,31,2222},{23,31,1795},{22,31,990},{24,31,3438},{22,31,1087},{21,31,306},{19,30,293},{18,31,2403},{15,30,118},{27,31,857}, +{26,31,465},{26,31,269},{25,31,8},{31,23,1374},{24,31,546},{23,31,98},{14,30,114},{31,27,1374},{14,30,114},{23,31,1795},{23,31,1795},{23,31,1795},{22,31,990},{22,31,1587},{21,31,306},{21,31,306},{19,29,86},{16,31,897},{15,29,18},{26,31,269},{26,31,269},{26,31,269},{25,31,8},{31,19,648},{23,31,98},{23,31,98},{16,29,2},{31,25,648},{16,29,2},{31,28,113},{29,31,52},{28,31,1}, +{26,31,1},{31,28,113},{30,30,113},{26,31,1},{0,30,113},{30,30,113},{0,30,113},{22,0,890},{22,0,890},{22,0,890},{22,0,890},{20,31,90},{20,31,90},{20,31,90},{20,27,10},{15,30,5},{15,30,5},{25,31,3092},{25,31,2292},{24,31,1978},{24,31,1123},{25,31,3124},{23,31,1068},{22,31,525},{20,30,140},{20,31,2196},{16,31,41},{28,31,680},{27,31,458},{27,31,337},{26,31,65},{29,29,1032}, +{26,31,456},{24,31,185},{16,31,37},{31,28,1032},{16,31,37},{24,31,1978},{24,31,1978},{24,31,1978},{24,31,1123},{24,31,1769},{22,31,525},{22,31,525},{20,30,76},{18,31,1080},{17,30,24},{27,31,337},{27,31,337},{27,31,337},{26,31,65},{28,28,648},{24,31,185},{24,31,185},{18,30,5},{28,28,648},{18,30,5},{31,30,18},{30,31,9},{30,31,0},{29,31,0},{31,30,18},{30,31,18},{29,31,0}, +{0,31,36},{30,31,18},{0,31,36},{23,0,900},{23,0,900},{23,0,900},{23,0,900},{22,31,164},{22,31,164},{22,31,164},{21,28,8},{16,31,5},{16,31,5},{27,31,2818},{26,31,2254},{25,31,2043},{25,31,1243},{26,31,2829},{24,31,1099},{23,31,684},{21,31,72},{22,31,2007},{18,31,20},{29,31,566},{28,31,420},{28,31,356},{27,31,122},{31,27,771},{27,31,386},{26,31,232},{19,31,1},{31,29,771}, +{19,31,1},{25,31,2043},{25,31,2043},{25,31,2043},{25,31,1243},{25,31,1819},{23,31,684},{23,31,684},{21,31,72},{20,31,1172},{18,31,20},{28,31,356},{28,31,356},{28,31,356},{27,31,122},{31,25,578},{26,31,232},{26,31,232},{19,31,1},{27,30,578},{19,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{24,0,890}, +{24,0,890},{24,0,890},{24,0,890},{23,31,200},{23,31,200},{23,31,200},{22,29,8},{18,31,20},{18,31,20},{27,31,2242},{27,31,1879},{26,31,1738},{26,31,1150},{27,31,2209},{24,31,987},{24,31,626},{23,31,20},{23,31,1560},{19,31,53},{29,31,342},{29,31,257},{29,31,221},{28,31,68},{31,28,452},{28,31,228},{27,31,137},{22,31,1},{30,30,452},{22,31,1},{26,31,1738},{26,31,1738},{26,31,1738}, +{26,31,1150},{25,31,1499},{24,31,626},{24,31,626},{23,31,20},{22,31,950},{19,31,53},{29,31,221},{29,31,221},{29,31,221},{28,31,68},{31,26,340},{27,31,137},{27,31,137},{22,31,1},{30,29,340},{22,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{25,0,890},{25,0,890},{25,0,890},{25,0,890},{24,31,265}, +{24,31,265},{24,31,265},{23,30,8},{19,31,53},{19,31,53},{28,31,1844},{27,31,1559},{27,31,1438},{27,31,1075},{27,31,1713},{26,31,853},{25,31,635},{24,31,10},{24,31,1207},{21,31,125},{30,31,172},{30,31,145},{29,31,125},{29,31,40},{31,29,216},{29,31,121},{28,31,68},{24,31,1},{31,30,216},{24,31,1},{27,31,1438},{27,31,1438},{27,31,1438},{27,31,1075},{27,31,1229},{25,31,635},{25,31,635}, +{24,31,10},{23,31,756},{21,31,125},{29,31,125},{29,31,125},{29,31,125},{29,31,40},{31,28,164},{28,31,68},{28,31,68},{24,31,1},{30,30,164},{24,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{26,0,890},{26,0,890},{26,0,890},{26,0,890},{25,31,346},{25,31,346},{25,31,346},{24,31,10},{21,31,125}, +{21,31,125},{0,19,1568},{0,13,202},{0,10,13},{0,8,596},{0,13,3371},{0,9,2162},{0,8,1080},{0,5,2539},{0,6,3648},{0,5,2708},{0,19,1568},{0,13,202},{0,10,13},{0,8,596},{6,1,3371},{0,9,2162},{0,8,1080},{0,5,2539},{13,0,3371},{0,5,2539},{0,9,0},{0,9,0},{0,9,0},{0,4,4},{0,4,290},{0,4,125},{0,4,125},{0,2,164},{0,2,321},{0,2,189},{0,9,0}, +{0,9,0},{0,9,0},{0,4,4},{2,1,290},{0,4,125},{0,4,125},{0,2,164},{4,0,290},{0,2,164},{9,1,1568},{0,13,202},{0,10,13},{0,8,596},{9,1,1568},{19,0,1568},{0,8,596},{0,6,1586},{19,0,1568},{0,6,1586},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,22,1568},{0,15,117},{0,11,8}, +{0,9,485},{0,15,3971},{0,10,2369},{0,9,1061},{0,6,2834},{0,7,4341},{0,6,3090},{0,22,1568},{0,15,117},{0,11,8},{0,9,485},{7,1,3968},{0,10,2369},{0,9,1061},{0,6,2834},{11,2,3968},{0,6,2834},{0,12,1},{0,12,1},{0,12,1},{0,6,0},{0,6,512},{0,5,194},{0,5,194},{0,3,320},{0,3,576},{0,2,381},{0,12,1},{0,12,1},{0,12,1},{0,6,0},{3,0,512}, +{0,5,194},{0,5,194},{0,3,320},{6,0,512},{0,3,320},{11,0,1568},{0,15,117},{0,11,8},{0,9,485},{11,0,1568},{22,0,1568},{0,9,485},{0,7,1586},{22,0,1568},{0,7,1586},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,25,1568},{0,17,45},{0,12,58},{0,10,392},{0,17,4652},{0,11,2596},{0,10,1121}, +{0,7,3254},{0,8,5140},{0,6,3570},{0,25,1568},{0,17,45},{0,12,58},{0,10,392},{8,1,4652},{0,11,2596},{0,10,1121},{0,7,3254},{17,0,4652},{0,7,3254},{0,15,1},{0,15,1},{0,15,1},{0,7,4},{0,7,802},{0,6,320},{0,6,320},{0,3,512},{0,3,896},{0,3,576},{0,15,1},{0,15,1},{0,15,1},{0,7,4},{3,2,802},{0,6,320},{0,6,320},{0,3,512},{7,0,802}, +{0,3,512},{12,1,1568},{0,17,45},{1,12,13},{0,10,392},{12,1,1568},{25,0,1568},{0,10,392},{0,8,1576},{25,0,1568},{0,8,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,28,1570},{0,19,16},{0,13,178},{0,11,340},{0,19,5424},{0,13,2843},{0,11,1240},{0,8,3704},{0,9,6003},{0,7,4095},{0,28,1570}, +{0,19,16},{1,13,122},{0,11,340},{7,5,5419},{0,13,2843},{0,11,1240},{0,8,3704},{15,2,5419},{0,8,3704},{0,18,1},{0,18,1},{0,18,1},{0,9,1},{0,9,1152},{0,7,461},{0,7,461},{0,4,709},{0,4,1281},{0,4,830},{0,18,1},{0,18,1},{0,18,1},{0,9,1},{4,1,1152},{0,7,461},{0,7,461},{0,4,709},{9,0,1152},{0,4,709},{14,0,1568},{0,19,16},{2,13,13}, +{0,11,340},{14,0,1568},{26,1,1568},{0,11,340},{0,9,1576},{26,1,1568},{0,9,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,29,1633},{1,20,75},{1,14,265},{0,13,313},{0,22,5419},{0,14,2571},{0,12,853},{0,9,3410},{0,10,6244},{0,9,3986},{1,29,1569},{1,20,11},{2,14,117},{0,13,313},{11,0,5419}, +{0,14,2571},{0,12,853},{0,9,3410},{22,0,5419},{0,9,3410},{1,19,65},{1,19,65},{1,19,65},{1,10,65},{0,12,1152},{0,9,289},{0,9,289},{0,5,580},{0,5,1393},{0,5,749},{1,19,1},{1,19,1},{1,19,1},{1,10,1},{4,4,1152},{0,9,289},{0,9,289},{0,5,580},{12,0,1152},{0,5,580},{13,5,1568},{0,21,4},{3,14,13},{0,13,232},{13,5,1568},{31,0,1568},{0,13,232}, +{0,10,1586},{31,0,1568},{0,10,1586},{1,0,65},{1,0,65},{1,0,65},{1,0,65},{0,3,1},{0,3,1},{0,3,1},{0,2,1},{0,1,20},{0,1,20},{1,31,1731},{1,22,149},{2,15,457},{1,14,377},{0,25,5419},{0,16,2347},{0,13,556},{0,10,3179},{0,11,6495},{0,9,3890},{2,30,1569},{2,21,11},{3,15,117},{1,14,313},{12,1,5419},{0,16,2347},{0,13,556},{0,10,3179},{25,0,5419}, +{0,10,3179},{1,22,145},{1,22,145},{1,22,145},{1,11,154},{0,15,1152},{0,11,194},{0,11,194},{0,6,481},{0,7,1531},{0,6,737},{2,20,1},{2,20,1},{2,20,1},{2,11,1},{5,5,1152},{0,11,194},{0,11,194},{0,6,481},{15,0,1152},{0,6,481},{17,0,1568},{1,22,4},{4,15,8},{0,14,157},{17,0,1568},{30,2,1568},{0,14,157},{0,11,1586},{30,2,1568},{0,11,1586},{1,0,145}, +{1,0,145},{1,0,145},{1,0,145},{0,6,1},{0,6,1},{0,6,1},{0,3,1},{0,3,65},{0,3,65},{2,31,1977},{2,23,341},{2,16,707},{1,15,510},{0,28,5424},{0,17,2137},{0,15,373},{0,11,3035},{0,13,6709},{0,10,3860},{3,31,1569},{3,22,11},{4,16,122},{2,15,313},{14,0,5419},{0,17,2137},{0,15,373},{0,11,3035},{26,1,5419},{0,11,3035},{2,23,337},{2,23,337},{2,23,337}, +{2,12,341},{0,18,1152},{0,13,104},{0,13,104},{0,8,410},{0,8,1686},{0,7,786},{3,21,1},{3,21,1},{3,21,1},{3,12,2},{9,0,1152},{0,13,104},{0,13,104},{0,8,410},{18,0,1152},{0,8,410},{18,1,1568},{2,23,4},{5,16,13},{0,15,117},{18,1,1568},{31,3,1568},{0,15,117},{0,12,1576},{31,3,1568},{0,12,1576},{2,0,337},{2,0,337},{2,0,337},{2,0,337},{0,9,1}, +{0,9,1},{0,9,1},{0,5,4},{0,4,130},{0,4,130},{3,31,2353},{2,24,570},{3,17,1027},{2,16,714},{0,31,5424},{0,19,1979},{0,16,195},{0,12,2857},{0,14,7039},{0,11,3919},{4,31,1576},{4,23,16},{5,17,122},{3,16,331},{15,1,5419},{0,19,1979},{0,16,195},{0,12,2857},{27,2,5419},{0,12,2857},{2,26,546},{2,26,546},{2,26,546},{2,14,546},{0,21,1152},{0,14,50},{0,14,50}, +{0,9,305},{0,9,1856},{0,8,830},{4,22,1},{4,22,1},{4,22,1},{4,13,1},{10,1,1152},{0,14,50},{0,14,50},{0,9,305},{21,0,1152},{0,9,305},{19,2,1568},{3,24,10},{6,17,13},{0,16,74},{19,2,1568},{30,5,1568},{0,16,74},{0,13,1576},{30,5,1568},{0,13,1576},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,12,0},{0,12,0},{0,12,0},{0,6,1},{0,5,205}, +{0,5,205},{4,31,2980},{3,26,925},{3,19,1484},{2,17,1032},{1,31,5504},{0,21,1811},{0,17,61},{0,13,2651},{0,16,7420},{0,13,3876},{6,31,1619},{5,24,11},{6,18,117},{4,17,313},{17,0,5419},{0,21,1811},{0,17,61},{0,13,2651},{30,2,5419},{0,13,2651},{3,27,900},{3,27,900},{3,27,900},{3,15,900},{0,24,1152},{0,16,8},{0,16,8},{0,10,208},{0,11,2124},{0,9,881},{5,23,1}, +{5,23,1},{5,23,1},{5,14,1},{12,0,1152},{0,16,8},{0,16,8},{0,10,208},{24,0,1152},{0,10,208},{21,1,1568},{4,25,4},{7,18,13},{0,17,45},{21,1,1568},{27,8,1568},{0,17,45},{0,14,1586},{27,8,1568},{0,14,1586},{3,0,900},{3,0,900},{3,0,900},{3,0,900},{0,15,1},{0,15,1},{0,15,1},{0,8,4},{0,6,356},{0,6,356},{4,31,3668},{3,27,1320},{4,20,1940}, +{3,18,1352},{2,31,5771},{0,23,1737},{0,18,37},{0,14,2486},{0,17,7711},{0,14,3930},{7,31,1635},{6,25,11},{7,19,117},{5,18,313},{18,1,5419},{0,23,1737},{0,18,37},{0,14,2486},{31,3,5419},{0,14,2486},{3,30,1252},{3,30,1252},{3,30,1252},{3,16,1256},{0,27,1152},{0,18,1},{0,18,1},{0,11,164},{0,12,2369},{0,10,1001},{6,24,1},{6,24,1},{6,24,1},{6,15,1},{13,1,1152}, +{0,18,1},{0,18,1},{0,11,164},{27,0,1152},{0,11,164},{23,0,1568},{5,26,4},{8,19,8},{0,18,36},{23,0,1568},{30,8,1568},{0,18,36},{0,15,1586},{30,8,1568},{0,15,1586},{3,0,1252},{3,0,1252},{3,0,1252},{3,0,1252},{0,18,1},{0,18,1},{0,18,1},{0,9,1},{0,7,505},{0,7,505},{5,31,4346},{4,28,1644},{5,21,2372},{4,19,1703},{3,31,6079},{0,24,1644},{0,20,38}, +{0,15,2390},{0,18,7969},{0,15,3907},{8,31,1682},{7,26,11},{8,20,122},{6,19,313},{19,2,5419},{0,24,1640},{0,20,34},{0,15,2386},{30,5,5419},{0,15,2386},{4,31,1587},{4,31,1587},{4,31,1587},{4,17,1590},{0,30,1156},{0,20,29},{0,20,29},{0,12,117},{0,13,2483},{0,11,1044},{7,25,1},{7,25,1},{7,25,1},{7,16,2},{15,0,1152},{1,19,1},{1,19,1},{0,12,113},{30,0,1152}, +{0,12,113},{24,1,1568},{6,27,4},{9,20,13},{0,20,25},{24,1,1568},{31,9,1568},{0,20,25},{0,16,1576},{31,9,1568},{0,16,1576},{4,0,1586},{4,0,1586},{4,0,1586},{4,0,1586},{0,21,5},{0,21,5},{0,21,5},{0,11,8},{0,9,565},{0,9,565},{7,31,4580},{5,29,1644},{6,22,2372},{4,20,1692},{4,31,6228},{1,25,1644},{1,21,38},{1,16,2348},{0,20,7577},{0,16,3408},{9,31,1760}, +{8,27,16},{9,21,122},{7,20,331},{19,5,5419},{0,26,1593},{2,20,27},{0,16,2252},{31,6,5419},{0,16,2252},{5,31,1590},{5,31,1590},{5,31,1590},{5,18,1590},{1,31,1156},{1,21,29},{1,21,29},{1,13,117},{0,15,2241},{0,13,699},{8,26,1},{8,26,1},{8,26,1},{8,17,1},{16,1,1152},{2,20,2},{2,20,2},{0,13,74},{31,1,1152},{0,13,74},{26,0,1568},{7,28,10},{10,21,13}, +{0,21,10},{26,0,1568},{30,11,1568},{0,21,10},{0,17,1576},{30,11,1568},{0,17,1576},{5,0,1586},{5,0,1586},{5,0,1586},{5,0,1586},{1,22,5},{1,22,5},{1,22,5},{1,12,8},{0,10,433},{0,10,433},{8,31,4826},{6,30,1644},{7,23,2352},{6,21,1676},{5,31,6463},{2,26,1644},{2,22,38},{2,17,2348},{0,22,7196},{0,17,2863},{11,31,1865},{9,28,11},{10,22,117},{8,21,313},{23,0,5419}, +{1,27,1586},{2,22,29},{0,18,2115},{30,8,5419},{0,18,2115},{6,31,1612},{6,31,1612},{6,31,1612},{6,19,1585},{3,30,1179},{3,21,29},{3,21,29},{2,14,122},{0,17,1953},{0,14,426},{9,27,1},{9,27,1},{9,27,1},{9,18,1},{16,4,1152},{3,21,4},{3,21,4},{0,15,49},{28,4,1152},{0,15,49},{25,5,1568},{8,29,4},{11,22,13},{1,22,4},{25,5,1568},{31,12,1568},{1,22,4}, +{0,18,1586},{31,12,1568},{0,18,1586},{6,0,1576},{6,0,1576},{6,0,1576},{6,0,1576},{2,24,10},{2,24,10},{2,24,10},{2,13,10},{0,13,272},{0,13,272},{9,31,5108},{7,31,1644},{8,24,2372},{7,22,1676},{7,31,6660},{3,27,1644},{3,23,38},{3,18,2348},{0,23,6891},{0,18,2519},{12,31,1952},{10,29,11},{11,23,117},{9,22,313},{24,1,5419},{2,28,1584},{3,23,29},{0,19,2027},{31,9,5419}, +{0,19,2027},{7,31,1640},{7,31,1640},{7,31,1640},{7,20,1580},{4,31,1188},{3,23,34},{3,23,34},{3,15,122},{0,19,1795},{0,15,261},{10,28,1},{10,28,1},{10,28,1},{10,19,1},{17,5,1152},{4,22,1},{4,22,1},{0,16,26},{31,4,1152},{0,16,26},{29,0,1568},{9,30,4},{12,23,8},{2,23,4},{29,0,1568},{30,14,1568},{2,23,4},{0,19,1586},{30,14,1568},{0,19,1586},{7,0,1576}, +{7,0,1576},{7,0,1576},{7,0,1576},{3,24,10},{3,24,10},{3,24,10},{3,14,10},{0,14,170},{0,14,170},{10,31,5426},{8,31,1695},{9,25,2372},{8,23,1703},{8,31,6861},{4,28,1644},{4,24,38},{3,19,2372},{0,25,6573},{0,19,2268},{13,31,2066},{11,30,11},{12,24,122},{10,23,313},{26,0,5419},{3,29,1584},{4,24,34},{0,20,1937},{30,11,5419},{0,20,1937},{8,31,1686},{8,31,1686},{8,31,1686}, +{8,21,1590},{5,31,1206},{4,24,29},{4,24,29},{4,16,117},{0,20,1602},{0,17,126},{11,29,1},{11,29,1},{11,29,1},{11,20,2},{21,0,1152},{5,23,1},{5,23,1},{0,17,5},{30,6,1152},{0,17,5},{30,1,1568},{10,31,4},{13,24,13},{3,24,10},{30,1,1568},{31,15,1568},{3,24,10},{0,20,1576},{31,15,1568},{0,20,1576},{8,0,1586},{8,0,1586},{8,0,1586},{8,0,1586},{4,25,5}, +{4,25,5},{4,25,5},{4,15,8},{0,16,90},{0,16,90},{11,31,5658},{9,31,1836},{10,26,2372},{8,24,1692},{9,31,7116},{5,29,1644},{5,25,38},{5,20,2348},{0,26,6379},{0,21,2028},{14,31,2216},{12,31,16},{13,25,122},{11,24,331},{27,1,5419},{2,31,1584},{6,24,27},{0,21,1832},{27,14,5419},{0,21,1832},{9,31,1755},{9,31,1755},{9,31,1755},{9,22,1590},{6,31,1260},{5,25,29},{5,25,29}, +{5,17,117},{0,22,1459},{0,18,38},{12,30,1},{12,30,1},{12,30,1},{12,21,1},{22,1,1152},{6,24,2},{6,24,2},{0,18,2},{31,7,1152},{0,18,2},{31,2,1568},{11,31,13},{14,25,13},{4,25,10},{31,2,1568},{30,17,1568},{4,25,10},{0,21,1576},{30,17,1568},{0,21,1576},{9,0,1586},{9,0,1586},{9,0,1586},{9,0,1586},{5,26,5},{5,26,5},{5,26,5},{5,16,8},{0,18,37}, +{0,18,37},{12,31,6036},{11,31,2033},{11,27,2352},{10,25,1676},{11,31,7423},{6,30,1644},{6,26,38},{6,21,2348},{0,28,6109},{0,22,1794},{15,31,2371},{13,31,50},{14,26,117},{12,25,313},{29,0,5419},{5,31,1586},{6,26,29},{0,22,1730},{30,14,5419},{0,22,1730},{10,31,1865},{10,31,1865},{10,31,1865},{10,23,1585},{7,31,1339},{7,25,29},{7,25,29},{6,18,122},{0,23,1345},{0,19,16},{13,31,1}, +{13,31,1},{13,31,1},{13,22,1},{24,0,1152},{7,25,4},{7,25,4},{2,19,1},{24,12,1152},{2,19,1},{29,9,1568},{14,31,41},{15,26,13},{5,26,4},{29,9,1568},{27,20,1568},{5,26,4},{0,22,1586},{27,20,1568},{0,22,1586},{10,0,1576},{10,0,1576},{10,0,1576},{10,0,1576},{6,28,10},{6,28,10},{6,28,10},{6,17,10},{0,20,13},{0,20,13},{13,31,6450},{12,31,2268},{12,28,2372}, +{11,26,1676},{12,31,7676},{7,31,1644},{7,27,38},{7,22,2348},{0,30,5924},{0,23,1695},{17,31,2536},{15,31,139},{15,27,117},{13,26,313},{30,1,5419},{7,31,1635},{7,27,29},{0,23,1686},{31,15,5419},{0,23,1686},{11,31,1937},{11,31,1937},{11,31,1937},{11,24,1580},{9,31,1420},{7,27,34},{7,27,34},{7,19,122},{0,25,1234},{1,20,17},{14,31,10},{14,31,10},{14,31,10},{14,23,1},{25,1,1152}, +{8,26,1},{8,26,1},{2,20,2},{27,12,1152},{2,20,2},{31,8,1568},{15,31,90},{16,27,8},{6,27,4},{31,8,1568},{30,20,1568},{6,27,4},{0,23,1586},{30,20,1568},{0,23,1586},{11,0,1576},{11,0,1576},{11,0,1576},{11,0,1576},{7,28,10},{7,28,10},{7,28,10},{7,18,10},{0,21,10},{0,21,10},{15,31,6772},{13,31,2595},{13,29,2372},{12,27,1703},{13,31,7985},{8,31,1725},{8,28,38}, +{7,23,2372},{0,31,5773},{0,24,1644},{18,31,2722},{16,31,261},{16,28,122},{14,27,313},{31,2,5419},{8,31,1721},{8,28,34},{0,24,1640},{30,17,5419},{0,24,1640},{12,31,2027},{12,31,2027},{12,31,2027},{12,25,1590},{10,31,1510},{8,28,29},{8,28,29},{8,20,117},{0,27,1188},{2,21,17},{15,31,26},{15,31,26},{15,31,26},{15,24,2},{27,0,1152},{9,27,1},{9,27,1},{3,21,2},{30,12,1152}, +{3,21,2},{31,11,1568},{17,31,180},{17,28,13},{7,28,10},{31,11,1568},{31,21,1568},{7,28,10},{0,24,1576},{31,21,1568},{0,24,1576},{12,0,1586},{12,0,1586},{12,0,1586},{12,0,1586},{8,29,5},{8,29,5},{8,29,5},{8,19,8},{1,22,10},{1,22,10},{16,31,7154},{14,31,2955},{14,30,2372},{12,28,1692},{14,31,8348},{10,31,1895},{9,29,38},{9,24,2348},{1,31,5956},{1,25,1644},{19,31,2866}, +{17,31,468},{17,29,122},{15,28,331},{31,5,5419},{10,31,1859},{10,28,27},{0,25,1601},{31,18,5419},{0,25,1601},{13,31,2162},{13,31,2162},{13,31,2162},{13,26,1590},{11,31,1590},{9,29,29},{9,29,29},{9,21,117},{0,28,1161},{3,22,17},{16,31,49},{16,31,49},{16,31,49},{16,25,1},{28,1,1152},{10,28,2},{10,28,2},{4,22,2},{31,13,1152},{4,22,2},{31,14,1568},{19,31,277},{18,29,13}, +{8,29,10},{31,14,1568},{30,23,1568},{8,29,10},{0,25,1576},{30,23,1568},{0,25,1576},{13,0,1586},{13,0,1586},{13,0,1586},{13,0,1586},{9,30,5},{9,30,5},{9,30,5},{9,20,8},{2,23,10},{2,23,10},{17,31,7636},{15,31,3408},{15,31,2352},{14,29,1676},{16,31,8673},{11,31,2187},{10,30,38},{10,25,2348},{3,31,6235},{2,26,1644},{20,31,3112},{19,31,754},{18,30,117},{16,29,313},{31,8,5419}, +{12,31,2060},{10,30,29},{0,26,1587},{30,20,5419},{0,26,1587},{15,31,2252},{15,31,2252},{15,31,2252},{14,27,1585},{12,31,1740},{11,29,29},{11,29,29},{10,22,122},{0,30,1163},{4,23,16},{18,31,85},{18,31,85},{18,31,85},{17,26,1},{28,4,1152},{11,29,4},{11,29,4},{6,23,1},{28,16,1152},{6,23,1},{29,21,1568},{20,31,436},{19,30,13},{9,30,4},{29,21,1568},{31,24,1568},{9,30,4}, +{0,26,1586},{31,24,1568},{0,26,1586},{14,0,1576},{14,0,1576},{14,0,1576},{14,0,1576},{10,31,13},{10,31,13},{10,31,13},{10,21,10},{3,24,10},{3,24,10},{18,31,8122},{16,31,3907},{16,31,2390},{15,30,1676},{17,31,9036},{12,31,2576},{11,31,38},{11,26,2348},{6,31,6555},{3,27,1644},{22,31,3392},{20,31,1044},{19,31,117},{17,30,313},{31,11,5419},{15,31,2284},{11,31,29},{0,27,1587},{31,21,5419}, +{0,27,1587},{16,31,2386},{16,31,2386},{16,31,2386},{15,28,1580},{14,31,1924},{11,31,34},{11,31,34},{11,23,122},{1,31,1163},{5,24,17},{19,31,113},{19,31,113},{19,31,113},{18,27,1},{29,5,1152},{12,30,1},{12,30,1},{6,24,2},{31,16,1152},{6,24,2},{31,20,1568},{22,31,593},{20,31,8},{10,31,4},{31,20,1568},{30,26,1568},{10,31,4},{0,27,1586},{30,26,1568},{0,27,1586},{15,0,1576}, +{15,0,1576},{15,0,1576},{15,0,1576},{11,31,25},{11,31,25},{11,31,25},{11,22,10},{4,25,10},{4,25,10},{19,31,7638},{17,31,4060},{17,31,2539},{16,30,1659},{18,31,8553},{14,31,2430},{13,31,37},{11,27,1940},{7,31,6120},{4,28,1320},{23,31,2996},{20,31,1064},{20,31,164},{19,30,186},{29,17,4803},{16,31,2018},{13,31,1},{1,28,1253},{27,24,4803},{1,28,1253},{17,31,2539},{17,31,2539},{17,31,2539}, +{16,29,1590},{15,31,2028},{13,31,37},{13,31,37},{12,24,117},{3,31,1170},{6,25,17},{20,31,164},{20,31,164},{20,31,164},{19,28,2},{31,4,1152},{13,31,1},{13,31,1},{7,25,2},{30,18,1152},{7,25,2},{31,22,1250},{24,31,505},{22,31,0},{13,31,0},{31,22,1250},{30,27,1250},{13,31,0},{0,28,1252},{30,27,1250},{0,28,1252},{16,0,1586},{16,0,1586},{16,0,1586},{16,0,1586},{13,31,37}, +{13,31,37},{13,31,37},{12,23,8},{5,26,10},{5,26,10},{20,31,7060},{19,31,3955},{18,31,2710},{17,31,1595},{19,31,7717},{15,31,2140},{14,31,77},{13,28,1480},{8,31,5539},{6,28,925},{23,31,2516},{22,31,945},{21,31,233},{20,30,100},{31,15,4056},{18,31,1656},{15,31,8},{4,28,900},{31,23,4056},{4,28,900},{18,31,2710},{18,31,2710},{18,31,2710},{17,30,1590},{16,31,2193},{14,31,77},{14,31,77}, +{13,25,117},{5,31,1233},{7,26,17},{21,31,233},{21,31,233},{21,31,233},{20,29,1},{31,7,1152},{15,31,8},{15,31,8},{8,26,2},{31,19,1152},{8,26,2},{31,23,884},{25,31,370},{23,31,4},{16,31,1},{31,23,884},{31,27,884},{16,31,1},{0,28,900},{31,27,884},{0,28,900},{17,0,1586},{17,0,1586},{17,0,1586},{17,0,1586},{14,31,52},{14,31,52},{14,31,52},{13,24,8},{6,27,10}, +{6,27,10},{21,31,6535},{20,31,3919},{19,31,2857},{18,31,1585},{20,31,6979},{16,31,1942},{15,31,195},{14,28,990},{11,31,4914},{7,29,562},{24,31,2045},{23,31,830},{22,31,338},{21,31,26},{29,21,3318},{19,31,1314},{17,31,52},{5,29,546},{31,24,3318},{5,29,546},{19,31,2857},{19,31,2857},{19,31,2857},{18,31,1585},{17,31,2436},{15,31,195},{15,31,195},{14,26,122},{7,31,1339},{8,27,16},{22,31,338}, +{22,31,338},{22,31,338},{21,30,1},{28,16,1152},{17,31,52},{17,31,52},{10,27,1},{24,24,1152},{10,27,1},{31,25,545},{26,31,221},{25,31,0},{19,31,0},{31,25,545},{31,28,545},{19,31,0},{0,29,545},{31,28,545},{0,29,545},{18,0,1576},{18,0,1576},{18,0,1576},{18,0,1576},{15,31,74},{15,31,74},{15,31,74},{14,25,10},{7,28,10},{7,28,10},{22,31,6151},{20,31,3935},{20,31,3035}, +{19,31,1640},{21,31,6458},{18,31,1902},{16,31,373},{15,29,670},{12,31,4499},{8,29,347},{25,31,1729},{24,31,786},{23,31,410},{22,31,1},{31,19,2753},{20,31,1094},{19,31,113},{8,29,338},{31,25,2753},{8,29,338},{20,31,3035},{20,31,3035},{20,31,3035},{19,31,1640},{19,31,2630},{16,31,373},{16,31,373},{15,27,122},{10,31,1483},{9,28,17},{23,31,410},{23,31,410},{23,31,410},{22,31,1},{29,17,1152}, +{19,31,113},{19,31,113},{10,28,2},{27,24,1152},{10,28,2},{31,26,317},{27,31,130},{26,31,9},{22,31,0},{31,26,317},{30,29,317},{22,31,0},{0,29,337},{30,29,317},{0,29,337},{19,0,1576},{19,0,1576},{19,0,1576},{19,0,1576},{16,31,117},{16,31,117},{16,31,117},{15,26,10},{8,29,10},{8,29,10},{23,31,5691},{22,31,4004},{21,31,3254},{20,31,1755},{22,31,6023},{19,31,1830},{18,31,606}, +{16,29,430},{14,31,4162},{9,30,155},{26,31,1481},{25,31,801},{24,31,505},{23,31,26},{29,25,2273},{22,31,914},{20,31,194},{9,30,146},{27,28,2273},{9,30,146},{21,31,3254},{21,31,3254},{21,31,3254},{20,31,1755},{20,31,2835},{18,31,606},{18,31,606},{16,28,117},{11,31,1665},{10,29,17},{24,31,505},{24,31,505},{24,31,505},{23,31,26},{31,16,1152},{20,31,194},{20,31,194},{11,29,2},{30,24,1152}, +{11,29,2},{31,28,145},{28,31,65},{28,31,1},{25,31,0},{31,28,145},{30,30,145},{25,31,0},{0,30,145},{30,30,145},{0,30,145},{20,0,1586},{20,0,1586},{20,0,1586},{20,0,1586},{17,31,180},{17,31,180},{17,31,180},{16,27,8},{9,30,10},{9,30,10},{24,31,5421},{23,31,3999},{22,31,3491},{21,31,1947},{23,31,5539},{20,31,1879},{19,31,853},{17,30,238},{16,31,3922},{11,30,81},{27,31,1229}, +{26,31,813},{26,31,617},{24,31,100},{31,23,1878},{23,31,822},{22,31,305},{12,30,66},{31,27,1878},{12,30,66},{22,31,3491},{22,31,3491},{22,31,3491},{21,31,1947},{21,31,3081},{19,31,853},{19,31,853},{17,29,117},{14,31,1905},{11,30,17},{26,31,617},{26,31,617},{26,31,617},{24,31,100},{31,19,1152},{22,31,305},{22,31,305},{12,30,2},{31,25,1152},{12,30,2},{31,29,45},{30,31,18},{29,31,4}, +{28,31,1},{31,29,45},{31,30,45},{28,31,1},{0,30,65},{31,30,45},{0,30,65},{21,0,1586},{21,0,1586},{21,0,1586},{21,0,1586},{18,31,261},{18,31,261},{18,31,261},{17,28,8},{10,31,10},{10,31,10},{24,31,5178},{24,31,4095},{23,31,3704},{22,31,2201},{24,31,5197},{21,31,2101},{20,31,1240},{18,31,153},{18,31,3760},{12,31,16},{28,31,1088},{27,31,830},{27,31,709},{26,31,245},{29,29,1536}, +{26,31,792},{24,31,461},{14,31,1},{31,28,1536},{14,31,1},{23,31,3704},{23,31,3704},{23,31,3704},{22,31,2201},{23,31,3396},{20,31,1240},{20,31,1240},{18,30,122},{15,31,2208},{12,31,16},{27,31,709},{27,31,709},{27,31,709},{26,31,245},{28,28,1152},{24,31,461},{24,31,461},{14,31,1},{28,28,1152},{14,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0}, +{0,31,0},{31,31,0},{0,31,0},{22,0,1576},{22,0,1576},{22,0,1576},{22,0,1576},{20,31,340},{20,31,340},{20,31,340},{18,29,10},{12,31,16},{12,31,16},{25,31,4468},{24,31,3615},{24,31,3254},{23,31,2060},{24,31,4413},{22,31,1834},{21,31,1205},{19,31,58},{19,31,3127},{14,31,53},{28,31,768},{28,31,576},{28,31,512},{27,31,170},{31,26,1068},{26,31,536},{25,31,338},{16,31,1},{30,29,1068}, +{16,31,1},{24,31,3254},{24,31,3254},{24,31,3254},{23,31,2060},{23,31,2852},{21,31,1205},{21,31,1205},{19,31,58},{16,31,1878},{14,31,53},{28,31,512},{28,31,512},{28,31,512},{27,31,170},{31,24,802},{25,31,338},{25,31,338},{16,31,1},{30,28,802},{16,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{23,0,1576}, +{23,0,1576},{23,0,1576},{23,0,1576},{21,31,421},{21,31,421},{21,31,421},{19,30,10},{14,31,53},{14,31,53},{26,31,3858},{25,31,3188},{25,31,2899},{24,31,1947},{25,31,3700},{23,31,1596},{23,31,1112},{20,31,8},{20,31,2588},{16,31,117},{29,31,498},{28,31,384},{28,31,320},{27,31,122},{31,27,683},{27,31,342},{26,31,212},{19,31,1},{31,29,683},{19,31,1},{25,31,2899},{25,31,2899},{25,31,2899}, +{24,31,1947},{24,31,2441},{23,31,1112},{23,31,1112},{20,31,8},{18,31,1568},{16,31,117},{28,31,320},{28,31,320},{28,31,320},{27,31,122},{29,29,512},{26,31,212},{26,31,212},{19,31,1},{31,28,512},{19,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{24,0,1586},{24,0,1586},{24,0,1586},{24,0,1586},{22,31,520}, +{22,31,520},{22,31,520},{20,31,8},{16,31,117},{16,31,117},{27,31,3258},{26,31,2790},{26,31,2594},{25,31,1875},{26,31,3105},{24,31,1447},{23,31,1080},{21,31,20},{22,31,2151},{18,31,208},{29,31,306},{29,31,221},{29,31,185},{28,31,64},{31,28,384},{28,31,192},{27,31,125},{22,31,1},{30,30,384},{22,31,1},{26,31,2594},{26,31,2594},{26,31,2594},{25,31,1875},{25,31,2131},{23,31,1080},{23,31,1080}, +{21,31,20},{20,31,1336},{18,31,208},{29,31,185},{29,31,185},{29,31,185},{28,31,64},{31,27,290},{27,31,125},{27,31,125},{22,31,1},{31,29,290},{22,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{25,0,1586},{25,0,1586},{25,0,1586},{25,0,1586},{23,31,596},{23,31,596},{23,31,596},{21,31,20},{18,31,208}, +{18,31,208},{0,25,2669},{0,18,320},{0,13,5},{0,11,985},{0,17,5885},{0,11,3745},{0,10,1746},{0,7,4421},{0,8,6385},{0,7,4782},{0,25,2669},{0,18,320},{0,13,5},{0,11,985},{8,1,5885},{0,11,3745},{0,10,1746},{0,7,4421},{17,0,5885},{0,7,4421},{0,12,0},{0,12,0},{0,12,0},{0,6,1},{0,6,545},{0,5,205},{0,5,205},{0,3,337},{0,3,609},{0,3,401},{0,12,0}, +{0,12,0},{0,12,0},{0,6,1},{3,0,545},{0,5,205},{0,5,205},{0,3,337},{6,0,545},{0,3,337},{13,0,2669},{0,18,320},{0,13,5},{0,11,985},{13,0,2669},{25,0,2669},{0,11,985},{0,8,2689},{25,0,2669},{0,8,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,28,2665},{0,20,212},{0,14,10}, +{0,12,850},{0,19,6669},{0,13,3974},{0,11,1837},{0,8,4865},{0,9,7266},{0,7,5310},{0,28,2665},{0,20,212},{0,14,10},{0,12,850},{9,1,6669},{0,13,3974},{0,11,1837},{0,8,4865},{19,0,6669},{0,8,4865},{0,15,0},{0,15,0},{0,15,0},{0,7,9},{0,7,845},{0,6,337},{0,6,337},{0,3,545},{0,3,945},{0,3,609},{0,15,0},{0,15,0},{0,15,0},{0,7,9},{3,2,841}, +{0,6,337},{0,6,337},{0,3,545},{6,1,841},{0,3,545},{12,4,2665},{0,20,212},{1,14,5},{0,12,850},{12,4,2665},{28,0,2665},{0,12,850},{0,9,2689},{28,0,2665},{0,9,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,31,2665},{0,21,113},{0,15,65},{0,13,709},{0,21,7538},{0,14,4289},{0,12,1907}, +{0,9,5330},{0,10,8294},{0,8,5845},{0,31,2665},{0,21,113},{0,15,65},{0,13,709},{10,1,7538},{0,14,4289},{0,12,1907},{0,9,5330},{21,0,7538},{0,9,5330},{0,18,0},{0,18,0},{0,18,0},{0,9,0},{0,9,1201},{0,7,482},{0,7,482},{0,4,740},{0,4,1334},{0,4,861},{0,18,0},{0,18,0},{0,18,0},{0,9,0},{4,1,1201},{0,7,482},{0,7,482},{0,4,740},{9,0,1201}, +{0,4,740},{13,5,2665},{0,21,113},{2,15,5},{0,13,709},{13,5,2665},{31,0,2665},{0,13,709},{0,10,2689},{31,0,2665},{0,10,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,31,2809},{0,23,52},{0,16,173},{0,14,586},{0,23,8494},{0,15,4610},{0,13,1950},{0,9,5826},{0,11,9409},{0,9,6402},{1,31,2753}, +{0,23,52},{1,16,132},{0,14,586},{11,1,8493},{0,15,4610},{0,13,1950},{0,9,5826},{19,2,8493},{0,9,5826},{0,21,0},{0,21,0},{0,21,0},{0,10,9},{0,10,1629},{0,9,640},{0,9,640},{0,5,985},{0,5,1798},{0,5,1154},{0,21,0},{0,21,0},{0,21,0},{0,10,9},{3,5,1625},{0,9,640},{0,9,640},{0,5,985},{7,2,1625},{0,5,985},{17,0,2665},{0,23,52},{2,16,13}, +{0,14,586},{17,0,2665},{30,2,2665},{0,14,586},{0,11,2689},{30,2,2665},{0,11,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,31,3105},{0,25,8},{1,17,325},{0,15,512},{0,25,9669},{0,17,4961},{0,14,2120},{0,10,6421},{0,12,10774},{0,10,7150},{2,31,3033},{0,25,8},{1,17,261},{0,15,512},{12,1,9669}, +{0,17,4961},{0,14,2120},{0,10,6421},{25,0,9669},{0,10,6421},{0,24,0},{0,24,0},{0,24,0},{0,12,0},{0,12,2178},{0,9,865},{0,9,865},{0,6,1313},{0,5,2419},{0,5,1523},{0,24,0},{0,24,0},{0,24,0},{0,12,0},{4,4,2178},{0,9,865},{0,9,865},{0,6,1313},{12,0,2178},{0,6,1313},{19,0,2669},{0,25,8},{4,17,5},{0,15,512},{19,0,2669},{31,3,2669},{0,15,512}, +{0,12,2689},{31,3,2669},{0,12,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,31,3465},{0,27,65},{1,19,434},{0,17,474},{0,28,9670},{0,18,4658},{0,16,1717},{0,11,6209},{0,13,10979},{0,11,7109},{3,31,3101},{1,26,8},{2,18,261},{0,17,474},{14,0,9669},{0,18,4658},{0,16,1717},{0,11,6209},{26,1,9669}, +{0,11,6209},{1,25,64},{1,25,64},{1,25,64},{1,13,64},{0,15,2178},{0,11,680},{0,11,680},{0,7,1189},{0,7,2557},{0,6,1457},{1,25,0},{1,25,0},{1,25,0},{1,13,0},{5,5,2178},{0,11,680},{0,11,680},{0,7,1189},{15,0,2178},{0,7,1189},{20,0,2665},{0,27,1},{5,18,5},{0,17,410},{20,0,2665},{24,8,2665},{0,17,410},{0,13,2689},{24,8,2665},{0,13,2689},{0,0,64}, +{0,0,64},{0,0,64},{0,0,64},{0,3,0},{0,3,0},{0,3,0},{0,2,4},{0,1,13},{0,1,13},{3,31,3917},{1,28,129},{2,20,645},{1,18,538},{0,31,9670},{0,20,4330},{0,17,1246},{0,12,5925},{0,14,11321},{0,12,7014},{4,31,3218},{2,27,8},{3,19,261},{1,18,474},{15,1,9669},{0,20,4330},{0,17,1246},{0,12,5925},{27,2,9669},{0,12,5925},{1,28,128},{1,28,128},{1,28,128}, +{1,15,132},{0,18,2178},{0,13,482},{0,13,482},{0,8,1040},{0,8,2712},{0,7,1470},{2,26,0},{2,26,0},{2,26,0},{2,14,0},{9,0,2178},{0,13,482},{0,13,482},{0,8,1040},{18,0,2178},{0,8,1040},{21,1,2665},{1,28,1},{6,19,5},{0,18,305},{21,1,2665},{27,8,2665},{0,18,305},{0,14,2689},{27,8,2665},{0,14,2689},{1,0,128},{1,0,128},{1,0,128},{1,0,128},{0,6,0}, +{0,6,0},{0,6,0},{0,3,0},{0,2,61},{0,2,61},{3,31,4541},{2,29,321},{2,21,904},{1,19,625},{1,31,9749},{0,21,4018},{0,18,914},{0,14,5633},{0,16,11661},{0,13,6859},{5,31,3374},{3,28,10},{4,20,254},{2,19,474},{17,0,9670},{0,21,4018},{0,18,914},{0,14,5633},{30,2,9670},{0,14,5633},{2,29,320},{2,29,320},{2,29,320},{1,16,320},{0,21,2178},{0,15,353},{0,15,353}, +{0,9,881},{0,9,2882},{0,9,1457},{3,27,0},{3,27,0},{3,27,0},{3,15,0},{10,1,2178},{0,15,353},{0,15,353},{0,9,881},{21,0,2178},{0,9,881},{23,0,2665},{2,29,1},{6,20,13},{0,19,245},{23,0,2665},{30,8,2665},{0,19,245},{0,15,2689},{30,8,2665},{0,15,2689},{1,0,320},{1,0,320},{1,0,320},{1,0,320},{0,9,0},{0,9,0},{0,9,0},{0,4,4},{0,4,125}, +{0,4,125},{4,31,5378},{2,31,570},{3,22,1267},{2,20,850},{2,31,10045},{0,23,3745},{0,19,642},{0,14,5354},{0,17,11993},{0,14,6798},{7,31,3553},{4,29,8},{5,21,261},{3,20,491},{18,1,9669},{0,23,3745},{0,19,642},{0,14,5354},{31,3,9669},{0,14,5354},{2,31,561},{2,31,561},{2,31,561},{2,17,546},{0,24,2178},{0,17,205},{0,17,205},{0,10,730},{0,11,3150},{0,9,1457},{4,28,0}, +{4,28,0},{4,28,0},{4,16,0},{12,0,2178},{0,17,205},{0,17,205},{0,10,730},{24,0,2178},{0,10,730},{25,0,2669},{3,30,1},{8,21,5},{0,20,170},{25,0,2669},{31,9,2669},{0,20,170},{0,16,2689},{31,9,2669},{0,16,2689},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,12,0},{0,12,0},{0,12,0},{0,6,1},{0,5,205},{0,5,205},{5,31,6330},{3,31,905},{4,23,1718}, +{2,21,1099},{3,31,10453},{0,25,3478},{0,21,369},{0,16,5138},{0,18,12455},{0,15,6867},{8,31,3710},{5,30,8},{6,22,261},{4,21,474},{19,2,9669},{0,25,3478},{0,21,369},{0,16,5138},{30,5,9669},{0,16,5138},{3,31,901},{3,31,901},{3,31,901},{3,18,866},{0,27,2178},{0,19,130},{0,19,130},{0,11,650},{0,12,3395},{0,10,1523},{5,29,0},{5,29,0},{5,29,0},{5,17,0},{13,1,2178}, +{0,19,130},{0,19,130},{0,11,650},{27,0,2178},{0,11,650},{24,4,2665},{4,31,1},{9,22,5},{0,21,113},{24,4,2665},{28,12,2665},{0,21,113},{0,17,2689},{28,12,2665},{0,17,2689},{3,0,865},{3,0,865},{3,0,865},{3,0,865},{0,15,0},{0,15,0},{0,15,0},{0,7,9},{0,6,337},{0,6,337},{6,31,7446},{4,31,1458},{4,24,2174},{3,22,1419},{3,31,11045},{0,27,3314},{0,22,195}, +{0,17,4865},{0,20,12855},{0,16,6882},{9,31,3902},{6,31,8},{7,23,261},{5,22,474},{19,5,9669},{0,27,3314},{0,22,195},{0,17,4865},{31,6,9669},{0,17,4865},{3,31,1397},{3,31,1397},{3,31,1397},{3,19,1210},{0,30,2178},{0,20,61},{0,20,61},{0,12,545},{0,13,3645},{0,12,1634},{6,30,0},{6,30,0},{6,30,0},{6,18,0},{15,0,2178},{0,20,61},{0,20,61},{0,12,545},{30,0,2178}, +{0,12,545},{25,5,2665},{6,31,8},{10,23,5},{0,22,74},{25,5,2665},{31,12,2665},{0,22,74},{0,18,2689},{31,12,2665},{0,18,2689},{3,0,1201},{3,0,1201},{3,0,1201},{3,0,1201},{0,18,0},{0,18,0},{0,18,0},{0,9,0},{0,7,482},{0,7,482},{7,31,8578},{4,31,2146},{5,25,2766},{3,23,1835},{4,31,11766},{0,28,3125},{0,23,94},{0,18,4610},{0,21,13238},{0,17,6837},{10,31,4130}, +{7,31,49},{8,24,254},{6,23,474},{23,0,9670},{0,28,3125},{0,23,94},{0,18,4610},{30,8,9670},{0,18,4610},{4,31,1921},{4,31,1921},{4,31,1921},{3,21,1665},{0,31,2228},{0,22,18},{0,22,18},{0,14,425},{0,15,3987},{0,13,1677},{7,31,0},{7,31,0},{7,31,0},{7,19,0},{16,1,2178},{0,22,18},{0,22,18},{0,14,425},{31,1,2178},{0,14,425},{29,0,2665},{7,31,49},{10,24,13}, +{0,23,58},{29,0,2665},{30,14,2665},{0,23,58},{0,19,2689},{30,14,2665},{0,19,2689},{3,0,1665},{3,0,1665},{3,0,1665},{3,0,1665},{0,21,0},{0,21,0},{0,21,0},{0,10,9},{0,9,640},{0,9,640},{7,31,10135},{5,31,3190},{5,26,3543},{4,24,2348},{5,31,12846},{0,30,2961},{0,25,30},{0,19,4421},{0,23,13846},{0,18,6930},{11,31,4345},{8,31,178},{9,25,261},{7,24,491},{24,1,9669}, +{0,30,2961},{0,25,30},{0,19,4421},{31,9,9669},{0,19,4421},{5,31,2706},{5,31,2706},{5,31,2706},{4,22,2179},{1,31,2404},{0,24,0},{0,24,0},{0,15,337},{0,16,4356},{0,14,1833},{8,31,9},{8,31,9},{8,31,9},{8,20,0},{16,4,2178},{0,24,0},{0,24,0},{0,15,337},{28,4,2178},{0,15,337},{31,0,2669},{10,31,113},{12,25,5},{0,25,26},{31,0,2669},{31,15,2669},{0,25,26}, +{0,20,2689},{31,15,2669},{0,20,2689},{4,0,2178},{4,0,2178},{4,0,2178},{4,0,2178},{0,24,0},{0,24,0},{0,24,0},{0,12,0},{0,9,865},{0,9,865},{8,31,11466},{6,31,4187},{6,27,4166},{4,25,2818},{6,31,13898},{0,31,2871},{0,26,15},{0,20,4226},{0,24,14214},{0,19,7006},{12,31,4590},{10,31,321},{10,26,261},{8,25,474},{26,0,9669},{0,31,2870},{0,26,14},{0,20,4225},{30,11,9669}, +{0,20,4225},{6,31,3458},{6,31,3458},{6,31,3458},{5,23,2690},{2,31,2691},{0,26,14},{0,26,14},{0,16,261},{0,17,4595},{0,15,1953},{9,31,36},{9,31,36},{9,31,36},{9,21,0},{17,5,2178},{1,25,0},{1,25,0},{0,16,260},{31,4,2178},{0,16,260},{28,8,2665},{11,31,194},{13,26,5},{0,26,5},{28,8,2665},{24,20,2665},{0,26,5},{0,21,2689},{24,20,2665},{0,21,2689},{5,0,2689}, +{5,0,2689},{5,0,2689},{5,0,2689},{0,27,1},{0,27,1},{0,27,1},{0,14,5},{0,11,1037},{0,11,1037},{9,31,12054},{7,31,4578},{7,28,4118},{5,26,2818},{7,31,14214},{1,31,3042},{1,27,15},{0,21,4099},{0,25,13683},{0,21,6322},{14,31,4858},{11,31,514},{11,27,261},{9,26,474},{27,1,9669},{2,31,3014},{1,27,14},{0,21,4018},{27,14,9669},{0,21,4018},{7,31,3554},{7,31,3554},{7,31,3554}, +{6,24,2689},{3,31,2795},{1,27,14},{1,27,14},{1,17,261},{0,19,4269},{0,16,1517},{11,31,73},{11,31,73},{11,31,73},{10,22,0},{21,0,2178},{2,26,0},{2,26,0},{0,17,185},{30,6,2178},{0,17,185},{29,9,2665},{13,31,320},{14,27,5},{0,27,1},{29,9,2665},{27,20,2665},{0,27,1},{0,22,2689},{27,20,2665},{0,22,2689},{6,0,2689},{6,0,2689},{6,0,2689},{6,0,2689},{1,28,1}, +{1,28,1},{1,28,1},{1,15,5},{0,13,797},{0,13,797},{11,31,12506},{8,31,5075},{8,29,4166},{6,27,2818},{8,31,14651},{3,31,3255},{2,28,23},{1,22,4099},{0,27,13238},{0,21,5650},{15,31,5054},{12,31,782},{12,28,254},{10,27,474},{29,0,9670},{3,31,3206},{2,28,22},{0,22,3829},{30,14,9670},{0,22,3829},{8,31,3706},{8,31,3706},{8,31,3706},{7,25,2689},{4,31,2946},{2,28,19},{2,28,19}, +{2,18,261},{0,21,3906},{0,17,1106},{12,31,106},{12,31,106},{12,31,106},{11,23,0},{22,1,2178},{3,27,0},{3,27,0},{0,18,128},{31,7,2178},{0,18,128},{31,8,2665},{15,31,445},{14,28,13},{1,28,4},{31,8,2665},{30,20,2665},{1,28,4},{0,23,2689},{30,20,2665},{0,23,2689},{7,0,2689},{7,0,2689},{7,0,2689},{7,0,2689},{2,29,1},{2,29,1},{2,29,1},{2,15,10},{0,14,637}, +{0,14,637},{12,31,13094},{10,31,5782},{9,30,4166},{7,28,2838},{10,31,15213},{4,31,3618},{3,29,25},{2,23,4101},{0,29,12686},{0,23,5075},{16,31,5378},{14,31,1172},{13,29,261},{11,28,491},{30,1,9669},{6,31,3469},{3,29,21},{0,23,3706},{31,15,9669},{0,23,3706},{9,31,3890},{9,31,3890},{9,31,3890},{8,26,2690},{6,31,3157},{3,29,24},{3,29,24},{3,19,254},{0,23,3619},{0,19,782},{13,31,145}, +{13,31,145},{13,31,145},{12,24,0},{24,0,2178},{4,28,0},{4,28,0},{0,19,106},{24,12,2178},{0,19,106},{31,11,2669},{16,31,640},{16,29,5},{2,29,2},{31,11,2669},{31,21,2669},{2,29,2},{0,24,2689},{31,21,2669},{0,24,2689},{8,0,2689},{8,0,2689},{8,0,2689},{8,0,2689},{3,30,5},{3,30,5},{3,30,5},{3,17,8},{0,17,436},{0,17,436},{13,31,13718},{11,31,6325},{10,31,4166}, +{8,29,2818},{11,31,15565},{6,31,4094},{4,30,15},{3,24,4118},{0,31,12355},{0,24,4578},{17,31,5738},{15,31,1517},{14,30,261},{12,29,474},{31,2,9669},{7,31,3761},{4,30,14},{0,24,3554},{30,17,9669},{0,24,3554},{10,31,4085},{10,31,4085},{10,31,4085},{9,27,2690},{7,31,3285},{4,30,14},{4,30,14},{4,20,261},{0,24,3330},{0,20,514},{14,31,208},{14,31,208},{14,31,208},{13,25,0},{25,1,2178}, +{5,29,0},{5,29,0},{0,21,64},{27,12,2178},{0,21,64},{28,20,2665},{18,31,829},{17,30,5},{3,30,2},{28,20,2665},{28,24,2665},{3,30,2},{0,25,2689},{28,24,2665},{0,25,2689},{9,0,2689},{9,0,2689},{9,0,2689},{9,0,2689},{4,31,1},{4,31,1},{4,31,1},{4,18,5},{0,18,306},{0,18,306},{14,31,14378},{12,31,7006},{11,31,4226},{9,30,2818},{12,31,16054},{7,31,4578},{5,31,15}, +{4,25,4099},{0,31,12051},{0,25,4089},{19,31,5970},{16,31,1953},{15,31,261},{13,30,474},{31,5,9669},{10,31,4081},{5,31,14},{0,25,3413},{31,18,9669},{0,25,3413},{11,31,4225},{11,31,4225},{11,31,4225},{10,28,2689},{8,31,3476},{5,31,14},{5,31,14},{5,21,261},{0,26,3091},{0,21,289},{15,31,260},{15,31,260},{15,31,260},{14,26,0},{27,0,2178},{6,30,0},{6,30,0},{0,22,25},{30,12,2178}, +{0,22,25},{29,21,2665},{20,31,1037},{18,31,5},{4,31,1},{29,21,2665},{31,24,2665},{4,31,1},{0,26,2689},{31,24,2665},{0,26,2689},{10,0,2689},{10,0,2689},{10,0,2689},{10,0,2689},{5,31,10},{5,31,10},{5,31,10},{5,19,5},{0,20,194},{0,20,194},{15,31,13557},{13,31,7094},{12,31,4421},{10,31,2769},{13,31,15228},{8,31,4270},{6,31,46},{5,26,3476},{0,31,11020},{0,26,3108},{20,31,5400}, +{17,31,1931},{16,31,337},{15,30,320},{31,7,8712},{11,31,3630},{7,31,0},{0,26,2667},{31,19,8712},{0,26,2667},{12,31,4421},{12,31,4421},{12,31,4421},{11,29,2689},{9,31,3722},{6,31,46},{6,31,46},{6,22,261},{0,27,2882},{0,22,173},{16,31,337},{16,31,337},{16,31,337},{15,27,0},{28,1,2178},{7,31,0},{7,31,0},{0,23,9},{31,13,2178},{0,23,9},{31,19,2178},{22,31,881},{19,31,0}, +{7,31,0},{31,19,2178},{31,25,2178},{7,31,0},{0,27,2178},{31,25,2178},{0,27,2178},{11,0,2689},{11,0,2689},{11,0,2689},{11,0,2689},{6,31,37},{6,31,37},{6,31,37},{6,19,10},{0,22,109},{0,22,109},{16,31,12678},{14,31,7003},{13,31,4693},{12,31,2714},{15,31,14026},{10,31,3943},{8,31,94},{6,26,2766},{2,31,10074},{0,27,2146},{20,31,4698},{19,31,1746},{17,31,464},{16,30,164},{29,13,7578}, +{12,31,3090},{9,31,20},{0,27,1921},{31,20,7578},{0,27,1921},{13,31,4693},{13,31,4693},{13,31,4693},{12,30,2690},{11,31,3939},{8,31,94},{8,31,94},{7,23,254},{0,29,2650},{0,24,49},{17,31,464},{17,31,464},{17,31,464},{16,28,0},{28,4,2178},{9,31,20},{9,31,20},{0,24,0},{28,16,2178},{0,24,0},{31,21,1625},{23,31,653},{21,31,4},{10,31,1},{31,21,1625},{31,26,1625},{10,31,1}, +{0,27,1665},{31,26,1625},{0,27,1665},{12,0,2689},{12,0,2689},{12,0,2689},{12,0,2689},{8,31,58},{8,31,58},{8,31,58},{7,21,8},{0,24,49},{0,24,49},{17,31,12042},{15,31,6882},{15,31,4946},{13,31,2690},{16,31,13127},{11,31,3615},{9,31,229},{7,27,2174},{3,31,9313},{0,27,1458},{21,31,4150},{19,31,1634},{19,31,545},{17,30,89},{31,11,6661},{14,31,2654},{11,31,61},{0,28,1397},{31,21,6661}, +{0,28,1397},{15,31,4946},{15,31,4946},{15,31,4946},{13,31,2690},{12,31,4170},{9,31,229},{9,31,229},{8,24,261},{0,31,2520},{0,25,10},{19,31,545},{19,31,545},{19,31,545},{17,29,0},{29,5,2178},{11,31,61},{11,31,61},{1,25,0},{31,16,2178},{1,25,0},{31,22,1201},{24,31,482},{22,31,1},{13,31,1},{31,22,1201},{30,27,1201},{13,31,1},{0,28,1201},{30,27,1201},{0,28,1201},{13,0,2689}, +{13,0,2689},{13,0,2689},{13,0,2689},{9,31,85},{9,31,85},{9,31,85},{8,22,5},{0,25,10},{0,25,10},{18,31,11474},{16,31,6867},{15,31,5138},{14,31,2725},{16,31,12279},{12,31,3410},{10,31,419},{8,27,1718},{4,31,8678},{0,28,905},{23,31,3626},{20,31,1550},{20,31,650},{18,31,25},{29,17,5829},{15,31,2306},{12,31,130},{0,28,901},{27,24,5829},{0,28,901},{15,31,5138},{15,31,5138},{15,31,5138}, +{14,31,2725},{13,31,4452},{10,31,419},{10,31,419},{9,25,261},{0,31,2520},{1,26,10},{20,31,650},{20,31,650},{20,31,650},{18,30,0},{31,4,2178},{12,31,130},{12,31,130},{2,26,0},{30,18,2178},{2,26,0},{31,23,845},{25,31,353},{23,31,9},{16,31,0},{31,23,845},{31,27,845},{16,31,0},{0,28,865},{31,27,845},{0,28,865},{14,0,2689},{14,0,2689},{14,0,2689},{14,0,2689},{10,31,130}, +{10,31,130},{10,31,130},{9,23,5},{0,27,1},{0,27,1},{19,31,10774},{17,31,6962},{16,31,5378},{15,31,2810},{17,31,11598},{12,31,3346},{12,31,642},{9,28,1222},{6,31,8113},{0,29,570},{23,31,3146},{22,31,1539},{21,31,773},{19,31,0},{31,15,5082},{16,31,2034},{14,31,221},{0,29,554},{31,23,5082},{0,29,554},{16,31,5378},{16,31,5378},{16,31,5378},{15,31,2810},{15,31,4746},{12,31,642},{12,31,642}, +{10,26,261},{2,31,2714},{2,27,10},{21,31,773},{21,31,773},{21,31,773},{19,31,0},{31,7,2178},{14,31,221},{14,31,221},{3,27,0},{31,19,2178},{3,27,0},{31,25,545},{26,31,221},{25,31,0},{19,31,0},{31,25,545},{31,28,545},{19,31,0},{0,29,545},{31,28,545},{0,29,545},{15,0,2689},{15,0,2689},{15,0,2689},{15,0,2689},{11,31,170},{11,31,170},{11,31,170},{10,23,10},{1,28,1}, +{1,28,1},{20,31,10225},{18,31,7025},{18,31,5729},{16,31,2978},{19,31,10792},{14,31,3283},{13,31,982},{10,29,861},{8,31,7588},{2,29,325},{24,31,2729},{23,31,1460},{22,31,932},{20,31,36},{29,21,4344},{19,31,1746},{16,31,353},{2,29,321},{31,24,4344},{2,29,321},{18,31,5729},{18,31,5729},{18,31,5729},{16,31,2978},{16,31,5028},{13,31,982},{13,31,982},{11,27,254},{4,31,2981},{3,28,10},{22,31,932}, +{22,31,932},{22,31,932},{20,31,36},{28,16,2178},{16,31,353},{16,31,353},{4,28,0},{24,24,2178},{4,28,0},{31,27,290},{27,31,125},{27,31,4},{22,31,1},{31,27,290},{31,29,290},{22,31,1},{0,29,320},{31,29,290},{0,29,320},{16,0,2689},{16,0,2689},{16,0,2689},{16,0,2689},{12,31,245},{12,31,245},{12,31,245},{11,25,8},{2,29,5},{2,29,5},{20,31,9825},{19,31,7014},{19,31,5925}, +{17,31,3218},{20,31,10245},{15,31,3285},{14,31,1330},{11,29,612},{10,31,7225},{3,30,133},{25,31,2467},{24,31,1470},{23,31,1040},{21,31,144},{31,19,3779},{20,31,1580},{18,31,500},{3,30,129},{31,25,3779},{3,30,129},{19,31,5925},{19,31,5925},{19,31,5925},{17,31,3218},{17,31,5346},{14,31,1330},{14,31,1330},{12,28,261},{6,31,3267},{4,29,10},{23,31,1040},{23,31,1040},{23,31,1040},{21,31,144},{29,17,2178}, +{18,31,500},{18,31,500},{5,29,0},{27,24,2178},{5,29,0},{31,28,128},{29,31,61},{28,31,0},{25,31,1},{31,28,128},{30,30,128},{25,31,1},{0,30,128},{30,30,128},{0,30,128},{17,0,2689},{17,0,2689},{17,0,2689},{17,0,2689},{13,31,338},{13,31,338},{13,31,338},{12,26,5},{3,30,5},{3,30,5},{21,31,9523},{20,31,7109},{20,31,6209},{18,31,3473},{20,31,9749},{16,31,3410},{15,31,1717}, +{12,30,401},{11,31,6964},{4,31,65},{26,31,2273},{25,31,1539},{24,31,1189},{23,31,260},{29,25,3299},{22,31,1490},{20,31,680},{6,30,64},{27,28,3299},{6,30,64},{20,31,6209},{20,31,6209},{20,31,6209},{18,31,3473},{18,31,5700},{15,31,1717},{15,31,1717},{13,29,261},{8,31,3587},{5,30,10},{24,31,1189},{24,31,1189},{24,31,1189},{23,31,260},{31,16,2178},{20,31,680},{20,31,680},{6,30,0},{30,24,2178}, +{6,30,0},{31,30,34},{30,31,13},{30,31,4},{28,31,0},{31,30,34},{30,31,34},{28,31,0},{0,30,64},{30,31,34},{0,30,64},{18,0,2689},{18,0,2689},{18,0,2689},{18,0,2689},{15,31,421},{15,31,421},{15,31,421},{13,27,5},{4,31,1},{4,31,1},{23,31,9201},{21,31,7314},{21,31,6530},{19,31,3778},{21,31,9420},{18,31,3652},{16,31,2193},{14,30,325},{14,31,6804},{6,31,10},{27,31,2057}, +{26,31,1605},{25,31,1378},{24,31,442},{31,23,2904},{23,31,1452},{22,31,881},{7,31,0},{31,27,2904},{7,31,0},{21,31,6530},{21,31,6530},{21,31,6530},{19,31,3778},{19,31,5956},{16,31,2193},{16,31,2193},{14,30,261},{10,31,3957},{6,31,10},{25,31,1378},{25,31,1378},{25,31,1378},{24,31,442},{31,19,2178},{22,31,881},{22,31,881},{7,31,0},{31,25,2178},{7,31,0},{31,31,0},{31,31,0},{31,31,0}, +{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{19,0,2689},{19,0,2689},{19,0,2689},{19,0,2689},{16,31,512},{16,31,512},{16,31,512},{14,27,10},{6,31,10},{6,31,10},{23,31,8049},{22,31,6550},{22,31,5925},{20,31,3589},{23,31,8137},{19,31,3220},{18,31,2050},{15,31,173},{15,31,5805},{8,31,52},{27,31,1544},{27,31,1181},{26,31,1040},{25,31,353},{31,24,2166}, +{24,31,1083},{23,31,653},{10,31,1},{30,28,2166},{10,31,1},{22,31,5925},{22,31,5925},{22,31,5925},{20,31,3589},{20,31,5209},{18,31,2050},{18,31,2050},{15,30,117},{12,31,3405},{8,31,52},{26,31,1040},{26,31,1040},{26,31,1040},{25,31,353},{31,21,1625},{23,31,653},{23,31,653},{10,31,1},{31,26,1625},{10,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0}, +{0,31,0},{31,31,0},{0,31,0},{20,0,2689},{20,0,2689},{20,0,2689},{20,0,2689},{17,31,625},{17,31,625},{17,31,625},{15,29,8},{8,31,52},{8,31,52},{24,31,7177},{23,31,5845},{23,31,5361},{21,31,3473},{23,31,7033},{20,31,2945},{19,31,1907},{16,31,65},{16,31,5026},{10,31,117},{28,31,1137},{27,31,861},{27,31,740},{26,31,260},{29,29,1601},{26,31,833},{24,31,482},{13,31,1},{31,28,1601}, +{13,31,1},{23,31,5361},{23,31,5361},{23,31,5361},{21,31,3473},{21,31,4661},{19,31,1907},{19,31,1907},{16,31,65},{14,31,2997},{10,31,117},{27,31,740},{27,31,740},{27,31,740},{26,31,260},{31,22,1201},{24,31,482},{24,31,482},{13,31,1},{30,27,1201},{13,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{21,0,2689}, +{21,0,2689},{21,0,2689},{21,0,2689},{18,31,754},{18,31,754},{18,31,754},{16,30,5},{10,31,117},{10,31,117},{24,31,6393},{24,31,5310},{23,31,4865},{22,31,3314},{24,31,6146},{20,31,2737},{20,31,1837},{17,31,5},{18,31,4381},{11,31,212},{28,31,801},{28,31,609},{28,31,545},{27,31,185},{31,26,1121},{26,31,561},{25,31,353},{16,31,0},{30,29,1121},{16,31,0},{23,31,4865},{23,31,4865},{23,31,4865}, +{22,31,3314},{22,31,4181},{20,31,1837},{20,31,1837},{17,31,5},{15,31,2621},{11,31,212},{28,31,545},{28,31,545},{28,31,545},{27,31,185},{31,23,845},{25,31,353},{25,31,353},{16,31,0},{31,27,845},{16,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{22,0,2689},{22,0,2689},{22,0,2689},{22,0,2689},{19,31,850}, +{19,31,850},{19,31,850},{17,31,5},{11,31,212},{11,31,212},{25,31,5683},{24,31,4782},{24,31,4421},{23,31,3173},{24,31,5314},{22,31,2563},{21,31,1844},{18,31,10},{18,31,3757},{13,31,338},{29,31,531},{28,31,401},{28,31,337},{27,31,121},{31,27,726},{27,31,363},{26,31,221},{19,31,0},{31,29,726},{19,31,0},{24,31,4421},{24,31,4421},{24,31,4421},{23,31,3173},{23,31,3657},{21,31,1844},{21,31,1844}, +{18,31,10},{16,31,2321},{13,31,338},{28,31,337},{28,31,337},{28,31,337},{27,31,121},{31,25,545},{26,31,221},{26,31,221},{19,31,0},{31,28,545},{19,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{23,0,2689},{23,0,2689},{23,0,2689},{23,0,2689},{20,31,985},{20,31,985},{20,31,985},{18,31,10},{13,31,338}, +{13,31,338},{2,31,10560},{0,30,1586},{0,22,173},{0,18,3826},{0,28,18065},{0,19,12194},{0,17,6081},{0,11,14098},{0,13,19386},{0,11,14998},{3,31,10216},{0,30,1586},{0,22,173},{0,18,3826},{12,4,18065},{0,19,12194},{0,17,6081},{0,11,14098},{28,0,18065},{0,11,14098},{0,17,1},{0,17,1},{0,17,1},{0,9,4},{0,9,1105},{0,7,442},{0,7,442},{0,4,680},{0,4,1230},{0,4,801},{0,17,1}, +{0,17,1},{0,17,1},{0,9,4},{4,1,1105},{0,7,442},{0,7,442},{0,4,680},{9,0,1105},{0,4,680},{21,0,9248},{0,30,1586},{0,22,173},{0,18,3826},{21,0,9248},{30,6,9248},{0,18,3826},{0,14,9248},{30,6,9248},{0,14,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,31,11328},{0,31,1341},{0,23,68}, +{0,19,3626},{0,30,19334},{0,20,12611},{0,18,6099},{0,12,14756},{0,14,20886},{0,12,15845},{3,31,10792},{0,31,1341},{0,23,68},{0,19,3626},{15,0,19334},{0,20,12611},{0,18,6099},{0,12,14756},{30,0,19334},{0,12,14756},{0,20,0},{0,20,0},{0,20,0},{0,10,1},{0,10,1513},{0,8,605},{0,8,605},{0,5,925},{0,5,1682},{0,4,1089},{0,20,0},{0,20,0},{0,20,0},{0,10,1},{5,0,1513}, +{0,8,605},{0,8,605},{0,5,925},{10,0,1513},{0,5,925},{22,1,9248},{0,31,1341},{0,23,68},{0,19,3626},{22,1,9248},{31,7,9248},{0,19,3626},{0,15,9248},{31,7,9248},{0,15,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,31,12200},{0,31,1325},{0,24,10},{0,20,3365},{0,31,20705},{0,21,13009},{0,18,6227}, +{0,13,15441},{0,15,22455},{0,13,16666},{4,31,11489},{0,31,1325},{0,24,10},{0,20,3365},{15,2,20689},{0,21,13009},{0,18,6227},{0,13,15441},{30,1,20689},{0,13,15441},{0,23,0},{0,23,0},{0,23,0},{0,11,9},{0,11,1989},{0,9,772},{0,9,772},{0,5,1213},{0,5,2194},{0,5,1382},{0,23,0},{0,23,0},{0,23,0},{0,11,9},{6,0,1985},{0,9,772},{0,9,772},{0,5,1213},{10,1,1985}, +{0,5,1213},{23,2,9248},{0,31,1325},{0,24,10},{0,20,3365},{23,2,9248},{30,9,9248},{0,20,3365},{0,16,9250},{30,9,9248},{0,16,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,31,13288},{0,31,1565},{0,25,10},{0,22,3077},{1,31,22214},{0,23,13555},{0,20,6310},{0,14,16176},{0,16,24130},{0,13,17562},{4,31,12385}, +{0,31,1565},{0,25,10},{0,22,3077},{17,0,22129},{0,23,13555},{0,20,6310},{0,14,16176},{30,2,22129},{0,14,16176},{0,26,0},{0,26,0},{0,26,0},{0,13,0},{0,13,2521},{0,10,1018},{0,10,1018},{0,6,1508},{0,6,2801},{0,6,1764},{0,26,0},{0,26,0},{0,26,0},{0,13,0},{6,1,2521},{0,10,1018},{0,10,1018},{0,6,1508},{13,0,2521},{0,6,1508},{23,5,9248},{0,31,1565},{0,25,10}, +{0,22,3077},{23,5,9248},{31,10,9248},{0,22,3077},{0,17,9250},{31,10,9248},{0,17,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,31,14788},{0,31,2141},{0,27,72},{0,22,2825},{1,31,24140},{0,25,14114},{0,21,6323},{0,14,17202},{0,17,26063},{0,14,18646},{5,31,13521},{1,31,2100},{0,27,72},{0,22,2825},{16,4,23851}, +{0,25,14114},{0,21,6323},{0,14,17202},{28,4,23851},{0,14,17202},{0,29,1},{0,29,1},{0,29,1},{0,15,4},{0,15,3202},{0,12,1285},{0,12,1285},{0,7,1973},{0,7,3569},{0,6,2241},{0,29,1},{0,29,1},{0,29,1},{0,15,4},{7,1,3200},{0,12,1285},{0,12,1285},{0,7,1973},{11,2,3200},{0,7,1973},{27,0,9248},{3,31,1885},{2,26,8},{0,22,2825},{27,0,9248},{30,12,9248},{0,22,2825}, +{0,18,9248},{30,12,9248},{0,18,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,31,16228},{1,31,2836},{0,28,170},{0,24,2612},{2,31,25971},{0,25,14594},{0,22,6473},{0,16,18144},{0,17,27951},{0,14,19830},{7,31,14675},{2,31,2706},{1,27,149},{0,24,2612},{19,0,25472},{0,25,14594},{0,22,6473},{0,16,18144},{30,4,25472}, +{0,16,18144},{0,31,9},{0,31,9},{0,31,9},{0,16,0},{0,16,3872},{0,13,1514},{0,13,1514},{0,7,2405},{0,7,4305},{0,7,2766},{0,31,9},{0,31,9},{0,31,9},{0,16,0},{8,0,3872},{0,13,1514},{0,13,1514},{0,7,2405},{16,0,3872},{0,7,2405},{28,1,9248},{4,31,2210},{3,27,8},{0,24,2612},{28,1,9248},{31,13,9248},{0,24,2612},{0,19,9248},{31,13,9248},{0,19,9248},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,31,17796},{2,31,3702},{1,29,270},{0,25,2361},{3,31,27563},{0,27,14944},{0,23,6470},{0,17,18681},{0,19,29556},{0,16,20628},{7,31,15635},{3,31,3425},{1,29,206},{0,25,2361},{20,0,26744},{0,27,14944},{0,23,6470},{0,17,18681},{24,8,26744},{0,17,18681},{0,31,125},{0,31,125},{0,31,125}, +{0,18,8},{0,18,4418},{0,14,1696},{0,14,1696},{0,8,2664},{0,8,4952},{0,8,3148},{1,31,72},{1,31,72},{1,31,72},{0,18,8},{9,0,4418},{0,14,1696},{0,14,1696},{0,8,2664},{18,0,4418},{0,8,2664},{30,0,9248},{6,31,2557},{3,28,10},{0,25,2357},{30,0,9248},{30,15,9248},{0,25,2357},{0,20,9250},{30,15,9248},{0,20,9250},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,0}, +{0,1,0},{0,1,0},{0,0,4},{0,0,4},{0,0,4},{5,31,19090},{2,31,4598},{1,30,406},{0,26,2220},{3,31,28187},{0,29,14347},{0,25,5609},{0,18,18144},{0,20,29961},{0,17,20301},{8,31,16082},{4,31,4019},{2,30,206},{0,26,2220},{21,1,26744},{0,29,14347},{0,25,5609},{0,18,18144},{27,8,26744},{0,18,18144},{1,31,264},{1,31,264},{1,31,264},{1,19,72},{0,21,4418},{0,16,1412},{0,16,1412}, +{0,10,2420},{0,9,5122},{0,9,2997},{2,31,117},{2,31,117},{2,31,117},{1,19,8},{10,1,4418},{0,16,1412},{0,16,1412},{0,10,2420},{21,0,4418},{0,10,2420},{31,1,9248},{8,31,2929},{4,29,10},{0,26,2120},{31,1,9248},{27,18,9248},{0,26,2120},{0,21,9250},{27,18,9248},{0,21,9250},{1,0,68},{1,0,68},{1,0,68},{1,0,68},{0,4,1},{0,4,1},{0,4,1},{0,2,0},{0,2,25}, +{0,2,25},{7,31,20669},{3,31,5786},{2,31,625},{1,27,2283},{4,31,29033},{0,30,13795},{0,26,4770},{0,18,17667},{0,21,30425},{0,18,20068},{9,31,16691},{5,31,4841},{3,31,205},{1,27,2219},{23,0,26747},{0,30,13795},{0,26,4770},{0,18,17667},{30,8,26747},{0,18,17667},{2,31,589},{2,31,589},{2,31,589},{1,20,186},{0,24,4418},{0,18,1125},{0,18,1125},{0,10,2186},{0,11,5390},{0,10,2915},{3,31,169}, +{3,31,169},{3,31,169},{2,20,13},{12,0,4418},{0,18,1125},{0,18,1125},{0,10,2186},{24,0,4418},{0,10,2186},{31,4,9248},{10,31,3380},{6,30,8},{0,27,1954},{31,4,9248},{30,18,9248},{0,27,1954},{0,22,9248},{30,18,9248},{0,22,9248},{1,0,185},{1,0,185},{1,0,185},{1,0,185},{0,7,0},{0,7,0},{0,7,0},{0,3,9},{0,3,73},{0,3,73},{7,31,21577},{4,31,6797},{3,31,985}, +{1,28,2226},{5,31,29436},{0,31,12990},{0,27,4027},{0,20,16925},{0,23,30436},{0,18,19620},{11,31,16645},{7,31,5260},{4,31,232},{2,28,2141},{24,1,26259},{0,31,12990},{0,27,4027},{0,20,16925},{31,9,26259},{0,20,16925},{3,31,985},{3,31,985},{3,31,985},{2,21,378},{0,27,4418},{0,20,905},{0,20,905},{0,12,2005},{0,12,5635},{0,11,2950},{4,31,232},{4,31,232},{4,31,232},{3,21,13},{13,1,4418}, +{0,20,905},{0,20,905},{0,12,2005},{27,0,4418},{0,12,2005},{31,7,8980},{11,31,3601},{7,31,4},{0,28,1665},{31,7,8980},{31,19,8980},{0,28,1665},{0,23,8980},{31,19,8980},{0,23,8980},{2,0,377},{2,0,377},{2,0,377},{2,0,377},{0,10,0},{0,10,0},{0,10,0},{0,5,0},{0,4,146},{0,4,146},{7,31,21193},{4,31,7053},{3,31,1481},{2,28,2093},{6,31,28313},{0,31,11406},{0,28,2965}, +{0,20,15021},{0,23,28900},{0,19,17995},{11,31,15381},{7,31,4876},{5,31,325},{3,28,1786},{25,1,24371},{0,31,11406},{0,28,2965},{0,20,15021},{27,12,24371},{0,20,15021},{3,31,1481},{3,31,1481},{3,31,1481},{2,23,621},{0,30,4418},{0,21,680},{0,21,680},{0,13,1780},{0,13,5885},{0,12,2950},{5,31,325},{5,31,325},{5,31,325},{4,22,8},{15,0,4418},{0,21,680},{0,21,680},{0,13,1780},{30,0,4418}, +{0,13,1780},{31,8,7938},{12,31,3188},{8,31,0},{0,29,1156},{31,8,7938},{30,20,7938},{0,29,1156},{0,23,7956},{30,20,7938},{0,23,7956},{2,0,617},{2,0,617},{2,0,617},{2,0,617},{0,13,0},{0,13,0},{0,13,0},{0,6,9},{0,5,233},{0,5,233},{8,31,20825},{5,31,7494},{4,31,2089},{2,29,1970},{7,31,27269},{0,31,10078},{0,28,2021},{0,21,13204},{0,25,27384},{0,20,16398},{12,31,14148}, +{8,31,4562},{7,31,392},{4,29,1445},{26,1,22568},{0,31,10078},{0,28,2021},{0,21,13204},{31,11,22568},{0,21,13204},{4,31,2089},{4,31,2089},{4,31,2089},{3,23,946},{0,31,4468},{0,23,521},{0,23,521},{0,14,1573},{0,15,6227},{0,13,2909},{7,31,392},{7,31,392},{7,31,392},{5,23,8},{16,1,4418},{0,23,521},{0,23,521},{0,14,1573},{31,1,4418},{0,14,1573},{31,10,6964},{14,31,2785},{10,31,4}, +{0,29,740},{31,10,6964},{31,20,6964},{0,29,740},{0,24,6970},{31,20,6964},{0,24,6970},{3,0,937},{3,0,937},{3,0,937},{3,0,937},{0,16,1},{0,16,1},{0,16,1},{0,8,1},{0,6,377},{0,6,377},{8,31,20717},{6,31,8012},{5,31,2958},{3,29,2057},{7,31,26243},{0,31,8890},{0,29,1154},{0,22,11325},{0,25,25854},{0,21,14671},{13,31,12926},{10,31,4313},{8,31,485},{5,29,1106},{25,5,20642}, +{0,31,8890},{0,29,1154},{0,22,11325},{31,12,20642},{0,22,11325},{5,31,2958},{5,31,2958},{5,31,2958},{3,25,1361},{1,31,4644},{0,25,337},{0,25,337},{0,15,1429},{0,16,6596},{0,14,2981},{8,31,485},{8,31,485},{8,31,485},{6,24,13},{16,4,4418},{0,25,337},{0,25,337},{0,15,1429},{28,4,4418},{0,15,1429},{31,11,5941},{15,31,2377},{11,31,1},{0,30,388},{31,11,5941},{31,21,5941},{0,30,388}, +{0,24,5953},{31,21,5941},{0,24,5953},{3,0,1360},{3,0,1360},{3,0,1360},{3,0,1360},{0,19,0},{0,19,0},{0,19,0},{0,10,4},{0,8,548},{0,8,548},{9,31,20713},{7,31,8575},{5,31,3806},{3,30,2260},{7,31,25603},{0,31,8106},{0,29,642},{0,22,9805},{0,26,24678},{0,21,13359},{15,31,11882},{11,31,4006},{9,31,596},{6,29,818},{28,1,19021},{2,31,8066},{0,29,642},{0,22,9805},{31,13,19021}, +{0,22,9805},{5,31,3806},{5,31,3806},{5,31,3806},{4,26,1819},{2,31,4962},{0,27,232},{0,27,232},{0,16,1268},{0,17,6926},{0,15,3126},{9,31,596},{9,31,596},{9,31,596},{7,25,13},{17,5,4418},{0,27,232},{0,27,232},{0,16,1268},{31,4,4418},{0,16,1268},{31,13,5101},{16,31,2042},{13,31,4},{0,30,164},{31,13,5101},{31,22,5101},{0,30,164},{0,25,5105},{31,22,5101},{0,25,5105},{4,0,1818}, +{4,0,1818},{4,0,1818},{4,0,1818},{0,22,0},{0,22,0},{0,22,0},{0,11,0},{0,9,697},{0,9,697},{10,31,20905},{7,31,9247},{6,31,4787},{4,30,2547},{8,31,25042},{1,31,7537},{0,30,264},{0,23,8449},{0,27,23521},{0,22,12141},{15,31,10794},{12,31,3786},{10,31,725},{8,29,621},{29,1,17485},{3,31,7274},{0,30,264},{0,23,8449},{27,16,17485},{0,23,8449},{6,31,4787},{6,31,4787},{6,31,4787}, +{4,27,2323},{3,31,5386},{0,29,130},{0,29,130},{0,18,1096},{0,19,7364},{0,17,3225},{10,31,725},{10,31,725},{10,31,725},{8,26,8},{21,0,4418},{0,29,130},{0,29,130},{0,18,1096},{30,6,4418},{0,18,1096},{31,14,4325},{18,31,1737},{14,31,1},{0,31,64},{31,14,4325},{30,23,4325},{0,31,64},{0,25,4337},{30,23,4325},{0,25,4337},{4,0,2314},{4,0,2314},{4,0,2314},{4,0,2314},{0,25,0}, +{0,25,0},{0,25,0},{0,12,4},{0,10,925},{0,10,925},{11,31,21021},{8,31,10106},{7,31,5819},{4,30,3027},{8,31,24722},{2,31,7042},{0,31,81},{0,24,7169},{0,29,22467},{0,22,11133},{16,31,9869},{12,31,3594},{11,31,821},{8,30,420},{30,1,16034},{4,31,6558},{0,31,81},{0,24,7169},{31,15,16034},{0,24,7169},{7,31,5819},{7,31,5819},{7,31,5819},{5,28,2915},{3,31,5962},{0,30,72},{0,30,72}, +{0,18,968},{0,20,7781},{0,17,3305},{11,31,821},{11,31,821},{11,31,821},{9,27,8},{22,1,4418},{0,30,72},{0,30,72},{0,18,968},{31,7,4418},{0,18,968},{31,15,3617},{19,31,1450},{15,31,9},{0,31,0},{31,15,3617},{31,23,3617},{0,31,0},{0,26,3617},{31,23,3617},{0,26,3617},{5,0,2906},{5,0,2906},{5,0,2906},{5,0,2906},{0,28,1},{0,28,1},{0,28,1},{0,14,0},{0,11,1156}, +{0,11,1156},{11,31,21381},{8,31,11186},{7,31,7169},{5,31,3633},{9,31,24543},{3,31,6762},{0,31,81},{0,24,5819},{0,29,21333},{0,23,10106},{17,31,8955},{14,31,3433},{12,31,980},{10,30,242},{29,5,14504},{6,31,5834},{1,31,74},{0,24,5819},{31,16,14504},{0,24,5819},{7,31,7169},{7,31,7169},{7,31,7169},{5,30,3618},{4,31,6757},{0,31,81},{0,31,81},{0,20,821},{0,21,8245},{0,18,3531},{12,31,980}, +{12,31,980},{12,31,980},{10,28,13},{24,0,4418},{1,31,74},{1,31,74},{0,20,821},{24,12,4418},{0,20,821},{29,21,2888},{20,31,1156},{17,31,1},{3,31,1},{29,21,2888},{31,24,2888},{3,31,1},{0,26,2906},{31,24,2888},{0,26,2906},{5,0,3617},{5,0,3617},{5,0,3617},{5,0,3617},{0,31,0},{0,31,0},{0,31,0},{0,15,9},{0,13,1421},{0,13,1421},{12,31,21949},{9,31,12367},{8,31,8449}, +{6,31,4338},{10,31,24600},{3,31,6650},{1,31,298},{0,25,4698},{0,30,20575},{0,24,9247},{17,31,8219},{15,31,3236},{13,31,1157},{11,30,122},{31,3,13235},{7,31,5260},{3,31,145},{0,25,4698},{31,17,13235},{0,25,4698},{8,31,8449},{8,31,8449},{8,31,8449},{6,31,4338},{5,31,7667},{1,31,298},{1,31,298},{0,21,680},{0,23,8779},{0,19,3786},{13,31,1157},{13,31,1157},{13,31,1157},{11,29,13},{25,1,4418}, +{3,31,145},{3,31,145},{0,21,680},{27,12,4418},{0,21,680},{31,19,2314},{22,31,949},{19,31,4},{6,31,1},{31,19,2314},{31,25,2314},{6,31,1},{0,27,2314},{31,25,2314},{0,27,2314},{6,0,4337},{6,0,4337},{6,0,4337},{6,0,4337},{0,31,64},{0,31,64},{0,31,64},{0,17,0},{0,13,1709},{0,13,1709},{12,31,22557},{10,31,13585},{9,31,9926},{6,31,5186},{11,31,24636},{3,31,6794},{2,31,692}, +{0,26,3723},{0,31,19836},{0,25,8442},{19,31,7417},{16,31,3126},{15,31,1268},{12,31,68},{29,9,12051},{8,31,4762},{4,31,232},{0,26,3723},{27,20,12051},{0,26,3723},{9,31,9926},{9,31,9926},{9,31,9926},{6,31,5186},{5,31,8691},{2,31,692},{2,31,692},{0,22,557},{0,25,9284},{0,21,3929},{15,31,1268},{15,31,1268},{15,31,1268},{12,30,8},{27,0,4418},{4,31,232},{4,31,232},{0,22,557},{30,12,4418}, +{0,22,557},{31,20,1800},{22,31,725},{20,31,0},{9,31,1},{31,20,1800},{30,26,1800},{9,31,1},{0,27,1818},{30,26,1800},{0,27,1818},{6,0,5105},{6,0,5105},{6,0,5105},{6,0,5105},{1,31,185},{1,31,185},{1,31,185},{0,18,9},{0,15,2042},{0,15,2042},{12,31,23421},{11,31,14850},{9,31,11462},{7,31,6149},{11,31,24860},{4,31,7053},{2,31,1236},{0,26,2891},{0,31,19260},{0,25,7818},{19,31,6761}, +{17,31,3107},{16,31,1429},{13,31,8},{31,7,10952},{10,31,4300},{6,31,353},{0,26,2891},{31,19,10952},{0,26,2891},{9,31,11462},{9,31,11462},{9,31,11462},{7,31,6149},{7,31,9845},{2,31,1236},{2,31,1236},{0,23,485},{0,25,9764},{0,21,4185},{16,31,1429},{16,31,1429},{16,31,1429},{13,31,8},{28,1,4418},{6,31,353},{6,31,353},{0,23,485},{31,13,4418},{0,23,485},{31,22,1354},{23,31,548},{22,31,4}, +{12,31,0},{31,22,1354},{30,27,1354},{12,31,0},{0,28,1360},{30,27,1354},{0,28,1360},{7,0,5953},{7,0,5953},{7,0,5953},{7,0,5953},{1,31,425},{1,31,425},{1,31,425},{0,20,1},{0,17,2372},{0,17,2372},{13,31,24507},{11,31,16398},{10,31,13349},{8,31,7460},{11,31,25418},{4,31,7647},{3,31,2021},{0,27,2089},{0,31,18918},{0,26,7302},{20,31,6098},{18,31,3037},{17,31,1640},{14,31,25},{29,13,9818}, +{12,31,3874},{8,31,521},{0,27,2089},{31,20,9818},{0,27,2089},{10,31,13349},{10,31,13349},{10,31,13349},{8,31,7460},{7,31,11195},{3,31,2021},{3,31,2021},{0,24,392},{0,27,10472},{0,23,4562},{17,31,1640},{17,31,1640},{17,31,1640},{14,31,25},{28,4,4418},{8,31,521},{8,31,521},{0,24,392},{28,16,4418},{0,24,392},{31,23,925},{24,31,386},{23,31,1},{15,31,1},{31,23,925},{31,27,925},{15,31,1}, +{0,28,937},{31,27,925},{0,28,937},{7,0,6970},{7,0,6970},{7,0,6970},{7,0,6970},{2,31,785},{2,31,785},{2,31,785},{0,22,4},{0,17,2741},{0,17,2741},{14,31,25663},{12,31,17995},{11,31,15021},{8,31,8740},{12,31,26003},{6,31,8399},{3,31,2965},{0,28,1481},{0,31,18886},{0,26,7014},{21,31,5634},{19,31,2950},{18,31,1853},{16,31,72},{31,11,8901},{14,31,3578},{10,31,698},{0,28,1481},{31,21,8901}, +{0,28,1481},{11,31,15021},{11,31,15021},{11,31,15021},{8,31,8740},{8,31,12646},{3,31,2965},{3,31,2965},{0,26,292},{0,29,11051},{0,24,4876},{18,31,1853},{18,31,1853},{18,31,1853},{16,31,72},{29,5,4418},{10,31,698},{10,31,698},{0,26,292},{31,16,4418},{0,26,292},{31,25,613},{26,31,245},{25,31,4},{18,31,1},{31,25,613},{27,30,613},{18,31,1},{0,29,617},{27,30,613},{0,29,617},{8,0,7956}, +{8,0,7956},{8,0,7956},{8,0,7956},{3,31,1201},{3,31,1201},{3,31,1201},{0,23,0},{0,18,3185},{0,18,3185},{15,31,26715},{12,31,19659},{11,31,16925},{9,31,10232},{12,31,26835},{6,31,9215},{4,31,4027},{0,28,985},{0,31,19110},{0,27,6797},{22,31,5238},{20,31,2950},{19,31,2005},{17,31,180},{29,17,8069},{15,31,3314},{11,31,905},{0,28,985},{27,24,8069},{0,28,985},{11,31,16925},{11,31,16925},{11,31,16925}, +{9,31,10232},{8,31,14182},{4,31,4027},{4,31,4027},{0,27,232},{0,29,11627},{0,25,5117},{19,31,2005},{19,31,2005},{19,31,2005},{17,31,180},{31,4,4418},{11,31,905},{11,31,905},{0,27,232},{30,18,4418},{0,27,232},{31,26,365},{27,31,146},{26,31,1},{21,31,1},{31,26,365},{30,29,365},{21,31,1},{0,29,377},{30,29,365},{0,29,377},{8,0,8980},{8,0,8980},{8,0,8980},{8,0,8980},{3,31,1665}, +{3,31,1665},{3,31,1665},{0,24,4},{0,20,3601},{0,20,3601},{15,31,26555},{13,31,20326},{12,31,17723},{10,31,10897},{13,31,26598},{7,31,9527},{5,31,4934},{0,29,590},{0,31,18606},{0,28,5786},{23,31,4770},{21,31,3041},{20,31,2210},{18,31,325},{31,15,7322},{16,31,3126},{14,31,1145},{0,29,554},{31,23,7322},{0,29,554},{12,31,17723},{12,31,17723},{12,31,17723},{10,31,10897},{9,31,15092},{5,31,4934},{5,31,4934}, +{0,28,205},{0,31,11381},{0,26,4709},{20,31,2210},{20,31,2210},{20,31,2210},{18,31,325},{31,7,4418},{14,31,1145},{14,31,1145},{0,28,169},{31,19,4418},{0,28,169},{31,27,185},{28,31,73},{27,31,9},{24,31,0},{31,27,185},{31,29,185},{24,31,0},{0,30,185},{31,29,185},{0,30,185},{9,0,9248},{9,0,9248},{9,0,9248},{9,0,9248},{4,31,1954},{4,31,1954},{4,31,1954},{1,25,8},{0,21,3330}, +{0,21,3330},{16,31,25958},{15,31,20468},{13,31,18321},{11,31,11371},{15,31,25748},{8,31,9863},{7,31,5684},{1,30,373},{0,31,18111},{0,29,4452},{24,31,4437},{23,31,3084},{22,31,2500},{19,31,554},{29,21,6584},{18,31,2996},{15,31,1412},{0,30,237},{31,24,6584},{0,30,237},{13,31,18321},{13,31,18321},{13,31,18321},{11,31,11371},{11,31,15661},{7,31,5684},{7,31,5684},{1,29,206},{0,31,10886},{0,27,4019},{22,31,2500}, +{22,31,2500},{22,31,2500},{19,31,554},{28,16,4418},{15,31,1412},{15,31,1412},{0,29,100},{24,24,4418},{0,29,100},{31,29,52},{30,31,25},{29,31,1},{27,31,1},{31,29,52},{31,30,52},{27,31,1},{0,30,68},{31,30,52},{0,30,68},{10,0,9250},{10,0,9250},{10,0,9250},{10,0,9250},{5,31,2197},{5,31,2197},{5,31,2197},{2,27,5},{0,23,2929},{0,23,2929},{17,31,25604},{15,31,20628},{15,31,18692}, +{12,31,11876},{16,31,25201},{10,31,10381},{8,31,6470},{2,30,270},{2,31,17924},{0,29,3588},{25,31,4259},{23,31,3148},{23,31,2664},{20,31,820},{31,19,6019},{19,31,2950},{16,31,1717},{0,30,125},{31,25,6019},{0,30,125},{15,31,18692},{15,31,18692},{15,31,18692},{12,31,11876},{12,31,16244},{8,31,6470},{8,31,6470},{2,30,206},{0,31,10854},{0,29,3332},{23,31,2664},{23,31,2664},{23,31,2664},{20,31,820},{29,17,4418}, +{16,31,1717},{16,31,1717},{0,30,61},{27,24,4418},{0,30,61},{31,31,4},{31,31,4},{31,31,4},{30,31,1},{31,31,4},{31,31,4},{30,31,1},{0,31,4},{31,31,4},{0,31,4},{11,0,9250},{11,0,9250},{11,0,9250},{11,0,9250},{6,31,2440},{6,31,2440},{6,31,2440},{3,27,10},{0,25,2509},{0,25,2509},{18,31,24418},{16,31,19831},{15,31,18144},{13,31,11876},{16,31,23685},{11,31,10015},{8,31,6638}, +{3,31,170},{3,31,16879},{0,30,2738},{25,31,3699},{24,31,2766},{24,31,2405},{21,31,820},{31,20,5164},{20,31,2584},{18,31,1552},{0,31,9},{30,26,5164},{0,31,9},{15,31,18144},{15,31,18144},{15,31,18144},{13,31,11876},{12,31,15696},{8,31,6638},{8,31,6638},{4,30,132},{0,31,10150},{0,29,2624},{24,31,2405},{24,31,2405},{24,31,2405},{21,31,820},{31,15,3872},{18,31,1552},{18,31,1552},{0,31,9},{31,23,3872}, +{0,31,9},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{12,0,9248},{12,0,9248},{12,0,9248},{12,0,9248},{7,31,2612},{7,31,2612},{7,31,2612},{4,28,8},{0,27,2210},{0,27,2210},{19,31,22762},{17,31,18876},{16,31,17222},{14,31,11585},{17,31,22068},{11,31,9551},{10,31,6509},{5,31,68},{4,31,15612},{0,30,2098},{26,31,3089}, +{24,31,2334},{24,31,1973},{22,31,661},{29,25,4267},{22,31,2150},{19,31,1285},{2,31,0},{27,28,4267},{2,31,0},{16,31,17222},{16,31,17222},{16,31,17222},{14,31,11585},{13,31,14786},{10,31,6509},{10,31,6509},{5,31,68},{0,31,9366},{0,30,2034},{24,31,1973},{24,31,1973},{24,31,1973},{22,31,661},{31,16,3202},{19,31,1285},{19,31,1285},{2,31,0},{30,24,3202},{2,31,0},{31,31,0},{31,31,0},{31,31,0}, +{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{13,0,9248},{13,0,9248},{13,0,9248},{13,0,9248},{8,31,2845},{8,31,2845},{8,31,2845},{5,29,8},{0,29,1856},{0,29,1856},{19,31,21160},{18,31,17776},{17,31,16329},{15,31,11282},{17,31,20358},{12,31,9098},{11,31,6310},{6,31,5},{6,31,14287},{0,31,1565},{27,31,2412},{25,31,1862},{25,31,1573},{23,31,509},{28,28,3361}, +{22,31,1691},{20,31,1021},{5,31,1},{28,28,3361},{5,31,1},{17,31,16329},{17,31,16329},{17,31,16329},{15,31,11282},{15,31,13658},{11,31,6310},{11,31,6310},{6,31,5},{2,31,8690},{0,31,1565},{25,31,1573},{25,31,1573},{25,31,1573},{23,31,509},{31,18,2521},{20,31,1021},{20,31,1021},{5,31,1},{30,25,2521},{5,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0}, +{0,31,0},{31,31,0},{0,31,0},{14,0,9250},{14,0,9250},{14,0,9250},{14,0,9250},{9,31,3176},{9,31,3176},{9,31,3176},{6,31,5},{0,30,1556},{0,30,1556},{20,31,19810},{19,31,16741},{18,31,15584},{16,31,11057},{19,31,18721},{14,31,8860},{12,31,6234},{7,31,10},{7,31,13210},{0,31,1325},{27,31,1868},{26,31,1464},{26,31,1268},{24,31,397},{31,23,2649},{23,31,1329},{22,31,794},{8,31,0},{31,27,2649}, +{8,31,0},{18,31,15584},{18,31,15584},{18,31,15584},{16,31,11057},{15,31,12858},{12,31,6234},{12,31,6234},{7,31,10},{3,31,8150},{0,31,1325},{26,31,1268},{26,31,1268},{26,31,1268},{24,31,397},{31,19,1989},{22,31,794},{22,31,794},{8,31,0},{31,25,1989},{8,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{15,0,9250}, +{15,0,9250},{15,0,9250},{15,0,9250},{11,31,3365},{11,31,3365},{11,31,3365},{7,31,10},{0,31,1325},{0,31,1325},{20,31,18626},{19,31,15845},{19,31,14756},{17,31,10897},{19,31,17297},{15,31,8442},{13,31,6285},{8,31,68},{8,31,12227},{0,31,1341},{27,31,1452},{27,31,1089},{27,31,968},{25,31,325},{31,24,2018},{24,31,1011},{23,31,605},{11,31,0},{30,28,2018},{11,31,0},{19,31,14756},{19,31,14756},{19,31,14756}, +{17,31,10897},{16,31,12077},{13,31,6285},{13,31,6285},{8,31,68},{4,31,7686},{0,31,1341},{27,31,968},{27,31,968},{27,31,968},{25,31,325},{31,21,1513},{23,31,605},{23,31,605},{11,31,0},{31,26,1513},{11,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{16,0,9248},{16,0,9248},{16,0,9248},{16,0,9248},{12,31,3626}, +{12,31,3626},{12,31,3626},{8,31,68},{0,31,1341},{0,31,1341},{21,31,17476},{20,31,14998},{20,31,14098},{18,31,10672},{20,31,16018},{15,31,8154},{15,31,6218},{9,31,200},{10,31,11338},{0,31,1613},{28,31,1041},{27,31,801},{27,31,680},{26,31,232},{29,29,1473},{26,31,753},{24,31,442},{14,31,0},{31,28,1473},{14,31,0},{20,31,14098},{20,31,14098},{20,31,14098},{18,31,10672},{17,31,11453},{15,31,6218},{15,31,6218}, +{9,31,200},{6,31,7270},{0,31,1613},{27,31,680},{27,31,680},{27,31,680},{26,31,232},{28,28,1105},{24,31,442},{24,31,442},{14,31,0},{28,28,1105},{14,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{17,0,9248},{17,0,9248},{17,0,9248},{17,0,9248},{13,31,3929},{13,31,3929},{13,31,3929},{9,31,200},{0,31,1613}, +{0,31,1613}, +/**** ended inlining basisu_transcoder_tables_dxt1_5.inc ****/ + }; +#endif // BASISD_SUPPORT_DXT1 + +#if BASISD_SUPPORT_DXT1 || BASISD_SUPPORT_UASTC + // First saw the idea for optimal BC1 single-color block encoding using lookup tables in ryg_dxt. + struct bc1_match_entry + { + uint8_t m_hi; + uint8_t m_lo; + }; + static bc1_match_entry g_bc1_match5_equals_1[256], g_bc1_match6_equals_1[256]; // selector 1, allow equals hi/lo + static bc1_match_entry g_bc1_match5_equals_0[256], g_bc1_match6_equals_0[256]; // selector 0, allow equals hi/lo + + static void prepare_bc1_single_color_table(bc1_match_entry* pTable, const uint8_t* pExpand, int size0, int size1, int sel) + { + for (int i = 0; i < 256; i++) + { + int lowest_e = 256; + for (int lo = 0; lo < size0; lo++) + { + for (int hi = 0; hi < size1; hi++) + { + const int lo_e = pExpand[lo], hi_e = pExpand[hi]; + int e; + + if (sel == 1) + { + // Selector 1 + e = basisu::iabs(((hi_e * 2 + lo_e) / 3) - i); + e += (basisu::iabs(hi_e - lo_e) * 3) / 100; + } + else + { + assert(sel == 0); + + // Selector 0 + e = basisu::iabs(hi_e - i); + } + + if (e < lowest_e) + { + pTable[i].m_hi = static_cast(hi); + pTable[i].m_lo = static_cast(lo); + + lowest_e = e; + } + + } // hi + } // lo + } + } +#endif + +#if BASISD_WRITE_NEW_DXT1_TABLES + static void create_etc1_to_dxt1_5_conversion_table() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_dxt1_5.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1_TO_DXT1_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1_to_dxt1_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1_to_dxt1_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 31; hi++) + { + for (uint32_t lo = 0; lo <= 31; lo++) + { + //if (lo == hi) continue; + + uint32_t colors[4]; + + colors[0] = (lo << 3) | (lo >> 2); + colors[3] = (hi << 3) | (hi >> 2); + + colors[1] = (colors[0] * 2 + colors[3]) / 3; + colors[2] = (colors[3] * 2 + colors[0]) / 3; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1_to_dxt1_selector_mappings[m][s]]; + + total_err += err * err; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + assert(best_err <= 0xFFFF); + + //table[g + inten * 32].m_solutions[sr][m].m_lo = static_cast(best_lo); + //table[g + inten * 32].m_solutions[sr][m].m_hi = static_cast(best_hi); + //table[g + inten * 32].m_solutions[sr][m].m_err = static_cast(best_err); + + //assert(best_lo != best_hi); + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); + } + + static void create_etc1_to_dxt1_6_conversion_table() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_dxt1_6.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1_TO_DXT1_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1_to_dxt1_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1_to_dxt1_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 63; hi++) + { + for (uint32_t lo = 0; lo <= 63; lo++) + { + //if (lo == hi) continue; + + uint32_t colors[4]; + + colors[0] = (lo << 2) | (lo >> 4); + colors[3] = (hi << 2) | (hi >> 4); + + colors[1] = (colors[0] * 2 + colors[3]) / 3; + colors[2] = (colors[3] * 2 + colors[0]) / 3; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1_to_dxt1_selector_mappings[m][s]]; + + total_err += err * err; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + assert(best_err <= 0xFFFF); + + //table[g + inten * 32].m_solutions[sr][m].m_lo = static_cast(best_lo); + //table[g + inten * 32].m_solutions[sr][m].m_hi = static_cast(best_hi); + //table[g + inten * 32].m_solutions[sr][m].m_err = static_cast(best_err); + + //assert(best_lo != best_hi); + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + + } // m + } // sr + } // g + } // inten + + fclose(pFile); + } +#endif + + +#if BASISD_SUPPORT_UASTC || BASISD_SUPPORT_ETC2_EAC_A8 || BASISD_SUPPORT_ETC2_EAC_RG11 + static const int8_t g_eac_modifier_table[16][8] = + { + { -3, -6, -9, -15, 2, 5, 8, 14 }, + { -3, -7, -10, -13, 2, 6, 9, 12 }, + { -2, -5, -8, -13, 1, 4, 7, 12 }, + { -2, -4, -6, -13, 1, 3, 5, 12 }, + { -3, -6, -8, -12, 2, 5, 7, 11 }, + { -3, -7, -9, -11, 2, 6, 8, 10 }, + { -4, -7, -8, -11, 3, 6, 7, 10 }, + { -3, -5, -8, -11, 2, 4, 7, 10 }, + + { -2, -6, -8, -10, 1, 5, 7, 9 }, + { -2, -5, -8, -10, 1, 4, 7, 9 }, + { -2, -4, -8, -10, 1, 3, 7, 9 }, + { -2, -5, -7, -10, 1, 4, 6, 9 }, + { -3, -4, -7, -10, 2, 3, 6, 9 }, + { -1, -2, -3, -10, 0, 1, 2, 9 }, // entry 13 + { -4, -6, -8, -9, 3, 5, 7, 8 }, + { -3, -5, -7, -9, 2, 4, 6, 8 } + }; + + // Used by ETC2 EAC A8 and ETC2 EAC R11/RG11. + struct eac_block + { + uint16_t m_base : 8; + + uint16_t m_table : 4; + uint16_t m_multiplier : 4; + + uint8_t m_selectors[6]; + + uint32_t get_selector(uint32_t x, uint32_t y) const + { + assert((x < 4) && (y < 4)); + + const uint32_t ofs = 45 - (y + x * 4) * 3; + + const uint64_t pixels = get_selector_bits(); + + return (pixels >> ofs) & 7; + } + + void set_selector(uint32_t x, uint32_t y, uint32_t s) + { + assert((x < 4) && (y < 4) && (s < 8)); + + const uint32_t ofs = 45 - (y + x * 4) * 3; + + uint64_t pixels = get_selector_bits(); + + pixels &= ~(7ULL << ofs); + pixels |= (static_cast(s) << ofs); + + set_selector_bits(pixels); + } + + uint64_t get_selector_bits() const + { + uint64_t pixels = ((uint64_t)m_selectors[0] << 40) | ((uint64_t)m_selectors[1] << 32) | + ((uint64_t)m_selectors[2] << 24) | + ((uint64_t)m_selectors[3] << 16) | ((uint64_t)m_selectors[4] << 8) | m_selectors[5]; + return pixels; + } + + void set_selector_bits(uint64_t pixels) + { + m_selectors[0] = (uint8_t)(pixels >> 40); + m_selectors[1] = (uint8_t)(pixels >> 32); + m_selectors[2] = (uint8_t)(pixels >> 24); + m_selectors[3] = (uint8_t)(pixels >> 16); + m_selectors[4] = (uint8_t)(pixels >> 8); + m_selectors[5] = (uint8_t)(pixels); + } + }; + +#endif // #if BASISD_SUPPORT_UASTC BASISD_SUPPORT_ETC2_EAC_A8 || BASISD_SUPPORT_ETC2_EAC_RG11 + +#if BASISD_SUPPORT_ETC2_EAC_A8 || BASISD_SUPPORT_ETC2_EAC_RG11 + static const dxt_selector_range s_etc2_eac_selector_ranges[] = + { + { 0, 3 }, + + { 1, 3 }, + { 0, 2 }, + + { 1, 2 }, + }; + + const uint32_t NUM_ETC2_EAC_SELECTOR_RANGES = sizeof(s_etc2_eac_selector_ranges) / sizeof(s_etc2_eac_selector_ranges[0]); + + struct etc1_g_to_eac_conversion + { + uint8_t m_base; + uint8_t m_table_mul; // mul*16+table + uint16_t m_trans; // translates ETC1 selectors to ETC2_EAC_A8 + }; +#endif // BASISD_SUPPORT_ETC2_EAC_A8 || BASISD_SUPPORT_ETC2_EAC_RG11 + +#if BASISD_SUPPORT_ETC2_EAC_A8 + +#if BASISD_WRITE_NEW_ETC2_EAC_A8_TABLES + struct pack_eac_a8_results + { + uint32_t m_base; + uint32_t m_table; + uint32_t m_multiplier; + basisu::vector m_selectors; + basisu::vector m_selectors_temp; + }; + + static uint64_t pack_eac_a8_exhaustive(pack_eac_a8_results& results, const uint8_t* pPixels, uint32_t num_pixels) + { + results.m_selectors.resize(num_pixels); + results.m_selectors_temp.resize(num_pixels); + + uint64_t best_err = UINT64_MAX; + + for (uint32_t base_color = 0; base_color < 256; base_color++) + { + for (uint32_t multiplier = 1; multiplier < 16; multiplier++) + { + for (uint32_t table = 0; table < 16; table++) + { + uint64_t total_err = 0; + + for (uint32_t i = 0; i < num_pixels; i++) + { + const int a = pPixels[i]; + + uint32_t best_s_err = UINT32_MAX; + uint32_t best_s = 0; + for (uint32_t s = 0; s < 8; s++) + { + int v = (int)multiplier * g_eac_modifier_table[table][s] + (int)base_color; + if (v < 0) + v = 0; + else if (v > 255) + v = 255; + + uint32_t err = abs(a - v); + if (err < best_s_err) + { + best_s_err = err; + best_s = s; + } + } + + results.m_selectors_temp[i] = static_cast(best_s); + + total_err += best_s_err * best_s_err; + if (total_err >= best_err) + break; + } + + if (total_err < best_err) + { + best_err = total_err; + results.m_base = base_color; + results.m_multiplier = multiplier; + results.m_table = table; + results.m_selectors.swap(results.m_selectors_temp); + } + + } // table + + } // multiplier + + } // base_color + + return best_err; + } +#endif // BASISD_WRITE_NEW_ETC2_EAC_A8_TABLES + + static +#if !BASISD_WRITE_NEW_ETC2_EAC_A8_TABLES + const +#endif + etc1_g_to_eac_conversion s_etc1_g_to_etc2_a8[32 * 8][NUM_ETC2_EAC_SELECTOR_RANGES] = + { + { { 0,1,3328 },{ 0,1,3328 },{ 0,1,256 },{ 0,1,256 } }, + { { 0,226,3936 },{ 0,226,3936 },{ 0,81,488 },{ 0,81,488 } }, + { { 6,178,4012 },{ 6,178,4008 },{ 0,146,501 },{ 0,130,496 } }, + { { 14,178,4012 },{ 14,178,4008 },{ 8,146,501 },{ 6,82,496 } }, + { { 23,178,4012 },{ 23,178,4008 },{ 17,146,501 },{ 3,228,496 } }, + { { 31,178,4012 },{ 31,178,4008 },{ 25,146,501 },{ 11,228,496 } }, + { { 39,178,4012 },{ 39,178,4008 },{ 33,146,501 },{ 19,228,496 } }, + { { 47,178,4012 },{ 47,178,4008 },{ 41,146,501 },{ 27,228,496 } }, + { { 56,178,4012 },{ 56,178,4008 },{ 50,146,501 },{ 36,228,496 } }, + { { 64,178,4012 },{ 64,178,4008 },{ 58,146,501 },{ 44,228,496 } }, + { { 72,178,4012 },{ 72,178,4008 },{ 66,146,501 },{ 52,228,496 } }, + { { 80,178,4012 },{ 80,178,4008 },{ 74,146,501 },{ 60,228,496 } }, + { { 89,178,4012 },{ 89,178,4008 },{ 83,146,501 },{ 69,228,496 } }, + { { 97,178,4012 },{ 97,178,4008 },{ 91,146,501 },{ 77,228,496 } }, + { { 105,178,4012 },{ 105,178,4008 },{ 99,146,501 },{ 85,228,496 } }, + { { 113,178,4012 },{ 113,178,4008 },{ 107,146,501 },{ 93,228,496 } }, + { { 122,178,4012 },{ 122,178,4008 },{ 116,146,501 },{ 102,228,496 } }, + { { 130,178,4012 },{ 130,178,4008 },{ 124,146,501 },{ 110,228,496 } }, + { { 138,178,4012 },{ 138,178,4008 },{ 132,146,501 },{ 118,228,496 } }, + { { 146,178,4012 },{ 146,178,4008 },{ 140,146,501 },{ 126,228,496 } }, + { { 155,178,4012 },{ 155,178,4008 },{ 149,146,501 },{ 135,228,496 } }, + { { 163,178,4012 },{ 163,178,4008 },{ 157,146,501 },{ 143,228,496 } }, + { { 171,178,4012 },{ 171,178,4008 },{ 165,146,501 },{ 151,228,496 } }, + { { 179,178,4012 },{ 179,178,4008 },{ 173,146,501 },{ 159,228,496 } }, + { { 188,178,4012 },{ 188,178,4008 },{ 182,146,501 },{ 168,228,496 } }, + { { 196,178,4012 },{ 196,178,4008 },{ 190,146,501 },{ 176,228,496 } }, + { { 204,178,4012 },{ 204,178,4008 },{ 198,146,501 },{ 184,228,496 } }, + { { 212,178,4012 },{ 212,178,4008 },{ 206,146,501 },{ 192,228,496 } }, + { { 221,178,4012 },{ 221,178,4008 },{ 215,146,501 },{ 201,228,496 } }, + { { 229,178,4012 },{ 229,178,4008 },{ 223,146,501 },{ 209,228,496 } }, + { { 235,66,4012 },{ 221,100,4008 },{ 231,146,501 },{ 217,228,496 } }, + { { 211,102,4085 },{ 118,31,4080 },{ 211,102,501 },{ 118,31,496 } }, + { { 1,2,3328 },{ 1,2,3328 },{ 0,1,320 },{ 0,1,320 } }, + { { 7,162,3905 },{ 7,162,3904 },{ 1,17,480 },{ 1,17,480 } }, + { { 15,162,3906 },{ 15,162,3904 },{ 1,117,352 },{ 1,117,352 } }, + { { 23,162,3906 },{ 23,162,3904 },{ 5,34,500 },{ 4,53,424 } }, + { { 32,162,3906 },{ 32,162,3904 },{ 14,34,500 },{ 3,69,424 } }, + { { 40,162,3906 },{ 40,162,3904 },{ 22,34,500 },{ 1,133,496 } }, + { { 48,162,3906 },{ 48,162,3904 },{ 30,34,500 },{ 4,85,496 } }, + { { 56,162,3906 },{ 56,162,3904 },{ 38,34,500 },{ 12,85,496 } }, + { { 65,162,3906 },{ 65,162,3904 },{ 47,34,500 },{ 1,106,424 } }, + { { 73,162,3906 },{ 73,162,3904 },{ 55,34,500 },{ 9,106,424 } }, + { { 81,162,3906 },{ 81,162,3904 },{ 63,34,500 },{ 7,234,496 } }, + { { 89,162,3906 },{ 89,162,3904 },{ 71,34,500 },{ 15,234,496 } }, + { { 98,162,3906 },{ 98,162,3904 },{ 80,34,500 },{ 24,234,496 } }, + { { 106,162,3906 },{ 106,162,3904 },{ 88,34,500 },{ 32,234,496 } }, + { { 114,162,3906 },{ 114,162,3904 },{ 96,34,500 },{ 40,234,496 } }, + { { 122,162,3906 },{ 122,162,3904 },{ 104,34,500 },{ 48,234,496 } }, + { { 131,162,3906 },{ 131,162,3904 },{ 113,34,500 },{ 57,234,496 } }, + { { 139,162,3906 },{ 139,162,3904 },{ 121,34,500 },{ 65,234,496 } }, + { { 147,162,3906 },{ 147,162,3904 },{ 129,34,500 },{ 73,234,496 } }, + { { 155,162,3906 },{ 155,162,3904 },{ 137,34,500 },{ 81,234,496 } }, + { { 164,162,3906 },{ 164,162,3904 },{ 146,34,500 },{ 90,234,496 } }, + { { 172,162,3906 },{ 172,162,3904 },{ 154,34,500 },{ 98,234,496 } }, + { { 180,162,3906 },{ 180,162,3904 },{ 162,34,500 },{ 106,234,496 } }, + { { 188,162,3906 },{ 188,162,3904 },{ 170,34,500 },{ 114,234,496 } }, + { { 197,162,3906 },{ 197,162,3904 },{ 179,34,500 },{ 123,234,496 } }, + { { 205,162,3906 },{ 205,162,3904 },{ 187,34,500 },{ 131,234,496 } }, + { { 213,162,3906 },{ 213,162,3904 },{ 195,34,500 },{ 139,234,496 } }, + { { 221,162,3906 },{ 221,162,3904 },{ 203,34,500 },{ 147,234,496 } }, + { { 230,162,3906 },{ 230,162,3904 },{ 212,34,500 },{ 156,234,496 } }, + { { 238,162,3906 },{ 174,106,4008 },{ 220,34,500 },{ 164,234,496 } }, + { { 240,178,4001 },{ 182,106,4008 },{ 228,34,500 },{ 172,234,496 } }, + { { 166,108,4085 },{ 115,31,4080 },{ 166,108,501 },{ 115,31,496 } }, + { { 1,68,3328 },{ 1,68,3328 },{ 0,17,384 },{ 0,17,384 } }, + { { 1,148,3904 },{ 1,148,3904 },{ 1,2,384 },{ 1,2,384 } }, + { { 21,18,3851 },{ 21,18,3848 },{ 1,50,488 },{ 1,50,488 } }, + { { 27,195,3851 },{ 29,18,3848 },{ 0,67,488 },{ 0,67,488 } }, + { { 34,195,3907 },{ 38,18,3848 },{ 20,66,482 },{ 0,3,496 } }, + { { 42,195,3907 },{ 46,18,3848 },{ 28,66,482 },{ 2,6,424 } }, + { { 50,195,3907 },{ 54,18,3848 },{ 36,66,482 },{ 4,22,424 } }, + { { 58,195,3907 },{ 62,18,3848 },{ 44,66,482 },{ 3,73,424 } }, + { { 67,195,3907 },{ 71,18,3848 },{ 53,66,482 },{ 3,22,496 } }, + { { 75,195,3907 },{ 79,18,3848 },{ 61,66,482 },{ 2,137,496 } }, + { { 83,195,3907 },{ 87,18,3848 },{ 69,66,482 },{ 1,89,496 } }, + { { 91,195,3907 },{ 95,18,3848 },{ 77,66,482 },{ 9,89,496 } }, + { { 100,195,3907 },{ 104,18,3848 },{ 86,66,482 },{ 18,89,496 } }, + { { 108,195,3907 },{ 112,18,3848 },{ 94,66,482 },{ 26,89,496 } }, + { { 116,195,3907 },{ 120,18,3848 },{ 102,66,482 },{ 34,89,496 } }, + { { 124,195,3907 },{ 128,18,3848 },{ 110,66,482 },{ 42,89,496 } }, + { { 133,195,3907 },{ 137,18,3848 },{ 119,66,482 },{ 51,89,496 } }, + { { 141,195,3907 },{ 145,18,3848 },{ 127,66,482 },{ 59,89,496 } }, + { { 149,195,3907 },{ 153,18,3848 },{ 135,66,482 },{ 67,89,496 } }, + { { 157,195,3907 },{ 161,18,3848 },{ 143,66,482 },{ 75,89,496 } }, + { { 166,195,3907 },{ 170,18,3848 },{ 152,66,482 },{ 84,89,496 } }, + { { 174,195,3907 },{ 178,18,3848 },{ 160,66,482 },{ 92,89,496 } }, + { { 182,195,3907 },{ 186,18,3848 },{ 168,66,482 },{ 100,89,496 } }, + { { 190,195,3907 },{ 194,18,3848 },{ 176,66,482 },{ 108,89,496 } }, + { { 199,195,3907 },{ 203,18,3848 },{ 185,66,482 },{ 117,89,496 } }, + { { 207,195,3907 },{ 211,18,3848 },{ 193,66,482 },{ 125,89,496 } }, + { { 215,195,3907 },{ 219,18,3848 },{ 201,66,482 },{ 133,89,496 } }, + { { 223,195,3907 },{ 227,18,3848 },{ 209,66,482 },{ 141,89,496 } }, + { { 231,195,3907 },{ 168,89,4008 },{ 218,66,482 },{ 150,89,496 } }, + { { 236,18,3907 },{ 176,89,4008 },{ 226,66,482 },{ 158,89,496 } }, + { { 158,90,4085 },{ 103,31,4080 },{ 158,90,501 },{ 103,31,496 } }, + { { 166,90,4085 },{ 111,31,4080 },{ 166,90,501 },{ 111,31,496 } }, + { { 0,70,3328 },{ 0,70,3328 },{ 0,45,256 },{ 0,45,256 } }, + { { 0,117,3904 },{ 0,117,3904 },{ 0,35,384 },{ 0,35,384 } }, + { { 13,165,3905 },{ 13,165,3904 },{ 3,221,416 },{ 3,221,416 } }, + { { 21,165,3906 },{ 21,165,3904 },{ 11,221,416 },{ 11,221,416 } }, + { { 30,165,3906 },{ 30,165,3904 },{ 7,61,352 },{ 7,61,352 } }, + { { 38,165,3906 },{ 38,165,3904 },{ 2,125,352 },{ 2,125,352 } }, + { { 46,165,3906 },{ 46,165,3904 },{ 2,37,500 },{ 10,125,352 } }, + { { 54,165,3906 },{ 54,165,3904 },{ 10,37,500 },{ 5,61,424 } }, + { { 63,165,3906 },{ 63,165,3904 },{ 19,37,500 },{ 1,189,424 } }, + { { 4,254,4012 },{ 71,165,3904 },{ 27,37,500 },{ 9,189,424 } }, + { { 12,254,4012 },{ 79,165,3904 },{ 35,37,500 },{ 4,77,424 } }, + { { 20,254,4012 },{ 87,165,3904 },{ 43,37,500 },{ 12,77,424 } }, + { { 29,254,4012 },{ 96,165,3904 },{ 52,37,500 },{ 8,93,424 } }, + { { 37,254,4012 },{ 104,165,3904 },{ 60,37,500 },{ 3,141,496 } }, + { { 45,254,4012 },{ 112,165,3904 },{ 68,37,500 },{ 11,141,496 } }, + { { 53,254,4012 },{ 120,165,3904 },{ 76,37,500 },{ 6,93,496 } }, + { { 62,254,4012 },{ 129,165,3904 },{ 85,37,500 },{ 15,93,496 } }, + { { 70,254,4012 },{ 137,165,3904 },{ 93,37,500 },{ 23,93,496 } }, + { { 78,254,4012 },{ 145,165,3904 },{ 101,37,500 },{ 31,93,496 } }, + { { 86,254,4012 },{ 153,165,3904 },{ 109,37,500 },{ 39,93,496 } }, + { { 95,254,4012 },{ 162,165,3904 },{ 118,37,500 },{ 48,93,496 } }, + { { 103,254,4012 },{ 170,165,3904 },{ 126,37,500 },{ 56,93,496 } }, + { { 111,254,4012 },{ 178,165,3904 },{ 134,37,500 },{ 64,93,496 } }, + { { 119,254,4012 },{ 186,165,3904 },{ 142,37,500 },{ 72,93,496 } }, + { { 128,254,4012 },{ 195,165,3904 },{ 151,37,500 },{ 81,93,496 } }, + { { 136,254,4012 },{ 203,165,3904 },{ 159,37,500 },{ 89,93,496 } }, + { { 212,165,3906 },{ 136,77,4008 },{ 167,37,500 },{ 97,93,496 } }, + { { 220,165,3394 },{ 131,93,4008 },{ 175,37,500 },{ 105,93,496 } }, + { { 214,181,4001 },{ 140,93,4008 },{ 184,37,500 },{ 114,93,496 } }, + { { 222,181,4001 },{ 148,93,4008 },{ 192,37,500 },{ 122,93,496 } }, + { { 114,95,4085 },{ 99,31,4080 },{ 114,95,501 },{ 99,31,496 } }, + { { 122,95,4085 },{ 107,31,4080 },{ 122,95,501 },{ 107,31,496 } }, + { { 0,102,3840 },{ 0,102,3840 },{ 0,18,384 },{ 0,18,384 } }, + { { 5,167,3904 },{ 5,167,3904 },{ 0,13,256 },{ 0,13,256 } }, + { { 4,54,3968 },{ 4,54,3968 },{ 1,67,448 },{ 1,67,448 } }, + { { 30,198,3850 },{ 30,198,3848 },{ 0,3,480 },{ 0,3,480 } }, + { { 39,198,3850 },{ 39,198,3848 },{ 3,52,488 },{ 3,52,488 } }, + { { 47,198,3851 },{ 47,198,3848 },{ 3,4,488 },{ 3,4,488 } }, + { { 55,198,3851 },{ 55,198,3848 },{ 1,70,488 },{ 1,70,488 } }, + { { 54,167,3906 },{ 63,198,3848 },{ 3,22,488 },{ 3,22,488 } }, + { { 62,167,3906 },{ 72,198,3848 },{ 24,118,488 },{ 0,6,496 } }, + { { 70,167,3906 },{ 80,198,3848 },{ 32,118,488 },{ 2,89,488 } }, + { { 78,167,3906 },{ 88,198,3848 },{ 40,118,488 },{ 1,73,496 } }, + { { 86,167,3906 },{ 96,198,3848 },{ 48,118,488 },{ 0,28,424 } }, + { { 95,167,3906 },{ 105,198,3848 },{ 57,118,488 },{ 9,28,424 } }, + { { 103,167,3906 },{ 113,198,3848 },{ 65,118,488 },{ 5,108,496 } }, + { { 111,167,3906 },{ 121,198,3848 },{ 73,118,488 },{ 13,108,496 } }, + { { 119,167,3906 },{ 129,198,3848 },{ 81,118,488 },{ 21,108,496 } }, + { { 128,167,3906 },{ 138,198,3848 },{ 90,118,488 },{ 6,28,496 } }, + { { 136,167,3906 },{ 146,198,3848 },{ 98,118,488 },{ 14,28,496 } }, + { { 144,167,3906 },{ 154,198,3848 },{ 106,118,488 },{ 22,28,496 } }, + { { 152,167,3906 },{ 162,198,3848 },{ 114,118,488 },{ 30,28,496 } }, + { { 161,167,3906 },{ 171,198,3848 },{ 123,118,488 },{ 39,28,496 } }, + { { 169,167,3906 },{ 179,198,3848 },{ 131,118,488 },{ 47,28,496 } }, + { { 177,167,3906 },{ 187,198,3848 },{ 139,118,488 },{ 55,28,496 } }, + { { 185,167,3906 },{ 195,198,3848 },{ 147,118,488 },{ 63,28,496 } }, + { { 194,167,3906 },{ 120,12,4008 },{ 156,118,488 },{ 72,28,496 } }, + { { 206,198,3907 },{ 116,28,4008 },{ 164,118,488 },{ 80,28,496 } }, + { { 214,198,3907 },{ 124,28,4008 },{ 172,118,488 },{ 88,28,496 } }, + { { 222,198,3395 },{ 132,28,4008 },{ 180,118,488 },{ 96,28,496 } }, + { { 207,134,4001 },{ 141,28,4008 },{ 189,118,488 },{ 105,28,496 } }, + { { 95,30,4085 },{ 86,31,4080 },{ 95,30,501 },{ 86,31,496 } }, + { { 103,30,4085 },{ 94,31,4080 },{ 103,30,501 },{ 94,31,496 } }, + { { 111,30,4085 },{ 102,31,4080 },{ 111,30,501 },{ 102,31,496 } }, + { { 0,104,3840 },{ 0,104,3840 },{ 0,18,448 },{ 0,18,448 } }, + { { 4,39,3904 },{ 4,39,3904 },{ 0,4,384 },{ 0,4,384 } }, + { { 0,56,3968 },{ 0,56,3968 },{ 0,84,448 },{ 0,84,448 } }, + { { 6,110,3328 },{ 6,110,3328 },{ 0,20,448 },{ 0,20,448 } }, + { { 41,200,3850 },{ 41,200,3848 },{ 1,4,480 },{ 1,4,480 } }, + { { 49,200,3850 },{ 49,200,3848 },{ 1,8,416 },{ 1,8,416 } }, + { { 57,200,3851 },{ 57,200,3848 },{ 1,38,488 },{ 1,38,488 } }, + { { 65,200,3851 },{ 65,200,3848 },{ 1,120,488 },{ 1,120,488 } }, + { { 74,200,3851 },{ 74,200,3848 },{ 2,72,488 },{ 2,72,488 } }, + { { 69,6,3907 },{ 82,200,3848 },{ 2,24,488 },{ 2,24,488 } }, + { { 77,6,3907 },{ 90,200,3848 },{ 26,120,488 },{ 10,24,488 } }, + { { 97,63,3330 },{ 98,200,3848 },{ 34,120,488 },{ 2,8,496 } }, + { { 106,63,3330 },{ 107,200,3848 },{ 43,120,488 },{ 3,92,488 } }, + { { 114,63,3330 },{ 115,200,3848 },{ 51,120,488 },{ 11,92,488 } }, + { { 122,63,3330 },{ 123,200,3848 },{ 59,120,488 },{ 7,76,496 } }, + { { 130,63,3330 },{ 131,200,3848 },{ 67,120,488 },{ 15,76,496 } }, + { { 139,63,3330 },{ 140,200,3848 },{ 76,120,488 },{ 24,76,496 } }, + { { 147,63,3330 },{ 148,200,3848 },{ 84,120,488 },{ 32,76,496 } }, + { { 155,63,3330 },{ 156,200,3848 },{ 92,120,488 },{ 40,76,496 } }, + { { 163,63,3330 },{ 164,200,3848 },{ 100,120,488 },{ 48,76,496 } }, + { { 172,63,3330 },{ 173,200,3848 },{ 109,120,488 },{ 57,76,496 } }, + { { 184,6,3851 },{ 181,200,3848 },{ 117,120,488 },{ 65,76,496 } }, + { { 192,6,3851 },{ 133,28,3936 },{ 125,120,488 },{ 73,76,496 } }, + { { 189,200,3907 },{ 141,28,3936 },{ 133,120,488 },{ 81,76,496 } }, + { { 198,200,3907 },{ 138,108,4000 },{ 142,120,488 },{ 90,76,496 } }, + { { 206,200,3907 },{ 146,108,4000 },{ 150,120,488 },{ 98,76,496 } }, + { { 214,200,3395 },{ 154,108,4000 },{ 158,120,488 },{ 106,76,496 } }, + { { 190,136,4001 },{ 162,108,4000 },{ 166,120,488 },{ 114,76,496 } }, + { { 123,30,4076 },{ 87,15,4080 },{ 123,30,492 },{ 87,15,496 } }, + { { 117,110,4084 },{ 80,31,4080 },{ 117,110,500 },{ 80,31,496 } }, + { { 125,110,4084 },{ 88,31,4080 },{ 125,110,500 },{ 88,31,496 } }, + { { 133,110,4084 },{ 96,31,4080 },{ 133,110,500 },{ 96,31,496 } }, + { { 9,56,3904 },{ 9,56,3904 },{ 0,67,448 },{ 0,67,448 } }, + { { 1,8,3904 },{ 1,8,3904 },{ 1,84,448 },{ 1,84,448 } }, + { { 1,124,3904 },{ 1,124,3904 },{ 0,39,384 },{ 0,39,384 } }, + { { 9,124,3904 },{ 9,124,3904 },{ 1,4,448 },{ 1,4,448 } }, + { { 6,76,3904 },{ 6,76,3904 },{ 0,70,448 },{ 0,70,448 } }, + { { 62,6,3859 },{ 62,6,3856 },{ 2,38,480 },{ 2,38,480 } }, + { { 70,6,3859 },{ 70,6,3856 },{ 5,43,416 },{ 5,43,416 } }, + { { 78,6,3859 },{ 78,6,3856 },{ 2,11,416 },{ 2,11,416 } }, + { { 87,6,3859 },{ 87,6,3856 },{ 0,171,488 },{ 0,171,488 } }, + { { 67,8,3906 },{ 95,6,3856 },{ 8,171,488 },{ 8,171,488 } }, + { { 75,8,3907 },{ 103,6,3856 },{ 5,123,488 },{ 5,123,488 } }, + { { 83,8,3907 },{ 111,6,3856 },{ 2,75,488 },{ 2,75,488 } }, + { { 92,8,3907 },{ 120,6,3856 },{ 0,27,488 },{ 0,27,488 } }, + { { 100,8,3907 },{ 128,6,3856 },{ 8,27,488 },{ 8,27,488 } }, + { { 120,106,3843 },{ 136,6,3856 },{ 100,6,387 },{ 16,27,488 } }, + { { 128,106,3843 },{ 144,6,3856 },{ 108,6,387 },{ 2,11,496 } }, + { { 137,106,3843 },{ 153,6,3856 },{ 117,6,387 },{ 11,11,496 } }, + { { 145,106,3843 },{ 161,6,3856 },{ 125,6,387 },{ 19,11,496 } }, + { { 163,8,3851 },{ 137,43,3904 },{ 133,6,387 },{ 27,11,496 } }, + { { 171,8,3851 },{ 101,11,4000 },{ 141,6,387 },{ 35,11,496 } }, + { { 180,8,3851 },{ 110,11,4000 },{ 150,6,387 },{ 44,11,496 } }, + { { 188,8,3851 },{ 118,11,4000 },{ 158,6,387 },{ 52,11,496 } }, + { { 172,72,3907 },{ 126,11,4000 },{ 166,6,387 },{ 60,11,496 } }, + { { 174,6,3971 },{ 134,11,4000 },{ 174,6,387 },{ 68,11,496 } }, + { { 183,6,3971 },{ 143,11,4000 },{ 183,6,387 },{ 77,11,496 } }, + { { 191,6,3971 },{ 151,11,4000 },{ 191,6,387 },{ 85,11,496 } }, + { { 199,6,3971 },{ 159,11,4000 },{ 199,6,387 },{ 93,11,496 } }, + { { 92,12,4084 },{ 69,15,4080 },{ 92,12,500 },{ 69,15,496 } }, + { { 101,12,4084 },{ 78,15,4080 },{ 101,12,500 },{ 78,15,496 } }, + { { 109,12,4084 },{ 86,15,4080 },{ 109,12,500 },{ 86,15,496 } }, + { { 117,12,4084 },{ 79,31,4080 },{ 117,12,500 },{ 79,31,496 } }, + { { 125,12,4084 },{ 87,31,4080 },{ 125,12,500 },{ 87,31,496 } }, + { { 71,8,3602 },{ 71,8,3600 },{ 2,21,384 },{ 2,21,384 } }, + { { 79,8,3611 },{ 79,8,3608 },{ 0,69,448 },{ 0,69,448 } }, + { { 87,8,3611 },{ 87,8,3608 },{ 0,23,384 },{ 0,23,384 } }, + { { 95,8,3611 },{ 95,8,3608 },{ 1,5,448 },{ 1,5,448 } }, + { { 104,8,3611 },{ 104,8,3608 },{ 0,88,448 },{ 0,88,448 } }, + { { 112,8,3611 },{ 112,8,3608 },{ 0,72,448 },{ 0,72,448 } }, + { { 120,8,3611 },{ 121,8,3608 },{ 36,21,458 },{ 36,21,456 } }, + { { 133,47,3091 },{ 129,8,3608 },{ 44,21,458 },{ 44,21,456 } }, + { { 142,47,3091 },{ 138,8,3608 },{ 53,21,459 },{ 53,21,456 } }, + { { 98,12,3850 },{ 98,12,3848 },{ 61,21,459 },{ 61,21,456 } }, + { { 106,12,3850 },{ 106,12,3848 },{ 10,92,480 },{ 69,21,456 } }, + { { 114,12,3851 },{ 114,12,3848 },{ 18,92,480 },{ 77,21,456 } }, + { { 87,12,3906 },{ 87,12,3904 },{ 3,44,488 },{ 86,21,456 } }, + { { 95,12,3906 },{ 95,12,3904 },{ 11,44,488 },{ 94,21,456 } }, + { { 103,12,3906 },{ 103,12,3904 },{ 19,44,488 },{ 102,21,456 } }, + { { 111,12,3907 },{ 111,12,3904 },{ 27,44,489 },{ 110,21,456 } }, + { { 120,12,3907 },{ 120,12,3904 },{ 36,44,489 },{ 119,21,456 } }, + { { 128,12,3907 },{ 128,12,3904 },{ 44,44,489 },{ 127,21,456 } }, + { { 136,12,3907 },{ 136,12,3904 },{ 52,44,489 },{ 135,21,456 } }, + { { 144,12,3907 },{ 144,12,3904 },{ 60,44,489 },{ 143,21,456 } }, + { { 153,12,3907 },{ 153,12,3904 },{ 69,44,490 },{ 152,21,456 } }, + { { 161,12,3395 },{ 149,188,3968 },{ 77,44,490 },{ 160,21,456 } }, + { { 169,12,3395 },{ 198,21,3928 },{ 85,44,490 },{ 168,21,456 } }, + { { 113,95,4001 },{ 201,69,3992 },{ 125,8,483 },{ 176,21,456 } }, + { { 122,95,4001 },{ 200,21,3984 },{ 134,8,483 },{ 185,21,456 } }, + { { 142,8,4067 },{ 208,21,3984 },{ 142,8,483 },{ 193,21,456 } }, + { { 151,8,4067 },{ 47,15,4080 },{ 151,8,483 },{ 47,15,496 } }, + { { 159,8,4067 },{ 55,15,4080 },{ 159,8,483 },{ 55,15,496 } }, + { { 168,8,4067 },{ 64,15,4080 },{ 168,8,483 },{ 64,15,496 } }, + { { 160,40,4075 },{ 72,15,4080 },{ 160,40,491 },{ 72,15,496 } }, + { { 168,40,4075 },{ 80,15,4080 },{ 168,40,491 },{ 80,15,496 } }, + { { 144,8,4082 },{ 88,15,4080 },{ 144,8,498 },{ 88,15,496 } } + }; +#endif // BASISD_SUPPORT_ETC2_EAC_A8 + +#if BASISD_WRITE_NEW_ETC2_EAC_A8_TABLES + static void create_etc2_eac_a8_conversion_table() + { + FILE* pFile = fopen("basisu_decoder_tables_etc2_eac_a8.inc", "w"); + + for (uint32_t inten = 0; inten < 8; inten++) + { + for (uint32_t base = 0; base < 32; base++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(base, base, base, 255), false), inten); + + fprintf(pFile, "{"); + + for (uint32_t sel_range = 0; sel_range < NUM_ETC2_EAC_SELECTOR_RANGES; sel_range++) + { + const uint32_t low_selector = s_etc2_eac_selector_ranges[sel_range].m_low; + const uint32_t high_selector = s_etc2_eac_selector_ranges[sel_range].m_high; + + // We have a ETC1 base color and intensity, and a used selector range from low_selector-high_selector. + // Now find the best ETC2 EAC A8 base/table/multiplier that fits these colors. + + uint8_t pixels[4]; + uint32_t num_pixels = 0; + for (uint32_t s = low_selector; s <= high_selector; s++) + pixels[num_pixels++] = block_colors[s].g; + + pack_eac_a8_results pack_results; + pack_eac_a8_exhaustive(pack_results, pixels, num_pixels); + + etc1_g_to_eac_conversion& c = s_etc1_g_to_etc2_a8[base + inten * 32][sel_range]; + + c.m_base = pack_results.m_base; + c.m_table_mul = pack_results.m_table * 16 + pack_results.m_multiplier; + c.m_trans = 0; + + for (uint32_t s = 0; s < 4; s++) + { + if ((s < low_selector) || (s > high_selector)) + continue; + + uint32_t etc2_selector = pack_results.m_selectors[s - low_selector]; + + c.m_trans |= (etc2_selector << (s * 3)); + } + + fprintf(pFile, "{%u,%u,%u}", c.m_base, c.m_table_mul, c.m_trans); + if (sel_range < (NUM_ETC2_EAC_SELECTOR_RANGES - 1)) + fprintf(pFile, ","); + } + + fprintf(pFile, "},\n"); + } + } + + fclose(pFile); + } +#endif + +#if BASISD_WRITE_NEW_ETC2_EAC_R11_TABLES + struct pack_eac_r11_results + { + uint32_t m_base; + uint32_t m_table; + uint32_t m_multiplier; + basisu::vector m_selectors; + basisu::vector m_selectors_temp; + }; + + static uint64_t pack_eac_r11_exhaustive(pack_eac_r11_results& results, const uint8_t* pPixels, uint32_t num_pixels) + { + results.m_selectors.resize(num_pixels); + results.m_selectors_temp.resize(num_pixels); + + uint64_t best_err = UINT64_MAX; + + for (uint32_t base_color = 0; base_color < 256; base_color++) + { + for (uint32_t multiplier = 0; multiplier < 16; multiplier++) + { + for (uint32_t table = 0; table < 16; table++) + { + uint64_t total_err = 0; + + for (uint32_t i = 0; i < num_pixels; i++) + { + // Convert 8-bit input to 11-bits + const int a = (pPixels[i] * 2047 + 128) / 255; + + uint32_t best_s_err = UINT32_MAX; + uint32_t best_s = 0; + for (uint32_t s = 0; s < 8; s++) + { + int v = (int)(multiplier ? (multiplier * 8) : 1) * g_eac_modifier_table[table][s] + (int)base_color * 8 + 4; + if (v < 0) + v = 0; + else if (v > 2047) + v = 2047; + + uint32_t err = abs(a - v); + if (err < best_s_err) + { + best_s_err = err; + best_s = s; + } + } + + results.m_selectors_temp[i] = static_cast(best_s); + + total_err += best_s_err * best_s_err; + if (total_err >= best_err) + break; + } + + if (total_err < best_err) + { + best_err = total_err; + results.m_base = base_color; + results.m_multiplier = multiplier; + results.m_table = table; + results.m_selectors.swap(results.m_selectors_temp); + } + + } // table + + } // multiplier + + } // base_color + + return best_err; + } + + static void create_etc2_eac_r11_conversion_table() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_decoder_tables_etc2_eac_r11.inc", "w"); + + for (uint32_t inten = 0; inten < 8; inten++) + { + for (uint32_t base = 0; base < 32; base++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(base, base, base, 255), false), inten); + + fprintf(pFile, "{"); + + for (uint32_t sel_range = 0; sel_range < NUM_ETC2_EAC_SELECTOR_RANGES; sel_range++) + { + const uint32_t low_selector = s_etc2_eac_selector_ranges[sel_range].m_low; + const uint32_t high_selector = s_etc2_eac_selector_ranges[sel_range].m_high; + + // We have a ETC1 base color and intensity, and a used selector range from low_selector-high_selector. + // Now find the best ETC2 EAC R11 base/table/multiplier that fits these colors. + + uint8_t pixels[4]; + uint32_t num_pixels = 0; + for (uint32_t s = low_selector; s <= high_selector; s++) + pixels[num_pixels++] = block_colors[s].g; + + pack_eac_r11_results pack_results; + pack_eac_r11_exhaustive(pack_results, pixels, num_pixels); + + etc1_g_to_eac_conversion c; + + c.m_base = (uint8_t)pack_results.m_base; + c.m_table_mul = (uint8_t)(pack_results.m_table * 16 + pack_results.m_multiplier); + c.m_trans = 0; + + for (uint32_t s = 0; s < 4; s++) + { + if ((s < low_selector) || (s > high_selector)) + continue; + + uint32_t etc2_selector = pack_results.m_selectors[s - low_selector]; + + c.m_trans |= (etc2_selector << (s * 3)); + } + + fprintf(pFile, "{%u,%u,%u}", c.m_base, c.m_table_mul, c.m_trans); + if (sel_range < (NUM_ETC2_EAC_SELECTOR_RANGES - 1)) + fprintf(pFile, ","); + } + + fprintf(pFile, "},\n"); + } + } + + fclose(pFile); + } +#endif // BASISD_WRITE_NEW_ETC2_EAC_R11_TABLES + +#if BASISD_WRITE_NEW_ASTC_TABLES + static void create_etc1_to_astc_conversion_table_0_47(); + static void create_etc1_to_astc_conversion_table_0_255(); +#endif + +#if BASISD_SUPPORT_ASTC + static void transcoder_init_astc(); +#endif + +#if BASISD_WRITE_NEW_BC7_MODE5_TABLES + static void create_etc1_to_bc7_m5_color_conversion_table(); + static void create_etc1_to_bc7_m5_alpha_conversion_table(); +#endif + +#if BASISD_SUPPORT_BC7_MODE5 + static void transcoder_init_bc7_mode5(); +#endif + +#if BASISD_WRITE_NEW_ATC_TABLES + static void create_etc1s_to_atc_conversion_tables(); +#endif + +#if BASISD_SUPPORT_ATC + static void transcoder_init_atc(); +#endif + +#if BASISD_SUPPORT_PVRTC2 + static void transcoder_init_pvrtc2(); +#endif + +#if BASISD_SUPPORT_UASTC + void uastc_init(); +#endif + + static bool g_transcoder_initialized; + + // Library global initialization. Requires ~9 milliseconds when compiled and executed natively on a Core i7 2.2 GHz. + // If this is too slow, these computed tables can easilky be moved to be compiled in. + void basisu_transcoder_init() + { + if (g_transcoder_initialized) + { + BASISU_DEVEL_ERROR("basisu_transcoder::basisu_transcoder_init: Called more than once\n"); + return; + } + + BASISU_DEVEL_ERROR("basisu_transcoder::basisu_transcoder_init: Initializing (this is not an error)\n"); + +#if BASISD_SUPPORT_UASTC + uastc_init(); +#endif + +#if BASISD_SUPPORT_ASTC + transcoder_init_astc(); +#endif + +#if BASISD_WRITE_NEW_ASTC_TABLES + create_etc1_to_astc_conversion_table_0_47(); + create_etc1_to_astc_conversion_table_0_255(); + exit(0); +#endif + +#if BASISD_WRITE_NEW_BC7_MODE5_TABLES + create_etc1_to_bc7_m5_color_conversion_table(); + create_etc1_to_bc7_m5_alpha_conversion_table(); + exit(0); +#endif + +#if BASISD_WRITE_NEW_DXT1_TABLES + create_etc1_to_dxt1_5_conversion_table(); + create_etc1_to_dxt1_6_conversion_table(); + exit(0); +#endif + +#if BASISD_WRITE_NEW_ETC2_EAC_A8_TABLES + create_etc2_eac_a8_conversion_table(); + exit(0); +#endif + +#if BASISD_WRITE_NEW_ATC_TABLES + create_etc1s_to_atc_conversion_tables(); + exit(0); +#endif + +#if BASISD_WRITE_NEW_ETC2_EAC_R11_TABLES + create_etc2_eac_r11_conversion_table(); + exit(0); +#endif + +#if BASISD_SUPPORT_DXT1 || BASISD_SUPPORT_UASTC + uint8_t bc1_expand5[32]; + for (int i = 0; i < 32; i++) + bc1_expand5[i] = static_cast((i << 3) | (i >> 2)); + prepare_bc1_single_color_table(g_bc1_match5_equals_1, bc1_expand5, 32, 32, 1); + prepare_bc1_single_color_table(g_bc1_match5_equals_0, bc1_expand5, 1, 32, 0); + + uint8_t bc1_expand6[64]; + for (int i = 0; i < 64; i++) + bc1_expand6[i] = static_cast((i << 2) | (i >> 4)); + prepare_bc1_single_color_table(g_bc1_match6_equals_1, bc1_expand6, 64, 64, 1); + prepare_bc1_single_color_table(g_bc1_match6_equals_0, bc1_expand6, 1, 64, 0); + +#if 0 + for (uint32_t i = 0; i < 256; i++) + { + printf("%u %u %u\n", i, (i * 63 + 127) / 255, g_bc1_match6_equals_0[i].m_hi); + } + exit(0); +#endif + +#endif + +#if BASISD_SUPPORT_DXT1 + for (uint32_t i = 0; i < NUM_ETC1_TO_DXT1_SELECTOR_RANGES; i++) + { + uint32_t l = g_etc1_to_dxt1_selector_ranges[i].m_low; + uint32_t h = g_etc1_to_dxt1_selector_ranges[i].m_high; + g_etc1_to_dxt1_selector_range_index[l][h] = i; + } + + for (uint32_t sm = 0; sm < NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS; sm++) + { + uint8_t etc1_to_dxt1_selector_mappings_raw_dxt1[4]; + uint8_t etc1_to_dxt1_selector_mappings_raw_dxt1_inv[4]; + + for (uint32_t j = 0; j < 4; j++) + { + static const uint8_t s_linear_dxt1_to_dxt1[4] = { 0, 2, 3, 1 }; + static const uint8_t s_dxt1_inverted_xlat[4] = { 1, 0, 3, 2 }; + + etc1_to_dxt1_selector_mappings_raw_dxt1[j] = (uint8_t)s_linear_dxt1_to_dxt1[g_etc1_to_dxt1_selector_mappings[sm][j]]; + etc1_to_dxt1_selector_mappings_raw_dxt1_inv[j] = (uint8_t)s_dxt1_inverted_xlat[etc1_to_dxt1_selector_mappings_raw_dxt1[j]]; + } + + for (uint32_t i = 0; i < 256; i++) + { + uint32_t k = 0, k_inv = 0; + for (uint32_t s = 0; s < 4; s++) + { + k |= (etc1_to_dxt1_selector_mappings_raw_dxt1[(i >> (s * 2)) & 3] << (s * 2)); + k_inv |= (etc1_to_dxt1_selector_mappings_raw_dxt1_inv[(i >> (s * 2)) & 3] << (s * 2)); + } + g_etc1_to_dxt1_selector_mappings_raw_dxt1_256[sm][i] = (uint8_t)k; + g_etc1_to_dxt1_selector_mappings_raw_dxt1_inv_256[sm][i] = (uint8_t)k_inv; + } + } +#endif + +#if BASISD_SUPPORT_BC7_MODE5 + transcoder_init_bc7_mode5(); +#endif + +#if BASISD_SUPPORT_ATC + transcoder_init_atc(); +#endif + +#if BASISD_SUPPORT_PVRTC2 + transcoder_init_pvrtc2(); +#endif + + g_transcoder_initialized = true; + } + +#if BASISD_SUPPORT_DXT1 + static void convert_etc1s_to_dxt1(dxt1_block* pDst_block, const endpoint *pEndpoints, const selector* pSelector, bool use_threecolor_blocks) + { +#if !BASISD_WRITE_NEW_DXT1_TABLES + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (low_selector == high_selector) + { + uint32_t r, g, b; + decoder_etc_block::get_block_color5(base_color, inten_table, low_selector, r, g, b); + + uint32_t mask = 0xAA; + uint32_t max16 = (g_bc1_match5_equals_1[r].m_hi << 11) | (g_bc1_match6_equals_1[g].m_hi << 5) | g_bc1_match5_equals_1[b].m_hi; + uint32_t min16 = (g_bc1_match5_equals_1[r].m_lo << 11) | (g_bc1_match6_equals_1[g].m_lo << 5) | g_bc1_match5_equals_1[b].m_lo; + + if ((!use_threecolor_blocks) && (min16 == max16)) + { + // This is an annoying edge case that impacts BC3. + // This is to guarantee that BC3 blocks never use punchthrough alpha (3 color) mode, which isn't supported on some (all?) GPU's. + mask = 0; + + // Make l > h + if (min16 > 0) + min16--; + else + { + // l = h = 0 + assert(min16 == max16 && max16 == 0); + + max16 = 1; + min16 = 0; + mask = 0x55; + } + + assert(max16 > min16); + } + + if (max16 < min16) + { + std::swap(max16, min16); + mask ^= 0x55; + } + + pDst_block->set_low_color(static_cast(max16)); + pDst_block->set_high_color(static_cast(min16)); + pDst_block->m_selectors[0] = static_cast(mask); + pDst_block->m_selectors[1] = static_cast(mask); + pDst_block->m_selectors[2] = static_cast(mask); + pDst_block->m_selectors[3] = static_cast(mask); + + return; + } + else if ((inten_table >= 7) && (pSelector->m_num_unique_selectors == 2) && (pSelector->m_lo_selector == 0) && (pSelector->m_hi_selector == 3)) + { + color32 block_colors[4]; + + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + const uint32_t r0 = block_colors[0].r; + const uint32_t g0 = block_colors[0].g; + const uint32_t b0 = block_colors[0].b; + + const uint32_t r1 = block_colors[3].r; + const uint32_t g1 = block_colors[3].g; + const uint32_t b1 = block_colors[3].b; + + uint32_t max16 = (g_bc1_match5_equals_0[r0].m_hi << 11) | (g_bc1_match6_equals_0[g0].m_hi << 5) | g_bc1_match5_equals_0[b0].m_hi; + uint32_t min16 = (g_bc1_match5_equals_0[r1].m_hi << 11) | (g_bc1_match6_equals_0[g1].m_hi << 5) | g_bc1_match5_equals_0[b1].m_hi; + + uint32_t l = 0, h = 1; + + if (min16 == max16) + { + // Make l > h + if (min16 > 0) + { + min16--; + + l = 0; + h = 0; + } + else + { + // l = h = 0 + assert(min16 == max16 && max16 == 0); + + max16 = 1; + min16 = 0; + + l = 1; + h = 1; + } + + assert(max16 > min16); + } + + if (max16 < min16) + { + std::swap(max16, min16); + l = 1; + h = 0; + } + + pDst_block->set_low_color((uint16_t)max16); + pDst_block->set_high_color((uint16_t)min16); + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + pDst_block->set_selector(x, y, (s == 3) ? h : l); + } + } + + return; + } + + const uint32_t selector_range_table = g_etc1_to_dxt1_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_dxt1_56_solution* pTable_r = &g_etc1_to_dxt_5[(inten_table * 32 + base_color.r) * (NUM_ETC1_TO_DXT1_SELECTOR_RANGES * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS]; + const etc1_to_dxt1_56_solution* pTable_g = &g_etc1_to_dxt_6[(inten_table * 32 + base_color.g) * (NUM_ETC1_TO_DXT1_SELECTOR_RANGES * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS]; + const etc1_to_dxt1_56_solution* pTable_b = &g_etc1_to_dxt_5[(inten_table * 32 + base_color.b) * (NUM_ETC1_TO_DXT1_SELECTOR_RANGES * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS]; + + uint32_t best_err = UINT_MAX; + uint32_t best_mapping = 0; + + assert(NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS == 10); +#define DO_ITER(m) { uint32_t total_err = pTable_r[m].m_err + pTable_g[m].m_err + pTable_b[m].m_err; if (total_err < best_err) { best_err = total_err; best_mapping = m; } } + DO_ITER(0); DO_ITER(1); DO_ITER(2); DO_ITER(3); DO_ITER(4); + DO_ITER(5); DO_ITER(6); DO_ITER(7); DO_ITER(8); DO_ITER(9); +#undef DO_ITER + + uint32_t l = dxt1_block::pack_unscaled_color(pTable_r[best_mapping].m_lo, pTable_g[best_mapping].m_lo, pTable_b[best_mapping].m_lo); + uint32_t h = dxt1_block::pack_unscaled_color(pTable_r[best_mapping].m_hi, pTable_g[best_mapping].m_hi, pTable_b[best_mapping].m_hi); + + const uint8_t* pSelectors_xlat_256 = &g_etc1_to_dxt1_selector_mappings_raw_dxt1_256[best_mapping][0]; + + if (l < h) + { + std::swap(l, h); + pSelectors_xlat_256 = &g_etc1_to_dxt1_selector_mappings_raw_dxt1_inv_256[best_mapping][0]; + } + + pDst_block->set_low_color(static_cast(l)); + pDst_block->set_high_color(static_cast(h)); + + if (l == h) + { + uint8_t mask = 0; + + if (!use_threecolor_blocks) + { + // This is an annoying edge case that impacts BC3. + + // Make l > h + if (h > 0) + h--; + else + { + // l = h = 0 + assert(l == h && h == 0); + + h = 0; + l = 1; + mask = 0x55; + } + + assert(l > h); + pDst_block->set_low_color(static_cast(l)); + pDst_block->set_high_color(static_cast(h)); + } + + pDst_block->m_selectors[0] = mask; + pDst_block->m_selectors[1] = mask; + pDst_block->m_selectors[2] = mask; + pDst_block->m_selectors[3] = mask; + + return; + } + + pDst_block->m_selectors[0] = pSelectors_xlat_256[pSelector->m_selectors[0]]; + pDst_block->m_selectors[1] = pSelectors_xlat_256[pSelector->m_selectors[1]]; + pDst_block->m_selectors[2] = pSelectors_xlat_256[pSelector->m_selectors[2]]; + pDst_block->m_selectors[3] = pSelectors_xlat_256[pSelector->m_selectors[3]]; +#endif + } + +#if BASISD_ENABLE_DEBUG_FLAGS + static void convert_etc1s_to_dxt1_vis(dxt1_block* pDst_block, const endpoint* pEndpoints, const selector* pSelector, bool use_threecolor_blocks) + { + convert_etc1s_to_dxt1(pDst_block, pEndpoints, pSelector, use_threecolor_blocks); + + if (g_debug_flags & cDebugFlagVisBC1Sels) + { + uint32_t l = dxt1_block::pack_unscaled_color(31, 63, 31); + uint32_t h = dxt1_block::pack_unscaled_color(0, 0, 0); + pDst_block->set_low_color(static_cast(l)); + pDst_block->set_high_color(static_cast(h)); + } + else if (g_debug_flags & cDebugFlagVisBC1Endpoints) + { + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + pDst_block->set_selector(x, y, (y < 2) ? 0 : 1); + } + } +#endif +#endif + +#if BASISD_SUPPORT_FXT1 + struct fxt1_block + { + union + { + struct + { + uint64_t m_t00 : 2; + uint64_t m_t01 : 2; + uint64_t m_t02 : 2; + uint64_t m_t03 : 2; + uint64_t m_t04 : 2; + uint64_t m_t05 : 2; + uint64_t m_t06 : 2; + uint64_t m_t07 : 2; + uint64_t m_t08 : 2; + uint64_t m_t09 : 2; + uint64_t m_t10 : 2; + uint64_t m_t11 : 2; + uint64_t m_t12 : 2; + uint64_t m_t13 : 2; + uint64_t m_t14 : 2; + uint64_t m_t15 : 2; + uint64_t m_t16 : 2; + uint64_t m_t17 : 2; + uint64_t m_t18 : 2; + uint64_t m_t19 : 2; + uint64_t m_t20 : 2; + uint64_t m_t21 : 2; + uint64_t m_t22 : 2; + uint64_t m_t23 : 2; + uint64_t m_t24 : 2; + uint64_t m_t25 : 2; + uint64_t m_t26 : 2; + uint64_t m_t27 : 2; + uint64_t m_t28 : 2; + uint64_t m_t29 : 2; + uint64_t m_t30 : 2; + uint64_t m_t31 : 2; + } m_lo; + uint64_t m_lo_bits; + uint8_t m_sels[8]; + }; + union + { + struct + { +#ifdef BASISU_USE_ORIGINAL_3DFX_FXT1_ENCODING + uint64_t m_b1 : 5; + uint64_t m_g1 : 5; + uint64_t m_r1 : 5; + uint64_t m_b0 : 5; + uint64_t m_g0 : 5; + uint64_t m_r0 : 5; + uint64_t m_b3 : 5; + uint64_t m_g3 : 5; + uint64_t m_r3 : 5; + uint64_t m_b2 : 5; + uint64_t m_g2 : 5; + uint64_t m_r2 : 5; +#else + uint64_t m_b0 : 5; + uint64_t m_g0 : 5; + uint64_t m_r0 : 5; + uint64_t m_b1 : 5; + uint64_t m_g1 : 5; + uint64_t m_r1 : 5; + uint64_t m_b2 : 5; + uint64_t m_g2 : 5; + uint64_t m_r2 : 5; + uint64_t m_b3 : 5; + uint64_t m_g3 : 5; + uint64_t m_r3 : 5; +#endif + uint64_t m_alpha : 1; + uint64_t m_glsb : 2; + uint64_t m_mode : 1; + } m_hi; + uint64_t m_hi_bits; + }; + }; + + static uint8_t conv_dxt1_to_fxt1_sels(uint32_t sels) + { + static uint8_t s_conv_table[16] = { 0, 3, 1, 2, 12, 15, 13, 14, 4, 7, 5, 6, 8, 11, 9, 10 }; + return s_conv_table[sels & 15] | (s_conv_table[sels >> 4] << 4); + } + + static void convert_etc1s_to_fxt1(void *pDst, const endpoint *pEndpoints, const selector *pSelectors, uint32_t fxt1_subblock) + { + fxt1_block* pBlock = static_cast(pDst); + + // CC_MIXED is basically DXT1 with different encoding tricks. + // So transcode ETC1S to DXT1, then transcode that to FXT1 which is easy and nearly lossless. + // (It's not completely lossless because FXT1 rounds in its color lerps while DXT1 doesn't, but it should be good enough.) + dxt1_block blk; + convert_etc1s_to_dxt1(&blk, pEndpoints, pSelectors, false); + + const uint32_t l = blk.get_low_color(); + const uint32_t h = blk.get_high_color(); + + color32 color0((l >> 11) & 31, (l >> 5) & 63, l & 31, 255); + color32 color1((h >> 11) & 31, (h >> 5) & 63, h & 31, 255); + + uint32_t g0 = color0.g & 1; + uint32_t g1 = color1.g & 1; + + color0.g >>= 1; + color1.g >>= 1; + + blk.m_selectors[0] = conv_dxt1_to_fxt1_sels(blk.m_selectors[0]); + blk.m_selectors[1] = conv_dxt1_to_fxt1_sels(blk.m_selectors[1]); + blk.m_selectors[2] = conv_dxt1_to_fxt1_sels(blk.m_selectors[2]); + blk.m_selectors[3] = conv_dxt1_to_fxt1_sels(blk.m_selectors[3]); + + if ((blk.get_selector(0, 0) >> 1) != (g0 ^ g1)) + { + std::swap(color0, color1); + std::swap(g0, g1); + + blk.m_selectors[0] ^= 0xFF; + blk.m_selectors[1] ^= 0xFF; + blk.m_selectors[2] ^= 0xFF; + blk.m_selectors[3] ^= 0xFF; + } + + if (fxt1_subblock == 0) + { + pBlock->m_hi.m_mode = 1; + pBlock->m_hi.m_alpha = 0; + pBlock->m_hi.m_glsb = g1 | (g1 << 1); + pBlock->m_hi.m_r0 = color0.r; + pBlock->m_hi.m_g0 = color0.g; + pBlock->m_hi.m_b0 = color0.b; + pBlock->m_hi.m_r1 = color1.r; + pBlock->m_hi.m_g1 = color1.g; + pBlock->m_hi.m_b1 = color1.b; + pBlock->m_hi.m_r2 = color0.r; + pBlock->m_hi.m_g2 = color0.g; + pBlock->m_hi.m_b2 = color0.b; + pBlock->m_hi.m_r3 = color1.r; + pBlock->m_hi.m_g3 = color1.g; + pBlock->m_hi.m_b3 = color1.b; + pBlock->m_sels[0] = blk.m_selectors[0]; + pBlock->m_sels[1] = blk.m_selectors[1]; + pBlock->m_sels[2] = blk.m_selectors[2]; + pBlock->m_sels[3] = blk.m_selectors[3]; + + static const uint8_t s_border_dup[4] = { 0, 85, 170, 255 }; + pBlock->m_sels[4] = s_border_dup[blk.m_selectors[0] >> 6]; + pBlock->m_sels[5] = s_border_dup[blk.m_selectors[1] >> 6]; + pBlock->m_sels[6] = s_border_dup[blk.m_selectors[2] >> 6]; + pBlock->m_sels[7] = s_border_dup[blk.m_selectors[3] >> 6]; + } + else + { + pBlock->m_hi.m_glsb = (pBlock->m_hi.m_glsb & 1) | (g1 << 1); + pBlock->m_hi.m_r2 = color0.r; + pBlock->m_hi.m_g2 = color0.g; + pBlock->m_hi.m_b2 = color0.b; + pBlock->m_hi.m_r3 = color1.r; + pBlock->m_hi.m_g3 = color1.g; + pBlock->m_hi.m_b3 = color1.b; + pBlock->m_sels[4] = blk.m_selectors[0]; + pBlock->m_sels[5] = blk.m_selectors[1]; + pBlock->m_sels[6] = blk.m_selectors[2]; + pBlock->m_sels[7] = blk.m_selectors[3]; + } + } +#endif // BASISD_SUPPORT_FXT1 +#if BASISD_SUPPORT_DXT5A + static dxt_selector_range s_dxt5a_selector_ranges[] = + { + { 0, 3 }, + + { 1, 3 }, + { 0, 2 }, + + { 1, 2 }, + }; + + const uint32_t NUM_DXT5A_SELECTOR_RANGES = sizeof(s_dxt5a_selector_ranges) / sizeof(s_dxt5a_selector_ranges[0]); + + struct etc1_g_to_dxt5a_conversion + { + uint8_t m_lo, m_hi; + uint16_t m_trans; + }; + + static etc1_g_to_dxt5a_conversion g_etc1_g_to_dxt5a[32 * 8][NUM_DXT5A_SELECTOR_RANGES] = + { + { { 8, 0, 393 },{ 8, 0, 392 },{ 2, 0, 9 },{ 2, 0, 8 }, }, { { 6, 16, 710 },{ 16, 6, 328 },{ 0, 10, 96 },{ 10, 6, 8 }, }, + { { 28, 5, 1327 },{ 24, 14, 328 },{ 8, 18, 96 },{ 18, 14, 8 }, }, { { 36, 13, 1327 },{ 32, 22, 328 },{ 16, 26, 96 },{ 26, 22, 8 }, }, + { { 45, 22, 1327 },{ 41, 31, 328 },{ 25, 35, 96 },{ 35, 31, 8 }, }, { { 53, 30, 1327 },{ 49, 39, 328 },{ 33, 43, 96 },{ 43, 39, 8 }, }, + { { 61, 38, 1327 },{ 57, 47, 328 },{ 41, 51, 96 },{ 51, 47, 8 }, }, { { 69, 46, 1327 },{ 65, 55, 328 },{ 49, 59, 96 },{ 59, 55, 8 }, }, + { { 78, 55, 1327 },{ 74, 64, 328 },{ 58, 68, 96 },{ 68, 64, 8 }, }, { { 86, 63, 1327 },{ 82, 72, 328 },{ 66, 76, 96 },{ 76, 72, 8 }, }, + { { 94, 71, 1327 },{ 90, 80, 328 },{ 74, 84, 96 },{ 84, 80, 8 }, }, { { 102, 79, 1327 },{ 98, 88, 328 },{ 82, 92, 96 },{ 92, 88, 8 }, }, + { { 111, 88, 1327 },{ 107, 97, 328 },{ 91, 101, 96 },{ 101, 97, 8 }, }, { { 119, 96, 1327 },{ 115, 105, 328 },{ 99, 109, 96 },{ 109, 105, 8 }, }, + { { 127, 104, 1327 },{ 123, 113, 328 },{ 107, 117, 96 },{ 117, 113, 8 }, }, { { 135, 112, 1327 },{ 131, 121, 328 },{ 115, 125, 96 },{ 125, 121, 8 }, }, + { { 144, 121, 1327 },{ 140, 130, 328 },{ 124, 134, 96 },{ 134, 130, 8 }, }, { { 152, 129, 1327 },{ 148, 138, 328 },{ 132, 142, 96 },{ 142, 138, 8 }, }, + { { 160, 137, 1327 },{ 156, 146, 328 },{ 140, 150, 96 },{ 150, 146, 8 }, }, { { 168, 145, 1327 },{ 164, 154, 328 },{ 148, 158, 96 },{ 158, 154, 8 }, }, + { { 177, 154, 1327 },{ 173, 163, 328 },{ 157, 167, 96 },{ 167, 163, 8 }, }, { { 185, 162, 1327 },{ 181, 171, 328 },{ 165, 175, 96 },{ 175, 171, 8 }, }, + { { 193, 170, 1327 },{ 189, 179, 328 },{ 173, 183, 96 },{ 183, 179, 8 }, }, { { 201, 178, 1327 },{ 197, 187, 328 },{ 181, 191, 96 },{ 191, 187, 8 }, }, + { { 210, 187, 1327 },{ 206, 196, 328 },{ 190, 200, 96 },{ 200, 196, 8 }, }, { { 218, 195, 1327 },{ 214, 204, 328 },{ 198, 208, 96 },{ 208, 204, 8 }, }, + { { 226, 203, 1327 },{ 222, 212, 328 },{ 206, 216, 96 },{ 216, 212, 8 }, }, { { 234, 211, 1327 },{ 230, 220, 328 },{ 214, 224, 96 },{ 224, 220, 8 }, }, + { { 243, 220, 1327 },{ 239, 229, 328 },{ 223, 233, 96 },{ 233, 229, 8 }, }, { { 251, 228, 1327 },{ 247, 237, 328 },{ 231, 241, 96 },{ 241, 237, 8 }, }, + { { 239, 249, 3680 },{ 245, 249, 3648 },{ 239, 249, 96 },{ 249, 245, 8 }, }, { { 247, 253, 4040 },{ 255, 253, 8 },{ 247, 253, 456 },{ 255, 253, 8 }, }, + { { 5, 17, 566 },{ 5, 17, 560 },{ 5, 0, 9 },{ 5, 0, 8 }, }, { { 25, 0, 313 },{ 25, 3, 328 },{ 13, 0, 49 },{ 13, 3, 8 }, }, + { { 39, 0, 1329 },{ 33, 11, 328 },{ 11, 21, 70 },{ 21, 11, 8 }, }, { { 47, 7, 1329 },{ 41, 19, 328 },{ 29, 7, 33 },{ 29, 19, 8 }, }, + { { 50, 11, 239 },{ 50, 28, 328 },{ 38, 16, 33 },{ 38, 28, 8 }, }, { { 92, 13, 2423 },{ 58, 36, 328 },{ 46, 24, 33 },{ 46, 36, 8 }, }, + { { 100, 21, 2423 },{ 66, 44, 328 },{ 54, 32, 33 },{ 54, 44, 8 }, }, { { 86, 7, 1253 },{ 74, 52, 328 },{ 62, 40, 33 },{ 62, 52, 8 }, }, + { { 95, 16, 1253 },{ 83, 61, 328 },{ 71, 49, 33 },{ 71, 61, 8 }, }, { { 103, 24, 1253 },{ 91, 69, 328 },{ 79, 57, 33 },{ 79, 69, 8 }, }, + { { 111, 32, 1253 },{ 99, 77, 328 },{ 87, 65, 33 },{ 87, 77, 8 }, }, { { 119, 40, 1253 },{ 107, 85, 328 },{ 95, 73, 33 },{ 95, 85, 8 }, }, + { { 128, 49, 1253 },{ 116, 94, 328 },{ 104, 82, 33 },{ 104, 94, 8 }, }, { { 136, 57, 1253 },{ 124, 102, 328 },{ 112, 90, 33 },{ 112, 102, 8 }, }, + { { 144, 65, 1253 },{ 132, 110, 328 },{ 120, 98, 33 },{ 120, 110, 8 }, }, { { 152, 73, 1253 },{ 140, 118, 328 },{ 128, 106, 33 },{ 128, 118, 8 }, }, + { { 161, 82, 1253 },{ 149, 127, 328 },{ 137, 115, 33 },{ 137, 127, 8 }, }, { { 169, 90, 1253 },{ 157, 135, 328 },{ 145, 123, 33 },{ 145, 135, 8 }, }, + { { 177, 98, 1253 },{ 165, 143, 328 },{ 153, 131, 33 },{ 153, 143, 8 }, }, { { 185, 106, 1253 },{ 173, 151, 328 },{ 161, 139, 33 },{ 161, 151, 8 }, }, + { { 194, 115, 1253 },{ 182, 160, 328 },{ 170, 148, 33 },{ 170, 160, 8 }, }, { { 202, 123, 1253 },{ 190, 168, 328 },{ 178, 156, 33 },{ 178, 168, 8 }, }, + { { 210, 131, 1253 },{ 198, 176, 328 },{ 186, 164, 33 },{ 186, 176, 8 }, }, { { 218, 139, 1253 },{ 206, 184, 328 },{ 194, 172, 33 },{ 194, 184, 8 }, }, + { { 227, 148, 1253 },{ 215, 193, 328 },{ 203, 181, 33 },{ 203, 193, 8 }, }, { { 235, 156, 1253 },{ 223, 201, 328 },{ 211, 189, 33 },{ 211, 201, 8 }, }, + { { 243, 164, 1253 },{ 231, 209, 328 },{ 219, 197, 33 },{ 219, 209, 8 }, }, { { 183, 239, 867 },{ 239, 217, 328 },{ 227, 205, 33 },{ 227, 217, 8 }, }, + { { 254, 214, 1329 },{ 248, 226, 328 },{ 236, 214, 33 },{ 236, 226, 8 }, }, { { 222, 244, 3680 },{ 234, 244, 3648 },{ 244, 222, 33 },{ 244, 234, 8 }, }, + { { 230, 252, 3680 },{ 242, 252, 3648 },{ 252, 230, 33 },{ 252, 242, 8 }, }, { { 238, 250, 4040 },{ 255, 250, 8 },{ 238, 250, 456 },{ 255, 250, 8 }, }, + { { 9, 29, 566 },{ 9, 29, 560 },{ 9, 0, 9 },{ 9, 0, 8 }, }, { { 17, 37, 566 },{ 17, 37, 560 },{ 17, 0, 9 },{ 17, 0, 8 }, }, + { { 45, 0, 313 },{ 45, 0, 312 },{ 25, 0, 49 },{ 25, 7, 8 }, }, { { 14, 63, 2758 },{ 5, 53, 784 },{ 15, 33, 70 },{ 33, 15, 8 }, }, + { { 71, 6, 1329 },{ 72, 4, 1328 },{ 42, 4, 33 },{ 42, 24, 8 }, }, { { 70, 3, 239 },{ 70, 2, 232 },{ 50, 12, 33 },{ 50, 32, 8 }, }, + { { 0, 98, 2842 },{ 78, 10, 232 },{ 58, 20, 33 },{ 58, 40, 8 }, }, { { 97, 27, 1329 },{ 86, 18, 232 },{ 66, 28, 33 },{ 66, 48, 8 }, }, + { { 0, 94, 867 },{ 95, 27, 232 },{ 75, 37, 33 },{ 75, 57, 8 }, }, { { 8, 102, 867 },{ 103, 35, 232 },{ 83, 45, 33 },{ 83, 65, 8 }, }, + { { 12, 112, 867 },{ 111, 43, 232 },{ 91, 53, 33 },{ 91, 73, 8 }, }, { { 139, 2, 1253 },{ 119, 51, 232 },{ 99, 61, 33 },{ 99, 81, 8 }, }, + { { 148, 13, 1253 },{ 128, 60, 232 },{ 108, 70, 33 },{ 108, 90, 8 }, }, { { 156, 21, 1253 },{ 136, 68, 232 },{ 116, 78, 33 },{ 116, 98, 8 }, }, + { { 164, 29, 1253 },{ 144, 76, 232 },{ 124, 86, 33 },{ 124, 106, 8 }, }, { { 172, 37, 1253 },{ 152, 84, 232 },{ 132, 94, 33 },{ 132, 114, 8 }, }, + { { 181, 46, 1253 },{ 161, 93, 232 },{ 141, 103, 33 },{ 141, 123, 8 }, }, { { 189, 54, 1253 },{ 169, 101, 232 },{ 149, 111, 33 },{ 149, 131, 8 }, }, + { { 197, 62, 1253 },{ 177, 109, 232 },{ 157, 119, 33 },{ 157, 139, 8 }, }, { { 205, 70, 1253 },{ 185, 117, 232 },{ 165, 127, 33 },{ 165, 147, 8 }, }, + { { 214, 79, 1253 },{ 194, 126, 232 },{ 174, 136, 33 },{ 174, 156, 8 }, }, { { 222, 87, 1253 },{ 202, 134, 232 },{ 182, 144, 33 },{ 182, 164, 8 }, }, + { { 230, 95, 1253 },{ 210, 142, 232 },{ 190, 152, 33 },{ 190, 172, 8 }, }, { { 238, 103, 1253 },{ 218, 150, 232 },{ 198, 160, 33 },{ 198, 180, 8 }, }, + { { 247, 112, 1253 },{ 227, 159, 232 },{ 207, 169, 33 },{ 207, 189, 8 }, }, { { 255, 120, 1253 },{ 235, 167, 232 },{ 215, 177, 33 },{ 215, 197, 8 }, }, + { { 146, 243, 867 },{ 243, 175, 232 },{ 223, 185, 33 },{ 223, 205, 8 }, }, { { 184, 231, 3682 },{ 203, 251, 784 },{ 231, 193, 33 },{ 231, 213, 8 }, }, + { { 193, 240, 3682 },{ 222, 240, 3648 },{ 240, 202, 33 },{ 240, 222, 8 }, }, { { 255, 210, 169 },{ 230, 248, 3648 },{ 248, 210, 33 },{ 248, 230, 8 }, }, + { { 218, 238, 4040 },{ 255, 238, 8 },{ 218, 238, 456 },{ 255, 238, 8 }, }, { { 226, 246, 4040 },{ 255, 246, 8 },{ 226, 246, 456 },{ 255, 246, 8 }, }, + { { 13, 42, 566 },{ 13, 42, 560 },{ 13, 0, 9 },{ 13, 0, 8 }, }, { { 50, 0, 329 },{ 50, 0, 328 },{ 21, 0, 9 },{ 21, 0, 8 }, }, + { { 29, 58, 566 },{ 67, 2, 1352 },{ 3, 29, 70 },{ 29, 3, 8 }, }, { { 10, 79, 2758 },{ 76, 11, 1352 },{ 11, 37, 70 },{ 37, 11, 8 }, }, + { { 7, 75, 790 },{ 7, 75, 784 },{ 20, 46, 70 },{ 46, 20, 8 }, }, { { 15, 83, 790 },{ 97, 1, 1328 },{ 28, 54, 70 },{ 54, 28, 8 }, }, + { { 101, 7, 1329 },{ 105, 9, 1328 },{ 62, 0, 39 },{ 62, 36, 8 }, }, { { 99, 1, 239 },{ 99, 3, 232 },{ 1, 71, 98 },{ 70, 44, 8 }, }, + { { 107, 11, 239 },{ 108, 12, 232 },{ 10, 80, 98 },{ 79, 53, 8 }, }, { { 115, 19, 239 },{ 116, 20, 232 },{ 18, 88, 98 },{ 87, 61, 8 }, }, + { { 123, 27, 239 },{ 124, 28, 232 },{ 26, 96, 98 },{ 95, 69, 8 }, }, { { 131, 35, 239 },{ 132, 36, 232 },{ 34, 104, 98 },{ 103, 77, 8 }, }, + { { 140, 44, 239 },{ 141, 45, 232 },{ 43, 113, 98 },{ 112, 86, 8 }, }, { { 148, 52, 239 },{ 149, 53, 232 },{ 51, 121, 98 },{ 120, 94, 8 }, }, + { { 156, 60, 239 },{ 157, 61, 232 },{ 59, 129, 98 },{ 128, 102, 8 }, }, { { 164, 68, 239 },{ 165, 69, 232 },{ 67, 137, 98 },{ 136, 110, 8 }, }, + { { 173, 77, 239 },{ 174, 78, 232 },{ 76, 146, 98 },{ 145, 119, 8 }, }, { { 181, 85, 239 },{ 182, 86, 232 },{ 84, 154, 98 },{ 153, 127, 8 }, }, + { { 189, 93, 239 },{ 190, 94, 232 },{ 92, 162, 98 },{ 161, 135, 8 }, }, { { 197, 101, 239 },{ 198, 102, 232 },{ 100, 170, 98 },{ 169, 143, 8 }, }, + { { 206, 110, 239 },{ 207, 111, 232 },{ 109, 179, 98 },{ 178, 152, 8 }, }, { { 214, 118, 239 },{ 215, 119, 232 },{ 117, 187, 98 },{ 186, 160, 8 }, }, + { { 222, 126, 239 },{ 223, 127, 232 },{ 125, 195, 98 },{ 194, 168, 8 }, }, { { 230, 134, 239 },{ 231, 135, 232 },{ 133, 203, 98 },{ 202, 176, 8 }, }, + { { 239, 143, 239 },{ 240, 144, 232 },{ 142, 212, 98 },{ 211, 185, 8 }, }, { { 247, 151, 239 },{ 180, 248, 784 },{ 150, 220, 98 },{ 219, 193, 8 }, }, + { { 159, 228, 3682 },{ 201, 227, 3648 },{ 158, 228, 98 },{ 227, 201, 8 }, }, { { 181, 249, 3928 },{ 209, 235, 3648 },{ 166, 236, 98 },{ 235, 209, 8 }, }, + { { 255, 189, 169 },{ 218, 244, 3648 },{ 175, 245, 98 },{ 244, 218, 8 }, }, { { 197, 226, 4040 },{ 226, 252, 3648 },{ 183, 253, 98 },{ 252, 226, 8 }, }, + { { 205, 234, 4040 },{ 255, 234, 8 },{ 205, 234, 456 },{ 255, 234, 8 }, }, { { 213, 242, 4040 },{ 255, 242, 8 },{ 213, 242, 456 },{ 255, 242, 8 }, }, + { { 18, 60, 566 },{ 18, 60, 560 },{ 18, 0, 9 },{ 18, 0, 8 }, }, { { 26, 68, 566 },{ 26, 68, 560 },{ 26, 0, 9 },{ 26, 0, 8 }, }, + { { 34, 76, 566 },{ 34, 76, 560 },{ 34, 0, 9 },{ 34, 0, 8 }, }, { { 5, 104, 2758 },{ 98, 5, 1352 },{ 42, 0, 57 },{ 42, 6, 8 }, }, + { { 92, 0, 313 },{ 93, 1, 312 },{ 15, 51, 70 },{ 51, 15, 8 }, }, { { 3, 101, 790 },{ 3, 101, 784 },{ 0, 59, 88 },{ 59, 23, 8 }, }, + { { 14, 107, 790 },{ 11, 109, 784 },{ 31, 67, 70 },{ 67, 31, 8 }, }, { { 19, 117, 790 },{ 19, 117, 784 },{ 39, 75, 70 },{ 75, 39, 8 }, }, + { { 28, 126, 790 },{ 28, 126, 784 },{ 83, 5, 33 },{ 84, 48, 8 }, }, { { 132, 0, 239 },{ 36, 134, 784 },{ 91, 13, 33 },{ 92, 56, 8 }, }, + { { 142, 4, 239 },{ 44, 142, 784 },{ 99, 21, 33 },{ 100, 64, 8 }, }, { { 150, 12, 239 },{ 52, 150, 784 },{ 107, 29, 33 },{ 108, 72, 8 }, }, + { { 159, 21, 239 },{ 61, 159, 784 },{ 116, 38, 33 },{ 117, 81, 8 }, }, { { 167, 29, 239 },{ 69, 167, 784 },{ 124, 46, 33 },{ 125, 89, 8 }, }, + { { 175, 37, 239 },{ 77, 175, 784 },{ 132, 54, 33 },{ 133, 97, 8 }, }, { { 183, 45, 239 },{ 85, 183, 784 },{ 140, 62, 33 },{ 141, 105, 8 }, }, + { { 192, 54, 239 },{ 94, 192, 784 },{ 149, 71, 33 },{ 150, 114, 8 }, }, { { 200, 62, 239 },{ 102, 200, 784 },{ 157, 79, 33 },{ 158, 122, 8 }, }, + { { 208, 70, 239 },{ 110, 208, 784 },{ 165, 87, 33 },{ 166, 130, 8 }, }, { { 216, 78, 239 },{ 118, 216, 784 },{ 173, 95, 33 },{ 174, 138, 8 }, }, + { { 225, 87, 239 },{ 127, 225, 784 },{ 182, 104, 33 },{ 183, 147, 8 }, }, { { 233, 95, 239 },{ 135, 233, 784 },{ 190, 112, 33 },{ 191, 155, 8 }, }, + { { 241, 103, 239 },{ 143, 241, 784 },{ 198, 120, 33 },{ 199, 163, 8 }, }, { { 111, 208, 3682 },{ 151, 249, 784 },{ 206, 128, 33 },{ 207, 171, 8 }, }, + { { 120, 217, 3682 },{ 180, 216, 3648 },{ 215, 137, 33 },{ 216, 180, 8 }, }, { { 128, 225, 3682 },{ 188, 224, 3648 },{ 223, 145, 33 },{ 224, 188, 8 }, }, + { { 155, 253, 3928 },{ 196, 232, 3648 },{ 231, 153, 33 },{ 232, 196, 8 }, }, { { 144, 241, 3682 },{ 204, 240, 3648 },{ 239, 161, 33 },{ 240, 204, 8 }, }, + { { 153, 250, 3682 },{ 213, 249, 3648 },{ 248, 170, 33 },{ 249, 213, 8 }, }, { { 179, 221, 4040 },{ 255, 221, 8 },{ 179, 221, 456 },{ 255, 221, 8 }, }, + { { 187, 229, 4040 },{ 255, 229, 8 },{ 187, 229, 456 },{ 255, 229, 8 }, }, { { 195, 237, 4040 },{ 255, 237, 8 },{ 195, 237, 456 },{ 255, 237, 8 }, }, + { { 24, 80, 566 },{ 24, 80, 560 },{ 24, 0, 9 },{ 24, 0, 8 }, }, { { 32, 88, 566 },{ 32, 88, 560 },{ 32, 0, 9 },{ 32, 0, 8 }, }, + { { 40, 96, 566 },{ 40, 96, 560 },{ 40, 0, 9 },{ 40, 0, 8 }, }, { { 48, 104, 566 },{ 48, 104, 560 },{ 48, 0, 9 },{ 48, 0, 8 }, }, + { { 9, 138, 2758 },{ 130, 7, 1352 },{ 9, 57, 70 },{ 57, 9, 8 }, }, { { 119, 0, 313 },{ 120, 0, 312 },{ 17, 65, 70 },{ 65, 17, 8 }, }, + { { 0, 128, 784 },{ 128, 6, 312 },{ 25, 73, 70 },{ 73, 25, 8 }, }, { { 6, 137, 790 },{ 5, 136, 784 },{ 33, 81, 70 },{ 81, 33, 8 }, }, + { { 42, 171, 2758 },{ 14, 145, 784 },{ 42, 90, 70 },{ 90, 42, 8 }, }, { { 50, 179, 2758 },{ 22, 153, 784 },{ 50, 98, 70 },{ 98, 50, 8 }, }, + { { 58, 187, 2758 },{ 30, 161, 784 },{ 58, 106, 70 },{ 106, 58, 8 }, }, { { 191, 18, 1329 },{ 38, 169, 784 },{ 112, 9, 33 },{ 114, 66, 8 }, }, + { { 176, 0, 239 },{ 47, 178, 784 },{ 121, 18, 33 },{ 123, 75, 8 }, }, { { 187, 1, 239 },{ 55, 186, 784 },{ 129, 26, 33 },{ 131, 83, 8 }, }, + { { 195, 10, 239 },{ 63, 194, 784 },{ 137, 34, 33 },{ 139, 91, 8 }, }, { { 203, 18, 239 },{ 71, 202, 784 },{ 145, 42, 33 },{ 147, 99, 8 }, }, + { { 212, 27, 239 },{ 80, 211, 784 },{ 154, 51, 33 },{ 156, 108, 8 }, }, { { 220, 35, 239 },{ 88, 219, 784 },{ 162, 59, 33 },{ 164, 116, 8 }, }, + { { 228, 43, 239 },{ 96, 227, 784 },{ 170, 67, 33 },{ 172, 124, 8 }, }, { { 236, 51, 239 },{ 104, 235, 784 },{ 178, 75, 33 },{ 180, 132, 8 }, }, + { { 245, 60, 239 },{ 113, 244, 784 },{ 187, 84, 33 },{ 189, 141, 8 }, }, { { 91, 194, 3680 },{ 149, 197, 3648 },{ 195, 92, 33 },{ 197, 149, 8 }, }, + { { 99, 202, 3680 },{ 157, 205, 3648 },{ 203, 100, 33 },{ 205, 157, 8 }, }, { { 107, 210, 3680 },{ 165, 213, 3648 },{ 211, 108, 33 },{ 213, 165, 8 }, }, + { { 119, 249, 3928 },{ 174, 222, 3648 },{ 220, 117, 33 },{ 222, 174, 8 }, }, { { 127, 255, 856 },{ 182, 230, 3648 },{ 228, 125, 33 },{ 230, 182, 8 }, }, + { { 255, 135, 169 },{ 190, 238, 3648 },{ 236, 133, 33 },{ 238, 190, 8 }, }, { { 140, 243, 3680 },{ 198, 246, 3648 },{ 244, 141, 33 },{ 246, 198, 8 }, }, + { { 151, 207, 4040 },{ 255, 207, 8 },{ 151, 207, 456 },{ 255, 207, 8 }, }, { { 159, 215, 4040 },{ 255, 215, 8 },{ 159, 215, 456 },{ 255, 215, 8 }, }, + { { 167, 223, 4040 },{ 255, 223, 8 },{ 167, 223, 456 },{ 255, 223, 8 }, }, { { 175, 231, 4040 },{ 255, 231, 8 },{ 175, 231, 456 },{ 255, 231, 8 }, }, + { { 33, 106, 566 },{ 33, 106, 560 },{ 33, 0, 9 },{ 33, 0, 8 }, }, { { 41, 114, 566 },{ 41, 114, 560 },{ 41, 0, 9 },{ 41, 0, 8 }, }, + { { 49, 122, 566 },{ 49, 122, 560 },{ 49, 0, 9 },{ 49, 0, 8 }, }, { { 57, 130, 566 },{ 57, 130, 560 },{ 57, 0, 9 },{ 57, 0, 8 }, }, + { { 66, 139, 566 },{ 66, 139, 560 },{ 66, 0, 9 },{ 66, 0, 8 }, }, { { 74, 147, 566 },{ 170, 7, 1352 },{ 8, 74, 70 },{ 74, 8, 8 }, }, + { { 152, 0, 313 },{ 178, 15, 1352 },{ 0, 82, 80 },{ 82, 16, 8 }, }, { { 162, 0, 313 },{ 186, 23, 1352 },{ 24, 90, 70 },{ 90, 24, 8 }, }, + { { 0, 171, 784 },{ 195, 32, 1352 },{ 33, 99, 70 },{ 99, 33, 8 }, }, { { 6, 179, 790 },{ 203, 40, 1352 },{ 41, 107, 70 },{ 107, 41, 8 }, }, + { { 15, 187, 790 },{ 211, 48, 1352 },{ 115, 0, 41 },{ 115, 49, 8 }, }, { { 61, 199, 710 },{ 219, 56, 1352 },{ 57, 123, 70 },{ 123, 57, 8 }, }, + { { 70, 208, 710 },{ 228, 65, 1352 },{ 66, 132, 70 },{ 132, 66, 8 }, }, { { 78, 216, 710 },{ 236, 73, 1352 },{ 74, 140, 70 },{ 140, 74, 8 }, }, + { { 86, 224, 710 },{ 244, 81, 1352 },{ 145, 7, 33 },{ 148, 82, 8 }, }, { { 222, 8, 233 },{ 252, 89, 1352 },{ 153, 15, 33 },{ 156, 90, 8 }, }, + { { 235, 0, 239 },{ 241, 101, 328 },{ 166, 6, 39 },{ 165, 99, 8 }, }, { { 32, 170, 3680 },{ 249, 109, 328 },{ 0, 175, 98 },{ 173, 107, 8 }, }, + { { 40, 178, 3680 },{ 115, 181, 3648 },{ 8, 183, 98 },{ 181, 115, 8 }, }, { { 48, 186, 3680 },{ 123, 189, 3648 },{ 16, 191, 98 },{ 189, 123, 8 }, }, + { { 57, 195, 3680 },{ 132, 198, 3648 },{ 25, 200, 98 },{ 198, 132, 8 }, }, { { 67, 243, 3928 },{ 140, 206, 3648 },{ 33, 208, 98 },{ 206, 140, 8 }, }, + { { 76, 251, 3928 },{ 148, 214, 3648 },{ 41, 216, 98 },{ 214, 148, 8 }, }, { { 86, 255, 856 },{ 156, 222, 3648 },{ 49, 224, 98 },{ 222, 156, 8 }, }, + { { 255, 93, 169 },{ 165, 231, 3648 },{ 58, 233, 98 },{ 231, 165, 8 }, }, { { 98, 236, 3680 },{ 173, 239, 3648 },{ 66, 241, 98 },{ 239, 173, 8 }, }, + { { 108, 181, 4040 },{ 181, 247, 3648 },{ 74, 249, 98 },{ 247, 181, 8 }, }, { { 116, 189, 4040 },{ 255, 189, 8 },{ 116, 189, 456 },{ 255, 189, 8 }, }, + { { 125, 198, 4040 },{ 255, 198, 8 },{ 125, 198, 456 },{ 255, 198, 8 }, }, { { 133, 206, 4040 },{ 255, 206, 8 },{ 133, 206, 456 },{ 255, 206, 8 }, }, + { { 141, 214, 4040 },{ 255, 214, 8 },{ 141, 214, 456 },{ 255, 214, 8 }, }, { { 149, 222, 4040 },{ 255, 222, 8 },{ 149, 222, 456 },{ 255, 222, 8 }, }, + { { 47, 183, 566 },{ 47, 183, 560 },{ 47, 0, 9 },{ 47, 0, 8 }, }, { { 55, 191, 566 },{ 55, 191, 560 },{ 55, 0, 9 },{ 55, 0, 8 }, }, + { { 63, 199, 566 },{ 63, 199, 560 },{ 63, 0, 9 },{ 63, 0, 8 }, }, { { 71, 207, 566 },{ 71, 207, 560 },{ 71, 0, 9 },{ 71, 0, 8 }, }, + { { 80, 216, 566 },{ 80, 216, 560 },{ 80, 0, 9 },{ 80, 0, 8 }, }, { { 88, 224, 566 },{ 88, 224, 560 },{ 88, 0, 9 },{ 88, 0, 8 }, }, + { { 3, 233, 710 },{ 3, 233, 704 },{ 2, 96, 70 },{ 96, 2, 8 }, }, { { 11, 241, 710 },{ 11, 241, 704 },{ 10, 104, 70 },{ 104, 10, 8 }, }, + { { 20, 250, 710 },{ 20, 250, 704 },{ 19, 113, 70 },{ 113, 19, 8 }, }, { { 27, 121, 3654 },{ 27, 121, 3648 },{ 27, 121, 70 },{ 121, 27, 8 }, }, + { { 35, 129, 3654 },{ 35, 129, 3648 },{ 35, 129, 70 },{ 129, 35, 8 }, }, { { 43, 137, 3654 },{ 43, 137, 3648 },{ 43, 137, 70 },{ 137, 43, 8 }, }, + { { 52, 146, 3654 },{ 52, 146, 3648 },{ 52, 146, 70 },{ 146, 52, 8 }, }, { { 60, 154, 3654 },{ 60, 154, 3648 },{ 60, 154, 70 },{ 154, 60, 8 }, }, + { { 68, 162, 3654 },{ 68, 162, 3648 },{ 68, 162, 70 },{ 162, 68, 8 }, }, { { 76, 170, 3654 },{ 76, 170, 3648 },{ 76, 170, 70 },{ 170, 76, 8 }, }, + { { 85, 179, 3654 },{ 85, 179, 3648 },{ 85, 179, 70 },{ 179, 85, 8 }, }, { { 93, 187, 3654 },{ 93, 187, 3648 },{ 93, 187, 70 },{ 187, 93, 8 }, }, + { { 101, 195, 3654 },{ 101, 195, 3648 },{ 101, 195, 70 },{ 195, 101, 8 }, }, { { 109, 203, 3654 },{ 109, 203, 3648 },{ 109, 203, 70 },{ 203, 109, 8 }, }, + { { 118, 212, 3654 },{ 118, 212, 3648 },{ 118, 212, 70 },{ 212, 118, 8 }, }, { { 126, 220, 3654 },{ 126, 220, 3648 },{ 126, 220, 70 },{ 220, 126, 8 }, }, + { { 134, 228, 3654 },{ 134, 228, 3648 },{ 134, 228, 70 },{ 228, 134, 8 }, }, { { 5, 236, 3680 },{ 142, 236, 3648 },{ 5, 236, 96 },{ 236, 142, 8 }, }, + { { 14, 245, 3680 },{ 151, 245, 3648 },{ 14, 245, 96 },{ 245, 151, 8 }, }, { { 23, 159, 4040 },{ 159, 253, 3648 },{ 23, 159, 456 },{ 253, 159, 8 }, }, + { { 31, 167, 4040 },{ 255, 167, 8 },{ 31, 167, 456 },{ 255, 167, 8 }, }, { { 39, 175, 4040 },{ 255, 175, 8 },{ 39, 175, 456 },{ 255, 175, 8 }, }, + { { 48, 184, 4040 },{ 255, 184, 8 },{ 48, 184, 456 },{ 255, 184, 8 }, }, { { 56, 192, 4040 },{ 255, 192, 8 },{ 56, 192, 456 },{ 255, 192, 8 }, }, + { { 64, 200, 4040 },{ 255, 200, 8 },{ 64, 200, 456 },{ 255, 200, 8 }, },{ { 72, 208, 4040 },{ 255, 208, 8 },{ 72, 208, 456 },{ 255, 208, 8 }, }, + + }; + + struct dxt5a_block + { + uint8_t m_endpoints[2]; + + enum { cTotalSelectorBytes = 6 }; + uint8_t m_selectors[cTotalSelectorBytes]; + + inline void clear() + { + basisu::clear_obj(*this); + } + + inline uint32_t get_low_alpha() const + { + return m_endpoints[0]; + } + + inline uint32_t get_high_alpha() const + { + return m_endpoints[1]; + } + + inline void set_low_alpha(uint32_t i) + { + assert(i <= UINT8_MAX); + m_endpoints[0] = static_cast(i); + } + + inline void set_high_alpha(uint32_t i) + { + assert(i <= UINT8_MAX); + m_endpoints[1] = static_cast(i); + } + + inline bool is_alpha6_block() const { return get_low_alpha() <= get_high_alpha(); } + + uint32_t get_endpoints_as_word() const { return m_endpoints[0] | (m_endpoints[1] << 8); } + uint32_t get_selectors_as_word(uint32_t index) { assert(index < 3); return m_selectors[index * 2] | (m_selectors[index * 2 + 1] << 8); } + + inline uint32_t get_selector(uint32_t x, uint32_t y) const + { + assert((x < 4U) && (y < 4U)); + + uint32_t selector_index = (y * 4) + x; + uint32_t bit_index = selector_index * cDXT5SelectorBits; + + uint32_t byte_index = bit_index >> 3; + uint32_t bit_ofs = bit_index & 7; + + uint32_t v = m_selectors[byte_index]; + if (byte_index < (cTotalSelectorBytes - 1)) + v |= (m_selectors[byte_index + 1] << 8); + + return (v >> bit_ofs) & 7; + } + + inline void set_selector(uint32_t x, uint32_t y, uint32_t val) + { + assert((x < 4U) && (y < 4U) && (val < 8U)); + + uint32_t selector_index = (y * 4) + x; + uint32_t bit_index = selector_index * cDXT5SelectorBits; + + uint32_t byte_index = bit_index >> 3; + uint32_t bit_ofs = bit_index & 7; + + uint32_t v = m_selectors[byte_index]; + if (byte_index < (cTotalSelectorBytes - 1)) + v |= (m_selectors[byte_index + 1] << 8); + + v &= (~(7 << bit_ofs)); + v |= (val << bit_ofs); + + m_selectors[byte_index] = static_cast(v); + if (byte_index < (cTotalSelectorBytes - 1)) + m_selectors[byte_index + 1] = static_cast(v >> 8); + } + + enum { cMaxSelectorValues = 8 }; + + static uint32_t get_block_values6(color32* pDst, uint32_t l, uint32_t h) + { + pDst[0].a = static_cast(l); + pDst[1].a = static_cast(h); + pDst[2].a = static_cast((l * 4 + h) / 5); + pDst[3].a = static_cast((l * 3 + h * 2) / 5); + pDst[4].a = static_cast((l * 2 + h * 3) / 5); + pDst[5].a = static_cast((l + h * 4) / 5); + pDst[6].a = 0; + pDst[7].a = 255; + return 6; + } + + static uint32_t get_block_values8(color32* pDst, uint32_t l, uint32_t h) + { + pDst[0].a = static_cast(l); + pDst[1].a = static_cast(h); + pDst[2].a = static_cast((l * 6 + h) / 7); + pDst[3].a = static_cast((l * 5 + h * 2) / 7); + pDst[4].a = static_cast((l * 4 + h * 3) / 7); + pDst[5].a = static_cast((l * 3 + h * 4) / 7); + pDst[6].a = static_cast((l * 2 + h * 5) / 7); + pDst[7].a = static_cast((l + h * 6) / 7); + return 8; + } + + static uint32_t get_block_values(color32* pDst, uint32_t l, uint32_t h) + { + if (l > h) + return get_block_values8(pDst, l, h); + else + return get_block_values6(pDst, l, h); + } + }; + + static void convert_etc1s_to_dxt5a(dxt5a_block* pDst_block, const endpoint* pEndpoints, const selector* pSelector) + { + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (low_selector == high_selector) + { + uint32_t r; + decoder_etc_block::get_block_color5_r(base_color, inten_table, low_selector, r); + + pDst_block->set_low_alpha(r); + pDst_block->set_high_alpha(r); + pDst_block->m_selectors[0] = 0; + pDst_block->m_selectors[1] = 0; + pDst_block->m_selectors[2] = 0; + pDst_block->m_selectors[3] = 0; + pDst_block->m_selectors[4] = 0; + pDst_block->m_selectors[5] = 0; + return; + } + else if (pSelector->m_num_unique_selectors == 2) + { + color32 block_colors[4]; + + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + const uint32_t r0 = block_colors[low_selector].r; + const uint32_t r1 = block_colors[high_selector].r; + + pDst_block->set_low_alpha(r0); + pDst_block->set_high_alpha(r1); + + // TODO: Optimize this + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + pDst_block->set_selector(x, y, (s == high_selector) ? 1 : 0); + } + } + + return; + } + + uint32_t selector_range_table = 0; + for (selector_range_table = 0; selector_range_table < NUM_DXT5A_SELECTOR_RANGES; selector_range_table++) + if ((low_selector == s_dxt5a_selector_ranges[selector_range_table].m_low) && (high_selector == s_dxt5a_selector_ranges[selector_range_table].m_high)) + break; + if (selector_range_table >= NUM_DXT5A_SELECTOR_RANGES) + selector_range_table = 0; + + const etc1_g_to_dxt5a_conversion* pTable_entry = &g_etc1_g_to_dxt5a[base_color.r + inten_table * 32][selector_range_table]; + + pDst_block->set_low_alpha(pTable_entry->m_lo); + pDst_block->set_high_alpha(pTable_entry->m_hi); + + // TODO: Optimize this (like ETC1->BC1) + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + + uint32_t ds = (pTable_entry->m_trans >> (s * 3)) & 7; + + pDst_block->set_selector(x, y, ds); + } + } + } +#endif //BASISD_SUPPORT_DXT5A + + // PVRTC + +#if BASISD_SUPPORT_PVRTC1 || BASISD_SUPPORT_UASTC + static const uint16_t g_pvrtc_swizzle_table[256] = + { + 0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015, 0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055, 0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115, 0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155, + 0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415, 0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455, 0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515, 0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555, + 0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015, 0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055, 0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115, 0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155, + 0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415, 0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455, 0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515, 0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555, + 0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015, 0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055, 0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115, 0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155, + 0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415, 0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455, 0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515, 0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555, + 0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015, 0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055, 0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115, 0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155, + 0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415, 0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455, 0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515, 0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555 + }; + + // Note we can't use simple calculations to convert PVRTC1 encoded endpoint components to/from 8-bits, due to hardware approximations. + static const uint8_t g_pvrtc_5[32] = { 0,8,16,24,33,41,49,57,66,74,82,90,99,107,115,123,132,140,148,156,165,173,181,189,198,206,214,222,231,239,247,255 }; + static const uint8_t g_pvrtc_4[16] = { 0,16,33,49,66,82,99,115,140,156,173,189,206,222,239,255 }; + static const uint8_t g_pvrtc_3[8] = { 0,33,74,107,148,181,222,255 }; + static const uint8_t g_pvrtc_alpha[9] = { 0,34,68,102,136,170,204,238,255 }; + + static const uint8_t g_pvrtc_5_floor[256] = + { + 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3, + 3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7, + 7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15, + 15,15,15,15,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19, + 19,19,19,19,19,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,23,23,23, + 23,23,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,27,27, + 27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,31 + }; + + static const uint8_t g_pvrtc_5_ceil[256] = + { + 0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4, + 4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,8,8,8, + 8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12, + 12,12,12,12,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,16,16,16,16, + 16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,20,20,20, + 20,20,20,20,20,20,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,24,24, + 24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,28, + 28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,31,31,31,31,31,31,31,31 + }; + + static const uint8_t g_pvrtc_4_floor[256] = + { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,15 + }; + + static const uint8_t g_pvrtc_4_ceil[256] = + { + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 + }; + + static const uint8_t g_pvrtc_3_floor[256] = + { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7 + }; + + static const uint8_t g_pvrtc_3_ceil[256] = + { + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 + }; + + static const uint8_t g_pvrtc_alpha_floor[256] = + { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8 + }; + + static const uint8_t g_pvrtc_alpha_ceil[256] = + { + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 + }; + + struct pvrtc4_block + { + uint32_t m_modulation; + uint32_t m_endpoints; + + pvrtc4_block() : m_modulation(0), m_endpoints(0) { } + + inline bool operator== (const pvrtc4_block& rhs) const + { + return (m_modulation == rhs.m_modulation) && (m_endpoints == rhs.m_endpoints); + } + + inline void clear() + { + m_modulation = 0; + m_endpoints = 0; + } + + inline bool get_block_uses_transparent_modulation() const + { + return (m_endpoints & 1) != 0; + } + + inline void set_block_uses_transparent_modulation(bool m) + { + m_endpoints = (m_endpoints & ~1U) | static_cast(m); + } + + inline bool is_endpoint_opaque(uint32_t endpoint_index) const + { + static const uint32_t s_bitmasks[2] = { 0x8000U, 0x80000000U }; + return (m_endpoints & s_bitmasks[basisu::open_range_check(endpoint_index, 2U)]) != 0; + } + + inline void set_endpoint_opaque(uint32_t endpoint_index, bool opaque) + { + assert(endpoint_index < 2); + static const uint32_t s_bitmasks[2] = { 0x8000U, 0x80000000U }; + if (opaque) + m_endpoints |= s_bitmasks[endpoint_index]; + else + m_endpoints &= ~s_bitmasks[endpoint_index]; + } + + inline color32 get_endpoint_5554(uint32_t endpoint_index) const + { + assert(endpoint_index < 2); + static const uint32_t s_endpoint_mask[2] = { 0xFFFE, 0xFFFF }; + uint32_t packed = (m_endpoints >> (basisu::open_range_check(endpoint_index, 2U) ? 16 : 0)) & s_endpoint_mask[endpoint_index]; + + uint32_t r, g, b, a; + if (packed & 0x8000) + { + // opaque 554 or 555 + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + + if (!endpoint_index) + b |= (b >> 4); + + a = 0xF; + } + else + { + // translucent 4433 or 4443 + r = (packed >> 7) & 0x1E; + g = (packed >> 3) & 0x1E; + b = (packed & 0xF) << 1; + + r |= (r >> 4); + g |= (g >> 4); + + if (!endpoint_index) + b |= (b >> 3); + else + b |= (b >> 4); + + a = (packed >> 11) & 0xE; + } + + assert((r < 32) && (g < 32) && (b < 32) && (a < 16)); + + return color32(r, g, b, a); + } + + inline color32 get_endpoint_8888(uint32_t endpoint_index) const + { + assert(endpoint_index < 2); + static const uint32_t s_endpoint_mask[2] = { 0xFFFE, 0xFFFF }; + uint32_t packed = (m_endpoints >> (basisu::open_range_check(endpoint_index, 2U) ? 16 : 0)) & s_endpoint_mask[endpoint_index]; + + uint32_t r, g, b, a; + if (packed & 0x8000) + { + // opaque 554 or 555 + // 1RRRRRGGGGGBBBBM + // 1RRRRRGGGGGBBBBB + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + + r = g_pvrtc_5[r]; + g = g_pvrtc_5[g]; + + if (!endpoint_index) + b = g_pvrtc_4[b >> 1]; + else + b = g_pvrtc_5[b]; + + a = 255; + } + else + { + // translucent 4433 or 4443 + // 0AAA RRRR GGGG BBBM + // 0AAA RRRR GGGG BBBB + r = (packed >> 8) & 0xF; + g = (packed >> 4) & 0xF; + b = packed & 0xF; + a = (packed >> 12) & 7; + + r = g_pvrtc_4[r]; + g = g_pvrtc_4[g]; + + if (!endpoint_index) + b = g_pvrtc_3[b >> 1]; + else + b = g_pvrtc_4[b]; + + a = g_pvrtc_alpha[a]; + } + + return color32(r, g, b, a); + } + + inline uint32_t get_endpoint_l8(uint32_t endpoint_index) const + { + color32 c(get_endpoint_8888(endpoint_index)); + return c.r + c.g + c.b + c.a; + } + + inline uint32_t get_opaque_endpoint_l0() const + { + uint32_t packed = m_endpoints & 0xFFFE; + + uint32_t r, g, b; + assert(packed & 0x8000); + + // opaque 554 or 555 + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + b |= (b >> 4); + + return r + g + b; + } + + inline uint32_t get_opaque_endpoint_l1() const + { + uint32_t packed = m_endpoints >> 16; + + uint32_t r, g, b; + assert(packed & 0x8000); + + // opaque 554 or 555 + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + + return r + g + b; + } + + static uint32_t get_component_precision_in_bits(uint32_t c, uint32_t endpoint_index, bool opaque_endpoint) + { + static const uint32_t s_comp_prec[4][4] = + { + // R0 G0 B0 A0 R1 G1 B1 A1 + { 4, 4, 3, 3 },{ 4, 4, 4, 3 }, // transparent endpoint + + { 5, 5, 4, 0 },{ 5, 5, 5, 0 } // opaque endpoint + }; + return s_comp_prec[basisu::open_range_check(endpoint_index, 2U) + (opaque_endpoint * 2)][basisu::open_range_check(c, 4U)]; + } + + static color32 get_color_precision_in_bits(uint32_t endpoint_index, bool opaque_endpoint) + { + static const color32 s_color_prec[4] = + { + color32(4, 4, 3, 3), color32(4, 4, 4, 3), // transparent endpoint + color32(5, 5, 4, 0), color32(5, 5, 5, 0) // opaque endpoint + }; + return s_color_prec[basisu::open_range_check(endpoint_index, 2U) + (opaque_endpoint * 2)]; + } + + inline void set_opaque_endpoint_floor(uint32_t endpoint_index, const color32& c) + { + assert(endpoint_index < 2); + const uint32_t m = m_endpoints & 1; + + uint32_t r = g_pvrtc_5_floor[c[0]], g = g_pvrtc_5_floor[c[1]], b = c[2]; + + if (!endpoint_index) + b = g_pvrtc_4_floor[b] << 1; + else + b = g_pvrtc_5_floor[b]; + + // rgba=555 here + assert((r < 32) && (g < 32) && (b < 32)); + + // 1RRRRRGGGGGBBBBM + // 1RRRRRGGGGGBBBBB + + // opaque 554 or 555 + uint32_t packed = 0x8000 | (r << 10) | (g << 5) | b; + if (!endpoint_index) + packed = (packed & ~1) | m; + + assert(packed <= 0xFFFF); + + if (endpoint_index) + m_endpoints = (m_endpoints & 0xFFFFU) | (packed << 16); + else + m_endpoints = (m_endpoints & 0xFFFF0000U) | packed; + } + + inline void set_opaque_endpoint_ceil(uint32_t endpoint_index, const color32& c) + { + assert(endpoint_index < 2); + const uint32_t m = m_endpoints & 1; + + uint32_t r = g_pvrtc_5_ceil[c[0]], g = g_pvrtc_5_ceil[c[1]], b = c[2]; + + if (!endpoint_index) + b = g_pvrtc_4_ceil[b] << 1; + else + b = g_pvrtc_5_ceil[b]; + + // rgba=555 here + assert((r < 32) && (g < 32) && (b < 32)); + + // 1RRRRRGGGGGBBBBM + // 1RRRRRGGGGGBBBBB + + // opaque 554 or 555 + uint32_t packed = 0x8000 | (r << 10) | (g << 5) | b; + if (!endpoint_index) + packed |= m; + + assert(packed <= 0xFFFF); + + if (endpoint_index) + m_endpoints = (m_endpoints & 0xFFFFU) | (packed << 16); + else + m_endpoints = (m_endpoints & 0xFFFF0000U) | packed; + } + + // opaque endpoints: 554 or 555 + // transparent endpoints: 3443 or 3444 + inline void set_endpoint_raw(uint32_t endpoint_index, const color32& c, bool opaque_endpoint) + { + assert(endpoint_index < 2); + const uint32_t m = m_endpoints & 1; + uint32_t r = c[0], g = c[1], b = c[2], a = c[3]; + + uint32_t packed; + + if (opaque_endpoint) + { + if (!endpoint_index) + { + // 554 + // 1RRRRRGGGGGBBBBM + assert((r < 32) && (g < 32) && (b < 16)); + packed = 0x8000 | (r << 10) | (g << 5) | (b << 1) | m; + } + else + { + // 555 + // 1RRRRRGGGGGBBBBB + assert((r < 32) && (g < 32) && (b < 32)); + packed = 0x8000 | (r << 10) | (g << 5) | b; + } + } + else + { + if (!endpoint_index) + { + // 3443 + // 0AAA RRRR GGGG BBBM + assert((r < 16) && (g < 16) && (b < 8) && (a < 8)); + packed = (a << 12) | (r << 8) | (g << 4) | (b << 1) | m; + } + else + { + // 3444 + // 0AAA RRRR GGGG BBBB + assert((r < 16) && (g < 16) && (b < 16) && (a < 8)); + packed = (a << 12) | (r << 8) | (g << 4) | b; + } + } + + assert(packed <= 0xFFFF); + + if (endpoint_index) + m_endpoints = (m_endpoints & 0xFFFFU) | (packed << 16); + else + m_endpoints = (m_endpoints & 0xFFFF0000U) | packed; + } + + inline void set_endpoint_floor(uint32_t endpoint_index, const color32& c) + { + assert(endpoint_index < 2); + + int a = g_pvrtc_alpha_floor[c.a]; + if (a == 8) + { + // 554 or 555 + uint32_t r = g_pvrtc_5_floor[c[0]], g = g_pvrtc_5_floor[c[1]], b = c[2]; + + if (!endpoint_index) + b = g_pvrtc_4_floor[b]; + else + b = g_pvrtc_5_floor[b]; + + set_endpoint_raw(endpoint_index, color32(r, g, b, a), true); + } + else + { + // 4433 or 4443 + uint32_t r = g_pvrtc_4_floor[c[0]], g = g_pvrtc_4_floor[c[1]], b = c[2]; + + if (!endpoint_index) + b = g_pvrtc_3_floor[b]; + else + b = g_pvrtc_4_floor[b]; + + set_endpoint_raw(endpoint_index, color32(r, g, b, a), false); + } + } + + inline void set_endpoint_ceil(uint32_t endpoint_index, const color32& c) + { + assert(endpoint_index < 2); + + int a = g_pvrtc_alpha_ceil[c.a]; + if (a == 8) + { + // 554 or 555 + uint32_t r = g_pvrtc_5_ceil[c[0]], g = g_pvrtc_5_ceil[c[1]], b = c[2]; + + if (!endpoint_index) + b = g_pvrtc_4_ceil[b]; + else + b = g_pvrtc_5_ceil[b]; + + set_endpoint_raw(endpoint_index, color32(r, g, b, a), true); + } + else + { + // 4433 or 4443 + uint32_t r = g_pvrtc_4_ceil[c[0]], g = g_pvrtc_4_ceil[c[1]], b = c[2]; + + if (!endpoint_index) + b = g_pvrtc_3_ceil[b]; + else + b = g_pvrtc_4_ceil[b]; + + set_endpoint_raw(endpoint_index, color32(r, g, b, a), false); + } + } + + inline uint32_t get_modulation(uint32_t x, uint32_t y) const + { + assert((x < 4) && (y < 4)); + return (m_modulation >> ((y * 4 + x) * 2)) & 3; + } + + // Scaled by 8 + inline const uint32_t* get_scaled_modulation_values(bool block_uses_transparent_modulation) const + { + static const uint32_t s_block_scales[2][4] = { { 0, 3, 5, 8 },{ 0, 4, 4, 8 } }; + return s_block_scales[block_uses_transparent_modulation]; + } + + // Scaled by 8 + inline uint32_t get_scaled_modulation(uint32_t x, uint32_t y) const + { + return get_scaled_modulation_values(get_block_uses_transparent_modulation())[get_modulation(x, y)]; + } + + inline void set_modulation(uint32_t x, uint32_t y, uint32_t s) + { + assert((x < 4) && (y < 4) && (s < 4)); + uint32_t n = (y * 4 + x) * 2; + m_modulation = (m_modulation & (~(3 << n))) | (s << n); + assert(get_modulation(x, y) == s); + } + + // Assumes modulation was initialized to 0 + inline void set_modulation_fast(uint32_t x, uint32_t y, uint32_t s) + { + assert((x < 4) && (y < 4) && (s < 4)); + uint32_t n = (y * 4 + x) * 2; + m_modulation |= (s << n); + assert(get_modulation(x, y) == s); + } + }; + +#if 0 + static const uint8_t g_pvrtc_bilinear_weights[16][4] = + { + { 4, 4, 4, 4 }, { 2, 6, 2, 6 }, { 8, 0, 8, 0 }, { 6, 2, 6, 2 }, + { 2, 2, 6, 6 }, { 1, 3, 3, 9 }, { 4, 0, 12, 0 }, { 3, 1, 9, 3 }, + { 8, 8, 0, 0 }, { 4, 12, 0, 0 }, { 16, 0, 0, 0 }, { 12, 4, 0, 0 }, + { 6, 6, 2, 2 }, { 3, 9, 1, 3 }, { 12, 0, 4, 0 }, { 9, 3, 3, 1 }, + }; +#endif + + struct pvrtc1_temp_block + { + decoder_etc_block m_etc1_block; + uint32_t m_pvrtc_endpoints; + }; + + static inline uint32_t get_opaque_endpoint_l0(uint32_t endpoints) + { + uint32_t packed = endpoints; + + uint32_t r, g, b; + assert(packed & 0x8000); + + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 30; + b |= (b >> 4); + + return r + g + b; + } + + static inline uint32_t get_opaque_endpoint_l1(uint32_t endpoints) + { + uint32_t packed = endpoints >> 16; + + uint32_t r, g, b; + assert(packed & 0x8000); + + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + + return r + g + b; + } + + static color32 get_endpoint_8888(uint32_t endpoints, uint32_t endpoint_index) + { + assert(endpoint_index < 2); + static const uint32_t s_endpoint_mask[2] = { 0xFFFE, 0xFFFF }; + uint32_t packed = (endpoints >> (basisu::open_range_check(endpoint_index, 2U) ? 16 : 0)) & s_endpoint_mask[endpoint_index]; + + uint32_t r, g, b, a; + if (packed & 0x8000) + { + // opaque 554 or 555 + // 1RRRRRGGGGGBBBBM + // 1RRRRRGGGGGBBBBB + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + + r = g_pvrtc_5[r]; + g = g_pvrtc_5[g]; + + if (!endpoint_index) + b = g_pvrtc_4[b >> 1]; + else + b = g_pvrtc_5[b]; + + a = 255; + } + else + { + // translucent 4433 or 4443 + // 0AAA RRRR GGGG BBBM + // 0AAA RRRR GGGG BBBB + r = (packed >> 8) & 0xF; + g = (packed >> 4) & 0xF; + b = packed & 0xF; + a = (packed >> 12) & 7; + + r = g_pvrtc_4[r]; + g = g_pvrtc_4[g]; + + if (!endpoint_index) + b = g_pvrtc_3[b >> 1]; + else + b = g_pvrtc_4[b]; + + a = g_pvrtc_alpha[a]; + } + + return color32(r, g, b, a); + } + + static uint32_t get_endpoint_l8(uint32_t endpoints, uint32_t endpoint_index) + { + color32 c(get_endpoint_8888(endpoints, endpoint_index)); + return c.r + c.g + c.b + c.a; + } +#endif + +#if BASISD_SUPPORT_PVRTC1 + // TODO: Support decoding a non-pow2 ETC1S texture into the next larger pow2 PVRTC texture. + static void fixup_pvrtc1_4_modulation_rgb(const decoder_etc_block* pETC_Blocks, const uint32_t* pPVRTC_endpoints, void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y) + { + const uint32_t x_mask = num_blocks_x - 1; + const uint32_t y_mask = num_blocks_y - 1; + const uint32_t x_bits = basisu::total_bits(x_mask); + const uint32_t y_bits = basisu::total_bits(y_mask); + const uint32_t min_bits = basisu::minimum(x_bits, y_bits); + //const uint32_t max_bits = basisu::maximum(x_bits, y_bits); + const uint32_t swizzle_mask = (1 << (min_bits * 2)) - 1; + + uint32_t block_index = 0; + + // really 3x3 + int e0[4][4], e1[4][4]; + + for (int y = 0; y < static_cast(num_blocks_y); y++) + { + const uint32_t* pE_rows[3]; + + for (int ey = 0; ey < 3; ey++) + { + int by = y + ey - 1; + + const uint32_t* pE = &pPVRTC_endpoints[(by & y_mask) * num_blocks_x]; + + pE_rows[ey] = pE; + + for (int ex = 0; ex < 3; ex++) + { + int bx = 0 + ex - 1; + + const uint32_t e = pE[bx & x_mask]; + + e0[ex][ey] = (get_opaque_endpoint_l0(e) * 255) / 31; + e1[ex][ey] = (get_opaque_endpoint_l1(e) * 255) / 31; + } + } + + const uint32_t y_swizzle = (g_pvrtc_swizzle_table[y >> 8] << 16) | g_pvrtc_swizzle_table[y & 0xFF]; + + for (int x = 0; x < static_cast(num_blocks_x); x++, block_index++) + { + const decoder_etc_block& src_block = pETC_Blocks[block_index]; + + const uint32_t x_swizzle = (g_pvrtc_swizzle_table[x >> 8] << 17) | (g_pvrtc_swizzle_table[x & 0xFF] << 1); + + uint32_t swizzled = x_swizzle | y_swizzle; + if (num_blocks_x != num_blocks_y) + { + swizzled &= swizzle_mask; + + if (num_blocks_x > num_blocks_y) + swizzled |= ((x >> min_bits) << (min_bits * 2)); + else + swizzled |= ((y >> min_bits) << (min_bits * 2)); + } + + pvrtc4_block* pDst_block = static_cast(pDst_blocks) + swizzled; + pDst_block->m_endpoints = pPVRTC_endpoints[block_index]; + + uint32_t base_r = g_etc_5_to_8[src_block.m_differential.m_red1]; + uint32_t base_g = g_etc_5_to_8[src_block.m_differential.m_green1]; + uint32_t base_b = g_etc_5_to_8[src_block.m_differential.m_blue1]; + + const int* pInten_table48 = g_etc1_inten_tables48[src_block.m_differential.m_cw1]; + int by = (base_r + base_g + base_b) * 16; + int block_colors_y_x16[4]; + block_colors_y_x16[0] = by + pInten_table48[2]; + block_colors_y_x16[1] = by + pInten_table48[3]; + block_colors_y_x16[2] = by + pInten_table48[1]; + block_colors_y_x16[3] = by + pInten_table48[0]; + + { + const uint32_t ex = 2; + int bx = x + ex - 1; + bx &= x_mask; + +#define DO_ROW(ey) \ + { \ + const uint32_t e = pE_rows[ey][bx]; \ + e0[ex][ey] = (get_opaque_endpoint_l0(e) * 255) / 31; \ + e1[ex][ey] = (get_opaque_endpoint_l1(e) * 255) / 31; \ + } + + DO_ROW(0); + DO_ROW(1); + DO_ROW(2); +#undef DO_ROW + } + + uint32_t mod = 0; + + uint32_t lookup_x[4]; + +#define DO_LOOKUP(lx) { \ + const uint32_t byte_ofs = 7 - (((lx) * 4) >> 3); \ + const uint32_t lsb_bits = src_block.m_bytes[byte_ofs] >> (((lx) & 1) * 4); \ + const uint32_t msb_bits = src_block.m_bytes[byte_ofs - 2] >> (((lx) & 1) * 4); \ + lookup_x[lx] = (lsb_bits & 0xF) | ((msb_bits & 0xF) << 4); } + + DO_LOOKUP(0); + DO_LOOKUP(1); + DO_LOOKUP(2); + DO_LOOKUP(3); +#undef DO_LOOKUP + +#define DO_PIX(lx, ly, w0, w1, w2, w3) \ + { \ + int ca_l = a0 * w0 + a1 * w1 + a2 * w2 + a3 * w3; \ + int cb_l = b0 * w0 + b1 * w1 + b2 * w2 + b3 * w3; \ + int cl = block_colors_y_x16[g_etc1_x_selector_unpack[ly][lookup_x[lx]]]; \ + int dl = cb_l - ca_l; \ + int vl = cl - ca_l; \ + int p = vl * 16; \ + if (ca_l > cb_l) { p = -p; dl = -dl; } \ + uint32_t m = 0; \ + if (p > 3 * dl) m = (uint32_t)(1 << ((ly) * 8 + (lx) * 2)); \ + if (p > 8 * dl) m = (uint32_t)(2 << ((ly) * 8 + (lx) * 2)); \ + if (p > 13 * dl) m = (uint32_t)(3 << ((ly) * 8 + (lx) * 2)); \ + mod |= m; \ + } + + { + const uint32_t ex = 0, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 0, 4, 4, 4, 4); + DO_PIX(1, 0, 2, 6, 2, 6); + DO_PIX(0, 1, 2, 2, 6, 6); + DO_PIX(1, 1, 1, 3, 3, 9); + } + + { + const uint32_t ex = 1, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 0, 8, 0, 8, 0); + DO_PIX(3, 0, 6, 2, 6, 2); + DO_PIX(2, 1, 4, 0, 12, 0); + DO_PIX(3, 1, 3, 1, 9, 3); + } + + { + const uint32_t ex = 0, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 2, 8, 8, 0, 0); + DO_PIX(1, 2, 4, 12, 0, 0); + DO_PIX(0, 3, 6, 6, 2, 2); + DO_PIX(1, 3, 3, 9, 1, 3); + } + + { + const uint32_t ex = 1, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 2, 16, 0, 0, 0); + DO_PIX(3, 2, 12, 4, 0, 0); + DO_PIX(2, 3, 12, 0, 4, 0); + DO_PIX(3, 3, 9, 3, 3, 1); + } +#undef DO_PIX + + pDst_block->m_modulation = mod; + + e0[0][0] = e0[1][0]; e0[1][0] = e0[2][0]; + e0[0][1] = e0[1][1]; e0[1][1] = e0[2][1]; + e0[0][2] = e0[1][2]; e0[1][2] = e0[2][2]; + + e1[0][0] = e1[1][0]; e1[1][0] = e1[2][0]; + e1[0][1] = e1[1][1]; e1[1][1] = e1[2][1]; + e1[0][2] = e1[1][2]; e1[1][2] = e1[2][2]; + + } // x + } // y + } + + static void fixup_pvrtc1_4_modulation_rgba( + const decoder_etc_block* pETC_Blocks, + const uint32_t* pPVRTC_endpoints, + void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, void *pAlpha_blocks, + const endpoint* pEndpoints, const selector* pSelectors) + { + const uint32_t x_mask = num_blocks_x - 1; + const uint32_t y_mask = num_blocks_y - 1; + const uint32_t x_bits = basisu::total_bits(x_mask); + const uint32_t y_bits = basisu::total_bits(y_mask); + const uint32_t min_bits = basisu::minimum(x_bits, y_bits); + //const uint32_t max_bits = basisu::maximum(x_bits, y_bits); + const uint32_t swizzle_mask = (1 << (min_bits * 2)) - 1; + + uint32_t block_index = 0; + + // really 3x3 + int e0[4][4], e1[4][4]; + + for (int y = 0; y < static_cast(num_blocks_y); y++) + { + const uint32_t* pE_rows[3]; + + for (int ey = 0; ey < 3; ey++) + { + int by = y + ey - 1; + + const uint32_t* pE = &pPVRTC_endpoints[(by & y_mask) * num_blocks_x]; + + pE_rows[ey] = pE; + + for (int ex = 0; ex < 3; ex++) + { + int bx = 0 + ex - 1; + + const uint32_t e = pE[bx & x_mask]; + + e0[ex][ey] = get_endpoint_l8(e, 0); + e1[ex][ey] = get_endpoint_l8(e, 1); + } + } + + const uint32_t y_swizzle = (g_pvrtc_swizzle_table[y >> 8] << 16) | g_pvrtc_swizzle_table[y & 0xFF]; + + for (int x = 0; x < static_cast(num_blocks_x); x++, block_index++) + { + const decoder_etc_block& src_block = pETC_Blocks[block_index]; + + const uint16_t* pSrc_alpha_block = reinterpret_cast(static_cast(pAlpha_blocks) + x + (y * num_blocks_x)); + const endpoint* pAlpha_endpoints = &pEndpoints[pSrc_alpha_block[0]]; + const selector* pAlpha_selectors = &pSelectors[pSrc_alpha_block[1]]; + + const uint32_t x_swizzle = (g_pvrtc_swizzle_table[x >> 8] << 17) | (g_pvrtc_swizzle_table[x & 0xFF] << 1); + + uint32_t swizzled = x_swizzle | y_swizzle; + if (num_blocks_x != num_blocks_y) + { + swizzled &= swizzle_mask; + + if (num_blocks_x > num_blocks_y) + swizzled |= ((x >> min_bits) << (min_bits * 2)); + else + swizzled |= ((y >> min_bits) << (min_bits * 2)); + } + + pvrtc4_block* pDst_block = static_cast(pDst_blocks) + swizzled; + pDst_block->m_endpoints = pPVRTC_endpoints[block_index]; + + uint32_t base_r = g_etc_5_to_8[src_block.m_differential.m_red1]; + uint32_t base_g = g_etc_5_to_8[src_block.m_differential.m_green1]; + uint32_t base_b = g_etc_5_to_8[src_block.m_differential.m_blue1]; + + const int* pInten_table48 = g_etc1_inten_tables48[src_block.m_differential.m_cw1]; + int by = (base_r + base_g + base_b) * 16; + int block_colors_y_x16[4]; + block_colors_y_x16[0] = basisu::clamp(by + pInten_table48[0], 0, 48 * 255); + block_colors_y_x16[1] = basisu::clamp(by + pInten_table48[1], 0, 48 * 255); + block_colors_y_x16[2] = basisu::clamp(by + pInten_table48[2], 0, 48 * 255); + block_colors_y_x16[3] = basisu::clamp(by + pInten_table48[3], 0, 48 * 255); + + uint32_t alpha_base_g = g_etc_5_to_8[pAlpha_endpoints->m_color5.g] * 16; + const int* pInten_table16 = g_etc1_inten_tables16[pAlpha_endpoints->m_inten5]; + int alpha_block_colors_x16[4]; + alpha_block_colors_x16[0] = basisu::clamp(alpha_base_g + pInten_table16[0], 0, 16 * 255); + alpha_block_colors_x16[1] = basisu::clamp(alpha_base_g + pInten_table16[1], 0, 16 * 255); + alpha_block_colors_x16[2] = basisu::clamp(alpha_base_g + pInten_table16[2], 0, 16 * 255); + alpha_block_colors_x16[3] = basisu::clamp(alpha_base_g + pInten_table16[3], 0, 16 * 255); + + // clamp((base_r + base_g + base_b) * 16 + color_inten[s] * 48) + clamp(alpha_base_g * 16 + alpha_inten[as] * 16) + + { + const uint32_t ex = 2; + int bx = x + ex - 1; + bx &= x_mask; + +#define DO_ROW(ey) \ + { \ + const uint32_t e = pE_rows[ey][bx]; \ + e0[ex][ey] = get_endpoint_l8(e, 0); \ + e1[ex][ey] = get_endpoint_l8(e, 1); \ + } + + DO_ROW(0); + DO_ROW(1); + DO_ROW(2); +#undef DO_ROW + } + + uint32_t mod = 0; + +#define DO_PIX(lx, ly, w0, w1, w2, w3) \ + { \ + int ca_l = a0 * w0 + a1 * w1 + a2 * w2 + a3 * w3; \ + int cb_l = b0 * w0 + b1 * w1 + b2 * w2 + b3 * w3; \ + int cl = block_colors_y_x16[(src_block.m_bytes[4 + ly] >> (lx * 2)) & 3] + alpha_block_colors_x16[(pAlpha_selectors->m_selectors[ly] >> (lx * 2)) & 3]; \ + int dl = cb_l - ca_l; \ + int vl = cl - ca_l; \ + int p = vl * 16; \ + if (ca_l > cb_l) { p = -p; dl = -dl; } \ + uint32_t m = 0; \ + if (p > 3 * dl) m = (uint32_t)(1 << ((ly) * 8 + (lx) * 2)); \ + if (p > 8 * dl) m = (uint32_t)(2 << ((ly) * 8 + (lx) * 2)); \ + if (p > 13 * dl) m = (uint32_t)(3 << ((ly) * 8 + (lx) * 2)); \ + mod |= m; \ + } + + { + const uint32_t ex = 0, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 0, 4, 4, 4, 4); + DO_PIX(1, 0, 2, 6, 2, 6); + DO_PIX(0, 1, 2, 2, 6, 6); + DO_PIX(1, 1, 1, 3, 3, 9); + } + + { + const uint32_t ex = 1, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 0, 8, 0, 8, 0); + DO_PIX(3, 0, 6, 2, 6, 2); + DO_PIX(2, 1, 4, 0, 12, 0); + DO_PIX(3, 1, 3, 1, 9, 3); + } + + { + const uint32_t ex = 0, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 2, 8, 8, 0, 0); + DO_PIX(1, 2, 4, 12, 0, 0); + DO_PIX(0, 3, 6, 6, 2, 2); + DO_PIX(1, 3, 3, 9, 1, 3); + } + + { + const uint32_t ex = 1, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 2, 16, 0, 0, 0); + DO_PIX(3, 2, 12, 4, 0, 0); + DO_PIX(2, 3, 12, 0, 4, 0); + DO_PIX(3, 3, 9, 3, 3, 1); + } +#undef DO_PIX + + pDst_block->m_modulation = mod; + + e0[0][0] = e0[1][0]; e0[1][0] = e0[2][0]; + e0[0][1] = e0[1][1]; e0[1][1] = e0[2][1]; + e0[0][2] = e0[1][2]; e0[1][2] = e0[2][2]; + + e1[0][0] = e1[1][0]; e1[1][0] = e1[2][0]; + e1[0][1] = e1[1][1]; e1[1][1] = e1[2][1]; + e1[0][2] = e1[1][2]; e1[1][2] = e1[2][2]; + + } // x + } // y + } +#endif // BASISD_SUPPORT_PVRTC1 + +#if BASISD_SUPPORT_BC7_MODE5 + static dxt_selector_range g_etc1_to_bc7_m5_selector_ranges[] = + { + { 0, 3 }, + { 1, 3 }, + { 0, 2 }, + { 1, 2 }, + { 2, 3 }, + { 0, 1 }, + }; + + const uint32_t NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES = sizeof(g_etc1_to_bc7_m5_selector_ranges) / sizeof(g_etc1_to_bc7_m5_selector_ranges[0]); + + static uint32_t g_etc1_to_bc7_m5_selector_range_index[4][4]; + + const uint32_t NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS = 10; + static const uint8_t g_etc1_to_bc7_m5_selector_mappings[NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS][4] = + { + { 0, 0, 1, 1 }, + { 0, 0, 1, 2 }, + { 0, 0, 1, 3 }, + { 0, 0, 2, 3 }, + { 0, 1, 1, 1 }, + { 0, 1, 2, 2 }, + { 0, 1, 2, 3 }, + { 0, 2, 3, 3 }, + { 1, 2, 2, 2 }, + { 1, 2, 3, 3 }, + }; + + struct etc1_to_bc7_m5_solution + { + uint8_t m_lo; + uint8_t m_hi; + uint16_t m_err; + }; + + static const etc1_to_bc7_m5_solution g_etc1_to_bc7_m5_color[32 * 8 * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS * NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES] = { +/**** start inlining basisu_transcoder_tables_bc7_m5_color.inc ****/ +{0,7,18},{0,5,2},{0,4,1},{0,3,8},{0,4,35},{0,3,24},{0,3,12},{0,2,29},{0,2,36},{0,2,30},{0,7,18},{0,5,2},{0,4,1},{0,3,8},{2,0,35},{0,3,24},{0,3,12},{0,2,29},{4,0,35},{0,2,29},{0,3,0},{0,3,0},{0,3,0},{0,1,1},{0,1,2},{0,1,2},{0,1,2},{0,1,1},{1,0,3},{0,1,2},{0,3,0}, +{0,3,0},{0,3,0},{0,1,1},{1,0,2},{1,0,2},{1,0,2},{0,1,1},{1,0,2},{0,1,1},{4,0,18},{0,5,2},{0,4,1},{0,3,8},{4,0,18},{7,0,18},{0,3,8},{0,2,20},{7,0,18},{0,2,20},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,15,38},{2,11,20},{2,8,24}, +{1,8,21},{0,16,51},{0,10,19},{0,8,2},{0,6,24},{0,8,76},{0,6,40},{3,13,18},{3,10,2},{3,8,1},{3,7,5},{8,0,51},{1,9,19},{0,8,2},{0,6,24},{16,0,51},{0,6,24},{2,11,20},{2,11,20},{2,11,20},{1,7,20},{0,12,8},{0,7,2},{0,7,2},{0,5,1},{0,5,19},{0,5,10},{3,9,0},{3,9,0},{3,9,0},{3,6,0},{6,0,8}, +{1,7,0},{1,7,0},{0,5,1},{12,0,8},{0,5,1},{10,0,18},{2,11,0},{3,8,1},{0,8,1},{10,0,18},{20,0,18},{0,8,1},{0,6,20},{20,0,18},{0,6,20},{1,0,20},{1,0,20},{1,0,20},{1,0,20},{0,9,0},{0,9,0},{0,9,0},{0,4,1},{0,3,8},{0,3,8},{6,19,38},{6,15,20},{6,12,24},{5,12,21},{4,20,51},{4,14,19},{4,12,2}, +{4,10,24},{0,14,52},{1,10,20},{7,17,18},{7,14,2},{7,12,1},{7,11,5},{14,0,51},{5,13,19},{4,12,2},{1,10,20},{29,0,51},{1,10,20},{6,15,20},{6,15,20},{6,15,20},{5,11,20},{4,16,8},{4,11,2},{4,11,2},{4,9,1},{0,12,8},{1,9,2},{7,13,0},{7,13,0},{7,13,0},{7,10,0},{12,0,8},{5,11,0},{5,11,0},{3,9,0},{24,0,8}, +{3,9,0},{15,1,18},{6,15,0},{7,12,1},{3,12,0},{15,1,18},{32,0,18},{3,12,0},{0,10,20},{32,0,18},{0,10,20},{5,0,20},{5,0,20},{5,0,20},{5,0,20},{4,13,0},{4,13,0},{4,13,0},{4,8,1},{1,10,0},{1,10,0},{10,23,38},{10,19,20},{10,16,24},{9,16,21},{8,24,51},{8,18,19},{8,16,2},{8,14,24},{3,18,52},{5,14,20},{11,21,18}, +{11,18,2},{11,16,1},{11,15,5},{20,0,51},{9,17,19},{8,16,2},{5,14,20},{41,0,51},{5,14,20},{10,19,20},{10,19,20},{10,19,20},{9,15,20},{8,20,8},{8,15,2},{8,15,2},{8,13,1},{4,16,8},{5,13,2},{11,17,0},{11,17,0},{11,17,0},{11,14,0},{18,0,8},{9,15,0},{9,15,0},{7,13,0},{36,0,8},{7,13,0},{21,1,18},{10,19,0},{11,16,1}, +{7,16,0},{21,1,18},{44,0,18},{7,16,0},{0,14,20},{44,0,18},{0,14,20},{9,0,20},{9,0,20},{9,0,20},{9,0,20},{8,17,0},{8,17,0},{8,17,0},{8,12,1},{5,14,0},{5,14,0},{14,29,36},{14,24,18},{14,21,23},{14,20,20},{13,28,52},{13,22,20},{13,20,2},{12,19,23},{7,23,51},{9,19,18},{16,25,19},{15,23,1},{16,20,2},{15,20,6},{27,0,51}, +{13,22,19},{13,20,1},{8,19,18},{55,0,51},{8,19,18},{14,24,18},{14,24,18},{14,24,18},{14,19,18},{13,23,9},{13,20,1},{13,20,1},{12,17,2},{9,20,8},{10,18,1},{16,20,1},{16,20,1},{16,20,1},{16,18,1},{24,1,8},{14,19,0},{14,19,0},{12,17,1},{50,0,8},{12,17,1},{28,0,18},{15,23,0},{16,20,1},{12,20,1},{28,0,18},{58,0,18},{12,20,1}, +{0,19,18},{58,0,18},{0,19,18},{14,0,18},{14,0,18},{14,0,18},{14,0,18},{13,20,1},{13,20,1},{13,20,1},{12,17,1},{10,18,0},{10,18,0},{18,33,36},{18,28,18},{18,25,23},{18,24,20},{17,32,52},{17,26,20},{17,24,2},{16,23,23},{11,27,51},{13,23,18},{20,29,19},{19,27,1},{20,24,2},{19,24,6},{33,0,51},{17,26,19},{17,24,1},{12,23,18},{66,0,51}, +{12,23,18},{18,28,18},{18,28,18},{18,28,18},{18,23,18},{17,27,9},{17,24,1},{17,24,1},{16,21,2},{13,24,8},{14,22,1},{20,24,1},{20,24,1},{20,24,1},{20,22,1},{30,1,8},{18,23,0},{18,23,0},{16,21,1},{62,0,8},{16,21,1},{34,0,18},{19,27,0},{20,24,1},{16,24,1},{34,0,18},{69,0,18},{16,24,1},{0,23,18},{69,0,18},{0,23,18},{18,0,18}, +{18,0,18},{18,0,18},{18,0,18},{17,24,1},{17,24,1},{17,24,1},{16,21,1},{14,22,0},{14,22,0},{22,37,36},{22,32,18},{22,29,23},{22,28,20},{21,36,52},{21,30,20},{21,28,2},{20,27,23},{15,31,51},{17,27,18},{24,33,19},{23,31,1},{24,28,2},{23,28,6},{39,0,51},{21,30,19},{21,28,1},{16,27,18},{78,0,51},{16,27,18},{22,32,18},{22,32,18},{22,32,18}, +{22,27,18},{21,31,9},{21,28,1},{21,28,1},{20,25,2},{17,28,8},{18,26,1},{24,28,1},{24,28,1},{24,28,1},{24,26,1},{36,1,8},{22,27,0},{22,27,0},{20,25,1},{74,0,8},{20,25,1},{40,0,18},{23,31,0},{24,28,1},{20,28,1},{40,0,18},{82,0,18},{20,28,1},{0,27,18},{82,0,18},{0,27,18},{22,0,18},{22,0,18},{22,0,18},{22,0,18},{21,28,1}, +{21,28,1},{21,28,1},{20,25,1},{18,26,0},{18,26,0},{26,41,36},{26,36,18},{26,33,23},{26,32,20},{25,40,52},{25,34,20},{25,32,2},{24,31,23},{19,35,51},{21,31,18},{28,37,19},{27,35,1},{28,32,2},{27,32,6},{45,0,51},{25,34,19},{25,32,1},{20,31,18},{91,0,51},{20,31,18},{26,36,18},{26,36,18},{26,36,18},{26,31,18},{25,35,9},{25,32,1},{25,32,1}, +{24,29,2},{21,32,8},{22,30,1},{28,32,1},{28,32,1},{28,32,1},{28,30,1},{42,1,8},{26,31,0},{26,31,0},{24,29,1},{86,0,8},{24,29,1},{46,0,18},{27,35,0},{28,32,1},{24,32,1},{46,0,18},{94,0,18},{24,32,1},{0,31,18},{94,0,18},{0,31,18},{26,0,18},{26,0,18},{26,0,18},{26,0,18},{25,32,1},{25,32,1},{25,32,1},{24,29,1},{22,30,0}, +{22,30,0},{31,44,38},{31,40,20},{31,37,24},{30,37,21},{29,45,51},{29,39,19},{29,37,2},{29,35,24},{24,39,52},{26,35,20},{32,42,18},{32,39,2},{32,37,1},{32,36,5},{51,0,51},{30,38,19},{29,37,2},{26,35,20},{104,0,51},{26,35,20},{31,40,20},{31,40,20},{31,40,20},{30,36,20},{29,41,8},{29,36,2},{29,36,2},{29,34,1},{25,37,8},{26,34,2},{32,38,0}, +{32,38,0},{32,38,0},{32,35,0},{49,0,8},{30,36,0},{30,36,0},{28,34,0},{100,0,8},{28,34,0},{53,0,18},{31,40,0},{32,37,1},{28,37,0},{53,0,18},{107,0,18},{28,37,0},{0,35,20},{107,0,18},{0,35,20},{30,0,20},{30,0,20},{30,0,20},{30,0,20},{29,38,0},{29,38,0},{29,38,0},{29,33,1},{26,35,0},{26,35,0},{35,48,38},{35,44,20},{35,41,24}, +{34,41,21},{33,49,51},{33,43,19},{33,41,2},{33,39,24},{28,43,52},{30,39,20},{36,46,18},{36,43,2},{36,41,1},{36,40,5},{57,0,51},{34,42,19},{33,41,2},{30,39,20},{117,0,51},{30,39,20},{35,44,20},{35,44,20},{35,44,20},{34,40,20},{33,45,8},{33,40,2},{33,40,2},{33,38,1},{29,41,8},{30,38,2},{36,42,0},{36,42,0},{36,42,0},{36,39,0},{55,0,8}, +{34,40,0},{34,40,0},{32,38,0},{112,0,8},{32,38,0},{59,0,18},{35,44,0},{36,41,1},{32,41,0},{59,0,18},{120,0,18},{32,41,0},{0,39,20},{120,0,18},{0,39,20},{34,0,20},{34,0,20},{34,0,20},{34,0,20},{33,42,0},{33,42,0},{33,42,0},{33,37,1},{30,39,0},{30,39,0},{39,52,38},{39,48,20},{39,45,24},{38,45,21},{37,53,51},{37,47,19},{37,45,2}, +{37,43,24},{32,47,52},{34,43,20},{40,50,18},{40,47,2},{40,45,1},{40,44,5},{63,0,51},{38,46,19},{37,45,2},{34,43,20},{127,1,51},{34,43,20},{39,48,20},{39,48,20},{39,48,20},{38,44,20},{37,49,8},{37,44,2},{37,44,2},{37,42,1},{33,45,8},{34,42,2},{40,46,0},{40,46,0},{40,46,0},{40,43,0},{61,0,8},{38,44,0},{38,44,0},{36,42,0},{124,0,8}, +{36,42,0},{64,0,18},{39,48,0},{40,45,1},{36,45,0},{64,0,18},{126,3,18},{36,45,0},{0,43,20},{126,3,18},{0,43,20},{38,0,20},{38,0,20},{38,0,20},{38,0,20},{37,46,0},{37,46,0},{37,46,0},{37,41,1},{34,43,0},{34,43,0},{43,56,38},{43,52,20},{43,49,24},{42,49,21},{41,57,51},{41,51,19},{41,49,2},{41,47,24},{36,51,52},{38,47,20},{44,54,18}, +{44,51,2},{44,49,1},{44,48,5},{69,0,51},{42,50,19},{41,49,2},{38,47,20},{127,7,51},{38,47,20},{43,52,20},{43,52,20},{43,52,20},{42,48,20},{41,53,8},{41,48,2},{41,48,2},{41,46,1},{37,49,8},{38,46,2},{44,50,0},{44,50,0},{44,50,0},{44,47,0},{66,1,8},{42,48,0},{42,48,0},{40,46,0},{126,5,8},{40,46,0},{70,0,18},{43,52,0},{44,49,1}, +{40,49,0},{70,0,18},{126,9,18},{40,49,0},{0,47,20},{126,9,18},{0,47,20},{42,0,20},{42,0,20},{42,0,20},{42,0,20},{41,50,0},{41,50,0},{41,50,0},{41,45,1},{38,47,0},{38,47,0},{47,62,36},{47,57,18},{47,54,23},{47,53,20},{46,61,52},{46,55,20},{46,53,2},{45,52,23},{40,56,51},{42,52,18},{49,58,19},{48,56,1},{49,53,2},{48,53,6},{75,1,51}, +{46,55,19},{46,53,1},{41,52,18},{126,14,51},{41,52,18},{47,57,18},{47,57,18},{47,57,18},{47,52,18},{46,56,9},{46,53,1},{46,53,1},{45,50,2},{42,53,8},{43,51,1},{49,53,1},{49,53,1},{49,53,1},{49,51,1},{73,0,8},{47,52,0},{47,52,0},{45,50,1},{126,12,8},{45,50,1},{77,0,18},{48,56,0},{49,53,1},{45,53,1},{77,0,18},{127,15,18},{45,53,1}, +{0,52,18},{127,15,18},{0,52,18},{47,0,18},{47,0,18},{47,0,18},{47,0,18},{46,53,1},{46,53,1},{46,53,1},{45,50,1},{43,51,0},{43,51,0},{51,65,36},{51,61,18},{51,58,23},{51,57,20},{50,64,52},{50,59,20},{50,57,2},{49,56,23},{44,60,51},{46,56,18},{53,62,19},{52,60,1},{53,57,2},{52,57,6},{81,0,51},{50,59,19},{50,57,1},{45,56,18},{126,20,51}, +{45,56,18},{51,61,18},{51,61,18},{51,61,18},{51,56,18},{50,60,9},{50,57,1},{50,57,1},{49,54,2},{46,57,8},{47,55,1},{53,57,1},{53,57,1},{53,57,1},{53,55,1},{79,0,8},{51,56,0},{51,56,0},{49,54,1},{127,17,8},{49,54,1},{83,0,18},{52,60,0},{53,57,1},{49,57,1},{83,0,18},{127,21,18},{49,57,1},{0,56,18},{127,21,18},{0,56,18},{51,0,18}, +{51,0,18},{51,0,18},{51,0,18},{50,57,1},{50,57,1},{50,57,1},{49,54,1},{47,55,0},{47,55,0},{55,69,36},{55,64,19},{55,62,23},{55,61,20},{54,68,52},{54,63,20},{54,61,2},{53,60,23},{48,64,51},{50,60,18},{57,65,19},{56,64,2},{57,61,2},{56,61,6},{87,0,51},{54,63,19},{54,61,1},{49,60,18},{126,26,51},{49,60,18},{55,65,18},{55,65,18},{55,65,18}, +{55,60,18},{54,64,9},{54,61,1},{54,61,1},{53,58,2},{50,61,8},{51,59,1},{57,61,1},{57,61,1},{57,61,1},{57,59,1},{85,0,8},{55,60,0},{55,60,0},{53,58,1},{127,23,8},{53,58,1},{89,0,18},{55,64,1},{57,61,1},{53,61,1},{89,0,18},{127,27,18},{53,61,1},{0,60,18},{127,27,18},{0,60,18},{55,0,18},{55,0,18},{55,0,18},{55,0,18},{54,61,1}, +{54,61,1},{54,61,1},{53,58,1},{51,59,0},{51,59,0},{59,73,36},{59,68,19},{59,66,26},{59,64,22},{58,72,52},{57,67,19},{57,65,2},{57,63,28},{52,68,51},{53,64,21},{61,69,19},{60,67,2},{61,65,1},{60,65,5},{93,0,51},{57,67,18},{57,65,1},{52,64,20},{126,32,51},{52,64,20},{59,69,18},{59,69,18},{59,69,18},{59,64,18},{58,68,9},{58,64,2},{58,64,2}, +{57,62,2},{55,64,9},{55,63,1},{61,65,1},{61,65,1},{61,65,1},{61,63,1},{91,0,8},{58,64,1},{58,64,1},{57,62,1},{127,29,8},{57,62,1},{95,0,18},{60,67,1},{61,65,0},{56,65,0},{95,0,18},{127,33,18},{56,65,0},{0,64,20},{127,33,18},{0,64,20},{59,0,18},{59,0,18},{59,0,18},{59,0,18},{58,65,1},{58,65,1},{58,65,1},{57,62,1},{55,63,0}, +{55,63,0},{63,79,38},{63,73,21},{64,70,28},{63,69,22},{62,78,51},{62,71,18},{62,69,2},{61,68,26},{57,72,51},{58,68,19},{65,74,19},{64,72,1},{65,69,2},{64,69,6},{100,0,51},{62,71,18},{62,69,2},{58,68,18},{127,38,51},{58,68,18},{63,74,20},{63,74,20},{63,74,20},{63,68,21},{62,73,8},{62,69,1},{62,69,1},{62,66,1},{59,69,9},{60,66,2},{65,69,1}, +{65,69,1},{65,69,1},{65,67,1},{98,0,8},{63,68,1},{63,68,1},{62,66,1},{127,36,8},{62,66,1},{101,1,18},{64,72,0},{65,69,1},{62,69,1},{101,1,18},{126,40,18},{62,69,1},{0,68,18},{126,40,18},{0,68,18},{63,0,20},{63,0,20},{63,0,20},{63,0,20},{62,70,0},{62,70,0},{62,70,0},{62,66,0},{60,66,1},{60,66,1},{67,82,36},{67,77,18},{67,74,23}, +{67,73,20},{66,81,52},{66,75,20},{66,73,2},{65,72,23},{61,76,51},{62,72,19},{69,78,19},{68,76,1},{69,73,2},{68,73,6},{106,0,51},{66,75,19},{66,73,1},{62,72,18},{127,44,51},{62,72,18},{67,77,18},{67,77,18},{67,77,18},{67,72,18},{66,76,9},{66,73,1},{66,73,1},{65,70,2},{63,73,9},{63,71,2},{69,73,1},{69,73,1},{69,73,1},{69,71,1},{104,0,8}, +{67,72,0},{67,72,0},{65,70,1},{127,42,8},{65,70,1},{107,1,18},{68,76,0},{69,73,1},{65,73,1},{107,1,18},{126,46,18},{65,73,1},{0,72,18},{126,46,18},{0,72,18},{67,0,18},{67,0,18},{67,0,18},{67,0,18},{66,73,1},{66,73,1},{66,73,1},{65,70,1},{63,71,1},{63,71,1},{71,86,36},{71,81,18},{71,78,23},{71,77,20},{70,85,52},{70,79,20},{70,77,2}, +{69,76,23},{64,80,51},{66,76,18},{73,82,19},{72,80,1},{73,77,2},{72,77,6},{112,0,51},{70,79,19},{70,77,1},{65,76,18},{127,50,51},{65,76,18},{71,81,18},{71,81,18},{71,81,18},{71,76,18},{70,80,9},{70,77,1},{70,77,1},{69,74,2},{66,77,8},{67,75,1},{73,77,1},{73,77,1},{73,77,1},{73,75,1},{110,0,8},{71,76,0},{71,76,0},{69,74,1},{126,48,8}, +{69,74,1},{113,0,18},{72,80,0},{73,77,1},{69,77,1},{113,0,18},{126,52,18},{69,77,1},{0,76,18},{126,52,18},{0,76,18},{71,0,18},{71,0,18},{71,0,18},{71,0,18},{70,77,1},{70,77,1},{70,77,1},{69,74,1},{67,75,0},{67,75,0},{75,90,36},{75,85,18},{75,82,23},{75,81,20},{74,89,52},{74,83,20},{74,81,2},{73,80,23},{68,84,51},{70,80,18},{77,86,19}, +{76,84,1},{77,81,2},{76,81,6},{118,0,51},{74,83,19},{74,81,1},{69,80,18},{127,56,51},{69,80,18},{75,85,18},{75,85,18},{75,85,18},{75,80,18},{74,84,9},{74,81,1},{74,81,1},{73,78,2},{70,81,8},{71,79,1},{77,81,1},{77,81,1},{77,81,1},{77,79,1},{115,1,8},{75,80,0},{75,80,0},{73,78,1},{126,54,8},{73,78,1},{119,0,18},{76,84,0},{77,81,1}, +{73,81,1},{119,0,18},{126,58,18},{73,81,1},{0,80,18},{126,58,18},{0,80,18},{75,0,18},{75,0,18},{75,0,18},{75,0,18},{74,81,1},{74,81,1},{74,81,1},{73,78,1},{71,79,0},{71,79,0},{80,93,38},{80,89,20},{80,86,24},{79,86,21},{78,94,51},{78,88,19},{78,86,2},{78,84,24},{73,88,52},{75,84,20},{81,91,18},{81,88,2},{81,86,1},{81,85,5},{124,1,51}, +{79,87,19},{78,86,2},{75,84,20},{126,63,51},{75,84,20},{80,89,20},{80,89,20},{80,89,20},{79,85,20},{78,90,8},{78,85,2},{78,85,2},{78,83,1},{74,86,8},{75,83,2},{81,87,0},{81,87,0},{81,87,0},{81,84,0},{122,0,8},{79,85,0},{79,85,0},{77,83,0},{126,61,8},{77,83,0},{126,0,18},{80,89,0},{81,86,1},{77,86,0},{126,0,18},{126,64,18},{77,86,0}, +{0,84,20},{126,64,18},{0,84,20},{79,0,20},{79,0,20},{79,0,20},{79,0,20},{78,87,0},{78,87,0},{78,87,0},{78,82,1},{75,84,0},{75,84,0},{84,97,38},{84,93,20},{84,90,24},{83,90,21},{82,98,51},{82,92,19},{82,90,2},{82,88,24},{77,92,52},{79,88,20},{85,95,18},{85,92,2},{85,90,1},{85,89,5},{127,7,51},{83,91,19},{82,90,2},{79,88,20},{127,68,51}, +{79,88,20},{84,93,20},{84,93,20},{84,93,20},{83,89,20},{82,94,8},{82,89,2},{82,89,2},{82,87,1},{78,90,8},{79,87,2},{85,91,0},{85,91,0},{85,91,0},{85,88,0},{127,2,8},{83,89,0},{83,89,0},{81,87,0},{127,66,8},{81,87,0},{127,10,18},{84,93,0},{85,90,1},{81,90,0},{127,10,18},{126,70,18},{81,90,0},{0,88,20},{126,70,18},{0,88,20},{83,0,20}, +{83,0,20},{83,0,20},{83,0,20},{82,91,0},{82,91,0},{82,91,0},{82,86,1},{79,88,0},{79,88,0},{88,101,38},{88,97,20},{88,94,24},{87,94,21},{86,102,51},{86,96,19},{86,94,2},{86,92,24},{81,96,52},{83,92,20},{89,99,18},{89,96,2},{89,94,1},{89,93,5},{127,19,51},{87,95,19},{86,94,2},{83,92,20},{127,74,51},{83,92,20},{88,97,20},{88,97,20},{88,97,20}, +{87,93,20},{86,98,8},{86,93,2},{86,93,2},{86,91,1},{82,94,8},{83,91,2},{89,95,0},{89,95,0},{89,95,0},{89,92,0},{127,14,8},{87,93,0},{87,93,0},{85,91,0},{127,72,8},{85,91,0},{127,22,18},{88,97,0},{89,94,1},{85,94,0},{127,22,18},{126,76,18},{85,94,0},{0,92,20},{126,76,18},{0,92,20},{87,0,20},{87,0,20},{87,0,20},{87,0,20},{86,95,0}, +{86,95,0},{86,95,0},{86,90,1},{83,92,0},{83,92,0},{92,105,38},{92,101,20},{92,98,24},{91,98,21},{90,106,51},{90,100,19},{90,98,2},{90,96,24},{85,100,52},{87,96,20},{93,103,18},{93,100,2},{93,98,1},{93,97,5},{127,31,51},{91,99,19},{90,98,2},{87,96,20},{127,80,51},{87,96,20},{92,101,20},{92,101,20},{92,101,20},{91,97,20},{90,102,8},{90,97,2},{90,97,2}, +{90,95,1},{86,98,8},{87,95,2},{93,99,0},{93,99,0},{93,99,0},{93,96,0},{127,27,8},{91,97,0},{91,97,0},{89,95,0},{126,78,8},{89,95,0},{127,34,18},{92,101,0},{93,98,1},{89,98,0},{127,34,18},{126,82,18},{89,98,0},{0,96,20},{126,82,18},{0,96,20},{91,0,20},{91,0,20},{91,0,20},{91,0,20},{90,99,0},{90,99,0},{90,99,0},{90,94,1},{87,96,0}, +{87,96,0},{96,111,36},{96,106,18},{96,103,23},{96,102,20},{95,110,52},{95,104,20},{95,102,2},{94,101,23},{89,105,51},{91,101,18},{98,107,19},{97,105,1},{98,102,2},{97,102,6},{127,45,51},{95,104,19},{95,102,1},{90,101,18},{126,87,51},{90,101,18},{96,106,18},{96,106,18},{96,106,18},{96,101,18},{95,105,9},{95,102,1},{95,102,1},{94,99,2},{91,102,8},{92,100,1},{98,102,1}, +{98,102,1},{98,102,1},{98,100,1},{127,40,8},{96,101,0},{96,101,0},{94,99,1},{126,85,8},{94,99,1},{127,48,18},{97,105,0},{98,102,1},{94,102,1},{127,48,18},{127,88,18},{94,102,1},{0,101,18},{127,88,18},{0,101,18},{96,0,18},{96,0,18},{96,0,18},{96,0,18},{95,102,1},{95,102,1},{95,102,1},{94,99,1},{92,100,0},{92,100,0},{100,115,36},{100,110,18},{100,107,23}, +{100,106,20},{99,114,52},{99,108,20},{99,106,2},{98,105,23},{93,109,51},{95,105,18},{102,111,19},{101,109,1},{102,106,2},{101,106,6},{127,57,51},{99,108,19},{99,106,1},{94,105,18},{126,93,51},{94,105,18},{100,110,18},{100,110,18},{100,110,18},{100,105,18},{99,109,9},{99,106,1},{99,106,1},{98,103,2},{95,106,8},{96,104,1},{102,106,1},{102,106,1},{102,106,1},{102,104,1},{127,53,8}, +{100,105,0},{100,105,0},{98,103,1},{126,91,8},{98,103,1},{127,60,18},{101,109,0},{102,106,1},{98,106,1},{127,60,18},{127,94,18},{98,106,1},{0,105,18},{127,94,18},{0,105,18},{100,0,18},{100,0,18},{100,0,18},{100,0,18},{99,106,1},{99,106,1},{99,106,1},{98,103,1},{96,104,0},{96,104,0},{104,119,36},{104,114,18},{104,111,23},{104,110,20},{103,118,52},{103,112,20},{103,110,2}, +{102,109,23},{97,113,51},{99,109,18},{106,115,19},{105,113,1},{106,110,2},{105,110,6},{127,69,51},{103,112,19},{103,110,1},{98,109,18},{126,99,51},{98,109,18},{104,114,18},{104,114,18},{104,114,18},{104,109,18},{103,113,9},{103,110,1},{103,110,1},{102,107,2},{99,110,8},{100,108,1},{106,110,1},{106,110,1},{106,110,1},{106,108,1},{127,64,8},{104,109,0},{104,109,0},{102,107,1},{126,97,8}, +{102,107,1},{127,72,18},{105,113,0},{106,110,1},{102,110,1},{127,72,18},{127,100,18},{102,110,1},{0,109,18},{127,100,18},{0,109,18},{104,0,18},{104,0,18},{104,0,18},{104,0,18},{103,110,1},{103,110,1},{103,110,1},{102,107,1},{100,108,0},{100,108,0},{108,123,36},{108,118,18},{108,115,23},{108,114,20},{107,122,52},{107,116,20},{107,114,2},{106,113,23},{101,117,51},{103,113,18},{110,119,19}, +{109,117,1},{110,114,2},{109,114,6},{127,81,51},{107,116,19},{107,114,1},{102,113,18},{126,105,51},{102,113,18},{108,118,18},{108,118,18},{108,118,18},{108,113,18},{107,117,9},{107,114,1},{107,114,1},{106,111,2},{103,114,8},{104,112,1},{110,114,1},{110,114,1},{110,114,1},{110,112,1},{127,76,8},{108,113,0},{108,113,0},{106,111,1},{126,103,8},{106,111,1},{127,84,18},{109,117,0},{110,114,1}, +{106,114,1},{127,84,18},{127,106,18},{106,114,1},{0,113,18},{127,106,18},{0,113,18},{108,0,18},{108,0,18},{108,0,18},{108,0,18},{107,114,1},{107,114,1},{107,114,1},{106,111,1},{104,112,0},{104,112,0},{113,126,38},{113,122,20},{113,119,24},{112,119,21},{111,127,51},{111,121,19},{111,119,2},{111,117,24},{106,121,52},{108,117,20},{114,124,18},{114,121,2},{114,119,1},{114,118,5},{127,95,51}, +{112,120,19},{111,119,2},{108,117,20},{127,111,51},{108,117,20},{113,122,20},{113,122,20},{113,122,20},{112,118,20},{111,123,8},{111,118,2},{111,118,2},{111,116,1},{107,119,8},{108,116,2},{114,120,0},{114,120,0},{114,120,0},{114,117,0},{127,90,8},{112,118,0},{112,118,0},{110,116,0},{127,109,8},{110,116,0},{127,98,18},{113,122,0},{114,119,1},{110,119,0},{127,98,18},{126,113,18},{110,119,0}, +{0,117,20},{126,113,18},{0,117,20},{112,0,20},{112,0,20},{112,0,20},{112,0,20},{111,120,0},{111,120,0},{111,120,0},{111,115,1},{108,117,0},{108,117,0},{117,127,46},{117,126,20},{117,123,24},{116,123,21},{116,126,63},{115,125,19},{115,123,2},{115,121,24},{110,125,52},{112,121,20},{118,127,20},{118,125,2},{118,123,1},{118,122,5},{127,107,51},{116,124,19},{115,123,2},{112,121,20},{127,117,51}, +{112,121,20},{117,126,20},{117,126,20},{117,126,20},{116,122,20},{115,127,8},{115,122,2},{115,122,2},{115,120,1},{111,123,8},{112,120,2},{118,124,0},{118,124,0},{118,124,0},{118,121,0},{127,102,8},{116,122,0},{116,122,0},{114,120,0},{127,115,8},{114,120,0},{127,110,18},{117,126,0},{118,123,1},{114,123,0},{127,110,18},{126,119,18},{114,123,0},{0,121,20},{126,119,18},{0,121,20},{116,0,20}, +{116,0,20},{116,0,20},{116,0,20},{115,124,0},{115,124,0},{115,124,0},{115,119,1},{112,121,0},{112,121,0},{122,126,86},{121,127,40},{121,127,24},{120,127,21},{121,127,88},{119,127,27},{119,127,2},{119,125,24},{116,127,60},{116,125,20},{123,127,30},{122,127,10},{122,127,1},{122,126,5},{127,119,51},{121,127,24},{119,127,2},{116,125,20},{127,123,51},{116,125,20},{121,127,24},{121,127,24},{121,127,24}, +{120,126,20},{120,127,14},{119,126,2},{119,126,2},{119,124,1},{115,127,8},{116,124,2},{122,126,1},{122,126,1},{122,126,1},{122,125,0},{127,115,8},{120,126,0},{120,126,0},{118,124,0},{127,121,8},{118,124,0},{127,122,18},{124,127,8},{122,127,1},{118,127,0},{127,122,18},{126,125,18},{118,127,0},{0,125,20},{126,125,18},{0,125,20},{120,0,20},{120,0,20},{120,0,20},{120,0,20},{119,126,1}, +{119,126,1},{119,126,1},{119,123,1},{116,125,0},{116,125,0},{125,126,38},{125,127,30},{125,127,29},{125,127,21},{125,126,35},{124,127,16},{124,127,12},{123,127,1},{122,127,20},{122,127,2},{126,127,2},{126,127,2},{126,127,1},{126,127,1},{127,125,3},{127,126,3},{125,127,2},{124,127,0},{127,126,3},{124,127,0},{125,126,29},{125,126,29},{125,126,29},{125,127,21},{124,127,24},{124,127,12},{124,127,12}, +{123,127,1},{122,127,11},{122,127,2},{126,127,1},{126,127,1},{126,127,1},{126,127,1},{127,125,2},{127,126,2},{127,126,2},{124,127,0},{127,126,2},{124,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{124,0,20},{124,0,20},{124,0,20},{124,0,20},{124,127,8},{124,127,8},{124,127,8},{123,127,1},{122,127,2}, +{122,127,2},{0,16,72},{0,11,8},{0,8,1},{0,7,25},{0,10,153},{0,8,97},{0,6,50},{0,4,115},{0,5,162},{0,4,124},{0,16,72},{0,11,8},{0,8,1},{0,7,25},{5,0,153},{0,8,97},{0,6,50},{0,4,115},{10,0,153},{0,4,115},{0,7,0},{0,7,0},{0,7,0},{0,4,0},{0,3,13},{0,2,5},{0,2,5},{0,1,10},{0,2,14},{0,1,11},{0,7,0}, +{0,7,0},{0,7,0},{0,4,0},{2,0,13},{0,2,5},{0,2,5},{0,1,10},{3,0,13},{0,1,10},{8,0,72},{0,11,8},{0,8,1},{0,7,25},{8,0,72},{16,0,72},{0,7,25},{0,5,74},{16,0,72},{0,5,74},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,27,77},{1,18,5},{1,13,15}, +{1,11,18},{0,21,243},{0,14,108},{0,11,29},{0,8,154},{0,9,287},{0,8,179},{2,25,73},{1,18,1},{2,12,6},{1,11,14},{10,1,243},{0,14,108},{0,11,29},{0,8,154},{21,0,243},{0,8,154},{1,17,5},{1,17,5},{1,17,5},{1,9,5},{0,12,50},{0,8,8},{0,8,8},{0,5,25},{0,5,61},{0,5,34},{2,15,1},{2,15,1},{2,15,1},{1,9,1},{6,0,50}, +{0,8,8},{0,8,8},{0,5,25},{12,0,50},{0,5,25},{14,0,72},{1,18,0},{4,12,1},{0,12,10},{14,0,72},{29,0,72},{0,12,10},{0,9,74},{29,0,72},{0,9,74},{1,0,5},{1,0,5},{1,0,5},{1,0,5},{0,4,0},{0,4,0},{0,4,0},{0,2,0},{0,2,1},{0,2,1},{3,35,133},{3,24,63},{4,17,90},{3,16,66},{0,33,243},{0,19,75},{0,16,2}, +{0,13,110},{0,14,345},{0,12,179},{6,29,73},{5,22,1},{6,16,6},{5,15,14},{16,0,243},{0,19,75},{0,16,2},{0,13,110},{33,0,243},{0,13,110},{3,26,61},{3,26,61},{3,26,61},{3,14,61},{0,24,50},{0,16,1},{0,16,1},{0,10,5},{0,11,101},{0,9,46},{6,19,1},{6,19,1},{6,19,1},{5,13,1},{12,0,50},{1,15,0},{1,15,0},{0,10,5},{24,0,50}, +{0,10,5},{20,0,72},{5,22,0},{8,16,1},{0,16,2},{20,0,72},{41,0,72},{0,16,2},{0,13,74},{41,0,72},{0,13,74},{3,0,61},{3,0,61},{3,0,61},{3,0,61},{0,16,0},{0,16,0},{0,16,0},{0,8,0},{0,5,25},{0,5,25},{7,39,146},{7,28,76},{8,21,107},{6,20,79},{4,37,244},{4,23,76},{4,20,3},{3,16,107},{0,22,292},{0,17,106},{10,33,73}, +{9,26,1},{10,20,6},{9,19,14},{22,0,243},{2,25,72},{4,20,2},{0,17,90},{45,0,243},{0,17,90},{7,30,74},{7,30,74},{7,30,74},{7,18,74},{4,28,51},{4,20,2},{4,20,2},{3,14,6},{0,17,68},{0,14,5},{10,23,1},{10,23,1},{10,23,1},{9,17,1},{18,0,50},{5,19,0},{5,19,0},{0,14,1},{36,0,50},{0,14,1},{26,0,72},{9,26,0},{12,20,1}, +{3,20,1},{26,0,72},{53,0,72},{3,20,1},{0,17,74},{53,0,72},{0,17,74},{6,0,74},{6,0,74},{6,0,74},{6,0,74},{4,20,1},{4,20,1},{4,20,1},{4,12,1},{0,14,4},{0,14,4},{11,44,144},{11,32,76},{12,25,105},{11,24,77},{8,43,243},{8,28,75},{8,25,2},{8,21,105},{0,28,248},{1,22,76},{14,38,72},{14,30,1},{15,25,5},{14,24,13},{29,0,243}, +{7,29,72},{8,25,2},{0,22,76},{59,0,243},{0,22,76},{11,35,72},{11,35,72},{11,35,72},{11,23,72},{8,34,50},{8,24,1},{8,24,1},{8,18,5},{1,24,51},{3,19,1},{14,29,0},{14,29,0},{14,29,0},{14,21,1},{24,1,50},{9,24,0},{9,24,0},{3,19,0},{50,0,50},{3,19,0},{33,0,72},{13,31,0},{16,25,0},{6,25,0},{33,0,72},{66,0,72},{6,25,0}, +{0,22,72},{66,0,72},{0,22,72},{11,0,72},{11,0,72},{11,0,72},{11,0,72},{8,26,0},{8,26,0},{8,26,0},{8,17,0},{2,20,0},{2,20,0},{15,48,144},{15,36,76},{16,29,105},{15,28,77},{12,47,243},{12,32,75},{12,29,2},{12,25,105},{2,33,244},{5,26,76},{18,42,72},{18,34,1},{19,29,5},{18,28,13},{35,0,243},{11,33,72},{12,29,2},{1,26,72},{71,0,243}, +{1,26,72},{15,39,72},{15,39,72},{15,39,72},{15,27,72},{12,38,50},{12,28,1},{12,28,1},{12,22,5},{5,28,51},{7,23,1},{18,33,0},{18,33,0},{18,33,0},{18,25,1},{30,1,50},{13,28,0},{13,28,0},{7,23,0},{62,0,50},{7,23,0},{39,0,72},{17,35,0},{20,29,0},{10,29,0},{39,0,72},{78,0,72},{10,29,0},{0,26,72},{78,0,72},{0,26,72},{15,0,72}, +{15,0,72},{15,0,72},{15,0,72},{12,30,0},{12,30,0},{12,30,0},{12,21,0},{6,24,0},{6,24,0},{19,52,144},{19,40,76},{20,33,105},{19,32,77},{16,51,243},{16,36,75},{16,33,2},{16,29,105},{6,37,244},{9,30,76},{22,46,72},{22,38,1},{23,33,5},{22,32,13},{41,0,243},{15,37,72},{16,33,2},{5,30,72},{83,0,243},{5,30,72},{19,43,72},{19,43,72},{19,43,72}, +{19,31,72},{16,42,50},{16,32,1},{16,32,1},{16,26,5},{9,32,51},{11,27,1},{22,37,0},{22,37,0},{22,37,0},{22,29,1},{36,1,50},{17,32,0},{17,32,0},{11,27,0},{74,0,50},{11,27,0},{45,0,72},{21,39,0},{24,33,0},{14,33,0},{45,0,72},{91,0,72},{14,33,0},{0,30,72},{91,0,72},{0,30,72},{19,0,72},{19,0,72},{19,0,72},{19,0,72},{16,34,0}, +{16,34,0},{16,34,0},{16,25,0},{10,28,0},{10,28,0},{23,56,144},{23,44,76},{24,37,105},{23,36,77},{20,55,243},{20,40,75},{20,37,2},{20,33,105},{10,41,244},{13,34,76},{26,50,72},{26,42,1},{27,37,5},{26,36,13},{47,0,243},{19,41,72},{20,37,2},{9,34,72},{95,0,243},{9,34,72},{23,47,72},{23,47,72},{23,47,72},{23,35,72},{20,46,50},{20,36,1},{20,36,1}, +{20,30,5},{13,36,51},{15,31,1},{26,41,0},{26,41,0},{26,41,0},{26,33,1},{42,1,50},{21,36,0},{21,36,0},{15,31,0},{86,0,50},{15,31,0},{50,1,72},{25,43,0},{28,37,0},{18,37,0},{50,1,72},{103,0,72},{18,37,0},{0,34,72},{103,0,72},{0,34,72},{23,0,72},{23,0,72},{23,0,72},{23,0,72},{20,38,0},{20,38,0},{20,38,0},{20,29,0},{14,32,0}, +{14,32,0},{28,60,146},{28,49,76},{29,42,107},{27,41,79},{25,58,244},{25,44,76},{25,41,3},{24,37,107},{14,46,244},{17,38,76},{31,54,73},{30,47,1},{31,41,6},{30,40,14},{53,1,243},{23,46,72},{25,41,2},{15,38,74},{109,0,243},{15,38,74},{28,51,74},{28,51,74},{28,51,74},{28,39,74},{25,49,51},{25,41,2},{25,41,2},{24,35,6},{18,40,51},{19,36,1},{31,44,1}, +{31,44,1},{31,44,1},{30,38,1},{49,0,50},{26,40,0},{26,40,0},{21,35,1},{100,0,50},{21,35,1},{57,0,72},{30,47,0},{33,41,1},{24,41,1},{57,0,72},{117,0,72},{24,41,1},{0,38,74},{117,0,72},{0,38,74},{27,0,74},{27,0,74},{27,0,74},{27,0,74},{25,41,1},{25,41,1},{25,41,1},{25,33,1},{19,36,0},{19,36,0},{32,64,146},{32,53,76},{33,46,107}, +{31,45,79},{29,62,244},{29,48,76},{29,45,3},{28,41,107},{18,50,244},{21,42,76},{35,58,73},{34,51,1},{35,45,6},{34,44,14},{59,1,243},{27,50,72},{29,45,2},{19,42,74},{121,0,243},{19,42,74},{32,55,74},{32,55,74},{32,55,74},{32,43,74},{29,53,51},{29,45,2},{29,45,2},{28,39,6},{22,44,51},{23,40,1},{35,48,1},{35,48,1},{35,48,1},{34,42,1},{55,0,50}, +{30,44,0},{30,44,0},{25,39,1},{112,0,50},{25,39,1},{63,0,72},{34,51,0},{37,45,1},{28,45,1},{63,0,72},{127,1,72},{28,45,1},{0,42,74},{127,1,72},{0,42,74},{31,0,74},{31,0,74},{31,0,74},{31,0,74},{29,45,1},{29,45,1},{29,45,1},{29,37,1},{23,40,0},{23,40,0},{36,67,146},{36,57,76},{37,50,107},{35,49,79},{33,66,244},{33,52,76},{33,49,3}, +{32,45,107},{22,54,244},{25,46,76},{39,62,73},{38,55,1},{39,49,6},{38,48,14},{65,0,243},{31,54,72},{33,49,2},{23,46,74},{127,3,243},{23,46,74},{36,59,74},{36,59,74},{36,59,74},{36,47,74},{33,57,51},{33,49,2},{33,49,2},{32,43,6},{26,48,51},{27,44,1},{39,52,1},{39,52,1},{39,52,1},{38,46,1},{61,0,50},{34,48,0},{34,48,0},{29,43,1},{124,0,50}, +{29,43,1},{69,0,72},{38,55,0},{41,49,1},{32,49,1},{69,0,72},{127,7,72},{32,49,1},{0,46,74},{127,7,72},{0,46,74},{35,0,74},{35,0,74},{35,0,74},{35,0,74},{33,49,1},{33,49,1},{33,49,1},{33,41,1},{27,44,0},{27,44,0},{40,71,146},{40,61,76},{41,54,107},{39,53,79},{37,70,244},{37,56,76},{37,53,3},{36,49,107},{26,58,244},{29,50,76},{43,65,73}, +{42,59,1},{43,53,6},{42,52,14},{71,0,243},{35,58,72},{37,53,2},{27,50,74},{127,9,243},{27,50,74},{40,63,74},{40,63,74},{40,63,74},{40,51,74},{37,61,51},{37,53,2},{37,53,2},{36,47,6},{30,52,51},{31,48,1},{43,56,1},{43,56,1},{43,56,1},{42,50,1},{66,1,50},{38,52,0},{38,52,0},{33,47,1},{126,5,50},{33,47,1},{75,0,72},{42,59,0},{45,53,1}, +{36,53,1},{75,0,72},{127,13,72},{36,53,1},{0,50,74},{127,13,72},{0,50,74},{39,0,74},{39,0,74},{39,0,74},{39,0,74},{37,53,1},{37,53,1},{37,53,1},{37,45,1},{31,48,0},{31,48,0},{44,77,144},{44,65,77},{45,58,105},{44,57,77},{41,75,243},{41,61,75},{41,58,2},{41,54,105},{31,62,244},{34,55,76},{47,71,72},{47,63,1},{48,58,5},{47,57,13},{78,0,243}, +{40,62,72},{41,58,2},{30,55,72},{126,16,243},{30,55,72},{44,68,72},{44,68,72},{44,68,72},{44,56,72},{41,66,50},{41,57,1},{41,57,1},{41,51,5},{34,57,51},{36,52,1},{47,62,0},{47,62,0},{47,62,0},{47,54,1},{73,0,50},{42,57,0},{42,57,0},{36,52,0},{126,12,50},{36,52,0},{81,0,72},{47,63,1},{49,58,0},{39,58,0},{81,0,72},{126,20,72},{39,58,0}, +{0,55,72},{126,20,72},{0,55,72},{44,0,72},{44,0,72},{44,0,72},{44,0,72},{41,59,0},{41,59,0},{41,59,0},{41,50,0},{35,53,0},{35,53,0},{48,81,144},{48,69,77},{49,62,105},{48,61,77},{45,79,243},{45,65,73},{45,62,2},{45,58,105},{34,67,243},{38,59,76},{51,75,72},{51,66,1},{52,62,5},{51,61,13},{83,1,243},{45,65,73},{45,62,2},{34,59,72},{126,22,243}, +{34,59,72},{48,72,72},{48,72,72},{48,72,72},{48,60,72},{45,70,50},{45,61,1},{45,61,1},{45,55,5},{38,61,51},{40,56,1},{51,65,0},{51,65,0},{51,65,0},{51,58,1},{79,0,50},{46,61,0},{46,61,0},{40,56,0},{127,17,50},{40,56,0},{87,0,72},{51,66,1},{53,62,0},{43,62,0},{87,0,72},{126,26,72},{43,62,0},{0,59,72},{126,26,72},{0,59,72},{48,0,72}, +{48,0,72},{48,0,72},{48,0,72},{45,63,0},{45,63,0},{45,63,0},{45,54,0},{39,57,0},{39,57,0},{52,85,144},{52,73,77},{53,67,105},{52,65,77},{49,83,243},{49,69,73},{49,65,2},{49,62,105},{38,71,243},{42,63,76},{55,79,72},{55,70,1},{55,66,5},{54,65,14},{89,1,243},{49,69,73},{49,65,2},{38,63,72},{126,28,243},{38,63,72},{52,76,72},{52,76,72},{52,76,72}, +{52,63,73},{49,74,50},{49,65,1},{49,65,1},{49,59,5},{41,65,50},{44,60,1},{55,69,0},{55,69,0},{55,69,0},{55,62,1},{85,0,50},{50,64,1},{50,64,1},{44,60,0},{127,23,50},{44,60,0},{93,0,72},{55,70,1},{57,65,1},{48,65,1},{93,0,72},{126,32,72},{48,65,1},{0,63,72},{126,32,72},{0,63,72},{52,0,72},{52,0,72},{52,0,72},{52,0,72},{49,67,0}, +{49,67,0},{49,67,0},{49,58,0},{43,61,0},{43,61,0},{56,89,144},{56,77,77},{57,71,105},{56,69,77},{53,87,243},{53,73,73},{53,69,2},{52,66,103},{42,75,243},{45,66,79},{59,83,72},{59,74,1},{59,70,5},{58,69,14},{95,1,243},{53,73,73},{53,69,2},{43,66,74},{126,34,243},{43,66,74},{56,80,72},{56,80,72},{56,80,72},{56,67,73},{53,78,50},{53,69,1},{53,69,1}, +{53,63,5},{45,69,50},{47,64,2},{59,73,0},{59,73,0},{59,73,0},{59,66,0},{91,0,50},{55,67,1},{55,67,1},{47,64,1},{127,29,50},{47,64,1},{99,0,72},{59,74,1},{61,69,1},{52,69,1},{99,0,72},{126,38,72},{52,69,1},{0,66,74},{126,38,72},{0,66,74},{56,0,72},{56,0,72},{56,0,72},{56,0,72},{53,71,0},{53,71,0},{53,71,0},{53,62,0},{47,64,1}, +{47,64,1},{61,92,146},{61,80,79},{61,75,103},{60,74,78},{58,91,244},{57,78,74},{58,74,2},{56,70,105},{47,79,243},{49,71,77},{63,88,73},{63,79,2},{64,74,5},{63,73,14},{102,0,243},{57,78,73},{58,74,1},{47,71,72},{126,41,243},{47,71,72},{61,83,74},{61,83,74},{61,83,74},{60,72,74},{58,82,51},{58,73,2},{58,73,2},{57,68,5},{50,73,50},{52,68,1},{63,79,1}, +{63,79,1},{63,79,1},{63,71,1},{98,0,50},{59,72,1},{59,72,1},{53,68,0},{127,36,50},{53,68,0},{106,0,72},{63,79,1},{65,74,0},{56,74,0},{106,0,72},{127,44,72},{56,74,0},{0,71,72},{127,44,72},{0,71,72},{60,0,74},{60,0,74},{60,0,74},{60,0,74},{58,74,1},{58,74,1},{58,74,1},{57,66,1},{52,68,1},{52,68,1},{64,97,144},{64,85,76},{65,78,105}, +{64,77,77},{62,95,244},{61,82,74},{62,78,2},{60,74,105},{51,83,243},{53,75,77},{67,91,72},{67,83,1},{68,78,5},{67,77,13},{108,0,243},{61,82,73},{62,78,1},{51,75,72},{125,47,243},{51,75,72},{64,88,72},{64,88,72},{64,88,72},{64,76,72},{62,86,51},{62,77,2},{62,77,2},{61,72,5},{54,77,50},{56,72,1},{67,82,0},{67,82,0},{67,82,0},{67,74,1},{104,0,50}, +{63,76,1},{63,76,1},{57,72,0},{127,42,50},{57,72,0},{112,0,72},{66,84,0},{69,78,0},{60,78,0},{112,0,72},{127,50,72},{60,78,0},{0,75,72},{127,50,72},{0,75,72},{64,0,72},{64,0,72},{64,0,72},{64,0,72},{62,78,1},{62,78,1},{62,78,1},{61,70,1},{56,72,1},{56,72,1},{68,101,144},{68,89,76},{69,82,105},{68,81,77},{65,100,243},{65,85,75},{65,82,2}, +{65,78,105},{55,87,243},{57,79,77},{71,95,72},{71,87,1},{72,82,5},{71,81,13},{114,0,243},{64,86,72},{65,82,2},{55,79,72},{127,52,243},{55,79,72},{68,92,72},{68,92,72},{68,92,72},{68,80,72},{65,91,50},{65,81,1},{65,81,1},{65,75,5},{58,81,50},{60,76,1},{71,86,0},{71,86,0},{71,86,0},{71,78,1},{110,0,50},{66,81,0},{66,81,0},{61,76,0},{126,48,50}, +{61,76,0},{118,0,72},{70,88,0},{73,82,0},{64,82,0},{118,0,72},{127,56,72},{64,82,0},{0,79,72},{127,56,72},{0,79,72},{68,0,72},{68,0,72},{68,0,72},{68,0,72},{65,83,0},{65,83,0},{65,83,0},{65,74,0},{60,76,1},{60,76,1},{72,105,144},{72,93,76},{73,86,105},{72,85,77},{69,104,243},{69,89,75},{69,86,2},{69,82,105},{59,91,243},{61,83,77},{75,99,72}, +{75,91,1},{76,86,5},{75,85,13},{120,0,243},{68,90,72},{69,86,2},{59,83,72},{127,58,243},{59,83,72},{72,96,72},{72,96,72},{72,96,72},{72,84,72},{69,95,50},{69,85,1},{69,85,1},{69,79,5},{62,85,50},{64,80,1},{75,90,0},{75,90,0},{75,90,0},{75,82,1},{115,1,50},{70,85,0},{70,85,0},{64,80,0},{126,54,50},{64,80,0},{124,0,72},{74,92,0},{77,86,0}, +{67,86,0},{124,0,72},{127,62,72},{67,86,0},{0,83,72},{127,62,72},{0,83,72},{72,0,72},{72,0,72},{72,0,72},{72,0,72},{69,87,0},{69,87,0},{69,87,0},{69,78,0},{64,80,1},{64,80,1},{77,109,146},{77,98,76},{78,91,107},{76,90,79},{74,107,244},{74,93,76},{74,90,3},{73,86,107},{63,96,243},{66,87,76},{80,103,73},{79,96,1},{80,90,6},{79,89,14},{127,0,243}, +{72,95,72},{74,90,2},{64,87,74},{126,65,243},{64,87,74},{77,100,74},{77,100,74},{77,100,74},{77,88,74},{74,98,51},{74,90,2},{74,90,2},{73,84,6},{67,89,51},{68,85,1},{80,93,1},{80,93,1},{80,93,1},{79,87,1},{122,0,50},{75,89,0},{75,89,0},{70,84,1},{126,61,50},{70,84,1},{127,7,72},{79,96,0},{82,90,1},{73,90,1},{127,7,72},{127,68,72},{73,90,1}, +{0,87,74},{127,68,72},{0,87,74},{76,0,74},{76,0,74},{76,0,74},{76,0,74},{74,90,1},{74,90,1},{74,90,1},{74,82,1},{68,85,0},{68,85,0},{81,113,146},{81,102,76},{82,95,107},{80,94,79},{78,111,244},{78,97,76},{78,94,3},{77,90,107},{67,99,244},{70,91,76},{84,107,73},{83,100,1},{84,94,6},{83,93,14},{127,11,243},{76,99,72},{78,94,2},{68,91,74},{126,71,243}, +{68,91,74},{81,104,74},{81,104,74},{81,104,74},{81,92,74},{78,102,51},{78,94,2},{78,94,2},{77,88,6},{71,93,51},{72,89,1},{84,97,1},{84,97,1},{84,97,1},{83,91,1},{127,2,50},{79,93,0},{79,93,0},{74,88,1},{127,66,50},{74,88,1},{127,19,72},{83,100,0},{86,94,1},{77,94,1},{127,19,72},{127,74,72},{77,94,1},{0,91,74},{127,74,72},{0,91,74},{80,0,74}, +{80,0,74},{80,0,74},{80,0,74},{78,94,1},{78,94,1},{78,94,1},{78,86,1},{72,89,0},{72,89,0},{85,117,146},{85,106,76},{86,99,107},{84,98,79},{82,115,244},{82,101,76},{82,98,3},{81,94,107},{71,103,244},{74,95,76},{88,111,73},{87,104,1},{88,98,6},{87,97,14},{127,24,243},{80,103,72},{82,98,2},{72,95,74},{125,77,243},{72,95,74},{85,108,74},{85,108,74},{85,108,74}, +{85,96,74},{82,106,51},{82,98,2},{82,98,2},{81,92,6},{75,97,51},{76,93,1},{88,101,1},{88,101,1},{88,101,1},{87,95,1},{127,14,50},{83,97,0},{83,97,0},{78,92,1},{127,72,50},{78,92,1},{127,31,72},{87,104,0},{90,98,1},{81,98,1},{127,31,72},{127,80,72},{81,98,1},{0,95,74},{127,80,72},{0,95,74},{84,0,74},{84,0,74},{84,0,74},{84,0,74},{82,98,1}, +{82,98,1},{82,98,1},{82,90,1},{76,93,0},{76,93,0},{89,121,146},{89,110,76},{90,103,107},{88,102,79},{86,119,244},{86,105,76},{86,102,3},{85,98,107},{75,107,244},{78,99,76},{92,115,73},{91,108,1},{92,102,6},{91,101,14},{127,36,243},{84,107,72},{86,102,2},{76,99,74},{127,82,243},{76,99,74},{89,112,74},{89,112,74},{89,112,74},{89,100,74},{86,110,51},{86,102,2},{86,102,2}, +{85,96,6},{79,101,51},{80,97,1},{92,105,1},{92,105,1},{92,105,1},{91,99,1},{127,27,50},{87,101,0},{87,101,0},{82,96,1},{126,78,50},{82,96,1},{127,43,72},{91,108,0},{94,102,1},{85,102,1},{127,43,72},{127,86,72},{85,102,1},{0,99,74},{127,86,72},{0,99,74},{88,0,74},{88,0,74},{88,0,74},{88,0,74},{86,102,1},{86,102,1},{86,102,1},{86,94,1},{80,97,0}, +{80,97,0},{93,126,144},{93,114,76},{94,107,105},{93,106,77},{90,125,243},{90,110,75},{90,107,2},{90,103,105},{80,111,244},{83,104,76},{96,120,72},{96,112,1},{97,107,5},{96,106,13},{127,50,243},{89,111,72},{90,107,2},{79,104,72},{127,89,243},{79,104,72},{93,117,72},{93,117,72},{93,117,72},{93,105,72},{90,116,50},{90,106,1},{90,106,1},{90,100,5},{83,106,51},{85,101,1},{96,111,0}, +{96,111,0},{96,111,0},{96,103,1},{127,40,50},{91,106,0},{91,106,0},{85,101,0},{126,85,50},{85,101,0},{127,57,72},{95,113,0},{98,107,0},{88,107,0},{127,57,72},{126,93,72},{88,107,0},{0,104,72},{126,93,72},{0,104,72},{93,0,72},{93,0,72},{93,0,72},{93,0,72},{90,108,0},{90,108,0},{90,108,0},{90,99,0},{84,102,0},{84,102,0},{97,127,152},{97,118,76},{98,111,105}, +{97,110,77},{94,127,244},{94,114,75},{94,111,2},{94,107,105},{84,115,244},{87,108,76},{100,124,72},{100,116,1},{101,111,5},{100,110,13},{127,62,243},{93,115,72},{94,111,2},{83,108,72},{127,95,243},{83,108,72},{97,121,72},{97,121,72},{97,121,72},{97,109,72},{94,120,50},{94,110,1},{94,110,1},{94,104,5},{87,110,51},{89,105,1},{100,115,0},{100,115,0},{100,115,0},{100,107,1},{127,53,50}, +{95,110,0},{95,110,0},{89,105,0},{126,91,50},{89,105,0},{127,69,72},{99,117,0},{102,111,0},{92,111,0},{127,69,72},{126,99,72},{92,111,0},{0,108,72},{126,99,72},{0,108,72},{97,0,72},{97,0,72},{97,0,72},{97,0,72},{94,112,0},{94,112,0},{94,112,0},{94,103,0},{88,106,0},{88,106,0},{102,126,184},{101,122,76},{102,115,105},{101,114,77},{100,127,260},{98,118,75},{98,115,2}, +{98,111,105},{88,119,244},{91,112,76},{104,127,74},{104,120,1},{105,115,5},{104,114,13},{127,73,243},{97,119,72},{98,115,2},{87,112,72},{127,101,243},{87,112,72},{101,125,72},{101,125,72},{101,125,72},{101,113,72},{98,124,50},{98,114,1},{98,114,1},{98,108,5},{91,114,51},{93,109,1},{104,119,0},{104,119,0},{104,119,0},{104,111,1},{127,64,50},{99,114,0},{99,114,0},{93,109,0},{126,97,50}, +{93,109,0},{127,81,72},{103,121,0},{106,115,0},{96,115,0},{127,81,72},{126,105,72},{96,115,0},{0,112,72},{126,105,72},{0,112,72},{101,0,72},{101,0,72},{101,0,72},{101,0,72},{98,116,0},{98,116,0},{98,116,0},{98,107,0},{92,110,0},{92,110,0},{106,127,224},{105,126,76},{106,119,105},{105,118,77},{104,127,299},{102,122,75},{102,119,2},{102,115,105},{92,123,244},{95,116,76},{109,127,84}, +{108,124,1},{109,119,5},{108,118,13},{127,86,243},{101,123,72},{102,119,2},{91,116,72},{127,107,243},{91,116,72},{105,126,76},{105,126,76},{105,126,76},{105,117,72},{102,126,52},{102,118,1},{102,118,1},{102,112,5},{95,118,51},{97,113,1},{108,123,0},{108,123,0},{108,123,0},{108,115,1},{127,76,50},{103,118,0},{103,118,0},{97,113,0},{126,103,50},{97,113,0},{127,93,72},{107,125,0},{110,119,0}, +{100,119,0},{127,93,72},{126,111,72},{100,119,0},{0,116,72},{126,111,72},{0,116,72},{105,0,72},{105,0,72},{105,0,72},{105,0,72},{102,120,0},{102,120,0},{102,120,0},{102,111,0},{96,114,0},{96,114,0},{111,127,290},{111,127,103},{111,124,107},{109,123,79},{111,127,345},{107,126,76},{107,123,3},{106,119,107},{98,127,248},{99,120,76},{114,127,113},{113,127,5},{113,123,6},{112,122,14},{127,99,243}, +{107,126,75},{107,123,2},{97,120,74},{126,114,243},{97,120,74},{110,126,90},{110,126,90},{110,126,90},{110,121,74},{108,126,67},{107,123,2},{107,123,2},{106,117,6},{100,122,51},{101,118,1},{113,126,1},{113,126,1},{113,126,1},{112,120,1},{127,90,50},{108,122,0},{108,122,0},{103,117,1},{127,109,50},{103,117,1},{127,107,72},{113,127,4},{115,123,1},{106,123,1},{127,107,72},{127,117,72},{106,123,1}, +{0,120,74},{127,117,72},{0,120,74},{109,0,74},{109,0,74},{109,0,74},{109,0,74},{107,123,1},{107,123,1},{107,123,1},{107,115,1},{101,118,0},{101,118,0},{117,127,343},{115,127,179},{114,127,110},{113,126,78},{115,127,387},{111,127,102},{111,127,2},{110,123,90},{105,127,263},{103,124,63},{120,127,134},{118,127,46},{117,127,5},{116,126,9},{127,110,221},{113,127,89},{111,127,1},{101,124,61},{126,119,221}, +{101,124,61},{114,127,110},{114,127,110},{114,127,110},{114,125,74},{112,127,91},{111,127,2},{111,127,2},{110,121,6},{104,126,51},{105,122,1},{117,127,5},{117,127,5},{117,127,5},{116,124,1},{127,102,50},{112,126,0},{112,126,0},{107,121,1},{127,115,50},{107,121,1},{127,118,61},{119,127,25},{119,127,0},{110,127,0},{127,118,61},{126,123,61},{110,127,0},{0,124,61},{126,123,61},{0,124,61},{113,0,74}, +{113,0,74},{113,0,74},{113,0,74},{111,127,1},{111,127,1},{111,127,1},{111,119,1},{105,122,0},{105,122,0},{120,127,239},{119,127,179},{119,127,154},{118,127,83},{120,127,254},{116,127,78},{116,127,29},{114,126,15},{113,127,169},{109,126,5},{123,127,54},{122,127,34},{122,127,25},{121,127,2},{127,119,93},{119,127,33},{119,127,8},{109,126,5},{127,123,93},{109,126,5},{119,126,154},{119,126,154},{119,126,154}, +{118,127,83},{117,127,125},{116,127,29},{116,127,29},{114,125,6},{110,127,72},{109,126,1},{122,126,25},{122,126,25},{122,126,25},{121,127,2},{127,115,50},{119,127,8},{119,127,8},{111,125,1},{127,121,50},{111,125,1},{127,124,5},{125,127,1},{125,127,0},{122,127,0},{127,124,5},{126,126,5},{122,127,0},{0,126,5},{126,126,5},{0,126,5},{117,0,74},{117,0,74},{117,0,74},{117,0,74},{115,127,10}, +{115,127,10},{115,127,10},{115,123,1},{109,126,0},{109,126,0},{123,127,140},{123,127,124},{123,127,115},{122,127,83},{123,127,131},{121,127,66},{120,127,50},{119,127,1},{119,127,86},{116,127,8},{126,127,11},{125,127,11},{125,127,10},{125,127,2},{127,124,17},{125,127,6},{124,127,5},{119,127,0},{126,126,17},{119,127,0},{123,127,115},{123,127,115},{123,127,115},{122,127,83},{121,127,98},{120,127,50},{120,127,50}, +{119,127,1},{116,127,57},{116,127,8},{125,126,10},{125,126,10},{125,126,10},{125,127,2},{127,122,13},{124,127,5},{124,127,5},{119,127,0},{126,125,13},{119,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{121,0,74},{121,0,74},{121,0,74},{121,0,74},{120,127,25},{120,127,25},{120,127,25},{119,127,1},{116,127,8}, +{116,127,8},{0,29,200},{0,19,18},{0,14,1},{0,13,73},{0,20,441},{0,11,281},{0,11,134},{0,7,331},{0,8,474},{0,7,356},{0,29,200},{0,19,18},{0,14,1},{0,13,73},{10,0,441},{0,11,281},{0,11,134},{0,7,331},{20,0,441},{0,7,331},{0,13,0},{0,13,0},{0,13,0},{0,7,0},{0,6,41},{0,5,13},{0,5,13},{0,3,25},{0,3,45},{0,3,29},{0,13,0}, +{0,13,0},{0,13,0},{0,7,0},{3,0,41},{0,5,13},{0,5,13},{0,3,25},{6,0,41},{0,3,25},{14,0,200},{0,19,18},{0,14,1},{0,13,73},{14,0,200},{29,0,200},{0,13,73},{0,9,202},{29,0,200},{0,9,202},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,41,200},{0,27,2},{1,19,18}, +{0,17,45},{0,27,686},{0,19,346},{0,15,158},{0,10,467},{0,11,762},{0,10,516},{0,41,200},{0,27,2},{1,19,14},{0,17,45},{13,1,686},{0,19,346},{0,15,158},{0,10,467},{27,0,686},{0,10,467},{0,26,0},{0,26,0},{0,26,0},{0,13,0},{0,12,145},{0,11,53},{0,11,53},{0,6,89},{0,5,158},{0,6,105},{0,26,0},{0,26,0},{0,26,0},{0,13,0},{6,0,145}, +{0,11,53},{0,11,53},{0,6,89},{12,0,145},{0,6,89},{20,0,200},{1,26,2},{4,18,1},{0,17,45},{20,0,200},{41,0,200},{0,17,45},{0,13,202},{41,0,200},{0,13,202},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,49,225},{2,32,27},{3,24,71},{1,21,54},{0,39,723},{0,25,283},{0,20,65}, +{0,15,419},{0,17,865},{0,15,519},{4,45,201},{3,32,1},{5,23,19},{3,21,35},{19,0,723},{0,25,283},{0,20,65},{0,15,419},{39,0,723},{0,15,419},{2,34,25},{2,34,25},{2,34,25},{2,17,26},{0,24,162},{0,17,20},{0,17,20},{0,10,61},{0,11,213},{0,9,110},{4,30,1},{4,30,1},{4,30,1},{3,17,1},{12,0,162},{0,17,20},{0,17,20},{0,10,61},{24,0,162}, +{0,10,61},{26,0,200},{3,32,0},{8,22,1},{0,21,18},{26,0,200},{53,0,200},{0,21,18},{0,17,202},{53,0,200},{0,17,202},{2,0,25},{2,0,25},{2,0,25},{2,0,25},{0,10,0},{0,10,0},{0,10,0},{0,5,0},{0,5,9},{0,5,9},{4,57,313},{4,39,121},{5,28,198},{4,25,131},{0,52,723},{0,31,227},{0,26,9},{0,20,362},{0,22,959},{0,19,515},{8,49,201}, +{7,36,1},{9,27,19},{7,25,35},{25,0,723},{0,31,227},{0,26,9},{0,20,362},{52,0,723},{0,20,362},{4,42,113},{4,42,113},{4,42,113},{4,22,114},{0,36,162},{0,24,2},{0,24,2},{0,15,34},{0,17,285},{0,14,122},{8,34,1},{8,34,1},{8,34,1},{7,21,1},{18,0,162},{1,23,2},{1,23,2},{0,15,34},{36,0,162},{0,15,34},{32,0,200},{7,36,0},{12,26,1}, +{0,26,5},{32,0,200},{65,0,200},{0,26,5},{0,21,202},{65,0,200},{0,21,202},{4,0,113},{4,0,113},{4,0,113},{4,0,113},{0,23,0},{0,23,0},{0,23,0},{0,11,0},{0,8,41},{0,8,41},{7,64,400},{7,43,216},{8,32,312},{7,30,213},{2,61,723},{1,38,208},{2,31,2},{0,24,312},{0,31,980},{0,24,440},{12,54,200},{12,40,0},{13,31,20},{11,29,36},{32,0,723}, +{0,38,203},{2,31,2},{0,24,296},{65,0,723},{0,24,296},{7,49,200},{7,49,200},{7,49,200},{7,28,200},{2,46,162},{2,31,2},{2,31,2},{2,20,20},{0,22,280},{0,19,84},{12,39,0},{12,39,0},{12,39,0},{12,25,1},{24,1,162},{4,29,0},{4,29,0},{0,20,13},{50,0,162},{0,20,13},{39,0,200},{12,40,0},{16,31,0},{0,31,0},{39,0,200},{78,0,200},{0,31,0}, +{0,26,200},{78,0,200},{0,26,200},{7,0,200},{7,0,200},{7,0,200},{7,0,200},{2,32,0},{2,32,0},{2,32,0},{2,17,0},{0,14,50},{0,14,50},{11,68,400},{11,47,216},{12,36,312},{11,34,213},{6,65,723},{5,42,208},{6,35,2},{4,28,312},{0,37,868},{0,28,304},{16,58,200},{16,44,0},{17,35,20},{15,33,36},{38,0,723},{3,43,200},{6,35,2},{0,29,257},{77,0,723}, +{0,29,257},{11,53,200},{11,53,200},{11,53,200},{11,32,200},{6,50,162},{6,35,2},{6,35,2},{6,24,20},{0,28,216},{0,24,20},{16,43,0},{16,43,0},{16,43,0},{16,29,1},{30,1,162},{8,33,0},{8,33,0},{0,24,4},{62,0,162},{0,24,4},{45,0,200},{16,44,0},{20,35,0},{4,35,0},{45,0,200},{91,0,200},{4,35,0},{0,30,200},{91,0,200},{0,30,200},{11,0,200}, +{11,0,200},{11,0,200},{11,0,200},{6,36,0},{6,36,0},{6,36,0},{6,21,0},{0,22,8},{0,22,8},{15,72,400},{15,51,216},{16,40,312},{15,38,213},{10,69,723},{9,46,208},{10,39,2},{8,32,312},{0,43,788},{0,33,228},{20,62,200},{20,48,0},{21,39,20},{19,37,36},{44,0,723},{7,47,200},{10,39,2},{0,33,224},{89,0,723},{0,33,224},{15,57,200},{15,57,200},{15,57,200}, +{15,36,200},{10,54,162},{10,39,2},{10,39,2},{10,28,20},{0,35,179},{1,29,0},{20,47,0},{20,47,0},{20,47,0},{20,33,1},{36,1,162},{12,37,0},{12,37,0},{1,29,0},{74,0,162},{1,29,0},{50,1,200},{20,48,0},{24,39,0},{8,39,0},{50,1,200},{103,0,200},{8,39,0},{0,34,200},{103,0,200},{0,34,200},{15,0,200},{15,0,200},{15,0,200},{15,0,200},{10,40,0}, +{10,40,0},{10,40,0},{10,25,0},{1,29,0},{1,29,0},{19,76,400},{19,55,216},{20,44,312},{19,42,213},{14,73,723},{13,50,208},{14,43,2},{12,36,312},{0,49,740},{1,37,216},{24,66,200},{24,52,0},{25,43,20},{23,41,36},{50,0,723},{11,51,200},{14,43,2},{0,38,209},{101,0,723},{0,38,209},{19,61,200},{19,61,200},{19,61,200},{19,40,200},{14,58,162},{14,43,2},{14,43,2}, +{14,32,20},{1,42,163},{5,33,0},{24,51,0},{24,51,0},{24,51,0},{24,37,1},{42,1,162},{16,41,0},{16,41,0},{5,33,0},{86,0,162},{5,33,0},{56,1,200},{24,52,0},{28,43,0},{12,43,0},{56,1,200},{115,0,200},{12,43,0},{0,38,200},{115,0,200},{0,38,200},{19,0,200},{19,0,200},{19,0,200},{19,0,200},{14,44,0},{14,44,0},{14,44,0},{14,29,0},{5,33,0}, +{5,33,0},{24,80,402},{24,60,212},{25,49,308},{23,47,212},{19,76,724},{19,53,212},{19,47,4},{17,41,308},{1,55,724},{6,42,212},{29,69,201},{28,57,1},{30,48,19},{28,46,35},{56,1,723},{15,56,200},{19,47,3},{1,42,202},{115,0,723},{1,42,202},{24,64,202},{24,64,202},{24,64,202},{24,44,202},{19,61,163},{19,46,3},{19,46,3},{18,36,19},{6,46,163},{9,38,1},{29,55,1}, +{29,55,1},{29,55,1},{28,42,1},{49,0,162},{20,46,0},{20,46,0},{11,37,1},{100,0,162},{11,37,1},{63,0,200},{28,57,0},{33,47,1},{18,47,1},{63,0,200},{127,1,200},{18,47,1},{0,42,202},{127,1,200},{0,42,202},{23,0,202},{23,0,202},{23,0,202},{23,0,202},{19,48,1},{19,48,1},{19,48,1},{19,33,1},{9,38,0},{9,38,0},{28,84,402},{28,64,215},{29,53,308}, +{27,51,212},{23,80,724},{23,57,212},{23,51,4},{21,45,308},{5,59,724},{10,46,212},{33,73,201},{32,61,1},{34,52,19},{32,50,35},{62,1,723},{19,60,200},{23,51,3},{5,46,202},{127,0,723},{5,46,202},{28,68,202},{28,68,202},{28,68,202},{28,48,202},{23,65,163},{23,50,3},{23,50,3},{22,40,19},{10,50,163},{13,42,1},{33,59,1},{33,59,1},{33,59,1},{32,46,1},{55,0,162}, +{24,50,0},{24,50,0},{15,41,1},{112,0,162},{15,41,1},{69,0,200},{32,61,0},{37,51,1},{22,51,1},{69,0,200},{127,7,200},{22,51,1},{0,46,202},{127,7,200},{0,46,202},{27,0,202},{27,0,202},{27,0,202},{27,0,202},{23,52,1},{23,52,1},{23,52,1},{23,37,1},{13,42,0},{13,42,0},{32,88,402},{32,68,215},{33,57,308},{31,55,212},{27,84,724},{27,61,212},{27,55,4}, +{25,49,308},{8,64,723},{14,50,212},{37,77,201},{36,64,2},{38,56,19},{36,54,35},{68,0,723},{22,64,201},{27,55,3},{9,50,202},{127,6,723},{9,50,202},{32,72,202},{32,72,202},{32,72,202},{32,52,202},{27,69,163},{27,54,3},{27,54,3},{26,44,19},{14,54,163},{17,46,1},{37,63,1},{37,63,1},{37,63,1},{36,50,1},{61,0,162},{28,54,0},{28,54,0},{19,45,1},{124,0,162}, +{19,45,1},{75,0,200},{36,64,1},{41,55,1},{26,55,1},{75,0,200},{127,13,200},{26,55,1},{0,50,202},{127,13,200},{0,50,202},{31,0,202},{31,0,202},{31,0,202},{31,0,202},{27,56,1},{27,56,1},{27,56,1},{27,41,1},{17,46,0},{17,46,0},{36,92,402},{36,72,215},{37,61,308},{35,59,212},{31,88,724},{30,65,207},{31,59,4},{29,53,308},{12,68,723},{18,54,212},{41,81,201}, +{41,67,2},{42,60,19},{40,58,35},{74,0,723},{28,67,201},{31,59,3},{13,54,202},{127,12,723},{13,54,202},{36,76,202},{36,76,202},{36,76,202},{36,56,202},{31,73,163},{31,58,3},{31,58,3},{30,48,19},{18,58,163},{21,50,1},{41,66,1},{41,66,1},{41,66,1},{40,54,1},{66,1,162},{32,58,0},{32,58,0},{23,49,1},{126,5,162},{23,49,1},{80,1,200},{41,67,1},{45,59,1}, +{30,59,1},{80,1,200},{126,19,200},{30,59,1},{0,54,202},{126,19,200},{0,54,202},{35,0,202},{35,0,202},{35,0,202},{35,0,202},{31,60,1},{31,60,1},{31,60,1},{31,45,1},{21,50,0},{21,50,0},{40,97,400},{40,77,213},{42,64,314},{40,63,213},{35,94,723},{35,70,209},{35,64,6},{33,57,312},{17,72,723},{22,58,216},{45,87,200},{45,72,1},{46,64,21},{44,62,36},{80,1,723}, +{33,71,201},{36,63,4},{16,59,200},{126,19,723},{16,59,200},{40,82,200},{40,82,200},{40,82,200},{40,61,200},{35,78,162},{35,63,4},{35,63,4},{35,53,20},{22,63,163},{26,54,0},{45,72,0},{45,72,0},{45,72,0},{45,58,1},{73,0,162},{37,62,0},{37,62,0},{26,54,0},{126,12,162},{26,54,0},{87,0,200},{45,72,1},{49,64,1},{32,64,1},{87,0,200},{126,26,200},{32,64,1}, +{0,59,200},{126,26,200},{0,59,200},{40,0,200},{40,0,200},{40,0,200},{40,0,200},{35,65,0},{35,65,0},{35,65,0},{35,50,0},{26,54,0},{26,54,0},{44,101,400},{44,81,213},{46,68,314},{44,66,213},{39,98,723},{39,74,209},{39,67,2},{37,61,312},{21,76,723},{26,62,216},{49,91,200},{49,76,1},{50,68,21},{48,66,38},{86,1,723},{37,75,201},{39,67,2},{20,63,200},{126,25,723}, +{20,63,200},{44,86,200},{44,86,200},{44,86,200},{44,64,200},{39,82,162},{39,67,1},{39,67,1},{39,57,20},{25,67,162},{30,58,0},{49,76,0},{49,76,0},{49,76,0},{49,62,1},{79,0,162},{41,65,1},{41,65,1},{30,58,0},{127,17,162},{30,58,0},{93,0,200},{49,76,1},{53,67,1},{38,67,1},{93,0,200},{126,32,200},{38,67,1},{0,63,200},{126,32,200},{0,63,200},{44,0,200}, +{44,0,200},{44,0,200},{44,0,200},{39,69,0},{39,69,0},{39,69,0},{39,54,0},{30,58,0},{30,58,0},{48,105,400},{48,85,213},{50,72,314},{48,70,213},{43,102,723},{43,78,209},{43,71,2},{41,65,315},{25,80,723},{29,66,215},{53,95,200},{53,80,1},{54,72,21},{52,70,38},{92,1,723},{41,79,201},{43,71,2},{25,66,202},{126,31,723},{25,66,202},{48,90,200},{48,90,200},{48,90,200}, +{48,68,200},{43,86,162},{43,71,1},{43,71,1},{43,61,20},{29,71,162},{34,62,0},{53,80,0},{53,80,0},{53,80,0},{53,66,0},{85,0,162},{45,69,1},{45,69,1},{34,62,0},{127,23,162},{34,62,0},{99,0,200},{53,80,1},{57,71,1},{42,71,1},{99,0,200},{126,38,200},{42,71,1},{0,66,202},{126,38,200},{0,66,202},{48,0,200},{48,0,200},{48,0,200},{48,0,200},{43,73,0}, +{43,73,0},{43,73,0},{43,58,0},{34,62,0},{34,62,0},{52,109,400},{52,89,213},{54,76,314},{52,74,213},{47,106,723},{47,82,209},{47,75,2},{45,69,315},{29,84,723},{33,70,215},{57,99,200},{57,84,1},{58,76,21},{56,74,38},{98,1,723},{45,83,201},{47,75,2},{29,70,202},{126,37,723},{29,70,202},{52,94,200},{52,94,200},{52,94,200},{52,72,200},{47,90,162},{47,75,1},{47,75,1}, +{46,65,21},{33,75,162},{38,65,2},{57,84,0},{57,84,0},{57,84,0},{57,70,0},{91,0,162},{49,73,1},{49,73,1},{39,65,1},{127,29,162},{39,65,1},{105,0,200},{57,84,1},{61,75,1},{46,75,1},{105,0,200},{126,44,200},{46,75,1},{0,70,202},{126,44,200},{0,70,202},{52,0,200},{52,0,200},{52,0,200},{52,0,200},{47,77,0},{47,77,0},{47,77,0},{47,62,0},{38,65,1}, +{38,65,1},{57,113,402},{57,93,215},{58,82,315},{56,79,215},{52,109,724},{51,86,207},{52,80,2},{51,73,314},{33,89,723},{38,75,213},{62,102,201},{62,88,2},{62,81,21},{60,79,38},{105,0,723},{49,88,201},{52,80,1},{33,75,200},{126,44,723},{33,75,200},{57,97,202},{57,97,202},{57,97,202},{56,77,202},{52,94,163},{52,79,2},{52,79,2},{51,69,21},{38,79,162},{42,70,1},{62,87,1}, +{62,87,1},{62,87,1},{62,74,1},{98,0,162},{54,77,1},{54,77,1},{43,70,0},{127,36,162},{43,70,0},{112,0,200},{62,88,1},{65,80,0},{50,80,0},{112,0,200},{127,50,200},{50,80,0},{0,75,200},{127,50,200},{0,75,200},{56,0,202},{56,0,202},{56,0,202},{56,0,202},{52,80,1},{52,80,1},{52,80,1},{51,66,1},{43,69,1},{43,69,1},{61,117,402},{61,97,215},{62,86,315}, +{60,83,215},{56,113,724},{55,90,207},{56,84,2},{55,77,314},{37,93,723},{42,79,213},{65,107,200},{65,93,0},{66,84,20},{64,82,36},{111,0,723},{53,92,201},{56,84,1},{37,79,200},{127,49,723},{37,79,200},{61,101,202},{61,101,202},{61,101,202},{60,81,202},{56,98,163},{56,83,2},{56,83,2},{55,73,21},{42,83,162},{46,74,1},{65,92,0},{65,92,0},{65,92,0},{65,78,1},{104,0,162}, +{58,81,1},{58,81,1},{47,74,0},{127,42,162},{47,74,0},{118,0,200},{65,93,0},{69,84,0},{54,84,0},{118,0,200},{127,56,200},{54,84,0},{0,79,200},{127,56,200},{0,79,200},{60,0,202},{60,0,202},{60,0,202},{60,0,202},{56,84,1},{56,84,1},{56,84,1},{55,70,1},{47,73,1},{47,73,1},{64,122,400},{64,100,216},{65,89,312},{64,87,213},{60,117,724},{59,94,207},{60,88,2}, +{59,81,314},{41,97,723},{46,83,213},{69,111,200},{69,97,0},{70,88,20},{68,86,36},{117,0,723},{57,96,201},{60,88,1},{41,83,200},{127,55,723},{41,83,200},{64,106,200},{64,106,200},{64,106,200},{64,85,200},{60,102,163},{60,87,2},{60,87,2},{59,77,21},{46,87,162},{50,78,1},{69,96,0},{69,96,0},{69,96,0},{69,82,1},{110,0,162},{62,85,1},{62,85,1},{51,78,0},{126,48,162}, +{51,78,0},{124,0,200},{69,97,0},{73,88,0},{58,88,0},{124,0,200},{127,62,200},{58,88,0},{0,83,200},{127,62,200},{0,83,200},{64,0,200},{64,0,200},{64,0,200},{64,0,200},{60,88,1},{60,88,1},{60,88,1},{59,74,1},{51,77,1},{51,77,1},{68,126,400},{68,104,216},{69,93,312},{68,91,213},{63,123,724},{63,98,207},{63,92,6},{63,85,314},{45,101,723},{50,87,213},{73,115,200}, +{73,101,0},{74,92,20},{72,90,36},{123,0,723},{61,100,201},{64,91,4},{45,87,200},{127,61,723},{45,87,200},{68,110,200},{68,110,200},{68,110,200},{68,89,200},{63,108,163},{64,91,4},{64,91,4},{63,81,21},{50,91,162},{54,82,1},{73,100,0},{73,100,0},{73,100,0},{73,86,1},{115,1,162},{65,90,0},{65,90,0},{55,82,0},{126,54,162},{55,82,0},{127,5,200},{73,101,0},{77,92,0}, +{62,92,0},{127,5,200},{126,68,200},{62,92,0},{0,87,200},{126,68,200},{0,87,200},{68,0,200},{68,0,200},{68,0,200},{68,0,200},{63,94,1},{63,94,1},{63,94,1},{63,78,1},{55,81,1},{55,81,1},{73,126,410},{73,109,212},{74,98,308},{72,96,212},{68,126,724},{68,102,212},{68,96,4},{66,90,308},{50,105,723},{54,91,215},{78,119,201},{77,106,1},{79,97,19},{77,95,35},{127,5,723}, +{64,105,200},{68,96,3},{50,91,202},{126,68,723},{50,91,202},{73,114,202},{73,114,202},{73,114,202},{73,93,202},{68,110,163},{68,95,3},{68,95,3},{67,85,19},{54,96,162},{59,86,2},{78,104,1},{78,104,1},{78,104,1},{77,91,1},{122,0,162},{69,95,0},{69,95,0},{60,86,1},{126,61,162},{60,86,1},{127,19,200},{77,106,0},{82,96,1},{67,96,1},{127,19,200},{127,74,200},{67,96,1}, +{0,91,202},{127,74,200},{0,91,202},{72,0,202},{72,0,202},{72,0,202},{72,0,202},{68,97,1},{68,97,1},{68,97,1},{68,82,1},{59,86,1},{59,86,1},{77,127,434},{77,113,212},{78,102,308},{76,100,212},{72,127,732},{72,106,212},{72,100,4},{70,94,308},{54,109,723},{58,95,215},{82,123,201},{81,110,1},{83,101,19},{81,99,35},{127,18,723},{68,109,200},{72,100,3},{54,95,202},{126,74,723}, +{54,95,202},{77,118,202},{77,118,202},{77,118,202},{77,97,202},{72,114,163},{72,99,3},{72,99,3},{71,89,19},{58,100,162},{63,90,2},{82,108,1},{82,108,1},{82,108,1},{81,95,1},{127,2,162},{73,99,0},{73,99,0},{64,90,1},{127,66,162},{64,90,1},{127,31,200},{81,110,0},{86,100,1},{71,100,1},{127,31,200},{127,80,200},{71,100,1},{0,95,202},{127,80,200},{0,95,202},{76,0,202}, +{76,0,202},{76,0,202},{76,0,202},{72,101,1},{72,101,1},{72,101,1},{72,86,1},{63,90,1},{63,90,1},{82,127,468},{81,117,212},{82,106,308},{80,104,212},{77,127,753},{76,110,212},{76,104,4},{74,98,308},{58,113,723},{62,99,215},{86,127,201},{85,114,1},{87,105,19},{85,103,35},{127,30,723},{72,113,200},{76,104,3},{58,99,202},{127,79,723},{58,99,202},{81,122,202},{81,122,202},{81,122,202}, +{81,101,202},{76,118,163},{76,103,3},{76,103,3},{75,93,19},{62,104,162},{66,95,1},{86,112,1},{86,112,1},{86,112,1},{85,99,1},{127,14,162},{77,103,0},{77,103,0},{68,94,1},{127,72,162},{68,94,1},{127,43,200},{85,114,0},{90,104,1},{75,104,1},{127,43,200},{127,86,200},{75,104,1},{0,99,202},{127,86,200},{0,99,202},{80,0,202},{80,0,202},{80,0,202},{80,0,202},{76,105,1}, +{76,105,1},{76,105,1},{76,90,1},{66,95,0},{66,95,0},{86,127,546},{85,121,212},{86,110,308},{84,108,212},{82,127,788},{80,114,212},{80,108,4},{78,102,308},{62,117,723},{67,103,212},{91,127,211},{89,118,1},{91,109,19},{89,107,35},{127,42,723},{76,117,200},{80,108,3},{62,103,202},{127,85,723},{62,103,202},{85,126,202},{85,126,202},{85,126,202},{85,105,202},{80,122,163},{80,107,3},{80,107,3}, +{79,97,19},{67,107,163},{70,99,1},{90,116,1},{90,116,1},{90,116,1},{89,103,1},{127,27,162},{81,107,0},{81,107,0},{72,98,1},{126,78,162},{72,98,1},{127,56,200},{89,118,0},{94,108,1},{79,108,1},{127,56,200},{127,92,200},{79,108,1},{0,103,202},{127,92,200},{0,103,202},{84,0,202},{84,0,202},{84,0,202},{84,0,202},{80,109,1},{80,109,1},{80,109,1},{80,94,1},{70,99,0}, +{70,99,0},{91,127,632},{89,125,216},{90,114,312},{89,112,213},{88,127,852},{83,120,208},{84,113,2},{82,106,312},{66,121,724},{71,107,216},{97,127,244},{94,122,0},{95,113,20},{93,111,36},{127,56,723},{81,121,200},{84,113,2},{65,108,200},{127,92,723},{65,108,200},{89,127,209},{89,127,209},{89,127,209},{89,110,200},{84,126,164},{84,113,2},{84,113,2},{84,102,20},{71,112,163},{75,103,0},{94,121,0}, +{94,121,0},{94,121,0},{94,107,1},{127,40,162},{86,111,0},{86,111,0},{75,103,0},{126,85,162},{75,103,0},{127,69,200},{94,122,0},{98,113,0},{82,113,0},{127,69,200},{126,99,200},{82,113,0},{0,108,200},{126,99,200},{0,108,200},{89,0,200},{89,0,200},{89,0,200},{89,0,200},{84,114,0},{84,114,0},{84,114,0},{84,99,0},{75,103,0},{75,103,0},{97,127,728},{94,127,228},{94,118,312}, +{93,116,213},{94,127,932},{87,124,208},{88,117,2},{86,110,312},{70,125,724},{75,111,216},{101,127,286},{98,126,0},{99,117,20},{97,115,36},{127,67,723},{85,125,200},{88,117,2},{69,112,200},{127,98,723},{69,112,200},{94,127,224},{94,127,224},{94,127,224},{93,114,200},{89,127,174},{88,117,2},{88,117,2},{88,106,20},{75,116,163},{79,107,0},{98,125,0},{98,125,0},{98,125,0},{98,111,1},{127,53,162}, +{90,115,0},{90,115,0},{79,107,0},{126,91,162},{79,107,0},{127,81,200},{98,126,0},{102,117,0},{86,117,0},{127,81,200},{126,105,200},{86,117,0},{0,112,200},{126,105,200},{0,112,200},{93,0,200},{93,0,200},{93,0,200},{93,0,200},{88,118,0},{88,118,0},{88,118,0},{88,103,0},{79,107,0},{79,107,0},{100,127,864},{99,127,304},{98,122,312},{97,120,213},{98,127,1043},{92,127,211},{92,121,2}, +{90,114,312},{76,127,732},{79,115,216},{106,127,336},{102,127,20},{103,121,20},{101,119,36},{127,79,723},{90,127,208},{92,121,2},{73,116,200},{127,104,723},{73,116,200},{98,127,257},{98,127,257},{98,127,257},{97,118,200},{94,127,196},{92,121,2},{92,121,2},{92,110,20},{79,120,163},{83,111,0},{102,126,4},{102,126,4},{102,126,4},{102,115,1},{127,64,162},{94,119,0},{94,119,0},{83,111,0},{126,97,162}, +{83,111,0},{127,93,200},{105,127,8},{106,121,0},{90,121,0},{127,93,200},{126,111,200},{90,121,0},{0,116,200},{126,111,200},{0,116,200},{97,0,200},{97,0,200},{97,0,200},{97,0,200},{92,122,0},{92,122,0},{92,122,0},{92,107,0},{83,111,0},{83,111,0},{106,127,992},{103,127,440},{102,126,312},{101,124,213},{103,127,1144},{96,127,272},{96,125,2},{94,118,312},{84,127,804},{83,119,216},{111,127,398}, +{108,127,84},{107,125,20},{105,123,36},{127,92,723},{99,127,248},{96,125,2},{77,120,200},{126,110,723},{77,120,200},{103,127,296},{103,127,296},{103,127,296},{101,122,200},{100,127,244},{96,125,2},{96,125,2},{96,114,20},{83,124,163},{87,115,0},{107,127,13},{107,127,13},{107,127,13},{106,119,1},{127,76,162},{98,123,0},{98,123,0},{87,115,0},{126,103,162},{87,115,0},{127,105,200},{111,127,45},{110,125,0}, +{94,125,0},{127,105,200},{126,117,200},{94,125,0},{0,120,200},{126,117,200},{0,120,200},{101,0,200},{101,0,200},{101,0,200},{101,0,200},{96,126,0},{96,126,0},{96,126,0},{96,111,0},{87,115,0},{87,115,0},{111,127,919},{108,127,515},{107,127,362},{105,127,203},{109,127,1027},{102,127,267},{101,127,9},{99,122,198},{93,127,703},{88,123,121},{115,127,338},{113,127,122},{112,127,34},{110,126,14},{127,102,546}, +{108,127,202},{102,127,2},{85,123,113},{127,115,546},{85,123,113},{107,127,362},{107,127,362},{107,127,362},{106,126,202},{104,127,309},{101,127,9},{101,127,9},{100,118,19},{89,127,168},{91,120,1},{112,127,34},{112,127,34},{112,127,34},{110,124,1},{127,90,162},{104,126,2},{104,126,2},{93,119,1},{127,109,162},{93,119,1},{127,115,113},{119,127,41},{116,127,0},{104,127,0},{127,115,113},{127,121,113},{104,127,0}, +{0,123,113},{127,121,113},{0,123,113},{105,0,202},{105,0,202},{105,0,202},{105,0,202},{101,127,5},{101,127,5},{101,127,5},{101,115,1},{91,120,0},{91,120,0},{114,127,751},{111,127,514},{111,127,414},{110,127,218},{114,127,814},{108,127,219},{107,127,65},{103,124,71},{102,127,539},{94,125,27},{120,127,206},{117,127,110},{117,127,61},{115,127,2},{127,110,333},{113,127,121},{110,127,20},{93,125,25},{126,119,333}, +{93,125,25},{111,127,414},{111,127,414},{111,127,414},{110,127,218},{109,127,371},{107,127,65},{107,127,65},{104,122,19},{96,127,203},{95,124,1},{117,127,61},{117,127,61},{117,127,61},{115,127,2},{127,102,162},{110,127,20},{110,127,20},{97,123,1},{127,115,162},{97,123,1},{127,121,25},{122,127,9},{122,127,0},{116,127,0},{127,121,25},{127,124,25},{116,127,0},{0,125,25},{127,124,25},{0,125,25},{109,0,202}, +{109,0,202},{109,0,202},{109,0,202},{106,127,18},{106,127,18},{106,127,18},{105,119,1},{95,124,0},{95,124,0},{117,127,636},{117,127,516},{117,127,467},{115,127,282},{117,127,643},{111,127,241},{111,127,141},{108,126,18},{108,127,434},{99,127,2},{123,127,131},{121,127,105},{121,127,89},{119,127,26},{127,118,193},{119,127,86},{116,127,53},{101,127,0},{126,123,193},{101,127,0},{117,127,467},{117,127,467},{117,127,467}, +{115,127,282},{114,127,410},{111,127,141},{111,127,141},{108,126,14},{105,127,254},{99,127,2},{121,127,89},{121,127,89},{121,127,89},{119,127,26},{127,113,145},{116,127,53},{116,127,53},{101,127,0},{127,120,145},{101,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{113,0,202},{113,0,202},{113,0,202},{113,0,202},{111,127,41}, +{111,127,41},{111,127,41},{109,123,1},{101,126,2},{101,126,2},{120,127,412},{120,127,356},{120,127,331},{118,127,238},{120,127,387},{116,127,183},{116,127,134},{113,127,1},{113,127,262},{108,127,18},{124,127,41},{124,127,29},{124,127,25},{122,127,10},{127,122,54},{122,127,22},{122,127,13},{113,127,0},{126,125,54},{113,127,0},{120,127,331},{120,127,331},{120,127,331},{118,127,238},{117,127,266},{116,127,134},{116,127,134}, +{113,127,1},{110,127,161},{108,127,18},{124,127,25},{124,127,25},{124,127,25},{122,127,10},{127,119,41},{122,127,13},{122,127,13},{113,127,0},{127,123,41},{113,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{117,0,202},{117,0,202},{117,0,202},{117,0,202},{114,127,73},{114,127,73},{114,127,73},{113,127,1},{108,127,18}, +{108,127,18},{0,41,421},{0,28,41},{0,21,1},{0,18,157},{0,27,925},{0,19,569},{0,17,285},{0,12,701},{0,12,1005},{0,10,751},{0,41,421},{0,28,41},{0,21,1},{0,18,157},{13,1,925},{0,19,569},{0,17,285},{0,12,701},{27,0,925},{0,12,701},{0,20,0},{0,20,0},{0,20,0},{0,10,0},{0,9,85},{0,8,29},{0,8,29},{0,4,50},{0,5,94},{0,4,59},{0,20,0}, +{0,20,0},{0,20,0},{0,10,0},{5,0,85},{0,8,29},{0,8,29},{0,4,50},{9,0,85},{0,4,50},{20,0,421},{0,28,41},{0,21,1},{0,18,157},{20,0,421},{41,0,421},{0,18,157},{0,14,421},{41,0,421},{0,14,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,53,421},{0,37,9},{1,25,17}, +{0,21,113},{0,36,1261},{0,22,677},{0,20,305},{0,15,881},{0,17,1383},{0,13,971},{0,53,421},{0,37,9},{1,25,13},{0,21,113},{18,0,1261},{0,22,677},{0,20,305},{0,15,881},{36,0,1261},{0,15,881},{0,32,0},{0,32,0},{0,32,0},{0,15,1},{0,15,221},{0,11,85},{0,11,85},{0,7,130},{0,8,246},{0,7,155},{0,32,0},{0,32,0},{0,32,0},{0,15,1},{8,0,221}, +{0,11,85},{0,11,85},{0,7,130},{15,0,221},{0,7,130},{26,0,421},{0,37,9},{3,25,1},{0,21,113},{26,0,421},{53,0,421},{0,21,113},{0,18,421},{53,0,421},{0,18,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,63,426},{1,42,6},{2,29,66},{0,27,74},{0,45,1514},{0,28,706},{0,25,258}, +{0,18,974},{0,19,1706},{0,18,1118},{2,61,422},{1,42,2},{3,30,38},{0,27,74},{22,0,1514},{0,28,706},{0,25,258},{0,18,974},{45,0,1514},{0,18,974},{1,42,5},{1,42,5},{1,42,5},{1,21,5},{0,24,338},{0,19,90},{0,19,90},{0,10,181},{0,11,389},{0,10,230},{2,40,1},{2,40,1},{2,40,1},{1,21,1},{12,0,338},{0,19,90},{0,19,90},{0,10,181},{24,0,338}, +{0,10,181},{32,0,421},{1,42,1},{7,29,1},{0,27,65},{32,0,421},{65,0,421},{0,27,65},{0,22,421},{65,0,421},{0,22,421},{1,0,5},{1,0,5},{1,0,5},{1,0,5},{0,4,0},{0,4,0},{0,4,0},{0,2,0},{0,2,1},{0,2,1},{3,71,482},{3,48,62},{4,34,158},{2,31,117},{0,58,1514},{0,37,594},{0,31,122},{0,23,881},{0,25,1818},{0,21,1086},{6,65,422}, +{5,46,2},{7,34,38},{4,31,74},{28,0,1514},{0,37,594},{0,31,122},{0,23,881},{58,0,1514},{0,23,881},{3,50,61},{3,50,61},{3,50,61},{3,26,61},{0,36,338},{0,25,34},{0,25,34},{0,15,130},{0,17,461},{0,14,226},{6,44,1},{6,44,1},{6,44,1},{5,25,1},{18,0,338},{0,25,34},{0,25,34},{0,15,130},{36,0,338},{0,15,130},{38,0,421},{5,46,1},{11,33,1}, +{0,32,40},{38,0,421},{77,0,421},{0,32,40},{0,26,421},{77,0,421},{0,26,421},{3,0,61},{3,0,61},{3,0,61},{3,0,61},{0,16,0},{0,16,0},{0,16,0},{0,8,0},{0,5,25},{0,5,25},{5,80,621},{5,55,213},{7,40,357},{5,35,241},{0,71,1514},{0,43,497},{0,36,29},{0,27,761},{0,31,1989},{0,26,1079},{10,70,421},{10,50,1},{11,38,41},{8,35,77},{35,0,1514}, +{0,43,497},{0,36,29},{0,27,761},{71,0,1514},{0,27,761},{5,60,200},{5,60,200},{5,60,200},{5,32,200},{0,50,338},{0,34,4},{0,34,4},{0,21,80},{0,22,552},{0,19,244},{10,49,0},{10,49,0},{10,49,0},{10,29,0},{24,1,338},{0,34,4},{0,34,4},{0,21,80},{50,0,338},{0,21,80},{45,0,421},{10,50,1},{16,37,1},{0,36,13},{45,0,421},{91,0,421},{0,36,13}, +{0,30,421},{91,0,421},{0,30,421},{5,0,200},{5,0,200},{5,0,200},{5,0,200},{0,30,0},{0,30,0},{0,30,0},{0,15,0},{0,11,74},{0,11,74},{7,89,813},{7,60,421},{10,43,617},{7,40,417},{0,83,1514},{0,51,446},{0,41,3},{0,32,686},{0,37,2165},{0,31,1101},{14,74,421},{14,54,1},{15,42,41},{12,39,77},{41,0,1514},{0,51,446},{0,41,3},{0,32,686},{83,0,1514}, +{0,32,686},{7,67,392},{7,67,392},{7,67,392},{7,37,392},{0,62,338},{0,41,2},{0,41,2},{0,24,52},{0,28,680},{0,23,298},{14,53,0},{14,53,0},{14,53,0},{14,33,0},{30,1,338},{2,39,0},{2,39,0},{0,24,52},{62,0,338},{0,24,52},{51,0,421},{14,54,1},{20,41,1},{0,41,2},{51,0,421},{103,0,421},{0,41,2},{0,34,421},{103,0,421},{0,34,421},{7,0,392}, +{7,0,392},{7,0,392},{7,0,392},{0,42,0},{0,42,0},{0,42,0},{0,21,0},{0,17,146},{0,17,146},{11,93,842},{11,65,453},{12,48,654},{11,44,446},{4,87,1515},{3,54,435},{4,45,4},{0,36,654},{0,43,2030},{0,35,882},{18,78,421},{18,58,1},{19,46,41},{16,43,77},{47,0,1514},{0,57,422},{4,45,3},{0,36,605},{95,0,1514},{0,36,605},{11,71,421},{11,71,421},{11,71,421}, +{11,41,421},{4,66,339},{4,45,3},{4,45,3},{2,29,41},{0,34,581},{0,28,161},{18,57,0},{18,57,0},{18,57,0},{18,37,0},{36,1,338},{6,43,0},{6,43,0},{0,30,20},{74,0,338},{0,30,20},{57,0,421},{18,58,1},{24,45,1},{2,45,1},{57,0,421},{115,0,421},{2,45,1},{0,38,421},{115,0,421},{0,38,421},{11,0,421},{11,0,421},{11,0,421},{11,0,421},{4,46,1}, +{4,46,1},{4,46,1},{3,25,1},{0,22,85},{0,22,85},{15,97,842},{16,67,453},{16,52,654},{15,48,446},{8,91,1515},{7,58,435},{8,49,4},{4,40,654},{0,51,1850},{0,40,682},{22,82,421},{22,62,1},{23,50,41},{20,47,77},{53,0,1514},{3,61,421},{8,49,3},{0,41,554},{107,0,1514},{0,41,554},{15,75,421},{15,75,421},{15,75,421},{15,45,421},{8,70,339},{8,49,3},{8,49,3}, +{6,33,41},{0,40,477},{0,34,57},{22,61,0},{22,61,0},{22,61,0},{22,41,0},{42,1,338},{10,47,0},{10,47,0},{0,34,8},{86,0,338},{0,34,8},{63,0,421},{22,62,1},{28,49,1},{6,49,1},{63,0,421},{127,0,421},{6,49,1},{0,42,421},{127,0,421},{0,42,421},{15,0,421},{15,0,421},{15,0,421},{15,0,421},{8,50,1},{8,50,1},{8,50,1},{7,29,1},{0,31,29}, +{0,31,29},{19,102,842},{20,71,451},{21,57,650},{19,52,446},{12,97,1514},{12,63,437},{12,54,2},{9,45,650},{0,57,1710},{0,45,530},{27,86,422},{26,67,1},{28,55,38},{25,52,74},{59,1,1514},{7,66,421},{12,54,2},{0,45,494},{121,0,1514},{0,45,494},{19,81,421},{19,81,421},{19,81,421},{19,49,422},{12,75,338},{12,54,2},{12,54,2},{11,38,38},{0,49,402},{0,39,6},{27,64,1}, +{27,64,1},{27,64,1},{26,46,1},{49,0,338},{14,52,0},{14,52,0},{1,39,1},{100,0,338},{1,39,1},{69,0,421},{26,67,0},{32,54,1},{10,54,0},{69,0,421},{127,7,421},{10,54,0},{0,47,421},{127,7,421},{0,47,421},{19,0,421},{19,0,421},{19,0,421},{19,0,421},{12,56,0},{12,56,0},{12,56,0},{12,33,1},{0,38,5},{0,38,5},{23,106,842},{24,75,451},{25,61,650}, +{23,56,446},{16,101,1514},{15,67,434},{16,58,2},{13,49,650},{0,64,1617},{0,50,462},{31,90,422},{30,71,1},{32,59,38},{29,56,74},{65,0,1514},{11,70,421},{16,58,2},{0,50,461},{127,3,1514},{0,50,461},{23,85,421},{23,85,421},{23,85,421},{23,53,422},{16,79,338},{16,58,2},{16,58,2},{15,42,38},{0,54,349},{3,43,2},{31,68,1},{31,68,1},{31,68,1},{30,50,1},{55,0,338}, +{18,56,0},{18,56,0},{5,43,1},{112,0,338},{5,43,1},{75,0,421},{30,71,0},{36,58,1},{14,58,0},{75,0,421},{127,13,421},{14,58,0},{0,51,421},{127,13,421},{0,51,421},{23,0,421},{23,0,421},{23,0,421},{23,0,421},{16,60,0},{16,60,0},{16,60,0},{16,37,1},{3,43,1},{3,43,1},{27,110,842},{28,79,451},{30,64,650},{27,60,446},{20,105,1514},{19,71,434},{20,62,2}, +{17,53,650},{0,70,1553},{1,54,450},{35,94,422},{34,75,1},{36,63,38},{33,60,74},{71,0,1514},{15,74,421},{20,62,2},{0,54,441},{127,9,1514},{0,54,441},{27,89,421},{27,89,421},{27,89,421},{27,57,422},{20,83,338},{20,62,2},{20,62,2},{19,46,38},{0,61,338},{7,47,2},{35,72,1},{35,72,1},{35,72,1},{34,54,1},{61,0,338},{22,60,0},{22,60,0},{9,47,1},{124,0,338}, +{9,47,1},{81,0,421},{34,75,0},{40,62,1},{18,62,0},{81,0,421},{126,19,421},{18,62,0},{0,55,421},{126,19,421},{0,55,421},{27,0,421},{27,0,421},{27,0,421},{27,0,421},{20,64,0},{20,64,0},{20,64,0},{20,41,1},{7,47,1},{7,47,1},{31,114,842},{32,83,451},{33,67,650},{31,64,446},{24,109,1514},{23,75,434},{24,65,6},{21,57,650},{0,76,1521},{5,58,450},{39,98,422}, +{38,79,1},{41,66,42},{37,63,81},{77,0,1514},{19,78,421},{25,65,2},{0,59,425},{127,15,1514},{0,59,425},{31,93,421},{31,93,421},{31,93,421},{31,61,422},{24,87,338},{24,64,5},{24,64,5},{23,50,38},{5,64,339},{11,51,2},{39,76,1},{39,76,1},{39,76,1},{38,58,1},{66,1,338},{25,64,1},{25,64,1},{13,51,1},{126,5,338},{13,51,1},{87,0,421},{38,79,0},{45,65,1}, +{23,65,1},{87,0,421},{126,25,421},{23,65,1},{0,59,421},{126,25,421},{0,59,421},{31,0,421},{31,0,421},{31,0,421},{31,0,421},{24,67,0},{24,67,0},{24,67,0},{24,45,1},{11,51,1},{11,51,1},{36,118,842},{37,88,453},{38,72,646},{35,69,445},{29,112,1515},{27,79,438},{29,69,6},{25,61,654},{3,82,1515},{10,63,450},{43,103,421},{43,83,2},{45,70,41},{42,67,76},{83,1,1514}, +{24,82,421},{29,69,5},{2,63,421},{126,22,1514},{2,63,421},{36,96,421},{36,96,421},{36,96,421},{36,65,421},{29,91,339},{29,69,2},{29,69,2},{27,54,41},{10,68,339},{15,56,1},{43,82,0},{43,82,0},{43,82,0},{43,62,0},{73,0,338},{31,67,1},{31,67,1},{16,56,0},{126,12,338},{16,56,0},{93,0,421},{42,84,0},{49,70,0},{26,70,0},{93,0,421},{126,32,421},{26,70,0}, +{0,63,421},{126,32,421},{0,63,421},{36,0,421},{36,0,421},{36,0,421},{36,0,421},{29,71,1},{29,71,1},{29,71,1},{28,50,1},{15,56,1},{15,56,1},{40,122,842},{41,92,453},{42,76,646},{39,73,445},{33,116,1515},{31,83,438},{33,73,6},{30,64,650},{7,86,1515},{15,66,451},{47,107,421},{47,87,2},{49,74,41},{46,71,76},{89,1,1514},{28,86,421},{33,73,5},{5,67,421},{126,28,1514}, +{5,67,421},{40,100,421},{40,100,421},{40,100,421},{40,69,421},{33,95,339},{33,73,2},{33,73,2},{31,58,41},{14,72,339},{19,60,1},{47,86,0},{47,86,0},{47,86,0},{47,66,0},{79,0,338},{35,71,1},{35,71,1},{20,60,0},{127,17,338},{20,60,0},{99,0,421},{46,88,0},{53,74,0},{30,74,0},{99,0,421},{126,38,421},{30,74,0},{0,67,421},{126,38,421},{0,67,421},{40,0,421}, +{40,0,421},{40,0,421},{40,0,421},{33,75,1},{33,75,1},{33,75,1},{32,54,1},{19,60,1},{19,60,1},{44,126,842},{45,96,453},{46,80,646},{43,77,445},{37,120,1515},{35,87,438},{37,77,6},{34,68,650},{11,90,1515},{19,70,451},{51,111,421},{51,91,2},{53,78,41},{50,75,76},{95,1,1514},{32,90,421},{37,77,5},{9,71,421},{126,34,1514},{9,71,421},{44,104,421},{44,104,421},{44,104,421}, +{44,73,421},{37,99,339},{37,77,2},{37,77,2},{35,62,41},{18,76,339},{23,64,1},{51,90,0},{51,90,0},{51,90,0},{51,70,0},{85,0,338},{39,75,1},{39,75,1},{23,64,1},{127,23,338},{23,64,1},{105,0,421},{50,92,0},{57,78,0},{34,78,0},{105,0,421},{126,44,421},{34,78,0},{0,71,421},{126,44,421},{0,71,421},{44,0,421},{44,0,421},{44,0,421},{44,0,421},{37,79,1}, +{37,79,1},{37,79,1},{36,58,1},{23,64,0},{23,64,0},{48,126,854},{49,100,453},{50,84,646},{47,81,445},{41,124,1515},{39,91,438},{41,81,6},{38,72,650},{15,94,1515},{23,74,451},{55,115,421},{55,95,2},{57,82,41},{54,79,76},{101,1,1514},{36,94,421},{41,81,5},{13,75,421},{126,40,1514},{13,75,421},{48,108,421},{48,108,421},{48,108,421},{48,77,421},{41,103,339},{41,81,2},{41,81,2}, +{40,65,42},{22,80,339},{27,68,1},{55,94,0},{55,94,0},{55,94,0},{55,74,0},{91,0,338},{43,79,1},{43,79,1},{29,67,1},{127,29,338},{29,67,1},{111,0,421},{54,96,0},{61,82,0},{38,82,0},{111,0,421},{127,49,421},{38,82,0},{0,75,421},{127,49,421},{0,75,421},{48,0,421},{48,0,421},{48,0,421},{48,0,421},{41,83,1},{41,83,1},{41,83,1},{40,62,1},{27,68,0}, +{27,68,0},{53,127,886},{53,104,451},{54,88,650},{52,85,446},{46,126,1521},{44,96,434},{45,86,6},{43,77,646},{18,99,1515},{27,78,453},{60,119,422},{59,100,1},{62,87,42},{59,84,75},{108,0,1514},{40,99,421},{46,86,2},{18,79,421},{125,47,1514},{18,79,421},{52,114,421},{52,114,421},{52,114,421},{52,82,421},{45,108,338},{45,85,5},{45,85,5},{45,70,41},{26,85,339},{31,72,2},{60,97,1}, +{60,97,1},{60,97,1},{60,78,1},{98,0,338},{48,83,1},{48,83,1},{33,72,0},{127,36,338},{33,72,0},{118,0,421},{59,100,0},{65,86,1},{44,86,1},{118,0,421},{127,56,421},{44,86,1},{0,79,421},{127,56,421},{0,79,421},{52,0,421},{52,0,421},{52,0,421},{52,0,421},{45,88,0},{45,88,0},{45,88,0},{45,66,0},{31,73,0},{31,73,0},{58,127,926},{57,108,451},{58,92,650}, +{56,89,446},{51,126,1542},{48,100,434},{49,90,6},{47,81,646},{22,103,1515},{31,82,453},{63,125,422},{63,104,1},{64,91,41},{63,88,75},{114,0,1514},{44,103,421},{50,90,2},{22,83,421},{127,52,1514},{22,83,421},{56,118,421},{56,118,421},{56,118,421},{56,86,421},{49,112,338},{49,89,5},{49,89,5},{49,74,41},{30,89,339},{35,76,2},{63,103,1},{63,103,1},{63,103,1},{63,82,2},{104,0,338}, +{52,87,1},{52,87,1},{37,76,0},{127,42,338},{37,76,0},{124,0,421},{63,104,0},{69,90,1},{48,90,1},{124,0,421},{127,62,421},{48,90,1},{0,83,421},{127,62,421},{0,83,421},{56,0,421},{56,0,421},{56,0,421},{56,0,421},{49,92,0},{49,92,0},{49,92,0},{49,70,0},{35,77,0},{35,77,0},{62,127,1010},{61,112,451},{62,96,650},{60,93,446},{56,127,1577},{52,104,434},{53,94,6}, +{51,85,646},{26,107,1515},{35,86,453},{67,126,425},{67,107,1},{68,95,41},{65,92,77},{120,0,1514},{48,107,421},{54,94,2},{26,87,421},{127,58,1514},{26,87,421},{60,122,421},{60,122,421},{60,122,421},{60,90,421},{53,116,338},{53,93,5},{53,93,5},{53,78,41},{34,93,339},{39,80,2},{67,106,0},{67,106,0},{67,106,0},{67,86,0},{110,0,338},{56,91,1},{56,91,1},{41,80,0},{126,48,338}, +{41,80,0},{127,5,421},{67,107,1},{73,94,1},{52,94,1},{127,5,421},{126,68,421},{52,94,1},{0,87,421},{126,68,421},{0,87,421},{60,0,421},{60,0,421},{60,0,421},{60,0,421},{53,96,0},{53,96,0},{53,96,0},{53,74,0},{39,81,0},{39,81,0},{68,127,1098},{64,117,450},{65,101,654},{64,97,446},{61,127,1626},{56,108,434},{57,98,6},{55,89,646},{30,111,1515},{39,90,453},{72,127,437}, +{71,111,1},{72,99,41},{69,96,77},{126,0,1514},{52,111,421},{58,98,2},{30,91,421},{126,64,1514},{30,91,421},{64,125,421},{64,125,421},{64,125,421},{64,94,421},{57,120,338},{57,97,5},{57,97,5},{57,82,41},{38,97,339},{43,84,2},{71,110,0},{71,110,0},{71,110,0},{71,90,0},{115,1,338},{60,95,1},{60,95,1},{45,84,0},{126,54,338},{45,84,0},{127,18,421},{71,111,1},{77,98,1}, +{56,98,1},{127,18,421},{126,74,421},{56,98,1},{0,91,421},{126,74,421},{0,91,421},{64,0,421},{64,0,421},{64,0,421},{64,0,421},{57,100,0},{57,100,0},{57,100,0},{57,78,0},{43,85,0},{43,85,0},{71,127,1214},{69,122,450},{70,106,650},{68,101,446},{66,127,1722},{60,112,438},{62,102,6},{59,93,650},{36,115,1515},{44,95,451},{78,126,470},{75,116,2},{77,104,38},{74,101,74},{127,11,1514}, +{57,115,421},{62,102,5},{34,96,421},{126,71,1514},{34,96,421},{68,127,425},{68,127,425},{68,127,425},{68,98,422},{62,124,339},{62,102,2},{62,102,2},{61,86,42},{43,101,339},{48,89,1},{76,114,1},{76,114,1},{76,114,1},{75,95,1},{122,0,338},{63,101,1},{63,101,1},{50,88,1},{126,61,338},{50,88,1},{127,31,421},{75,116,1},{81,103,1},{59,103,0},{127,31,421},{127,80,421},{59,103,0}, +{0,96,421},{127,80,421},{0,96,421},{68,0,421},{68,0,421},{68,0,421},{68,0,421},{62,104,1},{62,104,1},{62,104,1},{62,82,1},{48,89,0},{48,89,0},{77,127,1334},{73,126,450},{74,110,650},{72,105,446},{71,127,1805},{65,116,437},{65,107,2},{63,97,650},{40,119,1515},{48,99,451},{82,127,506},{79,120,2},{81,108,38},{78,105,74},{127,24,1514},{61,119,421},{65,107,2},{38,100,421},{125,77,1514}, +{38,100,421},{73,126,441},{73,126,441},{73,126,441},{72,102,422},{65,127,340},{65,107,2},{65,107,2},{64,91,38},{47,105,339},{52,93,1},{80,118,1},{80,118,1},{80,118,1},{79,99,1},{127,2,338},{67,105,0},{67,105,0},{54,92,1},{127,66,338},{54,92,1},{127,43,421},{79,120,1},{85,107,1},{63,107,0},{127,43,421},{127,86,421},{63,107,0},{0,100,421},{127,86,421},{0,100,421},{72,0,421}, +{72,0,421},{72,0,421},{72,0,421},{65,109,0},{65,109,0},{65,109,0},{65,86,1},{52,93,0},{52,93,0},{82,127,1470},{77,127,462},{78,114,650},{76,109,446},{77,127,1917},{69,120,437},{69,111,2},{66,102,650},{44,123,1515},{52,103,451},{88,127,562},{83,124,2},{85,112,38},{82,109,74},{127,36,1514},{65,122,421},{69,111,2},{42,104,421},{127,82,1514},{42,104,421},{77,127,461},{77,127,461},{77,127,461}, +{76,106,422},{71,127,356},{69,111,2},{69,111,2},{68,95,38},{51,109,339},{56,97,1},{84,122,1},{84,122,1},{84,122,1},{83,103,1},{127,14,338},{71,109,0},{71,109,0},{58,96,1},{127,72,338},{58,96,1},{127,56,421},{83,124,1},{89,111,1},{67,111,0},{127,56,421},{127,92,421},{67,111,0},{0,104,421},{127,92,421},{0,104,421},{76,0,421},{76,0,421},{76,0,421},{76,0,421},{69,113,0}, +{69,113,0},{69,113,0},{69,90,1},{56,97,0},{56,97,0},{85,127,1634},{82,127,530},{82,118,650},{80,113,446},{82,127,2030},{73,124,437},{73,115,2},{70,106,650},{48,127,1515},{56,107,451},{92,127,646},{87,127,6},{89,116,38},{86,113,74},{127,48,1514},{69,126,421},{73,115,2},{46,108,421},{127,88,1514},{46,108,421},{82,127,494},{82,127,494},{82,127,494},{80,110,422},{75,127,386},{73,115,2},{73,115,2}, +{72,99,38},{55,113,339},{60,101,1},{88,126,1},{88,126,1},{88,126,1},{87,107,1},{127,27,338},{75,113,0},{75,113,0},{62,100,1},{126,78,338},{62,100,1},{127,67,421},{89,126,5},{93,115,1},{71,115,0},{127,67,421},{127,98,421},{71,115,0},{0,108,421},{127,98,421},{0,108,421},{80,0,421},{80,0,421},{80,0,421},{80,0,421},{73,117,0},{73,117,0},{73,117,0},{73,94,1},{60,101,0}, +{60,101,0},{91,127,1838},{87,127,682},{86,122,654},{85,118,446},{88,127,2198},{78,127,450},{78,119,4},{74,110,654},{57,127,1557},{60,111,453},{97,127,741},{93,127,57},{93,120,41},{90,117,77},{127,62,1514},{76,127,446},{78,119,3},{51,112,421},{127,95,1514},{51,112,421},{86,127,554},{86,127,554},{86,127,554},{85,115,421},{80,127,435},{78,119,3},{78,119,3},{76,103,41},{59,118,339},{64,105,1},{93,126,8}, +{93,126,8},{93,126,8},{92,111,0},{127,40,338},{80,117,0},{80,117,0},{65,105,0},{126,85,338},{65,105,0},{127,81,421},{96,127,29},{98,119,1},{76,119,1},{127,81,421},{126,105,421},{76,119,1},{0,112,421},{126,105,421},{0,112,421},{85,0,421},{85,0,421},{85,0,421},{85,0,421},{78,120,1},{78,120,1},{78,120,1},{77,99,1},{64,105,1},{64,105,1},{97,127,2070},{92,127,882},{90,126,654}, +{89,122,446},{91,127,2382},{84,127,546},{82,123,4},{78,114,654},{64,127,1658},{62,116,453},{103,127,837},{99,127,161},{97,124,41},{94,121,77},{127,73,1514},{84,127,521},{82,123,3},{55,116,421},{127,101,1514},{55,116,421},{91,127,605},{91,127,605},{91,127,605},{89,119,421},{85,127,485},{82,123,3},{82,123,3},{80,107,41},{63,122,339},{68,109,1},{97,127,20},{97,127,20},{97,127,20},{96,115,0},{127,53,338}, +{84,121,0},{84,121,0},{69,109,0},{126,91,338},{69,109,0},{127,93,421},{102,127,85},{102,123,1},{80,123,1},{127,93,421},{126,111,421},{80,123,1},{0,116,421},{126,111,421},{0,116,421},{89,0,421},{89,0,421},{89,0,421},{89,0,421},{82,124,1},{82,124,1},{82,124,1},{81,103,1},{68,109,1},{68,109,1},{100,127,2201},{96,127,1101},{95,127,686},{93,126,441},{97,127,2469},{87,127,689},{86,127,3}, +{84,117,617},{73,127,1735},{67,120,421},{109,127,916},{104,127,298},{102,127,52},{98,125,68},{127,86,1459},{93,127,584},{86,127,2},{59,120,392},{127,107,1459},{59,120,392},{95,127,686},{95,127,686},{95,127,686},{93,123,421},{91,127,557},{86,127,3},{86,127,3},{84,111,41},{66,126,338},{72,113,1},{102,126,52},{102,126,52},{102,126,52},{100,119,0},{127,64,338},{88,125,0},{88,125,0},{73,113,0},{126,97,338}, +{73,113,0},{127,105,392},{110,127,146},{106,127,0},{84,127,0},{127,105,392},{126,117,392},{84,127,0},{0,120,392},{126,117,392},{0,120,392},{93,0,421},{93,0,421},{93,0,421},{93,0,421},{86,127,2},{86,127,2},{86,127,2},{85,107,1},{72,113,1},{72,113,1},{103,127,1901},{101,127,1079},{100,127,761},{97,127,421},{100,127,2093},{93,127,537},{91,127,29},{87,120,357},{81,127,1425},{72,122,213},{111,127,638}, +{108,127,244},{106,127,80},{103,126,17},{127,93,1064},{99,127,392},{93,127,4},{67,122,200},{126,111,1064},{67,122,200},{100,127,761},{100,127,761},{100,127,761},{97,127,421},{95,127,659},{91,127,29},{91,127,29},{88,115,41},{73,127,350},{76,117,1},{106,127,80},{106,127,80},{106,127,80},{104,123,0},{127,76,338},{93,127,4},{93,127,4},{77,117,0},{126,103,338},{77,117,0},{127,111,200},{116,127,74},{112,127,0}, +{96,127,0},{127,111,200},{126,120,200},{96,127,0},{0,122,200},{126,120,200},{0,122,200},{97,0,421},{97,0,421},{97,0,421},{97,0,421},{91,127,13},{91,127,13},{91,127,13},{89,111,1},{76,117,1},{76,117,1},{109,127,1646},{106,127,1086},{104,127,881},{102,127,450},{106,127,1730},{99,127,474},{96,127,122},{93,123,158},{87,127,1166},{79,124,62},{114,127,446},{111,127,225},{111,127,125},{108,127,2},{127,102,722}, +{105,127,254},{102,127,34},{76,124,61},{127,115,722},{76,124,61},{104,127,881},{104,127,881},{104,127,881},{102,127,450},{100,127,770},{96,127,122},{96,127,122},{93,120,38},{81,127,426},{81,121,2},{111,127,125},{111,127,125},{111,127,125},{108,127,2},{127,90,338},{102,127,34},{102,127,34},{83,121,1},{127,109,338},{83,121,1},{127,118,61},{119,127,25},{119,127,0},{110,127,0},{127,118,61},{126,123,61},{110,127,0}, +{0,124,61},{126,123,61},{0,124,61},{101,0,421},{101,0,421},{101,0,421},{101,0,421},{95,127,40},{95,127,40},{95,127,40},{94,115,1},{81,121,1},{81,121,1},{111,127,1450},{111,127,1109},{109,127,974},{105,127,542},{111,127,1505},{102,127,514},{102,127,258},{98,125,66},{96,127,1026},{84,126,6},{120,127,342},{117,127,230},{117,127,181},{113,127,37},{127,110,509},{111,127,213},{108,127,90},{85,126,5},{126,119,509}, +{85,126,5},{109,127,974},{109,127,974},{109,127,974},{105,127,542},{106,127,882},{102,127,258},{102,127,258},{97,124,38},{90,127,530},{85,125,2},{117,127,181},{117,127,181},{117,127,181},{113,127,37},{127,102,338},{108,127,90},{108,127,90},{87,125,1},{127,115,338},{87,125,1},{127,124,5},{125,127,1},{125,127,0},{122,127,0},{127,124,5},{126,126,5},{122,127,0},{0,126,5},{126,126,5},{0,126,5},{105,0,421}, +{105,0,421},{105,0,421},{105,0,421},{100,127,65},{100,127,65},{100,127,65},{98,119,1},{85,125,1},{85,125,1},{114,127,1179},{114,127,971},{112,127,881},{111,127,545},{114,127,1170},{108,127,457},{107,127,305},{102,126,17},{102,127,793},{90,127,9},{121,127,209},{120,127,155},{120,127,130},{118,127,45},{127,116,294},{116,127,134},{113,127,85},{95,127,0},{126,122,294},{95,127,0},{112,127,881},{112,127,881},{112,127,881}, +{111,127,545},{111,127,765},{107,127,305},{107,127,305},{102,126,13},{96,127,465},{90,127,9},{120,127,130},{120,127,130},{120,127,130},{118,127,45},{127,110,221},{113,127,85},{113,127,85},{95,127,0},{126,119,221},{95,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{109,0,421},{109,0,421},{109,0,421},{109,0,421},{106,127,113}, +{106,127,113},{106,127,113},{102,123,1},{90,127,9},{90,127,9},{117,127,871},{117,127,751},{115,127,701},{113,127,502},{117,127,822},{111,127,364},{111,127,264},{106,127,1},{105,127,537},{99,127,41},{123,127,75},{123,127,59},{123,127,50},{121,127,17},{127,121,113},{119,127,54},{119,127,29},{107,127,0},{127,124,113},{107,127,0},{115,127,701},{115,127,701},{115,127,701},{113,127,502},{114,127,561},{111,127,264},{111,127,264}, +{106,127,1},{102,127,329},{99,127,41},{123,127,50},{123,127,50},{123,127,50},{121,127,17},{127,116,85},{119,127,29},{119,127,29},{107,127,0},{126,122,85},{107,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{113,0,421},{113,0,421},{113,0,421},{113,0,421},{109,127,157},{109,127,157},{109,127,157},{106,127,1},{99,127,41}, +{99,127,41},{0,59,882},{0,40,100},{0,30,4},{0,24,340},{0,39,1896},{0,25,1188},{0,23,590},{0,15,1444},{0,19,2040},{0,15,1544},{0,59,882},{0,40,100},{0,30,4},{0,24,340},{19,0,1896},{0,25,1188},{0,23,590},{0,15,1444},{39,0,1896},{0,15,1444},{0,27,0},{0,27,0},{0,27,0},{0,13,1},{0,13,162},{0,11,58},{0,11,58},{0,7,97},{0,5,179},{0,6,116},{0,27,0}, +{0,27,0},{0,27,0},{0,13,1},{7,0,162},{0,11,58},{0,11,58},{0,7,97},{13,0,162},{0,7,97},{29,0,882},{0,40,100},{0,30,4},{0,24,340},{29,0,882},{59,0,882},{0,24,340},{0,19,884},{59,0,882},{0,19,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,71,882},{0,49,40},{1,34,12}, +{0,30,260},{0,47,2355},{0,31,1332},{0,28,612},{0,18,1700},{0,22,2556},{0,18,1844},{0,71,882},{0,49,40},{1,34,8},{0,30,260},{23,0,2355},{0,31,1332},{0,28,612},{0,18,1700},{47,0,2355},{0,18,1700},{0,39,0},{0,39,0},{0,39,0},{0,19,0},{0,20,338},{0,14,130},{0,14,130},{0,10,205},{0,8,371},{0,9,244},{0,39,0},{0,39,0},{0,39,0},{0,19,0},{10,0,338}, +{0,14,130},{0,14,130},{0,10,205},{20,0,338},{0,10,205},{35,0,882},{0,49,40},{3,34,0},{0,30,260},{35,0,882},{71,0,882},{0,30,260},{0,23,884},{71,0,882},{0,23,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,83,882},{0,55,8},{1,40,60},{0,33,200},{0,56,2899},{0,37,1508},{0,31,660}, +{0,21,2004},{0,25,3176},{0,21,2200},{0,83,882},{0,55,8},{2,38,52},{0,33,200},{27,1,2899},{0,37,1508},{0,31,660},{0,21,2004},{56,0,2899},{0,21,2004},{0,52,0},{0,52,0},{0,52,0},{0,25,0},{0,26,578},{0,19,208},{0,19,208},{0,13,353},{0,11,635},{0,10,414},{0,52,0},{0,52,0},{0,52,0},{0,25,0},{13,0,578},{0,19,208},{0,19,208},{0,13,353},{26,0,578}, +{0,13,353},{41,0,882},{0,55,8},{7,38,0},{0,33,200},{41,0,882},{83,0,882},{0,33,200},{0,27,884},{83,0,882},{0,27,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,91,902},{1,62,20},{3,44,133},{0,39,172},{0,66,3048},{0,43,1416},{0,37,488},{0,27,1944},{0,31,3460},{0,26,2254},{3,89,882}, +{3,60,2},{5,44,68},{2,38,168},{33,0,3048},{0,43,1416},{0,37,488},{0,27,1944},{66,0,3048},{0,27,1944},{2,60,20},{2,60,20},{2,60,20},{2,30,20},{0,36,648},{0,28,160},{0,28,160},{0,15,340},{0,17,771},{0,15,440},{3,58,0},{3,58,0},{3,58,0},{3,30,0},{18,0,648},{0,28,160},{0,28,160},{0,15,340},{36,0,648},{0,15,340},{47,0,882},{1,62,0},{11,42,0}, +{0,39,136},{47,0,882},{95,0,882},{0,39,136},{0,31,884},{95,0,882},{0,31,884},{1,0,20},{1,0,20},{1,0,20},{1,0,20},{0,9,0},{0,9,0},{0,9,0},{0,4,1},{0,3,8},{0,3,8},{4,101,995},{4,67,114},{6,48,283},{3,44,242},{0,80,3048},{0,51,1224},{0,43,267},{0,32,1794},{0,37,3651},{0,30,2195},{8,93,883},{7,65,2},{9,48,67},{6,42,171},{39,1,3048}, +{0,51,1224},{0,43,267},{0,32,1794},{80,0,3048},{0,32,1794},{4,69,113},{4,69,113},{4,69,113},{4,36,113},{0,50,648},{0,34,74},{0,34,74},{0,21,250},{0,22,862},{0,19,434},{8,61,1},{8,61,1},{8,61,1},{8,34,1},{24,1,648},{0,34,74},{0,34,74},{0,21,250},{50,0,648},{0,21,250},{53,1,882},{6,65,1},{15,47,1},{0,44,89},{53,1,882},{109,0,882},{0,44,89}, +{0,36,882},{109,0,882},{0,36,882},{4,0,113},{4,0,113},{4,0,113},{4,0,113},{0,23,0},{0,23,0},{0,23,0},{0,11,0},{0,8,41},{0,8,41},{6,109,1147},{6,72,274},{8,53,499},{5,47,367},{0,92,3048},{0,57,1096},{0,47,129},{0,36,1635},{0,43,3859},{0,34,2183},{12,97,883},{11,69,2},{13,52,67},{10,46,171},{45,1,3048},{0,57,1096},{0,47,129},{0,36,1635},{92,0,3048}, +{0,36,1635},{6,77,265},{6,77,265},{6,77,265},{6,41,265},{0,62,648},{0,43,26},{0,43,26},{0,26,193},{0,28,990},{0,23,458},{12,65,1},{12,65,1},{12,65,1},{12,38,1},{30,1,648},{0,43,26},{0,43,26},{0,26,193},{62,0,648},{0,26,193},{59,1,882},{10,69,1},{19,51,1},{0,49,58},{59,1,882},{121,0,882},{0,49,58},{0,40,882},{121,0,882},{0,40,882},{6,0,265}, +{6,0,265},{6,0,265},{6,0,265},{0,35,0},{0,35,0},{0,35,0},{0,17,0},{0,14,97},{0,14,97},{8,117,1363},{8,77,506},{10,58,795},{7,52,559},{0,104,3048},{0,63,1000},{0,53,41},{0,39,1523},{0,46,4095},{0,38,2195},{16,101,883},{15,73,2},{17,56,67},{14,50,171},{51,0,3048},{0,63,1000},{0,53,41},{0,39,1523},{104,0,3048},{0,39,1523},{8,85,481},{8,85,481},{8,85,481}, +{8,46,481},{0,74,648},{0,49,2},{0,49,2},{0,30,130},{0,31,1146},{0,28,494},{16,69,1},{16,69,1},{16,69,1},{16,42,1},{36,1,648},{0,49,2},{0,49,2},{0,30,130},{74,0,648},{0,30,130},{65,0,882},{14,73,1},{23,55,1},{0,53,25},{65,0,882},{127,3,882},{0,53,25},{0,44,882},{127,3,882},{0,44,882},{8,0,481},{8,0,481},{8,0,481},{8,0,481},{0,47,0}, +{0,47,0},{0,47,0},{0,23,0},{0,19,169},{0,19,169},{10,125,1643},{11,83,802},{13,61,1159},{9,56,826},{0,117,3048},{0,70,933},{0,58,11},{0,45,1395},{0,54,4321},{0,43,2227},{20,105,883},{19,77,2},{21,60,67},{18,54,171},{57,0,3048},{0,70,933},{0,58,11},{0,45,1395},{117,0,3048},{0,45,1395},{10,93,761},{10,93,761},{10,93,761},{10,51,761},{0,86,648},{0,56,4},{0,56,4}, +{0,35,89},{0,37,1322},{0,31,578},{20,73,1},{20,73,1},{20,73,1},{20,46,1},{42,1,648},{3,54,0},{3,54,0},{0,35,89},{86,0,648},{0,35,89},{71,0,882},{18,77,1},{27,59,1},{0,58,10},{71,0,882},{127,9,882},{0,58,10},{0,48,882},{127,9,882},{0,48,882},{10,0,761},{10,0,761},{10,0,761},{10,0,761},{0,59,0},{0,59,0},{0,59,0},{0,29,0},{0,22,277}, +{0,22,277},{14,126,1784},{14,89,929},{17,65,1329},{13,60,945},{3,124,3048},{2,75,910},{3,62,14},{0,50,1329},{0,60,4212},{0,47,1974},{24,110,882},{24,80,5},{27,64,70},{23,59,168},{63,2,3048},{0,77,893},{4,63,10},{0,50,1293},{126,2,3048},{0,50,1293},{14,99,884},{14,99,884},{14,99,884},{13,56,884},{3,94,648},{3,62,10},{3,62,10},{1,40,68},{0,46,1256},{0,37,428},{24,78,0}, +{24,78,0},{24,78,0},{24,51,0},{49,0,648},{7,59,0},{7,59,0},{0,39,52},{100,0,648},{0,39,52},{78,0,882},{23,81,1},{32,63,0},{0,63,1},{78,0,882},{126,16,882},{0,63,1},{0,52,884},{126,16,882},{0,52,884},{13,0,884},{13,0,884},{13,0,884},{13,0,884},{3,66,0},{3,66,0},{3,66,0},{3,34,0},{0,31,232},{0,31,232},{19,126,1814},{18,93,929},{21,69,1329}, +{17,65,942},{7,127,3051},{6,79,910},{7,66,14},{4,54,1329},{0,67,3975},{0,52,1640},{28,114,882},{28,84,5},{30,67,66},{27,63,168},{69,1,3048},{1,83,882},{9,66,10},{0,53,1205},{126,8,3048},{0,53,1205},{18,103,884},{18,103,884},{18,103,884},{17,60,884},{7,98,648},{8,65,9},{8,65,9},{5,44,68},{0,51,1059},{0,43,236},{28,82,0},{28,82,0},{28,82,0},{28,55,0},{55,0,648}, +{11,63,0},{11,63,0},{0,45,20},{112,0,648},{0,45,20},{83,1,882},{27,85,1},{36,66,1},{4,66,1},{83,1,882},{126,22,882},{4,66,1},{0,56,884},{126,22,882},{0,56,884},{17,0,884},{17,0,884},{17,0,884},{17,0,884},{7,70,0},{7,70,0},{7,70,0},{7,38,0},{0,37,136},{0,37,136},{23,127,1854},{22,97,929},{25,73,1329},{21,69,942},{12,127,3064},{10,83,910},{11,70,14}, +{8,58,1329},{0,73,3751},{0,57,1374},{32,118,882},{32,88,5},{34,71,66},{30,67,165},{75,1,3048},{5,87,882},{13,70,10},{0,59,1125},{126,14,3048},{0,59,1125},{22,107,884},{22,107,884},{22,107,884},{21,64,884},{11,102,648},{12,69,9},{12,69,9},{9,48,68},{0,57,923},{0,49,108},{32,86,0},{32,86,0},{32,86,0},{32,59,0},{61,0,648},{16,65,1},{16,65,1},{0,49,8},{124,0,648}, +{0,49,8},{89,1,882},{31,89,1},{40,70,1},{8,70,1},{89,1,882},{126,28,882},{8,70,1},{0,60,884},{126,28,882},{0,60,884},{21,0,884},{21,0,884},{21,0,884},{21,0,884},{11,74,0},{11,74,0},{11,74,0},{11,42,0},{0,46,68},{0,46,68},{29,127,1934},{26,101,929},{29,77,1329},{25,73,942},{17,127,3091},{14,87,910},{15,74,14},{12,62,1329},{0,79,3559},{0,62,1174},{36,122,882}, +{36,92,5},{38,75,66},{34,71,165},{81,0,3048},{9,91,882},{17,74,10},{0,62,1053},{126,20,3048},{0,62,1053},{26,111,884},{26,111,884},{26,111,884},{26,67,884},{15,106,648},{16,73,9},{16,73,9},{13,52,68},{0,64,810},{0,54,26},{36,90,0},{36,90,0},{36,90,0},{36,63,0},{66,1,648},{20,69,1},{20,69,1},{0,54,1},{126,5,648},{0,54,1},{95,1,882},{35,93,1},{44,74,1}, +{12,74,1},{95,1,882},{126,34,882},{12,74,1},{0,64,882},{126,34,882},{0,64,882},{25,0,884},{25,0,884},{25,0,884},{25,0,884},{15,78,0},{15,78,0},{15,78,0},{15,46,0},{0,51,18},{0,51,18},{33,127,2036},{31,106,931},{33,81,1331},{29,77,942},{23,127,3145},{19,92,910},{19,79,14},{17,65,1329},{0,87,3375},{0,66,1021},{41,126,883},{40,98,2},{43,80,65},{39,76,166},{88,0,3048}, +{14,95,882},{21,78,9},{0,66,996},{127,26,3048},{0,66,996},{30,116,882},{30,116,882},{30,116,882},{30,72,882},{20,109,649},{20,77,10},{20,77,10},{18,57,67},{0,70,729},{1,59,3},{41,94,1},{41,94,1},{41,94,1},{40,67,1},{73,0,648},{24,74,1},{24,74,1},{4,58,1},{126,12,648},{4,58,1},{102,0,882},{39,98,1},{48,79,0},{15,79,0},{102,0,882},{126,41,882},{15,79,0}, +{0,68,884},{126,41,882},{0,68,884},{30,0,882},{30,0,882},{30,0,882},{30,0,882},{20,82,1},{20,82,1},{20,82,1},{19,51,1},{0,60,0},{0,60,0},{38,127,2134},{35,110,931},{37,85,1331},{33,81,942},{29,127,3217},{23,96,910},{23,83,14},{21,69,1329},{0,93,3247},{0,71,949},{45,127,891},{44,102,2},{47,84,65},{43,80,166},{94,0,3048},{18,99,882},{25,82,9},{0,72,948},{127,32,3048}, +{0,72,948},{34,120,882},{34,120,882},{34,120,882},{34,76,882},{24,113,649},{24,81,10},{24,81,10},{22,61,67},{0,79,673},{5,63,3},{45,98,1},{45,98,1},{45,98,1},{44,71,1},{79,0,648},{28,78,1},{28,78,1},{8,62,1},{127,17,648},{8,62,1},{108,0,882},{43,102,1},{52,83,0},{19,83,0},{108,0,882},{125,47,882},{19,83,0},{0,72,884},{125,47,882},{0,72,884},{34,0,882}, +{34,0,882},{34,0,882},{34,0,882},{24,86,1},{24,86,1},{24,86,1},{23,55,1},{3,64,1},{3,64,1},{42,127,2284},{39,114,931},{41,89,1331},{37,85,942},{33,127,3316},{27,100,910},{27,87,14},{25,73,1329},{0,99,3151},{1,76,929},{50,127,909},{48,106,2},{51,88,65},{47,84,166},{100,0,3048},{22,103,882},{29,86,9},{0,75,916},{127,38,3048},{0,75,916},{38,124,882},{38,124,882},{38,124,882}, +{38,80,882},{28,117,649},{28,85,10},{28,85,10},{27,64,66},{0,85,649},{8,66,5},{49,102,1},{49,102,1},{49,102,1},{48,75,1},{85,0,648},{32,82,1},{32,82,1},{11,66,0},{127,23,648},{11,66,0},{114,0,882},{47,106,1},{56,87,0},{23,87,0},{114,0,882},{127,52,882},{23,87,0},{0,76,884},{127,52,882},{0,76,884},{38,0,882},{38,0,882},{38,0,882},{38,0,882},{28,90,1}, +{28,90,1},{28,90,1},{27,59,1},{8,67,1},{8,67,1},{47,127,2414},{43,118,931},{45,93,1331},{41,89,942},{38,127,3409},{31,104,910},{31,91,14},{29,77,1329},{0,105,3087},{5,80,929},{55,127,939},{52,110,2},{55,92,65},{51,88,166},{106,0,3048},{26,107,882},{33,90,9},{0,80,893},{127,44,3048},{0,80,893},{42,127,883},{42,127,883},{42,127,883},{42,84,882},{32,121,649},{32,89,10},{32,89,10}, +{31,68,66},{4,89,649},{12,70,5},{53,106,1},{53,106,1},{53,106,1},{52,79,1},{91,0,648},{36,86,1},{36,86,1},{15,70,0},{127,29,648},{15,70,0},{120,0,882},{51,110,1},{60,91,0},{27,91,0},{120,0,882},{127,58,882},{27,91,0},{0,80,884},{127,58,882},{0,80,884},{42,0,882},{42,0,882},{42,0,882},{42,0,882},{32,94,1},{32,94,1},{32,94,1},{31,63,1},{12,71,1}, +{12,71,1},{52,127,2584},{47,122,929},{50,98,1329},{46,94,942},{44,127,3547},{35,108,910},{36,95,14},{34,82,1331},{0,112,3055},{9,84,931},{61,127,996},{57,113,5},{59,96,66},{55,92,165},{112,1,3048},{30,112,882},{38,95,10},{0,85,883},{126,51,3048},{0,85,883},{47,127,893},{47,127,893},{47,127,893},{47,88,884},{36,127,648},{37,94,9},{37,94,9},{35,72,65},{9,93,649},{17,75,2},{57,111,0}, +{57,111,0},{57,111,0},{57,83,0},{98,0,648},{41,90,1},{41,90,1},{21,74,1},{127,36,648},{21,74,1},{127,0,882},{56,114,1},{64,96,1},{33,95,1},{127,0,882},{126,65,882},{33,95,1},{0,85,882},{126,65,882},{0,85,882},{46,0,884},{46,0,884},{46,0,884},{46,0,884},{36,99,0},{36,99,0},{36,99,0},{36,67,0},{17,75,1},{17,75,1},{58,127,2792},{51,126,929},{54,102,1329}, +{50,98,942},{49,127,3672},{39,112,910},{40,99,14},{38,86,1331},{3,117,3049},{13,88,931},{65,127,1061},{61,117,5},{63,100,66},{59,96,165},{118,1,3048},{34,116,882},{42,99,10},{2,89,882},{126,57,3048},{2,89,882},{52,127,916},{52,127,916},{52,127,916},{51,92,884},{41,127,654},{41,98,9},{41,98,9},{39,76,65},{13,97,649},{21,79,2},{61,115,0},{61,115,0},{61,115,0},{61,87,0},{104,0,648}, +{45,94,1},{45,94,1},{25,78,1},{127,42,648},{25,78,1},{127,11,882},{60,118,1},{68,100,1},{37,99,1},{127,11,882},{126,71,882},{37,99,1},{0,89,882},{126,71,882},{0,89,882},{50,0,884},{50,0,884},{50,0,884},{50,0,884},{40,103,0},{40,103,0},{40,103,0},{40,71,0},{21,79,1},{21,79,1},{61,127,2984},{55,127,949},{58,106,1329},{54,102,942},{55,127,3832},{43,116,910},{44,103,14}, +{42,90,1331},{7,121,3049},{17,92,931},{71,127,1149},{64,122,3},{66,105,67},{63,100,165},{124,1,3048},{38,120,882},{46,103,10},{6,93,882},{126,63,3048},{6,93,882},{55,127,948},{55,127,948},{55,127,948},{55,96,884},{46,126,682},{45,102,9},{45,102,9},{43,80,65},{17,101,649},{25,83,2},{65,118,1},{65,118,1},{65,118,1},{65,91,1},{110,0,648},{49,98,1},{49,98,1},{29,82,1},{126,48,648}, +{29,82,1},{127,24,882},{63,123,1},{72,104,1},{41,103,1},{127,24,882},{125,77,882},{41,103,1},{0,93,882},{125,77,882},{0,93,882},{54,0,884},{54,0,884},{54,0,884},{54,0,884},{44,107,0},{44,107,0},{44,107,0},{44,75,0},{25,83,1},{25,83,1},{65,127,3214},{61,127,1021},{62,110,1329},{58,106,942},{61,127,4024},{47,120,910},{48,107,14},{46,94,1331},{11,125,3049},{21,96,931},{74,127,1245}, +{68,126,3},{70,109,67},{67,103,171},{127,7,3048},{42,124,882},{50,107,10},{10,97,882},{127,68,3048},{10,97,882},{61,127,996},{61,127,996},{61,127,996},{59,100,884},{50,127,714},{49,106,9},{49,106,9},{47,84,65},{21,105,649},{29,87,2},{69,122,1},{69,122,1},{69,122,1},{69,95,1},{115,1,648},{53,102,1},{53,102,1},{33,86,1},{126,54,648},{33,86,1},{127,36,882},{67,127,0},{76,108,1}, +{45,107,1},{127,36,882},{127,82,882},{45,107,1},{0,97,882},{127,82,882},{0,97,882},{58,0,884},{58,0,884},{58,0,884},{58,0,884},{48,111,0},{48,111,0},{48,111,0},{48,79,0},{29,87,1},{29,87,1},{71,127,3494},{65,127,1174},{66,114,1320},{62,110,942},{65,127,4231},{52,125,910},{52,112,14},{50,98,1329},{19,127,3067},{26,101,929},{79,127,1364},{73,127,26},{75,114,68},{72,108,168},{127,21,3048}, +{48,127,885},{54,111,9},{16,101,884},{127,75,3048},{16,101,884},{65,127,1053},{65,127,1053},{65,127,1053},{63,105,882},{56,127,769},{53,110,10},{53,110,10},{52,89,66},{25,110,649},{33,91,5},{73,126,1},{73,126,1},{73,126,1},{73,100,0},{122,0,648},{57,107,1},{57,107,1},{36,91,0},{126,61,648},{36,91,0},{127,50,882},{76,127,18},{81,112,0},{48,112,0},{127,50,882},{127,89,882},{48,112,0}, +{0,101,884},{127,89,882},{0,101,884},{63,0,882},{63,0,882},{63,0,882},{63,0,882},{53,115,1},{53,115,1},{53,115,1},{53,83,1},{33,92,1},{33,92,1},{74,127,3782},{70,127,1374},{70,118,1320},{66,113,945},{71,127,4455},{57,127,926},{56,116,14},{54,102,1329},{25,127,3139},{30,105,929},{85,127,1476},{79,127,97},{79,118,68},{76,112,168},{127,33,3048},{57,127,925},{58,115,9},{20,105,884},{126,81,3048}, +{20,105,884},{68,127,1125},{68,127,1125},{68,127,1125},{66,109,884},{61,127,827},{57,114,10},{57,114,10},{56,93,66},{29,114,649},{37,95,5},{78,126,8},{78,126,8},{78,126,8},{77,104,0},{127,2,648},{61,111,1},{61,111,1},{40,95,0},{127,66,648},{40,95,0},{127,62,882},{81,127,68},{85,116,0},{52,116,0},{127,62,882},{127,95,882},{52,116,0},{0,105,884},{127,95,882},{0,105,884},{66,0,884}, +{66,0,884},{66,0,884},{66,0,884},{57,119,1},{57,119,1},{57,119,1},{57,87,1},{37,96,1},{37,96,1},{79,127,4024},{75,127,1640},{74,122,1320},{70,117,945},{74,127,4699},{63,127,1030},{60,120,14},{58,106,1329},{34,127,3259},{34,109,929},{91,127,1620},{84,127,236},{83,122,68},{80,116,168},{127,45,3048},{64,127,1003},{62,119,9},{24,109,884},{126,87,3048},{24,109,884},{74,127,1205},{74,127,1205},{74,127,1205}, +{70,113,884},{65,127,910},{61,118,10},{61,118,10},{60,97,66},{33,118,649},{41,99,5},{82,127,20},{82,127,20},{82,127,20},{81,108,0},{127,14,648},{64,116,0},{64,116,0},{44,99,0},{127,72,648},{44,99,0},{127,73,882},{90,127,136},{89,120,0},{56,120,0},{127,73,882},{127,101,882},{56,120,0},{0,109,884},{127,101,882},{0,109,884},{70,0,884},{70,0,884},{70,0,884},{70,0,884},{61,123,1}, +{61,123,1},{61,123,1},{61,91,1},{41,100,1},{41,100,1},{85,127,4328},{79,127,1925},{78,126,1320},{74,121,945},{79,127,4920},{67,127,1215},{64,123,14},{62,110,1329},{43,127,3435},{38,113,929},{94,127,1784},{90,127,428},{87,126,68},{84,120,168},{127,57,3048},{70,127,1131},{65,124,10},{28,113,884},{126,93,3048},{28,113,884},{77,127,1293},{77,127,1293},{77,127,1293},{74,117,884},{71,127,1006},{64,123,10},{64,123,10}, +{63,100,70},{37,122,649},{45,103,5},{87,126,52},{87,126,52},{87,126,52},{85,112,0},{127,27,648},{68,120,0},{68,120,0},{48,103,0},{126,78,648},{48,103,0},{127,86,882},{96,127,232},{93,124,0},{60,124,0},{127,86,882},{127,107,882},{60,124,0},{0,113,884},{127,107,882},{0,113,884},{74,0,884},{74,0,884},{74,0,884},{74,0,884},{64,126,1},{64,126,1},{64,126,1},{64,95,0},{45,104,1}, +{45,104,1},{88,127,4403},{84,127,2227},{82,127,1395},{78,125,922},{85,127,4875},{73,127,1326},{69,127,11},{65,115,1174},{54,127,3438},{44,116,802},{100,127,1746},{95,127,578},{92,127,89},{88,124,126},{127,69,2814},{79,127,1146},{71,127,4},{33,117,761},{126,99,2814},{33,117,761},{82,127,1395},{82,127,1395},{82,127,1395},{79,121,883},{77,127,1137},{69,127,11},{69,127,11},{67,106,67},{42,126,649},{50,108,2},{92,127,89}, +{92,127,89},{92,127,89},{90,116,1},{127,40,648},{73,124,0},{73,124,0},{54,107,1},{126,85,648},{54,107,1},{127,96,761},{105,127,277},{98,127,0},{67,127,0},{127,96,761},{127,112,761},{67,127,0},{0,117,761},{127,112,761},{0,117,761},{79,0,882},{79,0,882},{79,0,882},{79,0,882},{69,127,10},{69,127,10},{69,127,10},{68,100,1},{50,108,1},{50,108,1},{94,127,3955},{89,127,2195},{88,127,1523}, +{83,127,886},{91,127,4323},{79,127,1139},{74,127,41},{71,116,799},{60,127,2958},{49,118,506},{103,127,1386},{99,127,494},{97,127,130},{92,125,50},{127,76,2249},{87,127,870},{78,127,2},{42,119,481},{126,103,2249},{42,119,481},{88,127,1523},{88,127,1523},{88,127,1523},{83,125,883},{82,127,1251},{74,127,41},{74,127,41},{71,110,67},{48,127,670},{54,112,2},{97,127,130},{97,127,130},{97,127,130},{94,120,1},{127,53,648}, +{78,127,2},{78,127,2},{58,111,1},{126,91,648},{58,111,1},{127,102,481},{108,127,169},{104,127,0},{79,127,0},{127,102,481},{127,115,481},{79,127,0},{0,119,481},{127,115,481},{0,119,481},{83,0,882},{83,0,882},{83,0,882},{83,0,882},{74,127,25},{74,127,25},{74,127,25},{72,104,1},{54,112,1},{54,112,1},{97,127,3571},{93,127,2183},{91,127,1635},{87,127,891},{94,127,3827},{84,127,1035},{79,127,114}, +{74,119,499},{67,127,2577},{55,121,274},{106,127,1098},{102,127,458},{101,127,193},{97,126,9},{127,86,1769},{93,127,654},{84,127,26},{50,121,265},{127,107,1769},{50,121,265},{91,127,1635},{91,127,1635},{91,127,1635},{87,127,891},{85,127,1387},{79,127,114},{79,127,114},{75,114,67},{57,127,734},{58,116,2},{101,127,193},{101,127,193},{101,127,193},{98,124,1},{127,64,648},{84,127,26},{84,127,26},{62,115,1},{126,97,648}, +{62,115,1},{127,108,265},{113,127,97},{110,127,0},{92,127,0},{127,108,265},{127,118,265},{92,127,0},{0,121,265},{127,118,265},{0,121,265},{87,0,882},{87,0,882},{87,0,882},{87,0,882},{79,127,50},{79,127,50},{79,127,50},{76,108,1},{58,116,1},{58,116,1},{100,127,3267},{97,127,2195},{95,127,1794},{92,127,954},{97,127,3435},{87,127,975},{84,127,267},{79,121,283},{73,127,2281},{60,123,114},{111,127,838}, +{107,127,434},{106,127,250},{102,127,2},{127,93,1374},{99,127,502},{93,127,74},{58,123,113},{126,111,1374},{58,123,113},{95,127,1794},{95,127,1794},{95,127,1794},{92,127,954},{91,127,1539},{84,127,267},{84,127,267},{79,118,67},{64,127,840},{62,120,2},{106,127,250},{106,127,250},{106,127,250},{102,127,2},{127,76,648},{93,127,74},{93,127,74},{65,119,1},{126,103,648},{65,119,1},{127,115,113},{119,127,41},{116,127,0}, +{104,127,0},{127,115,113},{127,121,113},{104,127,0},{0,123,113},{127,121,113},{0,123,113},{91,0,882},{91,0,882},{91,0,882},{91,0,882},{83,127,89},{83,127,89},{83,127,89},{80,112,1},{62,120,1},{62,120,1},{103,127,3032},{101,127,2254},{100,127,1944},{96,127,1080},{103,127,3096},{93,127,1012},{90,127,488},{83,124,133},{81,127,2104},{65,126,20},{114,127,666},{111,127,425},{111,127,325},{108,127,52},{127,102,1032}, +{105,127,404},{99,127,160},{67,125,20},{127,115,1032},{67,125,20},{100,127,1944},{100,127,1944},{100,127,1944},{96,127,1080},{97,127,1736},{90,127,488},{90,127,488},{83,122,68},{73,127,1011},{67,124,2},{111,127,325},{111,127,325},{111,127,325},{108,127,52},{127,90,648},{99,127,160},{99,127,160},{69,124,0},{127,109,648},{69,124,0},{127,122,18},{124,127,8},{122,127,1},{118,127,0},{127,122,18},{126,125,18},{118,127,0}, +{0,125,20},{126,125,18},{0,125,20},{95,0,884},{95,0,884},{95,0,884},{95,0,884},{88,127,136},{88,127,136},{88,127,136},{85,116,0},{65,126,0},{65,126,0},{109,127,2756},{106,127,2200},{103,127,2004},{102,127,1188},{106,127,2760},{96,127,1060},{96,127,660},{87,126,60},{87,127,1900},{72,127,8},{117,127,534},{117,127,414},{114,127,353},{111,127,104},{127,110,771},{108,127,352},{108,127,208},{75,127,0},{126,119,771}, +{75,127,0},{103,127,2004},{103,127,2004},{103,127,2004},{102,127,1188},{100,127,1784},{96,127,660},{96,127,660},{89,125,52},{81,127,1112},{72,127,8},{114,127,353},{114,127,353},{114,127,353},{111,127,104},{127,101,578},{108,127,208},{108,127,208},{75,127,0},{127,114,578},{75,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{99,0,884}, +{99,0,884},{99,0,884},{99,0,884},{94,127,200},{94,127,200},{94,127,200},{89,120,0},{72,127,8},{72,127,8},{111,127,2214},{109,127,1844},{109,127,1700},{105,127,1096},{109,127,2180},{102,127,900},{99,127,612},{93,126,12},{93,127,1468},{78,127,40},{120,127,306},{118,127,244},{117,127,205},{116,127,65},{127,113,451},{113,127,211},{111,127,125},{87,127,0},{127,120,451},{87,127,0},{109,127,1700},{109,127,1700},{109,127,1700}, +{105,127,1096},{103,127,1460},{99,127,612},{99,127,612},{93,126,8},{87,127,872},{78,127,40},{117,127,205},{117,127,205},{117,127,205},{116,127,65},{127,107,338},{111,127,125},{111,127,125},{87,127,0},{127,117,338},{87,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{103,0,884},{103,0,884},{103,0,884},{103,0,884},{97,127,260}, +{97,127,260},{97,127,260},{93,124,0},{78,127,40},{78,127,40},{114,127,1798},{111,127,1521},{111,127,1421},{108,127,1028},{111,127,1675},{105,127,792},{104,127,590},{97,127,4},{96,127,1128},{87,127,100},{123,127,150},{121,127,116},{120,127,97},{119,127,29},{127,118,216},{119,127,99},{116,127,58},{99,127,0},{126,123,216},{99,127,0},{111,127,1421},{111,127,1421},{111,127,1421},{108,127,1028},{109,127,1188},{104,127,590},{104,127,590}, +{97,127,4},{93,127,696},{87,127,100},{120,127,97},{120,127,97},{120,127,97},{119,127,29},{127,113,162},{116,127,58},{116,127,58},{99,127,0},{127,120,162},{99,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{107,0,884},{107,0,884},{107,0,884},{107,0,884},{103,127,340},{103,127,340},{103,127,340},{97,127,4},{87,127,100}, +{87,127,100},{0,78,1568},{0,54,170},{0,40,4},{0,33,596},{0,53,3371},{0,34,2124},{0,31,1048},{0,21,2552},{0,25,3628},{0,21,2748},{0,78,1568},{0,54,170},{0,40,4},{0,33,596},{26,0,3371},{0,34,2124},{0,31,1048},{0,21,2552},{53,0,3371},{0,21,2552},{0,36,0},{0,36,0},{0,36,0},{0,18,0},{0,18,288},{0,14,106},{0,14,106},{0,9,180},{0,8,315},{0,7,206},{0,36,0}, +{0,36,0},{0,36,0},{0,18,0},{9,0,288},{0,14,106},{0,14,106},{0,9,180},{18,0,288},{0,9,180},{39,0,1568},{0,54,170},{0,40,4},{0,33,596},{39,0,1568},{78,0,1568},{0,33,596},{0,26,1568},{78,0,1568},{0,26,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,91,1568},{0,63,90},{0,45,8}, +{0,39,500},{0,61,3968},{0,40,2316},{0,35,1078},{0,24,2880},{0,28,4304},{0,24,3136},{0,91,1568},{0,63,90},{1,44,8},{0,39,500},{30,0,3968},{0,40,2316},{0,35,1078},{0,24,2880},{61,0,3968},{0,24,2880},{0,48,0},{0,48,0},{0,48,0},{0,24,0},{0,24,512},{0,19,180},{0,19,180},{0,10,313},{0,11,563},{0,10,362},{0,48,0},{0,48,0},{0,48,0},{0,24,0},{12,0,512}, +{0,19,180},{0,19,180},{0,10,313},{24,0,512},{0,10,313},{45,0,1568},{0,63,90},{2,44,0},{0,39,500},{45,0,1568},{91,0,1568},{0,39,500},{0,30,1568},{91,0,1568},{0,30,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,103,1568},{0,70,37},{1,49,48},{0,42,400},{0,68,4651},{0,46,2540},{0,40,1128}, +{0,27,3256},{0,31,5084},{0,27,3580},{0,103,1568},{0,70,37},{1,49,44},{0,42,400},{33,1,4651},{0,46,2540},{0,40,1128},{0,27,3256},{68,0,4651},{0,27,3256},{0,61,0},{0,61,0},{0,61,0},{0,30,0},{0,30,800},{0,25,292},{0,25,292},{0,13,485},{0,14,883},{0,13,566},{0,61,0},{0,61,0},{0,61,0},{0,30,0},{15,0,800},{0,25,292},{0,25,292},{0,13,485},{30,0,800}, +{0,13,485},{50,1,1568},{0,70,37},{6,48,0},{0,42,400},{50,1,1568},{103,0,1568},{0,42,400},{0,34,1568},{103,0,1568},{0,34,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,115,1568},{0,76,5},{1,54,145},{0,47,325},{0,77,5419},{0,51,2755},{0,43,1208},{0,30,3680},{0,34,5968},{0,30,4080},{0,115,1568}, +{0,76,5},{3,53,121},{0,47,325},{38,0,5419},{0,51,2755},{0,43,1208},{0,30,3680},{77,0,5419},{0,30,3680},{0,72,0},{0,72,0},{0,72,0},{0,36,0},{0,36,1152},{0,28,424},{0,28,424},{0,18,720},{0,17,1275},{0,15,824},{0,72,0},{0,72,0},{0,72,0},{0,36,0},{18,0,1152},{0,28,424},{0,28,424},{0,18,720},{36,0,1152},{0,18,720},{56,1,1568},{0,76,5},{10,52,0}, +{0,47,325},{56,1,1568},{115,0,1568},{0,47,325},{0,38,1568},{115,0,1568},{0,38,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,125,1609},{2,82,42},{5,58,254},{1,51,318},{0,91,5419},{0,57,2480},{0,49,835},{0,36,3427},{0,40,6191},{0,35,3991},{5,119,1569},{4,80,6},{8,58,122},{2,52,302},{45,0,5419}, +{0,57,2480},{0,49,835},{0,36,3427},{91,0,5419},{0,36,3427},{2,82,41},{2,82,41},{2,82,41},{2,41,42},{0,50,1152},{0,37,274},{0,37,274},{0,21,586},{0,22,1366},{0,20,782},{5,76,1},{5,76,1},{5,76,1},{5,40,1},{24,1,1152},{0,37,274},{0,37,274},{0,21,586},{50,0,1152},{0,21,586},{63,0,1568},{2,82,1},{15,56,1},{0,53,245},{63,0,1568},{127,1,1568},{0,53,245}, +{0,42,1570},{127,1,1568},{0,42,1570},{2,0,41},{2,0,41},{2,0,41},{2,0,41},{0,13,0},{0,13,0},{0,13,0},{0,7,0},{0,5,13},{0,5,13},{5,126,1735},{4,87,150},{7,63,426},{3,56,382},{0,103,5419},{0,64,2265},{0,54,557},{0,39,3243},{0,46,6415},{0,39,3919},{9,123,1569},{8,84,6},{12,62,122},{6,56,302},{50,1,5419},{0,64,2265},{0,54,557},{0,39,3243},{103,0,5419}, +{0,39,3243},{4,90,145},{4,90,145},{4,90,145},{4,46,146},{0,62,1152},{0,43,170},{0,43,170},{0,27,482},{0,28,1494},{0,24,770},{9,80,1},{9,80,1},{9,80,1},{9,44,1},{30,1,1152},{0,43,170},{0,43,170},{0,27,482},{62,0,1152},{0,27,482},{69,0,1568},{6,86,1},{19,60,1},{0,56,181},{69,0,1568},{127,7,1568},{0,56,181},{0,46,1570},{127,7,1568},{0,46,1570},{4,0,145}, +{4,0,145},{4,0,145},{4,0,145},{0,26,0},{0,26,0},{0,26,0},{0,13,0},{0,11,53},{0,11,53},{9,127,1991},{7,93,322},{9,66,678},{5,61,518},{0,115,5419},{0,70,2081},{0,60,341},{0,45,3035},{0,51,6641},{0,42,3891},{13,127,1569},{12,88,6},{15,66,122},{10,60,302},{56,1,5419},{0,70,2081},{0,60,341},{0,45,3035},{115,0,5419},{0,45,3035},{6,98,313},{6,98,313},{6,98,313}, +{6,51,314},{0,74,1152},{0,51,80},{0,51,80},{0,30,394},{0,31,1650},{0,28,782},{13,84,1},{13,84,1},{13,84,1},{13,48,1},{36,1,1152},{0,51,80},{0,51,80},{0,30,394},{74,0,1152},{0,30,394},{75,0,1568},{10,90,1},{23,64,0},{0,62,125},{75,0,1568},{127,13,1568},{0,62,125},{0,50,1570},{127,13,1568},{0,50,1570},{6,0,313},{6,0,313},{6,0,313},{6,0,313},{0,38,0}, +{0,38,0},{0,38,0},{0,18,1},{0,14,117},{0,14,117},{12,127,2387},{9,98,566},{11,71,1002},{7,64,721},{0,127,5419},{0,76,1929},{0,64,181},{0,50,2886},{0,57,6921},{0,47,3879},{17,127,1577},{16,92,6},{19,70,122},{13,64,309},{62,1,5419},{0,76,1929},{0,64,181},{0,50,2886},{127,0,5419},{0,50,2886},{8,106,545},{8,106,545},{8,106,545},{8,56,545},{0,86,1152},{0,57,32},{0,57,32}, +{0,36,306},{0,37,1826},{0,34,822},{17,88,1},{17,88,1},{17,88,1},{17,52,1},{42,1,1152},{0,57,32},{0,57,32},{0,36,306},{86,0,1152},{0,36,306},{80,1,1568},{14,94,1},{27,68,0},{0,66,80},{80,1,1568},{126,19,1568},{0,66,80},{0,54,1570},{126,19,1568},{0,54,1570},{8,0,545},{8,0,545},{8,0,545},{8,0,545},{0,50,0},{0,50,0},{0,50,0},{0,24,1},{0,19,193}, +{0,19,193},{15,127,3004},{11,106,925},{14,77,1461},{9,69,1030},{3,127,5520},{0,84,1769},{0,70,66},{0,53,2697},{0,63,7276},{0,51,3898},{23,127,1602},{21,97,5},{23,74,125},{19,67,306},{69,0,5419},{0,84,1769},{0,70,66},{0,53,2697},{127,7,5419},{0,53,2697},{11,114,884},{11,114,884},{11,114,884},{10,62,884},{0,100,1152},{0,65,5},{0,65,5},{0,42,232},{0,43,2064},{0,37,896},{21,93,0}, +{21,93,0},{21,93,0},{21,57,0},{49,0,1152},{0,65,5},{0,65,5},{0,42,232},{100,0,1152},{0,42,232},{87,0,1568},{19,98,1},{31,73,1},{0,71,45},{87,0,1568},{126,26,1568},{0,71,45},{0,59,1568},{126,26,1568},{0,59,1568},{10,0,884},{10,0,884},{10,0,884},{10,0,884},{0,64,0},{0,64,0},{0,64,0},{0,31,0},{0,25,320},{0,25,320},{17,127,3702},{13,111,1317},{17,80,1945}, +{11,74,1374},{6,127,5788},{0,90,1681},{0,75,18},{0,59,2537},{0,70,7631},{0,55,3952},{29,127,1650},{25,101,5},{27,78,125},{23,71,306},{75,0,5419},{0,90,1681},{0,75,18},{0,59,2537},{127,13,5419},{0,59,2537},{13,122,1252},{13,122,1252},{13,122,1252},{13,66,1252},{0,112,1152},{0,72,5},{0,72,5},{0,45,164},{0,51,2291},{0,43,992},{25,97,0},{25,97,0},{25,97,0},{25,61,0},{55,0,1152}, +{3,70,1},{3,70,1},{0,45,164},{112,0,1152},{0,45,164},{93,0,1568},{23,102,1},{35,77,1},{0,75,18},{93,0,1568},{126,32,1568},{0,75,18},{0,63,1568},{126,32,1568},{0,63,1568},{12,0,1252},{12,0,1252},{12,0,1252},{12,0,1252},{0,75,0},{0,75,0},{0,75,0},{0,37,0},{0,31,464},{0,31,464},{23,127,4370},{16,114,1661},{19,85,2353},{14,77,1674},{12,127,6128},{0,99,1621},{2,80,18}, +{0,62,2397},{0,73,7815},{0,60,3858},{32,127,1702},{29,105,5},{31,82,125},{27,75,306},{80,1,5419},{0,99,1617},{2,80,14},{0,62,2393},{126,19,5419},{0,62,2393},{15,127,1572},{15,127,1572},{15,127,1572},{15,71,1568},{1,122,1152},{1,79,17},{1,79,17},{0,50,121},{0,54,2403},{0,46,996},{29,101,0},{29,101,0},{29,101,0},{29,64,0},{61,0,1152},{7,74,1},{7,74,1},{0,50,117},{124,0,1152}, +{0,50,117},{99,0,1568},{27,106,1},{39,81,1},{0,80,5},{99,0,1568},{126,38,1568},{0,80,5},{0,66,1570},{126,38,1568},{0,66,1570},{15,0,1568},{15,0,1568},{15,0,1568},{15,0,1568},{1,86,0},{1,86,0},{1,86,0},{1,43,0},{0,34,544},{0,34,544},{26,127,4586},{20,118,1661},{23,89,2353},{18,81,1674},{17,127,6275},{3,102,1617},{6,84,18},{1,67,2355},{0,81,7401},{0,64,3371},{38,127,1766}, +{33,109,5},{35,86,125},{31,79,306},{86,1,5419},{0,105,1577},{6,84,14},{0,66,2259},{126,25,5419},{0,66,2259},{20,127,1585},{20,127,1585},{20,127,1585},{19,75,1568},{5,126,1152},{5,83,17},{5,83,17},{4,54,121},{0,60,2155},{0,51,682},{33,105,0},{33,105,0},{33,105,0},{33,68,0},{66,1,1152},{11,78,1},{11,78,1},{0,55,80},{126,5,1152},{0,55,80},{105,0,1568},{31,110,1},{43,85,1}, +{0,84,1},{105,0,1568},{126,44,1568},{0,84,1},{0,70,1570},{126,44,1568},{0,70,1570},{19,0,1568},{19,0,1568},{19,0,1568},{19,0,1568},{5,90,0},{5,90,0},{5,90,0},{5,47,0},{0,43,388},{0,43,388},{32,127,4866},{25,123,1659},{27,93,2355},{23,86,1670},{23,127,6489},{8,107,1615},{10,88,18},{5,71,2353},{0,87,7039},{0,70,2897},{44,127,1865},{37,113,6},{40,91,122},{36,84,305},{93,0,5419}, +{2,111,1569},{10,88,17},{0,72,2124},{126,32,5419},{0,72,2124},{24,127,1619},{24,127,1619},{24,127,1619},{24,79,1570},{10,127,1161},{10,88,14},{10,88,14},{8,58,122},{0,67,1905},{0,57,409},{38,109,1},{38,109,1},{38,109,1},{37,73,1},{73,0,1152},{15,83,1},{15,83,1},{0,59,41},{126,12,1152},{0,59,41},{112,0,1568},{35,115,1},{48,89,0},{4,89,0},{112,0,1568},{127,50,1568},{4,89,0}, +{0,75,1568},{127,50,1568},{0,75,1568},{23,0,1570},{23,0,1570},{23,0,1570},{23,0,1570},{10,93,1},{10,93,1},{10,93,1},{10,51,1},{0,51,232},{0,51,232},{35,127,5154},{29,127,1659},{31,97,2355},{27,90,1670},{26,127,6689},{12,111,1615},{14,92,18},{9,75,2353},{0,93,6751},{0,74,2541},{49,127,1955},{41,117,6},{44,95,122},{40,88,305},{99,0,5419},{6,115,1569},{14,92,17},{0,75,2020},{126,38,5419}, +{0,75,2020},{29,127,1650},{29,127,1650},{29,127,1650},{28,83,1570},{15,127,1179},{14,92,14},{14,92,14},{12,62,122},{0,76,1713},{0,63,225},{42,113,1},{42,113,1},{42,113,1},{41,77,1},{79,0,1152},{19,87,1},{19,87,1},{0,64,20},{127,17,1152},{0,64,20},{118,0,1568},{39,119,1},{52,93,0},{8,93,0},{118,0,1568},{127,56,1568},{8,93,0},{0,79,1568},{127,56,1568},{0,79,1568},{27,0,1570}, +{27,0,1570},{27,0,1570},{27,0,1570},{14,97,1},{14,97,1},{14,97,1},{14,55,1},{0,57,136},{0,57,136},{41,127,5426},{33,127,1711},{35,101,2355},{31,94,1670},{32,127,6905},{16,115,1615},{18,96,18},{13,79,2353},{0,102,6483},{0,79,2241},{52,127,2075},{45,121,6},{48,99,122},{44,92,305},{105,0,5419},{10,119,1569},{18,96,17},{0,80,1929},{126,44,5419},{0,80,1929},{33,127,1707},{33,127,1707},{33,127,1707}, +{32,87,1570},{20,127,1209},{18,96,14},{18,96,14},{15,66,125},{0,81,1526},{0,67,97},{46,117,1},{46,117,1},{46,117,1},{45,81,1},{85,0,1152},{23,91,1},{23,91,1},{0,69,4},{127,23,1152},{0,69,4},{124,0,1568},{43,123,1},{56,97,0},{12,97,0},{124,0,1568},{127,62,1568},{12,97,0},{0,83,1568},{127,62,1568},{0,83,1568},{31,0,1570},{31,0,1570},{31,0,1570},{31,0,1570},{18,101,1}, +{18,101,1},{18,101,1},{18,59,1},{0,64,65},{0,64,65},{44,127,5762},{38,127,1811},{39,105,2355},{35,98,1670},{38,127,7153},{20,119,1615},{22,100,18},{17,83,2353},{0,108,6243},{0,83,2009},{58,127,2195},{49,125,6},{52,103,122},{48,96,305},{111,0,5419},{14,123,1569},{22,100,17},{0,85,1856},{127,49,5419},{0,85,1856},{38,127,1762},{38,127,1762},{38,127,1762},{36,91,1570},{26,127,1265},{22,100,14},{22,100,14}, +{19,70,125},{0,87,1398},{0,73,25},{50,121,1},{50,121,1},{50,121,1},{49,85,1},{91,0,1152},{27,95,1},{27,95,1},{0,73,0},{127,29,1152},{0,73,0},{127,5,1568},{47,127,1},{60,101,0},{16,101,0},{127,5,1568},{126,68,1568},{16,101,0},{0,87,1568},{126,68,1568},{0,87,1568},{35,0,1570},{35,0,1570},{35,0,1570},{35,0,1570},{22,105,1},{22,105,1},{22,105,1},{22,63,1},{0,70,25}, +{0,70,25},{52,127,6088},{43,127,2009},{44,110,2353},{39,102,1674},{44,127,7451},{24,123,1617},{27,105,18},{22,88,2355},{0,113,5999},{0,89,1811},{65,127,2385},{54,127,25},{56,107,125},{52,100,306},{118,0,5419},{19,127,1569},{27,105,14},{0,89,1762},{127,56,5419},{0,89,1762},{42,127,1856},{42,127,1856},{42,127,1856},{40,96,1568},{30,127,1344},{26,104,17},{26,104,17},{24,75,122},{0,96,1281},{1,78,6},{54,126,0}, +{54,126,0},{54,126,0},{54,89,0},{98,0,1152},{32,99,1},{32,99,1},{6,77,1},{127,36,1152},{6,77,1},{127,19,1568},{54,127,25},{64,105,1},{21,105,1},{127,19,1568},{127,74,1568},{21,105,1},{0,91,1570},{127,74,1568},{0,91,1570},{40,0,1568},{40,0,1568},{40,0,1568},{40,0,1568},{26,111,0},{26,111,0},{26,111,0},{26,67,0},{0,79,1},{0,79,1},{55,127,6416},{48,127,2241},{48,114,2353}, +{43,106,1674},{49,127,7696},{28,127,1617},{31,109,18},{26,92,2355},{0,122,5827},{0,94,1711},{68,127,2521},{60,127,97},{60,111,125},{56,104,306},{124,0,5419},{25,127,1601},{31,109,14},{0,94,1707},{127,62,5419},{0,94,1707},{47,127,1929},{47,127,1929},{47,127,1929},{44,100,1568},{35,127,1414},{30,108,17},{30,108,17},{28,79,122},{0,102,1209},{5,82,6},{58,127,4},{58,127,4},{58,127,4},{58,93,0},{104,0,1152}, +{36,103,1},{36,103,1},{10,81,1},{127,42,1152},{10,81,1},{127,31,1568},{63,127,65},{68,109,1},{25,109,1},{127,31,1568},{127,80,1568},{25,109,1},{0,95,1570},{127,80,1568},{0,95,1570},{44,0,1568},{44,0,1568},{44,0,1568},{44,0,1568},{30,115,0},{30,115,0},{30,115,0},{30,71,0},{4,83,1},{4,83,1},{61,127,6800},{53,127,2541},{52,118,2353},{47,110,1674},{52,127,7996},{34,127,1665},{35,113,18}, +{30,96,2355},{0,126,5709},{0,98,1659},{74,127,2705},{64,127,225},{65,115,122},{60,108,306},{127,5,5419},{34,127,1665},{35,113,14},{0,98,1650},{126,68,5419},{0,98,1650},{52,127,2020},{52,127,2020},{52,127,2020},{48,104,1568},{41,127,1510},{34,112,17},{34,112,17},{32,83,122},{0,108,1169},{9,86,6},{63,126,20},{63,126,20},{63,126,20},{62,97,0},{110,0,1152},{40,107,1},{40,107,1},{14,85,1},{126,48,1152}, +{14,85,1},{127,43,1568},{70,127,136},{72,113,1},{29,113,1},{127,43,1568},{127,86,1568},{29,113,1},{0,99,1570},{127,86,1568},{0,99,1570},{48,0,1568},{48,0,1568},{48,0,1568},{48,0,1568},{34,119,0},{34,119,0},{34,119,0},{34,75,0},{8,87,1},{8,87,1},{65,127,7186},{57,127,2897},{56,122,2353},{51,114,1674},{58,127,8300},{40,127,1809},{39,117,18},{34,100,2355},{5,127,5791},{4,102,1659},{79,127,2875}, +{70,127,409},{69,119,122},{63,114,310},{127,18,5419},{43,127,1777},{39,117,14},{0,103,1619},{126,74,5419},{0,103,1619},{55,127,2124},{55,127,2124},{55,127,2124},{52,108,1568},{44,127,1634},{38,116,17},{38,116,17},{36,87,122},{1,115,1153},{13,90,6},{68,127,41},{68,127,41},{68,127,41},{66,101,1},{115,1,1152},{44,111,1},{44,111,1},{18,89,1},{126,54,1152},{18,89,1},{127,56,1568},{76,127,232},{76,117,1}, +{33,117,1},{127,56,1568},{127,92,1568},{33,117,1},{0,103,1570},{127,92,1568},{0,103,1570},{52,0,1568},{52,0,1568},{52,0,1568},{52,0,1568},{38,123,0},{38,123,0},{38,123,0},{38,79,0},{12,91,1},{12,91,1},{68,127,7650},{63,127,3371},{60,126,2355},{56,119,1670},{65,127,8695},{46,127,2083},{43,121,18},{38,104,2353},{14,127,6049},{6,107,1661},{82,127,3112},{76,127,682},{73,123,121},{67,117,305},{127,31,5419}, +{51,127,1977},{43,121,17},{0,107,1585},{127,80,5419},{0,107,1585},{61,127,2259},{61,127,2259},{61,127,2259},{57,112,1570},{52,127,1755},{43,121,14},{43,121,14},{40,91,125},{6,119,1153},{18,94,5},{72,127,80},{72,127,80},{72,127,80},{70,106,0},{122,0,1152},{48,116,1},{48,116,1},{21,94,0},{126,61,1152},{21,94,0},{127,69,1568},{84,127,388},{80,122,0},{37,122,0},{127,69,1568},{126,99,1568},{37,122,0}, +{0,108,1568},{126,99,1568},{0,108,1568},{56,0,1570},{56,0,1570},{56,0,1570},{56,0,1570},{43,126,1},{43,126,1},{43,126,1},{42,84,1},{16,96,1},{16,96,1},{74,127,8066},{67,127,3858},{65,127,2397},{60,123,1670},{68,127,9035},{51,127,2458},{47,125,18},{42,108,2353},{22,127,6379},{10,111,1661},{88,127,3320},{79,127,977},{77,127,121},{71,121,305},{127,43,5419},{60,127,2185},{47,125,17},{0,112,1572},{127,86,5419}, +{0,112,1572},{65,127,2393},{65,127,2393},{65,127,2393},{61,116,1570},{55,127,1891},{47,125,14},{47,125,14},{44,95,125},{10,123,1153},{22,98,5},{77,127,117},{77,127,117},{77,127,117},{74,110,0},{127,2,1152},{52,120,1},{52,120,1},{25,98,0},{127,66,1152},{25,98,0},{127,81,1568},{93,127,544},{84,126,0},{41,126,0},{127,81,1568},{126,105,1568},{41,126,0},{0,112,1568},{126,105,1568},{0,112,1568},{60,0,1570}, +{60,0,1570},{60,0,1570},{60,0,1570},{47,127,5},{47,127,5},{47,127,5},{46,88,1},{20,100,1},{20,100,1},{79,127,7660},{72,127,3952},{68,127,2537},{64,125,1620},{74,127,8515},{57,127,2310},{52,127,18},{47,110,1945},{28,127,5939},{16,114,1317},{91,127,2984},{84,127,992},{82,127,164},{76,123,201},{127,53,4803},{64,127,1931},{54,126,5},{5,114,1252},{126,91,4803},{5,114,1252},{68,127,2537},{68,127,2537},{68,127,2537}, +{64,120,1569},{61,127,2043},{52,127,18},{52,127,18},{48,99,125},{14,127,1153},{26,102,5},{82,127,164},{82,127,164},{82,127,164},{78,114,0},{127,14,1152},{56,124,1},{56,124,1},{29,102,0},{127,72,1152},{29,102,0},{127,89,1250},{96,127,464},{90,127,0},{51,127,0},{127,89,1250},{125,109,1250},{51,127,0},{0,114,1252},{125,109,1250},{0,114,1252},{64,0,1568},{64,0,1568},{64,0,1568},{64,0,1568},{52,127,18}, +{52,127,18},{52,127,18},{50,92,1},{24,104,1},{24,104,1},{82,127,7060},{76,127,3898},{74,127,2697},{68,126,1576},{79,127,7756},{60,127,2062},{57,127,66},{50,113,1461},{37,127,5307},{21,116,925},{97,127,2504},{90,127,896},{85,127,232},{80,125,96},{127,60,4056},{70,127,1563},{60,127,5},{13,116,884},{127,94,4056},{13,116,884},{74,127,2697},{74,127,2697},{74,127,2697},{68,124,1569},{65,127,2214},{57,127,66},{57,127,66}, +{52,103,125},{22,127,1186},{30,106,5},{85,127,232},{85,127,232},{85,127,232},{82,118,0},{127,27,1152},{62,126,5},{62,126,5},{33,106,0},{126,78,1152},{33,106,0},{127,95,882},{102,127,320},{96,127,0},{63,127,0},{127,95,882},{127,111,882},{63,127,0},{0,116,884},{127,111,882},{0,116,884},{68,0,1568},{68,0,1568},{68,0,1568},{68,0,1568},{56,127,45},{56,127,45},{56,127,45},{54,96,1},{28,108,1}, +{28,108,1},{85,127,6483},{79,127,3828},{79,127,2867},{73,127,1574},{82,127,6979},{67,127,1846},{63,127,181},{56,116,1002},{43,127,4714},{29,118,566},{100,127,2034},{93,127,822},{91,127,306},{86,125,26},{127,69,3318},{76,127,1233},{70,127,32},{20,119,545},{126,99,3318},{20,119,545},{79,127,2867},{79,127,2867},{79,127,2867},{73,127,1574},{71,127,2425},{63,127,181},{63,127,181},{57,108,122},{31,127,1273},{34,111,6},{91,127,306}, +{91,127,306},{91,127,306},{87,122,1},{127,40,1152},{70,127,32},{70,127,32},{39,110,1},{126,85,1152},{39,110,1},{127,101,545},{108,127,193},{102,127,1},{76,127,0},{127,101,545},{127,114,545},{76,127,0},{0,119,545},{127,114,545},{0,119,545},{72,0,1570},{72,0,1570},{72,0,1570},{72,0,1570},{61,127,80},{61,127,80},{61,127,80},{59,100,0},{33,112,1},{33,112,1},{88,127,6059},{84,127,3891},{82,127,3035}, +{76,127,1634},{85,127,6411},{70,127,1754},{67,127,341},{61,118,678},{51,127,4330},{34,120,322},{103,127,1698},{98,127,782},{97,127,394},{90,127,2},{127,76,2753},{84,127,1018},{76,127,80},{28,121,313},{126,103,2753},{28,121,313},{82,127,3035},{82,127,3035},{82,127,3035},{76,127,1634},{77,127,2641},{67,127,341},{67,127,341},{61,112,122},{37,127,1401},{38,115,6},{97,127,394},{97,127,394},{97,127,394},{91,126,1},{127,53,1152}, +{76,127,80},{76,127,80},{43,114,1},{126,91,1152},{43,114,1},{127,107,313},{111,127,116},{108,127,1},{89,127,0},{127,107,313},{127,117,313},{89,127,0},{0,121,313},{127,117,313},{0,121,313},{76,0,1570},{76,0,1570},{76,0,1570},{76,0,1570},{65,127,125},{65,127,125},{65,127,125},{63,104,0},{37,116,1},{37,116,1},{94,127,5691},{88,127,3919},{88,127,3243},{81,127,1739},{88,127,5947},{76,127,1722},{73,127,557}, +{64,120,426},{57,127,3994},{39,122,150},{106,127,1434},{102,127,770},{100,127,482},{95,127,17},{127,86,2273},{90,127,850},{84,127,170},{36,123,145},{127,107,2273},{36,123,145},{88,127,3243},{88,127,3243},{88,127,3243},{81,127,1739},{79,127,2835},{73,127,557},{73,127,557},{65,115,122},{46,127,1561},{42,119,6},{100,127,482},{100,127,482},{100,127,482},{95,127,17},{127,64,1152},{84,127,170},{84,127,170},{47,118,1},{126,97,1152}, +{47,118,1},{127,113,145},{116,127,53},{114,127,0},{101,127,0},{127,113,145},{127,120,145},{101,127,0},{0,123,145},{127,120,145},{0,123,145},{80,0,1570},{80,0,1570},{80,0,1570},{80,0,1570},{71,127,181},{71,127,181},{71,127,181},{67,108,1},{41,120,1},{41,120,1},{97,127,5379},{92,127,3991},{91,127,3427},{87,127,1907},{94,127,5539},{79,127,1783},{79,127,822},{69,122,254},{64,127,3745},{44,125,42},{111,127,1210}, +{106,127,782},{106,127,586},{99,127,82},{127,93,1878},{96,127,746},{90,127,274},{44,125,41},{126,111,1878},{44,125,41},{91,127,3427},{91,127,3427},{91,127,3427},{87,127,1907},{85,127,3051},{79,127,822},{79,127,822},{69,119,122},{54,127,1798},{46,123,6},{106,127,586},{106,127,586},{106,127,586},{99,127,82},{127,76,1152},{90,127,274},{90,127,274},{51,122,1},{126,103,1152},{51,122,1},{127,119,41},{122,127,13},{120,127,0}, +{113,127,0},{127,119,41},{127,123,41},{113,127,0},{0,125,41},{127,123,41},{0,125,41},{84,0,1570},{84,0,1570},{84,0,1570},{84,0,1570},{74,127,245},{74,127,245},{74,127,245},{71,112,1},{45,124,1},{45,124,1},{100,127,5128},{97,127,4080},{97,127,3680},{90,127,2152},{97,127,5200},{87,127,1964},{84,127,1208},{73,126,145},{73,127,3580},{51,127,5},{114,127,1062},{111,127,797},{111,127,697},{105,127,212},{127,102,1536}, +{102,127,708},{99,127,424},{54,127,0},{127,115,1536},{54,127,0},{97,127,3680},{97,127,3680},{97,127,3680},{90,127,2152},{91,127,3328},{84,127,1208},{84,127,1208},{74,124,121},{63,127,2089},{51,127,5},{111,127,697},{111,127,697},{111,127,697},{105,127,212},{127,90,1152},{99,127,424},{99,127,424},{54,127,0},{127,109,1152},{54,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0}, +{0,127,0},{127,127,0},{0,127,0},{89,0,1568},{89,0,1568},{89,0,1568},{89,0,1568},{79,127,320},{79,127,320},{79,127,320},{75,117,0},{51,127,5},{51,127,5},{103,127,4416},{100,127,3580},{100,127,3256},{96,127,2040},{100,127,4372},{90,127,1736},{87,127,1128},{79,126,57},{76,127,2956},{57,127,37},{117,127,738},{114,127,566},{114,127,485},{108,127,148},{127,107,1067},{108,127,484},{102,127,292},{66,127,0},{127,117,1067}, +{66,127,0},{100,127,3256},{100,127,3256},{100,127,3256},{96,127,2040},{94,127,2852},{87,127,1128},{87,127,1128},{78,125,45},{70,127,1739},{57,127,37},{114,127,485},{114,127,485},{114,127,485},{108,127,148},{127,96,800},{102,127,292},{102,127,292},{66,127,0},{127,112,800},{66,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{93,0,1568}, +{93,0,1568},{93,0,1568},{93,0,1568},{85,127,400},{85,127,400},{85,127,400},{79,121,0},{57,127,37},{57,127,37},{106,127,3784},{103,127,3136},{103,127,2880},{99,127,1924},{103,127,3648},{93,127,1564},{92,127,1078},{82,127,8},{81,127,2480},{64,127,90},{117,127,482},{117,127,362},{117,127,313},{113,127,97},{127,110,683},{111,127,321},{108,127,180},{78,127,0},{126,119,683},{78,127,0},{103,127,2880},{103,127,2880},{103,127,2880}, +{99,127,1924},{97,127,2448},{92,127,1078},{92,127,1078},{83,126,8},{76,127,1451},{64,127,90},{117,127,313},{117,127,313},{117,127,313},{113,127,97},{127,102,512},{108,127,180},{108,127,180},{78,127,0},{127,115,512},{78,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{97,0,1568},{97,0,1568},{97,0,1568},{97,0,1568},{88,127,500}, +{88,127,500},{88,127,500},{83,125,0},{64,127,90},{64,127,90},{109,127,3232},{106,127,2748},{106,127,2552},{102,127,1832},{106,127,3028},{99,127,1420},{96,127,1048},{87,127,4},{87,127,2032},{73,127,170},{120,127,262},{120,127,206},{118,127,180},{116,127,53},{127,115,384},{116,127,179},{113,127,106},{90,127,0},{127,121,384},{90,127,0},{106,127,2552},{106,127,2552},{106,127,2552},{102,127,1832},{103,127,2112},{96,127,1048},{96,127,1048}, +{87,127,4},{81,127,1260},{73,127,170},{118,127,180},{118,127,180},{118,127,180},{116,127,53},{127,108,288},{113,127,106},{113,127,106},{90,127,0},{127,118,288},{90,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{101,0,1568},{101,0,1568},{101,0,1568},{101,0,1568},{94,127,596},{94,127,596},{94,127,596},{87,127,4},{73,127,170}, +{73,127,170},{0,104,2665},{0,73,274},{0,53,4},{0,45,985},{0,69,5885},{0,46,3677},{0,41,1789},{0,27,4441},{0,31,6341},{0,27,4765},{0,104,2665},{0,73,274},{0,53,4},{0,45,985},{34,0,5885},{0,46,3677},{0,41,1789},{0,27,4441},{69,0,5885},{0,27,4441},{0,50,0},{0,50,0},{0,50,0},{0,24,1},{0,24,545},{0,19,193},{0,19,193},{0,12,337},{0,11,598},{0,10,387},{0,50,0}, +{0,50,0},{0,50,0},{0,24,1},{12,0,545},{0,19,193},{0,19,193},{0,12,337},{24,0,545},{0,12,337},{51,0,2665},{0,73,274},{0,53,4},{0,45,985},{51,0,2665},{104,0,2665},{0,45,985},{0,35,2665},{104,0,2665},{0,35,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,117,2665},{0,81,160},{1,57,12}, +{0,50,872},{0,78,6669},{0,51,3898},{0,46,1825},{0,33,4865},{0,34,7249},{0,30,5277},{0,117,2665},{0,81,160},{1,57,8},{0,50,872},{39,0,6669},{0,51,3898},{0,46,1825},{0,33,4865},{78,0,6669},{0,33,4865},{0,62,0},{0,62,0},{0,62,0},{0,30,1},{0,30,841},{0,25,305},{0,25,305},{0,13,514},{0,14,926},{0,13,595},{0,62,0},{0,62,0},{0,62,0},{0,30,1},{15,0,841}, +{0,25,305},{0,25,305},{0,13,514},{30,0,841},{0,13,514},{57,0,2665},{0,81,160},{3,57,0},{0,50,872},{57,0,2665},{117,0,2665},{0,50,872},{0,39,2665},{117,0,2665},{0,39,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,127,2669},{0,87,80},{1,63,60},{0,53,740},{0,86,7538},{0,57,4178},{0,49,1889}, +{0,36,5333},{0,40,8241},{0,33,5845},{0,127,2669},{0,87,80},{2,61,52},{0,53,740},{42,1,7538},{0,57,4178},{0,49,1889},{0,36,5333},{86,0,7538},{0,36,5333},{0,74,0},{0,74,0},{0,74,0},{0,36,1},{0,36,1201},{0,28,445},{0,28,445},{0,18,745},{0,17,1326},{0,15,861},{0,74,0},{0,74,0},{0,74,0},{0,36,1},{18,0,1201},{0,28,445},{0,28,445},{0,18,745},{36,0,1201}, +{0,18,745},{63,0,2665},{0,87,80},{7,61,0},{0,53,740},{63,0,2665},{127,1,2665},{0,53,740},{0,43,2665},{127,1,2665},{0,43,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,127,2797},{0,93,32},{2,65,154},{0,59,628},{0,94,8493},{0,63,4490},{0,54,1965},{0,39,5849},{0,43,9333},{0,36,6469},{3,127,2761}, +{0,93,32},{3,66,126},{0,59,628},{46,0,8493},{0,63,4490},{0,54,1965},{0,39,5849},{94,0,8493},{0,39,5849},{0,86,0},{0,86,0},{0,86,0},{0,42,1},{0,42,1625},{0,34,605},{0,34,605},{0,21,1009},{0,19,1781},{0,18,1161},{0,86,0},{0,86,0},{0,86,0},{0,42,1},{21,0,1625},{0,34,605},{0,34,605},{0,21,1009},{42,0,1625},{0,21,1009},{69,0,2665},{0,93,32},{11,64,1}, +{0,59,628},{69,0,2665},{127,7,2665},{0,59,628},{0,47,2665},{127,7,2665},{0,47,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,127,3157},{0,102,2},{2,71,304},{0,62,514},{0,103,9669},{0,67,4865},{0,60,2107},{0,42,6485},{0,46,10689},{0,39,7245},{6,127,3029},{0,102,2},{5,71,260},{0,62,514},{50,1,9669}, +{0,67,4865},{0,60,2107},{0,42,6485},{103,0,9669},{0,42,6485},{0,100,0},{0,100,0},{0,100,0},{0,49,0},{0,50,2178},{0,40,820},{0,40,820},{0,24,1348},{0,22,2392},{0,21,1556},{0,100,0},{0,100,0},{0,100,0},{0,49,0},{24,1,2178},{0,40,820},{0,40,820},{0,24,1348},{50,0,2178},{0,24,1348},{76,0,2665},{0,102,2},{15,69,0},{0,62,514},{76,0,2665},{126,14,2665},{0,62,514}, +{0,51,2665},{126,14,2665},{0,51,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,127,3509},{2,108,32},{4,76,424},{1,67,473},{0,115,9669},{0,73,4529},{0,64,1649},{0,45,6209},{0,51,10919},{0,45,7109},{12,127,3141},{4,106,2},{9,75,260},{1,67,469},{56,1,9669},{0,73,4529},{0,64,1649},{0,45,6209},{115,0,9669}, +{0,45,6209},{2,108,32},{2,108,32},{2,108,32},{2,54,32},{0,62,2178},{0,46,628},{0,46,628},{0,27,1184},{0,28,2520},{0,26,1502},{4,104,0},{4,104,0},{4,104,0},{4,53,0},{30,1,2178},{0,46,628},{0,46,628},{0,27,1184},{62,0,2178},{0,27,1184},{81,0,2665},{2,108,0},{19,73,0},{0,66,421},{81,0,2665},{126,20,2665},{0,66,421},{0,55,2665},{126,20,2665},{0,55,2665},{2,0,32}, +{2,0,32},{2,0,32},{2,0,32},{0,12,0},{0,12,0},{0,12,0},{0,6,0},{0,5,10},{0,5,10},{12,127,3989},{4,114,130},{7,79,616},{3,72,525},{0,127,9669},{0,81,4178},{0,67,1265},{0,50,5950},{0,57,11199},{0,49,7029},{17,127,3253},{8,110,2},{13,79,260},{5,71,469},{62,1,9669},{0,81,4178},{0,67,1265},{0,50,5950},{127,0,9669},{0,50,5950},{4,116,128},{4,116,128},{4,116,128}, +{4,59,128},{0,74,2178},{0,54,442},{0,54,442},{0,33,1040},{0,31,2676},{0,30,1460},{8,108,0},{8,108,0},{8,108,0},{8,57,0},{36,1,2178},{0,54,442},{0,54,442},{0,33,1040},{74,0,2178},{0,33,1040},{87,0,2665},{6,112,0},{23,77,0},{0,72,325},{87,0,2665},{126,26,2665},{0,72,325},{0,59,2665},{126,26,2665},{0,59,2665},{4,0,128},{4,0,128},{4,0,128},{4,0,128},{0,24,0}, +{0,24,0},{0,24,0},{0,12,0},{0,8,50},{0,8,50},{15,127,4613},{6,118,304},{9,84,880},{4,76,645},{3,127,9761},{0,87,3898},{0,73,913},{0,56,5686},{0,63,11511},{0,53,6939},{20,127,3401},{12,114,2},{17,83,260},{9,75,469},{68,0,9669},{0,87,3898},{0,73,913},{0,56,5686},{127,6,9669},{0,56,5686},{6,124,288},{6,124,288},{6,124,288},{6,63,289},{0,86,2178},{0,60,306},{0,60,306}, +{0,36,900},{0,37,2852},{0,34,1452},{12,112,0},{12,112,0},{12,112,0},{12,61,0},{42,1,2178},{0,60,306},{0,60,306},{0,36,900},{86,0,2178},{0,36,900},{93,0,2665},{10,116,0},{27,81,0},{0,77,260},{93,0,2665},{126,32,2665},{0,77,260},{0,63,2665},{126,32,2665},{0,63,2665},{6,0,288},{6,0,288},{6,0,288},{6,0,288},{0,36,0},{0,36,0},{0,36,0},{0,18,0},{0,14,106}, +{0,14,106},{17,127,5446},{9,124,575},{12,90,1267},{8,80,862},{7,127,10073},{0,96,3625},{0,79,594},{0,59,5393},{0,70,11905},{0,57,6894},{26,127,3570},{16,119,3},{21,87,259},{14,80,470},{75,0,9669},{0,96,3625},{0,79,594},{0,59,5393},{127,13,9669},{0,59,5393},{9,127,558},{9,127,558},{9,127,558},{8,69,545},{0,100,2178},{0,67,185},{0,67,185},{0,42,754},{0,43,3090},{0,38,1478},{17,115,1}, +{17,115,1},{17,115,1},{16,65,1},{49,0,2178},{0,67,185},{0,67,185},{0,42,754},{100,0,2178},{0,42,754},{100,0,2665},{15,120,0},{32,85,1},{0,82,193},{100,0,2665},{127,38,2665},{0,82,193},{0,67,2665},{127,38,2665},{0,67,2665},{8,0,545},{8,0,545},{8,0,545},{8,0,545},{0,50,0},{0,50,0},{0,50,0},{0,24,1},{0,19,193},{0,19,193},{20,127,6378},{12,127,915},{15,93,1695}, +{9,84,1118},{12,127,10506},{0,102,3401},{0,84,366},{0,65,5186},{0,76,12289},{0,61,6870},{32,127,3738},{20,123,3},{25,91,259},{18,84,470},{80,1,9669},{0,102,3401},{0,84,366},{0,65,5186},{126,19,9669},{0,65,5186},{12,127,914},{12,127,914},{12,127,914},{10,74,841},{0,112,2178},{0,76,97},{0,76,97},{0,45,650},{0,51,3317},{0,43,1514},{21,119,1},{21,119,1},{21,119,1},{20,69,1},{55,0,2178}, +{0,76,97},{0,76,97},{0,45,650},{112,0,2178},{0,45,650},{106,0,2665},{19,124,0},{36,89,1},{0,86,130},{106,0,2665},{127,44,2665},{0,86,130},{0,71,2665},{127,44,2665},{0,71,2665},{10,0,841},{10,0,841},{10,0,841},{10,0,841},{0,62,0},{0,62,0},{0,62,0},{0,30,1},{0,25,305},{0,25,305},{23,127,7454},{15,127,1431},{17,97,2214},{11,89,1438},{15,127,11102},{0,108,3209},{0,90,198}, +{0,69,4913},{0,81,12639},{0,65,6875},{38,127,3938},{24,127,3},{29,95,259},{22,88,470},{86,1,9669},{0,108,3209},{0,90,198},{0,69,4913},{126,25,9669},{0,69,4913},{15,127,1382},{15,127,1382},{15,127,1382},{12,79,1201},{0,124,2178},{0,84,37},{0,84,37},{0,50,549},{0,54,3565},{0,46,1598},{25,123,1},{25,123,1},{25,123,1},{24,73,1},{61,0,2178},{0,84,37},{0,84,37},{0,50,549},{124,0,2178}, +{0,50,549},{112,0,2665},{24,127,2},{40,93,1},{0,91,89},{112,0,2665},{127,50,2665},{0,91,89},{0,75,2665},{127,50,2665},{0,75,2665},{12,0,1201},{12,0,1201},{12,0,1201},{12,0,1201},{0,74,0},{0,74,0},{0,74,0},{0,36,1},{0,28,445},{0,28,445},{26,127,8674},{18,127,2131},{19,102,2786},{13,93,1839},{17,127,11833},{0,113,3038},{0,95,86},{0,72,4685},{0,84,13079},{0,70,6909},{41,127,4130}, +{30,127,35},{33,99,259},{26,92,470},{92,1,9669},{0,113,3038},{0,95,86},{0,72,4685},{126,31,9669},{0,72,4685},{17,127,1941},{17,127,1941},{17,127,1941},{14,84,1625},{3,127,2222},{0,90,5},{0,90,5},{0,56,445},{0,60,3861},{0,51,1674},{29,127,1},{29,127,1},{29,127,1},{28,77,1},{66,1,2178},{0,90,5},{0,90,5},{0,56,445},{126,5,2178},{0,56,445},{118,0,2665},{31,127,20},{44,97,1}, +{0,95,50},{118,0,2665},{127,56,2665},{0,95,50},{0,79,2665},{127,56,2665},{0,79,2665},{14,0,1625},{14,0,1625},{14,0,1625},{14,0,1625},{0,86,0},{0,86,0},{0,86,0},{0,42,1},{0,34,605},{0,34,605},{32,127,10209},{21,127,3140},{22,108,3525},{15,98,2360},{20,127,12902},{0,122,2885},{0,101,21},{0,78,4450},{0,93,13598},{0,73,6982},{47,127,4373},{34,127,134},{38,104,260},{30,96,469},{99,0,9669}, +{0,122,2885},{0,101,21},{0,78,4450},{126,38,9669},{0,78,4450},{20,127,2717},{20,127,2717},{20,127,2717},{16,90,2180},{6,127,2420},{0,98,1},{0,98,1},{0,62,353},{0,64,4230},{0,57,1814},{34,126,13},{34,126,13},{34,126,13},{33,81,1},{73,0,2178},{2,96,1},{2,96,1},{0,62,353},{126,12,2178},{0,62,353},{125,0,2665},{40,127,74},{48,102,0},{0,101,20},{125,0,2665},{126,63,2665},{0,101,20}, +{0,84,2665},{126,63,2665},{0,84,2665},{16,0,2180},{16,0,2180},{16,0,2180},{16,0,2180},{0,100,0},{0,100,0},{0,100,0},{0,49,0},{0,40,820},{0,40,820},{35,127,11582},{25,127,4131},{25,111,4166},{17,103,2825},{26,127,13903},{1,126,2826},{1,105,18},{0,83,4290},{0,96,13969},{0,79,6967},{52,127,4577},{40,127,270},{42,108,260},{34,100,469},{105,0,9669},{1,126,2825},{1,105,17},{0,83,4289},{126,44,9669}, +{0,83,4289},{23,127,3434},{23,127,3434},{23,127,3434},{19,94,2666},{9,127,2709},{1,105,14},{1,105,14},{0,66,275},{0,70,4491},{0,60,1893},{38,127,29},{38,127,29},{38,127,29},{37,85,1},{79,0,2178},{6,100,1},{6,100,1},{0,66,274},{127,17,2178},{0,66,274},{127,7,2665},{46,127,146},{52,106,0},{0,105,8},{127,7,2665},{127,68,2665},{0,105,8},{0,88,2665},{127,68,2665},{0,88,2665},{19,0,2665}, +{19,0,2665},{19,0,2665},{19,0,2665},{1,110,1},{1,110,1},{1,110,1},{0,55,1},{0,43,985},{0,43,985},{38,127,12090},{30,127,4561},{29,115,4166},{21,107,2825},{29,127,14311},{5,127,2910},{5,109,18},{0,86,4166},{0,105,13477},{0,84,6285},{58,127,4833},{46,127,470},{46,112,260},{38,104,469},{111,0,9669},{5,127,2909},{5,109,17},{0,86,4085},{127,49,9669},{0,86,4085},{26,127,3590},{26,127,3590},{26,127,3590}, +{23,98,2666},{12,127,2853},{5,109,14},{5,109,14},{3,69,259},{0,76,4147},{0,64,1475},{44,127,61},{44,127,61},{44,127,61},{41,89,1},{85,0,2178},{10,104,1},{10,104,1},{0,69,202},{127,23,2178},{0,69,202},{127,19,2665},{54,127,260},{56,110,0},{0,110,0},{127,19,2665},{127,74,2665},{0,110,0},{0,92,2665},{127,74,2665},{0,92,2665},{23,0,2665},{23,0,2665},{23,0,2665},{23,0,2665},{5,114,1}, +{5,114,1},{5,114,1},{4,59,1},{0,51,745},{0,51,745},{44,127,12610},{34,127,5039},{33,119,4166},{25,111,2825},{35,127,14719},{11,127,3118},{9,113,18},{4,90,4166},{0,113,13003},{0,87,5661},{61,127,5093},{51,127,736},{50,116,260},{42,108,469},{117,0,9669},{14,127,3073},{9,113,17},{0,89,3929},{127,55,9669},{0,89,3929},{32,127,3726},{32,127,3726},{32,127,3726},{27,102,2666},{17,127,2979},{9,113,14},{9,113,14}, +{7,73,259},{0,84,3784},{0,70,1091},{47,127,97},{47,127,97},{47,127,97},{45,93,1},{91,0,2178},{14,108,1},{14,108,1},{0,75,146},{127,29,2178},{0,75,146},{127,31,2665},{60,127,388},{60,114,0},{3,114,0},{127,31,2665},{127,80,2665},{3,114,0},{0,96,2665},{127,80,2665},{0,96,2665},{27,0,2665},{27,0,2665},{27,0,2665},{27,0,2665},{9,118,1},{9,118,1},{9,118,1},{8,63,1},{0,60,565}, +{0,60,565},{49,127,13154},{40,127,5661},{37,123,4166},{30,116,2823},{41,127,15213},{16,127,3497},{14,118,18},{8,94,4166},{0,116,12489},{0,93,5039},{68,127,5409},{57,127,1091},{54,120,259},{47,113,470},{124,0,9669},{22,127,3341},{14,118,14},{0,95,3726},{127,62,9669},{0,95,3726},{38,127,3929},{38,127,3929},{38,127,3929},{31,107,2665},{23,127,3156},{13,117,17},{13,117,17},{11,77,260},{0,90,3467},{0,76,736},{52,127,146}, +{52,127,146},{52,127,146},{49,98,1},{98,0,2178},{19,112,1},{19,112,1},{0,80,97},{127,36,2178},{0,80,97},{127,45,2665},{67,127,565},{64,119,1},{9,118,1},{127,45,2665},{126,87,2665},{9,118,1},{0,100,2665},{126,87,2665},{0,100,2665},{31,0,2665},{31,0,2665},{31,0,2665},{31,0,2665},{13,123,0},{13,123,0},{13,123,0},{13,67,0},{0,67,388},{0,67,388},{52,127,13734},{43,127,6285},{41,127,4166}, +{34,120,2823},{47,127,15677},{22,127,3905},{18,122,18},{12,98,4166},{0,125,12093},{0,97,4561},{71,127,5701},{60,127,1475},{58,124,259},{51,117,470},{127,5,9669},{31,127,3601},{18,122,14},{0,101,3590},{126,68,9669},{0,101,3590},{41,127,4085},{41,127,4085},{41,127,4085},{35,111,2665},{29,127,3332},{17,121,17},{17,121,17},{15,81,260},{0,99,3211},{0,81,470},{58,127,202},{58,127,202},{58,127,202},{53,102,1},{104,0,2178}, +{23,116,1},{23,116,1},{0,83,61},{127,42,2178},{0,83,61},{127,57,2665},{76,127,745},{68,123,1},{13,122,1},{127,57,2665},{126,93,2665},{13,122,1},{0,104,2665},{126,93,2665},{0,104,2665},{35,0,2665},{35,0,2665},{35,0,2665},{35,0,2665},{17,127,0},{17,127,0},{17,127,0},{17,71,0},{0,73,260},{0,73,260},{58,127,14302},{48,127,6967},{44,127,4290},{38,124,2823},{52,127,16094},{28,127,4409},{22,126,18}, +{16,102,4166},{0,126,11883},{0,102,4131},{77,127,6005},{67,127,1893},{61,127,275},{55,121,470},{127,18,9669},{40,127,3909},{22,126,14},{0,104,3434},{126,74,9669},{0,104,3434},{44,127,4289},{44,127,4289},{44,127,4289},{39,115,2665},{35,127,3540},{21,125,17},{21,125,17},{19,85,260},{0,105,2979},{0,87,270},{61,127,274},{61,127,274},{61,127,274},{57,106,1},{110,0,2178},{27,120,1},{27,120,1},{0,89,29},{126,48,2178}, +{0,89,29},{127,69,2665},{81,127,985},{72,127,1},{17,126,1},{127,69,2665},{126,99,2665},{17,126,1},{0,108,2665},{126,99,2665},{0,108,2665},{39,0,2665},{39,0,2665},{39,0,2665},{39,0,2665},{22,126,8},{22,126,8},{22,126,8},{21,75,0},{0,81,146},{0,81,146},{61,127,13635},{53,127,6982},{49,127,4450},{42,125,2742},{55,127,15195},{34,127,4106},{26,127,21},{19,105,3525},{2,127,10776},{0,106,3140},{79,127,5396}, +{70,127,1814},{65,127,353},{59,122,321},{127,27,8712},{46,127,3462},{29,127,1},{0,107,2717},{126,78,8712},{0,107,2717},{49,127,4450},{49,127,4450},{49,127,4450},{43,119,2665},{38,127,3736},{26,127,21},{26,127,21},{23,89,260},{0,113,2772},{0,93,134},{65,127,353},{65,127,353},{65,127,353},{61,110,1},{115,1,2178},{31,124,1},{31,124,1},{0,93,13},{126,54,2178},{0,93,13},{127,76,2178},{87,127,820},{78,127,0}, +{27,127,0},{127,76,2178},{126,103,2178},{27,127,0},{0,110,2180},{126,103,2178},{0,110,2180},{43,0,2665},{43,0,2665},{43,0,2665},{43,0,2665},{26,127,20},{26,127,20},{26,127,20},{25,79,0},{0,87,74},{0,87,74},{65,127,12750},{57,127,6909},{55,127,4685},{48,126,2678},{61,127,14070},{37,127,3711},{32,127,86},{25,108,2786},{5,127,9739},{0,109,2131},{85,127,4658},{76,127,1674},{71,127,445},{64,123,173},{127,36,7578}, +{51,127,2949},{37,127,5},{0,110,1941},{127,82,7578},{0,110,1941},{55,127,4685},{55,127,4685},{55,127,4685},{48,123,2666},{44,127,3987},{32,127,86},{32,127,86},{28,94,259},{0,119,2571},{0,97,35},{71,127,445},{71,127,445},{71,127,445},{66,114,1},{122,0,2178},{37,127,5},{37,127,5},{0,98,1},{126,61,2178},{0,98,1},{127,83,1625},{93,127,605},{84,127,1},{40,127,0},{127,83,1625},{126,106,1625},{40,127,0}, +{0,113,1625},{126,106,1625},{0,113,1625},{48,0,2665},{48,0,2665},{48,0,2665},{48,0,2665},{32,127,50},{32,127,50},{32,127,50},{30,83,1},{0,96,20},{0,96,20},{68,127,12050},{62,127,6875},{58,127,4913},{52,127,2666},{65,127,13165},{43,127,3423},{37,127,198},{30,110,2214},{11,127,8987},{0,112,1431},{88,127,4082},{79,127,1547},{77,127,549},{68,124,81},{127,43,6661},{57,127,2525},{43,127,37},{0,112,1382},{127,86,6661}, +{0,112,1382},{58,127,4913},{58,127,4913},{58,127,4913},{52,127,2666},{49,127,4197},{37,127,198},{37,127,198},{32,98,259},{0,125,2435},{0,103,3},{77,127,549},{77,127,549},{77,127,549},{70,118,1},{127,2,2178},{43,127,37},{43,127,37},{3,102,1},{127,66,2178},{3,102,1},{127,89,1201},{99,127,445},{90,127,1},{53,127,0},{127,89,1201},{125,109,1201},{53,127,0},{0,115,1201},{125,109,1201},{0,115,1201},{52,0,2665}, +{52,0,2665},{52,0,2665},{52,0,2665},{36,127,89},{36,127,89},{36,127,89},{34,87,1},{0,103,2},{0,103,2},{74,127,11418},{65,127,6870},{62,127,5186},{56,127,2701},{68,127,12313},{46,127,3251},{43,127,366},{34,112,1695},{14,127,8383},{0,115,915},{91,127,3578},{84,127,1514},{79,127,650},{73,126,21},{127,53,5829},{63,127,2165},{51,127,97},{0,115,914},{126,91,5829},{0,115,914},{62,127,5186},{62,127,5186},{62,127,5186}, +{56,127,2701},{55,127,4461},{43,127,366},{43,127,366},{36,102,259},{2,127,2427},{4,107,3},{79,127,650},{79,127,650},{79,127,650},{74,122,1},{127,14,2178},{51,127,97},{51,127,97},{7,106,1},{127,72,2178},{7,106,1},{127,95,841},{102,127,305},{96,127,1},{64,127,0},{127,95,841},{127,111,841},{64,127,0},{0,117,841},{127,111,841},{0,117,841},{56,0,2665},{56,0,2665},{56,0,2665},{56,0,2665},{41,127,130}, +{41,127,130},{41,127,130},{38,91,1},{3,108,0},{3,108,0},{77,127,10830},{69,127,6894},{68,127,5393},{60,127,2786},{71,127,11565},{54,127,3154},{48,127,594},{37,115,1267},{25,127,7825},{3,118,575},{94,127,3146},{87,127,1478},{85,127,754},{77,127,1},{127,60,5082},{70,127,1869},{57,127,185},{0,118,558},{127,94,5082},{0,118,558},{68,127,5393},{68,127,5393},{68,127,5393},{60,127,2786},{58,127,4725},{48,127,594},{48,127,594}, +{40,106,259},{8,127,2587},{8,111,3},{85,127,754},{85,127,754},{85,127,754},{78,126,1},{127,27,2178},{57,127,185},{57,127,185},{11,110,1},{126,78,2178},{11,110,1},{127,101,545},{108,127,193},{102,127,1},{76,127,0},{127,101,545},{127,114,545},{76,127,0},{0,119,545},{127,114,545},{0,119,545},{60,0,2665},{60,0,2665},{60,0,2665},{60,0,2665},{45,127,193},{45,127,193},{45,127,193},{42,95,1},{7,112,0}, +{7,112,0},{79,127,10221},{74,127,6939},{71,127,5686},{64,127,2954},{77,127,10836},{57,127,3109},{54,127,913},{42,117,880},{34,127,7300},{8,120,304},{100,127,2736},{93,127,1452},{91,127,900},{83,127,29},{127,69,4344},{76,127,1611},{67,127,306},{2,121,288},{126,99,4344},{2,121,288},{71,127,5686},{71,127,5686},{71,127,5686},{64,127,2954},{65,127,5051},{54,127,913},{54,127,913},{44,110,260},{14,127,2856},{13,115,2},{91,127,900}, +{91,127,900},{91,127,900},{83,127,29},{127,40,2178},{67,127,306},{67,127,306},{15,115,0},{126,85,2178},{15,115,0},{127,108,288},{113,127,106},{109,127,0},{90,127,0},{127,108,288},{127,118,288},{90,127,0},{0,121,288},{127,118,288},{0,121,288},{64,0,2665},{64,0,2665},{64,0,2665},{64,0,2665},{50,127,260},{50,127,260},{50,127,260},{46,100,0},{11,117,0},{11,117,0},{85,127,9781},{79,127,6942},{77,127,5950}, +{70,127,3146},{79,127,10205},{63,127,3141},{57,127,1265},{47,119,616},{40,127,6924},{13,123,130},{103,127,2436},{97,127,1460},{94,127,1040},{87,127,104},{127,76,3779},{81,127,1496},{73,127,442},{10,123,128},{126,103,3779},{10,123,128},{77,127,5950},{77,127,5950},{77,127,5950},{70,127,3146},{68,127,5347},{57,127,1265},{57,127,1265},{48,114,260},{25,127,3115},{17,119,2},{94,127,1040},{94,127,1040},{94,127,1040},{87,127,104},{127,53,2178}, +{73,127,442},{73,127,442},{19,119,0},{126,91,2178},{19,119,0},{127,115,128},{116,127,50},{115,127,0},{102,127,0},{127,115,128},{127,121,128},{102,127,0},{0,123,128},{127,121,128},{0,123,128},{68,0,2665},{68,0,2665},{68,0,2665},{68,0,2665},{55,127,325},{55,127,325},{55,127,325},{50,104,0},{15,121,0},{15,121,0},{88,127,9417},{82,127,7109},{82,127,6209},{73,127,3406},{85,127,9733},{67,127,3260},{63,127,1649}, +{50,122,424},{46,127,6644},{19,125,32},{106,127,2208},{101,127,1502},{100,127,1184},{93,127,232},{127,86,3299},{87,127,1400},{81,127,628},{19,125,32},{127,107,3299},{19,125,32},{82,127,6209},{82,127,6209},{82,127,6209},{73,127,3406},{74,127,5659},{63,127,1649},{63,127,1649},{52,118,260},{34,127,3419},{21,123,2},{100,127,1184},{100,127,1184},{100,127,1184},{93,127,232},{127,64,2178},{81,127,628},{81,127,628},{23,123,0},{126,97,2178}, +{23,123,0},{127,121,32},{122,127,10},{121,127,0},{115,127,0},{127,121,32},{127,124,32},{115,127,0},{0,125,32},{127,124,32},{0,125,32},{72,0,2665},{72,0,2665},{72,0,2665},{72,0,2665},{61,127,421},{61,127,421},{61,127,421},{54,108,0},{19,125,0},{19,125,0},{91,127,9133},{88,127,7245},{85,127,6485},{79,127,3710},{88,127,9325},{73,127,3460},{67,127,2107},{55,124,304},{54,127,6532},{25,127,2},{111,127,2038}, +{106,127,1556},{103,127,1348},{96,127,416},{127,93,2904},{93,127,1368},{87,127,820},{27,127,0},{126,111,2904},{27,127,0},{85,127,6485},{85,127,6485},{85,127,6485},{79,127,3710},{79,127,5949},{67,127,2107},{67,127,2107},{56,122,260},{40,127,3771},{25,127,2},{103,127,1348},{103,127,1348},{103,127,1348},{96,127,416},{127,76,2178},{87,127,820},{87,127,820},{27,127,0},{126,103,2178},{27,127,0},{127,127,0},{127,127,0},{127,127,0}, +{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{76,0,2665},{76,0,2665},{76,0,2665},{76,0,2665},{65,127,514},{65,127,514},{65,127,514},{58,112,0},{25,127,2},{25,127,2},{94,127,8049},{91,127,6469},{88,127,5849},{84,127,3561},{91,127,8053},{76,127,3106},{73,127,1965},{62,125,154},{60,127,5562},{34,127,32},{111,127,1507},{109,127,1161},{106,127,1009},{102,127,305},{127,98,2166}, +{99,127,1009},{93,127,605},{40,127,0},{126,113,2166},{40,127,0},{88,127,5849},{88,127,5849},{88,127,5849},{84,127,3561},{82,127,5209},{73,127,1965},{73,127,1965},{61,124,126},{46,127,3225},{34,127,32},{106,127,1009},{106,127,1009},{106,127,1009},{102,127,305},{127,83,1625},{93,127,605},{93,127,605},{40,127,0},{126,106,1625},{40,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0}, +{0,127,0},{127,127,0},{0,127,0},{80,0,2665},{80,0,2665},{80,0,2665},{80,0,2665},{68,127,628},{68,127,628},{68,127,628},{63,116,1},{34,127,32},{34,127,32},{97,127,7165},{94,127,5845},{91,127,5333},{87,127,3401},{94,127,7033},{79,127,2823},{79,127,1862},{64,126,60},{64,127,4795},{40,127,80},{114,127,1107},{111,127,830},{111,127,730},{105,127,221},{127,102,1601},{102,127,737},{99,127,445},{53,127,0},{127,115,1601}, +{53,127,0},{91,127,5333},{91,127,5333},{91,127,5333},{87,127,3401},{85,127,4629},{79,127,1862},{79,127,1862},{66,125,52},{54,127,2834},{40,127,80},{111,127,730},{111,127,730},{111,127,730},{105,127,221},{127,89,1201},{99,127,445},{99,127,445},{53,127,0},{125,109,1201},{53,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{84,0,2665}, +{84,0,2665},{84,0,2665},{84,0,2665},{74,127,740},{74,127,740},{74,127,740},{66,120,0},{40,127,80},{40,127,80},{100,127,6361},{97,127,5277},{94,127,4865},{90,127,3265},{97,127,6117},{84,127,2641},{79,127,1814},{70,126,12},{70,127,4123},{46,127,160},{117,127,779},{114,127,595},{114,127,514},{108,127,153},{127,105,1121},{105,127,513},{102,127,305},{64,127,0},{126,117,1121},{64,127,0},{94,127,4865},{94,127,4865},{94,127,4865}, +{90,127,3265},{91,127,4117},{79,127,1814},{79,127,1814},{70,126,8},{60,127,2474},{46,127,160},{114,127,514},{114,127,514},{114,127,514},{108,127,153},{127,95,841},{102,127,305},{102,127,305},{64,127,0},{127,111,841},{64,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{88,0,2665},{88,0,2665},{88,0,2665},{88,0,2665},{79,127,853}, +{79,127,853},{79,127,853},{70,124,0},{46,127,160},{46,127,160},{103,127,5637},{100,127,4765},{100,127,4441},{93,127,3153},{100,127,5305},{90,127,2465},{86,127,1789},{74,127,4},{73,127,3543},{54,127,274},{117,127,507},{117,127,387},{115,127,337},{111,127,101},{127,110,726},{108,127,337},{108,127,193},{76,127,0},{126,119,726},{76,127,0},{100,127,4441},{100,127,4441},{100,127,4441},{93,127,3153},{94,127,3657},{86,127,1789},{86,127,1789}, +{74,127,4},{67,127,2182},{54,127,274},{115,127,337},{115,127,337},{115,127,337},{111,127,101},{127,101,545},{108,127,193},{108,127,193},{76,127,0},{127,114,545},{76,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{92,0,2665},{92,0,2665},{92,0,2665},{92,0,2665},{82,127,985},{82,127,985},{82,127,985},{74,127,4},{54,127,274}, +{54,127,274},{17,127,39416},{1,127,2073},{0,90,164},{0,86,5261},{17,127,49709},{0,113,21212},{0,85,8480},{0,75,26137},{0,87,56335},{0,67,37225},{12,127,10274},{0,122,1413},{0,90,148},{0,75,3940},{57,0,18065},{0,76,12036},{0,68,6166},{0,45,14098},{117,0,18065},{0,45,14098},{0,71,0},{0,71,0},{0,71,0},{0,35,0},{0,35,1105},{0,28,405},{0,28,405},{0,15,689},{0,14,1226},{0,15,789},{0,71,0}, +{0,71,0},{0,71,0},{0,35,0},{17,0,1105},{0,28,405},{0,28,405},{0,15,689},{35,0,1105},{0,15,689},{85,0,9248},{0,122,1413},{0,90,148},{0,75,3940},{85,0,9248},{127,23,9248},{0,75,3940},{0,57,9250},{127,23,9248},{0,57,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{20,127,44736},{2,127,2677},{0,95,64}, +{0,92,4941},{17,127,55213},{0,119,21820},{0,89,8426},{0,78,27209},{0,90,60583},{0,73,39465},{15,127,10870},{0,125,1213},{0,93,52},{0,78,3656},{61,0,19334},{0,81,12395},{0,73,6176},{0,50,14795},{124,0,19334},{0,50,14795},{0,83,0},{0,83,0},{0,83,0},{0,41,0},{0,41,1513},{0,34,565},{0,34,565},{0,18,937},{0,19,1661},{0,18,1081},{0,83,0},{0,83,0},{0,83,0},{0,41,0},{20,0,1513}, +{0,34,565},{0,34,565},{0,18,937},{41,0,1513},{0,18,937},{91,0,9248},{0,125,1213},{0,93,52},{0,78,3656},{91,0,9248},{127,29,9248},{0,78,3656},{0,61,9250},{127,29,9248},{0,61,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{20,127,50624},{2,127,4005},{0,99,4},{0,95,4545},{20,127,61345},{0,125,22460},{0,93,8410}, +{0,83,28480},{0,96,65039},{0,76,41789},{17,127,11556},{1,127,1217},{0,99,4},{0,83,3425},{64,0,20689},{0,87,12835},{0,76,6216},{0,53,15539},{126,3,20689},{0,53,15539},{0,95,0},{0,95,0},{0,95,0},{0,47,0},{0,47,1985},{0,37,745},{0,37,745},{0,21,1225},{0,22,2185},{0,21,1421},{0,95,0},{0,95,0},{0,95,0},{0,47,0},{23,0,1985},{0,37,745},{0,37,745},{0,21,1225},{47,0,1985}, +{0,21,1225},{97,0,9248},{2,127,1205},{0,99,4},{0,83,3425},{97,0,9248},{127,35,9248},{0,83,3425},{0,65,9248},{127,35,9248},{0,65,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{23,127,56952},{5,127,6081},{0,103,9},{0,98,4221},{20,127,65535},{0,126,23535},{0,97,8416},{0,86,29640},{0,99,65535},{0,79,44233},{20,127,12416}, +{2,127,1397},{1,103,8},{0,86,3181},{69,0,22129},{0,90,13307},{0,81,6266},{0,56,16331},{127,7,22129},{0,56,16331},{0,107,0},{0,107,0},{0,107,0},{0,53,0},{0,53,2521},{0,43,953},{0,43,953},{0,24,1553},{0,22,2777},{0,24,1809},{0,107,0},{0,107,0},{0,107,0},{0,53,0},{26,0,2521},{0,43,953},{0,43,953},{0,24,1553},{53,0,2521},{0,24,1553},{103,0,9248},{2,127,1381},{2,103,0}, +{0,86,3181},{103,0,9248},{127,41,9248},{0,86,3181},{0,69,9248},{127,41,9248},{0,69,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{26,127,64790},{5,127,9105},{1,108,78},{0,104,3845},{23,127,65535},{2,127,25370},{0,102,8458},{0,89,31046},{0,105,65535},{0,81,47079},{23,127,13542},{5,127,1881},{2,109,50},{0,92,2897},{73,0,23851}, +{0,96,13865},{0,87,6374},{0,59,17289},{126,12,23851},{0,59,17289},{0,121,0},{0,121,0},{0,121,0},{0,59,1},{0,61,3200},{0,51,1210},{0,51,1210},{0,27,1972},{0,25,3528},{0,27,2296},{0,121,0},{0,121,0},{0,121,0},{0,59,1},{30,0,3200},{0,51,1210},{0,51,1210},{0,27,1972},{61,0,3200},{0,27,1972},{110,0,9248},{11,127,1693},{7,107,1},{0,92,2897},{110,0,9248},{126,48,9248},{0,92,2897}, +{0,73,9250},{126,48,9248},{0,73,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{26,127,65535},{5,127,12609},{1,111,198},{0,107,3541},{26,127,65535},{2,127,27706},{0,105,8522},{0,92,32390},{0,113,65535},{0,87,49743},{26,127,14690},{8,127,2501},{3,113,126},{0,98,2665},{77,0,25472},{0,102,14385},{0,90,6486},{0,62,18185},{127,15,25472}, +{0,62,18185},{0,127,16},{0,127,16},{0,127,16},{0,65,0},{0,66,3872},{0,51,1450},{0,51,1450},{0,30,2384},{0,28,4268},{0,27,2776},{1,127,13},{1,127,13},{1,127,13},{0,65,0},{33,0,3872},{0,51,1450},{0,51,1450},{0,30,2384},{66,0,3872},{0,30,2384},{115,1,9248},{19,127,2041},{11,111,1},{0,98,2665},{115,1,9248},{126,54,9248},{0,98,2665},{0,77,9250},{126,54,9248},{0,77,9250},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{29,127,65535},{8,127,16605},{1,116,349},{0,112,3274},{26,127,65535},{2,127,30470},{0,109,8346},{0,98,33226},{0,113,65535},{0,90,52035},{29,127,15746},{11,127,3213},{5,117,217},{0,101,2445},{81,0,26744},{0,108,14657},{0,96,6398},{0,66,18739},{126,20,26744},{0,66,18739},{3,127,116},{3,127,116},{3,127,116}, +{0,71,4},{0,74,4418},{0,57,1586},{0,57,1586},{0,33,2664},{0,31,4916},{0,30,3140},{3,127,80},{3,127,80},{3,127,80},{1,70,1},{36,1,4418},{0,57,1586},{0,57,1586},{0,33,2664},{74,0,4418},{0,33,2664},{121,1,9248},{25,127,2377},{15,115,1},{0,101,2441},{121,1,9248},{126,60,9248},{0,101,2441},{0,81,9250},{126,60,9248},{0,81,9250},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,3,0}, +{0,3,0},{0,3,0},{0,1,1},{1,0,2},{1,0,2},{32,127,65535},{11,127,21205},{2,120,605},{0,115,3106},{29,127,65535},{2,127,33062},{0,114,7330},{0,101,32522},{0,119,65535},{0,93,52995},{35,127,16210},{14,127,3809},{9,121,217},{0,107,2325},{87,0,26744},{0,116,14054},{0,99,5606},{0,72,18275},{126,26,26744},{0,72,18275},{6,127,292},{6,127,292},{6,127,292},{2,76,52},{0,86,4418},{0,64,1313},{0,64,1313}, +{0,39,2440},{0,37,5092},{0,36,3044},{9,127,128},{9,127,128},{9,127,128},{5,74,1},{42,1,4418},{0,64,1313},{0,64,1313},{0,39,2440},{86,0,4418},{0,39,2440},{127,1,9248},{34,127,2741},{19,119,1},{0,107,2225},{127,1,9248},{127,65,9248},{0,107,2225},{0,85,9250},{127,65,9248},{0,85,9250},{2,0,52},{2,0,52},{2,0,52},{2,0,52},{0,15,0},{0,15,0},{0,15,0},{0,7,1},{0,5,18}, +{0,5,18},{35,127,65535},{11,127,27154},{3,124,1078},{0,121,3041},{32,127,65535},{5,127,36765},{0,119,6285},{0,107,31809},{0,125,65535},{0,96,54246},{38,127,16729},{22,127,4594},{14,126,218},{4,111,2318},{94,0,26744},{0,122,13481},{0,105,4785},{0,75,17772},{127,32,26744},{0,75,17772},{9,127,614},{9,127,614},{9,127,614},{5,81,181},{0,100,4418},{0,73,1037},{0,73,1037},{0,42,2210},{0,43,5330},{0,41,2986},{13,127,193}, +{13,127,193},{13,127,193},{9,79,1},{49,0,4418},{0,73,1037},{0,73,1037},{0,42,2210},{100,0,4418},{0,42,2210},{127,14,9248},{40,127,3177},{23,124,0},{0,110,2009},{127,14,9248},{127,72,9248},{0,110,2009},{0,90,9248},{127,72,9248},{0,90,9248},{5,0,181},{5,0,181},{5,0,181},{5,0,181},{0,29,0},{0,29,0},{0,29,0},{0,14,0},{0,11,65},{0,11,65},{35,127,65535},{14,127,31662},{4,127,1705}, +{0,124,3025},{35,127,65535},{8,127,39325},{0,122,5245},{0,110,30421},{0,125,65535},{0,102,54322},{44,127,16749},{25,127,5034},{17,127,245},{7,114,2214},{99,0,26259},{0,125,12725},{0,111,3981},{0,78,16984},{126,38,26259},{0,78,16984},{10,127,1025},{10,127,1025},{10,127,1025},{7,86,365},{0,112,4418},{0,81,797},{0,81,797},{0,47,2025},{0,51,5557},{0,45,2950},{17,127,245},{17,127,245},{17,127,245},{13,83,1},{55,0,4418}, +{0,81,797},{0,81,797},{0,47,2025},{112,0,4418},{0,47,2025},{127,25,8978},{46,127,3385},{28,127,0},{0,115,1732},{127,25,8978},{127,77,8978},{0,115,1732},{0,93,8980},{127,77,8978},{0,93,8980},{7,0,365},{7,0,365},{7,0,365},{7,0,365},{0,41,0},{0,41,0},{0,41,0},{0,20,0},{0,17,137},{0,17,137},{38,127,65535},{14,127,32078},{6,127,2618},{1,125,2789},{35,127,65535},{8,127,37485},{0,123,3805}, +{0,110,27013},{0,125,65535},{0,102,51330},{49,127,15435},{31,127,4714},{23,127,317},{12,116,1830},{104,0,24371},{0,125,11205},{0,113,2881},{0,83,15117},{127,42,24371},{0,83,15117},{12,127,1538},{12,127,1538},{12,127,1538},{9,91,613},{0,124,4418},{0,87,605},{0,87,605},{0,53,1825},{0,54,5805},{0,49,2946},{23,127,317},{23,127,317},{23,127,317},{17,87,1},{61,0,4418},{0,87,605},{0,87,605},{0,53,1825},{124,0,4418}, +{0,53,1825},{127,31,7938},{51,127,3029},{34,127,0},{0,118,1224},{127,31,7938},{127,80,7938},{0,118,1224},{0,95,7940},{127,80,7938},{0,95,7940},{9,0,613},{9,0,613},{9,0,613},{9,0,613},{0,53,0},{0,53,0},{0,53,0},{0,26,0},{0,22,221},{0,22,221},{38,127,65535},{14,127,32750},{6,127,3706},{3,124,2753},{35,127,65535},{8,127,35901},{0,124,2601},{0,110,23861},{0,125,65535},{0,102,48594},{52,127,14211}, +{34,127,4410},{26,127,405},{16,117,1482},{107,1,22568},{2,127,9869},{0,116,1973},{0,86,13349},{126,46,22568},{0,86,13349},{17,127,2137},{17,127,2137},{17,127,2137},{11,96,925},{3,127,4462},{0,93,445},{0,93,445},{0,56,1649},{0,60,6101},{0,54,2966},{26,127,405},{26,127,405},{26,127,405},{21,91,1},{66,1,4418},{0,93,445},{0,93,445},{0,56,1649},{126,5,4418},{0,56,1649},{127,37,6962},{57,127,2645},{40,127,0}, +{0,118,808},{127,37,6962},{127,83,6962},{0,118,808},{0,97,6964},{127,83,6962},{0,97,6964},{11,0,925},{11,0,925},{11,0,925},{11,0,925},{0,65,0},{0,65,0},{0,65,0},{0,32,0},{0,25,337},{0,25,337},{38,127,65535},{14,127,33812},{7,127,5233},{4,125,2961},{35,127,65535},{8,127,34425},{0,125,1509},{0,112,20542},{0,125,65535},{0,105,45810},{55,127,12917},{40,127,4114},{32,127,505},{22,117,1140},{112,0,20642}, +{2,127,8609},{0,119,1157},{0,89,11489},{127,50,20642},{0,89,11489},{20,127,2969},{20,127,2969},{20,127,2969},{13,102,1352},{6,127,4660},{0,102,289},{0,102,289},{0,62,1445},{0,64,6470},{0,57,3018},{32,127,505},{32,127,505},{32,127,505},{26,95,1},{73,0,4418},{0,102,289},{0,102,289},{0,62,1445},{126,12,4418},{0,62,1445},{127,43,5941},{63,127,2248},{46,127,1},{0,121,433},{127,43,5941},{127,86,5941},{0,121,433}, +{0,100,5941},{127,86,5941},{0,100,5941},{13,0,1352},{13,0,1352},{13,0,1352},{13,0,1352},{0,78,0},{0,78,0},{0,78,0},{0,39,0},{0,31,500},{0,31,500},{38,127,65535},{19,127,34934},{9,127,6748},{5,126,3381},{38,127,65535},{11,127,33369},{0,125,789},{0,112,17822},{0,125,65535},{0,105,43458},{58,127,11849},{43,127,3870},{38,127,617},{27,119,868},{115,1,19021},{5,127,7741},{0,120,621},{0,92,9957},{126,54,19021}, +{0,92,9957},{23,127,3833},{23,127,3833},{23,127,3833},{15,107,1800},{9,127,4984},{0,108,185},{0,108,185},{0,66,1282},{0,70,6822},{0,63,3090},{38,127,617},{38,127,617},{38,127,617},{30,99,1},{79,0,4418},{0,108,185},{0,108,185},{0,66,1282},{127,17,4418},{0,66,1282},{127,50,5101},{67,127,1921},{52,127,0},{0,124,205},{127,50,5101},{127,89,5101},{0,124,205},{0,102,5101},{127,89,5101},{0,102,5101},{15,0,1800}, +{15,0,1800},{15,0,1800},{15,0,1800},{0,91,0},{0,91,0},{0,91,0},{0,45,0},{0,37,676},{0,37,676},{41,127,65535},{19,127,36134},{9,127,8476},{5,126,4005},{38,127,65535},{11,127,32489},{0,126,309},{0,115,15210},{0,125,65535},{0,105,41362},{61,127,10853},{46,127,3674},{41,127,725},{31,120,632},{120,0,17485},{11,127,6965},{0,123,249},{0,95,8537},{127,58,17485},{0,95,8537},{23,127,4809},{23,127,4809},{23,127,4809}, +{17,112,2312},{12,127,5444},{0,116,89},{0,116,89},{0,72,1130},{0,76,7206},{0,67,3194},{41,127,725},{41,127,725},{41,127,725},{34,103,1},{85,0,4418},{0,116,89},{0,116,89},{0,72,1130},{127,23,4418},{0,72,1130},{127,56,4325},{70,127,1625},{58,127,0},{0,124,61},{127,56,4325},{127,92,4325},{0,124,61},{0,104,4325},{127,92,4325},{0,104,4325},{17,0,2312},{17,0,2312},{17,0,2312},{17,0,2312},{0,103,0}, +{0,103,0},{0,103,0},{0,50,1},{0,40,872},{0,40,872},{41,127,65535},{19,127,37590},{9,127,10460},{6,127,4841},{38,127,65535},{11,127,31865},{0,127,65},{0,115,12842},{0,125,65535},{0,105,39522},{65,127,9918},{51,127,3500},{47,127,853},{35,121,436},{124,0,16034},{14,127,6273},{0,125,53},{0,98,7229},{127,62,16034},{0,98,7229},{26,127,5881},{26,127,5881},{26,127,5881},{19,117,2888},{15,127,6040},{0,125,37},{0,125,37}, +{0,75,986},{0,81,7565},{0,70,3318},{47,127,853},{47,127,853},{47,127,853},{38,107,1},{91,0,4418},{0,125,37},{0,125,37},{0,75,986},{127,29,4418},{0,75,986},{127,62,3613},{76,127,1345},{64,127,0},{0,127,1},{127,62,3613},{127,95,3613},{0,127,1},{0,106,3613},{127,95,3613},{0,106,3613},{19,0,2888},{19,0,2888},{19,0,2888},{19,0,2888},{0,115,0},{0,115,0},{0,115,0},{0,56,1},{0,46,1096}, +{0,46,1096},{41,127,65535},{22,127,39522},{12,127,12842},{7,127,6030},{38,127,65535},{11,127,31469},{0,127,65},{0,118,10460},{0,125,65535},{0,108,37590},{68,127,8954},{57,127,3318},{52,127,986},{40,123,258},{127,2,14504},{22,127,5594},{2,127,37},{0,101,5881},{127,66,14504},{0,101,5881},{29,127,7229},{29,127,7229},{29,127,7229},{21,122,3614},{17,127,6824},{1,127,53},{1,127,53},{0,80,853},{0,87,8059},{0,76,3500},{52,127,986}, +{52,127,986},{52,127,986},{42,112,1},{98,0,4418},{2,127,37},{2,127,37},{0,80,853},{127,36,4418},{0,80,853},{127,69,2888},{81,127,1096},{70,127,1},{11,127,0},{127,69,2888},{126,99,2888},{11,127,0},{0,108,2888},{126,99,2888},{0,108,2888},{21,0,3613},{21,0,3613},{21,0,3613},{21,0,3613},{0,127,1},{0,127,1},{0,127,1},{0,63,0},{0,51,1345},{0,51,1345},{41,127,65535},{22,127,41362},{12,127,15210}, +{8,127,7309},{41,127,65535},{11,127,31389},{1,127,309},{0,118,8476},{0,125,65535},{0,108,36134},{71,127,8174},{60,127,3194},{55,127,1130},{45,123,137},{127,10,13235},{28,127,5018},{11,127,89},{0,101,4809},{126,70,13235},{0,101,4809},{32,127,8537},{32,127,8537},{32,127,8537},{23,127,4326},{20,127,7700},{4,127,249},{4,127,249},{0,86,725},{0,93,8531},{0,81,3674},{55,127,1130},{55,127,1130},{55,127,1130},{46,116,1},{104,0,4418}, +{11,127,89},{11,127,89},{0,86,725},{127,42,4418},{0,86,725},{127,75,2312},{87,127,872},{76,127,1},{24,127,0},{127,75,2312},{126,102,2312},{24,127,0},{0,110,2312},{126,102,2312},{0,110,2312},{23,0,4325},{23,0,4325},{23,0,4325},{23,0,4325},{3,127,61},{3,127,61},{3,127,61},{0,69,0},{0,54,1625},{0,54,1625},{44,127,65535},{22,127,43458},{15,127,17822},{8,127,8829},{41,127,65535},{14,127,31497},{2,127,789}, +{0,118,6748},{0,125,65535},{0,108,34934},{77,127,7454},{64,127,3090},{61,127,1282},{50,125,53},{127,19,12051},{34,127,4506},{16,127,185},{0,104,3833},{127,74,12051},{0,104,3833},{35,127,9957},{35,127,9957},{35,127,9957},{25,127,5150},{23,127,8712},{5,127,621},{5,127,621},{0,89,617},{0,96,9035},{0,84,3870},{61,127,1282},{61,127,1282},{61,127,1282},{50,120,1},{110,0,4418},{16,127,185},{16,127,185},{0,89,617},{126,48,4418}, +{0,89,617},{127,81,1800},{90,127,676},{82,127,0},{36,127,0},{127,81,1800},{126,105,1800},{36,127,0},{0,112,1800},{126,105,1800},{0,112,1800},{25,0,5101},{25,0,5101},{25,0,5101},{25,0,5101},{3,127,205},{3,127,205},{3,127,205},{0,75,0},{0,60,1921},{0,60,1921},{44,127,65535},{22,127,45810},{15,127,20542},{10,127,10546},{41,127,65535},{14,127,31833},{2,127,1509},{0,120,5233},{0,125,65535},{0,113,33812},{79,127,6740}, +{70,127,3018},{65,127,1445},{54,126,9},{127,27,10952},{40,127,4058},{25,127,289},{0,107,2969},{126,78,10952},{0,107,2969},{38,127,11489},{38,127,11489},{38,127,11489},{28,127,6114},{26,127,9860},{8,127,1157},{8,127,1157},{0,95,505},{0,102,9555},{0,87,4114},{65,127,1445},{65,127,1445},{65,127,1445},{54,124,1},{115,1,4418},{25,127,289},{25,127,289},{0,95,505},{126,54,4418},{0,95,505},{127,87,1352},{96,127,500},{88,127,0}, +{48,127,0},{127,87,1352},{126,108,1352},{48,127,0},{0,114,1352},{126,108,1352},{0,114,1352},{27,0,5941},{27,0,5941},{27,0,5941},{27,0,5941},{6,127,433},{6,127,433},{6,127,433},{0,80,1},{0,64,2248},{0,64,2248},{44,127,65535},{25,127,48594},{17,127,23861},{11,127,12725},{41,127,65535},{14,127,32517},{3,127,2601},{0,121,3706},{0,126,65535},{0,113,32750},{82,127,6098},{73,127,2966},{71,127,1649},{59,127,4},{127,36,9818}, +{46,127,3638},{34,127,445},{0,110,2137},{127,82,9818},{0,110,2137},{41,127,13349},{41,127,13349},{41,127,13349},{31,127,7380},{29,127,11310},{11,127,1973},{11,127,1973},{0,101,405},{0,108,10181},{0,93,4410},{71,127,1649},{71,127,1649},{71,127,1649},{59,127,4},{122,0,4418},{34,127,445},{34,127,445},{0,101,405},{126,61,4418},{0,101,405},{127,93,925},{102,127,337},{95,127,0},{62,127,0},{127,93,925},{126,111,925},{62,127,0}, +{0,116,925},{126,111,925},{0,116,925},{29,0,6964},{29,0,6964},{29,0,6964},{29,0,6964},{9,127,808},{9,127,808},{9,127,808},{0,87,0},{0,70,2645},{0,70,2645},{44,127,65535},{25,127,51330},{17,127,27013},{11,127,14917},{41,127,65535},{14,127,33397},{4,127,3805},{0,121,2618},{1,126,65535},{0,113,32078},{88,127,5594},{79,127,2891},{74,127,1825},{64,127,45},{127,43,8901},{54,127,3373},{40,127,605},{0,115,1538},{127,86,8901}, +{0,115,1538},{44,127,15117},{44,127,15117},{44,127,15117},{34,127,8664},{32,127,12746},{14,127,2881},{14,127,2881},{0,104,317},{0,113,10694},{0,96,4714},{74,127,1825},{74,127,1825},{74,127,1825},{64,127,45},{127,2,4418},{40,127,605},{40,127,605},{0,104,317},{127,66,4418},{0,104,317},{127,99,613},{105,127,221},{101,127,0},{73,127,0},{127,99,613},{126,114,613},{73,127,0},{0,118,613},{126,114,613},{0,118,613},{31,0,7940}, +{31,0,7940},{31,0,7940},{31,0,7940},{9,127,1224},{9,127,1224},{9,127,1224},{0,93,0},{0,76,3029},{0,76,3029},{49,127,65535},{25,127,54322},{17,127,30421},{13,127,17348},{44,127,65535},{14,127,34533},{5,127,5245},{0,123,1705},{2,127,65535},{0,113,31662},{91,127,5146},{82,127,2950},{79,127,1994},{67,127,145},{127,53,8069},{60,127,3125},{46,127,797},{0,117,1025},{126,91,8069},{0,117,1025},{49,127,16984},{49,127,16984},{49,127,16984}, +{37,127,10100},{35,127,14318},{16,127,3981},{16,127,3981},{0,110,245},{0,119,11302},{0,102,5034},{79,127,1994},{79,127,1994},{79,127,1994},{67,127,145},{127,14,4418},{46,127,797},{46,127,797},{0,110,245},{127,72,4418},{0,110,245},{127,105,365},{111,127,136},{107,127,0},{86,127,0},{127,105,365},{126,117,365},{86,127,0},{0,120,365},{126,117,365},{0,120,365},{33,0,8980},{33,0,8980},{33,0,8980},{33,0,8980},{12,127,1732}, +{12,127,1732},{12,127,1732},{0,99,0},{0,81,3385},{0,81,3385},{49,127,65535},{28,127,54246},{20,127,31809},{16,127,18396},{49,127,65535},{19,127,34118},{8,127,6285},{3,124,1078},{2,127,65535},{0,116,27154},{94,127,4770},{86,127,2986},{82,127,2210},{73,127,281},{127,60,7322},{67,127,2945},{54,127,1037},{0,118,614},{127,94,7322},{0,118,614},{52,127,17772},{52,127,17772},{52,127,17772},{40,127,10764},{38,127,15150},{22,127,4785},{22,127,4785}, +{1,113,218},{0,125,10994},{0,105,4594},{82,127,2210},{82,127,2210},{82,127,2210},{73,127,281},{127,27,4418},{54,127,1037},{54,127,1037},{0,114,193},{126,78,4418},{0,114,193},{127,111,181},{116,127,65},{113,127,0},{98,127,0},{127,111,181},{126,120,181},{98,127,0},{0,122,181},{126,120,181},{0,122,181},{37,0,9248},{37,0,9248},{37,0,9248},{37,0,9248},{17,127,2009},{17,127,2009},{17,127,2009},{3,104,0},{0,87,3177}, +{0,87,3177},{52,127,65535},{34,127,52995},{26,127,32522},{21,127,19126},{49,127,65535},{22,127,32935},{13,127,7330},{7,125,605},{2,127,64493},{0,116,21205},{97,127,4436},{91,127,3044},{88,127,2440},{79,127,505},{127,69,6584},{73,127,2811},{63,127,1313},{0,121,292},{126,99,6584},{0,121,292},{55,127,18275},{55,127,18275},{55,127,18275},{46,127,11259},{44,127,15797},{28,127,5606},{28,127,5606},{6,118,217},{0,125,10589},{0,113,3809},{88,127,2440}, +{88,127,2440},{88,127,2440},{79,127,505},{127,40,4418},{63,127,1313},{63,127,1313},{0,118,128},{126,85,4418},{0,118,128},{127,119,50},{122,127,18},{119,127,1},{111,127,0},{127,119,50},{127,123,50},{111,127,0},{0,124,52},{127,123,50},{0,124,52},{41,0,9250},{41,0,9250},{41,0,9250},{41,0,9250},{20,127,2225},{20,127,2225},{20,127,2225},{8,108,1},{0,93,2741},{0,93,2741},{55,127,65535},{37,127,52035},{29,127,33226}, +{25,127,19751},{52,127,65535},{28,127,31983},{18,127,8346},{11,126,349},{2,127,60061},{0,119,16605},{100,127,4216},{97,127,3140},{94,127,2664},{84,127,776},{127,76,6019},{76,127,2779},{70,127,1586},{0,124,116},{126,103,6019},{0,124,116},{61,127,18739},{61,127,18739},{61,127,18739},{51,127,11794},{49,127,16315},{31,127,6398},{31,127,6398},{10,122,217},{2,127,10565},{0,116,3213},{94,127,2664},{94,127,2664},{94,127,2664},{84,127,776},{127,53,4418}, +{70,127,1586},{70,127,1586},{0,124,80},{126,91,4418},{0,124,80},{127,125,2},{127,126,2},{125,127,1},{124,127,0},{127,125,2},{127,126,2},{124,127,0},{0,126,4},{127,126,2},{0,126,4},{45,0,9250},{45,0,9250},{45,0,9250},{45,0,9250},{26,127,2441},{26,127,2441},{26,127,2441},{12,112,1},{0,102,2377},{0,102,2377},{58,127,65535},{40,127,49743},{35,127,32390},{28,127,19671},{55,127,65535},{31,127,30383},{22,127,8522}, +{15,126,198},{2,127,55505},{0,122,12609},{103,127,3648},{100,127,2776},{97,127,2384},{87,127,740},{127,83,5163},{84,127,2468},{73,127,1450},{0,127,16},{126,106,5163},{0,127,16},{65,127,18185},{65,127,18185},{65,127,18185},{54,127,11714},{52,127,15699},{37,127,6486},{37,127,6486},{14,124,126},{2,127,9785},{0,119,2501},{97,127,2384},{97,127,2384},{97,127,2384},{87,127,740},{127,60,3872},{73,127,1450},{73,127,1450},{0,126,13},{127,94,3872}, +{0,126,13},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{49,0,9250},{49,0,9250},{49,0,9250},{49,0,9250},{29,127,2665},{29,127,2665},{29,127,2665},{16,116,1},{0,108,2041},{0,108,2041},{61,127,65535},{46,127,47079},{38,127,31046},{33,127,19370},{58,127,65535},{34,127,28647},{25,127,8458},{19,126,78},{2,127,51393},{0,122,9105},{106,127,3012}, +{100,127,2296},{100,127,1972},{90,127,612},{127,86,4267},{87,127,2028},{76,127,1210},{5,127,0},{127,107,4267},{5,127,0},{65,127,17289},{65,127,17289},{65,127,17289},{57,127,11462},{55,127,14739},{40,127,6374},{40,127,6374},{18,125,50},{2,127,8937},{0,122,1881},{100,127,1972},{100,127,1972},{100,127,1972},{90,127,612},{127,66,3200},{76,127,1210},{76,127,1210},{5,127,0},{127,97,3200},{5,127,0},{127,127,0},{127,127,0},{127,127,0}, +{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{53,0,9250},{53,0,9250},{53,0,9250},{53,0,9250},{35,127,2897},{35,127,2897},{35,127,2897},{20,120,1},{0,116,1693},{0,116,1693},{65,127,65535},{48,127,44233},{41,127,29640},{37,127,18961},{61,127,65535},{40,127,26823},{30,127,8416},{24,127,9},{8,127,47133},{0,122,6081},{109,127,2377},{103,127,1809},{103,127,1553},{96,127,481},{127,90,3361}, +{90,127,1593},{84,127,953},{19,127,0},{127,109,3361},{19,127,0},{71,127,16331},{71,127,16331},{71,127,16331},{63,127,11212},{61,127,13721},{46,127,6266},{46,127,6266},{24,126,8},{5,127,8245},{0,125,1397},{103,127,1553},{103,127,1553},{103,127,1553},{96,127,481},{127,72,2521},{84,127,953},{84,127,953},{19,127,0},{127,100,2521},{19,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0}, +{0,127,0},{127,127,0},{0,127,0},{58,0,9248},{58,0,9248},{58,0,9248},{58,0,9248},{41,127,3181},{41,127,3181},{41,127,3181},{24,125,0},{0,125,1381},{0,125,1381},{65,127,65535},{51,127,41789},{44,127,28480},{40,127,18673},{65,127,65535},{43,127,25251},{34,127,8410},{28,127,4},{14,127,43557},{0,125,4005},{111,127,1843},{106,127,1421},{106,127,1225},{99,127,373},{127,95,2646},{96,127,1241},{90,127,745},{31,127,0},{127,111,2646}, +{31,127,0},{74,127,15539},{74,127,15539},{74,127,15539},{64,127,10979},{65,127,12914},{51,127,6216},{51,127,6216},{28,127,4},{11,127,7709},{0,126,1217},{106,127,1225},{106,127,1225},{106,127,1225},{99,127,373},{127,78,1985},{90,127,745},{90,127,745},{31,127,0},{127,103,1985},{31,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{62,0,9248}, +{62,0,9248},{62,0,9248},{62,0,9248},{44,127,3425},{44,127,3425},{44,127,3425},{28,127,4},{0,125,1205},{0,125,1205},{68,127,65535},{54,127,39465},{49,127,27209},{46,127,18393},{65,127,64563},{46,127,23799},{38,127,8426},{32,127,64},{14,127,40437},{0,125,2677},{111,127,1411},{111,127,1070},{109,127,937},{102,127,281},{127,99,2017},{99,127,937},{93,127,565},{43,127,0},{126,114,2017},{43,127,0},{77,127,14795},{77,127,14795},{77,127,14795}, +{70,127,10779},{68,127,12146},{54,127,6176},{54,127,6176},{34,127,52},{14,127,7281},{2,127,1213},{109,127,937},{109,127,937},{109,127,937},{102,127,281},{127,84,1513},{93,127,565},{93,127,565},{43,127,0},{127,106,1513},{43,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{65,0,9250},{65,0,9250},{65,0,9250},{65,0,9250},{49,127,3656}, +{49,127,3656},{49,127,3656},{34,127,52},{2,127,1213},{2,127,1213},{71,127,63180},{60,127,37225},{52,127,26137},{48,127,18128},{68,127,59595},{51,127,22636},{42,127,8480},{37,127,164},{22,127,37455},{0,126,2073},{114,127,1019},{111,127,766},{111,127,666},{105,127,205},{127,102,1473},{102,127,681},{99,127,405},{56,127,0},{127,115,1473},{56,127,0},{79,127,14066},{79,127,14066},{79,127,14066},{73,127,10571},{71,127,11450},{59,127,6166},{59,127,6166}, +{37,127,148},{25,127,6914},{5,127,1413},{111,127,666},{111,127,666},{111,127,666},{105,127,205},{127,90,1105},{99,127,405},{99,127,405},{56,127,0},{127,109,1105},{56,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{69,0,9250},{69,0,9250},{69,0,9250},{69,0,9250},{52,127,3940},{52,127,3940},{52,127,3940},{37,127,148},{5,127,1413}, +{5,127,1413}, +/**** ended inlining basisu_transcoder_tables_bc7_m5_color.inc ****/ + }; + + static dxt_selector_range g_etc1_to_bc7_m5a_selector_ranges[] = + { + { 0, 3 }, + { 1, 3 }, + { 0, 2 }, + { 1, 2 }, + { 2, 3 }, + { 0, 1 } + }; + + const uint32_t NUM_ETC1_TO_BC7_M5A_SELECTOR_RANGES = sizeof(g_etc1_to_bc7_m5a_selector_ranges) / sizeof(g_etc1_to_bc7_m5a_selector_ranges[0]); + + static uint32_t g_etc1_to_bc7_m5a_selector_range_index[4][4]; + + struct etc1_g_to_bc7_m5a_conversion + { + uint8_t m_lo, m_hi; + uint8_t m_trans; + }; + + static etc1_g_to_bc7_m5a_conversion g_etc1_g_to_bc7_m5a[8 * 32 * NUM_ETC1_TO_BC7_M5A_SELECTOR_RANGES] = + { +/**** start inlining basisu_transcoder_tables_bc7_m5_alpha.inc ****/ +{7,0,47},{7,0,44},{2,0,15},{2,0,12},{8,2,48},{0,0,0},{15,0,27},{15,1,24},{9,0,7},{15,1,24},{23,3,96},{6,0,3},{24,7,27},{24,7,24},{18,3,6},{18,5,4},{24,5,16},{21,1,6},{32,15,27},{32,15,24},{26,11,6},{26,13,4},{32,13,16},{22,3,1},{41,24,27},{41,24,24},{35,20,6},{35,22,4},{41,22,16},{31,12,1},{49,32,27}, +{49,32,24},{43,28,6},{43,30,4},{49,30,16},{39,20,1},{57,40,27},{57,40,24},{51,36,6},{51,38,4},{57,38,16},{47,28,1},{65,48,27},{65,48,24},{59,44,6},{59,46,4},{65,46,16},{55,36,1},{74,57,27},{74,57,24},{68,53,6},{68,55,4},{74,55,16},{64,45,1},{82,65,27},{82,65,24},{76,61,6},{76,63,4},{82,63,16},{72,53,1},{90,73,27},{90,73,24},{84,69,6}, +{84,71,4},{90,71,16},{80,61,1},{98,81,27},{98,81,24},{92,77,6},{92,79,4},{98,79,16},{88,69,1},{107,90,27},{107,90,24},{101,86,6},{101,88,4},{107,88,16},{97,78,1},{115,98,27},{115,98,24},{109,94,6},{109,96,4},{115,96,16},{105,86,1},{123,106,27},{123,106,24},{117,102,6},{117,104,4},{123,104,16},{113,94,1},{131,114,27},{131,114,24},{125,110,6},{125,112,4},{131,112,16}, +{121,102,1},{140,123,27},{140,123,24},{134,119,6},{134,121,4},{140,121,16},{130,111,1},{148,131,27},{148,131,24},{142,127,6},{142,129,4},{148,129,16},{138,119,1},{156,139,27},{156,139,24},{150,135,6},{150,137,4},{156,137,16},{146,127,1},{164,147,27},{164,147,24},{158,143,6},{158,145,4},{164,145,16},{154,135,1},{173,156,27},{173,156,24},{167,152,6},{167,154,4},{173,154,16},{163,144,1},{181,164,27}, +{181,164,24},{175,160,6},{175,162,4},{181,162,16},{171,152,1},{189,172,27},{189,172,24},{183,168,6},{183,170,4},{189,170,16},{179,160,1},{197,180,27},{197,180,24},{191,176,6},{191,178,4},{197,178,16},{187,168,1},{206,189,27},{206,189,24},{200,185,6},{200,187,4},{206,187,16},{196,177,1},{214,197,27},{214,197,24},{208,193,6},{208,195,4},{214,195,16},{204,185,1},{222,205,27},{222,205,24},{216,201,6}, +{216,203,4},{222,203,16},{212,193,1},{230,213,27},{230,213,24},{224,209,6},{224,211,4},{230,211,16},{220,201,1},{239,222,27},{239,222,24},{233,218,6},{233,220,4},{239,220,16},{229,210,1},{247,230,27},{247,230,24},{241,226,6},{241,228,4},{247,228,16},{237,218,1},{255,238,27},{255,238,24},{249,234,6},{249,236,4},{255,236,16},{245,226,1},{255,247,7},{255,248,4},{255,247,7},{255,248,4},{255,0,0}, +{253,234,1},{16,0,47},{16,0,44},{5,0,15},{5,0,12},{17,5,48},{0,0,0},{37,1,111},{36,2,108},{13,0,11},{13,3,12},{37,1,96},{3,0,3},{33,0,27},{33,0,24},{31,0,27},{31,1,24},{45,9,96},{11,0,3},{40,7,27},{41,8,24},{39,7,27},{29,0,4},{41,3,16},{19,1,2},{49,16,27},{50,17,24},{38,5,6},{38,6,4},{50,12,16},{40,4,6},{57,24,27}, +{58,25,24},{46,13,6},{46,14,4},{58,20,16},{36,0,1},{65,32,27},{66,33,24},{54,21,6},{54,22,4},{66,28,16},{44,6,1},{73,40,27},{74,41,24},{62,29,6},{62,30,4},{74,36,16},{52,14,1},{82,49,27},{83,50,24},{71,38,6},{71,39,4},{83,45,16},{61,23,1},{90,57,27},{91,58,24},{79,46,6},{79,47,4},{91,53,16},{69,31,1},{98,65,27},{99,66,24},{87,54,6}, +{87,55,4},{99,61,16},{77,39,1},{106,73,27},{107,74,24},{95,62,6},{95,63,4},{107,69,16},{85,47,1},{115,82,27},{116,83,24},{104,71,6},{104,72,4},{116,78,16},{94,56,1},{123,90,27},{124,91,24},{112,79,6},{112,80,4},{124,86,16},{102,64,1},{131,98,27},{132,99,24},{120,87,6},{120,88,4},{132,94,16},{110,72,1},{139,106,27},{140,107,24},{128,95,6},{128,96,4},{140,102,16}, +{118,80,1},{148,115,27},{149,116,24},{137,104,6},{137,105,4},{149,111,16},{127,89,1},{156,123,27},{157,124,24},{145,112,6},{145,113,4},{157,119,16},{135,97,1},{164,131,27},{165,132,24},{153,120,6},{153,121,4},{165,127,16},{143,105,1},{172,139,27},{173,140,24},{161,128,6},{161,129,4},{173,135,16},{151,113,1},{181,148,27},{182,149,24},{170,137,6},{170,138,4},{182,144,16},{160,122,1},{189,156,27}, +{190,157,24},{178,145,6},{178,146,4},{190,152,16},{168,130,1},{197,164,27},{198,165,24},{186,153,6},{186,154,4},{198,160,16},{176,138,1},{205,172,27},{206,173,24},{194,161,6},{194,162,4},{206,168,16},{184,146,1},{214,181,27},{215,182,24},{203,170,6},{203,171,4},{215,177,16},{193,155,1},{222,189,27},{223,190,24},{211,178,6},{211,179,4},{223,185,16},{201,163,1},{230,197,27},{231,198,24},{219,186,6}, +{219,187,4},{231,193,16},{209,171,1},{238,205,27},{239,206,24},{227,194,6},{227,195,4},{239,201,16},{217,179,1},{247,214,27},{248,215,24},{236,203,6},{236,204,4},{248,210,16},{226,188,1},{255,222,27},{255,222,24},{244,211,6},{244,212,4},{255,220,16},{234,196,1},{254,218,6},{255,242,28},{252,219,6},{252,220,4},{255,245,16},{242,204,1},{255,238,7},{255,239,4},{255,238,7},{255,239,4},{255,0,0}, +{250,212,1},{28,0,47},{28,0,44},{9,0,15},{9,0,12},{29,9,48},{0,0,0},{53,0,111},{53,0,108},{17,0,15},{17,0,12},{37,7,32},{0,0,0},{66,3,111},{63,7,108},{25,0,11},{25,7,12},{65,5,96},{7,0,3},{51,0,27},{71,15,108},{47,0,27},{33,6,8},{73,13,96},{15,0,3},{61,4,27},{80,24,108},{61,4,27},{60,6,24},{62,0,16},{24,4,3},{69,12,27}, +{88,32,108},{69,12,27},{68,14,24},{70,8,16},{32,2,2},{77,20,27},{96,40,108},{58,2,6},{58,2,4},{78,16,16},{60,0,6},{85,28,27},{104,48,108},{66,10,6},{66,10,4},{86,24,16},{68,8,6},{94,37,27},{113,57,108},{75,19,6},{75,19,4},{95,33,16},{77,17,6},{102,45,27},{121,65,108},{83,27,6},{83,27,4},{103,41,16},{65,3,1},{110,53,27},{129,73,108},{91,35,6}, +{91,35,4},{111,49,16},{73,11,1},{118,61,27},{137,81,108},{99,43,6},{99,43,4},{119,57,16},{81,19,1},{127,70,27},{146,90,108},{108,52,6},{108,52,4},{128,66,16},{90,28,1},{135,78,27},{154,98,108},{116,60,6},{116,60,4},{136,74,16},{98,36,1},{143,86,27},{162,106,108},{124,68,6},{124,68,4},{144,82,16},{106,44,1},{151,94,27},{170,114,108},{132,76,6},{132,76,4},{152,90,16}, +{114,52,1},{160,103,27},{179,123,108},{141,85,6},{141,85,4},{161,99,16},{123,61,1},{168,111,27},{187,131,108},{149,93,6},{149,93,4},{169,107,16},{131,69,1},{176,119,27},{195,139,108},{157,101,6},{157,101,4},{177,115,16},{139,77,1},{184,127,27},{203,147,108},{165,109,6},{165,109,4},{185,123,16},{147,85,1},{193,136,27},{212,156,108},{174,118,6},{174,118,4},{194,132,16},{156,94,1},{201,144,27}, +{220,164,108},{182,126,6},{182,126,4},{202,140,16},{164,102,1},{209,152,27},{228,172,108},{190,134,6},{190,134,4},{210,148,16},{172,110,1},{217,160,27},{236,180,108},{198,142,6},{198,142,4},{218,156,16},{180,118,1},{226,169,27},{245,189,108},{207,151,6},{207,151,4},{227,165,16},{189,127,1},{234,177,27},{253,197,108},{215,159,6},{215,159,4},{235,173,16},{197,135,1},{242,185,27},{243,186,24},{223,167,6}, +{223,167,4},{243,181,16},{205,143,1},{250,193,27},{251,194,24},{231,175,6},{231,175,4},{251,189,16},{213,151,1},{255,203,27},{255,206,24},{240,184,6},{240,184,4},{255,208,16},{222,160,1},{251,188,6},{255,230,28},{248,192,6},{248,192,4},{255,233,16},{230,168,1},{255,200,6},{255,202,4},{255,200,6},{255,202,4},{255,0,0},{238,176,1},{255,226,7},{255,227,4},{255,226,7},{255,227,4},{255,0,0}, +{246,184,1},{41,0,47},{41,0,44},{13,0,15},{13,0,12},{42,13,48},{0,0,0},{71,0,111},{71,0,108},{21,0,15},{21,0,12},{50,7,32},{0,0,0},{86,1,111},{85,2,108},{29,1,15},{29,3,12},{87,0,96},{3,0,3},{96,6,111},{93,10,108},{37,0,11},{37,11,12},{95,8,96},{11,0,3},{71,0,27},{102,19,108},{68,0,27},{46,7,8},{104,17,96},{20,0,3},{82,0,27}, +{110,27,108},{81,0,27},{80,2,24},{112,25,96},{28,0,3},{91,7,27},{118,35,108},{91,7,27},{88,10,24},{91,2,16},{36,7,3},{99,15,27},{126,43,108},{99,15,27},{96,18,24},{99,10,16},{44,1,2},{108,24,27},{135,52,108},{108,24,27},{79,0,4},{108,19,16},{53,10,2},{116,32,27},{143,60,108},{87,5,6},{87,7,4},{116,27,16},{90,3,6},{124,40,27},{151,68,108},{95,13,6}, +{95,15,4},{124,35,16},{98,11,6},{132,48,27},{159,76,108},{103,21,6},{103,23,4},{132,43,16},{106,19,6},{141,57,27},{168,85,108},{112,30,6},{112,32,4},{141,52,16},{115,28,6},{149,65,27},{176,93,108},{120,38,6},{120,40,4},{149,60,16},{94,5,1},{157,73,27},{184,101,108},{128,46,6},{128,48,4},{157,68,16},{102,13,1},{165,81,27},{192,109,108},{136,54,6},{136,56,4},{165,76,16}, +{110,21,1},{174,90,27},{201,118,108},{145,63,6},{145,65,4},{174,85,16},{119,30,1},{182,98,27},{209,126,108},{153,71,6},{153,73,4},{182,93,16},{127,38,1},{190,106,27},{217,134,108},{161,79,6},{161,81,4},{190,101,16},{135,46,1},{198,114,27},{225,142,108},{169,87,6},{169,89,4},{198,109,16},{143,54,1},{207,123,27},{234,151,108},{178,96,6},{178,98,4},{207,118,16},{152,63,1},{215,131,27}, +{242,159,108},{186,104,6},{186,106,4},{215,126,16},{160,71,1},{223,139,27},{250,167,108},{194,112,6},{194,114,4},{223,134,16},{168,79,1},{231,147,27},{231,147,24},{202,120,6},{202,122,4},{231,142,16},{176,87,1},{240,156,27},{240,156,24},{211,129,6},{211,131,4},{240,151,16},{185,96,1},{248,164,27},{248,164,24},{219,137,6},{219,139,4},{248,159,16},{193,104,1},{254,173,27},{255,174,24},{227,145,6}, +{227,147,4},{255,169,16},{201,112,1},{255,182,27},{255,187,24},{235,153,6},{235,155,4},{255,193,16},{209,120,1},{249,159,6},{255,218,28},{244,162,6},{244,164,4},{255,220,16},{218,129,1},{254,169,6},{254,168,4},{252,170,6},{252,172,4},{255,245,16},{226,137,1},{255,184,6},{255,190,4},{255,184,6},{255,190,4},{255,0,0},{234,145,1},{255,213,7},{255,214,4},{255,213,7},{255,214,4},{255,0,0}, +{242,153,1},{59,0,47},{59,0,44},{18,0,15},{18,0,12},{60,18,48},{0,0,0},{69,0,47},{68,2,44},{26,0,15},{26,0,12},{68,5,32},{0,0,0},{111,0,111},{111,0,108},{34,0,15},{34,0,12},{76,13,32},{0,0,0},{123,3,111},{122,5,108},{42,3,15},{42,6,12},{125,1,96},{6,0,3},{135,8,111},{131,14,108},{50,0,11},{51,15,12},{134,10,96},{15,0,3},{95,0,27}, +{139,22,108},{59,2,11},{59,5,8},{142,18,96},{23,0,3},{105,0,27},{147,30,108},{99,0,27},{67,13,8},{150,26,96},{31,0,3},{115,0,27},{155,38,108},{113,1,27},{110,4,24},{158,34,96},{39,0,3},{125,7,27},{164,47,108},{125,7,27},{119,13,24},{167,43,96},{48,6,3},{133,15,27},{172,55,108},{133,15,27},{127,21,24},{134,5,16},{56,14,3},{141,23,27},{180,63,108},{141,23,27}, +{135,29,24},{142,13,16},{64,1,2},{149,31,27},{188,71,108},{149,31,27},{143,37,24},{150,21,16},{72,9,2},{158,40,27},{197,80,108},{118,1,6},{117,6,4},{159,30,16},{120,0,6},{166,48,27},{205,88,108},{126,9,6},{125,14,4},{167,38,16},{130,6,6},{174,56,27},{213,96,108},{134,17,6},{133,22,4},{175,46,16},{138,14,6},{182,64,27},{221,104,108},{142,25,6},{141,30,4},{183,54,16}, +{146,22,6},{191,73,27},{230,113,108},{151,34,6},{150,39,4},{192,63,16},{155,31,6},{199,81,27},{238,121,108},{159,42,6},{158,47,4},{200,71,16},{163,39,6},{207,89,27},{246,129,108},{167,50,6},{166,55,4},{208,79,16},{130,1,1},{215,97,27},{254,137,108},{175,58,6},{174,63,4},{216,87,16},{138,9,1},{224,106,27},{224,106,24},{184,67,6},{183,72,4},{225,96,16},{147,18,1},{232,114,27}, +{232,114,24},{192,75,6},{191,80,4},{233,104,16},{155,26,1},{240,122,27},{240,122,24},{200,83,6},{199,88,4},{241,112,16},{163,34,1},{248,130,27},{248,130,24},{208,91,6},{207,96,4},{249,120,16},{171,42,1},{255,140,27},{254,142,24},{217,100,6},{216,105,4},{255,135,16},{180,51,1},{255,149,27},{255,156,24},{225,108,6},{224,113,4},{255,159,16},{188,59,1},{255,159,27},{253,196,28},{233,116,6}, +{232,121,4},{255,184,16},{196,67,1},{247,120,6},{255,205,28},{241,124,6},{240,129,4},{255,208,16},{204,75,1},{252,132,6},{252,132,4},{250,133,6},{249,138,4},{255,236,16},{213,84,1},{255,144,6},{255,150,4},{255,144,6},{255,150,4},{255,0,0},{221,92,1},{254,185,7},{255,175,4},{253,187,7},{255,175,4},{255,0,0},{229,100,1},{255,196,7},{255,199,4},{255,196,7},{255,199,4},{255,0,0}, +{237,108,1},{80,0,47},{80,0,44},{24,0,15},{24,0,12},{80,24,48},{0,0,0},{88,1,47},{88,1,44},{32,0,15},{32,0,12},{88,4,32},{0,0,0},{138,0,111},{138,0,108},{40,0,15},{40,0,12},{96,12,32},{0,0,0},{153,0,111},{153,0,108},{48,0,15},{48,0,12},{104,20,32},{0,0,0},{166,4,111},{164,8,108},{57,4,15},{57,9,12},{167,3,96},{9,0,3},{176,9,111}, +{172,16,108},{65,0,11},{65,17,12},{175,11,96},{17,0,3},{189,13,111},{180,24,108},{73,0,11},{73,1,8},{183,19,96},{25,0,3},{129,0,27},{188,32,108},{83,2,11},{81,9,8},{191,27,96},{33,0,3},{141,0,27},{197,41,108},{132,0,27},{90,18,8},{200,36,96},{42,0,3},{151,0,27},{205,49,108},{148,0,27},{145,3,24},{208,44,96},{50,0,3},{160,3,27},{213,57,108},{160,3,27}, +{153,11,24},{216,52,96},{58,2,3},{168,11,27},{221,65,108},{168,11,27},{161,19,24},{170,0,16},{66,10,3},{177,20,27},{230,74,108},{177,20,27},{170,28,24},{179,7,16},{75,19,3},{185,28,27},{238,82,108},{185,28,27},{178,36,24},{187,15,16},{83,0,2},{193,36,27},{246,90,108},{193,36,27},{186,44,24},{195,23,16},{91,7,2},{201,44,27},{254,98,108},{201,44,27},{147,0,4},{203,31,16}, +{99,15,2},{210,53,27},{211,54,24},{157,1,6},{156,9,4},{212,40,16},{108,24,2},{218,61,27},{219,62,24},{165,9,6},{164,17,4},{220,48,16},{170,6,6},{226,69,27},{227,70,24},{173,17,6},{172,25,4},{228,56,16},{178,14,6},{234,77,27},{235,78,24},{181,25,6},{180,33,4},{236,64,16},{186,22,6},{243,86,27},{244,87,24},{190,34,6},{189,42,4},{245,73,16},{195,31,6},{251,94,27}, +{252,95,24},{198,42,6},{197,50,4},{253,81,16},{203,39,6},{255,104,27},{255,107,24},{206,50,6},{205,58,4},{255,102,16},{211,47,6},{255,113,27},{255,123,24},{214,58,6},{213,66,4},{255,126,16},{219,55,6},{255,126,27},{253,172,28},{223,67,6},{222,75,4},{255,153,16},{174,2,1},{242,66,6},{254,182,28},{231,75,6},{230,83,4},{255,178,16},{182,10,1},{246,79,6},{255,190,28},{239,83,6}, +{238,91,4},{255,202,16},{190,18,1},{251,89,6},{251,88,4},{247,91,6},{246,99,4},{255,227,16},{198,26,1},{255,102,6},{255,108,4},{255,102,6},{255,108,4},{255,0,0},{207,35,1},{255,117,6},{255,132,4},{255,117,6},{255,132,4},{255,0,0},{215,43,1},{254,167,7},{255,156,4},{254,167,7},{255,156,4},{255,0,0},{223,51,1},{255,175,7},{255,181,4},{255,175,7},{255,181,4},{255,0,0}, +{231,59,1},{105,0,47},{105,0,44},{33,0,15},{33,0,12},{106,33,48},{0,0,0},{115,0,47},{114,2,44},{41,0,15},{41,0,12},{114,5,32},{0,0,0},{123,2,47},{124,3,44},{49,0,15},{49,0,12},{122,13,32},{0,0,0},{190,0,111},{190,0,108},{57,0,15},{57,0,12},{130,21,32},{0,0,0},{205,0,111},{205,0,108},{66,0,15},{66,0,12},{139,30,32},{0,0,0},{217,4,111}, +{215,7,108},{74,4,15},{74,8,12},{218,3,96},{8,0,3},{229,8,111},{223,15,108},{80,0,11},{82,16,12},{226,11,96},{16,0,3},{237,13,111},{231,23,108},{89,0,11},{90,24,12},{234,19,96},{24,0,3},{251,17,111},{240,32,108},{99,0,11},{99,1,8},{243,28,96},{33,0,3},{169,0,27},{248,40,108},{108,2,11},{107,9,8},{251,36,96},{41,0,3},{181,0,27},{254,49,108},{166,0,27}, +{115,17,8},{188,79,32},{49,0,3},{190,0,27},{255,59,108},{181,0,27},{123,25,8},{196,87,32},{57,0,3},{203,0,27},{203,0,24},{197,0,27},{196,2,24},{205,96,32},{66,0,3},{213,1,27},{212,3,24},{211,2,27},{204,10,24},{213,104,32},{74,1,3},{221,9,27},{220,11,24},{219,10,27},{212,18,24},{221,0,16},{82,9,3},{229,17,27},{228,19,24},{227,18,27},{220,26,24},{229,5,16}, +{90,17,3},{238,26,27},{237,28,24},{236,27,27},{229,35,24},{238,14,16},{99,26,3},{246,34,27},{245,36,24},{244,35,27},{237,43,24},{246,22,16},{107,34,3},{254,42,27},{253,44,24},{252,43,27},{245,51,24},{254,30,16},{115,6,2},{255,52,27},{255,58,24},{255,52,27},{253,59,24},{255,53,16},{123,14,2},{255,64,27},{255,74,24},{196,0,6},{198,100,8},{255,80,16},{132,23,2},{255,74,27}, +{255,89,24},{206,1,6},{206,4,4},{255,105,16},{140,31,2},{255,86,27},{253,147,28},{215,7,6},{214,12,4},{255,129,16},{219,4,6},{255,95,27},{255,155,28},{223,15,6},{222,20,4},{255,153,16},{227,12,6},{242,17,6},{255,166,28},{232,24,6},{231,29,4},{255,181,16},{236,21,6},{247,26,6},{255,175,28},{240,32,6},{239,37,4},{255,205,16},{244,29,6},{251,38,6},{251,37,4},{248,40,6}, +{247,45,4},{255,230,16},{252,37,6},{255,50,6},{255,53,4},{255,50,6},{255,53,4},{255,0,0},{189,80,2},{255,65,6},{255,80,4},{255,65,6},{255,80,4},{255,0,0},{198,89,2},{252,131,7},{255,105,4},{252,131,7},{255,105,4},{255,0,0},{206,97,2},{254,139,7},{255,129,4},{253,141,7},{255,129,4},{255,0,0},{214,105,2},{255,150,7},{255,153,4},{255,150,7},{255,153,4},{255,0,0}, +{222,0,1},{181,0,47},{178,0,44},{47,0,15},{47,0,12},{183,47,48},{0,0,0},{190,0,47},{190,0,44},{55,0,15},{55,0,12},{191,55,48},{0,0,0},{199,0,47},{199,0,44},{63,0,15},{63,0,12},{199,63,48},{0,0,0},{207,0,47},{207,1,44},{71,0,15},{71,0,12},{207,4,32},{0,0,0},{216,1,47},{218,3,44},{80,0,15},{80,0,12},{216,13,32},{0,0,0},{225,1,47}, +{227,6,44},{88,0,15},{88,0,12},{224,21,32},{0,0,0},{233,2,47},{235,11,44},{96,1,15},{96,2,12},{232,29,32},{2,0,3},{241,4,47},{243,19,44},{104,5,15},{104,10,12},{240,37,32},{10,0,3},{251,5,47},{252,28,44},{113,9,15},{113,19,12},{249,46,32},{19,0,3},{255,9,47},{255,37,44},{117,0,11},{121,27,12},{255,55,32},{27,0,3},{255,9,47},{255,46,44},{126,0,11}, +{129,35,12},{255,67,32},{35,0,3},{248,0,27},{255,55,44},{137,0,11},{137,43,12},{255,79,32},{43,0,3},{250,0,27},{255,64,44},{147,2,11},{146,6,8},{255,93,32},{52,0,3},{251,0,27},{255,73,44},{155,4,11},{154,14,8},{255,104,32},{60,0,3},{253,0,27},{248,0,24},{233,0,27},{162,22,8},{255,116,32},{68,0,3},{254,0,27},{254,0,24},{248,0,27},{170,30,8},{255,128,32}, +{76,0,3},{255,1,27},{255,7,24},{255,1,27},{179,39,8},{255,22,16},{85,0,3},{255,2,27},{255,22,24},{255,7,27},{187,47,8},{255,47,16},{93,0,3},{255,4,27},{251,100,28},{182,0,7},{195,55,8},{255,71,16},{101,0,3},{255,4,27},{253,108,28},{191,0,7},{203,63,8},{255,95,16},{109,0,3},{255,7,27},{255,118,28},{200,0,7},{212,72,8},{255,123,16},{118,0,3},{246,0,7}, +{255,129,28},{209,0,7},{220,80,8},{255,147,16},{126,0,3},{246,0,7},{255,138,28},{218,0,7},{228,88,8},{255,172,16},{134,0,3},{249,3,7},{245,91,8},{228,3,7},{236,96,8},{255,196,16},{142,6,3},{251,14,7},{250,102,8},{237,12,7},{245,105,8},{255,223,16},{151,15,3},{253,22,7},{254,112,8},{245,20,7},{253,113,8},{255,248,16},{159,23,3},{253,31,7},{255,124,8},{249,28,7}, +{255,124,8},{255,0,0},{167,31,3},{254,39,7},{255,10,4},{252,37,7},{255,10,4},{255,0,0},{175,39,3},{255,48,7},{255,38,4},{254,48,7},{255,38,4},{255,0,0},{184,48,3},{255,56,7},{255,62,4},{255,56,7},{255,62,4},{255,0,0},{192,56,3},{255,65,7},{255,86,4},{255,65,7},{255,86,4},{255,0,0},{200,64,3},{255,74,7},{255,111,4},{255,77,7},{255,111,4},{255,0,0}, +{208,5,2}, +/**** ended inlining basisu_transcoder_tables_bc7_m5_alpha.inc ****/ + }; + + static inline uint32_t set_block_bits(uint8_t* pBytes, uint32_t val, uint32_t num_bits, uint32_t cur_ofs) + { + assert(num_bits < 32); + assert(val < (1ULL << num_bits)); + + uint32_t mask = static_cast((1ULL << num_bits) - 1); + + while (num_bits) + { + const uint32_t n = basisu::minimum(8 - (cur_ofs & 7), num_bits); + + pBytes[cur_ofs >> 3] &= ~static_cast(mask << (cur_ofs & 7)); + pBytes[cur_ofs >> 3] |= static_cast(val << (cur_ofs & 7)); + + val >>= n; + mask >>= n; + + num_bits -= n; + cur_ofs += n; + } + + return cur_ofs; + } + + struct bc7_mode_5 + { + union + { + struct + { + uint64_t m_mode : 6; + uint64_t m_rot : 2; + + uint64_t m_r0 : 7; + uint64_t m_r1 : 7; + uint64_t m_g0 : 7; + uint64_t m_g1 : 7; + uint64_t m_b0 : 7; + uint64_t m_b1 : 7; + uint64_t m_a0 : 8; + uint64_t m_a1_0 : 6; + + } m_lo; + + uint64_t m_lo_bits; + }; + + union + { + struct + { + uint64_t m_a1_1 : 2; + + // bit 2 + uint64_t m_c00 : 1; + uint64_t m_c10 : 2; + uint64_t m_c20 : 2; + uint64_t m_c30 : 2; + + uint64_t m_c01 : 2; + uint64_t m_c11 : 2; + uint64_t m_c21 : 2; + uint64_t m_c31 : 2; + + uint64_t m_c02 : 2; + uint64_t m_c12 : 2; + uint64_t m_c22 : 2; + uint64_t m_c32 : 2; + + uint64_t m_c03 : 2; + uint64_t m_c13 : 2; + uint64_t m_c23 : 2; + uint64_t m_c33 : 2; + + // bit 33 + uint64_t m_a00 : 1; + uint64_t m_a10 : 2; + uint64_t m_a20 : 2; + uint64_t m_a30 : 2; + + uint64_t m_a01 : 2; + uint64_t m_a11 : 2; + uint64_t m_a21 : 2; + uint64_t m_a31 : 2; + + uint64_t m_a02 : 2; + uint64_t m_a12 : 2; + uint64_t m_a22 : 2; + uint64_t m_a32 : 2; + + uint64_t m_a03 : 2; + uint64_t m_a13 : 2; + uint64_t m_a23 : 2; + uint64_t m_a33 : 2; + + } m_hi; + + uint64_t m_hi_bits; + }; + }; + +#if BASISD_WRITE_NEW_BC7_MODE5_TABLES + static void create_etc1_to_bc7_m5_color_conversion_table() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_bc7_m5_color.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1_to_bc7_m5_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1_to_bc7_m5_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 127; hi++) + { + for (uint32_t lo = 0; lo <= 127; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 1) | (lo >> 6); + colors[3] = (hi << 1) | (hi >> 6); + + colors[1] = (colors[0] * (64 - 21) + colors[3] * 21 + 32) / 64; + colors[2] = (colors[0] * (64 - 43) + colors[3] * 43 + 32) / 64; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1_to_bc7_m5_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); + } + + static void create_etc1_to_bc7_m5_alpha_conversion_table() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_bc7_m5_alpha.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1_TO_BC7_M5A_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1_to_bc7_m5a_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1_to_bc7_m5a_selector_ranges[sr].m_high; + + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + uint32_t best_output_selectors = 0; + + for (uint32_t hi = 0; hi <= 255; hi++) + { + for (uint32_t lo = 0; lo <= 255; lo++) + { + uint32_t colors[4]; + + colors[0] = lo; + colors[3] = hi; + + colors[1] = (colors[0] * (64 - 21) + colors[3] * 21 + 32) / 64; + colors[2] = (colors[0] * (64 - 43) + colors[3] * 43 + 32) / 64; + + uint64_t total_err = 0; + uint32_t output_selectors = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int best_mapping_err = INT_MAX; + int best_k = 0; + for (int k = 0; k < 4; k++) + { + int mapping_err = block_colors[s].g - colors[k]; + mapping_err *= mapping_err; + + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + mapping_err *= 5; + + if (mapping_err < best_mapping_err) + { + best_mapping_err = mapping_err; + best_k = k; + } + } // k + + total_err += best_mapping_err; + output_selectors |= (best_k << (s * 2)); + } // s + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + best_output_selectors = output_selectors; + } + + } // lo + } // hi + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, best_output_selectors); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + + } // sr + } // g + } // inten + + fclose(pFile); + } +#endif // BASISD_WRITE_NEW_BC7_MODE5_TABLES + + struct bc7_m5_match_entry + { + uint8_t m_hi; + uint8_t m_lo; + }; + + static bc7_m5_match_entry g_bc7_m5_equals_1[256] = + { + {0,0},{1,0},{3,0},{4,0},{6,0},{7,0},{9,0},{10,0},{12,0},{13,0},{15,0},{16,0},{18,0},{20,0},{21,0},{23,0}, + {24,0},{26,0},{27,0},{29,0},{30,0},{32,0},{33,0},{35,0},{36,0},{38,0},{39,0},{41,0},{42,0},{44,0},{45,0},{47,0}, + {48,0},{50,0},{52,0},{53,0},{55,0},{56,0},{58,0},{59,0},{61,0},{62,0},{64,0},{65,0},{66,0},{68,0},{69,0},{71,0}, + {72,0},{74,0},{75,0},{77,0},{78,0},{80,0},{82,0},{83,0},{85,0},{86,0},{88,0},{89,0},{91,0},{92,0},{94,0},{95,0}, + {97,0},{98,0},{100,0},{101,0},{103,0},{104,0},{106,0},{107,0},{109,0},{110,0},{112,0},{114,0},{115,0},{117,0},{118,0},{120,0}, + {121,0},{123,0},{124,0},{126,0},{127,0},{127,1},{126,2},{126,3},{127,3},{127,4},{126,5},{126,6},{127,6},{127,7},{126,8},{126,9}, + {127,9},{127,10},{126,11},{126,12},{127,12},{127,13},{126,14},{125,15},{127,15},{126,16},{126,17},{127,17},{127,18},{126,19},{126,20},{127,20}, + {127,21},{126,22},{126,23},{127,23},{127,24},{126,25},{126,26},{127,26},{127,27},{126,28},{126,29},{127,29},{127,30},{126,31},{126,32},{127,32}, + {127,33},{126,34},{126,35},{127,35},{127,36},{126,37},{126,38},{127,38},{127,39},{126,40},{126,41},{127,41},{127,42},{126,43},{126,44},{127,44}, + {127,45},{126,46},{125,47},{127,47},{126,48},{126,49},{127,49},{127,50},{126,51},{126,52},{127,52},{127,53},{126,54},{126,55},{127,55},{127,56}, + {126,57},{126,58},{127,58},{127,59},{126,60},{126,61},{127,61},{127,62},{126,63},{125,64},{126,64},{126,65},{127,65},{127,66},{126,67},{126,68}, + {127,68},{127,69},{126,70},{126,71},{127,71},{127,72},{126,73},{126,74},{127,74},{127,75},{126,76},{125,77},{127,77},{126,78},{126,79},{127,79}, + {127,80},{126,81},{126,82},{127,82},{127,83},{126,84},{126,85},{127,85},{127,86},{126,87},{126,88},{127,88},{127,89},{126,90},{126,91},{127,91}, + {127,92},{126,93},{126,94},{127,94},{127,95},{126,96},{126,97},{127,97},{127,98},{126,99},{126,100},{127,100},{127,101},{126,102},{126,103},{127,103}, + {127,104},{126,105},{126,106},{127,106},{127,107},{126,108},{125,109},{127,109},{126,110},{126,111},{127,111},{127,112},{126,113},{126,114},{127,114},{127,115}, + {126,116},{126,117},{127,117},{127,118},{126,119},{126,120},{127,120},{127,121},{126,122},{126,123},{127,123},{127,124},{126,125},{126,126},{127,126},{127,127} + }; + + static void transcoder_init_bc7_mode5() + { +#if 0 + // This is a little too much work to do at init time, so precompute it. + for (int i = 0; i < 256; i++) + { + int lowest_e = 256; + for (int lo = 0; lo < 128; lo++) + { + for (int hi = 0; hi < 128; hi++) + { + const int lo_e = (lo << 1) | (lo >> 6); + const int hi_e = (hi << 1) | (hi >> 6); + + // Selector 1 + int v = (lo_e * (64 - 21) + hi_e * 21 + 32) >> 6; + int e = abs(v - i); + + if (e < lowest_e) + { + g_bc7_m5_equals_1[i].m_hi = static_cast(hi); + g_bc7_m5_equals_1[i].m_lo = static_cast(lo); + + lowest_e = e; + } + + } // hi + + } // lo + + printf("{%u,%u},", g_bc7_m5_equals_1[i].m_hi, g_bc7_m5_equals_1[i].m_lo); + if ((i & 15) == 15) printf("\n"); + } +#endif + + for (uint32_t i = 0; i < NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES; i++) + { + uint32_t l = g_etc1_to_bc7_m5_selector_ranges[i].m_low; + uint32_t h = g_etc1_to_bc7_m5_selector_ranges[i].m_high; + g_etc1_to_bc7_m5_selector_range_index[l][h] = i; + } + + for (uint32_t i = 0; i < NUM_ETC1_TO_BC7_M5A_SELECTOR_RANGES; i++) + { + uint32_t l = g_etc1_to_bc7_m5a_selector_ranges[i].m_low; + uint32_t h = g_etc1_to_bc7_m5a_selector_ranges[i].m_high; + g_etc1_to_bc7_m5a_selector_range_index[l][h] = i; + } + } + + static void convert_etc1s_to_bc7_m5_color(void* pDst, const endpoint* pEndpoints, const selector* pSelector) + { + bc7_mode_5* pDst_block = static_cast(pDst); + + // First ensure the block is cleared to all 0's + static_cast(pDst)[0] = 0; + static_cast(pDst)[1] = 0; + + // Set alpha to 255 + pDst_block->m_lo.m_mode = 1 << 5; + pDst_block->m_lo.m_a0 = 255; + pDst_block->m_lo.m_a1_0 = 63; + pDst_block->m_hi.m_a1_1 = 3; + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const uint32_t base_color_r = pEndpoints->m_color5.r; + const uint32_t base_color_g = pEndpoints->m_color5.g; + const uint32_t base_color_b = pEndpoints->m_color5.b; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (pSelector->m_num_unique_selectors == 1) + { + // Solid color block - use precomputed tables and set selectors to 1. + uint32_t r, g, b; + decoder_etc_block::get_block_color5(pEndpoints->m_color5, inten_table, low_selector, r, g, b); + + pDst_block->m_lo.m_r0 = g_bc7_m5_equals_1[r].m_lo; + pDst_block->m_lo.m_g0 = g_bc7_m5_equals_1[g].m_lo; + pDst_block->m_lo.m_b0 = g_bc7_m5_equals_1[b].m_lo; + + pDst_block->m_lo.m_r1 = g_bc7_m5_equals_1[r].m_hi; + pDst_block->m_lo.m_g1 = g_bc7_m5_equals_1[g].m_hi; + pDst_block->m_lo.m_b1 = g_bc7_m5_equals_1[b].m_hi; + + set_block_bits((uint8_t*)pDst, 0x2aaaaaab, 31, 66); + return; + } + else if (pSelector->m_num_unique_selectors == 2) + { + // Only one or two unique selectors, so just switch to block truncation coding (BTC) to avoid quality issues on extreme blocks. + color32 block_colors[4]; + + decoder_etc_block::get_block_colors5(block_colors, color32(base_color_r, base_color_g, base_color_b, 255), inten_table); + + const uint32_t r0 = block_colors[low_selector].r; + const uint32_t g0 = block_colors[low_selector].g; + const uint32_t b0 = block_colors[low_selector].b; + + const uint32_t r1 = block_colors[high_selector].r; + const uint32_t g1 = block_colors[high_selector].g; + const uint32_t b1 = block_colors[high_selector].b; + + pDst_block->m_lo.m_r0 = r0 >> 1; + pDst_block->m_lo.m_g0 = g0 >> 1; + pDst_block->m_lo.m_b0 = b0 >> 1; + + pDst_block->m_lo.m_r1 = r1 >> 1; + pDst_block->m_lo.m_g1 = g1 >> 1; + pDst_block->m_lo.m_b1 = b1 >> 1; + + uint32_t output_low_selector = 0, output_bit_offset = 0, output_bits = 0; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + uint32_t os = (s == low_selector) ? output_low_selector : (3 ^ output_low_selector); + + uint32_t num_bits = 2; + + if ((x | y) == 0) + { + if (os & 2) + { + pDst_block->m_lo.m_r0 = r1 >> 1; + pDst_block->m_lo.m_g0 = g1 >> 1; + pDst_block->m_lo.m_b0 = b1 >> 1; + + pDst_block->m_lo.m_r1 = r0 >> 1; + pDst_block->m_lo.m_g1 = g0 >> 1; + pDst_block->m_lo.m_b1 = b0 >> 1; + + output_low_selector = 3; + os = 0; + } + + num_bits = 1; + } + + output_bits |= (os << output_bit_offset); + output_bit_offset += num_bits; + } + } + + set_block_bits((uint8_t*)pDst, output_bits, 31, 66); + return; + } + + const uint32_t selector_range_table = g_etc1_to_bc7_m5_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_bc7_m5_solution* pTable_r = &g_etc1_to_bc7_m5_color[(inten_table * 32 + base_color_r) * (NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS]; + const etc1_to_bc7_m5_solution* pTable_g = &g_etc1_to_bc7_m5_color[(inten_table * 32 + base_color_g) * (NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS]; + const etc1_to_bc7_m5_solution* pTable_b = &g_etc1_to_bc7_m5_color[(inten_table * 32 + base_color_b) * (NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS]; + + uint32_t best_err = UINT_MAX; + uint32_t best_mapping = 0; + + assert(NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS == 10); +#define DO_ITER(m) { uint32_t total_err = pTable_r[m].m_err + pTable_g[m].m_err + pTable_b[m].m_err; if (total_err < best_err) { best_err = total_err; best_mapping = m; } } + DO_ITER(0); DO_ITER(1); DO_ITER(2); DO_ITER(3); DO_ITER(4); + DO_ITER(5); DO_ITER(6); DO_ITER(7); DO_ITER(8); DO_ITER(9); +#undef DO_ITER + + const uint8_t* pSelectors_xlat = &g_etc1_to_bc7_m5_selector_mappings[best_mapping][0]; + + uint32_t s_inv = 0; + if (pSelectors_xlat[pSelector->get_selector(0, 0)] & 2) + { + pDst_block->m_lo.m_r0 = pTable_r[best_mapping].m_hi; + pDst_block->m_lo.m_g0 = pTable_g[best_mapping].m_hi; + pDst_block->m_lo.m_b0 = pTable_b[best_mapping].m_hi; + + pDst_block->m_lo.m_r1 = pTable_r[best_mapping].m_lo; + pDst_block->m_lo.m_g1 = pTable_g[best_mapping].m_lo; + pDst_block->m_lo.m_b1 = pTable_b[best_mapping].m_lo; + + s_inv = 3; + } + else + { + pDst_block->m_lo.m_r0 = pTable_r[best_mapping].m_lo; + pDst_block->m_lo.m_g0 = pTable_g[best_mapping].m_lo; + pDst_block->m_lo.m_b0 = pTable_b[best_mapping].m_lo; + + pDst_block->m_lo.m_r1 = pTable_r[best_mapping].m_hi; + pDst_block->m_lo.m_g1 = pTable_g[best_mapping].m_hi; + pDst_block->m_lo.m_b1 = pTable_b[best_mapping].m_hi; + } + + uint32_t output_bits = 0, output_bit_ofs = 0; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t s = pSelector->get_selector(x, y); + + const uint32_t os = pSelectors_xlat[s] ^ s_inv; + + output_bits |= (os << output_bit_ofs); + + output_bit_ofs += (((x | y) == 0) ? 1 : 2); + } + } + + set_block_bits((uint8_t*)pDst, output_bits, 31, 66); + } + + static void convert_etc1s_to_bc7_m5_alpha(void* pDst, const endpoint* pEndpoints, const selector* pSelector) + { + bc7_mode_5* pDst_block = static_cast(pDst); + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const uint32_t base_color_r = pEndpoints->m_color5.r; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (pSelector->m_num_unique_selectors == 1) + { + uint32_t r; + decoder_etc_block::get_block_color5_r(pEndpoints->m_color5, inten_table, low_selector, r); + + pDst_block->m_lo.m_a0 = r; + pDst_block->m_lo.m_a1_0 = r & 63; + pDst_block->m_hi.m_a1_1 = r >> 6; + + return; + } + else if (pSelector->m_num_unique_selectors == 2) + { + // Only one or two unique selectors, so just switch to block truncation coding (BTC) to avoid quality issues on extreme blocks. + int block_colors[4]; + + decoder_etc_block::get_block_colors5_g(block_colors, pEndpoints->m_color5, inten_table); + + pDst_block->m_lo.m_a0 = block_colors[low_selector]; + pDst_block->m_lo.m_a1_0 = block_colors[high_selector] & 63; + pDst_block->m_hi.m_a1_1 = block_colors[high_selector] >> 6; + + uint32_t output_low_selector = 0, output_bit_offset = 0, output_bits = 0; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t s = pSelector->get_selector(x, y); + uint32_t os = (s == low_selector) ? output_low_selector : (3 ^ output_low_selector); + + uint32_t num_bits = 2; + + if ((x | y) == 0) + { + if (os & 2) + { + pDst_block->m_lo.m_a0 = block_colors[high_selector]; + pDst_block->m_lo.m_a1_0 = block_colors[low_selector] & 63; + pDst_block->m_hi.m_a1_1 = block_colors[low_selector] >> 6; + + output_low_selector = 3; + os = 0; + } + + num_bits = 1; + } + + output_bits |= (os << output_bit_offset); + output_bit_offset += num_bits; + } + } + + set_block_bits((uint8_t*)pDst, output_bits, 31, 97); + return; + } + + const uint32_t selector_range_table = g_etc1_to_bc7_m5a_selector_range_index[low_selector][high_selector]; + + const etc1_g_to_bc7_m5a_conversion* pTable = &g_etc1_g_to_bc7_m5a[inten_table * (32 * NUM_ETC1_TO_BC7_M5A_SELECTOR_RANGES) + base_color_r * NUM_ETC1_TO_BC7_M5A_SELECTOR_RANGES + selector_range_table]; + + pDst_block->m_lo.m_a0 = pTable->m_lo; + pDst_block->m_lo.m_a1_0 = pTable->m_hi & 63; + pDst_block->m_hi.m_a1_1 = pTable->m_hi >> 6; + + uint32_t output_bit_offset = 0, output_bits = 0, selector_trans = pTable->m_trans; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t s = pSelector->get_selector(x, y); + uint32_t os = (selector_trans >> (s * 2)) & 3; + + uint32_t num_bits = 2; + + if ((x | y) == 0) + { + if (os & 2) + { + pDst_block->m_lo.m_a0 = pTable->m_hi; + pDst_block->m_lo.m_a1_0 = pTable->m_lo & 63; + pDst_block->m_hi.m_a1_1 = pTable->m_lo >> 6; + + selector_trans ^= 0xFF; + os ^= 3; + } + + num_bits = 1; + } + + output_bits |= (os << output_bit_offset); + output_bit_offset += num_bits; + } + } + + set_block_bits((uint8_t*)pDst, output_bits, 31, 97); + } +#endif // BASISD_SUPPORT_BC7_MODE5 + +#if BASISD_SUPPORT_ETC2_EAC_A8 || BASISD_SUPPORT_UASTC + static const uint8_t g_etc2_eac_a8_sel4[6] = { 0x92, 0x49, 0x24, 0x92, 0x49, 0x24 }; +#endif + +#if BASISD_SUPPORT_ETC2_EAC_A8 + static void convert_etc1s_to_etc2_eac_a8(eac_block* pDst_block, const endpoint* pEndpoints, const selector* pSelector) + { + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (low_selector == high_selector) + { + uint32_t r; + decoder_etc_block::get_block_color5_r(base_color, inten_table, low_selector, r); + + // Constant alpha block + // Select table 13, use selector 4 (0), set multiplier to 1 and base color g + pDst_block->m_base = r; + pDst_block->m_table = 13; + pDst_block->m_multiplier = 1; + + // selectors are all 4's + memcpy(pDst_block->m_selectors, g_etc2_eac_a8_sel4, sizeof(g_etc2_eac_a8_sel4)); + + return; + } + + uint32_t selector_range_table = 0; + for (selector_range_table = 0; selector_range_table < NUM_ETC2_EAC_SELECTOR_RANGES; selector_range_table++) + if ((low_selector == s_etc2_eac_selector_ranges[selector_range_table].m_low) && (high_selector == s_etc2_eac_selector_ranges[selector_range_table].m_high)) + break; + if (selector_range_table >= NUM_ETC2_EAC_SELECTOR_RANGES) + selector_range_table = 0; + + const etc1_g_to_eac_conversion* pTable_entry = &s_etc1_g_to_etc2_a8[base_color.r + inten_table * 32][selector_range_table]; + + pDst_block->m_base = pTable_entry->m_base; + pDst_block->m_table = pTable_entry->m_table_mul >> 4; + pDst_block->m_multiplier = pTable_entry->m_table_mul & 15; + + uint64_t selector_bits = 0; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + + uint32_t ds = (pTable_entry->m_trans >> (s * 3)) & 7; + + const uint32_t dst_ofs = 45 - (y + x * 4) * 3; + selector_bits |= (static_cast(ds) << dst_ofs); + } + } + + pDst_block->set_selector_bits(selector_bits); + } +#endif // BASISD_SUPPORT_ETC2_EAC_A8 + +#if BASISD_SUPPORT_ETC2_EAC_RG11 + static const etc1_g_to_eac_conversion s_etc1_g_to_etc2_r11[32 * 8][NUM_ETC2_EAC_SELECTOR_RANGES] = + { + {{0,1,3328},{0,1,3328},{0,16,457},{0,16,456}}, + {{0,226,3936},{0,226,3936},{0,17,424},{8,0,472}}, + {{6,178,4012},{6,178,4008},{0,146,501},{16,0,472}}, + {{14,178,4012},{14,178,4008},{8,146,501},{24,0,472}}, + {{23,178,4012},{23,178,4008},{17,146,501},{33,0,472}}, + {{31,178,4012},{31,178,4008},{25,146,501},{41,0,472}}, + {{39,178,4012},{39,178,4008},{33,146,501},{49,0,472}}, + {{47,178,4012},{47,178,4008},{41,146,501},{27,228,496}}, + {{56,178,4012},{56,178,4008},{50,146,501},{36,228,496}}, + {{64,178,4012},{64,178,4008},{58,146,501},{44,228,496}}, + {{72,178,4012},{72,178,4008},{66,146,501},{52,228,496}}, + {{80,178,4012},{80,178,4008},{74,146,501},{60,228,496}}, + {{89,178,4012},{89,178,4008},{83,146,501},{69,228,496}}, + {{97,178,4012},{97,178,4008},{91,146,501},{77,228,496}}, + {{105,178,4012},{105,178,4008},{99,146,501},{85,228,496}}, + {{113,178,4012},{113,178,4008},{107,146,501},{93,228,496}}, + {{122,178,4012},{122,178,4008},{116,146,501},{102,228,496}}, + {{130,178,4012},{130,178,4008},{124,146,501},{110,228,496}}, + {{138,178,4012},{138,178,4008},{132,146,501},{118,228,496}}, + {{146,178,4012},{146,178,4008},{140,146,501},{126,228,496}}, + {{155,178,4012},{155,178,4008},{149,146,501},{135,228,496}}, + {{163,178,4012},{163,178,4008},{157,146,501},{143,228,496}}, + {{171,178,4012},{171,178,4008},{165,146,501},{151,228,496}}, + {{179,178,4012},{179,178,4008},{173,146,501},{159,228,496}}, + {{188,178,4012},{188,178,4008},{182,146,501},{168,228,496}}, + {{196,178,4012},{196,178,4008},{190,146,501},{176,228,496}}, + {{204,178,4012},{204,178,4008},{198,146,501},{184,228,496}}, + {{212,178,4012},{212,178,4008},{206,146,501},{192,228,496}}, + {{221,178,4012},{221,178,4008},{215,146,501},{201,228,496}}, + {{229,178,4012},{229,178,4008},{223,146,501},{209,228,496}}, + {{235,66,4012},{221,100,4008},{231,146,501},{217,228,496}}, + {{211,102,4085},{254,32,4040},{211,102,501},{254,32,456}}, + {{0,2,3328},{0,2,3328},{0,1,320},{0,1,320}}, + {{7,162,3905},{7,162,3904},{0,17,480},{0,17,480}}, + {{15,162,3906},{15,162,3904},{1,117,352},{1,117,352}}, + {{23,162,3906},{23,162,3904},{5,34,500},{4,53,424}}, + {{32,162,3906},{32,162,3904},{14,34,500},{3,69,424}}, + {{40,162,3906},{40,162,3904},{22,34,500},{1,133,496}}, + {{48,162,3906},{48,162,3904},{30,34,500},{4,85,496}}, + {{56,162,3906},{56,162,3904},{38,34,500},{12,85,496}}, + {{65,162,3906},{65,162,3904},{47,34,500},{1,106,424}}, + {{73,162,3906},{73,162,3904},{55,34,500},{9,106,424}}, + {{81,162,3906},{81,162,3904},{63,34,500},{7,234,496}}, + {{89,162,3906},{89,162,3904},{71,34,500},{15,234,496}}, + {{98,162,3906},{98,162,3904},{80,34,500},{24,234,496}}, + {{106,162,3906},{106,162,3904},{88,34,500},{32,234,496}}, + {{114,162,3906},{114,162,3904},{96,34,500},{40,234,496}}, + {{122,162,3906},{122,162,3904},{104,34,500},{48,234,496}}, + {{131,162,3906},{131,162,3904},{113,34,500},{57,234,496}}, + {{139,162,3906},{139,162,3904},{121,34,500},{65,234,496}}, + {{147,162,3906},{147,162,3904},{129,34,500},{73,234,496}}, + {{155,162,3906},{155,162,3904},{137,34,500},{81,234,496}}, + {{164,162,3906},{164,162,3904},{146,34,500},{90,234,496}}, + {{172,162,3906},{172,162,3904},{154,34,500},{98,234,496}}, + {{180,162,3906},{180,162,3904},{162,34,500},{106,234,496}}, + {{188,162,3906},{188,162,3904},{170,34,500},{114,234,496}}, + {{197,162,3906},{197,162,3904},{179,34,500},{123,234,496}}, + {{205,162,3906},{205,162,3904},{187,34,500},{131,234,496}}, + {{213,162,3906},{213,162,3904},{195,34,500},{139,234,496}}, + {{221,162,3906},{221,162,3904},{203,34,500},{147,234,496}}, + {{230,162,3906},{230,162,3904},{212,34,500},{156,234,496}}, + {{238,162,3906},{174,106,4008},{220,34,500},{164,234,496}}, + {{240,178,4001},{182,106,4008},{228,34,500},{172,234,496}}, + {{166,108,4085},{115,31,4080},{166,108,501},{115,31,496}}, + {{1,68,3328},{1,68,3328},{0,1,384},{0,1,384}}, + {{1,51,3968},{1,51,3968},{0,2,384},{0,2,384}}, + {{21,18,3851},{21,18,3848},{1,50,488},{1,50,488}}, + {{26,195,3851},{29,18,3848},{0,67,488},{0,67,488}}, + {{35,195,3851},{38,18,3848},{12,115,488},{0,3,496}}, + {{43,195,3851},{46,18,3848},{20,115,488},{2,6,424}}, + {{51,195,3851},{54,18,3848},{36,66,482},{4,22,424}}, + {{59,195,3851},{62,18,3848},{44,66,482},{3,73,424}}, + {{68,195,3851},{71,18,3848},{53,66,482},{3,22,496}}, + {{76,195,3851},{79,18,3848},{61,66,482},{2,137,496}}, + {{84,195,3851},{87,18,3848},{69,66,482},{1,89,496}}, + {{92,195,3851},{95,18,3848},{77,66,482},{9,89,496}}, + {{101,195,3851},{104,18,3848},{86,66,482},{18,89,496}}, + {{109,195,3851},{112,18,3848},{94,66,482},{26,89,496}}, + {{117,195,3851},{120,18,3848},{102,66,482},{34,89,496}}, + {{125,195,3851},{128,18,3848},{110,66,482},{42,89,496}}, + {{134,195,3851},{137,18,3848},{119,66,482},{51,89,496}}, + {{141,195,3907},{145,18,3848},{127,66,482},{59,89,496}}, + {{149,195,3907},{153,18,3848},{135,66,482},{67,89,496}}, + {{157,195,3907},{161,18,3848},{143,66,482},{75,89,496}}, + {{166,195,3907},{170,18,3848},{152,66,482},{84,89,496}}, + {{174,195,3907},{178,18,3848},{160,66,482},{92,89,496}}, + {{182,195,3907},{186,18,3848},{168,66,482},{100,89,496}}, + {{190,195,3907},{194,18,3848},{176,66,482},{108,89,496}}, + {{199,195,3907},{203,18,3848},{185,66,482},{117,89,496}}, + {{207,195,3907},{211,18,3848},{193,66,482},{125,89,496}}, + {{215,195,3907},{219,18,3848},{201,66,482},{133,89,496}}, + {{223,195,3907},{227,18,3848},{209,66,482},{141,89,496}}, + {{232,195,3907},{168,89,4008},{218,66,482},{150,89,496}}, + {{236,18,3907},{176,89,4008},{226,66,482},{158,89,496}}, + {{158,90,4085},{103,31,4080},{158,90,501},{103,31,496}}, + {{166,90,4085},{111,31,4080},{166,90,501},{111,31,496}}, + {{0,70,3328},{0,70,3328},{0,17,448},{0,17,448}}, + {{0,117,3904},{0,117,3904},{0,35,384},{0,35,384}}, + {{13,165,3905},{13,165,3904},{2,211,480},{2,211,480}}, + {{21,165,3906},{21,165,3904},{1,51,488},{1,51,488}}, + {{30,165,3906},{30,165,3904},{7,61,352},{7,61,352}}, + {{38,165,3906},{38,165,3904},{2,125,352},{2,125,352}}, + {{46,165,3906},{46,165,3904},{1,37,500},{10,125,352}}, + {{54,165,3906},{54,165,3904},{9,37,500},{5,61,424}}, + {{63,165,3906},{63,165,3904},{18,37,500},{1,189,424}}, + {{71,165,3906},{71,165,3904},{26,37,500},{9,189,424}}, + {{79,165,3906},{79,165,3904},{34,37,500},{4,77,424}}, + {{87,165,3906},{87,165,3904},{42,37,500},{12,77,424}}, + {{96,165,3906},{96,165,3904},{51,37,500},{8,93,424}}, + {{104,165,3906},{104,165,3904},{59,37,500},{3,141,496}}, + {{112,165,3906},{112,165,3904},{68,37,500},{11,141,496}}, + {{120,165,3906},{120,165,3904},{76,37,500},{6,93,496}}, + {{129,165,3906},{129,165,3904},{85,37,500},{15,93,496}}, + {{70,254,4012},{137,165,3904},{93,37,500},{23,93,496}}, + {{145,165,3906},{145,165,3904},{101,37,500},{31,93,496}}, + {{86,254,4012},{153,165,3904},{109,37,500},{39,93,496}}, + {{163,165,3906},{162,165,3904},{118,37,500},{48,93,496}}, + {{171,165,3906},{170,165,3904},{126,37,500},{56,93,496}}, + {{179,165,3906},{178,165,3904},{134,37,500},{64,93,496}}, + {{187,165,3906},{187,165,3904},{142,37,500},{72,93,496}}, + {{196,165,3906},{196,165,3904},{151,37,500},{81,93,496}}, + {{204,165,3906},{204,165,3904},{159,37,500},{89,93,496}}, + {{212,165,3906},{136,77,4008},{167,37,500},{97,93,496}}, + {{220,165,3906},{131,93,4008},{175,37,500},{105,93,496}}, + {{214,181,4001},{140,93,4008},{184,37,500},{114,93,496}}, + {{222,181,4001},{148,93,4008},{192,37,500},{122,93,496}}, + {{115,95,4085},{99,31,4080},{115,95,501},{99,31,496}}, + {{123,95,4085},{107,31,4080},{123,95,501},{107,31,496}}, + {{0,102,3840},{0,102,3840},{0,18,384},{0,18,384}}, + {{5,167,3904},{5,167,3904},{0,13,256},{0,13,256}}, + {{4,54,3968},{4,54,3968},{1,67,448},{1,67,448}}, + {{30,198,3850},{30,198,3848},{0,3,480},{0,3,480}}, + {{39,198,3850},{39,198,3848},{3,52,488},{3,52,488}}, + {{47,198,3851},{47,198,3848},{3,4,488},{3,4,488}}, + {{55,198,3851},{55,198,3848},{1,70,488},{1,70,488}}, + {{53,167,3906},{63,198,3848},{3,22,488},{3,22,488}}, + {{62,167,3906},{72,198,3848},{24,118,488},{0,6,496}}, + {{70,167,3906},{80,198,3848},{32,118,488},{2,89,488}}, + {{78,167,3906},{88,198,3848},{40,118,488},{1,73,496}}, + {{86,167,3906},{96,198,3848},{48,118,488},{0,28,424}}, + {{95,167,3906},{105,198,3848},{57,118,488},{9,28,424}}, + {{103,167,3906},{113,198,3848},{65,118,488},{5,108,496}}, + {{111,167,3906},{121,198,3848},{73,118,488},{13,108,496}}, + {{119,167,3906},{129,198,3848},{81,118,488},{21,108,496}}, + {{128,167,3906},{138,198,3848},{90,118,488},{6,28,496}}, + {{136,167,3906},{146,198,3848},{98,118,488},{14,28,496}}, + {{145,167,3906},{154,198,3848},{106,118,488},{22,28,496}}, + {{153,167,3906},{162,198,3848},{114,118,488},{30,28,496}}, + {{162,167,3906},{171,198,3848},{123,118,488},{39,28,496}}, + {{170,167,3906},{179,198,3848},{131,118,488},{47,28,496}}, + {{178,167,3906},{187,198,3848},{139,118,488},{55,28,496}}, + {{186,167,3906},{195,198,3848},{147,118,488},{63,28,496}}, + {{194,167,3906},{120,12,4008},{156,118,488},{72,28,496}}, + {{206,198,3907},{116,28,4008},{164,118,488},{80,28,496}}, + {{214,198,3907},{124,28,4008},{172,118,488},{88,28,496}}, + {{222,198,3395},{132,28,4008},{180,118,488},{96,28,496}}, + {{207,134,4001},{141,28,4008},{189,118,488},{105,28,496}}, + {{95,30,4085},{86,31,4080},{95,30,501},{86,31,496}}, + {{103,30,4085},{94,31,4080},{103,30,501},{94,31,496}}, + {{111,30,4085},{102,31,4080},{111,30,501},{102,31,496}}, + {{0,104,3840},{0,104,3840},{0,18,448},{0,18,448}}, + {{4,39,3904},{4,39,3904},{0,4,384},{0,4,384}}, + {{0,56,3968},{0,56,3968},{0,84,448},{0,84,448}}, + {{6,110,3328},{6,110,3328},{0,20,448},{0,20,448}}, + {{41,200,3850},{41,200,3848},{1,4,480},{1,4,480}}, + {{49,200,3850},{49,200,3848},{1,8,416},{1,8,416}}, + {{57,200,3851},{57,200,3848},{1,38,488},{1,38,488}}, + {{65,200,3851},{65,200,3848},{1,120,488},{1,120,488}}, + {{74,200,3851},{74,200,3848},{2,72,488},{2,72,488}}, + {{68,6,3907},{82,200,3848},{2,24,488},{2,24,488}}, + {{77,6,3907},{90,200,3848},{26,120,488},{10,24,488}}, + {{97,63,3330},{98,200,3848},{34,120,488},{2,8,496}}, + {{106,63,3330},{107,200,3848},{43,120,488},{3,92,488}}, + {{114,63,3330},{115,200,3848},{51,120,488},{11,92,488}}, + {{122,63,3330},{123,200,3848},{59,120,488},{7,76,496}}, + {{130,63,3330},{131,200,3848},{67,120,488},{15,76,496}}, + {{139,63,3330},{140,200,3848},{76,120,488},{24,76,496}}, + {{147,63,3330},{148,200,3848},{84,120,488},{32,76,496}}, + {{155,63,3330},{156,200,3848},{92,120,488},{40,76,496}}, + {{164,63,3330},{164,200,3848},{100,120,488},{48,76,496}}, + {{173,63,3330},{173,200,3848},{109,120,488},{57,76,496}}, + {{184,6,3851},{181,200,3848},{117,120,488},{65,76,496}}, + {{192,6,3851},{133,28,3936},{125,120,488},{73,76,496}}, + {{189,200,3907},{141,28,3936},{133,120,488},{81,76,496}}, + {{198,200,3907},{138,108,4000},{142,120,488},{90,76,496}}, + {{206,200,3907},{146,108,4000},{150,120,488},{98,76,496}}, + {{214,200,3395},{154,108,4000},{158,120,488},{106,76,496}}, + {{190,136,4001},{162,108,4000},{166,120,488},{114,76,496}}, + {{123,30,4076},{87,15,4080},{123,30,492},{87,15,496}}, + {{117,110,4084},{80,31,4080},{117,110,500},{80,31,496}}, + {{125,110,4084},{88,31,4080},{125,110,500},{88,31,496}}, + {{133,110,4084},{96,31,4080},{133,110,500},{96,31,496}}, + {{9,56,3904},{9,56,3904},{0,67,448},{0,67,448}}, + {{1,8,3904},{1,8,3904},{1,84,448},{1,84,448}}, + {{1,124,3904},{1,124,3904},{0,39,384},{0,39,384}}, + {{9,124,3904},{9,124,3904},{1,4,448},{1,4,448}}, + {{6,76,3904},{6,76,3904},{0,70,448},{0,70,448}}, + {{62,6,3859},{62,6,3856},{2,38,480},{2,38,480}}, + {{70,6,3859},{70,6,3856},{5,43,416},{5,43,416}}, + {{78,6,3859},{78,6,3856},{2,11,416},{2,11,416}}, + {{87,6,3859},{87,6,3856},{0,171,488},{0,171,488}}, + {{67,8,3906},{95,6,3856},{8,171,488},{8,171,488}}, + {{75,8,3907},{103,6,3856},{5,123,488},{5,123,488}}, + {{83,8,3907},{111,6,3856},{2,75,488},{2,75,488}}, + {{92,8,3907},{120,6,3856},{0,27,488},{0,27,488}}, + {{100,8,3907},{128,6,3856},{8,27,488},{8,27,488}}, + {{120,106,3843},{136,6,3856},{99,6,387},{16,27,488}}, + {{128,106,3843},{144,6,3856},{107,6,387},{2,11,496}}, + {{137,106,3843},{153,6,3856},{117,6,387},{11,11,496}}, + {{145,106,3843},{161,6,3856},{125,6,387},{19,11,496}}, + {{163,8,3851},{137,43,3904},{133,6,387},{27,11,496}}, + {{171,8,3851},{145,43,3904},{141,6,387},{35,11,496}}, + {{180,8,3851},{110,11,4000},{150,6,387},{44,11,496}}, + {{188,8,3851},{118,11,4000},{158,6,387},{52,11,496}}, + {{172,72,3907},{126,11,4000},{166,6,387},{60,11,496}}, + {{174,6,3971},{134,11,4000},{174,6,387},{68,11,496}}, + {{183,6,3971},{143,11,4000},{183,6,387},{77,11,496}}, + {{191,6,3971},{151,11,4000},{191,6,387},{85,11,496}}, + {{199,6,3971},{159,11,4000},{199,6,387},{93,11,496}}, + {{92,12,4084},{69,15,4080},{92,12,500},{69,15,496}}, + {{101,12,4084},{78,15,4080},{101,12,500},{78,15,496}}, + {{110,12,4084},{86,15,4080},{110,12,500},{86,15,496}}, + {{118,12,4084},{79,31,4080},{118,12,500},{79,31,496}}, + {{126,12,4084},{87,31,4080},{126,12,500},{87,31,496}}, + {{71,8,3602},{71,8,3600},{2,21,384},{2,21,384}}, + {{79,8,3611},{79,8,3608},{0,69,448},{0,69,448}}, + {{87,8,3611},{87,8,3608},{0,23,384},{0,23,384}}, + {{95,8,3611},{95,8,3608},{1,5,448},{1,5,448}}, + {{104,8,3611},{104,8,3608},{0,88,448},{0,88,448}}, + {{112,8,3611},{112,8,3608},{0,72,448},{0,72,448}}, + {{120,8,3611},{121,8,3608},{36,21,458},{36,21,456}}, + {{133,47,3091},{129,8,3608},{44,21,458},{44,21,456}}, + {{142,47,3091},{138,8,3608},{53,21,459},{53,21,456}}, + {{98,12,3850},{98,12,3848},{61,21,459},{61,21,456}}, + {{106,12,3850},{106,12,3848},{10,92,480},{69,21,456}}, + {{114,12,3851},{114,12,3848},{18,92,480},{77,21,456}}, + {{123,12,3851},{123,12,3848},{3,44,488},{86,21,456}}, + {{95,12,3906},{95,12,3904},{11,44,488},{94,21,456}}, + {{103,12,3906},{103,12,3904},{19,44,488},{102,21,456}}, + {{111,12,3907},{111,12,3904},{27,44,489},{110,21,456}}, + {{120,12,3907},{120,12,3904},{36,44,489},{119,21,456}}, + {{128,12,3907},{128,12,3904},{44,44,489},{127,21,456}}, + {{136,12,3907},{136,12,3904},{52,44,489},{135,21,456}}, + {{144,12,3907},{144,12,3904},{60,44,490},{144,21,456}}, + {{153,12,3907},{153,12,3904},{69,44,490},{153,21,456}}, + {{161,12,3395},{149,188,3968},{77,44,490},{161,21,456}}, + {{169,12,3395},{199,21,3928},{85,44,490},{169,21,456}}, + {{113,95,4001},{202,69,3992},{125,8,483},{177,21,456}}, + {{122,95,4001},{201,21,3984},{134,8,483},{186,21,456}}, + {{143,8,4067},{209,21,3984},{142,8,483},{194,21,456}}, + {{151,8,4067},{47,15,4080},{151,8,483},{47,15,496}}, + {{159,8,4067},{55,15,4080},{159,8,483},{55,15,496}}, + {{168,8,4067},{64,15,4080},{168,8,483},{64,15,496}}, + {{160,40,4075},{72,15,4080},{160,40,491},{72,15,496}}, + {{168,40,4075},{80,15,4080},{168,40,491},{80,15,496}}, + {{144,8,4082},{88,15,4080},{144,8,498},{88,15,496}}, + }; + + static void convert_etc1s_to_etc2_eac_r11(eac_block* pDst_block, const endpoint* pEndpoints, const selector* pSelector) + { + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (low_selector == high_selector) + { + uint32_t r; + decoder_etc_block::get_block_color5_r(base_color, inten_table, low_selector, r); + + // Constant alpha block + // Select table 13, use selector 4 (0), set multiplier to 1 and base color r + pDst_block->m_base = r; + pDst_block->m_table = 13; + pDst_block->m_multiplier = 1; + + // selectors are all 4's + static const uint8_t s_etc2_eac_r11_sel4[6] = { 0x92, 0x49, 0x24, 0x92, 0x49, 0x24 }; + memcpy(pDst_block->m_selectors, s_etc2_eac_r11_sel4, sizeof(s_etc2_eac_r11_sel4)); + + return; + } + + uint32_t selector_range_table = 0; + for (selector_range_table = 0; selector_range_table < NUM_ETC2_EAC_SELECTOR_RANGES; selector_range_table++) + if ((low_selector == s_etc2_eac_selector_ranges[selector_range_table].m_low) && (high_selector == s_etc2_eac_selector_ranges[selector_range_table].m_high)) + break; + if (selector_range_table >= NUM_ETC2_EAC_SELECTOR_RANGES) + selector_range_table = 0; + + const etc1_g_to_eac_conversion* pTable_entry = &s_etc1_g_to_etc2_r11[base_color.r + inten_table * 32][selector_range_table]; + + pDst_block->m_base = pTable_entry->m_base; + pDst_block->m_table = pTable_entry->m_table_mul >> 4; + pDst_block->m_multiplier = pTable_entry->m_table_mul & 15; + + uint64_t selector_bits = 0; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + + uint32_t ds = (pTable_entry->m_trans >> (s * 3)) & 7; + + const uint32_t dst_ofs = 45 - (y + x * 4) * 3; + selector_bits |= (static_cast(ds) << dst_ofs); + } + } + + pDst_block->set_selector_bits(selector_bits); + } +#endif // BASISD_SUPPORT_ETC2_EAC_RG11 + +// ASTC + struct etc1_to_astc_solution + { + uint8_t m_lo; + uint8_t m_hi; + uint16_t m_err; + }; + +#if BASISD_SUPPORT_ASTC + static dxt_selector_range g_etc1_to_astc_selector_ranges[] = + { + { 0, 3 }, + + { 1, 3 }, + { 0, 2 }, + + { 1, 2 }, + + { 2, 3 }, + { 0, 1 }, + }; + + const uint32_t NUM_ETC1_TO_ASTC_SELECTOR_RANGES = sizeof(g_etc1_to_astc_selector_ranges) / sizeof(g_etc1_to_astc_selector_ranges[0]); + + static uint32_t g_etc1_to_astc_selector_range_index[4][4]; + + const uint32_t NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS = 10; + static const uint8_t g_etc1_to_astc_selector_mappings[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS][4] = + { + { 0, 0, 1, 1 }, + { 0, 0, 1, 2 }, + { 0, 0, 1, 3 }, + { 0, 0, 2, 3 }, + { 0, 1, 1, 1 }, + { 0, 1, 2, 2 }, + { 0, 1, 2, 3 }, + { 0, 2, 3, 3 }, + { 1, 2, 2, 2 }, + { 1, 2, 3, 3 }, + }; + + static const etc1_to_astc_solution g_etc1_to_astc[32 * 8 * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS * NUM_ETC1_TO_ASTC_SELECTOR_RANGES] = { +/**** start inlining basisu_transcoder_tables_astc.inc ****/ +{0,2,18},{0,32,2},{0,16,10},{0,16,10},{0,32,35},{0,16,27},{0,16,11},{0,16,27},{0,16,36},{0,16,28},{0,2,18},{0,32,2},{0,16,10},{0,16,10},{16,0,35},{0,16,27},{0,16,11},{0,16,27},{32,0,35},{0,16,27},{0,16,1},{0,16,1},{0,16,1},{0,16,1},{0,16,2},{0,16,2},{0,16,2},{0,0,4},{0,0,4},{0,0,4},{0,16,1}, +{0,16,1},{0,16,1},{0,16,1},{0,16,2},{0,16,2},{0,16,2},{0,0,4},{16,0,2},{0,0,4},{0,2,18},{0,32,2},{0,16,10},{0,16,10},{0,2,18},{2,0,18},{0,16,10},{0,16,18},{2,0,18},{0,16,18},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{16,4,44},{16,18,27},{16,2,30}, +{16,2,30},{0,4,52},{0,18,20},{0,2,1},{0,32,27},{0,2,77},{0,32,36},{16,4,19},{16,18,2},{16,2,5},{16,2,5},{32,32,51},{0,18,20},{0,2,1},{0,32,27},{32,32,51},{0,32,27},{16,18,26},{16,18,26},{16,18,26},{16,32,27},{0,34,8},{0,2,1},{0,2,1},{0,32,2},{0,32,19},{0,32,11},{16,18,1},{16,18,1},{16,18,1},{16,32,2},{16,2,8}, +{0,2,1},{0,2,1},{0,32,2},{34,0,8},{0,32,2},{16,4,18},{16,18,1},{16,2,4},{0,2,0},{16,4,18},{4,16,18},{0,2,0},{0,32,26},{4,16,18},{0,32,26},{16,0,26},{16,0,26},{16,0,26},{16,0,26},{0,18,0},{0,18,0},{0,18,0},{0,32,1},{0,16,10},{0,16,10},{32,36,36},{32,4,20},{32,34,31},{32,18,28},{16,6,60},{32,34,31},{32,18,19}, +{16,18,28},{0,34,52},{0,18,22},{2,4,22},{2,34,6},{2,18,14},{2,18,14},{18,2,51},{32,34,22},{32,18,10},{0,18,18},{38,0,51},{0,18,18},{32,4,19},{32,4,19},{32,4,19},{32,18,19},{32,34,17},{32,18,10},{32,18,10},{32,2,13},{16,18,14},{16,2,8},{2,18,5},{2,18,5},{2,18,5},{2,18,5},{2,2,8},{32,18,1},{32,18,1},{32,2,4},{2,2,8}, +{32,2,4},{4,0,18},{32,4,2},{2,18,10},{0,34,9},{4,0,18},{8,0,18},{0,34,9},{0,18,18},{8,0,18},{0,18,18},{32,0,18},{32,0,18},{32,0,18},{32,0,18},{32,18,9},{32,18,9},{32,18,9},{32,2,9},{16,2,4},{16,2,4},{18,6,44},{18,20,26},{18,4,30},{18,4,30},{2,6,52},{2,20,21},{2,4,1},{2,34,27},{16,20,52},{32,34,27},{18,6,19}, +{18,20,1},{18,4,5},{18,4,5},{20,16,51},{2,20,21},{2,4,1},{2,34,27},{16,20,51},{2,34,27},{18,20,26},{18,20,26},{18,20,26},{18,34,27},{2,36,8},{2,4,1},{2,4,1},{2,34,2},{32,4,11},{32,34,2},{18,20,1},{18,20,1},{18,20,1},{18,34,2},{18,4,8},{2,4,1},{2,4,1},{2,34,2},{36,2,8},{2,34,2},{36,0,18},{18,20,0},{18,4,4}, +{2,4,0},{36,0,18},{6,18,18},{2,4,0},{0,34,26},{6,18,18},{0,34,26},{18,0,26},{18,0,26},{18,0,26},{18,0,26},{2,4,1},{2,4,1},{2,4,1},{2,34,1},{32,34,1},{32,34,1},{34,8,40},{34,6,21},{34,36,33},{34,36,28},{34,22,55},{34,36,25},{34,36,13},{34,20,31},{32,6,55},{18,20,20},{4,6,21},{4,36,5},{4,36,5},{4,20,11},{22,0,51}, +{34,36,21},{34,36,9},{2,20,19},{32,6,51},{2,20,19},{34,6,21},{34,6,21},{34,6,21},{34,20,21},{34,6,14},{34,20,6},{34,20,6},{34,4,14},{18,20,11},{18,20,11},{4,36,1},{4,36,1},{4,36,1},{4,20,2},{2,24,8},{34,20,2},{34,20,2},{4,4,10},{28,0,8},{4,4,10},{22,16,18},{34,6,1},{4,36,4},{18,36,4},{22,16,18},{44,16,18},{18,36,4}, +{0,20,18},{44,16,18},{0,20,18},{34,0,20},{34,0,20},{34,0,20},{34,0,20},{34,20,5},{34,20,5},{34,20,5},{34,4,5},{18,20,2},{18,20,2},{20,8,46},{20,22,27},{20,6,31},{20,6,28},{4,24,52},{4,22,19},{4,6,7},{4,6,36},{18,22,56},{34,6,31},{20,8,21},{20,22,2},{20,6,6},{20,6,3},{36,6,51},{4,22,18},{4,6,6},{18,6,26},{31,0,51}, +{18,6,26},{20,22,26},{20,22,26},{20,22,26},{20,6,27},{4,38,9},{4,6,6},{4,6,6},{4,36,1},{34,6,9},{4,36,4},{20,22,1},{20,22,1},{20,22,1},{20,6,2},{22,2,8},{20,36,4},{20,36,4},{4,36,0},{42,2,8},{4,36,0},{22,4,18},{20,22,1},{36,6,2},{4,6,2},{22,4,18},{15,0,18},{4,6,2},{0,6,26},{15,0,18},{0,6,26},{20,0,26}, +{20,0,26},{20,0,26},{20,0,26},{4,22,1},{4,22,1},{4,22,1},{4,36,1},{4,36,4},{4,36,4},{36,40,38},{36,8,22},{36,38,33},{36,38,28},{36,24,55},{36,38,25},{36,38,13},{20,22,28},{34,8,55},{4,22,23},{6,8,21},{6,38,5},{6,38,5},{6,22,11},{24,2,51},{36,38,21},{20,38,9},{4,22,19},{13,0,51},{4,22,19},{36,8,21},{36,8,21},{36,8,21}, +{36,22,21},{36,8,14},{36,22,6},{36,22,6},{36,6,14},{4,38,10},{4,22,14},{6,38,1},{6,38,1},{6,38,1},{6,22,2},{8,2,8},{36,22,2},{36,22,2},{6,6,10},{30,2,8},{6,6,10},{10,0,18},{36,8,2},{6,38,4},{4,38,5},{10,0,18},{4,8,18},{4,38,5},{0,22,18},{4,8,18},{0,22,18},{36,0,20},{36,0,20},{36,0,20},{36,0,20},{36,22,5}, +{36,22,5},{36,22,5},{36,6,5},{4,22,5},{4,22,5},{22,10,46},{22,24,26},{22,8,30},{22,8,30},{6,26,52},{6,24,21},{6,8,5},{6,38,37},{20,24,53},{6,38,40},{22,10,21},{22,24,1},{22,8,5},{22,8,5},{16,11,51},{6,24,20},{6,8,4},{6,38,36},{25,0,51},{6,38,36},{22,24,26},{22,24,26},{22,24,26},{22,8,30},{6,40,9},{6,8,5},{6,8,5}, +{6,38,1},{36,8,11},{6,38,4},{22,24,1},{22,24,1},{22,24,1},{22,8,5},{24,4,8},{6,8,4},{6,8,4},{6,38,0},{11,0,8},{6,38,0},{42,0,18},{22,24,0},{22,8,4},{6,8,0},{42,0,18},{9,0,18},{6,8,0},{0,8,36},{9,0,18},{0,8,36},{22,0,26},{22,0,26},{22,0,26},{22,0,26},{6,24,1},{6,24,1},{6,24,1},{6,38,1},{6,38,4}, +{6,38,4},{38,12,44},{38,10,30},{38,40,46},{38,40,34},{38,26,53},{38,40,21},{38,40,9},{38,24,25},{6,10,57},{22,24,22},{8,10,21},{8,40,5},{8,40,5},{8,24,17},{28,0,51},{38,40,20},{38,40,8},{6,24,21},{37,0,51},{6,24,21},{38,26,26},{38,26,26},{38,26,26},{38,24,30},{38,10,9},{38,40,5},{38,40,5},{38,24,9},{22,24,11},{22,24,6},{8,40,1}, +{8,40,1},{8,40,1},{8,24,1},{38,10,8},{8,24,4},{8,24,4},{6,24,5},{23,0,8},{6,24,5},{16,7,18},{38,10,4},{8,40,4},{6,40,5},{16,7,18},{21,0,18},{6,40,5},{0,24,20},{21,0,18},{0,24,20},{38,0,26},{38,0,26},{38,0,26},{38,0,26},{38,40,1},{38,40,1},{38,40,1},{38,8,2},{22,24,2},{22,24,2},{24,12,38},{24,26,22},{24,10,30}, +{24,10,22},{8,28,52},{8,26,19},{8,10,6},{8,40,37},{38,26,55},{38,10,30},{24,12,22},{24,26,6},{24,10,14},{24,10,6},{42,6,51},{8,26,18},{24,10,3},{22,10,26},{19,0,51},{22,10,26},{24,26,21},{24,26,21},{24,26,21},{24,10,21},{8,42,9},{8,10,5},{8,10,5},{8,40,1},{38,10,8},{8,40,4},{24,26,5},{24,26,5},{24,26,5},{24,10,5},{28,2,8}, +{24,10,2},{24,10,2},{8,40,0},{42,8,8},{8,40,0},{26,8,18},{24,26,2},{40,10,2},{8,10,1},{26,8,18},{15,6,18},{8,10,1},{0,10,26},{15,6,18},{0,10,26},{24,0,20},{24,0,20},{24,0,20},{24,0,20},{8,26,1},{8,26,1},{8,26,1},{8,40,1},{38,10,4},{38,10,4},{40,14,40},{40,12,21},{40,42,33},{40,42,33},{40,28,55},{40,42,23},{40,42,18}, +{40,26,33},{8,12,57},{24,26,22},{10,12,21},{10,42,5},{10,42,5},{10,26,17},{30,2,51},{40,42,19},{24,42,14},{8,26,21},{35,2,51},{8,26,21},{40,12,21},{40,12,21},{40,12,21},{40,26,21},{40,12,14},{40,26,6},{40,26,6},{40,10,14},{8,42,10},{24,26,6},{10,42,1},{10,42,1},{10,42,1},{10,26,1},{16,3,8},{40,26,2},{40,26,2},{8,26,5},{17,0,8}, +{8,26,5},{16,1,18},{40,12,1},{10,42,4},{8,42,5},{16,1,18},{19,2,18},{8,42,5},{0,26,20},{19,2,18},{0,26,20},{40,0,20},{40,0,20},{40,0,20},{40,0,20},{40,26,5},{40,26,5},{40,26,5},{40,10,5},{24,26,2},{24,26,2},{26,14,38},{26,28,22},{26,12,30},{26,12,22},{10,30,52},{10,28,21},{10,12,6},{10,42,37},{24,28,53},{40,12,31},{26,14,22}, +{26,28,6},{26,12,14},{26,12,6},{47,2,51},{10,28,20},{26,12,3},{24,12,26},{17,2,51},{24,12,26},{26,28,21},{26,28,21},{26,28,21},{26,12,21},{10,44,9},{10,12,5},{10,12,5},{10,42,1},{40,12,9},{40,42,2},{26,28,5},{26,28,5},{26,28,5},{26,12,5},{30,4,8},{26,12,2},{26,12,2},{10,42,0},{15,8,8},{10,42,0},{15,0,18},{26,28,2},{42,12,5}, +{10,12,1},{15,0,18},{5,4,18},{10,12,1},{0,12,26},{5,4,18},{0,12,26},{26,0,20},{26,0,20},{26,0,20},{26,0,20},{10,28,1},{10,28,1},{10,28,1},{10,42,1},{40,42,2},{40,42,2},{42,47,46},{42,14,31},{12,44,37},{42,44,31},{42,46,52},{42,44,21},{42,44,6},{42,28,25},{10,14,51},{26,28,20},{12,30,18},{12,14,2},{12,44,1},{12,44,10},{29,0,51}, +{42,44,20},{42,44,5},{26,28,20},{37,6,51},{26,28,20},{42,30,26},{42,30,26},{42,30,26},{42,28,30},{42,14,9},{42,44,5},{42,44,5},{42,28,9},{10,44,9},{26,28,4},{12,44,0},{12,44,0},{12,44,0},{12,28,0},{45,0,8},{12,28,4},{12,28,4},{26,28,4},{27,8,8},{26,28,4},{45,2,18},{12,14,2},{12,44,1},{26,44,1},{45,2,18},{25,8,18},{26,44,1}, +{0,28,20},{25,8,18},{0,28,20},{42,0,26},{42,0,26},{42,0,26},{42,0,26},{42,44,1},{42,44,1},{42,44,1},{42,12,5},{26,28,0},{26,28,0},{28,47,38},{28,30,22},{28,14,33},{28,14,25},{12,31,55},{12,30,23},{12,14,18},{12,14,33},{42,30,55},{42,14,21},{28,47,22},{28,30,6},{44,14,14},{28,14,9},{46,10,51},{12,30,19},{28,14,6},{26,14,21},{23,8,51}, +{26,14,21},{28,30,21},{28,30,21},{28,30,21},{28,14,21},{12,46,14},{12,14,14},{12,14,14},{12,44,6},{42,14,10},{12,44,6},{28,30,5},{28,30,5},{28,30,5},{28,14,5},{29,2,8},{28,14,2},{28,14,2},{12,44,2},{35,6,8},{12,44,2},{8,7,18},{28,30,2},{44,14,5},{12,14,5},{8,7,18},{33,6,18},{12,14,5},{0,14,20},{33,6,18},{0,14,20},{28,0,20}, +{28,0,20},{28,0,20},{28,0,20},{12,30,5},{12,30,5},{12,30,5},{12,44,5},{42,14,1},{42,14,1},{44,15,46},{44,47,27},{14,46,37},{44,46,31},{44,31,53},{44,46,21},{44,46,6},{44,30,25},{42,47,55},{28,30,22},{14,31,20},{14,47,8},{14,46,1},{14,46,10},{38,3,51},{44,46,20},{44,46,5},{12,30,21},{35,8,51},{12,30,21},{44,31,26},{44,31,26},{44,31,26}, +{44,30,30},{44,47,11},{44,46,5},{44,46,5},{44,30,9},{12,46,9},{28,30,6},{14,46,0},{14,46,0},{14,46,0},{14,30,0},{43,2,8},{14,30,4},{14,30,4},{12,30,5},{21,8,8},{12,30,5},{41,0,18},{44,47,1},{14,46,1},{28,46,1},{41,0,18},{19,8,18},{28,46,1},{0,30,20},{19,8,18},{0,30,20},{44,0,26},{44,0,26},{44,0,26},{44,0,26},{44,46,1}, +{44,46,1},{44,46,1},{44,14,5},{28,30,2},{28,30,2},{30,45,38},{30,31,21},{30,47,24},{30,47,24},{14,29,55},{14,31,22},{14,47,8},{14,46,55},{28,31,53},{44,47,41},{30,45,22},{30,31,5},{30,47,8},{30,47,8},{41,2,51},{14,31,18},{14,47,4},{12,47,37},{17,8,51},{12,47,37},{30,31,20},{30,31,20},{30,31,20},{30,47,24},{14,15,14},{14,47,8},{14,47,8}, +{14,46,6},{44,47,9},{14,46,6},{30,31,4},{30,31,4},{30,31,4},{30,47,8},{38,1,8},{14,47,4},{14,47,4},{14,46,2},{43,28,8},{14,46,2},{9,0,18},{30,31,1},{46,47,1},{14,47,0},{9,0,18},{0,9,18},{14,47,0},{0,47,36},{0,9,18},{0,47,36},{30,0,20},{30,0,20},{30,0,20},{30,0,20},{14,31,4},{14,31,4},{14,31,4},{14,46,5},{14,46,5}, +{14,46,5},{46,43,54},{46,45,41},{47,15,55},{46,15,44},{46,13,51},{46,15,20},{46,15,8},{46,31,24},{14,45,56},{30,31,21},{47,29,21},{47,15,6},{47,15,6},{47,31,17},{23,0,51},{46,15,20},{46,15,8},{30,31,20},{18,9,51},{30,31,20},{46,13,37},{46,13,37},{46,13,37},{46,15,40},{46,45,8},{46,15,4},{46,15,4},{46,31,8},{14,15,14},{30,31,5},{47,15,2}, +{47,15,2},{47,15,2},{47,31,1},{39,0,8},{46,15,4},{46,15,4},{30,31,4},{9,28,8},{30,31,4},{39,2,18},{47,15,5},{47,15,5},{30,15,4},{39,2,18},{34,9,18},{30,15,4},{0,31,20},{34,9,18},{0,31,20},{46,0,36},{46,0,36},{46,0,36},{46,0,36},{46,15,0},{46,15,0},{46,15,0},{46,47,1},{30,31,1},{30,31,1},{31,43,38},{31,29,22},{31,45,25}, +{31,45,22},{47,43,53},{47,29,19},{47,45,6},{47,15,37},{46,29,52},{46,45,27},{31,43,22},{31,29,6},{31,45,9},{31,45,6},{9,6,51},{47,29,18},{47,45,5},{30,45,26},{32,7,51},{30,45,26},{31,13,21},{31,13,21},{31,13,21},{31,45,21},{47,13,9},{47,45,5},{47,45,5},{47,15,1},{46,45,10},{46,15,8},{31,13,5},{31,13,5},{31,13,5},{31,45,5},{23,2,8}, +{31,15,4},{31,15,4},{47,15,0},{20,9,8},{47,15,0},{47,11,18},{31,29,2},{15,45,5},{47,45,1},{47,11,18},{22,9,18},{47,45,1},{0,45,26},{22,9,18},{0,45,26},{31,0,20},{31,0,20},{31,0,20},{31,0,20},{47,29,1},{47,29,1},{47,29,1},{47,15,1},{46,45,1},{46,45,1},{15,11,38},{15,43,21},{15,13,33},{15,13,33},{15,27,55},{15,13,23},{15,13,18}, +{15,29,33},{47,13,59},{31,29,22},{45,27,21},{45,13,6},{45,13,6},{45,29,17},{21,2,51},{15,13,19},{15,13,14},{31,29,21},{24,9,51},{31,29,21},{15,27,21},{15,27,21},{15,27,21},{15,29,21},{15,13,14},{15,29,6},{15,29,6},{15,45,14},{47,13,10},{31,29,6},{45,13,2},{45,13,2},{45,13,2},{45,29,1},{37,2,8},{15,29,2},{15,29,2},{31,29,5},{34,7,8}, +{31,29,5},{35,0,18},{15,43,1},{45,13,5},{31,13,5},{35,0,18},{36,7,18},{31,13,5},{0,29,20},{36,7,18},{0,29,20},{15,0,20},{15,0,20},{15,0,20},{15,0,20},{15,13,5},{15,13,5},{15,13,5},{15,45,5},{31,29,2},{31,29,2},{29,41,38},{29,27,20},{29,43,25},{29,43,25},{45,41,53},{45,27,21},{45,43,6},{45,13,37},{31,27,53},{15,43,31},{29,41,22}, +{29,27,4},{29,43,9},{29,43,9},{35,2,51},{45,27,20},{45,43,5},{31,43,26},{34,5,51},{31,43,26},{29,27,20},{29,27,20},{29,27,20},{29,13,24},{45,11,9},{45,43,5},{45,43,5},{45,13,1},{15,43,9},{15,13,2},{29,27,4},{29,27,4},{29,27,4},{29,13,8},{44,1,8},{29,13,4},{29,13,4},{45,13,0},{26,9,8},{45,13,0},{3,0,18},{29,27,0},{13,43,5}, +{45,43,1},{3,0,18},{0,3,18},{45,43,1},{0,43,26},{0,3,18},{0,43,26},{29,0,20},{29,0,20},{29,0,20},{29,0,20},{45,27,1},{45,27,1},{45,27,1},{45,13,1},{15,13,2},{15,13,2},{13,9,46},{13,41,31},{43,11,37},{13,11,31},{13,25,53},{13,11,21},{13,11,6},{13,27,30},{29,11,56},{29,27,22},{43,25,18},{43,41,2},{43,11,1},{43,27,16},{17,0,51}, +{13,11,20},{13,11,5},{29,27,21},{18,3,51},{29,27,21},{13,25,26},{13,25,26},{13,25,26},{13,27,27},{13,41,9},{13,27,3},{13,27,3},{13,27,14},{45,11,9},{29,27,6},{43,11,0},{43,11,0},{43,11,0},{43,27,0},{31,5,8},{13,27,2},{13,27,2},{29,27,5},{14,9,8},{29,27,5},{31,3,18},{43,41,2},{43,11,1},{29,11,1},{31,3,18},{34,3,18},{29,11,1}, +{0,27,20},{34,3,18},{0,27,20},{13,0,26},{13,0,26},{13,0,26},{13,0,26},{13,11,1},{13,11,1},{13,11,1},{13,43,5},{29,27,2},{29,27,2},{27,39,38},{27,25,22},{27,41,33},{27,41,25},{43,23,55},{43,25,23},{43,41,18},{43,41,33},{13,25,55},{13,41,21},{27,39,22},{27,25,6},{11,41,14},{27,41,9},{27,9,51},{43,25,19},{27,41,6},{13,41,21},{14,7,51}, +{13,41,21},{27,9,21},{27,9,21},{27,9,21},{27,41,21},{43,9,14},{43,25,14},{43,25,14},{43,11,5},{13,41,10},{43,11,5},{27,9,5},{27,9,5},{27,9,5},{27,41,5},{17,2,8},{27,41,2},{27,41,2},{43,11,1},{16,1,8},{43,11,1},{43,7,18},{27,25,2},{11,41,5},{27,41,5},{43,7,18},{18,1,18},{27,41,5},{0,41,20},{18,1,18},{0,41,20},{27,0,20}, +{27,0,20},{27,0,20},{27,0,20},{43,9,5},{43,9,5},{43,9,5},{43,11,4},{13,41,1},{13,41,1},{11,7,46},{11,39,30},{41,9,37},{11,9,31},{11,23,53},{11,9,21},{11,9,6},{11,25,30},{13,39,55},{27,25,22},{41,23,18},{41,9,4},{41,9,1},{41,25,16},{17,6,51},{11,9,20},{11,9,5},{27,25,21},{20,1,51},{27,25,21},{11,23,26},{11,23,26},{11,23,26}, +{11,25,27},{11,39,9},{11,25,3},{11,25,3},{11,25,14},{43,9,9},{27,25,6},{41,9,0},{41,9,0},{41,9,0},{41,25,0},{29,3,8},{11,25,2},{11,25,2},{27,25,5},{43,9,8},{27,25,5},{29,1,18},{41,9,4},{41,9,1},{27,9,1},{29,1,18},{36,1,18},{27,9,1},{0,25,20},{36,1,18},{0,25,20},{11,0,26},{11,0,26},{11,0,26},{11,0,26},{11,9,1}, +{11,9,1},{11,9,1},{11,41,2},{27,25,2},{27,25,2},{25,37,38},{25,23,22},{25,39,25},{25,39,25},{41,21,55},{41,23,23},{41,39,9},{41,39,46},{27,23,53},{11,39,30},{25,37,22},{25,23,6},{25,39,9},{25,39,9},{27,3,51},{41,23,19},{41,39,5},{27,39,26},{39,9,51},{27,39,26},{25,7,21},{25,7,21},{25,7,21},{25,9,24},{41,7,14},{41,39,8},{41,39,8}, +{41,9,5},{11,39,8},{41,9,5},{25,7,5},{25,7,5},{25,7,5},{25,9,8},{39,11,8},{25,9,4},{25,9,4},{41,9,1},{22,1,8},{41,9,1},{41,5,18},{25,23,2},{9,39,2},{41,39,1},{41,5,18},{23,9,18},{41,39,1},{0,39,26},{23,9,18},{0,39,26},{25,0,20},{25,0,20},{25,0,20},{25,0,20},{41,7,5},{41,7,5},{41,7,5},{41,9,4},{41,9,4}, +{41,9,4},{39,21,54},{39,7,40},{39,7,37},{9,7,41},{9,5,51},{9,7,20},{9,7,5},{9,23,30},{41,37,51},{25,23,26},{39,21,18},{39,7,4},{39,7,1},{39,7,17},{11,1,51},{9,7,20},{9,7,5},{25,23,26},{5,9,51},{25,23,26},{39,7,36},{39,7,36},{39,7,36},{39,23,36},{9,21,10},{9,7,4},{9,7,4},{9,23,5},{41,7,12},{25,23,1},{39,7,0}, +{39,7,0},{39,7,0},{39,23,0},{25,5,8},{9,7,4},{9,7,4},{25,23,1},{10,1,8},{25,23,1},{25,3,18},{39,7,4},{39,7,1},{25,7,1},{25,3,18},{12,1,18},{25,7,1},{0,23,26},{12,1,18},{0,23,26},{9,0,36},{9,0,36},{9,0,36},{9,0,36},{9,7,0},{9,7,0},{9,7,0},{9,23,4},{25,23,0},{25,23,0},{23,19,38},{23,5,23},{23,21,28}, +{23,37,23},{39,19,55},{39,21,25},{39,37,13},{39,37,33},{9,21,53},{9,37,22},{7,21,27},{23,5,14},{7,37,14},{23,37,14},{23,5,51},{39,21,21},{23,37,6},{9,37,21},{14,1,51},{9,37,21},{23,5,19},{23,5,19},{23,5,19},{23,37,19},{39,5,14},{39,21,9},{39,21,9},{39,7,5},{9,37,11},{39,7,5},{23,5,10},{23,5,10},{23,5,10},{7,7,10},{9,3,8}, +{23,37,2},{23,37,2},{39,7,1},{31,3,8},{39,7,1},{37,7,18},{23,5,5},{7,37,5},{23,37,5},{37,7,18},{30,1,18},{23,37,5},{0,37,20},{30,1,18},{0,37,20},{23,0,18},{23,0,18},{23,0,18},{23,0,18},{39,5,5},{39,5,5},{39,5,5},{39,7,4},{9,37,2},{9,37,2},{7,33,44},{7,35,31},{7,5,36},{7,5,31},{7,19,53},{7,5,22},{7,5,7}, +{7,21,31},{39,35,57},{23,21,27},{37,19,20},{37,5,4},{37,5,1},{37,5,17},{23,17,51},{7,5,21},{7,5,6},{23,21,26},{45,17,51},{23,21,26},{7,19,26},{7,19,26},{7,19,26},{7,5,30},{7,35,9},{7,5,6},{7,5,6},{7,21,6},{39,5,9},{23,21,2},{37,5,0},{37,5,0},{37,5,0},{37,21,0},{23,3,8},{37,21,4},{37,21,4},{23,21,1},{43,3,8}, +{23,21,1},{23,1,18},{37,5,4},{37,5,1},{23,5,1},{23,1,18},{33,7,18},{23,5,1},{0,21,26},{33,7,18},{0,21,26},{7,0,26},{7,0,26},{7,0,26},{7,0,26},{7,5,2},{7,5,2},{7,5,2},{7,37,2},{23,21,1},{23,21,1},{21,17,38},{21,19,20},{21,35,31},{21,35,23},{37,17,55},{37,19,22},{37,35,13},{37,35,33},{23,19,56},{7,35,21},{5,19,27}, +{21,19,11},{5,35,14},{21,35,14},{21,3,51},{37,19,18},{21,35,6},{7,35,21},{43,1,51},{7,35,21},{21,3,19},{21,3,19},{21,3,19},{21,35,19},{37,3,14},{37,35,9},{37,35,9},{37,5,5},{7,35,10},{37,5,5},{21,3,10},{21,3,10},{21,3,10},{5,5,10},{3,25,8},{21,35,2},{21,35,2},{37,5,1},{29,1,8},{37,5,1},{35,5,18},{21,19,2},{5,35,5}, +{21,35,5},{35,5,18},{27,1,18},{21,35,5},{0,35,20},{27,1,18},{0,35,20},{21,0,18},{21,0,18},{21,0,18},{21,0,18},{37,19,4},{37,19,4},{37,19,4},{37,5,4},{7,35,1},{7,35,1},{35,17,44},{35,33,27},{35,3,27},{35,3,35},{5,1,51},{5,3,26},{5,3,1},{5,19,30},{37,33,51},{21,19,26},{35,17,19},{35,33,2},{35,3,2},{35,3,10},{5,1,51}, +{5,3,26},{5,3,1},{21,19,26},{9,1,51},{21,19,26},{35,3,27},{35,3,27},{35,3,27},{35,19,27},{5,17,10},{5,3,1},{5,3,1},{5,19,5},{37,3,12},{21,19,1},{35,3,2},{35,3,2},{35,3,2},{35,19,2},{19,5,8},{5,3,1},{5,3,1},{21,19,1},{37,3,8},{21,19,1},{19,3,18},{35,33,1},{35,3,1},{5,3,1},{19,3,18},{39,1,18},{5,3,1}, +{0,19,26},{39,1,18},{0,19,26},{35,0,26},{35,0,26},{35,0,26},{35,0,26},{5,3,0},{5,3,0},{5,3,0},{5,19,4},{21,19,0},{21,19,0},{19,1,54},{19,1,22},{19,17,28},{19,33,27},{19,1,61},{35,17,30},{19,33,19},{35,33,31},{5,17,52},{5,33,20},{3,1,24},{3,17,8},{3,33,13},{3,33,17},{17,5,51},{35,17,21},{19,33,10},{5,33,19},{5,17,51}, +{5,33,19},{19,1,18},{19,1,18},{19,1,18},{19,33,18},{19,17,19},{19,33,10},{19,33,10},{19,3,14},{5,33,11},{35,3,6},{3,33,4},{3,33,4},{3,33,4},{3,3,8},{3,3,8},{19,33,1},{19,33,1},{19,3,5},{3,3,8},{19,3,5},{33,33,18},{19,1,4},{3,33,9},{19,33,9},{33,33,18},{33,33,18},{19,33,9},{0,33,18},{33,33,18},{0,33,18},{19,0,18}, +{19,0,18},{19,0,18},{19,0,18},{35,1,9},{35,1,9},{35,1,9},{19,3,10},{35,3,2},{35,3,2},{33,1,76},{33,1,36},{33,1,27},{33,1,35},{33,1,84},{3,1,26},{3,1,1},{3,17,30},{19,1,56},{19,17,27},{17,1,43},{33,1,11},{33,1,2},{33,1,10},{1,3,51},{3,1,26},{3,1,1},{19,17,26},{3,1,51},{19,17,26},{33,1,27},{33,1,27},{33,1,27}, +{33,17,26},{3,1,16},{3,1,1},{3,1,1},{3,17,5},{35,1,12},{19,17,2},{33,1,2},{33,1,2},{33,1,2},{33,17,1},{17,3,8},{3,1,1},{3,1,1},{19,17,1},{35,1,8},{19,17,1},{17,1,18},{17,1,10},{33,1,1},{19,1,0},{17,1,18},{33,1,18},{19,1,0},{0,17,26},{33,1,18},{0,17,26},{33,0,26},{33,0,26},{33,0,26},{33,0,26},{3,1,0}, +{3,1,0},{3,1,0},{3,17,4},{19,17,1},{19,17,1},{17,1,36},{17,1,28},{17,1,27},{17,1,19},{17,1,28},{17,1,12},{17,1,11},{17,1,10},{33,1,20},{33,1,2},{1,1,4},{1,1,4},{1,1,4},{1,1,4},{1,17,3},{17,1,3},{17,1,2},{17,1,1},{17,1,3},{17,1,1},{17,1,27},{17,1,27},{17,1,27},{17,1,19},{17,1,19},{17,1,11},{17,1,11}, +{17,1,10},{33,1,11},{33,1,2},{1,1,4},{1,1,4},{1,1,4},{1,1,4},{1,17,2},{17,1,2},{17,1,2},{17,1,1},{17,1,2},{17,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{17,0,18},{17,0,18},{17,0,18},{17,0,18},{17,1,10},{17,1,10},{17,1,10},{17,1,10},{33,1,2}, +{33,1,2},{0,4,74},{0,18,10},{0,2,1},{0,2,26},{0,34,154},{0,2,99},{0,32,49},{0,32,121},{0,32,162},{0,32,130},{0,4,74},{0,18,10},{0,2,1},{0,2,26},{32,0,153},{0,2,99},{0,32,49},{0,32,121},{0,32,153},{0,32,121},{0,2,0},{0,2,0},{0,2,0},{0,16,4},{0,32,13},{0,16,5},{0,16,5},{0,16,9},{0,16,14},{0,16,10},{0,2,0}, +{0,2,0},{0,2,0},{0,16,4},{16,0,13},{0,16,5},{0,16,5},{0,16,9},{32,0,13},{0,16,9},{32,32,72},{0,18,10},{0,2,1},{0,2,26},{32,32,72},{32,32,72},{0,2,26},{0,32,72},{32,32,72},{0,32,72},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,38,81},{0,20,10},{16,34,34}, +{0,18,26},{0,36,243},{0,34,99},{0,18,26},{0,2,139},{0,18,279},{0,2,164},{16,6,76},{16,4,8},{16,34,9},{16,18,24},{18,0,243},{0,34,99},{0,18,26},{0,2,139},{36,0,243},{0,2,139},{0,20,10},{0,20,10},{0,20,10},{0,18,10},{0,34,50},{0,18,10},{0,18,10},{0,32,20},{0,32,61},{0,32,29},{16,4,4},{16,4,4},{16,4,4},{16,2,5},{16,2,50}, +{0,18,10},{0,18,10},{0,32,20},{34,0,50},{0,32,20},{18,2,72},{0,20,1},{16,34,5},{0,18,17},{18,2,72},{38,0,72},{0,18,17},{0,18,80},{38,0,72},{0,18,80},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,32,0},{0,32,0},{0,32,0},{0,16,0},{0,16,1},{0,16,1},{16,24,135},{16,6,66},{16,20,122},{16,4,66},{0,8,244},{0,20,81},{0,4,2}, +{0,34,121},{0,4,344},{0,34,185},{32,8,74},{32,36,1},{32,4,17},{32,4,17},{16,38,243},{0,20,81},{0,4,2},{0,34,121},{38,16,243},{0,34,121},{16,22,61},{16,22,61},{16,22,61},{16,4,65},{0,6,52},{0,4,1},{0,4,1},{0,18,9},{0,18,94},{0,18,45},{32,36,0},{32,36,0},{32,36,0},{32,34,0},{2,2,50},{0,4,1},{0,4,1},{0,18,9},{2,2,50}, +{0,18,9},{20,16,72},{32,36,1},{2,4,1},{0,4,1},{20,16,72},{16,20,72},{0,4,1},{0,34,72},{16,20,72},{0,34,72},{16,0,61},{16,0,61},{16,0,61},{16,0,61},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,32,25},{0,32,25},{32,26,152},{2,22,91},{2,36,119},{32,20,89},{16,10,247},{16,6,78},{16,36,13},{16,4,110},{0,36,293},{0,4,103},{18,8,76}, +{18,6,8},{18,36,9},{2,20,19},{20,2,243},{16,6,74},{32,20,9},{0,4,94},{42,0,243},{0,4,94},{32,8,81},{32,8,81},{32,8,81},{32,20,80},{16,8,54},{16,36,9},{16,36,9},{16,34,8},{0,4,77},{0,34,6},{18,6,4},{18,6,4},{18,6,4},{18,4,5},{18,4,50},{32,20,0},{32,20,0},{16,34,4},{36,2,50},{16,34,4},{18,8,72},{2,22,1},{18,36,5}, +{0,36,4},{18,8,72},{44,0,72},{0,36,4},{0,4,90},{44,0,72},{0,4,90},{32,0,80},{32,0,80},{32,0,80},{32,0,80},{16,6,4},{16,6,4},{16,6,4},{16,34,4},{0,34,2},{0,34,2},{18,42,146},{18,8,83},{18,22,139},{18,6,79},{2,26,243},{2,38,78},{2,6,9},{2,36,110},{0,38,252},{0,36,79},{34,10,73},{34,8,6},{4,6,21},{34,6,14},{38,0,243}, +{2,38,78},{18,6,6},{0,36,75},{30,0,243},{0,36,75},{18,24,75},{18,24,75},{18,24,75},{18,6,75},{2,24,50},{2,6,5},{2,6,5},{2,20,4},{0,6,53},{16,20,2},{34,8,2},{34,8,2},{34,8,2},{34,36,2},{2,24,50},{18,6,2},{18,6,2},{16,20,1},{28,0,50},{16,20,1},{36,6,72},{34,8,5},{4,6,5},{2,6,5},{36,6,72},{31,0,72},{2,6,5}, +{0,36,74},{31,0,72},{0,36,74},{18,0,74},{18,0,74},{18,0,74},{18,0,74},{2,22,0},{2,22,0},{2,22,0},{2,4,4},{16,20,2},{16,20,2},{4,12,154},{4,24,85},{4,38,106},{34,38,95},{18,12,253},{18,8,90},{34,38,15},{18,6,122},{0,24,244},{16,22,93},{20,10,76},{20,8,9},{20,38,6},{20,22,24},{24,0,243},{18,8,81},{34,38,6},{0,22,80},{32,8,243}, +{0,22,80},{4,40,80},{4,40,80},{4,40,80},{4,22,80},{34,24,59},{34,22,10},{34,22,10},{18,36,19},{32,22,53},{32,6,5},{20,8,5},{20,8,5},{20,8,5},{20,6,8},{22,2,50},{34,22,1},{34,22,1},{32,6,4},{42,2,50},{32,6,4},{24,2,72},{20,8,5},{20,38,2},{18,38,1},{24,2,72},{13,0,72},{18,38,1},{0,22,80},{13,0,72},{0,22,80},{4,0,80}, +{4,0,80},{4,0,80},{4,0,80},{34,22,9},{34,22,9},{34,22,9},{18,36,10},{32,6,1},{32,6,1},{20,28,146},{20,10,77},{20,8,122},{20,8,77},{4,28,243},{4,40,78},{4,8,5},{4,38,110},{32,40,244},{2,38,79},{36,12,73},{36,40,2},{6,8,18},{36,8,18},{38,6,243},{34,40,73},{4,8,5},{2,38,75},{27,0,243},{2,38,75},{20,26,73},{20,26,73},{20,26,73}, +{20,8,76},{4,26,50},{4,8,4},{4,8,4},{4,22,4},{2,8,50},{18,22,2},{36,40,1},{36,40,1},{36,40,1},{36,38,2},{8,2,50},{4,8,4},{4,8,4},{18,22,1},{30,2,50},{18,22,1},{16,11,72},{36,40,1},{6,8,2},{4,8,1},{16,11,72},{25,0,72},{4,8,1},{0,38,74},{25,0,72},{0,38,74},{20,0,72},{20,0,72},{20,0,72},{20,0,72},{4,24,0}, +{4,24,0},{4,24,0},{4,6,4},{18,22,2},{18,22,2},{6,14,154},{6,26,85},{6,40,109},{6,24,97},{20,14,248},{20,10,78},{20,40,13},{20,8,110},{2,26,244},{34,8,91},{22,12,76},{22,10,9},{22,40,9},{22,24,29},{26,2,243},{20,10,74},{20,40,9},{2,24,80},{38,8,243},{2,24,80},{6,42,80},{6,42,80},{6,42,80},{6,24,81},{20,12,54},{20,40,9},{20,40,9}, +{20,38,13},{34,24,53},{34,8,10},{22,10,5},{22,10,5},{22,10,5},{22,8,5},{24,4,50},{36,24,1},{36,24,1},{34,8,9},{11,0,50},{34,8,9},{26,4,72},{22,10,5},{22,40,5},{4,40,5},{26,4,72},{7,0,72},{4,40,5},{0,24,80},{7,0,72},{0,24,80},{6,0,80},{6,0,80},{6,0,80},{6,0,80},{20,10,4},{20,10,4},{20,10,4},{20,38,4},{34,8,1}, +{34,8,1},{22,46,146},{22,12,83},{38,26,122},{22,10,79},{6,30,245},{6,42,74},{6,10,10},{6,40,111},{4,42,247},{20,40,79},{38,14,76},{38,12,5},{8,10,21},{38,10,17},{44,0,243},{6,42,73},{6,10,9},{4,40,74},{26,8,243},{4,40,74},{22,28,75},{22,28,75},{22,28,75},{22,10,75},{6,28,51},{6,10,6},{6,10,6},{6,24,6},{4,10,53},{20,24,6},{38,12,4}, +{38,12,4},{38,12,4},{38,40,5},{38,10,50},{22,40,4},{22,40,4},{36,24,1},{23,0,50},{36,24,1},{42,6,72},{38,12,1},{8,10,5},{6,10,5},{42,6,72},{19,0,72},{6,10,5},{0,40,74},{19,0,72},{0,40,74},{22,0,74},{22,0,74},{22,0,74},{22,0,74},{6,26,2},{6,26,2},{6,26,2},{6,8,5},{20,24,5},{20,24,5},{8,46,154},{8,28,85},{8,42,106}, +{8,42,97},{38,46,247},{38,12,82},{38,42,10},{22,26,119},{4,28,247},{36,26,83},{24,14,75},{24,28,6},{24,42,6},{24,26,30},{30,0,243},{38,12,78},{38,42,6},{4,26,75},{33,0,243},{4,26,75},{8,44,80},{8,44,80},{8,44,80},{8,26,80},{38,28,56},{38,26,9},{38,26,9},{38,40,14},{20,42,54},{6,10,9},{24,12,1},{24,12,1},{24,12,1},{24,10,5},{28,2,50}, +{38,26,5},{38,26,5},{6,10,5},{42,8,50},{6,10,5},{30,2,72},{8,28,5},{24,42,5},{22,42,1},{30,2,72},{35,2,72},{22,42,1},{0,26,74},{35,2,72},{0,26,74},{8,0,80},{8,0,80},{8,0,80},{8,0,80},{38,26,5},{38,26,5},{38,26,5},{38,40,5},{6,40,4},{6,40,4},{24,15,146},{24,14,83},{24,28,126},{24,12,79},{8,31,243},{8,44,78},{8,12,9}, +{8,42,110},{36,44,245},{22,42,79},{40,46,75},{40,14,6},{10,12,21},{40,12,14},{47,0,243},{8,44,78},{8,12,9},{6,42,74},{27,6,243},{6,42,74},{24,30,75},{24,30,75},{24,30,75},{24,12,75},{8,14,52},{8,12,5},{8,12,5},{8,26,5},{6,12,53},{22,26,6},{40,14,2},{40,14,2},{40,14,2},{40,42,1},{16,3,50},{24,42,4},{24,42,4},{38,26,1},{17,0,50}, +{38,26,1},{47,2,72},{40,14,5},{10,12,5},{8,12,5},{47,2,72},{17,2,72},{8,12,5},{0,42,74},{17,2,72},{0,42,74},{24,0,74},{24,0,74},{24,0,74},{24,0,74},{8,28,0},{8,28,0},{8,28,0},{8,10,1},{22,26,5},{22,26,5},{10,15,152},{10,30,85},{10,44,106},{40,44,95},{40,31,252},{24,14,90},{40,44,15},{24,12,122},{6,30,247},{38,28,89},{26,47,73}, +{26,30,6},{26,44,6},{26,28,21},{34,3,243},{8,30,76},{40,44,6},{6,28,80},{35,4,243},{6,28,80},{10,46,80},{10,46,80},{10,46,80},{10,28,81},{40,30,59},{40,28,10},{40,28,10},{24,42,18},{22,44,51},{8,12,9},{26,14,1},{26,14,1},{26,14,1},{26,12,5},{30,4,50},{40,28,1},{40,28,1},{8,12,5},{15,8,50},{8,12,5},{15,2,72},{10,30,5},{26,44,5}, +{24,44,1},{15,2,72},{33,4,72},{24,44,1},{0,28,80},{33,4,72},{0,28,80},{10,0,80},{10,0,80},{10,0,80},{10,0,80},{40,28,9},{40,28,9},{40,28,9},{24,42,9},{8,12,5},{8,12,5},{26,13,152},{26,47,89},{42,30,122},{26,14,89},{10,29,245},{10,46,74},{10,30,15},{10,44,106},{8,46,247},{24,44,81},{42,45,76},{42,47,9},{12,30,18},{42,14,17},{4,1,243}, +{10,46,73},{26,14,10},{8,44,80},{1,4,243},{8,44,80},{26,15,80},{26,15,80},{26,15,80},{26,14,80},{10,31,51},{10,30,6},{10,30,6},{10,28,6},{24,14,54},{24,28,6},{42,47,5},{42,47,5},{42,47,5},{42,44,5},{45,0,50},{26,14,1},{26,14,1},{40,28,1},{27,8,50},{40,28,1},{46,10,72},{12,46,5},{12,30,9},{26,14,9},{46,10,72},{23,8,72},{26,14,9}, +{0,44,80},{23,8,72},{0,44,80},{26,0,80},{26,0,80},{26,0,80},{26,0,80},{10,30,2},{10,30,2},{10,30,2},{10,12,5},{24,44,1},{24,44,1},{12,13,148},{12,31,79},{12,46,110},{12,46,83},{42,29,248},{42,47,85},{42,46,5},{26,30,126},{8,31,247},{40,30,83},{28,29,75},{28,47,5},{28,46,5},{28,46,26},{27,0,243},{26,31,80},{42,46,1},{8,30,75},{37,8,243}, +{8,30,75},{12,15,74},{12,15,74},{12,15,74},{12,30,74},{42,15,56},{42,46,5},{42,46,5},{26,14,21},{24,46,56},{10,14,2},{28,47,1},{28,47,1},{28,47,1},{28,14,5},{29,2,50},{42,46,1},{42,46,1},{10,14,1},{35,6,50},{10,14,1},{38,3,72},{28,47,4},{44,46,1},{26,46,1},{38,3,72},{35,8,72},{26,46,1},{0,30,74},{35,8,72},{0,30,74},{12,0,74}, +{12,0,74},{12,0,74},{12,0,74},{42,46,4},{42,46,4},{42,46,4},{42,44,5},{10,14,1},{10,14,1},{28,11,146},{28,45,84},{44,47,121},{28,47,79},{12,27,244},{12,15,79},{12,47,6},{12,46,106},{40,15,244},{26,46,81},{44,43,76},{44,15,6},{14,47,11},{44,47,14},{28,13,243},{42,15,76},{12,47,5},{10,46,80},{27,12,243},{10,46,80},{28,13,75},{28,13,75},{28,13,75}, +{28,47,78},{12,29,51},{12,47,5},{12,47,5},{12,30,6},{10,47,51},{26,30,6},{44,15,5},{44,15,5},{44,15,5},{44,46,5},{43,2,50},{12,47,4},{12,47,4},{42,30,1},{21,8,50},{42,30,1},{41,2,72},{44,15,2},{14,47,2},{12,47,1},{41,2,72},{17,8,72},{12,47,1},{0,46,80},{17,8,72},{0,46,80},{28,0,74},{28,0,74},{28,0,74},{28,0,74},{12,31,1}, +{12,31,1},{12,31,1},{12,14,5},{26,46,1},{26,46,1},{14,11,148},{14,29,79},{14,15,114},{14,31,90},{44,27,248},{28,45,84},{28,15,18},{28,47,115},{10,29,247},{42,47,91},{30,27,75},{30,45,5},{30,15,6},{30,31,21},{40,3,243},{28,45,75},{28,15,9},{10,31,80},{16,9,243},{10,31,80},{14,13,74},{14,13,74},{14,13,74},{14,31,74},{44,13,56},{44,31,6},{44,31,6}, +{44,46,21},{42,31,52},{42,47,10},{30,45,1},{30,45,1},{30,45,1},{30,47,2},{38,1,50},{44,31,2},{44,31,2},{42,47,9},{43,28,50},{42,47,9},{29,12,72},{30,45,4},{30,15,5},{12,15,5},{29,12,72},{26,13,72},{12,15,5},{0,31,80},{26,13,72},{0,31,80},{14,0,74},{14,0,74},{14,0,74},{14,0,74},{44,15,5},{44,15,5},{44,15,5},{44,46,5},{42,47,1}, +{42,47,1},{30,9,154},{46,43,91},{46,29,115},{30,45,85},{14,9,247},{14,13,77},{14,29,18},{14,15,114},{12,13,247},{28,15,79},{46,25,83},{46,43,10},{47,45,21},{46,45,17},{10,1,243},{14,13,73},{30,45,6},{12,15,74},{4,9,243},{12,15,74},{30,11,80},{30,11,80},{30,11,80},{30,45,81},{14,11,56},{14,29,9},{14,29,9},{14,31,6},{12,45,56},{44,31,5},{46,43,9}, +{46,43,9},{46,43,9},{46,15,10},{39,0,50},{30,45,2},{30,45,2},{44,31,1},{9,28,50},{44,31,1},{9,6,72},{46,43,1},{47,45,5},{14,45,5},{9,6,72},{32,7,72},{14,45,5},{0,15,74},{32,7,72},{0,15,74},{30,0,80},{30,0,80},{30,0,80},{30,0,80},{14,13,5},{14,13,5},{14,13,5},{14,31,5},{44,31,4},{44,31,4},{47,9,154},{47,27,81},{47,13,106}, +{47,13,97},{46,9,244},{46,43,79},{46,13,6},{46,45,121},{12,27,248},{44,29,84},{31,25,75},{31,27,6},{31,13,6},{31,29,30},{21,0,243},{46,43,78},{46,13,5},{12,29,75},{18,7,243},{12,29,75},{47,11,80},{47,11,80},{47,11,80},{47,29,80},{46,11,51},{46,13,5},{46,13,5},{46,15,11},{28,13,54},{14,45,6},{31,43,1},{31,43,1},{31,43,1},{31,29,5},{23,2,50}, +{46,13,4},{46,13,4},{14,45,5},{20,9,50},{14,45,5},{21,2,72},{47,27,1},{15,13,5},{30,13,1},{21,2,72},{24,9,72},{30,13,1},{0,29,74},{24,9,72},{0,29,74},{47,0,80},{47,0,80},{47,0,80},{47,0,80},{46,13,1},{46,13,1},{46,13,1},{46,15,2},{14,45,2},{14,45,2},{31,7,146},{31,41,83},{31,27,126},{31,43,79},{47,23,243},{47,11,78},{47,43,5}, +{47,13,110},{14,11,247},{30,13,79},{15,9,75},{15,11,2},{15,27,21},{15,43,14},{14,3,243},{47,11,78},{47,43,5},{14,13,74},{32,5,243},{14,13,74},{31,9,75},{31,9,75},{31,9,75},{31,43,75},{47,25,52},{47,43,1},{47,43,1},{47,29,5},{14,43,56},{46,29,5},{15,11,1},{15,11,1},{15,11,1},{15,13,1},{37,2,50},{47,43,1},{47,43,1},{46,29,1},{34,7,50}, +{46,29,1},{35,2,72},{15,11,1},{45,43,5},{47,43,4},{35,2,72},{34,5,72},{47,43,4},{0,13,74},{34,5,72},{0,13,74},{31,0,74},{31,0,74},{31,0,74},{31,0,74},{47,27,1},{47,27,1},{47,27,1},{47,45,1},{46,29,4},{46,29,4},{45,7,152},{45,25,81},{45,11,106},{45,11,97},{15,23,253},{31,25,90},{31,11,15},{31,43,122},{14,25,247},{46,27,89},{29,39,73}, +{29,25,6},{29,11,6},{29,27,26},{46,3,243},{47,25,76},{31,11,6},{14,27,80},{16,3,243},{14,27,80},{45,9,80},{45,9,80},{45,9,80},{45,27,81},{15,25,59},{15,27,10},{15,27,10},{31,13,18},{30,11,54},{46,43,9},{29,41,1},{29,41,1},{29,41,1},{29,43,2},{44,1,50},{15,27,1},{15,27,1},{46,43,5},{26,9,50},{46,43,5},{46,1,72},{45,25,1},{13,11,5}, +{31,11,2},{46,1,72},{26,7,72},{31,11,2},{0,27,80},{26,7,72},{0,27,80},{45,0,80},{45,0,80},{45,0,80},{45,0,80},{15,27,9},{15,27,9},{15,27,9},{31,13,9},{47,13,5},{47,13,5},{29,5,154},{29,39,89},{13,25,122},{29,41,89},{45,21,245},{45,9,74},{45,41,15},{45,11,106},{47,9,247},{31,11,85},{13,37,76},{13,9,9},{43,25,18},{13,41,17},{1,0,243}, +{45,9,73},{29,41,10},{47,11,80},{0,1,243},{47,11,80},{29,7,80},{29,7,80},{29,7,80},{29,41,80},{45,23,51},{45,41,6},{45,41,6},{45,27,6},{31,41,54},{31,27,6},{13,9,5},{13,9,5},{13,9,5},{13,11,5},{31,5,50},{29,41,1},{29,41,1},{15,27,1},{14,9,50},{15,27,1},{27,9,72},{13,9,5},{43,25,9},{29,41,9},{27,9,72},{14,7,72},{29,41,9}, +{0,11,80},{14,7,72},{0,11,80},{29,0,80},{29,0,80},{29,0,80},{29,0,80},{45,25,1},{45,25,1},{45,25,1},{45,27,5},{31,11,5},{31,11,5},{43,5,148},{43,23,79},{43,9,110},{43,9,83},{13,21,248},{13,39,85},{13,9,9},{29,25,126},{47,23,248},{15,25,83},{27,21,75},{27,23,6},{27,9,5},{27,9,26},{15,1,243},{29,23,74},{13,9,5},{31,25,75},{9,11,243}, +{31,25,75},{43,7,74},{43,7,74},{43,7,74},{43,25,74},{13,7,56},{13,9,9},{13,9,9},{13,11,21},{15,9,56},{15,41,6},{27,39,1},{27,39,1},{27,39,1},{27,25,5},{17,2,50},{43,25,4},{43,25,4},{15,41,2},{16,1,50},{15,41,2},{17,6,72},{27,23,5},{11,9,1},{29,9,0},{17,6,72},{20,1,72},{29,9,0},{0,25,74},{20,1,72},{0,25,74},{43,0,74}, +{43,0,74},{43,0,74},{43,0,74},{13,9,5},{13,9,5},{13,9,5},{13,11,5},{15,41,5},{15,41,5},{27,3,146},{27,37,83},{27,23,119},{27,39,79},{43,19,244},{43,7,79},{43,39,10},{43,9,106},{15,7,245},{29,9,85},{11,35,76},{11,7,9},{41,39,14},{11,39,17},{27,5,243},{13,7,78},{27,39,9},{45,9,80},{6,1,243},{45,9,80},{27,5,75},{27,5,75},{27,5,75}, +{27,39,75},{43,21,51},{43,39,6},{43,39,6},{43,25,6},{45,39,53},{29,25,6},{11,7,5},{11,7,5},{11,7,5},{11,9,5},{29,3,50},{27,39,5},{27,39,5},{13,25,1},{43,9,50},{13,25,1},{27,3,72},{41,7,4},{41,39,5},{27,39,5},{27,3,72},{39,9,72},{27,39,5},{0,9,80},{39,9,72},{0,9,80},{27,0,74},{27,0,74},{27,0,74},{27,0,74},{43,23,1}, +{43,23,1},{43,23,1},{43,25,5},{29,9,5},{29,9,5},{41,3,148},{41,21,79},{41,7,111},{41,7,91},{11,19,248},{11,37,85},{11,7,10},{27,39,122},{45,21,248},{13,23,83},{25,19,75},{25,21,6},{25,7,6},{25,23,30},{17,10,243},{27,21,81},{11,7,6},{29,23,75},{24,1,243},{29,23,75},{41,5,74},{41,5,74},{41,5,74},{41,23,74},{11,5,56},{11,7,9},{11,7,9}, +{11,9,21},{29,7,54},{13,39,5},{25,37,1},{25,37,1},{25,37,1},{25,39,2},{39,11,50},{41,23,4},{41,23,4},{13,39,4},{22,1,50},{13,39,4},{39,7,72},{25,21,5},{9,7,5},{27,7,2},{39,7,72},{26,1,72},{27,7,2},{0,23,74},{26,1,72},{0,23,74},{41,0,74},{41,0,74},{41,0,74},{41,0,74},{11,7,5},{11,7,5},{11,7,5},{11,9,5},{13,39,1}, +{13,39,1},{25,1,154},{9,35,91},{9,21,110},{25,37,89},{41,1,247},{41,5,77},{41,21,13},{41,7,109},{43,5,247},{27,7,85},{39,19,81},{9,35,10},{39,21,13},{9,37,22},{41,1,243},{41,5,73},{41,21,9},{43,7,80},{47,3,243},{43,7,80},{25,3,80},{25,3,80},{25,3,80},{25,37,80},{41,3,56},{41,21,9},{41,21,9},{41,23,9},{27,37,54},{11,23,9},{39,21,9}, +{39,21,9},{39,21,9},{9,7,10},{25,5,50},{25,37,1},{25,37,1},{11,23,5},{10,1,50},{11,23,5},{23,5,72},{9,35,1},{39,21,4},{11,21,4},{23,5,72},{14,1,72},{11,21,4},{0,7,80},{14,1,72},{0,7,80},{25,0,80},{25,0,80},{25,0,80},{25,0,80},{41,5,5},{41,5,5},{41,5,5},{41,23,5},{27,7,5},{27,7,5},{39,1,148},{39,3,79},{39,5,110}, +{39,5,83},{9,1,244},{9,35,79},{9,5,5},{9,21,122},{43,19,248},{11,21,77},{23,17,72},{23,19,2},{23,5,4},{23,5,25},{9,1,243},{25,19,74},{9,5,4},{27,21,73},{46,1,243},{27,21,73},{39,3,75},{39,3,75},{39,3,75},{39,21,75},{9,3,51},{9,5,5},{9,5,5},{9,7,18},{11,5,53},{41,37,2},{23,19,1},{23,19,1},{23,19,1},{23,21,1},{9,3,50}, +{9,5,4},{9,5,4},{41,37,1},{31,3,50},{41,37,1},{23,17,72},{23,19,2},{7,5,4},{25,5,0},{23,17,72},{45,17,72},{25,5,0},{0,21,72},{45,17,72},{0,21,72},{39,0,74},{39,0,74},{39,0,74},{39,0,74},{9,5,1},{9,5,1},{9,5,1},{9,7,2},{41,37,1},{41,37,1},{7,1,184},{23,17,93},{7,19,122},{23,35,89},{23,1,260},{39,3,74},{39,35,15}, +{39,5,106},{41,3,247},{25,5,85},{37,17,81},{7,33,5},{37,19,19},{7,35,17},{19,9,243},{39,3,73},{23,35,10},{41,5,80},{45,1,243},{41,5,80},{23,1,80},{23,1,80},{23,1,80},{23,35,80},{39,17,51},{39,35,6},{39,35,6},{39,21,6},{25,35,54},{9,21,9},{7,33,4},{7,33,4},{7,33,4},{7,5,5},{23,3,50},{23,35,1},{23,35,1},{9,21,5},{43,3,50}, +{9,21,5},{21,3,72},{7,33,1},{37,19,10},{23,35,9},{21,3,72},{43,1,72},{23,35,9},{0,5,80},{43,1,72},{0,5,80},{23,0,80},{23,0,80},{23,0,80},{23,0,80},{39,19,1},{39,19,1},{39,19,1},{39,21,2},{25,5,5},{25,5,5},{21,1,234},{37,1,79},{37,3,110},{37,3,90},{37,1,300},{7,33,82},{7,3,9},{23,19,139},{41,17,248},{9,19,83},{21,1,90}, +{21,17,2},{21,3,4},{21,3,25},{21,17,243},{23,17,74},{7,3,5},{25,19,75},{17,21,243},{25,19,75},{37,1,75},{37,1,75},{37,1,75},{37,19,74},{7,1,56},{7,19,6},{7,19,6},{7,5,21},{9,3,53},{9,35,6},{21,17,1},{21,17,1},{21,17,1},{21,19,4},{3,25,50},{7,19,2},{7,19,2},{9,35,2},{29,1,50},{9,35,2},{17,39,72},{21,17,2},{5,3,4}, +{23,3,0},{17,39,72},{39,17,72},{23,3,0},{0,19,74},{39,17,72},{0,19,74},{37,0,74},{37,0,74},{37,0,74},{37,0,74},{7,3,5},{7,3,5},{7,3,5},{7,5,5},{9,35,5},{9,35,5},{5,1,290},{5,1,103},{5,17,110},{21,33,106},{5,1,345},{37,1,78},{37,17,13},{37,3,119},{39,1,248},{23,3,91},{35,1,126},{35,1,6},{35,17,8},{5,33,29},{35,1,243}, +{37,1,74},{37,17,9},{9,33,81},{1,35,243},{9,33,81},{5,1,94},{5,1,94},{5,1,94},{21,33,90},{21,1,61},{37,17,9},{37,17,9},{37,19,9},{23,33,53},{7,19,8},{35,17,4},{35,17,4},{35,17,4},{35,3,4},{19,5,50},{21,33,0},{21,33,0},{7,19,4},{37,3,50},{7,19,4},{17,5,72},{35,1,2},{35,17,4},{7,17,4},{17,5,72},{5,17,72},{7,17,4}, +{0,33,80},{5,17,72},{0,33,80},{5,0,90},{5,0,90},{5,0,90},{5,0,90},{37,1,4},{37,1,4},{37,1,4},{37,19,5},{23,3,1},{23,3,1},{19,1,349},{35,1,185},{35,1,121},{35,1,81},{19,1,398},{5,1,102},{5,1,2},{21,17,122},{37,1,270},{7,17,66},{3,1,126},{19,1,45},{19,1,9},{19,1,25},{33,33,221},{35,1,82},{5,1,1},{23,17,61},{33,33,221}, +{23,17,61},{35,1,121},{35,1,121},{35,1,121},{35,17,73},{35,1,94},{5,1,2},{5,1,2},{5,33,17},{7,1,53},{37,33,1},{19,1,9},{19,1,9},{19,1,9},{19,17,1},{3,3,50},{5,1,1},{5,1,1},{37,33,0},{3,3,50},{37,33,0},{1,3,61},{33,1,25},{3,1,1},{5,1,1},{1,3,61},{3,1,61},{5,1,1},{0,17,61},{3,1,61},{0,17,61},{35,0,72}, +{35,0,72},{35,0,72},{35,0,72},{5,1,1},{5,1,1},{5,1,1},{5,3,1},{37,33,1},{37,33,1},{3,1,239},{3,1,164},{3,1,139},{19,1,89},{3,1,239},{19,1,62},{19,1,26},{35,17,34},{35,1,163},{21,1,10},{33,1,69},{33,1,29},{33,1,20},{33,1,4},{1,3,93},{3,1,38},{19,1,10},{21,1,10},{3,1,93},{21,1,10},{3,1,139},{3,1,139},{3,1,139}, +{19,1,89},{19,1,138},{19,1,26},{19,1,26},{35,17,9},{5,1,74},{5,17,8},{33,1,20},{33,1,20},{33,1,20},{33,1,4},{17,3,50},{19,1,10},{19,1,10},{5,17,4},{35,1,50},{5,17,4},{1,17,5},{17,1,1},{17,1,0},{33,1,0},{1,17,5},{17,1,5},{33,1,0},{0,1,9},{17,1,5},{0,1,9},{19,0,80},{19,0,80},{19,0,80},{19,0,80},{19,1,17}, +{19,1,17},{19,1,17},{35,17,5},{21,1,1},{21,1,1},{17,1,162},{33,1,130},{33,1,121},{33,1,81},{33,1,138},{33,1,58},{33,1,49},{3,1,1},{19,1,82},{19,1,10},{17,1,18},{17,1,10},{17,1,9},{17,1,1},{1,17,18},{17,1,6},{17,1,5},{3,1,0},{17,1,18},{3,1,0},{33,1,121},{33,1,121},{33,1,121},{33,1,81},{33,1,89},{33,1,49},{33,1,49}, +{3,1,1},{19,1,46},{19,1,10},{17,1,9},{17,1,9},{17,1,9},{17,1,1},{17,1,13},{17,1,5},{17,1,5},{3,1,0},{33,1,13},{3,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{33,0,72},{33,0,72},{33,0,72},{33,0,72},{3,1,26},{3,1,26},{3,1,26},{3,1,1},{19,1,10}, +{19,1,10},{0,38,200},{0,20,25},{0,34,5},{0,34,85},{0,20,442},{0,34,266},{0,18,125},{0,2,318},{0,18,482},{0,2,343},{0,38,200},{0,20,25},{0,34,5},{0,34,85},{16,4,441},{0,34,266},{0,18,125},{0,2,318},{4,16,441},{0,2,318},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,2,41},{0,32,13},{0,32,13},{0,16,25},{0,16,46},{0,16,26},{0,4,1}, +{0,4,1},{0,4,1},{0,2,1},{0,2,41},{0,32,13},{0,32,13},{0,16,25},{2,0,41},{0,16,25},{18,2,200},{0,20,25},{0,34,5},{0,34,85},{18,2,200},{38,0,200},{0,34,85},{0,18,208},{38,0,200},{0,18,208},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,10,202},{0,22,1},{0,20,26}, +{0,4,41},{0,22,689},{0,20,352},{0,4,141},{0,18,468},{0,34,750},{0,18,504},{0,10,202},{0,22,1},{0,20,26},{0,4,41},{34,0,686},{0,20,352},{0,4,141},{0,18,468},{0,34,686},{0,18,468},{0,22,0},{0,22,0},{0,22,0},{0,34,1},{0,34,145},{0,18,45},{0,18,45},{0,32,85},{0,32,158},{0,32,94},{0,22,0},{0,22,0},{0,22,0},{0,34,1},{16,2,145}, +{0,18,45},{0,18,45},{0,32,85},{34,0,145},{0,32,85},{20,16,200},{0,22,1},{16,20,5},{0,4,41},{20,16,200},{16,20,200},{0,4,41},{0,34,200},{16,20,200},{0,34,200},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{16,12,229},{16,8,30},{16,6,74},{16,36,58},{0,10,723},{0,6,282},{0,36,69}, +{0,4,414},{0,20,868},{0,34,513},{16,12,204},{16,8,5},{32,6,29},{16,36,33},{4,2,723},{0,6,282},{0,36,69},{0,4,414},{10,0,723},{0,4,414},{16,8,30},{16,8,30},{16,8,30},{16,4,33},{0,6,164},{0,4,25},{0,4,25},{0,18,65},{0,18,206},{0,18,101},{16,8,5},{16,8,5},{16,8,5},{16,4,8},{2,2,162},{0,4,25},{0,4,25},{0,18,65},{2,2,162}, +{0,18,65},{18,8,200},{16,8,1},{2,36,5},{0,36,20},{18,8,200},{44,0,200},{0,36,20},{0,4,218},{44,0,200},{0,4,218},{16,0,29},{16,0,29},{16,0,29},{16,0,29},{0,18,1},{0,18,1},{0,18,1},{0,32,0},{0,32,9},{0,32,9},{16,30,327},{32,40,139},{32,22,202},{16,6,151},{0,28,724},{0,8,236},{0,22,14},{0,20,350},{0,6,956},{0,20,494},{2,12,203}, +{2,24,2},{2,22,27},{2,6,42},{36,2,723},{0,8,236},{0,22,14},{0,20,350},{20,4,723},{0,20,350},{16,42,125},{16,42,125},{16,42,125},{16,6,126},{0,24,164},{0,6,1},{0,6,1},{0,4,37},{0,4,280},{0,34,109},{2,24,1},{2,24,1},{2,24,1},{2,36,2},{18,4,162},{0,6,1},{0,6,1},{0,4,37},{36,2,162},{0,4,37},{8,0,200},{2,24,1},{18,22,5}, +{0,22,10},{8,0,200},{47,0,200},{0,22,10},{0,36,200},{47,0,200},{0,36,200},{16,0,125},{16,0,125},{16,0,125},{16,0,125},{0,6,0},{0,6,0},{0,6,0},{0,18,1},{0,18,37},{0,18,37},{2,46,410},{2,26,218},{2,8,317},{2,38,226},{16,30,725},{16,40,217},{16,38,15},{0,6,312},{0,38,988},{0,6,417},{34,28,209},{18,26,13},{34,8,27},{18,38,34},{8,0,723}, +{0,40,203},{16,38,14},{0,6,296},{47,0,723},{0,6,296},{2,12,208},{2,12,208},{2,12,208},{2,22,209},{16,42,163},{16,38,6},{16,38,6},{16,20,26},{0,6,285},{0,20,81},{18,26,9},{18,26,9},{18,26,9},{34,6,10},{2,24,162},{32,22,5},{32,22,5},{0,20,17},{28,0,162},{0,20,17},{24,2,200},{18,26,4},{4,8,9},{0,8,10},{24,2,200},{13,0,200},{0,8,10}, +{0,22,208},{13,0,200},{0,22,208},{2,0,208},{2,0,208},{2,0,208},{2,0,208},{16,8,1},{16,8,1},{16,8,1},{16,4,2},{0,4,45},{0,4,45},{18,15,402},{18,12,222},{34,24,331},{18,24,218},{32,47,725},{32,26,212},{32,24,5},{32,38,324},{0,24,884},{0,38,300},{4,30,200},{4,26,5},{4,24,36},{4,8,41},{40,0,723},{16,26,203},{32,24,4},{0,38,251},{46,2,723}, +{0,38,251},{18,14,203},{18,14,203},{18,14,203},{18,8,202},{32,28,163},{32,24,5},{32,24,5},{32,6,21},{0,38,219},{0,6,13},{4,26,1},{4,26,1},{4,26,1},{4,38,0},{22,2,162},{2,8,1},{2,8,1},{0,6,4},{42,2,162},{0,6,4},{16,11,200},{34,42,4},{20,24,4},{32,24,0},{16,11,200},{25,0,200},{32,24,0},{0,38,202},{25,0,200},{0,38,202},{18,0,202}, +{18,0,202},{18,0,202},{18,0,202},{32,40,1},{32,40,1},{32,40,1},{32,36,1},{0,6,9},{0,6,9},{4,15,408},{4,28,221},{4,10,317},{4,40,221},{18,31,725},{18,42,217},{18,40,6},{2,8,315},{0,26,788},{0,8,228},{20,47,204},{20,12,6},{36,10,27},{20,40,33},{10,2,723},{32,12,203},{18,40,5},{0,8,227},{45,2,723},{0,8,227},{4,14,208},{4,14,208},{4,14,208}, +{4,24,209},{18,44,163},{18,40,2},{18,40,2},{18,22,26},{0,24,179},{0,38,3},{20,12,5},{20,12,5},{20,12,5},{20,24,5},{8,2,162},{18,40,1},{18,40,1},{0,38,2},{30,2,162},{0,38,2},{26,4,200},{20,12,2},{6,40,5},{18,40,4},{26,4,200},{7,0,200},{18,40,4},{0,24,208},{7,0,200},{0,24,208},{4,0,208},{4,0,208},{4,0,208},{4,0,208},{18,10,1}, +{18,10,1},{18,10,1},{18,6,2},{0,38,2},{0,38,2},{20,13,402},{20,14,220},{36,26,331},{20,26,216},{34,45,725},{34,12,213},{34,26,5},{34,24,337},{0,12,740},{16,40,216},{6,31,202},{6,28,1},{6,26,36},{6,10,41},{42,2,723},{18,28,200},{34,26,4},{0,40,209},{44,6,723},{0,40,209},{20,46,200},{20,46,200},{20,46,200},{20,10,201},{34,30,163},{34,26,5},{34,26,5}, +{34,8,18},{0,26,164},{32,8,2},{6,28,0},{6,28,0},{6,28,0},{6,40,1},{24,4,162},{4,10,1},{4,10,1},{2,8,2},{11,0,162},{2,8,2},{14,0,200},{6,28,1},{22,26,4},{34,26,0},{14,0,200},{8,10,200},{34,26,0},{0,40,200},{8,10,200},{0,40,200},{20,0,200},{20,0,200},{20,0,200},{20,0,200},{34,42,1},{34,42,1},{34,42,1},{34,38,1},{32,8,1}, +{32,8,1},{6,13,404},{6,30,219},{6,12,327},{6,42,215},{20,29,725},{20,44,217},{20,12,9},{4,10,321},{0,14,723},{32,26,222},{38,15,206},{38,14,8},{38,12,24},{22,42,34},{14,0,723},{4,14,203},{20,12,8},{0,26,203},{8,10,723},{0,26,203},{6,47,202},{6,47,202},{6,47,202},{6,26,206},{20,46,163},{20,12,5},{20,12,5},{20,24,30},{32,42,164},{2,40,6},{38,44,4}, +{38,44,4},{38,44,4},{38,10,5},{38,10,162},{20,12,4},{20,12,4},{2,40,2},{23,0,162},{2,40,2},{30,2,200},{38,14,4},{8,12,4},{4,12,4},{30,2,200},{35,2,200},{4,12,4},{0,26,202},{35,2,200},{0,26,202},{6,0,202},{6,0,202},{6,0,202},{6,0,202},{20,12,1},{20,12,1},{20,12,1},{20,8,2},{2,10,4},{2,10,4},{22,11,402},{22,47,227},{38,44,321}, +{22,28,218},{36,27,727},{36,30,215},{36,28,13},{36,42,327},{32,30,725},{18,42,212},{8,29,200},{8,30,4},{24,28,29},{8,12,45},{0,1,723},{20,30,203},{6,28,5},{32,42,202},{1,0,723},{32,42,202},{22,15,202},{22,15,202},{22,15,202},{22,12,202},{36,15,168},{36,28,13},{36,28,13},{36,10,17},{2,28,163},{34,10,9},{8,30,0},{8,30,0},{8,30,0},{8,42,0},{28,2,162}, +{6,12,5},{6,12,5},{4,10,4},{42,8,162},{4,10,4},{47,2,200},{8,30,4},{24,28,4},{36,28,0},{47,2,200},{17,2,200},{36,28,0},{0,42,202},{17,2,200},{0,42,202},{22,0,202},{22,0,202},{22,0,202},{22,0,202},{36,14,5},{36,14,5},{36,14,5},{36,40,4},{34,26,2},{34,26,2},{8,11,408},{8,31,221},{8,14,312},{8,44,226},{22,27,724},{22,46,217},{22,44,12}, +{6,12,321},{2,47,728},{34,28,234},{40,29,209},{24,47,10},{40,14,22},{24,44,34},{18,3,723},{36,47,203},{22,44,11},{32,28,208},{45,8,723},{32,28,208},{8,15,209},{8,15,209},{8,15,209},{8,28,209},{22,15,165},{22,44,3},{22,44,3},{22,26,30},{34,44,164},{4,42,6},{40,30,10},{40,30,10},{40,30,10},{40,12,10},{16,3,162},{22,44,2},{22,44,2},{4,42,2},{17,0,162}, +{4,42,2},{15,2,200},{24,47,1},{10,14,4},{6,14,5},{15,2,200},{33,4,200},{6,14,5},{0,28,208},{33,4,200},{0,28,208},{8,0,208},{8,0,208},{8,0,208},{8,0,208},{22,14,1},{22,14,1},{22,14,1},{22,10,2},{4,12,4},{4,12,4},{24,9,402},{24,45,227},{40,46,324},{24,30,218},{38,25,727},{38,47,213},{38,30,13},{38,28,325},{34,31,727},{20,44,218},{10,27,202}, +{10,31,1},{26,30,29},{10,14,45},{4,3,723},{22,31,200},{8,30,8},{34,44,202},{3,4,723},{34,44,202},{24,13,202},{24,13,202},{24,13,202},{24,14,202},{38,13,168},{38,30,13},{38,30,13},{38,12,17},{4,30,163},{36,12,9},{10,31,0},{10,31,0},{10,31,0},{10,44,0},{30,4,162},{8,14,4},{8,14,4},{6,12,4},{15,8,162},{6,12,4},{43,0,200},{10,31,1},{26,30,4}, +{38,30,0},{43,0,200},{19,6,200},{38,30,0},{0,44,202},{19,6,200},{0,44,202},{24,0,202},{24,0,202},{24,0,202},{24,0,202},{38,46,5},{38,46,5},{38,46,5},{38,42,4},{20,28,4},{20,28,4},{10,9,404},{10,29,219},{26,47,330},{10,46,222},{24,9,723},{24,15,209},{24,47,18},{8,14,324},{4,45,723},{36,30,222},{42,11,206},{42,15,8},{42,47,22},{26,46,41},{43,0,723}, +{8,15,202},{24,47,18},{4,30,202},{19,6,723},{4,30,202},{10,43,202},{10,43,202},{10,43,202},{10,30,206},{24,13,162},{24,46,8},{24,46,8},{24,44,25},{20,47,168},{22,44,4},{42,15,4},{42,15,4},{42,15,4},{42,14,8},{45,0,162},{40,46,4},{40,46,4},{22,44,0},{27,8,162},{22,44,0},{38,3,200},{42,15,4},{12,47,9},{8,47,10},{38,3,200},{35,8,200},{8,47,10}, +{0,30,202},{35,8,200},{0,30,202},{10,0,202},{10,0,202},{10,0,202},{10,0,202},{24,47,0},{24,47,0},{24,47,0},{24,12,4},{22,44,4},{22,44,4},{26,7,408},{42,13,236},{42,15,332},{26,31,224},{40,23,727},{40,45,213},{40,31,8},{40,46,312},{36,29,725},{22,46,218},{12,25,201},{12,13,6},{28,31,29},{12,47,42},{11,0,723},{24,29,203},{40,31,4},{6,46,209},{5,8,723}, +{6,46,209},{26,41,208},{26,41,208},{26,41,208},{26,47,208},{40,11,168},{40,31,8},{40,31,8},{40,14,22},{6,31,163},{38,30,10},{12,13,2},{12,13,2},{12,13,2},{12,46,2},{29,2,162},{10,47,2},{10,47,2},{22,30,9},{35,6,162},{22,30,9},{41,2,200},{42,13,4},{44,31,1},{40,31,0},{41,2,200},{17,8,200},{40,31,0},{0,46,208},{17,8,200},{0,46,208},{26,0,208}, +{26,0,208},{26,0,208},{26,0,208},{40,15,4},{40,15,4},{40,15,4},{40,44,5},{38,30,1},{38,30,1},{12,7,404},{12,27,212},{12,45,332},{12,15,215},{26,23,724},{26,13,216},{26,15,8},{26,47,318},{6,43,723},{8,47,227},{44,9,206},{44,13,8},{44,45,22},{28,15,38},{24,3,723},{10,13,202},{26,15,8},{6,31,209},{3,24,723},{6,31,209},{12,41,202},{12,41,202},{12,41,202}, +{12,31,203},{26,11,162},{26,15,4},{26,15,4},{26,46,25},{38,15,162},{24,46,4},{44,13,4},{44,13,4},{44,13,4},{44,47,5},{43,2,162},{26,15,4},{26,15,4},{24,46,0},{21,8,162},{24,46,0},{29,12,200},{28,43,2},{14,15,8},{26,15,4},{29,12,200},{26,13,200},{26,15,4},{0,31,208},{26,13,200},{0,31,208},{12,0,202},{12,0,202},{12,0,202},{12,0,202},{26,45,0}, +{26,45,0},{26,45,0},{26,14,4},{24,46,4},{24,46,4},{28,5,402},{28,41,222},{44,13,332},{28,29,218},{42,21,727},{42,43,213},{42,29,8},{42,31,340},{38,27,724},{24,15,217},{14,23,201},{14,27,3},{30,29,29},{14,45,42},{9,2,723},{26,27,201},{42,29,4},{22,15,201},{2,9,723},{22,15,201},{28,9,202},{28,9,202},{28,9,202},{28,45,203},{42,9,168},{42,29,8},{42,29,8}, +{42,47,21},{8,29,163},{40,47,2},{14,11,2},{14,11,2},{14,11,2},{14,15,2},{38,1,162},{12,45,2},{12,45,2},{10,47,2},{43,28,162},{10,47,2},{37,0,200},{14,27,2},{46,29,1},{42,29,0},{37,0,200},{36,9,200},{42,29,0},{0,15,200},{36,9,200},{0,15,200},{28,0,202},{28,0,202},{28,0,202},{28,0,202},{42,13,4},{42,13,4},{42,13,4},{42,46,5},{40,47,1}, +{40,47,1},{14,35,400},{14,25,217},{30,43,340},{14,13,213},{28,5,723},{28,11,209},{28,43,8},{12,45,332},{8,41,724},{40,29,222},{46,7,201},{46,41,2},{46,43,21},{30,13,41},{37,0,723},{12,41,203},{28,43,8},{8,29,202},{36,9,723},{8,29,202},{14,23,201},{14,23,201},{14,23,201},{14,13,204},{28,9,162},{28,43,4},{28,43,4},{28,31,29},{40,13,164},{26,15,3},{46,11,2}, +{46,11,2},{46,11,2},{46,29,5},{39,0,162},{44,13,2},{44,13,2},{10,15,2},{9,28,162},{10,15,2},{21,2,200},{46,41,1},{47,43,5},{12,43,4},{21,2,200},{24,9,200},{12,43,4},{0,29,202},{24,9,200},{0,29,202},{14,0,200},{14,0,200},{14,0,200},{14,0,200},{28,43,0},{28,43,0},{28,43,0},{28,47,1},{26,15,2},{26,15,2},{30,3,410},{46,9,227},{46,27,318}, +{30,27,224},{14,5,728},{44,25,215},{14,27,8},{44,13,332},{40,25,725},{26,13,212},{47,21,200},{47,25,4},{47,27,25},{47,43,52},{5,0,723},{28,25,203},{14,27,4},{40,13,202},{0,5,723},{40,13,202},{30,7,209},{30,7,209},{30,7,209},{30,43,208},{14,39,166},{14,27,8},{14,27,8},{44,45,22},{10,27,163},{12,45,8},{47,25,0},{47,25,0},{47,25,0},{47,13,0},{23,2,162}, +{14,27,4},{14,27,4},{12,45,4},{20,9,162},{12,45,4},{35,2,200},{47,25,4},{15,27,4},{44,27,0},{35,2,200},{34,5,200},{44,27,0},{0,13,202},{34,5,200},{0,13,202},{30,0,208},{30,0,208},{30,0,208},{30,0,208},{14,27,4},{14,27,4},{14,27,4},{14,15,8},{42,29,2},{42,29,2},{47,3,408},{47,23,218},{47,41,312},{47,11,226},{30,3,723},{30,9,209},{30,41,8}, +{14,43,332},{10,39,723},{12,43,236},{15,21,209},{31,39,10},{15,41,22},{31,11,43},{30,3,723},{44,39,204},{30,41,8},{40,27,208},{42,9,723},{40,27,208},{47,7,209},{47,7,209},{47,7,209},{47,27,208},{30,7,162},{30,41,4},{30,41,4},{30,29,29},{42,11,164},{12,13,6},{31,23,9},{31,23,9},{31,23,9},{31,27,10},{37,2,162},{46,11,2},{46,11,2},{12,13,2},{34,7,162}, +{12,13,2},{46,1,200},{31,39,1},{45,41,5},{14,41,4},{46,1,200},{26,7,200},{14,41,4},{0,27,208},{26,7,200},{0,27,208},{47,0,208},{47,0,208},{47,0,208},{47,0,208},{30,41,0},{30,41,0},{30,41,0},{30,45,1},{12,43,4},{12,43,4},{31,1,402},{31,37,222},{15,9,324},{31,25,218},{46,17,733},{46,23,215},{46,25,18},{46,27,330},{42,23,725},{28,11,219},{45,19,202}, +{45,23,4},{45,25,25},{45,41,52},{3,2,723},{30,23,203},{47,25,8},{42,11,202},{2,3,723},{42,11,202},{31,5,202},{31,5,202},{31,5,202},{31,41,202},{46,5,173},{46,25,18},{46,25,18},{46,43,22},{12,25,163},{14,43,8},{45,23,0},{45,23,0},{45,23,0},{45,11,0},{44,1,162},{47,41,4},{47,41,4},{14,43,4},{26,9,162},{14,43,4},{31,1,200},{45,23,4},{13,25,4}, +{46,25,0},{31,1,200},{32,1,200},{46,25,0},{0,11,202},{32,1,200},{0,11,202},{31,0,202},{31,0,202},{31,0,202},{31,0,202},{46,9,10},{46,9,10},{46,9,10},{46,13,9},{28,27,4},{28,27,4},{45,1,404},{45,21,218},{29,39,325},{45,9,222},{31,1,723},{31,7,209},{31,39,13},{47,41,324},{12,37,725},{44,25,227},{13,3,206},{13,37,9},{13,39,17},{29,9,48},{31,1,723}, +{47,7,208},{31,39,13},{12,25,202},{32,1,723},{12,25,202},{45,35,202},{45,35,202},{45,35,202},{45,25,203},{31,5,162},{31,9,8},{31,9,8},{31,27,29},{14,9,166},{30,11,1},{13,7,4},{13,7,4},{13,7,4},{13,25,8},{31,5,162},{15,9,4},{15,9,4},{30,11,0},{14,9,162},{30,11,0},{17,6,200},{29,21,4},{43,39,4},{46,39,5},{17,6,200},{20,1,200},{46,39,5}, +{0,25,202},{20,1,200},{0,25,202},{45,0,202},{45,0,202},{45,0,202},{45,0,202},{31,39,0},{31,39,0},{31,39,0},{31,27,4},{30,11,1},{30,11,1},{13,1,440},{29,35,234},{13,7,321},{29,23,218},{45,1,732},{15,21,215},{45,23,12},{15,9,312},{44,21,731},{30,9,221},{43,17,201},{43,5,6},{27,23,30},{43,39,46},{45,1,723},{31,21,203},{45,23,3},{14,9,209},{27,9,723}, +{14,9,209},{29,33,208},{29,33,208},{29,33,208},{29,39,208},{15,3,168},{45,23,11},{45,23,11},{15,41,22},{14,23,168},{46,25,10},{43,5,2},{43,5,2},{43,5,2},{43,9,2},{17,2,162},{45,23,2},{45,23,2},{30,25,10},{16,1,162},{30,25,10},{27,3,200},{13,5,4},{11,23,2},{15,23,1},{27,3,200},{39,9,200},{15,23,1},{0,9,208},{39,9,200},{0,9,208},{29,0,208}, +{29,0,208},{29,0,208},{29,0,208},{15,7,5},{15,7,5},{15,7,5},{15,11,4},{46,25,1},{46,25,1},{43,1,500},{43,19,212},{43,37,327},{43,7,220},{13,1,760},{29,5,209},{29,37,13},{45,39,321},{14,35,724},{46,23,227},{11,1,206},{11,35,9},{11,37,17},{27,7,43},{33,10,723},{15,35,204},{29,37,13},{14,23,202},{38,1,723},{14,23,202},{43,33,202},{43,33,202},{43,33,202}, +{43,23,203},{29,3,162},{29,7,5},{29,7,5},{29,25,29},{46,7,165},{31,9,4},{11,5,4},{11,5,4},{11,5,4},{11,39,5},{29,3,162},{13,7,5},{13,7,5},{31,9,0},{43,9,162},{31,9,0},{39,7,200},{27,35,2},{41,37,4},{15,37,5},{39,7,200},{26,1,200},{15,37,5},{0,23,202},{26,1,200},{0,23,202},{43,0,202},{43,0,202},{43,0,202},{43,0,202},{29,37,0}, +{29,37,0},{29,37,0},{29,25,4},{31,9,4},{31,9,4},{11,1,530},{27,33,222},{11,5,321},{27,21,219},{27,1,812},{13,19,215},{13,21,9},{13,7,327},{46,19,724},{31,7,219},{25,1,225},{41,3,6},{25,21,30},{41,37,46},{41,3,723},{29,19,203},{13,21,5},{46,7,202},{21,9,723},{46,7,202},{27,1,203},{27,1,203},{27,1,203},{27,37,202},{13,1,168},{13,21,8},{13,21,8}, +{13,39,24},{47,21,163},{15,39,8},{41,3,2},{41,3,2},{41,3,2},{41,7,1},{39,11,162},{13,21,4},{13,21,4},{45,39,4},{22,1,162},{45,39,4},{25,1,200},{11,3,4},{9,21,2},{13,21,1},{25,1,200},{33,9,200},{13,21,1},{0,7,202},{33,9,200},{0,7,202},{27,0,202},{27,0,202},{27,0,202},{27,0,202},{13,5,4},{13,5,4},{13,5,4},{13,9,4},{15,39,4}, +{15,39,4},{25,1,634},{41,17,216},{25,35,337},{41,5,220},{41,1,863},{27,3,211},{27,35,5},{27,37,331},{47,33,725},{15,21,220},{9,1,251},{9,33,2},{9,35,18},{25,5,48},{25,1,723},{43,33,203},{27,35,5},{47,21,200},{33,9,723},{47,21,200},{41,1,209},{41,1,209},{41,1,209},{41,5,204},{27,1,164},{27,35,4},{27,35,4},{27,7,36},{15,5,164},{29,7,1},{9,3,2}, +{9,3,2},{9,3,2},{9,21,2},{25,5,162},{11,5,1},{11,5,1},{29,7,0},{10,1,162},{29,7,0},{23,17,200},{9,33,1},{39,35,1},{43,35,1},{23,17,200},{45,17,200},{43,35,1},{0,21,200},{45,17,200},{0,21,200},{41,0,200},{41,0,200},{41,0,200},{41,0,200},{27,35,0},{27,35,0},{27,35,0},{27,23,4},{29,7,1},{29,7,1},{39,1,724},{9,1,228},{9,3,315}, +{25,19,218},{9,1,932},{11,17,213},{41,19,6},{11,5,317},{15,17,725},{29,5,221},{23,1,288},{39,1,3},{23,19,26},{39,19,51},{39,1,723},{27,17,203},{41,19,2},{15,5,208},{31,1,723},{15,5,208},{9,1,227},{9,1,227},{9,1,227},{25,35,209},{41,1,174},{41,19,5},{41,19,5},{11,37,27},{45,19,163},{13,21,6},{39,1,2},{39,1,2},{39,1,2},{39,5,2},{9,3,162}, +{41,19,1},{41,19,1},{13,21,5},{31,3,162},{13,21,5},{21,3,200},{39,1,2},{7,19,2},{11,19,1},{21,3,200},{43,1,200},{11,19,1},{0,5,208},{43,1,200},{0,5,208},{25,0,208},{25,0,208},{25,0,208},{25,0,208},{41,19,4},{41,19,4},{41,19,4},{41,7,5},{13,21,2},{13,21,2},{23,1,864},{39,1,300},{39,33,324},{39,3,222},{39,1,1020},{25,1,211},{25,33,5}, +{25,35,331},{29,1,732},{13,19,222},{37,1,347},{7,1,13},{7,33,21},{23,3,48},{1,13,723},{25,1,211},{25,33,5},{15,19,203},{13,1,723},{15,19,203},{39,1,251},{39,1,251},{39,1,251},{39,19,203},{9,1,195},{25,33,4},{25,33,4},{25,5,36},{13,3,164},{27,5,5},{7,1,4},{7,1,4},{7,1,4},{7,35,8},{23,3,162},{9,3,1},{9,3,1},{27,5,1},{43,3,162}, +{27,5,1},{17,39,200},{7,1,9},{37,33,1},{41,33,1},{17,39,200},{39,17,200},{41,33,1},{0,19,202},{39,17,200},{0,19,202},{39,0,202},{39,0,202},{39,0,202},{39,0,202},{25,33,0},{25,33,0},{25,33,0},{25,21,4},{43,35,4},{43,35,4},{37,1,1012},{7,1,417},{7,1,312},{23,17,218},{7,1,1144},{39,1,268},{39,17,15},{9,3,317},{27,1,804},{27,3,218},{5,1,398}, +{21,1,81},{21,17,26},{37,17,51},{35,3,723},{23,1,254},{39,17,6},{13,3,208},{25,1,723},{13,3,208},{7,1,296},{7,1,296},{7,1,296},{23,33,209},{39,1,243},{39,17,14},{39,17,14},{9,35,27},{43,17,163},{27,19,13},{21,1,17},{21,1,17},{21,1,17},{37,3,1},{3,25,162},{39,17,5},{39,17,5},{27,19,9},{29,1,162},{27,19,9},{19,1,200},{5,1,45},{5,17,2}, +{9,17,1},{19,1,200},{37,1,200},{9,17,1},{0,3,208},{37,1,200},{0,3,208},{23,0,208},{23,0,208},{23,0,208},{23,0,208},{9,1,10},{9,1,10},{9,1,10},{9,5,9},{27,19,4},{27,19,4},{5,1,919},{21,1,494},{21,1,350},{37,1,201},{21,1,1014},{7,1,251},{23,1,14},{23,33,202},{9,1,721},{41,33,139},{19,1,341},{35,1,109},{5,1,37},{5,1,26},{3,3,546}, +{37,1,213},{7,1,1},{43,17,125},{3,3,546},{43,17,125},{21,1,350},{21,1,350},{21,1,350},{37,1,201},{37,1,312},{23,1,14},{23,1,14},{23,3,27},{41,1,168},{25,3,2},{5,1,37},{5,1,37},{5,1,37},{5,17,5},{19,5,162},{7,1,1},{7,1,1},{25,3,1},{37,3,162},{25,3,1},{33,1,113},{19,1,37},{19,1,1},{7,1,0},{33,1,113},{35,1,113},{7,1,0}, +{0,17,125},{35,1,113},{0,17,125},{37,0,200},{37,0,200},{37,0,200},{37,0,200},{23,1,10},{23,1,10},{23,1,10},{23,19,5},{25,3,1},{25,3,1},{35,1,773},{35,1,513},{5,1,414},{5,1,227},{35,1,818},{21,1,218},{37,1,69},{7,17,74},{23,1,534},{9,17,30},{3,1,190},{19,1,101},{19,1,65},{35,1,5},{33,33,333},{35,1,114},{5,1,25},{9,17,30},{33,33,333}, +{9,17,30},{5,1,414},{5,1,414},{5,1,414},{5,1,227},{21,1,373},{37,1,69},{37,1,69},{7,33,29},{9,1,216},{9,17,5},{19,1,65},{19,1,65},{19,1,65},{35,1,5},{3,3,162},{5,1,25},{5,1,25},{9,17,5},{3,3,162},{9,17,5},{17,1,25},{33,1,9},{33,1,0},{19,1,1},{17,1,25},{33,1,25},{19,1,1},{0,17,29},{33,1,25},{0,17,29},{5,0,218}, +{5,0,218},{5,0,218},{5,0,218},{37,1,20},{37,1,20},{37,1,20},{37,3,5},{9,17,1},{9,17,1},{3,1,642},{19,1,504},{19,1,468},{35,1,264},{19,1,657},{35,1,229},{5,1,141},{21,1,26},{21,1,457},{23,1,1},{33,1,134},{33,1,94},{33,1,85},{3,1,26},{1,19,193},{19,1,81},{19,1,45},{23,1,0},{19,1,193},{23,1,0},{19,1,468},{19,1,468},{19,1,468}, +{35,1,264},{35,1,425},{5,1,141},{5,1,141},{21,1,26},{7,1,254},{23,1,1},{33,1,85},{33,1,85},{33,1,85},{3,1,26},{17,3,145},{19,1,45},{19,1,45},{23,1,0},{35,1,145},{23,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{35,0,200},{35,0,200},{35,0,200},{35,0,200},{5,1,41}, +{5,1,41},{5,1,41},{21,17,5},{23,1,1},{23,1,1},{3,1,418},{3,1,343},{3,1,318},{3,1,243},{3,1,370},{19,1,161},{19,1,125},{35,1,5},{35,1,250},{21,1,25},{17,1,34},{17,1,26},{17,1,25},{33,1,13},{17,1,54},{33,1,22},{33,1,13},{5,1,1},{33,1,54},{5,1,1},{3,1,318},{3,1,318},{3,1,318},{3,1,243},{3,1,270},{19,1,125},{19,1,125}, +{35,1,5},{5,1,165},{21,1,25},{17,1,25},{17,1,25},{17,1,25},{33,1,13},{1,3,41},{33,1,13},{33,1,13},{5,1,1},{3,1,41},{5,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{19,0,208},{19,0,208},{19,0,208},{19,0,208},{35,1,85},{35,1,85},{35,1,85},{35,1,5},{21,1,25}, +{21,1,25},{0,26,421},{0,38,45},{0,36,2},{0,20,160},{0,38,926},{0,20,577},{0,4,264},{0,18,701},{0,34,989},{0,18,737},{0,26,421},{0,38,45},{0,36,2},{0,20,160},{34,0,925},{0,20,577},{0,4,264},{0,18,701},{0,34,925},{0,18,701},{0,20,1},{0,20,1},{0,20,1},{0,18,1},{0,18,85},{0,2,34},{0,2,34},{0,32,53},{0,32,94},{0,32,62},{0,20,1}, +{0,20,1},{0,20,1},{0,18,1},{32,0,85},{0,2,34},{0,2,34},{0,32,53},{18,0,85},{0,32,53},{34,4,421},{0,38,45},{0,36,2},{0,20,160},{34,4,421},{26,0,421},{0,20,160},{0,34,421},{26,0,421},{0,34,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,44,421},{0,24,13},{0,22,32}, +{0,36,113},{0,24,1262},{0,6,670},{0,20,304},{0,4,886},{0,4,1382},{0,34,953},{0,44,421},{0,24,13},{0,22,32},{0,36,113},{18,4,1261},{0,6,670},{0,20,304},{0,4,886},{36,2,1261},{0,4,886},{0,8,0},{0,8,0},{0,8,0},{0,4,0},{0,4,221},{0,34,73},{0,34,73},{0,2,125},{0,2,246},{0,2,150},{0,8,0},{0,8,0},{0,8,0},{0,4,0},{2,0,221}, +{0,34,73},{0,34,73},{0,2,125},{4,0,221},{0,2,125},{22,0,421},{0,24,13},{16,6,8},{0,36,113},{22,0,421},{44,0,421},{0,36,113},{0,20,433},{44,0,421},{0,20,433},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,31,430},{0,26,10},{16,38,79},{0,22,74},{0,42,1514},{0,38,717},{0,6,253}, +{0,20,965},{0,36,1713},{0,4,1109},{16,46,425},{16,10,9},{16,38,54},{0,22,74},{20,2,1514},{0,38,717},{0,6,253},{0,20,965},{42,0,1514},{0,20,965},{0,26,10},{0,26,10},{0,26,10},{0,36,9},{0,6,340},{0,20,97},{0,20,97},{0,18,185},{0,18,382},{0,18,221},{16,10,5},{16,10,5},{16,10,5},{16,36,5},{2,2,338},{0,20,97},{0,20,97},{0,18,185},{2,2,338}, +{0,18,185},{8,0,421},{0,26,1},{2,38,2},{0,22,65},{8,0,421},{31,0,421},{0,22,65},{0,36,421},{31,0,421},{0,36,421},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,32,0},{0,32,0},{0,32,0},{0,16,0},{0,16,1},{0,16,1},{16,45,482},{16,12,66},{32,24,186},{16,8,126},{0,14,1517},{0,24,605},{0,38,117},{0,6,886},{0,22,1815},{0,36,1085},{32,31,421}, +{32,42,1},{2,8,51},{32,38,85},{22,16,1514},{0,24,605},{0,38,117},{0,6,886},{44,16,1514},{0,6,886},{16,28,61},{16,28,61},{16,28,61},{16,22,62},{0,24,340},{0,22,37},{0,22,37},{0,4,125},{0,4,456},{0,34,213},{32,42,0},{32,42,0},{32,42,0},{32,6,1},{18,4,338},{0,22,37},{0,22,37},{0,4,125},{36,2,338},{0,4,125},{40,0,421},{32,42,1},{18,8,5}, +{0,8,37},{40,0,421},{13,0,421},{0,8,37},{0,22,433},{13,0,421},{0,22,433},{16,0,61},{16,0,61},{16,0,61},{16,0,61},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,32,25},{0,32,25},{32,43,623},{32,44,219},{32,10,382},{32,24,243},{0,15,1517},{0,26,497},{0,24,35},{0,22,761},{0,8,2003},{0,22,1050},{18,15,422},{18,28,6},{18,40,51},{2,24,77},{24,0,1514}, +{0,26,497},{0,24,35},{0,22,761},{32,8,1514},{0,22,761},{32,30,202},{32,30,202},{32,30,202},{32,8,203},{0,28,338},{0,8,10},{0,8,10},{0,20,89},{0,6,565},{0,20,233},{18,12,1},{18,12,1},{18,12,1},{18,38,1},{2,24,338},{0,8,10},{0,8,10},{0,20,89},{28,0,338},{0,20,89},{40,4,421},{2,28,5},{4,40,1},{0,24,26},{40,4,421},{25,0,421},{0,24,26}, +{0,38,425},{25,0,421},{0,38,425},{32,0,202},{32,0,202},{32,0,202},{32,0,202},{0,8,1},{0,8,1},{0,8,1},{0,4,1},{0,34,68},{0,34,68},{2,11,821},{2,30,429},{2,26,634},{2,10,429},{0,27,1514},{0,28,446},{0,10,8},{0,8,670},{0,40,2187},{0,38,1083},{34,29,422},{34,14,6},{4,26,50},{34,10,86},{38,6,1514},{0,28,446},{0,10,8},{0,8,670},{27,0,1514}, +{0,8,670},{2,31,401},{2,31,401},{2,31,401},{2,24,404},{0,46,340},{0,10,4},{0,10,4},{0,6,52},{0,22,677},{0,6,277},{34,14,2},{34,14,2},{34,14,2},{34,8,5},{22,2,338},{0,10,4},{0,10,4},{0,6,52},{42,2,338},{0,6,52},{28,0,421},{34,14,5},{36,10,5},{0,10,4},{28,0,421},{7,0,421},{0,10,4},{0,24,425},{7,0,421},{0,24,425},{2,0,400}, +{2,0,400},{2,0,400},{2,0,400},{0,26,0},{0,26,0},{0,26,0},{0,36,1},{0,4,149},{0,4,149},{18,9,842},{18,47,462},{34,12,661},{18,26,450},{16,25,1521},{16,14,441},{16,42,15},{16,24,653},{0,26,2030},{0,24,882},{20,13,425},{20,30,9},{20,42,54},{4,26,77},{26,2,1514},{0,14,422},{16,42,11},{0,24,626},{38,8,1514},{0,24,626},{18,45,421},{18,45,421},{18,45,421}, +{18,10,422},{16,15,344},{16,42,14},{16,42,14},{16,38,38},{0,24,602},{0,38,162},{20,14,4},{20,14,4},{20,14,4},{20,40,5},{8,2,338},{32,26,2},{32,26,2},{0,38,18},{30,2,338},{0,38,18},{14,0,421},{4,30,5},{6,42,1},{0,42,1},{14,0,421},{19,0,421},{0,42,1},{0,40,421},{19,0,421},{0,40,421},{18,0,421},{18,0,421},{18,0,421},{18,0,421},{16,12,5}, +{16,12,5},{16,12,5},{16,6,8},{0,6,80},{0,6,80},{4,9,854},{4,31,458},{4,28,674},{34,12,453},{2,25,1515},{32,30,445},{2,12,9},{32,10,657},{0,28,1850},{0,10,666},{36,27,422},{36,46,6},{6,28,48},{36,12,86},{16,7,1514},{16,46,421},{2,12,8},{0,10,545},{21,0,1514},{0,10,545},{34,13,433},{34,13,433},{34,13,433},{34,42,433},{2,15,339},{2,12,5},{2,12,5}, +{32,8,50},{0,10,477},{0,8,62},{36,46,2},{36,46,2},{36,46,2},{36,10,5},{24,4,338},{2,12,4},{2,12,4},{0,24,9},{11,0,338},{0,24,9},{0,1,421},{36,46,5},{38,12,5},{2,12,4},{0,1,421},{1,0,421},{2,12,4},{0,26,425},{1,0,421},{0,26,425},{4,0,433},{4,0,433},{4,0,433},{4,0,433},{2,28,1},{2,28,1},{2,28,1},{2,38,2},{0,8,37}, +{0,8,37},{20,7,842},{20,45,455},{36,14,655},{20,28,450},{34,9,1523},{18,47,450},{34,44,13},{18,42,659},{0,14,1731},{0,42,542},{22,11,422},{22,47,5},{22,44,50},{6,28,86},{30,0,1514},{2,47,421},{34,44,4},{0,42,506},{33,0,1514},{0,42,506},{20,43,421},{20,43,421},{20,43,421},{20,12,425},{18,13,347},{34,28,11},{34,28,11},{18,40,43},{0,12,389},{0,10,9},{22,47,1}, +{22,47,1},{22,47,1},{22,42,1},{38,10,338},{34,28,2},{34,28,2},{0,10,5},{23,0,338},{0,10,5},{2,1,421},{22,47,4},{8,44,0},{18,44,0},{2,1,421},{1,2,421},{18,44,0},{0,42,425},{1,2,421},{0,42,425},{20,0,421},{20,0,421},{20,0,421},{20,0,421},{18,30,9},{18,30,9},{18,30,9},{34,8,10},{0,10,5},{0,10,5},{6,37,846},{6,29,454},{6,46,685}, +{6,14,459},{4,7,1517},{4,31,446},{4,14,19},{34,12,655},{0,47,1635},{0,12,478},{38,9,425},{38,15,6},{8,30,41},{38,14,77},{47,0,1514},{18,15,422},{20,14,11},{0,12,477},{27,6,1514},{0,12,477},{6,27,426},{6,27,426},{6,27,426},{6,44,426},{4,13,340},{4,14,10},{4,14,10},{4,26,50},{0,44,355},{16,26,6},{38,15,5},{38,15,5},{38,15,5},{38,28,5},{28,2,338}, +{20,14,2},{20,14,2},{32,26,1},{42,8,338},{32,26,1},{29,0,421},{38,15,2},{40,14,10},{18,30,9},{29,0,421},{33,4,421},{18,30,9},{0,28,425},{33,4,421},{0,28,425},{6,0,425},{6,0,425},{6,0,425},{6,0,425},{4,30,1},{4,30,1},{4,30,1},{4,40,0},{16,26,5},{16,26,5},{22,5,842},{22,43,455},{38,47,679},{22,30,455},{20,21,1521},{20,15,438},{36,46,13}, +{20,28,653},{0,15,1553},{16,44,454},{24,9,422},{24,45,5},{24,46,50},{8,30,77},{34,3,1514},{4,45,422},{36,46,4},{0,44,434},{35,4,1514},{0,44,434},{22,41,421},{22,41,421},{22,41,421},{22,14,422},{20,11,342},{36,30,11},{36,30,11},{20,42,38},{0,46,340},{32,12,5},{24,45,1},{24,45,1},{24,45,1},{24,44,1},{16,3,338},{36,30,2},{36,30,2},{32,12,4},{17,0,338}, +{32,12,4},{43,0,421},{24,45,4},{10,46,0},{4,46,1},{43,0,421},{19,6,421},{4,46,1},{0,44,425},{19,6,421},{0,44,425},{22,0,421},{22,0,421},{22,0,421},{22,0,421},{20,31,5},{20,31,5},{20,31,5},{20,26,5},{32,12,1},{32,12,1},{8,5,854},{8,27,458},{24,31,670},{38,47,462},{6,5,1517},{6,29,446},{6,47,6},{36,14,655},{0,29,1530},{32,30,465},{40,23,422}, +{40,13,2},{10,31,48},{40,46,90},{45,2,1514},{20,13,425},{6,47,6},{0,30,434},{25,8,1514},{0,30,434},{8,25,434},{8,25,434},{8,25,434},{8,30,437},{6,11,340},{6,47,5},{6,47,5},{6,12,52},{16,47,342},{18,28,1},{40,13,1},{40,13,1},{40,13,1},{40,14,5},{30,4,338},{22,46,4},{22,46,4},{18,28,1},{15,8,338},{18,28,1},{11,0,421},{40,13,1},{26,47,5}, +{6,47,2},{11,0,421},{5,8,421},{6,47,2},{0,30,425},{5,8,421},{0,30,425},{8,0,433},{8,0,433},{8,0,433},{8,0,433},{6,31,0},{6,31,0},{6,31,0},{6,42,0},{18,28,1},{18,28,1},{24,33,846},{24,41,465},{40,15,658},{24,31,454},{38,5,1518},{22,13,446},{38,15,14},{22,46,667},{0,27,1518},{18,46,453},{26,7,421},{26,27,2},{42,15,53},{10,31,86},{27,0,1514}, +{6,43,425},{38,15,10},{16,46,434},{37,8,1514},{16,46,434},{24,23,426},{24,23,426},{24,23,426},{24,47,426},{38,25,344},{38,31,9},{38,31,9},{22,44,41},{18,31,341},{4,14,2},{26,27,1},{26,27,1},{26,27,1},{26,46,1},{45,0,338},{8,31,5},{8,31,5},{4,14,1},{27,8,338},{4,14,1},{8,1,421},{26,27,2},{12,15,1},{6,15,2},{8,1,421},{1,8,421},{6,15,2}, +{0,46,433},{1,8,421},{0,46,433},{24,0,425},{24,0,425},{24,0,425},{24,0,425},{38,15,4},{38,15,4},{38,15,4},{38,12,8},{4,14,1},{4,14,1},{10,33,846},{10,25,454},{26,29,658},{10,45,454},{8,3,1517},{8,27,446},{8,45,8},{38,47,650},{32,11,1518},{4,47,462},{42,5,425},{42,11,9},{12,29,43},{42,15,89},{28,13,1514},{22,11,422},{8,45,8},{16,31,426},{27,12,1514}, +{16,31,426},{10,23,425},{10,23,425},{10,23,425},{10,15,429},{8,9,340},{8,45,4},{8,45,4},{8,30,50},{34,45,341},{20,30,6},{42,11,5},{42,11,5},{42,11,5},{42,31,8},{29,2,338},{8,45,4},{8,45,4},{36,30,1},{35,6,338},{36,30,1},{23,0,421},{12,11,4},{44,45,5},{8,45,4},{23,0,421},{18,9,421},{8,45,4},{0,31,425},{18,9,421},{0,31,425},{10,0,425}, +{10,0,425},{10,0,425},{10,0,425},{8,13,1},{8,13,1},{8,13,1},{8,44,0},{20,30,5},{20,30,5},{26,1,846},{26,39,470},{42,13,658},{26,29,454},{40,3,1523},{24,11,446},{24,13,20},{24,31,658},{2,25,1521},{20,15,458},{28,5,422},{28,25,6},{28,13,51},{12,29,86},{40,3,1514},{8,41,421},{24,13,11},{18,15,421},{16,9,1514},{18,15,421},{26,21,426},{26,21,426},{26,21,426}, +{26,45,426},{24,7,347},{40,29,11},{40,29,11},{24,46,41},{20,29,342},{36,47,10},{28,41,1},{28,41,1},{28,41,1},{28,15,2},{43,2,338},{40,29,2},{40,29,2},{36,47,9},{21,8,338},{36,47,9},{37,0,421},{12,25,5},{14,13,1},{8,13,2},{37,0,421},{32,7,421},{8,13,2},{0,15,421},{32,7,421},{0,15,421},{26,0,425},{26,0,425},{26,0,425},{26,0,425},{24,27,9}, +{24,27,9},{24,27,9},{40,14,10},{36,47,1},{36,47,1},{12,1,850},{12,23,454},{12,27,666},{12,43,454},{10,1,1517},{10,25,446},{10,43,8},{40,45,666},{34,9,1515},{6,45,462},{44,3,425},{44,9,9},{14,27,50},{44,13,89},{39,2,1514},{24,9,422},{10,43,8},{18,29,426},{34,9,1514},{18,29,426},{12,21,425},{12,21,425},{12,21,425},{12,13,429},{10,7,340},{10,43,4},{10,43,4}, +{10,47,50},{36,43,341},{22,31,1},{44,9,5},{44,9,5},{44,9,5},{44,29,8},{38,1,338},{26,13,4},{26,13,4},{22,31,1},{43,28,338},{22,31,1},{5,0,421},{14,9,4},{46,43,5},{10,43,4},{5,0,421},{0,5,421},{10,43,4},{0,29,425},{0,5,421},{0,29,425},{12,0,425},{12,0,425},{12,0,425},{12,0,425},{10,27,0},{10,27,0},{10,27,0},{10,46,0},{22,31,1}, +{22,31,1},{44,1,890},{44,7,462},{44,41,666},{28,27,454},{42,1,1518},{26,39,446},{42,11,8},{26,13,666},{4,23,1523},{22,13,454},{30,33,421},{30,23,1},{46,11,50},{30,27,89},{21,0,1514},{40,23,425},{42,11,4},{20,13,425},{18,7,1514},{20,13,425},{28,19,426},{28,19,426},{28,19,426},{28,27,429},{42,21,344},{42,11,8},{42,11,8},{26,15,50},{6,11,341},{8,45,9},{30,23,1}, +{30,23,1},{30,23,1},{30,13,0},{39,0,338},{42,11,4},{42,11,4},{8,45,5},{9,28,338},{8,45,5},{14,1,421},{30,23,1},{47,11,0},{26,11,0},{14,1,421},{4,5,421},{26,11,0},{0,13,425},{4,5,421},{0,13,425},{28,0,425},{28,0,425},{28,0,425},{28,0,425},{42,11,4},{42,11,4},{42,11,4},{42,47,5},{8,15,4},{8,15,4},{30,1,950},{14,21,458},{30,25,658}, +{14,41,446},{28,1,1542},{12,23,438},{12,25,20},{12,43,658},{36,7,1518},{38,27,470},{46,1,430},{46,37,10},{47,25,41},{46,41,82},{14,3,1514},{26,7,422},{28,41,11},{20,27,426},{32,5,1514},{20,27,426},{14,19,421},{14,19,421},{14,19,421},{14,11,422},{12,35,339},{12,25,11},{12,25,11},{12,29,51},{38,41,338},{24,29,6},{46,37,9},{46,37,9},{46,37,9},{46,27,10},{23,2,338}, +{28,41,2},{28,41,2},{40,29,1},{20,9,338},{40,29,1},{17,0,421},{46,37,1},{31,25,10},{26,25,9},{17,0,421},{18,3,421},{26,25,9},{0,27,425},{18,3,421},{0,27,425},{14,0,421},{14,0,421},{14,0,421},{14,0,421},{12,9,2},{12,9,2},{12,9,2},{12,15,1},{24,13,5},{24,13,5},{46,1,1010},{46,5,462},{46,39,650},{30,25,454},{14,1,1575},{28,7,446},{44,9,8}, +{28,27,658},{6,21,1523},{24,11,454},{31,1,422},{31,21,6},{31,9,50},{47,25,77},{46,3,1514},{42,21,425},{44,9,4},{22,11,425},{16,3,1514},{22,11,425},{30,17,426},{30,17,426},{30,17,426},{30,25,429},{44,19,344},{44,9,8},{44,9,8},{28,13,43},{8,9,340},{10,43,9},{31,37,1},{31,37,1},{31,37,1},{31,11,2},{37,2,338},{44,9,4},{44,9,4},{10,43,5},{34,7,338}, +{10,43,5},{31,1,421},{31,21,5},{45,9,0},{12,9,1},{31,1,421},{32,1,421},{12,9,1},{0,11,425},{32,1,421},{0,11,425},{30,0,425},{30,0,425},{30,0,425},{30,0,425},{44,9,4},{44,9,4},{44,9,4},{44,45,5},{10,13,4},{10,13,4},{31,1,1098},{47,19,453},{47,23,667},{47,39,473},{46,1,1641},{14,21,438},{14,39,14},{14,41,658},{38,5,1518},{40,25,465},{45,1,437}, +{15,5,2},{45,23,41},{15,39,86},{31,3,1514},{28,5,422},{30,39,9},{22,25,426},{34,3,1514},{22,25,426},{47,17,434},{47,17,434},{47,17,434},{47,9,437},{14,33,339},{14,39,10},{14,39,10},{14,43,53},{40,39,341},{26,27,2},{15,5,1},{15,5,1},{15,5,1},{15,25,5},{44,1,338},{30,9,5},{30,9,5},{26,27,1},{26,9,338},{26,27,1},{45,1,421},{15,5,1},{13,39,8}, +{14,39,4},{45,1,421},{20,1,421},{14,39,4},{0,25,425},{20,1,421},{0,25,425},{47,0,433},{47,0,433},{47,0,433},{47,0,433},{14,7,2},{14,7,2},{14,7,2},{14,13,1},{26,27,2},{26,27,2},{45,1,1202},{31,33,465},{15,37,655},{31,7,461},{47,1,1725},{30,35,446},{46,7,6},{30,25,670},{24,19,1518},{26,9,458},{13,1,469},{29,19,1},{13,7,52},{29,23,85},{15,1,1514}, +{14,35,426},{46,7,5},{24,9,434},{9,11,1514},{24,9,434},{31,1,434},{31,1,434},{31,1,434},{31,39,426},{46,17,339},{46,7,6},{46,7,6},{30,11,48},{10,7,341},{12,41,2},{29,19,1},{29,19,1},{29,19,1},{29,9,0},{31,5,338},{47,23,4},{47,23,4},{12,41,1},{14,9,338},{12,41,1},{43,1,421},{29,19,1},{43,7,0},{30,7,0},{43,1,421},{8,1,421},{30,7,0}, +{0,9,433},{8,1,421},{0,9,433},{31,0,425},{31,0,425},{31,0,425},{31,0,425},{46,7,2},{46,7,2},{46,7,2},{46,27,5},{12,41,1},{12,41,1},{29,1,1346},{45,17,454},{29,21,653},{45,37,459},{45,1,1818},{47,19,446},{47,37,13},{46,39,679},{10,3,1518},{42,23,455},{27,1,526},{13,33,5},{43,21,38},{13,7,93},{27,5,1514},{30,3,425},{31,37,11},{40,23,421},{6,1,1514}, +{40,23,421},{45,1,434},{45,1,434},{45,1,434},{45,7,429},{47,1,340},{47,37,4},{47,37,4},{47,25,50},{42,37,338},{44,25,5},{13,33,4},{13,33,4},{13,33,4},{13,23,5},{17,2,338},{31,37,2},{31,37,2},{44,25,1},{16,1,338},{44,25,1},{11,1,421},{13,33,1},{27,21,5},{30,21,5},{11,1,421},{26,1,421},{30,21,5},{0,23,421},{26,1,421},{0,23,421},{45,0,425}, +{45,0,425},{45,0,425},{45,0,425},{47,5,1},{47,5,1},{47,5,1},{47,11,0},{44,25,4},{44,25,4},{43,1,1502},{13,1,478},{13,35,655},{29,5,461},{29,1,1926},{31,3,446},{15,5,19},{47,7,685},{26,17,1518},{28,7,454},{11,1,569},{27,17,6},{27,5,50},{43,21,97},{17,10,1514},{47,33,425},{15,5,10},{26,7,426},{24,1,1514},{26,7,426},{13,1,477},{13,1,477},{13,1,477}, +{29,37,426},{15,1,355},{15,21,11},{15,21,11},{31,9,41},{12,5,341},{14,39,6},{27,33,1},{27,33,1},{27,33,1},{27,7,2},{29,3,338},{15,21,2},{15,21,2},{14,39,5},{43,9,338},{14,39,5},{25,1,421},{43,1,5},{41,5,0},{31,5,1},{25,1,421},{14,1,421},{31,5,1},{0,7,425},{14,1,421},{0,7,425},{29,0,425},{29,0,425},{29,0,425},{29,0,425},{31,19,9}, +{31,19,9},{31,19,9},{31,25,10},{14,39,2},{14,39,2},{11,1,1634},{43,1,542},{43,19,659},{43,35,459},{43,1,2070},{45,17,446},{45,35,13},{15,37,655},{12,1,1518},{44,21,455},{25,1,646},{11,1,9},{41,19,43},{11,5,93},{25,3,1514},{31,1,422},{29,35,11},{42,21,421},{12,1,1514},{42,21,421},{43,1,506},{43,1,506},{43,1,506},{43,5,429},{29,1,381},{45,35,4},{45,35,4}, +{45,23,50},{44,35,338},{46,23,5},{11,1,5},{11,1,5},{11,1,5},{11,21,5},{39,11,338},{29,35,2},{29,35,2},{46,23,1},{22,1,338},{46,23,1},{39,1,421},{11,1,5},{25,19,10},{31,19,9},{39,1,421},{31,1,421},{31,19,9},{0,21,421},{31,1,421},{0,21,421},{43,0,425},{43,0,425},{43,0,425},{43,0,425},{45,19,0},{45,19,0},{45,19,0},{45,9,0},{46,23,4}, +{46,23,4},{25,1,1874},{11,1,666},{11,33,657},{27,3,451},{11,1,2201},{13,1,454},{13,3,9},{29,5,674},{14,1,1557},{30,5,458},{39,1,722},{9,1,62},{9,33,50},{25,19,85},{9,1,1514},{29,1,446},{13,3,5},{44,5,433},{46,1,1514},{44,5,433},{11,1,545},{11,1,545},{11,1,545},{27,19,429},{43,1,437},{13,3,8},{13,3,8},{29,7,48},{30,19,341},{47,37,6},{25,1,9}, +{25,1,9},{25,1,9},{25,5,0},{25,5,338},{13,3,4},{13,3,4},{47,37,2},{10,1,338},{47,37,2},{37,1,421},{9,1,37},{39,3,2},{29,3,1},{37,1,421},{43,1,421},{29,3,1},{0,5,433},{43,1,421},{0,5,433},{27,0,425},{27,0,425},{27,0,425},{27,0,425},{13,3,4},{13,3,4},{13,3,4},{13,39,5},{46,21,5},{46,21,5},{9,1,2030},{25,1,882},{25,17,653}, +{41,33,453},{9,1,2382},{27,1,546},{43,17,15},{13,35,661},{47,1,1653},{46,19,462},{7,1,837},{39,1,162},{39,17,38},{9,33,89},{19,9,1514},{27,1,521},{43,17,14},{44,19,421},{45,1,1514},{44,19,421},{25,1,626},{25,1,626},{25,1,626},{41,3,422},{11,1,488},{43,17,11},{43,17,11},{43,21,54},{46,33,340},{31,21,9},{39,1,18},{39,1,18},{39,1,18},{9,19,10},{9,3,338}, +{27,33,2},{27,33,2},{15,21,4},{31,3,338},{15,21,4},{5,1,421},{7,1,80},{7,17,8},{13,17,5},{5,1,421},{9,1,421},{13,17,5},{0,19,421},{9,1,421},{0,19,421},{41,0,421},{41,0,421},{41,0,421},{41,0,421},{43,1,1},{43,1,1},{43,1,1},{43,7,1},{31,5,5},{31,5,5},{23,1,2201},{39,1,1083},{9,1,670},{25,1,450},{39,1,2443},{11,1,684},{11,1,8}, +{27,3,634},{29,1,1751},{31,3,429},{21,1,890},{7,1,277},{7,1,52},{23,17,74},{21,17,1459},{25,1,603},{11,1,4},{30,3,401},{17,21,1459},{30,3,401},{9,1,670},{9,1,670},{9,1,670},{25,17,429},{25,1,579},{11,1,8},{11,1,8},{27,5,50},{47,1,340},{15,35,6},{7,1,52},{7,1,52},{7,1,52},{23,3,0},{23,3,338},{11,1,4},{11,1,4},{15,35,2},{43,3,338}, +{15,35,2},{19,1,392},{5,1,149},{37,1,1},{27,1,0},{19,1,392},{37,1,392},{27,1,0},{0,3,400},{37,1,392},{0,3,400},{25,0,425},{25,0,425},{25,0,425},{25,0,425},{11,1,4},{11,1,4},{11,1,4},{11,37,5},{15,35,5},{15,35,5},{7,1,1901},{23,1,1050},{23,1,761},{39,1,426},{7,1,2093},{9,1,551},{25,1,35},{11,33,382},{13,1,1407},{45,33,219},{5,1,638}, +{21,1,233},{21,1,89},{7,1,29},{17,39,1064},{23,1,398},{9,1,10},{31,33,202},{39,17,1064},{31,33,202},{23,1,761},{23,1,761},{23,1,761},{39,1,426},{9,1,638},{25,1,35},{25,1,35},{41,19,51},{45,1,355},{29,19,6},{21,1,89},{21,1,89},{21,1,89},{7,17,5},{3,25,338},{9,1,10},{9,1,10},{13,19,1},{29,1,338},{13,19,1},{3,1,200},{35,1,68},{5,1,1}, +{9,1,1},{3,1,200},{5,1,200},{9,1,1},{0,33,202},{5,1,200},{0,33,202},{39,0,425},{39,0,425},{39,0,425},{39,0,425},{25,1,26},{25,1,26},{25,1,26},{41,5,1},{29,3,5},{29,3,5},{21,1,1606},{37,1,1085},{7,1,886},{7,1,461},{21,1,1749},{23,1,470},{39,1,117},{25,33,186},{11,1,1166},{13,17,66},{19,1,461},{35,1,213},{5,1,125},{21,1,2},{3,3,722}, +{7,1,266},{23,1,37},{29,17,61},{3,3,722},{29,17,61},{7,1,886},{7,1,886},{7,1,886},{7,1,461},{23,1,770},{39,1,117},{39,1,117},{9,3,51},{43,1,426},{43,33,1},{5,1,125},{5,1,125},{5,1,125},{21,1,2},{19,5,338},{23,1,37},{23,1,37},{43,33,0},{37,3,338},{43,33,0},{1,3,61},{33,1,25},{3,1,1},{5,1,1},{1,3,61},{3,1,61},{5,1,1}, +{0,17,61},{3,1,61},{0,17,61},{23,0,433},{23,0,433},{23,0,433},{23,0,433},{9,1,37},{9,1,37},{9,1,37},{9,19,5},{43,33,1},{43,33,1},{5,1,1450},{5,1,1109},{21,1,965},{37,1,542},{5,1,1505},{7,1,478},{7,1,253},{39,17,79},{9,1,1054},{27,1,10},{3,1,318},{19,1,221},{19,1,185},{35,1,29},{33,33,509},{35,1,210},{21,1,97},{27,1,10},{33,33,509}, +{27,1,10},{21,1,965},{21,1,965},{21,1,965},{37,1,542},{21,1,900},{7,1,253},{7,1,253},{39,17,54},{41,1,549},{11,17,9},{19,1,185},{19,1,185},{19,1,185},{35,1,29},{3,3,338},{21,1,97},{21,1,97},{11,17,5},{3,3,338},{11,17,5},{1,17,5},{17,1,1},{17,1,0},{33,1,0},{1,17,5},{17,1,5},{33,1,0},{0,1,9},{17,1,5},{0,1,9},{37,0,421}, +{37,0,421},{37,0,421},{37,0,421},{23,1,65},{23,1,65},{23,1,65},{39,3,2},{27,1,1},{27,1,1},{35,1,1213},{35,1,953},{5,1,886},{5,1,545},{35,1,1186},{21,1,448},{21,1,304},{23,1,32},{23,1,790},{25,1,13},{33,1,198},{3,1,150},{3,1,125},{19,1,36},{33,1,294},{19,1,121},{35,1,73},{9,1,0},{1,33,294},{9,1,0},{5,1,886},{5,1,886},{5,1,886}, +{5,1,545},{5,1,765},{21,1,304},{21,1,304},{23,1,32},{39,1,486},{25,1,13},{3,1,125},{3,1,125},{3,1,125},{19,1,36},{3,1,221},{35,1,73},{35,1,73},{9,1,0},{5,1,221},{9,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{21,0,433},{21,0,433},{21,0,433},{21,0,433},{37,1,113}, +{37,1,113},{37,1,113},{7,17,8},{25,1,13},{25,1,13},{3,1,885},{19,1,737},{19,1,701},{35,1,485},{19,1,834},{5,1,364},{5,1,264},{37,1,2},{7,1,554},{39,1,45},{17,1,82},{33,1,62},{33,1,53},{33,1,13},{1,3,114},{33,1,54},{3,1,34},{21,1,1},{3,1,114},{21,1,1},{19,1,701},{19,1,701},{19,1,701},{35,1,485},{35,1,574},{5,1,264},{5,1,264}, +{37,1,2},{7,1,329},{39,1,45},{33,1,53},{33,1,53},{33,1,53},{33,1,13},{33,1,85},{3,1,34},{3,1,34},{21,1,1},{19,1,85},{21,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{35,0,421},{35,0,421},{35,0,421},{35,0,421},{21,1,160},{21,1,160},{21,1,160},{37,1,2},{39,1,45}, +{39,1,45},{0,30,882},{0,10,100},{0,38,2},{0,6,340},{0,10,1896},{0,22,1189},{0,6,565},{0,4,1421},{0,20,2043},{0,4,1521},{0,30,882},{0,10,100},{0,38,2},{0,6,340},{4,2,1896},{0,22,1189},{0,6,565},{0,4,1421},{10,0,1896},{0,4,1421},{0,22,1},{0,22,1},{0,22,1},{0,34,0},{0,4,164},{0,18,52},{0,18,52},{0,32,98},{0,32,179},{0,32,107},{0,22,1}, +{0,22,1},{0,22,1},{0,34,0},{32,16,162},{0,18,52},{0,18,52},{0,32,98},{16,32,162},{0,32,98},{38,0,882},{0,10,100},{0,38,2},{0,6,340},{38,0,882},{30,0,882},{0,6,340},{0,20,884},{30,0,882},{0,20,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,15,884},{0,12,34},{0,24,13}, +{0,38,250},{0,12,2355},{0,8,1355},{0,22,585},{0,20,1669},{0,36,2567},{0,20,1813},{0,15,884},{0,12,34},{0,24,13},{0,38,250},{0,12,2355},{0,8,1355},{0,22,585},{0,20,1669},{12,0,2355},{0,20,1669},{0,10,0},{0,10,0},{0,10,0},{0,20,1},{0,20,340},{0,4,125},{0,4,125},{0,2,200},{0,18,376},{0,2,225},{0,10,0},{0,10,0},{0,10,0},{0,20,1},{16,4,338}, +{0,4,125},{0,4,125},{0,2,200},{4,16,338},{0,2,200},{24,0,882},{0,12,34},{16,24,4},{0,38,250},{24,0,882},{32,8,882},{0,38,250},{0,6,884},{32,8,882},{0,6,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,27,882},{0,14,9},{0,40,81},{0,8,202},{0,14,2899},{0,24,1539},{0,8,643}, +{0,6,2004},{0,6,3189},{0,36,2207},{0,27,882},{0,14,9},{16,40,61},{0,8,202},{6,2,2899},{0,24,1539},{0,8,643},{0,6,2004},{14,0,2899},{0,6,2004},{0,28,1},{0,28,1},{0,28,1},{0,6,4},{0,22,578},{0,36,221},{0,36,221},{0,18,365},{0,18,632},{0,18,401},{0,28,1},{0,28,1},{0,28,1},{0,6,4},{32,4,578},{0,36,221},{0,36,221},{0,18,365},{22,0,578}, +{0,18,365},{38,6,882},{0,14,9},{2,40,1},{0,8,202},{38,6,882},{27,0,882},{0,8,202},{0,22,884},{27,0,882},{0,22,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{16,25,910},{16,46,31},{16,26,151},{0,40,181},{0,31,3048},{0,26,1416},{0,40,506},{0,22,1944},{0,38,3484},{0,6,2233},{16,25,885}, +{16,46,6},{32,26,78},{16,40,165},{36,6,3048},{0,26,1416},{0,40,506},{0,22,1944},{31,0,3048},{0,22,1944},{16,30,26},{16,30,26},{16,30,26},{16,38,27},{0,24,650},{0,22,157},{0,22,157},{0,4,325},{0,4,766},{0,4,425},{16,30,1},{16,30,1},{16,30,1},{16,38,2},{18,4,648},{0,22,157},{0,22,157},{0,4,325},{36,2,648},{0,4,325},{26,2,882},{0,46,5},{18,26,4}, +{0,40,145},{26,2,882},{38,8,882},{0,40,145},{0,8,890},{38,8,882},{0,8,890},{16,0,26},{16,0,26},{16,0,26},{16,0,26},{0,18,0},{0,18,0},{0,18,0},{0,32,1},{0,16,10},{0,16,10},{16,7,1009},{16,31,134},{32,12,297},{16,26,238},{0,43,3048},{0,28,1224},{0,26,267},{0,8,1764},{0,24,3685},{0,38,2157},{2,9,885},{2,47,5},{18,12,77},{32,26,165},{6,8,3048}, +{0,28,1224},{0,26,267},{0,8,1764},{43,0,3048},{0,8,1764},{16,45,125},{16,45,125},{16,45,125},{16,40,126},{0,28,648},{0,24,80},{0,24,80},{0,36,260},{0,6,875},{0,20,413},{2,46,1},{2,46,1},{2,46,1},{2,24,2},{2,24,648},{0,24,80},{0,24,80},{0,36,260},{28,0,648},{0,36,260},{44,0,882},{2,47,4},{4,42,1},{0,26,98},{44,0,882},{26,8,882},{0,26,98}, +{0,24,890},{26,8,882},{0,24,890},{16,0,125},{16,0,125},{16,0,125},{16,0,125},{0,6,0},{0,6,0},{0,6,0},{0,18,1},{0,18,37},{0,18,37},{32,5,1147},{32,45,282},{2,44,523},{32,12,381},{0,9,3051},{0,14,1110},{0,12,116},{0,24,1658},{0,26,3859},{0,8,2173},{18,23,886},{18,15,6},{34,28,69},{18,42,166},{40,4,3048},{0,14,1110},{0,12,116},{0,24,1658},{22,8,3048}, +{0,24,1658},{32,13,265},{32,13,265},{32,13,265},{32,10,266},{0,46,650},{0,26,26},{0,26,26},{0,22,194},{0,22,987},{0,6,427},{18,15,5},{18,15,5},{18,15,5},{18,40,5},{22,2,648},{0,26,26},{0,26,26},{0,22,194},{42,2,648},{0,22,194},{30,0,882},{18,15,2},{20,28,4},{0,12,52},{30,0,882},{33,0,882},{0,12,52},{0,10,884},{33,0,882},{0,10,884},{32,0,265}, +{32,0,265},{32,0,265},{32,0,265},{0,24,0},{0,24,0},{0,24,0},{0,4,4},{0,34,89},{0,34,89},{2,3,1365},{2,13,510},{18,14,813},{2,28,566},{0,37,3048},{0,46,1013},{0,44,42},{0,10,1509},{0,12,4057},{0,10,2185},{4,7,885},{4,45,10},{20,44,86},{34,28,173},{28,0,3048},{0,46,1013},{0,44,42},{0,10,1509},{37,0,3048},{0,10,1509},{2,11,482},{2,11,482},{2,11,482}, +{2,42,481},{0,29,650},{0,12,4},{0,12,4},{0,38,128},{0,8,1161},{0,22,483},{4,15,2},{4,15,2},{4,15,2},{4,26,2},{8,2,648},{0,12,4},{0,12,4},{0,38,128},{30,2,648},{0,38,128},{47,0,882},{34,45,2},{6,44,1},{0,44,26},{47,0,882},{27,6,882},{0,44,26},{0,26,890},{27,6,882},{0,26,890},{2,0,481},{2,0,481},{2,0,481},{2,0,481},{0,12,0}, +{0,12,0},{0,12,0},{0,6,1},{0,20,180},{0,20,180},{18,17,1647},{18,27,810},{34,46,1178},{2,14,837},{0,19,3048},{0,15,933},{0,14,21},{0,26,1443},{0,28,4329},{0,26,2227},{20,21,885},{20,29,5},{36,30,69},{20,44,182},{42,6,3048},{0,15,933},{0,14,21},{0,26,1443},{19,0,3048},{0,26,1443},{18,25,765},{18,25,765},{18,25,765},{18,28,766},{0,11,648},{0,14,5},{0,14,5}, +{0,24,89},{0,10,1342},{0,8,557},{20,29,1},{20,29,1},{20,29,1},{20,42,2},{24,4,648},{16,44,2},{16,44,2},{0,24,89},{11,0,648},{0,24,89},{34,3,882},{4,13,4},{22,30,4},{0,14,17},{34,3,882},{35,4,882},{0,14,17},{0,12,884},{35,4,882},{0,12,884},{18,0,765},{18,0,765},{18,0,765},{18,0,765},{0,30,0},{0,30,0},{0,30,0},{0,38,0},{0,6,274}, +{0,6,274},{34,1,1782},{34,41,940},{4,31,1356},{34,46,950},{16,1,3052},{16,29,910},{16,46,22},{0,12,1335},{0,46,4231},{0,12,1924},{6,5,882},{6,43,5},{22,47,86},{36,30,174},{32,3,3048},{0,13,900},{32,46,13},{0,12,1299},{39,4,3048},{0,12,1299},{34,23,882},{34,23,882},{34,23,882},{34,14,883},{16,9,651},{16,46,18},{16,46,18},{16,10,74},{0,42,1256},{0,40,434},{6,13,0}, +{6,13,0},{6,13,0},{6,28,1},{38,10,648},{2,30,2},{2,30,2},{0,10,45},{23,0,648},{0,10,45},{4,1,882},{36,27,4},{8,46,4},{0,46,5},{4,1,882},{1,4,882},{0,46,5},{0,28,890},{1,4,882},{0,28,890},{34,0,882},{34,0,882},{34,0,882},{34,0,882},{16,31,1},{16,31,1},{16,31,1},{16,24,1},{0,8,250},{0,8,250},{20,1,1814},{20,25,945},{36,15,1363}, +{4,47,945},{2,1,3052},{32,43,916},{2,47,23},{16,44,1337},{0,31,3975},{0,28,1612},{22,19,886},{22,11,6},{38,31,77},{22,46,185},{2,1,3048},{0,27,883},{2,47,19},{0,44,1188},{1,2,3048},{0,44,1188},{20,7,901},{20,7,901},{20,7,901},{20,30,900},{2,9,654},{2,47,14},{2,47,14},{32,26,70},{0,28,1059},{0,26,236},{22,27,4},{22,27,4},{22,27,4},{22,14,8},{28,2,648}, +{18,46,5},{18,46,5},{0,42,36},{42,8,648},{0,42,36},{27,0,882},{22,11,2},{24,31,4},{0,31,5},{27,0,882},{37,8,882},{0,31,5},{0,14,882},{37,8,882},{0,14,882},{4,0,900},{4,0,900},{4,0,900},{4,0,900},{2,15,5},{2,15,5},{2,15,5},{2,40,4},{0,40,146},{0,40,146},{6,1,1864},{36,39,947},{6,29,1356},{36,31,943},{34,1,3073},{18,27,910},{18,15,21}, +{2,14,1335},{0,45,3751},{0,14,1379},{8,3,885},{8,41,5},{24,15,85},{38,31,182},{29,0,3048},{32,11,884},{34,15,16},{0,30,1146},{37,6,3048},{0,30,1146},{36,21,882},{36,21,882},{36,21,882},{36,47,886},{18,7,649},{18,15,21},{18,15,21},{18,12,74},{0,14,945},{0,12,91},{8,11,2},{8,11,2},{8,11,2},{8,30,2},{16,3,648},{34,31,1},{34,31,1},{0,12,10},{17,0,648}, +{0,12,10},{28,13,882},{38,25,4},{10,15,1},{2,15,1},{28,13,882},{27,12,882},{2,15,1},{0,30,890},{27,12,882},{0,30,890},{36,0,882},{36,0,882},{36,0,882},{36,0,882},{18,29,1},{18,29,1},{18,29,1},{18,26,1},{0,42,68},{0,42,68},{22,1,1944},{22,23,945},{38,13,1363},{6,45,945},{20,1,3115},{34,41,916},{4,45,18},{18,46,1337},{0,13,3580},{0,46,1153},{24,17,886}, +{24,9,6},{40,29,69},{24,15,168},{46,10,3048},{2,25,885},{4,45,14},{0,46,1053},{23,8,3048},{0,46,1053},{22,5,901},{22,5,901},{22,5,901},{6,31,901},{4,7,654},{4,45,9},{4,45,9},{34,28,70},{0,47,825},{0,44,25},{24,25,4},{24,25,4},{24,25,4},{24,46,8},{30,4,648},{20,15,0},{20,15,0},{0,44,0},{15,8,648},{0,44,0},{40,3,882},{24,9,2},{26,29,4}, +{2,29,5},{40,3,882},{16,9,882},{2,29,5},{0,47,890},{16,9,882},{0,47,890},{6,0,900},{6,0,900},{6,0,900},{6,0,900},{4,13,5},{4,13,5},{4,13,5},{4,42,4},{0,28,18},{0,28,18},{8,1,2056},{38,21,956},{8,43,1348},{38,29,949},{6,1,3156},{20,25,910},{20,13,22},{4,47,1318},{0,11,3384},{0,31,1015},{10,1,882},{10,39,5},{26,13,75},{40,29,174},{27,2,3048}, +{34,9,885},{36,13,10},{0,31,990},{39,10,3048},{0,31,990},{38,3,885},{38,3,885},{38,3,885},{38,45,885},{20,5,649},{20,13,21},{20,13,21},{20,14,66},{0,15,729},{0,30,5},{10,9,0},{10,9,0},{10,9,0},{10,31,1},{45,0,648},{6,29,2},{6,29,2},{16,30,4},{27,8,648},{16,30,4},{10,1,882},{40,23,1},{12,13,1},{4,13,1},{10,1,882},{4,9,882},{4,13,1}, +{0,31,890},{4,9,882},{0,31,890},{38,0,884},{38,0,884},{38,0,884},{38,0,884},{20,27,1},{20,27,1},{20,27,1},{20,28,1},{0,30,1},{0,30,1},{40,1,2134},{24,21,943},{40,11,1348},{8,43,952},{38,1,3240},{36,39,914},{6,27,22},{36,15,1330},{0,25,3244},{0,15,951},{42,1,891},{26,7,10},{42,27,77},{26,13,171},{8,1,3048},{4,23,886},{6,27,21},{0,15,950},{1,8,3048}, +{0,15,950},{24,3,890},{24,3,890},{24,3,890},{24,29,890},{6,35,649},{6,43,10},{6,43,10},{36,30,77},{0,13,675},{32,46,6},{26,7,10},{26,7,10},{26,7,10},{26,15,10},{29,2,648},{22,13,2},{22,13,2},{2,46,2},{35,6,648},{2,46,2},{21,0,882},{26,7,1},{28,27,4},{4,27,5},{21,0,882},{18,7,882},{4,27,5},{0,45,884},{18,7,882},{0,45,884},{24,0,890}, +{24,0,890},{24,0,890},{24,0,890},{6,11,1},{6,11,1},{6,11,1},{6,44,2},{16,47,2},{16,47,2},{26,1,2252},{40,35,940},{10,41,1348},{40,27,954},{24,1,3321},{22,23,910},{22,11,22},{6,45,1318},{0,39,3156},{0,29,940},{28,1,920},{12,37,5},{28,41,77},{12,27,180},{23,0,3048},{36,7,884},{38,11,10},{0,29,915},{18,9,3048},{0,29,915},{40,17,882},{40,17,882},{40,17,882}, +{40,43,883},{22,3,649},{38,27,20},{38,27,20},{22,47,86},{0,27,656},{2,31,9},{12,7,0},{12,7,0},{12,7,0},{12,29,1},{43,2,648},{38,27,4},{38,27,4},{34,47,4},{21,8,648},{34,47,4},{14,3,882},{42,21,1},{14,11,1},{6,11,1},{14,3,882},{32,5,882},{6,11,1},{0,29,890},{32,5,882},{0,29,890},{40,0,882},{40,0,882},{40,0,882},{40,0,882},{22,25,1}, +{22,25,1},{22,25,1},{22,30,2},{2,31,0},{2,31,0},{42,1,2404},{26,19,935},{42,9,1348},{10,41,952},{40,1,3409},{38,37,914},{8,41,30},{38,29,1354},{0,37,3087},{2,13,951},{14,1,954},{28,5,6},{44,25,77},{28,11,185},{9,6,3048},{6,21,886},{24,41,21},{0,43,900},{32,7,3048},{0,43,900},{26,1,891},{26,1,891},{26,1,891},{26,27,891},{8,3,654},{8,41,14},{8,41,14}, +{38,31,77},{16,41,651},{34,15,3},{28,5,5},{28,5,5},{28,5,5},{28,13,5},{38,1,648},{24,11,2},{24,11,2},{4,15,2},{43,28,648},{4,15,2},{46,3,882},{28,5,2},{30,25,4},{6,25,5},{46,3,882},{16,3,882},{6,25,5},{0,43,884},{16,3,882},{0,43,884},{26,0,890},{26,0,890},{26,0,890},{26,0,890},{8,9,5},{8,9,5},{8,9,5},{8,46,4},{34,15,2}, +{34,15,2},{28,1,2612},{12,3,951},{28,39,1354},{42,9,952},{26,1,3544},{24,21,910},{40,9,30},{8,43,1348},{0,35,3060},{18,27,935},{30,1,1005},{14,35,3},{30,39,77},{44,25,185},{41,12,3048},{38,35,890},{40,9,14},{0,27,891},{16,5,3048},{0,27,891},{42,1,900},{42,1,900},{42,1,900},{42,41,885},{24,1,654},{40,25,21},{40,25,21},{24,45,77},{2,9,651},{4,29,6},{14,5,2}, +{14,5,2},{14,5,2},{14,27,2},{39,0,648},{10,25,2},{10,25,2},{4,29,5},{9,28,648},{4,29,5},{1,0,882},{44,19,2},{47,9,4},{8,9,5},{1,0,882},{0,1,882},{8,9,5},{0,27,890},{0,1,882},{0,27,890},{42,0,884},{42,0,884},{42,0,884},{42,0,884},{24,7,5},{24,7,5},{24,7,5},{24,31,4},{4,29,2},{4,29,2},{14,1,2774},{28,1,940},{44,7,1318}, +{12,39,966},{12,1,3700},{40,35,916},{10,23,22},{40,11,1348},{16,19,3051},{34,41,940},{47,1,1061},{30,3,9},{46,23,86},{30,9,190},{14,1,3048},{8,19,886},{26,39,20},{16,41,882},{4,5,3048},{16,41,882},{28,1,915},{28,1,915},{28,1,915},{28,25,890},{10,1,657},{10,39,10},{10,39,10},{40,29,77},{18,39,654},{36,13,5},{46,35,4},{46,35,4},{46,35,4},{46,11,4},{23,2,648}, +{42,9,4},{42,9,4},{6,13,0},{20,9,648},{6,13,0},{15,1,882},{30,3,0},{31,23,2},{24,23,1},{15,1,882},{9,11,882},{24,23,1},{0,41,882},{9,11,882},{0,41,882},{28,0,890},{28,0,890},{28,0,890},{28,0,890},{10,7,1},{10,7,1},{10,7,1},{10,15,1},{20,43,1},{20,43,1},{46,1,3014},{14,1,951},{14,37,1330},{44,23,958},{14,1,3865},{26,19,913},{26,7,22}, +{10,41,1348},{32,33,3049},{20,25,943},{15,1,1154},{47,33,6},{31,37,77},{46,23,185},{17,0,3048},{40,3,885},{42,7,10},{2,25,890},{18,3,3048},{2,25,890},{14,1,950},{14,1,950},{14,1,950},{44,39,885},{42,1,672},{26,7,21},{26,7,21},{26,43,77},{34,7,652},{6,27,10},{47,3,2},{47,3,2},{47,3,2},{47,25,2},{37,2,648},{12,23,2},{12,23,2},{6,27,10},{34,7,648}, +{6,27,10},{27,5,882},{46,17,2},{45,7,2},{10,7,1},{27,5,882},{6,1,882},{10,7,1},{0,25,890},{6,1,882},{0,25,890},{44,0,884},{44,0,884},{44,0,884},{44,0,884},{26,5,5},{26,5,5},{26,5,5},{26,29,4},{6,27,1},{6,27,1},{47,1,3214},{30,1,1015},{46,5,1318},{14,37,966},{30,1,4009},{42,33,916},{12,21,22},{42,9,1348},{18,17,3051},{20,39,956},{29,1,1240}, +{31,1,5},{15,21,66},{31,7,185},{27,9,3048},{10,17,886},{12,21,21},{2,39,885},{14,7,3048},{2,39,885},{30,1,990},{30,1,990},{30,1,990},{30,23,890},{28,1,715},{12,37,10},{12,37,10},{12,27,75},{20,37,651},{38,11,5},{31,17,4},{31,17,4},{31,17,4},{31,9,8},{44,1,648},{28,7,2},{28,7,2},{8,11,0},{26,9,648},{8,11,0},{17,10,882},{31,1,1},{29,21,1}, +{26,21,1},{17,10,882},{24,1,882},{26,21,1},{0,39,884},{24,1,882},{0,39,884},{30,0,890},{30,0,890},{30,0,890},{30,0,890},{12,5,1},{12,5,1},{12,5,1},{12,13,1},{22,41,1},{22,41,1},{15,1,3526},{47,1,1153},{47,19,1337},{46,5,958},{47,1,4231},{28,17,910},{44,5,18},{12,39,1363},{20,1,3067},{22,23,945},{43,1,1380},{45,1,25},{29,35,70},{45,21,185},{13,3,3048}, +{12,1,888},{44,5,9},{18,7,901},{44,5,3048},{18,7,901},{47,1,1053},{47,1,1053},{47,1,1053},{46,37,890},{14,1,762},{44,5,14},{44,5,14},{28,41,69},{6,5,650},{8,25,6},{45,1,0},{45,1,0},{45,1,0},{45,23,0},{31,5,648},{14,21,0},{14,21,0},{24,25,4},{14,9,648},{24,25,4},{41,1,882},{29,1,18},{43,5,4},{12,5,5},{41,1,882},{47,3,882},{12,5,5}, +{0,7,900},{47,3,882},{0,7,900},{46,0,890},{46,0,890},{46,0,890},{46,0,890},{28,3,5},{28,3,5},{28,3,5},{28,27,4},{8,25,2},{8,25,2},{29,1,3764},{15,1,1379},{15,3,1335},{47,35,950},{15,1,4477},{14,1,925},{14,19,21},{28,7,1356},{22,1,3145},{38,37,947},{11,1,1485},{13,1,91},{13,19,74},{29,35,178},{43,1,3048},{14,1,925},{14,19,21},{20,37,882},{8,1,3048}, +{20,37,882},{31,1,1146},{31,1,1146},{31,1,1146},{31,21,890},{46,1,841},{14,35,16},{14,35,16},{14,25,85},{38,35,649},{40,9,5},{13,1,10},{13,1,10},{13,1,10},{13,7,9},{17,2,648},{30,35,1},{30,35,1},{10,9,2},{16,1,648},{10,9,2},{9,1,882},{43,1,68},{27,19,1},{28,19,1},{9,1,882},{46,1,882},{28,19,1},{0,37,882},{46,1,882},{0,37,882},{31,0,890}, +{31,0,890},{31,0,890},{31,0,890},{14,3,1},{14,3,1},{14,3,1},{14,11,1},{40,9,4},{40,9,4},{13,1,4076},{29,1,1612},{45,17,1337},{15,3,950},{29,1,4684},{46,1,1035},{46,3,23},{14,37,1363},{24,1,3256},{24,21,945},{41,1,1650},{27,1,236},{27,33,70},{13,19,174},{11,1,3048},{47,1,1013},{46,3,14},{20,5,901},{5,9,3048},{20,5,901},{45,1,1188},{45,1,1188},{45,1,1188}, +{15,35,883},{47,1,910},{46,3,19},{46,3,19},{30,39,77},{8,3,651},{10,23,6},{43,1,36},{43,1,36},{43,1,36},{43,21,1},{29,3,648},{47,19,5},{47,19,5},{26,23,4},{43,9,648},{26,23,4},{19,9,882},{41,1,146},{41,3,4},{14,3,5},{19,9,882},{45,1,882},{14,3,5},{0,5,900},{45,1,882},{0,5,900},{15,0,882},{15,0,882},{15,0,882},{15,0,882},{30,1,5}, +{30,1,5},{30,1,5},{30,25,4},{10,23,2},{10,23,2},{11,1,4374},{13,1,1924},{13,1,1335},{45,33,961},{13,1,4972},{47,1,1225},{47,17,22},{30,5,1356},{26,1,3460},{40,35,940},{9,1,1755},{41,1,434},{11,17,74},{27,3,185},{23,5,3048},{15,1,1146},{47,17,18},{22,35,882},{14,1,3048},{22,35,882},{13,1,1299},{13,1,1299},{13,1,1299},{29,19,890},{15,1,1017},{47,33,13},{47,33,13}, +{46,23,86},{40,33,652},{42,7,5},{11,1,45},{11,1,45},{11,1,45},{27,5,5},{39,11,648},{31,3,2},{31,3,2},{12,7,0},{22,1,648},{12,7,0},{21,17,882},{9,1,250},{25,17,1},{30,17,1},{21,17,882},{17,21,882},{30,17,1},{0,35,882},{17,21,882},{0,35,882},{29,0,890},{29,0,890},{29,0,890},{29,0,890},{47,1,5},{47,1,5},{47,1,5},{47,9,4},{26,37,4}, +{26,37,4},{41,1,4427},{27,1,2227},{27,1,1443},{13,17,925},{11,1,4878},{45,1,1331},{15,1,21},{47,35,1178},{44,1,3438},{26,19,810},{23,1,1746},{9,1,557},{25,1,89},{11,17,142},{23,17,2814},{13,1,1125},{15,1,5},{24,19,765},{45,17,2814},{24,19,765},{27,1,1443},{27,1,1443},{27,1,1443},{13,33,884},{29,1,1132},{15,1,21},{15,1,21},{31,37,69},{10,1,648},{28,21,5},{25,1,89}, +{25,1,89},{25,1,89},{41,19,1},{25,5,648},{45,17,2},{45,17,2},{28,21,1},{10,1,648},{28,21,1},{19,3,761},{7,1,274},{39,1,0},{31,1,0},{19,3,761},{39,1,761},{31,1,0},{0,19,765},{39,1,761},{0,19,765},{13,0,884},{13,0,884},{13,0,884},{13,0,884},{15,1,17},{15,1,17},{15,1,17},{31,23,4},{12,5,4},{12,5,4},{9,1,3933},{11,1,2185},{11,1,1509}, +{27,1,899},{41,1,4346},{13,1,1109},{45,1,42},{15,19,813},{30,1,2958},{12,3,510},{7,1,1386},{23,1,483},{39,1,128},{25,17,59},{3,25,2249},{11,1,870},{13,1,4},{10,3,482},{29,1,2249},{10,3,482},{11,1,1509},{11,1,1509},{11,1,1509},{27,17,890},{43,1,1275},{45,1,42},{45,1,42},{45,21,86},{12,1,675},{44,5,10},{39,1,128},{39,1,128},{39,1,128},{9,3,5},{9,3,648}, +{13,1,4},{13,1,4},{14,5,2},{31,3,648},{14,5,2},{3,3,481},{21,1,180},{7,1,1},{13,1,0},{3,3,481},{7,1,481},{13,1,0},{0,3,481},{7,1,481},{0,3,481},{27,0,890},{27,0,890},{27,0,890},{27,0,890},{45,1,26},{45,1,26},{45,1,26},{45,7,1},{44,35,2},{44,35,2},{39,1,3541},{9,1,2173},{25,1,1658},{11,1,893},{9,1,3801},{27,1,1035},{13,1,116}, +{45,3,523},{47,1,2574},{44,33,282},{21,1,1070},{7,1,427},{23,1,194},{39,1,16},{21,17,1769},{25,1,673},{27,1,26},{12,33,265},{17,21,1769},{12,33,265},{25,1,1658},{25,1,1658},{25,1,1658},{11,1,893},{11,1,1386},{13,1,116},{13,1,116},{29,35,69},{14,1,734},{14,19,6},{23,1,194},{23,1,194},{23,1,194},{39,17,1},{23,3,648},{27,1,26},{27,1,26},{14,19,5},{43,3,648}, +{14,19,5},{33,3,265},{35,1,89},{5,1,4},{25,1,0},{33,3,265},{21,1,265},{25,1,0},{0,33,265},{21,1,265},{0,33,265},{11,0,884},{11,0,884},{11,0,884},{11,0,884},{13,1,52},{13,1,52},{13,1,52},{29,21,4},{14,19,2},{14,19,2},{23,1,3267},{39,1,2157},{9,1,1764},{25,1,954},{39,1,3397},{11,1,950},{27,1,267},{13,33,297},{29,1,2313},{30,17,134},{5,1,838}, +{21,1,413},{37,1,260},{7,1,9},{17,39,1374},{23,1,518},{25,1,80},{44,17,125},{39,17,1374},{44,17,125},{9,1,1764},{9,1,1764},{9,1,1764},{25,1,954},{25,1,1569},{27,1,267},{27,1,267},{13,19,77},{47,1,846},{46,3,5},{37,1,260},{37,1,260},{37,1,260},{7,1,9},{3,25,648},{25,1,80},{25,1,80},{47,3,1},{29,1,648},{47,3,1},{33,1,113},{19,1,37},{19,1,1}, +{7,1,0},{33,1,113},{35,1,113},{7,1,0},{0,17,125},{35,1,113},{0,17,125},{25,0,890},{25,0,890},{25,0,890},{25,0,890},{27,1,98},{27,1,98},{27,1,98},{43,5,1},{46,3,4},{46,3,4},{7,1,3032},{7,1,2233},{23,1,1944},{39,1,1083},{7,1,3096},{9,1,1028},{41,1,506},{27,17,151},{13,1,2068},{47,17,31},{35,1,693},{5,1,425},{5,1,325},{21,1,52},{3,3,1032}, +{7,1,406},{23,1,157},{31,17,26},{3,3,1032},{31,17,26},{23,1,1944},{23,1,1944},{23,1,1944},{39,1,1083},{39,1,1723},{41,1,506},{41,1,506},{27,33,78},{45,1,1034},{47,17,6},{5,1,325},{5,1,325},{5,1,325},{21,1,52},{19,5,648},{23,1,157},{23,1,157},{31,17,1},{37,3,648},{31,17,1},{17,1,18},{17,1,10},{33,1,1},{19,1,0},{17,1,18},{33,1,18},{19,1,0}, +{0,17,26},{33,1,18},{0,17,26},{9,0,890},{9,0,890},{9,0,890},{9,0,890},{41,1,145},{41,1,145},{41,1,145},{27,19,4},{47,1,5},{47,1,5},{21,1,2710},{37,1,2207},{7,1,2004},{23,1,1173},{21,1,2775},{39,1,1036},{9,1,643},{41,1,81},{11,1,1900},{15,1,9},{3,1,524},{19,1,401},{19,1,365},{5,1,104},{33,33,771},{5,1,369},{37,1,221},{29,1,1},{33,33,771}, +{29,1,1},{7,1,2004},{7,1,2004},{7,1,2004},{23,1,1173},{23,1,1784},{9,1,643},{9,1,643},{41,17,61},{13,1,1091},{15,1,9},{19,1,365},{19,1,365},{19,1,365},{5,1,104},{33,5,578},{37,1,221},{37,1,221},{29,1,1},{23,1,578},{29,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{23,0,884}, +{23,0,884},{23,0,884},{23,0,884},{9,1,202},{9,1,202},{9,1,202},{41,3,1},{15,1,9},{15,1,9},{5,1,2214},{21,1,1813},{21,1,1669},{7,1,1109},{21,1,2151},{23,1,874},{23,1,585},{25,1,13},{25,1,1508},{13,1,34},{3,1,300},{3,1,225},{3,1,200},{19,1,61},{33,17,451},{35,1,192},{5,1,125},{11,1,0},{17,33,451},{11,1,0},{21,1,1669},{21,1,1669},{21,1,1669}, +{7,1,1109},{7,1,1460},{23,1,585},{23,1,585},{25,1,13},{11,1,872},{13,1,34},{3,1,200},{3,1,200},{3,1,200},{19,1,61},{17,5,338},{5,1,125},{5,1,125},{11,1,0},{5,17,338},{11,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{7,0,884},{7,0,884},{7,0,884},{7,0,884},{39,1,250}, +{39,1,250},{39,1,250},{25,17,4},{13,1,34},{13,1,34},{35,1,1818},{5,1,1521},{5,1,1421},{21,1,1028},{5,1,1675},{7,1,790},{7,1,565},{39,1,2},{23,1,1155},{11,1,100},{33,1,147},{33,1,107},{33,1,98},{3,1,29},{1,19,216},{19,1,88},{19,1,52},{23,1,1},{19,1,216},{23,1,1},{5,1,1421},{5,1,1421},{5,1,1421},{21,1,1028},{21,1,1158},{7,1,565},{7,1,565}, +{39,1,2},{25,1,723},{11,1,100},{33,1,98},{33,1,98},{33,1,98},{3,1,29},{33,17,162},{19,1,52},{19,1,52},{23,1,1},{17,33,162},{23,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{21,0,884},{21,0,884},{21,0,884},{21,0,884},{7,1,340},{7,1,340},{7,1,340},{39,1,2},{11,1,100}, +{11,1,100},{0,13,1568},{0,14,185},{0,10,5},{0,8,586},{0,44,3371},{0,24,2147},{0,8,1027},{0,36,2571},{0,6,3617},{0,20,2729},{0,13,1568},{0,14,185},{0,10,5},{0,8,586},{18,8,3371},{0,24,2147},{0,8,1027},{0,36,2571},{44,0,3371},{0,36,2571},{0,24,1},{0,24,1},{0,24,1},{0,20,1},{0,20,288},{0,34,100},{0,34,100},{0,2,164},{0,2,321},{0,2,189},{0,24,1}, +{0,24,1},{0,24,1},{0,20,1},{32,2,288},{0,34,100},{0,34,100},{0,2,164},{20,0,288},{0,2,164},{24,2,1568},{0,14,185},{0,10,5},{0,8,586},{24,2,1568},{13,0,1568},{0,8,586},{0,22,1576},{13,0,1568},{0,22,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,25,1568},{0,46,89},{0,26,20}, +{0,40,505},{0,46,3968},{0,10,2316},{0,24,1078},{0,6,2880},{0,22,4305},{0,6,3105},{0,25,1568},{0,46,89},{0,26,20},{0,40,505},{18,10,3968},{0,10,2316},{0,24,1078},{0,6,2880},{46,0,3968},{0,6,2880},{0,12,1},{0,12,1},{0,12,1},{0,6,0},{0,6,514},{0,20,193},{0,20,193},{0,18,317},{0,18,556},{0,18,353},{0,12,1},{0,12,1},{0,12,1},{0,6,0},{2,2,512}, +{0,20,193},{0,20,193},{0,18,317},{2,2,512},{0,18,317},{16,11,1568},{0,46,89},{16,26,5},{0,40,505},{16,11,1568},{25,0,1568},{0,40,505},{0,38,1570},{25,0,1568},{0,38,1570},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,7,1568},{0,15,37},{16,12,76},{0,10,421},{0,15,4652},{0,42,2540},{0,10,1097}, +{0,38,3251},{0,8,5108},{0,22,3545},{0,7,1568},{0,15,37},{16,12,51},{0,10,421},{38,2,4651},{0,42,2540},{0,10,1097},{0,38,3251},{16,8,4651},{0,38,3251},{0,46,0},{0,46,0},{0,46,0},{0,38,1},{0,8,802},{0,6,289},{0,6,289},{0,34,493},{0,34,872},{0,34,557},{0,46,0},{0,46,0},{0,46,0},{0,38,1},{4,0,802},{0,6,289},{0,6,289},{0,34,493},{8,0,802}, +{0,34,493},{26,4,1568},{0,15,37},{32,12,2},{0,10,421},{26,4,1568},{7,0,1568},{0,10,421},{0,24,1576},{7,0,1568},{0,24,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,19,1570},{0,29,8},{16,44,166},{0,12,338},{0,29,5420},{0,28,2755},{0,26,1208},{0,8,3659},{0,24,5988},{0,38,4028},{0,19,1570}, +{0,29,8},{16,44,141},{0,12,338},{40,0,5419},{0,28,2755},{0,26,1208},{0,8,3659},{46,2,5419},{0,8,3659},{0,45,0},{0,45,0},{0,45,0},{0,24,1},{0,24,1154},{0,22,433},{0,22,433},{0,4,697},{0,4,1270},{0,4,797},{0,45,0},{0,45,0},{0,45,0},{0,24,1},{18,4,1152},{0,22,433},{0,22,433},{0,4,697},{36,2,1152},{0,4,697},{14,0,1568},{0,29,8},{18,28,1}, +{0,12,338},{14,0,1568},{8,10,1568},{0,12,338},{0,40,1568},{8,10,1568},{0,40,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{16,17,1609},{16,43,45},{32,30,282},{0,28,325},{0,25,5419},{0,14,2514},{0,12,804},{0,24,3462},{0,10,6191},{0,8,3965},{32,3,1574},{32,13,17},{2,14,130},{16,28,312},{16,11,5419}, +{0,14,2514},{0,12,804},{0,24,3462},{25,0,5419},{0,24,3462},{16,43,41},{16,43,41},{16,43,41},{16,10,42},{0,28,1152},{0,40,292},{0,40,292},{0,36,596},{0,6,1379},{0,20,761},{32,29,4},{32,29,4},{32,29,4},{32,10,5},{2,24,1152},{0,40,292},{0,40,292},{0,36,596},{28,0,1152},{0,36,596},{30,2,1568},{0,27,4},{4,14,1},{0,28,244},{30,2,1568},{35,2,1568},{0,28,244}, +{0,26,1570},{35,2,1568},{0,26,1570},{16,0,41},{16,0,41},{16,0,41},{16,0,41},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,32,13},{0,32,13},{32,1,1733},{32,11,159},{32,46,455},{16,14,377},{0,7,5419},{0,47,2294},{0,44,542},{0,10,3225},{0,12,6401},{0,10,3901},{2,17,1569},{2,27,6},{18,46,125},{32,14,296},{26,4,5419},{0,47,2294},{0,44,542},{0,10,3225},{7,0,5419}, +{0,10,3225},{32,11,158},{32,11,158},{32,11,158},{32,42,157},{0,46,1154},{0,26,170},{0,26,170},{0,22,482},{0,22,1491},{0,6,739},{2,27,2},{2,27,2},{2,27,2},{2,26,5},{22,2,1152},{0,26,170},{0,26,170},{0,22,482},{42,2,1152},{0,22,482},{47,2,1568},{32,11,2},{20,30,5},{0,14,185},{47,2,1568},{17,2,1568},{0,14,185},{0,42,1570},{17,2,1568},{0,42,1570},{32,0,157}, +{32,0,157},{32,0,157},{32,0,157},{0,22,0},{0,22,0},{0,22,0},{0,34,1},{0,18,45},{0,18,45},{2,1,2003},{32,9,330},{2,31,710},{32,30,517},{0,35,5420},{0,15,2081},{0,30,345},{0,42,3099},{0,28,6641},{0,10,3885},{34,1,1574},{34,11,17},{4,47,134},{18,30,312},{14,0,5419},{0,15,2081},{0,30,345},{0,42,3099},{8,10,5419},{0,42,3099},{32,23,317},{32,23,317},{32,23,317}, +{32,28,317},{0,29,1154},{0,28,80},{0,28,80},{0,8,388},{0,8,1665},{0,38,753},{34,27,4},{34,27,4},{34,27,4},{34,12,5},{8,2,1152},{0,28,80},{0,28,80},{0,8,388},{30,2,1152},{0,8,388},{15,2,1568},{18,41,4},{36,47,5},{0,46,125},{15,2,1568},{33,4,1568},{0,46,125},{0,28,1576},{33,4,1568},{0,28,1576},{32,0,317},{32,0,317},{32,0,317},{32,0,317},{0,40,0}, +{0,40,0},{0,40,0},{0,20,0},{0,34,113},{0,34,113},{18,1,2395},{2,23,570},{18,45,1046},{2,47,725},{0,1,5419},{0,13,1947},{0,47,185},{0,12,2880},{0,14,6964},{0,12,3841},{20,1,1593},{4,25,6},{20,15,131},{34,46,326},{0,1,5419},{0,13,1947},{0,47,185},{0,12,2880},{1,0,5419},{0,12,2880},{2,21,546},{2,21,546},{2,21,546},{2,14,545},{0,11,1152},{0,30,37},{0,30,37}, +{0,24,317},{0,10,1846},{0,8,797},{4,25,2},{4,25,2},{4,25,2},{4,28,2},{24,4,1152},{0,30,37},{0,30,37},{0,24,317},{11,0,1152},{0,24,317},{43,0,1568},{34,9,1},{22,31,1},{0,47,85},{43,0,1568},{19,6,1568},{0,47,85},{0,44,1570},{19,6,1568},{0,44,1570},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,28,0},{0,28,0},{0,28,0},{0,6,1},{0,20,208}, +{0,20,208},{4,1,3030},{18,37,927},{34,29,1474},{18,15,1042},{16,1,5540},{0,27,1787},{0,15,57},{0,44,2668},{0,46,7299},{0,28,3836},{6,1,1612},{36,39,10},{6,29,136},{20,31,312},{47,2,5419},{0,27,1787},{0,15,57},{0,44,2668},{17,2,5419},{0,44,2668},{18,19,883},{18,19,883},{18,19,883},{18,46,882},{0,23,1152},{0,31,5},{0,31,5},{0,10,225},{0,26,2064},{0,10,901},{36,9,2}, +{36,9,2},{36,9,2},{36,14,1},{38,10,1152},{0,31,5},{0,31,5},{0,10,225},{23,0,1152},{0,10,225},{38,3,1568},{20,39,4},{8,45,5},{0,15,41},{38,3,1568},{35,8,1568},{0,15,41},{0,30,1570},{35,8,1568},{0,30,1570},{18,0,882},{18,0,882},{18,0,882},{18,0,882},{0,47,1},{0,47,1},{0,47,1},{0,8,1},{0,6,325},{0,6,325},{20,1,3734},{34,5,1332},{4,43,1958}, +{18,45,1395},{2,1,5808},{0,25,1676},{0,29,20},{0,30,2566},{0,15,7631},{0,44,3925},{22,1,1656},{6,7,9},{22,13,132},{6,45,309},{15,2,5419},{0,25,1676},{0,29,20},{0,30,2566},{33,4,5419},{0,30,2566},{34,33,1258},{34,33,1258},{34,33,1258},{34,47,1259},{0,5,1154},{0,45,5},{0,45,5},{0,42,180},{0,12,2275},{0,10,981},{6,23,4},{6,23,4},{6,23,4},{6,46,5},{28,2,1152}, +{16,15,1},{16,15,1},{0,42,180},{42,8,1152},{0,42,180},{41,2,1568},{36,7,2},{24,29,5},{0,29,20},{41,2,1568},{17,8,1568},{0,29,20},{0,46,1576},{17,8,1568},{0,46,1576},{34,0,1258},{34,0,1258},{34,0,1258},{34,0,1258},{0,29,0},{0,29,0},{0,29,0},{0,40,1},{0,38,482},{0,38,482},{36,1,4356},{4,19,1676},{20,27,2370},{34,13,1683},{18,1,6121},{0,39,1616},{16,43,36}, +{0,46,2397},{0,45,7815},{0,46,3837},{8,1,1715},{38,37,10},{8,43,131},{22,29,312},{43,0,5419},{0,39,1612},{16,43,27},{0,46,2393},{19,6,5419},{0,46,2393},{4,1,1577},{4,1,1577},{4,1,1577},{4,15,1576},{0,17,1156},{16,13,22},{16,13,22},{0,12,134},{0,44,2441},{0,12,971},{38,23,1},{38,23,1},{38,23,1},{38,47,2},{16,3,1152},{32,29,1},{32,29,1},{0,12,130},{17,0,1152}, +{0,12,130},{29,12,1568},{22,37,4},{10,43,5},{0,43,10},{29,12,1568},{26,13,1568},{0,43,10},{0,31,1576},{26,13,1568},{0,31,1576},{4,0,1576},{4,0,1576},{4,0,1576},{4,0,1576},{0,41,4},{0,41,4},{0,41,4},{0,26,4},{0,24,562},{0,24,562},{22,1,4616},{20,3,1677},{6,41,2378},{20,43,1681},{4,1,6311},{16,7,1620},{32,27,20},{0,31,2365},{0,43,7444},{0,47,3383},{40,1,1766}, +{8,5,11},{24,11,132},{8,13,314},{11,0,5419},{0,37,1577},{32,27,19},{0,31,2265},{5,8,5419},{0,31,2265},{20,1,1593},{20,1,1593},{20,1,1593},{20,29,1569},{32,1,1155},{32,27,19},{32,27,19},{16,44,125},{0,46,2150},{0,28,659},{8,21,2},{8,21,2},{8,21,2},{8,31,2},{30,4,1152},{18,13,1},{18,13,1},{0,44,72},{15,8,1152},{0,44,72},{37,0,1568},{38,5,2},{26,27,2}, +{0,27,2},{37,0,1568},{36,9,1568},{0,27,2},{0,15,1568},{36,9,1568},{0,15,1568},{20,0,1568},{20,0,1568},{20,0,1568},{20,0,1568},{32,41,1},{32,41,1},{32,41,1},{32,42,2},{0,26,388},{0,26,388},{8,1,4936},{6,17,1676},{22,9,2363},{36,11,1689},{36,1,6476},{2,37,1620},{18,41,24},{32,15,2370},{0,41,7036},{0,15,2859},{26,1,1851},{40,35,11},{10,25,136},{24,27,321},{41,2,5419}, +{16,5,1571},{18,41,20},{0,15,2130},{17,8,5419},{0,15,2130},{6,1,1619},{6,1,1619},{6,1,1619},{6,13,1571},{18,1,1158},{18,11,21},{18,11,21},{2,30,125},{0,31,1905},{0,14,425},{40,5,2},{40,5,2},{40,5,2},{40,45,2},{45,0,1152},{4,27,5},{4,27,5},{0,30,41},{27,8,1152},{0,30,41},{21,2,1568},{24,19,2},{12,41,1},{16,41,1},{21,2,1568},{24,9,1568},{16,41,1}, +{0,29,1570},{24,9,1568},{0,29,1570},{6,0,1570},{6,0,1570},{6,0,1570},{6,0,1570},{18,25,4},{18,25,4},{18,25,4},{18,28,5},{0,28,232},{0,28,232},{24,1,5154},{38,1,1680},{8,39,2378},{22,41,1683},{22,1,6708},{18,5,1628},{34,25,24},{2,29,2363},{0,9,6740},{0,45,2553},{12,1,1964},{10,3,8},{26,9,139},{40,41,309},{29,12,5419},{2,35,1572},{4,25,21},{0,29,2027},{26,13,5419}, +{0,29,2027},{38,1,1664},{38,1,1664},{38,1,1664},{22,27,1570},{4,1,1185},{34,25,20},{34,25,20},{34,46,130},{0,45,1721},{0,46,218},{10,19,4},{10,19,4},{10,19,4},{10,13,8},{29,2,1152},{20,11,5},{20,11,5},{0,47,25},{35,6,1152},{0,47,25},{35,2,1568},{10,3,4},{28,25,5},{18,25,4},{35,2,1568},{34,5,1568},{18,25,4},{0,13,1570},{34,5,1568},{0,13,1570},{22,0,1570}, +{22,0,1570},{22,0,1570},{22,0,1570},{34,23,1},{34,23,1},{34,23,1},{34,14,4},{0,14,149},{0,14,149},{26,1,5444},{8,1,1724},{24,23,2378},{38,9,1689},{8,1,6964},{4,35,1620},{20,39,36},{34,13,2370},{0,23,6513},{0,13,2244},{44,1,2099},{42,33,11},{12,23,136},{26,25,321},{37,0,5419},{18,3,1571},{20,39,27},{0,43,1924},{36,9,5419},{0,43,1924},{8,1,1720},{8,1,1720},{8,1,1720}, +{8,11,1577},{36,1,1224},{20,9,19},{20,9,19},{4,47,122},{0,43,1548},{0,31,90},{42,19,1},{42,19,1},{42,19,1},{42,43,2},{43,2,1152},{6,25,5},{6,25,5},{0,31,9},{21,8,1152},{0,31,9},{46,1,1568},{26,17,2},{14,39,2},{18,39,1},{46,1,1568},{26,7,1568},{18,39,1},{0,27,1576},{26,7,1568},{0,27,1576},{8,0,1576},{8,0,1576},{8,0,1576},{8,0,1576},{20,23,9}, +{20,23,9},{20,23,9},{4,30,10},{0,47,73},{0,47,73},{42,1,5700},{40,1,1798},{40,37,2375},{24,39,1683},{40,1,7153},{20,3,1626},{36,23,24},{4,27,2386},{0,21,6243},{0,27,1980},{30,1,2210},{12,1,8},{28,7,132},{42,39,323},{5,0,5419},{4,33,1572},{6,23,21},{0,27,1836},{0,5,5419},{0,27,1836},{40,1,1762},{40,1,1762},{40,1,1762},{24,25,1570},{6,1,1275},{36,23,20},{36,23,20}, +{36,15,125},{0,41,1395},{0,45,25},{12,17,4},{12,17,4},{12,17,4},{12,11,8},{38,1,1152},{22,9,4},{22,9,4},{0,45,0},{43,28,1152},{0,45,0},{31,1,1568},{42,1,2},{30,23,5},{4,23,5},{31,1,1568},{32,1,1568},{4,23,5},{0,11,1570},{32,1,1568},{0,11,1570},{24,0,1570},{24,0,1570},{24,0,1570},{24,0,1570},{36,21,1},{36,21,1},{36,21,1},{36,46,4},{0,15,25}, +{0,15,25},{28,1,6116},{26,1,1980},{26,5,2386},{40,7,1689},{26,1,7408},{6,17,1620},{22,37,24},{36,41,2375},{0,35,6044},{0,41,1798},{47,1,2385},{44,1,25},{14,37,125},{28,23,315},{35,2,5419},{20,1,1569},{22,37,20},{0,41,1762},{34,5,5419},{0,41,1762},{26,1,1836},{26,1,1836},{26,1,1836},{10,9,1574},{38,1,1363},{22,7,21},{22,7,21},{6,29,132},{0,9,1284},{0,13,8},{44,1,0}, +{44,1,0},{44,1,0},{44,41,0},{39,0,1152},{8,23,4},{8,23,4},{16,13,4},{9,28,1152},{16,13,4},{17,6,1568},{14,1,25},{47,37,4},{20,37,1},{17,6,1568},{20,1,1568},{20,37,1},{0,25,1570},{20,1,1568},{0,25,1570},{10,0,1570},{10,0,1570},{10,0,1570},{10,0,1570},{22,5,5},{22,5,5},{22,5,5},{22,31,5},{0,43,2},{0,43,2},{14,1,6434},{12,1,2244},{12,35,2370}, +{26,21,1685},{12,1,7724},{38,1,1620},{38,21,36},{22,25,2378},{0,3,5839},{0,9,1724},{31,1,2546},{30,1,90},{46,5,122},{14,7,322},{46,1,5419},{22,1,1602},{8,21,19},{0,9,1720},{26,7,5419},{0,9,1720},{42,1,1924},{42,1,1924},{42,1,1924},{26,23,1577},{24,1,1414},{38,21,27},{38,21,27},{22,13,136},{0,7,1218},{32,43,11},{30,1,9},{30,1,9},{30,1,9},{14,9,10},{23,2,1152}, +{24,7,5},{24,7,5},{18,43,1},{20,9,1152},{18,43,1},{27,3,1568},{46,1,73},{31,5,10},{36,5,9},{27,3,1568},{39,9,1568},{36,5,9},{0,9,1576},{39,9,1568},{0,9,1576},{26,0,1576},{26,0,1576},{26,0,1576},{26,0,1576},{38,19,1},{38,19,1},{38,19,1},{38,15,2},{16,27,2},{16,27,2},{30,1,6786},{44,1,2553},{28,3,2363},{42,5,1689},{28,1,8052},{24,1,1671},{24,35,24}, +{38,9,2378},{0,1,5715},{0,39,1680},{45,1,2675},{47,1,218},{47,35,130},{30,21,315},{31,1,5419},{24,1,1667},{24,35,20},{0,39,1664},{32,1,5419},{0,39,1664},{28,1,2027},{28,1,2027},{28,1,2027},{12,7,1571},{10,1,1521},{24,5,21},{24,5,21},{8,27,139},{0,21,1169},{2,11,8},{46,1,25},{46,1,25},{46,1,25},{46,39,1},{37,2,1152},{10,21,5},{10,21,5},{18,11,4},{34,7,1152}, +{18,11,4},{39,7,1568},{15,1,149},{15,35,4},{22,35,1},{39,7,1568},{26,1,1568},{22,35,1},{0,23,1570},{26,1,1568},{0,23,1570},{12,0,1570},{12,0,1570},{12,0,1570},{12,0,1570},{24,19,4},{24,19,4},{24,19,4},{24,29,5},{2,11,4},{2,11,4},{47,1,7186},{14,1,2859},{14,33,2370},{28,35,1683},{30,1,8313},{40,1,1819},{40,19,24},{8,23,2363},{16,1,5820},{16,7,1676},{13,1,2892}, +{15,1,425},{31,3,125},{47,35,321},{45,1,5419},{26,1,1796},{10,19,21},{0,7,1619},{27,9,5419},{0,7,1619},{14,1,2130},{14,1,2130},{14,1,2130},{28,21,1570},{42,1,1608},{40,19,20},{40,19,20},{24,11,136},{0,19,1155},{34,41,11},{31,1,41},{31,1,41},{31,1,41},{47,7,5},{44,1,1152},{26,5,5},{26,5,5},{4,41,2},{26,9,1152},{4,41,2},{25,1,1568},{29,1,232},{29,19,5}, +{24,19,4},{25,1,1568},{33,9,1568},{24,19,4},{0,7,1570},{33,9,1568},{0,7,1570},{28,0,1570},{28,0,1570},{28,0,1570},{28,0,1570},{40,17,1},{40,17,1},{40,17,1},{40,13,1},{18,25,2},{18,25,2},{15,1,7706},{46,1,3383},{30,1,2365},{14,3,1685},{47,1,8695},{42,1,2092},{26,33,20},{40,7,2378},{4,1,6099},{2,21,1677},{27,1,3152},{29,1,659},{45,17,125},{31,19,315},{27,3,5419}, +{44,1,1993},{26,33,19},{0,21,1593},{39,9,5419},{0,21,1593},{30,1,2265},{30,1,2265},{30,1,2265},{14,5,1572},{28,1,1764},{26,33,19},{26,33,19},{10,25,132},{32,3,1155},{4,9,11},{45,1,72},{45,1,72},{45,1,72},{15,37,1},{31,5,1152},{12,19,1},{12,19,1},{20,9,2},{14,9,1152},{20,9,2},{23,17,1568},{27,1,388},{43,33,2},{40,33,1},{23,17,1568},{45,17,1568},{40,33,1}, +{0,21,1568},{45,17,1568},{0,21,1568},{14,0,1568},{14,0,1568},{14,0,1568},{14,0,1568},{26,1,2},{26,1,2},{26,1,2},{26,27,2},{4,39,2},{4,39,2},{45,1,8016},{47,1,3837},{47,1,2397},{30,17,1685},{31,1,9093},{28,1,2484},{42,17,36},{26,21,2370},{36,1,6379},{18,5,1676},{11,1,3345},{13,1,971},{13,1,134},{15,33,326},{39,7,5419},{30,1,2185},{12,17,22},{0,5,1577},{26,1,5419}, +{0,5,1577},{47,1,2393},{47,1,2393},{47,1,2393},{30,19,1576},{14,1,1890},{42,17,27},{42,17,27},{42,9,131},{2,17,1152},{36,39,10},{13,1,130},{13,1,130},{13,1,130},{45,5,5},{17,2,1152},{28,33,1},{28,33,1},{22,39,1},{16,1,1152},{22,39,1},{21,3,1568},{25,1,562},{27,1,4},{40,1,4},{21,3,1568},{43,1,1568},{40,1,4},{0,5,1576},{43,1,1568},{0,5,1576},{30,0,1576}, +{30,0,1576},{30,0,1576},{30,0,1576},{42,1,10},{42,1,10},{42,1,10},{42,11,5},{36,23,4},{36,23,4},{13,1,7700},{45,1,3925},{31,1,2566},{47,17,1637},{45,1,8460},{14,1,2285},{28,1,20},{42,5,1958},{38,1,5932},{4,35,1332},{9,1,2987},{11,1,981},{43,1,180},{29,17,219},{9,3,4803},{47,1,1925},{44,1,5},{32,35,1258},{31,3,4803},{32,35,1258},{31,1,2566},{31,1,2566},{31,1,2566}, +{47,3,1577},{30,1,2054},{28,1,20},{28,1,20},{12,23,132},{34,1,1155},{6,7,9},{43,1,180},{43,1,180},{43,1,180},{13,35,1},{29,3,1152},{14,17,1},{14,17,1},{22,7,4},{43,9,1152},{22,7,4},{21,1,1250},{39,1,482},{41,1,1},{28,1,0},{21,1,1250},{41,1,1250},{28,1,0},{0,35,1258},{41,1,1250},{0,35,1258},{47,0,1576},{47,0,1576},{47,0,1576},{47,0,1576},{28,1,20}, +{28,1,20},{28,1,20},{28,25,5},{6,37,2},{6,37,2},{43,1,7164},{29,1,3836},{45,1,2668},{31,1,1579},{13,1,7780},{30,1,2041},{14,1,57},{28,35,1474},{24,1,5308},{36,19,927},{9,1,2475},{11,1,901},{11,1,225},{43,17,110},{37,7,4056},{15,1,1590},{30,1,5},{18,19,883},{30,1,4056},{18,19,883},{45,1,2668},{45,1,2668},{45,1,2668},{31,17,1570},{47,1,2214},{14,1,57},{14,1,57}, +{28,7,136},{36,1,1186},{38,37,10},{11,1,225},{11,1,225},{11,1,225},{43,3,5},{39,11,1152},{30,1,5},{30,1,5},{8,37,2},{22,1,1152},{8,37,2},{5,1,882},{7,1,325},{9,1,1},{46,1,1},{5,1,882},{9,1,882},{46,1,1},{0,19,882},{9,1,882},{0,19,882},{31,0,1570},{31,0,1570},{31,0,1570},{31,0,1570},{14,1,41},{14,1,41},{14,1,41},{44,9,5},{38,21,4}, +{38,21,4},{11,1,6493},{13,1,3841},{13,1,2880},{45,1,1574},{43,1,7071},{47,1,1822},{46,1,185},{44,19,1046},{26,1,4761},{22,3,570},{23,1,2034},{9,1,797},{25,1,317},{11,17,34},{23,17,3318},{13,1,1221},{31,1,37},{20,3,546},{45,17,3318},{20,3,546},{13,1,2880},{13,1,2880},{13,1,2880},{45,1,1574},{45,1,2443},{46,1,185},{46,1,185},{14,21,131},{38,1,1275},{24,5,6},{25,1,317}, +{25,1,317},{25,1,317},{11,33,1},{25,5,1152},{31,1,37},{31,1,37},{24,5,2},{10,1,1152},{24,5,2},{3,3,545},{21,1,208},{7,1,1},{29,1,0},{3,3,545},{23,1,545},{29,1,0},{0,3,545},{23,1,545},{0,3,545},{45,0,1570},{45,0,1570},{45,0,1570},{45,0,1570},{46,1,85},{46,1,85},{46,1,85},{30,23,1},{8,35,1},{8,35,1},{41,1,6095},{11,1,3885},{43,1,3099}, +{13,1,1636},{11,1,6422},{45,1,1767},{31,1,345},{30,3,710},{44,1,4358},{8,33,330},{7,1,1698},{39,1,753},{9,1,388},{41,1,9},{3,25,2753},{27,1,1018},{29,1,80},{22,33,317},{29,1,2753},{22,33,317},{43,1,3099},{43,1,3099},{43,1,3099},{13,1,1636},{29,1,2628},{31,1,345},{31,1,345},{46,5,134},{40,1,1395},{10,35,17},{9,1,388},{9,1,388},{9,1,388},{41,1,9},{9,3,1152}, +{29,1,80},{29,1,80},{26,35,4},{31,3,1152},{26,35,4},{33,3,313},{35,1,113},{21,1,0},{41,1,0},{33,3,313},{21,1,313},{41,1,0},{0,33,317},{21,1,313},{0,33,317},{29,0,1576},{29,0,1576},{29,0,1576},{29,0,1576},{47,1,125},{47,1,125},{47,1,125},{46,37,5},{40,19,4},{40,19,4},{9,1,5661},{11,1,3901},{11,1,3225},{43,1,1739},{41,1,5978},{29,1,1685},{45,1,542}, +{47,33,455},{14,1,3994},{10,33,159},{21,1,1418},{7,1,739},{23,1,482},{9,1,16},{21,17,2273},{11,1,878},{27,1,170},{10,33,158},{17,21,2273},{10,33,158},{11,1,3225},{11,1,3225},{11,1,3225},{43,1,1739},{43,1,2875},{45,1,542},{45,1,542},{47,19,125},{42,1,1584},{26,3,6},{23,1,482},{23,1,482},{23,1,482},{9,1,16},{23,3,1152},{27,1,170},{27,1,170},{26,3,2},{43,3,1152}, +{26,3,2},{17,3,145},{19,1,45},{35,1,1},{23,1,0},{17,3,145},{35,1,145},{23,1,0},{0,33,157},{35,1,145},{0,33,157},{43,0,1570},{43,0,1570},{43,0,1570},{43,0,1570},{15,1,185},{15,1,185},{15,1,185},{31,21,5},{10,33,2},{10,33,2},{39,1,5341},{9,1,3965},{25,1,3462},{11,1,1889},{9,1,5505},{13,1,1765},{13,1,804},{31,33,282},{47,1,3750},{42,17,45},{5,1,1210}, +{21,1,761},{37,1,596},{23,1,73},{17,39,1878},{9,1,781},{41,1,292},{42,17,41},{39,17,1878},{42,17,41},{25,1,3462},{25,1,3462},{25,1,3462},{11,1,1889},{11,1,3058},{13,1,804},{13,1,804},{15,3,130},{44,1,1798},{12,33,17},{37,1,596},{37,1,596},{37,1,596},{23,1,73},{3,25,1152},{41,1,292},{41,1,292},{28,33,4},{29,1,1152},{28,33,4},{1,3,41},{33,1,13},{3,1,1}, +{5,1,1},{1,3,41},{3,1,41},{5,1,1},{0,17,41},{3,1,41},{0,17,41},{27,0,1570},{27,0,1570},{27,0,1570},{27,0,1570},{29,1,244},{29,1,244},{29,1,244},{15,5,1},{26,1,4},{26,1,4},{23,1,5128},{39,1,4028},{9,1,3659},{25,1,2169},{39,1,5148},{11,1,1917},{27,1,1208},{45,17,166},{29,1,3628},{28,1,8},{35,1,1089},{5,1,797},{5,1,697},{37,1,221},{3,3,1536}, +{7,1,706},{23,1,433},{44,1,0},{3,3,1536},{44,1,0},{9,1,3659},{9,1,3659},{9,1,3659},{25,1,2169},{25,1,3366},{27,1,1208},{27,1,1208},{45,17,141},{47,1,2105},{28,1,8},{5,1,697},{5,1,697},{5,1,697},{37,1,221},{19,5,1152},{23,1,433},{23,1,433},{44,1,0},{37,3,1152},{44,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0}, +{0,1,0},{1,1,0},{0,1,0},{41,0,1568},{41,0,1568},{41,0,1568},{41,0,1568},{13,1,338},{13,1,338},{13,1,338},{29,19,1},{28,1,8},{28,1,8},{7,1,4416},{23,1,3545},{39,1,3251},{9,1,2027},{23,1,4372},{41,1,1771},{11,1,1097},{13,17,76},{29,1,2956},{14,1,37},{19,1,753},{35,1,557},{35,1,493},{21,1,148},{17,5,1067},{21,1,513},{7,1,289},{47,1,0},{5,17,1067}, +{47,1,0},{39,1,3251},{39,1,3251},{39,1,3251},{9,1,2027},{9,1,2819},{11,1,1097},{11,1,1097},{13,17,51},{47,1,1769},{14,1,37},{35,1,493},{35,1,493},{35,1,493},{21,1,148},{5,1,802},{7,1,289},{7,1,289},{47,1,0},{9,1,802},{47,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{25,0,1576}, +{25,0,1576},{25,0,1576},{25,0,1576},{11,1,421},{11,1,421},{11,1,421},{13,33,2},{14,1,37},{14,1,37},{21,1,3786},{7,1,3105},{7,1,2880},{23,1,1929},{7,1,3648},{9,1,1532},{25,1,1078},{27,1,20},{13,1,2452},{47,1,89},{3,1,456},{19,1,353},{19,1,317},{35,1,89},{33,33,683},{5,1,321},{21,1,193},{13,1,1},{33,33,683},{13,1,1},{7,1,2880},{7,1,2880},{7,1,2880}, +{23,1,1929},{39,1,2411},{25,1,1078},{25,1,1078},{27,1,20},{29,1,1451},{47,1,89},{19,1,317},{19,1,317},{19,1,317},{35,1,89},{3,3,512},{21,1,193},{21,1,193},{13,1,1},{3,3,512},{13,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{39,0,1570},{39,0,1570},{39,0,1570},{39,0,1570},{41,1,505}, +{41,1,505},{41,1,505},{27,17,5},{47,1,89},{47,1,89},{21,1,3210},{21,1,2729},{37,1,2571},{7,1,1825},{21,1,3015},{39,1,1388},{9,1,1027},{11,1,5},{11,1,2032},{15,1,185},{3,1,264},{3,1,189},{3,1,164},{19,1,45},{17,3,384},{35,1,164},{35,1,100},{25,1,1},{35,1,384},{25,1,1},{37,1,2571},{37,1,2571},{37,1,2571},{7,1,1825},{7,1,2112},{9,1,1027},{9,1,1027}, +{11,1,5},{13,1,1235},{15,1,185},{3,1,164},{3,1,164},{3,1,164},{19,1,45},{33,3,288},{35,1,100},{35,1,100},{25,1,1},{21,1,288},{25,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{23,0,1576},{23,0,1576},{23,0,1576},{23,0,1576},{9,1,586},{9,1,586},{9,1,586},{11,1,5},{15,1,185}, +{15,1,185},{0,37,2665},{0,45,274},{0,44,8},{0,26,1025},{0,15,5885},{0,12,3666},{0,10,1742},{0,38,4406},{0,8,6359},{0,22,4730},{0,37,2665},{0,45,274},{0,44,8},{0,26,1025},{22,4,5885},{0,12,3666},{0,10,1742},{0,38,4406},{15,0,5885},{0,38,4406},{0,28,0},{0,28,0},{0,28,0},{0,6,1},{0,22,545},{0,20,208},{0,20,208},{0,18,340},{0,18,593},{0,18,376},{0,28,0}, +{0,28,0},{0,28,0},{0,6,1},{2,2,545},{0,20,208},{0,20,208},{0,18,340},{22,0,545},{0,18,340},{28,0,2665},{0,45,274},{0,44,8},{0,26,1025},{28,0,2665},{37,0,2665},{0,26,1025},{0,24,2665},{37,0,2665},{0,24,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,3,2665},{0,43,169},{0,14,17}, +{0,12,865},{0,13,6669},{0,28,3898},{0,42,1825},{0,8,4826},{0,24,7263},{0,38,5231},{0,3,2665},{0,43,169},{0,14,17},{0,12,865},{24,2,6669},{0,28,3898},{0,42,1825},{0,8,4826},{13,0,6669},{0,8,4826},{0,46,1},{0,46,1},{0,46,1},{0,8,4},{0,8,841},{0,6,306},{0,6,306},{0,34,520},{0,34,917},{0,34,584},{0,46,1},{0,46,1},{0,46,1},{0,8,4},{4,0,841}, +{0,6,306},{0,6,306},{0,34,520},{8,0,841},{0,34,520},{44,2,2665},{0,43,169},{16,14,2},{0,12,865},{44,2,2665},{3,0,2665},{0,12,865},{0,40,2669},{3,0,2665},{0,40,2669},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,1,2669},{0,41,85},{16,46,79},{0,44,725},{0,11,7538},{0,14,4214},{0,12,1842}, +{0,8,5354},{0,10,8241},{0,8,5795},{0,1,2669},{0,41,85},{16,46,54},{0,44,725},{24,4,7538},{0,14,4214},{0,12,1842},{0,8,5354},{11,0,7538},{0,8,5354},{0,29,1},{0,29,1},{0,29,1},{0,24,4},{0,40,1201},{0,22,458},{0,22,458},{0,4,730},{0,4,1325},{0,4,830},{0,29,1},{0,29,1},{0,29,1},{0,24,4},{20,0,1201},{0,22,458},{0,22,458},{0,4,730},{40,0,1201}, +{0,4,730},{30,2,2665},{0,41,85},{32,46,5},{0,44,725},{30,2,2665},{35,2,2665},{0,44,725},{0,26,2665},{35,2,2665},{0,26,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{16,1,2799},{0,9,29},{16,31,167},{0,14,650},{0,9,8493},{0,46,4485},{0,44,1934},{0,40,5878},{0,26,9333},{0,40,6503},{16,1,2774}, +{0,9,29},{16,31,142},{0,14,650},{42,0,8493},{0,46,4485},{0,44,1934},{0,40,5878},{9,0,8493},{0,40,5878},{0,11,0},{0,11,0},{0,11,0},{0,26,1},{0,26,1625},{0,24,629},{0,24,629},{0,20,986},{0,20,1793},{0,20,1130},{0,11,0},{0,11,0},{0,11,0},{0,26,1},{36,0,1625},{0,24,629},{0,24,629},{0,20,986},{26,0,1625},{0,20,986},{2,1,2665},{0,9,29},{18,47,1}, +{0,14,650},{2,1,2665},{1,2,2665},{0,14,650},{0,42,2669},{1,2,2665},{0,42,2669},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{32,1,3171},{0,7,4},{16,15,315},{0,46,514},{0,7,9669},{0,31,4865},{0,46,2114},{0,10,6505},{0,12,10663},{0,10,7181},{32,1,3050},{0,7,4},{32,15,274},{0,46,514},{26,4,9669}, +{0,31,4865},{0,46,2114},{0,10,6505},{7,0,9669},{0,10,6505},{0,23,0},{0,23,0},{0,23,0},{0,12,1},{0,28,2178},{0,10,820},{0,10,820},{0,6,1348},{0,6,2405},{0,20,1553},{0,23,0},{0,23,0},{0,23,0},{0,12,1},{2,24,2178},{0,10,820},{0,10,820},{0,6,1348},{28,0,2178},{0,6,1348},{29,0,2665},{0,7,4},{4,31,9},{0,46,514},{29,0,2665},{17,4,2665},{0,46,514}, +{0,28,2665},{17,4,2665},{0,28,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,1,3529},{16,21,35},{32,29,444},{0,31,474},{0,19,9670},{0,45,4529},{0,46,1634},{0,42,6265},{0,28,10919},{0,26,7149},{18,1,3146},{16,21,10},{2,29,285},{0,31,474},{14,0,9669},{0,45,4529},{0,46,1634},{0,42,6265},{8,10,9669}, +{0,42,6265},{16,21,34},{16,21,34},{16,21,34},{16,44,34},{0,46,2180},{0,12,610},{0,12,610},{0,22,1184},{0,22,2517},{0,22,1473},{16,21,9},{16,21,9},{16,21,9},{16,44,9},{22,2,2178},{0,12,610},{0,12,610},{0,22,1184},{42,2,2178},{0,22,1184},{13,2,2665},{16,21,1},{20,45,0},{0,31,410},{13,2,2665},{3,6,2665},{0,31,410},{0,14,2677},{3,6,2665},{0,14,2677},{16,0,34}, +{16,0,34},{16,0,34},{16,0,34},{0,34,0},{0,34,0},{0,34,0},{0,32,1},{0,32,10},{0,32,10},{18,1,3971},{32,35,150},{2,43,644},{16,45,534},{0,1,9669},{0,43,4214},{0,31,1226},{0,28,5954},{0,14,11246},{0,12,6951},{4,1,3285},{2,5,4},{34,13,274},{32,15,483},{0,1,9669},{0,43,4214},{0,31,1226},{0,28,5954},{1,0,9669},{0,28,5954},{16,3,146},{16,3,146},{16,3,146}, +{16,30,147},{0,29,2180},{0,28,458},{0,28,458},{0,8,1018},{0,8,2691},{0,38,1419},{2,21,0},{2,21,0},{2,21,0},{2,14,1},{8,2,2178},{0,28,458},{0,28,458},{0,8,1018},{30,2,2178},{0,8,1018},{27,2,2665},{2,5,4},{6,29,9},{0,15,338},{27,2,2665},{35,8,2665},{0,15,338},{0,30,2665},{35,8,2665},{0,30,2665},{16,0,146},{16,0,146},{16,0,146},{16,0,146},{0,6,1}, +{0,6,1},{0,6,1},{0,18,4},{0,18,40},{0,18,40},{34,1,4603},{32,3,307},{2,11,925},{32,29,667},{16,1,9779},{0,41,3905},{0,45,913},{0,44,5653},{0,46,11530},{0,44,6878},{36,1,3390},{18,19,11},{4,27,269},{2,29,474},{18,3,9669},{0,41,3905},{0,45,913},{0,44,5653},{45,8,9669},{0,44,5653},{32,1,291},{32,1,291},{32,1,291},{32,47,291},{0,11,2178},{0,46,305},{0,46,305}, +{0,40,925},{0,10,2872},{0,8,1427},{34,5,10},{34,5,10},{34,5,10},{18,46,9},{24,4,2178},{0,46,305},{0,46,305},{0,40,925},{11,0,2178},{0,40,925},{8,1,2665},{18,19,2},{22,43,0},{0,29,265},{8,1,2665},{1,8,2665},{0,29,265},{0,46,2677},{1,8,2665},{0,46,2677},{32,0,290},{32,0,290},{32,0,290},{32,0,290},{0,24,1},{0,24,1},{0,24,1},{0,20,1},{0,34,100}, +{0,34,100},{20,1,5538},{2,17,582},{34,41,1298},{2,43,882},{2,1,10086},{0,9,3618},{0,43,581},{0,30,5418},{0,15,11905},{0,14,6895},{22,1,3586},{4,3,3},{36,11,273},{34,43,478},{15,2,9669},{0,9,3618},{0,43,581},{0,30,5418},{33,4,9669},{0,30,5418},{2,1,570},{2,1,570},{2,1,570},{2,15,549},{0,23,2178},{0,15,185},{0,15,185},{0,10,765},{0,26,3090},{0,10,1441},{4,3,2}, +{4,3,2},{4,3,2},{4,47,2},{38,10,2178},{0,15,185},{0,15,185},{0,10,765},{23,0,2178},{0,10,765},{23,0,2665},{4,3,2},{8,11,8},{0,43,181},{23,0,2665},{18,9,2665},{0,43,181},{0,31,2665},{18,9,2665},{0,31,2665},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,28,0},{0,28,0},{0,28,0},{0,6,1},{0,20,208},{0,20,208},{36,1,6378},{18,1,926},{4,9,1734}, +{18,27,1131},{18,1,10495},{0,7,3434},{0,27,353},{0,47,5186},{0,45,12293},{0,46,6789},{8,1,3785},{20,17,10},{6,25,270},{4,27,491},{43,0,9669},{0,7,3434},{0,27,353},{0,47,5186},{19,6,9669},{0,47,5186},{18,1,922},{18,1,922},{18,1,922},{18,45,842},{0,5,2180},{0,29,106},{0,29,106},{0,42,666},{0,12,3301},{0,26,1514},{36,3,4},{36,3,4},{36,3,4},{36,15,8},{28,2,2178}, +{0,29,106},{0,29,106},{0,42,666},{42,8,2178},{0,42,666},{7,2,2665},{20,17,1},{24,41,2},{0,11,136},{7,2,2665},{2,7,2665},{0,11,136},{0,15,2669},{2,7,2665},{0,15,2669},{18,0,841},{18,0,841},{18,0,841},{18,0,841},{0,46,1},{0,46,1},{0,46,1},{0,8,4},{0,6,306},{0,6,306},{6,1,7490},{34,1,1446},{4,39,2218},{18,41,1450},{34,1,11103},{0,21,3209},{0,41,187}, +{0,31,4909},{0,43,12686},{0,31,6845},{40,1,3938},{6,1,3},{38,9,273},{36,41,478},{11,0,9669},{0,21,3209},{0,41,187},{0,31,4909},{5,8,9669},{0,31,4909},{34,1,1382},{34,1,1382},{34,1,1382},{34,13,1213},{0,17,2178},{0,27,40},{0,27,40},{0,28,544},{0,44,3603},{0,12,1541},{6,1,2},{6,1,2},{6,1,2},{6,45,2},{16,3,2178},{0,27,40},{0,27,40},{0,28,544},{17,0,2178}, +{0,28,544},{21,2,2665},{6,1,2},{10,9,8},{0,25,90},{21,2,2665},{16,5,2665},{0,25,90},{0,29,2665},{16,5,2665},{0,29,2665},{34,0,1213},{34,0,1213},{34,0,1213},{34,0,1213},{0,29,1},{0,29,1},{0,29,1},{0,24,4},{0,22,458},{0,22,458},{22,1,8710},{20,1,2145},{20,7,2826},{34,25,1850},{20,1,11913},{0,35,3073},{0,9,86},{0,15,4721},{0,41,13118},{0,15,6837},{26,1,4118}, +{38,1,29},{8,23,258},{6,25,491},{24,3,9669},{0,35,3073},{0,9,86},{0,15,4721},{3,24,9669},{0,15,4721},{4,1,1973},{4,1,1973},{4,1,1973},{34,27,1630},{16,1,2221},{0,25,10},{0,25,10},{0,44,450},{0,46,3876},{0,28,1633},{38,1,4},{38,1,4},{38,1,4},{38,29,8},{30,4,2178},{0,25,10},{0,25,10},{0,44,450},{15,8,2178},{0,44,450},{14,1,2665},{8,1,25},{26,39,1}, +{0,9,61},{14,1,2665},{4,5,2665},{0,9,61},{0,13,2669},{4,5,2665},{0,13,2669},{34,0,1629},{34,0,1629},{34,0,1629},{34,0,1629},{0,11,0},{0,11,0},{0,11,0},{0,26,1},{0,24,629},{0,24,629},{8,1,10335},{36,1,3100},{36,21,3546},{4,39,2361},{36,1,12883},{0,33,2901},{0,23,25},{0,13,4485},{0,25,13589},{0,45,6982},{42,1,4353},{24,1,117},{40,37,270},{38,39,491},{29,12,9669}, +{0,33,2901},{0,23,25},{0,13,4485},{26,13,9669},{0,13,4485},{36,1,2739},{36,1,2739},{36,1,2739},{4,41,2181},{32,1,2427},{0,39,4},{0,39,4},{0,46,353},{0,31,4242},{0,14,1830},{24,1,17},{24,1,17},{24,1,17},{8,43,2},{45,0,2178},{16,39,2},{16,39,2},{0,46,353},{27,8,2178},{0,46,353},{17,0,2665},{40,1,73},{12,7,5},{0,23,25},{17,0,2665},{18,3,2665},{0,23,25}, +{0,27,2665},{18,3,2665},{0,27,2665},{4,0,2180},{4,0,2180},{4,0,2180},{4,0,2180},{0,23,0},{0,23,0},{0,23,0},{0,12,1},{0,10,820},{0,10,820},{24,1,11582},{6,1,4137},{6,35,4199},{20,7,2845},{6,1,13958},{0,1,2826},{0,37,31},{0,43,4255},{0,39,13958},{0,43,6958},{28,1,4610},{10,1,278},{10,21,261},{8,23,481},{37,0,9669},{0,1,2825},{16,37,18},{0,43,4254},{36,9,9669}, +{0,43,4254},{36,1,3454},{36,1,3454},{36,1,3454},{20,9,2665},{18,1,2740},{16,7,26},{16,7,26},{0,47,278},{0,15,4491},{0,46,1858},{40,1,29},{40,1,29},{40,1,29},{40,27,5},{29,2,2178},{32,23,2},{32,23,2},{0,47,277},{35,6,2178},{0,47,277},{1,2,2665},{42,1,157},{28,37,2},{0,37,5},{1,2,2665},{2,1,2665},{0,37,5},{0,11,2677},{2,1,2665},{0,11,2677},{20,0,2665}, +{20,0,2665},{20,0,2665},{20,0,2665},{0,5,2},{0,5,2},{0,5,2},{0,14,5},{0,12,981},{0,12,981},{40,1,12090},{38,1,4554},{22,19,4203},{36,21,2837},{38,1,14410},{32,1,2930},{32,21,37},{0,27,4187},{0,37,13477},{0,27,6222},{14,1,4826},{42,1,465},{42,35,270},{40,7,488},{5,0,9669},{2,1,2921},{2,21,25},{0,27,4106},{0,5,9669},{0,27,4106},{22,1,3593},{22,1,3593},{22,1,3593}, +{6,39,2677},{34,1,2840},{32,21,21},{32,21,21},{16,15,277},{0,43,4186},{0,31,1450},{26,1,52},{26,1,52},{26,1,52},{10,41,2},{43,2,2178},{18,7,4},{18,7,4},{0,15,205},{21,8,2178},{0,15,205},{13,3,2665},{44,1,260},{14,5,5},{0,5,8},{13,3,2665},{20,1,2665},{0,5,8},{0,25,2665},{20,1,2665},{0,25,2665},{6,0,2677},{6,0,2677},{6,0,2677},{6,0,2677},{32,35,4}, +{32,35,4},{32,35,4},{32,30,5},{0,28,745},{0,28,745},{26,1,12542},{24,1,4990},{8,33,4178},{22,5,2845},{24,1,14719},{2,1,3162},{18,35,34},{16,41,4197},{0,5,13013},{0,41,5610},{46,1,5121},{28,1,754},{12,19,270},{26,21,484},{30,3,9669},{4,1,3110},{18,35,18},{0,41,3929},{42,9,9669},{0,41,3929},{8,1,3770},{8,1,3770},{8,1,3770},{22,7,2666},{20,1,3011},{18,5,26},{18,5,26}, +{32,45,261},{0,27,3822},{0,15,1062},{12,1,98},{12,1,98},{12,1,98},{42,25,5},{38,1,2178},{34,21,2},{34,21,2},{0,29,160},{43,28,2178},{0,29,160},{43,1,2665},{30,1,388},{30,35,2},{16,35,2},{43,1,2665},{8,1,2665},{16,35,2},{0,9,2677},{8,1,2665},{0,9,2677},{22,0,2665},{22,0,2665},{22,0,2665},{22,0,2665},{2,3,2},{2,3,2},{2,3,2},{2,46,5},{0,46,578}, +{0,46,578},{12,1,13222},{40,1,5610},{40,17,4197},{38,19,2849},{26,1,15194},{4,1,3497},{34,19,34},{32,9,4178},{0,3,12493},{0,25,4990},{47,1,5429},{14,1,1062},{44,33,261},{42,5,499},{46,1,9669},{36,1,3341},{4,19,26},{0,9,3770},{26,7,9669},{0,9,3770},{40,1,3929},{40,1,3929},{40,1,3929},{8,37,2678},{6,1,3174},{34,19,18},{34,19,18},{18,13,270},{0,25,3462},{0,29,754},{28,1,160}, +{28,1,160},{28,1,160},{12,39,5},{39,0,2178},{20,35,2},{20,35,2},{0,13,98},{9,28,2178},{0,13,98},{11,1,2665},{47,1,578},{47,3,5},{2,3,2},{11,1,2665},{42,1,2665},{2,3,2},{0,23,2665},{42,1,2665},{0,23,2665},{8,0,2677},{8,0,2677},{8,0,2677},{8,0,2677},{34,17,2},{34,17,2},{34,17,2},{34,31,2},{0,31,388},{0,31,388},{28,1,13826},{26,1,6222},{26,1,4187}, +{24,3,2835},{42,1,15614},{36,1,3886},{20,33,37},{18,23,4203},{0,17,12134},{0,39,4554},{45,1,5669},{30,1,1450},{14,17,277},{28,19,484},{31,1,9669},{38,1,3605},{20,33,21},{0,23,3593},{32,1,9669},{0,23,3593},{26,1,4106},{26,1,4106},{26,1,4106},{24,5,2665},{22,1,3378},{20,3,25},{20,3,25},{34,43,270},{0,39,3206},{0,43,465},{14,1,205},{14,1,205},{14,1,205},{44,7,5},{23,2,2178}, +{36,3,4},{36,3,4},{0,27,52},{20,9,2178},{0,27,52},{39,3,2665},{29,1,745},{31,33,5},{34,33,4},{39,3,2665},{14,1,2665},{34,33,4},{0,7,2677},{14,1,2665},{0,7,2677},{24,0,2665},{24,0,2665},{24,0,2665},{24,0,2665},{4,1,8},{4,1,8},{4,1,8},{4,15,5},{0,45,260},{0,45,260},{14,1,14322},{42,1,6958},{42,1,4255},{40,17,2837},{28,1,16150},{38,1,4422},{36,1,31}, +{34,7,4199},{0,1,11889},{0,7,4137},{29,1,6018},{47,1,1858},{46,1,278},{44,3,499},{45,1,9669},{40,1,3905},{6,17,26},{0,37,3454},{27,9,9669},{0,37,3454},{42,1,4254},{42,1,4254},{42,1,4254},{40,19,2678},{24,1,3540},{36,17,18},{36,17,18},{20,11,261},{0,37,2979},{0,11,278},{46,1,277},{46,1,277},{46,1,277},{14,37,5},{37,2,2178},{22,33,2},{22,33,2},{0,41,29},{34,7,2178}, +{0,41,29},{7,3,2665},{13,1,981},{15,1,5},{4,1,2},{7,3,2665},{15,1,2665},{4,1,2},{0,21,2665},{15,1,2665},{0,21,2665},{10,0,2677},{10,0,2677},{10,0,2677},{10,0,2677},{36,1,5},{36,1,5},{36,1,5},{36,29,2},{0,43,157},{0,43,157},{30,1,13683},{44,1,6982},{12,1,4485},{26,17,2739},{14,1,15204},{24,1,4100},{22,1,25},{20,37,3546},{0,1,10840},{0,37,3100},{13,1,5451}, +{15,1,1830},{47,1,353},{30,33,333},{39,11,8712},{26,1,3507},{38,1,4},{0,37,2739},{22,1,8712},{0,37,2739},{12,1,4485},{12,1,4485},{12,1,4485},{26,3,2665},{40,1,3736},{22,1,25},{22,1,25},{36,41,270},{0,5,2779},{0,25,117},{47,1,353},{47,1,353},{47,1,353},{46,5,5},{44,1,2178},{38,17,2},{38,17,2},{0,25,17},{26,9,2178},{0,25,17},{3,25,2178},{11,1,820},{13,1,1}, +{22,1,0},{3,25,2178},{29,1,2178},{22,1,0},{0,5,2180},{29,1,2178},{0,5,2180},{26,0,2665},{26,0,2665},{26,0,2665},{26,0,2665},{22,1,25},{22,1,25},{22,1,25},{6,13,5},{0,41,73},{0,41,73},{47,1,12750},{14,1,6837},{14,1,4721},{12,1,2694},{30,1,14061},{40,1,3663},{8,1,86},{6,21,2826},{2,1,9775},{0,21,2145},{11,1,4689},{29,1,1633},{45,1,450},{47,17,195},{17,10,7578}, +{44,1,2961},{24,1,10},{0,5,1973},{24,1,7578},{0,5,1973},{14,1,4721},{14,1,4721},{14,1,4721},{12,17,2673},{26,1,3965},{8,1,86},{8,1,86},{22,9,258},{0,3,2571},{0,39,29},{45,1,450},{45,1,450},{45,1,450},{47,19,5},{31,5,2178},{24,1,10},{24,1,10},{0,39,4},{14,9,2178},{0,39,4},{37,1,1625},{25,1,629},{27,1,1},{10,1,0},{37,1,1625},{27,1,1625},{10,1,0}, +{0,35,1629},{27,1,1625},{0,35,1629},{12,0,2669},{12,0,2669},{12,0,2669},{12,0,2669},{8,1,61},{8,1,61},{8,1,61},{38,27,1},{0,9,25},{0,9,25},{15,1,12134},{30,1,6845},{30,1,4909},{28,1,2666},{47,1,13165},{26,1,3426},{40,1,187},{38,5,2218},{2,1,9023},{0,35,1446},{11,1,4097},{13,1,1541},{29,1,544},{31,17,90},{39,7,6661},{14,1,2525},{26,1,40},{0,35,1382},{26,1,6661}, +{0,35,1382},{30,1,4909},{30,1,4909},{30,1,4909},{28,1,2666},{12,1,4230},{40,1,187},{40,1,187},{8,39,273},{0,17,2453},{0,7,3},{29,1,544},{29,1,544},{29,1,544},{15,3,5},{17,2,2178},{26,1,40},{26,1,40},{0,7,2},{16,1,2178},{0,7,2},{21,1,1201},{23,1,458},{25,1,4},{28,1,1},{21,1,1201},{41,1,1201},{28,1,1},{0,35,1213},{41,1,1201},{0,35,1213},{28,0,2665}, +{28,0,2665},{28,0,2665},{28,0,2665},{24,1,90},{24,1,90},{24,1,90},{8,11,8},{0,7,2},{0,7,2},{45,1,11330},{47,1,6789},{46,1,5186},{14,1,2694},{47,1,12365},{42,1,3246},{26,1,353},{8,5,1734},{20,1,8393},{0,19,926},{25,1,3614},{27,1,1514},{43,1,666},{45,17,35},{9,3,5829},{47,1,2177},{28,1,106},{0,19,922},{31,3,5829},{0,19,922},{46,1,5186},{46,1,5186},{46,1,5186}, +{14,1,2694},{14,1,4504},{26,1,353},{26,1,353},{24,7,270},{16,1,2450},{16,21,10},{43,1,666},{43,1,666},{43,1,666},{45,33,2},{29,3,2178},{28,1,106},{28,1,106},{2,37,4},{43,9,2178},{2,37,4},{5,1,841},{7,1,306},{9,1,4},{47,1,1},{5,1,841},{9,1,841},{47,1,1},{0,19,841},{9,1,841},{0,19,841},{14,0,2669},{14,0,2669},{14,0,2669},{14,0,2669},{10,1,136}, +{10,1,136},{10,1,136},{40,25,2},{16,21,1},{16,21,1},{29,1,10834},{15,1,6895},{31,1,5418},{30,1,2786},{45,1,11530},{44,1,3154},{42,1,581},{40,35,1298},{36,1,7857},{16,3,582},{9,1,3105},{11,1,1441},{11,1,765},{13,1,8},{37,7,5082},{47,1,1905},{14,1,185},{0,3,570},{30,1,5082},{0,3,570},{31,1,5418},{31,1,5418},{31,1,5418},{30,1,2786},{30,1,4724},{42,1,581},{42,1,581}, +{10,37,273},{2,1,2587},{2,5,3},{11,1,765},{11,1,765},{11,1,765},{13,1,8},{39,11,2178},{14,1,185},{14,1,185},{2,5,2},{22,1,2178},{2,5,2},{3,3,545},{21,1,208},{7,1,1},{29,1,0},{3,3,545},{23,1,545},{29,1,0},{0,3,545},{23,1,545},{0,3,545},{30,0,2665},{30,0,2665},{30,0,2665},{30,0,2665},{42,1,181},{42,1,181},{42,1,181},{10,9,8},{2,5,2}, +{2,5,2},{13,1,10311},{45,1,6878},{45,1,5653},{47,1,2933},{29,1,10827},{14,1,3066},{44,1,913},{10,3,925},{8,1,7297},{2,33,307},{39,1,2707},{9,1,1427},{41,1,925},{27,1,32},{23,17,4344},{29,1,1611},{47,1,305},{0,33,291},{45,17,4344},{0,33,291},{45,1,5653},{45,1,5653},{45,1,5653},{47,1,2933},{47,1,5051},{44,1,913},{44,1,913},{26,5,269},{4,1,2859},{18,19,11},{41,1,925}, +{41,1,925},{41,1,925},{27,1,32},{25,5,2178},{47,1,305},{47,1,305},{18,19,10},{10,1,2178},{18,19,10},{33,3,288},{35,1,100},{21,1,1},{25,1,1},{33,3,288},{21,1,288},{25,1,1},{0,33,290},{21,1,288},{0,33,290},{47,0,2677},{47,0,2677},{47,0,2677},{47,0,2677},{28,1,265},{28,1,265},{28,1,265},{42,23,0},{18,19,2},{18,19,2},{11,1,9837},{13,1,6951},{29,1,5954}, +{15,1,3166},{13,1,10279},{47,1,3138},{30,1,1226},{42,3,644},{40,1,6929},{34,33,150},{7,1,2436},{39,1,1419},{9,1,1018},{11,1,101},{3,25,3779},{13,1,1475},{29,1,458},{2,17,146},{29,1,3779},{2,17,146},{29,1,5954},{29,1,5954},{29,1,5954},{15,1,3166},{31,1,5396},{30,1,1226},{30,1,1226},{12,35,274},{36,1,3147},{4,3,4},{9,1,1018},{9,1,1018},{9,1,1018},{11,1,101},{9,3,2178}, +{29,1,458},{29,1,458},{20,3,0},{31,3,2178},{20,3,0},{17,3,128},{19,1,40},{19,1,4},{7,1,1},{17,3,128},{35,1,128},{7,1,1},{0,17,146},{35,1,128},{0,17,146},{31,0,2665},{31,0,2665},{31,0,2665},{31,0,2665},{14,1,338},{14,1,338},{14,1,338},{28,7,9},{4,3,4},{4,3,4},{11,1,9437},{27,1,7149},{43,1,6265},{29,1,3402},{11,1,9788},{47,1,3234},{47,1,1634}, +{28,33,444},{42,1,6719},{20,17,35},{21,1,2210},{23,1,1473},{23,1,1184},{25,1,241},{21,17,3299},{11,1,1400},{13,1,610},{20,17,34},{17,21,3299},{20,17,34},{43,1,6265},{43,1,6265},{43,1,6265},{29,1,3402},{45,1,5621},{47,1,1634},{47,1,1634},{28,3,285},{8,1,3421},{20,17,10},{23,1,1184},{23,1,1184},{23,1,1184},{25,1,241},{23,3,2178},{13,1,610},{13,1,610},{20,17,9},{43,3,2178}, +{20,17,9},{17,1,34},{33,1,10},{33,1,1},{35,1,0},{17,1,34},{3,1,34},{35,1,0},{0,17,34},{3,1,34},{0,17,34},{15,0,2677},{15,0,2677},{15,0,2677},{15,0,2677},{30,1,410},{30,1,410},{30,1,410},{44,21,0},{20,17,1},{20,17,1},{9,1,9175},{11,1,7181},{11,1,6505},{13,1,3686},{11,1,9340},{45,1,3447},{47,1,2114},{14,17,315},{44,1,6532},{6,1,4},{21,1,2034}, +{21,1,1553},{7,1,1348},{39,1,410},{17,39,2904},{9,1,1411},{11,1,820},{22,1,0},{39,17,2904},{22,1,0},{11,1,6505},{11,1,6505},{11,1,6505},{13,1,3686},{13,1,5990},{47,1,2114},{47,1,2114},{14,33,274},{40,1,3789},{6,1,4},{7,1,1348},{7,1,1348},{7,1,1348},{39,1,410},{3,25,2178},{11,1,820},{11,1,820},{22,1,0},{29,1,2178},{22,1,0},{1,1,0},{1,1,0},{1,1,0}, +{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{29,0,2665},{29,0,2665},{29,0,2665},{29,0,2665},{47,1,514},{47,1,514},{47,1,514},{30,5,9},{6,1,4},{6,1,4},{9,1,7987},{41,1,6503},{41,1,5878},{27,1,3561},{25,1,8118},{29,1,3051},{45,1,1934},{30,17,167},{30,1,5562},{8,1,29},{5,1,1507},{21,1,1130},{21,1,986},{23,1,298},{19,3,2166}, +{23,1,1019},{25,1,629},{10,1,0},{39,1,2166},{10,1,0},{41,1,5878},{41,1,5878},{41,1,5878},{27,1,3561},{27,1,5301},{45,1,1934},{45,1,1934},{30,17,142},{42,1,3266},{8,1,29},{21,1,986},{21,1,986},{21,1,986},{23,1,298},{37,1,1625},{25,1,629},{25,1,629},{10,1,0},{27,1,1625},{10,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0}, +{0,1,0},{1,1,0},{0,1,0},{43,0,2669},{43,0,2669},{43,0,2669},{43,0,2669},{15,1,650},{15,1,650},{15,1,650},{46,19,1},{8,1,29},{8,1,29},{39,1,7111},{9,1,5795},{9,1,5354},{11,1,3381},{9,1,6983},{13,1,2803},{13,1,1842},{47,17,79},{47,1,4802},{40,1,85},{35,1,1132},{5,1,830},{5,1,730},{7,1,226},{3,3,1601},{7,1,739},{23,1,458},{28,1,1},{3,3,1601}, +{28,1,1},{9,1,5354},{9,1,5354},{9,1,5354},{11,1,3381},{11,1,4622},{13,1,1842},{13,1,1842},{47,17,54},{44,1,2834},{40,1,85},{5,1,730},{5,1,730},{5,1,730},{7,1,226},{21,1,1201},{23,1,458},{23,1,458},{28,1,1},{41,1,1201},{28,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{27,0,2665}, +{27,0,2665},{27,0,2665},{27,0,2665},{45,1,725},{45,1,725},{45,1,725},{47,33,5},{40,1,85},{40,1,85},{23,1,6361},{39,1,5231},{9,1,4826},{41,1,3294},{39,1,6071},{11,1,2610},{43,1,1825},{15,1,17},{47,1,4162},{42,1,169},{19,1,792},{35,1,584},{35,1,520},{21,1,153},{19,1,1121},{7,1,531},{7,1,306},{47,1,1},{37,1,1121},{47,1,1},{9,1,4826},{9,1,4826},{9,1,4826}, +{41,1,3294},{41,1,4145},{43,1,1825},{43,1,1825},{15,1,17},{30,1,2474},{42,1,169},{35,1,520},{35,1,520},{35,1,520},{21,1,153},{5,1,841},{7,1,306},{7,1,306},{47,1,1},{9,1,841},{47,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{41,0,2669},{41,0,2669},{41,0,2669},{41,0,2669},{13,1,865}, +{13,1,865},{13,1,865},{15,17,2},{42,1,169},{42,1,169},{7,1,5637},{23,1,4730},{39,1,4406},{9,1,3146},{39,1,5287},{11,1,2418},{11,1,1742},{45,1,8},{29,1,3547},{44,1,274},{3,1,489},{19,1,376},{19,1,340},{35,1,100},{33,33,726},{5,1,344},{21,1,208},{29,1,0},{33,33,726},{29,1,0},{39,1,4406},{39,1,4406},{39,1,4406},{9,1,3146},{9,1,3630},{11,1,1742},{11,1,1742}, +{45,1,8},{47,1,2178},{44,1,274},{19,1,340},{19,1,340},{19,1,340},{35,1,100},{3,3,545},{21,1,208},{21,1,208},{29,1,0},{23,1,545},{29,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{25,0,2665},{25,0,2665},{25,0,2665},{25,0,2665},{27,1,1025},{27,1,1025},{27,1,1025},{45,1,8},{44,1,274}, +{44,1,274},{36,1,50644},{0,1,2121},{0,25,169},{0,41,4591},{20,1,59804},{0,3,19310},{0,11,7401},{0,43,24008},{0,9,65535},{0,15,40741},{18,1,10267},{0,3,1445},{0,41,137},{0,15,3985},{42,6,18065},{0,45,12064},{0,31,6081},{0,12,14121},{19,0,18065},{0,12,14121},{0,15,1},{0,15,1},{0,15,1},{0,24,0},{0,24,1105},{0,22,410},{0,22,410},{0,4,666},{0,4,1217},{0,4,766},{0,15,1}, +{0,15,1},{0,15,1},{0,24,0},{34,2,1105},{0,22,410},{0,22,410},{0,4,666},{24,0,1105},{0,4,666},{43,2,9248},{0,3,1445},{0,41,137},{0,15,3985},{43,2,9248},{21,8,9248},{0,15,3985},{0,14,9256},{21,8,9248},{0,14,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{36,1,53600},{16,1,2998},{0,9,44}, +{0,25,3941},{36,1,62123},{0,1,18506},{0,25,6750},{0,27,23131},{0,39,65535},{0,29,40569},{34,1,10859},{0,1,1241},{0,9,50},{0,13,3690},{16,3,19334},{0,43,12449},{0,15,6117},{0,28,14809},{17,0,19334},{0,28,14809},{0,27,0},{0,27,0},{0,27,0},{0,10,1},{0,26,1513},{0,8,585},{0,8,585},{0,20,914},{0,20,1669},{0,20,1058},{0,27,0},{0,27,0},{0,27,0},{0,10,1},{34,4,1513}, +{0,8,585},{0,8,585},{0,20,914},{26,0,1513},{0,20,914},{38,1,9248},{0,1,1241},{0,9,50},{0,13,3690},{38,1,9248},{43,28,9248},{0,13,3690},{0,46,9250},{43,28,9248},{0,46,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{36,1,56716},{16,1,4497},{0,23,30},{0,39,3500},{36,1,64625},{0,1,18101},{0,9,6313}, +{0,11,22459},{0,37,65535},{0,43,39632},{4,1,11624},{0,1,1225},{0,39,10},{0,27,3400},{16,1,20689},{0,41,12854},{0,43,6221},{0,44,15490},{19,2,20689},{0,44,15490},{0,9,1},{0,9,1},{0,9,1},{0,42,1},{0,12,1985},{0,10,757},{0,10,757},{0,36,1241},{0,36,2193},{0,20,1394},{0,9,1},{0,9,1},{0,9,1},{0,42,1},{6,0,1985},{0,10,757},{0,10,757},{0,36,1241},{12,0,1985}, +{0,36,1241},{24,1,9248},{0,1,1225},{0,39,10},{0,27,3400},{24,1,9248},{32,9,9248},{0,27,3400},{0,47,9248},{32,9,9248},{0,47,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,1,58324},{32,1,6344},{0,7,6},{0,23,2873},{36,1,65535},{16,1,17968},{0,23,5727},{0,25,21128},{0,21,63585},{0,27,38087},{36,1,12449}, +{16,1,1437},{0,7,9},{0,41,3185},{47,2,22129},{0,25,13298},{0,43,6189},{0,44,16354},{17,2,22129},{0,44,16354},{0,21,0},{0,21,0},{0,21,0},{0,44,1},{0,44,2521},{0,26,953},{0,26,953},{0,6,1553},{0,6,2770},{0,6,1778},{0,21,0},{0,21,0},{0,21,0},{0,44,1},{22,0,2521},{0,26,953},{0,26,953},{0,6,1553},{44,0,2521},{0,6,1553},{7,0,9248},{16,1,1412},{16,7,0}, +{0,41,3185},{7,0,9248},{0,7,9248},{0,41,3185},{0,15,9266},{0,7,9248},{0,15,9266},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{22,1,58878},{32,1,8497},{0,21,52},{0,37,2302},{22,1,65535},{16,1,18091},{0,37,5062},{0,9,19646},{0,5,60796},{0,41,35977},{36,1,13547},{16,1,1923},{16,21,62},{0,25,2897},{45,0,23851}, +{0,39,13856},{0,27,6323},{0,46,17289},{27,8,23851},{0,46,17289},{0,33,0},{0,33,0},{0,33,0},{0,30,0},{0,46,3200},{0,12,1186},{0,12,1186},{0,38,1962},{0,22,3521},{0,22,2261},{0,33,0},{0,33,0},{0,33,0},{0,30,0},{18,10,3200},{0,12,1186},{0,12,1186},{0,38,1962},{46,0,3200},{0,38,1962},{37,2,9248},{2,1,1717},{2,21,5},{0,25,2897},{37,2,9248},{34,7,9248},{0,25,2897}, +{0,45,9250},{34,7,9248},{0,45,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{22,1,59528},{2,1,10468},{0,5,122},{0,21,1965},{22,1,65535},{16,1,18728},{0,21,4602},{0,23,18427},{0,3,58418},{0,25,34396},{6,1,14752},{2,1,2501},{16,35,141},{0,39,2720},{45,2,25472},{0,37,14401},{0,41,6413},{0,46,18185},{25,8,25472}, +{0,46,18185},{0,1,16},{0,1,16},{0,1,16},{0,47,0},{0,31,3872},{0,28,1450},{0,28,1450},{0,38,2362},{0,38,4283},{0,38,2723},{0,1,16},{0,1,16},{0,1,16},{0,47,0},{36,6,3872},{0,28,1450},{0,28,1450},{0,38,2362},{31,0,3872},{0,38,2362},{44,1,9248},{20,1,2041},{18,5,2},{0,39,2720},{44,1,9248},{26,9,9248},{0,39,2720},{0,13,9256},{26,9,9248},{0,13,9256},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{24,1,60070},{2,1,12544},{0,19,188},{0,35,1604},{22,1,65535},{32,1,19503},{0,5,4081},{0,7,17117},{0,3,56204},{0,25,32856},{22,1,15824},{2,1,3225},{32,19,229},{0,7,2478},{46,10,26744},{0,21,14657},{0,25,6357},{0,31,18737},{23,8,26744},{0,31,18737},{16,1,115},{16,1,115},{16,1,115}, +{0,15,5},{0,29,4420},{0,46,1613},{0,46,1613},{0,8,2642},{0,8,4931},{0,8,3083},{16,1,90},{16,1,90},{16,1,90},{0,15,5},{8,2,4418},{0,46,1613},{0,46,1613},{0,8,2642},{30,2,4418},{0,8,2642},{33,0,9248},{36,1,2405},{34,19,5},{0,7,2474},{33,0,9248},{32,3,9248},{0,7,2474},{0,43,9250},{32,3,9248},{0,43,9250},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,16,1}, +{0,16,1},{0,16,1},{0,16,1},{0,16,2},{0,16,2},{24,1,60699},{2,1,14864},{16,3,314},{0,19,1400},{24,1,65535},{2,1,20230},{0,19,3323},{0,37,15488},{0,17,54456},{0,39,31364},{24,1,16210},{4,1,3849},{2,33,221},{0,37,2328},{38,3,26744},{0,3,14114},{0,23,5618},{0,15,18273},{35,8,26744},{0,15,18273},{32,1,291},{32,1,291},{32,1,291},{16,29,50},{0,11,4418},{0,31,1325},{0,31,1325}, +{0,10,2465},{0,10,5112},{0,8,3051},{2,1,136},{2,1,136},{2,1,136},{32,29,5},{24,4,4418},{0,31,1325},{0,31,1325},{0,10,2465},{11,0,4418},{0,10,2465},{47,1,9248},{8,1,2738},{20,3,1},{0,37,2228},{47,1,9248},{31,9,9248},{0,37,2228},{0,11,9256},{31,9,9248},{0,11,9256},{16,0,50},{16,0,50},{16,0,50},{16,0,50},{0,4,0},{0,4,0},{0,4,0},{0,2,0},{0,32,18}, +{0,32,18},{24,1,61549},{2,1,17597},{16,17,476},{0,33,1268},{24,1,65535},{2,1,21346},{0,33,2615},{0,5,13900},{0,17,52724},{0,37,29656},{40,1,16729},{36,1,4545},{34,1,221},{32,21,2384},{8,1,26744},{0,3,13529},{0,37,4710},{0,29,17819},{1,8,26744},{0,29,17819},{2,1,626},{2,1,626},{2,1,626},{32,43,185},{0,23,4418},{0,45,1037},{0,45,1037},{0,10,2249},{0,26,5330},{0,10,2925},{34,1,185}, +{34,1,185},{34,1,185},{18,13,4},{38,10,4418},{0,45,1037},{0,45,1037},{0,10,2249},{23,0,4418},{0,10,2249},{29,3,9248},{40,1,3188},{6,17,2},{0,35,2041},{29,3,9248},{43,9,9248},{0,35,2041},{0,41,9256},{43,9,9248},{0,41,9256},{32,0,185},{32,0,185},{32,0,185},{32,0,185},{0,38,0},{0,38,0},{0,38,0},{0,34,1},{0,18,61},{0,18,61},{40,1,62083},{4,1,19345},{16,1,697}, +{0,17,1188},{24,1,65535},{2,1,22086},{0,17,2057},{0,35,12551},{0,1,51532},{0,37,28158},{26,1,16691},{36,1,5081},{20,1,265},{32,35,2281},{29,12,26259},{0,17,12803},{0,5,3981},{0,43,16952},{26,13,26259},{0,43,16952},{18,1,1006},{18,1,1006},{18,1,1006},{2,11,378},{0,5,4420},{0,43,820},{0,43,820},{0,12,2020},{0,12,5541},{0,42,2966},{20,1,265},{20,1,265},{20,1,265},{34,27,1},{28,2,4418}, +{0,43,820},{0,43,820},{0,12,2020},{42,8,4418},{0,12,2020},{43,3,8978},{42,1,3434},{22,1,1},{0,19,1737},{43,3,8978},{45,7,8978},{0,19,1737},{0,9,8986},{45,7,8978},{0,9,8986},{2,0,377},{2,0,377},{2,0,377},{2,0,377},{0,10,1},{0,10,1},{0,10,1},{0,20,4},{0,4,136},{0,4,136},{40,1,62361},{4,1,19653},{16,1,1095},{0,17,1126},{24,1,65535},{2,1,21601},{0,17,1502}, +{0,19,11253},{0,1,50904},{0,37,27226},{42,1,15419},{38,1,4708},{36,1,320},{18,19,1862},{23,2,24371},{0,1,11221},{0,35,2905},{0,27,15080},{20,9,24371},{0,27,15080},{34,1,1522},{34,1,1522},{34,1,1522},{2,25,618},{0,17,4418},{0,41,610},{0,41,610},{0,44,1810},{0,44,5843},{0,12,2885},{36,1,320},{36,1,320},{36,1,320},{20,11,9},{16,3,4418},{0,41,610},{0,41,610},{0,44,1810},{17,0,4418}, +{0,44,1810},{27,3,7938},{44,1,3033},{8,1,4},{0,19,1225},{27,3,7938},{39,9,7938},{0,19,1225},{0,9,7946},{39,9,7938},{0,9,7946},{2,0,617},{2,0,617},{2,0,617},{2,0,617},{0,44,0},{0,44,0},{0,44,0},{0,22,1},{0,36,232},{0,36,232},{40,1,62690},{4,1,20049},{32,1,1585},{16,17,1131},{40,1,65535},{2,1,21187},{0,17,1035},{0,19,10004},{0,1,50320},{0,37,26351},{28,1,14260}, +{24,1,4365},{22,1,410},{4,19,1523},{47,11,22568},{0,1,9893},{0,19,1997},{0,27,13320},{22,9,22568},{0,27,13320},{4,1,2169},{4,1,2169},{4,1,2169},{18,9,929},{16,1,4461},{0,9,442},{0,9,442},{0,14,1665},{0,46,6116},{0,44,2907},{22,1,410},{22,1,410},{22,1,410},{36,25,1},{30,4,4418},{0,9,442},{0,9,442},{0,14,1665},{15,8,4418},{0,14,1665},{11,3,6962},{14,1,2645},{10,1,1}, +{0,3,832},{11,3,6962},{44,3,6962},{0,3,832},{0,39,6962},{44,3,6962},{0,39,6962},{18,0,925},{18,0,925},{18,0,925},{18,0,925},{0,47,0},{0,47,0},{0,47,0},{0,8,0},{0,22,338},{0,22,338},{40,1,63078},{4,1,20586},{32,1,2208},{16,1,1221},{40,1,65535},{2,1,20797},{0,17,616},{0,19,8676},{0,1,49684},{0,37,25424},{14,1,12942},{40,1,4061},{8,1,530},{36,19,1147},{21,2,20642}, +{16,1,8678},{0,3,1157},{0,41,11489},{24,9,20642},{0,41,11489},{20,1,3009},{20,1,3009},{20,1,3009},{34,7,1358},{32,1,4667},{0,7,305},{0,7,305},{0,46,1445},{0,31,6482},{0,14,3034},{8,1,530},{8,1,530},{8,1,530},{22,9,5},{45,0,4418},{0,7,305},{0,7,305},{0,46,1445},{27,8,4418},{0,46,1445},{11,1,5941},{30,1,2260},{42,1,0},{0,33,445},{11,1,5941},{26,1,5941},{0,33,445}, +{0,23,5941},{26,1,5941},{0,23,5941},{34,0,1354},{34,0,1354},{34,0,1354},{34,0,1354},{0,13,0},{0,13,0},{0,13,0},{0,40,1},{0,8,522},{0,8,522},{40,1,63433},{4,1,21145},{32,1,2873},{16,1,1404},{40,1,65535},{2,1,20517},{0,1,339},{0,19,7570},{0,1,49136},{0,37,24652},{30,1,11862},{26,1,3845},{40,1,617},{22,3,868},{44,1,19021},{2,1,7769},{0,33,621},{0,25,9957},{26,9,19021}, +{0,25,9957},{36,1,3819},{36,1,3819},{36,1,3819},{4,37,1809},{2,1,5012},{0,5,185},{0,5,185},{0,31,1285},{0,15,6822},{0,46,3029},{40,1,617},{40,1,617},{40,1,617},{38,23,2},{29,2,4418},{0,5,185},{0,5,185},{0,31,1285},{35,6,4418},{0,31,1285},{41,1,5101},{47,1,1924},{28,1,1},{0,17,221},{41,1,5101},{28,1,5101},{0,17,221},{0,7,5113},{28,1,5101},{0,7,5113},{4,0,1808}, +{4,0,1808},{4,0,1808},{4,0,1808},{0,25,0},{0,25,0},{0,25,0},{0,26,4},{0,24,698},{0,24,698},{26,1,63733},{4,1,21777},{32,1,3641},{16,1,1687},{40,1,65535},{2,1,20303},{0,1,133},{0,3,6539},{0,1,48607},{0,37,23935},{30,1,10886},{42,1,3641},{26,1,724},{8,33,659},{46,3,17485},{2,1,6985},{0,17,257},{0,25,8565},{16,3,17485},{0,25,8565},{6,1,4820},{6,1,4820},{6,1,4820}, +{4,5,2324},{18,1,5437},{0,3,101},{0,3,101},{0,15,1129},{0,45,7234},{0,31,3141},{26,1,724},{26,1,724},{26,1,724},{24,7,4},{43,2,4418},{0,3,101},{0,3,101},{0,15,1129},{21,8,4418},{0,15,1129},{25,1,4325},{15,1,1658},{14,1,4},{0,17,61},{25,1,4325},{14,1,4325},{0,17,61},{0,7,4329},{14,1,4325},{0,7,4329},{4,0,2320},{4,0,2320},{4,0,2320},{4,0,2320},{0,7,0}, +{0,7,0},{0,7,0},{0,28,1},{0,10,872},{0,10,872},{26,1,63992},{4,1,22482},{2,1,4507},{32,1,2059},{40,1,65535},{2,1,20157},{0,1,26},{0,3,5537},{0,1,48100},{0,21,23272},{47,1,9918},{28,1,3518},{42,1,832},{24,33,446},{46,1,16034},{4,1,6314},{0,1,65},{0,39,7293},{26,7,16034},{0,39,7293},{22,1,5900},{22,1,5900},{22,1,5900},{20,19,2888},{34,1,6029},{0,17,40},{0,17,40}, +{0,29,1000},{0,43,7619},{0,15,3261},{42,1,832},{42,1,832},{42,1,832},{40,21,1},{38,1,4418},{0,17,40},{0,17,40},{0,29,1000},{43,28,4418},{0,29,1000},{9,1,3613},{29,1,1345},{47,1,4},{0,1,1},{9,1,3613},{46,1,3613},{0,1,1},{0,37,3613},{46,1,3613},{0,37,3613},{20,0,2888},{20,0,2888},{20,0,2888},{20,0,2888},{0,19,1},{0,19,1},{0,19,1},{0,14,0},{0,12,1082}, +{0,12,1082},{26,1,64289},{20,1,23310},{2,1,5546},{32,1,2553},{40,1,65535},{2,1,20076},{0,1,26},{0,3,4514},{0,1,47560},{0,5,22518},{31,1,9017},{14,1,3261},{28,1,1000},{10,33,281},{17,2,14504},{36,1,5594},{16,1,40},{0,23,5900},{16,1,14504},{0,23,5900},{38,1,7293},{38,1,7293},{38,1,7293},{36,33,3614},{4,1,6900},{0,1,65},{0,1,65},{0,43,832},{0,41,8070},{0,29,3518},{28,1,1000}, +{28,1,1000},{28,1,1000},{26,5,2},{39,0,4418},{16,1,40},{16,1,40},{0,43,832},{9,28,4418},{0,43,832},{23,17,2888},{13,1,1082},{15,1,0},{18,1,1},{23,17,2888},{45,17,2888},{18,1,1},{0,21,2888},{45,17,2888},{0,21,2888},{36,0,3613},{36,0,3613},{36,0,3613},{36,0,3613},{0,1,1},{0,1,1},{0,1,1},{0,46,4},{0,28,1345},{0,28,1345},{26,1,64605},{36,1,24062},{2,1,6574}, +{32,1,3098},{26,1,65535},{2,1,20094},{0,1,133},{0,33,3661},{0,1,47145},{0,5,21893},{45,1,8116},{30,1,3141},{14,1,1129},{42,17,147},{43,7,13235},{38,1,5012},{2,1,101},{0,7,4820},{18,1,13235},{0,7,4820},{24,1,8565},{24,1,8565},{24,1,8565},{6,1,4329},{36,1,7725},{16,1,257},{16,1,257},{0,27,724},{0,25,8530},{0,43,3641},{14,1,1129},{14,1,1129},{14,1,1129},{42,19,2},{23,2,4418}, +{2,1,101},{2,1,101},{0,27,724},{20,9,4418},{0,27,724},{37,3,2312},{11,1,872},{29,1,1},{6,1,0},{37,3,2312},{21,5,2312},{6,1,0},{0,5,2320},{21,5,2312},{0,5,2320},{6,0,4329},{6,0,4329},{6,0,4329},{6,0,4329},{16,1,61},{16,1,61},{16,1,61},{0,15,4},{0,14,1658},{0,14,1658},{26,1,64960},{36,1,24888},{18,1,7643},{32,1,3742},{26,1,65535},{4,1,20161},{0,1,342}, +{0,33,2900},{0,1,46786},{0,5,21347},{29,1,7443},{47,1,3029},{30,1,1285},{12,17,66},{17,6,12051},{24,1,4500},{4,1,185},{0,37,3819},{20,1,12051},{0,37,3819},{24,1,9957},{24,1,9957},{24,1,9957},{22,1,5161},{36,1,8717},{32,1,621},{32,1,621},{0,41,617},{0,39,9026},{0,27,3845},{30,1,1285},{30,1,1285},{30,1,1285},{28,3,4},{37,2,4418},{4,1,185},{4,1,185},{0,41,617},{34,7,4418}, +{0,41,617},{21,3,1800},{25,1,698},{27,1,4},{24,1,0},{21,3,1800},{43,1,1800},{24,1,0},{0,5,1808},{43,1,1800},{0,5,1808},{6,0,5113},{6,0,5113},{6,0,5113},{6,0,5113},{16,1,221},{16,1,221},{16,1,221},{0,29,1},{0,46,1924},{0,46,1924},{26,1,65314},{36,1,25774},{18,1,8796},{32,1,4480},{26,1,65535},{4,1,20229},{16,1,625},{0,33,2238},{0,1,46456},{0,5,20870},{13,1,6795}, +{15,1,3034},{47,1,1445},{44,1,17},{39,11,10952},{40,1,4076},{6,1,305},{0,21,3009},{22,1,10952},{0,21,3009},{40,1,11489},{40,1,11489},{40,1,11489},{38,1,6125},{6,1,9922},{2,1,1157},{2,1,1157},{0,9,530},{0,37,9571},{0,41,4061},{47,1,1445},{47,1,1445},{47,1,1445},{44,17,2},{44,1,4418},{6,1,305},{6,1,305},{0,9,530},{26,9,4418},{0,9,530},{5,3,1352},{9,1,522},{41,1,1}, +{12,1,0},{5,3,1352},{11,1,1352},{12,1,0},{0,35,1354},{11,1,1352},{0,35,1354},{22,0,5941},{22,0,5941},{22,0,5941},{22,0,5941},{32,1,445},{32,1,445},{32,1,445},{0,43,0},{0,31,2260},{0,31,2260},{26,1,65535},{36,1,26766},{18,1,10162},{2,1,5359},{26,1,65359},{4,1,20334},{16,1,1051},{0,33,1610},{0,1,45998},{0,5,20364},{11,1,6173},{45,1,2907},{15,1,1665},{30,1,2},{17,10,9818}, +{42,1,3693},{8,1,442},{0,5,2169},{24,1,9818},{0,5,2169},{26,1,13320},{26,1,13320},{26,1,13320},{8,1,7395},{22,1,11384},{18,1,1997},{18,1,1997},{0,23,410},{0,21,10181},{0,25,4365},{15,1,1665},{15,1,1665},{15,1,1665},{30,1,2},{31,5,4418},{8,1,442},{8,1,442},{0,23,410},{14,9,4418},{0,23,410},{5,1,925},{23,1,338},{9,1,0},{46,1,0},{5,1,925},{9,1,925},{46,1,0}, +{0,19,925},{9,1,925},{0,19,925},{38,0,6962},{38,0,6962},{38,0,6962},{38,0,6962},{2,1,832},{2,1,832},{2,1,832},{0,11,1},{0,15,2645},{0,15,2645},{26,1,65535},{36,1,27616},{18,1,11415},{2,1,6203},{26,1,65014},{4,1,20439},{16,1,1524},{0,17,1111},{0,1,45494},{0,5,19935},{11,1,5581},{13,1,2885},{45,1,1810},{47,1,50},{39,7,8901},{44,1,3373},{40,1,610},{0,35,1522},{26,1,8901}, +{0,35,1522},{26,1,15080},{26,1,15080},{26,1,15080},{24,1,8661},{24,1,12846},{34,1,2905},{34,1,2905},{0,37,320},{0,3,10790},{0,39,4708},{45,1,1810},{45,1,1810},{45,1,1810},{47,1,50},{17,2,4418},{40,1,610},{40,1,610},{0,37,320},{16,1,4418},{0,37,320},{35,1,613},{37,1,232},{23,1,1},{45,1,0},{35,1,613},{23,1,613},{45,1,0},{0,3,617},{23,1,613},{0,3,617},{8,0,7946}, +{8,0,7946},{8,0,7946},{8,0,7946},{18,1,1225},{18,1,1225},{18,1,1225},{0,9,4},{0,45,3033},{0,45,3033},{26,1,65535},{36,1,28505},{34,1,12706},{2,1,7117},{26,1,64677},{4,1,20609},{16,1,2082},{0,17,705},{0,1,45031},{0,5,19583},{41,1,5202},{43,1,2966},{13,1,2020},{31,1,148},{9,3,8069},{30,1,3125},{42,1,820},{0,19,1006},{31,3,8069},{0,19,1006},{42,1,16952},{42,1,16952},{42,1,16952}, +{24,1,10085},{24,1,14318},{4,1,3981},{4,1,3981},{0,21,265},{0,3,11302},{0,37,5081},{13,1,2020},{13,1,2020},{13,1,2020},{31,1,148},{29,3,4418},{42,1,820},{42,1,820},{0,21,265},{43,9,4418},{0,21,265},{19,1,365},{5,1,136},{21,1,4},{11,1,1},{19,1,365},{37,1,365},{11,1,1},{0,3,377},{37,1,365},{0,3,377},{8,0,8986},{8,0,8986},{8,0,8986},{8,0,8986},{18,1,1737}, +{18,1,1737},{18,1,1737},{0,23,1},{0,43,3434},{0,43,3434},{42,1,65535},{36,1,29412},{4,1,13785},{18,1,7875},{26,1,64490},{20,1,20801},{32,1,2593},{16,17,472},{0,1,43813},{0,3,17452},{9,1,4729},{11,1,2925},{11,1,2249},{45,1,281},{37,7,7322},{47,1,2941},{44,1,1037},{0,3,626},{30,1,7322},{0,3,626},{28,1,17819},{28,1,17819},{28,1,17819},{40,1,10777},{40,1,15150},{36,1,4710},{36,1,4710}, +{0,35,221},{0,17,11076},{0,37,4545},{11,1,2249},{11,1,2249},{11,1,2249},{45,1,281},{39,11,4418},{44,1,1037},{44,1,1037},{0,35,185},{22,1,4418},{0,35,185},{3,1,181},{19,1,61},{35,1,1},{39,1,0},{3,1,181},{5,1,181},{39,1,0},{0,33,185},{5,1,181},{0,33,185},{40,0,9256},{40,0,9256},{40,0,9256},{40,0,9256},{34,1,2041},{34,1,2041},{34,1,2041},{16,7,2},{0,41,3188}, +{0,41,3188},{42,1,65535},{38,1,30127},{36,1,14877},{4,1,8601},{42,1,64081},{36,1,20736},{18,1,3192},{2,17,302},{0,1,42247},{0,3,14278},{39,1,4387},{9,1,3051},{11,1,2465},{13,1,490},{23,17,6584},{29,1,2843},{30,1,1325},{0,33,291},{45,17,6584},{0,33,291},{14,1,18273},{14,1,18273},{14,1,18273},{42,1,11259},{26,1,15731},{22,1,5618},{22,1,5618},{32,3,221},{0,1,10637},{0,5,3849},{11,1,2465}, +{11,1,2465},{11,1,2465},{13,1,490},{25,5,4418},{30,1,1325},{30,1,1325},{0,3,136},{10,1,4418},{0,3,136},{1,3,50},{33,1,18},{3,1,0},{5,1,0},{1,3,50},{3,1,50},{5,1,0},{0,17,50},{3,1,50},{0,17,50},{10,0,9256},{10,0,9256},{10,0,9256},{10,0,9256},{36,1,2228},{36,1,2228},{36,1,2228},{2,21,1},{0,9,2738},{0,9,2738},{28,1,65535},{24,1,30766},{6,1,16028}, +{36,1,9391},{28,1,64158},{36,1,21269},{4,1,3821},{18,1,176},{0,1,41339},{0,3,11746},{23,1,4216},{9,1,3083},{9,1,2642},{27,1,776},{3,25,6019},{13,1,2763},{47,1,1613},{0,17,115},{29,1,6019},{0,17,115},{30,1,18737},{30,1,18737},{30,1,18737},{12,1,11820},{42,1,16379},{24,1,6357},{24,1,6357},{18,33,229},{0,1,10589},{0,3,3225},{9,1,2642},{9,1,2642},{9,1,2642},{27,1,776},{9,3,4418}, +{47,1,1613},{47,1,1613},{0,17,90},{31,3,4418},{0,17,90},{1,17,2},{17,1,2},{17,1,1},{17,1,1},{1,17,2},{17,1,2},{17,1,1},{0,1,4},{17,1,2},{0,1,4},{42,0,9250},{42,0,9250},{42,0,9250},{42,0,9250},{6,1,2474},{6,1,2474},{6,1,2474},{18,35,5},{0,37,2405},{0,37,2405},{14,1,65535},{24,1,31241},{22,1,16737},{6,1,10024},{14,1,64173},{38,1,21415},{20,1,4180}, +{4,1,111},{16,1,40689},{0,3,9508},{7,1,3648},{39,1,2723},{39,1,2362},{11,1,725},{37,1,5163},{13,1,2451},{29,1,1450},{0,1,16},{7,19,5163},{0,1,16},{47,1,18185},{47,1,18185},{47,1,18185},{44,1,11714},{28,1,15784},{40,1,6413},{40,1,6413},{34,17,141},{0,1,9881},{0,3,2501},{39,1,2362},{39,1,2362},{39,1,2362},{11,1,725},{37,7,3872},{29,1,1450},{29,1,1450},{0,1,16},{30,1,3872}, +{0,1,16},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{12,0,9256},{12,0,9256},{12,0,9256},{12,0,9256},{38,1,2720},{38,1,2720},{38,1,2720},{4,19,2},{0,21,2041},{0,21,2041},{30,1,65535},{40,1,31563},{8,1,17236},{38,1,10554},{14,1,63701},{24,1,21372},{36,1,4441},{20,1,45},{16,1,40151},{0,33,7454},{21,1,3014}, +{23,1,2261},{39,1,1962},{25,1,629},{21,17,4267},{11,1,2028},{13,1,1186},{32,1,0},{17,21,4267},{32,1,0},{47,1,17289},{47,1,17289},{47,1,17289},{14,1,11436},{14,1,14726},{26,1,6323},{26,1,6323},{20,17,62},{16,1,9032},{0,17,1923},{39,1,1962},{39,1,1962},{39,1,1962},{25,1,629},{19,11,3200},{13,1,1186},{13,1,1186},{32,1,0},{47,1,3200},{32,1,0},{1,1,0},{1,1,0},{1,1,0}, +{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{44,0,9250},{44,0,9250},{44,0,9250},{44,0,9250},{24,1,2897},{24,1,2897},{24,1,2897},{20,3,5},{0,3,1717},{0,3,1717},{30,1,65535},{26,1,31988},{24,1,17745},{8,1,11181},{30,1,63430},{40,1,21435},{22,1,4810},{6,1,5},{2,1,39477},{0,33,5328},{21,1,2339},{7,1,1778},{7,1,1553},{9,1,477},{19,5,3361}, +{25,1,1634},{27,1,953},{20,1,0},{37,3,3361},{20,1,0},{45,1,16354},{45,1,16354},{45,1,16354},{30,1,11202},{30,1,13722},{42,1,6189},{42,1,6189},{6,1,9},{2,1,8249},{0,17,1437},{7,1,1553},{7,1,1553},{7,1,1553},{9,1,477},{23,1,2521},{27,1,953},{27,1,953},{20,1,0},{45,1,2521},{20,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0}, +{0,1,0},{1,1,0},{0,1,0},{14,0,9266},{14,0,9266},{14,0,9266},{14,0,9266},{40,1,3185},{40,1,3185},{40,1,3185},{6,17,0},{0,17,1412},{0,17,1412},{47,1,65535},{42,1,32389},{10,1,18354},{40,1,11850},{30,1,63370},{40,1,21737},{8,1,5159},{22,1,24},{2,1,39380},{0,17,3675},{5,1,1843},{21,1,1394},{37,1,1241},{23,1,370},{5,1,2646},{9,1,1282},{11,1,757},{8,1,1},{9,1,2646}, +{8,1,1},{45,1,15490},{45,1,15490},{45,1,15490},{47,1,10946},{47,1,12914},{42,1,6221},{42,1,6221},{38,1,10},{2,1,7753},{0,1,1225},{37,1,1241},{37,1,1241},{37,1,1241},{23,1,370},{7,1,1985},{11,1,757},{11,1,757},{8,1,1},{13,1,1985},{8,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{46,0,9248}, +{46,0,9248},{46,0,9248},{46,0,9248},{26,1,3400},{26,1,3400},{26,1,3400},{38,1,10},{0,1,1225},{0,1,1225},{47,1,65535},{28,1,33179},{26,1,18917},{10,1,12588},{47,1,62997},{26,1,21996},{24,1,5521},{8,1,36},{4,1,39403},{0,17,2452},{5,1,1411},{21,1,1058},{21,1,914},{7,1,274},{35,1,2017},{23,1,939},{9,1,585},{26,1,0},{1,35,2017},{26,1,0},{29,1,14809},{29,1,14809},{29,1,14809}, +{31,1,10801},{47,1,12162},{14,1,6117},{14,1,6117},{8,1,50},{20,1,7322},{0,1,1241},{21,1,914},{21,1,914},{21,1,914},{7,1,274},{35,5,1513},{9,1,585},{9,1,585},{26,1,0},{27,1,1513},{26,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{47,0,9250},{47,0,9250},{47,0,9250},{47,0,9250},{12,1,3690}, +{12,1,3690},{12,1,3690},{8,1,50},{0,1,1241},{0,1,1241},{45,1,65535},{14,1,33274},{42,1,19608},{42,1,13375},{47,1,62627},{42,1,22211},{10,1,6045},{24,1,138},{36,1,39015},{0,1,1732},{35,1,1048},{5,1,766},{5,1,666},{37,1,212},{3,3,1473},{7,1,675},{23,1,410},{14,1,1},{3,3,1473},{14,1,1},{13,1,14121},{13,1,14121},{13,1,14121},{45,1,10571},{45,1,11434},{30,1,6081},{30,1,6081}, +{40,1,137},{36,1,6926},{2,1,1445},{5,1,666},{5,1,666},{5,1,666},{37,1,212},{35,3,1105},{23,1,410},{23,1,410},{14,1,1},{25,1,1105},{14,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{15,0,9256},{15,0,9256},{15,0,9256},{15,0,9256},{14,1,3985},{14,1,3985},{14,1,3985},{40,1,137},{2,1,1445}, +{2,1,1445}, +/**** ended inlining basisu_transcoder_tables_astc.inc ****/ + }; + + // The best selector mapping to use given a base base+inten table and used selector range for converting grayscale data. + static uint8_t g_etc1_to_astc_best_grayscale_mapping[32][8][NUM_ETC1_TO_ASTC_SELECTOR_RANGES]; + +#if BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + static const etc1_to_astc_solution g_etc1_to_astc_0_255[32 * 8 * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS * NUM_ETC1_TO_ASTC_SELECTOR_RANGES] = { +/**** start inlining basisu_transcoder_tables_astc_0_255.inc ****/ +{0,16,18},{0,12,1},{0,8,0},{0,7,5},{0,10,35},{0,6,21},{0,6,9},{0,4,24},{1,4,36},{0,4,25},{0,16,18},{0,12,1},{0,8,0},{0,7,5},{5,0,35},{0,6,21},{0,6,9},{0,4,24},{10,0,35},{0,4,24},{0,7,0},{0,7,0},{0,7,0},{0,3,0},{0,4,2},{0,3,0},{0,3,0},{0,1,1},{0,2,2},{0,1,1},{0,7,0}, +{0,7,0},{0,7,0},{0,3,0},{2,0,2},{0,3,0},{0,3,0},{0,1,1},{4,0,2},{0,1,1},{8,0,18},{0,12,1},{0,8,0},{0,7,5},{8,0,18},{16,0,18},{0,7,5},{0,5,18},{16,0,18},{0,5,18},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,34,36},{3,23,19},{4,17,25}, +{3,16,19},{0,34,51},{0,20,18},{0,16,1},{0,13,22},{0,15,68},{0,12,33},{6,28,18},{6,21,0},{6,16,1},{5,15,3},{17,0,51},{1,19,18},{2,15,1},{0,13,22},{34,0,51},{0,13,22},{3,25,18},{3,25,18},{3,25,18},{3,14,18},{0,25,8},{0,16,1},{0,16,1},{0,10,0},{0,12,17},{0,9,5},{6,19,0},{6,19,0},{6,19,0},{6,12,0},{12,0,8}, +{4,13,0},{4,13,0},{0,10,0},{25,0,8},{0,10,0},{20,0,18},{6,21,0},{8,16,0},{0,16,0},{20,0,18},{40,0,18},{0,16,0},{0,13,18},{40,0,18},{0,13,18},{3,0,18},{3,0,18},{3,0,18},{3,0,18},{0,19,0},{0,19,0},{0,19,0},{0,9,0},{0,9,4},{0,9,4},{11,42,36},{11,31,19},{12,24,24},{11,24,19},{8,42,51},{8,28,18},{8,24,1}, +{7,20,22},{0,27,52},{2,21,18},{14,36,18},{14,29,0},{14,24,1},{13,23,3},{29,0,51},{9,27,18},{10,23,1},{0,21,18},{58,0,51},{0,21,18},{11,33,18},{11,33,18},{11,33,18},{11,22,18},{8,33,8},{8,24,1},{8,24,1},{8,18,0},{2,23,8},{4,18,1},{14,26,0},{14,26,0},{14,26,0},{14,20,0},{24,0,8},{11,22,0},{11,22,0},{6,18,0},{49,0,8}, +{6,18,0},{32,0,18},{14,29,0},{15,24,0},{6,24,0},{32,0,18},{64,0,18},{6,24,0},{0,21,18},{64,0,18},{0,21,18},{11,0,18},{11,0,18},{11,0,18},{11,0,18},{8,27,0},{8,27,0},{8,27,0},{8,17,0},{4,19,0},{4,19,0},{19,50,36},{19,39,19},{20,32,24},{19,32,19},{16,50,51},{16,36,18},{16,32,1},{15,28,22},{7,37,51},{10,29,18},{22,43,18}, +{22,36,1},{22,32,1},{21,31,3},{41,0,51},{17,35,18},{18,31,1},{8,29,18},{82,0,51},{8,29,18},{19,41,18},{19,41,18},{19,41,18},{19,30,18},{16,41,8},{16,31,1},{16,31,1},{16,26,0},{10,31,8},{12,26,1},{22,34,0},{22,34,0},{22,34,0},{22,28,0},{36,0,8},{18,30,0},{18,30,0},{14,26,0},{73,0,8},{14,26,0},{43,0,18},{20,38,0},{23,32,0}, +{14,32,0},{43,0,18},{89,0,18},{14,32,0},{0,29,18},{89,0,18},{0,29,18},{19,0,18},{19,0,18},{19,0,18},{19,0,18},{16,35,0},{16,35,0},{16,35,0},{16,25,0},{12,27,0},{12,27,0},{28,59,36},{28,48,19},{29,41,24},{28,41,19},{25,59,51},{25,45,18},{25,41,1},{24,37,22},{16,46,51},{19,38,18},{31,52,18},{31,45,1},{31,41,1},{30,40,3},{54,0,51}, +{24,45,18},{27,40,1},{17,38,18},{110,0,51},{17,38,18},{28,49,18},{28,49,18},{28,49,18},{28,39,18},{25,49,8},{25,40,1},{25,40,1},{25,35,0},{19,40,8},{20,35,1},{31,43,0},{31,43,0},{31,43,0},{31,37,0},{49,0,8},{27,39,0},{27,39,0},{23,35,0},{101,0,8},{23,35,0},{57,0,18},{29,47,0},{32,41,0},{23,41,0},{57,0,18},{116,0,18},{23,41,0}, +{0,38,18},{116,0,18},{0,38,18},{28,0,18},{28,0,18},{28,0,18},{28,0,18},{25,43,0},{25,43,0},{25,43,0},{25,34,0},{19,37,0},{19,37,0},{36,66,36},{36,56,19},{37,49,24},{36,49,19},{33,66,51},{33,53,18},{33,49,1},{32,45,22},{23,54,51},{27,46,18},{39,60,18},{39,53,1},{39,49,1},{38,48,3},{66,0,51},{32,53,18},{35,48,1},{25,46,18},{134,0,51}, +{25,46,18},{36,57,18},{36,57,18},{36,57,18},{36,47,18},{33,57,8},{33,48,1},{33,48,1},{33,43,0},{25,49,8},{28,43,1},{39,51,0},{39,51,0},{39,51,0},{39,45,0},{61,0,8},{35,47,0},{35,47,0},{31,43,0},{125,0,8},{31,43,0},{69,0,18},{37,55,0},{40,49,0},{31,49,0},{69,0,18},{140,0,18},{31,49,0},{0,46,18},{140,0,18},{0,46,18},{36,0,18}, +{36,0,18},{36,0,18},{36,0,18},{33,51,0},{33,51,0},{33,51,0},{33,42,0},{27,45,0},{27,45,0},{44,74,36},{44,64,19},{45,57,24},{44,57,19},{41,74,51},{41,61,18},{41,57,1},{40,53,22},{31,62,51},{35,54,18},{47,68,18},{47,61,1},{47,57,1},{46,56,3},{78,0,51},{40,61,18},{43,56,1},{33,54,18},{158,0,51},{33,54,18},{44,65,18},{44,65,18},{44,65,18}, +{44,55,18},{41,65,8},{41,56,1},{41,56,1},{41,51,0},{33,57,8},{36,51,1},{47,59,0},{47,59,0},{47,59,0},{47,53,0},{73,0,8},{43,55,0},{43,55,0},{39,51,0},{149,0,8},{39,51,0},{81,0,18},{45,63,0},{48,57,0},{39,57,0},{81,0,18},{164,0,18},{39,57,0},{0,54,18},{164,0,18},{0,54,18},{44,0,18},{44,0,18},{44,0,18},{44,0,18},{41,59,0}, +{41,59,0},{41,59,0},{41,50,0},{35,53,0},{35,53,0},{52,82,36},{52,71,19},{53,65,24},{52,65,19},{49,82,51},{49,68,18},{49,65,1},{48,61,22},{39,70,51},{43,62,18},{55,76,18},{55,69,1},{55,65,1},{54,64,3},{89,0,51},{49,68,18},{51,64,1},{41,62,18},{183,0,51},{41,62,18},{52,73,18},{52,73,18},{52,73,18},{52,63,18},{49,73,8},{49,64,1},{49,64,1}, +{49,59,0},{42,64,8},{44,59,1},{55,67,0},{55,67,0},{55,67,0},{55,61,0},{85,0,8},{51,63,0},{51,63,0},{47,59,0},{174,0,8},{47,59,0},{92,0,18},{54,70,0},{56,65,0},{47,65,0},{92,0,18},{189,0,18},{47,65,0},{0,62,18},{189,0,18},{0,62,18},{52,0,18},{52,0,18},{52,0,18},{52,0,18},{49,67,0},{49,67,0},{49,67,0},{49,58,0},{43,61,0}, +{43,61,0},{61,91,36},{61,80,19},{62,74,24},{61,73,20},{58,91,51},{58,77,18},{58,73,2},{57,70,22},{48,79,51},{50,71,19},{64,85,18},{64,77,1},{64,74,1},{63,73,3},{103,0,51},{58,77,18},{59,74,1},{49,71,18},{210,0,51},{49,71,18},{61,82,18},{61,82,18},{61,82,18},{61,72,18},{58,82,8},{58,73,1},{58,73,1},{58,68,0},{51,73,8},{53,68,1},{64,76,0}, +{64,76,0},{64,76,0},{64,70,0},{98,0,8},{60,72,0},{60,72,0},{56,68,0},{201,0,8},{56,68,0},{106,0,18},{63,79,0},{65,74,0},{55,74,0},{106,0,18},{216,0,18},{55,74,0},{0,71,18},{216,0,18},{0,71,18},{61,0,18},{61,0,18},{61,0,18},{61,0,18},{58,76,0},{58,76,0},{58,76,0},{58,67,0},{53,69,0},{53,69,0},{69,99,36},{69,88,19},{70,82,24}, +{69,81,20},{66,99,51},{66,85,18},{66,81,2},{65,79,23},{56,87,51},{58,79,19},{72,93,18},{72,85,1},{72,82,1},{72,80,5},{115,0,51},{66,85,18},{67,82,1},{57,79,18},{234,0,51},{57,79,18},{69,90,18},{69,90,18},{69,90,18},{69,79,18},{66,90,8},{66,81,1},{66,81,1},{66,75,1},{59,81,8},{61,76,1},{72,84,0},{72,84,0},{72,84,0},{72,78,0},{110,0,8}, +{69,79,0},{69,79,0},{63,76,0},{225,0,8},{63,76,0},{118,0,18},{71,87,0},{73,82,0},{63,82,0},{118,0,18},{240,0,18},{63,82,0},{0,79,18},{240,0,18},{0,79,18},{69,0,18},{69,0,18},{69,0,18},{69,0,18},{66,84,0},{66,84,0},{66,84,0},{66,75,0},{61,77,0},{61,77,0},{77,107,36},{77,96,19},{78,90,24},{77,89,20},{74,107,51},{74,93,18},{74,89,2}, +{73,87,23},{64,95,51},{66,87,19},{80,101,18},{80,93,1},{80,90,1},{80,88,5},{127,0,51},{74,93,18},{75,90,1},{65,87,18},{254,2,51},{65,87,18},{77,98,18},{77,98,18},{77,98,18},{77,87,18},{74,98,8},{74,89,1},{74,89,1},{74,83,1},{67,89,8},{69,84,1},{80,92,0},{80,92,0},{80,92,0},{80,86,0},{122,0,8},{77,87,0},{77,87,0},{71,84,0},{249,0,8}, +{71,84,0},{129,0,18},{79,95,0},{81,90,0},{71,90,0},{129,0,18},{254,5,18},{71,90,0},{0,87,18},{254,5,18},{0,87,18},{77,0,18},{77,0,18},{77,0,18},{77,0,18},{74,92,0},{74,92,0},{74,92,0},{74,83,0},{69,85,0},{69,85,0},{85,115,36},{85,104,19},{86,98,24},{85,97,20},{82,115,51},{82,101,18},{82,97,2},{81,95,23},{72,103,51},{74,95,19},{88,109,18}, +{88,101,1},{88,98,1},{88,96,5},{138,0,51},{82,101,18},{83,98,1},{73,95,18},{254,14,51},{73,95,18},{85,106,18},{85,106,18},{85,106,18},{85,95,18},{82,106,8},{82,97,1},{82,97,1},{82,91,1},{75,97,8},{77,92,1},{88,100,0},{88,100,0},{88,100,0},{88,94,0},{134,0,8},{85,95,0},{85,95,0},{79,92,0},{255,9,8},{79,92,0},{141,0,18},{87,103,0},{89,98,0}, +{79,98,0},{141,0,18},{254,17,18},{79,98,0},{0,95,18},{254,17,18},{0,95,18},{85,0,18},{85,0,18},{85,0,18},{85,0,18},{82,100,0},{82,100,0},{82,100,0},{82,91,0},{77,93,0},{77,93,0},{94,124,36},{94,113,19},{95,107,24},{94,106,20},{91,124,51},{91,110,18},{91,106,2},{90,104,23},{81,112,51},{83,104,19},{97,118,18},{97,110,1},{97,107,1},{97,105,5},{152,0,51}, +{91,110,18},{92,107,1},{82,104,18},{255,27,51},{82,104,18},{94,115,18},{94,115,18},{94,115,18},{94,104,18},{91,115,8},{91,106,1},{91,106,1},{91,100,1},{84,106,8},{86,101,1},{97,108,0},{97,108,0},{97,108,0},{97,103,0},{147,0,8},{94,104,0},{94,104,0},{88,101,0},{254,23,8},{88,101,0},{155,0,18},{96,112,0},{98,107,0},{88,107,0},{155,0,18},{255,30,18},{88,107,0}, +{0,104,18},{255,30,18},{0,104,18},{94,0,18},{94,0,18},{94,0,18},{94,0,18},{91,109,0},{91,109,0},{91,109,0},{91,100,0},{86,102,0},{86,102,0},{102,132,36},{102,121,19},{102,116,23},{102,114,20},{99,132,51},{99,118,18},{99,114,2},{98,112,23},{89,120,51},{91,112,19},{105,125,18},{105,118,1},{105,115,1},{105,113,5},{164,0,51},{99,118,18},{100,114,1},{90,112,18},{255,39,51}, +{90,112,18},{102,123,18},{102,123,18},{102,123,18},{102,112,18},{99,123,8},{99,114,1},{99,114,1},{99,108,1},{92,114,8},{94,109,1},{105,116,0},{105,116,0},{105,116,0},{105,111,0},{159,0,8},{102,112,0},{102,112,0},{96,109,0},{254,35,8},{96,109,0},{167,0,18},{104,120,0},{106,115,0},{96,115,0},{167,0,18},{254,42,18},{96,115,0},{0,112,18},{254,42,18},{0,112,18},{102,0,18}, +{102,0,18},{102,0,18},{102,0,18},{99,117,0},{99,117,0},{99,117,0},{99,108,0},{94,110,0},{94,110,0},{110,140,36},{110,130,18},{110,124,23},{110,122,20},{107,140,51},{107,126,18},{107,122,2},{106,120,23},{97,128,51},{99,120,19},{113,133,18},{113,126,1},{113,123,1},{113,121,5},{175,0,51},{107,126,18},{108,122,1},{98,120,18},{254,51,51},{98,120,18},{110,130,18},{110,130,18},{110,130,18}, +{110,120,18},{107,131,8},{107,122,1},{107,122,1},{107,116,1},{100,122,8},{102,117,1},{113,124,0},{113,124,0},{113,124,0},{113,119,0},{171,0,8},{110,120,0},{110,120,0},{104,117,0},{255,46,8},{104,117,0},{178,0,18},{112,128,0},{114,123,0},{104,123,0},{178,0,18},{254,54,18},{104,123,0},{0,120,18},{254,54,18},{0,120,18},{110,0,18},{110,0,18},{110,0,18},{110,0,18},{107,124,0}, +{107,124,0},{107,124,0},{107,116,0},{102,118,0},{102,118,0},{118,147,36},{118,138,18},{118,132,23},{118,130,20},{115,148,51},{115,134,18},{115,130,2},{114,128,23},{105,136,51},{108,128,18},{121,141,18},{121,134,1},{121,131,1},{121,129,5},{187,0,51},{115,134,18},{116,130,1},{106,128,18},{254,63,51},{106,128,18},{118,138,18},{118,138,18},{118,138,18},{118,128,18},{115,138,8},{115,130,1},{115,130,1}, +{115,124,1},{108,130,8},{110,125,1},{121,132,0},{121,132,0},{121,132,0},{121,127,0},{183,0,8},{118,128,0},{118,128,0},{112,125,0},{255,58,8},{112,125,0},{190,0,18},{120,136,0},{122,131,0},{112,131,0},{190,0,18},{254,66,18},{112,131,0},{0,128,18},{254,66,18},{0,128,18},{118,0,18},{118,0,18},{118,0,18},{118,0,18},{115,132,0},{115,132,0},{115,132,0},{115,124,0},{110,126,0}, +{110,126,0},{127,156,36},{127,147,18},{127,141,23},{127,139,20},{124,156,51},{124,143,18},{124,139,2},{123,137,23},{114,145,51},{117,137,18},{130,150,18},{130,143,1},{130,140,1},{130,138,5},{201,0,51},{124,143,18},{125,139,1},{115,137,18},{255,76,51},{115,137,18},{127,147,18},{127,147,18},{127,147,18},{127,137,18},{124,147,8},{124,139,1},{124,139,1},{124,133,1},{117,139,8},{119,134,1},{130,141,0}, +{130,141,0},{130,141,0},{130,136,0},{196,0,8},{127,137,0},{127,137,0},{121,134,0},{254,72,8},{121,134,0},{204,0,18},{129,145,0},{131,140,0},{121,140,0},{204,0,18},{255,79,18},{121,140,0},{0,137,18},{255,79,18},{0,137,18},{127,0,18},{127,0,18},{127,0,18},{127,0,18},{124,141,0},{124,141,0},{124,141,0},{124,133,0},{119,135,0},{119,135,0},{135,164,36},{135,154,19},{135,149,23}, +{135,147,20},{132,164,51},{132,151,18},{132,147,2},{131,145,23},{121,153,51},{125,145,18},{138,158,18},{138,151,1},{138,148,1},{138,146,5},{213,0,51},{131,151,18},{133,147,1},{123,145,18},{254,88,51},{123,145,18},{135,155,18},{135,155,18},{135,155,18},{135,145,18},{132,155,8},{132,147,1},{132,147,1},{132,141,1},{125,147,8},{127,142,1},{138,149,0},{138,149,0},{138,149,0},{138,144,0},{208,0,8}, +{135,145,0},{135,145,0},{129,142,0},{254,84,8},{129,142,0},{215,0,18},{137,153,0},{139,148,0},{129,148,0},{215,0,18},{254,91,18},{129,148,0},{0,145,18},{254,91,18},{0,145,18},{135,0,18},{135,0,18},{135,0,18},{135,0,18},{132,149,0},{132,149,0},{132,149,0},{132,141,0},{127,143,0},{127,143,0},{143,172,36},{143,162,19},{143,157,23},{143,155,20},{140,172,51},{140,159,18},{140,155,2}, +{139,153,23},{129,161,51},{132,153,19},{146,166,18},{146,159,1},{146,156,1},{146,154,5},{224,0,51},{139,159,18},{141,155,1},{130,153,18},{254,100,51},{130,153,18},{143,163,18},{143,163,18},{143,163,18},{143,153,18},{140,163,8},{140,155,1},{140,155,1},{140,149,1},{132,155,8},{135,150,1},{146,157,0},{146,157,0},{146,157,0},{146,152,0},{220,0,8},{143,153,0},{143,153,0},{137,150,0},{255,95,8}, +{137,150,0},{227,0,18},{144,161,0},{147,156,0},{136,156,0},{227,0,18},{254,103,18},{136,156,0},{0,153,18},{254,103,18},{0,153,18},{143,0,18},{143,0,18},{143,0,18},{143,0,18},{140,157,0},{140,157,0},{140,157,0},{140,149,0},{135,151,0},{135,151,0},{151,180,36},{151,170,19},{151,165,23},{151,163,20},{148,180,51},{148,167,18},{148,163,2},{148,160,24},{137,169,51},{140,161,19},{154,174,18}, +{154,167,1},{154,164,1},{154,162,5},{236,0,51},{147,167,18},{149,164,1},{138,161,18},{254,112,51},{138,161,18},{151,171,18},{151,171,18},{151,171,18},{151,161,18},{148,171,8},{148,162,1},{148,162,1},{148,157,1},{140,163,8},{143,158,1},{154,165,0},{154,165,0},{154,165,0},{154,160,0},{232,0,8},{150,161,0},{150,161,0},{144,158,0},{255,107,8},{144,158,0},{239,0,18},{152,169,0},{155,164,0}, +{144,164,0},{239,0,18},{254,115,18},{144,164,0},{0,161,18},{254,115,18},{0,161,18},{151,0,18},{151,0,18},{151,0,18},{151,0,18},{148,165,0},{148,165,0},{148,165,0},{148,157,0},{142,159,0},{142,159,0},{160,189,36},{160,179,19},{160,174,23},{160,172,20},{157,189,51},{157,176,18},{157,172,2},{157,169,24},{146,178,51},{149,170,19},{163,183,18},{163,176,1},{163,173,1},{163,172,5},{250,0,51}, +{156,176,18},{158,173,1},{147,170,18},{255,125,51},{147,170,18},{160,180,18},{160,180,18},{160,180,18},{160,170,18},{157,180,8},{157,171,1},{157,171,1},{157,166,1},{149,172,8},{152,167,1},{163,174,0},{163,174,0},{163,174,0},{163,168,0},{245,0,8},{159,170,0},{159,170,0},{153,167,0},{254,121,8},{153,167,0},{253,0,18},{161,178,0},{164,173,0},{153,173,0},{253,0,18},{254,128,18},{153,173,0}, +{0,170,18},{254,128,18},{0,170,18},{160,0,18},{160,0,18},{160,0,18},{160,0,18},{157,174,0},{157,174,0},{157,174,0},{157,165,0},{151,168,0},{151,168,0},{168,197,36},{168,187,19},{168,182,23},{168,180,20},{165,197,51},{165,184,18},{165,180,2},{165,177,24},{154,186,51},{157,178,19},{171,191,18},{171,184,1},{171,181,1},{171,180,5},{255,13,51},{164,184,18},{166,181,1},{155,178,18},{254,137,51}, +{155,178,18},{168,188,18},{168,188,18},{168,188,18},{168,178,18},{165,188,8},{165,179,1},{165,179,1},{165,174,1},{157,180,8},{160,175,1},{171,182,0},{171,182,0},{171,182,0},{171,176,0},{255,4,8},{167,178,0},{167,178,0},{161,175,0},{255,132,8},{161,175,0},{255,19,18},{169,186,0},{172,181,0},{161,181,0},{255,19,18},{254,140,18},{161,181,0},{0,178,18},{254,140,18},{0,178,18},{168,0,18}, +{168,0,18},{168,0,18},{168,0,18},{165,182,0},{165,182,0},{165,182,0},{165,173,0},{159,176,0},{159,176,0},{176,205,36},{176,195,19},{176,190,23},{176,188,20},{173,205,51},{173,192,18},{173,188,2},{173,185,24},{162,194,51},{165,186,19},{179,199,18},{179,192,1},{179,189,1},{179,188,5},{255,37,51},{172,192,18},{174,189,1},{163,186,18},{254,149,51},{163,186,18},{176,196,18},{176,196,18},{176,196,18}, +{176,186,18},{173,196,8},{173,187,1},{173,187,1},{173,182,1},{165,188,8},{168,183,1},{179,190,0},{179,190,0},{179,190,0},{179,184,0},{255,28,8},{175,186,0},{175,186,0},{169,183,0},{255,144,8},{169,183,0},{255,43,18},{177,194,0},{180,189,0},{169,189,0},{255,43,18},{254,152,18},{169,189,0},{0,186,18},{254,152,18},{0,186,18},{176,0,18},{176,0,18},{176,0,18},{176,0,18},{173,190,0}, +{173,190,0},{173,190,0},{173,181,0},{167,184,0},{167,184,0},{184,213,36},{184,203,19},{184,197,22},{184,196,20},{181,213,51},{181,200,18},{181,196,2},{181,193,24},{170,202,51},{173,194,19},{187,207,18},{187,201,1},{187,197,0},{187,196,5},{255,61,51},{180,200,18},{182,197,1},{171,194,18},{254,161,51},{171,194,18},{184,204,18},{184,204,18},{184,204,18},{184,194,18},{181,204,8},{181,195,1},{181,195,1}, +{181,190,1},{173,196,8},{176,191,1},{187,197,0},{187,197,0},{187,197,0},{187,192,0},{255,52,8},{183,194,0},{183,194,0},{177,191,0},{255,156,8},{177,191,0},{255,67,18},{185,202,0},{187,197,0},{177,197,0},{255,67,18},{254,164,18},{177,197,0},{0,194,18},{254,164,18},{0,194,18},{184,0,18},{184,0,18},{184,0,18},{184,0,18},{181,198,0},{181,198,0},{181,198,0},{181,189,0},{175,192,0}, +{175,192,0},{193,222,36},{193,212,18},{193,206,22},{193,205,20},{190,222,51},{189,209,19},{190,206,1},{190,202,24},{179,211,51},{182,203,19},{196,215,18},{196,210,1},{196,206,0},{196,205,5},{255,89,51},{189,209,18},{190,206,1},{180,203,18},{254,174,51},{180,203,18},{193,212,18},{193,212,18},{193,212,18},{193,203,18},{190,213,8},{190,204,1},{190,204,1},{190,199,1},{182,205,8},{185,200,1},{196,206,0}, +{196,206,0},{196,206,0},{196,201,0},{255,79,8},{192,203,0},{192,203,0},{186,200,0},{253,170,8},{186,200,0},{255,95,18},{194,211,0},{196,206,0},{186,206,0},{255,95,18},{254,177,18},{186,206,0},{0,203,18},{254,177,18},{0,203,18},{193,0,18},{193,0,18},{193,0,18},{193,0,18},{190,206,0},{190,206,0},{190,206,0},{190,198,0},{184,201,0},{184,201,0},{201,229,36},{201,220,18},{201,214,22}, +{201,213,20},{198,230,51},{197,217,19},{198,214,1},{198,210,24},{187,219,51},{190,211,19},{204,223,18},{204,218,1},{204,214,0},{204,213,5},{255,113,51},{197,217,18},{198,214,1},{188,211,18},{254,186,51},{188,211,18},{201,220,18},{201,220,18},{201,220,18},{201,211,18},{198,220,8},{198,212,1},{198,212,1},{198,207,1},{190,213,8},{192,208,1},{204,214,0},{204,214,0},{204,214,0},{204,209,0},{255,104,8}, +{200,211,0},{200,211,0},{194,208,0},{255,181,8},{194,208,0},{255,119,18},{202,219,0},{204,214,0},{194,214,0},{255,119,18},{254,189,18},{194,214,0},{0,211,18},{254,189,18},{0,211,18},{201,0,18},{201,0,18},{201,0,18},{201,0,18},{198,214,0},{198,214,0},{198,214,0},{198,206,0},{192,209,0},{192,209,0},{209,237,36},{209,228,18},{209,222,22},{209,221,20},{206,237,51},{205,225,19},{206,222,1}, +{206,218,24},{196,226,51},{197,219,19},{212,231,18},{212,226,1},{212,222,0},{212,221,5},{255,137,51},{205,225,18},{206,222,1},{196,219,18},{254,198,51},{196,219,18},{209,228,18},{209,228,18},{209,228,18},{209,219,18},{206,228,8},{206,220,1},{206,220,1},{206,215,1},{198,221,8},{200,216,1},{212,222,0},{212,222,0},{212,222,0},{212,217,0},{255,128,8},{208,219,0},{208,219,0},{202,216,0},{255,193,8}, +{202,216,0},{255,143,18},{210,227,0},{212,222,0},{202,222,0},{255,143,18},{254,201,18},{202,222,0},{0,219,18},{254,201,18},{0,219,18},{209,0,18},{209,0,18},{209,0,18},{209,0,18},{206,222,0},{206,222,0},{206,222,0},{206,214,0},{200,217,0},{200,217,0},{217,245,36},{217,236,18},{217,230,22},{217,229,20},{214,245,51},{213,233,19},{214,230,1},{214,226,24},{204,234,51},{205,227,19},{220,239,18}, +{220,234,1},{220,230,0},{220,229,5},{255,161,51},{213,233,18},{214,230,1},{204,227,18},{254,210,51},{204,227,18},{217,236,18},{217,236,18},{217,236,18},{217,227,18},{214,236,8},{214,228,1},{214,228,1},{214,223,1},{206,229,8},{208,224,1},{220,230,0},{220,230,0},{220,230,0},{220,225,0},{255,152,8},{216,227,0},{216,227,0},{210,224,0},{255,205,8},{210,224,0},{255,167,18},{218,235,0},{220,230,0}, +{210,230,0},{255,167,18},{253,213,18},{210,230,0},{0,227,18},{253,213,18},{0,227,18},{217,0,18},{217,0,18},{217,0,18},{217,0,18},{214,230,0},{214,230,0},{214,230,0},{214,222,0},{208,225,0},{208,225,0},{226,254,36},{226,245,18},{226,239,22},{226,238,20},{223,254,51},{223,241,18},{223,239,1},{223,235,24},{213,243,51},{214,236,19},{229,248,18},{228,243,1},{229,239,0},{229,238,5},{255,189,51}, +{223,241,18},{223,239,1},{212,236,18},{254,223,51},{212,236,18},{226,245,18},{226,245,18},{226,245,18},{226,236,18},{223,245,8},{223,237,1},{223,237,1},{223,232,1},{216,237,8},{217,233,1},{229,239,0},{229,239,0},{229,239,0},{229,234,0},{255,180,8},{225,236,0},{225,236,0},{219,233,0},{255,218,8},{219,233,0},{255,195,18},{228,243,0},{229,239,0},{218,239,0},{255,195,18},{254,226,18},{218,239,0}, +{0,236,18},{254,226,18},{0,236,18},{226,0,18},{226,0,18},{226,0,18},{226,0,18},{223,239,0},{223,239,0},{223,239,0},{223,231,0},{217,234,0},{217,234,0},{235,254,46},{234,253,18},{234,247,22},{233,246,22},{233,255,56},{231,249,18},{231,247,1},{231,243,24},{221,251,51},{222,244,19},{238,254,19},{237,249,1},{237,247,0},{237,246,5},{255,213,51},{231,249,18},{231,247,1},{220,244,18},{254,235,51}, +{220,244,18},{234,253,18},{234,253,18},{234,253,18},{234,244,18},{231,253,8},{231,245,1},{231,245,1},{231,240,1},{224,245,8},{226,241,0},{237,247,0},{237,247,0},{237,247,0},{237,242,0},{255,204,8},{233,244,0},{233,244,0},{226,241,0},{255,230,8},{226,241,0},{255,219,18},{236,251,0},{237,247,0},{226,247,0},{255,219,18},{254,238,18},{226,247,0},{0,244,18},{254,238,18},{0,244,18},{234,0,18}, +{234,0,18},{234,0,18},{234,0,18},{231,247,0},{231,247,0},{231,247,0},{231,239,0},{226,241,0},{226,241,0},{245,255,72},{243,255,33},{242,255,22},{241,254,22},{242,255,81},{240,255,21},{239,255,1},{238,251,25},{234,255,56},{230,252,19},{248,255,29},{246,255,5},{245,255,0},{244,254,6},{255,237,51},{240,255,20},{239,255,1},{228,252,18},{254,247,51},{228,252,18},{242,255,22},{242,255,22},{242,255,22}, +{242,251,18},{241,254,14},{239,253,1},{239,253,1},{239,249,1},{232,253,8},{234,249,0},{245,255,0},{245,255,0},{245,255,0},{245,250,0},{255,228,8},{242,251,0},{242,251,0},{234,249,0},{255,242,8},{234,249,0},{255,243,18},{246,255,4},{245,255,0},{234,255,0},{255,243,18},{254,250,18},{234,255,0},{0,252,18},{254,250,18},{0,252,18},{242,0,18},{242,0,18},{242,0,18},{242,0,18},{239,255,0}, +{239,255,0},{239,255,0},{239,247,0},{234,249,0},{234,249,0},{251,255,28},{251,255,25},{251,255,24},{250,255,19},{251,255,24},{249,255,10},{248,255,9},{247,255,0},{246,255,12},{243,255,1},{254,255,1},{253,255,1},{253,255,1},{253,255,0},{255,249,3},{252,255,0},{252,255,0},{246,255,0},{254,253,3},{246,255,0},{251,255,24},{251,255,24},{251,255,24},{250,255,19},{250,254,19},{248,255,9},{248,255,9}, +{247,255,0},{246,255,8},{243,255,1},{253,254,1},{253,254,1},{253,254,1},{253,255,0},{255,249,2},{252,255,0},{252,255,0},{246,255,0},{254,253,2},{246,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{250,0,18},{250,0,18},{250,0,18},{250,0,18},{248,255,5},{248,255,5},{248,255,5},{247,255,0},{243,255,1}, +{243,255,1},{0,34,72},{0,24,5},{0,17,0},{0,13,25},{0,22,153},{0,15,90},{0,13,41},{0,10,110},{0,9,162},{0,8,119},{0,34,72},{0,24,5},{0,17,0},{0,13,25},{11,0,153},{0,15,90},{0,13,41},{0,10,110},{22,0,153},{0,10,110},{0,16,0},{0,16,0},{0,16,0},{0,8,0},{0,7,13},{0,6,2},{0,6,2},{0,4,5},{0,3,13},{0,4,6},{0,16,0}, +{0,16,0},{0,16,0},{0,8,0},{3,0,13},{0,6,2},{0,6,2},{0,4,5},{7,0,13},{0,4,5},{17,0,72},{0,24,5},{0,17,0},{0,13,25},{17,0,72},{34,0,72},{0,13,25},{0,11,72},{34,0,72},{0,11,72},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,54,77},{2,37,5},{3,25,18}, +{1,23,13},{0,43,243},{0,27,99},{0,23,24},{0,16,139},{0,18,276},{0,16,164},{3,52,72},{3,36,0},{4,26,6},{2,24,11},{21,0,243},{0,27,99},{0,23,24},{0,16,139},{43,0,243},{0,16,139},{2,36,5},{2,36,5},{2,36,5},{1,19,5},{0,25,50},{0,18,5},{0,18,5},{0,10,18},{0,12,59},{0,10,27},{3,34,0},{3,34,0},{3,34,0},{3,18,0},{12,0,50}, +{0,18,5},{0,18,5},{0,10,18},{25,0,50},{0,10,18},{29,0,72},{3,36,0},{8,25,0},{0,23,8},{29,0,72},{58,0,72},{0,23,8},{0,19,72},{58,0,72},{0,19,72},{1,0,5},{1,0,5},{1,0,5},{1,0,5},{0,10,0},{0,10,0},{0,10,0},{0,5,0},{0,3,1},{0,3,1},{6,70,133},{6,46,65},{7,35,94},{5,33,65},{0,67,243},{0,39,75},{0,32,2}, +{0,25,105},{0,30,332},{0,24,164},{11,60,72},{11,44,0},{12,34,6},{10,32,11},{33,0,243},{0,39,75},{1,32,1},{0,25,105},{67,0,243},{0,25,105},{6,52,61},{6,52,61},{6,52,61},{5,29,61},{0,49,50},{0,32,1},{0,32,1},{0,19,5},{0,21,94},{0,18,35},{11,42,0},{11,42,0},{11,42,0},{11,26,0},{24,0,50},{3,30,0},{3,30,0},{0,19,5},{49,0,50}, +{0,19,5},{41,0,72},{11,44,0},{16,33,0},{0,32,1},{41,0,72},{82,0,72},{0,32,1},{0,27,72},{82,0,72},{0,27,72},{5,0,61},{5,0,61},{5,0,61},{5,0,61},{0,34,0},{0,34,0},{0,34,0},{0,17,0},{0,15,17},{0,15,17},{13,80,144},{13,56,77},{15,43,109},{12,40,76},{7,77,243},{7,49,73},{7,41,1},{5,33,100},{0,42,287},{0,33,98},{19,68,72}, +{19,52,0},{20,42,6},{18,40,11},{45,0,243},{4,50,72},{9,40,1},{0,34,83},{92,0,243},{0,34,83},{13,62,72},{13,62,72},{13,62,72},{13,37,72},{7,59,50},{7,41,1},{7,41,1},{6,28,3},{0,36,66},{0,29,4},{19,50,0},{19,50,0},{19,50,0},{19,34,0},{36,0,50},{11,38,0},{11,38,0},{0,29,0},{73,0,50},{0,29,0},{52,0,72},{18,52,0},{23,41,0}, +{5,41,0},{52,0,72},{107,0,72},{5,41,0},{0,35,72},{107,0,72},{0,35,72},{13,0,72},{13,0,72},{13,0,72},{13,0,72},{7,44,0},{7,44,0},{7,44,0},{7,25,0},{0,27,2},{0,27,2},{22,89,144},{22,65,77},{24,52,109},{21,49,76},{16,86,243},{16,58,73},{16,50,1},{14,42,100},{0,57,248},{3,43,75},{28,77,72},{28,61,0},{29,50,5},{27,49,11},{58,0,243}, +{13,59,72},{18,49,1},{0,44,73},{119,0,243},{0,44,73},{22,71,72},{22,71,72},{22,71,72},{22,46,72},{16,68,50},{16,50,1},{16,50,1},{15,37,3},{0,49,50},{6,38,1},{28,59,0},{28,59,0},{28,59,0},{28,43,0},{49,0,50},{20,47,0},{20,47,0},{8,38,0},{101,0,50},{8,38,0},{66,0,72},{27,61,0},{32,50,0},{13,50,0},{66,0,72},{134,0,72},{13,50,0}, +{0,44,72},{134,0,72},{0,44,72},{22,0,72},{22,0,72},{22,0,72},{22,0,72},{16,53,0},{16,53,0},{16,53,0},{16,34,0},{6,39,0},{6,39,0},{30,97,144},{30,73,77},{32,59,106},{30,56,77},{24,94,243},{24,66,73},{24,58,2},{22,50,100},{2,69,243},{10,51,76},{36,85,72},{36,67,1},{37,58,5},{35,57,11},{70,0,243},{21,67,72},{26,58,1},{3,52,72},{143,0,243}, +{3,52,72},{30,79,72},{30,79,72},{30,79,72},{30,54,72},{24,76,50},{25,56,2},{25,56,2},{23,45,3},{8,57,50},{14,46,1},{36,66,0},{36,66,0},{36,66,0},{36,51,0},{61,0,50},{27,56,0},{27,56,0},{16,46,0},{125,0,50},{16,46,0},{78,0,72},{35,69,0},{40,58,0},{21,58,0},{78,0,72},{158,0,72},{21,58,0},{0,52,72},{158,0,72},{0,52,72},{30,0,72}, +{30,0,72},{30,0,72},{30,0,72},{24,61,0},{24,61,0},{24,61,0},{24,42,0},{14,47,0},{14,47,0},{38,105,144},{38,81,77},{40,67,106},{38,64,77},{32,102,243},{32,74,73},{32,66,2},{30,59,103},{10,77,243},{18,59,76},{44,93,72},{44,75,1},{45,66,5},{44,63,13},{82,0,243},{29,75,72},{33,66,1},{11,60,72},{167,0,243},{11,60,72},{38,87,72},{38,87,72},{38,87,72}, +{38,62,72},{32,84,50},{33,64,2},{33,64,2},{31,53,3},{16,65,50},{22,54,1},{44,74,0},{44,74,0},{44,74,0},{44,59,0},{73,0,50},{35,63,0},{35,63,0},{23,54,0},{149,0,50},{23,54,0},{89,0,72},{43,77,0},{48,66,0},{29,66,0},{89,0,72},{183,0,72},{29,66,0},{0,60,72},{183,0,72},{0,60,72},{38,0,72},{38,0,72},{38,0,72},{38,0,72},{32,69,0}, +{32,69,0},{32,69,0},{32,50,0},{21,55,0},{21,55,0},{46,113,144},{46,88,76},{48,75,106},{46,72,77},{40,110,243},{40,82,73},{40,73,2},{38,67,103},{18,85,243},{26,67,76},{52,100,72},{52,83,1},{53,74,5},{52,72,13},{94,0,243},{37,83,72},{41,74,1},{19,68,72},{192,0,243},{19,68,72},{46,95,72},{46,95,72},{46,95,72},{46,70,72},{40,92,50},{40,73,1},{40,73,1}, +{39,61,3},{24,73,50},{30,62,1},{52,82,0},{52,82,0},{52,82,0},{52,67,0},{85,0,50},{43,71,0},{43,71,0},{31,62,0},{174,0,50},{31,62,0},{101,0,72},{51,85,0},{56,74,0},{37,74,0},{101,0,72},{207,0,72},{37,74,0},{0,68,72},{207,0,72},{0,68,72},{46,0,72},{46,0,72},{46,0,72},{46,0,72},{40,76,0},{40,76,0},{40,76,0},{40,58,0},{29,63,0}, +{29,63,0},{55,122,144},{55,97,76},{57,84,106},{55,81,77},{49,119,243},{48,91,74},{49,82,2},{47,76,103},{27,94,243},{35,76,76},{61,109,72},{61,92,1},{62,83,5},{61,81,13},{107,0,243},{46,92,72},{50,83,1},{28,77,72},{219,0,243},{28,77,72},{55,103,72},{55,103,72},{55,103,72},{55,79,72},{49,101,50},{49,82,1},{49,82,1},{49,69,5},{33,82,50},{38,71,1},{61,91,0}, +{61,91,0},{61,91,0},{61,76,0},{98,0,50},{52,80,0},{52,80,0},{40,71,0},{201,0,50},{40,71,0},{115,0,72},{60,94,0},{65,83,0},{46,83,0},{115,0,72},{234,0,72},{46,83,0},{0,77,72},{234,0,72},{0,77,72},{55,0,72},{55,0,72},{55,0,72},{55,0,72},{49,85,0},{49,85,0},{49,85,0},{49,67,0},{38,72,0},{38,72,0},{63,130,144},{63,105,76},{65,92,106}, +{63,89,77},{57,127,243},{56,99,74},{57,90,2},{55,84,103},{35,102,243},{42,84,76},{69,117,72},{69,100,1},{70,91,5},{69,89,13},{119,0,243},{54,100,72},{58,91,1},{36,85,72},{243,0,243},{36,85,72},{63,111,72},{63,111,72},{63,111,72},{63,87,72},{57,108,50},{57,90,1},{57,90,1},{57,77,5},{41,90,50},{46,79,1},{69,99,0},{69,99,0},{69,99,0},{69,84,0},{110,0,50}, +{60,88,0},{60,88,0},{48,79,0},{225,0,50},{48,79,0},{127,0,72},{68,102,0},{73,91,0},{54,91,0},{127,0,72},{254,2,72},{54,91,0},{0,85,72},{254,2,72},{0,85,72},{63,0,72},{63,0,72},{63,0,72},{63,0,72},{57,93,0},{57,93,0},{57,93,0},{57,75,0},{46,80,0},{46,80,0},{71,137,144},{71,113,76},{73,100,106},{71,97,77},{65,135,243},{64,107,74},{65,98,2}, +{63,92,103},{44,109,243},{50,92,76},{77,125,72},{77,108,1},{78,99,5},{77,97,13},{131,0,243},{62,108,72},{66,99,1},{44,93,72},{255,6,243},{44,93,72},{71,119,72},{71,119,72},{71,119,72},{71,95,72},{65,116,50},{65,98,1},{65,98,1},{65,85,5},{49,98,50},{54,87,1},{77,107,0},{77,107,0},{77,107,0},{77,92,0},{122,0,50},{68,96,0},{68,96,0},{56,87,0},{249,0,50}, +{56,87,0},{138,0,72},{76,110,0},{81,99,0},{62,99,0},{138,0,72},{254,14,72},{62,99,0},{0,93,72},{254,14,72},{0,93,72},{71,0,72},{71,0,72},{71,0,72},{71,0,72},{65,101,0},{65,101,0},{65,101,0},{65,83,0},{54,88,0},{54,88,0},{79,145,144},{79,121,76},{81,108,106},{79,105,77},{73,142,243},{72,115,74},{73,106,2},{71,100,103},{52,117,243},{58,100,76},{85,133,72}, +{85,116,1},{86,107,5},{85,105,13},{143,0,243},{70,116,72},{74,107,1},{52,101,72},{255,18,243},{52,101,72},{79,127,72},{79,127,72},{79,127,72},{79,103,72},{73,124,50},{73,106,1},{73,106,1},{73,93,5},{57,106,50},{62,95,1},{85,115,0},{85,115,0},{85,115,0},{85,100,0},{134,0,50},{76,104,0},{76,104,0},{64,95,0},{255,9,50},{64,95,0},{150,0,72},{84,118,0},{89,107,0}, +{70,107,0},{150,0,72},{254,26,72},{70,107,0},{0,101,72},{254,26,72},{0,101,72},{79,0,72},{79,0,72},{79,0,72},{79,0,72},{73,109,0},{73,109,0},{73,109,0},{73,91,0},{62,96,0},{62,96,0},{88,154,144},{88,130,76},{90,117,106},{88,114,77},{82,151,243},{81,124,74},{82,115,2},{80,109,103},{61,126,243},{67,109,76},{94,142,72},{94,125,1},{95,116,5},{94,114,13},{156,0,243}, +{79,125,72},{83,116,1},{61,110,72},{254,32,243},{61,110,72},{88,136,72},{88,136,72},{88,136,72},{88,112,72},{82,133,50},{82,115,1},{82,115,1},{82,102,5},{66,115,50},{71,104,1},{94,124,0},{94,124,0},{94,124,0},{94,109,0},{147,0,50},{85,113,0},{85,113,0},{73,104,0},{254,23,50},{73,104,0},{164,0,72},{93,127,0},{98,116,0},{79,116,0},{164,0,72},{255,39,72},{79,116,0}, +{0,110,72},{255,39,72},{0,110,72},{88,0,72},{88,0,72},{88,0,72},{88,0,72},{82,118,0},{82,118,0},{82,118,0},{82,100,0},{71,105,0},{71,105,0},{96,162,144},{96,138,76},{98,125,106},{96,122,77},{90,159,243},{90,131,73},{90,123,2},{88,117,103},{69,134,243},{75,117,76},{102,150,72},{102,133,1},{103,124,5},{102,122,13},{168,0,243},{88,132,72},{91,124,1},{69,118,72},{255,43,243}, +{69,118,72},{96,144,72},{96,144,72},{96,144,72},{96,120,72},{90,141,50},{90,123,1},{90,123,1},{90,110,5},{74,123,50},{79,112,1},{102,132,0},{102,132,0},{102,132,0},{102,117,0},{159,0,50},{93,121,0},{93,121,0},{81,112,0},{254,35,50},{81,112,0},{175,0,72},{101,135,0},{106,124,0},{87,124,0},{175,0,72},{254,51,72},{87,124,0},{0,118,72},{254,51,72},{0,118,72},{96,0,72}, +{96,0,72},{96,0,72},{96,0,72},{90,126,0},{90,126,0},{90,126,0},{90,108,0},{79,113,0},{79,113,0},{104,170,144},{104,146,76},{106,133,106},{104,130,77},{98,167,243},{98,139,73},{98,131,2},{96,125,103},{77,142,243},{83,125,76},{110,158,72},{110,142,0},{111,132,5},{110,130,13},{180,0,243},{96,140,72},{99,132,1},{76,126,72},{255,55,243},{76,126,72},{104,152,72},{104,152,72},{104,152,72}, +{104,128,72},{98,149,50},{98,131,1},{98,131,1},{98,118,5},{83,130,50},{87,120,1},{110,140,0},{110,140,0},{110,140,0},{110,125,0},{171,0,50},{101,129,0},{101,129,0},{89,120,0},{255,46,50},{89,120,0},{187,0,72},{110,142,0},{114,132,0},{94,132,0},{187,0,72},{254,63,72},{94,132,0},{0,126,72},{254,63,72},{0,126,72},{104,0,72},{104,0,72},{104,0,72},{104,0,72},{98,134,0}, +{98,134,0},{98,134,0},{98,116,0},{87,121,0},{87,121,0},{112,178,144},{112,154,76},{114,140,105},{112,138,77},{106,175,243},{106,147,73},{106,139,2},{104,133,103},{85,150,243},{91,133,76},{118,166,72},{118,149,1},{119,140,5},{118,138,13},{192,0,243},{104,148,72},{107,140,1},{84,134,72},{255,67,243},{84,134,72},{112,160,72},{112,160,72},{112,160,72},{112,136,72},{106,157,50},{106,139,1},{106,139,1}, +{106,126,5},{91,138,50},{95,128,1},{118,147,0},{118,147,0},{118,147,0},{118,133,0},{183,0,50},{109,137,0},{109,137,0},{97,128,0},{255,58,50},{97,128,0},{199,0,72},{117,151,0},{122,140,0},{102,140,0},{199,0,72},{254,75,72},{102,140,0},{0,134,72},{254,75,72},{0,134,72},{112,0,72},{112,0,72},{112,0,72},{112,0,72},{106,142,0},{106,142,0},{106,142,0},{106,124,0},{95,129,0}, +{95,129,0},{121,187,144},{121,163,76},{122,151,103},{121,148,77},{115,184,243},{115,156,73},{115,148,2},{112,141,105},{94,159,243},{100,142,76},{127,175,72},{127,158,1},{128,149,5},{127,147,13},{205,0,243},{113,157,72},{116,149,1},{93,143,72},{254,81,243},{93,143,72},{121,169,72},{121,169,72},{121,169,72},{121,145,72},{115,166,50},{115,148,1},{115,148,1},{115,135,5},{100,147,50},{104,137,1},{127,156,0}, +{127,156,0},{127,156,0},{127,142,0},{196,0,50},{117,146,0},{117,146,0},{106,137,0},{254,72,50},{106,137,0},{213,0,72},{125,160,0},{131,149,0},{111,149,0},{213,0,72},{254,88,72},{111,149,0},{0,143,72},{254,88,72},{0,143,72},{121,0,72},{121,0,72},{121,0,72},{121,0,72},{115,151,0},{115,151,0},{115,151,0},{115,133,0},{104,138,0},{104,138,0},{129,195,144},{129,170,76},{130,159,103}, +{129,156,77},{123,192,243},{123,164,73},{123,156,2},{122,149,106},{102,167,243},{108,150,76},{135,182,72},{135,166,1},{136,157,5},{134,155,14},{217,0,243},{121,165,72},{124,157,1},{101,151,72},{255,92,243},{101,151,72},{129,177,72},{129,177,72},{129,177,72},{129,152,72},{123,174,50},{123,155,1},{123,155,1},{123,143,5},{108,155,50},{113,145,0},{135,164,0},{135,164,0},{135,164,0},{135,150,0},{208,0,50}, +{125,154,0},{125,154,0},{113,145,0},{254,84,50},{113,145,0},{224,0,72},{133,168,0},{139,157,0},{119,157,0},{224,0,72},{254,100,72},{119,157,0},{0,151,72},{254,100,72},{0,151,72},{129,0,72},{129,0,72},{129,0,72},{129,0,72},{123,158,0},{123,158,0},{123,158,0},{123,141,0},{113,145,0},{113,145,0},{137,203,144},{137,178,76},{138,167,103},{137,164,77},{131,200,243},{130,173,74},{131,164,2}, +{130,157,106},{110,175,243},{116,158,76},{143,190,72},{143,174,1},{144,165,5},{142,163,14},{229,0,243},{129,173,72},{132,165,1},{109,159,72},{255,104,243},{109,159,72},{137,184,72},{137,184,72},{137,184,72},{137,160,72},{131,182,50},{131,163,1},{131,163,1},{131,152,5},{116,163,50},{120,153,1},{143,172,0},{143,172,0},{143,172,0},{143,157,0},{220,0,50},{133,162,0},{133,162,0},{121,153,0},{255,95,50}, +{121,153,0},{236,0,72},{141,176,0},{147,165,0},{127,165,0},{236,0,72},{254,112,72},{127,165,0},{0,159,72},{254,112,72},{0,159,72},{137,0,72},{137,0,72},{137,0,72},{137,0,72},{131,166,0},{131,166,0},{131,166,0},{131,149,0},{120,154,0},{120,154,0},{145,211,144},{145,186,76},{146,175,103},{145,172,77},{139,208,243},{138,181,74},{139,172,2},{138,165,106},{118,183,243},{124,166,76},{151,198,72}, +{151,182,1},{152,173,5},{150,171,14},{241,0,243},{135,182,72},{140,173,1},{117,167,72},{255,116,243},{117,167,72},{145,192,72},{145,192,72},{145,192,72},{145,168,72},{139,189,50},{139,171,1},{139,171,1},{139,160,5},{124,171,50},{128,161,1},{151,180,0},{151,180,0},{151,180,0},{151,165,0},{232,0,50},{141,170,0},{141,170,0},{129,161,0},{255,107,50},{129,161,0},{248,0,72},{149,184,0},{155,173,0}, +{135,173,0},{248,0,72},{254,124,72},{135,173,0},{0,167,72},{254,124,72},{0,167,72},{145,0,72},{145,0,72},{145,0,72},{145,0,72},{139,174,0},{139,174,0},{139,174,0},{139,156,0},{127,162,0},{127,162,0},{154,219,144},{154,195,76},{155,184,103},{154,181,77},{148,217,243},{147,190,74},{148,181,2},{147,174,106},{126,192,243},{133,175,76},{160,207,72},{160,191,1},{161,182,5},{159,180,14},{254,0,243}, +{144,191,72},{149,182,1},{126,176,72},{255,129,243},{126,176,72},{154,201,72},{154,201,72},{154,201,72},{154,177,72},{148,198,50},{148,180,1},{148,180,1},{148,169,5},{132,181,50},{137,170,1},{160,189,0},{160,189,0},{160,189,0},{160,174,0},{245,0,50},{150,179,0},{150,179,0},{138,170,0},{254,121,50},{138,170,0},{255,13,72},{158,193,0},{164,182,0},{144,182,0},{255,13,72},{254,137,72},{144,182,0}, +{0,176,72},{254,137,72},{0,176,72},{154,0,72},{154,0,72},{154,0,72},{154,0,72},{148,183,0},{148,183,0},{148,183,0},{148,165,0},{136,171,0},{136,171,0},{162,227,144},{162,203,76},{163,192,103},{162,189,77},{156,224,243},{155,198,74},{156,189,2},{155,182,106},{134,200,243},{141,183,76},{168,215,72},{168,199,1},{169,190,5},{167,188,14},{255,22,243},{152,199,72},{157,190,1},{134,184,72},{255,141,243}, +{134,184,72},{162,209,72},{162,209,72},{162,209,72},{162,185,72},{156,206,50},{156,188,1},{156,188,1},{156,177,5},{139,189,50},{145,178,1},{168,197,0},{168,197,0},{168,197,0},{168,182,0},{255,4,50},{158,187,0},{158,187,0},{146,178,0},{255,132,50},{146,178,0},{255,37,72},{166,201,0},{172,190,0},{152,190,0},{255,37,72},{254,149,72},{152,190,0},{0,184,72},{254,149,72},{0,184,72},{162,0,72}, +{162,0,72},{162,0,72},{162,0,72},{156,191,0},{156,191,0},{156,191,0},{156,173,0},{144,179,0},{144,179,0},{170,235,144},{170,211,76},{171,200,103},{170,197,77},{164,232,243},{163,206,74},{164,197,2},{163,190,106},{142,208,243},{149,191,76},{176,223,72},{176,207,1},{177,198,5},{175,196,14},{255,46,243},{160,207,72},{165,198,1},{142,192,72},{255,153,243},{142,192,72},{170,217,72},{170,217,72},{170,217,72}, +{170,193,72},{164,214,50},{164,196,1},{164,196,1},{164,185,5},{147,197,50},{153,186,1},{176,205,0},{176,205,0},{176,205,0},{176,190,0},{255,28,50},{166,195,0},{166,195,0},{154,186,0},{255,144,50},{154,186,0},{255,61,72},{174,209,0},{180,198,0},{160,198,0},{255,61,72},{254,161,72},{160,198,0},{0,192,72},{254,161,72},{0,192,72},{170,0,72},{170,0,72},{170,0,72},{170,0,72},{164,199,0}, +{164,199,0},{164,199,0},{164,181,0},{152,187,0},{152,187,0},{178,243,144},{178,219,76},{179,208,103},{178,205,77},{172,240,243},{171,214,74},{172,205,2},{171,198,106},{150,216,243},{157,199,76},{184,231,72},{184,215,1},{185,206,5},{183,204,14},{255,70,243},{169,214,72},{173,206,1},{150,200,72},{255,165,243},{150,200,72},{178,225,72},{178,225,72},{178,225,72},{178,201,72},{172,222,50},{172,204,1},{172,204,1}, +{172,193,5},{155,205,50},{161,194,1},{184,213,0},{184,213,0},{184,213,0},{184,198,0},{255,52,50},{174,203,0},{174,203,0},{162,194,0},{255,156,50},{162,194,0},{255,86,72},{182,217,0},{188,206,0},{168,206,0},{255,86,72},{255,172,72},{168,206,0},{0,200,72},{255,172,72},{0,200,72},{178,0,72},{178,0,72},{178,0,72},{178,0,72},{172,207,0},{172,207,0},{172,207,0},{172,189,0},{160,195,0}, +{160,195,0},{187,252,144},{187,228,76},{188,217,103},{187,214,77},{181,249,243},{180,222,74},{181,214,2},{180,207,106},{159,225,243},{166,208,76},{193,240,72},{193,224,1},{194,216,3},{192,213,14},{255,98,243},{178,223,72},{182,215,1},{158,209,72},{255,178,243},{158,209,72},{187,234,72},{187,234,72},{187,234,72},{187,210,72},{181,231,50},{181,213,1},{181,213,1},{181,202,5},{165,213,50},{170,203,1},{193,222,0}, +{193,222,0},{193,222,0},{193,207,0},{255,79,50},{183,212,0},{183,212,0},{171,203,0},{253,170,50},{171,203,0},{255,113,72},{192,225,0},{196,215,0},{177,215,0},{255,113,72},{254,186,72},{177,215,0},{0,209,72},{254,186,72},{0,209,72},{187,0,72},{187,0,72},{187,0,72},{187,0,72},{181,216,0},{181,216,0},{181,216,0},{181,198,0},{169,204,0},{169,204,0},{196,255,148},{195,236,76},{196,225,103}, +{195,222,77},{189,254,244},{188,230,74},{189,222,2},{188,215,106},{167,233,243},{173,217,77},{201,248,72},{201,231,1},{202,224,3},{200,221,14},{255,122,243},{186,231,72},{189,222,2},{166,217,72},{255,190,243},{166,217,72},{195,242,72},{195,242,72},{195,242,72},{195,218,72},{189,239,50},{189,221,1},{189,221,1},{189,210,5},{173,221,50},{178,211,1},{201,229,0},{201,229,0},{201,229,0},{201,215,0},{255,104,50}, +{191,220,0},{191,220,0},{179,211,0},{255,181,50},{179,211,0},{255,137,72},{200,233,0},{204,223,0},{184,223,0},{255,137,72},{254,198,72},{184,223,0},{0,217,72},{254,198,72},{0,217,72},{195,0,72},{195,0,72},{195,0,72},{195,0,72},{189,224,0},{189,224,0},{189,224,0},{189,206,0},{177,212,0},{177,212,0},{205,255,170},{203,244,76},{204,232,100},{202,230,79},{199,255,255},{196,238,74},{197,231,2}, +{196,223,106},{175,241,243},{181,225,77},{210,254,73},{209,239,1},{210,232,3},{208,229,14},{255,146,243},{194,239,72},{198,230,2},{174,225,72},{255,202,243},{174,225,72},{203,250,72},{203,250,72},{203,250,72},{203,226,72},{197,247,50},{197,229,1},{197,229,1},{197,218,5},{181,229,50},{186,219,1},{209,237,0},{209,237,0},{209,237,0},{209,223,0},{255,128,50},{199,228,0},{199,228,0},{187,219,0},{255,193,50}, +{187,219,0},{255,161,72},{208,241,0},{212,231,0},{192,231,0},{255,161,72},{254,210,72},{192,231,0},{0,225,72},{254,210,72},{0,225,72},{203,0,72},{203,0,72},{203,0,72},{203,0,72},{197,232,0},{197,232,0},{197,232,0},{197,214,0},{185,220,0},{185,220,0},{215,255,208},{212,252,75},{212,240,100},{210,238,79},{211,255,287},{204,246,74},{205,239,1},{203,231,109},{183,249,243},{189,233,77},{218,255,81}, +{217,247,1},{218,240,3},{215,237,17},{255,171,243},{202,247,72},{205,239,1},{182,233,72},{254,214,243},{182,233,72},{211,255,73},{211,255,73},{211,255,73},{211,234,72},{205,255,50},{205,237,1},{205,237,1},{205,226,5},{189,237,50},{194,227,0},{217,245,0},{217,245,0},{217,245,0},{217,231,0},{255,152,50},{208,235,0},{208,235,0},{194,227,0},{255,205,50},{194,227,0},{255,186,72},{216,249,0},{220,239,0}, +{200,239,0},{255,186,72},{255,221,72},{200,239,0},{0,233,72},{255,221,72},{0,233,72},{211,0,72},{211,0,72},{211,0,72},{211,0,72},{205,239,0},{205,239,0},{205,239,0},{205,222,0},{194,227,0},{194,227,0},{224,255,274},{222,255,98},{221,249,100},{219,247,79},{221,255,332},{213,255,74},{214,248,1},{212,240,109},{195,255,245},{198,242,77},{230,255,106},{226,255,4},{227,249,3},{224,246,17},{255,198,243}, +{213,255,73},{214,248,1},{191,242,72},{255,227,243},{191,242,72},{221,255,83},{221,255,83},{221,255,83},{220,243,72},{215,255,59},{214,246,1},{214,246,1},{213,234,6},{198,246,50},{203,236,0},{226,254,0},{226,254,0},{226,254,0},{226,240,0},{255,180,50},{217,244,0},{217,244,0},{203,236,0},{255,218,50},{203,236,0},{255,213,72},{228,255,2},{229,248,0},{209,248,0},{255,213,72},{254,235,72},{209,248,0}, +{0,242,72},{254,235,72},{0,242,72},{220,0,72},{220,0,72},{220,0,72},{220,0,72},{214,248,0},{214,248,0},{214,248,0},{214,231,0},{203,236,0},{203,236,0},{233,255,327},{231,255,164},{230,255,105},{228,253,77},{230,255,370},{225,255,95},{222,254,2},{220,248,94},{213,255,262},{208,249,65},{239,255,126},{237,255,35},{235,255,5},{234,253,13},{255,219,221},{228,255,82},{223,254,1},{201,249,61},{254,238,221}, +{201,249,61},{230,255,105},{230,255,105},{230,255,105},{228,251,72},{227,255,83},{222,254,1},{222,254,1},{221,243,6},{206,254,50},{211,244,0},{235,254,5},{235,254,5},{235,254,5},{234,248,0},{255,204,50},{225,252,0},{225,252,0},{211,244,0},{255,230,50},{211,244,0},{255,234,61},{240,255,17},{238,255,0},{219,255,0},{255,234,61},{255,245,61},{219,255,0},{0,249,61},{255,245,61},{0,249,61},{228,0,72}, +{228,0,72},{228,0,72},{228,0,72},{222,253,1},{222,253,1},{222,253,1},{222,239,0},{211,244,0},{211,244,0},{242,255,233},{239,255,164},{239,255,139},{237,255,78},{239,255,239},{234,255,62},{232,255,24},{230,252,18},{225,255,158},{218,253,5},{248,255,53},{245,255,27},{245,255,18},{242,255,1},{255,237,93},{240,255,26},{237,255,5},{217,253,5},{254,247,93},{217,253,5},{239,255,139},{239,255,139},{239,255,139}, +{237,255,78},{236,255,118},{232,255,24},{232,255,24},{229,251,6},{222,255,67},{219,252,0},{245,255,18},{245,255,18},{245,255,18},{242,254,1},{255,228,50},{237,255,5},{237,255,5},{219,252,0},{255,242,50},{219,252,0},{255,246,5},{251,254,1},{250,255,0},{243,255,0},{255,246,5},{255,251,5},{243,255,0},{0,253,5},{255,251,5},{0,253,5},{236,0,72},{236,0,72},{236,0,72},{236,0,72},{232,254,8}, +{232,254,8},{232,254,8},{230,247,0},{219,252,0},{219,252,0},{248,255,136},{245,255,119},{245,255,110},{244,255,81},{245,255,122},{243,255,52},{241,255,41},{238,255,0},{237,255,75},{231,255,5},{251,255,9},{251,255,6},{251,255,5},{250,255,1},{255,246,17},{249,255,3},{249,255,2},{237,255,0},{255,251,17},{237,255,0},{245,255,110},{245,255,110},{245,255,110},{244,255,81},{245,255,86},{241,255,41},{241,255,41}, +{238,255,0},{234,255,46},{231,255,5},{251,255,5},{251,255,5},{251,255,5},{250,255,1},{255,243,13},{249,255,2},{249,255,2},{237,255,0},{254,250,13},{237,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{244,0,72},{244,0,72},{244,0,72},{244,0,72},{241,254,25},{241,254,25},{241,254,25},{238,255,0},{231,255,5}, +{231,255,5},{0,58,200},{0,42,17},{0,29,0},{0,25,65},{0,40,441},{0,27,266},{0,23,121},{0,16,318},{0,18,467},{0,16,343},{0,58,200},{0,42,17},{0,29,0},{0,25,65},{20,0,441},{0,27,266},{0,23,121},{0,16,318},{40,0,441},{0,16,318},{0,28,0},{0,28,0},{0,28,0},{0,14,0},{0,13,41},{0,12,10},{0,12,10},{0,7,20},{0,6,42},{0,7,24},{0,28,0}, +{0,28,0},{0,28,0},{0,14,0},{6,0,41},{0,12,10},{0,12,10},{0,7,20},{13,0,41},{0,7,20},{29,0,200},{0,42,17},{0,29,0},{0,25,65},{29,0,200},{58,0,200},{0,25,65},{0,19,200},{58,0,200},{0,19,200},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,82,200},{0,54,1},{1,38,19}, +{0,34,34},{0,55,686},{0,36,339},{0,30,139},{0,22,446},{0,24,747},{0,22,495},{0,82,200},{0,54,1},{2,39,17},{0,34,34},{27,0,686},{0,36,339},{0,30,139},{0,22,446},{55,0,686},{0,22,446},{0,52,0},{0,52,0},{0,52,0},{0,26,0},{0,25,145},{0,21,45},{0,21,45},{0,13,80},{0,12,154},{0,10,94},{0,52,0},{0,52,0},{0,52,0},{0,26,0},{12,0,145}, +{0,21,45},{0,21,45},{0,13,80},{25,0,145},{0,13,80},{41,0,200},{0,54,1},{8,37,0},{0,34,34},{41,0,200},{82,0,200},{0,34,34},{0,27,200},{82,0,200},{0,27,200},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,99,225},{4,65,26},{6,46,74},{3,43,45},{0,79,723},{0,48,282},{0,42,54}, +{0,31,401},{0,36,852},{0,29,497},{7,92,200},{7,64,0},{9,46,21},{5,42,29},{39,0,723},{0,48,282},{0,42,54},{0,31,401},{79,0,723},{0,31,401},{4,68,25},{4,68,25},{4,68,25},{3,36,25},{0,49,162},{0,36,17},{0,36,17},{0,22,58},{0,21,206},{0,19,97},{7,62,0},{7,62,0},{7,62,0},{7,34,0},{24,0,162},{0,36,17},{0,36,17},{0,22,58},{49,0,162}, +{0,22,58},{52,0,200},{6,64,0},{16,45,0},{0,44,17},{52,0,200},{107,0,200},{0,44,17},{0,35,200},{107,0,200},{0,35,200},{3,0,25},{3,0,25},{3,0,25},{3,0,25},{0,22,0},{0,22,0},{0,22,0},{0,11,0},{0,9,5},{0,9,5},{8,115,313},{8,78,121},{10,56,198},{7,51,126},{0,104,723},{0,63,227},{0,51,6},{0,40,339},{0,48,956},{0,38,494},{15,100,200}, +{15,72,0},{17,54,21},{15,49,32},{51,0,723},{0,63,227},{0,51,6},{0,40,339},{104,0,723},{0,40,339},{8,84,113},{8,84,113},{8,84,113},{7,46,113},{0,73,162},{0,48,1},{0,48,1},{0,31,29},{0,33,270},{0,27,109},{15,70,0},{15,70,0},{15,70,0},{15,42,0},{36,0,162},{0,48,1},{0,48,1},{0,31,29},{73,0,162},{0,31,29},{64,0,200},{14,72,0},{24,53,0}, +{0,53,4},{64,0,200},{131,0,200},{0,53,4},{0,43,200},{131,0,200},{0,43,200},{7,0,113},{7,0,113},{7,0,113},{7,0,113},{0,46,0},{0,46,0},{0,46,0},{0,23,0},{0,18,34},{0,18,34},{14,130,400},{15,88,215},{17,66,315},{13,60,210},{4,123,723},{3,75,207},{4,62,2},{2,49,303},{0,60,969},{0,48,417},{24,109,200},{24,81,0},{26,63,21},{23,58,33},{64,0,723}, +{0,78,201},{6,62,1},{0,50,289},{131,0,723},{0,50,289},{14,99,200},{14,99,200},{14,99,200},{14,56,200},{4,92,162},{5,60,2},{5,60,2},{3,40,14},{0,45,280},{0,39,77},{24,79,0},{24,79,0},{24,79,0},{24,51,0},{49,0,162},{7,59,0},{7,59,0},{0,40,8},{101,0,162},{0,40,8},{78,0,200},{23,81,0},{32,62,0},{1,62,0},{78,0,200},{158,0,200},{1,62,0}, +{0,52,200},{158,0,200},{0,52,200},{14,0,200},{14,0,200},{14,0,200},{14,0,200},{4,65,0},{4,65,0},{4,65,0},{4,34,0},{0,33,40},{0,33,40},{22,138,400},{23,96,215},{25,74,315},{21,68,210},{12,131,723},{11,83,207},{12,70,2},{10,57,303},{0,72,865},{0,57,290},{32,117,200},{32,89,0},{34,71,21},{31,66,33},{76,0,723},{5,87,200},{14,70,1},{0,59,251},{155,0,723}, +{0,59,251},{22,107,200},{22,107,200},{22,107,200},{22,64,200},{12,100,162},{13,68,2},{13,68,2},{10,47,17},{0,60,213},{0,48,13},{32,87,0},{32,87,0},{32,87,0},{32,59,0},{61,0,162},{15,67,0},{15,67,0},{0,50,1},{125,0,162},{0,50,1},{89,0,200},{31,89,0},{40,70,0},{9,70,0},{89,0,200},{183,0,200},{9,70,0},{0,60,200},{183,0,200},{0,60,200},{22,0,200}, +{22,0,200},{22,0,200},{22,0,200},{12,73,0},{12,73,0},{12,73,0},{12,42,0},{0,45,8},{0,45,8},{30,145,400},{31,104,215},{33,82,315},{29,76,210},{20,139,723},{19,91,207},{20,78,2},{18,65,303},{0,88,787},{0,66,225},{40,125,200},{40,97,0},{43,79,19},{39,74,33},{88,0,723},{14,94,200},{22,78,1},{0,66,224},{180,0,723},{0,66,224},{30,115,200},{30,115,200},{30,115,200}, +{30,72,200},{20,108,162},{21,76,2},{21,76,2},{18,56,17},{0,72,173},{2,58,1},{40,95,0},{40,95,0},{40,95,0},{40,67,0},{73,0,162},{23,75,0},{23,75,0},{3,58,0},{149,0,162},{3,58,0},{101,0,200},{39,97,0},{48,78,0},{17,78,0},{101,0,200},{207,0,200},{17,78,0},{0,68,200},{207,0,200},{0,68,200},{30,0,200},{30,0,200},{30,0,200},{30,0,200},{20,81,0}, +{20,81,0},{20,81,0},{20,50,0},{1,59,0},{1,59,0},{38,153,400},{39,112,215},{41,90,315},{37,84,210},{28,147,723},{27,99,207},{28,86,2},{26,73,303},{0,100,739},{4,75,212},{48,133,200},{48,105,0},{51,87,19},{47,82,33},{100,0,723},{22,102,200},{30,86,1},{0,75,206},{204,0,723},{0,75,206},{38,123,200},{38,123,200},{38,123,200},{38,80,200},{28,116,162},{29,84,2},{29,84,2}, +{26,64,17},{0,85,162},{10,66,1},{48,103,0},{48,103,0},{48,103,0},{48,75,0},{85,0,162},{31,83,0},{31,83,0},{11,66,0},{174,0,162},{11,66,0},{113,0,200},{47,105,0},{56,86,0},{25,86,0},{113,0,200},{231,0,200},{25,86,0},{0,76,200},{231,0,200},{0,76,200},{38,0,200},{38,0,200},{38,0,200},{38,0,200},{28,89,0},{28,89,0},{28,89,0},{28,58,0},{9,67,0}, +{9,67,0},{47,162,400},{48,121,215},{50,98,308},{46,93,210},{37,155,723},{36,107,207},{37,95,2},{35,82,303},{0,113,723},{13,84,212},{57,142,200},{57,112,1},{60,96,19},{56,91,33},{113,0,723},{31,111,200},{39,95,1},{0,85,200},{231,0,723},{0,85,200},{47,132,200},{47,132,200},{47,132,200},{47,89,200},{37,125,162},{38,93,2},{38,93,2},{35,73,17},{10,93,162},{19,75,1},{57,111,0}, +{57,111,0},{57,111,0},{57,84,0},{98,0,162},{40,92,0},{40,92,0},{20,75,0},{201,0,162},{20,75,0},{127,0,200},{56,114,0},{65,95,0},{34,95,0},{127,0,200},{254,2,200},{34,95,0},{0,85,200},{254,2,200},{0,85,200},{47,0,200},{47,0,200},{47,0,200},{47,0,200},{37,98,0},{37,98,0},{37,98,0},{37,67,0},{18,76,0},{18,76,0},{55,170,400},{56,129,215},{58,106,308}, +{54,101,210},{45,163,723},{44,115,207},{45,103,2},{43,90,303},{8,121,723},{21,92,212},{65,150,200},{65,121,0},{68,104,19},{64,99,33},{125,0,723},{39,119,200},{47,103,1},{7,93,200},{255,0,723},{7,93,200},{55,140,200},{55,140,200},{55,140,200},{55,97,200},{45,133,162},{46,101,2},{46,101,2},{43,81,17},{18,101,162},{27,83,1},{65,119,0},{65,119,0},{65,119,0},{65,92,0},{110,0,162}, +{48,100,0},{48,100,0},{28,83,0},{225,0,162},{28,83,0},{138,0,200},{65,121,0},{73,103,0},{42,103,0},{138,0,200},{254,14,200},{42,103,0},{0,93,200},{254,14,200},{0,93,200},{55,0,200},{55,0,200},{55,0,200},{55,0,200},{45,106,0},{45,106,0},{45,106,0},{45,75,0},{26,84,0},{26,84,0},{63,178,400},{64,137,215},{66,114,308},{62,109,210},{53,171,723},{52,123,207},{53,111,2}, +{51,98,303},{16,129,723},{27,100,215},{73,158,200},{73,129,0},{76,112,19},{72,107,33},{137,0,723},{47,127,200},{55,111,1},{15,101,200},{255,12,723},{15,101,200},{63,148,200},{63,148,200},{63,148,200},{63,105,200},{53,141,162},{54,109,2},{54,109,2},{51,89,17},{26,109,162},{35,91,1},{73,127,0},{73,127,0},{73,127,0},{73,100,0},{122,0,162},{56,108,0},{56,108,0},{36,91,0},{249,0,162}, +{36,91,0},{150,0,200},{73,129,0},{81,111,0},{49,111,0},{150,0,200},{254,26,200},{49,111,0},{0,101,200},{254,26,200},{0,101,200},{63,0,200},{63,0,200},{63,0,200},{63,0,200},{53,114,0},{53,114,0},{53,114,0},{53,83,0},{34,92,0},{34,92,0},{71,186,400},{72,144,212},{74,122,308},{70,117,210},{61,179,723},{60,131,207},{61,118,2},{59,106,303},{24,137,723},{35,108,215},{81,166,200}, +{81,137,0},{84,120,19},{80,115,33},{149,0,723},{55,135,200},{62,119,1},{23,109,200},{255,24,723},{23,109,200},{71,156,200},{71,156,200},{71,156,200},{71,113,200},{61,149,162},{61,118,1},{61,118,1},{59,97,17},{34,117,162},{43,99,1},{81,135,0},{81,135,0},{81,135,0},{81,108,0},{134,0,162},{64,116,0},{64,116,0},{44,99,0},{255,9,162},{44,99,0},{162,0,200},{81,137,0},{89,119,0}, +{57,119,0},{162,0,200},{254,38,200},{57,119,0},{0,109,200},{254,38,200},{0,109,200},{71,0,200},{71,0,200},{71,0,200},{71,0,200},{61,121,0},{61,121,0},{61,121,0},{61,91,0},{42,100,0},{42,100,0},{80,195,400},{81,153,212},{83,131,308},{79,127,212},{70,188,723},{69,140,207},{70,127,2},{68,115,303},{34,145,723},{44,117,215},{90,174,200},{90,146,0},{93,129,19},{89,124,33},{162,0,723}, +{64,144,200},{71,128,1},{32,118,200},{254,38,723},{32,118,200},{80,165,200},{80,165,200},{80,165,200},{80,122,200},{70,158,162},{70,127,1},{70,127,1},{68,106,17},{43,126,162},{52,108,1},{90,144,0},{90,144,0},{90,144,0},{90,117,0},{147,0,162},{74,124,0},{74,124,0},{53,108,0},{254,23,162},{53,108,0},{175,0,200},{90,146,0},{98,128,0},{66,128,0},{175,0,200},{254,51,200},{66,128,0}, +{0,118,200},{254,51,200},{0,118,200},{80,0,200},{80,0,200},{80,0,200},{80,0,200},{70,130,0},{70,130,0},{70,130,0},{70,100,0},{51,109,0},{51,109,0},{88,203,400},{89,161,212},{91,139,308},{87,135,212},{78,196,723},{77,148,207},{78,135,2},{75,122,305},{42,153,723},{52,125,215},{98,182,200},{98,154,0},{101,137,19},{97,132,33},{174,0,723},{72,152,200},{79,136,1},{40,126,200},{255,49,723}, +{40,126,200},{88,172,200},{88,172,200},{88,172,200},{88,129,200},{78,166,162},{78,135,1},{78,135,1},{76,114,17},{51,134,162},{60,116,0},{98,152,0},{98,152,0},{98,152,0},{98,125,0},{159,0,162},{82,132,0},{82,132,0},{60,116,0},{254,35,162},{60,116,0},{187,0,200},{98,154,0},{106,136,0},{74,136,0},{187,0,200},{254,63,200},{74,136,0},{0,126,200},{254,63,200},{0,126,200},{88,0,200}, +{88,0,200},{88,0,200},{88,0,200},{78,138,0},{78,138,0},{78,138,0},{78,108,0},{60,116,0},{60,116,0},{96,211,400},{97,169,212},{99,147,308},{95,143,212},{86,204,723},{85,156,207},{86,143,2},{83,131,308},{50,161,723},{60,133,215},{106,190,200},{106,162,0},{109,145,19},{105,141,35},{186,0,723},{80,160,200},{87,144,1},{48,134,200},{255,61,723},{48,134,200},{96,180,200},{96,180,200},{96,180,200}, +{96,137,200},{86,174,162},{86,143,1},{86,143,1},{84,122,17},{59,142,162},{68,124,0},{106,160,0},{106,160,0},{106,160,0},{106,133,0},{171,0,162},{90,140,0},{90,140,0},{68,124,0},{255,46,162},{68,124,0},{199,0,200},{106,162,0},{114,144,0},{82,144,0},{199,0,200},{254,75,200},{82,144,0},{0,134,200},{254,75,200},{0,134,200},{96,0,200},{96,0,200},{96,0,200},{96,0,200},{86,146,0}, +{86,146,0},{86,146,0},{86,116,0},{68,124,0},{68,124,0},{104,219,400},{105,177,212},{107,155,308},{103,151,212},{94,212,723},{93,164,207},{94,151,2},{91,139,308},{58,169,723},{68,141,215},{114,198,200},{114,170,0},{117,153,19},{113,149,35},{198,0,723},{88,168,200},{95,152,1},{56,142,200},{255,73,723},{56,142,200},{104,188,200},{104,188,200},{104,188,200},{104,145,200},{94,181,162},{94,151,1},{94,151,1}, +{92,130,17},{67,150,162},{76,132,0},{114,168,0},{114,168,0},{114,168,0},{114,141,0},{183,0,162},{98,148,0},{98,148,0},{76,132,0},{255,58,162},{76,132,0},{211,0,200},{114,170,0},{122,152,0},{90,152,0},{211,0,200},{255,86,200},{90,152,0},{0,142,200},{255,86,200},{0,142,200},{104,0,200},{104,0,200},{104,0,200},{104,0,200},{94,154,0},{94,154,0},{94,154,0},{94,124,0},{76,132,0}, +{76,132,0},{113,228,400},{114,186,215},{116,164,308},{112,160,212},{103,221,723},{102,173,207},{103,160,2},{100,148,308},{67,178,723},{78,150,212},{123,207,200},{123,179,0},{125,163,17},{122,158,35},{211,0,723},{96,177,200},{104,161,1},{65,151,200},{255,86,723},{65,151,200},{113,197,200},{113,197,200},{113,197,200},{113,154,200},{103,190,162},{103,160,1},{103,160,1},{102,138,19},{76,159,162},{85,141,0},{123,177,0}, +{123,177,0},{123,177,0},{123,149,0},{196,0,162},{107,157,0},{107,157,0},{85,141,0},{254,72,162},{85,141,0},{224,0,200},{123,179,0},{131,161,0},{99,161,0},{224,0,200},{254,100,200},{99,161,0},{0,151,200},{254,100,200},{0,151,200},{113,0,200},{113,0,200},{113,0,200},{113,0,200},{103,163,0},{103,163,0},{103,163,0},{103,133,0},{85,141,0},{85,141,0},{121,235,400},{122,194,215},{124,172,308}, +{120,168,212},{111,229,723},{110,181,207},{111,168,2},{108,156,308},{75,186,723},{86,158,212},{131,215,200},{131,187,0},{133,171,17},{130,166,35},{223,0,723},{104,185,200},{112,169,1},{73,159,200},{255,98,723},{73,159,200},{121,205,200},{121,205,200},{121,205,200},{121,162,200},{111,198,162},{111,168,1},{111,168,1},{110,146,19},{84,167,162},{93,149,0},{131,185,0},{131,185,0},{131,185,0},{131,157,0},{208,0,162}, +{115,165,0},{115,165,0},{93,149,0},{254,84,162},{93,149,0},{236,0,200},{131,187,0},{139,169,0},{107,169,0},{236,0,200},{254,112,200},{107,169,0},{0,159,200},{254,112,200},{0,159,200},{121,0,200},{121,0,200},{121,0,200},{121,0,200},{111,171,0},{111,171,0},{111,171,0},{111,141,0},{93,149,0},{93,149,0},{129,243,400},{130,202,215},{133,180,305},{128,176,212},{119,236,723},{118,189,207},{119,176,2}, +{116,164,308},{83,194,723},{94,166,212},{139,223,200},{139,195,0},{141,179,17},{138,174,35},{235,0,723},{112,193,200},{120,177,1},{81,167,200},{255,110,723},{81,167,200},{129,213,200},{129,213,200},{129,213,200},{129,170,200},{119,206,162},{119,176,1},{119,176,1},{118,154,19},{91,175,162},{101,157,0},{139,192,0},{139,192,0},{139,192,0},{139,165,0},{220,0,162},{123,173,0},{123,173,0},{101,157,0},{255,95,162}, +{101,157,0},{248,0,200},{139,195,0},{147,177,0},{115,177,0},{248,0,200},{254,124,200},{115,177,0},{0,167,200},{254,124,200},{0,167,200},{129,0,200},{129,0,200},{129,0,200},{129,0,200},{119,179,0},{119,179,0},{119,179,0},{119,148,0},{101,157,0},{101,157,0},{137,251,400},{138,210,215},{140,187,303},{136,184,212},{127,244,723},{126,197,207},{127,184,2},{124,172,308},{91,202,723},{102,174,212},{147,231,200}, +{147,202,1},{149,187,17},{146,182,35},{247,0,723},{120,201,200},{128,185,1},{88,175,200},{255,122,723},{88,175,200},{137,221,200},{137,221,200},{137,221,200},{137,178,200},{127,214,162},{127,184,1},{127,184,1},{126,162,19},{99,183,162},{109,165,0},{147,200,0},{147,200,0},{147,200,0},{147,173,0},{232,0,162},{131,181,0},{131,181,0},{109,165,0},{255,107,162},{109,165,0},{255,10,200},{146,203,0},{155,185,0}, +{123,185,0},{255,10,200},{255,135,200},{123,185,0},{0,175,200},{255,135,200},{0,175,200},{137,0,200},{137,0,200},{137,0,200},{137,0,200},{127,187,0},{127,187,0},{127,187,0},{127,156,0},{109,165,0},{109,165,0},{147,255,404},{147,219,215},{149,196,303},{145,193,212},{136,253,723},{135,206,207},{136,193,2},{133,181,308},{100,211,723},{111,183,212},{156,240,200},{156,210,1},{158,196,17},{155,191,35},{255,10,723}, +{129,210,200},{137,194,1},{97,184,200},{255,135,723},{97,184,200},{146,230,200},{146,230,200},{146,230,200},{146,187,200},{136,223,162},{136,193,1},{136,193,1},{135,171,19},{108,192,162},{118,174,0},{156,209,0},{156,209,0},{156,209,0},{156,182,0},{245,0,162},{139,191,0},{139,191,0},{118,174,0},{254,121,162},{118,174,0},{255,37,200},{155,212,0},{164,194,0},{131,194,0},{255,37,200},{254,149,200},{131,194,0}, +{0,184,200},{254,149,200},{0,184,200},{146,0,200},{146,0,200},{146,0,200},{146,0,200},{136,196,0},{136,196,0},{136,196,0},{136,165,0},{118,174,0},{118,174,0},{156,255,426},{155,227,215},{157,204,303},{153,201,212},{146,254,728},{143,214,207},{144,202,2},{141,189,308},{108,219,723},{118,191,215},{164,248,200},{164,218,1},{166,204,17},{163,199,35},{255,34,723},{137,218,200},{145,201,2},{105,192,200},{255,147,723}, +{105,192,200},{154,238,200},{154,238,200},{154,238,200},{154,195,200},{144,231,162},{144,200,1},{144,200,1},{143,179,19},{116,200,162},{126,182,0},{164,217,0},{164,217,0},{164,217,0},{164,190,0},{255,4,162},{146,199,0},{146,199,0},{126,182,0},{255,132,162},{126,182,0},{255,61,200},{163,220,0},{172,202,0},{139,202,0},{255,61,200},{254,161,200},{139,202,0},{0,192,200},{254,161,200},{0,192,200},{154,0,200}, +{154,0,200},{154,0,200},{154,0,200},{144,204,0},{144,204,0},{144,204,0},{144,173,0},{126,182,0},{126,182,0},{165,255,468},{163,234,212},{165,212,303},{162,207,213},{156,255,747},{151,222,207},{152,210,2},{149,197,308},{115,228,723},{126,199,215},{172,255,200},{172,226,1},{174,212,17},{171,207,35},{255,58,723},{145,226,200},{153,209,2},{113,200,200},{255,159,723},{113,200,200},{162,246,200},{162,246,200},{162,246,200}, +{162,203,200},{152,239,162},{152,208,1},{152,208,1},{151,187,19},{124,208,162},{134,190,0},{172,225,0},{172,225,0},{172,225,0},{172,198,0},{255,28,162},{155,206,0},{155,206,0},{134,190,0},{255,144,162},{134,190,0},{255,86,200},{171,228,0},{180,210,0},{147,210,0},{255,86,200},{255,172,200},{147,210,0},{0,200,200},{255,172,200},{0,200,200},{162,0,200},{162,0,200},{162,0,200},{162,0,200},{152,211,0}, +{152,211,0},{152,211,0},{152,181,0},{134,190,0},{134,190,0},{175,255,522},{171,242,212},{173,220,303},{170,216,213},{165,255,788},{158,232,208},{160,218,2},{157,205,308},{123,235,723},{134,207,215},{181,255,209},{180,234,1},{182,220,17},{179,215,35},{255,82,723},{153,234,200},{161,217,2},{121,208,200},{254,171,723},{121,208,200},{170,253,200},{170,253,200},{170,253,200},{170,211,200},{160,247,162},{160,216,1},{160,216,1}, +{159,195,19},{132,216,162},{141,198,1},{180,233,0},{180,233,0},{180,233,0},{180,206,0},{255,52,162},{163,214,0},{163,214,0},{142,198,0},{255,156,162},{142,198,0},{255,110,200},{179,236,0},{188,218,0},{155,218,0},{255,110,200},{255,184,200},{155,218,0},{0,208,200},{255,184,200},{0,208,200},{170,0,200},{170,0,200},{170,0,200},{170,0,200},{160,219,0},{160,219,0},{160,219,0},{160,189,0},{141,199,0}, +{141,199,0},{184,255,612},{180,251,212},{182,229,303},{179,225,213},{178,255,844},{167,239,210},{169,227,2},{165,214,315},{132,244,723},{143,216,215},{193,255,234},{189,243,1},{191,229,17},{187,224,38},{255,110,723},{162,243,200},{170,226,2},{130,217,200},{255,184,723},{130,217,200},{180,254,206},{180,254,206},{180,254,206},{179,220,200},{170,253,163},{169,225,1},{169,225,1},{168,204,19},{141,225,162},{150,207,0},{189,242,0}, +{189,242,0},{189,242,0},{189,215,0},{255,79,162},{172,223,0},{172,223,0},{150,207,0},{253,170,162},{150,207,0},{255,137,200},{188,245,0},{197,227,0},{164,227,0},{255,137,200},{254,198,200},{164,227,0},{0,217,200},{254,198,200},{0,217,200},{179,0,200},{179,0,200},{179,0,200},{179,0,200},{169,228,0},{169,228,0},{169,228,0},{169,198,0},{150,207,0},{150,207,0},{193,255,714},{189,255,225},{190,237,303}, +{187,233,213},{187,255,919},{175,247,210},{177,235,2},{173,222,315},{140,252,723},{151,224,215},{202,255,275},{197,251,1},{199,237,17},{195,232,38},{255,134,723},{170,251,200},{178,234,2},{138,225,200},{255,196,723},{138,225,200},{189,254,224},{189,254,224},{189,254,224},{187,228,200},{178,255,171},{177,233,1},{177,233,1},{176,212,19},{149,233,162},{158,215,0},{197,250,0},{197,250,0},{197,250,0},{197,223,0},{255,104,162}, +{180,231,0},{180,231,0},{158,215,0},{255,181,162},{158,215,0},{255,161,200},{196,253,0},{204,235,0},{172,235,0},{255,161,200},{254,210,200},{172,235,0},{0,225,200},{254,210,200},{0,225,200},{187,0,200},{187,0,200},{187,0,200},{187,0,200},{177,236,0},{177,236,0},{177,236,0},{177,206,0},{158,215,0},{158,215,0},{202,255,836},{198,255,290},{198,245,303},{195,241,213},{199,255,1015},{183,255,210},{185,243,2}, +{181,230,315},{152,255,732},{159,232,215},{214,254,331},{207,255,13},{207,245,17},{203,240,38},{255,158,723},{183,255,206},{186,242,2},{146,233,200},{255,208,723},{146,233,200},{196,255,251},{196,255,251},{196,255,251},{195,236,200},{190,255,195},{185,241,1},{185,241,1},{184,221,21},{157,241,162},{166,223,0},{205,255,1},{205,255,1},{205,255,1},{205,231,0},{255,128,162},{188,239,0},{188,239,0},{166,223,0},{255,193,162}, +{166,223,0},{255,186,200},{210,255,8},{212,243,0},{180,243,0},{255,186,200},{255,221,200},{180,243,0},{0,233,200},{255,221,200},{0,233,200},{195,0,200},{195,0,200},{195,0,200},{195,0,200},{185,244,0},{185,244,0},{185,244,0},{185,214,0},{166,223,0},{166,223,0},{215,255,976},{207,255,417},{206,253,303},{203,249,213},{208,255,1124},{195,255,258},{193,251,2},{189,238,315},{167,255,797},{166,240,215},{221,255,392}, +{216,255,77},{215,252,14},{211,248,38},{255,183,723},{198,255,248},{194,250,2},{154,241,200},{254,220,723},{154,241,200},{205,255,289},{205,255,289},{205,255,289},{203,244,200},{199,255,230},{193,249,1},{193,249,1},{192,229,21},{165,249,162},{174,231,0},{215,255,8},{215,255,8},{215,255,8},{213,239,0},{255,152,162},{196,247,0},{196,247,0},{174,231,0},{255,205,162},{174,231,0},{255,210,200},{222,255,40},{220,251,0}, +{188,251,0},{255,210,200},{255,233,200},{188,251,0},{0,241,200},{255,233,200},{0,241,200},{203,0,200},{203,0,200},{203,0,200},{203,0,200},{193,252,0},{193,252,0},{193,252,0},{193,222,0},{174,231,0},{174,231,0},{221,255,895},{217,255,494},{215,255,339},{212,255,201},{218,255,994},{207,255,251},{204,255,6},{199,245,198},{189,255,702},{176,247,121},{233,255,318},{228,255,109},{224,255,29},{222,253,13},{255,204,546}, +{213,255,198},{205,255,1},{169,247,113},{255,230,546},{169,247,113},{215,255,339},{215,255,339},{215,255,339},{212,253,200},{211,255,293},{204,255,6},{204,255,6},{201,238,21},{177,255,165},{183,240,0},{224,255,29},{224,255,29},{224,255,29},{222,248,0},{255,180,162},{206,254,1},{206,254,1},{183,240,0},{255,218,162},{183,240,0},{255,228,113},{237,255,34},{232,255,0},{207,255,0},{255,228,113},{255,242,113},{207,255,0}, +{0,247,113},{255,242,113},{0,247,113},{212,0,200},{212,0,200},{212,0,200},{212,0,200},{202,255,4},{202,255,4},{202,255,4},{202,231,0},{183,240,0},{183,240,0},{230,255,737},{226,255,497},{224,255,401},{220,255,216},{227,255,783},{216,255,206},{213,255,54},{209,249,74},{201,255,534},{189,251,26},{239,255,190},{235,255,97},{233,255,58},{230,255,1},{255,219,333},{225,255,110},{219,255,17},{185,251,25},{254,238,333}, +{185,251,25},{224,255,401},{224,255,401},{224,255,401},{220,255,216},{218,255,354},{213,255,54},{213,255,54},{209,246,21},{192,255,203},{191,248,0},{233,255,58},{233,255,58},{233,255,58},{230,254,1},{255,204,162},{219,255,17},{219,255,17},{191,248,0},{255,230,162},{191,248,0},{255,240,25},{246,255,5},{244,255,0},{231,255,0},{255,240,25},{255,248,25},{231,255,0},{0,251,25},{255,248,25},{0,251,25},{220,0,200}, +{220,0,200},{220,0,200},{220,0,200},{211,255,17},{211,255,17},{211,255,17},{210,239,0},{191,248,0},{191,248,0},{236,255,616},{233,255,495},{233,255,446},{228,255,264},{233,255,626},{225,255,220},{225,255,139},{217,254,19},{216,255,434},{199,255,1},{245,255,121},{244,255,94},{242,255,80},{240,255,20},{255,234,193},{237,255,75},{234,255,45},{201,255,0},{255,245,193},{201,255,0},{233,255,446},{233,255,446},{233,255,446}, +{228,255,264},{230,255,401},{225,255,139},{225,255,139},{216,253,17},{207,255,254},{199,255,1},{242,255,80},{242,255,80},{242,255,80},{240,255,20},{255,225,145},{234,255,45},{234,255,45},{201,255,0},{254,241,145},{201,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{228,0,200},{228,0,200},{228,0,200},{228,0,200},{221,255,34}, +{221,255,34},{221,255,34},{218,247,0},{200,254,1},{200,254,1},{242,255,400},{239,255,343},{239,255,318},{237,255,227},{239,255,370},{234,255,161},{232,255,121},{226,255,0},{225,255,243},{213,255,17},{251,255,33},{248,255,24},{248,255,20},{246,255,4},{255,243,54},{246,255,17},{243,255,10},{225,255,0},{254,250,54},{225,255,0},{239,255,318},{239,255,318},{239,255,318},{237,255,227},{236,255,253},{232,255,121},{232,255,121}, +{226,255,0},{219,255,150},{213,255,17},{248,255,20},{248,255,20},{248,255,20},{246,255,4},{255,237,41},{243,255,10},{243,255,10},{225,255,0},{254,247,41},{225,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{236,0,200},{236,0,200},{236,0,200},{236,0,200},{230,255,65},{230,255,65},{230,255,65},{226,255,0},{213,255,17}, +{213,255,17},{0,82,421},{0,60,40},{0,42,0},{0,34,145},{0,55,925},{0,36,566},{0,33,262},{0,22,677},{0,27,989},{0,22,726},{0,82,421},{0,60,40},{0,42,0},{0,34,145},{27,0,925},{0,36,566},{0,33,262},{0,22,677},{55,0,925},{0,22,677},{0,40,0},{0,40,0},{0,40,0},{0,20,0},{0,19,85},{0,15,25},{0,15,25},{0,10,45},{0,9,89},{0,8,54},{0,40,0}, +{0,40,0},{0,40,0},{0,20,0},{9,0,85},{0,15,25},{0,15,25},{0,10,45},{19,0,85},{0,10,45},{41,0,421},{0,60,40},{0,42,0},{0,34,145},{41,0,421},{82,0,421},{0,34,145},{0,27,421},{82,0,421},{0,27,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,107,421},{0,72,8},{1,50,18}, +{0,44,100},{0,73,1261},{0,48,670},{0,42,282},{0,28,857},{0,33,1369},{0,28,938},{0,107,421},{0,72,8},{2,51,14},{0,44,100},{36,0,1261},{0,48,670},{0,42,282},{0,28,857},{73,0,1261},{0,28,857},{0,64,0},{0,64,0},{0,64,0},{0,32,0},{0,31,221},{0,27,73},{0,27,73},{0,16,125},{0,15,237},{0,13,144},{0,64,0},{0,64,0},{0,64,0},{0,32,0},{15,0,221}, +{0,27,73},{0,27,73},{0,16,125},{31,0,221},{0,16,125},{52,0,421},{0,72,8},{7,50,0},{0,44,100},{52,0,421},{107,0,421},{0,44,100},{0,35,421},{107,0,421},{0,35,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,127,426},{1,86,5},{4,59,67},{0,53,70},{0,92,1514},{0,60,701},{0,51,243}, +{0,37,946},{0,42,1695},{0,34,1083},{3,125,421},{3,84,1},{7,59,42},{1,54,69},{45,0,1514},{0,60,701},{0,51,243},{0,37,946},{92,0,1514},{0,37,946},{2,84,5},{2,84,5},{2,84,5},{1,43,5},{0,49,338},{0,36,89},{0,36,89},{0,22,170},{0,21,382},{0,19,217},{3,82,0},{3,82,0},{3,82,0},{3,42,0},{24,0,338},{0,36,89},{0,36,89},{0,22,170},{49,0,338}, +{0,22,170},{64,0,421},{1,86,0},{15,58,0},{0,53,61},{64,0,421},{131,0,421},{0,53,61},{0,43,421},{131,0,421},{0,43,421},{1,0,5},{1,0,5},{1,0,5},{1,0,5},{0,10,0},{0,10,0},{0,10,0},{0,5,0},{0,3,1},{0,3,1},{6,143,482},{6,97,63},{8,69,163},{4,63,110},{0,116,1514},{0,72,589},{0,60,109},{0,44,857},{0,54,1815},{0,44,1053},{11,133,421}, +{11,91,1},{15,67,42},{9,62,69},{57,0,1514},{0,72,589},{0,60,109},{0,44,857},{116,0,1514},{0,44,857},{6,101,61},{6,101,61},{6,101,61},{6,52,61},{0,73,338},{0,51,34},{0,51,34},{0,31,117},{0,33,446},{0,29,209},{11,90,0},{11,90,0},{11,90,0},{11,50,0},{36,0,338},{0,51,34},{0,51,34},{0,31,117},{73,0,338},{0,31,117},{76,0,421},{10,93,0},{23,66,0}, +{0,62,32},{76,0,421},{155,0,421},{0,62,32},{0,51,421},{155,0,421},{0,51,421},{5,0,61},{5,0,61},{5,0,61},{5,0,61},{0,34,0},{0,34,0},{0,34,0},{0,17,0},{0,15,17},{0,15,17},{10,162,621},{11,109,215},{14,78,362},{9,71,234},{0,143,1514},{0,88,489},{0,72,22},{0,56,750},{0,66,1982},{0,53,1047},{20,142,421},{20,100,1},{24,76,42},{18,71,69},{70,0,1514}, +{0,88,489},{0,72,22},{0,56,750},{143,0,1514},{0,56,750},{10,120,200},{10,120,200},{10,120,200},{10,64,200},{0,101,338},{0,69,4},{0,69,4},{0,40,72},{0,45,552},{0,39,229},{20,99,0},{20,99,0},{20,99,0},{20,59,0},{49,0,338},{0,69,4},{0,69,4},{0,40,72},{101,0,338},{0,40,72},{89,0,421},{19,102,0},{32,75,0},{0,74,10},{89,0,421},{183,0,421},{0,74,10}, +{0,60,421},{183,0,421},{0,60,421},{10,0,200},{10,0,200},{10,0,200},{10,0,200},{0,61,0},{0,61,0},{0,61,0},{0,30,0},{0,24,65},{0,24,65},{14,178,813},{15,119,423},{18,88,618},{13,81,414},{0,167,1514},{0,100,441},{0,83,2},{0,65,670},{0,75,2165},{0,60,1070},{28,150,421},{28,108,1},{32,84,42},{26,79,69},{82,0,1514},{0,100,441},{2,82,2},{0,65,670},{167,0,1514}, +{0,65,670},{14,136,392},{14,136,392},{14,136,392},{14,74,392},{0,125,338},{1,80,2},{1,80,2},{0,50,41},{0,54,677},{0,48,277},{28,107,0},{28,107,0},{28,107,0},{28,67,0},{61,0,338},{3,79,0},{3,79,0},{0,50,41},{125,0,338},{0,50,41},{101,0,421},{27,110,0},{40,83,0},{0,83,1},{101,0,421},{207,0,421},{0,83,1},{0,68,421},{207,0,421},{0,68,421},{14,0,392}, +{14,0,392},{14,0,392},{14,0,392},{0,85,0},{0,85,0},{0,85,0},{0,42,0},{0,33,136},{0,33,136},{22,186,842},{22,128,450},{26,96,655},{21,89,441},{7,177,1514},{5,111,434},{8,90,4},{4,72,639},{0,88,2003},{0,69,858},{36,157,421},{36,116,1},{40,92,42},{34,87,69},{94,0,1514},{0,113,422},{8,90,3},{0,71,602},{192,0,1514},{0,71,602},{22,144,421},{22,144,421},{22,144,421}, +{21,82,421},{7,135,338},{8,90,3},{8,90,3},{6,59,35},{0,69,581},{0,57,150},{36,115,0},{36,115,0},{36,115,0},{36,75,0},{73,0,338},{11,87,0},{11,87,0},{0,59,18},{149,0,338},{0,59,18},{113,0,421},{35,118,0},{48,91,0},{2,91,0},{113,0,421},{231,0,421},{2,91,0},{0,76,421},{231,0,421},{0,76,421},{21,0,421},{21,0,421},{21,0,421},{21,0,421},{7,95,0}, +{7,95,0},{7,95,0},{7,50,0},{0,48,80},{0,48,80},{30,194,842},{30,136,450},{34,104,655},{29,97,441},{15,185,1514},{13,119,434},{16,98,4},{12,80,639},{0,103,1850},{0,80,663},{44,165,421},{44,124,1},{48,100,42},{42,95,69},{106,0,1514},{6,122,421},{16,98,3},{0,80,542},{216,0,1514},{0,80,542},{30,152,421},{30,152,421},{30,152,421},{29,90,421},{15,143,338},{16,98,3},{16,98,3}, +{14,67,35},{0,81,477},{0,66,52},{44,123,0},{44,123,0},{44,123,0},{44,83,0},{85,0,338},{19,95,0},{19,95,0},{0,68,5},{174,0,338},{0,68,5},{125,0,421},{43,126,0},{56,99,0},{10,99,0},{125,0,421},{255,0,421},{10,99,0},{0,84,421},{255,0,421},{0,84,421},{29,0,421},{29,0,421},{29,0,421},{29,0,421},{15,103,0},{15,103,0},{15,103,0},{15,58,0},{0,63,29}, +{0,63,29},{39,203,842},{39,145,450},{43,113,655},{37,106,445},{24,194,1514},{22,126,438},{25,107,4},{21,89,639},{0,115,1710},{0,90,519},{53,174,421},{53,133,1},{56,110,38},{51,104,69},{119,0,1514},{15,131,421},{25,107,3},{0,90,494},{243,0,1514},{0,90,494},{39,160,421},{39,160,421},{39,160,421},{38,99,421},{24,152,338},{25,107,3},{25,107,3},{23,76,35},{0,97,389},{0,78,3},{53,132,0}, +{53,132,0},{53,132,0},{53,92,0},{98,0,338},{29,103,0},{29,103,0},{0,79,0},{201,0,338},{0,79,0},{138,0,421},{52,135,0},{65,108,0},{19,108,0},{138,0,421},{254,14,421},{19,108,0},{0,93,421},{254,14,421},{0,93,421},{38,0,421},{38,0,421},{38,0,421},{38,0,421},{24,112,0},{24,112,0},{24,112,0},{24,67,0},{0,78,2},{0,78,2},{47,211,842},{47,153,450},{51,121,655}, +{45,114,445},{32,202,1514},{30,134,438},{33,115,4},{29,97,639},{0,129,1617},{0,99,458},{61,182,421},{61,141,1},{64,118,38},{59,112,69},{131,0,1514},{23,139,421},{33,115,3},{0,99,458},{255,6,1514},{0,99,458},{47,168,421},{47,168,421},{47,168,421},{46,107,421},{32,160,338},{33,115,3},{33,115,3},{31,84,35},{0,109,349},{5,87,1},{61,140,0},{61,140,0},{61,140,0},{61,100,0},{110,0,338}, +{37,111,0},{37,111,0},{8,87,0},{225,0,338},{8,87,0},{150,0,421},{60,143,0},{73,116,0},{27,116,0},{150,0,421},{254,26,421},{27,116,0},{0,101,421},{254,26,421},{0,101,421},{46,0,421},{46,0,421},{46,0,421},{46,0,421},{32,120,0},{32,120,0},{32,120,0},{32,75,0},{5,88,0},{5,88,0},{55,219,842},{55,161,450},{59,129,655},{53,122,445},{40,210,1514},{38,142,438},{41,123,4}, +{36,105,646},{0,141,1553},{3,108,450},{69,190,421},{69,149,1},{72,126,38},{68,118,73},{143,0,1514},{32,146,421},{41,123,3},{0,108,434},{255,18,1514},{0,108,434},{55,176,421},{55,176,421},{55,176,421},{55,114,421},{40,168,338},{41,123,3},{41,123,3},{39,92,35},{0,122,338},{13,95,1},{69,148,0},{69,148,0},{69,148,0},{69,108,0},{122,0,338},{45,119,0},{45,119,0},{15,95,0},{249,0,338}, +{15,95,0},{162,0,421},{68,151,0},{81,124,0},{35,124,0},{162,0,421},{254,38,421},{35,124,0},{0,109,421},{254,38,421},{0,109,421},{54,0,421},{54,0,421},{54,0,421},{54,0,421},{40,128,0},{40,128,0},{40,128,0},{40,83,0},{13,96,0},{13,96,0},{63,227,842},{63,169,450},{68,134,654},{61,130,445},{48,218,1514},{46,151,434},{49,131,4},{44,113,646},{0,153,1521},{11,116,450},{77,198,421}, +{77,157,1},{80,134,38},{74,128,74},{155,0,1514},{40,154,421},{49,131,3},{0,117,422},{255,30,1514},{0,117,422},{63,184,421},{63,184,421},{63,184,421},{63,122,421},{48,175,338},{49,131,3},{49,131,3},{47,100,35},{8,130,338},{21,103,1},{77,156,0},{77,156,0},{77,156,0},{77,116,0},{134,0,338},{53,127,0},{53,127,0},{23,103,0},{255,9,338},{23,103,0},{174,0,421},{76,159,0},{89,132,0}, +{43,132,0},{174,0,421},{255,49,421},{43,132,0},{0,117,421},{255,49,421},{0,117,421},{62,0,421},{62,0,421},{62,0,421},{62,0,421},{48,136,0},{48,136,0},{48,136,0},{48,91,0},{21,104,0},{21,104,0},{72,236,842},{72,178,450},{76,145,646},{70,139,445},{57,227,1514},{55,160,434},{58,140,4},{53,122,646},{4,166,1514},{20,125,450},{86,207,421},{86,166,1},{89,143,38},{83,137,74},{168,0,1514}, +{49,163,421},{58,140,3},{4,126,421},{255,43,1514},{4,126,421},{72,193,421},{72,193,421},{72,193,421},{72,131,421},{57,184,338},{58,140,3},{58,140,3},{56,109,35},{18,138,338},{30,112,1},{86,164,0},{86,164,0},{86,164,0},{86,125,0},{147,0,338},{62,136,0},{62,136,0},{32,112,0},{254,23,338},{32,112,0},{187,0,421},{85,168,0},{98,141,0},{52,141,0},{187,0,421},{254,63,421},{52,141,0}, +{0,126,421},{254,63,421},{0,126,421},{71,0,421},{71,0,421},{71,0,421},{71,0,421},{57,145,0},{57,145,0},{57,145,0},{57,100,0},{30,113,0},{30,113,0},{80,243,842},{80,186,450},{84,153,646},{78,147,445},{65,235,1514},{63,168,434},{66,148,4},{61,130,646},{12,174,1514},{27,133,450},{94,215,421},{94,174,1},{97,151,38},{91,145,74},{180,0,1514},{57,171,421},{66,148,3},{11,134,421},{255,55,1514}, +{11,134,421},{80,201,421},{80,201,421},{80,201,421},{80,139,421},{65,192,338},{66,148,3},{66,148,3},{63,116,36},{26,146,338},{38,120,1},{94,172,0},{94,172,0},{94,172,0},{94,132,0},{159,0,338},{70,144,0},{70,144,0},{40,120,0},{254,35,338},{40,120,0},{199,0,421},{92,176,0},{106,149,0},{60,149,0},{199,0,421},{254,75,421},{60,149,0},{0,134,421},{254,75,421},{0,134,421},{79,0,421}, +{79,0,421},{79,0,421},{79,0,421},{65,153,0},{65,153,0},{65,153,0},{65,108,0},{38,121,0},{38,121,0},{88,251,842},{88,194,450},{92,161,646},{86,155,445},{73,243,1514},{71,176,434},{74,156,4},{69,138,646},{21,181,1514},{35,141,450},{102,223,421},{102,182,1},{105,159,38},{99,153,74},{192,0,1514},{65,179,421},{74,156,3},{19,142,421},{255,67,1514},{19,142,421},{88,209,421},{88,209,421},{88,209,421}, +{88,147,421},{73,200,338},{74,156,3},{74,156,3},{71,125,38},{34,154,338},{46,128,1},{102,180,0},{102,180,0},{102,180,0},{102,140,0},{171,0,338},{78,152,0},{78,152,0},{48,128,0},{255,46,338},{48,128,0},{211,0,421},{100,184,0},{114,157,0},{68,157,0},{211,0,421},{255,86,421},{68,157,0},{0,142,421},{255,86,421},{0,142,421},{87,0,421},{87,0,421},{87,0,421},{87,0,421},{73,161,0}, +{73,161,0},{73,161,0},{73,116,0},{46,129,0},{46,129,0},{97,254,850},{96,202,450},{100,169,646},{94,163,445},{81,251,1514},{79,184,434},{82,164,4},{77,146,646},{29,189,1514},{43,149,450},{110,231,421},{110,190,1},{113,167,38},{107,161,74},{204,0,1514},{73,187,421},{83,164,2},{27,150,421},{255,79,1514},{27,150,421},{96,217,421},{96,217,421},{96,217,421},{96,155,421},{81,208,338},{82,163,2},{82,163,2}, +{79,133,38},{42,162,338},{54,136,1},{110,188,0},{110,188,0},{110,188,0},{110,148,0},{183,0,338},{86,160,0},{86,160,0},{56,136,0},{255,58,338},{56,136,0},{223,0,421},{108,192,0},{122,165,0},{76,165,0},{223,0,421},{255,98,421},{76,165,0},{0,150,421},{255,98,421},{0,150,421},{95,0,421},{95,0,421},{95,0,421},{95,0,421},{81,169,0},{81,169,0},{81,169,0},{81,124,0},{54,137,0}, +{54,137,0},{107,255,878},{105,211,450},{109,178,646},{103,172,445},{91,254,1518},{88,193,434},{91,173,4},{86,155,646},{38,198,1514},{52,158,450},{119,240,421},{119,199,1},{122,176,38},{116,170,74},{217,0,1514},{82,196,421},{92,173,2},{36,159,421},{255,92,1514},{36,159,421},{105,226,421},{105,226,421},{105,226,421},{105,164,421},{90,217,338},{91,172,2},{91,172,2},{88,142,38},{51,171,338},{63,145,1},{119,197,0}, +{119,197,0},{119,197,0},{119,157,0},{196,0,338},{95,169,0},{95,169,0},{65,145,0},{254,72,338},{65,145,0},{236,0,421},{117,201,0},{130,174,0},{84,174,0},{236,0,421},{254,112,421},{84,174,0},{0,159,421},{254,112,421},{0,159,421},{104,0,421},{104,0,421},{104,0,421},{104,0,421},{90,177,0},{90,177,0},{90,177,0},{90,133,0},{63,146,0},{63,146,0},{116,255,926},{113,218,450},{117,186,646}, +{111,180,445},{101,255,1535},{96,201,434},{99,181,4},{94,163,646},{46,206,1514},{60,166,450},{127,247,421},{127,207,1},{130,184,38},{124,178,74},{229,0,1514},{90,204,421},{99,181,3},{44,167,421},{255,104,1514},{44,167,421},{113,234,421},{113,234,421},{113,234,421},{113,172,421},{98,225,338},{99,180,3},{99,180,3},{96,150,38},{59,179,338},{71,153,1},{127,205,0},{127,205,0},{127,205,0},{127,165,0},{208,0,338}, +{103,177,0},{103,177,0},{73,153,0},{254,84,338},{73,153,0},{248,0,421},{125,209,0},{138,182,0},{92,182,0},{248,0,421},{254,124,421},{92,182,0},{0,167,421},{254,124,421},{0,167,421},{112,0,421},{112,0,421},{112,0,421},{112,0,421},{98,185,0},{98,185,0},{98,185,0},{98,141,0},{71,154,0},{71,154,0},{125,255,994},{121,226,450},{125,194,646},{120,186,446},{113,255,1575},{104,209,434},{107,189,4}, +{102,171,646},{54,214,1514},{68,174,450},{135,255,421},{135,215,1},{139,192,36},{132,186,74},{241,0,1514},{98,212,421},{107,189,3},{52,175,421},{255,116,1514},{52,175,421},{121,241,421},{121,241,421},{121,241,421},{121,180,421},{106,233,338},{107,188,3},{107,188,3},{104,158,38},{67,187,338},{79,161,1},{135,213,0},{135,213,0},{135,213,0},{135,173,0},{220,0,338},{110,185,0},{110,185,0},{81,161,0},{255,95,338}, +{81,161,0},{255,10,421},{133,217,0},{146,190,0},{100,190,0},{255,10,421},{255,135,421},{100,190,0},{0,175,421},{255,135,421},{0,175,421},{120,0,421},{120,0,421},{120,0,421},{120,0,421},{106,193,0},{106,193,0},{106,193,0},{106,149,0},{79,162,0},{79,162,0},{135,255,1070},{129,234,450},{133,202,646},{128,195,446},{122,255,1626},{112,216,438},{115,197,4},{110,179,646},{62,222,1514},{76,182,450},{146,254,434}, +{143,223,1},{146,199,35},{140,194,74},{253,0,1514},{106,220,421},{115,197,3},{60,183,421},{254,128,1514},{60,183,421},{129,249,421},{129,249,421},{129,249,421},{129,188,421},{114,241,338},{115,196,3},{115,196,3},{112,166,38},{75,195,338},{87,169,1},{143,221,0},{143,221,0},{143,221,0},{143,181,0},{232,0,338},{118,193,0},{118,193,0},{89,169,0},{255,107,338},{89,169,0},{255,34,421},{141,225,0},{154,198,0}, +{108,198,0},{255,34,421},{255,147,421},{108,198,0},{0,183,421},{255,147,421},{0,183,421},{128,0,421},{128,0,421},{128,0,421},{128,0,421},{114,201,0},{114,201,0},{114,201,0},{114,157,0},{87,170,0},{87,170,0},{144,255,1190},{138,243,450},{142,211,646},{137,204,446},{132,255,1703},{121,225,438},{124,206,4},{121,187,654},{71,231,1514},{85,191,450},{156,255,461},{152,232,1},{155,208,35},{151,202,75},{255,22,1514}, +{114,229,421},{124,206,3},{69,192,421},{255,141,1514},{69,192,421},{138,255,422},{138,255,422},{138,255,422},{137,197,421},{123,250,338},{124,205,3},{124,205,3},{121,175,38},{84,204,338},{96,178,1},{152,230,0},{152,230,0},{152,230,0},{152,190,0},{245,0,338},{127,202,0},{127,202,0},{97,178,0},{254,121,338},{97,178,0},{255,61,421},{150,234,0},{163,207,0},{117,207,0},{255,61,421},{254,161,421},{117,207,0}, +{0,192,421},{254,161,421},{0,192,421},{137,0,421},{137,0,421},{137,0,421},{137,0,421},{123,210,0},{123,210,0},{123,210,0},{123,166,0},{95,179,0},{95,179,0},{153,255,1318},{146,251,450},{150,219,646},{145,212,446},{144,255,1791},{129,233,438},{132,214,4},{126,196,655},{78,240,1514},{93,199,450},{165,255,506},{160,240,1},{163,216,35},{158,210,78},{255,46,1514},{122,237,421},{132,214,3},{77,200,421},{255,153,1514}, +{77,200,421},{147,255,434},{147,255,434},{147,255,434},{145,205,421},{132,255,339},{132,213,3},{132,213,3},{129,183,38},{92,212,338},{104,186,1},{160,238,0},{160,238,0},{160,238,0},{160,198,0},{255,4,338},{135,210,0},{135,210,0},{105,186,0},{255,132,338},{105,186,0},{255,86,421},{158,242,0},{171,215,0},{125,215,0},{255,86,421},{255,172,421},{125,215,0},{0,200,421},{255,172,421},{0,200,421},{145,0,421}, +{145,0,421},{145,0,421},{145,0,421},{131,218,0},{131,218,0},{131,218,0},{131,174,0},{103,187,0},{103,187,0},{162,255,1466},{156,255,458},{158,226,639},{153,220,446},{153,255,1902},{137,240,438},{140,222,4},{134,204,655},{85,248,1514},{101,207,450},{175,255,554},{168,249,1},{171,224,35},{166,218,78},{255,70,1514},{130,245,421},{140,222,3},{85,208,421},{255,165,1514},{85,208,421},{156,255,458},{156,255,458},{156,255,458}, +{153,213,421},{141,255,350},{140,221,3},{140,221,3},{137,191,38},{99,220,338},{112,194,1},{168,245,0},{168,245,0},{168,245,0},{168,206,0},{255,28,338},{143,218,0},{143,218,0},{113,194,0},{255,144,338},{113,194,0},{255,110,421},{166,250,0},{179,223,0},{133,223,0},{255,110,421},{255,184,421},{133,223,0},{0,208,421},{255,184,421},{0,208,421},{153,0,421},{153,0,421},{153,0,421},{153,0,421},{139,226,0}, +{139,226,0},{139,226,0},{139,182,0},{111,195,0},{111,195,0},{172,255,1606},{165,255,519},{166,234,639},{161,228,446},{165,255,2030},{145,248,438},{148,230,4},{142,212,655},{95,255,1515},{109,215,450},{187,255,626},{177,255,3},{179,232,35},{174,226,78},{255,95,1514},{138,253,421},{148,230,3},{93,216,421},{254,177,1514},{93,216,421},{165,255,494},{165,255,494},{165,255,494},{161,221,421},{150,255,379},{148,229,3},{148,229,3}, +{145,199,38},{107,228,338},{120,202,1},{176,253,0},{176,253,0},{176,253,0},{176,214,0},{255,52,338},{151,226,0},{151,226,0},{121,202,0},{255,156,338},{121,202,0},{255,134,421},{177,255,2},{187,231,0},{141,231,0},{255,134,421},{255,196,421},{141,231,0},{0,216,421},{255,196,421},{0,216,421},{161,0,421},{161,0,421},{161,0,421},{161,0,421},{147,234,0},{147,234,0},{147,234,0},{147,190,0},{119,203,0}, +{119,203,0},{184,255,1818},{175,255,663},{175,243,639},{170,237,446},{175,255,2175},{155,255,443},{157,239,4},{151,221,655},{113,255,1557},{118,224,450},{196,255,722},{189,255,52},{188,241,35},{183,235,78},{255,122,1514},{155,255,442},{157,239,3},{101,225,421},{255,190,1514},{101,225,421},{175,255,542},{175,255,542},{175,255,542},{170,230,421},{162,255,424},{157,238,3},{157,238,3},{155,207,42},{116,237,338},{129,211,1},{186,254,5}, +{186,254,5},{186,254,5},{185,223,0},{255,79,338},{160,235,0},{160,235,0},{130,211,0},{253,170,338},{130,211,0},{255,161,421},{192,255,29},{196,240,0},{150,240,0},{255,161,421},{254,210,421},{150,240,0},{0,225,421},{254,210,421},{0,225,421},{170,0,421},{170,0,421},{170,0,421},{170,0,421},{156,243,0},{156,243,0},{156,243,0},{156,199,0},{128,212,0},{128,212,0},{193,255,2022},{184,255,858},{183,251,639}, +{178,245,446},{187,255,2343},{167,255,523},{165,247,4},{159,229,655},{131,255,1653},{126,232,450},{208,255,826},{198,255,150},{196,249,35},{191,243,78},{255,146,1514},{167,255,514},{165,247,3},{109,233,421},{255,202,1514},{109,233,421},{181,255,602},{181,255,602},{181,255,602},{178,238,421},{172,255,474},{165,246,3},{165,246,3},{163,215,42},{124,245,338},{137,219,1},{196,255,18},{196,255,18},{196,255,18},{193,231,0},{255,104,338}, +{168,243,0},{168,243,0},{138,219,0},{255,181,338},{138,219,0},{255,186,421},{207,255,80},{204,248,0},{158,248,0},{255,186,421},{255,221,421},{158,248,0},{0,233,421},{255,221,421},{0,233,421},{178,0,421},{178,0,421},{178,0,421},{178,0,421},{164,251,0},{164,251,0},{164,251,0},{164,207,0},{136,220,0},{136,220,0},{202,255,2175},{195,255,1070},{190,255,670},{186,253,441},{196,255,2443},{177,255,663},{172,255,2}, +{167,237,618},{146,255,1735},{135,240,423},{215,255,876},{207,255,277},{205,255,41},{199,251,69},{255,171,1459},{186,255,584},{174,254,2},{117,241,392},{254,214,1459},{117,241,392},{190,255,670},{190,255,670},{190,255,670},{186,246,421},{181,255,547},{173,253,2},{173,253,2},{171,223,42},{132,253,338},{145,227,1},{205,255,41},{205,255,41},{205,255,41},{201,239,0},{255,128,338},{176,251,0},{176,251,0},{146,227,0},{255,193,338}, +{146,227,0},{255,210,392},{222,255,136},{213,255,0},{167,255,0},{255,210,392},{255,233,392},{167,255,0},{0,241,392},{255,233,392},{0,241,392},{186,0,421},{186,0,421},{186,0,421},{186,0,421},{172,255,1},{172,255,1},{172,255,1},{172,214,0},{144,228,0},{144,228,0},{208,255,1867},{202,255,1047},{199,255,750},{194,255,421},{205,255,2052},{186,255,524},{183,255,22},{177,241,362},{161,255,1400},{145,244,215},{224,255,625}, +{216,255,229},{215,255,72},{207,253,17},{255,186,1064},{198,255,392},{186,255,4},{133,245,200},{255,221,1064},{133,245,200},{199,255,750},{199,255,750},{199,255,750},{194,254,421},{193,255,635},{183,255,22},{183,255,22},{179,231,42},{146,255,350},{153,235,1},{215,255,72},{215,255,72},{215,255,72},{209,247,0},{255,152,338},{186,255,4},{186,255,4},{154,235,0},{255,205,338},{154,235,0},{255,222,200},{231,255,65},{224,255,0}, +{192,255,0},{255,222,200},{255,239,200},{192,255,0},{0,245,200},{255,239,200},{0,245,200},{194,0,421},{194,0,421},{194,0,421},{194,0,421},{181,255,10},{181,255,10},{181,255,10},{180,222,0},{152,236,0},{152,236,0},{215,255,1586},{211,255,1053},{211,255,857},{204,255,446},{215,255,1698},{198,255,455},{195,255,109},{186,247,163},{177,255,1161},{158,249,63},{230,255,425},{226,255,209},{224,255,117},{218,255,1},{255,204,722}, +{210,255,254},{204,255,34},{152,249,61},{255,230,722},{152,249,61},{211,255,857},{211,255,857},{211,255,857},{204,255,446},{202,255,749},{195,255,109},{195,255,109},{188,240,42},{164,255,413},{162,244,1},{224,255,117},{224,255,117},{224,255,117},{218,254,1},{255,180,338},{204,255,34},{204,255,34},{163,244,0},{255,218,338},{163,244,0},{255,234,61},{240,255,17},{238,255,0},{219,255,0},{255,234,61},{255,245,61},{219,255,0}, +{0,249,61},{255,245,61},{0,249,61},{203,0,421},{203,0,421},{203,0,421},{203,0,421},{193,255,32},{193,255,32},{193,255,32},{189,231,0},{161,245,0},{161,245,0},{224,255,1422},{221,255,1083},{218,255,946},{213,255,525},{221,255,1470},{207,255,478},{204,255,243},{196,251,67},{189,255,1025},{169,253,5},{239,255,318},{235,255,217},{233,255,170},{228,255,29},{255,219,509},{222,255,198},{219,255,89},{169,253,5},{254,238,509}, +{169,253,5},{218,255,946},{218,255,946},{218,255,946},{213,255,525},{215,255,862},{204,255,243},{204,255,243},{196,248,42},{180,255,530},{169,252,1},{233,255,170},{233,255,170},{233,255,170},{228,255,29},{255,204,338},{219,255,89},{219,255,89},{171,252,0},{255,230,338},{171,252,0},{255,246,5},{251,254,1},{250,255,0},{243,255,0},{255,246,5},{255,251,5},{243,255,0},{0,253,5},{255,251,5},{0,253,5},{211,0,421}, +{211,0,421},{211,0,421},{211,0,421},{202,255,61},{202,255,61},{202,255,61},{197,239,0},{169,253,0},{169,253,0},{230,255,1153},{227,255,938},{227,255,857},{222,255,533},{227,255,1141},{216,255,434},{213,255,282},{204,253,18},{201,255,790},{183,255,8},{242,255,192},{242,255,144},{239,255,125},{237,255,34},{255,231,294},{234,255,121},{228,255,73},{189,255,0},{254,244,294},{189,255,0},{227,255,857},{227,255,857},{227,255,857}, +{222,255,533},{221,255,741},{213,255,282},{213,255,282},{204,253,14},{192,255,465},{183,255,8},{239,255,125},{239,255,125},{239,255,125},{237,255,34},{255,219,221},{228,255,73},{228,255,73},{189,255,0},{254,238,221},{189,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{219,0,421},{219,0,421},{219,0,421},{219,0,421},{211,255,100}, +{211,255,100},{211,255,100},{205,247,0},{183,255,8},{183,255,8},{236,255,853},{233,255,726},{233,255,677},{228,255,485},{233,255,793},{225,255,355},{222,255,262},{213,255,0},{213,255,534},{195,255,40},{248,255,68},{245,255,54},{245,255,45},{243,255,10},{255,240,113},{240,255,41},{240,255,25},{213,255,0},{255,248,113},{213,255,0},{233,255,677},{233,255,677},{233,255,677},{228,255,485},{227,255,545},{222,255,262},{222,255,262}, +{213,255,0},{204,255,329},{195,255,40},{245,255,45},{245,255,45},{245,255,45},{243,255,10},{255,231,85},{240,255,25},{240,255,25},{213,255,0},{254,244,85},{213,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{227,0,421},{227,0,421},{227,0,421},{227,0,421},{221,255,145},{221,255,145},{221,255,145},{213,255,0},{195,255,40}, +{195,255,40},{0,119,882},{0,84,97},{0,60,1},{0,50,325},{0,79,1896},{0,51,1188},{0,47,563},{0,31,1410},{0,36,2029},{0,31,1510},{0,119,882},{0,84,97},{0,60,1},{0,50,325},{39,0,1896},{0,51,1188},{0,47,563},{0,31,1410},{79,0,1896},{0,31,1410},{0,55,0},{0,55,0},{0,55,0},{0,27,0},{0,28,162},{0,21,52},{0,21,52},{0,13,89},{0,12,173},{0,13,105},{0,55,0}, +{0,55,0},{0,55,0},{0,27,0},{14,0,162},{0,21,52},{0,21,52},{0,13,89},{28,0,162},{0,13,89},{58,0,882},{0,84,97},{0,60,1},{0,50,325},{58,0,882},{119,0,882},{0,50,325},{0,39,882},{119,0,882},{0,39,882},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,143,882},{0,97,34},{1,68,11}, +{0,59,250},{0,95,2355},{0,63,1332},{0,54,585},{0,40,1656},{0,45,2556},{0,37,1802},{0,143,882},{0,97,34},{2,69,9},{0,59,250},{46,0,2355},{0,63,1332},{0,54,585},{0,40,1656},{95,0,2355},{0,40,1656},{0,79,0},{0,79,0},{0,79,0},{0,39,0},{0,40,338},{0,33,116},{0,33,116},{0,19,193},{0,18,365},{0,16,225},{0,79,0},{0,79,0},{0,79,0},{0,39,0},{20,0,338}, +{0,33,116},{0,33,116},{0,19,193},{40,0,338},{0,19,193},{70,0,882},{0,97,34},{6,68,0},{0,59,250},{70,0,882},{143,0,882},{0,59,250},{0,47,882},{143,0,882},{0,47,882},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,167,882},{0,112,5},{2,78,61},{0,68,185},{0,113,2899},{0,75,1508},{0,63,633}, +{0,44,1965},{0,51,3176},{0,44,2161},{0,167,882},{0,112,5},{4,77,53},{0,68,185},{55,0,2899},{0,75,1508},{0,63,633},{0,44,1965},{113,0,2899},{0,44,1965},{0,104,0},{0,104,0},{0,104,0},{0,51,0},{0,52,578},{0,42,205},{0,42,205},{0,25,337},{0,24,629},{0,22,389},{0,104,0},{0,104,0},{0,104,0},{0,51,0},{26,0,578},{0,42,205},{0,42,205},{0,25,337},{52,0,578}, +{0,25,337},{82,0,882},{0,112,5},{14,76,0},{0,68,185},{82,0,882},{167,0,882},{0,68,185},{0,55,882},{167,0,882},{0,55,882},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,186,900},{3,124,18},{6,88,133},{1,78,162},{0,134,3048},{0,88,1398},{0,72,469},{0,53,1923},{0,60,3457},{0,50,2205},{6,179,882}, +{6,121,2},{10,86,69},{3,77,158},{66,0,3048},{0,88,1398},{0,72,469},{0,53,1923},{134,0,3048},{0,53,1923},{3,122,18},{3,122,18},{3,122,18},{3,61,18},{0,73,648},{0,54,157},{0,54,157},{0,31,317},{0,33,756},{0,31,417},{6,116,0},{6,116,0},{6,116,0},{6,60,0},{36,0,648},{0,54,157},{0,54,157},{0,31,317},{73,0,648},{0,31,317},{94,0,882},{2,124,0},{22,84,0}, +{0,77,130},{94,0,882},{192,0,882},{0,77,130},{0,63,882},{192,0,882},{0,63,882},{3,0,18},{3,0,18},{3,0,18},{3,0,18},{0,19,0},{0,19,0},{0,19,0},{0,9,0},{0,9,4},{0,9,4},{8,203,995},{8,136,115},{11,96,290},{6,86,230},{0,161,3048},{0,100,1221},{0,84,250},{0,62,1758},{0,75,3651},{0,60,2156},{15,188,882},{15,130,2},{19,95,69},{12,86,158},{79,0,3048}, +{0,100,1221},{0,84,250},{0,62,1758},{161,0,3048},{0,62,1758},{8,139,113},{8,139,113},{8,139,113},{8,72,113},{0,101,648},{0,72,73},{0,72,73},{0,40,242},{0,45,862},{0,39,409},{15,125,0},{15,125,0},{15,125,0},{15,69,0},{49,0,648},{0,72,73},{0,72,73},{0,40,242},{101,0,648},{0,40,242},{107,0,882},{11,133,0},{31,93,0},{0,87,85},{107,0,882},{219,0,882},{0,87,85}, +{0,72,882},{219,0,882},{0,72,882},{7,0,113},{7,0,113},{7,0,113},{7,0,113},{0,46,0},{0,46,0},{0,46,0},{0,23,0},{0,18,34},{0,18,34},{12,219,1147},{12,146,275},{16,104,510},{11,95,365},{0,186,3048},{0,115,1096},{0,94,114},{0,71,1620},{0,88,3844},{0,69,2137},{23,196,882},{23,138,2},{27,103,69},{20,94,158},{91,0,3048},{0,115,1096},{0,94,114},{0,71,1620},{186,0,3048}, +{0,71,1620},{12,155,265},{12,155,265},{12,155,265},{12,82,265},{0,125,648},{0,84,25},{0,84,25},{0,53,180},{0,54,987},{0,48,427},{23,133,0},{23,133,0},{23,133,0},{23,77,0},{61,0,648},{0,84,25},{0,84,25},{0,53,180},{125,0,648},{0,53,180},{119,0,882},{20,140,0},{39,101,0},{0,96,50},{119,0,882},{243,0,882},{0,96,50},{0,80,882},{243,0,882},{0,80,882},{11,0,265}, +{11,0,265},{11,0,265},{11,0,265},{0,70,0},{0,70,0},{0,70,0},{0,35,0},{0,27,89},{0,27,89},{16,235,1363},{17,157,505},{20,114,802},{14,104,559},{0,210,3048},{0,127,1000},{0,105,34},{0,80,1494},{0,94,4056},{0,78,2148},{31,204,882},{31,145,2},{35,111,69},{27,102,165},{103,0,3048},{0,127,1000},{0,105,34},{0,80,1494},{210,0,3048},{0,80,1494},{16,171,481},{16,171,481},{16,171,481}, +{16,92,481},{0,149,648},{0,100,1},{0,100,1},{0,62,125},{0,66,1139},{0,57,473},{31,140,0},{31,140,0},{31,140,0},{31,85,0},{73,0,648},{0,100,1},{0,100,1},{0,62,125},{149,0,648},{0,62,125},{131,0,882},{28,148,0},{47,109,0},{0,105,25},{131,0,882},{255,6,882},{0,105,25},{0,88,882},{255,6,882},{0,88,882},{15,0,481},{15,0,481},{15,0,481},{15,0,481},{0,95,0}, +{0,95,0},{0,95,0},{0,46,0},{0,39,169},{0,39,169},{20,251,1643},{21,167,805},{25,122,1170},{19,112,822},{0,234,3048},{0,141,933},{1,115,10},{0,90,1395},{0,106,4312},{0,84,2188},{39,212,882},{39,153,2},{43,119,69},{35,110,165},{115,0,3048},{0,141,933},{1,115,9},{0,90,1395},{234,0,3048},{0,90,1395},{20,187,761},{20,187,761},{20,187,761},{19,102,761},{0,174,648},{1,111,5},{1,111,5}, +{0,71,80},{0,75,1322},{0,66,547},{39,148,0},{39,148,0},{39,148,0},{39,93,0},{85,0,648},{5,109,0},{5,109,0},{0,71,80},{174,0,648},{0,71,80},{143,0,882},{36,156,0},{55,117,0},{0,115,8},{143,0,882},{255,18,882},{0,115,8},{0,96,882},{255,18,882},{0,96,882},{19,0,761},{19,0,761},{19,0,761},{19,0,761},{0,119,0},{0,119,0},{0,119,0},{0,58,0},{0,48,274}, +{0,48,274},{29,254,1780},{29,178,935},{33,133,1327},{26,122,936},{6,249,3048},{3,153,909},{8,125,13},{0,99,1314},{0,121,4212},{0,97,1924},{48,221,882},{48,162,2},{52,128,69},{44,119,165},{128,0,3048},{0,156,891},{10,124,9},{0,99,1278},{255,3,3048},{0,99,1278},{27,200,882},{27,200,882},{27,200,882},{27,112,882},{6,189,648},{7,123,11},{7,123,11},{3,80,61},{0,91,1227},{0,75,409},{48,157,0}, +{48,157,0},{48,157,0},{48,102,0},{98,0,648},{14,118,0},{14,118,0},{0,80,41},{201,0,648},{0,80,41},{156,0,882},{45,165,0},{63,126,0},{0,126,0},{156,0,882},{254,32,882},{0,126,0},{0,105,882},{254,32,882},{0,105,882},{27,0,882},{27,0,882},{27,0,882},{27,0,882},{6,134,0},{6,134,0},{6,134,0},{6,69,0},{0,63,232},{0,63,232},{38,254,1814},{37,186,935},{41,141,1327}, +{34,130,936},{15,255,3049},{11,161,909},{16,133,13},{8,107,1314},{0,132,3964},{0,106,1605},{56,229,882},{56,170,2},{60,136,69},{52,127,165},{140,0,3048},{2,167,882},{18,132,9},{0,108,1188},{255,15,3048},{0,108,1188},{35,208,882},{35,208,882},{35,208,882},{35,120,882},{14,196,648},{15,131,11},{15,131,11},{11,88,61},{0,103,1059},{0,88,221},{56,165,0},{56,165,0},{56,165,0},{56,110,0},{110,0,648}, +{22,126,0},{22,126,0},{0,90,20},{225,0,648},{0,90,20},{168,0,882},{53,173,0},{71,134,0},{5,134,0},{168,0,882},{255,43,882},{5,134,0},{0,113,882},{255,43,882},{0,113,882},{35,0,882},{35,0,882},{35,0,882},{35,0,882},{14,142,0},{14,142,0},{14,142,0},{14,77,0},{0,75,136},{0,75,136},{46,255,1854},{45,194,935},{49,149,1327},{42,138,936},{24,255,3064},{19,169,909},{22,141,14}, +{16,115,1314},{0,144,3748},{0,115,1348},{64,237,882},{64,178,2},{68,144,69},{60,135,165},{152,0,3048},{10,175,882},{26,140,9},{0,117,1110},{255,27,3048},{0,117,1110},{43,216,882},{43,216,882},{43,216,882},{43,128,882},{22,204,648},{23,139,11},{23,139,11},{21,95,62},{0,118,922},{0,97,91},{64,173,0},{64,173,0},{64,173,0},{64,117,0},{122,0,648},{30,134,0},{30,134,0},{0,99,5},{249,0,648}, +{0,99,5},{180,0,882},{61,181,0},{79,142,0},{13,142,0},{180,0,882},{255,55,882},{13,142,0},{0,121,882},{255,55,882},{0,121,882},{43,0,882},{43,0,882},{43,0,882},{43,0,882},{22,150,0},{22,150,0},{22,150,0},{22,85,0},{0,91,58},{0,91,58},{55,255,1924},{53,202,935},{57,157,1327},{50,146,936},{36,255,3096},{27,177,909},{30,149,14},{24,123,1314},{0,159,3559},{0,124,1153},{72,245,882}, +{72,186,2},{77,152,65},{68,143,165},{164,0,3048},{19,182,882},{33,148,9},{0,126,1044},{255,39,3048},{0,126,1044},{51,224,882},{51,224,882},{51,224,882},{51,136,882},{30,212,648},{32,147,9},{32,147,9},{28,103,65},{0,129,810},{0,106,21},{72,181,0},{72,181,0},{72,181,0},{72,125,0},{134,0,648},{38,142,0},{38,142,0},{0,108,0},{255,9,648},{0,108,0},{192,0,882},{69,189,0},{87,150,0}, +{21,150,0},{192,0,882},{255,67,882},{21,150,0},{0,129,882},{255,67,882},{0,129,882},{51,0,882},{51,0,882},{51,0,882},{51,0,882},{30,158,0},{30,158,0},{30,158,0},{30,93,0},{0,106,17},{0,106,17},{67,255,2024},{62,211,935},{66,166,1327},{59,155,936},{46,255,3145},{36,186,909},{40,158,10},{33,132,1314},{0,172,3364},{0,133,1012},{81,254,882},{81,195,2},{86,161,65},{77,152,165},{177,0,3048}, +{28,191,882},{42,157,9},{0,136,990},{255,52,3048},{0,136,990},{60,233,882},{60,233,882},{60,233,882},{60,145,882},{39,221,648},{41,156,9},{41,156,9},{37,112,65},{0,144,720},{2,118,3},{81,190,0},{81,190,0},{81,190,0},{81,134,0},{147,0,648},{47,151,0},{47,151,0},{7,117,0},{254,23,648},{7,117,0},{205,0,882},{78,198,0},{96,159,0},{30,159,0},{205,0,882},{254,81,882},{30,159,0}, +{0,138,882},{254,81,882},{0,138,882},{60,0,882},{60,0,882},{60,0,882},{60,0,882},{39,167,0},{39,167,0},{39,167,0},{39,102,0},{0,121,0},{0,121,0},{76,255,2134},{70,218,935},{74,174,1327},{66,163,942},{58,255,3217},{45,193,904},{48,166,10},{41,140,1314},{0,184,3244},{0,145,948},{91,254,888},{89,203,2},{94,169,65},{85,160,165},{189,0,3048},{36,199,882},{50,165,9},{0,145,948},{255,64,3048}, +{0,145,948},{68,241,882},{68,241,882},{68,241,882},{68,153,882},{47,229,648},{49,164,9},{49,164,9},{45,120,65},{0,156,672},{10,126,3},{89,198,0},{89,198,0},{89,198,0},{89,142,0},{159,0,648},{56,158,0},{56,158,0},{15,125,0},{254,35,648},{15,125,0},{217,0,882},{86,206,0},{104,167,0},{38,167,0},{217,0,882},{255,92,882},{38,167,0},{0,146,882},{255,92,882},{0,146,882},{68,0,882}, +{68,0,882},{68,0,882},{68,0,882},{47,174,0},{47,174,0},{47,174,0},{47,109,0},{7,129,0},{7,129,0},{86,255,2252},{78,226,935},{82,182,1327},{74,171,942},{67,255,3300},{53,201,904},{56,174,10},{49,148,1314},{0,199,3151},{3,152,935},{101,255,906},{97,211,2},{102,177,65},{93,168,165},{201,0,3048},{44,207,882},{58,173,9},{0,152,915},{255,76,3048},{0,152,915},{76,249,882},{76,249,882},{76,249,882}, +{76,161,882},{55,237,648},{57,172,9},{57,172,9},{53,128,65},{0,171,649},{18,134,3},{97,206,0},{97,206,0},{97,206,0},{97,150,0},{171,0,648},{64,166,0},{64,166,0},{23,133,0},{255,46,648},{23,133,0},{229,0,882},{94,214,0},{112,175,0},{46,175,0},{229,0,882},{255,104,882},{46,175,0},{0,154,882},{255,104,882},{0,154,882},{76,0,882},{76,0,882},{76,0,882},{76,0,882},{55,182,0}, +{55,182,0},{55,182,0},{55,117,0},{16,136,0},{16,136,0},{95,255,2398},{86,234,935},{90,190,1327},{82,179,942},{76,255,3409},{61,209,904},{64,182,10},{56,155,1318},{0,211,3087},{11,160,935},{110,255,939},{105,219,2},{110,185,65},{101,176,165},{213,0,3048},{52,215,882},{66,181,9},{0,161,893},{254,88,3048},{0,161,893},{84,254,883},{84,254,883},{84,254,883},{84,169,882},{63,245,648},{65,180,9},{65,180,9}, +{61,136,65},{7,179,648},{27,141,2},{105,214,0},{105,214,0},{105,214,0},{105,158,0},{183,0,648},{72,174,0},{72,174,0},{31,141,0},{255,58,648},{31,141,0},{241,0,882},{101,222,0},{120,183,0},{54,183,0},{241,0,882},{255,116,882},{54,183,0},{0,162,882},{255,116,882},{0,162,882},{84,0,882},{84,0,882},{84,0,882},{84,0,882},{63,190,0},{63,190,0},{63,190,0},{63,125,0},{24,144,0}, +{24,144,0},{104,255,2584},{95,243,935},{100,199,1318},{91,188,942},{89,255,3529},{69,219,909},{73,191,10},{65,165,1327},{0,224,3052},{20,169,935},{122,255,996},{114,228,2},{119,194,65},{111,183,171},{226,0,3048},{61,224,882},{75,190,9},{0,171,883},{255,101,3048},{0,171,883},{94,254,893},{94,254,893},{94,254,893},{93,177,882},{72,254,648},{74,189,9},{74,189,9},{70,145,65},{16,188,648},{36,150,2},{114,222,0}, +{114,222,0},{114,222,0},{114,167,0},{196,0,648},{81,183,0},{81,183,0},{39,150,0},{254,72,648},{39,150,0},{254,0,882},{110,231,0},{129,192,0},{63,192,0},{254,0,882},{255,129,882},{63,192,0},{0,171,882},{255,129,882},{0,171,882},{93,0,882},{93,0,882},{93,0,882},{93,0,882},{72,199,0},{72,199,0},{72,199,0},{72,134,0},{33,153,0},{33,153,0},{113,255,2774},{103,251,935},{107,206,1314}, +{99,196,942},{98,255,3672},{77,227,909},{81,199,10},{73,173,1327},{5,235,3048},{28,177,935},{132,255,1054},{121,236,3},{127,202,65},{119,192,173},{238,0,3048},{69,232,882},{83,198,9},{4,179,882},{255,113,3048},{4,179,882},{103,254,915},{103,254,915},{103,254,915},{101,185,882},{82,255,654},{82,197,9},{82,197,9},{78,153,65},{24,196,648},{44,158,2},{122,230,0},{122,230,0},{122,230,0},{122,175,0},{208,0,648}, +{89,191,0},{89,191,0},{47,158,0},{254,84,648},{47,158,0},{255,22,882},{118,239,0},{137,200,0},{71,200,0},{255,22,882},{255,141,882},{71,200,0},{0,179,882},{255,141,882},{0,179,882},{101,0,882},{101,0,882},{101,0,882},{101,0,882},{80,207,0},{80,207,0},{80,207,0},{80,142,0},{41,161,0},{41,161,0},{122,255,2984},{110,255,948},{115,214,1314},{107,204,942},{110,255,3832},{85,235,909},{89,207,10}, +{81,181,1327},{13,243,3048},{36,185,935},{141,255,1131},{129,244,3},{135,210,65},{127,200,173},{250,0,3048},{77,240,882},{91,206,9},{12,187,882},{255,125,3048},{12,187,882},{110,255,948},{110,255,948},{110,255,948},{109,193,882},{92,255,672},{90,205,9},{90,205,9},{86,161,65},{32,204,648},{52,166,2},{130,238,0},{130,238,0},{130,238,0},{130,183,0},{220,0,648},{97,199,0},{97,199,0},{55,166,0},{255,95,648}, +{55,166,0},{255,46,882},{126,247,0},{145,208,0},{79,208,0},{255,46,882},{255,153,882},{79,208,0},{0,187,882},{255,153,882},{0,187,882},{109,0,882},{109,0,882},{109,0,882},{109,0,882},{88,215,0},{88,215,0},{88,215,0},{88,150,0},{49,169,0},{49,169,0},{132,255,3182},{122,255,1012},{123,222,1314},{115,212,942},{119,255,4009},{93,243,909},{97,215,10},{89,189,1327},{21,251,3048},{44,193,935},{150,255,1226}, +{137,252,3},{143,218,65},{135,208,173},{255,13,3048},{83,249,882},{99,214,9},{20,195,882},{254,137,3048},{20,195,882},{119,255,990},{119,255,990},{119,255,990},{117,201,882},{101,255,705},{98,213,9},{98,213,9},{94,169,65},{40,212,648},{60,174,2},{138,246,0},{138,246,0},{138,246,0},{138,191,0},{232,0,648},{104,208,0},{104,208,0},{63,174,0},{255,107,648},{63,174,0},{255,70,882},{134,255,0},{153,216,0}, +{86,216,0},{255,70,882},{255,165,882},{86,216,0},{0,195,882},{255,165,882},{0,195,882},{117,0,882},{117,0,882},{117,0,882},{117,0,882},{96,223,0},{96,223,0},{96,223,0},{96,158,0},{57,177,0},{57,177,0},{141,255,3464},{131,255,1153},{132,231,1314},{124,221,942},{132,255,4209},{102,252,909},{105,224,14},{98,198,1327},{37,255,3060},{53,202,935},{162,255,1349},{149,255,21},{152,227,65},{144,217,173},{255,40,3048}, +{95,255,885},{108,223,9},{29,204,882},{255,150,3048},{29,204,882},{129,255,1044},{129,255,1044},{129,255,1044},{126,210,882},{113,255,762},{107,222,9},{107,222,9},{103,178,65},{49,221,648},{69,183,2},{147,255,0},{147,255,0},{147,255,0},{147,200,0},{245,0,648},{112,217,0},{112,217,0},{72,183,0},{254,121,648},{72,183,0},{255,98,882},{149,255,17},{162,225,0},{95,225,0},{255,98,882},{255,178,882},{95,225,0}, +{0,204,882},{255,178,882},{0,204,882},{126,0,882},{126,0,882},{126,0,882},{126,0,882},{105,232,0},{105,232,0},{105,232,0},{105,167,0},{66,186,0},{66,186,0},{150,255,3734},{140,255,1348},{140,239,1314},{132,229,942},{141,255,4420},{113,255,925},{113,232,14},{106,206,1327},{52,255,3132},{61,210,935},{172,255,1459},{158,255,91},{160,234,62},{152,225,173},{255,64,3048},{110,255,923},{116,232,11},{37,212,882},{255,162,3048}, +{37,212,882},{138,255,1110},{138,255,1110},{138,255,1110},{134,218,882},{122,255,827},{115,229,9},{115,229,9},{111,187,69},{57,229,648},{77,191,2},{156,255,5},{156,255,5},{156,255,5},{155,208,0},{255,4,648},{120,225,0},{120,225,0},{80,191,0},{255,132,648},{80,191,0},{255,122,882},{164,255,58},{170,233,0},{103,233,0},{255,122,882},{255,190,882},{103,233,0},{0,212,882},{255,190,882},{0,212,882},{134,0,882}, +{134,0,882},{134,0,882},{134,0,882},{113,240,0},{113,240,0},{113,240,0},{113,175,0},{74,194,0},{74,194,0},{162,255,4022},{149,255,1605},{148,247,1314},{140,237,942},{150,255,4657},{122,255,1020},{122,239,13},{114,214,1327},{70,255,3256},{69,218,935},{181,255,1598},{167,255,221},{167,244,61},{160,233,173},{255,89,3048},{128,255,1003},{123,240,11},{45,220,882},{254,174,3048},{45,220,882},{147,255,1188},{147,255,1188},{147,255,1188}, +{142,226,882},{132,255,897},{123,237,9},{123,237,9},{119,195,69},{65,237,648},{85,199,2},{165,255,20},{165,255,20},{165,255,20},{163,216,0},{255,28,648},{128,233,0},{128,233,0},{88,199,0},{255,144,648},{88,199,0},{255,146,882},{180,255,136},{178,241,0},{111,241,0},{255,146,882},{255,202,882},{111,241,0},{0,220,882},{255,202,882},{0,220,882},{142,0,882},{142,0,882},{142,0,882},{142,0,882},{121,248,0}, +{121,248,0},{121,248,0},{121,183,0},{82,202,0},{82,202,0},{172,255,4300},{158,255,1924},{156,255,1314},{150,244,943},{162,255,4905},{134,255,1204},{130,247,13},{122,222,1327},{82,255,3448},{77,226,935},{190,255,1755},{180,255,409},{175,252,61},{168,241,173},{255,113,3048},{143,255,1125},{131,248,11},{53,228,882},{254,186,3048},{53,228,882},{156,255,1278},{156,255,1278},{156,255,1278},{150,234,882},{141,255,992},{131,245,9},{131,245,9}, +{127,203,69},{73,245,648},{93,207,2},{175,255,41},{175,255,41},{175,255,41},{171,224,0},{255,52,648},{137,240,0},{137,240,0},{96,207,0},{255,156,648},{96,207,0},{255,171,882},{192,255,232},{186,249,0},{119,249,0},{255,171,882},{254,214,882},{119,249,0},{0,228,882},{254,214,882},{0,228,882},{150,0,882},{150,0,882},{150,0,882},{150,0,882},{129,255,0},{129,255,0},{129,255,0},{129,191,0},{90,210,0}, +{90,210,0},{178,255,4349},{171,255,2188},{165,255,1395},{159,251,923},{172,255,4837},{146,255,1309},{140,254,10},{132,229,1170},{104,255,3433},{88,234,805},{202,255,1725},{189,255,547},{184,255,80},{176,249,133},{255,137,2814},{158,255,1125},{143,254,5},{66,235,761},{254,198,2814},{66,235,761},{165,255,1395},{165,255,1395},{165,255,1395},{159,243,882},{153,255,1115},{140,254,9},{140,254,9},{136,212,69},{81,254,648},{102,216,2},{184,255,80}, +{184,255,80},{184,255,80},{180,233,0},{255,79,648},{146,249,0},{146,249,0},{105,216,0},{253,170,648},{105,216,0},{255,192,761},{207,255,274},{196,255,0},{134,255,0},{255,192,761},{255,224,761},{134,255,0},{0,235,761},{255,224,761},{0,235,761},{159,0,882},{159,0,882},{159,0,882},{159,0,882},{140,254,8},{140,254,8},{140,254,8},{138,200,0},{99,219,0},{99,219,0},{187,255,3903},{177,255,2148},{175,255,1494}, +{167,253,887},{181,255,4274},{155,255,1106},{149,255,34},{140,234,802},{119,255,2958},{98,238,505},{208,255,1361},{198,255,473},{193,255,125},{187,251,53},{255,152,2249},{167,255,857},{155,255,1},{82,239,481},{255,205,2249},{82,239,481},{175,255,1494},{175,255,1494},{175,255,1494},{167,251,882},{162,255,1242},{149,255,34},{149,255,34},{144,220,69},{95,255,670},{110,224,2},{193,255,125},{193,255,125},{193,255,125},{188,241,0},{255,104,648}, +{155,255,1},{155,255,1},{113,224,0},{255,181,648},{113,224,0},{255,204,481},{216,255,169},{208,255,0},{158,255,0},{255,204,481},{255,230,481},{158,255,0},{0,239,481},{255,230,481},{0,239,481},{167,0,882},{167,0,882},{167,0,882},{167,0,882},{149,254,25},{149,254,25},{149,254,25},{146,208,0},{106,227,0},{106,227,0},{193,255,3535},{186,255,2137},{184,255,1620},{175,255,891},{187,255,3794},{167,255,978},{159,255,114}, +{150,238,510},{131,255,2574},{109,243,275},{215,255,1046},{207,255,427},{202,255,180},{195,253,9},{255,171,1769},{183,255,650},{167,255,25},{98,243,265},{254,214,1769},{98,243,265},{184,255,1620},{184,255,1620},{184,255,1620},{175,255,891},{172,255,1364},{159,255,114},{159,255,114},{152,228,69},{113,255,734},{117,232,2},{202,255,180},{202,255,180},{202,255,180},{196,249,0},{255,128,648},{167,255,25},{167,255,25},{120,232,0},{255,193,648}, +{120,232,0},{255,216,265},{228,255,89},{220,255,0},{183,255,0},{255,216,265},{255,236,265},{183,255,0},{0,243,265},{255,236,265},{0,243,265},{175,0,882},{175,0,882},{175,0,882},{175,0,882},{159,255,50},{159,255,50},{159,255,50},{154,216,0},{114,235,0},{114,235,0},{202,255,3229},{195,255,2156},{193,255,1758},{183,255,946},{196,255,3397},{174,255,950},{171,255,250},{158,243,290},{146,255,2281},{119,247,115},{221,255,822}, +{216,255,409},{215,255,242},{204,255,1},{255,186,1374},{195,255,498},{183,255,73},{114,247,113},{255,221,1374},{114,247,113},{193,255,1758},{193,255,1758},{193,255,1758},{183,255,946},{181,255,1521},{171,255,250},{171,255,250},{160,236,69},{128,255,840},{125,240,2},{215,255,242},{215,255,242},{215,255,242},{204,255,1},{255,152,648},{183,255,73},{183,255,73},{128,240,0},{255,205,648},{128,240,0},{255,228,113},{237,255,34},{232,255,0}, +{207,255,0},{255,228,113},{255,242,113},{207,255,0},{0,247,113},{255,242,113},{0,247,113},{183,0,882},{183,0,882},{183,0,882},{183,0,882},{168,255,85},{168,255,85},{168,255,85},{162,224,0},{122,243,0},{122,243,0},{211,255,2974},{205,255,2205},{202,255,1923},{195,255,1069},{205,255,3055},{186,255,981},{180,255,469},{167,249,133},{161,255,2061},{131,252,18},{230,255,645},{224,255,417},{224,255,317},{216,255,45},{255,204,1032}, +{210,255,404},{201,255,157},{131,252,18},{255,230,1032},{131,252,18},{202,255,1923},{202,255,1923},{202,255,1923},{195,255,1069},{193,255,1710},{180,255,469},{180,255,469},{169,245,69},{146,255,1011},{134,249,2},{224,255,317},{224,255,317},{224,255,317},{216,255,45},{255,180,648},{201,255,157},{201,255,157},{137,249,0},{255,218,648},{137,249,0},{255,243,18},{246,255,4},{245,255,0},{234,255,0},{255,243,18},{254,250,18},{234,255,0}, +{0,252,18},{254,250,18},{0,252,18},{192,0,882},{192,0,882},{192,0,882},{192,0,882},{178,255,130},{178,255,130},{178,255,130},{171,233,0},{131,252,0},{131,252,0},{218,255,2682},{211,255,2161},{211,255,1965},{204,255,1170},{215,255,2712},{195,255,1014},{192,255,633},{177,253,61},{167,255,1893},{143,255,5},{236,255,513},{233,255,389},{230,255,337},{225,255,97},{255,219,771},{219,255,342},{213,255,205},{149,255,0},{254,238,771}, +{149,255,0},{211,255,1965},{211,255,1965},{211,255,1965},{204,255,1170},{202,255,1755},{192,255,633},{192,255,633},{178,251,53},{161,255,1085},{143,255,5},{230,255,337},{230,255,337},{230,255,337},{225,255,97},{255,201,578},{213,255,205},{213,255,205},{149,255,0},{254,229,578},{149,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{200,0,882}, +{200,0,882},{200,0,882},{200,0,882},{187,255,185},{187,255,185},{187,255,185},{179,241,0},{143,255,5},{143,255,5},{221,255,2188},{218,255,1802},{215,255,1656},{210,255,1086},{218,255,2117},{204,255,865},{201,255,585},{187,254,11},{183,255,1467},{158,255,34},{242,255,297},{239,255,225},{236,255,193},{231,255,53},{255,225,451},{228,255,192},{222,255,116},{174,255,0},{254,241,451},{174,255,0},{215,255,1656},{215,255,1656},{215,255,1656}, +{210,255,1086},{211,255,1426},{201,255,585},{201,255,585},{186,253,9},{167,255,869},{158,255,34},{236,255,193},{236,255,193},{236,255,193},{231,255,53},{255,213,338},{222,255,116},{222,255,116},{174,255,0},{254,235,338},{174,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{208,0,882},{208,0,882},{208,0,882},{208,0,882},{196,255,250}, +{196,255,250},{196,255,250},{187,249,0},{158,255,34},{158,255,34},{227,255,1772},{224,255,1510},{224,255,1410},{219,255,1021},{224,255,1645},{210,255,761},{208,255,563},{195,255,1},{195,255,1123},{171,255,97},{245,255,136},{242,255,105},{242,255,89},{237,255,25},{255,234,216},{237,255,86},{234,255,52},{198,255,0},{255,245,216},{198,255,0},{224,255,1410},{224,255,1410},{224,255,1410},{219,255,1021},{215,255,1140},{208,255,563},{208,255,563}, +{195,255,1},{186,255,696},{171,255,97},{242,255,89},{242,255,89},{242,255,89},{237,255,25},{255,225,162},{234,255,52},{234,255,52},{198,255,0},{254,241,162},{198,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{216,0,882},{216,0,882},{216,0,882},{216,0,882},{205,255,325},{205,255,325},{205,255,325},{195,255,1},{171,255,97}, +{171,255,97},{0,158,1568},{0,112,169},{0,80,4},{0,68,585},{0,107,3371},{0,69,2124},{0,62,1013},{0,40,2532},{0,48,3617},{0,40,2701},{0,158,1568},{0,112,169},{0,80,4},{0,68,585},{52,0,3371},{0,69,2124},{0,62,1013},{0,40,2532},{107,0,3371},{0,40,2532},{0,73,0},{0,73,0},{0,73,0},{0,36,0},{0,37,288},{0,30,97},{0,30,97},{0,16,164},{0,15,312},{0,16,189},{0,73,0}, +{0,73,0},{0,73,0},{0,36,0},{18,0,288},{0,30,97},{0,30,97},{0,16,164},{37,0,288},{0,16,164},{78,0,1568},{0,112,169},{0,80,4},{0,68,585},{78,0,1568},{158,0,1568},{0,68,585},{0,52,1568},{158,0,1568},{0,52,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,183,1568},{0,124,89},{0,89,10}, +{0,77,482},{0,122,3968},{0,81,2316},{0,69,1041},{0,50,2857},{0,57,4304},{0,47,3092},{0,183,1568},{0,124,89},{2,88,8},{0,77,482},{60,0,3968},{0,81,2316},{0,69,1041},{0,50,2857},{122,0,3968},{0,50,2857},{0,98,0},{0,98,0},{0,98,0},{0,48,0},{0,49,512},{0,39,180},{0,39,180},{0,22,296},{0,21,556},{0,22,345},{0,98,0},{0,98,0},{0,98,0},{0,48,0},{24,0,512}, +{0,39,180},{0,39,180},{0,22,296},{49,0,512},{0,22,296},{89,0,1568},{0,124,89},{5,88,0},{0,77,482},{89,0,1568},{183,0,1568},{0,77,482},{0,60,1568},{183,0,1568},{0,60,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,207,1568},{0,138,34},{2,97,58},{0,83,394},{0,137,4651},{0,91,2507},{0,78,1093}, +{0,56,3225},{0,63,5084},{0,53,3532},{0,207,1568},{0,138,34},{3,98,49},{0,83,394},{67,0,4651},{0,91,2507},{0,78,1093},{0,56,3225},{137,0,4651},{0,56,3225},{0,122,0},{0,122,0},{0,122,0},{0,60,0},{0,61,800},{0,48,289},{0,48,289},{0,28,468},{0,27,872},{0,25,545},{0,122,0},{0,122,0},{0,122,0},{0,60,0},{30,0,800},{0,48,289},{0,48,289},{0,28,468},{61,0,800}, +{0,28,468},{101,0,1568},{0,138,34},{13,96,0},{0,83,394},{101,0,1568},{207,0,1568},{0,83,394},{0,68,1568},{207,0,1568},{0,68,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,231,1568},{0,153,5},{3,107,148},{0,93,317},{0,155,5419},{0,100,2754},{0,88,1161},{0,62,3641},{0,69,5968},{0,59,4028},{0,231,1568}, +{0,153,5},{6,107,126},{0,93,317},{76,0,5419},{0,100,2754},{0,88,1161},{0,62,3641},{155,0,5419},{0,62,3641},{0,146,0},{0,146,0},{0,146,0},{0,72,0},{0,73,1152},{0,57,424},{0,57,424},{0,34,680},{0,33,1260},{0,31,789},{0,146,0},{0,146,0},{0,146,0},{0,72,0},{36,0,1152},{0,57,424},{0,57,424},{0,34,680},{73,0,1152},{0,34,680},{113,0,1568},{0,153,5},{21,104,0}, +{0,93,317},{113,0,1568},{231,0,1568},{0,93,317},{0,76,1568},{231,0,1568},{0,76,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{5,248,1609},{4,166,41},{9,116,259},{2,104,303},{0,183,5419},{0,115,2480},{0,100,798},{0,71,3404},{0,84,6188},{0,68,3926},{9,240,1568},{9,162,5},{15,115,121},{5,104,293},{89,0,5419}, +{0,115,2480},{0,100,798},{0,71,3404},{183,0,5419},{0,71,3404},{5,163,41},{5,163,41},{5,163,41},{4,83,41},{0,101,1152},{0,75,274},{0,75,274},{0,44,569},{0,45,1366},{0,40,747},{9,155,0},{9,155,0},{9,155,0},{9,81,0},{49,0,1152},{0,75,274},{0,75,274},{0,44,569},{101,0,1152},{0,44,569},{127,0,1568},{4,166,0},{30,113,0},{0,105,233},{127,0,1568},{254,2,1568},{0,105,233}, +{0,85,1568},{254,2,1568},{0,85,1568},{4,0,41},{4,0,41},{4,0,41},{4,0,41},{0,28,0},{0,28,0},{0,28,0},{0,14,0},{0,12,10},{0,12,10},{9,255,1731},{9,176,146},{13,126,435},{7,112,374},{0,207,5419},{0,129,2265},{0,109,532},{0,80,3202},{0,94,6384},{0,77,3861},{17,248,1568},{17,170,5},{23,123,121},{13,112,293},{101,0,5419},{0,129,2265},{0,109,532},{0,80,3202},{207,0,5419}, +{0,80,3202},{9,179,145},{9,179,145},{9,179,145},{9,92,145},{0,125,1152},{0,88,157},{0,88,157},{0,53,468},{0,54,1491},{0,50,737},{17,163,0},{17,163,0},{17,163,0},{17,89,0},{61,0,1152},{0,88,157},{0,88,157},{0,53,468},{125,0,1152},{0,53,468},{138,0,1568},{12,174,0},{38,121,0},{0,114,170},{138,0,1568},{254,14,1568},{0,114,170},{0,93,1568},{254,14,1568},{0,93,1568},{8,0,145}, +{8,0,145},{8,0,145},{8,0,145},{0,52,0},{0,52,0},{0,52,0},{0,26,0},{0,21,45},{0,21,45},{15,255,1991},{13,189,321},{18,134,687},{10,121,510},{0,231,5419},{0,141,2081},{0,121,324},{0,90,3035},{0,106,6640},{0,87,3833},{26,254,1569},{25,178,5},{31,131,121},{21,120,293},{113,0,5419},{0,141,2081},{0,121,324},{0,90,3035},{231,0,5419},{0,90,3035},{13,195,313},{13,195,313},{13,195,313}, +{13,102,313},{0,149,1152},{0,103,80},{0,103,80},{0,62,377},{0,66,1643},{0,57,749},{25,171,0},{25,171,0},{25,171,0},{25,97,0},{73,0,1152},{0,103,80},{0,103,80},{0,62,377},{149,0,1152},{0,62,377},{150,0,1568},{21,181,0},{46,129,0},{0,123,117},{150,0,1568},{254,26,1568},{0,123,117},{0,101,1568},{254,26,1568},{0,101,1568},{12,0,313},{12,0,313},{12,0,313},{12,0,313},{0,76,0}, +{0,76,0},{0,76,0},{0,38,0},{0,30,106},{0,30,106},{24,255,2387},{17,199,565},{23,142,1015},{15,129,713},{0,255,5419},{0,156,1924},{0,130,166},{0,99,2857},{0,115,6921},{0,94,3818},{36,255,1579},{33,187,4},{39,139,121},{29,128,293},{125,0,5419},{0,156,1924},{0,130,166},{0,99,2857},{255,0,5419},{0,99,2857},{17,212,545},{17,212,545},{17,212,545},{17,112,545},{0,174,1152},{0,118,29},{0,118,29}, +{0,71,296},{0,75,1826},{0,66,787},{33,179,0},{33,179,0},{33,179,0},{33,104,0},{85,0,1152},{0,118,29},{0,118,29},{0,71,296},{174,0,1152},{0,71,296},{162,0,1568},{29,189,0},{54,137,0},{0,133,80},{162,0,1568},{254,38,1568},{0,133,80},{0,109,1568},{254,38,1568},{0,109,1568},{16,0,545},{16,0,545},{16,0,545},{16,0,545},{0,101,0},{0,101,0},{0,101,0},{0,49,0},{0,39,193}, +{0,39,193},{30,255,3004},{22,210,924},{28,153,1470},{19,140,1026},{6,255,5520},{0,172,1772},{0,142,57},{0,108,2668},{0,127,7276},{0,103,3836},{46,255,1602},{41,195,3},{48,148,121},{38,137,293},{138,0,5419},{0,172,1772},{0,142,57},{0,108,2668},{254,14,5419},{0,108,2668},{21,231,882},{21,231,882},{21,231,882},{21,124,882},{0,201,1152},{0,132,2},{0,132,2},{0,83,218},{0,88,2034},{0,75,865},{42,188,0}, +{42,188,0},{42,188,0},{42,113,0},{98,0,1152},{0,132,2},{0,132,2},{0,83,218},{201,0,1152},{0,83,218},{175,0,1568},{38,198,0},{63,146,0},{0,142,41},{175,0,1568},{254,51,1568},{0,142,41},{0,118,1568},{254,51,1568},{0,118,1568},{21,0,882},{21,0,882},{21,0,882},{21,0,882},{0,128,0},{0,128,0},{0,128,0},{0,63,0},{0,51,320},{0,51,320},{36,255,3708},{27,221,1316},{33,161,1956}, +{24,148,1369},{15,255,5777},{0,184,1676},{0,151,19},{0,117,2514},{0,138,7620},{0,112,3881},{55,255,1643},{49,203,3},{56,156,121},{46,145,293},{150,0,5419},{0,184,1676},{0,151,19},{0,117,2514},{254,26,5419},{0,117,2514},{25,247,1250},{25,247,1250},{25,247,1250},{25,134,1250},{0,225,1152},{1,147,3},{1,147,3},{0,90,164},{0,100,2274},{0,84,961},{50,196,0},{50,196,0},{50,196,0},{50,121,0},{110,0,1152}, +{5,143,0},{5,143,0},{0,90,164},{225,0,1152},{0,90,164},{187,0,1568},{46,206,0},{71,154,0},{0,151,18},{187,0,1568},{254,63,1568},{0,151,18},{0,126,1568},{254,63,1568},{0,126,1568},{25,0,1250},{25,0,1250},{25,0,1250},{25,0,1250},{0,152,0},{0,152,0},{0,152,0},{0,75,0},{0,60,461},{0,60,461},{43,255,4356},{32,232,1665},{38,169,2370},{29,156,1670},{21,255,6121},{0,196,1616},{3,161,20}, +{0,126,2376},{0,150,7804},{0,121,3804},{67,255,1699},{57,211,3},{64,164,121},{54,153,293},{162,0,5419},{0,196,1612},{5,160,17},{0,126,2372},{254,38,5419},{0,126,2372},{30,255,1572},{30,255,1572},{30,255,1572},{30,143,1568},{2,245,1152},{4,159,17},{4,159,17},{0,99,117},{0,109,2403},{0,94,953},{58,204,0},{58,204,0},{58,204,0},{58,129,0},{122,0,1152},{13,151,0},{13,151,0},{0,99,113},{249,0,1152}, +{0,99,113},{199,0,1568},{54,214,0},{79,162,0},{0,160,5},{199,0,1568},{254,75,1568},{0,160,5},{0,134,1568},{254,75,1568},{0,134,1568},{30,0,1568},{30,0,1568},{30,0,1568},{30,0,1568},{2,172,0},{2,172,0},{2,172,0},{2,86,0},{0,72,541},{0,72,541},{52,255,4586},{40,240,1665},{47,177,2355},{37,164,1670},{33,255,6289},{7,206,1615},{11,169,20},{1,134,2353},{0,162,7444},{0,130,3321},{76,255,1766}, +{65,219,3},{72,172,121},{61,161,302},{174,0,5419},{0,211,1577},{13,168,17},{0,133,2259},{255,49,5419},{0,133,2259},{39,255,1586},{39,255,1586},{39,255,1586},{38,151,1568},{10,253,1152},{12,167,17},{12,167,17},{7,109,115},{0,124,2150},{0,103,659},{66,211,0},{66,211,0},{66,211,0},{66,137,0},{134,0,1152},{21,159,0},{21,159,0},{0,108,72},{255,9,1152},{0,108,72},{211,0,1568},{62,222,0},{86,170,0}, +{0,170,0},{211,0,1568},{255,86,1568},{0,170,0},{0,142,1568},{255,86,1568},{0,142,1568},{38,0,1568},{38,0,1568},{38,0,1568},{38,0,1568},{10,180,0},{10,180,0},{10,180,0},{10,93,0},{0,88,373},{0,88,373},{64,255,4866},{49,249,1665},{55,188,2353},{46,173,1670},{43,255,6476},{16,215,1615},{20,178,20},{10,143,2353},{0,178,7036},{0,139,2856},{86,255,1851},{75,228,5},{81,181,121},{70,170,302},{187,0,5419}, +{4,222,1568},{22,177,17},{0,145,2124},{254,63,5419},{0,145,2124},{49,255,1612},{49,255,1612},{49,255,1612},{47,160,1568},{21,255,1158},{21,176,17},{21,176,17},{16,118,115},{0,138,1900},{0,115,392},{75,220,0},{75,220,0},{75,220,0},{75,146,0},{147,0,1152},{30,168,0},{30,168,0},{0,120,34},{254,23,1152},{0,120,34},{224,0,1568},{71,231,0},{95,179,0},{7,179,0},{224,0,1568},{254,100,1568},{7,179,0}, +{0,151,1568},{254,100,1568},{0,151,1568},{47,0,1568},{47,0,1568},{47,0,1568},{47,0,1568},{19,189,0},{19,189,0},{19,189,0},{19,102,0},{0,103,232},{0,103,232},{73,255,5136},{57,254,1666},{63,196,2353},{54,181,1670},{55,255,6684},{24,223,1615},{28,186,20},{18,151,2353},{0,190,6740},{0,151,2504},{95,255,1954},{83,236,5},{89,189,121},{78,178,302},{199,0,5419},{12,230,1568},{30,185,17},{0,154,2018},{254,75,5419}, +{0,154,2018},{58,255,1650},{58,255,1650},{58,255,1650},{55,168,1568},{30,255,1179},{29,184,17},{29,184,17},{24,126,115},{0,150,1708},{0,127,216},{83,228,0},{83,228,0},{83,228,0},{83,154,0},{159,0,1152},{38,176,0},{38,176,0},{0,130,17},{254,35,1152},{0,130,17},{236,0,1568},{78,240,0},{103,187,0},{15,187,0},{236,0,1568},{254,112,1568},{15,187,0},{0,159,1568},{254,112,1568},{0,159,1568},{55,0,1568}, +{55,0,1568},{55,0,1568},{55,0,1568},{27,197,0},{27,197,0},{27,197,0},{27,110,0},{0,115,136},{0,115,136},{82,255,5426},{67,255,1701},{71,204,2353},{62,189,1670},{64,255,6905},{32,231,1615},{36,194,20},{26,159,2353},{0,202,6476},{0,160,2211},{107,255,2066},{91,244,5},{97,197,121},{86,186,302},{211,0,5419},{20,238,1568},{38,193,17},{0,160,1922},{255,86,5419},{0,160,1922},{67,255,1700},{67,255,1700},{67,255,1700}, +{63,176,1568},{39,255,1218},{37,192,17},{37,192,17},{32,134,115},{0,165,1545},{0,136,90},{91,236,0},{91,236,0},{91,236,0},{91,162,0},{171,0,1152},{46,184,0},{46,184,0},{0,139,4},{255,46,1152},{0,139,4},{248,0,1568},{85,248,0},{111,195,0},{23,195,0},{248,0,1568},{254,124,1568},{23,195,0},{0,167,1568},{254,124,1568},{0,167,1568},{63,0,1568},{63,0,1568},{63,0,1568},{63,0,1568},{35,205,0}, +{35,205,0},{35,205,0},{35,118,0},{0,129,65},{0,129,65},{92,255,5700},{76,255,1798},{79,212,2353},{70,197,1670},{73,255,7152},{40,239,1615},{44,202,20},{34,167,2353},{0,215,6213},{0,169,1980},{116,255,2195},{99,252,5},{104,206,115},{94,194,302},{223,0,5419},{28,246,1568},{46,201,17},{0,169,1836},{255,98,5419},{0,169,1836},{76,255,1762},{76,255,1762},{76,255,1762},{71,184,1568},{49,255,1260},{45,200,17},{45,200,17}, +{40,142,115},{0,178,1395},{0,145,24},{99,244,0},{99,244,0},{99,244,0},{99,170,0},{183,0,1152},{54,192,0},{54,192,0},{0,147,0},{255,58,1152},{0,147,0},{255,10,1568},{94,254,1},{119,203,0},{31,203,0},{255,10,1568},{255,135,1568},{31,203,0},{0,175,1568},{255,135,1568},{0,175,1568},{71,0,1568},{71,0,1568},{71,0,1568},{71,0,1568},{43,213,0},{43,213,0},{43,213,0},{43,126,0},{0,144,20}, +{0,144,20},{101,255,6066},{86,255,1980},{88,221,2353},{79,206,1670},{86,255,7408},{49,248,1615},{53,211,20},{43,176,2353},{0,230,5988},{0,179,1798},{129,255,2347},{110,255,24},{113,215,115},{103,203,302},{236,0,5419},{37,255,1568},{55,210,17},{0,179,1762},{254,112,5419},{0,179,1762},{86,255,1836},{86,255,1836},{86,255,1836},{80,193,1568},{61,255,1331},{54,209,17},{54,209,17},{49,151,115},{0,193,1281},{3,156,5},{108,253,0}, +{108,253,0},{108,253,0},{108,179,0},{196,0,1152},{63,201,0},{63,201,0},{9,156,0},{254,72,1152},{9,156,0},{255,37,1568},{110,255,20},{128,212,0},{40,212,0},{255,37,1568},{254,149,1568},{40,212,0},{0,184,1568},{254,149,1568},{0,184,1568},{80,0,1568},{80,0,1568},{80,0,1568},{80,0,1568},{52,222,0},{52,222,0},{52,222,0},{52,135,0},{0,159,1},{0,159,1},{110,255,6416},{95,255,2211},{96,229,2353}, +{86,213,1674},{95,255,7689},{58,254,1616},{61,219,20},{51,184,2353},{0,242,5820},{0,188,1701},{138,255,2502},{119,255,90},{121,223,115},{111,211,302},{248,0,5419},{52,255,1595},{63,218,17},{0,188,1700},{254,124,5419},{0,188,1700},{95,255,1922},{95,255,1922},{95,255,1922},{88,201,1568},{70,255,1414},{62,217,17},{62,217,17},{58,158,121},{0,205,1209},{11,164,5},{116,255,4},{116,255,4},{116,255,4},{116,187,0},{208,0,1152}, +{70,209,0},{70,209,0},{17,164,0},{254,84,1152},{17,164,0},{255,61,1568},{125,255,65},{136,220,0},{48,220,0},{255,61,1568},{254,161,1568},{48,220,0},{0,192,1568},{254,161,1568},{0,192,1568},{88,0,1568},{88,0,1568},{88,0,1568},{88,0,1568},{60,230,0},{60,230,0},{60,230,0},{60,143,0},{7,169,0},{7,169,0},{119,255,6786},{104,255,2504},{104,237,2353},{94,222,1676},{107,255,7985},{68,255,1665},{69,227,20}, +{59,192,2353},{0,254,5684},{0,197,1666},{147,255,2675},{128,255,216},{129,231,115},{119,219,302},{255,10,5419},{67,255,1665},{71,226,17},{0,197,1650},{255,135,5419},{0,197,1650},{101,255,2018},{101,255,2018},{101,255,2018},{96,209,1568},{82,255,1510},{70,224,17},{70,224,17},{66,166,121},{0,218,1163},{19,172,5},{125,255,17},{125,255,17},{125,255,17},{124,195,0},{220,0,1152},{78,217,0},{78,217,0},{25,172,0},{255,95,1152}, +{25,172,0},{255,86,1568},{140,255,136},{144,228,0},{56,228,0},{255,86,1568},{255,172,1568},{56,228,0},{0,200,1568},{255,172,1568},{0,200,1568},{96,0,1568},{96,0,1568},{96,0,1568},{96,0,1568},{68,238,0},{68,238,0},{68,238,0},{68,151,0},{15,177,0},{15,177,0},{129,255,7124},{116,255,2856},{112,245,2353},{102,230,1676},{116,255,8300},{79,255,1802},{77,235,20},{67,200,2353},{7,255,5788},{5,206,1665},{156,255,2866}, +{140,255,392},{137,239,115},{127,227,302},{255,34,5419},{82,255,1779},{79,234,17},{0,206,1612},{255,147,5419},{0,206,1612},{110,255,2124},{110,255,2124},{110,255,2124},{104,217,1568},{92,255,1608},{78,232,17},{78,232,17},{74,174,121},{1,231,1152},{27,180,5},{135,255,34},{135,255,34},{135,255,34},{132,203,0},{232,0,1152},{86,225,0},{86,225,0},{33,180,0},{255,107,1152},{33,180,0},{255,110,1568},{152,255,232},{152,236,0}, +{64,236,0},{255,110,1568},{255,184,1568},{64,236,0},{0,208,1568},{255,184,1568},{0,208,1568},{104,0,1568},{104,0,1568},{104,0,1568},{104,0,1568},{76,246,0},{76,246,0},{76,246,0},{76,159,0},{24,184,0},{24,184,0},{138,255,7586},{125,255,3321},{121,254,2353},{111,239,1676},{129,255,8636},{92,255,2092},{86,244,20},{78,208,2355},{28,255,6049},{14,215,1665},{168,255,3097},{152,255,659},{146,248,115},{136,236,302},{255,61,5419}, +{101,255,1977},{88,243,17},{0,216,1586},{254,161,5419},{0,216,1586},{122,255,2259},{122,255,2259},{122,255,2259},{113,226,1568},{101,255,1746},{87,241,17},{87,241,17},{83,183,121},{10,240,1152},{36,190,3},{147,255,72},{147,255,72},{147,255,72},{141,212,0},{245,0,1152},{95,234,0},{95,234,0},{42,189,0},{254,121,1152},{42,189,0},{255,137,1568},{167,255,373},{161,245,0},{73,245,0},{255,137,1568},{254,198,1568},{73,245,0}, +{0,217,1568},{254,198,1568},{0,217,1568},{113,0,1568},{113,0,1568},{113,0,1568},{113,0,1568},{85,254,0},{85,254,0},{85,254,0},{85,168,0},{33,193,0},{33,193,0},{147,255,8016},{134,255,3804},{129,255,2376},{119,247,1676},{138,255,8985},{104,255,2436},{94,252,20},{85,216,2370},{40,255,6353},{22,223,1665},{178,255,3291},{161,255,953},{156,255,117},{146,243,305},{255,86,5419},{119,255,2185},{96,251,17},{0,225,1572},{255,172,5419}, +{0,225,1572},{129,255,2372},{129,255,2372},{129,255,2372},{121,233,1568},{113,255,1890},{95,249,17},{95,249,17},{91,191,121},{18,248,1152},{44,198,3},{156,255,113},{156,255,113},{156,255,113},{149,220,0},{255,4,1152},{103,242,0},{103,242,0},{49,197,0},{255,132,1152},{49,197,0},{255,161,1568},{183,255,541},{169,253,0},{80,253,0},{255,161,1568},{254,210,1568},{80,253,0},{0,225,1568},{254,210,1568},{0,225,1568},{121,0,1568}, +{121,0,1568},{121,0,1568},{121,0,1568},{94,254,5},{94,254,5},{94,254,5},{93,176,0},{41,201,0},{41,201,0},{156,255,7638},{143,255,3881},{138,255,2514},{128,250,1620},{147,255,8460},{113,255,2285},{104,255,19},{94,222,1956},{58,255,5932},{34,228,1316},{184,255,2947},{171,255,961},{165,255,164},{152,246,206},{255,104,4803},{131,255,1925},{108,254,3},{6,230,1250},{255,181,4803},{6,230,1250},{138,255,2514},{138,255,2514},{138,255,2514}, +{129,241,1568},{122,255,2043},{104,255,19},{104,255,19},{99,199,121},{28,255,1153},{52,206,3},{165,255,164},{165,255,164},{165,255,164},{157,228,0},{255,28,1152},{111,250,0},{111,250,0},{57,205,0},{255,144,1152},{57,205,0},{255,177,1250},{195,255,461},{180,255,0},{101,255,0},{255,177,1250},{254,217,1250},{101,255,0},{0,230,1250},{254,217,1250},{0,230,1250},{129,0,1568},{129,0,1568},{129,0,1568},{129,0,1568},{104,255,18}, +{104,255,18},{104,255,18},{101,184,0},{49,209,0},{49,209,0},{165,255,7060},{152,255,3836},{147,255,2668},{137,253,1576},{156,255,7717},{122,255,2020},{113,255,57},{102,227,1470},{73,255,5307},{44,232,924},{193,255,2466},{180,255,865},{172,255,218},{162,250,98},{255,119,4056},{143,255,1557},{122,255,2},{22,234,882},{254,189,4056},{22,234,882},{147,255,2668},{147,255,2668},{147,255,2668},{137,249,1568},{132,255,2193},{113,255,57},{113,255,57}, +{107,207,121},{40,255,1185},{60,214,3},{172,255,218},{172,255,218},{172,255,218},{165,236,0},{255,52,1152},{122,255,2},{122,255,2},{65,213,0},{255,156,1152},{65,213,0},{255,189,882},{204,255,320},{192,255,0},{125,255,0},{255,189,882},{254,223,882},{125,255,0},{0,234,882},{254,223,882},{0,234,882},{137,0,1568},{137,0,1568},{137,0,1568},{137,0,1568},{113,255,41},{113,255,41},{113,255,41},{109,192,0},{57,217,0}, +{57,217,0},{172,255,6429},{161,255,3818},{156,255,2857},{146,255,1572},{165,255,6979},{134,255,1813},{125,255,166},{113,232,1015},{82,255,4731},{56,238,565},{199,255,2010},{189,255,787},{184,255,296},{173,252,26},{255,137,3318},{155,255,1221},{137,255,29},{41,238,545},{254,198,3318},{41,238,545},{156,255,2857},{156,255,2857},{156,255,2857},{146,255,1572},{141,255,2403},{125,255,166},{125,255,166},{116,216,121},{61,255,1273},{68,222,4},{184,255,296}, +{184,255,296},{184,255,296},{174,245,0},{255,79,1152},{137,255,29},{137,255,29},{74,222,0},{253,170,1152},{74,222,0},{255,201,545},{216,255,193},{205,255,0},{152,255,0},{255,201,545},{254,229,545},{152,255,0},{0,238,545},{254,229,545},{0,238,545},{146,0,1568},{146,0,1568},{146,0,1568},{146,0,1568},{122,255,80},{122,255,80},{122,255,80},{118,201,0},{66,226,0},{66,226,0},{178,255,5997},{168,255,3833},{165,255,3035}, +{155,255,1619},{172,255,6365},{143,255,1710},{134,255,324},{121,237,687},{101,255,4330},{66,242,321},{208,255,1673},{198,255,749},{193,255,377},{182,255,1},{255,152,2753},{167,255,989},{152,255,80},{57,242,313},{255,205,2753},{57,242,313},{165,255,3035},{165,255,3035},{165,255,3035},{155,255,1619},{153,255,2603},{134,255,324},{134,255,324},{124,224,121},{76,255,1395},{76,230,5},{193,255,377},{193,255,377},{193,255,377},{182,253,0},{255,104,1152}, +{152,255,80},{152,255,80},{82,230,0},{255,181,1152},{82,230,0},{255,213,313},{225,255,106},{217,255,0},{177,255,0},{255,213,313},{254,235,313},{177,255,0},{0,242,313},{254,235,313},{0,242,313},{154,0,1568},{154,0,1568},{154,0,1568},{154,0,1568},{132,255,117},{132,255,117},{132,255,117},{126,209,0},{74,234,0},{74,234,0},{187,255,5627},{178,255,3861},{175,255,3202},{164,255,1720},{178,255,5889},{152,255,1685},{146,255,532}, +{129,242,435},{116,255,3993},{79,246,146},{215,255,1382},{205,255,737},{202,255,468},{192,255,13},{255,171,2273},{180,255,850},{167,255,157},{74,246,145},{254,214,2273},{74,246,145},{175,255,3202},{175,255,3202},{175,255,3202},{164,255,1720},{162,255,2818},{146,255,532},{146,255,532},{132,232,121},{92,255,1584},{84,238,5},{202,255,468},{202,255,468},{202,255,468},{192,255,13},{255,128,1152},{167,255,157},{167,255,157},{90,238,0},{255,193,1152}, +{90,238,0},{255,225,145},{234,255,45},{229,255,0},{201,255,0},{255,225,145},{254,241,145},{201,255,0},{0,246,145},{254,241,145},{0,246,145},{162,0,1568},{162,0,1568},{162,0,1568},{162,0,1568},{141,255,170},{141,255,170},{141,255,170},{134,217,0},{80,243,0},{80,243,0},{193,255,5331},{187,255,3926},{184,255,3404},{174,255,1889},{187,255,5490},{161,255,1738},{155,255,798},{139,246,259},{128,255,3745},{88,251,41},{221,255,1182}, +{215,255,747},{211,255,569},{201,255,73},{255,186,1878},{192,255,746},{180,255,274},{90,250,41},{255,221,1878},{90,250,41},{184,255,3404},{184,255,3404},{184,255,3404},{174,255,1889},{172,255,3020},{155,255,798},{155,255,798},{140,240,121},{107,255,1798},{92,246,5},{211,255,569},{211,255,569},{211,255,569},{201,255,73},{255,152,1152},{180,255,274},{180,255,274},{98,246,0},{255,205,1152},{98,246,0},{255,237,41},{243,255,10},{241,255,0}, +{225,255,0},{255,237,41},{254,247,41},{225,255,0},{0,250,41},{254,247,41},{0,250,41},{170,0,1568},{170,0,1568},{170,0,1568},{170,0,1568},{150,255,233},{150,255,233},{150,255,233},{142,225,0},{88,251,0},{88,251,0},{202,255,5076},{196,255,4028},{193,255,3641},{183,255,2129},{196,255,5148},{174,255,1917},{167,255,1161},{147,251,148},{143,255,3577},{101,255,5},{230,255,1041},{224,255,789},{221,255,680},{210,255,205},{255,204,1536}, +{207,255,706},{198,255,424},{107,255,0},{255,230,1536},{107,255,0},{193,255,3641},{193,255,3641},{193,255,3641},{183,255,2129},{184,255,3299},{167,255,1161},{167,255,1161},{148,249,126},{125,255,2089},{101,255,5},{221,255,680},{221,255,680},{221,255,680},{210,255,205},{255,180,1152},{198,255,424},{198,255,424},{107,255,0},{255,218,1152},{107,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0}, +{0,255,0},{255,254,0},{0,255,0},{179,0,1568},{179,0,1568},{179,0,1568},{179,0,1568},{162,255,317},{162,255,317},{162,255,317},{151,234,0},{101,255,5},{101,255,5},{208,255,4372},{202,255,3532},{199,255,3225},{189,255,2017},{202,255,4324},{180,255,1693},{177,255,1093},{157,252,58},{155,255,2953},{116,255,34},{233,255,716},{230,255,545},{227,255,468},{219,255,137},{255,213,1067},{213,255,482},{207,255,289},{131,255,0},{254,235,1067}, +{131,255,0},{199,255,3225},{199,255,3225},{199,255,3225},{189,255,2017},{190,255,2819},{177,255,1093},{177,255,1093},{157,252,49},{137,255,1737},{116,255,34},{227,255,468},{227,255,468},{227,255,468},{219,255,137},{255,192,800},{207,255,289},{207,255,289},{131,255,0},{255,224,800},{131,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{187,0,1568}, +{187,0,1568},{187,0,1568},{187,0,1568},{172,255,394},{172,255,394},{172,255,394},{159,242,0},{116,255,34},{116,255,34},{215,255,3720},{208,255,3092},{205,255,2857},{198,255,1910},{208,255,3604},{189,255,1510},{183,255,1041},{165,254,10},{164,255,2420},{131,255,89},{239,255,456},{233,255,345},{233,255,296},{225,255,85},{255,219,683},{222,255,300},{216,255,180},{155,255,0},{254,238,683},{155,255,0},{205,255,2857},{205,255,2857},{205,255,2857}, +{198,255,1910},{196,255,2411},{183,255,1041},{183,255,1041},{167,253,8},{149,255,1449},{131,255,89},{233,255,296},{233,255,296},{233,255,296},{225,255,85},{255,204,512},{216,255,180},{216,255,180},{155,255,0},{255,230,512},{155,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{195,0,1568},{195,0,1568},{195,0,1568},{195,0,1568},{178,255,482}, +{178,255,482},{178,255,482},{167,250,0},{131,255,89},{131,255,89},{218,255,3170},{215,255,2701},{215,255,2532},{207,255,1825},{215,255,2956},{198,255,1373},{192,255,1013},{175,255,4},{167,255,2025},{143,255,169},{242,255,249},{239,255,189},{239,255,164},{234,255,45},{255,228,384},{231,255,162},{225,255,97},{180,255,0},{255,242,384},{180,255,0},{215,255,2532},{215,255,2532},{215,255,2532},{207,255,1825},{205,255,2070},{192,255,1013},{192,255,1013}, +{175,255,4},{161,255,1225},{143,255,169},{239,255,164},{239,255,164},{239,255,164},{234,255,45},{255,216,288},{225,255,97},{225,255,97},{180,255,0},{255,236,288},{180,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{203,0,1568},{203,0,1568},{203,0,1568},{203,0,1568},{187,255,585},{187,255,585},{187,255,585},{175,255,4},{143,255,169}, +{143,255,169},{0,210,2665},{0,147,274},{0,106,1},{0,90,985},{0,140,5885},{0,94,3649},{0,81,1742},{0,56,4398},{0,63,6341},{0,56,4722},{0,210,2665},{0,147,274},{0,106,1},{0,90,985},{69,0,5885},{0,94,3649},{0,81,1742},{0,56,4398},{140,0,5885},{0,56,4398},{0,101,0},{0,101,0},{0,101,0},{0,49,0},{0,49,545},{0,39,193},{0,39,193},{0,22,317},{0,21,593},{0,22,366},{0,101,0}, +{0,101,0},{0,101,0},{0,49,0},{24,0,545},{0,39,193},{0,39,193},{0,22,317},{49,0,545},{0,22,317},{103,0,2665},{0,147,274},{0,106,1},{0,90,985},{103,0,2665},{210,0,2665},{0,90,985},{0,69,2665},{210,0,2665},{0,69,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,234,2665},{0,162,169},{1,114,11}, +{0,99,850},{0,158,6669},{0,103,3898},{0,91,1770},{0,62,4826},{0,72,7238},{0,62,5226},{0,234,2665},{0,162,169},{2,115,9},{0,99,850},{78,0,6669},{0,103,3898},{0,91,1770},{0,62,4826},{158,0,6669},{0,62,4826},{0,125,0},{0,125,0},{0,125,0},{0,61,0},{0,61,841},{0,51,305},{0,51,305},{0,28,493},{0,27,917},{0,28,574},{0,125,0},{0,125,0},{0,125,0},{0,61,0},{30,0,841}, +{0,51,305},{0,51,305},{0,28,493},{61,0,841},{0,28,493},{115,0,2665},{0,162,169},{6,114,0},{0,99,850},{115,0,2665},{234,0,2665},{0,99,850},{0,77,2665},{234,0,2665},{0,77,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,255,2669},{0,175,80},{2,124,61},{0,108,725},{0,174,7538},{0,115,4178},{0,100,1832}, +{0,71,5294},{0,78,8238},{0,68,5786},{2,254,2669},{0,175,80},{4,123,53},{0,108,725},{85,0,7538},{0,115,4178},{0,100,1832},{0,71,5294},{174,0,7538},{0,71,5294},{0,149,0},{0,149,0},{0,149,0},{0,73,0},{0,73,1201},{0,60,442},{0,60,442},{0,34,709},{0,33,1313},{0,31,824},{0,149,0},{0,149,0},{0,149,0},{0,73,0},{36,0,1201},{0,60,442},{0,60,442},{0,34,709},{73,0,1201}, +{0,34,709},{127,0,2665},{0,175,80},{14,122,0},{0,108,725},{127,0,2665},{254,2,2665},{0,108,725},{0,85,2665},{254,2,2665},{0,85,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,255,2795},{0,190,29},{3,134,155},{0,117,610},{0,189,8493},{0,124,4485},{0,109,1922},{0,77,5810},{0,88,9310},{0,74,6402},{6,255,2761}, +{0,190,29},{6,134,133},{0,117,610},{92,0,8493},{0,124,4485},{0,109,1922},{0,77,5810},{189,0,8493},{0,77,5810},{0,174,0},{0,174,0},{0,174,0},{0,85,0},{0,85,1625},{0,69,605},{0,69,605},{0,40,965},{0,39,1781},{0,37,1120},{0,174,0},{0,174,0},{0,174,0},{0,85,0},{42,0,1625},{0,69,605},{0,69,605},{0,40,965},{85,0,1625},{0,40,965},{138,0,2665},{0,190,29},{22,130,0}, +{0,117,610},{138,0,2665},{254,14,2665},{0,117,610},{0,93,2665},{254,14,2665},{0,93,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{9,255,3139},{0,205,2},{5,145,311},{0,126,493},{0,207,9669},{0,135,4865},{0,118,2054},{0,83,6450},{0,94,10654},{0,80,7162},{12,255,3029},{0,205,2},{9,143,266},{0,126,493},{101,0,9669}, +{0,135,4865},{0,118,2054},{0,83,6450},{207,0,9669},{0,83,6450},{0,201,0},{0,201,0},{0,201,0},{0,98,0},{0,101,2178},{0,81,820},{0,81,820},{0,47,1322},{0,45,2392},{0,40,1521},{0,201,0},{0,201,0},{0,201,0},{0,98,0},{49,0,2178},{0,81,820},{0,81,820},{0,47,1322},{101,0,2178},{0,47,1322},{152,0,2665},{0,205,2},{30,139,0},{0,126,493},{152,0,2665},{255,27,2665},{0,126,493}, +{0,102,2665},{255,27,2665},{0,102,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{15,255,3483},{4,217,32},{10,153,429},{2,135,473},{0,231,9669},{0,150,4526},{0,127,1610},{0,93,6193},{0,106,10910},{0,90,7050},{24,255,3141},{8,213,2},{17,151,266},{2,135,469},{113,0,9669},{0,150,4526},{0,127,1610},{0,93,6193},{231,0,9669}, +{0,93,6193},{4,217,32},{4,217,32},{4,217,32},{4,108,32},{0,125,2178},{0,94,605},{0,94,605},{0,56,1165},{0,54,2517},{0,50,1457},{8,209,0},{8,209,0},{8,209,0},{8,106,0},{61,0,2178},{0,94,605},{0,94,605},{0,56,1165},{125,0,2178},{0,56,1165},{164,0,2665},{5,216,0},{38,147,0},{0,136,410},{164,0,2665},{255,39,2665},{0,136,410},{0,110,2665},{255,39,2665},{0,110,2665},{4,0,32}, +{4,0,32},{4,0,32},{4,0,32},{0,25,0},{0,25,0},{0,25,0},{0,12,0},{0,9,8},{0,9,8},{21,255,3971},{8,227,132},{15,161,623},{5,144,523},{0,255,9669},{0,162,4214},{0,139,1218},{0,102,5913},{0,118,11198},{0,96,6942},{33,255,3266},{16,222,1},{25,159,266},{10,143,469},{125,0,9669},{0,162,4214},{0,139,1218},{0,102,5913},{255,0,9669},{0,102,5913},{8,233,128},{8,233,128},{8,233,128}, +{8,118,128},{0,149,2178},{0,109,442},{0,109,442},{0,65,1018},{0,66,2669},{0,59,1419},{16,217,0},{16,217,0},{16,217,0},{16,114,0},{73,0,2178},{0,109,442},{0,109,442},{0,65,1018},{149,0,2178},{0,65,1018},{175,0,2665},{14,223,0},{46,155,0},{0,145,325},{175,0,2665},{254,51,2665},{0,145,325},{0,118,2665},{254,51,2665},{0,118,2665},{8,0,128},{8,0,128},{8,0,128},{8,0,128},{0,49,0}, +{0,49,0},{0,49,0},{0,24,0},{0,21,40},{0,21,40},{27,255,4603},{13,238,300},{19,171,891},{10,152,642},{6,255,9761},{0,175,3898},{0,148,882},{0,111,5645},{0,127,11511},{0,105,6861},{43,255,3390},{24,230,1},{33,167,266},{18,151,469},{137,0,9669},{0,175,3898},{0,148,882},{0,111,5645},{255,12,9669},{0,111,5645},{12,249,288},{12,249,288},{12,249,288},{12,128,288},{0,174,2178},{0,124,305},{0,124,305}, +{0,74,881},{0,75,2852},{0,68,1409},{24,225,0},{24,225,0},{24,225,0},{24,122,0},{85,0,2178},{0,124,305},{0,124,305},{0,74,881},{174,0,2178},{0,74,881},{187,0,2665},{22,231,0},{54,163,0},{0,154,250},{187,0,2665},{254,63,2665},{0,154,250},{0,126,2665},{254,63,2665},{0,126,2665},{12,0,288},{12,0,288},{12,0,288},{12,0,288},{0,73,0},{0,73,0},{0,73,0},{0,36,0},{0,30,97}, +{0,30,97},{36,255,5482},{17,251,574},{24,179,1282},{14,162,853},{15,255,10055},{0,190,3618},{0,160,569},{0,120,5354},{0,138,11902},{0,114,6807},{55,255,3569},{33,239,1},{42,176,266},{27,160,469},{150,0,9669},{0,190,3618},{0,160,569},{0,120,5354},{254,26,9669},{0,120,5354},{18,255,558},{18,255,558},{18,255,558},{16,139,545},{0,201,2178},{0,138,180},{0,138,180},{0,83,740},{0,88,3060},{0,78,1427},{33,233,0}, +{33,233,0},{33,233,0},{33,131,0},{98,0,2178},{0,138,180},{0,138,180},{0,83,740},{201,0,2178},{0,83,740},{201,0,2665},{31,240,0},{63,172,0},{0,166,180},{201,0,2665},{255,76,2665},{0,166,180},{0,135,2665},{255,76,2665},{0,135,2665},{16,0,545},{16,0,545},{16,0,545},{16,0,545},{0,101,0},{0,101,0},{0,101,0},{0,49,0},{0,39,193},{0,39,193},{43,255,6378},{24,255,915},{29,187,1710}, +{18,172,1113},{21,255,10495},{0,205,3401},{0,169,353},{0,126,5126},{0,150,12278},{0,123,6786},{64,255,3738},{41,246,2},{50,183,259},{35,168,469},{162,0,9669},{0,205,3401},{0,169,353},{0,126,5126},{254,38,9669},{0,126,5126},{24,255,914},{24,255,914},{24,255,914},{20,149,841},{0,225,2178},{0,153,97},{0,153,97},{0,93,637},{0,100,3300},{0,88,1469},{41,241,0},{41,241,0},{41,241,0},{41,139,0},{110,0,2178}, +{0,153,97},{0,153,97},{0,93,637},{225,0,2178},{0,93,637},{213,0,2665},{38,249,0},{71,180,0},{0,173,130},{213,0,2665},{254,88,2665},{0,173,130},{0,143,2665},{254,88,2665},{0,143,2665},{20,0,841},{20,0,841},{20,0,841},{20,0,841},{0,125,0},{0,125,0},{0,125,0},{0,61,0},{0,51,305},{0,51,305},{49,255,7446},{30,255,1431},{33,197,2210},{22,179,1438},{30,255,11102},{0,218,3189},{0,182,185}, +{0,136,4909},{0,162,12686},{0,130,6797},{73,255,3925},{49,254,2},{57,193,258},{43,176,469},{174,0,9669},{0,218,3189},{0,182,185},{0,136,4909},{255,49,9669},{0,136,4909},{27,255,1382},{27,255,1382},{27,255,1382},{24,159,1201},{0,249,2178},{0,168,40},{0,168,40},{0,102,530},{0,109,3565},{0,94,1537},{49,249,0},{49,249,0},{49,249,0},{49,147,0},{122,0,2178},{0,168,40},{0,168,40},{0,102,530},{249,0,2178}, +{0,102,530},{224,0,2665},{46,255,1},{79,188,0},{0,182,85},{224,0,2665},{254,100,2665},{0,182,85},{0,151,2665},{254,100,2665},{0,151,2665},{24,0,1201},{24,0,1201},{24,0,1201},{24,0,1201},{0,149,0},{0,149,0},{0,149,0},{0,73,0},{0,60,442},{0,60,442},{55,255,8658},{36,255,2131},{38,205,2786},{27,188,1837},{36,255,11866},{0,230,3029},{0,191,75},{0,145,4685},{0,172,13066},{0,139,6826},{86,255,4118}, +{58,255,26},{65,201,258},{51,184,469},{186,0,9669},{0,230,3029},{0,191,75},{0,145,4685},{255,61,9669},{0,145,4685},{33,255,1954},{33,255,1954},{33,255,1954},{28,169,1625},{3,255,2219},{0,181,5},{0,181,5},{0,111,433},{0,121,3861},{0,103,1633},{57,254,1},{57,254,1},{57,254,1},{57,155,0},{134,0,2178},{0,181,5},{0,181,5},{0,111,433},{255,9,2178},{0,111,433},{236,0,2665},{61,255,20},{87,196,0}, +{0,191,50},{236,0,2665},{254,112,2665},{0,191,50},{0,159,2665},{254,112,2665},{0,159,2665},{28,0,1625},{28,0,1625},{28,0,1625},{28,0,1625},{0,174,0},{0,174,0},{0,174,0},{0,85,0},{0,69,605},{0,69,605},{61,255,10195},{43,255,3100},{43,216,3523},{31,198,2356},{43,255,12883},{0,245,2885},{0,203,20},{0,157,4450},{0,184,13589},{0,148,6898},{95,255,4346},{70,255,117},{74,210,258},{60,193,469},{199,0,9669}, +{0,245,2885},{0,203,20},{0,157,4450},{254,75,9669},{0,157,4450},{39,255,2734},{39,255,2734},{39,255,2734},{33,180,2178},{12,255,2420},{1,196,2},{1,196,2},{0,123,337},{0,132,4227},{0,112,1777},{67,255,10},{67,255,10},{67,255,10},{66,164,0},{147,0,2178},{4,194,0},{4,194,0},{0,123,337},{254,23,2178},{0,123,337},{250,0,2665},{76,255,73},{96,205,0},{0,203,20},{250,0,2665},{255,125,2665},{0,203,20}, +{0,168,2665},{255,125,2665},{0,168,2665},{33,0,2178},{33,0,2178},{33,0,2178},{33,0,2178},{0,201,0},{0,201,0},{0,201,0},{0,98,0},{0,81,820},{0,81,820},{67,255,11582},{49,255,4083},{48,224,4162},{36,206,2818},{49,255,13898},{1,255,2805},{2,212,20},{0,163,4255},{0,196,13958},{0,157,6886},{104,255,4577},{79,255,259},{82,218,258},{68,201,469},{211,0,9669},{1,255,2805},{4,211,17},{0,163,4254},{255,86,9669}, +{0,163,4254},{46,255,3434},{46,255,3434},{46,255,3434},{37,190,2665},{18,255,2709},{3,210,17},{3,210,17},{0,130,270},{0,141,4491},{0,121,1854},{76,255,29},{76,255,29},{76,255,29},{74,172,0},{159,0,2178},{12,202,0},{12,202,0},{0,130,269},{254,35,2178},{0,130,269},{255,13,2665},{92,255,157},{104,213,0},{0,212,5},{255,13,2665},{254,137,2665},{0,212,5},{0,176,2665},{254,137,2665},{0,176,2665},{37,0,2665}, +{37,0,2665},{37,0,2665},{37,0,2665},{1,223,0},{1,223,0},{1,223,0},{1,110,0},{0,91,953},{0,91,953},{79,255,12086},{58,255,4502},{56,232,4162},{44,214,2818},{61,255,14298},{10,255,2910},{10,220,20},{0,173,4166},{0,208,13470},{0,166,6215},{113,255,4826},{89,255,465},{90,226,258},{78,208,474},{223,0,9669},{10,255,2909},{12,219,17},{0,173,4085},{255,98,9669},{0,173,4085},{55,255,3574},{55,255,3574},{55,255,3574}, +{46,197,2665},{27,255,2840},{11,218,17},{11,218,17},{4,140,258},{0,156,4142},{0,133,1430},{86,255,52},{86,255,52},{86,255,52},{82,180,0},{171,0,2178},{20,210,0},{20,210,0},{0,139,202},{255,46,2178},{0,139,202},{255,37,2665},{107,255,260},{112,221,0},{0,220,1},{255,37,2665},{254,149,2665},{0,220,1},{0,184,2665},{254,149,2665},{0,184,2665},{45,0,2665},{45,0,2665},{45,0,2665},{45,0,2665},{9,231,0}, +{9,231,0},{9,231,0},{9,118,0},{0,103,745},{0,103,745},{86,255,12542},{67,255,4983},{64,240,4162},{52,222,2818},{70,255,14719},{22,255,3118},{18,228,20},{5,181,4162},{0,221,12955},{0,176,5593},{125,255,5090},{101,255,713},{98,234,258},{84,218,481},{235,0,9669},{28,255,3073},{20,227,17},{0,182,3909},{255,110,9669},{0,182,3909},{64,255,3726},{64,255,3726},{64,255,3726},{54,205,2665},{36,255,2989},{19,226,17},{19,226,17}, +{12,148,258},{0,172,3797},{0,142,1062},{95,255,89},{95,255,89},{95,255,89},{90,188,0},{183,0,2178},{28,218,0},{28,218,0},{0,148,145},{255,58,2178},{0,148,145},{255,61,2665},{119,255,388},{120,229,0},{5,229,0},{255,61,2665},{254,161,2665},{5,229,0},{0,192,2665},{254,161,2665},{0,192,2665},{53,0,2665},{53,0,2665},{53,0,2665},{53,0,2665},{17,239,0},{17,239,0},{17,239,0},{17,126,0},{0,118,562}, +{0,118,562},{98,255,13154},{79,255,5593},{73,249,4162},{61,231,2818},{86,255,15194},{34,255,3462},{27,237,20},{14,190,4162},{0,236,12478},{0,188,4983},{135,255,5365},{113,255,1062},{107,243,258},{93,227,481},{248,0,9669},{40,255,3330},{29,236,17},{0,191,3726},{254,124,9669},{0,191,3726},{73,255,3909},{73,255,3909},{73,255,3909},{63,214,2665},{46,255,3156},{28,235,17},{28,235,17},{21,157,258},{0,184,3462},{0,154,713},{107,255,145}, +{107,255,145},{107,255,145},{99,197,0},{196,0,2178},{37,227,0},{37,227,0},{0,160,89},{254,72,2178},{0,160,89},{255,89,2665},{137,255,562},{129,238,0},{14,238,0},{255,89,2665},{254,174,2665},{14,238,0},{0,201,2665},{254,174,2665},{0,201,2665},{62,0,2665},{62,0,2665},{62,0,2665},{62,0,2665},{26,248,0},{26,248,0},{26,248,0},{26,135,0},{0,135,388},{0,135,388},{107,255,13718},{89,255,6215},{82,255,4166}, +{69,239,2818},{92,255,15614},{46,255,3885},{35,245,20},{22,198,4162},{0,248,12086},{0,197,4502},{144,255,5658},{122,255,1430},{115,251,258},{101,235,481},{255,10,9669},{61,255,3601},{37,244,17},{0,200,3574},{255,135,9669},{0,200,3574},{82,255,4085},{82,255,4085},{82,255,4085},{71,222,2665},{58,255,3332},{36,242,17},{36,242,17},{29,165,258},{0,196,3206},{0,163,465},{116,255,202},{116,255,202},{116,255,202},{107,205,0},{208,0,2178}, +{44,235,0},{44,235,0},{0,169,52},{254,84,2178},{0,169,52},{255,113,2665},{152,255,745},{137,246,0},{22,246,0},{255,113,2665},{254,186,2665},{22,246,0},{0,209,2665},{254,186,2665},{0,209,2665},{70,0,2665},{70,0,2665},{70,0,2665},{70,0,2665},{34,253,1},{34,253,1},{34,253,1},{34,143,0},{0,147,260},{0,147,260},{116,255,14302},{98,255,6886},{89,255,4255},{77,247,2818},{104,255,16094},{55,255,4382},{43,253,20}, +{30,206,4162},{0,254,11806},{0,206,4083},{153,255,5969},{134,255,1854},{125,255,270},{109,243,481},{255,34,9669},{76,255,3905},{45,252,17},{0,209,3434},{255,147,9669},{0,209,3434},{89,255,4254},{89,255,4254},{89,255,4254},{79,230,2665},{67,255,3525},{44,250,17},{44,250,17},{37,173,258},{0,211,2979},{0,176,259},{125,255,269},{125,255,269},{125,255,269},{115,213,0},{220,0,2178},{52,243,0},{52,243,0},{0,179,29},{255,95,2178}, +{0,179,29},{255,137,2665},{164,255,953},{145,254,0},{30,254,0},{255,137,2665},{254,198,2665},{30,254,0},{0,217,2665},{254,198,2665},{0,217,2665},{78,0,2665},{78,0,2665},{78,0,2665},{78,0,2665},{43,255,5},{43,255,5},{43,255,5},{42,150,0},{0,162,157},{0,162,157},{122,255,13635},{107,255,6898},{98,255,4450},{86,250,2739},{110,255,15195},{67,255,4071},{52,255,20},{39,212,3523},{1,255,10735},{0,212,3100},{162,255,5381}, +{143,255,1777},{132,255,337},{118,246,331},{255,52,8712},{82,255,3492},{59,254,2},{0,216,2734},{255,156,8712},{0,216,2734},{98,255,4450},{98,255,4450},{98,255,4450},{87,238,2665},{76,255,3736},{52,255,20},{52,255,20},{45,181,258},{0,224,2757},{0,185,117},{132,255,337},{132,255,337},{132,255,337},{123,221,0},{232,0,2178},{60,251,0},{60,251,0},{0,188,10},{255,107,2178},{0,188,10},{255,152,2178},{174,255,820},{156,255,0}, +{52,255,0},{255,152,2178},{255,205,2178},{52,255,0},{0,222,2178},{255,205,2178},{0,222,2178},{86,0,2665},{86,0,2665},{86,0,2665},{86,0,2665},{52,255,20},{52,255,20},{52,255,20},{50,158,0},{0,178,73},{0,178,73},{132,255,12678},{116,255,6826},{110,255,4685},{95,253,2678},{119,255,14061},{76,255,3663},{64,255,75},{49,216,2786},{10,255,9739},{0,219,2131},{172,255,4629},{152,255,1633},{144,255,433},{129,248,179},{255,70,7578}, +{101,255,2949},{73,255,5},{0,222,1954},{255,165,7578},{0,222,1954},{110,255,4685},{110,255,4685},{110,255,4685},{96,247,2665},{89,255,3960},{64,255,75},{64,255,75},{54,190,258},{0,239,2571},{0,197,26},{144,255,433},{144,255,433},{144,255,433},{132,230,0},{245,0,2178},{73,255,5},{73,255,5},{0,197,1},{254,121,2178},{0,197,1},{255,164,1625},{186,255,605},{170,255,0},{79,255,0},{255,164,1625},{255,211,1625},{79,255,0}, +{0,226,1625},{255,211,1625},{0,226,1625},{95,0,2665},{95,0,2665},{95,0,2665},{95,0,2665},{64,255,50},{64,255,50},{64,255,50},{59,167,0},{0,193,20},{0,193,20},{138,255,11970},{125,255,6797},{119,255,4909},{104,255,2665},{129,255,13086},{82,255,3411},{73,255,185},{57,221,2210},{22,255,8987},{0,225,1431},{178,255,4049},{161,255,1537},{153,255,530},{137,250,83},{255,86,6661},{113,255,2525},{86,255,40},{0,225,1382},{255,172,6661}, +{0,225,1382},{119,255,4909},{119,255,4909},{119,255,4909},{104,255,2665},{98,255,4197},{73,255,185},{73,255,185},{62,198,258},{0,251,2435},{1,206,2},{153,255,530},{153,255,530},{153,255,530},{140,238,0},{255,4,2178},{86,255,40},{86,255,40},{4,206,0},{255,132,2178},{4,206,0},{255,177,1201},{195,255,442},{181,255,0},{104,255,0},{255,177,1201},{254,217,1201},{104,255,0},{0,230,1201},{254,217,1201},{0,230,1201},{103,0,2665}, +{103,0,2665},{103,0,2665},{103,0,2665},{73,255,85},{73,255,85},{73,255,85},{67,175,0},{0,208,1},{0,208,1},{147,255,11330},{132,255,6786},{129,255,5126},{113,255,2694},{135,255,12250},{95,255,3225},{86,255,353},{67,225,1710},{37,255,8326},{0,231,915},{184,255,3541},{167,255,1469},{162,255,637},{146,253,24},{255,104,5829},{125,255,2165},{101,255,97},{0,231,914},{255,181,5829},{0,231,914},{129,255,5126},{129,255,5126},{129,255,5126}, +{113,255,2694},{107,255,4452},{86,255,353},{86,255,353},{72,205,259},{1,255,2421},{9,214,2},{162,255,637},{162,255,637},{162,255,637},{148,245,0},{255,28,2178},{101,255,97},{101,255,97},{12,214,0},{255,144,2178},{12,214,0},{255,189,841},{204,255,305},{193,255,0},{128,255,0},{255,189,841},{254,223,841},{128,255,0},{0,234,841},{254,223,841},{0,234,841},{111,0,2665},{111,0,2665},{111,0,2665},{111,0,2665},{82,255,130}, +{82,255,130},{82,255,130},{75,183,0},{6,217,0},{6,217,0},{153,255,10758},{141,255,6807},{135,255,5354},{122,255,2777},{144,255,11503},{104,255,3102},{95,255,569},{75,230,1282},{49,255,7825},{3,237,574},{190,255,3105},{177,255,1427},{172,255,740},{156,254,1},{255,119,5082},{137,255,1869},{116,255,180},{0,237,558},{254,189,5082},{0,237,558},{135,255,5354},{135,255,5354},{135,255,5354},{122,255,2777},{119,255,4724},{95,255,569},{95,255,569}, +{79,213,266},{16,255,2587},{16,222,1},{172,255,740},{172,255,740},{172,255,740},{156,253,0},{255,52,2178},{116,255,180},{116,255,180},{20,222,0},{255,156,2178},{20,222,0},{255,201,545},{216,255,193},{205,255,0},{152,255,0},{255,201,545},{254,229,545},{152,255,0},{0,238,545},{254,229,545},{0,238,545},{119,0,2665},{119,0,2665},{119,0,2665},{119,0,2665},{89,255,180},{89,255,180},{89,255,180},{83,191,0},{15,224,0}, +{15,224,0},{162,255,10197},{150,255,6861},{144,255,5645},{131,255,2933},{153,255,10765},{116,255,3051},{107,255,882},{84,236,891},{64,255,7297},{17,242,300},{199,255,2694},{186,255,1409},{181,255,881},{167,255,20},{255,137,4344},{152,255,1611},{131,255,305},{4,243,288},{254,198,4344},{4,243,288},{144,255,5645},{144,255,5645},{144,255,5645},{131,255,2933},{129,255,5005},{107,255,882},{107,255,882},{88,222,266},{34,255,2824},{25,231,1},{181,255,881}, +{181,255,881},{181,255,881},{167,255,20},{255,79,2178},{131,255,305},{131,255,305},{28,231,0},{253,170,2178},{28,231,0},{255,216,288},{225,255,97},{218,255,0},{180,255,0},{255,216,288},{255,236,288},{180,255,0},{0,243,288},{255,236,288},{0,243,288},{128,0,2665},{128,0,2665},{128,0,2665},{128,0,2665},{101,255,250},{101,255,250},{101,255,250},{92,200,0},{24,233,0},{24,233,0},{172,255,9731},{159,255,6942},{153,255,5913}, +{140,255,3130},{162,255,10204},{125,255,3090},{116,255,1218},{94,240,623},{79,255,6924},{27,246,132},{205,255,2402},{196,255,1419},{190,255,1018},{177,255,97},{255,152,3779},{164,255,1451},{146,255,442},{20,247,128},{255,205,3779},{20,247,128},{153,255,5913},{153,255,5913},{153,255,5913},{140,255,3130},{138,255,5304},{116,255,1218},{116,255,1218},{96,230,266},{49,255,3115},{33,239,1},{190,255,1018},{190,255,1018},{190,255,1018},{177,255,97},{255,104,2178}, +{146,255,442},{146,255,442},{36,239,0},{255,181,2178},{36,239,0},{255,228,128},{234,255,40},{230,255,0},{204,255,0},{255,228,128},{255,242,128},{204,255,0},{0,247,128},{255,242,128},{0,247,128},{136,0,2665},{136,0,2665},{136,0,2665},{136,0,2665},{110,255,325},{110,255,325},{110,255,325},{100,208,0},{32,241,0},{32,241,0},{175,255,9359},{165,255,7050},{162,255,6193},{149,255,3381},{172,255,9691},{134,255,3207},{128,255,1610}, +{102,245,429},{92,255,6719},{38,251,32},{215,255,2156},{205,255,1457},{199,255,1165},{186,255,221},{255,171,3299},{177,255,1398},{161,255,605},{36,251,32},{254,214,3299},{36,251,32},{162,255,6193},{162,255,6193},{162,255,6193},{149,255,3381},{147,255,5621},{128,255,1610},{128,255,1610},{104,238,266},{67,255,3419},{41,247,2},{199,255,1165},{199,255,1165},{199,255,1165},{186,255,221},{255,128,2178},{161,255,605},{161,255,605},{44,247,0},{255,193,2178}, +{44,247,0},{255,240,32},{246,255,8},{242,255,0},{228,255,0},{255,240,32},{255,248,32},{228,255,0},{0,251,32},{255,248,32},{0,251,32},{144,0,2665},{144,0,2665},{144,0,2665},{144,0,2665},{119,255,410},{119,255,410},{119,255,410},{108,216,0},{39,250,0},{39,250,0},{184,255,9067},{175,255,7162},{172,255,6450},{158,255,3686},{175,255,9268},{146,255,3399},{137,255,2054},{110,250,311},{107,255,6532},{49,255,2},{221,255,1992}, +{211,255,1521},{208,255,1322},{195,255,397},{255,186,2904},{189,255,1366},{174,255,820},{52,255,0},{255,221,2904},{52,255,0},{172,255,6450},{172,255,6450},{172,255,6450},{158,255,3686},{159,255,5949},{137,255,2054},{137,255,2054},{112,246,266},{82,255,3765},{49,255,2},{208,255,1322},{208,255,1322},{208,255,1322},{195,255,397},{255,152,2178},{174,255,820},{174,255,820},{52,255,0},{255,205,2178},{52,255,0},{255,252,0},{255,254,0},{254,255,0}, +{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{152,0,2665},{152,0,2665},{152,0,2665},{152,0,2665},{129,255,493},{129,255,493},{129,255,493},{116,224,0},{49,255,2},{49,255,2},{190,255,7987},{181,255,6402},{178,255,5810},{167,255,3509},{184,255,7999},{155,255,3048},{146,255,1922},{121,252,155},{119,255,5562},{64,255,29},{224,255,1476},{218,255,1120},{215,255,965},{204,255,292},{255,195,2166}, +{198,255,1009},{186,255,605},{79,255,0},{254,226,2166},{79,255,0},{178,255,5810},{178,255,5810},{178,255,5810},{167,255,3509},{165,255,5209},{146,255,1922},{146,255,1922},{121,249,133},{95,255,3258},{64,255,29},{215,255,965},{215,255,965},{215,255,965},{204,255,292},{255,164,1625},{186,255,605},{186,255,605},{79,255,0},{255,211,1625},{79,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0}, +{0,255,0},{255,254,0},{0,255,0},{161,0,2665},{161,0,2665},{161,0,2665},{161,0,2665},{138,255,610},{138,255,610},{138,255,610},{125,233,0},{64,255,29},{64,255,29},{196,255,7111},{187,255,5786},{184,255,5294},{174,255,3381},{187,255,6982},{161,255,2780},{155,255,1832},{131,253,61},{128,255,4795},{79,255,80},{230,255,1088},{224,255,824},{221,255,709},{210,255,212},{255,204,1601},{204,255,737},{195,255,442},{104,255,0},{255,230,1601}, +{104,255,0},{184,255,5294},{184,255,5294},{184,255,5294},{174,255,3381},{172,255,4582},{155,255,1832},{155,255,1832},{132,251,53},{107,255,2834},{79,255,80},{221,255,709},{221,255,709},{221,255,709},{210,255,212},{255,177,1201},{195,255,442},{195,255,442},{104,255,0},{254,217,1201},{104,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{169,0,2665}, +{169,0,2665},{169,0,2665},{169,0,2665},{147,255,725},{147,255,725},{147,255,725},{133,241,0},{79,255,80},{79,255,80},{202,255,6315},{193,255,5226},{190,255,4826},{180,255,3253},{193,255,6066},{167,255,2568},{164,255,1770},{141,254,11},{137,255,4122},{92,255,169},{233,255,753},{227,255,574},{227,255,493},{219,255,146},{255,210,1121},{213,255,507},{204,255,305},{128,255,0},{255,233,1121},{128,255,0},{190,255,4826},{190,255,4826},{190,255,4826}, +{180,255,3253},{181,255,4065},{164,255,1770},{164,255,1770},{140,253,9},{119,255,2474},{92,255,169},{227,255,493},{227,255,493},{227,255,493},{219,255,146},{255,189,841},{204,255,305},{204,255,305},{128,255,0},{254,223,841},{128,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{177,0,2665},{177,0,2665},{177,0,2665},{177,0,2665},{156,255,850}, +{156,255,850},{156,255,850},{141,249,0},{92,255,169},{92,255,169},{208,255,5599},{199,255,4722},{199,255,4398},{189,255,3130},{199,255,5254},{177,255,2395},{171,255,1742},{149,255,1},{149,255,3538},{107,255,274},{236,255,484},{233,255,366},{233,255,317},{225,255,90},{255,219,726},{222,255,321},{216,255,193},{152,255,0},{254,238,726},{152,255,0},{199,255,4398},{199,255,4398},{199,255,4398},{189,255,3130},{187,255,3613},{171,255,1742},{171,255,1742}, +{149,255,1},{131,255,2178},{107,255,274},{233,255,317},{233,255,317},{233,255,317},{225,255,90},{255,201,545},{216,255,193},{216,255,193},{152,255,0},{254,229,545},{152,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{185,0,2665},{185,0,2665},{185,0,2665},{185,0,2665},{165,255,985},{165,255,985},{165,255,985},{149,255,1},{107,255,274}, +{107,255,274},{43,255,50657},{1,255,1974},{0,182,128},{0,176,4572},{36,255,59540},{0,242,19268},{0,176,7306},{0,160,23941},{0,187,65535},{0,148,40590},{21,255,10267},{0,248,1412},{0,179,137},{0,148,3929},{115,0,18065},{0,153,12036},{0,139,6077},{0,93,14060},{234,0,18065},{0,93,14060},{0,143,0},{0,143,0},{0,143,0},{0,70,0},{0,70,1105},{0,57,405},{0,57,405},{0,34,653},{0,33,1209},{0,31,756},{0,143,0}, +{0,143,0},{0,143,0},{0,70,0},{35,0,1105},{0,57,405},{0,57,405},{0,34,653},{70,0,1105},{0,34,653},{171,0,9248},{0,248,1412},{0,179,137},{0,148,3929},{171,0,9248},{255,46,9248},{0,148,3929},{0,115,9248},{255,46,9248},{0,115,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{43,255,53600},{4,255,2885},{0,191,38}, +{0,185,3941},{43,255,62123},{0,254,18376},{0,182,6726},{0,169,23131},{0,196,65535},{0,154,40086},{27,255,10859},{0,254,1184},{0,188,45},{0,157,3656},{122,0,19334},{0,162,12449},{0,145,6089},{0,102,14754},{249,0,19334},{0,102,14754},{0,167,0},{0,167,0},{0,167,0},{0,82,0},{0,82,1513},{0,66,562},{0,66,562},{0,37,900},{0,36,1658},{0,37,1044},{0,167,0},{0,167,0},{0,167,0},{0,82,0},{41,0,1513}, +{0,66,562},{0,66,562},{0,37,900},{82,0,1513},{0,37,900},{183,0,9248},{0,254,1184},{0,188,45},{0,157,3656},{183,0,9248},{255,58,9248},{0,157,3656},{0,123,9248},{255,58,9248},{0,123,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{46,255,56765},{7,255,4404},{0,199,3},{0,194,3404},{43,255,64774},{1,255,17986},{0,191,6229}, +{0,176,22449},{0,215,65535},{0,160,39678},{33,255,11587},{1,255,1171},{0,199,4},{0,166,3393},{129,0,20689},{0,172,12834},{0,154,6125},{0,108,15490},{254,5,20689},{0,108,15490},{0,192,0},{0,192,0},{0,192,0},{0,94,0},{0,95,1985},{0,75,745},{0,75,745},{0,44,1202},{0,42,2178},{0,40,1374},{0,192,0},{0,192,0},{0,192,0},{0,94,0},{46,0,1985},{0,75,745},{0,75,745},{0,44,1202},{95,0,1985}, +{0,44,1202},{195,0,9248},{1,255,1170},{0,199,4},{0,166,3393},{195,0,9248},{255,70,9248},{0,166,3393},{0,131,9248},{255,70,9248},{0,131,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{49,255,58131},{7,255,6200},{0,207,6},{0,203,2858},{46,255,65535},{1,255,17772},{0,200,5638},{0,182,21148},{0,215,63337},{0,166,38166},{43,255,12449}, +{1,255,1395},{1,208,6},{0,176,3170},{138,0,22129},{0,184,13298},{0,163,6189},{0,114,16274},{254,14,22129},{0,114,16274},{0,216,0},{0,216,0},{0,216,0},{0,106,0},{0,107,2521},{0,88,928},{0,88,928},{0,50,1530},{0,48,2770},{0,47,1762},{0,216,0},{0,216,0},{0,216,0},{0,106,0},{52,0,2521},{0,88,928},{0,88,928},{0,50,1530},{107,0,2521},{0,50,1530},{207,0,9248},{7,255,1378},{5,207,0}, +{0,176,3170},{207,0,9248},{255,82,9248},{0,176,3170},{0,139,9248},{255,82,9248},{0,139,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{55,255,58853},{10,255,8410},{0,216,47},{0,212,2312},{52,255,65535},{4,255,18024},{0,209,5015},{0,191,19619},{0,224,60697},{0,176,36050},{46,255,13542},{7,255,1877},{4,217,53},{0,185,2897},{147,0,23851}, +{0,196,13856},{0,173,6281},{0,120,17216},{254,23,23851},{0,120,17216},{0,243,0},{0,243,0},{0,243,0},{0,119,0},{0,122,3200},{0,97,1186},{0,97,1186},{0,56,1945},{0,54,3521},{0,53,2243},{0,243,0},{0,243,0},{0,243,0},{0,119,0},{60,0,3200},{0,97,1186},{0,97,1186},{0,56,1945},{122,0,3200},{0,56,1945},{220,0,9248},{22,255,1693},{14,216,0},{0,185,2897},{220,0,9248},{255,95,9248},{0,185,2897}, +{0,148,9248},{255,95,9248},{0,148,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{58,255,59395},{13,255,10486},{0,225,107},{0,219,1933},{55,255,65535},{7,255,18658},{0,215,4619},{0,200,18436},{0,233,58566},{0,182,34489},{52,255,14690},{13,255,2489},{6,228,133},{0,194,2664},{155,0,25472},{0,208,14384},{0,182,6401},{0,126,18104},{255,30,25472}, +{0,126,18104},{0,255,16},{0,255,16},{0,255,16},{0,131,0},{0,134,3872},{0,106,1445},{0,106,1445},{0,62,2357},{0,60,4265},{0,56,2717},{2,254,13},{2,254,13},{2,254,13},{0,131,0},{66,0,3872},{0,106,1445},{0,106,1445},{0,62,2357},{134,0,3872},{0,62,2357},{232,0,9248},{37,255,2000},{22,224,0},{0,194,2664},{232,0,9248},{255,107,9248},{0,194,2664},{0,156,9248},{255,107,9248},{0,156,9248},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{61,255,59976},{16,255,12621},{2,233,174},{0,228,1613},{58,255,65535},{10,255,19459},{0,224,4093},{0,206,17181},{0,242,56514},{0,188,32973},{58,255,15746},{19,255,3205},{10,235,217},{0,206,2444},{164,0,26744},{0,218,14587},{0,191,6305},{0,136,18737},{255,39,26744},{0,136,18737},{3,255,110},{3,255,110},{3,255,110}, +{1,142,2},{0,149,4418},{0,118,1585},{0,118,1585},{0,68,2633},{0,66,4909},{0,62,3077},{6,255,80},{6,255,80},{6,255,80},{2,142,0},{73,0,4418},{0,118,1585},{0,118,1585},{0,68,2633},{149,0,4418},{0,68,2633},{244,0,9248},{49,255,2377},{30,232,0},{0,206,2440},{244,0,9248},{255,119,9248},{0,206,2440},{0,164,9248},{255,119,9248},{0,164,9248},{1,0,2},{1,0,2},{1,0,2},{1,0,2},{0,7,0}, +{0,7,0},{0,7,0},{0,3,0},{0,3,0},{0,3,0},{67,255,60796},{19,255,14846},{3,240,286},{0,234,1405},{64,255,65535},{13,255,20226},{0,233,3321},{0,212,15538},{0,254,54317},{0,197,31240},{67,255,16195},{31,255,3805},{18,243,217},{0,212,2328},{175,0,26744},{0,230,14051},{0,200,5525},{0,142,18273},{254,51,26744},{0,142,18273},{9,255,278},{9,255,278},{9,255,278},{5,152,50},{0,174,4418},{0,129,1313},{0,129,1313}, +{0,77,2410},{0,75,5092},{0,71,2987},{15,255,125},{15,255,125},{15,255,125},{10,150,0},{85,0,4418},{0,129,1313},{0,129,1313},{0,77,2410},{174,0,4418},{0,77,2410},{255,1,9248},{64,255,2738},{37,240,0},{0,212,2228},{255,1,9248},{254,131,9248},{0,212,2228},{0,172,9248},{254,131,9248},{0,172,9248},{5,0,50},{5,0,50},{5,0,50},{5,0,50},{0,31,0},{0,31,0},{0,31,0},{0,15,0},{0,12,13}, +{0,12,13},{70,255,61549},{25,255,17357},{4,250,459},{1,244,1256},{70,255,65535},{16,255,21346},{0,242,2603},{0,225,13862},{0,254,52221},{0,206,29474},{79,255,16720},{43,255,4545},{27,252,217},{7,223,2341},{189,0,26744},{0,245,13481},{0,212,4710},{0,154,17762},{255,64,26744},{0,154,17762},{15,255,602},{15,255,602},{15,255,602},{10,163,181},{0,201,4418},{0,147,1037},{0,147,1037},{0,83,2196},{0,88,5300},{0,80,2921},{27,255,185}, +{27,255,185},{27,255,185},{19,159,0},{98,0,4418},{0,147,1037},{0,147,1037},{0,83,2196},{201,0,4418},{0,83,2196},{255,28,9248},{82,255,3176},{46,249,0},{0,225,2020},{255,28,9248},{255,144,9248},{0,225,2020},{0,181,9248},{255,144,9248},{0,181,9248},{9,0,181},{9,0,181},{9,0,181},{9,0,181},{0,58,0},{0,58,0},{0,58,0},{0,29,0},{0,24,58},{0,24,58},{73,255,62082},{28,255,19099},{6,255,688}, +{2,251,1170},{73,255,65535},{19,255,22086},{0,248,2054},{0,231,12530},{0,254,51038},{0,212,28165},{86,255,16691},{52,255,4985},{36,255,250},{14,230,2238},{199,0,26259},{0,254,12692},{0,221,3965},{0,160,16946},{254,75,26259},{0,160,16946},{21,255,1006},{21,255,1006},{21,255,1006},{14,173,365},{0,225,4418},{0,162,820},{0,162,820},{0,96,1994},{0,100,5540},{0,90,2891},{36,255,250},{36,255,250},{36,255,250},{27,167,0},{110,0,4418}, +{0,162,820},{0,162,820},{0,96,1994},{225,0,4418},{0,96,1994},{255,49,8978},{95,255,3433},{55,255,0},{0,231,1732},{255,49,8978},{254,155,8978},{0,231,1732},{0,188,8978},{254,155,8978},{0,188,8978},{13,0,365},{13,0,365},{13,0,365},{13,0,365},{0,82,0},{0,82,0},{0,82,0},{0,41,0},{0,33,125},{0,33,125},{76,255,62399},{28,255,19454},{6,255,1075},{2,251,1090},{73,255,65535},{19,255,21590},{0,250,1503}, +{0,231,11251},{0,254,50424},{0,212,27242},{95,255,15410},{58,255,4661},{46,255,317},{24,231,1853},{208,0,24371},{0,254,11124},{0,227,2881},{0,166,15066},{254,84,24371},{0,166,15066},{27,255,1522},{27,255,1522},{27,255,1522},{17,183,613},{0,249,4418},{0,175,605},{0,175,605},{0,105,1801},{0,109,5805},{0,97,2885},{46,255,317},{46,255,317},{46,255,317},{35,175,0},{122,0,4418},{0,175,605},{0,175,605},{0,105,1801},{249,0,4418}, +{0,105,1801},{255,61,7938},{104,255,3026},{67,255,0},{0,237,1224},{255,61,7938},{254,161,7938},{0,237,1224},{0,192,7938},{254,161,7938},{0,192,7938},{17,0,613},{17,0,613},{17,0,613},{17,0,613},{0,107,0},{0,107,0},{0,107,0},{0,52,0},{0,42,218},{0,42,218},{76,255,62711},{28,255,19886},{9,255,1549},{3,252,1093},{73,255,65535},{19,255,21152},{0,251,1032},{0,234,10008},{0,254,49821},{0,212,26360},{101,255,14198}, +{67,255,4361},{55,255,400},{33,234,1502},{215,0,22568},{1,255,9795},{0,230,1973},{0,169,13320},{254,91,22568},{0,169,13320},{33,255,2150},{33,255,2150},{33,255,2150},{21,193,925},{3,255,4459},{0,190,442},{0,190,442},{0,114,1618},{0,121,6101},{0,106,2901},{55,255,400},{55,255,400},{55,255,400},{43,183,0},{134,0,4418},{0,190,442},{0,190,442},{0,114,1618},{255,9,4418},{0,114,1618},{255,73,6962},{113,255,2645},{79,255,0}, +{0,240,801},{255,73,6962},{254,167,6962},{0,240,801},{0,196,6962},{254,167,6962},{0,196,6962},{21,0,925},{21,0,925},{21,0,925},{21,0,925},{0,131,0},{0,131,0},{0,131,0},{0,64,0},{0,51,337},{0,51,337},{76,255,63078},{31,255,20439},{9,255,2192},{4,253,1202},{76,255,65535},{19,255,20732},{0,251,606},{0,234,8676},{0,254,49164},{0,212,25424},{110,255,12917},{79,255,4059},{64,255,505},{43,234,1147},{224,0,20642}, +{1,255,8589},{0,236,1155},{0,179,11489},{254,100,20642},{0,179,11489},{39,255,2986},{39,255,2986},{39,255,2986},{26,204,1352},{12,255,4660},{0,205,289},{0,205,289},{0,126,1424},{0,132,6467},{0,115,2955},{64,255,505},{64,255,505},{64,255,505},{52,192,0},{147,0,4418},{0,205,289},{0,205,289},{0,126,1424},{254,23,4418},{0,126,1424},{255,86,5941},{125,255,2248},{92,255,0},{0,243,433},{255,86,5941},{255,172,5941},{0,243,433}, +{0,200,5941},{255,172,5941},{0,200,5941},{26,0,1352},{26,0,1352},{26,0,1352},{26,0,1352},{0,158,0},{0,158,0},{0,158,0},{0,78,0},{0,63,500},{0,63,500},{79,255,63411},{31,255,21008},{12,255,2858},{7,253,1393},{76,255,65535},{22,255,20416},{0,253,320},{0,237,7549},{0,254,48613},{0,218,24643},{116,255,11849},{82,255,3845},{73,255,610},{53,238,867},{232,0,19021},{10,255,7741},{0,242,611},{0,182,9957},{255,107,19021}, +{0,182,9957},{43,255,3819},{43,255,3819},{43,255,3819},{30,214,1800},{15,255,4981},{0,221,169},{0,221,169},{0,133,1282},{0,141,6822},{0,124,3029},{73,255,610},{73,255,610},{73,255,610},{60,200,0},{159,0,4418},{0,221,169},{0,221,169},{0,133,1282},{254,35,4418},{0,133,1282},{255,98,5101},{134,255,1921},{104,255,0},{0,246,202},{255,98,5101},{255,178,5101},{0,246,202},{0,204,5101},{255,178,5101},{0,204,5101},{30,0,1800}, +{30,0,1800},{30,0,1800},{30,0,1800},{0,183,0},{0,183,0},{0,183,0},{0,89,0},{0,72,673},{0,72,673},{86,255,63733},{34,255,21637},{12,255,3614},{8,254,1668},{76,255,65535},{22,255,20164},{0,254,123},{0,237,6489},{0,254,48082},{0,218,23857},{122,255,10853},{95,255,3629},{86,255,724},{62,241,632},{241,0,17485},{22,255,6965},{0,248,243},{0,188,8529},{255,116,17485},{0,188,8529},{49,255,4787},{49,255,4787},{49,255,4787}, +{34,224,2312},{21,255,5437},{0,233,89},{0,233,89},{0,142,1129},{0,153,7206},{0,133,3131},{86,255,724},{86,255,724},{86,255,724},{68,207,0},{171,0,4418},{0,233,89},{0,233,89},{0,142,1129},{255,46,4418},{0,142,1129},{255,110,4325},{143,255,1620},{116,255,0},{0,252,58},{255,110,4325},{255,184,4325},{0,252,58},{0,208,4325},{255,184,4325},{0,208,4325},{34,0,2312},{34,0,2312},{34,0,2312},{34,0,2312},{0,207,0}, +{0,207,0},{0,207,0},{0,101,0},{0,88,865},{0,88,865},{86,255,63992},{34,255,22322},{15,255,4457},{8,255,2033},{76,255,65535},{22,255,19980},{0,254,23},{0,240,5494},{0,254,47573},{0,218,23129},{129,255,9866},{104,255,3441},{92,255,832},{71,244,435},{248,0,16034},{34,255,6253},{0,254,51},{0,194,7213},{254,124,16034},{0,194,7213},{55,255,5867},{55,255,5867},{55,255,5867},{38,234,2888},{27,255,6029},{0,248,34},{0,248,34}, +{0,154,985},{0,162,7619},{0,142,3261},{92,255,832},{92,255,832},{92,255,832},{76,215,0},{183,0,4418},{0,248,34},{0,248,34},{0,154,985},{255,58,4418},{0,154,985},{255,122,3613},{152,255,1345},{128,255,0},{0,255,1},{255,122,3613},{255,190,3613},{0,255,1},{0,212,3613},{255,190,3613},{0,212,3613},{38,0,2888},{38,0,2888},{38,0,2888},{38,0,2888},{0,231,0},{0,231,0},{0,231,0},{0,113,0},{0,91,1066}, +{0,91,1066},{86,255,64310},{37,255,23174},{15,255,5504},{10,255,2546},{79,255,65535},{25,255,19854},{1,255,23},{0,240,4466},{0,254,47048},{0,221,22366},{138,255,8897},{113,255,3261},{101,255,985},{80,247,258},{255,4,14504},{40,255,5561},{7,255,34},{0,200,5867},{255,132,14504},{0,200,5867},{61,255,7213},{61,255,7213},{61,255,7213},{42,245,3613},{33,255,6859},{1,255,51},{1,255,51},{0,163,832},{0,175,8059},{0,151,3441},{101,255,985}, +{101,255,985},{101,255,985},{85,224,0},{196,0,4418},{7,255,34},{7,255,34},{0,163,832},{254,72,4418},{0,163,832},{255,137,2888},{164,255,1066},{141,255,0},{22,255,0},{255,137,2888},{254,198,2888},{22,255,0},{0,217,2888},{254,198,2888},{0,217,2888},{42,0,3613},{42,0,3613},{42,0,3613},{42,0,3613},{0,255,1},{0,255,1},{0,255,1},{0,127,0},{0,103,1345},{0,103,1345},{86,255,64605},{37,255,23983},{18,255,6523}, +{10,255,3097},{86,255,65535},{25,255,19808},{1,255,124},{0,243,3633},{0,254,46617},{0,221,21751},{144,255,8113},{122,255,3131},{113,255,1129},{90,248,139},{255,19,13235},{58,255,5012},{22,255,89},{0,206,4787},{254,140,13235},{0,206,4787},{67,255,8529},{67,255,8529},{67,255,8529},{46,255,4325},{43,255,7725},{7,255,243},{7,255,243},{0,169,724},{0,184,8530},{0,160,3629},{113,255,1129},{113,255,1129},{113,255,1129},{93,232,0},{208,0,4418}, +{22,255,89},{22,255,89},{0,169,724},{254,84,4418},{0,169,724},{255,149,2312},{167,255,865},{153,255,0},{46,255,0},{255,149,2312},{254,204,2312},{46,255,0},{0,221,2312},{254,204,2312},{0,221,2312},{46,0,4325},{46,0,4325},{46,0,4325},{46,0,4325},{3,255,58},{3,255,58},{3,255,58},{0,138,0},{0,112,1620},{0,112,1620},{86,255,64960},{37,255,24878},{18,255,7621},{13,255,3738},{86,255,65535},{25,255,19851},{2,255,323}, +{0,243,2885},{0,254,46257},{0,224,21209},{153,255,7392},{131,255,3029},{122,255,1282},{99,251,56},{255,37,12051},{70,255,4500},{34,255,169},{0,212,3819},{254,149,12051},{0,212,3819},{70,255,9957},{70,255,9957},{70,255,9957},{52,255,5141},{46,255,8712},{13,255,611},{13,255,611},{0,182,610},{0,196,9026},{0,169,3845},{122,255,1282},{122,255,1282},{122,255,1282},{101,240,0},{220,0,4418},{34,255,169},{34,255,169},{0,182,610},{255,95,4418}, +{0,182,610},{255,161,1800},{183,255,673},{165,255,0},{70,255,0},{255,161,1800},{254,210,1800},{70,255,0},{0,225,1800},{254,210,1800},{0,225,1800},{50,0,5101},{50,0,5101},{50,0,5101},{50,0,5101},{9,255,202},{9,255,202},{9,255,202},{0,150,0},{0,121,1921},{0,121,1921},{86,255,65314},{43,255,25774},{21,255,8796},{13,255,4456},{86,255,65535},{25,255,19965},{4,255,614},{0,246,2222},{0,254,45929},{0,224,20720},{159,255,6740}, +{140,255,2955},{129,255,1424},{108,254,11},{255,52,10952},{82,255,4052},{49,255,289},{0,216,2986},{255,156,10952},{0,216,2986},{76,255,11489},{76,255,11489},{76,255,11489},{58,255,6109},{52,255,9860},{19,255,1155},{19,255,1155},{0,191,505},{0,208,9554},{0,176,4059},{129,255,1424},{129,255,1424},{129,255,1424},{109,248,0},{232,0,4418},{49,255,289},{49,255,289},{0,191,505},{255,107,4418},{0,191,505},{255,174,1352},{192,255,500},{177,255,0}, +{95,255,0},{255,174,1352},{255,215,1352},{95,255,0},{0,229,1352},{255,215,1352},{0,229,1352},{54,0,5941},{54,0,5941},{54,0,5941},{54,0,5941},{12,255,433},{12,255,433},{12,255,433},{0,162,0},{0,129,2248},{0,129,2248},{86,255,65535},{43,255,26766},{21,255,10162},{13,255,5358},{86,255,65359},{28,255,20101},{4,255,1047},{0,246,1573},{0,254,45474},{0,227,20192},{172,255,6085},{149,255,2901},{141,255,1618},{119,255,2},{255,70,9818}, +{95,255,3685},{64,255,442},{0,222,2150},{255,165,9818},{0,222,2150},{86,255,13320},{86,255,13320},{86,255,13320},{61,255,7370},{58,255,11310},{22,255,1973},{22,255,1973},{0,200,400},{0,218,10107},{0,188,4361},{141,255,1618},{141,255,1618},{141,255,1618},{119,255,2},{245,0,4418},{64,255,442},{64,255,442},{0,200,400},{254,121,4418},{0,200,400},{255,186,925},{204,255,337},{190,255,0},{122,255,0},{255,186,925},{255,221,925},{122,255,0}, +{0,233,925},{255,221,925},{0,233,925},{59,0,6962},{59,0,6962},{59,0,6962},{59,0,6962},{15,255,801},{15,255,801},{15,255,801},{0,175,0},{0,141,2645},{0,141,2645},{86,255,65535},{43,255,27616},{24,255,11405},{16,255,6203},{86,255,65014},{28,255,20233},{5,255,1524},{0,249,1090},{1,255,44974},{0,227,19721},{175,255,5534},{156,255,2885},{150,255,1801},{128,255,40},{255,86,8901},{107,255,3373},{79,255,605},{0,228,1522},{255,172,8901}, +{0,228,1522},{89,255,15066},{89,255,15066},{89,255,15066},{67,255,8646},{64,255,12746},{28,255,2881},{28,255,2881},{0,209,317},{0,230,10691},{0,194,4661},{150,255,1801},{150,255,1801},{150,255,1801},{128,255,40},{255,4,4418},{79,255,605},{79,255,605},{0,209,317},{255,132,4418},{0,209,317},{255,198,613},{213,255,218},{202,255,0},{146,255,0},{255,198,613},{255,227,613},{146,255,0},{0,237,613},{255,227,613},{0,237,613},{63,0,7938}, +{63,0,7938},{63,0,7938},{63,0,7938},{18,255,1224},{18,255,1224},{18,255,1224},{0,187,0},{0,150,3026},{0,150,3026},{89,255,65535},{43,255,28505},{24,255,12681},{16,255,7117},{86,255,64678},{28,255,20430},{7,255,2079},{0,249,697},{1,255,44506},{0,227,19330},{181,255,5094},{165,255,2891},{159,255,1994},{137,255,130},{255,104,8069},{119,255,3125},{92,255,820},{0,234,1006},{255,181,8069},{0,234,1006},{95,255,16946},{95,255,16946},{95,255,16946}, +{73,255,10074},{67,255,14315},{34,255,3965},{34,255,3965},{0,219,250},{0,239,11302},{0,203,4985},{159,255,1994},{159,255,1994},{159,255,1994},{137,255,130},{255,28,4418},{92,255,820},{92,255,820},{0,219,250},{255,144,4418},{0,219,250},{255,210,365},{222,255,125},{214,255,0},{171,255,0},{255,210,365},{255,233,365},{171,255,0},{0,241,365},{255,233,365},{0,241,365},{67,0,8978},{67,0,8978},{67,0,8978},{67,0,8978},{24,255,1732}, +{24,255,1732},{24,255,1732},{0,199,0},{0,159,3433},{0,159,3433},{92,255,65535},{49,255,29231},{30,255,13748},{22,255,7832},{89,255,64474},{34,255,20616},{13,255,2581},{5,251,455},{1,255,43254},{0,230,17214},{187,255,4726},{175,255,2921},{172,255,2196},{146,255,272},{255,119,7322},{131,255,2941},{107,255,1037},{0,240,602},{254,189,7322},{0,240,602},{101,255,17762},{101,255,17762},{101,255,17762},{79,255,10742},{76,255,15150},{43,255,4710},{43,255,4710}, +{3,228,217},{0,251,10994},{0,212,4545},{172,255,2196},{172,255,2196},{172,255,2196},{146,255,272},{255,52,4418},{107,255,1037},{107,255,1037},{0,228,185},{255,156,4418},{0,228,185},{255,222,181},{231,255,58},{226,255,0},{195,255,0},{255,222,181},{255,239,181},{195,255,0},{0,245,181},{255,239,181},{0,245,181},{74,0,9248},{74,0,9248},{74,0,9248},{74,0,9248},{30,255,2020},{30,255,2020},{30,255,2020},{6,208,0},{0,172,3176}, +{0,172,3176},{98,255,65535},{58,255,30030},{43,255,14936},{31,255,8624},{95,255,64295},{43,255,20818},{22,255,3192},{15,252,275},{1,255,41806},{0,236,14271},{196,255,4387},{184,255,2987},{178,255,2410},{158,255,490},{255,137,6584},{146,255,2811},{125,255,1313},{0,246,278},{254,198,6584},{0,246,278},{113,255,18273},{113,255,18273},{113,255,18273},{89,255,11256},{89,255,15726},{55,255,5525},{55,255,5525},{12,237,217},{0,254,10500},{0,224,3805},{178,255,2410}, +{178,255,2410},{178,255,2410},{158,255,490},{255,79,4418},{125,255,1313},{125,255,1313},{0,240,125},{253,170,4418},{0,240,125},{255,237,50},{243,255,13},{239,255,0},{222,255,0},{255,237,50},{254,247,50},{222,255,0},{0,250,50},{254,247,50},{0,250,50},{83,0,9248},{83,0,9248},{83,0,9248},{83,0,9248},{43,255,2228},{43,255,2228},{43,255,2228},{15,217,0},{0,190,2738},{0,190,2738},{104,255,65535},{67,255,30820},{49,255,16060}, +{40,255,9410},{101,255,64140},{52,255,21086},{31,255,3826},{22,253,162},{1,255,40863},{0,239,11797},{202,255,4163},{193,255,3077},{187,255,2633},{167,255,740},{255,152,6019},{158,255,2763},{137,255,1585},{0,252,110},{255,205,6019},{0,252,110},{119,255,18737},{119,255,18737},{119,255,18737},{98,255,11747},{98,255,16315},{64,255,6305},{64,255,6305},{20,245,217},{1,255,10451},{0,236,3205},{187,255,2633},{187,255,2633},{187,255,2633},{167,255,740},{255,104,4418}, +{137,255,1585},{137,255,1585},{0,249,80},{255,181,4418},{0,249,80},{255,249,2},{252,255,0},{251,255,0},{246,255,0},{255,249,2},{254,253,2},{246,255,0},{0,254,2},{254,253,2},{0,254,2},{91,0,9248},{91,0,9248},{91,0,9248},{91,0,9248},{49,255,2440},{49,255,2440},{49,255,2440},{23,225,0},{0,205,2377},{0,205,2377},{110,255,65535},{73,255,31223},{55,255,16690},{49,255,9985},{107,255,63957},{58,255,21217},{38,255,4182}, +{30,255,97},{1,255,40169},{0,242,9493},{208,255,3603},{199,255,2717},{193,255,2357},{174,255,725},{255,164,5163},{167,255,2409},{149,255,1445},{0,255,16},{255,211,5163},{0,255,16},{129,255,18104},{129,255,18104},{129,255,18104},{107,255,11680},{107,255,15698},{73,255,6401},{73,255,6401},{27,249,133},{1,255,9723},{0,242,2489},{193,255,2357},{193,255,2357},{193,255,2357},{174,255,725},{255,119,3872},{149,255,1445},{149,255,1445},{0,252,13},{254,189,3872}, +{0,252,13},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{99,0,9248},{99,0,9248},{99,0,9248},{99,0,9248},{61,255,2664},{61,255,2664},{61,255,2664},{31,233,0},{0,218,2000},{0,218,2000},{116,255,65535},{79,255,31523},{64,255,17156},{55,255,10522},{113,255,63756},{67,255,21315},{46,255,4385},{38,254,41},{4,255,39799},{0,245,7354},{215,255,2952}, +{202,255,2243},{199,255,1945},{183,255,593},{255,171,4267},{167,255,2009},{158,255,1186},{10,255,0},{254,214,4267},{10,255,0},{135,255,17216},{135,255,17216},{135,255,17216},{116,255,11435},{113,255,14726},{82,255,6281},{82,255,6281},{38,251,53},{1,255,8923},{0,248,1877},{199,255,1945},{199,255,1945},{199,255,1945},{183,255,593},{255,131,3200},{158,255,1186},{158,255,1186},{10,255,0},{254,195,3200},{10,255,0},{255,252,0},{255,254,0},{254,255,0}, +{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{107,0,9248},{107,0,9248},{107,0,9248},{107,0,9248},{70,255,2897},{70,255,2897},{70,255,2897},{39,241,0},{0,233,1693},{0,233,1693},{122,255,65535},{89,255,32024},{73,255,17745},{64,255,11181},{119,255,63505},{73,255,21450},{55,255,4731},{48,255,5},{13,255,39517},{0,248,5202},{218,255,2308},{208,255,1762},{205,255,1530},{192,255,464},{255,180,3361}, +{183,255,1587},{167,255,928},{37,255,0},{255,218,3361},{37,255,0},{141,255,16274},{141,255,16274},{141,255,16274},{122,255,11169},{122,255,13721},{92,255,6189},{92,255,6189},{47,254,6},{13,255,8241},{0,254,1395},{205,255,1530},{205,255,1530},{205,255,1530},{192,255,464},{255,143,2521},{167,255,928},{167,255,928},{37,255,0},{254,201,2521},{37,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0}, +{0,255,0},{255,254,0},{0,255,0},{116,0,9248},{116,0,9248},{116,0,9248},{116,0,9248},{79,255,3170},{79,255,3170},{79,255,3170},{48,250,0},{0,248,1378},{0,248,1378},{129,255,65535},{95,255,32533},{79,255,18407},{73,255,11877},{129,255,63435},{82,255,21690},{64,255,5107},{56,255,2},{25,255,39436},{0,248,3611},{221,255,1809},{215,255,1374},{211,255,1202},{198,255,360},{255,189,2646},{192,255,1241},{180,255,745},{61,255,0},{254,223,2646}, +{61,255,0},{147,255,15490},{147,255,15490},{147,255,15490},{131,255,10946},{129,255,12826},{101,255,6125},{101,255,6125},{56,255,4},{25,255,7705},{0,254,1171},{211,255,1202},{211,255,1202},{211,255,1202},{198,255,360},{255,155,1985},{180,255,745},{180,255,745},{61,255,0},{254,207,1985},{61,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{124,0,9248}, +{124,0,9248},{124,0,9248},{124,0,9248},{89,255,3393},{89,255,3393},{89,255,3393},{56,255,4},{0,254,1170},{0,254,1170},{132,255,65535},{101,255,32957},{86,255,19017},{82,255,12610},{129,255,62977},{89,255,22061},{73,255,5530},{64,255,31},{34,255,39178},{0,251,2372},{224,255,1376},{218,255,1044},{218,255,900},{204,255,272},{255,198,2017},{198,255,937},{189,255,562},{86,255,0},{255,227,2017},{86,255,0},{153,255,14754},{153,255,14754},{153,255,14754}, +{137,255,10742},{135,255,12066},{107,255,6089},{107,255,6089},{67,255,45},{37,255,7233},{1,255,1184},{218,255,900},{218,255,900},{218,255,900},{204,255,272},{255,167,1513},{189,255,562},{189,255,562},{86,255,0},{253,213,1513},{86,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{132,0,9248},{132,0,9248},{132,0,9248},{132,0,9248},{98,255,3656}, +{98,255,3656},{98,255,3656},{67,255,45},{1,255,1184},{1,255,1184},{138,255,65535},{107,255,33448},{95,255,19729},{89,255,13446},{135,255,62717},{95,255,22307},{79,255,6021},{73,255,105},{40,255,38959},{0,254,1627},{230,255,996},{224,255,756},{221,255,653},{213,255,194},{255,204,1473},{207,255,675},{198,255,405},{110,255,0},{255,230,1473},{110,255,0},{162,255,14060},{162,255,14060},{162,255,14060},{146,255,10545},{141,255,11378},{116,255,6077},{116,255,6077}, +{76,255,137},{40,255,6873},{7,255,1412},{221,255,653},{221,255,653},{221,255,653},{213,255,194},{255,180,1105},{198,255,405},{198,255,405},{110,255,0},{255,218,1105},{110,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{140,0,9248},{140,0,9248},{140,0,9248},{140,0,9248},{107,255,3929},{107,255,3929},{107,255,3929},{76,255,137},{7,255,1412}, +{7,255,1412}, +/**** ended inlining basisu_transcoder_tables_astc_0_255.inc ****/ + }; + static uint8_t g_etc1_to_astc_best_grayscale_mapping_0_255[32][8][NUM_ETC1_TO_ASTC_SELECTOR_RANGES]; +#endif + + static uint32_t g_ise_to_unquant[48]; + +#if BASISD_WRITE_NEW_ASTC_TABLES + static void create_etc1_to_astc_conversion_table_0_47() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_astc.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1_TO_ASTC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1_to_astc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1_to_astc_selector_ranges[sr].m_high; + + uint32_t mapping_best_low[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + uint32_t mapping_best_high[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + uint64_t mapping_best_err[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + uint64_t highest_best_err = 0; + + for (uint32_t m = 0; m < NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 47; hi++) + { + for (uint32_t lo = 0; lo <= 47; lo++) + { + uint32_t colors[4]; + + for (uint32_t s = 0; s < 4; s++) + { + uint32_t s_scaled = s | (s << 2) | (s << 4); + if (s_scaled > 32) + s_scaled++; + + uint32_t c0 = g_ise_to_unquant[lo] | (g_ise_to_unquant[lo] << 8); + uint32_t c1 = g_ise_to_unquant[hi] | (g_ise_to_unquant[hi] << 8); + colors[s] = ((c0 * (64 - s_scaled) + c1 * s_scaled + 32) / 64) >> 8; + } + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1_to_astc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 8; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + mapping_best_low[m] = best_lo; + mapping_best_high[m] = best_hi; + mapping_best_err[m] = best_err; + highest_best_err = basisu::maximum(highest_best_err, best_err); + + } // m + + for (uint32_t m = 0; m < NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS; m++) + { + uint64_t err = mapping_best_err[m]; + + err = basisu::minimum(err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", mapping_best_low[m], mapping_best_high[m], (uint32_t)err); + + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + + } // sr + } // g + } // inten + + fclose(pFile); + } + + static void create_etc1_to_astc_conversion_table_0_255() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_astc_0_255.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1_TO_ASTC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1_to_astc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1_to_astc_selector_ranges[sr].m_high; + + uint32_t mapping_best_low[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + uint32_t mapping_best_high[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + uint64_t mapping_best_err[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + uint64_t highest_best_err = 0; + + for (uint32_t m = 0; m < NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 255; hi++) + { + for (uint32_t lo = 0; lo <= 255; lo++) + { + uint32_t colors[4]; + + for (uint32_t s = 0; s < 4; s++) + { + uint32_t s_scaled = s | (s << 2) | (s << 4); + if (s_scaled > 32) + s_scaled++; + + uint32_t c0 = lo | (lo << 8); + uint32_t c1 = hi | (hi << 8); + colors[s] = ((c0 * (64 - s_scaled) + c1 * s_scaled + 32) / 64) >> 8; + } + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1_to_astc_selector_mappings[m][s]]; + + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + int err_scale = 1; + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 8; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + mapping_best_low[m] = best_lo; + mapping_best_high[m] = best_hi; + mapping_best_err[m] = best_err; + highest_best_err = basisu::maximum(highest_best_err, best_err); + } // m + + for (uint32_t m = 0; m < NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS; m++) + { + uint64_t err = mapping_best_err[m]; + + err = basisu::minimum(err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", mapping_best_low[m], mapping_best_high[m], (uint32_t)err); + + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + + } // sr + } // g + } // inten + + fclose(pFile); + } +#endif + +#endif + +#if BASISD_SUPPORT_UASTC || BASISD_SUPPORT_ASTC + // Table encodes 5 trits to 8 output bits. 3^5 entries. + // Inverse of the trit bit manipulation process in https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#astc-integer-sequence-encoding + static const uint8_t g_astc_trit_encode[243] = { 0, 1, 2, 4, 5, 6, 8, 9, 10, 16, 17, 18, 20, 21, 22, 24, 25, 26, 3, 7, 11, 19, 23, 27, 12, 13, 14, 32, 33, 34, 36, 37, 38, 40, 41, 42, 48, 49, 50, 52, 53, 54, 56, 57, 58, 35, 39, + 43, 51, 55, 59, 44, 45, 46, 64, 65, 66, 68, 69, 70, 72, 73, 74, 80, 81, 82, 84, 85, 86, 88, 89, 90, 67, 71, 75, 83, 87, 91, 76, 77, 78, 128, 129, 130, 132, 133, 134, 136, 137, 138, 144, 145, 146, 148, 149, 150, 152, 153, 154, + 131, 135, 139, 147, 151, 155, 140, 141, 142, 160, 161, 162, 164, 165, 166, 168, 169, 170, 176, 177, 178, 180, 181, 182, 184, 185, 186, 163, 167, 171, 179, 183, 187, 172, 173, 174, 192, 193, 194, 196, 197, 198, 200, 201, 202, + 208, 209, 210, 212, 213, 214, 216, 217, 218, 195, 199, 203, 211, 215, 219, 204, 205, 206, 96, 97, 98, 100, 101, 102, 104, 105, 106, 112, 113, 114, 116, 117, 118, 120, 121, 122, 99, 103, 107, 115, 119, 123, 108, 109, 110, 224, + 225, 226, 228, 229, 230, 232, 233, 234, 240, 241, 242, 244, 245, 246, 248, 249, 250, 227, 231, 235, 243, 247, 251, 236, 237, 238, 28, 29, 30, 60, 61, 62, 92, 93, 94, 156, 157, 158, 188, 189, 190, 220, 221, 222, 31, 63, 95, 159, + 191, 223, 124, 125, 126 }; + + // Extracts bits [low,high] + static inline uint32_t astc_extract_bits(uint32_t bits, int low, int high) + { + return (bits >> low) & ((1 << (high - low + 1)) - 1); + } + + // Writes bits to output in an endian safe way + static inline void astc_set_bits(uint32_t* pOutput, int& bit_pos, uint32_t value, uint32_t total_bits) + { + uint8_t* pBytes = reinterpret_cast(pOutput); + + while (total_bits) + { + const uint32_t bits_to_write = basisu::minimum(total_bits, 8 - (bit_pos & 7)); + + pBytes[bit_pos >> 3] |= static_cast(value << (bit_pos & 7)); + + bit_pos += bits_to_write; + total_bits -= bits_to_write; + value >>= bits_to_write; + } + } + + // Encodes 5 values to output, usable for any range that uses trits and bits + static void astc_encode_trits(uint32_t* pOutput, const uint8_t* pValues, int& bit_pos, int n) + { + // First extract the trits and the bits from the 5 input values + int trits = 0, bits[5]; + const uint32_t bit_mask = (1 << n) - 1; + for (int i = 0; i < 5; i++) + { + static const int s_muls[5] = { 1, 3, 9, 27, 81 }; + + const int t = pValues[i] >> n; + + trits += t * s_muls[i]; + bits[i] = pValues[i] & bit_mask; + } + + // Encode the trits, by inverting the bit manipulations done by the decoder, converting 5 trits into 8-bits. + // See https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#astc-integer-sequence-encoding + + assert(trits < 243); + const int T = g_astc_trit_encode[trits]; + + // Now interleave the 8 encoded trit bits with the bits to form the encoded output. See table 94. + astc_set_bits(pOutput, bit_pos, bits[0] | (astc_extract_bits(T, 0, 1) << n) | (bits[1] << (2 + n)), n * 2 + 2); + + astc_set_bits(pOutput, bit_pos, astc_extract_bits(T, 2, 3) | (bits[2] << 2) | (astc_extract_bits(T, 4, 4) << (2 + n)) | (bits[3] << (3 + n)) | (astc_extract_bits(T, 5, 6) << (3 + n * 2)) | + (bits[4] << (5 + n * 2)) | (astc_extract_bits(T, 7, 7) << (5 + n * 3)), n * 3 + 6); + } +#endif // #if BASISD_SUPPORT_UASTC || BASISD_SUPPORT_ASTC + +#if BASISD_SUPPORT_ASTC + struct astc_block_params + { + // 2 groups of 5, but only a max of 8 are used (RRGGBBAA00) + uint8_t m_endpoints[10]; + uint8_t m_weights[32]; + }; + + // Packs a single format ASTC block using Color Endpoint Mode 12 (LDR RGBA direct), endpoint BISE range 13, 2-bit weights (range 2). + // We're always going to output blocks containing alpha, even if the input doesn't have alpha, for simplicity. + // Each block always has 4x4 weights, uses range 13 BISE encoding on the endpoints (0-47), and each weight ranges from 0-3. This encoding should be roughly equal in quality vs. BC1 for color. + // 8 total endpoints, stored as RGBA LH LH LH LH order, each ranging from 0-47. + // Note the input [0,47] endpoint values are not linear - they are encoded as outlined in the ASTC spec: + // https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#astc-endpoint-unquantization + // 32 total weights, stored as 16 CA CA, each ranging from 0-3. + static void astc_pack_block_cem_12_weight_range2(uint32_t *pOutput, const astc_block_params* pBlock) + { + uint8_t* pBytes = reinterpret_cast(pOutput); + + // Write constant block mode, color component selector, number of partitions, color endpoint mode + // https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#_block_mode + pBytes[0] = 0x42; pBytes[1] = 0x84; pBytes[2] = 0x01; pBytes[3] = 0x00; + pBytes[4] = 0x00; pBytes[5] = 0x00; pBytes[6] = 0x00; pBytes[7] = 0xc0; + + pOutput[2] = 0; + pOutput[3] = 0; + + // Pack 8 endpoints (each ranging between [0,47]) using BISE starting at bit 17 + int bit_pos = 17; + astc_encode_trits(pOutput, pBlock->m_endpoints, bit_pos, 4); + astc_encode_trits(pOutput, pBlock->m_endpoints + 5, bit_pos, 4); + + // Pack 32 2-bit weights, which are stored from the top down into the block in opposite bit order. + + for (uint32_t i = 0; i < 32; i++) + { + static const uint8_t s_reverse_bits[4] = { 0, 2, 1, 3 }; + const uint32_t ofs = 126 - (i * 2); + pBytes[ofs >> 3] |= (s_reverse_bits[pBlock->m_weights[i]] << (ofs & 7)); + } + } + + // CEM mode 12 (LDR RGBA Direct), 8-bit endpoints, 1-bit weights + // This ASTC mode is basically block truncation coding (BTC) using 1-bit weights and 8-bit/component endpoints - very convenient. + static void astc_pack_block_cem_12_weight_range0(uint32_t* pOutput, const astc_block_params* pBlock) + { + uint8_t* pBytes = reinterpret_cast(pOutput); + + // Write constant block mode, color component selector, number of partitions, color endpoint mode + // https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#_block_mode + pBytes[0] = 0x41; pBytes[1] = 0x84; pBytes[2] = 0x01; pBytes[3] = 0x00; + pOutput[1] = 0; + pBytes[8] = 0x00; pBytes[9] = 0x00; pBytes[10] = 0x00; pBytes[11] = 0xc0; + pOutput[3] = 0; + + // Pack 8 endpoints (each ranging between [0,255]) as 8-bits starting at bit 17 + int bit_pos = 17; + for (uint32_t i = 0; i < 8; i++) + astc_set_bits(pOutput, bit_pos, pBlock->m_endpoints[i], 8); + + // Pack 32 1-bit weights, which are stored from the top down into the block in opposite bit order. + for (uint32_t i = 0; i < 32; i++) + { + const uint32_t ofs = 127 - i; + pBytes[ofs >> 3] |= (pBlock->m_weights[i] << (ofs & 7)); + } + } + +#if BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + // Optional 8-bit endpoint packing functions. + + // CEM mode 4 (LDR Luminance+Alpha Direct), 8-bit endpoints, 2 bit weights + static void astc_pack_block_cem_4_weight_range2(uint32_t* pOutput, const astc_block_params* pBlock) + { + uint8_t* pBytes = reinterpret_cast(pOutput); + + // Write constant block mode, color component selector, number of partitions, color endpoint mode + // https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#_block_mode + pBytes[0] = 0x42; pBytes[1] = 0x84; pBytes[2] = 0x00; pBytes[3] = 0x00; + pBytes[4] = 0x00; pBytes[5] = 0x00; pBytes[6] = 0x00; pBytes[7] = 0xc0; + + pOutput[2] = 0; + pOutput[3] = 0; + + // Pack 4 endpoints (each ranging between [0,255]) as 8-bits starting at bit 17 + int bit_pos = 17; + for (uint32_t i = 0; i < 4; i++) + astc_set_bits(pOutput, bit_pos, pBlock->m_endpoints[i], 8); + + // Pack 32 2-bit weights, which are stored from the top down into the block in opposite bit order. + for (uint32_t i = 0; i < 32; i++) + { + static const uint8_t s_reverse_bits[4] = { 0, 2, 1, 3 }; + const uint32_t ofs = 126 - (i * 2); + pBytes[ofs >> 3] |= (s_reverse_bits[pBlock->m_weights[i]] << (ofs & 7)); + } + } + + // CEM mode 8 (LDR RGB Direct), 8-bit endpoints, 2 bit weights + static void astc_pack_block_cem_8_weight_range2(uint32_t* pOutput, const astc_block_params* pBlock) + { + uint8_t* pBytes = reinterpret_cast(pOutput); + + // Write constant block mode, color component selector, number of partitions, color endpoint mode + // https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#_block_mode + pBytes[0] = 0x42; pBytes[1] = 0x00; pBytes[2] = 0x01; pBytes[3] = 0x00; + + pOutput[1] = 0; + pOutput[2] = 0; + pOutput[3] = 0; + + // Pack 6 endpoints (each ranging between [0,255]) as 8-bits starting at bit 17 + int bit_pos = 17; + for (uint32_t i = 0; i < 6; i++) + astc_set_bits(pOutput, bit_pos, pBlock->m_endpoints[i], 8); + + // Pack 16 2-bit weights, which are stored from the top down into the block in opposite bit order. + for (uint32_t i = 0; i < 16; i++) + { + static const uint8_t s_reverse_bits[4] = { 0, 2, 1, 3 }; + const uint32_t ofs = 126 - (i * 2); + pBytes[ofs >> 3] |= (s_reverse_bits[pBlock->m_weights[i]] << (ofs & 7)); + } + } +#endif + + // Optimal quantized [0,47] entry to use given [0,255] input + static uint8_t g_astc_single_color_encoding_0[256]; + + // Optimal quantized [0,47] low/high values given [0,255] input assuming a selector of 1 + static struct + { + uint8_t m_lo, m_hi; + } g_astc_single_color_encoding_1[256]; + + static void transcoder_init_astc() + { + for (uint32_t base_color = 0; base_color < 32; base_color++) + { + for (uint32_t inten_table = 0; inten_table < 8; inten_table++) + { + for (uint32_t range_index = 0; range_index < NUM_ETC1_TO_ASTC_SELECTOR_RANGES; range_index++) + { + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc[(inten_table * 32 + base_color) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + range_index * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + uint32_t best_mapping = 0; + uint32_t best_err = UINT32_MAX; + for (uint32_t mapping_index = 0; mapping_index < NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS; mapping_index++) + { + if (pTable_g[mapping_index].m_err < best_err) + { + best_err = pTable_g[mapping_index].m_err; + best_mapping = mapping_index; + } + } + + g_etc1_to_astc_best_grayscale_mapping[base_color][inten_table][range_index] = static_cast(best_mapping); + } + } + } + +#if BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + for (uint32_t base_color = 0; base_color < 32; base_color++) + { + for (uint32_t inten_table = 0; inten_table < 8; inten_table++) + { + for (uint32_t range_index = 0; range_index < NUM_ETC1_TO_ASTC_SELECTOR_RANGES; range_index++) + { + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc_0_255[(inten_table * 32 + base_color) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + range_index * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + uint32_t best_mapping = 0; + uint32_t best_err = UINT32_MAX; + for (uint32_t mapping_index = 0; mapping_index < NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS; mapping_index++) + { + if (pTable_g[mapping_index].m_err < best_err) + { + best_err = pTable_g[mapping_index].m_err; + best_mapping = mapping_index; + } + } + + g_etc1_to_astc_best_grayscale_mapping_0_255[base_color][inten_table][range_index] = static_cast(best_mapping); + } + } + } +#endif + + for (uint32_t i = 0; i < NUM_ETC1_TO_ASTC_SELECTOR_RANGES; i++) + { + uint32_t l = g_etc1_to_astc_selector_ranges[i].m_low; + uint32_t h = g_etc1_to_astc_selector_ranges[i].m_high; + g_etc1_to_astc_selector_range_index[l][h] = i; + } + + // Endpoint dequantization, see: + // https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#astc-endpoint-unquantization + for (uint32_t trit = 0; trit < 3; trit++) + { + for (uint32_t bit = 0; bit < 16; bit++) + { + const uint32_t A = (bit & 1) ? 511 : 0; + const uint32_t B = (bit >> 1) | ((bit >> 1) << 6); + const uint32_t C = 22; + const uint32_t D = trit; + + uint32_t unq = D * C + B; + unq = unq ^ A; + unq = (A & 0x80) | (unq >> 2); + + g_ise_to_unquant[bit | (trit << 4)] = unq; + } + } + + // Compute table used for optimal single color encoding. + for (int i = 0; i < 256; i++) + { + int lowest_e = INT_MAX; + + for (int lo = 0; lo < 48; lo++) + { + for (int hi = 0; hi < 48; hi++) + { + const int lo_v = g_ise_to_unquant[lo]; + const int hi_v = g_ise_to_unquant[hi]; + + int l = lo_v | (lo_v << 8); + int h = hi_v | (hi_v << 8); + + int v = ((l * (64 - 21) + (h * 21) + 32) / 64) >> 8; + + int e = abs(v - i); + + if (e < lowest_e) + { + g_astc_single_color_encoding_1[i].m_hi = static_cast(hi); + g_astc_single_color_encoding_1[i].m_lo = static_cast(lo); + + lowest_e = e; + } + + } // hi + } // lo + } + + for (int i = 0; i < 256; i++) + { + int lowest_e = INT_MAX; + + for (int lo = 0; lo < 48; lo++) + { + const int lo_v = g_ise_to_unquant[lo]; + + int e = abs(lo_v - i); + + if (e < lowest_e) + { + g_astc_single_color_encoding_0[i] = static_cast(lo); + + lowest_e = e; + } + } // lo + } + } + + // Converts opaque or color+alpha ETC1S block to ASTC 4x4. + // This function tries to use the best ASTC mode given the block's actual contents. + static void convert_etc1s_to_astc_4x4(void* pDst_block, const endpoint* pEndpoints, const selector* pSelector, + bool transcode_alpha, const endpoint *pEndpoint_codebook, const selector *pSelector_codebook) + { + astc_block_params blk; + + blk.m_endpoints[8] = 0; + blk.m_endpoints[9] = 0; + + int constant_alpha_val = 255; + int num_unique_alpha_selectors = 1; + + if (transcode_alpha) + { + const selector& alpha_selectors = pSelector_codebook[((uint16_t*)pDst_block)[1]]; + + num_unique_alpha_selectors = alpha_selectors.m_num_unique_selectors; + + if (num_unique_alpha_selectors == 1) + { + const endpoint& alpha_endpoint = pEndpoint_codebook[((uint16_t*)pDst_block)[0]]; + + const color32& alpha_base_color = alpha_endpoint.m_color5; + const uint32_t alpha_inten_table = alpha_endpoint.m_inten5; + + int alpha_block_colors[4]; + decoder_etc_block::get_block_colors5_g(alpha_block_colors, alpha_base_color, alpha_inten_table); + + constant_alpha_val = alpha_block_colors[alpha_selectors.m_lo_selector]; + } + } + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + // Handle solid color or BTC blocks, which can always be encoded from ETC1S to ASTC losslessly. + if ((pSelector->m_num_unique_selectors == 1) && (num_unique_alpha_selectors == 1)) + { + // Both color and alpha are constant, write a solid color block and exit. + // See https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#astc-void-extent-blocks + uint32_t r, g, b; + decoder_etc_block::get_block_color5(base_color, inten_table, low_selector, r, g, b); + + uint32_t* pOutput = static_cast(pDst_block); + uint8_t* pBytes = reinterpret_cast(pDst_block); + + pBytes[0] = 0xfc; pBytes[1] = 0xfd; pBytes[2] = 0xff; pBytes[3] = 0xff; + + pOutput[1] = 0xffffffff; + pOutput[2] = 0; + pOutput[3] = 0; + + int bit_pos = 64; + astc_set_bits(pOutput, bit_pos, r | (r << 8), 16); + astc_set_bits(pOutput, bit_pos, g | (g << 8), 16); + astc_set_bits(pOutput, bit_pos, b | (b << 8), 16); + astc_set_bits(pOutput, bit_pos, constant_alpha_val | (constant_alpha_val << 8), 16); + + return; + } + else if ((pSelector->m_num_unique_selectors <= 2) && (num_unique_alpha_selectors <= 2)) + { + // Both color and alpha use <= 2 unique selectors each. + // Use block truncation coding, which is lossless with ASTC (8-bit endpoints, 1-bit weights). + color32 block_colors[4]; + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + blk.m_endpoints[0] = block_colors[low_selector].r; + blk.m_endpoints[2] = block_colors[low_selector].g; + blk.m_endpoints[4] = block_colors[low_selector].b; + + blk.m_endpoints[1] = block_colors[high_selector].r; + blk.m_endpoints[3] = block_colors[high_selector].g; + blk.m_endpoints[5] = block_colors[high_selector].b; + + int s0 = blk.m_endpoints[0] + blk.m_endpoints[2] + blk.m_endpoints[4]; + int s1 = blk.m_endpoints[1] + blk.m_endpoints[3] + blk.m_endpoints[5]; + bool invert = false; + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert = true; + } + + if (transcode_alpha) + { + const endpoint& alpha_endpoint = pEndpoint_codebook[((uint16_t*)pDst_block)[0]]; + const selector& alpha_selectors = pSelector_codebook[((uint16_t*)pDst_block)[1]]; + + const color32& alpha_base_color = alpha_endpoint.m_color5; + const uint32_t alpha_inten_table = alpha_endpoint.m_inten5; + + const uint32_t alpha_low_selector = alpha_selectors.m_lo_selector; + const uint32_t alpha_high_selector = alpha_selectors.m_hi_selector; + + int alpha_block_colors[4]; + decoder_etc_block::get_block_colors5_g(alpha_block_colors, alpha_base_color, alpha_inten_table); + + blk.m_endpoints[6] = static_cast(alpha_block_colors[alpha_low_selector]); + blk.m_endpoints[7] = static_cast(alpha_block_colors[alpha_high_selector]); + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = alpha_selectors.get_selector(x, y); + s = (s == alpha_high_selector) ? 1 : 0; + + blk.m_weights[(x + y * 4) * 2 + 1] = static_cast(s); + } // x + } // y + } + else + { + blk.m_endpoints[6] = 255; + blk.m_endpoints[7] = 255; + + for (uint32_t i = 0; i < 16; i++) + blk.m_weights[i * 2 + 1] = 0; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + + s = (s == high_selector) ? 1 : 0; + + if (invert) + s = 1 - s; + + blk.m_weights[(x + y * 4) * 2] = static_cast(s); + } // x + } // y + + astc_pack_block_cem_12_weight_range0(reinterpret_cast(pDst_block), &blk); + + return; + } + + // Either alpha and/or color use > 2 unique selectors each, so we must do something more complex. + +#if BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + // The optional higher quality modes use 8-bits endpoints vs. [0,47] endpoints. + + // If the block's base color is grayscale, all pixels are grayscale, so encode the block as Luminance+Alpha. + if ((base_color.r == base_color.g) && (base_color.r == base_color.b)) + { + if (transcode_alpha) + { + const endpoint& alpha_endpoint = pEndpoint_codebook[((uint16_t*)pDst_block)[0]]; + const selector& alpha_selectors = pSelector_codebook[((uint16_t*)pDst_block)[1]]; + + const color32& alpha_base_color = alpha_endpoint.m_color5; + const uint32_t alpha_inten_table = alpha_endpoint.m_inten5; + + const uint32_t alpha_low_selector = alpha_selectors.m_lo_selector; + const uint32_t alpha_high_selector = alpha_selectors.m_hi_selector; + + if (num_unique_alpha_selectors <= 2) + { + // Simple alpha block with only 1 or 2 unique values, so use BTC. This is lossless. + int alpha_block_colors[4]; + decoder_etc_block::get_block_colors5_g(alpha_block_colors, alpha_base_color, alpha_inten_table); + + blk.m_endpoints[2] = static_cast(alpha_block_colors[alpha_low_selector]); + blk.m_endpoints[3] = static_cast(alpha_block_colors[alpha_high_selector]); + + for (uint32_t i = 0; i < 16; i++) + { + uint32_t s = alpha_selectors.get_selector(i & 3, i >> 2); + blk.m_weights[i * 2 + 1] = (s == alpha_high_selector) ? 3 : 0; + } + } + else + { + // Convert ETC1S alpha + const uint32_t alpha_selector_range_table = g_etc1_to_astc_selector_range_index[alpha_low_selector][alpha_high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc_0_255[(alpha_inten_table * 32 + alpha_base_color.g) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + alpha_selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + const uint32_t best_mapping = g_etc1_to_astc_best_grayscale_mapping_0_255[alpha_base_color.g][alpha_inten_table][alpha_selector_range_table]; + + blk.m_endpoints[2] = pTable_g[best_mapping].m_lo; + blk.m_endpoints[3] = pTable_g[best_mapping].m_hi; + + const uint8_t* pSelectors_xlat = &g_etc1_to_astc_selector_mappings[best_mapping][0]; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = alpha_selectors.get_selector(x, y); + uint32_t as = pSelectors_xlat[s]; + + blk.m_weights[(x + y * 4) * 2 + 1] = static_cast(as); + } // x + } // y + } + } + else + { + // No alpha slice - set output alpha to all 255's + blk.m_endpoints[2] = 255; + blk.m_endpoints[3] = 255; + + for (uint32_t i = 0; i < 16; i++) + blk.m_weights[i * 2 + 1] = 0; + } + + if (pSelector->m_num_unique_selectors <= 2) + { + // Simple color block with only 1 or 2 unique values, so use BTC. This is lossless. + int block_colors[4]; + decoder_etc_block::get_block_colors5_g(block_colors, base_color, inten_table); + + blk.m_endpoints[0] = static_cast(block_colors[low_selector]); + blk.m_endpoints[1] = static_cast(block_colors[high_selector]); + + for (uint32_t i = 0; i < 16; i++) + { + uint32_t s = pSelector->get_selector(i & 3, i >> 2); + blk.m_weights[i * 2] = (s == high_selector) ? 3 : 0; + } + } + else + { + // Convert ETC1S alpha + const uint32_t selector_range_table = g_etc1_to_astc_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc_0_255[(inten_table * 32 + base_color.g) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + const uint32_t best_mapping = g_etc1_to_astc_best_grayscale_mapping_0_255[base_color.g][inten_table][selector_range_table]; + + blk.m_endpoints[0] = pTable_g[best_mapping].m_lo; + blk.m_endpoints[1] = pTable_g[best_mapping].m_hi; + + const uint8_t* pSelectors_xlat = &g_etc1_to_astc_selector_mappings[best_mapping][0]; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + uint32_t as = pSelectors_xlat[s]; + + blk.m_weights[(x + y * 4) * 2] = static_cast(as); + } // x + } // y + } + + astc_pack_block_cem_4_weight_range2(reinterpret_cast(pDst_block), &blk); + return; + } + + // The block isn't grayscale and it uses > 2 unique selectors for opaque and/or alpha. + // Check for fully opaque blocks, if so use 8-bit endpoints for slightly higher opaque quality (higher than BC1, but lower than BC7 mode 6 opaque). + if ((num_unique_alpha_selectors == 1) && (constant_alpha_val == 255)) + { + // Convert ETC1S color + const uint32_t selector_range_table = g_etc1_to_astc_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_astc_solution* pTable_r = &g_etc1_to_astc_0_255[(inten_table * 32 + base_color.r) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc_0_255[(inten_table * 32 + base_color.g) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + const etc1_to_astc_solution* pTable_b = &g_etc1_to_astc_0_255[(inten_table * 32 + base_color.b) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + uint32_t best_err = UINT_MAX; + uint32_t best_mapping = 0; + + assert(NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS == 10); +#define DO_ITER(m) { uint32_t total_err = pTable_r[m].m_err + pTable_g[m].m_err + pTable_b[m].m_err; if (total_err < best_err) { best_err = total_err; best_mapping = m; } } + DO_ITER(0); DO_ITER(1); DO_ITER(2); DO_ITER(3); DO_ITER(4); + DO_ITER(5); DO_ITER(6); DO_ITER(7); DO_ITER(8); DO_ITER(9); +#undef DO_ITER + + blk.m_endpoints[0] = pTable_r[best_mapping].m_lo; + blk.m_endpoints[1] = pTable_r[best_mapping].m_hi; + + blk.m_endpoints[2] = pTable_g[best_mapping].m_lo; + blk.m_endpoints[3] = pTable_g[best_mapping].m_hi; + + blk.m_endpoints[4] = pTable_b[best_mapping].m_lo; + blk.m_endpoints[5] = pTable_b[best_mapping].m_hi; + + int s0 = blk.m_endpoints[0] + blk.m_endpoints[2] + blk.m_endpoints[4]; + int s1 = blk.m_endpoints[1] + blk.m_endpoints[3] + blk.m_endpoints[5]; + bool invert = false; + + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert = true; + } + + const uint8_t* pSelectors_xlat = &g_etc1_to_astc_selector_mappings[best_mapping][0]; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + uint32_t as = pSelectors_xlat[s]; + if (invert) + as = 3 - as; + + blk.m_weights[x + y * 4] = static_cast(as); + } // x + } // y + + // Now pack to ASTC + astc_pack_block_cem_8_weight_range2(reinterpret_cast(pDst_block), &blk); + return; + } +#endif //#if BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + + // Nothing else worked, so fall back to CEM Mode 12 (LDR RGBA Direct), [0,47] endpoints, weight range 2 (2-bit weights), dual planes. + // This mode can handle everything, but at slightly less quality than BC1. + if (transcode_alpha) + { + const endpoint& alpha_endpoint = pEndpoint_codebook[((uint16_t*)pDst_block)[0]]; + const selector& alpha_selectors = pSelector_codebook[((uint16_t*)pDst_block)[1]]; + + const color32& alpha_base_color = alpha_endpoint.m_color5; + const uint32_t alpha_inten_table = alpha_endpoint.m_inten5; + + const uint32_t alpha_low_selector = alpha_selectors.m_lo_selector; + const uint32_t alpha_high_selector = alpha_selectors.m_hi_selector; + + if (alpha_low_selector == alpha_high_selector) + { + // Solid alpha block - use precomputed tables. + int alpha_block_colors[4]; + decoder_etc_block::get_block_colors5_g(alpha_block_colors, alpha_base_color, alpha_inten_table); + + const uint32_t g = alpha_block_colors[alpha_low_selector]; + + blk.m_endpoints[6] = g_astc_single_color_encoding_1[g].m_lo; + blk.m_endpoints[7] = g_astc_single_color_encoding_1[g].m_hi; + + for (uint32_t i = 0; i < 16; i++) + blk.m_weights[i * 2 + 1] = 1; + } + else if ((alpha_inten_table >= 7) && (alpha_selectors.m_num_unique_selectors == 2) && (alpha_low_selector == 0) && (alpha_high_selector == 3)) + { + // Handle outlier case where only the two outer colors are used with inten table 7. + color32 alpha_block_colors[4]; + + decoder_etc_block::get_block_colors5(alpha_block_colors, alpha_base_color, alpha_inten_table); + + const uint32_t g0 = alpha_block_colors[0].g; + const uint32_t g1 = alpha_block_colors[3].g; + + blk.m_endpoints[6] = g_astc_single_color_encoding_0[g0]; + blk.m_endpoints[7] = g_astc_single_color_encoding_0[g1]; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = alpha_selectors.get_selector(x, y); + uint32_t as = (s == alpha_high_selector) ? 3 : 0; + + blk.m_weights[(x + y * 4) * 2 + 1] = static_cast(as); + } // x + } // y + } + else + { + // Convert ETC1S alpha + const uint32_t alpha_selector_range_table = g_etc1_to_astc_selector_range_index[alpha_low_selector][alpha_high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc[(alpha_inten_table * 32 + alpha_base_color.g) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + alpha_selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + const uint32_t best_mapping = g_etc1_to_astc_best_grayscale_mapping[alpha_base_color.g][alpha_inten_table][alpha_selector_range_table]; + + blk.m_endpoints[6] = pTable_g[best_mapping].m_lo; + blk.m_endpoints[7] = pTable_g[best_mapping].m_hi; + + const uint8_t* pSelectors_xlat = &g_etc1_to_astc_selector_mappings[best_mapping][0]; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = alpha_selectors.get_selector(x, y); + uint32_t as = pSelectors_xlat[s]; + + blk.m_weights[(x + y * 4) * 2 + 1] = static_cast(as); + } // x + } // y + } + } + else + { + // No alpha slice - set output alpha to all 255's + // 1 is 255 when dequantized + blk.m_endpoints[6] = 1; + blk.m_endpoints[7] = 1; + + for (uint32_t i = 0; i < 16; i++) + blk.m_weights[i * 2 + 1] = 0; + } + + if (low_selector == high_selector) + { + // Solid color block - use precomputed tables of optimal endpoints assuming selector weights are all 1. + color32 block_colors[4]; + + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + const uint32_t r = block_colors[low_selector].r; + const uint32_t g = block_colors[low_selector].g; + const uint32_t b = block_colors[low_selector].b; + + blk.m_endpoints[0] = g_astc_single_color_encoding_1[r].m_lo; + blk.m_endpoints[1] = g_astc_single_color_encoding_1[r].m_hi; + + blk.m_endpoints[2] = g_astc_single_color_encoding_1[g].m_lo; + blk.m_endpoints[3] = g_astc_single_color_encoding_1[g].m_hi; + + blk.m_endpoints[4] = g_astc_single_color_encoding_1[b].m_lo; + blk.m_endpoints[5] = g_astc_single_color_encoding_1[b].m_hi; + + int s0 = g_ise_to_unquant[blk.m_endpoints[0]] + g_ise_to_unquant[blk.m_endpoints[2]] + g_ise_to_unquant[blk.m_endpoints[4]]; + int s1 = g_ise_to_unquant[blk.m_endpoints[1]] + g_ise_to_unquant[blk.m_endpoints[3]] + g_ise_to_unquant[blk.m_endpoints[5]]; + bool invert = false; + + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert = true; + } + + for (uint32_t i = 0; i < 16; i++) + blk.m_weights[i * 2] = invert ? 2 : 1; + } + else if ((inten_table >= 7) && (pSelector->m_num_unique_selectors == 2) && (pSelector->m_lo_selector == 0) && (pSelector->m_hi_selector == 3)) + { + // Handle outlier case where only the two outer colors are used with inten table 7. + color32 block_colors[4]; + + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + const uint32_t r0 = block_colors[0].r; + const uint32_t g0 = block_colors[0].g; + const uint32_t b0 = block_colors[0].b; + + const uint32_t r1 = block_colors[3].r; + const uint32_t g1 = block_colors[3].g; + const uint32_t b1 = block_colors[3].b; + + blk.m_endpoints[0] = g_astc_single_color_encoding_0[r0]; + blk.m_endpoints[1] = g_astc_single_color_encoding_0[r1]; + + blk.m_endpoints[2] = g_astc_single_color_encoding_0[g0]; + blk.m_endpoints[3] = g_astc_single_color_encoding_0[g1]; + + blk.m_endpoints[4] = g_astc_single_color_encoding_0[b0]; + blk.m_endpoints[5] = g_astc_single_color_encoding_0[b1]; + + int s0 = g_ise_to_unquant[blk.m_endpoints[0]] + g_ise_to_unquant[blk.m_endpoints[2]] + g_ise_to_unquant[blk.m_endpoints[4]]; + int s1 = g_ise_to_unquant[blk.m_endpoints[1]] + g_ise_to_unquant[blk.m_endpoints[3]] + g_ise_to_unquant[blk.m_endpoints[5]]; + bool invert = false; + + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert = true; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + uint32_t as = (s == low_selector) ? 0 : 3; + + if (invert) + as = 3 - as; + + blk.m_weights[(x + y * 4) * 2] = static_cast(as); + } // x + } // y + } + else + { + // Convert ETC1S color + const uint32_t selector_range_table = g_etc1_to_astc_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_astc_solution* pTable_r = &g_etc1_to_astc[(inten_table * 32 + base_color.r) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc[(inten_table * 32 + base_color.g) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + const etc1_to_astc_solution* pTable_b = &g_etc1_to_astc[(inten_table * 32 + base_color.b) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + uint32_t best_err = UINT_MAX; + uint32_t best_mapping = 0; + + assert(NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS == 10); +#define DO_ITER(m) { uint32_t total_err = pTable_r[m].m_err + pTable_g[m].m_err + pTable_b[m].m_err; if (total_err < best_err) { best_err = total_err; best_mapping = m; } } + DO_ITER(0); DO_ITER(1); DO_ITER(2); DO_ITER(3); DO_ITER(4); + DO_ITER(5); DO_ITER(6); DO_ITER(7); DO_ITER(8); DO_ITER(9); +#undef DO_ITER + + blk.m_endpoints[0] = pTable_r[best_mapping].m_lo; + blk.m_endpoints[1] = pTable_r[best_mapping].m_hi; + + blk.m_endpoints[2] = pTable_g[best_mapping].m_lo; + blk.m_endpoints[3] = pTable_g[best_mapping].m_hi; + + blk.m_endpoints[4] = pTable_b[best_mapping].m_lo; + blk.m_endpoints[5] = pTable_b[best_mapping].m_hi; + + int s0 = g_ise_to_unquant[blk.m_endpoints[0]] + g_ise_to_unquant[blk.m_endpoints[2]] + g_ise_to_unquant[blk.m_endpoints[4]]; + int s1 = g_ise_to_unquant[blk.m_endpoints[1]] + g_ise_to_unquant[blk.m_endpoints[3]] + g_ise_to_unquant[blk.m_endpoints[5]]; + bool invert = false; + + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert = true; + } + + const uint8_t* pSelectors_xlat = &g_etc1_to_astc_selector_mappings[best_mapping][0]; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + uint32_t as = pSelectors_xlat[s]; + if (invert) + as = 3 - as; + + blk.m_weights[(x + y * 4) * 2] = static_cast(as); + } // x + } // y + } + + // Now pack to ASTC + astc_pack_block_cem_12_weight_range2(reinterpret_cast(pDst_block), &blk); + } +#endif + +#if BASISD_SUPPORT_ATC + // ATC and PVRTC2 both use these tables. + struct etc1s_to_atc_solution + { + uint8_t m_lo; + uint8_t m_hi; + uint16_t m_err; + }; + + static dxt_selector_range g_etc1s_to_atc_selector_ranges[] = + { + { 0, 3 }, + { 1, 3 }, + { 0, 2 }, + { 1, 2 }, + { 2, 3 }, + { 0, 1 }, + }; + + const uint32_t NUM_ETC1S_TO_ATC_SELECTOR_RANGES = sizeof(g_etc1s_to_atc_selector_ranges) / sizeof(g_etc1s_to_atc_selector_ranges[0]); + + static uint32_t g_etc1s_to_atc_selector_range_index[4][4]; + + const uint32_t NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS = 10; + static const uint8_t g_etc1s_to_atc_selector_mappings[NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS][4] = + { + { 0, 0, 1, 1 }, + { 0, 0, 1, 2 }, + { 0, 0, 1, 3 }, + { 0, 0, 2, 3 }, + { 0, 1, 1, 1 }, + { 0, 1, 2, 2 }, + { 0, 1, 2, 3 }, //6 - identity + { 0, 2, 3, 3 }, + { 1, 2, 2, 2 }, + { 1, 2, 3, 3 }, + }; + const uint32_t ATC_IDENTITY_SELECTOR_MAPPING_INDEX = 6; + +#if BASISD_SUPPORT_PVRTC2 + static const etc1s_to_atc_solution g_etc1s_to_pvrtc2_45[32 * 8 * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS * NUM_ETC1S_TO_ATC_SELECTOR_RANGES] = { +/**** start inlining basisu_transcoder_tables_pvrtc2_45.inc ****/ +{0,2,20},{0,1,10},{0,1,1},{0,1,9},{0,1,35},{0,1,27},{0,1,18},{0,1,61},{0,1,52},{0,0,68},{0,2,20},{0,1,10},{0,1,1},{0,1,9},{0,1,35},{0,1,27},{0,1,18},{0,1,61},{0,1,43},{0,1,61},{0,1,1},{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,1}, +{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,2,20},{0,1,10},{0,1,1},{0,1,9},{0,2,20},{0,1,18},{0,1,9},{0,1,36},{0,1,18},{0,1,36},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,4,56},{0,3,38},{0,2,52}, +{0,2,36},{0,4,56},{0,3,35},{0,2,0},{0,2,52},{0,2,88},{0,1,78},{0,4,56},{0,3,38},{0,2,52},{0,2,36},{1,0,52},{0,3,35},{0,2,0},{0,2,52},{1,1,51},{0,2,52},{0,3,37},{0,3,37},{0,3,37},{0,2,36},{0,3,10},{0,2,0},{0,2,0},{0,1,5},{0,1,35},{0,1,14},{0,3,37},{0,3,37},{0,3,37},{0,2,36},{0,3,10}, +{0,2,0},{0,2,0},{0,1,5},{1,0,16},{0,1,5},{1,1,18},{0,3,2},{0,2,16},{0,2,0},{1,1,18},{2,0,20},{0,2,0},{0,2,36},{2,0,20},{0,2,36},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,2,0},{0,2,0},{0,2,0},{0,1,1},{0,1,10},{0,1,10},{1,4,88},{1,3,78},{1,3,69},{1,3,77},{1,3,115},{0,4,88},{0,3,98}, +{0,3,101},{0,4,72},{0,3,38},{1,4,24},{1,3,14},{1,3,5},{1,3,13},{1,3,51},{0,4,24},{0,3,34},{0,3,37},{3,0,52},{0,3,37},{1,3,69},{1,3,69},{1,3,69},{1,2,72},{1,2,72},{1,2,72},{1,2,72},{1,2,72},{0,3,11},{0,2,24},{1,3,5},{1,3,5},{1,3,5},{1,2,8},{1,2,8},{1,2,8},{1,2,8},{1,2,8},{1,2,8}, +{1,2,8},{0,7,18},{1,3,10},{1,3,1},{0,3,9},{0,7,18},{1,3,18},{0,3,9},{0,3,36},{1,3,18},{0,3,36},{1,0,68},{1,0,68},{1,0,68},{1,0,68},{1,1,65},{1,1,65},{1,1,65},{0,3,65},{0,3,2},{0,3,2},{1,6,56},{1,5,38},{1,4,53},{1,4,37},{1,6,56},{1,5,35},{1,4,1},{1,4,66},{0,5,60},{0,4,70},{1,6,56}, +{1,5,38},{1,4,53},{1,4,37},{0,9,51},{1,5,35},{1,4,1},{0,4,54},{2,3,51},{0,4,54},{1,5,37},{1,5,37},{1,5,37},{1,4,36},{1,5,10},{1,4,0},{1,4,0},{1,3,5},{0,5,11},{1,3,14},{1,5,37},{1,5,37},{1,5,37},{1,4,36},{0,8,8},{1,4,0},{1,4,0},{1,3,5},{4,0,8},{1,3,5},{2,3,18},{1,5,2},{1,4,17}, +{1,4,1},{2,3,18},{4,1,18},{1,4,1},{0,4,50},{4,1,18},{0,4,50},{1,0,36},{1,0,36},{1,0,36},{1,0,36},{1,4,0},{1,4,0},{1,4,0},{1,3,1},{1,3,10},{1,3,10},{2,6,88},{2,5,78},{2,5,69},{2,5,77},{2,5,115},{2,5,107},{2,5,98},{1,5,117},{1,6,60},{1,5,36},{2,6,24},{2,5,14},{2,5,5},{2,5,13},{3,2,51}, +{1,6,35},{2,5,34},{1,5,36},{1,6,51},{1,5,36},{2,5,69},{2,5,69},{2,5,69},{2,4,72},{2,4,72},{2,4,72},{2,4,72},{2,4,72},{1,5,16},{1,5,36},{2,5,5},{2,5,5},{2,5,5},{2,4,8},{3,1,8},{2,4,8},{2,4,8},{2,4,8},{3,3,8},{2,4,8},{3,3,20},{2,5,10},{2,5,1},{2,5,9},{3,3,20},{2,5,18},{2,5,9}, +{0,5,36},{2,5,18},{0,5,36},{2,0,68},{2,0,68},{2,0,68},{2,0,68},{2,3,68},{2,3,68},{2,3,68},{2,4,68},{1,5,0},{1,5,0},{2,8,56},{2,7,38},{2,6,52},{2,6,36},{2,8,56},{2,7,35},{2,6,0},{2,6,52},{1,7,76},{1,6,70},{2,8,56},{2,7,38},{2,6,52},{2,6,36},{4,1,51},{2,7,35},{2,6,0},{1,6,45},{3,5,51}, +{1,6,45},{2,7,37},{2,7,37},{2,7,37},{2,6,36},{2,7,10},{2,6,0},{2,6,0},{2,5,5},{1,7,12},{2,5,14},{2,7,37},{2,7,37},{2,7,37},{2,6,36},{4,0,8},{2,6,0},{2,6,0},{2,5,5},{1,7,8},{2,5,5},{3,5,18},{2,7,2},{2,6,16},{2,6,0},{3,5,18},{0,9,18},{2,6,0},{0,6,36},{0,9,18},{0,6,36},{2,0,36}, +{2,0,36},{2,0,36},{2,0,36},{2,6,0},{2,6,0},{2,6,0},{2,5,1},{1,7,8},{1,7,8},{3,8,88},{3,7,78},{3,7,69},{3,7,77},{3,7,115},{2,8,88},{2,7,98},{2,7,101},{1,9,67},{2,7,38},{3,8,24},{3,7,14},{3,7,5},{3,7,13},{3,7,51},{2,8,24},{2,7,34},{2,7,37},{8,0,51},{2,7,37},{3,7,69},{3,7,69},{3,7,69}, +{3,6,72},{3,6,72},{3,6,72},{3,6,72},{3,6,72},{2,7,11},{2,6,24},{3,7,5},{3,7,5},{3,7,5},{3,6,8},{3,6,8},{3,6,8},{3,6,8},{3,6,8},{3,6,8},{3,6,8},{5,1,18},{3,7,10},{3,7,1},{2,7,9},{5,1,18},{3,7,18},{2,7,9},{0,7,36},{3,7,18},{0,7,36},{3,0,68},{3,0,68},{3,0,68},{3,0,68},{3,5,65}, +{3,5,65},{3,5,65},{2,7,65},{2,7,2},{2,7,2},{3,10,56},{3,9,38},{3,8,53},{3,8,37},{3,10,56},{3,9,35},{3,8,1},{3,8,66},{2,9,60},{2,8,70},{3,10,56},{3,9,38},{3,8,53},{3,8,37},{5,3,51},{3,9,35},{3,8,1},{2,8,54},{4,7,51},{2,8,54},{3,9,37},{3,9,37},{3,9,37},{3,8,36},{3,9,10},{3,8,0},{3,8,0}, +{3,7,5},{2,9,11},{3,7,14},{3,9,37},{3,9,37},{3,9,37},{3,8,36},{5,2,8},{3,8,0},{3,8,0},{3,7,5},{8,1,8},{3,7,5},{4,7,18},{3,9,2},{3,8,17},{3,8,1},{4,7,18},{8,2,18},{3,8,1},{0,8,50},{8,2,18},{0,8,50},{3,0,36},{3,0,36},{3,0,36},{3,0,36},{3,8,0},{3,8,0},{3,8,0},{3,7,1},{3,7,10}, +{3,7,10},{4,10,88},{4,9,78},{4,9,69},{4,9,77},{4,9,115},{4,9,107},{4,9,98},{3,9,117},{3,10,60},{3,9,36},{4,10,24},{4,9,14},{4,9,5},{4,9,13},{5,6,51},{3,10,35},{4,9,34},{3,9,36},{10,1,51},{3,9,36},{4,9,69},{4,9,69},{4,9,69},{4,8,72},{4,8,72},{4,8,72},{4,8,72},{4,8,72},{3,9,16},{3,9,36},{4,9,5}, +{4,9,5},{4,9,5},{4,8,8},{5,5,8},{4,8,8},{4,8,8},{4,8,8},{5,7,8},{4,8,8},{7,0,18},{4,9,10},{4,9,1},{4,9,9},{7,0,18},{4,9,18},{4,9,9},{0,9,36},{4,9,18},{0,9,36},{4,0,68},{4,0,68},{4,0,68},{4,0,68},{4,7,68},{4,7,68},{4,7,68},{4,8,68},{3,9,0},{3,9,0},{4,12,56},{4,11,38},{4,10,52}, +{4,10,36},{4,12,56},{4,11,35},{4,10,0},{4,10,52},{3,11,76},{3,10,70},{4,12,56},{4,11,38},{4,10,52},{4,10,36},{7,2,51},{4,11,35},{4,10,0},{3,10,45},{12,0,51},{3,10,45},{4,11,37},{4,11,37},{4,11,37},{4,10,36},{4,11,10},{4,10,0},{4,10,0},{4,9,5},{3,11,12},{4,9,14},{4,11,37},{4,11,37},{4,11,37},{4,10,36},{7,1,8}, +{4,10,0},{4,10,0},{4,9,5},{10,2,8},{4,9,5},{5,9,18},{4,11,2},{4,10,16},{4,10,0},{5,9,18},{10,3,18},{4,10,0},{0,10,36},{10,3,18},{0,10,36},{4,0,36},{4,0,36},{4,0,36},{4,0,36},{4,10,0},{4,10,0},{4,10,0},{4,9,1},{3,11,8},{3,11,8},{5,12,88},{5,11,78},{5,11,69},{5,11,77},{5,11,115},{4,12,88},{4,11,98}, +{4,11,101},{3,13,67},{4,11,38},{5,12,24},{5,11,14},{5,11,5},{5,11,13},{5,11,51},{4,12,24},{4,11,34},{4,11,37},{11,3,51},{4,11,37},{5,11,69},{5,11,69},{5,11,69},{5,10,72},{5,10,72},{5,10,72},{5,10,72},{5,10,72},{4,11,11},{4,10,24},{5,11,5},{5,11,5},{5,11,5},{5,10,8},{5,10,8},{5,10,8},{5,10,8},{5,10,8},{12,1,8}, +{5,10,8},{8,0,18},{5,11,10},{5,11,1},{4,11,9},{8,0,18},{12,2,18},{4,11,9},{0,11,36},{12,2,18},{0,11,36},{5,0,68},{5,0,68},{5,0,68},{5,0,68},{5,9,65},{5,9,65},{5,9,65},{4,11,65},{4,11,2},{4,11,2},{5,14,56},{5,13,38},{5,12,53},{5,12,37},{5,14,56},{5,13,35},{5,12,1},{5,12,66},{4,13,60},{4,12,70},{5,14,56}, +{5,13,38},{5,12,53},{5,12,37},{8,2,51},{5,13,35},{5,12,1},{4,12,54},{13,2,51},{4,12,54},{5,13,37},{5,13,37},{5,13,37},{5,12,36},{5,13,10},{5,12,0},{5,12,0},{5,11,5},{4,13,11},{5,11,14},{5,13,37},{5,13,37},{5,13,37},{5,12,36},{8,1,8},{5,12,0},{5,12,0},{5,11,5},{10,5,8},{5,11,5},{6,11,18},{5,13,2},{5,12,17}, +{5,12,1},{6,11,18},{15,0,18},{5,12,1},{0,12,50},{15,0,18},{0,12,50},{5,0,36},{5,0,36},{5,0,36},{5,0,36},{5,12,0},{5,12,0},{5,12,0},{5,11,1},{5,11,10},{5,11,10},{6,14,88},{6,13,78},{6,13,69},{6,13,77},{6,13,115},{6,13,107},{6,13,98},{5,13,117},{5,14,60},{5,13,36},{6,14,24},{6,13,14},{6,13,5},{6,13,13},{8,5,51}, +{5,14,35},{6,13,34},{5,13,36},{12,5,51},{5,13,36},{6,13,69},{6,13,69},{6,13,69},{6,12,72},{6,12,72},{6,12,72},{6,12,72},{6,12,72},{5,13,16},{5,13,36},{6,13,5},{6,13,5},{6,13,5},{6,12,8},{8,4,8},{6,12,8},{6,12,8},{6,12,8},{14,2,8},{6,12,8},{3,24,18},{6,13,10},{6,13,1},{6,13,9},{3,24,18},{14,3,18},{6,13,9}, +{0,13,36},{14,3,18},{0,13,36},{6,0,68},{6,0,68},{6,0,68},{6,0,68},{6,11,68},{6,11,68},{6,11,68},{6,12,68},{5,13,0},{5,13,0},{6,16,56},{6,15,38},{6,14,52},{6,14,36},{6,16,56},{6,15,35},{6,14,0},{6,14,52},{5,15,76},{5,14,70},{6,16,56},{6,15,38},{6,14,52},{6,14,36},{3,26,51},{6,15,35},{6,14,0},{5,14,45},{15,3,51}, +{5,14,45},{6,15,37},{6,15,37},{6,15,37},{6,14,36},{6,15,10},{6,14,0},{6,14,0},{6,13,5},{5,15,12},{6,13,14},{6,15,37},{6,15,37},{6,15,37},{6,14,36},{3,25,8},{6,14,0},{6,14,0},{6,13,5},{12,6,8},{6,13,5},{9,5,18},{6,15,2},{6,14,16},{6,14,0},{9,5,18},{12,7,18},{6,14,0},{0,14,36},{12,7,18},{0,14,36},{6,0,36}, +{6,0,36},{6,0,36},{6,0,36},{6,14,0},{6,14,0},{6,14,0},{6,13,1},{5,15,8},{5,15,8},{7,16,88},{7,15,78},{7,15,69},{7,15,77},{7,15,115},{6,16,88},{6,15,98},{6,15,101},{5,17,67},{6,15,38},{7,16,24},{7,15,14},{7,15,5},{7,15,13},{11,0,51},{6,16,24},{6,15,34},{6,15,37},{13,7,51},{6,15,37},{7,15,69},{7,15,69},{7,15,69}, +{7,14,72},{7,14,72},{7,14,72},{7,14,72},{7,14,72},{6,15,11},{6,14,24},{7,15,5},{7,15,5},{7,15,5},{7,14,8},{9,6,8},{7,14,8},{7,14,8},{7,14,8},{14,5,8},{7,14,8},{10,4,18},{7,15,10},{7,15,1},{6,15,9},{10,4,18},{14,6,18},{6,15,9},{0,15,36},{14,6,18},{0,15,36},{7,0,68},{7,0,68},{7,0,68},{7,0,68},{7,13,65}, +{7,13,65},{7,13,65},{6,15,65},{6,15,2},{6,15,2},{7,18,56},{7,17,38},{7,16,53},{7,16,37},{7,18,56},{7,17,35},{7,16,1},{7,16,66},{6,17,60},{6,16,70},{7,18,56},{7,17,38},{7,16,53},{7,16,37},{10,6,51},{7,17,35},{7,16,1},{6,16,54},{15,6,51},{6,16,54},{7,17,37},{7,17,37},{7,17,37},{7,16,36},{7,17,10},{7,16,0},{7,16,0}, +{7,15,5},{6,17,11},{7,15,14},{7,17,37},{7,17,37},{7,17,37},{7,16,36},{10,5,8},{7,16,0},{7,16,0},{7,15,5},{12,9,8},{7,15,5},{12,0,18},{7,17,2},{7,16,17},{7,16,1},{12,0,18},{12,10,18},{7,16,1},{0,16,50},{12,10,18},{0,16,50},{7,0,36},{7,0,36},{7,0,36},{7,0,36},{7,16,0},{7,16,0},{7,16,0},{7,15,1},{7,15,10}, +{7,15,10},{7,21,326},{7,19,322},{8,17,392},{7,17,322},{7,21,137},{7,18,116},{7,17,133},{7,17,117},{7,18,60},{7,17,36},{8,16,118},{8,16,134},{8,17,136},{8,17,136},{10,9,51},{7,18,35},{7,17,52},{7,17,36},{14,9,51},{7,17,36},{7,20,307},{7,20,307},{7,20,307},{7,18,307},{7,20,91},{7,18,91},{7,18,91},{7,16,110},{7,17,16},{7,17,36},{8,15,101}, +{8,15,101},{8,15,101},{8,16,101},{10,8,8},{7,18,10},{7,18,10},{7,16,29},{11,12,8},{7,16,29},{12,3,18},{7,19,16},{8,17,36},{7,17,16},{12,3,18},{11,13,18},{7,17,16},{0,17,36},{11,13,18},{0,17,36},{7,0,306},{7,0,306},{7,0,306},{7,0,306},{7,19,81},{7,19,81},{7,19,81},{7,17,81},{7,17,0},{7,17,0},{8,19,88},{8,18,78},{8,18,69}, +{8,18,77},{8,18,115},{8,18,107},{8,18,98},{8,17,136},{7,19,76},{7,18,70},{8,19,24},{8,18,14},{8,18,5},{8,18,13},{9,15,51},{8,18,43},{8,18,34},{7,18,45},{5,22,51},{7,18,45},{8,18,69},{8,18,69},{8,18,69},{8,17,72},{8,17,72},{8,17,72},{8,17,72},{8,17,72},{7,19,12},{7,18,70},{8,18,5},{8,18,5},{8,18,5},{8,17,8},{9,14,8}, +{8,17,8},{8,17,8},{8,17,8},{14,10,8},{8,17,8},{11,9,18},{8,18,10},{8,18,1},{8,18,9},{11,9,18},{14,11,18},{8,18,9},{0,18,36},{14,11,18},{0,18,36},{8,0,68},{8,0,68},{8,0,68},{8,0,68},{8,16,65},{8,16,65},{8,16,65},{8,17,68},{7,19,8},{7,19,8},{8,21,56},{8,20,38},{8,19,52},{8,19,36},{8,21,56},{8,20,35},{8,19,0}, +{8,19,52},{7,21,67},{8,18,78},{8,21,56},{8,20,38},{8,19,52},{8,19,36},{13,4,51},{8,20,35},{8,19,0},{8,19,52},{15,11,51},{8,19,52},{8,20,37},{8,20,37},{8,20,37},{8,19,36},{8,20,10},{8,19,0},{8,19,0},{8,18,5},{8,18,35},{8,18,14},{8,20,37},{8,20,37},{8,20,37},{8,19,36},{11,10,8},{8,19,0},{8,19,0},{8,18,5},{5,23,8}, +{8,18,5},{12,8,18},{8,20,2},{8,19,16},{8,19,0},{12,8,18},{11,16,18},{8,19,0},{0,19,36},{11,16,18},{0,19,36},{8,0,36},{8,0,36},{8,0,36},{8,0,36},{8,19,0},{8,19,0},{8,19,0},{8,18,1},{8,18,10},{8,18,10},{9,21,88},{9,20,78},{9,20,70},{9,20,78},{9,20,115},{8,21,88},{8,20,99},{8,20,115},{8,21,72},{8,20,52},{9,21,24}, +{9,20,14},{9,20,6},{9,20,14},{15,0,51},{8,21,24},{8,20,35},{8,20,51},{12,16,51},{8,20,51},{9,20,69},{9,20,69},{9,20,69},{9,19,72},{9,19,72},{9,19,72},{9,19,72},{9,19,72},{8,20,11},{8,19,24},{9,20,5},{9,20,5},{9,20,5},{9,19,8},{12,9,8},{9,19,8},{9,19,8},{9,19,8},{14,13,8},{9,19,8},{14,4,18},{9,20,10},{9,20,2}, +{8,20,10},{14,4,18},{14,14,18},{8,20,10},{0,20,50},{14,14,18},{0,20,50},{9,0,68},{9,0,68},{9,0,68},{9,0,68},{9,18,65},{9,18,65},{9,18,65},{8,20,65},{8,20,2},{8,20,2},{9,24,70},{9,22,58},{9,21,75},{9,21,51},{9,23,52},{9,22,25},{9,21,3},{9,21,46},{8,23,68},{8,21,70},{9,24,69},{9,22,57},{9,21,74},{9,21,50},{15,3,51}, +{9,22,24},{9,21,2},{8,21,45},{11,19,51},{8,21,45},{9,23,51},{9,23,51},{9,23,51},{9,21,51},{9,22,9},{9,21,3},{9,21,3},{9,20,9},{8,22,12},{9,20,12},{9,23,50},{9,23,50},{9,23,50},{9,21,50},{15,2,8},{9,21,2},{9,21,2},{9,20,8},{13,16,8},{9,20,8},{14,7,18},{9,22,8},{9,21,25},{9,21,1},{14,7,18},{13,17,18},{9,21,1}, +{0,21,36},{13,17,18},{0,21,36},{9,0,50},{9,0,50},{9,0,50},{9,0,50},{9,21,2},{9,21,2},{9,21,2},{9,20,5},{9,20,8},{9,20,8},{10,23,88},{10,22,78},{10,22,69},{10,22,77},{10,22,115},{10,22,107},{10,22,98},{9,22,117},{9,23,60},{9,22,36},{10,23,24},{10,22,14},{10,22,5},{10,22,13},{11,19,51},{9,23,35},{10,22,34},{9,22,36},{9,23,51}, +{9,22,36},{10,22,69},{10,22,69},{10,22,69},{10,21,72},{10,21,72},{10,21,72},{10,21,72},{10,21,72},{9,22,16},{9,22,36},{10,22,5},{10,22,5},{10,22,5},{10,21,8},{11,18,8},{10,21,8},{10,21,8},{10,21,8},{10,21,8},{10,21,8},{13,13,18},{10,22,10},{10,22,1},{10,22,9},{13,13,18},{15,16,18},{10,22,9},{0,22,36},{15,16,18},{0,22,36},{10,0,68}, +{10,0,68},{10,0,68},{10,0,68},{10,20,65},{10,20,65},{10,20,65},{10,21,68},{9,22,0},{9,22,0},{10,25,56},{10,24,38},{10,23,52},{10,23,36},{10,25,56},{10,24,35},{10,23,0},{10,23,52},{9,24,63},{9,23,70},{10,25,56},{10,24,38},{10,23,52},{10,23,36},{15,8,51},{10,24,35},{10,23,0},{9,23,45},{11,22,51},{9,23,45},{10,24,37},{10,24,37},{10,24,37}, +{10,23,36},{10,24,10},{10,23,0},{10,23,0},{10,22,5},{9,24,14},{10,22,14},{10,24,37},{10,24,37},{10,24,37},{10,23,36},{13,14,8},{10,23,0},{10,23,0},{10,22,5},{8,25,8},{10,22,5},{14,12,18},{10,24,2},{10,23,16},{10,23,0},{14,12,18},{13,20,18},{10,23,0},{0,23,36},{13,20,18},{0,23,36},{10,0,36},{10,0,36},{10,0,36},{10,0,36},{10,23,0}, +{10,23,0},{10,23,0},{10,22,1},{10,22,10},{10,22,10},{11,25,88},{11,24,78},{11,24,70},{11,24,78},{11,24,115},{10,25,88},{10,24,99},{10,24,115},{9,26,67},{10,24,52},{11,25,24},{11,24,14},{11,24,6},{11,24,14},{14,14,51},{10,25,24},{10,24,35},{10,24,51},{14,20,51},{10,24,51},{11,24,69},{11,24,69},{11,24,69},{11,23,72},{11,23,72},{11,23,72},{11,23,72}, +{11,23,72},{10,24,11},{10,23,24},{11,24,5},{11,24,5},{11,24,5},{11,23,8},{14,13,8},{11,23,8},{11,23,8},{11,23,8},{11,23,8},{11,23,8},{13,18,18},{11,24,10},{11,24,2},{10,24,10},{13,18,18},{11,24,18},{10,24,10},{0,24,50},{11,24,18},{0,24,50},{11,0,68},{11,0,68},{11,0,68},{11,0,68},{11,22,65},{11,22,65},{11,22,65},{10,24,65},{10,24,2}, +{10,24,2},{11,28,70},{11,26,58},{11,25,75},{11,25,51},{11,27,52},{11,26,25},{11,25,3},{11,25,46},{10,27,68},{10,25,70},{11,28,69},{11,26,57},{11,25,74},{11,25,50},{14,17,51},{11,26,24},{11,25,2},{10,25,45},{13,23,51},{10,25,45},{11,27,51},{11,27,51},{11,27,51},{11,25,51},{11,26,9},{11,25,3},{11,25,3},{11,24,9},{10,26,12},{11,24,12},{11,27,50}, +{11,27,50},{11,27,50},{11,25,50},{14,16,8},{11,25,2},{11,25,2},{11,24,8},{15,20,8},{11,24,8},{13,21,18},{11,26,8},{11,25,25},{11,25,1},{13,21,18},{15,21,18},{11,25,1},{0,25,36},{15,21,18},{0,25,36},{11,0,50},{11,0,50},{11,0,50},{11,0,50},{11,25,2},{11,25,2},{11,25,2},{11,24,5},{11,24,8},{11,24,8},{12,27,88},{12,26,78},{12,26,69}, +{12,26,77},{12,26,115},{12,26,107},{12,26,98},{11,26,117},{11,27,60},{11,26,36},{12,27,24},{12,26,14},{12,26,5},{12,26,13},{13,23,51},{11,27,35},{12,26,34},{11,26,36},{11,27,51},{11,26,36},{12,26,69},{12,26,69},{12,26,69},{12,25,72},{12,25,72},{12,25,72},{12,25,72},{12,25,72},{11,26,16},{11,26,36},{12,26,5},{12,26,5},{12,26,5},{12,25,8},{13,22,8}, +{12,25,8},{12,25,8},{12,25,8},{12,25,8},{12,25,8},{15,17,18},{12,26,10},{12,26,1},{12,26,9},{15,17,18},{12,26,18},{12,26,9},{0,26,36},{12,26,18},{0,26,36},{12,0,68},{12,0,68},{12,0,68},{12,0,68},{12,24,65},{12,24,65},{12,24,65},{12,25,68},{11,26,0},{11,26,0},{12,29,56},{12,28,38},{12,27,52},{12,27,36},{12,29,56},{12,28,35},{12,27,0}, +{12,27,52},{11,28,63},{11,27,70},{12,29,56},{12,28,38},{12,27,52},{12,27,36},{15,19,51},{12,28,35},{12,27,0},{11,27,45},{13,26,51},{11,27,45},{12,28,37},{12,28,37},{12,28,37},{12,27,36},{12,28,10},{12,27,0},{12,27,0},{12,26,5},{11,28,14},{12,26,14},{12,28,37},{12,28,37},{12,28,37},{12,27,36},{15,18,8},{12,27,0},{12,27,0},{12,26,5},{10,29,8}, +{12,26,5},{13,26,18},{12,28,2},{12,27,16},{12,27,0},{13,26,18},{15,24,18},{12,27,0},{0,27,36},{15,24,18},{0,27,36},{12,0,36},{12,0,36},{12,0,36},{12,0,36},{12,27,0},{12,27,0},{12,27,0},{12,26,1},{12,26,10},{12,26,10},{13,29,88},{13,28,78},{13,28,70},{13,28,78},{13,28,115},{12,29,88},{12,28,99},{12,28,115},{11,30,67},{12,28,52},{13,29,24}, +{13,28,14},{13,28,6},{13,28,14},{13,28,51},{12,29,24},{12,28,35},{12,28,51},{11,30,51},{12,28,51},{13,28,69},{13,28,69},{13,28,69},{13,27,72},{13,27,72},{13,27,72},{13,27,72},{13,27,72},{12,28,11},{12,27,24},{13,28,5},{13,28,5},{13,28,5},{13,27,8},{13,27,8},{13,27,8},{13,27,8},{13,27,8},{13,27,8},{13,27,8},{15,22,18},{13,28,10},{13,28,2}, +{12,28,10},{15,22,18},{13,28,18},{12,28,10},{0,28,50},{13,28,18},{0,28,50},{13,0,68},{13,0,68},{13,0,68},{13,0,68},{13,26,65},{13,26,65},{13,26,65},{12,28,65},{12,28,2},{12,28,2},{13,31,76},{13,30,58},{13,29,75},{13,29,51},{13,31,52},{13,30,25},{13,29,3},{13,29,46},{12,31,68},{12,29,70},{13,31,75},{13,30,57},{13,29,74},{13,29,50},{13,31,51}, +{13,30,24},{13,29,2},{12,29,45},{15,27,51},{12,29,45},{13,31,51},{13,31,51},{13,31,51},{13,29,51},{13,30,9},{13,29,3},{13,29,3},{13,28,9},{12,30,12},{13,28,12},{13,31,50},{13,31,50},{13,31,50},{13,29,50},{13,30,8},{13,29,2},{13,29,2},{13,28,8},{12,30,8},{13,28,8},{15,25,18},{13,30,8},{13,29,25},{13,29,1},{15,25,18},{12,31,18},{13,29,1}, +{0,29,36},{12,31,18},{0,29,36},{13,0,50},{13,0,50},{13,0,50},{13,0,50},{13,29,2},{13,29,2},{13,29,2},{13,28,5},{13,28,8},{13,28,8},{14,31,88},{14,30,78},{14,30,69},{14,30,77},{14,30,115},{14,30,107},{14,30,98},{13,30,117},{13,31,60},{13,30,36},{14,31,24},{14,30,14},{14,30,5},{14,30,13},{15,27,51},{13,31,35},{14,30,34},{13,30,36},{13,31,51}, +{13,30,36},{14,30,69},{14,30,69},{14,30,69},{14,29,72},{14,29,72},{14,29,72},{14,29,72},{14,29,72},{13,30,16},{13,30,36},{14,30,5},{14,30,5},{14,30,5},{14,29,8},{15,26,8},{14,29,8},{14,29,8},{14,29,8},{14,29,8},{14,29,8},{14,31,20},{14,30,10},{14,30,1},{14,30,9},{14,31,20},{14,30,18},{14,30,9},{0,30,36},{14,30,18},{0,30,36},{14,0,68}, +{14,0,68},{14,0,68},{14,0,68},{14,28,65},{14,28,65},{14,28,65},{14,29,68},{13,30,0},{13,30,0},{14,31,152},{14,31,88},{14,31,52},{14,31,36},{14,31,116},{14,31,36},{14,31,0},{14,31,52},{14,31,88},{13,31,70},{15,30,118},{14,31,88},{14,31,52},{14,31,36},{15,29,52},{14,31,36},{14,31,0},{13,31,45},{15,30,51},{13,31,45},{14,31,52},{14,31,52},{14,31,52}, +{14,31,36},{14,31,16},{14,31,0},{14,31,0},{14,30,5},{14,30,35},{14,30,14},{14,31,52},{14,31,52},{14,31,52},{14,31,36},{15,28,10},{14,31,0},{14,31,0},{14,30,5},{15,29,16},{14,30,5},{15,30,18},{15,30,34},{14,31,16},{14,31,0},{15,30,18},{15,30,26},{14,31,0},{0,31,36},{15,30,26},{0,31,36},{14,0,36},{14,0,36},{14,0,36},{14,0,36},{14,31,0}, +{14,31,0},{14,31,0},{14,30,1},{14,30,10},{14,30,10},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{14,31,20},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68}, +{15,31,68},{14,31,56},{14,31,20},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{15,0,68},{15,0,68},{15,0,68},{15,0,68},{15,30,65},{15,30,65},{15,30,65},{15,31,68},{14,31,20}, +{14,31,20},{0,4,74},{0,3,20},{0,2,2},{0,2,26},{0,2,158},{0,2,110},{0,2,62},{0,1,115},{0,1,178},{0,1,124},{0,4,74},{0,3,20},{0,2,2},{0,2,26},{0,2,158},{0,2,110},{0,2,62},{0,1,115},{1,0,158},{0,1,115},{0,2,1},{0,2,1},{0,2,1},{0,1,0},{0,1,13},{0,1,9},{0,1,9},{0,0,25},{0,0,25},{0,0,25},{0,2,1}, +{0,2,1},{0,2,1},{0,1,0},{0,1,13},{0,1,9},{0,1,9},{0,0,25},{0,0,25},{0,0,25},{1,0,74},{0,3,20},{0,2,2},{0,2,26},{1,0,74},{1,1,72},{0,2,26},{0,1,90},{1,1,72},{0,1,90},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,6,83},{0,5,13},{0,3,26}, +{0,3,14},{0,5,248},{0,3,140},{0,3,41},{0,2,139},{0,2,319},{0,2,175},{0,6,83},{0,5,13},{0,3,26},{0,3,14},{1,1,244},{0,3,140},{0,3,41},{0,2,139},{0,3,248},{0,2,139},{0,4,10},{0,4,10},{0,4,10},{0,3,13},{0,3,52},{0,2,18},{0,2,18},{0,1,29},{0,1,77},{0,1,38},{0,4,10},{0,4,10},{0,4,10},{0,3,13},{0,3,52}, +{0,2,18},{0,2,18},{0,1,29},{1,0,58},{0,1,29},{1,3,72},{0,5,4},{0,3,17},{0,3,5},{1,3,72},{3,0,74},{0,3,5},{0,2,90},{3,0,74},{0,2,90},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,1,0},{0,1,0},{0,1,0},{0,1,4},{0,0,9},{0,0,9},{0,9,193},{0,7,125},{0,4,202},{0,4,122},{0,7,244},{0,5,96},{0,4,2}, +{0,3,106},{0,4,395},{0,3,187},{1,6,99},{1,5,45},{1,4,26},{1,4,50},{1,4,243},{0,5,96},{0,4,2},{0,3,106},{2,2,243},{0,3,106},{0,7,121},{0,7,121},{0,7,121},{0,4,122},{0,5,52},{0,4,2},{0,4,2},{0,3,25},{0,3,133},{0,2,62},{1,4,26},{1,4,26},{1,4,26},{1,3,25},{1,2,50},{0,4,2},{0,4,2},{0,3,25},{1,2,50}, +{0,3,25},{0,9,72},{0,7,4},{1,4,1},{0,4,1},{0,9,72},{2,3,72},{0,4,1},{0,3,90},{2,3,72},{0,3,90},{0,0,121},{0,0,121},{0,0,121},{0,0,121},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,2,37},{0,2,37},{1,8,164},{1,7,94},{1,5,106},{1,5,94},{0,10,292},{0,7,125},{0,5,81},{0,4,130},{0,6,364},{0,4,106},{1,8,83}, +{1,7,13},{1,5,25},{1,5,13},{3,0,243},{0,7,76},{0,5,32},{0,4,81},{5,0,243},{0,4,81},{1,6,91},{1,6,91},{1,6,91},{1,5,94},{0,8,99},{0,6,51},{0,6,51},{0,4,66},{0,4,107},{0,4,42},{1,6,10},{1,6,10},{1,6,10},{1,5,13},{0,8,50},{0,6,2},{0,6,2},{0,4,17},{4,0,50},{0,4,17},{3,2,74},{1,7,4},{1,5,16}, +{1,5,4},{3,2,74},{5,1,72},{1,5,4},{0,4,80},{5,1,72},{0,4,80},{1,0,90},{1,0,90},{1,0,90},{1,0,90},{0,6,50},{0,6,50},{0,6,50},{0,4,50},{0,3,20},{0,3,20},{1,11,218},{1,9,149},{1,7,242},{1,6,149},{1,10,248},{1,7,99},{1,6,5},{1,5,99},{0,7,308},{0,5,100},{2,8,99},{2,7,45},{2,6,27},{2,6,51},{3,3,243}, +{0,9,81},{1,6,5},{0,5,99},{4,3,243},{0,5,99},{1,9,145},{1,9,145},{1,9,145},{1,6,148},{1,8,52},{1,6,4},{1,6,4},{1,5,18},{0,6,72},{0,5,19},{2,6,26},{2,6,26},{2,6,26},{2,5,25},{3,1,50},{1,6,4},{1,6,4},{0,5,18},{3,3,50},{0,5,18},{4,1,72},{1,9,5},{2,6,2},{1,6,5},{4,1,72},{3,5,72},{1,6,5}, +{0,5,90},{3,5,72},{0,5,90},{1,0,144},{1,0,144},{1,0,144},{1,0,144},{1,6,0},{1,6,0},{1,6,0},{1,4,4},{0,6,8},{0,6,8},{2,10,164},{2,9,94},{2,7,107},{2,7,95},{1,12,307},{1,9,137},{1,7,115},{1,6,154},{0,9,253},{1,6,106},{2,10,83},{2,9,13},{2,7,26},{2,7,14},{4,2,243},{1,9,73},{2,7,41},{1,6,90},{6,2,243}, +{1,6,90},{2,8,91},{2,8,91},{2,8,91},{2,7,94},{1,10,116},{1,8,69},{1,8,69},{1,6,73},{0,8,50},{1,6,25},{2,8,10},{2,8,10},{2,8,10},{2,7,13},{4,0,50},{1,8,5},{1,8,5},{1,6,9},{1,7,50},{1,6,9},{3,7,72},{2,9,4},{2,7,17},{2,7,5},{3,7,72},{8,0,72},{2,7,5},{0,6,90},{8,0,72},{0,6,90},{2,0,90}, +{2,0,90},{2,0,90},{2,0,90},{1,9,65},{1,9,65},{1,9,65},{1,6,64},{0,7,10},{0,7,10},{2,13,194},{2,11,126},{2,8,203},{2,8,123},{2,11,245},{2,9,97},{2,8,3},{2,7,107},{0,11,249},{1,7,100},{3,10,99},{3,9,45},{3,8,26},{3,8,50},{3,8,243},{1,11,81},{2,8,2},{1,7,99},{4,6,243},{1,7,99},{2,11,122},{2,11,122},{2,11,122}, +{2,8,123},{2,9,53},{2,8,3},{2,8,3},{2,7,26},{1,8,62},{1,7,19},{3,8,26},{3,8,26},{3,8,26},{3,7,25},{3,6,50},{2,8,2},{2,8,2},{1,7,18},{3,6,50},{1,7,18},{5,3,72},{2,11,4},{3,8,1},{2,8,1},{5,3,72},{4,7,72},{2,8,1},{0,7,90},{4,7,72},{0,7,90},{2,0,122},{2,0,122},{2,0,122},{2,0,122},{2,8,2}, +{2,8,2},{2,8,2},{2,6,2},{1,7,10},{1,7,10},{3,12,164},{3,11,94},{3,9,106},{3,9,94},{2,14,292},{2,11,125},{2,9,81},{2,8,130},{1,11,253},{2,8,106},{3,12,83},{3,11,13},{3,9,25},{3,9,13},{5,4,243},{2,11,76},{2,9,32},{2,8,81},{9,1,243},{2,8,81},{3,10,91},{3,10,91},{3,10,91},{3,9,94},{2,12,99},{2,10,51},{2,10,51}, +{2,8,66},{1,10,50},{2,8,42},{3,10,10},{3,10,10},{3,10,10},{3,9,13},{5,2,50},{2,10,2},{2,10,2},{2,8,17},{8,1,50},{2,8,17},{1,19,72},{3,11,4},{3,9,16},{3,9,4},{1,19,72},{9,2,72},{3,9,4},{0,8,80},{9,2,72},{0,8,80},{3,0,90},{3,0,90},{3,0,90},{3,0,90},{2,10,50},{2,10,50},{2,10,50},{2,8,50},{1,9,9}, +{1,9,9},{3,15,218},{3,13,149},{3,11,242},{3,10,149},{3,14,248},{3,11,99},{3,10,5},{3,9,99},{1,13,244},{2,9,100},{4,12,99},{4,11,45},{4,10,27},{4,10,51},{5,7,243},{2,13,81},{3,10,5},{2,9,99},{6,7,243},{2,9,99},{3,13,145},{3,13,145},{3,13,145},{3,10,148},{3,12,52},{3,10,4},{3,10,4},{3,9,18},{1,12,56},{2,9,19},{4,10,26}, +{4,10,26},{4,10,26},{4,9,25},{5,5,50},{3,10,4},{3,10,4},{2,9,18},{5,7,50},{2,9,18},{7,2,72},{3,13,5},{4,10,2},{3,10,5},{7,2,72},{12,0,72},{3,10,5},{0,9,90},{12,0,72},{0,9,90},{3,0,144},{3,0,144},{3,0,144},{3,0,144},{3,10,0},{3,10,0},{3,10,0},{3,8,4},{2,10,8},{2,10,8},{4,14,164},{4,13,94},{4,11,107}, +{4,11,95},{3,16,307},{3,13,137},{3,11,115},{3,10,154},{2,13,253},{3,10,106},{4,14,83},{4,13,13},{4,11,26},{4,11,14},{7,3,243},{3,13,73},{4,11,41},{3,10,90},{11,2,243},{3,10,90},{4,12,91},{4,12,91},{4,12,91},{4,11,94},{3,14,116},{3,12,69},{3,12,69},{3,10,73},{2,12,50},{3,10,25},{4,12,10},{4,12,10},{4,12,10},{4,11,13},{7,1,50}, +{3,12,5},{3,12,5},{3,10,9},{10,2,50},{3,10,9},{5,11,72},{4,13,4},{4,11,17},{4,11,5},{5,11,72},{11,3,72},{4,11,5},{0,10,90},{11,3,72},{0,10,90},{4,0,90},{4,0,90},{4,0,90},{4,0,90},{3,13,65},{3,13,65},{3,13,65},{3,10,64},{2,11,10},{2,11,10},{4,17,194},{4,15,126},{4,12,203},{4,12,123},{4,15,245},{4,13,97},{4,12,3}, +{4,11,107},{2,15,249},{3,11,100},{5,14,99},{5,13,45},{5,12,26},{5,12,50},{5,12,243},{3,15,81},{4,12,2},{3,11,99},{13,1,243},{3,11,99},{4,15,122},{4,15,122},{4,15,122},{4,12,123},{4,13,53},{4,12,3},{4,12,3},{4,11,26},{3,12,62},{3,11,19},{5,12,26},{5,12,26},{5,12,26},{5,11,25},{5,10,50},{4,12,2},{4,12,2},{3,11,18},{12,1,50}, +{3,11,18},{8,2,72},{4,15,4},{5,12,1},{4,12,1},{8,2,72},{13,2,72},{4,12,1},{0,11,90},{13,2,72},{0,11,90},{4,0,122},{4,0,122},{4,0,122},{4,0,122},{4,12,2},{4,12,2},{4,12,2},{4,10,2},{3,11,10},{3,11,10},{5,16,164},{5,15,94},{5,13,106},{5,13,94},{4,18,292},{4,15,125},{4,13,81},{4,12,130},{3,15,253},{4,12,106},{5,16,83}, +{5,15,13},{5,13,25},{5,13,13},{8,3,243},{4,15,76},{4,13,32},{4,12,81},{11,5,243},{4,12,81},{5,14,91},{5,14,91},{5,14,91},{5,13,94},{4,16,99},{4,14,51},{4,14,51},{4,12,66},{3,14,50},{4,12,42},{5,14,10},{5,14,10},{5,14,10},{5,13,13},{8,1,50},{4,14,2},{4,14,2},{4,12,17},{10,5,50},{4,12,17},{3,23,72},{5,15,4},{5,13,16}, +{5,13,4},{3,23,72},{11,6,72},{5,13,4},{0,12,80},{11,6,72},{0,12,80},{5,0,90},{5,0,90},{5,0,90},{5,0,90},{4,14,50},{4,14,50},{4,14,50},{4,12,50},{3,13,9},{3,13,9},{5,19,218},{5,17,149},{5,15,242},{5,14,149},{5,18,248},{5,15,99},{5,14,5},{5,13,99},{3,17,244},{4,13,100},{6,16,99},{6,15,45},{6,14,27},{6,14,51},{8,6,243}, +{4,17,81},{5,14,5},{4,13,99},{15,2,243},{4,13,99},{5,17,145},{5,17,145},{5,17,145},{5,14,148},{5,16,52},{5,14,4},{5,14,4},{5,13,18},{3,16,56},{4,13,19},{6,14,26},{6,14,26},{6,14,26},{6,13,25},{8,4,50},{5,14,4},{5,14,4},{4,13,18},{14,2,50},{4,13,18},{3,26,72},{5,17,5},{6,14,2},{5,14,5},{3,26,72},{15,3,72},{5,14,5}, +{0,13,90},{15,3,72},{0,13,90},{5,0,144},{5,0,144},{5,0,144},{5,0,144},{5,14,0},{5,14,0},{5,14,0},{5,12,4},{4,14,8},{4,14,8},{6,18,164},{6,17,94},{6,15,107},{6,15,95},{5,20,307},{5,17,137},{5,15,115},{5,14,154},{4,17,253},{5,14,106},{6,18,83},{6,17,13},{6,15,26},{6,15,14},{5,20,243},{5,17,73},{6,15,41},{5,14,90},{13,6,243}, +{5,14,90},{6,16,91},{6,16,91},{6,16,91},{6,15,94},{5,18,116},{5,16,69},{5,16,69},{5,14,73},{4,16,50},{5,14,25},{6,16,10},{6,16,10},{6,16,10},{6,15,13},{3,25,50},{5,16,5},{5,16,5},{5,14,9},{12,6,50},{5,14,9},{11,0,72},{6,17,4},{6,15,17},{6,15,5},{11,0,72},{13,7,72},{6,15,5},{0,14,90},{13,7,72},{0,14,90},{6,0,90}, +{6,0,90},{6,0,90},{6,0,90},{5,17,65},{5,17,65},{5,17,65},{5,14,64},{4,15,10},{4,15,10},{6,21,194},{6,19,126},{6,16,203},{6,16,123},{6,19,245},{6,17,97},{6,16,3},{6,15,107},{4,19,249},{5,15,100},{7,18,99},{7,17,45},{7,16,26},{7,16,50},{11,1,243},{5,19,81},{6,16,2},{5,15,99},{15,5,243},{5,15,99},{6,19,122},{6,19,122},{6,19,122}, +{6,16,123},{6,17,53},{6,16,3},{6,16,3},{6,15,26},{5,16,62},{5,15,19},{7,16,26},{7,16,26},{7,16,26},{7,15,25},{9,6,50},{6,16,2},{6,16,2},{5,15,18},{14,5,50},{5,15,18},{10,6,72},{6,19,4},{7,16,1},{6,16,1},{10,6,72},{15,6,72},{6,16,1},{0,15,90},{15,6,72},{0,15,90},{6,0,122},{6,0,122},{6,0,122},{6,0,122},{6,16,2}, +{6,16,2},{6,16,2},{6,14,2},{5,15,10},{5,15,10},{7,20,164},{7,19,94},{7,17,106},{7,17,94},{6,22,292},{6,19,125},{6,17,81},{6,16,130},{5,19,253},{6,16,106},{7,20,83},{7,19,13},{7,17,25},{7,17,13},{10,7,243},{6,19,76},{6,17,32},{6,16,81},{13,9,243},{6,16,81},{7,18,91},{7,18,91},{7,18,91},{7,17,94},{6,20,99},{6,18,51},{6,18,51}, +{6,16,66},{5,18,50},{6,16,42},{7,18,10},{7,18,10},{7,18,10},{7,17,13},{10,5,50},{6,18,2},{6,18,2},{6,16,17},{12,9,50},{6,16,17},{12,2,72},{7,19,4},{7,17,16},{7,17,4},{12,2,72},{13,10,72},{7,17,4},{0,16,80},{13,10,72},{0,16,80},{7,0,90},{7,0,90},{7,0,90},{7,0,90},{6,18,50},{6,18,50},{6,18,50},{6,16,50},{5,17,9}, +{5,17,9},{7,23,218},{7,21,149},{7,19,242},{7,18,149},{7,22,248},{7,19,99},{7,18,5},{7,17,99},{5,21,244},{6,17,100},{7,23,218},{7,21,149},{8,18,206},{7,18,149},{13,0,243},{6,21,81},{7,18,5},{6,17,99},{5,21,243},{6,17,99},{7,21,145},{7,21,145},{7,21,145},{7,18,148},{7,20,52},{7,18,4},{7,18,4},{7,17,18},{5,20,56},{6,17,19},{7,21,145}, +{7,21,145},{7,21,145},{7,18,148},{10,8,50},{7,18,4},{7,18,4},{6,17,18},{11,12,50},{6,17,18},{9,15,72},{7,21,5},{8,18,37},{7,18,5},{9,15,72},{5,22,72},{7,18,5},{0,17,90},{5,22,72},{0,17,90},{7,0,144},{7,0,144},{7,0,144},{7,0,144},{7,18,0},{7,18,0},{7,18,0},{7,16,4},{6,18,8},{6,18,8},{8,21,388},{8,20,334},{8,19,316}, +{8,19,340},{7,24,307},{7,21,137},{7,19,115},{7,18,154},{6,21,253},{7,18,106},{8,21,99},{8,20,45},{8,19,27},{8,19,51},{8,19,243},{7,21,73},{7,19,51},{7,18,90},{15,10,243},{7,18,90},{8,19,315},{8,19,315},{8,19,315},{8,18,314},{7,22,116},{7,20,69},{7,20,69},{7,18,73},{6,20,50},{7,18,25},{8,19,26},{8,19,26},{8,19,26},{8,18,25},{9,14,50}, +{7,20,5},{7,20,5},{7,18,9},{14,10,50},{7,18,9},{13,4,72},{8,20,20},{8,19,2},{7,19,26},{13,4,72},{15,11,72},{7,19,26},{0,18,90},{15,11,72},{0,18,90},{8,0,314},{8,0,314},{8,0,314},{8,0,314},{7,21,65},{7,21,65},{7,21,65},{7,18,64},{6,19,10},{6,19,10},{8,23,164},{8,22,94},{8,20,106},{8,20,94},{8,22,329},{8,20,221},{8,20,121}, +{8,19,220},{6,23,249},{7,19,100},{8,23,83},{8,22,13},{8,20,25},{8,20,13},{13,5,243},{7,23,81},{8,20,40},{7,19,99},{12,15,243},{7,19,99},{8,21,91},{8,21,91},{8,21,91},{8,20,94},{8,20,133},{8,19,99},{8,19,99},{8,18,110},{7,20,62},{7,19,19},{8,21,10},{8,21,10},{8,21,10},{8,20,13},{11,10,50},{8,19,18},{8,19,18},{7,19,18},{5,23,50}, +{7,19,18},{15,0,72},{8,22,4},{8,20,16},{8,20,4},{15,0,72},{12,16,72},{8,20,4},{0,19,90},{12,16,72},{0,19,90},{8,0,90},{8,0,90},{8,0,90},{8,0,90},{8,18,81},{8,18,81},{8,18,81},{8,18,85},{7,19,10},{7,19,10},{8,26,194},{8,24,131},{8,21,203},{8,21,123},{8,24,245},{8,22,97},{8,21,3},{8,20,97},{7,23,253},{7,20,141},{9,23,99}, +{9,22,45},{9,21,26},{9,21,50},{15,1,243},{8,22,96},{8,21,2},{8,20,96},{15,13,243},{8,20,96},{8,24,122},{8,24,122},{8,24,122},{8,21,123},{8,22,53},{8,21,3},{8,21,3},{8,19,27},{7,22,50},{8,19,75},{9,21,26},{9,21,26},{9,21,26},{9,20,25},{12,9,50},{8,21,2},{8,21,2},{8,19,26},{14,13,50},{8,19,26},{14,6,72},{8,24,9},{9,21,1}, +{8,21,1},{14,6,72},{15,14,72},{8,21,1},{0,20,80},{15,14,72},{0,20,80},{8,0,122},{8,0,122},{8,0,122},{8,0,122},{8,21,2},{8,21,2},{8,21,2},{8,19,2},{7,21,9},{7,21,9},{9,26,154},{9,24,81},{9,22,106},{9,22,82},{9,24,307},{8,24,137},{9,22,91},{8,21,154},{7,25,244},{8,21,106},{9,26,90},{9,24,17},{9,22,42},{9,22,18},{15,4,243}, +{8,24,73},{9,22,27},{8,21,90},{9,22,243},{8,21,90},{9,24,81},{9,24,81},{9,24,81},{9,22,81},{9,22,114},{8,23,68},{8,23,68},{8,21,73},{7,24,56},{8,21,25},{9,24,17},{9,24,17},{9,24,17},{9,22,17},{15,2,50},{8,23,4},{8,23,4},{8,21,9},{13,16,50},{8,21,9},{11,19,72},{9,24,1},{9,22,26},{9,22,2},{11,19,72},{9,23,72},{9,22,2}, +{0,21,90},{9,23,72},{0,21,90},{9,0,80},{9,0,80},{9,0,80},{9,0,80},{9,20,65},{9,20,65},{9,20,65},{8,21,64},{8,21,16},{8,21,16},{9,28,216},{9,26,149},{9,23,245},{9,23,149},{9,27,248},{9,24,89},{9,23,5},{9,22,99},{7,27,260},{8,22,100},{10,25,99},{10,24,45},{10,23,27},{10,23,51},{10,23,243},{8,26,81},{9,23,5},{8,22,99},{11,21,243}, +{8,22,99},{9,26,145},{9,26,145},{9,26,145},{9,23,148},{9,25,52},{9,23,4},{9,23,4},{9,22,18},{8,23,72},{8,22,19},{10,23,26},{10,23,26},{10,23,26},{10,22,25},{11,18,50},{9,23,4},{9,23,4},{8,22,18},{10,21,50},{8,22,18},{15,8,72},{9,26,5},{10,23,2},{9,23,5},{15,8,72},{11,22,72},{9,23,5},{0,22,90},{11,22,72},{0,22,90},{9,0,144}, +{9,0,144},{9,0,144},{9,0,144},{9,23,0},{9,23,0},{9,23,0},{9,21,4},{8,23,8},{8,23,8},{10,27,164},{10,26,94},{10,24,106},{10,24,94},{9,29,307},{9,26,137},{9,24,105},{9,23,154},{8,26,253},{9,23,106},{10,27,83},{10,26,13},{10,24,25},{10,24,13},{15,9,243},{9,26,73},{10,24,40},{9,23,90},{14,19,243},{9,23,90},{10,25,91},{10,25,91},{10,25,91}, +{10,24,94},{9,27,116},{9,25,69},{9,25,69},{9,23,73},{8,25,50},{9,23,25},{10,25,10},{10,25,10},{10,25,10},{10,24,13},{13,14,50},{9,25,5},{9,25,5},{9,23,9},{8,25,50},{9,23,9},{14,14,72},{10,26,4},{10,24,16},{10,24,4},{14,14,72},{14,20,72},{10,24,4},{0,23,90},{14,20,72},{0,23,90},{10,0,90},{10,0,90},{10,0,90},{10,0,90},{9,26,65}, +{9,26,65},{9,26,65},{9,23,64},{8,24,9},{8,24,9},{10,30,194},{10,28,131},{10,25,203},{10,25,123},{10,28,245},{10,26,97},{10,25,3},{10,24,97},{8,28,252},{9,24,85},{11,27,99},{11,26,45},{11,25,26},{11,25,50},{14,15,243},{9,28,80},{10,25,2},{9,24,84},{12,23,243},{9,24,84},{10,28,122},{10,28,122},{10,28,122},{10,25,123},{10,26,53},{10,25,3},{10,25,3}, +{10,23,27},{9,25,62},{9,24,21},{11,25,26},{11,25,26},{11,25,26},{11,24,25},{14,13,50},{10,25,2},{10,25,2},{9,24,20},{11,23,50},{9,24,20},{13,20,72},{10,28,9},{11,25,1},{10,25,1},{13,20,72},{13,23,74},{10,25,1},{0,24,80},{13,23,74},{0,24,80},{10,0,122},{10,0,122},{10,0,122},{10,0,122},{10,25,2},{10,25,2},{10,25,2},{10,23,2},{9,24,5}, +{9,24,5},{11,30,154},{11,28,81},{11,26,106},{11,26,82},{11,28,307},{10,28,137},{11,26,91},{10,25,154},{9,28,260},{10,25,106},{11,30,90},{11,28,17},{11,26,42},{11,26,18},{14,18,243},{10,28,73},{11,26,27},{10,25,90},{11,26,243},{10,25,90},{11,28,81},{11,28,81},{11,28,81},{11,26,81},{11,26,114},{10,27,68},{10,27,68},{10,25,73},{9,27,53},{10,25,25},{11,28,17}, +{11,28,17},{11,28,17},{11,26,17},{14,16,50},{10,27,4},{10,27,4},{10,25,9},{15,20,50},{10,25,9},{13,23,72},{11,28,1},{11,26,26},{11,26,2},{13,23,72},{11,27,72},{11,26,2},{0,25,90},{11,27,72},{0,25,90},{11,0,80},{11,0,80},{11,0,80},{11,0,80},{11,24,65},{11,24,65},{11,24,65},{10,25,64},{10,25,16},{10,25,16},{11,31,248},{11,30,149},{11,27,245}, +{11,27,149},{11,31,248},{11,28,89},{11,27,5},{11,26,99},{9,30,244},{10,26,100},{12,29,99},{12,28,45},{12,27,27},{12,27,51},{12,27,243},{10,30,81},{11,27,5},{10,26,99},{13,25,243},{10,26,99},{11,30,145},{11,30,145},{11,30,145},{11,27,148},{11,29,52},{11,27,4},{11,27,4},{11,26,18},{9,29,56},{10,26,19},{12,27,26},{12,27,26},{12,27,26},{12,26,25},{13,22,50}, +{11,27,4},{11,27,4},{10,26,18},{12,25,50},{10,26,18},{15,19,72},{11,30,5},{12,27,2},{11,27,5},{15,19,72},{13,26,72},{11,27,5},{0,26,90},{13,26,72},{0,26,90},{11,0,144},{11,0,144},{11,0,144},{11,0,144},{11,27,0},{11,27,0},{11,27,0},{11,25,4},{10,27,8},{10,27,8},{12,31,164},{12,30,94},{12,28,106},{12,28,94},{12,30,329},{11,30,137},{11,28,105}, +{11,27,154},{10,30,253},{11,27,106},{12,31,83},{12,30,13},{12,28,25},{12,28,13},{14,23,243},{11,30,73},{12,28,40},{11,27,90},{11,29,243},{11,27,90},{12,29,91},{12,29,91},{12,29,91},{12,28,94},{11,31,116},{11,29,69},{11,29,69},{11,27,73},{10,29,50},{11,27,25},{12,29,10},{12,29,10},{12,29,10},{12,28,13},{15,18,50},{11,29,5},{11,29,5},{11,27,9},{10,29,50}, +{11,27,9},{13,28,72},{12,30,4},{12,28,16},{12,28,4},{13,28,72},{11,30,72},{12,28,4},{0,27,90},{11,30,72},{0,27,90},{12,0,90},{12,0,90},{12,0,90},{12,0,90},{11,30,65},{11,30,65},{11,30,65},{11,27,64},{10,28,9},{10,28,9},{12,31,356},{12,31,140},{12,29,203},{12,29,123},{12,31,284},{12,30,97},{12,29,3},{12,28,97},{10,31,287},{11,28,85},{13,31,99}, +{13,30,45},{13,29,26},{13,29,50},{13,29,243},{12,30,96},{12,29,2},{11,28,84},{14,27,243},{11,28,84},{12,31,131},{12,31,131},{12,31,131},{12,29,123},{12,30,53},{12,29,3},{12,29,3},{12,27,27},{11,29,62},{11,28,21},{13,29,26},{13,29,26},{13,29,26},{13,28,25},{13,27,50},{12,29,2},{12,29,2},{11,28,20},{13,27,50},{11,28,20},{15,24,72},{12,31,18},{13,29,1}, +{12,29,1},{15,24,72},{15,27,74},{12,29,1},{0,28,80},{15,27,74},{0,28,80},{12,0,122},{12,0,122},{12,0,122},{12,0,122},{12,29,2},{12,29,2},{12,29,2},{12,27,2},{11,28,5},{11,28,5},{13,31,280},{13,31,120},{13,30,106},{13,30,82},{13,31,328},{13,31,200},{13,30,91},{12,29,154},{12,31,344},{12,29,106},{13,31,216},{13,31,56},{13,30,42},{13,30,18},{15,25,244}, +{13,31,136},{13,30,27},{12,29,90},{13,30,243},{12,29,90},{13,31,84},{13,31,84},{13,31,84},{13,30,81},{13,30,114},{12,31,68},{12,31,68},{12,29,73},{11,31,53},{12,29,25},{13,31,20},{13,31,20},{13,31,20},{13,30,17},{13,30,50},{12,31,4},{12,31,4},{12,29,9},{12,30,50},{12,29,9},{15,27,72},{13,31,40},{13,30,26},{13,30,2},{15,27,72},{13,31,72},{13,30,2}, +{0,29,90},{13,31,72},{0,29,90},{13,0,80},{13,0,80},{13,0,80},{13,0,80},{13,28,65},{13,28,65},{13,28,65},{12,29,64},{12,29,16},{12,29,16},{14,31,415},{14,31,351},{13,31,244},{13,31,148},{14,31,511},{13,31,173},{13,31,4},{13,30,82},{13,31,381},{12,30,83},{14,31,126},{14,31,62},{14,31,26},{14,31,50},{14,31,222},{13,31,173},{13,31,4},{12,30,82},{14,30,221}, +{12,30,82},{13,31,244},{13,31,244},{13,31,244},{13,31,148},{13,31,100},{13,31,4},{13,31,4},{13,30,18},{12,31,72},{12,30,19},{14,31,26},{14,31,26},{14,31,26},{14,30,25},{15,26,50},{13,31,4},{13,31,4},{12,30,18},{14,29,50},{12,30,18},{15,29,61},{14,31,37},{14,31,1},{13,31,4},{15,29,61},{15,30,61},{13,31,4},{0,30,73},{15,30,61},{0,30,73},{13,0,144}, +{13,0,144},{13,0,144},{13,0,144},{13,31,0},{13,31,0},{13,31,0},{13,29,4},{12,31,8},{12,31,8},{14,31,239},{14,31,175},{14,31,139},{14,31,99},{14,31,239},{14,31,135},{14,31,99},{13,31,73},{13,31,285},{13,31,25},{14,31,158},{14,31,94},{14,31,58},{14,31,18},{15,29,94},{14,31,54},{14,31,18},{13,31,9},{15,30,93},{13,31,9},{14,31,139},{14,31,139},{14,31,139}, +{14,31,99},{14,31,139},{14,31,99},{14,31,99},{13,31,73},{13,31,116},{13,31,25},{14,31,58},{14,31,58},{14,31,58},{14,31,18},{15,28,52},{14,31,18},{14,31,18},{13,31,9},{15,29,58},{13,31,9},{15,30,9},{15,31,9},{15,31,9},{14,31,9},{15,30,9},{15,31,9},{14,31,9},{0,31,9},{15,31,9},{0,31,9},{14,0,90},{14,0,90},{14,0,90},{14,0,90},{14,30,81}, +{14,30,81},{14,30,81},{13,31,64},{13,31,16},{13,31,16},{15,31,314},{14,31,258},{14,31,222},{14,31,158},{14,31,226},{14,31,98},{14,31,62},{14,31,2},{14,31,122},{14,31,50},{15,31,25},{15,31,25},{15,31,25},{15,31,25},{15,30,22},{15,31,25},{15,31,25},{14,31,1},{15,31,25},{14,31,1},{14,31,222},{14,31,222},{14,31,222},{14,31,158},{14,31,126},{14,31,62},{14,31,62}, +{14,31,2},{14,31,86},{14,31,50},{15,31,25},{15,31,25},{15,31,25},{15,31,25},{15,30,13},{15,31,25},{15,31,25},{14,31,1},{15,30,25},{14,31,1},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{14,0,122},{14,0,122},{14,0,122},{14,0,122},{14,31,26},{14,31,26},{14,31,26},{14,31,2},{14,31,50}, +{14,31,50},{0,6,202},{0,5,52},{0,3,25},{0,3,61},{0,4,442},{0,3,313},{0,3,142},{0,2,318},{0,2,498},{0,2,354},{0,6,202},{0,5,52},{0,3,25},{0,3,61},{1,1,441},{0,3,313},{0,3,142},{0,2,318},{2,0,442},{0,2,318},{0,3,0},{0,3,0},{0,3,0},{0,2,1},{0,1,45},{0,1,25},{0,1,25},{0,1,26},{0,1,50},{0,1,35},{0,3,0}, +{0,3,0},{0,3,0},{0,2,1},{0,1,45},{0,1,25},{0,1,25},{0,1,26},{0,1,41},{0,1,26},{1,3,200},{0,5,52},{0,3,25},{0,3,61},{1,3,200},{3,0,202},{0,3,61},{0,2,218},{3,0,202},{0,2,218},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,9,200},{0,7,20},{0,5,20}, +{0,4,25},{0,6,686},{0,5,433},{0,4,169},{0,3,443},{0,3,794},{0,3,524},{0,9,200},{0,7,20},{0,5,20},{0,4,25},{0,6,686},{0,5,433},{0,4,169},{0,3,443},{3,0,686},{0,3,443},{0,6,1},{0,6,1},{0,6,1},{0,3,4},{0,3,145},{0,2,85},{0,2,85},{0,2,101},{0,1,178},{0,1,115},{0,6,1},{0,6,1},{0,6,1},{0,3,4},{0,3,145}, +{0,2,85},{0,2,85},{0,2,101},{0,2,149},{0,2,101},{0,9,200},{0,7,20},{0,5,20},{0,4,25},{0,9,200},{2,3,200},{0,4,25},{0,3,218},{2,3,200},{0,3,218},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,11,257},{0,9,54},{0,6,114},{0,5,65},{0,9,728},{0,6,371},{0,5,80}, +{0,4,377},{0,5,949},{0,4,521},{0,11,257},{0,9,54},{1,5,97},{0,5,65},{2,2,723},{0,6,371},{0,5,80},{0,4,377},{1,4,723},{0,4,377},{0,8,50},{0,8,50},{0,8,50},{0,5,49},{0,5,164},{0,4,50},{0,4,50},{0,3,65},{0,3,245},{0,2,126},{0,8,50},{0,8,50},{0,8,50},{0,5,49},{1,2,162},{0,4,50},{0,4,50},{0,3,65},{1,2,162}, +{0,3,65},{3,2,202},{0,9,5},{1,5,16},{0,5,16},{3,2,202},{5,1,200},{0,5,16},{0,4,208},{5,1,200},{0,4,208},{0,0,49},{0,0,49},{0,0,49},{0,0,49},{0,2,1},{0,2,1},{0,2,1},{0,1,4},{0,1,13},{0,1,13},{0,14,425},{0,11,234},{1,7,277},{0,7,245},{0,11,724},{0,8,289},{0,6,34},{0,5,308},{0,6,1087},{0,5,533},{1,11,201}, +{1,9,18},{1,7,21},{1,6,26},{1,8,723},{0,8,289},{0,6,34},{0,5,308},{4,2,723},{0,5,308},{0,11,225},{0,11,225},{0,11,225},{0,7,229},{0,8,162},{0,6,18},{0,6,18},{0,4,25},{0,4,338},{0,3,162},{1,8,2},{1,8,2},{1,8,2},{1,5,5},{0,8,162},{0,6,18},{0,6,18},{0,4,25},{4,0,162},{0,4,25},{3,4,200},{0,11,9},{1,7,20}, +{0,7,20},{3,4,200},{7,0,200},{0,7,20},{0,5,208},{7,0,200},{0,5,208},{0,0,225},{0,0,225},{0,0,225},{0,0,225},{0,5,0},{0,5,0},{0,5,0},{0,3,0},{0,2,61},{0,2,61},{1,14,410},{1,11,209},{1,8,288},{1,7,234},{0,14,739},{0,10,254},{0,8,33},{0,6,270},{0,8,1131},{0,6,450},{1,14,266},{1,11,65},{2,7,106},{1,7,90},{3,4,723}, +{0,10,238},{0,8,17},{0,6,254},{7,0,723},{0,6,254},{1,11,209},{1,11,209},{1,11,209},{1,7,209},{0,11,178},{0,8,17},{0,8,17},{0,5,18},{0,6,376},{0,5,123},{1,11,65},{1,11,65},{1,11,65},{1,7,65},{3,1,162},{0,8,1},{0,8,1},{0,5,2},{3,3,162},{0,5,2},{3,7,200},{1,11,1},{2,7,25},{0,8,17},{3,7,200},{8,0,200},{0,8,17}, +{0,6,218},{8,0,200},{0,6,218},{1,0,208},{1,0,208},{1,0,208},{1,0,208},{0,8,16},{0,8,16},{0,8,16},{0,5,17},{0,4,80},{0,4,80},{1,16,474},{1,13,276},{1,9,457},{1,9,292},{1,13,740},{1,10,298},{1,8,45},{1,7,315},{0,9,1013},{0,7,308},{2,13,201},{2,11,21},{2,9,21},{2,8,26},{5,0,723},{0,12,227},{1,8,29},{0,7,227},{5,4,723}, +{0,7,227},{1,13,272},{1,13,272},{1,13,272},{1,9,276},{1,10,180},{1,8,29},{1,8,29},{1,6,33},{0,8,306},{0,6,41},{2,10,2},{2,10,2},{2,10,2},{2,7,5},{4,0,162},{0,10,5},{0,10,5},{0,6,5},{1,7,162},{0,6,5},{5,3,200},{1,13,4},{2,9,20},{1,9,20},{5,3,200},{4,7,200},{1,9,20},{0,7,218},{4,7,200},{0,7,218},{1,0,272}, +{1,0,272},{1,0,272},{1,0,272},{1,7,17},{1,7,17},{1,7,17},{1,5,17},{0,6,40},{0,6,40},{2,15,426},{2,13,223},{2,10,283},{2,9,234},{1,16,739},{1,12,267},{1,10,33},{1,8,273},{0,11,913},{0,8,225},{2,15,257},{2,13,54},{3,9,97},{2,9,65},{4,6,723},{0,13,208},{1,10,17},{0,8,209},{3,8,723},{0,8,209},{2,12,219},{2,12,219},{2,12,219}, +{2,9,218},{1,13,180},{1,10,17},{1,10,17},{1,7,18},{0,9,229},{0,7,27},{2,12,50},{2,12,50},{2,12,50},{2,9,49},{3,6,162},{1,10,1},{1,10,1},{1,7,2},{3,6,162},{1,7,2},{1,19,200},{2,13,5},{3,9,16},{2,9,16},{1,19,200},{9,2,200},{2,9,16},{0,8,208},{9,2,200},{0,8,208},{2,0,218},{2,0,218},{2,0,218},{2,0,218},{1,10,16}, +{1,10,16},{1,10,16},{1,7,17},{0,8,17},{0,8,17},{2,18,450},{2,15,259},{2,11,410},{2,11,270},{2,15,749},{2,12,314},{2,10,59},{2,9,333},{0,13,868},{0,9,213},{3,15,201},{3,13,18},{3,11,21},{3,10,26},{6,2,723},{0,15,204},{2,10,34},{0,9,212},{8,3,723},{0,9,212},{2,15,250},{2,15,250},{2,15,250},{2,11,254},{2,12,187},{2,10,43},{2,10,43}, +{2,8,50},{0,11,189},{1,8,37},{3,12,2},{3,12,2},{3,12,2},{3,9,5},{5,2,162},{1,12,2},{1,12,2},{1,8,1},{8,1,162},{1,8,1},{5,8,200},{2,15,9},{3,11,20},{2,11,20},{5,8,200},{4,10,200},{2,11,20},{0,9,208},{4,10,200},{0,9,208},{2,0,250},{2,0,250},{2,0,250},{2,0,250},{2,9,25},{2,9,25},{2,9,25},{2,7,25},{0,9,5}, +{0,9,5},{3,18,410},{3,15,209},{3,12,288},{3,11,234},{2,18,739},{2,14,254},{2,12,33},{2,10,270},{0,15,804},{1,10,227},{3,18,266},{3,15,65},{4,11,106},{3,11,90},{5,8,723},{1,15,219},{2,12,17},{1,10,218},{4,10,723},{1,10,218},{3,15,209},{3,15,209},{3,15,209},{3,11,209},{2,15,178},{2,12,17},{2,12,17},{2,9,18},{0,13,171},{1,9,26},{3,15,65}, +{3,15,65},{3,15,65},{3,11,65},{5,5,162},{2,12,1},{2,12,1},{2,9,2},{5,7,162},{2,9,2},{5,11,200},{3,15,1},{4,11,25},{2,12,17},{5,11,200},{11,3,200},{2,12,17},{0,10,218},{11,3,200},{0,10,218},{3,0,208},{3,0,208},{3,0,208},{3,0,208},{2,12,16},{2,12,16},{2,12,16},{2,9,17},{1,10,9},{1,10,9},{3,20,474},{3,17,276},{3,13,457}, +{3,13,292},{3,17,740},{3,14,298},{3,12,45},{3,11,315},{0,16,747},{1,11,231},{4,17,201},{4,15,21},{4,13,21},{4,12,26},{7,4,723},{1,17,209},{3,12,29},{1,11,227},{9,5,723},{1,11,227},{3,17,272},{3,17,272},{3,17,272},{3,13,276},{3,14,180},{3,12,29},{3,12,29},{3,10,33},{0,15,171},{2,10,41},{4,14,2},{4,14,2},{4,14,2},{4,11,5},{7,1,162}, +{2,14,5},{2,14,5},{2,10,5},{10,2,162},{2,10,5},{8,2,200},{3,17,4},{4,13,20},{3,13,20},{8,2,200},{13,2,200},{3,13,20},{0,11,218},{13,2,200},{0,11,218},{3,0,272},{3,0,272},{3,0,272},{3,0,272},{3,11,17},{3,11,17},{3,11,17},{3,9,17},{1,12,8},{1,12,8},{4,19,426},{4,17,223},{4,14,283},{4,13,234},{3,20,739},{3,16,267},{3,14,33}, +{3,12,273},{0,18,727},{2,12,225},{4,19,257},{4,17,54},{5,13,97},{4,13,65},{6,10,723},{2,17,208},{3,14,17},{2,12,209},{12,3,723},{2,12,209},{4,16,219},{4,16,219},{4,16,219},{4,13,218},{3,17,180},{3,14,17},{3,14,17},{3,11,18},{1,15,171},{2,11,27},{4,16,50},{4,16,50},{4,16,50},{4,13,49},{5,10,162},{3,14,1},{3,14,1},{3,11,2},{12,1,162}, +{3,11,2},{3,23,200},{4,17,5},{5,13,16},{4,13,16},{3,23,200},{11,6,200},{4,13,16},{0,12,208},{11,6,200},{0,12,208},{4,0,218},{4,0,218},{4,0,218},{4,0,218},{3,14,16},{3,14,16},{3,14,16},{3,11,17},{1,13,10},{1,13,10},{4,22,450},{4,19,259},{4,15,410},{4,15,270},{4,19,749},{4,16,314},{4,14,59},{4,13,333},{1,18,747},{2,13,213},{5,19,201}, +{5,17,18},{5,15,21},{5,14,26},{9,1,723},{2,19,204},{4,14,34},{2,13,212},{15,1,723},{2,13,212},{4,19,250},{4,19,250},{4,19,250},{4,15,254},{4,16,187},{4,14,43},{4,14,43},{4,12,50},{1,16,174},{3,12,37},{5,16,2},{5,16,2},{5,16,2},{5,13,5},{8,1,162},{3,16,2},{3,16,2},{3,12,1},{10,5,162},{3,12,1},{9,4,200},{4,19,9},{5,15,20}, +{4,15,20},{9,4,200},{9,10,200},{4,15,20},{0,13,208},{9,10,200},{0,13,208},{4,0,250},{4,0,250},{4,0,250},{4,0,250},{4,13,25},{4,13,25},{4,13,25},{4,11,25},{2,13,5},{2,13,5},{5,22,410},{5,19,209},{5,16,288},{5,15,234},{4,22,739},{4,18,254},{4,16,33},{4,14,270},{1,20,724},{3,14,227},{5,22,266},{5,19,65},{6,15,106},{5,15,90},{9,4,723}, +{3,19,219},{4,16,17},{3,14,218},{9,10,723},{3,14,218},{5,19,209},{5,19,209},{5,19,209},{5,15,209},{4,19,178},{4,16,17},{4,16,17},{4,13,18},{2,17,171},{3,13,26},{5,19,65},{5,19,65},{5,19,65},{5,15,65},{8,4,162},{4,16,1},{4,16,1},{4,13,2},{14,2,162},{4,13,2},{11,0,200},{5,19,1},{6,15,25},{4,16,17},{11,0,200},{13,7,200},{4,16,17}, +{0,14,218},{13,7,200},{0,14,218},{5,0,208},{5,0,208},{5,0,208},{5,0,208},{4,16,16},{4,16,16},{4,16,16},{4,13,17},{3,14,9},{3,14,9},{5,24,474},{5,21,276},{5,17,457},{5,17,292},{5,21,740},{5,18,298},{5,16,45},{5,15,315},{1,22,740},{3,15,231},{6,21,201},{6,19,21},{6,17,21},{6,16,26},{10,3,723},{3,21,209},{5,16,29},{3,15,227},{11,9,723}, +{3,15,227},{5,21,272},{5,21,272},{5,21,272},{5,17,276},{5,18,180},{5,16,29},{5,16,29},{5,14,33},{2,19,171},{4,14,41},{6,18,2},{6,18,2},{6,18,2},{6,15,5},{3,25,162},{4,18,5},{4,18,5},{4,14,5},{12,6,162},{4,14,5},{10,6,200},{5,21,4},{6,17,20},{5,17,20},{10,6,200},{15,6,200},{5,17,20},{0,15,218},{15,6,200},{0,15,218},{5,0,272}, +{5,0,272},{5,0,272},{5,0,272},{5,15,17},{5,15,17},{5,15,17},{5,13,17},{3,16,8},{3,16,8},{6,23,426},{6,21,223},{6,18,283},{6,17,234},{5,24,739},{5,20,267},{5,18,33},{5,16,273},{2,22,727},{4,16,225},{6,23,257},{6,21,54},{7,17,97},{6,17,65},{9,9,723},{4,21,208},{5,18,17},{4,16,209},{14,7,723},{4,16,209},{6,20,219},{6,20,219},{6,20,219}, +{6,17,218},{5,21,180},{5,18,17},{5,18,17},{5,15,18},{3,19,171},{4,15,27},{6,20,50},{6,20,50},{6,20,50},{6,17,49},{9,6,162},{5,18,1},{5,18,1},{5,15,2},{14,5,162},{5,15,2},{12,2,200},{6,21,5},{7,17,16},{6,17,16},{12,2,200},{13,10,200},{6,17,16},{0,16,208},{13,10,200},{0,16,208},{6,0,218},{6,0,218},{6,0,218},{6,0,218},{5,18,16}, +{5,18,16},{5,18,16},{5,15,17},{3,17,10},{3,17,10},{6,26,450},{6,23,259},{6,19,410},{6,19,270},{6,23,749},{6,20,314},{6,18,59},{6,17,333},{3,22,747},{4,17,213},{7,23,201},{7,21,18},{7,19,21},{7,18,26},{11,5,723},{4,23,204},{6,18,34},{4,17,212},{12,11,723},{4,17,212},{6,23,250},{6,23,250},{6,23,250},{6,19,254},{6,20,187},{6,18,43},{6,18,43}, +{6,16,50},{3,20,174},{5,16,37},{7,20,2},{7,20,2},{7,20,2},{7,17,5},{10,5,162},{5,20,2},{5,20,2},{5,16,1},{12,9,162},{5,16,1},{11,8,200},{6,23,9},{7,19,20},{6,19,20},{11,8,200},{11,14,200},{6,19,20},{0,17,208},{11,14,200},{0,17,208},{6,0,250},{6,0,250},{6,0,250},{6,0,250},{6,17,25},{6,17,25},{6,17,25},{6,15,25},{4,17,5}, +{4,17,5},{7,26,410},{7,23,209},{7,20,288},{7,19,234},{6,26,739},{6,22,254},{6,20,33},{6,18,270},{3,24,724},{5,18,227},{7,26,266},{7,23,65},{7,20,144},{7,19,90},{11,8,723},{5,23,219},{6,20,17},{5,18,218},{11,14,723},{5,18,218},{7,23,209},{7,23,209},{7,23,209},{7,19,209},{6,23,178},{6,20,17},{6,20,17},{6,17,18},{4,21,171},{5,17,26},{7,23,65}, +{7,23,65},{7,23,65},{7,19,65},{10,8,162},{6,20,1},{6,20,1},{6,17,2},{11,12,162},{6,17,2},{13,4,200},{7,23,1},{8,19,50},{6,20,17},{13,4,200},{15,11,200},{6,20,17},{0,18,218},{15,11,200},{0,18,218},{7,0,208},{7,0,208},{7,0,208},{7,0,208},{6,20,16},{6,20,16},{6,20,16},{6,17,17},{5,18,9},{5,18,9},{7,28,474},{7,25,276},{7,21,457}, +{7,21,292},{7,25,740},{7,22,298},{7,20,45},{7,19,315},{3,26,740},{5,19,231},{8,23,283},{8,22,133},{8,20,97},{8,20,133},{12,7,723},{5,25,209},{7,20,29},{5,19,227},{13,13,723},{5,19,227},{7,25,272},{7,25,272},{7,25,272},{7,21,276},{7,22,180},{7,20,29},{7,20,29},{7,18,33},{4,23,171},{6,18,41},{8,20,81},{8,20,81},{8,20,81},{8,19,82},{9,14,162}, +{6,22,5},{6,22,5},{6,18,5},{14,10,162},{6,18,5},{15,0,200},{7,25,4},{8,20,16},{7,21,20},{15,0,200},{12,16,200},{7,21,20},{0,19,218},{12,16,200},{0,19,218},{7,0,272},{7,0,272},{7,0,272},{7,0,272},{7,19,17},{7,19,17},{7,19,17},{7,17,17},{5,20,8},{5,20,8},{8,26,642},{8,24,459},{8,22,462},{8,21,467},{7,28,739},{7,24,267},{7,22,33}, +{7,20,273},{4,26,727},{6,20,225},{8,26,201},{8,24,18},{8,22,21},{8,21,26},{14,3,723},{6,25,208},{7,22,17},{6,20,209},{11,17,723},{6,20,209},{8,23,443},{8,23,443},{8,23,443},{8,20,446},{7,25,180},{7,22,17},{7,22,17},{7,19,18},{5,23,171},{6,19,27},{8,23,2},{8,23,2},{8,23,2},{8,20,5},{11,10,162},{7,22,1},{7,22,1},{7,19,2},{5,23,162}, +{7,19,2},{14,6,200},{8,24,17},{8,22,20},{7,22,17},{14,6,200},{15,14,200},{7,22,17},{0,20,208},{15,14,200},{0,20,208},{8,0,442},{8,0,442},{8,0,442},{8,0,442},{7,22,16},{7,22,16},{7,22,16},{7,19,17},{5,21,10},{5,21,10},{8,28,420},{8,26,223},{8,23,283},{8,22,234},{7,31,872},{7,26,371},{7,23,201},{7,21,368},{5,26,747},{6,21,213},{8,28,251}, +{8,26,54},{9,22,97},{8,22,65},{13,9,723},{6,27,204},{7,23,57},{6,21,212},{14,15,723},{6,21,212},{8,25,219},{8,25,219},{8,25,219},{8,22,218},{7,27,308},{7,24,146},{7,24,146},{7,20,145},{5,24,174},{7,20,37},{8,25,50},{8,25,50},{8,25,50},{8,22,49},{12,9,162},{7,24,2},{7,24,2},{7,20,1},{14,13,162},{7,20,1},{13,12,200},{8,26,5},{9,22,16}, +{8,22,16},{13,12,200},{13,18,200},{8,22,16},{0,21,208},{13,18,200},{0,21,208},{8,0,218},{8,0,218},{8,0,218},{8,0,218},{7,24,145},{7,24,145},{7,24,145},{7,20,145},{6,21,5},{6,21,5},{8,31,474},{8,28,276},{9,24,425},{8,24,292},{8,28,740},{8,25,298},{8,23,61},{8,22,315},{5,28,724},{7,22,227},{9,28,200},{9,26,13},{9,24,25},{9,23,29},{13,12,723}, +{7,27,219},{8,23,45},{7,22,218},{13,18,723},{7,22,218},{8,28,272},{8,28,272},{8,28,272},{8,24,276},{8,25,180},{8,23,36},{8,23,36},{8,21,33},{6,25,171},{7,21,26},{9,25,0},{9,25,0},{9,25,0},{9,23,4},{15,2,162},{8,23,20},{8,23,20},{8,21,17},{13,16,162},{8,21,17},{15,8,200},{8,28,4},{9,24,25},{8,24,20},{15,8,200},{11,22,200},{8,24,20}, +{0,22,218},{11,22,200},{0,22,218},{8,0,272},{8,0,272},{8,0,272},{8,0,272},{8,22,17},{8,22,17},{8,22,17},{8,20,17},{7,22,9},{7,22,9},{9,31,410},{9,28,212},{9,25,288},{9,24,224},{8,31,739},{8,27,254},{8,25,33},{8,23,270},{5,30,740},{7,23,231},{9,31,266},{9,28,68},{10,24,97},{9,24,80},{14,11,723},{7,29,209},{8,25,17},{7,23,227},{15,17,723}, +{7,23,227},{9,27,212},{9,27,212},{9,27,212},{9,24,208},{8,28,180},{8,25,17},{8,25,17},{8,22,18},{6,27,171},{7,23,62},{9,27,68},{9,27,68},{9,27,68},{9,24,64},{11,18,162},{8,25,1},{8,25,1},{8,22,2},{10,21,162},{8,22,2},{14,14,200},{9,28,4},{10,24,16},{9,24,16},{14,14,200},{14,20,200},{9,24,16},{0,23,218},{14,20,200},{0,23,218},{9,0,208}, +{9,0,208},{9,0,208},{9,0,208},{8,25,16},{8,25,16},{8,25,16},{8,22,17},{7,24,8},{7,24,8},{9,31,570},{9,30,276},{9,26,457},{9,26,292},{9,30,740},{9,27,298},{9,25,45},{9,24,324},{6,30,727},{7,24,280},{10,30,201},{10,28,18},{10,26,21},{10,25,26},{13,17,723},{8,29,227},{9,25,29},{8,24,224},{13,21,723},{8,24,224},{9,30,272},{9,30,272},{9,30,272}, +{9,26,276},{9,27,180},{9,25,29},{9,25,29},{9,23,33},{7,27,171},{8,23,41},{10,27,2},{10,27,2},{10,27,2},{10,24,5},{13,14,162},{8,27,5},{8,27,5},{8,23,5},{8,25,162},{8,23,5},{13,20,200},{9,30,4},{10,26,20},{9,26,20},{13,20,200},{13,23,202},{9,26,20},{0,24,208},{13,23,202},{0,24,208},{9,0,272},{9,0,272},{9,0,272},{9,0,272},{9,24,17}, +{9,24,17},{9,24,17},{9,22,17},{7,25,10},{7,25,10},{10,31,468},{10,30,223},{10,27,283},{10,26,234},{9,31,835},{9,29,267},{9,27,33},{9,25,273},{7,30,747},{8,25,225},{11,29,283},{10,30,54},{11,26,97},{10,26,65},{15,13,723},{8,30,208},{9,27,17},{8,25,209},{11,25,723},{8,25,209},{10,29,219},{10,29,219},{10,29,219},{10,26,218},{9,30,180},{9,27,17},{9,27,17}, +{9,24,20},{7,28,174},{8,24,17},{10,29,50},{10,29,50},{10,29,50},{10,26,49},{14,13,162},{9,27,1},{9,27,1},{9,24,4},{11,23,162},{9,24,4},{15,16,200},{10,30,5},{11,26,16},{10,26,16},{15,16,200},{15,22,200},{10,26,16},{0,25,208},{15,22,200},{0,25,208},{10,0,218},{10,0,218},{10,0,218},{10,0,218},{9,27,16},{9,27,16},{9,27,16},{9,24,20},{8,24,17}, +{8,24,17},{11,31,632},{10,31,297},{11,28,425},{10,28,292},{10,31,804},{10,29,298},{10,27,61},{10,26,315},{7,31,823},{8,26,231},{11,31,232},{11,30,13},{11,28,25},{11,27,29},{15,16,723},{9,31,216},{10,27,45},{8,26,227},{15,22,723},{8,26,227},{10,31,288},{10,31,288},{10,31,288},{10,28,276},{10,29,180},{10,27,36},{10,27,36},{10,25,33},{7,30,189},{9,25,30},{11,29,0}, +{11,29,0},{11,29,0},{11,27,4},{14,16,162},{9,29,4},{9,29,4},{9,25,5},{15,20,162},{9,25,5},{15,19,200},{11,30,13},{11,28,25},{10,28,20},{15,19,200},{13,26,200},{10,28,20},{0,26,218},{13,26,200},{0,26,218},{10,0,272},{10,0,272},{10,0,272},{10,0,272},{10,26,17},{10,26,17},{10,26,17},{10,24,17},{8,27,5},{8,27,5},{11,31,696},{11,31,237},{11,29,288}, +{11,28,224},{11,31,888},{10,31,254},{10,29,33},{10,27,270},{8,31,824},{9,27,227},{12,31,283},{11,31,93},{12,28,97},{11,28,80},{13,25,723},{10,31,238},{10,29,17},{9,27,218},{12,27,723},{9,27,218},{11,31,212},{11,31,212},{11,31,212},{11,28,208},{10,31,196},{10,29,17},{10,29,17},{10,26,18},{8,30,171},{9,26,26},{11,31,68},{11,31,68},{11,31,68},{11,28,64},{13,22,162}, +{10,29,1},{10,29,1},{10,26,2},{12,25,162},{10,26,2},{13,28,200},{11,31,29},{12,28,16},{11,28,16},{13,28,200},{11,30,200},{11,28,16},{0,27,218},{11,30,200},{0,27,218},{11,0,208},{11,0,208},{11,0,208},{11,0,208},{10,29,16},{10,29,16},{10,29,16},{10,26,17},{9,27,9},{9,27,9},{12,31,804},{12,31,492},{11,30,457},{11,30,292},{11,31,1080},{11,31,298},{11,29,45}, +{11,28,324},{9,31,920},{9,28,218},{12,31,363},{12,31,51},{12,30,21},{12,29,26},{15,21,723},{11,31,282},{11,29,29},{9,28,217},{15,25,723},{9,28,217},{11,31,372},{11,31,372},{11,31,372},{11,30,276},{11,31,180},{11,29,29},{11,29,29},{11,27,33},{8,31,184},{10,27,41},{12,31,2},{12,31,2},{12,31,2},{12,28,5},{15,18,162},{10,31,5},{10,31,5},{10,27,5},{10,29,162}, +{10,27,5},{15,24,200},{12,31,50},{12,30,20},{11,30,20},{15,24,200},{15,27,202},{11,30,20},{0,28,208},{15,27,202},{0,28,208},{11,0,272},{11,0,272},{11,0,272},{11,0,272},{11,28,17},{11,28,17},{11,28,17},{11,26,17},{9,29,8},{9,29,8},{12,31,996},{12,31,492},{12,31,283},{12,30,234},{12,31,1068},{11,31,458},{11,31,33},{11,29,273},{10,31,999},{10,29,225},{13,31,379}, +{13,31,171},{13,30,97},{12,30,65},{14,27,723},{12,31,371},{11,31,17},{10,29,209},{13,29,723},{10,29,209},{12,31,267},{12,31,267},{12,31,267},{12,30,218},{12,30,333},{11,31,17},{11,31,17},{11,28,20},{9,31,212},{10,28,17},{13,30,81},{13,30,81},{13,30,81},{12,30,49},{13,27,162},{11,31,1},{11,31,1},{11,28,4},{13,27,162},{11,28,4},{15,27,202},{13,31,90},{13,30,16}, +{12,30,16},{15,27,202},{15,28,202},{12,30,16},{0,29,208},{15,28,202},{0,29,208},{12,0,218},{12,0,218},{12,0,218},{12,0,218},{11,31,16},{11,31,16},{11,31,16},{11,28,20},{9,30,10},{9,30,10},{13,31,877},{13,31,605},{13,31,436},{12,31,288},{13,31,1021},{12,31,397},{12,31,36},{12,30,210},{11,31,910},{10,30,126},{14,31,414},{13,31,205},{13,31,36},{13,31,4},{15,26,546}, +{13,31,317},{12,31,20},{10,30,122},{14,29,546},{10,30,122},{13,31,436},{13,31,436},{13,31,436},{12,31,288},{12,31,276},{12,31,36},{12,31,36},{12,29,33},{10,31,261},{11,29,30},{13,31,36},{13,31,36},{13,31,36},{13,31,4},{13,30,162},{12,31,20},{12,31,20},{11,29,5},{12,30,162},{11,29,5},{15,28,117},{14,31,61},{14,31,25},{13,31,4},{15,28,117},{14,31,117},{13,31,4}, +{0,30,113},{14,31,117},{0,30,113},{12,0,272},{12,0,272},{12,0,272},{12,0,272},{12,30,17},{12,30,17},{12,30,17},{12,28,17},{10,31,5},{10,31,5},{13,31,845},{13,31,573},{13,31,404},{13,31,244},{13,31,797},{13,31,365},{12,31,196},{12,30,82},{12,31,737},{11,31,58},{14,31,190},{14,31,126},{14,31,90},{14,31,82},{14,31,334},{13,31,221},{13,31,52},{11,31,49},{14,30,333}, +{11,31,49},{13,31,404},{13,31,404},{13,31,404},{13,31,244},{13,31,356},{12,31,196},{12,31,196},{12,30,18},{11,31,333},{11,30,26},{14,31,90},{14,31,90},{14,31,90},{14,31,82},{15,26,162},{13,31,52},{13,31,52},{12,30,2},{14,29,162},{12,30,2},{15,30,25},{15,30,41},{14,31,9},{14,31,1},{15,30,25},{15,30,29},{14,31,1},{0,31,49},{15,30,29},{0,31,49},{13,0,208}, +{13,0,208},{13,0,208},{13,0,208},{12,31,52},{12,31,52},{12,31,52},{12,30,17},{11,31,9},{11,31,9},{14,31,642},{14,31,578},{14,31,542},{13,31,441},{14,31,690},{13,31,370},{13,31,201},{13,31,32},{13,31,610},{12,31,40},{14,31,201},{14,31,137},{14,31,101},{14,31,37},{15,29,193},{14,31,121},{14,31,85},{12,31,4},{14,31,193},{12,31,4},{14,31,542},{14,31,542},{14,31,542}, +{13,31,441},{13,31,473},{13,31,201},{13,31,201},{13,31,32},{12,31,401},{12,31,40},{14,31,101},{14,31,101},{14,31,101},{14,31,37},{15,28,145},{14,31,85},{14,31,85},{12,31,4},{15,29,149},{12,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{13,0,272},{13,0,272},{13,0,272},{13,0,272},{13,31,32}, +{13,31,32},{13,31,32},{13,30,17},{12,31,40},{12,31,40},{14,31,418},{14,31,354},{14,31,318},{14,31,254},{14,31,370},{14,31,242},{14,31,206},{13,31,32},{13,31,418},{13,31,80},{15,31,81},{15,31,81},{15,31,81},{15,31,81},{15,30,54},{14,31,73},{14,31,37},{14,31,9},{15,30,66},{14,31,9},{14,31,318},{14,31,318},{14,31,318},{14,31,254},{14,31,270},{14,31,206},{14,31,206}, +{13,31,32},{13,31,249},{13,31,80},{15,31,81},{15,31,81},{15,31,81},{15,31,81},{15,29,45},{14,31,37},{14,31,37},{14,31,9},{15,30,41},{14,31,9},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{14,0,218},{14,0,218},{14,0,218},{14,0,218},{13,31,160},{13,31,160},{13,31,160},{13,31,32},{13,31,80}, +{13,31,80},{0,9,421},{0,7,113},{0,5,5},{0,4,130},{0,6,925},{0,5,658},{0,4,274},{0,3,670},{0,3,1039},{0,3,751},{0,9,421},{0,7,113},{0,5,5},{0,4,130},{0,6,925},{0,5,658},{0,4,274},{0,3,670},{3,0,925},{0,3,670},{0,4,1},{0,4,1},{0,4,1},{0,3,4},{0,2,85},{0,2,45},{0,2,45},{0,1,50},{0,1,98},{0,1,59},{0,4,1}, +{0,4,1},{0,4,1},{0,3,4},{0,2,85},{0,2,45},{0,2,45},{0,1,50},{1,0,85},{0,1,50},{1,6,421},{0,7,113},{0,5,5},{0,4,130},{1,6,421},{3,2,421},{0,4,130},{0,3,445},{3,2,421},{0,3,445},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,12,425},{0,9,52},{0,6,10}, +{0,6,82},{0,8,1261},{0,6,805},{0,5,322},{0,4,833},{0,4,1445},{0,4,977},{0,12,425},{0,9,52},{0,6,10},{0,6,82},{0,8,1261},{0,6,805},{0,5,322},{0,4,833},{4,0,1261},{0,4,833},{0,7,0},{0,7,0},{0,7,0},{0,4,1},{0,3,225},{0,3,117},{0,3,117},{0,2,125},{0,2,257},{0,2,161},{0,7,0},{0,7,0},{0,7,0},{0,4,1},{1,0,221}, +{0,3,117},{0,3,117},{0,2,125},{1,1,221},{0,2,125},{3,2,421},{0,9,52},{0,6,10},{0,6,82},{3,2,421},{5,1,421},{0,6,82},{0,4,433},{5,1,421},{0,4,433},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,14,430},{0,11,29},{0,7,74},{0,7,46},{0,10,1514},{0,8,874},{0,6,307}, +{0,5,917},{0,5,1814},{0,4,1074},{0,14,430},{0,11,29},{0,7,74},{0,7,46},{3,0,1514},{0,8,874},{0,6,307},{0,5,917},{5,0,1514},{0,5,917},{0,10,10},{0,10,10},{0,10,10},{0,6,10},{0,5,340},{0,5,160},{0,5,160},{0,3,169},{0,3,421},{0,3,250},{0,10,10},{0,10,10},{0,10,10},{0,6,10},{1,2,338},{0,5,160},{0,5,160},{0,3,169},{1,2,338}, +{0,3,169},{4,1,421},{0,11,20},{1,7,5},{0,7,37},{4,1,421},{7,0,421},{0,7,37},{0,5,433},{7,0,421},{0,5,433},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,1,0},{0,1,0},{0,1,0},{0,1,4},{0,0,9},{0,0,9},{0,17,542},{0,13,130},{0,9,285},{0,8,137},{0,12,1517},{0,9,737},{0,7,185},{0,6,794},{0,7,1982},{0,5,1062},{1,13,450}, +{1,11,77},{1,8,34},{1,7,122},{3,3,1517},{0,9,737},{0,7,185},{0,6,794},{2,5,1514},{0,6,794},{0,12,121},{0,12,121},{0,12,121},{0,7,125},{0,8,338},{0,6,98},{0,6,98},{0,4,97},{0,4,514},{0,4,241},{1,9,25},{1,9,25},{1,9,25},{1,6,26},{0,8,338},{0,6,98},{0,6,98},{0,4,97},{4,0,338},{0,4,97},{5,0,421},{0,13,9},{1,8,9}, +{0,8,16},{5,0,421},{8,0,421},{0,8,16},{0,6,433},{8,0,421},{0,6,433},{0,0,121},{0,0,121},{0,0,121},{0,0,121},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,2,37},{0,2,37},{1,16,697},{1,13,297},{1,9,354},{1,9,309},{0,15,1517},{0,11,630},{0,9,50},{0,7,670},{0,8,2198},{0,6,1109},{1,16,441},{1,13,41},{1,9,98},{1,9,53},{4,2,1514}, +{0,11,630},{0,9,50},{0,7,670},{6,2,1514},{0,7,670},{1,12,273},{1,12,273},{1,12,273},{1,8,273},{0,11,338},{0,8,41},{0,8,41},{0,5,50},{0,6,680},{0,5,275},{1,12,17},{1,12,17},{1,12,17},{1,8,17},{3,1,338},{0,8,41},{0,8,41},{0,5,50},{3,3,338},{0,5,50},{6,0,421},{0,15,1},{2,9,5},{0,9,1},{6,0,421},{5,6,421},{0,9,1}, +{0,7,445},{5,6,421},{0,7,445},{1,0,272},{1,0,272},{1,0,272},{1,0,272},{0,7,1},{0,7,1},{0,7,1},{0,4,0},{0,3,106},{0,3,106},{1,19,821},{1,15,405},{1,11,570},{1,10,410},{0,18,1514},{0,13,577},{0,10,14},{0,8,602},{0,10,2462},{0,7,1175},{2,16,450},{2,13,77},{2,10,35},{2,10,107},{3,8,1514},{0,13,577},{0,10,14},{0,8,602},{4,6,1514}, +{0,8,602},{1,14,401},{1,14,401},{1,14,401},{1,9,404},{0,13,340},{0,10,13},{0,10,13},{0,6,29},{0,7,851},{0,6,353},{2,11,25},{2,11,25},{2,11,25},{2,8,26},{4,0,338},{0,10,13},{0,10,13},{0,6,29},{1,7,338},{0,6,29},{5,6,421},{1,15,5},{2,10,10},{0,10,10},{5,6,421},{10,1,421},{0,10,10},{0,8,433},{10,1,421},{0,8,433},{1,0,400}, +{1,0,400},{1,0,400},{1,0,400},{0,9,1},{0,9,1},{0,9,1},{0,6,4},{0,4,208},{0,4,208},{1,22,902},{1,17,485},{2,11,750},{1,11,482},{0,21,1566},{0,15,570},{0,11,95},{0,9,582},{0,11,2337},{0,9,933},{2,18,430},{2,15,29},{2,11,74},{2,11,46},{5,4,1514},{0,15,521},{0,11,46},{0,9,533},{9,1,1514},{0,9,533},{1,17,481},{1,17,481},{1,17,481}, +{1,11,481},{0,16,387},{0,12,51},{0,12,51},{0,7,75},{0,8,755},{0,7,222},{2,14,10},{2,14,10},{2,14,10},{2,10,10},{3,6,338},{0,12,2},{0,12,2},{0,7,26},{3,6,338},{0,7,26},{7,2,421},{1,17,4},{3,11,5},{1,11,1},{7,2,421},{12,0,421},{1,11,1},{0,9,433},{12,0,421},{0,9,433},{1,0,481},{1,0,481},{1,0,481},{1,0,481},{0,12,50}, +{0,12,50},{0,12,50},{0,7,50},{0,6,157},{0,6,157},{2,21,866},{2,17,454},{2,13,609},{2,12,461},{1,20,1515},{1,15,578},{1,12,19},{1,10,603},{0,13,2214},{0,10,707},{3,17,450},{3,15,77},{3,12,34},{3,11,122},{7,0,1514},{0,16,458},{1,12,18},{0,10,482},{4,9,1514},{0,10,482},{2,16,445},{2,16,445},{2,16,445},{2,11,449},{1,15,341},{1,12,19},{1,12,19}, +{1,8,26},{0,10,635},{0,8,106},{3,13,25},{3,13,25},{3,13,25},{3,10,26},{5,2,338},{0,14,2},{0,14,2},{0,9,20},{8,1,338},{0,9,20},{7,4,421},{2,17,9},{3,12,9},{1,12,9},{7,4,421},{11,3,421},{1,12,9},{0,10,433},{11,3,421},{0,10,433},{2,0,445},{2,0,445},{2,0,445},{2,0,445},{1,11,2},{1,11,2},{1,11,2},{1,7,10},{0,8,90}, +{0,8,90},{2,24,902},{2,19,482},{3,13,723},{2,13,482},{1,23,1578},{1,17,566},{1,14,117},{1,11,590},{0,15,2046},{0,11,535},{3,20,441},{3,17,41},{3,13,98},{3,13,53},{7,3,1514},{0,18,429},{2,13,50},{0,11,454},{11,2,1514},{0,11,454},{2,19,481},{2,19,481},{2,19,481},{2,13,481},{1,18,404},{1,14,68},{1,14,68},{1,10,89},{0,12,557},{0,10,49},{3,16,17}, +{3,16,17},{3,16,17},{3,12,17},{5,5,338},{1,14,4},{1,14,4},{0,10,13},{5,7,338},{0,10,13},{8,2,421},{2,19,1},{4,13,5},{2,13,1},{8,2,421},{14,1,421},{2,13,1},{0,11,445},{14,1,421},{0,11,445},{2,0,481},{2,0,481},{2,0,481},{2,0,481},{1,14,64},{1,14,64},{1,14,64},{1,9,65},{0,10,40},{0,10,40},{3,23,854},{3,19,438},{3,15,603}, +{3,14,443},{2,22,1515},{2,17,578},{2,14,15},{2,12,603},{0,16,1911},{0,12,458},{4,20,450},{4,17,77},{4,14,35},{4,14,107},{5,12,1514},{0,20,425},{2,14,14},{0,12,433},{13,1,1514},{0,12,433},{3,18,434},{3,18,434},{3,18,434},{3,13,437},{2,17,341},{2,14,14},{2,14,14},{2,10,30},{0,14,477},{0,11,35},{4,15,25},{4,15,25},{4,15,25},{4,12,26},{7,1,338}, +{1,16,5},{1,16,5},{1,11,10},{10,2,338},{1,11,10},{8,5,421},{3,19,5},{4,14,10},{2,14,10},{8,5,421},{12,5,421},{2,14,10},{0,12,433},{12,5,421},{0,12,433},{3,0,433},{3,0,433},{3,0,433},{3,0,433},{2,13,2},{2,13,2},{2,13,2},{2,10,5},{0,12,25},{0,12,25},{3,26,902},{3,21,485},{4,15,750},{3,15,482},{2,25,1566},{2,19,570},{2,15,95}, +{2,13,582},{0,18,1787},{0,13,442},{4,22,430},{4,19,29},{4,15,74},{4,15,46},{8,3,1514},{1,20,425},{2,15,46},{0,13,442},{11,5,1514},{0,13,442},{3,21,481},{3,21,481},{3,21,481},{3,15,481},{2,20,387},{2,16,51},{2,16,51},{2,11,75},{0,16,419},{1,12,69},{4,18,10},{4,18,10},{4,18,10},{4,14,10},{5,10,338},{2,16,2},{2,16,2},{1,12,20},{12,1,338}, +{1,12,20},{9,4,421},{3,21,4},{5,15,5},{3,15,1},{9,4,421},{15,3,421},{3,15,1},{0,13,433},{15,3,421},{0,13,433},{3,0,481},{3,0,481},{3,0,481},{3,0,481},{2,16,50},{2,16,50},{2,16,50},{2,11,50},{0,13,9},{0,13,9},{4,25,866},{4,21,454},{4,17,609},{4,16,461},{3,24,1515},{3,19,578},{3,16,19},{3,14,603},{0,20,1686},{1,14,458},{5,21,450}, +{5,19,77},{5,16,34},{5,15,122},{3,24,1514},{1,22,425},{3,16,18},{1,14,433},{14,3,1514},{1,14,433},{4,20,445},{4,20,445},{4,20,445},{4,15,449},{3,19,341},{3,16,19},{3,16,19},{3,12,26},{0,17,372},{1,13,45},{5,17,25},{5,17,25},{5,17,25},{5,14,26},{8,1,338},{2,18,2},{2,18,2},{2,13,20},{10,5,338},{2,13,20},{11,0,421},{4,21,9},{5,16,9}, +{3,16,9},{11,0,421},{13,7,421},{3,16,9},{0,14,433},{13,7,421},{0,14,433},{4,0,445},{4,0,445},{4,0,445},{4,0,445},{3,15,2},{3,15,2},{3,15,2},{3,11,10},{0,15,5},{0,15,5},{4,28,902},{4,23,482},{5,17,723},{4,17,482},{3,27,1578},{3,21,566},{3,18,117},{3,15,590},{0,22,1614},{1,15,462},{5,24,441},{5,21,41},{5,17,98},{5,17,53},{5,20,1514}, +{2,22,429},{4,17,50},{2,15,454},{13,6,1514},{2,15,454},{4,23,481},{4,23,481},{4,23,481},{4,17,481},{3,22,404},{3,18,68},{3,18,68},{3,14,89},{0,19,347},{2,14,49},{5,20,17},{5,20,17},{5,20,17},{5,16,17},{8,4,338},{3,18,4},{3,18,4},{2,14,13},{14,2,338},{2,14,13},{11,3,421},{4,23,1},{6,17,5},{4,17,1},{11,3,421},{15,6,421},{4,17,1}, +{0,15,445},{15,6,421},{0,15,445},{4,0,481},{4,0,481},{4,0,481},{4,0,481},{3,18,64},{3,18,64},{3,18,64},{3,13,65},{1,16,8},{1,16,8},{5,27,854},{5,23,438},{5,19,603},{5,18,443},{4,26,1515},{4,21,578},{4,18,15},{4,16,603},{0,23,1566},{2,16,458},{6,24,450},{6,21,77},{6,18,35},{6,18,107},{11,1,1514},{2,24,425},{4,18,14},{2,16,433},{15,5,1514}, +{2,16,433},{5,22,434},{5,22,434},{5,22,434},{5,17,437},{4,21,341},{4,18,14},{4,18,14},{4,14,30},{0,21,341},{2,15,35},{6,19,25},{6,19,25},{6,19,25},{6,16,26},{3,25,338},{3,20,5},{3,20,5},{3,15,10},{12,6,338},{3,15,10},{12,2,421},{5,23,5},{6,18,10},{4,18,10},{12,2,421},{14,9,421},{4,18,10},{0,16,433},{14,9,421},{0,16,433},{5,0,433}, +{5,0,433},{5,0,433},{5,0,433},{4,17,2},{4,17,2},{4,17,2},{4,14,5},{1,17,10},{1,17,10},{5,30,902},{5,25,485},{6,19,750},{5,19,482},{4,29,1566},{4,23,570},{4,19,95},{4,17,582},{0,25,1533},{2,17,442},{6,26,430},{6,23,29},{6,19,74},{6,19,46},{10,7,1514},{3,24,425},{4,19,46},{2,17,442},{13,9,1514},{2,17,442},{5,25,481},{5,25,481},{5,25,481}, +{5,19,481},{4,24,387},{4,20,51},{4,20,51},{4,15,75},{1,21,341},{3,16,69},{6,22,10},{6,22,10},{6,22,10},{6,18,10},{9,6,338},{4,20,2},{4,20,2},{3,16,20},{14,5,338},{3,16,20},{11,8,421},{5,25,4},{7,19,5},{5,19,1},{11,8,421},{11,14,421},{5,19,1},{0,17,433},{11,14,421},{0,17,433},{5,0,481},{5,0,481},{5,0,481},{5,0,481},{4,20,50}, +{4,20,50},{4,20,50},{4,15,50},{2,17,9},{2,17,9},{6,29,866},{6,25,454},{6,21,609},{6,20,461},{5,28,1515},{5,23,578},{5,20,19},{5,18,603},{0,27,1521},{3,18,458},{7,25,450},{7,23,77},{7,20,34},{7,19,122},{12,3,1514},{3,26,425},{5,20,18},{3,18,433},{11,13,1514},{3,18,433},{6,24,445},{6,24,445},{6,24,445},{6,19,449},{5,23,341},{5,20,19},{5,20,19}, +{5,16,26},{1,23,341},{3,17,45},{7,21,25},{7,21,25},{7,21,25},{7,18,26},{10,5,338},{4,22,2},{4,22,2},{4,17,20},{12,9,338},{4,17,20},{13,4,421},{6,25,9},{7,20,9},{5,20,9},{13,4,421},{15,11,421},{5,20,9},{0,18,433},{15,11,421},{0,18,433},{6,0,445},{6,0,445},{6,0,445},{6,0,445},{5,19,2},{5,19,2},{5,19,2},{5,15,10},{2,19,5}, +{2,19,5},{6,31,914},{6,27,482},{7,21,723},{6,21,482},{5,31,1578},{5,25,566},{5,22,117},{5,19,590},{1,27,1535},{3,19,462},{7,28,441},{7,25,41},{7,21,98},{7,21,53},{8,19,1514},{4,26,429},{6,21,50},{4,19,454},{15,10,1514},{4,19,454},{6,27,481},{6,27,481},{6,27,481},{6,21,481},{5,26,404},{5,22,68},{5,22,68},{5,18,89},{2,23,347},{4,18,49},{7,24,17}, +{7,24,17},{7,24,17},{7,20,17},{10,8,338},{5,22,4},{5,22,4},{4,18,13},{11,12,338},{4,18,13},{15,0,421},{6,27,1},{8,21,50},{6,21,1},{15,0,421},{13,15,421},{6,21,1},{0,19,445},{13,15,421},{0,19,445},{6,0,481},{6,0,481},{6,0,481},{6,0,481},{5,22,64},{5,22,64},{5,22,64},{5,17,65},{3,20,8},{3,20,8},{7,31,854},{7,27,438},{7,23,603}, +{7,22,443},{6,30,1515},{6,25,578},{6,22,15},{6,20,603},{1,29,1518},{4,20,458},{7,31,565},{7,27,149},{8,22,174},{7,22,154},{13,5,1514},{4,28,425},{6,22,14},{4,20,433},{12,15,1514},{4,20,433},{7,26,434},{7,26,434},{7,26,434},{7,21,437},{6,25,341},{6,22,14},{6,22,14},{6,18,30},{2,25,341},{4,19,35},{7,26,145},{7,26,145},{7,26,145},{7,21,148},{9,14,338}, +{5,24,5},{5,24,5},{5,19,10},{14,10,338},{5,19,10},{15,3,421},{7,27,5},{8,22,5},{6,22,10},{15,3,421},{15,14,421},{6,22,10},{0,20,433},{15,14,421},{0,20,433},{7,0,433},{7,0,433},{7,0,433},{7,0,433},{6,21,2},{6,21,2},{6,21,2},{6,18,5},{3,21,10},{3,21,10},{7,31,1046},{7,29,485},{7,24,770},{7,23,482},{7,29,1598},{6,27,570},{6,23,95}, +{6,21,582},{2,29,1533},{4,21,442},{8,28,450},{8,26,77},{8,23,35},{8,23,107},{15,1,1514},{5,28,425},{6,23,46},{4,21,442},{15,13,1514},{4,21,442},{7,29,481},{7,29,481},{7,29,481},{7,23,481},{6,28,387},{6,24,51},{6,24,51},{6,19,75},{3,25,341},{5,20,69},{8,24,25},{8,24,25},{8,24,25},{8,21,26},{11,10,338},{6,24,2},{6,24,2},{5,20,20},{5,23,338}, +{5,20,20},{13,12,421},{7,29,4},{8,23,10},{7,23,1},{13,12,421},{13,18,421},{7,23,1},{0,21,433},{13,18,421},{0,21,433},{7,0,481},{7,0,481},{7,0,481},{7,0,481},{6,24,50},{6,24,50},{6,24,50},{6,19,50},{4,21,9},{4,21,9},{8,31,1106},{8,28,714},{8,24,749},{8,24,734},{7,31,1542},{7,27,578},{7,24,19},{7,22,603},{2,31,1521},{5,22,458},{8,31,430}, +{8,28,38},{8,24,73},{8,24,58},{14,7,1514},{5,30,425},{7,24,18},{5,22,433},{13,17,1514},{5,22,433},{8,27,686},{8,27,686},{8,27,686},{8,23,686},{7,27,341},{7,24,19},{7,24,19},{7,20,26},{3,27,341},{5,21,45},{8,27,10},{8,27,10},{8,27,10},{8,23,10},{12,9,338},{6,26,2},{6,26,2},{6,21,20},{14,13,338},{6,21,20},{15,8,421},{7,31,20},{9,24,4}, +{7,24,9},{15,8,421},{15,17,421},{7,24,9},{0,22,433},{15,17,421},{0,22,433},{8,0,685},{8,0,685},{8,0,685},{8,0,685},{7,23,2},{7,23,2},{7,23,2},{7,19,10},{4,23,5},{4,23,5},{8,31,1034},{8,30,438},{8,26,603},{8,25,443},{8,30,1806},{7,29,566},{7,26,117},{7,23,590},{3,31,1535},{5,23,462},{9,31,437},{9,28,77},{9,25,33},{9,25,98},{10,23,1514}, +{6,30,429},{7,26,53},{6,23,454},{11,21,1514},{6,23,454},{8,29,434},{8,29,434},{8,29,434},{8,24,437},{7,30,404},{7,26,68},{7,26,68},{7,22,89},{4,27,347},{6,22,49},{9,26,17},{9,26,17},{9,26,17},{9,23,20},{15,2,338},{7,26,4},{7,26,4},{6,22,13},{13,16,338},{6,22,13},{15,11,421},{8,30,5},{9,25,17},{8,25,10},{15,11,421},{15,19,421},{8,25,10}, +{0,23,445},{15,19,421},{0,23,445},{8,0,433},{8,0,433},{8,0,433},{8,0,433},{7,26,64},{7,26,64},{7,26,64},{7,21,65},{5,24,8},{5,24,8},{9,31,1174},{8,31,506},{9,26,723},{8,26,482},{8,31,1643},{7,30,717},{8,26,131},{7,24,725},{4,31,1566},{6,24,458},{9,31,549},{9,30,41},{9,26,98},{9,26,53},{15,9,1514},{7,30,461},{8,26,50},{6,24,433},{14,19,1514}, +{6,24,433},{8,31,490},{8,31,490},{8,31,490},{8,26,481},{8,28,421},{8,25,122},{8,25,122},{8,22,131},{4,29,341},{6,23,35},{9,29,17},{9,29,17},{9,29,17},{9,25,17},{11,18,338},{7,28,5},{7,28,5},{7,23,10},{10,21,338},{7,23,10},{14,17,421},{9,30,25},{10,26,5},{8,26,1},{14,17,421},{13,23,421},{8,26,1},{0,24,433},{13,23,421},{0,24,433},{8,0,481}, +{8,0,481},{8,0,481},{8,0,481},{8,24,82},{8,24,82},{8,24,82},{8,21,81},{5,25,10},{5,25,10},{9,31,1334},{9,31,470},{9,28,597},{9,27,443},{9,31,1815},{8,30,578},{8,27,15},{8,25,603},{5,31,1638},{6,25,442},{10,31,506},{10,30,77},{10,27,35},{10,27,107},{14,15,1514},{7,31,506},{8,27,14},{6,25,442},{12,23,1514},{6,25,442},{9,31,434},{9,31,434},{9,31,434}, +{9,26,437},{8,30,341},{8,27,14},{8,27,14},{8,23,30},{5,29,341},{7,24,69},{10,28,25},{10,28,25},{10,28,25},{10,25,26},{13,14,338},{8,27,13},{8,27,13},{7,24,20},{8,25,338},{7,24,20},{15,16,421},{9,31,37},{10,27,10},{8,27,10},{15,16,421},{15,22,421},{8,27,10},{0,25,433},{15,22,421},{0,25,433},{9,0,433},{9,0,433},{9,0,433},{9,0,433},{8,26,2}, +{8,26,2},{8,26,2},{8,23,5},{6,25,9},{6,25,9},{10,31,1470},{10,31,735},{10,28,749},{9,28,481},{9,31,1895},{8,31,579},{8,28,89},{8,26,582},{6,31,1761},{7,26,458},{11,31,614},{10,31,59},{10,28,73},{10,28,58},{13,21,1514},{8,31,530},{8,28,40},{7,26,433},{15,21,1514},{7,26,433},{9,31,562},{9,31,562},{9,31,562},{9,28,481},{9,30,421},{8,29,51},{8,29,51}, +{8,24,65},{5,31,341},{7,25,45},{10,31,10},{10,31,10},{10,31,10},{10,27,10},{14,13,338},{8,29,2},{8,29,2},{8,24,16},{11,23,338},{8,24,16},{15,19,421},{10,31,50},{11,28,4},{9,28,0},{15,19,421},{13,26,421},{9,28,0},{0,26,433},{13,26,421},{0,26,433},{9,0,481},{9,0,481},{9,0,481},{9,0,481},{8,29,50},{8,29,50},{8,29,50},{8,24,49},{6,27,5}, +{6,27,5},{11,31,1838},{10,31,753},{10,30,603},{10,29,443},{10,31,2046},{9,31,629},{9,29,21},{9,27,589},{7,31,1935},{7,27,462},{11,31,749},{11,31,120},{11,29,33},{11,29,98},{12,27,1514},{9,31,629},{9,29,21},{7,27,461},{13,25,1514},{7,27,461},{10,31,497},{10,31,497},{10,31,497},{10,28,437},{9,31,388},{9,29,20},{9,29,20},{9,25,29},{6,31,347},{8,25,105},{11,30,17}, +{11,30,17},{11,30,17},{11,27,20},{14,16,338},{8,31,4},{8,31,4},{8,26,10},{15,20,338},{8,26,10},{14,25,421},{11,31,104},{11,29,17},{10,29,10},{14,25,421},{12,29,421},{10,29,10},{0,27,445},{12,29,421},{0,27,445},{10,0,433},{10,0,433},{10,0,433},{10,0,433},{9,28,1},{9,28,1},{9,28,1},{9,25,4},{7,28,8},{7,28,8},{11,31,1902},{11,31,1001},{11,30,723}, +{10,30,482},{11,31,2286},{10,31,782},{9,31,117},{9,28,578},{8,31,2118},{7,29,491},{12,31,770},{12,31,338},{11,30,98},{11,30,53},{14,23,1514},{10,31,701},{10,30,50},{8,28,442},{11,29,1514},{8,28,442},{11,31,677},{11,31,677},{11,31,677},{10,30,481},{10,31,437},{9,31,68},{9,31,68},{9,27,89},{7,31,379},{8,27,49},{11,31,52},{11,31,52},{11,31,52},{11,29,17},{13,22,338}, +{9,31,4},{9,31,4},{8,27,13},{12,25,338},{8,27,13},{15,24,421},{12,31,169},{12,30,5},{10,30,1},{15,24,421},{15,27,421},{10,30,1},{0,28,433},{15,27,421},{0,28,433},{10,0,481},{10,0,481},{10,0,481},{10,0,481},{9,31,64},{9,31,64},{9,31,64},{9,26,65},{7,29,10},{7,29,10},{12,31,2151},{11,31,1254},{11,31,629},{11,31,442},{11,31,2393},{10,31,975},{10,31,14}, +{10,29,570},{9,31,2241},{8,29,425},{13,31,931},{12,31,395},{12,31,34},{12,30,105},{13,29,1459},{11,31,778},{10,31,13},{8,29,400},{14,27,1459},{8,29,400},{11,31,629},{11,31,629},{11,31,629},{11,30,437},{10,31,581},{10,31,14},{10,31,14},{10,27,30},{8,31,477},{8,28,45},{12,31,34},{12,31,34},{12,31,34},{12,29,26},{15,18,338},{10,31,13},{10,31,13},{9,28,17},{10,29,338}, +{9,28,17},{15,27,394},{13,31,218},{12,31,9},{10,31,9},{15,27,394},{15,28,394},{10,31,9},{0,29,400},{15,28,394},{0,29,400},{11,0,433},{11,0,433},{11,0,433},{11,0,433},{10,30,2},{10,30,2},{10,30,2},{10,27,5},{8,29,25},{8,29,25},{12,31,1767},{12,31,1167},{12,31,806},{11,31,506},{12,31,1983},{11,31,747},{11,31,122},{10,29,346},{10,31,1836},{8,30,217},{13,31,611}, +{13,31,339},{12,31,130},{12,31,10},{15,24,1064},{12,31,587},{11,31,41},{8,30,217},{15,27,1067},{8,30,217},{12,31,806},{12,31,806},{12,31,806},{11,31,506},{11,31,581},{11,31,122},{11,31,122},{10,28,65},{9,31,557},{9,29,69},{12,31,130},{12,31,130},{12,31,130},{12,31,10},{13,27,338},{11,31,41},{11,31,41},{10,28,16},{13,27,338},{10,28,16},{14,31,200},{14,31,136},{13,31,1}, +{12,31,1},{14,31,200},{15,29,200},{12,31,1},{0,30,208},{15,29,200},{0,30,208},{11,0,481},{11,0,481},{11,0,481},{11,0,481},{11,30,82},{11,30,82},{11,30,82},{10,28,49},{8,30,9},{8,30,9},{13,31,1646},{12,31,1194},{12,31,833},{12,31,497},{12,31,1686},{12,31,750},{11,31,221},{11,30,122},{11,31,1541},{9,30,110},{14,31,542},{13,31,285},{13,31,116},{13,31,20},{15,26,722}, +{13,31,429},{12,31,100},{10,30,74},{14,29,722},{10,30,74},{12,31,833},{12,31,833},{12,31,833},{12,31,497},{12,31,725},{11,31,221},{11,31,221},{11,29,29},{10,31,632},{9,30,46},{13,31,116},{13,31,116},{13,31,116},{13,31,20},{13,30,338},{12,31,100},{12,31,100},{10,30,10},{12,30,338},{10,30,10},{15,29,61},{14,31,37},{14,31,1},{13,31,4},{15,29,61},{15,30,61},{13,31,4}, +{0,30,73},{15,30,61},{0,30,73},{12,0,433},{12,0,433},{12,0,433},{12,0,433},{11,31,25},{11,31,25},{11,31,25},{11,29,4},{9,31,17},{9,31,17},{13,31,1406},{13,31,1134},{13,31,965},{12,31,737},{13,31,1454},{12,31,702},{12,31,341},{11,31,89},{11,31,1381},{10,31,49},{14,31,318},{14,31,254},{14,31,218},{13,31,116},{14,31,510},{13,31,333},{13,31,164},{10,31,13},{14,30,509}, +{10,31,13},{13,31,965},{13,31,965},{13,31,965},{12,31,737},{12,31,869},{12,31,341},{12,31,341},{11,31,89},{11,31,756},{10,31,49},{14,31,218},{14,31,218},{14,31,218},{13,31,116},{15,26,338},{13,31,164},{13,31,164},{10,31,13},{14,29,338},{10,31,13},{15,30,9},{15,31,9},{15,31,9},{14,31,9},{15,30,9},{15,31,9},{14,31,9},{0,31,9},{15,31,9},{0,31,9},{12,0,481}, +{12,0,481},{12,0,481},{12,0,481},{12,31,85},{12,31,85},{12,31,85},{11,30,65},{10,31,40},{10,31,40},{13,31,1315},{13,31,1043},{13,31,874},{13,31,602},{13,31,1171},{13,31,627},{13,31,458},{12,31,5},{12,31,1087},{11,31,80},{14,31,225},{14,31,161},{14,31,125},{14,31,61},{15,29,297},{14,31,193},{14,31,157},{12,31,4},{14,31,297},{12,31,4},{13,31,874},{13,31,874},{13,31,874}, +{13,31,602},{13,31,730},{13,31,458},{13,31,458},{12,31,5},{11,31,705},{11,31,80},{14,31,125},{14,31,125},{14,31,125},{14,31,61},{14,31,221},{14,31,157},{14,31,157},{12,31,4},{15,29,221},{12,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{13,0,433},{13,0,433},{13,0,433},{13,0,433},{12,31,101}, +{12,31,101},{12,31,101},{12,31,5},{11,31,80},{11,31,80},{14,31,885},{14,31,821},{14,31,785},{13,31,650},{14,31,885},{13,31,483},{13,31,314},{13,31,81},{13,31,779},{11,31,144},{15,31,169},{14,31,145},{14,31,109},{14,31,45},{15,30,118},{14,31,81},{14,31,45},{13,31,0},{15,30,114},{13,31,0},{14,31,785},{14,31,785},{14,31,785},{13,31,650},{13,31,586},{13,31,314},{13,31,314}, +{13,31,81},{12,31,518},{11,31,144},{14,31,109},{14,31,109},{14,31,109},{14,31,45},{15,29,85},{14,31,45},{14,31,45},{13,31,0},{14,31,85},{13,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{13,0,481},{13,0,481},{13,0,481},{13,0,481},{13,31,145},{13,31,145},{13,31,145},{13,31,81},{11,31,144}, +{11,31,144},{0,13,884},{0,10,225},{0,7,18},{0,6,265},{0,9,1899},{0,7,1355},{0,6,589},{0,4,1354},{0,5,2124},{0,4,1498},{0,13,884},{0,10,225},{0,7,18},{0,6,265},{2,2,1896},{0,7,1355},{0,6,589},{0,4,1354},{1,4,1896},{0,4,1354},{0,6,0},{0,6,0},{0,6,0},{0,4,4},{0,3,162},{0,3,90},{0,3,90},{0,2,104},{0,2,200},{0,1,134},{0,6,0}, +{0,6,0},{0,6,0},{0,4,4},{0,3,162},{0,3,90},{0,3,90},{0,2,104},{0,2,164},{0,2,104},{3,3,882},{0,10,225},{0,7,18},{0,6,265},{3,3,882},{4,3,882},{0,6,265},{0,5,890},{4,3,882},{0,5,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,15,884},{0,12,170},{0,8,8}, +{0,7,202},{0,10,2360},{0,8,1530},{0,7,643},{0,5,1579},{0,6,2684},{0,5,1804},{0,15,884},{0,12,170},{0,8,8},{0,7,202},{1,7,2355},{0,8,1530},{0,7,643},{0,5,1579},{1,5,2355},{0,5,1579},{0,9,1},{0,9,1},{0,9,1},{0,5,1},{0,4,340},{0,4,180},{0,4,180},{0,2,200},{0,2,392},{0,2,236},{0,9,1},{0,9,1},{0,9,1},{0,5,1},{1,1,338}, +{0,4,180},{0,4,180},{0,2,200},{2,0,340},{0,2,200},{4,2,882},{0,12,170},{0,8,8},{0,7,202},{4,2,882},{6,2,882},{0,7,202},{0,6,890},{6,2,882},{0,6,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,18,882},{0,14,106},{0,10,52},{0,9,148},{0,12,2899},{0,9,1773},{0,8,725}, +{0,6,1854},{0,7,3348},{0,5,2124},{0,18,882},{0,14,106},{0,10,52},{0,9,148},{1,9,2899},{0,9,1773},{0,8,725},{0,6,1854},{6,0,2899},{0,6,1854},{0,11,1},{0,11,1},{0,11,1},{0,7,1},{0,6,580},{0,5,306},{0,5,306},{0,3,325},{0,3,667},{0,3,406},{0,11,1},{0,11,1},{0,11,1},{0,7,1},{1,2,580},{0,5,306},{0,5,306},{0,3,325},{2,1,578}, +{0,3,325},{3,8,882},{0,14,106},{1,9,13},{0,9,148},{3,8,882},{4,6,882},{0,9,148},{0,7,890},{4,6,882},{0,7,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,21,920},{0,16,89},{0,11,153},{0,10,121},{0,14,3051},{0,11,1709},{0,9,557},{0,7,1795},{0,8,3651},{0,6,2174},{0,21,920}, +{0,16,89},{1,10,108},{0,10,121},{4,1,3048},{0,11,1709},{0,9,557},{0,7,1795},{3,5,3048},{0,7,1795},{0,14,37},{0,14,37},{0,14,37},{0,8,37},{0,8,648},{0,7,274},{0,7,274},{0,4,277},{0,4,824},{0,4,421},{0,14,37},{0,14,37},{0,14,37},{0,8,37},{0,8,648},{0,7,274},{0,7,274},{0,4,277},{4,0,648},{0,4,277},{5,4,882},{0,16,53},{1,10,8}, +{0,10,85},{5,4,882},{9,1,882},{0,10,85},{0,8,900},{9,1,882},{0,8,900},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,2,0},{0,2,0},{0,2,0},{0,1,1},{0,1,10},{0,1,10},{0,23,1115},{0,18,242},{1,12,309},{0,11,259},{0,17,3051},{0,13,1579},{0,10,346},{0,8,1630},{0,9,3924},{0,7,2173},{1,20,885},{1,16,90},{1,12,53},{1,11,131},{4,4,3048}, +{0,13,1579},{0,10,346},{0,8,1630},{7,2,3048},{0,8,1630},{0,17,226},{0,17,226},{0,17,226},{0,10,225},{0,11,648},{0,9,169},{0,9,169},{0,5,200},{0,6,990},{0,5,425},{1,13,2},{1,13,2},{1,13,2},{1,9,2},{3,1,648},{0,9,169},{0,9,169},{0,5,200},{3,3,648},{0,5,200},{5,7,882},{0,18,17},{2,11,18},{0,11,34},{5,7,882},{6,7,882},{0,11,34}, +{0,9,890},{6,7,882},{0,9,890},{0,0,225},{0,0,225},{0,0,225},{0,0,225},{0,5,0},{0,5,0},{0,5,0},{0,3,0},{0,2,61},{0,2,61},{1,23,1187},{1,18,350},{1,13,422},{1,12,373},{0,20,3048},{0,15,1443},{0,12,204},{0,9,1483},{0,11,4212},{0,8,2174},{1,23,931},{1,18,94},{2,12,108},{1,12,117},{6,0,3048},{0,15,1443},{0,12,204},{0,9,1483},{5,6,3048}, +{0,9,1483},{1,16,305},{1,16,305},{1,16,305},{1,10,309},{0,13,650},{0,11,109},{0,11,109},{0,7,148},{0,7,1161},{0,6,473},{1,16,49},{1,16,49},{1,16,49},{1,10,53},{4,0,648},{0,11,109},{0,11,109},{0,7,148},{1,7,648},{0,7,148},{7,3,882},{0,20,8},{2,12,8},{0,12,8},{7,3,882},{11,2,882},{0,12,8},{0,10,890},{11,2,882},{0,10,890},{1,0,305}, +{1,0,305},{1,0,305},{1,0,305},{0,8,1},{0,8,1},{0,8,1},{0,5,4},{0,3,145},{0,3,145},{1,25,1365},{1,20,497},{1,14,713},{1,13,510},{0,23,3051},{0,16,1278},{0,13,86},{0,10,1354},{0,12,4609},{0,9,2228},{2,22,886},{2,18,110},{2,14,56},{2,13,152},{5,6,3048},{0,16,1278},{0,13,86},{0,10,1354},{10,1,3048},{0,10,1354},{1,19,482},{1,19,482},{1,19,482}, +{1,12,481},{0,16,648},{0,12,72},{0,12,72},{0,8,101},{0,8,1352},{0,7,557},{2,15,5},{2,15,5},{2,15,5},{2,11,5},{3,6,648},{0,12,72},{0,12,72},{0,8,101},{3,6,648},{0,8,101},{5,12,882},{0,21,10},{3,13,13},{0,13,5},{5,12,882},{13,1,882},{0,13,5},{0,11,890},{13,1,882},{0,11,890},{1,0,481},{1,0,481},{1,0,481},{1,0,481},{0,10,1}, +{0,10,1},{0,10,1},{0,6,1},{0,5,261},{0,5,261},{1,28,1667},{1,22,793},{1,15,1182},{1,14,793},{0,25,3048},{0,18,1170},{0,14,36},{0,11,1243},{0,14,5005},{0,10,2318},{2,25,920},{2,20,89},{3,14,108},{2,14,121},{7,2,3048},{0,18,1170},{0,14,36},{0,11,1243},{12,0,3048},{0,11,1243},{1,21,786},{1,21,786},{1,21,786},{1,14,789},{0,19,650},{0,14,32},{0,14,32}, +{0,9,50},{0,9,1619},{0,8,661},{2,18,37},{2,18,37},{2,18,37},{2,12,37},{5,2,648},{0,14,32},{0,14,32},{0,9,50},{8,1,648},{0,9,50},{8,3,882},{1,22,8},{3,14,8},{1,14,8},{8,3,882},{11,5,882},{1,14,8},{0,12,900},{11,5,882},{0,12,900},{1,0,785},{1,0,785},{1,0,785},{1,0,785},{0,13,1},{0,13,1},{0,13,1},{0,8,4},{0,6,405}, +{0,6,405},{2,27,1844},{2,22,971},{2,16,1186},{2,15,988},{0,28,3084},{0,20,1095},{0,16,77},{0,12,1159},{0,16,4945},{0,12,2084},{3,24,885},{3,20,90},{3,16,53},{3,15,131},{6,8,3048},{0,20,1059},{0,16,41},{0,12,1123},{4,12,3048},{0,12,1123},{2,21,955},{2,21,955},{2,21,955},{2,14,954},{0,22,686},{0,16,41},{0,16,41},{0,10,49},{0,11,1577},{0,9,545},{3,17,2}, +{3,17,2},{3,17,2},{3,13,2},{5,5,648},{0,16,5},{0,16,5},{0,10,13},{5,7,648},{0,10,13},{8,6,882},{1,24,9},{4,15,18},{1,15,13},{8,6,882},{15,2,882},{1,15,13},{0,13,890},{15,2,882},{0,13,890},{2,0,954},{2,0,954},{2,0,954},{2,0,954},{0,16,37},{0,16,37},{0,16,37},{0,9,40},{0,8,373},{0,8,373},{2,30,1772},{2,24,898},{2,17,1287}, +{2,16,898},{1,27,3055},{1,20,1143},{1,16,33},{1,13,1214},{0,17,4639},{0,13,1730},{3,27,931},{3,22,94},{4,16,108},{3,16,117},{5,14,3048},{0,21,996},{1,16,29},{0,13,1054},{14,1,3048},{0,13,1054},{2,23,891},{2,23,891},{2,23,891},{2,16,894},{1,21,652},{1,16,29},{1,16,29},{1,11,44},{0,13,1452},{0,11,365},{3,20,49},{3,20,49},{3,20,49},{3,14,53},{7,1,648}, +{0,18,1},{0,18,1},{0,11,4},{10,2,648},{0,11,4},{5,20,882},{2,24,8},{4,16,8},{2,16,8},{5,20,882},{13,6,882},{2,16,8},{0,14,890},{13,6,882},{0,14,890},{2,0,890},{2,0,890},{2,0,890},{2,0,890},{1,15,4},{1,15,4},{1,15,4},{1,10,5},{0,9,269},{0,9,269},{3,29,1838},{3,24,970},{3,18,1186},{3,17,983},{1,30,3084},{1,22,1095},{1,18,77}, +{1,14,1159},{0,19,4419},{0,14,1444},{4,26,886},{4,22,110},{4,18,56},{4,17,152},{8,5,3048},{0,23,936},{1,18,41},{0,14,1003},{12,5,3048},{0,14,1003},{3,23,955},{3,23,955},{3,23,955},{3,16,954},{1,23,692},{1,18,41},{1,18,41},{1,12,46},{0,15,1296},{0,12,235},{4,19,5},{4,19,5},{4,19,5},{4,15,5},{5,10,648},{1,18,5},{1,18,5},{0,12,10},{12,1,648}, +{0,12,10},{11,1,882},{2,25,10},{5,17,13},{2,17,5},{11,1,882},{15,5,882},{2,17,5},{0,15,890},{15,5,882},{0,15,890},{3,0,954},{3,0,954},{3,0,954},{3,0,954},{1,18,37},{1,18,37},{1,18,37},{1,11,40},{0,11,185},{0,11,185},{3,31,1790},{3,26,898},{3,19,1287},{3,18,898},{2,29,3057},{2,22,1179},{2,18,45},{1,15,1250},{0,20,4156},{0,15,1226},{4,29,920}, +{4,24,89},{5,18,108},{4,18,121},{3,26,3048},{0,25,909},{2,18,36},{0,15,970},{15,3,3048},{0,15,970},{3,25,891},{3,25,891},{3,25,891},{3,18,894},{2,23,659},{2,18,41},{2,18,41},{2,13,59},{0,16,1137},{0,13,137},{4,22,37},{4,22,37},{4,22,37},{4,16,37},{8,1,648},{1,20,2},{1,20,2},{1,13,1},{10,5,648},{1,13,1},{10,7,882},{3,26,8},{5,18,8}, +{3,18,8},{10,7,882},{13,9,882},{3,18,8},{0,16,900},{13,9,882},{0,16,900},{3,0,890},{3,0,890},{3,0,890},{3,0,890},{2,17,10},{2,17,10},{2,17,10},{2,12,13},{0,13,136},{0,13,136},{4,31,1844},{4,26,971},{4,20,1186},{4,19,988},{2,31,3111},{2,24,1095},{2,20,77},{2,16,1159},{0,22,3940},{0,16,1055},{5,28,885},{5,24,90},{5,20,53},{5,19,131},{5,22,3048}, +{0,27,886},{2,20,41},{0,17,926},{8,13,3048},{0,17,926},{4,25,955},{4,25,955},{4,25,955},{4,18,954},{2,26,686},{2,20,41},{2,20,41},{2,14,49},{0,18,1002},{0,15,110},{5,21,2},{5,21,2},{5,21,2},{5,17,2},{8,4,648},{2,20,5},{2,20,5},{2,14,13},{14,2,648},{2,14,13},{13,0,882},{3,28,9},{6,19,18},{3,19,13},{13,0,882},{5,21,882},{3,19,13}, +{0,17,890},{5,21,882},{0,17,890},{4,0,954},{4,0,954},{4,0,954},{4,0,954},{2,20,37},{2,20,37},{2,20,37},{2,13,40},{0,15,74},{0,15,74},{4,31,1972},{4,28,898},{4,21,1287},{4,20,898},{3,31,3055},{3,24,1143},{3,20,33},{3,17,1214},{0,23,3820},{0,18,963},{5,31,931},{5,26,94},{6,20,108},{5,20,117},{11,3,3048},{0,28,899},{3,20,29},{0,18,899},{11,11,3048}, +{0,18,899},{4,27,891},{4,27,891},{4,27,891},{4,20,894},{3,25,652},{3,20,29},{3,20,29},{3,15,44},{0,20,876},{0,16,102},{5,24,49},{5,24,49},{5,24,49},{5,18,53},{3,25,648},{2,22,1},{2,22,1},{2,15,4},{12,6,648},{2,15,4},{8,19,882},{4,28,8},{6,20,8},{4,20,8},{8,19,882},{15,10,882},{4,20,8},{0,18,890},{15,10,882},{0,18,890},{4,0,890}, +{4,0,890},{4,0,890},{4,0,890},{3,19,4},{3,19,4},{3,19,4},{3,14,5},{0,17,29},{0,17,29},{5,31,1964},{5,28,970},{5,22,1186},{5,21,983},{4,31,3172},{3,26,1095},{3,22,77},{3,18,1159},{0,25,3679},{0,19,899},{6,30,886},{6,26,110},{6,22,56},{6,21,152},{10,9,3048},{1,29,888},{3,22,41},{0,19,890},{14,9,3048},{0,19,890},{5,27,955},{5,27,955},{5,27,955}, +{5,20,954},{3,27,692},{3,22,41},{3,22,41},{3,16,46},{0,22,800},{1,16,98},{6,23,5},{6,23,5},{6,23,5},{6,19,5},{9,6,648},{3,22,5},{3,22,5},{2,16,10},{14,5,648},{2,16,10},{13,5,882},{4,29,10},{7,21,13},{4,21,5},{13,5,882},{12,15,882},{4,21,5},{0,19,890},{12,15,882},{0,19,890},{5,0,954},{5,0,954},{5,0,954},{5,0,954},{3,22,37}, +{3,22,37},{3,22,37},{3,15,40},{0,19,9},{0,19,9},{6,31,2264},{5,30,898},{5,23,1287},{5,22,898},{4,31,3204},{4,26,1179},{4,22,45},{3,19,1250},{0,27,3523},{0,20,908},{6,31,968},{6,28,89},{7,22,108},{6,22,121},{9,15,3048},{1,30,899},{4,22,36},{0,20,904},{5,22,3048},{0,20,904},{5,29,891},{5,29,891},{5,29,891},{5,22,894},{4,27,659},{4,22,41},{4,22,41}, +{4,17,59},{0,23,747},{1,18,102},{6,26,37},{6,26,37},{6,26,37},{6,20,37},{10,5,648},{3,24,2},{3,24,2},{3,17,1},{12,9,648},{3,17,1},{15,1,882},{5,30,8},{7,22,8},{5,22,8},{15,1,882},{15,13,882},{5,22,8},{0,20,900},{15,13,882},{0,20,900},{5,0,890},{5,0,890},{5,0,890},{5,0,890},{4,21,10},{4,21,10},{4,21,10},{4,16,13},{0,20,8}, +{0,20,8},{6,31,2228},{6,30,971},{6,24,1186},{6,23,988},{5,31,3256},{4,28,1095},{4,24,77},{4,20,1159},{0,29,3364},{1,21,894},{7,31,915},{7,28,90},{7,24,53},{7,23,131},{14,1,3048},{2,31,886},{4,24,41},{1,21,890},{10,17,3048},{1,21,890},{6,29,955},{6,29,955},{6,29,955},{6,22,954},{4,30,686},{4,24,41},{4,24,41},{4,18,49},{0,25,705},{2,19,110},{7,25,2}, +{7,25,2},{7,25,2},{7,21,2},{10,8,648},{4,24,5},{4,24,5},{4,18,13},{11,12,648},{4,18,13},{15,4,882},{6,30,17},{7,24,52},{5,23,13},{15,4,882},{9,22,882},{5,23,13},{0,21,890},{9,22,882},{0,21,890},{6,0,954},{6,0,954},{6,0,954},{6,0,954},{4,24,37},{4,24,37},{4,24,37},{4,17,40},{1,21,4},{1,21,4},{7,31,2444},{6,31,907},{6,25,1287}, +{6,24,898},{6,31,3436},{5,28,1143},{5,24,33},{5,21,1214},{0,31,3276},{1,22,908},{8,30,1208},{7,30,94},{7,25,166},{7,24,117},{13,7,3048},{3,31,906},{5,24,29},{1,22,899},{13,15,3048},{1,22,899},{6,31,891},{6,31,891},{6,31,891},{6,24,894},{5,29,652},{5,24,29},{5,24,29},{5,19,44},{0,27,665},{2,20,102},{7,28,49},{7,28,49},{7,28,49},{7,22,53},{9,14,648}, +{4,26,1},{4,26,1},{4,19,4},{14,10,648},{4,19,4},{10,23,882},{6,31,17},{8,24,13},{6,24,8},{10,23,882},{11,21,882},{6,24,8},{0,22,890},{11,21,882},{0,22,890},{6,0,890},{6,0,890},{6,0,890},{6,0,890},{5,23,4},{5,23,4},{5,23,4},{5,18,5},{1,23,4},{1,23,4},{7,31,2636},{7,31,991},{7,26,1186},{7,25,983},{6,31,3532},{5,30,1095},{5,26,77}, +{5,22,1159},{0,31,3340},{2,23,899},{8,31,1014},{7,31,262},{8,25,108},{7,25,254},{15,3,3048},{4,31,936},{5,26,41},{2,23,890},{11,19,3048},{2,23,890},{7,31,955},{7,31,955},{7,31,955},{7,24,954},{5,31,692},{5,26,41},{5,26,41},{5,20,46},{0,29,651},{3,20,98},{8,26,101},{8,26,101},{8,26,101},{8,22,101},{11,10,648},{5,26,5},{5,26,5},{4,20,10},{5,23,648}, +{4,20,10},{15,9,882},{7,31,37},{8,25,8},{6,25,5},{15,9,882},{14,19,882},{6,25,5},{0,23,890},{14,19,882},{0,23,890},{7,0,954},{7,0,954},{7,0,954},{7,0,954},{5,26,37},{5,26,37},{5,26,37},{5,19,40},{2,23,9},{2,23,9},{8,31,3110},{7,31,1135},{7,27,1287},{7,26,898},{7,31,3652},{6,30,1179},{6,26,45},{5,23,1250},{1,31,3492},{2,24,908},{8,31,1174}, +{8,31,110},{8,27,56},{8,26,152},{11,19,3048},{5,31,996},{6,26,36},{2,24,904},{9,23,3048},{2,24,904},{7,31,939},{7,31,939},{7,31,939},{7,26,894},{6,31,659},{6,26,41},{6,26,41},{6,21,59},{1,29,659},{3,22,102},{8,28,4},{8,28,4},{8,28,4},{8,24,8},{12,9,648},{5,28,2},{5,28,2},{5,21,1},{14,13,648},{5,21,1},{14,15,882},{8,31,106},{9,26,13}, +{7,26,8},{14,15,882},{12,23,882},{7,26,8},{0,24,900},{12,23,882},{0,24,900},{7,0,890},{7,0,890},{7,0,890},{7,0,890},{6,25,10},{6,25,10},{6,25,10},{6,20,13},{2,24,8},{2,24,8},{8,31,3038},{8,31,1470},{8,28,1391},{7,27,1137},{7,31,4120},{6,31,1146},{6,28,77},{6,24,1159},{3,31,3681},{3,25,894},{9,31,1205},{8,31,245},{9,27,99},{8,27,122},{10,25,3048}, +{6,31,1110},{6,28,41},{3,25,890},{12,21,3048},{3,25,890},{8,31,1274},{8,31,1274},{8,31,1274},{7,27,1128},{7,30,750},{6,28,41},{6,28,41},{6,22,49},{1,31,648},{4,23,110},{8,31,49},{8,31,49},{8,31,49},{8,25,53},{15,2,648},{6,28,5},{6,28,5},{6,22,13},{13,16,648},{6,22,13},{14,18,882},{9,31,164},{9,27,18},{7,27,13},{14,18,882},{11,26,882},{7,27,13}, +{0,25,890},{11,26,882},{0,25,890},{7,0,1124},{7,0,1124},{7,0,1124},{7,0,1124},{6,28,37},{6,28,37},{6,28,37},{6,21,40},{3,25,4},{3,25,4},{9,31,3454},{8,31,1502},{8,29,1186},{8,28,983},{8,31,4077},{7,31,1230},{7,28,33},{7,25,1214},{4,31,3820},{3,26,908},{10,31,1368},{9,31,261},{9,29,53},{9,28,126},{15,11,3048},{7,31,1226},{7,28,29},{3,26,899},{15,19,3048}, +{3,26,899},{8,31,1018},{8,31,1018},{8,31,1018},{8,27,954},{7,31,724},{7,28,29},{7,28,29},{7,23,44},{2,31,665},{4,24,102},{9,30,2},{9,30,2},{9,30,2},{9,26,2},{11,18,648},{6,30,1},{6,30,1},{6,23,4},{10,21,648},{6,23,4},{12,27,882},{10,31,225},{10,28,13},{7,28,20},{12,27,882},{13,25,882},{7,28,20},{0,26,890},{13,25,882},{0,26,890},{8,0,954}, +{8,0,954},{8,0,954},{8,0,954},{7,27,4},{7,27,4},{7,27,4},{7,22,5},{3,27,4},{3,27,4},{9,31,3614},{9,31,1886},{8,30,1287},{8,29,898},{8,31,4381},{7,31,1582},{7,30,77},{7,26,1159},{5,31,4036},{4,27,899},{10,31,1560},{10,31,405},{10,29,108},{9,29,117},{14,17,3048},{8,31,1444},{7,30,41},{4,27,890},{13,23,3048},{4,27,890},{8,31,1146},{8,31,1146},{8,31,1146}, +{8,29,894},{8,30,1011},{7,30,41},{7,30,41},{7,24,46},{3,31,705},{5,24,98},{9,31,85},{9,31,85},{9,31,85},{9,27,53},{13,14,648},{7,30,5},{7,30,5},{6,24,10},{8,25,648},{6,24,10},{14,23,882},{10,31,305},{10,29,8},{8,29,8},{14,23,882},{11,29,882},{8,29,8},{0,27,890},{11,29,882},{0,27,890},{8,0,890},{8,0,890},{8,0,890},{8,0,890},{7,30,37}, +{7,30,37},{7,30,37},{7,23,40},{4,27,9},{4,27,9},{10,31,4072},{9,31,2174},{9,31,1186},{9,30,983},{9,31,4545},{8,31,1725},{8,30,207},{7,27,1250},{6,31,4339},{4,28,908},{11,31,1656},{10,31,645},{10,31,56},{10,30,152},{13,23,3048},{8,31,1604},{7,31,77},{4,28,904},{11,27,3048},{4,28,904},{9,31,1150},{9,31,1150},{9,31,1150},{9,29,954},{8,31,841},{8,29,193},{8,29,193}, +{7,25,197},{4,31,747},{5,26,102},{10,31,20},{10,31,20},{10,31,20},{10,28,8},{14,13,648},{7,31,41},{7,31,41},{7,25,1},{11,23,648},{7,25,1},{13,29,882},{11,31,397},{11,30,13},{8,30,5},{13,29,882},{14,27,882},{8,30,5},{0,28,900},{14,27,882},{0,28,900},{9,0,954},{9,0,954},{9,0,954},{9,0,954},{8,27,122},{8,27,122},{8,27,122},{8,23,122},{4,28,8}, +{4,28,8},{10,31,4147},{10,31,2404},{9,31,1429},{9,31,901},{10,31,4627},{9,31,1938},{8,31,38},{8,28,1061},{7,31,4330},{5,29,789},{12,31,1701},{11,31,715},{11,31,90},{10,31,113},{15,19,2814},{10,31,1554},{8,31,34},{5,29,785},{13,26,2814},{5,29,785},{9,31,1429},{9,31,1429},{9,31,1429},{9,31,901},{9,31,1022},{8,31,38},{8,31,38},{8,26,44},{5,31,840},{6,27,110},{11,31,90}, +{11,31,90},{11,31,90},{10,29,53},{14,16,648},{8,31,34},{8,31,34},{7,26,20},{15,20,648},{7,26,20},{15,25,761},{12,31,425},{11,31,9},{9,31,1},{15,25,761},{12,31,761},{9,31,1},{0,29,785},{12,31,761},{0,29,785},{9,0,900},{9,0,900},{9,0,900},{9,0,900},{8,30,4},{8,30,4},{8,30,4},{8,25,5},{5,29,4},{5,29,4},{11,31,3735},{10,31,2356},{10,31,1395}, +{10,31,954},{10,31,4099},{9,31,1618},{9,31,174},{8,29,686},{7,31,3930},{6,29,510},{12,31,1285},{12,31,685},{11,31,122},{11,31,37},{13,27,2249},{10,31,1186},{9,31,74},{6,29,485},{13,27,2249},{6,29,485},{10,31,1395},{10,31,1395},{10,31,1395},{10,31,954},{9,31,1086},{9,31,174},{9,31,174},{8,27,49},{6,31,969},{6,28,102},{11,31,122},{11,31,122},{11,31,122},{11,30,2},{13,22,648}, +{9,31,74},{9,31,74},{8,27,13},{12,25,648},{8,27,13},{15,26,481},{13,31,269},{12,31,0},{10,31,0},{15,26,481},{15,28,481},{10,31,0},{0,29,481},{15,28,481},{0,29,481},{10,0,954},{10,0,954},{10,0,954},{10,0,954},{8,31,61},{8,31,61},{8,31,61},{8,26,40},{5,31,4},{5,31,4},{11,31,3399},{11,31,2260},{11,31,1635},{10,31,954},{11,31,3639},{10,31,1435},{9,31,238}, +{9,29,430},{8,31,3443},{6,30,314},{13,31,1121},{12,31,525},{12,31,164},{11,31,53},{13,29,1769},{11,31,918},{10,31,113},{7,30,290},{14,27,1769},{7,30,290},{11,31,1635},{11,31,1635},{11,31,1635},{10,31,954},{10,31,1251},{9,31,238},{9,31,238},{9,28,41},{7,31,1105},{7,28,98},{12,31,164},{12,31,164},{12,31,164},{11,31,53},{15,18,648},{10,31,113},{10,31,113},{8,28,1},{10,29,648}, +{8,28,1},{15,27,269},{13,31,173},{13,31,4},{11,31,4},{15,27,269},{14,30,265},{11,31,4},{0,30,289},{14,30,265},{0,30,289},{10,0,890},{10,0,890},{10,0,890},{10,0,890},{9,31,13},{9,31,13},{9,31,13},{9,27,5},{6,31,9},{6,31,9},{12,31,3157},{11,31,2308},{11,31,1683},{11,31,1054},{11,31,3303},{10,31,1339},{10,31,378},{9,30,213},{9,31,3103},{7,30,166},{13,31,801}, +{13,31,529},{12,31,260},{12,31,20},{15,24,1374},{12,31,777},{11,31,181},{8,30,117},{15,27,1377},{8,30,117},{11,31,1683},{11,31,1683},{11,31,1683},{11,31,1054},{10,31,1491},{10,31,378},{10,31,378},{9,29,46},{8,31,1331},{7,30,102},{12,31,260},{12,31,260},{12,31,260},{12,31,20},{13,27,648},{11,31,181},{11,31,181},{8,29,10},{13,27,648},{8,29,10},{15,28,117},{14,31,61},{14,31,25}, +{13,31,4},{15,28,117},{14,31,117},{13,31,4},{0,30,113},{14,31,117},{0,30,113},{11,0,954},{11,0,954},{11,0,954},{11,0,954},{10,31,122},{10,31,122},{10,31,122},{9,28,40},{7,31,29},{7,31,29},{12,31,2860},{12,31,2260},{12,31,1899},{11,31,1261},{12,31,2932},{11,31,1310},{11,31,685},{10,30,108},{10,31,2731},{7,31,173},{13,31,747},{13,31,475},{13,31,306},{13,31,130},{15,26,1032}, +{12,31,651},{12,31,290},{8,31,40},{14,29,1032},{8,31,40},{12,31,1899},{12,31,1899},{12,31,1899},{11,31,1261},{11,31,1620},{11,31,685},{11,31,685},{10,30,44},{9,31,1524},{8,30,134},{13,31,306},{13,31,306},{13,31,306},{13,31,130},{13,30,648},{12,31,290},{12,31,290},{9,30,5},{12,30,648},{9,30,5},{15,30,18},{15,30,34},{14,31,16},{14,31,0},{15,30,18},{15,30,26},{14,31,0}, +{0,31,36},{15,30,26},{0,31,36},{11,0,900},{11,0,900},{11,0,900},{11,0,900},{10,31,104},{10,31,104},{10,31,104},{10,29,5},{8,30,130},{8,30,130},{13,31,2732},{12,31,2276},{12,31,1915},{12,31,1315},{12,31,2660},{11,31,1414},{11,31,789},{10,31,45},{11,31,2487},{8,31,116},{14,31,524},{14,31,460},{14,31,424},{13,31,170},{14,31,776},{13,31,507},{13,31,338},{10,31,9},{14,30,771}, +{10,31,9},{12,31,1915},{12,31,1915},{12,31,1915},{12,31,1315},{12,31,1699},{11,31,789},{11,31,789},{10,31,45},{10,31,1546},{8,31,116},{14,31,424},{14,31,424},{14,31,424},{13,31,170},{15,26,580},{13,31,338},{13,31,338},{10,31,9},{14,29,580},{10,31,9},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{12,0,954}, +{12,0,954},{12,0,954},{12,0,954},{11,31,164},{11,31,164},{11,31,164},{10,30,40},{8,31,116},{8,31,116},{13,31,2156},{13,31,1884},{13,31,1715},{12,31,1251},{13,31,2132},{12,31,1108},{12,31,747},{11,31,5},{11,31,1927},{9,31,180},{14,31,300},{14,31,236},{14,31,200},{14,31,136},{15,28,451},{14,31,328},{13,31,194},{11,31,1},{15,29,456},{11,31,1},{13,31,1715},{13,31,1715},{13,31,1715}, +{12,31,1251},{12,31,1347},{12,31,747},{12,31,747},{11,31,5},{10,31,1242},{9,31,180},{14,31,200},{14,31,200},{14,31,200},{14,31,136},{15,27,338},{13,31,194},{13,31,194},{11,31,1},{13,31,338},{11,31,1},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{12,0,890},{12,0,890},{12,0,890},{12,0,890},{11,31,260}, +{11,31,260},{11,31,260},{11,31,5},{9,31,180},{9,31,180},{13,31,1836},{13,31,1564},{13,31,1395},{13,31,1123},{13,31,1620},{12,31,1012},{12,31,651},{11,31,85},{12,31,1564},{10,31,233},{14,31,204},{14,31,140},{14,31,104},{14,31,40},{15,29,216},{14,31,136},{14,31,100},{12,31,1},{14,31,216},{12,31,1},{13,31,1395},{13,31,1395},{13,31,1395},{13,31,1123},{13,31,1179},{12,31,651},{12,31,651}, +{11,31,85},{11,31,998},{10,31,233},{14,31,104},{14,31,104},{14,31,104},{14,31,40},{15,28,162},{14,31,100},{14,31,100},{12,31,1},{15,29,164},{12,31,1},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{13,0,954},{13,0,954},{13,0,954},{13,0,954},{12,31,290},{12,31,290},{12,31,290},{11,31,85},{10,31,233}, +{10,31,233},{0,17,1568},{0,14,442},{0,10,40},{0,8,485},{0,11,3379},{0,9,2369},{0,8,1061},{0,5,2435},{0,6,3760},{0,5,2660},{0,17,1568},{0,14,442},{0,10,40},{0,8,485},{1,8,3372},{0,9,2369},{0,8,1061},{0,5,2435},{5,1,3371},{0,5,2435},{0,8,0},{0,8,0},{0,8,0},{0,5,1},{0,4,288},{0,4,160},{0,4,160},{0,2,164},{0,2,332},{0,2,200},{0,8,0}, +{0,8,0},{0,8,0},{0,5,1},{0,4,288},{0,4,160},{0,4,160},{0,2,164},{2,0,288},{0,2,164},{3,7,1568},{0,14,442},{0,10,40},{0,8,485},{3,7,1568},{8,0,1568},{0,8,485},{0,6,1586},{8,0,1568},{0,6,1586},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,20,1570},{0,16,325},{0,11,5}, +{0,9,392},{0,13,3968},{0,10,2630},{0,9,1121},{0,6,2710},{0,7,4484},{0,6,3034},{0,20,1570},{0,16,325},{0,11,5},{0,9,392},{1,10,3968},{0,10,2630},{0,9,1121},{0,6,2710},{5,2,3968},{0,6,2710},{0,11,1},{0,11,1},{0,11,1},{0,6,4},{0,5,514},{0,5,274},{0,5,274},{0,3,289},{0,3,595},{0,3,370},{0,11,1},{0,11,1},{0,11,1},{0,6,4},{1,2,512}, +{0,5,274},{0,5,274},{0,3,289},{1,2,512},{0,3,289},{5,3,1568},{0,16,325},{0,11,5},{0,9,392},{5,3,1568},{4,7,1568},{0,9,392},{0,7,1586},{4,7,1568},{0,7,1586},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,22,1570},{0,17,225},{0,12,18},{0,11,292},{0,15,4652},{0,11,2945},{0,10,1217}, +{0,7,3035},{0,8,5283},{0,7,3476},{0,22,1570},{0,17,225},{0,12,18},{0,11,292},{2,8,4651},{0,11,2945},{0,10,1217},{0,7,3035},{5,3,4651},{0,7,3035},{0,13,0},{0,13,0},{0,13,0},{0,8,1},{0,7,802},{0,6,424},{0,6,424},{0,4,449},{0,3,931},{0,3,562},{0,13,0},{0,13,0},{0,13,0},{0,8,1},{2,0,800},{0,6,424},{0,6,424},{0,4,449},{0,4,800}, +{0,4,449},{1,19,1568},{0,17,225},{0,12,18},{0,11,292},{1,19,1568},{9,2,1568},{0,11,292},{0,8,1576},{9,2,1568},{0,8,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,25,1570},{0,19,149},{0,13,73},{0,12,194},{0,17,5424},{0,13,3368},{0,11,1349},{0,8,3449},{0,9,6213},{0,7,3956},{0,25,1570}, +{0,19,149},{0,13,73},{0,12,194},{5,0,5419},{0,13,3368},{0,11,1349},{0,8,3449},{5,4,5419},{0,8,3449},{0,16,1},{0,16,1},{0,16,1},{0,9,4},{0,8,1152},{0,7,610},{0,7,610},{0,4,625},{0,4,1328},{0,4,769},{0,16,1},{0,16,1},{0,16,1},{0,9,4},{0,8,1152},{0,7,610},{0,7,610},{0,4,625},{4,0,1152},{0,4,625},{5,8,1568},{0,19,149},{1,13,13}, +{0,12,194},{5,8,1568},{4,10,1568},{0,12,194},{0,9,1576},{4,10,1568},{0,9,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,28,1651},{0,21,155},{0,14,281},{0,13,198},{0,20,5424},{0,15,3099},{0,12,996},{0,9,3179},{0,10,6544},{0,8,3890},{1,24,1619},{0,21,155},{1,14,69},{0,13,198},{5,3,5419}, +{0,15,3099},{0,12,996},{0,9,3179},{4,7,5419},{0,9,3179},{0,19,82},{0,19,82},{0,19,82},{0,11,82},{0,11,1152},{0,9,445},{0,9,445},{0,6,505},{0,6,1494},{0,5,737},{1,15,50},{1,15,50},{1,15,50},{1,10,49},{3,1,1152},{0,9,445},{0,9,445},{0,6,505},{3,3,1152},{0,6,505},{5,11,1568},{0,21,74},{1,14,20},{0,13,117},{5,11,1568},{11,3,1568},{0,13,117}, +{0,10,1586},{11,3,1568},{0,10,1586},{0,0,81},{0,0,81},{0,0,81},{0,0,81},{0,3,0},{0,3,0},{0,3,0},{0,2,1},{0,1,25},{0,1,25},{1,27,1825},{0,23,323},{1,15,342},{0,14,361},{0,22,5420},{0,16,2834},{0,13,726},{0,10,2966},{0,11,6916},{0,9,3860},{1,27,1569},{1,21,131},{1,15,86},{1,14,181},{1,19,5419},{0,16,2834},{0,13,726},{0,10,2966},{9,2,5419}, +{0,10,2966},{1,18,257},{1,18,257},{1,18,257},{1,12,261},{0,13,1154},{0,11,337},{0,11,337},{0,7,388},{0,7,1665},{0,6,749},{1,18,1},{1,18,1},{1,18,1},{1,12,5},{4,0,1152},{0,11,337},{0,11,337},{0,7,388},{1,7,1152},{0,7,388},{8,2,1568},{0,23,34},{2,15,5},{0,14,72},{8,2,1568},{13,2,1568},{0,14,72},{0,11,1586},{13,2,1568},{0,11,1586},{1,0,257}, +{1,0,257},{1,0,257},{1,0,257},{0,6,1},{0,6,1},{0,6,1},{0,3,4},{0,2,85},{0,2,85},{1,30,1907},{1,23,411},{1,16,542},{1,15,454},{0,25,5424},{0,18,2630},{0,15,486},{0,11,2771},{0,13,7299},{0,11,3860},{2,26,1634},{1,23,155},{2,16,82},{1,15,198},{5,8,5419},{0,18,2630},{0,15,486},{0,11,2771},{4,10,5419},{0,11,2771},{1,21,338},{1,21,338},{1,21,338}, +{1,13,338},{0,16,1152},{0,13,274},{0,13,274},{0,8,305},{0,8,1856},{0,7,797},{2,17,64},{2,17,64},{2,17,64},{2,12,65},{3,6,1152},{0,13,274},{0,13,274},{0,8,305},{3,6,1152},{0,8,305},{3,23,1568},{0,25,17},{2,16,18},{0,15,45},{3,23,1568},{11,6,1568},{0,15,45},{0,12,1576},{11,6,1568},{0,12,1576},{1,0,337},{1,0,337},{1,0,337},{1,0,337},{0,8,1}, +{0,8,1},{0,8,1},{0,5,0},{0,4,169},{0,4,169},{1,31,2145},{1,25,590},{1,17,915},{1,16,619},{0,27,5420},{0,20,2424},{0,16,282},{0,12,2552},{0,15,7711},{0,11,3908},{2,29,1570},{2,23,149},{2,17,73},{2,16,194},{7,4,5419},{0,20,2424},{0,16,282},{0,12,2552},{9,5,5419},{0,12,2552},{1,23,546},{1,23,546},{1,23,546},{1,15,546},{0,19,1154},{0,15,194},{0,15,194}, +{0,9,218},{0,9,2123},{0,8,865},{2,20,1},{2,20,1},{2,20,1},{2,13,4},{5,2,1152},{0,15,194},{0,15,194},{0,9,218},{8,1,1152},{0,9,218},{9,4,1568},{0,27,5},{3,17,13},{0,16,26},{9,4,1568},{9,10,1568},{0,16,26},{0,13,1576},{9,10,1568},{0,13,1576},{1,0,545},{1,0,545},{1,0,545},{1,0,545},{0,11,0},{0,11,0},{0,11,0},{0,7,4},{0,5,289}, +{0,5,289},{2,31,2746},{1,27,945},{2,18,1370},{1,17,977},{0,30,5420},{0,22,2243},{0,17,145},{0,13,2386},{0,16,8161},{0,13,3986},{3,28,1619},{2,25,155},{3,18,69},{2,17,198},{8,2,5419},{0,22,2243},{0,17,145},{0,13,2386},{13,2,5419},{0,13,2386},{1,26,932},{1,26,932},{1,26,932},{1,16,936},{0,22,1154},{0,17,109},{0,17,109},{0,10,145},{0,11,2441},{0,9,1001},{3,19,50}, +{3,19,50},{3,19,50},{3,14,49},{5,5,1152},{0,17,109},{0,17,109},{0,10,145},{5,7,1152},{0,10,145},{11,0,1568},{0,29,10},{3,18,20},{0,18,8},{11,0,1568},{13,7,1568},{0,18,8},{0,14,1586},{13,7,1568},{0,14,1586},{1,0,932},{1,0,932},{1,0,932},{1,0,932},{0,14,1},{0,14,1},{0,14,1},{0,8,1},{0,6,468},{0,6,468},{2,31,3146},{2,27,1412},{2,19,1743}, +{1,19,1441},{0,31,5515},{0,23,2096},{0,19,69},{0,14,2251},{0,18,8669},{0,14,4100},{3,31,1569},{3,25,131},{3,19,86},{3,18,181},{3,23,5419},{0,23,2096},{0,19,69},{0,14,2251},{11,6,5419},{0,14,2251},{2,25,1379},{2,25,1379},{2,25,1379},{2,17,1379},{0,24,1152},{0,18,61},{0,18,61},{0,11,100},{0,12,2859},{0,10,1157},{3,22,1},{3,22,1},{3,22,1},{3,16,5},{7,1,1152}, +{0,18,61},{0,18,61},{0,11,100},{10,2,1152},{0,11,100},{10,6,1568},{1,29,2},{4,19,5},{0,19,5},{10,6,1568},{15,6,1568},{0,19,5},{0,15,1586},{15,6,1568},{0,15,1586},{2,0,1378},{2,0,1378},{2,0,1378},{2,0,1378},{0,16,1},{0,16,1},{0,16,1},{0,10,1},{0,8,657},{0,8,657},{2,31,3802},{2,29,1603},{2,21,2148},{2,19,1631},{1,31,5655},{0,25,2005},{0,20,31}, +{0,15,2138},{0,19,8963},{0,15,4070},{4,30,1634},{3,27,155},{4,20,82},{3,19,198},{9,4,5419},{0,25,2001},{0,20,27},{0,15,2134},{9,10,5419},{0,15,2134},{2,28,1587},{2,28,1587},{2,28,1587},{2,18,1590},{0,27,1158},{0,20,22},{0,20,22},{0,12,62},{0,14,3075},{0,11,1221},{4,21,64},{4,21,64},{4,21,64},{4,16,65},{5,10,1152},{0,20,18},{0,20,18},{0,12,58},{12,1,1152}, +{0,12,58},{12,2,1568},{1,31,10},{4,20,18},{0,20,18},{12,2,1568},{13,10,1568},{0,20,18},{0,16,1576},{13,10,1568},{0,16,1576},{2,0,1586},{2,0,1586},{2,0,1586},{2,0,1586},{0,19,4},{0,19,4},{0,19,4},{0,11,8},{0,9,769},{0,9,769},{3,31,3890},{2,31,1623},{3,21,2180},{2,20,1644},{1,31,5863},{0,27,1989},{1,21,109},{0,17,2117},{0,21,8560},{0,16,3545},{4,31,1640}, +{4,27,149},{4,21,73},{4,20,194},{10,3,5419},{0,27,1889},{0,21,49},{0,17,2017},{11,9,5419},{0,17,2017},{2,30,1619},{2,30,1619},{2,30,1619},{2,20,1619},{1,26,1188},{1,20,86},{1,20,86},{1,13,121},{0,16,2801},{0,13,949},{4,24,1},{4,24,1},{4,24,1},{4,17,4},{8,1,1152},{0,22,2},{0,22,2},{0,14,26},{10,5,1152},{0,14,26},{11,8,1568},{2,31,5},{5,21,13}, +{1,21,9},{11,8,1568},{11,14,1568},{1,21,9},{0,17,1576},{11,14,1568},{0,17,1576},{2,0,1618},{2,0,1618},{2,0,1618},{2,0,1618},{1,18,37},{1,18,37},{1,18,37},{1,12,37},{0,10,625},{0,10,625},{4,31,4308},{3,31,1589},{3,23,2160},{3,21,1621},{2,31,5895},{1,27,1999},{1,22,33},{1,18,2124},{0,23,8196},{0,17,3043},{5,31,1667},{4,29,155},{5,22,69},{4,21,198},{10,6,5419}, +{0,29,1772},{1,22,24},{0,18,1875},{15,6,5419},{0,18,1875},{3,30,1576},{3,30,1576},{3,30,1576},{3,20,1580},{1,29,1161},{1,22,29},{1,22,29},{1,15,58},{0,17,2529},{0,14,656},{5,23,50},{5,23,50},{5,23,50},{5,18,49},{8,4,1152},{0,24,1},{0,24,1},{0,15,1},{14,2,1152},{0,15,1},{13,4,1568},{3,31,13},{5,22,20},{2,22,8},{13,4,1568},{15,11,1568},{2,22,8}, +{0,18,1586},{15,11,1568},{0,18,1586},{3,0,1576},{3,0,1576},{3,0,1576},{3,0,1576},{1,21,10},{1,21,10},{1,21,10},{1,14,13},{0,12,520},{0,12,520},{4,31,4436},{3,31,1765},{4,23,2175},{3,23,1669},{3,31,6079},{1,29,1977},{2,23,105},{1,19,2107},{0,24,7969},{0,18,2675},{6,31,1832},{5,29,131},{5,23,86},{5,22,181},{12,2,5419},{0,30,1699},{1,23,62},{0,19,1782},{13,10,5419}, +{0,19,1782},{3,31,1665},{3,31,1665},{3,31,1665},{3,22,1640},{2,28,1188},{2,22,97},{2,22,97},{2,15,136},{0,19,2313},{0,15,474},{5,26,1},{5,26,1},{5,26,1},{5,20,5},{3,25,1152},{1,24,5},{1,24,5},{0,16,2},{12,6,1152},{0,16,2},{15,0,1568},{4,31,34},{6,23,5},{2,23,5},{15,0,1568},{12,16,1568},{2,23,5},{0,19,1586},{12,16,1568},{0,19,1586},{3,0,1640}, +{3,0,1640},{3,0,1640},{3,0,1640},{2,20,37},{2,20,37},{2,20,37},{2,14,37},{0,14,400},{0,14,400},{5,31,4740},{4,31,1716},{4,25,2148},{4,23,1631},{3,31,6351},{2,29,2005},{2,24,31},{2,19,2138},{0,26,7669},{0,19,2375},{6,31,1832},{5,31,155},{6,24,82},{5,23,198},{11,8,5419},{0,31,1712},{2,24,27},{0,20,1720},{11,14,5419},{0,20,1720},{4,31,1595},{4,31,1595},{4,31,1595}, +{4,22,1590},{2,31,1158},{2,24,22},{2,24,22},{2,16,62},{0,21,2091},{0,17,306},{6,25,64},{6,25,64},{6,25,64},{6,20,65},{9,6,1152},{1,26,1},{1,26,1},{1,17,5},{14,5,1152},{1,17,5},{14,6,1568},{5,31,74},{6,24,18},{2,24,18},{14,6,1568},{15,14,1568},{2,24,18},{0,20,1576},{15,14,1568},{0,20,1576},{4,0,1586},{4,0,1586},{4,0,1586},{4,0,1586},{2,23,4}, +{2,23,4},{2,23,4},{2,15,8},{0,16,277},{0,16,277},{5,31,5060},{5,31,1980},{5,25,2180},{4,24,1644},{4,31,6508},{2,31,1989},{3,25,109},{2,21,2117},{0,28,7364},{0,21,2098},{7,31,1952},{6,31,149},{6,25,73},{6,24,194},{12,7,5419},{1,31,1804},{2,25,49},{0,21,1657},{13,13,5419},{0,21,1657},{4,31,1739},{4,31,1739},{4,31,1739},{4,24,1619},{3,30,1188},{3,24,86},{3,24,86}, +{3,17,121},{0,22,1928},{0,18,194},{6,28,1},{6,28,1},{6,28,1},{6,21,4},{10,5,1152},{2,26,2},{2,26,2},{1,18,2},{12,9,1152},{1,18,2},{13,12,1568},{6,31,149},{7,25,13},{3,25,9},{13,12,1568},{13,18,1568},{3,25,9},{0,21,1576},{13,18,1568},{0,21,1576},{4,0,1618},{4,0,1618},{4,0,1618},{4,0,1618},{3,22,37},{3,22,37},{3,22,37},{3,16,37},{0,18,193}, +{0,18,193},{6,31,5316},{5,31,2160},{5,27,2160},{5,25,1621},{5,31,6800},{3,31,1999},{3,26,33},{3,22,2124},{0,29,7068},{0,22,1836},{7,31,2195},{7,31,270},{7,26,69},{6,25,198},{15,0,5419},{2,31,1970},{3,26,24},{0,22,1611},{12,16,5419},{0,22,1611},{5,31,1676},{5,31,1676},{5,31,1676},{5,24,1580},{3,31,1233},{3,26,29},{3,26,29},{3,19,58},{0,24,1798},{0,19,157},{7,27,50}, +{7,27,50},{7,27,50},{7,22,49},{10,8,1152},{2,28,1},{2,28,1},{2,19,1},{11,12,1152},{2,19,1},{15,8,1568},{7,31,221},{7,26,20},{4,26,8},{15,8,1568},{11,22,1568},{4,26,8},{0,22,1586},{11,22,1568},{0,22,1586},{5,0,1576},{5,0,1576},{5,0,1576},{5,0,1576},{3,25,10},{3,25,10},{3,25,10},{3,18,13},{0,20,106},{0,20,106},{6,31,5828},{6,31,2435},{6,27,2175}, +{5,27,1669},{5,31,7184},{4,31,2132},{4,27,105},{3,23,2107},{0,31,6820},{0,23,1690},{8,31,2306},{7,31,334},{7,27,86},{7,26,181},{14,6,5419},{4,31,2096},{3,27,62},{0,23,1590},{15,14,5419},{0,23,1590},{6,31,1859},{6,31,1859},{6,31,1859},{5,26,1640},{4,31,1220},{4,26,97},{4,26,97},{4,19,136},{0,26,1650},{0,21,161},{7,30,1},{7,30,1},{7,30,1},{7,24,5},{9,14,1152}, +{3,28,5},{3,28,5},{2,20,2},{14,10,1152},{2,20,2},{14,14,1568},{7,31,333},{8,27,40},{4,27,5},{14,14,1568},{14,20,1568},{4,27,5},{0,23,1586},{14,20,1568},{0,23,1586},{5,0,1640},{5,0,1640},{5,0,1640},{5,0,1640},{4,24,37},{4,24,37},{4,24,37},{4,18,37},{0,22,58},{0,22,58},{7,31,6036},{6,31,2835},{6,29,2148},{6,27,1631},{6,31,7316},{4,31,2228},{4,28,31}, +{4,23,2138},{0,31,6884},{0,24,1613},{8,31,2402},{8,31,666},{8,28,269},{7,27,198},{13,12,5419},{4,31,2224},{4,28,27},{0,24,1577},{13,18,5419},{0,24,1577},{6,31,1811},{6,31,1811},{6,31,1811},{6,26,1590},{5,31,1356},{4,28,22},{4,28,22},{4,20,62},{0,28,1508},{1,21,137},{7,31,106},{7,31,106},{7,31,106},{7,25,82},{11,10,1152},{3,30,1},{3,30,1},{3,21,5},{5,23,1152}, +{3,21,5},{13,20,1568},{8,31,410},{8,28,13},{4,28,18},{13,20,1568},{13,23,1570},{4,28,18},{0,24,1576},{13,23,1570},{0,24,1576},{6,0,1586},{6,0,1586},{6,0,1586},{6,0,1586},{4,27,4},{4,27,4},{4,27,4},{4,19,8},{0,24,37},{0,24,37},{7,31,6740},{7,31,3135},{7,29,2180},{6,28,1644},{7,31,7676},{5,31,2448},{5,29,109},{4,25,2117},{1,31,7196},{0,25,1593},{9,31,2594}, +{8,31,698},{8,29,82},{8,28,345},{14,11,5419},{5,31,2412},{4,29,49},{1,25,1580},{15,17,5419},{1,25,1580},{7,31,1979},{7,31,1979},{7,31,1979},{6,28,1619},{5,31,1388},{5,28,86},{5,28,86},{5,21,121},{0,30,1416},{1,23,161},{8,30,64},{8,30,64},{8,30,64},{8,25,65},{12,9,1152},{4,30,2},{4,30,2},{3,22,2},{14,13,1152},{3,22,2},{15,16,1568},{9,31,530},{8,29,18}, +{5,29,9},{15,16,1568},{15,22,1568},{5,29,9},{0,25,1576},{15,22,1568},{0,25,1576},{6,0,1618},{6,0,1618},{6,0,1618},{6,0,1618},{5,26,37},{5,26,37},{5,26,37},{5,20,37},{0,25,17},{0,25,17},{8,31,6906},{7,31,3909},{7,31,2160},{7,29,1621},{7,31,8144},{6,31,2902},{5,30,33},{5,26,2124},{2,31,7661},{1,26,1615},{9,31,2945},{9,31,1025},{8,30,86},{8,29,181},{14,14,5419}, +{7,31,2694},{5,30,24},{1,26,1590},{14,20,5419},{1,26,1590},{7,31,2060},{7,31,2060},{7,31,2060},{7,28,1580},{6,31,1476},{5,30,29},{5,30,29},{5,23,58},{0,31,1324},{2,23,157},{8,31,37},{8,31,37},{8,31,37},{8,27,5},{15,2,1152},{5,30,20},{5,30,20},{4,23,1},{13,16,1152},{4,23,1},{15,19,1568},{10,31,637},{9,30,5},{6,30,8},{15,19,1568},{13,26,1568},{6,30,8}, +{0,26,1586},{13,26,1568},{0,26,1586},{7,0,1576},{7,0,1576},{7,0,1576},{7,0,1576},{5,29,10},{5,29,10},{5,29,10},{5,22,13},{0,28,10},{0,28,10},{8,31,7386},{8,31,4250},{8,31,2490},{7,31,1669},{8,31,8461},{6,31,3350},{6,31,105},{5,27,2107},{4,31,8004},{1,27,1611},{10,31,3112},{9,31,1361},{9,31,69},{8,30,198},{13,20,5419},{7,31,2950},{5,31,62},{2,27,1590},{11,25,5420}, +{2,27,1590},{8,31,2486},{8,31,2486},{8,31,2486},{7,30,1640},{6,31,1700},{6,30,97},{6,30,97},{6,23,136},{1,31,1424},{2,25,161},{9,31,65},{9,31,65},{9,31,65},{9,27,49},{11,18,1152},{5,31,58},{5,31,58},{4,24,2},{10,21,1152},{4,24,2},{13,28,1568},{11,31,785},{9,31,20},{6,31,5},{13,28,1568},{11,30,1568},{6,31,5},{0,27,1586},{11,30,1568},{0,27,1586},{7,0,1640}, +{7,0,1640},{7,0,1640},{7,0,1640},{6,28,37},{6,28,37},{6,28,37},{6,22,37},{1,28,10},{1,28,10},{9,31,7014},{8,31,4230},{8,31,2294},{8,31,1846},{8,31,7865},{7,31,3114},{6,31,85},{6,27,1706},{4,31,7436},{2,28,1289},{11,31,2852},{10,31,1221},{9,31,145},{9,30,114},{13,22,4803},{8,31,2648},{6,31,81},{2,28,1253},{12,25,4803},{2,28,1253},{8,31,2294},{8,31,2294},{8,31,2294}, +{8,30,1811},{7,31,1740},{6,31,85},{6,31,85},{6,24,62},{2,31,1577},{3,25,137},{9,31,145},{9,31,145},{9,31,145},{9,29,5},{13,14,1152},{6,31,81},{6,31,81},{5,25,5},{8,25,1152},{5,25,5},{15,23,1250},{11,31,689},{10,31,4},{7,31,9},{15,23,1250},{11,31,1250},{7,31,9},{0,28,1252},{11,31,1250},{0,28,1252},{8,0,1810},{8,0,1810},{8,0,1810},{8,0,1810},{6,31,4}, +{6,31,4},{6,31,4},{6,23,8},{1,29,8},{1,29,8},{9,31,6534},{9,31,4134},{8,31,2486},{8,31,1590},{9,31,7237},{7,31,2970},{7,31,161},{6,28,1256},{5,31,6748},{2,29,949},{11,31,2340},{10,31,1125},{10,31,164},{9,31,97},{15,17,4056},{9,31,2244},{7,31,125},{3,28,909},{12,26,4056},{3,28,909},{8,31,2486},{8,31,2486},{8,31,2486},{8,31,1590},{7,31,2156},{7,31,161},{7,31,161}, +{7,25,121},{3,31,1729},{3,27,161},{10,31,164},{10,31,164},{10,31,164},{10,29,65},{14,13,1152},{7,31,125},{7,31,125},{5,26,2},{11,23,1152},{5,26,2},{13,31,882},{12,31,482},{11,31,0},{8,31,4},{13,31,882},{15,27,882},{8,31,4},{0,28,900},{15,27,882},{0,28,900},{8,0,1586},{8,0,1586},{8,0,1586},{8,0,1586},{7,30,37},{7,30,37},{7,30,37},{7,24,37},{1,31,16}, +{1,31,16},{10,31,6091},{9,31,4053},{9,31,2609},{8,31,1761},{9,31,6490},{8,31,2622},{7,31,458},{7,28,835},{6,31,6162},{3,29,598},{12,31,1989},{11,31,931},{11,31,306},{10,31,5},{15,19,3318},{10,31,1806},{8,31,202},{4,29,545},{13,26,3318},{4,29,545},{9,31,2609},{9,31,2609},{9,31,2609},{8,31,1761},{8,31,2086},{7,31,458},{7,31,458},{7,27,58},{4,31,1868},{4,27,157},{11,31,306}, +{11,31,306},{11,31,306},{10,31,5},{14,16,1152},{8,31,202},{8,31,202},{6,27,1},{15,20,1152},{6,27,1},{15,26,545},{13,31,313},{12,31,4},{10,31,4},{15,26,545},{14,29,545},{10,31,4},{0,29,545},{14,29,545},{0,29,545},{8,0,1640},{8,0,1640},{8,0,1640},{8,0,1640},{7,31,58},{7,31,58},{7,31,58},{7,26,13},{2,31,13},{2,31,13},{10,31,5723},{10,31,3980},{9,31,2945}, +{9,31,1745},{10,31,6083},{8,31,2494},{8,31,558},{7,29,558},{7,31,5674},{4,30,411},{12,31,1573},{11,31,963},{11,31,338},{11,31,49},{13,27,2753},{10,31,1438},{9,31,290},{5,29,341},{13,27,2753},{5,29,341},{9,31,2945},{9,31,2945},{9,31,2945},{9,31,1745},{9,31,2390},{8,31,558},{8,31,558},{7,28,147},{5,31,2064},{4,29,161},{11,31,338},{11,31,338},{11,31,338},{11,31,49},{13,22,1152}, +{9,31,290},{9,31,290},{6,28,2},{12,25,1152},{6,28,2},{15,27,313},{13,31,185},{13,31,16},{11,31,0},{15,27,313},{13,31,313},{11,31,0},{0,29,337},{13,31,313},{0,29,337},{9,0,1576},{9,0,1576},{9,0,1576},{9,0,1576},{8,31,197},{8,31,197},{8,31,197},{7,27,122},{3,31,25},{3,31,25},{11,31,5415},{10,31,3996},{10,31,3035},{10,31,2006},{10,31,5619},{9,31,2378},{8,31,814}, +{8,29,414},{7,31,5338},{5,30,251},{12,31,1413},{12,31,813},{12,31,452},{11,31,65},{13,29,2273},{11,31,1218},{10,31,365},{6,30,146},{14,27,2273},{6,30,146},{10,31,3035},{10,31,3035},{10,31,3035},{10,31,2006},{9,31,2518},{8,31,814},{8,31,814},{8,28,121},{6,31,2329},{5,29,137},{12,31,452},{12,31,452},{12,31,452},{11,31,65},{15,18,1152},{10,31,365},{10,31,365},{7,29,5},{10,29,1152}, +{7,29,5},{15,28,145},{14,31,85},{13,31,16},{12,31,4},{15,28,145},{15,29,149},{12,31,4},{0,30,145},{15,29,149},{0,30,145},{9,0,1640},{9,0,1640},{9,0,1640},{9,0,1640},{8,31,85},{8,31,85},{8,31,85},{8,27,37},{4,31,40},{4,31,40},{11,31,5143},{11,31,4004},{11,31,3379},{10,31,2070},{11,31,5287},{10,31,2431},{9,31,1062},{8,30,133},{8,31,5011},{5,31,161},{13,31,1161}, +{13,31,889},{12,31,548},{12,31,164},{15,24,1878},{11,31,1106},{11,31,481},{7,30,66},{15,27,1881},{7,30,66},{11,31,3379},{11,31,3379},{11,31,3379},{10,31,2070},{10,31,2835},{9,31,1062},{9,31,1062},{8,29,62},{7,31,2577},{5,31,161},{12,31,548},{12,31,548},{12,31,548},{12,31,164},{13,27,1152},{11,31,481},{11,31,481},{7,30,2},{13,27,1152},{7,30,2},{15,29,45},{14,31,37},{14,31,1}, +{14,31,9},{15,29,45},{15,30,41},{14,31,9},{0,30,65},{15,30,41},{0,30,65},{10,0,1586},{10,0,1586},{10,0,1586},{10,0,1586},{9,31,221},{9,31,221},{9,31,221},{8,28,8},{5,31,80},{5,31,80},{12,31,4948},{11,31,4157},{11,31,3532},{11,31,2393},{11,31,5008},{10,31,2422},{10,31,1461},{9,31,125},{9,31,4752},{6,31,157},{13,31,1107},{13,31,835},{13,31,666},{12,31,362},{15,26,1536}, +{12,31,1011},{12,31,650},{8,31,16},{14,29,1536},{8,31,16},{11,31,3532},{11,31,3532},{11,31,3532},{11,31,2393},{10,31,3204},{10,31,1461},{10,31,1461},{9,30,114},{8,31,2976},{6,31,157},{13,31,666},{13,31,666},{13,31,666},{12,31,362},{13,30,1152},{12,31,650},{12,31,650},{8,31,16},{12,30,1152},{8,31,16},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0}, +{0,31,0},{15,31,0},{0,31,0},{10,0,1640},{10,0,1640},{10,0,1640},{10,0,1640},{9,31,221},{9,31,221},{9,31,221},{9,29,25},{6,31,157},{6,31,157},{12,31,4212},{12,31,3612},{12,31,3251},{11,31,2201},{12,31,4212},{11,31,2154},{10,31,1301},{9,31,13},{10,31,3939},{7,31,233},{14,31,776},{13,31,659},{13,31,490},{13,31,218},{15,27,1067},{13,31,699},{12,31,442},{9,31,4},{13,31,1067}, +{9,31,4},{12,31,3251},{12,31,3251},{12,31,3251},{11,31,2201},{11,31,2668},{10,31,1301},{10,31,1301},{9,31,13},{8,31,2528},{7,31,233},{13,31,490},{13,31,490},{13,31,490},{13,31,218},{15,25,802},{12,31,442},{12,31,442},{9,31,4},{15,27,802},{9,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{11,0,1576}, +{11,0,1576},{11,0,1576},{11,0,1576},{10,31,340},{10,31,340},{10,31,340},{9,31,13},{7,31,233},{7,31,233},{12,31,3732},{12,31,3132},{12,31,2771},{12,31,2171},{12,31,3444},{11,31,1834},{11,31,1209},{10,31,37},{10,31,3219},{8,31,400},{14,31,456},{14,31,392},{14,31,356},{13,31,170},{14,31,684},{13,31,459},{13,31,290},{10,31,1},{14,30,683},{10,31,1},{12,31,2771},{12,31,2771},{12,31,2771}, +{12,31,2171},{11,31,2348},{11,31,1209},{11,31,1209},{10,31,37},{9,31,2156},{8,31,400},{14,31,356},{14,31,356},{14,31,356},{13,31,170},{15,26,512},{13,31,290},{13,31,290},{10,31,1},{14,29,512},{10,31,1},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{11,0,1640},{11,0,1640},{11,0,1640},{11,0,1640},{10,31,436}, +{10,31,436},{10,31,436},{10,31,37},{8,31,400},{8,31,400},{13,31,3172},{13,31,2900},{12,31,2547},{12,31,1947},{12,31,2932},{12,31,1732},{11,31,1145},{10,31,53},{11,31,2695},{8,31,464},{14,31,264},{14,31,200},{14,31,164},{14,31,100},{15,28,387},{14,31,268},{13,31,178},{11,31,1},{15,29,396},{11,31,1},{12,31,2547},{12,31,2547},{12,31,2547},{12,31,1947},{12,31,1971},{11,31,1145},{11,31,1145}, +{10,31,53},{10,31,1794},{8,31,464},{14,31,164},{14,31,164},{14,31,164},{14,31,100},{15,27,290},{13,31,178},{13,31,178},{11,31,1},{14,30,290},{11,31,1},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{12,0,1586},{12,0,1586},{12,0,1586},{12,0,1586},{11,31,520},{11,31,520},{11,31,520},{10,31,53},{8,31,464}, +{8,31,464},{0,23,2665},{0,18,680},{0,13,50},{0,11,785},{0,15,5885},{0,11,4118},{0,10,1800},{0,7,4202},{0,8,6546},{0,7,4643},{0,23,2665},{0,18,680},{0,13,50},{0,11,785},{3,5,5885},{0,11,4118},{0,10,1800},{0,7,4202},{0,9,5885},{0,7,4202},{0,11,0},{0,11,0},{0,11,0},{0,7,4},{0,5,549},{0,5,289},{0,5,289},{0,3,306},{0,3,630},{0,3,387},{0,11,0}, +{0,11,0},{0,11,0},{0,7,4},{1,2,545},{0,5,289},{0,5,289},{0,3,306},{2,1,545},{0,3,306},{6,3,2665},{0,18,680},{0,13,50},{0,11,785},{6,3,2665},{11,0,2665},{0,11,785},{0,8,2689},{11,0,2665},{0,8,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,25,2665},{0,20,521},{0,14,5}, +{0,12,625},{0,17,6669},{0,13,4529},{0,11,1890},{0,8,4610},{0,9,7494},{0,7,5171},{0,25,2665},{0,20,521},{0,14,5},{0,12,625},{3,7,6669},{0,13,4529},{0,11,1890},{0,8,4610},{8,0,6669},{0,8,4610},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{0,7,841},{0,6,445},{0,6,445},{0,4,464},{0,3,982},{0,3,595},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{2,0,841}, +{0,6,445},{0,6,445},{0,4,464},{1,3,841},{0,4,464},{7,2,2665},{0,20,521},{0,14,5},{0,12,625},{7,2,2665},{12,0,2665},{0,12,625},{0,9,2689},{12,0,2665},{0,9,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,28,2665},{0,22,405},{0,15,10},{0,13,514},{0,19,7541},{0,14,4934},{0,12,2042}, +{0,9,5045},{0,10,8546},{0,8,5682},{0,28,2665},{0,22,405},{0,15,10},{0,13,514},{5,2,7538},{0,14,4934},{0,12,2042},{0,9,5045},{8,1,7538},{0,9,5045},{0,16,0},{0,16,0},{0,16,0},{0,10,4},{0,8,1201},{0,7,637},{0,7,637},{0,4,656},{0,4,1385},{0,4,800},{0,16,0},{0,16,0},{0,16,0},{0,10,4},{1,5,1201},{0,7,637},{0,7,637},{0,4,656},{4,0,1201}, +{0,4,656},{6,8,2665},{0,22,405},{0,15,10},{0,13,514},{6,8,2665},{11,3,2665},{0,13,514},{0,10,2689},{11,3,2665},{0,10,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,30,2669},{0,23,313},{0,16,68},{0,15,410},{0,20,8498},{0,16,5330},{0,13,2210},{0,10,5530},{0,11,9702},{0,9,6270},{0,30,2669}, +{0,23,313},{0,16,68},{0,15,410},{4,7,8493},{0,16,5330},{0,13,2210},{0,10,5530},{8,2,8493},{0,10,5530},{0,19,1},{0,19,1},{0,19,1},{0,11,1},{0,9,1629},{0,8,832},{0,8,832},{0,5,881},{0,5,1874},{0,5,1106},{0,19,1},{0,19,1},{0,19,1},{0,11,1},{2,3,1625},{0,8,832},{0,8,832},{0,5,881},{4,1,1625},{0,5,881},{8,2,2665},{0,23,313},{1,16,8}, +{0,15,410},{8,2,2665},{14,1,2665},{0,15,410},{0,11,2689},{14,1,2665},{0,11,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,31,2777},{0,26,232},{0,17,197},{0,16,305},{0,22,9674},{0,17,5849},{0,14,2450},{0,10,6106},{0,12,11199},{0,10,7006},{0,31,2777},{0,26,232},{0,17,197},{0,16,305},{1,19,9669}, +{0,17,5849},{0,14,2450},{0,10,6106},{9,2,9669},{0,10,6106},{0,22,1},{0,22,1},{0,22,1},{0,13,0},{0,11,2178},{0,10,1125},{0,10,1125},{0,6,1189},{0,6,2520},{0,5,1475},{0,22,1},{0,22,1},{0,22,1},{0,13,0},{3,1,2178},{0,10,1125},{0,10,1125},{0,6,1189},{3,3,2178},{0,6,1189},{9,2,2665},{0,26,232},{1,17,17},{0,16,305},{9,2,2665},{13,4,2665},{0,16,305}, +{0,12,2689},{13,4,2665},{0,12,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,31,3045},{0,28,217},{0,19,401},{0,17,282},{0,25,9670},{0,19,5529},{0,16,1970},{0,12,5738},{0,13,11589},{0,11,6898},{1,31,2789},{0,28,217},{1,18,146},{0,17,282},{5,8,9669},{0,19,5529},{0,16,1970},{0,12,5738},{4,10,9669}, +{0,12,5738},{0,24,64},{0,24,64},{0,24,64},{0,15,68},{0,13,2180},{0,11,949},{0,11,949},{0,7,1018},{0,7,2691},{0,6,1433},{1,21,64},{1,21,64},{1,21,64},{1,13,68},{4,0,2178},{0,11,949},{0,11,949},{0,7,1018},{1,7,2178},{0,7,1018},{10,1,2665},{0,28,153},{2,18,5},{0,17,218},{10,1,2665},{15,3,2665},{0,17,218},{0,13,2689},{15,3,2665},{0,13,2689},{0,0,64}, +{0,0,64},{0,0,64},{0,0,64},{0,3,1},{0,3,1},{0,3,1},{0,2,4},{0,1,18},{0,1,18},{1,31,3285},{0,29,341},{1,19,453},{0,18,405},{0,27,9674},{0,20,5170},{0,17,1546},{0,13,5429},{0,15,11993},{0,12,6819},{2,31,2966},{1,28,221},{1,19,197},{1,18,305},{7,4,9669},{0,20,5170},{0,17,1546},{0,13,5429},{9,5,9669},{0,13,5429},{0,27,257},{0,27,257},{0,27,257}, +{1,15,256},{0,16,2178},{0,13,832},{0,13,832},{0,8,881},{0,8,2882},{0,7,1427},{1,23,4},{1,23,4},{1,23,4},{1,15,0},{3,6,2178},{0,13,832},{0,13,832},{0,8,881},{3,6,2178},{0,8,881},{11,0,2665},{0,29,85},{2,19,10},{0,18,149},{11,0,2665},{13,7,2665},{0,18,149},{0,14,2689},{13,7,2665},{0,14,2689},{0,0,256},{0,0,256},{0,0,256},{0,0,256},{0,5,1}, +{0,5,1},{0,5,1},{0,3,1},{0,2,72},{0,2,72},{1,31,3909},{1,29,465},{1,21,676},{1,19,538},{0,30,9669},{0,22,4878},{0,18,1190},{0,14,5138},{0,16,12390},{0,13,6789},{2,31,2966},{1,29,209},{2,20,149},{1,19,282},{6,10,9669},{0,22,4878},{0,18,1190},{0,14,5138},{12,3,9669},{0,14,5138},{1,26,320},{1,26,320},{1,26,320},{1,16,324},{0,19,2180},{0,15,680},{0,15,680}, +{0,9,740},{0,9,3149},{0,8,1441},{1,26,64},{1,26,64},{1,26,64},{1,16,68},{5,2,2178},{0,15,680},{0,15,680},{0,9,740},{8,1,2178},{0,9,740},{11,3,2665},{0,31,41},{3,20,8},{0,19,98},{11,3,2665},{15,6,2665},{0,19,98},{0,15,2689},{15,6,2665},{0,15,2689},{1,0,320},{1,0,320},{1,0,320},{1,0,320},{0,8,0},{0,8,0},{0,8,0},{0,5,1},{0,4,160}, +{0,4,160},{2,31,4514},{1,31,630},{1,22,1110},{1,20,694},{0,31,9789},{0,23,4646},{0,20,849},{0,15,4826},{0,18,12955},{0,14,6798},{3,31,3101},{2,30,232},{2,21,197},{2,20,305},{3,23,9669},{0,23,4646},{0,20,849},{0,15,4826},{11,6,9669},{0,15,4826},{1,29,545},{1,29,545},{1,29,545},{1,18,546},{0,22,2180},{0,17,505},{0,17,505},{0,11,610},{0,11,3467},{0,10,1513},{2,26,1}, +{2,26,1},{2,26,1},{2,17,0},{5,5,2178},{0,17,505},{0,17,505},{0,11,610},{5,7,2178},{0,11,610},{11,6,2665},{1,31,85},{3,21,17},{0,20,65},{11,6,2665},{15,8,2665},{0,20,65},{0,16,2689},{15,8,2665},{0,16,2689},{1,0,545},{1,0,545},{1,0,545},{1,0,545},{0,11,0},{0,11,0},{0,11,0},{0,7,4},{0,5,289},{0,5,289},{2,31,5330},{1,31,1110},{2,23,1490}, +{1,21,979},{1,31,9981},{0,26,4406},{0,21,579},{0,16,4610},{0,19,13489},{0,15,6846},{3,31,3341},{2,31,226},{3,22,146},{2,21,282},{9,4,9669},{0,26,4406},{0,21,579},{0,16,4610},{9,10,9669},{0,16,4610},{1,31,885},{1,31,885},{1,31,885},{1,20,885},{0,24,2178},{0,19,389},{0,19,389},{0,12,464},{0,12,3885},{0,11,1603},{3,25,64},{3,25,64},{3,25,64},{3,17,68},{7,1,2178}, +{0,19,389},{0,19,389},{0,12,464},{10,2,2178},{0,12,464},{13,2,2665},{2,31,162},{4,22,5},{0,22,37},{13,2,2665},{12,13,2665},{0,22,37},{0,17,2689},{12,13,2665},{0,17,2689},{1,0,881},{1,0,881},{1,0,881},{1,0,881},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{0,6,445},{0,6,445},{3,31,6366},{2,31,1635},{2,24,1886},{1,22,1410},{1,31,10381},{0,28,4146},{0,22,377}, +{0,17,4373},{0,20,14006},{0,16,6915},{4,31,3434},{3,31,242},{3,23,197},{3,22,305},{10,3,9669},{0,28,4146},{0,22,377},{0,17,4373},{11,9,9669},{0,17,4373},{2,31,1346},{2,31,1346},{2,31,1346},{2,20,1345},{0,27,2180},{0,21,274},{0,21,274},{0,13,353},{0,14,4269},{0,11,1763},{3,27,4},{3,27,4},{3,27,4},{3,19,0},{5,10,2178},{0,21,274},{0,21,274},{0,13,353},{12,1,2178}, +{0,13,353},{14,1,2665},{3,31,242},{4,23,10},{0,23,10},{14,1,2665},{15,11,2665},{0,23,10},{0,18,2689},{15,11,2665},{0,18,2689},{1,0,1345},{1,0,1345},{1,0,1345},{1,0,1345},{0,16,0},{0,16,0},{0,16,0},{0,10,4},{0,7,637},{0,7,637},{3,31,7374},{2,31,2339},{2,25,2441},{2,23,1763},{2,31,11019},{0,29,3909},{0,23,243},{0,18,4154},{0,22,14614},{0,17,7029},{5,31,3654}, +{4,31,394},{4,24,149},{3,23,282},{9,9,9669},{0,29,3909},{0,23,243},{0,18,4154},{14,7,9669},{0,18,4154},{2,31,1714},{2,31,1714},{2,31,1714},{2,22,1669},{0,29,2180},{0,23,194},{0,23,194},{0,14,260},{0,15,4686},{0,13,1937},{3,30,64},{3,30,64},{3,30,64},{3,20,68},{8,1,2178},{0,23,194},{0,23,194},{0,14,260},{10,5,2178},{0,14,260},{15,0,2665},{4,31,313},{5,24,8}, +{0,24,4},{15,0,2665},{13,15,2665},{0,24,4},{0,19,2689},{13,15,2665},{0,19,2689},{2,0,1665},{2,0,1665},{2,0,1665},{2,0,1665},{0,19,1},{0,19,1},{0,19,1},{0,11,1},{0,8,832},{0,8,832},{3,31,8967},{3,31,3510},{3,26,3255},{2,24,2243},{2,31,11766},{0,31,3686},{0,25,138},{0,19,3938},{0,23,15369},{0,18,7206},{5,31,3933},{4,31,457},{4,25,197},{4,24,305},{12,2,9669}, +{0,31,3686},{0,25,138},{0,19,3938},{13,10,9669},{0,19,3938},{2,31,2434},{2,31,2434},{2,31,2434},{2,23,2182},{0,31,2210},{0,25,137},{0,25,137},{0,15,181},{0,16,5157},{0,14,2163},{4,30,1},{4,30,1},{4,30,1},{4,21,0},{8,4,2178},{0,25,137},{0,25,137},{0,15,181},{14,2,2178},{0,15,181},{15,3,2665},{5,31,421},{5,25,17},{1,25,5},{15,3,2665},{12,18,2665},{1,25,5}, +{0,20,2689},{12,18,2665},{0,20,2689},{2,0,2178},{2,0,2178},{2,0,2178},{2,0,2178},{0,22,1},{0,22,1},{0,22,1},{0,13,0},{0,10,1125},{0,10,1125},{4,31,10234},{3,31,4421},{3,27,3739},{2,26,2742},{2,31,12773},{0,31,3719},{0,26,87},{0,20,3771},{0,25,16061},{0,19,7283},{6,31,4050},{5,31,629},{5,26,146},{4,25,282},{11,8,9669},{0,31,3718},{0,26,86},{0,20,3770},{11,14,9669}, +{0,20,3770},{3,31,3125},{3,31,3125},{3,31,3125},{2,25,2706},{1,31,2411},{0,26,86},{0,26,86},{0,16,129},{0,18,5544},{0,15,2318},{5,29,64},{5,29,64},{5,29,64},{5,21,68},{3,25,2178},{0,26,85},{0,26,85},{0,16,128},{12,6,2178},{0,16,128},{15,6,2665},{5,31,565},{6,26,5},{1,26,2},{15,6,2665},{14,17,2665},{1,26,2},{0,21,2689},{14,17,2665},{0,21,2689},{2,0,2705}, +{2,0,2705},{2,0,2705},{2,0,2705},{0,24,1},{0,24,1},{0,24,1},{0,15,5},{0,11,1348},{0,11,1348},{4,31,10874},{4,31,5018},{3,28,3750},{3,26,2754},{3,31,13045},{1,31,4003},{0,27,183},{0,21,3686},{0,27,15601},{0,20,6570},{7,31,4366},{5,31,965},{5,27,197},{5,26,305},{12,7,9669},{1,31,3954},{0,27,102},{0,21,3605},{13,13,9669},{0,21,3605},{3,31,3173},{3,31,3173},{3,31,3173}, +{3,25,2690},{1,31,2427},{0,28,113},{0,28,113},{0,17,170},{0,20,5170},{0,16,1856},{5,31,4},{5,31,4},{5,31,4},{5,23,0},{9,6,2178},{0,28,32},{0,28,32},{0,17,89},{14,5,2178},{0,17,89},{15,8,2665},{6,31,706},{6,27,10},{2,27,10},{15,8,2665},{12,21,2665},{2,27,10},{0,22,2689},{12,21,2665},{0,22,2689},{3,0,2689},{3,0,2689},{3,0,2689},{3,0,2689},{1,23,53}, +{1,23,53},{1,23,53},{1,15,49},{0,13,1217},{0,13,1217},{5,31,11278},{4,31,5402},{4,29,3753},{3,28,2745},{4,31,13566},{1,31,4403},{1,28,77},{0,22,3747},{0,28,15046},{0,21,5958},{7,31,4590},{6,31,1171},{6,28,149},{5,27,282},{14,3,9669},{2,31,4265},{1,28,76},{0,22,3458},{11,17,9669},{0,22,3458},{4,31,3377},{4,31,3377},{4,31,3377},{3,27,2706},{2,31,2532},{1,28,73},{1,28,73}, +{1,18,129},{0,21,4837},{0,17,1490},{6,31,82},{6,31,82},{6,31,82},{5,24,68},{10,5,2178},{0,30,8},{0,30,8},{0,19,49},{12,9,2178},{0,19,49},{15,11,2665},{7,31,850},{7,28,8},{2,28,4},{15,11,2665},{15,19,2665},{2,28,4},{0,23,2689},{15,19,2665},{0,23,2689},{3,0,2705},{3,0,2705},{3,0,2705},{3,0,2705},{1,26,1},{1,26,1},{1,26,1},{1,16,5},{0,14,1037}, +{0,14,1037},{6,31,11954},{5,31,6090},{4,30,3794},{4,28,2754},{5,31,14170},{2,31,4863},{2,29,187},{1,24,3689},{0,30,14558},{0,23,5274},{8,31,5030},{7,31,1556},{6,29,197},{6,28,305},{14,6,9669},{3,31,4594},{1,29,101},{0,24,3265},{15,14,9669},{0,24,3265},{4,31,3530},{4,31,3530},{4,31,3530},{4,27,2693},{2,31,2739},{1,30,134},{1,30,134},{1,19,197},{0,23,4506},{0,19,1109},{6,31,64}, +{6,31,64},{6,31,64},{6,25,0},{10,8,2178},{1,30,34},{1,30,34},{0,20,16},{11,12,2178},{0,20,16},{15,14,2665},{8,31,1053},{7,29,17},{3,29,5},{15,14,2665},{14,22,2665},{3,29,5},{0,24,2689},{14,22,2665},{0,24,2689},{4,0,2689},{4,0,2689},{4,0,2689},{4,0,2689},{2,26,50},{2,26,50},{2,26,50},{2,17,49},{0,16,818},{0,16,818},{6,31,12466},{5,31,6794},{5,31,3739}, +{4,30,2742},{5,31,14554},{3,31,5363},{2,30,87},{1,24,3737},{0,31,14190},{0,24,4785},{8,31,5158},{7,31,2036},{7,30,146},{6,29,282},{13,12,9669},{4,31,4806},{2,30,86},{0,25,3130},{13,18,9669},{0,25,3130},{5,31,3658},{5,31,3658},{5,31,3658},{4,29,2706},{3,31,2795},{2,30,86},{2,30,86},{2,20,129},{0,25,4315},{0,20,809},{7,31,100},{7,31,100},{7,31,100},{7,25,68},{9,14,2178}, +{1,31,68},{1,31,68},{0,21,1},{14,10,2178},{0,21,1},{13,23,2665},{9,31,1241},{8,30,50},{3,30,2},{13,23,2665},{11,27,2665},{3,30,2},{0,25,2689},{11,27,2665},{0,25,2689},{4,0,2705},{4,0,2705},{4,0,2705},{4,0,2705},{2,28,1},{2,28,1},{2,28,1},{2,19,5},{0,18,666},{0,18,666},{7,31,13094},{6,31,7445},{5,31,3915},{5,30,2754},{6,31,14998},{4,31,5926},{2,31,183}, +{2,25,3686},{0,31,14254},{0,25,4323},{9,31,5546},{8,31,2478},{7,31,197},{7,30,305},{14,11,9669},{5,31,5138},{2,31,102},{0,26,3013},{15,17,9669},{0,26,3013},{5,31,3914},{5,31,3914},{5,31,3914},{5,29,2690},{4,31,3042},{2,31,182},{2,31,182},{2,21,170},{0,27,4059},{0,21,597},{7,31,196},{7,31,196},{7,31,196},{7,27,0},{11,10,2178},{2,31,101},{2,31,101},{0,22,4},{5,23,2178}, +{0,22,4},{15,19,2665},{10,31,1384},{8,31,5},{4,31,10},{15,19,2665},{14,25,2665},{4,31,10},{0,26,2689},{14,25,2665},{0,26,2689},{5,0,2689},{5,0,2689},{5,0,2689},{5,0,2689},{3,27,53},{3,27,53},{3,27,53},{3,19,49},{0,20,505},{0,20,505},{7,31,12517},{6,31,7482},{6,31,4001},{5,31,2706},{6,31,14185},{4,31,5491},{3,31,154},{2,26,3124},{0,31,13437},{0,26,3306},{9,31,4949}, +{8,31,2261},{8,31,325},{7,30,192},{14,13,8712},{6,31,4686},{3,31,153},{0,27,2403},{11,23,8712},{0,27,2403},{6,31,4001},{6,31,4001},{6,31,4001},{5,31,2706},{4,31,3234},{3,31,154},{3,31,154},{3,22,129},{0,28,3762},{0,23,425},{8,31,325},{8,31,325},{8,31,325},{7,28,68},{12,9,2178},{3,31,153},{3,31,153},{1,23,1},{14,13,2178},{1,23,1},{13,27,2178},{10,31,1157},{9,31,16}, +{5,31,1},{13,27,2178},{13,27,2178},{5,31,1},{0,27,2178},{13,27,2178},{0,27,2178},{5,0,2705},{5,0,2705},{5,0,2705},{5,0,2705},{3,30,1},{3,30,1},{3,30,1},{3,20,5},{0,22,389},{0,22,389},{8,31,12034},{7,31,7195},{6,31,4370},{6,31,2693},{7,31,13066},{5,31,5014},{4,31,261},{3,27,2390},{1,31,12394},{0,27,2277},{10,31,4410},{9,31,2045},{8,31,289},{8,30,192},{14,15,7578}, +{7,31,4050},{4,31,212},{0,27,1701},{12,23,7578},{0,27,1701},{6,31,4370},{6,31,4370},{6,31,4370},{6,31,2693},{5,31,3429},{4,31,261},{4,31,261},{3,23,197},{0,30,3509},{0,24,306},{8,31,289},{8,31,289},{8,31,289},{8,28,68},{15,2,2178},{4,31,212},{4,31,212},{1,24,9},{13,16,2178},{1,24,9},{15,22,1625},{11,31,850},{9,31,25},{6,31,4},{15,22,1625},{13,28,1625},{6,31,4}, +{0,27,1665},{13,28,1625},{0,27,1665},{6,0,2689},{6,0,2689},{6,0,2689},{6,0,2689},{4,30,50},{4,30,50},{4,30,50},{4,21,49},{0,24,306},{0,24,306},{8,31,11042},{7,31,7259},{7,31,4450},{6,31,2805},{7,31,12298},{5,31,4742},{4,31,501},{4,27,1875},{2,31,11643},{0,28,1578},{10,31,3802},{9,31,1869},{9,31,425},{8,31,25},{13,20,6661},{7,31,3554},{5,31,292},{0,28,1217},{13,23,6662}, +{0,28,1217},{7,31,4450},{7,31,4450},{7,31,4450},{6,31,2805},{6,31,3714},{4,31,501},{4,31,501},{4,24,129},{0,31,3354},{0,25,244},{9,31,425},{9,31,425},{9,31,425},{8,30,0},{11,18,2178},{5,31,292},{5,31,292},{2,25,1},{10,21,2178},{2,25,1},{15,23,1201},{11,31,674},{10,31,9},{7,31,16},{15,23,1201},{12,30,1201},{7,31,16},{0,28,1201},{12,30,1201},{0,28,1201},{6,0,2705}, +{6,0,2705},{6,0,2705},{6,0,2705},{4,31,17},{4,31,17},{4,31,17},{4,23,5},{0,26,218},{0,26,218},{8,31,10434},{8,31,7186},{7,31,4898},{7,31,2833},{8,31,11595},{6,31,4462},{5,31,629},{4,28,1387},{3,31,10895},{0,28,1002},{11,31,3446},{10,31,1707},{9,31,505},{8,31,73},{13,22,5829},{8,31,3170},{6,31,405},{1,28,869},{12,25,5829},{1,28,869},{7,31,4898},{7,31,4898},{7,31,4898}, +{7,31,2833},{6,31,3906},{5,31,629},{5,31,629},{4,25,170},{0,31,3546},{0,27,228},{9,31,505},{9,31,505},{9,31,505},{9,30,68},{13,14,2178},{6,31,405},{6,31,405},{2,26,4},{8,25,2178},{2,26,4},{13,31,841},{12,31,461},{11,31,1},{8,31,9},{13,31,841},{15,27,841},{8,31,9},{0,28,865},{15,27,841},{0,28,865},{7,0,2689},{7,0,2689},{7,0,2689},{7,0,2689},{5,31,53}, +{5,31,53},{5,31,53},{5,23,49},{0,28,137},{0,28,137},{9,31,10014},{8,31,6962},{8,31,5026},{7,31,3105},{8,31,10683},{7,31,4354},{6,31,933},{5,28,1019},{4,31,10078},{0,29,630},{11,31,2934},{10,31,1611},{10,31,650},{9,31,25},{15,17,5082},{8,31,2786},{7,31,521},{1,29,546},{12,26,5082},{1,29,546},{8,31,5026},{8,31,5026},{8,31,5026},{7,31,3105},{7,31,4170},{6,31,933},{6,31,933}, +{5,26,129},{1,31,3814},{0,28,234},{10,31,650},{10,31,650},{10,31,650},{9,31,25},{14,13,2178},{7,31,521},{7,31,521},{3,27,1},{11,23,2178},{3,27,1},{15,26,545},{13,31,313},{12,31,4},{10,31,4},{15,26,545},{14,29,545},{10,31,4},{0,29,545},{14,29,545},{0,29,545},{7,0,2705},{7,0,2705},{7,0,2705},{7,0,2705},{5,31,101},{5,31,101},{5,31,101},{5,24,5},{0,29,85}, +{0,29,85},{9,31,9465},{9,31,7065},{8,31,5233},{8,31,3329},{8,31,10116},{7,31,4183},{6,31,1338},{5,29,645},{5,31,9447},{0,30,441},{11,31,2664},{11,31,1525},{10,31,848},{10,31,113},{15,19,4344},{9,31,2424},{8,31,724},{2,30,321},{13,26,4344},{2,30,321},{8,31,5233},{8,31,5233},{8,31,5233},{8,31,3329},{7,31,4629},{6,31,1338},{6,31,1338},{5,27,197},{2,31,4212},{1,29,213},{10,31,848}, +{10,31,848},{10,31,848},{10,31,113},{14,16,2178},{8,31,724},{8,31,724},{3,28,9},{15,20,2178},{3,28,9},{15,27,290},{13,31,178},{13,31,9},{11,31,1},{15,27,290},{14,30,290},{11,31,1},{0,29,320},{14,30,290},{0,29,320},{8,0,2929},{8,0,2929},{8,0,2929},{8,0,2929},{6,31,113},{6,31,113},{6,31,113},{6,25,49},{0,31,45},{0,31,45},{10,31,9329},{9,31,6985},{9,31,5541}, +{8,31,3473},{9,31,9496},{8,31,4420},{7,31,1630},{6,29,426},{5,31,9031},{1,30,301},{12,31,2275},{11,31,1557},{11,31,932},{10,31,225},{13,27,3779},{10,31,2086},{8,31,884},{3,30,129},{13,27,3779},{3,30,129},{9,31,5541},{9,31,5541},{9,31,5541},{8,31,3473},{8,31,4836},{7,31,1630},{7,31,1630},{6,28,129},{4,31,4442},{1,30,237},{11,31,932},{11,31,932},{11,31,932},{10,31,225},{13,22,2178}, +{8,31,884},{8,31,884},{4,29,1},{12,25,2178},{4,29,1},{15,28,130},{14,31,72},{13,31,25},{12,31,9},{15,28,130},{15,29,136},{12,31,9},{0,30,128},{15,29,136},{0,30,128},{8,0,2689},{8,0,2689},{8,0,2689},{8,0,2689},{6,31,257},{6,31,257},{6,31,257},{6,27,5},{1,31,89},{1,31,89},{10,31,8929},{10,31,7186},{9,31,5845},{9,31,3829},{9,31,9208},{8,31,4260},{7,31,2270}, +{6,30,245},{6,31,8708},{2,31,228},{12,31,2115},{12,31,1515},{12,31,1154},{11,31,353},{13,29,3299},{11,31,1938},{10,31,1013},{4,30,68},{14,27,3299},{4,30,68},{9,31,5845},{9,31,5845},{9,31,5845},{9,31,3829},{8,31,5124},{7,31,2270},{7,31,2270},{6,29,170},{4,31,4762},{2,31,228},{12,31,1154},{12,31,1154},{12,31,1154},{11,31,353},{15,18,2178},{10,31,1013},{10,31,1013},{4,30,4},{10,29,2178}, +{4,30,4},{15,30,34},{14,31,40},{14,31,4},{14,31,4},{15,30,34},{15,30,34},{14,31,4},{0,30,64},{15,30,34},{0,30,64},{8,0,2705},{8,0,2705},{8,0,2705},{8,0,2705},{7,31,245},{7,31,245},{7,31,245},{7,27,49},{2,31,164},{2,31,164},{11,31,8857},{10,31,7170},{10,31,6209},{9,31,4133},{10,31,8853},{8,31,4484},{8,31,2548},{7,31,170},{7,31,8388},{3,31,244},{13,31,1971}, +{12,31,1611},{12,31,1250},{11,31,625},{15,24,2904},{11,31,1826},{10,31,1157},{5,31,1},{15,27,2907},{5,31,1},{10,31,6209},{10,31,6209},{10,31,6209},{9,31,4133},{9,31,5460},{8,31,2548},{8,31,2548},{7,30,129},{5,31,5126},{3,31,244},{12,31,1250},{12,31,1250},{12,31,1250},{11,31,625},{13,27,2178},{10,31,1157},{10,31,1157},{5,31,1},{13,27,2178},{5,31,1},{15,31,0},{15,31,0},{15,31,0}, +{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{9,0,2689},{9,0,2689},{9,0,2689},{9,0,2689},{7,31,485},{7,31,485},{7,31,485},{7,28,5},{3,31,244},{3,31,244},{11,31,7705},{11,31,6566},{10,31,5633},{10,31,3890},{10,31,7737},{9,31,3874},{8,31,2386},{7,31,116},{7,31,7398},{4,31,317},{13,31,1458},{13,31,1186},{13,31,1017},{12,31,425},{15,25,2166}, +{12,31,1398},{11,31,850},{6,31,4},{12,31,2166},{6,31,4},{10,31,5633},{10,31,5633},{10,31,5633},{10,31,3890},{9,31,4830},{8,31,2386},{8,31,2386},{7,31,116},{6,31,4509},{4,31,317},{13,31,1017},{13,31,1017},{13,31,1017},{12,31,425},{15,22,1625},{11,31,850},{11,31,850},{6,31,4},{13,28,1625},{6,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0}, +{0,31,0},{15,31,0},{0,31,0},{9,0,2725},{9,0,2725},{9,0,2725},{9,0,2725},{8,31,450},{8,31,450},{8,31,450},{7,30,101},{4,31,317},{4,31,317},{11,31,6953},{11,31,5814},{11,31,5189},{10,31,3650},{11,31,6713},{10,31,3531},{9,31,2142},{8,31,74},{8,31,6397},{5,31,425},{13,31,1138},{13,31,866},{13,31,697},{12,31,361},{15,26,1601},{12,31,1046},{11,31,674},{7,31,16},{14,29,1601}, +{7,31,16},{11,31,5189},{11,31,5189},{11,31,5189},{10,31,3650},{10,31,4313},{9,31,2142},{9,31,2142},{8,31,74},{7,31,3981},{5,31,425},{13,31,697},{13,31,697},{13,31,697},{12,31,361},{15,23,1201},{11,31,674},{11,31,674},{7,31,16},{12,30,1201},{7,31,16},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{10,0,2689}, +{10,0,2689},{10,0,2689},{10,0,2689},{8,31,578},{8,31,578},{8,31,578},{8,30,49},{5,31,425},{5,31,425},{12,31,6211},{11,31,5318},{11,31,4693},{11,31,3554},{11,31,5833},{10,31,3067},{10,31,2106},{8,31,10},{9,31,5601},{6,31,580},{14,31,825},{13,31,674},{13,31,505},{13,31,233},{15,27,1122},{13,31,738},{12,31,461},{8,31,9},{13,31,1122},{8,31,9},{11,31,4693},{11,31,4693},{11,31,4693}, +{11,31,3554},{10,31,3849},{10,31,2106},{10,31,2106},{8,31,10},{7,31,3629},{6,31,580},{13,31,505},{13,31,505},{13,31,505},{13,31,233},{13,31,841},{12,31,461},{12,31,461},{8,31,9},{15,27,841},{8,31,9},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{10,0,2705},{10,0,2705},{10,0,2705},{10,0,2705},{9,31,666}, +{9,31,666},{9,31,666},{8,31,10},{6,31,580},{6,31,580},{12,31,5427},{12,31,4827},{11,31,4453},{11,31,3314},{12,31,5175},{10,31,2859},{10,31,1898},{9,31,74},{10,31,4842},{7,31,724},{14,31,489},{14,31,425},{14,31,389},{13,31,169},{14,31,729},{13,31,482},{13,31,313},{10,31,4},{14,30,726},{10,31,4},{11,31,4453},{11,31,4453},{11,31,4453},{11,31,3314},{11,31,3445},{10,31,1898},{10,31,1898}, +{9,31,74},{8,31,3213},{7,31,724},{14,31,389},{14,31,389},{14,31,389},{13,31,169},{15,26,545},{13,31,313},{13,31,313},{10,31,4},{14,29,545},{10,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{11,0,2689},{11,0,2689},{11,0,2689},{11,0,2689},{9,31,890},{9,31,890},{9,31,890},{9,31,74},{7,31,724}, +{7,31,724},{2,31,33740},{0,31,5184},{0,22,420},{0,21,4221},{1,31,46089},{0,29,24105},{0,21,8317},{0,18,24790},{0,21,63990},{0,16,38959},{1,31,9704},{0,30,2866},{0,21,389},{0,19,3229},{7,2,18065},{0,20,13257},{0,17,6153},{0,12,13481},{12,0,18065},{0,12,13481},{0,15,1},{0,15,1},{0,15,1},{0,9,1},{0,8,1105},{0,7,585},{0,7,585},{0,4,596},{0,4,1273},{0,4,740},{0,15,1}, +{0,15,1},{0,15,1},{0,9,1},{2,1,1105},{0,7,585},{0,7,585},{0,4,596},{4,0,1105},{0,4,596},{9,6,9248},{0,30,2866},{0,21,389},{0,19,3229},{9,6,9248},{14,5,9248},{0,19,3229},{0,14,9248},{14,5,9248},{0,14,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,31,38380},{0,31,6720},{0,23,245}, +{0,22,3864},{2,31,50747},{0,31,24961},{0,22,8353},{0,19,25735},{0,22,65535},{0,17,41319},{1,31,10152},{0,31,2624},{0,23,229},{0,20,2980},{5,10,19334},{0,20,13769},{0,18,6243},{0,13,14116},{12,1,19334},{0,13,14116},{0,18,0},{0,18,0},{0,18,0},{0,11,1},{0,9,1513},{0,8,772},{0,8,772},{0,5,821},{0,5,1750},{0,4,1028},{0,18,0},{0,18,0},{0,18,0},{0,11,1},{1,6,1513}, +{0,8,772},{0,8,772},{0,5,821},{3,2,1513},{0,5,821},{10,5,9248},{0,31,2624},{0,23,229},{0,20,2980},{10,5,9248},{12,9,9248},{0,20,2980},{0,15,9248},{12,9,9248},{0,15,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,31,43788},{0,31,9024},{0,24,126},{0,23,3525},{2,31,56155},{0,31,26241},{0,23,8425}, +{0,20,26793},{0,23,65535},{0,18,43819},{2,31,10787},{0,31,2624},{0,24,122},{0,21,2701},{8,0,20689},{0,22,14385},{0,19,6369},{0,13,14756},{12,2,20689},{0,13,14756},{0,21,1},{0,21,1},{0,21,1},{0,12,4},{0,10,1989},{0,9,1018},{0,9,1018},{0,6,1096},{0,5,2294},{0,5,1334},{0,21,1},{0,21,1},{0,21,1},{0,12,4},{1,7,1985},{0,9,1018},{0,9,1018},{0,6,1096},{1,5,1985}, +{0,6,1096},{12,1,9248},{0,31,2624},{0,24,122},{0,21,2701},{12,1,9248},{15,7,9248},{0,21,2701},{0,16,9250},{15,7,9248},{0,16,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,31,49964},{1,31,11512},{0,25,41},{0,24,3109},{2,31,62331},{0,31,28289},{0,24,8585},{0,21,27848},{0,23,65535},{0,19,46459},{2,31,11395}, +{0,31,2880},{0,25,37},{0,22,2440},{8,2,22129},{0,23,15030},{0,20,6509},{0,14,15441},{13,2,22129},{0,14,15441},{0,23,1},{0,23,1},{0,23,1},{0,14,0},{0,12,2525},{0,10,1300},{0,10,1300},{0,6,1384},{0,6,2905},{0,6,1708},{0,23,1},{0,23,1},{0,23,1},{0,14,0},{3,2,2521},{0,10,1300},{0,10,1300},{0,6,1384},{5,1,2521},{0,6,1384},{11,7,9248},{0,31,2880},{0,25,37}, +{0,22,2440},{11,7,9248},{13,11,9248},{0,22,2440},{0,17,9250},{13,11,9248},{0,17,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,31,57022},{1,31,15166},{0,26,20},{0,25,2804},{2,31,65535},{0,31,31511},{0,25,8733},{0,22,29095},{0,26,65535},{0,20,49444},{2,31,12385},{0,31,3474},{0,26,4},{0,23,2173},{8,4,23851}, +{0,23,15948},{0,21,6729},{0,15,16274},{14,2,23851},{0,15,16274},{0,26,0},{0,26,0},{0,26,0},{0,16,4},{0,13,3200},{0,11,1665},{0,11,1665},{0,7,1754},{0,7,3691},{0,6,2185},{0,26,0},{0,26,0},{0,26,0},{0,16,4},{1,10,3200},{0,11,1665},{0,11,1665},{0,7,1754},{5,2,3200},{0,7,1754},{11,10,9248},{1,31,3226},{0,26,4},{0,23,2173},{11,10,9248},{5,23,9248},{0,23,2173}, +{0,18,9248},{5,23,9248},{0,18,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,31,63870},{1,31,19230},{0,27,45},{0,27,2520},{3,31,65535},{0,31,35191},{0,26,8925},{0,23,30250},{0,28,65535},{0,21,52374},{3,31,13449},{1,31,4026},{0,27,29},{0,24,1901},{3,24,25472},{0,26,16706},{0,22,6963},{0,16,17124},{14,3,25472}, +{0,16,17124},{0,29,1},{0,29,1},{0,29,1},{0,17,1},{0,14,3874},{0,13,2084},{0,13,2084},{0,8,2165},{0,8,4466},{0,7,2627},{0,29,1},{0,29,1},{0,29,1},{0,17,1},{4,1,3872},{0,13,2084},{0,13,2084},{0,8,2165},{3,5,3872},{0,8,2165},{12,9,9248},{2,31,3593},{0,27,29},{0,24,1901},{12,9,9248},{14,13,9248},{0,24,1901},{0,19,9248},{14,13,9248},{0,19,9248},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,31,65535},{1,31,24002},{0,28,109},{0,27,2268},{3,31,65535},{1,31,39095},{0,27,8825},{0,24,30825},{0,28,65535},{0,22,54996},{3,31,14345},{1,31,4766},{0,29,102},{0,26,1697},{3,26,26744},{0,28,17104},{0,23,6957},{0,17,17625},{15,3,26744},{0,17,17625},{0,31,5},{0,31,5},{0,31,5}, +{0,19,5},{0,16,4418},{0,14,2306},{0,14,2306},{0,9,2420},{0,8,5122},{0,8,2997},{0,31,5},{0,31,5},{0,31,5},{0,19,5},{3,6,4418},{0,14,2306},{0,14,2306},{0,9,2420},{3,6,4418},{0,9,2420},{14,5,9248},{4,31,3904},{1,28,1},{0,26,1693},{14,5,9248},{12,17,9248},{0,26,1693},{0,20,9250},{12,17,9248},{0,20,9250},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,1}, +{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{3,31,65535},{1,31,29442},{0,29,330},{0,28,2105},{3,31,65535},{1,31,42151},{0,28,7781},{0,25,30108},{0,29,65535},{0,22,56388},{4,31,14976},{2,31,5434},{1,29,62},{0,27,1580},{11,0,26744},{0,29,16547},{0,24,6221},{0,18,17124},{13,7,26744},{0,18,17124},{0,31,181},{0,31,181},{0,31,181},{0,20,101},{0,19,4420},{0,16,2005},{0,16,2005}, +{0,10,2165},{0,9,5389},{0,9,2925},{1,31,37},{1,31,37},{1,31,37},{1,19,37},{5,2,4418},{0,16,2005},{0,16,2005},{0,10,2165},{8,1,4418},{0,10,2165},{13,11,9248},{4,31,4160},{1,29,26},{0,27,1480},{13,11,9248},{15,15,9248},{0,27,1480},{0,21,9250},{15,15,9248},{0,21,9250},{0,0,100},{0,0,100},{0,0,100},{0,0,100},{0,3,1},{0,3,1},{0,3,1},{0,2,0},{0,1,34}, +{0,1,34},{4,31,65535},{2,31,36070},{0,30,822},{0,30,2062},{3,31,65535},{1,31,46660},{0,29,6696},{0,26,29322},{0,31,65535},{0,23,58077},{4,31,15507},{3,31,6253},{1,31,109},{0,28,1646},{11,3,26744},{0,31,15992},{0,26,5346},{0,19,16582},{11,11,26744},{0,19,16582},{1,31,329},{1,31,329},{1,31,329},{1,21,266},{0,22,4420},{0,18,1737},{0,18,1737},{0,11,1898},{0,11,5707},{0,10,2885},{1,31,73}, +{1,31,73},{1,31,73},{1,21,10},{5,5,4418},{0,18,1737},{0,18,1737},{0,11,1898},{5,7,4418},{0,11,1898},{13,14,9248},{5,31,4570},{2,30,4},{0,28,1285},{13,14,9248},{8,25,9248},{0,28,1285},{0,22,9248},{8,25,9248},{0,22,9248},{1,0,265},{1,0,265},{1,0,265},{1,0,265},{0,6,1},{0,6,1},{0,6,1},{0,4,1},{0,3,97},{0,3,97},{4,31,65535},{2,31,40786},{0,31,1405}, +{0,30,2138},{4,31,65535},{1,31,49800},{0,30,5634},{0,27,27967},{0,31,65535},{0,24,58770},{5,31,15531},{3,31,6593},{2,31,61},{1,29,1533},{12,2,26259},{0,31,15284},{0,27,4514},{0,20,15812},{13,10,26259},{0,20,15812},{1,31,633},{1,31,633},{1,31,633},{1,22,381},{0,24,4418},{0,20,1480},{0,20,1480},{0,12,1640},{0,12,6125},{0,11,2891},{2,31,61},{2,31,61},{2,31,61},{2,21,37},{7,1,4418}, +{0,20,1480},{0,20,1480},{0,12,1640},{10,2,4418},{0,12,1640},{13,16,8978},{6,31,4777},{2,31,25},{0,29,1040},{13,16,8978},{15,18,8978},{0,29,1040},{0,23,8980},{15,18,8978},{0,23,8980},{1,0,377},{1,0,377},{1,0,377},{1,0,377},{0,9,0},{0,9,0},{0,9,0},{0,5,4},{0,4,193},{0,4,193},{4,31,65535},{2,31,40898},{1,31,2217},{0,31,2125},{4,31,65535},{1,31,47976},{0,30,4194}, +{0,27,24703},{0,31,65535},{0,24,56130},{5,31,14379},{4,31,6051},{2,31,173},{2,29,1284},{9,14,24371},{0,31,13716},{0,28,3402},{0,21,13989},{14,10,24371},{0,21,13989},{1,31,1193},{1,31,1193},{1,31,1193},{1,24,617},{0,27,4420},{0,22,1280},{0,22,1280},{0,13,1445},{0,14,6509},{0,12,2945},{2,31,173},{2,31,173},{2,31,173},{2,23,5},{5,10,4418},{0,22,1280},{0,22,1280},{0,13,1445},{12,1,4418}, +{0,13,1445},{14,14,7938},{7,31,4253},{3,31,9},{0,29,656},{14,14,7938},{14,20,7938},{0,29,656},{0,23,7956},{14,20,7938},{0,23,7956},{1,0,617},{1,0,617},{1,0,617},{1,0,617},{0,11,4},{0,11,4},{0,11,4},{0,7,0},{0,5,325},{0,5,325},{4,31,65535},{2,31,41266},{1,31,3033},{0,31,2333},{4,31,65535},{1,31,46408},{0,30,3010},{0,27,21695},{0,31,65535},{0,25,53636},{6,31,13140}, +{4,31,5571},{3,31,157},{2,29,932},{11,9,22568},{0,31,12404},{0,28,2474},{0,21,12245},{14,11,22568},{0,21,12245},{2,31,1630},{2,31,1630},{2,31,1630},{1,26,989},{0,29,4420},{0,23,1090},{0,23,1090},{0,14,1268},{0,15,6926},{0,13,3029},{3,31,157},{3,31,157},{3,31,157},{3,23,37},{8,1,4418},{0,23,1090},{0,23,1090},{0,14,1268},{10,5,4418},{0,14,1268},{15,12,6962},{7,31,3709},{4,31,1}, +{0,30,353},{15,12,6962},{13,22,6962},{0,30,353},{0,24,6970},{13,22,6962},{0,24,6970},{1,0,985},{1,0,985},{1,0,985},{1,0,985},{0,14,0},{0,14,0},{0,14,0},{0,8,4},{0,6,493},{0,6,493},{4,31,65535},{2,31,41986},{1,31,4257},{0,31,2873},{4,31,65535},{1,31,44950},{0,30,1984},{0,28,18569},{0,31,65535},{0,25,51026},{6,31,11934},{5,31,5125},{4,31,296},{3,29,706},{13,4,20642}, +{0,31,11234},{0,29,1634},{0,22,10422},{15,11,20642},{0,22,10422},{2,31,2350},{2,31,2350},{2,31,2350},{2,26,1450},{0,31,4450},{0,25,949},{0,25,949},{0,16,1096},{0,16,7397},{0,14,3171},{4,31,296},{4,31,296},{4,31,296},{3,25,10},{8,4,4418},{0,25,949},{0,25,949},{0,16,1096},{14,2,4418},{0,16,1096},{14,17,5941},{7,31,3250},{5,31,0},{0,30,128},{14,17,5941},{13,23,5941},{0,30,128}, +{0,24,5953},{13,23,5941},{0,24,5953},{2,0,1450},{2,0,1450},{2,0,1450},{2,0,1450},{0,17,0},{0,17,0},{0,17,0},{0,10,1},{0,8,697},{0,8,697},{4,31,65535},{2,31,42898},{1,31,5617},{1,31,3337},{4,31,65535},{1,31,43926},{0,31,1250},{0,28,15865},{0,31,65535},{0,25,48978},{7,31,10938},{5,31,4773},{4,31,360},{3,30,509},{12,9,19021},{1,31,10246},{0,30,1088},{0,23,8945},{14,13,19021}, +{0,23,8945},{2,31,3262},{2,31,3262},{2,31,3262},{2,28,1822},{1,31,4682},{0,28,776},{0,28,776},{0,17,925},{0,18,7893},{0,15,3333},{4,31,360},{4,31,360},{4,31,360},{4,25,37},{3,25,4418},{0,28,776},{0,28,776},{0,17,925},{12,6,4418},{0,17,925},{15,15,5101},{8,31,2777},{6,31,9},{0,31,25},{15,15,5101},{11,26,5101},{0,31,25},{0,25,5105},{11,26,5101},{0,25,5105},{2,0,1818}, +{2,0,1818},{2,0,1818},{2,0,1818},{0,20,1},{0,20,1},{0,20,1},{0,12,1},{0,9,925},{0,9,925},{4,31,65535},{2,31,44066},{1,31,7233},{1,31,3993},{4,31,65535},{2,31,43110},{0,31,738},{0,28,13417},{0,31,65535},{0,25,47186},{7,31,9978},{6,31,4467},{5,31,452},{4,30,357},{15,1,17485},{2,31,9441},{0,30,704},{0,24,7570},{15,13,17485},{0,24,7570},{3,31,4058},{3,31,4058},{3,31,4058}, +{2,29,2315},{1,31,4874},{0,29,610},{0,29,610},{0,18,772},{0,20,8427},{0,16,3497},{5,31,452},{5,31,452},{5,31,452},{4,27,5},{9,6,4418},{0,29,610},{0,29,610},{0,18,772},{14,5,4418},{0,18,772},{15,16,4325},{8,31,2377},{6,31,25},{0,31,9},{15,16,4325},{15,22,4325},{0,31,9},{0,25,4337},{15,22,4325},{0,25,4337},{2,0,2314},{2,0,2314},{2,0,2314},{2,0,2314},{0,22,1}, +{0,22,1},{0,22,1},{0,13,4},{0,10,1189},{0,10,1189},{5,31,65535},{3,31,45090},{1,31,9105},{1,31,4905},{4,31,65535},{2,31,42326},{0,31,482},{0,28,11225},{0,31,65535},{0,26,45590},{7,31,9274},{6,31,4179},{5,31,612},{4,30,245},{14,6,16034},{3,31,8633},{0,31,482},{0,24,6242},{15,14,16034},{0,24,6242},{3,31,5066},{3,31,5066},{3,31,5066},{2,31,2939},{1,31,5322},{0,31,482},{0,31,482}, +{0,19,637},{0,20,8939},{0,17,3725},{5,31,612},{5,31,612},{5,31,612},{5,27,37},{10,5,4418},{0,31,482},{0,31,482},{0,19,637},{12,9,4418},{0,19,637},{13,24,3613},{9,31,1973},{7,31,9},{2,31,1},{13,24,3613},{15,23,3613},{2,31,1},{0,26,3617},{15,23,3613},{0,26,3617},{2,0,2938},{2,0,2938},{2,0,2938},{2,0,2938},{0,25,1},{0,25,1},{0,25,1},{0,15,0},{0,11,1489}, +{0,11,1489},{5,31,65535},{3,31,46530},{1,31,11517},{1,31,6237},{4,31,65535},{2,31,41750},{0,31,500},{0,29,8976},{0,31,65535},{0,26,43934},{8,31,8225},{7,31,3853},{6,31,680},{5,30,109},{11,18,14504},{4,31,7667},{0,31,500},{0,25,4979},{10,21,14504},{0,25,4979},{3,31,6506},{3,31,6506},{3,31,6506},{3,31,3701},{2,31,6019},{0,31,500},{0,31,500},{0,20,520},{0,22,9629},{0,18,4035},{6,31,680}, +{6,31,680},{6,31,680},{5,29,10},{10,8,4418},{0,31,500},{0,31,500},{0,20,520},{11,12,4418},{0,20,520},{15,19,2888},{10,31,1537},{8,31,16},{3,31,4},{15,19,2888},{13,26,2888},{3,31,4},{0,26,2906},{13,26,2888},{0,26,2906},{3,0,3697},{3,0,3697},{3,0,3697},{3,0,3697},{0,28,1},{0,28,1},{0,28,1},{0,17,4},{0,11,1930},{0,11,1930},{5,31,65535},{3,31,48082},{1,31,13933}, +{1,31,7693},{4,31,65535},{2,31,41510},{0,31,788},{0,29,7120},{0,31,65535},{0,26,42734},{8,31,7409},{7,31,3693},{7,31,884},{6,30,116},{13,13,13235},{4,31,6899},{1,31,628},{0,25,3987},{15,16,13235},{0,25,3987},{4,31,7686},{4,31,7686},{4,31,7686},{3,31,4437},{2,31,6659},{0,31,788},{0,31,788},{0,21,421},{0,23,10286},{0,20,4305},{7,31,884},{7,31,884},{7,31,884},{6,29,37},{9,14,4418}, +{1,31,628},{1,31,628},{0,21,421},{14,10,4418},{0,21,421},{15,20,2312},{10,31,1217},{8,31,16},{4,31,9},{15,20,2312},{12,28,2312},{4,31,9},{0,27,2314},{12,28,2312},{0,27,2314},{3,0,4337},{3,0,4337},{3,0,4337},{3,0,4337},{0,30,1},{0,30,1},{0,30,1},{0,18,1},{0,13,2329},{0,13,2329},{5,31,65535},{3,31,49890},{2,31,16310},{1,31,9405},{4,31,65535},{2,31,41526},{0,31,1332}, +{0,29,5520},{0,31,65535},{0,26,41790},{8,31,6849},{8,31,3601},{7,31,980},{6,31,5},{15,8,12051},{5,31,6275},{2,31,801},{0,26,3066},{11,22,12051},{0,26,3066},{4,31,9062},{4,31,9062},{4,31,9062},{3,31,5429},{2,31,7555},{1,31,1172},{1,31,1172},{0,23,325},{0,23,11118},{0,20,4625},{7,31,980},{7,31,980},{7,31,980},{6,31,5},{11,10,4418},{2,31,801},{2,31,801},{0,23,325},{5,23,4418}, +{0,23,325},{13,28,1800},{11,31,949},{9,31,4},{6,31,1},{13,28,1800},{11,30,1800},{6,31,1},{0,27,1818},{11,30,1800},{0,27,1818},{3,0,5105},{3,0,5105},{3,0,5105},{3,0,5105},{0,31,36},{0,31,36},{0,31,36},{0,20,4},{0,15,2741},{0,15,2741},{5,31,65535},{3,31,51954},{2,31,18790},{1,31,11373},{5,31,65535},{2,31,41798},{0,31,2132},{0,29,4176},{0,31,65535},{0,27,41092},{9,31,6153}, +{8,31,3297},{7,31,1332},{7,31,37},{14,13,10952},{5,31,5763},{3,31,965},{0,27,2291},{11,23,10952},{0,27,2291},{4,31,10694},{4,31,10694},{4,31,10694},{4,31,6566},{3,31,8619},{1,31,1716},{1,31,1716},{0,24,221},{0,26,11876},{0,22,4989},{7,31,1332},{7,31,1332},{7,31,1332},{7,31,37},{12,9,4418},{3,31,965},{3,31,965},{0,24,221},{14,13,4418},{0,24,221},{14,26,1352},{11,31,725},{10,31,0}, +{7,31,1},{14,26,1352},{15,26,1352},{7,31,1},{0,28,1360},{15,26,1352},{0,28,1360},{3,0,6001},{3,0,6001},{3,0,6001},{3,0,6001},{0,31,196},{0,31,196},{0,31,196},{0,21,1},{0,16,3130},{0,16,3130},{5,31,65535},{3,31,54582},{2,31,21886},{1,31,13893},{5,31,65535},{2,31,42410},{0,31,3338},{0,30,2841},{0,31,65535},{0,27,40390},{9,31,5649},{9,31,3249},{8,31,1325},{7,31,109},{14,15,9818}, +{6,31,5258},{4,31,1108},{0,27,1589},{12,23,9818},{0,27,1589},{5,31,12376},{5,31,12376},{5,31,12376},{4,31,7844},{3,31,9861},{1,31,2634},{1,31,2634},{0,25,136},{0,28,12696},{0,23,5429},{8,31,1325},{8,31,1325},{8,31,1325},{7,31,109},{15,2,4418},{4,31,1108},{4,31,1108},{0,25,136},{13,16,4418},{0,25,136},{15,24,925},{12,31,505},{11,31,1},{8,31,1},{15,24,925},{15,27,925},{8,31,1}, +{0,28,937},{15,27,925},{0,28,937},{4,0,7060},{4,0,7060},{4,0,7060},{4,0,7060},{1,31,425},{1,31,425},{1,31,425},{0,23,0},{0,17,3665},{0,17,3665},{5,31,65535},{3,31,57190},{2,31,24910},{1,31,16405},{5,31,65535},{2,31,43226},{0,31,4682},{0,30,1833},{0,31,65535},{0,27,40038},{10,31,5202},{9,31,3073},{8,31,1565},{8,31,277},{13,20,8901},{7,31,4814},{5,31,1300},{0,28,1021},{13,23,8902}, +{0,28,1021},{5,31,14136},{5,31,14136},{5,31,14136},{4,31,9252},{3,31,11237},{2,31,3590},{2,31,3590},{0,26,85},{0,29,13491},{0,23,5925},{8,31,1565},{8,31,1565},{8,31,1565},{8,31,277},{11,18,4418},{5,31,1300},{5,31,1300},{0,26,85},{10,21,4418},{0,26,85},{15,25,617},{13,31,365},{12,31,16},{9,31,9},{15,25,617},{13,30,613},{9,31,9},{0,29,617},{13,30,613},{0,29,617},{4,0,7956}, +{4,0,7956},{4,0,7956},{4,0,7956},{1,31,697},{1,31,697},{1,31,697},{0,25,4},{0,18,4181},{0,18,4181},{5,31,65535},{3,31,60054},{2,31,28190},{2,31,18895},{5,31,65535},{2,31,44298},{1,31,6090},{0,30,1081},{0,31,65535},{0,27,39942},{10,31,4850},{10,31,3107},{9,31,1709},{8,31,325},{13,22,8069},{7,31,4574},{6,31,1553},{0,29,602},{12,25,8069},{0,29,602},{6,31,16067},{6,31,16067},{6,31,16067}, +{5,31,10872},{4,31,12824},{2,31,4662},{2,31,4662},{0,27,52},{0,30,14340},{0,25,6449},{9,31,1709},{9,31,1709},{9,31,1709},{8,31,325},{13,14,4418},{6,31,1553},{6,31,1553},{0,27,52},{8,25,4418},{0,27,52},{15,27,365},{13,31,205},{12,31,16},{11,31,4},{15,27,365},{13,31,365},{11,31,4},{0,29,377},{13,31,365},{0,29,377},{4,0,8980},{4,0,8980},{4,0,8980},{4,0,8980},{1,31,1097}, +{1,31,1097},{1,31,1097},{0,26,1},{0,20,4682},{0,20,4682},{6,31,65535},{4,31,58981},{2,31,29926},{2,31,19751},{5,31,65535},{3,31,43402},{1,31,6910},{0,30,765},{0,31,65535},{0,28,34909},{11,31,4502},{10,31,3011},{9,31,2045},{9,31,557},{15,17,7322},{8,31,4242},{7,31,1781},{0,29,314},{12,26,7322},{0,29,314},{6,31,16739},{6,31,16739},{6,31,16739},{5,31,11492},{4,31,13636},{3,31,5586},{3,31,5586}, +{0,28,65},{0,31,14139},{0,26,6041},{9,31,2045},{9,31,2045},{9,31,2045},{9,31,557},{14,13,4418},{7,31,1781},{7,31,1781},{0,28,29},{11,23,4418},{0,28,29},{15,28,181},{14,31,117},{13,31,4},{12,31,0},{15,28,181},{15,29,181},{12,31,0},{0,30,185},{15,29,181},{0,30,185},{4,0,9376},{4,0,9376},{4,0,9376},{4,0,9376},{2,31,1405},{2,31,1405},{2,31,1405},{0,28,40},{0,21,4520}, +{0,21,4520},{6,31,65535},{4,31,57316},{3,31,30345},{3,31,20808},{6,31,65535},{3,31,41449},{2,31,8321},{1,31,301},{0,31,65535},{0,28,28330},{11,31,4232},{11,31,3093},{10,31,2248},{9,31,809},{15,19,6584},{9,31,3992},{7,31,2105},{0,30,77},{13,26,6584},{0,30,77},{7,31,17380},{7,31,17380},{7,31,17380},{6,31,12161},{5,31,14315},{3,31,6405},{3,31,6405},{1,29,53},{0,31,13860},{0,28,5286},{10,31,2248}, +{10,31,2248},{10,31,2248},{9,31,809},{14,16,4418},{7,31,2105},{7,31,2105},{0,30,13},{15,20,4418},{0,30,13},{15,29,52},{14,31,36},{14,31,0},{13,31,9},{15,29,52},{15,30,50},{13,31,9},{0,30,68},{15,30,50},{0,30,68},{5,0,9250},{5,0,9250},{5,0,9250},{5,0,9250},{2,31,1549},{2,31,1549},{2,31,1549},{1,28,2},{0,23,4114},{0,23,4114},{6,31,65535},{5,31,55908},{4,31,31583}, +{3,31,21256},{6,31,65535},{4,31,39740},{2,31,9073},{1,31,285},{0,31,65535},{0,29,23356},{12,31,4011},{11,31,3125},{11,31,2500},{10,31,1037},{13,27,6019},{10,31,3738},{8,31,2340},{0,31,4},{13,27,6019},{0,31,4},{7,31,17796},{7,31,17796},{7,31,17796},{6,31,12625},{6,31,14996},{4,31,7139},{4,31,7139},{1,30,86},{0,31,14020},{0,29,4652},{11,31,2500},{11,31,2500},{11,31,2500},{10,31,1037},{13,22,4418}, +{8,31,2340},{8,31,2340},{0,31,4},{12,25,4418},{0,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{0,31,4},{15,31,4},{0,31,4},{6,0,9376},{6,0,9376},{6,0,9376},{6,0,9376},{3,31,1765},{3,31,1765},{3,31,1765},{1,30,50},{0,25,3877},{0,25,3877},{7,31,65535},{5,31,53236},{4,31,30487},{4,31,21367},{6,31,65535},{4,31,37332},{3,31,9385}, +{2,31,36},{0,31,65535},{0,29,18680},{12,31,3443},{12,31,2843},{11,31,2248},{10,31,997},{14,25,5163},{10,31,3218},{9,31,2120},{1,31,4},{12,29,5163},{1,31,4},{7,31,17504},{7,31,17504},{7,31,17504},{7,31,12569},{6,31,14328},{4,31,7227},{4,31,7227},{2,31,20},{0,31,13376},{0,29,3944},{11,31,2248},{11,31,2248},{11,31,2248},{10,31,997},{15,17,3872},{9,31,2120},{9,31,2120},{1,31,4},{12,26,3872}, +{1,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{6,0,9248},{6,0,9248},{6,0,9248},{6,0,9248},{3,31,2005},{3,31,2005},{3,31,2005},{2,30,5},{0,27,3545},{0,27,3545},{7,31,65535},{6,31,50785},{4,31,29687},{4,31,20567},{7,31,65535},{4,31,35412},{3,31,8985},{2,31,196},{1,31,65535},{0,29,14712},{12,31,2883}, +{12,31,2283},{12,31,1922},{11,31,821},{13,29,4267},{11,31,2694},{10,31,1745},{3,31,4},{14,27,4267},{3,31,4},{8,31,16610},{8,31,16610},{8,31,16610},{7,31,12185},{6,31,13528},{5,31,6915},{5,31,6915},{2,31,52},{1,31,12556},{0,30,3314},{12,31,1922},{12,31,1922},{12,31,1922},{11,31,821},{12,28,3200},{10,31,1745},{10,31,1745},{3,31,4},{11,28,3200},{3,31,4},{15,31,0},{15,31,0},{15,31,0}, +{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{6,0,9376},{6,0,9376},{6,0,9376},{6,0,9376},{4,31,2250},{4,31,2250},{4,31,2250},{2,31,52},{0,28,3170},{0,28,3170},{7,31,65535},{6,31,47239},{5,31,28065},{5,31,20409},{7,31,65535},{5,31,32574},{4,31,8965},{3,31,54},{1,31,65206},{0,30,10964},{13,31,2326},{12,31,1806},{12,31,1445},{11,31,650},{13,30,3361}, +{11,31,2091},{10,31,1322},{4,31,0},{12,30,3361},{4,31,0},{8,31,15584},{8,31,15584},{8,31,15584},{7,31,12059},{7,31,12522},{6,31,6811},{6,31,6811},{3,31,50},{1,31,11710},{0,31,2834},{12,31,1445},{12,31,1445},{12,31,1445},{11,31,650},{14,23,2521},{10,31,1322},{10,31,1322},{4,31,0},{15,24,2521},{4,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0}, +{0,31,0},{15,31,0},{0,31,0},{7,0,9250},{7,0,9250},{7,0,9250},{7,0,9250},{5,31,2600},{5,31,2600},{5,31,2600},{3,31,50},{0,31,2834},{0,31,2834},{8,31,65535},{6,31,44903},{5,31,27361},{5,31,19705},{7,31,64494},{5,31,30846},{4,31,8677},{3,31,470},{2,31,60777},{0,30,8308},{13,31,1782},{13,31,1510},{12,31,1157},{12,31,557},{13,31,2646},{11,31,1691},{11,31,1066},{5,31,4},{15,27,2646}, +{5,31,4},{8,31,14944},{8,31,14944},{8,31,14944},{8,31,11696},{7,31,11850},{6,31,6555},{6,31,6555},{4,31,164},{2,31,11097},{0,31,2610},{12,31,1157},{12,31,1157},{12,31,1157},{12,31,557},{15,21,1985},{11,31,1066},{11,31,1066},{5,31,4},{15,25,1985},{5,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{7,0,9410}, +{7,0,9410},{7,0,9410},{7,0,9410},{5,31,2792},{5,31,2792},{5,31,2792},{4,31,164},{0,31,2610},{0,31,2610},{8,31,63584},{7,31,42019},{6,31,25930},{5,31,19769},{8,31,60273},{6,31,28860},{5,31,8761},{4,31,276},{3,31,56253},{0,30,6420},{13,31,1366},{13,31,1094},{13,31,925},{12,31,397},{15,25,2018},{12,31,1298},{11,31,794},{7,31,4},{13,30,2017},{7,31,4},{9,31,14244},{9,31,14244},{9,31,14244}, +{8,31,11312},{8,31,11249},{7,31,6499},{7,31,6499},{4,31,260},{3,31,10457},{0,31,2642},{13,31,925},{13,31,925},{13,31,925},{12,31,397},{15,22,1513},{11,31,794},{11,31,794},{7,31,4},{14,27,1513},{7,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{8,0,9376},{8,0,9376},{8,0,9376},{8,0,9376},{6,31,3074}, +{6,31,3074},{6,31,3074},{4,31,260},{0,31,2642},{0,31,2642},{8,31,58848},{7,31,39683},{6,31,25130},{6,31,19007},{8,31,54849},{6,31,27132},{5,31,8569},{4,31,756},{4,31,51302},{0,31,5046},{13,31,1078},{13,31,806},{13,31,637},{12,31,365},{15,26,1473},{12,31,978},{12,31,617},{8,31,9},{14,29,1473},{8,31,9},{9,31,13604},{9,31,13604},{9,31,13604},{8,31,11184},{8,31,10433},{7,31,6339},{7,31,6339}, +{5,31,424},{4,31,9713},{0,31,2930},{13,31,637},{13,31,637},{13,31,637},{12,31,365},{14,27,1105},{12,31,617},{12,31,617},{8,31,9},{13,29,1105},{8,31,9},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{8,0,9248},{8,0,9248},{8,0,9248},{8,0,9248},{6,31,3330},{6,31,3330},{6,31,3330},{5,31,424},{0,31,2930}, +{0,31,2930}, +/**** ended inlining basisu_transcoder_tables_pvrtc2_45.inc ****/ + }; + +#if 0 + static const etc1s_to_atc_solution g_etc1s_to_pvrtc2_alpha_33[32 * 8 * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS * NUM_ETC1S_TO_ATC_SELECTOR_RANGES] = { +/**** start inlining basisu_transcoder_tables_pvrtc2_alpha_33.inc ****/ +{0,0,20},{0,0,20},{0,0,97},{0,0,145},{0,0,56},{0,0,104},{0,0,181},{0,0,406},{0,0,204},{0,0,442},{0,0,20},{0,0,20},{0,0,97},{0,0,145},{0,0,56},{0,0,104},{0,0,181},{0,0,406},{0,0,168},{0,0,406},{0,0,16},{0,0,16},{0,0,16},{0,0,64},{0,0,52},{0,0,100},{0,0,100},{0,0,325},{0,0,200},{0,0,361},{0,0,16}, +{0,0,16},{0,0,16},{0,0,64},{0,0,52},{0,0,100},{0,0,100},{0,0,325},{0,0,164},{0,0,325},{0,0,20},{0,0,20},{0,0,97},{0,0,145},{0,0,20},{0,0,68},{0,0,145},{0,0,306},{0,0,68},{0,0,306},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,1,126},{0,0,88},{0,0,53}, +{0,0,37},{0,0,116},{0,0,36},{0,0,1},{0,0,66},{0,0,88},{0,0,102},{0,1,126},{0,0,88},{0,0,53},{0,0,37},{0,0,116},{0,0,36},{0,0,1},{0,0,66},{0,0,52},{0,0,66},{0,0,52},{0,0,52},{0,0,52},{0,0,36},{0,0,16},{0,0,0},{0,0,0},{0,0,65},{0,0,52},{0,0,101},{0,0,52},{0,0,52},{0,0,52},{0,0,36},{0,0,16}, +{0,0,0},{0,0,0},{0,0,65},{0,0,16},{0,0,65},{0,1,90},{0,0,52},{0,0,17},{0,0,1},{0,1,90},{0,0,36},{0,0,1},{0,0,50},{0,0,36},{0,0,50},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,0,0},{0,0,0},{0,0,0},{0,0,16},{0,0,52},{0,0,52},{0,1,286},{0,1,310},{0,0,453},{0,0,373},{0,1,115},{0,1,307},{0,0,241}, +{0,0,130},{0,0,280},{0,0,70},{0,1,222},{0,1,246},{0,0,389},{0,0,309},{0,1,51},{1,0,195},{0,0,177},{0,0,66},{1,0,107},{0,0,66},{0,1,261},{0,1,261},{0,1,261},{0,0,324},{0,1,90},{0,0,192},{0,0,192},{0,0,81},{0,0,84},{0,0,21},{0,1,197},{0,1,197},{0,1,197},{0,0,260},{0,1,26},{0,0,128},{0,0,128},{0,0,17},{0,0,80}, +{0,0,17},{0,1,26},{0,1,50},{1,0,130},{1,0,74},{0,1,26},{1,0,26},{1,0,74},{0,0,50},{1,0,26},{0,0,50},{0,0,260},{0,0,260},{0,0,260},{0,0,260},{0,1,89},{0,1,89},{0,1,89},{0,0,80},{0,0,20},{0,0,20},{1,0,494},{1,0,550},{1,0,694},{1,0,702},{0,2,363},{0,1,291},{1,0,583},{1,0,631},{0,1,116},{1,0,428},{1,0,170}, +{1,0,226},{1,0,370},{1,0,378},{1,0,51},{0,1,35},{1,0,259},{1,0,307},{1,0,91},{1,0,307},{1,0,469},{1,0,469},{1,0,469},{1,0,477},{0,1,314},{0,1,290},{0,1,290},{1,0,406},{0,1,115},{1,0,203},{1,0,145},{1,0,145},{1,0,145},{1,0,153},{1,0,26},{1,0,34},{1,0,34},{1,0,82},{1,0,10},{1,0,82},{1,0,26},{0,1,50},{1,0,226}, +{1,0,234},{1,0,26},{0,1,26},{1,0,234},{0,0,306},{0,1,26},{0,0,306},{1,0,468},{1,0,468},{1,0,468},{1,0,468},{0,1,265},{0,1,265},{0,1,265},{1,0,325},{0,1,90},{0,1,90},{1,1,116},{1,1,124},{1,1,215},{1,1,271},{1,1,188},{1,1,252},{1,1,343},{1,1,606},{0,1,152},{0,1,392},{1,1,35},{1,1,43},{1,1,134},{1,1,190},{1,1,107}, +{1,1,171},{0,1,260},{0,1,356},{2,0,51},{0,1,356},{1,1,115},{1,1,115},{1,1,115},{1,1,171},{1,0,161},{1,0,241},{1,0,241},{1,0,469},{0,1,52},{0,1,292},{1,1,34},{1,1,34},{1,1,34},{1,1,90},{0,2,16},{1,0,160},{1,0,160},{0,1,256},{0,1,16},{0,1,256},{1,1,26},{1,1,34},{1,1,125},{0,1,116},{1,1,26},{2,0,26},{0,1,116}, +{0,1,356},{2,0,26},{0,1,356},{1,0,90},{1,0,90},{1,0,90},{1,0,90},{1,0,97},{1,0,97},{1,0,97},{1,0,145},{0,1,36},{0,1,36},{1,1,116},{1,1,60},{1,1,39},{1,1,31},{1,1,92},{1,1,28},{1,1,7},{1,1,94},{1,1,100},{1,1,142},{1,1,115},{1,1,59},{1,1,38},{1,1,30},{0,3,51},{1,1,27},{1,1,6},{1,1,93},{1,1,51}, +{1,1,93},{1,1,35},{1,1,35},{1,1,35},{1,1,27},{1,1,11},{1,1,3},{1,1,3},{1,1,90},{1,1,75},{1,1,138},{1,1,34},{1,1,34},{1,1,34},{1,1,26},{1,1,10},{1,1,2},{1,1,2},{1,1,89},{1,1,26},{1,1,89},{2,0,26},{1,1,34},{1,1,13},{1,1,5},{2,0,26},{3,0,26},{1,1,5},{0,1,68},{3,0,26},{0,1,68},{1,0,26}, +{1,0,26},{1,0,26},{1,0,26},{1,1,2},{1,1,2},{1,1,2},{1,1,26},{1,1,74},{1,1,74},{1,2,238},{1,2,286},{1,1,375},{1,1,303},{1,2,105},{1,1,316},{1,1,183},{1,1,94},{0,2,156},{1,1,46},{1,2,189},{1,2,237},{1,1,326},{1,1,254},{1,2,56},{2,1,232},{1,1,134},{1,1,45},{0,2,56},{1,1,45},{1,2,222},{1,2,222},{1,2,222}, +{1,1,267},{1,2,89},{1,1,147},{1,1,147},{1,1,58},{1,1,59},{1,1,10},{1,2,173},{1,2,173},{1,2,173},{1,1,218},{2,0,10},{1,1,98},{1,1,98},{1,1,9},{3,0,10},{1,1,9},{1,2,20},{1,2,68},{2,1,136},{2,1,72},{1,2,20},{0,2,20},{2,1,72},{0,1,36},{0,2,20},{0,1,36},{1,0,218},{1,0,218},{1,0,218},{1,0,218},{1,2,85}, +{1,2,85},{1,2,85},{1,1,58},{1,1,10},{1,1,10},{2,1,550},{2,1,598},{2,1,730},{2,1,730},{1,3,361},{1,2,265},{2,1,597},{1,1,606},{1,2,152},{2,1,408},{2,1,189},{2,1,237},{2,1,369},{2,1,369},{2,1,56},{1,2,40},{2,1,236},{2,1,264},{4,0,56},{2,1,264},{2,1,534},{2,1,534},{2,1,534},{2,1,534},{1,2,265},{1,2,265},{1,2,265}, +{1,1,410},{2,1,152},{2,1,212},{2,1,173},{2,1,173},{2,1,173},{2,1,173},{0,4,8},{2,1,40},{2,1,40},{2,1,68},{2,1,8},{2,1,68},{2,1,20},{1,2,36},{2,1,200},{2,1,200},{2,1,20},{4,0,20},{2,1,200},{0,1,260},{4,0,20},{0,1,260},{2,0,530},{2,0,530},{2,0,530},{2,0,530},{1,2,229},{1,2,229},{1,2,229},{1,2,325},{1,2,116}, +{1,2,116},{2,2,152},{2,2,168},{2,2,273},{2,2,337},{2,2,236},{2,2,316},{2,2,421},{2,2,706},{1,2,116},{1,2,436},{2,2,52},{2,2,68},{2,2,173},{2,2,237},{3,0,56},{1,2,211},{1,2,251},{1,2,411},{3,1,56},{1,2,411},{2,2,152},{2,2,152},{2,2,152},{2,2,216},{2,1,158},{2,1,230},{2,1,230},{2,1,438},{1,2,35},{1,2,315},{2,2,52}, +{2,2,52},{2,2,52},{2,2,116},{1,3,10},{2,1,130},{2,1,130},{1,2,290},{1,2,10},{1,2,290},{3,0,20},{2,2,52},{2,2,157},{1,2,130},{3,0,20},{3,1,20},{1,2,130},{0,2,410},{3,1,20},{0,2,410},{2,0,116},{2,0,116},{2,0,116},{2,0,116},{2,1,109},{2,1,109},{2,1,109},{2,1,149},{1,2,26},{1,2,26},{2,2,88},{2,2,40},{2,2,33}, +{2,2,33},{2,2,76},{2,2,28},{2,2,21},{2,2,130},{2,2,120},{2,2,190},{2,2,84},{2,2,36},{2,2,29},{2,2,29},{1,4,56},{2,2,24},{2,2,17},{2,2,126},{2,2,56},{2,2,126},{2,2,24},{2,2,24},{2,2,24},{2,2,24},{2,2,12},{2,2,12},{2,2,12},{2,2,121},{2,2,104},{2,2,181},{2,2,20},{2,2,20},{2,2,20},{2,2,20},{2,2,8}, +{2,2,8},{2,2,8},{2,2,117},{5,0,8},{2,2,117},{1,4,20},{2,2,20},{2,2,13},{2,2,13},{1,4,20},{2,2,20},{2,2,13},{0,2,90},{2,2,20},{0,2,90},{2,0,20},{2,0,20},{2,0,20},{2,0,20},{2,2,8},{2,2,8},{2,2,8},{2,2,40},{2,2,100},{2,2,100},{2,3,198},{2,3,270},{2,2,305},{2,2,241},{2,3,103},{2,2,252},{2,2,133}, +{2,2,66},{1,3,148},{2,2,30},{2,3,162},{2,3,234},{2,2,269},{2,2,205},{2,3,67},{2,2,216},{2,2,97},{2,2,30},{6,0,67},{2,2,30},{2,3,189},{2,3,189},{2,3,189},{2,2,216},{2,3,94},{2,2,108},{2,2,108},{2,2,41},{2,2,40},{2,2,5},{2,3,153},{2,3,153},{2,3,153},{2,2,180},{3,1,8},{2,2,72},{2,2,72},{2,2,5},{4,1,8}, +{2,2,5},{2,3,18},{2,3,90},{2,2,125},{2,2,61},{2,3,18},{6,0,18},{2,2,61},{0,2,26},{6,0,18},{0,2,26},{2,0,180},{2,0,180},{2,0,180},{2,0,180},{2,2,72},{2,2,72},{2,2,72},{2,2,40},{2,2,4},{2,2,4},{3,2,614},{2,3,622},{3,2,774},{3,2,766},{2,3,343},{2,3,247},{3,2,619},{2,2,514},{2,3,196},{2,2,382},{3,2,214}, +{3,2,254},{3,2,374},{3,2,366},{4,0,59},{2,3,51},{3,2,219},{3,2,227},{3,2,59},{3,2,227},{3,2,605},{3,2,605},{3,2,605},{3,2,597},{2,3,222},{2,3,246},{2,3,246},{2,2,345},{3,2,179},{2,2,213},{3,2,205},{3,2,205},{3,2,205},{3,2,197},{4,0,10},{3,2,50},{3,2,50},{3,2,58},{3,2,10},{3,2,58},{3,2,18},{2,3,26},{3,2,178}, +{3,2,170},{3,2,18},{5,1,18},{3,2,170},{0,2,218},{5,1,18},{0,2,218},{2,0,596},{2,0,596},{2,0,596},{2,0,596},{2,3,197},{2,3,197},{2,3,197},{2,2,296},{2,3,146},{2,3,146},{3,3,196},{3,3,220},{3,3,339},{3,3,411},{3,3,292},{3,3,388},{3,3,507},{3,3,814},{2,3,88},{2,3,488},{3,3,75},{3,3,99},{3,3,218},{3,3,290},{4,1,67}, +{2,3,168},{2,3,248},{2,3,472},{4,2,67},{2,3,472},{3,2,182},{3,2,182},{3,2,182},{3,2,246},{3,2,161},{3,2,225},{3,2,225},{3,2,413},{2,3,24},{3,2,308},{3,2,61},{3,2,61},{3,2,61},{3,2,125},{2,4,8},{3,2,104},{3,2,104},{3,2,292},{7,0,8},{3,2,292},{4,1,18},{3,3,74},{3,3,193},{2,3,148},{4,1,18},{4,2,18},{2,3,148}, +{0,3,468},{4,2,18},{0,3,468},{3,0,146},{3,0,146},{3,0,146},{3,0,146},{3,2,125},{3,2,125},{3,2,125},{3,2,157},{2,3,20},{2,3,20},{3,3,68},{3,3,28},{3,3,35},{3,3,43},{3,3,68},{3,3,36},{3,3,43},{3,3,174},{3,3,148},{3,3,246},{3,3,59},{3,3,19},{3,3,26},{3,3,34},{3,3,59},{3,3,27},{3,3,34},{2,3,152},{6,1,59}, +{2,3,152},{3,3,19},{3,3,19},{3,3,19},{3,3,27},{3,3,19},{3,3,27},{3,3,27},{3,3,158},{3,3,139},{3,3,230},{3,3,10},{3,3,10},{3,3,10},{3,3,18},{3,3,10},{3,3,18},{3,3,18},{2,3,136},{6,1,10},{2,3,136},{5,0,18},{3,3,10},{3,3,17},{3,3,25},{5,0,18},{3,3,18},{3,3,25},{0,3,116},{3,3,18},{0,3,116},{3,0,18}, +{3,0,18},{3,0,18},{3,0,18},{3,3,18},{3,3,18},{3,3,18},{3,3,58},{3,3,130},{3,3,130},{3,4,166},{3,4,262},{3,3,243},{3,3,187},{3,4,109},{3,3,196},{3,3,91},{3,3,46},{3,3,148},{3,3,22},{3,4,141},{3,4,237},{3,3,218},{3,3,162},{4,2,59},{3,3,171},{3,3,66},{3,3,21},{5,2,59},{3,3,21},{3,4,162},{3,4,162},{3,4,162}, +{3,3,171},{3,4,105},{3,3,75},{3,3,75},{3,3,30},{3,3,27},{3,3,6},{3,4,137},{3,4,137},{3,4,137},{3,3,146},{4,2,10},{3,3,50},{3,3,50},{3,3,5},{5,2,10},{3,3,5},{3,4,20},{3,4,116},{3,3,97},{3,3,41},{3,4,20},{7,1,20},{3,3,41},{0,3,20},{7,1,20},{0,3,20},{3,0,146},{3,0,146},{3,0,146},{3,0,146},{3,3,50}, +{3,3,50},{3,3,50},{3,3,26},{3,3,2},{3,3,2},{3,5,598},{3,4,550},{4,3,826},{4,3,810},{3,4,285},{3,4,237},{4,3,649},{3,3,430},{4,3,248},{3,3,310},{4,3,245},{4,3,277},{4,3,385},{4,3,369},{5,1,52},{3,4,68},{4,3,208},{4,3,196},{4,3,52},{4,3,196},{3,4,546},{3,4,546},{3,4,546},{3,4,594},{3,4,185},{3,4,233},{3,4,233}, +{3,3,286},{4,3,212},{3,3,166},{4,3,241},{4,3,241},{4,3,241},{4,3,225},{5,1,16},{4,3,64},{4,3,64},{4,3,52},{7,1,16},{4,3,52},{4,3,20},{3,4,20},{4,3,160},{4,3,144},{4,3,20},{6,2,20},{4,3,144},{0,3,180},{6,2,20},{0,3,180},{3,0,530},{3,0,530},{3,0,530},{3,0,530},{3,4,169},{3,4,169},{3,4,169},{3,3,250},{3,3,130}, +{3,3,130},{4,4,248},{4,4,280},{4,4,413},{4,4,493},{4,3,291},{4,3,451},{4,4,601},{4,3,835},{3,4,68},{3,4,548},{4,4,104},{4,4,136},{4,4,269},{4,4,349},{6,0,59},{3,4,131},{3,4,251},{3,4,539},{3,4,59},{3,4,539},{4,3,205},{4,3,205},{4,3,205},{4,3,261},{4,3,170},{4,3,226},{4,3,226},{4,3,394},{3,4,19},{4,3,275},{4,3,61}, +{4,3,61},{4,3,61},{4,3,117},{6,0,10},{4,3,82},{4,3,82},{4,3,250},{3,4,10},{4,3,250},{5,2,20},{4,4,100},{4,4,233},{3,4,170},{5,2,20},{5,3,20},{3,4,170},{0,4,530},{5,3,20},{0,4,530},{4,0,180},{4,0,180},{4,0,180},{4,0,180},{4,3,145},{4,3,145},{4,3,145},{4,3,169},{3,4,18},{3,4,18},{4,4,56},{4,4,24},{4,4,45}, +{4,4,61},{4,4,68},{4,4,52},{4,4,73},{4,4,226},{4,4,184},{3,4,292},{4,4,40},{4,4,8},{4,4,29},{4,4,45},{4,4,52},{4,4,36},{4,4,57},{3,4,171},{7,2,52},{3,4,171},{4,4,20},{4,4,20},{4,4,20},{4,4,36},{4,4,32},{4,4,48},{4,4,48},{4,4,201},{4,4,180},{3,4,267},{4,4,4},{4,4,4},{4,4,4},{4,4,20},{5,2,16}, +{4,4,32},{4,4,32},{3,4,146},{7,2,16},{3,4,146},{6,1,20},{4,4,4},{4,4,25},{4,4,41},{6,1,20},{4,4,20},{4,4,41},{0,4,146},{4,4,20},{0,4,146},{4,0,20},{4,0,20},{4,0,20},{4,0,20},{4,4,32},{4,4,32},{4,4,32},{4,4,80},{3,4,146},{3,4,146},{4,5,142},{4,5,262},{4,4,189},{4,4,141},{4,5,123},{4,4,148},{4,4,57}, +{4,4,34},{4,4,120},{4,4,22},{4,5,126},{4,5,246},{4,4,173},{4,4,125},{5,3,52},{4,4,132},{4,4,41},{4,4,18},{6,3,52},{4,4,18},{4,5,141},{4,5,141},{4,5,141},{4,4,132},{4,4,96},{4,4,48},{4,4,48},{4,4,25},{4,4,20},{4,4,13},{4,5,125},{4,5,125},{4,5,125},{4,4,116},{6,1,16},{4,4,32},{4,4,32},{4,4,9},{6,3,16}, +{4,4,9},{7,0,26},{4,5,146},{4,4,73},{4,4,25},{7,0,26},{3,5,26},{4,4,25},{0,4,18},{3,5,26},{0,4,18},{4,0,116},{4,0,116},{4,0,116},{4,0,116},{4,4,32},{4,4,32},{4,4,32},{4,4,16},{4,4,4},{4,4,4},{4,5,558},{4,5,486},{4,4,845},{4,4,733},{4,5,235},{4,5,235},{4,4,553},{4,4,354},{5,4,276},{4,4,246},{5,4,282}, +{5,4,306},{5,4,402},{5,4,378},{6,2,51},{4,5,91},{5,4,203},{5,4,171},{5,4,51},{5,4,171},{4,5,477},{4,5,477},{4,5,477},{4,5,549},{4,5,154},{4,5,226},{4,5,226},{4,4,233},{3,5,235},{4,4,125},{5,4,281},{5,4,281},{5,4,281},{5,4,257},{7,0,10},{5,4,82},{5,4,82},{5,4,50},{3,5,10},{5,4,50},{6,2,26},{4,5,18},{5,4,146}, +{5,4,122},{6,2,26},{7,3,26},{5,4,122},{0,4,146},{7,3,26},{0,4,146},{4,0,468},{4,0,468},{4,0,468},{4,0,468},{4,5,145},{4,5,145},{4,5,145},{4,4,208},{4,4,100},{4,4,100},{5,5,308},{5,5,348},{5,5,495},{5,5,583},{5,4,285},{5,4,429},{5,4,633},{5,4,781},{4,5,56},{4,5,616},{5,5,139},{5,5,179},{5,5,326},{5,5,414},{7,1,52}, +{4,5,100},{4,5,260},{5,4,612},{4,5,52},{5,4,612},{5,4,234},{5,4,234},{5,4,234},{5,4,282},{5,4,185},{5,4,233},{5,4,233},{5,4,381},{4,5,20},{5,4,248},{5,4,65},{5,4,65},{5,4,65},{5,4,113},{7,1,16},{5,4,64},{5,4,64},{5,4,212},{7,3,16},{5,4,212},{6,3,26},{5,5,130},{5,5,277},{4,5,196},{6,3,26},{6,4,26},{4,5,196}, +{0,4,596},{6,4,26},{0,4,596},{5,0,218},{5,0,218},{5,0,218},{5,0,218},{5,4,169},{5,4,169},{5,4,169},{5,4,185},{4,5,20},{4,5,20},{5,5,52},{5,5,28},{5,5,63},{5,5,87},{5,5,76},{5,5,76},{5,5,111},{5,5,286},{5,5,228},{4,5,296},{5,5,27},{5,5,3},{5,5,38},{5,5,62},{5,5,51},{5,5,51},{5,5,86},{4,5,196},{3,6,51}, +{4,5,196},{5,5,27},{5,5,27},{5,5,27},{5,5,51},{5,5,51},{5,5,75},{5,5,75},{5,5,250},{4,5,180},{4,5,260},{5,5,2},{5,5,2},{5,5,2},{5,5,26},{6,3,10},{5,5,50},{5,5,50},{4,5,160},{6,4,10},{4,5,160},{7,2,26},{5,5,2},{5,5,37},{5,5,61},{7,2,26},{5,5,26},{5,5,61},{0,5,180},{5,5,26},{0,5,180},{5,0,26}, +{5,0,26},{5,0,26},{5,0,26},{5,5,50},{5,5,50},{5,5,50},{5,5,106},{4,5,116},{4,5,116},{5,6,126},{5,5,220},{5,5,143},{5,5,103},{5,6,145},{5,5,108},{5,5,31},{5,5,30},{5,5,100},{5,5,30},{5,6,117},{5,5,211},{5,5,134},{5,5,94},{6,4,51},{5,5,99},{5,5,22},{5,5,21},{7,4,51},{5,5,21},{5,6,126},{5,6,126},{5,6,126}, +{5,5,99},{5,5,67},{5,5,27},{5,5,27},{5,5,26},{5,5,19},{5,5,26},{5,6,117},{5,6,117},{5,6,117},{5,5,90},{7,2,10},{5,5,18},{5,5,18},{5,5,17},{5,5,10},{5,5,17},{6,4,26},{5,5,130},{5,5,53},{5,5,13},{6,4,26},{7,4,26},{5,5,13},{0,5,20},{7,4,26},{0,5,20},{5,0,90},{5,0,90},{5,0,90},{5,0,90},{5,5,18}, +{5,5,18},{5,5,18},{5,5,10},{5,5,10},{5,5,10},{5,6,478},{5,6,430},{5,5,735},{5,5,631},{5,6,193},{5,6,241},{5,5,463},{5,5,286},{4,6,268},{5,5,190},{6,5,325},{5,6,309},{6,5,425},{6,5,393},{7,3,56},{6,5,120},{6,5,204},{6,5,152},{6,5,56},{6,5,152},{5,6,414},{5,6,414},{5,6,414},{5,6,510},{5,6,129},{5,6,225},{5,6,225}, +{5,5,186},{5,5,195},{5,5,90},{5,6,293},{5,6,293},{5,6,293},{6,5,293},{5,6,8},{6,5,104},{6,5,104},{6,5,52},{4,6,8},{6,5,52},{7,3,20},{5,6,20},{6,5,136},{6,5,104},{7,3,20},{6,5,20},{6,5,104},{0,5,116},{6,5,20},{0,5,116},{5,0,410},{5,0,410},{5,0,410},{5,0,410},{5,6,125},{5,6,125},{5,6,125},{5,5,170},{5,5,74}, +{5,5,74},{6,5,350},{6,6,424},{6,6,585},{6,5,670},{6,5,287},{6,5,415},{6,5,607},{6,5,735},{5,6,52},{6,5,588},{6,5,154},{6,6,228},{6,6,389},{6,5,474},{5,7,51},{5,6,75},{5,6,275},{6,5,539},{5,6,51},{6,5,539},{6,5,269},{6,5,269},{6,5,269},{6,5,309},{6,5,206},{6,5,246},{6,5,246},{6,5,374},{5,6,27},{6,5,227},{6,5,73}, +{6,5,73},{6,5,73},{6,5,113},{6,5,10},{6,5,50},{6,5,50},{6,5,178},{3,7,10},{6,5,178},{5,7,26},{5,6,146},{6,6,325},{5,6,226},{5,7,26},{5,6,26},{5,6,226},{0,5,530},{5,6,26},{0,5,530},{6,0,260},{6,0,260},{6,0,260},{6,0,260},{6,5,197},{6,5,197},{6,5,197},{6,5,205},{5,6,26},{5,6,26},{6,6,56},{6,6,40},{6,6,89}, +{6,6,121},{6,6,92},{6,6,108},{6,6,157},{6,6,354},{6,6,280},{5,6,308},{6,6,20},{6,6,4},{6,6,53},{6,6,85},{6,6,56},{6,6,72},{6,6,121},{5,6,227},{4,7,56},{5,6,227},{6,6,40},{6,6,40},{6,6,40},{6,6,72},{6,6,76},{6,6,108},{6,6,108},{6,6,305},{5,6,139},{5,6,259},{6,6,4},{6,6,4},{6,6,4},{6,6,36},{7,4,8}, +{6,6,72},{6,6,72},{5,6,178},{7,5,8},{5,6,178},{6,6,20},{6,6,4},{6,6,53},{6,6,85},{6,6,20},{4,7,20},{6,6,85},{0,6,218},{4,7,20},{0,6,218},{6,0,36},{6,0,36},{6,0,36},{6,0,36},{6,6,72},{6,6,72},{6,6,72},{6,6,136},{5,6,90},{5,6,90},{6,7,118},{6,6,168},{6,6,105},{6,6,73},{6,7,175},{6,6,76},{6,6,13}, +{6,6,34},{6,6,88},{6,6,46},{6,7,114},{6,6,164},{6,6,101},{6,6,69},{7,5,56},{6,6,72},{6,6,9},{6,6,30},{6,6,72},{6,6,30},{6,6,104},{6,6,104},{6,6,104},{6,6,72},{6,6,44},{6,6,12},{6,6,12},{6,6,33},{6,6,24},{6,6,45},{6,6,100},{6,6,100},{6,6,100},{6,6,68},{7,5,40},{6,6,8},{6,6,8},{6,6,29},{6,6,8}, +{6,6,29},{7,5,20},{6,6,100},{6,6,37},{6,6,5},{7,5,20},{5,7,50},{6,6,5},{0,6,26},{5,7,50},{0,6,26},{6,0,68},{6,0,68},{6,0,68},{6,0,68},{6,6,8},{6,6,8},{6,6,8},{6,6,8},{6,6,20},{6,6,20},{6,7,406},{6,7,382},{6,6,633},{6,6,537},{6,7,159},{6,7,255},{6,6,381},{6,6,226},{5,7,228},{6,6,142},{6,7,306}, +{6,7,282},{7,6,454},{7,6,414},{6,7,59},{7,6,139},{7,6,211},{6,6,126},{5,7,59},{6,6,126},{6,7,357},{6,7,357},{6,7,357},{6,6,456},{6,7,110},{6,7,230},{6,7,230},{6,6,145},{6,6,152},{6,6,61},{6,7,257},{6,7,257},{6,7,257},{7,6,333},{6,7,10},{7,6,130},{7,6,130},{6,6,45},{5,7,10},{6,6,45},{7,6,50},{6,7,26},{7,6,130}, +{7,6,90},{7,6,50},{7,6,18},{7,6,90},{0,6,90},{7,6,18},{0,6,90},{6,0,356},{6,0,356},{6,0,356},{6,0,356},{6,7,109},{6,7,109},{6,7,109},{6,6,136},{6,6,52},{6,6,52},{7,6,374},{7,6,454},{7,6,634},{7,6,666},{7,6,297},{7,6,409},{7,6,589},{7,6,697},{6,7,56},{7,6,536},{7,6,149},{7,6,229},{7,6,409},{7,6,441},{7,6,72}, +{6,7,56},{6,7,296},{7,6,472},{6,7,56},{7,6,472},{7,6,310},{7,6,310},{7,6,310},{7,6,342},{7,6,233},{7,6,265},{7,6,265},{7,6,373},{6,7,40},{7,6,212},{7,6,85},{7,6,85},{7,6,85},{7,6,117},{7,6,8},{7,6,40},{7,6,40},{7,6,148},{7,6,40},{7,6,148},{7,6,68},{6,7,116},{7,6,328},{6,7,260},{7,6,68},{6,7,20},{6,7,260}, +{0,6,468},{6,7,20},{0,6,468},{7,0,306},{7,0,306},{7,0,306},{7,0,306},{7,6,229},{7,6,229},{7,6,229},{7,6,229},{6,7,36},{6,7,36},{7,7,68},{7,7,60},{7,7,123},{7,7,163},{7,7,116},{7,7,148},{7,7,211},{7,7,430},{6,7,248},{6,7,328},{7,7,19},{7,7,11},{7,7,74},{7,7,114},{7,7,67},{7,7,99},{7,7,162},{6,7,264},{7,7,171}, +{6,7,264},{7,7,59},{7,7,59},{7,7,59},{7,7,99},{7,7,107},{7,7,147},{7,7,147},{7,7,366},{6,7,104},{6,7,264},{7,7,10},{7,7,10},{7,7,10},{7,7,50},{7,7,58},{7,7,98},{7,7,98},{6,7,200},{6,7,40},{6,7,200},{7,7,18},{7,7,10},{7,7,73},{6,7,100},{7,7,18},{7,7,50},{6,7,100},{0,7,260},{7,7,50},{0,7,260},{7,0,50}, +{7,0,50},{7,0,50},{7,0,50},{7,6,85},{7,6,85},{7,6,85},{7,6,149},{6,7,68},{6,7,68},{7,7,196},{7,7,124},{7,7,75},{7,7,51},{7,7,148},{7,7,52},{7,7,3},{7,7,46},{7,7,84},{7,7,70},{7,7,195},{7,7,123},{7,7,74},{7,7,50},{7,7,147},{7,7,51},{7,7,2},{7,7,45},{7,7,59},{7,7,45},{7,7,75},{7,7,75},{7,7,75}, +{7,7,51},{7,7,27},{7,7,3},{7,7,3},{7,7,46},{7,7,35},{7,7,70},{7,7,74},{7,7,74},{7,7,74},{7,7,50},{7,7,26},{7,7,2},{7,7,2},{7,7,45},{7,7,10},{7,7,45},{7,7,146},{7,7,74},{7,7,25},{7,7,1},{7,7,146},{7,7,50},{7,7,1},{0,7,36},{7,7,50},{0,7,36},{7,0,50},{7,0,50},{7,0,50},{7,0,50},{7,7,2}, +{7,7,2},{7,7,2},{7,7,10},{7,7,34},{7,7,34},{7,7,548},{7,7,476},{7,7,427},{7,7,355},{7,7,404},{7,7,260},{7,7,211},{7,7,106},{7,7,132},{7,7,34},{7,7,467},{7,7,395},{7,7,346},{7,7,274},{7,7,323},{7,7,179},{7,7,130},{7,7,25},{7,7,123},{7,7,25},{7,7,427},{7,7,427},{7,7,427},{7,7,355},{7,7,283},{7,7,211},{7,7,211}, +{7,7,106},{7,7,83},{7,7,34},{7,7,346},{7,7,346},{7,7,346},{7,7,274},{7,7,202},{7,7,130},{7,7,130},{7,7,25},{7,7,74},{7,7,25},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{7,0,306},{7,0,306},{7,0,306},{7,0,306},{7,7,162},{7,7,162},{7,7,162},{7,7,106},{7,7,34}, +{7,7,34},{0,0,122},{0,0,50},{0,0,1},{0,0,25},{0,0,158},{0,0,110},{0,0,61},{0,0,244},{0,0,210},{0,0,280},{0,0,122},{0,0,50},{0,0,1},{0,0,25},{0,0,158},{0,0,110},{0,0,61},{0,0,244},{0,0,174},{0,0,244},{0,0,1},{0,0,1},{0,0,1},{0,0,25},{0,0,37},{0,0,61},{0,0,61},{0,0,244},{0,0,161},{0,0,280},{0,0,1}, +{0,0,1},{0,0,1},{0,0,25},{0,0,37},{0,0,61},{0,0,61},{0,0,244},{0,0,125},{0,0,244},{0,0,122},{0,0,50},{0,0,1},{0,0,25},{0,0,122},{0,0,74},{0,0,25},{0,0,144},{0,0,74},{0,0,144},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,1,81},{0,1,81},{0,0,122}, +{0,0,82},{0,1,328},{0,0,243},{0,0,82},{0,0,129},{0,0,319},{0,0,165},{0,1,81},{0,1,81},{0,0,122},{0,0,82},{0,1,328},{0,0,243},{0,0,82},{0,0,129},{0,0,283},{0,0,129},{0,1,45},{0,1,45},{0,1,45},{0,0,18},{0,0,58},{0,0,18},{0,0,18},{0,0,65},{0,0,94},{0,0,101},{0,1,45},{0,1,45},{0,1,45},{0,0,18},{0,0,58}, +{0,0,18},{0,0,18},{0,0,65},{0,0,58},{0,0,65},{0,1,72},{0,1,72},{0,0,113},{0,0,73},{0,1,72},{1,0,104},{0,0,73},{0,0,80},{1,0,104},{0,0,80},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,49},{0,0,85},{0,0,85},{0,2,225},{0,1,129},{0,1,449},{0,0,498},{0,1,264},{0,1,168},{0,0,402}, +{0,0,273},{0,0,687},{0,0,309},{0,2,225},{0,1,129},{0,1,449},{0,0,498},{0,1,264},{0,1,168},{0,0,402},{0,0,273},{1,0,248},{0,0,273},{0,1,125},{0,1,125},{0,1,125},{0,1,221},{0,1,68},{0,0,146},{0,0,146},{0,0,17},{0,0,158},{0,0,53},{0,1,125},{0,1,125},{0,1,125},{0,1,221},{0,1,68},{0,0,146},{0,0,146},{0,0,17},{0,0,122}, +{0,0,17},{1,0,72},{0,1,8},{1,0,292},{1,0,260},{1,0,72},{1,0,104},{1,0,260},{0,0,272},{1,0,104},{0,0,272},{0,0,121},{0,0,121},{0,0,121},{0,0,121},{0,0,25},{0,0,25},{0,0,25},{0,0,1},{0,0,37},{0,0,37},{0,2,514},{0,2,558},{0,1,610},{0,1,514},{0,2,297},{0,1,153},{0,1,153},{0,1,777},{0,1,392},{0,0,802},{1,1,347}, +{1,1,355},{1,1,446},{0,1,465},{0,2,248},{0,1,104},{0,1,104},{0,1,728},{0,1,248},{0,1,728},{0,2,414},{0,2,414},{0,2,414},{0,1,414},{0,1,149},{0,1,53},{0,1,53},{0,0,274},{0,1,292},{0,0,226},{1,0,229},{1,0,229},{1,0,229},{1,0,261},{1,0,68},{0,1,4},{0,1,4},{1,0,160},{1,0,52},{1,0,160},{0,2,104},{1,1,130},{0,1,200}, +{0,1,104},{0,2,104},{2,0,74},{0,1,104},{0,1,584},{2,0,74},{0,1,584},{0,0,410},{0,0,410},{0,0,410},{0,0,410},{0,1,49},{0,1,49},{0,1,49},{0,0,130},{0,0,82},{0,0,82},{1,1,464},{1,1,400},{1,1,365},{1,1,397},{1,1,572},{0,2,499},{0,1,387},{0,1,435},{0,1,428},{0,1,188},{1,1,140},{1,1,76},{1,1,41},{1,1,73},{1,1,248}, +{1,1,216},{0,1,131},{0,1,179},{2,0,264},{0,1,179},{1,1,364},{1,1,364},{1,1,364},{1,1,396},{0,2,314},{0,1,386},{0,1,386},{0,1,434},{0,1,67},{0,1,187},{1,1,40},{1,1,40},{1,1,40},{1,1,72},{0,2,58},{0,1,130},{0,1,130},{0,1,178},{0,1,58},{0,1,178},{0,3,72},{1,1,40},{1,1,5},{1,1,37},{0,3,72},{1,1,72},{1,1,37}, +{0,1,170},{1,1,72},{0,1,170},{1,0,360},{1,0,360},{1,0,360},{1,0,360},{0,2,265},{0,2,265},{0,2,265},{0,1,265},{0,1,18},{0,1,18},{1,2,178},{1,2,202},{1,1,189},{1,1,157},{1,2,463},{1,1,316},{1,1,169},{1,1,238},{0,2,412},{0,1,124},{1,2,78},{1,2,102},{1,1,89},{1,1,57},{2,0,248},{0,2,99},{1,1,69},{0,1,99},{3,0,248}, +{0,1,99},{1,1,140},{1,1,140},{1,1,140},{1,1,108},{1,1,152},{1,1,120},{1,1,120},{1,1,189},{0,1,275},{0,1,75},{1,1,40},{1,1,40},{1,1,40},{1,1,8},{1,1,52},{1,1,20},{1,1,20},{0,1,50},{1,1,68},{0,1,50},{1,2,74},{1,2,98},{1,1,85},{1,1,53},{1,2,74},{0,2,74},{1,1,53},{0,1,74},{0,2,74},{0,1,74},{1,0,104}, +{1,0,104},{1,0,104},{1,0,104},{1,1,116},{1,1,116},{1,1,116},{1,1,164},{0,1,50},{0,1,50},{1,3,226},{1,2,106},{1,2,466},{1,1,429},{1,2,255},{1,2,207},{1,1,345},{1,1,238},{0,2,252},{1,1,298},{1,3,222},{1,2,102},{1,2,462},{1,1,425},{1,2,251},{1,2,203},{1,1,341},{1,1,234},{0,2,251},{1,1,234},{1,2,105},{1,2,105},{1,2,105}, +{1,1,204},{1,2,86},{1,1,120},{1,1,120},{1,1,13},{0,2,83},{1,1,73},{1,2,101},{1,2,101},{1,2,101},{1,1,200},{2,0,52},{1,1,116},{1,1,116},{1,1,9},{3,0,52},{1,1,9},{2,1,74},{1,2,2},{2,1,274},{2,1,234},{2,1,74},{4,0,74},{2,1,234},{0,1,234},{4,0,74},{0,1,234},{1,0,104},{1,0,104},{1,0,104},{1,0,104},{1,1,20}, +{1,1,20},{1,1,20},{1,1,4},{1,1,64},{1,1,64},{1,3,450},{1,2,522},{1,2,562},{1,2,490},{1,3,295},{1,2,127},{1,2,167},{1,1,750},{1,2,428},{1,1,714},{2,2,400},{2,2,416},{2,2,521},{1,2,454},{2,1,251},{1,2,91},{1,2,131},{0,2,651},{4,0,251},{0,2,651},{1,3,369},{1,3,369},{1,3,369},{1,2,369},{1,2,118},{1,2,46},{1,2,46}, +{1,1,221},{0,2,163},{1,1,185},{2,1,257},{2,1,257},{2,1,257},{2,1,281},{0,4,50},{1,2,10},{1,2,10},{2,1,146},{2,1,50},{2,1,146},{3,0,80},{2,2,160},{1,2,202},{1,2,130},{3,0,80},{3,1,80},{1,2,130},{0,1,650},{3,1,80},{0,1,650},{1,0,360},{1,0,360},{1,0,360},{1,0,360},{1,2,37},{1,2,37},{1,2,37},{1,1,100},{1,1,64}, +{1,1,64},{2,2,500},{2,2,444},{2,2,423},{2,2,463},{1,4,588},{1,3,513},{1,2,329},{1,2,441},{0,3,284},{1,2,232},{2,2,139},{2,2,83},{2,2,62},{2,2,102},{3,0,251},{2,2,243},{1,2,104},{1,2,216},{3,1,251},{1,2,216},{2,2,419},{2,2,419},{2,2,419},{2,2,459},{1,3,277},{1,2,325},{1,2,325},{1,2,437},{1,2,68},{1,2,228},{2,2,58}, +{2,2,58},{2,2,58},{2,2,98},{1,3,52},{1,2,100},{1,2,100},{1,2,212},{1,2,52},{1,2,212},{1,4,74},{2,2,34},{2,2,13},{1,2,40},{1,4,74},{2,2,74},{1,2,40},{0,2,200},{2,2,74},{0,2,200},{2,0,410},{2,0,410},{2,0,410},{2,0,410},{1,3,241},{1,3,241},{1,3,241},{1,2,241},{1,2,32},{1,2,32},{2,3,202},{2,3,250},{2,2,183}, +{2,2,159},{2,2,460},{2,2,316},{2,2,183},{2,2,274},{1,3,468},{1,2,104},{2,3,81},{2,3,129},{2,2,62},{2,2,38},{1,4,251},{1,3,96},{2,2,62},{1,2,88},{2,2,251},{1,2,88},{2,2,147},{2,2,147},{2,2,147},{2,2,123},{2,2,171},{2,2,147},{2,2,147},{2,2,238},{0,3,219},{1,2,68},{2,2,26},{2,2,26},{2,2,26},{2,2,2},{2,2,50}, +{2,2,26},{2,2,26},{1,2,52},{5,0,50},{1,2,52},{2,3,80},{2,3,128},{2,2,61},{2,2,37},{2,3,80},{6,0,80},{2,2,37},{0,2,72},{6,0,80},{0,2,72},{2,0,122},{2,0,122},{2,0,122},{2,0,122},{2,2,146},{2,2,146},{2,2,146},{2,2,202},{1,2,32},{1,2,32},{2,3,234},{2,3,90},{2,2,455},{2,2,367},{2,3,253},{2,3,253},{2,2,295}, +{2,2,210},{1,3,244},{2,2,282},{2,3,225},{2,3,81},{2,2,446},{2,2,358},{2,3,244},{2,3,244},{2,2,286},{2,2,201},{6,0,244},{2,2,201},{2,3,90},{2,3,90},{2,3,90},{2,2,171},{2,3,109},{2,2,99},{2,2,99},{2,2,14},{1,3,100},{2,2,86},{2,3,81},{2,3,81},{2,3,81},{2,2,162},{3,1,50},{2,2,90},{2,2,90},{2,2,5},{4,1,50}, +{2,2,5},{4,0,80},{2,3,0},{3,2,260},{3,2,212},{4,0,80},{5,1,80},{3,2,212},{0,2,200},{5,1,80},{0,2,200},{2,0,90},{2,0,90},{2,0,90},{2,0,90},{2,2,18},{2,2,18},{2,2,18},{2,2,10},{2,2,82},{2,2,82},{2,4,394},{2,3,442},{2,3,522},{2,3,474},{2,4,301},{2,3,109},{2,3,189},{2,2,658},{2,3,472},{2,2,634},{2,4,369}, +{2,3,417},{2,3,497},{2,3,449},{3,2,244},{2,3,84},{2,3,164},{3,2,620},{5,1,244},{3,2,620},{2,4,330},{2,4,330},{2,4,330},{2,3,330},{2,3,93},{2,3,45},{2,3,45},{2,2,174},{1,3,132},{2,2,150},{3,2,289},{3,2,289},{3,2,289},{3,2,305},{4,0,52},{2,3,20},{2,3,20},{3,2,136},{3,2,52},{3,2,136},{2,4,80},{2,3,128},{2,3,208}, +{2,3,160},{2,4,80},{7,0,80},{2,3,160},{0,2,584},{7,0,80},{0,2,584},{2,0,314},{2,0,314},{2,0,314},{2,0,314},{2,3,29},{2,3,29},{2,3,29},{2,2,74},{2,2,50},{2,2,50},{3,3,544},{3,3,496},{3,3,489},{3,3,537},{2,4,535},{2,4,535},{2,3,279},{2,3,455},{1,4,292},{2,3,284},{3,3,144},{3,3,96},{3,3,89},{3,3,137},{4,1,244}, +{3,3,276},{2,3,83},{2,3,259},{4,2,244},{2,3,259},{3,3,480},{3,3,480},{3,3,480},{3,3,528},{2,4,246},{2,3,270},{2,3,270},{2,3,446},{2,3,75},{2,3,275},{3,3,80},{3,3,80},{3,3,80},{3,3,128},{2,4,50},{2,3,74},{2,3,74},{2,3,250},{7,0,50},{2,3,250},{5,0,80},{3,3,32},{3,3,25},{2,3,34},{5,0,80},{6,1,80},{2,3,34}, +{0,3,234},{6,1,80},{0,3,234},{3,0,464},{3,0,464},{3,0,464},{3,0,464},{2,4,221},{2,4,221},{2,4,221},{2,3,221},{2,3,50},{2,3,50},{3,4,234},{3,3,304},{3,3,185},{3,3,169},{3,3,452},{3,3,324},{3,3,205},{3,3,318},{1,4,452},{2,3,92},{3,4,90},{3,3,160},{3,3,41},{3,3,25},{5,0,244},{2,4,99},{3,3,61},{2,3,83},{3,3,244}, +{2,3,83},{3,3,160},{3,3,160},{3,3,160},{3,3,144},{3,3,196},{3,3,180},{3,3,180},{3,3,293},{2,3,187},{2,3,67},{3,3,16},{3,3,16},{3,3,16},{3,3,0},{3,3,52},{3,3,36},{3,3,36},{2,3,58},{6,1,52},{2,3,58},{4,2,80},{3,3,160},{3,3,41},{3,3,25},{4,2,80},{5,2,80},{3,3,25},{0,3,74},{5,2,80},{0,3,74},{3,0,144}, +{3,0,144},{3,0,144},{3,0,144},{3,3,180},{3,3,180},{3,3,180},{3,3,244},{2,3,18},{2,3,18},{3,4,202},{3,4,82},{3,3,393},{3,3,313},{3,4,259},{3,4,307},{3,3,253},{3,3,190},{2,4,244},{3,3,274},{3,4,186},{3,4,66},{3,3,377},{3,3,297},{3,4,243},{2,4,243},{3,3,237},{3,3,174},{7,1,243},{3,3,174},{3,4,81},{3,4,81},{3,4,81}, +{3,3,144},{3,4,138},{3,3,84},{3,3,84},{3,3,21},{2,4,123},{3,3,105},{3,4,65},{3,4,65},{3,4,65},{3,3,128},{4,2,52},{3,3,68},{3,3,68},{3,3,5},{5,2,52},{3,3,5},{5,1,74},{3,4,2},{4,3,250},{4,3,194},{5,1,74},{4,3,74},{4,3,194},{0,3,170},{4,3,74},{0,3,170},{3,0,80},{3,0,80},{3,0,80},{3,0,80},{3,3,20}, +{3,3,20},{3,3,20},{3,3,20},{3,3,104},{3,3,104},{3,5,346},{3,4,370},{3,4,490},{3,4,466},{3,5,315},{3,4,99},{3,4,219},{3,3,574},{2,4,468},{3,3,562},{3,5,330},{3,4,354},{3,4,474},{3,4,450},{4,3,243},{3,4,83},{3,4,203},{3,3,558},{6,2,243},{3,3,558},{3,5,297},{3,5,297},{3,5,297},{3,4,297},{3,4,74},{3,4,50},{3,4,50}, +{3,3,133},{2,4,107},{3,3,121},{3,5,281},{3,5,281},{3,5,281},{3,4,281},{5,1,58},{3,4,34},{3,4,34},{3,3,117},{7,1,58},{3,3,117},{6,0,74},{3,4,98},{3,4,218},{3,4,194},{6,0,74},{3,4,74},{3,4,194},{0,3,522},{3,4,74},{0,3,522},{3,0,272},{3,0,272},{3,0,272},{3,0,272},{3,4,25},{3,4,25},{3,4,25},{3,3,52},{3,3,40}, +{3,3,40},{4,4,596},{4,4,556},{4,4,563},{4,4,619},{3,5,477},{3,4,477},{3,4,237},{3,4,477},{2,5,308},{3,4,344},{4,4,155},{4,4,115},{4,4,122},{4,4,178},{5,2,243},{2,5,299},{3,4,68},{2,4,308},{5,3,243},{2,4,308},{4,4,547},{4,4,547},{4,4,547},{4,4,603},{3,5,221},{3,4,221},{3,4,221},{3,4,461},{3,4,88},{3,4,328},{4,4,106}, +{4,4,106},{4,4,106},{4,4,162},{6,0,52},{3,4,52},{3,4,52},{2,4,292},{3,4,52},{2,4,292},{4,4,74},{4,4,34},{4,4,41},{3,4,32},{4,4,74},{7,2,74},{3,4,32},{0,4,272},{7,2,74},{0,4,272},{4,0,522},{4,0,522},{4,0,522},{4,0,522},{3,4,205},{3,4,205},{3,4,205},{3,4,205},{3,4,72},{3,4,72},{4,5,274},{4,4,300},{4,4,195}, +{4,4,187},{4,4,452},{4,4,340},{4,4,235},{4,4,370},{2,5,404},{3,4,88},{4,5,105},{4,4,131},{4,4,26},{4,4,18},{6,1,243},{3,5,108},{4,4,66},{3,4,84},{4,4,243},{3,4,84},{4,4,179},{4,4,179},{4,4,179},{4,4,171},{4,4,227},{4,4,219},{4,4,219},{4,4,354},{3,4,152},{3,4,72},{4,4,10},{4,4,10},{4,4,10},{4,4,2},{5,2,58}, +{4,4,50},{4,4,50},{3,4,68},{7,2,58},{3,4,68},{5,3,74},{4,4,130},{4,4,25},{4,4,17},{5,3,74},{6,3,74},{4,4,17},{0,4,80},{6,3,74},{0,4,80},{4,0,170},{4,0,170},{4,0,170},{4,0,170},{4,3,205},{4,3,205},{4,3,205},{4,3,269},{3,4,8},{3,4,8},{4,5,178},{4,5,82},{4,4,339},{4,4,267},{4,5,273},{4,5,369},{4,4,219}, +{4,4,178},{3,5,252},{4,4,274},{4,5,153},{4,5,57},{4,4,314},{4,4,242},{7,0,248},{3,5,204},{4,4,194},{4,4,153},{3,5,248},{4,4,153},{4,5,78},{4,5,78},{4,5,78},{4,4,123},{4,4,147},{4,4,75},{4,4,75},{4,4,34},{3,5,152},{4,4,130},{4,5,53},{4,5,53},{4,5,53},{4,4,98},{6,1,58},{4,4,50},{4,4,50},{4,4,9},{6,3,58}, +{4,4,9},{6,2,72},{4,5,8},{5,4,244},{5,4,180},{6,2,72},{5,4,72},{5,4,180},{0,4,144},{5,4,72},{0,4,144},{4,0,74},{4,0,74},{4,0,74},{4,0,74},{4,4,26},{4,4,26},{4,4,26},{4,4,34},{4,4,130},{4,4,130},{4,6,306},{4,5,306},{4,5,466},{4,5,466},{4,6,337},{4,5,97},{4,5,257},{4,4,498},{3,5,412},{4,4,498},{4,6,297}, +{4,5,297},{4,5,457},{4,5,457},{5,4,248},{4,5,88},{4,5,248},{4,4,489},{7,3,248},{4,4,489},{4,5,270},{4,5,270},{4,5,270},{4,5,270},{4,5,61},{4,5,61},{4,5,61},{4,4,98},{3,5,88},{4,4,98},{4,5,261},{4,5,261},{4,5,261},{4,5,261},{7,0,52},{4,5,52},{4,5,52},{4,4,89},{3,5,52},{4,4,89},{7,1,72},{4,5,72},{4,5,232}, +{3,5,232},{7,1,72},{4,5,72},{3,5,232},{0,4,464},{4,5,72},{0,4,464},{4,0,234},{4,0,234},{4,0,234},{4,0,234},{4,5,25},{4,5,25},{4,5,25},{4,4,34},{4,4,34},{4,4,34},{5,5,656},{5,5,624},{5,5,645},{5,5,709},{4,6,427},{4,5,403},{4,5,203},{4,5,507},{4,5,332},{4,5,412},{5,5,172},{5,5,140},{5,5,161},{5,5,225},{6,3,248}, +{4,5,259},{4,5,59},{3,5,339},{6,4,248},{3,5,339},{5,5,620},{5,5,620},{5,5,620},{5,5,684},{4,6,202},{4,5,178},{4,5,178},{4,5,482},{4,5,107},{4,5,387},{5,5,136},{5,5,136},{5,5,136},{5,5,200},{7,1,58},{4,5,34},{4,5,34},{5,4,290},{7,3,58},{5,4,290},{5,5,72},{5,5,40},{5,5,61},{4,5,34},{5,5,72},{3,6,72},{4,5,34}, +{0,5,314},{3,6,72},{0,5,314},{5,0,584},{5,0,584},{5,0,584},{5,0,584},{4,5,169},{4,5,169},{4,5,169},{4,5,193},{4,5,98},{4,5,98},{5,6,322},{5,5,304},{5,5,213},{5,5,213},{5,5,460},{5,5,364},{5,5,273},{5,5,430},{3,6,364},{4,5,92},{5,6,126},{5,5,108},{5,5,17},{5,5,17},{7,2,248},{4,6,123},{5,5,77},{4,5,91},{5,5,248}, +{4,5,91},{5,5,204},{5,5,204},{5,5,204},{5,5,204},{5,5,264},{5,5,264},{5,5,264},{5,5,421},{4,5,123},{4,5,83},{5,5,8},{5,5,8},{5,5,8},{5,5,8},{6,3,52},{5,5,68},{5,5,68},{4,5,82},{6,4,52},{4,5,82},{6,4,72},{5,5,104},{5,5,13},{5,5,13},{6,4,72},{7,4,72},{5,5,13},{0,5,90},{7,4,72},{0,5,90},{5,0,200}, +{5,0,200},{5,0,200},{5,0,200},{5,4,221},{5,4,221},{5,4,221},{5,4,277},{4,5,2},{4,5,2},{5,6,162},{5,6,90},{5,5,293},{5,5,229},{5,6,295},{5,5,396},{5,5,193},{5,5,174},{4,6,268},{5,5,282},{5,6,126},{5,6,54},{5,5,257},{5,5,193},{5,6,259},{4,6,171},{5,5,157},{5,5,138},{4,6,259},{5,5,138},{5,6,81},{5,6,81},{5,6,81}, +{5,5,108},{5,5,136},{5,5,72},{5,5,72},{5,5,53},{4,6,187},{5,5,161},{5,6,45},{5,6,45},{5,6,45},{5,5,72},{7,2,52},{5,5,36},{5,5,36},{5,5,17},{5,5,52},{5,5,17},{7,3,74},{5,6,18},{5,5,221},{5,5,157},{7,3,74},{6,5,74},{5,5,157},{0,5,122},{6,5,74},{0,5,122},{5,0,72},{5,0,72},{5,0,72},{5,0,72},{5,5,36}, +{5,5,36},{5,5,36},{5,5,52},{5,5,160},{5,5,160},{5,7,274},{5,6,250},{5,6,450},{5,6,474},{5,6,343},{5,6,103},{5,6,303},{5,5,430},{4,6,364},{5,5,442},{5,7,270},{5,6,246},{5,6,446},{5,6,470},{7,3,251},{5,6,99},{5,6,299},{5,5,426},{6,5,251},{5,5,426},{5,6,225},{5,6,225},{5,6,225},{5,6,249},{5,6,54},{5,6,78},{5,6,78}, +{5,5,69},{4,6,75},{5,5,81},{5,6,221},{5,6,221},{5,6,221},{5,6,245},{5,6,50},{5,6,74},{5,6,74},{5,5,65},{4,6,50},{5,5,65},{5,7,74},{5,6,50},{5,6,250},{4,6,250},{5,7,74},{5,6,74},{4,6,250},{0,5,410},{5,6,74},{0,5,410},{5,0,200},{5,0,200},{5,0,200},{5,0,200},{5,6,29},{5,6,29},{5,6,29},{5,5,20},{5,5,32}, +{5,5,32},{6,6,724},{6,6,700},{6,6,735},{5,6,690},{5,7,385},{5,6,337},{5,6,177},{5,6,545},{5,6,328},{5,6,488},{6,6,195},{6,6,171},{6,6,206},{6,6,278},{7,4,259},{5,6,216},{5,6,56},{4,6,376},{7,5,259},{4,6,376},{5,7,654},{5,7,654},{5,7,654},{5,6,654},{5,7,189},{5,6,141},{5,6,141},{5,6,509},{5,6,132},{5,5,450},{6,5,157}, +{6,5,157},{6,5,157},{6,5,221},{6,5,52},{5,6,20},{5,6,20},{6,5,256},{3,7,52},{6,5,256},{6,6,74},{6,6,50},{6,6,85},{5,6,40},{6,6,74},{4,7,74},{5,6,40},{0,6,360},{4,7,74},{0,6,360},{5,0,650},{5,0,650},{5,0,650},{5,0,650},{5,6,137},{5,6,137},{5,6,137},{5,6,185},{5,6,128},{5,6,128},{6,7,378},{6,6,316},{6,6,239}, +{6,6,247},{6,6,476},{6,6,396},{6,6,319},{5,6,465},{4,7,332},{5,6,104},{6,7,153},{6,6,91},{6,6,14},{6,6,22},{6,6,251},{5,7,144},{6,6,94},{5,6,104},{4,7,251},{5,6,104},{6,6,235},{6,6,235},{6,6,235},{6,6,243},{6,6,307},{6,6,315},{6,6,315},{5,6,461},{5,6,100},{5,6,100},{6,6,10},{6,6,10},{6,6,10},{6,6,18},{7,4,50}, +{6,6,90},{6,6,90},{5,6,100},{7,5,50},{5,6,100},{7,5,74},{6,6,82},{6,6,5},{6,6,13},{7,5,74},{6,6,90},{6,6,13},{0,6,104},{6,6,90},{0,6,104},{6,0,234},{6,0,234},{6,0,234},{6,0,234},{6,5,241},{6,5,241},{6,5,241},{6,5,289},{5,6,0},{5,6,0},{6,7,154},{6,7,106},{6,6,255},{6,6,199},{6,7,325},{6,6,364},{6,6,175}, +{6,6,178},{5,7,292},{5,6,232},{6,7,105},{6,7,57},{6,6,206},{6,6,150},{7,5,251},{5,7,144},{6,6,126},{6,6,129},{5,7,276},{6,6,129},{6,7,90},{6,7,90},{6,7,90},{6,6,99},{6,6,131},{6,6,75},{6,6,75},{6,6,78},{6,6,219},{5,6,132},{6,7,41},{6,7,41},{6,7,41},{6,6,50},{7,5,82},{6,6,26},{6,6,26},{6,6,29},{6,6,50}, +{6,6,29},{6,7,80},{6,7,32},{6,6,181},{6,6,125},{6,7,80},{7,6,80},{6,6,125},{0,6,104},{7,6,80},{0,6,104},{6,0,74},{6,0,74},{6,0,74},{6,0,74},{6,6,50},{6,6,50},{6,6,50},{6,6,74},{5,6,128},{5,6,128},{6,7,442},{6,7,202},{6,7,442},{6,7,490},{6,7,309},{6,7,117},{6,7,357},{6,6,370},{5,7,324},{6,6,394},{6,7,441}, +{6,7,201},{6,7,441},{6,7,489},{7,6,276},{6,7,116},{6,7,356},{6,6,369},{7,6,244},{6,6,369},{6,7,186},{6,7,186},{6,7,186},{6,7,234},{6,7,53},{6,7,101},{6,7,101},{6,6,46},{5,7,68},{6,6,70},{6,7,185},{6,7,185},{6,7,185},{6,7,233},{6,7,52},{6,7,100},{6,7,100},{6,6,45},{5,7,52},{6,6,45},{7,6,80},{6,7,32},{6,7,272}, +{5,7,272},{7,6,80},{6,7,80},{5,7,272},{0,6,360},{6,7,80},{0,6,360},{6,0,170},{6,0,170},{6,0,170},{6,0,170},{6,7,37},{6,7,37},{6,7,37},{6,6,10},{6,6,34},{6,6,34},{7,7,800},{7,7,784},{6,7,802},{6,7,634},{6,7,903},{6,7,279},{6,7,159},{6,7,591},{6,7,332},{6,7,572},{7,7,224},{7,7,208},{7,7,257},{7,7,337},{7,6,339}, +{6,7,179},{6,7,59},{5,7,419},{6,7,251},{5,7,419},{7,6,745},{7,6,745},{7,6,745},{6,7,585},{6,7,278},{6,7,110},{6,7,110},{6,6,469},{6,7,163},{6,6,385},{7,6,169},{7,6,169},{7,6,169},{7,6,225},{7,6,50},{6,7,10},{6,7,10},{7,6,226},{7,6,82},{7,6,226},{7,7,80},{7,7,64},{7,7,113},{6,7,50},{7,7,80},{7,7,144},{6,7,50}, +{0,7,410},{7,7,144},{0,7,410},{6,0,584},{6,0,584},{6,0,584},{6,0,584},{6,7,109},{6,7,109},{6,7,109},{6,7,181},{6,6,160},{6,6,160},{7,7,393},{7,7,321},{7,7,272},{7,7,288},{7,7,477},{7,7,421},{7,7,372},{6,7,446},{6,7,483},{6,7,123},{7,7,137},{7,7,65},{7,7,16},{7,7,32},{7,7,221},{7,7,165},{7,7,116},{6,7,122},{7,7,261}, +{6,7,122},{7,7,272},{7,7,272},{7,7,272},{7,7,288},{7,7,356},{7,7,372},{7,7,372},{6,7,446},{6,7,83},{6,7,123},{7,7,16},{7,7,16},{7,7,16},{7,7,32},{7,7,100},{7,7,116},{7,7,116},{6,7,122},{6,7,82},{6,7,122},{7,7,121},{7,7,49},{7,7,0},{7,7,16},{7,7,121},{7,7,65},{7,7,16},{0,7,121},{7,7,65},{0,7,121},{7,0,272}, +{7,0,272},{7,0,272},{7,0,272},{7,6,265},{7,6,265},{7,6,265},{7,6,305},{6,7,2},{6,7,2},{7,7,265},{7,7,193},{7,7,144},{7,7,96},{7,7,253},{7,7,133},{7,7,84},{7,7,109},{7,7,297},{6,7,107},{7,7,201},{7,7,129},{7,7,80},{7,7,32},{7,7,189},{7,7,69},{7,7,20},{7,7,45},{7,7,101},{7,7,45},{7,7,144},{7,7,144},{7,7,144}, +{7,7,96},{7,7,132},{7,7,84},{7,7,84},{7,7,109},{7,7,248},{6,7,107},{7,7,80},{7,7,80},{7,7,80},{7,7,32},{7,7,68},{7,7,20},{7,7,20},{7,7,45},{7,7,52},{7,7,45},{7,7,185},{7,7,113},{7,7,64},{7,7,16},{7,7,185},{7,7,65},{7,7,16},{0,7,9},{7,7,65},{0,7,9},{7,0,80},{7,0,80},{7,0,80},{7,0,80},{7,7,68}, +{7,7,68},{7,7,68},{7,7,100},{6,7,98},{6,7,98},{7,7,386},{7,7,314},{7,7,265},{7,7,193},{7,7,278},{7,7,134},{7,7,85},{7,7,4},{7,7,138},{7,7,40},{7,7,386},{7,7,314},{7,7,265},{7,7,193},{7,7,278},{7,7,134},{7,7,85},{7,7,4},{7,7,102},{7,7,4},{7,7,265},{7,7,265},{7,7,265},{7,7,193},{7,7,157},{7,7,85},{7,7,85}, +{7,7,4},{7,7,89},{7,7,40},{7,7,265},{7,7,265},{7,7,265},{7,7,193},{7,7,157},{7,7,85},{7,7,85},{7,7,4},{7,7,53},{7,7,4},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{7,0,144},{7,0,144},{7,0,144},{7,0,144},{7,7,36},{7,7,36},{7,7,36},{7,7,4},{7,7,40}, +{7,7,40},{0,1,200},{0,1,104},{0,0,153},{0,0,145},{0,1,561},{0,0,398},{0,0,181},{0,0,308},{0,0,498},{0,0,344},{0,1,200},{0,1,104},{0,0,153},{0,0,145},{0,1,561},{0,0,398},{0,0,181},{0,0,308},{0,0,462},{0,0,308},{0,0,9},{0,0,9},{0,0,9},{0,0,1},{0,0,45},{0,0,37},{0,0,37},{0,0,164},{0,0,137},{0,0,200},{0,0,9}, +{0,0,9},{0,0,9},{0,0,1},{0,0,45},{0,0,37},{0,0,37},{0,0,164},{0,0,101},{0,0,164},{0,1,200},{0,1,104},{0,0,153},{0,0,145},{0,1,200},{1,0,232},{0,0,145},{0,0,208},{1,0,232},{0,0,208},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,2,232},{0,1,40},{0,1,200}, +{0,1,392},{0,1,689},{0,1,593},{0,0,485},{0,0,500},{0,0,914},{0,0,536},{0,2,232},{0,1,40},{0,1,200},{0,1,392},{0,1,689},{0,1,593},{0,0,485},{0,0,500},{1,0,761},{0,0,500},{0,1,4},{0,1,4},{0,1,4},{0,0,49},{0,0,157},{0,0,85},{0,0,85},{0,0,100},{0,0,185},{0,0,136},{0,1,4},{0,1,4},{0,1,4},{0,0,49},{0,0,157}, +{0,0,85},{0,0,85},{0,0,100},{0,0,149},{0,0,100},{1,0,200},{0,1,40},{0,1,200},{0,1,392},{1,0,200},{1,0,232},{0,1,392},{0,0,400},{1,0,232},{0,0,400},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,2,281},{0,2,149},{0,1,121},{0,1,121},{0,2,808},{0,1,376},{0,1,216}, +{0,0,857},{0,1,1169},{0,0,893},{0,2,281},{0,2,149},{0,1,121},{0,1,121},{1,0,728},{0,1,376},{0,1,216},{0,0,857},{1,0,744},{0,0,857},{0,1,85},{0,1,85},{0,1,85},{0,1,85},{0,1,180},{0,1,180},{0,1,180},{0,0,73},{0,0,270},{0,0,109},{0,1,85},{0,1,85},{0,1,85},{0,1,85},{0,1,180},{0,1,180},{0,1,180},{0,0,73},{0,0,234}, +{0,0,73},{0,2,232},{0,2,100},{0,1,72},{0,1,72},{0,2,232},{2,0,202},{0,1,72},{0,1,712},{2,0,202},{0,1,712},{0,0,49},{0,0,49},{0,0,49},{0,0,49},{0,0,1},{0,0,1},{0,0,1},{0,0,9},{0,0,45},{0,0,45},{0,3,427},{0,2,229},{0,1,425},{0,1,233},{0,2,744},{0,1,504},{0,1,24},{0,1,584},{0,1,1105},{0,1,945},{0,3,427}, +{0,2,229},{1,1,414},{0,1,233},{0,2,744},{0,1,504},{0,1,24},{0,1,584},{2,0,739},{0,1,584},{0,2,229},{0,2,229},{0,2,229},{0,1,229},{0,1,212},{0,1,20},{0,1,20},{0,0,281},{0,0,590},{0,0,317},{0,2,229},{0,2,229},{0,2,229},{0,1,229},{1,0,180},{0,1,20},{0,1,20},{0,0,281},{1,0,164},{0,0,281},{0,3,202},{0,2,4},{1,1,53}, +{0,1,8},{0,3,202},{1,1,202},{0,1,8},{0,1,328},{1,1,202},{0,1,328},{0,0,225},{0,0,225},{0,0,225},{0,0,225},{0,1,16},{0,1,16},{0,1,16},{0,0,25},{0,0,61},{0,0,61},{0,4,842},{0,3,740},{1,1,1125},{0,1,834},{0,3,744},{0,2,267},{0,1,283},{0,1,267},{0,1,1356},{0,1,476},{1,2,302},{1,2,230},{1,1,225},{1,1,225},{0,3,728}, +{0,2,251},{0,1,267},{0,1,251},{1,1,728},{0,1,251},{0,3,596},{0,3,596},{0,3,596},{0,1,713},{0,2,186},{0,1,162},{0,1,162},{0,1,146},{0,1,395},{0,1,355},{1,1,104},{1,1,104},{1,1,104},{1,1,104},{0,2,170},{0,1,146},{0,1,146},{0,1,130},{0,1,170},{0,1,130},{1,2,202},{1,2,130},{1,1,125},{1,1,125},{1,2,202},{0,2,202},{1,1,125}, +{0,1,202},{0,2,202},{0,1,202},{0,0,592},{0,0,592},{0,0,592},{0,0,592},{0,1,41},{0,1,41},{0,1,41},{0,1,65},{0,0,200},{0,0,200},{1,3,738},{1,2,522},{1,2,722},{1,1,885},{0,4,987},{0,2,443},{0,2,379},{0,1,507},{0,2,1100},{0,1,412},{1,3,254},{1,2,38},{1,2,238},{1,1,401},{1,2,739},{0,2,299},{0,2,235},{0,1,363},{0,2,739}, +{0,1,363},{1,2,497},{1,2,497},{1,2,497},{1,1,524},{0,3,324},{0,2,154},{0,2,154},{0,1,146},{0,1,411},{0,1,51},{1,2,13},{1,2,13},{1,2,13},{1,1,40},{1,1,164},{0,2,10},{0,2,10},{0,1,2},{1,1,180},{0,1,2},{2,1,202},{1,2,34},{1,2,234},{0,2,234},{2,1,202},{4,0,202},{0,2,234},{0,1,362},{4,0,202},{0,1,362},{1,0,488}, +{1,0,488},{1,0,488},{1,0,488},{0,2,145},{0,2,145},{0,2,145},{0,1,145},{0,1,50},{0,1,50},{1,3,450},{1,3,362},{1,2,306},{1,2,330},{1,2,1015},{1,2,583},{1,2,463},{1,1,990},{0,2,940},{0,1,860},{1,3,254},{1,3,166},{1,2,110},{1,2,134},{0,4,731},{0,3,288},{0,2,155},{1,1,794},{2,1,731},{1,1,794},{1,2,257},{1,2,257},{1,2,257}, +{1,2,281},{1,2,390},{1,1,392},{1,1,392},{1,1,261},{0,2,315},{0,1,131},{1,2,61},{1,2,61},{1,2,61},{1,2,85},{2,0,164},{0,2,106},{0,2,106},{1,1,65},{3,0,164},{1,1,65},{3,0,208},{1,3,130},{1,2,74},{0,2,74},{3,0,208},{3,1,208},{0,2,74},{0,1,778},{3,1,208},{0,1,778},{1,0,232},{1,0,232},{1,0,232},{1,0,232},{1,1,196}, +{1,1,196},{1,1,196},{1,1,212},{0,1,82},{0,1,82},{1,4,440},{1,3,234},{1,2,402},{1,2,234},{1,3,767},{1,2,503},{1,2,63},{1,2,687},{0,3,1140},{0,2,396},{1,4,404},{1,3,198},{1,2,366},{1,2,198},{1,3,731},{0,3,224},{1,2,27},{0,2,387},{1,2,731},{0,2,387},{1,3,233},{1,3,233},{1,3,233},{1,2,233},{1,2,230},{1,2,62},{1,2,62}, +{1,1,277},{0,2,203},{1,1,385},{1,3,197},{1,3,197},{1,3,197},{1,2,197},{0,4,162},{1,2,26},{1,2,26},{1,1,241},{2,1,162},{1,1,241},{2,2,208},{1,3,2},{2,2,65},{1,2,2},{2,2,208},{5,0,208},{1,2,2},{0,2,362},{5,0,208},{0,2,362},{1,0,232},{1,0,232},{1,0,232},{1,0,232},{1,2,61},{1,2,61},{1,2,61},{1,1,52},{0,2,34}, +{0,2,34},{1,5,810},{1,3,702},{1,2,1122},{1,2,738},{1,4,748},{1,3,281},{1,2,225},{1,2,273},{0,3,780},{0,2,252},{2,3,329},{2,3,281},{2,2,222},{2,2,230},{2,2,731},{1,3,272},{1,2,216},{0,2,216},{5,0,731},{0,2,216},{1,4,547},{1,4,547},{1,4,547},{1,2,638},{1,3,173},{1,2,125},{1,2,125},{1,2,173},{0,3,339},{0,2,152},{2,2,122}, +{2,2,122},{2,2,122},{2,2,130},{1,3,164},{1,2,116},{1,2,116},{0,2,116},{1,2,164},{0,2,116},{2,3,208},{2,3,160},{2,2,101},{2,2,109},{2,3,208},{6,0,208},{2,2,109},{0,2,200},{6,0,208},{0,2,200},{1,0,538},{1,0,538},{1,0,538},{1,0,538},{1,2,25},{1,2,25},{1,2,25},{1,2,73},{0,2,52},{0,2,52},{2,3,810},{2,3,570},{2,3,810}, +{2,2,887},{1,4,940},{1,3,393},{1,3,393},{1,2,449},{0,3,1004},{1,2,392},{2,3,281},{2,3,41},{2,3,281},{2,2,358},{3,1,731},{1,3,272},{1,3,272},{1,2,328},{4,1,731},{1,2,328},{2,3,554},{2,3,554},{2,3,554},{2,2,563},{1,4,315},{1,3,137},{1,3,137},{1,2,125},{0,3,163},{1,2,68},{2,3,25},{2,3,25},{2,3,25},{2,2,34},{2,2,162}, +{1,3,16},{1,3,16},{1,2,4},{5,0,162},{1,2,4},{4,0,208},{2,3,32},{2,3,272},{1,3,272},{4,0,208},{5,1,208},{1,3,272},{0,2,328},{5,1,208},{0,2,328},{2,0,538},{2,0,538},{2,0,538},{2,0,538},{1,3,121},{1,3,121},{1,3,121},{1,2,121},{1,2,64},{1,2,64},{2,4,458},{2,3,410},{2,3,330},{2,3,378},{2,3,1013},{2,3,629},{1,3,505}, +{2,2,962},{0,4,772},{1,2,776},{2,4,233},{2,3,185},{2,3,105},{2,3,153},{4,0,724},{1,4,323},{1,3,144},{2,2,737},{3,2,724},{2,2,737},{2,3,266},{2,3,266},{2,3,266},{2,3,314},{2,3,437},{2,2,395},{2,2,395},{2,2,286},{1,3,356},{1,2,100},{2,3,41},{2,3,41},{2,3,41},{2,3,89},{3,1,162},{1,3,80},{1,3,80},{2,2,61},{4,1,162}, +{2,2,61},{2,4,208},{2,3,160},{2,3,80},{1,3,80},{2,4,208},{7,0,208},{1,3,80},{0,2,712},{7,0,208},{0,2,712},{2,0,250},{2,0,250},{2,0,250},{2,0,250},{2,2,226},{2,2,226},{2,2,226},{2,2,250},{1,2,64},{1,2,64},{2,5,436},{2,4,222},{2,3,362},{2,3,218},{2,4,773},{2,3,485},{2,3,85},{2,3,773},{0,4,804},{1,3,452},{2,5,387}, +{2,4,173},{2,3,313},{2,3,169},{2,4,724},{1,4,211},{2,3,36},{1,3,436},{7,0,724},{1,3,436},{2,4,218},{2,4,218},{2,4,218},{2,3,218},{2,3,229},{2,3,85},{2,3,85},{2,2,254},{1,3,196},{2,2,374},{2,4,169},{2,4,169},{2,4,169},{2,3,169},{4,0,164},{2,3,36},{2,3,36},{2,2,205},{3,2,164},{2,2,205},{3,3,202},{2,4,4},{3,3,81}, +{2,3,0},{3,3,202},{6,1,202},{2,3,0},{0,3,400},{6,1,202},{0,3,400},{2,0,218},{2,0,218},{2,0,218},{2,0,218},{2,3,85},{2,3,85},{2,3,85},{2,2,58},{1,3,52},{1,3,52},{2,5,760},{2,4,618},{2,3,1010},{2,3,650},{2,5,760},{2,4,303},{2,3,175},{2,3,287},{1,4,788},{1,3,236},{3,4,362},{3,4,338},{3,3,225},{3,3,241},{3,3,724}, +{2,4,299},{2,3,171},{1,3,211},{6,1,724},{1,3,211},{2,5,504},{2,5,504},{2,5,504},{2,3,569},{2,4,166},{2,3,94},{2,3,94},{2,3,206},{0,4,363},{1,3,155},{3,3,144},{3,3,144},{3,3,144},{3,3,160},{2,4,162},{2,3,90},{2,3,90},{1,3,130},{7,0,162},{1,3,130},{4,2,208},{2,4,130},{3,3,81},{3,3,97},{4,2,208},{5,2,208},{3,3,97}, +{0,3,202},{5,2,208},{0,3,202},{2,0,488},{2,0,488},{2,0,488},{2,0,488},{2,3,13},{2,3,13},{2,3,13},{2,3,85},{1,3,34},{1,3,34},{3,4,842},{3,4,626},{3,4,906},{3,3,897},{2,5,888},{2,4,351},{2,4,415},{2,3,399},{0,5,788},{2,3,380},{3,4,266},{3,4,50},{3,4,330},{3,3,321},{4,2,724},{2,4,251},{2,4,315},{2,3,299},{5,2,724}, +{2,3,299},{3,4,617},{3,4,617},{3,4,617},{3,3,608},{2,5,312},{2,4,126},{2,4,126},{2,3,110},{1,4,164},{2,3,91},{3,4,41},{3,4,41},{3,4,41},{3,3,32},{3,3,164},{2,4,26},{2,4,26},{2,3,10},{6,1,164},{2,3,10},{5,1,202},{3,4,34},{3,4,314},{3,3,305},{5,1,202},{4,3,202},{3,3,305},{0,3,298},{4,3,202},{0,3,298},{3,0,592}, +{3,0,592},{3,0,592},{3,0,592},{2,4,101},{2,4,101},{2,4,101},{2,3,101},{2,3,82},{2,3,82},{3,5,474},{3,4,402},{3,4,362},{3,4,434},{3,4,1019},{3,4,683},{2,4,463},{3,3,942},{1,5,804},{2,3,700},{3,5,218},{3,4,146},{3,4,106},{3,4,178},{5,1,723},{2,5,364},{2,4,139},{3,3,686},{4,3,723},{3,3,686},{3,4,281},{3,4,281},{3,4,281}, +{3,4,353},{3,4,490},{2,4,382},{2,4,382},{3,3,317},{1,4,324},{2,3,75},{3,4,25},{3,4,25},{3,4,25},{3,4,97},{4,2,164},{2,4,58},{2,4,58},{3,3,61},{5,2,164},{3,3,61},{6,0,202},{3,4,130},{3,4,90},{2,4,90},{6,0,202},{3,4,202},{2,4,90},{0,3,650},{3,4,202},{0,3,650},{3,0,272},{3,0,272},{3,0,272},{3,0,272},{3,3,260}, +{3,3,260},{3,3,260},{3,3,292},{2,3,50},{2,3,50},{3,6,440},{3,5,218},{3,4,330},{3,4,210},{3,5,787},{3,4,475},{3,4,115},{3,4,867},{1,5,772},{2,4,516},{3,6,376},{3,5,154},{3,4,266},{3,4,146},{6,0,723},{2,5,204},{3,4,51},{1,4,478},{3,4,723},{1,4,478},{3,5,209},{3,5,209},{3,5,209},{3,4,209},{3,4,234},{3,4,114},{3,4,114}, +{3,3,237},{2,4,195},{3,3,369},{3,5,145},{3,5,145},{3,5,145},{3,4,145},{5,1,170},{3,4,50},{3,4,50},{3,3,173},{7,1,170},{3,3,173},{4,4,200},{3,5,10},{4,4,101},{3,4,2},{4,4,200},{7,2,200},{3,4,2},{0,4,442},{7,2,200},{0,4,442},{3,0,208},{3,0,208},{3,0,208},{3,0,208},{3,3,100},{3,3,100},{3,3,100},{3,3,68},{2,4,74}, +{2,4,74},{3,6,692},{3,5,542},{3,4,906},{3,4,570},{3,6,780},{3,5,333},{3,4,133},{3,4,309},{2,5,804},{2,4,228},{4,5,401},{4,4,395},{4,4,234},{4,4,258},{4,4,723},{3,5,332},{3,4,132},{2,4,212},{7,2,723},{2,4,212},{3,6,467},{3,6,467},{3,6,467},{3,4,506},{3,5,165},{3,4,69},{3,4,69},{3,4,245},{1,5,324},{2,4,164},{4,4,170}, +{4,4,170},{4,4,170},{4,4,194},{6,0,164},{3,4,68},{3,4,68},{2,4,148},{3,4,164},{2,4,148},{5,3,202},{3,5,100},{4,4,65},{4,4,89},{5,3,202},{6,3,202},{4,4,89},{0,4,208},{6,3,202},{0,4,208},{3,0,442},{3,0,442},{3,0,442},{3,0,442},{3,4,5},{3,4,5},{3,4,5},{3,4,101},{2,4,20},{2,4,20},{4,5,882},{4,5,690},{4,4,955}, +{4,4,915},{3,6,844},{3,5,317},{3,5,445},{3,4,357},{1,6,772},{3,4,376},{4,5,257},{4,5,65},{4,4,330},{4,4,290},{5,3,723},{3,5,236},{3,5,364},{3,4,276},{6,3,723},{3,4,276},{4,5,686},{4,5,686},{4,5,686},{4,4,659},{3,6,315},{3,5,121},{3,5,121},{3,4,101},{2,5,171},{3,4,120},{4,5,61},{4,5,61},{4,5,61},{4,4,34},{5,2,170}, +{3,5,40},{3,5,40},{3,4,20},{7,2,170},{3,4,20},{6,2,200},{4,5,40},{4,4,305},{4,4,265},{6,2,200},{5,4,200},{4,4,265},{0,4,272},{5,4,200},{0,4,272},{4,0,650},{4,0,650},{4,0,650},{4,0,650},{3,5,85},{3,5,85},{3,5,85},{3,4,85},{3,4,104},{3,4,104},{4,6,498},{4,5,402},{4,5,402},{4,5,498},{3,7,1017},{3,6,700},{3,5,429}, +{3,4,917},{2,6,844},{3,4,632},{4,6,209},{4,5,113},{4,5,113},{4,5,209},{6,2,728},{3,6,411},{3,5,140},{3,4,628},{5,4,728},{3,4,628},{4,5,302},{4,5,302},{4,5,302},{4,5,398},{3,6,459},{3,5,329},{3,5,329},{3,4,341},{2,5,283},{3,4,56},{4,5,13},{4,5,13},{4,5,13},{4,5,109},{6,1,170},{3,5,40},{3,5,40},{3,4,52},{6,3,170}, +{3,4,52},{7,1,200},{4,5,104},{4,5,104},{3,5,104},{7,1,200},{4,5,200},{3,5,104},{0,4,592},{4,5,200},{0,4,592},{4,0,298},{4,0,298},{4,0,298},{4,0,298},{4,4,298},{4,4,298},{4,4,298},{3,4,325},{3,4,40},{3,4,40},{4,7,452},{4,6,222},{4,5,306},{4,5,210},{4,6,809},{4,5,473},{4,5,153},{4,5,969},{2,6,748},{3,5,588},{4,7,371}, +{4,6,141},{4,5,225},{4,5,129},{7,1,728},{3,6,203},{4,5,72},{2,5,513},{4,5,728},{2,5,513},{4,6,206},{4,6,206},{4,6,206},{4,5,206},{4,5,245},{4,5,149},{4,5,149},{4,4,226},{3,5,200},{4,4,370},{4,6,125},{4,6,125},{4,6,125},{4,5,125},{7,0,164},{4,5,68},{4,5,68},{4,4,145},{3,5,164},{4,4,145},{5,5,202},{4,6,20},{4,5,104}, +{4,5,8},{5,5,202},{3,6,202},{4,5,8},{0,5,488},{3,6,202},{0,5,488},{4,0,202},{4,0,202},{4,0,202},{4,0,202},{4,4,106},{4,4,106},{4,4,106},{4,4,82},{3,5,100},{3,5,100},{4,7,632},{4,6,474},{4,5,810},{4,5,498},{4,7,808},{4,6,371},{4,5,99},{4,5,339},{3,6,828},{3,5,228},{5,6,446},{5,5,396},{5,5,249},{5,5,281},{5,5,728}, +{4,6,371},{4,5,99},{3,5,219},{3,6,728},{3,5,219},{4,7,436},{4,7,436},{4,7,436},{4,5,449},{4,6,170},{4,5,50},{4,5,50},{4,5,290},{2,6,291},{3,5,179},{5,5,200},{5,5,200},{5,5,200},{5,5,232},{7,1,170},{4,5,50},{4,5,50},{3,5,170},{7,3,170},{3,5,170},{6,4,200},{4,6,74},{5,5,53},{5,5,85},{6,4,200},{7,4,200},{5,5,85}, +{0,5,218},{7,4,200},{0,5,218},{4,0,400},{4,0,400},{4,0,400},{4,0,400},{4,5,1},{4,5,1},{4,5,1},{4,4,100},{3,5,10},{3,5,10},{5,6,930},{5,6,762},{5,5,973},{5,5,941},{4,7,808},{4,6,291},{4,6,483},{4,5,323},{2,7,764},{4,5,380},{5,6,254},{5,6,86},{5,5,297},{5,5,265},{6,4,728},{4,6,227},{5,5,373},{4,5,259},{7,4,728}, +{4,5,259},{5,5,748},{5,5,748},{5,5,748},{5,5,716},{4,6,298},{4,6,122},{4,6,122},{4,5,98},{3,6,184},{4,5,155},{5,5,72},{5,5,72},{5,5,72},{5,5,40},{6,3,164},{4,6,58},{4,6,58},{4,5,34},{6,4,164},{4,5,34},{7,3,202},{5,6,50},{5,5,261},{5,5,229},{7,3,202},{6,5,202},{5,5,229},{0,5,250},{6,5,202},{0,5,250},{5,0,712}, +{5,0,712},{5,0,712},{5,0,712},{4,6,73},{4,6,73},{4,6,73},{4,5,73},{4,5,130},{4,5,130},{5,7,530},{5,6,410},{5,6,450},{5,6,570},{5,6,1055},{4,7,720},{4,6,403},{4,5,819},{3,7,892},{4,5,572},{5,7,206},{5,6,86},{5,6,126},{5,6,246},{5,6,731},{3,7,387},{4,6,147},{4,5,563},{4,6,731},{4,5,563},{5,6,329},{5,6,329},{5,6,329}, +{5,5,428},{4,7,420},{4,6,282},{4,6,282},{4,5,290},{3,6,248},{4,5,43},{5,6,5},{5,6,5},{5,6,5},{5,5,104},{7,2,164},{4,6,26},{4,6,26},{4,5,34},{5,5,164},{4,5,34},{5,7,202},{5,6,82},{5,6,122},{4,6,122},{5,7,202},{5,6,202},{4,6,122},{0,5,538},{5,6,202},{0,5,538},{5,0,328},{5,0,328},{5,0,328},{5,0,328},{4,6,281}, +{4,6,281},{4,6,281},{4,5,281},{4,5,34},{4,5,34},{5,7,498},{5,7,234},{5,6,290},{5,6,218},{5,7,839},{5,6,479},{5,6,199},{5,6,1079},{3,7,732},{4,6,668},{5,7,398},{5,7,134},{5,6,190},{5,6,118},{6,5,731},{4,7,208},{5,6,99},{3,6,554},{3,7,731},{3,6,554},{5,7,209},{5,7,209},{5,7,209},{5,6,209},{5,6,262},{5,6,190},{5,6,190}, +{5,5,221},{4,6,211},{4,5,315},{5,7,109},{5,7,109},{5,7,109},{5,6,109},{5,6,162},{5,6,90},{5,6,90},{5,5,121},{4,6,162},{5,5,121},{7,4,208},{5,7,34},{5,6,90},{5,6,18},{7,4,208},{7,5,208},{5,6,18},{0,6,538},{7,5,208},{0,6,538},{5,0,200},{5,0,200},{5,0,200},{5,0,200},{5,5,116},{5,5,116},{5,5,116},{5,5,100},{4,6,130}, +{4,6,130},{5,7,1074},{5,7,414},{5,6,722},{5,6,434},{5,7,857},{5,7,417},{5,6,73},{5,6,377},{4,7,860},{4,6,236},{6,7,497},{6,6,403},{6,6,270},{6,6,310},{7,4,731},{4,7,379},{5,6,72},{4,6,232},{7,5,731},{4,6,232},{5,7,398},{5,7,398},{5,7,398},{5,6,398},{5,7,181},{5,6,37},{5,6,37},{5,6,341},{3,7,264},{4,6,200},{6,6,234}, +{6,6,234},{6,6,234},{6,6,274},{6,5,164},{5,6,36},{5,6,36},{4,6,196},{3,7,164},{4,6,196},{7,5,202},{5,7,52},{6,6,45},{5,6,72},{7,5,202},{6,6,218},{5,6,72},{0,6,232},{6,6,218},{0,6,232},{5,0,362},{5,0,362},{5,0,362},{5,0,362},{5,6,1},{5,6,1},{5,6,1},{5,5,82},{4,6,4},{4,6,4},{6,7,986},{6,7,842},{6,6,999}, +{6,6,975},{5,7,1417},{5,7,273},{5,6,505},{5,6,297},{4,7,828},{5,6,392},{6,7,257},{6,7,113},{6,6,270},{6,6,246},{7,5,739},{5,7,224},{6,6,366},{5,6,248},{6,6,731},{5,6,248},{6,6,803},{6,6,803},{6,6,803},{6,6,779},{5,7,261},{5,7,129},{5,7,129},{5,6,101},{4,7,203},{5,6,196},{6,6,74},{6,6,74},{6,6,74},{6,6,50},{7,4,162}, +{5,7,80},{5,7,80},{5,6,52},{7,5,162},{5,6,52},{6,7,208},{6,7,64},{6,6,221},{6,6,197},{6,7,208},{7,6,208},{6,6,197},{0,6,232},{7,6,208},{0,6,232},{5,0,778},{5,0,778},{5,0,778},{5,0,778},{5,7,65},{5,7,65},{5,7,65},{5,6,65},{5,6,160},{5,6,160},{6,7,762},{6,7,426},{6,7,506},{6,7,650},{6,7,1085},{5,7,641},{5,7,385}, +{5,6,729},{5,7,980},{5,6,520},{6,7,401},{6,7,65},{6,7,145},{6,7,289},{6,7,724},{5,7,416},{5,7,160},{5,6,504},{5,7,724},{5,6,504},{6,7,362},{6,7,362},{6,7,362},{6,6,443},{6,6,555},{5,7,241},{5,7,241},{5,6,245},{4,7,219},{5,6,36},{6,7,1},{6,7,1},{6,7,1},{6,6,82},{7,5,194},{5,7,16},{5,7,16},{5,6,20},{6,6,162}, +{5,6,20},{7,6,208},{6,7,64},{6,7,144},{5,7,144},{7,6,208},{6,7,208},{5,7,144},{0,6,488},{6,7,208},{0,6,488},{6,0,362},{6,0,362},{6,0,362},{6,0,362},{5,7,241},{5,7,241},{5,7,241},{5,6,241},{5,6,32},{5,6,32},{6,7,1050},{6,7,522},{6,7,282},{6,7,234},{6,7,1069},{6,7,493},{6,7,253},{6,6,1122},{5,7,1012},{5,7,756},{7,7,843}, +{6,7,401},{6,7,161},{6,7,113},{7,6,724},{6,7,372},{6,7,132},{4,7,601},{6,7,756},{4,7,601},{6,7,266},{6,7,266},{6,7,266},{6,7,218},{6,7,285},{6,7,237},{6,7,237},{6,6,222},{5,7,228},{5,6,260},{6,7,145},{6,7,145},{6,7,145},{6,7,97},{6,7,164},{6,7,116},{6,7,116},{6,6,101},{5,7,164},{6,6,101},{7,7,218},{7,7,178},{6,7,80}, +{6,7,32},{7,7,218},{6,7,272},{6,7,32},{0,7,592},{6,7,272},{0,7,592},{6,0,202},{6,0,202},{6,0,202},{6,0,202},{6,6,130},{6,6,130},{6,6,130},{6,6,122},{5,6,160},{5,6,160},{6,7,1641},{6,7,1017},{6,7,617},{6,7,353},{6,7,1318},{6,7,430},{6,7,30},{6,7,398},{6,7,1035},{5,7,227},{7,7,393},{7,7,321},{7,7,272},{7,7,320},{7,7,621}, +{6,7,426},{6,7,26},{5,7,226},{6,7,594},{5,7,226},{6,7,617},{6,7,617},{6,7,617},{6,7,353},{6,7,294},{6,7,30},{6,7,30},{6,7,398},{5,7,291},{5,7,227},{7,7,272},{7,7,272},{7,7,272},{7,7,320},{7,6,162},{6,7,26},{6,7,26},{5,7,226},{7,6,194},{5,7,226},{7,7,137},{7,7,65},{7,7,16},{6,7,25},{7,7,137},{7,7,113},{6,7,25}, +{0,7,225},{7,7,113},{0,7,225},{6,0,328},{6,0,328},{6,0,328},{6,0,328},{6,7,5},{6,7,5},{6,7,5},{6,6,68},{5,7,2},{5,7,2},{7,7,985},{7,7,913},{7,7,864},{7,7,848},{7,7,1117},{6,7,654},{6,7,254},{6,7,110},{6,7,763},{5,7,179},{7,7,201},{7,7,129},{7,7,80},{7,7,64},{7,7,333},{7,7,245},{7,7,196},{6,7,74},{7,7,373}, +{6,7,74},{7,7,864},{7,7,864},{7,7,864},{7,7,848},{6,7,710},{6,7,254},{6,7,254},{6,7,110},{6,7,363},{5,7,179},{7,7,80},{7,7,80},{7,7,80},{7,7,64},{7,7,212},{7,7,196},{7,7,196},{6,7,74},{6,7,194},{6,7,74},{7,7,137},{7,7,65},{7,7,16},{7,7,0},{7,7,137},{7,7,49},{7,7,0},{0,7,49},{7,7,49},{0,7,49},{6,0,712}, +{6,0,712},{6,0,712},{6,0,712},{6,7,85},{6,7,85},{6,7,85},{6,7,61},{5,7,130},{5,7,130},{7,7,642},{7,7,570},{7,7,521},{7,7,449},{7,7,678},{7,7,534},{7,7,485},{6,7,205},{6,7,834},{6,7,34},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,278},{7,7,134},{7,7,85},{6,7,9},{7,7,198},{6,7,9},{7,7,521},{7,7,521},{7,7,521}, +{7,7,449},{7,7,557},{7,7,485},{7,7,485},{6,7,205},{6,7,434},{6,7,34},{7,7,121},{7,7,121},{7,7,121},{7,7,49},{7,7,157},{7,7,85},{7,7,85},{6,7,9},{7,7,149},{6,7,9},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{7,0,400},{7,0,400},{7,0,400},{7,0,400},{6,7,421}, +{6,7,421},{6,7,421},{6,7,205},{6,7,34},{6,7,34},{7,7,450},{7,7,378},{7,7,329},{7,7,257},{7,7,390},{7,7,246},{7,7,197},{7,7,148},{7,7,426},{6,7,130},{7,7,306},{7,7,234},{7,7,185},{7,7,113},{7,7,246},{7,7,102},{7,7,53},{7,7,4},{7,7,102},{7,7,4},{7,7,329},{7,7,329},{7,7,329},{7,7,257},{7,7,269},{7,7,197},{7,7,197}, +{7,7,148},{7,7,377},{6,7,130},{7,7,185},{7,7,185},{7,7,185},{7,7,113},{7,7,125},{7,7,53},{7,7,53},{7,7,4},{7,7,53},{7,7,4},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{7,0,208},{7,0,208},{7,0,208},{7,0,208},{7,7,148},{7,7,148},{7,7,148},{7,7,148},{6,7,130}, +{6,7,130},{0,2,445},{0,1,157},{0,1,117},{0,1,405},{0,1,926},{0,1,806},{0,0,670},{0,0,741},{0,0,1169},{0,0,777},{0,2,445},{0,1,157},{0,1,117},{0,1,405},{0,1,926},{0,1,806},{0,0,670},{0,0,741},{1,0,990},{0,0,741},{0,1,36},{0,1,36},{0,1,36},{0,0,9},{0,0,85},{0,0,45},{0,0,45},{0,0,116},{0,0,145},{0,0,152},{0,1,36}, +{0,1,36},{0,1,36},{0,0,9},{0,0,85},{0,0,45},{0,0,45},{0,0,116},{0,0,109},{0,0,116},{1,0,421},{0,1,157},{0,1,117},{0,1,405},{1,0,421},{0,1,445},{0,1,405},{0,0,641},{0,1,445},{0,0,641},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,2,461},{0,2,109},{0,1,5}, +{0,1,101},{0,1,1326},{0,1,822},{0,1,462},{0,0,1205},{0,1,1783},{0,0,1241},{0,2,461},{0,2,109},{0,1,5},{0,1,101},{1,0,1294},{0,1,822},{0,1,462},{0,0,1205},{1,0,1262},{0,0,1205},{0,1,4},{0,1,4},{0,1,4},{0,1,100},{0,0,261},{0,0,157},{0,0,157},{0,0,116},{0,0,257},{0,0,152},{0,1,4},{0,1,4},{0,1,4},{0,1,100},{0,0,261}, +{0,0,157},{0,0,157},{0,0,116},{0,0,221},{0,0,116},{1,1,461},{0,2,109},{0,1,5},{0,1,101},{1,1,461},{2,0,421},{0,1,101},{0,1,901},{2,0,421},{0,1,901},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,3,430},{0,2,38},{0,1,158},{0,1,62},{0,2,1517},{0,1,989},{0,1,309}, +{0,1,1317},{0,1,1878},{0,1,1678},{0,3,430},{0,2,38},{0,1,158},{0,1,62},{0,2,1517},{0,1,989},{0,1,309},{0,1,1317},{0,1,1517},{0,1,1317},{0,2,13},{0,2,13},{0,2,13},{0,1,13},{0,1,356},{0,1,260},{0,1,260},{0,0,193},{0,0,446},{0,0,229},{0,2,13},{0,2,13},{0,2,13},{0,1,13},{0,1,356},{0,1,260},{0,1,260},{0,0,193},{0,0,410}, +{0,0,193},{0,3,421},{0,2,29},{0,1,149},{0,1,53},{0,3,421},{1,1,421},{0,1,53},{0,1,533},{1,1,421},{0,1,533},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,49},{0,0,85},{0,0,85},{0,4,602},{0,3,234},{0,2,518},{0,1,382},{0,3,1622},{0,2,825},{0,1,325},{0,1,821},{0,1,2022},{0,1,1182},{0,4,602}, +{0,3,234},{0,2,518},{0,1,382},{1,1,1526},{0,2,825},{0,1,325},{0,1,821},{2,0,1526},{0,1,821},{0,2,157},{0,2,157},{0,2,157},{0,1,157},{0,1,388},{0,1,100},{0,1,100},{0,0,401},{0,0,766},{0,0,437},{0,2,157},{0,2,157},{0,2,157},{0,1,157},{1,0,356},{0,1,100},{0,1,100},{0,0,401},{1,0,340},{0,0,401},{1,2,425},{0,3,113},{1,1,234}, +{0,1,261},{1,2,425},{0,2,425},{0,1,261},{0,1,421},{0,2,425},{0,1,421},{0,0,121},{0,0,121},{0,0,121},{0,0,121},{0,0,25},{0,0,25},{0,0,25},{0,0,1},{0,0,37},{0,0,37},{0,4,845},{0,3,405},{0,2,725},{0,2,549},{0,3,1541},{0,2,654},{0,2,270},{0,1,722},{0,2,2583},{0,1,1083},{1,3,657},{1,2,345},{1,2,345},{0,2,549},{2,0,1517}, +{0,2,654},{0,2,270},{0,1,722},{3,0,1517},{0,1,722},{0,3,404},{0,3,404},{0,3,404},{0,2,449},{0,2,346},{0,2,170},{0,2,170},{0,1,146},{0,1,707},{0,1,507},{1,1,232},{1,1,232},{1,1,232},{1,1,200},{0,2,346},{0,2,170},{0,2,170},{0,1,146},{0,1,346},{0,1,146},{2,1,421},{0,3,5},{1,2,149},{0,2,149},{2,1,421},{4,0,421},{0,2,149}, +{0,1,601},{4,0,421},{0,1,601},{0,0,400},{0,0,400},{0,0,400},{0,0,400},{0,1,1},{0,1,1},{0,1,1},{0,0,100},{0,0,136},{0,0,136},{0,5,1209},{0,4,937},{1,2,1197},{0,2,789},{0,4,1526},{0,3,737},{0,2,14},{0,1,1042},{0,2,2487},{0,1,1403},{1,3,481},{1,3,173},{1,2,41},{1,2,161},{1,2,1526},{0,3,737},{0,2,14},{0,1,1042},{2,1,1526}, +{0,1,1042},{0,4,793},{0,4,793},{0,4,793},{0,2,785},{0,3,356},{0,2,10},{0,2,10},{0,1,18},{0,1,899},{0,1,379},{1,2,37},{1,2,37},{1,2,37},{1,1,136},{1,1,340},{0,2,10},{0,2,10},{0,1,18},{1,1,356},{0,1,18},{3,0,425},{1,3,137},{1,2,5},{0,2,5},{3,0,425},{3,1,425},{0,2,5},{0,2,965},{3,1,425},{0,2,965},{0,0,784}, +{0,0,784},{0,0,784},{0,0,784},{0,2,9},{0,2,9},{0,2,9},{0,1,9},{0,0,360},{0,0,360},{1,4,1158},{1,3,758},{1,2,850},{1,2,778},{0,4,1671},{0,3,546},{0,2,191},{0,2,903},{0,2,2390},{0,2,1430},{1,4,429},{1,3,29},{1,2,121},{1,2,49},{2,1,1526},{0,3,497},{0,2,142},{0,2,854},{4,0,1526},{0,2,854},{1,3,742},{1,3,742},{1,3,742}, +{1,2,742},{0,3,437},{0,2,155},{0,2,155},{0,1,195},{0,2,946},{0,1,290},{1,3,13},{1,3,13},{1,3,13},{1,2,13},{2,0,340},{0,2,106},{0,2,106},{0,1,146},{3,0,340},{0,1,146},{1,4,425},{1,3,25},{1,2,117},{1,2,45},{1,4,425},{2,2,425},{1,2,45},{0,2,565},{2,2,425},{0,2,565},{1,0,733},{1,0,733},{1,0,733},{1,0,733},{0,2,74}, +{0,2,74},{0,2,74},{0,1,74},{0,1,169},{0,1,169},{1,4,966},{1,4,606},{1,3,886},{1,2,682},{0,5,1742},{0,3,866},{0,3,641},{0,2,727},{0,3,2382},{0,2,758},{1,4,605},{1,4,245},{1,3,525},{1,2,321},{3,0,1517},{0,3,641},{1,2,302},{0,2,502},{3,1,1517},{0,2,502},{1,3,486},{1,3,486},{1,3,486},{1,2,486},{0,4,563},{0,3,241},{0,3,241}, +{0,2,531},{0,2,626},{0,1,546},{1,3,125},{1,3,125},{1,3,125},{1,2,125},{0,4,338},{0,3,16},{0,3,16},{0,2,306},{2,1,338},{0,2,306},{3,1,433},{1,4,145},{2,2,212},{1,2,221},{3,1,433},{6,0,433},{1,2,221},{0,2,421},{6,0,433},{0,2,421},{1,0,461},{1,0,461},{1,0,461},{1,0,461},{0,3,225},{0,3,225},{0,3,225},{0,2,306},{0,1,185}, +{0,1,185},{1,5,894},{1,4,462},{1,3,778},{1,3,646},{1,4,1626},{1,3,749},{1,3,429},{1,2,809},{0,3,2022},{0,2,614},{2,4,706},{1,4,362},{2,3,410},{1,3,546},{3,1,1526},{0,4,441},{0,3,227},{0,2,565},{4,1,1526},{0,2,565},{1,4,462},{1,4,462},{1,4,462},{1,3,525},{1,3,440},{1,2,296},{1,2,296},{1,2,280},{0,2,725},{0,2,85},{2,2,250}, +{2,2,250},{2,2,250},{2,2,226},{1,3,340},{0,3,106},{0,3,106},{0,2,36},{1,2,340},{0,2,36},{3,2,425},{1,4,1},{2,3,185},{0,3,146},{3,2,425},{5,1,425},{0,3,146},{0,2,565},{5,1,425},{0,2,565},{1,0,461},{1,0,461},{1,0,461},{1,0,461},{1,2,100},{1,2,100},{1,2,100},{1,1,181},{0,2,49},{0,2,49},{1,6,1166},{1,4,878},{1,3,1226}, +{1,3,742},{1,5,1545},{1,4,798},{1,3,29},{1,2,985},{0,3,2246},{0,2,1030},{2,4,482},{2,4,218},{2,3,58},{2,3,202},{2,3,1517},{0,4,521},{1,3,25},{1,2,981},{6,0,1517},{1,2,981},{1,5,749},{1,5,749},{1,5,749},{1,3,733},{1,4,374},{1,3,20},{1,3,20},{1,2,24},{0,3,482},{0,2,69},{2,3,49},{2,3,49},{2,3,49},{2,2,130},{2,2,338}, +{1,3,16},{1,3,16},{1,2,20},{5,0,338},{1,2,20},{4,1,433},{1,4,145},{2,3,9},{1,3,9},{4,1,433},{7,0,433},{1,3,9},{0,2,965},{7,0,433},{0,2,965},{1,0,733},{1,0,733},{1,0,733},{1,0,733},{1,3,20},{1,3,20},{1,3,20},{1,2,20},{0,2,65},{0,2,65},{2,5,1218},{2,4,810},{2,3,874},{2,3,826},{1,5,1625},{1,4,542},{1,3,141}, +{1,3,961},{0,4,1806},{0,3,642},{2,5,434},{2,4,26},{2,3,90},{2,3,42},{3,2,1517},{1,4,506},{1,3,105},{0,3,626},{5,1,1517},{0,3,626},{2,4,801},{2,4,801},{2,4,801},{2,3,801},{1,4,406},{1,3,116},{1,3,116},{1,2,152},{0,3,482},{1,2,285},{2,4,17},{2,4,17},{2,4,17},{2,3,17},{3,1,338},{1,3,80},{1,3,80},{1,2,116},{4,1,338}, +{1,2,116},{3,3,425},{2,4,25},{2,3,89},{2,3,41},{3,3,425},{6,1,425},{2,3,41},{0,3,601},{6,1,425},{0,3,601},{2,0,785},{2,0,785},{2,0,785},{2,0,785},{1,3,52},{1,3,52},{1,3,52},{1,2,52},{0,3,41},{0,3,41},{2,5,962},{2,4,618},{2,3,906},{2,3,666},{1,6,1710},{1,4,798},{1,4,663},{1,3,721},{0,4,1838},{0,3,450},{2,5,562}, +{2,4,218},{2,3,506},{2,3,266},{4,1,1514},{0,5,474},{2,3,285},{0,3,434},{4,2,1514},{0,3,434},{2,4,497},{2,4,497},{2,4,497},{2,3,497},{1,5,536},{1,4,222},{1,4,222},{1,3,552},{0,4,469},{0,3,281},{2,4,97},{2,4,97},{2,4,97},{2,3,97},{4,0,340},{1,4,26},{1,4,26},{0,3,265},{3,2,340},{0,3,265},{4,2,425},{2,4,137},{3,3,194}, +{2,3,185},{4,2,425},{5,2,425},{2,3,185},{0,3,425},{5,2,425},{0,3,425},{2,0,481},{2,0,481},{2,0,481},{2,0,481},{1,4,197},{1,4,197},{1,4,197},{1,3,296},{0,3,25},{0,3,25},{2,6,870},{2,5,446},{2,4,758},{2,4,670},{2,5,1638},{2,4,771},{2,4,515},{2,3,823},{0,5,1710},{1,3,598},{3,4,737},{2,5,325},{3,4,481},{2,4,549},{5,0,1517}, +{1,5,458},{1,4,224},{1,3,534},{3,3,1517},{1,3,534},{2,5,445},{2,5,445},{2,5,445},{2,4,526},{2,4,459},{2,3,291},{2,3,291},{2,3,339},{0,4,370},{1,3,114},{3,3,272},{3,3,272},{3,3,272},{3,3,256},{2,4,338},{1,4,80},{1,4,80},{1,3,50},{7,0,338},{1,3,50},{5,1,425},{2,5,1},{3,4,225},{1,4,160},{5,1,425},{4,3,425},{1,4,160}, +{0,3,533},{4,3,425},{0,3,533},{2,0,445},{2,0,445},{2,0,445},{2,0,445},{2,3,122},{2,3,122},{2,3,122},{2,2,185},{1,3,65},{1,3,65},{2,7,1130},{2,5,798},{2,4,1142},{2,4,702},{2,6,1571},{2,4,819},{2,4,51},{2,3,935},{0,5,1614},{1,3,950},{3,5,489},{3,5,269},{3,4,81},{3,4,249},{3,4,1514},{1,5,490},{2,4,42},{2,3,926},{7,1,1514}, +{2,3,926},{2,6,710},{2,6,710},{2,6,710},{2,4,686},{2,5,397},{2,4,35},{2,4,35},{2,3,35},{1,4,509},{1,3,50},{3,4,65},{3,4,65},{3,4,65},{3,3,128},{3,3,340},{2,4,26},{2,4,26},{2,3,26},{6,1,340},{2,3,26},{6,0,425},{2,5,113},{3,4,17},{2,4,17},{6,0,425},{3,4,425},{2,4,17},{0,3,901},{3,4,425},{0,3,901},{2,0,685}, +{2,0,685},{2,0,685},{2,0,685},{2,4,34},{2,4,34},{2,4,34},{2,3,34},{1,3,49},{1,3,49},{3,6,1286},{3,5,870},{3,4,906},{3,4,882},{2,6,1587},{2,5,546},{2,4,99},{2,4,1027},{1,5,1838},{1,4,702},{3,6,445},{3,5,29},{3,4,65},{3,4,41},{4,3,1514},{2,5,521},{2,4,74},{1,4,677},{6,2,1514},{1,4,677},{3,5,866},{3,5,866},{3,5,866}, +{3,4,866},{2,5,381},{2,4,83},{2,4,83},{2,3,115},{0,5,349},{2,3,286},{3,5,25},{3,5,25},{3,5,25},{3,4,25},{4,2,340},{2,4,58},{2,4,58},{2,3,90},{5,2,340},{2,3,90},{4,4,421},{3,5,29},{3,4,65},{3,4,41},{4,4,421},{7,2,421},{3,4,41},{0,4,641},{7,2,421},{0,4,641},{3,0,841},{3,0,841},{3,0,841},{3,0,841},{2,4,34}, +{2,4,34},{2,4,34},{2,3,34},{1,4,61},{1,4,61},{3,6,966},{3,5,614},{3,4,874},{3,4,658},{2,7,1686},{2,5,738},{2,4,659},{2,4,723},{0,6,1518},{1,4,446},{3,6,525},{3,5,173},{3,4,433},{3,4,217},{5,2,1517},{1,6,457},{3,4,274},{1,4,437},{5,3,1517},{1,4,437},{3,5,514},{3,5,514},{3,5,514},{3,4,514},{2,6,515},{2,5,209},{2,5,209}, +{2,3,579},{1,5,510},{1,4,302},{3,5,73},{3,5,73},{3,5,73},{3,4,73},{5,1,346},{2,5,40},{2,5,40},{3,3,293},{7,1,346},{3,3,293},{5,3,421},{3,5,109},{4,4,180},{3,4,153},{5,3,421},{6,3,421},{3,4,153},{0,4,433},{6,3,421},{0,4,433},{3,0,505},{3,0,505},{3,0,505},{3,0,505},{2,5,173},{2,5,173},{2,5,173},{2,3,290},{1,4,13}, +{1,4,13},{3,7,854},{3,6,438},{3,5,746},{3,5,702},{3,6,1658},{3,5,801},{3,5,609},{3,4,845},{1,6,1758},{2,4,590},{3,7,710},{3,6,294},{4,5,558},{3,5,558},{6,1,1514},{2,6,481},{2,5,227},{2,4,509},{4,4,1514},{2,4,509},{3,6,434},{3,6,434},{3,6,434},{3,5,533},{3,5,484},{3,4,292},{3,4,292},{3,4,404},{1,5,357},{2,4,149},{3,6,290}, +{3,6,290},{3,6,290},{4,4,290},{6,0,340},{2,5,58},{2,5,58},{2,4,68},{3,4,340},{2,4,68},{6,2,421},{3,6,5},{4,5,269},{2,5,178},{6,2,421},{5,4,421},{2,5,178},{0,4,505},{5,4,421},{0,4,505},{3,0,433},{3,0,433},{3,0,433},{3,0,433},{3,4,148},{3,4,148},{3,4,148},{3,3,193},{2,4,85},{2,4,85},{3,7,1206},{3,6,726},{3,5,1066}, +{3,5,670},{3,7,1605},{3,5,785},{3,5,81},{3,4,893},{1,6,1598},{2,4,878},{4,6,502},{4,5,310},{4,5,110},{4,5,302},{7,0,1517},{2,6,465},{3,5,65},{2,4,877},{3,5,1517},{2,4,877},{3,7,677},{3,7,677},{3,7,677},{3,5,645},{3,6,426},{3,5,56},{3,5,56},{3,4,52},{2,5,542},{2,4,37},{4,5,85},{4,5,85},{4,5,85},{4,4,130},{5,2,346}, +{3,5,40},{3,5,40},{2,4,36},{7,2,346},{2,4,36},{7,1,421},{3,6,85},{4,5,29},{3,5,29},{7,1,421},{4,5,421},{3,5,29},{0,4,841},{4,5,421},{0,4,841},{3,0,641},{3,0,641},{3,0,641},{3,0,641},{3,4,52},{3,4,52},{3,4,52},{3,4,52},{2,4,37},{2,4,37},{4,7,1362},{4,6,938},{4,5,946},{4,5,946},{3,7,1557},{3,6,558},{3,5,65}, +{3,5,1101},{0,7,1662},{2,5,770},{4,7,462},{4,6,38},{4,5,46},{4,5,46},{5,4,1517},{3,6,542},{3,5,49},{1,5,721},{7,3,1517},{1,5,721},{4,5,937},{4,5,937},{4,5,937},{4,5,937},{3,6,362},{3,5,56},{3,5,56},{3,4,84},{1,6,350},{3,4,293},{4,5,37},{4,5,37},{4,5,37},{4,5,37},{6,1,346},{3,5,40},{3,5,40},{3,4,68},{6,3,346}, +{3,4,68},{5,5,421},{4,6,37},{4,5,45},{3,5,45},{5,5,421},{3,6,421},{3,5,45},{0,5,685},{3,6,421},{0,5,685},{4,0,901},{4,0,901},{4,0,901},{4,0,901},{3,5,20},{3,5,20},{3,5,20},{3,4,20},{2,5,85},{2,5,85},{4,7,978},{4,6,618},{4,5,850},{4,5,658},{3,7,2021},{3,6,686},{3,5,561},{3,5,733},{1,7,1530},{2,5,450},{4,7,494}, +{4,6,134},{4,5,366},{4,5,174},{6,3,1526},{2,7,446},{4,5,269},{2,5,446},{6,4,1526},{2,5,446},{4,6,537},{4,6,537},{4,6,537},{4,5,537},{3,7,500},{3,6,202},{3,6,202},{3,4,500},{1,6,510},{2,5,329},{4,6,53},{4,6,53},{4,6,53},{4,5,53},{7,0,340},{3,6,58},{3,6,58},{4,4,265},{3,5,340},{4,4,265},{6,4,421},{4,6,85},{5,5,170}, +{4,5,125},{6,4,421},{7,4,421},{4,5,125},{0,5,445},{7,4,421},{0,5,445},{4,0,533},{4,0,533},{4,0,533},{4,0,533},{3,6,153},{3,6,153},{3,6,153},{3,4,244},{2,5,5},{2,5,5},{4,7,1158},{4,7,438},{4,6,742},{4,6,742},{4,7,1686},{4,6,839},{3,6,677},{4,5,875},{1,7,1710},{3,5,590},{5,6,769},{4,7,269},{4,6,573},{4,6,573},{7,2,1517}, +{3,7,510},{3,6,236},{3,5,490},{5,5,1517},{3,5,490},{4,7,429},{4,7,429},{4,7,429},{4,5,546},{4,6,515},{4,5,299},{4,5,299},{4,5,475},{2,6,350},{3,5,190},{4,7,260},{4,7,260},{4,7,260},{5,5,328},{7,1,346},{3,6,40},{3,6,40},{3,5,90},{7,3,346},{3,5,90},{7,3,421},{4,7,13},{4,6,317},{3,6,200},{7,3,421},{6,5,421},{3,6,200}, +{0,5,481},{6,5,421},{0,5,481},{4,0,425},{4,0,425},{4,0,425},{4,0,425},{4,5,178},{4,5,178},{4,5,178},{4,4,205},{3,5,109},{3,5,109},{4,7,1862},{4,7,662},{4,6,998},{4,6,646},{4,7,1686},{4,6,759},{4,6,119},{4,5,859},{2,7,1590},{3,5,814},{5,7,521},{5,6,305},{5,6,145},{5,6,361},{5,6,1526},{3,7,446},{4,6,94},{3,5,810},{4,6,1526}, +{3,5,810},{4,7,637},{4,7,637},{4,7,637},{4,6,610},{4,6,435},{4,6,83},{4,6,83},{4,5,75},{1,7,565},{3,5,30},{5,6,109},{5,6,109},{5,6,109},{5,5,136},{6,3,340},{4,6,58},{4,6,58},{3,5,26},{6,4,340},{3,5,26},{5,7,421},{4,7,61},{5,6,45},{4,6,45},{5,7,421},{5,6,421},{4,6,45},{0,5,785},{5,6,421},{0,5,785},{4,0,601}, +{4,0,601},{4,0,601},{4,0,601},{4,5,50},{4,5,50},{4,5,50},{4,5,74},{3,5,29},{3,5,29},{5,7,1498},{5,7,1014},{5,6,994},{5,6,1018},{4,7,2198},{4,7,578},{4,6,39},{4,6,1183},{2,7,1878},{3,6,846},{5,7,537},{5,7,53},{5,6,33},{5,6,57},{7,3,1526},{4,7,569},{4,6,30},{2,6,758},{6,5,1526},{2,6,758},{5,6,990},{5,6,990},{5,6,990}, +{5,6,1014},{4,7,349},{4,6,35},{4,6,35},{4,5,59},{2,7,357},{3,5,254},{5,6,29},{5,6,29},{5,6,29},{5,6,53},{7,2,340},{4,6,26},{4,6,26},{4,5,50},{5,5,340},{4,5,50},{6,6,425},{5,7,49},{5,6,29},{4,6,29},{6,6,425},{4,7,425},{4,6,29},{0,6,733},{4,7,425},{0,6,733},{5,0,965},{5,0,965},{5,0,965},{5,0,965},{4,6,10}, +{4,6,10},{4,6,10},{4,5,10},{3,6,113},{3,6,113},{5,7,1466},{5,7,630},{5,6,834},{5,6,666},{5,7,2055},{4,7,642},{4,6,471},{4,6,751},{3,7,1766},{3,6,462},{5,7,937},{5,7,101},{5,6,305},{5,6,137},{5,7,1526},{4,7,521},{5,6,270},{3,6,461},{5,6,1526},{3,6,461},{5,7,566},{5,7,566},{5,7,566},{5,6,566},{4,7,621},{4,7,201},{4,7,201}, +{4,5,427},{2,7,469},{3,6,362},{5,7,37},{5,7,37},{5,7,37},{5,6,37},{5,6,338},{4,7,80},{4,7,80},{5,5,241},{4,6,338},{5,5,241},{7,5,425},{5,7,65},{6,6,164},{5,6,101},{7,5,425},{6,6,433},{5,6,101},{0,6,461},{6,6,433},{0,6,461},{5,0,565},{5,0,565},{5,0,565},{5,0,565},{4,7,137},{4,7,137},{4,7,137},{4,5,202},{3,6,1}, +{3,6,1},{5,7,2042},{5,7,810},{5,7,746},{5,7,790},{5,7,2073},{5,7,885},{4,7,651},{4,6,877},{4,7,2102},{4,6,598},{6,7,794},{6,7,530},{5,7,550},{5,7,594},{6,6,1526},{5,7,689},{4,7,251},{4,6,477},{6,6,1526},{4,6,477},{5,7,521},{5,7,521},{5,7,521},{5,6,521},{5,7,552},{5,6,312},{5,6,312},{4,6,516},{3,7,349},{4,6,237},{5,7,325}, +{5,7,325},{5,7,325},{5,6,325},{6,5,340},{4,7,26},{4,7,26},{4,6,116},{3,7,340},{4,6,116},{6,7,433},{6,7,169},{5,7,325},{4,7,226},{6,7,433},{7,6,425},{4,7,226},{0,6,461},{7,6,425},{0,6,461},{5,0,421},{5,0,421},{5,0,421},{5,0,421},{5,6,212},{5,6,212},{5,6,212},{5,5,221},{4,6,137},{4,6,137},{6,7,2362},{5,7,1514},{5,7,938}, +{5,7,630},{5,7,2633},{5,7,741},{5,7,165},{5,6,833},{4,7,2070},{4,6,758},{6,7,762},{6,7,306},{6,7,186},{6,7,426},{7,5,1526},{5,7,705},{5,7,129},{4,6,749},{5,7,1541},{4,6,749},{5,7,889},{5,7,889},{5,7,889},{5,7,581},{5,7,424},{5,7,116},{5,7,116},{5,6,104},{3,7,525},{4,6,29},{6,7,137},{6,7,137},{6,7,137},{6,6,146},{7,4,338}, +{5,7,80},{5,7,80},{4,6,20},{7,5,338},{4,6,20},{7,6,433},{6,7,185},{6,7,65},{5,7,65},{7,6,433},{6,7,425},{5,7,65},{0,6,733},{6,7,425},{0,6,733},{5,0,565},{5,0,565},{5,0,565},{5,0,565},{5,6,52},{5,6,52},{5,6,52},{5,6,100},{4,6,25},{4,6,25},{6,7,2073},{6,7,1449},{6,7,1049},{5,7,981},{6,7,2548},{5,7,1044},{5,7,20}, +{5,6,1196},{5,7,2365},{4,7,929},{6,7,1049},{6,7,425},{6,7,25},{6,7,73},{7,6,1492},{6,7,948},{5,7,16},{3,7,800},{7,6,1460},{3,7,800},{6,7,1049},{6,7,1049},{6,7,1049},{5,7,981},{5,7,680},{5,7,20},{5,7,20},{5,6,40},{4,7,434},{4,6,205},{6,7,25},{6,7,25},{6,7,25},{6,7,73},{7,5,370},{5,7,16},{5,7,16},{5,6,36},{6,6,338}, +{5,6,36},{7,7,410},{7,7,338},{6,7,16},{5,7,16},{7,7,410},{6,7,464},{5,7,16},{0,7,784},{6,7,464},{0,7,784},{5,0,965},{5,0,965},{5,0,965},{5,0,965},{5,7,4},{5,7,4},{5,7,4},{5,6,4},{4,7,145},{4,7,145},{6,7,1769},{6,7,1145},{6,7,745},{6,7,601},{6,7,1940},{6,7,1172},{5,7,308},{5,7,696},{5,7,1805},{4,7,401},{7,7,1043}, +{6,7,569},{6,7,169},{6,7,25},{7,6,1076},{6,7,596},{6,7,196},{4,7,401},{6,7,1076},{4,7,401},{6,7,745},{6,7,745},{6,7,745},{6,7,601},{6,7,916},{5,7,308},{5,7,308},{5,6,360},{4,7,626},{5,6,341},{6,7,169},{6,7,169},{6,7,169},{6,7,25},{6,7,340},{6,7,196},{6,7,196},{6,6,221},{5,7,340},{6,6,221},{7,7,202},{7,7,130},{7,7,81}, +{6,7,0},{7,7,202},{7,7,218},{6,7,0},{0,7,400},{7,7,218},{0,7,400},{6,0,601},{6,0,601},{6,0,601},{6,0,601},{5,7,164},{5,7,164},{5,7,164},{5,6,164},{4,7,1},{4,7,1},{6,7,1886},{6,7,1262},{6,7,862},{6,7,502},{6,7,1715},{6,7,731},{6,7,331},{5,7,507},{5,7,1634},{4,7,266},{7,7,521},{7,7,449},{7,7,400},{6,7,277},{7,7,797}, +{6,7,506},{6,7,106},{5,7,146},{6,7,770},{5,7,146},{6,7,862},{6,7,862},{6,7,862},{6,7,502},{6,7,691},{6,7,331},{6,7,331},{5,7,507},{5,7,610},{4,7,266},{7,7,400},{7,7,400},{7,7,400},{6,7,277},{7,6,338},{6,7,106},{6,7,106},{5,7,146},{7,6,370},{5,7,146},{7,7,121},{7,7,49},{7,7,0},{7,7,16},{7,7,121},{7,7,65},{7,7,16}, +{0,7,121},{7,7,65},{0,7,121},{6,0,421},{6,0,421},{6,0,421},{6,0,421},{6,7,250},{6,7,250},{6,7,250},{6,6,241},{4,7,145},{4,7,145},{7,7,2010},{6,7,1774},{6,7,1374},{6,7,822},{6,7,1923},{6,7,747},{6,7,347},{6,7,139},{6,7,1446},{5,7,34},{7,7,329},{7,7,257},{7,7,208},{7,7,160},{7,7,509},{7,7,389},{6,7,298},{5,7,18},{7,7,549}, +{5,7,18},{6,7,1374},{6,7,1374},{6,7,1374},{6,7,822},{6,7,899},{6,7,347},{6,7,347},{6,7,139},{5,7,866},{5,7,34},{7,7,208},{7,7,208},{7,7,208},{7,7,160},{7,7,388},{6,7,298},{6,7,298},{5,7,18},{6,7,370},{5,7,18},{7,7,185},{7,7,113},{7,7,64},{7,7,16},{7,7,185},{7,7,65},{7,7,16},{0,7,9},{7,7,65},{0,7,9},{6,0,533}, +{6,0,533},{6,0,533},{6,0,533},{6,7,58},{6,7,58},{6,7,58},{6,7,130},{5,7,25},{5,7,25},{7,7,1347},{7,7,1275},{7,7,1226},{7,7,1154},{7,7,1431},{6,7,922},{6,7,522},{6,7,2},{6,7,1125},{5,7,137},{7,7,258},{7,7,186},{7,7,137},{7,7,65},{7,7,342},{7,7,198},{7,7,149},{6,7,1},{7,7,294},{6,7,1},{7,7,1226},{7,7,1226},{7,7,1226}, +{7,7,1154},{6,7,1146},{6,7,522},{6,7,522},{6,7,2},{6,7,725},{5,7,137},{7,7,137},{7,7,137},{7,7,137},{7,7,65},{7,7,221},{7,7,149},{7,7,149},{6,7,1},{7,7,245},{6,7,1},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{6,0,901},{6,0,901},{6,0,901},{6,0,901},{6,7,122}, +{6,7,122},{6,7,122},{6,7,2},{5,7,137},{5,7,137},{7,7,883},{7,7,811},{7,7,762},{7,7,690},{7,7,871},{7,7,727},{7,7,678},{6,7,130},{6,7,949},{6,7,149},{7,7,258},{7,7,186},{7,7,137},{7,7,65},{7,7,246},{7,7,102},{7,7,53},{7,7,36},{7,7,134},{7,7,36},{7,7,762},{7,7,762},{7,7,762},{7,7,690},{7,7,750},{7,7,678},{7,7,678}, +{6,7,130},{6,7,549},{6,7,149},{7,7,137},{7,7,137},{7,7,137},{7,7,65},{7,7,125},{7,7,53},{7,7,53},{7,7,36},{7,7,85},{7,7,36},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{7,0,641},{7,0,641},{7,0,641},{7,0,641},{6,7,442},{6,7,442},{6,7,442},{6,7,130},{6,7,149}, +{6,7,149},{0,3,932},{0,2,218},{0,1,82},{0,1,250},{0,2,1971},{0,1,1371},{0,1,611},{0,0,1950},{0,1,2332},{0,0,1986},{0,3,932},{0,2,218},{0,1,82},{0,1,250},{1,0,1899},{0,1,1371},{0,1,611},{0,0,1950},{1,0,1923},{0,0,1950},{0,1,1},{0,1,1},{0,1,1},{0,0,64},{0,0,180},{0,0,100},{0,0,100},{0,0,101},{0,0,200},{0,0,137},{0,1,1}, +{0,1,1},{0,1,1},{0,0,64},{0,0,180},{0,0,100},{0,0,100},{0,0,101},{0,0,164},{0,0,101},{1,1,884},{0,2,218},{0,1,82},{0,1,250},{1,1,884},{2,0,900},{0,1,250},{0,1,1170},{2,0,900},{0,1,1170},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,3,900},{0,2,250},{0,2,314}, +{0,1,314},{0,2,2355},{0,1,1755},{0,1,675},{0,1,1875},{0,1,2716},{0,1,2236},{0,3,900},{0,2,250},{0,2,314},{0,1,314},{0,2,2355},{0,1,1755},{0,1,675},{0,1,1875},{0,1,2355},{0,1,1875},{0,2,25},{0,2,25},{0,2,25},{0,1,25},{0,1,410},{0,0,292},{0,0,292},{0,0,181},{0,0,392},{0,0,217},{0,2,25},{0,2,25},{0,2,25},{0,1,25},{0,1,410}, +{0,0,292},{0,0,292},{0,0,181},{0,0,356},{0,0,181},{2,0,884},{0,2,250},{0,2,314},{0,1,314},{2,0,884},{3,0,884},{0,1,314},{0,1,914},{3,0,884},{0,1,914},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,4,890},{0,3,104},{0,2,90},{0,2,442},{0,2,2995},{0,2,1851},{0,1,995}, +{0,1,1875},{0,1,3356},{0,1,2236},{0,4,890},{0,3,104},{0,2,90},{0,2,442},{1,1,2932},{0,2,1851},{0,1,995},{0,1,1875},{2,0,2900},{0,1,1875},{0,2,9},{0,2,9},{0,2,9},{0,1,9},{0,1,586},{0,1,370},{0,1,370},{0,0,389},{0,0,712},{0,0,425},{0,2,9},{0,2,9},{0,2,9},{0,1,9},{0,1,586},{0,1,370},{0,1,370},{0,0,389},{1,0,650}, +{0,0,389},{1,2,890},{0,3,104},{0,2,90},{0,2,442},{1,2,890},{2,1,890},{0,2,442},{0,1,914},{2,1,890},{0,1,914},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,4,990},{0,3,140},{0,2,158},{0,2,158},{0,3,3048},{0,2,1707},{0,2,747},{0,1,1795},{0,1,3916},{0,1,2156},{0,4,990}, +{0,3,140},{0,2,158},{0,2,158},{0,3,3048},{0,2,1707},{0,2,747},{0,1,1795},{1,1,3048},{0,1,1795},{0,3,40},{0,3,40},{0,3,40},{0,1,157},{0,1,698},{0,1,290},{0,1,290},{0,0,641},{0,0,1076},{0,0,677},{0,3,40},{0,3,40},{0,3,40},{0,1,157},{1,0,666},{0,1,290},{0,1,290},{0,0,641},{1,0,650},{0,0,641},{2,1,890},{0,3,104},{0,2,122}, +{0,2,122},{2,1,890},{4,0,890},{0,2,122},{0,1,1170},{4,0,890},{0,1,1170},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,0,0},{0,0,0},{0,0,0},{0,0,16},{0,0,52},{0,0,52},{0,5,1115},{0,4,265},{0,2,689},{0,2,293},{0,4,3096},{0,3,1731},{0,2,324},{0,1,2020},{0,2,4009},{0,1,2381},{0,5,1115},{0,4,265},{1,2,429},{0,2,293},{1,2,3048}, +{0,3,1731},{0,2,324},{0,1,2020},{0,2,3048},{0,1,2020},{0,4,261},{0,4,261},{0,4,261},{0,2,229},{0,2,656},{0,2,260},{0,2,260},{0,1,256},{0,1,1017},{0,1,617},{0,4,261},{0,4,261},{0,4,261},{0,2,229},{0,2,656},{0,2,260},{0,2,260},{0,1,256},{0,1,656},{0,1,256},{3,0,890},{0,4,40},{1,2,68},{0,2,68},{3,0,890},{5,0,890},{0,2,68}, +{0,2,1220},{5,0,890},{0,2,1220},{0,0,225},{0,0,225},{0,0,225},{0,0,225},{0,1,16},{0,1,16},{0,1,16},{0,0,25},{0,0,61},{0,0,61},{0,6,1419},{0,4,569},{0,3,1078},{0,2,821},{0,4,3096},{0,3,1395},{0,2,356},{0,2,1832},{0,2,4201},{0,2,2793},{1,4,1011},{1,3,353},{1,2,413},{1,2,413},{2,1,3048},{0,3,1395},{0,2,356},{0,2,1832},{4,0,3048}, +{0,2,1832},{0,4,533},{0,4,533},{0,4,533},{0,2,565},{0,3,666},{0,2,100},{0,2,100},{0,1,128},{0,1,1209},{0,1,489},{1,2,157},{1,2,157},{1,2,157},{1,2,157},{1,1,650},{0,2,100},{0,2,100},{0,1,128},{1,1,666},{0,1,128},{3,1,890},{0,4,40},{1,2,292},{0,2,292},{3,1,890},{4,1,890},{0,2,292},{0,2,932},{4,1,890},{0,2,932},{0,0,529}, +{0,0,529},{0,0,529},{0,0,529},{0,1,16},{0,1,16},{0,1,16},{0,1,64},{0,0,205},{0,0,205},{0,6,1915},{0,5,1019},{1,3,1269},{0,3,1110},{0,5,3051},{0,3,1443},{0,3,318},{0,2,1384},{0,2,4777},{0,2,2345},{1,5,909},{1,4,131},{1,3,113},{1,3,509},{3,0,3051},{0,3,1443},{0,3,318},{0,2,1384},{3,1,3051},{0,2,1384},{0,5,970},{0,5,970},{0,5,970}, +{0,3,1010},{0,3,698},{0,2,196},{0,2,196},{0,1,256},{0,2,1641},{0,1,617},{1,3,13},{1,3,13},{1,3,13},{1,2,13},{2,0,650},{0,2,196},{0,2,196},{0,1,256},{3,0,650},{0,1,256},{2,3,884},{0,5,58},{1,3,104},{0,3,149},{2,3,884},{6,0,884},{0,3,149},{0,2,900},{6,0,884},{0,2,900},{0,0,961},{0,0,961},{0,0,961},{0,0,961},{0,2,0}, +{0,2,0},{0,2,0},{0,1,0},{0,1,361},{0,1,361},{1,5,2113},{1,4,1271},{1,3,1285},{1,3,1329},{0,6,3123},{0,4,1208},{0,3,30},{0,2,1320},{0,3,5011},{0,2,2281},{1,5,957},{1,4,115},{1,3,129},{1,3,173},{1,4,3051},{0,4,1208},{0,3,30},{0,2,1320},{2,2,3051},{0,2,1320},{1,4,1190},{1,4,1190},{1,4,1190},{1,2,1281},{0,4,648},{0,3,26},{0,3,26}, +{0,2,296},{0,2,1641},{0,1,1001},{1,4,34},{1,4,34},{1,4,34},{1,2,125},{0,4,648},{0,3,26},{0,3,26},{0,2,296},{2,1,648},{0,2,296},{3,2,884},{0,5,26},{1,3,104},{0,3,5},{3,2,884},{5,1,884},{0,3,5},{0,2,1124},{5,1,884},{0,2,1124},{1,0,1181},{1,0,1181},{1,0,1181},{1,0,1181},{0,3,25},{0,3,25},{0,3,25},{0,1,64},{0,1,425}, +{0,1,425},{1,6,1864},{1,5,1038},{1,3,1390},{1,3,1038},{0,6,3132},{0,4,1199},{0,3,201},{0,2,1743},{0,3,4924},{0,2,2332},{1,6,1080},{1,5,254},{2,3,458},{1,3,254},{2,3,3051},{0,4,1163},{0,3,165},{0,2,1707},{6,0,3051},{0,2,1707},{1,4,1016},{1,4,1016},{1,4,1016},{1,3,989},{0,5,716},{0,3,152},{0,3,152},{0,2,62},{0,2,1611},{0,2,651},{1,4,232}, +{1,4,232},{1,4,232},{1,3,205},{1,3,650},{0,3,116},{0,3,116},{0,2,26},{1,2,650},{0,2,26},{4,1,884},{1,5,58},{2,3,58},{1,3,58},{4,1,884},{4,2,884},{1,3,58},{0,3,1274},{4,2,884},{0,3,1274},{1,0,980},{1,0,980},{1,0,980},{1,0,980},{0,3,52},{0,3,52},{0,3,52},{0,2,61},{0,1,458},{0,1,458},{1,7,1784},{1,5,910},{1,4,1441}, +{1,3,1134},{0,7,3247},{0,5,1292},{0,4,567},{0,3,1474},{0,4,4900},{0,3,2178},{2,5,1028},{2,4,362},{2,3,394},{2,3,418},{3,2,3051},{0,5,1096},{1,3,331},{0,3,1278},{5,1,3051},{0,3,1278},{1,5,885},{1,5,885},{1,5,885},{1,3,909},{0,5,876},{0,4,206},{0,4,206},{0,2,254},{0,3,1548},{0,2,347},{2,3,169},{2,3,169},{2,3,169},{2,3,193},{2,2,648}, +{0,4,10},{0,4,10},{0,2,58},{5,0,648},{0,2,58},{5,0,884},{1,5,26},{2,3,250},{1,3,250},{5,0,884},{3,3,884},{1,3,250},{0,3,954},{3,3,884},{0,3,954},{1,0,884},{1,0,884},{1,0,884},{1,0,884},{0,4,197},{0,4,197},{0,4,197},{0,2,205},{0,2,298},{0,2,298},{1,7,1976},{1,6,1124},{1,4,1649},{1,4,1229},{1,6,3204},{0,5,1452},{1,4,525}, +{0,3,1474},{0,4,4420},{0,3,1474},{2,6,930},{2,5,160},{2,4,138},{2,3,546},{4,1,3060},{0,5,968},{0,4,195},{0,3,990},{4,2,3060},{0,3,990},{1,6,1060},{1,6,1060},{1,6,1060},{1,4,1108},{1,4,824},{1,3,314},{1,3,314},{1,2,370},{0,3,1260},{0,2,427},{2,4,17},{2,4,17},{2,4,17},{2,3,17},{3,1,648},{0,4,74},{0,4,74},{1,2,226},{4,1,648}, +{1,2,226},{3,4,882},{1,6,80},{2,4,122},{0,4,146},{3,4,882},{7,1,882},{0,4,146},{0,3,890},{7,1,882},{0,3,890},{1,0,1044},{1,0,1044},{1,0,1044},{1,0,1044},{1,3,145},{1,3,145},{1,3,145},{1,2,145},{0,2,202},{0,2,202},{2,6,2374},{1,6,1476},{2,4,1550},{1,4,1469},{1,6,3172},{1,5,1259},{1,4,61},{1,3,1323},{0,4,4452},{0,3,1282},{2,6,930}, +{2,5,96},{2,4,106},{2,4,194},{5,0,3060},{0,6,1144},{1,4,45},{0,3,1086},{6,1,3060},{0,3,1086},{2,5,1476},{2,5,1476},{2,5,1476},{1,4,1460},{1,5,666},{1,4,52},{1,4,52},{1,3,362},{0,3,1356},{0,3,321},{2,5,32},{2,5,32},{2,5,32},{2,3,97},{4,0,650},{1,4,36},{1,4,36},{0,3,125},{3,2,650},{0,3,125},{4,3,882},{1,6,16},{2,4,90}, +{1,4,9},{4,3,882},{6,2,882},{1,4,9},{0,3,1082},{6,2,882},{0,3,1082},{1,0,1460},{1,0,1460},{1,0,1460},{1,0,1460},{1,4,52},{1,4,52},{1,4,52},{1,2,65},{0,3,200},{0,3,200},{2,7,1892},{2,6,1090},{2,4,1370},{2,4,1062},{1,7,3100},{1,5,1169},{1,4,151},{1,3,1665},{0,5,4036},{0,3,1678},{2,7,1051},{2,6,249},{3,4,493},{2,4,221},{3,4,3060}, +{0,6,883},{1,4,126},{0,4,1528},{7,1,3060},{0,4,1528},{2,5,1035},{2,5,1035},{2,5,1035},{2,4,1026},{1,6,723},{1,4,115},{1,4,115},{1,3,65},{0,4,1004},{0,3,78},{2,5,194},{2,5,194},{2,5,194},{2,4,185},{2,4,648},{1,4,90},{1,4,90},{1,3,40},{7,0,648},{1,3,40},{5,2,882},{2,6,80},{3,4,52},{2,4,52},{5,2,882},{5,3,882},{2,4,52}, +{0,4,1332},{5,3,882},{0,4,1332},{2,0,1010},{2,0,1010},{2,0,1010},{2,0,1010},{1,4,34},{1,4,34},{1,4,34},{1,3,61},{0,3,74},{0,3,74},{2,7,1892},{2,6,898},{2,5,1451},{2,4,1094},{2,6,3501},{1,6,1308},{1,5,589},{1,4,1510},{0,5,3940},{0,4,1116},{3,6,1051},{3,5,377},{3,4,381},{3,4,429},{5,1,3060},{0,6,1059},{2,4,312},{0,4,1016},{6,2,3060}, +{0,4,1016},{2,6,882},{2,6,882},{2,6,882},{2,4,898},{1,6,835},{1,5,189},{1,5,189},{1,3,209},{0,4,1036},{0,3,270},{3,4,185},{3,4,185},{3,4,185},{3,4,233},{3,3,650},{1,5,20},{1,5,20},{1,3,40},{6,1,650},{1,3,40},{6,1,882},{2,6,16},{3,4,212},{2,4,212},{6,1,882},{4,4,882},{2,4,212},{0,4,980},{4,4,882},{0,4,980},{2,0,882}, +{2,0,882},{2,0,882},{2,0,882},{1,5,173},{1,5,173},{1,5,173},{1,3,173},{0,4,136},{0,4,136},{2,7,2404},{2,7,1116},{2,5,1595},{2,5,1235},{2,7,3244},{1,6,1404},{2,5,619},{1,4,1446},{0,6,3804},{0,4,892},{3,7,957},{3,6,195},{3,5,169},{3,4,509},{6,0,3060},{0,7,936},{1,5,196},{0,4,888},{3,4,3060},{0,4,888},{2,7,1035},{2,7,1035},{2,7,1035}, +{2,5,1091},{2,5,835},{2,4,317},{2,4,317},{2,3,369},{0,5,875},{1,3,396},{3,5,25},{3,5,25},{3,5,25},{3,4,25},{4,2,650},{1,5,52},{1,5,52},{2,3,200},{5,2,650},{2,3,200},{7,0,884},{2,7,106},{3,5,144},{1,5,160},{7,0,884},{3,5,884},{1,5,160},{0,4,884},{3,5,884},{0,4,884},{2,0,1010},{2,0,1010},{2,0,1010},{2,0,1010},{2,4,173}, +{2,4,173},{2,4,173},{2,3,173},{0,4,8},{0,4,8},{3,7,2430},{2,7,1404},{3,5,1610},{2,5,1411},{2,7,3148},{2,6,1309},{2,5,91},{2,4,1325},{0,6,3484},{0,4,1180},{3,7,909},{3,6,83},{3,5,89},{3,5,221},{4,4,3051},{0,7,1000},{2,5,66},{1,4,1053},{7,2,3051},{1,4,1053},{2,7,1403},{2,7,1403},{2,7,1403},{2,5,1395},{2,6,681},{2,5,75},{2,5,75}, +{2,4,425},{0,5,795},{0,4,280},{3,6,34},{3,6,34},{3,6,34},{3,4,73},{5,1,656},{2,5,50},{2,5,50},{1,4,153},{7,1,656},{1,4,153},{5,4,884},{2,7,10},{3,5,80},{2,5,17},{5,4,884},{7,3,884},{2,5,17},{0,4,1044},{7,3,884},{0,4,1044},{2,0,1394},{2,0,1394},{2,0,1394},{2,0,1394},{2,4,61},{2,4,61},{2,4,61},{2,3,61},{0,4,136}, +{0,4,136},{3,7,2214},{3,7,1150},{3,5,1358},{3,5,1094},{2,7,3652},{2,6,1147},{2,5,109},{2,4,1595},{0,7,3724},{0,5,1402},{3,7,1314},{3,7,250},{3,5,458},{3,5,194},{5,3,3060},{1,7,888},{2,5,93},{0,5,1398},{6,3,3060},{0,5,1398},{3,6,1060},{3,6,1060},{3,6,1060},{3,5,1069},{2,7,736},{2,5,84},{2,5,84},{2,4,74},{0,6,820},{1,4,81},{3,6,160}, +{3,6,160},{3,6,160},{3,5,169},{6,0,650},{2,5,68},{2,5,68},{1,4,45},{3,4,650},{1,4,45},{6,3,884},{3,7,106},{4,5,50},{3,5,50},{6,3,884},{6,4,884},{3,5,50},{0,5,1394},{6,4,884},{0,5,1394},{3,0,1044},{3,0,1044},{3,0,1044},{3,0,1044},{2,5,20},{2,5,20},{2,5,20},{2,4,65},{0,5,8},{0,5,8},{3,7,2566},{3,7,894},{3,6,1469}, +{3,5,1062},{3,7,3535},{2,7,1332},{2,6,619},{2,5,1554},{0,7,3276},{0,5,1146},{4,7,1080},{4,6,398},{4,5,374},{4,5,446},{6,2,3051},{1,7,1016},{3,5,299},{0,5,1046},{5,4,3051},{0,5,1046},{3,7,885},{3,7,885},{3,7,885},{3,5,893},{2,7,800},{2,6,178},{2,6,178},{2,4,170},{0,6,660},{1,4,225},{4,5,205},{4,5,205},{4,5,205},{4,5,277},{5,2,656}, +{2,6,34},{2,6,34},{2,4,26},{7,2,656},{2,4,26},{7,2,884},{3,7,10},{4,5,178},{3,5,178},{7,2,884},{5,5,884},{3,5,178},{0,5,1010},{5,5,884},{0,5,1010},{3,0,884},{3,0,884},{3,0,884},{3,0,884},{2,6,153},{2,6,153},{2,6,153},{2,4,145},{0,5,136},{0,5,136},{4,7,3320},{3,7,1150},{3,6,1549},{3,6,1249},{3,7,3487},{2,7,1364},{2,6,603}, +{2,5,1426},{0,7,3340},{1,5,892},{4,7,1016},{4,7,236},{4,6,206},{4,5,478},{7,1,3051},{2,7,964},{2,6,203},{1,5,883},{4,5,3051},{1,5,883},{3,7,1029},{3,7,1029},{3,7,1029},{3,6,1080},{3,6,852},{3,5,326},{3,5,326},{3,4,374},{0,6,884},{2,4,371},{4,6,37},{4,6,37},{4,6,37},{4,5,37},{6,1,656},{2,6,34},{2,6,34},{3,4,178},{6,3,656}, +{3,4,178},{5,6,890},{3,7,170},{4,6,170},{2,6,178},{5,6,890},{4,6,890},{2,6,178},{0,5,882},{4,6,890},{0,5,882},{3,0,980},{3,0,980},{3,0,980},{3,0,980},{3,5,205},{3,5,205},{3,5,205},{3,4,205},{1,5,10},{1,5,10},{4,7,2936},{4,7,1676},{4,6,1678},{3,6,1361},{3,7,3951},{3,7,1367},{3,6,129},{3,5,1335},{1,7,3496},{1,5,1116},{4,7,1336}, +{4,7,76},{4,6,78},{4,6,254},{5,5,3048},{2,7,1124},{3,6,93},{2,5,1026},{3,6,3048},{2,5,1026},{3,7,1557},{3,7,1557},{3,7,1557},{3,6,1336},{3,7,702},{3,6,104},{3,6,104},{3,5,494},{0,7,667},{1,5,275},{4,7,40},{4,7,40},{4,7,40},{4,5,53},{7,0,650},{3,6,68},{3,6,68},{2,5,185},{3,5,650},{2,5,185},{7,3,890},{4,7,72},{4,6,74}, +{3,6,29},{7,3,890},{6,5,890},{3,6,29},{0,5,1010},{6,5,890},{0,5,1010},{3,0,1332},{3,0,1332},{3,0,1332},{3,0,1332},{3,5,61},{3,5,61},{3,5,61},{3,4,61},{1,5,106},{1,5,106},{4,7,3116},{4,7,1316},{4,6,1354},{4,6,1134},{4,7,4084},{3,7,1133},{3,6,75},{3,5,1533},{1,7,3676},{1,6,1470},{5,7,1429},{4,7,355},{4,6,393},{4,6,173},{6,4,3051}, +{3,7,1124},{3,6,66},{1,6,1469},{7,4,3051},{1,6,1469},{4,7,1091},{4,7,1091},{4,7,1091},{4,6,1118},{3,7,729},{3,6,59},{3,6,59},{3,5,89},{0,7,820},{2,5,90},{4,7,130},{4,7,130},{4,7,130},{4,6,157},{7,1,656},{3,6,50},{3,6,50},{2,5,41},{7,3,656},{2,5,41},{7,4,890},{4,7,234},{5,6,52},{4,6,52},{7,4,890},{7,5,890},{4,6,52}, +{0,5,1460},{7,5,890},{0,5,1460},{4,0,1082},{4,0,1082},{4,0,1082},{4,0,1082},{3,6,10},{3,6,10},{3,6,10},{3,5,73},{1,6,10},{1,6,10},{4,7,3820},{4,7,1540},{4,7,1495},{4,6,1038},{4,7,4084},{3,7,1469},{3,6,571},{3,6,1606},{2,7,3916},{1,6,1150},{5,7,1349},{5,7,425},{5,6,373},{5,6,469},{7,3,3048},{3,7,1348},{4,6,292},{1,6,1069},{6,5,3048}, +{1,6,1069},{4,7,1011},{4,7,1011},{4,7,1011},{4,6,894},{3,7,1161},{3,7,173},{3,7,173},{3,5,137},{1,7,659},{2,5,186},{5,6,229},{5,6,229},{5,6,229},{5,6,325},{6,3,650},{3,7,52},{3,7,52},{3,5,16},{6,4,650},{3,5,16},{6,6,890},{5,7,200},{5,6,148},{4,6,148},{6,6,890},{6,6,890},{4,6,148},{0,6,1044},{6,6,890},{0,6,1044},{4,0,890}, +{4,0,890},{4,0,890},{4,0,890},{3,7,137},{3,7,137},{3,7,137},{3,5,121},{1,6,106},{1,6,106},{5,7,4054},{4,7,2276},{4,7,1511},{4,7,1271},{4,7,4596},{4,7,1596},{3,7,577},{3,6,1414},{2,7,4204},{2,6,900},{5,7,1653},{5,7,377},{5,7,249},{5,6,453},{5,7,3048},{4,7,1371},{3,7,216},{2,6,884},{5,6,3048},{2,6,884},{4,7,1315},{4,7,1315},{4,7,1315}, +{4,6,1054},{4,7,875},{4,6,341},{4,6,341},{4,5,385},{1,7,835},{3,5,352},{5,7,53},{5,7,53},{5,7,53},{5,6,53},{7,2,650},{3,7,20},{3,7,20},{4,5,160},{5,5,650},{4,5,160},{7,5,890},{5,7,328},{5,7,200},{3,7,200},{7,5,890},{5,7,900},{3,7,200},{0,6,884},{5,7,900},{0,6,884},{4,0,954},{4,0,954},{4,0,954},{4,0,954},{4,6,241}, +{4,6,241},{4,6,241},{4,5,241},{2,6,16},{2,6,16},{5,7,4022},{5,7,2394},{5,7,1754},{4,7,1319},{5,7,4921},{4,7,1660},{4,7,175},{4,6,1353},{3,7,4380},{2,6,1060},{6,7,2021},{5,7,713},{5,7,73},{5,7,293},{6,6,3051},{4,7,1611},{4,7,126},{3,6,1005},{4,7,3051},{3,6,1005},{5,7,1718},{5,7,1718},{5,7,1718},{4,7,1283},{4,7,859},{4,7,139},{4,7,139}, +{4,5,465},{2,7,779},{2,6,276},{5,7,37},{5,7,37},{5,7,37},{5,6,37},{5,6,648},{4,7,90},{4,7,90},{3,6,221},{4,6,648},{3,6,221},{7,6,900},{6,7,452},{5,7,72},{4,7,45},{7,6,900},{7,6,884},{4,7,45},{0,6,980},{7,6,884},{0,6,980},{4,0,1274},{4,0,1274},{4,0,1274},{4,0,1274},{4,6,65},{4,6,65},{4,6,65},{4,5,65},{2,6,80}, +{2,6,80},{5,7,4265},{5,7,2373},{5,7,1349},{5,7,1173},{5,7,4606},{4,7,2065},{4,7,40},{4,6,1266},{3,7,4455},{3,6,1261},{6,7,1649},{6,7,1025},{5,7,325},{5,7,149},{7,5,2817},{5,7,1514},{4,7,36},{3,6,1197},{6,6,2841},{3,6,1197},{5,7,1349},{5,7,1349},{5,7,1349},{5,7,1173},{4,7,1300},{4,7,40},{4,7,40},{4,6,110},{2,7,1040},{3,6,105},{5,7,325}, +{5,7,325},{5,7,325},{5,7,149},{6,5,650},{4,7,36},{4,7,36},{3,6,41},{3,7,650},{3,6,41},{7,6,801},{6,7,449},{6,7,49},{4,7,36},{7,6,801},{6,7,761},{4,7,36},{0,6,1181},{6,7,761},{0,6,1181},{5,0,1124},{5,0,1124},{5,0,1124},{5,0,1124},{4,7,4},{4,7,4},{4,7,4},{4,6,85},{2,7,16},{2,7,16},{5,7,4345},{5,7,2453},{5,7,1429}, +{5,7,901},{5,7,4190},{5,7,1770},{4,7,360},{4,6,1266},{4,7,3861},{2,7,1041},{6,7,1281},{6,7,657},{6,7,257},{5,7,325},{6,7,2250},{5,7,1194},{5,7,170},{2,7,977},{5,7,2250},{2,7,977},{5,7,1429},{5,7,1429},{5,7,1429},{5,7,901},{5,7,1274},{4,7,360},{4,7,360},{4,6,110},{3,7,979},{3,6,153},{6,7,257},{6,7,257},{6,7,257},{5,7,325},{7,4,648}, +{5,7,170},{5,7,170},{4,6,10},{7,5,648},{4,6,10},{7,7,521},{6,7,401},{6,7,1},{5,7,1},{7,7,521},{6,7,521},{5,7,1},{0,7,961},{6,7,521},{0,7,961},{5,0,900},{5,0,900},{5,0,900},{5,0,900},{4,7,164},{4,7,164},{4,7,164},{4,6,101},{2,7,80},{2,7,80},{6,7,3669},{5,7,2917},{5,7,1893},{5,7,1013},{5,7,4158},{5,7,1386},{5,7,362}, +{4,7,1049},{4,7,3381},{3,7,555},{6,7,1169},{6,7,545},{6,7,145},{6,7,73},{7,6,1802},{5,7,1130},{5,7,106},{3,7,530},{7,6,1770},{3,7,530},{5,7,1893},{5,7,1893},{5,7,1893},{5,7,1013},{5,7,1242},{5,7,362},{5,7,362},{5,6,402},{3,7,1251},{4,6,339},{6,7,145},{6,7,145},{6,7,145},{6,7,73},{7,5,680},{5,7,106},{5,7,106},{5,6,146},{6,6,648}, +{5,6,146},{7,7,265},{7,7,193},{6,7,81},{6,7,9},{7,7,265},{7,7,305},{6,7,9},{0,7,529},{7,7,305},{0,7,529},{5,0,932},{5,0,932},{5,0,932},{5,0,932},{5,7,281},{5,7,281},{5,7,281},{5,6,281},{3,7,26},{3,7,26},{6,7,3077},{6,7,2453},{6,7,2053},{5,7,1509},{6,7,3438},{5,7,1386},{5,7,362},{5,7,650},{5,7,3195},{3,7,283},{7,7,1293}, +{6,7,689},{6,7,289},{6,7,25},{7,6,1386},{6,7,786},{5,7,298},{4,7,261},{6,7,1386},{4,7,261},{6,7,2053},{6,7,2053},{6,7,2053},{5,7,1509},{5,7,1594},{5,7,362},{5,7,362},{5,6,434},{4,7,1260},{3,7,283},{6,7,289},{6,7,289},{6,7,289},{6,7,25},{6,7,650},{5,7,298},{5,7,298},{4,7,261},{5,7,650},{4,7,261},{7,7,137},{7,7,65},{7,7,16}, +{6,7,25},{7,7,137},{7,7,113},{6,7,25},{0,7,225},{7,7,113},{0,7,225},{5,0,1220},{5,0,1220},{5,0,1220},{5,0,1220},{5,7,73},{5,7,73},{5,7,73},{5,6,73},{3,7,58},{3,7,58},{6,7,2870},{6,7,2246},{6,7,1846},{6,7,1366},{6,7,2889},{6,7,1785},{5,7,821},{5,7,137},{5,7,2700},{4,7,126},{7,7,771},{7,7,699},{7,7,650},{6,7,277},{7,7,1107}, +{6,7,696},{6,7,296},{4,7,45},{6,7,1080},{4,7,45},{6,7,1846},{6,7,1846},{6,7,1846},{6,7,1366},{6,7,1865},{5,7,821},{5,7,821},{5,7,137},{4,7,1611},{4,7,126},{7,7,650},{7,7,650},{7,7,650},{6,7,277},{7,6,648},{6,7,296},{6,7,296},{4,7,45},{7,6,680},{4,7,45},{7,7,146},{7,7,74},{7,7,25},{7,7,1},{7,7,146},{7,7,50},{7,7,1}, +{0,7,36},{7,7,50},{0,7,36},{6,0,1170},{6,0,1170},{6,0,1170},{6,0,1170},{5,7,145},{5,7,145},{5,7,145},{5,7,101},{4,7,90},{4,7,90},{6,7,2962},{6,7,2338},{6,7,1938},{6,7,1314},{6,7,2677},{6,7,1429},{6,7,1029},{5,7,85},{5,7,2536},{4,7,122},{7,7,531},{7,7,459},{7,7,410},{7,7,338},{7,7,771},{7,7,627},{6,7,404},{5,7,4},{7,7,827}, +{5,7,4},{6,7,1938},{6,7,1938},{6,7,1938},{6,7,1314},{6,7,1653},{6,7,1029},{6,7,1029},{5,7,85},{5,7,1512},{4,7,122},{7,7,410},{7,7,410},{7,7,410},{7,7,338},{7,7,650},{6,7,404},{6,7,404},{5,7,4},{6,7,596},{5,7,4},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{6,0,914}, +{6,0,914},{6,0,914},{6,0,914},{5,7,481},{5,7,481},{5,7,481},{5,7,85},{4,7,122},{4,7,122},{7,7,2924},{6,7,2338},{6,7,1938},{6,7,1314},{6,7,2373},{6,7,1125},{6,7,725},{5,7,325},{6,7,2132},{5,7,232},{7,7,323},{7,7,251},{7,7,202},{7,7,130},{7,7,467},{7,7,323},{7,7,274},{5,7,36},{7,7,459},{5,7,36},{6,7,1938},{6,7,1938},{6,7,1938}, +{6,7,1314},{6,7,1349},{6,7,725},{6,7,725},{5,7,325},{5,7,1256},{5,7,232},{7,7,202},{7,7,202},{7,7,202},{7,7,130},{7,7,346},{7,7,274},{7,7,274},{5,7,36},{7,7,410},{5,7,36},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{6,0,914},{6,0,914},{6,0,914},{6,0,914},{6,7,325}, +{6,7,325},{6,7,325},{5,7,325},{5,7,232},{5,7,232},{7,7,2092},{7,7,2020},{7,7,1971},{6,7,1570},{7,7,2140},{6,7,1077},{6,7,677},{6,7,85},{6,7,1588},{5,7,232},{7,7,243},{7,7,171},{7,7,122},{7,7,50},{7,7,291},{7,7,147},{7,7,98},{6,7,4},{7,7,219},{6,7,4},{7,7,1971},{7,7,1971},{7,7,1971},{6,7,1570},{6,7,1301},{6,7,677},{6,7,677}, +{6,7,85},{6,7,1188},{5,7,232},{7,7,122},{7,7,122},{7,7,122},{7,7,50},{7,7,170},{7,7,98},{7,7,98},{6,7,4},{7,7,170},{6,7,4},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{6,0,1170},{6,0,1170},{6,0,1170},{6,0,1170},{6,7,277},{6,7,277},{6,7,277},{6,7,85},{5,7,232}, +{5,7,232},{0,4,1618},{0,3,436},{0,2,74},{0,2,866},{0,2,3411},{0,2,2531},{0,1,1251},{0,1,2531},{0,1,3772},{0,1,2892},{0,4,1618},{0,3,436},{0,2,74},{0,2,866},{0,2,3411},{0,2,2531},{0,1,1251},{0,1,2531},{2,0,3376},{0,1,2531},{0,1,25},{0,1,25},{0,1,25},{0,1,49},{0,0,360},{0,0,232},{0,0,232},{0,0,149},{0,0,332},{0,0,185},{0,1,25}, +{0,1,25},{0,1,25},{0,1,49},{0,0,360},{0,0,232},{0,0,232},{0,0,149},{0,0,296},{0,0,149},{1,2,1570},{0,3,436},{0,2,74},{0,2,866},{1,2,1570},{0,2,1570},{0,2,866},{0,1,1570},{0,2,1570},{0,1,1570},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,4,1586},{0,3,340},{0,2,10}, +{0,2,450},{0,3,4016},{0,2,2627},{0,2,1411},{0,1,2691},{0,1,4572},{0,1,3052},{0,4,1586},{0,3,340},{0,2,10},{0,2,450},{1,1,3968},{0,2,2627},{0,2,1411},{0,1,2691},{2,0,4016},{0,1,2691},{0,2,1},{0,2,1},{0,2,1},{0,1,1},{0,1,530},{0,1,362},{0,1,362},{0,0,325},{0,0,620},{0,0,361},{0,2,1},{0,2,1},{0,2,1},{0,1,1},{0,1,530}, +{0,1,362},{0,1,362},{0,0,325},{0,0,584},{0,0,325},{2,1,1570},{0,3,340},{0,2,10},{0,2,450},{2,1,1570},{4,0,1570},{0,2,450},{0,1,1730},{4,0,1570},{0,1,1730},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,5,1576},{0,4,290},{0,2,202},{0,2,290},{0,3,4656},{0,2,2979},{0,2,1251}, +{0,1,3107},{0,1,5628},{0,1,3468},{0,5,1576},{0,4,290},{0,2,202},{0,2,290},{0,3,4656},{0,2,2979},{0,2,1251},{0,1,3107},{1,1,4656},{0,1,3107},{0,3,16},{0,3,16},{0,3,16},{0,1,81},{0,1,802},{0,1,442},{0,1,442},{0,0,629},{0,0,1036},{0,0,665},{0,3,16},{0,3,16},{0,3,16},{0,1,81},{0,1,802},{0,1,442},{0,1,442},{0,0,629},{1,0,818}, +{0,0,629},{3,0,1576},{0,4,290},{0,2,202},{0,2,290},{3,0,1576},{3,1,1576},{0,2,290},{0,1,2146},{3,1,1576},{0,1,2146},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,5,1640},{0,4,162},{0,3,241},{0,2,386},{0,4,5539},{0,3,3512},{0,2,1347},{0,1,3779},{0,2,6396},{0,1,4140},{0,5,1640}, +{0,4,162},{0,3,241},{0,2,386},{1,2,5435},{0,3,3512},{0,2,1347},{0,1,3779},{0,2,5435},{0,1,3779},{0,3,16},{0,3,16},{0,3,16},{0,2,25},{0,1,1202},{0,1,650},{0,1,650},{0,1,970},{0,0,1580},{0,0,1097},{0,3,16},{0,3,16},{0,3,16},{0,2,25},{1,0,1170},{0,1,650},{0,1,650},{0,1,970},{1,0,1154},{0,1,970},{2,2,1576},{0,4,162},{0,3,241}, +{0,2,386},{2,2,1576},{5,0,1576},{0,2,386},{0,2,1730},{5,0,1576},{0,2,1730},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,6,1667},{0,5,259},{0,3,286},{0,3,406},{0,4,5440},{0,3,3035},{0,2,1284},{0,2,3504},{0,2,6513},{0,2,4465},{0,6,1667},{0,5,259},{0,3,286},{0,3,406},{2,1,5424}, +{0,3,3035},{0,2,1284},{0,2,3504},{4,0,5424},{0,2,3504},{0,4,81},{0,4,81},{0,4,81},{0,2,97},{0,2,1160},{0,2,500},{0,2,500},{0,1,520},{0,1,1521},{0,1,881},{0,4,81},{0,4,81},{0,4,81},{0,2,97},{0,2,1160},{0,2,500},{0,2,500},{0,1,520},{0,1,1160},{0,1,520},{2,3,1576},{0,5,178},{1,3,100},{0,3,325},{2,3,1576},{6,0,1576},{0,3,325}, +{0,2,1568},{6,0,1576},{0,2,1568},{0,0,81},{0,0,81},{0,0,81},{0,0,81},{0,0,9},{0,0,9},{0,0,9},{0,0,1},{0,0,37},{0,0,37},{0,7,1865},{0,5,339},{0,3,734},{0,3,374},{0,5,5435},{0,3,3019},{0,3,814},{0,2,2992},{0,2,7025},{0,2,3953},{1,5,1865},{0,5,339},{1,3,293},{0,3,374},{3,0,5435},{0,3,3019},{0,3,814},{0,2,2992},{3,1,5435}, +{0,2,2992},{0,5,314},{0,5,314},{0,5,314},{0,3,370},{0,3,1170},{0,2,340},{0,2,340},{0,1,392},{0,1,1713},{0,1,753},{1,3,289},{1,3,289},{1,3,289},{1,2,289},{1,1,1154},{0,2,340},{0,2,340},{0,1,392},{1,1,1170},{0,1,392},{4,0,1576},{0,5,50},{1,3,4},{0,3,85},{4,0,1576},{5,1,1576},{0,3,85},{0,2,1696},{5,1,1576},{0,2,1696},{0,0,289}, +{0,0,289},{0,0,289},{0,0,289},{0,1,4},{0,1,4},{0,1,4},{0,0,49},{0,0,85},{0,0,85},{0,7,2265},{0,6,787},{1,3,1401},{0,3,726},{0,5,5515},{0,4,2664},{0,3,462},{0,2,2864},{0,3,7363},{0,2,3825},{1,6,1667},{1,5,405},{1,3,245},{1,3,377},{2,2,5427},{0,4,2664},{0,3,462},{0,2,2864},{5,0,5427},{0,2,2864},{0,5,634},{0,5,634},{0,5,634}, +{0,3,626},{0,3,1202},{0,3,362},{0,3,362},{0,1,520},{0,2,2145},{0,1,881},{1,4,106},{1,4,106},{1,4,106},{1,2,145},{2,0,1154},{0,3,362},{0,3,362},{0,1,520},{3,0,1154},{0,1,520},{2,4,1576},{0,6,162},{1,3,164},{0,3,101},{2,4,1576},{7,0,1576},{0,3,101},{0,2,2080},{7,0,1576},{0,2,2080},{0,0,625},{0,0,625},{0,0,625},{0,0,625},{0,1,36}, +{0,1,36},{0,1,36},{0,1,36},{0,0,261},{0,0,261},{1,6,2775},{0,6,1091},{1,4,1422},{0,3,1462},{0,6,5427},{0,4,2536},{0,3,494},{0,2,3120},{0,3,7635},{0,2,4081},{1,6,1619},{1,5,165},{1,4,266},{1,3,361},{3,1,5427},{0,4,2536},{0,3,494},{0,2,3120},{4,1,5427},{0,2,3120},{0,6,1090},{0,6,1090},{0,6,1090},{0,3,1138},{0,4,1152},{0,3,170},{0,3,170}, +{0,2,416},{0,2,2145},{0,1,1265},{1,4,10},{1,4,10},{1,4,10},{1,3,37},{0,4,1152},{0,3,170},{0,3,170},{0,2,416},{2,1,1152},{0,2,416},{3,3,1570},{0,6,2},{1,4,265},{1,3,360},{3,3,1570},{6,1,1570},{1,3,360},{0,3,1768},{6,1,1570},{0,3,1768},{0,0,1089},{0,0,1089},{0,0,1089},{0,0,1089},{0,2,4},{0,2,4},{0,2,4},{0,1,4},{0,1,365}, +{0,1,365},{1,7,2796},{1,6,1432},{1,4,1413},{1,4,1593},{0,7,5435},{0,5,2360},{0,4,299},{0,3,2594},{0,3,8400},{0,3,4530},{1,7,1640},{1,6,276},{1,4,257},{1,4,437},{4,0,5427},{0,5,2360},{0,4,299},{0,3,2594},{3,2,5427},{0,3,2594},{1,5,1221},{1,5,1221},{1,5,1221},{1,3,1229},{0,5,1184},{0,4,250},{0,4,250},{0,2,146},{0,2,2451},{0,2,1107},{1,5,65}, +{1,5,65},{1,5,65},{1,3,73},{1,3,1154},{0,4,250},{0,4,250},{0,2,146},{1,2,1154},{0,2,146},{4,2,1576},{0,6,128},{2,4,130},{0,4,74},{4,2,1576},{5,2,1576},{0,4,74},{0,3,1570},{5,2,1576},{0,3,1570},{1,0,1220},{1,0,1220},{1,0,1220},{1,0,1220},{0,3,4},{0,3,4},{0,3,4},{0,1,121},{0,1,482},{0,1,482},{1,7,3180},{1,6,1464},{1,4,1813}, +{1,4,1513},{0,7,5515},{0,5,2168},{0,4,59},{0,3,2242},{0,4,8764},{0,3,4178},{2,6,1894},{1,6,308},{2,4,326},{1,4,357},{2,4,5427},{0,5,2168},{0,4,59},{0,3,2242},{7,0,5427},{0,3,2242},{1,6,1448},{1,6,1448},{1,6,1448},{1,4,1512},{0,5,1184},{0,4,58},{0,4,58},{0,2,178},{0,2,2995},{0,2,1139},{1,6,292},{1,6,292},{1,6,292},{2,3,325},{2,2,1152}, +{0,4,58},{0,4,58},{0,2,178},{5,0,1152},{0,2,178},{5,1,1570},{0,7,34},{2,4,2},{0,4,10},{5,1,1570},{4,3,1570},{0,4,10},{0,3,1666},{4,3,1570},{0,3,1666},{1,0,1412},{1,0,1412},{1,0,1412},{1,0,1412},{0,3,36},{0,3,36},{0,3,36},{0,2,9},{0,1,722},{0,1,722},{1,7,3816},{1,6,1748},{1,5,2450},{1,4,1685},{0,7,5983},{0,6,2180},{0,4,207}, +{0,3,2278},{0,4,9004},{0,3,4038},{2,7,1700},{2,6,462},{2,4,230},{2,4,406},{3,3,5420},{0,6,2176},{0,4,203},{0,3,2274},{6,1,5420},{0,3,2274},{1,6,1604},{1,6,1604},{1,6,1604},{1,4,1604},{0,6,1156},{0,4,126},{0,4,126},{0,3,429},{0,3,3044},{0,2,1307},{2,5,136},{2,5,136},{2,5,136},{2,3,149},{3,1,1152},{0,4,122},{0,4,122},{0,3,425},{4,1,1152}, +{0,3,425},{6,0,1570},{0,7,130},{2,4,130},{1,4,85},{6,0,1570},{3,4,1570},{1,4,85},{0,3,2018},{3,4,1570},{0,3,2018},{1,0,1600},{1,0,1600},{1,0,1600},{1,0,1600},{0,4,5},{0,4,5},{0,4,5},{0,2,29},{0,2,866},{0,2,866},{1,7,4520},{1,7,1608},{1,5,2418},{1,4,1925},{1,7,5996},{0,6,1956},{0,5,409},{0,4,2751},{0,5,9020},{0,3,3846},{2,7,1604}, +{2,6,174},{2,5,297},{2,4,342},{4,2,5420},{0,6,1856},{0,5,309},{0,4,2651},{5,2,5420},{0,4,2651},{1,7,1604},{1,7,1604},{1,7,1604},{1,4,1636},{0,7,1302},{0,5,120},{0,5,120},{0,3,189},{0,3,2820},{0,3,1245},{2,5,8},{2,5,8},{2,5,8},{2,4,53},{4,0,1154},{0,5,20},{0,5,20},{0,3,89},{3,2,1154},{0,3,89},{4,4,1568},{1,7,8},{2,5,293}, +{0,5,293},{4,4,1568},{7,2,1568},{0,5,293},{0,4,1810},{7,2,1568},{0,4,1810},{1,0,1600},{1,0,1600},{1,0,1600},{1,0,1600},{0,5,116},{0,5,116},{0,5,116},{0,3,164},{0,2,610},{0,2,610},{2,7,4356},{1,7,2004},{2,5,2635},{1,5,2006},{1,7,5924},{0,6,2316},{0,5,499},{0,4,2337},{0,5,8300},{0,4,3420},{2,7,1955},{2,7,299},{2,5,234},{2,5,474},{5,1,5420}, +{0,6,1955},{0,5,138},{0,4,1976},{4,3,5420},{0,4,1976},{1,7,1955},{1,7,1955},{1,7,1955},{1,5,1942},{1,6,1427},{0,5,435},{0,5,435},{0,3,378},{0,4,2628},{0,3,642},{2,6,53},{2,6,53},{2,6,53},{2,4,53},{2,4,1152},{0,5,74},{0,5,74},{0,3,17},{7,0,1152},{0,3,17},{5,3,1570},{1,7,98},{3,5,164},{1,5,100},{5,3,1570},{6,3,1570},{1,5,100}, +{0,4,1576},{6,3,1570},{0,4,1576},{1,0,1906},{1,0,1906},{1,0,1906},{1,0,1906},{1,4,234},{1,4,234},{1,4,234},{1,2,325},{0,3,626},{0,3,626},{2,7,4356},{2,7,1964},{2,5,2267},{2,5,2027},{1,7,6404},{1,6,2220},{1,5,117},{1,4,2314},{0,5,8204},{0,4,2684},{3,7,1929},{2,7,283},{3,5,365},{2,5,346},{6,0,5420},{0,7,1712},{1,5,68},{0,4,1784},{3,4,5420}, +{0,4,1784},{2,6,1942},{2,6,1942},{2,6,1942},{2,4,2006},{1,6,1219},{1,5,117},{1,5,117},{1,3,209},{0,4,2340},{0,3,514},{2,6,261},{2,6,261},{2,6,261},{2,4,325},{3,3,1154},{0,6,50},{0,6,50},{1,3,160},{6,1,1154},{1,3,160},{6,2,1568},{2,7,58},{3,5,4},{1,5,4},{6,2,1568},{5,4,1568},{1,5,4},{0,4,1640},{5,4,1568},{0,4,1640},{2,0,1906}, +{2,0,1906},{2,0,1906},{2,0,1906},{1,4,74},{1,4,74},{1,4,74},{1,3,65},{0,3,370},{0,3,370},{2,7,4868},{2,7,1740},{2,5,2411},{2,5,1691},{2,7,6548},{1,7,2244},{1,5,165},{1,4,2250},{0,6,7668},{0,4,2460},{3,7,1817},{3,7,525},{3,5,221},{3,5,441},{4,4,5419},{0,7,1712},{1,5,164},{0,4,1976},{7,2,5419},{0,4,1976},{2,7,1619},{2,7,1619},{2,7,1619}, +{2,5,1627},{1,7,1155},{1,5,101},{1,5,101},{1,3,417},{0,5,2379},{0,4,696},{3,5,157},{3,5,157},{3,5,157},{3,4,157},{4,2,1154},{0,6,82},{0,6,82},{0,4,212},{5,2,1154},{0,4,212},{7,1,1568},{2,7,122},{3,5,100},{2,5,73},{7,1,1568},{4,5,1568},{2,5,73},{0,4,1960},{4,5,1568},{0,4,1960},{2,0,1618},{2,0,1618},{2,0,1618},{2,0,1618},{1,5,1}, +{1,5,1},{1,5,1},{1,3,17},{0,3,370},{0,3,370},{3,7,5570},{2,7,2028},{2,6,2394},{2,5,1867},{2,7,6452},{1,7,1956},{1,6,439},{1,4,2698},{0,6,7348},{0,4,2748},{3,7,2089},{3,7,189},{3,6,334},{3,5,329},{5,3,5419},{1,7,1875},{1,6,358},{0,5,2145},{6,3,5419},{0,5,2145},{2,7,1667},{2,7,1667},{2,7,1667},{2,5,1611},{1,7,1331},{1,6,115},{1,6,115}, +{1,4,198},{0,5,1979},{0,4,248},{3,6,10},{3,6,10},{3,6,10},{3,5,73},{5,1,1160},{1,6,34},{1,6,34},{0,4,52},{7,1,1160},{0,4,52},{5,5,1570},{3,7,180},{4,5,320},{2,5,281},{5,5,1570},{3,6,1570},{2,5,281},{0,5,1856},{3,6,1570},{0,5,1856},{2,0,1586},{2,0,1586},{2,0,1586},{2,0,1586},{1,6,106},{1,6,106},{1,6,106},{1,4,162},{0,4,212}, +{0,4,212},{3,7,5354},{3,7,2770},{3,6,2717},{2,6,1986},{2,7,6956},{1,7,2244},{1,6,457},{1,5,2351},{0,7,7268},{0,5,1974},{4,7,2384},{3,7,270},{3,6,217},{3,6,517},{6,2,5419},{1,7,1920},{1,6,133},{0,5,1650},{5,4,5419},{0,5,1650},{2,7,2180},{2,7,2180},{2,7,2180},{2,6,1905},{2,7,1480},{1,6,376},{1,6,376},{1,4,333},{0,5,1988},{0,4,203},{3,7,45}, +{3,7,45},{3,7,45},{3,5,37},{6,0,1154},{1,6,52},{1,6,52},{1,4,9},{3,4,1154},{1,4,9},{6,4,1568},{3,7,234},{3,6,181},{1,6,117},{6,4,1568},{7,4,1568},{1,6,117},{0,5,1586},{7,4,1568},{0,5,1586},{2,0,1856},{2,0,1856},{2,0,1856},{2,0,1856},{2,5,272},{2,5,272},{2,5,272},{1,4,324},{0,4,194},{0,4,194},{3,7,5706},{3,7,2514},{3,6,2285}, +{3,6,2105},{3,7,7359},{2,7,2244},{2,6,147},{2,5,2358},{0,7,6820},{0,5,1718},{4,7,2256},{3,7,750},{4,6,410},{3,6,341},{7,1,5419},{2,7,2180},{2,6,83},{0,5,1618},{4,5,5419},{0,5,1618},{3,7,1985},{3,7,1985},{3,7,1985},{3,5,2041},{2,7,1224},{2,6,146},{2,6,146},{2,4,210},{0,6,1644},{1,4,509},{3,7,221},{3,7,221},{3,7,221},{3,5,277},{5,2,1160}, +{1,7,64},{1,7,64},{2,4,146},{7,2,1160},{2,4,146},{7,3,1570},{4,7,356},{4,6,10},{2,6,2},{7,3,1570},{6,5,1570},{2,6,2},{0,5,1618},{6,5,1570},{0,5,1618},{3,0,1960},{3,0,1960},{3,0,1960},{3,0,1960},{2,5,80},{2,5,80},{2,5,80},{2,4,89},{0,5,100},{0,5,100},{3,7,6570},{3,7,2770},{3,6,2365},{3,6,1705},{3,7,7311},{2,7,2276},{2,6,131}, +{2,5,2230},{0,7,6884},{0,5,1974},{4,7,2512},{4,7,532},{4,6,218},{4,6,482},{5,5,5424},{2,7,2276},{2,6,131},{1,5,1931},{3,6,5424},{1,5,1931},{3,7,1809},{3,7,1809},{3,7,1809},{3,6,1656},{2,7,1352},{2,6,82},{2,6,82},{2,4,370},{0,6,1548},{0,5,293},{4,6,169},{4,6,169},{4,6,169},{4,5,169},{6,1,1160},{1,7,64},{1,7,64},{1,5,250},{6,3,1160}, +{1,5,250},{5,7,1570},{4,7,388},{4,6,74},{3,6,65},{5,7,1570},{5,6,1570},{3,6,65},{0,5,1906},{5,6,1570},{0,5,1906},{3,0,1640},{3,0,1640},{3,0,1640},{3,0,1640},{2,6,1},{2,6,1},{2,6,1},{2,4,9},{0,5,68},{0,5,68},{4,7,6752},{3,7,3538},{3,7,2378},{3,6,1817},{3,7,7775},{2,7,2820},{2,7,477},{2,5,2614},{1,7,7360},{0,6,1978},{5,7,3110}, +{4,7,692},{4,7,377},{4,6,322},{6,4,5424},{3,7,2539},{2,7,413},{0,6,1942},{7,4,5424},{0,6,1942},{3,7,2017},{3,7,2017},{3,7,2017},{3,6,1592},{3,7,1846},{2,7,116},{2,7,116},{2,5,213},{0,7,1531},{1,5,283},{4,7,16},{4,7,16},{4,7,16},{4,6,97},{7,0,1154},{2,7,52},{2,7,52},{1,5,58},{3,5,1154},{1,5,58},{7,4,1576},{5,7,610},{5,6,306}, +{3,6,241},{7,4,1576},{7,5,1576},{3,6,241},{0,6,1906},{7,5,1576},{0,6,1906},{3,0,1576},{3,0,1576},{3,0,1576},{3,0,1576},{2,7,100},{2,7,100},{2,7,100},{2,5,164},{0,6,72},{0,6,72},{4,7,6932},{4,7,3932},{4,7,2807},{3,7,1974},{4,7,8428},{3,7,2981},{2,7,423},{2,6,2373},{1,7,7540},{0,6,1618},{5,7,2921},{4,7,1331},{4,7,206},{4,7,566},{7,3,5424}, +{3,7,2692},{2,7,134},{0,6,1609},{6,5,5424},{0,6,1609},{4,7,2707},{4,7,2707},{4,7,2707},{3,7,1874},{3,7,1513},{2,7,323},{2,7,323},{2,5,294},{0,7,1324},{1,5,184},{4,7,106},{4,7,106},{4,7,106},{4,6,25},{7,1,1160},{2,7,34},{2,7,34},{2,5,5},{7,3,1160},{2,5,5},{7,5,1570},{5,7,628},{4,7,181},{2,7,125},{7,5,1570},{6,6,1586},{2,7,125}, +{0,6,1600},{6,6,1586},{0,6,1600},{3,0,1810},{3,0,1810},{3,0,1810},{3,0,1810},{2,7,298},{2,7,298},{2,7,298},{2,5,290},{0,6,18},{0,6,18},{4,7,7636},{4,7,4156},{4,7,2311},{4,7,2191},{4,7,8428},{3,7,3317},{3,7,185},{3,6,2410},{2,7,8180},{1,6,1722},{5,7,3161},{5,7,1357},{5,7,461},{4,7,342},{5,7,5424},{4,7,2979},{3,7,104},{1,6,1601},{5,6,5424}, +{1,6,1601},{4,7,2307},{4,7,2307},{4,7,2307},{4,6,2082},{3,7,1625},{3,7,181},{3,7,181},{3,5,217},{0,7,1548},{1,5,504},{5,7,457},{5,7,457},{5,7,457},{4,6,233},{6,3,1154},{3,7,100},{3,7,100},{3,5,136},{6,4,1154},{3,5,136},{6,7,1576},{5,7,916},{5,7,20},{3,7,4},{6,7,1576},{7,6,1576},{3,7,4},{0,6,1600},{7,6,1576},{0,6,1600},{4,0,2018}, +{4,0,2018},{4,0,2018},{4,0,2018},{3,6,90},{3,6,90},{3,6,90},{3,5,117},{0,7,104},{0,7,104},{5,7,7862},{4,7,4316},{4,7,2291},{4,7,1691},{4,7,8004},{3,7,3433},{3,7,69},{3,6,1774},{2,7,7580},{1,6,1470},{5,7,3101},{5,7,1209},{5,7,185},{4,7,466},{7,4,4803},{4,7,2579},{3,7,68},{2,6,1448},{7,5,4803},{2,6,1448},{4,7,2291},{4,7,2291},{4,7,2291}, +{4,7,1691},{3,7,2121},{3,7,69},{3,7,69},{3,5,329},{1,7,1539},{1,6,314},{5,7,185},{5,7,185},{5,7,185},{5,6,185},{7,2,1154},{3,7,68},{3,7,68},{2,6,292},{5,5,1154},{2,6,292},{7,6,1252},{6,7,724},{5,7,16},{4,7,25},{7,6,1252},{7,6,1268},{4,7,25},{0,6,1412},{7,6,1268},{0,6,1412},{4,0,1666},{4,0,1666},{4,0,1666},{4,0,1666},{3,7,5}, +{3,7,5},{3,7,5},{3,5,5},{0,7,40},{0,7,40},{5,7,6806},{4,7,4684},{4,7,2659},{4,7,1579},{4,7,7668},{4,7,2988},{3,7,341},{3,6,1390},{2,7,7084},{1,6,1470},{6,7,2645},{5,7,1193},{5,7,169},{5,7,125},{6,6,4059},{4,7,2259},{4,7,234},{2,6,1224},{4,7,4059},{2,6,1224},{4,7,2659},{4,7,2659},{4,7,2659},{4,7,1579},{4,7,2043},{3,7,341},{3,7,341}, +{3,6,234},{1,7,1779},{1,6,314},{5,7,169},{5,7,169},{5,7,169},{5,7,125},{5,6,1152},{4,7,234},{4,7,234},{2,6,68},{4,6,1152},{2,6,68},{7,6,900},{6,7,500},{6,7,100},{4,7,9},{7,6,900},{6,7,884},{4,7,9},{0,6,1220},{6,7,884},{0,6,1220},{4,0,1570},{4,0,1570},{4,0,1570},{4,0,1570},{3,7,85},{3,7,85},{3,7,85},{3,5,149},{1,7,98}, +{1,7,98},{5,7,6077},{5,7,4185},{5,7,3161},{4,7,1912},{5,7,6790},{4,7,2529},{4,7,504},{3,6,1417},{3,7,6199},{1,7,1097},{6,7,1925},{6,7,1301},{5,7,457},{5,7,17},{7,5,3321},{5,7,1754},{4,7,180},{1,7,1093},{6,6,3345},{1,7,1093},{5,7,3161},{5,7,3161},{5,7,3161},{4,7,1912},{4,7,2124},{4,7,504},{4,7,504},{3,6,261},{2,7,1944},{2,6,171},{5,7,457}, +{5,7,457},{5,7,457},{5,7,17},{6,5,1154},{4,7,180},{4,7,180},{3,6,5},{3,7,1154},{3,6,5},{7,7,605},{6,7,401},{6,7,1},{5,7,1},{7,7,605},{6,7,569},{5,7,1},{0,7,1089},{6,7,569},{0,7,1089},{4,0,1768},{4,0,1768},{4,0,1768},{4,0,1768},{4,7,360},{4,7,360},{4,7,360},{3,6,260},{1,7,8},{1,7,8},{5,7,5837},{5,7,3945},{5,7,2921}, +{5,7,2129},{5,7,6054},{4,7,2529},{4,7,504},{4,6,1386},{3,7,5767},{2,7,773},{6,7,1557},{6,7,933},{6,7,533},{5,7,193},{6,7,2754},{5,7,1434},{4,7,404},{2,7,629},{5,7,2754},{2,7,629},{5,7,2921},{5,7,2921},{5,7,2921},{5,7,2129},{4,7,2604},{4,7,504},{4,7,504},{4,6,230},{2,7,2264},{2,6,443},{6,7,533},{6,7,533},{6,7,533},{5,7,193},{7,4,1152}, +{4,7,404},{4,7,404},{3,6,117},{7,5,1152},{3,6,117},{7,7,317},{7,7,245},{6,7,49},{6,7,25},{7,7,317},{7,7,373},{6,7,25},{0,7,625},{7,7,373},{0,7,625},{5,0,2080},{5,0,2080},{5,0,2080},{5,0,2080},{4,7,104},{4,7,104},{4,7,104},{4,6,149},{2,7,148},{2,7,148},{5,7,5981},{5,7,4089},{5,7,3065},{5,7,1921},{5,7,5702},{5,7,2666},{4,7,888}, +{4,7,693},{4,7,5325},{2,7,341},{6,7,1445},{6,7,821},{6,7,421},{6,7,205},{7,6,2306},{5,7,1370},{5,7,346},{2,7,325},{7,6,2274},{2,7,325},{5,7,3065},{5,7,3065},{5,7,3065},{5,7,1921},{5,7,2786},{4,7,888},{4,7,888},{4,6,294},{3,7,2355},{2,7,341},{6,7,421},{6,7,421},{6,7,421},{6,7,205},{7,5,1184},{5,7,346},{5,7,346},{4,6,290},{6,6,1152}, +{4,6,290},{7,7,157},{7,7,85},{7,7,36},{6,7,9},{7,7,157},{7,7,149},{6,7,9},{0,7,289},{7,7,149},{0,7,289},{5,0,1696},{5,0,1696},{5,0,1696},{5,0,1696},{4,7,104},{4,7,104},{4,7,104},{4,6,5},{2,7,52},{2,7,52},{6,7,5433},{5,7,4617},{5,7,3593},{5,7,2097},{5,7,5734},{5,7,2346},{5,7,1322},{4,7,261},{4,7,4909},{2,7,293},{6,7,1589}, +{6,7,965},{6,7,565},{6,7,157},{7,6,1890},{6,7,1146},{5,7,538},{3,7,82},{6,7,1890},{3,7,82},{5,7,3593},{5,7,3593},{5,7,3593},{5,7,2097},{5,7,2818},{5,7,1322},{5,7,1322},{4,7,261},{3,7,2691},{2,7,293},{6,7,565},{6,7,565},{6,7,565},{6,7,157},{6,7,1154},{5,7,538},{5,7,538},{3,7,82},{5,7,1154},{3,7,82},{7,7,125},{7,7,53},{7,7,4}, +{7,7,4},{7,7,125},{7,7,53},{7,7,4},{0,7,81},{7,7,53},{0,7,81},{5,0,1568},{5,0,1568},{5,0,1568},{5,0,1568},{4,7,360},{4,7,360},{4,7,360},{4,6,117},{2,7,212},{2,7,212},{6,7,4866},{6,7,4242},{6,7,3842},{5,7,2754},{6,7,5113},{5,7,2445},{5,7,1421},{4,7,234},{5,7,4804},{3,7,164},{7,7,1203},{7,7,1131},{6,7,1033},{6,7,409},{7,7,1611}, +{6,7,1056},{6,7,656},{4,7,9},{6,7,1584},{4,7,9},{6,7,3842},{6,7,3842},{6,7,3842},{5,7,2754},{5,7,3313},{5,7,1421},{5,7,1421},{4,7,234},{4,7,2875},{3,7,164},{6,7,1033},{6,7,1033},{6,7,1033},{6,7,409},{7,6,1152},{6,7,656},{6,7,656},{4,7,9},{7,6,1184},{4,7,9},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49}, +{0,7,0},{7,7,98},{0,7,0},{5,0,1730},{5,0,1730},{5,0,1730},{5,0,1730},{5,7,397},{5,7,397},{5,7,397},{4,7,234},{3,7,164},{3,7,164},{6,7,4194},{6,7,3570},{6,7,3170},{6,7,2546},{6,7,4137},{5,7,2365},{5,7,1341},{5,7,185},{5,7,3876},{3,7,324},{7,7,771},{7,7,699},{7,7,650},{6,7,521},{7,7,1083},{6,7,864},{6,7,464},{4,7,25},{7,7,1187}, +{4,7,25},{6,7,3170},{6,7,3170},{6,7,3170},{6,7,2546},{6,7,3113},{5,7,1341},{5,7,1341},{5,7,185},{4,7,2491},{3,7,324},{7,7,650},{7,7,650},{7,7,650},{6,7,521},{7,6,832},{6,7,464},{6,7,464},{4,7,25},{6,7,800},{4,7,25},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{5,0,2146}, +{5,0,2146},{5,0,2146},{5,0,2146},{5,7,317},{5,7,317},{5,7,317},{5,7,185},{3,7,324},{3,7,324},{6,7,3778},{6,7,3154},{6,7,2754},{6,7,2130},{6,7,3417},{6,7,2169},{5,7,1517},{5,7,9},{5,7,3204},{4,7,338},{7,7,467},{7,7,395},{7,7,346},{7,7,274},{7,7,683},{7,7,539},{6,7,400},{5,7,0},{7,7,723},{5,7,0},{6,7,2754},{6,7,2754},{6,7,2754}, +{6,7,2130},{6,7,2393},{5,7,1517},{5,7,1517},{5,7,9},{5,7,2180},{4,7,338},{7,7,346},{7,7,346},{7,7,346},{7,7,274},{7,7,562},{6,7,400},{6,7,400},{5,7,0},{6,7,544},{5,7,0},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{6,0,1730},{6,0,1730},{6,0,1730},{6,0,1730},{5,7,493}, +{5,7,493},{5,7,493},{5,7,9},{4,7,338},{4,7,338},{6,7,3618},{6,7,2994},{6,7,2594},{6,7,1970},{6,7,2953},{6,7,1705},{6,7,1305},{5,7,89},{5,7,2788},{4,7,466},{7,7,291},{7,7,219},{7,7,170},{7,7,98},{7,7,411},{7,7,267},{7,7,218},{6,7,16},{7,7,387},{6,7,16},{6,7,2594},{6,7,2594},{6,7,2594},{6,7,1970},{6,7,1929},{6,7,1305},{6,7,1305}, +{5,7,89},{5,7,1764},{4,7,466},{7,7,170},{7,7,170},{7,7,170},{7,7,98},{7,7,290},{7,7,218},{7,7,218},{6,7,16},{7,7,338},{6,7,16},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{6,0,1570},{6,0,1570},{6,0,1570},{6,0,1570},{6,7,905},{6,7,905},{6,7,905},{5,7,89},{4,7,466}, +{4,7,466},{0,5,2665},{0,4,697},{0,3,290},{0,2,841},{0,3,5901},{0,2,4170},{0,2,1802},{0,1,4310},{0,1,6951},{0,1,4671},{0,5,2665},{0,4,697},{0,3,290},{0,2,841},{2,0,5893},{0,2,4170},{0,2,1802},{0,1,4310},{3,0,5893},{0,1,4310},{0,2,4},{0,2,4},{0,2,4},{0,1,4},{0,1,557},{0,1,365},{0,1,365},{0,0,356},{0,0,665},{0,0,392},{0,2,4}, +{0,2,4},{0,2,4},{0,1,4},{0,1,557},{0,1,365},{0,1,365},{0,0,356},{0,0,629},{0,0,356},{3,0,2665},{0,4,697},{0,3,290},{0,2,841},{3,0,2665},{3,1,2665},{0,2,841},{0,2,3145},{3,1,2665},{0,2,3145},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,6,2705},{0,4,617},{0,3,34}, +{0,2,985},{0,4,6754},{0,3,4625},{0,2,1946},{0,1,5030},{0,2,7635},{0,1,5391},{0,6,2705},{0,4,617},{0,3,34},{0,2,985},{1,2,6674},{0,3,4625},{0,2,1946},{0,1,5030},{0,2,6674},{0,1,5030},{0,3,9},{0,3,9},{0,3,9},{0,1,100},{0,1,845},{0,1,461},{0,1,461},{0,0,676},{0,0,1097},{0,0,712},{0,3,9},{0,3,9},{0,3,9},{0,1,100},{0,1,845}, +{0,1,461},{0,1,461},{0,0,676},{1,0,853},{0,0,676},{1,4,2665},{0,4,617},{0,3,34},{0,2,985},{1,4,2665},{2,2,2665},{0,2,985},{0,2,2777},{2,2,2665},{0,2,2777},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,6,2689},{0,5,477},{0,3,34},{0,3,634},{0,4,7538},{0,3,4865},{0,2,2346}, +{0,2,5474},{0,2,8547},{0,1,6367},{0,6,2689},{0,5,477},{0,3,34},{0,3,634},{0,4,7538},{0,3,4865},{0,2,2346},{0,2,5474},{2,1,7538},{0,2,5474},{0,3,25},{0,3,25},{0,3,25},{0,2,16},{0,1,1261},{0,1,685},{0,1,685},{0,1,965},{0,1,1646},{0,0,1160},{0,3,25},{0,3,25},{0,3,25},{0,2,16},{1,0,1213},{0,1,685},{0,1,685},{0,1,965},{1,0,1205}, +{0,1,965},{2,3,2669},{0,5,477},{0,3,34},{0,3,634},{2,3,2669},{6,0,2669},{0,3,634},{0,2,2665},{6,0,2669},{0,2,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,7,2669},{0,5,365},{0,3,290},{0,3,410},{0,4,8578},{0,3,5361},{0,3,2346},{0,2,5618},{0,2,9715},{0,2,6579},{0,7,2669}, +{0,5,365},{0,3,290},{0,3,410},{2,1,8498},{0,3,5361},{0,3,2346},{0,2,5618},{4,0,8498},{0,2,5618},{0,4,0},{0,4,0},{0,4,0},{0,2,16},{0,2,1637},{0,2,977},{0,2,977},{0,1,997},{0,1,1998},{0,1,1358},{0,4,0},{0,4,0},{0,4,0},{0,2,16},{1,0,1629},{0,2,977},{0,2,977},{0,1,997},{0,1,1637},{0,1,997},{3,2,2669},{0,5,365},{1,3,185}, +{0,3,410},{3,2,2669},{5,1,2669},{0,3,410},{0,2,2809},{5,1,2669},{0,2,2809},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,7,2777},{0,6,257},{0,4,277},{0,3,464},{0,5,9677},{0,4,6026},{0,3,2400},{0,2,6086},{0,2,11335},{0,2,7047},{0,7,2777},{0,6,257},{0,4,277},{0,3,464},{3,0,9677}, +{0,4,6026},{0,3,2400},{0,2,6086},{3,1,9677},{0,2,6086},{0,5,16},{0,5,16},{0,5,16},{0,3,64},{0,2,2186},{0,2,1130},{0,2,1130},{0,1,1186},{0,1,2547},{0,1,1547},{0,5,16},{0,5,16},{0,5,16},{0,3,64},{0,2,2186},{0,2,1130},{0,2,1130},{0,1,1186},{0,1,2186},{0,1,1186},{4,1,2669},{0,6,257},{0,4,277},{0,3,464},{4,1,2669},{4,2,2669},{0,3,464}, +{0,3,3209},{4,2,2669},{0,3,3209},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,7,3209},{0,6,209},{0,4,389},{0,4,541},{0,6,9765},{0,4,5546},{0,3,2080},{0,2,5990},{0,3,11621},{0,2,6951},{0,7,3209},{0,6,209},{0,4,389},{0,4,541},{1,4,9677},{0,4,5546},{0,3,2080},{0,2,5990},{2,2,9677}, +{0,2,5990},{0,5,80},{0,5,80},{0,5,80},{0,3,64},{0,3,2196},{0,2,970},{0,2,970},{0,1,1058},{0,1,2739},{0,1,1419},{0,5,80},{0,5,80},{0,5,80},{0,3,64},{1,1,2180},{0,2,970},{0,2,970},{0,1,1058},{1,1,2196},{0,1,1058},{5,0,2669},{0,6,145},{1,4,52},{0,4,477},{5,0,2669},{3,3,2669},{0,4,477},{0,3,2809},{3,3,2669},{0,3,2809},{0,0,64}, +{0,0,64},{0,0,64},{0,0,64},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,40},{0,0,40},{0,7,4025},{0,7,441},{0,4,885},{0,4,429},{0,6,9685},{0,4,5450},{0,4,1854},{0,3,6029},{0,3,11925},{0,2,7239},{1,7,3001},{0,7,441},{1,4,344},{0,4,429},{3,1,9685},{0,4,5450},{0,4,1854},{0,3,6029},{4,1,9685},{0,3,6029},{0,6,256},{0,6,256},{0,6,256}, +{0,3,320},{0,3,2228},{0,3,848},{0,3,848},{0,1,1186},{0,2,3171},{0,1,1547},{0,6,256},{0,6,256},{0,6,256},{0,3,320},{2,0,2180},{0,3,848},{0,3,848},{0,1,1186},{3,0,2180},{0,1,1186},{4,2,2677},{0,7,185},{1,4,20},{0,4,173},{4,2,2677},{7,1,2677},{0,4,173},{0,3,2665},{7,1,2677},{0,3,2665},{0,0,256},{0,0,256},{0,0,256},{0,0,256},{0,1,9}, +{0,1,9},{0,1,9},{0,0,36},{0,0,72},{0,0,72},{1,7,4141},{0,7,617},{1,4,1500},{0,4,701},{0,7,9690},{0,5,5001},{0,4,1214},{0,3,5277},{0,3,12613},{0,3,7213},{1,7,2985},{1,6,465},{1,4,344},{1,4,524},{4,0,9674},{0,5,5001},{0,4,1214},{0,3,5277},{3,2,9674},{0,3,5277},{0,7,601},{0,7,601},{0,7,601},{0,4,601},{0,4,2178},{0,3,656},{0,3,656}, +{0,2,866},{0,2,3171},{0,2,1827},{1,5,101},{1,5,101},{1,5,101},{1,3,109},{0,4,2178},{0,3,656},{0,3,656},{0,2,866},{2,1,2178},{0,2,866},{5,1,2669},{0,7,41},{2,4,181},{0,4,125},{5,1,2669},{4,3,2669},{0,4,125},{0,3,2777},{4,3,2669},{0,3,2777},{0,0,576},{0,0,576},{0,0,576},{0,0,576},{0,1,25},{0,1,25},{0,1,25},{0,1,49},{0,0,232}, +{0,0,232},{1,7,4582},{0,7,1274},{1,5,1446},{0,4,1466},{0,7,9789},{0,5,4794},{0,4,953},{0,3,4890},{0,4,13038},{0,3,6826},{1,7,3426},{1,7,290},{1,5,290},{1,4,443},{2,4,9685},{0,5,4794},{0,4,953},{0,3,4890},{7,0,9685},{0,3,4890},{0,7,1105},{0,7,1105},{0,7,1105},{0,4,1105},{0,5,2210},{0,4,592},{0,4,592},{0,2,596},{0,2,3477},{0,2,1557},{1,6,26}, +{1,6,26},{1,6,26},{1,4,82},{1,3,2180},{0,4,592},{0,4,592},{0,2,596},{1,2,2180},{0,2,596},{6,0,2677},{0,7,185},{1,5,289},{0,4,377},{6,0,2677},{5,3,2677},{0,4,377},{0,3,3209},{5,3,2677},{0,3,3209},{0,0,1089},{0,0,1089},{0,0,1089},{0,0,1089},{0,2,4},{0,2,4},{0,2,4},{0,1,4},{0,1,365},{0,1,365},{1,7,5382},{1,7,1350},{1,5,1510}, +{1,5,1738},{0,7,10285},{0,6,4406},{0,5,971},{0,3,4954},{0,4,13534},{0,3,6890},{2,7,3454},{1,7,194},{1,5,354},{1,5,582},{3,3,9674},{0,6,4406},{0,5,971},{0,3,4954},{6,1,9674},{0,3,4954},{1,6,1214},{1,6,1214},{1,6,1214},{1,4,1206},{0,5,2210},{0,4,400},{0,4,400},{0,2,628},{0,2,4021},{0,2,1589},{1,6,58},{1,6,58},{1,6,58},{1,4,50},{2,2,2178}, +{0,4,400},{0,4,400},{0,2,628},{5,0,2178},{0,2,628},{4,4,2669},{1,7,145},{2,5,74},{0,5,130},{4,4,2669},{7,2,2669},{0,5,130},{0,4,2845},{7,2,2669},{0,4,2845},{1,0,1205},{1,0,1205},{1,0,1205},{1,0,1205},{0,3,9},{0,3,9},{0,3,9},{0,1,100},{0,1,461},{0,1,461},{1,7,6566},{1,7,1638},{1,5,1958},{1,5,1578},{1,7,10830},{0,6,4118},{0,5,443}, +{0,4,4785},{0,4,14414},{0,3,7338},{2,7,3390},{1,7,482},{2,5,371},{1,5,422},{4,2,9674},{0,6,4118},{0,5,443},{0,4,4785},{5,2,9674},{0,4,4785},{1,7,1382},{1,7,1382},{1,7,1382},{1,4,1430},{0,6,2178},{0,5,442},{0,5,442},{0,3,641},{0,3,4242},{0,2,1877},{1,7,226},{1,7,226},{1,7,226},{1,4,274},{3,1,2178},{0,5,442},{0,5,442},{0,3,641},{4,1,2178}, +{0,3,641},{5,3,2669},{1,7,257},{2,5,10},{0,5,2},{5,3,2669},{6,3,2669},{0,5,2},{0,4,2669},{6,3,2669},{0,4,2669},{1,0,1381},{1,0,1381},{1,0,1381},{1,0,1381},{0,3,25},{0,3,25},{0,3,25},{0,2,16},{0,1,685},{0,1,685},{1,7,8134},{1,7,2310},{1,6,2671},{1,5,1802},{1,7,11086},{0,7,4109},{0,5,299},{0,4,4193},{0,5,14830},{0,4,7442},{2,7,3710}, +{2,7,490},{2,5,323},{2,5,563},{5,1,9669},{0,7,4109},{0,5,299},{0,4,4193},{4,3,9669},{0,4,4193},{1,7,1734},{1,7,1734},{1,7,1734},{1,5,1721},{0,7,2228},{0,5,218},{0,5,218},{0,3,305},{0,3,4626},{0,3,2241},{2,6,125},{2,6,125},{2,6,125},{2,4,125},{4,0,2180},{0,5,218},{0,5,218},{0,3,305},{3,2,2180},{0,3,305},{6,2,2665},{2,7,369},{3,5,181}, +{1,5,117},{6,2,2665},{5,4,2665},{1,5,117},{0,4,2749},{5,4,2665},{0,4,2749},{1,0,1685},{1,0,1685},{1,0,1685},{1,0,1685},{0,4,0},{0,4,0},{0,4,0},{0,2,16},{0,2,977},{0,2,977},{2,7,9153},{1,7,3525},{1,6,3220},{1,5,2513},{1,7,11833},{0,7,3686},{0,6,548},{0,4,3986},{0,5,15577},{0,4,7235},{3,7,4141},{2,7,481},{2,6,309},{2,5,428},{6,0,9674}, +{0,7,3686},{0,6,548},{0,4,3986},{3,4,9674},{0,4,3986},{1,7,2436},{1,7,2436},{1,7,2436},{1,5,2189},{0,7,2210},{0,5,272},{0,5,272},{0,3,233},{0,3,5364},{0,3,2169},{2,7,40},{2,7,40},{2,7,40},{2,5,104},{2,4,2178},{0,5,272},{0,5,272},{0,3,233},{7,0,2178},{0,3,233},{7,1,2669},{2,7,477},{2,6,305},{0,6,292},{7,1,2669},{4,5,2669},{0,6,292}, +{0,4,3145},{4,5,2669},{0,4,3145},{1,0,2180},{1,0,2180},{1,0,2180},{1,0,2180},{0,5,16},{0,5,16},{0,5,16},{0,3,64},{0,2,1130},{0,2,1130},{2,7,10154},{1,7,4946},{1,6,4049},{1,6,2853},{1,7,12838},{0,7,3719},{0,6,133},{0,4,4211},{0,6,16286},{0,4,7346},{3,7,4061},{2,7,881},{2,6,325},{2,6,629},{4,4,9669},{0,7,3718},{0,6,132},{0,4,4210},{7,2,9669}, +{0,4,4210},{1,7,3265},{1,7,3265},{1,7,3265},{1,6,2789},{0,7,2467},{0,6,69},{0,6,69},{0,3,442},{0,4,5602},{0,3,2290},{2,7,40},{2,7,40},{2,7,40},{2,5,40},{3,3,2180},{0,6,68},{0,6,68},{0,3,441},{6,1,2180},{0,3,441},{5,5,2665},{3,7,617},{3,6,100},{0,6,68},{5,5,2665},{3,6,2665},{0,6,68},{0,5,2885},{3,6,2665},{0,5,2885},{1,0,2689}, +{1,0,2689},{1,0,2689},{1,0,2689},{0,5,17},{0,5,17},{0,5,17},{0,3,1},{0,2,1341},{0,2,1341},{2,7,10666},{2,7,5146},{2,6,4206},{1,6,2933},{2,7,13606},{0,7,4215},{0,6,181},{0,5,3914},{0,6,15454},{0,4,7122},{3,7,4365},{3,7,1097},{3,6,404},{2,6,421},{5,3,9669},{1,7,4133},{0,6,100},{0,5,3833},{6,3,9669},{0,5,3833},{2,7,3777},{2,7,3777},{2,7,3777}, +{1,6,2933},{1,7,2805},{0,6,181},{0,6,181},{0,4,275},{0,4,5282},{0,3,2130},{2,7,296},{2,7,296},{2,7,296},{2,5,232},{4,2,2180},{0,6,100},{0,6,100},{0,4,194},{5,2,2180},{0,4,194},{6,4,2665},{3,7,697},{3,6,4},{1,6,4},{6,4,2665},{7,4,2665},{1,6,4},{0,5,2677},{7,4,2665},{0,5,2677},{1,0,2929},{1,0,2929},{1,0,2929},{1,0,2929},{0,6,81}, +{0,6,81},{0,6,81},{0,3,145},{0,3,1289},{0,3,1289},{2,7,11690},{2,7,5434},{2,7,4085},{2,6,3198},{2,7,13510},{1,7,4470},{1,6,585},{0,5,3690},{0,6,15134},{0,5,6210},{3,7,5053},{3,7,1177},{3,6,308},{2,6,597},{6,2,9670},{1,7,4181},{1,6,296},{0,5,3401},{5,4,9670},{0,5,3401},{2,7,3409},{2,7,3409},{2,7,3409},{2,6,3134},{1,7,2565},{0,7,323},{0,7,323}, +{0,4,323},{0,5,5085},{0,4,1634},{3,7,153},{3,7,153},{3,7,153},{3,5,145},{5,1,2186},{0,7,34},{0,7,34},{0,4,34},{7,1,2186},{0,4,34},{7,3,2665},{4,7,937},{3,6,164},{1,6,100},{7,3,2665},{6,5,2665},{1,6,100},{0,5,2725},{6,5,2665},{0,5,2725},{2,0,3085},{2,0,3085},{2,0,3085},{2,0,3085},{1,5,290},{1,5,290},{1,5,290},{1,3,298},{0,3,985}, +{0,3,985},{3,7,12062},{2,7,6370},{2,7,3743},{2,6,3018},{2,7,14014},{1,7,4758},{1,6,603},{1,5,4049},{0,7,14638},{0,5,5310},{4,7,4958},{3,7,1726},{3,7,334},{3,6,419},{7,1,9669},{1,7,4694},{0,7,341},{0,5,3374},{4,5,9669},{0,5,3374},{2,7,3454},{2,7,3454},{2,7,3454},{2,6,2729},{1,7,2754},{1,6,314},{1,6,314},{1,4,289},{0,5,4626},{0,4,1121},{3,7,45}, +{3,7,45},{3,7,45},{3,5,109},{6,0,2180},{0,7,52},{0,7,52},{0,4,160},{3,4,2180},{0,4,160},{5,7,2665},{4,7,1009},{4,6,293},{2,6,293},{5,7,2665},{5,6,2665},{2,6,293},{0,5,3085},{5,6,2665},{0,5,3085},{2,0,2725},{2,0,2725},{2,0,2725},{2,0,2725},{1,6,89},{1,6,89},{1,6,89},{1,4,145},{0,3,949},{0,3,949},{3,7,12414},{3,7,7246},{2,7,3983}, +{2,7,2879},{2,7,15006},{1,7,5558},{1,7,163},{1,5,4161},{0,7,14190},{0,5,5054},{4,7,5246},{4,7,2186},{3,7,302},{3,6,659},{5,5,9670},{2,7,4926},{1,7,163},{0,5,3758},{3,6,9670},{0,5,3758},{2,7,3902},{2,7,3902},{2,7,3902},{2,6,2777},{1,7,3330},{1,7,82},{1,7,82},{1,4,401},{0,6,4490},{0,4,1073},{3,7,221},{3,7,221},{3,7,221},{3,6,34},{5,2,2186}, +{1,7,82},{1,7,82},{0,5,277},{7,2,2186},{0,5,277},{6,6,2665},{5,7,1313},{4,7,130},{1,7,82},{6,6,2665},{4,7,2665},{1,7,82},{0,6,2929},{4,7,2665},{0,6,2929},{2,0,2677},{2,0,2677},{2,0,2677},{2,0,2677},{1,6,9},{1,6,9},{1,6,9},{1,4,1},{0,4,673},{0,4,673},{3,7,13278},{3,7,7502},{3,7,4254},{2,7,2895},{3,7,15045},{2,7,6114},{1,7,147}, +{1,6,3978},{0,7,14254},{0,6,4818},{4,7,5918},{4,7,2378},{4,7,443},{3,7,426},{6,4,9670},{2,7,5438},{1,7,83},{0,6,3218},{7,4,9670},{0,6,3218},{3,7,4253},{3,7,4253},{3,7,4253},{2,7,2894},{2,7,3054},{1,7,146},{1,7,146},{1,5,296},{0,6,3978},{0,5,821},{4,7,442},{4,7,442},{4,7,442},{3,6,194},{6,1,2186},{1,7,82},{1,7,82},{0,5,37},{6,3,2186}, +{0,5,37},{7,5,2665},{5,7,1361},{4,7,2},{2,7,10},{7,5,2665},{6,6,2689},{2,7,10},{0,6,2689},{6,6,2689},{0,6,2689},{2,0,2885},{2,0,2885},{2,0,2885},{2,0,2885},{1,7,65},{1,7,65},{1,7,65},{1,4,113},{0,4,625},{0,4,625},{3,7,13261},{3,7,7409},{3,7,4045},{3,7,3209},{3,7,14116},{2,7,5615},{2,7,574},{1,6,3165},{0,7,13437},{0,6,3429},{5,7,5269}, +{4,7,2275},{4,7,250},{3,7,505},{5,6,8712},{3,7,4724},{2,7,250},{0,6,2405},{4,6,8712},{0,6,2405},{3,7,4045},{3,7,4045},{3,7,4045},{3,7,3209},{2,7,3150},{2,7,574},{2,7,574},{1,5,296},{0,6,3850},{0,5,453},{4,7,250},{4,7,250},{4,7,250},{4,6,169},{7,0,2180},{2,7,250},{2,7,250},{1,5,40},{3,5,2180},{1,5,40},{6,7,2180},{5,7,1168},{4,7,81}, +{2,7,25},{6,7,2180},{5,7,2180},{2,7,25},{0,6,2180},{5,7,2180},{0,6,2180},{3,0,3145},{3,0,3145},{3,0,3145},{3,0,3145},{1,7,305},{1,7,305},{1,7,305},{1,5,292},{0,5,449},{0,5,449},{4,7,11894},{3,7,7634},{3,7,4270},{3,7,2750},{3,7,13315},{2,7,5354},{2,7,313},{1,6,2634},{1,7,12414},{0,6,2250},{5,7,4369},{4,7,2365},{4,7,340},{4,7,160},{7,3,7590}, +{3,7,4094},{2,7,232},{0,6,1721},{6,5,7590},{0,6,1721},{3,7,4270},{3,7,4270},{3,7,4270},{3,7,2750},{2,7,3717},{2,7,313},{2,7,313},{2,5,302},{0,7,3546},{0,5,498},{4,7,340},{4,7,340},{4,7,340},{4,6,97},{7,1,2186},{2,7,232},{2,7,232},{1,5,130},{7,3,2186},{1,5,130},{6,7,1649},{6,7,1025},{5,7,9},{3,7,1},{6,7,1649},{7,6,1625},{3,7,1}, +{0,6,1685},{7,6,1625},{0,6,1685},{3,0,2749},{3,0,2749},{3,0,2749},{3,0,2749},{2,7,117},{2,7,117},{2,7,117},{2,5,181},{0,5,377},{0,5,377},{4,7,11078},{4,7,7478},{3,7,4878},{3,7,2750},{4,7,12662},{3,7,5031},{2,7,489},{2,6,1911},{1,7,11470},{0,6,1610},{5,7,3841},{5,7,1949},{4,7,692},{4,7,32},{5,7,6662},{4,7,3641},{3,7,442},{0,6,1385},{5,6,6662}, +{0,6,1385},{3,7,4878},{3,7,4878},{3,7,4878},{3,7,2750},{3,7,3795},{2,7,489},{2,7,489},{2,5,366},{0,7,3354},{0,6,454},{4,7,692},{4,7,692},{4,7,692},{4,7,32},{6,3,2180},{3,7,442},{3,7,442},{0,6,229},{6,4,2180},{0,6,229},{7,6,1201},{6,7,689},{5,7,25},{4,7,16},{7,6,1201},{7,6,1225},{4,7,16},{0,6,1381},{7,6,1225},{0,6,1381},{3,0,2669}, +{3,0,2669},{3,0,2669},{3,0,2669},{2,7,5},{2,7,5},{2,7,5},{2,5,5},{0,6,229},{0,6,229},{4,7,10646},{4,7,7046},{4,7,5021},{3,7,3134},{4,7,11526},{3,7,4503},{2,7,1049},{2,6,1479},{1,7,10910},{0,6,1354},{5,7,3569},{5,7,1677},{5,7,653},{4,7,160},{7,4,5829},{4,7,3065},{3,7,410},{1,6,1209},{7,5,5829},{1,6,1209},{4,7,5021},{4,7,5021},{4,7,5021}, +{3,7,3134},{3,7,3875},{2,7,1049},{2,7,1049},{2,6,323},{0,7,3546},{0,6,198},{5,7,653},{5,7,653},{5,7,653},{4,7,160},{7,2,2180},{3,7,410},{3,7,410},{1,6,53},{5,5,2180},{1,6,53},{7,6,865},{6,7,481},{6,7,81},{4,7,16},{7,6,865},{6,7,841},{4,7,16},{0,6,1205},{6,7,841},{0,6,1205},{3,0,2845},{3,0,2845},{3,0,2845},{3,0,2845},{2,7,149}, +{2,7,149},{2,7,149},{2,5,85},{0,6,149},{0,6,149},{4,7,10598},{4,7,6998},{4,7,4973},{4,7,3353},{4,7,10774},{3,7,4359},{3,7,995},{2,6,1431},{2,7,10294},{0,7,1242},{6,7,3329},{5,7,1661},{5,7,637},{5,7,197},{6,6,5085},{4,7,2745},{3,7,634},{0,7,1098},{4,7,5085},{0,7,1098},{4,7,4973},{4,7,4973},{4,7,4973},{4,7,3353},{3,7,4339},{3,7,995},{3,7,995}, +{2,6,275},{1,7,3845},{0,6,326},{5,7,637},{5,7,637},{5,7,637},{5,7,197},{5,6,2178},{3,7,634},{3,7,634},{1,6,37},{4,6,2178},{1,6,37},{7,7,605},{6,7,401},{6,7,1},{5,7,1},{7,7,605},{6,7,569},{5,7,1},{0,7,1089},{6,7,569},{0,7,1089},{4,0,3209},{4,0,3209},{4,0,3209},{4,0,3209},{3,7,370},{3,7,370},{3,7,370},{2,6,274},{0,7,153}, +{0,7,153},{5,7,9925},{4,7,7403},{4,7,5378},{4,7,3218},{4,7,10387},{4,7,4627},{3,7,1292},{3,6,1477},{2,7,9727},{0,7,621},{6,7,2609},{5,7,1949},{5,7,925},{5,7,89},{7,5,4347},{5,7,2384},{4,7,666},{0,7,612},{6,6,4371},{0,7,612},{4,7,5378},{4,7,5378},{4,7,5378},{4,7,3218},{4,7,4762},{3,7,1292},{3,7,1292},{3,6,321},{1,7,4106},{1,6,469},{5,7,925}, +{5,7,925},{5,7,925},{5,7,89},{6,5,2180},{4,7,666},{4,7,666},{2,6,104},{3,7,2180},{2,6,104},{7,7,290},{7,7,218},{6,7,64},{6,7,16},{7,7,290},{7,7,338},{6,7,16},{0,7,576},{7,7,338},{0,7,576},{4,0,2777},{4,0,2777},{4,0,2777},{4,0,2777},{3,7,136},{3,7,136},{3,7,136},{3,5,200},{0,7,45},{0,7,45},{5,7,9269},{5,7,7377},{4,7,6146}, +{4,7,3506},{5,7,10044},{4,7,4211},{3,7,1964},{3,7,836},{3,7,9185},{0,7,477},{6,7,2241},{6,7,1617},{6,7,1217},{5,7,265},{6,7,3780},{5,7,2064},{4,7,890},{1,7,257},{5,7,3780},{1,7,257},{4,7,6146},{4,7,6146},{4,7,6146},{4,7,3506},{4,7,4826},{3,7,1964},{3,7,1964},{3,6,337},{2,7,4590},{0,7,477},{6,7,1217},{6,7,1217},{6,7,1217},{5,7,265},{7,4,2178}, +{4,7,890},{4,7,890},{1,7,257},{7,5,2178},{1,7,257},{7,7,146},{7,7,74},{7,7,25},{6,7,16},{7,7,146},{7,7,130},{6,7,16},{0,7,256},{7,7,130},{0,7,256},{4,0,2665},{4,0,2665},{4,0,2665},{4,0,2665},{3,7,200},{3,7,200},{3,7,200},{3,6,13},{0,7,221},{0,7,221},{5,7,8997},{5,7,7105},{5,7,6081},{4,7,4178},{5,7,9276},{4,7,4179},{4,7,2154}, +{3,7,356},{3,7,8721},{1,7,209},{6,7,2129},{6,7,1505},{6,7,1105},{6,7,673},{7,6,3332},{5,7,2000},{5,7,976},{2,7,73},{7,6,3300},{2,7,73},{5,7,6081},{5,7,6081},{5,7,6081},{4,7,4178},{4,7,5274},{4,7,2154},{4,7,2154},{3,7,356},{2,7,4878},{1,7,209},{6,7,1105},{6,7,1105},{6,7,1105},{6,7,673},{7,5,2210},{5,7,976},{5,7,976},{2,7,73},{6,6,2178}, +{2,7,73},{7,7,130},{7,7,58},{7,7,9},{7,7,1},{7,7,130},{7,7,50},{7,7,1},{0,7,64},{7,7,50},{0,7,64},{4,0,2809},{4,0,2809},{4,0,2809},{4,0,2809},{3,7,520},{3,7,520},{3,7,520},{3,6,61},{1,7,145},{1,7,145},{5,7,9109},{5,7,7217},{5,7,6193},{5,7,4301},{5,7,8892},{4,7,4531},{4,7,2506},{3,7,260},{4,7,8587},{1,7,289},{6,7,2273}, +{6,7,1649},{6,7,1249},{6,7,625},{7,6,2916},{6,7,1956},{5,7,1168},{2,7,25},{6,7,2916},{2,7,25},{5,7,6193},{5,7,6193},{5,7,6193},{5,7,4301},{5,7,5976},{4,7,2506},{4,7,2506},{3,7,260},{3,7,5277},{1,7,289},{6,7,1249},{6,7,1249},{6,7,1249},{6,7,625},{6,7,2180},{5,7,1168},{5,7,1168},{2,7,25},{5,7,2180},{2,7,25},{7,7,242},{7,7,170},{7,7,121}, +{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{4,0,3209},{4,0,3209},{4,0,3209},{4,0,3209},{4,7,481},{4,7,481},{4,7,481},{3,7,260},{1,7,289},{1,7,289},{6,7,8325},{5,7,6749},{5,7,5725},{5,7,3833},{5,7,7866},{5,7,4082},{4,7,2470},{4,7,265},{4,7,7219},{2,7,365},{7,7,1842},{6,7,1460},{6,7,1060},{6,7,436},{7,6,2241}, +{6,7,1425},{6,7,1025},{3,7,1},{6,7,2169},{3,7,1},{5,7,5725},{5,7,5725},{5,7,5725},{5,7,3833},{5,7,4950},{4,7,2470},{4,7,2470},{4,7,265},{3,7,4521},{2,7,365},{6,7,1060},{6,7,1060},{6,7,1060},{6,7,436},{6,7,1649},{6,7,1025},{6,7,1025},{3,7,1},{7,6,1625},{3,7,1},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49}, +{0,7,0},{7,7,98},{0,7,0},{5,0,2809},{5,0,2809},{5,0,2809},{5,0,2809},{4,7,445},{4,7,445},{4,7,445},{4,6,202},{2,7,365},{2,7,365},{6,7,7093},{6,7,6469},{5,7,5581},{5,7,3689},{5,7,7226},{5,7,3442},{5,7,2418},{4,7,25},{4,7,6275},{2,7,509},{7,7,1266},{7,7,1194},{6,7,1028},{6,7,404},{7,7,1686},{6,7,1089},{6,7,689},{4,7,16},{6,7,1641}, +{4,7,16},{5,7,5581},{5,7,5581},{5,7,5581},{5,7,3689},{5,7,4310},{5,7,2418},{5,7,2418},{4,7,25},{3,7,4121},{2,7,509},{6,7,1028},{6,7,1028},{6,7,1028},{6,7,404},{7,6,1201},{6,7,689},{6,7,689},{4,7,16},{7,6,1225},{4,7,16},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{5,0,2665}, +{5,0,2665},{5,0,2665},{5,0,2665},{4,7,685},{4,7,685},{4,7,685},{4,7,25},{2,7,509},{2,7,509},{6,7,6117},{6,7,5493},{6,7,5093},{5,7,3801},{6,7,6098},{5,7,3058},{5,7,2034},{4,7,41},{4,7,5587},{3,7,613},{7,7,818},{7,7,746},{7,7,697},{6,7,500},{7,7,1142},{6,7,881},{6,7,481},{4,7,16},{6,7,1241},{4,7,16},{6,7,5093},{6,7,5093},{6,7,5093}, +{5,7,3801},{5,7,3926},{5,7,2034},{5,7,2034},{4,7,41},{4,7,3562},{3,7,613},{7,7,697},{7,7,697},{7,7,697},{6,7,500},{7,6,865},{6,7,481},{6,7,481},{4,7,16},{6,7,841},{4,7,16},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{5,0,2777},{5,0,2777},{5,0,2777},{5,0,2777},{5,7,1010}, +{5,7,1010},{5,7,1010},{4,7,41},{3,7,613},{3,7,613},{6,7,5397},{6,7,4773},{6,7,4373},{6,7,3749},{6,7,5074},{5,7,2930},{5,7,1906},{4,7,313},{5,7,4753},{3,7,725},{7,7,498},{7,7,426},{7,7,377},{7,7,305},{7,7,726},{7,7,582},{6,7,401},{5,7,1},{7,7,774},{5,7,1},{6,7,4373},{6,7,4373},{6,7,4373},{6,7,3749},{5,7,3798},{5,7,1906},{5,7,1906}, +{4,7,313},{4,7,3130},{3,7,725},{7,7,377},{7,7,377},{7,7,377},{7,7,305},{7,7,605},{6,7,401},{6,7,401},{5,7,1},{6,7,569},{5,7,1},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{5,0,3145},{5,0,3145},{5,0,3145},{5,0,3145},{5,7,882},{5,7,882},{5,7,882},{4,7,313},{3,7,725}, +{3,7,725},{1,7,34142},{0,7,5184},{0,5,609},{0,5,4841},{1,7,46442},{0,7,24449},{0,5,9741},{0,4,24761},{0,5,65162},{0,3,40820},{0,7,10048},{0,7,2880},{0,5,545},{0,4,3204},{1,4,18070},{0,4,13297},{0,4,6453},{0,2,13857},{2,2,18070},{0,2,13857},{0,3,9},{0,3,9},{0,3,9},{0,2,36},{0,1,1145},{0,1,617},{0,1,617},{0,1,977},{0,0,1505},{0,0,1036},{0,3,9}, +{0,3,9},{0,3,9},{0,2,36},{1,0,1129},{0,1,617},{0,1,617},{0,1,977},{1,0,1105},{0,1,977},{4,2,9250},{0,7,2880},{0,5,545},{0,4,3204},{4,2,9250},{5,2,9250},{0,4,3204},{0,3,9280},{5,2,9250},{0,3,9280},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{1,7,38782},{0,7,6720},{0,5,305}, +{0,5,3801},{1,7,51082},{0,7,24961},{0,5,8701},{0,4,25849},{0,5,65535},{0,4,42094},{1,7,10502},{0,7,2624},{0,5,241},{0,4,3044},{3,1,19334},{0,4,14065},{0,4,6293},{0,3,14756},{4,1,19334},{0,3,14756},{0,4,4},{0,4,4},{0,4,4},{0,2,4},{0,2,1537},{0,1,937},{0,1,937},{0,1,977},{0,1,1898},{0,1,1338},{0,4,4},{0,4,4},{0,4,4},{0,2,4},{1,0,1513}, +{0,1,937},{0,1,937},{0,1,977},{0,1,1537},{0,1,977},{5,1,9256},{0,7,2624},{0,5,241},{0,4,3044},{5,1,9256},{7,1,9256},{0,4,3044},{0,3,9280},{7,1,9256},{0,3,9280},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{1,7,44190},{0,7,9024},{0,5,769},{0,5,3529},{1,7,56490},{0,7,26241},{0,5,8429}, +{0,4,27705},{0,5,65535},{0,4,43950},{1,7,10854},{0,7,2624},{0,5,193},{0,5,2953},{2,3,20689},{0,5,14598},{0,4,6389},{0,3,15012},{6,0,20689},{0,3,15012},{0,4,36},{0,4,36},{0,4,36},{0,2,100},{0,2,1985},{0,2,1061},{0,2,1061},{0,1,1105},{0,1,2346},{0,1,1466},{0,4,36},{0,4,36},{0,4,36},{0,2,100},{0,2,1985},{0,2,1061},{0,2,1061},{0,1,1105},{0,1,1985}, +{0,1,1105},{6,0,9256},{0,7,2624},{0,5,193},{0,5,2953},{6,0,9256},{6,2,9256},{0,5,2953},{0,3,9536},{6,2,9256},{0,3,9536},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{1,7,50366},{0,7,12096},{0,6,1101},{0,5,4025},{1,7,62666},{0,7,28289},{0,5,8925},{0,5,28912},{0,6,65535},{0,4,46574},{1,7,11462}, +{0,7,2880},{0,6,317},{0,5,2425},{4,0,22137},{0,5,15206},{0,4,6741},{0,3,15524},{3,2,22137},{0,3,15524},{0,5,1},{0,5,1},{0,5,1},{0,3,9},{0,2,2561},{0,2,1285},{0,2,1285},{0,1,1361},{0,1,2922},{0,1,1722},{0,5,1},{0,5,1},{0,5,1},{0,3,9},{1,1,2561},{0,2,1285},{0,2,1285},{0,1,1361},{2,0,2521},{0,1,1361},{5,2,9250},{0,7,2880},{0,6,317}, +{0,5,2425},{5,2,9250},{5,3,9250},{0,5,2425},{0,4,9640},{5,3,9250},{0,4,9640},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{1,7,58232},{0,7,16470},{0,6,129},{0,6,3489},{1,7,65535},{0,7,31511},{0,6,10213},{0,5,29110},{0,6,65535},{0,4,50444},{1,7,12452},{0,7,3474},{0,6,29},{0,5,2137},{2,4,23851}, +{0,6,16172},{0,5,7037},{0,3,16406},{7,0,23851},{0,3,16406},{0,6,4},{0,6,4},{0,6,4},{0,3,36},{0,3,3232},{0,2,1690},{0,2,1690},{0,1,1802},{0,1,3723},{0,1,2163},{0,6,4},{0,6,4},{0,6,4},{0,3,36},{1,1,3200},{0,2,1690},{0,2,1690},{0,1,1802},{2,0,3232},{0,1,1802},{6,1,9256},{1,7,3232},{0,6,29},{0,5,2137},{6,1,9256},{6,3,9256},{0,5,2137}, +{0,4,9298},{6,3,9256},{0,4,9298},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{1,7,65535},{0,7,21174},{0,6,81},{0,6,2545},{1,7,65535},{0,7,35191},{0,6,9269},{0,5,30102},{0,6,65535},{0,5,54602},{1,7,13604},{0,7,4274},{0,6,45},{0,5,2153},{4,1,25472},{0,6,16620},{0,5,7053},{0,3,17462},{4,2,25472}, +{0,3,17462},{0,6,36},{0,6,36},{0,6,36},{0,4,49},{0,3,3872},{0,3,2132},{0,3,2132},{0,1,2330},{0,1,4571},{0,1,2691},{0,6,36},{0,6,36},{0,6,36},{0,4,49},{0,3,3872},{0,3,2132},{0,3,2132},{0,1,2330},{1,1,3872},{0,1,2330},{7,0,9250},{1,7,3488},{0,6,45},{0,5,2153},{7,0,9250},{3,5,9250},{0,5,2153},{0,4,9266},{3,5,9250},{0,4,9266},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{2,7,65535},{1,7,25204},{0,6,805},{0,6,2373},{1,7,65535},{0,7,39263},{0,6,8769},{0,5,31402},{0,6,65535},{0,5,55902},{1,7,14880},{1,7,5024},{0,6,321},{0,6,1889},{5,0,26756},{0,6,17000},{0,5,7049},{0,4,18139},{6,1,26756},{0,4,18139},{0,7,5},{0,7,5},{0,7,5}, +{0,4,5},{0,3,4468},{0,3,2248},{0,3,2248},{0,2,2722},{0,2,5411},{0,1,3227},{0,7,5},{0,7,5},{0,7,5},{0,4,5},{2,0,4420},{0,3,2248},{0,3,2248},{0,2,2722},{3,0,4420},{0,2,2722},{5,4,9250},{1,7,4000},{1,6,185},{0,6,1885},{5,4,9250},{7,3,9250},{0,6,1885},{0,4,9490},{7,3,9250},{0,4,9490},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,16}, +{0,0,16},{0,0,16},{0,0,64},{0,0,100},{0,0,100},{2,7,65535},{1,7,29620},{0,7,1306},{0,6,3061},{2,7,65535},{0,7,43055},{0,6,8145},{0,6,31878},{0,7,65535},{0,5,56670},{2,7,14924},{1,7,5344},{0,7,406},{0,6,1617},{4,2,26756},{0,6,16744},{0,5,6553},{0,4,17195},{5,2,26756},{0,4,17195},{0,7,181},{0,7,181},{0,7,181},{0,4,181},{0,4,4418},{0,3,2056},{0,3,2056}, +{0,2,2210},{0,2,5411},{0,2,3171},{0,7,181},{0,7,181},{0,7,181},{0,4,181},{0,4,4418},{0,3,2056},{0,3,2056},{0,2,2210},{2,1,4418},{0,2,2210},{6,3,9248},{2,7,4292},{0,7,306},{0,6,1517},{6,3,9248},{6,4,9248},{0,6,1517},{0,5,9698},{6,4,9248},{0,5,9698},{0,0,100},{0,0,100},{0,0,100},{0,0,100},{0,0,16},{0,0,16},{0,0,16},{0,0,0},{0,0,36}, +{0,0,36},{2,7,65535},{1,7,35659},{0,7,865},{0,7,2657},{2,7,65535},{1,7,48315},{0,7,8072},{0,6,29745},{0,7,65535},{0,5,58605},{2,7,15347},{1,7,6163},{1,7,270},{0,6,1770},{5,1,26756},{0,7,15992},{0,6,5378},{0,4,16592},{6,2,26756},{0,4,16592},{0,7,685},{0,7,685},{0,7,685},{0,5,370},{0,5,4450},{0,4,1768},{0,4,1768},{0,2,1940},{0,2,5717},{0,2,2901},{1,7,234}, +{1,7,234},{1,7,234},{1,4,250},{1,3,4420},{0,4,1768},{0,4,1768},{0,2,1940},{1,2,4420},{0,2,1940},{7,2,9250},{3,7,4820},{1,7,45},{0,6,1409},{7,2,9250},{5,5,9250},{0,6,1409},{0,5,9320},{5,5,9250},{0,5,9320},{0,0,361},{0,0,361},{0,0,361},{0,0,361},{0,1,0},{0,1,0},{0,1,0},{0,0,81},{0,0,117},{0,0,117},{2,7,65535},{1,7,40299},{0,7,1405}, +{0,7,2173},{2,7,65535},{1,7,50747},{0,7,6068},{0,6,28101},{0,7,65535},{0,5,59897},{2,7,15659},{1,7,6963},{1,7,74},{1,6,2046},{6,0,26264},{0,7,15284},{0,6,4470},{0,4,16052},{3,4,26264},{0,4,16052},{1,7,1230},{1,7,1230},{1,7,1230},{0,5,754},{0,5,4450},{0,4,1576},{0,4,1576},{0,2,1972},{0,2,6261},{0,2,2933},{1,7,74},{1,7,74},{1,7,74},{1,5,113},{2,2,4418}, +{0,4,1576},{0,4,1576},{0,2,1972},{5,0,4418},{0,2,1972},{5,6,8980},{3,7,4808},{1,7,25},{0,7,1444},{5,6,8980},{4,6,8980},{0,7,1444},{0,5,8980},{4,6,8980},{0,5,8980},{0,0,729},{0,0,729},{0,0,729},{0,0,729},{0,2,16},{0,2,16},{0,2,16},{0,1,16},{0,0,325},{0,0,325},{2,7,65535},{1,7,40395},{0,7,2381},{0,7,2125},{2,7,65535},{1,7,48635},{0,7,4500}, +{0,6,24853},{0,7,65535},{0,5,57545},{3,7,14605},{2,7,6211},{1,7,170},{1,6,1598},{5,2,24379},{0,7,13716},{0,6,3446},{0,5,14549},{5,3,24379},{0,5,14549},{1,7,1326},{1,7,1326},{1,7,1326},{1,5,1157},{0,6,4418},{0,5,1394},{0,5,1394},{0,3,1621},{0,3,6482},{0,2,3221},{1,7,170},{1,7,170},{1,7,170},{1,5,1},{3,1,4418},{0,5,1394},{0,5,1394},{0,3,1621},{4,1,4418}, +{0,3,1621},{7,3,7940},{3,7,4264},{2,7,81},{0,7,900},{7,3,7940},{6,5,7940},{0,7,900},{0,5,7988},{6,5,7940},{0,5,7988},{1,0,1157},{1,0,1157},{1,0,1157},{1,0,1157},{0,2,16},{0,2,16},{0,2,16},{0,1,16},{0,1,377},{0,1,377},{2,7,65535},{1,7,40747},{0,7,3613},{0,7,2333},{2,7,65535},{1,7,46779},{0,7,3188},{0,6,21861},{0,7,65535},{0,5,55449},{3,7,13181}, +{2,7,5667},{1,7,522},{1,7,1306},{6,1,22571},{0,7,12404},{0,6,2678},{0,5,12453},{4,4,22571},{0,5,12453},{1,7,1678},{1,7,1678},{1,7,1678},{1,5,1301},{0,7,4468},{0,5,1170},{0,5,1170},{0,3,1285},{0,3,6866},{0,3,3221},{1,7,522},{1,7,522},{1,7,522},{1,5,145},{4,0,4420},{0,5,1170},{0,5,1170},{0,3,1285},{3,2,4420},{0,3,1285},{6,5,6964},{3,7,3848},{2,7,1}, +{0,7,484},{6,5,6964},{3,7,6964},{0,7,484},{0,5,7124},{3,7,6964},{0,5,7124},{1,0,1237},{1,0,1237},{1,0,1237},{1,0,1237},{0,3,1},{0,3,1},{0,3,1},{0,2,100},{0,1,505},{0,1,505},{2,7,65535},{1,7,41449},{0,7,5305},{0,7,2873},{2,7,65535},{1,7,44997},{0,7,2018},{0,6,18801},{0,7,65535},{0,6,52421},{3,7,11885},{2,7,5361},{2,7,320},{1,7,1000},{5,3,20645}, +{0,7,11234},{0,7,2018},{0,5,10401},{6,3,20645},{0,5,10401},{1,7,2380},{1,7,2380},{1,7,2380},{1,6,1496},{0,7,4450},{0,6,964},{0,6,964},{0,3,1213},{0,3,7604},{0,3,3149},{2,7,320},{2,7,320},{2,7,320},{2,5,272},{2,4,4418},{0,6,964},{0,6,964},{0,3,1213},{7,0,4418},{0,3,1213},{5,7,5941},{4,7,3181},{2,7,64},{0,7,169},{5,7,5941},{5,6,5941},{0,7,169}, +{0,5,6305},{5,6,5941},{0,5,6305},{1,0,1480},{1,0,1480},{1,0,1480},{1,0,1480},{0,4,25},{0,4,25},{0,4,25},{0,2,1},{0,1,802},{0,1,802},{2,7,65535},{1,7,42345},{0,7,7081},{0,7,3625},{2,7,65535},{1,7,43685},{0,7,1250},{0,6,16353},{0,7,65535},{0,6,49973},{3,7,11005},{3,7,5153},{2,7,320},{2,7,964},{7,0,19026},{1,7,10349},{0,7,1250},{0,5,8849},{3,5,19026}, +{0,5,8849},{1,7,3276},{1,7,3276},{1,7,3276},{1,6,1848},{0,7,4706},{0,6,740},{0,6,740},{0,4,1226},{0,4,7955},{0,3,3357},{2,7,320},{2,7,320},{2,7,320},{2,6,145},{3,3,4420},{0,6,740},{0,6,740},{0,4,1226},{6,1,4420},{0,4,1226},{7,4,5105},{4,7,2701},{3,7,25},{0,7,25},{7,4,5105},{7,5,5105},{0,7,25},{0,6,5645},{7,5,5105},{0,6,5645},{1,0,1832}, +{1,0,1832},{1,0,1832},{1,0,1832},{0,4,9},{0,4,9},{0,4,9},{0,2,49},{0,2,1010},{0,2,1010},{2,7,65535},{1,7,43497},{1,7,9052},{0,7,4633},{2,7,65535},{1,7,42629},{0,7,738},{0,6,14161},{0,7,65535},{0,6,47781},{3,7,10381},{3,7,4529},{2,7,576},{2,7,484},{5,4,17490},{1,7,9293},{0,7,738},{0,5,7553},{7,3,17490},{0,5,7553},{1,7,4428},{1,7,4428},{1,7,4428}, +{1,7,2412},{0,7,5218},{0,7,738},{0,7,738},{0,4,810},{0,4,8467},{0,3,3821},{2,7,576},{2,7,576},{2,7,576},{2,6,1},{4,2,4420},{0,7,738},{0,7,738},{0,4,810},{5,2,4420},{0,4,810},{6,6,4329},{4,7,2349},{3,7,9},{0,7,9},{6,6,4329},{4,7,4329},{0,7,9},{0,6,4637},{4,7,4329},{0,6,4637},{1,0,2312},{1,0,2312},{1,0,2312},{1,0,2312},{0,5,4}, +{0,5,4},{0,5,4},{0,3,36},{0,2,1186},{0,2,1186},{2,7,65535},{1,7,44905},{1,7,10460},{0,7,5897},{2,7,65535},{1,7,41829},{0,7,482},{0,6,12225},{0,7,65535},{0,6,45845},{4,7,9325},{3,7,4161},{3,7,797},{2,7,260},{7,1,16034},{1,7,8493},{0,7,482},{0,5,6513},{4,5,16034},{0,5,6513},{2,7,5712},{2,7,5712},{2,7,5712},{1,7,2924},{1,7,5672},{0,7,482},{0,7,482}, +{0,4,650},{0,4,9235},{0,4,3899},{3,7,797},{3,7,797},{3,7,797},{2,6,113},{5,1,4426},{0,7,482},{0,7,482},{0,4,650},{7,1,4426},{0,4,650},{6,6,3625},{5,7,1985},{4,7,100},{1,7,4},{6,6,3625},{6,6,3617},{1,7,4},{0,6,3757},{6,6,3617},{0,6,3757},{1,0,2920},{1,0,2920},{1,0,2920},{1,0,2920},{0,5,36},{0,5,36},{0,5,36},{0,3,4},{0,2,1490}, +{0,2,1490},{2,7,65535},{1,7,46795},{1,7,12350},{0,7,7625},{2,7,65535},{1,7,41235},{0,7,500},{0,6,10353},{0,7,65535},{0,6,43973},{4,7,8227},{3,7,4053},{3,7,689},{2,7,314},{6,3,14507},{2,7,7875},{0,7,500},{0,5,5649},{6,4,14507},{0,5,5649},{2,7,6594},{2,7,6594},{2,7,6594},{1,7,3806},{1,7,6086},{0,7,500},{0,7,500},{0,4,776},{0,5,9830},{0,4,4025},{3,7,689}, +{3,7,689},{3,7,689},{3,6,298},{6,0,4420},{0,7,500},{0,7,500},{0,4,776},{3,4,4420},{0,4,776},{7,5,2890},{5,7,1508},{4,7,1},{2,7,25},{7,5,2890},{6,6,2906},{2,7,25},{0,6,2920},{6,6,2906},{0,6,2920},{1,0,3757},{1,0,3757},{1,0,3757},{1,0,3757},{0,6,9},{0,6,9},{0,6,9},{0,4,100},{0,2,1985},{0,2,1985},{2,7,65535},{1,7,48747},{1,7,14302}, +{0,7,9433},{2,7,65535},{1,7,40979},{0,7,788},{0,6,8961},{0,7,65535},{0,6,42581},{4,7,7523},{4,7,3923},{3,7,865},{3,7,181},{7,2,13243},{2,7,7075},{1,7,754},{0,6,4337},{5,5,13243},{0,6,4337},{2,7,7650},{2,7,7650},{2,7,7650},{1,7,4862},{1,7,6726},{0,7,788},{0,7,788},{0,5,529},{0,5,10470},{0,4,4409},{3,7,865},{3,7,865},{3,7,865},{3,7,181},{5,2,4426}, +{1,7,754},{1,7,754},{0,5,529},{7,2,4426},{0,5,529},{6,7,2320},{5,7,1220},{4,7,49},{2,7,9},{6,7,2320},{5,7,2320},{2,7,9},{0,6,2312},{5,7,2320},{0,6,2312},{1,0,4637},{1,0,4637},{1,0,4637},{1,0,4637},{0,7,4},{0,7,4},{0,7,4},{0,4,4},{0,3,2297},{0,3,2297},{2,7,65535},{1,7,50955},{1,7,16510},{1,7,10798},{2,7,65535},{1,7,40979},{0,7,1332}, +{0,7,6964},{0,7,65535},{0,6,41445},{4,7,7075},{4,7,3475},{3,7,1297},{3,7,5},{6,4,12051},{2,7,6531},{1,7,754},{0,6,3201},{7,4,12051},{0,6,3201},{2,7,8962},{2,7,8962},{2,7,8962},{2,7,5834},{1,7,7622},{0,7,1332},{0,7,1332},{0,5,289},{0,6,11342},{0,4,5049},{3,7,1297},{3,7,1297},{3,7,1297},{3,7,5},{6,1,4426},{1,7,754},{1,7,754},{0,5,289},{6,3,4426}, +{0,5,289},{6,7,1808},{5,7,1060},{5,7,36},{3,7,4},{6,7,1808},{7,6,1808},{3,7,4},{0,6,1832},{7,6,1808},{0,6,1832},{1,0,5645},{1,0,5645},{1,0,5645},{1,0,5645},{0,7,36},{0,7,36},{0,7,36},{0,4,36},{0,3,2665},{0,3,2665},{2,7,65535},{1,7,53419},{1,7,18974},{1,7,12366},{2,7,65535},{1,7,41235},{0,7,2132},{0,7,5204},{0,7,65535},{0,6,40565},{5,7,6641}, +{4,7,3283},{4,7,1258},{3,7,85},{5,6,10952},{3,7,5900},{1,7,1010},{0,6,2321},{4,6,10952},{0,6,2321},{2,7,10530},{2,7,10530},{2,7,10530},{2,7,6666},{1,7,8774},{0,7,2132},{0,7,2132},{0,5,305},{0,6,11790},{0,5,5205},{4,7,1258},{4,7,1258},{4,7,1258},{3,7,85},{7,0,4420},{1,7,1010},{1,7,1010},{0,5,305},{3,5,4420},{0,5,305},{7,6,1360},{6,7,800},{5,7,4}, +{3,7,36},{7,6,1360},{7,6,1360},{3,7,36},{0,6,1480},{7,6,1360},{0,6,1480},{2,0,6305},{2,0,6305},{2,0,6305},{2,0,6305},{0,7,196},{0,7,196},{0,7,196},{0,5,49},{0,3,3161},{0,3,3161},{2,7,65535},{2,7,56301},{1,7,22052},{1,7,14436},{2,7,65535},{1,7,41829},{0,7,3338},{0,7,3530},{0,7,65535},{0,6,39881},{5,7,5741},{4,7,3373},{4,7,1348},{4,7,328},{7,3,9830}, +{3,7,5270},{2,7,1184},{0,6,1637},{6,5,9830},{0,6,1637},{2,7,12600},{2,7,12600},{2,7,12600},{2,7,7908},{1,7,10376},{1,7,2760},{1,7,2760},{0,6,481},{0,6,12600},{0,5,5529},{4,7,1348},{4,7,1348},{4,7,1348},{4,7,328},{7,1,4426},{2,7,1184},{2,7,1184},{0,6,481},{7,3,4426},{0,6,481},{7,6,937},{6,7,521},{5,7,121},{4,7,4},{7,6,937},{6,7,929},{4,7,4}, +{0,6,1237},{6,7,929},{0,6,1237},{2,0,7124},{2,0,7124},{2,0,7124},{2,0,7124},{0,7,529},{0,7,529},{0,7,529},{0,5,4},{0,4,3778},{0,4,3778},{2,7,65535},{2,7,58413},{1,7,25060},{1,7,16548},{2,7,65535},{1,7,42629},{0,7,4682},{0,7,2314},{0,7,65535},{0,6,39545},{5,7,5213},{5,7,3321},{4,7,1700},{4,7,200},{5,7,8902},{3,7,4982},{2,7,1440},{0,6,1301},{5,6,8902}, +{0,6,1301},{3,7,14701},{3,7,14701},{3,7,14701},{2,7,9284},{2,7,11492},{1,7,3560},{1,7,3560},{0,6,145},{0,6,13592},{0,5,6089},{4,7,1700},{4,7,1700},{4,7,1700},{4,7,200},{6,3,4420},{2,7,1440},{2,7,1440},{0,6,145},{6,4,4420},{0,6,145},{7,6,697},{6,7,409},{6,7,9},{5,7,9},{7,6,697},{6,7,625},{5,7,9},{0,6,1157},{6,7,625},{0,6,1157},{2,0,7988}, +{2,0,7988},{2,0,7988},{2,0,7988},{0,7,961},{0,7,961},{0,7,961},{0,5,100},{0,4,4210},{0,4,4210},{3,7,65535},{2,7,60781},{1,7,28324},{1,7,18916},{2,7,65535},{1,7,43685},{0,7,6282},{0,7,1354},{0,7,65535},{0,6,39465},{5,7,4941},{5,7,3049},{5,7,2025},{4,7,328},{7,4,8069},{4,7,4465},{3,7,1586},{0,6,1221},{7,5,8069},{0,6,1221},{3,7,16189},{3,7,16189},{3,7,16189}, +{2,7,10916},{2,7,12740},{1,7,4616},{1,7,4616},{0,6,65},{0,7,14411},{0,6,6789},{5,7,2025},{5,7,2025},{5,7,2025},{4,7,328},{7,2,4420},{3,7,1586},{3,7,1586},{0,6,65},{5,5,4420},{0,6,65},{7,7,377},{7,7,305},{6,7,25},{5,7,25},{7,7,377},{6,7,449},{5,7,25},{0,7,729},{6,7,449},{0,7,729},{2,0,8980},{2,0,8980},{2,0,8980},{2,0,8980},{1,7,1480}, +{1,7,1480},{1,7,1480},{0,6,16},{0,4,4770},{0,4,4770},{3,7,65535},{2,7,59505},{1,7,29984},{1,7,19680},{2,7,65535},{1,7,43137},{0,7,8318},{0,7,830},{0,7,65535},{0,6,34901},{5,7,4925},{5,7,3033},{5,7,2009},{4,7,712},{6,6,7325},{4,7,4145},{3,7,1810},{0,7,650},{4,7,7325},{0,7,650},{3,7,16745},{3,7,16745},{3,7,16745},{2,7,12024},{2,7,13464},{1,7,5556},{1,7,5556}, +{0,6,277},{0,7,14139},{0,6,6017},{5,7,2009},{5,7,2009},{5,7,2009},{4,7,712},{5,6,4418},{3,7,1810},{3,7,1810},{0,6,241},{4,6,4418},{0,6,241},{7,7,185},{7,7,113},{7,7,64},{6,7,1},{7,7,185},{7,7,193},{6,7,1},{0,7,361},{7,7,193},{0,7,361},{2,0,9320},{2,0,9320},{2,0,9320},{2,0,9320},{1,7,1460},{1,7,1460},{1,7,1460},{0,6,52},{0,5,4772}, +{0,5,4772},{3,7,65535},{2,7,57588},{1,7,32135},{1,7,20823},{3,7,65535},{1,7,42804},{1,7,8359},{0,7,1289},{0,7,65535},{0,6,28970},{6,7,4317},{5,7,3321},{5,7,2297},{5,7,845},{7,5,6587},{5,7,4008},{4,7,2066},{0,7,164},{6,6,6611},{0,7,164},{3,7,17366},{3,7,17366},{3,7,17366},{3,7,12274},{2,7,14427},{2,7,6699},{2,7,6699},{0,7,389},{0,7,13860},{0,6,5234},{5,7,2297}, +{5,7,2297},{5,7,2297},{5,7,845},{6,5,4420},{4,7,2066},{4,7,2066},{0,7,164},{3,7,4420},{0,7,164},{7,7,122},{7,7,50},{7,7,1},{7,7,9},{7,7,122},{7,7,58},{7,7,9},{0,7,100},{7,7,58},{0,7,100},{2,0,9698},{2,0,9698},{2,0,9698},{2,0,9698},{1,7,1586},{1,7,1586},{1,7,1586},{0,7,289},{0,5,4250},{0,5,4250},{3,7,65535},{2,7,56836},{2,7,31631}, +{1,7,22791},{3,7,65535},{2,7,40532},{1,7,9015},{1,7,778},{0,7,65535},{0,6,24650},{6,7,3949},{6,7,3325},{5,7,2825},{5,7,1021},{6,7,6020},{5,7,3688},{4,7,2290},{0,7,4},{5,7,6020},{0,7,4},{3,7,18326},{3,7,18326},{3,7,18326},{3,7,12626},{3,7,15077},{2,7,7227},{2,7,7227},{1,7,294},{0,7,14020},{0,6,4946},{5,7,2825},{5,7,2825},{5,7,2825},{5,7,1021},{7,4,4418}, +{4,7,2290},{4,7,2290},{0,7,4},{7,5,4418},{0,7,4},{7,7,202},{7,7,130},{7,7,81},{7,7,25},{7,7,202},{7,7,74},{7,7,25},{0,7,4},{7,7,74},{0,7,4},{3,0,9490},{3,0,9490},{3,0,9490},{3,0,9490},{1,7,1970},{1,7,1970},{1,7,1970},{1,6,202},{0,6,3922},{0,6,3922},{3,7,65535},{3,7,55466},{2,7,30335},{2,7,21687},{3,7,65535},{2,7,37932},{1,7,9535}, +{1,7,70},{0,7,65535},{0,7,20544},{6,7,3417},{6,7,2793},{6,7,2393},{5,7,1033},{6,7,5184},{5,7,3204},{5,7,2180},{1,7,25},{7,6,5168},{1,7,25},{4,7,17611},{4,7,17611},{4,7,17611},{3,7,12630},{3,7,14321},{2,7,7251},{2,7,7251},{1,7,34},{0,7,13376},{0,7,4160},{6,7,2393},{6,7,2393},{6,7,2393},{5,7,1033},{6,6,3874},{5,7,2180},{5,7,2180},{1,7,25},{4,7,3874}, +{1,7,25},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{3,0,9266},{3,0,9266},{3,0,9266},{3,0,9266},{2,7,2210},{2,7,2210},{2,7,2210},{1,7,34},{0,6,3442},{0,6,3442},{3,7,65535},{3,7,51210},{2,7,29343},{2,7,20695},{3,7,65535},{2,7,35820},{1,7,10495},{1,7,134},{1,7,65535},{0,7,15936},{6,7,2889}, +{6,7,2265},{6,7,1865},{5,7,1049},{7,6,4288},{5,7,2724},{5,7,1700},{1,7,9},{7,6,4272},{1,7,9},{4,7,16555},{4,7,16555},{4,7,16555},{3,7,12662},{3,7,13441},{2,7,7251},{2,7,7251},{1,7,34},{0,7,12608},{0,7,3392},{6,7,1865},{6,7,1865},{6,7,1865},{5,7,1049},{7,5,3218},{5,7,1700},{5,7,1700},{1,7,9},{6,6,3202},{1,7,9},{7,7,242},{7,7,170},{7,7,121}, +{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{3,0,9298},{3,0,9298},{3,0,9298},{3,0,9298},{2,7,2210},{2,7,2210},{2,7,2210},{1,7,34},{0,6,3218},{0,6,3218},{4,7,65535},{3,7,47340},{2,7,29145},{2,7,20497},{3,7,65535},{2,7,34362},{2,7,9157},{1,7,1124},{1,7,64598},{0,7,11670},{6,7,2448},{6,7,1824},{6,7,1424},{6,7,800},{7,6,3361}, +{6,7,2321},{5,7,1313},{2,7,0},{6,7,3401},{2,7,0},{4,7,15673},{4,7,15673},{4,7,15673},{4,7,12073},{3,7,12757},{3,7,6905},{3,7,6905},{1,7,340},{1,7,11657},{0,7,2834},{6,7,1424},{6,7,1424},{6,7,1424},{6,7,800},{7,5,2525},{5,7,1313},{5,7,1313},{2,7,0},{5,7,2545},{2,7,0},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49}, +{0,7,0},{7,7,98},{0,7,0},{3,0,9640},{3,0,9640},{3,0,9640},{3,0,9640},{2,7,2516},{2,7,2516},{2,7,2516},{1,7,340},{0,7,2834},{0,7,2834},{4,7,65535},{3,7,44716},{3,7,27896},{2,7,21137},{4,7,65535},{3,7,31853},{2,7,8677},{2,7,784},{1,7,59734},{0,7,8694},{6,7,2192},{6,7,1568},{6,7,1168},{6,7,544},{7,6,2673},{6,7,1761},{5,7,1105},{3,7,25},{6,7,2649}, +{3,7,25},{4,7,15161},{4,7,15161},{4,7,15161},{4,7,11561},{4,7,12169},{3,7,6569},{3,7,6569},{2,7,208},{1,7,10889},{0,7,2610},{6,7,1168},{6,7,1168},{6,7,1168},{6,7,544},{6,7,1985},{5,7,1105},{5,7,1105},{3,7,25},{5,7,1985},{3,7,25},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{4,0,9536}, +{4,0,9536},{4,0,9536},{4,0,9536},{2,7,3060},{2,7,3060},{2,7,3060},{2,7,208},{0,7,2610},{0,7,2610},{4,7,63766},{3,7,42860},{3,7,26040},{3,7,20188},{4,7,60070},{3,7,29085},{2,7,8965},{2,7,336},{1,7,55638},{0,7,6486},{7,7,1686},{6,7,1440},{6,7,1040},{6,7,416},{7,6,2113},{6,7,1329},{6,7,929},{3,7,9},{6,7,2025},{3,7,9},{4,7,14905},{4,7,14905},{4,7,14905}, +{4,7,11305},{4,7,11209},{3,7,6489},{3,7,6489},{2,7,272},{1,7,10377},{0,7,2642},{6,7,1040},{6,7,1040},{6,7,1040},{6,7,416},{7,6,1537},{6,7,929},{6,7,929},{3,7,9},{7,6,1513},{3,7,9},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{4,0,9280},{4,0,9280},{4,0,9280},{4,0,9280},{3,7,3125}, +{3,7,3125},{3,7,3125},{2,7,272},{0,7,2642},{0,7,2642},{4,7,59414},{4,7,41414},{3,7,24952},{3,7,19100},{4,7,55014},{3,7,27085},{2,7,10021},{2,7,656},{1,7,52310},{0,7,5046},{7,7,1142},{7,7,1070},{7,7,1021},{6,7,416},{7,7,1538},{6,7,1025},{6,7,625},{4,7,4},{6,7,1529},{4,7,4},{5,7,13964},{5,7,13964},{5,7,13964},{4,7,11305},{4,7,10505},{3,7,6665},{3,7,6665}, +{2,7,592},{2,7,9973},{0,7,2930},{7,7,1021},{7,7,1021},{7,7,1021},{6,7,416},{7,6,1105},{6,7,625},{6,7,625},{4,7,4},{6,7,1129},{4,7,4},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{4,0,9280},{4,0,9280},{4,0,9280},{4,0,9280},{3,7,3301},{3,7,3301},{3,7,3301},{2,7,592},{0,7,2930}, +{0,7,2930}, +/**** ended inlining basisu_transcoder_tables_pvrtc2_alpha_33.inc ****/ + }; +#endif + +#endif + + static const etc1s_to_atc_solution g_etc1s_to_atc_55[32 * 8 * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS * NUM_ETC1S_TO_ATC_SELECTOR_RANGES] = { +/**** start inlining basisu_transcoder_tables_atc_55.inc ****/ +{0,2,20},{0,1,10},{0,1,1},{0,1,9},{0,1,35},{0,1,27},{0,1,18},{0,1,61},{0,1,52},{0,0,68},{0,2,20},{0,1,10},{0,1,1},{0,1,9},{0,1,35},{0,1,27},{0,1,18},{0,1,61},{1,0,35},{0,1,61},{0,1,1},{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,1}, +{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{1,0,18},{0,1,10},{0,1,1},{0,1,9},{1,0,18},{0,1,18},{0,1,9},{0,1,36},{0,1,18},{0,1,36},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,4,56},{0,3,38},{0,2,52}, +{0,2,36},{0,4,56},{0,3,35},{0,2,0},{0,2,52},{0,2,88},{0,1,78},{1,3,24},{1,2,14},{1,2,5},{1,2,13},{1,2,51},{0,3,35},{0,2,0},{0,2,52},{2,1,51},{0,2,52},{0,3,37},{0,3,37},{0,3,37},{0,2,36},{0,3,10},{0,2,0},{0,2,0},{0,1,5},{0,1,35},{0,1,14},{1,2,5},{1,2,5},{1,2,5},{1,1,8},{1,1,8}, +{0,2,0},{0,2,0},{0,1,5},{1,1,8},{0,1,5},{2,1,18},{0,3,2},{1,2,1},{0,2,0},{2,1,18},{1,2,18},{0,2,0},{0,2,36},{1,2,18},{0,2,36},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,2,0},{0,2,0},{0,2,0},{0,1,1},{0,1,10},{0,1,10},{1,5,56},{1,4,38},{1,3,52},{1,3,36},{1,5,56},{1,4,35},{1,3,0}, +{1,3,52},{0,4,72},{0,3,38},{2,4,24},{2,3,14},{2,3,5},{2,3,13},{2,3,51},{0,4,24},{1,3,0},{0,3,37},{3,2,51},{0,3,37},{1,4,37},{1,4,37},{1,4,37},{1,3,36},{1,4,10},{1,3,0},{1,3,0},{1,2,5},{0,3,11},{1,2,14},{2,3,5},{2,3,5},{2,3,5},{2,2,8},{2,2,8},{1,3,0},{1,3,0},{1,2,5},{2,2,8}, +{1,2,5},{3,2,18},{1,4,2},{2,3,1},{1,3,0},{3,2,18},{7,0,18},{1,3,0},{0,3,36},{7,0,18},{0,3,36},{1,0,36},{1,0,36},{1,0,36},{1,0,36},{1,3,0},{1,3,0},{1,3,0},{1,2,1},{0,3,2},{0,3,2},{2,6,56},{2,5,38},{2,4,53},{2,4,37},{2,6,56},{2,5,35},{2,4,1},{2,4,66},{0,5,60},{1,4,52},{3,5,24}, +{3,4,14},{3,4,6},{3,4,14},{3,4,51},{1,5,24},{2,4,1},{1,4,51},{9,0,51},{1,4,51},{2,5,37},{2,5,37},{2,5,37},{2,4,36},{2,5,10},{2,4,0},{2,4,0},{2,3,5},{1,4,11},{2,3,14},{3,4,5},{3,4,5},{3,4,5},{3,3,8},{3,3,8},{2,4,0},{2,4,0},{2,3,5},{8,0,8},{2,3,5},{4,3,18},{2,5,2},{3,4,2}, +{2,4,1},{4,3,18},{8,1,18},{2,4,1},{0,4,50},{8,1,18},{0,4,50},{2,0,36},{2,0,36},{2,0,36},{2,0,36},{2,4,0},{2,4,0},{2,4,0},{2,3,1},{1,4,2},{1,4,2},{3,8,70},{3,6,58},{4,5,69},{3,5,51},{3,7,52},{3,6,25},{3,5,3},{3,5,46},{2,6,60},{2,5,36},{4,6,24},{4,5,14},{4,5,5},{4,5,13},{6,2,51}, +{3,6,24},{3,5,2},{2,5,36},{7,3,51},{2,5,36},{3,7,51},{3,7,51},{3,7,51},{3,5,51},{3,6,9},{3,5,3},{3,5,3},{3,4,9},{1,6,12},{3,4,12},{4,5,5},{4,5,5},{4,5,5},{4,4,8},{6,1,8},{3,5,2},{3,5,2},{3,4,8},{11,0,8},{3,4,8},{7,1,18},{3,6,8},{4,5,1},{3,5,1},{7,1,18},{11,1,18},{3,5,1}, +{0,5,36},{11,1,18},{0,5,36},{3,0,50},{3,0,50},{3,0,50},{3,0,50},{3,5,2},{3,5,2},{3,5,2},{3,4,5},{2,5,0},{2,5,0},{4,8,56},{4,7,38},{4,6,52},{4,6,36},{4,8,56},{4,7,35},{4,6,0},{4,6,52},{3,7,60},{3,6,36},{5,7,24},{5,6,14},{5,6,5},{5,6,13},{8,1,51},{3,7,35},{4,6,0},{3,6,36},{6,5,51}, +{3,6,36},{4,7,37},{4,7,37},{4,7,37},{4,6,36},{4,7,10},{4,6,0},{4,6,0},{4,5,5},{2,7,12},{4,5,14},{5,6,5},{5,6,5},{5,6,5},{5,5,8},{8,0,8},{4,6,0},{4,6,0},{4,5,5},{5,5,8},{4,5,5},{9,0,18},{4,7,2},{5,6,1},{4,6,0},{9,0,18},{15,0,18},{4,6,0},{0,6,36},{15,0,18},{0,6,36},{4,0,36}, +{4,0,36},{4,0,36},{4,0,36},{4,6,0},{4,6,0},{4,6,0},{4,5,1},{3,6,0},{3,6,0},{5,9,56},{5,8,38},{5,7,52},{5,7,36},{5,9,56},{5,8,35},{5,7,0},{5,7,52},{3,8,63},{4,7,38},{6,8,24},{6,7,14},{6,7,5},{6,7,13},{9,2,51},{4,8,24},{5,7,0},{4,7,37},{17,0,51},{4,7,37},{5,8,37},{5,8,37},{5,8,37}, +{5,7,36},{5,8,10},{5,7,0},{5,7,0},{5,6,5},{4,7,11},{5,6,14},{6,7,5},{6,7,5},{6,7,5},{6,6,8},{9,1,8},{5,7,0},{5,7,0},{5,6,5},{16,0,8},{5,6,5},{10,1,18},{5,8,2},{6,7,1},{5,7,0},{10,1,18},{16,1,18},{5,7,0},{0,7,36},{16,1,18},{0,7,36},{5,0,36},{5,0,36},{5,0,36},{5,0,36},{5,7,0}, +{5,7,0},{5,7,0},{5,6,1},{4,7,2},{4,7,2},{6,10,56},{6,9,38},{6,8,53},{6,8,37},{6,10,56},{6,9,35},{6,8,1},{6,8,66},{4,9,60},{5,8,52},{7,9,24},{7,8,14},{7,8,6},{7,8,14},{10,3,51},{5,9,24},{6,8,1},{5,8,51},{18,1,51},{5,8,51},{6,9,37},{6,9,37},{6,9,37},{6,8,36},{6,9,10},{6,8,0},{6,8,0}, +{6,7,5},{5,8,11},{6,7,14},{7,8,5},{7,8,5},{7,8,5},{7,7,8},{10,2,8},{6,8,0},{6,8,0},{6,7,5},{17,1,8},{6,7,5},{11,2,18},{6,9,2},{7,8,2},{6,8,1},{11,2,18},{17,2,18},{6,8,1},{0,8,50},{17,2,18},{0,8,50},{6,0,36},{6,0,36},{6,0,36},{6,0,36},{6,8,0},{6,8,0},{6,8,0},{6,7,1},{5,8,2}, +{5,8,2},{7,12,70},{7,10,58},{8,9,69},{7,9,51},{7,11,52},{7,10,25},{7,9,3},{7,9,46},{6,10,60},{6,9,36},{8,10,24},{8,9,14},{8,9,5},{8,9,13},{13,1,51},{7,10,24},{7,9,2},{6,9,36},{21,1,51},{6,9,36},{7,11,51},{7,11,51},{7,11,51},{7,9,51},{7,10,9},{7,9,3},{7,9,3},{7,8,9},{5,10,12},{7,8,12},{8,9,5}, +{8,9,5},{8,9,5},{8,8,8},{13,0,8},{7,9,2},{7,9,2},{7,8,8},{20,1,8},{7,8,8},{14,0,18},{7,10,8},{8,9,1},{7,9,1},{14,0,18},{20,2,18},{7,9,1},{0,9,36},{20,2,18},{0,9,36},{7,0,50},{7,0,50},{7,0,50},{7,0,50},{7,9,2},{7,9,2},{7,9,2},{7,8,5},{6,9,0},{6,9,0},{8,12,56},{8,11,38},{8,10,52}, +{8,10,36},{8,12,56},{8,11,35},{8,10,0},{8,10,52},{7,11,60},{7,10,36},{9,11,24},{9,10,14},{9,10,5},{9,10,13},{14,2,51},{7,11,35},{8,10,0},{7,10,36},{25,0,51},{7,10,36},{8,11,37},{8,11,37},{8,11,37},{8,10,36},{8,11,10},{8,10,0},{8,10,0},{8,9,5},{6,11,12},{8,9,14},{9,10,5},{9,10,5},{9,10,5},{9,9,8},{14,1,8}, +{8,10,0},{8,10,0},{8,9,5},{24,0,8},{8,9,5},{15,1,18},{8,11,2},{9,10,1},{8,10,0},{15,1,18},{24,1,18},{8,10,0},{0,10,36},{24,1,18},{0,10,36},{8,0,36},{8,0,36},{8,0,36},{8,0,36},{8,10,0},{8,10,0},{8,10,0},{8,9,1},{7,10,0},{7,10,0},{9,13,56},{9,12,38},{9,11,52},{9,11,36},{9,13,56},{9,12,35},{9,11,0}, +{9,11,52},{7,12,63},{8,11,38},{10,12,24},{10,11,14},{10,11,5},{10,11,13},{16,1,51},{8,12,24},{9,11,0},{8,11,37},{26,1,51},{8,11,37},{9,12,37},{9,12,37},{9,12,37},{9,11,36},{9,12,10},{9,11,0},{9,11,0},{9,10,5},{8,11,11},{9,10,14},{10,11,5},{10,11,5},{10,11,5},{10,10,8},{16,0,8},{9,11,0},{9,11,0},{9,10,5},{25,1,8}, +{9,10,5},{17,0,18},{9,12,2},{10,11,1},{9,11,0},{17,0,18},{25,2,18},{9,11,0},{0,11,36},{25,2,18},{0,11,36},{9,0,36},{9,0,36},{9,0,36},{9,0,36},{9,11,0},{9,11,0},{9,11,0},{9,10,1},{8,11,2},{8,11,2},{10,14,56},{10,13,38},{10,12,53},{10,12,37},{10,14,56},{10,13,35},{10,12,1},{10,12,66},{8,13,60},{9,12,52},{11,13,24}, +{11,12,14},{11,12,6},{11,12,14},{17,2,51},{9,13,24},{10,12,1},{9,12,51},{27,2,51},{9,12,51},{10,13,37},{10,13,37},{10,13,37},{10,12,36},{10,13,10},{10,12,0},{10,12,0},{10,11,5},{9,12,11},{10,11,14},{11,12,5},{11,12,5},{11,12,5},{11,11,8},{17,1,8},{10,12,0},{10,12,0},{10,11,5},{26,2,8},{10,11,5},{18,1,18},{10,13,2},{11,12,2}, +{10,12,1},{18,1,18},{31,0,18},{10,12,1},{0,12,50},{31,0,18},{0,12,50},{10,0,36},{10,0,36},{10,0,36},{10,0,36},{10,12,0},{10,12,0},{10,12,0},{10,11,1},{9,12,2},{9,12,2},{11,16,70},{11,14,58},{12,13,69},{11,13,51},{11,15,52},{11,14,25},{11,13,3},{11,13,46},{10,14,60},{10,13,36},{12,14,24},{12,13,14},{12,13,5},{12,13,13},{17,5,51}, +{11,14,24},{11,13,2},{10,13,36},{30,2,51},{10,13,36},{11,15,51},{11,15,51},{11,15,51},{11,13,51},{11,14,9},{11,13,3},{11,13,3},{11,12,9},{9,14,12},{11,12,12},{12,13,5},{12,13,5},{12,13,5},{12,12,8},{17,4,8},{11,13,2},{11,13,2},{11,12,8},{29,2,8},{11,12,8},{18,4,18},{11,14,8},{12,13,1},{11,13,1},{18,4,18},{29,3,18},{11,13,1}, +{0,13,36},{29,3,18},{0,13,36},{11,0,50},{11,0,50},{11,0,50},{11,0,50},{11,13,2},{11,13,2},{11,13,2},{11,12,5},{10,13,0},{10,13,0},{12,16,56},{12,15,38},{12,14,52},{12,14,36},{12,16,56},{12,15,35},{12,14,0},{12,14,52},{11,15,60},{11,14,36},{13,15,24},{13,14,14},{13,14,5},{13,14,13},{18,6,51},{11,15,35},{12,14,0},{11,14,36},{31,3,51}, +{11,14,36},{12,15,37},{12,15,37},{12,15,37},{12,14,36},{12,15,10},{12,14,0},{12,14,0},{12,13,5},{10,15,12},{12,13,14},{13,14,5},{13,14,5},{13,14,5},{13,13,8},{18,5,8},{12,14,0},{12,14,0},{12,13,5},{30,3,8},{12,13,5},{20,3,18},{12,15,2},{13,14,1},{12,14,0},{20,3,18},{28,5,18},{12,14,0},{0,14,36},{28,5,18},{0,14,36},{12,0,36}, +{12,0,36},{12,0,36},{12,0,36},{12,14,0},{12,14,0},{12,14,0},{12,13,1},{11,14,0},{11,14,0},{13,17,56},{13,16,38},{13,15,52},{13,15,36},{13,17,56},{13,16,35},{13,15,0},{13,15,52},{11,16,63},{12,15,38},{14,16,24},{14,15,14},{14,15,5},{14,15,13},{23,0,51},{12,16,24},{13,15,0},{12,15,37},{30,5,51},{12,15,37},{13,16,37},{13,16,37},{13,16,37}, +{13,15,36},{13,16,10},{13,15,0},{13,15,0},{13,14,5},{12,15,11},{13,14,14},{14,15,5},{14,15,5},{14,15,5},{14,14,8},{20,4,8},{13,15,0},{13,15,0},{13,14,5},{29,5,8},{13,14,5},{21,4,18},{13,16,2},{14,15,1},{13,15,0},{21,4,18},{29,6,18},{13,15,0},{0,15,36},{29,6,18},{0,15,36},{13,0,36},{13,0,36},{13,0,36},{13,0,36},{13,15,0}, +{13,15,0},{13,15,0},{13,14,1},{12,15,2},{12,15,2},{14,18,56},{14,17,38},{14,16,53},{14,16,37},{14,18,56},{14,17,35},{14,16,1},{14,16,66},{12,17,60},{13,16,52},{15,17,24},{15,16,14},{15,16,6},{15,16,14},{24,1,51},{13,17,24},{14,16,1},{13,16,51},{31,6,51},{13,16,51},{14,17,37},{14,17,37},{14,17,37},{14,16,36},{14,17,10},{14,16,0},{14,16,0}, +{14,15,5},{13,16,11},{14,15,14},{15,16,5},{15,16,5},{15,16,5},{15,15,8},{24,0,8},{14,16,0},{14,16,0},{14,15,5},{30,6,8},{14,15,5},{25,0,18},{14,17,2},{15,16,2},{14,16,1},{25,0,18},{30,7,18},{14,16,1},{0,16,50},{30,7,18},{0,16,50},{14,0,36},{14,0,36},{14,0,36},{14,0,36},{14,16,0},{14,16,0},{14,16,0},{14,15,1},{13,16,2}, +{13,16,2},{15,20,70},{15,18,58},{16,17,69},{15,17,51},{15,19,52},{15,18,25},{15,17,3},{15,17,46},{14,18,60},{14,17,36},{16,18,24},{16,17,14},{16,17,5},{16,17,13},{21,9,51},{15,18,24},{15,17,2},{14,17,36},{29,9,51},{14,17,36},{15,19,51},{15,19,51},{15,19,51},{15,17,51},{15,18,9},{15,17,3},{15,17,3},{15,16,9},{13,18,12},{15,16,12},{16,17,5}, +{16,17,5},{16,17,5},{16,16,8},{24,3,8},{15,17,2},{15,17,2},{15,16,8},{28,9,8},{15,16,8},{25,3,18},{15,18,8},{16,17,1},{15,17,1},{25,3,18},{28,10,18},{15,17,1},{0,17,36},{28,10,18},{0,17,36},{15,0,50},{15,0,50},{15,0,50},{15,0,50},{15,17,2},{15,17,2},{15,17,2},{15,16,5},{14,17,0},{14,17,0},{16,20,56},{16,19,38},{16,18,52}, +{16,18,36},{16,20,56},{16,19,35},{16,18,0},{16,18,52},{15,19,60},{15,18,36},{17,19,24},{17,18,14},{17,18,5},{17,18,13},{22,10,51},{15,19,35},{16,18,0},{15,18,36},{30,10,51},{15,18,36},{16,19,37},{16,19,37},{16,19,37},{16,18,36},{16,19,10},{16,18,0},{16,18,0},{16,17,5},{14,19,12},{16,17,14},{17,18,5},{17,18,5},{17,18,5},{17,17,8},{22,9,8}, +{16,18,0},{16,18,0},{16,17,5},{29,10,8},{16,17,5},{24,7,18},{16,19,2},{17,18,1},{16,18,0},{24,7,18},{29,11,18},{16,18,0},{0,18,36},{29,11,18},{0,18,36},{16,0,36},{16,0,36},{16,0,36},{16,0,36},{16,18,0},{16,18,0},{16,18,0},{16,17,1},{15,18,0},{15,18,0},{17,21,56},{17,20,38},{17,19,52},{17,19,36},{17,21,56},{17,20,35},{17,19,0}, +{17,19,52},{15,20,63},{16,19,38},{18,20,24},{18,19,14},{18,19,5},{18,19,13},{27,4,51},{16,20,24},{17,19,0},{16,19,37},{31,11,51},{16,19,37},{17,20,37},{17,20,37},{17,20,37},{17,19,36},{17,20,10},{17,19,0},{17,19,0},{17,18,5},{16,19,11},{17,18,14},{18,19,5},{18,19,5},{18,19,5},{18,18,8},{24,8,8},{17,19,0},{17,19,0},{17,18,5},{30,11,8}, +{17,18,5},{28,3,18},{17,20,2},{18,19,1},{17,19,0},{28,3,18},{28,13,18},{17,19,0},{0,19,36},{28,13,18},{0,19,36},{17,0,36},{17,0,36},{17,0,36},{17,0,36},{17,19,0},{17,19,0},{17,19,0},{17,18,1},{16,19,2},{16,19,2},{18,22,56},{18,21,38},{18,20,53},{18,20,37},{18,22,56},{18,21,35},{18,20,1},{18,20,66},{16,21,60},{17,20,52},{19,21,24}, +{19,20,14},{19,20,6},{19,20,14},{31,0,51},{17,21,24},{18,20,1},{17,20,51},{30,13,51},{17,20,51},{18,21,37},{18,21,37},{18,21,37},{18,20,36},{18,21,10},{18,20,0},{18,20,0},{18,19,5},{17,20,11},{18,19,14},{19,20,5},{19,20,5},{19,20,5},{19,19,8},{28,4,8},{18,20,0},{18,20,0},{18,19,5},{29,13,8},{18,19,5},{29,4,18},{18,21,2},{19,20,2}, +{18,20,1},{29,4,18},{29,14,18},{18,20,1},{0,20,50},{29,14,18},{0,20,50},{18,0,36},{18,0,36},{18,0,36},{18,0,36},{18,20,0},{18,20,0},{18,20,0},{18,19,1},{17,20,2},{17,20,2},{19,24,70},{19,22,58},{20,21,69},{19,21,51},{19,23,52},{19,22,25},{19,21,3},{19,21,46},{18,22,60},{18,21,36},{20,22,24},{20,21,14},{20,21,5},{20,21,13},{31,3,51}, +{19,22,24},{19,21,2},{18,21,36},{23,19,51},{18,21,36},{19,23,51},{19,23,51},{19,23,51},{19,21,51},{19,22,9},{19,21,3},{19,21,3},{19,20,9},{17,22,12},{19,20,12},{20,21,5},{20,21,5},{20,21,5},{20,20,8},{31,2,8},{19,21,2},{19,21,2},{19,20,8},{27,16,8},{19,20,8},{29,7,18},{19,22,8},{20,21,1},{19,21,1},{29,7,18},{27,17,18},{19,21,1}, +{0,21,36},{27,17,18},{0,21,36},{19,0,50},{19,0,50},{19,0,50},{19,0,50},{19,21,2},{19,21,2},{19,21,2},{19,20,5},{18,21,0},{18,21,0},{20,24,56},{20,23,38},{20,22,52},{20,22,36},{20,24,56},{20,23,35},{20,22,0},{20,22,52},{19,23,60},{19,22,36},{21,23,24},{21,22,14},{21,22,5},{21,22,13},{26,14,51},{19,23,35},{20,22,0},{19,22,36},{22,21,51}, +{19,22,36},{20,23,37},{20,23,37},{20,23,37},{20,22,36},{20,23,10},{20,22,0},{20,22,0},{20,21,5},{18,23,12},{20,21,14},{21,22,5},{21,22,5},{21,22,5},{21,21,8},{26,13,8},{20,22,0},{20,22,0},{20,21,5},{21,21,8},{20,21,5},{28,11,18},{20,23,2},{21,22,1},{20,22,0},{28,11,18},{31,16,18},{20,22,0},{0,22,36},{31,16,18},{0,22,36},{20,0,36}, +{20,0,36},{20,0,36},{20,0,36},{20,22,0},{20,22,0},{20,22,0},{20,21,1},{19,22,0},{19,22,0},{21,25,56},{21,24,38},{21,23,52},{21,23,36},{21,25,56},{21,24,35},{21,23,0},{21,23,52},{19,24,63},{20,23,38},{22,24,24},{22,23,14},{22,23,5},{22,23,13},{31,8,51},{20,24,24},{21,23,0},{20,23,37},{28,19,51},{20,23,37},{21,24,37},{21,24,37},{21,24,37}, +{21,23,36},{21,24,10},{21,23,0},{21,23,0},{21,22,5},{20,23,11},{21,22,14},{22,23,5},{22,23,5},{22,23,5},{22,22,8},{28,12,8},{21,23,0},{21,23,0},{21,22,5},{22,22,8},{21,22,5},{29,12,18},{21,24,2},{22,23,1},{21,23,0},{29,12,18},{27,20,18},{21,23,0},{0,23,36},{27,20,18},{0,23,36},{21,0,36},{21,0,36},{21,0,36},{21,0,36},{21,23,0}, +{21,23,0},{21,23,0},{21,22,1},{20,23,2},{20,23,2},{22,26,56},{22,25,38},{22,24,53},{22,24,37},{22,26,56},{22,25,35},{22,24,1},{22,24,66},{20,25,60},{21,24,52},{23,25,24},{23,24,14},{23,24,6},{23,24,14},{29,14,51},{21,25,24},{22,24,1},{21,24,51},{29,20,51},{21,24,51},{22,25,37},{22,25,37},{22,25,37},{22,24,36},{22,25,10},{22,24,0},{22,24,0}, +{22,23,5},{21,24,11},{22,23,14},{23,24,5},{23,24,5},{23,24,5},{23,23,8},{29,13,8},{22,24,0},{22,24,0},{22,23,5},{28,20,8},{22,23,5},{30,13,18},{22,25,2},{23,24,2},{22,24,1},{30,13,18},{28,21,18},{22,24,1},{0,24,50},{28,21,18},{0,24,50},{22,0,36},{22,0,36},{22,0,36},{22,0,36},{22,24,0},{22,24,0},{22,24,0},{22,23,1},{21,24,2}, +{21,24,2},{23,28,70},{23,26,58},{24,25,69},{23,25,51},{23,27,52},{23,26,25},{23,25,3},{23,25,46},{22,26,60},{22,25,36},{24,26,24},{24,25,14},{24,25,5},{24,25,13},{29,17,51},{23,26,24},{23,25,2},{22,25,36},{27,23,51},{22,25,36},{23,27,51},{23,27,51},{23,27,51},{23,25,51},{23,26,9},{23,25,3},{23,25,3},{23,24,9},{21,26,12},{23,24,12},{24,25,5}, +{24,25,5},{24,25,5},{24,24,8},{29,16,8},{23,25,2},{23,25,2},{23,24,8},{31,20,8},{23,24,8},{30,16,18},{23,26,8},{24,25,1},{23,25,1},{30,16,18},{31,21,18},{23,25,1},{0,25,36},{31,21,18},{0,25,36},{23,0,50},{23,0,50},{23,0,50},{23,0,50},{23,25,2},{23,25,2},{23,25,2},{23,24,5},{22,25,0},{22,25,0},{24,28,56},{24,27,38},{24,26,52}, +{24,26,36},{24,28,56},{24,27,35},{24,26,0},{24,26,52},{23,27,60},{23,26,36},{25,27,24},{25,26,14},{25,26,5},{25,26,13},{30,18,51},{23,27,35},{24,26,0},{23,26,36},{26,25,51},{23,26,36},{24,27,37},{24,27,37},{24,27,37},{24,26,36},{24,27,10},{24,26,0},{24,26,0},{24,25,5},{22,27,12},{24,25,14},{25,26,5},{25,26,5},{25,26,5},{25,25,8},{30,17,8}, +{24,26,0},{24,26,0},{24,25,5},{25,25,8},{24,25,5},{31,17,18},{24,27,2},{25,26,1},{24,26,0},{31,17,18},{25,26,18},{24,26,0},{0,26,36},{25,26,18},{0,26,36},{24,0,36},{24,0,36},{24,0,36},{24,0,36},{24,26,0},{24,26,0},{24,26,0},{24,25,1},{23,26,0},{23,26,0},{25,29,56},{25,28,38},{25,27,52},{25,27,36},{25,29,56},{25,28,35},{25,27,0}, +{25,27,52},{23,28,63},{24,27,38},{26,28,24},{26,27,14},{26,27,5},{26,27,13},{31,19,51},{24,28,24},{25,27,0},{24,27,37},{27,26,51},{24,27,37},{25,28,37},{25,28,37},{25,28,37},{25,27,36},{25,28,10},{25,27,0},{25,27,0},{25,26,5},{24,27,11},{25,26,14},{26,27,5},{26,27,5},{26,27,5},{26,26,8},{31,18,8},{25,27,0},{25,27,0},{25,26,5},{26,26,8}, +{25,26,5},{30,21,18},{25,28,2},{26,27,1},{25,27,0},{30,21,18},{31,24,18},{25,27,0},{0,27,36},{31,24,18},{0,27,36},{25,0,36},{25,0,36},{25,0,36},{25,0,36},{25,27,0},{25,27,0},{25,27,0},{25,26,1},{24,27,2},{24,27,2},{26,30,56},{26,29,38},{26,28,53},{26,28,37},{26,30,56},{26,29,35},{26,28,1},{26,28,66},{24,29,60},{25,28,52},{27,29,24}, +{27,28,14},{27,28,6},{27,28,14},{30,23,51},{25,29,24},{26,28,1},{25,28,51},{28,27,51},{25,28,51},{26,29,37},{26,29,37},{26,29,37},{26,28,36},{26,29,10},{26,28,0},{26,28,0},{26,27,5},{25,28,11},{26,27,14},{27,28,5},{27,28,5},{27,28,5},{27,27,8},{30,22,8},{26,28,0},{26,28,0},{26,27,5},{27,27,8},{26,27,5},{31,22,18},{26,29,2},{27,28,2}, +{26,28,1},{31,22,18},{27,28,18},{26,28,1},{0,28,50},{27,28,18},{0,28,50},{26,0,36},{26,0,36},{26,0,36},{26,0,36},{26,28,0},{26,28,0},{26,28,0},{26,27,1},{25,28,2},{25,28,2},{27,31,76},{27,30,58},{28,29,69},{27,29,51},{27,31,52},{27,30,25},{27,29,3},{27,29,46},{26,30,60},{26,29,36},{28,30,24},{28,29,14},{28,29,5},{28,29,13},{30,26,51}, +{27,30,24},{27,29,2},{26,29,36},{31,27,51},{26,29,36},{27,31,51},{27,31,51},{27,31,51},{27,29,51},{27,30,9},{27,29,3},{27,29,3},{27,28,9},{25,30,12},{27,28,12},{28,29,5},{28,29,5},{28,29,5},{28,28,8},{30,25,8},{27,29,2},{27,29,2},{27,28,8},{30,27,8},{27,28,8},{31,25,18},{27,30,8},{28,29,1},{27,29,1},{31,25,18},{28,29,18},{27,29,1}, +{0,29,36},{28,29,18},{0,29,36},{27,0,50},{27,0,50},{27,0,50},{27,0,50},{27,29,2},{27,29,2},{27,29,2},{27,28,5},{26,29,0},{26,29,0},{28,31,86},{28,31,38},{28,30,52},{28,30,36},{28,31,59},{28,31,35},{28,30,0},{28,30,52},{27,31,60},{27,30,36},{29,31,24},{29,30,14},{29,30,5},{29,30,13},{31,27,51},{27,31,35},{28,30,0},{27,30,36},{30,29,51}, +{27,30,36},{28,31,37},{28,31,37},{28,31,37},{28,30,36},{28,31,10},{28,30,0},{28,30,0},{28,29,5},{26,31,12},{28,29,14},{29,30,5},{29,30,5},{29,30,5},{29,29,8},{31,26,8},{28,30,0},{28,30,0},{28,29,5},{29,29,8},{28,29,5},{30,29,18},{28,31,2},{29,30,1},{28,30,0},{30,29,18},{29,30,18},{28,30,0},{0,30,36},{29,30,18},{0,30,36},{28,0,36}, +{28,0,36},{28,0,36},{28,0,36},{28,30,0},{28,30,0},{28,30,0},{28,29,1},{27,30,0},{27,30,0},{30,31,94},{30,31,78},{29,31,52},{29,31,36},{30,31,115},{29,31,36},{29,31,0},{29,31,52},{29,31,88},{28,31,38},{30,31,30},{30,31,14},{30,31,5},{30,31,13},{30,31,51},{29,31,36},{29,31,0},{28,31,37},{31,30,51},{28,31,37},{29,31,52},{29,31,52},{29,31,52}, +{29,31,36},{29,31,16},{29,31,0},{29,31,0},{29,30,5},{28,31,11},{29,30,14},{30,31,5},{30,31,5},{30,31,5},{30,30,8},{30,30,8},{29,31,0},{29,31,0},{29,30,5},{30,30,8},{29,30,5},{31,30,18},{30,31,10},{30,31,1},{29,31,0},{31,30,18},{30,31,18},{29,31,0},{0,31,36},{30,31,18},{0,31,36},{29,0,36},{29,0,36},{29,0,36},{29,0,36},{29,31,0}, +{29,31,0},{29,31,0},{29,30,1},{28,31,2},{28,31,2},{31,31,68},{31,31,68},{30,31,61},{30,31,45},{30,31,59},{30,31,27},{30,31,18},{30,31,1},{30,31,28},{30,31,10},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{30,31,1},{31,31,4},{30,31,1},{30,31,61},{30,31,61},{30,31,61},{30,31,45},{30,31,34},{30,31,18},{30,31,18}, +{30,31,1},{30,31,19},{30,31,10},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{30,31,1},{31,31,4},{30,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{30,0,36},{30,0,36},{30,0,36},{30,0,36},{30,31,9},{30,31,9},{30,31,9},{30,31,1},{30,31,10}, +{30,31,10},{0,4,74},{0,3,20},{0,2,2},{0,2,26},{0,2,158},{0,2,110},{0,2,62},{0,1,115},{0,1,178},{0,1,124},{0,4,74},{0,3,20},{0,2,2},{0,2,26},{1,1,154},{0,2,110},{0,2,62},{0,1,115},{1,1,154},{0,1,115},{0,2,1},{0,2,1},{0,2,1},{0,1,0},{0,1,13},{0,1,9},{0,1,9},{0,0,25},{0,0,25},{0,0,25},{0,2,1}, +{0,2,1},{0,2,1},{0,1,0},{0,1,13},{0,1,9},{0,1,9},{0,0,25},{1,0,13},{0,0,25},{1,2,72},{0,3,20},{0,2,2},{0,2,26},{1,2,72},{2,1,72},{0,2,26},{0,1,90},{2,1,72},{0,1,90},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,6,83},{0,5,13},{0,3,26}, +{0,3,14},{0,5,248},{0,3,140},{0,3,41},{0,2,139},{0,2,319},{0,2,175},{0,6,83},{0,5,13},{0,3,26},{0,3,14},{1,3,243},{0,3,140},{0,3,41},{0,2,139},{3,1,243},{0,2,139},{0,4,10},{0,4,10},{0,4,10},{0,3,13},{0,3,52},{0,2,18},{0,2,18},{0,1,29},{0,1,77},{0,1,38},{0,4,10},{0,4,10},{0,4,10},{0,3,13},{1,1,50}, +{0,2,18},{0,2,18},{0,1,29},{1,1,50},{0,1,29},{2,3,72},{0,5,4},{1,3,2},{0,3,5},{2,3,72},{3,2,72},{0,3,5},{0,2,90},{3,2,72},{0,2,90},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,1,0},{0,1,0},{0,1,0},{0,1,4},{0,0,9},{0,0,9},{1,7,147},{1,6,77},{1,4,89},{1,4,77},{0,7,244},{0,5,96},{0,4,2}, +{0,3,106},{0,4,395},{0,3,187},{1,7,83},{1,6,13},{1,4,25},{1,4,13},{2,4,243},{0,5,96},{0,4,2},{0,3,106},{4,2,243},{0,3,106},{1,5,74},{1,5,74},{1,5,74},{1,4,77},{0,5,52},{0,4,2},{0,4,2},{0,3,25},{0,3,133},{0,2,62},{1,5,10},{1,5,10},{1,5,10},{1,4,13},{2,2,50},{0,4,2},{0,4,2},{0,3,25},{2,2,50}, +{0,3,25},{3,4,72},{1,6,4},{2,4,1},{0,4,1},{3,4,72},{9,0,72},{0,4,1},{0,3,90},{9,0,72},{0,3,90},{1,0,73},{1,0,73},{1,0,73},{1,0,73},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,2,37},{0,2,37},{2,8,164},{2,7,94},{2,5,106},{2,5,94},{1,8,245},{1,6,97},{1,5,3},{1,4,97},{0,6,364},{0,4,106},{2,8,83}, +{2,7,13},{2,5,25},{2,5,13},{6,0,243},{0,7,76},{1,5,2},{0,4,81},{10,0,243},{0,4,81},{2,6,91},{2,6,91},{2,6,91},{2,5,94},{1,6,53},{1,5,3},{1,5,3},{1,3,27},{0,4,107},{0,4,42},{2,6,10},{2,6,10},{2,6,10},{2,5,13},{3,3,50},{1,5,2},{1,5,2},{0,4,17},{8,0,50},{0,4,17},{7,0,72},{2,7,4},{3,5,1}, +{1,5,1},{7,0,72},{10,1,72},{1,5,1},{0,4,80},{10,1,72},{0,4,80},{2,0,90},{2,0,90},{2,0,90},{2,0,90},{1,5,2},{1,5,2},{1,5,2},{1,3,2},{0,3,20},{0,3,20},{3,10,154},{3,8,81},{3,6,106},{3,6,82},{2,10,248},{2,7,99},{2,6,5},{2,5,99},{0,7,308},{0,5,100},{3,10,90},{3,8,17},{4,6,27},{3,6,18},{6,3,243}, +{1,8,73},{2,6,5},{1,5,90},{8,3,243},{1,5,90},{3,8,81},{3,8,81},{3,8,81},{3,6,81},{2,8,52},{2,6,4},{2,6,4},{2,5,18},{0,6,72},{0,5,19},{3,8,17},{3,8,17},{3,8,17},{3,6,17},{6,1,50},{2,6,4},{2,6,4},{1,5,9},{11,0,50},{1,5,9},{8,1,72},{3,8,1},{4,6,2},{3,6,2},{8,1,72},{6,5,72},{3,6,2}, +{0,5,90},{6,5,72},{0,5,90},{3,0,80},{3,0,80},{3,0,80},{3,0,80},{2,6,0},{2,6,0},{2,6,0},{2,4,4},{0,6,8},{0,6,8},{4,10,164},{4,9,94},{4,7,107},{4,7,95},{3,11,248},{3,8,89},{3,7,5},{3,6,99},{0,9,253},{1,6,100},{4,10,83},{4,9,13},{4,7,26},{4,7,14},{8,2,243},{2,9,73},{3,7,5},{2,6,90},{12,2,243}, +{2,6,90},{4,8,91},{4,8,91},{4,8,91},{4,7,94},{3,9,52},{3,7,4},{3,7,4},{3,6,18},{0,8,50},{1,6,19},{4,8,10},{4,8,10},{4,8,10},{4,7,13},{8,0,50},{3,7,4},{3,7,4},{2,6,9},{5,5,50},{2,6,9},{9,2,72},{4,9,4},{5,7,2},{3,7,5},{9,2,72},{17,0,72},{3,7,5},{0,6,90},{17,0,72},{0,6,90},{4,0,90}, +{4,0,90},{4,0,90},{4,0,90},{3,7,0},{3,7,0},{3,7,0},{3,5,4},{1,7,8},{1,7,8},{5,11,164},{5,10,94},{5,8,106},{5,8,94},{4,11,245},{4,9,97},{4,8,3},{4,7,107},{0,11,249},{2,7,100},{5,11,83},{5,10,13},{5,8,25},{5,8,13},{9,3,243},{3,10,73},{4,8,2},{3,7,90},{18,0,243},{3,7,90},{5,9,91},{5,9,91},{5,9,91}, +{5,8,94},{4,9,53},{4,8,3},{4,8,3},{4,7,26},{1,9,50},{2,7,19},{5,9,10},{5,9,10},{5,9,10},{5,8,13},{9,1,50},{4,8,2},{4,8,2},{3,7,9},{16,0,50},{3,7,9},{10,3,72},{5,10,4},{6,8,1},{4,8,1},{10,3,72},{18,1,72},{4,8,1},{0,7,90},{18,1,72},{0,7,90},{5,0,90},{5,0,90},{5,0,90},{5,0,90},{4,8,2}, +{4,8,2},{4,8,2},{4,6,2},{1,8,9},{1,8,9},{6,12,164},{6,11,94},{6,9,106},{6,9,94},{5,12,245},{5,10,97},{5,9,3},{5,8,97},{1,12,252},{3,8,85},{6,12,83},{6,11,13},{6,9,25},{6,9,13},{10,4,243},{4,11,76},{5,9,2},{4,8,81},{19,1,243},{4,8,81},{6,10,91},{6,10,91},{6,10,91},{6,9,94},{5,10,53},{5,9,3},{5,9,3}, +{5,7,27},{2,10,50},{3,8,21},{6,10,10},{6,10,10},{6,10,10},{6,9,13},{10,2,50},{5,9,2},{5,9,2},{4,8,17},{17,1,50},{4,8,17},{11,4,72},{6,11,4},{7,9,1},{5,9,1},{11,4,72},{19,2,72},{5,9,1},{0,8,80},{19,2,72},{0,8,80},{6,0,90},{6,0,90},{6,0,90},{6,0,90},{5,9,2},{5,9,2},{5,9,2},{5,7,2},{3,8,5}, +{3,8,5},{7,14,154},{7,12,81},{7,10,106},{7,10,82},{6,14,248},{6,11,99},{6,10,5},{6,9,99},{2,13,244},{4,9,100},{7,14,90},{7,12,17},{8,10,27},{7,10,18},{13,2,243},{5,12,73},{6,10,5},{5,9,90},{22,1,243},{5,9,90},{7,12,81},{7,12,81},{7,12,81},{7,10,81},{6,12,52},{6,10,4},{6,10,4},{6,9,18},{3,11,53},{4,9,19},{7,12,17}, +{7,12,17},{7,12,17},{7,10,17},{13,0,50},{6,10,4},{6,10,4},{5,9,9},{20,1,50},{5,9,9},{14,2,72},{7,12,1},{8,10,2},{7,10,2},{14,2,72},{25,0,72},{7,10,2},{0,9,90},{25,0,72},{0,9,90},{7,0,80},{7,0,80},{7,0,80},{7,0,80},{6,10,0},{6,10,0},{6,10,0},{6,8,4},{4,10,8},{4,10,8},{8,14,164},{8,13,94},{8,11,107}, +{8,11,95},{7,15,248},{7,12,89},{7,11,5},{7,10,99},{3,14,244},{5,10,100},{8,14,83},{8,13,13},{8,11,26},{8,11,14},{14,3,243},{6,13,73},{7,11,5},{6,10,90},{26,0,243},{6,10,90},{8,12,91},{8,12,91},{8,12,91},{8,11,94},{7,13,52},{7,11,4},{7,11,4},{7,10,18},{4,12,50},{5,10,19},{8,12,10},{8,12,10},{8,12,10},{8,11,13},{14,1,50}, +{7,11,4},{7,11,4},{6,10,9},{24,0,50},{6,10,9},{16,1,72},{8,13,4},{9,11,2},{7,11,5},{16,1,72},{26,1,72},{7,11,5},{0,10,90},{26,1,72},{0,10,90},{8,0,90},{8,0,90},{8,0,90},{8,0,90},{7,11,0},{7,11,0},{7,11,0},{7,9,4},{5,11,8},{5,11,8},{9,15,164},{9,14,94},{9,12,106},{9,12,94},{8,15,245},{8,13,97},{8,12,3}, +{8,11,107},{4,15,249},{6,11,100},{9,15,83},{9,14,13},{9,12,25},{9,12,13},{16,2,243},{7,14,73},{8,12,2},{7,11,90},{27,1,243},{7,11,90},{9,13,91},{9,13,91},{9,13,91},{9,12,94},{8,13,53},{8,12,3},{8,12,3},{8,11,26},{5,13,50},{6,11,19},{9,13,10},{9,13,10},{9,13,10},{9,12,13},{16,0,50},{8,12,2},{8,12,2},{7,11,9},{25,1,50}, +{7,11,9},{17,2,72},{9,14,4},{10,12,1},{8,12,1},{17,2,72},{27,2,72},{8,12,1},{0,11,90},{27,2,72},{0,11,90},{9,0,90},{9,0,90},{9,0,90},{9,0,90},{8,12,2},{8,12,2},{8,12,2},{8,10,2},{5,12,9},{5,12,9},{10,16,164},{10,15,94},{10,13,106},{10,13,94},{9,16,245},{9,14,97},{9,13,3},{9,12,97},{5,16,252},{7,12,85},{10,16,83}, +{10,15,13},{10,13,25},{10,13,13},{17,3,243},{8,15,76},{9,13,2},{8,12,81},{28,2,243},{8,12,81},{10,14,91},{10,14,91},{10,14,91},{10,13,94},{9,14,53},{9,13,3},{9,13,3},{9,11,27},{6,14,50},{7,12,21},{10,14,10},{10,14,10},{10,14,10},{10,13,13},{17,1,50},{9,13,2},{9,13,2},{8,12,17},{26,2,50},{8,12,17},{18,3,72},{10,15,4},{11,13,1}, +{9,13,1},{18,3,72},{28,3,72},{9,13,1},{0,12,80},{28,3,72},{0,12,80},{10,0,90},{10,0,90},{10,0,90},{10,0,90},{9,13,2},{9,13,2},{9,13,2},{9,11,2},{7,12,5},{7,12,5},{11,18,154},{11,16,81},{11,14,106},{11,14,82},{10,18,248},{10,15,99},{10,14,5},{10,13,99},{6,17,244},{8,13,100},{11,18,90},{11,16,17},{12,14,27},{11,14,18},{17,6,243}, +{9,16,73},{10,14,5},{9,13,90},{31,2,243},{9,13,90},{11,16,81},{11,16,81},{11,16,81},{11,14,81},{10,16,52},{10,14,4},{10,14,4},{10,13,18},{7,15,53},{8,13,19},{11,16,17},{11,16,17},{11,16,17},{11,14,17},{17,4,50},{10,14,4},{10,14,4},{9,13,9},{29,2,50},{9,13,9},{18,6,72},{11,16,1},{12,14,2},{11,14,2},{18,6,72},{31,3,72},{11,14,2}, +{0,13,90},{31,3,72},{0,13,90},{11,0,80},{11,0,80},{11,0,80},{11,0,80},{10,14,0},{10,14,0},{10,14,0},{10,12,4},{8,14,8},{8,14,8},{12,18,164},{12,17,94},{12,15,107},{12,15,95},{11,19,248},{11,16,89},{11,15,5},{11,14,99},{7,18,244},{9,14,100},{12,18,83},{12,17,13},{12,15,26},{12,15,14},{22,0,243},{10,17,73},{11,15,5},{10,14,90},{30,4,243}, +{10,14,90},{12,16,91},{12,16,91},{12,16,91},{12,15,94},{11,17,52},{11,15,4},{11,15,4},{11,14,18},{8,16,50},{9,14,19},{12,16,10},{12,16,10},{12,16,10},{12,15,13},{18,5,50},{11,15,4},{11,15,4},{10,14,9},{30,3,50},{10,14,9},{23,0,72},{12,17,4},{13,15,2},{11,15,5},{23,0,72},{30,5,72},{11,15,5},{0,14,90},{30,5,72},{0,14,90},{12,0,90}, +{12,0,90},{12,0,90},{12,0,90},{11,15,0},{11,15,0},{11,15,0},{11,13,4},{9,15,8},{9,15,8},{13,19,164},{13,18,94},{13,16,106},{13,16,94},{12,19,245},{12,17,97},{12,16,3},{12,15,107},{8,19,249},{10,15,100},{13,19,83},{13,18,13},{13,16,25},{13,16,13},{23,1,243},{11,18,73},{12,16,2},{11,15,90},{31,5,243},{11,15,90},{13,17,91},{13,17,91},{13,17,91}, +{13,16,94},{12,17,53},{12,16,3},{12,16,3},{12,15,26},{9,17,50},{10,15,19},{13,17,10},{13,17,10},{13,17,10},{13,16,13},{20,4,50},{12,16,2},{12,16,2},{11,15,9},{29,5,50},{11,15,9},{24,1,72},{13,18,4},{14,16,1},{12,16,1},{24,1,72},{31,6,72},{12,16,1},{0,15,90},{31,6,72},{0,15,90},{13,0,90},{13,0,90},{13,0,90},{13,0,90},{12,16,2}, +{12,16,2},{12,16,2},{12,14,2},{9,16,9},{9,16,9},{14,20,164},{14,19,94},{14,17,106},{14,17,94},{13,20,245},{13,18,97},{13,17,3},{13,16,97},{9,20,252},{11,16,85},{14,20,83},{14,19,13},{14,17,25},{14,17,13},{24,2,243},{12,19,76},{13,17,2},{12,16,81},{27,9,243},{12,16,81},{14,18,91},{14,18,91},{14,18,91},{14,17,94},{13,18,53},{13,17,3},{13,17,3}, +{13,15,27},{10,18,50},{11,16,21},{14,18,10},{14,18,10},{14,18,10},{14,17,13},{24,0,50},{13,17,2},{13,17,2},{12,16,17},{30,6,50},{12,16,17},{25,2,72},{14,19,4},{15,17,1},{13,17,1},{25,2,72},{27,10,72},{13,17,1},{0,16,80},{27,10,72},{0,16,80},{14,0,90},{14,0,90},{14,0,90},{14,0,90},{13,17,2},{13,17,2},{13,17,2},{13,15,2},{11,16,5}, +{11,16,5},{15,22,154},{15,20,81},{15,18,106},{15,18,82},{14,22,248},{14,19,99},{14,18,5},{14,17,99},{10,21,244},{12,17,100},{15,22,90},{15,20,17},{16,18,27},{15,18,18},{27,0,243},{13,20,73},{14,18,5},{13,17,90},{30,9,243},{13,17,90},{15,20,81},{15,20,81},{15,20,81},{15,18,81},{14,20,52},{14,18,4},{14,18,4},{14,17,18},{11,19,53},{12,17,19},{15,20,17}, +{15,20,17},{15,20,17},{15,18,17},{24,3,50},{14,18,4},{14,18,4},{13,17,9},{28,9,50},{13,17,9},{22,10,72},{15,20,1},{16,18,2},{15,18,2},{22,10,72},{30,10,72},{15,18,2},{0,17,90},{30,10,72},{0,17,90},{15,0,80},{15,0,80},{15,0,80},{15,0,80},{14,18,0},{14,18,0},{14,18,0},{14,16,4},{12,18,8},{12,18,8},{16,22,164},{16,21,94},{16,19,107}, +{16,19,95},{15,23,248},{15,20,89},{15,19,5},{15,18,99},{11,22,244},{13,18,100},{16,22,83},{16,21,13},{16,19,26},{16,19,14},{26,4,243},{14,21,73},{15,19,5},{14,18,90},{31,10,243},{14,18,90},{16,20,91},{16,20,91},{16,20,91},{16,19,94},{15,21,52},{15,19,4},{15,19,4},{15,18,18},{12,20,50},{13,18,19},{16,20,10},{16,20,10},{16,20,10},{16,19,13},{22,9,50}, +{15,19,4},{15,19,4},{14,18,9},{29,10,50},{14,18,9},{27,4,72},{16,21,4},{17,19,2},{15,19,5},{27,4,72},{31,11,72},{15,19,5},{0,18,90},{31,11,72},{0,18,90},{16,0,90},{16,0,90},{16,0,90},{16,0,90},{15,19,0},{15,19,0},{15,19,0},{15,17,4},{13,19,8},{13,19,8},{17,23,164},{17,22,94},{17,20,106},{17,20,94},{16,23,245},{16,21,97},{16,20,3}, +{16,19,107},{12,23,249},{14,19,100},{17,23,83},{17,22,13},{17,20,25},{17,20,13},{30,0,243},{15,22,73},{16,20,2},{15,19,90},{30,12,243},{15,19,90},{17,21,91},{17,21,91},{17,21,91},{17,20,94},{16,21,53},{16,20,3},{16,20,3},{16,19,26},{13,21,50},{14,19,19},{17,21,10},{17,21,10},{17,21,10},{17,20,13},{24,8,50},{16,20,2},{16,20,2},{15,19,9},{30,11,50}, +{15,19,9},{31,0,72},{17,22,4},{18,20,1},{16,20,1},{31,0,72},{30,13,72},{16,20,1},{0,19,90},{30,13,72},{0,19,90},{17,0,90},{17,0,90},{17,0,90},{17,0,90},{16,20,2},{16,20,2},{16,20,2},{16,18,2},{13,20,9},{13,20,9},{18,24,164},{18,23,94},{18,21,106},{18,21,94},{17,24,245},{17,22,97},{17,21,3},{17,20,97},{13,24,252},{15,20,85},{18,24,83}, +{18,23,13},{18,21,25},{18,21,13},{31,1,243},{16,23,76},{17,21,2},{16,20,81},{31,13,243},{16,20,81},{18,22,91},{18,22,91},{18,22,91},{18,21,94},{17,22,53},{17,21,3},{17,21,3},{17,19,27},{14,22,50},{15,20,21},{18,22,10},{18,22,10},{18,22,10},{18,21,13},{28,4,50},{17,21,2},{17,21,2},{16,20,17},{29,13,50},{16,20,17},{29,6,72},{18,23,4},{19,21,1}, +{17,21,1},{29,6,72},{31,14,72},{17,21,1},{0,20,80},{31,14,72},{0,20,80},{18,0,90},{18,0,90},{18,0,90},{18,0,90},{17,21,2},{17,21,2},{17,21,2},{17,19,2},{15,20,5},{15,20,5},{19,26,154},{19,24,81},{19,22,106},{19,22,82},{18,26,248},{18,23,99},{18,22,5},{18,21,99},{14,25,244},{16,21,100},{19,26,90},{19,24,17},{20,22,27},{19,22,18},{31,4,243}, +{17,24,73},{18,22,5},{17,21,90},{24,19,243},{17,21,90},{19,24,81},{19,24,81},{19,24,81},{19,22,81},{18,24,52},{18,22,4},{18,22,4},{18,21,18},{15,23,53},{16,21,19},{19,24,17},{19,24,17},{19,24,17},{19,22,17},{31,2,50},{18,22,4},{18,22,4},{17,21,9},{27,16,50},{17,21,9},{26,14,72},{19,24,1},{20,22,2},{19,22,2},{26,14,72},{22,21,72},{19,22,2}, +{0,21,90},{22,21,72},{0,21,90},{19,0,80},{19,0,80},{19,0,80},{19,0,80},{18,22,0},{18,22,0},{18,22,0},{18,20,4},{16,22,8},{16,22,8},{20,26,164},{20,25,94},{20,23,107},{20,23,95},{19,27,248},{19,24,89},{19,23,5},{19,22,99},{15,26,244},{17,22,100},{20,26,83},{20,25,13},{20,23,26},{20,23,14},{30,8,243},{18,25,73},{19,23,5},{18,22,90},{28,18,243}, +{18,22,90},{20,24,91},{20,24,91},{20,24,91},{20,23,94},{19,25,52},{19,23,4},{19,23,4},{19,22,18},{16,24,50},{17,22,19},{20,24,10},{20,24,10},{20,24,10},{20,23,13},{26,13,50},{19,23,4},{19,23,4},{18,22,9},{21,21,50},{18,22,9},{31,8,72},{20,25,4},{21,23,2},{19,23,5},{31,8,72},{28,19,72},{19,23,5},{0,22,90},{28,19,72},{0,22,90},{20,0,90}, +{20,0,90},{20,0,90},{20,0,90},{19,23,0},{19,23,0},{19,23,0},{19,21,4},{17,23,8},{17,23,8},{21,27,164},{21,26,94},{21,24,106},{21,24,94},{20,27,245},{20,25,97},{20,24,3},{20,23,107},{16,27,249},{18,23,100},{21,27,83},{21,26,13},{21,24,25},{21,24,13},{31,9,243},{19,26,73},{20,24,2},{19,23,90},{29,19,243},{19,23,90},{21,25,91},{21,25,91},{21,25,91}, +{21,24,94},{20,25,53},{20,24,3},{20,24,3},{20,23,26},{17,25,50},{18,23,19},{21,25,10},{21,25,10},{21,25,10},{21,24,13},{28,12,50},{20,24,2},{20,24,2},{19,23,9},{22,22,50},{19,23,9},{29,14,72},{21,26,4},{22,24,1},{20,24,1},{29,14,72},{29,20,72},{20,24,1},{0,23,90},{29,20,72},{0,23,90},{21,0,90},{21,0,90},{21,0,90},{21,0,90},{20,24,2}, +{20,24,2},{20,24,2},{20,22,2},{17,24,9},{17,24,9},{22,28,164},{22,27,94},{22,25,106},{22,25,94},{21,28,245},{21,26,97},{21,25,3},{21,24,97},{17,28,252},{19,24,85},{22,28,83},{22,27,13},{22,25,25},{22,25,13},{29,15,243},{20,27,76},{21,25,2},{20,24,81},{30,20,243},{20,24,81},{22,26,91},{22,26,91},{22,26,91},{22,25,94},{21,26,53},{21,25,3},{21,25,3}, +{21,23,27},{18,26,50},{19,24,21},{22,26,10},{22,26,10},{22,26,10},{22,25,13},{29,13,50},{21,25,2},{21,25,2},{20,24,17},{28,20,50},{20,24,17},{30,15,72},{22,27,4},{23,25,1},{21,25,1},{30,15,72},{30,21,72},{21,25,1},{0,24,80},{30,21,72},{0,24,80},{22,0,90},{22,0,90},{22,0,90},{22,0,90},{21,25,2},{21,25,2},{21,25,2},{21,23,2},{19,24,5}, +{19,24,5},{23,30,154},{23,28,81},{23,26,106},{23,26,82},{22,30,248},{22,27,99},{22,26,5},{22,25,99},{18,29,244},{20,25,100},{23,30,90},{23,28,17},{24,26,27},{23,26,18},{29,18,243},{21,28,73},{22,26,5},{21,25,90},{28,23,243},{21,25,90},{23,28,81},{23,28,81},{23,28,81},{23,26,81},{22,28,52},{22,26,4},{22,26,4},{22,25,18},{19,27,53},{20,25,19},{23,28,17}, +{23,28,17},{23,28,17},{23,26,17},{29,16,50},{22,26,4},{22,26,4},{21,25,9},{31,20,50},{21,25,9},{30,18,72},{23,28,1},{24,26,2},{23,26,2},{30,18,72},{26,25,72},{23,26,2},{0,25,90},{26,25,72},{0,25,90},{23,0,80},{23,0,80},{23,0,80},{23,0,80},{22,26,0},{22,26,0},{22,26,0},{22,24,4},{20,26,8},{20,26,8},{24,30,164},{24,29,94},{24,27,107}, +{24,27,95},{23,31,248},{23,28,89},{23,27,5},{23,26,99},{19,30,244},{21,26,100},{24,30,83},{24,29,13},{24,27,26},{24,27,14},{30,19,243},{22,29,73},{23,27,5},{22,26,90},{27,25,243},{22,26,90},{24,28,91},{24,28,91},{24,28,91},{24,27,94},{23,29,52},{23,27,4},{23,27,4},{23,26,18},{20,28,50},{21,26,19},{24,28,10},{24,28,10},{24,28,10},{24,27,13},{30,17,50}, +{23,27,4},{23,27,4},{22,26,9},{25,25,50},{22,26,9},{31,19,72},{24,29,4},{25,27,2},{23,27,5},{31,19,72},{27,26,72},{23,27,5},{0,26,90},{27,26,72},{0,26,90},{24,0,90},{24,0,90},{24,0,90},{24,0,90},{23,27,0},{23,27,0},{23,27,0},{23,25,4},{21,27,8},{21,27,8},{25,31,164},{25,30,94},{25,28,106},{25,28,94},{24,31,245},{24,29,97},{24,28,3}, +{24,27,107},{20,31,249},{22,27,100},{25,31,83},{25,30,13},{25,28,25},{25,28,13},{29,23,243},{23,30,73},{24,28,2},{23,27,90},{28,26,243},{23,27,90},{25,29,91},{25,29,91},{25,29,91},{25,28,94},{24,29,53},{24,28,3},{24,28,3},{24,27,26},{21,29,50},{22,27,19},{25,29,10},{25,29,10},{25,29,10},{25,28,13},{31,18,50},{24,28,2},{24,28,2},{23,27,9},{26,26,50}, +{23,27,9},{30,23,72},{25,30,4},{26,28,1},{24,28,1},{30,23,72},{28,27,72},{24,28,1},{0,27,90},{28,27,72},{0,27,90},{25,0,90},{25,0,90},{25,0,90},{25,0,90},{24,28,2},{24,28,2},{24,28,2},{24,26,2},{21,28,9},{21,28,9},{26,31,194},{26,31,94},{26,29,106},{26,29,94},{25,31,284},{25,30,97},{25,29,3},{25,28,97},{22,31,253},{23,28,85},{27,31,99}, +{26,31,13},{26,29,25},{26,29,13},{30,24,243},{24,31,76},{25,29,2},{24,28,81},{29,27,243},{24,28,81},{26,30,91},{26,30,91},{26,30,91},{26,29,94},{25,30,53},{25,29,3},{25,29,3},{25,27,27},{22,30,50},{23,28,21},{26,30,10},{26,30,10},{26,30,10},{26,29,13},{30,22,50},{25,29,2},{25,29,2},{24,28,17},{27,27,50},{24,28,17},{31,24,72},{26,31,4},{27,29,1}, +{25,29,1},{31,24,72},{24,31,72},{25,29,1},{0,28,80},{24,31,72},{0,28,80},{26,0,90},{26,0,90},{26,0,90},{26,0,90},{25,29,2},{25,29,2},{25,29,2},{25,27,2},{23,28,5},{23,28,5},{27,31,280},{27,31,120},{27,30,106},{27,30,82},{27,31,328},{26,31,99},{26,30,5},{26,29,99},{24,31,308},{24,29,100},{28,31,105},{28,31,45},{28,30,27},{27,30,18},{30,27,243}, +{26,31,99},{26,30,5},{25,29,90},{30,28,243},{25,29,90},{27,31,84},{27,31,84},{27,31,84},{27,30,81},{26,31,58},{26,30,4},{26,30,4},{26,29,18},{23,31,53},{24,29,19},{27,31,20},{27,31,20},{27,31,20},{27,30,17},{30,25,50},{26,30,4},{26,30,4},{25,29,9},{30,27,50},{25,29,9},{31,27,72},{28,31,20},{28,30,2},{27,30,2},{31,27,72},{30,29,72},{27,30,2}, +{0,29,90},{30,29,72},{0,29,90},{27,0,80},{27,0,80},{27,0,80},{27,0,80},{26,30,0},{26,30,0},{26,30,0},{26,28,4},{24,30,8},{24,30,8},{28,31,331},{28,31,187},{28,31,106},{28,31,94},{28,31,358},{27,31,173},{27,31,4},{27,30,82},{26,31,355},{25,30,83},{29,31,126},{29,31,62},{28,31,25},{28,31,13},{30,29,221},{28,31,121},{27,31,4},{26,30,73},{29,30,221}, +{26,30,73},{28,31,106},{28,31,106},{28,31,106},{28,31,94},{27,31,100},{27,31,4},{27,31,4},{27,30,18},{25,31,72},{25,30,19},{28,31,25},{28,31,25},{28,31,25},{28,31,13},{31,26,50},{27,31,4},{27,31,4},{26,30,9},{29,29,50},{26,30,9},{31,29,61},{29,31,37},{29,31,1},{27,31,4},{31,29,61},{31,30,61},{27,31,4},{0,30,73},{31,30,61},{0,30,73},{28,0,90}, +{28,0,90},{28,0,90},{28,0,90},{27,31,0},{27,31,0},{27,31,0},{27,29,4},{25,31,8},{25,31,8},{29,31,239},{29,31,175},{29,31,139},{29,31,99},{29,31,239},{28,31,122},{28,31,41},{28,31,26},{28,31,233},{26,31,19},{30,31,54},{30,31,38},{30,31,29},{29,31,18},{30,31,93},{29,31,54},{29,31,18},{27,31,9},{31,30,93},{27,31,9},{29,31,139},{29,31,139},{29,31,139}, +{29,31,99},{29,31,139},{28,31,41},{28,31,41},{28,31,26},{27,31,116},{26,31,19},{30,31,29},{30,31,29},{30,31,29},{29,31,18},{30,30,50},{29,31,18},{29,31,18},{27,31,9},{30,30,50},{27,31,9},{31,30,9},{31,31,9},{30,31,4},{30,31,0},{31,30,9},{30,31,9},{30,31,0},{0,31,9},{30,31,9},{0,31,9},{29,0,90},{29,0,90},{29,0,90},{29,0,90},{28,31,5}, +{28,31,5},{28,31,5},{28,30,2},{26,31,10},{26,31,10},{30,31,140},{30,31,124},{30,31,115},{30,31,99},{30,31,131},{29,31,98},{29,31,62},{29,31,2},{29,31,122},{28,31,20},{31,31,25},{31,31,25},{31,31,25},{30,31,18},{31,30,22},{30,31,18},{30,31,9},{29,31,1},{30,31,22},{29,31,1},{30,31,115},{30,31,115},{30,31,115},{30,31,99},{30,31,106},{29,31,62},{29,31,62}, +{29,31,2},{29,31,86},{28,31,20},{31,31,25},{31,31,25},{31,31,25},{30,31,18},{31,30,13},{30,31,9},{30,31,9},{29,31,1},{30,31,13},{29,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{30,0,90},{30,0,90},{30,0,90},{30,0,90},{29,31,26},{29,31,26},{29,31,26},{29,31,2},{28,31,20}, +{28,31,20},{0,6,202},{0,5,52},{0,3,25},{0,3,61},{0,4,442},{0,3,313},{0,3,142},{0,2,318},{0,2,498},{0,2,354},{0,6,202},{0,5,52},{0,3,25},{0,3,61},{2,1,441},{0,3,313},{0,3,142},{0,2,318},{1,2,441},{0,2,318},{0,3,0},{0,3,0},{0,3,0},{0,2,1},{0,1,45},{0,1,25},{0,1,25},{0,1,26},{0,1,50},{0,1,35},{0,3,0}, +{0,3,0},{0,3,0},{0,2,1},{1,0,41},{0,1,25},{0,1,25},{0,1,26},{0,1,41},{0,1,26},{2,3,200},{0,5,52},{0,3,25},{0,3,61},{2,3,200},{3,2,200},{0,3,61},{0,2,218},{3,2,200},{0,2,218},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,9,200},{0,7,20},{0,5,20}, +{0,4,25},{0,6,686},{0,5,433},{0,4,169},{0,3,443},{0,3,794},{0,3,524},{0,9,200},{0,7,20},{0,5,20},{0,4,25},{3,1,686},{0,5,433},{0,4,169},{0,3,443},{6,0,686},{0,3,443},{0,6,1},{0,6,1},{0,6,1},{0,3,4},{0,3,145},{0,2,85},{0,2,85},{0,2,101},{0,1,178},{0,1,115},{0,6,1},{0,6,1},{0,6,1},{0,3,4},{1,1,145}, +{0,2,85},{0,2,85},{0,2,101},{3,0,145},{0,2,101},{3,4,200},{0,7,20},{1,4,16},{0,4,25},{3,4,200},{9,0,200},{0,4,25},{0,3,218},{9,0,200},{0,3,218},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,11,257},{0,9,54},{1,6,85},{0,5,65},{0,9,728},{0,6,371},{0,5,80}, +{0,4,377},{0,5,949},{0,4,521},{1,10,201},{1,8,18},{1,6,21},{1,5,26},{4,2,723},{0,6,371},{0,5,80},{0,4,377},{7,1,723},{0,4,377},{0,8,50},{0,8,50},{0,8,50},{0,5,49},{0,5,164},{0,4,50},{0,4,50},{0,3,65},{0,3,245},{0,2,126},{1,7,2},{1,7,2},{1,7,2},{1,4,5},{2,2,162},{0,4,50},{0,4,50},{0,3,65},{2,2,162}, +{0,3,65},{7,0,200},{0,9,5},{2,5,16},{0,5,16},{7,0,200},{10,1,200},{0,5,16},{0,4,208},{10,1,200},{0,4,208},{0,0,49},{0,0,49},{0,0,49},{0,0,49},{0,2,1},{0,2,1},{0,2,1},{0,1,4},{0,1,13},{0,1,13},{1,12,315},{1,10,118},{1,7,178},{1,6,129},{0,11,724},{0,8,289},{0,6,34},{0,5,308},{0,6,1087},{0,5,533},{2,11,201}, +{2,9,18},{2,7,21},{2,6,26},{5,3,723},{0,8,289},{0,6,34},{0,5,308},{8,2,723},{0,5,308},{1,9,114},{1,9,114},{1,9,114},{1,6,113},{0,8,162},{0,6,18},{0,6,18},{0,4,25},{0,4,338},{0,3,162},{2,8,2},{2,8,2},{2,8,2},{2,5,5},{3,3,162},{0,6,18},{0,6,18},{0,4,25},{8,0,162},{0,4,25},{6,4,200},{1,10,5},{3,6,16}, +{1,6,16},{6,4,200},{14,0,200},{1,6,16},{0,5,208},{14,0,200},{0,5,208},{1,0,113},{1,0,113},{1,0,113},{1,0,113},{0,5,0},{0,5,0},{0,5,0},{0,3,0},{0,2,61},{0,2,61},{2,14,410},{2,11,209},{2,8,288},{2,7,234},{0,14,739},{0,10,254},{0,8,33},{0,6,270},{0,8,1131},{0,6,450},{3,12,200},{3,10,13},{3,8,25},{3,7,29},{6,4,723}, +{0,10,238},{0,8,17},{0,6,254},{14,0,723},{0,6,254},{2,11,209},{2,11,209},{2,11,209},{2,7,209},{0,11,178},{0,8,17},{0,8,17},{0,5,18},{0,6,376},{0,5,123},{3,9,0},{3,9,0},{3,9,0},{3,7,4},{6,1,162},{0,8,1},{0,8,1},{0,5,2},{11,0,162},{0,5,2},{9,2,200},{2,11,1},{4,7,25},{0,8,17},{9,2,200},{17,0,200},{0,8,17}, +{0,6,218},{17,0,200},{0,6,218},{2,0,208},{2,0,208},{2,0,208},{2,0,208},{0,8,16},{0,8,16},{0,8,16},{1,4,17},{0,4,80},{0,4,80},{3,15,410},{3,12,212},{3,9,288},{3,8,224},{1,15,739},{1,11,254},{1,9,33},{1,7,270},{0,9,1013},{0,7,308},{4,13,201},{4,11,21},{4,9,21},{4,8,26},{10,0,723},{0,12,227},{1,9,17},{0,7,227},{15,1,723}, +{0,7,227},{3,11,212},{3,11,212},{3,11,212},{3,8,208},{2,10,180},{1,9,17},{1,9,17},{1,6,18},{0,8,306},{0,6,41},{4,10,2},{4,10,2},{4,10,2},{4,7,5},{8,0,162},{1,9,1},{1,9,1},{1,6,2},{5,5,162},{1,6,2},{10,3,200},{3,12,4},{5,8,16},{3,8,16},{10,3,200},{18,1,200},{3,8,16},{0,7,218},{18,1,200},{0,7,218},{3,0,208}, +{3,0,208},{3,0,208},{3,0,208},{1,9,16},{1,9,16},{1,9,16},{2,5,17},{0,6,40},{0,6,40},{4,15,426},{4,13,223},{4,10,283},{4,9,234},{2,16,739},{2,12,267},{2,10,33},{2,8,273},{0,11,913},{0,8,225},{5,14,201},{5,12,18},{5,10,21},{5,9,26},{11,1,723},{0,13,208},{2,10,17},{0,8,209},{16,2,723},{0,8,209},{4,12,219},{4,12,219},{4,12,219}, +{4,9,218},{3,11,180},{2,10,17},{2,10,17},{2,7,18},{0,9,229},{0,7,27},{5,11,2},{5,11,2},{5,11,2},{5,8,5},{9,1,162},{2,10,1},{2,10,1},{2,7,2},{16,0,162},{2,7,2},{11,4,200},{3,14,4},{6,9,16},{4,9,16},{11,4,200},{19,2,200},{4,9,16},{0,8,208},{19,2,200},{0,8,208},{4,0,218},{4,0,218},{4,0,218},{4,0,218},{2,10,16}, +{2,10,16},{2,10,16},{3,6,17},{0,8,17},{0,8,17},{5,16,420},{5,14,223},{5,11,283},{5,10,234},{3,17,739},{3,13,267},{3,11,33},{3,9,273},{0,13,868},{0,9,213},{6,15,201},{6,13,18},{6,11,21},{6,10,26},{12,2,723},{0,15,204},{3,11,17},{1,9,209},{22,0,723},{1,9,209},{5,13,219},{5,13,219},{5,13,219},{5,10,218},{3,14,180},{3,11,17},{3,11,17}, +{3,8,20},{0,11,189},{1,8,17},{6,12,2},{6,12,2},{6,12,2},{6,9,5},{10,2,162},{3,11,1},{3,11,1},{2,8,1},{17,1,162},{2,8,1},{15,0,200},{5,14,5},{7,10,16},{5,10,16},{15,0,200},{20,3,200},{5,10,16},{0,9,208},{20,3,200},{0,9,208},{5,0,218},{5,0,218},{5,0,218},{5,0,218},{3,11,16},{3,11,16},{3,11,16},{3,8,20},{0,9,5}, +{0,9,5},{6,18,410},{6,15,209},{6,12,288},{6,11,234},{4,18,739},{4,14,254},{4,12,33},{4,10,270},{0,15,804},{2,10,227},{7,16,200},{7,14,13},{7,12,25},{7,11,29},{15,0,723},{1,16,209},{4,12,17},{2,10,218},{20,3,723},{2,10,218},{6,15,209},{6,15,209},{6,15,209},{6,11,209},{4,15,178},{4,12,17},{4,12,17},{4,9,18},{0,13,171},{2,9,26},{7,13,0}, +{7,13,0},{7,13,0},{7,11,4},{13,0,162},{4,12,1},{4,12,1},{4,9,2},{20,1,162},{4,9,2},{16,1,200},{6,15,1},{8,11,25},{4,12,17},{16,1,200},{26,1,200},{4,12,17},{0,10,218},{26,1,200},{0,10,218},{6,0,208},{6,0,208},{6,0,208},{6,0,208},{4,12,16},{4,12,16},{4,12,16},{5,8,17},{1,11,5},{1,11,5},{7,19,410},{7,16,212},{7,13,288}, +{7,12,224},{5,19,739},{5,15,254},{5,13,33},{5,11,270},{0,16,747},{3,11,227},{8,17,201},{8,15,21},{8,13,21},{8,12,26},{14,4,723},{3,16,209},{5,13,17},{3,11,218},{24,2,723},{3,11,218},{7,15,212},{7,15,212},{7,15,212},{7,12,208},{6,14,180},{5,13,17},{5,13,17},{5,10,18},{1,14,171},{3,10,26},{8,14,2},{8,14,2},{8,14,2},{8,11,5},{14,1,162}, +{5,13,1},{5,13,1},{5,10,2},{24,0,162},{5,10,2},{17,2,200},{7,16,4},{9,12,16},{7,12,16},{17,2,200},{27,2,200},{7,12,16},{0,11,218},{27,2,200},{0,11,218},{7,0,208},{7,0,208},{7,0,208},{7,0,208},{5,13,16},{5,13,16},{5,13,16},{6,9,17},{2,12,8},{2,12,8},{8,19,426},{8,17,223},{8,14,283},{8,13,234},{6,20,739},{6,16,267},{6,14,33}, +{6,12,273},{0,18,727},{3,12,218},{9,18,201},{9,16,18},{9,14,21},{9,13,26},{18,0,723},{4,17,208},{6,14,17},{4,12,209},{30,0,723},{4,12,209},{8,16,219},{8,16,219},{8,16,219},{8,13,218},{7,15,180},{6,14,17},{6,14,17},{6,11,18},{2,15,171},{4,11,27},{9,15,2},{9,15,2},{9,15,2},{9,12,5},{16,0,162},{6,14,1},{6,14,1},{6,11,2},{25,1,162}, +{6,11,2},{18,3,200},{7,18,4},{10,13,16},{8,13,16},{18,3,200},{28,3,200},{8,13,16},{0,12,208},{28,3,200},{0,12,208},{8,0,218},{8,0,218},{8,0,218},{8,0,218},{6,14,16},{6,14,16},{6,14,16},{7,10,17},{3,13,8},{3,13,8},{9,20,420},{9,18,223},{9,15,283},{9,14,234},{7,21,739},{7,17,267},{7,15,33},{7,13,273},{1,19,727},{4,13,213},{10,19,201}, +{10,17,18},{10,15,21},{10,14,26},{19,1,723},{4,19,204},{7,15,17},{5,13,209},{31,1,723},{5,13,209},{9,17,219},{9,17,219},{9,17,219},{9,14,218},{7,18,180},{7,15,17},{7,15,17},{7,12,20},{3,16,173},{5,12,17},{10,16,2},{10,16,2},{10,16,2},{10,13,5},{17,1,162},{7,15,1},{7,15,1},{6,12,1},{26,2,162},{6,12,1},{20,2,200},{9,18,5},{11,14,16}, +{9,14,16},{20,2,200},{24,7,200},{9,14,16},{0,13,208},{24,7,200},{0,13,208},{9,0,218},{9,0,218},{9,0,218},{9,0,218},{7,15,16},{7,15,16},{7,15,16},{7,12,20},{4,13,5},{4,13,5},{10,22,410},{10,19,209},{10,16,288},{10,15,234},{8,22,739},{8,18,254},{8,16,33},{8,14,270},{2,20,724},{6,14,227},{11,20,200},{11,18,13},{11,16,25},{11,15,29},{20,2,723}, +{5,20,209},{8,16,17},{6,14,218},{24,7,723},{6,14,218},{10,19,209},{10,19,209},{10,19,209},{10,15,209},{8,19,178},{8,16,17},{8,16,17},{8,13,18},{3,18,170},{6,13,26},{11,17,0},{11,17,0},{11,17,0},{11,15,4},{17,4,162},{8,16,1},{8,16,1},{8,13,2},{29,2,162},{8,13,2},{23,0,200},{10,19,1},{12,15,25},{8,16,17},{23,0,200},{30,5,200},{8,16,17}, +{0,14,218},{30,5,200},{0,14,218},{10,0,208},{10,0,208},{10,0,208},{10,0,208},{8,16,16},{8,16,16},{8,16,16},{9,12,17},{5,15,5},{5,15,5},{11,23,410},{11,20,212},{11,17,288},{11,16,224},{9,23,739},{9,19,254},{9,17,33},{9,15,270},{3,21,724},{7,15,227},{12,21,201},{12,19,21},{12,17,21},{12,16,26},{21,3,723},{7,20,209},{9,17,17},{7,15,218},{28,6,723}, +{7,15,218},{11,19,212},{11,19,212},{11,19,212},{11,16,208},{10,18,180},{9,17,17},{9,17,17},{9,14,18},{5,18,171},{7,14,26},{12,18,2},{12,18,2},{12,18,2},{12,15,5},{18,5,162},{9,17,1},{9,17,1},{9,14,2},{30,3,162},{9,14,2},{24,1,200},{11,20,4},{13,16,16},{11,16,16},{24,1,200},{31,6,200},{11,16,16},{0,15,218},{31,6,200},{0,15,218},{11,0,208}, +{11,0,208},{11,0,208},{11,0,208},{9,17,16},{9,17,16},{9,17,16},{10,13,17},{6,16,8},{6,16,8},{12,23,426},{12,21,223},{12,18,283},{12,17,234},{10,24,739},{10,20,267},{10,18,33},{10,16,273},{4,22,727},{7,16,218},{13,22,201},{13,20,18},{13,18,21},{13,17,26},{22,4,723},{8,21,208},{10,18,17},{8,16,209},{29,7,723},{8,16,209},{12,20,219},{12,20,219},{12,20,219}, +{12,17,218},{11,19,180},{10,18,17},{10,18,17},{10,15,18},{6,19,171},{8,15,27},{13,19,2},{13,19,2},{13,19,2},{13,16,5},{20,4,162},{10,18,1},{10,18,1},{10,15,2},{29,5,162},{10,15,2},{25,2,200},{11,22,4},{14,17,16},{12,17,16},{25,2,200},{27,10,200},{12,17,16},{0,16,208},{27,10,200},{0,16,208},{12,0,218},{12,0,218},{12,0,218},{12,0,218},{10,18,16}, +{10,18,16},{10,18,16},{11,14,17},{7,17,8},{7,17,8},{13,24,420},{13,22,223},{13,19,283},{13,18,234},{11,25,739},{11,21,267},{11,19,33},{11,17,273},{5,23,727},{8,17,213},{14,23,201},{14,21,18},{14,19,21},{14,18,26},{26,0,723},{8,23,204},{11,19,17},{9,17,209},{30,8,723},{9,17,209},{13,21,219},{13,21,219},{13,21,219},{13,18,218},{11,22,180},{11,19,17},{11,19,17}, +{11,16,20},{7,20,173},{9,16,17},{14,20,2},{14,20,2},{14,20,2},{14,17,5},{24,0,162},{11,19,1},{11,19,1},{10,16,1},{30,6,162},{10,16,1},{26,3,200},{13,22,5},{15,18,16},{13,18,16},{26,3,200},{28,11,200},{13,18,16},{0,17,208},{28,11,200},{0,17,208},{13,0,218},{13,0,218},{13,0,218},{13,0,218},{11,19,16},{11,19,16},{11,19,16},{11,16,20},{8,17,5}, +{8,17,5},{14,26,410},{14,23,209},{14,20,288},{14,19,234},{12,26,739},{12,22,254},{12,20,33},{12,18,270},{6,24,724},{10,18,227},{15,24,200},{15,22,13},{15,20,25},{15,19,29},{26,3,723},{9,24,209},{12,20,17},{10,18,218},{28,11,723},{10,18,218},{14,23,209},{14,23,209},{14,23,209},{14,19,209},{12,23,178},{12,20,17},{12,20,17},{12,17,18},{7,22,170},{10,17,26},{15,21,0}, +{15,21,0},{15,21,0},{15,19,4},{24,3,162},{12,20,1},{12,20,1},{12,17,2},{28,9,162},{12,17,2},{27,4,200},{14,23,1},{16,19,25},{12,20,17},{27,4,200},{31,11,200},{12,20,17},{0,18,218},{31,11,200},{0,18,218},{14,0,208},{14,0,208},{14,0,208},{14,0,208},{12,20,16},{12,20,16},{12,20,16},{13,16,17},{9,19,5},{9,19,5},{15,27,410},{15,24,212},{15,21,288}, +{15,20,224},{13,27,739},{13,23,254},{13,21,33},{13,19,270},{7,25,724},{11,19,227},{16,25,201},{16,23,21},{16,21,21},{16,20,26},{28,2,723},{11,24,209},{13,21,17},{11,19,218},{27,13,723},{11,19,218},{15,23,212},{15,23,212},{15,23,212},{15,20,208},{14,22,180},{13,21,17},{13,21,17},{13,18,18},{9,22,171},{11,18,26},{16,22,2},{16,22,2},{16,22,2},{16,19,5},{22,9,162}, +{13,21,1},{13,21,1},{13,18,2},{29,10,162},{13,18,2},{31,0,200},{15,24,4},{17,20,16},{15,20,16},{31,0,200},{30,13,200},{15,20,16},{0,19,218},{30,13,200},{0,19,218},{15,0,208},{15,0,208},{15,0,208},{15,0,208},{13,21,16},{13,21,16},{13,21,16},{14,17,17},{10,20,8},{10,20,8},{16,27,426},{16,25,223},{16,22,283},{16,21,234},{14,28,739},{14,24,267},{14,22,33}, +{14,20,273},{8,26,727},{11,20,218},{17,26,201},{17,24,18},{17,22,21},{17,21,26},{29,3,723},{12,25,208},{14,22,17},{12,20,209},{28,14,723},{12,20,209},{16,24,219},{16,24,219},{16,24,219},{16,21,218},{15,23,180},{14,22,17},{14,22,17},{14,19,18},{10,23,171},{12,19,27},{17,23,2},{17,23,2},{17,23,2},{17,20,5},{24,8,162},{14,22,1},{14,22,1},{14,19,2},{30,11,162}, +{14,19,2},{29,6,200},{15,26,4},{18,21,16},{16,21,16},{29,6,200},{31,14,200},{16,21,16},{0,20,208},{31,14,200},{0,20,208},{16,0,218},{16,0,218},{16,0,218},{16,0,218},{14,22,16},{14,22,16},{14,22,16},{15,18,17},{11,21,8},{11,21,8},{17,28,420},{17,26,223},{17,23,283},{17,22,234},{15,29,739},{15,25,267},{15,23,33},{15,21,273},{9,27,727},{12,21,213},{18,27,201}, +{18,25,18},{18,23,21},{18,22,26},{30,4,723},{12,27,204},{15,23,17},{13,21,209},{29,15,723},{13,21,209},{17,25,219},{17,25,219},{17,25,219},{17,22,218},{15,26,180},{15,23,17},{15,23,17},{15,20,20},{11,24,173},{13,20,17},{18,24,2},{18,24,2},{18,24,2},{18,21,5},{28,4,162},{15,23,1},{15,23,1},{14,20,1},{29,13,162},{14,20,1},{30,7,200},{17,26,5},{19,22,16}, +{17,22,16},{30,7,200},{30,16,200},{17,22,16},{0,21,208},{30,16,200},{0,21,208},{17,0,218},{17,0,218},{17,0,218},{17,0,218},{15,23,16},{15,23,16},{15,23,16},{15,20,20},{12,21,5},{12,21,5},{18,30,410},{18,27,209},{18,24,288},{18,23,234},{16,30,739},{16,26,254},{16,24,33},{16,22,270},{10,28,724},{14,22,227},{19,28,200},{19,26,13},{19,24,25},{19,23,29},{30,7,723}, +{13,28,209},{16,24,17},{14,22,218},{30,16,723},{14,22,218},{18,27,209},{18,27,209},{18,27,209},{18,23,209},{16,27,178},{16,24,17},{16,24,17},{16,21,18},{11,26,170},{14,21,26},{19,25,0},{19,25,0},{19,25,0},{19,23,4},{31,2,162},{16,24,1},{16,24,1},{16,21,2},{27,16,162},{16,21,2},{31,8,200},{18,27,1},{20,23,25},{16,24,17},{31,8,200},{28,19,200},{16,24,17}, +{0,22,218},{28,19,200},{0,22,218},{18,0,208},{18,0,208},{18,0,208},{18,0,208},{16,24,16},{16,24,16},{16,24,16},{17,20,17},{13,23,5},{13,23,5},{19,31,410},{19,28,212},{19,25,288},{19,24,224},{17,31,739},{17,27,254},{17,25,33},{17,23,270},{11,29,724},{15,23,227},{20,29,201},{20,27,21},{20,25,21},{20,24,26},{29,11,723},{15,28,209},{17,25,17},{15,23,218},{31,17,723}, +{15,23,218},{19,27,212},{19,27,212},{19,27,212},{19,24,208},{18,26,180},{17,25,17},{17,25,17},{17,22,18},{13,26,171},{15,22,26},{20,26,2},{20,26,2},{20,26,2},{20,23,5},{26,13,162},{17,25,1},{17,25,1},{17,22,2},{21,21,162},{17,22,2},{29,14,200},{19,28,4},{21,24,16},{19,24,16},{29,14,200},{29,20,200},{19,24,16},{0,23,218},{29,20,200},{0,23,218},{19,0,208}, +{19,0,208},{19,0,208},{19,0,208},{17,25,16},{17,25,16},{17,25,16},{18,21,17},{14,24,8},{14,24,8},{20,31,426},{20,29,223},{20,26,283},{20,25,234},{19,30,740},{18,28,267},{18,26,33},{18,24,273},{12,30,727},{15,24,218},{21,30,201},{21,28,18},{21,26,21},{21,25,26},{30,12,723},{16,29,208},{18,26,17},{16,24,209},{27,21,723},{16,24,209},{20,28,219},{20,28,219},{20,28,219}, +{20,25,218},{19,27,180},{18,26,17},{18,26,17},{18,23,18},{14,27,171},{16,23,27},{21,27,2},{21,27,2},{21,27,2},{21,24,5},{28,12,162},{18,26,1},{18,26,1},{18,23,2},{22,22,162},{18,23,2},{30,15,200},{19,30,4},{22,25,16},{20,25,16},{30,15,200},{30,21,200},{20,25,16},{0,24,208},{30,21,200},{0,24,208},{20,0,218},{20,0,218},{20,0,218},{20,0,218},{18,26,16}, +{18,26,16},{18,26,16},{19,22,17},{15,25,8},{15,25,8},{21,31,468},{21,30,223},{21,27,283},{21,26,234},{20,31,749},{19,29,267},{19,27,33},{19,25,273},{13,31,727},{16,25,213},{22,31,201},{22,29,18},{22,27,21},{22,26,26},{31,13,723},{16,31,204},{19,27,17},{17,25,209},{28,22,723},{17,25,209},{21,29,219},{21,29,219},{21,29,219},{21,26,218},{19,30,180},{19,27,17},{19,27,17}, +{19,24,20},{15,28,173},{17,24,17},{22,28,2},{22,28,2},{22,28,2},{22,25,5},{29,13,162},{19,27,1},{19,27,1},{18,24,1},{28,20,162},{18,24,1},{31,16,200},{21,30,5},{23,26,16},{21,26,16},{31,16,200},{31,22,200},{21,26,16},{0,25,208},{31,22,200},{0,25,208},{21,0,218},{21,0,218},{21,0,218},{21,0,218},{19,27,16},{19,27,16},{19,27,16},{19,24,20},{16,25,5}, +{16,25,5},{22,31,570},{22,31,209},{22,28,288},{22,27,234},{21,31,804},{20,30,254},{20,28,33},{20,26,270},{15,31,753},{18,26,227},{23,31,232},{23,30,13},{23,28,25},{23,27,29},{31,16,723},{19,31,216},{20,28,17},{18,26,218},{31,22,723},{18,26,218},{22,31,209},{22,31,209},{22,31,209},{22,27,209},{20,31,178},{20,28,17},{20,28,17},{20,25,18},{15,30,170},{18,25,26},{23,29,0}, +{23,29,0},{23,29,0},{23,27,4},{29,16,162},{20,28,1},{20,28,1},{20,25,2},{31,20,162},{20,25,2},{31,19,200},{22,31,1},{24,27,25},{20,28,17},{31,19,200},{27,26,200},{20,28,17},{0,26,218},{27,26,200},{0,26,218},{22,0,208},{22,0,208},{22,0,208},{22,0,208},{20,28,16},{20,28,16},{20,28,16},{21,24,17},{17,27,5},{17,27,5},{23,31,696},{23,31,237},{23,29,288}, +{23,28,224},{23,31,888},{21,31,254},{21,29,33},{21,27,270},{17,31,824},{19,27,227},{24,31,273},{24,31,21},{24,29,21},{24,28,26},{30,20,723},{20,31,233},{21,29,17},{19,27,218},{30,24,723},{19,27,218},{23,31,212},{23,31,212},{23,31,212},{23,28,208},{22,30,180},{21,29,17},{21,29,17},{21,26,18},{17,30,171},{19,26,26},{24,30,2},{24,30,2},{24,30,2},{24,27,5},{30,17,162}, +{21,29,1},{21,29,1},{21,26,2},{25,25,162},{21,26,2},{30,23,200},{24,31,20},{25,28,16},{23,28,16},{30,23,200},{28,27,200},{23,28,16},{0,27,218},{28,27,200},{0,27,218},{23,0,208},{23,0,208},{23,0,208},{23,0,208},{21,29,16},{21,29,16},{21,29,16},{22,25,17},{18,28,8},{18,28,8},{25,31,804},{24,31,334},{24,30,283},{24,29,234},{24,31,957},{22,31,297},{22,30,33}, +{22,28,273},{20,31,913},{19,28,218},{26,31,313},{25,31,51},{25,30,21},{25,29,26},{31,21,723},{22,31,281},{22,30,17},{20,28,209},{31,25,723},{20,28,209},{24,31,234},{24,31,234},{24,31,234},{24,29,218},{23,31,180},{22,30,17},{22,30,17},{22,27,18},{18,31,171},{20,27,27},{25,31,2},{25,31,2},{25,31,2},{25,28,5},{31,18,162},{22,30,1},{22,30,1},{22,27,2},{26,26,162}, +{22,27,2},{31,24,200},{25,31,50},{26,29,16},{24,29,16},{31,24,200},{24,31,200},{24,29,16},{0,28,208},{24,31,200},{0,28,208},{24,0,218},{24,0,218},{24,0,218},{24,0,218},{22,30,16},{22,30,16},{22,30,16},{23,26,17},{19,29,8},{19,29,8},{26,31,930},{25,31,492},{25,31,283},{25,30,234},{25,31,1068},{24,31,389},{23,31,33},{23,29,273},{21,31,999},{20,29,213},{27,31,379}, +{26,31,149},{26,31,21},{26,30,26},{29,27,723},{24,31,364},{23,31,17},{21,29,209},{27,29,723},{21,29,209},{25,31,267},{25,31,267},{25,31,267},{25,30,218},{24,31,205},{23,31,17},{23,31,17},{23,28,20},{20,31,189},{21,28,17},{26,31,5},{26,31,5},{26,31,5},{26,29,5},{30,22,162},{23,31,1},{23,31,1},{22,28,1},{27,27,162},{22,28,1},{30,28,200},{27,31,90},{27,30,16}, +{25,30,16},{30,28,200},{28,30,200},{25,30,16},{0,29,208},{28,30,200},{0,29,208},{25,0,218},{25,0,218},{25,0,218},{25,0,218},{23,31,16},{23,31,16},{23,31,16},{23,28,20},{20,29,5},{20,29,5},{27,31,877},{26,31,585},{26,31,329},{26,31,209},{26,31,990},{25,31,397},{25,31,36},{24,30,165},{23,31,910},{22,30,122},{28,31,306},{28,31,162},{27,31,36},{27,31,4},{31,26,546}, +{26,31,306},{25,31,20},{22,30,113},{29,29,546},{22,30,113},{26,31,329},{26,31,329},{26,31,329},{26,31,209},{25,31,276},{25,31,36},{25,31,36},{24,29,18},{22,31,230},{22,29,26},{27,31,36},{27,31,36},{27,31,36},{27,31,4},{30,25,162},{25,31,20},{25,31,20},{24,29,2},{30,27,162},{24,29,2},{30,30,113},{29,31,61},{28,31,0},{26,31,1},{30,30,113},{30,30,113},{26,31,1}, +{0,30,113},{30,30,113},{0,30,113},{26,0,208},{26,0,208},{26,0,208},{26,0,208},{25,30,17},{25,30,17},{25,30,17},{25,28,17},{21,31,5},{21,31,5},{28,31,731},{27,31,573},{27,31,404},{27,31,244},{27,31,797},{26,31,354},{26,31,98},{25,30,82},{25,31,737},{23,31,58},{29,31,190},{29,31,126},{28,31,65},{28,31,5},{30,29,333},{28,31,185},{27,31,52},{23,31,49},{29,30,333}, +{23,31,49},{27,31,404},{27,31,404},{27,31,404},{27,31,244},{27,31,356},{26,31,98},{26,31,98},{25,30,18},{24,31,315},{23,30,26},{28,31,65},{28,31,65},{28,31,65},{28,31,5},{31,26,162},{27,31,52},{27,31,52},{25,30,2},{29,29,162},{25,30,2},{31,30,25},{30,31,13},{30,31,4},{29,31,1},{31,30,25},{30,31,25},{29,31,1},{0,31,49},{30,31,25},{0,31,49},{27,0,208}, +{27,0,208},{27,0,208},{27,0,208},{26,31,17},{26,31,17},{26,31,17},{26,29,17},{23,31,9},{23,31,9},{29,31,642},{28,31,524},{28,31,443},{28,31,299},{28,31,623},{28,31,335},{27,31,201},{26,31,17},{27,31,610},{24,31,26},{30,31,131},{30,31,115},{29,31,101},{29,31,37},{31,29,193},{29,31,121},{28,31,85},{26,31,1},{29,31,193},{26,31,1},{28,31,443},{28,31,443},{28,31,443}, +{28,31,299},{28,31,398},{27,31,201},{27,31,201},{26,31,17},{26,31,378},{24,31,26},{29,31,101},{29,31,101},{29,31,101},{29,31,37},{31,28,145},{28,31,85},{28,31,85},{26,31,1},{30,30,145},{26,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{28,0,218},{28,0,218},{28,0,218},{28,0,218},{27,31,32}, +{27,31,32},{27,31,32},{27,30,17},{24,31,26},{24,31,26},{29,31,418},{29,31,354},{29,31,318},{29,31,254},{29,31,370},{28,31,223},{28,31,142},{28,31,25},{28,31,358},{26,31,58},{30,31,51},{30,31,35},{30,31,26},{30,31,10},{31,30,54},{30,31,34},{30,31,25},{28,31,0},{30,31,54},{28,31,0},{29,31,318},{29,31,318},{29,31,318},{29,31,254},{29,31,270},{28,31,142},{28,31,142}, +{28,31,25},{27,31,249},{26,31,58},{30,31,26},{30,31,26},{30,31,26},{30,31,10},{30,31,41},{30,31,25},{30,31,25},{28,31,0},{31,30,41},{28,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{29,0,218},{29,0,218},{29,0,218},{29,0,218},{28,31,61},{28,31,61},{28,31,61},{28,31,25},{26,31,58}, +{26,31,58},{0,9,421},{0,7,113},{0,5,5},{0,4,130},{0,6,925},{0,5,658},{0,4,274},{0,3,670},{0,3,1039},{0,3,751},{0,9,421},{0,7,113},{0,5,5},{0,4,130},{3,1,925},{0,5,658},{0,4,274},{0,3,670},{6,0,925},{0,3,670},{0,4,1},{0,4,1},{0,4,1},{0,3,4},{0,2,85},{0,2,45},{0,2,45},{0,1,50},{0,1,98},{0,1,59},{0,4,1}, +{0,4,1},{0,4,1},{0,3,4},{0,2,85},{0,2,45},{0,2,45},{0,1,50},{2,0,85},{0,1,50},{5,1,421},{0,7,113},{0,5,5},{0,4,130},{5,1,421},{9,0,421},{0,4,130},{0,3,445},{9,0,421},{0,3,445},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,12,425},{0,9,52},{0,6,10}, +{0,6,82},{0,8,1261},{0,6,805},{0,5,322},{0,4,833},{0,4,1445},{0,4,977},{0,12,425},{0,9,52},{0,6,10},{0,6,82},{3,3,1261},{0,6,805},{0,5,322},{0,4,833},{8,0,1261},{0,4,833},{0,7,0},{0,7,0},{0,7,0},{0,4,1},{0,3,225},{0,3,117},{0,3,117},{0,2,125},{0,2,257},{0,2,161},{0,7,0},{0,7,0},{0,7,0},{0,4,1},{2,0,221}, +{0,3,117},{0,3,117},{0,2,125},{2,1,221},{0,2,125},{7,0,421},{0,9,52},{1,6,5},{0,6,82},{7,0,421},{10,1,421},{0,6,82},{0,4,433},{10,1,421},{0,4,433},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,14,430},{0,11,29},{0,7,74},{0,7,46},{0,10,1514},{0,8,874},{0,6,307}, +{0,5,917},{0,5,1814},{0,4,1074},{0,14,430},{0,11,29},{1,7,35},{0,7,46},{6,0,1514},{0,8,874},{0,6,307},{0,5,917},{10,0,1514},{0,5,917},{0,10,10},{0,10,10},{0,10,10},{0,6,10},{0,5,340},{0,5,160},{0,5,160},{0,3,169},{0,3,421},{0,3,250},{0,10,10},{0,10,10},{0,10,10},{0,6,10},{2,2,338},{0,5,160},{0,5,160},{0,3,169},{2,2,338}, +{0,3,169},{8,1,421},{0,11,20},{2,7,5},{0,7,37},{8,1,421},{14,0,421},{0,7,37},{0,5,433},{14,0,421},{0,5,433},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,1,0},{0,1,0},{0,1,0},{0,1,4},{0,0,9},{0,0,9},{1,15,494},{1,12,102},{1,8,137},{1,8,122},{0,12,1517},{0,9,737},{0,7,185},{0,6,794},{0,7,1982},{0,5,1062},{1,15,430}, +{1,12,38},{2,8,34},{1,8,58},{7,1,1514},{0,9,737},{0,7,185},{0,6,794},{11,1,1514},{0,6,794},{1,11,74},{1,11,74},{1,11,74},{1,7,74},{0,8,338},{0,6,98},{0,6,98},{0,4,97},{0,4,514},{0,4,241},{1,11,10},{1,11,10},{1,11,10},{1,7,10},{3,3,338},{0,6,98},{0,6,98},{0,4,97},{8,0,338},{0,4,97},{10,0,421},{0,13,9},{3,8,4}, +{0,8,16},{10,0,421},{17,0,421},{0,8,16},{0,6,433},{17,0,421},{0,6,433},{1,0,73},{1,0,73},{1,0,73},{1,0,73},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,2,37},{0,2,37},{1,18,629},{1,14,213},{2,9,354},{1,9,218},{0,15,1517},{0,11,630},{0,9,50},{0,7,670},{0,8,2198},{0,6,1109},{3,15,437},{2,13,41},{3,9,33},{2,9,53},{8,2,1514}, +{0,11,630},{0,9,50},{0,7,670},{12,2,1514},{0,7,670},{1,13,209},{1,13,209},{1,13,209},{1,8,212},{0,11,338},{0,8,41},{0,8,41},{0,5,50},{0,6,680},{0,5,275},{3,10,17},{3,10,17},{3,10,17},{2,8,17},{6,1,338},{0,8,41},{0,8,41},{0,5,50},{11,0,338},{0,5,50},{12,0,421},{0,15,1},{4,9,5},{0,9,1},{12,0,421},{20,0,421},{0,9,1}, +{0,7,445},{20,0,421},{0,7,445},{1,0,208},{1,0,208},{1,0,208},{1,0,208},{0,7,1},{0,7,1},{0,7,1},{0,4,0},{0,3,106},{0,3,106},{2,19,821},{2,15,405},{2,11,570},{2,10,410},{0,18,1514},{0,13,577},{0,10,14},{0,8,602},{0,10,2462},{0,7,1175},{3,17,441},{3,14,41},{4,10,35},{3,10,53},{9,3,1514},{0,13,577},{0,10,14},{0,8,602},{18,0,1514}, +{0,8,602},{2,14,401},{2,14,401},{2,14,401},{2,9,404},{0,13,340},{0,10,13},{0,10,13},{0,6,29},{0,7,851},{0,6,353},{3,13,17},{3,13,17},{3,13,17},{3,9,17},{8,0,338},{0,10,13},{0,10,13},{0,6,29},{5,5,338},{0,6,29},{13,1,421},{1,16,4},{5,10,5},{1,10,1},{13,1,421},{21,1,421},{1,10,1},{0,8,433},{21,1,421},{0,8,433},{2,0,400}, +{2,0,400},{2,0,400},{2,0,400},{0,9,1},{0,9,1},{0,9,1},{0,6,4},{0,4,208},{0,4,208},{3,20,854},{3,16,437},{3,12,597},{3,11,443},{1,19,1515},{0,15,570},{1,11,15},{0,9,582},{0,11,2337},{0,9,933},{4,18,430},{4,15,29},{5,11,35},{4,11,46},{10,4,1514},{0,15,521},{1,11,14},{0,9,533},{19,1,1514},{0,9,533},{3,15,434},{3,15,434},{3,15,434}, +{3,10,437},{1,14,341},{1,11,14},{1,11,14},{1,7,30},{0,8,755},{0,7,222},{4,14,10},{4,14,10},{4,14,10},{4,10,10},{9,1,338},{0,12,2},{0,12,2},{0,7,26},{16,0,338},{0,7,26},{15,0,421},{3,16,4},{6,11,5},{2,11,1},{15,0,421},{25,0,421},{2,11,1},{0,9,433},{25,0,421},{0,9,433},{3,0,433},{3,0,433},{3,0,433},{3,0,433},{1,10,2}, +{1,10,2},{1,10,2},{1,7,5},{0,6,157},{0,6,157},{4,21,866},{4,17,454},{4,13,609},{4,12,461},{2,20,1515},{1,16,570},{2,12,19},{1,10,582},{0,13,2214},{0,10,707},{5,19,430},{5,16,38},{6,12,34},{5,12,58},{14,0,1514},{0,16,458},{2,12,18},{0,10,482},{20,2,1514},{0,10,482},{4,16,445},{4,16,445},{4,16,445},{4,11,449},{2,15,341},{2,12,19},{2,12,19}, +{2,8,26},{0,10,635},{0,8,106},{5,15,10},{5,15,10},{5,15,10},{5,11,10},{10,2,338},{1,13,2},{1,13,2},{1,8,16},{17,1,338},{1,8,16},{16,1,421},{3,18,4},{7,12,4},{3,12,0},{16,1,421},{26,1,421},{3,12,0},{0,10,433},{26,1,421},{0,10,433},{4,0,445},{4,0,445},{4,0,445},{4,0,445},{2,11,2},{2,11,2},{2,11,2},{2,7,10},{0,8,90}, +{0,8,90},{5,22,854},{5,18,438},{5,14,603},{5,13,443},{3,21,1517},{3,16,554},{3,13,21},{3,11,589},{0,15,2046},{0,11,535},{7,19,437},{6,17,41},{7,13,33},{6,13,53},{14,3,1514},{0,18,429},{3,13,21},{0,11,454},{26,0,1514},{0,11,454},{5,17,434},{5,17,434},{5,17,434},{5,12,437},{3,17,340},{3,13,20},{3,13,20},{3,9,29},{0,12,557},{0,10,49},{7,14,17}, +{7,14,17},{7,14,17},{6,12,17},{13,0,338},{2,14,4},{2,14,4},{1,10,10},{20,1,338},{1,10,10},{17,2,421},{4,19,1},{8,13,5},{4,13,1},{17,2,421},{29,1,421},{4,13,1},{0,11,445},{29,1,421},{0,11,445},{5,0,433},{5,0,433},{5,0,433},{5,0,433},{3,12,1},{3,12,1},{3,12,1},{3,9,4},{0,10,40},{0,10,40},{6,23,854},{6,19,438},{6,15,603}, +{6,14,443},{4,22,1515},{3,18,566},{4,14,15},{3,12,578},{0,16,1911},{0,12,458},{7,21,441},{7,18,41},{8,14,35},{7,14,53},{16,2,1514},{0,20,425},{4,14,14},{0,12,433},{27,1,1514},{0,12,433},{6,18,434},{6,18,434},{6,18,434},{6,13,437},{4,17,341},{4,14,14},{4,14,14},{4,10,30},{0,14,477},{0,11,35},{7,17,17},{7,17,17},{7,17,17},{7,13,17},{14,1,338}, +{3,15,4},{3,15,4},{2,11,10},{24,0,338},{2,11,10},{18,3,421},{5,20,4},{9,14,5},{5,14,1},{18,3,421},{30,2,421},{5,14,1},{0,12,433},{30,2,421},{0,12,433},{6,0,433},{6,0,433},{6,0,433},{6,0,433},{4,13,2},{4,13,2},{4,13,2},{4,10,5},{0,12,25},{0,12,25},{7,24,854},{7,20,437},{7,16,597},{7,15,443},{5,23,1515},{4,19,570},{5,15,15}, +{4,13,582},{0,18,1787},{0,13,442},{8,22,430},{8,19,29},{9,15,35},{8,15,46},{17,3,1514},{2,20,425},{5,15,14},{1,13,433},{28,2,1514},{1,13,433},{7,19,434},{7,19,434},{7,19,434},{7,14,437},{5,18,341},{5,15,14},{5,15,14},{5,11,30},{0,16,419},{1,12,45},{8,18,10},{8,18,10},{8,18,10},{8,14,10},{16,0,338},{4,16,2},{4,16,2},{3,12,17},{25,1,338}, +{3,12,17},{20,2,421},{7,20,4},{10,15,5},{6,15,1},{20,2,421},{31,3,421},{6,15,1},{0,13,433},{31,3,421},{0,13,433},{7,0,433},{7,0,433},{7,0,433},{7,0,433},{5,14,2},{5,14,2},{5,14,2},{5,11,5},{0,13,9},{0,13,9},{8,25,866},{8,21,454},{8,17,609},{8,16,461},{6,24,1515},{5,20,570},{6,16,19},{5,14,582},{0,20,1686},{1,14,442},{9,23,430}, +{9,20,38},{10,16,34},{9,16,58},{18,4,1514},{3,21,425},{6,16,18},{2,14,433},{29,3,1514},{2,14,433},{8,20,445},{8,20,445},{8,20,445},{8,15,449},{6,19,341},{6,16,19},{6,16,19},{6,12,26},{0,17,372},{2,13,45},{9,19,10},{9,19,10},{9,19,10},{9,15,10},{17,1,338},{5,17,2},{5,17,2},{5,12,16},{26,2,338},{5,12,16},{23,0,421},{7,22,4},{11,16,4}, +{7,16,0},{23,0,421},{30,5,421},{7,16,0},{0,14,433},{30,5,421},{0,14,433},{8,0,445},{8,0,445},{8,0,445},{8,0,445},{6,15,2},{6,15,2},{6,15,2},{6,11,10},{0,15,5},{0,15,5},{9,26,854},{9,22,438},{9,18,603},{9,17,443},{7,25,1517},{7,20,554},{7,17,21},{7,15,589},{0,22,1614},{2,15,462},{11,23,437},{10,21,41},{11,17,33},{10,17,53},{22,0,1514}, +{3,23,422},{7,17,21},{3,15,446},{30,4,1514},{3,15,446},{9,21,434},{9,21,434},{9,21,434},{9,16,437},{7,21,340},{7,17,20},{7,17,20},{7,13,29},{0,19,347},{3,14,46},{11,18,17},{11,18,17},{11,18,17},{10,16,17},{17,4,338},{6,18,4},{6,18,4},{5,14,10},{29,2,338},{5,14,10},{24,1,421},{8,23,1},{12,17,5},{8,17,1},{24,1,421},{31,6,421},{8,17,1}, +{0,15,445},{31,6,421},{0,15,445},{9,0,433},{9,0,433},{9,0,433},{9,0,433},{7,16,1},{7,16,1},{7,16,1},{7,13,4},{2,16,8},{2,16,8},{10,27,854},{10,23,438},{10,19,603},{10,18,443},{8,26,1515},{7,22,566},{8,18,15},{7,16,578},{0,23,1566},{3,16,443},{11,25,441},{11,22,41},{12,18,35},{11,18,53},{23,1,1514},{4,24,425},{8,18,14},{4,16,433},{31,5,1514}, +{4,16,433},{10,22,434},{10,22,434},{10,22,434},{10,17,437},{8,21,341},{8,18,14},{8,18,14},{8,14,30},{1,20,341},{4,15,35},{11,21,17},{11,21,17},{11,21,17},{11,17,17},{18,5,338},{7,19,4},{7,19,4},{6,15,10},{30,3,338},{6,15,10},{25,2,421},{9,24,4},{13,18,5},{9,18,1},{25,2,421},{29,9,421},{9,18,1},{0,16,433},{29,9,421},{0,16,433},{10,0,433}, +{10,0,433},{10,0,433},{10,0,433},{8,17,2},{8,17,2},{8,17,2},{8,14,5},{3,17,8},{3,17,8},{11,28,854},{11,24,437},{11,20,597},{11,19,443},{9,27,1515},{8,23,570},{9,19,15},{8,17,582},{0,25,1533},{4,17,442},{12,26,430},{12,23,29},{13,19,35},{12,19,46},{24,2,1514},{6,24,425},{9,19,14},{5,17,433},{27,9,1514},{5,17,433},{11,23,434},{11,23,434},{11,23,434}, +{11,18,437},{9,22,341},{9,19,14},{9,19,14},{9,15,30},{2,21,341},{5,16,45},{12,22,10},{12,22,10},{12,22,10},{12,18,10},{20,4,338},{8,20,2},{8,20,2},{7,16,17},{29,5,338},{7,16,17},{26,3,421},{11,24,4},{14,19,5},{10,19,1},{26,3,421},{30,10,421},{10,19,1},{0,17,433},{30,10,421},{0,17,433},{11,0,433},{11,0,433},{11,0,433},{11,0,433},{9,18,2}, +{9,18,2},{9,18,2},{9,15,5},{4,17,9},{4,17,9},{12,29,866},{12,25,454},{12,21,609},{12,20,461},{10,28,1515},{9,24,570},{10,20,19},{9,18,582},{0,27,1521},{5,18,442},{13,27,430},{13,24,38},{14,20,34},{13,20,58},{25,3,1514},{7,25,425},{10,20,18},{6,18,433},{28,10,1514},{6,18,433},{12,24,445},{12,24,445},{12,24,445},{12,19,449},{10,23,341},{10,20,19},{10,20,19}, +{10,16,26},{3,22,341},{6,17,45},{13,23,10},{13,23,10},{13,23,10},{13,19,10},{24,0,338},{9,21,2},{9,21,2},{9,16,16},{30,6,338},{9,16,16},{28,2,421},{11,26,4},{15,20,4},{11,20,0},{28,2,421},{31,11,421},{11,20,0},{0,18,433},{31,11,421},{0,18,433},{12,0,445},{12,0,445},{12,0,445},{12,0,445},{10,19,2},{10,19,2},{10,19,2},{10,15,10},{4,19,5}, +{4,19,5},{13,30,854},{13,26,438},{13,22,603},{13,21,443},{11,29,1517},{11,24,554},{11,21,21},{11,19,589},{1,28,1518},{6,19,462},{15,27,437},{14,25,41},{15,21,33},{14,21,53},{26,4,1514},{7,27,422},{11,21,21},{7,19,446},{31,10,1514},{7,19,446},{13,25,434},{13,25,434},{13,25,434},{13,20,437},{11,25,340},{11,21,20},{11,21,20},{11,17,29},{3,24,339},{7,18,46},{15,22,17}, +{15,22,17},{15,22,17},{14,20,17},{24,3,338},{10,22,4},{10,22,4},{9,18,10},{28,9,338},{9,18,10},{31,0,421},{12,27,1},{16,21,5},{12,21,1},{31,0,421},{30,13,421},{12,21,1},{0,19,445},{30,13,421},{0,19,445},{13,0,433},{13,0,433},{13,0,433},{13,0,433},{11,20,1},{11,20,1},{11,20,1},{11,17,4},{6,20,8},{6,20,8},{14,31,854},{14,27,438},{14,23,603}, +{14,22,443},{12,30,1515},{11,26,566},{12,22,15},{11,20,578},{2,29,1518},{7,20,443},{15,29,441},{15,26,41},{16,22,35},{15,22,53},{30,0,1514},{8,28,425},{12,22,14},{8,20,433},{30,12,1514},{8,20,433},{14,26,434},{14,26,434},{14,26,434},{14,21,437},{12,25,341},{12,22,14},{12,22,14},{12,18,30},{5,24,341},{8,19,35},{15,25,17},{15,25,17},{15,25,17},{15,21,17},{22,9,338}, +{11,23,4},{11,23,4},{10,19,10},{29,10,338},{10,19,10},{31,3,421},{13,28,4},{17,22,5},{13,22,1},{31,3,421},{31,14,421},{13,22,1},{0,20,433},{31,14,421},{0,20,433},{14,0,433},{14,0,433},{14,0,433},{14,0,433},{12,21,2},{12,21,2},{12,21,2},{12,18,5},{7,21,8},{7,21,8},{15,31,878},{15,28,437},{15,24,597},{15,23,443},{13,31,1515},{12,27,570},{13,23,15}, +{12,21,582},{3,30,1518},{8,21,442},{16,30,430},{16,27,29},{17,23,35},{16,23,46},{31,1,1514},{10,28,425},{13,23,14},{9,21,433},{31,13,1514},{9,21,433},{15,27,434},{15,27,434},{15,27,434},{15,22,437},{13,26,341},{13,23,14},{13,23,14},{13,19,30},{6,25,341},{9,20,45},{16,26,10},{16,26,10},{16,26,10},{16,22,10},{24,8,338},{12,24,2},{12,24,2},{11,20,17},{30,11,338}, +{11,20,17},{30,7,421},{15,28,4},{18,23,5},{14,23,1},{30,7,421},{30,16,421},{14,23,1},{0,21,433},{30,16,421},{0,21,433},{15,0,433},{15,0,433},{15,0,433},{15,0,433},{13,22,2},{13,22,2},{13,22,2},{13,19,5},{8,21,9},{8,21,9},{16,31,926},{16,29,454},{16,25,609},{16,24,461},{14,31,1542},{13,28,570},{14,24,19},{13,22,582},{4,31,1521},{9,22,442},{17,31,430}, +{17,28,38},{18,24,34},{17,24,58},{29,7,1514},{11,29,425},{14,24,18},{10,22,433},{27,17,1514},{10,22,433},{16,28,445},{16,28,445},{16,28,445},{16,23,449},{14,27,341},{14,24,19},{14,24,19},{14,20,26},{7,26,341},{10,21,45},{17,27,10},{17,27,10},{17,27,10},{17,23,10},{28,4,338},{13,25,2},{13,25,2},{13,20,16},{29,13,338},{13,20,16},{31,8,421},{15,30,4},{19,24,4}, +{15,24,0},{31,8,421},{31,17,421},{15,24,0},{0,22,433},{31,17,421},{0,22,433},{16,0,445},{16,0,445},{16,0,445},{16,0,445},{14,23,2},{14,23,2},{14,23,2},{14,19,10},{8,23,5},{8,23,5},{17,31,1034},{17,30,438},{17,26,603},{17,25,443},{16,31,1598},{15,28,554},{15,25,21},{15,23,589},{6,31,1535},{10,23,462},{19,31,437},{18,29,41},{19,25,33},{18,25,53},{30,8,1514}, +{11,31,422},{15,25,21},{11,23,446},{28,18,1514},{11,23,446},{17,29,434},{17,29,434},{17,29,434},{17,24,437},{15,29,340},{15,25,20},{15,25,20},{15,21,29},{7,28,339},{11,22,46},{19,26,17},{19,26,17},{19,26,17},{18,24,17},{31,2,338},{14,26,4},{14,26,4},{13,22,10},{27,16,338},{13,22,10},{31,11,421},{16,31,1},{20,25,5},{16,25,1},{31,11,421},{31,19,421},{16,25,1}, +{0,23,445},{31,19,421},{0,23,445},{17,0,433},{17,0,433},{17,0,433},{17,0,433},{15,24,1},{15,24,1},{15,24,1},{15,21,4},{10,24,8},{10,24,8},{18,31,1166},{18,31,438},{18,27,603},{18,26,443},{17,31,1643},{15,30,566},{16,26,15},{15,24,578},{8,31,1566},{11,24,443},{20,31,458},{19,30,41},{20,26,35},{19,26,53},{31,9,1514},{13,31,429},{16,26,14},{12,24,433},{29,19,1514}, +{12,24,433},{18,30,434},{18,30,434},{18,30,434},{18,25,437},{16,29,341},{16,26,14},{16,26,14},{16,22,30},{9,28,341},{12,23,35},{19,29,17},{19,29,17},{19,29,17},{19,25,17},{26,13,338},{15,27,4},{15,27,4},{14,23,10},{21,21,338},{14,23,10},{30,15,421},{18,31,5},{21,26,5},{17,26,1},{30,15,421},{30,21,421},{17,26,1},{0,24,433},{30,21,421},{0,24,433},{18,0,433}, +{18,0,433},{18,0,433},{18,0,433},{16,25,2},{16,25,2},{16,25,2},{16,22,5},{11,25,8},{11,25,8},{20,31,1326},{19,31,470},{19,28,597},{19,27,443},{18,31,1742},{16,31,570},{17,27,15},{16,25,582},{10,31,1638},{12,25,442},{21,31,506},{20,31,29},{21,27,35},{20,27,46},{29,15,1514},{15,31,461},{17,27,14},{13,25,433},{30,20,1514},{13,25,433},{19,31,434},{19,31,434},{19,31,434}, +{19,26,437},{17,30,341},{17,27,14},{17,27,14},{17,23,30},{10,29,341},{13,24,45},{20,30,10},{20,30,10},{20,30,10},{20,26,10},{28,12,338},{16,28,2},{16,28,2},{15,24,17},{22,22,338},{15,24,17},{31,16,421},{20,31,20},{22,27,5},{18,27,1},{31,16,421},{31,22,421},{18,27,1},{0,25,433},{31,22,421},{0,25,433},{19,0,433},{19,0,433},{19,0,433},{19,0,433},{17,26,2}, +{17,26,2},{17,26,2},{17,23,5},{12,25,9},{12,25,9},{21,31,1470},{20,31,561},{20,29,609},{20,28,461},{19,31,1895},{18,31,578},{18,28,19},{17,26,582},{12,31,1761},{13,26,442},{22,31,590},{21,31,59},{22,28,34},{21,28,58},{30,16,1514},{17,31,530},{18,28,18},{14,26,433},{31,21,1514},{14,26,433},{20,31,461},{20,31,461},{20,31,461},{20,27,449},{18,31,341},{18,28,19},{18,28,19}, +{18,24,26},{11,30,341},{14,25,45},{21,31,10},{21,31,10},{21,31,10},{21,27,10},{29,13,338},{17,29,2},{17,29,2},{17,24,16},{28,20,338},{17,24,16},{31,19,421},{21,31,50},{23,28,4},{19,28,0},{31,19,421},{30,24,421},{19,28,0},{0,26,433},{30,24,421},{0,26,433},{20,0,445},{20,0,445},{20,0,445},{20,0,445},{18,27,2},{18,27,2},{18,27,2},{18,23,10},{12,27,5}, +{12,27,5},{22,31,1674},{21,31,753},{21,30,603},{21,29,443},{21,31,2046},{19,31,629},{19,29,21},{19,27,589},{15,31,1917},{14,27,462},{24,31,674},{23,31,120},{23,29,33},{22,29,53},{30,19,1514},{19,31,629},{19,29,21},{15,27,446},{27,25,1514},{15,27,446},{21,31,497},{21,31,497},{21,31,497},{21,28,437},{19,31,388},{19,29,20},{19,29,20},{19,25,29},{12,31,347},{15,26,46},{23,30,17}, +{23,30,17},{23,30,17},{22,28,17},{29,16,338},{18,30,4},{18,30,4},{17,26,10},{31,20,338},{17,26,10},{30,23,421},{23,31,104},{24,29,5},{20,29,1},{30,23,421},{30,26,421},{20,29,1},{0,27,445},{30,26,421},{0,27,445},{21,0,433},{21,0,433},{21,0,433},{21,0,433},{19,28,1},{19,28,1},{19,28,1},{19,25,4},{14,28,8},{14,28,8},{23,31,1902},{22,31,995},{22,31,603}, +{22,30,443},{22,31,2235},{20,31,759},{20,30,15},{19,28,578},{17,31,2118},{15,28,443},{25,31,770},{24,31,250},{24,30,35},{23,30,53},{29,23,1514},{21,31,701},{20,30,14},{16,28,433},{28,26,1514},{16,28,433},{22,31,554},{22,31,554},{22,31,554},{22,29,437},{21,31,437},{20,30,14},{20,30,14},{20,26,30},{14,31,379},{16,27,35},{24,31,25},{24,31,25},{24,31,25},{23,29,17},{30,17,338}, +{19,31,4},{19,31,4},{18,27,10},{25,25,338},{18,27,10},{31,24,421},{25,31,169},{25,30,5},{21,30,1},{31,24,421},{31,27,421},{21,30,1},{0,28,433},{31,27,421},{0,28,433},{22,0,433},{22,0,433},{22,0,433},{22,0,433},{20,29,2},{20,29,2},{20,29,2},{20,26,5},{15,29,8},{15,29,8},{24,31,2045},{24,31,1233},{23,31,629},{23,31,442},{24,31,2360},{22,31,914},{21,31,14}, +{20,29,549},{19,31,2241},{16,29,409},{26,31,849},{25,31,395},{25,31,34},{24,31,45},{30,24,1459},{23,31,778},{21,31,13},{17,29,400},{29,27,1459},{17,29,400},{23,31,629},{23,31,629},{23,31,629},{23,30,437},{22,31,491},{21,31,14},{21,31,14},{21,27,30},{16,31,446},{17,28,45},{25,31,34},{25,31,34},{25,31,34},{24,30,10},{31,18,338},{21,31,13},{21,31,13},{19,28,17},{26,26,338}, +{19,28,17},{30,28,392},{27,31,218},{26,31,4},{22,31,0},{30,28,392},{28,30,392},{22,31,0},{0,29,400},{28,30,392},{0,29,400},{23,0,433},{23,0,433},{23,0,433},{23,0,433},{21,30,2},{21,30,2},{21,30,2},{21,27,5},{16,29,9},{16,29,9},{25,31,1767},{25,31,1167},{24,31,701},{24,31,449},{24,31,1976},{23,31,747},{22,31,66},{22,29,337},{20,31,1820},{17,30,217},{27,31,611}, +{26,31,317},{26,31,61},{25,31,10},{31,24,1064},{25,31,587},{23,31,41},{18,30,208},{24,31,1064},{18,30,208},{24,31,701},{24,31,701},{24,31,701},{24,31,449},{23,31,581},{22,31,66},{22,31,66},{22,28,26},{18,31,530},{18,29,45},{26,31,61},{26,31,61},{26,31,61},{25,31,10},{30,22,338},{23,31,41},{23,31,41},{21,28,16},{27,27,338},{21,28,16},{29,31,200},{28,31,106},{27,31,1}, +{25,31,1},{29,31,200},{31,29,200},{25,31,1},{0,30,208},{31,29,200},{0,30,208},{24,0,445},{24,0,445},{24,0,445},{24,0,445},{22,31,2},{22,31,2},{22,31,2},{22,27,10},{16,31,5},{16,31,5},{26,31,1542},{26,31,1122},{25,31,833},{25,31,497},{26,31,1647},{24,31,687},{24,31,203},{23,30,122},{22,31,1515},{19,30,110},{28,31,410},{28,31,266},{27,31,116},{27,31,20},{31,26,722}, +{26,31,402},{25,31,100},{21,30,74},{29,29,722},{21,30,74},{25,31,833},{25,31,833},{25,31,833},{25,31,497},{24,31,707},{24,31,203},{24,31,203},{23,29,29},{20,31,619},{19,30,46},{27,31,116},{27,31,116},{27,31,116},{27,31,20},{30,25,338},{25,31,100},{25,31,100},{21,30,10},{30,27,338},{21,30,10},{31,29,61},{29,31,37},{29,31,1},{27,31,4},{31,29,61},{31,30,61},{27,31,4}, +{0,30,73},{31,30,61},{0,30,73},{25,0,433},{25,0,433},{25,0,433},{25,0,433},{23,31,25},{23,31,25},{23,31,25},{23,29,4},{18,31,17},{18,31,17},{27,31,1406},{27,31,1134},{26,31,962},{26,31,602},{27,31,1454},{25,31,702},{25,31,341},{24,31,59},{24,31,1378},{20,31,35},{29,31,318},{28,31,250},{28,31,169},{28,31,61},{30,29,509},{28,31,313},{27,31,164},{22,31,10},{29,30,509}, +{22,31,10},{26,31,962},{26,31,962},{26,31,962},{26,31,602},{26,31,827},{25,31,341},{25,31,341},{24,30,30},{22,31,747},{20,31,35},{28,31,169},{28,31,169},{28,31,169},{28,31,61},{31,26,338},{27,31,164},{27,31,164},{22,31,10},{29,29,338},{22,31,10},{31,30,9},{31,31,9},{30,31,4},{30,31,0},{31,30,9},{30,31,9},{30,31,0},{0,31,9},{30,31,9},{0,31,9},{26,0,433}, +{26,0,433},{26,0,433},{26,0,433},{24,31,50},{24,31,50},{24,31,50},{24,30,5},{20,31,26},{20,31,26},{28,31,1135},{28,31,991},{27,31,874},{27,31,602},{28,31,1162},{26,31,618},{26,31,362},{25,31,5},{25,31,1087},{22,31,58},{30,31,219},{29,31,161},{29,31,125},{29,31,61},{31,29,297},{29,31,193},{28,31,117},{24,31,1},{30,30,297},{24,31,1},{27,31,874},{27,31,874},{27,31,874}, +{27,31,602},{27,31,730},{26,31,362},{26,31,362},{25,31,5},{24,31,681},{22,31,58},{29,31,125},{29,31,125},{29,31,125},{29,31,61},{30,29,221},{28,31,117},{28,31,117},{24,31,1},{31,29,221},{24,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{27,0,433},{27,0,433},{27,0,433},{27,0,433},{25,31,101}, +{25,31,101},{25,31,101},{25,31,5},{22,31,58},{22,31,58},{29,31,885},{28,31,751},{28,31,670},{28,31,526},{28,31,778},{27,31,483},{27,31,314},{26,31,10},{26,31,777},{24,31,117},{30,31,75},{30,31,59},{30,31,50},{30,31,34},{30,31,114},{29,31,81},{29,31,45},{27,31,0},{31,30,114},{27,31,0},{28,31,670},{28,31,670},{28,31,670},{28,31,526},{28,31,553},{27,31,314},{27,31,314}, +{26,31,10},{25,31,518},{24,31,117},{30,31,50},{30,31,50},{30,31,50},{30,31,34},{31,29,85},{29,31,45},{29,31,45},{27,31,0},{29,31,85},{27,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{28,0,445},{28,0,445},{28,0,445},{28,0,445},{27,31,145},{27,31,145},{27,31,145},{26,31,10},{24,31,117}, +{24,31,117},{0,13,884},{0,10,225},{0,7,18},{0,6,265},{0,9,1899},{0,7,1355},{0,6,589},{0,4,1354},{0,5,2124},{0,4,1498},{0,13,884},{0,10,225},{0,7,18},{0,6,265},{4,2,1896},{0,7,1355},{0,6,589},{0,4,1354},{7,1,1896},{0,4,1354},{0,6,0},{0,6,0},{0,6,0},{0,4,4},{0,3,162},{0,3,90},{0,3,90},{0,2,104},{0,2,200},{0,1,134},{0,6,0}, +{0,6,0},{0,6,0},{0,4,4},{0,3,162},{0,3,90},{0,3,90},{0,2,104},{3,0,162},{0,2,104},{6,3,882},{0,10,225},{0,7,18},{0,6,265},{6,3,882},{8,3,882},{0,6,265},{0,5,890},{8,3,882},{0,5,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,15,884},{0,12,170},{0,8,8}, +{0,7,202},{0,10,2360},{0,8,1530},{0,7,643},{0,5,1579},{0,6,2684},{0,5,1804},{0,15,884},{0,12,170},{0,8,8},{0,7,202},{5,2,2355},{0,8,1530},{0,7,643},{0,5,1579},{7,2,2355},{0,5,1579},{0,9,1},{0,9,1},{0,9,1},{0,5,1},{0,4,340},{0,4,180},{0,4,180},{0,2,200},{0,2,392},{0,2,236},{0,9,1},{0,9,1},{0,9,1},{0,5,1},{2,1,338}, +{0,4,180},{0,4,180},{0,2,200},{1,2,338},{0,2,200},{8,2,882},{0,12,170},{0,8,8},{0,7,202},{8,2,882},{12,2,882},{0,7,202},{0,6,890},{12,2,882},{0,6,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,18,882},{0,14,106},{0,10,52},{0,9,148},{0,12,2899},{0,9,1773},{0,8,725}, +{0,6,1854},{0,7,3348},{0,5,2124},{0,18,882},{0,14,106},{0,10,52},{0,9,148},{2,9,2899},{0,9,1773},{0,8,725},{0,6,1854},{12,0,2899},{0,6,1854},{0,11,1},{0,11,1},{0,11,1},{0,7,1},{0,6,580},{0,5,306},{0,5,306},{0,3,325},{0,3,667},{0,3,406},{0,11,1},{0,11,1},{0,11,1},{0,7,1},{1,4,578},{0,5,306},{0,5,306},{0,3,325},{4,1,578}, +{0,3,325},{9,3,882},{0,14,106},{1,9,8},{0,9,148},{9,3,882},{18,0,882},{0,9,148},{0,7,890},{18,0,882},{0,7,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,21,920},{0,16,89},{1,11,120},{0,10,121},{0,14,3051},{0,11,1709},{0,9,557},{0,7,1795},{0,8,3651},{0,6,2174},{1,19,886}, +{0,16,89},{1,11,56},{0,10,121},{8,1,3048},{0,11,1709},{0,9,557},{0,7,1795},{6,5,3048},{0,7,1795},{0,14,37},{0,14,37},{0,14,37},{0,8,37},{0,8,648},{0,7,274},{0,7,274},{0,4,277},{0,4,824},{0,4,421},{1,12,4},{1,12,4},{1,12,4},{1,8,8},{3,3,648},{0,7,274},{0,7,274},{0,4,277},{8,0,648},{0,4,277},{10,4,882},{0,16,53},{2,10,8}, +{0,10,85},{10,4,882},{19,1,882},{0,10,85},{0,8,900},{19,1,882},{0,8,900},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,2,0},{0,2,0},{0,2,0},{0,1,1},{0,1,10},{0,1,10},{1,22,995},{1,17,158},{1,12,230},{1,11,186},{0,17,3051},{0,13,1579},{0,10,346},{0,8,1630},{0,9,3924},{0,7,2173},{2,20,885},{2,16,90},{2,12,53},{1,11,122},{8,4,3048}, +{0,13,1579},{0,10,346},{0,8,1630},{14,2,3048},{0,8,1630},{1,15,113},{1,15,113},{1,15,113},{1,9,117},{0,11,648},{0,9,169},{0,9,169},{0,5,200},{0,6,990},{0,5,425},{2,13,2},{2,13,2},{2,13,2},{2,9,2},{6,1,648},{0,9,169},{0,9,169},{0,5,200},{11,0,648},{0,5,200},{13,2,882},{0,18,17},{3,11,18},{0,11,34},{13,2,882},{22,1,882},{0,11,34}, +{0,9,890},{22,1,882},{0,9,890},{1,0,113},{1,0,113},{1,0,113},{1,0,113},{0,5,0},{0,5,0},{0,5,0},{0,3,0},{0,2,61},{0,2,61},{1,24,1173},{1,19,306},{2,13,422},{1,12,318},{0,20,3048},{0,15,1443},{0,12,204},{0,9,1483},{0,11,4212},{0,8,2174},{3,21,885},{3,17,90},{3,13,53},{2,12,117},{12,0,3048},{0,15,1443},{0,12,204},{0,9,1483},{20,0,3048}, +{0,9,1483},{1,18,290},{1,18,290},{1,18,290},{1,11,289},{0,13,650},{0,11,109},{0,11,109},{0,7,148},{0,7,1161},{0,6,473},{3,14,2},{3,14,2},{3,14,2},{3,10,2},{8,0,648},{0,11,109},{0,11,109},{0,7,148},{5,5,648},{0,7,148},{14,3,882},{0,20,8},{4,12,8},{0,12,8},{14,3,882},{26,0,882},{0,12,8},{0,10,890},{26,0,882},{0,10,890},{1,0,289}, +{1,0,289},{1,0,289},{1,0,289},{0,8,1},{0,8,1},{0,8,1},{0,5,4},{0,3,145},{0,3,145},{2,25,1365},{2,20,497},{2,14,713},{2,13,510},{0,23,3051},{0,16,1278},{0,13,86},{0,10,1354},{0,12,4609},{0,9,2228},{4,22,886},{3,19,94},{4,14,56},{3,13,117},{13,1,3048},{0,16,1278},{0,13,86},{0,10,1354},{21,1,3048},{0,10,1354},{2,19,482},{2,19,482},{2,19,482}, +{2,12,481},{0,16,648},{0,12,72},{0,12,72},{0,8,101},{0,8,1352},{0,7,557},{4,15,5},{4,15,5},{4,15,5},{4,11,5},{9,1,648},{0,12,72},{0,12,72},{0,8,101},{16,0,648},{0,8,101},{16,2,882},{1,21,8},{5,13,8},{0,13,5},{16,2,882},{27,1,882},{0,13,5},{0,11,890},{27,1,882},{0,11,890},{2,0,481},{2,0,481},{2,0,481},{2,0,481},{0,10,1}, +{0,10,1},{0,10,1},{0,6,1},{0,5,261},{0,5,261},{2,28,1667},{2,22,793},{3,15,1033},{2,14,793},{0,25,3048},{0,18,1170},{0,14,36},{0,11,1243},{0,14,5005},{0,10,2318},{5,23,886},{4,20,89},{5,15,56},{4,14,121},{14,2,3048},{0,18,1170},{0,14,36},{0,11,1243},{25,0,3048},{0,11,1243},{2,21,786},{2,21,786},{2,21,786},{2,14,789},{0,19,650},{0,14,32},{0,14,32}, +{0,9,50},{0,9,1619},{0,8,661},{5,16,4},{5,16,4},{5,16,4},{5,12,8},{10,2,648},{0,14,32},{0,14,32},{0,9,50},{17,1,648},{0,9,50},{17,3,882},{2,22,8},{6,14,8},{1,14,5},{17,3,882},{28,2,882},{1,14,5},{0,12,900},{28,2,882},{0,12,900},{2,0,785},{2,0,785},{2,0,785},{2,0,785},{0,13,1},{0,13,1},{0,13,1},{0,8,4},{0,6,405}, +{0,6,405},{3,29,1784},{3,23,902},{4,16,1186},{3,15,910},{1,26,3055},{0,20,1095},{1,15,47},{0,12,1159},{0,16,4945},{0,12,2084},{6,24,885},{6,20,90},{6,16,53},{5,15,122},{12,8,3048},{0,20,1059},{0,16,41},{0,12,1123},{28,0,3048},{0,12,1123},{3,23,901},{3,23,901},{3,23,901},{3,15,901},{1,20,652},{1,15,38},{1,15,38},{1,10,44},{0,11,1577},{0,9,545},{6,17,2}, +{6,17,2},{6,17,2},{6,13,2},{13,0,648},{0,16,5},{0,16,5},{0,10,13},{20,1,648},{0,10,13},{17,6,882},{3,23,2},{7,15,18},{3,15,10},{17,6,882},{31,2,882},{3,15,10},{0,13,890},{31,2,882},{0,13,890},{3,0,900},{3,0,900},{3,0,900},{3,0,900},{1,14,4},{1,14,4},{1,14,4},{1,9,5},{0,8,373},{0,8,373},{4,30,1772},{4,24,898},{5,17,1186}, +{4,16,898},{2,27,3055},{1,21,1095},{2,16,33},{1,13,1159},{0,17,4639},{0,13,1730},{7,25,885},{7,21,90},{7,17,53},{6,16,117},{16,4,3048},{0,21,996},{2,16,29},{0,13,1054},{29,1,3048},{0,13,1054},{4,23,891},{4,23,891},{4,23,891},{4,16,894},{2,21,652},{2,16,29},{2,16,29},{2,11,44},{0,13,1452},{0,11,365},{7,18,2},{7,18,2},{7,18,2},{7,14,2},{14,1,648}, +{0,18,1},{0,18,1},{0,11,4},{24,0,648},{0,11,4},{22,0,882},{4,24,8},{8,16,8},{3,16,5},{22,0,882},{30,4,882},{3,16,5},{0,14,890},{30,4,882},{0,14,890},{4,0,890},{4,0,890},{4,0,890},{4,0,890},{2,15,4},{2,15,4},{2,15,4},{2,10,5},{0,9,269},{0,9,269},{5,31,1772},{5,25,898},{6,18,1186},{5,17,898},{3,28,3055},{2,22,1095},{3,17,33}, +{2,14,1159},{0,19,4419},{0,14,1444},{8,26,886},{7,23,94},{8,18,56},{7,17,117},{17,5,3048},{0,23,936},{3,17,29},{0,14,1003},{30,2,3048},{0,14,1003},{5,24,891},{5,24,891},{5,24,891},{5,17,894},{3,22,652},{3,17,29},{3,17,29},{3,12,41},{0,15,1296},{0,12,235},{8,19,5},{8,19,5},{8,19,5},{8,15,5},{16,0,648},{1,19,1},{1,19,1},{1,12,1},{25,1,648}, +{1,12,1},{23,1,882},{5,25,8},{9,17,8},{4,17,5},{23,1,882},{31,5,882},{4,17,5},{0,15,890},{31,5,882},{0,15,890},{5,0,890},{5,0,890},{5,0,890},{5,0,890},{3,16,4},{3,16,4},{3,16,4},{3,11,5},{0,11,185},{0,11,185},{6,31,1790},{6,26,898},{7,19,1186},{6,18,898},{4,29,3057},{3,23,1095},{4,18,45},{3,15,1159},{0,20,4156},{0,15,1226},{9,27,886}, +{8,24,89},{9,19,56},{8,18,121},{18,6,3048},{0,25,909},{4,18,36},{0,15,970},{31,3,3048},{0,15,970},{6,25,891},{6,25,891},{6,25,891},{6,18,894},{4,23,659},{4,18,41},{4,18,41},{3,13,46},{0,16,1137},{0,13,137},{9,20,4},{9,20,4},{9,20,4},{9,16,8},{17,1,648},{2,20,2},{2,20,2},{2,13,1},{26,2,648},{2,13,1},{24,2,882},{6,26,8},{10,18,8}, +{5,18,5},{24,2,882},{27,9,882},{5,18,5},{0,16,900},{27,9,882},{0,16,900},{6,0,890},{6,0,890},{6,0,890},{6,0,890},{4,17,10},{4,17,10},{4,17,10},{4,12,13},{0,13,136},{0,13,136},{8,31,1844},{7,27,902},{8,20,1186},{7,19,910},{5,30,3055},{4,24,1095},{5,19,47},{4,16,1159},{0,22,3940},{0,16,1055},{10,28,885},{10,24,90},{10,20,53},{9,19,122},{22,2,3048}, +{0,27,886},{4,20,41},{0,17,926},{22,10,3048},{0,17,926},{7,27,901},{7,27,901},{7,27,901},{7,19,901},{5,24,652},{5,19,38},{5,19,38},{5,14,44},{0,18,1002},{0,15,110},{10,21,2},{10,21,2},{10,21,2},{10,17,2},{17,4,648},{3,21,4},{3,21,4},{3,14,5},{29,2,648},{3,14,5},{27,0,882},{7,27,2},{11,19,18},{7,19,10},{27,0,882},{30,9,882},{7,19,10}, +{0,17,890},{30,9,882},{0,17,890},{7,0,900},{7,0,900},{7,0,900},{7,0,900},{5,18,4},{5,18,4},{5,18,4},{5,13,5},{0,15,74},{0,15,74},{9,31,1886},{8,28,898},{9,21,1186},{8,20,898},{6,31,3055},{5,25,1095},{6,20,33},{5,17,1159},{0,23,3820},{0,18,963},{11,29,885},{11,25,90},{11,21,53},{10,20,117},{23,3,3048},{1,28,888},{6,20,29},{0,18,899},{28,8,3048}, +{0,18,899},{8,27,891},{8,27,891},{8,27,891},{8,20,894},{6,25,652},{6,20,29},{6,20,29},{6,15,44},{0,20,876},{0,16,102},{11,22,2},{11,22,2},{11,22,2},{11,18,2},{18,5,648},{4,22,1},{4,22,1},{4,15,4},{30,3,648},{4,15,4},{26,4,882},{8,28,8},{12,20,8},{7,20,5},{26,4,882},{31,10,882},{7,20,5},{0,18,890},{31,10,882},{0,18,890},{8,0,890}, +{8,0,890},{8,0,890},{8,0,890},{6,19,4},{6,19,4},{6,19,4},{6,14,5},{0,17,29},{0,17,29},{10,31,1964},{9,29,898},{10,22,1186},{9,21,898},{7,31,3100},{6,26,1095},{7,21,33},{6,18,1159},{0,25,3679},{0,19,899},{12,30,886},{11,27,94},{12,22,56},{11,21,117},{21,9,3048},{2,29,888},{7,21,29},{0,19,890},{29,9,3048},{0,19,890},{9,28,891},{9,28,891},{9,28,891}, +{9,21,894},{7,26,652},{7,21,29},{7,21,29},{7,16,41},{0,22,800},{2,16,98},{12,23,5},{12,23,5},{12,23,5},{12,19,5},{20,4,648},{5,23,1},{5,23,1},{5,16,1},{29,5,648},{5,16,1},{30,0,882},{9,29,8},{13,21,8},{8,21,5},{30,0,882},{30,12,882},{8,21,5},{0,19,890},{30,12,882},{0,19,890},{9,0,890},{9,0,890},{9,0,890},{9,0,890},{7,20,4}, +{7,20,4},{7,20,4},{7,15,5},{0,19,9},{0,19,9},{11,31,2078},{10,30,898},{11,23,1186},{10,22,898},{9,31,3181},{7,27,1095},{8,22,45},{7,19,1159},{0,27,3523},{0,20,908},{13,31,886},{12,28,89},{13,23,56},{12,22,121},{22,10,3048},{3,30,888},{8,22,36},{1,20,901},{30,10,3048},{1,20,901},{10,29,891},{10,29,891},{10,29,891},{10,22,894},{8,27,659},{8,22,41},{8,22,41}, +{7,17,46},{0,23,747},{3,17,98},{13,24,4},{13,24,4},{13,24,4},{13,20,8},{24,0,648},{6,24,2},{6,24,2},{6,17,1},{30,6,648},{6,17,1},{31,1,882},{10,30,8},{14,22,8},{9,22,5},{31,1,882},{31,13,882},{9,22,5},{0,20,900},{31,13,882},{0,20,900},{10,0,890},{10,0,890},{10,0,890},{10,0,890},{8,21,10},{8,21,10},{8,21,10},{8,16,13},{0,20,8}, +{0,20,8},{12,31,2228},{11,31,902},{12,24,1186},{11,23,910},{10,31,3256},{8,28,1095},{9,23,47},{8,20,1159},{0,29,3364},{2,21,894},{14,31,915},{14,28,90},{14,24,53},{13,23,122},{29,1,3048},{4,31,886},{8,24,41},{2,21,890},{26,14,3048},{2,21,890},{11,31,901},{11,31,901},{11,31,901},{11,23,901},{9,28,652},{9,23,38},{9,23,38},{9,18,44},{0,25,705},{3,19,101},{14,25,2}, +{14,25,2},{14,25,2},{14,21,2},{24,3,648},{7,25,4},{7,25,4},{7,18,5},{28,9,648},{7,18,5},{31,4,882},{11,31,2},{15,23,18},{11,23,10},{31,4,882},{24,19,882},{11,23,10},{0,21,890},{24,19,882},{0,21,890},{11,0,900},{11,0,900},{11,0,900},{11,0,900},{9,22,4},{9,22,4},{9,22,4},{9,17,5},{2,21,4},{2,21,4},{13,31,2414},{12,31,907},{13,25,1186}, +{12,24,898},{11,31,3391},{9,29,1095},{10,24,33},{9,21,1159},{0,31,3276},{3,22,894},{15,31,981},{15,29,90},{15,25,53},{14,24,117},{30,2,3048},{6,31,906},{10,24,29},{3,22,890},{27,15,3048},{3,22,890},{12,31,891},{12,31,891},{12,31,891},{12,24,894},{10,29,652},{10,24,29},{10,24,29},{10,19,44},{0,27,665},{4,20,102},{15,26,2},{15,26,2},{15,26,2},{15,22,2},{22,9,648}, +{8,26,1},{8,26,1},{8,19,4},{29,10,648},{8,19,4},{30,8,882},{12,31,17},{16,24,8},{11,24,5},{30,8,882},{28,18,882},{11,24,5},{0,22,890},{28,18,882},{0,22,890},{12,0,890},{12,0,890},{12,0,890},{12,0,890},{10,23,4},{10,23,4},{10,23,4},{10,18,5},{3,22,4},{3,22,4},{15,31,2606},{13,31,987},{14,26,1186},{13,25,898},{13,31,3517},{10,30,1095},{11,25,33}, +{10,22,1159},{1,31,3300},{4,23,899},{17,31,1014},{15,31,94},{16,26,56},{15,25,117},{31,3,3048},{8,31,936},{11,25,29},{4,23,890},{23,19,3048},{4,23,890},{13,31,906},{13,31,906},{13,31,906},{13,25,894},{11,30,652},{11,25,29},{11,25,29},{11,20,41},{0,29,651},{6,20,98},{16,27,5},{16,27,5},{16,27,5},{16,23,5},{24,8,648},{9,27,1},{9,27,1},{9,20,1},{30,11,648}, +{9,20,1},{31,9,882},{14,31,37},{17,25,8},{12,25,5},{31,9,882},{29,19,882},{12,25,5},{0,23,890},{29,19,882},{0,23,890},{13,0,890},{13,0,890},{13,0,890},{13,0,890},{11,24,4},{11,24,4},{11,24,4},{11,19,5},{3,24,5},{3,24,5},{16,31,2792},{15,31,1079},{15,27,1186},{14,26,898},{14,31,3652},{11,31,1095},{12,26,45},{11,23,1159},{3,31,3436},{4,24,908},{18,31,1080}, +{17,31,110},{17,27,56},{16,26,121},{26,14,3048},{10,31,996},{12,26,36},{5,24,901},{22,21,3048},{5,24,901},{14,31,939},{14,31,939},{14,31,939},{14,26,894},{12,31,659},{12,26,41},{12,26,41},{11,21,46},{1,30,651},{7,21,98},{17,28,4},{17,28,4},{17,28,4},{17,24,8},{28,4,648},{10,28,2},{10,28,2},{10,21,1},{29,13,648},{10,21,1},{29,15,882},{16,31,80},{18,26,8}, +{13,26,5},{29,15,882},{30,20,882},{13,26,5},{0,24,900},{30,20,882},{0,24,900},{14,0,890},{14,0,890},{14,0,890},{14,0,890},{12,25,10},{12,25,10},{12,25,10},{12,20,13},{4,24,8},{4,24,8},{17,31,3038},{16,31,1268},{16,28,1186},{15,27,910},{15,31,3879},{12,31,1146},{13,27,47},{12,24,1159},{5,31,3667},{6,25,894},{19,31,1205},{18,31,147},{18,28,53},{17,27,122},{30,10,3048}, +{12,31,1110},{12,28,41},{6,25,890},{30,18,3048},{6,25,890},{16,31,979},{16,31,979},{16,31,979},{15,27,901},{13,31,670},{13,27,38},{13,27,38},{13,22,44},{2,31,648},{7,23,101},{18,29,2},{18,29,2},{18,29,2},{18,25,2},{31,2,648},{11,29,4},{11,29,4},{11,22,5},{27,16,648},{11,22,5},{29,18,882},{18,31,146},{19,27,18},{15,27,10},{29,18,882},{28,23,882},{15,27,10}, +{0,25,890},{28,23,882},{0,25,890},{15,0,900},{15,0,900},{15,0,900},{15,0,900},{13,26,4},{13,26,4},{13,26,4},{13,21,5},{6,25,4},{6,25,4},{18,31,3308},{17,31,1502},{17,29,1186},{16,28,898},{17,31,4077},{14,31,1230},{14,28,33},{13,25,1159},{8,31,3820},{7,26,894},{21,31,1368},{19,31,261},{19,29,53},{18,28,117},{31,11,3048},{14,31,1226},{14,28,29},{7,26,890},{31,19,3048}, +{7,26,890},{17,31,1018},{17,31,1018},{17,31,1018},{16,28,894},{14,31,724},{14,28,29},{14,28,29},{14,23,44},{4,31,665},{8,24,102},{19,30,2},{19,30,2},{19,30,2},{19,26,2},{26,13,648},{12,30,1},{12,30,1},{12,23,4},{21,21,648},{12,23,4},{30,19,882},{20,31,193},{20,28,8},{15,28,5},{30,19,882},{27,25,882},{15,28,5},{0,26,890},{27,25,882},{0,26,890},{16,0,890}, +{16,0,890},{16,0,890},{16,0,890},{14,27,4},{14,27,4},{14,27,4},{14,22,5},{7,26,4},{7,26,4},{19,31,3614},{18,31,1804},{18,30,1186},{17,29,898},{18,31,4284},{15,31,1417},{15,29,33},{14,26,1159},{9,31,4036},{8,27,899},{22,31,1494},{20,31,405},{20,30,56},{19,29,117},{29,17,3048},{16,31,1395},{15,29,29},{8,27,890},{27,23,3048},{8,27,890},{18,31,1075},{18,31,1075},{18,31,1075}, +{17,29,894},{16,31,787},{15,29,29},{15,29,29},{15,24,41},{6,31,705},{10,24,98},{20,31,5},{20,31,5},{20,31,5},{20,27,5},{28,12,648},{13,31,1},{13,31,1},{13,24,1},{22,22,648},{13,24,1},{29,23,882},{22,31,277},{21,29,8},{16,29,5},{29,23,882},{28,26,882},{16,29,5},{0,27,890},{28,26,882},{0,27,890},{17,0,890},{17,0,890},{17,0,890},{17,0,890},{15,28,4}, +{15,28,4},{15,28,4},{15,23,5},{7,28,5},{7,28,5},{20,31,4014},{19,31,2174},{19,31,1186},{18,30,898},{19,31,4545},{17,31,1725},{16,30,45},{15,27,1159},{11,31,4300},{8,28,908},{23,31,1656},{22,31,585},{21,31,56},{20,30,121},{30,18,3048},{18,31,1563},{16,30,36},{9,28,901},{26,25,3048},{9,28,901},{19,31,1150},{19,31,1150},{19,31,1150},{18,30,894},{17,31,841},{16,30,41},{16,30,41}, +{15,25,46},{8,31,747},{11,25,98},{21,31,20},{21,31,20},{21,31,20},{21,28,8},{29,13,648},{15,31,5},{15,31,5},{14,25,1},{28,20,648},{14,25,1},{30,24,882},{23,31,397},{22,30,8},{17,30,5},{30,24,882},{29,27,882},{17,30,5},{0,28,900},{29,27,882},{0,28,900},{18,0,890},{18,0,890},{18,0,890},{18,0,890},{16,29,10},{16,29,10},{16,29,10},{16,24,13},{8,28,8}, +{8,28,8},{22,31,4123},{21,31,2404},{20,31,1278},{19,31,901},{20,31,4626},{18,31,1849},{17,31,38},{16,28,1006},{14,31,4330},{10,29,789},{24,31,1629},{23,31,715},{22,31,65},{22,30,101},{31,19,2814},{20,31,1505},{17,31,34},{10,29,785},{27,26,2814},{10,29,785},{20,31,1278},{20,31,1278},{20,31,1278},{19,31,901},{18,31,948},{17,31,38},{17,31,38},{17,26,44},{10,31,840},{11,27,101},{22,31,65}, +{22,31,65},{22,31,65},{22,29,2},{29,16,648},{17,31,34},{17,31,34},{15,26,5},{31,20,648},{15,26,5},{31,25,761},{25,31,425},{23,31,9},{19,31,1},{31,25,761},{28,29,761},{19,31,1},{0,29,785},{28,29,761},{0,29,785},{19,0,900},{19,0,900},{19,0,900},{19,0,900},{17,30,4},{17,30,4},{17,30,4},{17,25,5},{10,29,4},{10,29,4},{23,31,3735},{22,31,2314},{21,31,1395}, +{20,31,899},{22,31,4090},{19,31,1618},{18,31,104},{17,29,686},{15,31,3826},{11,29,507},{25,31,1285},{24,31,609},{23,31,122},{23,31,37},{30,22,2249},{21,31,1186},{19,31,74},{13,29,482},{27,27,2249},{13,29,482},{21,31,1395},{21,31,1395},{21,31,1395},{20,31,899},{19,31,1086},{18,31,104},{18,31,104},{18,27,44},{12,31,969},{12,28,102},{23,31,122},{23,31,122},{23,31,122},{23,30,2},{30,17,648}, +{19,31,74},{19,31,74},{16,27,4},{25,25,648},{16,27,4},{31,26,481},{27,31,269},{25,31,0},{21,31,0},{31,26,481},{31,28,481},{21,31,0},{0,29,481},{31,28,481},{0,29,481},{20,0,890},{20,0,890},{20,0,890},{20,0,890},{18,31,4},{18,31,4},{18,31,4},{18,26,5},{11,30,4},{11,30,4},{23,31,3399},{23,31,2260},{22,31,1530},{21,31,954},{23,31,3639},{20,31,1402},{19,31,238}, +{18,29,405},{17,31,3443},{12,30,314},{26,31,1009},{25,31,525},{25,31,164},{24,31,5},{30,24,1769},{23,31,918},{21,31,113},{14,30,290},{29,27,1769},{14,30,290},{22,31,1530},{22,31,1530},{22,31,1530},{21,31,954},{21,31,1251},{19,31,238},{19,31,238},{19,28,41},{14,31,1105},{14,28,98},{25,31,164},{25,31,164},{25,31,164},{24,31,5},{31,18,648},{21,31,113},{21,31,113},{17,28,1},{26,26,648}, +{17,28,1},{30,29,265},{28,31,145},{27,31,4},{24,31,1},{30,29,265},{29,30,265},{24,31,1},{0,30,289},{29,30,265},{0,30,289},{21,0,890},{21,0,890},{21,0,890},{21,0,890},{19,31,13},{19,31,13},{19,31,13},{19,27,5},{12,31,9},{12,31,9},{24,31,3069},{24,31,2257},{23,31,1683},{23,31,1054},{24,31,3258},{22,31,1330},{21,31,378},{19,30,213},{20,31,3102},{14,30,166},{27,31,801}, +{26,31,477},{26,31,221},{25,31,20},{31,24,1374},{24,31,758},{23,31,181},{16,30,114},{24,31,1374},{16,30,114},{23,31,1683},{23,31,1683},{23,31,1683},{23,31,1054},{22,31,1401},{21,31,378},{21,31,378},{19,29,46},{16,31,1296},{15,29,98},{26,31,221},{26,31,221},{26,31,221},{25,31,20},{30,22,648},{23,31,181},{23,31,181},{18,29,1},{27,27,648},{18,29,1},{30,30,113},{29,31,61},{28,31,0}, +{26,31,1},{30,30,113},{30,30,113},{26,31,1},{0,30,113},{30,30,113},{0,30,113},{22,0,890},{22,0,890},{22,0,890},{22,0,890},{20,31,45},{20,31,45},{20,31,45},{20,28,13},{13,31,25},{13,31,25},{25,31,2860},{25,31,2260},{24,31,1854},{24,31,1210},{25,31,2932},{23,31,1310},{22,31,609},{21,30,108},{21,31,2731},{15,31,101},{28,31,630},{27,31,475},{27,31,306},{26,31,101},{31,26,1032}, +{26,31,612},{25,31,290},{18,31,37},{29,29,1032},{18,31,37},{24,31,1854},{24,31,1854},{24,31,1854},{24,31,1210},{23,31,1620},{22,31,609},{22,31,609},{21,30,44},{18,31,1515},{15,31,101},{27,31,306},{27,31,306},{27,31,306},{26,31,101},{30,25,648},{25,31,290},{25,31,290},{19,30,5},{30,27,648},{19,30,5},{31,30,18},{30,31,10},{30,31,1},{29,31,0},{31,30,18},{30,31,18},{29,31,0}, +{0,31,36},{30,31,18},{0,31,36},{23,0,900},{23,0,900},{23,0,900},{23,0,900},{21,31,104},{21,31,104},{21,31,104},{21,29,5},{15,31,65},{15,31,65},{26,31,2626},{26,31,2206},{25,31,1915},{25,31,1315},{26,31,2641},{24,31,1333},{23,31,789},{22,31,40},{22,31,2445},{17,31,116},{29,31,524},{28,31,406},{28,31,325},{27,31,170},{30,29,771},{27,31,507},{26,31,320},{20,31,0},{29,30,771}, +{20,31,0},{25,31,1915},{25,31,1915},{25,31,1915},{25,31,1315},{24,31,1661},{23,31,789},{23,31,789},{22,31,40},{20,31,1517},{17,31,116},{28,31,325},{28,31,325},{28,31,325},{27,31,170},{31,26,580},{26,31,320},{26,31,320},{20,31,0},{30,28,580},{20,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{24,0,890}, +{24,0,890},{24,0,890},{24,0,890},{23,31,164},{23,31,164},{23,31,164},{22,30,5},{17,31,116},{17,31,116},{27,31,2156},{27,31,1884},{26,31,1630},{26,31,1210},{26,31,2081},{25,31,1108},{24,31,705},{23,31,5},{23,31,1927},{19,31,180},{29,31,300},{29,31,236},{29,31,200},{28,31,85},{31,28,451},{28,31,283},{27,31,194},{23,31,1},{28,31,451},{23,31,1},{26,31,1630},{26,31,1630},{26,31,1630}, +{26,31,1210},{25,31,1347},{24,31,705},{24,31,705},{23,31,5},{22,31,1229},{19,31,180},{29,31,200},{29,31,200},{29,31,200},{28,31,85},{31,27,338},{27,31,194},{27,31,194},{23,31,1},{30,29,338},{23,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{25,0,890},{25,0,890},{25,0,890},{25,0,890},{24,31,221}, +{24,31,221},{24,31,221},{23,31,5},{19,31,180},{19,31,180},{28,31,1782},{27,31,1564},{27,31,1395},{27,31,1123},{27,31,1620},{26,31,937},{25,31,651},{24,31,25},{24,31,1560},{21,31,233},{30,31,150},{30,31,134},{29,31,104},{29,31,40},{31,29,216},{29,31,136},{28,31,90},{25,31,1},{29,31,216},{25,31,1},{27,31,1395},{27,31,1395},{27,31,1395},{27,31,1123},{26,31,1101},{25,31,651},{25,31,651}, +{24,31,25},{23,31,998},{21,31,233},{29,31,104},{29,31,104},{29,31,104},{29,31,40},{31,28,162},{28,31,90},{28,31,90},{25,31,1},{28,31,162},{25,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{26,0,890},{26,0,890},{26,0,890},{26,0,890},{25,31,290},{25,31,290},{25,31,290},{24,31,25},{21,31,233}, +{21,31,233},{0,17,1568},{0,14,442},{0,10,40},{0,8,485},{0,11,3379},{0,9,2369},{0,8,1061},{0,5,2435},{0,6,3760},{0,5,2660},{0,17,1568},{0,14,442},{0,10,40},{0,8,485},{7,0,3371},{0,9,2369},{0,8,1061},{0,5,2435},{10,1,3371},{0,5,2435},{0,8,0},{0,8,0},{0,8,0},{0,5,1},{0,4,288},{0,4,160},{0,4,160},{0,2,164},{0,2,332},{0,2,200},{0,8,0}, +{0,8,0},{0,8,0},{0,5,1},{0,4,288},{0,4,160},{0,4,160},{0,2,164},{4,0,288},{0,2,164},{9,2,1568},{0,14,442},{0,10,40},{0,8,485},{9,2,1568},{17,0,1568},{0,8,485},{0,6,1586},{17,0,1568},{0,6,1586},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,20,1570},{0,16,325},{0,11,5}, +{0,9,392},{0,13,3968},{0,10,2630},{0,9,1121},{0,6,2710},{0,7,4484},{0,6,3034},{0,20,1570},{0,16,325},{0,11,5},{0,9,392},{2,10,3968},{0,10,2630},{0,9,1121},{0,6,2710},{13,0,3968},{0,6,2710},{0,11,1},{0,11,1},{0,11,1},{0,6,4},{0,5,514},{0,5,274},{0,5,274},{0,3,289},{0,3,595},{0,3,370},{0,11,1},{0,11,1},{0,11,1},{0,6,4},{2,2,512}, +{0,5,274},{0,5,274},{0,3,289},{2,2,512},{0,3,289},{10,3,1568},{0,16,325},{0,11,5},{0,9,392},{10,3,1568},{18,1,1568},{0,9,392},{0,7,1586},{18,1,1568},{0,7,1586},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,22,1570},{0,17,225},{0,12,18},{0,11,292},{0,15,4652},{0,11,2945},{0,10,1217}, +{0,7,3035},{0,8,5283},{0,7,3476},{0,22,1570},{0,17,225},{0,12,18},{0,11,292},{4,8,4651},{0,11,2945},{0,10,1217},{0,7,3035},{13,1,4651},{0,7,3035},{0,13,0},{0,13,0},{0,13,0},{0,8,1},{0,7,802},{0,6,424},{0,6,424},{0,4,449},{0,3,931},{0,3,562},{0,13,0},{0,13,0},{0,13,0},{0,8,1},{4,0,800},{0,6,424},{0,6,424},{0,4,449},{5,1,800}, +{0,4,449},{11,4,1568},{0,17,225},{1,12,13},{0,11,292},{11,4,1568},{19,2,1568},{0,11,292},{0,8,1576},{19,2,1568},{0,8,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,25,1570},{0,19,149},{0,13,73},{0,12,194},{0,17,5424},{0,13,3368},{0,11,1349},{0,8,3449},{0,9,6213},{0,7,3956},{0,25,1570}, +{0,19,149},{0,13,73},{0,12,194},{10,0,5419},{0,13,3368},{0,11,1349},{0,8,3449},{15,1,5419},{0,8,3449},{0,16,1},{0,16,1},{0,16,1},{0,9,4},{0,8,1152},{0,7,610},{0,7,610},{0,4,625},{0,4,1328},{0,4,769},{0,16,1},{0,16,1},{0,16,1},{0,9,4},{3,3,1152},{0,7,610},{0,7,610},{0,4,625},{8,0,1152},{0,4,625},{15,0,1568},{0,19,149},{2,13,13}, +{0,12,194},{15,0,1568},{20,3,1568},{0,12,194},{0,9,1576},{20,3,1568},{0,9,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,26,1633},{0,21,155},{1,14,150},{0,13,198},{0,20,5424},{0,15,3099},{0,12,996},{0,9,3179},{0,10,6544},{0,8,3890},{1,26,1569},{1,20,131},{2,14,69},{1,13,181},{10,3,5419}, +{0,15,3099},{0,12,996},{0,9,3179},{18,1,5419},{0,9,3179},{1,17,65},{1,17,65},{1,17,65},{1,11,69},{0,11,1152},{0,9,445},{0,9,445},{0,6,505},{0,6,1494},{0,5,737},{1,17,1},{1,17,1},{1,17,1},{1,11,5},{6,1,1152},{0,9,445},{0,9,445},{0,6,505},{11,0,1152},{0,6,505},{16,1,1568},{0,21,74},{3,14,5},{0,13,117},{16,1,1568},{26,1,1568},{0,13,117}, +{0,10,1586},{26,1,1568},{0,10,1586},{1,0,65},{1,0,65},{1,0,65},{1,0,65},{0,3,0},{0,3,0},{0,3,0},{0,2,1},{0,1,25},{0,1,25},{1,29,1715},{1,22,219},{2,15,342},{1,14,262},{0,22,5420},{0,16,2834},{0,13,726},{0,10,2966},{0,11,6916},{0,9,3860},{2,27,1569},{2,21,131},{3,15,69},{2,14,181},{11,4,5419},{0,16,2834},{0,13,726},{0,10,2966},{19,2,5419}, +{0,10,2966},{1,20,146},{1,20,146},{1,20,146},{1,12,146},{0,13,1154},{0,11,337},{0,11,337},{0,7,388},{0,7,1665},{0,6,749},{2,18,1},{2,18,1},{2,18,1},{2,12,5},{8,0,1152},{0,11,337},{0,11,337},{0,7,388},{5,5,1152},{0,7,388},{17,2,1568},{0,23,34},{4,15,5},{0,14,72},{17,2,1568},{27,2,1568},{0,14,72},{0,11,1586},{27,2,1568},{0,11,1586},{1,0,145}, +{1,0,145},{1,0,145},{1,0,145},{0,6,1},{0,6,1},{0,6,1},{0,3,4},{0,2,85},{0,2,85},{2,30,1907},{1,24,398},{2,16,542},{1,15,425},{0,25,5424},{0,18,2630},{0,15,486},{0,11,2771},{0,13,7299},{0,11,3860},{3,28,1569},{3,22,131},{4,16,82},{3,15,181},{15,0,5419},{0,18,2630},{0,15,486},{0,11,2771},{20,3,5419},{0,11,2771},{2,21,338},{2,21,338},{2,21,338}, +{2,13,338},{0,16,1152},{0,13,274},{0,13,274},{0,8,305},{0,8,1856},{0,7,797},{3,19,1},{3,19,1},{3,19,1},{3,13,5},{9,1,1152},{0,13,274},{0,13,274},{0,8,305},{16,0,1152},{0,8,305},{18,3,1568},{0,25,17},{5,16,13},{0,15,45},{18,3,1568},{28,3,1568},{0,15,45},{0,12,1576},{28,3,1568},{0,12,1576},{2,0,337},{2,0,337},{2,0,337},{2,0,337},{0,8,1}, +{0,8,1},{0,8,1},{0,5,0},{0,4,169},{0,4,169},{2,31,2145},{2,25,590},{3,17,862},{2,16,619},{0,27,5420},{0,20,2424},{0,16,282},{0,12,2552},{0,15,7711},{0,11,3908},{4,29,1570},{4,23,149},{4,17,73},{4,16,194},{14,4,5419},{0,20,2424},{0,16,282},{0,12,2552},{24,2,5419},{0,12,2552},{2,23,546},{2,23,546},{2,23,546},{2,15,546},{0,19,1154},{0,15,194},{0,15,194}, +{0,9,218},{0,9,2123},{0,8,865},{4,20,1},{4,20,1},{4,20,1},{4,13,4},{10,2,1152},{0,15,194},{0,15,194},{0,9,218},{17,1,1152},{0,9,218},{20,2,1568},{0,27,5},{6,17,13},{0,16,26},{20,2,1568},{24,7,1568},{0,16,26},{0,13,1576},{24,7,1568},{0,13,1576},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,11,0},{0,11,0},{0,11,0},{0,7,4},{0,5,289}, +{0,5,289},{3,31,2596},{3,26,941},{3,19,1289},{3,17,972},{0,30,5420},{0,22,2243},{0,17,145},{0,13,2386},{0,16,8161},{0,13,3986},{5,30,1569},{5,24,131},{6,18,69},{5,17,181},{17,2,5419},{0,22,2243},{0,17,145},{0,13,2386},{27,2,5419},{0,13,2386},{3,24,901},{3,24,901},{3,24,901},{3,16,901},{0,22,1154},{0,17,109},{0,17,109},{0,10,145},{0,11,2441},{0,9,1001},{5,21,1}, +{5,21,1},{5,21,1},{5,15,5},{13,0,1152},{0,17,109},{0,17,109},{0,10,145},{20,1,1152},{0,10,145},{23,0,1568},{1,28,2},{7,18,5},{0,18,8},{23,0,1568},{30,5,1568},{0,18,8},{0,14,1586},{30,5,1568},{0,14,1586},{3,0,900},{3,0,900},{3,0,900},{3,0,900},{0,14,1},{0,14,1},{0,14,1},{0,8,1},{0,6,468},{0,6,468},{4,31,3146},{3,28,1262},{4,19,1743}, +{3,18,1297},{1,31,5484},{0,23,2096},{0,19,69},{0,14,2251},{0,18,8669},{0,14,4100},{6,31,1569},{6,25,131},{7,19,69},{6,18,181},{18,3,5419},{0,23,2096},{0,19,69},{0,14,2251},{28,3,5419},{0,14,2251},{3,27,1252},{3,27,1252},{3,27,1252},{3,17,1256},{0,24,1152},{0,18,61},{0,18,61},{0,11,100},{0,12,2859},{0,10,1157},{6,22,1},{6,22,1},{6,22,1},{6,16,5},{14,1,1152}, +{0,18,61},{0,18,61},{0,11,100},{24,0,1152},{0,11,100},{24,1,1568},{2,29,2},{8,19,5},{0,19,5},{24,1,1568},{31,6,1568},{0,19,5},{0,15,1586},{31,6,1568},{0,15,1586},{3,0,1252},{3,0,1252},{3,0,1252},{3,0,1252},{0,16,1},{0,16,1},{0,16,1},{0,10,1},{0,8,657},{0,8,657},{5,31,3716},{4,29,1603},{4,21,2148},{4,19,1631},{2,31,5655},{0,25,2005},{0,20,31}, +{0,15,2138},{0,19,8963},{0,15,4070},{7,31,1587},{7,26,131},{8,20,82},{7,19,181},{20,2,5419},{0,25,2001},{0,20,27},{0,15,2134},{24,7,5419},{0,15,2134},{4,28,1587},{4,28,1587},{4,28,1587},{4,18,1590},{0,27,1158},{0,20,22},{0,20,22},{0,12,62},{0,14,3075},{0,11,1221},{7,23,1},{7,23,1},{7,23,1},{7,17,5},{16,0,1152},{0,20,18},{0,20,18},{0,12,58},{25,1,1152}, +{0,12,58},{25,2,1568},{3,30,2},{9,20,13},{1,20,9},{25,2,1568},{27,10,1568},{1,20,9},{0,16,1576},{27,10,1568},{0,16,1576},{4,0,1586},{4,0,1586},{4,0,1586},{4,0,1586},{0,19,4},{0,19,4},{0,19,4},{0,11,8},{0,9,769},{0,9,769},{6,31,3890},{5,30,1603},{5,22,2148},{5,20,1627},{3,31,5748},{0,27,1989},{1,21,31},{0,17,2117},{0,21,8560},{0,16,3545},{9,31,1634}, +{8,27,149},{8,21,73},{8,20,194},{21,3,5419},{0,27,1889},{1,21,27},{0,17,2017},{28,6,5419},{0,17,2017},{5,29,1587},{5,29,1587},{5,29,1587},{5,19,1590},{1,28,1158},{1,21,22},{1,21,22},{1,13,62},{0,16,2801},{0,13,949},{8,24,1},{8,24,1},{8,24,1},{8,17,4},{17,1,1152},{0,22,2},{0,22,2},{0,14,26},{26,2,1152},{0,14,26},{26,3,1568},{4,31,5},{10,21,13}, +{2,21,9},{26,3,1568},{28,11,1568},{2,21,9},{0,17,1576},{28,11,1568},{0,17,1576},{5,0,1586},{5,0,1586},{5,0,1586},{5,0,1586},{1,20,4},{1,20,4},{1,20,4},{1,12,8},{0,10,625},{0,10,625},{7,31,4136},{6,31,1589},{7,23,2157},{6,21,1621},{4,31,5895},{1,28,1977},{2,22,33},{1,18,2107},{0,23,8196},{0,17,3043},{10,31,1667},{9,28,131},{10,22,69},{9,21,181},{24,1,5419}, +{0,29,1772},{2,22,24},{0,18,1875},{31,6,5419},{0,18,1875},{6,30,1576},{6,30,1576},{6,30,1576},{6,20,1580},{2,29,1161},{2,22,29},{2,22,29},{2,15,58},{0,17,2529},{0,14,656},{9,25,1},{9,25,1},{9,25,1},{9,19,5},{17,4,1152},{0,24,1},{0,24,1},{0,15,1},{29,2,1152},{0,15,1},{27,4,1568},{6,31,13},{11,22,5},{3,22,5},{27,4,1568},{31,11,1568},{3,22,5}, +{0,18,1586},{31,11,1568},{0,18,1586},{6,0,1576},{6,0,1576},{6,0,1576},{6,0,1576},{2,21,10},{2,21,10},{2,21,10},{2,14,13},{0,12,520},{0,12,520},{8,31,4436},{7,31,1625},{8,23,2175},{7,22,1621},{6,31,6079},{3,28,1973},{3,23,33},{2,19,2107},{0,24,7969},{0,18,2675},{11,31,1745},{10,29,131},{11,23,69},{10,22,181},{25,2,5419},{0,30,1699},{3,23,24},{0,19,1782},{27,10,5419}, +{0,19,1782},{7,31,1576},{7,31,1576},{7,31,1576},{7,21,1580},{3,30,1161},{3,23,29},{3,23,29},{3,16,74},{0,19,2313},{0,15,474},{10,26,1},{10,26,1},{10,26,1},{10,20,5},{18,5,1152},{1,25,1},{1,25,1},{0,16,2},{30,3,1152},{0,16,2},{31,0,1568},{8,31,34},{12,23,5},{4,23,5},{31,0,1568},{30,13,1568},{4,23,5},{0,19,1586},{30,13,1568},{0,19,1586},{7,0,1576}, +{7,0,1576},{7,0,1576},{7,0,1576},{3,22,10},{3,22,10},{3,22,10},{3,15,13},{0,14,400},{0,14,400},{9,31,4730},{8,31,1716},{8,25,2148},{8,23,1631},{7,31,6244},{3,30,1977},{4,24,31},{4,19,2138},{0,26,7669},{0,19,2375},{12,31,1832},{11,30,131},{12,24,82},{11,23,181},{26,3,5419},{1,31,1699},{4,24,27},{0,20,1720},{28,11,5419},{0,20,1720},{8,31,1595},{8,31,1595},{8,31,1595}, +{8,22,1590},{4,31,1158},{4,24,22},{4,24,22},{4,16,62},{0,21,2091},{0,17,306},{11,27,1},{11,27,1},{11,27,1},{11,21,5},{20,4,1152},{2,26,1},{2,26,1},{1,17,2},{29,5,1152},{1,17,2},{29,6,1568},{9,31,68},{13,24,13},{5,24,9},{29,6,1568},{31,14,1568},{5,24,9},{0,20,1576},{31,14,1568},{0,20,1576},{8,0,1586},{8,0,1586},{8,0,1586},{8,0,1586},{4,23,4}, +{4,23,4},{4,23,4},{4,15,8},{0,16,277},{0,16,277},{11,31,5010},{9,31,1878},{9,26,2148},{9,24,1627},{8,31,6508},{4,31,1989},{5,25,31},{4,21,2117},{0,28,7364},{0,21,2098},{14,31,1952},{12,31,149},{12,25,73},{12,24,194},{28,2,5419},{3,31,1787},{5,25,27},{0,21,1657},{27,13,5419},{0,21,1657},{9,31,1622},{9,31,1622},{9,31,1622},{9,23,1590},{5,31,1164},{5,25,22},{5,25,22}, +{5,17,62},{0,22,1928},{0,18,194},{12,28,1},{12,28,1},{12,28,1},{12,21,4},{24,0,1152},{3,27,1},{3,27,1},{2,18,2},{30,6,1152},{2,18,2},{30,7,1568},{11,31,116},{14,25,13},{6,25,9},{30,7,1568},{30,16,1568},{6,25,9},{0,21,1576},{30,16,1568},{0,21,1576},{9,0,1586},{9,0,1586},{9,0,1586},{9,0,1586},{5,24,4},{5,24,4},{5,24,4},{5,16,8},{0,18,193}, +{0,18,193},{12,31,5316},{11,31,2154},{11,27,2157},{10,25,1621},{10,31,6800},{6,31,1999},{6,26,33},{5,22,2107},{0,29,7068},{0,22,1836},{15,31,2081},{13,31,206},{14,26,69},{13,25,181},{31,0,5419},{5,31,1937},{6,26,24},{0,22,1611},{30,13,5419},{0,22,1611},{10,31,1676},{10,31,1676},{10,31,1676},{10,24,1580},{7,31,1179},{6,26,29},{6,26,29},{6,19,58},{0,24,1798},{0,19,157},{13,29,1}, +{13,29,1},{13,29,1},{13,23,5},{24,3,1152},{4,28,1},{4,28,1},{4,19,1},{28,9,1152},{4,19,1},{31,8,1568},{13,31,205},{15,26,5},{7,26,5},{31,8,1568},{28,19,1568},{7,26,5},{0,22,1586},{28,19,1568},{0,22,1586},{10,0,1576},{10,0,1576},{10,0,1576},{10,0,1576},{6,25,10},{6,25,10},{6,25,10},{6,18,13},{0,20,106},{0,20,106},{13,31,5658},{12,31,2435},{12,27,2175}, +{11,26,1621},{11,31,7055},{7,31,2090},{7,27,33},{6,23,2107},{0,31,6820},{0,23,1690},{16,31,2216},{14,31,334},{15,27,69},{14,26,181},{29,6,5419},{7,31,2081},{7,27,24},{0,23,1590},{31,14,5419},{0,23,1590},{11,31,1745},{11,31,1745},{11,31,1745},{11,25,1580},{8,31,1220},{7,27,29},{7,27,29},{7,20,74},{0,26,1650},{1,20,137},{14,30,1},{14,30,1},{14,30,1},{14,24,5},{22,9,1152}, +{5,29,1},{5,29,1},{4,20,2},{29,10,1152},{4,20,2},{29,14,1568},{15,31,289},{16,27,5},{8,27,5},{29,14,1568},{29,20,1568},{8,27,5},{0,23,1586},{29,20,1568},{0,23,1586},{11,0,1576},{11,0,1576},{11,0,1576},{11,0,1576},{7,26,10},{7,26,10},{7,26,10},{7,19,13},{0,22,58},{0,22,58},{14,31,6036},{13,31,2751},{12,29,2148},{12,27,1631},{12,31,7316},{8,31,2228},{8,28,31}, +{8,23,2138},{0,31,6884},{0,24,1613},{17,31,2402},{16,31,500},{16,28,82},{15,27,181},{30,7,5419},{9,31,2195},{8,28,27},{0,24,1577},{30,16,5419},{0,24,1577},{12,31,1811},{12,31,1811},{12,31,1811},{12,26,1590},{9,31,1286},{8,28,22},{8,28,22},{8,20,62},{0,28,1508},{2,21,137},{15,31,1},{15,31,1},{15,31,1},{15,25,5},{24,8,1152},{6,30,1},{6,30,1},{5,21,2},{30,11,1152}, +{5,21,2},{30,15,1568},{17,31,410},{17,28,13},{9,28,9},{30,15,1568},{30,21,1568},{9,28,9},{0,24,1576},{30,21,1568},{0,24,1576},{12,0,1586},{12,0,1586},{12,0,1586},{12,0,1586},{8,27,4},{8,27,4},{8,27,4},{8,19,8},{0,24,37},{0,24,37},{15,31,6450},{14,31,3135},{13,30,2148},{13,28,1627},{13,31,7661},{10,31,2448},{9,29,31},{8,25,2117},{2,31,7196},{0,25,1593},{19,31,2594}, +{17,31,698},{16,29,73},{16,28,194},{29,11,5419},{11,31,2379},{9,29,27},{1,25,1577},{31,17,5419},{1,25,1577},{13,31,1910},{13,31,1910},{13,31,1910},{13,27,1590},{10,31,1388},{9,29,22},{9,29,22},{9,21,62},{0,30,1416},{3,22,137},{16,31,4},{16,31,4},{16,31,4},{16,25,4},{28,4,1152},{7,31,1},{7,31,1},{6,22,2},{29,13,1152},{6,22,2},{31,16,1568},{19,31,530},{18,29,13}, +{10,29,9},{31,16,1568},{31,22,1568},{10,29,9},{0,25,1576},{31,22,1568},{0,25,1576},{13,0,1586},{13,0,1586},{13,0,1586},{13,0,1586},{9,28,4},{9,28,4},{9,28,4},{9,20,8},{0,25,17},{0,25,17},{16,31,6900},{15,31,3657},{15,31,2157},{14,29,1621},{15,31,8023},{11,31,2845},{10,30,33},{9,26,2107},{5,31,7651},{1,26,1611},{20,31,2866},{18,31,1011},{18,30,69},{17,29,181},{29,14,5419}, +{13,31,2657},{10,30,24},{3,26,1587},{29,20,5419},{3,26,1587},{15,31,2057},{15,31,2057},{15,31,2057},{14,28,1580},{12,31,1476},{10,30,29},{10,30,29},{10,23,58},{0,31,1324},{4,23,157},{17,31,37},{17,31,37},{17,31,37},{17,27,5},{31,2,1152},{9,31,4},{9,31,4},{8,23,1},{27,16,1152},{8,23,1},{31,19,1568},{21,31,637},{19,30,5},{11,30,5},{31,19,1568},{27,26,1568},{11,30,5}, +{0,26,1586},{27,26,1568},{0,26,1586},{14,0,1576},{14,0,1576},{14,0,1576},{14,0,1576},{10,29,10},{10,29,10},{10,29,10},{10,22,13},{1,27,9},{1,27,9},{18,31,7332},{16,31,4196},{16,31,2175},{15,30,1621},{16,31,8348},{13,31,3285},{11,31,33},{10,27,2107},{8,31,8004},{2,27,1611},{21,31,3112},{20,31,1281},{19,31,69},{18,30,181},{30,15,5419},{15,31,2897},{11,31,24},{3,27,1590},{30,21,5419}, +{3,27,1590},{16,31,2171},{16,31,2171},{16,31,2171},{15,29,1580},{13,31,1590},{11,31,29},{11,31,29},{11,24,74},{2,31,1424},{5,24,137},{19,31,65},{19,31,65},{19,31,65},{18,28,5},{26,13,1152},{11,31,20},{11,31,20},{8,24,2},{21,21,1152},{8,24,2},{30,23,1568},{23,31,785},{20,31,5},{12,31,5},{30,23,1568},{28,27,1568},{12,31,5},{0,27,1586},{28,27,1568},{0,27,1586},{15,0,1576}, +{15,0,1576},{15,0,1576},{15,0,1576},{11,30,10},{11,30,10},{11,30,10},{11,23,13},{1,28,8},{1,28,8},{19,31,7014},{17,31,4230},{17,31,2294},{16,31,1595},{17,31,7865},{14,31,3114},{12,31,85},{12,27,1706},{8,31,7436},{3,28,1268},{22,31,2794},{21,31,1221},{20,31,113},{19,30,114},{30,17,4803},{17,31,2648},{13,31,61},{4,28,1253},{25,25,4803},{4,28,1253},{17,31,2294},{17,31,2294},{17,31,2294}, +{16,30,1590},{14,31,1740},{12,31,85},{12,31,85},{12,24,62},{3,31,1571},{6,25,137},{20,31,113},{20,31,113},{20,31,113},{19,29,5},{28,12,1152},{13,31,61},{13,31,61},{9,25,2},{22,22,1152},{9,25,2},{31,23,1250},{24,31,680},{21,31,4},{15,31,0},{31,23,1250},{23,31,1250},{15,31,0},{0,28,1252},{23,31,1250},{0,28,1252},{16,0,1586},{16,0,1586},{16,0,1586},{16,0,1586},{12,31,4}, +{12,31,4},{12,31,4},{12,23,8},{2,29,8},{2,29,8},{19,31,6534},{18,31,4116},{18,31,2435},{17,31,1590},{18,31,7164},{15,31,2809},{14,31,161},{12,28,1256},{10,31,6748},{5,28,945},{23,31,2340},{22,31,1065},{21,31,164},{20,31,64},{31,17,4056},{18,31,2211},{15,31,113},{7,28,900},{25,26,4056},{7,28,900},{18,31,2435},{18,31,2435},{18,31,2435},{17,31,1590},{16,31,1923},{14,31,161},{14,31,161}, +{13,25,62},{6,31,1729},{7,26,137},{21,31,164},{21,31,164},{21,31,164},{20,29,4},{29,13,1152},{15,31,113},{15,31,113},{10,26,2},{28,20,1152},{10,26,2},{30,26,882},{25,31,482},{23,31,0},{18,31,1},{30,26,882},{31,27,882},{18,31,1},{0,28,900},{31,27,882},{0,28,900},{17,0,1586},{17,0,1586},{17,0,1586},{17,0,1586},{13,31,13},{13,31,13},{13,31,13},{13,24,8},{3,30,8}, +{3,30,8},{21,31,6091},{20,31,4022},{19,31,2609},{18,31,1640},{19,31,6490},{16,31,2617},{15,31,318},{14,28,835},{11,31,6135},{6,29,598},{24,31,1881},{23,31,931},{22,31,245},{21,31,5},{31,19,3318},{20,31,1733},{17,31,202},{8,29,545},{27,26,3318},{8,29,545},{19,31,2609},{19,31,2609},{19,31,2609},{18,31,1640},{17,31,2086},{15,31,318},{15,31,318},{14,27,58},{8,31,1868},{8,27,157},{22,31,245}, +{22,31,245},{22,31,245},{21,31,5},{29,16,1152},{17,31,202},{17,31,202},{12,27,1},{31,20,1152},{12,27,1},{31,26,545},{26,31,305},{25,31,4},{20,31,1},{31,26,545},{29,29,545},{20,31,1},{0,29,545},{29,29,545},{0,29,545},{18,0,1576},{18,0,1576},{18,0,1576},{18,0,1576},{15,31,29},{15,31,29},{15,31,29},{14,26,13},{5,31,9},{5,31,9},{22,31,5719},{21,31,3980},{20,31,2834}, +{19,31,1745},{20,31,6050},{18,31,2457},{16,31,536},{15,29,515},{14,31,5674},{7,30,406},{25,31,1573},{24,31,861},{23,31,338},{22,31,10},{30,22,2753},{21,31,1438},{19,31,290},{11,29,338},{27,27,2753},{11,29,338},{20,31,2834},{20,31,2834},{20,31,2834},{19,31,1745},{18,31,2284},{16,31,536},{16,31,536},{15,28,74},{10,31,2064},{9,28,137},{23,31,338},{23,31,338},{23,31,338},{22,31,10},{30,17,1152}, +{19,31,290},{19,31,290},{12,28,2},{25,25,1152},{12,28,2},{31,27,313},{28,31,181},{26,31,1},{23,31,0},{31,27,313},{30,29,313},{23,31,0},{0,29,337},{30,29,313},{0,29,337},{19,0,1576},{19,0,1576},{19,0,1576},{19,0,1576},{16,31,52},{16,31,52},{16,31,52},{15,27,13},{6,31,25},{6,31,25},{22,31,5399},{22,31,3974},{21,31,3035},{20,31,1875},{21,31,5619},{19,31,2378},{18,31,776}, +{16,30,318},{15,31,5258},{9,30,225},{26,31,1333},{25,31,813},{24,31,425},{23,31,65},{30,24,2273},{23,31,1218},{20,31,353},{12,30,146},{29,27,2273},{12,30,146},{21,31,3035},{21,31,3035},{21,31,3035},{20,31,1875},{19,31,2518},{18,31,776},{18,31,776},{16,28,62},{11,31,2323},{10,29,137},{24,31,425},{24,31,425},{24,31,425},{23,31,65},{31,18,1152},{20,31,353},{20,31,353},{13,29,2},{26,26,1152}, +{13,29,2},{31,28,145},{28,31,85},{28,31,4},{26,31,1},{31,28,145},{30,30,145},{26,31,1},{0,30,145},{30,30,145},{0,30,145},{20,0,1586},{20,0,1586},{20,0,1586},{20,0,1586},{17,31,85},{17,31,85},{17,31,85},{16,27,8},{8,31,40},{8,31,40},{23,31,5143},{23,31,4004},{22,31,3254},{21,31,2070},{22,31,5274},{20,31,2310},{19,31,1062},{17,30,133},{17,31,5011},{10,31,161},{27,31,1161}, +{26,31,801},{26,31,545},{25,31,164},{31,24,1878},{24,31,1094},{22,31,461},{14,30,66},{24,31,1878},{14,30,66},{22,31,3254},{22,31,3254},{22,31,3254},{21,31,2070},{20,31,2833},{19,31,1062},{19,31,1062},{17,29,62},{14,31,2577},{11,30,137},{26,31,545},{26,31,545},{26,31,545},{25,31,164},{30,22,1152},{22,31,461},{22,31,461},{14,30,2},{27,27,1152},{14,30,2},{30,31,41},{30,31,25},{29,31,1}, +{28,31,0},{30,31,41},{31,30,41},{28,31,0},{0,30,65},{31,30,41},{0,30,65},{21,0,1586},{21,0,1586},{21,0,1586},{21,0,1586},{18,31,136},{18,31,136},{18,31,136},{17,28,8},{10,31,80},{10,31,80},{24,31,4882},{24,31,4070},{23,31,3532},{22,31,2360},{24,31,4945},{21,31,2422},{20,31,1433},{18,31,58},{20,31,4717},{12,31,157},{28,31,1026},{27,31,835},{27,31,666},{26,31,305},{31,26,1536}, +{26,31,996},{24,31,628},{16,31,1},{29,29,1536},{16,31,1},{23,31,3532},{23,31,3532},{23,31,3532},{22,31,2360},{22,31,3110},{20,31,1433},{20,31,1433},{18,31,58},{16,31,2939},{12,31,157},{27,31,666},{27,31,666},{27,31,666},{26,31,305},{30,25,1152},{24,31,628},{24,31,628},{16,31,1},{30,27,1152},{16,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0}, +{0,31,0},{31,31,0},{0,31,0},{22,0,1576},{22,0,1576},{22,0,1576},{22,0,1576},{19,31,221},{19,31,221},{19,31,221},{18,30,13},{12,31,157},{12,31,157},{25,31,4212},{24,31,3590},{24,31,3106},{23,31,2201},{24,31,4129},{22,31,2101},{21,31,1301},{19,31,13},{20,31,3869},{14,31,233},{28,31,706},{28,31,562},{28,31,481},{27,31,218},{31,27,1067},{27,31,699},{25,31,442},{18,31,1},{30,29,1067}, +{18,31,1},{24,31,3106},{24,31,3106},{24,31,3106},{23,31,2201},{23,31,2668},{21,31,1301},{21,31,1301},{19,31,13},{18,31,2523},{14,31,233},{28,31,481},{28,31,481},{28,31,481},{27,31,218},{31,25,802},{25,31,442},{25,31,442},{18,31,1},{31,27,802},{18,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{23,0,1576}, +{23,0,1576},{23,0,1576},{23,0,1576},{20,31,325},{20,31,325},{20,31,325},{19,31,13},{14,31,233},{14,31,233},{26,31,3642},{25,31,3132},{25,31,2771},{24,31,2070},{25,31,3444},{23,31,1834},{22,31,1205},{20,31,8},{21,31,3219},{16,31,346},{29,31,456},{28,31,370},{28,31,289},{28,31,145},{30,29,683},{28,31,451},{27,31,290},{21,31,1},{29,30,683},{21,31,1},{25,31,2771},{25,31,2771},{25,31,2771}, +{24,31,2070},{24,31,2273},{22,31,1205},{22,31,1205},{20,31,8},{20,31,2121},{16,31,346},{28,31,289},{28,31,289},{28,31,289},{28,31,145},{31,26,512},{27,31,290},{27,31,290},{21,31,1},{29,29,512},{21,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{24,0,1586},{24,0,1586},{24,0,1586},{24,0,1586},{22,31,421}, +{22,31,421},{22,31,421},{20,31,8},{16,31,346},{16,31,346},{26,31,3162},{26,31,2742},{26,31,2486},{25,31,1947},{26,31,2877},{24,31,1641},{23,31,1145},{22,31,52},{22,31,2673},{18,31,458},{29,31,264},{29,31,200},{29,31,164},{28,31,81},{30,30,384},{28,31,243},{28,31,162},{23,31,1},{30,30,384},{23,31,1},{26,31,2486},{26,31,2486},{26,31,2486},{25,31,1947},{24,31,1969},{23,31,1145},{23,31,1145}, +{22,31,52},{20,31,1785},{18,31,458},{29,31,164},{29,31,164},{29,31,164},{28,31,81},{31,27,290},{28,31,162},{28,31,162},{23,31,1},{30,29,290},{23,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{25,0,1586},{25,0,1586},{25,0,1586},{25,0,1586},{23,31,520},{23,31,520},{23,31,520},{22,31,52},{18,31,458}, +{18,31,458},{0,23,2665},{0,18,680},{0,13,50},{0,11,785},{0,15,5885},{0,11,4118},{0,10,1800},{0,7,4202},{0,8,6546},{0,7,4643},{0,23,2665},{0,18,680},{0,13,50},{0,11,785},{9,0,5885},{0,11,4118},{0,10,1800},{0,7,4202},{15,0,5885},{0,7,4202},{0,11,0},{0,11,0},{0,11,0},{0,7,4},{0,5,549},{0,5,289},{0,5,289},{0,3,306},{0,3,630},{0,3,387},{0,11,0}, +{0,11,0},{0,11,0},{0,7,4},{2,2,545},{0,5,289},{0,5,289},{0,3,306},{4,1,545},{0,3,306},{13,1,2665},{0,18,680},{0,13,50},{0,11,785},{13,1,2665},{23,0,2665},{0,11,785},{0,8,2689},{23,0,2665},{0,8,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,25,2665},{0,20,521},{0,14,5}, +{0,12,625},{0,17,6669},{0,13,4529},{0,11,1890},{0,8,4610},{0,9,7494},{0,7,5171},{0,25,2665},{0,20,521},{0,14,5},{0,12,625},{9,2,6669},{0,13,4529},{0,11,1890},{0,8,4610},{17,0,6669},{0,8,4610},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{0,7,841},{0,6,445},{0,6,445},{0,4,464},{0,3,982},{0,3,595},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{4,0,841}, +{0,6,445},{0,6,445},{0,4,464},{7,0,841},{0,4,464},{14,2,2665},{0,20,521},{0,14,5},{0,12,625},{14,2,2665},{25,0,2665},{0,12,625},{0,9,2689},{25,0,2665},{0,9,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,28,2665},{0,22,405},{0,15,10},{0,13,514},{0,19,7541},{0,14,4934},{0,12,2042}, +{0,9,5045},{0,10,8546},{0,8,5682},{0,28,2665},{0,22,405},{0,15,10},{0,13,514},{10,2,7538},{0,14,4934},{0,12,2042},{0,9,5045},{17,1,7538},{0,9,5045},{0,16,0},{0,16,0},{0,16,0},{0,10,4},{0,8,1201},{0,7,637},{0,7,637},{0,4,656},{0,4,1385},{0,4,800},{0,16,0},{0,16,0},{0,16,0},{0,10,4},{5,0,1201},{0,7,637},{0,7,637},{0,4,656},{8,0,1201}, +{0,4,656},{16,1,2665},{0,22,405},{1,15,5},{0,13,514},{16,1,2665},{28,0,2665},{0,13,514},{0,10,2689},{28,0,2665},{0,10,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,30,2669},{0,23,313},{0,16,68},{0,15,410},{0,20,8498},{0,16,5330},{0,13,2210},{0,10,5530},{0,11,9702},{0,9,6270},{0,30,2669}, +{0,23,313},{0,16,68},{0,15,410},{11,2,8493},{0,16,5330},{0,13,2210},{0,10,5530},{17,2,8493},{0,10,5530},{0,19,1},{0,19,1},{0,19,1},{0,11,1},{0,9,1629},{0,8,832},{0,8,832},{0,5,881},{0,5,1874},{0,5,1106},{0,19,1},{0,19,1},{0,19,1},{0,11,1},{5,1,1625},{0,8,832},{0,8,832},{0,5,881},{8,1,1625},{0,5,881},{17,2,2665},{0,23,313},{2,16,8}, +{0,15,410},{17,2,2665},{29,1,2665},{0,15,410},{0,11,2689},{29,1,2665},{0,11,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,31,2777},{0,26,232},{0,17,197},{0,16,305},{0,22,9674},{0,17,5849},{0,14,2450},{0,10,6106},{0,12,11199},{0,10,7006},{1,31,2741},{0,26,232},{1,17,146},{0,16,305},{11,4,9669}, +{0,17,5849},{0,14,2450},{0,10,6106},{19,2,9669},{0,10,6106},{0,22,1},{0,22,1},{0,22,1},{0,13,0},{0,11,2178},{0,10,1125},{0,10,1125},{0,6,1189},{0,6,2520},{0,5,1475},{0,22,1},{0,22,1},{0,22,1},{0,13,0},{6,1,2178},{0,10,1125},{0,10,1125},{0,6,1189},{11,0,2178},{0,6,1189},{20,0,2665},{0,26,232},{3,17,2},{0,16,305},{20,0,2665},{30,2,2665},{0,16,305}, +{0,12,2689},{30,2,2665},{0,12,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,31,2949},{0,28,217},{1,18,261},{0,17,282},{0,25,9670},{0,19,5529},{0,16,1970},{0,12,5738},{0,13,11589},{0,11,6898},{2,31,2789},{0,28,217},{2,18,146},{0,17,282},{15,0,9669},{0,19,5529},{0,16,1970},{0,12,5738},{20,3,9669}, +{0,12,5738},{0,24,64},{0,24,64},{0,24,64},{1,14,64},{0,13,2180},{0,11,949},{0,11,949},{0,7,1018},{0,7,2691},{0,6,1433},{1,23,1},{1,23,1},{1,23,1},{1,14,0},{8,0,2178},{0,11,949},{0,11,949},{0,7,1018},{5,5,2178},{0,7,1018},{21,1,2665},{0,28,153},{4,18,5},{0,17,218},{21,1,2665},{31,3,2665},{0,17,218},{0,13,2689},{31,3,2665},{0,13,2689},{0,0,64}, +{0,0,64},{0,0,64},{0,0,64},{0,3,1},{0,3,1},{0,3,1},{0,2,4},{0,1,18},{0,1,18},{2,31,3285},{1,28,273},{2,19,453},{1,18,346},{0,27,9674},{0,20,5170},{0,17,1546},{0,13,5429},{0,15,11993},{0,12,6819},{3,31,2873},{1,28,209},{3,19,146},{1,18,282},{14,4,9669},{0,20,5170},{0,17,1546},{0,13,5429},{24,2,9669},{0,13,5429},{1,25,128},{1,25,128},{1,25,128}, +{1,15,137},{0,16,2178},{0,13,832},{0,13,832},{0,8,881},{0,8,2882},{0,7,1427},{2,23,4},{2,23,4},{2,23,4},{2,15,0},{9,1,2178},{0,13,832},{0,13,832},{0,8,881},{16,0,2178},{0,8,881},{23,0,2665},{0,29,85},{5,19,5},{0,18,149},{23,0,2665},{30,5,2665},{0,18,149},{0,14,2689},{30,5,2665},{0,14,2689},{1,0,128},{1,0,128},{1,0,128},{1,0,128},{0,5,1}, +{0,5,1},{0,5,1},{0,3,1},{0,2,72},{0,2,72},{3,31,3785},{1,30,405},{2,21,676},{1,19,469},{0,30,9669},{0,22,4878},{0,18,1190},{0,14,5138},{0,16,12390},{0,13,6789},{4,31,2966},{2,29,209},{4,20,149},{2,19,282},{18,0,9669},{0,22,4878},{0,18,1190},{0,14,5138},{30,0,9669},{0,14,5138},{2,26,320},{2,26,320},{2,26,320},{1,17,320},{0,19,2180},{0,15,680},{0,15,680}, +{0,9,740},{0,9,3149},{0,8,1441},{3,24,1},{3,24,1},{3,24,1},{3,16,1},{10,2,2178},{0,15,680},{0,15,680},{0,9,740},{17,1,2178},{0,9,740},{24,1,2665},{0,31,41},{6,20,8},{0,19,98},{24,1,2665},{31,6,2665},{0,19,98},{0,15,2689},{31,6,2665},{0,15,2689},{1,0,320},{1,0,320},{1,0,320},{1,0,320},{0,8,0},{0,8,0},{0,8,0},{0,5,1},{0,4,160}, +{0,4,160},{4,31,4514},{2,31,630},{3,22,1027},{2,20,694},{1,31,9738},{0,23,4646},{0,20,849},{0,15,4826},{0,18,12955},{0,14,6798},{6,31,3101},{3,31,218},{5,21,146},{3,20,299},{18,3,9669},{0,23,4646},{0,20,849},{0,15,4826},{28,3,9669},{0,15,4826},{2,29,545},{2,29,545},{2,29,545},{2,18,546},{0,22,2180},{0,17,505},{0,17,505},{0,11,610},{0,11,3467},{0,10,1513},{4,26,1}, +{4,26,1},{4,26,1},{4,17,0},{13,0,2178},{0,17,505},{0,17,505},{0,11,610},{20,1,2178},{0,11,610},{26,1,2665},{2,31,85},{7,21,2},{0,20,65},{26,1,2665},{31,8,2665},{0,20,65},{0,16,2689},{31,8,2665},{0,16,2689},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,11,0},{0,11,0},{0,11,0},{0,7,4},{0,5,289},{0,5,289},{4,31,5330},{3,31,1018},{3,23,1430}, +{2,21,979},{2,31,9981},{0,26,4406},{0,21,579},{0,16,4610},{0,19,13489},{0,15,6846},{7,31,3233},{4,31,226},{6,22,146},{4,21,282},{20,2,9669},{0,26,4406},{0,21,579},{0,16,4610},{24,7,9669},{0,16,4610},{3,30,865},{3,30,865},{3,30,865},{3,19,866},{0,24,2178},{0,19,389},{0,19,389},{0,12,464},{0,12,3885},{0,11,1603},{5,27,1},{5,27,1},{5,27,1},{5,18,0},{14,1,2178}, +{0,19,389},{0,19,389},{0,12,464},{24,0,2178},{0,12,464},{28,0,2665},{3,31,153},{8,22,5},{0,22,37},{28,0,2665},{30,10,2665},{0,22,37},{0,17,2689},{30,10,2665},{0,17,2689},{3,0,865},{3,0,865},{3,0,865},{3,0,865},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{0,6,445},{0,6,445},{5,31,6270},{3,31,1626},{4,24,1886},{3,22,1299},{2,31,10381},{0,28,4146},{0,22,377}, +{0,17,4373},{0,20,14006},{0,16,6915},{8,31,3434},{6,31,242},{7,23,146},{5,22,282},{21,3,9669},{0,28,4146},{0,22,377},{0,17,4373},{28,6,9669},{0,17,4373},{3,31,1226},{3,31,1226},{3,31,1226},{3,21,1205},{0,27,2180},{0,21,274},{0,21,274},{0,13,353},{0,14,4269},{0,11,1763},{6,27,4},{6,27,4},{6,27,4},{6,19,0},{16,0,2178},{0,21,274},{0,21,274},{0,13,353},{25,1,2178}, +{0,13,353},{29,1,2665},{5,31,232},{9,23,5},{0,23,10},{29,1,2665},{31,11,2665},{0,23,10},{0,18,2689},{31,11,2665},{0,18,2689},{3,0,1201},{3,0,1201},{3,0,1201},{3,0,1201},{0,16,0},{0,16,0},{0,16,0},{0,10,4},{0,7,637},{0,7,637},{6,31,7374},{4,31,2339},{4,25,2441},{3,23,1730},{3,31,10950},{0,29,3909},{0,23,243},{0,18,4154},{0,22,14614},{0,17,7029},{9,31,3638}, +{7,31,320},{8,24,149},{6,23,282},{22,4,9669},{0,29,3909},{0,23,243},{0,18,4154},{29,7,9669},{0,18,4154},{4,31,1714},{4,31,1714},{4,31,1714},{3,22,1666},{0,29,2180},{0,23,194},{0,23,194},{0,14,260},{0,15,4686},{0,13,1937},{7,28,1},{7,28,1},{7,28,1},{7,20,1},{17,1,2178},{0,23,194},{0,23,194},{0,14,260},{26,2,2178},{0,14,260},{31,0,2665},{8,31,313},{10,24,8}, +{0,24,4},{31,0,2665},{30,13,2665},{0,24,4},{0,19,2689},{30,13,2665},{0,19,2689},{3,0,1665},{3,0,1665},{3,0,1665},{3,0,1665},{0,19,1},{0,19,1},{0,19,1},{0,11,1},{0,8,832},{0,8,832},{7,31,8807},{5,31,3388},{5,26,3116},{4,24,2243},{4,31,11766},{0,31,3686},{0,25,138},{0,19,3938},{0,23,15369},{0,18,7206},{11,31,3853},{8,31,457},{9,25,146},{7,24,299},{25,2,9669}, +{0,31,3686},{0,25,138},{0,19,3938},{27,10,9669},{0,19,3938},{5,31,2427},{5,31,2427},{5,31,2427},{4,23,2182},{0,31,2210},{0,25,137},{0,25,137},{0,15,181},{0,16,5157},{0,14,2163},{8,30,1},{8,30,1},{8,30,1},{8,21,0},{17,4,2178},{0,25,137},{0,25,137},{0,15,181},{29,2,2178},{0,15,181},{31,3,2665},{9,31,405},{11,25,2},{1,25,2},{31,3,2665},{30,15,2665},{1,25,2}, +{0,20,2689},{30,15,2665},{0,20,2689},{4,0,2178},{4,0,2178},{4,0,2178},{4,0,2178},{0,22,1},{0,22,1},{0,22,1},{0,13,0},{0,10,1125},{0,10,1125},{7,31,10230},{6,31,4421},{6,27,3739},{4,26,2742},{5,31,12634},{0,31,3719},{0,26,87},{0,20,3771},{0,25,16061},{0,19,7283},{12,31,4050},{10,31,629},{10,26,146},{8,25,282},{26,3,9669},{0,31,3718},{0,26,86},{0,20,3770},{28,11,9669}, +{0,20,3770},{5,31,3050},{5,31,3050},{5,31,3050},{5,24,2690},{1,31,2325},{0,26,86},{0,26,86},{0,16,129},{0,18,5544},{0,15,2318},{9,31,1},{9,31,1},{9,31,1},{9,22,0},{18,5,2178},{0,26,85},{0,26,85},{0,16,128},{30,3,2178},{0,16,128},{31,6,2665},{11,31,521},{12,26,5},{2,26,2},{31,6,2665},{29,17,2665},{2,26,2},{0,21,2689},{29,17,2665},{0,21,2689},{5,0,2689}, +{5,0,2689},{5,0,2689},{5,0,2689},{0,24,1},{0,24,1},{0,24,1},{0,15,5},{0,11,1348},{0,11,1348},{9,31,10738},{7,31,4899},{7,28,3705},{5,27,2742},{6,31,13045},{1,31,4002},{1,27,87},{0,21,3686},{0,27,15601},{0,20,6570},{13,31,4302},{11,31,857},{11,27,146},{9,26,282},{28,2,9669},{2,31,3954},{1,27,86},{0,21,3605},{27,13,9669},{0,21,3605},{6,31,3173},{6,31,3173},{6,31,3173}, +{6,25,2690},{2,31,2427},{1,28,83},{1,28,83},{1,17,129},{0,20,5170},{0,16,1856},{10,31,4},{10,31,4},{10,31,4},{10,23,0},{20,4,2178},{0,28,32},{0,28,32},{0,17,89},{29,5,2178},{0,17,89},{31,8,2665},{13,31,680},{13,27,5},{3,27,2},{31,8,2665},{30,18,2665},{3,27,2},{0,22,2689},{30,18,2665},{0,22,2689},{6,0,2689},{6,0,2689},{6,0,2689},{6,0,2689},{1,25,1}, +{1,25,1},{1,25,1},{1,15,10},{0,13,1217},{0,13,1217},{10,31,11278},{8,31,5402},{7,29,3750},{6,28,2745},{7,31,13510},{3,31,4314},{2,28,77},{1,22,3686},{0,28,15046},{0,21,5958},{14,31,4590},{12,31,1171},{12,28,149},{10,27,282},{29,3,9669},{3,31,4265},{2,28,76},{0,22,3458},{28,14,9669},{0,22,3458},{7,31,3314},{7,31,3314},{7,31,3314},{7,26,2690},{4,31,2532},{2,28,73},{2,28,73}, +{2,18,129},{0,21,4837},{0,17,1490},{11,31,25},{11,31,25},{11,31,25},{11,24,1},{24,0,2178},{0,30,8},{0,30,8},{0,19,49},{30,6,2178},{0,19,49},{31,11,2665},{15,31,832},{14,28,8},{4,28,4},{31,11,2665},{31,19,2665},{4,28,4},{0,23,2689},{31,19,2665},{0,23,2689},{7,0,2689},{7,0,2689},{7,0,2689},{7,0,2689},{2,26,1},{2,26,1},{2,26,1},{2,16,5},{0,14,1037}, +{0,14,1037},{11,31,11942},{10,31,6090},{9,30,3739},{7,29,2751},{9,31,14053},{4,31,4863},{3,29,79},{2,24,3689},{0,30,14558},{0,23,5274},{16,31,4858},{14,31,1556},{13,29,146},{11,28,299},{29,6,9669},{6,31,4594},{3,29,75},{0,24,3265},{31,14,9669},{0,24,3265},{9,31,3505},{9,31,3505},{9,31,3505},{8,27,2693},{5,31,2645},{3,30,72},{3,30,72},{3,19,134},{0,23,4506},{0,19,1109},{12,31,64}, +{12,31,64},{12,31,64},{12,25,0},{24,3,2178},{1,31,10},{1,31,10},{0,20,16},{28,9,2178},{0,20,16},{31,14,2665},{17,31,1053},{15,29,2},{5,29,2},{31,14,2665},{29,22,2665},{5,29,2},{0,24,2689},{29,22,2665},{0,24,2689},{8,0,2689},{8,0,2689},{8,0,2689},{8,0,2689},{3,27,5},{3,27,5},{3,27,5},{3,18,8},{0,16,818},{0,16,818},{12,31,12466},{11,31,6718},{10,31,3739}, +{8,30,2742},{10,31,14554},{6,31,5363},{4,30,87},{3,24,3654},{0,31,14190},{0,24,4785},{17,31,5158},{15,31,1938},{14,30,146},{12,29,282},{30,7,9669},{8,31,4806},{4,30,86},{0,25,3130},{30,16,9669},{0,25,3130},{10,31,3658},{10,31,3658},{10,31,3658},{9,28,2690},{6,31,2795},{4,30,86},{4,30,86},{4,20,129},{0,25,4315},{0,20,809},{14,31,100},{14,31,100},{14,31,100},{13,26,0},{22,9,2178}, +{3,31,34},{3,31,34},{0,21,1},{29,10,2178},{0,21,1},{30,18,2665},{19,31,1241},{16,30,5},{6,30,2},{30,18,2665},{30,23,2665},{6,30,2},{0,25,2689},{30,23,2665},{0,25,2689},{9,0,2689},{9,0,2689},{9,0,2689},{9,0,2689},{4,28,1},{4,28,1},{4,28,1},{4,19,5},{0,18,666},{0,18,666},{14,31,13094},{12,31,7445},{11,31,3830},{9,31,2742},{12,31,14998},{8,31,5926},{5,31,87}, +{4,25,3686},{0,31,14254},{0,25,4323},{18,31,5494},{16,31,2414},{15,31,146},{13,30,282},{29,11,9669},{10,31,5138},{5,31,86},{0,26,3013},{31,17,9669},{0,26,3013},{11,31,3829},{11,31,3829},{11,31,3829},{10,29,2690},{7,31,2981},{5,31,86},{5,31,86},{5,21,129},{0,27,4059},{0,21,597},{15,31,145},{15,31,145},{15,31,145},{14,27,0},{24,8,2178},{5,31,85},{5,31,85},{1,22,1},{30,11,2178}, +{1,22,1},{31,19,2665},{20,31,1378},{17,31,5},{7,31,2},{31,19,2665},{29,25,2665},{7,31,2},{0,26,2689},{29,25,2665},{0,26,2689},{10,0,2689},{10,0,2689},{10,0,2689},{10,0,2689},{5,29,1},{5,29,1},{5,29,1},{5,19,10},{0,20,505},{0,20,505},{15,31,12507},{13,31,7370},{12,31,4001},{11,31,2705},{13,31,14148},{8,31,5491},{6,31,154},{5,26,3063},{1,31,13399},{0,26,3306},{19,31,4949}, +{17,31,2261},{16,31,202},{15,30,185},{29,13,8712},{11,31,4644},{7,31,145},{0,27,2403},{28,20,8712},{0,27,2403},{12,31,4001},{12,31,4001},{12,31,4001},{11,30,2690},{9,31,3204},{6,31,154},{6,31,154},{6,22,129},{0,28,3762},{0,23,425},{16,31,202},{16,31,202},{16,31,202},{15,28,1},{28,4,2178},{7,31,145},{7,31,145},{2,23,1},{29,13,2178},{2,23,1},{30,22,2178},{22,31,1145},{18,31,1}, +{10,31,1},{30,22,2178},{27,27,2178},{10,31,1},{0,27,2178},{27,27,2178},{0,27,2178},{11,0,2689},{11,0,2689},{11,0,2689},{11,0,2689},{6,30,1},{6,30,1},{6,30,1},{6,20,5},{0,22,389},{0,22,389},{16,31,11658},{14,31,7195},{13,31,4225},{12,31,2693},{14,31,13066},{10,31,5014},{8,31,261},{6,27,2390},{3,31,12366},{0,27,2277},{20,31,4338},{18,31,2037},{17,31,289},{16,30,89},{29,15,7578}, +{13,31,4037},{9,31,202},{0,27,1701},{30,20,7578},{0,27,1701},{13,31,4225},{13,31,4225},{13,31,4225},{12,31,2693},{10,31,3429},{8,31,261},{8,31,261},{7,23,134},{0,30,3509},{0,24,306},{17,31,289},{17,31,289},{17,31,289},{16,29,0},{31,2,2178},{9,31,202},{9,31,202},{3,24,0},{27,16,2178},{3,24,0},{31,22,1625},{23,31,850},{20,31,0},{13,31,1},{31,22,1625},{30,26,1625},{13,31,1}, +{0,27,1665},{30,26,1625},{0,27,1665},{12,0,2689},{12,0,2689},{12,0,2689},{12,0,2689},{7,31,5},{7,31,5},{7,31,5},{7,22,8},{0,24,306},{0,24,306},{16,31,11002},{15,31,7081},{14,31,4450},{13,31,2738},{15,31,12205},{11,31,4663},{9,31,411},{7,27,1845},{4,31,11643},{0,28,1578},{21,31,3802},{20,31,1845},{18,31,388},{17,31,25},{30,15,6661},{15,31,3525},{11,31,290},{0,28,1217},{30,21,6661}, +{0,28,1217},{14,31,4450},{14,31,4450},{14,31,4450},{13,31,2738},{11,31,3675},{9,31,411},{9,31,411},{8,24,129},{0,31,3354},{0,25,244},{18,31,388},{18,31,388},{18,31,388},{17,30,0},{26,13,2178},{11,31,290},{11,31,290},{4,25,1},{21,21,2178},{4,25,1},{31,23,1201},{24,31,653},{22,31,4},{15,31,1},{31,23,1201},{30,27,1201},{15,31,1},{0,28,1201},{30,27,1201},{0,28,1201},{13,0,2689}, +{13,0,2689},{13,0,2689},{13,0,2689},{8,31,17},{8,31,17},{8,31,17},{8,23,5},{0,26,218},{0,26,218},{17,31,10434},{16,31,7010},{15,31,4693},{14,31,2833},{16,31,11374},{12,31,4462},{10,31,629},{8,28,1387},{6,31,10895},{0,28,1002},{22,31,3334},{20,31,1701},{19,31,505},{18,31,0},{30,17,5829},{16,31,3145},{12,31,405},{1,28,866},{25,25,5829},{1,28,866},{15,31,4693},{15,31,4693},{15,31,4693}, +{14,31,2833},{12,31,3906},{10,31,629},{10,31,629},{9,25,129},{1,31,3525},{0,27,228},{19,31,505},{19,31,505},{19,31,505},{18,31,0},{28,12,2178},{12,31,405},{12,31,405},{5,26,1},{22,22,2178},{5,26,1},{30,26,841},{25,31,461},{23,31,1},{18,31,0},{30,26,841},{31,27,841},{18,31,0},{0,28,865},{31,27,841},{0,28,865},{14,0,2689},{14,0,2689},{14,0,2689},{14,0,2689},{9,31,50}, +{9,31,50},{9,31,50},{9,23,10},{0,28,137},{0,28,137},{18,31,9934},{17,31,6962},{16,31,4913},{15,31,2978},{17,31,10683},{13,31,4277},{11,31,915},{9,28,994},{8,31,10078},{0,29,630},{23,31,2934},{22,31,1605},{21,31,650},{19,31,25},{31,17,5082},{18,31,2769},{14,31,521},{2,29,546},{25,26,5082},{2,29,546},{16,31,4913},{16,31,4913},{16,31,4913},{15,31,2978},{14,31,4170},{11,31,915},{11,31,915}, +{10,26,129},{3,31,3789},{1,28,226},{21,31,650},{21,31,650},{21,31,650},{19,31,25},{29,13,2178},{14,31,521},{14,31,521},{6,27,1},{28,20,2178},{6,27,1},{31,26,545},{26,31,305},{25,31,4},{20,31,1},{31,26,545},{29,29,545},{20,31,1},{0,29,545},{29,29,545},{0,29,545},{15,0,2689},{15,0,2689},{15,0,2689},{15,0,2689},{11,31,74},{11,31,74},{11,31,74},{10,24,5},{0,29,85}, +{0,29,85},{19,31,9465},{18,31,6955},{17,31,5233},{16,31,3218},{18,31,10003},{14,31,4183},{13,31,1258},{10,29,645},{9,31,9445},{1,30,409},{24,31,2529},{23,31,1525},{22,31,785},{20,31,100},{31,19,4344},{20,31,2345},{16,31,698},{5,29,321},{27,26,4344},{5,29,321},{17,31,5233},{17,31,5233},{17,31,5233},{16,31,3218},{15,31,4491},{13,31,1258},{13,31,1258},{11,27,134},{5,31,4171},{2,29,213},{22,31,785}, +{22,31,785},{22,31,785},{20,31,100},{29,16,2178},{16,31,698},{16,31,698},{7,28,0},{31,20,2178},{7,28,0},{31,27,290},{28,31,162},{26,31,4},{23,31,1},{31,27,290},{30,29,290},{23,31,1},{0,29,320},{30,29,290},{0,29,320},{16,0,2689},{16,0,2689},{16,0,2689},{16,0,2689},{12,31,113},{12,31,113},{12,31,113},{11,26,8},{0,31,45},{0,31,45},{20,31,9219},{19,31,6985},{18,31,5530}, +{17,31,3473},{19,31,9496},{15,31,4186},{14,31,1630},{12,29,426},{11,31,8961},{3,30,277},{25,31,2275},{24,31,1509},{23,31,932},{22,31,208},{30,22,3779},{21,31,2086},{18,31,850},{6,30,129},{27,27,3779},{6,30,129},{18,31,5530},{18,31,5530},{18,31,5530},{17,31,3473},{16,31,4770},{14,31,1630},{14,31,1630},{12,28,129},{8,31,4442},{3,30,213},{23,31,932},{23,31,932},{23,31,932},{22,31,208},{30,17,2178}, +{18,31,850},{18,31,850},{8,29,1},{25,25,2178},{8,29,1},{30,30,128},{29,31,72},{28,31,1},{26,31,0},{30,30,128},{30,30,128},{26,31,0},{0,30,128},{30,30,128},{0,30,128},{17,0,2689},{17,0,2689},{17,0,2689},{17,0,2689},{13,31,170},{13,31,170},{13,31,170},{12,27,5},{2,31,89},{2,31,89},{21,31,8929},{20,31,7062},{19,31,5845},{18,31,3778},{20,31,9188},{17,31,4260},{15,31,2070}, +{13,30,234},{13,31,8680},{4,31,228},{26,31,2089},{25,31,1515},{24,31,1073},{23,31,353},{30,24,3299},{22,31,1913},{20,31,965},{9,30,65},{29,27,3299},{9,30,65},{19,31,5845},{19,31,5845},{19,31,5845},{18,31,3778},{17,31,5124},{15,31,2070},{15,31,2070},{13,29,129},{9,31,4725},{4,31,228},{24,31,1073},{24,31,1073},{24,31,1073},{23,31,353},{31,18,2178},{20,31,965},{20,31,965},{9,30,1},{26,26,2178}, +{9,30,1},{31,30,34},{30,31,18},{29,31,4},{28,31,1},{31,30,34},{31,30,34},{28,31,1},{0,30,64},{31,30,34},{0,30,64},{18,0,2689},{18,0,2689},{18,0,2689},{18,0,2689},{14,31,245},{14,31,245},{14,31,245},{13,27,10},{4,31,164},{4,31,164},{22,31,8707},{21,31,7170},{21,31,6209},{19,31,4133},{21,31,8853},{18,31,4387},{17,31,2548},{14,31,170},{14,31,8388},{6,31,244},{27,31,1971}, +{26,31,1557},{25,31,1250},{24,31,565},{31,24,2904},{23,31,1826},{22,31,1145},{10,31,1},{24,31,2904},{10,31,1},{21,31,6209},{21,31,6209},{21,31,6209},{19,31,4133},{19,31,5460},{17,31,2548},{17,31,2548},{14,30,129},{11,31,5085},{6,31,244},{25,31,1250},{25,31,1250},{25,31,1250},{24,31,565},{30,22,2178},{22,31,1145},{22,31,1145},{10,31,1},{27,27,2178},{10,31,1},{31,31,0},{31,31,0},{31,31,0}, +{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{19,0,2689},{19,0,2689},{19,0,2689},{19,0,2689},{15,31,338},{15,31,338},{15,31,338},{14,28,5},{6,31,244},{6,31,244},{23,31,7705},{22,31,6418},{21,31,5633},{20,31,3845},{22,31,7654},{19,31,3874},{18,31,2310},{15,31,53},{15,31,7258},{8,31,317},{27,31,1458},{27,31,1186},{26,31,932},{25,31,425},{31,25,2166}, +{25,31,1398},{23,31,850},{13,31,1},{28,29,2166},{13,31,1},{21,31,5633},{21,31,5633},{21,31,5633},{20,31,3845},{19,31,4830},{18,31,2310},{18,31,2310},{15,31,53},{13,31,4506},{8,31,317},{26,31,932},{26,31,932},{26,31,932},{25,31,425},{31,22,1625},{23,31,850},{23,31,850},{13,31,1},{30,26,1625},{13,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0}, +{0,31,0},{31,31,0},{0,31,0},{20,0,2689},{20,0,2689},{20,0,2689},{20,0,2689},{16,31,449},{16,31,449},{16,31,449},{15,30,8},{8,31,317},{8,31,317},{24,31,6881},{23,31,5814},{22,31,5138},{21,31,3650},{23,31,6713},{20,31,3400},{19,31,2142},{16,31,5},{17,31,6397},{9,31,425},{28,31,1075},{27,31,866},{27,31,697},{26,31,320},{31,26,1601},{26,31,1041},{24,31,653},{15,31,1},{29,29,1601}, +{15,31,1},{22,31,5138},{22,31,5138},{22,31,5138},{21,31,3650},{21,31,4313},{19,31,2142},{19,31,2142},{16,31,5},{14,31,3981},{9,31,425},{27,31,697},{27,31,697},{27,31,697},{26,31,320},{31,23,1201},{24,31,653},{24,31,653},{15,31,1},{30,27,1201},{15,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{21,0,2689}, +{21,0,2689},{21,0,2689},{21,0,2689},{18,31,549},{18,31,549},{18,31,549},{16,31,5},{9,31,425},{9,31,425},{24,31,6097},{24,31,5285},{23,31,4693},{22,31,3473},{23,31,5833},{21,31,3067},{20,31,1988},{17,31,10},{18,31,5571},{11,31,541},{28,31,739},{28,31,595},{27,31,505},{27,31,233},{30,28,1121},{26,31,737},{25,31,461},{18,31,0},{28,30,1121},{18,31,0},{23,31,4693},{23,31,4693},{23,31,4693}, +{22,31,3473},{22,31,3845},{20,31,1988},{20,31,1988},{17,31,10},{15,31,3542},{11,31,541},{27,31,505},{27,31,505},{27,31,505},{27,31,233},{30,26,841},{25,31,461},{25,31,461},{18,31,0},{31,27,841},{18,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{22,0,2689},{22,0,2689},{22,0,2689},{22,0,2689},{19,31,666}, +{19,31,666},{19,31,666},{17,31,10},{11,31,541},{11,31,541},{25,31,5427},{24,31,4757},{24,31,4273},{23,31,3314},{24,31,5002},{22,31,2788},{21,31,1898},{18,31,65},{20,31,4714},{13,31,698},{29,31,489},{28,31,387},{28,31,306},{28,31,162},{30,29,726},{27,31,482},{26,31,305},{20,31,1},{29,30,726},{20,31,1},{24,31,4273},{24,31,4273},{24,31,4273},{23,31,3314},{22,31,3429},{21,31,1898},{21,31,1898}, +{18,31,65},{17,31,3213},{13,31,698},{28,31,306},{28,31,306},{28,31,306},{28,31,162},{31,26,545},{26,31,305},{26,31,305},{20,31,1},{29,29,545},{20,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{23,0,2689},{23,0,2689},{23,0,2689},{23,0,2689},{20,31,832},{20,31,832},{20,31,832},{18,31,65},{13,31,698}, +{13,31,698},{4,31,33740},{0,31,5184},{0,22,420},{0,21,4221},{3,31,45594},{0,29,24105},{0,21,8317},{0,18,24790},{0,21,63990},{0,16,38959},{2,31,9704},{0,30,2866},{0,21,389},{0,19,3229},{14,2,18065},{0,20,13257},{0,17,6153},{0,12,13481},{25,0,18065},{0,12,13481},{0,15,1},{0,15,1},{0,15,1},{0,9,1},{0,8,1105},{0,7,585},{0,7,585},{0,4,596},{0,4,1273},{0,4,740},{0,15,1}, +{0,15,1},{0,15,1},{0,9,1},{4,1,1105},{0,7,585},{0,7,585},{0,4,596},{8,0,1105},{0,4,596},{20,4,9248},{0,30,2866},{0,21,389},{0,19,3229},{20,4,9248},{29,5,9248},{0,19,3229},{0,14,9248},{29,5,9248},{0,14,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,31,38380},{1,31,6614},{0,23,245}, +{0,22,3864},{4,31,50747},{0,31,24961},{0,22,8353},{0,19,25735},{0,22,65535},{0,17,41319},{2,31,10152},{0,31,2624},{0,23,229},{0,20,2980},{16,0,19334},{0,20,13769},{0,18,6243},{0,13,14116},{25,1,19334},{0,13,14116},{0,18,0},{0,18,0},{0,18,0},{0,11,1},{0,9,1513},{0,8,772},{0,8,772},{0,5,821},{0,5,1750},{0,4,1028},{0,18,0},{0,18,0},{0,18,0},{0,11,1},{5,1,1513}, +{0,8,772},{0,8,772},{0,5,821},{9,0,1513},{0,5,821},{24,0,9248},{0,31,2624},{0,23,229},{0,20,2980},{24,0,9248},{30,6,9248},{0,20,2980},{0,15,9248},{30,6,9248},{0,15,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,31,43788},{1,31,8598},{0,24,126},{0,23,3525},{4,31,56155},{0,31,26241},{0,23,8425}, +{0,20,26793},{0,23,65535},{0,18,43819},{3,31,10706},{0,31,2624},{0,24,122},{0,21,2701},{17,0,20689},{0,22,14385},{0,19,6369},{0,13,14756},{25,2,20689},{0,13,14756},{0,21,1},{0,21,1},{0,21,1},{0,12,4},{0,10,1989},{0,9,1018},{0,9,1018},{0,6,1096},{0,5,2294},{0,5,1334},{0,21,1},{0,21,1},{0,21,1},{0,12,4},{5,2,1985},{0,9,1018},{0,9,1018},{0,6,1096},{9,1,1985}, +{0,6,1096},{25,1,9248},{0,31,2624},{0,24,122},{0,21,2701},{25,1,9248},{31,7,9248},{0,21,2701},{0,16,9250},{31,7,9248},{0,16,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{5,31,49566},{1,31,11350},{0,25,41},{0,24,3109},{4,31,62331},{0,31,28289},{0,24,8585},{0,21,27848},{0,23,65535},{0,19,46459},{4,31,11395}, +{0,31,2880},{0,25,37},{0,22,2440},{17,2,22129},{0,23,15030},{0,20,6509},{0,14,15441},{27,2,22129},{0,14,15441},{0,23,1},{0,23,1},{0,23,1},{0,14,0},{0,12,2525},{0,10,1300},{0,10,1300},{0,6,1384},{0,6,2905},{0,6,1708},{0,23,1},{0,23,1},{0,23,1},{0,14,0},{7,0,2521},{0,10,1300},{0,10,1300},{0,6,1384},{10,1,2521},{0,6,1384},{26,2,9248},{1,31,2866},{0,25,37}, +{0,22,2440},{26,2,9248},{27,11,9248},{0,22,2440},{0,17,9250},{27,11,9248},{0,17,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{5,31,56892},{2,31,15166},{0,26,20},{0,25,2804},{5,31,65535},{0,31,31511},{0,25,8733},{0,22,29095},{0,26,65535},{0,20,49444},{4,31,12385},{1,31,3380},{0,26,4},{0,23,2173},{17,4,23851}, +{0,23,15948},{0,21,6729},{0,15,16274},{29,2,23851},{0,15,16274},{0,26,0},{0,26,0},{0,26,0},{0,16,4},{0,13,3200},{0,11,1665},{0,11,1665},{0,7,1754},{0,7,3691},{0,6,2185},{0,26,0},{0,26,0},{0,26,0},{0,16,4},{2,10,3200},{0,11,1665},{0,11,1665},{0,7,1754},{13,0,3200},{0,7,1754},{24,8,9248},{3,31,3204},{0,26,4},{0,23,2173},{24,8,9248},{30,11,9248},{0,23,2173}, +{0,18,9248},{30,11,9248},{0,18,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,31,63870},{2,31,19230},{0,27,45},{0,27,2520},{5,31,65535},{1,31,35016},{0,26,8925},{0,23,30250},{0,28,65535},{0,21,52374},{5,31,13379},{2,31,4026},{0,27,29},{0,24,1901},{18,4,25472},{0,26,16706},{0,22,6963},{0,16,17124},{29,3,25472}, +{0,16,17124},{0,29,1},{0,29,1},{0,29,1},{0,17,1},{0,14,3874},{0,13,2084},{0,13,2084},{0,8,2165},{0,8,4466},{0,7,2627},{0,29,1},{0,29,1},{0,29,1},{0,17,1},{8,1,3872},{0,13,2084},{0,13,2084},{0,8,2165},{6,5,3872},{0,8,2165},{28,4,9248},{5,31,3589},{1,27,4},{0,24,1901},{28,4,9248},{29,13,9248},{0,24,1901},{0,19,9248},{29,13,9248},{0,19,9248},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,31,65535},{2,31,24002},{0,28,109},{0,27,2268},{6,31,65535},{1,31,38780},{0,27,8825},{0,24,30825},{0,28,65535},{0,22,54996},{6,31,14345},{2,31,4766},{1,28,62},{0,26,1697},{18,6,26744},{0,28,17104},{0,23,6957},{0,17,17625},{31,3,26744},{0,17,17625},{0,31,5},{0,31,5},{0,31,5}, +{0,19,5},{0,16,4418},{0,14,2306},{0,14,2306},{0,9,2420},{0,8,5122},{0,8,2997},{0,31,5},{0,31,5},{0,31,5},{0,19,5},{9,1,4418},{0,14,2306},{0,14,2306},{0,9,2420},{16,0,4418},{0,9,2420},{29,5,9248},{8,31,3904},{2,28,1},{0,26,1693},{29,5,9248},{30,14,9248},{0,26,1693},{0,20,9250},{30,14,9248},{0,20,9250},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,1}, +{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{7,31,65535},{3,31,29032},{0,29,330},{0,28,2105},{6,31,65535},{2,31,42151},{0,28,7781},{0,25,30108},{0,29,65535},{0,22,56388},{7,31,14819},{3,31,5416},{2,29,62},{0,27,1580},{23,0,26744},{0,29,16547},{0,24,6221},{0,18,17124},{30,5,26744},{0,18,17124},{1,31,84},{1,31,84},{1,31,84},{1,20,72},{0,19,4420},{0,16,2005},{0,16,2005}, +{0,10,2165},{0,9,5389},{0,9,2925},{1,31,20},{1,31,20},{1,31,20},{1,20,8},{10,2,4418},{0,16,2005},{0,16,2005},{0,10,2165},{17,1,4418},{0,10,2165},{30,6,9248},{8,31,4160},{3,29,1},{0,27,1480},{30,6,9248},{31,15,9248},{0,27,1480},{0,21,9250},{31,15,9248},{0,21,9250},{1,0,68},{1,0,68},{1,0,68},{1,0,68},{0,3,1},{0,3,1},{0,3,1},{0,2,0},{0,1,34}, +{0,1,34},{7,31,65535},{3,31,35719},{1,30,717},{0,30,2062},{7,31,65535},{2,31,46660},{0,29,6696},{0,26,29322},{0,31,65535},{0,23,58077},{9,31,15473},{5,31,6173},{3,30,65},{1,28,1601},{23,3,26744},{0,31,15992},{0,26,5346},{0,19,16582},{28,8,26744},{0,19,16582},{2,31,329},{2,31,329},{2,31,329},{1,21,189},{0,22,4420},{0,18,1737},{0,18,1737},{0,11,1898},{0,11,5707},{0,10,2885},{3,31,34}, +{3,31,34},{3,31,34},{2,21,10},{13,0,4418},{0,18,1737},{0,18,1737},{0,11,1898},{20,1,4418},{0,11,1898},{28,12,9248},{10,31,4570},{4,30,4},{0,28,1285},{28,12,9248},{22,22,9248},{0,28,1285},{0,22,9248},{22,22,9248},{0,22,9248},{1,0,185},{1,0,185},{1,0,185},{1,0,185},{0,6,1},{0,6,1},{0,6,1},{0,4,1},{0,3,97},{0,3,97},{7,31,65535},{4,31,40786},{1,31,1122}, +{0,30,2138},{7,31,65535},{2,31,49800},{0,30,5634},{0,27,27967},{0,31,65535},{0,24,58770},{10,31,15531},{6,31,6593},{4,31,61},{2,29,1533},{25,2,26259},{0,31,15284},{0,27,4514},{0,20,15812},{27,10,26259},{0,20,15812},{2,31,633},{2,31,633},{2,31,633},{2,22,381},{0,24,4418},{0,20,1480},{0,20,1480},{0,12,1640},{0,12,6125},{0,11,2891},{4,31,61},{4,31,61},{4,31,61},{3,22,10},{14,1,4418}, +{0,20,1480},{0,20,1480},{0,12,1640},{24,0,4418},{0,12,1640},{30,11,8978},{11,31,4744},{5,31,0},{0,29,1040},{30,11,8978},{31,18,8978},{0,29,1040},{0,23,8980},{31,18,8978},{0,23,8980},{2,0,377},{2,0,377},{2,0,377},{2,0,377},{0,9,0},{0,9,0},{0,9,0},{0,5,4},{0,4,193},{0,4,193},{8,31,65535},{4,31,40898},{1,31,1890},{0,31,2125},{7,31,65535},{3,31,47871},{0,30,4194}, +{0,27,24703},{0,31,65535},{0,24,56130},{11,31,14325},{8,31,6051},{5,31,100},{3,29,1218},{22,9,24371},{0,31,13716},{0,28,3402},{0,21,13989},{29,10,24371},{0,21,13989},{3,31,1058},{3,31,1058},{3,31,1058},{2,24,617},{0,27,4420},{0,22,1280},{0,22,1280},{0,13,1445},{0,14,6509},{0,12,2945},{5,31,100},{5,31,100},{5,31,100},{4,23,5},{16,0,4418},{0,22,1280},{0,22,1280},{0,13,1445},{25,1,4418}, +{0,13,1445},{29,14,7938},{13,31,4225},{7,31,4},{0,29,656},{29,14,7938},{29,20,7938},{0,29,656},{0,23,7956},{29,20,7938},{0,23,7956},{2,0,617},{2,0,617},{2,0,617},{2,0,617},{0,11,4},{0,11,4},{0,11,4},{0,7,0},{0,5,325},{0,5,325},{8,31,65535},{4,31,41266},{1,31,2914},{1,31,2170},{7,31,65535},{3,31,46175},{0,30,3010},{0,27,21695},{0,31,65535},{0,25,53636},{12,31,13140}, +{8,31,5571},{6,31,157},{4,29,932},{24,7,22568},{0,31,12404},{0,28,2474},{0,21,12245},{29,11,22568},{0,21,12245},{4,31,1630},{4,31,1630},{4,31,1630},{3,25,937},{0,29,4420},{0,23,1090},{0,23,1090},{0,14,1268},{0,15,6926},{0,13,3029},{6,31,157},{6,31,157},{6,31,157},{5,24,8},{17,1,4418},{0,23,1090},{0,23,1090},{0,14,1268},{26,2,4418},{0,14,1268},{31,12,6962},{14,31,3709},{8,31,1}, +{0,30,353},{31,12,6962},{27,22,6962},{0,30,353},{0,24,6970},{27,22,6962},{0,24,6970},{3,0,937},{3,0,937},{3,0,937},{3,0,937},{0,14,0},{0,14,0},{0,14,0},{0,8,4},{0,6,493},{0,6,493},{9,31,65535},{5,31,41956},{2,31,4257},{1,31,2512},{7,31,65535},{3,31,44573},{0,30,1984},{0,28,18569},{0,31,65535},{0,25,51026},{13,31,11930},{10,31,5125},{7,31,250},{5,29,701},{27,4,20642}, +{1,31,11209},{0,29,1634},{0,22,10422},{31,11,20642},{0,22,10422},{4,31,2350},{4,31,2350},{4,31,2350},{3,27,1361},{0,31,4450},{0,25,949},{0,25,949},{0,16,1096},{0,16,7397},{0,14,3171},{7,31,250},{7,31,250},{7,31,250},{6,25,10},{17,4,4418},{0,25,949},{0,25,949},{0,16,1096},{29,2,4418},{0,16,1096},{30,15,5941},{15,31,3176},{10,31,0},{0,30,128},{30,15,5941},{30,21,5941},{0,30,128}, +{0,24,5953},{30,21,5941},{0,24,5953},{3,0,1360},{3,0,1360},{3,0,1360},{3,0,1360},{0,17,0},{0,17,0},{0,17,0},{0,10,1},{0,8,697},{0,8,697},{9,31,65535},{5,31,42660},{2,31,5617},{1,31,3088},{8,31,65535},{3,31,43421},{0,31,1250},{0,28,15865},{0,31,65535},{0,25,48978},{13,31,10922},{11,31,4753},{8,31,360},{6,30,509},{28,4,19021},{2,31,10246},{0,30,1088},{0,23,8945},{29,13,19021}, +{0,23,8945},{5,31,3131},{5,31,3131},{5,31,3131},{4,28,1822},{1,31,4580},{0,28,776},{0,28,776},{0,17,925},{0,18,7893},{0,15,3333},{8,31,360},{8,31,360},{8,31,360},{7,26,10},{18,5,4418},{0,28,776},{0,28,776},{0,17,925},{30,3,4418},{0,17,925},{31,15,5101},{17,31,2777},{11,31,9},{0,31,25},{31,15,5101},{30,22,5101},{0,31,25},{0,25,5105},{30,22,5101},{0,25,5105},{4,0,1818}, +{4,0,1818},{4,0,1818},{4,0,1818},{0,20,1},{0,20,1},{0,20,1},{0,12,1},{0,9,925},{0,9,925},{9,31,65535},{5,31,43620},{2,31,7233},{1,31,3920},{8,31,65535},{3,31,42525},{0,31,738},{0,28,13417},{0,31,65535},{0,25,47186},{14,31,9978},{11,31,4449},{10,31,452},{7,30,354},{31,1,17485},{3,31,9369},{0,30,704},{0,24,7570},{31,13,17485},{0,24,7570},{6,31,4058},{6,31,4058},{6,31,4058}, +{4,29,2315},{2,31,4874},{0,29,610},{0,29,610},{0,18,772},{0,20,8427},{0,16,3497},{10,31,452},{10,31,452},{10,31,452},{8,27,5},{20,4,4418},{0,29,610},{0,29,610},{0,18,772},{29,5,4418},{0,18,772},{31,16,4325},{18,31,2357},{13,31,0},{1,31,0},{31,16,4325},{31,22,4325},{1,31,0},{0,25,4337},{31,22,4325},{0,25,4337},{4,0,2314},{4,0,2314},{4,0,2314},{4,0,2314},{0,22,1}, +{0,22,1},{0,22,1},{0,13,4},{0,10,1189},{0,10,1189},{9,31,65535},{5,31,44836},{2,31,9105},{2,31,4905},{8,31,65535},{3,31,41885},{0,31,482},{0,28,11225},{0,31,65535},{0,26,45590},{15,31,9102},{13,31,4161},{11,31,557},{9,30,212},{29,6,16034},{5,31,8602},{0,31,482},{0,24,6242},{31,14,16034},{0,24,6242},{6,31,5066},{6,31,5066},{6,31,5066},{5,30,2907},{2,31,5322},{0,31,482},{0,31,482}, +{0,19,637},{0,20,8939},{0,17,3725},{11,31,557},{11,31,557},{11,31,557},{9,28,8},{24,0,4418},{0,31,482},{0,31,482},{0,19,637},{30,6,4418},{0,19,637},{30,19,3613},{20,31,1940},{15,31,4},{4,31,1},{30,19,3613},{31,23,3613},{4,31,1},{0,26,3617},{31,23,3613},{0,26,3617},{5,0,2906},{5,0,2906},{5,0,2906},{5,0,2906},{0,25,1},{0,25,1},{0,25,1},{0,15,0},{0,11,1489}, +{0,11,1489},{9,31,65535},{5,31,46510},{3,31,11362},{2,31,6237},{9,31,65535},{3,31,41471},{0,31,500},{0,29,8976},{0,31,65535},{0,26,43934},{16,31,8139},{14,31,3853},{12,31,680},{10,30,109},{26,13,14504},{8,31,7667},{0,31,500},{0,25,4979},{21,21,14504},{0,25,4979},{7,31,6337},{7,31,6337},{7,31,6337},{5,31,3642},{3,31,5962},{0,31,500},{0,31,500},{0,20,520},{0,22,9629},{0,18,4035},{12,31,680}, +{12,31,680},{12,31,680},{10,29,10},{24,3,4418},{0,31,500},{0,31,500},{0,20,520},{28,9,4418},{0,20,520},{31,19,2888},{20,31,1517},{16,31,1},{7,31,1},{31,19,2888},{27,26,2888},{7,31,1},{0,26,2906},{27,26,2888},{0,26,2906},{5,0,3617},{5,0,3617},{5,0,3617},{5,0,3617},{0,28,1},{0,28,1},{0,28,1},{0,17,4},{0,11,1930},{0,11,1930},{10,31,65535},{6,31,48082},{3,31,13570}, +{2,31,7693},{9,31,65535},{3,31,41375},{0,31,788},{0,29,7120},{0,31,65535},{0,26,42734},{17,31,7409},{15,31,3625},{13,31,821},{11,31,45},{28,11,13235},{8,31,6899},{2,31,628},{0,25,3987},{31,16,13235},{0,25,3987},{7,31,7681},{7,31,7681},{7,31,7681},{6,31,4437},{4,31,6659},{1,31,738},{1,31,738},{0,21,421},{0,23,10286},{0,20,4305},{13,31,821},{13,31,821},{13,31,821},{11,30,10},{22,9,4418}, +{2,31,628},{2,31,628},{0,21,421},{29,10,4418},{0,21,421},{31,20,2312},{21,31,1217},{18,31,1},{9,31,0},{31,20,2312},{30,25,2312},{9,31,0},{0,27,2314},{30,25,2312},{0,27,2314},{6,0,4337},{6,0,4337},{6,0,4337},{6,0,4337},{0,30,1},{0,30,1},{0,30,1},{0,18,1},{0,13,2329},{0,13,2329},{10,31,65535},{6,31,49890},{3,31,16034},{2,31,9405},{9,31,65535},{4,31,41526},{0,31,1332}, +{0,29,5520},{0,31,65535},{0,26,41790},{18,31,6747},{16,31,3459},{14,31,980},{12,31,5},{31,8,12051},{10,31,6275},{4,31,801},{0,26,3066},{28,19,12051},{0,26,3066},{8,31,9062},{8,31,9062},{8,31,9062},{7,31,5410},{4,31,7555},{1,31,1154},{1,31,1154},{0,23,325},{0,23,11118},{0,20,4625},{14,31,980},{14,31,980},{14,31,980},{12,31,5},{24,8,4418},{4,31,801},{4,31,801},{0,23,325},{30,11,4418}, +{0,23,325},{30,23,1800},{23,31,949},{19,31,4},{12,31,1},{30,23,1800},{28,27,1800},{12,31,1},{0,27,1818},{28,27,1800},{0,27,1818},{6,0,5105},{6,0,5105},{6,0,5105},{6,0,5105},{0,31,36},{0,31,36},{0,31,36},{0,20,4},{0,15,2741},{0,15,2741},{10,31,65535},{6,31,51954},{3,31,18754},{3,31,11330},{9,31,65535},{4,31,41798},{1,31,2082},{0,29,4176},{0,31,65535},{0,27,41092},{19,31,6153}, +{17,31,3297},{16,31,1154},{13,31,20},{29,13,10952},{11,31,5708},{6,31,965},{0,27,2291},{28,20,10952},{0,27,2291},{9,31,10545},{9,31,10545},{9,31,10545},{7,31,6482},{5,31,8549},{2,31,1716},{2,31,1716},{0,24,221},{0,26,11876},{0,22,4989},{16,31,1154},{16,31,1154},{16,31,1154},{13,31,20},{28,4,4418},{6,31,965},{6,31,965},{0,24,221},{29,13,4418},{0,24,221},{29,26,1352},{23,31,725},{21,31,0}, +{14,31,1},{29,26,1352},{31,26,1352},{14,31,1},{0,28,1360},{31,26,1352},{0,28,1360},{7,0,5953},{7,0,5953},{7,0,5953},{7,0,5953},{1,31,145},{1,31,145},{1,31,145},{0,21,1},{0,16,3130},{0,16,3130},{10,31,65535},{6,31,54582},{4,31,21886},{3,31,13652},{9,31,65535},{4,31,42410},{1,31,3144},{0,30,2841},{0,31,65535},{0,27,40390},{19,31,5649},{18,31,3157},{17,31,1325},{15,31,74},{29,15,9818}, +{13,31,5241},{8,31,1108},{0,27,1589},{30,20,9818},{0,27,1589},{10,31,12376},{10,31,12376},{10,31,12376},{8,31,7844},{6,31,9861},{3,31,2576},{3,31,2576},{0,25,136},{0,28,12696},{0,23,5429},{17,31,1325},{17,31,1325},{17,31,1325},{15,31,74},{31,2,4418},{8,31,1108},{8,31,1108},{0,25,136},{27,16,4418},{0,25,136},{31,24,925},{25,31,505},{23,31,1},{17,31,1},{31,24,925},{31,27,925},{17,31,1}, +{0,28,937},{31,27,925},{0,28,937},{7,0,6970},{7,0,6970},{7,0,6970},{7,0,6970},{1,31,388},{1,31,388},{1,31,388},{0,23,0},{0,17,3665},{0,17,3665},{10,31,65535},{7,31,57052},{4,31,24910},{3,31,15988},{9,31,65535},{4,31,43226},{1,31,4360},{0,30,1833},{0,31,65535},{0,27,40038},{21,31,5202},{19,31,3073},{18,31,1508},{16,31,180},{30,15,8901},{14,31,4814},{10,31,1300},{0,28,1021},{30,21,8901}, +{0,28,1021},{10,31,14136},{10,31,14136},{10,31,14136},{8,31,9252},{7,31,11195},{3,31,3536},{3,31,3536},{0,26,85},{0,29,13491},{0,23,5925},{18,31,1508},{18,31,1508},{18,31,1508},{16,31,180},{26,13,4418},{10,31,1300},{10,31,1300},{0,26,85},{21,21,4418},{0,26,85},{30,27,613},{26,31,337},{24,31,1},{20,31,1},{30,27,613},{30,28,613},{20,31,1},{0,29,617},{30,28,613},{0,29,617},{8,0,7956}, +{8,0,7956},{8,0,7956},{8,0,7956},{2,31,697},{2,31,697},{2,31,697},{0,25,4},{0,18,4181},{0,18,4181},{11,31,65535},{7,31,59708},{4,31,28190},{3,31,18580},{10,31,65535},{5,31,44295},{1,31,5832},{0,30,1081},{0,31,65535},{0,27,39942},{22,31,4818},{20,31,3017},{19,31,1709},{17,31,325},{30,17,8069},{15,31,4473},{11,31,1514},{0,29,602},{25,25,8069},{0,29,602},{11,31,15965},{11,31,15965},{11,31,15965}, +{9,31,10757},{7,31,12667},{4,31,4662},{4,31,4662},{0,27,52},{0,30,14340},{0,25,6449},{19,31,1709},{19,31,1709},{19,31,1709},{17,31,325},{28,12,4418},{11,31,1514},{11,31,1514},{0,27,52},{22,22,4418},{0,27,52},{31,27,365},{27,31,205},{26,31,1},{22,31,1},{31,27,365},{30,29,365},{22,31,1},{0,29,377},{30,29,365},{0,29,377},{8,0,8980},{8,0,8980},{8,0,8980},{8,0,8980},{2,31,1097}, +{2,31,1097},{2,31,1097},{0,26,1},{0,20,4682},{0,20,4682},{11,31,65535},{8,31,58981},{5,31,29551},{4,31,19751},{10,31,65535},{5,31,43215},{2,31,6910},{1,30,686},{0,31,65535},{0,28,34909},{23,31,4502},{21,31,3011},{20,31,1973},{18,31,520},{31,17,7322},{17,31,4242},{13,31,1769},{0,29,314},{25,26,7322},{0,29,314},{12,31,16739},{12,31,16739},{12,31,16739},{10,31,11492},{8,31,13636},{5,31,5510},{5,31,5510}, +{1,28,54},{0,31,14139},{0,26,6041},{20,31,1973},{20,31,1973},{20,31,1973},{18,31,520},{29,13,4418},{13,31,1769},{13,31,1769},{0,28,29},{28,20,4418},{0,28,29},{31,28,181},{28,31,97},{27,31,4},{25,31,0},{31,28,181},{31,29,181},{25,31,0},{0,30,185},{31,29,181},{0,30,185},{9,0,9248},{9,0,9248},{9,0,9248},{9,0,9248},{3,31,1348},{3,31,1348},{3,31,1348},{1,27,5},{0,21,4520}, +{0,21,4520},{12,31,65535},{9,31,57270},{6,31,30345},{5,31,20521},{11,31,65535},{6,31,41449},{3,31,8015},{2,31,301},{0,31,65535},{0,28,28330},{24,31,4181},{22,31,3053},{21,31,2248},{20,31,772},{31,19,6584},{20,31,3941},{15,31,2041},{0,30,77},{27,26,6584},{0,30,77},{13,31,17289},{13,31,17289},{13,31,17289},{11,31,12050},{10,31,14315},{7,31,6389},{7,31,6389},{2,29,53},{0,31,13860},{0,28,5286},{21,31,2248}, +{21,31,2248},{21,31,2248},{20,31,772},{29,16,4418},{15,31,2041},{15,31,2041},{0,30,13},{31,20,4418},{0,30,13},{30,31,50},{30,31,34},{29,31,0},{28,31,1},{30,31,50},{31,30,50},{28,31,1},{0,30,68},{31,30,50},{0,30,68},{10,0,9250},{10,0,9250},{10,0,9250},{10,0,9250},{4,31,1549},{4,31,1549},{4,31,1549},{2,28,2},{0,23,4114},{0,23,4114},{13,31,65535},{9,31,55894},{7,31,31068}, +{6,31,21256},{12,31,65535},{8,31,39740},{4,31,9073},{3,31,90},{0,31,65535},{0,29,23356},{24,31,3973},{23,31,3125},{23,31,2500},{21,31,1037},{30,22,6019},{20,31,3701},{17,31,2340},{0,31,4},{27,27,6019},{0,31,4},{14,31,17796},{14,31,17796},{14,31,17796},{12,31,12625},{11,31,14957},{8,31,7139},{8,31,7139},{3,30,53},{0,31,14020},{0,29,4652},{23,31,2500},{23,31,2500},{23,31,2500},{21,31,1037},{30,17,4418}, +{17,31,2340},{17,31,2340},{0,31,4},{25,25,4418},{0,31,4},{31,31,4},{31,31,4},{31,31,4},{30,31,1},{31,31,4},{31,31,4},{30,31,1},{0,31,4},{31,31,4},{0,31,4},{11,0,9250},{11,0,9250},{11,0,9250},{11,0,9250},{6,31,1765},{6,31,1765},{6,31,1765},{3,29,2},{0,25,3877},{0,25,3877},{13,31,65535},{10,31,53236},{8,31,30487},{7,31,21105},{13,31,65535},{8,31,37332},{5,31,9177}, +{4,31,36},{1,31,65535},{0,29,18680},{25,31,3443},{24,31,2741},{23,31,2248},{22,31,980},{29,25,5163},{21,31,3218},{20,31,2117},{3,31,1},{30,26,5163},{3,31,1},{15,31,17289},{15,31,17289},{15,31,17289},{13,31,12512},{12,31,14328},{9,31,7149},{9,31,7149},{4,31,20},{0,31,13376},{0,29,3944},{23,31,2248},{23,31,2248},{23,31,2248},{22,31,980},{31,17,3872},{20,31,2117},{20,31,2117},{3,31,1},{25,26,3872}, +{3,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{12,0,9248},{12,0,9248},{12,0,9248},{12,0,9248},{7,31,1972},{7,31,1972},{7,31,1972},{4,30,5},{0,27,3545},{0,27,3545},{14,31,65535},{11,31,50266},{9,31,29322},{8,31,20567},{13,31,65535},{9,31,35025},{6,31,8985},{5,31,21},{2,31,65535},{0,29,14712},{26,31,2873}, +{25,31,2283},{24,31,1825},{22,31,820},{30,24,4267},{22,31,2657},{20,31,1685},{5,31,1},{29,27,4267},{5,31,1},{16,31,16427},{16,31,16427},{16,31,16427},{14,31,12185},{13,31,13442},{10,31,6915},{10,31,6915},{5,31,5},{1,31,12539},{0,30,3314},{24,31,1825},{24,31,1825},{24,31,1825},{22,31,820},{28,23,3200},{20,31,1685},{20,31,1685},{5,31,1},{28,25,3200},{5,31,1},{31,31,0},{31,31,0},{31,31,0}, +{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{13,0,9248},{13,0,9248},{13,0,9248},{13,0,9248},{8,31,2250},{8,31,2250},{8,31,2250},{5,31,5},{0,28,3170},{0,28,3170},{15,31,65535},{12,31,47239},{10,31,28065},{9,31,20104},{14,31,65535},{10,31,32574},{7,31,8839},{6,31,54},{3,31,64890},{0,30,10964},{26,31,2252},{25,31,1806},{25,31,1445},{23,31,650},{30,25,3361}, +{23,31,2091},{21,31,1322},{8,31,0},{30,27,3361},{8,31,0},{17,31,15584},{17,31,15584},{17,31,15584},{15,31,11846},{14,31,12522},{11,31,6697},{11,31,6697},{6,31,50},{3,31,11669},{0,31,2834},{25,31,1445},{25,31,1445},{25,31,1445},{23,31,650},{30,21,2521},{21,31,1322},{21,31,1322},{8,31,0},{31,24,2521},{8,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0}, +{0,31,0},{31,31,0},{0,31,0},{14,0,9250},{14,0,9250},{14,0,9250},{14,0,9250},{9,31,2525},{9,31,2525},{9,31,2525},{6,31,50},{0,31,2834},{0,31,2834},{16,31,65535},{13,31,44559},{11,31,27000},{10,31,19705},{15,31,64179},{11,31,30525},{8,31,8677},{7,31,149},{3,31,60570},{0,30,8308},{27,31,1782},{26,31,1416},{25,31,1157},{24,31,520},{30,26,2646},{23,31,1691},{22,31,1040},{11,31,1},{31,27,2646}, +{11,31,1},{18,31,14889},{18,31,14889},{18,31,14889},{16,31,11585},{15,31,11778},{12,31,6555},{12,31,6555},{7,31,145},{3,31,11061},{0,31,2610},{25,31,1157},{25,31,1157},{25,31,1157},{24,31,520},{31,21,1985},{22,31,1040},{22,31,1040},{11,31,1},{31,25,1985},{11,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{15,0,9250}, +{15,0,9250},{15,0,9250},{15,0,9250},{10,31,2792},{10,31,2792},{10,31,2792},{7,31,145},{0,31,2610},{0,31,2610},{16,31,63318},{14,31,42019},{12,31,25930},{11,31,19324},{16,31,59178},{11,31,28845},{9,31,8605},{8,31,276},{6,31,56253},{0,30,6420},{27,31,1366},{27,31,1094},{26,31,872},{25,31,397},{30,27,2017},{25,31,1298},{23,31,794},{13,31,1},{30,28,2017},{13,31,1},{19,31,14244},{19,31,14244},{19,31,14244}, +{17,31,11312},{16,31,11037},{13,31,6429},{13,31,6429},{8,31,260},{6,31,10457},{0,31,2642},{26,31,872},{26,31,872},{26,31,872},{25,31,397},{31,22,1513},{23,31,794},{23,31,794},{13,31,1},{29,27,1513},{13,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{16,0,9248},{16,0,9248},{16,0,9248},{16,0,9248},{12,31,3074}, +{12,31,3074},{12,31,3074},{8,31,260},{0,31,2642},{0,31,2642},{17,31,58848},{15,31,39619},{13,31,24975},{12,31,19007},{16,31,54474},{13,31,27057},{10,31,8569},{9,31,461},{8,31,51302},{0,31,5046},{28,31,979},{27,31,806},{27,31,637},{26,31,292},{31,26,1473},{26,31,953},{24,31,605},{16,31,0},{29,29,1473},{16,31,0},{19,31,13604},{19,31,13604},{19,31,13604},{18,31,11057},{16,31,10429},{14,31,6339},{14,31,6339}, +{10,31,424},{8,31,9713},{1,31,2900},{27,31,637},{27,31,637},{27,31,637},{26,31,292},{30,25,1105},{24,31,605},{24,31,605},{16,31,0},{30,27,1105},{16,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{17,0,9248},{17,0,9248},{17,0,9248},{17,0,9248},{12,31,3330},{12,31,3330},{12,31,3330},{10,31,424},{1,31,2900}, +{1,31,2900}, +/**** ended inlining basisu_transcoder_tables_atc_55.inc ****/ + }; + + static const etc1s_to_atc_solution g_etc1s_to_atc_56[32 * 8 * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS * NUM_ETC1S_TO_ATC_SELECTOR_RANGES] = { +/**** start inlining basisu_transcoder_tables_atc_56.inc ****/ +{0,3,20},{0,3,5},{0,2,1},{0,2,9},{0,2,35},{0,2,27},{0,1,17},{0,1,24},{0,1,41},{0,1,25},{0,3,20},{0,3,5},{0,2,1},{0,2,9},{0,2,35},{0,2,27},{0,1,17},{0,1,24},{1,0,35},{0,1,24},{0,1,1},{0,1,1},{0,1,1},{0,1,0},{0,1,2},{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{0,1,1}, +{0,1,1},{0,1,1},{0,1,0},{0,1,2},{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{1,0,18},{0,3,5},{0,2,1},{0,2,9},{1,0,18},{1,1,18},{0,2,9},{0,1,20},{1,1,18},{0,1,20},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,9,54},{0,7,37},{0,4,52}, +{0,4,36},{0,7,52},{0,5,21},{0,4,0},{0,3,21},{0,4,88},{0,3,37},{1,5,24},{1,5,9},{1,4,5},{1,4,13},{2,1,51},{0,5,21},{0,4,0},{0,3,21},{3,1,51},{0,3,21},{0,7,36},{0,7,36},{0,7,36},{0,4,36},{0,5,10},{0,4,0},{0,4,0},{0,2,5},{0,3,26},{0,2,14},{1,3,5},{1,3,5},{1,3,5},{1,3,4},{1,2,8}, +{0,4,0},{0,4,0},{0,2,5},{2,1,8},{0,2,5},{2,2,18},{0,7,1},{1,4,1},{0,4,0},{2,2,18},{2,3,18},{0,4,0},{0,3,20},{2,3,18},{0,3,20},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,4,0},{0,4,0},{0,4,0},{0,2,1},{0,2,10},{0,2,10},{1,11,54},{1,9,37},{1,6,52},{1,6,36},{1,9,52},{1,7,21},{1,6,0}, +{1,5,21},{0,7,63},{0,5,25},{2,7,24},{2,7,9},{2,6,5},{2,6,13},{3,3,51},{1,7,21},{1,6,0},{1,5,21},{4,3,51},{1,5,21},{1,9,36},{1,9,36},{1,9,36},{1,6,36},{1,7,10},{1,6,0},{1,6,0},{1,4,5},{0,6,11},{0,5,9},{2,5,5},{2,5,5},{2,5,5},{2,5,4},{3,1,8},{1,6,0},{1,6,0},{1,4,5},{3,3,8}, +{1,4,5},{3,4,18},{1,9,1},{2,6,1},{1,6,0},{3,4,18},{7,0,18},{1,6,0},{0,5,20},{7,0,18},{0,5,20},{1,0,36},{1,0,36},{1,0,36},{1,0,36},{1,6,0},{1,6,0},{1,6,0},{1,4,1},{0,6,2},{0,6,2},{2,13,54},{2,11,37},{2,8,52},{2,8,36},{2,11,52},{2,9,21},{2,8,0},{2,7,21},{0,11,51},{1,7,25},{3,9,24}, +{3,9,9},{3,8,5},{3,8,13},{5,1,51},{2,9,21},{2,8,0},{2,7,21},{9,0,51},{2,7,21},{2,11,36},{2,11,36},{2,11,36},{2,8,36},{2,9,10},{2,8,0},{2,8,0},{2,6,5},{1,8,11},{1,7,9},{3,7,5},{3,7,5},{3,7,5},{3,7,4},{3,6,8},{2,8,0},{2,8,0},{2,6,5},{8,0,8},{2,6,5},{4,6,18},{2,11,1},{3,8,1}, +{2,8,0},{4,6,18},{8,2,18},{2,8,0},{0,7,20},{8,2,18},{0,7,20},{2,0,36},{2,0,36},{2,0,36},{2,0,36},{2,8,0},{2,8,0},{2,8,0},{2,6,1},{1,8,2},{1,8,2},{3,15,70},{3,13,51},{4,10,69},{3,10,52},{3,14,52},{3,12,25},{3,10,4},{3,9,27},{1,13,53},{2,10,26},{4,12,22},{4,11,12},{4,10,5},{4,10,9},{6,4,51}, +{2,13,22},{3,10,3},{3,9,26},{11,1,51},{3,9,26},{3,13,51},{3,13,51},{3,13,51},{3,10,51},{3,12,9},{3,11,2},{3,11,2},{3,9,2},{2,11,9},{3,9,10},{4,10,4},{4,10,4},{4,10,4},{4,9,5},{6,2,8},{3,11,1},{3,11,1},{3,9,1},{11,0,8},{3,9,1},{7,2,18},{3,13,1},{4,10,1},{3,10,2},{7,2,18},{11,2,18},{3,10,2}, +{0,9,26},{11,2,18},{0,9,26},{3,0,50},{3,0,50},{3,0,50},{3,0,50},{3,11,1},{3,11,1},{3,11,1},{3,9,1},{2,10,0},{2,10,0},{4,17,54},{4,15,36},{4,13,54},{4,12,38},{4,15,52},{4,14,24},{4,12,3},{4,11,26},{2,15,53},{3,12,26},{5,14,22},{5,13,12},{5,12,5},{5,12,9},{8,2,51},{3,15,22},{4,12,3},{4,11,26},{12,3,51}, +{4,11,26},{4,15,36},{4,15,36},{4,15,36},{4,12,37},{4,14,8},{4,12,2},{4,12,2},{4,11,1},{3,13,9},{3,11,14},{5,12,4},{5,12,4},{5,12,4},{5,11,5},{8,0,8},{4,12,2},{4,12,2},{4,11,1},{11,3,8},{4,11,1},{9,0,18},{4,15,0},{5,12,1},{4,12,2},{9,0,18},{15,0,18},{4,12,2},{0,11,26},{15,0,18},{0,11,26},{4,0,36}, +{4,0,36},{4,0,36},{4,0,36},{4,12,1},{4,12,1},{4,12,1},{4,11,0},{3,12,0},{3,12,0},{5,19,54},{5,17,37},{5,15,54},{5,14,38},{5,17,52},{5,15,27},{5,14,3},{5,13,26},{3,17,52},{4,14,26},{6,15,24},{6,15,12},{6,14,5},{6,14,9},{10,1,51},{4,17,21},{5,14,3},{5,13,26},{17,0,51},{5,13,26},{5,17,36},{5,17,36},{5,17,36}, +{5,14,37},{5,15,10},{5,14,2},{5,14,2},{5,13,1},{4,15,12},{4,13,11},{6,14,4},{6,14,4},{6,14,4},{6,13,5},{9,2,8},{5,14,2},{5,14,2},{5,13,1},{16,0,8},{5,13,1},{10,2,18},{5,17,1},{6,14,1},{5,14,2},{10,2,18},{16,2,18},{5,14,2},{0,13,26},{16,2,18},{0,13,26},{5,0,36},{5,0,36},{5,0,36},{5,0,36},{5,14,1}, +{5,14,1},{5,14,1},{5,13,0},{4,14,0},{4,14,0},{6,21,54},{6,19,37},{6,16,52},{6,16,36},{6,19,52},{6,17,21},{6,16,0},{6,15,26},{4,19,51},{5,15,36},{7,17,24},{7,17,9},{7,16,5},{7,16,13},{11,3,51},{6,17,21},{6,16,0},{6,15,26},{18,2,51},{6,15,26},{6,19,36},{6,19,36},{6,19,36},{6,16,36},{6,17,10},{6,16,0},{6,16,0}, +{6,15,1},{5,16,11},{5,15,11},{7,15,5},{7,15,5},{7,15,5},{7,15,5},{11,1,8},{6,16,0},{6,16,0},{6,15,1},{17,2,8},{6,15,1},{11,4,18},{6,19,1},{7,16,1},{6,16,0},{11,4,18},{17,4,18},{6,16,0},{0,15,26},{17,4,18},{0,15,26},{6,0,36},{6,0,36},{6,0,36},{6,0,36},{6,16,0},{6,16,0},{6,16,0},{6,15,0},{5,16,2}, +{5,16,2},{7,23,70},{7,21,51},{8,18,69},{7,18,52},{7,22,52},{7,20,25},{7,18,4},{7,17,27},{5,21,53},{6,18,26},{8,20,22},{8,19,12},{8,18,5},{8,18,9},{13,2,51},{6,21,22},{7,18,3},{7,17,26},{21,2,51},{7,17,26},{7,21,51},{7,21,51},{7,21,51},{7,18,51},{7,20,9},{7,19,2},{7,19,2},{7,17,2},{6,19,9},{7,17,10},{8,18,4}, +{8,18,4},{8,18,4},{8,17,5},{13,0,8},{7,19,1},{7,19,1},{7,17,1},{20,2,8},{7,17,1},{14,0,18},{7,21,1},{8,18,1},{7,18,2},{14,0,18},{20,4,18},{7,18,2},{0,17,26},{20,4,18},{0,17,26},{7,0,50},{7,0,50},{7,0,50},{7,0,50},{7,19,1},{7,19,1},{7,19,1},{7,17,1},{6,18,0},{6,18,0},{8,25,54},{8,23,36},{8,21,54}, +{8,20,38},{8,24,51},{8,22,24},{8,20,3},{8,19,26},{6,23,53},{7,20,26},{9,22,22},{9,21,12},{9,20,5},{9,20,9},{14,4,51},{7,23,22},{8,20,3},{8,19,26},{25,0,51},{8,19,26},{8,23,36},{8,23,36},{8,23,36},{8,20,37},{8,22,8},{8,20,2},{8,20,2},{8,19,1},{7,21,9},{7,19,14},{9,20,4},{9,20,4},{9,20,4},{9,19,5},{14,2,8}, +{8,20,2},{8,20,2},{8,19,1},{24,0,8},{8,19,1},{15,2,18},{8,23,0},{9,20,1},{8,20,2},{15,2,18},{25,1,18},{8,20,2},{0,19,26},{25,1,18},{0,19,26},{8,0,36},{8,0,36},{8,0,36},{8,0,36},{8,20,1},{8,20,1},{8,20,1},{8,19,0},{7,20,0},{7,20,0},{9,27,54},{9,25,36},{9,23,54},{9,22,38},{9,26,51},{9,24,24},{9,22,3}, +{9,21,26},{7,25,53},{8,22,26},{10,24,22},{10,23,12},{10,22,5},{10,22,9},{16,2,51},{8,25,19},{9,22,3},{9,21,26},{27,1,51},{9,21,26},{9,25,36},{9,25,36},{9,25,36},{9,22,37},{9,24,8},{9,22,2},{9,22,2},{9,21,1},{8,23,12},{8,21,11},{10,22,4},{10,22,4},{10,22,4},{10,21,5},{16,0,8},{9,22,2},{9,22,2},{9,21,1},{26,1,8}, +{9,21,1},{17,0,18},{9,25,0},{10,22,1},{9,22,2},{17,0,18},{26,3,18},{9,22,2},{0,21,26},{26,3,18},{0,21,26},{9,0,36},{9,0,36},{9,0,36},{9,0,36},{9,22,1},{9,22,1},{9,22,1},{9,21,0},{8,22,0},{8,22,0},{10,29,54},{10,27,36},{10,25,54},{10,24,38},{10,28,51},{10,26,24},{10,24,3},{10,23,26},{8,27,52},{9,24,26},{11,26,22}, +{11,25,12},{11,24,5},{11,24,9},{17,4,51},{9,27,19},{10,24,3},{10,23,26},{27,4,51},{10,23,26},{10,27,36},{10,27,36},{10,27,36},{10,24,37},{10,26,8},{10,24,2},{10,24,2},{10,23,1},{9,25,12},{9,23,11},{11,24,4},{11,24,4},{11,24,4},{11,23,5},{17,2,8},{10,24,2},{10,24,2},{10,23,1},{27,3,8},{10,23,1},{18,2,18},{10,27,0},{11,24,1}, +{10,24,2},{18,2,18},{31,0,18},{10,24,2},{0,23,26},{31,0,18},{0,23,26},{10,0,36},{10,0,36},{10,0,36},{10,0,36},{10,24,1},{10,24,1},{10,24,1},{10,23,0},{9,24,0},{9,24,0},{11,31,70},{11,29,52},{11,27,70},{11,27,54},{11,30,53},{11,28,20},{11,27,5},{11,26,25},{10,28,56},{10,26,22},{12,28,22},{12,27,9},{12,26,8},{12,26,9},{19,3,51}, +{11,28,19},{11,27,4},{10,26,21},{30,4,51},{10,26,21},{11,30,50},{11,30,50},{11,30,50},{11,27,50},{11,28,11},{11,27,1},{11,27,1},{11,25,2},{10,27,11},{11,25,10},{12,26,4},{12,26,4},{12,26,4},{12,25,5},{19,1,8},{11,27,0},{11,27,0},{11,25,1},{29,4,8},{11,25,1},{20,1,18},{11,29,2},{12,26,4},{11,27,4},{20,1,18},{29,6,18},{11,27,4}, +{0,26,20},{29,6,18},{0,26,20},{11,0,50},{11,0,50},{11,0,50},{11,0,50},{11,27,1},{11,27,1},{11,27,1},{11,25,2},{10,26,2},{10,26,2},{12,33,54},{12,31,37},{12,29,56},{12,29,41},{12,32,51},{12,30,22},{12,29,5},{12,28,24},{11,30,56},{11,28,22},{13,30,22},{13,29,9},{13,28,8},{13,28,9},{20,5,51},{12,30,22},{12,29,5},{11,28,21},{31,6,51}, +{11,28,21},{12,31,37},{12,31,37},{12,31,37},{12,29,37},{12,30,8},{12,29,1},{12,29,1},{12,27,0},{11,29,11},{12,27,9},{13,28,4},{13,28,4},{13,28,4},{13,27,5},{20,3,8},{12,29,1},{12,29,1},{12,27,0},{30,6,8},{12,27,0},{21,3,18},{12,31,1},{13,28,4},{13,28,5},{21,3,18},{30,8,18},{13,28,5},{0,28,20},{30,8,18},{0,28,20},{12,0,36}, +{12,0,36},{12,0,36},{12,0,36},{12,29,0},{12,29,0},{12,29,0},{12,27,0},{11,28,2},{11,28,2},{13,35,54},{13,33,36},{13,31,56},{13,31,41},{13,34,51},{13,32,24},{13,31,5},{13,30,24},{11,33,53},{12,30,21},{14,32,22},{14,31,9},{14,30,8},{14,30,9},{23,0,51},{12,33,19},{13,31,5},{12,30,21},{31,9,51},{12,30,21},{13,33,36},{13,33,36},{13,33,36}, +{13,31,37},{13,32,8},{13,31,1},{13,31,1},{13,29,0},{12,31,9},{13,29,9},{14,30,4},{14,30,4},{14,30,4},{14,29,5},{21,5,8},{13,31,1},{13,31,1},{13,29,0},{31,8,8},{13,29,0},{22,5,18},{13,33,0},{14,30,4},{14,30,5},{22,5,18},{31,10,18},{14,30,5},{0,30,20},{31,10,18},{0,30,20},{13,0,36},{13,0,36},{13,0,36},{13,0,36},{13,31,0}, +{13,31,0},{13,31,0},{13,29,0},{12,30,1},{12,30,1},{14,37,54},{14,35,36},{14,33,54},{14,32,38},{14,36,51},{14,34,24},{14,32,3},{14,32,35},{12,35,52},{13,32,26},{15,34,22},{15,33,12},{15,32,5},{15,32,9},{24,2,51},{13,35,19},{14,32,3},{13,32,26},{27,17,51},{13,32,26},{14,35,36},{14,35,36},{14,35,36},{14,32,37},{14,34,8},{14,32,2},{14,32,2}, +{14,31,0},{13,33,12},{14,31,9},{15,32,4},{15,32,4},{15,32,4},{15,31,5},{24,0,8},{14,32,2},{14,32,2},{14,31,0},{31,11,8},{14,31,0},{25,0,18},{14,35,0},{15,32,1},{14,32,2},{25,0,18},{31,13,18},{14,32,2},{0,32,26},{31,13,18},{0,32,26},{14,0,36},{14,0,36},{14,0,36},{14,0,36},{14,32,1},{14,32,1},{14,32,1},{14,31,0},{13,32,0}, +{13,32,0},{15,40,68},{15,37,52},{15,35,70},{15,35,54},{15,38,53},{15,36,20},{15,35,5},{15,34,25},{14,36,56},{14,34,22},{16,36,22},{16,35,9},{16,34,8},{16,34,9},{26,1,51},{15,36,19},{15,35,4},{14,34,21},{30,17,51},{14,34,21},{15,38,50},{15,38,50},{15,38,50},{15,35,50},{15,36,11},{15,35,1},{15,35,1},{15,33,2},{14,35,11},{15,33,10},{16,34,4}, +{16,34,4},{16,34,4},{16,33,5},{24,6,8},{15,35,0},{15,35,0},{15,33,1},{29,17,8},{15,33,1},{25,6,18},{15,37,2},{16,34,4},{15,35,4},{25,6,18},{29,19,18},{15,35,4},{0,34,20},{29,19,18},{0,34,20},{15,0,50},{15,0,50},{15,0,50},{15,0,50},{15,35,1},{15,35,1},{15,35,1},{15,33,2},{14,34,2},{14,34,2},{16,41,56},{16,39,37},{16,37,56}, +{16,37,41},{16,40,51},{16,38,22},{16,37,5},{16,36,24},{15,38,56},{15,36,22},{17,38,22},{17,37,9},{17,36,8},{17,36,9},{27,3,51},{16,38,22},{16,37,5},{15,36,21},{31,19,51},{15,36,21},{16,39,37},{16,39,37},{16,39,37},{16,37,37},{16,38,8},{16,37,1},{16,37,1},{16,35,0},{15,37,11},{16,35,9},{17,36,4},{17,36,4},{17,36,4},{17,35,5},{27,1,8}, +{16,37,1},{16,37,1},{16,35,0},{30,19,8},{16,35,0},{28,1,18},{16,39,1},{17,36,4},{17,36,5},{28,1,18},{30,21,18},{17,36,5},{0,36,20},{30,21,18},{0,36,20},{16,0,36},{16,0,36},{16,0,36},{16,0,36},{16,37,0},{16,37,0},{16,37,0},{16,35,0},{15,36,2},{15,36,2},{17,43,56},{17,41,37},{17,39,56},{17,39,41},{17,42,51},{17,40,22},{17,39,5}, +{17,38,24},{15,42,56},{16,38,21},{18,40,22},{18,39,9},{18,38,8},{18,38,9},{28,5,51},{17,40,22},{17,39,5},{16,38,21},{31,22,51},{16,38,21},{17,41,37},{17,41,37},{17,41,37},{17,39,37},{17,40,8},{17,39,1},{17,39,1},{17,37,0},{16,39,9},{17,37,9},{18,38,4},{18,38,4},{18,38,4},{18,37,5},{28,3,8},{17,39,1},{17,39,1},{17,37,0},{31,21,8}, +{17,37,0},{29,3,18},{17,41,1},{18,38,4},{18,38,5},{29,3,18},{31,23,18},{18,38,5},{0,38,20},{31,23,18},{0,38,20},{17,0,36},{17,0,36},{17,0,36},{17,0,36},{17,39,0},{17,39,0},{17,39,0},{17,37,0},{16,38,1},{16,38,1},{18,45,56},{18,43,37},{18,41,56},{18,41,41},{18,44,51},{18,42,22},{18,41,5},{18,40,24},{16,43,53},{17,40,21},{19,42,22}, +{19,41,9},{19,40,8},{19,40,9},{31,0,51},{18,42,22},{18,41,5},{17,40,21},{28,29,51},{17,40,21},{18,43,37},{18,43,37},{18,43,37},{18,41,37},{18,42,8},{18,41,1},{18,41,1},{18,39,0},{17,41,9},{18,39,9},{19,40,4},{19,40,4},{19,40,4},{19,39,5},{29,5,8},{18,41,1},{18,41,1},{18,39,0},{31,24,8},{18,39,0},{30,5,18},{18,43,1},{19,40,4}, +{19,40,5},{30,5,18},{31,26,18},{19,40,5},{0,40,20},{31,26,18},{0,40,20},{18,0,36},{18,0,36},{18,0,36},{18,0,36},{18,41,0},{18,41,0},{18,41,0},{18,39,0},{17,40,1},{17,40,1},{19,48,68},{19,46,51},{20,43,70},{19,43,51},{19,47,52},{19,44,22},{19,43,3},{19,42,20},{17,46,51},{18,42,23},{20,44,24},{20,44,8},{20,43,6},{20,42,14},{31,6,51}, +{19,44,21},{19,43,2},{19,42,19},{31,29,51},{19,42,19},{19,46,50},{19,46,50},{19,46,50},{19,43,50},{19,45,9},{19,43,2},{19,43,2},{19,41,3},{18,43,10},{19,41,6},{20,42,5},{20,42,5},{20,42,5},{20,42,5},{31,4,8},{19,43,1},{19,43,1},{19,41,2},{30,29,8},{19,41,2},{30,11,18},{19,46,1},{20,43,2},{19,43,1},{30,11,18},{30,31,18},{19,43,1}, +{0,42,18},{30,31,18},{0,42,18},{19,0,50},{19,0,50},{19,0,50},{19,0,50},{19,43,2},{19,43,2},{19,43,2},{19,41,2},{18,43,1},{18,43,1},{20,49,56},{20,47,38},{20,45,53},{20,45,37},{20,48,51},{20,46,19},{20,45,1},{20,44,22},{18,48,56},{19,44,23},{21,46,24},{21,46,8},{21,45,6},{21,44,14},{30,15,51},{20,46,19},{20,45,1},{19,44,22},{31,32,51}, +{19,44,22},{20,47,37},{20,47,37},{20,47,37},{20,45,36},{20,46,10},{20,45,0},{20,45,0},{20,43,2},{19,45,10},{20,43,11},{21,44,5},{21,44,5},{21,44,5},{21,44,5},{30,13,8},{20,45,0},{20,45,0},{20,43,2},{31,31,8},{20,43,2},{31,13,18},{20,47,2},{21,45,2},{20,45,1},{31,13,18},{30,34,18},{20,45,1},{0,44,18},{30,34,18},{0,44,18},{20,0,36}, +{20,0,36},{20,0,36},{20,0,36},{20,45,0},{20,45,0},{20,45,0},{20,43,1},{19,45,1},{19,45,1},{21,51,56},{21,49,37},{21,47,53},{21,47,37},{21,50,51},{21,48,22},{21,47,1},{21,46,22},{19,50,56},{20,46,20},{22,48,22},{22,48,13},{22,47,6},{22,46,14},{30,20,51},{21,48,22},{21,47,1},{20,46,19},{31,35,51},{20,46,19},{21,49,37},{21,49,37},{21,49,37}, +{21,47,36},{21,48,8},{21,47,0},{21,47,0},{21,45,2},{20,47,11},{21,45,11},{22,46,5},{22,46,5},{22,46,5},{22,46,5},{31,15,8},{21,47,0},{21,47,0},{21,45,2},{31,34,8},{21,45,2},{31,18,18},{21,49,1},{22,47,2},{21,47,1},{31,18,18},{31,36,18},{21,47,1},{0,46,18},{31,36,18},{0,46,18},{21,0,36},{21,0,36},{21,0,36},{21,0,36},{21,47,0}, +{21,47,0},{21,47,0},{21,45,1},{20,46,2},{20,46,2},{22,53,56},{22,51,37},{22,49,56},{22,49,41},{22,52,51},{22,50,22},{22,49,5},{22,48,24},{20,51,53},{21,48,21},{23,50,22},{23,49,9},{23,48,8},{23,48,9},{31,22,51},{22,50,22},{22,49,5},{21,48,21},{28,42,51},{21,48,21},{22,51,37},{22,51,37},{22,51,37},{22,49,37},{22,50,8},{22,49,1},{22,49,1}, +{22,47,2},{21,49,9},{22,47,11},{23,48,4},{23,48,4},{23,48,4},{23,48,5},{31,20,8},{22,49,1},{22,49,1},{22,47,2},{31,37,8},{22,47,2},{31,23,18},{22,51,1},{23,48,4},{23,48,5},{31,23,18},{31,39,18},{23,48,5},{0,48,20},{31,39,18},{0,48,20},{22,0,36},{22,0,36},{22,0,36},{22,0,36},{22,49,0},{22,49,0},{22,49,0},{22,47,1},{21,48,1}, +{21,48,1},{23,56,68},{23,54,51},{24,51,70},{23,51,51},{23,55,52},{23,52,22},{23,51,3},{23,50,20},{21,54,51},{22,50,23},{24,52,24},{24,52,8},{24,51,6},{24,50,14},{31,28,51},{23,52,21},{23,51,2},{23,50,19},{31,42,51},{23,50,19},{23,54,50},{23,54,50},{23,54,50},{23,51,50},{23,53,9},{23,51,2},{23,51,2},{23,49,3},{22,51,10},{23,49,6},{24,50,5}, +{24,50,5},{24,50,5},{24,50,5},{31,26,8},{23,51,1},{23,51,1},{23,49,2},{30,42,8},{23,49,2},{31,29,18},{23,54,1},{24,51,2},{23,51,1},{31,29,18},{30,44,18},{23,51,1},{0,50,18},{30,44,18},{0,50,18},{23,0,50},{23,0,50},{23,0,50},{23,0,50},{23,51,2},{23,51,2},{23,51,2},{23,49,2},{22,51,1},{22,51,1},{24,58,54},{24,55,38},{24,53,53}, +{24,53,37},{24,56,52},{24,54,19},{24,53,1},{24,52,22},{22,56,51},{23,52,23},{25,54,24},{25,54,8},{25,53,6},{25,52,14},{31,33,51},{24,54,19},{24,53,1},{23,52,22},{31,45,51},{23,52,22},{24,56,36},{24,56,36},{24,56,36},{24,53,36},{24,54,10},{24,53,0},{24,53,0},{24,51,2},{23,53,10},{24,51,11},{25,52,5},{25,52,5},{25,52,5},{25,52,5},{31,31,8}, +{24,53,0},{24,53,0},{24,51,2},{31,44,8},{24,51,2},{31,34,18},{24,55,2},{25,53,2},{24,53,1},{31,34,18},{31,46,18},{24,53,1},{0,52,18},{31,46,18},{0,52,18},{24,0,36},{24,0,36},{24,0,36},{24,0,36},{24,53,0},{24,53,0},{24,53,0},{24,51,1},{23,53,1},{23,53,1},{25,60,54},{25,57,38},{25,55,53},{25,55,37},{25,58,52},{25,56,19},{25,55,1}, +{25,54,22},{23,58,51},{24,54,20},{26,56,24},{26,56,8},{26,55,6},{26,54,14},{31,38,51},{25,56,19},{25,55,1},{24,54,19},{31,48,51},{24,54,19},{25,58,36},{25,58,36},{25,58,36},{25,55,36},{25,56,10},{25,55,0},{25,55,0},{25,53,2},{24,55,11},{25,53,11},{26,54,5},{26,54,5},{26,54,5},{26,54,5},{31,36,8},{25,55,0},{25,55,0},{25,53,2},{31,47,8}, +{25,53,2},{30,43,18},{25,57,2},{26,55,2},{25,55,1},{30,43,18},{30,50,18},{25,55,1},{0,54,18},{30,50,18},{0,54,18},{25,0,36},{25,0,36},{25,0,36},{25,0,36},{25,55,0},{25,55,0},{25,55,0},{25,53,1},{24,54,2},{24,54,2},{26,62,54},{26,59,38},{26,57,53},{26,57,37},{26,60,52},{26,58,19},{26,57,1},{26,56,22},{25,58,56},{25,56,20},{27,58,24}, +{27,58,8},{27,57,6},{27,56,14},{30,47,51},{26,58,19},{26,57,1},{25,56,19},{31,51,51},{25,56,19},{26,60,36},{26,60,36},{26,60,36},{26,57,36},{26,58,10},{26,57,0},{26,57,0},{26,55,2},{25,57,11},{26,55,11},{27,56,5},{27,56,5},{27,56,5},{27,56,5},{30,45,8},{26,57,0},{26,57,0},{26,55,2},{31,50,8},{26,55,2},{31,45,18},{26,59,2},{27,57,2}, +{26,57,1},{31,45,18},{31,52,18},{26,57,1},{0,56,18},{31,52,18},{0,56,18},{26,0,36},{26,0,36},{26,0,36},{26,0,36},{26,57,0},{26,57,0},{26,57,0},{26,55,1},{25,56,2},{25,56,2},{27,63,76},{27,62,52},{28,59,69},{27,59,51},{27,63,52},{27,60,21},{27,59,3},{27,58,22},{25,62,52},{26,58,28},{28,60,24},{28,60,9},{28,59,5},{28,59,13},{31,49,51}, +{27,60,20},{27,59,2},{27,58,21},{30,56,51},{27,58,21},{27,62,51},{27,62,51},{27,62,51},{27,59,51},{27,61,9},{27,59,3},{27,59,3},{27,58,6},{26,60,11},{27,57,12},{28,58,5},{28,58,5},{28,58,5},{28,58,4},{29,54,8},{27,59,2},{27,59,2},{27,58,5},{29,56,8},{27,58,5},{30,54,18},{27,62,2},{28,59,1},{27,59,1},{30,54,18},{29,58,18},{27,59,1}, +{0,58,20},{29,58,18},{0,58,20},{27,0,50},{27,0,50},{27,0,50},{27,0,50},{27,60,1},{27,60,1},{27,60,1},{27,58,2},{26,59,0},{26,59,0},{28,63,86},{28,63,38},{28,61,52},{28,61,36},{28,63,59},{28,62,21},{28,61,0},{28,60,21},{27,62,60},{27,60,28},{29,62,24},{29,62,9},{29,61,5},{29,61,13},{30,58,51},{28,62,21},{28,61,0},{28,60,21},{31,58,51}, +{28,60,21},{28,63,37},{28,63,37},{28,63,37},{28,61,36},{28,62,10},{28,61,0},{28,61,0},{28,59,5},{27,62,11},{27,60,12},{29,60,5},{29,60,5},{29,60,5},{29,60,4},{30,56,8},{28,61,0},{28,61,0},{28,59,5},{30,58,8},{28,59,5},{31,56,18},{28,63,2},{29,61,1},{28,61,0},{31,56,18},{30,60,18},{28,61,0},{0,60,20},{30,60,18},{0,60,20},{28,0,36}, +{28,0,36},{28,0,36},{28,0,36},{28,61,0},{28,61,0},{28,61,0},{28,59,1},{27,61,0},{27,61,0},{30,63,94},{30,63,78},{29,63,52},{29,63,36},{30,63,115},{29,63,36},{29,63,0},{29,62,21},{29,63,88},{28,62,25},{30,63,30},{30,63,14},{30,63,5},{30,63,13},{31,60,51},{29,63,36},{29,63,0},{29,62,21},{31,61,51},{29,62,21},{29,63,52},{29,63,52},{29,63,52}, +{29,63,36},{29,63,16},{29,63,0},{29,63,0},{29,61,5},{28,63,11},{28,62,9},{30,62,5},{30,62,5},{30,62,5},{30,62,4},{31,58,8},{29,63,0},{29,63,0},{29,61,5},{31,60,8},{29,61,5},{31,61,18},{30,63,10},{30,63,1},{29,63,0},{31,61,18},{31,62,18},{29,63,0},{0,62,20},{31,62,18},{0,62,20},{29,0,36},{29,0,36},{29,0,36},{29,0,36},{29,63,0}, +{29,63,0},{29,63,0},{29,61,1},{28,63,2},{28,63,2},{31,63,68},{31,63,68},{30,63,61},{30,63,45},{30,63,59},{30,63,27},{30,63,18},{30,63,1},{30,63,28},{30,63,10},{31,63,4},{31,63,4},{31,63,4},{31,63,4},{31,63,4},{31,63,4},{31,63,4},{30,63,1},{31,63,4},{30,63,1},{30,63,61},{30,63,61},{30,63,61},{30,63,45},{30,63,34},{30,63,18},{30,63,18}, +{30,63,1},{30,63,19},{30,63,10},{31,63,4},{31,63,4},{31,63,4},{31,63,4},{31,62,4},{31,63,4},{31,63,4},{30,63,1},{31,63,4},{30,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{30,0,36},{30,0,36},{30,0,36},{30,0,36},{30,63,9},{30,63,9},{30,63,9},{30,63,1},{30,63,10}, +{30,63,10},{0,7,74},{0,6,20},{0,4,2},{0,4,26},{0,5,153},{0,4,110},{0,3,45},{0,2,115},{0,3,169},{0,2,124},{0,7,74},{0,6,20},{0,4,2},{0,4,26},{0,5,153},{0,4,110},{0,3,45},{0,2,115},{0,3,153},{0,2,115},{0,3,1},{0,3,1},{0,3,1},{0,2,0},{0,2,13},{0,2,9},{0,2,9},{0,1,5},{0,1,14},{0,1,6},{0,3,1}, +{0,3,1},{0,3,1},{0,2,0},{0,2,13},{0,2,9},{0,2,9},{0,1,5},{1,0,13},{0,1,5},{2,1,72},{0,6,20},{0,4,2},{0,4,26},{2,1,72},{3,1,72},{0,4,26},{0,3,74},{3,1,72},{0,3,74},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,13,81},{0,10,13},{0,6,26}, +{0,6,14},{0,9,244},{0,7,129},{0,6,41},{0,4,139},{0,5,300},{0,4,175},{0,13,81},{0,10,13},{0,6,26},{0,6,14},{2,3,243},{0,7,129},{0,6,41},{0,4,139},{4,1,243},{0,4,139},{0,9,9},{0,9,9},{0,9,9},{0,5,10},{0,5,52},{0,5,17},{0,5,17},{0,3,17},{0,3,68},{0,3,33},{0,9,9},{0,9,9},{0,9,9},{0,5,10},{1,2,50}, +{0,5,17},{0,5,17},{0,3,17},{2,1,50},{0,3,17},{3,3,72},{0,10,4},{1,6,2},{0,6,5},{3,3,72},{4,3,72},{0,6,5},{0,5,74},{4,3,72},{0,5,74},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,2,0},{0,2,0},{0,2,0},{0,1,1},{0,1,2},{0,1,2},{1,15,145},{1,12,77},{1,8,90},{1,8,78},{0,15,243},{0,10,96},{0,8,3}, +{0,6,106},{0,8,395},{0,6,187},{1,15,81},{1,12,13},{1,8,26},{1,8,14},{4,1,243},{0,10,96},{0,8,3},{0,6,106},{5,3,243},{0,6,106},{1,11,73},{1,11,73},{1,11,73},{1,7,74},{0,11,50},{0,8,2},{0,8,2},{0,5,2},{0,5,131},{0,5,51},{1,11,9},{1,11,9},{1,11,9},{1,7,10},{3,1,50},{0,8,2},{0,8,2},{0,5,2},{3,3,50}, +{0,5,2},{5,1,72},{1,12,4},{2,8,2},{0,8,2},{5,1,72},{9,0,72},{0,8,2},{0,7,74},{9,0,72},{0,7,74},{1,0,73},{1,0,73},{1,0,73},{1,0,73},{0,7,1},{0,7,1},{0,7,1},{0,4,1},{0,3,32},{0,3,32},{2,17,162},{2,14,94},{2,10,107},{2,10,95},{1,17,244},{1,12,97},{1,10,4},{1,8,107},{0,11,345},{0,8,116},{2,17,81}, +{2,14,13},{2,10,26},{2,10,14},{6,0,243},{0,14,76},{1,10,3},{0,9,83},{10,0,243},{0,9,83},{2,13,90},{2,13,90},{2,13,90},{2,9,91},{1,13,51},{1,10,3},{1,10,3},{1,7,3},{0,9,94},{0,7,14},{2,13,9},{2,13,9},{2,13,9},{2,9,10},{3,6,50},{1,10,2},{1,10,2},{1,7,2},{8,0,50},{1,7,2},{7,0,72},{2,14,4},{3,10,2}, +{1,10,2},{7,0,72},{10,2,72},{1,10,2},{0,9,74},{10,2,72},{0,9,74},{2,0,90},{2,0,90},{2,0,90},{2,0,90},{1,9,2},{1,9,2},{1,9,2},{1,6,2},{0,7,13},{0,7,13},{3,19,154},{3,16,82},{3,13,100},{3,12,85},{2,19,244},{2,15,90},{2,13,5},{2,11,97},{0,15,287},{0,11,73},{3,19,90},{3,16,18},{4,12,29},{3,12,21},{6,6,243}, +{1,16,75},{2,13,5},{0,11,73},{12,1,243},{0,11,73},{3,15,81},{3,15,81},{3,15,81},{3,12,81},{2,15,52},{2,13,1},{2,13,1},{2,9,4},{0,13,61},{0,10,14},{3,15,17},{3,15,17},{3,15,17},{3,12,17},{6,2,50},{2,13,1},{2,13,1},{2,9,4},{11,0,50},{2,9,4},{8,2,72},{3,16,2},{4,12,4},{2,13,4},{8,2,72},{12,3,72},{2,13,4}, +{0,11,72},{12,3,72},{0,11,72},{3,0,80},{3,0,80},{3,0,80},{3,0,80},{2,12,0},{2,12,0},{2,12,0},{2,9,0},{0,11,1},{0,11,1},{4,21,162},{4,18,94},{4,15,103},{4,14,95},{3,21,244},{3,17,88},{3,15,5},{3,13,97},{0,18,260},{1,13,73},{4,21,81},{4,18,13},{4,15,22},{4,14,14},{9,1,243},{2,18,75},{3,15,5},{1,13,73},{13,3,243}, +{1,13,73},{4,17,90},{4,17,90},{4,17,90},{4,14,91},{3,17,52},{3,15,1},{3,15,1},{3,11,4},{0,16,52},{1,12,14},{4,17,9},{4,17,9},{4,17,9},{4,14,10},{8,0,50},{3,15,1},{3,15,1},{3,11,4},{11,3,50},{3,11,4},{10,1,72},{3,20,2},{5,14,4},{3,15,4},{10,1,72},{17,0,72},{3,15,4},{0,13,72},{17,0,72},{0,13,72},{4,0,90}, +{4,0,90},{4,0,90},{4,0,90},{3,14,0},{3,14,0},{3,14,0},{3,11,0},{1,13,1},{1,13,1},{5,23,162},{5,20,94},{5,16,107},{5,16,95},{4,23,244},{4,18,97},{4,16,4},{4,15,98},{0,22,244},{2,15,73},{5,23,81},{5,20,13},{5,16,26},{5,16,14},{10,3,243},{3,20,75},{4,16,3},{2,15,73},{18,0,243},{2,15,73},{5,19,90},{5,19,90},{5,19,90}, +{5,15,94},{4,19,51},{4,16,3},{4,16,3},{4,13,5},{1,18,52},{2,14,14},{5,19,9},{5,19,9},{5,19,9},{5,15,13},{9,2,50},{4,16,2},{4,16,2},{4,13,4},{16,0,50},{4,13,4},{11,3,72},{5,20,4},{6,16,2},{4,16,2},{11,3,72},{18,2,72},{4,16,2},{0,15,72},{18,2,72},{0,15,72},{5,0,90},{5,0,90},{5,0,90},{5,0,90},{4,15,2}, +{4,15,2},{4,15,2},{4,13,1},{2,15,1},{2,15,1},{6,25,162},{6,22,94},{6,18,107},{6,18,95},{5,25,244},{5,20,97},{5,18,4},{5,16,107},{1,24,244},{3,17,74},{6,25,81},{6,22,13},{6,18,26},{6,18,14},{12,1,243},{3,24,75},{5,18,3},{3,17,74},{19,2,243},{3,17,74},{6,21,90},{6,21,90},{6,21,90},{6,17,91},{5,21,51},{5,18,3},{5,18,3}, +{5,15,5},{2,20,52},{3,16,19},{6,21,9},{6,21,9},{6,21,9},{6,17,10},{11,1,50},{5,18,2},{5,18,2},{5,15,4},{17,2,50},{5,15,4},{13,1,72},{6,22,4},{7,18,2},{5,18,2},{13,1,72},{19,4,72},{5,18,2},{0,17,74},{19,4,72},{0,17,74},{6,0,90},{6,0,90},{6,0,90},{6,0,90},{5,17,2},{5,17,2},{5,17,2},{5,15,1},{3,17,0}, +{3,17,0},{7,27,154},{7,24,82},{7,21,100},{7,20,85},{6,27,244},{6,23,90},{6,21,5},{6,19,97},{2,26,244},{4,19,73},{7,27,90},{7,24,18},{8,20,29},{7,20,21},{13,4,243},{5,24,75},{6,21,5},{4,19,73},{22,2,243},{4,19,73},{7,23,81},{7,23,81},{7,23,81},{7,20,81},{6,23,52},{6,21,1},{6,21,1},{6,17,4},{3,23,52},{4,18,14},{7,23,17}, +{7,23,17},{7,23,17},{7,20,17},{13,0,50},{6,21,1},{6,21,1},{6,17,4},{20,2,50},{6,17,4},{14,4,72},{7,24,2},{8,20,4},{6,21,4},{14,4,72},{25,0,72},{6,21,4},{0,19,72},{25,0,72},{0,19,72},{7,0,80},{7,0,80},{7,0,80},{7,0,80},{6,20,0},{6,20,0},{6,20,0},{6,17,0},{4,19,1},{4,19,1},{8,29,162},{8,26,92},{8,23,103}, +{8,22,95},{7,29,244},{7,25,90},{7,23,5},{7,21,97},{3,28,244},{5,21,73},{8,29,81},{8,26,11},{8,23,22},{8,22,14},{14,6,243},{6,26,75},{7,23,5},{5,21,73},{26,0,243},{5,21,73},{8,25,90},{8,25,90},{8,25,90},{8,22,91},{7,25,52},{7,23,1},{7,23,1},{7,19,4},{4,24,52},{5,20,14},{8,25,9},{8,25,9},{8,25,9},{8,22,10},{14,2,50}, +{7,23,1},{7,23,1},{7,19,4},{24,0,50},{7,19,4},{16,2,72},{8,26,2},{9,22,4},{7,23,4},{16,2,72},{27,1,72},{7,23,4},{0,21,72},{27,1,72},{0,21,72},{8,0,90},{8,0,90},{8,0,90},{8,0,90},{7,22,0},{7,22,0},{7,22,0},{7,19,0},{5,21,1},{5,21,1},{9,31,162},{9,28,92},{9,25,103},{9,24,95},{8,31,244},{8,26,100},{8,24,9}, +{8,23,98},{4,30,244},{6,23,73},{9,31,81},{9,28,11},{9,25,22},{9,24,14},{16,4,243},{7,28,75},{8,24,8},{6,23,73},{27,2,243},{6,23,73},{9,27,90},{9,27,90},{9,27,90},{9,24,91},{8,27,51},{8,24,5},{8,24,5},{8,21,5},{5,26,52},{6,22,14},{9,27,9},{9,27,9},{9,27,9},{9,24,10},{16,0,50},{8,24,4},{8,24,4},{8,21,4},{26,1,50}, +{8,21,4},{17,4,72},{9,28,2},{10,24,4},{8,25,4},{17,4,72},{27,4,72},{8,25,4},{0,23,72},{27,4,72},{0,23,72},{9,0,90},{9,0,90},{9,0,90},{9,0,90},{8,24,1},{8,24,1},{8,24,1},{8,21,1},{6,23,1},{6,23,1},{10,33,162},{10,30,92},{10,27,103},{10,26,95},{9,33,244},{9,28,100},{9,26,9},{9,25,98},{5,32,244},{7,25,73},{10,33,81}, +{10,30,11},{10,27,22},{10,26,14},{17,6,243},{8,30,75},{9,26,8},{7,25,73},{28,4,243},{7,25,73},{10,29,90},{10,29,90},{10,29,90},{10,26,91},{9,29,51},{9,26,5},{9,26,5},{9,23,5},{6,28,52},{7,24,14},{10,29,9},{10,29,9},{10,29,9},{10,26,10},{17,2,50},{9,26,4},{9,26,4},{9,23,4},{27,3,50},{9,23,4},{18,6,72},{10,30,2},{11,26,4}, +{9,27,4},{18,6,72},{28,6,72},{9,27,4},{0,25,72},{28,6,72},{0,25,72},{10,0,90},{10,0,90},{10,0,90},{10,0,90},{9,26,1},{9,26,1},{9,26,1},{9,23,1},{7,25,1},{7,25,1},{11,35,154},{11,32,82},{11,29,97},{11,29,85},{10,35,244},{10,31,96},{10,29,3},{10,27,90},{6,34,244},{8,27,78},{11,35,90},{11,32,18},{12,29,27},{11,29,21},{19,5,243}, +{9,32,75},{10,29,3},{9,27,75},{31,4,243},{9,27,75},{11,31,81},{11,31,81},{11,31,81},{11,28,80},{10,31,52},{10,29,2},{10,29,2},{10,26,5},{7,31,50},{9,26,11},{11,31,17},{11,31,17},{11,31,17},{11,28,16},{19,1,50},{10,29,2},{10,29,2},{9,26,2},{29,4,50},{9,26,2},{20,5,72},{11,32,2},{12,29,2},{10,29,2},{20,5,72},{31,6,72},{10,29,2}, +{0,27,74},{31,6,72},{0,27,74},{11,0,80},{11,0,80},{11,0,80},{11,0,80},{10,28,1},{10,28,1},{10,28,1},{10,25,1},{8,28,2},{8,28,2},{12,37,162},{12,34,92},{12,31,107},{12,30,99},{11,37,244},{11,33,90},{11,31,3},{11,29,90},{7,36,244},{9,29,78},{12,37,81},{12,34,11},{12,31,26},{12,30,18},{22,0,243},{10,34,75},{11,31,3},{10,29,75},{31,7,243}, +{10,29,75},{12,33,90},{12,33,90},{12,33,90},{12,30,90},{11,33,52},{11,31,2},{11,31,2},{11,28,5},{8,32,52},{10,28,11},{12,33,9},{12,33,9},{12,33,9},{12,30,9},{20,3,50},{11,31,2},{11,31,2},{10,28,2},{30,6,50},{10,28,2},{23,0,72},{12,34,2},{13,31,2},{11,31,2},{23,0,72},{31,9,72},{11,31,2},{0,29,74},{31,9,72},{0,29,74},{12,0,90}, +{12,0,90},{12,0,90},{12,0,90},{11,30,1},{11,30,1},{11,30,1},{11,27,1},{9,30,2},{9,30,2},{13,39,162},{13,36,92},{13,33,103},{13,32,95},{12,39,244},{12,34,100},{12,32,9},{12,31,100},{8,38,244},{10,31,78},{13,39,81},{13,36,11},{13,33,22},{13,32,14},{23,2,243},{11,36,75},{12,32,8},{11,31,75},{28,14,243},{11,31,75},{13,35,90},{13,35,90},{13,35,90}, +{13,32,91},{12,35,51},{12,32,5},{12,32,5},{12,30,6},{9,34,52},{11,30,11},{13,35,9},{13,35,9},{13,35,9},{13,32,10},{21,5,50},{12,32,4},{12,32,4},{11,30,2},{31,8,50},{11,30,2},{24,2,72},{13,36,2},{14,32,4},{12,33,4},{24,2,72},{27,17,72},{12,33,4},{0,31,74},{27,17,72},{0,31,74},{13,0,90},{13,0,90},{13,0,90},{13,0,90},{12,32,1}, +{12,32,1},{12,32,1},{12,29,1},{10,31,4},{10,31,4},{14,41,162},{14,38,92},{14,35,103},{14,34,95},{13,41,244},{13,36,100},{13,34,9},{13,33,98},{9,40,244},{11,33,73},{14,41,81},{14,38,11},{14,35,22},{14,34,14},{24,4,243},{12,38,75},{13,34,8},{11,33,73},{28,17,243},{11,33,73},{14,37,90},{14,37,90},{14,37,90},{14,34,91},{13,37,51},{13,34,5},{13,34,5}, +{13,31,10},{10,36,52},{11,32,14},{14,37,9},{14,37,9},{14,37,9},{14,34,10},{24,0,50},{13,34,4},{13,34,4},{12,32,4},{31,11,50},{12,32,4},{25,4,72},{14,38,2},{15,34,4},{13,35,4},{25,4,72},{28,19,72},{13,35,4},{0,33,72},{28,19,72},{0,33,72},{14,0,90},{14,0,90},{14,0,90},{14,0,90},{13,34,1},{13,34,1},{13,34,1},{13,31,1},{11,33,1}, +{11,33,1},{15,44,152},{15,40,84},{15,37,97},{15,37,85},{14,44,243},{14,39,96},{14,37,3},{14,35,90},{10,42,244},{12,35,78},{15,44,88},{15,40,20},{16,37,27},{15,37,21},{27,0,243},{13,41,76},{14,37,3},{13,35,75},{31,17,243},{13,35,75},{15,40,80},{15,40,80},{15,40,80},{15,36,80},{14,40,50},{14,37,2},{14,37,2},{14,34,5},{11,39,50},{13,34,11},{15,40,16}, +{15,40,16},{15,40,16},{15,36,16},{24,6,50},{14,37,2},{14,37,2},{13,34,2},{29,17,50},{13,34,2},{27,3,72},{15,40,4},{16,37,2},{14,37,2},{27,3,72},{31,19,72},{14,37,2},{0,35,74},{31,19,72},{0,35,74},{15,0,80},{15,0,80},{15,0,80},{15,0,80},{14,36,1},{14,36,1},{14,36,1},{14,33,1},{12,36,2},{12,36,2},{16,45,164},{16,42,95},{16,39,107}, +{16,38,99},{15,46,243},{15,41,96},{15,39,3},{15,37,90},{11,44,244},{13,37,78},{16,45,83},{16,42,14},{16,39,26},{16,38,18},{27,5,243},{14,43,76},{15,39,3},{14,37,75},{31,20,243},{14,37,75},{16,41,91},{16,41,91},{16,41,91},{16,38,90},{15,42,50},{15,39,2},{15,39,2},{15,36,5},{12,41,51},{14,36,11},{16,41,10},{16,41,10},{16,41,10},{16,38,9},{27,1,50}, +{15,39,2},{15,39,2},{14,36,2},{30,19,50},{14,36,2},{28,5,72},{15,44,4},{17,39,2},{15,39,2},{28,5,72},{31,22,72},{15,39,2},{0,37,74},{31,22,72},{0,37,74},{16,0,90},{16,0,90},{16,0,90},{16,0,90},{15,38,1},{15,38,1},{15,38,1},{15,35,1},{13,38,2},{13,38,2},{17,47,164},{17,44,95},{17,41,107},{17,40,99},{16,47,245},{16,43,91},{16,41,3}, +{16,39,100},{12,46,244},{14,39,78},{17,47,83},{17,44,14},{17,41,26},{17,40,18},{30,0,243},{15,45,76},{16,41,2},{15,39,75},{28,27,243},{15,39,75},{17,43,91},{17,43,91},{17,43,91},{17,40,90},{16,43,53},{16,41,2},{16,41,2},{16,38,6},{13,43,51},{15,38,11},{17,43,10},{17,43,10},{17,43,10},{17,40,9},{28,3,50},{16,41,1},{16,41,1},{15,38,2},{31,21,50}, +{15,38,2},{31,0,72},{16,46,1},{18,41,2},{16,41,1},{31,0,72},{28,29,72},{16,41,1},{0,39,74},{28,29,72},{0,39,74},{17,0,90},{17,0,90},{17,0,90},{17,0,90},{16,40,1},{16,40,1},{16,40,1},{16,37,1},{14,40,2},{14,40,2},{18,49,162},{18,46,95},{18,43,107},{18,42,99},{17,49,244},{17,45,91},{17,43,3},{17,41,100},{13,48,244},{15,41,78},{18,49,81}, +{18,46,14},{18,43,26},{18,42,18},{31,2,243},{15,48,75},{17,43,2},{15,41,78},{29,29,243},{15,41,78},{18,45,91},{18,45,91},{18,45,91},{18,42,90},{17,45,53},{17,43,2},{17,43,2},{17,40,6},{14,45,51},{16,40,18},{18,45,10},{18,45,10},{18,45,10},{18,42,9},{29,5,50},{17,43,1},{17,43,1},{16,40,2},{31,24,50},{16,40,2},{30,9,72},{17,48,2},{19,43,2}, +{17,43,1},{30,9,72},{29,31,72},{17,43,1},{0,41,74},{29,31,72},{0,41,74},{18,0,90},{18,0,90},{18,0,90},{18,0,90},{17,42,1},{17,42,1},{17,42,1},{17,39,1},{15,42,2},{15,42,2},{19,52,152},{19,48,84},{19,45,105},{19,45,84},{18,52,243},{18,47,89},{18,45,1},{18,43,96},{14,50,244},{16,44,81},{19,52,88},{19,48,20},{20,45,26},{19,45,20},{31,8,243}, +{17,49,76},{18,45,1},{16,44,80},{31,30,243},{16,44,80},{19,48,80},{19,48,80},{19,48,80},{19,44,81},{18,48,50},{18,45,1},{18,45,1},{18,42,1},{15,47,52},{17,42,13},{19,48,16},{19,48,16},{19,48,16},{19,44,17},{31,4,50},{18,45,1},{18,45,1},{18,42,1},{30,29,50},{18,42,1},{30,15,72},{19,48,4},{20,45,1},{18,45,1},{30,15,72},{31,32,72},{18,45,1}, +{0,43,80},{31,32,72},{0,43,80},{19,0,80},{19,0,80},{19,0,80},{19,0,80},{18,45,0},{18,45,0},{18,45,0},{18,41,1},{16,44,1},{16,44,1},{20,53,164},{20,50,95},{20,47,106},{20,47,94},{19,54,243},{19,49,96},{19,47,1},{19,45,96},{15,52,244},{17,46,81},{20,53,83},{20,50,14},{20,47,25},{20,47,13},{29,20,243},{18,51,76},{19,47,1},{17,46,80},{31,33,243}, +{17,46,80},{20,49,91},{20,49,91},{20,49,91},{20,46,90},{19,50,50},{19,47,1},{19,47,1},{19,44,1},{16,49,51},{18,44,13},{20,49,10},{20,49,10},{20,49,10},{20,46,9},{30,13,50},{19,47,1},{19,47,1},{19,44,1},{31,31,50},{19,44,1},{30,20,72},{19,52,4},{21,47,1},{19,47,1},{30,20,72},{31,35,72},{19,47,1},{0,45,80},{31,35,72},{0,45,80},{20,0,90}, +{20,0,90},{20,0,90},{20,0,90},{19,47,0},{19,47,0},{19,47,0},{19,43,1},{17,46,1},{17,46,1},{21,55,164},{21,52,95},{21,49,107},{21,48,99},{20,55,245},{20,51,91},{20,49,3},{20,47,97},{16,54,244},{18,47,85},{21,55,83},{21,52,14},{21,49,26},{21,48,18},{30,22,243},{19,53,76},{20,49,2},{19,47,81},{28,40,243},{19,47,81},{21,51,91},{21,51,91},{21,51,91}, +{21,48,90},{20,51,53},{20,49,2},{20,49,2},{20,46,5},{17,51,51},{19,46,13},{21,51,10},{21,51,10},{21,51,10},{21,48,9},{31,15,50},{20,49,1},{20,49,1},{19,46,4},{31,34,50},{19,46,4},{31,22,72},{20,54,1},{22,49,2},{20,49,1},{31,22,72},{28,42,72},{20,49,1},{0,47,80},{28,42,72},{0,47,80},{21,0,90},{21,0,90},{21,0,90},{21,0,90},{20,48,1}, +{20,48,1},{20,48,1},{20,45,2},{18,48,2},{18,48,2},{22,57,164},{22,54,95},{22,51,107},{22,50,99},{21,57,245},{21,53,91},{21,51,3},{21,49,100},{17,56,244},{19,49,78},{22,57,83},{22,54,14},{22,51,26},{22,50,18},{31,24,243},{19,56,76},{21,51,2},{19,49,78},{29,42,243},{19,49,78},{22,53,91},{22,53,91},{22,53,91},{22,50,90},{21,53,53},{21,51,2},{21,51,2}, +{21,48,6},{18,53,51},{20,48,18},{22,53,10},{22,53,10},{22,53,10},{22,50,9},{31,20,50},{21,51,1},{21,51,1},{20,48,2},{31,37,50},{20,48,2},{31,27,72},{21,56,1},{23,51,2},{21,51,1},{31,27,72},{29,44,72},{21,51,1},{0,49,74},{29,44,72},{0,49,74},{22,0,90},{22,0,90},{22,0,90},{22,0,90},{21,50,1},{21,50,1},{21,50,1},{21,47,2},{19,50,2}, +{19,50,2},{23,60,152},{23,57,81},{23,53,105},{23,53,84},{22,60,243},{22,55,89},{22,53,1},{22,51,96},{18,59,244},{20,52,81},{23,60,88},{23,57,17},{24,53,26},{23,53,20},{31,30,243},{21,57,73},{22,53,1},{20,52,80},{31,43,243},{20,52,80},{23,56,80},{23,56,80},{23,56,80},{23,52,81},{22,56,50},{22,53,1},{22,53,1},{22,50,1},{19,55,52},{21,50,13},{23,56,16}, +{23,56,16},{23,56,16},{23,52,17},{31,26,50},{22,53,1},{22,53,1},{22,50,1},{30,42,50},{22,50,1},{31,33,72},{23,57,1},{24,53,1},{22,53,1},{31,33,72},{31,45,72},{22,53,1},{0,51,80},{31,45,72},{0,51,80},{23,0,80},{23,0,80},{23,0,80},{23,0,80},{22,53,0},{22,53,0},{22,53,0},{22,49,1},{20,52,1},{20,52,1},{24,62,162},{24,58,94},{24,55,106}, +{24,55,94},{23,62,243},{23,57,89},{23,55,1},{23,53,96},{19,61,244},{21,54,81},{24,62,81},{24,58,13},{24,55,25},{24,55,13},{31,35,243},{22,59,73},{23,55,1},{21,54,80},{27,51,243},{21,54,80},{24,58,90},{24,58,90},{24,58,90},{24,54,90},{23,58,50},{23,55,1},{23,55,1},{23,52,1},{20,57,50},{22,52,13},{24,58,9},{24,58,9},{24,58,9},{24,54,9},{31,31,50}, +{23,55,1},{23,55,1},{23,52,1},{31,44,50},{23,52,1},{31,38,72},{24,58,4},{25,55,1},{23,55,1},{31,38,72},{31,48,72},{23,55,1},{0,53,80},{31,48,72},{0,53,80},{24,0,90},{24,0,90},{24,0,90},{24,0,90},{23,55,0},{23,55,0},{23,55,0},{23,51,1},{21,54,1},{21,54,1},{25,63,164},{25,60,94},{25,57,106},{25,57,94},{24,63,245},{24,59,97},{24,57,3}, +{24,55,97},{20,63,249},{22,56,81},{25,63,83},{25,60,13},{25,57,25},{25,57,13},{31,40,243},{23,61,73},{24,57,2},{22,56,80},{31,49,243},{22,56,80},{25,60,90},{25,60,90},{25,60,90},{25,56,90},{24,60,51},{24,57,3},{24,57,3},{24,54,5},{21,59,50},{23,54,13},{25,60,9},{25,60,9},{25,60,9},{25,56,9},{31,36,50},{24,57,2},{24,57,2},{23,54,4},{31,47,50}, +{23,54,4},{30,47,72},{25,60,4},{26,57,1},{24,57,1},{30,47,72},{31,51,72},{24,57,1},{0,55,80},{31,51,72},{0,55,80},{25,0,90},{25,0,90},{25,0,90},{25,0,90},{24,56,2},{24,56,2},{24,56,2},{24,53,2},{22,56,1},{22,56,1},{26,63,194},{26,62,94},{26,59,106},{26,59,94},{25,63,284},{25,61,97},{25,59,3},{25,57,97},{22,63,253},{23,58,81},{27,62,99}, +{26,62,13},{26,59,25},{26,59,13},{29,52,243},{24,63,76},{25,59,2},{23,58,80},{28,56,243},{23,58,80},{26,62,90},{26,62,90},{26,62,90},{26,58,90},{25,62,51},{25,59,3},{25,59,3},{25,56,5},{22,61,50},{24,56,10},{26,62,9},{26,62,9},{26,62,9},{26,58,9},{30,45,50},{25,59,2},{25,59,2},{24,56,1},{31,50,50},{24,56,1},{30,52,72},{26,62,4},{27,59,1}, +{25,59,1},{30,52,72},{28,58,72},{25,59,1},{0,57,80},{28,58,72},{0,57,80},{26,0,90},{26,0,90},{26,0,90},{26,0,90},{25,58,2},{25,58,2},{25,58,2},{25,55,2},{23,58,1},{23,58,1},{27,63,280},{27,63,120},{27,62,105},{27,61,82},{27,63,328},{26,63,99},{26,61,5},{26,59,99},{24,63,308},{24,60,74},{28,63,105},{28,63,45},{28,61,27},{27,61,18},{31,51,243}, +{26,63,99},{26,61,5},{24,60,74},{31,56,243},{24,60,74},{27,63,84},{27,63,84},{27,63,84},{27,60,81},{26,63,58},{26,62,2},{26,62,2},{26,58,2},{23,63,53},{25,58,9},{27,63,20},{27,63,20},{27,63,20},{27,60,17},{29,54,50},{26,62,2},{26,62,2},{26,58,2},{29,56,50},{26,58,2},{30,58,72},{28,63,20},{28,61,2},{27,61,2},{30,58,72},{31,58,72},{27,61,2}, +{0,60,74},{31,58,72},{0,60,74},{27,0,80},{27,0,80},{27,0,80},{27,0,80},{26,61,0},{26,61,0},{26,61,0},{26,58,1},{24,60,0},{24,60,0},{28,63,331},{28,63,187},{28,63,106},{28,63,94},{28,63,358},{27,63,173},{27,63,4},{27,61,82},{26,63,355},{25,62,65},{29,63,126},{29,63,62},{28,63,25},{28,63,13},{31,56,221},{28,63,121},{27,63,4},{25,62,65},{30,60,221}, +{25,62,65},{28,63,106},{28,63,106},{28,63,106},{28,62,91},{27,63,100},{27,63,4},{27,63,4},{27,60,2},{25,63,72},{26,60,9},{28,63,25},{28,63,25},{28,63,25},{28,62,10},{30,56,50},{27,63,4},{27,63,4},{27,60,2},{30,58,50},{27,60,2},{31,59,61},{29,63,37},{29,63,1},{27,63,4},{31,59,61},{31,61,61},{27,63,4},{0,62,65},{31,61,61},{0,62,65},{28,0,90}, +{28,0,90},{28,0,90},{28,0,90},{27,63,0},{27,63,0},{27,63,0},{27,60,1},{25,62,0},{25,62,0},{29,63,239},{29,63,175},{29,63,139},{29,63,99},{29,63,239},{28,63,122},{28,63,41},{28,62,19},{28,63,233},{26,63,19},{30,63,54},{30,63,38},{30,63,29},{29,63,18},{31,60,93},{29,63,54},{29,63,18},{27,63,9},{31,61,93},{27,63,9},{29,63,139},{29,63,139},{29,63,139}, +{29,63,99},{29,63,139},{28,63,41},{28,63,41},{28,62,3},{27,63,116},{27,62,9},{30,63,29},{30,63,29},{30,63,29},{29,63,18},{31,58,50},{29,63,18},{29,63,18},{28,62,2},{31,60,50},{28,62,2},{31,62,5},{31,63,9},{30,63,4},{30,63,0},{31,62,5},{31,62,9},{30,63,0},{0,63,9},{31,62,9},{0,63,9},{29,0,90},{29,0,90},{29,0,90},{29,0,90},{28,63,5}, +{28,63,5},{28,63,5},{28,61,2},{27,62,8},{27,62,8},{30,63,140},{30,63,124},{30,63,115},{30,63,99},{30,63,131},{29,63,98},{29,63,62},{29,63,2},{29,63,122},{28,63,20},{31,63,25},{31,63,25},{31,63,25},{30,63,18},{31,62,17},{30,63,18},{30,63,9},{29,63,1},{31,62,22},{29,63,1},{30,63,115},{30,63,115},{30,63,115},{30,63,99},{30,63,106},{29,63,62},{29,63,62}, +{29,63,2},{29,63,86},{28,63,20},{31,63,25},{31,63,25},{31,63,25},{30,63,18},{31,61,13},{30,63,9},{30,63,9},{29,63,1},{31,62,13},{29,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{30,0,90},{30,0,90},{30,0,90},{30,0,90},{29,63,26},{29,63,26},{29,63,26},{29,63,2},{28,63,20}, +{28,63,20},{0,13,200},{0,10,52},{0,7,2},{0,6,61},{0,9,441},{0,7,308},{0,5,139},{0,4,318},{0,5,491},{0,4,354},{0,13,200},{0,10,52},{0,7,2},{0,6,61},{2,2,441},{0,7,308},{0,5,139},{0,4,318},{2,3,441},{0,4,318},{0,6,0},{0,6,0},{0,6,0},{0,4,1},{0,3,41},{0,3,20},{0,3,20},{0,2,26},{0,2,50},{0,1,30},{0,6,0}, +{0,6,0},{0,6,0},{0,4,1},{1,0,41},{0,3,20},{0,3,20},{0,2,26},{1,1,41},{0,2,26},{3,3,200},{0,10,52},{0,7,2},{0,6,61},{3,3,200},{4,3,200},{0,6,61},{0,5,202},{4,3,200},{0,5,202},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,18,200},{0,14,20},{0,10,13}, +{0,9,26},{0,12,686},{0,9,419},{0,8,178},{0,5,442},{0,7,789},{0,5,491},{0,18,200},{0,14,20},{0,10,13},{0,9,26},{3,2,686},{0,9,419},{0,8,178},{0,5,442},{6,0,686},{0,5,442},{0,11,1},{0,11,1},{0,11,1},{0,7,0},{0,6,145},{0,5,74},{0,5,74},{0,3,74},{0,3,165},{0,3,90},{0,11,1},{0,11,1},{0,11,1},{0,7,0},{1,2,145}, +{0,5,74},{0,5,74},{0,3,74},{3,0,145},{0,3,74},{5,1,200},{0,14,20},{1,9,2},{0,9,26},{5,1,200},{9,0,200},{0,9,26},{0,7,202},{9,0,200},{0,7,202},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,23,251},{0,17,53},{1,12,78},{0,11,54},{0,17,724},{0,13,362},{0,11,86}, +{0,8,387},{0,9,932},{0,7,498},{1,20,201},{1,16,21},{1,12,14},{1,11,27},{4,4,723},{0,13,362},{0,11,86},{0,8,387},{7,2,723},{0,8,387},{0,17,49},{0,17,49},{0,17,49},{0,10,49},{0,11,162},{0,9,45},{0,9,45},{0,5,50},{0,5,243},{0,5,99},{1,13,2},{1,13,2},{1,13,2},{1,9,1},{3,1,162},{0,9,45},{0,9,45},{0,5,50},{3,3,162}, +{0,5,50},{7,0,200},{0,17,4},{2,11,2},{0,11,5},{7,0,200},{10,2,200},{0,11,5},{0,9,202},{10,2,200},{0,9,202},{0,0,49},{0,0,49},{0,0,49},{0,0,49},{0,5,0},{0,5,0},{0,5,0},{0,3,0},{0,2,13},{0,2,13},{1,25,315},{1,19,117},{1,14,171},{1,13,118},{0,23,723},{0,16,299},{0,13,18},{0,10,318},{0,12,1087},{0,9,516},{2,22,201}, +{2,17,21},{2,14,14},{2,13,27},{5,6,723},{0,16,299},{0,13,18},{0,10,318},{8,4,723},{0,10,318},{1,19,113},{1,19,113},{1,19,113},{1,12,113},{0,16,162},{0,13,17},{0,13,17},{0,8,26},{0,8,338},{0,7,129},{2,15,2},{2,15,2},{2,15,2},{2,11,1},{3,6,162},{0,13,17},{0,13,17},{0,8,26},{8,0,162},{0,8,26},{7,5,200},{1,19,4},{3,13,2}, +{0,13,2},{7,5,200},{14,0,200},{0,13,2},{0,11,202},{14,0,200},{0,11,202},{1,0,113},{1,0,113},{1,0,113},{1,0,113},{0,10,0},{0,10,0},{0,10,0},{0,6,0},{0,5,58},{0,5,58},{2,28,408},{2,22,210},{2,16,281},{2,15,213},{0,29,739},{0,20,260},{0,16,29},{0,13,280},{0,15,1143},{0,12,464},{3,25,200},{3,21,16},{3,16,18},{3,15,20},{7,5,723}, +{0,20,244},{0,16,13},{0,13,264},{14,0,723},{0,13,264},{2,21,209},{2,21,209},{2,21,209},{2,14,209},{1,19,178},{0,17,18},{0,17,18},{0,10,21},{0,12,376},{0,9,121},{3,18,0},{3,18,0},{3,18,0},{3,13,1},{6,2,162},{0,17,2},{0,17,2},{0,10,5},{11,0,162},{0,10,5},{10,1,200},{2,22,2},{4,15,5},{2,15,5},{10,1,200},{17,0,200},{2,15,5}, +{0,13,200},{17,0,200},{0,13,200},{2,0,208},{2,0,208},{2,0,208},{2,0,208},{1,13,16},{1,13,16},{1,13,16},{1,8,17},{0,8,80},{0,8,80},{3,30,408},{3,24,210},{3,18,281},{3,17,213},{1,31,739},{1,22,260},{2,17,27},{1,15,280},{0,19,1000},{0,14,322},{4,26,201},{4,22,21},{4,18,14},{4,17,27},{10,0,723},{0,23,212},{2,17,11},{0,15,225},{15,2,723}, +{0,15,225},{3,23,209},{3,23,209},{3,23,209},{3,16,209},{2,21,178},{1,19,18},{1,19,18},{1,12,21},{0,15,294},{0,12,44},{4,19,2},{4,19,2},{4,19,2},{4,15,2},{8,0,162},{1,19,2},{1,19,2},{0,13,4},{11,3,162},{0,13,4},{11,3,200},{3,24,2},{5,17,2},{2,17,2},{11,3,200},{18,2,200},{2,17,2},{0,15,200},{18,2,200},{0,15,200},{3,0,208}, +{3,0,208},{3,0,208},{3,0,208},{2,15,16},{2,15,16},{2,15,16},{2,10,17},{0,12,40},{0,12,40},{4,31,420},{4,26,222},{4,20,276},{4,19,223},{3,29,740},{2,24,260},{3,19,27},{2,16,270},{0,23,920},{0,16,234},{5,28,201},{5,24,21},{5,20,14},{5,19,27},{11,2,723},{0,27,200},{3,19,11},{0,17,211},{16,4,723},{0,17,211},{4,25,218},{4,25,218},{4,25,218}, +{4,18,218},{3,23,178},{2,21,18},{2,21,18},{2,14,21},{0,19,228},{0,15,17},{5,21,2},{5,21,2},{5,21,2},{5,17,1},{9,2,162},{2,21,2},{2,21,2},{1,15,4},{16,0,162},{1,15,4},{13,1,200},{3,28,2},{6,19,2},{3,19,2},{13,1,200},{19,4,200},{3,19,2},{0,17,202},{19,4,200},{0,17,202},{4,0,218},{4,0,218},{4,0,218},{4,0,218},{3,17,16}, +{3,17,16},{3,17,16},{3,12,17},{0,15,13},{0,15,13},{5,33,420},{5,28,222},{5,22,276},{5,21,223},{3,34,740},{3,26,260},{3,22,29},{3,18,270},{0,25,844},{0,19,202},{6,30,201},{6,26,21},{6,22,14},{6,21,27},{12,4,723},{1,29,200},{3,22,13},{0,19,202},{22,0,723},{0,19,202},{5,27,218},{5,27,218},{5,27,218},{5,20,218},{3,28,178},{3,23,18},{3,23,18}, +{3,16,18},{0,22,195},{1,17,17},{6,23,2},{6,23,2},{6,23,2},{6,19,1},{11,1,162},{3,23,2},{3,23,2},{3,16,2},{17,2,162},{3,16,2},{15,0,200},{5,28,4},{7,21,2},{4,21,2},{15,0,200},{24,1,200},{4,21,2},{0,19,202},{24,1,200},{0,19,202},{5,0,218},{5,0,218},{5,0,218},{5,0,218},{3,22,16},{3,22,16},{3,22,16},{3,16,17},{0,19,0}, +{0,19,0},{6,36,408},{6,30,210},{6,24,276},{6,23,213},{4,37,739},{4,28,260},{4,24,24},{4,21,280},{0,29,780},{1,21,202},{7,33,200},{7,29,17},{7,24,13},{7,23,20},{15,0,723},{2,31,203},{4,24,8},{1,21,201},{24,1,723},{1,21,201},{6,29,209},{6,29,209},{6,29,209},{6,22,209},{5,27,178},{4,25,17},{4,25,17},{4,18,21},{0,26,168},{2,19,14},{7,26,0}, +{7,26,0},{7,26,0},{7,21,1},{13,0,162},{4,25,1},{4,25,1},{3,19,4},{20,2,162},{3,19,4},{16,2,200},{6,30,2},{8,23,5},{6,23,5},{16,2,200},{27,1,200},{6,23,5},{0,21,200},{27,1,200},{0,21,200},{6,0,208},{6,0,208},{6,0,208},{6,0,208},{5,21,16},{5,21,16},{5,21,16},{5,16,17},{1,21,2},{1,21,2},{7,38,408},{7,32,210},{7,26,276}, +{7,25,213},{5,39,739},{5,30,260},{5,26,24},{5,23,280},{0,33,749},{2,23,202},{8,34,201},{8,30,19},{8,26,14},{8,25,21},{16,1,723},{3,33,202},{5,26,8},{2,23,201},{25,3,723},{2,23,201},{7,31,209},{7,31,209},{7,31,209},{7,24,209},{6,29,178},{5,27,17},{5,27,17},{5,20,21},{0,30,164},{3,21,14},{8,28,1},{8,28,1},{8,28,1},{8,23,2},{14,2,162}, +{5,27,1},{5,27,1},{4,21,4},{24,0,162},{4,21,4},{17,4,200},{7,32,2},{9,25,5},{7,25,5},{17,4,200},{27,4,200},{7,25,5},{0,23,200},{27,4,200},{0,23,200},{7,0,208},{7,0,208},{7,0,208},{7,0,208},{6,23,16},{6,23,16},{6,23,16},{6,18,17},{2,23,2},{2,23,2},{8,39,420},{8,34,222},{8,28,286},{8,27,223},{6,41,739},{6,32,260},{6,28,24}, +{6,25,280},{0,36,725},{3,25,202},{9,36,201},{9,32,21},{9,28,14},{9,27,21},{18,0,723},{4,35,200},{6,28,8},{3,25,201},{30,0,723},{3,25,201},{8,33,218},{8,33,218},{8,33,218},{8,26,219},{7,31,178},{6,29,17},{6,29,17},{6,22,21},{2,30,168},{4,23,17},{9,30,1},{9,30,1},{9,30,1},{9,25,2},{16,0,162},{6,29,1},{6,29,1},{5,23,4},{26,1,162}, +{5,23,4},{18,6,200},{7,36,2},{10,27,5},{8,27,5},{18,6,200},{28,6,200},{8,27,5},{0,25,200},{28,6,200},{0,25,200},{8,0,218},{8,0,218},{8,0,218},{8,0,218},{7,25,16},{7,25,16},{7,25,16},{7,20,17},{3,25,2},{3,25,2},{9,41,420},{9,36,222},{9,30,286},{9,29,223},{7,43,739},{7,34,260},{7,30,24},{7,27,280},{1,38,725},{4,27,201},{10,38,201}, +{10,34,21},{10,30,14},{10,29,21},{19,2,723},{5,37,200},{7,30,8},{4,27,201},{31,2,723},{4,27,201},{9,35,218},{9,35,218},{9,35,218},{9,28,219},{7,36,178},{7,31,17},{7,31,17},{7,24,21},{2,33,165},{5,25,17},{10,31,2},{10,31,2},{10,31,2},{10,27,2},{17,2,162},{7,31,1},{7,31,1},{6,25,4},{27,3,162},{6,25,4},{21,1,200},{9,36,4},{11,29,5}, +{9,29,5},{21,1,200},{29,8,200},{9,29,5},{0,27,200},{29,8,200},{0,27,200},{9,0,218},{9,0,218},{9,0,218},{9,0,218},{7,30,16},{7,30,16},{7,30,16},{7,24,17},{4,27,1},{4,27,1},{10,44,408},{10,38,210},{10,32,276},{10,31,217},{8,45,739},{8,36,260},{8,32,24},{8,29,267},{2,41,727},{5,29,207},{11,41,200},{11,37,17},{11,32,13},{11,31,18},{21,1,723}, +{6,39,203},{8,32,8},{6,29,203},{29,8,723},{6,29,203},{10,37,209},{10,37,209},{10,37,209},{10,31,208},{9,35,178},{8,33,17},{8,33,17},{8,27,21},{3,36,165},{6,27,18},{11,34,0},{11,34,0},{11,34,0},{11,30,1},{19,1,162},{8,33,1},{8,33,1},{7,27,2},{29,4,162},{7,27,2},{23,0,200},{10,38,2},{12,32,8},{9,32,5},{23,0,200},{31,9,200},{9,32,5}, +{0,29,202},{31,9,200},{0,29,202},{10,0,208},{10,0,208},{10,0,208},{10,0,208},{9,29,16},{9,29,16},{9,29,16},{9,25,16},{5,30,2},{5,30,2},{11,46,408},{11,40,210},{11,34,276},{11,33,213},{9,47,739},{9,38,260},{9,34,24},{9,31,267},{3,43,727},{6,31,207},{12,42,203},{12,38,19},{12,34,14},{12,33,21},{22,3,723},{7,41,203},{9,34,8},{7,31,203},{30,10,723}, +{7,31,203},{11,39,209},{11,39,209},{11,39,209},{11,32,209},{10,37,178},{9,35,17},{9,35,17},{9,29,21},{4,38,164},{7,29,18},{12,36,1},{12,36,1},{12,36,1},{12,31,2},{20,3,162},{9,35,1},{9,35,1},{8,29,2},{30,6,162},{8,29,2},{24,2,200},{11,40,2},{13,33,5},{11,33,5},{24,2,200},{27,17,200},{11,33,5},{0,31,202},{27,17,200},{0,31,202},{11,0,208}, +{11,0,208},{11,0,208},{11,0,208},{10,31,16},{10,31,16},{10,31,16},{10,27,16},{6,32,2},{6,32,2},{12,47,420},{12,42,220},{12,36,286},{12,35,223},{10,49,739},{10,40,260},{10,36,24},{10,33,280},{3,46,727},{7,33,202},{13,44,203},{13,40,19},{13,36,14},{13,35,21},{24,1,723},{8,43,202},{10,36,8},{7,33,201},{31,12,723},{7,33,201},{12,41,218},{12,41,218},{12,41,218}, +{12,34,219},{11,39,178},{10,37,17},{10,37,17},{10,31,21},{5,40,164},{8,31,21},{13,38,1},{13,38,1},{13,38,1},{13,33,2},{21,5,162},{10,37,1},{10,37,1},{9,31,2},{31,8,162},{9,31,2},{25,4,200},{12,42,2},{14,35,5},{12,35,5},{25,4,200},{28,19,200},{12,35,5},{0,33,200},{28,19,200},{0,33,200},{12,0,218},{12,0,218},{12,0,218},{12,0,218},{11,33,16}, +{11,33,16},{11,33,16},{11,29,16},{7,33,2},{7,33,2},{13,49,420},{13,44,220},{13,38,286},{13,37,223},{11,51,739},{11,42,260},{11,38,24},{11,35,280},{4,48,729},{8,35,201},{14,46,203},{14,42,19},{14,38,14},{14,37,21},{26,0,723},{9,45,202},{11,38,8},{8,35,201},{31,15,723},{8,35,201},{13,43,218},{13,43,218},{13,43,218},{13,36,219},{11,44,178},{11,39,17},{11,39,17}, +{11,32,21},{6,42,164},{9,33,17},{14,40,1},{14,40,1},{14,40,1},{14,35,2},{24,0,162},{11,39,1},{11,39,1},{10,33,4},{31,11,162},{10,33,4},{26,6,200},{13,44,2},{15,37,5},{13,37,5},{26,6,200},{29,21,200},{13,37,5},{0,35,200},{29,21,200},{0,35,200},{13,0,218},{13,0,218},{13,0,218},{13,0,218},{11,38,16},{11,38,16},{11,38,16},{11,32,17},{8,35,1}, +{8,35,1},{14,52,408},{14,46,212},{14,41,282},{14,39,217},{12,53,739},{12,44,259},{12,40,27},{12,37,267},{6,49,727},{9,37,207},{15,49,200},{15,44,20},{15,40,17},{15,39,18},{26,6,723},{10,48,203},{12,40,11},{10,37,203},{29,21,723},{10,37,203},{14,46,208},{14,46,208},{14,46,208},{14,39,208},{13,43,178},{12,41,18},{12,41,18},{12,35,21},{7,44,163},{10,35,18},{15,42,1}, +{15,42,1},{15,42,1},{15,38,1},{24,6,162},{12,41,2},{12,41,2},{11,35,2},{29,17,162},{11,35,2},{28,5,200},{13,48,2},{16,40,5},{13,40,1},{28,5,200},{31,22,200},{13,40,1},{0,37,202},{31,22,200},{0,37,202},{14,0,208},{14,0,208},{14,0,208},{14,0,208},{13,37,16},{13,37,16},{13,37,16},{13,33,16},{9,38,2},{9,38,2},{15,54,408},{15,48,210},{15,43,282}, +{15,41,217},{13,55,739},{13,46,259},{13,42,27},{13,39,267},{7,51,727},{10,39,207},{16,50,203},{16,47,18},{16,42,11},{16,41,26},{29,1,723},{11,49,203},{13,42,11},{11,39,203},{30,23,723},{11,39,203},{15,47,209},{15,47,209},{15,47,209},{15,41,208},{14,45,178},{13,43,18},{13,43,18},{13,37,21},{8,46,164},{11,37,18},{16,44,1},{16,44,1},{16,44,1},{16,39,2},{27,1,162}, +{13,43,2},{13,43,2},{12,37,2},{30,19,162},{12,37,2},{31,0,200},{15,48,2},{17,42,5},{14,42,1},{31,0,200},{28,29,200},{14,42,1},{0,39,202},{28,29,200},{0,39,202},{15,0,208},{15,0,208},{15,0,208},{15,0,208},{14,39,16},{14,39,16},{14,39,16},{14,35,16},{10,40,2},{10,40,2},{16,56,418},{16,50,220},{16,44,283},{16,43,228},{14,57,739},{14,48,260},{14,44,27}, +{14,41,267},{7,54,727},{11,41,207},{17,52,203},{17,48,19},{17,44,11},{17,43,26},{30,3,723},{12,51,202},{14,44,11},{12,41,203},{31,25,723},{12,41,203},{16,49,218},{16,49,218},{16,49,218},{16,43,219},{15,47,178},{14,45,18},{14,45,18},{14,39,21},{9,48,164},{12,39,21},{17,46,1},{17,46,1},{17,46,1},{17,41,2},{28,3,162},{14,45,2},{14,45,2},{13,39,2},{31,21,162}, +{13,39,2},{30,9,200},{16,50,2},{18,44,5},{15,44,1},{30,9,200},{29,31,200},{15,44,1},{0,41,202},{29,31,200},{0,41,202},{16,0,218},{16,0,218},{16,0,218},{16,0,218},{15,41,16},{15,41,16},{15,41,16},{15,37,16},{11,42,2},{11,42,2},{17,58,418},{17,52,220},{17,46,283},{17,45,228},{15,59,739},{15,50,260},{15,46,27},{15,43,267},{8,56,724},{12,43,206},{18,54,203}, +{18,50,19},{18,46,11},{18,45,26},{31,5,723},{13,53,202},{15,46,11},{13,43,203},{31,28,723},{13,43,203},{17,51,218},{17,51,218},{17,51,218},{17,45,219},{15,52,178},{15,47,18},{15,47,18},{15,41,21},{10,50,164},{13,41,21},{18,48,1},{18,48,1},{18,48,1},{18,43,2},{29,5,162},{15,47,2},{15,47,2},{14,41,2},{31,24,162},{14,41,2},{31,11,200},{17,52,2},{19,46,5}, +{16,46,1},{31,11,200},{29,34,200},{16,46,1},{0,43,202},{29,34,200},{0,43,202},{17,0,218},{17,0,218},{17,0,218},{17,0,218},{15,46,17},{15,46,17},{15,46,17},{15,40,16},{12,44,2},{12,44,2},{18,60,410},{18,54,212},{18,49,282},{18,48,218},{17,58,739},{16,52,259},{16,48,27},{16,45,273},{10,57,724},{13,46,208},{19,57,200},{19,52,20},{19,48,17},{19,47,25},{31,11,723}, +{14,56,203},{16,48,11},{14,45,208},{29,34,723},{14,45,208},{18,54,208},{18,54,208},{18,54,208},{18,47,208},{17,51,178},{16,49,18},{16,49,18},{16,43,20},{11,52,163},{14,44,24},{19,50,1},{19,50,1},{19,50,1},{19,46,0},{31,4,162},{16,49,2},{16,49,2},{15,43,4},{30,29,162},{15,43,4},{30,20,200},{18,54,4},{20,48,5},{17,48,1},{30,20,200},{31,35,200},{17,48,1}, +{0,45,208},{31,35,200},{0,45,208},{18,0,208},{18,0,208},{18,0,208},{18,0,208},{17,45,17},{17,45,17},{17,45,17},{17,41,16},{13,46,0},{13,46,0},{19,62,410},{19,56,212},{19,51,282},{19,49,217},{18,60,739},{17,54,259},{17,50,27},{17,47,273},{11,59,724},{14,47,218},{20,59,201},{20,55,18},{20,50,11},{20,49,26},{31,16,723},{15,58,203},{17,50,11},{15,47,208},{30,36,723}, +{15,47,208},{19,56,208},{19,56,208},{19,56,208},{19,49,208},{18,53,178},{17,51,18},{17,51,18},{17,45,20},{12,54,164},{15,46,24},{20,52,1},{20,52,1},{20,52,1},{20,48,2},{30,13,162},{17,51,2},{17,51,2},{16,45,1},{31,31,162},{16,45,1},{31,22,200},{19,56,4},{21,50,5},{18,50,1},{31,22,200},{28,42,200},{18,50,1},{0,47,208},{28,42,200},{0,47,208},{19,0,208}, +{19,0,208},{19,0,208},{19,0,208},{18,47,17},{18,47,17},{18,47,17},{18,43,16},{14,48,2},{14,48,2},{20,63,426},{20,58,223},{20,52,283},{20,51,228},{19,62,739},{18,56,259},{18,52,27},{18,49,267},{12,61,727},{15,49,207},{21,61,201},{21,57,18},{21,52,11},{21,51,26},{31,21,723},{16,60,203},{18,52,11},{16,49,203},{31,38,723},{16,49,203},{20,57,219},{20,57,219},{20,57,219}, +{20,51,219},{19,55,178},{18,53,18},{18,53,18},{18,47,20},{13,56,164},{16,47,17},{21,54,1},{21,54,1},{21,54,1},{21,49,2},{31,15,162},{18,53,2},{18,53,2},{17,47,1},{31,34,162},{17,47,1},{31,27,200},{19,60,4},{22,52,5},{19,52,1},{31,27,200},{29,44,200},{19,52,1},{0,49,202},{29,44,200},{0,49,202},{20,0,218},{20,0,218},{20,0,218},{20,0,218},{19,49,16}, +{19,49,16},{19,49,16},{19,45,16},{15,50,2},{15,50,2},{21,63,468},{21,60,223},{21,54,283},{21,53,228},{20,63,749},{19,58,259},{19,54,27},{19,51,267},{13,63,727},{16,51,206},{22,63,201},{22,59,18},{22,54,11},{22,53,26},{30,30,723},{17,62,203},{19,54,11},{17,51,203},{31,41,723},{17,51,203},{21,59,219},{21,59,219},{21,59,219},{21,53,219},{19,60,180},{19,55,18},{19,55,18}, +{19,49,21},{14,58,164},{17,49,21},{22,56,1},{22,56,1},{22,56,1},{22,51,2},{31,20,162},{19,55,2},{19,55,2},{18,49,2},{31,37,162},{18,49,2},{31,32,200},{20,62,1},{23,54,5},{20,54,1},{31,32,200},{30,46,200},{20,54,1},{0,51,202},{30,46,200},{0,51,202},{21,0,218},{21,0,218},{21,0,218},{21,0,218},{19,54,17},{19,54,17},{19,54,17},{19,48,16},{16,52,2}, +{16,52,2},{22,63,570},{22,63,209},{22,57,288},{22,56,212},{21,63,804},{20,61,254},{20,56,33},{20,53,273},{15,63,753},{17,54,208},{23,63,232},{23,61,13},{23,56,16},{23,55,25},{31,32,723},{19,62,212},{20,56,17},{18,53,208},{30,46,723},{18,53,208},{22,62,208},{22,62,208},{22,62,208},{22,55,208},{20,63,178},{20,57,17},{20,57,17},{20,51,20},{15,60,163},{18,52,24},{23,59,0}, +{23,59,0},{23,59,0},{23,54,0},{31,26,162},{20,57,1},{20,57,1},{19,51,4},{30,42,162},{19,51,4},{31,38,200},{22,63,1},{24,56,1},{21,56,1},{31,38,200},{31,48,200},{21,56,1},{0,53,208},{31,48,200},{0,53,208},{22,0,208},{22,0,208},{22,0,208},{22,0,208},{20,57,16},{20,57,16},{20,57,16},{21,49,16},{17,54,0},{17,54,0},{23,63,696},{23,63,237},{23,59,288}, +{23,58,212},{23,63,888},{21,63,254},{21,58,33},{21,55,273},{17,63,824},{18,56,208},{24,63,273},{24,62,21},{24,58,17},{24,57,26},{30,41,723},{20,63,233},{21,58,17},{19,55,208},{29,50,723},{19,55,208},{23,63,212},{23,63,212},{23,63,212},{23,57,208},{22,61,180},{21,59,17},{21,59,17},{21,53,20},{16,62,163},{19,54,24},{24,60,2},{24,60,2},{24,60,2},{24,56,2},{31,31,162}, +{21,59,1},{21,59,1},{20,53,1},{31,44,162},{20,53,1},{30,47,200},{24,62,20},{25,58,1},{22,58,1},{30,47,200},{31,51,200},{22,58,1},{0,55,208},{31,51,200},{0,55,208},{23,0,208},{23,0,208},{23,0,208},{23,0,208},{21,59,16},{21,59,16},{21,59,16},{22,51,16},{18,56,0},{18,56,0},{25,63,804},{24,63,334},{24,61,283},{24,60,227},{24,63,957},{22,63,297},{22,60,33}, +{22,57,273},{20,63,913},{19,58,208},{26,63,313},{25,63,51},{25,60,17},{25,59,26},{31,43,723},{22,63,281},{22,60,17},{19,58,208},{30,52,723},{19,58,208},{24,63,234},{24,63,234},{24,63,234},{24,59,218},{23,63,180},{22,61,17},{22,61,17},{22,55,20},{18,62,171},{20,55,17},{25,62,2},{25,62,2},{25,62,2},{25,58,2},{31,36,162},{22,61,1},{22,61,1},{21,55,1},{31,47,162}, +{21,55,1},{30,52,200},{25,63,50},{26,60,1},{23,60,1},{30,52,200},{28,58,200},{23,60,1},{0,57,208},{28,58,200},{0,57,208},{24,0,218},{24,0,218},{24,0,218},{24,0,218},{22,61,16},{22,61,16},{22,61,16},{23,53,16},{19,58,0},{19,58,0},{26,63,930},{25,63,492},{25,63,283},{25,62,227},{25,63,1068},{24,63,389},{23,62,33},{23,59,273},{21,63,999},{20,60,209},{27,63,379}, +{26,63,149},{26,62,17},{26,61,26},{31,48,723},{24,63,364},{24,62,16},{20,60,208},{31,54,723},{20,60,208},{25,63,267},{25,63,267},{25,63,267},{25,61,218},{24,63,205},{23,63,17},{23,63,17},{23,57,20},{20,63,189},{21,57,17},{26,63,5},{26,63,5},{26,63,5},{26,60,2},{30,45,162},{23,63,1},{23,63,1},{22,57,1},{31,50,162},{22,57,1},{31,54,200},{27,63,90},{27,62,1}, +{24,62,0},{31,54,200},{29,60,200},{24,62,0},{0,59,208},{29,60,200},{0,59,208},{25,0,218},{25,0,218},{25,0,218},{25,0,218},{23,63,16},{23,63,16},{23,63,16},{23,56,17},{20,60,1},{20,60,1},{27,63,877},{26,63,585},{26,63,329},{26,63,209},{26,63,990},{25,63,397},{25,63,36},{24,61,165},{23,63,910},{22,61,122},{28,63,306},{28,63,162},{27,63,36},{27,63,4},{30,56,546}, +{26,63,306},{25,63,20},{22,61,113},{30,58,546},{22,61,113},{26,63,329},{26,63,329},{26,63,329},{26,63,209},{25,63,276},{25,63,36},{25,63,36},{24,59,18},{22,63,230},{22,60,22},{27,63,36},{27,63,36},{27,63,36},{27,62,0},{29,54,162},{25,63,20},{25,63,20},{24,59,2},{29,56,162},{24,59,2},{31,58,113},{29,63,61},{28,63,0},{26,63,1},{31,58,113},{31,60,113},{26,63,1}, +{0,61,113},{31,60,113},{0,61,113},{26,0,208},{26,0,208},{26,0,208},{26,0,208},{25,62,16},{25,62,16},{25,62,16},{25,57,17},{21,62,1},{21,62,1},{28,63,731},{27,63,573},{27,63,404},{27,63,244},{27,63,797},{26,63,354},{26,63,98},{25,62,57},{25,63,737},{23,62,38},{29,63,190},{29,63,126},{28,63,65},{28,63,5},{31,56,333},{28,63,185},{27,63,52},{24,62,26},{30,60,333}, +{24,62,26},{27,63,404},{27,63,404},{27,63,404},{27,63,244},{27,63,356},{26,63,98},{26,63,98},{25,61,18},{24,63,315},{23,62,22},{28,63,65},{28,63,65},{28,63,65},{28,63,5},{30,56,162},{27,63,52},{27,63,52},{25,61,2},{30,58,162},{25,61,2},{31,61,25},{30,63,13},{30,63,4},{29,63,1},{31,61,25},{31,62,25},{29,63,1},{0,62,25},{31,62,25},{0,62,25},{27,0,208}, +{27,0,208},{27,0,208},{27,0,208},{26,63,17},{26,63,17},{26,63,17},{26,59,17},{23,63,9},{23,63,9},{29,63,642},{28,63,524},{28,63,443},{28,63,299},{28,63,623},{28,63,335},{27,63,201},{26,63,17},{27,63,610},{24,63,26},{30,63,131},{30,63,115},{29,63,101},{29,63,37},{31,59,193},{29,63,121},{28,63,85},{26,63,1},{30,62,193},{26,63,1},{28,63,443},{28,63,443},{28,63,443}, +{28,63,299},{28,63,398},{27,63,201},{27,63,201},{26,63,17},{26,63,378},{24,63,26},{29,63,101},{29,63,101},{29,63,101},{29,63,37},{31,57,145},{28,63,85},{28,63,85},{26,63,1},{31,60,145},{26,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{28,0,218},{28,0,218},{28,0,218},{28,0,218},{27,63,32}, +{27,63,32},{27,63,32},{27,61,17},{24,63,26},{24,63,26},{29,63,418},{29,63,354},{29,63,318},{29,63,254},{29,63,370},{28,63,223},{28,63,142},{28,63,25},{28,63,358},{26,63,58},{30,63,51},{30,63,35},{30,63,26},{30,63,10},{31,61,54},{30,63,34},{30,63,25},{28,63,0},{31,62,54},{28,63,0},{29,63,318},{29,63,318},{29,63,318},{29,63,254},{29,63,270},{28,63,142},{28,63,142}, +{28,63,25},{27,63,249},{26,63,58},{30,63,26},{30,63,26},{30,63,26},{30,63,10},{31,60,41},{30,63,25},{30,63,25},{28,63,0},{31,61,41},{28,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{29,0,218},{29,0,218},{29,0,218},{29,0,218},{28,63,61},{28,63,61},{28,63,61},{28,63,25},{26,63,58}, +{26,63,58},{0,18,421},{0,15,106},{0,10,8},{0,9,117},{0,12,925},{0,9,650},{0,9,286},{0,6,670},{0,7,1030},{0,5,726},{0,18,421},{0,15,106},{0,10,8},{0,9,117},{3,2,925},{0,9,650},{0,9,286},{0,6,670},{6,0,925},{0,6,670},{0,9,0},{0,9,0},{0,9,0},{0,5,1},{0,4,85},{0,4,45},{0,4,45},{0,2,50},{0,2,98},{0,2,59},{0,9,0}, +{0,9,0},{0,9,0},{0,5,1},{1,1,85},{0,4,45},{0,4,45},{0,2,50},{2,0,85},{0,2,50},{5,1,421},{0,15,106},{0,10,8},{0,9,117},{5,1,421},{9,0,421},{0,9,117},{0,7,421},{9,0,421},{0,7,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,24,421},{0,19,53},{0,13,8}, +{0,11,72},{0,16,1261},{0,12,805},{0,11,328},{0,7,822},{0,9,1438},{0,7,922},{0,24,421},{0,19,53},{0,13,8},{0,11,72},{3,6,1261},{0,12,805},{0,11,328},{0,7,822},{8,0,1261},{0,7,822},{0,14,0},{0,14,0},{0,14,0},{0,8,1},{0,7,221},{0,7,116},{0,7,116},{0,4,125},{0,4,257},{0,3,146},{0,14,0},{0,14,0},{0,14,0},{0,8,1},{2,0,221}, +{0,7,116},{0,7,116},{0,4,125},{3,1,221},{0,4,125},{7,0,421},{0,19,53},{1,12,8},{0,11,72},{7,0,421},{11,1,421},{0,11,72},{0,9,421},{11,1,421},{0,9,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,29,430},{0,22,34},{0,15,62},{0,14,49},{0,20,1514},{0,15,866},{0,13,301}, +{0,9,894},{0,11,1797},{0,9,1063},{0,29,430},{0,22,34},{1,15,33},{0,14,49},{6,0,1514},{0,15,866},{0,13,301},{0,9,894},{10,0,1514},{0,9,894},{0,19,10},{0,19,10},{0,19,10},{0,12,10},{0,11,338},{0,9,149},{0,9,149},{0,5,162},{0,5,419},{0,5,211},{0,19,10},{0,19,10},{0,19,10},{0,12,10},{3,1,338},{0,9,149},{0,9,149},{0,5,162},{3,3,338}, +{0,5,162},{8,2,421},{0,22,25},{2,14,8},{0,14,40},{8,2,421},{14,0,421},{0,14,40},{0,11,421},{14,0,421},{0,11,421},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,2,0},{0,2,0},{0,2,0},{0,1,1},{0,1,2},{0,1,2},{1,31,494},{1,24,98},{1,17,131},{1,16,110},{0,25,1517},{0,19,734},{0,15,157},{0,11,789},{0,14,1982},{0,11,1045},{1,31,430}, +{1,24,34},{2,16,35},{1,16,46},{7,2,1514},{0,19,734},{0,15,157},{0,11,789},{11,2,1514},{0,11,789},{1,21,74},{1,21,74},{1,21,74},{1,14,74},{0,16,338},{0,13,89},{0,13,89},{0,8,106},{0,8,514},{0,7,217},{1,21,10},{1,21,10},{1,21,10},{1,14,10},{3,6,338},{0,13,89},{0,13,89},{0,8,106},{8,0,338},{0,8,106},{10,0,421},{0,26,5},{3,16,5}, +{0,16,10},{10,0,421},{17,0,421},{0,16,10},{0,13,421},{17,0,421},{0,13,421},{1,0,73},{1,0,73},{1,0,73},{1,0,73},{0,7,1},{0,7,1},{0,7,1},{0,4,1},{0,3,32},{0,3,32},{1,37,629},{1,28,213},{2,19,340},{1,18,216},{0,31,1517},{0,23,629},{0,18,54},{0,14,686},{0,17,2187},{0,13,1070},{3,30,437},{2,27,33},{3,19,29},{2,18,45},{9,1,1514}, +{0,23,629},{0,18,54},{0,14,686},{13,3,1514},{0,14,686},{1,27,209},{1,27,209},{1,27,209},{1,17,208},{0,22,338},{0,17,34},{0,17,34},{0,11,53},{0,11,666},{0,9,273},{3,21,16},{3,21,16},{3,21,16},{3,15,16},{6,2,338},{0,17,34},{0,17,34},{0,11,53},{11,0,338},{0,11,53},{12,0,421},{0,30,1},{4,18,8},{0,18,5},{12,0,421},{20,0,421},{0,18,5}, +{0,15,421},{20,0,421},{0,15,421},{1,0,208},{1,0,208},{1,0,208},{1,0,208},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{0,6,106},{0,6,106},{2,39,821},{2,30,405},{2,22,557},{2,20,408},{0,36,1517},{0,25,562},{0,21,14},{0,16,589},{0,19,2445},{0,15,1130},{3,35,437},{3,29,33},{4,21,33},{3,20,45},{10,3,1514},{0,25,562},{0,21,14},{0,16,589},{18,0,1514}, +{0,16,589},{2,29,401},{2,29,401},{2,29,401},{2,19,400},{0,27,340},{0,21,10},{0,21,10},{0,13,20},{0,14,851},{0,11,357},{3,26,16},{3,26,16},{3,26,16},{3,18,16},{8,0,338},{0,21,10},{0,21,10},{0,13,20},{11,3,338},{0,13,20},{13,1,421},{1,32,2},{5,20,8},{1,20,5},{13,1,421},{21,2,421},{1,20,5},{0,17,421},{21,2,421},{0,17,421},{2,0,400}, +{2,0,400},{2,0,400},{2,0,400},{0,19,0},{0,19,0},{0,19,0},{0,11,1},{0,9,205},{0,9,205},{3,41,854},{3,32,435},{3,24,590},{3,22,441},{1,38,1518},{0,29,543},{1,23,15},{0,18,575},{0,23,2318},{0,17,906},{4,37,430},{4,30,34},{5,23,33},{4,22,49},{12,1,1514},{0,29,494},{1,23,14},{0,18,526},{19,2,1514},{0,18,526},{3,31,434},{3,31,434},{3,31,434}, +{3,21,433},{1,29,341},{1,23,11},{1,23,11},{1,15,21},{0,17,734},{0,15,230},{4,27,10},{4,27,10},{4,27,10},{4,20,10},{9,2,338},{0,25,2},{0,25,2},{0,15,5},{16,0,338},{0,15,5},{15,0,421},{3,32,2},{6,22,8},{2,22,5},{15,0,421},{25,0,421},{2,22,5},{0,19,421},{25,0,421},{0,19,421},{3,0,433},{3,0,433},{3,0,433},{3,0,433},{1,21,1}, +{1,21,1},{1,21,1},{1,13,2},{0,12,157},{0,12,157},{4,42,866},{4,34,450},{4,26,581},{4,24,458},{2,40,1518},{1,31,543},{2,25,15},{1,20,575},{0,27,2166},{0,20,706},{5,39,430},{5,32,34},{6,25,33},{5,24,49},{14,0,1514},{0,32,461},{2,25,14},{0,20,481},{20,4,1514},{0,20,481},{4,33,445},{4,33,445},{4,33,445},{4,23,445},{2,31,341},{2,25,11},{2,25,11}, +{2,17,27},{0,21,626},{0,17,102},{5,29,10},{5,29,10},{5,29,10},{5,22,10},{11,1,338},{1,27,2},{1,27,2},{0,17,2},{17,2,338},{0,17,2},{16,1,421},{3,36,2},{7,24,8},{3,24,5},{16,1,421},{27,1,421},{3,24,5},{0,21,421},{27,1,421},{0,21,421},{4,0,445},{4,0,445},{4,0,445},{4,0,445},{2,23,1},{2,23,1},{2,23,1},{2,15,2},{0,16,97}, +{0,16,97},{5,45,854},{5,36,438},{5,28,579},{5,26,446},{3,43,1514},{3,32,545},{3,27,9},{3,22,582},{0,31,2010},{0,22,546},{7,38,437},{6,35,33},{7,27,26},{6,26,50},{14,6,1514},{0,37,430},{3,27,9},{0,23,446},{26,0,1514},{0,23,446},{5,35,434},{5,35,434},{5,35,434},{5,25,434},{3,34,338},{3,27,8},{3,27,8},{3,19,20},{0,25,525},{0,19,45},{7,29,16}, +{7,29,16},{7,29,16},{7,23,16},{13,0,338},{2,29,0},{2,29,0},{1,20,4},{20,2,338},{1,20,4},{18,1,421},{4,38,1},{8,26,10},{4,27,2},{18,1,421},{29,2,421},{4,27,2},{0,23,421},{29,2,421},{0,23,421},{5,0,433},{5,0,433},{5,0,433},{5,0,433},{3,25,1},{3,25,1},{3,25,1},{3,17,1},{0,19,41},{0,19,41},{6,47,854},{6,38,438},{6,30,579}, +{6,28,446},{4,45,1515},{3,36,553},{4,29,15},{3,24,589},{0,34,1887},{0,25,450},{7,44,437},{7,37,33},{8,29,30},{7,28,50},{16,4,1514},{0,40,422},{4,29,14},{0,25,425},{27,2,1514},{0,25,425},{6,37,434},{6,37,434},{6,37,434},{6,27,434},{4,35,341},{4,29,14},{4,29,14},{4,21,21},{0,29,461},{0,22,41},{7,34,16},{7,34,16},{7,34,16},{7,26,16},{14,2,338}, +{3,31,0},{3,31,0},{2,22,4},{24,0,338},{2,22,4},{19,3,421},{5,40,1},{8,29,5},{5,29,2},{19,3,421},{30,4,421},{5,29,2},{0,25,421},{30,4,421},{0,25,421},{6,0,433},{6,0,433},{6,0,433},{6,0,433},{4,27,1},{4,27,1},{4,27,1},{4,19,2},{0,23,13},{0,23,13},{7,49,854},{7,40,438},{7,32,590},{7,30,446},{5,47,1515},{4,37,543},{5,31,15}, +{4,26,591},{0,36,1785},{0,27,422},{8,45,430},{8,38,34},{9,31,30},{8,30,43},{17,6,1514},{1,42,422},{5,31,14},{0,27,422},{28,4,1514},{0,27,422},{7,39,434},{7,39,434},{7,39,434},{7,29,434},{5,37,341},{5,31,14},{5,31,14},{5,23,21},{0,32,404},{1,24,41},{8,35,10},{8,35,10},{8,35,10},{8,28,9},{16,0,338},{4,33,2},{4,33,2},{3,24,4},{26,1,338}, +{3,24,4},{21,1,421},{6,42,1},{9,31,5},{6,31,2},{21,1,421},{31,6,421},{6,31,2},{0,27,421},{31,6,421},{0,27,421},{7,0,433},{7,0,433},{7,0,433},{7,0,433},{5,29,1},{5,29,1},{5,29,1},{5,21,2},{0,27,1},{0,27,1},{8,50,866},{8,42,450},{8,34,581},{8,32,458},{6,48,1518},{5,39,543},{6,33,15},{5,28,591},{0,40,1685},{1,29,422},{9,47,430}, +{9,40,34},{10,33,33},{9,32,49},{20,1,1514},{2,44,422},{6,33,14},{1,29,422},{29,6,1514},{1,29,422},{8,41,445},{8,41,445},{8,41,445},{8,31,446},{6,39,341},{6,33,11},{6,33,11},{6,25,21},{0,35,371},{2,26,41},{9,37,10},{9,37,10},{9,37,10},{9,30,9},{17,2,338},{5,35,2},{5,35,2},{5,25,5},{27,3,338},{5,25,5},{23,0,421},{7,44,1},{11,32,8}, +{7,32,5},{23,0,421},{31,9,421},{7,32,5},{0,29,421},{31,9,421},{0,29,421},{8,0,445},{8,0,445},{8,0,445},{8,0,445},{6,31,1},{6,31,1},{6,31,1},{6,23,2},{1,29,1},{1,29,1},{9,53,854},{9,45,437},{9,36,579},{9,34,446},{7,51,1514},{7,41,546},{7,35,9},{6,31,589},{0,44,1607},{2,31,430},{11,46,437},{10,43,36},{11,35,26},{10,34,50},{22,0,1514}, +{3,47,421},{7,35,9},{3,31,426},{31,7,1514},{3,31,426},{9,43,434},{9,43,434},{9,43,434},{9,33,434},{7,42,338},{7,35,8},{7,35,8},{7,27,18},{0,39,344},{3,29,42},{11,37,16},{11,37,16},{11,37,16},{10,32,16},{19,1,338},{6,37,0},{6,37,0},{5,28,1},{29,4,338},{5,28,1},{24,2,421},{8,46,1},{12,34,10},{8,35,2},{24,2,421},{30,14,421},{8,35,2}, +{0,31,425},{30,14,421},{0,31,425},{9,0,433},{9,0,433},{9,0,433},{9,0,433},{7,33,1},{7,33,1},{7,33,1},{7,26,1},{2,32,2},{2,32,2},{10,55,854},{10,47,437},{10,38,579},{10,36,446},{8,53,1515},{7,43,561},{8,37,15},{7,32,589},{0,47,1577},{3,33,425},{11,52,437},{11,45,36},{12,37,30},{11,36,50},{23,2,1514},{4,48,422},{8,37,14},{3,33,425},{28,14,1514}, +{3,33,425},{10,45,434},{10,45,434},{10,45,434},{10,35,434},{8,43,341},{8,37,14},{8,37,14},{8,29,19},{0,43,340},{4,30,38},{11,42,16},{11,42,16},{11,42,16},{11,34,16},{20,3,338},{7,39,0},{7,39,0},{6,30,1},{30,6,338},{6,30,1},{26,1,421},{9,48,1},{12,37,5},{9,37,2},{26,1,421},{30,17,421},{9,37,2},{0,33,421},{30,17,421},{0,33,421},{10,0,433}, +{10,0,433},{10,0,433},{10,0,433},{8,35,1},{8,35,1},{8,35,1},{8,28,2},{3,34,2},{3,34,2},{11,57,854},{11,48,438},{11,40,579},{11,38,446},{9,55,1515},{8,46,555},{9,39,15},{8,34,591},{0,51,1530},{4,35,422},{12,53,430},{12,46,34},{13,39,30},{12,38,43},{24,4,1514},{5,50,422},{9,39,14},{4,35,422},{28,17,1514},{4,35,422},{11,47,434},{11,47,434},{11,47,434}, +{11,37,434},{9,45,341},{9,39,14},{9,39,14},{9,31,19},{1,45,340},{5,32,41},{12,44,9},{12,44,9},{12,44,9},{12,36,9},{21,5,338},{8,41,1},{8,41,1},{7,32,4},{31,8,338},{7,32,4},{27,3,421},{10,50,1},{13,39,5},{10,39,2},{27,3,421},{31,19,421},{10,39,2},{0,35,421},{31,19,421},{0,35,421},{11,0,433},{11,0,433},{11,0,433},{11,0,433},{9,37,1}, +{9,37,1},{9,37,1},{9,30,2},{4,35,1},{4,35,1},{12,58,866},{12,50,450},{12,41,590},{12,40,458},{10,57,1515},{9,48,555},{10,41,15},{9,36,591},{0,54,1518},{5,37,422},{13,55,430},{13,48,34},{14,41,30},{13,40,43},{25,6,1514},{6,52,422},{10,41,14},{5,37,422},{29,19,1514},{5,37,422},{12,49,445},{12,49,445},{12,49,445},{12,39,446},{10,47,341},{10,41,14},{10,41,14}, +{10,33,21},{2,47,340},{6,34,41},{13,46,9},{13,46,9},{13,46,9},{13,38,9},{24,0,338},{9,43,1},{9,43,1},{9,33,5},{31,11,338},{9,33,5},{29,1,421},{11,52,1},{14,41,5},{11,41,2},{29,1,421},{31,22,421},{11,41,2},{0,37,421},{31,22,421},{0,37,421},{12,0,445},{12,0,445},{12,0,445},{12,0,445},{10,39,1},{10,39,1},{10,39,1},{10,31,5},{5,37,1}, +{5,37,1},{13,61,854},{13,53,437},{13,44,593},{13,43,442},{11,59,1517},{11,49,546},{11,43,13},{10,39,589},{1,57,1518},{6,39,430},{15,54,437},{14,51,36},{15,43,25},{14,42,48},{27,5,1514},{7,55,421},{11,43,13},{7,39,426},{31,20,1514},{7,39,426},{13,51,434},{13,51,434},{13,51,434},{13,42,434},{11,50,338},{11,43,13},{11,43,13},{11,35,18},{4,47,341},{7,37,42},{15,45,16}, +{15,45,16},{15,45,16},{15,39,17},{24,6,338},{10,45,1},{10,45,1},{9,36,1},{29,17,338},{9,36,1},{31,0,421},{12,54,1},{16,43,4},{12,43,0},{31,0,421},{30,27,421},{12,43,0},{0,39,425},{30,27,421},{0,39,425},{13,0,433},{13,0,433},{13,0,433},{13,0,433},{11,41,1},{11,41,1},{11,41,1},{11,34,1},{6,40,1},{6,40,1},{14,63,854},{14,55,437},{14,46,593}, +{14,45,442},{12,61,1515},{11,51,561},{12,45,19},{11,41,589},{2,59,1518},{7,41,430},{15,60,437},{15,53,36},{16,45,34},{15,44,48},{30,0,1514},{9,55,425},{12,45,18},{8,41,426},{28,27,1514},{8,41,426},{14,53,434},{14,53,434},{14,53,434},{14,44,434},{12,51,341},{12,46,17},{12,46,17},{12,37,19},{4,51,340},{8,38,38},{15,50,16},{15,50,16},{15,50,16},{15,42,17},{27,1,338}, +{11,47,1},{11,47,1},{10,38,1},{30,19,338},{10,38,1},{31,6,421},{13,56,1},{17,45,4},{13,45,0},{31,6,421},{31,29,421},{13,45,0},{0,41,425},{31,29,421},{0,41,425},{14,0,433},{14,0,433},{14,0,433},{14,0,433},{12,43,1},{12,43,1},{12,43,1},{12,36,2},{7,42,1},{7,42,1},{15,63,878},{15,57,437},{15,48,579},{15,47,442},{13,63,1515},{12,54,555},{13,47,19}, +{12,43,574},{3,61,1518},{8,43,429},{16,61,430},{16,54,34},{17,47,34},{16,46,41},{31,2,1514},{10,57,425},{13,47,18},{9,43,426},{29,29,1514},{9,43,426},{15,55,434},{15,55,434},{15,55,434},{15,46,434},{13,53,341},{13,47,19},{13,47,19},{13,39,19},{5,53,340},{9,40,38},{16,52,9},{16,52,9},{16,52,9},{16,44,10},{28,3,338},{12,49,1},{12,49,1},{11,40,1},{31,21,338}, +{11,40,1},{31,11,421},{14,58,1},{18,47,4},{14,47,0},{31,11,421},{31,32,421},{14,47,0},{0,43,425},{31,32,421},{0,43,425},{15,0,433},{15,0,433},{15,0,433},{15,0,433},{13,45,1},{13,45,1},{13,45,1},{13,38,2},{8,43,4},{8,43,4},{16,63,926},{16,58,450},{16,49,590},{16,48,458},{14,63,1542},{13,56,555},{14,49,15},{13,45,574},{4,62,1517},{9,45,429},{17,63,430}, +{17,56,34},{18,49,30},{17,48,43},{30,11,1514},{11,59,425},{14,49,14},{10,45,426},{30,31,1514},{10,45,426},{16,57,445},{16,57,445},{16,57,445},{16,47,446},{14,55,341},{14,49,14},{14,49,14},{14,41,19},{6,55,340},{10,42,38},{17,54,9},{17,54,9},{17,54,9},{17,46,10},{29,5,338},{13,51,1},{13,51,1},{12,42,1},{31,24,338},{12,42,1},{31,16,421},{15,60,1},{18,49,5}, +{15,49,2},{31,16,421},{31,35,421},{15,49,2},{0,45,425},{31,35,421},{0,45,425},{16,0,445},{16,0,445},{16,0,445},{16,0,445},{14,47,1},{14,47,1},{14,47,1},{14,40,2},{9,45,4},{9,45,4},{17,63,1034},{17,61,438},{17,52,593},{17,51,442},{16,63,1598},{15,57,554},{15,51,13},{15,47,577},{6,63,1535},{10,48,434},{19,63,437},{18,59,41},{19,51,25},{18,50,48},{29,20,1514}, +{11,63,422},{15,51,13},{11,47,433},{31,33,1514},{11,47,433},{17,60,433},{17,60,433},{17,60,433},{17,50,434},{15,58,338},{15,51,13},{15,51,13},{15,43,20},{7,57,339},{12,44,41},{19,53,16},{19,53,16},{19,53,16},{19,47,17},{31,4,338},{14,53,1},{14,53,1},{13,44,1},{30,29,338},{13,44,1},{31,22,421},{16,63,1},{20,51,4},{16,51,0},{31,22,421},{30,40,421},{16,51,0}, +{0,47,433},{30,40,421},{0,47,433},{17,0,433},{17,0,433},{17,0,433},{17,0,433},{15,49,1},{15,49,1},{15,49,1},{15,42,0},{10,48,1},{10,48,1},{18,63,1166},{18,63,438},{18,54,593},{18,53,442},{17,63,1643},{15,60,561},{16,53,19},{15,49,589},{8,63,1566},{11,49,430},{20,63,458},{19,61,41},{20,53,34},{19,52,48},{30,22,1514},{13,63,429},{16,53,18},{12,49,426},{28,40,1514}, +{12,49,426},{18,62,433},{18,62,433},{18,62,433},{18,52,434},{16,60,339},{16,54,17},{16,54,17},{16,45,26},{9,57,341},{13,46,41},{19,58,17},{19,58,17},{19,58,17},{19,50,17},{30,13,338},{15,55,1},{15,55,1},{14,46,1},{31,31,338},{14,46,1},{31,27,421},{18,63,5},{21,53,4},{17,53,0},{31,27,421},{31,42,421},{17,53,0},{0,49,425},{31,42,421},{0,49,425},{18,0,433}, +{18,0,433},{18,0,433},{18,0,433},{16,51,1},{16,51,1},{16,51,1},{16,44,1},{11,50,1},{11,50,1},{20,63,1326},{19,63,470},{19,56,593},{19,55,442},{18,63,1742},{16,62,546},{17,55,19},{16,51,574},{10,63,1638},{12,51,429},{21,63,506},{20,63,29},{21,55,34},{20,54,41},{31,24,1514},{15,63,461},{17,55,18},{13,51,426},{29,42,1514},{13,51,426},{19,63,434},{19,63,434},{19,63,434}, +{19,54,434},{17,62,339},{17,56,17},{17,56,17},{17,47,26},{10,59,341},{13,48,38},{20,60,9},{20,60,9},{20,60,9},{20,52,10},{31,15,338},{16,57,2},{16,57,2},{15,48,1},{31,34,338},{15,48,1},{31,32,421},{20,63,20},{22,55,4},{18,55,0},{31,32,421},{31,45,421},{18,55,0},{0,51,425},{31,45,421},{0,51,425},{19,0,433},{19,0,433},{19,0,433},{19,0,433},{17,53,1}, +{17,53,1},{17,53,1},{17,46,1},{12,51,4},{12,51,4},{21,63,1470},{20,63,561},{20,58,582},{20,57,461},{19,63,1895},{18,62,562},{18,57,19},{17,53,574},{12,63,1761},{13,53,429},{22,63,590},{21,63,59},{22,57,34},{21,56,41},{31,29,1514},{17,63,530},{18,57,18},{14,53,426},{30,44,1514},{14,53,426},{20,63,461},{20,63,461},{20,63,461},{20,55,446},{18,63,341},{18,58,17},{18,58,17}, +{18,49,19},{11,61,341},{14,50,38},{21,62,9},{21,62,9},{21,62,9},{21,54,10},{31,20,338},{17,59,2},{17,59,2},{16,50,1},{31,37,338},{16,50,1},{31,38,421},{21,63,50},{23,57,4},{19,57,0},{31,38,421},{31,48,421},{19,57,0},{0,53,425},{31,48,421},{0,53,425},{20,0,445},{20,0,445},{20,0,445},{20,0,445},{18,55,1},{18,55,1},{18,55,1},{18,48,2},{13,53,4}, +{13,53,4},{22,63,1674},{21,63,753},{21,60,586},{21,59,443},{21,63,2046},{19,63,629},{19,60,19},{19,55,577},{15,63,1917},{14,56,426},{24,63,674},{23,63,120},{23,60,29},{22,58,50},{31,35,1514},{19,63,629},{19,60,19},{14,56,425},{27,51,1514},{14,56,425},{21,63,497},{21,63,497},{21,63,497},{21,58,433},{19,63,388},{19,60,10},{19,60,10},{19,51,20},{12,63,347},{16,52,41},{23,61,17}, +{23,61,17},{23,61,17},{23,55,17},{31,26,338},{18,62,2},{18,62,2},{17,52,1},{30,42,338},{17,52,1},{31,44,421},{23,63,104},{24,59,5},{20,59,1},{31,44,421},{31,51,421},{20,59,1},{0,56,425},{31,51,421},{0,56,425},{21,0,433},{21,0,433},{21,0,433},{21,0,433},{19,58,0},{19,58,0},{19,58,0},{19,50,0},{14,56,1},{14,56,1},{23,63,1902},{22,63,995},{22,62,586}, +{22,61,443},{22,63,2235},{20,63,759},{20,61,15},{19,57,578},{17,63,2118},{15,58,426},{25,63,770},{24,63,250},{24,61,35},{23,60,50},{31,40,1514},{21,63,701},{20,61,14},{15,58,425},{31,49,1514},{15,58,425},{22,63,554},{22,63,554},{22,63,554},{22,60,433},{21,63,437},{20,61,14},{20,61,14},{20,53,26},{14,63,379},{17,54,41},{24,63,25},{24,63,25},{24,63,25},{23,59,17},{31,31,338}, +{19,63,4},{19,63,4},{18,54,1},{31,44,338},{18,54,1},{31,49,421},{25,63,169},{25,61,5},{21,61,1},{31,49,421},{30,56,421},{21,61,1},{0,58,425},{30,56,421},{0,58,425},{22,0,433},{22,0,433},{22,0,433},{22,0,433},{20,59,2},{20,59,2},{20,59,2},{20,52,1},{15,58,1},{15,58,1},{24,63,2045},{24,63,1233},{23,63,629},{23,63,442},{24,63,2360},{22,63,914},{21,63,14}, +{20,59,549},{19,63,2241},{16,60,401},{26,63,849},{25,63,395},{25,63,34},{24,62,41},{29,52,1459},{23,63,778},{21,63,13},{17,59,400},{28,56,1459},{17,59,400},{23,63,629},{23,63,629},{23,63,629},{23,62,433},{22,63,491},{21,63,14},{21,63,14},{21,55,26},{16,63,446},{18,56,41},{25,63,34},{25,63,34},{25,63,34},{24,60,10},{31,36,338},{21,63,13},{21,63,13},{19,56,1},{31,47,338}, +{19,56,1},{31,54,392},{27,63,218},{26,63,4},{22,63,0},{31,54,392},{29,60,392},{22,63,0},{0,59,400},{29,60,392},{0,59,400},{23,0,433},{23,0,433},{23,0,433},{23,0,433},{21,61,2},{21,61,2},{21,61,2},{21,54,1},{16,60,1},{16,60,1},{25,63,1767},{25,63,1167},{24,63,701},{24,63,449},{24,63,1976},{23,63,747},{22,63,66},{21,60,306},{20,63,1820},{17,61,217},{27,63,611}, +{26,63,317},{26,63,61},{25,63,10},{30,52,1064},{25,63,587},{23,63,41},{18,61,208},{28,58,1064},{18,61,208},{24,63,701},{24,63,701},{24,63,701},{24,63,449},{23,63,581},{22,63,66},{22,63,66},{22,57,26},{18,63,530},{19,58,41},{26,63,61},{26,63,61},{26,63,61},{25,62,10},{30,45,338},{23,63,41},{23,63,41},{20,58,1},{31,50,338},{20,58,1},{30,60,200},{28,63,106},{27,63,1}, +{25,63,1},{30,60,200},{31,59,200},{25,63,1},{0,60,208},{31,59,200},{0,60,208},{24,0,445},{24,0,445},{24,0,445},{24,0,445},{22,63,2},{22,63,2},{22,63,2},{22,56,1},{17,62,1},{17,62,1},{26,63,1542},{26,63,1122},{25,63,833},{25,63,497},{26,63,1647},{24,63,687},{24,63,203},{23,61,122},{22,63,1515},{19,62,78},{28,63,410},{28,63,266},{27,63,116},{27,63,20},{30,56,722}, +{26,63,402},{25,63,100},{20,62,65},{30,58,722},{20,62,65},{25,63,833},{25,63,833},{25,63,833},{25,63,497},{24,63,707},{24,63,203},{24,63,203},{23,60,17},{20,63,619},{19,61,46},{27,63,116},{27,63,116},{27,63,116},{27,63,20},{29,54,338},{25,63,100},{25,63,100},{22,60,2},{29,56,338},{22,60,2},{31,59,61},{29,63,37},{29,63,1},{27,63,4},{31,59,61},{31,61,61},{27,63,4}, +{0,62,65},{31,61,61},{0,62,65},{25,0,433},{25,0,433},{25,0,433},{25,0,433},{23,63,25},{23,63,25},{23,63,25},{23,58,1},{19,62,13},{19,62,13},{27,63,1406},{27,63,1134},{26,63,962},{26,63,602},{27,63,1454},{25,63,702},{25,63,341},{24,62,43},{24,63,1378},{20,63,35},{29,63,318},{28,63,250},{28,63,169},{28,63,61},{31,56,509},{28,63,313},{27,63,164},{22,63,10},{30,60,509}, +{22,63,10},{26,63,962},{26,63,962},{26,63,962},{26,63,602},{26,63,827},{25,63,341},{25,63,341},{24,62,27},{22,63,747},{20,63,35},{28,63,169},{28,63,169},{28,63,169},{28,63,61},{30,56,338},{27,63,164},{27,63,164},{23,62,2},{30,58,338},{23,62,2},{31,62,5},{31,63,9},{30,63,4},{30,63,0},{31,62,5},{31,62,9},{30,63,0},{0,63,9},{31,62,9},{0,63,9},{26,0,433}, +{26,0,433},{26,0,433},{26,0,433},{24,63,50},{24,63,50},{24,63,50},{24,60,1},{20,63,26},{20,63,26},{28,63,1135},{28,63,991},{27,63,874},{27,63,602},{28,63,1162},{26,63,618},{26,63,362},{25,63,5},{25,63,1087},{22,63,58},{30,63,219},{29,63,161},{29,63,125},{29,63,61},{30,62,294},{29,63,193},{28,63,117},{24,63,1},{31,60,297},{24,63,1},{27,63,874},{27,63,874},{27,63,874}, +{27,63,602},{27,63,730},{26,63,362},{26,63,362},{25,63,5},{24,63,681},{22,63,58},{29,63,125},{29,63,125},{29,63,125},{29,63,61},{31,56,221},{28,63,117},{28,63,117},{24,63,1},{31,59,221},{24,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{27,0,433},{27,0,433},{27,0,433},{27,0,433},{25,63,101}, +{25,63,101},{25,63,101},{25,62,1},{22,63,58},{22,63,58},{29,63,885},{28,63,751},{28,63,670},{28,63,526},{28,63,778},{27,63,483},{27,63,314},{26,63,10},{26,63,777},{24,63,117},{30,63,75},{30,63,59},{30,63,50},{30,63,34},{31,60,114},{29,63,81},{29,63,45},{27,63,0},{31,61,114},{27,63,0},{28,63,670},{28,63,670},{28,63,670},{28,63,526},{28,63,553},{27,63,314},{27,63,314}, +{26,63,10},{25,63,518},{24,63,117},{30,63,50},{30,63,50},{30,63,50},{30,63,34},{31,59,85},{29,63,45},{29,63,45},{27,63,0},{30,62,85},{27,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{28,0,445},{28,0,445},{28,0,445},{28,0,445},{27,63,145},{27,63,145},{27,63,145},{26,63,10},{24,63,117}, +{24,63,117},{0,26,882},{0,21,218},{0,15,16},{0,13,260},{0,17,1899},{0,13,1341},{0,11,593},{0,8,1380},{0,9,2113},{0,7,1513},{0,26,882},{0,21,218},{0,15,16},{0,13,260},{4,4,1896},{0,13,1341},{0,11,593},{0,8,1380},{7,2,1896},{0,8,1380},{0,12,0},{0,12,0},{0,12,0},{0,7,1},{0,6,162},{0,5,85},{0,5,85},{0,3,85},{0,3,186},{0,3,101},{0,12,0}, +{0,12,0},{0,12,0},{0,7,1},{1,3,162},{0,5,85},{0,5,85},{0,3,85},{3,0,162},{0,3,85},{6,6,882},{0,21,218},{0,15,16},{0,13,260},{6,6,882},{12,1,882},{0,13,260},{0,10,884},{12,1,882},{0,10,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,31,884},{0,25,146},{0,17,2}, +{0,15,185},{0,21,2355},{0,17,1539},{0,13,653},{0,10,1605},{0,11,2667},{0,9,1777},{0,31,884},{0,25,146},{0,17,2},{0,15,185},{5,4,2355},{0,17,1539},{0,13,653},{0,10,1605},{7,4,2355},{0,10,1605},{0,17,1},{0,17,1},{0,17,1},{0,10,1},{0,9,338},{0,8,180},{0,8,180},{0,5,180},{0,5,389},{0,5,229},{0,17,1},{0,17,1},{0,17,1},{0,10,1},{2,2,338}, +{0,8,180},{0,8,180},{0,5,180},{2,3,338},{0,5,180},{9,1,882},{0,25,146},{0,17,2},{0,15,185},{9,1,882},{13,3,882},{0,15,185},{0,12,884},{13,3,882},{0,12,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,36,884},{0,29,90},{0,19,37},{0,17,130},{0,25,2899},{0,19,1764},{0,16,733}, +{0,11,1853},{0,13,3325},{0,11,2109},{0,36,884},{0,29,90},{0,19,37},{0,17,130},{7,1,2899},{0,19,1764},{0,16,733},{0,11,1853},{12,0,2899},{0,11,1853},{0,23,0},{0,23,0},{0,23,0},{0,14,1},{0,11,580},{0,11,305},{0,11,305},{0,6,325},{0,6,667},{0,5,389},{0,23,0},{0,23,0},{0,23,0},{0,14,1},{2,5,578},{0,11,305},{0,11,305},{0,6,325},{5,1,578}, +{0,6,325},{10,3,882},{0,29,90},{1,19,2},{0,17,130},{10,3,882},{18,0,882},{0,17,130},{0,14,884},{18,0,882},{0,14,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,42,918},{0,32,81},{1,21,105},{0,20,109},{0,29,3051},{0,21,1707},{0,19,569},{0,13,1800},{0,16,3672},{0,13,2161},{1,38,888}, +{0,32,81},{1,21,41},{0,20,109},{8,2,3048},{0,21,1707},{0,19,569},{0,13,1800},{12,3,3048},{0,13,1800},{0,28,36},{0,28,36},{0,28,36},{0,17,37},{0,16,648},{0,13,269},{0,13,269},{0,9,292},{0,8,824},{0,7,417},{1,25,4},{1,25,4},{1,25,4},{1,16,5},{3,6,648},{0,13,269},{0,13,269},{0,9,292},{8,0,648},{0,9,292},{12,1,882},{0,32,45},{2,21,2}, +{0,20,73},{12,1,882},{19,2,882},{0,20,73},{0,16,890},{19,2,882},{0,16,890},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,4,0},{0,4,0},{0,4,0},{0,2,1},{0,2,10},{0,2,10},{1,44,997},{1,34,154},{1,24,229},{1,22,178},{0,35,3048},{0,25,1528},{0,21,324},{0,16,1605},{0,19,3907},{0,15,2138},{2,41,883},{2,32,86},{2,24,42},{1,22,114},{9,5,3048}, +{0,25,1528},{0,21,324},{0,16,1605},{15,3,3048},{0,16,1605},{1,31,113},{1,31,113},{1,31,113},{1,19,113},{0,22,648},{0,17,164},{0,17,164},{0,11,193},{0,11,976},{0,9,443},{2,27,2},{2,27,2},{2,27,2},{2,18,1},{6,2,648},{0,17,164},{0,17,164},{0,11,193},{11,0,648},{0,11,193},{13,4,882},{0,36,13},{3,23,4},{0,22,32},{13,4,882},{22,2,882},{0,22,32}, +{0,18,884},{22,2,882},{0,18,884},{1,0,113},{1,0,113},{1,0,113},{1,0,113},{0,10,0},{0,10,0},{0,10,0},{0,6,0},{0,5,58},{0,5,58},{1,49,1173},{1,38,302},{2,26,421},{1,24,321},{0,40,3051},{0,29,1380},{0,23,186},{0,18,1464},{0,21,4201},{0,17,2149},{3,43,883},{3,34,86},{3,26,42},{2,24,114},{12,0,3048},{0,29,1380},{0,23,186},{0,18,1464},{20,0,3048}, +{0,18,1464},{1,36,289},{1,36,289},{1,36,289},{1,22,290},{0,27,650},{0,21,100},{0,21,100},{0,13,130},{0,14,1161},{0,13,491},{3,29,2},{3,29,2},{3,29,2},{3,20,1},{8,0,648},{0,21,100},{0,21,100},{0,13,130},{11,3,648},{0,13,130},{14,6,882},{0,40,1},{4,25,1},{0,25,16},{14,6,882},{26,0,882},{0,25,16},{0,20,884},{26,0,882},{0,20,884},{1,0,289}, +{1,0,289},{1,0,289},{1,0,289},{0,15,1},{0,15,1},{0,15,1},{0,9,1},{0,7,136},{0,7,136},{2,51,1365},{2,40,494},{2,28,722},{2,26,513},{0,46,3048},{0,32,1269},{0,27,82},{0,20,1341},{0,25,4525},{0,19,2197},{4,45,886},{3,38,90},{4,28,36},{3,26,114},{13,2,3048},{0,32,1269},{0,27,82},{0,20,1341},{21,2,3048},{0,20,1341},{2,38,481},{2,38,481},{2,38,481}, +{2,24,482},{0,32,650},{0,25,52},{0,25,52},{0,15,85},{0,17,1345},{0,15,569},{4,31,4},{4,31,4},{4,31,4},{4,22,5},{9,2,648},{0,25,52},{0,25,52},{0,15,85},{16,0,648},{0,15,85},{16,4,882},{1,42,1},{5,27,1},{0,27,1},{16,4,882},{27,2,882},{0,27,1},{0,22,884},{27,2,882},{0,22,884},{2,0,481},{2,0,481},{2,0,481},{2,0,481},{0,21,0}, +{0,21,0},{0,21,0},{0,12,1},{0,9,250},{0,9,250},{2,57,1667},{2,44,786},{3,30,1042},{2,29,801},{0,51,3048},{0,36,1157},{0,29,20},{0,22,1236},{0,27,4891},{0,21,2281},{5,47,886},{4,41,86},{5,30,36},{4,28,116},{14,4,3048},{0,36,1157},{0,29,20},{0,22,1236},{25,0,3048},{0,22,1236},{2,43,785},{2,43,785},{2,43,785},{2,27,786},{0,38,648},{0,29,20},{0,29,20}, +{0,18,40},{0,19,1594},{0,16,677},{5,33,4},{5,33,4},{5,33,4},{5,24,5},{11,1,648},{0,29,20},{0,29,20},{0,18,40},{17,2,648},{0,18,40},{17,6,882},{2,44,1},{6,29,1},{1,29,1},{17,6,882},{28,4,882},{1,29,1},{0,24,884},{28,4,882},{0,24,884},{2,0,785},{2,0,785},{2,0,785},{2,0,785},{0,26,0},{0,26,0},{0,26,0},{0,16,1},{0,11,400}, +{0,11,400},{3,59,1784},{3,46,901},{4,32,1195},{3,31,910},{1,53,3055},{0,40,1094},{1,31,23},{0,25,1175},{0,31,4840},{0,23,2054},{6,49,883},{6,41,81},{6,32,42},{5,30,123},{14,10,3048},{0,40,1058},{1,31,19},{0,25,1139},{28,0,3048},{0,25,1139},{3,46,900},{3,46,900},{3,46,900},{3,30,900},{1,40,654},{1,31,22},{1,31,22},{1,20,38},{0,23,1560},{0,19,533},{6,35,2}, +{6,35,2},{6,35,2},{6,26,1},{13,0,648},{0,33,5},{0,33,5},{0,20,13},{20,2,648},{0,20,13},{19,5,882},{3,46,1},{7,31,5},{2,31,1},{19,5,882},{31,4,882},{2,31,1},{0,26,882},{31,4,882},{0,26,882},{3,0,900},{3,0,900},{3,0,900},{3,0,900},{1,29,4},{1,29,4},{1,29,4},{1,18,4},{0,15,377},{0,15,377},{4,61,1772},{4,48,891},{5,34,1195}, +{4,33,906},{2,55,3055},{1,42,1094},{2,33,29},{1,27,1175},{0,34,4609},{0,26,1716},{7,51,883},{7,43,81},{7,34,42},{6,32,114},{18,1,3048},{0,44,990},{2,33,25},{0,27,1058},{29,2,3048},{0,27,1058},{4,47,891},{4,47,891},{4,47,891},{4,32,891},{2,42,654},{2,33,29},{2,33,29},{2,22,38},{0,27,1396},{0,21,347},{7,37,2},{7,37,2},{7,37,2},{7,28,1},{14,2,648}, +{0,37,1},{0,37,1},{0,23,5},{24,0,648},{0,23,5},{22,0,882},{4,48,1},{8,33,1},{3,33,0},{22,0,882},{31,7,882},{3,33,0},{0,28,882},{31,7,882},{0,28,882},{4,0,890},{4,0,890},{4,0,890},{4,0,890},{2,31,4},{2,31,4},{2,31,4},{2,20,4},{0,19,260},{0,19,260},{5,63,1772},{5,50,891},{6,36,1195},{5,35,906},{3,57,3055},{2,44,1094},{3,35,29}, +{2,29,1175},{0,38,4381},{0,29,1436},{8,53,886},{7,47,89},{8,36,36},{7,34,114},{19,3,3048},{0,47,949},{3,35,25},{0,29,995},{30,4,3048},{0,29,995},{5,49,890},{5,49,890},{5,49,890},{5,33,891},{3,44,654},{3,35,29},{3,35,29},{3,24,38},{0,29,1251},{0,24,221},{8,39,4},{8,39,4},{8,39,4},{8,30,4},{16,0,648},{1,39,1},{1,39,1},{0,25,2},{26,1,648}, +{0,25,2},{23,2,882},{5,50,1},{9,35,1},{4,35,1},{23,2,882},{28,14,882},{4,35,1},{0,30,882},{28,14,882},{0,30,882},{5,0,890},{5,0,890},{5,0,890},{5,0,890},{3,32,5},{3,32,5},{3,32,5},{3,22,4},{0,23,180},{0,23,180},{6,63,1790},{6,52,891},{7,38,1195},{6,37,906},{4,59,3057},{3,46,1094},{4,37,29},{3,31,1175},{0,42,4185},{0,31,1206},{9,55,886}, +{8,49,86},{9,38,36},{8,36,116},{20,5,3048},{0,51,907},{4,37,20},{0,31,950},{31,6,3048},{0,31,950},{6,51,890},{6,51,890},{6,51,890},{6,35,891},{4,46,657},{4,37,29},{4,37,29},{3,26,49},{0,34,1121},{0,27,117},{9,41,4},{9,41,4},{9,41,4},{9,32,5},{17,2,648},{2,41,1},{2,41,1},{1,27,2},{27,3,648},{1,27,2},{24,4,882},{6,52,1},{10,37,1}, +{5,37,1},{24,4,882},{28,17,882},{5,37,1},{0,32,884},{28,17,882},{0,32,884},{6,0,890},{6,0,890},{6,0,890},{6,0,890},{4,34,9},{4,34,9},{4,34,9},{4,24,10},{0,27,116},{0,27,116},{8,63,1844},{7,54,901},{8,40,1188},{7,39,910},{5,62,3052},{4,48,1094},{5,39,23},{4,33,1175},{0,44,3969},{0,33,1039},{10,57,885},{10,49,81},{10,40,35},{9,38,123},{23,1,3048}, +{0,55,888},{5,39,19},{0,34,907},{29,12,3048},{0,34,907},{7,54,900},{7,54,900},{7,54,900},{7,38,900},{5,48,654},{5,39,22},{5,39,22},{5,28,45},{0,38,990},{0,29,80},{10,43,2},{10,43,2},{10,43,2},{10,34,1},{19,1,648},{3,43,1},{3,43,1},{3,29,1},{29,4,648},{3,29,1},{27,0,882},{7,54,1},{11,39,5},{6,39,1},{27,0,882},{31,17,882},{6,39,1}, +{0,34,882},{31,17,882},{0,34,882},{7,0,900},{7,0,900},{7,0,900},{7,0,900},{5,37,4},{5,37,4},{5,37,4},{5,26,4},{0,31,58},{0,31,58},{9,63,1886},{8,56,892},{9,42,1188},{8,41,900},{6,63,3055},{5,50,1094},{6,41,23},{5,35,1175},{0,49,3804},{0,36,935},{11,59,885},{11,51,81},{11,42,35},{10,40,123},{23,6,3048},{0,58,883},{6,41,19},{0,36,886},{30,14,3048}, +{0,36,886},{8,55,891},{8,55,891},{8,55,891},{8,40,891},{6,50,654},{6,41,22},{6,41,22},{6,30,45},{0,40,889},{1,31,80},{11,45,2},{11,45,2},{11,45,2},{11,36,1},{20,3,648},{5,43,2},{5,43,2},{4,31,1},{30,6,648},{4,31,1},{27,5,882},{8,56,2},{12,41,2},{7,41,1},{27,5,882},{31,20,882},{7,41,1},{0,36,882},{31,20,882},{0,36,882},{8,0,890}, +{8,0,890},{8,0,890},{8,0,890},{6,39,4},{6,39,4},{6,39,4},{6,28,4},{0,34,25},{0,34,25},{10,63,1964},{9,58,892},{10,44,1188},{9,43,900},{7,63,3100},{6,52,1094},{7,43,23},{6,37,1175},{0,51,3640},{0,38,887},{12,61,886},{11,55,89},{12,44,38},{11,42,123},{26,1,3048},{1,60,883},{7,43,19},{0,38,883},{30,17,3048},{0,38,883},{9,57,891},{9,57,891},{9,57,891}, +{9,42,891},{7,52,654},{7,43,22},{7,43,22},{7,32,38},{0,44,801},{2,34,86},{12,47,4},{12,47,4},{12,47,4},{12,38,4},{21,5,648},{6,45,2},{6,45,2},{4,33,2},{31,8,648},{4,33,2},{30,0,882},{9,58,2},{13,43,2},{8,43,1},{30,0,882},{28,27,882},{8,43,1},{0,38,882},{28,27,882},{0,38,882},{9,0,890},{9,0,890},{9,0,890},{9,0,890},{7,41,4}, +{7,41,4},{7,41,4},{7,30,4},{0,38,5},{0,38,5},{11,63,2078},{10,60,892},{11,46,1188},{10,45,900},{9,63,3181},{7,54,1094},{8,45,35},{7,39,1175},{0,55,3496},{1,40,887},{13,63,886},{12,56,88},{13,46,38},{12,44,110},{27,3,3048},{2,62,883},{7,46,25},{1,40,883},{31,19,3048},{1,40,883},{10,59,891},{10,59,891},{10,59,891},{10,44,891},{8,54,657},{8,45,34},{8,45,34}, +{7,34,49},{0,48,756},{3,36,86},{13,49,4},{13,49,4},{13,49,4},{13,40,4},{24,0,648},{6,49,1},{6,49,1},{5,35,2},{31,11,648},{5,35,2},{31,2,882},{10,60,2},{14,45,2},{9,45,1},{31,2,882},{29,29,882},{9,45,1},{0,40,882},{29,29,882},{0,40,882},{10,0,890},{10,0,890},{10,0,890},{10,0,890},{8,42,9},{8,42,9},{8,42,9},{8,32,10},{0,42,1}, +{0,42,1},{12,63,2228},{11,63,902},{12,48,1188},{11,47,908},{10,63,3256},{8,57,1095},{9,47,33},{8,41,1164},{0,59,3364},{2,42,889},{14,63,915},{14,57,90},{14,48,35},{13,47,117},{29,2,3048},{4,63,886},{8,48,25},{3,42,885},{29,25,3048},{3,42,885},{11,62,900},{11,62,900},{11,62,900},{11,46,900},{9,57,652},{9,47,29},{9,47,29},{9,36,45},{0,51,691},{4,37,80},{14,51,2}, +{14,51,2},{14,51,2},{14,42,2},{24,6,648},{7,51,1},{7,51,1},{7,37,1},{29,17,648},{7,37,1},{31,8,882},{11,63,2},{15,47,8},{10,47,5},{31,8,882},{31,30,882},{10,47,5},{0,42,884},{31,30,882},{0,42,884},{11,0,900},{11,0,900},{11,0,900},{11,0,900},{9,45,4},{9,45,4},{9,45,4},{9,34,4},{1,44,1},{1,44,1},{13,63,2414},{12,63,907},{13,50,1188}, +{12,49,900},{11,63,3391},{9,59,1095},{10,49,23},{9,43,1164},{0,63,3276},{3,44,889},{15,63,981},{15,59,90},{15,50,35},{14,48,123},{31,1,3048},{6,63,906},{10,49,19},{4,44,885},{30,27,3048},{4,44,885},{12,63,891},{12,63,891},{12,63,891},{12,48,891},{10,59,652},{10,49,22},{10,49,22},{10,38,45},{0,55,659},{5,39,80},{15,53,2},{15,53,2},{15,53,2},{15,44,2},{27,1,648}, +{9,51,2},{9,51,2},{8,39,1},{30,19,648},{8,39,1},{29,20,882},{12,63,17},{16,49,2},{11,49,1},{29,20,882},{31,33,882},{11,49,1},{0,44,884},{31,33,882},{0,44,884},{12,0,890},{12,0,890},{12,0,890},{12,0,890},{10,47,4},{10,47,4},{10,47,4},{10,36,4},{2,46,1},{2,46,1},{15,63,2606},{13,63,987},{14,52,1188},{13,51,900},{13,63,3517},{10,61,1095},{11,51,23}, +{10,45,1164},{1,63,3300},{4,46,892},{17,63,1014},{15,63,94},{16,52,38},{15,50,123},{31,6,3048},{8,63,936},{11,51,19},{5,46,885},{31,29,3048},{5,46,885},{13,63,906},{13,63,906},{13,63,906},{13,50,891},{11,61,652},{11,51,22},{11,51,22},{11,40,45},{0,59,651},{6,41,80},{16,55,4},{16,55,4},{16,55,4},{16,46,5},{28,3,648},{10,53,2},{10,53,2},{9,41,1},{31,21,648}, +{9,41,1},{30,22,882},{14,63,37},{17,51,2},{12,51,1},{30,22,882},{28,40,882},{12,51,1},{0,46,884},{28,40,882},{0,46,884},{13,0,890},{13,0,890},{13,0,890},{13,0,890},{11,49,4},{11,49,4},{11,49,4},{11,38,4},{3,48,0},{3,48,0},{16,63,2792},{15,63,1079},{15,54,1188},{14,53,900},{14,63,3652},{11,63,1095},{12,53,35},{11,47,1164},{3,63,3436},{5,48,887},{18,63,1080}, +{17,62,102},{17,54,38},{16,52,110},{30,15,3048},{10,63,996},{11,54,25},{5,48,883},{31,32,3048},{5,48,883},{14,63,939},{14,63,939},{14,63,939},{14,52,891},{12,62,657},{12,53,34},{12,53,34},{12,42,50},{1,61,651},{7,43,80},{17,57,4},{17,57,4},{17,57,4},{17,48,4},{29,5,648},{11,55,2},{11,55,2},{10,43,1},{31,24,648},{10,43,1},{31,24,882},{16,63,80},{18,53,2}, +{13,53,1},{31,24,882},{29,42,882},{13,53,1},{0,48,882},{29,42,882},{0,48,882},{14,0,890},{14,0,890},{14,0,890},{14,0,890},{12,50,9},{12,50,9},{12,50,9},{12,40,9},{4,50,1},{4,50,1},{17,63,3038},{16,63,1268},{16,57,1186},{15,55,908},{15,63,3879},{12,63,1146},{13,55,33},{12,49,1164},{5,63,3667},{6,50,889},{19,63,1205},{18,63,147},{18,56,41},{17,55,117},{31,17,3048}, +{12,63,1110},{12,56,20},{7,50,885},{29,38,3048},{7,50,885},{16,63,979},{16,63,979},{16,63,979},{15,54,900},{13,63,670},{13,55,29},{13,55,29},{13,45,41},{2,63,648},{8,46,81},{18,60,1},{18,60,1},{18,60,1},{18,50,2},{31,4,648},{11,59,4},{11,59,4},{11,45,1},{30,29,648},{11,45,1},{31,30,882},{18,63,146},{19,56,5},{14,55,5},{31,30,882},{31,43,882},{14,55,5}, +{0,50,884},{31,43,882},{0,50,884},{15,0,900},{15,0,900},{15,0,900},{15,0,900},{13,53,4},{13,53,4},{13,53,4},{13,42,5},{5,52,1},{5,52,1},{18,63,3308},{17,63,1502},{17,59,1186},{16,57,898},{17,63,4077},{14,63,1230},{14,57,33},{13,51,1164},{8,63,3820},{7,52,889},{21,63,1368},{19,63,261},{19,58,41},{18,57,117},{30,26,3048},{14,63,1226},{13,58,20},{8,52,885},{30,40,3048}, +{8,52,885},{17,63,1018},{17,63,1018},{17,63,1018},{16,56,890},{14,63,724},{14,57,29},{14,57,29},{14,47,41},{4,63,665},{9,48,88},{19,62,1},{19,62,1},{19,62,1},{19,52,2},{30,13,648},{12,61,1},{12,61,1},{12,47,1},{31,31,648},{12,47,1},{31,35,882},{20,63,193},{20,58,4},{15,57,5},{31,35,882},{27,51,882},{15,57,5},{0,52,884},{27,51,882},{0,52,884},{16,0,890}, +{16,0,890},{16,0,890},{16,0,890},{14,55,4},{14,55,4},{14,55,4},{14,44,5},{6,54,1},{6,54,1},{19,63,3614},{18,63,1804},{18,61,1186},{17,59,898},{18,63,4284},{15,63,1417},{15,59,33},{14,53,1164},{9,63,4036},{8,54,892},{22,63,1494},{20,63,405},{20,60,33},{19,59,117},{31,28,3048},{16,63,1395},{14,60,20},{9,54,885},{31,42,3048},{9,54,885},{18,63,1075},{18,63,1075},{18,63,1075}, +{17,58,890},{16,63,787},{15,59,29},{15,59,29},{15,48,45},{6,63,705},{10,49,80},{20,63,5},{20,63,5},{20,63,5},{20,54,5},{31,15,648},{13,63,1},{13,63,1},{13,49,1},{31,34,648},{13,49,1},{31,40,882},{22,63,277},{21,60,4},{16,59,5},{31,40,882},{31,49,882},{16,59,5},{0,54,884},{31,49,882},{0,54,884},{17,0,890},{17,0,890},{17,0,890},{17,0,890},{15,57,4}, +{15,57,4},{15,57,4},{15,46,5},{7,56,1},{7,56,1},{20,63,4014},{19,63,2174},{19,63,1186},{18,61,898},{19,63,4545},{17,63,1725},{16,62,39},{15,55,1164},{11,63,4300},{9,56,892},{23,63,1656},{22,63,585},{21,62,33},{20,60,108},{31,33,3048},{18,63,1563},{15,62,20},{10,56,885},{31,45,3048},{10,56,885},{19,63,1150},{19,63,1150},{19,63,1150},{18,60,890},{17,63,841},{16,62,35},{16,62,35}, +{16,50,50},{8,63,747},{11,51,80},{21,63,20},{21,63,20},{21,63,20},{21,56,5},{31,20,648},{15,63,5},{15,63,5},{14,51,1},{31,37,648},{14,51,1},{29,52,882},{23,63,397},{22,62,4},{17,61,5},{29,52,882},{28,56,882},{17,61,5},{0,56,884},{28,56,882},{0,56,884},{18,0,890},{18,0,890},{18,0,890},{18,0,890},{16,58,10},{16,58,10},{16,58,10},{16,48,9},{8,58,0}, +{8,58,0},{22,63,4123},{21,63,2404},{20,63,1278},{19,63,901},{20,63,4626},{18,63,1849},{17,63,38},{16,57,1006},{14,63,4330},{10,58,771},{24,63,1629},{23,63,715},{22,63,65},{22,62,81},{31,38,2814},{20,63,1505},{17,63,34},{11,58,761},{31,48,2814},{11,58,761},{20,63,1278},{20,63,1278},{20,63,1278},{19,62,901},{18,63,948},{17,63,38},{17,63,38},{17,53,41},{10,63,840},{12,54,81},{22,63,65}, +{22,63,65},{22,63,65},{22,59,2},{31,26,648},{17,63,34},{17,63,34},{15,53,1},{30,42,648},{15,53,1},{31,50,761},{25,63,425},{23,63,9},{19,63,1},{31,50,761},{31,55,761},{19,63,1},{0,58,761},{31,55,761},{0,58,761},{19,0,900},{19,0,900},{19,0,900},{19,0,900},{17,61,4},{17,61,4},{17,61,4},{17,50,5},{9,60,2},{9,60,2},{23,63,3735},{22,63,2314},{21,63,1395}, +{20,63,899},{22,63,4090},{19,63,1618},{18,63,104},{17,58,678},{15,63,3826},{11,59,507},{25,63,1285},{24,63,609},{23,63,122},{23,62,26},{30,45,2249},{21,63,1186},{19,63,74},{13,59,482},{31,50,2249},{13,59,482},{21,63,1395},{21,63,1395},{21,63,1395},{20,63,899},{19,63,1086},{18,63,104},{18,63,104},{18,55,41},{12,63,969},{13,56,81},{23,63,122},{23,63,122},{23,63,122},{23,61,2},{31,31,648}, +{19,63,74},{19,63,74},{16,55,1},{31,44,648},{16,55,1},{31,53,481},{27,63,269},{25,63,0},{21,63,0},{31,53,481},{31,57,481},{21,63,0},{0,59,481},{31,57,481},{0,59,481},{20,0,890},{20,0,890},{20,0,890},{20,0,890},{18,63,4},{18,63,4},{18,63,4},{18,52,5},{10,62,2},{10,62,2},{23,63,3399},{23,63,2260},{22,63,1530},{21,63,954},{23,63,3639},{20,63,1402},{19,63,238}, +{18,59,405},{17,63,3443},{13,60,297},{26,63,1009},{25,63,525},{25,63,164},{24,63,5},{29,52,1769},{23,63,918},{21,63,113},{14,60,266},{28,56,1769},{14,60,266},{22,63,1530},{22,63,1530},{22,63,1530},{21,63,954},{21,63,1251},{19,63,238},{19,63,238},{19,57,41},{14,63,1105},{14,58,81},{25,63,164},{25,63,164},{25,63,164},{24,62,5},{31,36,648},{21,63,113},{21,63,113},{17,57,1},{31,47,648}, +{17,57,1},{31,55,265},{28,63,145},{27,63,4},{24,63,1},{31,55,265},{30,60,265},{24,63,1},{0,60,265},{30,60,265},{0,60,265},{21,0,890},{21,0,890},{21,0,890},{21,0,890},{19,63,13},{19,63,13},{19,63,13},{19,54,5},{12,62,8},{12,62,8},{24,63,3069},{24,63,2257},{23,63,1683},{23,63,1054},{24,63,3258},{22,63,1330},{21,63,378},{19,61,213},{20,63,3102},{14,61,166},{27,63,801}, +{26,63,477},{26,63,221},{25,63,20},{30,52,1374},{24,63,758},{23,63,181},{16,61,114},{28,58,1374},{16,61,114},{23,63,1683},{23,63,1683},{23,63,1683},{23,63,1054},{22,63,1401},{21,63,378},{21,63,378},{19,59,46},{16,63,1296},{15,60,81},{26,63,221},{26,63,221},{26,63,221},{25,63,20},{30,45,648},{23,63,181},{23,63,181},{18,59,1},{31,50,648},{18,59,1},{31,58,113},{29,63,61},{28,63,0}, +{26,63,1},{31,58,113},{31,60,113},{26,63,1},{0,61,113},{31,60,113},{0,61,113},{22,0,890},{22,0,890},{22,0,890},{22,0,890},{20,63,45},{20,63,45},{20,63,45},{20,56,10},{13,63,25},{13,63,25},{25,63,2860},{25,63,2260},{24,63,1854},{24,63,1210},{25,63,2932},{23,63,1310},{22,63,609},{20,62,81},{21,63,2731},{16,62,94},{28,63,630},{27,63,475},{27,63,306},{26,63,101},{30,56,1032}, +{26,63,612},{25,63,290},{18,62,21},{30,58,1032},{18,62,21},{24,63,1854},{24,63,1854},{24,63,1854},{24,63,1210},{23,63,1620},{22,63,609},{22,63,609},{21,61,44},{18,63,1515},{16,62,78},{27,63,306},{27,63,306},{27,63,306},{26,63,101},{29,54,648},{25,63,290},{25,63,290},{19,61,5},{29,56,648},{19,61,5},{31,61,18},{30,63,10},{30,63,1},{29,63,0},{31,61,18},{31,62,18},{29,63,0}, +{0,62,20},{31,62,18},{0,62,20},{23,0,900},{23,0,900},{23,0,900},{23,0,900},{21,63,104},{21,63,104},{21,63,104},{21,59,5},{15,63,65},{15,63,65},{26,63,2626},{26,63,2206},{25,63,1915},{25,63,1315},{26,63,2641},{24,63,1333},{23,63,789},{22,63,40},{22,63,2445},{17,63,116},{29,63,524},{28,63,406},{28,63,325},{27,63,170},{31,56,771},{27,63,507},{26,63,320},{20,63,0},{30,60,771}, +{20,63,0},{25,63,1915},{25,63,1915},{25,63,1915},{25,63,1315},{24,63,1661},{23,63,789},{23,63,789},{22,62,29},{20,63,1517},{17,63,116},{28,63,325},{28,63,325},{28,63,325},{27,63,170},{31,52,578},{26,63,320},{26,63,320},{20,63,0},{28,60,578},{20,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{24,0,890}, +{24,0,890},{24,0,890},{24,0,890},{23,63,164},{23,63,164},{23,63,164},{22,61,5},{17,63,116},{17,63,116},{27,63,2156},{27,63,1884},{26,63,1630},{26,63,1210},{26,63,2081},{25,63,1108},{24,63,705},{23,63,5},{23,63,1927},{19,63,180},{29,63,300},{29,63,236},{29,63,200},{28,63,85},{31,57,451},{28,63,283},{27,63,194},{23,63,1},{29,62,451},{23,63,1},{26,63,1630},{26,63,1630},{26,63,1630}, +{26,63,1210},{25,63,1347},{24,63,705},{24,63,705},{23,63,5},{22,63,1229},{19,63,180},{29,63,200},{29,63,200},{29,63,200},{28,63,85},{30,58,338},{27,63,194},{27,63,194},{23,63,1},{31,58,338},{23,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{25,0,890},{25,0,890},{25,0,890},{25,0,890},{24,63,221}, +{24,63,221},{24,63,221},{23,63,5},{19,63,180},{19,63,180},{28,63,1782},{27,63,1564},{27,63,1395},{27,63,1123},{27,63,1620},{26,63,937},{25,63,651},{24,63,25},{24,63,1560},{21,63,233},{30,63,150},{30,63,134},{29,63,104},{29,63,40},{31,59,216},{29,63,136},{28,63,90},{25,63,1},{30,62,216},{25,63,1},{27,63,1395},{27,63,1395},{27,63,1395},{27,63,1123},{26,63,1101},{25,63,651},{25,63,651}, +{24,63,25},{23,63,998},{21,63,233},{29,63,104},{29,63,104},{29,63,104},{29,63,40},{31,57,162},{28,63,90},{28,63,90},{25,63,1},{29,62,162},{25,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{26,0,890},{26,0,890},{26,0,890},{26,0,890},{25,63,290},{25,63,290},{25,63,290},{24,63,25},{21,63,233}, +{21,63,233},{0,34,1570},{0,27,400},{0,19,25},{0,16,481},{0,23,3372},{0,17,2355},{0,15,1053},{0,11,2425},{0,13,3753},{0,11,2681},{0,34,1570},{0,27,400},{0,19,25},{0,16,481},{7,0,3371},{0,17,2355},{0,15,1053},{0,11,2425},{10,2,3371},{0,11,2425},{0,16,0},{0,16,0},{0,16,0},{0,10,1},{0,8,288},{0,7,149},{0,7,149},{0,5,160},{0,4,332},{0,4,200},{0,16,0}, +{0,16,0},{0,16,0},{0,10,1},{1,5,288},{0,7,149},{0,7,149},{0,5,160},{4,0,288},{0,5,160},{10,1,1568},{0,27,400},{0,19,25},{0,16,481},{10,1,1568},{17,0,1568},{0,16,481},{0,13,1568},{17,0,1568},{0,13,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,40,1568},{0,31,296},{0,22,2}, +{0,20,373},{0,27,3968},{0,21,2627},{0,17,1107},{0,13,2720},{0,15,4479},{0,11,3065},{0,40,1568},{0,31,296},{0,22,2},{0,20,373},{7,3,3968},{0,21,2627},{0,17,1107},{0,13,2720},{13,0,3968},{0,13,2720},{0,21,1},{0,21,1},{0,21,1},{0,13,0},{0,11,512},{0,9,269},{0,9,269},{0,5,288},{0,5,593},{0,5,337},{0,21,1},{0,21,1},{0,21,1},{0,13,0},{3,1,512}, +{0,9,269},{0,9,269},{0,5,288},{3,3,512},{0,5,288},{11,3,1568},{0,31,296},{0,22,2},{0,20,373},{11,3,1568},{18,2,1568},{0,20,373},{0,15,1568},{18,2,1568},{0,15,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,45,1568},{0,34,221},{0,24,17},{0,22,274},{0,30,4651},{0,23,2924},{0,19,1209}, +{0,15,3065},{0,17,5292},{0,13,3465},{0,45,1568},{0,34,221},{0,24,17},{0,22,274},{8,3,4651},{0,23,2924},{0,19,1209},{0,15,3065},{14,1,4651},{0,15,3065},{0,27,0},{0,27,0},{0,27,0},{0,16,0},{0,13,802},{0,12,424},{0,12,424},{0,7,433},{0,7,918},{0,7,533},{0,27,0},{0,27,0},{0,27,0},{0,16,0},{4,0,800},{0,12,424},{0,12,424},{0,7,433},{6,1,800}, +{0,7,433},{13,1,1568},{0,34,221},{1,24,2},{0,22,274},{13,1,1568},{19,4,1568},{0,22,274},{0,17,1570},{19,4,1568},{0,17,1570},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,50,1568},{0,38,145},{0,26,82},{0,24,193},{0,34,5419},{0,25,3275},{0,21,1347},{0,16,3410},{0,17,6220},{0,15,3933},{0,50,1568}, +{0,38,145},{1,26,81},{0,24,193},{10,0,5419},{0,25,3275},{0,21,1347},{0,16,3410},{15,2,5419},{0,16,3410},{0,32,0},{0,32,0},{0,32,0},{0,19,0},{0,16,1152},{0,15,605},{0,15,605},{0,9,628},{0,8,1328},{0,7,789},{0,32,0},{0,32,0},{0,32,0},{0,19,0},{3,6,1152},{0,15,605},{0,15,605},{0,9,628},{8,0,1152},{0,9,628},{15,0,1568},{0,38,145},{2,26,2}, +{0,24,193},{15,0,1568},{24,1,1568},{0,24,193},{0,19,1570},{24,1,1568},{0,19,1570},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,53,1633},{0,42,166},{1,29,162},{0,26,209},{0,40,5419},{0,29,3012},{0,25,964},{0,18,3152},{0,21,6513},{0,17,3861},{1,53,1569},{1,42,138},{2,28,74},{1,26,186},{11,3,5419}, +{0,29,3012},{0,25,964},{0,18,3152},{18,2,5419},{0,18,3152},{1,34,66},{1,34,66},{1,34,66},{1,21,66},{0,22,1152},{0,19,442},{0,19,442},{0,11,493},{0,11,1480},{0,11,749},{1,34,2},{1,34,2},{1,34,2},{1,21,2},{6,2,1152},{0,19,442},{0,19,442},{0,11,493},{11,0,1152},{0,11,493},{16,2,1568},{0,42,85},{3,28,0},{0,26,128},{16,2,1568},{27,1,1568},{0,26,128}, +{0,21,1568},{27,1,1568},{0,21,1568},{1,0,65},{1,0,65},{1,0,65},{1,0,65},{0,6,0},{0,6,0},{0,6,0},{0,4,1},{0,3,20},{0,3,20},{1,58,1713},{1,44,230},{2,31,354},{1,28,273},{0,45,5419},{0,32,2817},{0,27,682},{0,20,2945},{0,25,6853},{0,19,3825},{2,55,1569},{2,44,138},{3,30,74},{2,28,186},{13,1,5419},{0,32,2817},{0,27,682},{0,20,2945},{19,4,5419}, +{0,20,2945},{1,40,145},{1,40,145},{1,40,145},{1,25,146},{0,27,1154},{0,23,338},{0,23,338},{0,13,394},{0,14,1665},{0,13,755},{2,36,2},{2,36,2},{2,36,2},{2,23,2},{8,0,1152},{0,23,338},{0,23,338},{0,13,394},{11,3,1152},{0,13,394},{17,4,1568},{0,46,41},{4,30,1},{0,29,80},{17,4,1568},{27,4,1568},{0,29,80},{0,23,1568},{27,4,1568},{0,23,1568},{1,0,145}, +{1,0,145},{1,0,145},{1,0,145},{0,11,1},{0,11,1},{0,11,1},{0,7,0},{0,5,74},{0,5,74},{2,60,1905},{1,49,393},{2,33,531},{1,31,433},{0,50,5419},{0,36,2609},{0,29,468},{0,22,2756},{0,27,7195},{0,21,3825},{3,57,1569},{3,46,138},{4,32,81},{3,30,186},{15,0,5419},{0,36,2609},{0,29,468},{0,22,2756},{24,1,5419},{0,22,2756},{2,42,337},{2,42,337},{2,42,337}, +{2,27,338},{0,32,1154},{0,25,244},{0,25,244},{0,16,289},{0,17,1849},{0,15,797},{3,38,2},{3,38,2},{3,38,2},{3,25,2},{9,2,1152},{0,25,244},{0,25,244},{0,16,289},{16,0,1152},{0,16,289},{18,6,1568},{0,51,16},{5,32,2},{0,31,41},{18,6,1568},{28,6,1568},{0,31,41},{0,25,1568},{28,6,1568},{0,25,1568},{2,0,337},{2,0,337},{2,0,337},{2,0,337},{0,17,0}, +{0,17,0},{0,17,0},{0,10,0},{0,7,164},{0,7,164},{2,63,2145},{2,51,585},{3,35,851},{2,33,618},{0,55,5420},{0,40,2425},{0,32,274},{0,24,2585},{0,29,7609},{0,23,3861},{4,58,1570},{4,47,136},{5,34,81},{4,32,193},{16,1,5419},{0,40,2425},{0,32,274},{0,24,2585},{25,3,5419},{0,24,2585},{2,47,545},{2,47,545},{2,47,545},{2,30,545},{0,38,1152},{0,29,164},{0,29,164}, +{0,18,208},{0,19,2098},{0,17,869},{4,40,0},{4,40,0},{4,40,0},{4,27,1},{11,1,1152},{0,29,164},{0,29,164},{0,18,208},{17,2,1152},{0,18,208},{21,1,1568},{0,54,2},{6,34,2},{0,33,13},{21,1,1568},{29,8,1568},{0,33,13},{0,27,1568},{29,8,1568},{0,27,1568},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,22,0},{0,22,0},{0,22,0},{0,13,1},{0,10,289}, +{0,10,289},{3,63,2596},{3,53,934},{3,37,1277},{2,35,964},{0,61,5420},{0,44,2242},{0,35,141},{0,28,2402},{0,32,8131},{0,25,3956},{5,61,1569},{5,50,138},{6,36,74},{5,34,186},{17,4,5419},{0,44,2242},{0,35,141},{0,28,2402},{27,4,5419},{0,28,2402},{3,49,901},{3,49,901},{3,49,901},{3,32,900},{0,44,1152},{0,34,97},{0,34,97},{0,20,145},{0,23,2436},{0,19,989},{5,43,1}, +{5,43,1},{5,43,1},{5,30,2},{13,0,1152},{0,34,97},{0,34,97},{0,20,145},{20,2,1152},{0,20,145},{23,0,1568},{1,57,2},{7,36,0},{0,36,1},{23,0,1568},{31,9,1568},{0,36,1},{0,29,1570},{31,9,1568},{0,29,1570},{3,0,900},{3,0,900},{3,0,900},{3,0,900},{0,28,0},{0,28,0},{0,28,0},{0,17,1},{0,13,461},{0,13,461},{4,63,3146},{3,57,1262},{4,40,1731}, +{3,37,1284},{1,63,5484},{0,46,2129},{0,38,53},{0,30,2243},{0,36,8615},{0,27,4070},{6,63,1569},{6,52,138},{7,38,74},{6,36,186},{18,6,5419},{0,46,2129},{0,38,53},{0,30,2243},{28,6,5419},{0,30,2243},{3,55,1252},{3,55,1252},{3,55,1252},{3,35,1253},{0,49,1152},{0,38,53},{0,38,53},{0,23,89},{0,25,2763},{0,21,1139},{6,45,1},{6,45,1},{6,45,1},{6,32,2},{14,2,1152}, +{0,38,53},{0,38,53},{0,23,89},{24,0,1152},{0,23,89},{24,2,1568},{2,59,2},{8,38,1},{1,38,1},{24,2,1568},{27,17,1568},{1,38,1},{0,31,1570},{27,17,1568},{0,31,1570},{3,0,1252},{3,0,1252},{3,0,1252},{3,0,1252},{0,33,0},{0,33,0},{0,33,0},{0,20,0},{0,15,653},{0,15,653},{5,63,3716},{4,58,1599},{4,42,2134},{4,39,1627},{2,63,5655},{0,51,1983},{0,40,33}, +{0,32,2133},{0,38,8925},{0,30,4044},{7,63,1587},{7,54,138},{8,40,80},{7,38,186},{21,1,5419},{0,51,1979},{0,40,29},{0,32,2129},{29,8,5419},{0,32,2129},{4,56,1587},{4,56,1587},{4,56,1587},{4,37,1586},{0,54,1156},{0,41,29},{0,41,29},{0,25,54},{0,27,2988},{0,23,1193},{7,47,1},{7,47,1},{7,47,1},{7,33,2},{16,0,1152},{0,41,25},{0,41,25},{0,25,50},{26,1,1152}, +{0,25,50},{25,4,1568},{3,61,2},{9,40,1},{2,40,1},{25,4,1568},{28,19,1568},{2,40,1},{0,33,1568},{28,19,1568},{0,33,1568},{4,0,1586},{4,0,1586},{4,0,1586},{4,0,1586},{0,38,5},{0,38,5},{0,38,5},{0,23,4},{0,17,754},{0,17,754},{6,63,3890},{5,60,1599},{5,44,2134},{5,41,1627},{3,63,5748},{0,55,1975},{1,42,33},{0,33,2085},{0,42,8569},{0,32,3525},{9,63,1634}, +{8,55,136},{9,42,80},{8,40,208},{22,3,5419},{0,55,1875},{1,42,29},{0,33,1985},{30,10,5419},{0,33,1985},{5,58,1587},{5,58,1587},{5,58,1587},{5,39,1586},{1,56,1156},{1,43,29},{1,43,29},{1,27,54},{0,31,2736},{0,25,907},{8,48,0},{8,48,0},{8,48,0},{8,35,1},{17,2,1152},{0,45,5},{0,45,5},{0,28,17},{27,3,1152},{0,28,17},{26,6,1568},{4,62,1},{10,42,1}, +{3,42,1},{26,6,1568},{29,21,1568},{3,42,1},{0,35,1568},{29,21,1568},{0,35,1568},{5,0,1586},{5,0,1586},{5,0,1586},{5,0,1586},{1,40,5},{1,40,5},{1,40,5},{1,25,4},{0,21,610},{0,21,610},{7,63,4136},{6,63,1589},{7,46,2141},{6,44,1613},{4,63,5895},{2,55,1973},{2,45,43},{2,35,2100},{0,46,8199},{0,34,3051},{10,63,1667},{9,57,131},{10,45,74},{9,43,195},{24,2,5419}, +{0,59,1772},{2,45,34},{0,36,1874},{27,17,5419},{0,36,1874},{6,61,1576},{6,61,1576},{6,61,1576},{6,41,1577},{2,59,1161},{2,46,26},{2,46,26},{2,30,49},{0,36,2505},{0,29,616},{9,51,1},{9,51,1},{9,51,1},{9,38,2},{19,1,1152},{0,49,2},{0,49,2},{0,30,4},{29,4,1152},{0,30,4},{28,5,1568},{6,63,13},{11,44,1},{4,44,1},{28,5,1568},{31,22,1568},{4,44,1}, +{0,37,1570},{31,22,1568},{0,37,1570},{6,0,1576},{6,0,1576},{6,0,1576},{6,0,1576},{2,43,9},{2,43,9},{2,43,9},{2,27,10},{0,25,468},{0,25,468},{8,63,4436},{7,63,1625},{7,49,2161},{7,46,1613},{6,63,6079},{3,57,1973},{3,47,43},{3,37,2100},{0,49,7908},{0,37,2671},{11,63,1745},{10,59,131},{11,47,74},{10,45,195},{25,4,5419},{0,61,1699},{3,47,34},{0,38,1787},{28,19,5419}, +{0,38,1787},{7,63,1576},{7,63,1576},{7,63,1576},{7,43,1577},{3,61,1161},{3,47,34},{3,47,34},{3,32,59},{0,38,2294},{0,31,422},{10,53,1},{10,53,1},{10,53,1},{10,40,2},{20,3,1152},{2,49,2},{2,49,2},{1,32,2},{30,6,1152},{1,32,2},{31,0,1568},{8,63,34},{12,46,1},{5,46,1},{31,0,1568},{28,29,1568},{5,46,1},{0,39,1570},{28,29,1568},{0,39,1570},{7,0,1576}, +{7,0,1576},{7,0,1576},{7,0,1576},{3,45,9},{3,45,9},{3,45,9},{3,29,10},{0,29,356},{0,29,356},{9,63,4730},{8,63,1716},{8,50,2134},{8,47,1627},{7,63,6244},{3,61,1977},{4,48,33},{3,40,2100},{0,53,7620},{0,40,2343},{12,63,1832},{11,61,131},{12,48,80},{11,47,195},{26,6,5419},{1,63,1699},{4,48,29},{0,41,1714},{29,21,5419},{0,41,1714},{8,63,1595},{8,63,1595},{8,63,1595}, +{8,45,1587},{4,62,1158},{4,49,29},{4,49,29},{4,33,54},{0,42,2098},{0,34,282},{11,55,1},{11,55,1},{11,55,1},{11,42,2},{21,5,1152},{3,51,2},{3,51,2},{2,34,2},{31,8,1152},{2,34,2},{30,9,1568},{9,63,68},{13,48,1},{6,48,1},{30,9,1568},{29,31,1568},{6,48,1},{0,41,1570},{29,31,1568},{0,41,1570},{8,0,1586},{8,0,1586},{8,0,1586},{8,0,1586},{4,47,4}, +{4,47,4},{4,47,4},{4,31,5},{0,32,269},{0,32,269},{11,63,5010},{9,63,1878},{9,52,2134},{9,49,1627},{8,63,6508},{4,62,1965},{5,50,33},{4,42,2079},{0,55,7360},{0,42,2067},{14,63,1952},{12,63,149},{13,50,80},{12,48,208},{29,1,5419},{3,63,1787},{5,50,29},{0,43,1651},{30,23,5419},{0,43,1651},{9,63,1622},{9,63,1622},{9,63,1622},{9,47,1587},{5,63,1164},{5,51,29},{5,51,29}, +{5,35,54},{0,46,1926},{0,36,186},{12,56,0},{12,56,0},{12,56,0},{12,44,1},{24,0,1152},{3,55,2},{3,55,2},{3,36,2},{31,11,1152},{3,36,2},{31,11,1568},{11,63,116},{14,50,1},{7,50,1},{31,11,1568},{29,34,1568},{7,50,1},{0,43,1570},{29,34,1568},{0,43,1570},{9,0,1586},{9,0,1586},{9,0,1586},{9,0,1586},{5,48,5},{5,48,5},{5,48,5},{5,33,4},{0,36,185}, +{0,36,185},{12,63,5316},{11,63,2154},{11,54,2141},{10,52,1613},{10,63,6800},{6,62,1995},{6,53,43},{5,44,2085},{0,59,7068},{0,44,1845},{15,63,2081},{13,63,206},{14,53,74},{13,51,195},{31,0,5419},{5,63,1937},{6,53,34},{0,45,1601},{28,29,5419},{0,45,1601},{10,63,1676},{10,63,1676},{10,63,1676},{10,49,1577},{7,63,1179},{6,54,26},{6,54,26},{6,38,49},{0,49,1764},{0,40,149},{13,59,1}, +{13,59,1},{13,59,1},{13,46,1},{24,6,1152},{4,57,1},{4,57,1},{4,38,4},{29,17,1152},{4,38,4},{30,20,1568},{13,63,205},{15,52,1},{8,52,1},{30,20,1568},{31,35,1568},{8,52,1},{0,45,1576},{31,35,1568},{0,45,1576},{10,0,1576},{10,0,1576},{10,0,1576},{10,0,1576},{6,51,9},{6,51,9},{6,51,9},{6,35,10},{0,40,113},{0,40,113},{13,63,5658},{12,63,2435},{12,56,2148}, +{11,54,1613},{11,63,7055},{7,63,2090},{7,55,43},{6,46,2085},{0,63,6820},{0,47,1701},{16,63,2216},{14,63,334},{15,55,74},{14,53,195},{30,9,5419},{7,63,2081},{7,55,34},{0,47,1580},{29,31,5419},{0,47,1580},{11,63,1745},{11,63,1745},{11,63,1745},{11,51,1577},{8,63,1220},{7,56,26},{7,56,26},{7,40,49},{0,53,1624},{0,42,145},{14,61,1},{14,61,1},{14,61,1},{14,48,2},{27,1,1152}, +{5,59,1},{5,59,1},{5,40,4},{30,19,1152},{5,40,4},{31,22,1568},{15,63,289},{16,54,1},{9,54,1},{31,22,1568},{28,42,1568},{9,54,1},{0,47,1576},{28,42,1568},{0,47,1576},{11,0,1576},{11,0,1576},{11,0,1576},{11,0,1576},{7,53,9},{7,53,9},{7,53,9},{7,37,10},{0,44,61},{0,44,61},{14,63,6036},{13,63,2751},{12,58,2119},{12,55,1627},{12,63,7316},{8,63,2228},{8,57,31}, +{7,48,2100},{0,63,6884},{0,49,1606},{17,63,2402},{16,63,500},{16,57,82},{15,55,195},{31,11,5419},{9,63,2195},{8,57,27},{0,49,1570},{29,34,5419},{0,49,1570},{12,63,1811},{12,63,1811},{12,63,1811},{12,53,1587},{9,63,1286},{8,57,22},{8,57,22},{8,41,56},{0,57,1508},{1,44,145},{15,63,1},{15,63,1},{15,63,1},{15,50,2},{28,3,1152},{6,61,1},{6,61,1},{6,42,4},{31,21,1152}, +{6,42,4},{31,27,1568},{17,63,410},{17,56,1},{10,56,1},{31,27,1568},{29,44,1568},{10,56,1},{0,49,1570},{29,44,1568},{0,49,1570},{12,0,1586},{12,0,1586},{12,0,1586},{12,0,1586},{8,55,4},{8,55,4},{8,55,4},{8,39,5},{0,48,34},{0,48,34},{15,63,6450},{14,63,3135},{13,60,2119},{13,57,1627},{13,63,7661},{10,63,2448},{9,59,31},{8,50,2079},{2,63,7196},{0,51,1580},{19,63,2594}, +{17,63,698},{16,59,73},{16,57,194},{31,16,5419},{11,63,2379},{9,59,27},{1,51,1570},{30,36,5419},{1,51,1570},{13,63,1910},{13,63,1910},{13,63,1910},{13,55,1587},{10,63,1388},{9,59,22},{9,59,22},{9,43,56},{0,61,1416},{2,46,145},{16,63,4},{16,63,4},{16,63,4},{16,52,1},{29,5,1152},{7,63,1},{7,63,1},{7,44,4},{31,24,1152},{7,44,4},{31,32,1568},{19,63,530},{18,58,1}, +{11,58,1},{31,32,1568},{30,46,1568},{11,58,1},{0,51,1570},{30,46,1568},{0,51,1570},{13,0,1586},{13,0,1586},{13,0,1586},{13,0,1586},{9,57,4},{9,57,4},{9,57,4},{9,41,5},{0,51,10},{0,51,10},{16,63,6900},{15,63,3657},{15,62,2128},{14,60,1616},{15,63,8023},{11,63,2845},{10,61,33},{9,52,2085},{5,63,7651},{1,54,1584},{20,63,2866},{18,63,1011},{18,61,69},{17,59,181},{31,22,5419}, +{13,63,2657},{10,61,24},{2,53,1577},{28,42,5419},{2,53,1577},{15,63,2057},{15,63,2057},{15,63,2057},{14,58,1577},{12,63,1476},{10,61,29},{10,61,29},{10,46,54},{0,63,1324},{4,47,137},{17,63,37},{17,63,37},{17,63,37},{17,54,1},{31,4,1152},{9,63,4},{9,63,4},{7,47,2},{30,29,1152},{7,47,2},{31,38,1568},{21,63,637},{19,60,5},{12,60,4},{31,38,1568},{31,48,1568},{12,60,4}, +{0,53,1576},{31,48,1568},{0,53,1576},{14,0,1576},{14,0,1576},{14,0,1576},{14,0,1576},{10,59,10},{10,59,10},{10,59,10},{10,44,10},{0,56,0},{0,56,0},{18,63,7332},{16,63,4196},{16,63,2175},{15,62,1616},{16,63,8348},{13,63,3285},{11,63,33},{10,54,2085},{8,63,8004},{2,56,1584},{21,63,3112},{20,63,1281},{19,63,69},{18,61,181},{31,27,5419},{15,63,2897},{11,63,24},{3,55,1577},{29,44,5419}, +{3,55,1577},{16,63,2171},{16,63,2171},{16,63,2171},{15,60,1577},{13,63,1590},{11,63,29},{11,63,29},{11,48,49},{2,63,1424},{4,50,145},{19,63,65},{19,63,65},{19,63,65},{18,56,1},{30,13,1152},{11,63,20},{11,63,20},{9,48,4},{31,31,1152},{9,48,4},{30,47,1568},{23,63,785},{20,62,4},{13,62,4},{30,47,1568},{31,51,1568},{13,62,4},{0,55,1576},{31,51,1568},{0,55,1576},{15,0,1576}, +{15,0,1576},{15,0,1576},{15,0,1576},{11,61,10},{11,61,10},{11,61,10},{11,46,10},{1,58,0},{1,58,0},{19,63,7014},{17,63,4230},{17,63,2294},{16,63,1595},{17,63,7865},{14,63,3114},{12,63,85},{12,55,1713},{8,63,7436},{3,57,1268},{22,63,2794},{21,63,1221},{20,63,113},{19,61,114},{31,31,4803},{17,63,2648},{13,63,61},{4,57,1253},{31,44,4803},{4,57,1253},{17,63,2294},{17,63,2294},{17,63,2294}, +{16,62,1587},{14,63,1740},{12,63,85},{12,63,85},{12,49,56},{3,63,1571},{5,52,145},{20,63,113},{20,63,113},{20,63,113},{19,58,1},{31,15,1152},{13,63,61},{13,63,61},{10,50,4},{31,34,1152},{10,50,4},{31,47,1250},{24,63,680},{21,63,4},{15,63,0},{31,47,1250},{31,53,1250},{15,63,0},{0,57,1252},{31,53,1250},{0,57,1252},{16,0,1586},{16,0,1586},{16,0,1586},{16,0,1586},{12,63,4}, +{12,63,4},{12,63,4},{12,47,8},{2,60,0},{2,60,0},{19,63,6534},{18,63,4116},{18,63,2435},{17,63,1590},{18,63,7164},{15,63,2809},{14,63,161},{12,57,1256},{10,63,6748},{5,58,909},{23,63,2340},{22,63,1065},{21,63,164},{20,62,41},{31,34,4056},{18,63,2211},{15,63,113},{6,58,884},{31,46,4056},{6,58,884},{18,63,2435},{18,63,2435},{18,63,2435},{17,63,1590},{16,63,1923},{14,63,161},{14,63,161}, +{13,51,56},{6,63,1729},{6,54,145},{21,63,164},{21,63,164},{21,63,164},{20,60,0},{31,20,1152},{15,63,113},{15,63,113},{11,52,4},{31,37,1152},{11,52,4},{31,49,882},{25,63,482},{23,63,0},{18,63,1},{31,49,882},{30,56,882},{18,63,1},{0,58,884},{30,56,882},{0,58,884},{17,0,1586},{17,0,1586},{17,0,1586},{17,0,1586},{13,63,13},{13,63,13},{13,63,13},{13,49,5},{3,62,0}, +{3,62,0},{21,63,6091},{20,63,4022},{19,63,2609},{18,63,1640},{19,63,6490},{16,63,2617},{15,63,318},{14,58,834},{11,63,6135},{6,59,598},{24,63,1881},{23,63,931},{22,63,245},{21,63,5},{31,38,3318},{20,63,1733},{17,63,202},{8,59,545},{31,48,3318},{8,59,545},{19,63,2609},{19,63,2609},{19,63,2609},{18,63,1640},{17,63,2086},{15,63,318},{15,63,318},{14,54,54},{8,63,1868},{8,55,137},{22,63,245}, +{22,63,245},{22,63,245},{21,62,2},{31,26,1152},{17,63,202},{17,63,202},{11,55,2},{30,42,1152},{11,55,2},{31,52,545},{26,63,305},{25,63,4},{20,63,1},{31,52,545},{30,58,545},{20,63,1},{0,59,545},{30,58,545},{0,59,545},{18,0,1576},{18,0,1576},{18,0,1576},{18,0,1576},{15,63,29},{15,63,29},{15,63,29},{14,52,10},{5,62,5},{5,62,5},{22,63,5719},{21,63,3980},{20,63,2834}, +{19,63,1745},{20,63,6050},{18,63,2457},{16,63,536},{15,59,515},{14,63,5674},{8,60,385},{25,63,1573},{24,63,861},{23,63,338},{22,63,10},{30,45,2753},{21,63,1438},{19,63,290},{10,60,313},{31,50,2753},{10,60,313},{20,63,2834},{20,63,2834},{20,63,2834},{19,63,1745},{18,63,2284},{16,63,536},{16,63,536},{15,56,54},{10,63,2064},{9,57,137},{23,63,338},{23,63,338},{23,63,338},{22,63,10},{31,31,1152}, +{19,63,290},{19,63,290},{12,57,2},{31,44,1152},{12,57,2},{31,55,313},{28,63,181},{26,63,1},{23,63,0},{31,55,313},{31,58,313},{23,63,0},{0,60,313},{31,58,313},{0,60,313},{19,0,1576},{19,0,1576},{19,0,1576},{19,0,1576},{16,63,52},{16,63,52},{16,63,52},{15,54,10},{7,62,25},{7,62,25},{22,63,5399},{22,63,3974},{21,63,3035},{20,63,1875},{21,63,5619},{19,63,2378},{18,63,776}, +{16,60,294},{15,63,5258},{9,61,225},{26,63,1333},{25,63,813},{24,63,425},{23,63,65},{29,52,2273},{23,63,1218},{20,63,353},{12,61,146},{28,56,2273},{12,61,146},{21,63,3035},{21,63,3035},{21,63,3035},{20,63,1875},{19,63,2518},{18,63,776},{18,63,776},{16,58,49},{11,63,2323},{10,59,137},{24,63,425},{24,63,425},{24,63,425},{23,63,65},{31,36,1152},{20,63,353},{20,63,353},{13,59,2},{31,47,1152}, +{13,59,2},{31,57,145},{28,63,85},{28,63,4},{26,63,1},{31,57,145},{31,60,145},{26,63,1},{0,61,145},{31,60,145},{0,61,145},{20,0,1586},{20,0,1586},{20,0,1586},{20,0,1586},{17,63,85},{17,63,85},{17,63,85},{16,56,5},{8,63,40},{8,63,40},{23,63,5143},{23,63,4004},{22,63,3254},{21,63,2070},{22,63,5274},{20,63,2310},{19,63,1062},{17,61,133},{17,63,5011},{10,63,161},{27,63,1161}, +{26,63,801},{26,63,545},{25,63,164},{30,52,1878},{24,63,1094},{22,63,461},{13,62,42},{28,58,1878},{13,62,42},{22,63,3254},{22,63,3254},{22,63,3254},{21,63,2070},{20,63,2833},{19,63,1062},{19,63,1062},{17,60,49},{14,63,2577},{11,61,137},{26,63,545},{26,63,545},{26,63,545},{25,63,164},{30,45,1152},{22,63,461},{22,63,461},{14,61,2},{31,50,1152},{14,61,2},{31,60,41},{30,63,25},{29,63,1}, +{28,63,0},{31,60,41},{31,61,41},{28,63,0},{0,62,41},{31,61,41},{0,62,41},{21,0,1586},{21,0,1586},{21,0,1586},{21,0,1586},{18,63,136},{18,63,136},{18,63,136},{17,58,5},{10,63,80},{10,63,80},{24,63,4882},{24,63,4070},{23,63,3532},{22,63,2360},{24,63,4945},{21,63,2422},{20,63,1433},{18,63,58},{20,63,4717},{12,63,157},{28,63,1026},{27,63,835},{27,63,666},{26,63,305},{30,56,1536}, +{26,63,996},{24,63,628},{16,63,1},{30,58,1536},{16,63,1},{23,63,3532},{23,63,3532},{23,63,3532},{22,63,2360},{22,63,3110},{20,63,1433},{20,63,1433},{18,62,50},{16,63,2939},{12,63,157},{27,63,666},{27,63,666},{27,63,666},{26,63,305},{29,54,1152},{24,63,628},{24,63,628},{16,63,1},{29,56,1152},{16,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0}, +{0,63,0},{31,63,0},{0,63,0},{22,0,1576},{22,0,1576},{22,0,1576},{22,0,1576},{19,63,221},{19,63,221},{19,63,221},{18,60,9},{12,63,157},{12,63,157},{25,63,4212},{24,63,3590},{24,63,3106},{23,63,2201},{24,63,4129},{22,63,2101},{21,63,1301},{19,63,13},{20,63,3869},{14,63,233},{28,63,706},{28,63,562},{28,63,481},{27,63,218},{30,58,1067},{27,63,699},{25,63,442},{18,63,1},{31,58,1067}, +{18,63,1},{24,63,3106},{24,63,3106},{24,63,3106},{23,63,2201},{23,63,2668},{21,63,1301},{21,63,1301},{19,63,13},{18,63,2523},{14,63,233},{28,63,481},{28,63,481},{28,63,481},{27,63,218},{31,50,800},{25,63,442},{25,63,442},{18,63,1},{31,55,800},{18,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{23,0,1576}, +{23,0,1576},{23,0,1576},{23,0,1576},{20,63,325},{20,63,325},{20,63,325},{19,62,9},{14,63,233},{14,63,233},{26,63,3642},{25,63,3132},{25,63,2771},{24,63,2070},{25,63,3444},{23,63,1834},{22,63,1205},{20,63,8},{21,63,3219},{16,63,346},{29,63,456},{28,63,370},{28,63,289},{28,63,145},{31,56,683},{28,63,451},{27,63,290},{21,63,1},{30,60,683},{21,63,1},{25,63,2771},{25,63,2771},{25,63,2771}, +{24,63,2070},{24,63,2273},{22,63,1205},{22,63,1205},{20,63,8},{20,63,2121},{16,63,346},{28,63,289},{28,63,289},{28,63,289},{28,63,145},{30,56,512},{27,63,290},{27,63,290},{21,63,1},{30,58,512},{21,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{24,0,1586},{24,0,1586},{24,0,1586},{24,0,1586},{22,63,421}, +{22,63,421},{22,63,421},{20,63,8},{16,63,346},{16,63,346},{26,63,3162},{26,63,2742},{26,63,2486},{25,63,1947},{26,63,2877},{24,63,1641},{23,63,1145},{22,63,52},{22,63,2673},{18,63,458},{29,63,264},{29,63,200},{29,63,164},{28,63,81},{31,58,384},{28,63,243},{28,63,162},{23,63,1},{31,60,384},{23,63,1},{26,63,2486},{26,63,2486},{26,63,2486},{25,63,1947},{24,63,1969},{23,63,1145},{23,63,1145}, +{22,63,52},{20,63,1785},{18,63,458},{29,63,164},{29,63,164},{29,63,164},{28,63,81},{31,55,288},{28,63,162},{28,63,162},{23,63,1},{28,62,288},{23,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{25,0,1586},{25,0,1586},{25,0,1586},{25,0,1586},{23,63,520},{23,63,520},{23,63,520},{22,63,52},{18,63,458}, +{18,63,458},{0,46,2665},{0,36,666},{0,26,37},{0,22,773},{0,31,5885},{0,23,4085},{0,21,1802},{0,15,4214},{0,17,6543},{0,13,4662},{0,46,2665},{0,36,666},{0,26,37},{0,22,773},{9,0,5885},{0,23,4085},{0,21,1802},{0,15,4214},{15,0,5885},{0,15,4214},{0,22,0},{0,22,0},{0,22,0},{0,13,1},{0,11,545},{0,10,289},{0,10,289},{0,6,306},{0,6,630},{0,5,362},{0,22,0}, +{0,22,0},{0,22,0},{0,13,1},{3,1,545},{0,10,289},{0,10,289},{0,6,306},{5,1,545},{0,6,306},{13,2,2665},{0,36,666},{0,26,37},{0,22,773},{13,2,2665},{23,0,2665},{0,22,773},{0,17,2665},{23,0,2665},{0,17,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,51,2665},{0,40,530},{0,28,2}, +{0,24,650},{0,34,6670},{0,27,4445},{0,23,1886},{0,16,4577},{0,19,7493},{0,15,5130},{0,51,2665},{0,40,530},{0,28,2},{0,24,650},{10,1,6669},{0,27,4445},{0,23,1886},{0,16,4577},{17,0,6669},{0,16,4577},{0,27,1},{0,27,1},{0,27,1},{0,16,1},{0,14,841},{0,13,442},{0,13,442},{0,7,458},{0,7,965},{0,7,558},{0,27,1},{0,27,1},{0,27,1},{0,16,1},{4,0,841}, +{0,13,442},{0,13,442},{0,7,458},{7,0,841},{0,7,458},{15,1,2665},{0,40,530},{0,28,2},{0,24,650},{15,1,2665},{25,0,2665},{0,24,650},{0,19,2665},{25,0,2665},{0,19,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,56,2665},{0,44,410},{0,30,17},{0,28,522},{0,38,7538},{0,29,4826},{0,25,2006}, +{0,18,5002},{0,21,8547},{0,16,5681},{0,56,2665},{0,44,410},{0,30,17},{0,28,522},{11,1,7538},{0,29,4826},{0,25,2006},{0,18,5002},{17,2,7538},{0,18,5002},{0,32,1},{0,32,1},{0,32,1},{0,19,1},{0,16,1201},{0,15,628},{0,15,628},{0,9,653},{0,9,1382},{0,9,822},{0,32,1},{0,32,1},{0,32,1},{0,19,1},{5,0,1201},{0,15,628},{0,15,628},{0,9,653},{8,0,1201}, +{0,9,653},{16,2,2665},{0,44,410},{1,30,2},{0,28,522},{16,2,2665},{28,0,2665},{0,28,522},{0,21,2665},{28,0,2665},{0,21,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,62,2665},{0,49,325},{0,33,65},{0,30,405},{0,41,8493},{0,31,5261},{0,27,2162},{0,20,5477},{0,23,9705},{0,18,6259},{0,62,2665}, +{0,49,325},{0,33,65},{0,30,405},{11,4,8493},{0,31,5261},{0,27,2162},{0,20,5477},{17,4,8493},{0,20,5477},{0,38,0},{0,38,0},{0,38,0},{0,23,1},{0,19,1625},{0,17,821},{0,17,821},{0,11,898},{0,10,1874},{0,9,1094},{0,38,0},{0,38,0},{0,38,0},{0,23,1},{5,2,1625},{0,17,821},{0,17,821},{0,11,898},{8,2,1625},{0,11,898},{18,1,2665},{0,49,325},{2,32,1}, +{0,30,405},{18,1,2665},{29,2,2665},{0,30,405},{0,23,2665},{29,2,2665},{0,23,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,63,2777},{0,51,221},{0,35,178},{0,32,306},{0,45,9669},{0,34,5810},{0,29,2382},{0,22,6054},{0,25,11123},{0,20,6989},{1,63,2741},{0,51,221},{1,35,137},{0,32,306},{13,1,9669}, +{0,34,5810},{0,29,2382},{0,22,6054},{19,4,9669},{0,22,6054},{0,44,0},{0,44,0},{0,44,0},{0,26,1},{0,22,2178},{0,19,1108},{0,19,1108},{0,11,1213},{0,11,2506},{0,11,1469},{0,44,0},{0,44,0},{0,44,0},{0,26,1},{6,2,2178},{0,19,1108},{0,19,1108},{0,11,1213},{11,0,2178},{0,11,1213},{20,0,2665},{0,51,221},{3,34,1},{0,32,306},{20,0,2665},{31,3,2665},{0,32,306}, +{0,25,2669},{31,3,2665},{0,25,2669},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,63,2949},{0,55,209},{1,37,242},{0,35,285},{0,50,9669},{0,38,5486},{0,32,1938},{0,24,5733},{0,27,11477},{0,22,6887},{2,63,2789},{0,55,209},{2,37,137},{0,35,285},{15,0,9669},{0,38,5486},{0,32,1938},{0,24,5733},{24,1,9669}, +{0,24,5733},{1,46,64},{1,46,64},{1,46,64},{1,28,65},{0,27,2180},{0,23,932},{0,23,932},{0,15,1037},{0,14,2691},{0,13,1421},{1,46,0},{1,46,0},{1,46,0},{1,28,1},{8,0,2178},{0,23,932},{0,23,932},{0,15,1037},{11,3,2178},{0,15,1037},{21,2,2665},{0,55,145},{4,36,2},{0,35,221},{21,2,2665},{31,6,2665},{0,35,221},{0,27,2669},{31,6,2665},{0,27,2669},{0,0,64}, +{0,0,64},{0,0,64},{0,0,64},{0,5,1},{0,5,1},{0,5,1},{0,3,1},{0,3,17},{0,3,17},{2,63,3285},{1,57,273},{2,39,434},{1,37,349},{0,56,9670},{0,42,5186},{0,34,1530},{0,26,5430},{0,29,11903},{0,24,6821},{3,63,2873},{1,57,209},{3,39,137},{1,37,285},{16,1,9669},{0,42,5186},{0,34,1530},{0,26,5430},{25,3,9669},{0,26,5430},{1,51,128},{1,51,128},{1,51,128}, +{1,31,129},{0,32,2180},{0,27,772},{0,27,772},{0,16,865},{0,17,2875},{0,15,1409},{2,47,1},{2,47,1},{2,47,1},{2,30,1},{9,2,2178},{0,27,772},{0,27,772},{0,16,865},{16,0,2178},{0,16,865},{23,0,2665},{0,59,85},{5,38,2},{0,37,146},{23,0,2665},{31,9,2665},{0,37,146},{0,29,2669},{31,9,2665},{0,29,2669},{1,0,128},{1,0,128},{1,0,128},{1,0,128},{0,11,0}, +{0,11,0},{0,11,0},{0,6,1},{0,5,65},{0,5,65},{3,63,3785},{1,61,405},{2,41,653},{1,39,466},{0,61,9669},{0,44,4909},{0,36,1190},{0,28,5145},{0,32,12358},{0,26,6791},{4,63,2966},{2,59,209},{4,41,154},{2,39,285},{18,0,9669},{0,44,4909},{0,36,1190},{0,28,5145},{30,0,9669},{0,28,5145},{2,53,320},{2,53,320},{2,53,320},{2,33,321},{0,38,2178},{0,31,628},{0,31,628}, +{0,18,730},{0,19,3124},{0,17,1427},{3,49,1},{3,49,1},{3,49,1},{3,32,0},{11,1,2178},{0,31,628},{0,31,628},{0,18,730},{17,2,2178},{0,18,730},{24,2,2665},{0,63,41},{6,40,2},{0,39,89},{24,2,2665},{30,14,2665},{0,39,89},{0,31,2669},{30,14,2665},{0,31,2669},{1,0,320},{1,0,320},{1,0,320},{1,0,320},{0,16,0},{0,16,0},{0,16,0},{0,10,1},{0,7,149}, +{0,7,149},{4,63,4514},{2,63,630},{3,45,1013},{2,41,681},{1,63,9738},{0,49,4610},{0,40,833},{0,30,4849},{0,36,12905},{0,29,6798},{6,63,3101},{4,60,208},{5,43,149},{3,41,286},{18,6,9669},{0,49,4610},{0,40,833},{0,30,4849},{28,6,9669},{0,30,4849},{2,59,545},{2,59,545},{2,59,545},{2,37,545},{0,44,2178},{0,34,493},{0,34,493},{0,22,584},{0,23,3462},{0,19,1493},{4,52,0}, +{4,52,0},{4,52,0},{4,34,1},{13,0,2178},{0,34,493},{0,34,493},{0,22,584},{20,2,2178},{0,22,584},{26,1,2665},{2,63,85},{7,42,4},{0,41,52},{26,1,2665},{31,16,2665},{0,41,52},{0,33,2669},{31,16,2665},{0,33,2669},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,22,0},{0,22,0},{0,22,0},{0,13,1},{0,10,289},{0,10,289},{4,63,5330},{3,63,1018},{3,47,1406}, +{2,43,966},{2,63,9981},{0,53,4366},{0,42,585},{0,33,4609},{0,38,13451},{0,31,6834},{7,63,3233},{5,62,208},{6,45,149},{4,42,285},{21,1,9669},{0,53,4366},{0,42,585},{0,33,4609},{29,8,9669},{0,33,4609},{3,61,865},{3,61,865},{3,61,865},{3,39,865},{0,49,2178},{0,38,377},{0,38,377},{0,24,461},{0,25,3789},{0,21,1589},{5,54,0},{5,54,0},{5,54,0},{5,36,1},{14,2,2178}, +{0,38,377},{0,38,377},{0,24,461},{24,0,2178},{0,24,461},{28,0,2665},{3,63,153},{8,44,5},{0,44,20},{28,0,2665},{31,19,2665},{0,44,20},{0,35,2669},{31,19,2665},{0,35,2669},{3,0,865},{3,0,865},{3,0,865},{3,0,865},{0,27,1},{0,27,1},{0,27,1},{0,16,1},{0,13,442},{0,13,442},{5,63,6270},{3,63,1626},{4,49,1866},{3,45,1286},{2,63,10381},{0,55,4133},{0,45,401}, +{0,35,4366},{0,42,14023},{0,32,6917},{8,63,3434},{6,63,242},{7,47,149},{5,44,285},{22,3,9669},{0,55,4133},{0,45,401},{0,35,4366},{30,10,9669},{0,35,4366},{3,63,1226},{3,63,1226},{3,63,1226},{3,42,1201},{0,54,2178},{0,42,277},{0,42,277},{0,26,356},{0,27,4170},{0,23,1721},{6,56,0},{6,56,0},{6,56,0},{6,38,1},{16,0,2178},{0,42,277},{0,42,277},{0,26,356},{26,1,2178}, +{0,26,356},{29,2,2665},{5,63,232},{9,46,5},{0,46,5},{29,2,2665},{31,22,2665},{0,46,5},{0,37,2669},{31,22,2665},{0,37,2669},{3,0,1201},{3,0,1201},{3,0,1201},{3,0,1201},{0,32,1},{0,32,1},{0,32,1},{0,19,1},{0,15,628},{0,15,628},{6,63,7374},{4,63,2339},{4,51,2411},{3,48,1715},{3,63,10950},{0,59,3909},{0,47,257},{0,37,4141},{0,44,14641},{0,34,7031},{9,63,3638}, +{7,63,320},{8,49,154},{6,46,285},{24,1,9669},{0,59,3909},{0,47,257},{0,37,4141},{31,12,9669},{0,37,4141},{4,63,1714},{4,63,1714},{4,63,1714},{4,44,1665},{0,59,2180},{0,46,193},{0,46,193},{0,28,269},{0,31,4582},{0,25,1889},{7,58,0},{7,58,0},{7,58,0},{7,40,1},{17,2,2178},{0,46,193},{0,46,193},{0,28,269},{27,3,2178},{0,28,269},{31,0,2665},{8,63,313},{10,48,2}, +{1,48,2},{31,0,2665},{30,27,2665},{1,48,2},{0,39,2669},{30,27,2665},{0,39,2669},{3,0,1665},{3,0,1665},{3,0,1665},{3,0,1665},{0,38,0},{0,38,0},{0,38,0},{0,23,1},{0,17,821},{0,17,821},{7,63,8807},{5,63,3388},{5,53,3082},{4,49,2230},{4,63,11766},{0,63,3686},{0,51,134},{0,39,3909},{0,46,15438},{0,37,7214},{11,63,3853},{8,63,457},{9,51,149},{7,49,286},{25,4,9669}, +{0,63,3686},{0,51,134},{0,39,3909},{28,19,9669},{0,39,3909},{5,63,2427},{5,63,2427},{5,63,2427},{4,47,2179},{0,63,2210},{0,49,128},{0,49,128},{0,31,193},{0,34,5117},{0,29,2123},{8,60,0},{8,60,0},{8,60,0},{8,42,1},{19,1,2178},{0,49,128},{0,49,128},{0,31,193},{29,4,2178},{0,31,193},{31,6,2665},{9,63,405},{11,50,4},{2,50,4},{31,6,2665},{31,29,2665},{2,50,4}, +{0,42,2669},{31,29,2665},{0,42,2669},{4,0,2178},{4,0,2178},{4,0,2178},{4,0,2178},{0,44,0},{0,44,0},{0,44,0},{0,26,1},{0,19,1108},{0,19,1108},{7,63,10230},{6,63,4421},{6,55,3705},{4,52,2725},{5,63,12634},{0,63,3719},{0,53,77},{0,41,3727},{0,51,15978},{0,39,7289},{12,63,4050},{10,63,629},{10,53,149},{8,50,285},{26,6,9669},{0,63,3718},{0,53,76},{0,41,3726},{29,21,9669}, +{0,41,3726},{5,63,3050},{5,63,3050},{5,63,3050},{5,49,2690},{1,63,2325},{0,53,73},{0,53,73},{0,33,118},{0,36,5499},{0,31,2266},{9,62,0},{9,62,0},{9,62,0},{9,44,1},{20,3,2178},{0,53,72},{0,53,72},{0,33,117},{30,6,2178},{0,33,117},{31,12,2665},{11,63,521},{12,52,5},{3,52,4},{31,12,2665},{31,32,2665},{3,52,4},{0,44,2669},{31,32,2665},{0,44,2669},{5,0,2689}, +{5,0,2689},{5,0,2689},{5,0,2689},{0,49,1},{0,49,1},{0,49,1},{0,29,2},{0,21,1341},{0,21,1341},{9,63,10738},{7,63,4899},{7,57,3705},{5,54,2725},{6,63,13045},{1,63,4002},{1,55,77},{0,43,3642},{0,53,15510},{0,42,6577},{13,63,4302},{11,63,857},{11,55,149},{9,52,285},{29,1,9669},{2,63,3954},{1,55,76},{0,43,3561},{30,23,9669},{0,43,3561},{6,63,3173},{6,63,3173},{6,63,3173}, +{6,51,2690},{2,63,2427},{1,55,73},{1,55,73},{1,35,118},{0,40,5171},{0,32,1846},{10,63,4},{10,63,4},{10,63,4},{10,46,1},{21,5,2178},{0,57,32},{0,57,32},{0,35,72},{31,8,2178},{0,35,72},{31,17,2665},{13,63,680},{13,54,5},{3,55,4},{31,17,2665},{31,35,2665},{3,55,4},{0,46,2669},{31,35,2665},{0,46,2669},{6,0,2689},{6,0,2689},{6,0,2689},{6,0,2689},{1,51,1}, +{1,51,1},{1,51,1},{1,31,2},{0,25,1145},{0,25,1145},{10,63,11278},{8,63,5402},{8,58,3742},{6,56,2725},{7,63,13510},{3,63,4314},{2,57,77},{1,45,3642},{0,57,15046},{0,44,5927},{14,63,4590},{12,63,1171},{12,57,149},{10,54,285},{30,3,9669},{3,63,4265},{2,57,76},{0,45,3414},{31,25,9669},{0,45,3414},{7,63,3314},{7,63,3314},{7,63,3314},{7,53,2690},{4,63,2532},{2,57,73},{2,57,73}, +{2,37,118},{0,44,4867},{0,36,1470},{11,63,25},{11,63,25},{11,63,25},{11,48,1},{24,0,2178},{0,61,8},{0,61,8},{0,38,40},{31,11,2178},{0,38,40},{31,22,2665},{15,63,832},{14,56,5},{4,57,4},{31,22,2665},{30,40,2665},{4,57,4},{0,47,2677},{30,40,2665},{0,47,2677},{7,0,2689},{7,0,2689},{7,0,2689},{7,0,2689},{2,53,1},{2,53,1},{2,53,1},{2,33,2},{0,29,965}, +{0,29,965},{11,63,11942},{10,63,6090},{9,62,3723},{8,58,2734},{9,63,14053},{4,63,4863},{3,59,79},{2,48,3633},{0,61,14558},{0,46,5283},{16,63,4858},{14,63,1556},{13,60,138},{11,57,299},{30,9,9669},{6,63,4594},{3,59,75},{0,48,3233},{29,31,9669},{0,48,3233},{9,63,3505},{9,63,3505},{9,63,3505},{8,55,2690},{5,63,2645},{3,61,72},{3,61,72},{3,39,117},{0,46,4539},{0,38,1091},{12,63,64}, +{12,63,64},{12,63,64},{12,50,1},{24,6,2178},{1,63,10},{1,63,10},{0,40,13},{29,17,2178},{0,40,13},{31,28,2665},{17,63,1053},{15,59,2},{5,59,2},{31,28,2665},{31,42,2665},{5,59,2},{0,50,2669},{31,42,2665},{0,50,2669},{8,0,2689},{8,0,2689},{8,0,2689},{8,0,2689},{3,55,5},{3,55,5},{3,55,5},{3,36,5},{0,34,794},{0,34,794},{12,63,12466},{11,63,6718},{10,62,3738}, +{8,60,2723},{10,63,14554},{6,63,5363},{4,61,87},{3,50,3633},{0,63,14190},{0,49,4774},{17,63,5158},{15,63,1938},{14,62,138},{12,59,282},{31,11,9669},{8,63,4806},{4,61,86},{0,50,3110},{29,34,9669},{0,50,3110},{10,63,3658},{10,63,3658},{10,63,3658},{9,57,2690},{6,63,2795},{4,62,66},{4,62,66},{4,41,131},{0,51,4269},{0,40,833},{14,63,100},{14,63,100},{14,63,100},{13,52,1},{27,1,2178}, +{3,63,34},{3,63,34},{0,43,2},{30,19,2178},{0,43,2},{31,33,2665},{19,63,1241},{16,61,5},{6,61,2},{31,33,2665},{31,45,2665},{6,61,2},{0,52,2669},{31,45,2665},{0,52,2669},{9,0,2689},{9,0,2689},{9,0,2689},{9,0,2689},{4,57,1},{4,57,1},{4,57,1},{4,37,2},{0,38,650},{0,38,650},{14,63,13094},{12,63,7445},{11,63,3830},{9,62,2723},{12,63,14998},{8,63,5926},{5,63,87}, +{4,51,3642},{0,63,14254},{0,51,4306},{18,63,5494},{16,63,2414},{15,63,146},{13,61,282},{31,16,9669},{10,63,5138},{5,63,86},{0,52,3005},{30,36,9669},{0,52,3005},{11,63,3829},{11,63,3829},{11,63,3829},{10,59,2690},{7,63,2981},{5,63,86},{5,63,86},{5,43,131},{0,53,4014},{0,44,601},{15,63,145},{15,63,145},{15,63,145},{14,54,1},{28,3,2178},{5,63,85},{5,63,85},{1,45,2},{31,21,2178}, +{1,45,2},{31,38,2665},{20,63,1378},{17,63,5},{7,63,2},{31,38,2665},{31,48,2665},{7,63,2},{0,54,2669},{31,48,2665},{0,54,2669},{10,0,2689},{10,0,2689},{10,0,2689},{10,0,2689},{5,59,1},{5,59,1},{5,59,1},{5,39,2},{0,40,520},{0,40,520},{15,63,12507},{13,63,7370},{12,63,4001},{11,63,2705},{13,63,14148},{8,63,5491},{6,63,154},{5,53,3033},{1,63,13399},{0,53,3297},{19,63,4949}, +{17,63,2261},{16,63,202},{15,61,185},{31,20,8712},{11,63,4644},{7,63,145},{0,54,2365},{31,37,8712},{0,54,2365},{12,63,4001},{12,63,4001},{12,63,4001},{11,61,2690},{9,63,3204},{6,63,154},{6,63,154},{6,45,131},{0,57,3762},{0,46,419},{16,63,202},{16,63,202},{16,63,202},{15,56,1},{29,5,2178},{7,63,145},{7,63,145},{2,47,2},{31,24,2178},{2,47,2},{30,45,2178},{22,63,1145},{18,63,1}, +{10,63,1},{30,45,2178},{31,50,2178},{10,63,1},{0,55,2180},{31,50,2178},{0,55,2180},{11,0,2689},{11,0,2689},{11,0,2689},{11,0,2689},{6,61,1},{6,61,1},{6,61,1},{6,41,2},{0,44,400},{0,44,400},{16,63,11658},{14,63,7195},{13,63,4225},{12,63,2693},{14,63,13066},{10,63,5014},{8,63,261},{6,54,2366},{3,63,12366},{0,55,2274},{20,63,4338},{18,63,2037},{17,63,289},{16,62,80},{31,24,7578}, +{13,63,4037},{9,63,202},{0,55,1698},{29,42,7578},{0,55,1698},{13,63,4225},{13,63,4225},{13,63,4225},{12,63,2693},{10,63,3429},{8,63,261},{8,63,261},{7,47,132},{0,61,3509},{0,49,290},{17,63,289},{17,63,289},{17,63,289},{16,59,0},{31,4,2178},{9,63,202},{9,63,202},{3,49,2},{30,29,2178},{3,49,2},{31,44,1625},{23,63,850},{20,63,0},{13,63,1},{31,44,1625},{31,52,1625},{13,63,1}, +{0,56,1625},{31,52,1625},{0,56,1625},{12,0,2689},{12,0,2689},{12,0,2689},{12,0,2689},{7,63,5},{7,63,5},{7,63,5},{7,44,4},{0,49,289},{0,49,289},{16,63,11002},{15,63,7081},{14,63,4450},{13,63,2738},{15,63,12205},{11,63,4663},{9,63,411},{7,55,1813},{4,63,11643},{0,56,1550},{21,63,3802},{20,63,1845},{18,63,388},{17,62,25},{31,27,6661},{15,63,3525},{11,63,290},{0,57,1217},{29,44,6661}, +{0,57,1217},{14,63,4450},{14,63,4450},{14,63,4450},{13,63,2738},{11,63,3675},{9,63,411},{9,63,411},{8,49,131},{0,63,3354},{0,51,222},{18,63,388},{18,63,388},{18,63,388},{17,61,0},{30,13,2178},{11,63,290},{11,63,290},{4,51,2},{31,31,2178},{4,51,2},{31,47,1201},{24,63,653},{22,63,4},{15,63,1},{31,47,1201},{31,53,1201},{15,63,1},{0,57,1201},{31,53,1201},{0,57,1201},{13,0,2689}, +{13,0,2689},{13,0,2689},{13,0,2689},{8,63,17},{8,63,17},{8,63,17},{8,46,2},{0,53,205},{0,53,205},{17,63,10434},{16,63,7010},{15,63,4693},{14,63,2833},{16,63,11374},{12,63,4462},{10,63,629},{8,56,1358},{6,63,10895},{0,57,1002},{22,63,3334},{20,63,1701},{19,63,505},{18,63,0},{31,31,5829},{16,63,3145},{12,63,405},{1,58,842},{31,44,5829},{1,58,842},{15,63,4693},{15,63,4693},{15,63,4693}, +{14,63,2833},{12,63,3906},{10,63,629},{10,63,629},{9,51,131},{1,63,3525},{0,54,218},{19,63,505},{19,63,505},{19,63,505},{18,63,0},{31,15,2178},{12,63,405},{12,63,405},{5,53,2},{31,34,2178},{5,53,2},{31,49,841},{25,63,461},{23,63,1},{18,63,0},{31,49,841},{31,55,841},{18,63,0},{0,58,841},{31,55,841},{0,58,841},{14,0,2689},{14,0,2689},{14,0,2689},{14,0,2689},{9,63,50}, +{9,63,50},{9,63,50},{9,48,2},{0,57,137},{0,57,137},{18,63,9934},{17,63,6962},{16,63,4913},{15,63,2978},{17,63,10683},{13,63,4277},{11,63,915},{9,58,974},{8,63,10078},{0,59,630},{23,63,2934},{22,63,1605},{21,63,650},{19,63,25},{31,34,5082},{18,63,2769},{14,63,521},{2,59,546},{31,46,5082},{2,59,546},{16,63,4913},{16,63,4913},{16,63,4913},{15,63,2978},{14,63,4170},{11,63,915},{11,63,915}, +{10,53,131},{3,63,3789},{1,56,218},{21,63,650},{21,63,650},{21,63,650},{19,63,25},{31,20,2178},{14,63,521},{14,63,521},{6,55,2},{31,37,2178},{6,55,2},{31,52,545},{26,63,305},{25,63,4},{20,63,1},{31,52,545},{30,58,545},{20,63,1},{0,59,545},{30,58,545},{0,59,545},{15,0,2689},{15,0,2689},{15,0,2689},{15,0,2689},{11,63,74},{11,63,74},{11,63,74},{10,49,2},{0,59,85}, +{0,59,85},{19,63,9465},{18,63,6955},{17,63,5233},{16,63,3218},{18,63,10003},{14,63,4183},{13,63,1258},{11,58,645},{9,63,9445},{1,61,409},{24,63,2529},{23,63,1525},{22,63,785},{20,63,100},{31,38,4344},{20,63,2345},{16,63,698},{4,60,289},{31,48,4344},{4,60,289},{17,63,5233},{17,63,5233},{17,63,5233},{16,63,3218},{15,63,4491},{13,63,1258},{13,63,1258},{11,56,120},{5,63,4171},{2,59,213},{22,63,785}, +{22,63,785},{22,63,785},{20,63,100},{31,26,2178},{16,63,698},{16,63,698},{7,57,0},{30,42,2178},{7,57,0},{31,55,288},{28,63,162},{26,63,4},{23,63,1},{31,55,288},{28,62,288},{23,63,1},{0,60,288},{28,62,288},{0,60,288},{16,0,2689},{16,0,2689},{16,0,2689},{16,0,2689},{12,63,113},{12,63,113},{12,63,113},{11,52,4},{0,63,45},{0,63,45},{20,63,9219},{19,63,6985},{18,63,5530}, +{17,63,3473},{19,63,9496},{15,63,4186},{14,63,1630},{11,60,404},{11,63,8961},{3,61,277},{25,63,2275},{24,63,1509},{23,63,932},{22,63,208},{30,45,3779},{21,63,2086},{18,63,850},{6,61,129},{31,50,3779},{6,61,129},{18,63,5530},{18,63,5530},{18,63,5530},{17,63,3473},{16,63,4770},{14,63,1630},{14,63,1630},{12,57,129},{8,63,4442},{3,61,213},{23,63,932},{23,63,932},{23,63,932},{22,63,208},{31,31,2178}, +{18,63,850},{18,63,850},{8,59,1},{31,44,2178},{8,59,1},{31,58,128},{29,63,72},{28,63,1},{26,63,0},{31,58,128},{31,60,128},{26,63,0},{0,61,128},{31,60,128},{0,61,128},{17,0,2689},{17,0,2689},{17,0,2689},{17,0,2689},{13,63,170},{13,63,170},{13,63,170},{12,54,2},{2,63,89},{2,63,89},{21,63,8929},{20,63,7062},{19,63,5845},{18,63,3778},{20,63,9188},{17,63,4260},{15,63,2070}, +{13,61,234},{13,63,8680},{4,62,212},{26,63,2089},{25,63,1515},{24,63,1073},{23,63,353},{29,52,3299},{22,63,1913},{20,63,965},{8,62,32},{28,56,3299},{8,62,32},{19,63,5845},{19,63,5845},{19,63,5845},{18,63,3778},{17,63,5124},{15,63,2070},{15,63,2070},{13,59,129},{9,63,4725},{4,62,196},{24,63,1073},{24,63,1073},{24,63,1073},{23,63,353},{31,36,2178},{20,63,965},{20,63,965},{9,61,1},{31,47,2178}, +{9,61,1},{31,60,34},{30,63,18},{29,63,4},{28,63,1},{31,60,34},{31,61,34},{28,63,1},{0,62,32},{31,61,34},{0,62,32},{18,0,2689},{18,0,2689},{18,0,2689},{18,0,2689},{14,63,245},{14,63,245},{14,63,245},{13,56,2},{4,63,164},{4,63,164},{22,63,8707},{21,63,7170},{21,63,6209},{19,63,4133},{21,63,8853},{18,63,4387},{17,63,2548},{14,62,154},{14,63,8388},{6,63,244},{27,63,1971}, +{26,63,1557},{25,63,1250},{24,63,565},{30,52,2904},{23,63,1826},{22,63,1145},{10,63,1},{28,58,2904},{10,63,1},{21,63,6209},{21,63,6209},{21,63,6209},{19,63,4133},{19,63,5460},{17,63,2548},{17,63,2548},{14,61,129},{11,63,5085},{6,63,244},{25,63,1250},{25,63,1250},{25,63,1250},{24,63,565},{30,45,2178},{22,63,1145},{22,63,1145},{10,63,1},{31,50,2178},{10,63,1},{31,63,0},{31,63,0},{31,63,0}, +{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{19,0,2689},{19,0,2689},{19,0,2689},{19,0,2689},{15,63,338},{15,63,338},{15,63,338},{14,58,2},{6,63,244},{6,63,244},{23,63,7705},{22,63,6418},{21,63,5633},{20,63,3845},{22,63,7654},{19,63,3874},{18,63,2310},{15,63,53},{15,63,7258},{8,63,317},{27,63,1458},{27,63,1186},{26,63,932},{25,63,425},{30,54,2166}, +{25,63,1398},{23,63,850},{13,63,1},{29,58,2166},{13,63,1},{21,63,5633},{21,63,5633},{21,63,5633},{20,63,3845},{19,63,4830},{18,63,2310},{18,63,2310},{15,62,45},{13,63,4506},{8,63,317},{26,63,932},{26,63,932},{26,63,932},{25,63,425},{31,44,1625},{23,63,850},{23,63,850},{13,63,1},{31,52,1625},{13,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0}, +{0,63,0},{31,63,0},{0,63,0},{20,0,2689},{20,0,2689},{20,0,2689},{20,0,2689},{16,63,449},{16,63,449},{16,63,449},{15,60,4},{8,63,317},{8,63,317},{24,63,6881},{23,63,5814},{22,63,5138},{21,63,3650},{23,63,6713},{20,63,3400},{19,63,2142},{16,63,5},{17,63,6397},{9,63,425},{28,63,1075},{27,63,866},{27,63,697},{26,63,320},{30,56,1601},{26,63,1041},{24,63,653},{15,63,1},{30,58,1601}, +{15,63,1},{22,63,5138},{22,63,5138},{22,63,5138},{21,63,3650},{21,63,4313},{19,63,2142},{19,63,2142},{16,63,5},{14,63,3981},{9,63,425},{27,63,697},{27,63,697},{27,63,697},{26,63,320},{31,47,1201},{24,63,653},{24,63,653},{15,63,1},{31,53,1201},{15,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{21,0,2689}, +{21,0,2689},{21,0,2689},{21,0,2689},{18,63,549},{18,63,549},{18,63,549},{16,62,1},{9,63,425},{9,63,425},{24,63,6097},{24,63,5285},{23,63,4693},{22,63,3473},{23,63,5833},{21,63,3067},{20,63,1988},{17,63,10},{18,63,5571},{11,63,541},{28,63,739},{28,63,595},{27,63,505},{27,63,233},{31,54,1121},{26,63,737},{25,63,461},{18,63,0},{29,60,1121},{18,63,0},{23,63,4693},{23,63,4693},{23,63,4693}, +{22,63,3473},{22,63,3845},{20,63,1988},{20,63,1988},{17,63,10},{15,63,3542},{11,63,541},{27,63,505},{27,63,505},{27,63,505},{27,63,233},{31,49,841},{25,63,461},{25,63,461},{18,63,0},{31,55,841},{18,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{22,0,2689},{22,0,2689},{22,0,2689},{22,0,2689},{19,63,666}, +{19,63,666},{19,63,666},{17,63,10},{11,63,541},{11,63,541},{25,63,5427},{24,63,4757},{24,63,4273},{23,63,3314},{24,63,5002},{22,63,2788},{21,63,1898},{18,63,65},{20,63,4714},{13,63,698},{29,63,489},{28,63,387},{28,63,306},{28,63,162},{31,56,726},{27,63,482},{26,63,305},{20,63,1},{30,60,726},{20,63,1},{24,63,4273},{24,63,4273},{24,63,4273},{23,63,3314},{22,63,3429},{21,63,1898},{21,63,1898}, +{18,63,65},{17,63,3213},{13,63,698},{28,63,306},{28,63,306},{28,63,306},{28,63,162},{31,52,545},{26,63,305},{26,63,305},{20,63,1},{30,58,545},{20,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{23,0,2689},{23,0,2689},{23,0,2689},{23,0,2689},{20,63,832},{20,63,832},{20,63,832},{18,63,65},{13,63,698}, +{13,63,698},{4,63,33740},{0,63,5184},{0,45,446},{0,43,4126},{3,63,45594},{0,59,24105},{0,42,8295},{0,37,24703},{0,44,64117},{0,34,38807},{2,63,9704},{0,61,2866},{0,44,386},{0,37,3205},{14,4,18065},{0,38,13219},{0,34,6147},{0,24,13496},{25,0,18065},{0,24,13496},{0,31,1},{0,31,1},{0,31,1},{0,19,1},{0,16,1105},{0,15,584},{0,15,584},{0,9,605},{0,8,1273},{0,7,750},{0,31,1}, +{0,31,1},{0,31,1},{0,19,1},{4,2,1105},{0,15,584},{0,15,584},{0,9,605},{8,0,1105},{0,9,605},{21,5,9248},{0,61,2866},{0,44,386},{0,37,3205},{21,5,9248},{31,8,9248},{0,37,3205},{0,28,9256},{31,8,9248},{0,28,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,63,38380},{1,63,6614},{0,47,261}, +{0,45,3769},{4,63,50747},{0,63,24961},{0,44,8337},{0,39,25658},{0,46,65535},{0,36,41267},{2,63,10152},{0,63,2624},{0,46,221},{0,41,2929},{16,0,19334},{0,42,13795},{0,36,6237},{0,26,14121},{26,1,19334},{0,26,14121},{0,36,1},{0,36,1},{0,36,1},{0,22,0},{0,18,1513},{0,17,769},{0,17,769},{0,9,845},{0,9,1742},{0,9,1014},{0,36,1},{0,36,1},{0,36,1},{0,22,0},{5,1,1513}, +{0,17,769},{0,17,769},{0,9,845},{9,0,1513},{0,9,845},{24,0,9248},{0,63,2624},{0,46,221},{0,41,2929},{24,0,9248},{31,11,9248},{0,41,2929},{0,30,9256},{31,11,9248},{0,30,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,63,43788},{1,63,8598},{0,49,121},{0,47,3430},{4,63,56155},{0,63,26241},{0,46,8415}, +{0,41,26663},{0,46,65535},{0,36,43795},{3,63,10706},{0,63,2624},{0,48,116},{0,43,2650},{17,0,20689},{0,44,14404},{0,38,6363},{0,28,14796},{26,3,20689},{0,28,14796},{0,42,0},{0,42,0},{0,42,0},{0,25,0},{0,21,1985},{0,19,1009},{0,19,1009},{0,11,1090},{0,11,2281},{0,11,1346},{0,42,0},{0,42,0},{0,42,0},{0,25,0},{6,1,1985},{0,19,1009},{0,19,1009},{0,11,1090},{9,2,1985}, +{0,11,1090},{25,2,9248},{0,63,2624},{0,48,116},{0,43,2650},{25,2,9248},{27,19,9248},{0,43,2650},{0,32,9250},{27,19,9248},{0,32,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{5,63,49566},{1,63,11350},{0,51,36},{0,50,3105},{4,63,62331},{0,63,28289},{0,48,8549},{0,43,27718},{0,49,65535},{0,38,46395},{4,63,11395}, +{0,63,2880},{0,51,36},{0,45,2389},{17,4,22129},{0,46,15067},{0,40,6525},{0,28,15500},{27,4,22129},{0,28,15500},{0,47,0},{0,47,0},{0,47,0},{0,28,1},{0,24,2521},{0,21,1285},{0,21,1285},{0,13,1385},{0,12,2905},{0,11,1714},{0,47,0},{0,47,0},{0,47,0},{0,28,1},{7,0,2521},{0,21,1285},{0,21,1285},{0,13,1385},{11,1,2521},{0,13,1385},{26,4,9248},{1,63,2866},{0,51,36}, +{0,45,2389},{26,4,9248},{28,21,9248},{0,45,2389},{0,34,9250},{28,21,9248},{0,34,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{5,63,56892},{2,63,15166},{0,53,5},{0,52,2726},{5,63,65535},{0,63,31511},{0,51,8735},{0,45,28953},{0,53,65535},{0,40,49505},{4,63,12385},{1,63,3380},{0,53,1},{0,47,2120},{19,1,23851}, +{0,49,15876},{0,42,6761},{0,30,16331},{29,4,23851},{0,30,16331},{0,53,0},{0,53,0},{0,53,0},{0,32,1},{0,27,3200},{0,23,1640},{0,23,1640},{0,15,1769},{0,13,3689},{0,13,2169},{0,53,0},{0,53,0},{0,53,0},{0,32,1},{7,3,3200},{0,23,1640},{0,23,1640},{0,15,1769},{13,0,3200},{0,15,1769},{28,3,9248},{3,63,3204},{0,53,1},{0,47,2120},{28,3,9248},{31,21,9248},{0,47,2120}, +{0,36,9256},{31,21,9248},{0,36,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,63,63870},{2,63,19230},{0,55,30},{0,54,2429},{5,63,65535},{1,63,35016},{0,53,8921},{0,47,30108},{0,55,65535},{0,42,52385},{5,63,13379},{2,63,4026},{0,56,18},{0,50,1885},{20,1,25472},{0,53,16616},{0,46,6989},{0,33,17105},{29,6,25472}, +{0,33,17105},{0,58,0},{0,58,0},{0,58,0},{0,35,0},{0,29,3874},{0,25,1994},{0,25,1994},{0,16,2129},{0,15,4454},{0,15,2637},{0,58,0},{0,58,0},{0,58,0},{0,35,0},{8,2,3872},{0,25,1994},{0,25,1994},{0,16,2129},{12,3,3872},{0,16,2129},{29,5,9248},{5,63,3589},{1,55,1},{0,50,1885},{29,5,9248},{31,24,9248},{0,50,1885},{0,38,9256},{31,24,9248},{0,38,9256},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,63,65535},{2,63,24002},{0,57,109},{0,56,2154},{6,63,65535},{1,63,38780},{0,55,8815},{0,48,30807},{0,57,65535},{0,44,54965},{6,63,14345},{2,63,4766},{1,58,54},{0,52,1670},{20,5,26744},{0,55,17059},{0,46,7005},{0,33,17609},{31,6,26744},{0,33,17609},{0,63,5},{0,63,5},{0,63,5}, +{0,38,4},{0,32,4420},{0,29,2210},{0,29,2210},{0,18,2378},{0,17,5115},{0,16,2981},{0,63,5},{0,63,5},{0,63,5},{0,38,4},{9,2,4418},{0,29,2210},{0,29,2210},{0,18,2378},{16,0,4418},{0,18,2378},{30,7,9248},{8,63,3904},{2,57,1},{0,52,1666},{30,7,9248},{28,31,9248},{0,52,1666},{0,40,9256},{28,31,9248},{0,40,9256},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,1}, +{0,1,1},{0,1,1},{0,1,0},{0,1,1},{0,1,1},{7,63,65535},{3,63,29032},{0,60,314},{0,58,1989},{6,63,65535},{2,63,42151},{0,57,7781},{0,50,30102},{0,59,65535},{0,46,56345},{7,63,14819},{3,63,5416},{2,60,54},{0,54,1565},{23,0,26744},{0,59,16547},{0,49,6177},{0,37,17105},{31,9,26744},{0,37,17105},{1,63,84},{1,63,84},{1,63,84},{1,40,68},{0,38,4418},{0,31,1972},{0,31,1972}, +{0,20,2129},{0,19,5364},{0,18,2915},{1,63,20},{1,63,20},{1,63,20},{1,40,4},{11,1,4418},{0,31,1972},{0,31,1972},{0,20,2129},{17,2,4418},{0,20,2129},{31,9,9248},{8,63,4160},{3,59,1},{0,54,1465},{31,9,9248},{28,34,9248},{0,54,1465},{0,42,9256},{28,34,9248},{0,42,9256},{1,0,68},{1,0,68},{1,0,68},{1,0,68},{0,7,0},{0,7,0},{0,7,0},{0,4,0},{0,3,25}, +{0,3,25},{7,63,65535},{3,63,35719},{1,62,657},{0,60,1985},{7,63,65535},{2,63,46660},{0,59,6696},{0,52,29368},{0,63,65535},{0,49,58301},{9,63,15473},{5,63,6173},{3,62,45},{1,56,1566},{23,6,26744},{0,63,15992},{0,53,5318},{0,39,16547},{30,14,26744},{0,39,16547},{2,63,329},{2,63,329},{2,63,329},{1,44,186},{0,44,4418},{0,36,1709},{0,36,1709},{0,22,1872},{0,23,5702},{0,20,2885},{3,63,34}, +{3,63,34},{3,63,34},{2,42,10},{13,0,4418},{0,36,1709},{0,36,1709},{0,22,1872},{20,2,4418},{0,22,1872},{31,15,9248},{10,63,4570},{4,61,4},{0,56,1268},{31,15,9248},{31,34,9248},{0,56,1268},{0,45,9250},{31,34,9248},{0,45,9250},{1,0,185},{1,0,185},{1,0,185},{1,0,185},{0,13,0},{0,13,0},{0,13,0},{0,8,1},{0,6,97},{0,6,97},{7,63,65535},{4,63,40786},{1,63,1122}, +{0,62,2034},{7,63,65535},{2,63,49800},{0,61,5634},{0,54,27965},{0,63,65535},{0,49,58553},{10,63,15531},{6,63,6593},{4,63,61},{2,58,1482},{25,4,26259},{0,63,15284},{0,55,4484},{0,41,15722},{28,19,26259},{0,41,15722},{2,63,633},{2,63,633},{2,63,633},{2,46,378},{0,49,4418},{0,40,1489},{0,40,1489},{0,24,1665},{0,25,6029},{0,22,2897},{4,63,61},{4,63,61},{4,63,61},{3,44,10},{14,2,4418}, +{0,40,1489},{0,40,1489},{0,24,1665},{24,0,4418},{0,24,1665},{31,19,8978},{11,63,4744},{5,63,0},{0,58,1025},{31,19,8978},{30,38,8978},{0,58,1025},{0,46,8986},{30,38,8978},{0,46,8986},{2,0,377},{2,0,377},{2,0,377},{2,0,377},{0,18,0},{0,18,0},{0,18,0},{0,11,0},{0,8,193},{0,8,193},{8,63,65535},{4,63,40898},{1,63,1890},{1,62,2029},{7,63,65535},{3,63,47871},{0,61,4194}, +{0,56,24760},{0,63,65535},{0,49,55881},{11,63,14325},{8,63,6051},{5,63,100},{3,58,1197},{27,1,24371},{0,63,13716},{0,57,3402},{0,41,13914},{30,19,24371},{0,41,13914},{3,63,1058},{3,63,1058},{3,63,1058},{2,49,618},{0,54,4418},{0,44,1285},{0,44,1285},{0,26,1476},{0,27,6410},{0,25,2937},{5,63,100},{5,63,100},{5,63,100},{4,46,5},{16,0,4418},{0,44,1285},{0,44,1285},{0,26,1476},{26,1,4418}, +{0,26,1476},{31,22,7938},{13,63,4225},{7,63,4},{0,60,628},{31,22,7938},{28,42,7938},{0,60,628},{0,47,7946},{28,42,7938},{0,47,7946},{2,0,617},{2,0,617},{2,0,617},{2,0,617},{0,23,1},{0,23,1},{0,23,1},{0,14,0},{0,11,320},{0,11,320},{8,63,65535},{4,63,41266},{1,63,2914},{1,62,2109},{7,63,65535},{3,63,46175},{0,61,3010},{0,56,21624},{0,63,65535},{0,51,53461},{12,63,13140}, +{8,63,5571},{6,63,157},{4,59,932},{28,1,22568},{0,63,12404},{0,57,2474},{0,43,12155},{30,21,22568},{0,43,12155},{4,63,1630},{4,63,1630},{4,63,1630},{3,51,938},{0,59,4420},{0,46,1117},{0,46,1117},{0,30,1280},{0,31,6822},{0,27,3009},{6,63,157},{6,63,157},{6,63,157},{5,48,4},{17,2,4418},{0,46,1117},{0,46,1117},{0,30,1280},{27,3,4418},{0,30,1280},{30,28,6962},{14,63,3709},{8,63,1}, +{0,60,340},{30,28,6962},{31,40,6962},{0,60,340},{0,48,6964},{31,40,6962},{0,48,6964},{3,0,937},{3,0,937},{3,0,937},{3,0,937},{0,29,0},{0,29,0},{0,29,0},{0,17,0},{0,13,482},{0,13,482},{9,63,65535},{5,63,41956},{2,63,4257},{1,62,2505},{7,63,65535},{3,63,44573},{0,62,1944},{0,56,18402},{0,63,65535},{0,51,50815},{13,63,11930},{10,63,5125},{7,63,250},{5,59,701},{28,5,20642}, +{1,63,11209},{0,59,1634},{0,45,10346},{31,22,20642},{0,45,10346},{4,63,2350},{4,63,2350},{4,63,2350},{3,54,1361},{0,63,4450},{0,51,914},{0,51,914},{0,32,1097},{0,34,7357},{0,29,3131},{7,63,250},{7,63,250},{7,63,250},{6,50,10},{19,1,4418},{0,51,914},{0,51,914},{0,32,1097},{29,4,4418},{0,32,1097},{31,27,5941},{15,63,3176},{10,63,0},{0,62,116},{31,27,5941},{31,42,5941},{0,62,116}, +{0,49,5945},{31,42,5941},{0,49,5945},{3,0,1360},{3,0,1360},{3,0,1360},{3,0,1360},{0,34,1},{0,34,1},{0,34,1},{0,21,1},{0,17,706},{0,17,706},{9,63,65535},{5,63,42660},{2,63,5617},{1,63,3088},{8,63,65535},{3,63,43421},{0,62,1240},{0,56,15810},{0,63,65535},{0,51,48735},{13,63,10922},{11,63,4753},{8,63,360},{6,61,509},{29,5,19021},{2,63,10246},{0,61,1088},{0,47,8885},{31,24,19021}, +{0,47,8885},{5,63,3131},{5,63,3131},{5,63,3131},{4,56,1818},{1,63,4580},{0,55,754},{0,55,754},{0,35,928},{0,36,7846},{0,31,3281},{8,63,360},{8,63,360},{8,63,360},{7,52,10},{20,3,4418},{0,55,754},{0,55,754},{0,35,928},{30,6,4418},{0,35,928},{31,30,5101},{17,63,2777},{11,63,9},{0,62,20},{31,30,5101},{31,43,5101},{0,62,20},{0,50,5105},{31,43,5101},{0,50,5105},{4,0,1818}, +{4,0,1818},{4,0,1818},{4,0,1818},{0,40,0},{0,40,0},{0,40,0},{0,24,0},{0,17,914},{0,17,914},{9,63,65535},{5,63,43620},{2,63,7233},{1,63,3920},{8,63,65535},{3,63,42525},{0,63,738},{0,58,13413},{0,63,65535},{0,51,46911},{14,63,9978},{11,63,4449},{10,63,452},{8,60,344},{31,2,17485},{3,63,9369},{0,61,704},{0,48,7498},{29,29,17485},{0,48,7498},{6,63,4058},{6,63,4058},{6,63,4058}, +{4,59,2315},{2,63,4874},{0,59,610},{0,59,610},{0,37,769},{0,38,8389},{0,32,3497},{10,63,452},{10,63,452},{10,63,452},{8,54,5},{21,5,4418},{0,59,610},{0,59,610},{0,37,769},{31,8,4418},{0,37,769},{31,32,4325},{18,63,2357},{13,63,0},{1,63,0},{31,32,4325},{31,45,4325},{1,63,0},{0,51,4329},{31,45,4325},{0,51,4329},{4,0,2314},{4,0,2314},{4,0,2314},{4,0,2314},{0,45,0}, +{0,45,0},{0,45,0},{0,27,0},{0,19,1184},{0,19,1184},{9,63,65535},{5,63,44836},{2,63,9105},{2,63,4905},{8,63,65535},{3,63,41885},{0,63,482},{0,58,11125},{0,63,65535},{0,51,45343},{15,63,9102},{13,63,4161},{11,63,557},{9,61,212},{30,9,16034},{5,63,8602},{0,63,482},{0,48,6250},{29,31,16034},{0,48,6250},{6,63,5066},{6,63,5066},{6,63,5066},{5,61,2907},{2,63,5322},{0,63,482},{0,63,482}, +{0,39,628},{0,42,8965},{0,36,3717},{11,63,557},{11,63,557},{11,63,557},{9,56,5},{24,0,4418},{0,63,482},{0,63,482},{0,39,628},{31,11,4418},{0,39,628},{31,35,3613},{20,63,1940},{15,63,4},{4,63,1},{31,35,3613},{28,50,3613},{4,63,1},{0,52,3617},{28,50,3613},{0,52,3617},{5,0,2906},{5,0,2906},{5,0,2906},{5,0,2906},{0,50,0},{0,50,0},{0,50,0},{0,30,1},{0,23,1480}, +{0,23,1480},{9,63,65535},{5,63,46510},{3,63,11362},{2,63,6237},{9,63,65535},{3,63,41471},{0,63,500},{0,58,8857},{0,63,65535},{0,53,43697},{16,63,8139},{14,63,3853},{12,63,680},{10,62,89},{30,13,14504},{8,63,7667},{0,63,500},{0,50,4961},{31,31,14504},{0,50,4961},{7,63,6337},{7,63,6337},{7,63,6337},{5,63,3642},{3,63,5962},{0,63,500},{0,63,500},{0,41,493},{0,44,9656},{0,38,3995},{12,63,680}, +{12,63,680},{12,63,680},{10,59,10},{24,6,4418},{0,63,500},{0,63,500},{0,41,493},{29,17,4418},{0,41,493},{31,38,2888},{20,63,1517},{16,63,1},{7,63,1},{31,38,2888},{31,48,2888},{7,63,1},{0,53,2896},{31,48,2888},{0,53,2896},{5,0,3617},{5,0,3617},{5,0,3617},{5,0,3617},{0,56,0},{0,56,0},{0,56,0},{0,34,1},{0,25,1853},{0,25,1853},{10,63,65535},{6,63,48082},{3,63,13570}, +{2,63,7693},{9,63,65535},{3,63,41375},{0,63,788},{0,58,7113},{0,63,65535},{0,53,42465},{17,63,7409},{15,63,3625},{13,63,821},{11,62,34},{31,13,13235},{8,63,6899},{2,63,628},{0,52,3956},{30,34,13235},{0,52,3956},{7,63,7681},{7,63,7681},{7,63,7681},{6,63,4437},{4,63,6659},{1,63,738},{1,63,738},{0,43,394},{0,46,10331},{0,40,4289},{13,63,821},{13,63,821},{13,63,821},{11,61,10},{27,1,4418}, +{2,63,628},{2,63,628},{0,43,394},{30,19,4418},{0,43,394},{31,41,2312},{21,63,1217},{18,63,1},{9,63,0},{31,41,2312},{29,52,2312},{9,63,0},{0,54,2320},{29,52,2312},{0,54,2320},{6,0,4337},{6,0,4337},{6,0,4337},{6,0,4337},{0,61,1},{0,61,1},{0,61,1},{0,37,0},{0,27,2225},{0,27,2225},{10,63,65535},{6,63,49890},{3,63,16034},{2,63,9405},{9,63,65535},{4,63,41526},{0,63,1332}, +{0,59,5520},{0,63,65535},{0,53,41489},{18,63,6747},{16,63,3459},{14,63,980},{12,63,5},{30,20,12051},{10,63,6275},{4,63,801},{0,53,3089},{31,35,12051},{0,53,3089},{8,63,9062},{8,63,9062},{8,63,9062},{7,63,5410},{4,63,7555},{1,63,1154},{1,63,1154},{0,46,306},{0,49,11046},{0,42,4619},{14,63,980},{14,63,980},{14,63,980},{12,62,5},{28,3,4418},{4,63,801},{4,63,801},{0,46,306},{31,21,4418}, +{0,46,306},{30,47,1800},{23,63,949},{19,63,4},{12,63,1},{30,47,1800},{31,51,1800},{12,63,1},{0,55,1808},{31,51,1800},{0,55,1808},{6,0,5105},{6,0,5105},{6,0,5105},{6,0,5105},{0,63,36},{0,63,36},{0,63,36},{0,40,0},{0,29,2633},{0,29,2633},{10,63,65535},{6,63,51954},{3,63,18754},{3,63,11330},{9,63,65535},{4,63,41798},{1,63,2082},{0,60,4084},{0,63,65535},{0,53,40769},{19,63,6153}, +{17,63,3297},{16,63,1154},{13,63,20},{31,20,10952},{11,63,5708},{6,63,965},{0,54,2281},{31,37,10952},{0,54,2281},{9,63,10545},{9,63,10545},{9,63,10545},{7,63,6482},{5,63,8549},{2,63,1716},{2,63,1716},{0,48,208},{0,53,11786},{0,44,4985},{16,63,1154},{16,63,1154},{16,63,1154},{13,63,20},{29,5,4418},{6,63,965},{6,63,965},{0,48,208},{31,24,4418},{0,48,208},{31,46,1352},{23,63,725},{21,63,0}, +{14,63,1},{31,46,1352},{30,54,1352},{14,63,1},{0,56,1360},{30,54,1352},{0,56,1360},{7,0,5953},{7,0,5953},{7,0,5953},{7,0,5953},{1,63,145},{1,63,145},{1,63,145},{0,43,1},{0,31,3077},{0,31,3077},{10,63,65535},{6,63,54582},{4,63,21886},{3,63,13652},{9,63,65535},{4,63,42410},{1,63,3144},{0,60,2770},{0,63,65535},{0,55,40127},{19,63,5649},{18,63,3157},{17,63,1325},{15,63,74},{31,24,9818}, +{13,63,5241},{8,63,1108},{0,56,1538},{29,42,9818},{0,56,1538},{10,63,12376},{10,63,12376},{10,63,12376},{8,63,7844},{6,63,9861},{3,63,2576},{3,63,2576},{0,50,145},{0,55,12659},{0,46,5441},{17,63,1325},{17,63,1325},{17,63,1325},{15,63,74},{31,4,4418},{8,63,1108},{8,63,1108},{0,50,145},{30,29,4418},{0,50,145},{31,49,925},{25,63,505},{23,63,1},{17,63,1},{31,49,925},{30,56,925},{17,63,1}, +{0,58,929},{30,56,925},{0,58,929},{7,0,6970},{7,0,6970},{7,0,6970},{7,0,6970},{1,63,388},{1,63,388},{1,63,388},{0,47,0},{0,34,3625},{0,34,3625},{10,63,65535},{7,63,57052},{4,63,24910},{3,63,15988},{9,63,65535},{4,63,43226},{1,63,4360},{0,61,1833},{0,63,65535},{0,55,39743},{21,63,5202},{19,63,3073},{18,63,1508},{16,63,180},{31,27,8901},{14,63,4814},{10,63,1300},{0,57,1021},{29,44,8901}, +{0,57,1021},{10,63,14136},{10,63,14136},{10,63,14136},{8,63,9252},{7,63,11195},{3,63,3536},{3,63,3536},{0,53,89},{0,59,13491},{0,49,5921},{18,63,1508},{18,63,1508},{18,63,1508},{16,63,180},{30,13,4418},{10,63,1300},{10,63,1300},{0,53,89},{31,31,4418},{0,53,89},{31,51,613},{26,63,337},{24,63,1},{20,63,1},{31,51,613},{31,56,613},{20,63,1},{0,59,617},{31,56,613},{0,59,617},{8,0,7956}, +{8,0,7956},{8,0,7956},{8,0,7956},{2,63,697},{2,63,697},{2,63,697},{0,50,0},{0,36,4141},{0,36,4141},{11,63,65535},{7,63,59708},{4,63,28190},{3,63,18580},{10,63,65535},{5,63,44295},{1,63,5832},{0,61,1081},{0,63,65535},{0,55,39615},{22,63,4818},{20,63,3017},{19,63,1709},{17,63,325},{31,31,8069},{15,63,4473},{11,63,1514},{0,58,593},{31,44,8069},{0,58,593},{11,63,15965},{11,63,15965},{11,63,15965}, +{9,63,10757},{7,63,12667},{4,63,4662},{4,63,4662},{0,55,50},{0,61,14340},{0,51,6395},{19,63,1709},{19,63,1709},{19,63,1709},{17,63,325},{31,15,4418},{11,63,1514},{11,63,1514},{0,55,50},{31,34,4418},{0,55,50},{31,54,365},{27,63,205},{26,63,1},{22,63,1},{31,54,365},{31,58,365},{22,63,1},{0,60,369},{31,58,365},{0,60,369},{8,0,8980},{8,0,8980},{8,0,8980},{8,0,8980},{2,63,1097}, +{2,63,1097},{2,63,1097},{0,53,0},{0,40,4689},{0,40,4689},{11,63,65535},{8,63,58981},{5,63,29551},{4,63,19751},{10,63,65535},{5,63,43215},{2,63,6910},{1,62,614},{0,63,65535},{0,57,34909},{23,63,4502},{21,63,3011},{20,63,1973},{18,63,520},{31,34,7322},{17,63,4242},{13,63,1769},{0,60,274},{31,46,7322},{0,60,274},{12,63,16739},{12,63,16739},{12,63,16739},{10,63,11492},{8,63,13636},{5,63,5510},{5,63,5510}, +{0,58,53},{0,63,14139},{0,53,5981},{20,63,1973},{20,63,1973},{20,63,1973},{18,63,520},{31,20,4418},{13,63,1769},{13,63,1769},{0,58,17},{31,37,4418},{0,58,17},{31,57,181},{28,63,97},{27,63,4},{25,63,0},{31,57,181},{31,59,181},{25,63,0},{0,61,185},{31,59,181},{0,61,185},{9,0,9248},{9,0,9248},{9,0,9248},{9,0,9248},{3,63,1348},{3,63,1348},{3,63,1348},{1,55,4},{0,42,4545}, +{0,42,4545},{12,63,65535},{9,63,57270},{6,63,30345},{5,63,20521},{11,63,65535},{6,63,41449},{3,63,8015},{2,62,242},{0,63,65535},{0,57,28330},{24,63,4181},{22,63,3053},{21,63,2248},{20,63,772},{31,38,6584},{20,63,3941},{15,63,2041},{0,61,77},{31,48,6584},{0,61,77},{13,63,17289},{13,63,17289},{13,63,17289},{11,63,12050},{10,63,14315},{7,63,6389},{7,63,6389},{2,60,41},{0,63,13860},{0,55,5252},{21,63,2248}, +{21,63,2248},{21,63,2248},{20,63,772},{31,26,4418},{15,63,2041},{15,63,2041},{0,60,4},{30,42,4418},{0,60,4},{31,60,50},{30,63,34},{29,63,0},{28,63,1},{31,60,50},{31,61,50},{28,63,1},{0,62,52},{31,61,50},{0,62,52},{10,0,9250},{10,0,9250},{10,0,9250},{10,0,9250},{4,63,1549},{4,63,1549},{4,63,1549},{2,57,2},{0,46,4141},{0,46,4141},{13,63,65535},{9,63,55894},{7,63,31068}, +{6,63,21256},{12,63,65535},{8,63,39740},{4,63,9073},{3,63,90},{0,63,65535},{0,59,23356},{24,63,3973},{23,63,3125},{23,63,2500},{21,63,1037},{30,45,6019},{20,63,3701},{17,63,2340},{0,63,4},{31,50,6019},{0,63,4},{14,63,17796},{14,63,17796},{14,63,17796},{12,63,12625},{11,63,14957},{8,63,7139},{8,63,7139},{3,62,41},{0,63,14020},{0,59,4652},{23,63,2500},{23,63,2500},{23,63,2500},{21,63,1037},{31,31,4418}, +{17,63,2340},{17,63,2340},{1,62,4},{31,44,4418},{1,62,4},{31,62,4},{31,63,4},{31,63,4},{30,63,1},{31,62,4},{31,63,4},{30,63,1},{0,63,4},{31,63,4},{0,63,4},{11,0,9250},{11,0,9250},{11,0,9250},{11,0,9250},{6,63,1765},{6,63,1765},{6,63,1765},{3,59,2},{0,51,3816},{0,51,3816},{13,63,65535},{10,63,53236},{8,63,30487},{7,63,21105},{13,63,65535},{8,63,37332},{5,63,9177}, +{4,63,36},{1,63,65535},{0,59,18680},{25,63,3443},{24,63,2741},{23,63,2248},{22,63,980},{31,44,5163},{21,63,3218},{20,63,2117},{3,63,1},{29,54,5163},{3,63,1},{15,63,17289},{15,63,17289},{15,63,17289},{13,63,12512},{12,63,14328},{9,63,7149},{9,63,7149},{4,63,20},{0,63,13376},{0,59,3944},{23,63,2248},{23,63,2248},{23,63,2248},{22,63,980},{31,34,3872},{20,63,2117},{20,63,2117},{3,63,1},{31,46,3872}, +{3,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{12,0,9248},{12,0,9248},{12,0,9248},{12,0,9248},{7,63,1972},{7,63,1972},{7,63,1972},{4,61,5},{0,55,3488},{0,55,3488},{14,63,65535},{11,63,50266},{9,63,29322},{8,63,20567},{13,63,65535},{9,63,35025},{6,63,8985},{5,63,21},{2,63,65535},{0,59,14712},{26,63,2873}, +{25,63,2283},{24,63,1825},{22,63,820},{29,52,4267},{22,63,2657},{20,63,1685},{5,63,1},{28,56,4267},{5,63,1},{16,63,16427},{16,63,16427},{16,63,16427},{14,63,12185},{13,63,13442},{10,63,6915},{10,63,6915},{5,63,5},{1,63,12539},{0,61,3314},{24,63,1825},{24,63,1825},{24,63,1825},{22,63,820},{31,37,3200},{20,63,1685},{20,63,1685},{5,63,1},{27,52,3200},{5,63,1},{31,63,0},{31,63,0},{31,63,0}, +{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{13,0,9248},{13,0,9248},{13,0,9248},{13,0,9248},{8,63,2250},{8,63,2250},{8,63,2250},{5,63,5},{0,57,3170},{0,57,3170},{15,63,65535},{12,63,47239},{10,63,28065},{9,63,20104},{14,63,65535},{10,63,32574},{7,63,8839},{6,63,54},{3,63,64890},{0,61,10964},{26,63,2252},{25,63,1806},{25,63,1445},{23,63,650},{29,54,3361}, +{23,63,2091},{21,63,1322},{8,63,0},{29,56,3361},{8,63,0},{17,63,15584},{17,63,15584},{17,63,15584},{15,63,11846},{14,63,12522},{11,63,6697},{11,63,6697},{6,63,50},{3,63,11669},{0,63,2834},{25,63,1445},{25,63,1445},{25,63,1445},{23,63,650},{31,40,2521},{21,63,1322},{21,63,1322},{8,63,0},{31,49,2521},{8,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0}, +{0,63,0},{31,63,0},{0,63,0},{14,0,9250},{14,0,9250},{14,0,9250},{14,0,9250},{9,63,2525},{9,63,2525},{9,63,2525},{6,63,50},{0,63,2834},{0,63,2834},{16,63,65535},{13,63,44559},{11,63,27000},{10,63,19705},{15,63,64179},{11,63,30525},{8,63,8677},{7,63,149},{3,63,60570},{0,61,8308},{27,63,1782},{26,63,1416},{25,63,1157},{24,63,520},{31,49,2646},{23,63,1691},{22,63,1040},{11,63,1},{30,56,2646}, +{11,63,1},{18,63,14889},{18,63,14889},{18,63,14889},{16,63,11585},{15,63,11778},{12,63,6555},{12,63,6555},{7,63,145},{3,63,11061},{0,63,2610},{25,63,1157},{25,63,1157},{25,63,1157},{24,63,520},{31,42,1985},{22,63,1040},{22,63,1040},{11,63,1},{30,52,1985},{11,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{15,0,9250}, +{15,0,9250},{15,0,9250},{15,0,9250},{10,63,2792},{10,63,2792},{10,63,2792},{7,63,145},{0,63,2610},{0,63,2610},{16,63,63318},{14,63,42019},{12,63,25930},{11,63,19324},{16,63,59178},{11,63,28845},{9,63,8605},{8,63,276},{6,63,56253},{0,61,6420},{27,63,1366},{27,63,1094},{26,63,872},{25,63,397},{31,51,2017},{25,63,1298},{23,63,794},{13,63,1},{31,56,2017},{13,63,1},{19,63,14244},{19,63,14244},{19,63,14244}, +{17,63,11312},{16,63,11037},{13,63,6429},{13,63,6429},{8,63,260},{6,63,10457},{0,63,2642},{26,63,872},{26,63,872},{26,63,872},{25,63,397},{31,45,1513},{23,63,794},{23,63,794},{13,63,1},{31,52,1513},{13,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{16,0,9248},{16,0,9248},{16,0,9248},{16,0,9248},{12,63,3074}, +{12,63,3074},{12,63,3074},{8,63,260},{0,63,2642},{0,63,2642},{17,63,58848},{15,63,39619},{13,63,24975},{12,63,19007},{16,63,54474},{13,63,27057},{10,63,8569},{9,63,461},{8,63,51302},{0,63,5046},{28,63,979},{27,63,806},{27,63,637},{26,63,292},{30,56,1473},{26,63,953},{24,63,605},{16,63,0},{30,58,1473},{16,63,0},{19,63,13604},{19,63,13604},{19,63,13604},{18,63,11057},{16,63,10429},{14,63,6339},{14,63,6339}, +{10,63,424},{8,63,9713},{1,63,2900},{27,63,637},{27,63,637},{27,63,637},{26,63,292},{31,48,1105},{24,63,605},{24,63,605},{16,63,0},{31,54,1105},{16,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{17,0,9248},{17,0,9248},{17,0,9248},{17,0,9248},{12,63,3330},{12,63,3330},{12,63,3330},{10,63,424},{1,63,2900}, +{1,63,2900}, +/**** ended inlining basisu_transcoder_tables_atc_56.inc ****/ + }; + + struct atc_match_entry + { + uint8_t m_lo; + uint8_t m_hi; + }; + static atc_match_entry g_pvrtc2_match45_equals_1[256], g_atc_match55_equals_1[256], g_atc_match56_equals_1[256]; // selector 1 + static atc_match_entry g_pvrtc2_match4[256], g_atc_match5[256], g_atc_match6[256]; + + static void prepare_atc_single_color_table(atc_match_entry* pTable, int size0, int size1, int sel) + { + for (int i = 0; i < 256; i++) + { + int lowest_e = 256; + for (int lo = 0; lo < size0; lo++) + { + int lo_e = lo; + if (size0 == 16) + { + lo_e = (lo_e << 1) | (lo_e >> 3); + lo_e = (lo_e << 3) | (lo_e >> 2); + } + else if (size0 == 32) + lo_e = (lo_e << 3) | (lo_e >> 2); + else + lo_e = (lo_e << 2) | (lo_e >> 4); + + for (int hi = 0; hi < size1; hi++) + { + int hi_e = hi; + if (size1 == 16) + { + // This is only for PVRTC2 - expand to 5 then 8 + hi_e = (hi_e << 1) | (hi_e >> 3); + hi_e = (hi_e << 3) | (hi_e >> 2); + } + else if (size1 == 32) + hi_e = (hi_e << 3) | (hi_e >> 2); + else + hi_e = (hi_e << 2) | (hi_e >> 4); + + int e; + + if (sel == 1) + { + // Selector 1 + e = abs(((lo_e * 5 + hi_e * 3) / 8) - i); + } + else + { + assert(sel == 3); + + // Selector 3 + e = abs(hi_e - i); + } + + if (e < lowest_e) + { + pTable[i].m_lo = static_cast(lo); + pTable[i].m_hi = static_cast(hi); + + lowest_e = e; + } + + } // hi + } // lo + } // i + } + + static void transcoder_init_atc() + { + prepare_atc_single_color_table(g_pvrtc2_match45_equals_1, 16, 32, 1); + prepare_atc_single_color_table(g_atc_match55_equals_1, 32, 32, 1); + prepare_atc_single_color_table(g_atc_match56_equals_1, 32, 64, 1); + + prepare_atc_single_color_table(g_pvrtc2_match4, 1, 16, 3); + prepare_atc_single_color_table(g_atc_match5, 1, 32, 3); + prepare_atc_single_color_table(g_atc_match6, 1, 64, 3); + + for (uint32_t i = 0; i < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; i++) + { + uint32_t l = g_etc1s_to_atc_selector_ranges[i].m_low; + uint32_t h = g_etc1s_to_atc_selector_ranges[i].m_high; + g_etc1s_to_atc_selector_range_index[l][h] = i; + } + } + + struct atc_block + { + uint8_t m_lo[2]; + uint8_t m_hi[2]; + uint8_t m_sels[4]; + + void set_low_color(uint32_t r, uint32_t g, uint32_t b) + { + assert((r < 32) && (g < 32) && (b < 32)); + uint32_t x = (r << 10) | (g << 5) | b; + m_lo[0] = x & 0xFF; + m_lo[1] = (x >> 8) & 0xFF; + } + + void set_high_color(uint32_t r, uint32_t g, uint32_t b) + { + assert((r < 32) && (g < 64) && (b < 32)); + uint32_t x = (r << 11) | (g << 5) | b; + m_hi[0] = x & 0xFF; + m_hi[1] = (x >> 8) & 0xFF; + } + }; + + static void convert_etc1s_to_atc(void* pDst, const endpoint* pEndpoints, const selector* pSelector) + { + atc_block* pBlock = static_cast(pDst); + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (low_selector == high_selector) + { + uint32_t r, g, b; + decoder_etc_block::get_block_color5(base_color, inten_table, low_selector, r, g, b); + + pBlock->set_low_color(g_atc_match55_equals_1[r].m_lo, g_atc_match56_equals_1[g].m_lo, g_atc_match55_equals_1[b].m_lo); + pBlock->set_high_color(g_atc_match55_equals_1[r].m_hi, g_atc_match56_equals_1[g].m_hi, g_atc_match55_equals_1[b].m_hi); + + pBlock->m_sels[0] = 0x55; + pBlock->m_sels[1] = 0x55; + pBlock->m_sels[2] = 0x55; + pBlock->m_sels[3] = 0x55; + + return; + } + else if ((inten_table >= 7) && (pSelector->m_num_unique_selectors == 2) && (pSelector->m_lo_selector == 0) && (pSelector->m_hi_selector == 3)) + { + color32 block_colors[4]; + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + const uint32_t r0 = block_colors[0].r; + const uint32_t g0 = block_colors[0].g; + const uint32_t b0 = block_colors[0].b; + + const uint32_t r1 = block_colors[3].r; + const uint32_t g1 = block_colors[3].g; + const uint32_t b1 = block_colors[3].b; + + pBlock->set_low_color(g_atc_match5[r0].m_hi, g_atc_match5[g0].m_hi, g_atc_match5[b0].m_hi); + pBlock->set_high_color(g_atc_match5[r1].m_hi, g_atc_match6[g1].m_hi, g_atc_match5[b1].m_hi); + + pBlock->m_sels[0] = pSelector->m_selectors[0]; + pBlock->m_sels[1] = pSelector->m_selectors[1]; + pBlock->m_sels[2] = pSelector->m_selectors[2]; + pBlock->m_sels[3] = pSelector->m_selectors[3]; + + return; + } + + const uint32_t selector_range_table = g_etc1s_to_atc_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1s_to_atc_solution* pTable_r = &g_etc1s_to_atc_55[(inten_table * 32 + base_color.r) * (NUM_ETC1S_TO_ATC_SELECTOR_RANGES * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS]; + const etc1s_to_atc_solution* pTable_g = &g_etc1s_to_atc_56[(inten_table * 32 + base_color.g) * (NUM_ETC1S_TO_ATC_SELECTOR_RANGES * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS]; + const etc1s_to_atc_solution* pTable_b = &g_etc1s_to_atc_55[(inten_table * 32 + base_color.b) * (NUM_ETC1S_TO_ATC_SELECTOR_RANGES * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS]; + + uint32_t best_err = UINT_MAX; + uint32_t best_mapping = 0; + + assert(NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS == 10); +#define DO_ITER(m) { uint32_t total_err = pTable_r[m].m_err + pTable_g[m].m_err + pTable_b[m].m_err; if (total_err < best_err) { best_err = total_err; best_mapping = m; } } + DO_ITER(0); DO_ITER(1); DO_ITER(2); DO_ITER(3); DO_ITER(4); + DO_ITER(5); DO_ITER(6); DO_ITER(7); DO_ITER(8); DO_ITER(9); +#undef DO_ITER + + pBlock->set_low_color(pTable_r[best_mapping].m_lo, pTable_g[best_mapping].m_lo, pTable_b[best_mapping].m_lo); + pBlock->set_high_color(pTable_r[best_mapping].m_hi, pTable_g[best_mapping].m_hi, pTable_b[best_mapping].m_hi); + + if (ATC_IDENTITY_SELECTOR_MAPPING_INDEX == best_mapping) + { + pBlock->m_sels[0] = pSelector->m_selectors[0]; + pBlock->m_sels[1] = pSelector->m_selectors[1]; + pBlock->m_sels[2] = pSelector->m_selectors[2]; + pBlock->m_sels[3] = pSelector->m_selectors[3]; + } + else + { + const uint8_t* pSelectors_xlat = &g_etc1s_to_atc_selector_mappings[best_mapping][0]; + + const uint32_t sel_bits0 = pSelector->m_selectors[0]; + const uint32_t sel_bits1 = pSelector->m_selectors[1]; + const uint32_t sel_bits2 = pSelector->m_selectors[2]; + const uint32_t sel_bits3 = pSelector->m_selectors[3]; + + uint32_t atc_sels0 = 0, atc_sels1 = 0, atc_sels2 = 0, atc_sels3 = 0; + +#define DO_X(x) { \ + const uint32_t x_shift = (x) * 2; \ + atc_sels0 |= (pSelectors_xlat[(sel_bits0 >> x_shift) & 3] << x_shift); \ + atc_sels1 |= (pSelectors_xlat[(sel_bits1 >> x_shift) & 3] << x_shift); \ + atc_sels2 |= (pSelectors_xlat[(sel_bits2 >> x_shift) & 3] << x_shift); \ + atc_sels3 |= (pSelectors_xlat[(sel_bits3 >> x_shift) & 3] << x_shift); } + + DO_X(0); + DO_X(1); + DO_X(2); + DO_X(3); +#undef DO_X + + pBlock->m_sels[0] = (uint8_t)atc_sels0; + pBlock->m_sels[1] = (uint8_t)atc_sels1; + pBlock->m_sels[2] = (uint8_t)atc_sels2; + pBlock->m_sels[3] = (uint8_t)atc_sels3; + } + } + +#if BASISD_WRITE_NEW_ATC_TABLES + static void create_etc1s_to_atc_conversion_tables() + { + // ATC 55 + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_atc_55.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1s_to_atc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1s_to_atc_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 31; hi++) + { + for (uint32_t lo = 0; lo <= 31; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 3) | (lo >> 2); + colors[3] = (hi << 3) | (hi >> 2); + + colors[1] = (colors[0] * 5 + colors[3] * 3) / 8; + colors[2] = (colors[3] * 5 + colors[0] * 3) / 8; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1s_to_atc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + //assert(best_err <= 0xFFFF); + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); + pFile = nullptr; + + // ATC 56 + fopen_s(&pFile, "basisu_transcoder_tables_atc_56.inc", "w"); + + n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1s_to_atc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1s_to_atc_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 63; hi++) + { + for (uint32_t lo = 0; lo <= 31; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 3) | (lo >> 2); + colors[3] = (hi << 2) | (hi >> 4); + + colors[1] = (colors[0] * 5 + colors[3] * 3) / 8; + colors[2] = (colors[3] * 5 + colors[0] * 3) / 8; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1s_to_atc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + //assert(best_err <= 0xFFFF); + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); + + // PVRTC2 45 + fopen_s(&pFile, "basisu_transcoder_tables_pvrtc2_45.inc", "w"); + + n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1s_to_atc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1s_to_atc_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 31; hi++) + { + for (uint32_t lo = 0; lo <= 15; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 1) | (lo >> 3); + colors[0] = (colors[0] << 3) | (colors[0] >> 2); + + colors[3] = (hi << 3) | (hi >> 2); + + colors[1] = (colors[0] * 5 + colors[3] * 3) / 8; + colors[2] = (colors[3] * 5 + colors[0] * 3) / 8; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1s_to_atc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + //assert(best_err <= 0xFFFF); + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); + +#if 0 + // PVRTC2 34 + fopen_s(&pFile, "basisu_transcoder_tables_pvrtc2_34.inc", "w"); + + n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1s_to_atc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1s_to_atc_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 15; hi++) + { + for (uint32_t lo = 0; lo <= 7; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 2) | (lo >> 1); + colors[0] = (colors[0] << 3) | (colors[0] >> 2); + + colors[3] = (hi << 1) | (hi >> 3); + colors[3] = (colors[3] << 3) | (colors[3] >> 2); + + colors[1] = (colors[0] * 5 + colors[3] * 3) / 8; + colors[2] = (colors[3] * 5 + colors[0] * 3) / 8; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1s_to_atc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + //assert(best_err <= 0xFFFF); + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); +#endif +#if 0 + // PVRTC2 44 + fopen_s(&pFile, "basisu_transcoder_tables_pvrtc2_44.inc", "w"); + + n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1s_to_atc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1s_to_atc_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 15; hi++) + { + for (uint32_t lo = 0; lo <= 15; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 1) | (lo >> 3); + colors[0] = (colors[0] << 3) | (colors[0] >> 2); + + colors[3] = (hi << 1) | (hi >> 3); + colors[3] = (colors[3] << 3) | (colors[3] >> 2); + + colors[1] = (colors[0] * 5 + colors[3] * 3) / 8; + colors[2] = (colors[3] * 5 + colors[0] * 3) / 8; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1s_to_atc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + //assert(best_err <= 0xFFFF); + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); +#endif + + // PVRTC2 alpha 33 + fopen_s(&pFile, "basisu_transcoder_tables_pvrtc2_alpha_33.inc", "w"); + + n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1s_to_atc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1s_to_atc_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 7; hi++) + { + for (uint32_t lo = 0; lo <= 7; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 1); + colors[0] = (colors[0] << 4) | colors[0]; + + colors[3] = (hi << 1) | 1; + colors[3] = (colors[3] << 4) | colors[3]; + + colors[1] = (colors[0] * 5 + colors[3] * 3) / 8; + colors[2] = (colors[3] * 5 + colors[0] * 3) / 8; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1s_to_atc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + //assert(best_err <= 0xFFFF); + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); + } +#endif // BASISD_WRITE_NEW_ATC_TABLES + +#endif // BASISD_SUPPORT_ATC + +#if BASISD_SUPPORT_PVRTC2 + struct pvrtc2_block + { + uint8_t m_modulation[4]; + + union + { + union + { + // Opaque mode: RGB colora=554 and colorb=555 + struct + { + uint32_t m_mod_flag : 1; + uint32_t m_blue_a : 4; + uint32_t m_green_a : 5; + uint32_t m_red_a : 5; + uint32_t m_hard_flag : 1; + uint32_t m_blue_b : 5; + uint32_t m_green_b : 5; + uint32_t m_red_b : 5; + uint32_t m_opaque_flag : 1; + + } m_opaque_color_data; + + // Transparent mode: RGBA colora=4433 and colorb=4443 + struct + { + uint32_t m_mod_flag : 1; + uint32_t m_blue_a : 3; + uint32_t m_green_a : 4; + uint32_t m_red_a : 4; + uint32_t m_alpha_a : 3; + uint32_t m_hard_flag : 1; + uint32_t m_blue_b : 4; + uint32_t m_green_b : 4; + uint32_t m_red_b : 4; + uint32_t m_alpha_b : 3; + uint32_t m_opaque_flag : 1; + + } m_trans_color_data; + }; + + uint32_t m_color_data_bits; + }; + + // 554 + void set_low_color(uint32_t r, uint32_t g, uint32_t b) + { + assert((r < 32) && (g < 32) && (b < 16)); + m_opaque_color_data.m_red_a = r; + m_opaque_color_data.m_green_a = g; + m_opaque_color_data.m_blue_a = b; + } + + // 555 + void set_high_color(uint32_t r, uint32_t g, uint32_t b) + { + assert((r < 32) && (g < 32) && (b < 32)); + m_opaque_color_data.m_red_b = r; + m_opaque_color_data.m_green_b = g; + m_opaque_color_data.m_blue_b = b; + } + + // 4433 + void set_trans_low_color(uint32_t r, uint32_t g, uint32_t b, uint32_t a) + { + assert((r < 16) && (g < 16) && (b < 8) && (a < 8)); + m_trans_color_data.m_red_a = r; + m_trans_color_data.m_green_a = g; + m_trans_color_data.m_blue_a = b; + m_trans_color_data.m_alpha_a = a; + } + + // 4443 + void set_trans_high_color(uint32_t r, uint32_t g, uint32_t b, uint32_t a) + { + assert((r < 16) && (g < 16) && (b < 16) && (a < 8)); + m_trans_color_data.m_red_b = r; + m_trans_color_data.m_green_b = g; + m_trans_color_data.m_blue_b = b; + m_trans_color_data.m_alpha_b = a; + } + }; + + static struct + { + uint8_t m_l, m_h; + } g_pvrtc2_trans_match34[256]; + + static struct + { + uint8_t m_l, m_h; + } g_pvrtc2_trans_match44[256]; + + static struct + { + uint8_t m_l, m_h; + } g_pvrtc2_alpha_match33[256]; + + static struct + { + uint8_t m_l, m_h; + } g_pvrtc2_alpha_match33_0[256]; + + static struct + { + uint8_t m_l, m_h; + } g_pvrtc2_alpha_match33_3[256]; + + // PVRTC2 can be forced to look like a slightly weaker variant of ATC/BC1, so that's what we do here for simplicity. + static void convert_etc1s_to_pvrtc2_rgb(void* pDst, const endpoint* pEndpoints, const selector* pSelector) + { + pvrtc2_block* pBlock = static_cast(pDst); + + pBlock->m_opaque_color_data.m_hard_flag = 1; + pBlock->m_opaque_color_data.m_mod_flag = 0; + pBlock->m_opaque_color_data.m_opaque_flag = 1; + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (low_selector == high_selector) + { + uint32_t r, g, b; + decoder_etc_block::get_block_color5(base_color, inten_table, low_selector, r, g, b); + + pBlock->set_low_color(g_atc_match55_equals_1[r].m_lo, g_atc_match55_equals_1[g].m_lo, g_pvrtc2_match45_equals_1[b].m_lo); + pBlock->set_high_color(g_atc_match55_equals_1[r].m_hi, g_atc_match55_equals_1[g].m_hi, g_pvrtc2_match45_equals_1[b].m_hi); + + pBlock->m_modulation[0] = 0x55; + pBlock->m_modulation[1] = 0x55; + pBlock->m_modulation[2] = 0x55; + pBlock->m_modulation[3] = 0x55; + + return; + } + else if ((inten_table >= 7) && (pSelector->m_num_unique_selectors == 2) && (pSelector->m_lo_selector == 0) && (pSelector->m_hi_selector == 3)) + { + color32 block_colors[4]; + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + const uint32_t r0 = block_colors[0].r; + const uint32_t g0 = block_colors[0].g; + const uint32_t b0 = block_colors[0].b; + + const uint32_t r1 = block_colors[3].r; + const uint32_t g1 = block_colors[3].g; + const uint32_t b1 = block_colors[3].b; + + pBlock->set_low_color(g_atc_match5[r0].m_hi, g_atc_match5[g0].m_hi, g_pvrtc2_match4[b0].m_hi); + pBlock->set_high_color(g_atc_match5[r1].m_hi, g_atc_match5[g1].m_hi, g_atc_match5[b1].m_hi); + + pBlock->m_modulation[0] = pSelector->m_selectors[0]; + pBlock->m_modulation[1] = pSelector->m_selectors[1]; + pBlock->m_modulation[2] = pSelector->m_selectors[2]; + pBlock->m_modulation[3] = pSelector->m_selectors[3]; + + return; + } + + const uint32_t selector_range_table = g_etc1s_to_atc_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1s_to_atc_solution* pTable_r = &g_etc1s_to_atc_55[(inten_table * 32 + base_color.r) * (NUM_ETC1S_TO_ATC_SELECTOR_RANGES * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS]; + const etc1s_to_atc_solution* pTable_g = &g_etc1s_to_atc_55[(inten_table * 32 + base_color.g) * (NUM_ETC1S_TO_ATC_SELECTOR_RANGES * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS]; + const etc1s_to_atc_solution* pTable_b = &g_etc1s_to_pvrtc2_45[(inten_table * 32 + base_color.b) * (NUM_ETC1S_TO_ATC_SELECTOR_RANGES * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS]; + + uint32_t best_err = UINT_MAX; + uint32_t best_mapping = 0; + + assert(NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS == 10); +#define DO_ITER(m) { uint32_t total_err = pTable_r[m].m_err + pTable_g[m].m_err + pTable_b[m].m_err; if (total_err < best_err) { best_err = total_err; best_mapping = m; } } + DO_ITER(0); DO_ITER(1); DO_ITER(2); DO_ITER(3); DO_ITER(4); + DO_ITER(5); DO_ITER(6); DO_ITER(7); DO_ITER(8); DO_ITER(9); +#undef DO_ITER + + pBlock->set_low_color(pTable_r[best_mapping].m_lo, pTable_g[best_mapping].m_lo, pTable_b[best_mapping].m_lo); + pBlock->set_high_color(pTable_r[best_mapping].m_hi, pTable_g[best_mapping].m_hi, pTable_b[best_mapping].m_hi); + + if (ATC_IDENTITY_SELECTOR_MAPPING_INDEX == best_mapping) + { + pBlock->m_modulation[0] = pSelector->m_selectors[0]; + pBlock->m_modulation[1] = pSelector->m_selectors[1]; + pBlock->m_modulation[2] = pSelector->m_selectors[2]; + pBlock->m_modulation[3] = pSelector->m_selectors[3]; + } + else + { + // TODO: We could make this faster using several precomputed 256 entry tables, like ETC1S->BC1 does. + const uint8_t* pSelectors_xlat = &g_etc1s_to_atc_selector_mappings[best_mapping][0]; + + const uint32_t sel_bits0 = pSelector->m_selectors[0]; + const uint32_t sel_bits1 = pSelector->m_selectors[1]; + const uint32_t sel_bits2 = pSelector->m_selectors[2]; + const uint32_t sel_bits3 = pSelector->m_selectors[3]; + + uint32_t sels0 = 0, sels1 = 0, sels2 = 0, sels3 = 0; + +#define DO_X(x) { \ + const uint32_t x_shift = (x) * 2; \ + sels0 |= (pSelectors_xlat[(sel_bits0 >> x_shift) & 3] << x_shift); \ + sels1 |= (pSelectors_xlat[(sel_bits1 >> x_shift) & 3] << x_shift); \ + sels2 |= (pSelectors_xlat[(sel_bits2 >> x_shift) & 3] << x_shift); \ + sels3 |= (pSelectors_xlat[(sel_bits3 >> x_shift) & 3] << x_shift); } + + DO_X(0); + DO_X(1); + DO_X(2); + DO_X(3); +#undef DO_X + + pBlock->m_modulation[0] = (uint8_t)sels0; + pBlock->m_modulation[1] = (uint8_t)sels1; + pBlock->m_modulation[2] = (uint8_t)sels2; + pBlock->m_modulation[3] = (uint8_t)sels3; + } + } + + typedef struct { float c[4]; } vec4F; + + static inline vec4F* vec4F_set_scalar(vec4F* pV, float x) { pV->c[0] = x; pV->c[1] = x; pV->c[2] = x; pV->c[3] = x; return pV; } + static inline vec4F* vec4F_set(vec4F* pV, float x, float y, float z, float w) { pV->c[0] = x; pV->c[1] = y; pV->c[2] = z; pV->c[3] = w; return pV; } + static inline vec4F* vec4F_saturate_in_place(vec4F* pV) { pV->c[0] = saturate(pV->c[0]); pV->c[1] = saturate(pV->c[1]); pV->c[2] = saturate(pV->c[2]); pV->c[3] = saturate(pV->c[3]); return pV; } + static inline vec4F vec4F_saturate(const vec4F* pV) { vec4F res; res.c[0] = saturate(pV->c[0]); res.c[1] = saturate(pV->c[1]); res.c[2] = saturate(pV->c[2]); res.c[3] = saturate(pV->c[3]); return res; } + static inline vec4F vec4F_from_color(const color32* pC) { vec4F res; vec4F_set(&res, pC->c[0], pC->c[1], pC->c[2], pC->c[3]); return res; } + static inline vec4F vec4F_add(const vec4F* pLHS, const vec4F* pRHS) { vec4F res; vec4F_set(&res, pLHS->c[0] + pRHS->c[0], pLHS->c[1] + pRHS->c[1], pLHS->c[2] + pRHS->c[2], pLHS->c[3] + pRHS->c[3]); return res; } + static inline vec4F vec4F_sub(const vec4F* pLHS, const vec4F* pRHS) { vec4F res; vec4F_set(&res, pLHS->c[0] - pRHS->c[0], pLHS->c[1] - pRHS->c[1], pLHS->c[2] - pRHS->c[2], pLHS->c[3] - pRHS->c[3]); return res; } + static inline float vec4F_dot(const vec4F* pLHS, const vec4F* pRHS) { return pLHS->c[0] * pRHS->c[0] + pLHS->c[1] * pRHS->c[1] + pLHS->c[2] * pRHS->c[2] + pLHS->c[3] * pRHS->c[3]; } + static inline vec4F vec4F_mul(const vec4F* pLHS, float s) { vec4F res; vec4F_set(&res, pLHS->c[0] * s, pLHS->c[1] * s, pLHS->c[2] * s, pLHS->c[3] * s); return res; } + static inline vec4F* vec4F_normalize_in_place(vec4F* pV) { float s = pV->c[0] * pV->c[0] + pV->c[1] * pV->c[1] + pV->c[2] * pV->c[2] + pV->c[3] * pV->c[3]; if (s != 0.0f) { s = 1.0f / sqrtf(s); pV->c[0] *= s; pV->c[1] *= s; pV->c[2] *= s; pV->c[3] *= s; } return pV; } + + static color32 convert_rgba_5554_to_8888(const color32& col) + { + return color32((col[0] << 3) | (col[0] >> 2), (col[1] << 3) | (col[1] >> 2), (col[2] << 3) | (col[2] >> 2), (col[3] << 4) | col[3]); + } + + static inline int sq(int x) { return x * x; } + + // PVRTC2 is a slightly borked format for alpha: In Non-Interpolated mode, the way AlphaB8 is exanded from 4 to 8 bits means it can never be 0. + // This is actually very bad, because on 100% transparent blocks which have non-trivial color pixels, part of the color channel will leak into alpha! + // And there's nothing straightforward we can do because using the other modes is too expensive/complex. I can see why Apple didn't adopt it. + static void convert_etc1s_to_pvrtc2_rgba(void* pDst, const endpoint* pEndpoints, const selector* pSelector, const endpoint* pEndpoint_codebook, const selector* pSelector_codebook) + { + pvrtc2_block* pBlock = static_cast(pDst); + + const endpoint& alpha_endpoint = pEndpoint_codebook[((uint16_t*)pBlock)[0]]; + const selector& alpha_selectors = pSelector_codebook[((uint16_t*)pBlock)[1]]; + + pBlock->m_opaque_color_data.m_hard_flag = 1; + pBlock->m_opaque_color_data.m_mod_flag = 0; + pBlock->m_opaque_color_data.m_opaque_flag = 0; + + const int num_unique_alpha_selectors = alpha_selectors.m_num_unique_selectors; + + const color32& alpha_base_color = alpha_endpoint.m_color5; + const uint32_t alpha_inten_table = alpha_endpoint.m_inten5; + + int constant_alpha_val = -1; + + int alpha_block_colors[4]; + decoder_etc_block::get_block_colors5_g(alpha_block_colors, alpha_base_color, alpha_inten_table); + + if (num_unique_alpha_selectors == 1) + { + constant_alpha_val = alpha_block_colors[alpha_selectors.m_lo_selector]; + } + else + { + constant_alpha_val = alpha_block_colors[alpha_selectors.m_lo_selector]; + + for (uint32_t i = alpha_selectors.m_lo_selector + 1; i <= alpha_selectors.m_hi_selector; i++) + { + if (constant_alpha_val != alpha_block_colors[i]) + { + constant_alpha_val = -1; + break; + } + } + } + + if (constant_alpha_val >= 250) + { + // It's opaque enough, so don't bother trying to encode it as an alpha block. + convert_etc1s_to_pvrtc2_rgb(pDst, pEndpoints, pSelector); + return; + } + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const int num_unique_color_selectors = pSelector->m_num_unique_selectors; + + // We need to reencode the block at the pixel level, unfortunately, from two ETC1S planes. + // Do 4D incremental PCA, project all pixels to this hyperline, then quantize to packed endpoints and compute the modulation values. + const int br = (base_color.r << 3) | (base_color.r >> 2); + const int bg = (base_color.g << 3) | (base_color.g >> 2); + const int bb = (base_color.b << 3) | (base_color.b >> 2); + + color32 block_cols[4]; + for (uint32_t i = 0; i < 4; i++) + { + const int ci = g_etc1_inten_tables[inten_table][i]; + block_cols[i].set_clamped(br + ci, bg + ci, bb + ci, alpha_block_colors[i]); + } + + bool solid_color_block = true; + if (num_unique_color_selectors > 1) + { + for (uint32_t i = low_selector + 1; i <= high_selector; i++) + { + if ((block_cols[low_selector].r != block_cols[i].r) || (block_cols[low_selector].g != block_cols[i].g) || (block_cols[low_selector].b != block_cols[i].b)) + { + solid_color_block = false; + break; + } + } + } + + if ((solid_color_block) && (constant_alpha_val >= 0)) + { + // Constant color/alpha block. + // This is more complex than it may seem because of the way color and alpha are packed in PVRTC2. We need to evaluate mod0, mod1 and mod3 encodings to find the best one. + uint32_t r, g, b; + decoder_etc_block::get_block_color5(base_color, inten_table, low_selector, r, g, b); + + // Mod 0 + uint32_t lr0 = (r * 15 + 128) / 255, lg0 = (g * 15 + 128) / 255, lb0 = (b * 7 + 128) / 255; + uint32_t la0 = g_pvrtc2_alpha_match33_0[constant_alpha_val].m_l; + + uint32_t cr0 = (lr0 << 1) | (lr0 >> 3); + uint32_t cg0 = (lg0 << 1) | (lg0 >> 3); + uint32_t cb0 = (lb0 << 2) | (lb0 >> 1); + uint32_t ca0 = (la0 << 1); + + cr0 = (cr0 << 3) | (cr0 >> 2); + cg0 = (cg0 << 3) | (cg0 >> 2); + cb0 = (cb0 << 3) | (cb0 >> 2); + ca0 = (ca0 << 4) | ca0; + + uint32_t err0 = sq(cr0 - r) + sq(cg0 - g) + sq(cb0 - b) + sq(ca0 - constant_alpha_val) * 2; + + // If the alpha is < 3 or so we're kinda screwed. It's better to have some RGB error than it is to turn a 100% transparent area slightly opaque. + if ((err0 == 0) || (constant_alpha_val < 3)) + { + pBlock->set_trans_low_color(lr0, lg0, lb0, la0); + pBlock->set_trans_high_color(0, 0, 0, 0); + + pBlock->m_modulation[0] = 0; + pBlock->m_modulation[1] = 0; + pBlock->m_modulation[2] = 0; + pBlock->m_modulation[3] = 0; + return; + } + + // Mod 3 + uint32_t lr3 = (r * 15 + 128) / 255, lg3 = (g * 15 + 128) / 255, lb3 = (b * 15 + 128) / 255; + uint32_t la3 = g_pvrtc2_alpha_match33_3[constant_alpha_val].m_l; + + uint32_t cr3 = (lr3 << 1) | (lr3 >> 3); + uint32_t cg3 = (lg3 << 1) | (lg3 >> 3); + uint32_t cb3 = (lb3 << 1) | (lb3 >> 3); + uint32_t ca3 = (la3 << 1) | 1; + + cr3 = (cr3 << 3) | (cr3 >> 2); + cg3 = (cg3 << 3) | (cg3 >> 2); + cb3 = (cb3 << 3) | (cb3 >> 2); + ca3 = (ca3 << 4) | ca3; + + uint32_t err3 = sq(cr3 - r) + sq(cg3 - g) + sq(cb3 - b) + sq(ca3 - constant_alpha_val) * 2; + + // Mod 1 + uint32_t lr1 = g_pvrtc2_trans_match44[r].m_l, lg1 = g_pvrtc2_trans_match44[g].m_l, lb1 = g_pvrtc2_trans_match34[b].m_l; + uint32_t hr1 = g_pvrtc2_trans_match44[r].m_h, hg1 = g_pvrtc2_trans_match44[g].m_h, hb1 = g_pvrtc2_trans_match34[b].m_h; + uint32_t la1 = g_pvrtc2_alpha_match33[constant_alpha_val].m_l, ha1 = g_pvrtc2_alpha_match33[constant_alpha_val].m_h; + + uint32_t clr1 = (lr1 << 1) | (lr1 >> 3); + uint32_t clg1 = (lg1 << 1) | (lg1 >> 3); + uint32_t clb1 = (lb1 << 2) | (lb1 >> 1); + uint32_t cla1 = (la1 << 1); + + clr1 = (clr1 << 3) | (clr1 >> 2); + clg1 = (clg1 << 3) | (clg1 >> 2); + clb1 = (clb1 << 3) | (clb1 >> 2); + cla1 = (cla1 << 4) | cla1; + + uint32_t chr1 = (hr1 << 1) | (hr1 >> 3); + uint32_t chg1 = (hg1 << 1) | (hg1 >> 3); + uint32_t chb1 = (hb1 << 1) | (hb1 >> 3); + uint32_t cha1 = (ha1 << 1) | 1; + + chr1 = (chr1 << 3) | (chr1 >> 2); + chg1 = (chg1 << 3) | (chg1 >> 2); + chb1 = (chb1 << 3) | (chb1 >> 2); + cha1 = (cha1 << 4) | cha1; + + uint32_t r1 = (clr1 * 5 + chr1 * 3) / 8; + uint32_t g1 = (clg1 * 5 + chg1 * 3) / 8; + uint32_t b1 = (clb1 * 5 + chb1 * 3) / 8; + uint32_t a1 = (cla1 * 5 + cha1 * 3) / 8; + + uint32_t err1 = sq(r1 - r) + sq(g1 - g) + sq(b1 - b) + sq(a1 - constant_alpha_val) * 2; + + if ((err1 < err0) && (err1 < err3)) + { + pBlock->set_trans_low_color(lr1, lg1, lb1, la1); + pBlock->set_trans_high_color(hr1, hg1, hb1, ha1); + + pBlock->m_modulation[0] = 0x55; + pBlock->m_modulation[1] = 0x55; + pBlock->m_modulation[2] = 0x55; + pBlock->m_modulation[3] = 0x55; + } + else if (err0 < err3) + { + pBlock->set_trans_low_color(lr0, lg0, lb0, la0); + pBlock->set_trans_high_color(0, 0, 0, 0); + + pBlock->m_modulation[0] = 0; + pBlock->m_modulation[1] = 0; + pBlock->m_modulation[2] = 0; + pBlock->m_modulation[3] = 0; + } + else + { + pBlock->set_trans_low_color(0, 0, 0, 0); + pBlock->set_trans_high_color(lr3, lg3, lb3, la3); + + pBlock->m_modulation[0] = 0xFF; + pBlock->m_modulation[1] = 0xFF; + pBlock->m_modulation[2] = 0xFF; + pBlock->m_modulation[3] = 0xFF; + } + + return; + } + + // It's a complex block with non-solid color and/or alpha pixels. + vec4F minColor, maxColor; + + if (solid_color_block) + { + // It's a solid color block. + uint32_t low_a = block_cols[alpha_selectors.m_lo_selector].a; + uint32_t high_a = block_cols[alpha_selectors.m_hi_selector].a; + + const float S = 1.0f / 255.0f; + vec4F_set(&minColor, block_cols[low_selector].r * S, block_cols[low_selector].g * S, block_cols[low_selector].b * S, low_a * S); + vec4F_set(&maxColor, block_cols[low_selector].r * S, block_cols[low_selector].g * S, block_cols[low_selector].b * S, high_a * S); + } + else if (constant_alpha_val >= 0) + { + // It's a solid alpha block. + const float S = 1.0f / 255.0f; + vec4F_set(&minColor, block_cols[low_selector].r * S, block_cols[low_selector].g * S, block_cols[low_selector].b * S, constant_alpha_val * S); + vec4F_set(&maxColor, block_cols[high_selector].r * S, block_cols[high_selector].g * S, block_cols[high_selector].b * S, constant_alpha_val * S); + } + // See if any of the block colors got clamped - if so the principle axis got distorted (it's no longer just the ETC1S luma axis). + // To keep quality up we need to use full 4D PCA in this case. + else if ((block_cols[low_selector].c[0] == 0) || (block_cols[high_selector].c[0] == 255) || + (block_cols[low_selector].c[1] == 0) || (block_cols[high_selector].c[1] == 255) || + (block_cols[low_selector].c[2] == 0) || (block_cols[high_selector].c[2] == 255) || + (block_cols[alpha_selectors.m_lo_selector].c[3] == 0) || (block_cols[alpha_selectors.m_hi_selector].c[3] == 255)) + { + // Find principle component of RGBA colors treated as 4D vectors. + color32 pixels[16]; + + uint32_t sum_r = 0, sum_g = 0, sum_b = 0, sum_a = 0; + for (uint32_t i = 0; i < 16; i++) + { + color32 rgb(block_cols[pSelector->get_selector(i & 3, i >> 2)]); + uint32_t a = block_cols[alpha_selectors.get_selector(i & 3, i >> 2)].a; + + pixels[i].set(rgb.r, rgb.g, rgb.b, a); + + sum_r += rgb.r; + sum_g += rgb.g; + sum_b += rgb.b; + sum_a += a; + } + + vec4F meanColor; + vec4F_set(&meanColor, (float)sum_r, (float)sum_g, (float)sum_b, (float)sum_a); + vec4F meanColorScaled = vec4F_mul(&meanColor, 1.0f / 16.0f); + + meanColor = vec4F_mul(&meanColor, 1.0f / (float)(16.0f * 255.0f)); + vec4F_saturate_in_place(&meanColor); + + vec4F axis; + vec4F_set_scalar(&axis, 0.0f); + // Why this incremental method? Because it's stable and predictable. Covar+power method can require a lot of iterations to converge in 4D. + for (uint32_t i = 0; i < 16; i++) + { + vec4F color = vec4F_from_color(&pixels[i]); + color = vec4F_sub(&color, &meanColorScaled); + vec4F a = vec4F_mul(&color, color.c[0]); + vec4F b = vec4F_mul(&color, color.c[1]); + vec4F c = vec4F_mul(&color, color.c[2]); + vec4F d = vec4F_mul(&color, color.c[3]); + vec4F n = i ? axis : color; + vec4F_normalize_in_place(&n); + axis.c[0] += vec4F_dot(&a, &n); + axis.c[1] += vec4F_dot(&b, &n); + axis.c[2] += vec4F_dot(&c, &n); + axis.c[3] += vec4F_dot(&d, &n); + } + + vec4F_normalize_in_place(&axis); + + if (vec4F_dot(&axis, &axis) < .5f) + vec4F_set_scalar(&axis, .5f); + + float l = 1e+9f, h = -1e+9f; + + for (uint32_t i = 0; i < 16; i++) + { + vec4F color = vec4F_from_color(&pixels[i]); + + vec4F q = vec4F_sub(&color, &meanColorScaled); + float d = vec4F_dot(&q, &axis); + + l = basisu::minimum(l, d); + h = basisu::maximum(h, d); + } + + l *= (1.0f / 255.0f); + h *= (1.0f / 255.0f); + + vec4F b0 = vec4F_mul(&axis, l); + vec4F b1 = vec4F_mul(&axis, h); + vec4F c0 = vec4F_add(&meanColor, &b0); + vec4F c1 = vec4F_add(&meanColor, &b1); + minColor = vec4F_saturate(&c0); + maxColor = vec4F_saturate(&c1); + if (minColor.c[3] > maxColor.c[3]) + { + // VS 2019 release Code Generator issue + //std::swap(minColor, maxColor); + + float a = minColor.c[0], b = minColor.c[1], c = minColor.c[2], d = minColor.c[3]; + minColor.c[0] = maxColor.c[0]; minColor.c[1] = maxColor.c[1]; minColor.c[2] = maxColor.c[2]; minColor.c[3] = maxColor.c[3]; + minColor.c[0] = maxColor.c[0]; minColor.c[1] = maxColor.c[1]; minColor.c[2] = maxColor.c[2]; minColor.c[3] = maxColor.c[3]; + maxColor.c[0] = a; maxColor.c[1] = b; maxColor.c[2] = c; maxColor.c[3] = d; + } + } + else + { + // We know the RGB axis is luma, because it's an ETC1S block and none of the block colors got clamped. So we only need to use 2D PCA. + // We project each LA vector onto two 2D lines with axes (1,1) and (1,-1) and find the largest projection to determine if axis A is flipped relative to L. + uint32_t block_cols_l[4], block_cols_a[4]; + for (uint32_t i = 0; i < 4; i++) + { + block_cols_l[i] = block_cols[i].r + block_cols[i].g + block_cols[i].b; + block_cols_a[i] = block_cols[i].a * 3; + } + + int p0_min = INT_MAX, p0_max = INT_MIN; + int p1_min = INT_MAX, p1_max = INT_MIN; + for (uint32_t y = 0; y < 4; y++) + { + const uint32_t cs = pSelector->m_selectors[y]; + const uint32_t as = alpha_selectors.m_selectors[y]; + + { + const int l = block_cols_l[cs & 3]; + const int a = block_cols_a[as & 3]; + const int p0 = l + a; p0_min = basisu::minimum(p0_min, p0); p0_max = basisu::maximum(p0_max, p0); + const int p1 = l - a; p1_min = basisu::minimum(p1_min, p1); p1_max = basisu::maximum(p1_max, p1); + } + { + const int l = block_cols_l[(cs >> 2) & 3]; + const int a = block_cols_a[(as >> 2) & 3]; + const int p0 = l + a; p0_min = basisu::minimum(p0_min, p0); p0_max = basisu::maximum(p0_max, p0); + const int p1 = l - a; p1_min = basisu::minimum(p1_min, p1); p1_max = basisu::maximum(p1_max, p1); + } + { + const int l = block_cols_l[(cs >> 4) & 3]; + const int a = block_cols_a[(as >> 4) & 3]; + const int p0 = l + a; p0_min = basisu::minimum(p0_min, p0); p0_max = basisu::maximum(p0_max, p0); + const int p1 = l - a; p1_min = basisu::minimum(p1_min, p1); p1_max = basisu::maximum(p1_max, p1); + } + { + const int l = block_cols_l[cs >> 6]; + const int a = block_cols_a[as >> 6]; + const int p0 = l + a; p0_min = basisu::minimum(p0_min, p0); p0_max = basisu::maximum(p0_max, p0); + const int p1 = l - a; p1_min = basisu::minimum(p1_min, p1); p1_max = basisu::maximum(p1_max, p1); + } + } + + int dist0 = p0_max - p0_min; + int dist1 = p1_max - p1_min; + + const float S = 1.0f / 255.0f; + + vec4F_set(&minColor, block_cols[low_selector].r * S, block_cols[low_selector].g * S, block_cols[low_selector].b * S, block_cols[alpha_selectors.m_lo_selector].a * S); + vec4F_set(&maxColor, block_cols[high_selector].r * S, block_cols[high_selector].g * S, block_cols[high_selector].b * S, block_cols[alpha_selectors.m_hi_selector].a * S); + + // See if the A component of the principle axis is flipped relative to L. If so, we need to flip either RGB or A bounds. + if (dist1 > dist0) + { + std::swap(minColor.c[0], maxColor.c[0]); + std::swap(minColor.c[1], maxColor.c[1]); + std::swap(minColor.c[2], maxColor.c[2]); + } + } + + // 4433 4443 + color32 trialMinColor, trialMaxColor; + + trialMinColor.set_clamped((int)(minColor.c[0] * 15.0f + .5f), (int)(minColor.c[1] * 15.0f + .5f), (int)(minColor.c[2] * 7.0f + .5f), (int)(minColor.c[3] * 7.0f + .5f)); + trialMaxColor.set_clamped((int)(maxColor.c[0] * 15.0f + .5f), (int)(maxColor.c[1] * 15.0f + .5f), (int)(maxColor.c[2] * 15.0f + .5f), (int)(maxColor.c[3] * 7.0f + .5f)); + + pBlock->set_trans_low_color(trialMinColor.r, trialMinColor.g, trialMinColor.b, trialMinColor.a); + pBlock->set_trans_high_color(trialMaxColor.r, trialMaxColor.g, trialMaxColor.b, trialMaxColor.a); + + color32 color_a((trialMinColor.r << 1) | (trialMinColor.r >> 3), (trialMinColor.g << 1) | (trialMinColor.g >> 3), (trialMinColor.b << 2) | (trialMinColor.b >> 1), trialMinColor.a << 1); + color32 color_b((trialMaxColor.r << 1) | (trialMaxColor.r >> 3), (trialMaxColor.g << 1) | (trialMaxColor.g >> 3), (trialMaxColor.b << 1) | (trialMaxColor.b >> 3), (trialMaxColor.a << 1) | 1); + + color32 color0(convert_rgba_5554_to_8888(color_a)); + color32 color3(convert_rgba_5554_to_8888(color_b)); + + const int lr = color0.r; + const int lg = color0.g; + const int lb = color0.b; + const int la = color0.a; + + const int axis_r = color3.r - lr; + const int axis_g = color3.g - lg; + const int axis_b = color3.b - lb; + const int axis_a = color3.a - la; + const int len_a = (axis_r * axis_r) + (axis_g * axis_g) + (axis_b * axis_b) + (axis_a * axis_a); + + const int thresh01 = (len_a * 3) / 16; + const int thresh12 = len_a >> 1; + const int thresh23 = (len_a * 13) / 16; + + if ((axis_r | axis_g | axis_b) == 0) + { + int ca_sel[4]; + + for (uint32_t i = 0; i < 4; i++) + { + int ca = (block_cols[i].a - la) * axis_a; + ca_sel[i] = (ca >= thresh23) + (ca >= thresh12) + (ca >= thresh01); + } + + for (uint32_t y = 0; y < 4; y++) + { + const uint32_t a_sels = alpha_selectors.m_selectors[y]; + + uint32_t sel = ca_sel[a_sels & 3] | (ca_sel[(a_sels >> 2) & 3] << 2) | (ca_sel[(a_sels >> 4) & 3] << 4) | (ca_sel[a_sels >> 6] << 6); + + pBlock->m_modulation[y] = (uint8_t)sel; + } + } + else + { + int cy[4], ca[4]; + + for (uint32_t i = 0; i < 4; i++) + { + cy[i] = (block_cols[i].r - lr) * axis_r + (block_cols[i].g - lg) * axis_g + (block_cols[i].b - lb) * axis_b; + ca[i] = (block_cols[i].a - la) * axis_a; + } + + for (uint32_t y = 0; y < 4; y++) + { + const uint32_t c_sels = pSelector->m_selectors[y]; + const uint32_t a_sels = alpha_selectors.m_selectors[y]; + + const int d0 = cy[c_sels & 3] + ca[a_sels & 3]; + const int d1 = cy[(c_sels >> 2) & 3] + ca[(a_sels >> 2) & 3]; + const int d2 = cy[(c_sels >> 4) & 3] + ca[(a_sels >> 4) & 3]; + const int d3 = cy[c_sels >> 6] + ca[a_sels >> 6]; + + uint32_t sel = ((d0 >= thresh23) + (d0 >= thresh12) + (d0 >= thresh01)) | + (((d1 >= thresh23) + (d1 >= thresh12) + (d1 >= thresh01)) << 2) | + (((d2 >= thresh23) + (d2 >= thresh12) + (d2 >= thresh01)) << 4) | + (((d3 >= thresh23) + (d3 >= thresh12) + (d3 >= thresh01)) << 6); + + pBlock->m_modulation[y] = (uint8_t)sel; + } + } + } + + static void transcoder_init_pvrtc2() + { + for (uint32_t v = 0; v < 256; v++) + { + int best_l = 0, best_h = 0, lowest_err = INT_MAX; + + for (uint32_t l = 0; l < 8; l++) + { + uint32_t le = (l << 1); + le = (le << 4) | le; + + for (uint32_t h = 0; h < 8; h++) + { + uint32_t he = (h << 1) | 1; + he = (he << 4) | he; + + uint32_t m = (le * 5 + he * 3) / 8; + + int err = (int)labs((int)v - (int)m); + if (err < lowest_err) + { + lowest_err = err; + best_l = l; + best_h = h; + } + } + } + + g_pvrtc2_alpha_match33[v].m_l = (uint8_t)best_l; + g_pvrtc2_alpha_match33[v].m_h = (uint8_t)best_h; + } + + for (uint32_t v = 0; v < 256; v++) + { + int best_l = 0, best_h = 0, lowest_err = INT_MAX; + + for (uint32_t l = 0; l < 8; l++) + { + uint32_t le = (l << 1); + le = (le << 4) | le; + + int err = (int)labs((int)v - (int)le); + if (err < lowest_err) + { + lowest_err = err; + best_l = l; + best_h = l; + } + } + + g_pvrtc2_alpha_match33_0[v].m_l = (uint8_t)best_l; + g_pvrtc2_alpha_match33_0[v].m_h = (uint8_t)best_h; + } + + for (uint32_t v = 0; v < 256; v++) + { + int best_l = 0, best_h = 0, lowest_err = INT_MAX; + + for (uint32_t h = 0; h < 8; h++) + { + uint32_t he = (h << 1) | 1; + he = (he << 4) | he; + + int err = (int)labs((int)v - (int)he); + if (err < lowest_err) + { + lowest_err = err; + best_l = h; + best_h = h; + } + } + + g_pvrtc2_alpha_match33_3[v].m_l = (uint8_t)best_l; + g_pvrtc2_alpha_match33_3[v].m_h = (uint8_t)best_h; + } + + for (uint32_t v = 0; v < 256; v++) + { + int best_l = 0, best_h = 0, lowest_err = INT_MAX; + + for (uint32_t l = 0; l < 8; l++) + { + uint32_t le = (l << 2) | (l >> 1); + le = (le << 3) | (le >> 2); + + for (uint32_t h = 0; h < 16; h++) + { + uint32_t he = (h << 1) | (h >> 3); + he = (he << 3) | (he >> 2); + + uint32_t m = (le * 5 + he * 3) / 8; + + int err = (int)labs((int)v - (int)m); + if (err < lowest_err) + { + lowest_err = err; + best_l = l; + best_h = h; + } + } + } + + g_pvrtc2_trans_match34[v].m_l = (uint8_t)best_l; + g_pvrtc2_trans_match34[v].m_h = (uint8_t)best_h; + } + + for (uint32_t v = 0; v < 256; v++) + { + int best_l = 0, best_h = 0, lowest_err = INT_MAX; + + for (uint32_t l = 0; l < 16; l++) + { + uint32_t le = (l << 1) | (l >> 3); + le = (le << 3) | (le >> 2); + + for (uint32_t h = 0; h < 16; h++) + { + uint32_t he = (h << 1) | (h >> 3); + he = (he << 3) | (he >> 2); + + uint32_t m = (le * 5 + he * 3) / 8; + + int err = (int)labs((int)v - (int)m); + if (err < lowest_err) + { + lowest_err = err; + best_l = l; + best_h = h; + } + } + } + + g_pvrtc2_trans_match44[v].m_l = (uint8_t)best_l; + g_pvrtc2_trans_match44[v].m_h = (uint8_t)best_h; + } + } +#endif // BASISD_SUPPORT_PVRTC2 + + basisu_lowlevel_etc1s_transcoder::basisu_lowlevel_etc1s_transcoder() : + m_pGlobal_codebook(nullptr), + m_selector_history_buf_size(0) + { + } + + bool basisu_lowlevel_etc1s_transcoder::decode_palettes( + uint32_t num_endpoints, const uint8_t* pEndpoints_data, uint32_t endpoints_data_size, + uint32_t num_selectors, const uint8_t* pSelectors_data, uint32_t selectors_data_size) + { + if (m_pGlobal_codebook) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 11\n"); + return false; + } + bitwise_decoder sym_codec; + + huffman_decoding_table color5_delta_model0, color5_delta_model1, color5_delta_model2, inten_delta_model; + + if (!sym_codec.init(pEndpoints_data, endpoints_data_size)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 0\n"); + return false; + } + + if (!sym_codec.read_huffman_table(color5_delta_model0)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 1\n"); + return false; + } + + if (!sym_codec.read_huffman_table(color5_delta_model1)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 1a\n"); + return false; + } + + if (!sym_codec.read_huffman_table(color5_delta_model2)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 2a\n"); + return false; + } + + if (!sym_codec.read_huffman_table(inten_delta_model)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 2b\n"); + return false; + } + + if (!color5_delta_model0.is_valid() || !color5_delta_model1.is_valid() || !color5_delta_model2.is_valid() || !inten_delta_model.is_valid()) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 2b\n"); + return false; + } + + const bool endpoints_are_grayscale = sym_codec.get_bits(1) != 0; + + m_local_endpoints.resize(num_endpoints); + + color32 prev_color5(16, 16, 16, 0); + uint32_t prev_inten = 0; + + for (uint32_t i = 0; i < num_endpoints; i++) + { + uint32_t inten_delta = sym_codec.decode_huffman(inten_delta_model); + m_local_endpoints[i].m_inten5 = static_cast((inten_delta + prev_inten) & 7); + prev_inten = m_local_endpoints[i].m_inten5; + + for (uint32_t c = 0; c < (endpoints_are_grayscale ? 1U : 3U); c++) + { + int delta; + if (prev_color5[c] <= basist::COLOR5_PAL0_PREV_HI) + delta = sym_codec.decode_huffman(color5_delta_model0); + else if (prev_color5[c] <= basist::COLOR5_PAL1_PREV_HI) + delta = sym_codec.decode_huffman(color5_delta_model1); + else + delta = sym_codec.decode_huffman(color5_delta_model2); + + int v = (prev_color5[c] + delta) & 31; + + m_local_endpoints[i].m_color5[c] = static_cast(v); + + prev_color5[c] = static_cast(v); + } + + if (endpoints_are_grayscale) + { + m_local_endpoints[i].m_color5[1] = m_local_endpoints[i].m_color5[0]; + m_local_endpoints[i].m_color5[2] = m_local_endpoints[i].m_color5[0]; + } + } + + sym_codec.stop(); + + m_local_selectors.resize(num_selectors); + + if (!sym_codec.init(pSelectors_data, selectors_data_size)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 5\n"); + return false; + } + + basist::huffman_decoding_table delta_selector_pal_model; + + const bool used_global_selector_cb = (sym_codec.get_bits(1) == 1); + + if (used_global_selector_cb) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: global selector codebooks are unsupported\n"); + return false; + } + else + { + const bool used_hybrid_selector_cb = (sym_codec.get_bits(1) == 1); + + if (used_hybrid_selector_cb) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: hybrid global selector codebooks are unsupported\n"); + return false; + } + + const bool used_raw_encoding = (sym_codec.get_bits(1) == 1); + + if (used_raw_encoding) + { + for (uint32_t i = 0; i < num_selectors; i++) + { + for (uint32_t j = 0; j < 4; j++) + { + uint32_t cur_byte = sym_codec.get_bits(8); + + for (uint32_t k = 0; k < 4; k++) + m_local_selectors[i].set_selector(k, j, (cur_byte >> (k * 2)) & 3); + } + + m_local_selectors[i].init_flags(); + } + } + else + { + if (!sym_codec.read_huffman_table(delta_selector_pal_model)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 10\n"); + return false; + } + + if ((num_selectors > 1) && (!delta_selector_pal_model.is_valid())) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 10a\n"); + return false; + } + + uint8_t prev_bytes[4] = { 0, 0, 0, 0 }; + + for (uint32_t i = 0; i < num_selectors; i++) + { + if (!i) + { + for (uint32_t j = 0; j < 4; j++) + { + uint32_t cur_byte = sym_codec.get_bits(8); + prev_bytes[j] = static_cast(cur_byte); + + for (uint32_t k = 0; k < 4; k++) + m_local_selectors[i].set_selector(k, j, (cur_byte >> (k * 2)) & 3); + } + m_local_selectors[i].init_flags(); + continue; + } + + for (uint32_t j = 0; j < 4; j++) + { + int delta_byte = sym_codec.decode_huffman(delta_selector_pal_model); + + uint32_t cur_byte = delta_byte ^ prev_bytes[j]; + prev_bytes[j] = static_cast(cur_byte); + + for (uint32_t k = 0; k < 4; k++) + m_local_selectors[i].set_selector(k, j, (cur_byte >> (k * 2)) & 3); + } + m_local_selectors[i].init_flags(); + } + } + } + + sym_codec.stop(); + + return true; + } + + bool basisu_lowlevel_etc1s_transcoder::decode_tables(const uint8_t* pTable_data, uint32_t table_data_size) + { + basist::bitwise_decoder sym_codec; + if (!sym_codec.init(pTable_data, table_data_size)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 0\n"); + return false; + } + + if (!sym_codec.read_huffman_table(m_endpoint_pred_model)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 1\n"); + return false; + } + + if (m_endpoint_pred_model.get_code_sizes().size() == 0) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 1a\n"); + return false; + } + + if (!sym_codec.read_huffman_table(m_delta_endpoint_model)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 2\n"); + return false; + } + + if (m_delta_endpoint_model.get_code_sizes().size() == 0) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 2a\n"); + return false; + } + + if (!sym_codec.read_huffman_table(m_selector_model)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 3\n"); + return false; + } + + if (m_selector_model.get_code_sizes().size() == 0) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 3a\n"); + return false; + } + + if (!sym_codec.read_huffman_table(m_selector_history_buf_rle_model)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 4\n"); + return false; + } + + if (m_selector_history_buf_rle_model.get_code_sizes().size() == 0) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 4a\n"); + return false; + } + + m_selector_history_buf_size = sym_codec.get_bits(13); + // Check for bogus values. + if (!m_selector_history_buf_size) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 5\n"); + return false; + } + + sym_codec.stop(); + + return true; + } + + bool basisu_lowlevel_etc1s_transcoder::transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, const bool is_video, const bool is_alpha_slice, const uint32_t level_index, const uint32_t orig_width, const uint32_t orig_height, uint32_t output_row_pitch_in_blocks_or_pixels, + basisu_transcoder_state* pState, bool transcode_alpha, void *pAlpha_blocks, uint32_t output_rows_in_pixels) + { + // 'pDst_blocks' unused when disabling *all* hardware transcode options + // (and 'bc1_allow_threecolor_blocks' when disabling DXT) + BASISU_NOTE_UNUSED(pDst_blocks); + BASISU_NOTE_UNUSED(bc1_allow_threecolor_blocks); + BASISU_NOTE_UNUSED(transcode_alpha); + BASISU_NOTE_UNUSED(pAlpha_blocks); + + assert(g_transcoder_initialized); + if (!g_transcoder_initialized) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: Transcoder not globally initialized.\n"); + return false; + } + + if (!pState) + pState = &m_def_state; + + const uint32_t total_blocks = num_blocks_x * num_blocks_y; + + if (!output_row_pitch_in_blocks_or_pixels) + { + if (basis_block_format_is_uncompressed(fmt)) + output_row_pitch_in_blocks_or_pixels = orig_width; + else + { + if (fmt == block_format::cFXT1_RGB) + output_row_pitch_in_blocks_or_pixels = (orig_width + 7) / 8; + else + output_row_pitch_in_blocks_or_pixels = num_blocks_x; + } + } + + if (basis_block_format_is_uncompressed(fmt)) + { + if (!output_rows_in_pixels) + output_rows_in_pixels = orig_height; + } + + basisu::vector* pPrev_frame_indices = nullptr; + if (is_video) + { + // TODO: Add check to make sure the caller hasn't tried skipping past p-frames + //const bool alpha_flag = (slice_desc.m_flags & cSliceDescFlagsHasAlpha) != 0; + //const uint32_t level_index = slice_desc.m_level_index; + + if (level_index >= basisu_transcoder_state::cMaxPrevFrameLevels) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: unsupported level_index\n"); + return false; + } + + pPrev_frame_indices = &pState->m_prev_frame_indices[is_alpha_slice][level_index]; + if (pPrev_frame_indices->size() < total_blocks) + pPrev_frame_indices->resize(total_blocks); + } + + basist::bitwise_decoder sym_codec; + + if (!sym_codec.init(pImage_data, image_data_size)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: sym_codec.init failed\n"); + return false; + } + + approx_move_to_front selector_history_buf(m_selector_history_buf_size); + + uint32_t cur_selector_rle_count = 0; + + decoder_etc_block block; + memset(&block, 0, sizeof(block)); + + //block.set_flip_bit(true); + // Setting the flip bit to false to be compatible with the Khronos KDFS. + block.set_flip_bit(false); + + block.set_diff_bit(true); + + void* pPVRTC_work_mem = nullptr; + uint32_t* pPVRTC_endpoints = nullptr; + if ((fmt == block_format::cPVRTC1_4_RGB) || (fmt == block_format::cPVRTC1_4_RGBA)) + { + pPVRTC_work_mem = malloc(num_blocks_x * num_blocks_y * (sizeof(decoder_etc_block) + sizeof(uint32_t))); + if (!pPVRTC_work_mem) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: malloc failed\n"); + return false; + } + pPVRTC_endpoints = (uint32_t*) & ((decoder_etc_block*)pPVRTC_work_mem)[num_blocks_x * num_blocks_y]; + } + + if (pState->m_block_endpoint_preds[0].size() < num_blocks_x) + { + pState->m_block_endpoint_preds[0].resize(num_blocks_x); + pState->m_block_endpoint_preds[1].resize(num_blocks_x); + } + + uint32_t cur_pred_bits = 0; + int prev_endpoint_pred_sym = 0; + int endpoint_pred_repeat_count = 0; + uint32_t prev_endpoint_index = 0; + const endpoint_vec& endpoints = m_pGlobal_codebook ? m_pGlobal_codebook->m_local_endpoints : m_local_endpoints; + const selector_vec& selectors = m_pGlobal_codebook ? m_pGlobal_codebook->m_local_selectors : m_local_selectors; + if (!endpoints.size() || !selectors.size()) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: global codebooks must be unpacked first\n"); + return false; + } + + const uint32_t SELECTOR_HISTORY_BUF_FIRST_SYMBOL_INDEX = (uint32_t)selectors.size(); + const uint32_t SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX = m_selector_history_buf_size + SELECTOR_HISTORY_BUF_FIRST_SYMBOL_INDEX; + + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + const uint32_t cur_block_endpoint_pred_array = block_y & 1; + + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + // Decode endpoint index predictor symbols + if ((block_x & 1) == 0) + { + if ((block_y & 1) == 0) + { + if (endpoint_pred_repeat_count) + { + endpoint_pred_repeat_count--; + cur_pred_bits = prev_endpoint_pred_sym; + } + else + { + cur_pred_bits = sym_codec.decode_huffman(m_endpoint_pred_model); + if (cur_pred_bits == ENDPOINT_PRED_REPEAT_LAST_SYMBOL) + { + endpoint_pred_repeat_count = sym_codec.decode_vlc(ENDPOINT_PRED_COUNT_VLC_BITS) + ENDPOINT_PRED_MIN_REPEAT_COUNT - 1; + + cur_pred_bits = prev_endpoint_pred_sym; + } + else + { + prev_endpoint_pred_sym = cur_pred_bits; + } + } + + pState->m_block_endpoint_preds[cur_block_endpoint_pred_array ^ 1][block_x].m_pred_bits = (uint8_t)(cur_pred_bits >> 4); + } + else + { + cur_pred_bits = pState->m_block_endpoint_preds[cur_block_endpoint_pred_array][block_x].m_pred_bits; + } + } + + // Decode endpoint index + uint32_t endpoint_index, selector_index = 0; + + const uint32_t pred = cur_pred_bits & 3; + cur_pred_bits >>= 2; + + if (pred == 0) + { + // Left + if (!block_x) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: invalid datastream (0)\n"); + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + return false; + } + + endpoint_index = prev_endpoint_index; + } + else if (pred == 1) + { + // Upper + if (!block_y) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: invalid datastream (1)\n"); + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + return false; + } + + endpoint_index = pState->m_block_endpoint_preds[cur_block_endpoint_pred_array ^ 1][block_x].m_endpoint_index; + } + else if (pred == 2) + { + if (is_video) + { + assert(pred == CR_ENDPOINT_PRED_INDEX); + endpoint_index = (*pPrev_frame_indices)[block_x + block_y * num_blocks_x]; + selector_index = endpoint_index >> 16; + endpoint_index &= 0xFFFFU; + } + else + { + // Upper left + if ((!block_x) || (!block_y)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: invalid datastream (2)\n"); + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + return false; + } + + endpoint_index = pState->m_block_endpoint_preds[cur_block_endpoint_pred_array ^ 1][block_x - 1].m_endpoint_index; + } + } + else + { + // Decode and apply delta + const uint32_t delta_sym = sym_codec.decode_huffman(m_delta_endpoint_model); + + endpoint_index = delta_sym + prev_endpoint_index; + if (endpoint_index >= endpoints.size()) + endpoint_index -= (int)endpoints.size(); + } + + pState->m_block_endpoint_preds[cur_block_endpoint_pred_array][block_x].m_endpoint_index = (uint16_t)endpoint_index; + + prev_endpoint_index = endpoint_index; + + // Decode selector index + if ((!is_video) || (pred != CR_ENDPOINT_PRED_INDEX)) + { + int selector_sym; + if (cur_selector_rle_count > 0) + { + cur_selector_rle_count--; + + selector_sym = (int)selectors.size(); + } + else + { + selector_sym = sym_codec.decode_huffman(m_selector_model); + + if (selector_sym == static_cast(SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX)) + { + int run_sym = sym_codec.decode_huffman(m_selector_history_buf_rle_model); + + if (run_sym == (SELECTOR_HISTORY_BUF_RLE_COUNT_TOTAL - 1)) + cur_selector_rle_count = sym_codec.decode_vlc(7) + SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH; + else + cur_selector_rle_count = run_sym + SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH; + + if (cur_selector_rle_count > total_blocks) + { + // The file is corrupted or we've got a bug. + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: invalid datastream (3)\n"); + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + return false; + } + + selector_sym = (int)selectors.size(); + + cur_selector_rle_count--; + } + } + + if (selector_sym >= (int)selectors.size()) + { + assert(m_selector_history_buf_size > 0); + + int history_buf_index = selector_sym - (int)selectors.size(); + + if (history_buf_index >= (int)selector_history_buf.size()) + { + // The file is corrupted or we've got a bug. + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: invalid datastream (4)\n"); + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + return false; + } + + selector_index = selector_history_buf[history_buf_index]; + + if (history_buf_index != 0) + selector_history_buf.use(history_buf_index); + } + else + { + selector_index = selector_sym; + + if (m_selector_history_buf_size) + selector_history_buf.add(selector_index); + } + } + + if ((endpoint_index >= endpoints.size()) || (selector_index >= selectors.size())) + { + // The file is corrupted or we've got a bug. + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: invalid datastream (5)\n"); + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + return false; + } + + if (is_video) + (*pPrev_frame_indices)[block_x + block_y * num_blocks_x] = endpoint_index | (selector_index << 16); + +#if BASISD_ENABLE_DEBUG_FLAGS + if ((g_debug_flags & cDebugFlagVisCRs) && ((fmt == block_format::cETC1) || (fmt == block_format::cBC1))) + { + if ((is_video) && (pred == 2)) + { + decoder_etc_block* pDst_block = reinterpret_cast(static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes); + memset(pDst_block, 0xFF, 8); + continue; + } + } +#endif + + const endpoint* pEndpoints = &endpoints[endpoint_index]; + const selector* pSelector = &selectors[selector_index]; + + switch (fmt) + { + case block_format::cETC1: + { + decoder_etc_block* pDst_block = reinterpret_cast(static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes); + + block.set_base5_color(decoder_etc_block::pack_color5(pEndpoints->m_color5, false)); + block.set_inten_table(0, pEndpoints->m_inten5); + block.set_inten_table(1, pEndpoints->m_inten5); + + pDst_block->m_uint32[0] = block.m_uint32[0]; + pDst_block->set_raw_selector_bits(pSelector->m_bytes[0], pSelector->m_bytes[1], pSelector->m_bytes[2], pSelector->m_bytes[3]); + + break; + } + case block_format::cBC1: + { +#if BASISD_SUPPORT_DXT1 + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; +#if BASISD_ENABLE_DEBUG_FLAGS + if (g_debug_flags & (cDebugFlagVisBC1Sels | cDebugFlagVisBC1Endpoints)) + convert_etc1s_to_dxt1_vis(static_cast(pDst_block), pEndpoints, pSelector, bc1_allow_threecolor_blocks); + else +#endif + convert_etc1s_to_dxt1(static_cast(pDst_block), pEndpoints, pSelector, bc1_allow_threecolor_blocks); +#else + assert(0); +#endif + break; + } + case block_format::cBC4: + { +#if BASISD_SUPPORT_DXT5A + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_dxt5a(static_cast(pDst_block), pEndpoints, pSelector); +#else + assert(0); +#endif + break; + } + case block_format::cPVRTC1_4_RGB: + { +#if BASISD_SUPPORT_PVRTC1 + block.set_base5_color(decoder_etc_block::pack_color5(pEndpoints->m_color5, false)); + block.set_inten_table(0, pEndpoints->m_inten5); + block.set_inten_table(1, pEndpoints->m_inten5); + block.set_raw_selector_bits(pSelector->m_bytes[0], pSelector->m_bytes[1], pSelector->m_bytes[2], pSelector->m_bytes[3]); + + ((decoder_etc_block*)pPVRTC_work_mem)[block_x + block_y * num_blocks_x] = block; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + // Get block's RGB bounding box + color32 block_colors[2]; + decoder_etc_block::get_block_colors5_bounds(block_colors, base_color, inten_table, low_selector, high_selector); + + assert(block_colors[0][0] <= block_colors[1][0]); + assert(block_colors[0][1] <= block_colors[1][1]); + assert(block_colors[0][2] <= block_colors[1][2]); + + // Set PVRTC1 endpoints to floor/ceil of bounding box's coordinates. + pvrtc4_block temp; + temp.set_opaque_endpoint_floor(0, block_colors[0]); + temp.set_opaque_endpoint_ceil(1, block_colors[1]); + + pPVRTC_endpoints[block_x + block_y * num_blocks_x] = temp.m_endpoints; +#else + assert(0); +#endif + + break; + } + case block_format::cPVRTC1_4_RGBA: + { +#if BASISD_SUPPORT_PVRTC1 + assert(pAlpha_blocks); + + block.set_base5_color(decoder_etc_block::pack_color5(pEndpoints->m_color5, false)); + block.set_inten_table(0, pEndpoints->m_inten5); + block.set_inten_table(1, pEndpoints->m_inten5); + block.set_raw_selector_bits(pSelector->m_selectors[0], pSelector->m_selectors[1], pSelector->m_selectors[2], pSelector->m_selectors[3]); + + ((decoder_etc_block*)pPVRTC_work_mem)[block_x + block_y * num_blocks_x] = block; + + // Get block's RGBA bounding box + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + color32 block_colors[2]; + decoder_etc_block::get_block_colors5_bounds(block_colors, base_color, inten_table, low_selector, high_selector); + + assert(block_colors[0][0] <= block_colors[1][0]); + assert(block_colors[0][1] <= block_colors[1][1]); + assert(block_colors[0][2] <= block_colors[1][2]); + + const uint16_t* pAlpha_block = reinterpret_cast(static_cast(pAlpha_blocks) + (block_x + block_y * num_blocks_x) * sizeof(uint32_t)); + + const endpoint* pAlpha_endpoints = &endpoints[pAlpha_block[0]]; + const selector* pAlpha_selector = &selectors[pAlpha_block[1]]; + + const color32& alpha_base_color = pAlpha_endpoints->m_color5; + const uint32_t alpha_inten_table = pAlpha_endpoints->m_inten5; + const uint32_t alpha_low_selector = pAlpha_selector->m_lo_selector; + const uint32_t alpha_high_selector = pAlpha_selector->m_hi_selector; + uint32_t alpha_block_colors[2]; + decoder_etc_block::get_block_colors5_bounds_g(alpha_block_colors, alpha_base_color, alpha_inten_table, alpha_low_selector, alpha_high_selector); + assert(alpha_block_colors[0] <= alpha_block_colors[1]); + block_colors[0].a = (uint8_t)alpha_block_colors[0]; + block_colors[1].a = (uint8_t)alpha_block_colors[1]; + + // Set PVRTC1 endpoints to floor/ceil of bounding box's coordinates. + pvrtc4_block temp; + temp.set_endpoint_floor(0, block_colors[0]); + temp.set_endpoint_ceil(1, block_colors[1]); + + pPVRTC_endpoints[block_x + block_y * num_blocks_x] = temp.m_endpoints; +#else + assert(0); +#endif + + break; + } + case block_format::cBC7: // for more consistency with UASTC + case block_format::cBC7_M5_COLOR: + { +#if BASISD_SUPPORT_BC7_MODE5 + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_bc7_m5_color(pDst_block, pEndpoints, pSelector); +#else + assert(0); +#endif + break; + } + case block_format::cBC7_M5_ALPHA: + { +#if BASISD_SUPPORT_BC7_MODE5 + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_bc7_m5_alpha(pDst_block, pEndpoints, pSelector); +#else + assert(0); +#endif + break; + } + case block_format::cETC2_EAC_A8: + { +#if BASISD_SUPPORT_ETC2_EAC_A8 + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_etc2_eac_a8(static_cast(pDst_block), pEndpoints, pSelector); +#else + assert(0); +#endif + break; + } + case block_format::cASTC_4x4: + { +#if BASISD_SUPPORT_ASTC + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_astc_4x4(pDst_block, pEndpoints, pSelector, transcode_alpha, &endpoints[0], &selectors[0]); +#else + assert(0); +#endif + break; + } + case block_format::cATC_RGB: + { +#if BASISD_SUPPORT_ATC + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_atc(pDst_block, pEndpoints, pSelector); +#else + assert(0); +#endif + break; + } + case block_format::cFXT1_RGB: + { +#if BASISD_SUPPORT_FXT1 + const uint32_t fxt1_block_x = block_x >> 1; + const uint32_t fxt1_block_y = block_y; + const uint32_t fxt1_subblock = block_x & 1; + + void* pDst_block = static_cast(pDst_blocks) + (fxt1_block_x + fxt1_block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + + convert_etc1s_to_fxt1(pDst_block, pEndpoints, pSelector, fxt1_subblock); +#else + assert(0); +#endif + break; + } + case block_format::cPVRTC2_4_RGB: + { +#if BASISD_SUPPORT_PVRTC2 + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_pvrtc2_rgb(pDst_block, pEndpoints, pSelector); +#endif + break; + } + case block_format::cPVRTC2_4_RGBA: + { +#if BASISD_SUPPORT_PVRTC2 + assert(transcode_alpha); + + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + + convert_etc1s_to_pvrtc2_rgba(pDst_block, pEndpoints, pSelector, &endpoints[0], &selectors[0]); +#endif + break; + } + case block_format::cIndices: + { + uint16_t* pDst_block = reinterpret_cast(static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes); + pDst_block[0] = static_cast(endpoint_index); + pDst_block[1] = static_cast(selector_index); + break; + } + case block_format::cA32: + { + assert(sizeof(uint32_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint32_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + int colors[4]; + decoder_etc_block::get_block_colors5_g(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + if (max_x == 4) + { + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + pDst_pixels[3] = static_cast(colors[s & 3]); + pDst_pixels[3+4] = static_cast(colors[(s >> 2) & 3]); + pDst_pixels[3+8] = static_cast(colors[(s >> 4) & 3]); + pDst_pixels[3+12] = static_cast(colors[(s >> 6) & 3]); + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint32_t); + } + } + else + { + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + pDst_pixels[3 + 4 * x] = static_cast(colors[(s >> (x * 2)) & 3]); + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint32_t); + } + } + + break; + } + case block_format::cRGB32: + { + assert(sizeof(uint32_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint32_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + color32 colors[4]; + decoder_etc_block::get_block_colors5(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + { + const color32& c = colors[(s >> (x * 2)) & 3]; + + pDst_pixels[0 + 4 * x] = c.r; + pDst_pixels[1 + 4 * x] = c.g; + pDst_pixels[2 + 4 * x] = c.b; + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint32_t); + } + + break; + } + case block_format::cRGBA32: + { + assert(sizeof(uint32_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint32_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + color32 colors[4]; + decoder_etc_block::get_block_colors5(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + { + const color32& c = colors[(s >> (x * 2)) & 3]; + + pDst_pixels[0 + 4 * x] = c.r; + pDst_pixels[1 + 4 * x] = c.g; + pDst_pixels[2 + 4 * x] = c.b; + pDst_pixels[3 + 4 * x] = 255; + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint32_t); + } + + break; + } + case block_format::cRGB565: + case block_format::cBGR565: + { + assert(sizeof(uint16_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint16_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + color32 colors[4]; + decoder_etc_block::get_block_colors5(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + uint16_t packed_colors[4]; + if (fmt == block_format::cRGB565) + { + for (uint32_t i = 0; i < 4; i++) + { + packed_colors[i] = static_cast((mul_8(colors[i].r, 31) << 11) | (mul_8(colors[i].g, 63) << 5) | mul_8(colors[i].b, 31)); + if (BASISD_IS_BIG_ENDIAN) + packed_colors[i] = byteswap_uint16(packed_colors[i]); + } + } + else + { + for (uint32_t i = 0; i < 4; i++) + { + packed_colors[i] = static_cast((mul_8(colors[i].b, 31) << 11) | (mul_8(colors[i].g, 63) << 5) | mul_8(colors[i].r, 31)); + if (BASISD_IS_BIG_ENDIAN) + packed_colors[i] = byteswap_uint16(packed_colors[i]); + } + } + + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + reinterpret_cast(pDst_pixels)[x] = packed_colors[(s >> (x * 2)) & 3]; + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint16_t); + } + + break; + } + case block_format::cRGBA4444_COLOR: + { + assert(sizeof(uint16_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint16_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + color32 colors[4]; + decoder_etc_block::get_block_colors5(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + uint16_t packed_colors[4]; + for (uint32_t i = 0; i < 4; i++) + { + packed_colors[i] = static_cast((mul_8(colors[i].r, 15) << 12) | (mul_8(colors[i].g, 15) << 8) | (mul_8(colors[i].b, 15) << 4)); + } + + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + { + uint16_t cur = reinterpret_cast(pDst_pixels)[x]; + if (BASISD_IS_BIG_ENDIAN) + cur = byteswap_uint16(cur); + + cur = (cur & 0xF) | packed_colors[(s >> (x * 2)) & 3]; + + if (BASISD_IS_BIG_ENDIAN) + cur = byteswap_uint16(cur); + + reinterpret_cast(pDst_pixels)[x] = cur; + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint16_t); + } + + break; + } + case block_format::cRGBA4444_COLOR_OPAQUE: + { + assert(sizeof(uint16_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint16_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + color32 colors[4]; + decoder_etc_block::get_block_colors5(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + uint16_t packed_colors[4]; + for (uint32_t i = 0; i < 4; i++) + { + packed_colors[i] = static_cast((mul_8(colors[i].r, 15) << 12) | (mul_8(colors[i].g, 15) << 8) | (mul_8(colors[i].b, 15) << 4) | 0xF); + if (BASISD_IS_BIG_ENDIAN) + packed_colors[i] = byteswap_uint16(packed_colors[i]); + } + + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + reinterpret_cast(pDst_pixels)[x] = packed_colors[(s >> (x * 2)) & 3]; + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint16_t); + } + + break; + } + case block_format::cRGBA4444_ALPHA: + { + assert(sizeof(uint16_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint16_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + color32 colors[4]; + decoder_etc_block::get_block_colors5(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + uint16_t packed_colors[4]; + for (uint32_t i = 0; i < 4; i++) + { + packed_colors[i] = mul_8(colors[i].g, 15); + if (BASISD_IS_BIG_ENDIAN) + packed_colors[i] = byteswap_uint16(packed_colors[i]); + } + + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + { + reinterpret_cast(pDst_pixels)[x] = packed_colors[(s >> (x * 2)) & 3]; + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint16_t); + } + + break; + } + case block_format::cETC2_EAC_R11: + { +#if BASISD_SUPPORT_ETC2_EAC_RG11 + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_etc2_eac_r11(static_cast(pDst_block), pEndpoints, pSelector); +#else + assert(0); +#endif + break; + } + default: + { + assert(0); + break; + } + } + + } // block_x + + } // block-y + + if (endpoint_pred_repeat_count != 0) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: endpoint_pred_repeat_count != 0. The file is corrupted or this is a bug\n"); + return false; + } + + //assert(endpoint_pred_repeat_count == 0); + +#if BASISD_SUPPORT_PVRTC1 + // PVRTC post process - create per-pixel modulation values. + if (fmt == block_format::cPVRTC1_4_RGB) + fixup_pvrtc1_4_modulation_rgb((decoder_etc_block*)pPVRTC_work_mem, pPVRTC_endpoints, pDst_blocks, num_blocks_x, num_blocks_y); + else if (fmt == block_format::cPVRTC1_4_RGBA) + fixup_pvrtc1_4_modulation_rgba((decoder_etc_block*)pPVRTC_work_mem, pPVRTC_endpoints, pDst_blocks, num_blocks_x, num_blocks_y, pAlpha_blocks, &endpoints[0], &selectors[0]); +#endif // BASISD_SUPPORT_PVRTC1 + + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + + return true; + } + + bool basis_validate_output_buffer_size(transcoder_texture_format target_format, + uint32_t output_blocks_buf_size_in_blocks_or_pixels, + uint32_t orig_width, uint32_t orig_height, + uint32_t output_row_pitch_in_blocks_or_pixels, + uint32_t output_rows_in_pixels, + uint32_t total_slice_blocks) + { + if (basis_transcoder_format_is_uncompressed(target_format)) + { + // Assume the output buffer is orig_width by orig_height + if (!output_row_pitch_in_blocks_or_pixels) + output_row_pitch_in_blocks_or_pixels = orig_width; + + if (!output_rows_in_pixels) + output_rows_in_pixels = orig_height; + + // Now make sure the output buffer is large enough, or we'll overwrite memory. + if (output_blocks_buf_size_in_blocks_or_pixels < (output_rows_in_pixels * output_row_pitch_in_blocks_or_pixels)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: output_blocks_buf_size_in_blocks_or_pixels < (output_rows_in_pixels * output_row_pitch_in_blocks_or_pixels)\n"); + return false; + } + } + else if (target_format == transcoder_texture_format::cTFFXT1_RGB) + { + const uint32_t num_blocks_fxt1_x = (orig_width + 7) / 8; + const uint32_t num_blocks_fxt1_y = (orig_height + 3) / 4; + const uint32_t total_blocks_fxt1 = num_blocks_fxt1_x * num_blocks_fxt1_y; + + if (output_blocks_buf_size_in_blocks_or_pixels < total_blocks_fxt1) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: output_blocks_buf_size_in_blocks_or_pixels < total_blocks_fxt1\n"); + return false; + } + } + else + { + if (output_blocks_buf_size_in_blocks_or_pixels < total_slice_blocks) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: output_blocks_buf_size_in_blocks_or_pixels < transcode_image\n"); + return false; + } + } + return true; + } + + bool basisu_lowlevel_etc1s_transcoder::transcode_image( + transcoder_texture_format target_format, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + const uint8_t* pCompressed_data, uint32_t compressed_data_length, + uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, + uint32_t rgb_offset, uint32_t rgb_length, uint32_t alpha_offset, uint32_t alpha_length, + uint32_t decode_flags, + bool basis_file_has_alpha_slices, + bool is_video, + uint32_t output_row_pitch_in_blocks_or_pixels, + basisu_transcoder_state* pState, + uint32_t output_rows_in_pixels) + { + if (((uint64_t)rgb_offset + rgb_length) > (uint64_t)compressed_data_length) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: source data buffer too small (color)\n"); + return false; + } + + if (alpha_length) + { + if (((uint64_t)alpha_offset + alpha_length) > (uint64_t)compressed_data_length) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: source data buffer too small (alpha)\n"); + return false; + } + } + else + { + assert(!basis_file_has_alpha_slices); + } + + if ((target_format == transcoder_texture_format::cTFPVRTC1_4_RGB) || (target_format == transcoder_texture_format::cTFPVRTC1_4_RGBA)) + { + if ((!basisu::is_pow2(num_blocks_x * 4)) || (!basisu::is_pow2(num_blocks_y * 4))) + { + // PVRTC1 only supports power of 2 dimensions + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: PVRTC1 only supports power of 2 dimensions\n"); + return false; + } + } + + if ((target_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) && (!basis_file_has_alpha_slices)) + { + // Switch to PVRTC1 RGB if the input doesn't have alpha. + target_format = transcoder_texture_format::cTFPVRTC1_4_RGB; + } + + const bool transcode_alpha_data_to_opaque_formats = (decode_flags & cDecodeFlagsTranscodeAlphaDataToOpaqueFormats) != 0; + const uint32_t bytes_per_block_or_pixel = basis_get_bytes_per_block_or_pixel(target_format); + const uint32_t total_slice_blocks = num_blocks_x * num_blocks_y; + + if (!basis_validate_output_buffer_size(target_format, output_blocks_buf_size_in_blocks_or_pixels, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, output_rows_in_pixels, total_slice_blocks)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: output buffer size too small\n"); + return false; + } + + bool status = false; + + const uint8_t* pData = pCompressed_data + rgb_offset; + uint32_t data_len = rgb_length; + bool is_alpha_slice = false; + + // If the caller wants us to transcode the mip level's alpha data, then use the next slice. + if ((basis_file_has_alpha_slices) && (transcode_alpha_data_to_opaque_formats)) + { + pData = pCompressed_data + alpha_offset; + data_len = alpha_length; + is_alpha_slice = true; + } + + switch (target_format) + { + case transcoder_texture_format::cTFETC1_RGB: + { + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC1, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cETC1, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ETC1 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBC1_RGB: + { +#if !BASISD_SUPPORT_DXT1 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: BC1/DXT1 unsupported\n"); + return false; +#else + // status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC1, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cBC1, bytes_per_block_or_pixel, true, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC1 failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFBC4_R: + { +#if !BASISD_SUPPORT_DXT5A + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: BC4/DXT5A unsupported\n"); + return false; +#else + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC4, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cBC4, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC4 failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFPVRTC1_4_RGB: + { +#if !BASISD_SUPPORT_PVRTC1 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: PVRTC1 4 unsupported\n"); + return false; +#else + // output_row_pitch_in_blocks_or_pixels is actually ignored because we're transcoding to PVRTC1. (Print a dev warning if it's != 0?) + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC1_4_RGB, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cPVRTC1_4_RGB, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to PVRTC1 4 RGB failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFPVRTC1_4_RGBA: + { +#if !BASISD_SUPPORT_PVRTC1 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: PVRTC1 4 unsupported\n"); + return false; +#else + assert(basis_file_has_alpha_slices); + assert(alpha_length); + + // Temp buffer to hold alpha block endpoint/selector indices + basisu::vector temp_block_indices(total_slice_blocks); + + // First transcode alpha data to temp buffer + //status = transcode_slice(pData, data_size, slice_index + 1, &temp_block_indices[0], total_slice_blocks, block_format::cIndices, sizeof(uint32_t), decode_flags, pSlice_descs[slice_index].m_num_blocks_x, pState); + status = transcode_slice(&temp_block_indices[0], num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cIndices, sizeof(uint32_t), false, is_video, true, level_index, orig_width, orig_height, num_blocks_x, pState, false, nullptr, 0); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to PVRTC1 4 RGBA failed (0)\n"); + } + else + { + // output_row_pitch_in_blocks_or_pixels is actually ignored because we're transcoding to PVRTC1. (Print a dev warning if it's != 0?) + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC1_4_RGBA, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState, &temp_block_indices[0]); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cPVRTC1_4_RGBA, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, &temp_block_indices[0], 0); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to PVRTC1 4 RGBA failed (1)\n"); + } + } + + break; +#endif + } + case transcoder_texture_format::cTFBC7_RGBA: + case transcoder_texture_format::cTFBC7_ALT: + { +#if !BASISD_SUPPORT_BC7_MODE5 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: BC7 unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + // We used to support transcoding just alpha to BC7 - but is that useful at all? + + // First transcode the color slice. The cBC7_M5_COLOR transcoder will output opaque mode 5 blocks. + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC7_M5_COLOR, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cBC7_M5_COLOR, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + + if ((status) && (basis_file_has_alpha_slices)) + { + // Now transcode the alpha slice. The cBC7_M5_ALPHA transcoder will now change the opaque mode 5 blocks to blocks with alpha. + //status = transcode_slice(pData, data_size, slice_index + 1, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC7_M5_ALPHA, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cBC7_M5_ALPHA, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + } + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC7 failed (0)\n"); + } + + break; +#endif + } + case transcoder_texture_format::cTFETC2_RGBA: + { +#if !BASISD_SUPPORT_ETC2_EAC_A8 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: ETC2 EAC A8 unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + + if (basis_file_has_alpha_slices) + { + // First decode the alpha data + //status = transcode_slice(pData, data_size, slice_index + 1, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_A8, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cETC2_EAC_A8, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + } + else + { + //write_opaque_alpha_blocks(pSlice_descs[slice_index].m_num_blocks_x, pSlice_descs[slice_index].m_num_blocks_y, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_A8, 16, output_row_pitch_in_blocks_or_pixels); + basisu_transcoder::write_opaque_alpha_blocks(num_blocks_x, num_blocks_y, pOutput_blocks, block_format::cETC2_EAC_A8, 16, output_row_pitch_in_blocks_or_pixels); + status = true; + } + + if (status) + { + // Now decode the color data + //status = transcode_slice(pData, data_size, slice_index, (uint8_t*)pOutput_blocks + 8, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC1, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice((uint8_t *)pOutput_blocks + 8, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cETC1, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ETC2 RGB failed\n"); + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ETC2 A failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFBC3_RGBA: + { +#if !BASISD_SUPPORT_DXT1 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: DXT1 unsupported\n"); + return false; +#elif !BASISD_SUPPORT_DXT5A + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: DXT5A unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + + // First decode the alpha data + if (basis_file_has_alpha_slices) + { + //status = transcode_slice(pData, data_size, slice_index + 1, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC4, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cBC4, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + } + else + { + basisu_transcoder::write_opaque_alpha_blocks(num_blocks_x, num_blocks_y, pOutput_blocks, block_format::cBC4, 16, output_row_pitch_in_blocks_or_pixels); + status = true; + } + + if (status) + { + // Now decode the color data. Forbid 3 color blocks, which aren't allowed in BC3. + //status = transcode_slice(pData, data_size, slice_index, (uint8_t*)pOutput_blocks + 8, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC1, 16, decode_flags | cDecodeFlagsBC1ForbidThreeColorBlocks, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice((uint8_t *)pOutput_blocks + 8, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cBC1, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC3 RGB failed\n"); + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC3 A failed\n"); + } + + break; +#endif + } + case transcoder_texture_format::cTFBC5_RG: + { +#if !BASISD_SUPPORT_DXT5A + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: DXT5A unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + + //bool transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + // uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, const bool is_video, const bool is_alpha_slice, const uint32_t level_index, const uint32_t orig_width, const uint32_t orig_height, uint32_t output_row_pitch_in_blocks_or_pixels = 0, + // basisu_transcoder_state* pState = nullptr, bool astc_transcode_alpha = false, void* pAlpha_blocks = nullptr, uint32_t output_rows_in_pixels = 0); + + // Decode the R data (actually the green channel of the color data slice in the basis file) + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC4, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cBC4, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (status) + { + if (basis_file_has_alpha_slices) + { + // Decode the G data (actually the green channel of the alpha data slice in the basis file) + //status = transcode_slice(pData, data_size, slice_index + 1, (uint8_t*)pOutput_blocks + 8, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC4, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice((uint8_t *)pOutput_blocks + 8, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cBC4, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC5 1 failed\n"); + } + } + else + { + basisu_transcoder::write_opaque_alpha_blocks(num_blocks_x, num_blocks_y, (uint8_t*)pOutput_blocks + 8, block_format::cBC4, 16, output_row_pitch_in_blocks_or_pixels); + status = true; + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC5 channel 0 failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFASTC_4x4_RGBA: + { +#if !BASISD_SUPPORT_ASTC + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: ASTC unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + + if (basis_file_has_alpha_slices) + { + // First decode the alpha data to the output (we're using the output texture as a temp buffer here). + //status = transcode_slice(pData, data_size, slice_index + 1, (uint8_t*)pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cIndices, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cIndices, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (status) + { + // Now decode the color data and transcode to ASTC. The transcoder function will read the alpha selector data from the output texture as it converts and + // transcode both the alpha and color data at the same time to ASTC. + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cASTC_4x4, 16, decode_flags | cDecodeFlagsOutputHasAlphaIndices, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cASTC_4x4, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, true, nullptr, output_rows_in_pixels); + } + } + else + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cASTC_4x4, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cASTC_4x4, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ASTC failed (0)\n"); + } + + break; +#endif + } + case transcoder_texture_format::cTFATC_RGB: + { +#if !BASISD_SUPPORT_ATC + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: ATC unsupported\n"); + return false; +#else + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cATC_RGB, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cATC_RGB, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ATC_RGB failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFATC_RGBA: + { +#if !BASISD_SUPPORT_ATC + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: ATC unsupported\n"); + return false; +#elif !BASISD_SUPPORT_DXT5A + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: DXT5A unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + + // First decode the alpha data + if (basis_file_has_alpha_slices) + { + //status = transcode_slice(pData, data_size, slice_index + 1, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC4, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cBC4, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + } + else + { + basisu_transcoder::write_opaque_alpha_blocks(num_blocks_x, num_blocks_y, pOutput_blocks, block_format::cBC4, 16, output_row_pitch_in_blocks_or_pixels); + status = true; + } + + if (status) + { + //status = transcode_slice(pData, data_size, slice_index, (uint8_t*)pOutput_blocks + 8, output_blocks_buf_size_in_blocks_or_pixels, block_format::cATC_RGB, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice((uint8_t *)pOutput_blocks + 8, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cATC_RGB, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ATC RGB failed\n"); + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ATC A failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFPVRTC2_4_RGB: + { +#if !BASISD_SUPPORT_PVRTC2 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: PVRTC2 unsupported\n"); + return false; +#else + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC2_4_RGB, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cPVRTC2_4_RGB, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to cPVRTC2_4_RGB failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFPVRTC2_4_RGBA: + { +#if !BASISD_SUPPORT_PVRTC2 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: PVRTC2 unsupported\n"); + return false; +#else + if (basis_file_has_alpha_slices) + { + // First decode the alpha data to the output (we're using the output texture as a temp buffer here). + //status = transcode_slice(pData, data_size, slice_index + 1, (uint8_t*)pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cIndices, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cIndices, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to failed\n"); + } + else + { + // Now decode the color data and transcode to PVRTC2 RGBA. + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC2_4_RGBA, bytes_per_block_or_pixel, decode_flags | cDecodeFlagsOutputHasAlphaIndices, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cPVRTC2_4_RGBA, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, true, nullptr, output_rows_in_pixels); + } + } + else + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC2_4_RGB, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cPVRTC2_4_RGB, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to cPVRTC2_4_RGBA failed\n"); + } + + break; +#endif + } + case transcoder_texture_format::cTFRGBA32: + { + // Raw 32bpp pixels, decoded in the usual raster order (NOT block order) into an image in memory. + + // First decode the alpha data + if (basis_file_has_alpha_slices) + //status = transcode_slice(pData, data_size, slice_index + 1, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cA32, sizeof(uint32_t), decode_flags, output_row_pitch_in_blocks_or_pixels, pState, nullptr, output_rows_in_pixels); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cA32, sizeof(uint32_t), false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + else + status = true; + + if (status) + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, basis_file_has_alpha_slices ? block_format::cRGB32 : block_format::cRGBA32, sizeof(uint32_t), decode_flags, output_row_pitch_in_blocks_or_pixels, pState, nullptr, output_rows_in_pixels); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, basis_file_has_alpha_slices ? block_format::cRGB32 : block_format::cRGBA32, sizeof(uint32_t), false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to RGBA32 RGB failed\n"); + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to RGBA32 A failed\n"); + } + + break; + } + case transcoder_texture_format::cTFRGB565: + case transcoder_texture_format::cTFBGR565: + { + // Raw 16bpp pixels, decoded in the usual raster order (NOT block order) into an image in memory. + + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, (fmt == transcoder_texture_format::cTFRGB565) ? block_format::cRGB565 : block_format::cBGR565, sizeof(uint16_t), decode_flags, output_row_pitch_in_blocks_or_pixels, pState, nullptr, output_rows_in_pixels); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, (target_format == transcoder_texture_format::cTFRGB565) ? block_format::cRGB565 : block_format::cBGR565, sizeof(uint16_t), false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to RGB565 RGB failed\n"); + } + + break; + } + case transcoder_texture_format::cTFRGBA4444: + { + // Raw 16bpp pixels, decoded in the usual raster order (NOT block order) into an image in memory. + + // First decode the alpha data + if (basis_file_has_alpha_slices) + //status = transcode_slice(pData, data_size, slice_index + 1, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cRGBA4444_ALPHA, sizeof(uint16_t), decode_flags, output_row_pitch_in_blocks_or_pixels, pState, nullptr, output_rows_in_pixels); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cRGBA4444_ALPHA, sizeof(uint16_t), false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + else + status = true; + + if (status) + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, basis_file_has_alpha_slices ? block_format::cRGBA4444_COLOR : block_format::cRGBA4444_COLOR_OPAQUE, sizeof(uint16_t), decode_flags, output_row_pitch_in_blocks_or_pixels, pState, nullptr, output_rows_in_pixels); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, basis_file_has_alpha_slices ? block_format::cRGBA4444_COLOR : block_format::cRGBA4444_COLOR_OPAQUE, sizeof(uint16_t), false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to RGBA4444 RGB failed\n"); + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to RGBA4444 A failed\n"); + } + + break; + } + case transcoder_texture_format::cTFFXT1_RGB: + { +#if !BASISD_SUPPORT_FXT1 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: FXT1 unsupported\n"); + return false; +#else + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cFXT1_RGB, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cFXT1_RGB, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to FXT1_RGB failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFETC2_EAC_R11: + { +#if !BASISD_SUPPORT_ETC2_EAC_RG11 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: EAC_RG11 unsupported\n"); + return false; +#else + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_R11, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cETC2_EAC_R11, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ETC2_EAC_R11 failed\n"); + } + + break; +#endif + } + case transcoder_texture_format::cTFETC2_EAC_RG11: + { +#if !BASISD_SUPPORT_ETC2_EAC_RG11 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: EAC_RG11 unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + + if (basis_file_has_alpha_slices) + { + // First decode the alpha data to G + //status = transcode_slice(pData, data_size, slice_index + 1, (uint8_t*)pOutput_blocks + 8, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_R11, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice((uint8_t *)pOutput_blocks + 8, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cETC2_EAC_R11, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + } + else + { + basisu_transcoder::write_opaque_alpha_blocks(num_blocks_x, num_blocks_y, (uint8_t*)pOutput_blocks + 8, block_format::cETC2_EAC_R11, 16, output_row_pitch_in_blocks_or_pixels); + status = true; + } + + if (status) + { + // Now decode the color data to R + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_R11, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cETC2_EAC_R11, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ETC2_EAC_R11 R failed\n"); + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ETC2_EAC_R11 G failed\n"); + } + + break; +#endif + } + default: + { + assert(0); + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: Invalid fmt\n"); + break; + } + } + + return status; + } + + basisu_lowlevel_uastc_transcoder::basisu_lowlevel_uastc_transcoder() + { + } + + bool basisu_lowlevel_uastc_transcoder::transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, bool has_alpha, const uint32_t orig_width, const uint32_t orig_height, uint32_t output_row_pitch_in_blocks_or_pixels, + basisu_transcoder_state* pState, uint32_t output_rows_in_pixels, int channel0, int channel1, uint32_t decode_flags) + { + BASISU_NOTE_UNUSED(pState); + BASISU_NOTE_UNUSED(bc1_allow_threecolor_blocks); + + assert(g_transcoder_initialized); + if (!g_transcoder_initialized) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_slice: Transcoder not globally initialized.\n"); + return false; + } + +#if BASISD_SUPPORT_UASTC + const uint32_t total_blocks = num_blocks_x * num_blocks_y; + + if (!output_row_pitch_in_blocks_or_pixels) + { + if (basis_block_format_is_uncompressed(fmt)) + output_row_pitch_in_blocks_or_pixels = orig_width; + else + { + if (fmt == block_format::cFXT1_RGB) + output_row_pitch_in_blocks_or_pixels = (orig_width + 7) / 8; + else + output_row_pitch_in_blocks_or_pixels = num_blocks_x; + } + } + + if (basis_block_format_is_uncompressed(fmt)) + { + if (!output_rows_in_pixels) + output_rows_in_pixels = orig_height; + } + + uint32_t total_expected_block_bytes = sizeof(uastc_block) * total_blocks; + if (image_data_size < total_expected_block_bytes) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_slice: image_data_size < total_expected_block_bytes The file is corrupted or this is a bug.\n"); + return false; + } + + const uastc_block* pSource_block = reinterpret_cast(pImage_data); + + const bool high_quality = (decode_flags & cDecodeFlagsHighQuality) != 0; + const bool from_alpha = has_alpha && (decode_flags & cDecodeFlagsTranscodeAlphaDataToOpaqueFormats) != 0; + + bool status = false; + if ((fmt == block_format::cPVRTC1_4_RGB) || (fmt == block_format::cPVRTC1_4_RGBA)) + { + if (fmt == block_format::cPVRTC1_4_RGBA) + transcode_uastc_to_pvrtc1_4_rgba((const uastc_block*)pImage_data, pDst_blocks, num_blocks_x, num_blocks_y, high_quality); + else + transcode_uastc_to_pvrtc1_4_rgb((const uastc_block *)pImage_data, pDst_blocks, num_blocks_x, num_blocks_y, high_quality, from_alpha); + } + else + { + for (uint32_t block_y = 0; block_y < num_blocks_y; ++block_y) + { + void* pDst_block = (uint8_t*)pDst_blocks + block_y * output_row_pitch_in_blocks_or_pixels * output_block_or_pixel_stride_in_bytes; + + for (uint32_t block_x = 0; block_x < num_blocks_x; ++block_x, ++pSource_block, pDst_block = (uint8_t *)pDst_block + output_block_or_pixel_stride_in_bytes) + { + switch (fmt) + { + case block_format::cETC1: + { + if (from_alpha) + status = transcode_uastc_to_etc1(*pSource_block, pDst_block, 3); + else + status = transcode_uastc_to_etc1(*pSource_block, pDst_block); + break; + } + case block_format::cETC2_RGBA: + { + status = transcode_uastc_to_etc2_rgba(*pSource_block, pDst_block); + break; + } + case block_format::cBC1: + { + status = transcode_uastc_to_bc1(*pSource_block, pDst_block, high_quality); + break; + } + case block_format::cBC3: + { + status = transcode_uastc_to_bc3(*pSource_block, pDst_block, high_quality); + break; + } + case block_format::cBC4: + { + if (channel0 < 0) + channel0 = 0; + status = transcode_uastc_to_bc4(*pSource_block, pDst_block, high_quality, channel0); + break; + } + case block_format::cBC5: + { + if (channel0 < 0) + channel0 = 0; + if (channel1 < 0) + channel1 = 3; + status = transcode_uastc_to_bc5(*pSource_block, pDst_block, high_quality, channel0, channel1); + break; + } + case block_format::cBC7: + case block_format::cBC7_M5_COLOR: // for consistently with ETC1S + { + status = transcode_uastc_to_bc7(*pSource_block, pDst_block); + break; + } + case block_format::cASTC_4x4: + { + status = transcode_uastc_to_astc(*pSource_block, pDst_block); + break; + } + case block_format::cETC2_EAC_R11: + { + if (channel0 < 0) + channel0 = 0; + status = transcode_uastc_to_etc2_eac_r11(*pSource_block, pDst_block, high_quality, channel0); + break; + } + case block_format::cETC2_EAC_RG11: + { + if (channel0 < 0) + channel0 = 0; + if (channel1 < 0) + channel1 = 3; + status = transcode_uastc_to_etc2_eac_rg11(*pSource_block, pDst_block, high_quality, channel0, channel1); + break; + } + case block_format::cRGBA32: + { + color32 block_pixels[4][4]; + status = unpack_uastc(*pSource_block, (color32 *)block_pixels, false); + + assert(sizeof(uint32_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint32_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + for (uint32_t y = 0; y < max_y; y++) + { + for (uint32_t x = 0; x < max_x; x++) + { + const color32& c = block_pixels[y][x]; + + pDst_pixels[0 + 4 * x] = c.r; + pDst_pixels[1 + 4 * x] = c.g; + pDst_pixels[2 + 4 * x] = c.b; + pDst_pixels[3 + 4 * x] = c.a; + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint32_t); + } + + break; + } + case block_format::cRGB565: + case block_format::cBGR565: + { + color32 block_pixels[4][4]; + status = unpack_uastc(*pSource_block, (color32*)block_pixels, false); + + assert(sizeof(uint16_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint16_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + for (uint32_t y = 0; y < max_y; y++) + { + for (uint32_t x = 0; x < max_x; x++) + { + const color32& c = block_pixels[y][x]; + + const uint16_t packed = (fmt == block_format::cRGB565) ? static_cast((mul_8(c.r, 31) << 11) | (mul_8(c.g, 63) << 5) | mul_8(c.b, 31)) : + static_cast((mul_8(c.b, 31) << 11) | (mul_8(c.g, 63) << 5) | mul_8(c.r, 31)); + + pDst_pixels[x * 2 + 0] = (uint8_t)(packed & 0xFF); + pDst_pixels[x * 2 + 1] = (uint8_t)((packed >> 8) & 0xFF); + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint16_t); + } + + break; + } + case block_format::cRGBA4444: + { + color32 block_pixels[4][4]; + status = unpack_uastc(*pSource_block, (color32*)block_pixels, false); + + assert(sizeof(uint16_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint16_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + for (uint32_t y = 0; y < max_y; y++) + { + for (uint32_t x = 0; x < max_x; x++) + { + const color32& c = block_pixels[y][x]; + + const uint16_t packed = static_cast((mul_8(c.r, 15) << 12) | (mul_8(c.g, 15) << 8) | (mul_8(c.b, 15) << 4) | mul_8(c.a, 15)); + + pDst_pixels[x * 2 + 0] = (uint8_t)(packed & 0xFF); + pDst_pixels[x * 2 + 1] = (uint8_t)((packed >> 8) & 0xFF); + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint16_t); + } + break; + } + default: + assert(0); + break; + + } + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_slice: Transcoder failed to unpack a UASTC block - this is a bug, or the data was corrupted\n"); + return false; + } + + } // block_x + + } // block_y + } + + return true; +#else + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_slice: UASTC is unsupported\n"); + + BASISU_NOTE_UNUSED(decode_flags); + BASISU_NOTE_UNUSED(channel0); + BASISU_NOTE_UNUSED(channel1); + BASISU_NOTE_UNUSED(output_rows_in_pixels); + BASISU_NOTE_UNUSED(output_row_pitch_in_blocks_or_pixels); + BASISU_NOTE_UNUSED(output_block_or_pixel_stride_in_bytes); + BASISU_NOTE_UNUSED(fmt); + BASISU_NOTE_UNUSED(image_data_size); + BASISU_NOTE_UNUSED(pImage_data); + BASISU_NOTE_UNUSED(num_blocks_x); + BASISU_NOTE_UNUSED(num_blocks_y); + BASISU_NOTE_UNUSED(pDst_blocks); + + return false; +#endif + } + + bool basisu_lowlevel_uastc_transcoder::transcode_image( + transcoder_texture_format target_format, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + const uint8_t* pCompressed_data, uint32_t compressed_data_length, + uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, + uint32_t slice_offset, uint32_t slice_length, + uint32_t decode_flags, + bool has_alpha, + bool is_video, + uint32_t output_row_pitch_in_blocks_or_pixels, + basisu_transcoder_state* pState, + uint32_t output_rows_in_pixels, + int channel0, int channel1) + { + BASISU_NOTE_UNUSED(is_video); + BASISU_NOTE_UNUSED(level_index); + + if (((uint64_t)slice_offset + slice_length) > (uint64_t)compressed_data_length) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: source data buffer too small\n"); + return false; + } + + if ((target_format == transcoder_texture_format::cTFPVRTC1_4_RGB) || (target_format == transcoder_texture_format::cTFPVRTC1_4_RGBA)) + { + if ((!basisu::is_pow2(num_blocks_x * 4)) || (!basisu::is_pow2(num_blocks_y * 4))) + { + // PVRTC1 only supports power of 2 dimensions + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: PVRTC1 only supports power of 2 dimensions\n"); + return false; + } + } + + if ((target_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) && (!has_alpha)) + { + // Switch to PVRTC1 RGB if the input doesn't have alpha. + target_format = transcoder_texture_format::cTFPVRTC1_4_RGB; + } + + const bool transcode_alpha_data_to_opaque_formats = (decode_flags & cDecodeFlagsTranscodeAlphaDataToOpaqueFormats) != 0; + const uint32_t bytes_per_block_or_pixel = basis_get_bytes_per_block_or_pixel(target_format); + const uint32_t total_slice_blocks = num_blocks_x * num_blocks_y; + + if (!basis_validate_output_buffer_size(target_format, output_blocks_buf_size_in_blocks_or_pixels, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, output_rows_in_pixels, total_slice_blocks)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: output buffer size too small\n"); + return false; + } + + bool status = false; + + // UASTC4x4 + switch (target_format) + { + case transcoder_texture_format::cTFETC1_RGB: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC1, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cETC1, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, channel0, channel1); + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to ETC1 failed\n"); + } + break; + } + case transcoder_texture_format::cTFETC2_RGBA: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_RGBA, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cETC2_RGBA, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, channel0, channel1); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to ETC2 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBC1_RGB: + { + // TODO: ETC1S allows BC1 from alpha channel. That doesn't seem actually useful, though. + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC1, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cBC1, + bytes_per_block_or_pixel, true, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, channel0, channel1); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to BC1 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBC3_RGBA: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC3, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cBC3, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, channel0, channel1); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to BC3 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBC4_R: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC4, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState, + // nullptr, 0, + // ((has_alpha) && (transcode_alpha_data_to_opaque_formats)) ? 3 : 0); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cBC4, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, + ((has_alpha) && (transcode_alpha_data_to_opaque_formats)) ? 3 : 0); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to BC4 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBC5_RG: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC5, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState, + // nullptr, 0, + // 0, 3); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cBC5, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, + 0, 3); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to BC5 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBC7_RGBA: + case transcoder_texture_format::cTFBC7_ALT: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC7, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cBC7, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to BC7 failed\n"); + } + break; + } + case transcoder_texture_format::cTFPVRTC1_4_RGB: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC1_4_RGB, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cPVRTC1_4_RGB, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to PVRTC1 RGB 4bpp failed\n"); + } + break; + } + case transcoder_texture_format::cTFPVRTC1_4_RGBA: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC1_4_RGBA, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cPVRTC1_4_RGBA, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to PVRTC1 RGBA 4bpp failed\n"); + } + break; + } + case transcoder_texture_format::cTFASTC_4x4_RGBA: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cASTC_4x4, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cASTC_4x4, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to ASTC 4x4 failed\n"); + } + break; + } + case transcoder_texture_format::cTFATC_RGB: + case transcoder_texture_format::cTFATC_RGBA: + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: UASTC->ATC currently unsupported\n"); + return false; + } + case transcoder_texture_format::cTFFXT1_RGB: + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: UASTC->FXT1 currently unsupported\n"); + return false; + } + case transcoder_texture_format::cTFPVRTC2_4_RGB: + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: UASTC->PVRTC2 currently unsupported\n"); + return false; + } + case transcoder_texture_format::cTFPVRTC2_4_RGBA: + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: UASTC->PVRTC2 currently unsupported\n"); + return false; + } + case transcoder_texture_format::cTFETC2_EAC_R11: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_R11, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState, + // nullptr, 0, + // ((has_alpha) && (transcode_alpha_data_to_opaque_formats)) ? 3 : 0); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cETC2_EAC_R11, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, + ((has_alpha) && (transcode_alpha_data_to_opaque_formats)) ? 3 : 0); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to EAC R11 failed\n"); + } + break; + } + case transcoder_texture_format::cTFETC2_EAC_RG11: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_RG11, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState, + // nullptr, 0, + // 0, 3); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cETC2_EAC_RG11, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, + 0, 3); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_basisu_lowlevel_uastc_transcodertranscoder::transcode_image: transcode_slice() to EAC RG11 failed\n"); + } + break; + } + case transcoder_texture_format::cTFRGBA32: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cRGBA32, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cRGBA32, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to RGBA32 failed\n"); + } + break; + } + case transcoder_texture_format::cTFRGB565: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cRGB565, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cRGB565, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to RGB565 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBGR565: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBGR565, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cBGR565, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to RGB565 failed\n"); + } + break; + } + case transcoder_texture_format::cTFRGBA4444: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cRGBA4444, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cRGBA4444, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to RGBA4444 failed\n"); + } + break; + } + default: + { + assert(0); + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: Invalid format\n"); + break; + } + } + + return status; + } + + basisu_transcoder::basisu_transcoder() : + m_ready_to_transcode(false) + { + } + + bool basisu_transcoder::validate_file_checksums(const void* pData, uint32_t data_size, bool full_validation) const + { + if (!validate_header(pData, data_size)) + return false; + + const basis_file_header* pHeader = reinterpret_cast(pData); + +#if !BASISU_NO_HEADER_OR_DATA_CRC16_CHECKS + if (crc16(&pHeader->m_data_size, sizeof(basis_file_header) - BASISU_OFFSETOF(basis_file_header, m_data_size), 0) != pHeader->m_header_crc16) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: header CRC check failed\n"); + return false; + } + + if (full_validation) + { + if (crc16(reinterpret_cast(pData) + sizeof(basis_file_header), pHeader->m_data_size, 0) != pHeader->m_data_crc16) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: data CRC check failed\n"); + return false; + } + } +#endif + + return true; + } + + bool basisu_transcoder::validate_header_quick(const void* pData, uint32_t data_size) const + { + if (data_size <= sizeof(basis_file_header)) + return false; + + const basis_file_header* pHeader = reinterpret_cast(pData); + + if ((pHeader->m_sig != basis_file_header::cBASISSigValue) || (pHeader->m_ver != BASISD_SUPPORTED_BASIS_VERSION) || (pHeader->m_header_size != sizeof(basis_file_header))) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: header has an invalid signature, or file version is unsupported\n"); + return false; + } + + uint32_t expected_file_size = sizeof(basis_file_header) + pHeader->m_data_size; + if (data_size < expected_file_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: source buffer is too small\n"); + return false; + } + + if ((!pHeader->m_total_slices) || (!pHeader->m_total_images)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::validate_header_quick: header is invalid\n"); + return false; + } + + if ((pHeader->m_slice_desc_file_ofs >= data_size) || + ((data_size - pHeader->m_slice_desc_file_ofs) < (sizeof(basis_slice_desc) * pHeader->m_total_slices)) + ) + { + BASISU_DEVEL_ERROR("basisu_transcoder::validate_header_quick: passed in buffer is too small or data is corrupted\n"); + return false; + } + + return true; + } + + bool basisu_transcoder::validate_header(const void* pData, uint32_t data_size) const + { + if (data_size <= sizeof(basis_file_header)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: input source buffer is too small\n"); + return false; + } + + const basis_file_header* pHeader = reinterpret_cast(pData); + + if ((pHeader->m_sig != basis_file_header::cBASISSigValue) || (pHeader->m_ver != BASISD_SUPPORTED_BASIS_VERSION) || (pHeader->m_header_size != sizeof(basis_file_header))) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: header has an invalid signature, or file version is unsupported\n"); + return false; + } + + uint32_t expected_file_size = sizeof(basis_file_header) + pHeader->m_data_size; + if (data_size < expected_file_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: input source buffer is too small, or header is corrupted\n"); + return false; + } + + if ((!pHeader->m_total_images) || (!pHeader->m_total_slices)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: invalid basis file (total images or slices are 0)\n"); + return false; + } + + if (pHeader->m_total_images > pHeader->m_total_slices) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: invalid basis file (too many images)\n"); + return false; + } + + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + { + if (pHeader->m_flags & cBASISHeaderFlagHasAlphaSlices) + { + if (pHeader->m_total_slices & 1) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: invalid alpha .basis file\n"); + return false; + } + } + + // This flag dates back to pre-Basis Universal, when .basis supported full ETC1 too. + if ((pHeader->m_flags & cBASISHeaderFlagETC1S) == 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: Invalid .basis file (ETC1S check)\n"); + return false; + } + } + else + { + if ((pHeader->m_flags & cBASISHeaderFlagETC1S) != 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: Invalid .basis file (ETC1S check)\n"); + return false; + } + } + + if ((pHeader->m_slice_desc_file_ofs >= data_size) || + ((data_size - pHeader->m_slice_desc_file_ofs) < (sizeof(basis_slice_desc) * pHeader->m_total_slices)) + ) + { + BASISU_DEVEL_ERROR("basisu_transcoder::validate_header_quick: passed in buffer is too small or data is corrupted\n"); + return false; + } + + return true; + } + + basis_texture_type basisu_transcoder::get_texture_type(const void* pData, uint32_t data_size) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_texture_type: header validation failed\n"); + return cBASISTexType2DArray; + } + + const basis_file_header* pHeader = static_cast(pData); + + basis_texture_type btt = static_cast(static_cast(pHeader->m_tex_type)); + + if (btt >= cBASISTexTypeTotal) + { + BASISU_DEVEL_ERROR("basisu_transcoder::validate_header_quick: header's texture type field is invalid\n"); + return cBASISTexType2DArray; + } + + return btt; + } + + bool basisu_transcoder::get_userdata(const void* pData, uint32_t data_size, uint32_t& userdata0, uint32_t& userdata1) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_userdata: header validation failed\n"); + return false; + } + + const basis_file_header* pHeader = static_cast(pData); + + userdata0 = pHeader->m_userdata0; + userdata1 = pHeader->m_userdata1; + return true; + } + + uint32_t basisu_transcoder::get_total_images(const void* pData, uint32_t data_size) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: header validation failed\n"); + return 0; + } + + const basis_file_header* pHeader = static_cast(pData); + + return pHeader->m_total_images; + } + + basis_tex_format basisu_transcoder::get_tex_format(const void* pData, uint32_t data_size) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: header validation failed\n"); + return basis_tex_format::cETC1S; + } + + const basis_file_header* pHeader = static_cast(pData); + + return (basis_tex_format)(uint32_t)pHeader->m_tex_format; + } + + bool basisu_transcoder::get_image_info(const void* pData, uint32_t data_size, basisu_image_info& image_info, uint32_t image_index) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_info: header validation failed\n"); + return false; + } + + int slice_index = find_first_slice_index(pData, data_size, image_index, 0); + if (slice_index < 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_info: invalid slice index\n"); + return false; + } + + const basis_file_header* pHeader = static_cast(pData); + + if (image_index >= pHeader->m_total_images) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_info: invalid image_index\n"); + return false; + } + + const basis_slice_desc* pSlice_descs = reinterpret_cast(static_cast(pData) + pHeader->m_slice_desc_file_ofs); + + uint32_t total_levels = 1; + for (uint32_t i = slice_index + 1; i < pHeader->m_total_slices; i++) + if (pSlice_descs[i].m_image_index == image_index) + total_levels = basisu::maximum(total_levels, pSlice_descs[i].m_level_index + 1); + else + break; + + if (total_levels > 16) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_info: invalid image_index\n"); + return false; + } + + const basis_slice_desc& slice_desc = pSlice_descs[slice_index]; + + image_info.m_image_index = image_index; + image_info.m_total_levels = total_levels; + + image_info.m_alpha_flag = false; + + // For ETC1S, if anything has alpha all images have alpha. For UASTC, we only report alpha when the image actually has alpha. + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + image_info.m_alpha_flag = (pHeader->m_flags & cBASISHeaderFlagHasAlphaSlices) != 0; + else + image_info.m_alpha_flag = (slice_desc.m_flags & cSliceDescFlagsHasAlpha) != 0; + + image_info.m_iframe_flag = (slice_desc.m_flags & cSliceDescFlagsFrameIsIFrame) != 0; + + image_info.m_width = slice_desc.m_num_blocks_x * 4; + image_info.m_height = slice_desc.m_num_blocks_y * 4; + image_info.m_orig_width = slice_desc.m_orig_width; + image_info.m_orig_height = slice_desc.m_orig_height; + image_info.m_num_blocks_x = slice_desc.m_num_blocks_x; + image_info.m_num_blocks_y = slice_desc.m_num_blocks_y; + image_info.m_total_blocks = image_info.m_num_blocks_x * image_info.m_num_blocks_y; + image_info.m_first_slice_index = slice_index; + + return true; + } + + uint32_t basisu_transcoder::get_total_image_levels(const void* pData, uint32_t data_size, uint32_t image_index) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_image_levels: header validation failed\n"); + return false; + } + + int slice_index = find_first_slice_index(pData, data_size, image_index, 0); + if (slice_index < 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_image_levels: failed finding slice\n"); + return false; + } + + const basis_file_header* pHeader = static_cast(pData); + + if (image_index >= pHeader->m_total_images) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_image_levels: invalid image_index\n"); + return false; + } + + const basis_slice_desc* pSlice_descs = reinterpret_cast(static_cast(pData) + pHeader->m_slice_desc_file_ofs); + + uint32_t total_levels = 1; + for (uint32_t i = slice_index + 1; i < pHeader->m_total_slices; i++) + if (pSlice_descs[i].m_image_index == image_index) + total_levels = basisu::maximum(total_levels, pSlice_descs[i].m_level_index + 1); + else + break; + + const uint32_t cMaxSupportedLevels = 16; + if (total_levels > cMaxSupportedLevels) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_image_levels: invalid image levels!\n"); + return false; + } + + return total_levels; + } + + bool basisu_transcoder::get_image_level_desc(const void* pData, uint32_t data_size, uint32_t image_index, uint32_t level_index, uint32_t& orig_width, uint32_t& orig_height, uint32_t& total_blocks) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_level_desc: header validation failed\n"); + return false; + } + + int slice_index = find_first_slice_index(pData, data_size, image_index, level_index); + if (slice_index < 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_level_desc: failed finding slice\n"); + return false; + } + + const basis_file_header* pHeader = static_cast(pData); + + if (image_index >= pHeader->m_total_images) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_level_desc: invalid image_index\n"); + return false; + } + + const basis_slice_desc* pSlice_descs = reinterpret_cast(static_cast(pData) + pHeader->m_slice_desc_file_ofs); + + const basis_slice_desc& slice_desc = pSlice_descs[slice_index]; + + orig_width = slice_desc.m_orig_width; + orig_height = slice_desc.m_orig_height; + total_blocks = slice_desc.m_num_blocks_x * slice_desc.m_num_blocks_y; + + return true; + } + + bool basisu_transcoder::get_image_level_info(const void* pData, uint32_t data_size, basisu_image_level_info& image_info, uint32_t image_index, uint32_t level_index) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_level_info: validate_file_checksums failed\n"); + return false; + } + + int slice_index = find_first_slice_index(pData, data_size, image_index, level_index); + if (slice_index < 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_level_info: failed finding slice\n"); + return false; + } + + const basis_file_header* pHeader = static_cast(pData); + + if (image_index >= pHeader->m_total_images) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_level_info: invalid image_index\n"); + return false; + } + + const basis_slice_desc* pSlice_descs = reinterpret_cast(static_cast(pData) + pHeader->m_slice_desc_file_ofs); + + const basis_slice_desc& slice_desc = pSlice_descs[slice_index]; + + image_info.m_image_index = image_index; + image_info.m_level_index = level_index; + + // For ETC1S, if anything has alpha all images have alpha. For UASTC, we only report alpha when the image actually has alpha. + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + image_info.m_alpha_flag = (pHeader->m_flags & cBASISHeaderFlagHasAlphaSlices) != 0; + else + image_info.m_alpha_flag = (slice_desc.m_flags & cSliceDescFlagsHasAlpha) != 0; + + image_info.m_iframe_flag = (slice_desc.m_flags & cSliceDescFlagsFrameIsIFrame) != 0; + image_info.m_width = slice_desc.m_num_blocks_x * 4; + image_info.m_height = slice_desc.m_num_blocks_y * 4; + image_info.m_orig_width = slice_desc.m_orig_width; + image_info.m_orig_height = slice_desc.m_orig_height; + image_info.m_num_blocks_x = slice_desc.m_num_blocks_x; + image_info.m_num_blocks_y = slice_desc.m_num_blocks_y; + image_info.m_total_blocks = image_info.m_num_blocks_x * image_info.m_num_blocks_y; + image_info.m_first_slice_index = slice_index; + + image_info.m_rgb_file_ofs = slice_desc.m_file_ofs; + image_info.m_rgb_file_len = slice_desc.m_file_size; + image_info.m_alpha_file_ofs = 0; + image_info.m_alpha_file_len = 0; + + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + { + if (pHeader->m_flags & cBASISHeaderFlagHasAlphaSlices) + { + assert((slice_index + 1) < (int)pHeader->m_total_slices); + image_info.m_alpha_file_ofs = pSlice_descs[slice_index + 1].m_file_ofs; + image_info.m_alpha_file_len = pSlice_descs[slice_index + 1].m_file_size; + } + } + + return true; + } + + bool basisu_transcoder::get_file_info(const void* pData, uint32_t data_size, basisu_file_info& file_info) const + { + if (!validate_file_checksums(pData, data_size, false)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_file_info: validate_file_checksums failed\n"); + return false; + } + + const basis_file_header* pHeader = static_cast(pData); + const basis_slice_desc* pSlice_descs = reinterpret_cast(static_cast(pData) + pHeader->m_slice_desc_file_ofs); + + file_info.m_version = pHeader->m_ver; + + file_info.m_total_header_size = sizeof(basis_file_header) + pHeader->m_total_slices * sizeof(basis_slice_desc); + + file_info.m_total_selectors = pHeader->m_total_selectors; + file_info.m_selector_codebook_ofs = pHeader->m_selector_cb_file_ofs; + file_info.m_selector_codebook_size = pHeader->m_selector_cb_file_size; + + file_info.m_total_endpoints = pHeader->m_total_endpoints; + file_info.m_endpoint_codebook_ofs = pHeader->m_endpoint_cb_file_ofs; + file_info.m_endpoint_codebook_size = pHeader->m_endpoint_cb_file_size; + + file_info.m_tables_ofs = pHeader->m_tables_file_ofs; + file_info.m_tables_size = pHeader->m_tables_file_size; + + file_info.m_tex_format = static_cast(static_cast(pHeader->m_tex_format)); + + file_info.m_etc1s = (pHeader->m_tex_format == (int)basis_tex_format::cETC1S); + + file_info.m_y_flipped = (pHeader->m_flags & cBASISHeaderFlagYFlipped) != 0; + file_info.m_has_alpha_slices = (pHeader->m_flags & cBASISHeaderFlagHasAlphaSlices) != 0; + + const uint32_t total_slices = pHeader->m_total_slices; + + file_info.m_slice_info.resize(total_slices); + + file_info.m_slices_size = 0; + + file_info.m_tex_type = static_cast(static_cast(pHeader->m_tex_type)); + + if (file_info.m_tex_type > cBASISTexTypeTotal) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_file_info: invalid texture type, file is corrupted\n"); + return false; + } + + file_info.m_us_per_frame = pHeader->m_us_per_frame; + file_info.m_userdata0 = pHeader->m_userdata0; + file_info.m_userdata1 = pHeader->m_userdata1; + + file_info.m_image_mipmap_levels.resize(0); + file_info.m_image_mipmap_levels.resize(pHeader->m_total_images); + + file_info.m_total_images = pHeader->m_total_images; + + for (uint32_t i = 0; i < total_slices; i++) + { + file_info.m_slices_size += pSlice_descs[i].m_file_size; + + basisu_slice_info& slice_info = file_info.m_slice_info[i]; + + slice_info.m_orig_width = pSlice_descs[i].m_orig_width; + slice_info.m_orig_height = pSlice_descs[i].m_orig_height; + slice_info.m_width = pSlice_descs[i].m_num_blocks_x * 4; + slice_info.m_height = pSlice_descs[i].m_num_blocks_y * 4; + slice_info.m_num_blocks_x = pSlice_descs[i].m_num_blocks_x; + slice_info.m_num_blocks_y = pSlice_descs[i].m_num_blocks_y; + slice_info.m_total_blocks = slice_info.m_num_blocks_x * slice_info.m_num_blocks_y; + slice_info.m_compressed_size = pSlice_descs[i].m_file_size; + slice_info.m_slice_index = i; + slice_info.m_image_index = pSlice_descs[i].m_image_index; + slice_info.m_level_index = pSlice_descs[i].m_level_index; + slice_info.m_unpacked_slice_crc16 = pSlice_descs[i].m_slice_data_crc16; + slice_info.m_alpha_flag = (pSlice_descs[i].m_flags & cSliceDescFlagsHasAlpha) != 0; + slice_info.m_iframe_flag = (pSlice_descs[i].m_flags & cSliceDescFlagsFrameIsIFrame) != 0; + + if (pSlice_descs[i].m_image_index >= pHeader->m_total_images) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_file_info: slice desc's image index is invalid\n"); + return false; + } + + file_info.m_image_mipmap_levels[pSlice_descs[i].m_image_index] = basisu::maximum(file_info.m_image_mipmap_levels[pSlice_descs[i].m_image_index], pSlice_descs[i].m_level_index + 1); + + if (file_info.m_image_mipmap_levels[pSlice_descs[i].m_image_index] > 16) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_file_info: slice mipmap level is invalid\n"); + return false; + } + } + + return true; + } + + bool basisu_transcoder::start_transcoding(const void* pData, uint32_t data_size) + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: header validation failed\n"); + return false; + } + + const basis_file_header* pHeader = reinterpret_cast(pData); + const uint8_t* pDataU8 = static_cast(pData); + + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + { + if (m_lowlevel_etc1s_decoder.m_local_endpoints.size()) + { + m_lowlevel_etc1s_decoder.clear(); + } + + if (pHeader->m_flags & cBASISHeaderFlagUsesGlobalCodebook) + { + if (!m_lowlevel_etc1s_decoder.get_global_codebooks()) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: File uses global codebooks, but set_global_codebooks() has not been called\n"); + return false; + } + if (!m_lowlevel_etc1s_decoder.get_global_codebooks()->get_endpoints().size()) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: Global codebooks must be unpacked first by calling start_transcoding()\n"); + return false; + } + if ((m_lowlevel_etc1s_decoder.get_global_codebooks()->get_endpoints().size() != pHeader->m_total_endpoints) || + (m_lowlevel_etc1s_decoder.get_global_codebooks()->get_selectors().size() != pHeader->m_total_selectors)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: Global codebook size mismatch (wrong codebooks for file).\n"); + return false; + } + if (!pHeader->m_tables_file_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted (2)\n"); + return false; + } + if (pHeader->m_tables_file_ofs > data_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted or passed in buffer too small (4)\n"); + return false; + } + if (pHeader->m_tables_file_size > (data_size - pHeader->m_tables_file_ofs)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted or passed in buffer too small (5)\n"); + return false; + } + } + else + { + if (!pHeader->m_endpoint_cb_file_size || !pHeader->m_selector_cb_file_size || !pHeader->m_tables_file_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted (0)\n"); + return false; + } + + if ((pHeader->m_endpoint_cb_file_ofs > data_size) || (pHeader->m_selector_cb_file_ofs > data_size) || (pHeader->m_tables_file_ofs > data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted or passed in buffer too small (1)\n"); + return false; + } + + if (pHeader->m_endpoint_cb_file_size > (data_size - pHeader->m_endpoint_cb_file_ofs)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted or passed in buffer too small (2)\n"); + return false; + } + + if (pHeader->m_selector_cb_file_size > (data_size - pHeader->m_selector_cb_file_ofs)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted or passed in buffer too small (3)\n"); + return false; + } + + if (pHeader->m_tables_file_size > (data_size - pHeader->m_tables_file_ofs)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted or passed in buffer too small (3)\n"); + return false; + } + + if (!m_lowlevel_etc1s_decoder.decode_palettes( + pHeader->m_total_endpoints, pDataU8 + pHeader->m_endpoint_cb_file_ofs, pHeader->m_endpoint_cb_file_size, + pHeader->m_total_selectors, pDataU8 + pHeader->m_selector_cb_file_ofs, pHeader->m_selector_cb_file_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: decode_palettes failed\n"); + return false; + } + } + + if (!m_lowlevel_etc1s_decoder.decode_tables(pDataU8 + pHeader->m_tables_file_ofs, pHeader->m_tables_file_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: decode_tables failed\n"); + return false; + } + } + else + { + // Nothing special to do for UASTC. + if (m_lowlevel_etc1s_decoder.m_local_endpoints.size()) + { + m_lowlevel_etc1s_decoder.clear(); + } + } + + m_ready_to_transcode = true; + + return true; + } + + bool basisu_transcoder::stop_transcoding() + { + m_lowlevel_etc1s_decoder.clear(); + + m_ready_to_transcode = false; + + return true; + } + + bool basisu_transcoder::transcode_slice(const void* pData, uint32_t data_size, uint32_t slice_index, void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, uint32_t decode_flags, uint32_t output_row_pitch_in_blocks_or_pixels, basisu_transcoder_state* pState, void *pAlpha_blocks, uint32_t output_rows_in_pixels, int channel0, int channel1) const + { + if (!m_ready_to_transcode) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: must call start_transcoding first\n"); + return false; + } + + if (decode_flags & cDecodeFlagsPVRTCDecodeToNextPow2) + { + // TODO: Not yet supported + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: cDecodeFlagsPVRTCDecodeToNextPow2 currently unsupported\n"); + return false; + } + + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: header validation failed\n"); + return false; + } + + const basis_file_header* pHeader = reinterpret_cast(pData); + + const uint8_t* pDataU8 = static_cast(pData); + + if (slice_index >= pHeader->m_total_slices) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: slice_index >= pHeader->m_total_slices\n"); + return false; + } + + const basis_slice_desc& slice_desc = reinterpret_cast(pDataU8 + pHeader->m_slice_desc_file_ofs)[slice_index]; + + uint32_t total_4x4_blocks = slice_desc.m_num_blocks_x * slice_desc.m_num_blocks_y; + + if (basis_block_format_is_uncompressed(fmt)) + { + // Assume the output buffer is orig_width by orig_height + if (!output_row_pitch_in_blocks_or_pixels) + output_row_pitch_in_blocks_or_pixels = slice_desc.m_orig_width; + + if (!output_rows_in_pixels) + output_rows_in_pixels = slice_desc.m_orig_height; + + // Now make sure the output buffer is large enough, or we'll overwrite memory. + if (output_blocks_buf_size_in_blocks_or_pixels < (output_rows_in_pixels * output_row_pitch_in_blocks_or_pixels)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: output_blocks_buf_size_in_blocks_or_pixels < (output_rows_in_pixels * output_row_pitch_in_blocks_or_pixels)\n"); + return false; + } + } + else if (fmt == block_format::cFXT1_RGB) + { + const uint32_t num_blocks_fxt1_x = (slice_desc.m_orig_width + 7) / 8; + const uint32_t num_blocks_fxt1_y = (slice_desc.m_orig_height + 3) / 4; + const uint32_t total_blocks_fxt1 = num_blocks_fxt1_x * num_blocks_fxt1_y; + + if (output_blocks_buf_size_in_blocks_or_pixels < total_blocks_fxt1) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: output_blocks_buf_size_in_blocks_or_pixels < total_blocks_fxt1\n"); + return false; + } + } + else + { + if (output_blocks_buf_size_in_blocks_or_pixels < total_4x4_blocks) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: output_blocks_buf_size_in_blocks_or_pixels < total_blocks\n"); + return false; + } + } + + if (fmt != block_format::cETC1) + { + if ((fmt == block_format::cPVRTC1_4_RGB) || (fmt == block_format::cPVRTC1_4_RGBA)) + { + if ((!basisu::is_pow2(slice_desc.m_num_blocks_x * 4)) || (!basisu::is_pow2(slice_desc.m_num_blocks_y * 4))) + { + // PVRTC1 only supports power of 2 dimensions + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: PVRTC1 only supports power of 2 dimensions\n"); + return false; + } + } + } + + if (slice_desc.m_file_ofs > data_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: invalid slice_desc.m_file_ofs, or passed in buffer too small\n"); + return false; + } + + const uint32_t data_size_left = data_size - slice_desc.m_file_ofs; + if (data_size_left < slice_desc.m_file_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: invalid slice_desc.m_file_size, or passed in buffer too small\n"); + return false; + } + + if (pHeader->m_tex_format == (int)basis_tex_format::cUASTC4x4) + { + return m_lowlevel_uastc_decoder.transcode_slice(pOutput_blocks, slice_desc.m_num_blocks_x, slice_desc.m_num_blocks_y, + pDataU8 + slice_desc.m_file_ofs, slice_desc.m_file_size, + fmt, output_block_or_pixel_stride_in_bytes, (decode_flags & cDecodeFlagsBC1ForbidThreeColorBlocks) == 0, *pHeader, slice_desc, output_row_pitch_in_blocks_or_pixels, pState, + output_rows_in_pixels, channel0, channel1, decode_flags); + } + else + { + return m_lowlevel_etc1s_decoder.transcode_slice(pOutput_blocks, slice_desc.m_num_blocks_x, slice_desc.m_num_blocks_y, + pDataU8 + slice_desc.m_file_ofs, slice_desc.m_file_size, + fmt, output_block_or_pixel_stride_in_bytes, (decode_flags & cDecodeFlagsBC1ForbidThreeColorBlocks) == 0, *pHeader, slice_desc, output_row_pitch_in_blocks_or_pixels, pState, + (decode_flags & cDecodeFlagsOutputHasAlphaIndices) != 0, pAlpha_blocks, output_rows_in_pixels); + } + } + + int basisu_transcoder::find_first_slice_index(const void* pData, uint32_t data_size, uint32_t image_index, uint32_t level_index) const + { + BASISU_NOTE_UNUSED(data_size); + + const basis_file_header* pHeader = reinterpret_cast(pData); + const uint8_t* pDataU8 = static_cast(pData); + + // For very large basis files this search could be painful + // TODO: Binary search this + for (uint32_t slice_iter = 0; slice_iter < pHeader->m_total_slices; slice_iter++) + { + const basis_slice_desc& slice_desc = reinterpret_cast(pDataU8 + pHeader->m_slice_desc_file_ofs)[slice_iter]; + if ((slice_desc.m_image_index == image_index) && (slice_desc.m_level_index == level_index)) + return slice_iter; + } + + BASISU_DEVEL_ERROR("basisu_transcoder::find_first_slice_index: didn't find slice\n"); + + return -1; + } + + int basisu_transcoder::find_slice(const void* pData, uint32_t data_size, uint32_t image_index, uint32_t level_index, bool alpha_data) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::find_slice: header validation failed\n"); + return false; + } + + const basis_file_header* pHeader = reinterpret_cast(pData); + const uint8_t* pDataU8 = static_cast(pData); + const basis_slice_desc* pSlice_descs = reinterpret_cast(pDataU8 + pHeader->m_slice_desc_file_ofs); + + // For very large basis files this search could be painful + // TODO: Binary search this + for (uint32_t slice_iter = 0; slice_iter < pHeader->m_total_slices; slice_iter++) + { + const basis_slice_desc& slice_desc = pSlice_descs[slice_iter]; + if ((slice_desc.m_image_index == image_index) && (slice_desc.m_level_index == level_index)) + { + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + { + const bool slice_alpha = (slice_desc.m_flags & cSliceDescFlagsHasAlpha) != 0; + if (slice_alpha == alpha_data) + return slice_iter; + } + else + { + return slice_iter; + } + } + } + + BASISU_DEVEL_ERROR("basisu_transcoder::find_slice: didn't find slice\n"); + + return -1; + } + + void basisu_transcoder::write_opaque_alpha_blocks( + uint32_t num_blocks_x, uint32_t num_blocks_y, + void* pOutput_blocks, block_format fmt, + uint32_t block_stride_in_bytes, uint32_t output_row_pitch_in_blocks_or_pixels) + { + // 'num_blocks_y', 'pOutput_blocks' & 'block_stride_in_bytes' unused + // when disabling BASISD_SUPPORT_ETC2_EAC_A8 *and* BASISD_SUPPORT_DXT5A + BASISU_NOTE_UNUSED(num_blocks_y); + BASISU_NOTE_UNUSED(pOutput_blocks); + BASISU_NOTE_UNUSED(block_stride_in_bytes); + + if (!output_row_pitch_in_blocks_or_pixels) + output_row_pitch_in_blocks_or_pixels = num_blocks_x; + + if ((fmt == block_format::cETC2_EAC_A8) || (fmt == block_format::cETC2_EAC_R11)) + { +#if BASISD_SUPPORT_ETC2_EAC_A8 + eac_block blk; + blk.m_base = 255; + blk.m_multiplier = 1; + blk.m_table = 13; + + // Selectors are all 4's + memcpy(&blk.m_selectors, g_etc2_eac_a8_sel4, sizeof(g_etc2_eac_a8_sel4)); + + for (uint32_t y = 0; y < num_blocks_y; y++) + { + uint32_t dst_ofs = y * output_row_pitch_in_blocks_or_pixels * block_stride_in_bytes; + for (uint32_t x = 0; x < num_blocks_x; x++) + { + memcpy((uint8_t*)pOutput_blocks + dst_ofs, &blk, sizeof(blk)); + dst_ofs += block_stride_in_bytes; + } + } +#endif + } + else if (fmt == block_format::cBC4) + { +#if BASISD_SUPPORT_DXT5A + dxt5a_block blk; + blk.m_endpoints[0] = 255; + blk.m_endpoints[1] = 255; + memset(blk.m_selectors, 0, sizeof(blk.m_selectors)); + + for (uint32_t y = 0; y < num_blocks_y; y++) + { + uint32_t dst_ofs = y * output_row_pitch_in_blocks_or_pixels * block_stride_in_bytes; + for (uint32_t x = 0; x < num_blocks_x; x++) + { + memcpy((uint8_t*)pOutput_blocks + dst_ofs, &blk, sizeof(blk)); + dst_ofs += block_stride_in_bytes; + } + } +#endif + } + } + + bool basisu_transcoder::transcode_image_level( + const void* pData, uint32_t data_size, + uint32_t image_index, uint32_t level_index, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + transcoder_texture_format fmt, + uint32_t decode_flags, uint32_t output_row_pitch_in_blocks_or_pixels, basisu_transcoder_state *pState, uint32_t output_rows_in_pixels) const + { + const uint32_t bytes_per_block_or_pixel = basis_get_bytes_per_block_or_pixel(fmt); + + if (!m_ready_to_transcode) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: must call start_transcoding() first\n"); + return false; + } + + //const bool transcode_alpha_data_to_opaque_formats = (decode_flags & cDecodeFlagsTranscodeAlphaDataToOpaqueFormats) != 0; + + if (decode_flags & cDecodeFlagsPVRTCDecodeToNextPow2) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: cDecodeFlagsPVRTCDecodeToNextPow2 currently unsupported\n"); + // TODO: Not yet supported + return false; + } + + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: header validation failed\n"); + return false; + } + + const basis_file_header* pHeader = reinterpret_cast(pData); + + const uint8_t* pDataU8 = static_cast(pData); + + const basis_slice_desc* pSlice_descs = reinterpret_cast(pDataU8 + pHeader->m_slice_desc_file_ofs); + + const bool basis_file_has_alpha_slices = (pHeader->m_flags & cBASISHeaderFlagHasAlphaSlices) != 0; + + int slice_index = find_first_slice_index(pData, data_size, image_index, level_index); + if (slice_index < 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: failed finding slice index\n"); + // Unable to find the requested image/level + return false; + } + + if ((fmt == transcoder_texture_format::cTFPVRTC1_4_RGBA) && (!basis_file_has_alpha_slices)) + { + // Switch to PVRTC1 RGB if the input doesn't have alpha. + fmt = transcoder_texture_format::cTFPVRTC1_4_RGB; + } + + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + { + if (pSlice_descs[slice_index].m_flags & cSliceDescFlagsHasAlpha) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: alpha basis file has out of order alpha slice\n"); + + // The first slice shouldn't have alpha data in a properly formed basis file + return false; + } + + if (basis_file_has_alpha_slices) + { + // The alpha data should immediately follow the color data, and have the same resolution. + if ((slice_index + 1U) >= pHeader->m_total_slices) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: alpha basis file has missing alpha slice\n"); + // basis file is missing the alpha slice + return false; + } + + // Basic sanity checks + if ((pSlice_descs[slice_index + 1].m_flags & cSliceDescFlagsHasAlpha) == 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: alpha basis file has missing alpha slice (flag check)\n"); + // This slice should have alpha data + return false; + } + + if ((pSlice_descs[slice_index].m_num_blocks_x != pSlice_descs[slice_index + 1].m_num_blocks_x) || (pSlice_descs[slice_index].m_num_blocks_y != pSlice_descs[slice_index + 1].m_num_blocks_y)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: alpha basis file slice dimensions bad\n"); + // Alpha slice should have been the same res as the color slice + return false; + } + } + } + + bool status = false; + + const uint32_t total_slice_blocks = pSlice_descs[slice_index].m_num_blocks_x * pSlice_descs[slice_index].m_num_blocks_y; + + if (((fmt == transcoder_texture_format::cTFPVRTC1_4_RGB) || (fmt == transcoder_texture_format::cTFPVRTC1_4_RGBA)) && (output_blocks_buf_size_in_blocks_or_pixels > total_slice_blocks)) + { + // The transcoder doesn't write beyond total_slice_blocks, so we need to clear the rest ourselves. + // For GL usage, PVRTC1 4bpp image size is (max(width, 8)* max(height, 8) * 4 + 7) / 8. + // However, for KTX and internally in Basis this formula isn't used, it's just ((width+3)/4) * ((height+3)/4) * bytes_per_block_or_pixel. This is all the transcoder actually writes to memory. + memset(static_cast(pOutput_blocks) + total_slice_blocks * bytes_per_block_or_pixel, 0, (output_blocks_buf_size_in_blocks_or_pixels - total_slice_blocks) * bytes_per_block_or_pixel); + } + + if (pHeader->m_tex_format == (int)basis_tex_format::cUASTC4x4) + { + const basis_slice_desc* pSlice_desc = &pSlice_descs[slice_index]; + + // Use the container independent image transcode method. + status = m_lowlevel_uastc_decoder.transcode_image(fmt, + pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, + (const uint8_t*)pData, data_size, pSlice_desc->m_num_blocks_x, pSlice_desc->m_num_blocks_y, pSlice_desc->m_orig_width, pSlice_desc->m_orig_height, pSlice_desc->m_level_index, + pSlice_desc->m_file_ofs, pSlice_desc->m_file_size, + decode_flags, basis_file_has_alpha_slices, pHeader->m_tex_type == cBASISTexTypeVideoFrames, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + } + else + { + // ETC1S + const basis_slice_desc* pSlice_desc = &pSlice_descs[slice_index]; + const basis_slice_desc* pAlpha_slice_desc = basis_file_has_alpha_slices ? &pSlice_descs[slice_index + 1] : nullptr; + + assert((pSlice_desc->m_flags & cSliceDescFlagsHasAlpha) == 0); + + if (pAlpha_slice_desc) + { + // Basic sanity checks + assert((pAlpha_slice_desc->m_flags & cSliceDescFlagsHasAlpha) != 0); + assert(pSlice_desc->m_num_blocks_x == pAlpha_slice_desc->m_num_blocks_x); + assert(pSlice_desc->m_num_blocks_y == pAlpha_slice_desc->m_num_blocks_y); + assert(pSlice_desc->m_level_index == pAlpha_slice_desc->m_level_index); + } + + // Use the container independent image transcode method. + status = m_lowlevel_etc1s_decoder.transcode_image(fmt, + pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, + (const uint8_t *)pData, data_size, pSlice_desc->m_num_blocks_x, pSlice_desc->m_num_blocks_y, pSlice_desc->m_orig_width, pSlice_desc->m_orig_height, pSlice_desc->m_level_index, + pSlice_desc->m_file_ofs, pSlice_desc->m_file_size, + (pAlpha_slice_desc != nullptr) ? (uint32_t)pAlpha_slice_desc->m_file_ofs : 0U, (pAlpha_slice_desc != nullptr) ? (uint32_t)pAlpha_slice_desc->m_file_size : 0U, + decode_flags, basis_file_has_alpha_slices, pHeader->m_tex_type == cBASISTexTypeVideoFrames, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + + } // if (pHeader->m_tex_format == (int)basis_tex_format::cUASTC4x4) + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: Returning false\n"); + } + else + { + //BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: Returning true\n"); + } + + return status; + } + + uint32_t basis_get_bytes_per_block_or_pixel(transcoder_texture_format fmt) + { + switch (fmt) + { + case transcoder_texture_format::cTFETC1_RGB: + case transcoder_texture_format::cTFBC1_RGB: + case transcoder_texture_format::cTFBC4_R: + case transcoder_texture_format::cTFPVRTC1_4_RGB: + case transcoder_texture_format::cTFPVRTC1_4_RGBA: + case transcoder_texture_format::cTFATC_RGB: + case transcoder_texture_format::cTFPVRTC2_4_RGB: + case transcoder_texture_format::cTFPVRTC2_4_RGBA: + case transcoder_texture_format::cTFETC2_EAC_R11: + return 8; + case transcoder_texture_format::cTFBC7_RGBA: + case transcoder_texture_format::cTFBC7_ALT: + case transcoder_texture_format::cTFETC2_RGBA: + case transcoder_texture_format::cTFBC3_RGBA: + case transcoder_texture_format::cTFBC5_RG: + case transcoder_texture_format::cTFASTC_4x4_RGBA: + case transcoder_texture_format::cTFATC_RGBA: + case transcoder_texture_format::cTFFXT1_RGB: + case transcoder_texture_format::cTFETC2_EAC_RG11: + return 16; + case transcoder_texture_format::cTFRGBA32: + return sizeof(uint32_t); + case transcoder_texture_format::cTFRGB565: + case transcoder_texture_format::cTFBGR565: + case transcoder_texture_format::cTFRGBA4444: + return sizeof(uint16_t); + default: + assert(0); + BASISU_DEVEL_ERROR("basis_get_basisu_texture_format: Invalid fmt\n"); + break; + } + return 0; + } + + const char* basis_get_format_name(transcoder_texture_format fmt) + { + switch (fmt) + { + case transcoder_texture_format::cTFETC1_RGB: return "ETC1_RGB"; + case transcoder_texture_format::cTFBC1_RGB: return "BC1_RGB"; + case transcoder_texture_format::cTFBC4_R: return "BC4_R"; + case transcoder_texture_format::cTFPVRTC1_4_RGB: return "PVRTC1_4_RGB"; + case transcoder_texture_format::cTFPVRTC1_4_RGBA: return "PVRTC1_4_RGBA"; + case transcoder_texture_format::cTFBC7_RGBA: return "BC7_RGBA"; + case transcoder_texture_format::cTFBC7_ALT: return "BC7_RGBA"; + case transcoder_texture_format::cTFETC2_RGBA: return "ETC2_RGBA"; + case transcoder_texture_format::cTFBC3_RGBA: return "BC3_RGBA"; + case transcoder_texture_format::cTFBC5_RG: return "BC5_RG"; + case transcoder_texture_format::cTFASTC_4x4_RGBA: return "ASTC_RGBA"; + case transcoder_texture_format::cTFATC_RGB: return "ATC_RGB"; + case transcoder_texture_format::cTFATC_RGBA: return "ATC_RGBA"; + case transcoder_texture_format::cTFRGBA32: return "RGBA32"; + case transcoder_texture_format::cTFRGB565: return "RGB565"; + case transcoder_texture_format::cTFBGR565: return "BGR565"; + case transcoder_texture_format::cTFRGBA4444: return "RGBA4444"; + case transcoder_texture_format::cTFFXT1_RGB: return "FXT1_RGB"; + case transcoder_texture_format::cTFPVRTC2_4_RGB: return "PVRTC2_4_RGB"; + case transcoder_texture_format::cTFPVRTC2_4_RGBA: return "PVRTC2_4_RGBA"; + case transcoder_texture_format::cTFETC2_EAC_R11: return "ETC2_EAC_R11"; + case transcoder_texture_format::cTFETC2_EAC_RG11: return "ETC2_EAC_RG11"; + default: + assert(0); + BASISU_DEVEL_ERROR("basis_get_basisu_texture_format: Invalid fmt\n"); + break; + } + return ""; + } + + const char* basis_get_block_format_name(block_format fmt) + { + switch (fmt) + { + case block_format::cETC1: return "ETC1"; + case block_format::cBC1: return "BC1"; + case block_format::cPVRTC1_4_RGB: return "PVRTC1_4_RGB"; + case block_format::cPVRTC1_4_RGBA: return "PVRTC1_4_RGBA"; + case block_format::cBC7: return "BC7"; + case block_format::cETC2_RGBA: return "ETC2_RGBA"; + case block_format::cBC3: return "BC3"; + case block_format::cASTC_4x4: return "ASTC_4x4"; + case block_format::cATC_RGB: return "ATC_RGB"; + case block_format::cRGBA32: return "RGBA32"; + case block_format::cRGB565: return "RGB565"; + case block_format::cBGR565: return "BGR565"; + case block_format::cRGBA4444: return "RGBA4444"; + case block_format::cFXT1_RGB: return "FXT1_RGB"; + case block_format::cPVRTC2_4_RGB: return "PVRTC2_4_RGB"; + case block_format::cPVRTC2_4_RGBA: return "PVRTC2_4_RGBA"; + case block_format::cETC2_EAC_R11: return "ETC2_EAC_R11"; + case block_format::cETC2_EAC_RG11: return "ETC2_EAC_RG11"; + default: + assert(0); + BASISU_DEVEL_ERROR("basis_get_basisu_texture_format: Invalid fmt\n"); + break; + } + return ""; + } + + const char* basis_get_texture_type_name(basis_texture_type tex_type) + { + switch (tex_type) + { + case cBASISTexType2D: return "2D"; + case cBASISTexType2DArray: return "2D array"; + case cBASISTexTypeCubemapArray: return "cubemap array"; + case cBASISTexTypeVideoFrames: return "video"; + case cBASISTexTypeVolume: return "3D"; + default: + assert(0); + BASISU_DEVEL_ERROR("basis_get_texture_type_name: Invalid tex_type\n"); + break; + } + return ""; + } + + bool basis_transcoder_format_has_alpha(transcoder_texture_format fmt) + { + switch (fmt) + { + case transcoder_texture_format::cTFETC2_RGBA: + case transcoder_texture_format::cTFBC3_RGBA: + case transcoder_texture_format::cTFASTC_4x4_RGBA: + case transcoder_texture_format::cTFBC7_RGBA: + case transcoder_texture_format::cTFBC7_ALT: + case transcoder_texture_format::cTFPVRTC1_4_RGBA: + case transcoder_texture_format::cTFPVRTC2_4_RGBA: + case transcoder_texture_format::cTFATC_RGBA: + case transcoder_texture_format::cTFRGBA32: + case transcoder_texture_format::cTFRGBA4444: + return true; + default: + break; + } + return false; + } + + basisu::texture_format basis_get_basisu_texture_format(transcoder_texture_format fmt) + { + switch (fmt) + { + case transcoder_texture_format::cTFETC1_RGB: return basisu::texture_format::cETC1; + case transcoder_texture_format::cTFBC1_RGB: return basisu::texture_format::cBC1; + case transcoder_texture_format::cTFBC4_R: return basisu::texture_format::cBC4; + case transcoder_texture_format::cTFPVRTC1_4_RGB: return basisu::texture_format::cPVRTC1_4_RGB; + case transcoder_texture_format::cTFPVRTC1_4_RGBA: return basisu::texture_format::cPVRTC1_4_RGBA; + case transcoder_texture_format::cTFBC7_RGBA: return basisu::texture_format::cBC7; + case transcoder_texture_format::cTFBC7_ALT: return basisu::texture_format::cBC7; + case transcoder_texture_format::cTFETC2_RGBA: return basisu::texture_format::cETC2_RGBA; + case transcoder_texture_format::cTFBC3_RGBA: return basisu::texture_format::cBC3; + case transcoder_texture_format::cTFBC5_RG: return basisu::texture_format::cBC5; + case transcoder_texture_format::cTFASTC_4x4_RGBA: return basisu::texture_format::cASTC4x4; + case transcoder_texture_format::cTFATC_RGB: return basisu::texture_format::cATC_RGB; + case transcoder_texture_format::cTFATC_RGBA: return basisu::texture_format::cATC_RGBA_INTERPOLATED_ALPHA; + case transcoder_texture_format::cTFRGBA32: return basisu::texture_format::cRGBA32; + case transcoder_texture_format::cTFRGB565: return basisu::texture_format::cRGB565; + case transcoder_texture_format::cTFBGR565: return basisu::texture_format::cBGR565; + case transcoder_texture_format::cTFRGBA4444: return basisu::texture_format::cRGBA4444; + case transcoder_texture_format::cTFFXT1_RGB: return basisu::texture_format::cFXT1_RGB; + case transcoder_texture_format::cTFPVRTC2_4_RGB: return basisu::texture_format::cPVRTC2_4_RGBA; + case transcoder_texture_format::cTFPVRTC2_4_RGBA: return basisu::texture_format::cPVRTC2_4_RGBA; + case transcoder_texture_format::cTFETC2_EAC_R11: return basisu::texture_format::cETC2_R11_EAC; + case transcoder_texture_format::cTFETC2_EAC_RG11: return basisu::texture_format::cETC2_RG11_EAC; + default: + assert(0); + BASISU_DEVEL_ERROR("basis_get_basisu_texture_format: Invalid fmt\n"); + break; + } + return basisu::texture_format::cInvalidTextureFormat; + } + + bool basis_transcoder_format_is_uncompressed(transcoder_texture_format tex_type) + { + switch (tex_type) + { + case transcoder_texture_format::cTFRGBA32: + case transcoder_texture_format::cTFRGB565: + case transcoder_texture_format::cTFBGR565: + case transcoder_texture_format::cTFRGBA4444: + return true; + default: + break; + } + return false; + } + + bool basis_block_format_is_uncompressed(block_format blk_fmt) + { + switch (blk_fmt) + { + case block_format::cRGB32: + case block_format::cRGBA32: + case block_format::cA32: + case block_format::cRGB565: + case block_format::cBGR565: + case block_format::cRGBA4444: + case block_format::cRGBA4444_COLOR: + case block_format::cRGBA4444_ALPHA: + case block_format::cRGBA4444_COLOR_OPAQUE: + return true; + default: + break; + } + return false; + } + + uint32_t basis_get_uncompressed_bytes_per_pixel(transcoder_texture_format fmt) + { + switch (fmt) + { + case transcoder_texture_format::cTFRGBA32: + return sizeof(uint32_t); + case transcoder_texture_format::cTFRGB565: + case transcoder_texture_format::cTFBGR565: + case transcoder_texture_format::cTFRGBA4444: + return sizeof(uint16_t); + default: + break; + } + return 0; + } + + uint32_t basis_get_block_width(transcoder_texture_format tex_type) + { + switch (tex_type) + { + case transcoder_texture_format::cTFFXT1_RGB: + return 8; + default: + break; + } + return 4; + } + + uint32_t basis_get_block_height(transcoder_texture_format tex_type) + { + BASISU_NOTE_UNUSED(tex_type); + return 4; + } + + bool basis_is_format_supported(transcoder_texture_format tex_type, basis_tex_format fmt) + { + if (fmt == basis_tex_format::cUASTC4x4) + { +#if BASISD_SUPPORT_UASTC + switch (tex_type) + { + // These niche formats aren't currently supported for UASTC - everything else is. + case transcoder_texture_format::cTFPVRTC2_4_RGB: + case transcoder_texture_format::cTFPVRTC2_4_RGBA: + case transcoder_texture_format::cTFATC_RGB: + case transcoder_texture_format::cTFATC_RGBA: + case transcoder_texture_format::cTFFXT1_RGB: + return false; + default: + return true; + } +#endif + } + else + { + switch (tex_type) + { + // ETC1 and uncompressed are always supported. + case transcoder_texture_format::cTFETC1_RGB: + case transcoder_texture_format::cTFRGBA32: + case transcoder_texture_format::cTFRGB565: + case transcoder_texture_format::cTFBGR565: + case transcoder_texture_format::cTFRGBA4444: + return true; +#if BASISD_SUPPORT_DXT1 + case transcoder_texture_format::cTFBC1_RGB: + return true; +#endif +#if BASISD_SUPPORT_DXT5A + case transcoder_texture_format::cTFBC4_R: + case transcoder_texture_format::cTFBC5_RG: + return true; +#endif +#if BASISD_SUPPORT_DXT1 && BASISD_SUPPORT_DXT5A + case transcoder_texture_format::cTFBC3_RGBA: + return true; +#endif +#if BASISD_SUPPORT_PVRTC1 + case transcoder_texture_format::cTFPVRTC1_4_RGB: + case transcoder_texture_format::cTFPVRTC1_4_RGBA: + return true; +#endif +#if BASISD_SUPPORT_BC7_MODE5 + case transcoder_texture_format::cTFBC7_RGBA: + case transcoder_texture_format::cTFBC7_ALT: + return true; +#endif +#if BASISD_SUPPORT_ETC2_EAC_A8 + case transcoder_texture_format::cTFETC2_RGBA: + return true; +#endif +#if BASISD_SUPPORT_ASTC + case transcoder_texture_format::cTFASTC_4x4_RGBA: + return true; +#endif +#if BASISD_SUPPORT_ATC + case transcoder_texture_format::cTFATC_RGB: + case transcoder_texture_format::cTFATC_RGBA: + return true; +#endif +#if BASISD_SUPPORT_FXT1 + case transcoder_texture_format::cTFFXT1_RGB: + return true; +#endif +#if BASISD_SUPPORT_PVRTC2 + case transcoder_texture_format::cTFPVRTC2_4_RGB: + case transcoder_texture_format::cTFPVRTC2_4_RGBA: + return true; +#endif +#if BASISD_SUPPORT_ETC2_EAC_RG11 + case transcoder_texture_format::cTFETC2_EAC_R11: + case transcoder_texture_format::cTFETC2_EAC_RG11: + return true; +#endif + default: + break; + } + } + + return false; + } + + // ------------------------------------------------------------------------------------------------------ + // UASTC + // ------------------------------------------------------------------------------------------------------ + +#if BASISD_SUPPORT_UASTC + const astc_bc7_common_partition2_desc g_astc_bc7_common_partitions2[TOTAL_ASTC_BC7_COMMON_PARTITIONS2] = + { + { 0, 28, false }, { 1, 20, false }, { 2, 16, true }, { 3, 29, false }, + { 4, 91, true }, { 5, 9, false }, { 6, 107, true }, { 7, 72, true }, + { 8, 149, false }, { 9, 204, true }, { 10, 50, false }, { 11, 114, true }, + { 12, 496, true }, { 13, 17, true }, { 14, 78, false }, { 15, 39, true }, + { 17, 252, true }, { 18, 828, true }, { 19, 43, false }, { 20, 156, false }, + { 21, 116, false }, { 22, 210, true }, { 23, 476, true }, { 24, 273, false }, + { 25, 684, true }, { 26, 359, false }, { 29, 246, true }, { 32, 195, true }, + { 33, 694, true }, { 52, 524, true } + }; + + const bc73_astc2_common_partition_desc g_bc7_3_astc2_common_partitions[TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS] = + { + { 10, 36, 4 }, { 11, 48, 4 }, { 0, 61, 3 }, { 2, 137, 4 }, + { 8, 161, 5 }, { 13, 183, 4 }, { 1, 226, 2 }, { 33, 281, 2 }, + { 40, 302, 3 }, { 20, 307, 4 }, { 21, 479, 0 }, { 58, 495, 3 }, + { 3, 593, 0 }, { 32, 594, 2 }, { 59, 605, 1 }, { 34, 799, 3 }, + { 20, 812, 1 }, { 14, 988, 4 }, { 31, 993, 3 } + }; + + const astc_bc7_common_partition3_desc g_astc_bc7_common_partitions3[TOTAL_ASTC_BC7_COMMON_PARTITIONS3] = + { + { 4, 260, 0 }, { 8, 74, 5 }, { 9, 32, 5 }, { 10, 156, 2 }, + { 11, 183, 2 }, { 12, 15, 0 }, { 13, 745, 4 }, { 20, 0, 1 }, + { 35, 335, 1 }, { 36, 902, 5 }, { 57, 254, 0 } + }; + + const uint8_t g_astc_to_bc7_partition_index_perm_tables[6][3] = { { 0, 1, 2 }, { 1, 2, 0 }, { 2, 0, 1 }, { 2, 1, 0 }, { 0, 2, 1 }, { 1, 0, 2 } }; + + const uint8_t g_bc7_to_astc_partition_index_perm_tables[6][3] = { { 0, 1, 2 }, { 2, 0, 1 }, { 1, 2, 0 }, { 2, 1, 0 }, { 0, 2, 1 }, { 1, 0, 2 } }; + + uint32_t bc7_convert_partition_index_3_to_2(uint32_t p, uint32_t k) + { + assert(k < 6); + switch (k >> 1) + { + case 0: + if (p <= 1) + p = 0; + else + p = 1; + break; + case 1: + if (p == 0) + p = 0; + else + p = 1; + break; + case 2: + if ((p == 0) || (p == 2)) + p = 0; + else + p = 1; + break; + } + if (k & 1) + p = 1 - p; + return p; + } + + static const uint8_t g_zero_pattern[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + const uint8_t g_astc_bc7_patterns2[TOTAL_ASTC_BC7_COMMON_PARTITIONS2][16] = + { + { 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1 }, { 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1 }, { 1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0 }, { 0,0,0,1,0,0,1,1,0,0,1,1,0,1,1,1 }, + { 1,1,1,1,1,1,1,0,1,1,1,0,1,1,0,0 }, { 0,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1 }, { 1,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0 }, { 1,1,1,1,1,1,1,0,1,1,0,0,1,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1 }, { 1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1 }, { 1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0 }, + { 1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0 }, { 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0 }, { 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 }, { 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0 }, + { 1,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1 }, { 1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,1 }, { 0,1,1,1,0,0,1,1,0,0,0,1,0,0,0,0 }, { 0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,1,0,0,0,1,1,0,0,1,1,1,0 }, { 1,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1 }, { 1,0,0,0,1,1,0,0,1,1,0,0,1,1,1,0 }, { 0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0 }, + { 1,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1 }, { 0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0 }, { 1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1 }, { 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0 }, + { 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0 }, { 1,0,0,1,0,0,1,1,0,1,1,0,1,1,0,0 } + }; + + const uint8_t g_astc_bc7_patterns3[TOTAL_ASTC_BC7_COMMON_PARTITIONS3][16] = + { + { 0,0,0,0,0,0,0,0,1,1,2,2,1,1,2,2 }, { 1,1,1,1,1,1,1,1,0,0,0,0,2,2,2,2 }, { 1,1,1,1,0,0,0,0,0,0,0,0,2,2,2,2 }, { 1,1,1,1,2,2,2,2,0,0,0,0,0,0,0,0 }, + { 1,1,2,0,1,1,2,0,1,1,2,0,1,1,2,0 }, { 0,1,1,2,0,1,1,2,0,1,1,2,0,1,1,2 }, { 0,2,1,1,0,2,1,1,0,2,1,1,0,2,1,1 }, { 2,0,0,0,2,0,0,0,2,1,1,1,2,1,1,1 }, + { 2,0,1,2,2,0,1,2,2,0,1,2,2,0,1,2 }, { 1,1,1,1,0,0,0,0,2,2,2,2,1,1,1,1 }, { 0,0,2,2,0,0,1,1,0,0,1,1,0,0,2,2 } + }; + + const uint8_t g_bc7_3_astc2_patterns2[TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS][16] = + { + { 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0 }, { 0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0 }, { 1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1 }, + { 1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1 }, { 0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0 }, { 0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1 }, { 0,1,1,1,0,0,1,1,0,0,1,1,0,0,1,1 }, + { 1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0 }, { 0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,0 }, { 1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0 }, + { 0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1 }, { 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0 }, { 1,1,0,0,1,1,0,0,1,1,0,0,1,0,0,0 }, + { 1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0 }, { 0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0 }, { 1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0 } + }; + + const uint8_t g_astc_bc7_pattern2_anchors[TOTAL_ASTC_BC7_COMMON_PARTITIONS2][3] = + { + { 0, 2 }, { 0, 3 }, { 1, 0 }, { 0, 3 }, { 7, 0 }, { 0, 2 }, { 3, 0 }, { 7, 0 }, + { 0, 11 }, { 2, 0 }, { 0, 7 }, { 11, 0 }, { 3, 0 }, { 8, 0 }, { 0, 4 }, { 12, 0 }, + { 1, 0 }, { 8, 0 }, { 0, 1 }, { 0, 2 }, { 0, 4 }, { 8, 0 }, { 1, 0 }, { 0, 2 }, + { 4, 0 }, { 0, 1 }, { 4, 0 }, { 1, 0 }, { 4, 0 }, { 1, 0 } + }; + + const uint8_t g_astc_bc7_pattern3_anchors[TOTAL_ASTC_BC7_COMMON_PARTITIONS3][3] = + { + { 0, 8, 10 }, { 8, 0, 12 }, { 4, 0, 12 }, { 8, 0, 4 }, { 3, 0, 2 }, { 0, 1, 3 }, { 0, 2, 1 }, { 1, 9, 0 }, { 1, 2, 0 }, { 4, 0, 8 }, { 0, 6, 2 } + }; + + const uint8_t g_bc7_3_astc2_patterns2_anchors[TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS][3] = + { + { 0, 4 }, { 0, 2 }, { 2, 0 }, { 0, 7 }, { 8, 0 }, { 0, 1 }, { 0, 3 }, { 0, 1 }, { 2, 0 }, { 0, 1 }, { 0, 8 }, { 2, 0 }, { 0, 1 }, { 0, 7 }, { 12, 0 }, { 2, 0 }, { 9, 0 }, { 0, 2 }, { 4, 0 } + }; + + const uint32_t g_uastc_mode_huff_codes[TOTAL_UASTC_MODES + 1][2] = + { + { 0x1, 4 }, + { 0x35, 6 }, + { 0x1D, 5 }, + { 0x3, 5 }, + + { 0x13, 5 }, + { 0xB, 5 }, + { 0x1B, 5 }, + { 0x7, 5 }, + + { 0x17, 5 }, + { 0xF, 5 }, + { 0x2, 3 }, + { 0x0, 2 }, + + { 0x6, 3 }, + { 0x1F, 5 }, + { 0xD, 5 }, + { 0x5, 7 }, + + { 0x15, 6 }, + { 0x25, 6 }, + { 0x9, 4 }, + { 0x45, 7 } // future expansion + }; + + // If g_uastc_mode_huff_codes[] changes this table must be updated! + static const uint8_t g_uastc_huff_modes[128] = + { + 11,0,10,3,11,15,12,7,11,18,10,5,11,14,12,9,11,0,10,4,11,16,12,8,11,18,10,6,11,2,12,13,11,0,10,3,11,17,12,7,11,18,10,5,11,14,12,9,11,0,10,4,11,1,12,8,11,18,10,6,11,2,12,13,11,0,10,3,11, + 19,12,7,11,18,10,5,11,14,12,9,11,0,10,4,11,16,12,8,11,18,10,6,11,2,12,13,11,0,10,3,11,17,12,7,11,18,10,5,11,14,12,9,11,0,10,4,11,1,12,8,11,18,10,6,11,2,12,13 + }; + + const uint8_t g_uastc_mode_weight_bits[TOTAL_UASTC_MODES] = { 4, 2, 3, 2, 2, 3, 2, 2, 0, 2, 4, 2, 3, 1, 2, 4, 2, 2, 5 }; + const uint8_t g_uastc_mode_weight_ranges[TOTAL_UASTC_MODES] = { 8, 2, 5, 2, 2, 5, 2, 2, 0, 2, 8, 2, 5, 0, 2, 8, 2, 2, 11 }; + const uint8_t g_uastc_mode_endpoint_ranges[TOTAL_UASTC_MODES] = { 19, 20, 8, 7, 12, 20, 18, 12, 0, 8, 13, 13, 19, 20, 20, 20, 20, 20, 11 }; + const uint8_t g_uastc_mode_subsets[TOTAL_UASTC_MODES] = { 1, 1, 2, 3, 2, 1, 1, 2, 0, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1 }; + const uint8_t g_uastc_mode_planes[TOTAL_UASTC_MODES] = { 1, 1, 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1 }; + const uint8_t g_uastc_mode_comps[TOTAL_UASTC_MODES] = { 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 3 }; + const uint8_t g_uastc_mode_has_etc1_bias[TOTAL_UASTC_MODES] = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 }; + const uint8_t g_uastc_mode_has_bc1_hint0[TOTAL_UASTC_MODES] = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + const uint8_t g_uastc_mode_has_bc1_hint1[TOTAL_UASTC_MODES] = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 }; + const uint8_t g_uastc_mode_cem[TOTAL_UASTC_MODES] = { 8, 8, 8, 8, 8, 8, 8, 8, 0, 12, 12, 12, 12, 12, 12, 4, 4, 4, 8 }; + const uint8_t g_uastc_mode_has_alpha[TOTAL_UASTC_MODES] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }; + const uint8_t g_uastc_mode_is_la[TOTAL_UASTC_MODES] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0 }; + const uint8_t g_uastc_mode_total_hint_bits[TOTAL_UASTC_MODES] = { 15, 15, 15, 15, 15, 15, 15, 15, 0, 23, 17, 17, 17, 23, 23, 23, 23, 23, 15 }; + + // bits, trits, quints + const int g_astc_bise_range_table[TOTAL_ASTC_RANGES][3] = + { + { 1, 0, 0 }, // 0-1 0 + { 0, 1, 0 }, // 0-2 1 + { 2, 0, 0 }, // 0-3 2 + { 0, 0, 1 }, // 0-4 3 + + { 1, 1, 0 }, // 0-5 4 + { 3, 0, 0 }, // 0-7 5 + { 1, 0, 1 }, // 0-9 6 + { 2, 1, 0 }, // 0-11 7 + + { 4, 0, 0 }, // 0-15 8 + { 2, 0, 1 }, // 0-19 9 + { 3, 1, 0 }, // 0-23 10 + { 5, 0, 0 }, // 0-31 11 + + { 3, 0, 1 }, // 0-39 12 + { 4, 1, 0 }, // 0-47 13 + { 6, 0, 0 }, // 0-63 14 + { 4, 0, 1 }, // 0-79 15 + + { 5, 1, 0 }, // 0-95 16 + { 7, 0, 0 }, // 0-127 17 + { 5, 0, 1 }, // 0-159 18 + { 6, 1, 0 }, // 0-191 19 + + { 8, 0, 0 }, // 0-255 20 + }; + + int astc_get_levels(int range) + { + assert(range < (int)BC7ENC_TOTAL_ASTC_RANGES); + return (1 + 2 * g_astc_bise_range_table[range][1] + 4 * g_astc_bise_range_table[range][2]) << g_astc_bise_range_table[range][0]; + } + + // g_astc_unquant[] is the inverse of g_astc_sorted_order_unquant[] + astc_quant_bin g_astc_unquant[BC7ENC_TOTAL_ASTC_RANGES][256]; // [ASTC encoded endpoint index] + + // Taken right from the ASTC spec. + static struct + { + const char* m_pB_str; + uint32_t m_c; + } g_astc_endpoint_unquant_params[BC7ENC_TOTAL_ASTC_RANGES] = + { + { "", 0 }, + { "", 0 }, + { "", 0 }, + { "", 0 }, + { "000000000", 204, }, // 0-5 + { "", 0 }, + { "000000000", 113, }, // 0-9 + { "b000b0bb0", 93 }, // 0-11 + { "", 0 }, + { "b0000bb00", 54 }, // 0-19 + { "cb000cbcb", 44 }, // 0-23 + { "", 0 }, + { "cb0000cbc", 26 }, // 0-39 + { "dcb000dcb", 22 }, // 0-47 + { "", 0 }, + { "dcb0000dc", 13 }, // 0-79 + { "edcb000ed", 11 }, // 0-95 + { "", 0 }, + { "edcb0000e", 6 }, // 0-159 + { "fedcb000f", 5 }, // 0-191 + { "", 0 }, + }; + + bool astc_is_valid_endpoint_range(uint32_t range) + { + if ((g_astc_bise_range_table[range][1] == 0) && (g_astc_bise_range_table[range][2] == 0)) + return true; + + return g_astc_endpoint_unquant_params[range].m_c != 0; + } + + uint32_t unquant_astc_endpoint(uint32_t packed_bits, uint32_t packed_trits, uint32_t packed_quints, uint32_t range) + { + assert(range < BC7ENC_TOTAL_ASTC_RANGES); + + const uint32_t bits = g_astc_bise_range_table[range][0]; + const uint32_t trits = g_astc_bise_range_table[range][1]; + const uint32_t quints = g_astc_bise_range_table[range][2]; + + uint32_t val = 0; + if ((!trits) && (!quints)) + { + assert(!packed_trits && !packed_quints); + + int bits_left = 8; + while (bits_left > 0) + { + uint32_t v = packed_bits; + + int n = basisu::minimumi(bits_left, bits); + if (n < (int)bits) + v >>= (bits - n); + + assert(v < (1U << n)); + + val |= (v << (bits_left - n)); + bits_left -= n; + } + } + else + { + const uint32_t A = (packed_bits & 1) ? 511 : 0; + const uint32_t C = g_astc_endpoint_unquant_params[range].m_c; + const uint32_t D = trits ? packed_trits : packed_quints; + + assert(C); + + uint32_t B = 0; + for (uint32_t i = 0; i < 9; i++) + { + B <<= 1; + + char c = g_astc_endpoint_unquant_params[range].m_pB_str[i]; + if (c != '0') + { + c -= 'a'; + B |= ((packed_bits >> c) & 1); + } + } + + val = D * C + B; + val = val ^ A; + val = (A & 0x80) | (val >> 2); + } + + return val; + } + + uint32_t unquant_astc_endpoint_val(uint32_t packed_val, uint32_t range) + { + assert(range < BC7ENC_TOTAL_ASTC_RANGES); + assert(packed_val < (uint32_t)astc_get_levels(range)); + + const uint32_t bits = g_astc_bise_range_table[range][0]; + const uint32_t trits = g_astc_bise_range_table[range][1]; + const uint32_t quints = g_astc_bise_range_table[range][2]; + + if ((!trits) && (!quints)) + return unquant_astc_endpoint(packed_val, 0, 0, range); + else if (trits) + return unquant_astc_endpoint(packed_val & ((1 << bits) - 1), packed_val >> bits, 0, range); + else + return unquant_astc_endpoint(packed_val & ((1 << bits) - 1), 0, packed_val >> bits, range); + } + + // BC7 - Various BC7 tables/helpers + const uint32_t g_bc7_weights1[2] = { 0, 64 }; + const uint32_t g_bc7_weights2[4] = { 0, 21, 43, 64 }; + const uint32_t g_bc7_weights3[8] = { 0, 9, 18, 27, 37, 46, 55, 64 }; + const uint32_t g_bc7_weights4[16] = { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 }; + const uint32_t g_astc_weights4[16] = { 0, 4, 8, 12, 17, 21, 25, 29, 35, 39, 43, 47, 52, 56, 60, 64 }; + const uint32_t g_astc_weights5[32] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }; + const uint32_t g_astc_weights_3levels[3] = { 0, 32, 64 }; + + const uint8_t g_bc7_partition1[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; + + const uint8_t g_bc7_partition2[64 * 16] = + { + 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1, 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1, 0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1, 0,0,0,1,0,0,1,1,0,0,1,1,0,1,1,1, 0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1, 0,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1, 0,0,0,1,0,0,1,1,0,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,1,0,0,1,1,0,1,1,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1, 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1, 0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, + 0,0,0,0,1,0,0,0,1,1,1,0,1,1,1,1, 0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0, 0,1,1,1,0,0,1,1,0,0,0,1,0,0,0,0, 0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,1,1,0,0,1,1,1,0, 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0, 0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1, + 0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0, 0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0, 0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0, 0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0, 0,0,0,1,0,1,1,1,1,1,1,0,1,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0, 0,1,1,1,0,0,0,1,1,0,0,0,1,1,1,0, 0,0,1,1,1,0,0,1,1,0,0,1,1,1,0,0, + 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, 0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1, 0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,0, 0,0,1,1,0,0,1,1,1,1,0,0,1,1,0,0, 0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0, 0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0, 0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1, 0,1,0,1,1,0,1,0,1,0,1,0,0,1,0,1, + 0,1,1,1,0,0,1,1,1,1,0,0,1,1,1,0, 0,0,0,1,0,0,1,1,1,1,0,0,1,0,0,0, 0,0,1,1,0,0,1,0,0,1,0,0,1,1,0,0, 0,0,1,1,1,0,1,1,1,1,0,1,1,1,0,0, 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, 0,0,1,1,1,1,0,0,1,1,0,0,0,0,1,1, 0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1, 0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0, + 0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0, 0,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,1,1,1,0,0,1,0, 0,0,0,0,0,1,0,0,1,1,1,0,0,1,0,0, 0,1,1,0,1,1,0,0,1,0,0,1,0,0,1,1, 0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,1, 0,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0, 0,0,1,1,1,0,0,1,1,1,0,0,0,1,1,0, + 0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,1, 0,1,1,0,0,0,1,1,0,0,1,1,1,0,0,1, 0,1,1,1,1,1,1,0,1,0,0,0,0,0,0,1, 0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,1, 0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1, 0,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0, 0,0,1,0,0,0,1,0,1,1,1,0,1,1,1,0, 0,1,0,0,0,1,0,0,0,1,1,1,0,1,1,1 + }; + + const uint8_t g_bc7_partition3[64 * 16] = + { + 0,0,1,1,0,0,1,1,0,2,2,1,2,2,2,2, 0,0,0,1,0,0,1,1,2,2,1,1,2,2,2,1, 0,0,0,0,2,0,0,1,2,2,1,1,2,2,1,1, 0,2,2,2,0,0,2,2,0,0,1,1,0,1,1,1, 0,0,0,0,0,0,0,0,1,1,2,2,1,1,2,2, 0,0,1,1,0,0,1,1,0,0,2,2,0,0,2,2, 0,0,2,2,0,0,2,2,1,1,1,1,1,1,1,1, 0,0,1,1,0,0,1,1,2,2,1,1,2,2,1,1, + 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2, 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2, 0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2, 0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2, 0,1,1,2,0,1,1,2,0,1,1,2,0,1,1,2, 0,1,2,2,0,1,2,2,0,1,2,2,0,1,2,2, 0,0,1,1,0,1,1,2,1,1,2,2,1,2,2,2, 0,0,1,1,2,0,0,1,2,2,0,0,2,2,2,0, + 0,0,0,1,0,0,1,1,0,1,1,2,1,1,2,2, 0,1,1,1,0,0,1,1,2,0,0,1,2,2,0,0, 0,0,0,0,1,1,2,2,1,1,2,2,1,1,2,2, 0,0,2,2,0,0,2,2,0,0,2,2,1,1,1,1, 0,1,1,1,0,1,1,1,0,2,2,2,0,2,2,2, 0,0,0,1,0,0,0,1,2,2,2,1,2,2,2,1, 0,0,0,0,0,0,1,1,0,1,2,2,0,1,2,2, 0,0,0,0,1,1,0,0,2,2,1,0,2,2,1,0, + 0,1,2,2,0,1,2,2,0,0,1,1,0,0,0,0, 0,0,1,2,0,0,1,2,1,1,2,2,2,2,2,2, 0,1,1,0,1,2,2,1,1,2,2,1,0,1,1,0, 0,0,0,0,0,1,1,0,1,2,2,1,1,2,2,1, 0,0,2,2,1,1,0,2,1,1,0,2,0,0,2,2, 0,1,1,0,0,1,1,0,2,0,0,2,2,2,2,2, 0,0,1,1,0,1,2,2,0,1,2,2,0,0,1,1, 0,0,0,0,2,0,0,0,2,2,1,1,2,2,2,1, + 0,0,0,0,0,0,0,2,1,1,2,2,1,2,2,2, 0,2,2,2,0,0,2,2,0,0,1,2,0,0,1,1, 0,0,1,1,0,0,1,2,0,0,2,2,0,2,2,2, 0,1,2,0,0,1,2,0,0,1,2,0,0,1,2,0, 0,0,0,0,1,1,1,1,2,2,2,2,0,0,0,0, 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0, 0,1,2,0,2,0,1,2,1,2,0,1,0,1,2,0, 0,0,1,1,2,2,0,0,1,1,2,2,0,0,1,1, + 0,0,1,1,1,1,2,2,2,2,0,0,0,0,1,1, 0,1,0,1,0,1,0,1,2,2,2,2,2,2,2,2, 0,0,0,0,0,0,0,0,2,1,2,1,2,1,2,1, 0,0,2,2,1,1,2,2,0,0,2,2,1,1,2,2, 0,0,2,2,0,0,1,1,0,0,2,2,0,0,1,1, 0,2,2,0,1,2,2,1,0,2,2,0,1,2,2,1, 0,1,0,1,2,2,2,2,2,2,2,2,0,1,0,1, 0,0,0,0,2,1,2,1,2,1,2,1,2,1,2,1, + 0,1,0,1,0,1,0,1,0,1,0,1,2,2,2,2, 0,2,2,2,0,1,1,1,0,2,2,2,0,1,1,1, 0,0,0,2,1,1,1,2,0,0,0,2,1,1,1,2, 0,0,0,0,2,1,1,2,2,1,1,2,2,1,1,2, 0,2,2,2,0,1,1,1,0,1,1,1,0,2,2,2, 0,0,0,2,1,1,1,2,1,1,1,2,0,0,0,2, 0,1,1,0,0,1,1,0,0,1,1,0,2,2,2,2, 0,0,0,0,0,0,0,0,2,1,1,2,2,1,1,2, + 0,1,1,0,0,1,1,0,2,2,2,2,2,2,2,2, 0,0,2,2,0,0,1,1,0,0,1,1,0,0,2,2, 0,0,2,2,1,1,2,2,1,1,2,2,0,0,2,2, 0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,2, 0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1, 0,2,2,2,1,2,2,2,0,2,2,2,1,2,2,2, 0,1,0,1,2,2,2,2,2,2,2,2,2,2,2,2, 0,1,1,1,2,0,1,1,2,2,0,1,2,2,2,0, + }; + + const uint8_t g_bc7_table_anchor_index_second_subset[64] = { 15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15, 15, 2, 8, 2, 2, 8, 8,15, 2, 8, 2, 2, 8, 8, 2, 2, 15,15, 6, 8, 2, 8,15,15, 2, 8, 2, 2, 2,15,15, 6, 6, 2, 6, 8,15,15, 2, 2, 15,15,15,15,15, 2, 2,15 }; + + const uint8_t g_bc7_table_anchor_index_third_subset_1[64] = + { + 3, 3,15,15, 8, 3,15,15, 8, 8, 6, 6, 6, 5, 3, 3, 3, 3, 8,15, 3, 3, 6,10, 5, 8, 8, 6, 8, 5,15,15, 8,15, 3, 5, 6,10, 8,15, 15, 3,15, 5,15,15,15,15, 3,15, 5, 5, 5, 8, 5,10, 5,10, 8,13,15,12, 3, 3 + }; + + const uint8_t g_bc7_table_anchor_index_third_subset_2[64] = + { + 15, 8, 8, 3,15,15, 3, 8, 15,15,15,15,15,15,15, 8, 15, 8,15, 3,15, 8,15, 8, 3,15, 6,10,15,15,10, 8, 15, 3,15,10,10, 8, 9,10, 6,15, 8,15, 3, 6, 6, 8, 15, 3,15,15,15,15,15,15, 15,15,15,15, 3,15,15, 8 + }; + + const uint8_t g_bc7_num_subsets[8] = { 3, 2, 3, 2, 1, 1, 1, 2 }; + const uint8_t g_bc7_partition_bits[8] = { 4, 6, 6, 6, 0, 0, 0, 6 }; + const uint8_t g_bc7_color_index_bitcount[8] = { 3, 3, 2, 2, 2, 2, 4, 2 }; + + const uint8_t g_bc7_mode_has_p_bits[8] = { 1, 1, 0, 1, 0, 0, 1, 1 }; + const uint8_t g_bc7_mode_has_shared_p_bits[8] = { 0, 1, 0, 0, 0, 0, 0, 0 }; + const uint8_t g_bc7_color_precision_table[8] = { 4, 6, 5, 7, 5, 7, 7, 5 }; + const int8_t g_bc7_alpha_precision_table[8] = { 0, 0, 0, 0, 6, 8, 7, 5 }; + + const uint8_t g_bc7_alpha_index_bitcount[8] = { 0, 0, 0, 0, 3, 2, 4, 2 }; + + endpoint_err g_bc7_mode_6_optimal_endpoints[256][2]; // [c][pbit] + endpoint_err g_bc7_mode_5_optimal_endpoints[256]; // [c] + + static inline void bc7_set_block_bits(uint8_t* pBytes, uint32_t val, uint32_t num_bits, uint32_t* pCur_ofs) + { + assert((num_bits <= 32) && (val < (1ULL << num_bits))); + while (num_bits) + { + const uint32_t n = basisu::minimumu(8 - (*pCur_ofs & 7), num_bits); + pBytes[*pCur_ofs >> 3] |= (uint8_t)(val << (*pCur_ofs & 7)); + val >>= n; + num_bits -= n; + *pCur_ofs += n; + } + assert(*pCur_ofs <= 128); + } + + // TODO: Optimize this. + void encode_bc7_block(void* pBlock, const bc7_optimization_results* pResults) + { + const uint32_t best_mode = pResults->m_mode; + + const uint32_t total_subsets = g_bc7_num_subsets[best_mode]; + const uint32_t total_partitions = 1 << g_bc7_partition_bits[best_mode]; + //const uint32_t num_rotations = 1 << g_bc7_rotation_bits[best_mode]; + //const uint32_t num_index_selectors = (best_mode == 4) ? 2 : 1; + + const uint8_t* pPartition; + if (total_subsets == 1) + pPartition = &g_bc7_partition1[0]; + else if (total_subsets == 2) + pPartition = &g_bc7_partition2[pResults->m_partition * 16]; + else + pPartition = &g_bc7_partition3[pResults->m_partition * 16]; + + uint8_t color_selectors[16]; + memcpy(color_selectors, pResults->m_selectors, 16); + + uint8_t alpha_selectors[16]; + memcpy(alpha_selectors, pResults->m_alpha_selectors, 16); + + color_quad_u8 low[3], high[3]; + memcpy(low, pResults->m_low, sizeof(low)); + memcpy(high, pResults->m_high, sizeof(high)); + + uint32_t pbits[3][2]; + memcpy(pbits, pResults->m_pbits, sizeof(pbits)); + + int anchor[3] = { -1, -1, -1 }; + + for (uint32_t k = 0; k < total_subsets; k++) + { + uint32_t anchor_index = 0; + if (k) + { + if ((total_subsets == 3) && (k == 1)) + anchor_index = g_bc7_table_anchor_index_third_subset_1[pResults->m_partition]; + else if ((total_subsets == 3) && (k == 2)) + anchor_index = g_bc7_table_anchor_index_third_subset_2[pResults->m_partition]; + else + anchor_index = g_bc7_table_anchor_index_second_subset[pResults->m_partition]; + } + + anchor[k] = anchor_index; + + const uint32_t color_index_bits = get_bc7_color_index_size(best_mode, pResults->m_index_selector); + const uint32_t num_color_indices = 1 << color_index_bits; + + if (color_selectors[anchor_index] & (num_color_indices >> 1)) + { + for (uint32_t i = 0; i < 16; i++) + if (pPartition[i] == k) + color_selectors[i] = (uint8_t)((num_color_indices - 1) - color_selectors[i]); + + if (get_bc7_mode_has_seperate_alpha_selectors(best_mode)) + { + for (uint32_t q = 0; q < 3; q++) + { + uint8_t t = low[k].m_c[q]; + low[k].m_c[q] = high[k].m_c[q]; + high[k].m_c[q] = t; + } + } + else + { + color_quad_u8 tmp = low[k]; + low[k] = high[k]; + high[k] = tmp; + } + + if (!g_bc7_mode_has_shared_p_bits[best_mode]) + { + uint32_t t = pbits[k][0]; + pbits[k][0] = pbits[k][1]; + pbits[k][1] = t; + } + } + + if (get_bc7_mode_has_seperate_alpha_selectors(best_mode)) + { + const uint32_t alpha_index_bits = get_bc7_alpha_index_size(best_mode, pResults->m_index_selector); + const uint32_t num_alpha_indices = 1 << alpha_index_bits; + + if (alpha_selectors[anchor_index] & (num_alpha_indices >> 1)) + { + for (uint32_t i = 0; i < 16; i++) + if (pPartition[i] == k) + alpha_selectors[i] = (uint8_t)((num_alpha_indices - 1) - alpha_selectors[i]); + + uint8_t t = low[k].m_c[3]; + low[k].m_c[3] = high[k].m_c[3]; + high[k].m_c[3] = t; + } + } + } + + uint8_t* pBlock_bytes = (uint8_t*)(pBlock); + memset(pBlock_bytes, 0, BC7ENC_BLOCK_SIZE); + + uint32_t cur_bit_ofs = 0; + bc7_set_block_bits(pBlock_bytes, 1 << best_mode, best_mode + 1, &cur_bit_ofs); + + if ((best_mode == 4) || (best_mode == 5)) + bc7_set_block_bits(pBlock_bytes, pResults->m_rotation, 2, &cur_bit_ofs); + + if (best_mode == 4) + bc7_set_block_bits(pBlock_bytes, pResults->m_index_selector, 1, &cur_bit_ofs); + + if (total_partitions > 1) + bc7_set_block_bits(pBlock_bytes, pResults->m_partition, (total_partitions == 64) ? 6 : 4, &cur_bit_ofs); + + const uint32_t total_comps = (best_mode >= 4) ? 4 : 3; + for (uint32_t comp = 0; comp < total_comps; comp++) + { + for (uint32_t subset = 0; subset < total_subsets; subset++) + { + bc7_set_block_bits(pBlock_bytes, low[subset].m_c[comp], (comp == 3) ? g_bc7_alpha_precision_table[best_mode] : g_bc7_color_precision_table[best_mode], &cur_bit_ofs); + bc7_set_block_bits(pBlock_bytes, high[subset].m_c[comp], (comp == 3) ? g_bc7_alpha_precision_table[best_mode] : g_bc7_color_precision_table[best_mode], &cur_bit_ofs); + } + } + + if (g_bc7_mode_has_p_bits[best_mode]) + { + for (uint32_t subset = 0; subset < total_subsets; subset++) + { + bc7_set_block_bits(pBlock_bytes, pbits[subset][0], 1, &cur_bit_ofs); + if (!g_bc7_mode_has_shared_p_bits[best_mode]) + bc7_set_block_bits(pBlock_bytes, pbits[subset][1], 1, &cur_bit_ofs); + } + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + int idx = x + y * 4; + + uint32_t n = pResults->m_index_selector ? get_bc7_alpha_index_size(best_mode, pResults->m_index_selector) : get_bc7_color_index_size(best_mode, pResults->m_index_selector); + + if ((idx == anchor[0]) || (idx == anchor[1]) || (idx == anchor[2])) + n--; + + bc7_set_block_bits(pBlock_bytes, pResults->m_index_selector ? alpha_selectors[idx] : color_selectors[idx], n, &cur_bit_ofs); + } + } + + if (get_bc7_mode_has_seperate_alpha_selectors(best_mode)) + { + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + int idx = x + y * 4; + + uint32_t n = pResults->m_index_selector ? get_bc7_color_index_size(best_mode, pResults->m_index_selector) : get_bc7_alpha_index_size(best_mode, pResults->m_index_selector); + + if ((idx == anchor[0]) || (idx == anchor[1]) || (idx == anchor[2])) + n--; + + bc7_set_block_bits(pBlock_bytes, pResults->m_index_selector ? color_selectors[idx] : alpha_selectors[idx], n, &cur_bit_ofs); + } + } + } + + assert(cur_bit_ofs == 128); + } + + // ASTC + static inline void astc_set_bits_1_to_9(uint32_t* pDst, int& bit_offset, uint32_t code, uint32_t codesize) + { + uint8_t* pBuf = reinterpret_cast(pDst); + + assert(codesize <= 9); + if (codesize) + { + uint32_t byte_bit_offset = bit_offset & 7; + uint32_t val = code << byte_bit_offset; + + uint32_t index = bit_offset >> 3; + pBuf[index] |= (uint8_t)val; + + if (codesize > (8 - byte_bit_offset)) + pBuf[index + 1] |= (uint8_t)(val >> 8); + + bit_offset += codesize; + } + } + + void pack_astc_solid_block(void* pDst_block, const color32& color) + { + uint32_t r = color[0], g = color[1], b = color[2]; + uint32_t a = color[3]; + + uint32_t* pOutput = static_cast(pDst_block); + uint8_t* pBytes = reinterpret_cast(pDst_block); + + pBytes[0] = 0xfc; pBytes[1] = 0xfd; pBytes[2] = 0xff; pBytes[3] = 0xff; + + pOutput[1] = 0xffffffff; + pOutput[2] = 0; + pOutput[3] = 0; + + int bit_pos = 64; + astc_set_bits(reinterpret_cast(pDst_block), bit_pos, r | (r << 8), 16); + astc_set_bits(reinterpret_cast(pDst_block), bit_pos, g | (g << 8), 16); + astc_set_bits(reinterpret_cast(pDst_block), bit_pos, b | (b << 8), 16); + astc_set_bits(reinterpret_cast(pDst_block), bit_pos, a | (a << 8), 16); + } + + // See 23.21 https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.inline.html#_partition_pattern_generation +#ifdef _DEBUG + static inline uint32_t astc_hash52(uint32_t v) + { + uint32_t p = v; + p ^= p >> 15; p -= p << 17; p += p << 7; p += p << 4; + p ^= p >> 5; p += p << 16; p ^= p >> 7; p ^= p >> 3; + p ^= p << 6; p ^= p >> 17; + return p; + } + + int astc_compute_texel_partition(int seed, int x, int y, int z, int partitioncount, bool small_block) + { + if (small_block) + { + x <<= 1; y <<= 1; z <<= 1; + } + seed += (partitioncount - 1) * 1024; + uint32_t rnum = astc_hash52(seed); + uint8_t seed1 = rnum & 0xF; + uint8_t seed2 = (rnum >> 4) & 0xF; + uint8_t seed3 = (rnum >> 8) & 0xF; + uint8_t seed4 = (rnum >> 12) & 0xF; + uint8_t seed5 = (rnum >> 16) & 0xF; + uint8_t seed6 = (rnum >> 20) & 0xF; + uint8_t seed7 = (rnum >> 24) & 0xF; + uint8_t seed8 = (rnum >> 28) & 0xF; + uint8_t seed9 = (rnum >> 18) & 0xF; + uint8_t seed10 = (rnum >> 22) & 0xF; + uint8_t seed11 = (rnum >> 26) & 0xF; + uint8_t seed12 = ((rnum >> 30) | (rnum << 2)) & 0xF; + + seed1 *= seed1; seed2 *= seed2; + seed3 *= seed3; seed4 *= seed4; + seed5 *= seed5; seed6 *= seed6; + seed7 *= seed7; seed8 *= seed8; + seed9 *= seed9; seed10 *= seed10; + seed11 *= seed11; seed12 *= seed12; + + int sh1, sh2, sh3; + if (seed & 1) + { + sh1 = (seed & 2 ? 4 : 5); sh2 = (partitioncount == 3 ? 6 : 5); + } + else + { + sh1 = (partitioncount == 3 ? 6 : 5); sh2 = (seed & 2 ? 4 : 5); + } + sh3 = (seed & 0x10) ? sh1 : sh2; + + seed1 >>= sh1; seed2 >>= sh2; seed3 >>= sh1; seed4 >>= sh2; + seed5 >>= sh1; seed6 >>= sh2; seed7 >>= sh1; seed8 >>= sh2; + seed9 >>= sh3; seed10 >>= sh3; seed11 >>= sh3; seed12 >>= sh3; + + int a = seed1 * x + seed2 * y + seed11 * z + (rnum >> 14); + int b = seed3 * x + seed4 * y + seed12 * z + (rnum >> 10); + int c = seed5 * x + seed6 * y + seed9 * z + (rnum >> 6); + int d = seed7 * x + seed8 * y + seed10 * z + (rnum >> 2); + + a &= 0x3F; b &= 0x3F; c &= 0x3F; d &= 0x3F; + + if (partitioncount < 4) d = 0; + if (partitioncount < 3) c = 0; + + if (a >= b && a >= c && a >= d) + return 0; + else if (b >= c && b >= d) + return 1; + else if (c >= d) + return 2; + else + return 3; + } +#endif + + static const uint8_t g_astc_quint_encode[125] = + { + 0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 16, 17, 18, 19, 20, 24, 25, 26, 27, 28, 5, 13, 21, 29, 6, 32, 33, 34, 35, 36, 40, 41, 42, 43, 44, 48, 49, 50, 51, 52, 56, 57, + 58, 59, 60, 37, 45, 53, 61, 14, 64, 65, 66, 67, 68, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 88, 89, 90, 91, 92, 69, 77, 85, 93, 22, 96, 97, 98, 99, 100, 104, + 105, 106, 107, 108, 112, 113, 114, 115, 116, 120, 121, 122, 123, 124, 101, 109, 117, 125, 30, 102, 103, 70, 71, 38, 110, 111, 78, 79, 46, 118, 119, 86, 87, 54, + 126, 127, 94, 95, 62, 39, 47, 55, 63, 31 + }; + + // Encodes 3 values to output, usable for any range that uses quints and bits + static inline void astc_encode_quints(uint32_t* pOutput, const uint8_t* pValues, int& bit_pos, int n) + { + // First extract the trits and the bits from the 5 input values + int quints = 0, bits[3]; + const uint32_t bit_mask = (1 << n) - 1; + for (int i = 0; i < 3; i++) + { + static const int s_muls[3] = { 1, 5, 25 }; + + const int t = pValues[i] >> n; + + quints += t * s_muls[i]; + bits[i] = pValues[i] & bit_mask; + } + + // Encode the quints, by inverting the bit manipulations done by the decoder, converting 3 quints into 7-bits. + // See https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#astc-integer-sequence-encoding + + assert(quints < 125); + const int T = g_astc_quint_encode[quints]; + + // Now interleave the 7 encoded quint bits with the bits to form the encoded output. See table 95-96. + astc_set_bits(pOutput, bit_pos, bits[0] | (astc_extract_bits(T, 0, 2) << n) | (bits[1] << (3 + n)) | (astc_extract_bits(T, 3, 4) << (3 + n * 2)) | + (bits[2] << (5 + n * 2)) | (astc_extract_bits(T, 5, 6) << (5 + n * 3)), 7 + n * 3); + } + + // Packs values using ASTC's BISE to output buffer. + static void astc_pack_bise(uint32_t* pDst, const uint8_t* pSrc_vals, int bit_pos, int num_vals, int range) + { + uint32_t temp[5] = { 0, 0, 0, 0, 0 }; + + const int num_bits = g_astc_bise_range_table[range][0]; + + int group_size = 0; + if (g_astc_bise_range_table[range][1]) + group_size = 5; + else if (g_astc_bise_range_table[range][2]) + group_size = 3; + + if (group_size) + { + // Range has trits or quints - pack each group of 5 or 3 values + const int total_groups = (group_size == 5) ? ((num_vals + 4) / 5) : ((num_vals + 2) / 3); + + for (int group_index = 0; group_index < total_groups; group_index++) + { + uint8_t vals[5] = { 0, 0, 0, 0, 0 }; + + const int limit = basisu::minimum(group_size, num_vals - group_index * group_size); + for (int i = 0; i < limit; i++) + vals[i] = pSrc_vals[group_index * group_size + i]; + + if (group_size == 5) + astc_encode_trits(temp, vals, bit_pos, num_bits); + else + astc_encode_quints(temp, vals, bit_pos, num_bits); + } + } + else + { + for (int i = 0; i < num_vals; i++) + astc_set_bits_1_to_9(temp, bit_pos, pSrc_vals[i], num_bits); + } + + pDst[0] |= temp[0]; pDst[1] |= temp[1]; + pDst[2] |= temp[2]; pDst[3] |= temp[3]; + } + + const uint32_t ASTC_BLOCK_MODE_BITS = 11; + const uint32_t ASTC_PART_BITS = 2; + const uint32_t ASTC_CEM_BITS = 4; + const uint32_t ASTC_PARTITION_INDEX_BITS = 10; + const uint32_t ASTC_CCS_BITS = 2; + + const uint32_t g_uastc_mode_astc_block_mode[TOTAL_UASTC_MODES] = { 0x242, 0x42, 0x53, 0x42, 0x42, 0x53, 0x442, 0x42, 0, 0x42, 0x242, 0x442, 0x53, 0x441, 0x42, 0x242, 0x42, 0x442, 0x253 }; + + bool pack_astc_block(uint32_t* pDst, const astc_block_desc* pBlock, uint32_t uastc_mode) + { + assert(uastc_mode < TOTAL_UASTC_MODES); + uint8_t* pDst_bytes = reinterpret_cast(pDst); + + const int total_weights = pBlock->m_dual_plane ? 32 : 16; + + // Set mode bits - see Table 146-147 + uint32_t mode = g_uastc_mode_astc_block_mode[uastc_mode]; + pDst_bytes[0] = (uint8_t)mode; + pDst_bytes[1] = (uint8_t)(mode >> 8); + + memset(pDst_bytes + 2, 0, 16 - 2); + + int bit_pos = ASTC_BLOCK_MODE_BITS; + + // We only support 1-5 bit weight indices + assert(!g_astc_bise_range_table[pBlock->m_weight_range][1] && !g_astc_bise_range_table[pBlock->m_weight_range][2]); + const int bits_per_weight = g_astc_bise_range_table[pBlock->m_weight_range][0]; + + // See table 143 - PART + astc_set_bits_1_to_9(pDst, bit_pos, pBlock->m_subsets - 1, ASTC_PART_BITS); + + if (pBlock->m_subsets == 1) + astc_set_bits_1_to_9(pDst, bit_pos, pBlock->m_cem, ASTC_CEM_BITS); + else + { + // See table 145 + astc_set_bits(pDst, bit_pos, pBlock->m_partition_seed, ASTC_PARTITION_INDEX_BITS); + + // Table 150 - we assume all CEM's are equal, so write 2 0's along with the CEM + astc_set_bits_1_to_9(pDst, bit_pos, (pBlock->m_cem << 2) & 63, ASTC_CEM_BITS + 2); + } + + if (pBlock->m_dual_plane) + { + const int total_weight_bits = total_weights * bits_per_weight; + + // See Illegal Encodings 23.24 + // https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.inline.html#_illegal_encodings + assert((total_weight_bits >= 24) && (total_weight_bits <= 96)); + + int ccs_bit_pos = 128 - total_weight_bits - ASTC_CCS_BITS; + astc_set_bits_1_to_9(pDst, ccs_bit_pos, pBlock->m_ccs, ASTC_CCS_BITS); + } + + const int num_cem_pairs = (1 + (pBlock->m_cem >> 2)) * pBlock->m_subsets; + assert(num_cem_pairs <= 9); + + astc_pack_bise(pDst, pBlock->m_endpoints, bit_pos, num_cem_pairs * 2, g_uastc_mode_endpoint_ranges[uastc_mode]); + + // Write the weight bits in reverse bit order. + switch (bits_per_weight) + { + case 1: + { + const uint32_t N = 1; + for (int i = 0; i < total_weights; i++) + { + const uint32_t ofs = 128 - N - i; + assert((ofs >> 3) < 16); + pDst_bytes[ofs >> 3] |= (pBlock->m_weights[i] << (ofs & 7)); + } + break; + } + case 2: + { + const uint32_t N = 2; + for (int i = 0; i < total_weights; i++) + { + static const uint8_t s_reverse_bits2[4] = { 0, 2, 1, 3 }; + const uint32_t ofs = 128 - N - (i * N); + assert((ofs >> 3) < 16); + pDst_bytes[ofs >> 3] |= (s_reverse_bits2[pBlock->m_weights[i]] << (ofs & 7)); + } + break; + } + case 3: + { + const uint32_t N = 3; + for (int i = 0; i < total_weights; i++) + { + static const uint8_t s_reverse_bits3[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; + + const uint32_t ofs = 128 - N - (i * N); + const uint32_t rev = s_reverse_bits3[pBlock->m_weights[i]] << (ofs & 7); + + uint32_t index = ofs >> 3; + assert(index < 16); + pDst_bytes[index++] |= rev & 0xFF; + if (index < 16) + pDst_bytes[index++] |= (rev >> 8); + } + break; + } + case 4: + { + const uint32_t N = 4; + for (int i = 0; i < total_weights; i++) + { + static const uint8_t s_reverse_bits4[16] = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 }; + const int ofs = 128 - N - (i * N); + assert(ofs >= 0 && (ofs >> 3) < 16); + pDst_bytes[ofs >> 3] |= (s_reverse_bits4[pBlock->m_weights[i]] << (ofs & 7)); + } + break; + } + case 5: + { + const uint32_t N = 5; + for (int i = 0; i < total_weights; i++) + { + static const uint8_t s_reverse_bits5[32] = { 0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30, 1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31 }; + + const uint32_t ofs = 128 - N - (i * N); + const uint32_t rev = s_reverse_bits5[pBlock->m_weights[i]] << (ofs & 7); + + uint32_t index = ofs >> 3; + assert(index < 16); + pDst_bytes[index++] |= rev & 0xFF; + if (index < 16) + pDst_bytes[index++] |= (rev >> 8); + } + + break; + } + default: + assert(0); + break; + } + + return true; + } + + const uint8_t* get_anchor_indices(uint32_t subsets, uint32_t mode, uint32_t common_pattern, const uint8_t*& pPartition_pattern) + { + const uint8_t* pSubset_anchor_indices = g_zero_pattern; + pPartition_pattern = g_zero_pattern; + + if (subsets >= 2) + { + if (subsets == 3) + { + pPartition_pattern = &g_astc_bc7_patterns3[common_pattern][0]; + pSubset_anchor_indices = &g_astc_bc7_pattern3_anchors[common_pattern][0]; + } + else if (mode == 7) + { + pPartition_pattern = &g_bc7_3_astc2_patterns2[common_pattern][0]; + pSubset_anchor_indices = &g_bc7_3_astc2_patterns2_anchors[common_pattern][0]; + } + else + { + pPartition_pattern = &g_astc_bc7_patterns2[common_pattern][0]; + pSubset_anchor_indices = &g_astc_bc7_pattern2_anchors[common_pattern][0]; + } + } + + return pSubset_anchor_indices; + } + + static inline uint32_t read_bit(const uint8_t* pBuf, uint32_t& bit_offset) + { + uint32_t byte_bits = pBuf[bit_offset >> 3] >> (bit_offset & 7); + bit_offset += 1; + return byte_bits & 1; + } + + static inline uint32_t read_bits1_to_9(const uint8_t* pBuf, uint32_t& bit_offset, uint32_t codesize) + { + assert(codesize <= 9); + if (!codesize) + return 0; + + if ((BASISD_IS_BIG_ENDIAN) || (!BASISD_USE_UNALIGNED_WORD_READS) || (bit_offset >= 112)) + { + const uint8_t* pBytes = &pBuf[bit_offset >> 3U]; + + uint32_t byte_bit_offset = bit_offset & 7U; + + uint32_t bits = pBytes[0] >> byte_bit_offset; + uint32_t bits_read = basisu::minimum(codesize, 8 - byte_bit_offset); + + uint32_t bits_remaining = codesize - bits_read; + if (bits_remaining) + bits |= ((uint32_t)pBytes[1]) << bits_read; + + bit_offset += codesize; + + return bits & ((1U << codesize) - 1U); + } + + uint32_t byte_bit_offset = bit_offset & 7U; + const uint16_t w = *(const uint16_t *)(&pBuf[bit_offset >> 3U]); + bit_offset += codesize; + return (w >> byte_bit_offset) & ((1U << codesize) - 1U); + } + + inline uint64_t read_bits64(const uint8_t* pBuf, uint32_t& bit_offset, uint32_t codesize) + { + assert(codesize <= 64U); + uint64_t bits = 0; + uint32_t total_bits = 0; + + while (total_bits < codesize) + { + uint32_t byte_bit_offset = bit_offset & 7U; + uint32_t bits_to_read = basisu::minimum(codesize - total_bits, 8U - byte_bit_offset); + + uint32_t byte_bits = pBuf[bit_offset >> 3U] >> byte_bit_offset; + byte_bits &= ((1U << bits_to_read) - 1U); + + bits |= ((uint64_t)(byte_bits) << total_bits); + + total_bits += bits_to_read; + bit_offset += bits_to_read; + } + + return bits; + } + + static inline uint32_t read_bits1_to_9_fst(const uint8_t* pBuf, uint32_t& bit_offset, uint32_t codesize) + { + assert(codesize <= 9); + if (!codesize) + return 0; + assert(bit_offset < 112); + + if ((BASISD_IS_BIG_ENDIAN) || (!BASISD_USE_UNALIGNED_WORD_READS)) + { + const uint8_t* pBytes = &pBuf[bit_offset >> 3U]; + + uint32_t byte_bit_offset = bit_offset & 7U; + + uint32_t bits = pBytes[0] >> byte_bit_offset; + uint32_t bits_read = basisu::minimum(codesize, 8 - byte_bit_offset); + + uint32_t bits_remaining = codesize - bits_read; + if (bits_remaining) + bits |= ((uint32_t)pBytes[1]) << bits_read; + + bit_offset += codesize; + + return bits & ((1U << codesize) - 1U); + } + + uint32_t byte_bit_offset = bit_offset & 7U; + const uint16_t w = *(const uint16_t*)(&pBuf[bit_offset >> 3U]); + bit_offset += codesize; + return (w >> byte_bit_offset)& ((1U << codesize) - 1U); + } + + bool unpack_uastc(const uastc_block& blk, unpacked_uastc_block& unpacked, bool blue_contract_check, bool read_hints) + { + //memset(&unpacked, 0, sizeof(unpacked)); + +#if 0 + uint8_t table[128]; + memset(table, 0xFF, sizeof(table)); + + { + for (uint32_t mode = 0; mode <= TOTAL_UASTC_MODES; mode++) + { + const uint32_t code = g_uastc_mode_huff_codes[mode][0]; + const uint32_t codesize = g_uastc_mode_huff_codes[mode][1]; + + table[code] = mode; + + uint32_t bits_left = 7 - codesize; + for (uint32_t i = 0; i < (1 << bits_left); i++) + table[code | (i << codesize)] = mode; + } + + for (uint32_t i = 0; i < 128; i++) + printf("%u,", table[i]); + exit(0); + } +#endif + + const int mode = g_uastc_huff_modes[blk.m_bytes[0] & 127]; + if (mode >= (int)TOTAL_UASTC_MODES) + return false; + + unpacked.m_mode = mode; + + uint32_t bit_ofs = g_uastc_mode_huff_codes[mode][1]; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + unpacked.m_solid_color.r = (uint8_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); + unpacked.m_solid_color.g = (uint8_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); + unpacked.m_solid_color.b = (uint8_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); + unpacked.m_solid_color.a = (uint8_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); + + if (read_hints) + { + unpacked.m_etc1_flip = false; + unpacked.m_etc1_diff = read_bit(blk.m_bytes, bit_ofs) != 0; + unpacked.m_etc1_inten0 = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 3); + unpacked.m_etc1_inten1 = 0; + unpacked.m_etc1_selector = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 2); + unpacked.m_etc1_r = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); + unpacked.m_etc1_g = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); + unpacked.m_etc1_b = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); + unpacked.m_etc1_bias = 0; + unpacked.m_etc2_hints = 0; + } + + return true; + } + + if (read_hints) + { + if (g_uastc_mode_has_bc1_hint0[mode]) + unpacked.m_bc1_hint0 = read_bit(blk.m_bytes, bit_ofs) != 0; + else + unpacked.m_bc1_hint0 = false; + + if (g_uastc_mode_has_bc1_hint1[mode]) + unpacked.m_bc1_hint1 = read_bit(blk.m_bytes, bit_ofs) != 0; + else + unpacked.m_bc1_hint1 = false; + + unpacked.m_etc1_flip = read_bit(blk.m_bytes, bit_ofs) != 0; + unpacked.m_etc1_diff = read_bit(blk.m_bytes, bit_ofs) != 0; + unpacked.m_etc1_inten0 = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 3); + unpacked.m_etc1_inten1 = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 3); + + if (g_uastc_mode_has_etc1_bias[mode]) + unpacked.m_etc1_bias = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); + else + unpacked.m_etc1_bias = 0; + + if (g_uastc_mode_has_alpha[mode]) + { + unpacked.m_etc2_hints = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); + //assert(unpacked.m_etc2_hints > 0); + } + else + unpacked.m_etc2_hints = 0; + } + else + bit_ofs += g_uastc_mode_total_hint_bits[mode]; + + uint32_t subsets = 1; + switch (mode) + { + case 2: + case 4: + case 7: + case 9: + case 16: + unpacked.m_common_pattern = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); + subsets = 2; + break; + case 3: + unpacked.m_common_pattern = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 4); + subsets = 3; + break; + default: + break; + } + + uint32_t part_seed = 0; + switch (mode) + { + case 2: + case 4: + case 9: + case 16: + if (unpacked.m_common_pattern >= TOTAL_ASTC_BC7_COMMON_PARTITIONS2) + return false; + + part_seed = g_astc_bc7_common_partitions2[unpacked.m_common_pattern].m_astc; + break; + case 3: + if (unpacked.m_common_pattern >= TOTAL_ASTC_BC7_COMMON_PARTITIONS3) + return false; + + part_seed = g_astc_bc7_common_partitions3[unpacked.m_common_pattern].m_astc; + break; + case 7: + if (unpacked.m_common_pattern >= TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS) + return false; + + part_seed = g_bc7_3_astc2_common_partitions[unpacked.m_common_pattern].m_astc2; + break; + default: + break; + } + + uint32_t total_planes = 1; + switch (mode) + { + case 6: + case 11: + case 13: + unpacked.m_astc.m_ccs = (int)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 2); + total_planes = 2; + break; + case 17: + unpacked.m_astc.m_ccs = 3; + total_planes = 2; + break; + default: + break; + } + + unpacked.m_astc.m_dual_plane = (total_planes == 2); + + unpacked.m_astc.m_subsets = subsets; + unpacked.m_astc.m_partition_seed = part_seed; + + const uint32_t total_comps = g_uastc_mode_comps[mode]; + + const uint32_t weight_bits = g_uastc_mode_weight_bits[mode]; + + unpacked.m_astc.m_weight_range = g_uastc_mode_weight_ranges[mode]; + + const uint32_t total_values = total_comps * 2 * subsets; + const uint32_t endpoint_range = g_uastc_mode_endpoint_ranges[mode]; + + const uint32_t cem = g_uastc_mode_cem[mode]; + unpacked.m_astc.m_cem = cem; + + const uint32_t ep_bits = g_astc_bise_range_table[endpoint_range][0]; + const uint32_t ep_trits = g_astc_bise_range_table[endpoint_range][1]; + const uint32_t ep_quints = g_astc_bise_range_table[endpoint_range][2]; + + uint32_t total_tqs = 0; + uint32_t bundle_size = 0, mul = 0; + if (ep_trits) + { + total_tqs = (total_values + 4) / 5; + bundle_size = 5; + mul = 3; + } + else if (ep_quints) + { + total_tqs = (total_values + 2) / 3; + bundle_size = 3; + mul = 5; + } + + uint32_t tq_values[8]; + for (uint32_t i = 0; i < total_tqs; i++) + { + uint32_t num_bits = ep_trits ? 8 : 7; + if (i == (total_tqs - 1)) + { + uint32_t num_remaining = total_values - (total_tqs - 1) * bundle_size; + if (ep_trits) + { + switch (num_remaining) + { + case 1: num_bits = 2; break; + case 2: num_bits = 4; break; + case 3: num_bits = 5; break; + case 4: num_bits = 7; break; + default: break; + } + } + else if (ep_quints) + { + switch (num_remaining) + { + case 1: num_bits = 3; break; + case 2: num_bits = 5; break; + default: break; + } + } + } + + tq_values[i] = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, num_bits); + } // i + + uint32_t accum = 0; + uint32_t accum_remaining = 0; + uint32_t next_tq_index = 0; + + for (uint32_t i = 0; i < total_values; i++) + { + uint32_t value = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, ep_bits); + + if (total_tqs) + { + if (!accum_remaining) + { + assert(next_tq_index < total_tqs); + accum = tq_values[next_tq_index++]; + accum_remaining = bundle_size; + } + + // TODO: Optimize with tables + uint32_t v = accum % mul; + accum /= mul; + accum_remaining--; + + value |= (v << ep_bits); + } + + unpacked.m_astc.m_endpoints[i] = (uint8_t)value; + } + + const uint8_t* pPartition_pattern; + const uint8_t* pSubset_anchor_indices = get_anchor_indices(subsets, mode, unpacked.m_common_pattern, pPartition_pattern); + +#ifdef _DEBUG + for (uint32_t i = 0; i < 16; i++) + assert(pPartition_pattern[i] == astc_compute_texel_partition(part_seed, i & 3, i >> 2, 0, subsets, true)); + + for (uint32_t subset_index = 0; subset_index < subsets; subset_index++) + { + uint32_t anchor_index = 0; + + for (uint32_t i = 0; i < 16; i++) + { + if (pPartition_pattern[i] == subset_index) + { + anchor_index = i; + break; + } + } + + assert(pSubset_anchor_indices[subset_index] == anchor_index); + } +#endif + +#if 0 + const uint32_t total_planes_shift = total_planes - 1; + for (uint32_t i = 0; i < 16 * total_planes; i++) + { + uint32_t num_bits = weight_bits; + for (uint32_t s = 0; s < subsets; s++) + { + if (pSubset_anchor_indices[s] == (i >> total_planes_shift)) + { + num_bits--; + break; + } + } + + unpacked.m_astc.m_weights[i] = (uint8_t)read_bits1_to_9(blk.m_bytes, bit_ofs, num_bits); + } +#endif + + if (mode == 18) + { + // Mode 18 is the only mode with more than 64 weight bits. + for (uint32_t i = 0; i < 16; i++) + unpacked.m_astc.m_weights[i] = (uint8_t)read_bits1_to_9(blk.m_bytes, bit_ofs, i ? weight_bits : (weight_bits - 1)); + } + else + { + // All other modes have <= 64 weight bits. + uint64_t bits; + + // Read the weight bits + if ((BASISD_IS_BIG_ENDIAN) || (!BASISD_USE_UNALIGNED_WORD_READS)) + bits = read_bits64(blk.m_bytes, bit_ofs, basisu::minimum(64, 128 - (int)bit_ofs)); + else + { +#ifdef __EMSCRIPTEN__ + bits = blk.m_dwords[2]; + bits |= (((uint64_t)blk.m_dwords[3]) << 32U); +#else + bits = blk.m_qwords[1]; +#endif + + if (bit_ofs >= 64U) + bits >>= (bit_ofs - 64U); + else + { + assert(bit_ofs >= 56U); + + uint32_t bits_needed = 64U - bit_ofs; + bits <<= bits_needed; + bits |= (blk.m_bytes[7] >> (8U - bits_needed)); + } + } + + bit_ofs = 0; + + const uint32_t mask = (1U << weight_bits) - 1U; + const uint32_t anchor_mask = (1U << (weight_bits - 1U)) - 1U; + + if (total_planes == 2) + { + // Dual plane modes always have a single subset, and the first 2 weights are anchors. + + unpacked.m_astc.m_weights[0] = (uint8_t)((uint32_t)(bits >> bit_ofs) & anchor_mask); + bit_ofs += (weight_bits - 1); + + unpacked.m_astc.m_weights[1] = (uint8_t)((uint32_t)(bits >> bit_ofs) & anchor_mask); + bit_ofs += (weight_bits - 1); + + for (uint32_t i = 2; i < 32; i++) + { + unpacked.m_astc.m_weights[i] = (uint8_t)((uint32_t)(bits >> bit_ofs) & mask); + bit_ofs += weight_bits; + } + } + else + { + if (subsets == 1) + { + // Specialize the single subset case. + if (weight_bits == 4) + { + assert(bit_ofs == 0); + + // Specialize the most common case: 4-bit weights. + unpacked.m_astc.m_weights[0] = (uint8_t)((uint32_t)(bits) & 7); + unpacked.m_astc.m_weights[1] = (uint8_t)((uint32_t)(bits >> 3) & 15); + unpacked.m_astc.m_weights[2] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 1)) & 15); + unpacked.m_astc.m_weights[3] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 2)) & 15); + + unpacked.m_astc.m_weights[4] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 3)) & 15); + unpacked.m_astc.m_weights[5] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 4)) & 15); + unpacked.m_astc.m_weights[6] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 5)) & 15); + unpacked.m_astc.m_weights[7] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 6)) & 15); + + unpacked.m_astc.m_weights[8] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 7)) & 15); + unpacked.m_astc.m_weights[9] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 8)) & 15); + unpacked.m_astc.m_weights[10] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 9)) & 15); + unpacked.m_astc.m_weights[11] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 10)) & 15); + + unpacked.m_astc.m_weights[12] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 11)) & 15); + unpacked.m_astc.m_weights[13] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 12)) & 15); + unpacked.m_astc.m_weights[14] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 13)) & 15); + unpacked.m_astc.m_weights[15] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 14)) & 15); + } + else + { + // First weight is always an anchor. + unpacked.m_astc.m_weights[0] = (uint8_t)((uint32_t)(bits >> bit_ofs) & anchor_mask); + bit_ofs += (weight_bits - 1); + + for (uint32_t i = 1; i < 16; i++) + { + unpacked.m_astc.m_weights[i] = (uint8_t)((uint32_t)(bits >> bit_ofs) & mask); + bit_ofs += weight_bits; + } + } + } + else + { + const uint32_t a0 = pSubset_anchor_indices[0], a1 = pSubset_anchor_indices[1], a2 = pSubset_anchor_indices[2]; + + for (uint32_t i = 0; i < 16; i++) + { + if ((i == a0) || (i == a1) || (i == a2)) + { + unpacked.m_astc.m_weights[i] = (uint8_t)((uint32_t)(bits >> bit_ofs) & anchor_mask); + bit_ofs += (weight_bits - 1); + } + else + { + unpacked.m_astc.m_weights[i] = (uint8_t)((uint32_t)(bits >> bit_ofs) & mask); + bit_ofs += weight_bits; + } + } + } + } + } + + if ((blue_contract_check) && (total_comps >= 3)) + { + // We only need to disable ASTC Blue Contraction when we'll be packing to ASTC. The other transcoders don't care. + bool invert_subset[3] = { false, false, false }; + bool any_flag = false; + + for (uint32_t subset_index = 0; subset_index < subsets; subset_index++) + { + const int s0 = g_astc_unquant[endpoint_range][unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + 0]].m_unquant + + g_astc_unquant[endpoint_range][unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + 2]].m_unquant + + g_astc_unquant[endpoint_range][unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + 4]].m_unquant; + + const int s1 = g_astc_unquant[endpoint_range][unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + 1]].m_unquant + + g_astc_unquant[endpoint_range][unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + 3]].m_unquant + + g_astc_unquant[endpoint_range][unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + 5]].m_unquant; + + if (s1 < s0) + { + for (uint32_t c = 0; c < total_comps; c++) + std::swap(unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + c * 2 + 0], unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + c * 2 + 1]); + + invert_subset[subset_index] = true; + any_flag = true; + } + } + + if (any_flag) + { + const uint32_t weight_mask = (1 << weight_bits) - 1; + + for (uint32_t i = 0; i < 16; i++) + { + uint32_t subset = pPartition_pattern[i]; + + if (invert_subset[subset]) + { + unpacked.m_astc.m_weights[i * total_planes] = (uint8_t)(weight_mask - unpacked.m_astc.m_weights[i * total_planes]); + + if (total_planes == 2) + unpacked.m_astc.m_weights[i * total_planes + 1] = (uint8_t)(weight_mask - unpacked.m_astc.m_weights[i * total_planes + 1]); + } + } + } + } + + return true; + } + + static const uint32_t* g_astc_weight_tables[6] = { nullptr, g_bc7_weights1, g_bc7_weights2, g_bc7_weights3, g_astc_weights4, g_astc_weights5 }; + + bool unpack_uastc(uint32_t mode, uint32_t common_pattern, const color32& solid_color, const astc_block_desc& astc, color32* pPixels, bool srgb) + { + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + for (uint32_t i = 0; i < 16; i++) + pPixels[i] = solid_color; + return true; + } + + color32 endpoints[3][2]; + + const uint32_t total_subsets = g_uastc_mode_subsets[mode]; + const uint32_t total_comps = basisu::minimum(4U, g_uastc_mode_comps[mode]); + const uint32_t endpoint_range = g_uastc_mode_endpoint_ranges[mode]; + const uint32_t total_planes = g_uastc_mode_planes[mode]; + const uint32_t weight_bits = g_uastc_mode_weight_bits[mode]; + const uint32_t weight_levels = 1 << weight_bits; + + for (uint32_t subset_index = 0; subset_index < total_subsets; subset_index++) + { + if (total_comps == 2) + { + const uint32_t ll = g_astc_unquant[endpoint_range][astc.m_endpoints[subset_index * total_comps * 2 + 0 * 2 + 0]].m_unquant; + const uint32_t lh = g_astc_unquant[endpoint_range][astc.m_endpoints[subset_index * total_comps * 2 + 0 * 2 + 1]].m_unquant; + + const uint32_t al = g_astc_unquant[endpoint_range][astc.m_endpoints[subset_index * total_comps * 2 + 1 * 2 + 0]].m_unquant; + const uint32_t ah = g_astc_unquant[endpoint_range][astc.m_endpoints[subset_index * total_comps * 2 + 1 * 2 + 1]].m_unquant; + + endpoints[subset_index][0].set_noclamp_rgba(ll, ll, ll, al); + endpoints[subset_index][1].set_noclamp_rgba(lh, lh, lh, ah); + } + else + { + for (uint32_t comp_index = 0; comp_index < total_comps; comp_index++) + { + endpoints[subset_index][0][comp_index] = g_astc_unquant[endpoint_range][astc.m_endpoints[subset_index * total_comps * 2 + comp_index * 2 + 0]].m_unquant; + endpoints[subset_index][1][comp_index] = g_astc_unquant[endpoint_range][astc.m_endpoints[subset_index * total_comps * 2 + comp_index * 2 + 1]].m_unquant; + } + for (uint32_t comp_index = total_comps; comp_index < 4; comp_index++) + { + endpoints[subset_index][0][comp_index] = 255; + endpoints[subset_index][1][comp_index] = 255; + } + } + } + + color32 block_colors[3][32]; + + const uint32_t* pWeights = g_astc_weight_tables[weight_bits]; + + for (uint32_t subset_index = 0; subset_index < total_subsets; subset_index++) + { + for (uint32_t l = 0; l < weight_levels; l++) + { + if (total_comps == 2) + { + const uint8_t lc = (uint8_t)astc_interpolate(endpoints[subset_index][0][0], endpoints[subset_index][1][0], pWeights[l], srgb); + const uint8_t ac = (uint8_t)astc_interpolate(endpoints[subset_index][0][3], endpoints[subset_index][1][3], pWeights[l], srgb); + + block_colors[subset_index][l].set(lc, lc, lc, ac); + } + else + { + uint32_t comp_index; + for (comp_index = 0; comp_index < total_comps; comp_index++) + block_colors[subset_index][l][comp_index] = (uint8_t)astc_interpolate(endpoints[subset_index][0][comp_index], endpoints[subset_index][1][comp_index], pWeights[l], srgb); + + for (; comp_index < 4; comp_index++) + block_colors[subset_index][l][comp_index] = 255; + } + } + } + + const uint8_t* pPartition_pattern = g_zero_pattern; + + if (total_subsets >= 2) + { + if (total_subsets == 3) + pPartition_pattern = &g_astc_bc7_patterns3[common_pattern][0]; + else if (mode == 7) + pPartition_pattern = &g_bc7_3_astc2_patterns2[common_pattern][0]; + else + pPartition_pattern = &g_astc_bc7_patterns2[common_pattern][0]; + +#ifdef _DEBUG + for (uint32_t i = 0; i < 16; i++) + { + assert(pPartition_pattern[i] == (uint8_t)astc_compute_texel_partition(astc.m_partition_seed, i & 3, i >> 2, 0, total_subsets, true)); + } +#endif + } + + if (total_planes == 1) + { + if (total_subsets == 1) + { + for (uint32_t i = 0; i < 16; i++) + { + assert(astc.m_weights[i] < weight_levels); + pPixels[i] = block_colors[0][astc.m_weights[i]]; + } + } + else + { + for (uint32_t i = 0; i < 16; i++) + { + assert(astc.m_weights[i] < weight_levels); + pPixels[i] = block_colors[pPartition_pattern[i]][astc.m_weights[i]]; + } + } + } + else + { + assert(total_subsets == 1); + + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t subset_index = 0; // pPartition_pattern[i]; + + const uint32_t weight_index0 = astc.m_weights[i * 2]; + const uint32_t weight_index1 = astc.m_weights[i * 2 + 1]; + + assert(weight_index0 < weight_levels && weight_index1 < weight_levels); + + color32& c = pPixels[i]; + for (uint32_t comp = 0; comp < 4; comp++) + { + if ((int)comp == astc.m_ccs) + c[comp] = block_colors[subset_index][weight_index1][comp]; + else + c[comp] = block_colors[subset_index][weight_index0][comp]; + } + } + } + + return true; + } + + bool unpack_uastc(const unpacked_uastc_block& unpacked_blk, color32* pPixels, bool srgb) + { + return unpack_uastc(unpacked_blk.m_mode, unpacked_blk.m_common_pattern, unpacked_blk.m_solid_color, unpacked_blk.m_astc, pPixels, srgb); + } + + bool unpack_uastc(const uastc_block& blk, color32* pPixels, bool srgb) + { + unpacked_uastc_block unpacked_blk; + + if (!unpack_uastc(blk, unpacked_blk, false, false)) + return false; + + return unpack_uastc(unpacked_blk, pPixels, srgb); + } + + // Determines the best shared pbits to use to encode xl/xh + static void determine_shared_pbits( + uint32_t total_comps, uint32_t comp_bits, float xl[4], float xh[4], + color_quad_u8& bestMinColor, color_quad_u8& bestMaxColor, uint32_t best_pbits[2]) + { + const uint32_t total_bits = comp_bits + 1; + assert(total_bits >= 4 && total_bits <= 8); + + const int iscalep = (1 << total_bits) - 1; + const float scalep = (float)iscalep; + + float best_err = 1e+9f; + + for (int p = 0; p < 2; p++) + { + color_quad_u8 xMinColor, xMaxColor; + for (uint32_t c = 0; c < 4; c++) + { + xMinColor.m_c[c] = (uint8_t)(clampi(((int)((xl[c] * scalep - p) / 2.0f + .5f)) * 2 + p, p, iscalep - 1 + p)); + xMaxColor.m_c[c] = (uint8_t)(clampi(((int)((xh[c] * scalep - p) / 2.0f + .5f)) * 2 + p, p, iscalep - 1 + p)); + } + + color_quad_u8 scaledLow, scaledHigh; + + for (uint32_t i = 0; i < 4; i++) + { + scaledLow.m_c[i] = (xMinColor.m_c[i] << (8 - total_bits)); + scaledLow.m_c[i] |= (scaledLow.m_c[i] >> total_bits); + assert(scaledLow.m_c[i] <= 255); + + scaledHigh.m_c[i] = (xMaxColor.m_c[i] << (8 - total_bits)); + scaledHigh.m_c[i] |= (scaledHigh.m_c[i] >> total_bits); + assert(scaledHigh.m_c[i] <= 255); + } + + float err = 0; + for (uint32_t i = 0; i < total_comps; i++) + err += basisu::squaref((scaledLow.m_c[i] / 255.0f) - xl[i]) + basisu::squaref((scaledHigh.m_c[i] / 255.0f) - xh[i]); + + if (err < best_err) + { + best_err = err; + best_pbits[0] = p; + best_pbits[1] = p; + for (uint32_t j = 0; j < 4; j++) + { + bestMinColor.m_c[j] = xMinColor.m_c[j] >> 1; + bestMaxColor.m_c[j] = xMaxColor.m_c[j] >> 1; + } + } + } + } + + // Determines the best unique pbits to use to encode xl/xh + static void determine_unique_pbits( + uint32_t total_comps, uint32_t comp_bits, float xl[4], float xh[4], + color_quad_u8& bestMinColor, color_quad_u8& bestMaxColor, uint32_t best_pbits[2]) + { + const uint32_t total_bits = comp_bits + 1; + const int iscalep = (1 << total_bits) - 1; + const float scalep = (float)iscalep; + + float best_err0 = 1e+9f; + float best_err1 = 1e+9f; + + for (int p = 0; p < 2; p++) + { + color_quad_u8 xMinColor, xMaxColor; + + for (uint32_t c = 0; c < 4; c++) + { + xMinColor.m_c[c] = (uint8_t)(clampi(((int)((xl[c] * scalep - p) / 2.0f + .5f)) * 2 + p, p, iscalep - 1 + p)); + xMaxColor.m_c[c] = (uint8_t)(clampi(((int)((xh[c] * scalep - p) / 2.0f + .5f)) * 2 + p, p, iscalep - 1 + p)); + } + + color_quad_u8 scaledLow, scaledHigh; + for (uint32_t i = 0; i < 4; i++) + { + scaledLow.m_c[i] = (xMinColor.m_c[i] << (8 - total_bits)); + scaledLow.m_c[i] |= (scaledLow.m_c[i] >> total_bits); + assert(scaledLow.m_c[i] <= 255); + + scaledHigh.m_c[i] = (xMaxColor.m_c[i] << (8 - total_bits)); + scaledHigh.m_c[i] |= (scaledHigh.m_c[i] >> total_bits); + assert(scaledHigh.m_c[i] <= 255); + } + + float err0 = 0, err1 = 0; + for (uint32_t i = 0; i < total_comps; i++) + { + err0 += basisu::squaref(scaledLow.m_c[i] - xl[i] * 255.0f); + err1 += basisu::squaref(scaledHigh.m_c[i] - xh[i] * 255.0f); + } + + if (err0 < best_err0) + { + best_err0 = err0; + best_pbits[0] = p; + + bestMinColor.m_c[0] = xMinColor.m_c[0] >> 1; + bestMinColor.m_c[1] = xMinColor.m_c[1] >> 1; + bestMinColor.m_c[2] = xMinColor.m_c[2] >> 1; + bestMinColor.m_c[3] = xMinColor.m_c[3] >> 1; + } + + if (err1 < best_err1) + { + best_err1 = err1; + best_pbits[1] = p; + + bestMaxColor.m_c[0] = xMaxColor.m_c[0] >> 1; + bestMaxColor.m_c[1] = xMaxColor.m_c[1] >> 1; + bestMaxColor.m_c[2] = xMaxColor.m_c[2] >> 1; + bestMaxColor.m_c[3] = xMaxColor.m_c[3] >> 1; + } + } + } + + bool transcode_uastc_to_astc(const uastc_block& src_blk, void* pDst) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, true, false)) + return false; + + bool success = false; + if (unpacked_src_blk.m_mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + pack_astc_solid_block(pDst, unpacked_src_blk.m_solid_color); + success = true; + } + else + { + success = pack_astc_block(static_cast(pDst), &unpacked_src_blk.m_astc, unpacked_src_blk.m_mode); + } + + return success; + } + + bool transcode_uastc_to_bc7(const unpacked_uastc_block& unpacked_src_blk, bc7_optimization_results& dst_blk) + { + memset(&dst_blk, 0, sizeof(dst_blk)); + + const uint32_t mode = unpacked_src_blk.m_mode; + + const uint32_t endpoint_range = g_uastc_mode_endpoint_ranges[mode]; + const uint32_t total_comps = g_uastc_mode_comps[mode]; + + switch (mode) + { + case 0: + case 5: + case 10: + case 12: + case 14: + case 15: + case 18: + { + // MODE 0: DualPlane: 0, WeightRange: 8 (16), Subsets: 1, EndpointRange: 19 (192) - BC7 MODE6 RGB + // MODE 5: DualPlane: 0, WeightRange : 5 (8), Subsets : 1, EndpointRange : 20 (256) - BC7 MODE6 RGB + // MODE 10 DualPlane: 0, WeightRange: 8 (16), Subsets: 1, EndpointRange: 13 (48) - BC7 MODE6 + // MODE 12: DualPlane: 0, WeightRange : 5 (8), Subsets : 1, EndpointRange : 19 (192) - BC7 MODE6 + // MODE 14: DualPlane: 0, WeightRange : 2 (4), Subsets : 1, EndpointRange : 20 (256) - BC7 MODE6 + // MODE 18: DualPlane: 0, WeightRange : 11 (32), Subsets : 1, CEM : 8, EndpointRange : 11 (32) - BC7 MODE6 + // MODE 15: DualPlane: 0, WeightRange : 8 (16), Subsets : 1, CEM : 4 (LA Direct), EndpointRange : 20 (256) - BC7 MODE6 + dst_blk.m_mode = 6; + + float xl[4], xh[4]; + if (total_comps == 2) + { + xl[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[0]].m_unquant / 255.0f; + xh[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[1]].m_unquant / 255.0f; + + xl[1] = xl[0]; + xh[1] = xh[0]; + + xl[2] = xl[0]; + xh[2] = xh[0]; + + xl[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[2]].m_unquant / 255.0f; + xh[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[3]].m_unquant / 255.0f; + } + else + { + xl[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[0]].m_unquant / 255.0f; + xl[1] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[2]].m_unquant / 255.0f; + xl[2] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[4]].m_unquant / 255.0f; + + xh[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[1]].m_unquant / 255.0f; + xh[1] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[3]].m_unquant / 255.0f; + xh[2] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[5]].m_unquant / 255.0f; + + if (total_comps == 4) + { + xl[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[6]].m_unquant / 255.0f; + xh[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[7]].m_unquant / 255.0f; + } + else + { + xl[3] = 1.0f; + xh[3] = 1.0f; + } + } + + uint32_t best_pbits[2]; + color_quad_u8 bestMinColor, bestMaxColor; + determine_unique_pbits((total_comps == 2) ? 4 : total_comps, 7, xl, xh, bestMinColor, bestMaxColor, best_pbits); + + dst_blk.m_low[0] = bestMinColor; + dst_blk.m_high[0] = bestMaxColor; + + if (total_comps == 3) + { + dst_blk.m_low[0].m_c[3] = 127; + dst_blk.m_high[0].m_c[3] = 127; + } + + dst_blk.m_pbits[0][0] = best_pbits[0]; + dst_blk.m_pbits[0][1] = best_pbits[1]; + + if (mode == 18) + { + const uint8_t s_bc7_5_to_4[32] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15 }; + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = s_bc7_5_to_4[unpacked_src_blk.m_astc.m_weights[i]]; + } + else if (mode == 14) + { + const uint8_t s_bc7_2_to_4[4] = { 0, 5, 10, 15 }; + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = s_bc7_2_to_4[unpacked_src_blk.m_astc.m_weights[i]]; + } + else if ((mode == 5) || (mode == 12)) + { + const uint8_t s_bc7_3_to_4[8] = { 0, 2, 4, 6, 9, 11, 13, 15 }; + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = s_bc7_3_to_4[unpacked_src_blk.m_astc.m_weights[i]]; + } + else + { + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + } + + break; + } + case 1: + { + // DualPlane: 0, WeightRange : 2 (4), Subsets : 1, EndpointRange : 20 (256) - BC7 MODE3 + // Mode 1 uses endpoint range 20 - no need to use ASTC dequant tables. + dst_blk.m_mode = 3; + + float xl[4], xh[4]; + xl[0] = unpacked_src_blk.m_astc.m_endpoints[0] / 255.0f; + xl[1] = unpacked_src_blk.m_astc.m_endpoints[2] / 255.0f; + xl[2] = unpacked_src_blk.m_astc.m_endpoints[4] / 255.0f; + xl[3] = 1.0f; + + xh[0] = unpacked_src_blk.m_astc.m_endpoints[1] / 255.0f; + xh[1] = unpacked_src_blk.m_astc.m_endpoints[3] / 255.0f; + xh[2] = unpacked_src_blk.m_astc.m_endpoints[5] / 255.0f; + xh[3] = 1.0f; + + uint32_t best_pbits[2]; + color_quad_u8 bestMinColor, bestMaxColor; + memset(&bestMinColor, 0, sizeof(bestMinColor)); + memset(&bestMaxColor, 0, sizeof(bestMaxColor)); + determine_unique_pbits(3, 7, xl, xh, bestMinColor, bestMaxColor, best_pbits); + + for (uint32_t i = 0; i < 3; i++) + { + dst_blk.m_low[0].m_c[i] = bestMinColor.m_c[i]; + dst_blk.m_high[0].m_c[i] = bestMaxColor.m_c[i]; + dst_blk.m_low[1].m_c[i] = bestMinColor.m_c[i]; + dst_blk.m_high[1].m_c[i] = bestMaxColor.m_c[i]; + } + dst_blk.m_pbits[0][0] = best_pbits[0]; + dst_blk.m_pbits[0][1] = best_pbits[1]; + dst_blk.m_pbits[1][0] = best_pbits[0]; + dst_blk.m_pbits[1][1] = best_pbits[1]; + + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + + break; + } + case 2: + { + // 2. DualPlane: 0, WeightRange : 5 (8), Subsets : 2, EndpointRange : 8 (16) - BC7 MODE1 + dst_blk.m_mode = 1; + dst_blk.m_partition = g_astc_bc7_common_partitions2[unpacked_src_blk.m_common_pattern].m_bc7; + + const bool invert_partition = g_astc_bc7_common_partitions2[unpacked_src_blk.m_common_pattern].m_invert; + + float xl[4], xh[4]; + xl[3] = 1.0f; + xh[3] = 1.0f; + + for (uint32_t subset = 0; subset < 2; subset++) + { + for (uint32_t i = 0; i < 3; i++) + { + uint32_t v = unpacked_src_blk.m_astc.m_endpoints[i * 2 + subset * 6]; + v = (v << 4) | v; + xl[i] = v / 255.0f; + + v = unpacked_src_blk.m_astc.m_endpoints[i * 2 + subset * 6 + 1]; + v = (v << 4) | v; + xh[i] = v / 255.0f; + } + + uint32_t best_pbits[2] = { 0, 0 }; + color_quad_u8 bestMinColor, bestMaxColor; + memset(&bestMinColor, 0, sizeof(bestMinColor)); + memset(&bestMaxColor, 0, sizeof(bestMaxColor)); + determine_shared_pbits(3, 6, xl, xh, bestMinColor, bestMaxColor, best_pbits); + + const uint32_t bc7_subset_index = invert_partition ? (1 - subset) : subset; + + for (uint32_t i = 0; i < 3; i++) + { + dst_blk.m_low[bc7_subset_index].m_c[i] = bestMinColor.m_c[i]; + dst_blk.m_high[bc7_subset_index].m_c[i] = bestMaxColor.m_c[i]; + } + + dst_blk.m_pbits[bc7_subset_index][0] = best_pbits[0]; + } // subset + + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + + break; + } + case 3: + { + // DualPlane: 0, WeightRange : 2 (4), Subsets : 3, EndpointRange : 7 (12) - BC7 MODE2 + dst_blk.m_mode = 2; + dst_blk.m_partition = g_astc_bc7_common_partitions3[unpacked_src_blk.m_common_pattern].m_bc7; + + const uint32_t perm = g_astc_bc7_common_partitions3[unpacked_src_blk.m_common_pattern].m_astc_to_bc7_perm; + + for (uint32_t subset = 0; subset < 3; subset++) + { + for (uint32_t comp = 0; comp < 3; comp++) + { + uint32_t lo = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[comp * 2 + 0 + subset * 6]].m_unquant; + uint32_t hi = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[comp * 2 + 1 + subset * 6]].m_unquant; + + // TODO: I think this can be improved by using tables like Basis Universal does with ETC1S conversion. + lo = (lo * 31 + 127) / 255; + hi = (hi * 31 + 127) / 255; + + const uint32_t bc7_subset_index = g_astc_to_bc7_partition_index_perm_tables[perm][subset]; + + dst_blk.m_low[bc7_subset_index].m_c[comp] = (uint8_t)lo; + dst_blk.m_high[bc7_subset_index].m_c[comp] = (uint8_t)hi; + } + } + + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + + break; + } + case 4: + { + // 4. DualPlane: 0, WeightRange: 2 (4), Subsets: 2, EndpointRange: 12 (40) - BC7 MODE3 + dst_blk.m_mode = 3; + dst_blk.m_partition = g_astc_bc7_common_partitions2[unpacked_src_blk.m_common_pattern].m_bc7; + + const bool invert_partition = g_astc_bc7_common_partitions2[unpacked_src_blk.m_common_pattern].m_invert; + + float xl[4], xh[4]; + xl[3] = 1.0f; + xh[3] = 1.0f; + + for (uint32_t subset = 0; subset < 2; subset++) + { + for (uint32_t i = 0; i < 3; i++) + { + xl[i] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[i * 2 + subset * 6]].m_unquant / 255.0f; + xh[i] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[i * 2 + subset * 6 + 1]].m_unquant / 255.0f; + } + + uint32_t best_pbits[2] = { 0, 0 }; + color_quad_u8 bestMinColor, bestMaxColor; + memset(&bestMinColor, 0, sizeof(bestMinColor)); + memset(&bestMaxColor, 0, sizeof(bestMaxColor)); + determine_unique_pbits(3, 7, xl, xh, bestMinColor, bestMaxColor, best_pbits); + + const uint32_t bc7_subset_index = invert_partition ? (1 - subset) : subset; + + for (uint32_t i = 0; i < 3; i++) + { + dst_blk.m_low[bc7_subset_index].m_c[i] = bestMinColor.m_c[i]; + dst_blk.m_high[bc7_subset_index].m_c[i] = bestMaxColor.m_c[i]; + } + dst_blk.m_low[bc7_subset_index].m_c[3] = 127; + dst_blk.m_high[bc7_subset_index].m_c[3] = 127; + + dst_blk.m_pbits[bc7_subset_index][0] = best_pbits[0]; + dst_blk.m_pbits[bc7_subset_index][1] = best_pbits[1]; + + } // subset + + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + + break; + } + case 6: + case 11: + case 13: + case 17: + { + // MODE 6: DualPlane: 1, WeightRange : 2 (4), Subsets : 1, EndpointRange : 18 (160) - BC7 MODE5 RGB + // MODE 11: DualPlane: 1, WeightRange: 2 (4), Subsets: 1, EndpointRange: 13 (48) - BC7 MODE5 + // MODE 13: DualPlane: 1, WeightRange: 0 (2), Subsets : 1, EndpointRange : 20 (256) - BC7 MODE5 + // MODE 17: DualPlane: 1, WeightRange: 2 (4), Subsets: 1, CEM: 4 (LA Direct), EndpointRange: 20 (256) - BC7 MODE5 + dst_blk.m_mode = 5; + dst_blk.m_rotation = (unpacked_src_blk.m_astc.m_ccs + 1) & 3; + + if (total_comps == 2) + { + assert(unpacked_src_blk.m_astc.m_ccs == 3); + + dst_blk.m_low->m_c[0] = (uint8_t)((g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[0]].m_unquant * 127 + 127) / 255); + dst_blk.m_high->m_c[0] = (uint8_t)((g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[1]].m_unquant * 127 + 127) / 255); + + dst_blk.m_low->m_c[1] = dst_blk.m_low->m_c[0]; + dst_blk.m_high->m_c[1] = dst_blk.m_high->m_c[0]; + + dst_blk.m_low->m_c[2] = dst_blk.m_low->m_c[0]; + dst_blk.m_high->m_c[2] = dst_blk.m_high->m_c[0]; + + dst_blk.m_low->m_c[3] = (uint8_t)(g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[2]].m_unquant); + dst_blk.m_high->m_c[3] = (uint8_t)(g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[3]].m_unquant); + } + else + { + for (uint32_t astc_comp = 0; astc_comp < 4; astc_comp++) + { + uint32_t bc7_comp = astc_comp; + // ASTC and BC7 handle dual plane component rotations differently: + // ASTC: 2nd plane separately interpolates the CCS channel. + // BC7: 2nd plane channel is swapped with alpha, 2nd plane controls alpha interpolation, then we swap alpha with the desired channel. + if (astc_comp == (uint32_t)unpacked_src_blk.m_astc.m_ccs) + bc7_comp = 3; + else if (astc_comp == 3) + bc7_comp = unpacked_src_blk.m_astc.m_ccs; + + uint32_t l = 255, h = 255; + if (astc_comp < total_comps) + { + l = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[astc_comp * 2 + 0]].m_unquant; + h = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[astc_comp * 2 + 1]].m_unquant; + } + + if (bc7_comp < 3) + { + l = (l * 127 + 127) / 255; + h = (h * 127 + 127) / 255; + } + + dst_blk.m_low->m_c[bc7_comp] = (uint8_t)l; + dst_blk.m_high->m_c[bc7_comp] = (uint8_t)h; + } + } + + if (mode == 13) + { + for (uint32_t i = 0; i < 16; i++) + { + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i * 2] ? 3 : 0; + dst_blk.m_alpha_selectors[i] = unpacked_src_blk.m_astc.m_weights[i * 2 + 1] ? 3 : 0; + } + } + else + { + for (uint32_t i = 0; i < 16; i++) + { + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i * 2]; + dst_blk.m_alpha_selectors[i] = unpacked_src_blk.m_astc.m_weights[i * 2 + 1]; + } + } + + break; + } + case 7: + { + // DualPlane: 0, WeightRange : 2 (4), Subsets : 2, EndpointRange : 12 (40) - BC7 MODE2 + dst_blk.m_mode = 2; + dst_blk.m_partition = g_bc7_3_astc2_common_partitions[unpacked_src_blk.m_common_pattern].m_bc73; + + const uint32_t common_pattern_k = g_bc7_3_astc2_common_partitions[unpacked_src_blk.m_common_pattern].k; + + for (uint32_t bc7_part = 0; bc7_part < 3; bc7_part++) + { + const uint32_t astc_part = bc7_convert_partition_index_3_to_2(bc7_part, common_pattern_k); + + for (uint32_t c = 0; c < 3; c++) + { + dst_blk.m_low[bc7_part].m_c[c] = (g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[c * 2 + 0 + astc_part * 6]].m_unquant * 31 + 127) / 255; + dst_blk.m_high[bc7_part].m_c[c] = (g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[c * 2 + 1 + astc_part * 6]].m_unquant * 31 + 127) / 255; + } + } + + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + + break; + } + case UASTC_MODE_INDEX_SOLID_COLOR: + { + // Void-Extent: Solid Color RGBA (BC7 MODE5 or MODE6) + const color32& solid_color = unpacked_src_blk.m_solid_color; + + uint32_t best_err0 = g_bc7_mode_6_optimal_endpoints[solid_color.r][0].m_error + g_bc7_mode_6_optimal_endpoints[solid_color.g][0].m_error + + g_bc7_mode_6_optimal_endpoints[solid_color.b][0].m_error + g_bc7_mode_6_optimal_endpoints[solid_color.a][0].m_error; + + uint32_t best_err1 = g_bc7_mode_6_optimal_endpoints[solid_color.r][1].m_error + g_bc7_mode_6_optimal_endpoints[solid_color.g][1].m_error + + g_bc7_mode_6_optimal_endpoints[solid_color.b][1].m_error + g_bc7_mode_6_optimal_endpoints[solid_color.a][1].m_error; + + if (best_err0 > 0 && best_err1 > 0) + { + dst_blk.m_mode = 5; + + for (uint32_t c = 0; c < 3; c++) + { + dst_blk.m_low[0].m_c[c] = g_bc7_mode_5_optimal_endpoints[solid_color.c[c]].m_lo; + dst_blk.m_high[0].m_c[c] = g_bc7_mode_5_optimal_endpoints[solid_color.c[c]].m_hi; + } + + memset(dst_blk.m_selectors, BC7ENC_MODE_5_OPTIMAL_INDEX, 16); + + dst_blk.m_low[0].m_c[3] = solid_color.c[3]; + dst_blk.m_high[0].m_c[3] = solid_color.c[3]; + + //memset(dst_blk.m_alpha_selectors, 0, 16); + } + else + { + dst_blk.m_mode = 6; + + uint32_t best_p = 0; + if (best_err1 < best_err0) + best_p = 1; + + for (uint32_t c = 0; c < 4; c++) + { + dst_blk.m_low[0].m_c[c] = g_bc7_mode_6_optimal_endpoints[solid_color.c[c]][best_p].m_lo; + dst_blk.m_high[0].m_c[c] = g_bc7_mode_6_optimal_endpoints[solid_color.c[c]][best_p].m_hi; + } + + dst_blk.m_pbits[0][0] = best_p; + dst_blk.m_pbits[0][1] = best_p; + memset(dst_blk.m_selectors, BC7ENC_MODE_6_OPTIMAL_INDEX, 16); + } + + break; + } + case 9: + case 16: + { + // 9. DualPlane: 0, WeightRange : 2 (4), Subsets : 2, EndpointRange : 8 (16) - BC7 MODE7 + // 16. DualPlane: 0, WeightRange: 2 (4), Subsets: 2, CEM: 4 (LA Direct), EndpointRange: 20 (256) - BC7 MODE7 + + dst_blk.m_mode = 7; + dst_blk.m_partition = g_astc_bc7_common_partitions2[unpacked_src_blk.m_common_pattern].m_bc7; + + const bool invert_partition = g_astc_bc7_common_partitions2[unpacked_src_blk.m_common_pattern].m_invert; + + for (uint32_t astc_subset = 0; astc_subset < 2; astc_subset++) + { + float xl[4], xh[4]; + + if (total_comps == 2) + { + xl[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[0 + astc_subset * 4]].m_unquant / 255.0f; + xh[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[1 + astc_subset * 4]].m_unquant / 255.0f; + + xl[1] = xl[0]; + xh[1] = xh[0]; + + xl[2] = xl[0]; + xh[2] = xh[0]; + + xl[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[2 + astc_subset * 4]].m_unquant / 255.0f; + xh[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[3 + astc_subset * 4]].m_unquant / 255.0f; + } + else + { + xl[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[0 + astc_subset * 8]].m_unquant / 255.0f; + xl[1] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[2 + astc_subset * 8]].m_unquant / 255.0f; + xl[2] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[4 + astc_subset * 8]].m_unquant / 255.0f; + xl[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[6 + astc_subset * 8]].m_unquant / 255.0f; + + xh[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[1 + astc_subset * 8]].m_unquant / 255.0f; + xh[1] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[3 + astc_subset * 8]].m_unquant / 255.0f; + xh[2] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[5 + astc_subset * 8]].m_unquant / 255.0f; + xh[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[7 + astc_subset * 8]].m_unquant / 255.0f; + } + + uint32_t best_pbits[2] = { 0, 0 }; + color_quad_u8 bestMinColor, bestMaxColor; + memset(&bestMinColor, 0, sizeof(bestMinColor)); + memset(&bestMaxColor, 0, sizeof(bestMaxColor)); + determine_unique_pbits(4, 5, xl, xh, bestMinColor, bestMaxColor, best_pbits); + + const uint32_t bc7_subset_index = invert_partition ? (1 - astc_subset) : astc_subset; + + dst_blk.m_low[bc7_subset_index] = bestMinColor; + dst_blk.m_high[bc7_subset_index] = bestMaxColor; + + dst_blk.m_pbits[bc7_subset_index][0] = best_pbits[0]; + dst_blk.m_pbits[bc7_subset_index][1] = best_pbits[1]; + } // astc_subset + + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + + break; + } + default: + return false; + } + + return true; + } + + bool transcode_uastc_to_bc7(const uastc_block& src_blk, bc7_optimization_results& dst_blk) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false, false)) + return false; + + return transcode_uastc_to_bc7(unpacked_src_blk, dst_blk); + } + + bool transcode_uastc_to_bc7(const uastc_block& src_blk, void* pDst) + { + bc7_optimization_results temp; + if (!transcode_uastc_to_bc7(src_blk, temp)) + return false; + + encode_bc7_block(pDst, &temp); + return true; + } + + color32 apply_etc1_bias(const color32 &block_color, uint32_t bias, uint32_t limit, uint32_t subblock) + { + color32 result; + + for (uint32_t c = 0; c < 3; c++) + { + static const int s_divs[3] = { 1, 3, 9 }; + + int delta = 0; + + switch (bias) + { + case 2: delta = subblock ? 0 : ((c == 0) ? -1 : 0); break; + case 5: delta = subblock ? 0 : ((c == 1) ? -1 : 0); break; + case 6: delta = subblock ? 0 : ((c == 2) ? -1 : 0); break; + + case 7: delta = subblock ? 0 : ((c == 0) ? 1 : 0); break; + case 11: delta = subblock ? 0 : ((c == 1) ? 1 : 0); break; + case 15: delta = subblock ? 0 : ((c == 2) ? 1 : 0); break; + + case 18: delta = subblock ? ((c == 0) ? -1 : 0) : 0; break; + case 19: delta = subblock ? ((c == 1) ? -1 : 0) : 0; break; + case 20: delta = subblock ? ((c == 2) ? -1 : 0) : 0; break; + + case 21: delta = subblock ? ((c == 0) ? 1 : 0) : 0; break; + case 24: delta = subblock ? ((c == 1) ? 1 : 0) : 0; break; + case 8: delta = subblock ? ((c == 2) ? 1 : 0) : 0; break; + + case 10: delta = -2; break; + + case 27: delta = subblock ? 0 : -1; break; + case 28: delta = subblock ? -1 : 1; break; + case 29: delta = subblock ? 1 : 0; break; + case 30: delta = subblock ? -1 : 0; break; + case 31: delta = subblock ? 0 : 1; break; + + default: + delta = ((bias / s_divs[c]) % 3) - 1; + break; + } + + int v = block_color[c]; + if (v == 0) + { + if (delta == -2) + v += 3; + else + v += delta + 1; + } + else if (v == (int)limit) + { + v += (delta - 1); + } + else + { + v += delta; + if ((v < 0) || (v > (int)limit)) + v = (v - delta) - delta; + } + + assert(v >= 0); + assert(v <= (int)limit); + + result[c] = (uint8_t)v; + } + + return result; + } + + static void etc1_determine_selectors(decoder_etc_block& dst_blk, const color32* pSource_pixels, uint32_t first_subblock, uint32_t last_subblock) + { + static const uint8_t s_tran[4] = { 1, 0, 2, 3 }; + + uint16_t l_bitmask = 0; + uint16_t h_bitmask = 0; + + for (uint32_t subblock = first_subblock; subblock < last_subblock; subblock++) + { + color32 block_colors[4]; + dst_blk.get_block_colors(block_colors, subblock); + + uint32_t block_y[4]; + for (uint32_t i = 0; i < 4; i++) + block_y[i] = block_colors[i][0] * 54 + block_colors[i][1] * 183 + block_colors[i][2] * 19; + + const uint32_t block_y01 = block_y[0] + block_y[1]; + const uint32_t block_y12 = block_y[1] + block_y[2]; + const uint32_t block_y23 = block_y[2] + block_y[3]; + + // X0 X0 X0 X0 X1 X1 X1 X1 X2 X2 X2 X2 X3 X3 X3 X3 + // Y0 Y1 Y2 Y3 Y0 Y1 Y2 Y3 Y0 Y1 Y2 Y3 Y0 Y1 Y2 Y3 + + if (dst_blk.get_flip_bit()) + { + uint32_t ofs = subblock * 2; + + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const color32& c = pSource_pixels[x + (subblock * 2 + y) * 4]; + const uint32_t l = c[0] * 108 + c[1] * 366 + c[2] * 38; + + uint32_t t = s_tran[(l < block_y01) + (l < block_y12) + (l < block_y23)]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ofs += 4; + } + + ofs = (int)ofs + 1 - 4 * 4; + } + } + else + { + uint32_t ofs = (subblock * 2) * 4; + for (uint32_t x = 0; x < 2; x++) + { + for (uint32_t y = 0; y < 4; y++) + { + const color32& c = pSource_pixels[subblock * 2 + x + y * 4]; + const uint32_t l = c[0] * 108 + c[1] * 366 + c[2] * 38; + + uint32_t t = s_tran[(l < block_y01) + (l < block_y12) + (l < block_y23)]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ++ofs; + } + } + } + } + + dst_blk.m_bytes[7] = (uint8_t)(l_bitmask); + dst_blk.m_bytes[6] = (uint8_t)(l_bitmask >> 8); + dst_blk.m_bytes[5] = (uint8_t)(h_bitmask); + dst_blk.m_bytes[4] = (uint8_t)(h_bitmask >> 8); + } + + static const uint8_t s_etc1_solid_selectors[4][4] = { { 255, 255, 255, 255 }, { 255, 255, 0, 0 }, { 0, 0, 0, 0 }, {0, 0, 255, 255 } }; + + struct etc_coord2 + { + uint8_t m_x, m_y; + }; + + // [flip][subblock][pixel_index] + const etc_coord2 g_etc1_pixel_coords[2][2][8] = + { + { + { + { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 }, + { 1, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 } + }, + { + { 2, 0 }, { 2, 1 }, { 2, 2 }, { 2, 3 }, + { 3, 0 }, { 3, 1 }, { 3, 2 }, { 3, 3 } + } + }, + { + { + { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, + { 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1 } + }, + { + { 0, 2 }, { 1, 2 }, { 2, 2 }, { 3, 2 }, + { 0, 3 }, { 1, 3 }, { 2, 3 }, { 3, 3 } + }, + } + }; + + void transcode_uastc_to_etc1(unpacked_uastc_block& unpacked_src_blk, color32 block_pixels[4][4], void* pDst) + { + decoder_etc_block& dst_blk = *static_cast(pDst); + + if (unpacked_src_blk.m_mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + dst_blk.m_bytes[3] = (uint8_t)((unpacked_src_blk.m_etc1_diff << 1) | (unpacked_src_blk.m_etc1_inten0 << 5) | (unpacked_src_blk.m_etc1_inten0 << 2)); + + if (unpacked_src_blk.m_etc1_diff) + { + dst_blk.m_bytes[0] = (uint8_t)(unpacked_src_blk.m_etc1_r << 3); + dst_blk.m_bytes[1] = (uint8_t)(unpacked_src_blk.m_etc1_g << 3); + dst_blk.m_bytes[2] = (uint8_t)(unpacked_src_blk.m_etc1_b << 3); + } + else + { + dst_blk.m_bytes[0] = (uint8_t)(unpacked_src_blk.m_etc1_r | (unpacked_src_blk.m_etc1_r << 4)); + dst_blk.m_bytes[1] = (uint8_t)(unpacked_src_blk.m_etc1_g | (unpacked_src_blk.m_etc1_g << 4)); + dst_blk.m_bytes[2] = (uint8_t)(unpacked_src_blk.m_etc1_b | (unpacked_src_blk.m_etc1_b << 4)); + } + + memcpy(dst_blk.m_bytes + 4, &s_etc1_solid_selectors[unpacked_src_blk.m_etc1_selector][0], 4); + + return; + } + + const bool flip = unpacked_src_blk.m_etc1_flip != 0; + const bool diff = unpacked_src_blk.m_etc1_diff != 0; + + dst_blk.m_bytes[3] = (uint8_t)((int)flip | (diff << 1) | (unpacked_src_blk.m_etc1_inten0 << 5) | (unpacked_src_blk.m_etc1_inten1 << 2)); + + const uint32_t limit = diff ? 31 : 15; + + color32 block_colors[2]; + + for (uint32_t subset = 0; subset < 2; subset++) + { + uint32_t avg_color[3]; + memset(avg_color, 0, sizeof(avg_color)); + + for (uint32_t j = 0; j < 8; j++) + { + const etc_coord2& c = g_etc1_pixel_coords[flip][subset][j]; + + avg_color[0] += block_pixels[c.m_y][c.m_x].r; + avg_color[1] += block_pixels[c.m_y][c.m_x].g; + avg_color[2] += block_pixels[c.m_y][c.m_x].b; + } // j + + block_colors[subset][0] = (uint8_t)((avg_color[0] * limit + 1020) / (8 * 255)); + block_colors[subset][1] = (uint8_t)((avg_color[1] * limit + 1020) / (8 * 255)); + block_colors[subset][2] = (uint8_t)((avg_color[2] * limit + 1020) / (8 * 255)); + block_colors[subset][3] = 0; + + if (g_uastc_mode_has_etc1_bias[unpacked_src_blk.m_mode]) + { + block_colors[subset] = apply_etc1_bias(block_colors[subset], unpacked_src_blk.m_etc1_bias, limit, subset); + } + + } // subset + + if (diff) + { + int dr = block_colors[1].r - block_colors[0].r; + int dg = block_colors[1].g - block_colors[0].g; + int db = block_colors[1].b - block_colors[0].b; + + dr = basisu::clamp(dr, cETC1ColorDeltaMin, cETC1ColorDeltaMax); + dg = basisu::clamp(dg, cETC1ColorDeltaMin, cETC1ColorDeltaMax); + db = basisu::clamp(db, cETC1ColorDeltaMin, cETC1ColorDeltaMax); + + if (dr < 0) dr += 8; + if (dg < 0) dg += 8; + if (db < 0) db += 8; + + dst_blk.m_bytes[0] = (uint8_t)((block_colors[0].r << 3) | dr); + dst_blk.m_bytes[1] = (uint8_t)((block_colors[0].g << 3) | dg); + dst_blk.m_bytes[2] = (uint8_t)((block_colors[0].b << 3) | db); + } + else + { + dst_blk.m_bytes[0] = (uint8_t)(block_colors[1].r | (block_colors[0].r << 4)); + dst_blk.m_bytes[1] = (uint8_t)(block_colors[1].g | (block_colors[0].g << 4)); + dst_blk.m_bytes[2] = (uint8_t)(block_colors[1].b | (block_colors[0].b << 4)); + } + + etc1_determine_selectors(dst_blk, &block_pixels[0][0], 0, 2); + } + + bool transcode_uastc_to_etc1(const uastc_block& src_blk, void* pDst) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + color32 block_pixels[4][4]; + if (unpacked_src_blk.m_mode != UASTC_MODE_INDEX_SOLID_COLOR) + { + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + } + + transcode_uastc_to_etc1(unpacked_src_blk, block_pixels, pDst); + + return true; + } + + static inline int gray_distance2(const uint8_t c, int y) + { + int gray_dist = (int)c - y; + return gray_dist * gray_dist; + } + + static bool pack_etc1_y_estimate_flipped(const uint8_t* pSrc_pixels, + int& upper_avg, int& lower_avg, int& left_avg, int& right_avg) + { + int sums[2][2]; + +#define GET_XY(x, y) pSrc_pixels[(x) + ((y) * 4)] + + sums[0][0] = GET_XY(0, 0) + GET_XY(0, 1) + GET_XY(1, 0) + GET_XY(1, 1); + sums[1][0] = GET_XY(2, 0) + GET_XY(2, 1) + GET_XY(3, 0) + GET_XY(3, 1); + sums[0][1] = GET_XY(0, 2) + GET_XY(0, 3) + GET_XY(1, 2) + GET_XY(1, 3); + sums[1][1] = GET_XY(2, 2) + GET_XY(2, 3) + GET_XY(3, 2) + GET_XY(3, 3); + + upper_avg = (sums[0][0] + sums[1][0] + 4) / 8; + lower_avg = (sums[0][1] + sums[1][1] + 4) / 8; + left_avg = (sums[0][0] + sums[0][1] + 4) / 8; + right_avg = (sums[1][0] + sums[1][1] + 4) / 8; + +#undef GET_XY +#define GET_XY(x, y, a) gray_distance2(pSrc_pixels[(x) + ((y) * 4)], a) + + int upper_gray_dist = 0, lower_gray_dist = 0, left_gray_dist = 0, right_gray_dist = 0; + for (uint32_t i = 0; i < 4; i++) + { + for (uint32_t j = 0; j < 2; j++) + { + upper_gray_dist += GET_XY(i, j, upper_avg); + lower_gray_dist += GET_XY(i, 2 + j, lower_avg); + left_gray_dist += GET_XY(j, i, left_avg); + right_gray_dist += GET_XY(2 + j, i, right_avg); + } + } + +#undef GET_XY + + int upper_lower_sum = upper_gray_dist + lower_gray_dist; + int left_right_sum = left_gray_dist + right_gray_dist; + + return upper_lower_sum < left_right_sum; + } + + // Base Sel Table + // XXXXX XX XXX + static const uint16_t g_etc1_y_solid_block_configs[256] = + { + 0,781,64,161,260,192,33,131,96,320,65,162,261,193,34,291,97,224,66,163,262,194,35,549,98,4,67,653,164,195,523,36,99,5,578,68,165,353,196,37,135,100,324,69,166,354,197,38,295,101,228,70,167, + 355,198,39,553,102,8,71,608,168,199,527,40,103,9,582,72,169,357,200,41,139,104,328,73,170,358,201,42,299,105,232,74,171,359,202,43,557,106,12,75,612,172,203,531,44,107,13,586,76,173,361, + 204,45,143,108,332,77,174,362,205,46,303,109,236,78,175,363,206,47,561,110,16,79,616,176,207,535,48,111,17,590,80,177,365,208,49,147,112,336,81,178,366,209,50,307,113,240,82,179,367,210, + 51,565,114,20,83,620,180,211,539,52,115,21,594,84,181,369,212,53,151,116,340,85,182,370,213,54,311,117,244,86,183,371,214,55,569,118,24,87,624,184,215,543,56,119,25,598,88,185,373,216,57, + 155,120,344,89,186,374,217,58,315,121,248,90,187,375,218,59,573,122,28,91,628,188,219,754,60,123,29,602,92,189,377,220,61,159,124,348,93,190,378,221,62,319,125,252,94,191,379,222,63,882,126 + }; + + // individual + // table base sel0 sel1 sel2 sel3 + static const uint16_t g_etc1_y_solid_block_4i_configs[256] = + { + 0xA000,0xA800,0x540B,0xAA01,0xAA01,0xFE00,0xFF00,0xFF00,0x8,0x5515,0x5509,0x5509,0xAA03,0x5508,0x5508,0x9508,0xA508,0xA908,0xAA08,0x5513,0xAA09,0xAA09,0xAA05,0xFF08,0xFF08,0x10,0x551D,0x5511,0x5511, + 0xAA0B,0x5510,0x5510,0x9510,0xA510,0xA910,0xAA10,0x551B,0xAA11,0xAA11,0xAA0D,0xFF10,0xFF10,0x18,0x5525,0x5519,0x5519,0xAA13,0x5518,0x5518,0x9518,0xA518,0xA918,0xAA18,0x5523,0xAA19,0xAA19,0xAA15, + 0xFF18,0xFF18,0x20,0x552D,0x5521,0x5521,0xAA1B,0x5520,0x5520,0x9520,0xA520,0xA920,0xAA20,0x552B,0xAA21,0xAA21,0xAA1D,0xFF20,0xFF20,0x28,0x5535,0x5529,0x5529,0xAA23,0x5528,0x5528,0x9528,0xA528,0xA928, + 0xAA28,0x5533,0xAA29,0xAA29,0xAA25,0xFF28,0xFF28,0x30,0x553D,0x5531,0x5531,0xAA2B,0x5530,0x5530,0x9530,0xA530,0xA930,0xAA30,0x553B,0xAA31,0xAA31,0xAA2D,0xFF30,0xFF30,0x38,0x5545,0x5539,0x5539,0xAA33, + 0x5538,0x5538,0x9538,0xA538,0xA938,0xAA38,0x5543,0xAA39,0xAA39,0xAA35,0xFF38,0xFF38,0x40,0x554D,0x5541,0x5541,0xAA3B,0x5540,0x5540,0x9540,0xA540,0xA940,0xAA40,0x554B,0xAA41,0xAA41,0xAA3D,0xFF40,0xFF40, + 0x48,0x5555,0x5549,0x5549,0xAA43,0x5548,0x5548,0x9548,0xA548,0xA948,0xAA48,0x5553,0xAA49,0xAA49,0xAA45,0xFF48,0xFF48,0x50,0x555D,0x5551,0x5551,0xAA4B,0x5550,0x5550,0x9550,0xA550,0xA950,0xAA50,0x555B, + 0xAA51,0xAA51,0xAA4D,0xFF50,0xFF50,0x58,0x5565,0x5559,0x5559,0xAA53,0x5558,0x5558,0x9558,0xA558,0xA958,0xAA58,0x5563,0xAA59,0xAA59,0xAA55,0xFF58,0xFF58,0x60,0x556D,0x5561,0x5561,0xAA5B,0x5560,0x5560, + 0x9560,0xA560,0xA960,0xAA60,0x556B,0xAA61,0xAA61,0xAA5D,0xFF60,0xFF60,0x68,0x5575,0x5569,0x5569,0xAA63,0x5568,0x5568,0x9568,0xA568,0xA968,0xAA68,0x5573,0xAA69,0xAA69,0xAA65,0xFF68,0xFF68,0x70,0x557D, + 0x5571,0x5571,0xAA6B,0x5570,0x5570,0x9570,0xA570,0xA970,0xAA70,0x557B,0xAA71,0xAA71,0xAA6D,0xFF70,0xFF70,0x78,0x78,0x5579,0x5579,0xAA73,0x5578,0x9578,0x2578,0xE6E,0x278 + }; + + static const uint16_t g_etc1_y_solid_block_2i_configs[256] = + { + 0x416,0x800,0xA00,0x50B,0xA01,0xA01,0xF00,0xF00,0xF00,0x8,0x515,0x509,0x509,0xA03,0x508,0x508,0xF01,0xF01,0xA08,0xA08,0x513,0xA09,0xA09,0xA05,0xF08,0xF08,0x10,0x51D,0x511,0x511,0xA0B,0x510,0x510,0xF09, + 0xF09,0xA10,0xA10,0x51B,0xA11,0xA11,0xA0D,0xF10,0xF10,0x18,0x525,0x519,0x519,0xA13,0x518,0x518,0xF11,0xF11,0xA18,0xA18,0x523,0xA19,0xA19,0xA15,0xF18,0xF18,0x20,0x52D,0x521,0x521,0xA1B,0x520,0x520,0xF19, + 0xF19,0xA20,0xA20,0x52B,0xA21,0xA21,0xA1D,0xF20,0xF20,0x28,0x535,0x529,0x529,0xA23,0x528,0x528,0xF21,0xF21,0xA28,0xA28,0x533,0xA29,0xA29,0xA25,0xF28,0xF28,0x30,0x53D,0x531,0x531,0xA2B,0x530,0x530,0xF29, + 0xF29,0xA30,0xA30,0x53B,0xA31,0xA31,0xA2D,0xF30,0xF30,0x38,0x545,0x539,0x539,0xA33,0x538,0x538,0xF31,0xF31,0xA38,0xA38,0x543,0xA39,0xA39,0xA35,0xF38,0xF38,0x40,0x54D,0x541,0x541,0xA3B,0x540,0x540,0xF39, + 0xF39,0xA40,0xA40,0x54B,0xA41,0xA41,0xA3D,0xF40,0xF40,0x48,0x555,0x549,0x549,0xA43,0x548,0x548,0xF41,0xF41,0xA48,0xA48,0x553,0xA49,0xA49,0xA45,0xF48,0xF48,0x50,0x55D,0x551,0x551,0xA4B,0x550,0x550,0xF49, + 0xF49,0xA50,0xA50,0x55B,0xA51,0xA51,0xA4D,0xF50,0xF50,0x58,0x565,0x559,0x559,0xA53,0x558,0x558,0xF51,0xF51,0xA58,0xA58,0x563,0xA59,0xA59,0xA55,0xF58,0xF58,0x60,0x56D,0x561,0x561,0xA5B,0x560,0x560,0xF59, + 0xF59,0xA60,0xA60,0x56B,0xA61,0xA61,0xA5D,0xF60,0xF60,0x68,0x575,0x569,0x569,0xA63,0x568,0x568,0xF61,0xF61,0xA68,0xA68,0x573,0xA69,0xA69,0xA65,0xF68,0xF68,0x70,0x57D,0x571,0x571,0xA6B,0x570,0x570,0xF69, + 0xF69,0xA70,0xA70,0x57B,0xA71,0xA71,0xA6D,0xF70,0xF70,0x78,0x78,0x579,0x579,0xA73,0x578,0x578,0xE6E,0x278 + }; + + static const uint16_t g_etc1_y_solid_block_1i_configs[256] = + { + 0x0,0x116,0x200,0x200,0x10B,0x201,0x201,0x300,0x300,0x8,0x115,0x109,0x109,0x203,0x108,0x108,0x114,0x301,0x204,0x208,0x208,0x113,0x209,0x209,0x205,0x308,0x10,0x11D,0x111,0x111,0x20B,0x110,0x110,0x11C,0x309, + 0x20C,0x210,0x210,0x11B,0x211,0x211,0x20D,0x310,0x18,0x125,0x119,0x119,0x213,0x118,0x118,0x124,0x311,0x214,0x218,0x218,0x123,0x219,0x219,0x215,0x318,0x20,0x12D,0x121,0x121,0x21B,0x120,0x120,0x12C,0x319,0x21C, + 0x220,0x220,0x12B,0x221,0x221,0x21D,0x320,0x28,0x135,0x129,0x129,0x223,0x128,0x128,0x134,0x321,0x224,0x228,0x228,0x133,0x229,0x229,0x225,0x328,0x30,0x13D,0x131,0x131,0x22B,0x130,0x130,0x13C,0x329,0x22C,0x230, + 0x230,0x13B,0x231,0x231,0x22D,0x330,0x38,0x145,0x139,0x139,0x233,0x138,0x138,0x144,0x331,0x234,0x238,0x238,0x143,0x239,0x239,0x235,0x338,0x40,0x14D,0x141,0x141,0x23B,0x140,0x140,0x14C,0x339,0x23C,0x240,0x240, + 0x14B,0x241,0x241,0x23D,0x340,0x48,0x155,0x149,0x149,0x243,0x148,0x148,0x154,0x341,0x244,0x248,0x248,0x153,0x249,0x249,0x245,0x348,0x50,0x15D,0x151,0x151,0x24B,0x150,0x150,0x15C,0x349,0x24C,0x250,0x250,0x15B, + 0x251,0x251,0x24D,0x350,0x58,0x165,0x159,0x159,0x253,0x158,0x158,0x164,0x351,0x254,0x258,0x258,0x163,0x259,0x259,0x255,0x358,0x60,0x16D,0x161,0x161,0x25B,0x160,0x160,0x16C,0x359,0x25C,0x260,0x260,0x16B,0x261, + 0x261,0x25D,0x360,0x68,0x175,0x169,0x169,0x263,0x168,0x168,0x174,0x361,0x264,0x268,0x268,0x173,0x269,0x269,0x265,0x368,0x70,0x17D,0x171,0x171,0x26B,0x170,0x170,0x17C,0x369,0x26C,0x270,0x270,0x17B,0x271,0x271, + 0x26D,0x370,0x78,0x78,0x179,0x179,0x273,0x178,0x178,0x26E,0x278 + }; + + // We don't have any useful hints to accelerate single channel ETC1, so we need to real-time encode from scratch. + bool transcode_uastc_to_etc1(const uastc_block& src_blk, void* pDst, uint32_t channel) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + +#if 0 + for (uint32_t individ = 0; individ < 2; individ++) + { + uint32_t overall_error = 0; + + for (uint32_t c = 0; c < 256; c++) + { + uint32_t best_err = UINT32_MAX; + uint32_t best_individ = 0; + uint32_t best_base = 0; + uint32_t best_sels[4] = { 0,0,0,0 }; + uint32_t best_table = 0; + + const uint32_t limit = individ ? 16 : 32; + + for (uint32_t table = 0; table < 8; table++) + { + for (uint32_t base = 0; base < limit; base++) + { + uint32_t total_e = 0; + uint32_t sels[4] = { 0,0,0,0 }; + + const uint32_t N = 4; + for (uint32_t i = 0; i < basisu::minimum(N, (256 - c)); i++) + { + uint32_t best_sel_e = UINT32_MAX; + uint32_t best_sel = 0; + + for (uint32_t sel = 0; sel < 4; sel++) + { + int val = individ ? ((base << 4) | base) : ((base << 3) | (base >> 2)); + val = clamp255(val + g_etc1_inten_tables[table][sel]); + + int e = iabs(val - clamp255(c + i)); + if (e < best_sel_e) + { + best_sel_e = e; + best_sel = sel; + } + + } // sel + + sels[i] = best_sel; + total_e += best_sel_e * best_sel_e; + + } // i + + if (total_e < best_err) + { + best_err = total_e; + best_individ = individ; + best_base = base; + memcpy(best_sels, sels, sizeof(best_sels)); + best_table = table; + } + + } // base + } // table + + //printf("%u: %u,%u,%u,%u,%u,%u,%u,%u\n", c, best_err, best_individ, best_table, best_base, best_sels[0], best_sels[1], best_sels[2], best_sels[3]); + + uint32_t encoded = best_table | (best_base << 3) | + (best_sels[0] << 8) | + (best_sels[1] << 10) | + (best_sels[2] << 12) | + (best_sels[3] << 14); + + printf("0x%X,", encoded); + + overall_error += best_err; + } // c + + printf("\n"); + printf("Overall error: %u\n", overall_error); + + } // individ + + exit(0); +#endif + +#if 0 + for (uint32_t individ = 0; individ < 2; individ++) + { + uint32_t overall_error = 0; + + for (uint32_t c = 0; c < 256; c++) + { + uint32_t best_err = UINT32_MAX; + uint32_t best_individ = 0; + uint32_t best_base = 0; + uint32_t best_sels[4] = { 0,0,0,0 }; + uint32_t best_table = 0; + + const uint32_t limit = individ ? 16 : 32; + + for (uint32_t table = 0; table < 8; table++) + { + for (uint32_t base = 0; base < limit; base++) + { + uint32_t total_e = 0; + uint32_t sels[4] = { 0,0,0,0 }; + + const uint32_t N = 1; + for (uint32_t i = 0; i < basisu::minimum(N, (256 - c)); i++) + { + uint32_t best_sel_e = UINT32_MAX; + uint32_t best_sel = 0; + + for (uint32_t sel = 0; sel < 4; sel++) + { + int val = individ ? ((base << 4) | base) : ((base << 3) | (base >> 2)); + val = clamp255(val + g_etc1_inten_tables[table][sel]); + + int e = iabs(val - clamp255(c + i)); + if (e < best_sel_e) + { + best_sel_e = e; + best_sel = sel; + } + + } // sel + + sels[i] = best_sel; + total_e += best_sel_e * best_sel_e; + + } // i + + if (total_e < best_err) + { + best_err = total_e; + best_individ = individ; + best_base = base; + memcpy(best_sels, sels, sizeof(best_sels)); + best_table = table; + } + + } // base + } // table + + //printf("%u: %u,%u,%u,%u,%u,%u,%u,%u\n", c, best_err, best_individ, best_table, best_base, best_sels[0], best_sels[1], best_sels[2], best_sels[3]); + + uint32_t encoded = best_table | (best_base << 3) | + (best_sels[0] << 8) | + (best_sels[1] << 10) | + (best_sels[2] << 12) | + (best_sels[3] << 14); + + printf("0x%X,", encoded); + + overall_error += best_err; + } // c + + printf("\n"); + printf("Overall error: %u\n", overall_error); + + } // individ + + exit(0); +#endif + + decoder_etc_block& dst_blk = *static_cast(pDst); + + if (unpacked_src_blk.m_mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + const uint32_t y = unpacked_src_blk.m_solid_color[channel]; + const uint32_t encoded_config = g_etc1_y_solid_block_configs[y]; + + const uint32_t base = encoded_config & 31; + const uint32_t sel = (encoded_config >> 5) & 3; + const uint32_t table = encoded_config >> 7; + + dst_blk.m_bytes[3] = (uint8_t)(2 | (table << 5) | (table << 2)); + + dst_blk.m_bytes[0] = (uint8_t)(base << 3); + dst_blk.m_bytes[1] = (uint8_t)(base << 3); + dst_blk.m_bytes[2] = (uint8_t)(base << 3); + + memcpy(dst_blk.m_bytes + 4, &s_etc1_solid_selectors[sel][0], 4); + return true; + } + + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + uint8_t block_y[4][4]; + for (uint32_t i = 0; i < 16; i++) + ((uint8_t*)block_y)[i] = ((color32*)block_pixels)[i][channel]; + + int upper_avg, lower_avg, left_avg, right_avg; + bool flip = pack_etc1_y_estimate_flipped(&block_y[0][0], upper_avg, lower_avg, left_avg, right_avg); + + // non-flipped: | | + // vs. + // flipped: -- + // -- + + uint32_t low[2] = { 255, 255 }, high[2] = { 0, 0 }; + + if (flip) + { + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t v = block_y[y][x]; + low[0] = basisu::minimum(low[0], v); + high[0] = basisu::maximum(high[0], v); + } + } + for (uint32_t y = 2; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t v = block_y[y][x]; + low[1] = basisu::minimum(low[1], v); + high[1] = basisu::maximum(high[1], v); + } + } + } + else + { + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 2; x++) + { + const uint32_t v = block_y[y][x]; + low[0] = basisu::minimum(low[0], v); + high[0] = basisu::maximum(high[0], v); + } + } + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 2; x < 4; x++) + { + const uint32_t v = block_y[y][x]; + low[1] = basisu::minimum(low[1], v); + high[1] = basisu::maximum(high[1], v); + } + } + } + + const uint32_t range[2] = { high[0] - low[0], high[1] - low[1] }; + + dst_blk.m_bytes[3] = (uint8_t)((int)flip); + + if ((range[0] <= 3) && (range[1] <= 3)) + { + // This is primarily for better gradients. + dst_blk.m_bytes[0] = 0; + dst_blk.m_bytes[1] = 0; + dst_blk.m_bytes[2] = 0; + + uint16_t l_bitmask = 0, h_bitmask = 0; + + for (uint32_t subblock = 0; subblock < 2; subblock++) + { + const uint32_t encoded = (range[subblock] == 0) ? g_etc1_y_solid_block_1i_configs[low[subblock]] : ((range[subblock] < 2) ? g_etc1_y_solid_block_2i_configs[low[subblock]] : g_etc1_y_solid_block_4i_configs[low[subblock]]); + + const uint32_t table = encoded & 7; + const uint32_t base = (encoded >> 3) & 31; + assert(base <= 15); + const uint32_t sels[4] = { (encoded >> 8) & 3, (encoded >> 10) & 3, (encoded >> 12) & 3, (encoded >> 14) & 3 }; + + dst_blk.m_bytes[3] |= (uint8_t)(table << (subblock ? 2 : 5)); + + const uint32_t sv = base << (subblock ? 0 : 4); + dst_blk.m_bytes[0] |= (uint8_t)(sv); + dst_blk.m_bytes[1] |= (uint8_t)(sv); + dst_blk.m_bytes[2] |= (uint8_t)(sv); + + if (flip) + { + uint32_t ofs = subblock * 2; + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t t = block_y[y + subblock * 2][x]; + assert(t >= low[subblock] && t <= high[subblock]); + t -= low[subblock]; + assert(t <= 3); + + t = g_selector_index_to_etc1[sels[t]]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ofs += 4; + } + + ofs = (int)ofs + 1 - 4 * 4; + } + } + else + { + uint32_t ofs = (subblock * 2) * 4; + for (uint32_t x = 0; x < 2; x++) + { + for (uint32_t y = 0; y < 4; y++) + { + uint32_t t = block_y[y][x + subblock * 2]; + assert(t >= low[subblock] && t <= high[subblock]); + t -= low[subblock]; + assert(t <= 3); + + t = g_selector_index_to_etc1[sels[t]]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ++ofs; + } + } + } + } // subblock + + dst_blk.m_bytes[7] = (uint8_t)(l_bitmask); + dst_blk.m_bytes[6] = (uint8_t)(l_bitmask >> 8); + dst_blk.m_bytes[5] = (uint8_t)(h_bitmask); + dst_blk.m_bytes[4] = (uint8_t)(h_bitmask >> 8); + + return true; + } + + uint32_t y0 = ((flip ? upper_avg : left_avg) * 31 + 127) / 255; + uint32_t y1 = ((flip ? lower_avg : right_avg) * 31 + 127) / 255; + + bool diff = true; + + int dy = y1 - y0; + + if ((dy < cETC1ColorDeltaMin) || (dy > cETC1ColorDeltaMax)) + { + diff = false; + + y0 = ((flip ? upper_avg : left_avg) * 15 + 127) / 255; + y1 = ((flip ? lower_avg : right_avg) * 15 + 127) / 255; + + dst_blk.m_bytes[0] = (uint8_t)(y1 | (y0 << 4)); + dst_blk.m_bytes[1] = (uint8_t)(y1 | (y0 << 4)); + dst_blk.m_bytes[2] = (uint8_t)(y1 | (y0 << 4)); + } + else + { + dy = basisu::clamp(dy, cETC1ColorDeltaMin, cETC1ColorDeltaMax); + + y1 = y0 + dy; + + if (dy < 0) dy += 8; + + dst_blk.m_bytes[0] = (uint8_t)((y0 << 3) | dy); + dst_blk.m_bytes[1] = (uint8_t)((y0 << 3) | dy); + dst_blk.m_bytes[2] = (uint8_t)((y0 << 3) | dy); + + dst_blk.m_bytes[3] |= 2; + } + + const uint32_t base_y[2] = { diff ? ((y0 << 3) | (y0 >> 2)) : ((y0 << 4) | y0), diff ? ((y1 << 3) | (y1 >> 2)) : ((y1 << 4) | y1) }; + + uint32_t enc_range[2]; + for (uint32_t subset = 0; subset < 2; subset++) + { + const int pos = basisu::iabs((int)high[subset] - (int)base_y[subset]); + const int neg = basisu::iabs((int)base_y[subset] - (int)low[subset]); + + enc_range[subset] = basisu::maximum(pos, neg); + } + + uint16_t l_bitmask = 0, h_bitmask = 0; + for (uint32_t subblock = 0; subblock < 2; subblock++) + { + if ((!diff) && (range[subblock] <= 3)) + { + const uint32_t encoded = (range[subblock] == 0) ? g_etc1_y_solid_block_1i_configs[low[subblock]] : ((range[subblock] < 2) ? g_etc1_y_solid_block_2i_configs[low[subblock]] : g_etc1_y_solid_block_4i_configs[low[subblock]]); + + const uint32_t table = encoded & 7; + const uint32_t base = (encoded >> 3) & 31; + assert(base <= 15); + const uint32_t sels[4] = { (encoded >> 8) & 3, (encoded >> 10) & 3, (encoded >> 12) & 3, (encoded >> 14) & 3 }; + + dst_blk.m_bytes[3] |= (uint8_t)(table << (subblock ? 2 : 5)); + + const uint32_t mask = ~(0xF << (subblock ? 0 : 4)); + + dst_blk.m_bytes[0] &= mask; + dst_blk.m_bytes[1] &= mask; + dst_blk.m_bytes[2] &= mask; + + const uint32_t sv = base << (subblock ? 0 : 4); + dst_blk.m_bytes[0] |= (uint8_t)(sv); + dst_blk.m_bytes[1] |= (uint8_t)(sv); + dst_blk.m_bytes[2] |= (uint8_t)(sv); + + if (flip) + { + uint32_t ofs = subblock * 2; + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t t = block_y[y + subblock * 2][x]; + assert(t >= low[subblock] && t <= high[subblock]); + t -= low[subblock]; + assert(t <= 3); + + t = g_selector_index_to_etc1[sels[t]]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ofs += 4; + } + + ofs = (int)ofs + 1 - 4 * 4; + } + } + else + { + uint32_t ofs = (subblock * 2) * 4; + for (uint32_t x = 0; x < 2; x++) + { + for (uint32_t y = 0; y < 4; y++) + { + uint32_t t = block_y[y][x + subblock * 2]; + assert(t >= low[subblock] && t <= high[subblock]); + t -= low[subblock]; + assert(t <= 3); + + t = g_selector_index_to_etc1[sels[t]]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ++ofs; + } + } + } + + continue; + } // if + + uint32_t best_err = UINT32_MAX; + uint8_t best_sels[8]; + uint32_t best_inten = 0; + + const int base = base_y[subblock]; + + const int low_limit = -base; + const int high_limit = 255 - base; + + assert(low_limit <= 0 && high_limit >= 0); + + uint32_t inten_table_mask = 0xFF; + const uint32_t er = enc_range[subblock]; + // Each one of these tables is expensive to evaluate, so let's only examine the ones we know may be useful. + if (er <= 51) + { + inten_table_mask = 0xF; + + if (er > 22) + inten_table_mask &= ~(1 << 0); + + if ((er < 4) || (er > 39)) + inten_table_mask &= ~(1 << 1); + + if (er < 9) + inten_table_mask &= ~(1 << 2); + + if (er < 12) + inten_table_mask &= ~(1 << 3); + } + else + { + inten_table_mask &= ~((1 << 0) | (1 << 1)); + + if (er > 60) + inten_table_mask &= ~(1 << 2); + + if (er > 89) + inten_table_mask &= ~(1 << 3); + + if (er > 120) + inten_table_mask &= ~(1 << 4); + + if (er > 136) + inten_table_mask &= ~(1 << 5); + + if (er > 174) + inten_table_mask &= ~(1 << 6); + } + + for (uint32_t inten = 0; inten < 8; inten++) + { + if ((inten_table_mask & (1 << inten)) == 0) + continue; + + const int t0 = basisu::maximum(low_limit, g_etc1_inten_tables[inten][0]); + const int t1 = basisu::maximum(low_limit, g_etc1_inten_tables[inten][1]); + const int t2 = basisu::minimum(high_limit, g_etc1_inten_tables[inten][2]); + const int t3 = basisu::minimum(high_limit, g_etc1_inten_tables[inten][3]); + assert((t0 <= t1) && (t1 <= t2) && (t2 <= t3)); + + const int tv[4] = { t2, t3, t1, t0 }; + + const int thresh01 = t0 + t1; + const int thresh12 = t1 + t2; + const int thresh23 = t2 + t3; + + assert(thresh01 <= thresh12 && thresh12 <= thresh23); + + static const uint8_t s_table[4] = { 1, 0, 2, 3 }; + + uint32_t total_err = 0; + uint8_t sels[8]; + + if (flip) + { + if (((int)high[subblock] - base) * 2 < thresh01) + { + memset(sels, 3, 8); + + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const int delta = (int)block_y[y + subblock * 2][x] - base; + + const uint32_t c = 3; + + uint32_t e = basisu::iabs(tv[c] - delta); + total_err += e * e; + } + if (total_err >= best_err) + break; + } + } + else if (((int)low[subblock] - base) * 2 >= thresh23) + { + memset(sels, 1, 8); + + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const int delta = (int)block_y[y + subblock * 2][x] - base; + + const uint32_t c = 1; + + uint32_t e = basisu::iabs(tv[c] - delta); + total_err += e * e; + } + if (total_err >= best_err) + break; + } + } + else + { + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const int delta = (int)block_y[y + subblock * 2][x] - base; + const int delta2 = delta * 2; + + uint32_t c = s_table[(delta2 < thresh01) + (delta2 < thresh12) + (delta2 < thresh23)]; + sels[y * 4 + x] = (uint8_t)c; + + uint32_t e = basisu::iabs(tv[c] - delta); + total_err += e * e; + } + if (total_err >= best_err) + break; + } + } + } + else + { + if (((int)high[subblock] - base) * 2 < thresh01) + { + memset(sels, 3, 8); + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 2; x++) + { + const int delta = (int)block_y[y][x + subblock * 2] - base; + + const uint32_t c = 3; + + uint32_t e = basisu::iabs(tv[c] - delta); + total_err += e * e; + } + if (total_err >= best_err) + break; + } + } + else if (((int)low[subblock] - base) * 2 >= thresh23) + { + memset(sels, 1, 8); + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 2; x++) + { + const int delta = (int)block_y[y][x + subblock * 2] - base; + + const uint32_t c = 1; + + uint32_t e = basisu::iabs(tv[c] - delta); + total_err += e * e; + } + if (total_err >= best_err) + break; + } + } + else + { + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 2; x++) + { + const int delta = (int)block_y[y][x + subblock * 2] - base; + const int delta2 = delta * 2; + + uint32_t c = s_table[(delta2 < thresh01) + (delta2 < thresh12) + (delta2 < thresh23)]; + sels[y * 2 + x] = (uint8_t)c; + + uint32_t e = basisu::iabs(tv[c] - delta); + total_err += e * e; + } + if (total_err >= best_err) + break; + } + } + } + + if (total_err < best_err) + { + best_err = total_err; + best_inten = inten; + memcpy(best_sels, sels, 8); + } + + } // inten + + //g_inten_hist[best_inten][enc_range[subblock]]++; + + dst_blk.m_bytes[3] |= (uint8_t)(best_inten << (subblock ? 2 : 5)); + + if (flip) + { + uint32_t ofs = subblock * 2; + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t t = best_sels[y * 4 + x]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ofs += 4; + } + + ofs = (int)ofs + 1 - 4 * 4; + } + } + else + { + uint32_t ofs = (subblock * 2) * 4; + for (uint32_t x = 0; x < 2; x++) + { + for (uint32_t y = 0; y < 4; y++) + { + uint32_t t = best_sels[y * 2 + x]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ++ofs; + } + } + } + + } // subblock + + dst_blk.m_bytes[7] = (uint8_t)(l_bitmask); + dst_blk.m_bytes[6] = (uint8_t)(l_bitmask >> 8); + dst_blk.m_bytes[5] = (uint8_t)(h_bitmask); + dst_blk.m_bytes[4] = (uint8_t)(h_bitmask >> 8); + + return true; + } + + const uint32_t ETC2_EAC_MIN_VALUE_SELECTOR = 3, ETC2_EAC_MAX_VALUE_SELECTOR = 7; + + void transcode_uastc_to_etc2_eac_a8(unpacked_uastc_block& unpacked_src_blk, color32 block_pixels[4][4], void* pDst) + { + eac_block& dst = *static_cast(pDst); + const color32* pSrc_pixels = &block_pixels[0][0]; + + if ((!g_uastc_mode_has_alpha[unpacked_src_blk.m_mode]) || (unpacked_src_blk.m_mode == UASTC_MODE_INDEX_SOLID_COLOR)) + { + const uint32_t a = (unpacked_src_blk.m_mode == UASTC_MODE_INDEX_SOLID_COLOR) ? unpacked_src_blk.m_solid_color[3] : 255; + + dst.m_base = a; + dst.m_table = 13; + dst.m_multiplier = 1; + + memcpy(dst.m_selectors, g_etc2_eac_a8_sel4, sizeof(g_etc2_eac_a8_sel4)); + + return; + } + + uint32_t min_a = 255, max_a = 0; + for (uint32_t i = 0; i < 16; i++) + { + min_a = basisu::minimum(min_a, pSrc_pixels[i].a); + max_a = basisu::maximum(max_a, pSrc_pixels[i].a); + } + + if (min_a == max_a) + { + dst.m_base = min_a; + dst.m_table = 13; + dst.m_multiplier = 1; + + memcpy(dst.m_selectors, g_etc2_eac_a8_sel4, sizeof(g_etc2_eac_a8_sel4)); + return; + } + + const uint32_t table = unpacked_src_blk.m_etc2_hints & 0xF; + const int multiplier = unpacked_src_blk.m_etc2_hints >> 4; + + assert(multiplier >= 1); + + dst.m_multiplier = multiplier; + dst.m_table = table; + + const float range = (float)(g_eac_modifier_table[dst.m_table][ETC2_EAC_MAX_VALUE_SELECTOR] - g_eac_modifier_table[dst.m_table][ETC2_EAC_MIN_VALUE_SELECTOR]); + const int center = (int)roundf(basisu::lerp((float)min_a, (float)max_a, (float)(0 - g_eac_modifier_table[dst.m_table][ETC2_EAC_MIN_VALUE_SELECTOR]) / range)); + + dst.m_base = center; + + const int8_t* pTable = &g_eac_modifier_table[dst.m_table][0]; + + uint32_t vals[8]; + for (uint32_t j = 0; j < 8; j++) + vals[j] = clamp255(center + (pTable[j] * multiplier)); + + uint64_t sels = 0; + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t a = block_pixels[i & 3][i >> 2].a; + + const uint32_t err0 = (basisu::iabs(vals[0] - a) << 3) | 0; + const uint32_t err1 = (basisu::iabs(vals[1] - a) << 3) | 1; + const uint32_t err2 = (basisu::iabs(vals[2] - a) << 3) | 2; + const uint32_t err3 = (basisu::iabs(vals[3] - a) << 3) | 3; + const uint32_t err4 = (basisu::iabs(vals[4] - a) << 3) | 4; + const uint32_t err5 = (basisu::iabs(vals[5] - a) << 3) | 5; + const uint32_t err6 = (basisu::iabs(vals[6] - a) << 3) | 6; + const uint32_t err7 = (basisu::iabs(vals[7] - a) << 3) | 7; + + const uint32_t min_err = basisu::minimum(basisu::minimum(basisu::minimum(basisu::minimum(basisu::minimum(basisu::minimum(err0, err1, err2), err3), err4), err5), err6), err7); + + const uint64_t best_index = min_err & 7; + sels |= (best_index << (45 - i * 3)); + } + + dst.set_selector_bits(sels); + } + + bool transcode_uastc_to_etc2_rgba(const uastc_block& src_blk, void* pDst) + { + eac_block& dst_etc2_eac_a8_blk = *static_cast(pDst); + decoder_etc_block& dst_etc1_blk = static_cast(pDst)[1]; + + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + color32 block_pixels[4][4]; + if (unpacked_src_blk.m_mode != UASTC_MODE_INDEX_SOLID_COLOR) + { + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + } + + transcode_uastc_to_etc2_eac_a8(unpacked_src_blk, block_pixels, &dst_etc2_eac_a8_blk); + + transcode_uastc_to_etc1(unpacked_src_blk, block_pixels, &dst_etc1_blk); + + return true; + } + + static const uint8_t s_uastc5_to_bc1[32] = { 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1 }; + static const uint8_t s_uastc4_to_bc1[16] = { 0, 0, 0, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 1, 1, 1 }; + static const uint8_t s_uastc3_to_bc1[8] = { 0, 0, 2, 2, 3, 3, 1, 1 }; + static const uint8_t s_uastc2_to_bc1[4] = { 0, 2, 3, 1 }; + static const uint8_t s_uastc1_to_bc1[2] = { 0, 1 }; + const uint8_t* s_uastc_to_bc1_weights[6] = { nullptr, s_uastc1_to_bc1, s_uastc2_to_bc1, s_uastc3_to_bc1, s_uastc4_to_bc1, s_uastc5_to_bc1 }; + + void encode_bc4(void* pDst, const uint8_t* pPixels, uint32_t stride) + { + uint32_t min0_v, max0_v, min1_v, max1_v,min2_v, max2_v, min3_v, max3_v; + + { + min0_v = max0_v = pPixels[0 * stride]; + min1_v = max1_v = pPixels[1 * stride]; + min2_v = max2_v = pPixels[2 * stride]; + min3_v = max3_v = pPixels[3 * stride]; + } + + { + uint32_t v0 = pPixels[4 * stride]; min0_v = basisu::minimum(min0_v, v0); max0_v = basisu::maximum(max0_v, v0); + uint32_t v1 = pPixels[5 * stride]; min1_v = basisu::minimum(min1_v, v1); max1_v = basisu::maximum(max1_v, v1); + uint32_t v2 = pPixels[6 * stride]; min2_v = basisu::minimum(min2_v, v2); max2_v = basisu::maximum(max2_v, v2); + uint32_t v3 = pPixels[7 * stride]; min3_v = basisu::minimum(min3_v, v3); max3_v = basisu::maximum(max3_v, v3); + } + + { + uint32_t v0 = pPixels[8 * stride]; min0_v = basisu::minimum(min0_v, v0); max0_v = basisu::maximum(max0_v, v0); + uint32_t v1 = pPixels[9 * stride]; min1_v = basisu::minimum(min1_v, v1); max1_v = basisu::maximum(max1_v, v1); + uint32_t v2 = pPixels[10 * stride]; min2_v = basisu::minimum(min2_v, v2); max2_v = basisu::maximum(max2_v, v2); + uint32_t v3 = pPixels[11 * stride]; min3_v = basisu::minimum(min3_v, v3); max3_v = basisu::maximum(max3_v, v3); + } + + { + uint32_t v0 = pPixels[12 * stride]; min0_v = basisu::minimum(min0_v, v0); max0_v = basisu::maximum(max0_v, v0); + uint32_t v1 = pPixels[13 * stride]; min1_v = basisu::minimum(min1_v, v1); max1_v = basisu::maximum(max1_v, v1); + uint32_t v2 = pPixels[14 * stride]; min2_v = basisu::minimum(min2_v, v2); max2_v = basisu::maximum(max2_v, v2); + uint32_t v3 = pPixels[15 * stride]; min3_v = basisu::minimum(min3_v, v3); max3_v = basisu::maximum(max3_v, v3); + } + + const uint32_t min_v = basisu::minimum(min0_v, min1_v, min2_v, min3_v); + const uint32_t max_v = basisu::maximum(max0_v, max1_v, max2_v, max3_v); + + uint8_t* pDst_bytes = static_cast(pDst); + pDst_bytes[0] = (uint8_t)max_v; + pDst_bytes[1] = (uint8_t)min_v; + + if (max_v == min_v) + { + memset(pDst_bytes + 2, 0, 6); + return; + } + + const uint32_t delta = max_v - min_v; + + // min_v is now 0. Compute thresholds between values by scaling max_v. It's x14 because we're adding two x7 scale factors. + const int t0 = delta * 13; + const int t1 = delta * 11; + const int t2 = delta * 9; + const int t3 = delta * 7; + const int t4 = delta * 5; + const int t5 = delta * 3; + const int t6 = delta * 1; + + // BC4 floors in its divisions, which we compensate for with the 4 bias. + // This function is optimal for all possible inputs (i.e. it outputs the same results as checking all 8 values and choosing the closest one). + const int bias = 4 - min_v * 14; + + static const uint32_t s_tran0[8] = { 1U , 7U , 6U , 5U , 4U , 3U , 2U , 0U }; + static const uint32_t s_tran1[8] = { 1U << 3U, 7U << 3U, 6U << 3U, 5U << 3U, 4U << 3U, 3U << 3U, 2U << 3U, 0U << 3U }; + static const uint32_t s_tran2[8] = { 1U << 6U, 7U << 6U, 6U << 6U, 5U << 6U, 4U << 6U, 3U << 6U, 2U << 6U, 0U << 6U }; + static const uint32_t s_tran3[8] = { 1U << 9U, 7U << 9U, 6U << 9U, 5U << 9U, 4U << 9U, 3U << 9U, 2U << 9U, 0U << 9U }; + + uint64_t a0, a1, a2, a3; + { + const int v0 = pPixels[0 * stride] * 14 + bias; + const int v1 = pPixels[1 * stride] * 14 + bias; + const int v2 = pPixels[2 * stride] * 14 + bias; + const int v3 = pPixels[3 * stride] * 14 + bias; + a0 = s_tran0[(v0 >= t0) + (v0 >= t1) + (v0 >= t2) + (v0 >= t3) + (v0 >= t4) + (v0 >= t5) + (v0 >= t6)]; + a1 = s_tran1[(v1 >= t0) + (v1 >= t1) + (v1 >= t2) + (v1 >= t3) + (v1 >= t4) + (v1 >= t5) + (v1 >= t6)]; + a2 = s_tran2[(v2 >= t0) + (v2 >= t1) + (v2 >= t2) + (v2 >= t3) + (v2 >= t4) + (v2 >= t5) + (v2 >= t6)]; + a3 = s_tran3[(v3 >= t0) + (v3 >= t1) + (v3 >= t2) + (v3 >= t3) + (v3 >= t4) + (v3 >= t5) + (v3 >= t6)]; + } + + { + const int v0 = pPixels[4 * stride] * 14 + bias; + const int v1 = pPixels[5 * stride] * 14 + bias; + const int v2 = pPixels[6 * stride] * 14 + bias; + const int v3 = pPixels[7 * stride] * 14 + bias; + a0 |= (s_tran0[(v0 >= t0) + (v0 >= t1) + (v0 >= t2) + (v0 >= t3) + (v0 >= t4) + (v0 >= t5) + (v0 >= t6)] << 12U); + a1 |= (s_tran1[(v1 >= t0) + (v1 >= t1) + (v1 >= t2) + (v1 >= t3) + (v1 >= t4) + (v1 >= t5) + (v1 >= t6)] << 12U); + a2 |= (s_tran2[(v2 >= t0) + (v2 >= t1) + (v2 >= t2) + (v2 >= t3) + (v2 >= t4) + (v2 >= t5) + (v2 >= t6)] << 12U); + a3 |= (s_tran3[(v3 >= t0) + (v3 >= t1) + (v3 >= t2) + (v3 >= t3) + (v3 >= t4) + (v3 >= t5) + (v3 >= t6)] << 12U); + } + + { + const int v0 = pPixels[8 * stride] * 14 + bias; + const int v1 = pPixels[9 * stride] * 14 + bias; + const int v2 = pPixels[10 * stride] * 14 + bias; + const int v3 = pPixels[11 * stride] * 14 + bias; + a0 |= (((uint64_t)s_tran0[(v0 >= t0) + (v0 >= t1) + (v0 >= t2) + (v0 >= t3) + (v0 >= t4) + (v0 >= t5) + (v0 >= t6)]) << 24U); + a1 |= (((uint64_t)s_tran1[(v1 >= t0) + (v1 >= t1) + (v1 >= t2) + (v1 >= t3) + (v1 >= t4) + (v1 >= t5) + (v1 >= t6)]) << 24U); + a2 |= (((uint64_t)s_tran2[(v2 >= t0) + (v2 >= t1) + (v2 >= t2) + (v2 >= t3) + (v2 >= t4) + (v2 >= t5) + (v2 >= t6)]) << 24U); + a3 |= (((uint64_t)s_tran3[(v3 >= t0) + (v3 >= t1) + (v3 >= t2) + (v3 >= t3) + (v3 >= t4) + (v3 >= t5) + (v3 >= t6)]) << 24U); + } + + { + const int v0 = pPixels[12 * stride] * 14 + bias; + const int v1 = pPixels[13 * stride] * 14 + bias; + const int v2 = pPixels[14 * stride] * 14 + bias; + const int v3 = pPixels[15 * stride] * 14 + bias; + a0 |= (((uint64_t)s_tran0[(v0 >= t0) + (v0 >= t1) + (v0 >= t2) + (v0 >= t3) + (v0 >= t4) + (v0 >= t5) + (v0 >= t6)]) << 36U); + a1 |= (((uint64_t)s_tran1[(v1 >= t0) + (v1 >= t1) + (v1 >= t2) + (v1 >= t3) + (v1 >= t4) + (v1 >= t5) + (v1 >= t6)]) << 36U); + a2 |= (((uint64_t)s_tran2[(v2 >= t0) + (v2 >= t1) + (v2 >= t2) + (v2 >= t3) + (v2 >= t4) + (v2 >= t5) + (v2 >= t6)]) << 36U); + a3 |= (((uint64_t)s_tran3[(v3 >= t0) + (v3 >= t1) + (v3 >= t2) + (v3 >= t3) + (v3 >= t4) + (v3 >= t5) + (v3 >= t6)]) << 36U); + } + + const uint64_t f = a0 | a1 | a2 | a3; + + pDst_bytes[2] = (uint8_t)f; + pDst_bytes[3] = (uint8_t)(f >> 8U); + pDst_bytes[4] = (uint8_t)(f >> 16U); + pDst_bytes[5] = (uint8_t)(f >> 24U); + pDst_bytes[6] = (uint8_t)(f >> 32U); + pDst_bytes[7] = (uint8_t)(f >> 40U); + } + + static void bc1_find_sels(const color32 *pSrc_pixels, uint32_t lr, uint32_t lg, uint32_t lb, uint32_t hr, uint32_t hg, uint32_t hb, uint8_t sels[16]) + { + uint32_t block_r[4], block_g[4], block_b[4]; + + block_r[0] = (lr << 3) | (lr >> 2); block_g[0] = (lg << 2) | (lg >> 4); block_b[0] = (lb << 3) | (lb >> 2); + block_r[3] = (hr << 3) | (hr >> 2); block_g[3] = (hg << 2) | (hg >> 4); block_b[3] = (hb << 3) | (hb >> 2); + block_r[1] = (block_r[0] * 2 + block_r[3]) / 3; block_g[1] = (block_g[0] * 2 + block_g[3]) / 3; block_b[1] = (block_b[0] * 2 + block_b[3]) / 3; + block_r[2] = (block_r[3] * 2 + block_r[0]) / 3; block_g[2] = (block_g[3] * 2 + block_g[0]) / 3; block_b[2] = (block_b[3] * 2 + block_b[0]) / 3; + + int ar = block_r[3] - block_r[0], ag = block_g[3] - block_g[0], ab = block_b[3] - block_b[0]; + + int dots[4]; + for (uint32_t i = 0; i < 4; i++) + dots[i] = (int)block_r[i] * ar + (int)block_g[i] * ag + (int)block_b[i] * ab; + + int t0 = dots[0] + dots[1], t1 = dots[1] + dots[2], t2 = dots[2] + dots[3]; + + ar *= 2; ag *= 2; ab *= 2; + + for (uint32_t i = 0; i < 16; i++) + { + const int d = pSrc_pixels[i].r * ar + pSrc_pixels[i].g * ag + pSrc_pixels[i].b * ab; + static const uint8_t s_sels[4] = { 3, 2, 1, 0 }; + + // Rounding matters here! + // d <= t0: <=, not <, to the later LS step "sees" a wider range of selectors. It matters for quality. + sels[i] = s_sels[(d <= t0) + (d < t1) + (d < t2)]; + } + } + + static inline void bc1_find_sels_2(const color32* pSrc_pixels, uint32_t lr, uint32_t lg, uint32_t lb, uint32_t hr, uint32_t hg, uint32_t hb, uint8_t sels[16]) + { + uint32_t block_r[4], block_g[4], block_b[4]; + + block_r[0] = (lr << 3) | (lr >> 2); block_g[0] = (lg << 2) | (lg >> 4); block_b[0] = (lb << 3) | (lb >> 2); + block_r[3] = (hr << 3) | (hr >> 2); block_g[3] = (hg << 2) | (hg >> 4); block_b[3] = (hb << 3) | (hb >> 2); + block_r[1] = (block_r[0] * 2 + block_r[3]) / 3; block_g[1] = (block_g[0] * 2 + block_g[3]) / 3; block_b[1] = (block_b[0] * 2 + block_b[3]) / 3; + block_r[2] = (block_r[3] * 2 + block_r[0]) / 3; block_g[2] = (block_g[3] * 2 + block_g[0]) / 3; block_b[2] = (block_b[3] * 2 + block_b[0]) / 3; + + int ar = block_r[3] - block_r[0], ag = block_g[3] - block_g[0], ab = block_b[3] - block_b[0]; + + int dots[4]; + for (uint32_t i = 0; i < 4; i++) + dots[i] = (int)block_r[i] * ar + (int)block_g[i] * ag + (int)block_b[i] * ab; + + int t0 = dots[0] + dots[1], t1 = dots[1] + dots[2], t2 = dots[2] + dots[3]; + + ar *= 2; ag *= 2; ab *= 2; + + static const uint8_t s_sels[4] = { 3, 2, 1, 0 }; + + for (uint32_t i = 0; i < 16; i += 4) + { + const int d0 = pSrc_pixels[i+0].r * ar + pSrc_pixels[i+0].g * ag + pSrc_pixels[i+0].b * ab; + const int d1 = pSrc_pixels[i+1].r * ar + pSrc_pixels[i+1].g * ag + pSrc_pixels[i+1].b * ab; + const int d2 = pSrc_pixels[i+2].r * ar + pSrc_pixels[i+2].g * ag + pSrc_pixels[i+2].b * ab; + const int d3 = pSrc_pixels[i+3].r * ar + pSrc_pixels[i+3].g * ag + pSrc_pixels[i+3].b * ab; + + sels[i+0] = s_sels[(d0 <= t0) + (d0 < t1) + (d0 < t2)]; + sels[i+1] = s_sels[(d1 <= t0) + (d1 < t1) + (d1 < t2)]; + sels[i+2] = s_sels[(d2 <= t0) + (d2 < t1) + (d2 < t2)]; + sels[i+3] = s_sels[(d3 <= t0) + (d3 < t1) + (d3 < t2)]; + } + } + + struct vec3F { float c[3]; }; + + static bool compute_least_squares_endpoints_rgb(const color32* pColors, const uint8_t* pSelectors, vec3F* pXl, vec3F* pXh) + { + // Derived from bc7enc16's LS function. + // Least squares using normal equations: http://www.cs.cornell.edu/~bindel/class/cs3220-s12/notes/lec10.pdf + // I did this in matrix form first, expanded out all the ops, then optimized it a bit. + uint32_t uq00_r = 0, uq10_r = 0, ut_r = 0, uq00_g = 0, uq10_g = 0, ut_g = 0, uq00_b = 0, uq10_b = 0, ut_b = 0; + + // This table is: 9 * (w * w), 9 * ((1.0f - w) * w), 9 * ((1.0f - w) * (1.0f - w)) + // where w is [0,1/3,2/3,1]. 9 is the perfect multiplier. + static const uint32_t s_weight_vals[4] = { 0x000009, 0x010204, 0x040201, 0x090000 }; + + uint32_t weight_accum = 0; + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t r = pColors[i].c[0], g = pColors[i].c[1], b = pColors[i].c[2]; + const uint32_t sel = pSelectors[i]; + ut_r += r; + ut_g += g; + ut_b += b; + weight_accum += s_weight_vals[sel]; + uq00_r += sel * r; + uq00_g += sel * g; + uq00_b += sel * b; + } + + float q00_r = (float)uq00_r, q10_r = (float)uq10_r, t_r = (float)ut_r; + float q00_g = (float)uq00_g, q10_g = (float)uq10_g, t_g = (float)ut_g; + float q00_b = (float)uq00_b, q10_b = (float)uq10_b, t_b = (float)ut_b; + + q10_r = t_r * 3.0f - q00_r; + q10_g = t_g * 3.0f - q00_g; + q10_b = t_b * 3.0f - q00_b; + + float z00 = (float)((weight_accum >> 16) & 0xFF); + float z10 = (float)((weight_accum >> 8) & 0xFF); + float z11 = (float)(weight_accum & 0xFF); + float z01 = z10; + + float det = z00 * z11 - z01 * z10; + if (fabs(det) < 1e-8f) + return false; + + det = 3.0f / det; + + float iz00, iz01, iz10, iz11; + iz00 = z11 * det; + iz01 = -z01 * det; + iz10 = -z10 * det; + iz11 = z00 * det; + + pXl->c[0] = iz00 * q00_r + iz01 * q10_r; pXh->c[0] = iz10 * q00_r + iz11 * q10_r; + pXl->c[1] = iz00 * q00_g + iz01 * q10_g; pXh->c[1] = iz10 * q00_g + iz11 * q10_g; + pXl->c[2] = iz00 * q00_b + iz01 * q10_b; pXh->c[2] = iz10 * q00_b + iz11 * q10_b; + + // Check and fix channel singularities - might not be needed, but is in UASTC's encoder. + for (uint32_t c = 0; c < 3; c++) + { + if ((pXl->c[c] < 0.0f) || (pXh->c[c] > 255.0f)) + { + uint32_t lo_v = UINT32_MAX, hi_v = 0; + for (uint32_t i = 0; i < 16; i++) + { + lo_v = basisu::minimumu(lo_v, pColors[i].c[c]); + hi_v = basisu::maximumu(hi_v, pColors[i].c[c]); + } + + if (lo_v == hi_v) + { + pXl->c[c] = (float)lo_v; + pXh->c[c] = (float)hi_v; + } + } + } + + return true; + } + + void encode_bc1_solid_block(void* pDst, uint32_t fr, uint32_t fg, uint32_t fb) + { + dxt1_block* pDst_block = static_cast(pDst); + + uint32_t mask = 0xAA; + uint32_t max16 = (g_bc1_match5_equals_1[fr].m_hi << 11) | (g_bc1_match6_equals_1[fg].m_hi << 5) | g_bc1_match5_equals_1[fb].m_hi; + uint32_t min16 = (g_bc1_match5_equals_1[fr].m_lo << 11) | (g_bc1_match6_equals_1[fg].m_lo << 5) | g_bc1_match5_equals_1[fb].m_lo; + + if (min16 == max16) + { + // Always forbid 3 color blocks + // This is to guarantee that BC3 blocks never use punchthrough alpha (3 color) mode, which isn't supported on some (all?) GPU's. + mask = 0; + + // Make l > h + if (min16 > 0) + min16--; + else + { + // l = h = 0 + assert(min16 == max16 && max16 == 0); + + max16 = 1; + min16 = 0; + mask = 0x55; + } + + assert(max16 > min16); + } + + if (max16 < min16) + { + std::swap(max16, min16); + mask ^= 0x55; + } + + pDst_block->set_low_color(static_cast(max16)); + pDst_block->set_high_color(static_cast(min16)); + pDst_block->m_selectors[0] = static_cast(mask); + pDst_block->m_selectors[1] = static_cast(mask); + pDst_block->m_selectors[2] = static_cast(mask); + pDst_block->m_selectors[3] = static_cast(mask); + } + + static inline uint8_t to_5(uint32_t v) { v = v * 31 + 128; return (uint8_t)((v + (v >> 8)) >> 8); } + static inline uint8_t to_6(uint32_t v) { v = v * 63 + 128; return (uint8_t)((v + (v >> 8)) >> 8); } + + // Good references: squish library, stb_dxt. + void encode_bc1(void* pDst, const uint8_t* pPixels, uint32_t flags) + { + const color32* pSrc_pixels = (const color32*)pPixels; + dxt1_block* pDst_block = static_cast(pDst); + + int avg_r = -1, avg_g = 0, avg_b = 0; + int lr = 0, lg = 0, lb = 0, hr = 0, hg = 0, hb = 0; + uint8_t sels[16]; + + const bool use_sels = (flags & cEncodeBC1UseSelectors) != 0; + if (use_sels) + { + // Caller is jamming in their own selectors for us to try. + const uint32_t s = pDst_block->m_selectors[0] | (pDst_block->m_selectors[1] << 8) | (pDst_block->m_selectors[2] << 16) | (pDst_block->m_selectors[3] << 24); + + static const uint8_t s_sel_tran[4] = { 0, 3, 1, 2 }; + + for (uint32_t i = 0; i < 16; i++) + sels[i] = s_sel_tran[(s >> (i * 2)) & 3]; + } + else + { + const uint32_t fr = pSrc_pixels[0].r, fg = pSrc_pixels[0].g, fb = pSrc_pixels[0].b; + + uint32_t j; + for (j = 1; j < 16; j++) + if ((pSrc_pixels[j].r != fr) || (pSrc_pixels[j].g != fg) || (pSrc_pixels[j].b != fb)) + break; + + if (j == 16) + { + encode_bc1_solid_block(pDst, fr, fg, fb); + return; + } + + // Select 2 colors along the principle axis. (There must be a faster/simpler way.) + int total_r = fr, total_g = fg, total_b = fb; + int max_r = fr, max_g = fg, max_b = fb; + int min_r = fr, min_g = fg, min_b = fb; + for (uint32_t i = 1; i < 16; i++) + { + const int r = pSrc_pixels[i].r, g = pSrc_pixels[i].g, b = pSrc_pixels[i].b; + max_r = basisu::maximum(max_r, r); max_g = basisu::maximum(max_g, g); max_b = basisu::maximum(max_b, b); + min_r = basisu::minimum(min_r, r); min_g = basisu::minimum(min_g, g); min_b = basisu::minimum(min_b, b); + total_r += r; total_g += g; total_b += b; + } + + avg_r = (total_r + 8) >> 4; + avg_g = (total_g + 8) >> 4; + avg_b = (total_b + 8) >> 4; + + int icov[6] = { 0, 0, 0, 0, 0, 0 }; + for (uint32_t i = 0; i < 16; i++) + { + int r = (int)pSrc_pixels[i].r - avg_r; + int g = (int)pSrc_pixels[i].g - avg_g; + int b = (int)pSrc_pixels[i].b - avg_b; + icov[0] += r * r; + icov[1] += r * g; + icov[2] += r * b; + icov[3] += g * g; + icov[4] += g * b; + icov[5] += b * b; + } + + float cov[6]; + for (uint32_t i = 0; i < 6; i++) + cov[i] = static_cast(icov[i])* (1.0f / 255.0f); + +#if 0 + // Seems silly to use full PCA to choose 2 colors. The diff in avg. PSNR between using PCA vs. not is small (~.025 difference). + // TODO: Try 2 or 3 different normalized diagonal vectors, choose the one that results in the largest dot delta + int saxis_r = max_r - min_r; + int saxis_g = max_g - min_g; + int saxis_b = max_b - min_b; +#else + float xr = (float)(max_r - min_r); + float xg = (float)(max_g - min_g); + float xb = (float)(max_b - min_b); + //float xr = (float)(max_r - avg_r); // max-avg is nearly the same, and doesn't require computing min's + //float xg = (float)(max_g - avg_g); + //float xb = (float)(max_b - avg_b); + for (uint32_t power_iter = 0; power_iter < 4; power_iter++) + { + float r = xr * cov[0] + xg * cov[1] + xb * cov[2]; + float g = xr * cov[1] + xg * cov[3] + xb * cov[4]; + float b = xr * cov[2] + xg * cov[4] + xb * cov[5]; + xr = r; xg = g; xb = b; + } + + float k = basisu::maximum(fabsf(xr), fabsf(xg), fabsf(xb)); + int saxis_r = 306, saxis_g = 601, saxis_b = 117; + if (k >= 2) + { + float m = 1024.0f / k; + saxis_r = (int)(xr * m); + saxis_g = (int)(xg * m); + saxis_b = (int)(xb * m); + } +#endif + + int low_dot = INT_MAX, high_dot = INT_MIN, low_c = 0, high_c = 0; + for (uint32_t i = 0; i < 16; i++) + { + int dot = pSrc_pixels[i].r * saxis_r + pSrc_pixels[i].g * saxis_g + pSrc_pixels[i].b * saxis_b; + if (dot < low_dot) + { + low_dot = dot; + low_c = i; + } + if (dot > high_dot) + { + high_dot = dot; + high_c = i; + } + } + + lr = to_5(pSrc_pixels[low_c].r); + lg = to_6(pSrc_pixels[low_c].g); + lb = to_5(pSrc_pixels[low_c].b); + + hr = to_5(pSrc_pixels[high_c].r); + hg = to_6(pSrc_pixels[high_c].g); + hb = to_5(pSrc_pixels[high_c].b); + + bc1_find_sels(pSrc_pixels, lr, lg, lb, hr, hg, hb, sels); + } // if (use_sels) + + const uint32_t total_ls_passes = (flags & cEncodeBC1HigherQuality) ? 3 : (flags & cEncodeBC1HighQuality ? 2 : 1); + for (uint32_t ls_pass = 0; ls_pass < total_ls_passes; ls_pass++) + { + // This is where the real magic happens. We have an array of candidate selectors, so let's use least squares to compute the optimal low/high endpoint colors. + vec3F xl, xh; + if (!compute_least_squares_endpoints_rgb(pSrc_pixels, sels, &xl, &xh)) + { + if (avg_r < 0) + { + int total_r = 0, total_g = 0, total_b = 0; + for (uint32_t i = 0; i < 16; i++) + { + total_r += pSrc_pixels[i].r; + total_g += pSrc_pixels[i].g; + total_b += pSrc_pixels[i].b; + } + + avg_r = (total_r + 8) >> 4; + avg_g = (total_g + 8) >> 4; + avg_b = (total_b + 8) >> 4; + } + + // All selectors equal - treat it as a solid block which should always be equal or better. + lr = g_bc1_match5_equals_1[avg_r].m_hi; + lg = g_bc1_match6_equals_1[avg_g].m_hi; + lb = g_bc1_match5_equals_1[avg_b].m_hi; + + hr = g_bc1_match5_equals_1[avg_r].m_lo; + hg = g_bc1_match6_equals_1[avg_g].m_lo; + hb = g_bc1_match5_equals_1[avg_b].m_lo; + + // In high/higher quality mode, let it try again in case the optimal tables have caused the sels to diverge. + } + else + { + lr = basisu::clamp((int)((xl.c[0]) * (31.0f / 255.0f) + .5f), 0, 31); + lg = basisu::clamp((int)((xl.c[1]) * (63.0f / 255.0f) + .5f), 0, 63); + lb = basisu::clamp((int)((xl.c[2]) * (31.0f / 255.0f) + .5f), 0, 31); + + hr = basisu::clamp((int)((xh.c[0]) * (31.0f / 255.0f) + .5f), 0, 31); + hg = basisu::clamp((int)((xh.c[1]) * (63.0f / 255.0f) + .5f), 0, 63); + hb = basisu::clamp((int)((xh.c[2]) * (31.0f / 255.0f) + .5f), 0, 31); + } + + bc1_find_sels(pSrc_pixels, lr, lg, lb, hr, hg, hb, sels); + } + + uint32_t lc16 = dxt1_block::pack_unscaled_color(lr, lg, lb); + uint32_t hc16 = dxt1_block::pack_unscaled_color(hr, hg, hb); + + // Always forbid 3 color blocks + if (lc16 == hc16) + { + uint8_t mask = 0; + + // Make l > h + if (hc16 > 0) + hc16--; + else + { + // lc16 = hc16 = 0 + assert(lc16 == hc16 && hc16 == 0); + + hc16 = 0; + lc16 = 1; + mask = 0x55; // select hc16 + } + + assert(lc16 > hc16); + pDst_block->set_low_color(static_cast(lc16)); + pDst_block->set_high_color(static_cast(hc16)); + + pDst_block->m_selectors[0] = mask; + pDst_block->m_selectors[1] = mask; + pDst_block->m_selectors[2] = mask; + pDst_block->m_selectors[3] = mask; + } + else + { + uint8_t invert_mask = 0; + if (lc16 < hc16) + { + std::swap(lc16, hc16); + invert_mask = 0x55; + } + + assert(lc16 > hc16); + pDst_block->set_low_color((uint16_t)lc16); + pDst_block->set_high_color((uint16_t)hc16); + + uint32_t packed_sels = 0; + static const uint8_t s_sel_trans[4] = { 0, 2, 3, 1 }; + for (uint32_t i = 0; i < 16; i++) + packed_sels |= ((uint32_t)s_sel_trans[sels[i]] << (i * 2)); + + pDst_block->m_selectors[0] = (uint8_t)packed_sels ^ invert_mask; + pDst_block->m_selectors[1] = (uint8_t)(packed_sels >> 8) ^ invert_mask; + pDst_block->m_selectors[2] = (uint8_t)(packed_sels >> 16) ^ invert_mask; + pDst_block->m_selectors[3] = (uint8_t)(packed_sels >> 24) ^ invert_mask; + } + } + + void encode_bc1_alt(void* pDst, const uint8_t* pPixels, uint32_t flags) + { + const color32* pSrc_pixels = (const color32*)pPixels; + dxt1_block* pDst_block = static_cast(pDst); + + int avg_r = -1, avg_g = 0, avg_b = 0; + int lr = 0, lg = 0, lb = 0, hr = 0, hg = 0, hb = 0; + uint8_t sels[16]; + + const bool use_sels = (flags & cEncodeBC1UseSelectors) != 0; + if (use_sels) + { + // Caller is jamming in their own selectors for us to try. + const uint32_t s = pDst_block->m_selectors[0] | (pDst_block->m_selectors[1] << 8) | (pDst_block->m_selectors[2] << 16) | (pDst_block->m_selectors[3] << 24); + + static const uint8_t s_sel_tran[4] = { 0, 3, 1, 2 }; + + for (uint32_t i = 0; i < 16; i++) + sels[i] = s_sel_tran[(s >> (i * 2)) & 3]; + } + else + { + const uint32_t fr = pSrc_pixels[0].r, fg = pSrc_pixels[0].g, fb = pSrc_pixels[0].b; + + uint32_t j; + for (j = 1; j < 16; j++) + if ((pSrc_pixels[j].r != fr) || (pSrc_pixels[j].g != fg) || (pSrc_pixels[j].b != fb)) + break; + + if (j == 16) + { + encode_bc1_solid_block(pDst, fr, fg, fb); + return; + } + + // Select 2 colors along the principle axis. (There must be a faster/simpler way.) + int total_r = fr, total_g = fg, total_b = fb; + int max_r = fr, max_g = fg, max_b = fb; + int min_r = fr, min_g = fg, min_b = fb; + uint32_t grayscale_flag = (fr == fg) && (fr == fb); + for (uint32_t i = 1; i < 16; i++) + { + const int r = pSrc_pixels[i].r, g = pSrc_pixels[i].g, b = pSrc_pixels[i].b; + grayscale_flag &= ((r == g) && (r == b)); + max_r = basisu::maximum(max_r, r); max_g = basisu::maximum(max_g, g); max_b = basisu::maximum(max_b, b); + min_r = basisu::minimum(min_r, r); min_g = basisu::minimum(min_g, g); min_b = basisu::minimum(min_b, b); + total_r += r; total_g += g; total_b += b; + } + + if (grayscale_flag) + { + // Grayscale blocks are a common enough case to specialize. + if ((max_r - min_r) < 2) + { + lr = lb = hr = hb = to_5(fr); + lg = hg = to_6(fr); + } + else + { + lr = lb = to_5(min_r); + lg = to_6(min_r); + + hr = hb = to_5(max_r); + hg = to_6(max_r); + } + } + else + { + avg_r = (total_r + 8) >> 4; + avg_g = (total_g + 8) >> 4; + avg_b = (total_b + 8) >> 4; + + // Find the shortest vector from a AABB corner to the block's average color. + // This is to help avoid outliers. + + uint32_t dist[3][2]; + dist[0][0] = basisu::square(min_r - avg_r) << 3; dist[0][1] = basisu::square(max_r - avg_r) << 3; + dist[1][0] = basisu::square(min_g - avg_g) << 3; dist[1][1] = basisu::square(max_g - avg_g) << 3; + dist[2][0] = basisu::square(min_b - avg_b) << 3; dist[2][1] = basisu::square(max_b - avg_b) << 3; + + uint32_t min_d0 = (dist[0][0] + dist[1][0] + dist[2][0]); + uint32_t d4 = (dist[0][0] + dist[1][0] + dist[2][1]) | 4; + min_d0 = basisu::minimum(min_d0, d4); + + uint32_t min_d1 = (dist[0][1] + dist[1][0] + dist[2][0]) | 1; + uint32_t d5 = (dist[0][1] + dist[1][0] + dist[2][1]) | 5; + min_d1 = basisu::minimum(min_d1, d5); + + uint32_t d2 = (dist[0][0] + dist[1][1] + dist[2][0]) | 2; + min_d0 = basisu::minimum(min_d0, d2); + + uint32_t d3 = (dist[0][1] + dist[1][1] + dist[2][0]) | 3; + min_d1 = basisu::minimum(min_d1, d3); + + uint32_t d6 = (dist[0][0] + dist[1][1] + dist[2][1]) | 6; + min_d0 = basisu::minimum(min_d0, d6); + + uint32_t d7 = (dist[0][1] + dist[1][1] + dist[2][1]) | 7; + min_d1 = basisu::minimum(min_d1, d7); + + uint32_t min_d = basisu::minimum(min_d0, min_d1); + uint32_t best_i = min_d & 7; + + int delta_r = (best_i & 1) ? (max_r - avg_r) : (avg_r - min_r); + int delta_g = (best_i & 2) ? (max_g - avg_g) : (avg_g - min_g); + int delta_b = (best_i & 4) ? (max_b - avg_b) : (avg_b - min_b); + + // Note: if delta_r/g/b==0, we actually want to choose a single color, so the block average color optimization kicks in. + uint32_t low_c = 0, high_c = 0; + if ((delta_r | delta_g | delta_b) != 0) + { + // Now we have a smaller AABB going from the block's average color to a cornerpoint of the larger AABB. + // Project all pixels colors along the 4 vectors going from a smaller AABB cornerpoint to the opposite cornerpoint, find largest projection. + // One of these vectors will be a decent approximation of the block's PCA. + const int saxis0_r = delta_r, saxis0_g = delta_g, saxis0_b = delta_b; + + int low_dot0 = INT_MAX, high_dot0 = INT_MIN; + int low_dot1 = INT_MAX, high_dot1 = INT_MIN; + int low_dot2 = INT_MAX, high_dot2 = INT_MIN; + int low_dot3 = INT_MAX, high_dot3 = INT_MIN; + + //int low_c0, low_c1, low_c2, low_c3; + //int high_c0, high_c1, high_c2, high_c3; + + for (uint32_t i = 0; i < 16; i++) + { + const int dotx = pSrc_pixels[i].r * saxis0_r; + const int doty = pSrc_pixels[i].g * saxis0_g; + const int dotz = pSrc_pixels[i].b * saxis0_b; + + const int dot0 = ((dotz + dotx + doty) << 4) + i; + const int dot1 = ((dotz - dotx - doty) << 4) + i; + const int dot2 = ((dotz - dotx + doty) << 4) + i; + const int dot3 = ((dotz + dotx - doty) << 4) + i; + + if (dot0 < low_dot0) + { + low_dot0 = dot0; + //low_c0 = i; + } + if ((dot0 ^ 15) > high_dot0) + { + high_dot0 = dot0 ^ 15; + //high_c0 = i; + } + + if (dot1 < low_dot1) + { + low_dot1 = dot1; + //low_c1 = i; + } + if ((dot1 ^ 15) > high_dot1) + { + high_dot1 = dot1 ^ 15; + //high_c1 = i; + } + + if (dot2 < low_dot2) + { + low_dot2 = dot2; + //low_c2 = i; + } + if ((dot2 ^ 15) > high_dot2) + { + high_dot2 = dot2 ^ 15; + //high_c2 = i; + } + + if (dot3 < low_dot3) + { + low_dot3 = dot3; + //low_c3 = i; + } + if ((dot3 ^ 15) > high_dot3) + { + high_dot3 = dot3 ^ 15; + //high_c3 = i; + } + } + + low_c = low_dot0 & 15; + high_c = ~high_dot0 & 15; + uint32_t r = (high_dot0 & ~15) - (low_dot0 & ~15); + + uint32_t tr = (high_dot1 & ~15) - (low_dot1 & ~15); + if (tr > r) { + low_c = low_dot1 & 15; + high_c = ~high_dot1 & 15; + r = tr; + } + + tr = (high_dot2 & ~15) - (low_dot2 & ~15); + if (tr > r) { + low_c = low_dot2 & 15; + high_c = ~high_dot2 & 15; + r = tr; + } + + tr = (high_dot3 & ~15) - (low_dot3 & ~15); + if (tr > r) { + low_c = low_dot3 & 15; + high_c = ~high_dot3 & 15; + } + } + + lr = to_5(pSrc_pixels[low_c].r); + lg = to_6(pSrc_pixels[low_c].g); + lb = to_5(pSrc_pixels[low_c].b); + + hr = to_5(pSrc_pixels[high_c].r); + hg = to_6(pSrc_pixels[high_c].g); + hb = to_5(pSrc_pixels[high_c].b); + } + + bc1_find_sels_2(pSrc_pixels, lr, lg, lb, hr, hg, hb, sels); + } // if (use_sels) + + const uint32_t total_ls_passes = (flags & cEncodeBC1HigherQuality) ? 3 : (flags & cEncodeBC1HighQuality ? 2 : 1); + for (uint32_t ls_pass = 0; ls_pass < total_ls_passes; ls_pass++) + { + int prev_lr = lr, prev_lg = lg, prev_lb = lb, prev_hr = hr, prev_hg = hg, prev_hb = hb; + + // This is where the real magic happens. We have an array of candidate selectors, so let's use least squares to compute the optimal low/high endpoint colors. + vec3F xl, xh; + if (!compute_least_squares_endpoints_rgb(pSrc_pixels, sels, &xl, &xh)) + { + if (avg_r < 0) + { + int total_r = 0, total_g = 0, total_b = 0; + for (uint32_t i = 0; i < 16; i++) + { + total_r += pSrc_pixels[i].r; + total_g += pSrc_pixels[i].g; + total_b += pSrc_pixels[i].b; + } + + avg_r = (total_r + 8) >> 4; + avg_g = (total_g + 8) >> 4; + avg_b = (total_b + 8) >> 4; + } + + // All selectors equal - treat it as a solid block which should always be equal or better. + lr = g_bc1_match5_equals_1[avg_r].m_hi; + lg = g_bc1_match6_equals_1[avg_g].m_hi; + lb = g_bc1_match5_equals_1[avg_b].m_hi; + + hr = g_bc1_match5_equals_1[avg_r].m_lo; + hg = g_bc1_match6_equals_1[avg_g].m_lo; + hb = g_bc1_match5_equals_1[avg_b].m_lo; + + // In high/higher quality mode, let it try again in case the optimal tables have caused the sels to diverge. + } + else + { + lr = basisu::clamp((int)((xl.c[0]) * (31.0f / 255.0f) + .5f), 0, 31); + lg = basisu::clamp((int)((xl.c[1]) * (63.0f / 255.0f) + .5f), 0, 63); + lb = basisu::clamp((int)((xl.c[2]) * (31.0f / 255.0f) + .5f), 0, 31); + + hr = basisu::clamp((int)((xh.c[0]) * (31.0f / 255.0f) + .5f), 0, 31); + hg = basisu::clamp((int)((xh.c[1]) * (63.0f / 255.0f) + .5f), 0, 63); + hb = basisu::clamp((int)((xh.c[2]) * (31.0f / 255.0f) + .5f), 0, 31); + } + + if ((prev_lr == lr) && (prev_lg == lg) && (prev_lb == lb) && (prev_hr == hr) && (prev_hg == hg) && (prev_hb == hb)) + break; + + bc1_find_sels_2(pSrc_pixels, lr, lg, lb, hr, hg, hb, sels); + } + + uint32_t lc16 = dxt1_block::pack_unscaled_color(lr, lg, lb); + uint32_t hc16 = dxt1_block::pack_unscaled_color(hr, hg, hb); + + // Always forbid 3 color blocks + if (lc16 == hc16) + { + uint8_t mask = 0; + + // Make l > h + if (hc16 > 0) + hc16--; + else + { + // lc16 = hc16 = 0 + assert(lc16 == hc16 && hc16 == 0); + + hc16 = 0; + lc16 = 1; + mask = 0x55; // select hc16 + } + + assert(lc16 > hc16); + pDst_block->set_low_color(static_cast(lc16)); + pDst_block->set_high_color(static_cast(hc16)); + + pDst_block->m_selectors[0] = mask; + pDst_block->m_selectors[1] = mask; + pDst_block->m_selectors[2] = mask; + pDst_block->m_selectors[3] = mask; + } + else + { + uint8_t invert_mask = 0; + if (lc16 < hc16) + { + std::swap(lc16, hc16); + invert_mask = 0x55; + } + + assert(lc16 > hc16); + pDst_block->set_low_color((uint16_t)lc16); + pDst_block->set_high_color((uint16_t)hc16); + + uint32_t packed_sels = 0; + static const uint8_t s_sel_trans[4] = { 0, 2, 3, 1 }; + for (uint32_t i = 0; i < 16; i++) + packed_sels |= ((uint32_t)s_sel_trans[sels[i]] << (i * 2)); + + pDst_block->m_selectors[0] = (uint8_t)packed_sels ^ invert_mask; + pDst_block->m_selectors[1] = (uint8_t)(packed_sels >> 8) ^ invert_mask; + pDst_block->m_selectors[2] = (uint8_t)(packed_sels >> 16) ^ invert_mask; + pDst_block->m_selectors[3] = (uint8_t)(packed_sels >> 24) ^ invert_mask; + } + } + + // Scale the UASTC first subset endpoints and first plane's weight indices directly to BC1's - fastest. + void transcode_uastc_to_bc1_hint0(const unpacked_uastc_block& unpacked_src_blk, void* pDst) + { + const uint32_t mode = unpacked_src_blk.m_mode; + const astc_block_desc& astc_blk = unpacked_src_blk.m_astc; + + dxt1_block& b = *static_cast(pDst); + + const uint32_t endpoint_range = g_uastc_mode_endpoint_ranges[mode]; + + const uint32_t total_comps = g_uastc_mode_comps[mode]; + + if (total_comps == 2) + { + const uint32_t l = g_astc_unquant[endpoint_range][astc_blk.m_endpoints[0]].m_unquant; + const uint32_t h = g_astc_unquant[endpoint_range][astc_blk.m_endpoints[1]].m_unquant; + + b.set_low_color(dxt1_block::pack_color(color32(l, l, l, 255), true, 127)); + b.set_high_color(dxt1_block::pack_color(color32(h, h, h, 255), true, 127)); + } + else + { + b.set_low_color(dxt1_block::pack_color( + color32(g_astc_unquant[endpoint_range][astc_blk.m_endpoints[0]].m_unquant, + g_astc_unquant[endpoint_range][astc_blk.m_endpoints[2]].m_unquant, + g_astc_unquant[endpoint_range][astc_blk.m_endpoints[4]].m_unquant, + 255), true, 127) + ); + + b.set_high_color(dxt1_block::pack_color( + color32(g_astc_unquant[endpoint_range][astc_blk.m_endpoints[1]].m_unquant, + g_astc_unquant[endpoint_range][astc_blk.m_endpoints[3]].m_unquant, + g_astc_unquant[endpoint_range][astc_blk.m_endpoints[5]].m_unquant, + 255), true, 127) + ); + } + + if (b.get_low_color() == b.get_high_color()) + { + // Always forbid 3 color blocks + uint16_t lc16 = (uint16_t)b.get_low_color(); + uint16_t hc16 = (uint16_t)b.get_high_color(); + + uint8_t mask = 0; + + // Make l > h + if (hc16 > 0) + hc16--; + else + { + // lc16 = hc16 = 0 + assert(lc16 == hc16 && hc16 == 0); + + hc16 = 0; + lc16 = 1; + mask = 0x55; // select hc16 + } + + assert(lc16 > hc16); + b.set_low_color(static_cast(lc16)); + b.set_high_color(static_cast(hc16)); + + b.m_selectors[0] = mask; + b.m_selectors[1] = mask; + b.m_selectors[2] = mask; + b.m_selectors[3] = mask; + } + else + { + bool invert = false; + if (b.get_low_color() < b.get_high_color()) + { + std::swap(b.m_low_color[0], b.m_high_color[0]); + std::swap(b.m_low_color[1], b.m_high_color[1]); + invert = true; + } + + const uint8_t* pTran = s_uastc_to_bc1_weights[g_uastc_mode_weight_bits[mode]]; + + const uint32_t plane_shift = g_uastc_mode_planes[mode] - 1; + + uint32_t sels = 0; + for (int i = 15; i >= 0; --i) + { + uint32_t s = pTran[astc_blk.m_weights[i << plane_shift]]; + + if (invert) + s ^= 1; + + sels = (sels << 2) | s; + } + b.m_selectors[0] = sels & 0xFF; + b.m_selectors[1] = (sels >> 8) & 0xFF; + b.m_selectors[2] = (sels >> 16) & 0xFF; + b.m_selectors[3] = (sels >> 24) & 0xFF; + } + } + + // Scale the UASTC first plane's weight indices to BC1, use 1 or 2 least squares passes to compute endpoints - no PCA needed. + void transcode_uastc_to_bc1_hint1(const unpacked_uastc_block& unpacked_src_blk, const color32 block_pixels[4][4], void* pDst, bool high_quality) + { + const uint32_t mode = unpacked_src_blk.m_mode; + + const astc_block_desc& astc_blk = unpacked_src_blk.m_astc; + + dxt1_block& b = *static_cast(pDst); + + b.set_low_color(1); + b.set_high_color(0); + + const uint8_t* pTran = s_uastc_to_bc1_weights[g_uastc_mode_weight_bits[mode]]; + + const uint32_t plane_shift = g_uastc_mode_planes[mode] - 1; + + uint32_t sels = 0; + for (int i = 15; i >= 0; --i) + { + sels <<= 2; + sels |= pTran[astc_blk.m_weights[i << plane_shift]]; + } + + b.m_selectors[0] = sels & 0xFF; + b.m_selectors[1] = (sels >> 8) & 0xFF; + b.m_selectors[2] = (sels >> 16) & 0xFF; + b.m_selectors[3] = (sels >> 24) & 0xFF; + + encode_bc1(&b, (const uint8_t*)&block_pixels[0][0].c[0], (high_quality ? cEncodeBC1HighQuality : 0) | cEncodeBC1UseSelectors); + } + + bool transcode_uastc_to_bc1(const uastc_block& src_blk, void* pDst, bool high_quality) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + const uint32_t mode = unpacked_src_blk.m_mode; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + encode_bc1_solid_block(pDst, unpacked_src_blk.m_solid_color.r, unpacked_src_blk.m_solid_color.g, unpacked_src_blk.m_solid_color.b); + return true; + } + + if ((!high_quality) && (unpacked_src_blk.m_bc1_hint0)) + transcode_uastc_to_bc1_hint0(unpacked_src_blk, pDst); + else + { + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + if (unpacked_src_blk.m_bc1_hint1) + transcode_uastc_to_bc1_hint1(unpacked_src_blk, block_pixels, pDst, high_quality); + else + encode_bc1(pDst, &block_pixels[0][0].r, high_quality ? cEncodeBC1HighQuality : 0); + } + + return true; + } + + static void write_bc4_solid_block(uint8_t* pDst, uint32_t a) + { + pDst[0] = (uint8_t)a; + pDst[1] = (uint8_t)a; + memset(pDst + 2, 0, 6); + } + + bool transcode_uastc_to_bc3(const uastc_block& src_blk, void* pDst, bool high_quality) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + const uint32_t mode = unpacked_src_blk.m_mode; + + void* pBC4_block = pDst; + dxt1_block* pBC1_block = &static_cast(pDst)[1]; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + write_bc4_solid_block(static_cast(pBC4_block), unpacked_src_blk.m_solid_color.a); + encode_bc1_solid_block(pBC1_block, unpacked_src_blk.m_solid_color.r, unpacked_src_blk.m_solid_color.g, unpacked_src_blk.m_solid_color.b); + return true; + } + + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + basist::encode_bc4(pBC4_block, &block_pixels[0][0].a, sizeof(color32)); + + if ((!high_quality) && (unpacked_src_blk.m_bc1_hint0)) + transcode_uastc_to_bc1_hint0(unpacked_src_blk, pBC1_block); + else + { + if (unpacked_src_blk.m_bc1_hint1) + transcode_uastc_to_bc1_hint1(unpacked_src_blk, block_pixels, pBC1_block, high_quality); + else + encode_bc1(pBC1_block, &block_pixels[0][0].r, high_quality ? cEncodeBC1HighQuality : 0); + } + + return true; + } + + bool transcode_uastc_to_bc4(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0) + { + BASISU_NOTE_UNUSED(high_quality); + + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + const uint32_t mode = unpacked_src_blk.m_mode; + + void* pBC4_block = pDst; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + write_bc4_solid_block(static_cast(pBC4_block), unpacked_src_blk.m_solid_color.c[chan0]); + return true; + } + + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + basist::encode_bc4(pBC4_block, &block_pixels[0][0].c[chan0], sizeof(color32)); + + return true; + } + + bool transcode_uastc_to_bc5(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0, uint32_t chan1) + { + BASISU_NOTE_UNUSED(high_quality); + + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + const uint32_t mode = unpacked_src_blk.m_mode; + + void* pBC4_block0 = pDst; + void* pBC4_block1 = (uint8_t*)pDst + 8; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + write_bc4_solid_block(static_cast(pBC4_block0), unpacked_src_blk.m_solid_color.c[chan0]); + write_bc4_solid_block(static_cast(pBC4_block1), unpacked_src_blk.m_solid_color.c[chan1]); + return true; + } + + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + basist::encode_bc4(pBC4_block0, &block_pixels[0][0].c[chan0], sizeof(color32)); + basist::encode_bc4(pBC4_block1, &block_pixels[0][0].c[chan1], sizeof(color32)); + + return true; + } + + static const uint8_t s_etc2_eac_bit_ofs[16] = { 45, 33, 21, 9, 42, 30, 18, 6, 39, 27, 15, 3, 36, 24, 12, 0 }; + + static void pack_eac_solid_block(eac_block& blk, uint32_t a) + { + blk.m_base = static_cast(a); + blk.m_table = 13; + blk.m_multiplier = 0; + + memcpy(blk.m_selectors, g_etc2_eac_a8_sel4, sizeof(g_etc2_eac_a8_sel4)); + + return; + } + + // Only checks 4 tables. + static void pack_eac(eac_block& blk, const uint8_t* pPixels, uint32_t stride) + { + uint32_t min_alpha = 255, max_alpha = 0; + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t a = pPixels[i * stride]; + if (a < min_alpha) min_alpha = a; + if (a > max_alpha) max_alpha = a; + } + + if (min_alpha == max_alpha) + { + pack_eac_solid_block(blk, min_alpha); + return; + } + + const uint32_t alpha_range = max_alpha - min_alpha; + + const uint32_t SINGLE_TABLE_THRESH = 5; + if (alpha_range <= SINGLE_TABLE_THRESH) + { + // If alpha_range <= 5 table 13 is lossless + int base = clamp255((int)max_alpha - 2); + + blk.m_base = base; + blk.m_multiplier = 1; + blk.m_table = 13; + + base -= 3; + + uint64_t packed_sels = 0; + for (uint32_t i = 0; i < 16; i++) + { + const int a = pPixels[i * stride]; + + static const uint8_t s_sels[6] = { 2, 1, 0, 4, 5, 6 }; + + int sel = a - base; + assert(sel >= 0 && sel <= 5); + + packed_sels |= (static_cast(s_sels[sel]) << s_etc2_eac_bit_ofs[i]); + } + + blk.set_selector_bits(packed_sels); + + return; + } + + const uint32_t T0 = 2, T1 = 8, T2 = 11, T3 = 13; + static const uint8_t s_tables[4] = { T0, T1, T2, T3 }; + + int base[4], mul[4]; + uint32_t mul_or = 0; + for (uint32_t i = 0; i < 4; i++) + { + const uint32_t table = s_tables[i]; + + const float range = (float)(g_eac_modifier_table[table][ETC2_EAC_MAX_VALUE_SELECTOR] - g_eac_modifier_table[table][ETC2_EAC_MIN_VALUE_SELECTOR]); + + base[i] = clamp255((int)roundf(basisu::lerp((float)min_alpha, (float)max_alpha, (float)(0 - g_eac_modifier_table[table][ETC2_EAC_MIN_VALUE_SELECTOR]) / range))); + mul[i] = clampi((int)roundf(alpha_range / range), 1, 15); + mul_or |= mul[i]; + } + + uint32_t total_err[4] = { 0, 0, 0, 0 }; + uint8_t sels[4][16]; + + for (uint32_t i = 0; i < 16; i++) + { + const int a = pPixels[i * stride]; + + uint32_t l0 = UINT32_MAX, l1 = UINT32_MAX, l2 = UINT32_MAX, l3 = UINT32_MAX; + + if ((a < 7) || (a > (255 - 7))) + { + for (uint32_t s = 0; s < 8; s++) + { + const int v0 = clamp255(mul[0] * g_eac_modifier_table[T0][s] + base[0]); + const int v1 = clamp255(mul[1] * g_eac_modifier_table[T1][s] + base[1]); + const int v2 = clamp255(mul[2] * g_eac_modifier_table[T2][s] + base[2]); + const int v3 = clamp255(mul[3] * g_eac_modifier_table[T3][s] + base[3]); + + l0 = basisu::minimum(l0, (basisu::iabs(v0 - a) << 3) | s); + l1 = basisu::minimum(l1, (basisu::iabs(v1 - a) << 3) | s); + l2 = basisu::minimum(l2, (basisu::iabs(v2 - a) << 3) | s); + l3 = basisu::minimum(l3, (basisu::iabs(v3 - a) << 3) | s); + } + } + else if (mul_or == 1) + { + const int a0 = base[0] - a, a1 = base[1] - a, a2 = base[2] - a, a3 = base[3] - a; + + for (uint32_t s = 0; s < 8; s++) + { + const int v0 = g_eac_modifier_table[T0][s] + a0; + const int v1 = g_eac_modifier_table[T1][s] + a1; + const int v2 = g_eac_modifier_table[T2][s] + a2; + const int v3 = g_eac_modifier_table[T3][s] + a3; + + l0 = basisu::minimum(l0, (basisu::iabs(v0) << 3) | s); + l1 = basisu::minimum(l1, (basisu::iabs(v1) << 3) | s); + l2 = basisu::minimum(l2, (basisu::iabs(v2) << 3) | s); + l3 = basisu::minimum(l3, (basisu::iabs(v3) << 3) | s); + } + } + else + { + const int a0 = base[0] - a, a1 = base[1] - a, a2 = base[2] - a, a3 = base[3] - a; + + for (uint32_t s = 0; s < 8; s++) + { + const int v0 = mul[0] * g_eac_modifier_table[T0][s] + a0; + const int v1 = mul[1] * g_eac_modifier_table[T1][s] + a1; + const int v2 = mul[2] * g_eac_modifier_table[T2][s] + a2; + const int v3 = mul[3] * g_eac_modifier_table[T3][s] + a3; + + l0 = basisu::minimum(l0, (basisu::iabs(v0) << 3) | s); + l1 = basisu::minimum(l1, (basisu::iabs(v1) << 3) | s); + l2 = basisu::minimum(l2, (basisu::iabs(v2) << 3) | s); + l3 = basisu::minimum(l3, (basisu::iabs(v3) << 3) | s); + } + } + + sels[0][i] = l0 & 7; + sels[1][i] = l1 & 7; + sels[2][i] = l2 & 7; + sels[3][i] = l3 & 7; + + total_err[0] += basisu::square(l0 >> 3); + total_err[1] += basisu::square(l1 >> 3); + total_err[2] += basisu::square(l2 >> 3); + total_err[3] += basisu::square(l3 >> 3); + } + + uint32_t min_err = total_err[0], min_index = 0; + for (uint32_t i = 1; i < 4; i++) + { + if (total_err[i] < min_err) + { + min_err = total_err[i]; + min_index = i; + } + } + + blk.m_base = base[min_index]; + blk.m_multiplier = mul[min_index]; + blk.m_table = s_tables[min_index]; + + uint64_t packed_sels = 0; + const uint8_t* pSels = &sels[min_index][0]; + for (uint32_t i = 0; i < 16; i++) + packed_sels |= (static_cast(pSels[i]) << s_etc2_eac_bit_ofs[i]); + + blk.set_selector_bits(packed_sels); + } + + // Checks all 16 tables. Around ~2 dB better vs. pack_eac(), ~1.2 dB less than near-optimal. + static void pack_eac_high_quality(eac_block& blk, const uint8_t* pPixels, uint32_t stride) + { + uint32_t min_alpha = 255, max_alpha = 0; + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t a = pPixels[i * stride]; + if (a < min_alpha) min_alpha = a; + if (a > max_alpha) max_alpha = a; + } + + if (min_alpha == max_alpha) + { + pack_eac_solid_block(blk, min_alpha); + return; + } + + const uint32_t alpha_range = max_alpha - min_alpha; + + const uint32_t SINGLE_TABLE_THRESH = 5; + if (alpha_range <= SINGLE_TABLE_THRESH) + { + // If alpha_range <= 5 table 13 is lossless + int base = clamp255((int)max_alpha - 2); + + blk.m_base = base; + blk.m_multiplier = 1; + blk.m_table = 13; + + base -= 3; + + uint64_t packed_sels = 0; + for (uint32_t i = 0; i < 16; i++) + { + const int a = pPixels[i * stride]; + + static const uint8_t s_sels[6] = { 2, 1, 0, 4, 5, 6 }; + + int sel = a - base; + assert(sel >= 0 && sel <= 5); + + packed_sels |= (static_cast(s_sels[sel]) << s_etc2_eac_bit_ofs[i]); + } + + blk.set_selector_bits(packed_sels); + + return; + } + + int base[16], mul[16]; + for (uint32_t table = 0; table < 16; table++) + { + const float range = (float)(g_eac_modifier_table[table][ETC2_EAC_MAX_VALUE_SELECTOR] - g_eac_modifier_table[table][ETC2_EAC_MIN_VALUE_SELECTOR]); + + base[table] = clamp255((int)roundf(basisu::lerp((float)min_alpha, (float)max_alpha, (float)(0 - g_eac_modifier_table[table][ETC2_EAC_MIN_VALUE_SELECTOR]) / range))); + mul[table] = clampi((int)roundf(alpha_range / range), 1, 15); + } + + uint32_t total_err[16]; + memset(total_err, 0, sizeof(total_err)); + + uint8_t sels[16][16]; + + for (uint32_t table = 0; table < 16; table++) + { + const int8_t* pTable = &g_eac_modifier_table[table][0]; + const int m = mul[table], b = base[table]; + + uint32_t prev_l = 0, prev_a = UINT32_MAX; + + for (uint32_t i = 0; i < 16; i++) + { + const int a = pPixels[i * stride]; + + if ((uint32_t)a == prev_a) + { + sels[table][i] = prev_l & 7; + total_err[table] += basisu::square(prev_l >> 3); + } + else + { + uint32_t l = basisu::iabs(clamp255(m * pTable[0] + b) - a) << 3; + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[1] + b) - a) << 3) | 1); + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[2] + b) - a) << 3) | 2); + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[3] + b) - a) << 3) | 3); + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[4] + b) - a) << 3) | 4); + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[5] + b) - a) << 3) | 5); + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[6] + b) - a) << 3) | 6); + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[7] + b) - a) << 3) | 7); + + sels[table][i] = l & 7; + total_err[table] += basisu::square(l >> 3); + + prev_l = l; + prev_a = a; + } + } + } + + uint32_t min_err = total_err[0], min_index = 0; + for (uint32_t i = 1; i < 16; i++) + { + if (total_err[i] < min_err) + { + min_err = total_err[i]; + min_index = i; + } + } + + blk.m_base = base[min_index]; + blk.m_multiplier = mul[min_index]; + blk.m_table = min_index; + + uint64_t packed_sels = 0; + const uint8_t* pSels = &sels[min_index][0]; + for (uint32_t i = 0; i < 16; i++) + packed_sels |= (static_cast(pSels[i]) << s_etc2_eac_bit_ofs[i]); + + blk.set_selector_bits(packed_sels); + } + + bool transcode_uastc_to_etc2_eac_r11(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + const uint32_t mode = unpacked_src_blk.m_mode; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + pack_eac_solid_block(*static_cast(pDst), unpacked_src_blk.m_solid_color.c[chan0]); + return true; + } + + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + if (chan0 == 3) + transcode_uastc_to_etc2_eac_a8(unpacked_src_blk, block_pixels, pDst); + else + (high_quality ? pack_eac_high_quality : pack_eac)(*static_cast(pDst), &block_pixels[0][0].c[chan0], sizeof(color32)); + + return true; + } + + bool transcode_uastc_to_etc2_eac_rg11(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0, uint32_t chan1) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + const uint32_t mode = unpacked_src_blk.m_mode; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + pack_eac_solid_block(static_cast(pDst)[0], unpacked_src_blk.m_solid_color.c[chan0]); + pack_eac_solid_block(static_cast(pDst)[1], unpacked_src_blk.m_solid_color.c[chan1]); + return true; + } + + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + if (chan0 == 3) + transcode_uastc_to_etc2_eac_a8(unpacked_src_blk, block_pixels, &static_cast(pDst)[0]); + else + (high_quality ? pack_eac_high_quality : pack_eac)(static_cast(pDst)[0], &block_pixels[0][0].c[chan0], sizeof(color32)); + + if (chan1 == 3) + transcode_uastc_to_etc2_eac_a8(unpacked_src_blk, block_pixels, &static_cast(pDst)[1]); + else + (high_quality ? pack_eac_high_quality : pack_eac)(static_cast(pDst)[1], &block_pixels[0][0].c[chan1], sizeof(color32)); + return true; + } + + // PVRTC1 + static void fixup_pvrtc1_4_modulation_rgb( + const uastc_block* pSrc_blocks, + const uint32_t* pPVRTC_endpoints, + void* pDst_blocks, + uint32_t num_blocks_x, uint32_t num_blocks_y, bool from_alpha) + { + const uint32_t x_mask = num_blocks_x - 1; + const uint32_t y_mask = num_blocks_y - 1; + const uint32_t x_bits = basisu::total_bits(x_mask); + const uint32_t y_bits = basisu::total_bits(y_mask); + const uint32_t min_bits = basisu::minimum(x_bits, y_bits); + //const uint32_t max_bits = basisu::maximum(x_bits, y_bits); + const uint32_t swizzle_mask = (1 << (min_bits * 2)) - 1; + + uint32_t block_index = 0; + + // really 3x3 + int e0[4][4], e1[4][4]; + + for (int y = 0; y < static_cast(num_blocks_y); y++) + { + const uint32_t* pE_rows[3]; + + for (int ey = 0; ey < 3; ey++) + { + int by = y + ey - 1; + + const uint32_t* pE = &pPVRTC_endpoints[(by & y_mask) * num_blocks_x]; + + pE_rows[ey] = pE; + + for (int ex = 0; ex < 3; ex++) + { + int bx = 0 + ex - 1; + + const uint32_t e = pE[bx & x_mask]; + + e0[ex][ey] = (get_opaque_endpoint_l0(e) * 255) / 31; + e1[ex][ey] = (get_opaque_endpoint_l1(e) * 255) / 31; + } + } + + const uint32_t y_swizzle = (g_pvrtc_swizzle_table[y >> 8] << 16) | g_pvrtc_swizzle_table[y & 0xFF]; + + for (int x = 0; x < static_cast(num_blocks_x); x++, block_index++) + { + const uastc_block& src_block = pSrc_blocks[block_index]; + + color32 block_pixels[4][4]; + unpack_uastc(src_block, &block_pixels[0][0], false); + if (from_alpha) + { + // Just set RGB to alpha to avoid adding complexity below. + for (uint32_t i = 0; i < 16; i++) + { + const uint8_t a = ((color32*)block_pixels)[i].a; + ((color32*)block_pixels)[i].set(a, a, a, 255); + } + } + + const uint32_t x_swizzle = (g_pvrtc_swizzle_table[x >> 8] << 17) | (g_pvrtc_swizzle_table[x & 0xFF] << 1); + + uint32_t swizzled = x_swizzle | y_swizzle; + if (num_blocks_x != num_blocks_y) + { + swizzled &= swizzle_mask; + + if (num_blocks_x > num_blocks_y) + swizzled |= ((x >> min_bits) << (min_bits * 2)); + else + swizzled |= ((y >> min_bits) << (min_bits * 2)); + } + + pvrtc4_block* pDst_block = static_cast(pDst_blocks) + swizzled; + pDst_block->m_endpoints = pPVRTC_endpoints[block_index]; + + { + const uint32_t ex = 2; + int bx = x + ex - 1; + bx &= x_mask; + +#define DO_ROW(ey) \ + { \ + const uint32_t e = pE_rows[ey][bx]; \ + e0[ex][ey] = (get_opaque_endpoint_l0(e) * 255) / 31; \ + e1[ex][ey] = (get_opaque_endpoint_l1(e) * 255) / 31; \ + } + + DO_ROW(0); + DO_ROW(1); + DO_ROW(2); +#undef DO_ROW + } + + uint32_t mod = 0; + +#define DO_PIX(lx, ly, w0, w1, w2, w3) \ + { \ + int ca_l = a0 * w0 + a1 * w1 + a2 * w2 + a3 * w3; \ + int cb_l = b0 * w0 + b1 * w1 + b2 * w2 + b3 * w3; \ + int cl = (block_pixels[ly][lx].r + block_pixels[ly][lx].g + block_pixels[ly][lx].b) * 16; \ + int dl = cb_l - ca_l; \ + int vl = cl - ca_l; \ + int p = vl * 16; \ + if (ca_l > cb_l) { p = -p; dl = -dl; } \ + uint32_t m = 0; \ + if (p > 3 * dl) m = (uint32_t)(1 << ((ly) * 8 + (lx) * 2)); \ + if (p > 8 * dl) m = (uint32_t)(2 << ((ly) * 8 + (lx) * 2)); \ + if (p > 13 * dl) m = (uint32_t)(3 << ((ly) * 8 + (lx) * 2)); \ + mod |= m; \ + } + + { + const uint32_t ex = 0, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 0, 4, 4, 4, 4); + DO_PIX(1, 0, 2, 6, 2, 6); + DO_PIX(0, 1, 2, 2, 6, 6); + DO_PIX(1, 1, 1, 3, 3, 9); + } + + { + const uint32_t ex = 1, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 0, 8, 0, 8, 0); + DO_PIX(3, 0, 6, 2, 6, 2); + DO_PIX(2, 1, 4, 0, 12, 0); + DO_PIX(3, 1, 3, 1, 9, 3); + } + + { + const uint32_t ex = 0, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 2, 8, 8, 0, 0); + DO_PIX(1, 2, 4, 12, 0, 0); + DO_PIX(0, 3, 6, 6, 2, 2); + DO_PIX(1, 3, 3, 9, 1, 3); + } + + { + const uint32_t ex = 1, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 2, 16, 0, 0, 0); + DO_PIX(3, 2, 12, 4, 0, 0); + DO_PIX(2, 3, 12, 0, 4, 0); + DO_PIX(3, 3, 9, 3, 3, 1); + } +#undef DO_PIX + + pDst_block->m_modulation = mod; + + e0[0][0] = e0[1][0]; e0[1][0] = e0[2][0]; + e0[0][1] = e0[1][1]; e0[1][1] = e0[2][1]; + e0[0][2] = e0[1][2]; e0[1][2] = e0[2][2]; + + e1[0][0] = e1[1][0]; e1[1][0] = e1[2][0]; + e1[0][1] = e1[1][1]; e1[1][1] = e1[2][1]; + e1[0][2] = e1[1][2]; e1[1][2] = e1[2][2]; + + } // x + } // y + } + + static void fixup_pvrtc1_4_modulation_rgba( + const uastc_block* pSrc_blocks, + const uint32_t* pPVRTC_endpoints, + void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y) + { + const uint32_t x_mask = num_blocks_x - 1; + const uint32_t y_mask = num_blocks_y - 1; + const uint32_t x_bits = basisu::total_bits(x_mask); + const uint32_t y_bits = basisu::total_bits(y_mask); + const uint32_t min_bits = basisu::minimum(x_bits, y_bits); + //const uint32_t max_bits = basisu::maximum(x_bits, y_bits); + const uint32_t swizzle_mask = (1 << (min_bits * 2)) - 1; + + uint32_t block_index = 0; + + // really 3x3 + int e0[4][4], e1[4][4]; + + for (int y = 0; y < static_cast(num_blocks_y); y++) + { + const uint32_t* pE_rows[3]; + + for (int ey = 0; ey < 3; ey++) + { + int by = y + ey - 1; + + const uint32_t* pE = &pPVRTC_endpoints[(by & y_mask) * num_blocks_x]; + + pE_rows[ey] = pE; + + for (int ex = 0; ex < 3; ex++) + { + int bx = 0 + ex - 1; + + const uint32_t e = pE[bx & x_mask]; + + e0[ex][ey] = get_endpoint_l8(e, 0); + e1[ex][ey] = get_endpoint_l8(e, 1); + } + } + + const uint32_t y_swizzle = (g_pvrtc_swizzle_table[y >> 8] << 16) | g_pvrtc_swizzle_table[y & 0xFF]; + + for (int x = 0; x < static_cast(num_blocks_x); x++, block_index++) + { + const uastc_block& src_block = pSrc_blocks[block_index]; + + color32 block_pixels[4][4]; + unpack_uastc(src_block, &block_pixels[0][0], false); + + const uint32_t x_swizzle = (g_pvrtc_swizzle_table[x >> 8] << 17) | (g_pvrtc_swizzle_table[x & 0xFF] << 1); + + uint32_t swizzled = x_swizzle | y_swizzle; + if (num_blocks_x != num_blocks_y) + { + swizzled &= swizzle_mask; + + if (num_blocks_x > num_blocks_y) + swizzled |= ((x >> min_bits) << (min_bits * 2)); + else + swizzled |= ((y >> min_bits) << (min_bits * 2)); + } + + pvrtc4_block* pDst_block = static_cast(pDst_blocks) + swizzled; + pDst_block->m_endpoints = pPVRTC_endpoints[block_index]; + + { + const uint32_t ex = 2; + int bx = x + ex - 1; + bx &= x_mask; + +#define DO_ROW(ey) \ + { \ + const uint32_t e = pE_rows[ey][bx]; \ + e0[ex][ey] = get_endpoint_l8(e, 0); \ + e1[ex][ey] = get_endpoint_l8(e, 1); \ + } + + DO_ROW(0); + DO_ROW(1); + DO_ROW(2); +#undef DO_ROW + } + + uint32_t mod = 0; + +#define DO_PIX(lx, ly, w0, w1, w2, w3) \ + { \ + int ca_l = a0 * w0 + a1 * w1 + a2 * w2 + a3 * w3; \ + int cb_l = b0 * w0 + b1 * w1 + b2 * w2 + b3 * w3; \ + int cl = 16 * (block_pixels[ly][lx].r + block_pixels[ly][lx].g + block_pixels[ly][lx].b + block_pixels[ly][lx].a); \ + int dl = cb_l - ca_l; \ + int vl = cl - ca_l; \ + int p = vl * 16; \ + if (ca_l > cb_l) { p = -p; dl = -dl; } \ + uint32_t m = 0; \ + if (p > 3 * dl) m = (uint32_t)(1 << ((ly) * 8 + (lx) * 2)); \ + if (p > 8 * dl) m = (uint32_t)(2 << ((ly) * 8 + (lx) * 2)); \ + if (p > 13 * dl) m = (uint32_t)(3 << ((ly) * 8 + (lx) * 2)); \ + mod |= m; \ + } + + { + const uint32_t ex = 0, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 0, 4, 4, 4, 4); + DO_PIX(1, 0, 2, 6, 2, 6); + DO_PIX(0, 1, 2, 2, 6, 6); + DO_PIX(1, 1, 1, 3, 3, 9); + } + + { + const uint32_t ex = 1, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 0, 8, 0, 8, 0); + DO_PIX(3, 0, 6, 2, 6, 2); + DO_PIX(2, 1, 4, 0, 12, 0); + DO_PIX(3, 1, 3, 1, 9, 3); + } + + { + const uint32_t ex = 0, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 2, 8, 8, 0, 0); + DO_PIX(1, 2, 4, 12, 0, 0); + DO_PIX(0, 3, 6, 6, 2, 2); + DO_PIX(1, 3, 3, 9, 1, 3); + } + + { + const uint32_t ex = 1, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 2, 16, 0, 0, 0); + DO_PIX(3, 2, 12, 4, 0, 0); + DO_PIX(2, 3, 12, 0, 4, 0); + DO_PIX(3, 3, 9, 3, 3, 1); + } +#undef DO_PIX + + pDst_block->m_modulation = mod; + + e0[0][0] = e0[1][0]; e0[1][0] = e0[2][0]; + e0[0][1] = e0[1][1]; e0[1][1] = e0[2][1]; + e0[0][2] = e0[1][2]; e0[1][2] = e0[2][2]; + + e1[0][0] = e1[1][0]; e1[1][0] = e1[2][0]; + e1[0][1] = e1[1][1]; e1[1][1] = e1[2][1]; + e1[0][2] = e1[1][2]; e1[1][2] = e1[2][2]; + + } // x + } // y + } + + bool transcode_uastc_to_pvrtc1_4_rgb(const uastc_block* pSrc_blocks, void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, bool high_quality, bool from_alpha) + { + BASISU_NOTE_UNUSED(high_quality); + + if ((!num_blocks_x) || (!num_blocks_y)) + return false; + + const uint32_t width = num_blocks_x * 4; + const uint32_t height = num_blocks_y * 4; + if (!basisu::is_pow2(width) || !basisu::is_pow2(height)) + return false; + + basisu::vector temp_endpoints(num_blocks_x * num_blocks_y); + + for (uint32_t y = 0; y < num_blocks_y; y++) + { + for (uint32_t x = 0; x < num_blocks_x; x++) + { + color32 block_pixels[16]; + if (!unpack_uastc(pSrc_blocks[x + y * num_blocks_x], block_pixels, false)) + return false; + + // Get block's RGB bounding box + color32 low_color(255, 255, 255, 255), high_color(0, 0, 0, 0); + + if (from_alpha) + { + uint32_t low_a = 255, high_a = 0; + for (uint32_t i = 0; i < 16; i++) + { + low_a = basisu::minimum(low_a, block_pixels[i].a); + high_a = basisu::maximum(high_a, block_pixels[i].a); + } + low_color.set(low_a, low_a, low_a, 255); + high_color.set(high_a, high_a, high_a, 255); + } + else + { + for (uint32_t i = 0; i < 16; i++) + { + low_color = color32::comp_min(low_color, block_pixels[i]); + high_color = color32::comp_max(high_color, block_pixels[i]); + } + } + + // Set PVRTC1 endpoints to floor/ceil of bounding box's coordinates. + pvrtc4_block temp; + temp.set_opaque_endpoint_floor(0, low_color); + temp.set_opaque_endpoint_ceil(1, high_color); + + temp_endpoints[x + y * num_blocks_x] = temp.m_endpoints; + } + } + + fixup_pvrtc1_4_modulation_rgb(pSrc_blocks, &temp_endpoints[0], pDst_blocks, num_blocks_x, num_blocks_y, from_alpha); + + return true; + } + + bool transcode_uastc_to_pvrtc1_4_rgba(const uastc_block* pSrc_blocks, void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, bool high_quality) + { + BASISU_NOTE_UNUSED(high_quality); + + if ((!num_blocks_x) || (!num_blocks_y)) + return false; + + const uint32_t width = num_blocks_x * 4; + const uint32_t height = num_blocks_y * 4; + if (!basisu::is_pow2(width) || !basisu::is_pow2(height)) + return false; + + basisu::vector temp_endpoints(num_blocks_x * num_blocks_y); + + for (uint32_t y = 0; y < num_blocks_y; y++) + { + for (uint32_t x = 0; x < num_blocks_x; x++) + { + color32 block_pixels[16]; + if (!unpack_uastc(pSrc_blocks[x + y * num_blocks_x], block_pixels, false)) + return false; + + // Get block's RGBA bounding box + color32 low_color(255, 255, 255, 255), high_color(0, 0, 0, 0); + + for (uint32_t i = 0; i < 16; i++) + { + low_color = color32::comp_min(low_color, block_pixels[i]); + high_color = color32::comp_max(high_color, block_pixels[i]); + } + + // Set PVRTC1 endpoints to floor/ceil of bounding box's coordinates. + pvrtc4_block temp; + temp.set_endpoint_floor(0, low_color); + temp.set_endpoint_ceil(1, high_color); + + temp_endpoints[x + y * num_blocks_x] = temp.m_endpoints; + } + } + + fixup_pvrtc1_4_modulation_rgba(pSrc_blocks, &temp_endpoints[0], pDst_blocks, num_blocks_x, num_blocks_y); + + return true; + } + + void uastc_init() + { + for (uint32_t range = 0; range < BC7ENC_TOTAL_ASTC_RANGES; range++) + { + if (!astc_is_valid_endpoint_range(range)) + continue; + + const uint32_t levels = astc_get_levels(range); + + uint32_t vals[256]; + for (uint32_t i = 0; i < levels; i++) + vals[i] = (unquant_astc_endpoint_val(i, range) << 8) | i; + + std::sort(vals, vals + levels); + + for (uint32_t i = 0; i < levels; i++) + { + const uint32_t order = vals[i] & 0xFF; + const uint32_t unq = vals[i] >> 8; + + g_astc_unquant[range][order].m_unquant = (uint8_t)unq; + g_astc_unquant[range][order].m_index = (uint8_t)i; + + } // i + } + + // TODO: Precompute? + // BC7 777.1 + for (int c = 0; c < 256; c++) + { + for (uint32_t lp = 0; lp < 2; lp++) + { + endpoint_err best; + best.m_error = (uint16_t)UINT16_MAX; + + for (uint32_t l = 0; l < 128; l++) + { + const uint32_t low = (l << 1) | lp; + + for (uint32_t h = 0; h < 128; h++) + { + const uint32_t high = (h << 1) | lp; + + const int k = (low * (64 - g_bc7_weights4[BC7ENC_MODE_6_OPTIMAL_INDEX]) + high * g_bc7_weights4[BC7ENC_MODE_6_OPTIMAL_INDEX] + 32) >> 6; + + const int err = (k - c) * (k - c); + if (err < best.m_error) + { + best.m_error = (uint16_t)err; + best.m_lo = (uint8_t)l; + best.m_hi = (uint8_t)h; + } + } // h + } // l + + g_bc7_mode_6_optimal_endpoints[c][lp] = best; + } // lp + + } // c + + // BC7 777 + for (int c = 0; c < 256; c++) + { + endpoint_err best; + best.m_error = (uint16_t)UINT16_MAX; + + for (uint32_t l = 0; l < 128; l++) + { + const uint32_t low = (l << 1) | (l >> 6); + + for (uint32_t h = 0; h < 128; h++) + { + const uint32_t high = (h << 1) | (h >> 6); + + const int k = (low * (64 - g_bc7_weights2[BC7ENC_MODE_5_OPTIMAL_INDEX]) + high * g_bc7_weights2[BC7ENC_MODE_5_OPTIMAL_INDEX] + 32) >> 6; + + const int err = (k - c) * (k - c); + if (err < best.m_error) + { + best.m_error = (uint16_t)err; + best.m_lo = (uint8_t)l; + best.m_hi = (uint8_t)h; + } + } // h + } // l + + g_bc7_mode_5_optimal_endpoints[c] = best; + + } // c + } + +#endif // #if BASISD_SUPPORT_UASTC + +// ------------------------------------------------------------------------------------------------------ +// KTX2 +// ------------------------------------------------------------------------------------------------------ + +#if BASISD_SUPPORT_KTX2 + const uint8_t g_ktx2_file_identifier[12] = { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x32, 0x30, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A }; + + ktx2_transcoder::ktx2_transcoder() : + m_etc1s_transcoder() + { + clear(); + } + + void ktx2_transcoder::clear() + { + m_pData = nullptr; + m_data_size = 0; + + memset(&m_header, 0, sizeof(m_header)); + m_levels.clear(); + m_dfd.clear(); + m_key_values.clear(); + memset(&m_etc1s_header, 0, sizeof(m_etc1s_header)); + m_etc1s_image_descs.clear(); + + m_format = basist::basis_tex_format::cETC1S; + + m_dfd_color_model = 0; + m_dfd_color_prims = KTX2_DF_PRIMARIES_UNSPECIFIED; + m_dfd_transfer_func = 0; + m_dfd_flags = 0; + m_dfd_samples = 0; + m_dfd_chan0 = KTX2_DF_CHANNEL_UASTC_RGB; + m_dfd_chan1 = KTX2_DF_CHANNEL_UASTC_RGB; + + m_etc1s_transcoder.clear(); + + m_def_transcoder_state.clear(); + + m_has_alpha = false; + m_is_video = false; + } + + bool ktx2_transcoder::init(const void* pData, uint32_t data_size) + { + clear(); + + if (!pData) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: pData is nullptr\n"); + assert(0); + return false; + } + + if (data_size <= sizeof(ktx2_header)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: File is impossibly too small to be a valid KTX2 file\n"); + return false; + } + + if (memcmp(pData, g_ktx2_file_identifier, sizeof(g_ktx2_file_identifier)) != 0) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: KTX2 file identifier is not present\n"); + return false; + } + + m_pData = static_cast(pData); + m_data_size = data_size; + + memcpy(&m_header, pData, sizeof(m_header)); + + // We only support UASTC and ETC1S + if (m_header.m_vk_format != KTX2_VK_FORMAT_UNDEFINED) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: KTX2 file must be in ETC1S or UASTC format\n"); + return false; + } + + // 3.3: "When format is VK_FORMAT_UNDEFINED, typeSize must equal 1." + if (m_header.m_type_size != 1) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid type_size\n"); + return false; + } + + // We only currently support 2D textures (plain, cubemapped, or texture array), which is by far the most common use case. + // The BasisU library does not support 1D or 3D textures at all. + if ((m_header.m_pixel_width < 1) || (m_header.m_pixel_height < 1) || (m_header.m_pixel_depth > 0)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Only 2D or cubemap textures are supported\n"); + return false; + } + + // Face count must be 1 or 6 + if ((m_header.m_face_count != 1) && (m_header.m_face_count != 6)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid face count, file is corrupted or invalid\n"); + return false; + } + + if (m_header.m_face_count > 1) + { + // 3.4: Make sure cubemaps are square. + if (m_header.m_pixel_width != m_header.m_pixel_height) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Cubemap is not square\n"); + return false; + } + } + + // 3.7 levelCount: "levelCount=0 is allowed, except for block-compressed formats" + if (m_header.m_level_count < 1) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid level count\n"); + return false; + } + + // Sanity check the level count. + if (m_header.m_level_count > KTX2_MAX_SUPPORTED_LEVEL_COUNT) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Too many levels or file is corrupted or invalid\n"); + return false; + } + + if (m_header.m_supercompression_scheme > KTX2_SS_ZSTANDARD) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid/unsupported supercompression or file is corrupted or invalid\n"); + return false; + } + + if (m_header.m_supercompression_scheme == KTX2_SS_BASISLZ) + { + if (m_header.m_sgd_byte_length <= sizeof(ktx2_etc1s_global_data_header)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Supercompression global data is too small\n"); + return false; + } + + if (m_header.m_sgd_byte_offset < sizeof(ktx2_header)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Supercompression global data offset is too low\n"); + return false; + } + + if (m_header.m_sgd_byte_offset + m_header.m_sgd_byte_length > m_data_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Supercompression global data offset and/or length is too high\n"); + return false; + } + } + + if (!m_levels.try_resize(m_header.m_level_count)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Out of memory\n"); + return false; + } + + const uint32_t level_index_size_in_bytes = basisu::maximum(1U, (uint32_t)m_header.m_level_count) * sizeof(ktx2_level_index); + + if ((sizeof(ktx2_header) + level_index_size_in_bytes) > m_data_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: File is too small (can't read level index array)\n"); + return false; + } + + memcpy(&m_levels[0], m_pData + sizeof(ktx2_header), level_index_size_in_bytes); + + // Sanity check the level offsets and byte sizes + for (uint32_t i = 0; i < m_levels.size(); i++) + { + if (m_levels[i].m_byte_offset < sizeof(ktx2_header)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid level offset (too low)\n"); + return false; + } + + if (!m_levels[i].m_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid level byte length\n"); + } + + if ((m_levels[i].m_byte_offset + m_levels[i].m_byte_length) > m_data_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid level offset and/or length\n"); + return false; + } + + const uint64_t MAX_SANE_LEVEL_UNCOMP_SIZE = 2048ULL * 1024ULL * 1024ULL; + + if (m_levels[i].m_uncompressed_byte_length >= MAX_SANE_LEVEL_UNCOMP_SIZE) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid level offset (too large)\n"); + return false; + } + + if (m_header.m_supercompression_scheme == KTX2_SS_BASISLZ) + { + if (m_levels[i].m_uncompressed_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid uncompressed length (0)\n"); + return false; + } + } + else if (m_header.m_supercompression_scheme >= KTX2_SS_ZSTANDARD) + { + if (!m_levels[i].m_uncompressed_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid uncompressed length (1)\n"); + return false; + } + } + } + + const uint32_t DFD_MINIMUM_SIZE = 44, DFD_MAXIMUM_SIZE = 60; + if ((m_header.m_dfd_byte_length != DFD_MINIMUM_SIZE) && (m_header.m_dfd_byte_length != DFD_MAXIMUM_SIZE)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Unsupported DFD size\n"); + return false; + } + + if (((m_header.m_dfd_byte_offset + m_header.m_dfd_byte_length) > m_data_size) || (m_header.m_dfd_byte_offset < sizeof(ktx2_header))) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid DFD offset and/or length\n"); + return false; + } + + const uint8_t* pDFD = m_pData + m_header.m_dfd_byte_offset; + + if (!m_dfd.try_resize(m_header.m_dfd_byte_length)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Out of memory\n"); + return false; + } + + memcpy(m_dfd.data(), pDFD, m_header.m_dfd_byte_length); + + // This is all hard coded for only ETC1S and UASTC. + uint32_t dfd_total_size = basisu::read_le_dword(pDFD); + + // 3.10.3: Sanity check + if (dfd_total_size != m_header.m_dfd_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: DFD size validation failed (1)\n"); + return false; + } + + // 3.10.3: More sanity checking + if (m_header.m_kvd_byte_length) + { + if (dfd_total_size != m_header.m_kvd_byte_offset - m_header.m_dfd_byte_offset) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: DFD size validation failed (2)\n"); + return false; + } + } + + const uint32_t dfd_bits = basisu::read_le_dword(pDFD + 3 * sizeof(uint32_t)); + const uint32_t sample_channel0 = basisu::read_le_dword(pDFD + 7 * sizeof(uint32_t)); + + m_dfd_color_model = dfd_bits & 255; + m_dfd_color_prims = (ktx2_df_color_primaries)((dfd_bits >> 8) & 255); + m_dfd_transfer_func = (dfd_bits >> 16) & 255; + m_dfd_flags = (dfd_bits >> 24) & 255; + + // See 3.10.1.Restrictions + if ((m_dfd_transfer_func != KTX2_KHR_DF_TRANSFER_LINEAR) && (m_dfd_transfer_func != KTX2_KHR_DF_TRANSFER_SRGB)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid DFD transfer function\n"); + return false; + } + + if (m_dfd_color_model == KTX2_KDF_DF_MODEL_ETC1S) + { + m_format = basist::basis_tex_format::cETC1S; + + // 3.10.2: "Whether the image has 1 or 2 slices can be determined from the DFDs sample count." + // If m_has_alpha is true it may be 2-channel RRRG or 4-channel RGBA, but we let the caller deal with that. + m_has_alpha = (m_header.m_dfd_byte_length == 60); + + m_dfd_samples = m_has_alpha ? 2 : 1; + m_dfd_chan0 = (ktx2_df_channel_id)((sample_channel0 >> 24) & 15); + + if (m_has_alpha) + { + const uint32_t sample_channel1 = basisu::read_le_dword(pDFD + 11 * sizeof(uint32_t)); + m_dfd_chan1 = (ktx2_df_channel_id)((sample_channel1 >> 24) & 15); + } + } + else if (m_dfd_color_model == KTX2_KDF_DF_MODEL_UASTC) + { + m_format = basist::basis_tex_format::cUASTC4x4; + + m_dfd_samples = 1; + m_dfd_chan0 = (ktx2_df_channel_id)((sample_channel0 >> 24) & 15); + + // We're assuming "DATA" means RGBA so it has alpha. + m_has_alpha = (m_dfd_chan0 == KTX2_DF_CHANNEL_UASTC_RGBA) || (m_dfd_chan0 == KTX2_DF_CHANNEL_UASTC_RRRG); + } + else + { + // Unsupported DFD color model. + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Unsupported DFD color model\n"); + return false; + } + + if (!read_key_values()) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: read_key_values() failed\n"); + return false; + } + + // Check for a KTXanimData key + for (uint32_t i = 0; i < m_key_values.size(); i++) + { + if (strcmp(reinterpret_cast(m_key_values[i].m_key.data()), "KTXanimData") == 0) + { + m_is_video = true; + break; + } + } + + return true; + } + + uint32_t ktx2_transcoder::get_etc1s_image_descs_image_flags(uint32_t level_index, uint32_t layer_index, uint32_t face_index) const + { + const uint32_t etc1s_image_index = + (level_index * basisu::maximum(m_header.m_layer_count, 1) * m_header.m_face_count) + + layer_index * m_header.m_face_count + + face_index; + + if (etc1s_image_index >= get_etc1s_image_descs().size()) + { + assert(0); + return 0; + } + + return get_etc1s_image_descs()[etc1s_image_index].m_image_flags; + } + + const basisu::uint8_vec* ktx2_transcoder::find_key(const std::string& key_name) const + { + for (uint32_t i = 0; i < m_key_values.size(); i++) + if (strcmp((const char *)m_key_values[i].m_key.data(), key_name.c_str()) == 0) + return &m_key_values[i].m_value; + + return nullptr; + } + + bool ktx2_transcoder::start_transcoding() + { + if (!m_pData) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::start_transcoding: Must call init() first\n"); + return false; + } + + if (m_header.m_supercompression_scheme == KTX2_SS_BASISLZ) + { + // Check if we've already decompressed the ETC1S global data. If so don't unpack it again. + if (!m_etc1s_transcoder.get_endpoints().empty()) + return true; + + if (!decompress_etc1s_global_data()) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::start_transcoding: decompress_etc1s_global_data() failed\n"); + return false; + } + + if (!m_is_video) + { + // See if there are any P-frames. If so it must be a video, even if there wasn't a KTXanimData key. + // Video cannot be a cubemap, and it must be a texture array. + if ((m_header.m_face_count == 1) && (m_header.m_layer_count > 1)) + { + for (uint32_t i = 0; i < m_etc1s_image_descs.size(); i++) + { + if (m_etc1s_image_descs[i].m_image_flags & KTX2_IMAGE_IS_P_FRAME) + { + m_is_video = true; + break; + } + } + } + } + } + else if (m_header.m_supercompression_scheme == KTX2_SS_ZSTANDARD) + { +#if !BASISD_SUPPORT_KTX2_ZSTD + BASISU_DEVEL_ERROR("ktx2_transcoder::start_transcoding: File uses zstd supercompression, but zstd support was not enabled at compilation time (BASISD_SUPPORT_KTX2_ZSTD == 0)\n"); + return false; +#endif + } + + return true; + } + + bool ktx2_transcoder::get_image_level_info(ktx2_image_level_info& level_info, uint32_t level_index, uint32_t layer_index, uint32_t face_index) const + { + if (level_index >= m_levels.size()) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::get_image_level_info: level_index >= m_levels.size()\n"); + return false; + } + + if (m_header.m_face_count > 1) + { + if (face_index >= 6) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::get_image_level_info: face_index >= 6\n"); + return false; + } + } + else if (face_index != 0) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::get_image_level_info: face_index != 0\n"); + return false; + } + + if (layer_index >= basisu::maximum(m_header.m_layer_count, 1)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::get_image_level_info: layer_index >= maximum(m_header.m_layer_count, 1)\n"); + return false; + } + + const uint32_t level_width = basisu::maximum(m_header.m_pixel_width >> level_index, 1); + const uint32_t level_height = basisu::maximum(m_header.m_pixel_height >> level_index, 1); + const uint32_t num_blocks_x = (level_width + 3) >> 2; + const uint32_t num_blocks_y = (level_height + 3) >> 2; + + level_info.m_face_index = face_index; + level_info.m_layer_index = layer_index; + level_info.m_level_index = level_index; + level_info.m_orig_width = level_width; + level_info.m_orig_height = level_height; + level_info.m_width = num_blocks_x * 4; + level_info.m_height = num_blocks_y * 4; + level_info.m_num_blocks_x = num_blocks_x; + level_info.m_num_blocks_y = num_blocks_y; + level_info.m_total_blocks = num_blocks_x * num_blocks_y; + level_info.m_alpha_flag = m_has_alpha; + level_info.m_iframe_flag = false; + if (m_etc1s_image_descs.size()) + { + const uint32_t etc1s_image_index = + (level_index * basisu::maximum(m_header.m_layer_count, 1) * m_header.m_face_count) + + layer_index * m_header.m_face_count + + face_index; + + level_info.m_iframe_flag = (m_etc1s_image_descs[etc1s_image_index].m_image_flags & KTX2_IMAGE_IS_P_FRAME) == 0; + } + + return true; + } + + bool ktx2_transcoder::transcode_image_level( + uint32_t level_index, uint32_t layer_index, uint32_t face_index, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + basist::transcoder_texture_format fmt, + uint32_t decode_flags, uint32_t output_row_pitch_in_blocks_or_pixels, uint32_t output_rows_in_pixels, int channel0, int channel1, + ktx2_transcoder_state* pState) + { + if (!m_pData) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: Must call init() first\n"); + return false; + } + + if (!pState) + pState = &m_def_transcoder_state; + + if (level_index >= m_levels.size()) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: level_index >= m_levels.size()\n"); + return false; + } + + if (m_header.m_face_count > 1) + { + if (face_index >= 6) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: face_index >= 6\n"); + return false; + } + } + else if (face_index != 0) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: face_index != 0\n"); + return false; + } + + if (layer_index >= basisu::maximum(m_header.m_layer_count, 1)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: layer_index >= maximum(m_header.m_layer_count, 1)\n"); + return false; + } + + const uint8_t* pComp_level_data = m_pData + m_levels[level_index].m_byte_offset; + uint64_t comp_level_data_size = m_levels[level_index].m_byte_length; + + const uint8_t* pUncomp_level_data = pComp_level_data; + uint64_t uncomp_level_data_size = comp_level_data_size; + + if (uncomp_level_data_size > UINT32_MAX) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: uncomp_level_data_size > UINT32_MAX\n"); + return false; + } + + if (m_header.m_supercompression_scheme == KTX2_SS_ZSTANDARD) + { + // Check if we've already decompressed this level's supercompressed data. + if ((int)level_index != pState->m_uncomp_data_level_index) + { + // Uncompress the entire level's supercompressed data. + if (!decompress_level_data(level_index, pState->m_level_uncomp_data)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: decompress_level_data() failed\n"); + return false; + } + pState->m_uncomp_data_level_index = level_index; + } + + pUncomp_level_data = pState->m_level_uncomp_data.data(); + uncomp_level_data_size = pState->m_level_uncomp_data.size(); + } + + const uint32_t level_width = basisu::maximum(m_header.m_pixel_width >> level_index, 1); + const uint32_t level_height = basisu::maximum(m_header.m_pixel_height >> level_index, 1); + const uint32_t num_blocks_x = (level_width + 3) >> 2; + const uint32_t num_blocks_y = (level_height + 3) >> 2; + + if (m_format == basist::basis_tex_format::cETC1S) + { + // Ensure start_transcoding() was called. + if (m_etc1s_transcoder.get_endpoints().empty()) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: must call start_transcoding() first\n"); + return false; + } + + const uint32_t etc1s_image_index = + (level_index * basisu::maximum(m_header.m_layer_count, 1) * m_header.m_face_count) + + layer_index * m_header.m_face_count + + face_index; + + // Sanity check + if (etc1s_image_index >= m_etc1s_image_descs.size()) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: etc1s_image_index >= m_etc1s_image_descs.size()\n"); + assert(0); + return false; + } + + if (static_cast(m_data_size) != m_data_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: File is too large\n"); + return false; + } + + const ktx2_etc1s_image_desc& image_desc = m_etc1s_image_descs[etc1s_image_index]; + + if (!m_etc1s_transcoder.transcode_image(fmt, + pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, m_pData, static_cast(m_data_size), + num_blocks_x, num_blocks_y, level_width, level_height, + level_index, + m_levels[level_index].m_byte_offset + image_desc.m_rgb_slice_byte_offset, image_desc.m_rgb_slice_byte_length, + image_desc.m_alpha_slice_byte_length ? (m_levels[level_index].m_byte_offset + image_desc.m_alpha_slice_byte_offset) : 0, image_desc.m_alpha_slice_byte_length, + decode_flags, m_has_alpha, + m_is_video, output_row_pitch_in_blocks_or_pixels, &pState->m_transcoder_state, output_rows_in_pixels)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: ETC1S transcode_image() failed, this is either a bug or the file is corrupted/invalid\n"); + return false; + } + } + else if (m_format == basist::basis_tex_format::cUASTC4x4) + { + // Compute length and offset to uncompressed 2D UASTC texture data, given the face/layer indices. + assert(uncomp_level_data_size == m_levels[level_index].m_uncompressed_byte_length); + const uint32_t total_2D_image_size = num_blocks_x * num_blocks_y * KTX2_UASTC_BLOCK_SIZE; + + const uint32_t uncomp_ofs = (layer_index * m_header.m_face_count + face_index) * total_2D_image_size; + + // Sanity checks + if (uncomp_ofs >= uncomp_level_data_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: uncomp_ofs >= total_2D_image_size\n"); + return false; + } + + if ((uncomp_level_data_size - uncomp_ofs) < total_2D_image_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: (uncomp_level_data_size - uncomp_ofs) < total_2D_image_size\n"); + return false; + } + + if (!m_uastc_transcoder.transcode_image(fmt, + pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, + (const uint8_t*)pUncomp_level_data + uncomp_ofs, (uint32_t)total_2D_image_size, num_blocks_x, num_blocks_y, level_width, level_height, level_index, + 0, (uint32_t)total_2D_image_size, + decode_flags, m_has_alpha, m_is_video, output_row_pitch_in_blocks_or_pixels, nullptr, output_rows_in_pixels, channel0, channel1)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: UASTC transcode_image() failed, this is either a bug or the file is corrupted/invalid\n"); + return false; + } + } + else + { + // Shouldn't get here. + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: Internal error\n"); + assert(0); + return false; + } + + return true; + } + + bool ktx2_transcoder::decompress_level_data(uint32_t level_index, basisu::uint8_vec& uncomp_data) + { + const uint8_t* pComp_data = m_levels[level_index].m_byte_offset + m_pData; + const uint64_t comp_size = m_levels[level_index].m_byte_length; + + const uint64_t uncomp_size = m_levels[level_index].m_uncompressed_byte_length; + + if (((size_t)comp_size) != comp_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_level_data: Compressed data too large\n"); + return false; + } + if (((size_t)uncomp_size) != uncomp_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_level_data: Uncompressed data too large\n"); + return false; + } + + if (!uncomp_data.try_resize((size_t)uncomp_size)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_level_data: Out of memory\n"); + return false; + } + + if (m_header.m_supercompression_scheme == KTX2_SS_ZSTANDARD) + { +#if BASISD_SUPPORT_KTX2_ZSTD + size_t actualUncompSize = ZSTD_decompress(uncomp_data.data(), (size_t)uncomp_size, pComp_data, (size_t)comp_size); + if (ZSTD_isError(actualUncompSize)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_level_data: Zstd decompression failed, file is invalid or corrupted\n"); + return false; + } + if (actualUncompSize != uncomp_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_level_data: Zstd decompression returned too few bytes, file is invalid or corrupted\n"); + return false; + } +#else + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_level_data: File uses Zstd supercompression, but Zstd support was not enabled at compile time (BASISD_SUPPORT_KTX2_ZSTD is 0)\n"); + return false; +#endif + } + + return true; + } + + bool ktx2_transcoder::decompress_etc1s_global_data() + { + // Note: we don't actually support 3D textures in here yet + //uint32_t layer_pixel_depth = basisu::maximum(m_header.m_pixel_depth, 1); + //for (uint32_t i = 1; i < m_header.m_level_count; i++) + // layer_pixel_depth += basisu::maximum(m_header.m_pixel_depth >> i, 1); + + const uint32_t image_count = basisu::maximum(m_header.m_layer_count, 1) * m_header.m_face_count * m_header.m_level_count; + assert(image_count); + + const uint8_t* pSrc = m_pData + m_header.m_sgd_byte_offset; + + memcpy(&m_etc1s_header, pSrc, sizeof(ktx2_etc1s_global_data_header)); + pSrc += sizeof(ktx2_etc1s_global_data_header); + + if ((!m_etc1s_header.m_endpoints_byte_length) || (!m_etc1s_header.m_selectors_byte_length) || (!m_etc1s_header.m_tables_byte_length)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: Invalid ETC1S global data\n"); + return false; + } + + if ((!m_etc1s_header.m_endpoint_count) || (!m_etc1s_header.m_selector_count)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: endpoint and/or selector count is 0, file is invalid or corrupted\n"); + return false; + } + + // Sanity check the ETC1S header. + if ((sizeof(ktx2_etc1s_global_data_header) + + sizeof(ktx2_etc1s_image_desc) * image_count + + m_etc1s_header.m_endpoints_byte_length + + m_etc1s_header.m_selectors_byte_length + + m_etc1s_header.m_tables_byte_length + + m_etc1s_header.m_extended_byte_length) > m_header.m_sgd_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: SGD byte length is too small, file is invalid or corrupted\n"); + return false; + } + + if (!m_etc1s_image_descs.try_resize(image_count)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: Out of memory\n"); + return false; + } + + memcpy(m_etc1s_image_descs.data(), pSrc, sizeof(ktx2_etc1s_image_desc) * image_count); + pSrc += sizeof(ktx2_etc1s_image_desc) * image_count; + + // Sanity check the ETC1S image descs + for (uint32_t i = 0; i < image_count; i++) + { + // m_etc1s_transcoder.transcode_image() will validate the slice offsets/lengths before transcoding. + + if (!m_etc1s_image_descs[i].m_rgb_slice_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: ETC1S image descs sanity check failed (1)\n"); + return false; + } + + if (m_has_alpha) + { + if (!m_etc1s_image_descs[i].m_alpha_slice_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: ETC1S image descs sanity check failed (2)\n"); + return false; + } + } + } + + const uint8_t* pEndpoint_data = pSrc; + const uint8_t* pSelector_data = pSrc + m_etc1s_header.m_endpoints_byte_length; + const uint8_t* pTables_data = pSrc + m_etc1s_header.m_endpoints_byte_length + m_etc1s_header.m_selectors_byte_length; + + if (!m_etc1s_transcoder.decode_tables(pTables_data, m_etc1s_header.m_tables_byte_length)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: decode_tables() failed, file is invalid or corrupted\n"); + return false; + } + + if (!m_etc1s_transcoder.decode_palettes( + m_etc1s_header.m_endpoint_count, pEndpoint_data, m_etc1s_header.m_endpoints_byte_length, + m_etc1s_header.m_selector_count, pSelector_data, m_etc1s_header.m_selectors_byte_length)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: decode_palettes() failed, file is likely corrupted\n"); + return false; + } + + return true; + } + + bool ktx2_transcoder::read_key_values() + { + if (!m_header.m_kvd_byte_length) + { + if (m_header.m_kvd_byte_offset) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Invalid KVD byte offset (it should be zero when the length is zero)\n"); + return false; + } + + return true; + } + + if (m_header.m_kvd_byte_offset < sizeof(ktx2_header)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Invalid KVD byte offset\n"); + return false; + } + + if ((m_header.m_kvd_byte_offset + m_header.m_kvd_byte_length) > m_data_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Invalid KVD byte offset and/or length\n"); + return false; + } + + const uint8_t* pSrc = m_pData + m_header.m_kvd_byte_offset; + uint32_t src_left = m_header.m_kvd_byte_length; + + if (!m_key_values.try_reserve(8)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Out of memory\n"); + return false; + } + + while (src_left > sizeof(uint32_t)) + { + uint32_t l = basisu::read_le_dword(pSrc); + + pSrc += sizeof(uint32_t); + src_left -= sizeof(uint32_t); + + if (l < 2) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Failed reading key value fields (0)\n"); + return false; + } + + if (src_left < l) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Failed reading key value fields (1)\n"); + return false; + } + + if (!m_key_values.try_resize(m_key_values.size() + 1)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Out of memory\n"); + return false; + } + + basisu::uint8_vec& key_data = m_key_values.back().m_key; + basisu::uint8_vec& value_data = m_key_values.back().m_value; + + do + { + if (!l) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Failed reading key value fields (2)\n"); + return false; + } + + if (!key_data.try_push_back(*pSrc++)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Out of memory\n"); + return false; + } + + src_left--; + l--; + + } while (key_data.back()); + + if (!value_data.try_resize(l)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Out of memory\n"); + return false; + } + + if (l) + { + memcpy(value_data.data(), pSrc, l); + pSrc += l; + src_left -= l; + } + + uint32_t ofs = (uint32_t)(pSrc - m_pData) & 3; + uint32_t alignment_bytes = (4 - ofs) & 3; + + if (src_left < alignment_bytes) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Failed reading key value fields (3)\n"); + return false; + } + + pSrc += alignment_bytes; + src_left -= alignment_bytes; + } + + return true; + } + +#endif // BASISD_SUPPORT_KTX2 + + bool basisu_transcoder_supports_ktx2() + { +#if BASISD_SUPPORT_KTX2 + return true; +#else + return false; +#endif + } + + bool basisu_transcoder_supports_ktx2_zstd() + { +#if BASISD_SUPPORT_KTX2_ZSTD + return true; +#else + return false; +#endif + } + +} // namespace basist +/**** ended inlining basisu_transcoder.cpp ****/ + +/** + * Collection of unused functions and const variables to work around \c + * -Wunused-function and \c -Wunused-const-variable warnings. + * + * \todo LTO does its thing so any unused are removed but is there a better way? + */ +void _basisu_translib_dummy() { + // These first ones are not used at all + BASISU_NOTE_UNUSED(&basisu::byteswap16); + BASISU_NOTE_UNUSED(&basisu::byteswap32); + BASISU_NOTE_UNUSED(basisu::BASISU_PATH_SEPERATOR_CHAR); + BASISU_NOTE_UNUSED(basisu::cHuffmanTotalSortedCodelengthCodes); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL0_DELTA_LO); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL0_DELTA_HI); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL1_DELTA_LO); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL1_DELTA_HI); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL2_DELTA_LO); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL2_DELTA_HI); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL2_PREV_HI); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL_MIN_DELTA_B_RUNLEN); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL_DELTA_5_RUNLEN_VLC_BITS); + BASISU_NOTE_UNUSED(basist::NO_ENDPOINT_PRED_INDEX); + BASISU_NOTE_UNUSED(basist::MAX_SELECTOR_HISTORY_BUF_SIZE); +#if BASISD_SUPPORT_ETC2_EAC_A8 + // Unused but only when building with EAC + BASISU_NOTE_UNUSED(basist::g_eac_modifier_table); +#endif +#if BASISD_SUPPORT_PVRTC1 == 0 + // Unused only when not building with PVRTC + BASISU_NOTE_UNUSED(basist::g_etc1_inten_tables16); + BASISU_NOTE_UNUSED(basist::g_etc1_inten_tables48); + BASISU_NOTE_UNUSED(basist::g_etc_5_to_8); + BASISU_NOTE_UNUSED(basist::g_etc1_x_selector_unpack); +#endif +} diff --git a/ktx/external/basisu/contrib/previewers/win/.gitignore b/ktx/external/basisu/contrib/previewers/win/.gitignore new file mode 100644 index 0000000..5b4080a --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/win/.gitignore @@ -0,0 +1,13 @@ +# Windows intermediate files +bin/x86/ +bin/x64/ + +# VS project files +*.vcxproj.user +.vs/ +*.VC.db +*.VC.opendb +*.sdf +*.suo +*.opensdf +*.aps diff --git a/ktx/external/basisu/contrib/previewers/win/README.md b/ktx/external/basisu/contrib/previewers/win/README.md new file mode 100644 index 0000000..92d1d92 --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/win/README.md @@ -0,0 +1,7 @@ +# Windows Previewers for Basis Universal + +Build using Visual Studio from 2012 onwards. Enable from an Administrator console using `regsvr32 previewers.dll` (and remove using `regsvr32 /u previewers.dll`). + +![Icon and preview pane](preview.png) + +Work-in-progress. Prebuilt signed version and installer coming soon. Mac version to follow. diff --git a/ktx/external/basisu/contrib/previewers/win/basisthumbprovider.cpp b/ktx/external/basisu/contrib/previewers/win/basisthumbprovider.cpp new file mode 100644 index 0000000..292376e --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/win/basisthumbprovider.cpp @@ -0,0 +1,149 @@ +#include "basisthumbprovider.h" + +#include + +#include "basisu_transcoder.cpp" + +#include "helpers.h" + +#pragma comment(lib, "Shlwapi.lib") + +using namespace basist; + +BasisThumbProvider::BasisThumbProvider() : count(1), stream(NULL) { + dprintf("BasisThumbProvider ctor"); + basisu_transcoder_init(); +} + +BasisThumbProvider::~BasisThumbProvider() { + dprintf("BasisThumbProvider **dtor**"); + if (stream) { + stream->Release(); + stream = NULL; + } +} + +IFACEMETHODIMP BasisThumbProvider::QueryInterface(REFIID riid, void **ppv) { + static const QITAB qit[] = { + QITABENT(BasisThumbProvider, IThumbnailProvider), + QITABENT(BasisThumbProvider, IInitializeWithStream), + {0}, + }; + return QISearch(this, qit, riid, ppv); +} + +IFACEMETHODIMP_(ULONG) BasisThumbProvider::AddRef() { + return InterlockedIncrement(&count); +} + +IFACEMETHODIMP_(ULONG) BasisThumbProvider::Release() { + LONG refs = InterlockedDecrement(&count); + if (refs == 0) { + delete this; + } + return refs; +} + +IFACEMETHODIMP BasisThumbProvider::Initialize(IStream *pStream, DWORD grfMode) { + dprintf("BasisThumbProvider::Initialize"); + HRESULT hr = HRESULT_FROM_WIN32(ERROR_ALREADY_INITIALIZED); + if (!stream) { + hr = pStream->QueryInterface(&stream); + } + return hr; +} + +// Note: thumbnails get written here: %LocalAppData%\Microsoft\Windows\Explorer +IFACEMETHODIMP BasisThumbProvider::GetThumbnail(UINT cx, HBITMAP *phbmp, WTS_ALPHATYPE *pdwAlpha) { + STATSTG stat; + if (stream && SUCCEEDED(stream->Stat(&stat, STATFLAG_NONAME))) { + if (void* data = malloc(static_cast(stat.cbSize.LowPart))) { + ULONG size = 0; + if (SUCCEEDED(stream->Read(data, static_cast(stat.cbSize.LowPart), &size))) { + if (size == stat.cbSize.LowPart) { + basisu_transcoder transcoder; + if (transcoder.validate_header(data, size)) { + dprintf("Requested %d bytes for %dx%d image", size, cx, cx); + basisu_image_info info; + if (transcoder.get_image_info(data, size, info, 0)) { + uint32_t level = 0; + uint32_t descW = 0, descH = 0, blocks; + for (uint32_t n = 0; n < info.m_total_levels; n++) { + if (transcoder.get_image_level_desc(data, size, 0, n, descW, descH, blocks)) { + dprintf("mipmap level w: %d, h: %d (blocks: %d)", descW, descH, blocks); + if (cx >= std::max(descW, descH)) { + level = n; + break; + } + } + } + basisu_file_info fileInfo; + transcoder.get_file_info(data, size, fileInfo); + if (transcoder.start_transcoding(data, size)) { + uint32_t bytes = basis_get_uncompressed_bytes_per_pixel(transcoder_texture_format::cTFRGBA32) * descW * descH; + dprintf("Started transcode (%dx%d @ %d bytes)", descW, descH, bytes); + if (void* rgbBuf = malloc(bytes)) { + // Note: the API expects total pixels here instead of blocks for cTFRGBA32 + if (transcoder.transcode_image_level(data, size, 0, level, rgbBuf, descW * descH, transcoder_texture_format::cTFRGBA32)) { + dprintf("Decoded!!!!"); + *phbmp = rgbToBitmap(static_cast(rgbBuf), descW, descH, fileInfo.m_y_flipped); + } + delete rgbBuf; + } + } + } + } + } + } + free(data); + } + } + return (*phbmp) ? S_OK : S_FALSE; +} + +//********************************** Factory *********************************/ + +BasisThumbProviderFactory::BasisThumbProviderFactory() : count(1) {} + +BasisThumbProviderFactory::~BasisThumbProviderFactory() {} + +IFACEMETHODIMP BasisThumbProviderFactory::QueryInterface(REFIID riid, void **ppv) { + static const QITAB qit[] = { + QITABENT(BasisThumbProviderFactory, IClassFactory), + {0}, + }; + return QISearch(this, qit, riid, ppv); +} + +IFACEMETHODIMP_(ULONG) BasisThumbProviderFactory::AddRef() { + return InterlockedIncrement(&count); +} + +IFACEMETHODIMP_(ULONG) BasisThumbProviderFactory::Release() { + LONG refs = InterlockedDecrement(&count); + if (refs == 0) { + delete this; + } + return refs; +} + +IFACEMETHODIMP BasisThumbProviderFactory::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppv) { + HRESULT hr = CLASS_E_NOAGGREGATION; + if (pUnkOuter == NULL) { + hr = E_OUTOFMEMORY; + if (BasisThumbProvider* provider = new (std::nothrow) BasisThumbProvider()) { + hr = provider->QueryInterface(riid, ppv); + provider->Release(); + } + } + return hr; +} + +IFACEMETHODIMP BasisThumbProviderFactory::LockServer(BOOL fLock) { + if (fLock) { + InterlockedIncrement(&count); + } else { + InterlockedDecrement(&count); + } + return S_OK; +} diff --git a/ktx/external/basisu/contrib/previewers/win/basisthumbprovider.h b/ktx/external/basisu/contrib/previewers/win/basisthumbprovider.h new file mode 100644 index 0000000..e73747c --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/win/basisthumbprovider.h @@ -0,0 +1,58 @@ +#pragma once + +#include +#include + +/** + * + */ +class BasisThumbProvider : public IInitializeWithStream, public IThumbnailProvider +{ +public: + BasisThumbProvider(); + // IUnknown::QueryInterface() + IFACEMETHODIMP QueryInterface(REFIID riid, void **ppv) override; + // IUnknown::AddRef() + IFACEMETHODIMP_(ULONG) AddRef() override; + // IUnknown::Release() + IFACEMETHODIMP_(ULONG) Release() override; + + // IInitializeWithStream::Initialize() + IFACEMETHODIMP Initialize(IStream *pStream, DWORD grfMode) override; + + // IThumbnailProvider::GetThumbnail() + IFACEMETHODIMP GetThumbnail(UINT cx, HBITMAP *phbmp, WTS_ALPHATYPE *pdwAlpha) override; + +protected: + virtual ~BasisThumbProvider(); + +private: + LONG count; + IStream* stream; +}; + +/** + * + */ +class BasisThumbProviderFactory : public IClassFactory +{ +public: + BasisThumbProviderFactory(); + // IUnknown::QueryInterface() + IFACEMETHODIMP QueryInterface(REFIID riid, void **ppv) override; + // IUnknown::AddRef() + IFACEMETHODIMP_(ULONG) AddRef() override; + // IUnknown::Release() + IFACEMETHODIMP_(ULONG) Release() override; + + // IClassFactory::CreateInstance() + IFACEMETHODIMP CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppv) override; + // IClassFactory::LockServer() + IFACEMETHODIMP LockServer(BOOL fLock) override; + +protected: + virtual ~BasisThumbProviderFactory(); + +private: + LONG count; +}; diff --git a/ktx/external/basisu/contrib/previewers/win/helpers.cpp b/ktx/external/basisu/contrib/previewers/win/helpers.cpp new file mode 100644 index 0000000..d4fab03 --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/win/helpers.cpp @@ -0,0 +1,55 @@ +#include "helpers.h" + +#include +#include + +void dprintf(char* const fmt, ...) { +#ifdef _DEBUG + va_list args; + char buf[256]; + va_start(args, fmt); + int len = vsnprintf_s(buf, sizeof buf, fmt, args); + va_end (args); + if (len > 0) { + buf[sizeof buf - 1] = 0; + OutputDebugStringA(buf); + } +#endif +} + +HBITMAP rgbToBitmap(const uint32_t* src, uint32_t const imgW, uint32_t const imgH, bool const flip) { + /* + * Creates a bitmap (a DIB) for the passed-in pixel size. Note that + * negation of the height means top-down, origin upper-left, which is the + * regular case. + * + * TODO: 16-bit variant instead? + */ + assert(src && imgW && imgH); + BITMAPINFO bmi = { + sizeof(bmi.bmiHeader) + }; + bmi.bmiHeader.biWidth = imgW; + bmi.bmiHeader.biHeight = (flip) ? imgH : -static_cast(imgH); + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biBitCount = 32; + bmi.bmiHeader.biCompression = BI_RGB; + void* pixels = NULL; + HBITMAP hbmp = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, &pixels, NULL, 0); + /* + * RGBA to BGRA conversion. + * + * Note: we keep the alpha. + */ + if (hbmp && pixels) { + uint32_t* dst = static_cast(pixels); + for (unsigned xy = imgW * imgH; xy > 0; xy--) { + uint32_t rgba = *src++; + *dst++ = ((rgba & 0x000000FF) << 16) + | ((rgba & 0xFF00FF00) ) + | ((rgba & 0x00FF0000) >> 16); + } + GdiFlush(); + } + return hbmp; +} diff --git a/ktx/external/basisu/contrib/previewers/win/helpers.h b/ktx/external/basisu/contrib/previewers/win/helpers.h new file mode 100644 index 0000000..691d561 --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/win/helpers.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include + +/** + * Write a formatted string to the connected debugger (e.g. DebugView). + * + * \param[in] fmt content to write in \c printf format (followed by optional arguments) + */ +void dprintf(char* const fmt, ...); + +/** + * Converts raw RGBA data to a Windows BGRA bitmap. + * + * \param[in] src raw RGBA data + * \param[in] imgW width of the decoded image + * \param[in] imgH height of the decoded image + * \return handle to a bitmap (ownership passed to the caller) + */ +HBITMAP rgbToBitmap(const uint32_t* src, uint32_t const imgW, uint32_t const imgH, bool const flip = false); diff --git a/ktx/external/basisu/contrib/previewers/win/preview.png b/ktx/external/basisu/contrib/previewers/win/preview.png new file mode 100644 index 0000000..bb59492 Binary files /dev/null and b/ktx/external/basisu/contrib/previewers/win/preview.png differ diff --git a/ktx/external/basisu/contrib/previewers/win/previewers.cpp b/ktx/external/basisu/contrib/previewers/win/previewers.cpp new file mode 100644 index 0000000..8274bd9 --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/win/previewers.cpp @@ -0,0 +1,118 @@ +#include +#include +#include + +#include + +#include "basisthumbprovider.h" + +#define SHELLEX_THUMBNAIL_CLSID _T("ShellEx\\{E357FCCD-A995-4576-B01F-234630154E96}") +#define SHELLEX_PREVIEWER_CLSID _T("ShellEx\\{8895B1C6-B41F-4C1C-A562-0D564250836F}") + +#define THUMBNAIL_HANDLER_TITLE _T("Basis Thumbnail Handler") +#define THUMBNAIL_HANDLER_CLSID _T("{CD1F0EA0-283C-4D90-A41D-DEBD9207D91F}") + +#define PREVIEWER_HANDLER_TITLE _T("Basis Previewer Handler") +#define PREVIEWER_HANDLER_CLSID _T("{7B5DA275-3BB6-45AE-B0EB-E50187A28F13}") + +#define FILE_EXTENSION _T(".basis") + +static const CLSID CLSID_ThumbnailHandler = {0xCD1F0EA0, 0x283C, 0x4D90, {0xA4, 0x1D, 0xDE, 0xBD, 0x92, 0x07, 0xD9, 0x1F}}; +static const CLSID CLSID_PreviewerHandler = {0x7B5DA275, 0x3BB6, 0x45AE, {0xB0, 0xEB, 0xE5, 0x01, 0x87, 0xA2, 0x8F, 0x13}}; + +static TCHAR dllPath[MAX_PATH] = {0}; + +static LONG dllRefs = 0; + +#ifndef BAIL_ON_FAIL +#define BAIL_ON_FAIL(code) if (FAILED((hr = (code)))) return hr +#endif + +static HRESULT setRegKey(HKEY root, LPTSTR key, LPTSTR val, LPTSTR data) { + HKEY hKey; + HRESULT hr = HRESULT_FROM_WIN32(RegCreateKeyEx(root, key, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL)); + if (SUCCEEDED(hr)) { + hr = HRESULT_FROM_WIN32(RegSetValueEx(hKey, val, 0, REG_SZ, reinterpret_cast(data), static_cast(_tcslen(data) * sizeof TCHAR))); + RegCloseKey(hKey); + } + return hr; +} + +BOOL APIENTRY DllMain(HMODULE hInstDLL, DWORD reason, LPVOID /*reserved*/) { + if (reason == DLL_PROCESS_ATTACH) { + OutputDebugString(_T("DllMain")); + if (GetModuleFileName(hInstDLL, dllPath, sizeof dllPath) == 0) { + #ifdef _DEBUG + OutputDebugString(_T("Failed to obtain DLL path")); + #endif + } + DisableThreadLibraryCalls(hInstDLL); + } + return TRUE; +} + + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv) { + HRESULT hr = CLASS_E_CLASSNOTAVAILABLE; + if (IsEqualCLSID(CLSID_ThumbnailHandler, rclsid)) { + hr = E_OUTOFMEMORY; + if (IClassFactory* factory = new (std::nothrow) BasisThumbProviderFactory()) { + hr = factory->QueryInterface(riid, ppv); + factory->Release(); + } + } + return hr; +} + +void DllAddRef() { +#ifdef _DEBUG + OutputDebugString(_T("DllAddRef")); +#endif + InterlockedIncrement(&dllRefs); +} + +void DllRelease() { +#ifdef _DEBUG + OutputDebugString(_T("DllRelease")); +#endif + InterlockedDecrement(&dllRefs); +} + +STDAPI DllCanUnloadNow() { +#ifdef _DEBUG + OutputDebugString(_T("DllCanUnloadNow")); +#endif + return (dllRefs == 0) ? S_OK : S_FALSE; +} + +// regsvr32 /s previewers.dll +STDAPI DllRegisterServer() { + HRESULT hr = E_FAIL; + if (_tcslen(dllPath)) { + BAIL_ON_FAIL(setRegKey(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\CLSID\\") THUMBNAIL_HANDLER_CLSID, NULL, THUMBNAIL_HANDLER_TITLE)); + BAIL_ON_FAIL(setRegKey(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\CLSID\\") THUMBNAIL_HANDLER_CLSID _T("\\InProcServer32"), NULL, dllPath)); + BAIL_ON_FAIL(setRegKey(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\CLSID\\") THUMBNAIL_HANDLER_CLSID _T("\\InProcServer32"), _T("ThreadingModel"), _T("Apartment"))); + BAIL_ON_FAIL(setRegKey(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\") FILE_EXTENSION _T("\\") SHELLEX_THUMBNAIL_CLSID, NULL, THUMBNAIL_HANDLER_CLSID)); + SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); + } +#ifdef _DEBUG + if (SUCCEEDED(hr)) { + OutputDebugString(_T("Previewer successfully registered")); + } +#endif + return hr; +} + +// regsvr32 /s /u previewers.dll +STDAPI DllUnregisterServer() { + HRESULT hr = HRESULT_FROM_WIN32(RegDeleteTree(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\CLSID\\") THUMBNAIL_HANDLER_CLSID)); + if (SUCCEEDED(hr)) { + hr = HRESULT_FROM_WIN32(RegDeleteTree(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\") FILE_EXTENSION _T("\\") SHELLEX_THUMBNAIL_CLSID)); + } +#ifdef _DEBUG + if (SUCCEEDED(hr)) { + OutputDebugString(_T("Previewer successfully unregistered")); + } +#endif + return hr; +} diff --git a/ktx/external/basisu/contrib/previewers/win/previewers.def b/ktx/external/basisu/contrib/previewers/win/previewers.def new file mode 100644 index 0000000..112ba88 --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/win/previewers.def @@ -0,0 +1,6 @@ +EXPORTS + DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE + diff --git a/ktx/external/basisu/contrib/previewers/win/previewers.sln b/ktx/external/basisu/contrib/previewers/win/previewers.sln new file mode 100644 index 0000000..c3a2be5 --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/win/previewers.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "previewers", "previewers.vcxproj", "{F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Debug|Win32.ActiveCfg = Debug|Win32 + {F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Debug|Win32.Build.0 = Debug|Win32 + {F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Debug|x64.ActiveCfg = Debug|x64 + {F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Debug|x64.Build.0 = Debug|x64 + {F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Release|Win32.ActiveCfg = Release|Win32 + {F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Release|Win32.Build.0 = Release|Win32 + {F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Release|x64.ActiveCfg = Release|x64 + {F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/ktx/external/basisu/contrib/previewers/win/previewers.vcxproj b/ktx/external/basisu/contrib/previewers/win/previewers.vcxproj new file mode 100644 index 0000000..cb1f5fb --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/win/previewers.vcxproj @@ -0,0 +1,187 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {F3D4D2B1-20BF-44F2-B624-BE19C6911D4B} + Win32Proj + previewers + + + + DynamicLibrary + true + $(DefaultPlatformToolset) + Unicode + + + DynamicLibrary + true + $(DefaultPlatformToolset) + Unicode + + + DynamicLibrary + false + $(DefaultPlatformToolset) + true + Unicode + + + DynamicLibrary + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)bin\$(PlatformShortName)\$(Configuration)\ + bin\$(PlatformShortName)\$(Configuration)\ + + + true + bin\$(PlatformShortName)\$(Configuration)\ + $(SolutionDir)bin\$(PlatformShortName)\$(Configuration)\ + + + false + $(SolutionDir)bin\$(PlatformShortName)\$(Configuration)\ + bin\$(PlatformShortName)\$(Configuration)\ + + + false + bin\$(PlatformShortName)\$(Configuration)\ + $(SolutionDir)bin\$(PlatformShortName)\$(Configuration)\ + + + + Level3 + Disabled + WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=1;_DEBUG;%(PreprocessorDefinitions) + true + false + false + false + ..\lib;%(AdditionalIncludeDirectories) + + + Windows + true + previewers.def + + + + + Level3 + Disabled + WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=1;_DEBUG;%(PreprocessorDefinitions) + true + false + false + false + ..\lib;%(AdditionalIncludeDirectories) + + + Windows + true + previewers.def + + + + + Level3 + Full + true + true + WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions) + false + false + ..\lib;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + previewers.def + + + + + Level3 + Full + true + true + WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions) + false + false + ..\lib;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + previewers.def + + + + + + + + + + + + false + false + + + + + false + false + + + + + + + + + + \ No newline at end of file diff --git a/ktx/external/basisu/contrib/previewers/win/previewers.vcxproj.filters b/ktx/external/basisu/contrib/previewers/win/previewers.vcxproj.filters new file mode 100644 index 0000000..0dcfa4f --- /dev/null +++ b/ktx/external/basisu/contrib/previewers/win/previewers.vcxproj.filters @@ -0,0 +1,38 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {f4f72237-4818-48a4-9192-33d12efece22} + + + + + inc + + + inc + + + inc + + + + + src + + + src + + + src + + + \ No newline at end of file diff --git a/ktx/external/basisu/contrib/single_file_transcoder/.editorconfig b/ktx/external/basisu/contrib/single_file_transcoder/.editorconfig new file mode 100644 index 0000000..a25dbdf --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/.editorconfig @@ -0,0 +1,4 @@ +[*] +insert_final_newline = true +indent_style = tab +indent_size = 4 diff --git a/ktx/external/basisu/contrib/single_file_transcoder/.gitignore b/ktx/external/basisu/contrib/single_file_transcoder/.gitignore new file mode 100644 index 0000000..59d6462 --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/.gitignore @@ -0,0 +1,2 @@ +# Don't commit the generated files +basisu_transcoder.* diff --git a/ktx/external/basisu/contrib/single_file_transcoder/README.md b/ktx/external/basisu/contrib/single_file_transcoder/README.md new file mode 100644 index 0000000..80c7fe1 --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/README.md @@ -0,0 +1,34 @@ +# Single File Basis Universal Transcoder + +The script `combine.py` creates an _amalgamated_ C++ source file that can be used with or without `basisu_transcoder.h`. This _isn't_ a header-only file but it does offer a similar level of simplicity when integrating into a project. + +Create `basisu_transcoder.cpp` from the transcoder sources using: +``` +cd basis_universal/contrib/single_file_transcoder + +python3 combine.py -r ../../transcoder -o basisu_transcoder.cpp basisu_transcoder-in.cpp +``` +Then add the resulting file to your project (see the [example files](examples)). + +If certain features will _never__ be enabled, e.g. `BASISD_SUPPORT_BC7_MODE6_OPAQUE_ONLY`, then `combine.py` can be told to exclude files with the `-x` option: +``` +python3 combine.py -r ../../transcoder -x basisu_transcoder_tables_bc7_m6.inc -o basisu_transcoder.cpp basisu_transcoder-in.cpp +``` +Excluding the BC7 mode 6 support reduces the generated source by 1.2MB, which is the choice taken in `basisu_transcoder-in.cpp` and used in the examples, with `create_transcoder.sh` running the above script, creating the final `basisu_transcoder.cpp`. + +The combiner script can also generate separate amalgamated header and source files, using the `-k` option to keep the specified inline directive, and `-p` to keep the `#pragma once` directives in the header: +``` +python3 combine.py -r ../../transcoder -o basisu_transcoder.h -p ../../transcoder/basisu_transcoder.h + +python3 combine.py -r ../../transcoder -x basisu_transcoder_tables_bc7_m6.inc -k basisu_transcoder.h -o basisu_transcoder.cpp basisu_transcoder-in.cpp + +``` + +Note: the amalgamation script was tested on Windows and Mac, requiring Python 3.8, with a fallback implementation as a shell script that will run on pretty much anything. + +Why? +---- + +Because all it now takes to support Basis Universal is the addition of a single file, two if using the header, with no configuration or further build steps (the out-of-the-box defaults tailor the included formats for various platforms). + +The library is small, adding, for example, around 250kB to an Emscripten compiled WebAssembly project (with transcoding disabled for BC7 and ATC; disabling ASTC will remove a further 64kB, and `gzip` will approximately half the `wasm` file). diff --git a/ktx/external/basisu/contrib/single_file_transcoder/basisu_transcoder-in.cpp b/ktx/external/basisu/contrib/single_file_transcoder/basisu_transcoder-in.cpp new file mode 100644 index 0000000..27bc278 --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/basisu_transcoder-in.cpp @@ -0,0 +1,72 @@ +/** + * Basis Universal single file library. Generated using: + * \code + * ./combine.py -r ../../transcoder -o basisu_transcoder.cpp basisu_transcoder-in.cpp + * \endcode + */ + +/* + * Transcoder build options for known platforms (iOS has ETC, ASTC and PVRTC; + * Emscripten adds DXT to iOS's options; Android adds PVRTC2 to Emscripten's + * options; other platforms build all except FXT1). + * + * See https://github.com/BinomialLLC/basis_universal#shrinking-the-transcoders-compiled-size + */ +#ifdef __APPLE__ + #include +#endif +#if TARGET_OS_IPHONE + #define BASISD_SUPPORT_DXT1 0 + #define BASISD_SUPPORT_DXT5A 0 +#endif +#if TARGET_OS_IPHONE || defined(__EMSCRIPTEN__) || defined(__ANDROID__) + #define BASISD_SUPPORT_BC7 0 + #define BASISD_SUPPORT_ATC 0 + #ifndef __ANDROID__ + #define BASISD_SUPPORT_PVRTC2 0 + #endif +#endif +#define BASISD_SUPPORT_FXT1 0 + +/* + * KTX2 support disabled. + */ +#define BASISD_SUPPORT_KTX2 0 + +#include "basisu_transcoder.cpp" + +/** + * Collection of unused functions and const variables to work around \c + * -Wunused-function and \c -Wunused-const-variable warnings. + * + * \todo LTO does its thing so any unused are removed but is there a better way? + */ +void _basisu_translib_dummy() { + // These first ones are not used at all + BASISU_NOTE_UNUSED(&basisu::byteswap16); + BASISU_NOTE_UNUSED(&basisu::byteswap32); + BASISU_NOTE_UNUSED(basisu::BASISU_PATH_SEPERATOR_CHAR); + BASISU_NOTE_UNUSED(basisu::cHuffmanTotalSortedCodelengthCodes); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL0_DELTA_LO); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL0_DELTA_HI); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL1_DELTA_LO); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL1_DELTA_HI); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL2_DELTA_LO); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL2_DELTA_HI); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL2_PREV_HI); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL_MIN_DELTA_B_RUNLEN); + BASISU_NOTE_UNUSED(basist::COLOR5_PAL_DELTA_5_RUNLEN_VLC_BITS); + BASISU_NOTE_UNUSED(basist::NO_ENDPOINT_PRED_INDEX); + BASISU_NOTE_UNUSED(basist::MAX_SELECTOR_HISTORY_BUF_SIZE); +#if BASISD_SUPPORT_ETC2_EAC_A8 + // Unused but only when building with EAC + BASISU_NOTE_UNUSED(basist::g_eac_modifier_table); +#endif +#if BASISD_SUPPORT_PVRTC1 == 0 + // Unused only when not building with PVRTC + BASISU_NOTE_UNUSED(basist::g_etc1_inten_tables16); + BASISU_NOTE_UNUSED(basist::g_etc1_inten_tables48); + BASISU_NOTE_UNUSED(basist::g_etc_5_to_8); + BASISU_NOTE_UNUSED(basist::g_etc1_x_selector_unpack); +#endif +} diff --git a/ktx/external/basisu/contrib/single_file_transcoder/combine.py b/ktx/external/basisu/contrib/single_file_transcoder/combine.py new file mode 100644 index 0000000..3d1018d --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/combine.py @@ -0,0 +1,234 @@ +#!/usr/bin/env python3 + +# Tool to bundle multiple C/C++ source files, inlining any includes. +# +# Note: there are two types of exclusion options: the '-x' flag, which besides +# excluding a file also adds an #error directive in place of the #include, and +# the '-k' flag, which keeps the #include and doesn't inline the file. The +# intended use cases are: '-x' for files that would normally be #if'd out, so +# features that 100% won't be used in the amalgamated file, for which every +# occurrence adds the error, and '-k' for headers that we wish to manually +# include, such as a project's public API, for which occurrences after the first +# are removed. +# +# Todo: the error handling could be better, which currently throws and halts +# (which is functional just not very friendly). +# +# Author: Carl Woffenden, Numfum GmbH (this script is released under a CC0 license/Public Domain) + +import argparse, re, sys + +from pathlib import Path +from typing import Any, List, Optional, Pattern, Set, TextIO + +# Set of file roots when searching (equivalent to -I paths for the compiler). +roots: Set[Path] = set() + +# Set of (canonical) file Path objects to exclude from inlining (and not only +# exclude but to add a compiler error directive when they're encountered). +excludes: Set[Path] = set() + +# Set of (canonical) file Path objects to keep as include directives. +keeps: Set[Path] = set() + +# Whether to keep the #pragma once directives (unlikely, since this will result +# in a warning, but the option is there). +keep_pragma: bool = False + +# Destination file object (or stdout if no output file was supplied). +destn:TextIO = sys.stdout + +# Set of file Path objects previously inlined (and to ignore if reencountering). +found: Set[Path] = set() + +# Compiled regex Patern to handle the following type of file includes: +# +# #include "file" +# #include "file" +# # include "file" +# #include "file" +# #include "file" // comment +# #include "file" // comment with quote " +# +# And all combinations of, as well as ignoring the following: +# +# #include +# //#include "file" +# /*#include "file"*/ +# +# We don't try to catch errors since the compiler will do this (and the code is +# expected to be valid before processing) and we don't care what follows the +# file (whether it's a valid comment or not, since anything after the quoted +# string is ignored) +# +include_regex: Pattern = re.compile(r'^\s*#\s*include\s*"(.+?)"') + +# Simple tests to prove include_regex's cases. +# +def test_match_include() -> bool: + if (include_regex.match('#include "file"') and + include_regex.match(' #include "file"') and + include_regex.match('# include "file"') and + include_regex.match('#include "file"') and + include_regex.match('#include "file" // comment')): + if (not include_regex.match('#include ') and + not include_regex.match('//#include "file"') and + not include_regex.match('/*#include "file"*/')): + found = include_regex.match('#include "file" // "') + if (found and found.group(1) == 'file'): + print('#include match valid') + return True + return False + +# Compiled regex Patern to handle "#pragma once" in various formats: +# +# #pragma once +# #pragma once +# # pragma once +# #pragma once +# #pragma once // comment +# +# Ignoring commented versions, same as include_regex. +# +pragma_regex: Pattern = re.compile(r'^\s*#\s*pragma\s*once\s*') + +# Simple tests to prove pragma_regex's cases. +# +def text_match_pragma() -> bool: + if (pragma_regex.match('#pragma once') and + pragma_regex.match(' #pragma once') and + pragma_regex.match('# pragma once') and + pragma_regex.match('#pragma once') and + pragma_regex.match('#pragma once // comment')): + if (not pragma_regex.match('//#pragma once') and + not pragma_regex.match('/*#pragma once*/')): + print('#pragma once match valid') + return True + return False + +# Finds 'file'. First the list of 'root' paths are searched, followed by the +# the currently processing file's 'parent' path, returning a valid Path in +# canonical form. If no match is found None is returned. +# +def resolve_include(file: str, parent: Optional[Path] = None) -> Optional[Path]: + for root in roots: + found = root.joinpath(file).resolve() + if (found.is_file()): + return found + if (parent): + found = parent.joinpath(file).resolve(); + else: + found = Path(file) + if (found.is_file()): + return found + return None + +# Helper to resolve lists of files. 'file_list' is passed in from the arguments +# and each entry resolved to its canonical path (like any include entry, either +# from the list of root paths or the owning file's 'parent', which in this case +# is case is the input file). The results are stored in 'resolved'. +# +def resolve_excluded_files(file_list: Optional[List[str]], resolved: Set[Path], parent: Optional[Path] = None) -> None: + if (file_list): + for filename in file_list: + found = resolve_include(filename, parent) + if (found): + resolved.add(found) + else: + error_line(f'Warning: excluded file not found: {filename}') + +# Writes 'line' to the open 'destn' (or stdout). +# +def write_line(line: str) -> None: + print(line, file=destn) + +# Logs 'line' to stderr. This is also used for general notifications that we +# don't want to go to stdout (so the source can be piped). +# +def error_line(line: Any) -> None: + print(line, file=sys.stderr) + +# Inline the contents of 'file' (with any of its includes also inlined, etc.). +# +# Note: text encoding errors are ignored and replaced with ? when reading the +# input files. This isn't ideal, but it's more than likely in the comments than +# code and a) the text editor has probably also failed to read the same content, +# and b) the compiler probably did too. +# +def add_file(file: Path, file_name: str = None) -> None: + if (file.is_file()): + if (not file_name): + file_name = file.name + error_line(f'Processing: {file_name}') + with file.open('r', errors='replace') as opened: + for line in opened: + line = line.rstrip('\n') + match_include = include_regex.match(line); + if (match_include): + # We have a quoted include directive so grab the file + inc_name = match_include.group(1) + resolved = resolve_include(inc_name, file.parent) + if (resolved): + if (resolved in excludes): + # The file was excluded so error if the compiler uses it + write_line(f'#error Using excluded file: {inc_name}') + error_line(f'Excluding: {inc_name}') + else: + if (resolved not in found): + # The file was not previously encountered + found.add(resolved) + if (resolved in keeps): + # But the include was flagged to keep as included + write_line(f'/**** *NOT* inlining {inc_name} ****/') + write_line(line) + error_line(f'Not inlining: {inc_name}') + else: + # The file was neither excluded nor seen before so inline it + write_line(f'/**** start inlining {inc_name} ****/') + add_file(resolved, inc_name) + write_line(f'/**** ended inlining {inc_name} ****/') + else: + write_line(f'/**** skipping file: {inc_name} ****/') + else: + # The include file didn't resolve to a file + write_line(f'#error Unable to find: {inc_name}') + error_line(f'Error: Unable to find: {inc_name}') + else: + # Skip any 'pragma once' directives, otherwise write the source line + if (keep_pragma or not pragma_regex.match(line)): + write_line(line) + else: + error_line(f'Error: Invalid file: {file}') + +# Start here +parser = argparse.ArgumentParser(description='Amalgamate Tool', epilog=f'example: {sys.argv[0]} -r ../my/path -r ../other/path -o out.c in.c') +parser.add_argument('-r', '--root', action='append', type=Path, help='file root search path') +parser.add_argument('-x', '--exclude', action='append', help='file to completely exclude from inlining') +parser.add_argument('-k', '--keep', action='append', help='file to exclude from inlining but keep the include directive') +parser.add_argument('-p', '--pragma', action='store_true', default=False, help='keep any "#pragma once" directives (removed by default)') +parser.add_argument('-o', '--output', type=argparse.FileType('w'), help='output file (otherwise stdout)') +parser.add_argument('input', type=Path, help='input file') +args = parser.parse_args() + +# Fail early on an invalid input (and store it so we don't recurse) +args.input = args.input.resolve(strict=True) +found.add(args.input) + +# Resolve all of the root paths upfront (we'll halt here on invalid roots) +if (args.root): + for path in args.root: + roots.add(path.resolve(strict=True)) + +# The remaining params: so resolve the excluded files and #pragma once directive +resolve_excluded_files(args.exclude, excludes, args.input.parent) +resolve_excluded_files(args.keep, keeps, args.input.parent) +keep_pragma = args.pragma; + +# Then recursively process the input file +try: + if (args.output): + destn = args.output + add_file(args.input) +finally: + if (not destn): + destn.close() diff --git a/ktx/external/basisu/contrib/single_file_transcoder/combine.sh b/ktx/external/basisu/contrib/single_file_transcoder/combine.sh new file mode 100644 index 0000000..aedae92 --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/combine.sh @@ -0,0 +1,166 @@ +#!/bin/sh -e + +# Tool to bundle multiple C/C++ source files, inlining any includes. +# +# Note: this POSIX-compliant script is many times slower than the original bash +# implementation (due to the grep calls) but it runs and works everywhere. +# +# TODO: ROOTS, FOUND, etc., as arrays (since they fail on paths with spaces) +# TODO: revert to Bash-only regex (the grep ones being too slow) +# +# Script released under a CC0 license. + +# Common file roots +ROOTS="." + +# -x option excluded includes +XINCS="" + +# -k option includes to keep as include directives +KINCS="" + +# Files previously visited +FOUND="" + +# Optional destination file (empty string to write to stdout) +DESTN="" + +# Whether the "#pragma once" directives should be written to the output +PONCE=0 + +# Prints the script usage then exits +usage() { + echo "Usage: $0 [-r ] [-x
            ] [-k
            ] [-o ] infile" + echo " -r file root search path" + echo " -x file to completely exclude from inlining" + echo " -k file to exclude from inlining but keep the include directive" + echo " -p keep any '#pragma once' directives (removed by default)" + echo " -o output file (otherwise stdout)" + echo "Example: $0 -r ../my/path - r ../other/path -o out.c in.c" + exit 1 +} + +# Tests that the grep implementation works as expected (older OSX grep fails) +test_grep() { + if ! echo '#include "foo"' | grep -Eq '^\s*#\s*include\s*".+"'; then + echo "Aborting: the grep implementation fails to parse include lines" + exit 1 + fi +} + +# Tests if list $1 has item $2 (returning zero on a match) +list_has_item() { + if echo "$1" | grep -Eq "(^|\s*)$2(\$|\s*)"; then + return 0 + else + return 1 + fi +} + +# Adds a new line with the supplied arguments to $DESTN (or stdout) +write_line() { + if [ -n "$DESTN" ]; then + printf '%s\n' "$@" >> "$DESTN" + else + printf '%s\n' "$@" + fi +} + +# Adds the contents of $1 with any of its includes inlined +add_file() { + # Match the path + local file= + for root in $ROOTS; do + if [ -f "$root/$1" ]; then + file="$root/$1" + fi + done + if [ -n "$file" ]; then + if [ -n "$DESTN" ]; then + # Log but only if not writing to stdout + echo "Processing: $file" + fi + # Read the file + local line= + while IFS= read -r line; do + if echo "$line" | grep -Eq '^\s*#\s*include\s*".+"'; then + # We have an include directive so strip the (first) file + local inc=$(echo "$line" | grep -Eo '".*"' | grep -Eo '\w*(\.?\w+)+' | head -1) + if list_has_item "$XINCS" "$inc"; then + # The file was excluded so error if the source attempts to use it + write_line "#error Using excluded file: $inc" + else + if ! list_has_item "$FOUND" "$inc"; then + # The file was not previously encountered + FOUND="$FOUND $inc" + if list_has_item "$KINCS" "$inc"; then + # But the include was flagged to keep as included + write_line "/**** *NOT* inlining $inc ****/" + write_line "$line" + else + # The file was neither excluded nor seen before so inline it + write_line "/**** start inlining $inc ****/" + add_file "$inc" + write_line "/**** ended inlining $inc ****/" + fi + else + write_line "/**** skipping file: $inc ****/" + fi + fi + else + # Skip any 'pragma once' directives, otherwise write the source line + local write=$PONCE + if [ $write -eq 0 ]; then + if echo "$line" | grep -Eqv '^\s*#\s*pragma\s*once\s*'; then + write=1 + fi + fi + if [ $write -ne 0 ]; then + write_line "$line" + fi + fi + done < "$file" + else + write_line "#error Unable to find \"$1\"" + fi +} + +while getopts ":r:x:k:po:" opts; do + case $opts in + r) + ROOTS="$ROOTS $OPTARG" + ;; + x) + XINCS="$XINCS $OPTARG" + ;; + k) + KINCS="$KINCS $OPTARG" + ;; + p) + PONCE=1 + ;; + o) + DESTN="$OPTARG" + ;; + *) + usage + ;; + esac +done +shift $((OPTIND-1)) + +if [ -n "$1" ]; then + if [ -f "$1" ]; then + if [ -n "$DESTN" ]; then + printf "" > "$DESTN" + fi + test_grep + add_file $1 + else + echo "Input file not found: \"$1\"" + exit 1 + fi +else + usage +fi +exit 0 diff --git a/ktx/external/basisu/contrib/single_file_transcoder/create_transcoder.sh b/ktx/external/basisu/contrib/single_file_transcoder/create_transcoder.sh new file mode 100644 index 0000000..6016549 --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/create_transcoder.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +# Temporary compiled binary +OUT_FILE="tempbin" + +echo "Amalgamating files... this can take a while" +# Use the faster Python script if we have 3.8 or higher +if python3 -c 'import sys; assert sys.version_info >= (3,8)' 2>/dev/null; then + ./combine.py -r ../../transcoder -o basisu_transcoder.cpp basisu_transcoder-in.cpp +else + ./combine.sh -r ../../transcoder -o basisu_transcoder.cpp basisu_transcoder-in.cpp +fi +# Did combining work? +if [ $? -ne 0 ]; then + echo "Combine script: FAILED" + exit 1 +fi +echo "Combine script: PASSED" + +# Compile the generated output +which cc > /dev/null +if [ $? -ne 0 ]; then + echo "(Skipping compile test)" +else + cc -lm -std=c++11 -lstdc++ -Wall -Wextra -Werror -Os -g0 -fno-exceptions -fno-rtti -o $OUT_FILE examples/simple.cpp + # Did compilation work? + if [ $? -ne 0 ]; then + echo "Compiling simple.cpp: FAILED" + exit 1 + fi + # Run then delete the compiled output + ./$OUT_FILE + retVal=$? + rm -f $OUT_FILE + # Did the test work? + if [ $retVal -ne 0 ]; then + echo "Running simple.cpp: FAILED" + exit 1 + fi + echo "Running simple.cpp: PASSED" +fi diff --git a/ktx/external/basisu/contrib/single_file_transcoder/examples/README.md b/ktx/external/basisu/contrib/single_file_transcoder/examples/README.md new file mode 100644 index 0000000..b862eee --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/examples/README.md @@ -0,0 +1,7 @@ +# Single File Basis Universal Examples + +The examples `#include` the generated `basisu_transcoder.cpp` directly but work equally as well when including `basisu_transcoder.h` and compiling the amalgamated source separately. + +`emscripten.cpp` is a bare-bones [Emscripten](https://github.com/emscripten-core/emscripten) compiled WebGL demo picking the best transcoder format for the sample texture (see the [original PNG image](testcard.png)). + +The example files in this directory are released under a [Creative Commons Zero license](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/ktx/external/basisu/contrib/single_file_transcoder/examples/emscripten.cpp b/ktx/external/basisu/contrib/single_file_transcoder/examples/emscripten.cpp new file mode 100644 index 0000000..e56ae6a --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/examples/emscripten.cpp @@ -0,0 +1,568 @@ +/** + * \file emscripten.cpp + * Emscripten example of using the single-file \c basisu_transcoder.cpp. Draws + * a rotating textured quad with data from the in-line compressed textures. + * \n + * Compile using: + * \code + * export "CC_FLAGS=-std=c++11 -Wall -Wextra -Werror -Os -g0 -flto --llvm-lto 3 -fno-exceptions -fno-rtti -lGL -DNDEBUG=1" + * export "EM_FLAGS=-s ENVIRONMENT=web -s WASM=1 --shell-file shell.html --closure 1" + * emcc $CC_FLAGS $EM_FLAGS -o out.html emscripten.cpp + * \endcode + * Alternatively include \c basisu_transcoder.h and compile \c + * basisu_transcoder.cpp separately (the resulting binary is exactly the same + * size): + * \code + * emcc $CC_FLAGS $EM_FLAGS -o out.html ../basisu_transcoder.cpp emscripten.cpp + * \encode + * To determine the WebAssembly size without the transcoder comment the \c + * basisu_transcoder.cpp include (which stubs the texture creation). + * \n + * Example code released under a CC0 license. + */ +#include +#include +#include + +#include +#include + +#include +#include + +#include "../basisu_transcoder.cpp" + +//********************************* Test Data ********************************/ + +/** + * Basis Universal compressed 256x256 RGB texture source (with mipmaps). + * \n + * See \c testcard.png for the original. Generate using: + * \code + * basisu -comp_level 5 -linear -global_sel_pal -y_flip -mipmap + * \endcode + */ +static uint8_t const srcRgb[] = { +#include "testcard.basis.inc" +}; + +/** + * Basis Universal compressed 256x256 RGBA texture source (with mipmaps). + * \n + * See \c testcard-rgba.png for the original. Generate using: + * \code + * basisu -comp_level 5 -linear -global_sel_pal -y_flip -mipmap + * \endcode + */ +static uint8_t const srcRgba[] = { +#include "testcard-rgba.basis.inc" +}; + +//*************************** Program and Shaders ***************************/ + +/** + * Program object ID. + */ +static GLuint progId = 0; + +/** + * Vertex shader ID. + */ +static GLuint vertId = 0; + +/** + * Fragment shader ID. + */ +static GLuint fragId = 0; + +//********************************* Uniforms *********************************/ + +/** + * Quad rotation angle ID. + */ +static GLint uRotId = -1; + +/** + * Texture ID. + */ +static GLint uTx0Id = -1; + +//******************************* Shader Source ******************************/ + +/** + * Vertex shader to draw texture mapped polys with an applied rotation. + */ +static GLchar const vertShader2D[] = +#if GL_ES_VERSION_2_0 + "#version 100\n" + "precision mediump float;\n" +#else + "#version 120\n" +#endif + "uniform float uRot;" // rotation + "attribute vec2 aPos;" // vertex position coords + "attribute vec2 aUV0;" // vertex texture UV0 + "varying vec2 vUV0;" // (passed to fragment shader) + "void main() {" + " float cosA = cos(radians(uRot));" + " float sinA = sin(radians(uRot));" + " mat3 rot = mat3(cosA, -sinA, 0.0," + " sinA, cosA, 0.0," + " 0.0, 0.0, 1.0);" + " gl_Position = vec4(rot * vec3(aPos, 1.0), 1.0);" + " vUV0 = aUV0;" + "}"; + +/** + * Fragment shader for the above polys. + */ +static GLchar const fragShader2D[] = +#if GL_ES_VERSION_2_0 + "#version 100\n" + "precision mediump float;\n" +#else + "#version 120\n" +#endif + "uniform sampler2D uTx0;" + "varying vec2 vUV0;" // (passed from fragment shader) + "void main() {" + " gl_FragColor = texture2D(uTx0, vUV0);" + "}"; + +/** + * Helper to compile a shader. + * + * \param type shader type + * \param text shader source + * \return the shader ID (or zero if compilation failed) + */ +static GLuint compileShader(GLenum const type, const GLchar* text) { + GLuint shader = glCreateShader(type); + if (shader) { + glShaderSource (shader, 1, &text, NULL); + glCompileShader(shader); + GLint compiled; + glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); + if (compiled) { + return shader; + } else { + GLint logLen; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLen); + if (logLen > 1) { + GLchar* logStr = static_cast(malloc(logLen)); + glGetShaderInfoLog(shader, logLen, NULL, logStr); + #ifndef NDEBUG + printf("Shader compilation error: %s\n", logStr); + #endif + free(logStr); + } + glDeleteShader(shader); + } + } + return 0; +} + +//********************************** Helpers *********************************/ + +/** + * Vertex position index. + */ +#define GL_VERT_POSXY_ID 0 + +/** + * Vertex UV0 index. + */ +#define GL_VERT_TXUV0_ID 1 + +/** + * \c GL vec2 storage type. + */ +struct vec2 { + float x; + float y; +}; + +/** + * Combined 2D vertex and 2D texture coordinates. + */ +struct posTex2d { + struct vec2 pos; + struct vec2 uv0; +}; + +/** + * Shortcut for \c emscripten_webgl_enable_extension(). + */ +#ifndef GL_HAS_EXT +#define GL_HAS_EXT(ctx, ext) emscripten_webgl_enable_extension(ctx, ext) +#endif + +/* + * Possibly missing GL enums. + * + * Note: GL_COMPRESSED_RGB_ETC1_WEBGL is the same as GL_ETC1_RGB8_OES + */ +#ifndef GL_ETC1_RGB8_OES +#define GL_ETC1_RGB8_OES 0x8D64 +#endif +#ifndef GL_COMPRESSED_RGB8_ETC2 +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#endif +#ifndef GL_COMPRESSED_RGBA8_ETC2_EAC +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#endif +#ifndef COMPRESSED_RGBA_ASTC_4x4_KHR +#define COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#endif + +//***************************** Basis Universal ******************************/ + +/* + * All of the BasisU code is within this block to enable building with or + * without the library. Not including the transcoder will build a dummy + * implementation to (roughly) determine the size. + */ +#ifdef BASISD_LIB_VERSION + +using namespace basist; + +/** + * Shared codebook instance. + */ +static etc1_global_selector_codebook* globalCodebook = NULL; + +/** + * Returns a supported compressed texture format for a given context. + * + * \param[in] ctx WebGL context + * \param[in] alpha \c true if the texture has an alpha channel + * \return corresponding Basis format + */ +static transcoder_texture_format supports(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE const ctx, bool const alpha) { +#if BASISD_SUPPORT_PVRTC1 || !defined(BASISD_SUPPORT_PVRTC1) + /* + * Test for both prefixed and non-prefixed versions. This should grab iOS + * and other ImgTec GPUs first as a preference. + * + * TODO: do older iOS expose ASTC to the browser and does it transcode to RGBA? + */ + static bool const pvr = GL_HAS_EXT(ctx, "WEBKIT_WEBGL_compressed_texture_pvrtc") + || GL_HAS_EXT(ctx, "WEBGL_compressed_texture_pvrtc"); + if (pvr) { + return (alpha) + ? transcoder_texture_format::cTFPVRTC1_4_RGBA + : transcoder_texture_format::cTFPVRTC1_4_RGB; + } +#endif +#if BASISD_SUPPORT_ASTC || !defined(BASISD_SUPPORT_ASTC) + /* + * Then Android, ChromeOS and others with ASTC (newer iOS devices should + * make the list but don't appear to be exposed from WebGL). + */ + static bool const astc = GL_HAS_EXT(ctx, "WEBGL_compressed_texture_astc"); + if (astc) { + return transcoder_texture_format::cTFASTC_4x4_RGBA; + } +#endif +#if BASISD_SUPPORT_DXT1 || !defined(BASISD_SUPPORT_DXT1) + /* + * We choose DXT next, since a worry is the browser will claim ETC support + * then transcode (transcoding slower and with more artefacts). This gives + * us desktop and various (usually Intel) Android devices. + */ + static bool const dxt = GL_HAS_EXT(ctx, "WEBGL_compressed_texture_s3tc") + || GL_HAS_EXT(ctx, "WEBKIT_WEBGL_compressed_texture_s3tc"); + if (dxt) { + return (alpha) + ? transcoder_texture_format::cTFBC3_RGBA + : transcoder_texture_format::cTFBC1_RGB; + } +#endif +#if BASISD_SUPPORT_ETC2_EAC_A8 || !defined(BASISD_SUPPORT_ETC2_EAC_A8) + /* + * Then ETC2 (which may be incorrect). + */ + static bool const etc2 = GL_HAS_EXT(ctx, "WEBGL_compressed_texture_etc"); + if (etc2) { + return (alpha) + ? transcoder_texture_format::cTFETC2_RGBA + : transcoder_texture_format::cTFETC1_RGB; + } +#endif + /* + * Finally ETC1, falling back on RGBA. + * + * TODO: we might just prefer to transcode to dithered 565 once available + */ + static bool const etc1 = GL_HAS_EXT(ctx, "WEBGL_compressed_texture_etc1"); + if (etc1 && !alpha) { + return transcoder_texture_format::cTFETC1_RGB; + } + /* + * We choose 8888 over 4444 and 565 (in the hope that is is never chosen). + */ + return transcoder_texture_format::cTFRGBA32; +} + +/** + * Returns the equivalent GL type given a BasisU type. + * + * \note This relies on \c #supports() returning the supported formats, and so + * only converts to the GL equivalents (without further testing for support). + * + * \param[in] type BasisU transcode target + * \return equivalent GL type + */ +static GLenum toGlType(transcoder_texture_format const type) { + switch (type) { + case transcoder_texture_format::cTFETC1_RGB: + return GL_ETC1_RGB8_OES; + case transcoder_texture_format::cTFETC2_RGBA: + return GL_COMPRESSED_RGBA8_ETC2_EAC; + case transcoder_texture_format::cTFBC1_RGB: + return GL_COMPRESSED_RGB_S3TC_DXT1_EXT; + case transcoder_texture_format::cTFBC3_RGBA: + return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; + case transcoder_texture_format::cTFPVRTC1_4_RGB: + return GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + case transcoder_texture_format::cTFPVRTC1_4_RGBA: + return GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + case transcoder_texture_format::cTFASTC_4x4_RGBA: + return GL_COMPRESSED_RGBA_ASTC_4x4_KHR; + case transcoder_texture_format::cTFRGBA32: + return GL_UNSIGNED_BYTE; + case transcoder_texture_format::cTFRGB565: + return GL_UNSIGNED_SHORT_5_6_5; + default: + return GL_UNSIGNED_SHORT_4_4_4_4; + } +} + +/** + * Uploads the texture. + * + * \param[in] ctx ctx WebGL context + * \param[in] name texture \e name + * \param[in] data \c .basis file content + * \param[in] size number of bytes in \a data + * \return \c true if the texture was decoded and created + * + * \todo reuse the decode buffer (the first mips level should be able to contain the rest) + */ +bool upload(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE const ctx, GLuint const name, const uint8_t* const data, size_t const size) { + basisu_transcoder_init(); + if (!globalCodebook) { + globalCodebook = new etc1_global_selector_codebook(g_global_selector_cb_size, g_global_selector_cb); + } + basisu_transcoder transcoder(globalCodebook); + bool success = false; + if (transcoder.validate_header(data, size)) { + glBindTexture(GL_TEXTURE_2D, name); + basisu_file_info fileInfo; + if (transcoder.get_file_info(data, size, fileInfo)) { + transcoder_texture_format type = supports(ctx, fileInfo.m_has_alpha_slices); + basisu_image_info info; + if (transcoder.get_image_info(data, size, info, 0)) { + printf("Transcoding to type: %s (w: %d, h: %d, mips: %d)\n", + basis_get_format_name(type), info.m_width, info.m_height, + info.m_total_levels); + if (transcoder.start_transcoding(data, size)) { + uint32_t descW, descH, blocks; + for (uint32_t level = 0; level < info.m_total_levels; level++) { + // reset per level + success = false; + if (transcoder.get_image_level_desc(data, size, 0, level, descW, descH, blocks)) { + uint32_t decSize; + if (type == transcoder_texture_format::cTFPVRTC1_4_RGB || + type == transcoder_texture_format::cTFPVRTC1_4_RGBA) + { + decSize = (std::max(8U, (descW + 3) & ~3) * + std::max(8U, (descH + 3) & ~3) * 4 + 7) / 8; + } else { + decSize = basis_get_bytes_per_block_or_pixel(type); + if (basis_transcoder_format_is_uncompressed(type)) { + decSize *= descW * descH; + } else { + decSize *= blocks; + } + } + if (void* decBuf = malloc(decSize)) { + if (basis_transcoder_format_is_uncompressed(type)) { + // note that blocks becomes total number of pixels for RGB/RGBA + blocks = descW * descH; + } + if (transcoder.transcode_image_level(data, size, 0, level, decBuf, blocks, type)) { + if (basis_transcoder_format_is_uncompressed(type)) { + glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, + descW, descH, 0, GL_RGBA, toGlType(type), decBuf); + } else { + glCompressedTexImage2D(GL_TEXTURE_2D, level, + toGlType(type), descW, descH, 0, decSize, decBuf); + } + success = true; + } + free(decBuf); + } + } + if (!success) { + break; + } + } + } + } + } + } + return success; +} + +#else +// dummy implementation +bool upload(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE /*ctx*/, GLuint /*name*/, const uint8_t* data, size_t size) { + return (data[0] | data[size - 1]) != 0; +} +#endif + +//****************************************************************************/ + +/** + * Current quad rotation angle (in degrees, updated per frame). + */ +static float rotDeg = 0.0f; + +/** + * Decoded textures (0 = opaque, 1 = transparent). + */ +static GLuint txName[2] = {}; + +/** + * Emscripten (single) GL context. + */ +static EMSCRIPTEN_WEBGL_CONTEXT_HANDLE glCtx = 0; + +/** + * Emscripten resize handler. + */ +static EM_BOOL resize(int /*type*/, const EmscriptenUiEvent* /*e*/, void* /*data*/) { + double surfaceW; + double surfaceH; + if (emscripten_get_element_css_size ("#canvas", &surfaceW, &surfaceH) == EMSCRIPTEN_RESULT_SUCCESS) { + emscripten_set_canvas_element_size("#canvas", surfaceW, surfaceH); + if (glCtx) { + glViewport(0, 0, (int) surfaceW, (int) surfaceH); + } + } + return EM_FALSE; +} + +/** + * Boilerplate to create a WebGL context. + */ +static EM_BOOL initContext() { + // Default attributes + EmscriptenWebGLContextAttributes attr; + emscripten_webgl_init_context_attributes(&attr); + if ((glCtx = emscripten_webgl_create_context("#canvas", &attr))) { + // Bind the context and fire a resize to get the initial size + emscripten_webgl_make_context_current(glCtx); + emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, NULL, EM_FALSE, resize); + resize(0, NULL, NULL); + return EM_TRUE; + } + return EM_FALSE; +} + +/** + * Called once per frame (clears the screen and draws the rotating quad). + */ +static void tick() { + glClearColor(1.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + if (uRotId >= 0) { + glUniform1f(uRotId, rotDeg); + rotDeg += 0.1f; + if (rotDeg >= 360.0f) { + rotDeg -= 360.0f; + } + glBindTexture(GL_TEXTURE_2D, txName[(lround(rotDeg / 45) & 1) != 0]); + } + + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); + glFlush(); +} + +/** + * Creates the GL context, shaders and quad data, decompresses the .basis files + * and 'uploads' the resulting textures. + */ +int main() { + if (initContext()) { + // Compile shaders and set the initial GL state + if ((progId = glCreateProgram())) { + vertId = compileShader(GL_VERTEX_SHADER, vertShader2D); + fragId = compileShader(GL_FRAGMENT_SHADER, fragShader2D); + + glBindAttribLocation(progId, GL_VERT_POSXY_ID, "aPos"); + glBindAttribLocation(progId, GL_VERT_TXUV0_ID, "aUV0"); + + glAttachShader(progId, vertId); + glAttachShader(progId, fragId); + glLinkProgram (progId); + glUseProgram (progId); + uRotId = glGetUniformLocation(progId, "uRot"); + uTx0Id = glGetUniformLocation(progId, "uTx0"); + if (uTx0Id >= 0) { + glUniform1i(uTx0Id, 0); + } + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glDisable(GL_DITHER); + + glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + } + + GLuint vertsBuf = 0; + GLuint indexBuf = 0; + // Create the textured quad (vert positions then UVs) + struct posTex2d verts2d[] = { + {{-0.85f, -0.85f}, {0.0f, 0.0f}}, // BL + {{ 0.85f, -0.85f}, {1.0f, 0.0f}}, // BR + {{-0.85f, 0.85f}, {0.0f, 1.0f}}, // TL + {{ 0.85f, 0.85f}, {1.0f, 1.0f}}, // TR + }; + uint16_t index2d[] = { + 0, 1, 2, + 2, 1, 3, + }; + glGenBuffers(1, &vertsBuf); + glBindBuffer(GL_ARRAY_BUFFER, vertsBuf); + glBufferData(GL_ARRAY_BUFFER, + sizeof(verts2d), verts2d, GL_STATIC_DRAW); + glVertexAttribPointer(GL_VERT_POSXY_ID, 2, + GL_FLOAT, GL_FALSE, sizeof(struct posTex2d), 0); + glVertexAttribPointer(GL_VERT_TXUV0_ID, 2, + GL_FLOAT, GL_FALSE, sizeof(struct posTex2d), + (void*) offsetof(struct posTex2d, uv0)); + glGenBuffers(1, &indexBuf); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuf); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, + sizeof(index2d), index2d, GL_STATIC_DRAW); + glEnableVertexAttribArray(GL_VERT_POSXY_ID); + glEnableVertexAttribArray(GL_VERT_TXUV0_ID); + + glGenTextures(2, txName); + if (upload(glCtx, txName[0], srcRgb, sizeof srcRgb) && + upload(glCtx, txName[1], srcRgba, sizeof srcRgba)) + { + printf("Decoded!\n"); + } + + emscripten_set_main_loop(tick, 0, EM_FALSE); + emscripten_exit_with_live_runtime(); + } else { + printf("Failed to init WebGL!\n"); + } + return EXIT_FAILURE; +} diff --git a/ktx/external/basisu/contrib/single_file_transcoder/examples/shell.html b/ktx/external/basisu/contrib/single_file_transcoder/examples/shell.html new file mode 100644 index 0000000..e4af1b1 --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/examples/shell.html @@ -0,0 +1,25 @@ + + + + + + + + Emscripten Shell + + + + + +{{{ SCRIPT }}} + + diff --git a/ktx/external/basisu/contrib/single_file_transcoder/examples/simple.cpp b/ktx/external/basisu/contrib/single_file_transcoder/examples/simple.cpp new file mode 100644 index 0000000..64c8b09 --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/examples/simple.cpp @@ -0,0 +1,54 @@ +/** + * \file simple.cpp + * Bare minimum example of using the single-file \c basisu_transcoder.cpp. + * Opens an embedded \c .basis file to test that amalgamating the transcoder + * worked. + * \n + * Compile using: + * \code + * cc -std=c++11 -lstdc++ simple.cpp + * \endcode + * + * Example code released under a CC0 license. + */ +#include "../basisu_transcoder.cpp" + +using namespace basist; + +//********************************* Test Data ********************************/ + +/** + * Basis Universal compressed 256x256 RGB texture source (with mipmaps). + * \n + * See \c testcard.png for the original. Generate using: + * \code + * basisu -comp_level 5 -linear -global_sel_pal -y_flip -mipmap + * \endcode + */ +static uint8_t const srcRgb[] = { +#include "testcard.basis.inc" +}; + +//****************************************************************************/ + + +/** + * Simple single-file test to test the transcoder can build and run. + */ +int main() { + basisu_transcoder_init(); + + basisu_transcoder transcoder; + if (transcoder.validate_header(srcRgb, sizeof srcRgb)) { + basisu_file_info fileInfo; + if (transcoder.get_file_info(srcRgb, sizeof srcRgb, fileInfo)) { + basisu_image_info info; + if (transcoder.get_image_info(srcRgb, sizeof srcRgb, info, 0)) { + printf("Success (file w: %d, h: %d, mips: %d)\n", + info.m_width, info.m_height, info.m_total_levels); + return EXIT_SUCCESS; + } + } + } + return EXIT_FAILURE; +} diff --git a/ktx/external/basisu/contrib/single_file_transcoder/examples/testcard-rgba.basis.inc b/ktx/external/basisu/contrib/single_file_transcoder/examples/testcard-rgba.basis.inc new file mode 100644 index 0000000..6b9df6e --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/examples/testcard-rgba.basis.inc @@ -0,0 +1,1043 @@ +0x73, 0x42, 0x13, 0x00, 0x4d, 0x00, 0x09, 0x5c, 0x93, 0x30, 0x00, 0x00, +0x8e, 0xab, 0x12, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x7f, 0x01, 0xeb, 0x01, 0x00, 0x00, 0x4c, 0x03, 0x00, +0x68, 0x04, 0x37, 0x05, 0x00, 0x00, 0x31, 0x10, 0x00, 0x68, 0x15, 0x00, +0x00, 0xe0, 0x01, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x01, 0x40, 0x00, 0x40, 0x00, 0x48, 0x17, 0x00, 0x00, 0x32, 0x0a, +0x00, 0x00, 0xef, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, +0x01, 0x40, 0x00, 0x40, 0x00, 0x7a, 0x21, 0x00, 0x00, 0xa0, 0x03, 0x00, +0x00, 0xd4, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, +0x20, 0x00, 0x20, 0x00, 0x1a, 0x25, 0x00, 0x00, 0xa9, 0x05, 0x00, 0x00, +0x6a, 0x14, 0x00, 0x00, 0x00, 0x01, 0x01, 0x80, 0x00, 0x80, 0x00, 0x20, +0x00, 0x20, 0x00, 0xc3, 0x2a, 0x00, 0x00, 0xf9, 0x01, 0x00, 0x00, 0xbb, +0xc0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x40, 0x00, 0x10, 0x00, +0x10, 0x00, 0xbc, 0x2c, 0x00, 0x00, 0xe2, 0x01, 0x00, 0x00, 0x50, 0x1f, +0x00, 0x00, 0x00, 0x02, 0x01, 0x40, 0x00, 0x40, 0x00, 0x10, 0x00, 0x10, +0x00, 0x9e, 0x2e, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x03, 0x88, 0x00, +0x00, 0x00, 0x03, 0x00, 0x20, 0x00, 0x20, 0x00, 0x08, 0x00, 0x08, 0x00, +0x92, 0x2f, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x66, 0x37, 0x00, 0x00, +0x00, 0x03, 0x01, 0x20, 0x00, 0x20, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1f, +0x30, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0xcc, 0xeb, 0x00, 0x00, 0x00, +0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7b, 0x30, +0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0xf5, 0xdf, 0x00, 0x00, 0x00, 0x04, +0x01, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0xa1, 0x30, 0x00, +0x00, 0x1c, 0x00, 0x00, 0x00, 0x19, 0xfe, 0x00, 0x00, 0x00, 0x05, 0x00, +0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0xbd, 0x30, 0x00, 0x00, +0x09, 0x00, 0x00, 0x00, 0xf0, 0x31, 0x00, 0x00, 0x00, 0x05, 0x01, 0x08, +0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0xc6, 0x30, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x3d, 0x16, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, +0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0xce, 0x30, 0x00, 0x00, 0x03, 0x00, +0x00, 0x00, 0xeb, 0x10, 0x00, 0x00, 0x00, 0x06, 0x01, 0x04, 0x00, 0x04, +0x00, 0x01, 0x00, 0x01, 0x00, 0xd1, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, +0x00, 0x13, 0xf2, 0x00, 0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x02, 0x00, +0x01, 0x00, 0x01, 0x00, 0xd4, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0xeb, 0xec, 0x00, 0x00, 0x00, 0x07, 0x01, 0x02, 0x00, 0x02, 0x00, 0x01, +0x00, 0x01, 0x00, 0xd7, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x67, +0xe3, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, +0x01, 0x00, 0xda, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xd3, 0x24, +0x00, 0x00, 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, +0x00, 0xdd, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x67, 0xe3, 0x20, +0x40, 0x04, 0x88, 0x52, 0x18, 0x84, 0x81, 0xe8, 0x4f, 0xa0, 0x96, 0x7d, +0xd2, 0xcb, 0xed, 0x65, 0xc1, 0x0c, 0x08, 0xd0, 0x00, 0x02, 0x22, 0x04, +0x61, 0x7b, 0x01, 0x49, 0xcc, 0x4e, 0x2f, 0x14, 0xc6, 0x06, 0x02, 0x3c, +0x00, 0xe0, 0x06, 0x41, 0x18, 0xf8, 0x1f, 0x50, 0x8a, 0xd6, 0x5d, 0xd1, +0x81, 0x0a, 0x24, 0x41, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x08, 0x81, +0xc2, 0x83, 0xdf, 0x8f, 0xc9, 0x14, 0xa2, 0xe3, 0x9d, 0xaf, 0x5b, 0x65, +0xc9, 0x2c, 0xc1, 0xef, 0xa9, 0x55, 0x49, 0x55, 0xae, 0x50, 0x5e, 0xcb, +0xae, 0x67, 0x19, 0x35, 0xc4, 0xb1, 0xfd, 0xb4, 0x95, 0x28, 0xe5, 0x63, +0xfe, 0xcd, 0x08, 0x4c, 0xf1, 0x76, 0x95, 0x00, 0x27, 0x1b, 0x4e, 0x04, +0x18, 0x6c, 0xc3, 0xc5, 0x99, 0xcf, 0xd1, 0x28, 0x52, 0xe6, 0x60, 0xf0, +0x65, 0x6c, 0xbb, 0x45, 0x96, 0xc7, 0xbe, 0x5e, 0xd2, 0x8c, 0x04, 0xfc, +0xf1, 0x06, 0xe4, 0x10, 0x33, 0x35, 0xe2, 0x66, 0x1f, 0x6d, 0xf4, 0xe9, +0x18, 0xca, 0xf3, 0x29, 0xa4, 0x0e, 0xee, 0x00, 0x03, 0x34, 0xd5, 0x5a, +0xf2, 0xfc, 0x3c, 0x1f, 0xef, 0xe8, 0xb6, 0xa5, 0x83, 0x9e, 0x47, 0xd5, +0xf5, 0xfc, 0xd7, 0x57, 0x91, 0x2b, 0xd7, 0xe0, 0x89, 0xf5, 0xb8, 0x4f, +0x5d, 0x08, 0x56, 0xa4, 0x1f, 0xf3, 0x89, 0xcd, 0x98, 0x88, 0x78, 0xad, +0x90, 0xbb, 0xe3, 0xe8, 0xb5, 0x69, 0xfe, 0xb5, 0x96, 0xff, 0x79, 0xb5, +0x12, 0xc8, 0xdd, 0x0d, 0x76, 0x84, 0xa9, 0x6c, 0x7d, 0x71, 0xf5, 0xf7, +0x52, 0x65, 0xf3, 0xf7, 0xae, 0xdc, 0xff, 0x08, 0x81, 0x23, 0x02, 0xe1, +0x40, 0x20, 0x40, 0x44, 0xf7, 0xb2, 0x17, 0x13, 0x08, 0x50, 0x3f, 0x1e, +0x4c, 0x46, 0x8f, 0x9e, 0xf4, 0x4a, 0x1a, 0xc7, 0xb1, 0x98, 0x34, 0xfe, +0x8e, 0xc0, 0xf7, 0x25, 0x10, 0x20, 0xc0, 0xf2, 0xe0, 0xf2, 0xab, 0x43, +0xdd, 0xc5, 0x3d, 0xce, 0x61, 0xee, 0x0f, 0xa0, 0xf0, 0x1c, 0x12, 0x20, +0x34, 0xe5, 0x19, 0xef, 0x17, 0x01, 0x80, 0x22, 0x86, 0x87, 0x36, 0xe5, +0x7b, 0xd1, 0x4b, 0xc1, 0x0a, 0xbf, 0x78, 0x26, 0xc4, 0x60, 0xf1, 0xd4, +0x42, 0x08, 0x29, 0xec, 0x04, 0x38, 0x53, 0x46, 0xc8, 0x4f, 0x6b, 0x22, +0xa7, 0xe0, 0x94, 0xe9, 0xe8, 0x3b, 0x40, 0xa2, 0x19, 0x91, 0xa5, 0x68, +0xff, 0xf1, 0x8d, 0x20, 0x7d, 0x40, 0xb1, 0x9b, 0x02, 0x1b, 0x35, 0xfa, +0x8f, 0x97, 0x8f, 0x38, 0x44, 0x44, 0x9e, 0x03, 0x93, 0x32, 0x30, 0x8d, +0x0c, 0x7e, 0xad, 0x4b, 0xfa, 0x68, 0xbe, 0x08, 0x6f, 0x64, 0x03, 0xbb, +0x2d, 0x22, 0x06, 0x00, 0x09, 0x4f, 0x8b, 0xea, 0x97, 0xf4, 0x65, 0x50, +0x1e, 0xb4, 0x70, 0x44, 0xe0, 0x25, 0x2e, 0xc2, 0xd5, 0xdb, 0x29, 0x8c, +0xc4, 0xf9, 0xd5, 0xfd, 0x89, 0xd7, 0xcf, 0x43, 0xbe, 0x24, 0xc7, 0x71, +0x4c, 0x67, 0x18, 0xd8, 0x05, 0x77, 0x51, 0x04, 0x55, 0xe5, 0x38, 0x0e, +0x6d, 0xdb, 0x36, 0x33, 0xeb, 0x79, 0x9e, 0x93, 0x64, 0x49, 0x5a, 0xd7, +0x35, 0xad, 0x35, 0xf5, 0xde, 0xbf, 0xd6, 0xca, 0x9c, 0x73, 0x63, 0x8c, +0xed, 0xfb, 0xee, 0xeb, 0xba, 0x5a, 0x6b, 0xf5, 0x9c, 0x13, 0x33, 0x03, +0x11, 0xbf, 0x94, 0xe2, 0xde, 0xbb, 0x8f, 0xe3, 0x20, 0x22, 0x20, 0xf9, +0xbd, 0x77, 0x97, 0x52, 0xac, 0xaa, 0x29, 0xa5, 0x7c, 0x4a, 0xe9, 0x5b, +0x6b, 0x1a, 0x63, 0xf8, 0xba, 0x2e, 0x22, 0x02, 0x33, 0x63, 0xdf, 0x77, +0xd7, 0x5a, 0x45, 0x44, 0x01, 0xd0, 0x6d, 0xdb, 0x76, 0x1c, 0xc7, 0x00, +0xa0, 0xad, 0xb5, 0xaf, 0xb5, 0x6e, 0xce, 0x69, 0x77, 0xb7, 0x99, 0x75, +0x9a, 0xa6, 0xf5, 0xde, 0xbd, 0x93, 0x76, 0x3d, 0x9b, 0x7b, 0xef, 0xef, +0xf2, 0x59, 0x1a, 0xcf, 0xed, 0x77, 0x51, 0x29, 0x65, 0xad, 0x3d, 0x16, +0xf1, 0x8a, 0x74, 0x95, 0xcf, 0xb2, 0xd7, 0x7a, 0x40, 0x28, 0x23, 0xdd, +0x9f, 0xfc, 0x0d, 0xf2, 0x6b, 0x9b, 0xab, 0x39, 0xb5, 0x26, 0x23, 0x73, +0x11, 0x05, 0x76, 0x87, 0xb8, 0x53, 0xd7, 0x33, 0x4a, 0x63, 0xe8, 0xfd, +0x45, 0x87, 0x46, 0x51, 0xcf, 0xb9, 0x5e, 0x71, 0x9f, 0xbb, 0x9b, 0xd5, +0x86, 0x7a, 0x2b, 0x04, 0x06, 0xc0, 0x4b, 0xab, 0x28, 0xe7, 0x6f, 0x53, +0x4a, 0x03, 0x2e, 0xa5, 0x14, 0xde, 0xab, 0x79, 0xfc, 0x43, 0xee, 0x0f, +0x92, 0x47, 0xf2, 0x77, 0xd4, 0xae, 0x43, 0xd9, 0x21, 0xe2, 0xb9, 0x45, +0xc0, 0x7d, 0x58, 0xfa, 0x98, 0xfd, 0x7a, 0x7f, 0x3f, 0xd5, 0x5a, 0xde, +0xf1, 0xd2, 0xef, 0x43, 0x5d, 0x00, 0xe2, 0xa4, 0x9c, 0xf8, 0x57, 0x27, +0x25, 0x0e, 0x2d, 0xdb, 0xbe, 0x21, 0xf9, 0xda, 0x93, 0x4d, 0xdc, 0x19, +0x70, 0x73, 0xe3, 0xb3, 0x2d, 0x27, 0xc0, 0x25, 0x85, 0xdd, 0xed, 0xc1, +0x01, 0xc3, 0xcc, 0x31, 0x9c, 0x9c, 0x76, 0x9e, 0x5e, 0x30, 0x4b, 0x18, +0x88, 0x19, 0x01, 0x88, 0x19, 0x29, 0xfb, 0x3e, 0x34, 0x61, 0xf4, 0x13, +0x33, 0x04, 0x21, 0x66, 0x04, 0x04, 0x66, 0x22, 0xe0, 0xcc, 0x1c, 0x40, +0x00, 0x08, 0x42, 0x00, 0x0a, 0x8d, 0x83, 0xf1, 0x11, 0x91, 0x1c, 0x22, +0x97, 0x34, 0x6a, 0xb6, 0x22, 0x9c, 0x4b, 0x7e, 0x3f, 0x9c, 0x69, 0x6a, +0x59, 0xb6, 0xb1, 0x44, 0xf9, 0x7d, 0x01, 0x0a, 0x45, 0xfe, 0x71, 0x92, +0x57, 0xe3, 0x4d, 0xc5, 0xf8, 0x5d, 0x50, 0x41, 0x35, 0x31, 0xe7, 0x38, +0x08, 0xc2, 0xc9, 0x3d, 0x6d, 0x90, 0x21, 0x0f, 0xd8, 0x05, 0xac, 0x25, +0x70, 0x3e, 0x6b, 0x00, 0x94, 0xd7, 0xd7, 0x0a, 0xe7, 0x39, 0xb3, 0xd8, +0x5e, 0x84, 0x59, 0x26, 0x53, 0xe4, 0x26, 0xd7, 0xe1, 0xa0, 0xa1, 0xaa, +0x93, 0xd1, 0x16, 0xa9, 0xe5, 0x20, 0x25, 0xc0, 0x45, 0xbe, 0x32, 0xe0, +0xe2, 0x42, 0x0e, 0x74, 0xf6, 0x4a, 0xd5, 0x9d, 0x4f, 0x7e, 0x3a, 0xff, +0xef, 0x70, 0x3e, 0xb1, 0x6d, 0x5a, 0xff, 0x5b, 0x72, 0x56, 0x88, 0x5c, +0xab, 0xe3, 0xd7, 0xa3, 0xcb, 0x3d, 0xe6, 0x5f, 0x65, 0xd6, 0x65, 0xe4, +0x53, 0x53, 0x07, 0x55, 0xd9, 0x99, 0x30, 0x99, 0x3f, 0x13, 0x16, 0x39, +0xcf, 0x01, 0x37, 0x22, 0x02, 0x04, 0x4f, 0x04, 0x06, 0x61, 0x18, 0x8a, +0xbe, 0xdf, 0x16, 0xd6, 0x2c, 0x90, 0x34, 0xc1, 0xe0, 0xf8, 0x62, 0x24, +0x48, 0x0e, 0x40, 0xd2, 0x86, 0x20, 0x90, 0x48, 0x24, 0x0a, 0xc9, 0x19, +0x7e, 0xa6, 0x70, 0x68, 0x0c, 0x1a, 0x0b, 0x07, 0x80, 0xcf, 0x0d, 0xf0, +0x18, 0x50, 0x08, 0x10, 0x93, 0x73, 0x05, 0x08, 0xe6, 0x50, 0x4b, 0x14, +0x00, 0x00, 0x00, 0xe0, 0x4f, 0xc2, 0xb8, 0x02, 0x6d, 0x0d, 0x2a, 0x69, +0xaa, 0x9c, 0xd2, 0xb2, 0x84, 0x26, 0x45, 0x30, 0x3b, 0x2f, 0x3d, 0xb5, +0x87, 0x7a, 0x56, 0x44, 0x04, 0x59, 0x8b, 0xd6, 0xe2, 0xa3, 0xe1, 0xf4, +0x8e, 0xba, 0xcb, 0xf2, 0x82, 0x16, 0xad, 0xa1, 0x1f, 0x60, 0x6d, 0x96, +0x44, 0x99, 0x04, 0x9a, 0x84, 0x77, 0xf6, 0xf2, 0xd1, 0xc3, 0xc7, 0xd4, +0x58, 0x2d, 0x3e, 0x96, 0x1e, 0x43, 0x71, 0xf7, 0x3a, 0xc2, 0x14, 0xc2, +0x12, 0x40, 0x00, 0x61, 0x05, 0x61, 0xe6, 0xff, 0xff, 0xf7, 0xe7, 0xff, +0xff, 0xf7, 0x05, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xff, 0x7f, 0x2f, 0xff, +0xbf, 0x7f, 0x2f, 0xff, 0xbf, 0x7f, 0x3f, 0xff, 0xff, 0x7f, 0x3f, 0xbf, +0x7f, 0x7f, 0x3f, 0xbf, 0x7f, 0x3f, 0x3f, 0xbf, 0x7f, 0x3f, 0x2f, 0xfe, +0xff, 0xef, 0xe5, 0xf5, 0xff, 0xef, 0xe5, 0xe3, 0xef, 0xe7, 0xe5, 0x63, +0xe3, 0xeb, 0xdf, 0xcb, 0xc3, 0xc1, 0xdf, 0xcb, 0xc7, 0xc2, 0xff, 0xef, +0xc7, 0xc2, 0xff, 0xef, 0xcb, 0x82, 0xfb, 0xff, 0x7d, 0x79, 0xf8, 0xff, +0xfd, 0xf9, 0x08, 0x58, 0xf8, 0xff, 0xff, 0x5b, 0xf8, 0xff, 0xff, 0xdb, +0xf8, 0xff, 0xff, 0xdf, 0xf8, 0xff, 0xff, 0xdd, 0xf8, 0xff, 0xff, 0xfd, +0x08, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x16, 0xff, 0xff, 0xff, +0x06, 0xff, 0xff, 0xbf, 0x06, 0x12, 0x87, 0xff, 0xff, 0xff, 0x03, 0xfe, +0xff, 0xff, 0x0b, 0xfe, 0xff, 0xff, 0x2b, 0x3a, 0x07, 0x43, 0xff, 0xff, +0xff, 0x50, 0x12, 0x35, 0xff, 0xff, 0xfd, 0xe0, 0xff, 0xff, 0xfd, 0xe4, +0xff, 0xff, 0xff, 0xe4, 0xff, 0xff, 0xfe, 0xe4, 0xff, 0xff, 0xfe, 0xf4, +0xe6, 0xff, 0xdf, 0x9f, 0x1f, 0x61, 0xf6, 0xff, 0xff, 0x1f, 0xff, 0xff, +0xbf, 0x1f, 0xff, 0xdf, 0xbf, 0x1f, 0xff, 0xdf, 0xbf, 0x9f, 0xff, 0xff, +0xbf, 0x9f, 0xdf, 0xbf, 0xbf, 0x9f, 0x9f, 0xfd, 0xfb, 0xf9, 0xf9, 0xfd, +0xfb, 0xf9, 0xf1, 0xff, 0xfb, 0xf1, 0xf5, 0xff, 0xfb, 0xf1, 0xe9, 0xfb, +0xf9, 0xf1, 0xe9, 0x37, 0xa6, 0xfa, 0xf1, 0xe1, 0xa1, 0xfb, 0xf1, 0xe9, +0xc1, 0x27, 0xff, 0xfe, 0xf4, 0xe0, 0xff, 0xfe, 0xf8, 0xe0, 0xff, 0xfe, +0xf8, 0xf0, 0x01, 0x8b, 0xff, 0xfe, 0xfc, 0xf4, 0x12, 0x47, 0xfa, 0xfb, +0xf9, 0xf9, 0xf9, 0xfb, 0xfb, 0xfd, 0xc1, 0xcf, 0xdf, 0xef, 0x8f, 0xcf, +0xdf, 0xef, 0x8f, 0xef, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x8f, 0xdf, +0xff, 0xff, 0x8f, 0xdf, 0xef, 0xff, 0xcf, 0xdf, 0xef, 0xff, 0xcf, 0xdf, +0xff, 0xff, 0xaf, 0xfc, 0xfe, 0xff, 0xff, 0xf4, 0xfe, 0xff, 0xff, 0xe4, +0xfe, 0xff, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xe4, 0xfd, 0xff, 0xff, 0xe0, +0xfd, 0xff, 0xff, 0x01, 0x73, 0x01, 0xf5, 0x01, 0x1c, 0xff, 0xff, 0x1f, +0x1c, 0xdf, 0xff, 0x1f, 0x1e, 0xdf, 0xff, 0x9f, 0x9e, 0xdf, 0xff, 0x5f, +0xa2, 0x96, 0x9f, 0xbf, 0xbf, 0x9f, 0x1e, 0x9f, 0xbf, 0x9f, 0x1e, 0xbf, +0xff, 0x5f, 0xe8, 0xf3, 0xfb, 0xfd, 0xe9, 0xf3, 0xf3, 0xe9, 0xfd, 0xfb, +0xf3, 0xe9, 0xff, 0xff, 0xf3, 0xcb, 0xff, 0xff, 0xf3, 0x29, 0xff, 0xff, +0xf3, 0xa1, 0xff, 0xff, 0xf3, 0x81, 0x36, 0xbe, 0xe1, 0xbf, 0x1f, 0x1c, +0xe8, 0xdf, 0x9f, 0x1c, 0xe8, 0xdf, 0x9f, 0x12, 0xe0, 0xdf, 0x1f, 0x0a, +0xe0, 0xff, 0x5f, 0x0b, 0xe0, 0xff, 0xd7, 0x02, 0xe0, 0xff, 0xb7, 0x00, +0xe0, 0xff, 0xbf, 0x14, 0x20, 0xfc, 0x6b, 0x95, 0x02, 0xfc, 0x6b, 0x01, +0x00, 0xfc, 0x6b, 0x00, 0x00, 0xfc, 0xeb, 0x02, 0x00, 0x08, 0x84, 0xff, +0x5f, 0x01, 0x00, 0xfe, 0x4b, 0x01, 0x00, 0xfe, 0x49, 0x01, 0x00, 0x4a, +0x7f, 0x72, 0x20, 0x80, 0x87, 0xbc, 0x7f, 0x68, 0x60, 0xe0, 0xe2, 0xc8, +0x7f, 0x30, 0x30, 0xf0, 0xff, 0x30, 0x30, 0x70, 0xfb, 0x31, 0x30, 0xf0, +0x7f, 0x35, 0x30, 0xf0, 0xf0, 0xbd, 0x1a, 0x10, 0xf8, 0x1f, 0x08, 0x10, +0xf8, 0x1f, 0x08, 0x00, 0xa0, 0xa4, 0xe9, 0xa0, 0xff, 0x1f, 0x00, 0x20, +0xe0, 0x1f, 0x00, 0x40, 0xe0, 0x5f, 0x40, 0x40, 0x60, 0xb5, 0x2f, 0x20, +0x20, 0xb0, 0x2a, 0x20, 0x30, 0xb0, 0x3a, 0x30, 0x30, 0x30, 0x38, 0x34, +0x30, 0x70, 0xd0, 0x77, 0x30, 0x30, 0x30, 0x50, 0x72, 0x62, 0x61, 0xe1, +0x60, 0xa0, 0x5c, 0x58, 0x38, 0x38, 0xf8, 0xcb, 0xfa, 0x58, 0x38, 0x10, +0x78, 0xd8, 0xf2, 0xf2, 0xb1, 0x70, 0xf0, 0xb0, 0xb1, 0x71, 0x72, 0xb0, +0xf0, 0xf1, 0xb2, 0xf0, 0xf1, 0xf1, 0x52, 0x2f, 0x3c, 0x7c, 0x7c, 0x6c, +0xcc, 0x1c, 0x3c, 0xbc, 0xfc, 0x2d, 0x7c, 0xbc, 0xfc, 0x2d, 0x7c, 0xfc, +0xfe, 0x2f, 0xbc, 0xfc, 0xfe, 0x2f, 0xbc, 0xfc, 0xff, 0x07, 0xcc, 0xf3, +0xc7, 0xcf, 0xef, 0xff, 0xc7, 0xef, 0xff, 0xff, 0xc6, 0xef, 0xff, 0xff, +0xc6, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0x3f, 0xc2, 0xf4, 0xcb, 0xff, +0xff, 0xff, 0xcb, 0xef, 0xff, 0xff, 0xfc, 0xe7, 0xf7, 0xff, 0x1f, 0x61, +0xf9, 0xe7, 0xef, 0xff, 0xff, 0xe5, 0xef, 0xff, 0xff, 0xe5, 0xef, 0xf7, +0xff, 0xe7, 0xef, 0xf7, 0x5f, 0xe2, 0xd0, 0xcf, 0xcf, 0xdf, 0x2f, 0x5e, +0x7e, 0xfe, 0x7e, 0x7f, 0xfe, 0xfe, 0x7e, 0x3f, 0xde, 0xfe, 0x7e, 0x3f, +0x5e, 0xfe, 0xfe, 0x3f, 0x5e, 0x7e, 0xfe, 0x7e, 0x7e, 0xfe, 0xfe, 0x5e, +0x5f, 0xfe, 0xfe, 0x0f, 0x5f, 0xff, 0xff, 0x17, 0x07, 0x6f, 0xff, 0xff, +0x01, 0x6f, 0xff, 0xff, 0x1b, 0x5f, 0x02, 0x16, 0xfe, 0xfe, 0x03, 0x16, +0xf0, 0xfe, 0x07, 0x16, 0x54, 0xf6, 0x8b, 0x1b, 0x06, 0x06, 0x86, 0xfe, +0x31, 0x30, 0x30, 0xfc, 0x3f, 0x20, 0x10, 0xf4, 0x6f, 0x20, 0x10, 0xf0, +0x6f, 0x30, 0x20, 0xf0, 0x2f, 0x20, 0x20, 0xf0, 0x2f, 0x20, 0x20, 0xb0, +0x2f, 0x20, 0x20, 0xb9, 0x3b, 0x20, 0x20, 0xb0, 0x4a, 0xc5, 0xed, 0x02, +0x02, 0x56, 0xaa, 0x02, 0xa2, 0x17, 0xab, 0x03, 0xa7, 0x17, 0xab, 0x17, +0xa6, 0x02, 0xab, 0x15, 0x0a, 0x06, 0xab, 0x01, 0x02, 0x07, 0x0b, 0x01, +0x02, 0x03, 0x03, 0x12, 0x20, 0x30, 0x70, 0x10, 0x20, 0x70, 0x70, 0x00, +0x20, 0x70, 0xd0, 0x00, 0x00, 0x70, 0xd0, 0x02, 0x00, 0x60, 0xf0, 0x06, +0x00, 0x50, 0xf0, 0x06, 0x00, 0x00, 0xf0, 0x26, 0xd1, 0x00, 0x00, 0x00, +0x80, 0x0d, 0x00, 0x00, 0x81, 0x0d, 0x00, 0x00, 0x81, 0x05, 0x80, 0x00, +0x81, 0x05, 0x80, 0x00, 0x81, 0x01, 0x80, 0x00, 0x81, 0x03, 0x00, 0x00, +0x81, 0x03, 0x00, 0x00, 0x80, 0x83, 0x06, 0x00, 0x20, 0xe0, 0x00, 0x00, +0x20, 0x60, 0x00, 0x00, 0x20, 0x60, 0x01, 0x00, 0x20, 0x60, 0x03, 0x61, +0x11, 0xe1, 0x1f, 0xdd, 0x7b, 0x00, 0x16, 0xe1, 0x37, 0xdd, 0x87, 0x03, +0x00, 0x00, 0x80, 0x83, 0x00, 0x00, 0x80, 0x81, 0x00, 0x00, 0x80, 0x85, +0x00, 0x00, 0x80, 0x8d, 0x00, 0x00, 0x80, 0x0d, 0x00, 0x00, 0x00, 0xdd, +0x10, 0x00, 0x00, 0x58, 0x10, 0x00, 0x00, 0x58, 0x10, 0x08, 0x00, 0x18, +0x10, 0x08, 0x00, 0x38, 0x10, 0x08, 0x00, 0x38, 0x10, 0x00, 0x00, 0x08, +0x98, 0x0a, 0x08, 0xa3, 0xe5, 0x00, 0x00, 0xa0, 0xe1, 0x40, 0x00, 0x60, +0xe1, 0x40, 0x20, 0x60, 0x60, 0x40, 0x20, 0xe0, 0x60, 0x40, 0x20, 0xe0, +0xe0, 0x40, 0x20, 0xe0, 0xe0, 0x60, 0x61, 0x61, 0xe0, 0x60, 0x61, 0x81, +0x4a, 0x1a, 0x06, 0x06, 0x06, 0x0e, 0x86, 0x06, 0x06, 0x06, 0xa6, 0x06, +0x26, 0x06, 0xb6, 0x0e, 0x06, 0x02, 0xfe, 0x0c, 0x02, 0x02, 0xde, 0x0c, +0x00, 0x00, 0xde, 0x0a, 0x00, 0x00, 0xaa, 0x37, 0x00, 0x00, 0x00, 0x97, +0x00, 0x00, 0x80, 0x83, 0x61, 0x55, 0x00, 0x80, 0x00, 0x55, 0x00, 0x00, +0xc8, 0xe2, 0xce, 0x5d, 0x40, 0x40, 0xc0, 0x7f, 0x40, 0x40, 0xc0, 0xf4, +0x0f, 0x08, 0x0c, 0xf9, 0x0f, 0x0c, 0x0c, 0xff, 0x0f, 0x0e, 0x0e, 0xfe, +0x0f, 0x0d, 0x0e, 0xee, 0x0f, 0x05, 0x0a, 0xea, 0x0b, 0x04, 0x00, 0x20, +0x11, 0xc9, 0x07, 0x00, 0x00, 0x48, 0xf9, 0x50, 0x00, 0x00, 0xf9, 0x90, +0x00, 0x00, 0xfd, 0x90, 0x40, 0x40, 0xff, 0x00, 0x40, 0x40, 0xff, 0x00, +0x40, 0xe0, 0xff, 0x80, 0x40, 0x00, 0x25, 0x8d, 0xbf, 0x1b, 0x01, 0x00, +0xfc, 0xb6, 0x21, 0x00, 0xf0, 0xb2, 0x20, 0x00, 0xf0, 0xb2, 0x60, 0x10, +0xf0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xf0, 0x20, 0x50, 0xf7, 0xf1, +0xf1, 0xb0, 0xf0, 0xf1, 0xf1, 0xf2, 0xc2, 0x07, 0x1f, 0x6f, 0xbf, 0x06, +0x1b, 0x2f, 0xbf, 0x02, 0x1b, 0x6f, 0xbf, 0x06, 0x1b, 0x7f, 0xff, 0x87, +0x5f, 0x7f, 0xff, 0x12, 0x75, 0x05, 0xff, 0xff, 0xff, 0x06, 0xff, 0xff, +0xff, 0x30, 0xf8, 0xfd, 0xff, 0xb7, 0xf8, 0xff, 0xff, 0xb7, 0x78, 0xfb, +0xff, 0xff, 0x7a, 0xfb, 0xfd, 0xff, 0x79, 0x7b, 0xff, 0xff, 0xfd, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xf7, 0xff, 0xff, +0xff, 0xf4, 0xff, 0xff, 0xeb, 0xf4, 0xff, 0xfb, 0xf9, 0xfc, 0x08, 0xab, +0xfe, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xeb, 0xff, 0xff, +0xfc, 0xf9, 0xfb, 0xff, 0x1e, 0x3a, 0xff, 0xff, 0x1f, 0x28, 0xff, 0xff, +0x1f, 0xea, 0xff, 0xff, 0x5f, 0xe2, 0x28, 0xe4, 0xff, 0xff, 0x3f, 0xa4, +0xff, 0xff, 0x3f, 0xe5, 0xff, 0xff, 0x3f, 0x65, 0xfe, 0xff, 0x7f, 0x82, +0xc4, 0x6f, 0xf7, 0x87, 0x24, 0xef, 0xff, 0x07, 0x24, 0xcf, 0xf7, 0x87, +0x24, 0xc7, 0xf7, 0x87, 0xa6, 0xcf, 0xf7, 0x87, 0x86, 0xc7, 0xef, 0xdf, +0xf8, 0x0c, 0x0e, 0x4f, 0x4f, 0x0f, 0x70, 0x7a, 0x7a, 0x7c, 0x7c, 0x7a, +0x7a, 0x70, 0x7a, 0x7a, 0x78, 0x70, 0x7a, 0x7a, 0x7c, 0x7c, 0x70, 0x7a, +0xfc, 0x7e, 0x70, 0x7a, 0xff, 0x7f, 0x20, 0x72, 0xff, 0x7f, 0x20, 0xf0, +0xfe, 0x7f, 0xda, 0x98, 0x06, 0x80, 0xf2, 0xff, 0x07, 0xa0, 0xf4, 0xff, +0x07, 0x80, 0xcc, 0xff, 0x07, 0x00, 0xd0, 0xfd, 0x07, 0x00, 0xd0, 0xf8, +0x07, 0x00, 0xd0, 0xfa, 0x07, 0x00, 0x00, 0xfa, 0x1f, 0x97, 0xd4, 0x03, +0x00, 0x01, 0xfe, 0x1f, 0xdc, 0x0a, 0x00, 0x00, 0xf8, 0x17, 0x00, 0x00, +0xf8, 0x2f, 0x39, 0x0e, 0x09, 0x00, 0xf0, 0x0f, 0x09, 0x0c, 0xf8, 0xcf, +0x80, 0x80, 0x80, 0xff, 0x80, 0x80, 0x81, 0xef, 0xc0, 0x80, 0xd5, 0xef, +0xc0, 0xc0, 0xd5, 0xff, 0xc0, 0xc0, 0xc1, 0xff, 0xc5, 0xf5, 0xc1, 0xc0, +0xc0, 0xff, 0xc0, 0xc0, 0xd0, 0xff, 0x02, 0x0e, 0x0e, 0xfd, 0x0f, 0x0e, +0x0e, 0xfe, 0x0f, 0x0f, 0x0c, 0xfc, 0x0f, 0x0d, 0x0c, 0xbc, 0x0d, 0x0c, +0x0c, 0xbc, 0x0d, 0x0c, 0x0c, 0xac, 0x0e, 0x0c, 0x0c, 0x0c, 0x7e, 0x70, +0xd3, 0x80, 0x03, 0x03, 0x03, 0x97, 0x44, 0xc8, 0x81, 0x81, 0x81, 0xcb, +0xa1, 0x81, 0x81, 0xc0, 0xa1, 0x01, 0x81, 0xa0, 0xa1, 0x01, 0x81, 0x80, +0x81, 0x01, 0x81, 0x80, 0x81, 0x81, 0xc9, 0xa9, 0xe4, 0x18, 0x10, 0x30, +0x34, 0x1c, 0x10, 0x20, 0x24, 0x18, 0x10, 0x20, 0x34, 0x38, 0x10, 0x20, +0x30, 0x30, 0x10, 0x20, 0x34, 0x34, 0x00, 0x00, 0x20, 0x34, 0x00, 0x10, +0x20, 0xb4, 0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x82, 0x03, 0x00, +0x00, 0x82, 0x03, 0x00, 0x00, 0x92, 0x03, 0x00, 0x00, 0x90, 0x03, 0x00, +0x00, 0x91, 0x03, 0x00, 0x00, 0x81, 0x23, 0x2c, 0x14, 0x08, 0x7f, 0x11, +0xfe, 0x20, 0xcc, 0x43, 0x03, 0x00, 0x00, 0x40, 0x03, 0x02, 0x00, 0x40, +0x03, 0x02, 0x01, 0x00, 0x03, 0x02, 0x01, 0x80, 0x03, 0x02, 0x01, 0x30, +0x38, 0x20, 0x00, 0x00, 0x39, 0x20, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, +0x39, 0x10, 0x00, 0x00, 0x38, 0x10, 0x00, 0x40, 0xc0, 0x34, 0x1c, 0x30, +0x10, 0x00, 0x04, 0x10, 0x10, 0x00, 0x28, 0x80, 0x00, 0x00, 0x28, 0x02, +0x00, 0x00, 0x08, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x00, +0x02, 0x28, 0x00, 0x00, 0x80, 0x28, 0x00, 0x80, 0x80, 0x20, 0x00, 0x00, +0x80, 0xa0, 0x6f, 0x00, 0x00, 0x00, 0xd0, 0x1c, 0xfd, 0x08, 0x73, 0x74, +0x69, 0x91, 0xdb, 0x07, 0xe9, 0xe0, 0xa0, 0x80, 0x00, 0x8e, 0x3e, 0x4b, +0xf7, 0x91, 0x2e, 0x03, 0x0d, 0x04, 0x00, 0x40, 0x0f, 0x0d, 0x04, 0x00, +0x07, 0x0d, 0x0c, 0x04, 0x06, 0x09, 0x08, 0x44, 0x06, 0x0a, 0x0c, 0x04, +0x0e, 0x0e, 0x0d, 0xdc, 0x80, 0x83, 0x43, 0x43, 0xd3, 0x83, 0x43, 0x03, +0xd2, 0xc3, 0x43, 0x17, 0xc1, 0xc3, 0x57, 0x55, 0x05, 0xb4, 0x06, 0x2c, +0xa7, 0x0c, 0x21, 0xfc, 0xc8, 0x00, 0x5b, 0x53, 0x9e, 0x75, 0x0c, 0x6e, +0xec, 0x0e, 0x58, 0xc2, 0x2c, 0xde, 0xd8, 0xf5, 0xbd, 0x37, 0x17, 0x15, +0x6e, 0x14, 0xf6, 0x14, 0x04, 0xac, 0x74, 0xbc, 0xd8, 0x28, 0x28, 0x2a, +0x28, 0xda, 0x93, 0x05, 0xce, 0xe3, 0x3c, 0x4f, 0x19, 0x44, 0xf8, 0x29, +0xf2, 0x58, 0x3d, 0x6d, 0x90, 0x09, 0x89, 0x7d, 0x0d, 0x26, 0x43, 0xa2, +0x21, 0x97, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x3e, 0xae, 0x33, +0xd7, 0x31, 0xaf, 0x4b, 0xb1, 0x21, 0x25, 0x50, 0xd6, 0xf0, 0x04, 0x24, +0x55, 0x9d, 0xba, 0x4e, 0xae, 0xaf, 0xaf, 0xaf, 0xab, 0xab, 0xab, 0xab, +0x07, 0x35, 0x75, 0x75, 0x75, 0x75, 0x75, 0x7d, 0x7d, 0x75, 0x75, 0xf5, +0x7f, 0x55, 0x55, 0xfd, 0x7f, 0x81, 0x80, 0xaa, 0xea, 0xeb, 0xbf, 0xaa, +0xaa, 0xea, 0xbf, 0xaa, 0xaa, 0xea, 0x4f, 0x4e, 0x19, 0x03, 0xd8, 0x91, +0x32, 0x9a, 0x32, 0x8e, 0xf0, 0xbd, 0xe1, 0x74, 0xc7, 0x70, 0x47, 0x6a, +0xa7, 0xae, 0xa6, 0xa6, 0x7e, 0xd0, 0x6d, 0x12, 0xff, 0xba, 0xa3, 0xaa, +0xa6, 0xa9, 0xd9, 0x70, 0xca, 0x23, 0xa1, 0xaa, 0x6a, 0x8a, 0x56, 0xa5, +0xaa, 0x9a, 0xa2, 0xa6, 0xaa, 0xaa, 0xae, 0x0e, 0x8d, 0xae, 0xae, 0xae, +0xae, 0xae, 0xa6, 0xa6, 0xae, 0x1e, 0x44, 0xd3, 0x53, 0x52, 0xd2, 0xff, +0xd3, 0xd3, 0xd3, 0xfd, 0xff, 0xea, 0xea, 0xea, 0xff, 0xab, 0xaa, 0xea, +0xbf, 0xaa, 0xaa, 0x2a, 0x62, 0xf2, 0x5f, 0x5d, 0x5d, 0xfd, 0x5f, 0x5f, +0x55, 0x55, 0x5f, 0x5f, 0x5d, 0x7d, 0x46, 0x5d, 0x5d, 0xfd, 0xde, 0xd1, +0xdb, 0x91, 0x38, 0xe8, 0x42, 0x7c, 0xfb, 0xbd, 0x13, 0xf1, 0xda, 0xeb, +0xeb, 0xea, 0xaa, 0xc0, 0xba, 0xe5, 0xea, 0xea, 0xeb, 0xeb, 0xea, 0xea, +0xea, 0xbf, 0xaa, 0xaa, 0x2a, 0xff, 0x41, 0x4c, 0x55, 0x55, 0xf5, 0x58, +0x55, 0x55, 0x75, 0x1a, 0x31, 0x05, 0xa4, 0xaa, 0x7a, 0x27, 0x60, 0xa0, +0xaf, 0x6f, 0x60, 0xa1, 0xaf, 0x6f, 0x6c, 0xac, 0xaf, 0x6f, 0xfd, 0xac, +0xfd, 0xff, 0xfd, 0xad, 0xfd, 0xfd, 0xed, 0xed, 0xed, 0xfd, 0xe4, 0xed, +0xed, 0xed, 0xb8, 0xe3, 0xb3, 0xfe, 0xfe, 0xd6, 0xfe, 0xff, 0x7e, 0xd6, +0x7e, 0x8f, 0x5a, 0x8f, 0x1a, 0x8f, 0xb0, 0x47, 0xdd, 0xff, 0xff, 0xfa, +0xc7, 0xff, 0xff, 0xdb, 0xc1, 0xfe, 0xff, 0xff, 0xcd, 0xe2, 0xff, 0xff, +0x6d, 0xeb, 0xff, 0xff, 0x2d, 0x60, 0x63, 0xf6, 0xff, 0x6f, 0x21, 0xe0, +0x1f, 0x6f, 0x21, 0x60, 0x5f, 0x65, 0x61, 0xa0, 0xb8, 0x11, 0xff, 0x43, +0x03, 0x03, 0xff, 0xc3, 0x03, 0x03, 0xff, 0x41, 0x02, 0x03, 0xff, 0x01, +0x02, 0x06, 0xff, 0x02, 0x03, 0x06, 0xff, 0x03, 0x03, 0x0f, 0xff, 0x03, +0x03, 0xbf, 0xbf, 0x03, 0x03, 0xff, 0x78, 0x18, 0x18, 0xf8, 0x1f, 0x18, +0x18, 0x38, 0x1f, 0x18, 0x18, 0x18, 0x1a, 0x18, 0x18, 0x5a, 0x1b, 0x18, +0x18, 0x1a, 0x0c, 0x08, 0x08, 0x0a, 0x0e, 0x0a, 0x08, 0x58, 0x0b, 0x08, +0x08, 0xf0, 0x9f, 0x06, 0x04, 0x18, 0xfc, 0x01, 0x04, 0x1c, 0x7c, 0x00, +0x04, 0x0c, 0x28, 0x00, 0x08, 0x0c, 0x28, 0x1c, 0xbc, 0x2c, 0xee, 0x50, +0xb5, 0x12, 0x10, 0x58, 0xbd, 0x10, 0x15, 0xc0, 0xea, 0xc5, 0xe9, 0xc0, +0xfe, 0x85, 0xc0, 0xc0, 0x7f, 0xc7, 0x41, 0xc0, 0xdd, 0xc7, 0xc1, 0xc0, +0xf9, 0xc0, 0xc0, 0xc0, 0xda, 0xd0, 0xc0, 0xc0, 0x5a, 0x40, 0x40, 0x90, +0x3a, 0x10, 0x50, 0x10, 0xab, 0x03, 0x03, 0x03, 0xab, 0x03, 0x02, 0x02, +0xab, 0x53, 0x1a, 0x02, 0xaa, 0x53, 0x1b, 0x03, 0xaa, 0x13, 0x16, 0x16, +0x16, 0x9f, 0x9b, 0xa9, 0xac, 0xac, 0xbc, 0xac, 0xac, 0xac, 0x7c, 0x1c, +0x5c, 0xb9, 0xbc, 0xbc, 0xb4, 0x34, 0xbf, 0xbc, 0xbc, 0x34, 0xb7, 0xb4, +0xb4, 0x34, 0x35, 0x35, 0x25, 0x25, 0x35, 0x35, 0x35, 0x15, 0xe8, 0x3c, +0x78, 0x45, 0xc5, 0x6d, 0xc0, 0x80, 0x80, 0xea, 0x40, 0x40, 0x00, 0xea, +0x41, 0x40, 0x40, 0xea, 0x40, 0x40, 0x40, 0x42, 0xc0, 0xc0, 0xc1, 0xc2, +0xc2, 0xc1, 0xc0, 0xc0, 0xdb, 0xc0, 0xc0, 0xc0, 0xd8, 0x06, 0x06, 0x86, +0xfe, 0x07, 0x06, 0x0e, 0xfe, 0x17, 0x1e, 0x16, 0xfe, 0x17, 0x3c, 0x54, +0xfc, 0x9f, 0x1c, 0x1e, 0xfc, 0x1f, 0x18, 0x9a, 0xfe, 0x1f, 0xd8, 0x98, +0xfc, 0x7f, 0xd8, 0x98, 0xc1, 0xff, 0xc8, 0xcc, 0xc8, 0xff, 0xd0, 0xef, +0xc0, 0xef, 0xdb, 0xc7, 0xc1, 0xef, 0xcb, 0x86, 0xc1, 0xef, 0xdb, 0x86, +0xc0, 0xff, 0xdf, 0x86, 0xc1, 0xff, 0xdf, 0xc3, 0xd1, 0xef, 0xde, 0x8b, +0x41, 0xf5, 0xfb, 0xf7, 0xf6, 0xf1, 0xf1, 0xf6, 0xf6, 0xe1, 0x59, 0xf2, +0xff, 0xfe, 0xf6, 0xf3, 0xf7, 0xf7, 0xf3, 0x23, 0x11, 0xfe, 0xff, 0xd3, +0xf9, 0xfb, 0xfb, 0xd3, 0xfb, 0xdb, 0xfc, 0xe9, 0xfd, 0xfd, 0xfd, 0xe9, +0xfc, 0xfd, 0x7f, 0xac, 0xff, 0xff, 0x6f, 0xfc, 0xfd, 0xff, 0x2f, 0xfc, +0xfd, 0xff, 0x1f, 0x8c, 0xb5, 0x4c, 0xe4, 0xfa, 0xfa, 0xfa, 0x02, 0xc5, +0xd7, 0xd7, 0x05, 0xc5, 0xd7, 0x17, 0x05, 0xc5, 0xd7, 0x17, 0x17, 0xe5, +0xd7, 0x97, 0x0c, 0x8c, 0x94, 0x97, 0x0d, 0x18, 0x94, 0x86, 0x03, 0x0c, +0x96, 0x0e, 0x03, 0x08, 0x1a, 0x0e, 0xc5, 0x01, 0x43, 0x83, 0x83, 0x43, +0x43, 0x83, 0x83, 0x0b, 0xd4, 0xe0, 0xe3, 0xd3, 0xd3, 0xfb, 0xe7, 0xd3, +0x43, 0xfb, 0xe3, 0x93, 0x43, 0xfa, 0xe7, 0x93, 0x03, 0xfe, 0xf7, 0x93, +0x43, 0xea, 0xff, 0xbf, 0x3f, 0xe4, 0xff, 0xff, 0x3f, 0xe4, 0xff, 0xff, +0x3f, 0xe5, 0xfb, 0xfb, 0x7f, 0xe5, 0xfb, 0xfb, 0x7f, 0xd5, 0xfb, 0xfb, +0xff, 0x91, 0x49, 0xd9, 0xc0, 0x7e, 0x2b, 0xd0, 0x5a, 0x54, 0xd4, 0x5f, +0x5f, 0x54, 0xf0, 0xff, 0x5f, 0x50, 0xf0, 0xff, 0x4d, 0x40, 0xf1, 0x7f, +0x0f, 0x41, 0xf1, 0x9f, 0x0f, 0x09, 0xf0, 0x9f, 0x6e, 0x01, 0x60, 0xfe, +0xdf, 0x0c, 0x00, 0x06, 0x7c, 0x7d, 0x41, 0x41, 0x3d, 0x3c, 0x40, 0x41, +0x3d, 0x3c, 0x54, 0x55, 0x7d, 0x3c, 0x1c, 0x45, 0x7d, 0x2e, 0x0d, 0x05, +0x71, 0x29, 0x0d, 0x05, 0xe5, 0x82, 0x60, 0x53, 0x15, 0xf4, 0x01, 0x81, +0x35, 0xe9, 0x99, 0x94, 0xa7, 0x55, 0x85, 0x08, 0xbf, 0x8a, 0x80, 0xd5, +0x8e, 0xf8, 0x41, 0x4f, 0x55, 0x55, 0xe5, 0xbe, 0x55, 0x55, 0xd5, 0x7f, +0x55, 0x95, 0xd5, 0x7b, 0x45, 0xc5, 0xd5, 0x75, 0x45, 0x45, 0xc4, 0xaf, +0x0b, 0x38, 0xe8, 0xf8, 0x1f, 0x38, 0xf8, 0xb8, 0x7b, 0xd8, 0x24, 0x70, +0xb0, 0xf0, 0x11, 0x60, 0xb0, 0xf0, 0x02, 0x20, 0xb0, 0xf0, 0x02, 0x20, +0xb0, 0xf1, 0x06, 0x10, 0xb0, 0xf1, 0x0b, 0x80, 0x82, 0xdf, 0x7f, 0x00, +0x8b, 0xdf, 0x7f, 0x00, 0xad, 0xff, 0xff, 0x80, 0x8d, 0xdf, 0xff, 0x99, +0x8d, 0x87, 0xff, 0xc9, 0x8d, 0x81, 0xff, 0xe9, 0xa1, 0x81, 0xff, 0xc1, +0xe1, 0xc9, 0x7f, 0x08, 0x0f, 0x0b, 0xff, 0x03, 0x03, 0x0f, 0xff, 0x03, +0x03, 0x1f, 0xb7, 0x03, 0x03, 0x6f, 0x93, 0x03, 0x01, 0x43, 0x97, 0x03, +0x01, 0x41, 0xf6, 0x03, 0x00, 0x40, 0xe6, 0x03, 0x00, 0x00, 0xe4, 0x3b, +0x00, 0x00, 0xa8, 0x7c, 0x00, 0x00, 0x20, 0xdf, 0x83, 0x11, 0x00, 0x80, +0x00, 0x17, 0x00, 0x00, 0x68, 0x37, 0x00, 0x20, 0x68, 0x7a, 0x00, 0x20, +0x60, 0x38, 0x00, 0x40, 0x70, 0x7c, 0x05, 0x82, 0x04, 0xc7, 0x07, 0x00, +0x24, 0xcf, 0x07, 0x00, 0x20, 0xfd, 0x07, 0x00, 0x28, 0xfd, 0x07, 0x00, +0x78, 0xfd, 0x07, 0x00, 0x78, 0x7d, 0x15, 0x68, 0xbb, 0xb8, 0x48, 0x5c, +0xff, 0x87, 0x80, 0x00, 0x00, 0xef, 0x80, 0x80, 0x80, 0xae, 0x02, 0x04, +0x84, 0xa2, 0x49, 0x14, 0x04, 0xa0, 0x69, 0x1c, 0x04, 0xa0, 0xe1, 0x38, +0x14, 0x00, 0xe9, 0x3a, 0x06, 0x5a, 0x20, 0xfa, 0x8f, 0x00, 0x00, 0x48, +0xb7, 0x00, 0x80, 0x00, 0x37, 0x48, 0xbf, 0x6a, 0xa5, 0x98, 0x49, 0xd4, +0x60, 0x44, 0xa0, 0x1d, 0x0a, 0x0f, 0x0f, 0x0a, 0x5a, 0x5f, 0x0f, 0x0a, +0x51, 0x47, 0x0f, 0x1f, 0x41, 0x43, 0x4b, 0x9f, 0x41, 0x43, 0x4f, 0x5c, +0x01, 0x03, 0x07, 0x5b, 0x03, 0x02, 0x17, 0xfb, 0x07, 0x07, 0x06, 0xef, +0x46, 0xc4, 0xc4, 0xe0, 0xd7, 0x33, 0x28, 0x60, 0xc0, 0x40, 0x02, 0x70, +0xd0, 0x41, 0x0b, 0x70, 0xd0, 0x0b, 0x29, 0xe0, 0x40, 0x03, 0xad, 0xc0, +0x41, 0x07, 0xfd, 0xdf, 0x41, 0x07, 0xed, 0xff, 0x17, 0xf0, 0xa0, 0xff, +0xff, 0xf5, 0xa5, 0xff, 0xff, 0xfd, 0xf1, 0x0f, 0x46, 0xa9, 0xfe, 0xfd, +0xfd, 0xab, 0xfe, 0xdf, 0xdf, 0x8f, 0xfe, 0xdf, 0xdf, 0xab, 0xfe, 0xf7, +0xf7, 0x11, 0xfd, 0xbf, 0xbf, 0x2f, 0xad, 0xff, 0xff, 0xaf, 0x8f, 0xdf, +0xff, 0x9f, 0x9e, 0x9e, 0xfe, 0x3f, 0x9c, 0xcc, 0xfc, 0x0f, 0x0c, 0x08, +0xf4, 0x0f, 0x0c, 0x8a, 0xb4, 0x0d, 0x0a, 0x0a, 0xe5, 0x6f, 0x25, 0x72, +0xbe, 0x1e, 0xa9, 0xa6, 0x9a, 0x9a, 0xaa, 0x07, 0x2a, 0x92, 0xaa, 0x03, +0x2a, 0x96, 0xaf, 0x0b, 0x1a, 0x16, 0xae, 0x0a, 0x98, 0x5e, 0xac, 0x1a, +0x28, 0x54, 0x60, 0x55, 0x60, 0xe1, 0x57, 0x55, 0xf5, 0xe1, 0x01, 0x11, +0xf1, 0xe1, 0x21, 0x4d, 0xf5, 0xe1, 0x21, 0x4d, 0xf5, 0xe1, 0xe3, 0xe5, +0xe5, 0xe3, 0xe3, 0xe5, 0xe3, 0x63, 0xe1, 0x64, 0x63, 0xe3, 0xe1, 0xe7, +0xb9, 0x7e, 0x23, 0xa4, 0xa9, 0xa9, 0xa9, 0x61, 0x72, 0x52, 0x43, 0x53, +0x53, 0x33, 0x6b, 0x40, 0x22, 0xf0, 0x75, 0x3f, 0x82, 0xc4, 0xd5, 0x52, +0x01, 0xe9, 0x8e, 0xd7, 0x1b, 0xfb, 0x3a, 0x46, 0x54, 0x55, 0x35, 0x53, +0xd4, 0x54, 0x35, 0x55, 0x92, 0x8a, 0xa6, 0xaa, 0x5a, 0x8a, 0xa6, 0xaa, +0x2a, 0xc0, 0xae, 0xea, 0x2a, 0xc0, 0xff, 0xef, 0x2f, 0x40, 0xe9, 0xff, +0x3f, 0x40, 0xa9, 0xd6, 0xbf, 0x67, 0x0e, 0x00, 0x10, 0xb9, 0x7f, 0x4d, +0x50, 0x44, 0xdf, 0x7f, 0x1b, 0xa5, 0x20, 0xf8, 0xfe, 0xa7, 0x80, 0xb8, +0xff, 0xa7, 0xa6, 0xf7, 0xff, 0x87, 0xa6, 0xef, 0x3e, 0x0e, 0xa7, 0xeb, +0x3a, 0x22, 0x68, 0xb9, 0xd4, 0x14, 0x55, 0x57, 0x57, 0x5b, 0x55, 0x53, +0x57, 0x59, 0x5d, 0x51, 0x51, 0x51, 0x25, 0x34, 0x37, 0x34, 0x6b, 0x5d, +0x59, 0x55, 0x1d, 0x24, 0xfa, 0xc5, 0x67, 0x57, 0xaf, 0xae, 0xae, 0x0e, +0x92, 0xb8, 0x69, 0x14, 0x38, 0x68, 0x20, 0x7c, 0x70, 0x48, 0x20, 0x7c, +0x70, 0x40, 0x80, 0x7c, 0x72, 0x40, 0x00, 0xde, 0x07, 0xc5, 0x44, 0x54, +0x85, 0xcc, 0x0c, 0x74, 0x47, 0x4c, 0x4c, 0x54, 0x07, 0x2c, 0xcc, 0x56, +0x2f, 0xae, 0xae, 0x4e, 0xeb, 0xf5, 0x6f, 0xc7, 0x87, 0xfc, 0xef, 0x87, +0x8f, 0xa6, 0x80, 0xc8, 0x71, 0x37, 0x3d, 0xf4, 0x51, 0x13, 0x1d, 0xf8, +0x50, 0x02, 0x19, 0xf0, 0x40, 0x02, 0x0a, 0xd8, 0x80, 0x02, 0x4a, 0x98, +0x80, 0x02, 0x06, 0x9c, 0x02, 0x03, 0x06, 0x0d, 0x12, 0x18, 0x30, 0x50, +0x30, 0x18, 0x12, 0x14, 0x50, 0x18, 0x12, 0x0e, 0xc0, 0x50, 0x12, 0x06, +0xc0, 0x50, 0x14, 0x06, 0xe0, 0x30, 0x14, 0x04, 0x68, 0x30, 0x18, 0x14, +0x50, 0x30, 0x18, 0x12, 0xd6, 0x0a, 0x09, 0x0c, 0x18, 0x07, 0x09, 0x0c, +0x28, 0x01, 0x03, 0x0d, 0x28, 0x66, 0x95, 0x43, 0x28, 0xd2, 0xd2, 0x28, +0xac, 0xf4, 0xf5, 0xf5, 0x51, 0x9c, 0xfb, 0xfa, 0xfa, 0x58, 0xfa, 0xfa, +0xfa, 0x50, 0xfe, 0xf6, 0xfe, 0x4a, 0x0e, 0x6e, 0xf8, 0xfb, 0xff, 0x03, +0x1c, 0x8c, 0xff, 0xff, 0xbf, 0x1e, 0x1e, 0xbc, 0xc1, 0xef, 0xaf, 0xea, +0xbf, 0xaf, 0xaf, 0x6f, 0x9a, 0xa5, 0xa5, 0xe5, 0x7a, 0xa1, 0xa1, 0xe0, +0xba, 0xa2, 0xa1, 0xe0, 0xba, 0xba, 0x21, 0xa0, 0xba, 0x3f, 0x38, 0xa0, +0xfa, 0x3f, 0x30, 0xf4, 0x3b, 0xde, 0xa1, 0x81, 0xff, 0xd5, 0x01, 0xc1, +0xfd, 0xc1, 0x81, 0x00, 0xfe, 0xc1, 0xa9, 0x52, 0xff, 0xa1, 0xe9, 0x3a, +0xfe, 0xa1, 0xf1, 0x16, 0xfe, 0x21, 0xa2, 0x3e, 0xfe, 0x20, 0xa0, 0x86, +0x3e, 0x9c, 0x80, 0x80, 0xc0, 0x95, 0x90, 0x40, 0xc0, 0xd5, 0xc1, 0xbb, +0x40, 0x40, 0xc0, 0xea, 0x6a, 0x40, 0xc0, 0xc0, 0x6a, 0x40, 0x40, 0xc0, +0x7f, 0x00, 0x00, 0xca, 0x7f, 0x0a, 0x0a, 0x0a, 0xfc, 0x43, 0xc2, 0xd1, +0xfc, 0x83, 0xc1, 0x90, 0x40, 0x82, 0xc1, 0xd0, 0x00, 0x02, 0x83, 0x92, +0x00, 0x42, 0x83, 0xd3, 0x07, 0x41, 0xc3, 0xd3, 0x07, 0x05, 0x87, 0xdb, +0x33, 0x27, 0x27, 0x1b, 0xb3, 0x71, 0x72, 0x32, 0x33, 0x33, 0x33, 0x36, +0x36, 0x36, 0x36, 0x33, 0x33, 0x14, 0x54, 0x77, 0x77, 0x55, 0x15, 0x33, +0x73, 0xfa, 0x24, 0x15, 0x15, 0x01, 0x3c, 0x35, 0x35, 0x35, 0xbd, 0xc2, +0x47, 0xd7, 0xc3, 0xc3, 0xd7, 0x47, 0xc3, 0xe3, 0xd3, 0x83, 0x43, 0x83, +0xc2, 0xc3, 0x83, 0x92, 0xd2, 0xd3, 0x93, 0xd2, 0xd3, 0x57, 0x51, 0x08, +0xb4, 0x14, 0x15, 0xbf, 0x04, 0x2e, 0x0c, 0x94, 0x6d, 0x6d, 0x6d, 0xfd, +0x7f, 0x97, 0x9b, 0x94, 0xfe, 0x6f, 0x6d, 0x6d, 0xb1, 0x26, 0xab, 0x93, +0x16, 0x77, 0x62, 0xa8, 0x64, 0x0d, 0x0d, 0x0d, 0x6d, 0x1b, 0x09, 0x14, +0x58, 0x33, 0x08, 0x08, 0x48, 0x37, 0x28, 0x20, 0x00, 0xa5, 0xe1, 0x20, +0x00, 0x94, 0xe5, 0x20, 0xe0, 0x4d, 0xc2, 0x60, 0x30, 0x40, 0xdb, 0x71, +0x00, 0x00, 0xd9, 0x7b, 0x00, 0x00, 0xe9, 0x16, 0x00, 0x10, 0xe0, 0x06, +0x09, 0x60, 0x78, 0x10, 0xee, 0xd3, 0x5a, 0xf5, 0xa7, 0x26, 0x24, 0xb0, +0x40, 0x13, 0x6e, 0xc0, 0x40, 0x02, 0x77, 0xd0, 0x41, 0x0b, 0x1c, 0xf0, +0x41, 0x0f, 0x64, 0x18, 0x34, 0x0c, 0xed, 0x04, 0xe9, 0xa2, 0x09, 0x00, +0x90, 0xd6, 0x63, 0x60, 0xf0, 0xf6, 0x63, 0x60, 0x68, 0xf7, 0xe0, 0xe1, +0xe8, 0xeb, 0xe1, 0xe1, 0xeb, 0xe8, 0xe1, 0x60, 0x77, 0x68, 0xe0, 0xe3, +0x76, 0x70, 0xc0, 0x79, 0xd0, 0x02, 0x02, 0x70, 0xd0, 0x80, 0x02, 0x67, +0xe7, 0xd1, 0xc0, 0x80, 0x41, 0x92, 0xc0, 0x80, 0xfd, 0xd3, 0xc0, 0x41, +0xfe, 0x8b, 0x88, 0x49, 0xae, 0x8b, 0x89, 0x49, 0xae, 0x87, 0x55, 0x01, +0xc9, 0xb5, 0x55, 0x09, 0x29, 0xa9, 0x75, 0x49, 0x31, 0x91, 0x7d, 0x49, +0x31, 0xb1, 0xaf, 0x07, 0x9a, 0x9a, 0x6a, 0xaa, 0xa6, 0x5a, 0xaa, 0xaa, +0xa8, 0x55, 0xaa, 0xaa, 0x50, 0xa9, 0x52, 0x55, 0x7d, 0x78, 0x50, 0x55, +0x7d, 0x78, 0x50, 0x4d, 0xfb, 0x78, 0x50, 0x4d, 0x7b, 0x78, 0xd0, 0xd7, +0x4f, 0x50, 0xd2, 0xd7, 0x4f, 0x50, 0xd0, 0xcf, 0x4f, 0x53, 0x85, 0x87, +0x7f, 0xa6, 0xa9, 0xc2, 0xd3, 0xab, 0xaa, 0xc2, 0xc3, 0xab, 0xaa, 0x56, +0xa1, 0xaa, 0xaa, 0x56, 0xa9, 0x08, 0x74, 0xb8, 0x41, 0x03, 0x00, 0x18, +0x56, 0x19, 0x56, 0x1c, 0xf0, 0x33, 0x7e, 0x49, 0xb7, 0xae, 0xaf, 0x87, +0xaa, 0xaa, 0x5a, 0xa6, 0xa6, 0xa6, 0x52, 0xaa, 0xa6, 0xa6, 0xa9, 0xaa, +0x5f, 0xf7, 0xfe, 0xa8, 0xa6, 0xaa, 0xa9, 0x68, 0xa6, 0xaa, 0xaa, 0x5f, +0x03, 0x20, 0xdd, 0x9a, 0xa5, 0xaa, 0xaa, 0x01, 0x99, 0x9d, 0xab, 0x41, +0x3d, 0xa4, 0x56, 0x3e, 0xf0, 0x3b, 0xf4, 0x3f, 0x32, 0x33, 0xf2, 0xbf, +0x60, 0x27, 0xf8, 0xbf, 0x26, 0x29, 0xb0, 0xfa, 0xbb, 0x20, 0xb0, 0xfa, +0x6b, 0x60, 0x22, 0xf2, 0x6e, 0x70, 0x70, 0x70, 0xfa, 0x17, 0xb4, 0x5b, +0x30, 0xac, 0x1c, 0xad, 0xb6, 0x4f, 0xa8, 0x6d, 0xb3, 0xda, 0xea, 0xab, +0xb7, 0xba, 0xaa, 0xa6, 0xb6, 0xde, 0x3e, 0x4a, 0x8c, 0x49, 0x6c, 0x90, +0xc8, 0xd2, 0x0a, 0x49, 0x64, 0xd3, 0xc3, 0xab, 0xa6, 0xc1, 0xc3, 0xab, +0xa6, 0xe5, 0xeb, 0x2b, 0x24, 0xa8, 0xbe, 0xbe, 0x52, 0x42, 0xb1, 0xb2, +0x42, 0x42, 0xb9, 0x22, 0xa0, 0x3a, 0xa9, 0x62, 0xa0, 0x3a, 0x22, 0x26, +0xe8, 0x7e, 0x62, 0x22, 0xa2, 0xbb, 0x49, 0xf7, 0x77, 0x7e, 0x97, 0x22, +0xd5, 0xad, 0x62, 0x68, 0xad, 0x59, 0xd5, 0xd7, 0x2b, 0x28, 0xd4, 0xdb, +0x2b, 0x28, 0xd8, 0xdb, 0x6b, 0x28, 0xd8, 0xef, 0x9b, 0x29, 0xd9, 0xc3, +0x43, 0x69, 0xe9, 0x20, 0x7b, 0xb3, 0x5f, 0x36, 0x80, 0xc1, 0xdb, 0xbf, +0xc1, 0xcb, 0xde, 0x6f, 0x5f, 0x70, 0xb8, 0xaa, 0x2a, 0x75, 0xb8, 0xaa, +0x4a, 0x6d, 0x78, 0xf8, 0x5a, 0x50, 0x86, 0x06, 0x27, 0xc7, 0xc6, 0x26, +0x07, 0x87, 0xec, 0xc3, 0x83, 0x83, 0xae, 0x83, 0x82, 0x8e, 0xff, 0x99, +0x93, 0x87, 0xff, 0x81, 0xdf, 0xa1, 0xf7, 0xf7, 0xff, 0xa3, 0x25, 0x4a, +0x7b, 0xaa, 0xaa, 0xdd, 0xdd, 0xaa, 0xaa, 0xa5, 0x9a, 0x5f, 0x77, 0xb3, +0xf3, 0xad, 0xdd, 0xcb, 0xff, 0xa1, 0xdf, 0x81, 0xff, 0xa1, 0xc1, 0xe9, +0xf1, 0x01, 0x8d, 0xa9, 0xd5, 0xb7, 0x80, 0x86, 0x94, 0xe5, 0xc5, 0x67, +0x1a, 0x7a, 0x5e, 0x5f, 0xd3, 0x28, 0xfa, 0xdb, 0xfb, 0xa9, 0xf6, 0xe3, +0x12, 0xb9, 0x1f, 0x07, 0x01, 0x00, 0xd7, 0xff, 0xdf, 0x8d, 0x00, 0xb3, +0x0a, 0x30, 0x12, 0x06, 0x03, 0x68, 0x5a, 0xa7, 0xab, 0xec, 0x8d, 0x66, +0x01, 0x8c, 0xa7, 0x57, 0x1c, 0xf6, 0xec, 0xa3, 0x59, 0x2e, 0x4b, 0x4c, +0x78, 0x30, 0xf9, 0x36, 0x30, 0xb0, 0x69, 0x09, 0x7b, 0x56, 0x70, 0x78, +0x4c, 0x4b, 0x16, 0x20, 0x70, 0xbe, 0x5f, 0x16, 0x01, 0x41, 0x9c, 0x81, +0xcd, 0xe3, 0xae, 0xe3, 0xf8, 0xc7, 0xdc, 0x45, 0x44, 0xca, 0x95, 0xe7, +0xbe, 0xfe, 0xf7, 0x94, 0x81, 0x46, 0x55, 0xdf, 0x81, 0xa5, 0x24, 0xf2, +0x40, 0xa3, 0x3b, 0xa9, 0x17, 0x60, 0x30, 0x5b, 0x4f, 0x9e, 0xac, 0x53, +0x90, 0x50, 0xd7, 0x3c, 0x32, 0xe6, 0x61, 0x40, 0x7a, 0x16, 0x24, 0x24, +0x14, 0xc8, 0xbb, 0x60, 0x63, 0x6b, 0x12, 0x06, 0x2a, 0xff, 0x21, 0x8f, +0xe5, 0xa1, 0x97, 0x5e, 0xaf, 0xa9, 0xc5, 0x82, 0x9b, 0x01, 0x21, 0x26, +0xe8, 0x63, 0x3d, 0x76, 0x6e, 0xe0, 0xdc, 0xdf, 0xef, 0x2f, 0x78, 0x44, +0x21, 0x76, 0x9d, 0x05, 0xf8, 0x7e, 0xff, 0x7f, 0x1e, 0xf7, 0x9c, 0x7b, +0xce, 0x7d, 0x4c, 0x27, 0xf7, 0xce, 0xcd, 0x64, 0x92, 0x4c, 0xf3, 0x10, +0xc9, 0x90, 0x82, 0x8d, 0x9a, 0x40, 0x68, 0x6b, 0x35, 0x41, 0x97, 0x6e, +0x04, 0x51, 0xf0, 0x01, 0x22, 0x08, 0x8a, 0x15, 0x5c, 0xd8, 0xb5, 0xba, +0x51, 0xe8, 0xc2, 0x95, 0x08, 0x82, 0xa8, 0x2b, 0x57, 0xe2, 0xa6, 0x28, +0x48, 0x22, 0x82, 0x15, 0xc4, 0x9d, 0x4b, 0x11, 0x74, 0xe7, 0x56, 0x17, +0x0a, 0x6e, 0xc4, 0x85, 0x74, 0x21, 0x08, 0x2e, 0xc4, 0x45, 0x77, 0x06, +0x95, 0x76, 0xa5, 0x88, 0x42, 0x69, 0x53, 0x1a, 0x28, 0x84, 0x74, 0x42, +0xa7, 0x8f, 0xa4, 0x8b, 0xb4, 0x79, 0xf4, 0x31, 0x73, 0xe7, 0xf4, 0xde, +0x3b, 0x73, 0xce, 0x3d, 0x8f, 0xff, 0xfc, 0xff, 0xff, 0xa5, 0x12, 0xef, +0x68, 0xf9, 0xff, 0xbc, 0x9e, 0x4f, 0xfd, 0x76, 0x73, 0x58, 0x72, 0x8a, +0x14, 0xeb, 0x10, 0x83, 0xb0, 0xb4, 0xb1, 0x2e, 0x20, 0x52, 0x72, 0x28, +0x2b, 0x96, 0x48, 0x72, 0xca, 0x21, 0x29, 0x21, 0x39, 0xe4, 0x02, 0x2a, +0xcd, 0x92, 0x18, 0xa7, 0x88, 0x14, 0xab, 0x14, 0xd6, 0x39, 0xa7, 0xdc, +0x41, 0x91, 0x2b, 0x48, 0x48, 0xda, 0x58, 0x2d, 0x22, 0xe4, 0x32, 0x12, +0xb9, 0x88, 0x5c, 0x40, 0x8e, 0x39, 0xa4, 0xc2, 0x3a, 0xe6, 0x0a, 0xa2, +0x84, 0xc8, 0xb9, 0x48, 0x8e, 0x39, 0xa5, 0x9c, 0x42, 0x92, 0x90, 0x96, +0x95, 0x90, 0x4b, 0x58, 0xca, 0xa9, 0x25, 0xe7, 0xb2, 0x48, 0x83, 0xc4, +0x8c, 0x35, 0xb6, 0xf0, 0x07, 0x33, 0xc8, 0x31, 0x2d, 0x7f, 0x50, 0x9a, +0xc1, 0x24, 0xb6, 0x26, 0xcc, 0x18, 0x63, 0x1c, 0xd7, 0x1d, 0x74, 0x40, +0xe4, 0x6e, 0xca, 0x31, 0xa7, 0x94, 0x0b, 0x19, 0xb9, 0x81, 0x59, 0x57, +0x50, 0x2e, 0x20, 0xac, 0x3b, 0x08, 0x7f, 0x84, 0xc8, 0x35, 0x94, 0x7b, +0xc8, 0x8d, 0x4c, 0xe3, 0x42, 0x72, 0x05, 0xb9, 0x82, 0x32, 0x83, 0x19, +0x23, 0xe7, 0xe4, 0x1a, 0x9a, 0x11, 0x8d, 0x4b, 0x18, 0x57, 0x31, 0xce, +0xe3, 0xbe, 0x46, 0x33, 0xae, 0x66, 0x5c, 0x41, 0xb9, 0x8a, 0x21, 0x39, +0x4c, 0xee, 0x62, 0xc6, 0xb8, 0x82, 0x86, 0x71, 0x1a, 0xd7, 0x30, 0x72, +0x07, 0x33, 0x8e, 0xc3, 0x60, 0x98, 0xc7, 0xe3, 0xf5, 0x7c, 0xbd, 0xde, +0xa7, 0xef, 0xf7, 0xfb, 0xfb, 0xfc, 0xbe, 0x9f, 0xcf, 0xef, 0xfb, 0xfb, +0xfd, 0xf6, 0xf7, 0xdb, 0xdf, 0xfe, 0xbe, 0xbf, 0xdf, 0x6f, 0x7f, 0xdf, +0xdf, 0xfe, 0x2e, 0xe0, 0xbb, 0xfb, 0xfb, 0xfd, 0xbe, 0xbf, 0xdf, 0x6f, +0x7f, 0x87, 0x27, 0x0f, 0xf0, 0x00, 0x40, 0x1b, 0x84, 0x81, 0xe0, 0x7d, +0x12, 0x63, 0x62, 0xde, 0x56, 0xac, 0xfa, 0xd3, 0x30, 0xd7, 0x39, 0x28, +0x5d, 0x2b, 0xa5, 0x88, 0x93, 0x8c, 0x00, 0x01, 0xe1, 0x74, 0xb6, 0x74, +0x72, 0x04, 0x5e, 0xac, 0xa1, 0x36, 0x3b, 0x39, 0x77, 0x65, 0xaf, 0x3a, +0x95, 0xe8, 0xc6, 0x0a, 0x07, 0x28, 0x11, 0x98, 0x1a, 0x24, 0x4e, 0xa1, +0x4e, 0x06, 0xa3, 0x4f, 0x76, 0x72, 0xbc, 0xc8, 0x1a, 0x0f, 0x5d, 0x89, +0xd6, 0x10, 0x54, 0x50, 0x41, 0x85, 0x9c, 0x8d, 0x5a, 0xf5, 0x47, 0xf8, +0xd8, 0x31, 0x31, 0xd5, 0x18, 0x5e, 0x1c, 0xfe, 0x08, 0x62, 0x13, 0x25, +0x5e, 0x8a, 0x57, 0x7c, 0xa1, 0x78, 0x6a, 0x17, 0xd2, 0x75, 0xdc, 0xcc, +0x45, 0x3f, 0xac, 0x73, 0x3d, 0xed, 0x49, 0xa4, 0xe6, 0xa4, 0x5f, 0x3f, +0xc6, 0xb9, 0x8e, 0xbd, 0x6c, 0xcf, 0xce, 0x9f, 0xe6, 0x47, 0xd8, 0xe9, +0xc4, 0xba, 0x92, 0xb1, 0x94, 0x79, 0xb2, 0x3f, 0x9c, 0xfa, 0x0f, 0xf4, +0x2b, 0xc7, 0x87, 0x68, 0xfd, 0x9c, 0x61, 0x38, 0x68, 0xbc, 0xa0, 0xdd, +0xf2, 0x8f, 0x92, 0xef, 0xd5, 0x73, 0x3b, 0xb4, 0x74, 0xa4, 0xe7, 0x60, +0x46, 0x3a, 0x02, 0x9b, 0xc8, 0x01, 0x43, 0x86, 0x2b, 0xba, 0xaa, 0xef, +0x7d, 0xe5, 0x2b, 0x42, 0xc0, 0x1e, 0x4e, 0xdb, 0xa8, 0x93, 0xf0, 0x10, +0x4b, 0x51, 0x23, 0x86, 0xd7, 0x83, 0x34, 0x53, 0x20, 0xae, 0xfe, 0xde, +0x7b, 0x9e, 0xcc, 0x0c, 0x16, 0x48, 0x41, 0x1f, 0xc6, 0x90, 0xc6, 0x90, +0xc6, 0x90, 0x99, 0x81, 0xc9, 0x48, 0xde, 0xca, 0x8e, 0xe3, 0x83, 0x2f, +0xaf, 0x0e, 0xef, 0x19, 0x98, 0x19, 0xab, 0xb0, 0xd6, 0x47, 0xd6, 0x40, +0xed, 0x5d, 0x88, 0x11, 0xe2, 0x80, 0x87, 0x5e, 0x89, 0xfd, 0x19, 0x5e, +0x61, 0x72, 0x49, 0xba, 0xd9, 0xbd, 0xa9, 0x98, 0xdd, 0xaf, 0xda, 0xac, +0xb0, 0xb9, 0xec, 0x40, 0x2c, 0x06, 0xc4, 0x62, 0x40, 0x2c, 0x86, 0x85, +0x7e, 0x25, 0x7f, 0xe5, 0x03, 0xb1, 0x91, 0x50, 0x7b, 0x01, 0xac, 0xcb, +0x5b, 0xdf, 0x8a, 0x8d, 0x3c, 0xc8, 0x25, 0x56, 0xe7, 0xd7, 0x87, 0x31, +0x82, 0xb0, 0x5b, 0x3d, 0x1e, 0xc2, 0x2d, 0x86, 0x00, 0xe1, 0x29, 0xaa, +0xc3, 0x83, 0x5d, 0x3b, 0x6c, 0x79, 0x1b, 0xef, 0xce, 0x4d, 0x91, 0xf7, +0xef, 0x28, 0xb4, 0x39, 0xc7, 0x1f, 0xe8, 0x25, 0x07, 0x38, 0x5c, 0xda, +0x1d, 0x02, 0x53, 0x83, 0xa7, 0x3f, 0x72, 0xb9, 0xc9, 0x18, 0xd5, 0x51, +0x41, 0x75, 0xd7, 0x83, 0xa5, 0x5d, 0xf9, 0xf8, 0x2b, 0x0b, 0xec, 0x76, +0x55, 0xd0, 0x46, 0xc0, 0x87, 0x2b, 0xb9, 0xcd, 0x2f, 0x4e, 0xf3, 0x5d, +0xa3, 0xb8, 0xa1, 0xf7, 0x2f, 0x06, 0x30, 0x29, 0x7d, 0x51, 0x1d, 0x1e, +0x44, 0x05, 0xa2, 0x3a, 0x3c, 0xdc, 0xb1, 0x60, 0x06, 0xdb, 0xff, 0x17, +0x0f, 0xdf, 0xb2, 0xfd, 0xd4, 0x94, 0x7d, 0xf1, 0xbf, 0x7c, 0x26, 0xa7, +0x32, 0xb0, 0x92, 0x34, 0x28, 0xcf, 0x88, 0x86, 0x1a, 0xef, 0x36, 0xac, +0xcf, 0x0f, 0x6c, 0x4c, 0xbd, 0x35, 0x04, 0xd5, 0x89, 0x35, 0xfe, 0x3b, +0x1a, 0xbc, 0xd5, 0x1f, 0x8d, 0xd9, 0x9e, 0x1c, 0x7c, 0x8a, 0xb2, 0x60, +0x6f, 0xc5, 0x4d, 0xcb, 0x39, 0xee, 0xf1, 0xeb, 0xcd, 0x53, 0x3a, 0xd6, +0x8f, 0x6c, 0x6a, 0x3c, 0xec, 0xd6, 0x1a, 0x1f, 0xf2, 0x05, 0x42, 0x54, +0xc6, 0xc7, 0x57, 0xb9, 0x83, 0x63, 0x71, 0xeb, 0xe6, 0xe4, 0xe6, 0x6e, +0x70, 0x3f, 0xf6, 0x34, 0x00, 0x55, 0xc7, 0xd5, 0x9c, 0x0a, 0xc7, 0x46, +0x22, 0x46, 0x65, 0x2a, 0xa8, 0x9c, 0x0a, 0x5e, 0xdd, 0xa7, 0xc7, 0x7b, +0x6e, 0x18, 0xa6, 0xb0, 0xa1, 0x3a, 0x11, 0xcb, 0x95, 0x79, 0x1e, 0x17, +0xb0, 0x7f, 0x34, 0xb0, 0xe7, 0xa9, 0x6e, 0xdf, 0x1c, 0x30, 0x85, 0x2f, +0x2a, 0xe3, 0x43, 0x54, 0x20, 0x2a, 0xe3, 0xa3, 0xb0, 0xcc, 0x40, 0xf9, +0xc7, 0x8d, 0x27, 0xb4, 0xb9, 0x39, 0xbf, 0xb9, 0x10, 0xb5, 0x88, 0x11, +0x2e, 0xc4, 0x7c, 0xe7, 0x06, 0x75, 0xc5, 0xc2, 0x9e, 0x14, 0xd0, 0x5a, +0x08, 0x50, 0x39, 0x55, 0x18, 0xab, 0xf4, 0xc1, 0xa7, 0x8f, 0xf9, 0xbf, +0x19, 0x09, 0xb5, 0x10, 0xa5, 0x70, 0x08, 0x1f, 0x78, 0xce, 0x39, 0xec, +0x36, 0xca, 0xcb, 0x90, 0x94, 0x5a, 0x05, 0x41, 0x30, 0x5a, 0x00, 0x81, +0xbe, 0x40, 0x3d, 0x79, 0x09, 0xa0, 0x1a, 0x60, 0x70, 0x41, 0x65, 0x83, +0xdb, 0xcf, 0x78, 0xdb, 0xfd, 0xf5, 0xd1, 0xca, 0x0f, 0x7f, 0x1b, 0x14, +0x90, 0x16, 0xc8, 0x03, 0x4c, 0x5a, 0x1c, 0xf0, 0xf2, 0x68, 0x4f, 0x42, +0x78, 0xe2, 0xb4, 0xa0, 0x36, 0x54, 0x63, 0x41, 0x58, 0x4f, 0x3e, 0xe1, +0xfe, 0xa5, 0xb5, 0xfb, 0x2b, 0x54, 0xa5, 0x3d, 0xd1, 0xfa, 0x51, 0xd0, +0x2e, 0x5f, 0xf8, 0xb7, 0x63, 0x1e, 0xc2, 0xc2, 0x32, 0x85, 0x95, 0x10, +0xd5, 0x20, 0x6a, 0x83, 0x17, 0x51, 0x0d, 0x50, 0x58, 0xa6, 0xb0, 0xf2, +0xa4, 0x77, 0x8b, 0x84, 0xb7, 0x74, 0xc7, 0x02, 0xfb, 0xb6, 0x6d, 0x02, +0x95, 0x8e, 0x18, 0x3e, 0xfb, 0xb3, 0xab, 0x27, 0x9e, 0x30, 0xd5, 0x93, +0x02, 0x42, 0xd5, 0x9e, 0x50, 0x4f, 0x54, 0x13, 0x78, 0x12, 0x8b, 0xf9, +0xf2, 0xf1, 0x9d, 0xb1, 0xb2, 0x79, 0xaa, 0x64, 0xe2, 0x0c, 0xe0, 0x26, +0xa3, 0xfe, 0x24, 0x2c, 0x79, 0x02, 0x31, 0x84, 0x52, 0x31, 0xb5, 0xfd, +0x88, 0x47, 0xbf, 0x8d, 0x85, 0x13, 0x7c, 0xc3, 0x3d, 0x33, 0x6c, 0x39, +0xcc, 0xed, 0x22, 0xcb, 0xa8, 0x28, 0x9f, 0xab, 0x65, 0x86, 0x1e, 0x93, +0x0b, 0x26, 0x58, 0x8c, 0x71, 0x9d, 0x93, 0x11, 0x33, 0x18, 0x9a, 0x38, +0x00, 0x3f, 0x5c, 0x84, 0x84, 0x75, 0xf5, 0x78, 0x18, 0xe2, 0x52, 0x31, +0x90, 0x10, 0x60, 0xf7, 0xe0, 0xa9, 0xf0, 0x2f, 0x98, 0x41, 0x79, 0x42, +0xc8, 0x72, 0xf0, 0xec, 0x00, 0xe5, 0x49, 0xfb, 0x42, 0x64, 0xc0, 0x97, +0x54, 0x8f, 0x19, 0xa9, 0xf1, 0x6f, 0xe4, 0x4d, 0x04, 0xdf, 0x75, 0x2d, +0x24, 0x4c, 0xc8, 0x10, 0x48, 0x48, 0x42, 0x44, 0x44, 0xa8, 0x65, 0x06, +0x80, 0x54, 0x21, 0x70, 0xe8, 0x0f, 0x97, 0x4e, 0xb0, 0x92, 0x27, 0x07, +0x94, 0x49, 0xab, 0x04, 0x97, 0x78, 0x6a, 0x1b, 0xc8, 0x10, 0xa0, 0x08, +0x99, 0x22, 0x3c, 0x97, 0x6f, 0x9a, 0x7d, 0x4a, 0x70, 0x90, 0x30, 0x68, +0x32, 0x6c, 0xe3, 0xe5, 0x3c, 0x0f, 0xef, 0xcd, 0x68, 0xac, 0x34, 0x96, +0x8b, 0x1f, 0x9b, 0x8c, 0x86, 0xb6, 0xb1, 0xa1, 0x8c, 0x15, 0xd5, 0xe1, +0xa1, 0xc8, 0x40, 0x8a, 0x40, 0x86, 0x00, 0xed, 0x4a, 0x42, 0x3c, 0xdd, +0x7d, 0xda, 0xba, 0x80, 0x27, 0x53, 0x90, 0x53, 0x6c, 0x92, 0x59, 0xd4, +0x02, 0x9e, 0x10, 0x51, 0x92, 0x8b, 0x79, 0x24, 0x6d, 0x82, 0x19, 0x26, +0xc8, 0x19, 0xea, 0x30, 0x0c, 0x69, 0x69, 0x12, 0x48, 0x18, 0x11, 0x11, +0x6a, 0x99, 0x14, 0x58, 0xdf, 0x17, 0xc2, 0x7d, 0xb2, 0x75, 0xfe, 0xf4, +0x7a, 0x12, 0x36, 0xf1, 0x57, 0x39, 0xb4, 0xb1, 0x54, 0xa5, 0x06, 0x58, +0x33, 0x84, 0x7e, 0x25, 0xa9, 0xed, 0x77, 0x0c, 0xfc, 0x16, 0x6c, 0x63, +0x79, 0x34, 0xb1, 0x26, 0x2d, 0xc2, 0x28, 0xf6, 0x06, 0x76, 0xbf, 0xdf, +0xc2, 0x20, 0xde, 0x22, 0x84, 0xb4, 0x11, 0x80, 0xc3, 0x38, 0x85, 0xad, +0x30, 0xc2, 0xb6, 0x4d, 0x0b, 0xb4, 0xd2, 0xc0, 0xca, 0x1a, 0xa8, 0xd6, +0xc3, 0x10, 0x8f, 0x57, 0x61, 0x20, 0x43, 0x80, 0xf3, 0x38, 0xe7, 0xfa, +0x97, 0x87, 0x6f, 0x83, 0xf1, 0x85, 0xc8, 0x78, 0x32, 0x4a, 0x52, 0xcc, +0x17, 0x26, 0x20, 0x74, 0x3e, 0x84, 0x07, 0x2c, 0x11, 0x8f, 0xb5, 0x23, +0x3f, 0xb4, 0x96, 0x08, 0x69, 0x60, 0x2d, 0x8d, 0xb5, 0x86, 0x6a, 0xe3, +0x00, 0xe2, 0x86, 0x40, 0x1c, 0xc4, 0x93, 0xc6, 0x63, 0xbe, 0x84, 0x87, +0xee, 0x91, 0x2f, 0xff, 0x7d, 0x86, 0x8a, 0xf9, 0x08, 0x8b, 0x38, 0x53, +0xd8, 0xc6, 0x47, 0x23, 0xdc, 0x3f, 0x1a, 0x63, 0x83, 0xf8, 0x99, 0xef, +0xce, 0x45, 0x9b, 0x26, 0x0c, 0x1b, 0x2b, 0x6d, 0x60, 0x05, 0x1a, 0x84, +0x0d, 0x6d, 0x03, 0x23, 0x43, 0xb4, 0xf4, 0x50, 0xc4, 0x91, 0xc2, 0x89, +0x0a, 0x8a, 0x90, 0xcf, 0x3e, 0xd1, 0x28, 0xe6, 0x0b, 0xc5, 0x15, 0xf7, +0xd3, 0x66, 0xa4, 0xc4, 0x7c, 0x61, 0x52, 0x22, 0xf4, 0x8c, 0x47, 0x24, +0x84, 0x49, 0xe1, 0xfe, 0xb8, 0x85, 0x33, 0xa1, 0xb5, 0x0e, 0xa0, 0x83, +0x81, 0xa1, 0x96, 0x49, 0xf1, 0xd0, 0x33, 0x04, 0x9c, 0xe5, 0xa6, 0x6e, +0x66, 0x3c, 0x6c, 0x65, 0xe7, 0x34, 0xcc, 0x9e, 0xaa, 0x17, 0x54, 0x36, +0x92, 0x27, 0x10, 0x43, 0x86, 0xa9, 0xe8, 0x5a, 0x4d, 0x04, 0xee, 0x08, +0x58, 0x02, 0x86, 0x00, 0x49, 0x90, 0x04, 0x49, 0x90, 0x04, 0x49, 0x90, +0x04, 0x49, 0x90, 0x04, 0x49, 0x90, 0x04, 0x49, 0x90, 0x04, 0x49, 0x90, +0x04, 0x87, 0x84, 0xa9, 0x68, 0xe5, 0x0c, 0xc4, 0x10, 0xb2, 0x43, 0x76, +0xf2, 0x6d, 0x93, 0xce, 0x16, 0x75, 0x16, 0xf6, 0x9e, 0x7d, 0xa1, 0x1f, +0x5a, 0xc3, 0xe1, 0x80, 0x10, 0x63, 0x69, 0x40, 0x92, 0x24, 0x49, 0x92, +0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x8b, 0xc1, 0xd0, 0x5a, 0x43, +0xe4, 0x04, 0x81, 0xd7, 0x66, 0xff, 0x82, 0x06, 0x46, 0xb9, 0x46, 0x4c, +0x61, 0x25, 0x04, 0x28, 0x22, 0xa6, 0x30, 0x8d, 0xb1, 0xee, 0x68, 0x40, +0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x0b, +0xe7, 0x52, 0x63, 0x25, 0x04, 0x28, 0x9c, 0xac, 0xf8, 0x3a, 0xa2, 0x82, +0x6f, 0xeb, 0x06, 0xd6, 0x0b, 0xac, 0x61, 0xc2, 0x1a, 0x81, 0x07, 0x01, +0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x0c, +0x3d, 0xf1, 0x0c, 0x01, 0x6b, 0x4d, 0x7d, 0x47, 0x40, 0x80, 0xe1, 0x68, +0x0e, 0xcb, 0xaf, 0x24, 0x92, 0x27, 0x10, 0x43, 0x42, 0x2a, 0xba, 0x30, +0x9f, 0x08, 0xb7, 0x85, 0x61, 0x60, 0xcd, 0x36, 0x10, 0x06, 0xc4, 0x36, +0x11, 0x06, 0xc4, 0x36, 0x11, 0x06, 0xc4, 0x36, 0x11, 0x06, 0xc4, 0x36, +0x11, 0x06, 0xc4, 0x36, 0x11, 0x06, 0xc4, 0x36, 0x11, 0x06, 0xc4, 0x36, +0x31, 0x24, 0x4c, 0x45, 0x2b, 0x4f, 0x20, 0x86, 0x90, 0x7b, 0xc8, 0x56, +0x29, 0x04, 0x42, 0x40, 0x06, 0x08, 0x6d, 0xe4, 0x09, 0x11, 0xc2, 0xd0, +0x01, 0xce, 0x00, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, +0x04, 0x41, 0x58, 0x10, 0xce, 0x13, 0xc2, 0x81, 0x18, 0x9d, 0x50, 0xc0, +0x33, 0x63, 0x52, 0xba, 0xb0, 0x2c, 0x04, 0x28, 0x1c, 0x53, 0x38, 0x01, +0xee, 0x84, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, 0x04, +0x41, 0x10, 0x85, 0x63, 0x0a, 0x17, 0x6e, 0x56, 0xa2, 0x70, 0xe8, 0x20, +0x9b, 0x16, 0x15, 0x66, 0x11, 0x23, 0xe7, 0xfb, 0x42, 0x24, 0x0c, 0x7d, +0x5f, 0x0c, 0x0d, 0x09, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, +0x08, 0x82, 0x08, 0x0d, 0x7d, 0x43, 0xc0, 0x12, 0xd9, 0xe6, 0x5a, 0x13, +0xe8, 0xcb, 0xc8, 0x09, 0x7b, 0x95, 0x24, 0x24, 0x04, 0x18, 0x02, 0xa9, +0x18, 0x06, 0x4d, 0x65, 0x20, 0xec, 0x05, 0xc2, 0xcb, 0x86, 0x68, 0x80, +0xb0, 0x00, 0x6c, 0x7b, 0x02, 0x31, 0x84, 0xa6, 0x62, 0x28, 0x43, 0x80, +0x21, 0x64, 0x87, 0x7a, 0xbf, 0x03, 0x84, 0x80, 0x5c, 0x63, 0x21, 0x8c, +0xa8, 0x88, 0x40, 0x44, 0x54, 0xa6, 0xb2, 0x21, 0x10, 0x81, 0x88, 0x94, +0x22, 0x00, 0x78, 0x5d, 0xc3, 0x7d, 0xa7, 0x28, 0x46, 0x3b, 0xaf, 0x4c, +0x11, 0x89, 0x0a, 0x8a, 0x88, 0x29, 0x22, 0x51, 0x19, 0x10, 0x20, 0x2a, +0x03, 0x02, 0x64, 0x08, 0x50, 0x44, 0x4c, 0x11, 0x49, 0x89, 0x22, 0xc2, +0x0a, 0xaf, 0x75, 0x60, 0x9c, 0x12, 0x2b, 0xcc, 0xf2, 0x3b, 0x23, 0x4f, +0x7c, 0xa5, 0x80, 0x10, 0xa1, 0x06, 0x5f, 0xa8, 0x95, 0x21, 0x60, 0x85, +0xbe, 0x2f, 0x84, 0x31, 0xcc, 0xae, 0xc4, 0x6e, 0x45, 0x30, 0xc2, 0x52, +0x9c, 0xa2, 0xec, 0xf4, 0xdc, 0x0b, 0x65, 0x08, 0x30, 0x04, 0x52, 0x31, +0x10, 0x95, 0x01, 0x01, 0xf2, 0x04, 0x6a, 0x05, 0x02, 0xe4, 0x09, 0xc4, +0x10, 0x78, 0x95, 0x04, 0x12, 0x02, 0x0c, 0x81, 0x6c, 0xb8, 0x0a, 0x73, +0x1a, 0xac, 0x10, 0x70, 0xe7, 0x6e, 0x09, 0xc8, 0xc8, 0x13, 0x22, 0x02, +0x11, 0x51, 0x99, 0xca, 0x42, 0x20, 0x02, 0x11, 0x29, 0x45, 0x00, 0x5e, +0xd5, 0x46, 0x54, 0x68, 0x5f, 0x46, 0x4f, 0x7b, 0x9f, 0x91, 0x84, 0x00, +0x45, 0xc4, 0x14, 0x91, 0xa8, 0x0c, 0x08, 0x10, 0x95, 0x01, 0x01, 0x12, +0x02, 0x14, 0x11, 0x53, 0x44, 0x52, 0xe2, 0x2c, 0xc2, 0xc3, 0xa7, 0x89, +0x44, 0x45, 0xf8, 0x49, 0xd6, 0xf8, 0xbe, 0x10, 0x56, 0xe8, 0x53, 0xd9, +0x1a, 0x6a, 0xe5, 0x0b, 0x61, 0xad, 0xf1, 0x0d, 0x01, 0xcb, 0x4d, 0x58, +0x34, 0x11, 0x1e, 0x40, 0xce, 0xc7, 0x2a, 0x5c, 0xdd, 0x4f, 0xcc, 0xe1, +0x05, 0xf2, 0x05, 0x62, 0x08, 0xbc, 0x4a, 0x82, 0x60, 0x84, 0x00, 0x61, +0x97, 0x27, 0x10, 0xe1, 0x0e, 0x21, 0x2a, 0x81, 0x04, 0x12, 0xa6, 0x04, +0x12, 0x52, 0xc2, 0xe3, 0x0c, 0x81, 0x57, 0x49, 0x20, 0x21, 0xc0, 0x41, +0x20, 0x5e, 0xf9, 0xd0, 0x4a, 0x50, 0x6f, 0x88, 0x27, 0x5d, 0x89, 0x80, +0x27, 0x89, 0x3c, 0x21, 0x22, 0x10, 0x91, 0x10, 0xa0, 0x42, 0xa8, 0x12, +0x81, 0x88, 0x94, 0xa2, 0x27, 0x27, 0xa2, 0x56, 0x88, 0x88, 0x67, 0x07, +0xc4, 0xcf, 0xed, 0x60, 0x4f, 0x4a, 0x42, 0x80, 0x22, 0x62, 0x8a, 0x48, +0x42, 0x00, 0x51, 0x81, 0x84, 0xa8, 0x08, 0x21, 0x84, 0x10, 0x45, 0xc4, +0x14, 0x91, 0x94, 0xd8, 0x5c, 0xf9, 0x83, 0x41, 0x9f, 0x60, 0xaf, 0x83, +0x11, 0x02, 0x62, 0x81, 0x43, 0xab, 0xee, 0x58, 0x08, 0x58, 0x6b, 0x7c, +0x43, 0xc0, 0x17, 0x42, 0xa8, 0x62, 0xad, 0xf1, 0x0d, 0x81, 0xcb, 0x57, +0xe0, 0x19, 0x72, 0xe6, 0x7d, 0x11, 0xf1, 0x53, 0x1c, 0xc1, 0x67, 0x1e, +0x3b, 0xb1, 0xbf, 0x5a, 0x8f, 0x81, 0x18, 0x02, 0xa9, 0x18, 0x4a, 0x08, +0x20, 0x4f, 0x20, 0xe4, 0x09, 0xd4, 0x41, 0x08, 0x21, 0x84, 0x18, 0x42, +0xaf, 0x92, 0x50, 0xc2, 0x09, 0xf3, 0x5b, 0xf9, 0xfa, 0x7c, 0x28, 0x2d, +0x57, 0xd1, 0x7a, 0x08, 0x15, 0x5d, 0x12, 0x74, 0x1f, 0xe8, 0x09, 0x23, +0x10, 0x46, 0x08, 0x50, 0x61, 0xa8, 0xe2, 0x40, 0x08, 0xb0, 0xa7, 0xd1, +0xe2, 0xdd, 0x0d, 0xd0, 0x1e, 0x67, 0x28, 0x25, 0x0e, 0x65, 0x79, 0x37, +0x1f, 0xf8, 0x12, 0xcd, 0x85, 0x85, 0x93, 0x94, 0x4e, 0x42, 0x00, 0x51, +0x81, 0x84, 0xa8, 0x08, 0x21, 0x84, 0x10, 0x85, 0x63, 0x0a, 0x37, 0x00, +0xb6, 0xe3, 0xec, 0xfe, 0xb9, 0xab, 0x83, 0xab, 0x1c, 0x8c, 0x10, 0xd5, +0x22, 0xd3, 0x5f, 0xf6, 0x1f, 0xe9, 0xae, 0x8b, 0x95, 0x20, 0x72, 0xbe, +0x92, 0x2f, 0x84, 0x50, 0xc5, 0x5a, 0xe3, 0x9b, 0x1d, 0xd7, 0xc8, 0xe6, +0x12, 0x5a, 0x96, 0xf3, 0x85, 0xaa, 0xc5, 0xcd, 0x11, 0xcd, 0x85, 0xcf, +0x6f, 0x6d, 0xcc, 0x43, 0xe0, 0x55, 0x12, 0x4a, 0x08, 0x20, 0x4f, 0x20, +0x24, 0x44, 0x45, 0x08, 0x21, 0x84, 0x18, 0x42, 0xaf, 0x92, 0x70, 0x7c, +0x53, 0xbe, 0x77, 0x7d, 0xb9, 0x29, 0x2c, 0xaf, 0x8c, 0xd8, 0x7a, 0x08, +0xd1, 0xe2, 0xfa, 0x65, 0xc8, 0xff, 0x07, 0xff, 0xc4, 0x0e, 0xc2, 0x88, +0x0a, 0x2a, 0x84, 0x2a, 0x06, 0x86, 0xee, 0xe8, 0x53, 0x8c, 0x00, 0x67, +0x77, 0x2f, 0x09, 0xd5, 0x09, 0xba, 0xcb, 0x17, 0xff, 0x27, 0x69, 0xf0, +0xf6, 0x1b, 0x2f, 0x5d, 0xee, 0xd1, 0xc8, 0x10, 0x40, 0x54, 0x20, 0x21, +0x2a, 0x42, 0x08, 0x21, 0x44, 0xe1, 0x68, 0x57, 0xf7, 0x71, 0xf9, 0x21, +0xc7, 0x03, 0xf5, 0x61, 0xe9, 0x0c, 0xe9, 0x92, 0x40, 0xf5, 0x70, 0x3d, +0x4f, 0x65, 0xb9, 0xa2, 0x4b, 0xb3, 0x81, 0xaf, 0xe4, 0x0b, 0x21, 0x54, +0x89, 0xac, 0x78, 0x71, 0xb3, 0xd9, 0xfb, 0xe8, 0xa4, 0xbb, 0x79, 0x85, +0x5a, 0x09, 0xf8, 0x7d, 0x72, 0xe9, 0xe3, 0xaf, 0x32, 0x68, 0xd8, 0xf8, +0x23, 0x0f, 0xd5, 0xfb, 0x55, 0x98, 0x5c, 0x79, 0x41, 0x0c, 0xa4, 0x62, +0x10, 0x03, 0x54, 0x08, 0x62, 0x80, 0x0a, 0x41, 0x0c, 0x50, 0x21, 0x88, +0x01, 0x2a, 0x04, 0x31, 0x40, 0x85, 0x20, 0x06, 0xa8, 0x10, 0xc4, 0x00, +0x11, 0x81, 0xdd, 0xbd, 0xfb, 0xb8, 0x81, 0xde, 0x0e, 0xea, 0x3f, 0x3d, +0xb6, 0xb0, 0x81, 0x2c, 0x25, 0x59, 0x13, 0xa2, 0x0c, 0xc9, 0x27, 0xf2, +0x4b, 0xd4, 0x72, 0xf1, 0x41, 0x21, 0x88, 0xc8, 0x02, 0x70, 0x0e, 0x80, +0x73, 0x00, 0x9c, 0x03, 0xe0, 0x1c, 0x00, 0xe7, 0x00, 0x38, 0x07, 0xc0, +0x39, 0x00, 0x76, 0x0b, 0x8f, 0xbc, 0x87, 0x2a, 0x91, 0x56, 0xe4, 0xf0, +0x93, 0xd7, 0xa8, 0x67, 0x01, 0xdc, 0x5a, 0x4a, 0xce, 0xfe, 0x73, 0xe2, +0xf0, 0xfe, 0x8f, 0x5b, 0xe2, 0x87, 0x70, 0xa9, 0x83, 0x2b, 0x38, 0x07, +0x38, 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x07, 0xb8, 0xc9, +0x2d, 0x35, 0xfa, 0xf2, 0xe5, 0x8f, 0x98, 0xf3, 0xd7, 0x87, 0x22, 0x57, +0x16, 0x41, 0x9e, 0x9c, 0xdc, 0xa0, 0xb6, 0x00, 0xbb, 0xc9, 0x3f, 0xa6, +0xbd, 0xe8, 0xc2, 0x67, 0x8f, 0x02, 0xeb, 0x3b, 0x67, 0xc4, 0x09, 0xc5, +0x00, 0xc6, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x86, 0x8b, 0x24, 0x5f, 0x62, +0x93, 0x2d, 0x6d, 0xb1, 0x7b, 0xcf, 0x3b, 0x43, 0xbd, 0x08, 0x0f, 0x99, +0x18, 0xd1, 0xa3, 0x1c, 0xfe, 0x5f, 0x85, 0x9d, 0xe8, 0x87, 0xa7, 0xdc, +0x58, 0x99, 0x2d, 0x86, 0x5f, 0x06, 0xa8, 0x10, 0xc4, 0x00, 0x15, 0x82, +0x18, 0xa0, 0x42, 0x10, 0x03, 0x54, 0x08, 0x62, 0x80, 0x0a, 0xc1, 0x3a, +0xc0, 0x66, 0x61, 0x65, 0x1f, 0xfd, 0xef, 0x16, 0x5f, 0x22, 0x28, 0x39, +0x62, 0x4b, 0x54, 0x5c, 0x24, 0xef, 0x3d, 0xfc, 0xb4, 0x34, 0xf1, 0x95, +0xb7, 0xb2, 0x05, 0x11, 0x84, 0x69, 0x0e, 0x40, 0x64, 0x00, 0x38, 0x82, +0x30, 0x06, 0x80, 0xc9, 0x8e, 0xac, 0x7d, 0xc3, 0x8d, 0x95, 0xb6, 0x34, +0x30, 0x7b, 0xcb, 0x64, 0xeb, 0x0c, 0xf5, 0x43, 0xf8, 0x48, 0x44, 0x97, +0xae, 0xf4, 0xcf, 0x0e, 0x2e, 0x33, 0x76, 0x8b, 0xbf, 0xf7, 0xb1, 0x37, +0xfa, 0x6e, 0x77, 0x4d, 0xea, 0xdc, 0xca, 0x98, 0x4f, 0x9d, 0x5b, 0x19, +0x73, 0xe9, 0xdc, 0x3d, 0x63, 0x12, 0x71, 0xa4, 0x57, 0xbb, 0x73, 0x23, +0xff, 0x93, 0xcd, 0x3d, 0xcd, 0x8a, 0xe6, 0x2e, 0x17, 0xb9, 0x3d, 0x89, +0x35, 0x44, 0x3f, 0x7d, 0xac, 0x75, 0xe1, 0xc0, 0x0f, 0xc3, 0x7e, 0xbd, +0xf0, 0x77, 0x3c, 0xd0, 0xb5, 0x9b, 0xcd, 0x18, 0x76, 0xcb, 0x1a, 0xb5, +0x59, 0xeb, 0x8b, 0x35, 0xb7, 0xb1, 0xed, 0x07, 0xfc, 0xeb, 0x23, 0xea, +0xa7, 0xa5, 0x84, 0x28, 0xce, 0xf5, 0xb2, 0x42, 0xfd, 0x16, 0x5e, 0xb6, +0x92, 0x17, 0x2e, 0x31, 0x4a, 0xdc, 0x65, 0x8a, 0x97, 0x0b, 0x03, 0xa8, +0x20, 0x90, 0x8a, 0x9d, 0x00, 0x2a, 0xd8, 0xda, 0xa8, 0xe4, 0xc4, 0xe8, +0x13, 0x2f, 0x72, 0x53, 0xfa, 0x41, 0x50, 0x41, 0x38, 0x25, 0x36, 0x91, +0x3a, 0x00, 0xe1, 0x54, 0x63, 0xe9, 0xe4, 0x08, 0xbc, 0x58, 0x43, 0x3d, +0xad, 0xa3, 0x15, 0x57, 0xcd, 0x6b, 0x9b, 0x71, 0xa3, 0xcb, 0xf1, 0xcf, +0xd0, 0xc7, 0x6e, 0x91, 0x59, 0x1e, 0x8f, 0xeb, 0xc8, 0xba, 0x9a, 0xf6, +0x66, 0x16, 0xb6, 0x80, 0x9c, 0xb3, 0xde, 0xd8, 0xaa, 0xcb, 0xeb, 0xeb, +0x8d, 0x4f, 0xbb, 0xbb, 0x09, 0xf4, 0x37, 0xe6, 0x78, 0x99, 0x36, 0x10, +0x5f, 0x4d, 0xdf, 0x5b, 0xeb, 0xc3, 0x56, 0xaa, 0x6c, 0x2d, 0x36, 0x93, +0xec, 0x09, 0xd5, 0x78, 0x5d, 0xc7, 0xda, 0x66, 0x63, 0x5d, 0xd2, 0xac, +0x1e, 0xea, 0x22, 0x7c, 0xac, 0xad, 0x18, 0x28, 0x37, 0x66, 0xe6, 0xcd, +0xa4, 0x4b, 0xb4, 0x75, 0x73, 0x73, 0x7e, 0x7b, 0xf3, 0x5b, 0xb6, 0x7b, +0x17, 0xd4, 0x39, 0xc7, 0x47, 0x31, 0x30, 0x5b, 0x69, 0xb6, 0xae, 0x03, +0xea, 0xb0, 0x31, 0x7f, 0xad, 0x2a, 0xa2, 0x47, 0xd4, 0x49, 0x78, 0x88, +0x36, 0x29, 0xe5, 0x3d, 0xf0, 0x2c, 0x9f, 0x89, 0x3e, 0xd1, 0xc9, 0x55, +0x36, 0x9a, 0x9f, 0xa7, 0xdd, 0xcb, 0xcd, 0xb2, 0xe6, 0x54, 0xc1, 0x45, +0xb5, 0xf5, 0x7a, 0x3d, 0x22, 0xea, 0xbc, 0x30, 0x76, 0xc9, 0xa9, 0xbd, +0x00, 0xd6, 0x66, 0xae, 0xc5, 0xb4, 0x33, 0xf1, 0xa9, 0x57, 0xbc, 0xf5, +0x55, 0x57, 0xe5, 0xe5, 0x5c, 0x50, 0xdb, 0x1c, 0xa0, 0x97, 0xab, 0xdc, +0x40, 0xb9, 0x2e, 0x33, 0xea, 0xd2, 0xea, 0x9d, 0x59, 0x8b, 0x66, 0x3e, +0xea, 0x59, 0xc0, 0xb4, 0x73, 0x1b, 0x4b, 0x6e, 0xc0, 0x3a, 0xd1, 0x9b, +0xc3, 0x90, 0xa9, 0xb5, 0x7c, 0xb1, 0xa7, 0x5e, 0xe6, 0x5a, 0x03, 0x3b, +0x5b, 0x1c, 0xb5, 0xd7, 0x50, 0xef, 0xb2, 0x8b, 0xe5, 0xa9, 0x41, 0xd0, +0xf5, 0x92, 0xca, 0xe6, 0x06, 0xaf, 0x13, 0x7d, 0xb8, 0x0c, 0x99, 0x5a, +0xb3, 0x45, 0x3f, 0x85, 0x68, 0x05, 0xd5, 0x06, 0x35, 0xa9, 0x6b, 0x73, +0xcd, 0xa9, 0x5e, 0x44, 0x33, 0xd7, 0xdc, 0x29, 0xb3, 0x45, 0x5d, 0xf1, +0x19, 0x3e, 0x6f, 0x95, 0xbd, 0xac, 0x47, 0xd4, 0x12, 0xaa, 0xad, 0x45, +0xbb, 0x7d, 0xea, 0xab, 0xea, 0xda, 0x52, 0x52, 0x0b, 0x61, 0x13, 0xc7, +0x59, 0x4c, 0x6e, 0xa2, 0xbe, 0xf1, 0x1a, 0xfa, 0x6c, 0x21, 0x94, 0x27, +0xaa, 0xc1, 0xbc, 0xba, 0x43, 0xdd, 0xf4, 0x65, 0x52, 0xb5, 0xba, 0x62, +0xc0, 0xbb, 0x59, 0xbb, 0x88, 0x6e, 0x6e, 0x43, 0x36, 0x5a, 0xc0, 0x45, +0xd4, 0x03, 0xa2, 0x6a, 0xf6, 0x37, 0x11, 0x75, 0xcf, 0xe6, 0x8d, 0x4a, +0xb2, 0x62, 0x20, 0xe9, 0x8c, 0x6f, 0x51, 0x77, 0xfc, 0x86, 0x7e, 0x63, +0x01, 0xe2, 0xee, 0x8b, 0x8a, 0xbc, 0x78, 0x8b, 0x7a, 0xcc, 0x4a, 0x10, +0xe7, 0x98, 0x9a, 0xfb, 0x33, 0x66, 0xa0, 0xfe, 0x39, 0x0e, 0xe9, 0x02, +0x2d, 0x94, 0x08, 0xcd, 0x56, 0x3b, 0xd4, 0xa4, 0x97, 0x90, 0x67, 0xe8, +0xb3, 0xa8, 0x09, 0xcf, 0xe1, 0xa8, 0xf3, 0x44, 0x73, 0x46, 0xa8, 0xc9, +0x5f, 0x50, 0x5a, 0x31, 0xa0, 0x6e, 0x2b, 0xb7, 0xa8, 0x09, 0xcf, 0xa1, +0xf7, 0xba, 0xde, 0x59, 0x7c, 0x9c, 0xd3, 0x48, 0xf3, 0x6c, 0x05, 0x17, +0xdc, 0x50, 0xcd, 0xb8, 0x0e, 0x9d, 0x9e, 0xf7, 0x69, 0x5f, 0x35, 0x77, +0x7a, 0xbd, 0x98, 0xb4, 0x5f, 0x33, 0xae, 0x43, 0x67, 0xbb, 0xc1, 0x42, +0x9a, 0x4d, 0xe1, 0xdd, 0xbc, 0xb0, 0x66, 0x5c, 0x87, 0x2c, 0x2d, 0x1c, +0x97, 0xd2, 0x5c, 0x7a, 0xde, 0x26, 0xcd, 0xb8, 0x0e, 0xb1, 0x55, 0x69, +0x3b, 0x34, 0xa7, 0xa3, 0x5d, 0x84, 0x19, 0x9a, 0x71, 0x1d, 0x3a, 0x53, +0x14, 0x45, 0x35, 0xdb, 0xa2, 0x8b, 0xde, 0xe8, 0x35, 0xe3, 0x3a, 0x74, +0x9d, 0x71, 0x57, 0x1b, 0xa6, 0x59, 0xaf, 0xe9, 0x58, 0xed, 0xbc, 0xe6, +0x1c, 0xcf, 0x61, 0x9a, 0xcd, 0x23, 0x06, 0xd0, 0xad, 0x5f, 0xff, 0xbd, +0x1a, 0x3a, 0xcb, 0xf7, 0x66, 0xc4, 0xe6, 0x74, 0x8a, 0x9a, 0xf0, 0x1c, +0x96, 0xfe, 0xe4, 0x94, 0x84, 0xee, 0x0b, 0x35, 0xd5, 0xe3, 0xe1, 0x19, +0xb6, 0xec, 0x11, 0x35, 0xe1, 0x38, 0xc4, 0xa3, 0x15, 0x20, 0xa6, 0x0d, +0x4e, 0x2b, 0xf5, 0xa8, 0x27, 0x33, 0x9b, 0x00, 0x05, 0x8c, 0xd5, 0x9b, +0x32, 0xd7, 0x03, 0xbf, 0x61, 0x2a, 0xe7, 0x25, 0xf8, 0x54, 0x14, 0x83, +0x48, 0xa7, 0x8d, 0xba, 0x6f, 0x4c, 0x56, 0xdc, 0x33, 0x2a, 0xa9, 0x9b, +0x55, 0x99, 0x53, 0x77, 0xdc, 0x86, 0xb8, 0xcc, 0xaa, 0xb6, 0x88, 0x2a, +0xb3, 0x53, 0xe3, 0x69, 0xa1, 0x6e, 0xa3, 0xc9, 0x98, 0x1b, 0x34, 0x55, +0x8b, 0xe7, 0xbb, 0xc0, 0x5c, 0x37, 0xbc, 0x86, 0x49, 0xcf, 0x53, 0x90, +0x54, 0xc3, 0xa4, 0xe2, 0x74, 0x53, 0xdf, 0xd9, 0xe4, 0xa9, 0x96, 0xa9, +0x85, 0xc8, 0xaa, 0x6d, 0x1d, 0xd1, 0x26, 0xe6, 0xfa, 0xc2, 0x67, 0x98, +0xaa, 0x56, 0x95, 0x5c, 0x36, 0x9f, 0x68, 0x89, 0x79, 0xe4, 0x4e, 0x1f, +0xa8, 0x6b, 0xab, 0xf7, 0x66, 0x0d, 0x0b, 0xaa, 0x17, 0x74, 0xd5, 0xb9, +0xcc, 0xa9, 0x2b, 0x2e, 0x43, 0x5c, 0xd6, 0xa7, 0xe1, 0x10, 0xad, 0xa0, +0xd7, 0x6c, 0xf3, 0x9c, 0xa9, 0x0f, 0x75, 0xea, 0xfd, 0xfc, 0xd4, 0x20, +0xe0, 0xe9, 0xce, 0x6d, 0x1a, 0xb5, 0x75, 0x4e, 0xbd, 0xe3, 0x30, 0x44, +0x93, 0xad, 0xed, 0xd7, 0x97, 0xbc, 0x42, 0xad, 0x81, 0x0a, 0x3c, 0x37, +0xea, 0x4d, 0x9d, 0xd6, 0x9e, 0x4a, 0xaf, 0x50, 0xcf, 0x02, 0x98, 0xf5, +0xf2, 0x97, 0xe7, 0xfa, 0x1f, 0x59, 0x86, 0xb9, 0x2e, 0x78, 0x9b, 0x5a, +0x65, 0x4b, 0x73, 0x9a, 0xcd, 0xfc, 0xc9, 0x84, 0xda, 0x02, 0x3c, 0xea, +0x56, 0x9b, 0xa9, 0xd7, 0x6a, 0xd2, 0xe5, 0xea, 0x4b, 0x6a, 0x2f, 0x3c, +0xdc, 0xdc, 0xf6, 0x31, 0x99, 0x35, 0x3e, 0xd6, 0x19, 0x57, 0x71, 0xca, +0x0e, 0xa5, 0xc4, 0xb2, 0x84, 0x44, 0xc5, 0xc5, 0x24, 0xbf, 0x37, 0x47, +0xf9, 0x34, 0x53, 0xa7, 0xd1, 0x94, 0x87, 0xab, 0xa7, 0xf2, 0xf7, 0xa8, +0x93, 0xf0, 0x31, 0x33, 0x83, 0x29, 0x2f, 0x78, 0x9c, 0xad, 0x23, 0x1f, +0xeb, 0x80, 0x9b, 0x38, 0x6d, 0x4c, 0x45, 0xd9, 0xba, 0xd0, 0xe6, 0xd2, +0x27, 0x92, 0x3a, 0xe3, 0xa3, 0x18, 0x24, 0x4b, 0x78, 0xd3, 0x44, 0x6d, +0xf5, 0x94, 0xe9, 0xd2, 0xb6, 0xa7, 0x01, 0x75, 0x11, 0x5e, 0x6e, 0x4d, +0xf3, 0xaf, 0x46, 0xd6, 0xa1, 0xe8, 0xdc, 0x47, 0xd6, 0xcf, 0xb5, 0x56, +0xeb, 0xc7, 0x71, 0xbd, 0x9e, 0xbc, 0x1a, 0x4a, 0x4c, 0x55, 0xd6, 0x91, +0x6c, 0xa5, 0xb2, 0xfc, 0x49, 0x97, 0x7a, 0xc7, 0x4b, 0xb1, 0xea, 0x9c, +0x03, 0xce, 0x56, 0xd9, 0x51, 0xb4, 0xb1, 0x9b, 0x9e, 0xe7, 0x28, 0x59, +0x2a, 0x6d, 0x43, 0x38, 0x35, 0x28, 0xd4, 0xeb, 0x70, 0x35, 0xdb, 0xf5, +0xec, 0xa6, 0x3d, 0x0f, 0xb4, 0x07, 0xe1, 0x74, 0xb6, 0x74, 0x72, 0x04, +0x58, 0x13, 0x89, 0x09, 0x98, 0x98, 0x79, 0x35, 0xab, 0x2f, 0x2b, 0x79, +0x86, 0x65, 0x2f, 0xca, 0xc5, 0x93, 0x48, 0x0f, 0x31, 0x3b, 0xa3, 0xf8, +0x28, 0x4b, 0x14, 0x49, 0x0e, 0xc9, 0xf0, 0xe5, 0x5e, 0x2d, 0xa6, 0xfe, +0x97, 0x5a, 0x3f, 0x06, 0x50, 0xb0, 0x7c, 0x4e, 0xbb, 0x12, 0xfd, 0x93, +0xc5, 0xdd, 0x38, 0xc7, 0x73, 0x2c, 0x69, 0x2f, 0x8f, 0xa1, 0x5c, 0xf9, +0x78, 0x2e, 0x8f, 0x99, 0x77, 0xa5, 0x8f, 0x7d, 0xb6, 0x5a, 0xc5, 0x6d, +0x36, 0x27, 0xa5, 0x5e, 0x4c, 0xa8, 0xc1, 0xdc, 0x43, 0x6e, 0x7e, 0xcf, +0x7a, 0x34, 0x8b, 0xfd, 0x23, 0xf9, 0x02, 0xdd, 0xa2, 0xbf, 0x85, 0xd7, +0xcd, 0xa7, 0xc6, 0x78, 0xb0, 0x13, 0x86, 0x37, 0xc3, 0xef, 0xfe, 0x28, +0xfb, 0xbb, 0x6e, 0x4f, 0x2f, 0x88, 0x75, 0x1a, 0xeb, 0xfa, 0xd5, 0xe6, +0x78, 0xbd, 0xbf, 0x65, 0xa4, 0x5c, 0xc6, 0xe7, 0xbf, 0x7f, 0xf6, 0xce, +0xef, 0x7a, 0x84, 0xf3, 0x13, 0xca, 0xcc, 0x93, 0x7c, 0xa4, 0x53, 0xf0, +0x84, 0x2d, 0x5e, 0xa0, 0xe2, 0xf8, 0xde, 0x25, 0xba, 0xcb, 0xa5, 0x86, +0xdd, 0x0e, 0x3c, 0xdd, 0x07, 0xaa, 0xd6, 0x84, 0xaa, 0x76, 0x75, 0x8a, +0x7e, 0xb0, 0xa3, 0xa7, 0xd9, 0xbf, 0x87, 0x5d, 0xfa, 0x8e, 0x09, 0x26, +0x54, 0xa2, 0x7d, 0xc3, 0x30, 0x51, 0x65, 0x6f, 0x94, 0x1c, 0x6e, 0x58, +0x55, 0xe2, 0x0f, 0xd5, 0x36, 0xed, 0x93, 0x1c, 0xf7, 0x7c, 0xc0, 0xd4, +0x20, 0xa6, 0xff, 0xc5, 0x2f, 0x8a, 0xab, 0xca, 0x51, 0xe5, 0xd0, 0x14, +0xef, 0xbb, 0x9e, 0x47, 0x0e, 0x73, 0x14, 0x3b, 0xca, 0x92, 0x54, 0xaa, +0x5a, 0xa5, 0x40, 0x75, 0x55, 0x6c, 0xa9, 0xce, 0xb3, 0xef, 0x84, 0x82, +0x0b, 0x33, 0x40, 0xa5, 0x61, 0xf4, 0x4e, 0xbf, 0xd4, 0xe2, 0x33, 0x0f, +0xb5, 0xe8, 0x53, 0xbf, 0xbf, 0x3e, 0xc4, 0x9d, 0xb1, 0x94, 0xe9, 0x72, +0xe3, 0x40, 0x77, 0xca, 0xe6, 0x79, 0x35, 0xac, 0x0f, 0xfc, 0xc4, 0xea, +0xc7, 0x27, 0x99, 0xbc, 0x3f, 0xd9, 0x9b, 0x84, 0x49, 0x38, 0x73, 0x39, +0xe4, 0x92, 0x5f, 0x97, 0x7a, 0xa2, 0x57, 0x0d, 0xef, 0x5d, 0xe7, 0xb9, +0x02, 0xc3, 0xc6, 0x45, 0x7d, 0xf1, 0xff, 0x78, 0x02, 0x9d, 0x41, 0x2f, +0xd3, 0xe6, 0xdc, 0xb3, 0xa8, 0xfe, 0xf6, 0xf2, 0xd3, 0x2f, 0x09, 0x55, +0x13, 0xaf, 0x3f, 0x5e, 0x73, 0x08, 0x05, 0x62, 0x75, 0x73, 0x71, 0xde, +0x95, 0x3f, 0xb7, 0x13, 0x37, 0x33, 0xf8, 0xa3, 0xe1, 0xb8, 0x78, 0x8d, +0x6a, 0x72, 0x2d, 0x1a, 0xf5, 0xc9, 0x87, 0xff, 0x49, 0xdd, 0xbf, 0x52, +0x27, 0xc5, 0x5b, 0x5c, 0x67, 0xe6, 0xb9, 0x7e, 0xb6, 0xa4, 0x3b, 0x9b, +0x78, 0xe8, 0x65, 0xd6, 0xc3, 0x68, 0x7c, 0x9d, 0x99, 0x67, 0x4a, 0x0e, +0xdf, 0xe0, 0x74, 0x23, 0xfc, 0xa7, 0xc4, 0x7d, 0x8e, 0x72, 0x6f, 0xcf, +0xab, 0xdb, 0x3f, 0xeb, 0xf7, 0xa3, 0x9d, 0xed, 0xc5, 0xce, 0xde, 0x9e, +0x6b, 0x4c, 0xa6, 0x0b, 0x18, 0x36, 0x56, 0xbc, 0xf5, 0x68, 0x71, 0xc5, +0x92, 0x9d, 0x69, 0xfe, 0xa3, 0x8f, 0x68, 0x27, 0x6c, 0xd3, 0xf9, 0x7e, +0xe6, 0x87, 0xf4, 0xb7, 0xd5, 0x3f, 0x68, 0x0b, 0x71, 0xcf, 0xcb, 0xbd, +0x60, 0x81, 0xb5, 0x7b, 0x9d, 0x0e, 0x65, 0xa8, 0xe5, 0xf0, 0x8b, 0xa7, +0xcd, 0x1e, 0x0b, 0xd5, 0xe2, 0xcd, 0x0e, 0xe8, 0xce, 0xbb, 0xcd, 0xb6, +0x84, 0xe3, 0x32, 0xaf, 0x26, 0x6f, 0x51, 0x3e, 0x71, 0x9e, 0x3f, 0x7b, +0x9d, 0x2b, 0xd7, 0x2a, 0x6b, 0x88, 0x57, 0x19, 0xb1, 0x71, 0x92, 0x08, +0xaf, 0x6c, 0xf3, 0x63, 0x1d, 0x37, 0x57, 0xf4, 0x8f, 0x8a, 0x36, 0x16, +0x4a, 0x4f, 0x20, 0x9a, 0x21, 0x27, 0xd5, 0xf9, 0x62, 0x5d, 0xae, 0x13, +0x9f, 0xf2, 0xad, 0xbe, 0x13, 0x55, 0x9b, 0xba, 0xb7, 0xee, 0x67, 0x16, +0xf5, 0x93, 0x0a, 0x24, 0x4e, 0xb5, 0x04, 0x0f, 0xec, 0xe3, 0x00, 0x90, +0x70, 0x0a, 0xc7, 0x88, 0x80, 0x5b, 0x6c, 0x8d, 0xc9, 0xb9, 0x98, 0x72, +0x54, 0x94, 0x8f, 0x25, 0x3c, 0xf7, 0x16, 0xff, 0xae, 0xa7, 0x27, 0xba, +0xe4, 0x79, 0xcf, 0xdd, 0x42, 0x93, 0xe2, 0xd7, 0x26, 0x69, 0xe5, 0x35, +0x73, 0xff, 0x87, 0x0b, 0xbd, 0xf3, 0xed, 0x78, 0xff, 0x77, 0x9a, 0x17, +0xf1, 0x1b, 0x85, 0x53, 0x6f, 0x84, 0xf6, 0xc6, 0x6e, 0xbf, 0x61, 0xf2, +0xda, 0x1e, 0x14, 0x25, 0x11, 0x5e, 0xe6, 0x75, 0x1f, 0x8b, 0x57, 0x7b, +0xe6, 0xfa, 0x17, 0x27, 0x7f, 0x56, 0x1e, 0xfd, 0xf7, 0xc5, 0x3d, 0xcf, +0x0f, 0x77, 0x8f, 0x6a, 0xbe, 0xe9, 0x52, 0xb9, 0x92, 0x9c, 0xa1, 0xda, +0xa4, 0xe4, 0x8d, 0x7c, 0xd6, 0xf3, 0x3d, 0x77, 0x55, 0xc4, 0x89, 0x2d, +0xf9, 0x72, 0x75, 0xa9, 0x33, 0xe7, 0xd7, 0x9e, 0x5d, 0xd9, 0x52, 0x97, +0xb9, 0x30, 0x26, 0x49, 0xf0, 0x91, 0x38, 0x24, 0x06, 0x09, 0x99, 0x90, +0x09, 0x99, 0x90, 0x47, 0xec, 0x76, 0xe3, 0xbc, 0xda, 0xb3, 0xd3, 0xe6, +0x78, 0x2f, 0x93, 0xde, 0x6e, 0x4a, 0xd2, 0xb1, 0x14, 0xf1, 0x1d, 0x4f, +0x88, 0x4d, 0xe1, 0x84, 0x59, 0x01, 0x59, 0xcc, 0x42, 0x16, 0xb3, 0x90, +0xc5, 0x2c, 0x64, 0x31, 0x0b, 0x59, 0xcc, 0x42, 0x16, 0xb3, 0x90, 0xa5, +0x0e, 0x3e, 0xc5, 0xa4, 0x18, 0x29, 0x47, 0x8e, 0x71, 0x1e, 0x8d, 0x21, +0xf3, 0xdc, 0x3e, 0xe5, 0xd5, 0x9e, 0x5b, 0xb9, 0x13, 0xec, 0xd5, 0x33, +0x0f, 0x7f, 0xdf, 0x5e, 0xad, 0xda, 0xdb, 0xcb, 0x07, 0xcf, 0x13, 0x55, +0x7f, 0x95, 0x1e, 0x15, 0xb0, 0x8d, 0x67, 0x1d, 0xc4, 0x4e, 0x37, 0x0a, +0x3e, 0xef, 0xf7, 0xb3, 0x1c, 0x85, 0x7e, 0x97, 0x3d, 0x4b, 0xea, 0xd1, +0xc1, 0xe5, 0x39, 0x37, 0x4b, 0xc5, 0xeb, 0x32, 0xee, 0xa4, 0xbf, 0x53, +0x17, 0xbf, 0x7c, 0x9d, 0x76, 0x90, 0xa7, 0x82, 0x73, 0x7a, 0xc5, 0x7a, +0x91, 0x17, 0xdf, 0xbf, 0xda, 0x8b, 0xb7, 0x7d, 0x6d, 0xd7, 0x1b, 0x29, +0xe5, 0x0f, 0x45, 0x4d, 0xc8, 0x1b, 0x6a, 0xd9, 0xfc, 0x00, 0xa2, 0xfd, +0x1f, 0xc1, 0xed, 0xe0, 0xed, 0x52, 0xcc, 0x73, 0x79, 0x47, 0x19, 0xad, +0xb2, 0x77, 0x7d, 0x4b, 0x14, 0xb7, 0x37, 0xdf, 0x98, 0xe4, 0x3a, 0x9f, +0xdd, 0xa3, 0x4c, 0x0b, 0x93, 0xd2, 0xb9, 0xf7, 0xd3, 0xd2, 0x25, 0x95, +0xe4, 0xea, 0xac, 0xc6, 0xc2, 0x0b, 0xa5, 0x73, 0xd7, 0x49, 0xc3, 0xc5, +0x99, 0xbd, 0xa1, 0x8d, 0x9b, 0x6f, 0x2a, 0x94, 0x6d, 0x90, 0x55, 0x57, +0x48, 0x32, 0xf7, 0xce, 0x44, 0xe9, 0xe4, 0xf6, 0xbe, 0xd7, 0x7a, 0x29, +0xa5, 0x4d, 0x94, 0xe4, 0xf2, 0xe5, 0x32, 0x4c, 0x69, 0xd9, 0x19, 0x56, +0x01, 0xaa, 0xc6, 0xb3, 0x92, 0x5d, 0x85, 0xe4, 0xdc, 0xce, 0x63, 0x4c, +0x6e, 0xdf, 0x70, 0x2f, 0xdd, 0x4f, 0x7d, 0xe8, 0xa4, 0x4e, 0x89, 0x26, +0xe3, 0xbd, 0xb4, 0xe5, 0x63, 0x0f, 0x5f, 0xb6, 0xef, 0x9e, 0xb8, 0x8e, +0xc7, 0xd0, 0xae, 0xfe, 0x7e, 0x0f, 0x4f, 0x95, 0x60, 0x85, 0x44, 0x0c, +0x6d, 0x67, 0x5e, 0x7a, 0xf6, 0xd1, 0x1b, 0x43, 0x9e, 0x87, 0x92, 0x6f, +0x95, 0xcf, 0xfd, 0xf7, 0xf9, 0xa6, 0x27, 0xe2, 0xd5, 0xed, 0x1d, 0xee, +0x29, 0x84, 0x5e, 0x12, 0x7a, 0x59, 0x8e, 0x53, 0x3d, 0xc0, 0xae, 0xf1, +0x95, 0xff, 0x5c, 0xde, 0x14, 0x56, 0x1d, 0x07, 0xd3, 0xaa, 0xf2, 0xbe, +0x86, 0xc9, 0xc8, 0xfd, 0xd7, 0xa4, 0x9f, 0xef, 0xf4, 0xf4, 0x15, 0x54, +0x94, 0x96, 0x2f, 0xef, 0xe1, 0xcf, 0x98, 0x2b, 0x55, 0xbb, 0xa9, 0x89, +0xe0, 0x66, 0xaf, 0x7e, 0xc1, 0x7e, 0x2c, 0x69, 0x07, 0xa3, 0x4e, 0xcf, +0x67, 0x3f, 0xa8, 0x38, 0x9c, 0xba, 0xd9, 0xc2, 0x35, 0x50, 0x67, 0xc7, +0x1e, 0xfe, 0x9e, 0xbf, 0xf1, 0xd1, 0x9e, 0xd9, 0xa3, 0x34, 0xfb, 0x5e, +0xf3, 0xe9, 0x8e, 0xef, 0x5f, 0x4b, 0x89, 0x6a, 0x9b, 0xd7, 0xde, 0x37, +0x80, 0x0b, 0x8b, 0x6b, 0xd9, 0x55, 0x70, 0xe2, 0x2c, 0x50, 0x2d, 0x54, +0xd4, 0xe2, 0xb3, 0x47, 0xc7, 0xa8, 0x99, 0x42, 0x52, 0x88, 0xa9, 0x10, +0x10, 0x3e, 0x19, 0x97, 0xb0, 0x88, 0xe7, 0xd2, 0x52, 0xf2, 0x57, 0x3b, +0x62, 0x92, 0x3b, 0xf4, 0x63, 0x77, 0x7c, 0x54, 0x33, 0xdc, 0xf4, 0x9f, +0xff, 0x7b, 0xc1, 0x93, 0x4c, 0x6b, 0x0a, 0x16, 0x6a, 0x52, 0x82, 0xda, +0xb3, 0x35, 0x50, 0x0b, 0x6a, 0xd8, 0x86, 0x6c, 0x02, 0x53, 0xdb, 0x78, +0xe3, 0x47, 0x5d, 0xf4, 0x87, 0xa3, 0x98, 0x2e, 0xfa, 0xae, 0xd7, 0xdc, +0x65, 0x31, 0x4f, 0xe8, 0xad, 0xc3, 0xf9, 0x1e, 0xf2, 0xf1, 0xfd, 0xe4, +0x54, 0x9b, 0x6a, 0x02, 0x1a, 0x10, 0x3e, 0x19, 0x88, 0x0d, 0x93, 0xfd, +0xb4, 0x0b, 0x4f, 0xb9, 0xd9, 0xd0, 0x9d, 0xeb, 0xae, 0x42, 0x2b, 0xc3, +0x1e, 0x4d, 0xae, 0xf5, 0x76, 0xf4, 0x77, 0x72, 0x11, 0x7e, 0x3b, 0x9a, +0xaf, 0x37, 0xf7, 0xb9, 0x3f, 0x7b, 0x54, 0xd9, 0x92, 0x9d, 0x28, 0x98, +0x15, 0x42, 0x3f, 0x66, 0x28, 0x8c, 0xb1, 0x78, 0xc0, 0x6e, 0xe1, 0xce, +0x91, 0x2a, 0x9b, 0x97, 0x45, 0xde, 0x1d, 0xc7, 0xa5, 0xbe, 0x33, 0x38, +0x0d, 0xab, 0x35, 0x73, 0x7a, 0xf6, 0x4e, 0x1b, 0xb0, 0xd1, 0xcc, 0xdd, +0xd6, 0xd4, 0x96, 0xaa, 0xb0, 0xf2, 0xe1, 0xf9, 0x62, 0x95, 0x27, 0xa8, +0x13, 0xcd, 0x70, 0x6e, 0x47, 0x5e, 0xa6, 0x6c, 0xee, 0x3c, 0x49, 0xc9, +0xce, 0x33, 0x22, 0x22, 0xa3, 0xb8, 0xfb, 0xfa, 0x8b, 0x61, 0x23, 0x7e, +0x5f, 0x22, 0x57, 0x23, 0x7a, 0xaf, 0x77, 0x83, 0xf9, 0xbe, 0xec, 0xe1, +0x77, 0x6d, 0x6d, 0x5a, 0x33, 0x14, 0x4c, 0xf6, 0x90, 0xc3, 0x0b, 0xc4, +0xd2, 0x20, 0x92, 0x39, 0x17, 0xb3, 0x97, 0x3f, 0x1f, 0x35, 0x64, 0x8d, +0x99, 0x7d, 0x2d, 0x2d, 0xc9, 0x0d, 0x51, 0x83, 0xfc, 0xee, 0x99, 0x36, +0xef, 0x2e, 0xf3, 0x98, 0x1e, 0xb3, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, +0x66, 0x66, 0x66, 0xa6, 0xfc, 0xb4, 0xe3, 0xce, 0x7c, 0x91, 0x72, 0xdd, +0xea, 0x88, 0xea, 0x05, 0x19, 0x26, 0xda, 0x97, 0x0b, 0x6d, 0x8f, 0x7a, +0xec, 0x6f, 0xfe, 0xe2, 0x6c, 0x9c, 0xbf, 0xbd, 0xb9, 0x8b, 0x8a, 0x26, +0x9a, 0xc5, 0xd8, 0x38, 0x9b, 0xde, 0x1d, 0xe3, 0xcf, 0xe9, 0x23, 0xb1, +0xd9, 0x55, 0x16, 0x77, 0x30, 0x6b, 0x4e, 0x82, 0x5a, 0x03, 0x28, 0xe2, +0xd5, 0xa5, 0x3e, 0x9b, 0x67, 0x52, 0x8e, 0x7d, 0xf1, 0xb8, 0xd2, 0x83, +0x3d, 0xe3, 0xf8, 0x38, 0x91, 0x95, 0x1c, 0x0c, 0x3e, 0xc7, 0xab, 0x43, +0xb5, 0x44, 0xb5, 0xe1, 0x54, 0x63, 0xe9, 0xe4, 0x08, 0xb0, 0x06, 0x62, +0x07, 0x1f, 0x62, 0xc5, 0x40, 0xdd, 0x6b, 0x8d, 0xe3, 0xef, 0xe3, 0x4c, +0xac, 0x6f, 0xbb, 0x8e, 0xac, 0x2e, 0xb5, 0x76, 0xbd, 0xec, 0x4d, 0x63, +0x6c, 0xdd, 0xc6, 0x8d, 0xbb, 0xb7, 0x09, 0x3e, 0x54, 0xeb, 0x1c, 0x28, +0x68, 0xb6, 0x61, 0x23, 0xd1, 0x4e, 0xe7, 0x9b, 0x9b, 0x60, 0xb6, 0x72, +0x79, 0x53, 0x3c, 0x01, 0xef, 0x5d, 0x77, 0x95, 0x97, 0xdf, 0x58, 0x9a, +0xd2, 0x54, 0x2f, 0xd6, 0xb6, 0xbd, 0x23, 0x4e, 0xdf, 0xca, 0x3a, 0xb3, +0xd7, 0x54, 0x42, 0xaa, 0xc3, 0xc3, 0x0c, 0x4d, 0x4e, 0x2a, 0x98, 0xdb, +0x4d, 0xbd, 0xd4, 0x17, 0x54, 0x9b, 0x93, 0x36, 0x2a, 0xb7, 0x8e, 0x33, +0x15, 0x8f, 0x97, 0x54, 0x46, 0x6f, 0xeb, 0x33, 0xe3, 0x52, 0x14, 0xf5, +0x52, 0xb5, 0xba, 0xb4, 0xba, 0xc9, 0x6b, 0x70, 0x67, 0x74, 0xe6, 0x93, +0xda, 0xe0, 0xe4, 0xe6, 0x1f, 0xf3, 0xf9, 0x47, 0xf3, 0xab, 0x0c, 0xa2, +0x4a, 0xa7, 0xb3, 0x05, 0x8f, 0xda, 0xce, 0x3f, 0x8b, 0x50, 0x49, 0xb6, +0xdd, 0x90, 0x6c, 0xdf, 0xae, 0xa6, 0x76, 0xb8, 0xc9, 0xf0, 0xbf, 0x2e, +0xcf, 0xea, 0x11, 0x81, 0x01, 0x56, 0x7d, 0x0a, 0x0a, 0x91, 0xda, 0x15, +0x2e, 0xba, 0xf0, 0x03, 0x3c, 0x80, 0xd9, 0x9a, 0x65, 0x96, 0xb3, 0x4b, +0x74, 0x70, 0xd4, 0x4d, 0x53, 0xf6, 0xa3, 0xa5, 0x62, 0x99, 0x0d, 0x77, +0x5b, 0xa6, 0x0e, 0xa8, 0x32, 0x9f, 0x2d, 0x5a, 0x31, 0x10, 0xbf, 0xdd, +0x41, 0xea, 0x88, 0x27, 0x33, 0x5d, 0xab, 0xba, 0xef, 0x9e, 0xa3, 0xf7, +0x0d, 0x3a, 0xe2, 0xb3, 0xd4, 0x0a, 0x9d, 0xf5, 0x55, 0xe3, 0x16, 0x9e, +0x1e, 0xf6, 0xba, 0xfd, 0xae, 0xc6, 0x6e, 0x2c, 0xc4, 0x0c, 0x69, 0xc4, +0x55, 0x67, 0x16, 0xac, 0x5d, 0xbb, 0xc6, 0x56, 0xdd, 0x47, 0xb5, 0x69, +0xc4, 0xd5, 0xaa, 0x26, 0x35, 0xed, 0x1a, 0xcd, 0x64, 0x8f, 0x68, 0x87, +0xc6, 0x1c, 0x4f, 0x93, 0x1d, 0x6d, 0x38, 0xfa, 0x4a, 0x23, 0xfc, 0x71, +0x5f, 0xed, 0xdc, 0x5d, 0x48, 0x47, 0x3c, 0x5d, 0xed, 0xeb, 0x3c, 0x8c, +0x07, 0xe1, 0xb7, 0x49, 0x47, 0xd3, 0xaa, 0xaa, 0x67, 0x6f, 0x82, 0xc1, +0x9a, 0xe9, 0x5b, 0xb8, 0xf5, 0xab, 0xe0, 0xa8, 0x43, 0x0d, 0xcb, 0x7a, +0x0a, 0xe5, 0xfb, 0xd0, 0x6c, 0x4b, 0x56, 0x8e, 0x3a, 0x4c, 0xcb, 0x47, +0xcb, 0x4e, 0x21, 0xcb, 0xaa, 0xb6, 0x04, 0x1d, 0x78, 0x44, 0xed, 0x70, +0x13, 0x0d, 0x23, 0x2d, 0x5a, 0x13, 0xfc, 0x2a, 0x04, 0xb6, 0x1b, 0x8e, +0xdb, 0x4e, 0xed, 0x60, 0x5a, 0x97, 0xf6, 0x84, 0x4a, 0xea, 0xf4, 0xb6, +0x3d, 0xbf, 0x2d, 0x3e, 0xd6, 0x16, 0x27, 0x71, 0xb2, 0x93, 0xb6, 0x34, +0xcb, 0xea, 0x10, 0x55, 0xe9, 0x60, 0xe4, 0x4e, 0xb7, 0x20, 0xa9, 0x0d, +0x4c, 0x31, 0xf7, 0x9f, 0x27, 0xf5, 0x51, 0xb5, 0xf8, 0x41, 0x09, 0x59, +0xf4, 0xff, 0x9c, 0xc6, 0xf4, 0x0b, 0x2a, 0xe7, 0x78, 0x58, 0x1b, 0x0a, +0xd6, 0x53, 0x5a, 0xb2, 0x78, 0x51, 0x3a, 0x89, 0xa9, 0x96, 0xed, 0x6d, +0x76, 0x3a, 0x58, 0x17, 0xeb, 0x55, 0xa2, 0x3a, 0x54, 0x9e, 0xe4, 0x75, +0x47, 0xa6, 0x97, 0xa1, 0x4d, 0xf5, 0x02, 0xbe, 0x2a, 0x31, 0xdb, 0x31, +0x9b, 0x86, 0x36, 0x3b, 0x7f, 0x91, 0x52, 0xcd, 0x3a, 0x7e, 0x88, 0xee, +0xeb, 0xf4, 0xa4, 0x97, 0xfc, 0x97, 0xc6, 0x32, 0x27, 0xf2, 0xab, 0x89, +0x32, 0x94, 0x2f, 0x06, 0xe9, 0xce, 0x61, 0x47, 0xdb, 0x28, 0xce, 0xb3, +0x5d, 0x4b, 0xcd, 0x6a, 0x2a, 0xe5, 0xd4, 0x76, 0x78, 0xf6, 0xc6, 0x3d, +0x0d, 0xaa, 0xa9, 0x05, 0xe1, 0x74, 0xb6, 0xf4, 0x29, 0x07, 0x26, 0x56, +0xe2, 0x50, 0xeb, 0x0b, 0x9a, 0xe1, 0xf3, 0x27, 0x3f, 0xc5, 0xe7, 0xfd, +0xe4, 0x4c, 0x5d, 0x20, 0x66, 0xf5, 0xdb, 0xe1, 0xa4, 0x18, 0xe4, 0xd6, +0x10, 0x4f, 0xd4, 0x20, 0x7f, 0xfd, 0xaf, 0x67, 0x5d, 0x2a, 0xd7, 0x7f, +0x24, 0x39, 0x73, 0x96, 0xe7, 0xff, 0x62, 0xfd, 0x8a, 0xeb, 0x7b, 0x6b, +0xfc, 0x6c, 0x08, 0x73, 0xb4, 0x9f, 0xb6, 0xeb, 0x97, 0xec, 0xd1, 0xc8, +0xad, 0x6f, 0xdd, 0x35, 0xfd, 0x64, 0xf9, 0x9e, 0xf8, 0xd2, 0xb7, 0xbc, +0x2d, 0x33, 0xb8, 0x51, 0xd5, 0x0a, 0x0c, 0xfb, 0xfb, 0x17, 0xc9, 0xbf, +0x3c, 0xdf, 0xdf, 0xed, 0x1d, 0xef, 0xfe, 0x2b, 0xd8, 0xf1, 0x8e, 0xa1, +0xe0, 0x97, 0xa2, 0x7a, 0xf1, 0x36, 0xcb, 0xcf, 0x84, 0x5d, 0xfc, 0xda, +0xb8, 0x0c, 0xa7, 0xfb, 0xf3, 0xdc, 0xef, 0x55, 0xe5, 0x2e, 0x97, 0x7b, +0xdf, 0xd2, 0x1d, 0xa3, 0x1d, 0xbc, 0x4e, 0x94, 0x32, 0xdc, 0x18, 0x3e, +0x6c, 0x76, 0x72, 0x97, 0x3a, 0xb3, 0xbf, 0x7c, 0xfc, 0x57, 0xc8, 0x6f, +0xfe, 0xeb, 0xf3, 0xb3, 0xc2, 0x8f, 0x7e, 0xe0, 0x1d, 0x5a, 0xca, 0x58, +0x2e, 0x96, 0xa3, 0x5d, 0x05, 0xcd, 0xa1, 0x3c, 0x46, 0xd5, 0x78, 0x45, +0xbc, 0x39, 0x7e, 0xf9, 0x2b, 0x6f, 0x3c, 0xe2, 0xd7, 0x2a, 0xfc, 0xad, +0x99, 0x58, 0xf9, 0xc0, 0xeb, 0xf3, 0xcf, 0x67, 0xac, 0xca, 0x0f, 0xcf, +0xaa, 0xff, 0xed, 0xf5, 0x92, 0xf1, 0x75, 0x15, 0x5c, 0x5c, 0x3c, 0x5b, +0xec, 0x25, 0xed, 0xff, 0x99, 0xc6, 0x41, 0xfe, 0xe5, 0x5f, 0x2b, 0x8b, +0x9f, 0x7d, 0xfb, 0x3d, 0x14, 0x4d, 0x84, 0xd6, 0x10, 0xe1, 0x41, 0xd3, +0x7d, 0xd1, 0xc1, 0xaf, 0x3e, 0x58, 0x64, 0xaf, 0x12, 0x6e, 0x72, 0xf3, +0xb1, 0x0b, 0xbb, 0xf0, 0xeb, 0xe5, 0xe2, 0x45, 0xac, 0xc7, 0xf8, 0x1b, +0x9b, 0x07, 0x3f, 0xf7, 0x0b, 0x5a, 0x71, 0x7a, 0x28, 0x51, 0x37, 0xfb, +0xd3, 0x07, 0x95, 0x96, 0xfd, 0x26, 0x3e, 0xf4, 0x63, 0xb7, 0x8d, 0xee, +0x7a, 0x23, 0xcb, 0x4d, 0x9f, 0x6b, 0xbc, 0x3d, 0x2a, 0x56, 0xf9, 0x57, +0xa5, 0x72, 0x91, 0xff, 0x85, 0xa3, 0xfa, 0x18, 0xf7, 0x4f, 0x39, 0x5e, +0xcc, 0x78, 0x1d, 0xab, 0xe9, 0xff, 0x62, 0xb5, 0x87, 0xfe, 0x26, 0xfa, +0x59, 0xf9, 0xdf, 0x04, 0xed, 0x0b, 0x58, 0xbc, 0xae, 0xb8, 0x99, 0xcc, +0xa7, 0xdf, 0xc4, 0x5d, 0xf0, 0x5f, 0x3f, 0x03, 0x5f, 0x9c, 0xe5, 0xb7, +0xae, 0xc9, 0x99, 0xa2, 0xcd, 0x3d, 0x72, 0xe3, 0x2d, 0x7f, 0xb9, 0x85, +0x76, 0xe5, 0x31, 0x9d, 0x7d, 0x33, 0x93, 0x9f, 0xfd, 0xa7, 0x66, 0xc9, +0x86, 0x13, 0x79, 0xf3, 0x4d, 0xfd, 0xfb, 0x61, 0x32, 0x7e, 0x91, 0x91, +0x38, 0x89, 0xe5, 0x3c, 0xa9, 0x1c, 0x9d, 0x54, 0x2e, 0x76, 0x55, 0xfc, +0x3f, 0xed, 0x27, 0xaf, 0xf1, 0xef, 0x89, 0x33, 0xfa, 0x42, 0xd7, 0x5f, +0xea, 0xbd, 0x6f, 0xf1, 0x8f, 0x15, 0x8a, 0xf8, 0x2d, 0xe4, 0x42, 0xce, +0x24, 0xfc, 0x26, 0x66, 0x06, 0x43, 0x7a, 0x4f, 0x2b, 0x8f, 0x25, 0xc9, +0x99, 0xfe, 0xb1, 0xae, 0xf0, 0x25, 0x8d, 0x67, 0xf3, 0x89, 0x62, 0xd3, +0x59, 0x5d, 0x79, 0xc6, 0xac, 0xfa, 0xbe, 0x6a, 0x93, 0xbb, 0xfa, 0x4b, +0x96, 0x3c, 0xc8, 0xb9, 0x56, 0x24, 0xb7, 0x53, 0x09, 0x13, 0xc5, 0xda, +0xd7, 0x0f, 0x8e, 0x7b, 0x9a, 0x7c, 0xf1, 0x3d, 0x7e, 0x89, 0x7a, 0x30, +0xac, 0xdf, 0x70, 0x12, 0x54, 0x00, 0xe1, 0x54, 0x63, 0xe9, 0x53, 0x8e, +0x70, 0x87, 0x4c, 0x5d, 0x55, 0xd1, 0xf7, 0xd2, 0x59, 0xef, 0x59, 0x1d, +0x59, 0x5d, 0xad, 0xb5, 0x31, 0x3d, 0xd6, 0x60, 0x49, 0xcc, 0xdb, 0xc1, +0x3c, 0xc8, 0xad, 0x21, 0xb6, 0x1b, 0x90, 0x7d, 0xeb, 0x7f, 0x53, 0xd1, +0x14, 0xb3, 0x95, 0xc9, 0x9d, 0x84, 0x26, 0x83, 0xfb, 0x9f, 0x76, 0x73, +0xab, 0x1e, 0xc5, 0xf5, 0x76, 0x09, 0x0b, 0xdb, 0xeb, 0x8d, 0x37, 0xa1, +0x33, 0x50, 0x15, 0x3c, 0x45, 0x6f, 0xeb, 0x2e, 0xbe, 0x6d, 0x89, 0xe1, +0x0e, 0x6f, 0xf5, 0xc9, 0x2f, 0x4f, 0xaa, 0xad, 0x50, 0x75, 0xa1, 0xb3, +0x03, 0xa6, 0xb6, 0xca, 0xff, 0xc6, 0x90, 0xab, 0xc7, 0x83, 0x85, 0xf7, +0x57, 0x2d, 0x5e, 0xd1, 0x67, 0xbf, 0xb4, 0x7a, 0x94, 0xad, 0x3a, 0xbf, +0x74, 0x66, 0x58, 0x68, 0xc0, 0x45, 0x67, 0x17, 0x64, 0x56, 0xbb, 0x86, +0xb4, 0xee, 0xa3, 0xda, 0x34, 0xe0, 0x62, 0x55, 0x53, 0x6b, 0x3a, 0x34, +0xd8, 0x56, 0x9b, 0xee, 0x8b, 0x5f, 0xbf, 0xd4, 0xe3, 0xc1, 0x50, 0x43, +0x35, 0x9e, 0x60, 0x4b, 0xfd, 0x7d, 0x57, 0x1f, 0xde, 0x6f, 0xb5, 0xbc, +0xe6, 0x6d, 0xcf, 0x56, 0x5b, 0x5e, 0xf8, 0x1d, 0xd0, 0x32, 0x07, 0x26, +0x8c, 0xd4, 0xaa, 0xd6, 0x74, 0xb6, 0x3f, 0x67, 0xd2, 0x60, 0xb7, 0xad, +0xe5, 0xa8, 0x06, 0xe5, 0xeb, 0xd6, 0x4e, 0x26, 0x30, 0x4f, 0x01, 0x5f, +0x54, 0x0c, 0x3a, 0x68, 0xfd, 0x7d, 0x2b, 0x4a, 0x5c, 0x50, 0x11, 0x0d, +0x25, 0x83, 0xfb, 0xb1, 0xe9, 0xc8, 0xb6, 0x5a, 0x4e, 0xe6, 0xa9, 0x14, +0x6e, 0xaf, 0x5a, 0xcd, 0xa2, 0x43, 0xce, 0x79, 0xcc, 0x6a, 0xa9, 0xb9, +0xd5, 0x06, 0xdd, 0x91, 0x60, 0x25, 0xbd, 0xed, 0xcb, 0x15, 0xcb, 0xef, +0xd5, 0xf0, 0xf0, 0x94, 0x94, 0xec, 0x55, 0xeb, 0xf7, 0xb2, 0xdf, 0xcd, +0x3b, 0x69, 0x8d, 0x69, 0x78, 0x5b, 0xfd, 0xf7, 0xb5, 0xee, 0xba, 0xff, +0xb4, 0x0f, 0xc3, 0x9a, 0xe4, 0x81, 0xe0, 0xe2, 0xd0, 0xf6, 0x8b, 0xce, +0x35, 0x38, 0x3b, 0xb8, 0x6b, 0xc7, 0xc7, 0x67, 0xcd, 0xdd, 0x19, 0xac, +0xda, 0x78, 0x66, 0x02, 0xfd, 0x3f, 0xb0, 0x9f, 0xd8, 0xe7, 0x07, 0xad, +0xec, 0x1f, 0x04, 0xf2, 0x63, 0x3f, 0xb0, 0x2f, 0xc7, 0xa8, 0x88, 0x56, +0x1b, 0x56, 0x4e, 0x5e, 0xaf, 0xf1, 0xf8, 0xef, 0xd9, 0xbf, 0x69, 0x8f, +0x3f, 0xb9, 0x5f, 0xed, 0x3d, 0xd9, 0xab, 0x87, 0xc6, 0x81, 0xa2, 0xb8, +0x6f, 0xbc, 0x12, 0xde, 0x11, 0x6f, 0x64, 0xe8, 0xf2, 0x8d, 0x87, 0x1d, +0x97, 0xde, 0xb7, 0xe4, 0xab, 0xfb, 0x5c, 0x6c, 0xf2, 0xba, 0xcc, 0x42, +0xfb, 0xbe, 0x9d, 0x71, 0xee, 0xcc, 0x71, 0xc9, 0x9d, 0x03, 0x3b, 0xf0, +0xad, 0x4b, 0xe4, 0x4c, 0x1f, 0xaf, 0x02, 0xf6, 0xad, 0x46, 0xd5, 0xc0, +0x2c, 0x58, 0x4f, 0x51, 0x47, 0x57, 0x17, 0x16, 0xf6, 0x38, 0xeb, 0x91, +0x57, 0xaf, 0x1a, 0xf0, 0x5c, 0x2b, 0x64, 0x13, 0xcc, 0x56, 0x02, 0x69, +0xa6, 0x2b, 0x3d, 0xb0, 0x60, 0x16, 0xea, 0x28, 0xe9, 0x3a, 0x03, 0xf1, +0x05, 0xfc, 0x85, 0x9c, 0xd4, 0x1e, 0xa8, 0x2e, 0xea, 0xbe, 0xaa, 0x4d, +0x75, 0xce, 0x65, 0x4d, 0x98, 0x9e, 0x40, 0x35, 0xfc, 0xc9, 0x3f, 0x7e, +0x69, 0xe0, 0x73, 0xb5, 0xbe, 0x55, 0xea, 0x60, 0xa6, 0x46, 0xbd, 0x1c, +0xe5, 0x60, 0xb6, 0x33, 0x98, 0x75, 0x51, 0x4b, 0xcd, 0x38, 0x34, 0xb1, +0x4c, 0x65, 0x7d, 0x56, 0x9f, 0x36, 0xf6, 0x74, 0xfa, 0x07, 0x3e, 0xae, +0xde, 0xb1, 0xe4, 0x77, 0x7e, 0xf5, 0x62, 0x37, 0x3d, 0xdc, 0xf1, 0x87, +0x2f, 0x05, 0x97, 0x60, 0xf8, 0x1a, 0xfc, 0x68, 0x77, 0xad, 0x76, 0x23, +0xbf, 0x8f, 0xc5, 0x87, 0x00, 0xf6, 0xc3, 0x6b, 0x62, 0x1d, 0x4f, 0xea, +0xc2, 0x65, 0xb3, 0xf6, 0x2a, 0x5b, 0x91, 0xba, 0x9f, 0xd5, 0x16, 0x5f, +0x85, 0x35, 0xe1, 0x51, 0x6a, 0xa9, 0x19, 0x6b, 0x00, 0x9b, 0xcb, 0x5f, +0xfb, 0xd8, 0xf8, 0x56, 0xfc, 0x3f, 0xe1, 0xda, 0xfa, 0xff, 0xf6, 0xe3, +0x9c, 0x0e, 0x16, 0xff, 0x31, 0x76, 0x1f, 0x00, 0xf6, 0x64, 0x13, 0xb6, +0xda, 0x38, 0x76, 0xb1, 0x11, 0xb6, 0xda, 0x38 diff --git a/ktx/external/basisu/contrib/single_file_transcoder/examples/testcard-rgba.png b/ktx/external/basisu/contrib/single_file_transcoder/examples/testcard-rgba.png new file mode 100644 index 0000000..c4200e8 Binary files /dev/null and b/ktx/external/basisu/contrib/single_file_transcoder/examples/testcard-rgba.png differ diff --git a/ktx/external/basisu/contrib/single_file_transcoder/examples/testcard.basis.inc b/ktx/external/basisu/contrib/single_file_transcoder/examples/testcard.basis.inc new file mode 100644 index 0000000..d343ab2 --- /dev/null +++ b/ktx/external/basisu/contrib/single_file_transcoder/examples/testcard.basis.inc @@ -0,0 +1,703 @@ +0x73, 0x42, 0x13, 0x00, 0x4d, 0x00, 0xfc, 0xe8, 0x9e, 0x20, 0x00, 0x00, +0xcb, 0xa6, 0x09, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x57, 0x01, 0x1c, 0x01, 0x00, 0x00, 0xf5, 0x02, 0x00, +0xa3, 0x02, 0x11, 0x04, 0x00, 0x00, 0x62, 0x09, 0x00, 0x73, 0x0d, 0x00, +0x00, 0x73, 0x01, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x01, 0x40, 0x00, 0x40, 0x00, 0xe6, 0x0e, 0x00, 0x00, 0x04, 0x0a, +0x00, 0x00, 0x47, 0x63, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, +0x00, 0x20, 0x00, 0x20, 0x00, 0xea, 0x18, 0x00, 0x00, 0xaf, 0x05, 0x00, +0x00, 0x4c, 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x40, 0x00, +0x10, 0x00, 0x10, 0x00, 0x99, 0x1e, 0x00, 0x00, 0xa3, 0x01, 0x00, 0x00, +0xd0, 0x9e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x20, 0x00, 0x20, 0x00, 0x08, +0x00, 0x08, 0x00, 0x3c, 0x20, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0xbc, +0xfc, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, +0x04, 0x00, 0xb8, 0x20, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0xbe, 0x4b, +0x00, 0x00, 0x00, 0x05, 0x00, 0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0x02, +0x00, 0xd9, 0x20, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x04, 0xf6, 0x00, +0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, +0xe2, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x64, 0x29, 0x00, 0x00, +0x00, 0x07, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0xe5, +0x20, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xbd, 0xa9, 0x00, 0x00, 0x00, +0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0xe8, 0x20, +0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xfc, 0xab, 0x20, 0x40, 0x04, 0x00, +0x42, 0x10, 0x04, 0x60, 0xe0, 0x0f, 0x2d, 0xc9, 0x4a, 0xd1, 0x13, 0x30, +0x43, 0x06, 0x02, 0x3c, 0xa0, 0x00, 0x87, 0x60, 0x18, 0x9a, 0x97, 0xf4, +0xc3, 0x38, 0x36, 0xbb, 0x51, 0x95, 0xe6, 0x81, 0x00, 0x0f, 0x20, 0x48, +0x61, 0x10, 0x06, 0x6e, 0x22, 0x45, 0x60, 0xd0, 0x3b, 0x5a, 0x79, 0x03, +0x09, 0x02, 0x10, 0x01, 0x00, 0x00, 0x00, 0x40, 0x08, 0x14, 0x1e, 0xec, +0x87, 0x4b, 0x4d, 0x51, 0xc0, 0x60, 0x99, 0x42, 0xd4, 0x84, 0x63, 0x88, +0x0e, 0x8d, 0x48, 0x59, 0xf7, 0x5c, 0xfa, 0x9c, 0x33, 0x38, 0x3a, 0x1f, +0xd5, 0x2d, 0x85, 0x1e, 0x44, 0x54, 0x40, 0xa4, 0xc6, 0x0a, 0x88, 0xff, +0x66, 0xcd, 0x97, 0xf1, 0x7c, 0xa3, 0xf3, 0x9c, 0xa4, 0x56, 0xcb, 0x53, +0xd0, 0x31, 0x64, 0x65, 0x4c, 0xc8, 0xea, 0x3e, 0x50, 0x3c, 0xce, 0xe9, +0x5a, 0xed, 0xd4, 0x06, 0xec, 0x15, 0x3d, 0xc3, 0xaf, 0xd6, 0x69, 0x6b, +0x36, 0x72, 0x2e, 0x51, 0x8b, 0xba, 0x94, 0x33, 0xfa, 0x59, 0x4d, 0xa9, +0xf1, 0xf4, 0x9b, 0xbe, 0x9d, 0xd1, 0x87, 0xb9, 0xcd, 0x79, 0xdc, 0x97, +0x52, 0xf2, 0x18, 0xec, 0xe3, 0x4f, 0xae, 0xbb, 0x7d, 0x4a, 0x49, 0x11, +0xc1, 0x7d, 0x73, 0x02, 0xff, 0xcf, 0x9b, 0x5a, 0xb5, 0x32, 0xa0, 0x92, +0x54, 0x17, 0xa1, 0x91, 0xd1, 0x0f, 0x6c, 0x22, 0xfd, 0x3c, 0xda, 0x34, +0xc6, 0xf1, 0x61, 0x59, 0xfe, 0x9d, 0x6a, 0x17, 0x53, 0x30, 0xeb, 0x97, +0xa2, 0x9d, 0x8e, 0xf4, 0x35, 0xff, 0xa0, 0x21, 0x30, 0xc4, 0x04, 0x40, +0x8c, 0x98, 0xe4, 0x23, 0xee, 0x46, 0x01, 0x22, 0x65, 0x37, 0xe4, 0xf8, +0x2b, 0xe7, 0xa7, 0xe5, 0xbc, 0x11, 0x03, 0xe2, 0x45, 0xd8, 0x90, 0xcf, +0x03, 0xbf, 0x33, 0x70, 0xe0, 0xfa, 0xc8, 0x80, 0xf1, 0x3c, 0x2e, 0x84, +0xf6, 0xa5, 0x03, 0xe0, 0x98, 0xc7, 0xc3, 0x1f, 0x87, 0xc9, 0xe6, 0xaa, +0xba, 0x31, 0xc6, 0x80, 0x31, 0xa6, 0x5e, 0xcb, 0x00, 0x02, 0xca, 0xb5, +0xb5, 0xae, 0x2b, 0xd6, 0x9f, 0x59, 0x7d, 0x61, 0x86, 0xea, 0x79, 0xc3, +0xfc, 0x84, 0x36, 0x44, 0xdc, 0x45, 0xac, 0xe9, 0x49, 0x8e, 0x8c, 0xc8, +0xd5, 0x13, 0x98, 0x6c, 0xff, 0xf9, 0xbe, 0xef, 0xe4, 0x92, 0x76, 0x8e, +0xa3, 0xb6, 0xde, 0x33, 0x96, 0x49, 0x95, 0xa0, 0x67, 0xdb, 0xb6, 0x99, +0x59, 0x6a, 0xad, 0x7c, 0x3e, 0x1f, 0xd9, 0xce, 0x7d, 0xd4, 0x5b, 0xf7, +0x3c, 0x5a, 0xa6, 0x1f, 0x63, 0xac, 0xb5, 0xc6, 0x14, 0xe9, 0xf6, 0x97, +0x93, 0x52, 0xea, 0xb2, 0x2c, 0x23, 0xb9, 0x52, 0x4a, 0xbc, 0xf7, 0xf4, +0xde, 0x97, 0x73, 0x76, 0xce, 0x39, 0xd3, 0x34, 0x89, 0x99, 0xef, 0xba, +0x2e, 0x9c, 0x73, 0x39, 0x8e, 0x63, 0xaa, 0xba, 0x7d, 0xdf, 0xbd, 0xef, +0xfb, 0x44, 0xa4, 0xeb, 0xba, 0xee, 0xb3, 0x16, 0x5e, 0x15, 0x84, 0x10, +0x50, 0x8d, 0x66, 0x0e, 0x8b, 0x31, 0xc8, 0x39, 0x93, 0xdb, 0xa3, 0x29, +0xfa, 0x00, 0xf0, 0x8c, 0xc5, 0xc5, 0xb6, 0xcc, 0x2c, 0x66, 0xb6, 0x31, +0xc6, 0xd7, 0x5c, 0x7f, 0x76, 0xf3, 0x8c, 0x13, 0x5f, 0xcb, 0x21, 0xf8, +0x23, 0xa2, 0x08, 0xc9, 0x54, 0x49, 0x61, 0x18, 0xe2, 0x9e, 0x34, 0x98, +0xcd, 0x6e, 0x45, 0xf4, 0x7f, 0x80, 0xac, 0xb2, 0x49, 0x12, 0xa3, 0x81, +0xd7, 0xde, 0xc4, 0xdf, 0x37, 0xe0, 0x3c, 0xfc, 0xe4, 0x5f, 0x3c, 0x45, +0x44, 0x5e, 0xf6, 0xec, 0x72, 0xde, 0x70, 0x16, 0x96, 0x7d, 0x1c, 0xfb, +0xe1, 0x6f, 0xb4, 0x66, 0x8a, 0x7f, 0x2a, 0xcd, 0x13, 0x70, 0x72, 0x22, +0x10, 0xe3, 0x09, 0xd8, 0x44, 0x06, 0x82, 0xec, 0xee, 0x10, 0xf4, 0x10, +0x00, 0x21, 0x05, 0x44, 0x60, 0x1c, 0x56, 0xae, 0x56, 0x90, 0x86, 0xa1, +0x5d, 0xf2, 0x8d, 0xa4, 0x00, 0x90, 0x54, 0x63, 0x58, 0x07, 0x31, 0xbd, +0xdd, 0x48, 0x00, 0x03, 0x49, 0xe7, 0x70, 0x90, 0x52, 0x52, 0xf9, 0x1e, +0xa4, 0x24, 0xa0, 0x49, 0x86, 0xc0, 0x08, 0x04, 0x20, 0x04, 0x12, 0x44, +0x8f, 0xa5, 0x6d, 0x75, 0xbc, 0xda, 0xf3, 0x01, 0xb4, 0x92, 0x5d, 0x5d, +0x3a, 0x49, 0x3d, 0x4f, 0xcc, 0xb3, 0xe4, 0x3c, 0xd6, 0x43, 0x40, 0xe4, +0xee, 0xd4, 0x94, 0xd7, 0x70, 0x7e, 0x73, 0x69, 0x8d, 0xf9, 0xc3, 0x4e, +0x09, 0x04, 0xf0, 0x02, 0x1c, 0xe1, 0xf2, 0xaa, 0x4a, 0x83, 0xe7, 0x65, +0x81, 0x40, 0x52, 0xaa, 0x50, 0x6b, 0x77, 0xaf, 0xeb, 0xfa, 0xde, 0x30, +0x0c, 0x16, 0x41, 0xef, 0xf7, 0x86, 0xd8, 0xaf, 0x11, 0xf1, 0x36, 0xd5, +0xd3, 0x11, 0x12, 0xdf, 0x2c, 0x56, 0x65, 0xf4, 0x8d, 0x1f, 0xd6, 0xdd, +0x71, 0x3b, 0xad, 0xb7, 0x0c, 0xcf, 0x41, 0xd3, 0x34, 0xe5, 0x38, 0x2d, +0xed, 0x88, 0x2c, 0x6f, 0x50, 0x5a, 0x36, 0x30, 0x79, 0xfb, 0x24, 0xbf, +0xd7, 0xa2, 0xac, 0x29, 0xea, 0x1f, 0xff, 0x06, 0x47, 0xdf, 0xb6, 0x6e, +0x55, 0xa5, 0xce, 0xa1, 0x98, 0x0a, 0x8a, 0xcc, 0x46, 0xaa, 0x49, 0x90, +0x0a, 0x0a, 0x02, 0xbe, 0x9c, 0x05, 0xe0, 0xf4, 0x89, 0xcb, 0x9a, 0x6e, +0x3c, 0xa4, 0xf9, 0xd5, 0x29, 0xbe, 0xe2, 0x7c, 0x98, 0xb4, 0x72, 0x8f, +0xd6, 0x52, 0x2b, 0xcf, 0xaf, 0x4f, 0x8b, 0x0a, 0xe4, 0x1c, 0x98, 0x91, +0x88, 0x48, 0xa1, 0x4a, 0xad, 0x07, 0x40, 0x79, 0x60, 0xc1, 0xdc, 0xfc, +0x22, 0x47, 0x4e, 0xdf, 0x28, 0x4d, 0x73, 0xfa, 0x7d, 0x29, 0xff, 0xbe, +0x4f, 0xef, 0xfc, 0xaf, 0xb6, 0xfd, 0x79, 0xb2, 0x02, 0x22, 0x02, 0x04, +0x6f, 0x34, 0x04, 0x20, 0x28, 0x00, 0x7f, 0xe4, 0xe7, 0x2d, 0xf4, 0xb2, +0x70, 0x02, 0x29, 0x93, 0x89, 0x45, 0x19, 0x8d, 0x4c, 0x36, 0xb9, 0x81, +0x2b, 0xbc, 0x57, 0x46, 0x07, 0x70, 0x1c, 0x72, 0x07, 0x83, 0xe1, 0x91, +0xb2, 0x5b, 0x94, 0x92, 0x27, 0x1f, 0x98, 0xbc, 0xb1, 0x2d, 0x05, 0x00, +0x00, 0xc0, 0x7f, 0x45, 0x97, 0xd7, 0x2e, 0x35, 0x47, 0x07, 0x11, 0x27, +0x1f, 0x27, 0x45, 0x22, 0xe2, 0x54, 0xa9, 0xd4, 0x3c, 0xcd, 0x56, 0x5c, +0x4a, 0x5d, 0x1c, 0x24, 0xc6, 0x65, 0xe3, 0xb2, 0x0f, 0x87, 0xea, 0x7b, +0xd1, 0xbd, 0x2d, 0xd6, 0xab, 0x8f, 0x3f, 0x80, 0xe3, 0x4a, 0xc4, 0x28, +0x49, 0xa7, 0x91, 0xf5, 0x6d, 0x12, 0x8e, 0xc3, 0xcd, 0xcd, 0xf6, 0x0f, +0x0c, 0x88, 0x88, 0x0f, 0x0f, 0xaa, 0xaa, 0x0f, 0x0f, 0x6a, 0xaa, 0x0f, +0x0f, 0x69, 0xaa, 0x0f, 0x0f, 0xfb, 0x2a, 0x0b, 0x03, 0xff, 0x78, 0x0b, +0x01, 0xf9, 0xfa, 0x0a, 0x09, 0xfa, 0xfa, 0x0a, 0x09, 0xea, 0xbf, 0x2e, +0x00, 0x80, 0x40, 0xed, 0xff, 0x15, 0x00, 0xe0, 0xeb, 0x15, 0x14, 0xea, +0xed, 0x15, 0x14, 0xec, 0xf5, 0x15, 0x14, 0x6c, 0x75, 0x55, 0x35, 0x75, +0x75, 0x75, 0x75, 0xb5, 0xff, 0x5f, 0x5d, 0x5d, 0xfd, 0x57, 0x55, 0x55, +0x45, 0x7c, 0x8e, 0x98, 0xfc, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, +0xab, 0xa9, 0xab, 0xab, 0x37, 0xdc, 0xfb, 0x9b, 0x96, 0x52, 0x06, 0x00, +0x27, 0x1d, 0xbe, 0x74, 0x7c, 0xdd, 0xb8, 0xd8, 0xd1, 0x73, 0x58, 0xab, +0x52, 0xfa, 0x08, 0xff, 0xaa, 0x2e, 0xa4, 0xaa, 0xaa, 0xae, 0xa6, 0xac, +0xab, 0xaa, 0xaa, 0x0e, 0x1f, 0x44, 0xaa, 0xaa, 0xaa, 0x3f, 0x87, 0xaa, +0xaa, 0xea, 0x3f, 0x62, 0x47, 0x5d, 0x5d, 0xfd, 0x5f, 0x55, 0x55, 0x95, +0x7f, 0x75, 0x75, 0xf5, 0x5f, 0x20, 0x68, 0xd9, 0x38, 0x58, 0x37, 0x01, +0x82, 0x83, 0xbe, 0xc4, 0x0d, 0x7e, 0x7e, 0xd6, 0xfe, 0xfe, 0xfe, 0xd6, +0xfe, 0xf6, 0xf6, 0xf6, 0xfe, 0xfe, 0xd6, 0xfe, 0xfe, 0x7e, 0x56, 0x7e, +0x7e, 0xd2, 0xdf, 0xde, 0x4f, 0xf5, 0xfe, 0xfe, 0x5f, 0xf5, 0xfe, 0xfe, +0x5f, 0x29, 0x71, 0x49, 0x55, 0xb5, 0xbb, 0x5b, 0x55, 0x15, 0x1e, 0x3e, +0x55, 0x15, 0x1e, 0x3e, 0x4d, 0x15, 0x1e, 0xbe, 0x03, 0x07, 0x07, 0x07, +0x07, 0x06, 0x06, 0x26, 0x3f, 0x78, 0x05, 0x0c, 0x1c, 0x2c, 0x0c, 0x0c, +0x0c, 0xac, 0x0e, 0x0d, 0x0c, 0xac, 0x0e, 0x0c, 0x08, 0xa8, 0x5e, 0x3c, +0xeb, 0x40, 0x02, 0x00, 0xa8, 0x1e, 0xf4, 0x00, 0x00, 0x80, 0x7c, 0x01, +0x00, 0x80, 0xfe, 0x0f, 0x5e, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x04, 0x04, +0xf8, 0x07, 0x04, 0x04, 0x58, 0x9d, 0x07, 0x5b, 0x00, 0x00, 0x00, 0xc5, +0x08, 0x7f, 0x00, 0x00, 0x80, 0xa0, 0x01, 0x00, 0x00, 0xa1, 0x2f, 0x9e, +0x08, 0xcc, 0x2a, 0x45, 0xb1, 0x49, 0xd3, 0xa0, 0xd7, 0xf1, 0x49, 0x55, +0x4d, 0x55, 0xbd, 0xa3, 0x73, 0xd0, 0x5a, 0x43, 0x43, 0x43, 0x5b, 0x43, +0x43, 0x5b, 0xbd, 0xaf, 0x93, 0xf5, 0xf5, 0xf5, 0x75, 0xc4, 0x95, 0x19, +0x75, 0x75, 0xf5, 0x80, 0xf4, 0xe0, 0x29, 0xe2, 0xf7, 0xef, 0xd3, 0xe6, +0x63, 0x04, 0xd2, 0x02, 0x89, 0x1f, 0x1e, 0x54, 0x55, 0x1f, 0x1e, 0x54, +0xd5, 0x1e, 0x1e, 0x54, 0xd3, 0x1e, 0x1e, 0xf4, 0xf5, 0x13, 0x14, 0xf4, +0xf5, 0x59, 0x82, 0x82, 0x7e, 0x7e, 0xc0, 0x02, 0xde, 0xff, 0xc0, 0x82, +0xca, 0xbe, 0x80, 0x80, 0xc0, 0xbe, 0x80, 0x80, 0xc0, 0xbf, 0x80, 0x80, +0xd0, 0xbf, 0xc1, 0x80, 0xc0, 0x7f, 0xf1, 0x2d, 0x3a, 0x30, 0x30, 0xf4, +0x3f, 0x30, 0x30, 0xb4, 0x36, 0x30, 0x30, 0xb0, 0x3a, 0x20, 0x20, 0xb0, +0x5a, 0x3c, 0x27, 0x20, 0x60, 0xa5, 0x2a, 0x20, 0x20, 0xb9, 0x2b, 0x22, +0x26, 0xb9, 0x9e, 0x89, 0x89, 0x49, 0xae, 0xaf, 0x0a, 0x48, 0xae, 0xad, +0x0a, 0x08, 0x0c, 0xac, 0x0e, 0x0c, 0x0c, 0xac, 0x0d, 0x0d, 0x0c, 0xfc, +0x0f, 0x0d, 0x0c, 0x14, 0xdf, 0xfe, 0x17, 0x18, 0x30, 0x28, 0xfe, 0x05, +0x04, 0x04, 0xf6, 0x05, 0x04, 0x04, 0xfe, 0x85, 0x04, 0x04, 0xfe, 0x81, +0x00, 0x00, 0x0e, 0x5e, 0xfe, 0x03, 0x00, 0x04, 0x48, 0x34, 0x7c, 0x81, +0x00, 0x00, 0xa0, 0x0a, 0x00, 0x10, 0xb0, 0x1a, 0x10, 0x10, 0xa0, 0x1b, +0x14, 0x10, 0xa0, 0x19, 0x04, 0x04, 0xa4, 0x0e, 0x04, 0x04, 0xa4, 0x0e, +0x0c, 0x0c, 0xac, 0x0e, 0x0c, 0x0c, 0xad, 0x0e, 0x08, 0x08, 0xcc, 0x8b, +0x17, 0x76, 0x01, 0x01, 0x01, 0xff, 0x01, 0x01, 0x01, 0xff, 0x01, 0x81, +0x21, 0xff, 0x01, 0x81, 0x00, 0xfe, 0x01, 0x80, 0x80, 0xfe, 0x01, 0x80, +0xc0, 0x8b, 0x1b, 0xf8, 0x87, 0x06, 0x06, 0xfe, 0x07, 0x06, 0x0e, 0xfe, +0x0f, 0x06, 0x06, 0xfe, 0xaf, 0x06, 0x06, 0x7e, 0xaf, 0x06, 0x04, 0x6e, +0x3f, 0x06, 0x06, 0x26, 0xdf, 0x06, 0x06, 0x26, 0x07, 0x06, 0x06, 0x56, +0x24, 0xea, 0x00, 0x40, 0xc0, 0x70, 0x40, 0xc0, 0xd0, 0x70, 0x40, 0x80, +0x90, 0x60, 0x60, 0x90, 0x80, 0x40, 0x70, 0xd0, 0xc0, 0x40, 0x70, 0xc0, +0x40, 0x00, 0xd0, 0x80, 0x00, 0x00, 0x1c, 0xe1, 0x37, 0x30, 0x00, 0x10, +0x10, 0x10, 0x10, 0x90, 0x10, 0x10, 0x10, 0x90, 0x3a, 0x00, 0x00, 0xb4, +0x1b, 0x00, 0x00, 0xc0, 0x1b, 0x00, 0x40, 0x80, 0x0b, 0xdd, 0x0f, 0x01, +0x00, 0x10, 0x30, 0x80, 0xf0, 0x17, 0x00, 0xc2, 0x1e, 0xdd, 0x70, 0x20, +0x00, 0x00, 0x00, 0x61, 0xfb, 0x60, 0x2d, 0x07, 0x10, 0x18, 0x50, 0x00, +0x08, 0x18, 0x50, 0x08, 0x08, 0x08, 0x58, 0x3d, 0x18, 0x06, 0x07, 0x05, +0x04, 0x40, 0x03, 0x01, 0x00, 0x1c, 0xa4, 0x57, 0x02, 0x02, 0x02, 0xda, +0xd4, 0xc0, 0xc4, 0xc0, 0xd0, 0xc0, 0xc0, 0xc0, 0xc1, 0x8b, 0x81, 0x81, +0x81, 0x83, 0x00, 0x81, 0x81, 0x03, 0x00, 0x81, 0x83, 0x06, 0x00, 0x80, +0x83, 0x16, 0x00, 0x80, 0xd7, 0x57, 0x00, 0x00, 0xbc, 0xfe, 0x03, 0x00, +0xe8, 0xfe, 0x03, 0x00, 0x01, 0xfe, 0x43, 0x02, 0x03, 0xfe, 0x03, 0x02, +0x02, 0xfe, 0x03, 0x02, 0x06, 0xbe, 0x03, 0x03, 0x56, 0xbf, 0x03, 0x03, +0x57, 0xff, 0xab, 0xc0, 0xc0, 0xd0, 0xff, 0xc5, 0xf5, 0x60, 0x60, 0xe0, +0x7f, 0x60, 0xe0, 0xe0, 0x7f, 0x60, 0x60, 0xe0, 0x6d, 0x60, 0x50, 0xa4, +0x6d, 0x70, 0x70, 0xe8, 0x7f, 0x70, 0x70, 0xf0, 0x7f, 0x02, 0x0e, 0x04, +0xf0, 0x0f, 0x09, 0x00, 0xf0, 0x0f, 0x08, 0x08, 0x58, 0x7d, 0xf0, 0xb9, +0x1a, 0x10, 0x10, 0x70, 0x1b, 0x18, 0x18, 0x78, 0x1b, 0x09, 0x14, 0xf8, +0x1f, 0x1c, 0x1c, 0xbc, 0xf9, 0x87, 0x06, 0x07, 0xf7, 0x87, 0x02, 0x05, +0x75, 0x83, 0x06, 0x00, 0x78, 0x03, 0x00, 0x00, 0x70, 0x09, 0x00, 0x00, +0x08, 0xf8, 0x15, 0x50, 0x6b, 0x39, 0x00, 0x00, 0x40, 0xc3, 0x81, 0x00, +0xc0, 0xc1, 0x80, 0x40, 0xc0, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +0xd0, 0xc0, 0xc0, 0xd0, 0xe0, 0xe0, 0xd0, 0xc0, 0xc0, 0xc0, 0xd0, 0xee, +0xc1, 0xc0, 0xe0, 0xed, 0x07, 0x1b, 0x1c, 0x9e, 0xfc, 0x17, 0x1e, 0x16, +0xfe, 0x1f, 0x4e, 0x66, 0xfe, 0x4f, 0x4c, 0x44, 0x74, 0x4f, 0x4f, 0x49, +0x51, 0x4f, 0x4f, 0x49, 0x49, 0x57, 0x4f, 0x49, 0x49, 0x3f, 0x68, 0xce, +0x26, 0xad, 0xef, 0x53, 0x40, 0xaa, 0xaa, 0x77, 0x60, 0xa0, 0xaf, 0x6f, +0x60, 0xa0, 0xaf, 0xaf, 0x6c, 0xac, 0xaf, 0x6f, 0x6e, 0xa5, 0xa1, 0xd2, +0x8b, 0x1f, 0x04, 0x2d, 0x7f, 0xbc, 0xbd, 0x7d, 0x78, 0x96, 0x04, 0x1e, +0x2b, 0x95, 0x94, 0x2e, 0x0f, 0x94, 0x5b, 0x81, 0xb2, 0xd7, 0xb3, 0xeb, +0xe8, 0x3a, 0xbd, 0xb8, 0xb8, 0xb8, 0xd8, 0x38, 0xfb, 0x7d, 0xfe, 0xea, +0xea, 0xea, 0x5f, 0x5a, 0x55, 0x55, 0xfd, 0x6f, 0x9c, 0xe9, 0x29, 0xa6, +0xac, 0x22, 0xec, 0x34, 0x45, 0x22, 0x6f, 0xd5, 0x87, 0x91, 0x41, 0x6a, +0x45, 0x45, 0x25, 0x68, 0x45, 0x45, 0x65, 0x75, 0x45, 0x45, 0x45, 0x15, +0x12, 0x19, 0x6c, 0x0a, 0x52, 0x51, 0x59, 0x09, 0x56, 0x55, 0x55, 0xc9, +0xe1, 0xaa, 0xaa, 0xaa, 0x94, 0xf7, 0x08, 0xff, 0x01, 0x8e, 0xa5, 0x74, +0x11, 0x76, 0x53, 0xde, 0x75, 0xac, 0x96, 0x1b, 0xe7, 0xfe, 0xab, 0xaa, +0xac, 0xfe, 0xa7, 0xae, 0xac, 0x56, 0xaf, 0xae, 0xae, 0x0e, 0x12, 0xf5, +0xe2, 0xea, 0xea, 0xe2, 0x87, 0x33, 0x95, 0x95, 0x95, 0xeb, 0x65, 0x65, +0x65, 0xe5, 0xc1, 0x52, 0x65, 0x45, 0x45, 0x65, 0x48, 0x3b, 0xa4, 0x29, +0x58, 0x51, 0x51, 0xe9, 0x18, 0xd3, 0xad, 0x6c, 0x1d, 0xdd, 0x8d, 0x62, +0xc7, 0xc7, 0x8e, 0x36, 0xce, 0x87, 0xaa, 0x2a, 0x66, 0xe6, 0xf4, 0xcd, +0xf4, 0x34, 0x16, 0xd8, 0x3f, 0x90, 0x15, 0xb8, 0xa9, 0xf0, 0xf0, 0xa0, +0x20, 0x30, 0x57, 0x3c, 0xaf, 0x6a, 0x25, 0x20, 0xb0, 0x7a, 0x21, 0x2a, +0x40, 0x57, 0x2f, 0x4e, 0x07, 0xf6, 0x2f, 0x04, 0x06, 0xfe, 0x0f, 0x0e, +0x0e, 0xde, 0x0d, 0x0e, 0x0e, 0x3c, 0x43, 0x01, 0x03, 0x06, 0x12, 0x80, +0x83, 0x0e, 0x5a, 0x80, 0x83, 0x5e, 0x48, 0x08, 0x38, 0xd0, 0x40, 0x2b, +0x70, 0xd0, 0x41, 0x1f, 0x74, 0xd0, 0x02, 0x07, 0x7c, 0xd0, 0x03, 0x3d, +0x3c, 0x40, 0x41, 0x2d, 0x28, 0x40, 0x41, 0x09, 0x28, 0x60, 0xc0, 0x29, +0x30, 0x60, 0xd0, 0x20, 0x81, 0x01, 0x03, 0x05, 0x83, 0x21, 0x41, 0x01, +0x85, 0x21, 0xe1, 0x00, 0x0c, 0x25, 0x61, 0x00, 0x0c, 0x45, 0x61, 0x00, +0x0e, 0x43, 0x41, 0x00, 0x0a, 0x4a, 0x61, 0x01, 0x1a, 0x8e, 0x43, 0x01, +0xd0, 0x34, 0x0e, 0x02, 0xd1, 0x24, 0x0a, 0x02, 0x60, 0x24, 0x0c, 0x06, +0xe0, 0xa0, 0x05, 0x05, 0xa0, 0x2c, 0x07, 0x01, 0x28, 0x0d, 0x07, 0x01, +0x24, 0x0c, 0x06, 0x03, 0x34, 0x18, 0x0c, 0x0a, 0x14, 0x05, 0x83, 0x21, +0x41, 0x21, 0x81, 0x01, 0xe3, 0x20, 0x81, 0x01, 0x25, 0x60, 0xa0, 0x01, +0xc5, 0xec, 0x1a, 0x10, 0x34, 0x1c, 0x0a, 0x28, 0x3c, 0x3c, 0x28, 0x29, +0x3d, 0x3d, 0xa9, 0x2b, 0x30, 0x33, 0x70, 0x65, 0x3f, 0xa6, 0xea, 0x6f, +0xef, 0x3f, 0xe8, 0x56, 0xfd, 0xef, 0xef, 0x07, 0xfc, 0xef, 0xef, 0x03, +0xfc, 0xff, 0xfe, 0x7a, 0x40, 0xff, 0xef, 0xef, 0x55, 0xff, 0xef, 0xef, +0x54, 0xff, 0xfe, 0xfe, 0x01, 0xdb, 0x01, 0x75, 0x68, 0xfa, 0xee, 0xe3, +0x70, 0xba, 0xae, 0x23, 0x40, 0xba, 0x8e, 0x81, 0x07, 0x88, 0xfe, 0x23, +0x00, 0x00, 0xd2, 0x2d, 0x00, 0x20, 0xc0, 0x0d, 0xd2, 0x6f, 0x72, 0x63, +0x3c, 0xeb, 0x8d, 0xc9, 0xdd, 0x8d, 0xaa, 0xe2, 0x99, 0x7f, 0xd8, 0xd8, +0x38, 0x39, 0xd9, 0xd8, 0x78, 0x98, 0xd9, 0x78, 0xf8, 0x9f, 0xdc, 0x18, +0xf8, 0x9f, 0x1e, 0x1a, 0xf8, 0xff, 0x1f, 0x18, 0xf8, 0xfd, 0x1d, 0x18, +0xf8, 0xc7, 0xff, 0xc0, 0xd0, 0xf4, 0xff, 0xc0, 0xc6, 0xe4, 0xff, 0xc3, +0xc6, 0xcc, 0xff, 0xc8, 0xcc, 0xc8, 0xff, 0xd0, 0xef, 0xc0, 0xfe, 0xfe, +0x7f, 0xc0, 0xfe, 0xfe, 0x7f, 0xd5, 0xdf, 0xde, 0x5f, 0x45, 0xf2, 0xb7, +0xf7, 0x57, 0xf2, 0xa7, 0xf7, 0xf7, 0xf7, 0xa7, 0xf3, 0xf3, 0x23, 0x51, +0x3b, 0xf8, 0x26, 0x90, 0xfb, 0xfd, 0x55, 0xfd, 0xff, 0xf9, 0xd1, 0xf9, +0x13, 0x7f, 0x7f, 0x7a, 0x7f, 0xb8, 0x1b, 0xd5, 0x09, 0x6b, 0x32, 0xdd, +0xff, 0xd7, 0x2a, 0x05, 0x28, 0x08, 0x9b, 0x26, 0x42, 0xe8, 0xab, 0x3b, +0x21, 0x20, 0x30, 0x28, 0x89, 0xc0, 0x02, 0x19, 0x28, 0x30, 0x50, 0xd4, +0x21, 0x0f, 0x5a, 0x40, 0x00, 0x0e, 0x1a, 0x50, 0x60, 0x3d, 0xfb, 0x28, +0x0d, 0x0c, 0x18, 0x24, 0xe9, 0x3e, 0x96, 0x98, 0xf0, 0xe0, 0x80, 0x80, +0xa0, 0xe0, 0xa1, 0x04, 0x32, 0xe0, 0xa3, 0x26, 0x3a, 0xf0, 0xe3, 0x6e, +0x7a, 0x68, 0xf2, 0xdf, 0x41, 0x07, 0xfd, 0xbf, 0x80, 0x07, 0xfd, 0xf5, +0x05, 0x05, 0x35, 0xe0, 0xbf, 0xe3, 0x20, 0xe0, 0xee, 0xe3, 0x60, 0x80, +0xb6, 0xe3, 0x00, 0x00, 0xb2, 0xf7, 0x00, 0xc0, 0x83, 0x74, 0x0b, 0x00, +0x08, 0x70, 0x83, 0x04, 0x40, 0x81, 0x83, 0x06, 0xc2, 0x1d, 0x16, 0x3f, +0x58, 0x95, 0x90, 0x92, 0x5a, 0x97, 0x14, 0x13, 0xd9, 0x97, 0x14, 0x13, +0xc3, 0xbf, 0xf0, 0xb0, 0xf0, 0xff, 0xe4, 0xf0, 0xe0, 0xbf, 0xe0, 0xa1, +0xe2, 0xbf, 0xa0, 0xdd, 0xc2, 0xaf, 0x81, 0x89, 0xc8, 0x7f, 0x80, 0x80, +0xc1, 0x3f, 0x00, 0x00, 0xe5, 0x3f, 0x05, 0x05, 0xc5, 0xf8, 0x0f, 0x09, +0x47, 0xf3, 0x0f, 0x06, 0x43, 0x02, 0x09, 0x06, 0x43, 0x03, 0x0c, 0x4a, +0xc3, 0x01, 0x06, 0x4b, 0x8b, 0x01, 0x00, 0x48, 0xeb, 0x61, 0x16, 0x9a, +0x4d, 0xec, 0x10, 0xb4, 0xbd, 0x28, 0x60, 0xa4, 0xbc, 0x6c, 0x28, 0xbe, +0xbe, 0x28, 0x28, 0xbe, 0xbe, 0xb8, 0xb9, 0xbe, 0xbe, 0xbe, 0xf8, 0x39, +0xb3, 0x82, 0x59, 0xce, 0x7e, 0x7d, 0x4d, 0xa3, 0xf0, 0x4b, 0x04, 0xa6, +0x03, 0x66, 0xe0, 0xe1, 0xab, 0xaa, 0xe8, 0xe9, 0xab, 0x28, 0xfa, 0xfa, +0xfa, 0x28, 0xfa, 0xfa, 0xfa, 0x58, 0x9c, 0xbe, 0xbe, 0x3e, 0x94, 0x83, +0xe5, 0xaa, 0xaa, 0x2a, 0xc1, 0xca, 0x8a, 0x0a, 0xc1, 0xe2, 0xfb, 0x97, +0x97, 0x97, 0x96, 0xe6, 0x97, 0x97, 0x97, 0xe6, 0x96, 0x96, 0x96, 0x50, +0xa7, 0x34, 0x04, 0x54, 0xa7, 0x36, 0x06, 0x54, 0x27, 0x2c, 0x2c, 0x5c, +0x17, 0x34, 0x2c, 0x54, 0x07, 0x54, 0x2c, 0x57, 0x0f, 0x54, 0x24, 0x55, +0x37, 0x04, 0x54, 0x57, 0x34, 0x14, 0x5c, 0x6f, 0x0a, 0x0d, 0x05, 0xd7, +0x2d, 0x2d, 0x2d, 0xd7, 0x7d, 0x7d, 0x7d, 0xd3, 0xfc, 0xfd, 0xff, 0x01, +0xde, 0xdf, 0xff, 0x81, 0x0e, 0x06, 0x01, 0x0d, 0xfa, 0xfc, 0x7c, 0xfa, +0x49, 0xe0, 0x3a, 0x3c, 0xbc, 0x6a, 0x2a, 0x3c, 0xbc, 0x6a, 0x1a, 0x34, +0xde, 0xc2, 0x3f, 0x34, 0x5d, 0xc7, 0x3f, 0x14, 0x54, 0x77, 0xb7, 0xc0, +0x23, 0xa5, 0x5c, 0x5d, 0xf1, 0xb7, 0xf7, 0x97, 0x18, 0xe1, 0x6f, 0x75, +0xc4, 0xb7, 0xcd, 0x87, 0x87, 0xaa, 0xaa, 0xec, 0x23, 0x0f, 0x0f, 0xa5, +0xa5, 0x10, 0x58, 0xa0, 0x09, 0x1f, 0x50, 0x40, 0x09, 0x1b, 0x48, 0x40, +0x01, 0x33, 0x60, 0x20, 0x81, 0xa3, 0xa2, 0x22, 0x80, 0xa7, 0xa6, 0xa6, +0xfe, 0xaf, 0xae, 0xae, 0x2e, 0x2f, 0xaf, 0xae, 0xae, 0x1e, 0xfe, 0xa9, +0xa9, 0xa9, 0xff, 0xab, 0xb5, 0xb5, 0xff, 0xab, 0xd5, 0xb5, 0x25, 0xc6, +0x1e, 0xdb, 0x14, 0x69, 0x69, 0x19, 0x14, 0x69, 0x69, 0x14, 0x56, 0x16, +0x0a, 0xb5, 0x5c, 0x2a, 0xb3, 0x51, 0xb3, 0x31, 0x8a, 0x54, 0xb7, 0x8a, +0xa1, 0x11, 0x68, 0x5a, 0xa7, 0x2b, 0x82, 0xe9, 0xd2, 0xa2, 0xd4, 0xba, +0xb2, 0xaa, 0x6a, 0x98, 0x3a, 0x58, 0xec, 0x88, 0x12, 0xa6, 0xf6, 0x5a, +0x70, 0x3f, 0xff, 0x32, 0x86, 0xd6, 0xd7, 0x83, 0x82, 0xf5, 0x89, 0xd1, +0xc9, 0x0a, 0x05, 0x83, 0xd5, 0x0b, 0x53, 0x81, 0xd5, 0x81, 0xd3, 0x8b, +0x55, 0x01, 0xd1, 0x8b, 0xd5, 0x01, 0x81, 0x8b, 0x7d, 0x1c, 0x1c, 0x1c, +0xfc, 0x1f, 0x1c, 0x18, 0xbc, 0x0f, 0x1c, 0x7c, 0xdc, 0x05, 0x1c, 0x74, +0xfc, 0x57, 0x54, 0x44, 0xfc, 0xd2, 0xc0, 0x41, 0xfe, 0x93, 0xc0, 0x80, +0xfd, 0x83, 0x82, 0x42, 0xf9, 0xeb, 0x12, 0x05, 0xd3, 0xd3, 0xab, 0x7f, +0x93, 0xb2, 0xb5, 0x7b, 0xf9, 0x3f, 0xf4, 0x3b, 0xf0, 0xbf, 0xb6, 0x76, +0xf5, 0x7f, 0xb6, 0x76, 0xf5, 0x3f, 0x36, 0x36, 0x33, 0x33, 0x63, 0x4e, +0x4e, 0x36, 0x36, 0x4e, 0x4e, 0x66, 0x16, 0x0e, 0x06, 0x06, 0x06, 0x06, +0xde, 0x26, 0x07, 0x06, 0x3e, 0x6e, 0x07, 0x34, 0xa6, 0x56, 0x07, 0x34, +0xa4, 0x2c, 0xbf, 0xb8, 0x03, 0x20, 0x20, 0xa0, 0x4a, 0x01, 0x01, 0x81, +0x2b, 0x03, 0x81, 0x80, 0xff, 0x91, 0x99, 0x91, 0xff, 0x81, 0xdf, 0xa1, +0xff, 0x05, 0x3b, 0xc1, 0x7f, 0x11, 0x13, 0x83, 0x5f, 0x53, 0x53, 0x29, +0xd5, 0x91, 0x54, 0x31, 0x50, 0xbd, 0x5c, 0x11, 0x50, 0x7d, 0x4d, 0x52, +0x60, 0x75, 0x6c, 0x72, 0x70, 0x68, 0x68, 0x70, 0x72, 0x6c, 0x78, 0xf8, +0x5a, 0xb0, 0x2f, 0xf4, 0xcb, 0x5a, 0x9e, 0x05, 0x70, 0xaa, 0xd4, 0x7f, +0xbf, 0x8c, 0x44, 0xc0, 0xcc, 0x8c, 0x8d, 0xfd, 0xcf, 0x9c, 0x3c, 0xfc, +0x0f, 0xfc, 0x0e, 0xad, 0x0e, 0x58, 0x98, 0x7d, 0xb9, 0x23, 0x26, 0x26, +0xaa, 0x42, 0x66, 0x06, 0xee, 0x83, 0x62, 0x22, 0xaa, 0x02, 0x00, 0x40, +0x0a, 0xcc, 0x9b, 0xc4, 0xd5, 0x9d, 0xef, 0xca, 0xa7, 0x56, 0xc1, 0x78, +0x7a, 0xc5, 0x31, 0x0b, 0xb2, 0x0f, 0xd7, 0x8c, 0x98, 0x8d, 0x9b, 0x55, +0xed, 0x17, 0x53, 0xb5, 0xe3, 0x56, 0x5b, 0x7d, 0xf5, 0xb5, 0x79, 0xf6, +0xec, 0x50, 0x05, 0x77, 0x40, 0xde, 0xde, 0xde, 0x1e, 0x1c, 0x1e, 0xd3, +0xc2, 0xf1, 0xd3, 0xff, 0xff, 0x82, 0x82, 0xff, 0x74, 0x0b, 0x80, 0x3b, +0x20, 0x20, 0xa0, 0x4a, 0x20, 0x20, 0x20, 0x2e, 0xa5, 0xa1, 0x20, 0xab, +0x80, 0x80, 0x80, 0x9a, 0xaa, 0x5f, 0x50, 0x00, 0x0a, 0x2e, 0x91, 0x91, +0xc8, 0x7e, 0xdc, 0x0e, 0x0e, 0x1c, 0xec, 0x0e, 0x0d, 0xd4, 0x8e, 0x02, +0x94, 0x6a, 0xfd, 0x03, 0xec, 0xaa, 0xae, 0x06, 0x88, 0x98, 0xa0, 0xfb, +0xef, 0xd0, 0xc0, 0xff, 0xff, 0xc0, 0xd0, 0xef, 0xa0, 0x79, 0x94, 0xde, +0x5c, 0x8a, 0xa8, 0x03, 0x41, 0x43, 0x4f, 0x5c, 0xc5, 0xca, 0x0a, 0x09, +0xda, 0xaa, 0x81, 0x42, 0xc5, 0xaa, 0x80, 0xe9, 0x85, 0xc4, 0x41, 0x01, +0xc1, 0xdb, 0x81, 0x6d, 0xa3, 0x8a, 0xc3, 0x5f, 0xf1, 0x8b, 0x8a, 0xc4, +0x55, 0xc9, 0xe7, 0x8f, 0xa7, 0x2e, 0x45, 0x8c, 0xac, 0x91, 0x68, 0x94, +0x81, 0x56, 0xf9, 0x49, 0x5c, 0x60, 0x49, 0xb7, 0x3e, 0x79, 0x8a, 0x6e, +0x42, 0x5d, 0x1b, 0xa5, 0x91, 0x19, 0xa8, 0x3c, 0x76, 0x09, 0x7f, 0x0a, +0x5b, 0x03, 0x0c, 0x48, 0xbc, 0xd2, 0xb3, 0x5c, 0x89, 0xab, 0xcc, 0x23, +0xb5, 0xba, 0x60, 0x3a, 0xa0, 0x4c, 0x08, 0xc9, 0xc2, 0xbe, 0x7a, 0x71, +0xf4, 0xee, 0x2a, 0x88, 0xfb, 0xa1, 0x71, 0xd6, 0x71, 0x1c, 0xbf, 0xd7, +0xe7, 0xfb, 0x3c, 0x97, 0xfb, 0x93, 0xbb, 0xeb, 0xe5, 0x8f, 0xa9, 0x25, +0x69, 0xb5, 0xc6, 0xb6, 0x81, 0x08, 0xfe, 0x02, 0xcd, 0xa4, 0xee, 0x15, +0x44, 0xb2, 0x88, 0xa0, 0x88, 0x7f, 0x8b, 0xf4, 0xb7, 0x10, 0x5d, 0x54, +0x5c, 0x9c, 0x1d, 0x5c, 0xa4, 0x28, 0xe8, 0x56, 0xc1, 0xe2, 0xe0, 0xe2, +0xa2, 0x52, 0x28, 0x0a, 0x59, 0xa4, 0x28, 0xa8, 0x88, 0x6e, 0xba, 0xa4, +0x0e, 0xc5, 0xe2, 0x24, 0x6e, 0xb7, 0xb8, 0x88, 0x0e, 0x25, 0x18, 0xfb, +0x07, 0x6b, 0x85, 0xfc, 0xbd, 0xa4, 0x97, 0xbb, 0x3c, 0xc9, 0x3d, 0xdf, +0xe7, 0xf9, 0xbe, 0xc9, 0x85, 0x77, 0xb0, 0xf3, 0x7b, 0x7e, 0xcf, 0x63, +0xaf, 0x2a, 0xed, 0x24, 0xad, 0x30, 0xd6, 0x58, 0x6b, 0x8b, 0xda, 0x3b, +0x62, 0x1d, 0xd3, 0x8e, 0xad, 0x96, 0x16, 0x69, 0xc2, 0xb8, 0x80, 0x10, +0x6b, 0x51, 0x5b, 0xc7, 0x3a, 0x63, 0x0b, 0x1d, 0x14, 0xa3, 0xd4, 0x56, +0xf7, 0x30, 0x54, 0x95, 0x29, 0x75, 0x01, 0xe3, 0x22, 0xea, 0x06, 0xc6, +0xb8, 0x8f, 0x48, 0x1b, 0x4b, 0x8a, 0xd8, 0xfe, 0x30, 0xd1, 0x61, 0x88, +0x65, 0x4a, 0x18, 0x65, 0x5c, 0x40, 0xa9, 0x65, 0x08, 0x26, 0xa8, 0xeb, +0x09, 0x46, 0x64, 0x50, 0x71, 0x01, 0x49, 0x13, 0xb7, 0x30, 0xee, 0x20, +0xf8, 0x83, 0x5a, 0x22, 0x2e, 0x22, 0x75, 0x13, 0x09, 0x8a, 0x88, 0xbd, +0x2e, 0x23, 0x6a, 0x0b, 0x09, 0x62, 0x2f, 0x11, 0x84, 0x88, 0x25, 0x23, +0xc4, 0x56, 0x17, 0x11, 0x37, 0x30, 0xe3, 0x22, 0x12, 0x37, 0x50, 0x21, +0x21, 0xf8, 0xc3, 0x5e, 0x57, 0x50, 0x57, 0x90, 0xd7, 0xeb, 0xfd, 0xfe, +0x7c, 0x3f, 0xcf, 0xe7, 0xfb, 0xfb, 0x7c, 0x7e, 0xcf, 0xf9, 0xfc, 0xce, +0xef, 0xf9, 0x3d, 0xcf, 0x73, 0xb6, 0x99, 0x79, 0x7e, 0xbf, 0x39, 0xcb, +0x73, 0x9e, 0xf3, 0x9c, 0xe7, 0x9c, 0xf3, 0x3b, 0x33, 0x73, 0xce, 0x79, +0xa6, 0x33, 0x6f, 0x0c, 0x60, 0x12, 0x00, 0x21, 0x08, 0xc3, 0x40, 0x00, +0xdc, 0x83, 0x4a, 0x6b, 0x09, 0x0e, 0x2f, 0x03, 0x04, 0x00, 0x7a, 0x65, +0x73, 0x6b, 0x4b, 0xcb, 0xf5, 0x21, 0x07, 0xd1, 0x97, 0x11, 0x9c, 0x14, +0x1c, 0x84, 0xc2, 0x09, 0x08, 0x89, 0x06, 0x82, 0x06, 0x12, 0x0d, 0x04, +0x0d, 0x24, 0x1a, 0x08, 0x1a, 0x48, 0x34, 0x10, 0x34, 0x90, 0x68, 0x20, +0x68, 0x20, 0xd1, 0x40, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, +0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0x10, 0x12, 0x71, 0x69, +0x9b, 0x9a, 0xcb, 0x5a, 0x9b, 0x8e, 0xcd, 0xa6, 0xd5, 0xd6, 0x89, 0xcd, +0x60, 0x6e, 0x64, 0xac, 0x89, 0xb1, 0x8c, 0x01, 0x11, 0x21, 0x06, 0xbc, +0xb4, 0xd7, 0xfa, 0x8f, 0xc5, 0x53, 0xfd, 0x55, 0xb3, 0x71, 0xce, 0x6c, +0x9a, 0x2c, 0x3c, 0x80, 0x69, 0xb6, 0x02, 0x67, 0x3c, 0xed, 0xdc, 0x45, +0x63, 0x63, 0x2f, 0xe3, 0xe7, 0xfc, 0xb5, 0x9d, 0x27, 0x59, 0xa4, 0x17, +0x10, 0x62, 0x80, 0x21, 0xc4, 0x00, 0x43, 0x88, 0x01, 0x86, 0x10, 0x03, +0x0c, 0x21, 0x06, 0x18, 0x42, 0x9f, 0x66, 0x93, 0xcc, 0xbd, 0xee, 0x66, +0x66, 0x32, 0x73, 0xf4, 0x7a, 0x33, 0xa9, 0xfa, 0x31, 0xa3, 0x51, 0x8e, +0x1e, 0x0d, 0x60, 0x47, 0x78, 0x75, 0x7a, 0xb9, 0x2b, 0x4e, 0x57, 0x8c, +0xaa, 0x00, 0x1a, 0xed, 0x01, 0x54, 0x55, 0x00, 0xf9, 0x0b, 0x39, 0xf5, +0x97, 0xff, 0xfe, 0x0b, 0x13, 0xa0, 0x0a, 0xa0, 0x0a, 0xa0, 0x0a, 0xa0, +0x0a, 0xa0, 0x5e, 0x49, 0x78, 0x4f, 0x07, 0xdf, 0x09, 0x0f, 0x78, 0x0f, +0x78, 0x8f, 0x1a, 0x7e, 0xe3, 0xed, 0x5c, 0xef, 0xbe, 0xec, 0xe5, 0x6e, +0xe7, 0x0a, 0x0a, 0xc8, 0x3b, 0xb2, 0x13, 0x50, 0x05, 0x54, 0x01, 0x2d, +0x14, 0x14, 0x90, 0x7e, 0x94, 0x9f, 0xfc, 0xbd, 0xae, 0xce, 0x8d, 0x1f, +0xab, 0x3a, 0xb2, 0x1b, 0xaa, 0xa4, 0x2a, 0xa9, 0x4a, 0xd2, 0x2b, 0x71, +0x88, 0x9b, 0x9d, 0x74, 0xf0, 0x13, 0xbb, 0x2a, 0xfd, 0xf5, 0x42, 0xba, +0x4a, 0xc2, 0xed, 0x38, 0x79, 0x22, 0xb7, 0xf3, 0x08, 0x15, 0x07, 0x14, +0x05, 0x50, 0x14, 0x40, 0x51, 0x00, 0x45, 0x01, 0x14, 0x05, 0xfa, 0x47, +0xec, 0xbe, 0x43, 0x80, 0x82, 0x84, 0x08, 0x20, 0x02, 0x48, 0x21, 0xa2, +0x52, 0xa4, 0x50, 0x35, 0x5f, 0xaa, 0xb7, 0xf8, 0x10, 0x7a, 0xa2, 0x56, +0x97, 0x9f, 0x86, 0xde, 0x74, 0xbf, 0xb4, 0x33, 0xfa, 0x76, 0x3f, 0x4a, +0x35, 0x84, 0xb0, 0xd9, 0x05, 0xdd, 0x99, 0x3c, 0x94, 0xba, 0x4c, 0x5b, +0xe8, 0x42, 0xee, 0x9d, 0x82, 0x5e, 0xfc, 0xb3, 0xfe, 0x2d, 0x39, 0xfd, +0x9b, 0x3c, 0x94, 0xaa, 0x5a, 0x90, 0xca, 0x64, 0x5e, 0x24, 0x21, 0x50, +0xa5, 0xea, 0x43, 0x21, 0x84, 0x10, 0x98, 0xbc, 0xfa, 0x2b, 0x97, 0x3a, +0x27, 0xb4, 0x4b, 0x08, 0xd0, 0x56, 0xa7, 0x9a, 0xdc, 0xdc, 0xf3, 0xfd, +0x80, 0xd0, 0x4e, 0x8f, 0xd0, 0x39, 0x21, 0xe1, 0x55, 0x1d, 0x1d, 0xbd, +0x82, 0x48, 0x4e, 0xf2, 0xc5, 0x65, 0x79, 0xac, 0x83, 0xa7, 0x96, 0x8e, +0xc5, 0xd1, 0x51, 0x09, 0x9b, 0x5d, 0x20, 0x0d, 0x48, 0x5b, 0xe8, 0xc2, +0x27, 0x1e, 0x16, 0x48, 0x3f, 0xed, 0xa7, 0x2f, 0xef, 0xc1, 0x3d, 0x16, +0xd2, 0x02, 0xaf, 0xea, 0xe8, 0xe8, 0x84, 0xa8, 0x24, 0x1f, 0x93, 0x57, +0xca, 0xcf, 0x5b, 0xb1, 0x07, 0x63, 0x87, 0xc7, 0xa3, 0xd7, 0x28, 0xb4, +0xe9, 0x95, 0xa0, 0xad, 0x28, 0x8c, 0xe7, 0x16, 0xbb, 0x27, 0x76, 0xe9, +0x95, 0x40, 0x24, 0xa2, 0x52, 0x52, 0xa6, 0x50, 0x35, 0x5f, 0x61, 0xd5, +0x47, 0xe5, 0x65, 0xfd, 0xc9, 0x5e, 0xea, 0xcb, 0xe0, 0x0b, 0x35, 0xbc, +0x82, 0xb6, 0xbb, 0xc1, 0x42, 0x40, 0x90, 0x56, 0xe8, 0xc6, 0x9f, 0xce, +0xff, 0x6a, 0x2f, 0xc6, 0x99, 0x9c, 0x78, 0x05, 0x91, 0xc4, 0x9b, 0x16, +0x0a, 0x96, 0x44, 0xf2, 0x21, 0x38, 0xd1, 0xda, 0x2f, 0x2d, 0x65, 0x28, +0x84, 0xb6, 0x69, 0x68, 0x95, 0xe0, 0xfa, 0x01, 0xbe, 0xe8, 0xea, 0x41, +0x09, 0xe1, 0x21, 0x1c, 0x0d, 0xbd, 0xaa, 0xa3, 0xd0, 0x6b, 0x9e, 0xda, +0x32, 0xf7, 0x7f, 0xfb, 0x3f, 0x0f, 0x07, 0x4f, 0x27, 0xa0, 0xed, 0x6e, +0x90, 0x06, 0xa4, 0x15, 0xba, 0xe1, 0x3d, 0x0b, 0xc8, 0xbf, 0x5d, 0xfc, +0x24, 0xb7, 0x23, 0xf4, 0x9e, 0x0e, 0x9e, 0x34, 0xb1, 0xea, 0x2b, 0x4e, +0x6e, 0x3c, 0xe0, 0x44, 0xb3, 0xa2, 0xac, 0x38, 0xa1, 0x6d, 0x27, 0x04, +0xad, 0x2a, 0xc2, 0x4a, 0xcb, 0x1e, 0xd6, 0x49, 0x05, 0xa8, 0x10, 0x42, +0x98, 0x52, 0xb4, 0x22, 0xdc, 0x57, 0x3d, 0xdc, 0x7e, 0x61, 0x47, 0x4c, +0x5e, 0x8c, 0x4e, 0x72, 0x02, 0xda, 0x01, 0x48, 0xc1, 0x41, 0xd8, 0x15, +0x7b, 0x04, 0x6d, 0x00, 0x48, 0x2a, 0xc6, 0x70, 0x7b, 0xcd, 0x9f, 0xe3, +0x9b, 0xf3, 0xd5, 0x24, 0x30, 0x38, 0x49, 0x09, 0x54, 0xa9, 0xfa, 0xd4, +0x3d, 0x9a, 0xab, 0x20, 0xb8, 0x2a, 0xca, 0x2a, 0x6d, 0xd0, 0x5e, 0xda, +0xa8, 0x42, 0x54, 0x83, 0x7b, 0xfe, 0xe2, 0x79, 0x54, 0x01, 0xaa, 0x34, +0xf4, 0x55, 0xd6, 0xa8, 0x8e, 0xf6, 0x3f, 0xc8, 0x82, 0x83, 0xd0, 0x57, +0xe9, 0x50, 0xa5, 0x10, 0x76, 0x02, 0xa4, 0xbd, 0xe8, 0x0a, 0x69, 0x03, +0x80, 0xaf, 0xd2, 0xa1, 0x4a, 0x27, 0xd3, 0xf6, 0x00, 0x77, 0xef, 0xab, +0x70, 0xa8, 0x52, 0x08, 0x54, 0x2a, 0x85, 0xdb, 0xf1, 0xcd, 0xf3, 0x72, +0xc2, 0x8a, 0x93, 0x28, 0xb4, 0xd3, 0x09, 0xed, 0x47, 0x1b, 0xd1, 0x49, +0xac, 0x14, 0xd2, 0x39, 0x87, 0x28, 0xac, 0x10, 0x92, 0x30, 0x25, 0xdd, +0x70, 0xfb, 0x57, 0x25, 0x27, 0x20, 0x92, 0xa7, 0x21, 0x54, 0xc7, 0x44, +0xb1, 0x6a, 0x14, 0x5a, 0xed, 0x9d, 0x6e, 0x20, 0x97, 0x4a, 0x0b, 0x6c, +0xf6, 0x8d, 0x6a, 0x2d, 0x3d, 0x63, 0xa5, 0x66, 0xb6, 0x52, 0x27, 0x54, +0xd3, 0x78, 0x65, 0x3f, 0x52, 0xa5, 0x9a, 0x0a, 0x79, 0x86, 0x88, 0xae, +0x81, 0x5a, 0xa4, 0x2d, 0x74, 0x21, 0xa9, 0x18, 0x4b, 0x2a, 0x01, 0xec, +0x57, 0x9e, 0x82, 0x8f, 0xe1, 0x14, 0x68, 0xaa, 0xa8, 0x9d, 0x9d, 0xbe, +0xaf, 0x10, 0xc2, 0x23, 0x4c, 0x82, 0x5a, 0x59, 0x7b, 0xf7, 0x99, 0x6a, +0xee, 0x93, 0xbc, 0x4e, 0xad, 0x56, 0xab, 0x49, 0x70, 0xd9, 0xd5, 0x20, +0x20, 0x6d, 0x29, 0x80, 0xf7, 0x4a, 0xec, 0xfd, 0xd9, 0x1d, 0x04, 0x7a, +0x1a, 0xce, 0x3c, 0x47, 0x3c, 0x64, 0xf0, 0xcc, 0x01, 0x4e, 0xbc, 0x87, +0x83, 0x9f, 0xcb, 0x07, 0xd5, 0x81, 0xc4, 0x1d, 0xe7, 0x1c, 0xa1, 0x26, +0x21, 0x8f, 0x9c, 0xd7, 0x3e, 0xac, 0x86, 0x50, 0x0b, 0x0c, 0xc3, 0x39, +0xe4, 0x80, 0x1c, 0x58, 0x23, 0x02, 0xed, 0x8b, 0x2e, 0x78, 0x0f, 0x07, +0x4f, 0x27, 0x20, 0xaa, 0x51, 0x6f, 0x0f, 0xb3, 0x47, 0x4f, 0x9a, 0x8a, +0x5d, 0x2c, 0x3f, 0x12, 0x9d, 0x10, 0xb1, 0x59, 0x8b, 0x94, 0x88, 0x6b, +0xba, 0xec, 0x9a, 0x65, 0x33, 0x6b, 0x36, 0x9b, 0x52, 0x53, 0xa8, 0xb1, +0x59, 0xd2, 0x41, 0x68, 0x33, 0xe6, 0x10, 0x69, 0xe2, 0x37, 0x05, 0x17, +0x01, 0x51, 0xf5, 0x61, 0xe4, 0xeb, 0x9e, 0x86, 0x54, 0x61, 0x70, 0x10, +0xa6, 0xd2, 0x9b, 0x16, 0xd5, 0x7b, 0x4a, 0x51, 0x41, 0xc3, 0x68, 0x26, +0xff, 0x2e, 0x15, 0xa1, 0x99, 0xdf, 0xe1, 0xa6, 0x43, 0x85, 0x50, 0xab, +0x08, 0x84, 0xaa, 0x08, 0xc3, 0x69, 0xb5, 0xdf, 0x55, 0xe6, 0x2c, 0x54, +0x0e, 0xb8, 0x0a, 0x20, 0x74, 0x02, 0xda, 0xd5, 0x85, 0x94, 0xd5, 0x58, +0x50, 0x09, 0x60, 0x1e, 0xdc, 0xa9, 0x3e, 0x39, 0x25, 0x91, 0xbc, 0x12, +0xd5, 0xfb, 0x56, 0x35, 0xd5, 0x82, 0x93, 0x2a, 0xc9, 0x57, 0x45, 0x95, +0x87, 0xb3, 0xb2, 0xa8, 0x35, 0x9a, 0x42, 0x34, 0x85, 0x25, 0xa9, 0x51, +0x24, 0x50, 0x84, 0x36, 0x13, 0x40, 0xa2, 0x49, 0x90, 0xfb, 0x4a, 0x4a, +0x02, 0xa7, 0xee, 0x6a, 0xae, 0x72, 0x8f, 0x9e, 0x85, 0x80, 0xf0, 0x89, +0x0e, 0x1a, 0x12, 0x82, 0xd7, 0xc1, 0x4c, 0x0d, 0x01, 0xc5, 0x2c, 0x34, +0xe7, 0xae, 0xdf, 0x15, 0x5c, 0x08, 0x8e, 0xd5, 0x40, 0x30, 0x06, 0x84, +0x40, 0x09, 0x70, 0x74, 0x02, 0xda, 0xd5, 0x05, 0x9f, 0xe0, 0xa0, 0x54, +0x02, 0xf0, 0x9e, 0x17, 0x2f, 0xe0, 0x59, 0x08, 0x11, 0x5d, 0xc3, 0x96, +0x42, 0xd9, 0x95, 0xbc, 0x32, 0x3a, 0xa9, 0x38, 0x15, 0x06, 0x61, 0x59, +0x4e, 0x47, 0x47, 0xe9, 0x0a, 0x11, 0x07, 0x14, 0x14, 0x50, 0x68, 0xb3, +0xa2, 0x8c, 0x42, 0x20, 0xd2, 0x5d, 0xdc, 0xa5, 0x06, 0x27, 0x11, 0x59, +0x4f, 0xe9, 0x9a, 0x56, 0xab, 0xb2, 0x74, 0x10, 0xa6, 0x9c, 0x2d, 0xf8, +0x2a, 0x80, 0xd0, 0x39, 0x01, 0x27, 0x20, 0x02, 0x14, 0xa1, 0x08, 0x45, +0x28, 0x42, 0x11, 0x8a, 0x50, 0x84, 0x22, 0x14, 0xa1, 0x08, 0x45, 0x28, +0x42, 0x11, 0x8a, 0x30, 0xe5, 0x6c, 0x41, 0x29, 0x04, 0x90, 0xb2, 0x9b, +0x66, 0x2b, 0xf0, 0x2a, 0xc2, 0x12, 0x3d, 0x81, 0x4a, 0x57, 0x55, 0x02, +0x09, 0x61, 0xa2, 0x82, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, +0x92, 0x24, 0x49, 0x92, 0x09, 0x65, 0x12, 0x02, 0x09, 0x82, 0xef, 0xa5, +0xe1, 0x3a, 0xbf, 0x5e, 0x3a, 0x24, 0x2a, 0x01, 0xf8, 0x44, 0x87, 0x14, +0x28, 0x9d, 0x03, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, +0x49, 0x92, 0x24, 0x7d, 0x12, 0xc7, 0x44, 0x25, 0x00, 0x9f, 0x58, 0xe3, +0x57, 0x48, 0xa3, 0xaf, 0x75, 0x39, 0x44, 0x21, 0x10, 0x9d, 0x44, 0x28, +0x48, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, +0x19, 0x95, 0x51, 0x08, 0x44, 0x22, 0xff, 0x54, 0x42, 0x08, 0xdb, 0x53, +0x0c, 0xe6, 0x4a, 0x2a, 0x01, 0xa4, 0x2c, 0x46, 0xa7, 0x34, 0x87, 0x7e, +0x70, 0xf2, 0xc1, 0xf5, 0x9d, 0xc8, 0x3b, 0xe9, 0x0b, 0xe5, 0x85, 0x7d, +0x42, 0x9e, 0xe8, 0x13, 0xf2, 0x44, 0x9f, 0x90, 0x27, 0xfa, 0x84, 0x3c, +0xd1, 0x27, 0xe4, 0x89, 0x3e, 0x91, 0xb2, 0x18, 0x33, 0x95, 0x00, 0x52, +0x66, 0x89, 0xcb, 0x97, 0x29, 0x01, 0x3c, 0xc2, 0xe4, 0x84, 0x50, 0x94, +0x1e, 0x10, 0x12, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, +0x04, 0x41, 0x78, 0x08, 0x9f, 0xbc, 0x32, 0x41, 0xec, 0x59, 0x49, 0xe0, +0xc2, 0xd3, 0x21, 0x69, 0x38, 0x79, 0x28, 0xbd, 0xa7, 0x43, 0x22, 0xd0, +0xb9, 0xe4, 0x01, 0x25, 0x41, 0x10, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, +0x04, 0x41, 0x78, 0x4f, 0x87, 0xa4, 0x5d, 0x0b, 0xbc, 0xa2, 0x81, 0x5f, +0x99, 0x4a, 0x20, 0x9c, 0x58, 0xe9, 0x62, 0xf2, 0xca, 0x28, 0x8c, 0x4a, +0x21, 0x41, 0x10, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, +0x44, 0x14, 0x46, 0x21, 0x10, 0x89, 0xfc, 0x32, 0x85, 0x92, 0xb2, 0xbd, +0x9b, 0xd2, 0x5c, 0xa6, 0x05, 0x29, 0x8b, 0x31, 0x2b, 0xd0, 0x0a, 0x80, +0xfa, 0x00, 0x54, 0x71, 0x02, 0xda, 0x06, 0x34, 0x08, 0xa0, 0xef, 0x04, +0x44, 0xca, 0xce, 0x24, 0x53, 0x08, 0x20, 0x65, 0xa9, 0xf9, 0xe9, 0xc2, +0x09, 0x91, 0x5f, 0x5f, 0x51, 0x98, 0x68, 0x12, 0x44, 0xa2, 0x15, 0xad, +0x9c, 0x10, 0x09, 0x22, 0x59, 0x12, 0x00, 0xdf, 0x2d, 0x24, 0xb0, 0x8e, +0x1e, 0x9f, 0x0e, 0x89, 0x34, 0xf0, 0x89, 0x0e, 0x89, 0xb4, 0x02, 0x40, +0x00, 0xa4, 0x15, 0x00, 0x02, 0xa0, 0x10, 0x80, 0x4f, 0x74, 0x48, 0xb4, +0xc0, 0x27, 0xac, 0xf0, 0x3d, 0x14, 0x02, 0xfa, 0x51, 0xa7, 0x8c, 0x34, +0x91, 0x88, 0xb4, 0x52, 0xda, 0x2d, 0x04, 0xa2, 0x32, 0x2a, 0x81, 0xc8, +0x6c, 0x19, 0xae, 0x51, 0x28, 0x94, 0x07, 0xd1, 0xab, 0x6a, 0x91, 0x13, +0x97, 0x49, 0x83, 0x94, 0xc5, 0x98, 0x49, 0x2b, 0x00, 0x04, 0x40, 0x27, +0xa0, 0x6d, 0x80, 0x00, 0xe8, 0x04, 0x44, 0xca, 0xce, 0x24, 0x53, 0x08, +0x20, 0x65, 0x59, 0xba, 0xd3, 0x3f, 0x53, 0x65, 0x42, 0xc0, 0x5d, 0xed, +0x85, 0x8b, 0xc9, 0x09, 0x91, 0x20, 0x12, 0xad, 0x68, 0x25, 0x04, 0x12, +0x44, 0xb2, 0x24, 0xc0, 0xeb, 0x85, 0x44, 0xc3, 0x01, 0xe9, 0xa1, 0xf7, +0x98, 0x28, 0x04, 0xe0, 0x13, 0x1d, 0x12, 0x69, 0x05, 0x80, 0x00, 0x48, +0x2b, 0x00, 0x04, 0x40, 0x21, 0x00, 0x9f, 0xe8, 0x90, 0x68, 0xc1, 0x2c, +0xe1, 0xf0, 0xa1, 0x12, 0x69, 0x8a, 0x6f, 0x0e, 0x1a, 0x63, 0x21, 0x2c, +0x0a, 0x89, 0xf6, 0x28, 0xed, 0x16, 0x02, 0x51, 0x19, 0x95, 0x40, 0x74, +0x47, 0x76, 0xa2, 0x51, 0x29, 0x09, 0x67, 0xe1, 0x0c, 0x1e, 0xf1, 0x9a, +0x99, 0x16, 0x24, 0x97, 0x2d, 0x64, 0x89, 0x06, 0xaa, 0xe7, 0x00, 0x27, +0xba, 0x5b, 0x08, 0x6b, 0x09, 0x12, 0xd4, 0x83, 0x04, 0xf5, 0xa0, 0x2b, +0x48, 0x2e, 0x98, 0xcb, 0xcc, 0x01, 0x4e, 0x8e, 0x83, 0xbd, 0xce, 0x69, +0x08, 0x59, 0xc1, 0x92, 0xe0, 0x7d, 0x26, 0x9a, 0x04, 0x91, 0x84, 0x00, +0x8d, 0xd0, 0x3a, 0x41, 0x24, 0x4b, 0xba, 0x1f, 0x21, 0xd1, 0xd0, 0x27, +0xfe, 0x6e, 0x67, 0x7f, 0x44, 0xa4, 0x81, 0xf7, 0x74, 0x48, 0x14, 0x02, +0x20, 0x0d, 0x28, 0x84, 0x35, 0x41, 0x10, 0x04, 0x41, 0x78, 0x55, 0x47, +0x4f, 0x0b, 0x96, 0xd5, 0x9f, 0x3b, 0xcf, 0x2d, 0x28, 0x95, 0x40, 0x4c, +0x7e, 0xfb, 0x9a, 0x2c, 0x85, 0x32, 0xc6, 0x42, 0xa8, 0x04, 0x84, 0xd6, +0x85, 0x32, 0x2a, 0x81, 0xfc, 0x09, 0xab, 0x44, 0xa1, 0x14, 0xb1, 0x48, +0xd9, 0x9d, 0x8b, 0xdb, 0xee, 0xe0, 0xc4, 0xb9, 0x1b, 0xa4, 0x40, 0x43, +0x66, 0x0e, 0x70, 0x42, 0x25, 0x00, 0x0a, 0x61, 0x4d, 0x10, 0x04, 0x41, +0x10, 0x29, 0x88, 0x31, 0x53, 0xb8, 0x41, 0xe7, 0x6c, 0x2f, 0xc7, 0x1c, +0x0d, 0x41, 0x52, 0x02, 0x09, 0x65, 0xfa, 0xe4, 0xe0, 0x24, 0x01, 0x24, +0x21, 0x40, 0x23, 0xb4, 0x4e, 0x10, 0x09, 0x58, 0x5a, 0xb6, 0xfc, 0x10, +0x09, 0x20, 0x09, 0x09, 0xf8, 0x44, 0x87, 0x74, 0x72, 0x4e, 0x17, 0x71, +0x22, 0xf4, 0x89, 0x0e, 0x89, 0x42, 0x00, 0xa4, 0x01, 0x85, 0xb0, 0x26, +0x08, 0x82, 0x20, 0x08, 0x9f, 0xe8, 0x90, 0x12, 0x90, 0x6f, 0xbe, 0xfe, +0xf4, 0x2d, 0xf8, 0x04, 0x87, 0x44, 0x21, 0x10, 0x73, 0x88, 0xc3, 0xf2, +0x0a, 0xeb, 0x37, 0xcf, 0xe8, 0x24, 0x0a, 0x01, 0x27, 0x84, 0xd0, 0x3a, +0x3a, 0x89, 0xf2, 0xe4, 0xd9, 0x8c, 0x5c, 0xe9, 0x59, 0x46, 0x61, 0x74, +0x22, 0x39, 0x49, 0x41, 0x8d, 0x99, 0xca, 0x1f, 0xef, 0x79, 0x97, 0xc9, +0xd1, 0x10, 0x18, 0x1c, 0x84, 0xcc, 0x01, 0x4e, 0xe8, 0x04, 0xb4, 0x3f, +0x41, 0x10, 0x04, 0x41, 0xa4, 0x10, 0xcc, 0xe5, 0xf5, 0xca, 0x56, 0x1e, +0xbc, 0xf7, 0xb5, 0x93, 0x94, 0x9d, 0x49, 0x56, 0xb0, 0x24, 0x84, 0x89, +0xf8, 0xf3, 0x66, 0xef, 0x23, 0x41, 0x24, 0x27, 0x04, 0x8d, 0xd0, 0x3a, +0x41, 0xa4, 0xe5, 0xfb, 0xdd, 0x63, 0x12, 0x40, 0xa2, 0xa1, 0x4f, 0x74, +0x48, 0x24, 0x1c, 0x16, 0xbb, 0xfd, 0xf9, 0xd7, 0xf3, 0x2e, 0x3c, 0x85, +0x00, 0x48, 0x03, 0x0a, 0x61, 0x4d, 0x10, 0x04, 0x41, 0x10, 0x3e, 0x31, +0xaf, 0x1f, 0xf8, 0xe8, 0x63, 0xec, 0x0f, 0xef, 0xd0, 0xc0, 0x7b, 0x38, +0x78, 0xd2, 0xc4, 0xe4, 0xa3, 0xe5, 0x89, 0xbf, 0x21, 0x68, 0x51, 0x08, +0xa1, 0x04, 0x94, 0xd6, 0x51, 0xec, 0x23, 0xb8, 0x94, 0x6d, 0x21, 0x50, +0x14, 0x12, 0x85, 0x42, 0x99, 0xb2, 0x33, 0xc9, 0x14, 0x02, 0xf8, 0x74, +0x5e, 0xdf, 0xb8, 0xc0, 0xac, 0x3f, 0xf9, 0x71, 0x07, 0xff, 0x67, 0x31, +0xe6, 0x98, 0x61, 0xc8, 0x31, 0xc3, 0x90, 0x63, 0x86, 0x21, 0xc7, 0x0c, +0x43, 0x8e, 0x19, 0x86, 0x1c, 0x33, 0x0c, 0x39, 0x66, 0x18, 0x72, 0xcc, +0x88, 0xc8, 0xf9, 0xd1, 0x1b, 0xe1, 0x81, 0xb6, 0xc3, 0x8e, 0xe6, 0x4b, +0x0a, 0x01, 0xa4, 0x4c, 0x43, 0x96, 0x94, 0x40, 0x42, 0x99, 0x84, 0x00, +0x31, 0xd5, 0x88, 0xef, 0x65, 0x68, 0xe9, 0x18, 0xf0, 0x09, 0x40, 0x3d, +0x00, 0x15, 0x25, 0x15, 0x25, 0x15, 0x25, 0x15, 0x25, 0x15, 0x25, 0x15, +0x65, 0xba, 0x97, 0xcd, 0x97, 0x39, 0xe8, 0x84, 0x34, 0x0a, 0x20, 0x4e, +0x48, 0x78, 0x47, 0x07, 0x47, 0xaf, 0x20, 0x48, 0x83, 0xd3, 0xfb, 0xfe, +0xe9, 0x22, 0x0f, 0x21, 0xce, 0xa1, 0x53, 0xa0, 0x08, 0x29, 0x42, 0x8a, +0x90, 0x22, 0xa4, 0x08, 0x29, 0x42, 0x6e, 0x24, 0x59, 0x76, 0x39, 0xf8, +0x86, 0x67, 0xa1, 0x8a, 0x57, 0x10, 0x14, 0x02, 0xf0, 0x0a, 0x07, 0xa1, +0x57, 0x22, 0x96, 0x2e, 0x96, 0x4e, 0x28, 0x04, 0xee, 0x89, 0x97, 0x75, +0x82, 0x31, 0x3a, 0x89, 0x91, 0x88, 0x11, 0x88, 0x11, 0x88, 0x11, 0x88, +0x11, 0x88, 0x11, 0x88, 0xee, 0xc4, 0xf5, 0xe1, 0xfd, 0x9d, 0xc7, 0x85, +0x57, 0x42, 0x09, 0x44, 0xa5, 0x38, 0x91, 0x94, 0x29, 0x27, 0xf3, 0x39, +0x66, 0x35, 0xe6, 0x98, 0x61, 0xc8, 0x31, 0xe3, 0x1c, 0x6e, 0xbb, 0xd3, +0xe4, 0xc9, 0x0b, 0xa7, 0x71, 0x03, 0xf9, 0x8f, 0x0c, 0x43, 0x8e, 0x19, +0x86, 0x1c, 0x33, 0x0c, 0x39, 0x66, 0x18, 0x72, 0xcc, 0x30, 0xe4, 0x45, +0xc6, 0xb2, 0xff, 0xdb, 0xbf, 0xf9, 0x5b, 0x80, 0x21, 0x47, 0x07, 0x43, +0x88, 0x02, 0x83, 0x8b, 0xa4, 0x41, 0x14, 0x9c, 0x10, 0x25, 0x39, 0xa4, +0x40, 0x70, 0x3e, 0x20, 0x54, 0x07, 0x40, 0xb1, 0x2b, 0xba, 0xc7, 0x4b, +0x23, 0x42, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0xc9, 0x4f, +0x22, 0x7e, 0xec, 0xc2, 0x95, 0x04, 0x0a, 0x42, 0x0a, 0x42, 0x0a, 0x42, +0x0a, 0x42, 0x2a, 0x09, 0x78, 0x51, 0x47, 0xe9, 0x86, 0x02, 0xaa, 0x80, +0x2a, 0xa0, 0x85, 0x82, 0x02, 0x76, 0x56, 0x1f, 0xfc, 0xf3, 0xe3, 0xde, +0xd9, 0x7e, 0xba, 0xe2, 0x16, 0x59, 0x43, 0x9f, 0x2b, 0x56, 0xd0, 0x95, +0xe2, 0x2e, 0xb4, 0x67, 0x57, 0x7d, 0xa4, 0xbb, 0x8f, 0x73, 0x96, 0xc5, +0x55, 0x09, 0x0e, 0xec, 0x8a, 0x2a, 0xa9, 0x4a, 0xaa, 0x92, 0xaa, 0x24, +0x85, 0x40, 0xe1, 0x35, 0x8b, 0x30, 0x08, 0xe0, 0x48, 0x88, 0x00, 0x22, +0xb8, 0xec, 0x7f, 0xff, 0xb1, 0x5f, 0xba, 0x68, 0x2e, 0x29, 0x59, 0x10, +0xd9, 0x32, 0x5c, 0x72, 0xe7, 0xa4, 0x1a, 0x17, 0x13, 0xff, 0xeb, 0x77, +0x3e, 0xe9, 0x96, 0x02, 0x44, 0x00, 0x11, 0x40, 0x04, 0x10, 0x01, 0x44, +0x00, 0x71, 0x22, 0x92, 0xef, 0xd3, 0x40, 0x28, 0x01, 0x48, 0x34, 0x10, +0x34, 0x90, 0x68, 0x20, 0x68, 0x20, 0xd1, 0x40, 0xd0, 0x40, 0xa2, 0x81, +0xa0, 0x81, 0x44, 0x03, 0x41, 0x03, 0x89, 0x06, 0x82, 0x06, 0x12, 0x0d, +0x04, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x01, 0xf9, 0xd5, 0xa7, 0xe1, 0xfc, 0x9a, +0xed, 0xe9, 0xd0, 0xbb, 0xf0, 0xac, 0xf4, 0x35, 0xd5, 0x5a, 0x87, 0xdc, +0x52, 0xeb, 0xc0, 0x3f, 0x4b, 0xf9, 0x28, 0xef, 0xad, 0x9e, 0xd5, 0x8a, +0x91, 0xd1, 0x84, 0x7b, 0x13, 0x77, 0x0e, 0x2d, 0xc7, 0x25, 0xb5, 0xa6, +0xa5, 0x56, 0xe3, 0x08, 0x4d, 0x4b, 0xad, 0x46, 0x70, 0xe7, 0x2d, 0x6d, +0x9e, 0xa5, 0x6c, 0x37, 0x8b, 0x6a, 0xe0, 0x74, 0x59, 0x78, 0x8a, 0x1a, +0x83, 0x4c, 0x3d, 0x1d, 0xfd, 0x7f, 0xf4, 0xee, 0x77, 0xbd, 0xdb, 0x5d, +0x89, 0xb1, 0x74, 0xe6, 0x77, 0xa5, 0xf7, 0x0a, 0x3d, 0x83, 0x2a, 0x7a, +0xe8, 0xe9, 0x96, 0xf4, 0xd0, 0xdd, 0xbd, 0x44, 0xbb, 0xe4, 0xd6, 0xff, +0xd5, 0xfc, 0xdb, 0x58, 0xcc, 0x37, 0xe7, 0xf9, 0xf0, 0x49, 0x2e, 0x66, +0x7f, 0xf5, 0x17, 0xee, 0x7d, 0x86, 0x31, 0x3c, 0xbc, 0x18, 0x1e, 0x8e, +0xc3, 0xc3, 0xbb, 0xc3, 0xc3, 0x1f, 0x0e, 0xff, 0xcc, 0xb3, 0xfe, 0x0f, +0x6d, 0xb0, 0x1a, 0x3b, 0xbc, 0x18, 0x1e, 0xfe, 0x79, 0x78, 0xcd, 0xab, +0x8b, 0x5f, 0x43, 0xbb, 0x35, 0x6e, 0x67, 0x61, 0x53, 0x63, 0xdb, 0xfc, +0x65, 0x2e, 0x7d, 0xc6, 0xab, 0x67, 0xa7, 0x55, 0xdb, 0x43, 0xe1, 0x56, +0xa7, 0x74, 0xc7, 0x23, 0x13, 0x28, 0x44, 0xf5, 0xbf, 0x69, 0x6e, 0xfd, +0x34, 0x07, 0xde, 0xfb, 0xf1, 0x5b, 0x06, 0xe7, 0xcb, 0xea, 0xa4, 0x53, +0xee, 0x0e, 0xab, 0xb4, 0xf3, 0x8c, 0x78, 0xd0, 0xd7, 0xbe, 0xd0, 0xcd, +0xe2, 0x5f, 0x1c, 0xf5, 0x44, 0x9f, 0xbf, 0x60, 0xb3, 0xc5, 0xf2, 0x6a, +0x3d, 0x6d, 0x6e, 0x18, 0xe3, 0x3a, 0xab, 0x43, 0x0b, 0x30, 0xe7, 0x68, +0x57, 0xda, 0x89, 0xfe, 0xe9, 0x50, 0x10, 0xdf, 0xef, 0x73, 0x67, 0xd6, +0xf9, 0xec, 0x4f, 0x3f, 0x21, 0x73, 0x24, 0x0f, 0xcf, 0xfd, 0xd5, 0xbc, +0x5b, 0x1f, 0xcf, 0x59, 0x95, 0xa5, 0x6c, 0xfa, 0x76, 0x66, 0x4e, 0x6d, +0x79, 0x75, 0xdf, 0xb7, 0x5d, 0x1e, 0xa0, 0x68, 0xd9, 0x60, 0xce, 0x06, +0x1b, 0xda, 0xc1, 0xc1, 0x85, 0x46, 0x2e, 0x8f, 0xd1, 0xcd, 0xde, 0x09, +0x61, 0x89, 0x76, 0xc9, 0xd6, 0x9b, 0x5c, 0x1d, 0x9e, 0x79, 0xcc, 0xda, +0xa6, 0x76, 0x7a, 0xe9, 0xdd, 0x3d, 0x4d, 0x6b, 0x7a, 0x75, 0x30, 0xbb, +0xd3, 0x7b, 0x5f, 0xef, 0xed, 0xa5, 0x7f, 0xac, 0xff, 0x61, 0xa7, 0xbd, +0x97, 0x93, 0xdf, 0x28, 0xbd, 0x48, 0x7e, 0xb5, 0x62, 0xed, 0xaf, 0xda, +0xb3, 0x9f, 0x78, 0xd8, 0x6a, 0xad, 0xc2, 0x1a, 0xda, 0xad, 0xa5, 0xfa, +0x2d, 0x7f, 0x7e, 0xea, 0x36, 0xa7, 0x2b, 0x96, 0x66, 0x27, 0x87, 0xbc, +0xc1, 0xb3, 0x0d, 0xbc, 0xe2, 0x5e, 0xfb, 0xa0, 0xe5, 0xf7, 0xe8, 0xff, +0xe9, 0x9a, 0x23, 0x2a, 0x63, 0x77, 0x7d, 0x79, 0xc7, 0x05, 0xfc, 0x4f, +0xaf, 0x8a, 0xb0, 0x4a, 0x3b, 0xcf, 0xd8, 0x66, 0xfe, 0x4b, 0x5f, 0xf4, +0xf5, 0xbe, 0x79, 0x6b, 0xe3, 0xf1, 0xed, 0xc5, 0x8c, 0x51, 0xd7, 0x4f, +0xbb, 0xb1, 0xd7, 0xe5, 0xe0, 0x66, 0x27, 0x2f, 0xe6, 0x1e, 0x58, 0x34, +0x2a, 0x9b, 0xa2, 0x76, 0xc7, 0x93, 0xa5, 0x2d, 0x6c, 0xbe, 0x57, 0xff, +0xe0, 0xa1, 0xf7, 0x87, 0xdd, 0xf9, 0xa0, 0x1c, 0x9d, 0x3e, 0xd9, 0xf3, +0x3c, 0xe1, 0x6a, 0xe4, 0xaa, 0x2c, 0x65, 0xa3, 0x7e, 0xab, 0xdd, 0x3b, +0xb1, 0x77, 0xe4, 0xec, 0xad, 0x84, 0xe7, 0x08, 0xcf, 0xae, 0x6d, 0xe5, +0x7f, 0x94, 0x5e, 0x97, 0xff, 0x8a, 0x7c, 0xb6, 0x7e, 0x77, 0xf7, 0x98, +0x35, 0xee, 0xfa, 0xee, 0x16, 0x76, 0xb1, 0x6b, 0x37, 0x57, 0x5f, 0x1e, +0xbb, 0xb5, 0x24, 0x95, 0xbd, 0x67, 0xbd, 0xfa, 0x7f, 0x2e, 0x2c, 0xd1, +0x2e, 0x79, 0x22, 0x8f, 0xec, 0x7d, 0x53, 0x59, 0xaf, 0xd7, 0x79, 0xe9, +0x76, 0x9f, 0x9d, 0xeb, 0xf5, 0x35, 0x47, 0xb4, 0x1d, 0xc3, 0xeb, 0x74, +0x9c, 0xb6, 0x1c, 0x71, 0xb6, 0xe1, 0x72, 0x72, 0x4e, 0x40, 0x84, 0x15, +0xcb, 0x32, 0xf8, 0xa6, 0xde, 0x3e, 0x99, 0x2b, 0xb7, 0x86, 0x66, 0xc7, +0xaf, 0x5c, 0xd7, 0x7a, 0xaa, 0x9f, 0xea, 0xa7, 0x83, 0x8e, 0x31, 0xbd, +0x8b, 0x74, 0x46, 0x73, 0x4a, 0xa8, 0x80, 0xbb, 0x2b, 0xae, 0x64, 0x77, +0x32, 0x99, 0x66, 0xc0, 0x97, 0xbe, 0xbe, 0xe6, 0xdf, 0xd3, 0xaf, 0x32, +0xf2, 0x1f, 0x54, 0xfd, 0x89, 0x20, 0xbe, 0x2c, 0x43, 0xcd, 0xae, 0xbd, +0x3f, 0x5e, 0xef, 0xd6, 0xef, 0xf1, 0x77, 0xb7, 0x66, 0xd9, 0xd8, 0xad, +0xf5, 0xc7, 0x6c, 0x75, 0xce, 0xd9, 0xba, 0xe1, 0x4f, 0xe9, 0xed, 0xbb, +0xb1, 0x61, 0x8c, 0xeb, 0x5c, 0xed, 0xc5, 0x3d, 0x84, 0x96, 0x41, 0xae, +0xaf, 0x39, 0x79, 0xea, 0xf2, 0xde, 0xef, 0xb6, 0x94, 0xd2, 0x97, 0x43, +0xbb, 0x3f, 0xba, 0x72, 0xb3, 0x16, 0x9c, 0xd0, 0x2e, 0x8e, 0xe0, 0xc2, +0x88, 0x20, 0xa5, 0xba, 0x2b, 0xf4, 0xe3, 0x9f, 0xae, 0x1e, 0x16, 0x9c, +0x89, 0x96, 0x2e, 0xd4, 0xda, 0xb7, 0xca, 0x58, 0xb7, 0x02, 0xba, 0xd1, +0x72, 0x68, 0x09, 0x5a, 0x64, 0x8b, 0x6c, 0x91, 0x2d, 0x72, 0xd8, 0x6a, +0x0d, 0x07, 0xd1, 0xd2, 0x85, 0xd5, 0x65, 0x0c, 0x6a, 0x56, 0x47, 0x79, +0x88, 0x92, 0x5d, 0xe5, 0x5d, 0x78, 0x53, 0xbd, 0x2b, 0xfd, 0x9a, 0x4c, +0x97, 0x1a, 0x34, 0xd4, 0xa0, 0xa1, 0x06, 0x0d, 0x35, 0x68, 0xa8, 0x41, +0x43, 0x8d, 0xee, 0x9f, 0xa9, 0x40, 0x83, 0x5f, 0xd4, 0xda, 0x67, 0xf3, +0x8c, 0x9b, 0x77, 0x5c, 0x41, 0xc9, 0xb2, 0xd6, 0x77, 0xce, 0xdd, 0xb7, +0xed, 0xfe, 0x7c, 0xae, 0x0d, 0x25, 0xc7, 0x72, 0xff, 0x03, 0x96, 0xa7, +0xbf, 0x9e, 0xb1, 0xdc, 0x9b, 0xe3, 0xb7, 0xf7, 0x69, 0x12, 0xb7, 0xdf, +0xff, 0xe6, 0xc6, 0xa8, 0x99, 0xcf, 0x36, 0xde, 0x6e, 0xf4, 0xd9, 0x61, +0x74, 0xce, 0x59, 0x3f, 0xef, 0xf2, 0x72, 0xdc, 0x78, 0xbe, 0x55, 0xa3, +0x8d, 0x16, 0xea, 0x1c, 0xec, 0x9a, 0x5c, 0x76, 0x44, 0x17, 0x9c, 0x5f, +0x50, 0x52, 0xef, 0x9e, 0xe1, 0xf6, 0xa1, 0x34, 0x57, 0x58, 0x7e, 0xed, +0xfe, 0x2e, 0x8a, 0x65, 0xba, 0x6b, 0x37, 0x71, 0x9c, 0x73, 0x1d, 0xc7, +0xa6, 0x1f, 0xad, 0xb1, 0xbb, 0xba, 0xd6, 0x56, 0xdb, 0x55, 0xfd, 0x0a, +0xc2, 0xc8, 0xa7, 0xab, 0xdb, 0xd7, 0x05, 0x54, 0xca, 0x86, 0x3b, 0xc2, +0xad, 0x93, 0x75, 0xad, 0x2f, 0x0f, 0x7a, 0x03, 0x1b, 0x31, 0xb8, 0xb2, +0xb1, 0x9c, 0x9a, 0xa3, 0x52, 0xe9, 0x77, 0x02, 0xe5, 0xd1, 0x66, 0x86, +0xa6, 0x85, 0xfe, 0xce, 0xc0, 0x81, 0xb2, 0xe2, 0xd6, 0xee, 0x5b, 0xba, +0xd3, 0x47, 0x7d, 0x0d, 0xad, 0x0c, 0x8c, 0xe4, 0x80, 0x93, 0xca, 0x5a, +0x44, 0x31, 0xa4, 0x44, 0x2f, 0x30, 0x3d, 0x75, 0xd5, 0xb5, 0x21, 0x75, +0xfb, 0x8d, 0xe4, 0x91, 0x73, 0x3c, 0x4f, 0x7c, 0xb2, 0x87, 0x45, 0x57, +0x39, 0xe0, 0x36, 0x2e, 0xc4, 0xec, 0x8e, 0x2a, 0x9f, 0x3d, 0x5d, 0xdf, +0x5e, 0x71, 0xad, 0x38, 0xa2, 0xa3, 0x7e, 0xa7, 0x1b, 0x9f, 0x14, 0x3b, +0x50, 0x63, 0x5a, 0xec, 0x4d, 0x8d, 0xdf, 0xfa, 0xc0, 0x75, 0xbc, 0xfe, +0x88, 0x43, 0xe9, 0xaa, 0xc5, 0xfd, 0xf7, 0x7e, 0x7e, 0x55, 0x96, 0xb2, +0x53, 0x79, 0xb5, 0xae, 0x46, 0xa9, 0xc9, 0x61, 0x15, 0xff, 0x28, 0xf5, +0x7d, 0x8c, 0x3f, 0x3d, 0xa1, 0x4e, 0xb9, 0x55, 0x30, 0x8d, 0x03, 0x59, +0x80, 0xb9, 0xfa, 0x67, 0xbb, 0x66, 0x8e, 0x2f, 0x32, 0xb2, 0xb6, 0x95, +0xb1, 0x9f, 0xd1, 0x2b, 0x15, 0x61, 0x7c, 0xbb, 0x64, 0x51, 0xff, 0xdb, +0xd2, 0x0f, 0xfb, 0xe5, 0x78, 0xfe, 0xd2, 0xb7, 0x0f, 0x9a, 0xdd, 0x9b, +0x2c, 0x27, 0x4d, 0x2f, 0x85, 0x65, 0x17, 0x8e, 0xf0, 0x76, 0x4f, 0xa8, +0xa0, 0x7a, 0xeb, 0xb6, 0x7b, 0xf1, 0x68, 0x86, 0xce, 0x7f, 0x20, 0x4a, +0x59, 0xef, 0xcf, 0xa3, 0xf3, 0x5e, 0xfd, 0xca, 0xab, 0xb2, 0x5b, 0xb3, +0x6d, 0x37, 0x8d, 0xf9, 0xf3, 0x99, 0x54, 0x56, 0xa6, 0x75, 0x4f, 0x8b, +0xbd, 0xc2, 0x02, 0xa8, 0x08, 0x46, 0x15, 0xa9, 0x5d, 0xb8, 0xc6, 0xa4, +0xef, 0x9f, 0xfb, 0x41, 0x89, 0xa1, 0xd5, 0x8e, 0xe9, 0x98, 0x52, 0x1e, +0x78, 0xc1, 0x61, 0xe1, 0x5c, 0x1a, 0x61, 0x68, 0x5a, 0x90, 0x76, 0xc9, +0x51, 0x25, 0x58, 0x92, 0x25, 0x62, 0x20, 0x83, 0x2f, 0x4a, 0x6d, 0x87, +0xb2, 0xd2, 0x94, 0x17, 0x5f, 0xe8, 0xc9, 0xdf, 0x14, 0xe3, 0x9e, 0x8d, +0xc8, 0x56, 0x69, 0xfc, 0xd6, 0xb9, 0xf1, 0x22, 0x45, 0x4f, 0xaf, 0xf6, +0x32, 0x81, 0x24, 0x1a, 0xa4, 0x56, 0x38, 0xaa, 0x94, 0xc6, 0xfc, 0xfd, +0x85, 0x63, 0x65, 0x25, 0x8c, 0x6c, 0xa7, 0x34, 0x1e, 0x8e, 0xec, 0x78, +0xfb, 0xc8, 0x39, 0x9f, 0xd0, 0xf3, 0x2d, 0xfe, 0x64, 0x4e, 0x9e, 0xf9, +0xcd, 0xa3, 0x28, 0xb6, 0xaf, 0xf1, 0xc5, 0x84, 0xf6, 0x91, 0x6f, 0x6b, +0xa2, 0xf6, 0xd4, 0x05, 0x2d, 0xa3, 0x6f, 0x55, 0x5d, 0x93, 0xfa, 0xfd, +0x3f, 0x75, 0xe9, 0x1b, 0xff, 0x28, 0x27, 0x69, 0x73, 0xd4, 0x68, 0xe4, +0xd2, 0xd3, 0x51, 0x03, 0x95, 0x5d, 0xab, 0xfa, 0x1a, 0x1a, 0x6b, 0xeb, +0x15, 0xba, 0xf8, 0x99, 0xc5, 0xf4, 0xc2, 0x0b, 0x29, 0xb2, 0xf0, 0xa2, +0x33, 0xda, 0xed, 0x76, 0xbb, 0xdd, 0x6e, 0xb7, 0xdb, 0xed, 0x76, 0x7b, +0xdb, 0x93, 0x0f, 0x7c, 0x7d, 0x9b, 0x53, 0x1d, 0x54, 0x84, 0x66, 0x5b, +0x9d, 0xf1, 0x43, 0xb9, 0xff, 0x86, 0x8a, 0xae, 0xa5, 0xfa, 0xa4, 0xf2, +0x5d, 0x3f, 0x7e, 0xe3, 0x12, 0x46, 0x61, 0x6a, 0xea, 0x42, 0x8f, 0x8f, +0x5a, 0x50, 0x10, 0xc9, 0x1d, 0x9e, 0xf4, 0xd4, 0xfd, 0x54, 0xed, 0xdb, +0x6e, 0x95, 0xa5, 0xfe, 0xc9, 0xc8, 0xac, 0xfe, 0x2b, 0xac, 0x45, 0x30, +0x29, 0x66, 0xb4, 0xdb, 0x6d, 0x8d, 0x99, 0x79, 0x97, 0xbf, 0x5e, 0x15, +0x4f, 0x05, 0x49, 0xba, 0x93, 0x7b, 0x37, 0x92, 0x76, 0xbb, 0xdd, 0x16, +0xeb, 0x61, 0xfc, 0x45, 0x77, 0xf1, 0x6a, 0x3e, 0xa9, 0x75, 0x1b, 0x75, +0x53, 0x1b, 0xa5, 0x55, 0x6f, 0xe1, 0xab, 0x96, 0xd1, 0x0f, 0x7e, 0xcd, +0x8b, 0x39, 0x1a, 0xf5, 0x84, 0x5f, 0x46, 0x97, 0xb8, 0xd7, 0xac, 0x9f, +0x0e, 0xb5, 0xba, 0xa5, 0xb5, 0x86, 0xa6, 0x26, 0x7d, 0xa5, 0xae, 0xe6, +0xa0, 0x3e, 0x7a, 0x5b, 0xa7, 0xad, 0xc3, 0x7c, 0x3a, 0x06, 0xa7, 0x6a, +0x68, 0x1a, 0xdd, 0x43, 0x1a, 0xf2, 0x4f, 0x5f, 0xfe, 0xdb, 0xbd, 0x67, +0x3d, 0xbd, 0xd1, 0x8c, 0xf6, 0xce, 0x61, 0xc5, 0x89, 0x9e, 0x21, 0x0d, +0x79, 0xe2, 0x90, 0x86, 0x94, 0x62, 0x48, 0x8f, 0x04, 0xf9, 0xe4, 0xbd, +0xf3, 0x61, 0x8b, 0xe3, 0xeb, 0x8b, 0xcd, 0x0f, 0x8d, 0xb5, 0x8c, 0xdc, +0xc2, 0xf1, 0xe6, 0xdd, 0x9c, 0x7f, 0xc9, 0x7a, 0x50, 0xae, 0x6d, 0xf6, +0x4d, 0x78, 0xf3, 0xee, 0x7f, 0xed, 0xf1, 0xb1, 0xe3, 0x1e, 0x60, 0x52, +0xff, 0xe4, 0xc6, 0xc4, 0xdb, 0xfa, 0xfb, 0x07, 0xbb, 0xb6, 0x76, 0xbc, +0x89, 0xb9, 0x3f, 0x1c, 0xff, 0x77, 0x57, 0x7e, 0xb1, 0x76, 0x7c, 0x73, +0x53, 0x96, 0x3f, 0x7c, 0x3d, 0xcd, 0xca, 0x8b, 0xd3, 0xa7, 0x9a, 0xf6, +0xfa, 0xb1, 0xbf, 0x9f, 0x50, 0x3f, 0xec, 0xda, 0xcf, 0xb2, 0xab, 0x6b, +0xed, 0x11, 0x2f, 0x1d, 0x12, 0xfb, 0xf2, 0x3b, 0x6c, 0x7c, 0x63, 0x9a, +0x7d, 0xb8, 0x5a, 0x3f, 0x5c, 0xff, 0xd5, 0x09, 0xff, 0x32, 0x65, 0x36, +0xf8, 0x07, 0x77, 0x2a, 0x9d, 0xb7, 0x3a, 0xf8, 0xee, 0x2d, 0xfd, 0xc7, +0x65, 0x1d, 0x9d, 0x5a, 0x59, 0x8f, 0xa7, 0xe7, 0xda, 0xd6, 0x5b, 0x6b, +0xbf, 0x47, 0xda, 0x9f, 0x5a, 0x3d, 0x14, 0xeb, 0x5e, 0xfb, 0x33, 0x3b, +0x93, 0xa9, 0xe7, 0xfa, 0xc6, 0xd2, 0xa4, 0xc6, 0x0c, 0x76, 0x3f, 0xf7, +0x14, 0x1e, 0xa1, 0x1c, 0x3c, 0x81, 0xd9, 0x94, 0xc9, 0x2f, 0xd8, 0x73, +0xf0, 0xd5, 0x1d, 0x9d, 0x38, 0x9c, 0x6d, 0x86, 0xf8, 0xe1, 0x62, 0xfa, +0xf0, 0x47, 0xf6, 0x66, 0x8e, 0xb6, 0x3d, 0x3c, 0xff, 0xc6, 0xae, 0xc4, +0x7e, 0x95, 0x73, 0x11, 0xd9, 0xff, 0x7e, 0x46, 0x1b, 0x95, 0xeb, 0x10, +0xd9, 0xda, 0x71, 0xf7, 0x13, 0xc5, 0xd1, 0x1b, 0xe8, 0xcb, 0x96, 0x7a, +0xc9, 0x97, 0xb8, 0xbe, 0x32, 0xdd, 0xdb, 0x22, 0x7c, 0xfc, 0x52, 0xc7, +0x73, 0xfc, 0xd5, 0xaf, 0xd7, 0xcd, 0x9c, 0x72, 0xca, 0xe8, 0x7e, 0x99, +0x7d, 0x67, 0x1f, 0x7f, 0xf9, 0xca, 0x9e, 0xf7, 0x2c, 0xdf, 0x5e, 0xb9, +0x3c, 0x38, 0x31, 0xa0, 0xee, 0x23, 0xe3, 0x9b, 0xad, 0xc1, 0xa9, 0x61, +0x7f, 0x6b, 0xcd, 0x58, 0x66, 0xe5, 0x95, 0x8b, 0xa2, 0xff, 0x1f, 0xc6, +0x7c, 0xc1, 0xdf, 0xd3, 0x5f, 0x18, 0xf3, 0xdd, 0xac, 0xcb, 0x7f, 0x39, +0x3c, 0x30, 0x18, 0x9e, 0x0c, 0xae, 0x5b, 0x73, 0x9d, 0x17, 0x3e, 0x44, +0x77, 0xfa, 0xd0, 0x60, 0x3c, 0x78, 0xe7, 0x13, 0xbf, 0x9d, 0xca, 0x84, +0x95, 0x9e, 0x7f, 0x78, 0x79, 0xad, 0x63, 0x56, 0xd8, 0x84, 0xd4, 0x3a, +0xe5, 0x9b, 0x29, 0xdd, 0xe3, 0xa2, 0x67, 0x3c, 0x21, 0x8e, 0x27, 0x0c, +0x9d, 0x4d, 0xfb, 0xfd, 0x72, 0xb0, 0x1a, 0xf4, 0x79, 0x1f, 0x78, 0x9b, +0xb7, 0xa8, 0xd5, 0x8f, 0x8d, 0x75, 0x74, 0x76, 0x6d, 0xff, 0xe2, 0xf8, +0xa3, 0xc7, 0xee, 0x8e, 0x8b, 0xe9, 0x33, 0x8a, 0x8e, 0x1b, 0x83, 0xbd, +0x1f, 0x3e, 0xe7, 0xb3, 0xb6, 0xeb, 0xdd, 0x9b, 0x9f, 0x5d, 0xcc, 0x69, +0xc6, 0x62, 0x8f, 0x5b, 0x9f, 0x77, 0xb3, 0xbe, 0xb3, 0xcf, 0x9d, 0xfc, +0xff, 0x46, 0x5e, 0x0f, 0x70, 0xf8, 0xfb, 0xd6, 0xd7, 0x3c, 0xbc, 0x5a, +0xce, 0xad, 0x7d, 0xcd, 0x39, 0x67, 0xfd, 0x3d, 0x97, 0x27, 0x6f, 0xfa, +0x66, 0x76, 0xfb, 0x32, 0x82, 0xdb, 0x91, 0xdb, 0xb9, 0xc9, 0xe7, 0xee, +0x70, 0xe2, 0x60, 0xf7, 0xb6, 0xd3, 0x43, 0xf8, 0xe2, 0xdb, 0x9a, 0xb7, +0x6c, 0xb1, 0xed, 0xf7, 0x6f, 0xf1, 0xde, 0x7d, 0x64, 0x77, 0x07, 0xd3, +0xa7, 0x36, 0xfc, 0xe6, 0xa6, 0x26, 0xd7, 0x3e, 0x3a, 0x86, 0x8f, 0x9d, +0x11, 0x5d, 0x2b, 0xa3, 0x38, 0xc8, 0xc6, 0x75, 0x38, 0xfb, 0x0c, 0x99, +0xd3, 0xb3, 0xbf, 0xce, 0xba, 0x8d, 0xa7, 0x8f, 0xed, 0xde, 0x0d, 0x36, +0xaf, 0xa5, 0x70, 0x4c, 0xf7, 0xef, 0x7f, 0x7d, 0xab, 0xe3, 0x1b, 0x72, +0xa0, 0xbc, 0x36, 0xc7, 0x38, 0x2c, 0xdc, 0xed, 0xef, 0x4f, 0x7e, 0xe9, +0x06, 0xaf, 0x0f, 0x78, 0xf9, 0xe0, 0xf6, 0x8f, 0x1e, 0xea, 0xb8, 0x9b, +0x78, 0x87, 0xdb, 0x27, 0x75, 0x55, 0xde, 0x39, 0x68, 0x15, 0xef, 0x08, +0xf9, 0xaf, 0x1b, 0x1d, 0xfa, 0xcc, 0xcd, 0x71, 0x71, 0x00, 0xdc, 0x2e, +0xbf, 0xc0, 0x2f, 0x73, 0x60, 0x9f, 0x73, 0xf4, 0x1f, 0x93, 0xf9, 0x0b, +0xf6, 0x8f, 0xdb, 0xfb, 0x12, 0x3e, 0x8a, 0x83, 0x00, 0xa7, 0x1b, 0x6f, +0x76, 0x40, 0x5c, 0xe7, 0x7f, 0x02, 0xb9, 0xf3, 0x85, 0x79, 0x6b, 0x0f, +0x79, 0x6b, 0x79 diff --git a/ktx/external/basisu/contrib/single_file_transcoder/examples/testcard.png b/ktx/external/basisu/contrib/single_file_transcoder/examples/testcard.png new file mode 100644 index 0000000..9291070 Binary files /dev/null and b/ktx/external/basisu/contrib/single_file_transcoder/examples/testcard.png differ diff --git a/ktx/external/basisu/encoder/basisu_backend.cpp b/ktx/external/basisu/encoder/basisu_backend.cpp new file mode 100644 index 0000000..abb6175 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_backend.cpp @@ -0,0 +1,1778 @@ +// basisu_backend.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +// +// TODO: This code originally supported full ETC1 and ETC1S, so there's some legacy stuff in here. +// +#include "basisu_backend.h" + +#if BASISU_SUPPORT_SSE +#define CPPSPMD_NAME(a) a##_sse41 +#include "basisu_kernels_declares.h" +#endif + +#define BASISU_FASTER_SELECTOR_REORDERING 0 +#define BASISU_BACKEND_VERIFY(c) verify(c, __LINE__); + +namespace basisu +{ + // TODO + static inline void verify(bool condition, int line) + { + if (!condition) + { + fprintf(stderr, "ERROR: basisu_backend: verify() failed at line %i!\n", line); + abort(); + } + } + + basisu_backend::basisu_backend() + { + clear(); + } + + void basisu_backend::clear() + { + m_pFront_end = NULL; + m_params.clear(); + m_output.clear(); + } + + void basisu_backend::init(basisu_frontend* pFront_end, basisu_backend_params& params, const basisu_backend_slice_desc_vec& slice_descs) + { + m_pFront_end = pFront_end; + m_params = params; + m_slices = slice_descs; + + debug_printf("basisu_backend::Init: Slices: %u, ETC1S: %u, EndpointRDOQualityThresh: %f, SelectorRDOQualityThresh: %f\n", + m_slices.size(), + params.m_etc1s, + params.m_endpoint_rdo_quality_thresh, + params.m_selector_rdo_quality_thresh); + + debug_printf("Frontend endpoints: %u selectors: %u\n", m_pFront_end->get_total_endpoint_clusters(), m_pFront_end->get_total_selector_clusters()); + + for (uint32_t i = 0; i < m_slices.size(); i++) + { + debug_printf("Slice: %u, OrigWidth: %u, OrigHeight: %u, Width: %u, Height: %u, NumBlocksX: %u, NumBlocksY: %u, FirstBlockIndex: %u\n", + i, + m_slices[i].m_orig_width, m_slices[i].m_orig_height, + m_slices[i].m_width, m_slices[i].m_height, + m_slices[i].m_num_blocks_x, m_slices[i].m_num_blocks_y, + m_slices[i].m_first_block_index); + } + } + + void basisu_backend::create_endpoint_palette() + { + const basisu_frontend& r = *m_pFront_end; + + m_output.m_num_endpoints = r.get_total_endpoint_clusters(); + + m_endpoint_palette.resize(r.get_total_endpoint_clusters()); + for (uint32_t i = 0; i < r.get_total_endpoint_clusters(); i++) + { + etc1_endpoint_palette_entry& e = m_endpoint_palette[i]; + + e.m_color5_valid = r.get_endpoint_cluster_color_is_used(i, false); + e.m_color5 = r.get_endpoint_cluster_unscaled_color(i, false); + e.m_inten5 = r.get_endpoint_cluster_inten_table(i, false); + + BASISU_BACKEND_VERIFY(e.m_color5_valid); + } + } + + void basisu_backend::create_selector_palette() + { + const basisu_frontend& r = *m_pFront_end; + + m_output.m_num_selectors = r.get_total_selector_clusters(); + + m_selector_palette.resize(r.get_total_selector_clusters()); + + for (uint32_t i = 0; i < r.get_total_selector_clusters(); i++) + { + etc1_selector_palette_entry& s = m_selector_palette[i]; + + const etc_block& selector_bits = r.get_selector_cluster_selector_bits(i); + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + s[y * 4 + x] = static_cast(selector_bits.get_selector(x, y)); + } + } + } + } + + static const struct + { + int8_t m_dx, m_dy; + } g_endpoint_preds[] = + { + { -1, 0 }, + { 0, -1 }, + { -1, -1 } + }; + + void basisu_backend::reoptimize_and_sort_endpoints_codebook(uint32_t total_block_endpoints_remapped, uint_vec& all_endpoint_indices) + { + basisu_frontend& r = *m_pFront_end; + //const bool is_video = r.get_params().m_tex_type == basist::cBASISTexTypeVideoFrames; + + if (m_params.m_used_global_codebooks) + { + m_endpoint_remap_table_old_to_new.clear(); + m_endpoint_remap_table_old_to_new.resize(r.get_total_endpoint_clusters()); + for (uint32_t i = 0; i < r.get_total_endpoint_clusters(); i++) + m_endpoint_remap_table_old_to_new[i] = i; + } + else + { + //if ((total_block_endpoints_remapped) && (m_params.m_compression_level > 0)) + if ((total_block_endpoints_remapped) && (m_params.m_compression_level > 1)) + { + // We've changed the block endpoint indices, so we need to go and adjust the endpoint codebook (remove unused entries, optimize existing entries that have changed) + uint_vec new_block_endpoints(get_total_blocks()); + + for (uint32_t slice_index = 0; slice_index < m_slices.size(); slice_index++) + { + const uint32_t first_block_index = m_slices[slice_index].m_first_block_index; + const uint32_t num_blocks_x = m_slices[slice_index].m_num_blocks_x; + const uint32_t num_blocks_y = m_slices[slice_index].m_num_blocks_y; + + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + new_block_endpoints[first_block_index + block_x + block_y * num_blocks_x] = m_slice_encoder_blocks[slice_index](block_x, block_y).m_endpoint_index; + } + + int_vec old_to_new_endpoint_indices; + r.reoptimize_remapped_endpoints(new_block_endpoints, old_to_new_endpoint_indices, true); + + create_endpoint_palette(); + + for (uint32_t slice_index = 0; slice_index < m_slices.size(); slice_index++) + { + //const uint32_t first_block_index = m_slices[slice_index].m_first_block_index; + + //const uint32_t width = m_slices[slice_index].m_width; + //const uint32_t height = m_slices[slice_index].m_height; + const uint32_t num_blocks_x = m_slices[slice_index].m_num_blocks_x; + const uint32_t num_blocks_y = m_slices[slice_index].m_num_blocks_y; + + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + //const uint32_t block_index = first_block_index + block_x + block_y * num_blocks_x; + + encoder_block& m = m_slice_encoder_blocks[slice_index](block_x, block_y); + + m.m_endpoint_index = old_to_new_endpoint_indices[m.m_endpoint_index]; + } // block_x + } // block_y + } // slice_index + + for (uint32_t i = 0; i < all_endpoint_indices.size(); i++) + all_endpoint_indices[i] = old_to_new_endpoint_indices[all_endpoint_indices[i]]; + + } //if (total_block_endpoints_remapped) + + // Sort endpoint codebook + palette_index_reorderer reorderer; + reorderer.init((uint32_t)all_endpoint_indices.size(), &all_endpoint_indices[0], r.get_total_endpoint_clusters(), nullptr, nullptr, 0); + m_endpoint_remap_table_old_to_new = reorderer.get_remap_table(); + } + + // For endpoints, old_to_new[] may not be bijective! + // Some "old" entries may be unused and don't get remapped into the "new" array. + + m_old_endpoint_was_used.clear(); + m_old_endpoint_was_used.resize(r.get_total_endpoint_clusters()); + uint32_t first_old_entry_index = UINT32_MAX; + + for (uint32_t slice_index = 0; slice_index < m_slices.size(); slice_index++) + { + const uint32_t num_blocks_x = m_slices[slice_index].m_num_blocks_x, num_blocks_y = m_slices[slice_index].m_num_blocks_y; + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + encoder_block& m = m_slice_encoder_blocks[slice_index](block_x, block_y); + const uint32_t old_endpoint_index = m.m_endpoint_index; + + m_old_endpoint_was_used[old_endpoint_index] = true; + first_old_entry_index = basisu::minimum(first_old_entry_index, old_endpoint_index); + } // block_x + } // block_y + } // slice_index + + debug_printf("basisu_backend::reoptimize_and_sort_endpoints_codebook: First old entry index: %u\n", first_old_entry_index); + + m_new_endpoint_was_used.clear(); + m_new_endpoint_was_used.resize(r.get_total_endpoint_clusters()); + + m_endpoint_remap_table_new_to_old.clear(); + m_endpoint_remap_table_new_to_old.resize(r.get_total_endpoint_clusters()); + + // Set unused entries in the new array to point to the first used entry in the old array. + m_endpoint_remap_table_new_to_old.set_all(first_old_entry_index); + + for (uint32_t old_index = 0; old_index < m_endpoint_remap_table_old_to_new.size(); old_index++) + { + if (m_old_endpoint_was_used[old_index]) + { + const uint32_t new_index = m_endpoint_remap_table_old_to_new[old_index]; + + m_new_endpoint_was_used[new_index] = true; + + m_endpoint_remap_table_new_to_old[new_index] = old_index; + } + } + } + + void basisu_backend::sort_selector_codebook() + { + basisu_frontend& r = *m_pFront_end; + + m_selector_remap_table_new_to_old.resize(r.get_total_selector_clusters()); + + if ((m_params.m_compression_level == 0) || (m_params.m_used_global_codebooks)) + { + for (uint32_t i = 0; i < r.get_total_selector_clusters(); i++) + m_selector_remap_table_new_to_old[i] = i; + } + else + { + m_selector_remap_table_new_to_old[0] = 0; + uint32_t prev_selector_index = 0; + + int_vec remaining_selectors; + remaining_selectors.reserve(r.get_total_selector_clusters() - 1); + for (uint32_t i = 1; i < r.get_total_selector_clusters(); i++) + remaining_selectors.push_back(i); + + uint_vec selector_palette_bytes(m_selector_palette.size()); + for (uint32_t i = 0; i < m_selector_palette.size(); i++) + selector_palette_bytes[i] = m_selector_palette[i].get_byte(0) | (m_selector_palette[i].get_byte(1) << 8) | (m_selector_palette[i].get_byte(2) << 16) | (m_selector_palette[i].get_byte(3) << 24); + + // This is the traveling salesman problem. + for (uint32_t i = 1; i < r.get_total_selector_clusters(); i++) + { + uint32_t best_hamming_dist = 100; + uint32_t best_index = 0; + +#if BASISU_FASTER_SELECTOR_REORDERING + const uint32_t step = (remaining_selectors.size() > 16) ? 16 : 1; + for (uint32_t j = 0; j < remaining_selectors.size(); j += step) +#else + for (uint32_t j = 0; j < remaining_selectors.size(); j++) +#endif + { + int selector_index = remaining_selectors[j]; + + uint32_t k = selector_palette_bytes[prev_selector_index] ^ selector_palette_bytes[selector_index]; + uint32_t hamming_dist = g_hamming_dist[k & 0xFF] + g_hamming_dist[(k >> 8) & 0xFF] + g_hamming_dist[(k >> 16) & 0xFF] + g_hamming_dist[k >> 24]; + + if (hamming_dist < best_hamming_dist) + { + best_hamming_dist = hamming_dist; + best_index = j; + if (best_hamming_dist <= 1) + break; + } + } + + prev_selector_index = remaining_selectors[best_index]; + m_selector_remap_table_new_to_old[i] = prev_selector_index; + + remaining_selectors[best_index] = remaining_selectors.back(); + remaining_selectors.resize(remaining_selectors.size() - 1); + } + } + + m_selector_remap_table_old_to_new.resize(r.get_total_selector_clusters()); + for (uint32_t i = 0; i < m_selector_remap_table_new_to_old.size(); i++) + m_selector_remap_table_old_to_new[m_selector_remap_table_new_to_old[i]] = i; + } + int basisu_backend::find_video_frame(int slice_index, int delta) + { + for (uint32_t s = 0; s < m_slices.size(); s++) + { + if ((int)m_slices[s].m_source_file_index != ((int)m_slices[slice_index].m_source_file_index + delta)) + continue; + if (m_slices[s].m_mip_index != m_slices[slice_index].m_mip_index) + continue; + + // Being super paranoid here. + if (m_slices[s].m_num_blocks_x != (m_slices[slice_index].m_num_blocks_x)) + continue; + if (m_slices[s].m_num_blocks_y != (m_slices[slice_index].m_num_blocks_y)) + continue; + if (m_slices[s].m_alpha != (m_slices[slice_index].m_alpha)) + continue; + return s; + } + + return -1; + } + + void basisu_backend::check_for_valid_cr_blocks() + { + basisu_frontend& r = *m_pFront_end; + const bool is_video = r.get_params().m_tex_type == basist::cBASISTexTypeVideoFrames; + + if (!is_video) + return; + + debug_printf("basisu_backend::check_for_valid_cr_blocks\n"); + + uint32_t total_crs = 0; + uint32_t total_invalid_crs = 0; + + for (uint32_t slice_index = 0; slice_index < m_slices.size(); slice_index++) + { + const bool is_iframe = m_slices[slice_index].m_iframe; + //const uint32_t first_block_index = m_slices[slice_index].m_first_block_index; + + //const uint32_t width = m_slices[slice_index].m_width; + //const uint32_t height = m_slices[slice_index].m_height; + const uint32_t num_blocks_x = m_slices[slice_index].m_num_blocks_x; + const uint32_t num_blocks_y = m_slices[slice_index].m_num_blocks_y; + const int prev_frame_slice_index = find_video_frame(slice_index, -1); + + // If we don't have a previous frame, and we're not an i-frame, something is wrong. + if ((prev_frame_slice_index < 0) && (!is_iframe)) + { + BASISU_BACKEND_VERIFY(0); + } + + if ((is_iframe) || (prev_frame_slice_index < 0)) + { + // Ensure no blocks use CR's + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + encoder_block& m = m_slice_encoder_blocks[slice_index](block_x, block_y); + BASISU_BACKEND_VERIFY(m.m_endpoint_predictor != basist::CR_ENDPOINT_PRED_INDEX); + } + } + } + else + { + // For blocks that use CR's, make sure the endpoints/selectors haven't really changed. + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + encoder_block& m = m_slice_encoder_blocks[slice_index](block_x, block_y); + + if (m.m_endpoint_predictor == basist::CR_ENDPOINT_PRED_INDEX) + { + total_crs++; + + encoder_block& prev_m = m_slice_encoder_blocks[prev_frame_slice_index](block_x, block_y); + + if ((m.m_endpoint_index != prev_m.m_endpoint_index) || (m.m_selector_index != prev_m.m_selector_index)) + { + total_invalid_crs++; + } + } + } // block_x + } // block_y + + } // !slice_index + + } // slice_index + + debug_printf("Total CR's: %u, Total invalid CR's: %u\n", total_crs, total_invalid_crs); + + BASISU_BACKEND_VERIFY(total_invalid_crs == 0); + } + + void basisu_backend::create_encoder_blocks() + { + debug_printf("basisu_backend::create_encoder_blocks\n"); + + interval_timer tm; + tm.start(); + + basisu_frontend& r = *m_pFront_end; + const bool is_video = r.get_params().m_tex_type == basist::cBASISTexTypeVideoFrames; + + m_slice_encoder_blocks.resize(m_slices.size()); + + uint32_t total_endpoint_pred_missed = 0, total_endpoint_pred_hits = 0, total_block_endpoints_remapped = 0; + + uint_vec all_endpoint_indices; + all_endpoint_indices.reserve(get_total_blocks()); + + for (uint32_t slice_index = 0; slice_index < m_slices.size(); slice_index++) + { + const int prev_frame_slice_index = is_video ? find_video_frame(slice_index, -1) : -1; + const bool is_iframe = m_slices[slice_index].m_iframe; + const uint32_t first_block_index = m_slices[slice_index].m_first_block_index; + + //const uint32_t width = m_slices[slice_index].m_width; + //const uint32_t height = m_slices[slice_index].m_height; + const uint32_t num_blocks_x = m_slices[slice_index].m_num_blocks_x; + const uint32_t num_blocks_y = m_slices[slice_index].m_num_blocks_y; + + m_slice_encoder_blocks[slice_index].resize(num_blocks_x, num_blocks_y); + + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + const uint32_t block_index = first_block_index + block_x + block_y * num_blocks_x; + + encoder_block& m = m_slice_encoder_blocks[slice_index](block_x, block_y); + + m.m_endpoint_index = r.get_subblock_endpoint_cluster_index(block_index, 0); + BASISU_BACKEND_VERIFY(r.get_subblock_endpoint_cluster_index(block_index, 0) == r.get_subblock_endpoint_cluster_index(block_index, 1)); + + m.m_selector_index = r.get_block_selector_cluster_index(block_index); + + m.m_endpoint_predictor = basist::NO_ENDPOINT_PRED_INDEX; + + const uint32_t block_endpoint = m.m_endpoint_index; + + uint32_t best_endpoint_pred = UINT32_MAX; + + for (uint32_t endpoint_pred = 0; endpoint_pred < basist::NUM_ENDPOINT_PREDS; endpoint_pred++) + { + if ((is_video) && (endpoint_pred == basist::CR_ENDPOINT_PRED_INDEX)) + { + if ((prev_frame_slice_index != -1) && (!is_iframe)) + { + const uint32_t cur_endpoint = m_slice_encoder_blocks[slice_index](block_x, block_y).m_endpoint_index; + const uint32_t cur_selector = m_slice_encoder_blocks[slice_index](block_x, block_y).m_selector_index; + const uint32_t prev_endpoint = m_slice_encoder_blocks[prev_frame_slice_index](block_x, block_y).m_endpoint_index; + const uint32_t prev_selector = m_slice_encoder_blocks[prev_frame_slice_index](block_x, block_y).m_selector_index; + if ((cur_endpoint == prev_endpoint) && (cur_selector == prev_selector)) + { + best_endpoint_pred = basist::CR_ENDPOINT_PRED_INDEX; + m_slice_encoder_blocks[prev_frame_slice_index](block_x, block_y).m_is_cr_target = true; + } + } + } + else + { + int pred_block_x = block_x + g_endpoint_preds[endpoint_pred].m_dx; + if ((pred_block_x < 0) || (pred_block_x >= (int)num_blocks_x)) + continue; + + int pred_block_y = block_y + g_endpoint_preds[endpoint_pred].m_dy; + if ((pred_block_y < 0) || (pred_block_y >= (int)num_blocks_y)) + continue; + + uint32_t pred_endpoint = m_slice_encoder_blocks[slice_index](pred_block_x, pred_block_y).m_endpoint_index; + + if (pred_endpoint == block_endpoint) + { + if (endpoint_pred < best_endpoint_pred) + { + best_endpoint_pred = endpoint_pred; + } + } + } + + } // endpoint_pred + + if (best_endpoint_pred != UINT32_MAX) + { + m.m_endpoint_predictor = best_endpoint_pred; + + total_endpoint_pred_hits++; + } + else if (m_params.m_endpoint_rdo_quality_thresh > 0.0f) + { + const pixel_block& src_pixels = r.get_source_pixel_block(block_index); + + etc_block etc_blk(r.get_output_block(block_index)); + + uint64_t cur_err = etc_blk.evaluate_etc1_error(src_pixels.get_ptr(), r.get_params().m_perceptual); + + if (cur_err) + { + const uint64_t thresh_err = (uint64_t)(cur_err * maximum(1.0f, m_params.m_endpoint_rdo_quality_thresh)); + + etc_block trial_etc_block(etc_blk); + + uint64_t best_err = UINT64_MAX; + uint32_t best_endpoint_index = 0; + + best_endpoint_pred = UINT32_MAX; + + for (uint32_t endpoint_pred = 0; endpoint_pred < basist::NUM_ENDPOINT_PREDS; endpoint_pred++) + { + if ((is_video) && (endpoint_pred == basist::CR_ENDPOINT_PRED_INDEX)) + continue; + + int pred_block_x = block_x + g_endpoint_preds[endpoint_pred].m_dx; + if ((pred_block_x < 0) || (pred_block_x >= (int)num_blocks_x)) + continue; + + int pred_block_y = block_y + g_endpoint_preds[endpoint_pred].m_dy; + if ((pred_block_y < 0) || (pred_block_y >= (int)num_blocks_y)) + continue; + + uint32_t pred_endpoint_index = m_slice_encoder_blocks[slice_index](pred_block_x, pred_block_y).m_endpoint_index; + + uint32_t pred_inten = r.get_endpoint_cluster_inten_table(pred_endpoint_index, false); + color_rgba pred_color = r.get_endpoint_cluster_unscaled_color(pred_endpoint_index, false); + + trial_etc_block.set_block_color5(pred_color, pred_color); + trial_etc_block.set_inten_table(0, pred_inten); + trial_etc_block.set_inten_table(1, pred_inten); + + color_rgba trial_colors[16]; + unpack_etc1(trial_etc_block, trial_colors); + + uint64_t trial_err = 0; + if (r.get_params().m_perceptual) + { + for (uint32_t p = 0; p < 16; p++) + { + trial_err += color_distance(true, src_pixels.get_ptr()[p], trial_colors[p], false); + if (trial_err > thresh_err) + break; + } + } + else + { + for (uint32_t p = 0; p < 16; p++) + { + trial_err += color_distance(false, src_pixels.get_ptr()[p], trial_colors[p], false); + if (trial_err > thresh_err) + break; + } + } + + if (trial_err <= thresh_err) + { + if ((trial_err < best_err) || ((trial_err == best_err) && (endpoint_pred < best_endpoint_pred))) + { + best_endpoint_pred = endpoint_pred; + best_err = trial_err; + best_endpoint_index = pred_endpoint_index; + } + } + } // endpoint_pred + + if (best_endpoint_pred != UINT32_MAX) + { + m.m_endpoint_index = best_endpoint_index; + m.m_endpoint_predictor = best_endpoint_pred; + + total_endpoint_pred_hits++; + total_block_endpoints_remapped++; + } + else + { + total_endpoint_pred_missed++; + } + } + } + else + { + total_endpoint_pred_missed++; + } + + if (m.m_endpoint_predictor == basist::NO_ENDPOINT_PRED_INDEX) + { + all_endpoint_indices.push_back(m.m_endpoint_index); + } + + } // block_x + + } // block_y + + } // slice + + debug_printf("total_endpoint_pred_missed: %u (%3.2f%%) total_endpoint_pred_hit: %u (%3.2f%%), total_block_endpoints_remapped: %u (%3.2f%%)\n", + total_endpoint_pred_missed, total_endpoint_pred_missed * 100.0f / get_total_blocks(), + total_endpoint_pred_hits, total_endpoint_pred_hits * 100.0f / get_total_blocks(), + total_block_endpoints_remapped, total_block_endpoints_remapped * 100.0f / get_total_blocks()); + + reoptimize_and_sort_endpoints_codebook(total_block_endpoints_remapped, all_endpoint_indices); + + sort_selector_codebook(); + check_for_valid_cr_blocks(); + + debug_printf("Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + } + + void basisu_backend::compute_slice_crcs() + { + for (uint32_t slice_index = 0; slice_index < m_slices.size(); slice_index++) + { + //const uint32_t first_block_index = m_slices[slice_index].m_first_block_index; + const uint32_t width = m_slices[slice_index].m_width; + const uint32_t height = m_slices[slice_index].m_height; + const uint32_t num_blocks_x = m_slices[slice_index].m_num_blocks_x; + const uint32_t num_blocks_y = m_slices[slice_index].m_num_blocks_y; + + gpu_image gi; + gi.init(texture_format::cETC1, width, height); + + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + //const uint32_t block_index = first_block_index + block_x + block_y * num_blocks_x; + + encoder_block& m = m_slice_encoder_blocks[slice_index](block_x, block_y); + + { + etc_block& output_block = *(etc_block*)gi.get_block_ptr(block_x, block_y); + + output_block.set_diff_bit(true); + // Setting the flip bit to false to be compatible with the Khronos KDFS. + //output_block.set_flip_bit(true); + output_block.set_flip_bit(false); + + const uint32_t endpoint_index = m.m_endpoint_index; + + output_block.set_block_color5_etc1s(m_endpoint_palette[endpoint_index].m_color5); + output_block.set_inten_tables_etc1s(m_endpoint_palette[endpoint_index].m_inten5); + + const uint32_t selector_idx = m.m_selector_index; + + const etc1_selector_palette_entry& selectors = m_selector_palette[selector_idx]; + for (uint32_t sy = 0; sy < 4; sy++) + for (uint32_t sx = 0; sx < 4; sx++) + output_block.set_selector(sx, sy, selectors(sx, sy)); + } + + } // block_x + } // block_y + + m_output.m_slice_image_crcs[slice_index] = basist::crc16(gi.get_ptr(), gi.get_size_in_bytes(), 0); + + if (m_params.m_debug_images) + { + image gi_unpacked; + gi.unpack(gi_unpacked); + + char buf[256]; +#ifdef _WIN32 + sprintf_s(buf, sizeof(buf), "basisu_backend_slice_%u.png", slice_index); +#else + snprintf(buf, sizeof(buf), "basisu_backend_slice_%u.png", slice_index); +#endif + save_png(buf, gi_unpacked); + } + + } // slice_index + } + + //uint32_t g_color_delta_hist[255 * 3 + 1]; + //uint32_t g_color_delta_bad_hist[255 * 3 + 1]; + + // TODO: Split this into multiple methods. + bool basisu_backend::encode_image() + { + basisu_frontend& r = *m_pFront_end; + const bool is_video = r.get_params().m_tex_type == basist::cBASISTexTypeVideoFrames; + + uint32_t total_used_selector_history_buf = 0; + uint32_t total_selector_indices_remapped = 0; + + basist::approx_move_to_front selector_history_buf(basist::MAX_SELECTOR_HISTORY_BUF_SIZE); + histogram selector_history_buf_histogram(basist::MAX_SELECTOR_HISTORY_BUF_SIZE); + histogram selector_histogram(r.get_total_selector_clusters() + basist::MAX_SELECTOR_HISTORY_BUF_SIZE + 1); + histogram selector_history_buf_rle_histogram(1 << basist::SELECTOR_HISTORY_BUF_RLE_COUNT_BITS); + + basisu::vector selector_syms(m_slices.size()); + + const uint32_t SELECTOR_HISTORY_BUF_FIRST_SYMBOL_INDEX = r.get_total_selector_clusters(); + const uint32_t SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX = SELECTOR_HISTORY_BUF_FIRST_SYMBOL_INDEX + basist::MAX_SELECTOR_HISTORY_BUF_SIZE; + + m_output.m_slice_image_crcs.resize(m_slices.size()); + + histogram delta_endpoint_histogram(r.get_total_endpoint_clusters()); + + histogram endpoint_pred_histogram(basist::ENDPOINT_PRED_TOTAL_SYMBOLS); + basisu::vector endpoint_pred_syms(m_slices.size()); + + uint32_t total_endpoint_indices_remapped = 0; + + uint_vec block_endpoint_indices, block_selector_indices; + + interval_timer tm; + tm.start(); + + const int COLOR_DELTA_THRESH = 8; + const int SEL_DIFF_THRESHOLD = 11; + + for (uint32_t slice_index = 0; slice_index < m_slices.size(); slice_index++) + { + //const int prev_frame_slice_index = is_video ? find_video_frame(slice_index, -1) : -1; + //const int next_frame_slice_index = is_video ? find_video_frame(slice_index, 1) : -1; + const uint32_t first_block_index = m_slices[slice_index].m_first_block_index; + //const uint32_t width = m_slices[slice_index].m_width; + //const uint32_t height = m_slices[slice_index].m_height; + const uint32_t num_blocks_x = m_slices[slice_index].m_num_blocks_x; + const uint32_t num_blocks_y = m_slices[slice_index].m_num_blocks_y; + + selector_history_buf.reset(); + + int selector_history_buf_rle_count = 0; + + int prev_endpoint_pred_sym_bits = -1, endpoint_pred_repeat_count = 0; + + uint32_t prev_endpoint_index = 0; + + vector2D block_endpoints_are_referenced(num_blocks_x, num_blocks_y); + + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + //const uint32_t block_index = first_block_index + block_x + block_y * num_blocks_x; + + encoder_block& m = m_slice_encoder_blocks[slice_index](block_x, block_y); + + if (m.m_endpoint_predictor == 0) + block_endpoints_are_referenced(block_x - 1, block_y) = true; + else if (m.m_endpoint_predictor == 1) + block_endpoints_are_referenced(block_x, block_y - 1) = true; + else if (m.m_endpoint_predictor == 2) + { + if (!is_video) + block_endpoints_are_referenced(block_x - 1, block_y - 1) = true; + } + if (is_video) + { + if (m.m_is_cr_target) + block_endpoints_are_referenced(block_x, block_y) = true; + } + + } // block_x + } // block_y + + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + const uint32_t block_index = first_block_index + block_x + block_y * num_blocks_x; + + encoder_block& m = m_slice_encoder_blocks[slice_index](block_x, block_y); + + if (((block_x & 1) == 0) && ((block_y & 1) == 0)) + { + uint32_t endpoint_pred_cur_sym_bits = 0; + + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 2; x++) + { + const uint32_t bx = block_x + x; + const uint32_t by = block_y + y; + + uint32_t pred = basist::NO_ENDPOINT_PRED_INDEX; + if ((bx < num_blocks_x) && (by < num_blocks_y)) + pred = m_slice_encoder_blocks[slice_index](bx, by).m_endpoint_predictor; + + endpoint_pred_cur_sym_bits |= (pred << (x * 2 + y * 4)); + } + } + + if ((int)endpoint_pred_cur_sym_bits == prev_endpoint_pred_sym_bits) + { + endpoint_pred_repeat_count++; + } + else + { + if (endpoint_pred_repeat_count > 0) + { + if (endpoint_pred_repeat_count > (int)basist::ENDPOINT_PRED_MIN_REPEAT_COUNT) + { + endpoint_pred_histogram.inc(basist::ENDPOINT_PRED_REPEAT_LAST_SYMBOL); + endpoint_pred_syms[slice_index].push_back(basist::ENDPOINT_PRED_REPEAT_LAST_SYMBOL); + + endpoint_pred_syms[slice_index].push_back(endpoint_pred_repeat_count); + } + else + { + for (int j = 0; j < endpoint_pred_repeat_count; j++) + { + endpoint_pred_histogram.inc(prev_endpoint_pred_sym_bits); + endpoint_pred_syms[slice_index].push_back(prev_endpoint_pred_sym_bits); + } + } + + endpoint_pred_repeat_count = 0; + } + + endpoint_pred_histogram.inc(endpoint_pred_cur_sym_bits); + endpoint_pred_syms[slice_index].push_back(endpoint_pred_cur_sym_bits); + + prev_endpoint_pred_sym_bits = endpoint_pred_cur_sym_bits; + } + } + + int new_endpoint_index = m_endpoint_remap_table_old_to_new[m.m_endpoint_index]; + + if (m.m_endpoint_predictor == basist::NO_ENDPOINT_PRED_INDEX) + { + int endpoint_delta = new_endpoint_index - prev_endpoint_index; + + if ((m_params.m_endpoint_rdo_quality_thresh > 1.0f) && (iabs(endpoint_delta) > 1) && (!block_endpoints_are_referenced(block_x, block_y))) + { + const pixel_block& src_pixels = r.get_source_pixel_block(block_index); + + etc_block etc_blk(r.get_output_block(block_index)); + + const uint64_t cur_err = etc_blk.evaluate_etc1_error(src_pixels.get_ptr(), r.get_params().m_perceptual); + const uint32_t cur_inten5 = etc_blk.get_inten_table(0); + + const etc1_endpoint_palette_entry& cur_endpoints = m_endpoint_palette[m.m_endpoint_index]; + + if (cur_err) + { + const float endpoint_remap_thresh = maximum(1.0f, m_params.m_endpoint_rdo_quality_thresh); + const uint64_t thresh_err = (uint64_t)(cur_err * endpoint_remap_thresh); + + //const int MAX_ENDPOINT_SEARCH_DIST = (m_params.m_compression_level >= 2) ? 64 : 32; + const int MAX_ENDPOINT_SEARCH_DIST = (m_params.m_compression_level >= 2) ? 64 : 16; + + if (!g_cpu_supports_sse41) + { + const uint64_t initial_best_trial_err = UINT64_MAX; + uint64_t best_trial_err = initial_best_trial_err; + int best_trial_idx = 0; + + etc_block trial_etc_blk(etc_blk); + + const int search_dist = minimum(iabs(endpoint_delta) - 1, MAX_ENDPOINT_SEARCH_DIST); + for (int d = -search_dist; d < search_dist; d++) + { + int trial_idx = prev_endpoint_index + d; + if (trial_idx < 0) + trial_idx += (int)r.get_total_endpoint_clusters(); + else if (trial_idx >= (int)r.get_total_endpoint_clusters()) + trial_idx -= (int)r.get_total_endpoint_clusters(); + + if (trial_idx == new_endpoint_index) + continue; + + // Skip it if this new endpoint palette entry is actually never used. + if (!m_new_endpoint_was_used[trial_idx]) + continue; + + const etc1_endpoint_palette_entry& p = m_endpoint_palette[m_endpoint_remap_table_new_to_old[trial_idx]]; + + if (m_params.m_compression_level <= 1) + { + if (p.m_inten5 > cur_inten5) + continue; + + int delta_r = iabs(cur_endpoints.m_color5.r - p.m_color5.r); + int delta_g = iabs(cur_endpoints.m_color5.g - p.m_color5.g); + int delta_b = iabs(cur_endpoints.m_color5.b - p.m_color5.b); + int color_delta = delta_r + delta_g + delta_b; + + if (color_delta > COLOR_DELTA_THRESH) + continue; + } + + trial_etc_blk.set_block_color5_etc1s(p.m_color5); + trial_etc_blk.set_inten_tables_etc1s(p.m_inten5); + + uint64_t trial_err = trial_etc_blk.evaluate_etc1_error(src_pixels.get_ptr(), r.get_params().m_perceptual); + + if ((trial_err < best_trial_err) && (trial_err <= thresh_err)) + { + best_trial_err = trial_err; + best_trial_idx = trial_idx; + } + } + + if (best_trial_err != initial_best_trial_err) + { + m.m_endpoint_index = m_endpoint_remap_table_new_to_old[best_trial_idx]; + + new_endpoint_index = best_trial_idx; + + endpoint_delta = new_endpoint_index - prev_endpoint_index; + + total_endpoint_indices_remapped++; + } + } + else + { +#if BASISU_SUPPORT_SSE + uint8_t block_selectors[16]; + for (uint32_t i = 0; i < 16; i++) + block_selectors[i] = (uint8_t)etc_blk.get_selector(i & 3, i >> 2); + + const int64_t initial_best_trial_err = INT64_MAX; + int64_t best_trial_err = initial_best_trial_err; + int best_trial_idx = 0; + + const int search_dist = minimum(iabs(endpoint_delta) - 1, MAX_ENDPOINT_SEARCH_DIST); + for (int d = -search_dist; d < search_dist; d++) + { + int trial_idx = prev_endpoint_index + d; + if (trial_idx < 0) + trial_idx += (int)r.get_total_endpoint_clusters(); + else if (trial_idx >= (int)r.get_total_endpoint_clusters()) + trial_idx -= (int)r.get_total_endpoint_clusters(); + + if (trial_idx == new_endpoint_index) + continue; + + // Skip it if this new endpoint palette entry is actually never used. + if (!m_new_endpoint_was_used[trial_idx]) + continue; + + const etc1_endpoint_palette_entry& p = m_endpoint_palette[m_endpoint_remap_table_new_to_old[trial_idx]]; + + if (m_params.m_compression_level <= 1) + { + if (p.m_inten5 > cur_inten5) + continue; + + int delta_r = iabs(cur_endpoints.m_color5.r - p.m_color5.r); + int delta_g = iabs(cur_endpoints.m_color5.g - p.m_color5.g); + int delta_b = iabs(cur_endpoints.m_color5.b - p.m_color5.b); + int color_delta = delta_r + delta_g + delta_b; + + if (color_delta > COLOR_DELTA_THRESH) + continue; + } + + color_rgba block_colors[4]; + etc_block::get_block_colors_etc1s(block_colors, p.m_color5, p.m_inten5); + + int64_t trial_err; + if (r.get_params().m_perceptual) + { + perceptual_distance_rgb_4_N_sse41(&trial_err, block_selectors, block_colors, src_pixels.get_ptr(), 16, best_trial_err); + } + else + { + linear_distance_rgb_4_N_sse41(&trial_err, block_selectors, block_colors, src_pixels.get_ptr(), 16, best_trial_err); + } + + //if (trial_err > thresh_err) + // g_color_delta_bad_hist[color_delta]++; + + if ((trial_err < best_trial_err) && (trial_err <= (int64_t)thresh_err)) + { + best_trial_err = trial_err; + best_trial_idx = trial_idx; + } + } + + if (best_trial_err != initial_best_trial_err) + { + m.m_endpoint_index = m_endpoint_remap_table_new_to_old[best_trial_idx]; + + new_endpoint_index = best_trial_idx; + + endpoint_delta = new_endpoint_index - prev_endpoint_index; + + total_endpoint_indices_remapped++; + } +#endif // BASISU_SUPPORT_SSE + } // if (!g_cpu_supports_sse41) + + } // if (cur_err) + + } // if ((m_params.m_endpoint_rdo_quality_thresh > 1.0f) && (iabs(endpoint_delta) > 1) && (!block_endpoints_are_referenced(block_x, block_y))) + + if (endpoint_delta < 0) + endpoint_delta += (int)r.get_total_endpoint_clusters(); + + delta_endpoint_histogram.inc(endpoint_delta); + + } // if (m.m_endpoint_predictor == basist::NO_ENDPOINT_PRED_INDEX) + + block_endpoint_indices.push_back(m_endpoint_remap_table_new_to_old[new_endpoint_index]); + + prev_endpoint_index = new_endpoint_index; + + if ((!is_video) || (m.m_endpoint_predictor != basist::CR_ENDPOINT_PRED_INDEX)) + { + int new_selector_index = m_selector_remap_table_old_to_new[m.m_selector_index]; + + const float selector_remap_thresh = maximum(1.0f, m_params.m_selector_rdo_quality_thresh); //2.5f; + + int selector_history_buf_index = -1; + + // At low comp levels this hurts compression a tiny amount, but is significantly faster so it's a good tradeoff. + if ((m.m_is_cr_target) || (m_params.m_compression_level <= 1)) + { + for (uint32_t j = 0; j < selector_history_buf.size(); j++) + { + const int trial_idx = selector_history_buf[j]; + if (trial_idx == new_selector_index) + { + total_used_selector_history_buf++; + selector_history_buf_index = j; + selector_history_buf_histogram.inc(j); + break; + } + } + } + + // If the block is a CR target we can't override its selectors. + if ((!m.m_is_cr_target) && (selector_history_buf_index == -1)) + { + const pixel_block& src_pixels = r.get_source_pixel_block(block_index); + + etc_block etc_blk = r.get_output_block(block_index); + + // This is new code - the initial release just used the endpoints from the frontend, which isn't correct/accurate. + const etc1_endpoint_palette_entry& q = m_endpoint_palette[m_endpoint_remap_table_new_to_old[new_endpoint_index]]; + etc_blk.set_block_color5_etc1s(q.m_color5); + etc_blk.set_inten_tables_etc1s(q.m_inten5); + + color_rgba block_colors[4]; + etc_blk.get_block_colors(block_colors, 0); + + const uint8_t* pCur_selectors = &m_selector_palette[m.m_selector_index][0]; + + uint64_t cur_err = 0; + if (r.get_params().m_perceptual) + { + for (uint32_t p = 0; p < 16; p++) + cur_err += color_distance(true, src_pixels.get_ptr()[p], block_colors[pCur_selectors[p]], false); + } + else + { + for (uint32_t p = 0; p < 16; p++) + cur_err += color_distance(false, src_pixels.get_ptr()[p], block_colors[pCur_selectors[p]], false); + } + + const uint64_t limit_err = (uint64_t)ceilf(cur_err * selector_remap_thresh); + + // Even if cur_err==limit_err, we still want to scan the history buffer because there may be equivalent entries that are cheaper to code. + + uint64_t best_trial_err = UINT64_MAX; + int best_trial_idx = 0; + uint32_t best_trial_history_buf_idx = 0; + + for (uint32_t j = 0; j < selector_history_buf.size(); j++) + { + const int trial_idx = selector_history_buf[j]; + + const uint8_t* pSelectors = &m_selector_palette[m_selector_remap_table_new_to_old[trial_idx]][0]; + + if (m_params.m_compression_level <= 1) + { + // Predict if evaluating the full color error would cause an early out, by summing the abs err of the selector indices. + int sel_diff = 0; + for (uint32_t p = 0; p < 16; p += 4) + { + sel_diff += iabs(pCur_selectors[p + 0] - pSelectors[p + 0]); + sel_diff += iabs(pCur_selectors[p + 1] - pSelectors[p + 1]); + sel_diff += iabs(pCur_selectors[p + 2] - pSelectors[p + 2]); + sel_diff += iabs(pCur_selectors[p + 3] - pSelectors[p + 3]); + if (sel_diff >= SEL_DIFF_THRESHOLD) + break; + } + if (sel_diff >= SEL_DIFF_THRESHOLD) + continue; + } + + const uint64_t thresh_err = minimum(limit_err, best_trial_err); + uint64_t trial_err = 0; + + // This tends to early out quickly, so SSE has a hard time competing. + if (r.get_params().m_perceptual) + { + for (uint32_t p = 0; p < 16; p++) + { + uint32_t sel = pSelectors[p]; + trial_err += color_distance(true, src_pixels.get_ptr()[p], block_colors[sel], false); + if (trial_err > thresh_err) + break; + } + } + else + { + for (uint32_t p = 0; p < 16; p++) + { + uint32_t sel = pSelectors[p]; + trial_err += color_distance(false, src_pixels.get_ptr()[p], block_colors[sel], false); + if (trial_err > thresh_err) + break; + } + } + + if ((trial_err < best_trial_err) && (trial_err <= thresh_err)) + { + assert(trial_err <= limit_err); + + best_trial_err = trial_err; + best_trial_idx = trial_idx; + best_trial_history_buf_idx = j; + } + } + + if (best_trial_err != UINT64_MAX) + { + if (new_selector_index != best_trial_idx) + total_selector_indices_remapped++; + + new_selector_index = best_trial_idx; + + total_used_selector_history_buf++; + + selector_history_buf_index = best_trial_history_buf_idx; + + selector_history_buf_histogram.inc(best_trial_history_buf_idx); + } + + } // if (m_params.m_selector_rdo_quality_thresh > 0.0f) + + m.m_selector_index = m_selector_remap_table_new_to_old[new_selector_index]; + + + if ((selector_history_buf_rle_count) && (selector_history_buf_index != 0)) + { + if (selector_history_buf_rle_count >= (int)basist::SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH) + { + selector_syms[slice_index].push_back(SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX); + selector_syms[slice_index].push_back(selector_history_buf_rle_count); + + int run_sym = selector_history_buf_rle_count - basist::SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH; + if (run_sym >= ((int)basist::SELECTOR_HISTORY_BUF_RLE_COUNT_TOTAL - 1)) + selector_history_buf_rle_histogram.inc(basist::SELECTOR_HISTORY_BUF_RLE_COUNT_TOTAL - 1); + else + selector_history_buf_rle_histogram.inc(run_sym); + + selector_histogram.inc(SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX); + } + else + { + for (int k = 0; k < selector_history_buf_rle_count; k++) + { + uint32_t sym_index = SELECTOR_HISTORY_BUF_FIRST_SYMBOL_INDEX + 0; + + selector_syms[slice_index].push_back(sym_index); + + selector_histogram.inc(sym_index); + } + } + + selector_history_buf_rle_count = 0; + } + + if (selector_history_buf_index >= 0) + { + if (selector_history_buf_index == 0) + selector_history_buf_rle_count++; + else + { + uint32_t history_buf_sym = SELECTOR_HISTORY_BUF_FIRST_SYMBOL_INDEX + selector_history_buf_index; + + selector_syms[slice_index].push_back(history_buf_sym); + + selector_histogram.inc(history_buf_sym); + } + } + else + { + selector_syms[slice_index].push_back(new_selector_index); + + selector_histogram.inc(new_selector_index); + } + + m.m_selector_history_buf_index = selector_history_buf_index; + + if (selector_history_buf_index < 0) + selector_history_buf.add(new_selector_index); + else if (selector_history_buf.size()) + selector_history_buf.use(selector_history_buf_index); + } + block_selector_indices.push_back(m.m_selector_index); + + } // block_x + + } // block_y + + if (endpoint_pred_repeat_count > 0) + { + if (endpoint_pred_repeat_count > (int)basist::ENDPOINT_PRED_MIN_REPEAT_COUNT) + { + endpoint_pred_histogram.inc(basist::ENDPOINT_PRED_REPEAT_LAST_SYMBOL); + endpoint_pred_syms[slice_index].push_back(basist::ENDPOINT_PRED_REPEAT_LAST_SYMBOL); + + endpoint_pred_syms[slice_index].push_back(endpoint_pred_repeat_count); + } + else + { + for (int j = 0; j < endpoint_pred_repeat_count; j++) + { + endpoint_pred_histogram.inc(prev_endpoint_pred_sym_bits); + endpoint_pred_syms[slice_index].push_back(prev_endpoint_pred_sym_bits); + } + } + + endpoint_pred_repeat_count = 0; + } + + if (selector_history_buf_rle_count) + { + if (selector_history_buf_rle_count >= (int)basist::SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH) + { + selector_syms[slice_index].push_back(SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX); + selector_syms[slice_index].push_back(selector_history_buf_rle_count); + + int run_sym = selector_history_buf_rle_count - basist::SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH; + if (run_sym >= ((int)basist::SELECTOR_HISTORY_BUF_RLE_COUNT_TOTAL - 1)) + selector_history_buf_rle_histogram.inc(basist::SELECTOR_HISTORY_BUF_RLE_COUNT_TOTAL - 1); + else + selector_history_buf_rle_histogram.inc(run_sym); + + selector_histogram.inc(SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX); + } + else + { + for (int i = 0; i < selector_history_buf_rle_count; i++) + { + uint32_t sym_index = SELECTOR_HISTORY_BUF_FIRST_SYMBOL_INDEX + 0; + + selector_syms[slice_index].push_back(sym_index); + + selector_histogram.inc(sym_index); + } + } + + selector_history_buf_rle_count = 0; + } + + } // slice_index + + //for (int i = 0; i <= 255 * 3; i++) + //{ + // printf("%u, %u, %f\n", g_color_delta_bad_hist[i], g_color_delta_hist[i], g_color_delta_hist[i] ? g_color_delta_bad_hist[i] / (float)g_color_delta_hist[i] : 0); + //} + + double total_prep_time = tm.get_elapsed_secs(); + debug_printf("basisu_backend::encode_image: Total prep time: %3.2f\n", total_prep_time); + + debug_printf("Endpoint pred RDO total endpoint indices remapped: %u %3.2f%%\n", + total_endpoint_indices_remapped, total_endpoint_indices_remapped * 100.0f / get_total_blocks()); + + debug_printf("Selector history RDO total selector indices remapped: %u %3.2f%%, Used history buf: %u %3.2f%%\n", + total_selector_indices_remapped, total_selector_indices_remapped * 100.0f / get_total_blocks(), + total_used_selector_history_buf, total_used_selector_history_buf * 100.0f / get_total_blocks()); + + //if ((total_endpoint_indices_remapped) && (m_params.m_compression_level > 0)) + if ((total_endpoint_indices_remapped) && (m_params.m_compression_level > 1) && (!m_params.m_used_global_codebooks)) + { + int_vec unused; + r.reoptimize_remapped_endpoints(block_endpoint_indices, unused, false, &block_selector_indices); + + create_endpoint_palette(); + } + + check_for_valid_cr_blocks(); + compute_slice_crcs(); + + double endpoint_pred_entropy = endpoint_pred_histogram.get_entropy() / endpoint_pred_histogram.get_total(); + double delta_endpoint_entropy = delta_endpoint_histogram.get_entropy() / delta_endpoint_histogram.get_total(); + double selector_entropy = selector_histogram.get_entropy() / selector_histogram.get_total(); + + debug_printf("Histogram entropy: EndpointPred: %3.3f DeltaEndpoint: %3.3f DeltaSelector: %3.3f\n", endpoint_pred_entropy, delta_endpoint_entropy, selector_entropy); + + if (!endpoint_pred_histogram.get_total()) + endpoint_pred_histogram.inc(0); + huffman_encoding_table endpoint_pred_model; + if (!endpoint_pred_model.init(endpoint_pred_histogram, 16)) + { + error_printf("endpoint_pred_model.init() failed!"); + return false; + } + + if (!delta_endpoint_histogram.get_total()) + delta_endpoint_histogram.inc(0); + huffman_encoding_table delta_endpoint_model; + if (!delta_endpoint_model.init(delta_endpoint_histogram, 16)) + { + error_printf("delta_endpoint_model.init() failed!"); + return false; + } + if (!selector_histogram.get_total()) + selector_histogram.inc(0); + + huffman_encoding_table selector_model; + if (!selector_model.init(selector_histogram, 16)) + { + error_printf("selector_model.init() failed!"); + return false; + } + + if (!selector_history_buf_rle_histogram.get_total()) + selector_history_buf_rle_histogram.inc(0); + + huffman_encoding_table selector_history_buf_rle_model; + if (!selector_history_buf_rle_model.init(selector_history_buf_rle_histogram, 16)) + { + error_printf("selector_history_buf_rle_model.init() failed!"); + return false; + } + + bitwise_coder coder; + coder.init(1024 * 1024 * 4); + + uint32_t endpoint_pred_model_bits = coder.emit_huffman_table(endpoint_pred_model); + uint32_t delta_endpoint_bits = coder.emit_huffman_table(delta_endpoint_model); + uint32_t selector_model_bits = coder.emit_huffman_table(selector_model); + uint32_t selector_history_buf_run_sym_bits = coder.emit_huffman_table(selector_history_buf_rle_model); + + coder.put_bits(basist::MAX_SELECTOR_HISTORY_BUF_SIZE, 13); + + debug_printf("Model sizes: EndpointPred: %u bits %u bytes (%3.3f bpp) DeltaEndpoint: %u bits %u bytes (%3.3f bpp) Selector: %u bits %u bytes (%3.3f bpp) SelectorHistBufRLE: %u bits %u bytes (%3.3f bpp)\n", + endpoint_pred_model_bits, (endpoint_pred_model_bits + 7) / 8, endpoint_pred_model_bits / float(get_total_input_texels()), + delta_endpoint_bits, (delta_endpoint_bits + 7) / 8, delta_endpoint_bits / float(get_total_input_texels()), + selector_model_bits, (selector_model_bits + 7) / 8, selector_model_bits / float(get_total_input_texels()), + selector_history_buf_run_sym_bits, (selector_history_buf_run_sym_bits + 7) / 8, selector_history_buf_run_sym_bits / float(get_total_input_texels())); + + coder.flush(); + + m_output.m_slice_image_tables = coder.get_bytes(); + + uint32_t total_endpoint_pred_bits = 0, total_delta_endpoint_bits = 0, total_selector_bits = 0; + + uint32_t total_image_bytes = 0; + + m_output.m_slice_image_data.resize(m_slices.size()); + + for (uint32_t slice_index = 0; slice_index < m_slices.size(); slice_index++) + { + //const uint32_t width = m_slices[slice_index].m_width; + //const uint32_t height = m_slices[slice_index].m_height; + const uint32_t num_blocks_x = m_slices[slice_index].m_num_blocks_x; + const uint32_t num_blocks_y = m_slices[slice_index].m_num_blocks_y; + + coder.init(1024 * 1024 * 4); + + uint32_t cur_selector_sym_ofs = 0; + uint32_t selector_rle_count = 0; + + int endpoint_pred_repeat_count = 0; + uint32_t cur_endpoint_pred_sym_ofs = 0; +// uint32_t prev_endpoint_pred_sym = 0; + uint32_t prev_endpoint_index = 0; + + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + const encoder_block& m = m_slice_encoder_blocks[slice_index](block_x, block_y); + + if (((block_x & 1) == 0) && ((block_y & 1) == 0)) + { + if (endpoint_pred_repeat_count > 0) + { + endpoint_pred_repeat_count--; + } + else + { + uint32_t sym = endpoint_pred_syms[slice_index][cur_endpoint_pred_sym_ofs++]; + + if (sym == basist::ENDPOINT_PRED_REPEAT_LAST_SYMBOL) + { + total_endpoint_pred_bits += coder.put_code(sym, endpoint_pred_model); + + endpoint_pred_repeat_count = endpoint_pred_syms[slice_index][cur_endpoint_pred_sym_ofs++]; + assert(endpoint_pred_repeat_count >= (int)basist::ENDPOINT_PRED_MIN_REPEAT_COUNT); + + total_endpoint_pred_bits += coder.put_vlc(endpoint_pred_repeat_count - basist::ENDPOINT_PRED_MIN_REPEAT_COUNT, basist::ENDPOINT_PRED_COUNT_VLC_BITS); + + endpoint_pred_repeat_count--; + } + else + { + total_endpoint_pred_bits += coder.put_code(sym, endpoint_pred_model); + + //prev_endpoint_pred_sym = sym; + } + } + } + + const int new_endpoint_index = m_endpoint_remap_table_old_to_new[m.m_endpoint_index]; + + if (m.m_endpoint_predictor == basist::NO_ENDPOINT_PRED_INDEX) + { + int endpoint_delta = new_endpoint_index - prev_endpoint_index; + if (endpoint_delta < 0) + endpoint_delta += (int)r.get_total_endpoint_clusters(); + + total_delta_endpoint_bits += coder.put_code(endpoint_delta, delta_endpoint_model); + } + + prev_endpoint_index = new_endpoint_index; + + if ((!is_video) || (m.m_endpoint_predictor != basist::CR_ENDPOINT_PRED_INDEX)) + { + if (!selector_rle_count) + { + uint32_t selector_sym_index = selector_syms[slice_index][cur_selector_sym_ofs++]; + + if (selector_sym_index == SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX) + selector_rle_count = selector_syms[slice_index][cur_selector_sym_ofs++]; + + total_selector_bits += coder.put_code(selector_sym_index, selector_model); + + if (selector_sym_index == SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX) + { + int run_sym = selector_rle_count - basist::SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH; + if (run_sym >= ((int)basist::SELECTOR_HISTORY_BUF_RLE_COUNT_TOTAL - 1)) + { + total_selector_bits += coder.put_code(basist::SELECTOR_HISTORY_BUF_RLE_COUNT_TOTAL - 1, selector_history_buf_rle_model); + + uint32_t n = selector_rle_count - basist::SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH; + total_selector_bits += coder.put_vlc(n, 7); + } + else + total_selector_bits += coder.put_code(run_sym, selector_history_buf_rle_model); + } + } + + if (selector_rle_count) + selector_rle_count--; + } + + } // block_x + + } // block_y + + BASISU_BACKEND_VERIFY(cur_endpoint_pred_sym_ofs == endpoint_pred_syms[slice_index].size()); + BASISU_BACKEND_VERIFY(cur_selector_sym_ofs == selector_syms[slice_index].size()); + + coder.flush(); + + m_output.m_slice_image_data[slice_index] = coder.get_bytes(); + + total_image_bytes += (uint32_t)coder.get_bytes().size(); + + debug_printf("Slice %u compressed size: %u bytes, %3.3f bits per slice texel\n", slice_index, m_output.m_slice_image_data[slice_index].size(), m_output.m_slice_image_data[slice_index].size() * 8.0f / (m_slices[slice_index].m_orig_width * m_slices[slice_index].m_orig_height)); + + } // slice_index + + const double total_texels = static_cast(get_total_input_texels()); + const double total_blocks = static_cast(get_total_blocks()); + + debug_printf("Total endpoint pred bits: %u bytes: %u bits/texel: %3.3f bits/block: %3.3f\n", total_endpoint_pred_bits, total_endpoint_pred_bits / 8, total_endpoint_pred_bits / total_texels, total_endpoint_pred_bits / total_blocks); + debug_printf("Total delta endpoint bits: %u bytes: %u bits/texel: %3.3f bits/block: %3.3f\n", total_delta_endpoint_bits, total_delta_endpoint_bits / 8, total_delta_endpoint_bits / total_texels, total_delta_endpoint_bits / total_blocks); + debug_printf("Total selector bits: %u bytes: %u bits/texel: %3.3f bits/block: %3.3f\n", total_selector_bits, total_selector_bits / 8, total_selector_bits / total_texels, total_selector_bits / total_blocks); + + debug_printf("Total table bytes: %u, %3.3f bits/texel\n", m_output.m_slice_image_tables.size(), m_output.m_slice_image_tables.size() * 8.0f / total_texels); + debug_printf("Total image bytes: %u, %3.3f bits/texel\n", total_image_bytes, total_image_bytes * 8.0f / total_texels); + + return true; + } + + bool basisu_backend::encode_endpoint_palette() + { + const basisu_frontend& r = *m_pFront_end; + + // The endpoint indices may have been changed by the backend's RDO step, so go and figure out which ones are actually used again. + bool_vec old_endpoint_was_used(r.get_total_endpoint_clusters()); + uint32_t first_old_entry_index = UINT32_MAX; + + for (uint32_t slice_index = 0; slice_index < m_slices.size(); slice_index++) + { + const uint32_t num_blocks_x = m_slices[slice_index].m_num_blocks_x, num_blocks_y = m_slices[slice_index].m_num_blocks_y; + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + encoder_block& m = m_slice_encoder_blocks[slice_index](block_x, block_y); + const uint32_t old_endpoint_index = m.m_endpoint_index; + + old_endpoint_was_used[old_endpoint_index] = true; + first_old_entry_index = basisu::minimum(first_old_entry_index, old_endpoint_index); + } // block_x + } // block_y + } // slice_index + + debug_printf("basisu_backend::encode_endpoint_palette: first_old_entry_index: %u\n", first_old_entry_index); + + // Maps NEW to OLD endpoints + uint_vec endpoint_remap_table_new_to_old(r.get_total_endpoint_clusters()); + endpoint_remap_table_new_to_old.set_all(first_old_entry_index); + + bool_vec new_endpoint_was_used(r.get_total_endpoint_clusters()); + + for (uint32_t old_endpoint_index = 0; old_endpoint_index < m_endpoint_remap_table_old_to_new.size(); old_endpoint_index++) + { + if (old_endpoint_was_used[old_endpoint_index]) + { + const uint32_t new_endpoint_index = m_endpoint_remap_table_old_to_new[old_endpoint_index]; + + new_endpoint_was_used[new_endpoint_index] = true; + + endpoint_remap_table_new_to_old[new_endpoint_index] = old_endpoint_index; + } + } + + // TODO: Some new endpoint palette entries may actually be unused and aren't worth coding. Fix that. + + uint32_t total_unused_new_entries = 0; + for (uint32_t i = 0; i < new_endpoint_was_used.size(); i++) + if (!new_endpoint_was_used[i]) + total_unused_new_entries++; + debug_printf("basisu_backend::encode_endpoint_palette: total_unused_new_entries: %u out of %u\n", total_unused_new_entries, new_endpoint_was_used.size()); + + bool is_grayscale = true; + for (uint32_t old_endpoint_index = 0; old_endpoint_index < (uint32_t)m_endpoint_palette.size(); old_endpoint_index++) + { + int r5 = m_endpoint_palette[old_endpoint_index].m_color5[0]; + int g5 = m_endpoint_palette[old_endpoint_index].m_color5[1]; + int b5 = m_endpoint_palette[old_endpoint_index].m_color5[2]; + if ((r5 != g5) || (r5 != b5)) + { + is_grayscale = false; + break; + } + } + + histogram color5_delta_hist0(32); // prev 0-9, delta is -9 to 31 + histogram color5_delta_hist1(32); // prev 10-21, delta is -21 to 21 + histogram color5_delta_hist2(32); // prev 22-31, delta is -31 to 9 + histogram inten_delta_hist(8); + + color_rgba prev_color5(16, 16, 16, 0); + uint32_t prev_inten = 0; + + for (uint32_t new_endpoint_index = 0; new_endpoint_index < r.get_total_endpoint_clusters(); new_endpoint_index++) + { + const uint32_t old_endpoint_index = endpoint_remap_table_new_to_old[new_endpoint_index]; + + int delta_inten = m_endpoint_palette[old_endpoint_index].m_inten5 - prev_inten; + inten_delta_hist.inc(delta_inten & 7); + prev_inten = m_endpoint_palette[old_endpoint_index].m_inten5; + + for (uint32_t i = 0; i < (is_grayscale ? 1U : 3U); i++) + { + const int delta = (m_endpoint_palette[old_endpoint_index].m_color5[i] - prev_color5[i]) & 31; + + if (prev_color5[i] <= basist::COLOR5_PAL0_PREV_HI) + color5_delta_hist0.inc(delta); + else if (prev_color5[i] <= basist::COLOR5_PAL1_PREV_HI) + color5_delta_hist1.inc(delta); + else + color5_delta_hist2.inc(delta); + + prev_color5[i] = m_endpoint_palette[old_endpoint_index].m_color5[i]; + } + } + + if (!color5_delta_hist0.get_total()) color5_delta_hist0.inc(0); + if (!color5_delta_hist1.get_total()) color5_delta_hist1.inc(0); + if (!color5_delta_hist2.get_total()) color5_delta_hist2.inc(0); + + huffman_encoding_table color5_delta_model0, color5_delta_model1, color5_delta_model2, inten_delta_model; + if (!color5_delta_model0.init(color5_delta_hist0, 16)) + { + error_printf("color5_delta_model.init() failed!"); + return false; + } + + if (!color5_delta_model1.init(color5_delta_hist1, 16)) + { + error_printf("color5_delta_model.init() failed!"); + return false; + } + + if (!color5_delta_model2.init(color5_delta_hist2, 16)) + { + error_printf("color5_delta_model.init() failed!"); + return false; + } + + if (!inten_delta_model.init(inten_delta_hist, 16)) + { + error_printf("inten3_model.init() failed!"); + return false; + } + + bitwise_coder coder; + + coder.init(8192); + + coder.emit_huffman_table(color5_delta_model0); + coder.emit_huffman_table(color5_delta_model1); + coder.emit_huffman_table(color5_delta_model2); + coder.emit_huffman_table(inten_delta_model); + + coder.put_bits(is_grayscale, 1); + + prev_color5.set(16, 16, 16, 0); + prev_inten = 0; + + for (uint32_t new_endpoint_index = 0; new_endpoint_index < r.get_total_endpoint_clusters(); new_endpoint_index++) + { + const uint32_t old_endpoint_index = endpoint_remap_table_new_to_old[new_endpoint_index]; + + int delta_inten = (m_endpoint_palette[old_endpoint_index].m_inten5 - prev_inten) & 7; + coder.put_code(delta_inten, inten_delta_model); + prev_inten = m_endpoint_palette[old_endpoint_index].m_inten5; + + for (uint32_t i = 0; i < (is_grayscale ? 1U : 3U); i++) + { + const int delta = (m_endpoint_palette[old_endpoint_index].m_color5[i] - prev_color5[i]) & 31; + + if (prev_color5[i] <= basist::COLOR5_PAL0_PREV_HI) + coder.put_code(delta, color5_delta_model0); + else if (prev_color5[i] <= basist::COLOR5_PAL1_PREV_HI) + coder.put_code(delta, color5_delta_model1); + else + coder.put_code(delta, color5_delta_model2); + + prev_color5[i] = m_endpoint_palette[old_endpoint_index].m_color5[i]; + } + + } // q + + coder.flush(); + + m_output.m_endpoint_palette = coder.get_bytes(); + + debug_printf("Endpoint codebook size: %u bits %u bytes, Bits per entry: %3.1f, Avg bits/texel: %3.3f\n", + 8 * (int)m_output.m_endpoint_palette.size(), (int)m_output.m_endpoint_palette.size(), m_output.m_endpoint_palette.size() * 8.0f / r.get_total_endpoint_clusters(), m_output.m_endpoint_palette.size() * 8.0f / get_total_input_texels()); + + return true; + } + + bool basisu_backend::encode_selector_palette() + { + const basisu_frontend& r = *m_pFront_end; + + histogram delta_selector_pal_histogram(256); + + for (uint32_t q = 0; q < r.get_total_selector_clusters(); q++) + { + if (!q) + continue; + + const etc1_selector_palette_entry& cur = m_selector_palette[m_selector_remap_table_new_to_old[q]]; + const etc1_selector_palette_entry predictor(m_selector_palette[m_selector_remap_table_new_to_old[q - 1]]); + + for (uint32_t j = 0; j < 4; j++) + delta_selector_pal_histogram.inc(cur.get_byte(j) ^ predictor.get_byte(j)); + } + + if (!delta_selector_pal_histogram.get_total()) + delta_selector_pal_histogram.inc(0); + + huffman_encoding_table delta_selector_pal_model; + if (!delta_selector_pal_model.init(delta_selector_pal_histogram, 16)) + { + error_printf("delta_selector_pal_model.init() failed!"); + return false; + } + + bitwise_coder coder; + coder.init(1024 * 1024); + + coder.put_bits(0, 1); // use global codebook + coder.put_bits(0, 1); // uses hybrid codebooks + + coder.put_bits(0, 1); // raw bytes + + coder.emit_huffman_table(delta_selector_pal_model); + + for (uint32_t q = 0; q < r.get_total_selector_clusters(); q++) + { + if (!q) + { + for (uint32_t j = 0; j < 4; j++) + coder.put_bits(m_selector_palette[m_selector_remap_table_new_to_old[q]].get_byte(j), 8); + continue; + } + + const etc1_selector_palette_entry& cur = m_selector_palette[m_selector_remap_table_new_to_old[q]]; + const etc1_selector_palette_entry predictor(m_selector_palette[m_selector_remap_table_new_to_old[q - 1]]); + + for (uint32_t j = 0; j < 4; j++) + coder.put_code(cur.get_byte(j) ^ predictor.get_byte(j), delta_selector_pal_model); + } + + coder.flush(); + + m_output.m_selector_palette = coder.get_bytes(); + + if (m_output.m_selector_palette.size() >= r.get_total_selector_clusters() * 4) + { + coder.init(1024 * 1024); + + coder.put_bits(0, 1); // use global codebook + coder.put_bits(0, 1); // uses hybrid codebooks + + coder.put_bits(1, 1); // raw bytes + + for (uint32_t q = 0; q < r.get_total_selector_clusters(); q++) + { + const uint32_t i = m_selector_remap_table_new_to_old[q]; + + for (uint32_t j = 0; j < 4; j++) + coder.put_bits(m_selector_palette[i].get_byte(j), 8); + } + + coder.flush(); + + m_output.m_selector_palette = coder.get_bytes(); + } + + debug_printf("Selector codebook bits: %u bytes: %u, Bits per entry: %3.1f, Avg bits/texel: %3.3f\n", + (int)m_output.m_selector_palette.size() * 8, (int)m_output.m_selector_palette.size(), + m_output.m_selector_palette.size() * 8.0f / r.get_total_selector_clusters(), m_output.m_selector_palette.size() * 8.0f / get_total_input_texels()); + + return true; + } + + uint32_t basisu_backend::encode() + { + //const bool is_video = m_pFront_end->get_params().m_tex_type == basist::cBASISTexTypeVideoFrames; + m_output.m_slice_desc = m_slices; + m_output.m_etc1s = m_params.m_etc1s; + m_output.m_uses_global_codebooks = m_params.m_used_global_codebooks; + m_output.m_srgb = m_pFront_end->get_params().m_perceptual; + + create_endpoint_palette(); + create_selector_palette(); + + create_encoder_blocks(); + + if (!encode_image()) + return 0; + + if (!encode_endpoint_palette()) + return 0; + + if (!encode_selector_palette()) + return 0; + + uint32_t total_compressed_bytes = (uint32_t)(m_output.m_slice_image_tables.size() + m_output.m_endpoint_palette.size() + m_output.m_selector_palette.size()); + for (uint32_t i = 0; i < m_output.m_slice_image_data.size(); i++) + total_compressed_bytes += (uint32_t)m_output.m_slice_image_data[i].size(); + + debug_printf("Wrote %u bytes, %3.3f bits/texel\n", total_compressed_bytes, total_compressed_bytes * 8.0f / get_total_input_texels()); + + return total_compressed_bytes; + } + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_backend.h b/ktx/external/basisu/encoder/basisu_backend.h new file mode 100644 index 0000000..07778ae --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_backend.h @@ -0,0 +1,409 @@ +// basisu_backend.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once + +#include "../transcoder/basisu.h" +#include "basisu_enc.h" +#include "../transcoder/basisu_transcoder_internal.h" +#include "basisu_frontend.h" + +namespace basisu +{ + struct etc1_selector_palette_entry + { + etc1_selector_palette_entry() + { + clear(); + } + + void clear() + { + basisu::clear_obj(*this); + } + + uint8_t operator[] (uint32_t i) const { assert(i < 16); return m_selectors[i]; } + uint8_t& operator[] (uint32_t i) { assert(i < 16); return m_selectors[i]; } + + void set_uint32(uint32_t v) + { + for (uint32_t byte_index = 0; byte_index < 4; byte_index++) + { + uint32_t b = (v >> (byte_index * 8)) & 0xFF; + + m_selectors[byte_index * 4 + 0] = b & 3; + m_selectors[byte_index * 4 + 1] = (b >> 2) & 3; + m_selectors[byte_index * 4 + 2] = (b >> 4) & 3; + m_selectors[byte_index * 4 + 3] = (b >> 6) & 3; + } + } + + uint32_t get_uint32() const + { + return get_byte(0) | (get_byte(1) << 8) | (get_byte(2) << 16) | (get_byte(3) << 24); + } + + uint32_t get_byte(uint32_t byte_index) const + { + assert(byte_index < 4); + + return m_selectors[byte_index * 4 + 0] | + (m_selectors[byte_index * 4 + 1] << 2) | + (m_selectors[byte_index * 4 + 2] << 4) | + (m_selectors[byte_index * 4 + 3] << 6); + } + + uint8_t operator()(uint32_t x, uint32_t y) const { assert((x < 4) && (y < 4)); return m_selectors[x + y * 4]; } + uint8_t& operator()(uint32_t x, uint32_t y) { assert((x < 4) && (y < 4)); return m_selectors[x + y * 4]; } + + bool operator< (const etc1_selector_palette_entry& other) const + { + for (uint32_t i = 0; i < 16; i++) + { + if (m_selectors[i] < other.m_selectors[i]) + return true; + else if (m_selectors[i] != other.m_selectors[i]) + return false; + } + + return false; + } + + bool operator== (const etc1_selector_palette_entry& other) const + { + for (uint32_t i = 0; i < 16; i++) + { + if (m_selectors[i] != other.m_selectors[i]) + return false; + } + + return true; + } + + private: + uint8_t m_selectors[16]; + }; + + typedef basisu::vector etc1_selector_palette_entry_vec; + + struct encoder_block + { + encoder_block() + { + clear(); + } + + uint32_t m_endpoint_predictor; + + int m_endpoint_index; + int m_selector_index; + + int m_selector_history_buf_index; + + bool m_is_cr_target; + void clear() + { + m_endpoint_predictor = 0; + + m_endpoint_index = 0; + m_selector_index = 0; + + m_selector_history_buf_index = 0; + m_is_cr_target = false; + } + }; + + typedef basisu::vector encoder_block_vec; + typedef vector2D encoder_block_vec2D; + + struct etc1_endpoint_palette_entry + { + etc1_endpoint_palette_entry() + { + clear(); + } + + color_rgba m_color5; + uint32_t m_inten5; + bool m_color5_valid; + + void clear() + { + clear_obj(*this); + } + }; + + typedef basisu::vector etc1_endpoint_palette_entry_vec; + + struct basisu_backend_params + { + bool m_etc1s; + bool m_debug, m_debug_images; + float m_endpoint_rdo_quality_thresh; + float m_selector_rdo_quality_thresh; + uint32_t m_compression_level; + + bool m_used_global_codebooks; + + bool m_validate; + + basisu_backend_params() + { + clear(); + } + + void clear() + { + m_etc1s = false; + m_debug = false; + m_debug_images = false; + m_endpoint_rdo_quality_thresh = 0.0f; + m_selector_rdo_quality_thresh = 0.0f; + m_compression_level = 0; + m_used_global_codebooks = false; + m_validate = true; + } + }; + + struct basisu_backend_slice_desc + { + basisu_backend_slice_desc() + { + clear(); + } + + void clear() + { + clear_obj(*this); + } + + uint32_t m_first_block_index; + + uint32_t m_orig_width; + uint32_t m_orig_height; + + uint32_t m_width; + uint32_t m_height; + + uint32_t m_num_blocks_x; + uint32_t m_num_blocks_y; + + uint32_t m_num_macroblocks_x; + uint32_t m_num_macroblocks_y; + + uint32_t m_source_file_index; // also the basis image index + uint32_t m_mip_index; + bool m_alpha; + bool m_iframe; + }; + + typedef basisu::vector basisu_backend_slice_desc_vec; + + struct basisu_backend_output + { + basist::basis_tex_format m_tex_format; + + bool m_etc1s; + bool m_uses_global_codebooks; + bool m_srgb; + + uint32_t m_num_endpoints; + uint32_t m_num_selectors; + + uint8_vec m_endpoint_palette; + uint8_vec m_selector_palette; + + basisu_backend_slice_desc_vec m_slice_desc; + + uint8_vec m_slice_image_tables; + basisu::vector m_slice_image_data; + uint16_vec m_slice_image_crcs; + + basisu_backend_output() + { + clear(); + } + + void clear() + { + m_tex_format = basist::basis_tex_format::cETC1S; + m_etc1s = false; + m_uses_global_codebooks = false; + m_srgb = true; + + m_num_endpoints = 0; + m_num_selectors = 0; + + m_endpoint_palette.clear(); + m_selector_palette.clear(); + m_slice_desc.clear(); + m_slice_image_tables.clear(); + m_slice_image_data.clear(); + m_slice_image_crcs.clear(); + } + + uint32_t get_output_size_estimate() const + { + uint32_t total_compressed_bytes = (uint32_t)(m_slice_image_tables.size() + m_endpoint_palette.size() + m_selector_palette.size()); + for (uint32_t i = 0; i < m_slice_image_data.size(); i++) + total_compressed_bytes += (uint32_t)m_slice_image_data[i].size(); + + return total_compressed_bytes; + } + }; + + class basisu_backend + { + BASISU_NO_EQUALS_OR_COPY_CONSTRUCT(basisu_backend); + + public: + + basisu_backend(); + + void clear(); + + void init(basisu_frontend *pFront_end, basisu_backend_params ¶ms, const basisu_backend_slice_desc_vec &slice_desc); + + uint32_t encode(); + + const basisu_backend_output &get_output() const { return m_output; } + const basisu_backend_params& get_params() const { return m_params; } + + private: + basisu_frontend *m_pFront_end; + basisu_backend_params m_params; + basisu_backend_slice_desc_vec m_slices; + basisu_backend_output m_output; + + etc1_endpoint_palette_entry_vec m_endpoint_palette; + etc1_selector_palette_entry_vec m_selector_palette; + + struct etc1_global_selector_cb_entry_desc + { + uint32_t m_pal_index; + uint32_t m_mod_index; + bool m_was_used; + }; + + typedef basisu::vector etc1_global_selector_cb_entry_desc_vec; + + etc1_global_selector_cb_entry_desc_vec m_global_selector_palette_desc; + + basisu::vector m_slice_encoder_blocks; + + // Maps OLD to NEW endpoint/selector indices + uint_vec m_endpoint_remap_table_old_to_new; + uint_vec m_endpoint_remap_table_new_to_old; + bool_vec m_old_endpoint_was_used; + bool_vec m_new_endpoint_was_used; + + uint_vec m_selector_remap_table_old_to_new; + + // Maps NEW to OLD endpoint/selector indices + uint_vec m_selector_remap_table_new_to_old; + + uint32_t get_total_slices() const + { + return (uint32_t)m_slices.size(); + } + + uint32_t get_total_slice_blocks() const + { + return m_pFront_end->get_total_output_blocks(); + } + + uint32_t get_block_index(uint32_t slice_index, uint32_t block_x, uint32_t block_y) const + { + const basisu_backend_slice_desc &slice = m_slices[slice_index]; + + assert((block_x < slice.m_num_blocks_x) && (block_y < slice.m_num_blocks_y)); + + return slice.m_first_block_index + block_y * slice.m_num_blocks_x + block_x; + } + + uint32_t get_total_blocks(uint32_t slice_index) const + { + return m_slices[slice_index].m_num_blocks_x * m_slices[slice_index].m_num_blocks_y; + } + + uint32_t get_total_blocks() const + { + uint32_t total_blocks = 0; + for (uint32_t i = 0; i < m_slices.size(); i++) + total_blocks += get_total_blocks(i); + return total_blocks; + } + + // Returns the total number of input texels, not counting padding up to blocks/macroblocks. + uint32_t get_total_input_texels(uint32_t slice_index) const + { + return m_slices[slice_index].m_orig_width * m_slices[slice_index].m_orig_height; + } + + uint32_t get_total_input_texels() const + { + uint32_t total_texels = 0; + for (uint32_t i = 0; i < m_slices.size(); i++) + total_texels += get_total_input_texels(i); + return total_texels; + } + + int find_slice(uint32_t block_index, uint32_t *pBlock_x, uint32_t *pBlock_y) const + { + for (uint32_t i = 0; i < m_slices.size(); i++) + { + if ((block_index >= m_slices[i].m_first_block_index) && (block_index < (m_slices[i].m_first_block_index + m_slices[i].m_num_blocks_x * m_slices[i].m_num_blocks_y))) + { + const uint32_t ofs = block_index - m_slices[i].m_first_block_index; + const uint32_t x = ofs % m_slices[i].m_num_blocks_x; + const uint32_t y = ofs / m_slices[i].m_num_blocks_x; + + if (pBlock_x) *pBlock_x = x; + if (pBlock_y) *pBlock_y = y; + + return i; + } + } + return -1; + } + + void create_endpoint_palette(); + + void create_selector_palette(); + + // endpoint palette + // 5:5:5 and predicted 4:4:4 colors, 1 or 2 3-bit intensity table indices + // selector palette + // 4x4 2-bit selectors + + // per-macroblock: + // 4 diff bits + // 4 flip bits + // Endpoint template index, 1-8 endpoint indices + // Alternately, if no template applies, we can send 4 ETC1S bits followed by 4-8 endpoint indices + // 4 selector indices + + void reoptimize_and_sort_endpoints_codebook(uint32_t total_block_endpoints_remapped, uint_vec &all_endpoint_indices); + void sort_selector_codebook(); + void create_encoder_blocks(); + void compute_slice_crcs(); + bool encode_image(); + bool encode_endpoint_palette(); + bool encode_selector_palette(); + int find_video_frame(int slice_index, int delta); + void check_for_valid_cr_blocks(); + }; + +} // namespace basisu + diff --git a/ktx/external/basisu/encoder/basisu_basis_file.cpp b/ktx/external/basisu/encoder/basisu_basis_file.cpp new file mode 100644 index 0000000..f4c77be --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_basis_file.cpp @@ -0,0 +1,269 @@ +// basisu_basis_file.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_basis_file.h" +#include "../transcoder/basisu_transcoder.h" + +// The output file version. Keep in sync with BASISD_SUPPORTED_BASIS_VERSION. +#define BASIS_FILE_VERSION (0x13) + +namespace basisu +{ + void basisu_file::create_header(const basisu_backend_output &encoder_output, basist::basis_texture_type tex_type, uint32_t userdata0, uint32_t userdata1, bool y_flipped, uint32_t us_per_frame) + { + m_header.m_header_size = sizeof(basist::basis_file_header); + + m_header.m_data_size = m_total_file_size - sizeof(basist::basis_file_header); + + m_header.m_total_slices = (uint32_t)encoder_output.m_slice_desc.size(); + + m_header.m_total_images = 0; + for (uint32_t i = 0; i < encoder_output.m_slice_desc.size(); i++) + m_header.m_total_images = maximum(m_header.m_total_images, encoder_output.m_slice_desc[i].m_source_file_index + 1); + + m_header.m_tex_format = (int)encoder_output.m_tex_format; + m_header.m_flags = 0; + + if (encoder_output.m_etc1s) + { + assert(encoder_output.m_tex_format == basist::basis_tex_format::cETC1S); + m_header.m_flags = m_header.m_flags | basist::cBASISHeaderFlagETC1S; + } + else + { + assert(encoder_output.m_tex_format != basist::basis_tex_format::cETC1S); + } + + if (y_flipped) + m_header.m_flags = m_header.m_flags | basist::cBASISHeaderFlagYFlipped; + if (encoder_output.m_uses_global_codebooks) + m_header.m_flags = m_header.m_flags | basist::cBASISHeaderFlagUsesGlobalCodebook; + if (encoder_output.m_srgb) + m_header.m_flags = m_header.m_flags | basist::cBASISHeaderFlagSRGB; + + for (uint32_t i = 0; i < encoder_output.m_slice_desc.size(); i++) + { + if (encoder_output.m_slice_desc[i].m_alpha) + { + m_header.m_flags = m_header.m_flags | basist::cBASISHeaderFlagHasAlphaSlices; + break; + } + } + + m_header.m_tex_type = static_cast(tex_type); + m_header.m_us_per_frame = clamp(us_per_frame, 0, basist::cBASISMaxUSPerFrame); + + m_header.m_userdata0 = userdata0; + m_header.m_userdata1 = userdata1; + + m_header.m_total_endpoints = encoder_output.m_num_endpoints; + if (!encoder_output.m_uses_global_codebooks) + { + m_header.m_endpoint_cb_file_ofs = m_endpoint_cb_file_ofs; + m_header.m_endpoint_cb_file_size = (uint32_t)encoder_output.m_endpoint_palette.size(); + } + else + { + assert(!m_endpoint_cb_file_ofs); + } + + m_header.m_total_selectors = encoder_output.m_num_selectors; + if (!encoder_output.m_uses_global_codebooks) + { + m_header.m_selector_cb_file_ofs = m_selector_cb_file_ofs; + m_header.m_selector_cb_file_size = (uint32_t)encoder_output.m_selector_palette.size(); + } + else + { + assert(!m_selector_cb_file_ofs); + } + + m_header.m_tables_file_ofs = m_tables_file_ofs; + m_header.m_tables_file_size = (uint32_t)encoder_output.m_slice_image_tables.size(); + + m_header.m_slice_desc_file_ofs = m_slice_descs_file_ofs; + } + + bool basisu_file::create_image_descs(const basisu_backend_output &encoder_output) + { + const basisu_backend_slice_desc_vec &slice_descs = encoder_output.m_slice_desc; + + m_images_descs.resize(slice_descs.size()); + + uint64_t cur_slice_file_ofs = m_first_image_file_ofs; + for (uint32_t i = 0; i < slice_descs.size(); i++) + { + clear_obj(m_images_descs[i]); + + m_images_descs[i].m_image_index = slice_descs[i].m_source_file_index; + m_images_descs[i].m_level_index = slice_descs[i].m_mip_index; + + if (slice_descs[i].m_alpha) + m_images_descs[i].m_flags = m_images_descs[i].m_flags | basist::cSliceDescFlagsHasAlpha; + if (slice_descs[i].m_iframe) + m_images_descs[i].m_flags = m_images_descs[i].m_flags | basist::cSliceDescFlagsFrameIsIFrame; + + m_images_descs[i].m_orig_width = slice_descs[i].m_orig_width; + m_images_descs[i].m_orig_height = slice_descs[i].m_orig_height; + m_images_descs[i].m_num_blocks_x = slice_descs[i].m_num_blocks_x; + m_images_descs[i].m_num_blocks_y = slice_descs[i].m_num_blocks_y; + m_images_descs[i].m_slice_data_crc16 = encoder_output.m_slice_image_crcs[i]; + + if (encoder_output.m_slice_image_data[i].size() > UINT32_MAX) + { + error_printf("basisu_file::create_image_descs: Basis file too large\n"); + return false; + } + + const uint32_t image_size = (uint32_t)encoder_output.m_slice_image_data[i].size(); + + m_images_descs[i].m_file_ofs = (uint32_t)cur_slice_file_ofs; + m_images_descs[i].m_file_size = image_size; + + cur_slice_file_ofs += image_size; + if (cur_slice_file_ofs > UINT32_MAX) + { + error_printf("basisu_file::create_image_descs: Basis file too large\n"); + return false; + } + } + + assert(cur_slice_file_ofs == m_total_file_size); + return true; + } + + void basisu_file::create_comp_data(const basisu_backend_output &encoder_output) + { + const basisu_backend_slice_desc_vec &slice_descs = encoder_output.m_slice_desc; + + append_vector(m_comp_data, reinterpret_cast(&m_header), sizeof(m_header)); + + assert(m_comp_data.size() == m_slice_descs_file_ofs); + append_vector(m_comp_data, reinterpret_cast(&m_images_descs[0]), m_images_descs.size() * sizeof(m_images_descs[0])); + + if (!encoder_output.m_uses_global_codebooks) + { + if (encoder_output.m_endpoint_palette.size()) + { + assert(m_comp_data.size() == m_endpoint_cb_file_ofs); + append_vector(m_comp_data, reinterpret_cast(&encoder_output.m_endpoint_palette[0]), encoder_output.m_endpoint_palette.size()); + } + + if (encoder_output.m_selector_palette.size()) + { + assert(m_comp_data.size() == m_selector_cb_file_ofs); + append_vector(m_comp_data, reinterpret_cast(&encoder_output.m_selector_palette[0]), encoder_output.m_selector_palette.size()); + } + } + + if (encoder_output.m_slice_image_tables.size()) + { + assert(m_comp_data.size() == m_tables_file_ofs); + append_vector(m_comp_data, reinterpret_cast(&encoder_output.m_slice_image_tables[0]), encoder_output.m_slice_image_tables.size()); + } + + assert(m_comp_data.size() == m_first_image_file_ofs); + for (uint32_t i = 0; i < slice_descs.size(); i++) + append_vector(m_comp_data, &encoder_output.m_slice_image_data[i][0], encoder_output.m_slice_image_data[i].size()); + + assert(m_comp_data.size() == m_total_file_size); + } + + void basisu_file::fixup_crcs() + { + basist::basis_file_header *pHeader = reinterpret_cast(&m_comp_data[0]); + + pHeader->m_data_size = m_total_file_size - sizeof(basist::basis_file_header); + pHeader->m_data_crc16 = basist::crc16(&m_comp_data[0] + sizeof(basist::basis_file_header), m_total_file_size - sizeof(basist::basis_file_header), 0); + + pHeader->m_header_crc16 = basist::crc16(&pHeader->m_data_size, sizeof(basist::basis_file_header) - BASISU_OFFSETOF(basist::basis_file_header, m_data_size), 0); + + pHeader->m_sig = basist::basis_file_header::cBASISSigValue; + pHeader->m_ver = BASIS_FILE_VERSION;// basist::basis_file_header::cBASISFirstVersion; + } + + bool basisu_file::init(const basisu_backend_output &encoder_output, basist::basis_texture_type tex_type, uint32_t userdata0, uint32_t userdata1, bool y_flipped, uint32_t us_per_frame) + { + clear(); + + const basisu_backend_slice_desc_vec &slice_descs = encoder_output.m_slice_desc; + + // The Basis file uses 32-bit fields for lots of stuff, so make sure it's not too large. + uint64_t check_size = 0; + if (!encoder_output.m_uses_global_codebooks) + { + check_size = (uint64_t)sizeof(basist::basis_file_header) + (uint64_t)sizeof(basist::basis_slice_desc) * slice_descs.size() + + (uint64_t)encoder_output.m_endpoint_palette.size() + (uint64_t)encoder_output.m_selector_palette.size() + (uint64_t)encoder_output.m_slice_image_tables.size(); + } + else + { + check_size = (uint64_t)sizeof(basist::basis_file_header) + (uint64_t)sizeof(basist::basis_slice_desc) * slice_descs.size() + + (uint64_t)encoder_output.m_slice_image_tables.size(); + } + if (check_size >= 0xFFFF0000ULL) + { + error_printf("basisu_file::init: File is too large!\n"); + return false; + } + + m_header_file_ofs = 0; + m_slice_descs_file_ofs = sizeof(basist::basis_file_header); + if (encoder_output.m_tex_format == basist::basis_tex_format::cETC1S) + { + if (encoder_output.m_uses_global_codebooks) + { + m_endpoint_cb_file_ofs = 0; + m_selector_cb_file_ofs = 0; + m_tables_file_ofs = m_slice_descs_file_ofs + sizeof(basist::basis_slice_desc) * (uint32_t)slice_descs.size(); + } + else + { + m_endpoint_cb_file_ofs = m_slice_descs_file_ofs + sizeof(basist::basis_slice_desc) * (uint32_t)slice_descs.size(); + m_selector_cb_file_ofs = m_endpoint_cb_file_ofs + (uint32_t)encoder_output.m_endpoint_palette.size(); + m_tables_file_ofs = m_selector_cb_file_ofs + (uint32_t)encoder_output.m_selector_palette.size(); + } + m_first_image_file_ofs = m_tables_file_ofs + (uint32_t)encoder_output.m_slice_image_tables.size(); + } + else + { + m_endpoint_cb_file_ofs = 0; + m_selector_cb_file_ofs = 0; + m_tables_file_ofs = 0; + m_first_image_file_ofs = m_slice_descs_file_ofs + sizeof(basist::basis_slice_desc) * (uint32_t)slice_descs.size(); + } + + uint64_t total_file_size = m_first_image_file_ofs; + for (uint32_t i = 0; i < encoder_output.m_slice_image_data.size(); i++) + total_file_size += encoder_output.m_slice_image_data[i].size(); + if (total_file_size >= 0xFFFF0000ULL) + { + error_printf("basisu_file::init: File is too large!\n"); + return false; + } + + m_total_file_size = (uint32_t)total_file_size; + + create_header(encoder_output, tex_type, userdata0, userdata1, y_flipped, us_per_frame); + + if (!create_image_descs(encoder_output)) + return false; + + create_comp_data(encoder_output); + + fixup_crcs(); + + return true; + } + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_basis_file.h b/ktx/external/basisu/encoder/basisu_basis_file.h new file mode 100644 index 0000000..98498a0 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_basis_file.h @@ -0,0 +1,70 @@ +// basisu_basis_file.h +// Copyright (C) 2019 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once +#include "../transcoder/basisu_file_headers.h" +#include "basisu_backend.h" + +namespace basisu +{ + class basisu_file + { + BASISU_NO_EQUALS_OR_COPY_CONSTRUCT(basisu_file); + + public: + basisu_file() + { + } + + void clear() + { + m_comp_data.clear(); + + clear_obj(m_header); + m_images_descs.clear(); + + m_header_file_ofs = 0; + m_slice_descs_file_ofs = 0; + m_endpoint_cb_file_ofs = 0; + m_selector_cb_file_ofs = 0; + m_tables_file_ofs = 0; + m_first_image_file_ofs = 0; + m_total_file_size = 0; + } + + bool init(const basisu_backend_output& encoder_output, basist::basis_texture_type tex_type, uint32_t userdata0, uint32_t userdata1, bool y_flipped, uint32_t us_per_frame); + + const uint8_vec &get_compressed_data() const { return m_comp_data; } + + private: + basist::basis_file_header m_header; + basisu::vector m_images_descs; + + uint8_vec m_comp_data; + + uint32_t m_header_file_ofs; + uint32_t m_slice_descs_file_ofs; + uint32_t m_endpoint_cb_file_ofs; + uint32_t m_selector_cb_file_ofs; + uint32_t m_tables_file_ofs; + uint32_t m_first_image_file_ofs; + uint32_t m_total_file_size; + + void create_header(const basisu_backend_output& encoder_output, basist::basis_texture_type tex_type, uint32_t userdata0, uint32_t userdata1, bool y_flipped, uint32_t us_per_frame); + bool create_image_descs(const basisu_backend_output& encoder_output); + void create_comp_data(const basisu_backend_output& encoder_output); + void fixup_crcs(); + }; + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_bc7enc.cpp b/ktx/external/basisu/encoder/basisu_bc7enc.cpp new file mode 100644 index 0000000..7d2bbfa --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_bc7enc.cpp @@ -0,0 +1,1992 @@ +// File: basisu_bc7enc.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_bc7enc.h" + +#ifdef _DEBUG +#define BC7ENC_CHECK_OVERALL_ERROR 1 +#else +#define BC7ENC_CHECK_OVERALL_ERROR 0 +#endif + +using namespace basist; + +namespace basisu +{ + +// Helpers +static inline color_quad_u8 *color_quad_u8_set_clamped(color_quad_u8 *pRes, int32_t r, int32_t g, int32_t b, int32_t a) { pRes->m_c[0] = (uint8_t)clampi(r, 0, 255); pRes->m_c[1] = (uint8_t)clampi(g, 0, 255); pRes->m_c[2] = (uint8_t)clampi(b, 0, 255); pRes->m_c[3] = (uint8_t)clampi(a, 0, 255); return pRes; } +static inline color_quad_u8 *color_quad_u8_set(color_quad_u8 *pRes, int32_t r, int32_t g, int32_t b, int32_t a) { assert((uint32_t)(r | g | b | a) <= 255); pRes->m_c[0] = (uint8_t)r; pRes->m_c[1] = (uint8_t)g; pRes->m_c[2] = (uint8_t)b; pRes->m_c[3] = (uint8_t)a; return pRes; } +static inline bc7enc_bool color_quad_u8_notequals(const color_quad_u8 *pLHS, const color_quad_u8 *pRHS) { return (pLHS->m_c[0] != pRHS->m_c[0]) || (pLHS->m_c[1] != pRHS->m_c[1]) || (pLHS->m_c[2] != pRHS->m_c[2]) || (pLHS->m_c[3] != pRHS->m_c[3]); } +static inline bc7enc_vec4F*vec4F_set_scalar(bc7enc_vec4F*pV, float x) { pV->m_c[0] = x; pV->m_c[1] = x; pV->m_c[2] = x; pV->m_c[3] = x; return pV; } +static inline bc7enc_vec4F*vec4F_set(bc7enc_vec4F*pV, float x, float y, float z, float w) { pV->m_c[0] = x; pV->m_c[1] = y; pV->m_c[2] = z; pV->m_c[3] = w; return pV; } +static inline bc7enc_vec4F*vec4F_saturate_in_place(bc7enc_vec4F*pV) { pV->m_c[0] = saturate(pV->m_c[0]); pV->m_c[1] = saturate(pV->m_c[1]); pV->m_c[2] = saturate(pV->m_c[2]); pV->m_c[3] = saturate(pV->m_c[3]); return pV; } +static inline bc7enc_vec4F vec4F_saturate(const bc7enc_vec4F*pV) { bc7enc_vec4F res; res.m_c[0] = saturate(pV->m_c[0]); res.m_c[1] = saturate(pV->m_c[1]); res.m_c[2] = saturate(pV->m_c[2]); res.m_c[3] = saturate(pV->m_c[3]); return res; } +static inline bc7enc_vec4F vec4F_from_color(const color_quad_u8 *pC) { bc7enc_vec4F res; vec4F_set(&res, pC->m_c[0], pC->m_c[1], pC->m_c[2], pC->m_c[3]); return res; } +static inline bc7enc_vec4F vec4F_add(const bc7enc_vec4F*pLHS, const bc7enc_vec4F*pRHS) { bc7enc_vec4F res; vec4F_set(&res, pLHS->m_c[0] + pRHS->m_c[0], pLHS->m_c[1] + pRHS->m_c[1], pLHS->m_c[2] + pRHS->m_c[2], pLHS->m_c[3] + pRHS->m_c[3]); return res; } +static inline bc7enc_vec4F vec4F_sub(const bc7enc_vec4F*pLHS, const bc7enc_vec4F*pRHS) { bc7enc_vec4F res; vec4F_set(&res, pLHS->m_c[0] - pRHS->m_c[0], pLHS->m_c[1] - pRHS->m_c[1], pLHS->m_c[2] - pRHS->m_c[2], pLHS->m_c[3] - pRHS->m_c[3]); return res; } +static inline float vec4F_dot(const bc7enc_vec4F*pLHS, const bc7enc_vec4F*pRHS) { return pLHS->m_c[0] * pRHS->m_c[0] + pLHS->m_c[1] * pRHS->m_c[1] + pLHS->m_c[2] * pRHS->m_c[2] + pLHS->m_c[3] * pRHS->m_c[3]; } +static inline bc7enc_vec4F vec4F_mul(const bc7enc_vec4F*pLHS, float s) { bc7enc_vec4F res; vec4F_set(&res, pLHS->m_c[0] * s, pLHS->m_c[1] * s, pLHS->m_c[2] * s, pLHS->m_c[3] * s); return res; } +static inline bc7enc_vec4F* vec4F_normalize_in_place(bc7enc_vec4F*pV) { float s = pV->m_c[0] * pV->m_c[0] + pV->m_c[1] * pV->m_c[1] + pV->m_c[2] * pV->m_c[2] + pV->m_c[3] * pV->m_c[3]; if (s != 0.0f) { s = 1.0f / sqrtf(s); pV->m_c[0] *= s; pV->m_c[1] *= s; pV->m_c[2] *= s; pV->m_c[3] *= s; } return pV; } + +// Precomputed weight constants used during least fit determination. For each entry in g_bc7_weights[]: w * w, (1.0f - w) * w, (1.0f - w) * (1.0f - w), w +const float g_bc7_weights1x[2 * 4] = { 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 1.000000f }; + +const float g_bc7_weights2x[4 * 4] = { 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.107666f, 0.220459f, 0.451416f, 0.328125f, 0.451416f, 0.220459f, 0.107666f, 0.671875f, 1.000000f, 0.000000f, 0.000000f, 1.000000f }; + +const float g_bc7_weights3x[8 * 4] = { 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.019775f, 0.120850f, 0.738525f, 0.140625f, 0.079102f, 0.202148f, 0.516602f, 0.281250f, 0.177979f, 0.243896f, 0.334229f, 0.421875f, 0.334229f, 0.243896f, 0.177979f, 0.578125f, 0.516602f, 0.202148f, + 0.079102f, 0.718750f, 0.738525f, 0.120850f, 0.019775f, 0.859375f, 1.000000f, 0.000000f, 0.000000f, 1.000000f }; + +const float g_bc7_weights4x[16 * 4] = { 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.003906f, 0.058594f, 0.878906f, 0.062500f, 0.019775f, 0.120850f, 0.738525f, 0.140625f, 0.041260f, 0.161865f, 0.635010f, 0.203125f, 0.070557f, 0.195068f, 0.539307f, 0.265625f, 0.107666f, 0.220459f, + 0.451416f, 0.328125f, 0.165039f, 0.241211f, 0.352539f, 0.406250f, 0.219727f, 0.249023f, 0.282227f, 0.468750f, 0.282227f, 0.249023f, 0.219727f, 0.531250f, 0.352539f, 0.241211f, 0.165039f, 0.593750f, 0.451416f, 0.220459f, 0.107666f, 0.671875f, 0.539307f, 0.195068f, 0.070557f, 0.734375f, + 0.635010f, 0.161865f, 0.041260f, 0.796875f, 0.738525f, 0.120850f, 0.019775f, 0.859375f, 0.878906f, 0.058594f, 0.003906f, 0.937500f, 1.000000f, 0.000000f, 0.000000f, 1.000000f }; + +const float g_astc_weights4x[16 * 4] = { 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.003906f, 0.058594f, 0.878906f, 0.062500f, 0.015625f, 0.109375f, 0.765625f, 0.125000f, 0.035156f, 0.152344f, 0.660156f, 0.187500f, 0.070557f, 0.195068f, 0.539307f, 0.265625f, 0.107666f, 0.220459f, + 0.451416f, 0.328125f, 0.152588f, 0.238037f, 0.371338f, 0.390625f, 0.205322f, 0.247803f, 0.299072f, 0.453125f, 0.299072f, 0.247803f, 0.205322f, 0.546875f, 0.371338f, 0.238037f, 0.152588f, 0.609375f, 0.451416f, 0.220459f, 0.107666f, 0.671875f, 0.539307f, 0.195068f, 0.070557f, 0.734375f, + 0.660156f, 0.152344f, 0.035156f, 0.812500f, 0.765625f, 0.109375f, 0.015625f, 0.875000f, 0.878906f, 0.058594f, 0.003906f, 0.937500f, 1.000000f, 0.000000f, 0.000000f, 1.000000f }; + +const float g_astc_weights5x[32 * 4] = { 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000977f, 0.030273f, 0.938477f, 0.031250f, 0.003906f, 0.058594f, 0.878906f, 0.062500f, 0.008789f, 0.084961f, 0.821289f, + 0.093750f, 0.015625f, 0.109375f, 0.765625f, 0.125000f, 0.024414f, 0.131836f, 0.711914f, 0.156250f, 0.035156f, 0.152344f, 0.660156f, 0.187500f, 0.047852f, 0.170898f, 0.610352f, 0.218750f, 0.062500f, 0.187500f, + 0.562500f, 0.250000f, 0.079102f, 0.202148f, 0.516602f, 0.281250f, 0.097656f, 0.214844f, 0.472656f, 0.312500f, 0.118164f, 0.225586f, 0.430664f, 0.343750f, 0.140625f, 0.234375f, 0.390625f, 0.375000f, 0.165039f, + 0.241211f, 0.352539f, 0.406250f, 0.191406f, 0.246094f, 0.316406f, 0.437500f, 0.219727f, 0.249023f, 0.282227f, 0.468750f, 0.282227f, 0.249023f, 0.219727f, 0.531250f, 0.316406f, 0.246094f, 0.191406f, 0.562500f, + 0.352539f, 0.241211f, 0.165039f, 0.593750f, 0.390625f, 0.234375f, 0.140625f, 0.625000f, 0.430664f, 0.225586f, 0.118164f, 0.656250f, 0.472656f, 0.214844f, 0.097656f, 0.687500f, 0.516602f, 0.202148f, 0.079102f, + 0.718750f, 0.562500f, 0.187500f, 0.062500f, 0.750000f, 0.610352f, 0.170898f, 0.047852f, 0.781250f, 0.660156f, 0.152344f, 0.035156f, 0.812500f, 0.711914f, 0.131836f, 0.024414f, 0.843750f, 0.765625f, 0.109375f, + 0.015625f, 0.875000f, 0.821289f, 0.084961f, 0.008789f, 0.906250f, 0.878906f, 0.058594f, 0.003906f, 0.937500f, 0.938477f, 0.030273f, 0.000977f, 0.968750f, 1.000000f, 0.000000f, 0.000000f, 1.000000f }; + +const float g_astc_weights_3levelsx[3 * 4] = { + 0.000000f, 0.000000f, 1.000000f, 0.000000f, + .5f * .5f, (1.0f - .5f) * .5f, (1.0f - .5f) * (1.0f - .5f), .5f, + 1.000000f, 0.000000f, 0.000000f, 1.000000f }; + +static endpoint_err g_bc7_mode_1_optimal_endpoints[256][2]; // [c][pbit] +static const uint32_t BC7ENC_MODE_1_OPTIMAL_INDEX = 2; + +static endpoint_err g_astc_4bit_3bit_optimal_endpoints[256]; // [c] +static const uint32_t BC7ENC_ASTC_4BIT_3BIT_OPTIMAL_INDEX = 2; + +static endpoint_err g_astc_4bit_2bit_optimal_endpoints[256]; // [c] +static const uint32_t BC7ENC_ASTC_4BIT_2BIT_OPTIMAL_INDEX = 1; + +static endpoint_err g_astc_range7_2bit_optimal_endpoints[256]; // [c] +static const uint32_t BC7ENC_ASTC_RANGE7_2BIT_OPTIMAL_INDEX = 1; + +static endpoint_err g_astc_range13_4bit_optimal_endpoints[256]; // [c] +static const uint32_t BC7ENC_ASTC_RANGE13_4BIT_OPTIMAL_INDEX = 2; + +static endpoint_err g_astc_range13_2bit_optimal_endpoints[256]; // [c] +static const uint32_t BC7ENC_ASTC_RANGE13_2BIT_OPTIMAL_INDEX = 1; + +static endpoint_err g_astc_range11_5bit_optimal_endpoints[256]; // [c] +static const uint32_t BC7ENC_ASTC_RANGE11_5BIT_OPTIMAL_INDEX = 13; // not 1, which is optimal, because 26 losslessly maps to BC7 4-bit weights + +astc_quant_bin g_astc_sorted_order_unquant[BC7ENC_TOTAL_ASTC_RANGES][256]; // [sorted unquantized order] + +static uint8_t g_astc_nearest_sorted_index[BC7ENC_TOTAL_ASTC_RANGES][256]; + +static void astc_init() +{ + for (uint32_t range = 0; range < BC7ENC_TOTAL_ASTC_RANGES; range++) + { + if (!astc_is_valid_endpoint_range(range)) + continue; + + const uint32_t levels = astc_get_levels(range); + + uint32_t vals[256]; + // TODO + for (uint32_t i = 0; i < levels; i++) + vals[i] = (unquant_astc_endpoint_val(i, range) << 8) | i; + + std::sort(vals, vals + levels); + + for (uint32_t i = 0; i < levels; i++) + { + uint32_t order = vals[i] & 0xFF; + uint32_t unq = vals[i] >> 8; + + g_astc_sorted_order_unquant[range][i].m_unquant = (uint8_t)unq; + g_astc_sorted_order_unquant[range][i].m_index = (uint8_t)order; + + } // i + +#if 0 + if (g_astc_bise_range_table[range][1] || g_astc_bise_range_table[range][2]) + { + printf("// Range: %u, Levels: %u, Bits: %u, Trits: %u, Quints: %u\n", range, levels, g_astc_bise_range_table[range][0], g_astc_bise_range_table[range][1], g_astc_bise_range_table[range][2]); + + printf("{"); + for (uint32_t i = 0; i < levels; i++) + { + printf("{%u,%u}", g_astc_sorted_order_unquant[range][i].m_index, g_astc_sorted_order_unquant[range][i].m_unquant); + if (i != (levels - 1)) + printf(","); + } + printf("}\n"); + } +#endif + +#if 0 + if (g_astc_bise_range_table[range][1] || g_astc_bise_range_table[range][2]) + { + printf("// Range: %u, Levels: %u, Bits: %u, Trits: %u, Quints: %u\n", range, levels, g_astc_bise_range_table[range][0], g_astc_bise_range_table[range][1], g_astc_bise_range_table[range][2]); + + printf("{"); + for (uint32_t i = 0; i < levels; i++) + { + printf("{%u,%u}", g_astc_unquant[range][i].m_index, g_astc_unquant[range][i].m_unquant); + if (i != (levels - 1)) + printf(","); + } + printf("}\n"); + } +#endif + + for (uint32_t i = 0; i < 256; i++) + { + uint32_t best_index = 0; + int best_err = INT32_MAX; + + for (uint32_t j = 0; j < levels; j++) + { + int err = g_astc_sorted_order_unquant[range][j].m_unquant - i; + if (err < 0) + err = -err; + if (err < best_err) + { + best_err = err; + best_index = j; + } + } + + g_astc_nearest_sorted_index[range][i] = (uint8_t)best_index; + } // i + } // range +} + +static inline uint32_t astc_interpolate_linear(uint32_t l, uint32_t h, uint32_t w) +{ + l = (l << 8) | l; + h = (h << 8) | h; + uint32_t k = (l * (64 - w) + h * w + 32) >> 6; + return k >> 8; +} + +// Initialize the lookup table used for optimal single color compression in mode 1. Must be called before encoding. +void bc7enc_compress_block_init() +{ + astc_init(); + + // BC7 666.1 + for (int c = 0; c < 256; c++) + { + for (uint32_t lp = 0; lp < 2; lp++) + { + endpoint_err best; + best.m_error = (uint16_t)UINT16_MAX; + for (uint32_t l = 0; l < 64; l++) + { + uint32_t low = ((l << 1) | lp) << 1; + low |= (low >> 7); + for (uint32_t h = 0; h < 64; h++) + { + uint32_t high = ((h << 1) | lp) << 1; + high |= (high >> 7); + const int k = (low * (64 - g_bc7_weights3[BC7ENC_MODE_1_OPTIMAL_INDEX]) + high * g_bc7_weights3[BC7ENC_MODE_1_OPTIMAL_INDEX] + 32) >> 6; + const int err = (k - c) * (k - c); + if (err < best.m_error) + { + best.m_error = (uint16_t)err; + best.m_lo = (uint8_t)l; + best.m_hi = (uint8_t)h; + } + } // h + } // l + g_bc7_mode_1_optimal_endpoints[c][lp] = best; + } // lp + } // c + + // ASTC [0,15] 3-bit + for (int c = 0; c < 256; c++) + { + endpoint_err best; + best.m_error = (uint16_t)UINT16_MAX; + for (uint32_t l = 0; l < 16; l++) + { + uint32_t low = (l << 4) | l; + + for (uint32_t h = 0; h < 16; h++) + { + uint32_t high = (h << 4) | h; + + const int k = astc_interpolate_linear(low, high, g_bc7_weights3[BC7ENC_ASTC_4BIT_3BIT_OPTIMAL_INDEX]); + const int err = (k - c) * (k - c); + + if (err < best.m_error) + { + best.m_error = (uint16_t)err; + best.m_lo = (uint8_t)l; + best.m_hi = (uint8_t)h; + } + } // h + } // l + + g_astc_4bit_3bit_optimal_endpoints[c] = best; + + } // c + + // ASTC [0,15] 2-bit + for (int c = 0; c < 256; c++) + { + endpoint_err best; + best.m_error = (uint16_t)UINT16_MAX; + for (uint32_t l = 0; l < 16; l++) + { + uint32_t low = (l << 4) | l; + + for (uint32_t h = 0; h < 16; h++) + { + uint32_t high = (h << 4) | h; + + const int k = astc_interpolate_linear(low, high, g_bc7_weights2[BC7ENC_ASTC_4BIT_2BIT_OPTIMAL_INDEX]); + const int err = (k - c) * (k - c); + + if (err < best.m_error) + { + best.m_error = (uint16_t)err; + best.m_lo = (uint8_t)l; + best.m_hi = (uint8_t)h; + } + } // h + } // l + + g_astc_4bit_2bit_optimal_endpoints[c] = best; + + } // c + + // ASTC range 7 [0,11] 2-bit + for (int c = 0; c < 256; c++) + { + endpoint_err best; + best.m_error = (uint16_t)UINT16_MAX; + for (uint32_t l = 0; l < 12; l++) + { + uint32_t low = g_astc_sorted_order_unquant[7][l].m_unquant; + + for (uint32_t h = 0; h < 12; h++) + { + uint32_t high = g_astc_sorted_order_unquant[7][h].m_unquant; + + const int k = astc_interpolate_linear(low, high, g_bc7_weights2[BC7ENC_ASTC_RANGE7_2BIT_OPTIMAL_INDEX]); + const int err = (k - c) * (k - c); + + if (err < best.m_error) + { + best.m_error = (uint16_t)err; + best.m_lo = (uint8_t)l; + best.m_hi = (uint8_t)h; + } + } // h + } // l + + g_astc_range7_2bit_optimal_endpoints[c] = best; + + } // c + + // ASTC range 13 [0,47] 4-bit + for (int c = 0; c < 256; c++) + { + endpoint_err best; + best.m_error = (uint16_t)UINT16_MAX; + for (uint32_t l = 0; l < 48; l++) + { + uint32_t low = g_astc_sorted_order_unquant[13][l].m_unquant; + + for (uint32_t h = 0; h < 48; h++) + { + uint32_t high = g_astc_sorted_order_unquant[13][h].m_unquant; + + const int k = astc_interpolate_linear(low, high, g_astc_weights4[BC7ENC_ASTC_RANGE13_4BIT_OPTIMAL_INDEX]); + const int err = (k - c) * (k - c); + + if (err < best.m_error) + { + best.m_error = (uint16_t)err; + best.m_lo = (uint8_t)l; + best.m_hi = (uint8_t)h; + } + } // h + } // l + + g_astc_range13_4bit_optimal_endpoints[c] = best; + + } // c + + // ASTC range 13 [0,47] 2-bit + for (int c = 0; c < 256; c++) + { + endpoint_err best; + best.m_error = (uint16_t)UINT16_MAX; + for (uint32_t l = 0; l < 48; l++) + { + uint32_t low = g_astc_sorted_order_unquant[13][l].m_unquant; + + for (uint32_t h = 0; h < 48; h++) + { + uint32_t high = g_astc_sorted_order_unquant[13][h].m_unquant; + + const int k = astc_interpolate_linear(low, high, g_bc7_weights2[BC7ENC_ASTC_RANGE13_2BIT_OPTIMAL_INDEX]); + const int err = (k - c) * (k - c); + + if (err < best.m_error) + { + best.m_error = (uint16_t)err; + best.m_lo = (uint8_t)l; + best.m_hi = (uint8_t)h; + } + } // h + } // l + + g_astc_range13_2bit_optimal_endpoints[c] = best; + + } // c + + // ASTC range 11 [0,31] 5-bit + for (int c = 0; c < 256; c++) + { + endpoint_err best; + best.m_error = (uint16_t)UINT16_MAX; + for (uint32_t l = 0; l < 32; l++) + { + uint32_t low = g_astc_sorted_order_unquant[11][l].m_unquant; + + for (uint32_t h = 0; h < 32; h++) + { + uint32_t high = g_astc_sorted_order_unquant[11][h].m_unquant; + + const int k = astc_interpolate_linear(low, high, g_astc_weights5[BC7ENC_ASTC_RANGE11_5BIT_OPTIMAL_INDEX]); + const int err = (k - c) * (k - c); + + if (err < best.m_error) + { + best.m_error = (uint16_t)err; + best.m_lo = (uint8_t)l; + best.m_hi = (uint8_t)h; + } + } // h + } // l + + g_astc_range11_5bit_optimal_endpoints[c] = best; + + } // c +} + +static void compute_least_squares_endpoints_rgba(uint32_t N, const uint8_t *pSelectors, const bc7enc_vec4F* pSelector_weights, bc7enc_vec4F* pXl, bc7enc_vec4F* pXh, const color_quad_u8 *pColors) +{ + // Least squares using normal equations: http://www.cs.cornell.edu/~bindel/class/cs3220-s12/notes/lec10.pdf + // I did this in matrix form first, expanded out all the ops, then optimized it a bit. + double z00 = 0.0f, z01 = 0.0f, z10 = 0.0f, z11 = 0.0f; + double q00_r = 0.0f, q10_r = 0.0f, t_r = 0.0f; + double q00_g = 0.0f, q10_g = 0.0f, t_g = 0.0f; + double q00_b = 0.0f, q10_b = 0.0f, t_b = 0.0f; + double q00_a = 0.0f, q10_a = 0.0f, t_a = 0.0f; + + for (uint32_t i = 0; i < N; i++) + { + const uint32_t sel = pSelectors[i]; + z00 += pSelector_weights[sel].m_c[0]; + z10 += pSelector_weights[sel].m_c[1]; + z11 += pSelector_weights[sel].m_c[2]; + float w = pSelector_weights[sel].m_c[3]; + q00_r += w * pColors[i].m_c[0]; t_r += pColors[i].m_c[0]; + q00_g += w * pColors[i].m_c[1]; t_g += pColors[i].m_c[1]; + q00_b += w * pColors[i].m_c[2]; t_b += pColors[i].m_c[2]; + q00_a += w * pColors[i].m_c[3]; t_a += pColors[i].m_c[3]; + } + + q10_r = t_r - q00_r; + q10_g = t_g - q00_g; + q10_b = t_b - q00_b; + q10_a = t_a - q00_a; + + z01 = z10; + + double det = z00 * z11 - z01 * z10; + if (det != 0.0f) + det = 1.0f / det; + + double iz00, iz01, iz10, iz11; + iz00 = z11 * det; + iz01 = -z01 * det; + iz10 = -z10 * det; + iz11 = z00 * det; + + pXl->m_c[0] = (float)(iz00 * q00_r + iz01 * q10_r); pXh->m_c[0] = (float)(iz10 * q00_r + iz11 * q10_r); + pXl->m_c[1] = (float)(iz00 * q00_g + iz01 * q10_g); pXh->m_c[1] = (float)(iz10 * q00_g + iz11 * q10_g); + pXl->m_c[2] = (float)(iz00 * q00_b + iz01 * q10_b); pXh->m_c[2] = (float)(iz10 * q00_b + iz11 * q10_b); + pXl->m_c[3] = (float)(iz00 * q00_a + iz01 * q10_a); pXh->m_c[3] = (float)(iz10 * q00_a + iz11 * q10_a); + + for (uint32_t c = 0; c < 4; c++) + { + if ((pXl->m_c[c] < 0.0f) || (pXh->m_c[c] > 255.0f)) + { + uint32_t lo_v = UINT32_MAX, hi_v = 0; + for (uint32_t i = 0; i < N; i++) + { + lo_v = minimumu(lo_v, pColors[i].m_c[c]); + hi_v = maximumu(hi_v, pColors[i].m_c[c]); + } + + if (lo_v == hi_v) + { + pXl->m_c[c] = (float)lo_v; + pXh->m_c[c] = (float)hi_v; + } + } + } +} + +static void compute_least_squares_endpoints_rgb(uint32_t N, const uint8_t *pSelectors, const bc7enc_vec4F*pSelector_weights, bc7enc_vec4F*pXl, bc7enc_vec4F*pXh, const color_quad_u8 *pColors) +{ + double z00 = 0.0f, z01 = 0.0f, z10 = 0.0f, z11 = 0.0f; + double q00_r = 0.0f, q10_r = 0.0f, t_r = 0.0f; + double q00_g = 0.0f, q10_g = 0.0f, t_g = 0.0f; + double q00_b = 0.0f, q10_b = 0.0f, t_b = 0.0f; + + for (uint32_t i = 0; i < N; i++) + { + const uint32_t sel = pSelectors[i]; + z00 += pSelector_weights[sel].m_c[0]; + z10 += pSelector_weights[sel].m_c[1]; + z11 += pSelector_weights[sel].m_c[2]; + float w = pSelector_weights[sel].m_c[3]; + q00_r += w * pColors[i].m_c[0]; t_r += pColors[i].m_c[0]; + q00_g += w * pColors[i].m_c[1]; t_g += pColors[i].m_c[1]; + q00_b += w * pColors[i].m_c[2]; t_b += pColors[i].m_c[2]; + } + + q10_r = t_r - q00_r; + q10_g = t_g - q00_g; + q10_b = t_b - q00_b; + + z01 = z10; + + double det = z00 * z11 - z01 * z10; + if (det != 0.0f) + det = 1.0f / det; + + double iz00, iz01, iz10, iz11; + iz00 = z11 * det; + iz01 = -z01 * det; + iz10 = -z10 * det; + iz11 = z00 * det; + + pXl->m_c[0] = (float)(iz00 * q00_r + iz01 * q10_r); pXh->m_c[0] = (float)(iz10 * q00_r + iz11 * q10_r); + pXl->m_c[1] = (float)(iz00 * q00_g + iz01 * q10_g); pXh->m_c[1] = (float)(iz10 * q00_g + iz11 * q10_g); + pXl->m_c[2] = (float)(iz00 * q00_b + iz01 * q10_b); pXh->m_c[2] = (float)(iz10 * q00_b + iz11 * q10_b); + pXl->m_c[3] = 255.0f; pXh->m_c[3] = 255.0f; + + for (uint32_t c = 0; c < 3; c++) + { + if ((pXl->m_c[c] < 0.0f) || (pXh->m_c[c] > 255.0f)) + { + uint32_t lo_v = UINT32_MAX, hi_v = 0; + for (uint32_t i = 0; i < N; i++) + { + lo_v = minimumu(lo_v, pColors[i].m_c[c]); + hi_v = maximumu(hi_v, pColors[i].m_c[c]); + } + + if (lo_v == hi_v) + { + pXl->m_c[c] = (float)lo_v; + pXh->m_c[c] = (float)hi_v; + } + } + } +} + +static inline color_quad_u8 scale_color(const color_quad_u8* pC, const color_cell_compressor_params* pParams) +{ + color_quad_u8 results; + + if (pParams->m_astc_endpoint_range) + { + for (uint32_t i = 0; i < 4; i++) + { + results.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pC->m_c[i]].m_unquant; + } + } + else + { + const uint32_t n = pParams->m_comp_bits + (pParams->m_has_pbits ? 1 : 0); + assert((n >= 4) && (n <= 8)); + + for (uint32_t i = 0; i < 4; i++) + { + uint32_t v = pC->m_c[i] << (8 - n); + v |= (v >> n); + assert(v <= 255); + results.m_c[i] = (uint8_t)(v); + } + } + + return results; +} + +static inline uint64_t compute_color_distance_rgb(const color_quad_u8 *pE1, const color_quad_u8 *pE2, bc7enc_bool perceptual, const uint32_t weights[4]) +{ + int dr, dg, db; + + if (perceptual) + { + const int l1 = pE1->m_c[0] * 109 + pE1->m_c[1] * 366 + pE1->m_c[2] * 37; + const int cr1 = ((int)pE1->m_c[0] << 9) - l1; + const int cb1 = ((int)pE1->m_c[2] << 9) - l1; + const int l2 = pE2->m_c[0] * 109 + pE2->m_c[1] * 366 + pE2->m_c[2] * 37; + const int cr2 = ((int)pE2->m_c[0] << 9) - l2; + const int cb2 = ((int)pE2->m_c[2] << 9) - l2; + dr = (l1 - l2) >> 8; + dg = (cr1 - cr2) >> 8; + db = (cb1 - cb2) >> 8; + } + else + { + dr = (int)pE1->m_c[0] - (int)pE2->m_c[0]; + dg = (int)pE1->m_c[1] - (int)pE2->m_c[1]; + db = (int)pE1->m_c[2] - (int)pE2->m_c[2]; + } + + return weights[0] * (uint32_t)(dr * dr) + weights[1] * (uint32_t)(dg * dg) + weights[2] * (uint32_t)(db * db); +} + +static inline uint64_t compute_color_distance_rgba(const color_quad_u8 *pE1, const color_quad_u8 *pE2, bc7enc_bool perceptual, const uint32_t weights[4]) +{ + int da = (int)pE1->m_c[3] - (int)pE2->m_c[3]; + return compute_color_distance_rgb(pE1, pE2, perceptual, weights) + (weights[3] * (uint32_t)(da * da)); +} + +static uint64_t pack_mode1_to_one_color(const color_cell_compressor_params *pParams, color_cell_compressor_results *pResults, uint32_t r, uint32_t g, uint32_t b, uint8_t *pSelectors) +{ + uint32_t best_err = UINT_MAX; + uint32_t best_p = 0; + + for (uint32_t p = 0; p < 2; p++) + { + uint32_t err = g_bc7_mode_1_optimal_endpoints[r][p].m_error + g_bc7_mode_1_optimal_endpoints[g][p].m_error + g_bc7_mode_1_optimal_endpoints[b][p].m_error; + if (err < best_err) + { + best_err = err; + best_p = p; + } + } + + const endpoint_err *pEr = &g_bc7_mode_1_optimal_endpoints[r][best_p]; + const endpoint_err *pEg = &g_bc7_mode_1_optimal_endpoints[g][best_p]; + const endpoint_err *pEb = &g_bc7_mode_1_optimal_endpoints[b][best_p]; + + color_quad_u8_set(&pResults->m_low_endpoint, pEr->m_lo, pEg->m_lo, pEb->m_lo, 0); + color_quad_u8_set(&pResults->m_high_endpoint, pEr->m_hi, pEg->m_hi, pEb->m_hi, 0); + pResults->m_pbits[0] = best_p; + pResults->m_pbits[1] = 0; + + memset(pSelectors, BC7ENC_MODE_1_OPTIMAL_INDEX, pParams->m_num_pixels); + + color_quad_u8 p; + for (uint32_t i = 0; i < 3; i++) + { + uint32_t low = ((pResults->m_low_endpoint.m_c[i] << 1) | pResults->m_pbits[0]) << 1; + low |= (low >> 7); + + uint32_t high = ((pResults->m_high_endpoint.m_c[i] << 1) | pResults->m_pbits[0]) << 1; + high |= (high >> 7); + + p.m_c[i] = (uint8_t)((low * (64 - g_bc7_weights3[BC7ENC_MODE_1_OPTIMAL_INDEX]) + high * g_bc7_weights3[BC7ENC_MODE_1_OPTIMAL_INDEX] + 32) >> 6); + } + p.m_c[3] = 255; + + uint64_t total_err = 0; + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + total_err += compute_color_distance_rgb(&p, &pParams->m_pPixels[i], pParams->m_perceptual, pParams->m_weights); + + pResults->m_best_overall_err = total_err; + + return total_err; +} + +static uint64_t pack_astc_4bit_3bit_to_one_color(const color_cell_compressor_params *pParams, color_cell_compressor_results *pResults, uint32_t r, uint32_t g, uint32_t b, uint8_t *pSelectors) +{ + const endpoint_err *pEr = &g_astc_4bit_3bit_optimal_endpoints[r]; + const endpoint_err *pEg = &g_astc_4bit_3bit_optimal_endpoints[g]; + const endpoint_err *pEb = &g_astc_4bit_3bit_optimal_endpoints[b]; + + color_quad_u8_set(&pResults->m_low_endpoint, pEr->m_lo, pEg->m_lo, pEb->m_lo, 0); + color_quad_u8_set(&pResults->m_high_endpoint, pEr->m_hi, pEg->m_hi, pEb->m_hi, 0); + pResults->m_pbits[0] = 0; + pResults->m_pbits[1] = 0; + + for (uint32_t i = 0; i < 4; i++) + { + pResults->m_astc_low_endpoint.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_low_endpoint.m_c[i]].m_index; + pResults->m_astc_high_endpoint.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_high_endpoint.m_c[i]].m_index; + } + + memset(pSelectors, BC7ENC_ASTC_4BIT_3BIT_OPTIMAL_INDEX, pParams->m_num_pixels); + + color_quad_u8 p; + for (uint32_t i = 0; i < 3; i++) + { + uint32_t low = (pResults->m_low_endpoint.m_c[i] << 4) | pResults->m_low_endpoint.m_c[i]; + uint32_t high = (pResults->m_high_endpoint.m_c[i] << 4) | pResults->m_high_endpoint.m_c[i]; + + p.m_c[i] = (uint8_t)astc_interpolate_linear(low, high, g_bc7_weights3[BC7ENC_ASTC_4BIT_3BIT_OPTIMAL_INDEX]); + } + p.m_c[3] = 255; + + uint64_t total_err = 0; + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + total_err += compute_color_distance_rgb(&p, &pParams->m_pPixels[i], pParams->m_perceptual, pParams->m_weights); + + pResults->m_best_overall_err = total_err; + + return total_err; +} + +static uint64_t pack_astc_4bit_2bit_to_one_color_rgba(const color_cell_compressor_params *pParams, color_cell_compressor_results *pResults, uint32_t r, uint32_t g, uint32_t b, uint32_t a, uint8_t *pSelectors) +{ + const endpoint_err *pEr = &g_astc_4bit_2bit_optimal_endpoints[r]; + const endpoint_err *pEg = &g_astc_4bit_2bit_optimal_endpoints[g]; + const endpoint_err *pEb = &g_astc_4bit_2bit_optimal_endpoints[b]; + const endpoint_err *pEa = &g_astc_4bit_2bit_optimal_endpoints[a]; + + color_quad_u8_set(&pResults->m_low_endpoint, pEr->m_lo, pEg->m_lo, pEb->m_lo, pEa->m_lo); + color_quad_u8_set(&pResults->m_high_endpoint, pEr->m_hi, pEg->m_hi, pEb->m_hi, pEa->m_hi); + pResults->m_pbits[0] = 0; + pResults->m_pbits[1] = 0; + + for (uint32_t i = 0; i < 4; i++) + { + pResults->m_astc_low_endpoint.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_low_endpoint.m_c[i]].m_index; + pResults->m_astc_high_endpoint.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_high_endpoint.m_c[i]].m_index; + } + + memset(pSelectors, BC7ENC_ASTC_4BIT_2BIT_OPTIMAL_INDEX, pParams->m_num_pixels); + + color_quad_u8 p; + for (uint32_t i = 0; i < 4; i++) + { + uint32_t low = (pResults->m_low_endpoint.m_c[i] << 4) | pResults->m_low_endpoint.m_c[i]; + uint32_t high = (pResults->m_high_endpoint.m_c[i] << 4) | pResults->m_high_endpoint.m_c[i]; + + p.m_c[i] = (uint8_t)astc_interpolate_linear(low, high, g_bc7_weights2[BC7ENC_ASTC_4BIT_2BIT_OPTIMAL_INDEX]); + } + + uint64_t total_err = 0; + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + total_err += compute_color_distance_rgba(&p, &pParams->m_pPixels[i], pParams->m_perceptual, pParams->m_weights); + + pResults->m_best_overall_err = total_err; + + return total_err; +} + +static uint64_t pack_astc_range7_2bit_to_one_color(const color_cell_compressor_params *pParams, color_cell_compressor_results *pResults, uint32_t r, uint32_t g, uint32_t b, uint8_t *pSelectors) +{ + assert(pParams->m_astc_endpoint_range == 7 && pParams->m_num_selector_weights == 4); + + const endpoint_err *pEr = &g_astc_range7_2bit_optimal_endpoints[r]; + const endpoint_err *pEg = &g_astc_range7_2bit_optimal_endpoints[g]; + const endpoint_err *pEb = &g_astc_range7_2bit_optimal_endpoints[b]; + + color_quad_u8_set(&pResults->m_low_endpoint, pEr->m_lo, pEg->m_lo, pEb->m_lo, 0); + color_quad_u8_set(&pResults->m_high_endpoint, pEr->m_hi, pEg->m_hi, pEb->m_hi, 0); + pResults->m_pbits[0] = 0; + pResults->m_pbits[1] = 0; + + for (uint32_t i = 0; i < 4; i++) + { + pResults->m_astc_low_endpoint.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_low_endpoint.m_c[i]].m_index; + pResults->m_astc_high_endpoint.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_high_endpoint.m_c[i]].m_index; + } + + memset(pSelectors, BC7ENC_ASTC_RANGE7_2BIT_OPTIMAL_INDEX, pParams->m_num_pixels); + + color_quad_u8 p; + for (uint32_t i = 0; i < 3; i++) + { + uint32_t low = g_astc_sorted_order_unquant[7][pResults->m_low_endpoint.m_c[i]].m_unquant; + uint32_t high = g_astc_sorted_order_unquant[7][pResults->m_high_endpoint.m_c[i]].m_unquant; + + p.m_c[i] = (uint8_t)astc_interpolate_linear(low, high, g_bc7_weights2[BC7ENC_ASTC_RANGE7_2BIT_OPTIMAL_INDEX]); + } + p.m_c[3] = 255; + + uint64_t total_err = 0; + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + total_err += compute_color_distance_rgb(&p, &pParams->m_pPixels[i], pParams->m_perceptual, pParams->m_weights); + + pResults->m_best_overall_err = total_err; + + return total_err; +} + +static uint64_t pack_astc_range13_2bit_to_one_color(const color_cell_compressor_params *pParams, color_cell_compressor_results *pResults, uint32_t r, uint32_t g, uint32_t b, uint8_t *pSelectors) +{ + assert(pParams->m_astc_endpoint_range == 13 && pParams->m_num_selector_weights == 4 && !pParams->m_has_alpha); + + const endpoint_err *pEr = &g_astc_range13_2bit_optimal_endpoints[r]; + const endpoint_err *pEg = &g_astc_range13_2bit_optimal_endpoints[g]; + const endpoint_err *pEb = &g_astc_range13_2bit_optimal_endpoints[b]; + + color_quad_u8_set(&pResults->m_low_endpoint, pEr->m_lo, pEg->m_lo, pEb->m_lo, 47); + color_quad_u8_set(&pResults->m_high_endpoint, pEr->m_hi, pEg->m_hi, pEb->m_hi, 47); + pResults->m_pbits[0] = 0; + pResults->m_pbits[1] = 0; + + for (uint32_t i = 0; i < 4; i++) + { + pResults->m_astc_low_endpoint.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_low_endpoint.m_c[i]].m_index; + pResults->m_astc_high_endpoint.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_high_endpoint.m_c[i]].m_index; + } + + memset(pSelectors, BC7ENC_ASTC_RANGE13_2BIT_OPTIMAL_INDEX, pParams->m_num_pixels); + + color_quad_u8 p; + for (uint32_t i = 0; i < 4; i++) + { + uint32_t low = g_astc_sorted_order_unquant[13][pResults->m_low_endpoint.m_c[i]].m_unquant; + uint32_t high = g_astc_sorted_order_unquant[13][pResults->m_high_endpoint.m_c[i]].m_unquant; + + p.m_c[i] = (uint8_t)astc_interpolate_linear(low, high, g_bc7_weights2[BC7ENC_ASTC_RANGE13_2BIT_OPTIMAL_INDEX]); + } + + uint64_t total_err = 0; + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + total_err += compute_color_distance_rgb(&p, &pParams->m_pPixels[i], pParams->m_perceptual, pParams->m_weights); + + pResults->m_best_overall_err = total_err; + + return total_err; +} + +static uint64_t pack_astc_range11_5bit_to_one_color(const color_cell_compressor_params* pParams, color_cell_compressor_results* pResults, uint32_t r, uint32_t g, uint32_t b, uint8_t* pSelectors) +{ + assert(pParams->m_astc_endpoint_range == 11 && pParams->m_num_selector_weights == 32 && !pParams->m_has_alpha); + + const endpoint_err* pEr = &g_astc_range11_5bit_optimal_endpoints[r]; + const endpoint_err* pEg = &g_astc_range11_5bit_optimal_endpoints[g]; + const endpoint_err* pEb = &g_astc_range11_5bit_optimal_endpoints[b]; + + color_quad_u8_set(&pResults->m_low_endpoint, pEr->m_lo, pEg->m_lo, pEb->m_lo, 31); + color_quad_u8_set(&pResults->m_high_endpoint, pEr->m_hi, pEg->m_hi, pEb->m_hi, 31); + pResults->m_pbits[0] = 0; + pResults->m_pbits[1] = 0; + + for (uint32_t i = 0; i < 4; i++) + { + pResults->m_astc_low_endpoint.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_low_endpoint.m_c[i]].m_index; + pResults->m_astc_high_endpoint.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_high_endpoint.m_c[i]].m_index; + } + + memset(pSelectors, BC7ENC_ASTC_RANGE11_5BIT_OPTIMAL_INDEX, pParams->m_num_pixels); + + color_quad_u8 p; + for (uint32_t i = 0; i < 4; i++) + { + uint32_t low = g_astc_sorted_order_unquant[11][pResults->m_low_endpoint.m_c[i]].m_unquant; + uint32_t high = g_astc_sorted_order_unquant[11][pResults->m_high_endpoint.m_c[i]].m_unquant; + + p.m_c[i] = (uint8_t)astc_interpolate_linear(low, high, g_astc_weights5[BC7ENC_ASTC_RANGE11_5BIT_OPTIMAL_INDEX]); + } + + uint64_t total_err = 0; + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + total_err += compute_color_distance_rgb(&p, &pParams->m_pPixels[i], pParams->m_perceptual, pParams->m_weights); + + pResults->m_best_overall_err = total_err; + + return total_err; +} + +static uint64_t evaluate_solution(const color_quad_u8 *pLow, const color_quad_u8 *pHigh, const uint32_t pbits[2], const color_cell_compressor_params *pParams, color_cell_compressor_results *pResults) +{ + color_quad_u8 quantMinColor = *pLow; + color_quad_u8 quantMaxColor = *pHigh; + + if (pParams->m_has_pbits) + { + uint32_t minPBit, maxPBit; + + if (pParams->m_endpoints_share_pbit) + maxPBit = minPBit = pbits[0]; + else + { + minPBit = pbits[0]; + maxPBit = pbits[1]; + } + + quantMinColor.m_c[0] = (uint8_t)((pLow->m_c[0] << 1) | minPBit); + quantMinColor.m_c[1] = (uint8_t)((pLow->m_c[1] << 1) | minPBit); + quantMinColor.m_c[2] = (uint8_t)((pLow->m_c[2] << 1) | minPBit); + quantMinColor.m_c[3] = (uint8_t)((pLow->m_c[3] << 1) | minPBit); + + quantMaxColor.m_c[0] = (uint8_t)((pHigh->m_c[0] << 1) | maxPBit); + quantMaxColor.m_c[1] = (uint8_t)((pHigh->m_c[1] << 1) | maxPBit); + quantMaxColor.m_c[2] = (uint8_t)((pHigh->m_c[2] << 1) | maxPBit); + quantMaxColor.m_c[3] = (uint8_t)((pHigh->m_c[3] << 1) | maxPBit); + } + + color_quad_u8 actualMinColor = scale_color(&quantMinColor, pParams); + color_quad_u8 actualMaxColor = scale_color(&quantMaxColor, pParams); + + const uint32_t N = pParams->m_num_selector_weights; + assert(N >= 1 && N <= 32); + + color_quad_u8 weightedColors[32]; + weightedColors[0] = actualMinColor; + weightedColors[N - 1] = actualMaxColor; + + const uint32_t nc = pParams->m_has_alpha ? 4 : 3; + if (pParams->m_astc_endpoint_range) + { + for (uint32_t i = 1; i < (N - 1); i++) + { + for (uint32_t j = 0; j < nc; j++) + weightedColors[i].m_c[j] = (uint8_t)(astc_interpolate_linear(actualMinColor.m_c[j], actualMaxColor.m_c[j], pParams->m_pSelector_weights[i])); + } + } + else + { + for (uint32_t i = 1; i < (N - 1); i++) + for (uint32_t j = 0; j < nc; j++) + weightedColors[i].m_c[j] = (uint8_t)((actualMinColor.m_c[j] * (64 - pParams->m_pSelector_weights[i]) + actualMaxColor.m_c[j] * pParams->m_pSelector_weights[i] + 32) >> 6); + } + + const int lr = actualMinColor.m_c[0]; + const int lg = actualMinColor.m_c[1]; + const int lb = actualMinColor.m_c[2]; + const int dr = actualMaxColor.m_c[0] - lr; + const int dg = actualMaxColor.m_c[1] - lg; + const int db = actualMaxColor.m_c[2] - lb; + + uint64_t total_err = 0; + + if (pParams->m_pForce_selectors) + { + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + { + const color_quad_u8* pC = &pParams->m_pPixels[i]; + + const uint8_t sel = pParams->m_pForce_selectors[i]; + assert(sel < N); + + total_err += (pParams->m_has_alpha ? compute_color_distance_rgba : compute_color_distance_rgb)(&weightedColors[sel], pC, pParams->m_perceptual, pParams->m_weights); + + pResults->m_pSelectors_temp[i] = sel; + } + } + else if (!pParams->m_perceptual) + { + if (pParams->m_has_alpha) + { + const int la = actualMinColor.m_c[3]; + const int da = actualMaxColor.m_c[3] - la; + + const float f = N / (float)(squarei(dr) + squarei(dg) + squarei(db) + squarei(da) + .00000125f); + + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + { + const color_quad_u8 *pC = &pParams->m_pPixels[i]; + int r = pC->m_c[0]; + int g = pC->m_c[1]; + int b = pC->m_c[2]; + int a = pC->m_c[3]; + + int best_sel = (int)((float)((r - lr) * dr + (g - lg) * dg + (b - lb) * db + (a - la) * da) * f + .5f); + best_sel = clampi(best_sel, 1, N - 1); + + uint64_t err0 = compute_color_distance_rgba(&weightedColors[best_sel - 1], pC, BC7ENC_FALSE, pParams->m_weights); + uint64_t err1 = compute_color_distance_rgba(&weightedColors[best_sel], pC, BC7ENC_FALSE, pParams->m_weights); + + if (err0 == err1) + { + // Prefer non-interpolation + if ((best_sel - 1) == 0) + best_sel = 0; + } + else if (err1 > err0) + { + err1 = err0; + --best_sel; + } + total_err += err1; + + pResults->m_pSelectors_temp[i] = (uint8_t)best_sel; + } + } + else + { + const float f = N / (float)(squarei(dr) + squarei(dg) + squarei(db) + .00000125f); + + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + { + const color_quad_u8 *pC = &pParams->m_pPixels[i]; + int r = pC->m_c[0]; + int g = pC->m_c[1]; + int b = pC->m_c[2]; + + int sel = (int)((float)((r - lr) * dr + (g - lg) * dg + (b - lb) * db) * f + .5f); + sel = clampi(sel, 1, N - 1); + + uint64_t err0 = compute_color_distance_rgb(&weightedColors[sel - 1], pC, BC7ENC_FALSE, pParams->m_weights); + uint64_t err1 = compute_color_distance_rgb(&weightedColors[sel], pC, BC7ENC_FALSE, pParams->m_weights); + + int best_sel = sel; + uint64_t best_err = err1; + if (err0 == err1) + { + // Prefer non-interpolation + if ((best_sel - 1) == 0) + best_sel = 0; + } + else if (err0 < best_err) + { + best_err = err0; + best_sel = sel - 1; + } + + total_err += best_err; + + pResults->m_pSelectors_temp[i] = (uint8_t)best_sel; + } + } + } + else + { + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + { + uint64_t best_err = UINT64_MAX; + uint32_t best_sel = 0; + + if (pParams->m_has_alpha) + { + for (uint32_t j = 0; j < N; j++) + { + uint64_t err = compute_color_distance_rgba(&weightedColors[j], &pParams->m_pPixels[i], BC7ENC_TRUE, pParams->m_weights); + if (err < best_err) + { + best_err = err; + best_sel = j; + } + // Prefer non-interpolation + else if ((err == best_err) && (j == (N - 1))) + best_sel = j; + } + } + else + { + for (uint32_t j = 0; j < N; j++) + { + uint64_t err = compute_color_distance_rgb(&weightedColors[j], &pParams->m_pPixels[i], BC7ENC_TRUE, pParams->m_weights); + if (err < best_err) + { + best_err = err; + best_sel = j; + } + // Prefer non-interpolation + else if ((err == best_err) && (j == (N - 1))) + best_sel = j; + } + } + + total_err += best_err; + + pResults->m_pSelectors_temp[i] = (uint8_t)best_sel; + } + } + + if (total_err < pResults->m_best_overall_err) + { + pResults->m_best_overall_err = total_err; + + pResults->m_low_endpoint = *pLow; + pResults->m_high_endpoint = *pHigh; + + pResults->m_pbits[0] = pbits[0]; + pResults->m_pbits[1] = pbits[1]; + + memcpy(pResults->m_pSelectors, pResults->m_pSelectors_temp, sizeof(pResults->m_pSelectors[0]) * pParams->m_num_pixels); + } + + return total_err; +} + +static bool areDegenerateEndpoints(color_quad_u8* pTrialMinColor, color_quad_u8* pTrialMaxColor, const bc7enc_vec4F* pXl, const bc7enc_vec4F* pXh) +{ + for (uint32_t i = 0; i < 3; i++) + { + if (pTrialMinColor->m_c[i] == pTrialMaxColor->m_c[i]) + { + if (fabs(pXl->m_c[i] - pXh->m_c[i]) > 0.0f) + return true; + } + } + + return false; +} + +static void fixDegenerateEndpoints(uint32_t mode, color_quad_u8 *pTrialMinColor, color_quad_u8 *pTrialMaxColor, const bc7enc_vec4F*pXl, const bc7enc_vec4F*pXh, uint32_t iscale, int flags) +{ + if (mode == 255) + { + for (uint32_t i = 0; i < 3; i++) + { + if (pTrialMinColor->m_c[i] == pTrialMaxColor->m_c[i]) + { + if (fabs(pXl->m_c[i] - pXh->m_c[i]) > 0.000125f) + { + if (flags & 1) + { + if (pTrialMinColor->m_c[i] > 0) + pTrialMinColor->m_c[i]--; + } + if (flags & 2) + { + if (pTrialMaxColor->m_c[i] < iscale) + pTrialMaxColor->m_c[i]++; + } + } + } + } + } + else if (mode == 1) + { + // fix degenerate case where the input collapses to a single colorspace voxel, and we loose all freedom (test with grayscale ramps) + for (uint32_t i = 0; i < 3; i++) + { + if (pTrialMinColor->m_c[i] == pTrialMaxColor->m_c[i]) + { + if (fabs(pXl->m_c[i] - pXh->m_c[i]) > 0.000125f) + { + if (pTrialMinColor->m_c[i] > (iscale >> 1)) + { + if (pTrialMinColor->m_c[i] > 0) + pTrialMinColor->m_c[i]--; + else + if (pTrialMaxColor->m_c[i] < iscale) + pTrialMaxColor->m_c[i]++; + } + else + { + if (pTrialMaxColor->m_c[i] < iscale) + pTrialMaxColor->m_c[i]++; + else if (pTrialMinColor->m_c[i] > 0) + pTrialMinColor->m_c[i]--; + } + } + } + } + } +} + +static uint64_t find_optimal_solution(uint32_t mode, bc7enc_vec4F xl, bc7enc_vec4F xh, const color_cell_compressor_params *pParams, color_cell_compressor_results *pResults) +{ + vec4F_saturate_in_place(&xl); vec4F_saturate_in_place(&xh); + + if (pParams->m_astc_endpoint_range) + { + const uint32_t levels = astc_get_levels(pParams->m_astc_endpoint_range); + + const float scale = 255.0f; + + color_quad_u8 trialMinColor8Bit, trialMaxColor8Bit; + color_quad_u8_set_clamped(&trialMinColor8Bit, (int)(xl.m_c[0] * scale + .5f), (int)(xl.m_c[1] * scale + .5f), (int)(xl.m_c[2] * scale + .5f), (int)(xl.m_c[3] * scale + .5f)); + color_quad_u8_set_clamped(&trialMaxColor8Bit, (int)(xh.m_c[0] * scale + .5f), (int)(xh.m_c[1] * scale + .5f), (int)(xh.m_c[2] * scale + .5f), (int)(xh.m_c[3] * scale + .5f)); + + color_quad_u8 trialMinColor, trialMaxColor; + for (uint32_t i = 0; i < 4; i++) + { + trialMinColor.m_c[i] = g_astc_nearest_sorted_index[pParams->m_astc_endpoint_range][trialMinColor8Bit.m_c[i]]; + trialMaxColor.m_c[i] = g_astc_nearest_sorted_index[pParams->m_astc_endpoint_range][trialMaxColor8Bit.m_c[i]]; + } + + if (areDegenerateEndpoints(&trialMinColor, &trialMaxColor, &xl, &xh)) + { + color_quad_u8 trialMinColorOrig(trialMinColor), trialMaxColorOrig(trialMaxColor); + + fixDegenerateEndpoints(mode, &trialMinColor, &trialMaxColor, &xl, &xh, levels - 1, 1); + if ((pResults->m_best_overall_err == UINT64_MAX) || color_quad_u8_notequals(&trialMinColor, &pResults->m_low_endpoint) || color_quad_u8_notequals(&trialMaxColor, &pResults->m_high_endpoint)) + evaluate_solution(&trialMinColor, &trialMaxColor, pResults->m_pbits, pParams, pResults); + + trialMinColor = trialMinColorOrig; + trialMaxColor = trialMaxColorOrig; + fixDegenerateEndpoints(mode, &trialMinColor, &trialMaxColor, &xl, &xh, levels - 1, 0); + if ((pResults->m_best_overall_err == UINT64_MAX) || color_quad_u8_notequals(&trialMinColor, &pResults->m_low_endpoint) || color_quad_u8_notequals(&trialMaxColor, &pResults->m_high_endpoint)) + evaluate_solution(&trialMinColor, &trialMaxColor, pResults->m_pbits, pParams, pResults); + + trialMinColor = trialMinColorOrig; + trialMaxColor = trialMaxColorOrig; + fixDegenerateEndpoints(mode, &trialMinColor, &trialMaxColor, &xl, &xh, levels - 1, 2); + if ((pResults->m_best_overall_err == UINT64_MAX) || color_quad_u8_notequals(&trialMinColor, &pResults->m_low_endpoint) || color_quad_u8_notequals(&trialMaxColor, &pResults->m_high_endpoint)) + evaluate_solution(&trialMinColor, &trialMaxColor, pResults->m_pbits, pParams, pResults); + + trialMinColor = trialMinColorOrig; + trialMaxColor = trialMaxColorOrig; + fixDegenerateEndpoints(mode, &trialMinColor, &trialMaxColor, &xl, &xh, levels - 1, 3); + if ((pResults->m_best_overall_err == UINT64_MAX) || color_quad_u8_notequals(&trialMinColor, &pResults->m_low_endpoint) || color_quad_u8_notequals(&trialMaxColor, &pResults->m_high_endpoint)) + evaluate_solution(&trialMinColor, &trialMaxColor, pResults->m_pbits, pParams, pResults); + } + else + { + if ((pResults->m_best_overall_err == UINT64_MAX) || color_quad_u8_notequals(&trialMinColor, &pResults->m_low_endpoint) || color_quad_u8_notequals(&trialMaxColor, &pResults->m_high_endpoint)) + { + evaluate_solution(&trialMinColor, &trialMaxColor, pResults->m_pbits, pParams, pResults); + } + } + + for (uint32_t i = 0; i < 4; i++) + { + pResults->m_astc_low_endpoint.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_low_endpoint.m_c[i]].m_index; + pResults->m_astc_high_endpoint.m_c[i] = g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_high_endpoint.m_c[i]].m_index; + } + } + else if (pParams->m_has_pbits) + { + const int iscalep = (1 << (pParams->m_comp_bits + 1)) - 1; + const float scalep = (float)iscalep; + + const int32_t totalComps = pParams->m_has_alpha ? 4 : 3; + + uint32_t best_pbits[2]; + color_quad_u8 bestMinColor, bestMaxColor; + + if (!pParams->m_endpoints_share_pbit) + { + float best_err0 = 1e+9; + float best_err1 = 1e+9; + + for (int p = 0; p < 2; p++) + { + color_quad_u8 xMinColor, xMaxColor; + + // Notes: The pbit controls which quantization intervals are selected. + // total_levels=2^(comp_bits+1), where comp_bits=4 for mode 0, etc. + // pbit 0: v=(b*2)/(total_levels-1), pbit 1: v=(b*2+1)/(total_levels-1) where b is the component bin from [0,total_levels/2-1] and v is the [0,1] component value + // rearranging you get for pbit 0: b=floor(v*(total_levels-1)/2+.5) + // rearranging you get for pbit 1: b=floor((v*(total_levels-1)-1)/2+.5) + for (uint32_t c = 0; c < 4; c++) + { + xMinColor.m_c[c] = (uint8_t)(clampi(((int)((xl.m_c[c] * scalep - p) / 2.0f + .5f)) * 2 + p, p, iscalep - 1 + p)); + xMaxColor.m_c[c] = (uint8_t)(clampi(((int)((xh.m_c[c] * scalep - p) / 2.0f + .5f)) * 2 + p, p, iscalep - 1 + p)); + } + + color_quad_u8 scaledLow = scale_color(&xMinColor, pParams); + color_quad_u8 scaledHigh = scale_color(&xMaxColor, pParams); + + float err0 = 0, err1 = 0; + for (int i = 0; i < totalComps; i++) + { + err0 += squaref(scaledLow.m_c[i] - xl.m_c[i] * 255.0f); + err1 += squaref(scaledHigh.m_c[i] - xh.m_c[i] * 255.0f); + } + + if (err0 < best_err0) + { + best_err0 = err0; + best_pbits[0] = p; + + bestMinColor.m_c[0] = xMinColor.m_c[0] >> 1; + bestMinColor.m_c[1] = xMinColor.m_c[1] >> 1; + bestMinColor.m_c[2] = xMinColor.m_c[2] >> 1; + bestMinColor.m_c[3] = xMinColor.m_c[3] >> 1; + } + + if (err1 < best_err1) + { + best_err1 = err1; + best_pbits[1] = p; + + bestMaxColor.m_c[0] = xMaxColor.m_c[0] >> 1; + bestMaxColor.m_c[1] = xMaxColor.m_c[1] >> 1; + bestMaxColor.m_c[2] = xMaxColor.m_c[2] >> 1; + bestMaxColor.m_c[3] = xMaxColor.m_c[3] >> 1; + } + } + } + else + { + // Endpoints share pbits + float best_err = 1e+9; + + for (int p = 0; p < 2; p++) + { + color_quad_u8 xMinColor, xMaxColor; + for (uint32_t c = 0; c < 4; c++) + { + xMinColor.m_c[c] = (uint8_t)(clampi(((int)((xl.m_c[c] * scalep - p) / 2.0f + .5f)) * 2 + p, p, iscalep - 1 + p)); + xMaxColor.m_c[c] = (uint8_t)(clampi(((int)((xh.m_c[c] * scalep - p) / 2.0f + .5f)) * 2 + p, p, iscalep - 1 + p)); + } + + color_quad_u8 scaledLow = scale_color(&xMinColor, pParams); + color_quad_u8 scaledHigh = scale_color(&xMaxColor, pParams); + + float err = 0; + for (int i = 0; i < totalComps; i++) + err += squaref((scaledLow.m_c[i] / 255.0f) - xl.m_c[i]) + squaref((scaledHigh.m_c[i] / 255.0f) - xh.m_c[i]); + + if (err < best_err) + { + best_err = err; + best_pbits[0] = p; + best_pbits[1] = p; + for (uint32_t j = 0; j < 4; j++) + { + bestMinColor.m_c[j] = xMinColor.m_c[j] >> 1; + bestMaxColor.m_c[j] = xMaxColor.m_c[j] >> 1; + } + } + } + } + + fixDegenerateEndpoints(mode, &bestMinColor, &bestMaxColor, &xl, &xh, iscalep >> 1, 0); + + if ((pResults->m_best_overall_err == UINT64_MAX) || color_quad_u8_notequals(&bestMinColor, &pResults->m_low_endpoint) || color_quad_u8_notequals(&bestMaxColor, &pResults->m_high_endpoint) || (best_pbits[0] != pResults->m_pbits[0]) || (best_pbits[1] != pResults->m_pbits[1])) + evaluate_solution(&bestMinColor, &bestMaxColor, best_pbits, pParams, pResults); + } + else + { + const int iscale = (1 << pParams->m_comp_bits) - 1; + const float scale = (float)iscale; + + color_quad_u8 trialMinColor, trialMaxColor; + color_quad_u8_set_clamped(&trialMinColor, (int)(xl.m_c[0] * scale + .5f), (int)(xl.m_c[1] * scale + .5f), (int)(xl.m_c[2] * scale + .5f), (int)(xl.m_c[3] * scale + .5f)); + color_quad_u8_set_clamped(&trialMaxColor, (int)(xh.m_c[0] * scale + .5f), (int)(xh.m_c[1] * scale + .5f), (int)(xh.m_c[2] * scale + .5f), (int)(xh.m_c[3] * scale + .5f)); + + fixDegenerateEndpoints(mode, &trialMinColor, &trialMaxColor, &xl, &xh, iscale, 0); + + if ((pResults->m_best_overall_err == UINT64_MAX) || color_quad_u8_notequals(&trialMinColor, &pResults->m_low_endpoint) || color_quad_u8_notequals(&trialMaxColor, &pResults->m_high_endpoint)) + evaluate_solution(&trialMinColor, &trialMaxColor, pResults->m_pbits, pParams, pResults); + } + + return pResults->m_best_overall_err; +} + +#if (__cplusplus >= 201703L) +#define MAYBE_UNUSED [[maybe_unused]] +#elif __GNUC__ || __clang__ + #define MAYBE_UNUSED __attribute__((unused)) +#else + // VC++ has no equivalent + #define MAYBE_UNUSED +#endif + +void check_best_overall_error(const color_cell_compressor_params *pParams, color_cell_compressor_results *pResults) +{ + const uint32_t n = pParams->m_num_selector_weights; + + assert(n <= 32); + + color_quad_u8 colors[32]; + for (uint32_t c = 0; c < 4; c++) + { + colors[0].m_c[c] = g_astc_unquant[pParams->m_astc_endpoint_range][pResults->m_astc_low_endpoint.m_c[c]].m_unquant; + assert(colors[0].m_c[c] == g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_low_endpoint.m_c[c]].m_unquant); + + colors[n-1].m_c[c] = g_astc_unquant[pParams->m_astc_endpoint_range][pResults->m_astc_high_endpoint.m_c[c]].m_unquant; + assert(colors[n-1].m_c[c] == g_astc_sorted_order_unquant[pParams->m_astc_endpoint_range][pResults->m_high_endpoint.m_c[c]].m_unquant); + } + + for (uint32_t i = 1; i < pParams->m_num_selector_weights - 1; i++) + for (uint32_t c = 0; c < 4; c++) + colors[i].m_c[c] = (uint8_t)astc_interpolate_linear(colors[0].m_c[c], colors[n - 1].m_c[c], pParams->m_pSelector_weights[i]); + + MAYBE_UNUSED uint64_t total_err = 0; + for (uint32_t p = 0; p < pParams->m_num_pixels; p++) + { + const color_quad_u8 &orig = pParams->m_pPixels[p]; + const color_quad_u8 &packed = colors[pResults->m_pSelectors[p]]; + + if (pParams->m_has_alpha) + total_err += compute_color_distance_rgba(&orig, &packed, pParams->m_perceptual, pParams->m_weights); + else + total_err += compute_color_distance_rgb(&orig, &packed, pParams->m_perceptual, pParams->m_weights); + } + assert(total_err == pResults->m_best_overall_err); + + // HACK HACK + //if (total_err != pResults->m_best_overall_err) + // printf("X"); +} + +static bool is_solid_rgb(const color_cell_compressor_params *pParams, uint32_t &r, uint32_t &g, uint32_t &b) +{ + r = pParams->m_pPixels[0].m_c[0]; + g = pParams->m_pPixels[0].m_c[1]; + b = pParams->m_pPixels[0].m_c[2]; + + bool allSame = true; + for (uint32_t i = 1; i < pParams->m_num_pixels; i++) + { + if ((r != pParams->m_pPixels[i].m_c[0]) || (g != pParams->m_pPixels[i].m_c[1]) || (b != pParams->m_pPixels[i].m_c[2])) + { + allSame = false; + break; + } + } + + return allSame; +} + +static bool is_solid_rgba(const color_cell_compressor_params *pParams, uint32_t &r, uint32_t &g, uint32_t &b, uint32_t &a) +{ + r = pParams->m_pPixels[0].m_c[0]; + g = pParams->m_pPixels[0].m_c[1]; + b = pParams->m_pPixels[0].m_c[2]; + a = pParams->m_pPixels[0].m_c[3]; + + bool allSame = true; + for (uint32_t i = 1; i < pParams->m_num_pixels; i++) + { + if ((r != pParams->m_pPixels[i].m_c[0]) || (g != pParams->m_pPixels[i].m_c[1]) || (b != pParams->m_pPixels[i].m_c[2]) || (a != pParams->m_pPixels[i].m_c[3])) + { + allSame = false; + break; + } + } + + return allSame; +} + +uint64_t color_cell_compression(uint32_t mode, const color_cell_compressor_params *pParams, color_cell_compressor_results *pResults, const bc7enc_compress_block_params *pComp_params) +{ + if (!pParams->m_astc_endpoint_range) + { + assert((mode == 6) || (!pParams->m_has_alpha)); + } + assert(pParams->m_num_selector_weights >= 1 && pParams->m_num_selector_weights <= 32); + assert(pParams->m_pSelector_weights[0] == 0); + assert(pParams->m_pSelector_weights[pParams->m_num_selector_weights - 1] == 64); + + pResults->m_best_overall_err = UINT64_MAX; + + uint32_t cr, cg, cb, ca; + + // If the partition's colors are all the same, then just pack them as a single color. + if (!pParams->m_pForce_selectors) + { + if (mode == 1) + { + if (is_solid_rgb(pParams, cr, cg, cb)) + return pack_mode1_to_one_color(pParams, pResults, cr, cg, cb, pResults->m_pSelectors); + } + else if ((pParams->m_astc_endpoint_range == 8) && (pParams->m_num_selector_weights == 8) && (!pParams->m_has_alpha)) + { + if (is_solid_rgb(pParams, cr, cg, cb)) + return pack_astc_4bit_3bit_to_one_color(pParams, pResults, cr, cg, cb, pResults->m_pSelectors); + } + else if ((pParams->m_astc_endpoint_range == 7) && (pParams->m_num_selector_weights == 4) && (!pParams->m_has_alpha)) + { + if (is_solid_rgb(pParams, cr, cg, cb)) + return pack_astc_range7_2bit_to_one_color(pParams, pResults, cr, cg, cb, pResults->m_pSelectors); + } + else if ((pParams->m_astc_endpoint_range == 8) && (pParams->m_num_selector_weights == 4) && (pParams->m_has_alpha)) + { + if (is_solid_rgba(pParams, cr, cg, cb, ca)) + return pack_astc_4bit_2bit_to_one_color_rgba(pParams, pResults, cr, cg, cb, ca, pResults->m_pSelectors); + } + else if ((pParams->m_astc_endpoint_range == 13) && (pParams->m_num_selector_weights == 4) && (!pParams->m_has_alpha)) + { + if (is_solid_rgb(pParams, cr, cg, cb)) + return pack_astc_range13_2bit_to_one_color(pParams, pResults, cr, cg, cb, pResults->m_pSelectors); + } + else if ((pParams->m_astc_endpoint_range == 11) && (pParams->m_num_selector_weights == 32) && (!pParams->m_has_alpha)) + { + if (is_solid_rgb(pParams, cr, cg, cb)) + return pack_astc_range11_5bit_to_one_color(pParams, pResults, cr, cg, cb, pResults->m_pSelectors); + } + } + + // Compute partition's mean color and principle axis. + bc7enc_vec4F meanColor, axis; + vec4F_set_scalar(&meanColor, 0.0f); + + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + { + bc7enc_vec4F color = vec4F_from_color(&pParams->m_pPixels[i]); + meanColor = vec4F_add(&meanColor, &color); + } + + bc7enc_vec4F meanColorScaled = vec4F_mul(&meanColor, 1.0f / (float)(pParams->m_num_pixels)); + + meanColor = vec4F_mul(&meanColor, 1.0f / (float)(pParams->m_num_pixels * 255.0f)); + vec4F_saturate_in_place(&meanColor); + + if (pParams->m_has_alpha) + { + // Use incremental PCA for RGBA PCA, because it's simple. + vec4F_set_scalar(&axis, 0.0f); + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + { + bc7enc_vec4F color = vec4F_from_color(&pParams->m_pPixels[i]); + color = vec4F_sub(&color, &meanColorScaled); + bc7enc_vec4F a = vec4F_mul(&color, color.m_c[0]); + bc7enc_vec4F b = vec4F_mul(&color, color.m_c[1]); + bc7enc_vec4F c = vec4F_mul(&color, color.m_c[2]); + bc7enc_vec4F d = vec4F_mul(&color, color.m_c[3]); + bc7enc_vec4F n = i ? axis : color; + vec4F_normalize_in_place(&n); + axis.m_c[0] += vec4F_dot(&a, &n); + axis.m_c[1] += vec4F_dot(&b, &n); + axis.m_c[2] += vec4F_dot(&c, &n); + axis.m_c[3] += vec4F_dot(&d, &n); + } + vec4F_normalize_in_place(&axis); + } + else + { + // Use covar technique for RGB PCA, because it doesn't require per-pixel normalization. + float cov[6] = { 0, 0, 0, 0, 0, 0 }; + + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + { + const color_quad_u8 *pV = &pParams->m_pPixels[i]; + float r = pV->m_c[0] - meanColorScaled.m_c[0]; + float g = pV->m_c[1] - meanColorScaled.m_c[1]; + float b = pV->m_c[2] - meanColorScaled.m_c[2]; + cov[0] += r*r; cov[1] += r*g; cov[2] += r*b; cov[3] += g*g; cov[4] += g*b; cov[5] += b*b; + } + + float xr = .9f, xg = 1.0f, xb = .7f; + for (uint32_t iter = 0; iter < 3; iter++) + { + float r = xr * cov[0] + xg * cov[1] + xb * cov[2]; + float g = xr * cov[1] + xg * cov[3] + xb * cov[4]; + float b = xr * cov[2] + xg * cov[4] + xb * cov[5]; + + float m = maximumf(maximumf(fabsf(r), fabsf(g)), fabsf(b)); + if (m > 1e-10f) + { + m = 1.0f / m; + r *= m; g *= m; b *= m; + } + + xr = r; xg = g; xb = b; + } + + float len = xr * xr + xg * xg + xb * xb; + if (len < 1e-10f) + vec4F_set_scalar(&axis, 0.0f); + else + { + len = 1.0f / sqrtf(len); + xr *= len; xg *= len; xb *= len; + vec4F_set(&axis, xr, xg, xb, 0); + } + } + + if (vec4F_dot(&axis, &axis) < .5f) + { + if (pParams->m_perceptual) + vec4F_set(&axis, .213f, .715f, .072f, pParams->m_has_alpha ? .715f : 0); + else + vec4F_set(&axis, 1.0f, 1.0f, 1.0f, pParams->m_has_alpha ? 1.0f : 0); + vec4F_normalize_in_place(&axis); + } + + bc7enc_vec4F minColor, maxColor; + + float l = 1e+9f, h = -1e+9f; + + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + { + bc7enc_vec4F color = vec4F_from_color(&pParams->m_pPixels[i]); + + bc7enc_vec4F q = vec4F_sub(&color, &meanColorScaled); + float d = vec4F_dot(&q, &axis); + + l = minimumf(l, d); + h = maximumf(h, d); + } + + l *= (1.0f / 255.0f); + h *= (1.0f / 255.0f); + + bc7enc_vec4F b0 = vec4F_mul(&axis, l); + bc7enc_vec4F b1 = vec4F_mul(&axis, h); + bc7enc_vec4F c0 = vec4F_add(&meanColor, &b0); + bc7enc_vec4F c1 = vec4F_add(&meanColor, &b1); + minColor = vec4F_saturate(&c0); + maxColor = vec4F_saturate(&c1); + + bc7enc_vec4F whiteVec; + vec4F_set_scalar(&whiteVec, 1.0f); + if (vec4F_dot(&minColor, &whiteVec) > vec4F_dot(&maxColor, &whiteVec)) + { +#if 1 + std::swap(minColor.m_c[0], maxColor.m_c[0]); + std::swap(minColor.m_c[1], maxColor.m_c[1]); + std::swap(minColor.m_c[2], maxColor.m_c[2]); + std::swap(minColor.m_c[3], maxColor.m_c[3]); +#elif 0 + // Fails to compile correctly with MSVC 2019 (code generation bug) + std::swap(minColor, maxColor); +#else + // Fails with MSVC 2019 + bc7enc_vec4F temp = minColor; + minColor = maxColor; + maxColor = temp; +#endif + } + + // First find a solution using the block's PCA. + if (!find_optimal_solution(mode, minColor, maxColor, pParams, pResults)) + return 0; + + for (uint32_t i = 0; i < pComp_params->m_least_squares_passes; i++) + { + // Now try to refine the solution using least squares by computing the optimal endpoints from the current selectors. + bc7enc_vec4F xl, xh; + vec4F_set_scalar(&xl, 0.0f); + vec4F_set_scalar(&xh, 0.0f); + if (pParams->m_has_alpha) + compute_least_squares_endpoints_rgba(pParams->m_num_pixels, pResults->m_pSelectors, pParams->m_pSelector_weightsx, &xl, &xh, pParams->m_pPixels); + else + compute_least_squares_endpoints_rgb(pParams->m_num_pixels, pResults->m_pSelectors, pParams->m_pSelector_weightsx, &xl, &xh, pParams->m_pPixels); + + xl = vec4F_mul(&xl, (1.0f / 255.0f)); + xh = vec4F_mul(&xh, (1.0f / 255.0f)); + + if (!find_optimal_solution(mode, xl, xh, pParams, pResults)) + return 0; + } + + if ((!pParams->m_pForce_selectors) && (pComp_params->m_uber_level > 0)) + { + // In uber level 1, try varying the selectors a little, somewhat like cluster fit would. First try incrementing the minimum selectors, + // then try decrementing the selectrors, then try both. + uint8_t selectors_temp[16], selectors_temp1[16]; + memcpy(selectors_temp, pResults->m_pSelectors, pParams->m_num_pixels); + + const int max_selector = pParams->m_num_selector_weights - 1; + + uint32_t min_sel = 256; + uint32_t max_sel = 0; + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + { + uint32_t sel = selectors_temp[i]; + min_sel = minimumu(min_sel, sel); + max_sel = maximumu(max_sel, sel); + } + + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + { + uint32_t sel = selectors_temp[i]; + if ((sel == min_sel) && (sel < (pParams->m_num_selector_weights - 1))) + sel++; + selectors_temp1[i] = (uint8_t)sel; + } + + bc7enc_vec4F xl, xh; + vec4F_set_scalar(&xl, 0.0f); + vec4F_set_scalar(&xh, 0.0f); + if (pParams->m_has_alpha) + compute_least_squares_endpoints_rgba(pParams->m_num_pixels, selectors_temp1, pParams->m_pSelector_weightsx, &xl, &xh, pParams->m_pPixels); + else + compute_least_squares_endpoints_rgb(pParams->m_num_pixels, selectors_temp1, pParams->m_pSelector_weightsx, &xl, &xh, pParams->m_pPixels); + + xl = vec4F_mul(&xl, (1.0f / 255.0f)); + xh = vec4F_mul(&xh, (1.0f / 255.0f)); + + if (!find_optimal_solution(mode, xl, xh, pParams, pResults)) + return 0; + + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + { + uint32_t sel = selectors_temp[i]; + if ((sel == max_sel) && (sel > 0)) + sel--; + selectors_temp1[i] = (uint8_t)sel; + } + + if (pParams->m_has_alpha) + compute_least_squares_endpoints_rgba(pParams->m_num_pixels, selectors_temp1, pParams->m_pSelector_weightsx, &xl, &xh, pParams->m_pPixels); + else + compute_least_squares_endpoints_rgb(pParams->m_num_pixels, selectors_temp1, pParams->m_pSelector_weightsx, &xl, &xh, pParams->m_pPixels); + + xl = vec4F_mul(&xl, (1.0f / 255.0f)); + xh = vec4F_mul(&xh, (1.0f / 255.0f)); + + if (!find_optimal_solution(mode, xl, xh, pParams, pResults)) + return 0; + + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + { + uint32_t sel = selectors_temp[i]; + if ((sel == min_sel) && (sel < (pParams->m_num_selector_weights - 1))) + sel++; + else if ((sel == max_sel) && (sel > 0)) + sel--; + selectors_temp1[i] = (uint8_t)sel; + } + + if (pParams->m_has_alpha) + compute_least_squares_endpoints_rgba(pParams->m_num_pixels, selectors_temp1, pParams->m_pSelector_weightsx, &xl, &xh, pParams->m_pPixels); + else + compute_least_squares_endpoints_rgb(pParams->m_num_pixels, selectors_temp1, pParams->m_pSelector_weightsx, &xl, &xh, pParams->m_pPixels); + + xl = vec4F_mul(&xl, (1.0f / 255.0f)); + xh = vec4F_mul(&xh, (1.0f / 255.0f)); + + if (!find_optimal_solution(mode, xl, xh, pParams, pResults)) + return 0; + + // In uber levels 2+, try taking more advantage of endpoint extrapolation by scaling the selectors in one direction or another. + const uint32_t uber_err_thresh = (pParams->m_num_pixels * 56) >> 4; + if ((pComp_params->m_uber_level >= 2) && (pResults->m_best_overall_err > uber_err_thresh)) + { + const int Q = (pComp_params->m_uber_level >= 4) ? (pComp_params->m_uber_level - 2) : 1; + for (int ly = -Q; ly <= 1; ly++) + { + for (int hy = max_selector - 1; hy <= (max_selector + Q); hy++) + { + if ((ly == 0) && (hy == max_selector)) + continue; + + for (uint32_t i = 0; i < pParams->m_num_pixels; i++) + selectors_temp1[i] = (uint8_t)clampf(floorf((float)max_selector * ((float)selectors_temp[i] - (float)ly) / ((float)hy - (float)ly) + .5f), 0, (float)max_selector); + + //bc7enc_vec4F xl, xh; + vec4F_set_scalar(&xl, 0.0f); + vec4F_set_scalar(&xh, 0.0f); + if (pParams->m_has_alpha) + compute_least_squares_endpoints_rgba(pParams->m_num_pixels, selectors_temp1, pParams->m_pSelector_weightsx, &xl, &xh, pParams->m_pPixels); + else + compute_least_squares_endpoints_rgb(pParams->m_num_pixels, selectors_temp1, pParams->m_pSelector_weightsx, &xl, &xh, pParams->m_pPixels); + + xl = vec4F_mul(&xl, (1.0f / 255.0f)); + xh = vec4F_mul(&xh, (1.0f / 255.0f)); + + if (!find_optimal_solution(mode, xl, xh, pParams, pResults)) + return 0; + } + } + } + } + + if (!pParams->m_pForce_selectors) + { + // Try encoding the partition as a single color by using the optimal single colors tables to encode the block to its mean. + if (mode == 1) + { + color_cell_compressor_results avg_results = *pResults; + const uint32_t r = (int)(.5f + meanColor.m_c[0] * 255.0f), g = (int)(.5f + meanColor.m_c[1] * 255.0f), b = (int)(.5f + meanColor.m_c[2] * 255.0f); + uint64_t avg_err = pack_mode1_to_one_color(pParams, &avg_results, r, g, b, pResults->m_pSelectors_temp); + if (avg_err < pResults->m_best_overall_err) + { + *pResults = avg_results; + memcpy(pResults->m_pSelectors, pResults->m_pSelectors_temp, sizeof(pResults->m_pSelectors[0]) * pParams->m_num_pixels); + pResults->m_best_overall_err = avg_err; + } + } + else if ((pParams->m_astc_endpoint_range == 8) && (pParams->m_num_selector_weights == 8) && (!pParams->m_has_alpha)) + { + color_cell_compressor_results avg_results = *pResults; + const uint32_t r = (int)(.5f + meanColor.m_c[0] * 255.0f), g = (int)(.5f + meanColor.m_c[1] * 255.0f), b = (int)(.5f + meanColor.m_c[2] * 255.0f); + uint64_t avg_err = pack_astc_4bit_3bit_to_one_color(pParams, &avg_results, r, g, b, pResults->m_pSelectors_temp); + if (avg_err < pResults->m_best_overall_err) + { + *pResults = avg_results; + memcpy(pResults->m_pSelectors, pResults->m_pSelectors_temp, sizeof(pResults->m_pSelectors[0]) * pParams->m_num_pixels); + pResults->m_best_overall_err = avg_err; + } + } + else if ((pParams->m_astc_endpoint_range == 7) && (pParams->m_num_selector_weights == 4) && (!pParams->m_has_alpha)) + { + color_cell_compressor_results avg_results = *pResults; + const uint32_t r = (int)(.5f + meanColor.m_c[0] * 255.0f), g = (int)(.5f + meanColor.m_c[1] * 255.0f), b = (int)(.5f + meanColor.m_c[2] * 255.0f); + uint64_t avg_err = pack_astc_range7_2bit_to_one_color(pParams, &avg_results, r, g, b, pResults->m_pSelectors_temp); + if (avg_err < pResults->m_best_overall_err) + { + *pResults = avg_results; + memcpy(pResults->m_pSelectors, pResults->m_pSelectors_temp, sizeof(pResults->m_pSelectors[0]) * pParams->m_num_pixels); + pResults->m_best_overall_err = avg_err; + } + } + else if ((pParams->m_astc_endpoint_range == 8) && (pParams->m_num_selector_weights == 4) && (pParams->m_has_alpha)) + { + color_cell_compressor_results avg_results = *pResults; + const uint32_t r = (int)(.5f + meanColor.m_c[0] * 255.0f), g = (int)(.5f + meanColor.m_c[1] * 255.0f), b = (int)(.5f + meanColor.m_c[2] * 255.0f), a = (int)(.5f + meanColor.m_c[3] * 255.0f); + uint64_t avg_err = pack_astc_4bit_2bit_to_one_color_rgba(pParams, &avg_results, r, g, b, a, pResults->m_pSelectors_temp); + if (avg_err < pResults->m_best_overall_err) + { + *pResults = avg_results; + memcpy(pResults->m_pSelectors, pResults->m_pSelectors_temp, sizeof(pResults->m_pSelectors[0]) * pParams->m_num_pixels); + pResults->m_best_overall_err = avg_err; + } + } + else if ((pParams->m_astc_endpoint_range == 13) && (pParams->m_num_selector_weights == 4) && (!pParams->m_has_alpha)) + { + color_cell_compressor_results avg_results = *pResults; + const uint32_t r = (int)(.5f + meanColor.m_c[0] * 255.0f), g = (int)(.5f + meanColor.m_c[1] * 255.0f), b = (int)(.5f + meanColor.m_c[2] * 255.0f); + uint64_t avg_err = pack_astc_range13_2bit_to_one_color(pParams, &avg_results, r, g, b, pResults->m_pSelectors_temp); + if (avg_err < pResults->m_best_overall_err) + { + *pResults = avg_results; + memcpy(pResults->m_pSelectors, pResults->m_pSelectors_temp, sizeof(pResults->m_pSelectors[0]) * pParams->m_num_pixels); + pResults->m_best_overall_err = avg_err; + } + } + else if ((pParams->m_astc_endpoint_range == 11) && (pParams->m_num_selector_weights == 32) && (!pParams->m_has_alpha)) + { + color_cell_compressor_results avg_results = *pResults; + const uint32_t r = (int)(.5f + meanColor.m_c[0] * 255.0f), g = (int)(.5f + meanColor.m_c[1] * 255.0f), b = (int)(.5f + meanColor.m_c[2] * 255.0f); + uint64_t avg_err = pack_astc_range11_5bit_to_one_color(pParams, &avg_results, r, g, b, pResults->m_pSelectors_temp); + if (avg_err < pResults->m_best_overall_err) + { + *pResults = avg_results; + memcpy(pResults->m_pSelectors, pResults->m_pSelectors_temp, sizeof(pResults->m_pSelectors[0]) * pParams->m_num_pixels); + pResults->m_best_overall_err = avg_err; + } + } + } + +#if BC7ENC_CHECK_OVERALL_ERROR + check_best_overall_error(pParams, pResults); +#endif + + return pResults->m_best_overall_err; +} + +uint64_t color_cell_compression_est_astc( + uint32_t num_weights, uint32_t num_comps, const uint32_t *pWeight_table, + uint32_t num_pixels, const color_quad_u8* pPixels, + uint64_t best_err_so_far, const uint32_t weights[4]) +{ + assert(num_comps == 3 || num_comps == 4); + assert(num_weights >= 1 && num_weights <= 32); + assert(pWeight_table[0] == 0 && pWeight_table[num_weights - 1] == 64); + + // Find RGB bounds as an approximation of the block's principle axis + uint32_t lr = 255, lg = 255, lb = 255, la = 255; + uint32_t hr = 0, hg = 0, hb = 0, ha = 0; + if (num_comps == 4) + { + for (uint32_t i = 0; i < num_pixels; i++) + { + const color_quad_u8* pC = &pPixels[i]; + if (pC->m_c[0] < lr) lr = pC->m_c[0]; + if (pC->m_c[1] < lg) lg = pC->m_c[1]; + if (pC->m_c[2] < lb) lb = pC->m_c[2]; + if (pC->m_c[3] < la) la = pC->m_c[3]; + + if (pC->m_c[0] > hr) hr = pC->m_c[0]; + if (pC->m_c[1] > hg) hg = pC->m_c[1]; + if (pC->m_c[2] > hb) hb = pC->m_c[2]; + if (pC->m_c[3] > ha) ha = pC->m_c[3]; + } + } + else + { + for (uint32_t i = 0; i < num_pixels; i++) + { + const color_quad_u8* pC = &pPixels[i]; + if (pC->m_c[0] < lr) lr = pC->m_c[0]; + if (pC->m_c[1] < lg) lg = pC->m_c[1]; + if (pC->m_c[2] < lb) lb = pC->m_c[2]; + + if (pC->m_c[0] > hr) hr = pC->m_c[0]; + if (pC->m_c[1] > hg) hg = pC->m_c[1]; + if (pC->m_c[2] > hb) hb = pC->m_c[2]; + } + la = 255; + ha = 255; + } + + color_quad_u8 lowColor, highColor; + color_quad_u8_set(&lowColor, lr, lg, lb, la); + color_quad_u8_set(&highColor, hr, hg, hb, ha); + + // Place endpoints at bbox diagonals and compute interpolated colors + color_quad_u8 weightedColors[32]; + + weightedColors[0] = lowColor; + weightedColors[num_weights - 1] = highColor; + for (uint32_t i = 1; i < (num_weights - 1); i++) + { + weightedColors[i].m_c[0] = (uint8_t)astc_interpolate_linear(lowColor.m_c[0], highColor.m_c[0], pWeight_table[i]); + weightedColors[i].m_c[1] = (uint8_t)astc_interpolate_linear(lowColor.m_c[1], highColor.m_c[1], pWeight_table[i]); + weightedColors[i].m_c[2] = (uint8_t)astc_interpolate_linear(lowColor.m_c[2], highColor.m_c[2], pWeight_table[i]); + weightedColors[i].m_c[3] = (num_comps == 4) ? (uint8_t)astc_interpolate_linear(lowColor.m_c[3], highColor.m_c[3], pWeight_table[i]) : 255; + } + + // Compute dots and thresholds + const int ar = highColor.m_c[0] - lowColor.m_c[0]; + const int ag = highColor.m_c[1] - lowColor.m_c[1]; + const int ab = highColor.m_c[2] - lowColor.m_c[2]; + const int aa = highColor.m_c[3] - lowColor.m_c[3]; + + int dots[32]; + if (num_comps == 4) + { + for (uint32_t i = 0; i < num_weights; i++) + dots[i] = weightedColors[i].m_c[0] * ar + weightedColors[i].m_c[1] * ag + weightedColors[i].m_c[2] * ab + weightedColors[i].m_c[3] * aa; + } + else + { + assert(aa == 0); + for (uint32_t i = 0; i < num_weights; i++) + dots[i] = weightedColors[i].m_c[0] * ar + weightedColors[i].m_c[1] * ag + weightedColors[i].m_c[2] * ab; + } + + int thresh[32 - 1]; + for (uint32_t i = 0; i < (num_weights - 1); i++) + thresh[i] = (dots[i] + dots[i + 1] + 1) >> 1; + + uint64_t total_err = 0; + if ((weights[0] | weights[1] | weights[2] | weights[3]) == 1) + { + if (num_comps == 4) + { + for (uint32_t i = 0; i < num_pixels; i++) + { + const color_quad_u8* pC = &pPixels[i]; + + int d = ar * pC->m_c[0] + ag * pC->m_c[1] + ab * pC->m_c[2] + aa * pC->m_c[3]; + + // Find approximate selector + uint32_t s = 0; + for (int j = num_weights - 2; j >= 0; j--) + { + if (d >= thresh[j]) + { + s = j + 1; + break; + } + } + + // Compute error + const color_quad_u8* pE1 = &weightedColors[s]; + + int dr = (int)pE1->m_c[0] - (int)pC->m_c[0]; + int dg = (int)pE1->m_c[1] - (int)pC->m_c[1]; + int db = (int)pE1->m_c[2] - (int)pC->m_c[2]; + int da = (int)pE1->m_c[3] - (int)pC->m_c[3]; + + total_err += (dr * dr) + (dg * dg) + (db * db) + (da * da); + if (total_err > best_err_so_far) + break; + } + } + else + { + for (uint32_t i = 0; i < num_pixels; i++) + { + const color_quad_u8* pC = &pPixels[i]; + + int d = ar * pC->m_c[0] + ag * pC->m_c[1] + ab * pC->m_c[2]; + + // Find approximate selector + uint32_t s = 0; + for (int j = num_weights - 2; j >= 0; j--) + { + if (d >= thresh[j]) + { + s = j + 1; + break; + } + } + + // Compute error + const color_quad_u8* pE1 = &weightedColors[s]; + + int dr = (int)pE1->m_c[0] - (int)pC->m_c[0]; + int dg = (int)pE1->m_c[1] - (int)pC->m_c[1]; + int db = (int)pE1->m_c[2] - (int)pC->m_c[2]; + + total_err += (dr * dr) + (dg * dg) + (db * db); + if (total_err > best_err_so_far) + break; + } + } + } + else + { + if (num_comps == 4) + { + for (uint32_t i = 0; i < num_pixels; i++) + { + const color_quad_u8* pC = &pPixels[i]; + + int d = ar * pC->m_c[0] + ag * pC->m_c[1] + ab * pC->m_c[2] + aa * pC->m_c[3]; + + // Find approximate selector + uint32_t s = 0; + for (int j = num_weights - 2; j >= 0; j--) + { + if (d >= thresh[j]) + { + s = j + 1; + break; + } + } + + // Compute error + const color_quad_u8* pE1 = &weightedColors[s]; + + int dr = (int)pE1->m_c[0] - (int)pC->m_c[0]; + int dg = (int)pE1->m_c[1] - (int)pC->m_c[1]; + int db = (int)pE1->m_c[2] - (int)pC->m_c[2]; + int da = (int)pE1->m_c[3] - (int)pC->m_c[3]; + + total_err += weights[0] * (dr * dr) + weights[1] * (dg * dg) + weights[2] * (db * db) + weights[3] * (da * da); + if (total_err > best_err_so_far) + break; + } + } + else + { + for (uint32_t i = 0; i < num_pixels; i++) + { + const color_quad_u8* pC = &pPixels[i]; + + int d = ar * pC->m_c[0] + ag * pC->m_c[1] + ab * pC->m_c[2]; + + // Find approximate selector + uint32_t s = 0; + for (int j = num_weights - 2; j >= 0; j--) + { + if (d >= thresh[j]) + { + s = j + 1; + break; + } + } + + // Compute error + const color_quad_u8* pE1 = &weightedColors[s]; + + int dr = (int)pE1->m_c[0] - (int)pC->m_c[0]; + int dg = (int)pE1->m_c[1] - (int)pC->m_c[1]; + int db = (int)pE1->m_c[2] - (int)pC->m_c[2]; + + total_err += weights[0] * (dr * dr) + weights[1] * (dg * dg) + weights[2] * (db * db); + if (total_err > best_err_so_far) + break; + } + } + } + + return total_err; +} + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_bc7enc.h b/ktx/external/basisu/encoder/basisu_bc7enc.h new file mode 100644 index 0000000..8d8b788 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_bc7enc.h @@ -0,0 +1,132 @@ +// File: basisu_bc7enc.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once +#include "basisu_enc.h" +#include "../transcoder/basisu_transcoder_uastc.h" + +namespace basisu +{ + +#define BC7ENC_MAX_PARTITIONS1 (64) +#define BC7ENC_MAX_UBER_LEVEL (4) + + typedef uint8_t bc7enc_bool; + +#define BC7ENC_TRUE (1) +#define BC7ENC_FALSE (0) + + typedef struct { float m_c[4]; } bc7enc_vec4F; + + extern const float g_bc7_weights1x[2 * 4]; + extern const float g_bc7_weights2x[4 * 4]; + extern const float g_bc7_weights3x[8 * 4]; + extern const float g_bc7_weights4x[16 * 4]; + extern const float g_astc_weights4x[16 * 4]; + extern const float g_astc_weights5x[32 * 4]; + extern const float g_astc_weights_3levelsx[3 * 4]; + + extern basist::astc_quant_bin g_astc_sorted_order_unquant[basist::BC7ENC_TOTAL_ASTC_RANGES][256]; // [sorted unquantized order] + + struct color_cell_compressor_params + { + uint32_t m_num_pixels; + const basist::color_quad_u8* m_pPixels; + + uint32_t m_num_selector_weights; + const uint32_t* m_pSelector_weights; + + const bc7enc_vec4F* m_pSelector_weightsx; + uint32_t m_comp_bits; + + const uint8_t *m_pForce_selectors; + + // Non-zero m_astc_endpoint_range enables ASTC mode. m_comp_bits and m_has_pbits are always false. We only support 2, 3, or 4 bit weight encodings. + uint32_t m_astc_endpoint_range; + + uint32_t m_weights[4]; + bc7enc_bool m_has_alpha; + bc7enc_bool m_has_pbits; + bc7enc_bool m_endpoints_share_pbit; + bc7enc_bool m_perceptual; + }; + + struct color_cell_compressor_results + { + uint64_t m_best_overall_err; + basist::color_quad_u8 m_low_endpoint; + basist::color_quad_u8 m_high_endpoint; + uint32_t m_pbits[2]; + uint8_t* m_pSelectors; + uint8_t* m_pSelectors_temp; + + // Encoded ASTC indices, if ASTC mode is enabled + basist::color_quad_u8 m_astc_low_endpoint; + basist::color_quad_u8 m_astc_high_endpoint; + }; + + struct bc7enc_compress_block_params + { + // m_max_partitions_mode1 may range from 0 (disables mode 1) to BC7ENC_MAX_PARTITIONS1. The higher this value, the slower the compressor, but the higher the quality. + uint32_t m_max_partitions_mode1; + + // Relative RGBA or YCbCrA weights. + uint32_t m_weights[4]; + + // m_uber_level may range from 0 to BC7ENC_MAX_UBER_LEVEL. The higher this value, the slower the compressor, but the higher the quality. + uint32_t m_uber_level; + + // If m_perceptual is true, colorspace error is computed in YCbCr space, otherwise RGB. + bc7enc_bool m_perceptual; + + uint32_t m_least_squares_passes; + }; + + uint64_t color_cell_compression(uint32_t mode, const color_cell_compressor_params* pParams, color_cell_compressor_results* pResults, const bc7enc_compress_block_params* pComp_params); + + uint64_t color_cell_compression_est_astc( + uint32_t num_weights, uint32_t num_comps, const uint32_t* pWeight_table, + uint32_t num_pixels, const basist::color_quad_u8* pPixels, + uint64_t best_err_so_far, const uint32_t weights[4]); + + inline void bc7enc_compress_block_params_init_linear_weights(bc7enc_compress_block_params* p) + { + p->m_perceptual = BC7ENC_FALSE; + p->m_weights[0] = 1; + p->m_weights[1] = 1; + p->m_weights[2] = 1; + p->m_weights[3] = 1; + } + + inline void bc7enc_compress_block_params_init_perceptual_weights(bc7enc_compress_block_params* p) + { + p->m_perceptual = BC7ENC_TRUE; + p->m_weights[0] = 128; + p->m_weights[1] = 64; + p->m_weights[2] = 16; + p->m_weights[3] = 32; + } + + inline void bc7enc_compress_block_params_init(bc7enc_compress_block_params* p) + { + p->m_max_partitions_mode1 = BC7ENC_MAX_PARTITIONS1; + p->m_least_squares_passes = 1; + p->m_uber_level = 0; + bc7enc_compress_block_params_init_perceptual_weights(p); + } + + // bc7enc_compress_block_init() MUST be called before calling bc7enc_compress_block() (or you'll get artifacts). + void bc7enc_compress_block_init(); + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_comp.cpp b/ktx/external/basisu/encoder/basisu_comp.cpp new file mode 100644 index 0000000..c3f0500 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_comp.cpp @@ -0,0 +1,2390 @@ +// basisu_comp.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_comp.h" +#include "basisu_enc.h" +#include +#include + +// basisu_transcoder.cpp is where basisu_miniz lives now, we just need the declarations here. +#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES +#include "basisu_miniz.h" + +#include "basisu_opencl.h" + +#if !BASISD_SUPPORT_KTX2 +#error BASISD_SUPPORT_KTX2 must be enabled (set to 1). +#endif + +#if BASISD_SUPPORT_KTX2_ZSTD +#include "../zstd/zstd.h" +#endif + +// Set to 1 to disable the mipPadding alignment workaround (which only seems to be needed when no key-values are written at all) +#define BASISU_DISABLE_KTX2_ALIGNMENT_WORKAROUND (0) + +// Set to 1 to disable writing all KTX2 key values, triggering the validator bug. +#define BASISU_DISABLE_KTX2_KEY_VALUES (0) + +using namespace buminiz; + +#define BASISU_USE_STB_IMAGE_RESIZE_FOR_MIPMAP_GEN 0 +#define DEBUG_CROP_TEXTURE_TO_64x64 (0) +#define DEBUG_RESIZE_TEXTURE (0) +#define DEBUG_EXTRACT_SINGLE_BLOCK (0) + +namespace basisu +{ + basis_compressor::basis_compressor() : + m_pOpenCL_context(nullptr), + m_basis_file_size(0), + m_basis_bits_per_texel(0.0f), + m_total_blocks(0), + m_any_source_image_has_alpha(false), + m_opencl_failed(false) + { + debug_printf("basis_compressor::basis_compressor\n"); + + assert(g_library_initialized); + } + + basis_compressor::~basis_compressor() + { + if (m_pOpenCL_context) + { + opencl_destroy_context(m_pOpenCL_context); + m_pOpenCL_context = nullptr; + } + } + + bool basis_compressor::init(const basis_compressor_params ¶ms) + { + debug_printf("basis_compressor::init\n"); + + if (!g_library_initialized) + { + error_printf("basis_compressor::init: basisu_encoder_init() MUST be called before using any encoder functionality!\n"); + return false; + } + + if (!params.m_pJob_pool) + { + error_printf("basis_compressor::init: A non-null job_pool pointer must be specified\n"); + return false; + } + + m_params = params; + + if (m_params.m_debug) + { + debug_printf("basis_compressor::init:\n"); + +#define PRINT_BOOL_VALUE(v) debug_printf("%s: %u %u\n", BASISU_STRINGIZE2(v), static_cast(m_params.v), m_params.v.was_changed()); +#define PRINT_INT_VALUE(v) debug_printf("%s: %i %u\n", BASISU_STRINGIZE2(v), static_cast(m_params.v), m_params.v.was_changed()); +#define PRINT_UINT_VALUE(v) debug_printf("%s: %u %u\n", BASISU_STRINGIZE2(v), static_cast(m_params.v), m_params.v.was_changed()); +#define PRINT_FLOAT_VALUE(v) debug_printf("%s: %f %u\n", BASISU_STRINGIZE2(v), static_cast(m_params.v), m_params.v.was_changed()); + + debug_printf("Source images: %u, source filenames: %u, source alpha filenames: %i, Source mipmap images: %u\n", + m_params.m_source_images.size(), m_params.m_source_filenames.size(), m_params.m_source_alpha_filenames.size(), m_params.m_source_mipmap_images.size()); + + if (m_params.m_source_mipmap_images.size()) + { + debug_printf("m_source_mipmap_images array sizes:\n"); + for (uint32_t i = 0; i < m_params.m_source_mipmap_images.size(); i++) + debug_printf("%u ", m_params.m_source_mipmap_images[i].size()); + debug_printf("\n"); + } + + PRINT_BOOL_VALUE(m_uastc); + PRINT_BOOL_VALUE(m_use_opencl); + PRINT_BOOL_VALUE(m_y_flip); + PRINT_BOOL_VALUE(m_debug); + PRINT_BOOL_VALUE(m_validate_etc1s); + PRINT_BOOL_VALUE(m_debug_images); + PRINT_INT_VALUE(m_compression_level); + PRINT_BOOL_VALUE(m_perceptual); + PRINT_BOOL_VALUE(m_no_endpoint_rdo); + PRINT_BOOL_VALUE(m_no_selector_rdo); + PRINT_BOOL_VALUE(m_read_source_images); + PRINT_BOOL_VALUE(m_write_output_basis_files); + PRINT_BOOL_VALUE(m_compute_stats); + PRINT_BOOL_VALUE(m_check_for_alpha); + PRINT_BOOL_VALUE(m_force_alpha); + debug_printf("swizzle: %d,%d,%d,%d\n", + m_params.m_swizzle[0], + m_params.m_swizzle[1], + m_params.m_swizzle[2], + m_params.m_swizzle[3]); + PRINT_BOOL_VALUE(m_renormalize); + PRINT_BOOL_VALUE(m_multithreading); + PRINT_BOOL_VALUE(m_disable_hierarchical_endpoint_codebooks); + + PRINT_FLOAT_VALUE(m_endpoint_rdo_thresh); + PRINT_FLOAT_VALUE(m_selector_rdo_thresh); + + PRINT_BOOL_VALUE(m_mip_gen); + PRINT_BOOL_VALUE(m_mip_renormalize); + PRINT_BOOL_VALUE(m_mip_wrapping); + PRINT_BOOL_VALUE(m_mip_fast); + PRINT_BOOL_VALUE(m_mip_srgb); + PRINT_FLOAT_VALUE(m_mip_premultiplied); + PRINT_FLOAT_VALUE(m_mip_scale); + PRINT_INT_VALUE(m_mip_smallest_dimension); + debug_printf("m_mip_filter: %s\n", m_params.m_mip_filter.c_str()); + + debug_printf("m_max_endpoint_clusters: %u\n", m_params.m_max_endpoint_clusters); + debug_printf("m_max_selector_clusters: %u\n", m_params.m_max_selector_clusters); + debug_printf("m_quality_level: %i\n", m_params.m_quality_level); + + debug_printf("m_tex_type: %u\n", m_params.m_tex_type); + debug_printf("m_userdata0: 0x%X, m_userdata1: 0x%X\n", m_params.m_userdata0, m_params.m_userdata1); + debug_printf("m_us_per_frame: %i (%f fps)\n", m_params.m_us_per_frame, m_params.m_us_per_frame ? 1.0f / (m_params.m_us_per_frame / 1000000.0f) : 0); + debug_printf("m_pack_uastc_flags: 0x%X\n", m_params.m_pack_uastc_flags); + + PRINT_BOOL_VALUE(m_rdo_uastc); + PRINT_FLOAT_VALUE(m_rdo_uastc_quality_scalar); + PRINT_INT_VALUE(m_rdo_uastc_dict_size); + PRINT_FLOAT_VALUE(m_rdo_uastc_max_allowed_rms_increase_ratio); + PRINT_FLOAT_VALUE(m_rdo_uastc_skip_block_rms_thresh); + PRINT_FLOAT_VALUE(m_rdo_uastc_max_smooth_block_error_scale); + PRINT_FLOAT_VALUE(m_rdo_uastc_smooth_block_max_std_dev); + PRINT_BOOL_VALUE(m_rdo_uastc_favor_simpler_modes_in_rdo_mode) + PRINT_BOOL_VALUE(m_rdo_uastc_multithreading); + + PRINT_INT_VALUE(m_resample_width); + PRINT_INT_VALUE(m_resample_height); + PRINT_FLOAT_VALUE(m_resample_factor); + + debug_printf("Has global codebooks: %u\n", m_params.m_pGlobal_codebooks ? 1 : 0); + if (m_params.m_pGlobal_codebooks) + { + debug_printf("Global codebook endpoints: %u selectors: %u\n", m_params.m_pGlobal_codebooks->get_endpoints().size(), m_params.m_pGlobal_codebooks->get_selectors().size()); + } + + PRINT_BOOL_VALUE(m_create_ktx2_file); + + debug_printf("KTX2 UASTC supercompression: %u\n", m_params.m_ktx2_uastc_supercompression); + debug_printf("KTX2 Zstd supercompression level: %i\n", (int)m_params.m_ktx2_zstd_supercompression_level); + debug_printf("KTX2 sRGB transfer func: %u\n", (int)m_params.m_ktx2_srgb_transfer_func); + debug_printf("Total KTX2 key values: %u\n", m_params.m_ktx2_key_values.size()); + for (uint32_t i = 0; i < m_params.m_ktx2_key_values.size(); i++) + { + debug_printf("Key: \"%s\"\n", m_params.m_ktx2_key_values[i].m_key.data()); + debug_printf("Value size: %u\n", m_params.m_ktx2_key_values[i].m_value.size()); + } + + PRINT_BOOL_VALUE(m_validate_output_data); + +#undef PRINT_BOOL_VALUE +#undef PRINT_INT_VALUE +#undef PRINT_UINT_VALUE +#undef PRINT_FLOAT_VALUE + } + + if ((m_params.m_read_source_images) && (!m_params.m_source_filenames.size())) + { + assert(0); + return false; + } + + if ((m_params.m_compute_stats) && (!m_params.m_validate_output_data)) + { + m_params.m_validate_output_data = true; + + debug_printf("Note: m_compute_stats is true, so forcing m_validate_output_data to true as well\n"); + } + + if ((m_params.m_use_opencl) && opencl_is_available() && !m_pOpenCL_context && !m_opencl_failed) + { + m_pOpenCL_context = opencl_create_context(); + if (!m_pOpenCL_context) + m_opencl_failed = true; + } + + return true; + } + + basis_compressor::error_code basis_compressor::process() + { + debug_printf("basis_compressor::process\n"); + + if (!read_source_images()) + return cECFailedReadingSourceImages; + + if (!validate_texture_type_constraints()) + return cECFailedValidating; + + if (m_params.m_create_ktx2_file) + { + if (!validate_ktx2_constraints()) + return cECFailedValidating; + } + + if (!extract_source_blocks()) + return cECFailedFrontEnd; + + if (m_params.m_uastc) + { + error_code ec = encode_slices_to_uastc(); + if (ec != cECSuccess) + return ec; + } + else + { + if (!process_frontend()) + return cECFailedFrontEnd; + + if (!extract_frontend_texture_data()) + return cECFailedFontendExtract; + + if (!process_backend()) + return cECFailedBackend; + } + + if (!create_basis_file_and_transcode()) + return cECFailedCreateBasisFile; + + if (m_params.m_create_ktx2_file) + { + if (!create_ktx2_file()) + return cECFailedCreateKTX2File; + } + + if (!write_output_files_and_compute_stats()) + return cECFailedWritingOutput; + + return cECSuccess; + } + + basis_compressor::error_code basis_compressor::encode_slices_to_uastc() + { + debug_printf("basis_compressor::encode_slices_to_uastc\n"); + + m_uastc_slice_textures.resize(m_slice_descs.size()); + for (uint32_t slice_index = 0; slice_index < m_slice_descs.size(); slice_index++) + m_uastc_slice_textures[slice_index].init(texture_format::cUASTC4x4, m_slice_descs[slice_index].m_orig_width, m_slice_descs[slice_index].m_orig_height); + + m_uastc_backend_output.m_tex_format = basist::basis_tex_format::cUASTC4x4; + m_uastc_backend_output.m_etc1s = false; + m_uastc_backend_output.m_slice_desc = m_slice_descs; + m_uastc_backend_output.m_slice_image_data.resize(m_slice_descs.size()); + m_uastc_backend_output.m_slice_image_crcs.resize(m_slice_descs.size()); + + for (uint32_t slice_index = 0; slice_index < m_slice_descs.size(); slice_index++) + { + gpu_image& tex = m_uastc_slice_textures[slice_index]; + basisu_backend_slice_desc& slice_desc = m_slice_descs[slice_index]; + (void)slice_desc; + + const uint32_t num_blocks_x = tex.get_blocks_x(); + const uint32_t num_blocks_y = tex.get_blocks_y(); + const uint32_t total_blocks = tex.get_total_blocks(); + const image& source_image = m_slice_images[slice_index]; + + std::atomic total_blocks_processed; + total_blocks_processed = 0; + + const uint32_t N = 256; + for (uint32_t block_index_iter = 0; block_index_iter < total_blocks; block_index_iter += N) + { + const uint32_t first_index = block_index_iter; + const uint32_t last_index = minimum(total_blocks, block_index_iter + N); + + // FIXME: This sucks, but we're having a stack size related problem with std::function with emscripten. +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job([this, first_index, last_index, num_blocks_x, num_blocks_y, total_blocks, &source_image, &tex, &total_blocks_processed] + { +#endif + BASISU_NOTE_UNUSED(num_blocks_y); + + uint32_t uastc_flags = m_params.m_pack_uastc_flags; + if ((m_params.m_rdo_uastc) && (m_params.m_rdo_uastc_favor_simpler_modes_in_rdo_mode)) + uastc_flags |= cPackUASTCFavorSimplerModes; + + for (uint32_t block_index = first_index; block_index < last_index; block_index++) + { + const uint32_t block_x = block_index % num_blocks_x; + const uint32_t block_y = block_index / num_blocks_x; + + color_rgba block_pixels[4][4]; + + source_image.extract_block_clamped((color_rgba*)block_pixels, block_x * 4, block_y * 4, 4, 4); + + basist::uastc_block& dest_block = *(basist::uastc_block*)tex.get_block_ptr(block_x, block_y); + + encode_uastc(&block_pixels[0][0].r, dest_block, uastc_flags); + + total_blocks_processed++; + + uint32_t val = total_blocks_processed; + if ((val & 16383) == 16383) + { + debug_printf("basis_compressor::encode_slices_to_uastc: %3.1f%% done\n", static_cast(val) * 100.0f / total_blocks); + } + + } + +#ifndef __EMSCRIPTEN__ + }); +#endif + + } // block_index_iter + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + + if (m_params.m_rdo_uastc) + { + uastc_rdo_params rdo_params; + rdo_params.m_lambda = m_params.m_rdo_uastc_quality_scalar; + rdo_params.m_max_allowed_rms_increase_ratio = m_params.m_rdo_uastc_max_allowed_rms_increase_ratio; + rdo_params.m_skip_block_rms_thresh = m_params.m_rdo_uastc_skip_block_rms_thresh; + rdo_params.m_lz_dict_size = m_params.m_rdo_uastc_dict_size; + rdo_params.m_smooth_block_max_error_scale = m_params.m_rdo_uastc_max_smooth_block_error_scale; + rdo_params.m_max_smooth_block_std_dev = m_params.m_rdo_uastc_smooth_block_max_std_dev; + + bool status = uastc_rdo(tex.get_total_blocks(), (basist::uastc_block*)tex.get_ptr(), + (const color_rgba *)m_source_blocks[slice_desc.m_first_block_index].m_pixels, rdo_params, m_params.m_pack_uastc_flags, m_params.m_rdo_uastc_multithreading ? m_params.m_pJob_pool : nullptr, + (m_params.m_rdo_uastc_multithreading && m_params.m_pJob_pool) ? basisu::minimum(4, (uint32_t)m_params.m_pJob_pool->get_total_threads()) : 0); + if (!status) + { + return cECFailedUASTCRDOPostProcess; + } + } + + m_uastc_backend_output.m_slice_image_data[slice_index].resize(tex.get_size_in_bytes()); + memcpy(&m_uastc_backend_output.m_slice_image_data[slice_index][0], tex.get_ptr(), tex.get_size_in_bytes()); + + m_uastc_backend_output.m_slice_image_crcs[slice_index] = basist::crc16(tex.get_ptr(), tex.get_size_in_bytes(), 0); + + } // slice_index + + return cECSuccess; + } + + bool basis_compressor::generate_mipmaps(const image &img, basisu::vector &mips, bool has_alpha) + { + debug_printf("basis_compressor::generate_mipmaps\n"); + + interval_timer tm; + tm.start(); + + uint32_t total_levels = 1; + uint32_t w = img.get_width(), h = img.get_height(); + while (maximum(w, h) > (uint32_t)m_params.m_mip_smallest_dimension) + { + w = maximum(w >> 1U, 1U); + h = maximum(h >> 1U, 1U); + total_levels++; + } + +#if BASISU_USE_STB_IMAGE_RESIZE_FOR_MIPMAP_GEN + // Requires stb_image_resize + stbir_filter filter = STBIR_FILTER_DEFAULT; + if (m_params.m_mip_filter == "box") + filter = STBIR_FILTER_BOX; + else if (m_params.m_mip_filter == "triangle") + filter = STBIR_FILTER_TRIANGLE; + else if (m_params.m_mip_filter == "cubic") + filter = STBIR_FILTER_CUBICBSPLINE; + else if (m_params.m_mip_filter == "catmull") + filter = STBIR_FILTER_CATMULLROM; + else if (m_params.m_mip_filter == "mitchell") + filter = STBIR_FILTER_MITCHELL; + + for (uint32_t level = 1; level < total_levels; level++) + { + const uint32_t level_width = maximum(1, img.get_width() >> level); + const uint32_t level_height = maximum(1, img.get_height() >> level); + + image &level_img = *enlarge_vector(mips, 1); + level_img.resize(level_width, level_height); + + int result = stbir_resize_uint8_generic( + (const uint8_t *)img.get_ptr(), img.get_width(), img.get_height(), img.get_pitch() * sizeof(color_rgba), + (uint8_t *)level_img.get_ptr(), level_img.get_width(), level_img.get_height(), level_img.get_pitch() * sizeof(color_rgba), + has_alpha ? 4 : 3, has_alpha ? 3 : STBIR_ALPHA_CHANNEL_NONE, m_params.m_mip_premultiplied ? STBIR_FLAG_ALPHA_PREMULTIPLIED : 0, + m_params.m_mip_wrapping ? STBIR_EDGE_WRAP : STBIR_EDGE_CLAMP, filter, m_params.m_mip_srgb ? STBIR_COLORSPACE_SRGB : STBIR_COLORSPACE_LINEAR, + nullptr); + + if (result == 0) + { + error_printf("basis_compressor::generate_mipmaps: stbir_resize_uint8_generic() failed!\n"); + return false; + } + + if (m_params.m_mip_renormalize) + level_img.renormalize_normal_map(); + } +#else + for (uint32_t level = 1; level < total_levels; level++) + { + const uint32_t level_width = maximum(1, img.get_width() >> level); + const uint32_t level_height = maximum(1, img.get_height() >> level); + + image& level_img = *enlarge_vector(mips, 1); + level_img.resize(level_width, level_height); + + const image* pSource_image = &img; + + if (m_params.m_mip_fast) + { + if (level > 1) + pSource_image = &mips[level - 1]; + } + + bool status = image_resample(*pSource_image, level_img, m_params.m_mip_srgb, m_params.m_mip_filter.c_str(), m_params.m_mip_scale, m_params.m_mip_wrapping, 0, has_alpha ? 4 : 3); + if (!status) + { + error_printf("basis_compressor::generate_mipmaps: image_resample() failed!\n"); + return false; + } + + if (m_params.m_mip_renormalize) + level_img.renormalize_normal_map(); + } +#endif + + if (m_params.m_debug) + debug_printf("Total mipmap generation time: %3.3f secs\n", tm.get_elapsed_secs()); + + return true; + } + + bool basis_compressor::read_source_images() + { + debug_printf("basis_compressor::read_source_images\n"); + + const uint32_t total_source_files = m_params.m_read_source_images ? (uint32_t)m_params.m_source_filenames.size() : (uint32_t)m_params.m_source_images.size(); + if (!total_source_files) + return false; + + m_stats.resize(0); + m_slice_descs.resize(0); + m_slice_images.resize(0); + + m_total_blocks = 0; + uint32_t total_macroblocks = 0; + + m_any_source_image_has_alpha = false; + + basisu::vector source_images; + basisu::vector source_filenames; + + // First load all source images, and determine if any have an alpha channel. + for (uint32_t source_file_index = 0; source_file_index < total_source_files; source_file_index++) + { + const char *pSource_filename = ""; + + image file_image; + + if (m_params.m_read_source_images) + { + pSource_filename = m_params.m_source_filenames[source_file_index].c_str(); + + // Load the source image + if (!load_image(pSource_filename, file_image)) + { + error_printf("Failed reading source image: %s\n", pSource_filename); + return false; + } + + if (m_params.m_status_output) + { + printf("Read source image \"%s\", %ux%u\n", pSource_filename, file_image.get_width(), file_image.get_height()); + } + + // Optionally load another image and put a grayscale version of it into the alpha channel. + if ((source_file_index < m_params.m_source_alpha_filenames.size()) && (m_params.m_source_alpha_filenames[source_file_index].size())) + { + const char *pSource_alpha_image = m_params.m_source_alpha_filenames[source_file_index].c_str(); + + image alpha_data; + + if (!load_image(pSource_alpha_image, alpha_data)) + { + error_printf("Failed reading source image: %s\n", pSource_alpha_image); + return false; + } + + printf("Read source alpha image \"%s\", %ux%u\n", pSource_alpha_image, alpha_data.get_width(), alpha_data.get_height()); + + alpha_data.crop(file_image.get_width(), file_image.get_height()); + + for (uint32_t y = 0; y < file_image.get_height(); y++) + for (uint32_t x = 0; x < file_image.get_width(); x++) + file_image(x, y).a = (uint8_t)alpha_data(x, y).get_709_luma(); + } + } + else + { + file_image = m_params.m_source_images[source_file_index]; + } + + if (m_params.m_renormalize) + file_image.renormalize_normal_map(); + + bool alpha_swizzled = false; + if (m_params.m_swizzle[0] != 0 || + m_params.m_swizzle[1] != 1 || + m_params.m_swizzle[2] != 2 || + m_params.m_swizzle[3] != 3) + { + // Used for XY normal maps in RG - puts X in color, Y in alpha + for (uint32_t y = 0; y < file_image.get_height(); y++) + for (uint32_t x = 0; x < file_image.get_width(); x++) + { + const color_rgba &c = file_image(x, y); + file_image(x, y).set_noclamp_rgba(c[m_params.m_swizzle[0]], c[m_params.m_swizzle[1]], c[m_params.m_swizzle[2]], c[m_params.m_swizzle[3]]); + } + alpha_swizzled = m_params.m_swizzle[3] != 3; + } + + bool has_alpha = false; + if (m_params.m_force_alpha || alpha_swizzled) + has_alpha = true; + else if (!m_params.m_check_for_alpha) + file_image.set_alpha(255); + else if (file_image.has_alpha()) + has_alpha = true; + + if (has_alpha) + m_any_source_image_has_alpha = true; + + debug_printf("Source image index %u filename %s %ux%u has alpha: %u\n", source_file_index, pSource_filename, file_image.get_width(), file_image.get_height(), has_alpha); + + if (m_params.m_y_flip) + file_image.flip_y(); + +#if DEBUG_EXTRACT_SINGLE_BLOCK + image block_image(4, 4); + const uint32_t block_x = 0; + const uint32_t block_y = 0; + block_image.blit(block_x * 4, block_y * 4, 4, 4, 0, 0, file_image, 0); + file_image = block_image; +#endif + +#if DEBUG_CROP_TEXTURE_TO_64x64 + file_image.resize(64, 64); +#endif + + if (m_params.m_resample_width > 0 && m_params.m_resample_height > 0) + { + int new_width = basisu::minimum(m_params.m_resample_width, BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION); + int new_height = basisu::minimum(m_params.m_resample_height, BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION); + + debug_printf("Resampling to %ix%i\n", new_width, new_height); + + // TODO: A box filter - kaiser looks too sharp on video. Let the caller control this. + image temp_img(new_width, new_height); + image_resample(file_image, temp_img, m_params.m_perceptual, "box"); // "kaiser"); + temp_img.swap(file_image); + } + else if (m_params.m_resample_factor > 0.0f) + { + int new_width = basisu::minimum(basisu::maximum(1, (int)ceilf(file_image.get_width() * m_params.m_resample_factor)), BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION); + int new_height = basisu::minimum(basisu::maximum(1, (int)ceilf(file_image.get_height() * m_params.m_resample_factor)), BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION); + + debug_printf("Resampling to %ix%i\n", new_width, new_height); + + // TODO: A box filter - kaiser looks too sharp on video. Let the caller control this. + image temp_img(new_width, new_height); + image_resample(file_image, temp_img, m_params.m_perceptual, "box"); // "kaiser"); + temp_img.swap(file_image); + } + + if ((!file_image.get_width()) || (!file_image.get_height())) + { + error_printf("basis_compressor::read_source_images: Source image has a zero width and/or height!\n"); + return false; + } + + if ((file_image.get_width() > BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION) || (file_image.get_height() > BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION)) + { + error_printf("basis_compressor::read_source_images: Source image \"%s\" is too large!\n", pSource_filename); + return false; + } + + source_images.enlarge(1)->swap(file_image); + source_filenames.push_back(pSource_filename); + } + + // Check if the caller has generated their own mipmaps. + if (m_params.m_source_mipmap_images.size()) + { + // Make sure they've passed us enough mipmap chains. + if ((m_params.m_source_images.size() != m_params.m_source_mipmap_images.size()) || (total_source_files != m_params.m_source_images.size())) + { + error_printf("basis_compressor::read_source_images(): m_params.m_source_mipmap_images.size() must equal m_params.m_source_images.size()!\n"); + return false; + } + + // Check if any of the user-supplied mipmap levels has alpha. + // We're assuming the user has already preswizzled their mipmap source images. + if (!m_any_source_image_has_alpha) + { + for (uint32_t source_file_index = 0; source_file_index < total_source_files; source_file_index++) + { + for (uint32_t mip_index = 0; mip_index < m_params.m_source_mipmap_images[source_file_index].size(); mip_index++) + { + const image& mip_img = m_params.m_source_mipmap_images[source_file_index][mip_index]; + + if (mip_img.has_alpha()) + { + m_any_source_image_has_alpha = true; + break; + } + } + + if (m_any_source_image_has_alpha) + break; + } + } + } + + debug_printf("Any source image has alpha: %u\n", m_any_source_image_has_alpha); + + for (uint32_t source_file_index = 0; source_file_index < total_source_files; source_file_index++) + { + const std::string &source_filename = source_filenames[source_file_index]; + + // Now, for each source image, create the slices corresponding to that image. + basisu::vector slices; + + slices.reserve(32); + + // The first (largest) mipmap level. + image& file_image = source_images[source_file_index]; + + // Reserve a slot for mip0. + slices.resize(1); + + if (m_params.m_source_mipmap_images.size()) + { + // User-provided mipmaps for each layer or image in the texture array. + for (uint32_t mip_index = 0; mip_index < m_params.m_source_mipmap_images[source_file_index].size(); mip_index++) + { + image& mip_img = m_params.m_source_mipmap_images[source_file_index][mip_index]; + + if (m_params.m_swizzle[0] != 0 || + m_params.m_swizzle[1] != 1 || + m_params.m_swizzle[2] != 2 || + m_params.m_swizzle[3] != 3) + { + // Used for XY normal maps in RG - puts X in color, Y in alpha + for (uint32_t y = 0; y < mip_img.get_height(); y++) + for (uint32_t x = 0; x < mip_img.get_width(); x++) + { + const color_rgba &c = mip_img(x, y); + mip_img(x, y).set_noclamp_rgba(c[m_params.m_swizzle[0]], c[m_params.m_swizzle[1]], c[m_params.m_swizzle[2]], c[m_params.m_swizzle[3]]); + } + } + + slices.push_back(mip_img); + } + } + else if (m_params.m_mip_gen) + { + // Automatically generate mipmaps. + if (!generate_mipmaps(file_image, slices, m_any_source_image_has_alpha)) + return false; + } + + // Swap in the largest mipmap level here to avoid copying it, because generate_mips() will change the array. + // NOTE: file_image is now blank. + slices[0].swap(file_image); + + uint_vec mip_indices(slices.size()); + for (uint32_t i = 0; i < slices.size(); i++) + mip_indices[i] = i; + + if ((m_any_source_image_has_alpha) && (!m_params.m_uastc)) + { + // For ETC1S, if source has alpha, then even mips will have RGB, and odd mips will have alpha in RGB. + basisu::vector alpha_slices; + uint_vec new_mip_indices; + + alpha_slices.reserve(slices.size() * 2); + + for (uint32_t i = 0; i < slices.size(); i++) + { + image lvl_rgb(slices[i]); + image lvl_a(lvl_rgb); + + for (uint32_t y = 0; y < lvl_a.get_height(); y++) + { + for (uint32_t x = 0; x < lvl_a.get_width(); x++) + { + uint8_t a = lvl_a(x, y).a; + lvl_a(x, y).set_noclamp_rgba(a, a, a, 255); + } + } + + lvl_rgb.set_alpha(255); + + alpha_slices.push_back(lvl_rgb); + new_mip_indices.push_back(i); + + alpha_slices.push_back(lvl_a); + new_mip_indices.push_back(i); + } + + slices.swap(alpha_slices); + mip_indices.swap(new_mip_indices); + } + + assert(slices.size() == mip_indices.size()); + + for (uint32_t slice_index = 0; slice_index < slices.size(); slice_index++) + { + image& slice_image = slices[slice_index]; + const uint32_t orig_width = slice_image.get_width(); + const uint32_t orig_height = slice_image.get_height(); + + bool is_alpha_slice = false; + if (m_any_source_image_has_alpha) + { + if (m_params.m_uastc) + { + is_alpha_slice = slice_image.has_alpha(); + } + else + { + is_alpha_slice = (slice_index & 1) != 0; + } + } + + // Enlarge the source image to 4x4 block boundaries, duplicating edge pixels if necessary to avoid introducing extra colors into blocks. + slice_image.crop_dup_borders(slice_image.get_block_width(4) * 4, slice_image.get_block_height(4) * 4); + + if (m_params.m_debug_images) + { + save_png(string_format("basis_debug_source_image_%u_slice_%u.png", source_file_index, slice_index).c_str(), slice_image); + } + + const uint32_t dest_image_index = m_slice_images.size(); + + enlarge_vector(m_stats, 1); + enlarge_vector(m_slice_images, 1); + enlarge_vector(m_slice_descs, 1); + + m_stats[dest_image_index].m_filename = source_filename.c_str(); + m_stats[dest_image_index].m_width = orig_width; + m_stats[dest_image_index].m_height = orig_height; + + debug_printf("****** Slice %u: mip %u, alpha_slice: %u, filename: \"%s\", original: %ux%u actual: %ux%u\n", m_slice_descs.size() - 1, mip_indices[slice_index], is_alpha_slice, source_filename.c_str(), orig_width, orig_height, slice_image.get_width(), slice_image.get_height()); + + basisu_backend_slice_desc &slice_desc = m_slice_descs[dest_image_index]; + + slice_desc.m_first_block_index = m_total_blocks; + + slice_desc.m_orig_width = orig_width; + slice_desc.m_orig_height = orig_height; + + slice_desc.m_width = slice_image.get_width(); + slice_desc.m_height = slice_image.get_height(); + + slice_desc.m_num_blocks_x = slice_image.get_block_width(4); + slice_desc.m_num_blocks_y = slice_image.get_block_height(4); + + slice_desc.m_num_macroblocks_x = (slice_desc.m_num_blocks_x + 1) >> 1; + slice_desc.m_num_macroblocks_y = (slice_desc.m_num_blocks_y + 1) >> 1; + + slice_desc.m_source_file_index = source_file_index; + + slice_desc.m_mip_index = mip_indices[slice_index]; + + slice_desc.m_alpha = is_alpha_slice; + slice_desc.m_iframe = false; + if (m_params.m_tex_type == basist::cBASISTexTypeVideoFrames) + { + slice_desc.m_iframe = (source_file_index == 0); + } + + m_total_blocks += slice_desc.m_num_blocks_x * slice_desc.m_num_blocks_y; + total_macroblocks += slice_desc.m_num_macroblocks_x * slice_desc.m_num_macroblocks_y; + + // Finally, swap in the slice's image to avoid copying it. + // NOTE: slice_image is now blank. + m_slice_images[dest_image_index].swap(slice_image); + + } // slice_index + + } // source_file_index + + debug_printf("Total blocks: %u, Total macroblocks: %u\n", m_total_blocks, total_macroblocks); + + // Make sure we don't have too many slices + if (m_slice_descs.size() > BASISU_MAX_SLICES) + { + error_printf("Too many slices!\n"); + return false; + } + + // Basic sanity check on the slices + for (uint32_t i = 1; i < m_slice_descs.size(); i++) + { + const basisu_backend_slice_desc &prev_slice_desc = m_slice_descs[i - 1]; + const basisu_backend_slice_desc &slice_desc = m_slice_descs[i]; + + // Make sure images are in order + int image_delta = (int)slice_desc.m_source_file_index - (int)prev_slice_desc.m_source_file_index; + if (image_delta > 1) + return false; + + // Make sure mipmap levels are in order + if (!image_delta) + { + int level_delta = (int)slice_desc.m_mip_index - (int)prev_slice_desc.m_mip_index; + if (level_delta > 1) + return false; + } + } + + if (m_params.m_status_output) + { + printf("Total basis file slices: %u\n", (uint32_t)m_slice_descs.size()); + } + + for (uint32_t i = 0; i < m_slice_descs.size(); i++) + { + const basisu_backend_slice_desc &slice_desc = m_slice_descs[i]; + + if (m_params.m_status_output) + { + printf("Slice: %u, alpha: %u, orig width/height: %ux%u, width/height: %ux%u, first_block: %u, image_index: %u, mip_level: %u, iframe: %u\n", + i, slice_desc.m_alpha, slice_desc.m_orig_width, slice_desc.m_orig_height, slice_desc.m_width, slice_desc.m_height, slice_desc.m_first_block_index, slice_desc.m_source_file_index, slice_desc.m_mip_index, slice_desc.m_iframe); + } + + if (m_any_source_image_has_alpha) + { + if (!m_params.m_uastc) + { + // For ETC1S, alpha slices must be at odd slice indices. + if (slice_desc.m_alpha) + { + if ((i & 1) == 0) + return false; + + const basisu_backend_slice_desc& prev_slice_desc = m_slice_descs[i - 1]; + + // Make sure previous slice has this image's color data + if (prev_slice_desc.m_source_file_index != slice_desc.m_source_file_index) + return false; + if (prev_slice_desc.m_alpha) + return false; + if (prev_slice_desc.m_mip_index != slice_desc.m_mip_index) + return false; + if (prev_slice_desc.m_num_blocks_x != slice_desc.m_num_blocks_x) + return false; + if (prev_slice_desc.m_num_blocks_y != slice_desc.m_num_blocks_y) + return false; + } + else if (i & 1) + return false; + } + } + else if (slice_desc.m_alpha) + { + return false; + } + + if ((slice_desc.m_orig_width > slice_desc.m_width) || (slice_desc.m_orig_height > slice_desc.m_height)) + return false; + if ((slice_desc.m_source_file_index == 0) && (m_params.m_tex_type == basist::cBASISTexTypeVideoFrames)) + { + if (!slice_desc.m_iframe) + return false; + } + } + + return true; + } + + // Do some basic validation for 2D arrays, cubemaps, video, and volumes. + bool basis_compressor::validate_texture_type_constraints() + { + debug_printf("basis_compressor::validate_texture_type_constraints\n"); + + // In 2D mode anything goes (each image may have a different resolution and # of mipmap levels). + if (m_params.m_tex_type == basist::cBASISTexType2D) + return true; + + uint32_t total_basis_images = 0; + + for (uint32_t slice_index = 0; slice_index < m_slice_images.size(); slice_index++) + { + const basisu_backend_slice_desc &slice_desc = m_slice_descs[slice_index]; + + total_basis_images = maximum(total_basis_images, slice_desc.m_source_file_index + 1); + } + + if (m_params.m_tex_type == basist::cBASISTexTypeCubemapArray) + { + // For cubemaps, validate that the total # of Basis images is a multiple of 6. + if ((total_basis_images % 6) != 0) + { + error_printf("basis_compressor::validate_texture_type_constraints: For cubemaps the total number of input images is not a multiple of 6!\n"); + return false; + } + } + + // Now validate that all the mip0's have the same dimensions, and that each image has the same # of mipmap levels. + uint_vec image_mipmap_levels(total_basis_images); + + int width = -1, height = -1; + for (uint32_t slice_index = 0; slice_index < m_slice_images.size(); slice_index++) + { + const basisu_backend_slice_desc &slice_desc = m_slice_descs[slice_index]; + + image_mipmap_levels[slice_desc.m_source_file_index] = maximum(image_mipmap_levels[slice_desc.m_source_file_index], slice_desc.m_mip_index + 1); + + if (slice_desc.m_mip_index != 0) + continue; + + if (width < 0) + { + width = slice_desc.m_orig_width; + height = slice_desc.m_orig_height; + } + else if ((width != (int)slice_desc.m_orig_width) || (height != (int)slice_desc.m_orig_height)) + { + error_printf("basis_compressor::validate_texture_type_constraints: The source image resolutions are not all equal!\n"); + return false; + } + } + + for (size_t i = 1; i < image_mipmap_levels.size(); i++) + { + if (image_mipmap_levels[0] != image_mipmap_levels[i]) + { + error_printf("basis_compressor::validate_texture_type_constraints: Each image must have the same number of mipmap levels!\n"); + return false; + } + } + + return true; + } + + bool basis_compressor::extract_source_blocks() + { + debug_printf("basis_compressor::extract_source_blocks\n"); + + m_source_blocks.resize(m_total_blocks); + + for (uint32_t slice_index = 0; slice_index < m_slice_images.size(); slice_index++) + { + const basisu_backend_slice_desc& slice_desc = m_slice_descs[slice_index]; + + const uint32_t num_blocks_x = slice_desc.m_num_blocks_x; + const uint32_t num_blocks_y = slice_desc.m_num_blocks_y; + + const image& source_image = m_slice_images[slice_index]; + + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + source_image.extract_block_clamped(m_source_blocks[slice_desc.m_first_block_index + block_x + block_y * num_blocks_x].get_ptr(), block_x * 4, block_y * 4, 4, 4); + } + + return true; + } + + bool basis_compressor::process_frontend() + { + debug_printf("basis_compressor::process_frontend\n"); + +#if 0 + // TODO + basis_etc1_pack_params pack_params; + pack_params.m_quality = cETCQualityMedium; + pack_params.m_perceptual = m_params.m_perceptual; + pack_params.m_use_color4 = false; + + pack_etc1_block_context pack_context; + + std::unordered_set endpoint_hash; + std::unordered_set selector_hash; + + for (uint32_t i = 0; i < m_source_blocks.size(); i++) + { + etc_block blk; + pack_etc1_block(blk, m_source_blocks[i].get_ptr(), pack_params, pack_context); + + const color_rgba c0(blk.get_block_color(0, false)); + endpoint_hash.insert((c0.r | (c0.g << 5) | (c0.b << 10)) | (blk.get_inten_table(0) << 16)); + + const color_rgba c1(blk.get_block_color(1, false)); + endpoint_hash.insert((c1.r | (c1.g << 5) | (c1.b << 10)) | (blk.get_inten_table(1) << 16)); + + selector_hash.insert(blk.get_raw_selector_bits()); + } + + const uint32_t total_unique_endpoints = (uint32_t)endpoint_hash.size(); + const uint32_t total_unique_selectors = (uint32_t)selector_hash.size(); + + if (m_params.m_debug) + { + debug_printf("Unique endpoints: %u, unique selectors: %u\n", total_unique_endpoints, total_unique_selectors); + } +#endif + + const double total_texels = m_total_blocks * 16.0f; + + int endpoint_clusters = m_params.m_max_endpoint_clusters; + int selector_clusters = m_params.m_max_selector_clusters; + + if (endpoint_clusters > basisu_frontend::cMaxEndpointClusters) + { + error_printf("Too many endpoint clusters! (%u but max is %u)\n", endpoint_clusters, basisu_frontend::cMaxEndpointClusters); + return false; + } + if (selector_clusters > basisu_frontend::cMaxSelectorClusters) + { + error_printf("Too many selector clusters! (%u but max is %u)\n", selector_clusters, basisu_frontend::cMaxSelectorClusters); + return false; + } + + if (m_params.m_quality_level != -1) + { + const float quality = saturate(m_params.m_quality_level / 255.0f); + + const float bits_per_endpoint_cluster = 14.0f; + const float max_desired_endpoint_cluster_bits_per_texel = 1.0f; // .15f + int max_endpoints = static_cast((max_desired_endpoint_cluster_bits_per_texel * total_texels) / bits_per_endpoint_cluster); + + const float mid = 128.0f / 255.0f; + + float color_endpoint_quality = quality; + + const float endpoint_split_point = 0.5f; + + // In v1.2 and in previous versions, the endpoint codebook size at quality 128 was 3072. This wasn't quite large enough. + const int ENDPOINT_CODEBOOK_MID_QUALITY_CODEBOOK_SIZE = 4800; + const int MAX_ENDPOINT_CODEBOOK_SIZE = 8192; + + if (color_endpoint_quality <= mid) + { + color_endpoint_quality = lerp(0.0f, endpoint_split_point, powf(color_endpoint_quality / mid, .65f)); + + max_endpoints = clamp(max_endpoints, 256, ENDPOINT_CODEBOOK_MID_QUALITY_CODEBOOK_SIZE); + max_endpoints = minimum(max_endpoints, m_total_blocks); + + if (max_endpoints < 64) + max_endpoints = 64; + endpoint_clusters = clamp((uint32_t)(.5f + lerp(32, static_cast(max_endpoints), color_endpoint_quality)), 32, basisu_frontend::cMaxEndpointClusters); + } + else + { + color_endpoint_quality = powf((color_endpoint_quality - mid) / (1.0f - mid), 1.6f); + + max_endpoints = clamp(max_endpoints, 256, MAX_ENDPOINT_CODEBOOK_SIZE); + max_endpoints = minimum(max_endpoints, m_total_blocks); + + if (max_endpoints < ENDPOINT_CODEBOOK_MID_QUALITY_CODEBOOK_SIZE) + max_endpoints = ENDPOINT_CODEBOOK_MID_QUALITY_CODEBOOK_SIZE; + endpoint_clusters = clamp((uint32_t)(.5f + lerp(ENDPOINT_CODEBOOK_MID_QUALITY_CODEBOOK_SIZE, static_cast(max_endpoints), color_endpoint_quality)), 32, basisu_frontend::cMaxEndpointClusters); + } + + float bits_per_selector_cluster = 14.0f; + + const float max_desired_selector_cluster_bits_per_texel = 1.0f; // .15f + int max_selectors = static_cast((max_desired_selector_cluster_bits_per_texel * total_texels) / bits_per_selector_cluster); + max_selectors = clamp(max_selectors, 256, basisu_frontend::cMaxSelectorClusters); + max_selectors = minimum(max_selectors, m_total_blocks); + + float color_selector_quality = quality; + //color_selector_quality = powf(color_selector_quality, 1.65f); + color_selector_quality = powf(color_selector_quality, 2.62f); + + if (max_selectors < 96) + max_selectors = 96; + selector_clusters = clamp((uint32_t)(.5f + lerp(96, static_cast(max_selectors), color_selector_quality)), 8, basisu_frontend::cMaxSelectorClusters); + + debug_printf("Max endpoints: %u, max selectors: %u\n", endpoint_clusters, selector_clusters); + + if (m_params.m_quality_level >= 223) + { + if (!m_params.m_selector_rdo_thresh.was_changed()) + { + if (!m_params.m_endpoint_rdo_thresh.was_changed()) + m_params.m_endpoint_rdo_thresh *= .25f; + + if (!m_params.m_selector_rdo_thresh.was_changed()) + m_params.m_selector_rdo_thresh *= .25f; + } + } + else if (m_params.m_quality_level >= 192) + { + if (!m_params.m_endpoint_rdo_thresh.was_changed()) + m_params.m_endpoint_rdo_thresh *= .5f; + + if (!m_params.m_selector_rdo_thresh.was_changed()) + m_params.m_selector_rdo_thresh *= .5f; + } + else if (m_params.m_quality_level >= 160) + { + if (!m_params.m_endpoint_rdo_thresh.was_changed()) + m_params.m_endpoint_rdo_thresh *= .75f; + + if (!m_params.m_selector_rdo_thresh.was_changed()) + m_params.m_selector_rdo_thresh *= .75f; + } + else if (m_params.m_quality_level >= 129) + { + float l = (quality - 129 / 255.0f) / ((160 - 129) / 255.0f); + + if (!m_params.m_endpoint_rdo_thresh.was_changed()) + m_params.m_endpoint_rdo_thresh *= lerp(1.0f, .75f, l); + + if (!m_params.m_selector_rdo_thresh.was_changed()) + m_params.m_selector_rdo_thresh *= lerp(1.0f, .75f, l); + } + } + + basisu_frontend::params p; + p.m_num_source_blocks = m_total_blocks; + p.m_pSource_blocks = &m_source_blocks[0]; + p.m_max_endpoint_clusters = endpoint_clusters; + p.m_max_selector_clusters = selector_clusters; + p.m_perceptual = m_params.m_perceptual; + p.m_debug_stats = m_params.m_debug; + p.m_debug_images = m_params.m_debug_images; + p.m_compression_level = m_params.m_compression_level; + p.m_tex_type = m_params.m_tex_type; + p.m_multithreaded = m_params.m_multithreading; + p.m_disable_hierarchical_endpoint_codebooks = m_params.m_disable_hierarchical_endpoint_codebooks; + p.m_validate = m_params.m_validate_etc1s; + p.m_pJob_pool = m_params.m_pJob_pool; + p.m_pGlobal_codebooks = m_params.m_pGlobal_codebooks; + + // Don't keep trying to use OpenCL if it ever fails. + p.m_pOpenCL_context = !m_opencl_failed ? m_pOpenCL_context : nullptr; + + if (!m_frontend.init(p)) + { + error_printf("basisu_frontend::init() failed!\n"); + return false; + } + + m_frontend.compress(); + + if (m_frontend.get_opencl_failed()) + m_opencl_failed = true; + + if (m_params.m_debug_images) + { + for (uint32_t i = 0; i < m_slice_descs.size(); i++) + { + char filename[1024]; +#ifdef _WIN32 + sprintf_s(filename, sizeof(filename), "rdo_frontend_output_output_blocks_%u.png", i); +#else + snprintf(filename, sizeof(filename), "rdo_frontend_output_output_blocks_%u.png", i); +#endif + m_frontend.dump_debug_image(filename, m_slice_descs[i].m_first_block_index, m_slice_descs[i].m_num_blocks_x, m_slice_descs[i].m_num_blocks_y, true); + +#ifdef _WIN32 + sprintf_s(filename, sizeof(filename), "rdo_frontend_output_api_%u.png", i); +#else + snprintf(filename, sizeof(filename), "rdo_frontend_output_api_%u.png", i); +#endif + m_frontend.dump_debug_image(filename, m_slice_descs[i].m_first_block_index, m_slice_descs[i].m_num_blocks_x, m_slice_descs[i].m_num_blocks_y, false); + } + } + + return true; + } + + bool basis_compressor::extract_frontend_texture_data() + { + if (!m_params.m_compute_stats) + return true; + + debug_printf("basis_compressor::extract_frontend_texture_data\n"); + + m_frontend_output_textures.resize(m_slice_descs.size()); + m_best_etc1s_images.resize(m_slice_descs.size()); + m_best_etc1s_images_unpacked.resize(m_slice_descs.size()); + + for (uint32_t i = 0; i < m_slice_descs.size(); i++) + { + const basisu_backend_slice_desc &slice_desc = m_slice_descs[i]; + + const uint32_t num_blocks_x = slice_desc.m_num_blocks_x; + const uint32_t num_blocks_y = slice_desc.m_num_blocks_y; + + const uint32_t width = num_blocks_x * 4; + const uint32_t height = num_blocks_y * 4; + + m_frontend_output_textures[i].init(texture_format::cETC1, width, height); + + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + memcpy(m_frontend_output_textures[i].get_block_ptr(block_x, block_y, 0), &m_frontend.get_output_block(slice_desc.m_first_block_index + block_x + block_y * num_blocks_x), sizeof(etc_block)); + +#if 0 + if (m_params.m_debug_images) + { + char filename[1024]; + sprintf_s(filename, sizeof(filename), "rdo_etc_frontend_%u_", i); + write_etc1_vis_images(m_frontend_output_textures[i], filename); + } +#endif + + m_best_etc1s_images[i].init(texture_format::cETC1, width, height); + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + memcpy(m_best_etc1s_images[i].get_block_ptr(block_x, block_y, 0), &m_frontend.get_etc1s_block(slice_desc.m_first_block_index + block_x + block_y * num_blocks_x), sizeof(etc_block)); + + m_best_etc1s_images[i].unpack(m_best_etc1s_images_unpacked[i]); + } + + return true; + } + + bool basis_compressor::process_backend() + { + debug_printf("basis_compressor::process_backend\n"); + + basisu_backend_params backend_params; + backend_params.m_debug = m_params.m_debug; + backend_params.m_debug_images = m_params.m_debug_images; + backend_params.m_etc1s = true; + backend_params.m_compression_level = m_params.m_compression_level; + + if (!m_params.m_no_endpoint_rdo) + backend_params.m_endpoint_rdo_quality_thresh = m_params.m_endpoint_rdo_thresh; + + if (!m_params.m_no_selector_rdo) + backend_params.m_selector_rdo_quality_thresh = m_params.m_selector_rdo_thresh; + + backend_params.m_used_global_codebooks = m_frontend.get_params().m_pGlobal_codebooks != nullptr; + backend_params.m_validate = m_params.m_validate_output_data; + + m_backend.init(&m_frontend, backend_params, m_slice_descs); + uint32_t total_packed_bytes = m_backend.encode(); + + if (!total_packed_bytes) + { + error_printf("basis_compressor::encode() failed!\n"); + return false; + } + + debug_printf("Total packed bytes (estimated): %u\n", total_packed_bytes); + + return true; + } + + bool basis_compressor::create_basis_file_and_transcode() + { + debug_printf("basis_compressor::create_basis_file_and_transcode\n"); + + const basisu_backend_output& encoded_output = m_params.m_uastc ? m_uastc_backend_output : m_backend.get_output(); + + if (!m_basis_file.init(encoded_output, m_params.m_tex_type, m_params.m_userdata0, m_params.m_userdata1, m_params.m_y_flip, m_params.m_us_per_frame)) + { + error_printf("basis_compressor::create_basis_file_and_transcode: basisu_backend:init() failed!\n"); + return false; + } + + const uint8_vec &comp_data = m_basis_file.get_compressed_data(); + + m_output_basis_file = comp_data; + + uint32_t total_orig_pixels = 0, total_orig_texels = 0; + for (uint32_t i = 0; i < m_slice_descs.size(); i++) + { + const basisu_backend_slice_desc& slice_desc = m_slice_descs[i]; + + total_orig_pixels += slice_desc.m_orig_width * slice_desc.m_orig_height; + } + + m_basis_file_size = (uint32_t)comp_data.size(); + m_basis_bits_per_texel = total_orig_texels ? (comp_data.size() * 8.0f) / total_orig_texels : 0; + + debug_printf("Total .basis output file size: %u, %3.3f bits/texel\n", comp_data.size(), comp_data.size() * 8.0f / total_orig_pixels); + + if (m_params.m_validate_output_data) + { + interval_timer tm; + tm.start(); + + basist::basisu_transcoder_init(); + + debug_printf("basist::basisu_transcoder_init: Took %f ms\n", tm.get_elapsed_ms()); + + // Verify the compressed data by transcoding it to ASTC (or ETC1)/BC7 and validating the CRC's. + basist::basisu_transcoder decoder; + if (!decoder.validate_file_checksums(&comp_data[0], (uint32_t)comp_data.size(), true)) + { + error_printf("decoder.validate_file_checksums() failed!\n"); + return false; + } + + m_decoded_output_textures.resize(m_slice_descs.size()); + m_decoded_output_textures_unpacked.resize(m_slice_descs.size()); + + m_decoded_output_textures_bc7.resize(m_slice_descs.size()); + m_decoded_output_textures_unpacked_bc7.resize(m_slice_descs.size()); + + tm.start(); + if (m_params.m_pGlobal_codebooks) + { + decoder.set_global_codebooks(m_params.m_pGlobal_codebooks); + } + + if (!decoder.start_transcoding(&comp_data[0], (uint32_t)comp_data.size())) + { + error_printf("decoder.start_transcoding() failed!\n"); + return false; + } + + double start_transcoding_time = tm.get_elapsed_secs(); + + debug_printf("basisu_compressor::start_transcoding() took %3.3fms\n", start_transcoding_time * 1000.0f); + + double total_time_etc1s_or_astc = 0; + + for (uint32_t i = 0; i < m_slice_descs.size(); i++) + { + gpu_image decoded_texture; + decoded_texture.init(m_params.m_uastc ? texture_format::cUASTC4x4 : texture_format::cETC1, m_slice_descs[i].m_width, m_slice_descs[i].m_height); + + tm.start(); + + basist::block_format format = m_params.m_uastc ? basist::block_format::cUASTC_4x4 : basist::block_format::cETC1; + uint32_t bytes_per_block = m_params.m_uastc ? 16 : 8; + + if (!decoder.transcode_slice(&comp_data[0], (uint32_t)comp_data.size(), i, + reinterpret_cast(decoded_texture.get_ptr()), m_slice_descs[i].m_num_blocks_x * m_slice_descs[i].m_num_blocks_y, format, bytes_per_block)) + { + error_printf("Transcoding failed on slice %u!\n", i); + return false; + } + + total_time_etc1s_or_astc += tm.get_elapsed_secs(); + + if (encoded_output.m_tex_format == basist::basis_tex_format::cETC1S) + { + uint32_t image_crc16 = basist::crc16(decoded_texture.get_ptr(), decoded_texture.get_size_in_bytes(), 0); + if (image_crc16 != encoded_output.m_slice_image_crcs[i]) + { + error_printf("Decoded image data CRC check failed on slice %u!\n", i); + return false; + } + debug_printf("Decoded image data CRC check succeeded on slice %i\n", i); + } + + m_decoded_output_textures[i] = decoded_texture; + } + + double total_time_bc7 = 0; + + if (basist::basis_is_format_supported(basist::transcoder_texture_format::cTFBC7_RGBA, basist::basis_tex_format::cUASTC4x4) && + basist::basis_is_format_supported(basist::transcoder_texture_format::cTFBC7_RGBA, basist::basis_tex_format::cETC1S)) + { + for (uint32_t i = 0; i < m_slice_descs.size(); i++) + { + gpu_image decoded_texture; + decoded_texture.init(texture_format::cBC7, m_slice_descs[i].m_width, m_slice_descs[i].m_height); + + tm.start(); + + if (!decoder.transcode_slice(&comp_data[0], (uint32_t)comp_data.size(), i, + reinterpret_cast(decoded_texture.get_ptr()), m_slice_descs[i].m_num_blocks_x * m_slice_descs[i].m_num_blocks_y, basist::block_format::cBC7, 16)) + { + error_printf("Transcoding failed to BC7 on slice %u!\n", i); + return false; + } + + total_time_bc7 += tm.get_elapsed_secs(); + + m_decoded_output_textures_bc7[i] = decoded_texture; + } + } + + for (uint32_t i = 0; i < m_slice_descs.size(); i++) + { + m_decoded_output_textures[i].unpack(m_decoded_output_textures_unpacked[i]); + + if (m_decoded_output_textures_bc7[i].get_pixel_width()) + m_decoded_output_textures_bc7[i].unpack(m_decoded_output_textures_unpacked_bc7[i]); + } + + debug_printf("Transcoded to %s in %3.3fms, %f texels/sec\n", m_params.m_uastc ? "ASTC" : "ETC1", total_time_etc1s_or_astc * 1000.0f, total_orig_pixels / total_time_etc1s_or_astc); + + if (total_time_bc7 != 0) + debug_printf("Transcoded to BC7 in %3.3fms, %f texels/sec\n", total_time_bc7 * 1000.0f, total_orig_pixels / total_time_bc7); + + for (uint32_t slice_index = 0; slice_index < m_slice_descs.size(); slice_index++) + { + const basisu_backend_slice_desc& slice_desc = m_slice_descs[slice_index]; + + const uint32_t total_blocks = slice_desc.m_num_blocks_x * slice_desc.m_num_blocks_y; + BASISU_NOTE_UNUSED(total_blocks); + + assert(m_decoded_output_textures[slice_index].get_total_blocks() == total_blocks); + } + } // if (m_params.m_validate_output_data) + + return true; + } + + bool basis_compressor::write_output_files_and_compute_stats() + { + debug_printf("basis_compressor::write_output_files_and_compute_stats\n"); + + const uint8_vec& comp_data = m_params.m_create_ktx2_file ? m_output_ktx2_file : m_basis_file.get_compressed_data(); + if (m_params.m_write_output_basis_files) + { + const std::string& output_filename = m_params.m_out_filename; + + if (!write_vec_to_file(output_filename.c_str(), comp_data)) + { + error_printf("Failed writing output data to file \"%s\"\n", output_filename.c_str()); + return false; + } + + if (m_params.m_status_output) + { + printf("Wrote output .basis/.ktx2 file \"%s\"\n", output_filename.c_str()); + } + } + + size_t comp_size = 0; + if ((m_params.m_compute_stats) && (m_params.m_uastc) && (comp_data.size())) + { + void* pComp_data = tdefl_compress_mem_to_heap(&comp_data[0], comp_data.size(), &comp_size, TDEFL_MAX_PROBES_MASK);// TDEFL_DEFAULT_MAX_PROBES); + size_t decomp_size = 0; + void* pDecomp_data = tinfl_decompress_mem_to_heap(pComp_data, comp_size, &decomp_size, 0); + if ((decomp_size != comp_data.size()) || (memcmp(pDecomp_data, &comp_data[0], decomp_size) != 0)) + { + printf("basis_compressor::create_basis_file_and_transcode:: miniz compression or decompression failed!\n"); + return false; + } + + mz_free(pComp_data); + mz_free(pDecomp_data); + + uint32_t total_texels = 0; + for (uint32_t i = 0; i < m_slice_descs.size(); i++) + total_texels += (m_slice_descs[i].m_num_blocks_x * m_slice_descs[i].m_num_blocks_y) * 16; + + m_basis_bits_per_texel = comp_size * 8.0f / total_texels; + + debug_printf(".basis file size: %u, LZ compressed file size: %u, %3.2f bits/texel\n", + (uint32_t)comp_data.size(), + (uint32_t)comp_size, + m_basis_bits_per_texel); + } + + m_stats.resize(m_slice_descs.size()); + + if (m_params.m_validate_output_data) + { + for (uint32_t slice_index = 0; slice_index < m_slice_descs.size(); slice_index++) + { + const basisu_backend_slice_desc& slice_desc = m_slice_descs[slice_index]; + + if (m_params.m_compute_stats) + { + printf("Slice: %u\n", slice_index); + + image_stats& s = m_stats[slice_index]; + + // TODO: We used to output SSIM (during heavy encoder development), but this slowed down compression too much. We'll be adding it back. + + image_metrics em; + + // ---- .basis stats + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 0, 3); + em.print(".basis RGB Avg: "); + s.m_basis_rgb_avg_psnr = em.m_psnr; + + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 0, 4); + em.print(".basis RGBA Avg: "); + s.m_basis_rgba_avg_psnr = em.m_psnr; + + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 0, 1); + em.print(".basis R Avg: "); + + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 1, 1); + em.print(".basis G Avg: "); + + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 2, 1); + em.print(".basis B Avg: "); + + if (m_params.m_uastc) + { + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 3, 1); + em.print(".basis A Avg: "); + + s.m_basis_a_avg_psnr = em.m_psnr; + } + + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 0, 0); + em.print(".basis 709 Luma: "); + s.m_basis_luma_709_psnr = static_cast(em.m_psnr); + s.m_basis_luma_709_ssim = static_cast(em.m_ssim); + + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 0, 0, true, true); + em.print(".basis 601 Luma: "); + s.m_basis_luma_601_psnr = static_cast(em.m_psnr); + + if (m_slice_descs.size() == 1) + { + const uint32_t output_size = comp_size ? (uint32_t)comp_size : (uint32_t)comp_data.size(); + debug_printf(".basis RGB PSNR per bit/texel*10000: %3.3f\n", 10000.0f * s.m_basis_rgb_avg_psnr / ((output_size * 8.0f) / (slice_desc.m_orig_width * slice_desc.m_orig_height))); + debug_printf(".basis Luma 709 PSNR per bit/texel*10000: %3.3f\n", 10000.0f * s.m_basis_luma_709_psnr / ((output_size * 8.0f) / (slice_desc.m_orig_width * slice_desc.m_orig_height))); + } + + if (m_decoded_output_textures_unpacked_bc7[slice_index].get_width()) + { + // ---- BC7 stats + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 0, 3); + em.print("BC7 RGB Avg: "); + s.m_bc7_rgb_avg_psnr = em.m_psnr; + + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 0, 4); + em.print("BC7 RGBA Avg: "); + s.m_bc7_rgba_avg_psnr = em.m_psnr; + + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 0, 1); + em.print("BC7 R Avg: "); + + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 1, 1); + em.print("BC7 G Avg: "); + + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 2, 1); + em.print("BC7 B Avg: "); + + if (m_params.m_uastc) + { + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 3, 1); + em.print("BC7 A Avg: "); + + s.m_bc7_a_avg_psnr = em.m_psnr; + } + + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 0, 0); + em.print("BC7 709 Luma: "); + s.m_bc7_luma_709_psnr = static_cast(em.m_psnr); + s.m_bc7_luma_709_ssim = static_cast(em.m_ssim); + + em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 0, 0, true, true); + em.print("BC7 601 Luma: "); + s.m_bc7_luma_601_psnr = static_cast(em.m_psnr); + } + + if (!m_params.m_uastc) + { + // ---- Nearly best possible ETC1S stats + em.calc(m_slice_images[slice_index], m_best_etc1s_images_unpacked[slice_index], 0, 3); + em.print("Unquantized ETC1S RGB Avg: "); + s.m_best_etc1s_rgb_avg_psnr = static_cast(em.m_psnr); + + em.calc(m_slice_images[slice_index], m_best_etc1s_images_unpacked[slice_index], 0, 0); + em.print("Unquantized ETC1S 709 Luma: "); + s.m_best_etc1s_luma_709_psnr = static_cast(em.m_psnr); + s.m_best_etc1s_luma_709_ssim = static_cast(em.m_ssim); + + em.calc(m_slice_images[slice_index], m_best_etc1s_images_unpacked[slice_index], 0, 0, true, true); + em.print("Unquantized ETC1S 601 Luma: "); + s.m_best_etc1s_luma_601_psnr = static_cast(em.m_psnr); + } + } + + std::string out_basename; + if (m_params.m_out_filename.size()) + string_get_filename(m_params.m_out_filename.c_str(), out_basename); + else if (m_params.m_source_filenames.size()) + string_get_filename(m_params.m_source_filenames[slice_desc.m_source_file_index].c_str(), out_basename); + + string_remove_extension(out_basename); + out_basename = "basis_debug_" + out_basename + string_format("_slice_%u", slice_index); + + if ((!m_params.m_uastc) && (m_frontend.get_params().m_debug_images)) + { + // Write "best" ETC1S debug images + if (!m_params.m_uastc) + { + gpu_image best_etc1s_gpu_image(m_best_etc1s_images[slice_index]); + best_etc1s_gpu_image.override_dimensions(slice_desc.m_orig_width, slice_desc.m_orig_height); + write_compressed_texture_file((out_basename + "_best_etc1s.ktx").c_str(), best_etc1s_gpu_image); + + image best_etc1s_unpacked; + best_etc1s_gpu_image.unpack(best_etc1s_unpacked); + save_png(out_basename + "_best_etc1s.png", best_etc1s_unpacked); + } + } + + if (m_params.m_debug_images) + { + // Write decoded ETC1S/ASTC debug images + { + gpu_image decoded_etc1s_or_astc(m_decoded_output_textures[slice_index]); + decoded_etc1s_or_astc.override_dimensions(slice_desc.m_orig_width, slice_desc.m_orig_height); + write_compressed_texture_file((out_basename + "_transcoded_etc1s_or_astc.ktx").c_str(), decoded_etc1s_or_astc); + + image temp(m_decoded_output_textures_unpacked[slice_index]); + temp.crop(slice_desc.m_orig_width, slice_desc.m_orig_height); + save_png(out_basename + "_transcoded_etc1s_or_astc.png", temp); + } + + // Write decoded BC7 debug images + if (m_decoded_output_textures_bc7[slice_index].get_pixel_width()) + { + gpu_image decoded_bc7(m_decoded_output_textures_bc7[slice_index]); + decoded_bc7.override_dimensions(slice_desc.m_orig_width, slice_desc.m_orig_height); + write_compressed_texture_file((out_basename + "_transcoded_bc7.ktx").c_str(), decoded_bc7); + + image temp(m_decoded_output_textures_unpacked_bc7[slice_index]); + temp.crop(slice_desc.m_orig_width, slice_desc.m_orig_height); + save_png(out_basename + "_transcoded_bc7.png", temp); + } + } + } + } // if (m_params.m_validate_output_data) + + return true; + } + + // Make sure all the mip 0's have the same dimensions and number of mipmap levels, or we can't encode the KTX2 file. + bool basis_compressor::validate_ktx2_constraints() + { + uint32_t base_width = 0, base_height = 0; + uint32_t total_layers = 0; + for (uint32_t i = 0; i < m_slice_descs.size(); i++) + { + if (m_slice_descs[i].m_mip_index == 0) + { + if (!base_width) + { + base_width = m_slice_descs[i].m_orig_width; + base_height = m_slice_descs[i].m_orig_height; + } + else + { + if ((m_slice_descs[i].m_orig_width != base_width) || (m_slice_descs[i].m_orig_height != base_height)) + { + return false; + } + } + + total_layers = maximum(total_layers, m_slice_descs[i].m_source_file_index + 1); + } + } + + basisu::vector total_mips(total_layers); + for (uint32_t i = 0; i < m_slice_descs.size(); i++) + total_mips[m_slice_descs[i].m_source_file_index] = maximum(total_mips[m_slice_descs[i].m_source_file_index], m_slice_descs[i].m_mip_index + 1); + + for (uint32_t i = 1; i < total_layers; i++) + { + if (total_mips[0] != total_mips[i]) + { + return false; + } + } + + return true; + } + + static uint8_t g_ktx2_etc1s_nonalpha_dfd[44] = { 0x2C,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x28,0x0,0xA3,0x1,0x2,0x0,0x3,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3F,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xFF,0xFF,0xFF,0xFF }; + static uint8_t g_ktx2_etc1s_alpha_dfd[60] = { 0x3C,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x38,0x0,0xA3,0x1,0x2,0x0,0x3,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3F,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x40,0x0,0x3F,0xF,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xFF,0xFF,0xFF,0xFF }; + static uint8_t g_ktx2_uastc_nonalpha_dfd[44] = { 0x2C,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x28,0x0,0xA6,0x1,0x2,0x0,0x3,0x3,0x0,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7F,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xFF,0xFF,0xFF,0xFF }; + static uint8_t g_ktx2_uastc_alpha_dfd[44] = { 0x2C,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x28,0x0,0xA6,0x1,0x2,0x0,0x3,0x3,0x0,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7F,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xFF,0xFF,0xFF,0xFF }; + + void basis_compressor::get_dfd(uint8_vec &dfd, const basist::ktx2_header &header) + { + const uint8_t* pDFD; + uint32_t dfd_len; + + if (m_params.m_uastc) + { + if (m_any_source_image_has_alpha) + { + pDFD = g_ktx2_uastc_alpha_dfd; + dfd_len = sizeof(g_ktx2_uastc_alpha_dfd); + } + else + { + pDFD = g_ktx2_uastc_nonalpha_dfd; + dfd_len = sizeof(g_ktx2_uastc_nonalpha_dfd); + } + } + else + { + if (m_any_source_image_has_alpha) + { + pDFD = g_ktx2_etc1s_alpha_dfd; + dfd_len = sizeof(g_ktx2_etc1s_alpha_dfd); + } + else + { + pDFD = g_ktx2_etc1s_nonalpha_dfd; + dfd_len = sizeof(g_ktx2_etc1s_nonalpha_dfd); + } + } + + assert(dfd_len >= 44); + + dfd.resize(dfd_len); + memcpy(dfd.data(), pDFD, dfd_len); + + uint32_t dfd_bits = basisu::read_le_dword(dfd.data() + 3 * sizeof(uint32_t)); + + dfd_bits &= ~(0xFF << 16); + + if (m_params.m_ktx2_srgb_transfer_func) + dfd_bits |= (basist::KTX2_KHR_DF_TRANSFER_SRGB << 16); + else + dfd_bits |= (basist::KTX2_KHR_DF_TRANSFER_LINEAR << 16); + + basisu::write_le_dword(dfd.data() + 3 * sizeof(uint32_t), dfd_bits); + + if (header.m_supercompression_scheme != basist::KTX2_SS_NONE) + { + uint32_t plane_bits = basisu::read_le_dword(dfd.data() + 5 * sizeof(uint32_t)); + + plane_bits &= ~0xFF; + + basisu::write_le_dword(dfd.data() + 5 * sizeof(uint32_t), plane_bits); + } + + // Fix up the DFD channel(s) + uint32_t dfd_chan0 = basisu::read_le_dword(dfd.data() + 7 * sizeof(uint32_t)); + + if (m_params.m_uastc) + { + dfd_chan0 &= ~(0xF << 24); + + // TODO: Allow the caller to override this + if (m_any_source_image_has_alpha) + dfd_chan0 |= (basist::KTX2_DF_CHANNEL_UASTC_RGBA << 24); + else + dfd_chan0 |= (basist::KTX2_DF_CHANNEL_UASTC_RGB << 24); + } + + basisu::write_le_dword(dfd.data() + 7 * sizeof(uint32_t), dfd_chan0); + } + + bool basis_compressor::create_ktx2_file() + { + if (m_params.m_uastc) + { + if ((m_params.m_ktx2_uastc_supercompression != basist::KTX2_SS_NONE) && (m_params.m_ktx2_uastc_supercompression != basist::KTX2_SS_ZSTANDARD)) + return false; + } + + const basisu_backend_output& backend_output = m_backend.get_output(); + + // Determine the width/height, number of array layers, mipmap levels, and the number of faces (1 for 2D, 6 for cubemap). + // This does not support 1D or 3D. + uint32_t base_width = 0, base_height = 0, total_layers = 0, total_levels = 0, total_faces = 1; + + for (uint32_t i = 0; i < m_slice_descs.size(); i++) + { + if ((m_slice_descs[i].m_mip_index == 0) && (!base_width)) + { + base_width = m_slice_descs[i].m_orig_width; + base_height = m_slice_descs[i].m_orig_height; + } + + total_layers = maximum(total_layers, m_slice_descs[i].m_source_file_index + 1); + + if (!m_slice_descs[i].m_source_file_index) + total_levels = maximum(total_levels, m_slice_descs[i].m_mip_index + 1); + } + + if (m_params.m_tex_type == basist::cBASISTexTypeCubemapArray) + { + assert((total_layers % 6) == 0); + + total_layers /= 6; + assert(total_layers >= 1); + + total_faces = 6; + } + + basist::ktx2_header header = {}; + memset((void*)&header, 0, sizeof(header)); + + memcpy(header.m_identifier, basist::g_ktx2_file_identifier, sizeof(basist::g_ktx2_file_identifier)); + header.m_pixel_width = base_width; + header.m_pixel_height = base_height; + header.m_face_count = total_faces; + header.m_vk_format = basist::KTX2_VK_FORMAT_UNDEFINED; + header.m_type_size = 1; + header.m_level_count = total_levels; + header.m_layer_count = (total_layers > 1) ? total_layers : 0; + + if (m_params.m_uastc) + { + switch (m_params.m_ktx2_uastc_supercompression) + { + case basist::KTX2_SS_NONE: + { + header.m_supercompression_scheme = basist::KTX2_SS_NONE; + break; + } + case basist::KTX2_SS_ZSTANDARD: + { +#if BASISD_SUPPORT_KTX2_ZSTD + header.m_supercompression_scheme = basist::KTX2_SS_ZSTANDARD; +#else + header.m_supercompression_scheme = basist::KTX2_SS_NONE; +#endif + break; + } + default: assert(0); return false; + } + } + + basisu::vector level_data_bytes(total_levels); + basisu::vector compressed_level_data_bytes(total_levels); + uint_vec slice_level_offsets(m_slice_descs.size()); + + // This will append the texture data in the correct order (for each level: layer, then face). + for (uint32_t slice_index = 0; slice_index < m_slice_descs.size(); slice_index++) + { + const basisu_backend_slice_desc& slice_desc = m_slice_descs[slice_index]; + + slice_level_offsets[slice_index] = level_data_bytes[slice_desc.m_mip_index].size(); + + if (m_params.m_uastc) + append_vector(level_data_bytes[slice_desc.m_mip_index], m_uastc_backend_output.m_slice_image_data[slice_index]); + else + append_vector(level_data_bytes[slice_desc.m_mip_index], backend_output.m_slice_image_data[slice_index]); + } + + // UASTC supercompression + if ((m_params.m_uastc) && (header.m_supercompression_scheme == basist::KTX2_SS_ZSTANDARD)) + { +#if BASISD_SUPPORT_KTX2_ZSTD + for (uint32_t level_index = 0; level_index < total_levels; level_index++) + { + compressed_level_data_bytes[level_index].resize(ZSTD_compressBound(level_data_bytes[level_index].size())); + + size_t result = ZSTD_compress(compressed_level_data_bytes[level_index].data(), compressed_level_data_bytes[level_index].size(), + level_data_bytes[level_index].data(), level_data_bytes[level_index].size(), + m_params.m_ktx2_zstd_supercompression_level); + + if (ZSTD_isError(result)) + return false; + + compressed_level_data_bytes[level_index].resize(result); + } +#else + // Can't get here + assert(0); + return false; +#endif + } + else + { + // No supercompression + compressed_level_data_bytes = level_data_bytes; + } + + uint8_vec etc1s_global_data; + + // Create ETC1S global supercompressed data + if (!m_params.m_uastc) + { + basist::ktx2_etc1s_global_data_header etc1s_global_data_header; + clear_obj(etc1s_global_data_header); + + etc1s_global_data_header.m_endpoint_count = backend_output.m_num_endpoints; + etc1s_global_data_header.m_selector_count = backend_output.m_num_selectors; + etc1s_global_data_header.m_endpoints_byte_length = backend_output.m_endpoint_palette.size(); + etc1s_global_data_header.m_selectors_byte_length = backend_output.m_selector_palette.size(); + etc1s_global_data_header.m_tables_byte_length = backend_output.m_slice_image_tables.size(); + + basisu::vector etc1s_image_descs(total_levels * total_layers * total_faces); + memset((void*)etc1s_image_descs.data(), 0, etc1s_image_descs.size_in_bytes()); + + for (uint32_t slice_index = 0; slice_index < m_slice_descs.size(); slice_index++) + { + const basisu_backend_slice_desc& slice_desc = m_slice_descs[slice_index]; + + const uint32_t level_index = slice_desc.m_mip_index; + uint32_t layer_index = slice_desc.m_source_file_index; + uint32_t face_index = 0; + + if (m_params.m_tex_type == basist::cBASISTexTypeCubemapArray) + { + face_index = layer_index % 6; + layer_index /= 6; + } + + const uint32_t etc1s_image_index = level_index * (total_layers * total_faces) + layer_index * total_faces + face_index; + + if (slice_desc.m_alpha) + { + etc1s_image_descs[etc1s_image_index].m_alpha_slice_byte_length = backend_output.m_slice_image_data[slice_index].size(); + etc1s_image_descs[etc1s_image_index].m_alpha_slice_byte_offset = slice_level_offsets[slice_index]; + } + else + { + if (m_params.m_tex_type == basist::cBASISTexTypeVideoFrames) + etc1s_image_descs[etc1s_image_index].m_image_flags = !slice_desc.m_iframe ? basist::KTX2_IMAGE_IS_P_FRAME : 0; + + etc1s_image_descs[etc1s_image_index].m_rgb_slice_byte_length = backend_output.m_slice_image_data[slice_index].size(); + etc1s_image_descs[etc1s_image_index].m_rgb_slice_byte_offset = slice_level_offsets[slice_index]; + } + } // slice_index + + append_vector(etc1s_global_data, (const uint8_t*)&etc1s_global_data_header, sizeof(etc1s_global_data_header)); + append_vector(etc1s_global_data, (const uint8_t*)etc1s_image_descs.data(), etc1s_image_descs.size_in_bytes()); + append_vector(etc1s_global_data, backend_output.m_endpoint_palette); + append_vector(etc1s_global_data, backend_output.m_selector_palette); + append_vector(etc1s_global_data, backend_output.m_slice_image_tables); + + header.m_supercompression_scheme = basist::KTX2_SS_BASISLZ; + } + + // Key values + basist::ktx2_transcoder::key_value_vec key_values(m_params.m_ktx2_key_values); + key_values.enlarge(1); + + const char* pKTXwriter = "KTXwriter"; + key_values.back().m_key.resize(strlen(pKTXwriter) + 1); + memcpy(key_values.back().m_key.data(), pKTXwriter, strlen(pKTXwriter) + 1); + + char writer_id[128]; +#ifdef _MSC_VER + sprintf_s(writer_id, sizeof(writer_id), "Basis Universal %s", BASISU_LIB_VERSION_STRING); +#else + snprintf(writer_id, sizeof(writer_id), "Basis Universal %s", BASISU_LIB_VERSION_STRING); +#endif + key_values.back().m_value.resize(strlen(writer_id) + 1); + memcpy(key_values.back().m_value.data(), writer_id, strlen(writer_id) + 1); + + key_values.sort(); + +#if BASISU_DISABLE_KTX2_KEY_VALUES + // HACK HACK - Clear the key values array, which causes no key values to be written (triggering the ktx2check validator bug). + key_values.clear(); +#endif + + uint8_vec key_value_data; + + // DFD + uint8_vec dfd; + get_dfd(dfd, header); + + const uint32_t kvd_file_offset = sizeof(header) + sizeof(basist::ktx2_level_index) * total_levels + dfd.size(); + + for (uint32_t pass = 0; pass < 2; pass++) + { + for (uint32_t i = 0; i < key_values.size(); i++) + { + if (key_values[i].m_key.size() < 2) + return false; + + if (key_values[i].m_key.back() != 0) + return false; + + const uint64_t total_len = (uint64_t)key_values[i].m_key.size() + (uint64_t)key_values[i].m_value.size(); + if (total_len >= UINT32_MAX) + return false; + + packed_uint<4> le_len((uint32_t)total_len); + append_vector(key_value_data, (const uint8_t*)&le_len, sizeof(le_len)); + + append_vector(key_value_data, key_values[i].m_key); + append_vector(key_value_data, key_values[i].m_value); + + const uint32_t ofs = key_value_data.size() & 3; + const uint32_t padding = (4 - ofs) & 3; + for (uint32_t p = 0; p < padding; p++) + key_value_data.push_back(0); + } + + if (header.m_supercompression_scheme != basist::KTX2_SS_NONE) + break; + +#if BASISU_DISABLE_KTX2_ALIGNMENT_WORKAROUND + break; +#endif + + // Hack to ensure the KVD block ends on a 16 byte boundary, because we have no other official way of aligning the data. + uint32_t kvd_end_file_offset = kvd_file_offset + key_value_data.size(); + uint32_t bytes_needed_to_pad = (16 - (kvd_end_file_offset & 15)) & 15; + if (!bytes_needed_to_pad) + { + // We're good. No need to add a dummy key. + break; + } + + assert(!pass); + if (pass) + return false; + + if (bytes_needed_to_pad < 6) + bytes_needed_to_pad += 16; + + printf("WARNING: Due to a KTX2 validator bug related to mipPadding, we must insert a dummy key into the KTX2 file of %u bytes\n", bytes_needed_to_pad); + + // We're not good - need to add a dummy key large enough to force file alignment so the mip level array gets aligned. + // We can't just add some bytes before the mip level array because ktx2check will see that as extra data in the file that shouldn't be there in ktxValidator::validateDataSize(). + key_values.enlarge(1); + for (uint32_t i = 0; i < (bytes_needed_to_pad - 4 - 1 - 1); i++) + key_values.back().m_key.push_back(127); + + key_values.back().m_key.push_back(0); + + key_values.back().m_value.push_back(0); + + key_values.sort(); + + key_value_data.resize(0); + + // Try again + } + + basisu::vector level_index_array(total_levels); + memset((void*)level_index_array.data(), 0, level_index_array.size_in_bytes()); + + m_output_ktx2_file.clear(); + m_output_ktx2_file.reserve(m_output_basis_file.size()); + + // Dummy header + m_output_ktx2_file.resize(sizeof(header)); + + // Level index array + append_vector(m_output_ktx2_file, (const uint8_t*)level_index_array.data(), level_index_array.size_in_bytes()); + + // DFD + const uint8_t* pDFD = dfd.data(); + uint32_t dfd_len = dfd.size(); + + header.m_dfd_byte_offset = m_output_ktx2_file.size(); + header.m_dfd_byte_length = dfd_len; + append_vector(m_output_ktx2_file, pDFD, dfd_len); + + // Key value data + if (key_value_data.size()) + { + assert(kvd_file_offset == m_output_ktx2_file.size()); + + header.m_kvd_byte_offset = m_output_ktx2_file.size(); + header.m_kvd_byte_length = key_value_data.size(); + append_vector(m_output_ktx2_file, key_value_data); + } + + // Global Supercompressed Data + if (etc1s_global_data.size()) + { + uint32_t ofs = m_output_ktx2_file.size() & 7; + uint32_t padding = (8 - ofs) & 7; + for (uint32_t i = 0; i < padding; i++) + m_output_ktx2_file.push_back(0); + + header.m_sgd_byte_length = etc1s_global_data.size(); + header.m_sgd_byte_offset = m_output_ktx2_file.size(); + + append_vector(m_output_ktx2_file, etc1s_global_data); + } + + // mipPadding + if (header.m_supercompression_scheme == basist::KTX2_SS_NONE) + { + // We currently can't do this or the validator will incorrectly give an error. + uint32_t ofs = m_output_ktx2_file.size() & 15; + uint32_t padding = (16 - ofs) & 15; + + // Make sure we're always aligned here (due to a validator bug). + if (padding) + { + printf("Warning: KTX2 mip level data is not 16-byte aligned. This may trigger a ktx2check validation bug. Writing %u bytes of mipPadding.\n", padding); + } + + for (uint32_t i = 0; i < padding; i++) + m_output_ktx2_file.push_back(0); + } + + // Level data - write the smallest mipmap first. + for (int level = total_levels - 1; level >= 0; level--) + { + level_index_array[level].m_byte_length = compressed_level_data_bytes[level].size(); + if (m_params.m_uastc) + level_index_array[level].m_uncompressed_byte_length = level_data_bytes[level].size(); + + level_index_array[level].m_byte_offset = m_output_ktx2_file.size(); + append_vector(m_output_ktx2_file, compressed_level_data_bytes[level]); + } + + // Write final header + memcpy(m_output_ktx2_file.data(), &header, sizeof(header)); + + // Write final level index array + memcpy(m_output_ktx2_file.data() + sizeof(header), level_index_array.data(), level_index_array.size_in_bytes()); + + debug_printf("Total .ktx2 output file size: %u\n", m_output_ktx2_file.size()); + + return true; + } + + bool basis_parallel_compress( + uint32_t total_threads, + const basisu::vector& params_vec, + basisu::vector< parallel_results >& results_vec) + { + assert(g_library_initialized); + if (!g_library_initialized) + { + error_printf("basis_parallel_compress: basisu_encoder_init() MUST be called before using any encoder functionality!\n"); + return false; + } + + assert(total_threads >= 1); + total_threads = basisu::maximum(total_threads, 1); + + job_pool jpool(total_threads); + + results_vec.resize(0); + results_vec.resize(params_vec.size()); + + std::atomic result; + result = true; + + std::atomic opencl_failed; + opencl_failed = false; + + for (uint32_t pindex = 0; pindex < params_vec.size(); pindex++) + { + jpool.add_job([pindex, ¶ms_vec, &results_vec, &result, &opencl_failed] { + + basis_compressor_params params = params_vec[pindex]; + parallel_results& results = results_vec[pindex]; + + interval_timer tm; + tm.start(); + + basis_compressor c; + + // Dummy job pool + job_pool task_jpool(1); + params.m_pJob_pool = &task_jpool; + // TODO: Remove this flag entirely + params.m_multithreading = true; + + // Stop using OpenCL if a failure ever occurs. + if (opencl_failed) + params.m_use_opencl = false; + + bool status = c.init(params); + + if (c.get_opencl_failed()) + opencl_failed = true; + + if (status) + { + basis_compressor::error_code ec = c.process(); + + if (c.get_opencl_failed()) + opencl_failed = true; + + results.m_error_code = ec; + + if (ec == basis_compressor::cECSuccess) + { + results.m_basis_file = c.get_output_basis_file(); + results.m_ktx2_file = c.get_output_ktx2_file(); + results.m_stats = c.get_stats(); + results.m_basis_bits_per_texel = c.get_basis_bits_per_texel(); + results.m_any_source_image_has_alpha = c.get_any_source_image_has_alpha(); + } + else + { + result = false; + } + } + else + { + results.m_error_code = basis_compressor::cECFailedInitializing; + + result = false; + } + + results.m_total_time = tm.get_elapsed_secs(); + } ); + + } // pindex + + jpool.wait_for_all(); + + if (opencl_failed) + error_printf("An OpenCL error occured sometime during compression. The compressor fell back to CPU processing after the failure.\n"); + + return result; + } + + void* basis_compress( + const basisu::vector& source_images, + uint32_t flags_and_quality, float uastc_rdo_quality, + size_t* pSize, + image_stats* pStats) + { + // Check input parameters + if ((!source_images.size()) || (!pSize)) + { + error_printf("basis_compress: Invalid parameter\n"); + assert(0); + return nullptr; + } + + *pSize = 0; + + // Initialize a job pool + uint32_t num_threads = 1; + if (flags_and_quality & cFlagThreaded) + num_threads = basisu::maximum(1, std::thread::hardware_concurrency()); + + job_pool jp(num_threads); + + // Initialize the compressor parameter struct + basis_compressor_params comp_params; + comp_params.m_pJob_pool = &jp; + + comp_params.m_y_flip = (flags_and_quality & cFlagYFlip) != 0; + comp_params.m_debug = (flags_and_quality & cFlagDebug) != 0; + + // Copy the largest mipmap level + comp_params.m_source_images.resize(1); + comp_params.m_source_images[0] = source_images[0]; + + // Copy the smaller mipmap levels, if any + if (source_images.size() > 1) + { + comp_params.m_source_mipmap_images.resize(1); + comp_params.m_source_mipmap_images[0].resize(source_images.size() - 1); + + for (uint32_t i = 1; i < source_images.size(); i++) + comp_params.m_source_mipmap_images[0][i - 1] = source_images[i]; + } + + comp_params.m_multithreading = (flags_and_quality & cFlagThreaded) != 0; + comp_params.m_use_opencl = (flags_and_quality & cFlagUseOpenCL) != 0; + + comp_params.m_write_output_basis_files = false; + + comp_params.m_perceptual = (flags_and_quality & cFlagSRGB) != 0; + comp_params.m_mip_srgb = comp_params.m_perceptual; + comp_params.m_mip_gen = (flags_and_quality & (cFlagGenMipsWrap | cFlagGenMipsClamp)) != 0; + comp_params.m_mip_wrapping = (flags_and_quality & cFlagGenMipsWrap) != 0; + + comp_params.m_uastc = (flags_and_quality & cFlagUASTC) != 0; + if (comp_params.m_uastc) + { + comp_params.m_pack_uastc_flags = flags_and_quality & cPackUASTCLevelMask; + comp_params.m_rdo_uastc = (flags_and_quality & cFlagUASTCRDO) != 0; + comp_params.m_rdo_uastc_quality_scalar = uastc_rdo_quality; + } + else + comp_params.m_quality_level = basisu::maximum(1, flags_and_quality & 255); + + comp_params.m_create_ktx2_file = (flags_and_quality & cFlagKTX2) != 0; + + if (comp_params.m_create_ktx2_file) + { + // Set KTX2 specific parameters. + if ((flags_and_quality & cFlagKTX2UASTCSuperCompression) && (comp_params.m_uastc)) + comp_params.m_ktx2_uastc_supercompression = basist::KTX2_SS_ZSTANDARD; + + comp_params.m_ktx2_srgb_transfer_func = comp_params.m_perceptual; + } + + comp_params.m_compute_stats = (pStats != nullptr); + + // Create the compressor, initialize it, and process the input + basis_compressor comp; + if (!comp.init(comp_params)) + { + error_printf("basis_compress: basis_compressor::init() failed!\n"); + return nullptr; + } + + basis_compressor::error_code ec = comp.process(); + + if (ec != basis_compressor::cECSuccess) + { + error_printf("basis_compress: basis_compressor::process() failed with error code %u\n", (uint32_t)ec); + return nullptr; + } + + // Get the output file data and return it to the caller + void* pFile_data = nullptr; + const uint8_vec* pFile_data_vec = comp_params.m_create_ktx2_file ? &comp.get_output_ktx2_file() : &comp.get_output_basis_file(); + + pFile_data = malloc(pFile_data_vec->size()); + if (!pFile_data) + { + error_printf("basis_compress: Out of memory\n"); + return nullptr; + } + memcpy(pFile_data, pFile_data_vec->get_ptr(), pFile_data_vec->size()); + + *pSize = pFile_data_vec->size(); + + if ((pStats) && (comp.get_stats().size())) + { + *pStats = comp.get_stats()[0]; + } + + return pFile_data; + } + + void* basis_compress( + const uint8_t* pImageRGBA, uint32_t width, uint32_t height, uint32_t pitch_in_pixels, + uint32_t flags_and_quality, float uastc_rdo_quality, + size_t* pSize, + image_stats* pStats) + { + if (!pitch_in_pixels) + pitch_in_pixels = width; + + if ((!pImageRGBA) || (!width) || (!height) || (pitch_in_pixels < width) || (!pSize)) + { + error_printf("basis_compress: Invalid parameter\n"); + assert(0); + return nullptr; + } + + *pSize = 0; + + if ((width > BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION) || (height > BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION)) + { + error_printf("basis_compress: Image too large\n"); + return nullptr; + } + + // Copy the source image + basisu::vector source_image(1); + source_image[0].crop(width, height, width, g_black_color, false); + for (uint32_t y = 0; y < height; y++) + memcpy(source_image[0].get_ptr() + y * width, (const color_rgba*)pImageRGBA + y * pitch_in_pixels, width * sizeof(color_rgba)); + + return basis_compress(source_image, flags_and_quality, uastc_rdo_quality, pSize, pStats); + } + + void basis_free_data(void* p) + { + free(p); + } + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_comp.h b/ktx/external/basisu/encoder/basisu_comp.h new file mode 100644 index 0000000..aa5ea6f --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_comp.h @@ -0,0 +1,644 @@ +// basisu_comp.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once +#include "basisu_frontend.h" +#include "basisu_backend.h" +#include "basisu_basis_file.h" +#include "../transcoder/basisu_transcoder.h" +#include "basisu_uastc_enc.h" + +#define BASISU_LIB_VERSION 116 +#define BASISU_LIB_VERSION_STRING "1.16" + +#ifndef BASISD_SUPPORT_KTX2 + #error BASISD_SUPPORT_KTX2 is undefined +#endif +#ifndef BASISD_SUPPORT_KTX2_ZSTD + #error BASISD_SUPPORT_KTX2_ZSTD is undefined +#endif + +#if !BASISD_SUPPORT_KTX2 + #error BASISD_SUPPORT_KTX2 must be enabled when building the encoder. To reduce code size if KTX2 support is not needed, set BASISD_SUPPORT_KTX2_ZSTD to 0 +#endif + +namespace basisu +{ + struct opencl_context; + typedef opencl_context* opencl_context_ptr; + + const uint32_t BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION = 16384; + + // Allow block's color distance to increase by 1.5 while searching for an alternative nearby endpoint. + const float BASISU_DEFAULT_ENDPOINT_RDO_THRESH = 1.5f; + + // Allow block's color distance to increase by 1.25 while searching the selector history buffer for a close enough match. + const float BASISU_DEFAULT_SELECTOR_RDO_THRESH = 1.25f; + + const int BASISU_DEFAULT_QUALITY = 128; + const float BASISU_DEFAULT_HYBRID_SEL_CB_QUALITY_THRESH = 2.0f; + + const uint32_t BASISU_MAX_IMAGE_DIMENSION = 16384; + const uint32_t BASISU_QUALITY_MIN = 1; + const uint32_t BASISU_QUALITY_MAX = 255; + const uint32_t BASISU_MAX_ENDPOINT_CLUSTERS = basisu_frontend::cMaxEndpointClusters; + const uint32_t BASISU_MAX_SELECTOR_CLUSTERS = basisu_frontend::cMaxSelectorClusters; + + const uint32_t BASISU_MAX_SLICES = 0xFFFFFF; + + const int BASISU_RDO_UASTC_DICT_SIZE_DEFAULT = 4096; // 32768; + const int BASISU_RDO_UASTC_DICT_SIZE_MIN = 64; + const int BASISU_RDO_UASTC_DICT_SIZE_MAX = 65536; + + struct image_stats + { + image_stats() + { + clear(); + } + + void clear() + { + m_filename.clear(); + m_width = 0; + m_height = 0; + + m_basis_rgb_avg_psnr = 0.0f; + m_basis_rgba_avg_psnr = 0.0f; + m_basis_a_avg_psnr = 0.0f; + m_basis_luma_709_psnr = 0.0f; + m_basis_luma_601_psnr = 0.0f; + m_basis_luma_709_ssim = 0.0f; + + m_bc7_rgb_avg_psnr = 0.0f; + m_bc7_rgba_avg_psnr = 0.0f; + m_bc7_a_avg_psnr = 0.0f; + m_bc7_luma_709_psnr = 0.0f; + m_bc7_luma_601_psnr = 0.0f; + m_bc7_luma_709_ssim = 0.0f; + + m_best_etc1s_rgb_avg_psnr = 0.0f; + m_best_etc1s_luma_709_psnr = 0.0f; + m_best_etc1s_luma_601_psnr = 0.0f; + m_best_etc1s_luma_709_ssim = 0.0f; + } + + std::string m_filename; + uint32_t m_width; + uint32_t m_height; + + // .basis compressed (ETC1S or UASTC statistics) + float m_basis_rgb_avg_psnr; + float m_basis_rgba_avg_psnr; + float m_basis_a_avg_psnr; + float m_basis_luma_709_psnr; + float m_basis_luma_601_psnr; + float m_basis_luma_709_ssim; + + // BC7 statistics + float m_bc7_rgb_avg_psnr; + float m_bc7_rgba_avg_psnr; + float m_bc7_a_avg_psnr; + float m_bc7_luma_709_psnr; + float m_bc7_luma_601_psnr; + float m_bc7_luma_709_ssim; + + // Highest achievable quality ETC1S statistics + float m_best_etc1s_rgb_avg_psnr; + float m_best_etc1s_luma_709_psnr; + float m_best_etc1s_luma_601_psnr; + float m_best_etc1s_luma_709_ssim; + }; + + template + struct bool_param + { + bool_param() : + m_value(def), + m_changed(false) + { + } + + void clear() + { + m_value = def; + m_changed = false; + } + + operator bool() const + { + return m_value; + } + + bool operator= (bool v) + { + m_value = v; + m_changed = true; + return m_value; + } + + bool was_changed() const { return m_changed; } + void set_changed(bool flag) { m_changed = flag; } + + bool m_value; + bool m_changed; + }; + + template + struct param + { + param(T def, T min_v, T max_v) : + m_value(def), + m_def(def), + m_min(min_v), + m_max(max_v), + m_changed(false) + { + } + + void clear() + { + m_value = m_def; + m_changed = false; + } + + operator T() const + { + return m_value; + } + + T operator= (T v) + { + m_value = clamp(v, m_min, m_max); + m_changed = true; + return m_value; + } + + T operator *= (T v) + { + m_value *= v; + m_changed = true; + return m_value; + } + + bool was_changed() const { return m_changed; } + void set_changed(bool flag) { m_changed = flag; } + + T m_value; + T m_def; + T m_min; + T m_max; + bool m_changed; + }; + + struct basis_compressor_params + { + basis_compressor_params() : + m_compression_level((int)BASISU_DEFAULT_COMPRESSION_LEVEL, 0, (int)BASISU_MAX_COMPRESSION_LEVEL), + m_selector_rdo_thresh(BASISU_DEFAULT_SELECTOR_RDO_THRESH, 0.0f, 1e+10f), + m_endpoint_rdo_thresh(BASISU_DEFAULT_ENDPOINT_RDO_THRESH, 0.0f, 1e+10f), + m_mip_scale(1.0f, .000125f, 4.0f), + m_mip_smallest_dimension(1, 1, 16384), + m_max_endpoint_clusters(512), + m_max_selector_clusters(512), + m_quality_level(-1), + m_pack_uastc_flags(cPackUASTCLevelDefault), + m_rdo_uastc_quality_scalar(1.0f, 0.001f, 50.0f), + m_rdo_uastc_dict_size(BASISU_RDO_UASTC_DICT_SIZE_DEFAULT, BASISU_RDO_UASTC_DICT_SIZE_MIN, BASISU_RDO_UASTC_DICT_SIZE_MAX), + m_rdo_uastc_max_smooth_block_error_scale(UASTC_RDO_DEFAULT_SMOOTH_BLOCK_MAX_ERROR_SCALE, 1.0f, 300.0f), + m_rdo_uastc_smooth_block_max_std_dev(UASTC_RDO_DEFAULT_MAX_SMOOTH_BLOCK_STD_DEV, .01f, 65536.0f), + m_rdo_uastc_max_allowed_rms_increase_ratio(UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO, .01f, 100.0f), + m_rdo_uastc_skip_block_rms_thresh(UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH, .01f, 100.0f), + m_resample_width(0, 1, 16384), + m_resample_height(0, 1, 16384), + m_resample_factor(0.0f, .00125f, 100.0f), + m_ktx2_uastc_supercompression(basist::KTX2_SS_NONE), + m_ktx2_zstd_supercompression_level(6, INT_MIN, INT_MAX), + m_pJob_pool(nullptr) + { + clear(); + } + + void clear() + { + m_uastc.clear(); + m_use_opencl.clear(); + m_status_output.clear(); + + m_source_filenames.clear(); + m_source_alpha_filenames.clear(); + + m_source_images.clear(); + m_source_mipmap_images.clear(); + + m_out_filename.clear(); + + m_y_flip.clear(); + m_debug.clear(); + m_validate_etc1s.clear(); + m_debug_images.clear(); + m_perceptual.clear(); + m_no_selector_rdo.clear(); + m_selector_rdo_thresh.clear(); + m_read_source_images.clear(); + m_write_output_basis_files.clear(); + m_compression_level.clear(); + m_compute_stats.clear(); + m_check_for_alpha.clear(); + m_force_alpha.clear(); + m_multithreading.clear(); + m_swizzle[0] = 0; + m_swizzle[1] = 1; + m_swizzle[2] = 2; + m_swizzle[3] = 3; + m_renormalize.clear(); + m_disable_hierarchical_endpoint_codebooks.clear(); + + m_no_endpoint_rdo.clear(); + m_endpoint_rdo_thresh.clear(); + + m_mip_gen.clear(); + m_mip_scale.clear(); + m_mip_filter = "kaiser"; + m_mip_scale = 1.0f; + m_mip_srgb.clear(); + m_mip_premultiplied.clear(); + m_mip_renormalize.clear(); + m_mip_wrapping.clear(); + m_mip_fast.clear(); + m_mip_smallest_dimension.clear(); + + m_max_endpoint_clusters = 0; + m_max_selector_clusters = 0; + m_quality_level = -1; + + m_tex_type = basist::cBASISTexType2D; + m_userdata0 = 0; + m_userdata1 = 0; + m_us_per_frame = 0; + + m_pack_uastc_flags = cPackUASTCLevelDefault; + m_rdo_uastc.clear(); + m_rdo_uastc_quality_scalar.clear(); + m_rdo_uastc_max_smooth_block_error_scale.clear(); + m_rdo_uastc_smooth_block_max_std_dev.clear(); + m_rdo_uastc_max_allowed_rms_increase_ratio.clear(); + m_rdo_uastc_skip_block_rms_thresh.clear(); + m_rdo_uastc_favor_simpler_modes_in_rdo_mode.clear(); + m_rdo_uastc_multithreading.clear(); + + m_resample_width.clear(); + m_resample_height.clear(); + m_resample_factor.clear(); + + m_pGlobal_codebooks = nullptr; + + m_create_ktx2_file.clear(); + m_ktx2_uastc_supercompression = basist::KTX2_SS_NONE; + m_ktx2_key_values.clear(); + m_ktx2_zstd_supercompression_level.clear(); + m_ktx2_srgb_transfer_func.clear(); + + m_validate_output_data.clear(); + + m_pJob_pool = nullptr; + } + + // True to generate UASTC .basis file data, otherwise ETC1S. + bool_param m_uastc; + + bool_param m_use_opencl; + + // If m_read_source_images is true, m_source_filenames (and optionally m_source_alpha_filenames) contains the filenames of PNG images to read. + // Otherwise, the compressor processes the images in m_source_images. + basisu::vector m_source_filenames; + basisu::vector m_source_alpha_filenames; + + basisu::vector m_source_images; + + // Stores mipmaps starting from level 1. Level 0 is still stored in m_source_images, as usual. + // If m_source_mipmaps isn't empty, automatic mipmap generation isn't done. m_source_mipmaps.size() MUST equal m_source_images.size() or the compressor returns an error. + // The compressor applies the user-provided swizzling (in m_swizzle) to these images. + basisu::vector< basisu::vector > m_source_mipmap_images; + + // Filename of the output basis file + std::string m_out_filename; + + // The params are done this way so we can detect when the user has explictly changed them. + + // Flip images across Y axis + bool_param m_y_flip; + + // If true, the compressor will print basis status to stdout during compression. + bool_param m_status_output; + + // Output debug information during compression + bool_param m_debug; + bool_param m_validate_etc1s; + + // m_debug_images is pretty slow + bool_param m_debug_images; + + // ETC1S compression level, from 0 to BASISU_MAX_COMPRESSION_LEVEL (higher is slower). + // This parameter controls numerous internal encoding speed vs. compression efficiency/performance tradeoffs. + // Note this is NOT the same as the ETC1S quality level, and most users shouldn't change this. + param m_compression_level; + + // Use perceptual sRGB colorspace metrics instead of linear + bool_param m_perceptual; + + // Disable selector RDO, for faster compression but larger files + bool_param m_no_selector_rdo; + param m_selector_rdo_thresh; + + bool_param m_no_endpoint_rdo; + param m_endpoint_rdo_thresh; + + // Read source images from m_source_filenames/m_source_alpha_filenames + bool_param m_read_source_images; + + // Write the output basis file to disk using m_out_filename + bool_param m_write_output_basis_files; + + // Compute and display image metrics + bool_param m_compute_stats; + + // Check to see if any input image has an alpha channel, if so then the output basis file will have alpha channels + bool_param m_check_for_alpha; + + // Always put alpha slices in the output basis file, even when the input doesn't have alpha + bool_param m_force_alpha; + bool_param m_multithreading; + + // Split the R channel to RGB and the G channel to alpha, then write a basis file with alpha channels + char m_swizzle[4]; + + bool_param m_renormalize; + + // If true the front end will not use 2 level endpoint codebook searching, for slightly higher quality but much slower execution. + // Note some m_compression_level's disable this automatically. + bool_param m_disable_hierarchical_endpoint_codebooks; + + // mipmap generation parameters + bool_param m_mip_gen; + param m_mip_scale; + std::string m_mip_filter; + bool_param m_mip_srgb; + bool_param m_mip_premultiplied; // not currently supported + bool_param m_mip_renormalize; + bool_param m_mip_wrapping; + bool_param m_mip_fast; + param m_mip_smallest_dimension; + + // Codebook size (quality) control. + // If m_quality_level != -1, it controls the quality level. It ranges from [1,255] or [BASISU_QUALITY_MIN, BASISU_QUALITY_MAX]. + // Otherwise m_max_endpoint_clusters/m_max_selector_clusters controls the codebook sizes directly. + uint32_t m_max_endpoint_clusters; + uint32_t m_max_selector_clusters; + int m_quality_level; + + // m_tex_type, m_userdata0, m_userdata1, m_framerate - These fields go directly into the Basis file header. + basist::basis_texture_type m_tex_type; + uint32_t m_userdata0; + uint32_t m_userdata1; + uint32_t m_us_per_frame; + + // cPackUASTCLevelDefault, etc. + uint32_t m_pack_uastc_flags; + bool_param m_rdo_uastc; + param m_rdo_uastc_quality_scalar; + param m_rdo_uastc_dict_size; + param m_rdo_uastc_max_smooth_block_error_scale; + param m_rdo_uastc_smooth_block_max_std_dev; + param m_rdo_uastc_max_allowed_rms_increase_ratio; + param m_rdo_uastc_skip_block_rms_thresh; + bool_param m_rdo_uastc_favor_simpler_modes_in_rdo_mode; + bool_param m_rdo_uastc_multithreading; + + param m_resample_width; + param m_resample_height; + param m_resample_factor; + + const basist::basisu_lowlevel_etc1s_transcoder *m_pGlobal_codebooks; + + // KTX2 specific parameters. + // Internally, the compressor always creates a .basis file then it converts that lossless to KTX2. + bool_param m_create_ktx2_file; + basist::ktx2_supercompression m_ktx2_uastc_supercompression; + basist::ktx2_transcoder::key_value_vec m_ktx2_key_values; + param m_ktx2_zstd_supercompression_level; + bool_param m_ktx2_srgb_transfer_func; + + bool_param m_validate_output_data; + + job_pool *m_pJob_pool; + }; + + // Important: basisu_encoder_init() MUST be called first before using this class. + class basis_compressor + { + BASISU_NO_EQUALS_OR_COPY_CONSTRUCT(basis_compressor); + + public: + basis_compressor(); + ~basis_compressor(); + + // Note it *should* be possible to call init() multiple times with different inputs, but this scenario isn't well tested. Ideally, create 1 object, compress, then delete it. + bool init(const basis_compressor_params ¶ms); + + enum error_code + { + cECSuccess = 0, + cECFailedInitializing, + cECFailedReadingSourceImages, + cECFailedValidating, + cECFailedEncodeUASTC, + cECFailedFrontEnd, + cECFailedFontendExtract, + cECFailedBackend, + cECFailedCreateBasisFile, + cECFailedWritingOutput, + cECFailedUASTCRDOPostProcess, + cECFailedCreateKTX2File + }; + + error_code process(); + + // The output .basis file will always be valid of process() succeeded. + const uint8_vec &get_output_basis_file() const { return m_output_basis_file; } + + // The output .ktx2 file will only be valid if m_create_ktx2_file was true and process() succeeded. + const uint8_vec& get_output_ktx2_file() const { return m_output_ktx2_file; } + + const basisu::vector &get_stats() const { return m_stats; } + + uint32_t get_basis_file_size() const { return m_basis_file_size; } + double get_basis_bits_per_texel() const { return m_basis_bits_per_texel; } + + bool get_any_source_image_has_alpha() const { return m_any_source_image_has_alpha; } + + bool get_opencl_failed() const { return m_opencl_failed; } + + private: + basis_compressor_params m_params; + + opencl_context_ptr m_pOpenCL_context; + + basisu::vector m_slice_images; + + basisu::vector m_stats; + + uint32_t m_basis_file_size; + double m_basis_bits_per_texel; + + basisu_backend_slice_desc_vec m_slice_descs; + + uint32_t m_total_blocks; + + basisu_frontend m_frontend; + pixel_block_vec m_source_blocks; + + basisu::vector m_frontend_output_textures; + + basisu::vector m_best_etc1s_images; + basisu::vector m_best_etc1s_images_unpacked; + + basisu_backend m_backend; + + basisu_file m_basis_file; + + basisu::vector m_decoded_output_textures; + basisu::vector m_decoded_output_textures_unpacked; + basisu::vector m_decoded_output_textures_bc7; + basisu::vector m_decoded_output_textures_unpacked_bc7; + + uint8_vec m_output_basis_file; + uint8_vec m_output_ktx2_file; + + basisu::vector m_uastc_slice_textures; + basisu_backend_output m_uastc_backend_output; + + bool m_any_source_image_has_alpha; + + bool m_opencl_failed; + + bool read_source_images(); + bool extract_source_blocks(); + bool process_frontend(); + bool extract_frontend_texture_data(); + bool process_backend(); + bool create_basis_file_and_transcode(); + bool write_output_files_and_compute_stats(); + error_code encode_slices_to_uastc(); + bool generate_mipmaps(const image &img, basisu::vector &mips, bool has_alpha); + bool validate_texture_type_constraints(); + bool validate_ktx2_constraints(); + void get_dfd(uint8_vec& dfd, const basist::ktx2_header& hdr); + bool create_ktx2_file(); + }; + + // Alternative simple C-style wrapper API around the basis_compressor class. + // This doesn't expose every encoder feature, but it's enough to get going. + // Important: basisu_encoder_init() MUST be called first before calling these functions. + // + // Input parameters: + // source_images: Array of "image" objects, one per mipmap level, largest mipmap level first. + // OR + // pImageRGBA: pointer to a 32-bpp RGBx or RGBA raster image, R first in memory, A last. Top scanline first in memory. + // width/height/pitch_in_pixels: dimensions of pImageRGBA + // + // flags_and_quality: Combination of the above flags logically OR'd with the ETC1S or UASTC level, i.e. "cFlagSRGB | cFlagGenMipsClamp | cFlagThreaded | 128" or "cFlagSRGB | cFlagGenMipsClamp | cFlagUASTC | cFlagThreaded | cPackUASTCLevelDefault". + // In ETC1S mode, the lower 8-bits are the ETC1S quality level which ranges from [1,255] (higher=better quality/larger files) + // In UASTC mode, the lower 8-bits are the UASTC pack level (see cPackUASTCLevelFastest, etc.). Fastest/lowest quality is 0, so be sure to set it correctly. + // + // uastc_rdo_quality: Float UASTC RDO quality level (0=no change, higher values lower quality but increase compressibility, initially try .5-1.5) + // + // pSize: Returns the output data's compressed size in bytes + // + // Return value is the compressed .basis or .ktx2 file data, or nullptr on failure. Must call basis_free() to free it. + enum + { + cFlagUseOpenCL = 1 << 8, // use OpenCL if available + cFlagThreaded = 1 << 9, // use multiple threads for compression + cFlagDebug = 1 << 10, // enable debug output + + cFlagKTX2 = 1 << 11, // generate a KTX2 file + cFlagKTX2UASTCSuperCompression = 1 << 12, // use KTX2 Zstd supercompression on UASTC files + + cFlagSRGB = 1 << 13, // input texture is sRGB, use perceptual colorspace metrics, also use sRGB filtering during mipmap gen, and also sets KTX2 output transfer func to sRGB + cFlagGenMipsClamp = 1 << 14, // generate mipmaps with clamp addressing + cFlagGenMipsWrap = 1 << 15, // generate mipmaps with wrap addressing + + cFlagYFlip = 1 << 16, // flip source image on Y axis before compression + + cFlagUASTC = 1 << 17, // use UASTC compression vs. ETC1S + cFlagUASTCRDO = 1 << 18 // use RDO postprocessing when generating UASTC files (must set uastc_rdo_quality to the quality scalar) + }; + + // This function accepts an array of source images. + // If more than one image is provided, it's assumed the images form a mipmap pyramid and automatic mipmap generation is disabled. + void* basis_compress( + const basisu::vector &source_images, + uint32_t flags_and_quality, float uastc_rdo_quality, + size_t* pSize, + image_stats* pStats = nullptr); + + // This function only accepts a single source image. + void* basis_compress( + const uint8_t* pImageRGBA, uint32_t width, uint32_t height, uint32_t pitch_in_pixels, + uint32_t flags_and_quality, float uastc_rdo_quality, + size_t* pSize, + image_stats* pStats = nullptr); + + // Frees the dynamically allocated file data returned by basis_compress(). + void basis_free_data(void* p); + + // Parallel compression API + struct parallel_results + { + double m_total_time; + basis_compressor::error_code m_error_code; + uint8_vec m_basis_file; + uint8_vec m_ktx2_file; + basisu::vector m_stats; + double m_basis_bits_per_texel; + bool m_any_source_image_has_alpha; + + parallel_results() + { + clear(); + } + + void clear() + { + m_total_time = 0.0f; + m_error_code = basis_compressor::cECFailedInitializing; + m_basis_file.clear(); + m_ktx2_file.clear(); + m_stats.clear(); + m_basis_bits_per_texel = 0.0f; + m_any_source_image_has_alpha = false; + } + }; + + // Compresses an array of input textures across total_threads threads using the basis_compressor class. + // Compressing multiple textures at a time is substantially more efficient than just compressing one at a time. + // total_threads must be >= 1. + bool basis_parallel_compress( + uint32_t total_threads, + const basisu::vector ¶ms_vec, + basisu::vector< parallel_results > &results_vec); + +} // namespace basisu + diff --git a/ktx/external/basisu/encoder/basisu_enc.cpp b/ktx/external/basisu/encoder/basisu_enc.cpp new file mode 100644 index 0000000..662d36e --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_enc.cpp @@ -0,0 +1,2116 @@ +// basisu_enc.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_enc.h" +#include "basisu_resampler.h" +#include "basisu_resampler_filters.h" +#include "basisu_etc.h" +#include "../transcoder/basisu_transcoder.h" +#include "basisu_bc7enc.h" +#if !defined(LIBKTX) +#include "jpgd.h" +#include "pvpngreader.h" +#endif +#include "basisu_opencl.h" +#include + +#define MINIZ_HEADER_FILE_ONLY +#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES +#include "basisu_miniz.h" + +#if defined(_WIN32) +// For QueryPerformanceCounter/QueryPerformanceFrequency +#define WIN32_LEAN_AND_MEAN +#include +#endif + +namespace basisu +{ + uint64_t interval_timer::g_init_ticks, interval_timer::g_freq; + double interval_timer::g_timer_freq; +#if BASISU_SUPPORT_SSE + bool g_cpu_supports_sse41; +#endif + + uint8_t g_hamming_dist[256] = + { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 + }; + + // This is a Public Domain 8x8 font from here: + // https://github.com/dhepper/font8x8/blob/master/font8x8_basic.h + const uint8_t g_debug_font8x8_basic[127 - 32 + 1][8] = + { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0020 ( ) + { 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00}, // U+0021 (!) + { 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0022 (") + { 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}, // U+0023 (#) + { 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00}, // U+0024 ($) + { 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00}, // U+0025 (%) + { 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00}, // U+0026 (&) + { 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0027 (') + { 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00}, // U+0028 (() + { 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00}, // U+0029 ()) + { 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, // U+002A (*) + { 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00}, // U+002B (+) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+002C (,) + { 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}, // U+002D (-) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+002E (.) + { 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00}, // U+002F (/) + { 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00}, // U+0030 (0) + { 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}, // U+0031 (1) + { 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00}, // U+0032 (2) + { 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00}, // U+0033 (3) + { 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00}, // U+0034 (4) + { 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00}, // U+0035 (5) + { 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00}, // U+0036 (6) + { 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00}, // U+0037 (7) + { 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+0038 (8) + { 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00}, // U+0039 (9) + { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+003A (:) + { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+003B (;) + { 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00}, // U+003C (<) + { 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00}, // U+003D (=) + { 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00}, // U+003E (>) + { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00}, // U+003F (?) + { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00}, // U+0040 (@) + { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // U+0041 (A) + { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00}, // U+0042 (B) + { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00}, // U+0043 (C) + { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00}, // U+0044 (D) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00}, // U+0045 (E) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00}, // U+0046 (F) + { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00}, // U+0047 (G) + { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // U+0048 (H) + { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0049 (I) + { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00}, // U+004A (J) + { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00}, // U+004B (K) + { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00}, // U+004C (L) + { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00}, // U+004D (M) + { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00}, // U+004E (N) + { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00}, // U+004F (O) + { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00}, // U+0050 (P) + { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00}, // U+0051 (Q) + { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00}, // U+0052 (R) + { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00}, // U+0053 (S) + { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0054 (T) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00}, // U+0055 (U) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V) + { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // U+0057 (W) + { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00}, // U+0058 (X) + { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00}, // U+0059 (Y) + { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z) + { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00}, // U+005B ([) + { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00}, // U+005C (\) + { 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00}, // U+005D (]) + { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00}, // U+005E (^) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // U+005F (_) + { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0060 (`) + { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00}, // U+0061 (a) + { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00}, // U+0062 (b) + { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00}, // U+0063 (c) + { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00}, // U+0064 (d) + { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e) + { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00}, // U+0066 (f) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0067 (g) + { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00}, // U+0068 (h) + { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0069 (i) + { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E}, // U+006A (j) + { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00}, // U+006B (k) + { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+006C (l) + { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // U+006D (m) + { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00}, // U+006E (n) + { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+006F (o) + { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F}, // U+0070 (p) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78}, // U+0071 (q) + { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r) + { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00}, // U+0073 (s) + { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00}, // U+0074 (t) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00}, // U+0075 (u) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0076 (v) + { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00}, // U+0077 (w) + { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00}, // U+0078 (x) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0079 (y) + { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00}, // U+007A (z) + { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // U+007B ({) + { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, // U+007C (|) + { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // U+007D (}) + { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007E (~) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // U+007F + }; + + bool g_library_initialized; + std::mutex g_encoder_init_mutex; + + // Encoder library initialization (just call once at startup) + void basisu_encoder_init(bool use_opencl, bool opencl_force_serialization) + { + std::lock_guard lock(g_encoder_init_mutex); + + if (g_library_initialized) + return; + + detect_sse41(); + + basist::basisu_transcoder_init(); + pack_etc1_solid_color_init(); + //uastc_init(); + bc7enc_compress_block_init(); // must be after uastc_init() + + // Don't bother initializing the OpenCL module at all if it's been completely disabled. + if (use_opencl) + { + opencl_init(opencl_force_serialization); + } + + g_library_initialized = true; + } + + void basisu_encoder_deinit() + { + opencl_deinit(); + + g_library_initialized = false; + } + + void error_vprintf(const char* pFmt, va_list args) + { + char buf[8192]; + +#ifdef _WIN32 + vsprintf_s(buf, sizeof(buf), pFmt, args); +#else + vsnprintf(buf, sizeof(buf), pFmt, args); +#endif + + fprintf(stderr, "ERROR: %s", buf); + } + + void error_printf(const char *pFmt, ...) + { + va_list args; + va_start(args, pFmt); + error_vprintf(pFmt, args); + va_end(args); + } + +#if defined(_WIN32) + inline void query_counter(timer_ticks* pTicks) + { + QueryPerformanceCounter(reinterpret_cast(pTicks)); + } + inline void query_counter_frequency(timer_ticks* pTicks) + { + QueryPerformanceFrequency(reinterpret_cast(pTicks)); + } +#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) +#include + inline void query_counter(timer_ticks* pTicks) + { + struct timeval cur_time; + gettimeofday(&cur_time, NULL); + *pTicks = static_cast(cur_time.tv_sec) * 1000000ULL + static_cast(cur_time.tv_usec); + } + inline void query_counter_frequency(timer_ticks* pTicks) + { + *pTicks = 1000000; + } +#elif defined(__GNUC__) +#include + inline void query_counter(timer_ticks* pTicks) + { + struct timeval cur_time; + gettimeofday(&cur_time, NULL); + *pTicks = static_cast(cur_time.tv_sec) * 1000000ULL + static_cast(cur_time.tv_usec); + } + inline void query_counter_frequency(timer_ticks* pTicks) + { + *pTicks = 1000000; + } +#else +#error TODO +#endif + + interval_timer::interval_timer() : m_start_time(0), m_stop_time(0), m_started(false), m_stopped(false) + { + if (!g_timer_freq) + init(); + } + + void interval_timer::start() + { + query_counter(&m_start_time); + m_started = true; + m_stopped = false; + } + + void interval_timer::stop() + { + assert(m_started); + query_counter(&m_stop_time); + m_stopped = true; + } + + double interval_timer::get_elapsed_secs() const + { + assert(m_started); + if (!m_started) + return 0; + + timer_ticks stop_time = m_stop_time; + if (!m_stopped) + query_counter(&stop_time); + + timer_ticks delta = stop_time - m_start_time; + return delta * g_timer_freq; + } + + void interval_timer::init() + { + if (!g_timer_freq) + { + query_counter_frequency(&g_freq); + g_timer_freq = 1.0f / g_freq; + query_counter(&g_init_ticks); + } + } + + timer_ticks interval_timer::get_ticks() + { + if (!g_timer_freq) + init(); + timer_ticks ticks; + query_counter(&ticks); + return ticks - g_init_ticks; + } + + double interval_timer::ticks_to_secs(timer_ticks ticks) + { + if (!g_timer_freq) + init(); + return ticks * g_timer_freq; + } + +#if !defined(LIBKTX) + const uint32_t MAX_32BIT_ALLOC_SIZE = 250000000; + bool load_tga(const char* pFilename, image& img) + { + int w = 0, h = 0, n_chans = 0; + uint8_t* pImage_data = read_tga(pFilename, w, h, n_chans); + + if ((!pImage_data) || (!w) || (!h) || ((n_chans != 3) && (n_chans != 4))) + { + error_printf("Failed loading .TGA image \"%s\"!\n", pFilename); + + if (pImage_data) + free(pImage_data); + + return false; + } + + if (sizeof(void *) == sizeof(uint32_t)) + { + if ((w * h * n_chans) > MAX_32BIT_ALLOC_SIZE) + { + error_printf("Image \"%s\" is too large (%ux%u) to process in a 32-bit build!\n", pFilename, w, h); + + if (pImage_data) + free(pImage_data); + + return false; + } + } + + img.resize(w, h); + + const uint8_t *pSrc = pImage_data; + for (int y = 0; y < h; y++) + { + color_rgba *pDst = &img(0, y); + + for (int x = 0; x < w; x++) + { + pDst->r = pSrc[0]; + pDst->g = pSrc[1]; + pDst->b = pSrc[2]; + pDst->a = (n_chans == 3) ? 255 : pSrc[3]; + + pSrc += n_chans; + ++pDst; + } + } + + free(pImage_data); + + return true; + } + + bool load_png(const uint8_t *pBuf, size_t buf_size, image &img, const char *pFilename) + { + interval_timer tm; + tm.start(); + + if (!buf_size) + return false; + + uint32_t width = 0, height = 0, num_chans = 0; + void* pImage = pv_png::load_png(pBuf, buf_size, 4, width, height, num_chans); + if (!pBuf) + { + error_printf("pv_png::load_png failed while loading image \"%s\"\n", pFilename); + return false; + } + + img.grant_ownership(reinterpret_cast(pImage), width, height); + + //debug_printf("Total load_png() time: %3.3f secs\n", tm.get_elapsed_secs()); + + return true; + } + + bool load_png(const char* pFilename, image& img) + { + uint8_vec buffer; + if (!read_file_to_vec(pFilename, buffer)) + { + error_printf("load_png: Failed reading file \"%s\"!\n", pFilename); + return false; + } + + return load_png(buffer.data(), buffer.size(), img, pFilename); + } + + bool load_jpg(const char *pFilename, image& img) + { + int width = 0, height = 0, actual_comps = 0; + uint8_t *pImage_data = jpgd::decompress_jpeg_image_from_file(pFilename, &width, &height, &actual_comps, 4, jpgd::jpeg_decoder::cFlagLinearChromaFiltering); + if (!pImage_data) + return false; + + img.init(pImage_data, width, height, 4); + + free(pImage_data); + + return true; + } + bool load_image(const char* pFilename, image& img) + { + std::string ext(string_get_extension(std::string(pFilename))); + + if (ext.length() == 0) + return false; + + const char *pExt = ext.c_str(); + + if (strcasecmp(pExt, "png") == 0) + return load_png(pFilename, img); + if (strcasecmp(pExt, "tga") == 0) + return load_tga(pFilename, img); + if ( (strcasecmp(pExt, "jpg") == 0) || (strcasecmp(pExt, "jfif") == 0) || (strcasecmp(pExt, "jpeg") == 0) ) + return load_jpg(pFilename, img); + return false; + } + + bool save_png(const char* pFilename, const image &img, uint32_t image_save_flags, uint32_t grayscale_comp) + { + if (!img.get_total_pixels()) + return false; + + void* pPNG_data = nullptr; + size_t PNG_data_size = 0; + + if (image_save_flags & cImageSaveGrayscale) + { + uint8_vec g_pixels(img.get_total_pixels()); + uint8_t* pDst = &g_pixels[0]; + + for (uint32_t y = 0; y < img.get_height(); y++) + for (uint32_t x = 0; x < img.get_width(); x++) + *pDst++ = img(x, y)[grayscale_comp]; + + pPNG_data = buminiz::tdefl_write_image_to_png_file_in_memory_ex(g_pixels.data(), img.get_width(), img.get_height(), 1, &PNG_data_size, 1, false); + } + else + { + bool has_alpha = false; + + if ((image_save_flags & cImageSaveIgnoreAlpha) == 0) + has_alpha = img.has_alpha(); + + if (!has_alpha) + { + uint8_vec rgb_pixels(img.get_total_pixels() * 3); + uint8_t* pDst = &rgb_pixels[0]; + + for (uint32_t y = 0; y < img.get_height(); y++) + { + const color_rgba* pSrc = &img(0, y); + for (uint32_t x = 0; x < img.get_width(); x++) + { + pDst[0] = pSrc->r; + pDst[1] = pSrc->g; + pDst[2] = pSrc->b; + + pSrc++; + pDst += 3; + } + } + + pPNG_data = buminiz::tdefl_write_image_to_png_file_in_memory_ex(rgb_pixels.data(), img.get_width(), img.get_height(), 3, &PNG_data_size, 1, false); + } + else + { + pPNG_data = buminiz::tdefl_write_image_to_png_file_in_memory_ex(img.get_ptr(), img.get_width(), img.get_height(), 4, &PNG_data_size, 1, false); + } + } + + if (!pPNG_data) + return false; + + bool status = write_data_to_file(pFilename, pPNG_data, PNG_data_size); + if (!status) + { + error_printf("save_png: Failed writing to filename \"%s\"!\n", pFilename); + } + + free(pPNG_data); + + return status; + } +#else + bool load_image(const char*, image&) + { + return false; + } + + bool save_png(const char*, const image&, uint32_t, uint32_t) + { + return false; + } +#endif + + bool read_file_to_vec(const char* pFilename, uint8_vec& data) + { + FILE* pFile = nullptr; +#ifdef _WIN32 + fopen_s(&pFile, pFilename, "rb"); +#else + pFile = fopen(pFilename, "rb"); +#endif + if (!pFile) + return false; + + fseek(pFile, 0, SEEK_END); +#ifdef _WIN32 + int64_t filesize = _ftelli64(pFile); +#else + int64_t filesize = ftello(pFile); +#endif + if (filesize < 0) + { + fclose(pFile); + return false; + } + fseek(pFile, 0, SEEK_SET); + + if (sizeof(size_t) == sizeof(uint32_t)) + { + if (filesize > 0x70000000) + { + // File might be too big to load safely in one alloc + fclose(pFile); + return false; + } + } + + if (!data.try_resize((size_t)filesize)) + { + fclose(pFile); + return false; + } + + if (filesize) + { + if (fread(&data[0], 1, (size_t)filesize, pFile) != (size_t)filesize) + { + fclose(pFile); + return false; + } + } + + fclose(pFile); + return true; + } + + bool write_data_to_file(const char* pFilename, const void* pData, size_t len) + { + FILE* pFile = nullptr; +#ifdef _WIN32 + fopen_s(&pFile, pFilename, "wb"); +#else + pFile = fopen(pFilename, "wb"); +#endif + if (!pFile) + return false; + + if (len) + { + if (fwrite(pData, 1, len, pFile) != len) + { + fclose(pFile); + return false; + } + } + + return fclose(pFile) != EOF; + } + + float linear_to_srgb(float l) + { + assert(l >= 0.0f && l <= 1.0f); + if (l < .0031308f) + return saturate(l * 12.92f); + else + return saturate(1.055f * powf(l, 1.0f/2.4f) - .055f); + } + + float srgb_to_linear(float s) + { + assert(s >= 0.0f && s <= 1.0f); + if (s < .04045f) + return saturate(s * (1.0f/12.92f)); + else + return saturate(powf((s + .055f) * (1.0f/1.055f), 2.4f)); + } + + bool image_resample(const image &src, image &dst, bool srgb, + const char *pFilter, float filter_scale, + bool wrapping, + uint32_t first_comp, uint32_t num_comps) + { + assert((first_comp + num_comps) <= 4); + + const int cMaxComps = 4; + + const uint32_t src_w = src.get_width(), src_h = src.get_height(); + const uint32_t dst_w = dst.get_width(), dst_h = dst.get_height(); + + if (maximum(src_w, src_h) > BASISU_RESAMPLER_MAX_DIMENSION) + { + printf("Image is too large!\n"); + return false; + } + + if (!src_w || !src_h || !dst_w || !dst_h) + return false; + + if ((num_comps < 1) || (num_comps > cMaxComps)) + return false; + + if ((minimum(dst_w, dst_h) < 1) || (maximum(dst_w, dst_h) > BASISU_RESAMPLER_MAX_DIMENSION)) + { + printf("Image is too large!\n"); + return false; + } + + if ((src_w == dst_w) && (src_h == dst_h)) + { + dst = src; + return true; + } + + float srgb_to_linear_table[256]; + if (srgb) + { + for (int i = 0; i < 256; ++i) + srgb_to_linear_table[i] = srgb_to_linear((float)i * (1.0f/255.0f)); + } + + const int LINEAR_TO_SRGB_TABLE_SIZE = 8192; + uint8_t linear_to_srgb_table[LINEAR_TO_SRGB_TABLE_SIZE]; + + if (srgb) + { + for (int i = 0; i < LINEAR_TO_SRGB_TABLE_SIZE; ++i) + linear_to_srgb_table[i] = (uint8_t)clamp((int)(255.0f * linear_to_srgb((float)i * (1.0f / (LINEAR_TO_SRGB_TABLE_SIZE - 1))) + .5f), 0, 255); + } + + std::vector samples[cMaxComps]; + Resampler *resamplers[cMaxComps]; + + resamplers[0] = new Resampler(src_w, src_h, dst_w, dst_h, + wrapping ? Resampler::BOUNDARY_WRAP : Resampler::BOUNDARY_CLAMP, 0.0f, 1.0f, + pFilter, nullptr, nullptr, filter_scale, filter_scale, 0, 0); + samples[0].resize(src_w); + + for (uint32_t i = 1; i < num_comps; ++i) + { + resamplers[i] = new Resampler(src_w, src_h, dst_w, dst_h, + wrapping ? Resampler::BOUNDARY_WRAP : Resampler::BOUNDARY_CLAMP, 0.0f, 1.0f, + pFilter, resamplers[0]->get_clist_x(), resamplers[0]->get_clist_y(), filter_scale, filter_scale, 0, 0); + samples[i].resize(src_w); + } + + uint32_t dst_y = 0; + + for (uint32_t src_y = 0; src_y < src_h; ++src_y) + { + const color_rgba *pSrc = &src(0, src_y); + + // Put source lines into resampler(s) + for (uint32_t x = 0; x < src_w; ++x) + { + for (uint32_t c = 0; c < num_comps; ++c) + { + const uint32_t comp_index = first_comp + c; + const uint32_t v = (*pSrc)[comp_index]; + + if (!srgb || (comp_index == 3)) + samples[c][x] = v * (1.0f / 255.0f); + else + samples[c][x] = srgb_to_linear_table[v]; + } + + pSrc++; + } + + for (uint32_t c = 0; c < num_comps; ++c) + { + if (!resamplers[c]->put_line(&samples[c][0])) + { + for (uint32_t i = 0; i < num_comps; i++) + delete resamplers[i]; + return false; + } + } + + // Now retrieve any output lines + for (;;) + { + uint32_t c; + for (c = 0; c < num_comps; ++c) + { + const uint32_t comp_index = first_comp + c; + + const float *pOutput_samples = resamplers[c]->get_line(); + if (!pOutput_samples) + break; + + const bool linear_flag = !srgb || (comp_index == 3); + + color_rgba *pDst = &dst(0, dst_y); + + for (uint32_t x = 0; x < dst_w; x++) + { + // TODO: Add dithering + if (linear_flag) + { + int j = (int)(255.0f * pOutput_samples[x] + .5f); + (*pDst)[comp_index] = (uint8_t)clamp(j, 0, 255); + } + else + { + int j = (int)((LINEAR_TO_SRGB_TABLE_SIZE - 1) * pOutput_samples[x] + .5f); + (*pDst)[comp_index] = linear_to_srgb_table[clamp(j, 0, LINEAR_TO_SRGB_TABLE_SIZE - 1)]; + } + + pDst++; + } + } + if (c < num_comps) + break; + + ++dst_y; + } + } + + for (uint32_t i = 0; i < num_comps; ++i) + delete resamplers[i]; + + return true; + } + + void canonical_huffman_calculate_minimum_redundancy(sym_freq *A, int num_syms) + { + // See the paper "In-Place Calculation of Minimum Redundancy Codes" by Moffat and Katajainen + if (!num_syms) + return; + + if (1 == num_syms) + { + A[0].m_key = 1; + return; + } + + A[0].m_key += A[1].m_key; + + int s = 2, r = 0, next; + for (next = 1; next < (num_syms - 1); ++next) + { + if ((s >= num_syms) || (A[r].m_key < A[s].m_key)) + { + A[next].m_key = A[r].m_key; + A[r].m_key = next; + ++r; + } + else + { + A[next].m_key = A[s].m_key; + ++s; + } + + if ((s >= num_syms) || ((r < next) && A[r].m_key < A[s].m_key)) + { + A[next].m_key = A[next].m_key + A[r].m_key; + A[r].m_key = next; + ++r; + } + else + { + A[next].m_key = A[next].m_key + A[s].m_key; + ++s; + } + } + A[num_syms - 2].m_key = 0; + + for (next = num_syms - 3; next >= 0; --next) + { + A[next].m_key = 1 + A[A[next].m_key].m_key; + } + + int num_avail = 1, num_used = 0, depth = 0; + r = num_syms - 2; + next = num_syms - 1; + while (num_avail > 0) + { + for ( ; (r >= 0) && ((int)A[r].m_key == depth); ++num_used, --r ) + ; + + for ( ; num_avail > num_used; --next, --num_avail) + A[next].m_key = depth; + + num_avail = 2 * num_used; + num_used = 0; + ++depth; + } + } + + void canonical_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size) + { + int i; + uint32_t total = 0; + if (code_list_len <= 1) + return; + + for (i = max_code_size + 1; i <= cHuffmanMaxSupportedInternalCodeSize; i++) + pNum_codes[max_code_size] += pNum_codes[i]; + + for (i = max_code_size; i > 0; i--) + total += (((uint32_t)pNum_codes[i]) << (max_code_size - i)); + + while (total != (1UL << max_code_size)) + { + pNum_codes[max_code_size]--; + for (i = max_code_size - 1; i > 0; i--) + { + if (pNum_codes[i]) + { + pNum_codes[i]--; + pNum_codes[i + 1] += 2; + break; + } + } + + total--; + } + } + + sym_freq *canonical_huffman_radix_sort_syms(uint32_t num_syms, sym_freq *pSyms0, sym_freq *pSyms1) + { + uint32_t total_passes = 2, pass_shift, pass, i, hist[256 * 2]; + sym_freq *pCur_syms = pSyms0, *pNew_syms = pSyms1; + + clear_obj(hist); + + for (i = 0; i < num_syms; i++) + { + uint32_t freq = pSyms0[i].m_key; + + // We scale all input frequencies to 16-bits. + assert(freq <= UINT16_MAX); + + hist[freq & 0xFF]++; + hist[256 + ((freq >> 8) & 0xFF)]++; + } + + while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) + total_passes--; + + for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8) + { + const uint32_t *pHist = &hist[pass << 8]; + uint32_t offsets[256], cur_ofs = 0; + for (i = 0; i < 256; i++) + { + offsets[i] = cur_ofs; + cur_ofs += pHist[i]; + } + + for (i = 0; i < num_syms; i++) + pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i]; + + sym_freq *t = pCur_syms; + pCur_syms = pNew_syms; + pNew_syms = t; + } + + return pCur_syms; + } + + bool huffman_encoding_table::init(uint32_t num_syms, const uint16_t *pFreq, uint32_t max_code_size) + { + if (max_code_size > cHuffmanMaxSupportedCodeSize) + return false; + if ((!num_syms) || (num_syms > cHuffmanMaxSyms)) + return false; + + uint32_t total_used_syms = 0; + for (uint32_t i = 0; i < num_syms; i++) + if (pFreq[i]) + total_used_syms++; + + if (!total_used_syms) + return false; + + std::vector sym_freq0(total_used_syms), sym_freq1(total_used_syms); + for (uint32_t i = 0, j = 0; i < num_syms; i++) + { + if (pFreq[i]) + { + sym_freq0[j].m_key = pFreq[i]; + sym_freq0[j++].m_sym_index = static_cast(i); + } + } + + sym_freq *pSym_freq = canonical_huffman_radix_sort_syms(total_used_syms, &sym_freq0[0], &sym_freq1[0]); + + canonical_huffman_calculate_minimum_redundancy(pSym_freq, total_used_syms); + + int num_codes[cHuffmanMaxSupportedInternalCodeSize + 1]; + clear_obj(num_codes); + + for (uint32_t i = 0; i < total_used_syms; i++) + { + if (pSym_freq[i].m_key > cHuffmanMaxSupportedInternalCodeSize) + return false; + + num_codes[pSym_freq[i].m_key]++; + } + + canonical_huffman_enforce_max_code_size(num_codes, total_used_syms, max_code_size); + + m_code_sizes.resize(0); + m_code_sizes.resize(num_syms); + + m_codes.resize(0); + m_codes.resize(num_syms); + + for (uint32_t i = 1, j = total_used_syms; i <= max_code_size; i++) + for (uint32_t l = num_codes[i]; l > 0; l--) + m_code_sizes[pSym_freq[--j].m_sym_index] = static_cast(i); + + uint32_t next_code[cHuffmanMaxSupportedInternalCodeSize + 1]; + + next_code[1] = 0; + for (uint32_t j = 0, i = 2; i <= max_code_size; i++) + next_code[i] = j = ((j + num_codes[i - 1]) << 1); + + for (uint32_t i = 0; i < num_syms; i++) + { + uint32_t rev_code = 0, code, code_size; + if ((code_size = m_code_sizes[i]) == 0) + continue; + if (code_size > cHuffmanMaxSupportedInternalCodeSize) + return false; + code = next_code[code_size]++; + for (uint32_t l = code_size; l > 0; l--, code >>= 1) + rev_code = (rev_code << 1) | (code & 1); + m_codes[i] = static_cast(rev_code); + } + + return true; + } + + bool huffman_encoding_table::init(uint32_t num_syms, const uint32_t *pSym_freq, uint32_t max_code_size) + { + if ((!num_syms) || (num_syms > cHuffmanMaxSyms)) + return false; + + uint16_vec sym_freq(num_syms); + + uint32_t max_freq = 0; + for (uint32_t i = 0; i < num_syms; i++) + max_freq = maximum(max_freq, pSym_freq[i]); + + if (max_freq < UINT16_MAX) + { + for (uint32_t i = 0; i < num_syms; i++) + sym_freq[i] = static_cast(pSym_freq[i]); + } + else + { + for (uint32_t i = 0; i < num_syms; i++) + { + if (pSym_freq[i]) + { + uint32_t f = static_cast((static_cast(pSym_freq[i]) * 65534U + (max_freq >> 1)) / max_freq); + sym_freq[i] = static_cast(clamp(f, 1, 65534)); + } + } + } + + return init(num_syms, &sym_freq[0], max_code_size); + } + + void bitwise_coder::end_nonzero_run(uint16_vec &syms, uint32_t &run_size, uint32_t len) + { + if (run_size) + { + if (run_size < cHuffmanSmallRepeatSizeMin) + { + while (run_size--) + syms.push_back(static_cast(len)); + } + else if (run_size <= cHuffmanSmallRepeatSizeMax) + { + syms.push_back(static_cast(cHuffmanSmallRepeatCode | ((run_size - cHuffmanSmallRepeatSizeMin) << 6))); + } + else + { + assert((run_size >= cHuffmanBigRepeatSizeMin) && (run_size <= cHuffmanBigRepeatSizeMax)); + syms.push_back(static_cast(cHuffmanBigRepeatCode | ((run_size - cHuffmanBigRepeatSizeMin) << 6))); + } + } + + run_size = 0; + } + + void bitwise_coder::end_zero_run(uint16_vec &syms, uint32_t &run_size) + { + if (run_size) + { + if (run_size < cHuffmanSmallZeroRunSizeMin) + { + while (run_size--) + syms.push_back(0); + } + else if (run_size <= cHuffmanSmallZeroRunSizeMax) + { + syms.push_back(static_cast(cHuffmanSmallZeroRunCode | ((run_size - cHuffmanSmallZeroRunSizeMin) << 6))); + } + else + { + assert((run_size >= cHuffmanBigZeroRunSizeMin) && (run_size <= cHuffmanBigZeroRunSizeMax)); + syms.push_back(static_cast(cHuffmanBigZeroRunCode | ((run_size - cHuffmanBigZeroRunSizeMin) << 6))); + } + } + + run_size = 0; + } + + uint32_t bitwise_coder::emit_huffman_table(const huffman_encoding_table &tab) + { + const uint64_t start_bits = m_total_bits; + + const uint8_vec &code_sizes = tab.get_code_sizes(); + + uint32_t total_used = tab.get_total_used_codes(); + put_bits(total_used, cHuffmanMaxSymsLog2); + + if (!total_used) + return 0; + + uint16_vec syms; + syms.reserve(total_used + 16); + + uint32_t prev_code_len = UINT_MAX, zero_run_size = 0, nonzero_run_size = 0; + + for (uint32_t i = 0; i <= total_used; ++i) + { + const uint32_t code_len = (i == total_used) ? 0xFF : code_sizes[i]; + assert((code_len == 0xFF) || (code_len <= 16)); + + if (code_len) + { + end_zero_run(syms, zero_run_size); + + if (code_len != prev_code_len) + { + end_nonzero_run(syms, nonzero_run_size, prev_code_len); + if (code_len != 0xFF) + syms.push_back(static_cast(code_len)); + } + else if (++nonzero_run_size == cHuffmanBigRepeatSizeMax) + end_nonzero_run(syms, nonzero_run_size, prev_code_len); + } + else + { + end_nonzero_run(syms, nonzero_run_size, prev_code_len); + + if (++zero_run_size == cHuffmanBigZeroRunSizeMax) + end_zero_run(syms, zero_run_size); + } + + prev_code_len = code_len; + } + + histogram h(cHuffmanTotalCodelengthCodes); + for (uint32_t i = 0; i < syms.size(); i++) + h.inc(syms[i] & 63); + + huffman_encoding_table ct; + if (!ct.init(h, 7)) + return 0; + + assert(cHuffmanTotalSortedCodelengthCodes == cHuffmanTotalCodelengthCodes); + + uint32_t total_codelength_codes; + for (total_codelength_codes = cHuffmanTotalSortedCodelengthCodes; total_codelength_codes > 0; total_codelength_codes--) + if (ct.get_code_sizes()[g_huffman_sorted_codelength_codes[total_codelength_codes - 1]]) + break; + + assert(total_codelength_codes); + + put_bits(total_codelength_codes, 5); + for (uint32_t i = 0; i < total_codelength_codes; i++) + put_bits(ct.get_code_sizes()[g_huffman_sorted_codelength_codes[i]], 3); + + for (uint32_t i = 0; i < syms.size(); ++i) + { + const uint32_t l = syms[i] & 63, e = syms[i] >> 6; + + put_code(l, ct); + + if (l == cHuffmanSmallZeroRunCode) + put_bits(e, cHuffmanSmallZeroRunExtraBits); + else if (l == cHuffmanBigZeroRunCode) + put_bits(e, cHuffmanBigZeroRunExtraBits); + else if (l == cHuffmanSmallRepeatCode) + put_bits(e, cHuffmanSmallRepeatExtraBits); + else if (l == cHuffmanBigRepeatCode) + put_bits(e, cHuffmanBigRepeatExtraBits); + } + + return (uint32_t)(m_total_bits - start_bits); + } + + bool huffman_test(int rand_seed) + { + histogram h(19); + + // Feed in a fibonacci sequence to force large codesizes + h[0] += 1; h[1] += 1; h[2] += 2; h[3] += 3; + h[4] += 5; h[5] += 8; h[6] += 13; h[7] += 21; + h[8] += 34; h[9] += 55; h[10] += 89; h[11] += 144; + h[12] += 233; h[13] += 377; h[14] += 610; h[15] += 987; + h[16] += 1597; h[17] += 2584; h[18] += 4181; + + huffman_encoding_table etab; + etab.init(h, 16); + + { + bitwise_coder c; + c.init(1024); + + c.emit_huffman_table(etab); + for (int i = 0; i < 19; i++) + c.put_code(i, etab); + + c.flush(); + + basist::bitwise_decoder d; + d.init(&c.get_bytes()[0], static_cast(c.get_bytes().size())); + + basist::huffman_decoding_table dtab; + bool success = d.read_huffman_table(dtab); + if (!success) + { + assert(0); + printf("Failure 5\n"); + return false; + } + + for (uint32_t i = 0; i < 19; i++) + { + uint32_t s = d.decode_huffman(dtab); + if (s != i) + { + assert(0); + printf("Failure 5\n"); + return false; + } + } + } + + basisu::rand r; + r.seed(rand_seed); + + for (int iter = 0; iter < 500000; iter++) + { + printf("%u\n", iter); + + uint32_t max_sym = r.irand(0, 8193); + uint32_t num_codes = r.irand(1, 10000); + uint_vec syms(num_codes); + + for (uint32_t i = 0; i < num_codes; i++) + { + if (r.bit()) + syms[i] = r.irand(0, max_sym); + else + { + int s = (int)(r.gaussian((float)max_sym / 2, (float)maximum(1, max_sym / 2)) + .5f); + s = basisu::clamp(s, 0, max_sym); + + syms[i] = s; + } + + } + + histogram h1(max_sym + 1); + for (uint32_t i = 0; i < num_codes; i++) + h1[syms[i]]++; + + huffman_encoding_table etab2; + if (!etab2.init(h1, 16)) + { + assert(0); + printf("Failed 0\n"); + return false; + } + + bitwise_coder c; + c.init(1024); + + c.emit_huffman_table(etab2); + + for (uint32_t i = 0; i < num_codes; i++) + c.put_code(syms[i], etab2); + + c.flush(); + + basist::bitwise_decoder d; + d.init(&c.get_bytes()[0], (uint32_t)c.get_bytes().size()); + + basist::huffman_decoding_table dtab; + bool success = d.read_huffman_table(dtab); + if (!success) + { + assert(0); + printf("Failed 2\n"); + return false; + } + + for (uint32_t i = 0; i < num_codes; i++) + { + uint32_t s = d.decode_huffman(dtab); + if (s != syms[i]) + { + assert(0); + printf("Failed 4\n"); + return false; + } + } + + } + return true; + } + + void palette_index_reorderer::init(uint32_t num_indices, const uint32_t *pIndices, uint32_t num_syms, pEntry_dist_func pDist_func, void *pCtx, float dist_func_weight) + { + assert((num_syms > 0) && (num_indices > 0)); + assert((dist_func_weight >= 0.0f) && (dist_func_weight <= 1.0f)); + + clear(); + + m_remap_table.resize(num_syms); + m_entries_picked.reserve(num_syms); + m_total_count_to_picked.resize(num_syms); + + if (num_indices <= 1) + return; + + prepare_hist(num_syms, num_indices, pIndices); + find_initial(num_syms); + + while (m_entries_to_do.size()) + { + // Find the best entry to move into the picked list. + uint32_t best_entry; + double best_count; + find_next_entry(best_entry, best_count, pDist_func, pCtx, dist_func_weight); + + // We now have chosen an entry to place in the picked list, now determine which side it goes on. + const uint32_t entry_to_move = m_entries_to_do[best_entry]; + + float side = pick_side(num_syms, entry_to_move, pDist_func, pCtx, dist_func_weight); + + // Put entry_to_move either on the "left" or "right" side of the picked entries + if (side <= 0) + m_entries_picked.push_back(entry_to_move); + else + m_entries_picked.insert(m_entries_picked.begin(), entry_to_move); + + // Erase best_entry from the todo list + m_entries_to_do.erase(m_entries_to_do.begin() + best_entry); + + // We've just moved best_entry to the picked list, so now we need to update m_total_count_to_picked[] to factor the additional count to best_entry + for (uint32_t i = 0; i < m_entries_to_do.size(); i++) + m_total_count_to_picked[m_entries_to_do[i]] += get_hist(m_entries_to_do[i], entry_to_move, num_syms); + } + + for (uint32_t i = 0; i < num_syms; i++) + m_remap_table[m_entries_picked[i]] = i; + } + + void palette_index_reorderer::prepare_hist(uint32_t num_syms, uint32_t num_indices, const uint32_t *pIndices) + { + m_hist.resize(0); + m_hist.resize(num_syms * num_syms); + + for (uint32_t i = 0; i < num_indices; i++) + { + const uint32_t idx = pIndices[i]; + inc_hist(idx, (i < (num_indices - 1)) ? pIndices[i + 1] : -1, num_syms); + inc_hist(idx, (i > 0) ? pIndices[i - 1] : -1, num_syms); + } + } + + void palette_index_reorderer::find_initial(uint32_t num_syms) + { + uint32_t max_count = 0, max_index = 0; + for (uint32_t i = 0; i < num_syms * num_syms; i++) + if (m_hist[i] > max_count) + max_count = m_hist[i], max_index = i; + + uint32_t a = max_index / num_syms, b = max_index % num_syms; + + m_entries_picked.push_back(a); + m_entries_picked.push_back(b); + + for (uint32_t i = 0; i < num_syms; i++) + if ((i != b) && (i != a)) + m_entries_to_do.push_back(i); + + for (uint32_t i = 0; i < m_entries_to_do.size(); i++) + for (uint32_t j = 0; j < m_entries_picked.size(); j++) + m_total_count_to_picked[m_entries_to_do[i]] += get_hist(m_entries_to_do[i], m_entries_picked[j], num_syms); + } + + void palette_index_reorderer::find_next_entry(uint32_t &best_entry, double &best_count, pEntry_dist_func pDist_func, void *pCtx, float dist_func_weight) + { + best_entry = 0; + best_count = 0; + + for (uint32_t i = 0; i < m_entries_to_do.size(); i++) + { + const uint32_t u = m_entries_to_do[i]; + double total_count = m_total_count_to_picked[u]; + + if (pDist_func) + { + float w = maximum((*pDist_func)(u, m_entries_picked.front(), pCtx), (*pDist_func)(u, m_entries_picked.back(), pCtx)); + assert((w >= 0.0f) && (w <= 1.0f)); + total_count = (total_count + 1.0f) * lerp(1.0f - dist_func_weight, 1.0f + dist_func_weight, w); + } + + if (total_count <= best_count) + continue; + + best_entry = i; + best_count = total_count; + } + } + + float palette_index_reorderer::pick_side(uint32_t num_syms, uint32_t entry_to_move, pEntry_dist_func pDist_func, void *pCtx, float dist_func_weight) + { + float which_side = 0; + + int l_count = 0, r_count = 0; + for (uint32_t j = 0; j < m_entries_picked.size(); j++) + { + const int count = get_hist(entry_to_move, m_entries_picked[j], num_syms), r = ((int)m_entries_picked.size() + 1 - 2 * (j + 1)); + which_side += static_cast(r * count); + if (r >= 0) + l_count += r * count; + else + r_count += -r * count; + } + + if (pDist_func) + { + float w_left = lerp(1.0f - dist_func_weight, 1.0f + dist_func_weight, (*pDist_func)(entry_to_move, m_entries_picked.front(), pCtx)); + float w_right = lerp(1.0f - dist_func_weight, 1.0f + dist_func_weight, (*pDist_func)(entry_to_move, m_entries_picked.back(), pCtx)); + which_side = w_left * l_count - w_right * r_count; + } + return which_side; + } + + void image_metrics::calc(const image &a, const image &b, uint32_t first_chan, uint32_t total_chans, bool avg_comp_error, bool use_601_luma) + { + assert((first_chan < 4U) && (first_chan + total_chans <= 4U)); + + const uint32_t width = basisu::minimum(a.get_width(), b.get_width()); + const uint32_t height = basisu::minimum(a.get_height(), b.get_height()); + + double hist[256]; + clear_obj(hist); + + for (uint32_t y = 0; y < height; y++) + { + for (uint32_t x = 0; x < width; x++) + { + const color_rgba &ca = a(x, y), &cb = b(x, y); + + if (total_chans) + { + for (uint32_t c = 0; c < total_chans; c++) + hist[iabs(ca[first_chan + c] - cb[first_chan + c])]++; + } + else + { + if (use_601_luma) + hist[iabs(ca.get_601_luma() - cb.get_601_luma())]++; + else + hist[iabs(ca.get_709_luma() - cb.get_709_luma())]++; + } + } + } + + m_max = 0; + double sum = 0.0f, sum2 = 0.0f; + for (uint32_t i = 0; i < 256; i++) + { + if (hist[i]) + { + m_max = basisu::maximum(m_max, (float)i); + double v = i * hist[i]; + sum += v; + sum2 += i * v; + } + } + + double total_values = (double)width * (double)height; + if (avg_comp_error) + total_values *= (double)clamp(total_chans, 1, 4); + + m_mean = (float)clamp(sum / total_values, 0.0f, 255.0); + m_mean_squared = (float)clamp(sum2 / total_values, 0.0f, 255.0f * 255.0f); + m_rms = (float)sqrt(m_mean_squared); + m_psnr = m_rms ? (float)clamp(log10(255.0 / m_rms) * 20.0f, 0.0f, 100.0f) : 100.0f; + } + + void fill_buffer_with_random_bytes(void *pBuf, size_t size, uint32_t seed) + { + rand r(seed); + + uint8_t *pDst = static_cast(pBuf); + + while (size >= sizeof(uint32_t)) + { + *(uint32_t *)pDst = r.urand32(); + pDst += sizeof(uint32_t); + size -= sizeof(uint32_t); + } + + while (size) + { + *pDst++ = r.byte(); + size--; + } + } + + uint32_t hash_hsieh(const uint8_t *pBuf, size_t len) + { + if (!pBuf || !len) + return 0; + + uint32_t h = static_cast(len); + + const uint32_t bytes_left = len & 3; + len >>= 2; + + while (len--) + { + const uint16_t *pWords = reinterpret_cast(pBuf); + + h += pWords[0]; + + const uint32_t t = (pWords[1] << 11) ^ h; + h = (h << 16) ^ t; + + pBuf += sizeof(uint32_t); + + h += h >> 11; + } + + switch (bytes_left) + { + case 1: + h += *reinterpret_cast(pBuf); + h ^= h << 10; + h += h >> 1; + break; + case 2: + h += *reinterpret_cast(pBuf); + h ^= h << 11; + h += h >> 17; + break; + case 3: + h += *reinterpret_cast(pBuf); + h ^= h << 16; + h ^= (static_cast(pBuf[sizeof(uint16_t)])) << 18; + h += h >> 11; + break; + default: + break; + } + + h ^= h << 3; + h += h >> 5; + h ^= h << 4; + h += h >> 17; + h ^= h << 25; + h += h >> 6; + + return h; + } + + job_pool::job_pool(uint32_t num_threads) : + m_num_active_jobs(0), + m_kill_flag(false) + { + assert(num_threads >= 1U); + + debug_printf("job_pool::job_pool: %u total threads\n", num_threads); + + if (num_threads > 1) + { + m_threads.resize(num_threads - 1); + + for (int i = 0; i < ((int)num_threads - 1); i++) + m_threads[i] = std::thread([this, i] { job_thread(i); }); + } + } + + job_pool::~job_pool() + { + debug_printf("job_pool::~job_pool\n"); + + // Notify all workers that they need to die right now. + m_kill_flag = true; + + m_has_work.notify_all(); + + // Wait for all workers to die. + for (uint32_t i = 0; i < m_threads.size(); i++) + m_threads[i].join(); + } + + void job_pool::add_job(const std::function& job) + { + std::unique_lock lock(m_mutex); + + m_queue.emplace_back(job); + + const size_t queue_size = m_queue.size(); + + lock.unlock(); + + if (queue_size > 1) + m_has_work.notify_one(); + } + + void job_pool::add_job(std::function&& job) + { + std::unique_lock lock(m_mutex); + + m_queue.emplace_back(std::move(job)); + + const size_t queue_size = m_queue.size(); + + lock.unlock(); + + if (queue_size > 1) + { + m_has_work.notify_one(); + } + } + + void job_pool::wait_for_all() + { + std::unique_lock lock(m_mutex); + + // Drain the job queue on the calling thread. + while (!m_queue.empty()) + { + std::function job(m_queue.back()); + m_queue.pop_back(); + + lock.unlock(); + + job(); + + lock.lock(); + } + + // The queue is empty, now wait for all active jobs to finish up. + m_no_more_jobs.wait(lock, [this]{ return !m_num_active_jobs; } ); + } + + void job_pool::job_thread(uint32_t index) + { + BASISU_NOTE_UNUSED(index); + //debug_printf("job_pool::job_thread: starting %u\n", index); + + while (true) + { + std::unique_lock lock(m_mutex); + + // Wait for any jobs to be issued. + m_has_work.wait(lock, [this] { return m_kill_flag || m_queue.size(); } ); + + // Check to see if we're supposed to exit. + if (m_kill_flag) + break; + + // Get the job and execute it. + std::function job(m_queue.back()); + m_queue.pop_back(); + + ++m_num_active_jobs; + + lock.unlock(); + + job(); + + lock.lock(); + + --m_num_active_jobs; + + // Now check if there are no more jobs remaining. + const bool all_done = m_queue.empty() && !m_num_active_jobs; + + lock.unlock(); + + if (all_done) + m_no_more_jobs.notify_all(); + } + + //debug_printf("job_pool::job_thread: exiting\n"); + } +#if !defined(LIBKTX) + // .TGA image loading + #pragma pack(push) + #pragma pack(1) + struct tga_header + { + uint8_t m_id_len; + uint8_t m_cmap; + uint8_t m_type; + packed_uint<2> m_cmap_first; + packed_uint<2> m_cmap_len; + uint8_t m_cmap_bpp; + packed_uint<2> m_x_org; + packed_uint<2> m_y_org; + packed_uint<2> m_width; + packed_uint<2> m_height; + uint8_t m_depth; + uint8_t m_desc; + }; + #pragma pack(pop) + + const uint32_t MAX_TGA_IMAGE_SIZE = 16384; + + enum tga_image_type + { + cITPalettized = 1, + cITRGB = 2, + cITGrayscale = 3 + }; + + uint8_t *read_tga(const uint8_t *pBuf, uint32_t buf_size, int &width, int &height, int &n_chans) + { + width = 0; + height = 0; + n_chans = 0; + + if (buf_size <= sizeof(tga_header)) + return nullptr; + + const tga_header &hdr = *reinterpret_cast(pBuf); + + if ((!hdr.m_width) || (!hdr.m_height) || (hdr.m_width > MAX_TGA_IMAGE_SIZE) || (hdr.m_height > MAX_TGA_IMAGE_SIZE)) + return nullptr; + + if (hdr.m_desc >> 6) + return nullptr; + + // Simple validation + if ((hdr.m_cmap != 0) && (hdr.m_cmap != 1)) + return nullptr; + + if (hdr.m_cmap) + { + if ((hdr.m_cmap_bpp == 0) || (hdr.m_cmap_bpp > 32)) + return nullptr; + + // Nobody implements CMapFirst correctly, so we're not supporting it. Never seen it used, either. + if (hdr.m_cmap_first != 0) + return nullptr; + } + + const bool x_flipped = (hdr.m_desc & 0x10) != 0; + const bool y_flipped = (hdr.m_desc & 0x20) == 0; + + bool rle_flag = false; + int file_image_type = hdr.m_type; + if (file_image_type > 8) + { + file_image_type -= 8; + rle_flag = true; + } + + const tga_image_type image_type = static_cast(file_image_type); + + switch (file_image_type) + { + case cITRGB: + if (hdr.m_depth == 8) + return nullptr; + break; + case cITPalettized: + if ((hdr.m_depth != 8) || (hdr.m_cmap != 1) || (hdr.m_cmap_len == 0)) + return nullptr; + break; + case cITGrayscale: + if ((hdr.m_cmap != 0) || (hdr.m_cmap_len != 0)) + return nullptr; + if ((hdr.m_depth != 8) && (hdr.m_depth != 16)) + return nullptr; + break; + default: + return nullptr; + } + + uint32_t tga_bytes_per_pixel = 0; + + switch (hdr.m_depth) + { + case 32: + tga_bytes_per_pixel = 4; + n_chans = 4; + break; + case 24: + tga_bytes_per_pixel = 3; + n_chans = 3; + break; + case 16: + case 15: + tga_bytes_per_pixel = 2; + // For compatibility with stb_image_write.h + n_chans = ((file_image_type == cITGrayscale) && (hdr.m_depth == 16)) ? 4 : 3; + break; + case 8: + tga_bytes_per_pixel = 1; + // For palettized RGBA support, which both FreeImage and stb_image support. + n_chans = ((file_image_type == cITPalettized) && (hdr.m_cmap_bpp == 32)) ? 4 : 3; + break; + default: + return nullptr; + } + + //const uint32_t bytes_per_line = hdr.m_width * tga_bytes_per_pixel; + + const uint8_t *pSrc = pBuf + sizeof(tga_header); + uint32_t bytes_remaining = buf_size - sizeof(tga_header); + + if (hdr.m_id_len) + { + if (bytes_remaining < hdr.m_id_len) + return nullptr; + pSrc += hdr.m_id_len; + bytes_remaining += hdr.m_id_len; + } + + color_rgba pal[256]; + for (uint32_t i = 0; i < 256; i++) + pal[i].set(0, 0, 0, 255); + + if ((hdr.m_cmap) && (hdr.m_cmap_len)) + { + if (image_type == cITPalettized) + { + // Note I cannot find any files using 32bpp palettes in the wild (never seen any in ~30 years). + if ( ((hdr.m_cmap_bpp != 32) && (hdr.m_cmap_bpp != 24) && (hdr.m_cmap_bpp != 15) && (hdr.m_cmap_bpp != 16)) || (hdr.m_cmap_len > 256) ) + return nullptr; + + if (hdr.m_cmap_bpp == 32) + { + const uint32_t pal_size = hdr.m_cmap_len * 4; + if (bytes_remaining < pal_size) + return nullptr; + + for (uint32_t i = 0; i < hdr.m_cmap_len; i++) + { + pal[i].r = pSrc[i * 4 + 2]; + pal[i].g = pSrc[i * 4 + 1]; + pal[i].b = pSrc[i * 4 + 0]; + pal[i].a = pSrc[i * 4 + 3]; + } + + bytes_remaining -= pal_size; + pSrc += pal_size; + } + else if (hdr.m_cmap_bpp == 24) + { + const uint32_t pal_size = hdr.m_cmap_len * 3; + if (bytes_remaining < pal_size) + return nullptr; + + for (uint32_t i = 0; i < hdr.m_cmap_len; i++) + { + pal[i].r = pSrc[i * 3 + 2]; + pal[i].g = pSrc[i * 3 + 1]; + pal[i].b = pSrc[i * 3 + 0]; + pal[i].a = 255; + } + + bytes_remaining -= pal_size; + pSrc += pal_size; + } + else + { + const uint32_t pal_size = hdr.m_cmap_len * 2; + if (bytes_remaining < pal_size) + return nullptr; + + for (uint32_t i = 0; i < hdr.m_cmap_len; i++) + { + const uint32_t v = pSrc[i * 2 + 0] | (pSrc[i * 2 + 1] << 8); + + pal[i].r = (((v >> 10) & 31) * 255 + 15) / 31; + pal[i].g = (((v >> 5) & 31) * 255 + 15) / 31; + pal[i].b = ((v & 31) * 255 + 15) / 31; + pal[i].a = 255; + } + + bytes_remaining -= pal_size; + pSrc += pal_size; + } + } + else + { + const uint32_t bytes_to_skip = (hdr.m_cmap_bpp >> 3) * hdr.m_cmap_len; + if (bytes_remaining < bytes_to_skip) + return nullptr; + pSrc += bytes_to_skip; + bytes_remaining += bytes_to_skip; + } + } + + width = hdr.m_width; + height = hdr.m_height; + + const uint32_t source_pitch = width * tga_bytes_per_pixel; + const uint32_t dest_pitch = width * n_chans; + + uint8_t *pImage = (uint8_t *)malloc(dest_pitch * height); + if (!pImage) + return nullptr; + + std::vector input_line_buf; + if (rle_flag) + input_line_buf.resize(source_pitch); + + int run_type = 0, run_remaining = 0; + uint8_t run_pixel[4]; + memset(run_pixel, 0, sizeof(run_pixel)); + + for (int y = 0; y < height; y++) + { + const uint8_t *pLine_data; + + if (rle_flag) + { + int pixels_remaining = width; + uint8_t *pDst = &input_line_buf[0]; + + do + { + if (!run_remaining) + { + if (bytes_remaining < 1) + { + free(pImage); + return nullptr; + } + + int v = *pSrc++; + bytes_remaining--; + + run_type = v & 0x80; + run_remaining = (v & 0x7F) + 1; + + if (run_type) + { + if (bytes_remaining < tga_bytes_per_pixel) + { + free(pImage); + return nullptr; + } + + memcpy(run_pixel, pSrc, tga_bytes_per_pixel); + pSrc += tga_bytes_per_pixel; + bytes_remaining -= tga_bytes_per_pixel; + } + } + + const uint32_t n = basisu::minimum(pixels_remaining, run_remaining); + pixels_remaining -= n; + run_remaining -= n; + + if (run_type) + { + for (uint32_t i = 0; i < n; i++) + for (uint32_t j = 0; j < tga_bytes_per_pixel; j++) + *pDst++ = run_pixel[j]; + } + else + { + const uint32_t bytes_wanted = n * tga_bytes_per_pixel; + + if (bytes_remaining < bytes_wanted) + { + free(pImage); + return nullptr; + } + + memcpy(pDst, pSrc, bytes_wanted); + pDst += bytes_wanted; + + pSrc += bytes_wanted; + bytes_remaining -= bytes_wanted; + } + + } while (pixels_remaining); + + assert((pDst - &input_line_buf[0]) == width * tga_bytes_per_pixel); + + pLine_data = &input_line_buf[0]; + } + else + { + if (bytes_remaining < source_pitch) + { + free(pImage); + return nullptr; + } + + pLine_data = pSrc; + bytes_remaining -= source_pitch; + pSrc += source_pitch; + } + + // Convert to 24bpp RGB or 32bpp RGBA. + uint8_t *pDst = pImage + (y_flipped ? (height - 1 - y) : y) * dest_pitch + (x_flipped ? (width - 1) * n_chans : 0); + const int dst_stride = x_flipped ? -((int)n_chans) : n_chans; + + switch (hdr.m_depth) + { + case 32: + assert(tga_bytes_per_pixel == 4 && n_chans == 4); + for (int i = 0; i < width; i++, pLine_data += 4, pDst += dst_stride) + { + pDst[0] = pLine_data[2]; + pDst[1] = pLine_data[1]; + pDst[2] = pLine_data[0]; + pDst[3] = pLine_data[3]; + } + break; + case 24: + assert(tga_bytes_per_pixel == 3 && n_chans == 3); + for (int i = 0; i < width; i++, pLine_data += 3, pDst += dst_stride) + { + pDst[0] = pLine_data[2]; + pDst[1] = pLine_data[1]; + pDst[2] = pLine_data[0]; + } + break; + case 16: + case 15: + if (image_type == cITRGB) + { + assert(tga_bytes_per_pixel == 2 && n_chans == 3); + for (int i = 0; i < width; i++, pLine_data += 2, pDst += dst_stride) + { + const uint32_t v = pLine_data[0] | (pLine_data[1] << 8); + pDst[0] = (((v >> 10) & 31) * 255 + 15) / 31; + pDst[1] = (((v >> 5) & 31) * 255 + 15) / 31; + pDst[2] = ((v & 31) * 255 + 15) / 31; + } + } + else + { + assert(image_type == cITGrayscale && tga_bytes_per_pixel == 2 && n_chans == 4); + for (int i = 0; i < width; i++, pLine_data += 2, pDst += dst_stride) + { + pDst[0] = pLine_data[0]; + pDst[1] = pLine_data[0]; + pDst[2] = pLine_data[0]; + pDst[3] = pLine_data[1]; + } + } + break; + case 8: + assert(tga_bytes_per_pixel == 1); + if (image_type == cITPalettized) + { + if (hdr.m_cmap_bpp == 32) + { + assert(n_chans == 4); + for (int i = 0; i < width; i++, pLine_data++, pDst += dst_stride) + { + const uint32_t c = *pLine_data; + pDst[0] = pal[c].r; + pDst[1] = pal[c].g; + pDst[2] = pal[c].b; + pDst[3] = pal[c].a; + } + } + else + { + assert(n_chans == 3); + for (int i = 0; i < width; i++, pLine_data++, pDst += dst_stride) + { + const uint32_t c = *pLine_data; + pDst[0] = pal[c].r; + pDst[1] = pal[c].g; + pDst[2] = pal[c].b; + } + } + } + else + { + assert(n_chans == 3); + for (int i = 0; i < width; i++, pLine_data++, pDst += dst_stride) + { + const uint8_t c = *pLine_data; + pDst[0] = c; + pDst[1] = c; + pDst[2] = c; + } + } + break; + default: + assert(0); + break; + } + } // y + + return pImage; + } + + uint8_t *read_tga(const char *pFilename, int &width, int &height, int &n_chans) + { + width = height = n_chans = 0; + + uint8_vec filedata; + if (!read_file_to_vec(pFilename, filedata)) + return nullptr; + + if (!filedata.size() || (filedata.size() > UINT32_MAX)) + return nullptr; + + return read_tga(&filedata[0], (uint32_t)filedata.size(), width, height, n_chans); + } +#endif + void image::debug_text(uint32_t x_ofs, uint32_t y_ofs, uint32_t scale_x, uint32_t scale_y, const color_rgba& fg, const color_rgba* pBG, bool alpha_only, const char* pFmt, ...) + { + char buf[2048]; + + va_list args; + va_start(args, pFmt); +#ifdef _WIN32 + vsprintf_s(buf, sizeof(buf), pFmt, args); +#else + vsnprintf(buf, sizeof(buf), pFmt, args); +#endif + va_end(args); + + const char* p = buf; + + const uint32_t orig_x_ofs = x_ofs; + + while (*p) + { + uint8_t c = *p++; + if ((c < 32) || (c > 127)) + c = '.'; + + const uint8_t* pGlpyh = &g_debug_font8x8_basic[c - 32][0]; + + for (uint32_t y = 0; y < 8; y++) + { + uint32_t row_bits = pGlpyh[y]; + for (uint32_t x = 0; x < 8; x++) + { + const uint32_t q = row_bits & (1 << x); + + const color_rgba* pColor = q ? &fg : pBG; + if (!pColor) + continue; + + if (alpha_only) + fill_box_alpha(x_ofs + x * scale_x, y_ofs + y * scale_y, scale_x, scale_y, *pColor); + else + fill_box(x_ofs + x * scale_x, y_ofs + y * scale_y, scale_x, scale_y, *pColor); + } + } + + x_ofs += 8 * scale_x; + if ((x_ofs + 8 * scale_x) > m_width) + { + x_ofs = orig_x_ofs; + y_ofs += 8 * scale_y; + } + } + } + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_enc.h b/ktx/external/basisu/encoder/basisu_enc.h new file mode 100644 index 0000000..0efeaa4 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_enc.h @@ -0,0 +1,3456 @@ +// basisu_enc.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once +#include "../transcoder/basisu.h" +#include "../transcoder/basisu_transcoder_internal.h" + +#include +#include +#include +#include +#include +#include +#include + +#if !defined(_WIN32) || defined(__MINGW32__) +#include +#endif + +// This module is really just a huge grab bag of classes and helper functions needed by the encoder. + +// If BASISU_USE_HIGH_PRECISION_COLOR_DISTANCE is 1, quality in perceptual mode will be slightly greater, but at a large increase in encoding CPU time. +#define BASISU_USE_HIGH_PRECISION_COLOR_DISTANCE (0) + +#if BASISU_SUPPORT_SSE +// Declared in basisu_kernels_imp.h, but we can't include that here otherwise it would lead to circular type errors. +extern void update_covar_matrix_16x16_sse41(uint32_t num_vecs, const void* pWeighted_vecs, const void* pOrigin, const uint32_t *pVec_indices, void* pMatrix16x16); +#endif + +namespace basisu +{ + extern uint8_t g_hamming_dist[256]; + extern const uint8_t g_debug_font8x8_basic[127 - 32 + 1][8]; + + // true if basisu_encoder_init() has been called and returned. + extern bool g_library_initialized; + + // Encoder library initialization. + // This function MUST be called before encoding anything! + void basisu_encoder_init(bool use_opencl = false, bool opencl_force_serialization = false); + void basisu_encoder_deinit(); + + // basisu_kernels_sse.cpp - will be a no-op and g_cpu_supports_sse41 will always be false unless compiled with BASISU_SUPPORT_SSE=1 + extern void detect_sse41(); + +#if BASISU_SUPPORT_SSE + extern bool g_cpu_supports_sse41; +#else + const bool g_cpu_supports_sse41 = false; +#endif + + void error_vprintf(const char* pFmt, va_list args); + void error_printf(const char *pFmt, ...); + + // Helpers + + inline uint8_t clamp255(int32_t i) + { + return (uint8_t)((i & 0xFFFFFF00U) ? (~(i >> 31)) : i); + } + + inline int32_t clampi(int32_t value, int32_t low, int32_t high) + { + if (value < low) + value = low; + else if (value > high) + value = high; + return value; + } + + inline uint8_t mul_8(uint32_t v, uint32_t a) + { + v = v * a + 128; + return (uint8_t)((v + (v >> 8)) >> 8); + } + + inline uint64_t read_bits(const uint8_t* pBuf, uint32_t& bit_offset, uint32_t codesize) + { + assert(codesize <= 64); + uint64_t bits = 0; + uint32_t total_bits = 0; + + while (total_bits < codesize) + { + uint32_t byte_bit_offset = bit_offset & 7; + uint32_t bits_to_read = minimum(codesize - total_bits, 8 - byte_bit_offset); + + uint32_t byte_bits = pBuf[bit_offset >> 3] >> byte_bit_offset; + byte_bits &= ((1 << bits_to_read) - 1); + + bits |= ((uint64_t)(byte_bits) << total_bits); + + total_bits += bits_to_read; + bit_offset += bits_to_read; + } + + return bits; + } + + inline uint32_t read_bits32(const uint8_t* pBuf, uint32_t& bit_offset, uint32_t codesize) + { + assert(codesize <= 32); + uint32_t bits = 0; + uint32_t total_bits = 0; + + while (total_bits < codesize) + { + uint32_t byte_bit_offset = bit_offset & 7; + uint32_t bits_to_read = minimum(codesize - total_bits, 8 - byte_bit_offset); + + uint32_t byte_bits = pBuf[bit_offset >> 3] >> byte_bit_offset; + byte_bits &= ((1 << bits_to_read) - 1); + + bits |= (byte_bits << total_bits); + + total_bits += bits_to_read; + bit_offset += bits_to_read; + } + + return bits; + } + + // Hashing + + inline uint32_t bitmix32c(uint32_t v) + { + v = (v + 0x7ed55d16) + (v << 12); + v = (v ^ 0xc761c23c) ^ (v >> 19); + v = (v + 0x165667b1) + (v << 5); + v = (v + 0xd3a2646c) ^ (v << 9); + v = (v + 0xfd7046c5) + (v << 3); + v = (v ^ 0xb55a4f09) ^ (v >> 16); + return v; + } + + inline uint32_t bitmix32(uint32_t v) + { + v -= (v << 6); + v ^= (v >> 17); + v -= (v << 9); + v ^= (v << 4); + v -= (v << 3); + v ^= (v << 10); + v ^= (v >> 15); + return v; + } + + inline uint32_t wang_hash(uint32_t seed) + { + seed = (seed ^ 61) ^ (seed >> 16); + seed *= 9; + seed = seed ^ (seed >> 4); + seed *= 0x27d4eb2d; + seed = seed ^ (seed >> 15); + return seed; + } + + uint32_t hash_hsieh(const uint8_t* pBuf, size_t len); + + template + struct bit_hasher + { + std::size_t operator()(const Key& k) const + { + return hash_hsieh(reinterpret_cast(&k), sizeof(k)); + } + }; + + class running_stat + { + public: + running_stat() { clear(); } + + void clear() + { + m_n = 0; + m_total = 0; + m_old_m = 0; + m_new_m = 0; + m_old_s = 0; + m_new_s = 0; + m_min = 0; + m_max = 0; + } + + void push(double x) + { + m_n++; + m_total += x; + if (m_n == 1) + { + m_old_m = m_new_m = x; + m_old_s = 0.0; + m_min = x; + m_max = x; + } + else + { + // See Knuth TAOCP vol 2, 3rd edition, page 232 + m_new_m = m_old_m + (x - m_old_m) / m_n; + m_new_s = m_old_s + (x - m_old_m) * (x - m_new_m); + m_old_m = m_new_m; + m_old_s = m_new_s; + m_min = basisu::minimum(x, m_min); + m_max = basisu::maximum(x, m_max); + } + } + + uint32_t get_num() const + { + return m_n; + } + + double get_total() const + { + return m_total; + } + + double get_mean() const + { + return (m_n > 0) ? m_new_m : 0.0; + } + + // Returns sample variance + double get_variance() const + { + return ((m_n > 1) ? m_new_s / (m_n - 1) : 0.0); + } + + double get_std_dev() const + { + return sqrt(get_variance()); + } + + double get_min() const + { + return m_min; + } + + double get_max() const + { + return m_max; + } + + private: + uint32_t m_n; + double m_total, m_old_m, m_new_m, m_old_s, m_new_s, m_min, m_max; + }; + + // Linear algebra + + template + class vec + { + protected: + T m_v[N]; + + public: + enum { num_elements = N }; + + inline vec() { } + inline vec(eZero) { set_zero(); } + + explicit inline vec(T val) { set(val); } + inline vec(T v0, T v1) { set(v0, v1); } + inline vec(T v0, T v1, T v2) { set(v0, v1, v2); } + inline vec(T v0, T v1, T v2, T v3) { set(v0, v1, v2, v3); } + inline vec(const vec &other) { for (uint32_t i = 0; i < N; i++) m_v[i] = other.m_v[i]; } + template inline vec(const vec &other) { set(other); } + + inline T operator[](uint32_t i) const { assert(i < N); return m_v[i]; } + inline T &operator[](uint32_t i) { assert(i < N); return m_v[i]; } + + inline T getX() const { return m_v[0]; } + inline T getY() const { static_assert(N >= 2, "N too small"); return m_v[1]; } + inline T getZ() const { static_assert(N >= 3, "N too small"); return m_v[2]; } + inline T getW() const { static_assert(N >= 4, "N too small"); return m_v[3]; } + + inline bool operator==(const vec &rhs) const { for (uint32_t i = 0; i < N; i++) if (m_v[i] != rhs.m_v[i]) return false; return true; } + inline bool operator<(const vec &rhs) const { for (uint32_t i = 0; i < N; i++) { if (m_v[i] < rhs.m_v[i]) return true; else if (m_v[i] != rhs.m_v[i]) return false; } return false; } + + inline void set_zero() { for (uint32_t i = 0; i < N; i++) m_v[i] = 0; } + + template + inline vec &set(const vec &other) + { + uint32_t i; + if ((const void *)(&other) == (const void *)(this)) + return *this; + const uint32_t m = minimum(OtherN, N); + for (i = 0; i < m; i++) + m_v[i] = static_cast(other[i]); + for (; i < N; i++) + m_v[i] = 0; + return *this; + } + + inline vec &set_component(uint32_t index, T val) { assert(index < N); m_v[index] = val; return *this; } + inline vec &set(T val) { for (uint32_t i = 0; i < N; i++) m_v[i] = val; return *this; } + inline void clear_elements(uint32_t s, uint32_t e) { assert(e <= N); for (uint32_t i = s; i < e; i++) m_v[i] = 0; } + + inline vec &set(T v0, T v1) + { + m_v[0] = v0; + if (N >= 2) + { + m_v[1] = v1; + clear_elements(2, N); + } + return *this; + } + + inline vec &set(T v0, T v1, T v2) + { + m_v[0] = v0; + if (N >= 2) + { + m_v[1] = v1; + if (N >= 3) + { + m_v[2] = v2; + clear_elements(3, N); + } + } + return *this; + } + + inline vec &set(T v0, T v1, T v2, T v3) + { + m_v[0] = v0; + if (N >= 2) + { + m_v[1] = v1; + if (N >= 3) + { + m_v[2] = v2; + + if (N >= 4) + { + m_v[3] = v3; + clear_elements(5, N); + } + } + } + return *this; + } + + inline vec &operator=(const vec &rhs) { if (this != &rhs) for (uint32_t i = 0; i < N; i++) m_v[i] = rhs.m_v[i]; return *this; } + template inline vec &operator=(const vec &rhs) { set(rhs); return *this; } + + inline const T *get_ptr() const { return reinterpret_cast(&m_v[0]); } + inline T *get_ptr() { return reinterpret_cast(&m_v[0]); } + + inline vec operator- () const { vec res; for (uint32_t i = 0; i < N; i++) res.m_v[i] = -m_v[i]; return res; } + inline vec operator+ () const { return *this; } + inline vec &operator+= (const vec &other) { for (uint32_t i = 0; i < N; i++) m_v[i] += other.m_v[i]; return *this; } + inline vec &operator-= (const vec &other) { for (uint32_t i = 0; i < N; i++) m_v[i] -= other.m_v[i]; return *this; } + inline vec &operator/= (const vec &other) { for (uint32_t i = 0; i < N; i++) m_v[i] /= other.m_v[i]; return *this; } + inline vec &operator*=(const vec &other) { for (uint32_t i = 0; i < N; i++) m_v[i] *= other.m_v[i]; return *this; } + inline vec &operator/= (T s) { for (uint32_t i = 0; i < N; i++) m_v[i] /= s; return *this; } + inline vec &operator*= (T s) { for (uint32_t i = 0; i < N; i++) m_v[i] *= s; return *this; } + + friend inline vec operator+(const vec &lhs, const vec &rhs) { vec res; for (uint32_t i = 0; i < N; i++) res.m_v[i] = lhs.m_v[i] + rhs.m_v[i]; return res; } + friend inline vec operator-(const vec &lhs, const vec &rhs) { vec res; for (uint32_t i = 0; i < N; i++) res.m_v[i] = lhs.m_v[i] - rhs.m_v[i]; return res; } + friend inline vec operator*(const vec &lhs, T val) { vec res; for (uint32_t i = 0; i < N; i++) res.m_v[i] = lhs.m_v[i] * val; return res; } + friend inline vec operator*(T val, const vec &rhs) { vec res; for (uint32_t i = 0; i < N; i++) res.m_v[i] = val * rhs.m_v[i]; return res; } + friend inline vec operator/(const vec &lhs, T val) { vec res; for (uint32_t i = 0; i < N; i++) res.m_v[i] = lhs.m_v[i] / val; return res; } + friend inline vec operator/(const vec &lhs, const vec &rhs) { vec res; for (uint32_t i = 0; i < N; i++) res.m_v[i] = lhs.m_v[i] / rhs.m_v[i]; return res; } + + static inline T dot_product(const vec &lhs, const vec &rhs) { T res = lhs.m_v[0] * rhs.m_v[0]; for (uint32_t i = 1; i < N; i++) res += lhs.m_v[i] * rhs.m_v[i]; return res; } + + inline T dot(const vec &rhs) const { return dot_product(*this, rhs); } + + inline T norm() const { return dot_product(*this, *this); } + inline T length() const { return sqrt(norm()); } + + inline T squared_distance(const vec &other) const { T d2 = 0; for (uint32_t i = 0; i < N; i++) { T d = m_v[i] - other.m_v[i]; d2 += d * d; } return d2; } + inline double squared_distance_d(const vec& other) const { double d2 = 0; for (uint32_t i = 0; i < N; i++) { double d = (double)m_v[i] - (double)other.m_v[i]; d2 += d * d; } return d2; } + + inline T distance(const vec &other) const { return static_cast(sqrt(squared_distance(other))); } + inline double distance_d(const vec& other) const { return sqrt(squared_distance_d(other)); } + + inline vec &normalize_in_place() { T len = length(); if (len != 0.0f) *this *= (1.0f / len); return *this; } + + inline vec &clamp(T l, T h) + { + for (uint32_t i = 0; i < N; i++) + m_v[i] = basisu::clamp(m_v[i], l, h); + return *this; + } + + static vec component_min(const vec& a, const vec& b) + { + vec res; + for (uint32_t i = 0; i < N; i++) + res[i] = minimum(a[i], b[i]); + return res; + } + + static vec component_max(const vec& a, const vec& b) + { + vec res; + for (uint32_t i = 0; i < N; i++) + res[i] = maximum(a[i], b[i]); + return res; + } + }; + + typedef vec<4, double> vec4D; + typedef vec<3, double> vec3D; + typedef vec<2, double> vec2D; + typedef vec<1, double> vec1D; + + typedef vec<4, float> vec4F; + typedef vec<3, float> vec3F; + typedef vec<2, float> vec2F; + typedef vec<1, float> vec1F; + + typedef vec<16, float> vec16F; + + template + class matrix + { + public: + typedef vec col_vec; + typedef vec row_vec; + + typedef T scalar_type; + + enum { rows = Rows, cols = Cols }; + + protected: + row_vec m_r[Rows]; + + public: + inline matrix() {} + inline matrix(eZero) { set_zero(); } + inline matrix(const matrix &other) { for (uint32_t i = 0; i < Rows; i++) m_r[i] = other.m_r[i]; } + inline matrix &operator=(const matrix &rhs) { if (this != &rhs) for (uint32_t i = 0; i < Rows; i++) m_r[i] = rhs.m_r[i]; return *this; } + + inline T operator()(uint32_t r, uint32_t c) const { assert((r < Rows) && (c < Cols)); return m_r[r][c]; } + inline T &operator()(uint32_t r, uint32_t c) { assert((r < Rows) && (c < Cols)); return m_r[r][c]; } + + inline const row_vec &operator[](uint32_t r) const { assert(r < Rows); return m_r[r]; } + inline row_vec &operator[](uint32_t r) { assert(r < Rows); return m_r[r]; } + + inline matrix &set_zero() + { + for (uint32_t i = 0; i < Rows; i++) + m_r[i].set_zero(); + return *this; + } + + inline matrix &set_identity() + { + for (uint32_t i = 0; i < Rows; i++) + { + m_r[i].set_zero(); + if (i < Cols) + m_r[i][i] = 1.0f; + } + return *this; + } + }; + + template + inline VectorType compute_pca_from_covar(matrix &cmatrix) + { + VectorType axis; + if (N == 1) + axis.set(1.0f); + else + { + for (uint32_t i = 0; i < N; i++) + axis[i] = lerp(.75f, 1.25f, i * (1.0f / maximum(N - 1, 1))); + } + + VectorType prev_axis(axis); + + // Power iterations + for (uint32_t power_iter = 0; power_iter < 8; power_iter++) + { + VectorType trial_axis; + double max_sum = 0; + + for (uint32_t i = 0; i < N; i++) + { + double sum = 0; + for (uint32_t j = 0; j < N; j++) + sum += cmatrix[i][j] * axis[j]; + + trial_axis[i] = static_cast(sum); + + max_sum = maximum(fabs(sum), max_sum); + } + + if (max_sum != 0.0f) + trial_axis *= static_cast(1.0f / max_sum); + + VectorType delta_axis(prev_axis - trial_axis); + + prev_axis = axis; + axis = trial_axis; + + if (delta_axis.norm() < .0024f) + break; + } + + return axis.normalize_in_place(); + } + + template inline void indirect_sort(uint32_t num_indices, uint32_t* pIndices, const T* pKeys) + { + for (uint32_t i = 0; i < num_indices; i++) + pIndices[i] = i; + + std::sort( + pIndices, + pIndices + num_indices, + [pKeys](uint32_t a, uint32_t b) { return pKeys[a] < pKeys[b]; } + ); + } + + // 1-4 byte direct Radix sort. + template + T* radix_sort(uint32_t num_vals, T* pBuf0, T* pBuf1, uint32_t key_ofs, uint32_t key_size) + { + assert(key_ofs < sizeof(T)); + assert((key_size >= 1) && (key_size <= 4)); + + uint32_t hist[256 * 4]; + + memset(hist, 0, sizeof(hist[0]) * 256 * key_size); + +#define BASISU_GET_KEY(p) (*(uint32_t *)((uint8_t *)(p) + key_ofs)) + + if (key_size == 4) + { + T* p = pBuf0; + T* q = pBuf0 + num_vals; + for (; p != q; p++) + { + const uint32_t key = BASISU_GET_KEY(p); + + hist[key & 0xFF]++; + hist[256 + ((key >> 8) & 0xFF)]++; + hist[512 + ((key >> 16) & 0xFF)]++; + hist[768 + ((key >> 24) & 0xFF)]++; + } + } + else if (key_size == 3) + { + T* p = pBuf0; + T* q = pBuf0 + num_vals; + for (; p != q; p++) + { + const uint32_t key = BASISU_GET_KEY(p); + + hist[key & 0xFF]++; + hist[256 + ((key >> 8) & 0xFF)]++; + hist[512 + ((key >> 16) & 0xFF)]++; + } + } + else if (key_size == 2) + { + T* p = pBuf0; + T* q = pBuf0 + (num_vals >> 1) * 2; + + for (; p != q; p += 2) + { + const uint32_t key0 = BASISU_GET_KEY(p); + const uint32_t key1 = BASISU_GET_KEY(p + 1); + + hist[key0 & 0xFF]++; + hist[256 + ((key0 >> 8) & 0xFF)]++; + + hist[key1 & 0xFF]++; + hist[256 + ((key1 >> 8) & 0xFF)]++; + } + + if (num_vals & 1) + { + const uint32_t key = BASISU_GET_KEY(p); + + hist[key & 0xFF]++; + hist[256 + ((key >> 8) & 0xFF)]++; + } + } + else + { + assert(key_size == 1); + if (key_size != 1) + return NULL; + + T* p = pBuf0; + T* q = pBuf0 + (num_vals >> 1) * 2; + + for (; p != q; p += 2) + { + const uint32_t key0 = BASISU_GET_KEY(p); + const uint32_t key1 = BASISU_GET_KEY(p + 1); + + hist[key0 & 0xFF]++; + hist[key1 & 0xFF]++; + } + + if (num_vals & 1) + { + const uint32_t key = BASISU_GET_KEY(p); + hist[key & 0xFF]++; + } + } + + T* pCur = pBuf0; + T* pNew = pBuf1; + + for (uint32_t pass = 0; pass < key_size; pass++) + { + const uint32_t* pHist = &hist[pass << 8]; + + uint32_t offsets[256]; + + uint32_t cur_ofs = 0; + for (uint32_t i = 0; i < 256; i += 2) + { + offsets[i] = cur_ofs; + cur_ofs += pHist[i]; + + offsets[i + 1] = cur_ofs; + cur_ofs += pHist[i + 1]; + } + + const uint32_t pass_shift = pass << 3; + + T* p = pCur; + T* q = pCur + (num_vals >> 1) * 2; + + for (; p != q; p += 2) + { + uint32_t c0 = (BASISU_GET_KEY(p) >> pass_shift) & 0xFF; + uint32_t c1 = (BASISU_GET_KEY(p + 1) >> pass_shift) & 0xFF; + + if (c0 == c1) + { + uint32_t dst_offset0 = offsets[c0]; + + offsets[c0] = dst_offset0 + 2; + + pNew[dst_offset0] = p[0]; + pNew[dst_offset0 + 1] = p[1]; + } + else + { + uint32_t dst_offset0 = offsets[c0]++; + uint32_t dst_offset1 = offsets[c1]++; + + pNew[dst_offset0] = p[0]; + pNew[dst_offset1] = p[1]; + } + } + + if (num_vals & 1) + { + uint32_t c = (BASISU_GET_KEY(p) >> pass_shift) & 0xFF; + + uint32_t dst_offset = offsets[c]; + offsets[c] = dst_offset + 1; + + pNew[dst_offset] = *p; + } + + T* t = pCur; + pCur = pNew; + pNew = t; + } + + return pCur; + } + +#undef BASISU_GET_KEY + + // Very simple job pool with no dependencies. + class job_pool + { + BASISU_NO_EQUALS_OR_COPY_CONSTRUCT(job_pool); + + public: + // num_threads is the TOTAL number of job pool threads, including the calling thread! So 2=1 new thread, 3=2 new threads, etc. + job_pool(uint32_t num_threads); + ~job_pool(); + + void add_job(const std::function& job); + void add_job(std::function&& job); + + void wait_for_all(); + + size_t get_total_threads() const { return 1 + m_threads.size(); } + + private: + std::vector m_threads; + std::vector > m_queue; + + std::mutex m_mutex; + std::condition_variable m_has_work; + std::condition_variable m_no_more_jobs; + + uint32_t m_num_active_jobs; + + std::atomic m_kill_flag; + + void job_thread(uint32_t index); + }; + + // Simple 32-bit color class + + class color_rgba_i16 + { + public: + union + { + int16_t m_comps[4]; + + struct + { + int16_t r; + int16_t g; + int16_t b; + int16_t a; + }; + }; + + inline color_rgba_i16() + { + static_assert(sizeof(*this) == sizeof(int16_t)*4, "sizeof(*this) == sizeof(int16_t)*4"); + } + + inline color_rgba_i16(int sr, int sg, int sb, int sa) + { + set(sr, sg, sb, sa); + } + + inline color_rgba_i16 &set(int sr, int sg, int sb, int sa) + { + m_comps[0] = (int16_t)clamp(sr, INT16_MIN, INT16_MAX); + m_comps[1] = (int16_t)clamp(sg, INT16_MIN, INT16_MAX); + m_comps[2] = (int16_t)clamp(sb, INT16_MIN, INT16_MAX); + m_comps[3] = (int16_t)clamp(sa, INT16_MIN, INT16_MAX); + return *this; + } + }; + + class color_rgba + { + public: + union + { + uint8_t m_comps[4]; + + struct + { + uint8_t r; + uint8_t g; + uint8_t b; + uint8_t a; + }; + }; + + inline color_rgba() + { + static_assert(sizeof(*this) == 4, "sizeof(*this) != 4"); + static_assert(sizeof(*this) == sizeof(basist::color32), "sizeof(*this) != sizeof(basist::color32)"); + } + + // Not too hot about this idea. + inline color_rgba(const basist::color32& other) : + r(other.r), + g(other.g), + b(other.b), + a(other.a) + { + } + + color_rgba& operator= (const basist::color32& rhs) + { + r = rhs.r; + g = rhs.g; + b = rhs.b; + a = rhs.a; + return *this; + } + + inline color_rgba(int y) + { + set(y); + } + + inline color_rgba(int y, int na) + { + set(y, na); + } + + inline color_rgba(int sr, int sg, int sb, int sa) + { + set(sr, sg, sb, sa); + } + + inline color_rgba(eNoClamp, int sr, int sg, int sb, int sa) + { + set_noclamp_rgba((uint8_t)sr, (uint8_t)sg, (uint8_t)sb, (uint8_t)sa); + } + + inline color_rgba& set_noclamp_y(int y) + { + m_comps[0] = (uint8_t)y; + m_comps[1] = (uint8_t)y; + m_comps[2] = (uint8_t)y; + m_comps[3] = (uint8_t)255; + return *this; + } + + inline color_rgba &set_noclamp_rgba(int sr, int sg, int sb, int sa) + { + m_comps[0] = (uint8_t)sr; + m_comps[1] = (uint8_t)sg; + m_comps[2] = (uint8_t)sb; + m_comps[3] = (uint8_t)sa; + return *this; + } + + inline color_rgba &set(int y) + { + m_comps[0] = static_cast(clamp(y, 0, 255)); + m_comps[1] = m_comps[0]; + m_comps[2] = m_comps[0]; + m_comps[3] = 255; + return *this; + } + + inline color_rgba &set(int y, int na) + { + m_comps[0] = static_cast(clamp(y, 0, 255)); + m_comps[1] = m_comps[0]; + m_comps[2] = m_comps[0]; + m_comps[3] = static_cast(clamp(na, 0, 255)); + return *this; + } + + inline color_rgba &set(int sr, int sg, int sb, int sa) + { + m_comps[0] = static_cast(clamp(sr, 0, 255)); + m_comps[1] = static_cast(clamp(sg, 0, 255)); + m_comps[2] = static_cast(clamp(sb, 0, 255)); + m_comps[3] = static_cast(clamp(sa, 0, 255)); + return *this; + } + + inline color_rgba &set_rgb(int sr, int sg, int sb) + { + m_comps[0] = static_cast(clamp(sr, 0, 255)); + m_comps[1] = static_cast(clamp(sg, 0, 255)); + m_comps[2] = static_cast(clamp(sb, 0, 255)); + return *this; + } + + inline color_rgba &set_rgb(const color_rgba &other) + { + r = other.r; + g = other.g; + b = other.b; + return *this; + } + + inline const uint8_t &operator[] (uint32_t index) const { assert(index < 4); return m_comps[index]; } + inline uint8_t &operator[] (uint32_t index) { assert(index < 4); return m_comps[index]; } + + inline void clear() + { + m_comps[0] = 0; + m_comps[1] = 0; + m_comps[2] = 0; + m_comps[3] = 0; + } + + inline bool operator== (const color_rgba &rhs) const + { + if (m_comps[0] != rhs.m_comps[0]) return false; + if (m_comps[1] != rhs.m_comps[1]) return false; + if (m_comps[2] != rhs.m_comps[2]) return false; + if (m_comps[3] != rhs.m_comps[3]) return false; + return true; + } + + inline bool operator!= (const color_rgba &rhs) const + { + return !(*this == rhs); + } + + inline bool operator<(const color_rgba &rhs) const + { + for (int i = 0; i < 4; i++) + { + if (m_comps[i] < rhs.m_comps[i]) + return true; + else if (m_comps[i] != rhs.m_comps[i]) + return false; + } + return false; + } + + inline int get_601_luma() const { return (19595U * m_comps[0] + 38470U * m_comps[1] + 7471U * m_comps[2] + 32768U) >> 16U; } + inline int get_709_luma() const { return (13938U * m_comps[0] + 46869U * m_comps[1] + 4729U * m_comps[2] + 32768U) >> 16U; } + inline int get_luma(bool luma_601) const { return luma_601 ? get_601_luma() : get_709_luma(); } + + inline basist::color32 get_color32() const + { + return basist::color32(r, g, b, a); + } + + static color_rgba comp_min(const color_rgba& a, const color_rgba& b) { return color_rgba(basisu::minimum(a[0], b[0]), basisu::minimum(a[1], b[1]), basisu::minimum(a[2], b[2]), basisu::minimum(a[3], b[3])); } + static color_rgba comp_max(const color_rgba& a, const color_rgba& b) { return color_rgba(basisu::maximum(a[0], b[0]), basisu::maximum(a[1], b[1]), basisu::maximum(a[2], b[2]), basisu::maximum(a[3], b[3])); } + }; + + typedef basisu::vector color_rgba_vec; + + const color_rgba g_black_color(0, 0, 0, 255); + const color_rgba g_black_trans_color(0, 0, 0, 0); + const color_rgba g_white_color(255, 255, 255, 255); + + inline int color_distance(int r0, int g0, int b0, int r1, int g1, int b1) + { + int dr = r0 - r1, dg = g0 - g1, db = b0 - b1; + return dr * dr + dg * dg + db * db; + } + + inline int color_distance(int r0, int g0, int b0, int a0, int r1, int g1, int b1, int a1) + { + int dr = r0 - r1, dg = g0 - g1, db = b0 - b1, da = a0 - a1; + return dr * dr + dg * dg + db * db + da * da; + } + + inline int color_distance(const color_rgba &c0, const color_rgba &c1, bool alpha) + { + if (alpha) + return color_distance(c0.r, c0.g, c0.b, c0.a, c1.r, c1.g, c1.b, c1.a); + else + return color_distance(c0.r, c0.g, c0.b, c1.r, c1.g, c1.b); + } + + // TODO: Allow user to control channel weightings. + inline uint32_t color_distance(bool perceptual, const color_rgba &e1, const color_rgba &e2, bool alpha) + { + if (perceptual) + { +#if BASISU_USE_HIGH_PRECISION_COLOR_DISTANCE + const float l1 = e1.r * .2126f + e1.g * .715f + e1.b * .0722f; + const float l2 = e2.r * .2126f + e2.g * .715f + e2.b * .0722f; + + const float cr1 = e1.r - l1; + const float cr2 = e2.r - l2; + + const float cb1 = e1.b - l1; + const float cb2 = e2.b - l2; + + const float dl = l1 - l2; + const float dcr = cr1 - cr2; + const float dcb = cb1 - cb2; + + uint32_t d = static_cast(32.0f*4.0f*dl*dl + 32.0f*2.0f*(.5f / (1.0f - .2126f))*(.5f / (1.0f - .2126f))*dcr*dcr + 32.0f*.25f*(.5f / (1.0f - .0722f))*(.5f / (1.0f - .0722f))*dcb*dcb); + + if (alpha) + { + int da = static_cast(e1.a) - static_cast(e2.a); + d += static_cast(128.0f*da*da); + } + + return d; +#elif 1 + int dr = e1.r - e2.r; + int dg = e1.g - e2.g; + int db = e1.b - e2.b; + +#if 0 + int delta_l = dr * 27 + dg * 92 + db * 9; + int delta_cr = dr * 128 - delta_l; + int delta_cb = db * 128 - delta_l; + + uint32_t id = ((uint32_t)(delta_l * delta_l) >> 7U) + + ((((uint32_t)(delta_cr * delta_cr) >> 7U) * 26U) >> 7U) + + ((((uint32_t)(delta_cb * delta_cb) >> 7U) * 3U) >> 7U); +#else + int64_t delta_l = dr * 27 + dg * 92 + db * 9; + int64_t delta_cr = dr * 128 - delta_l; + int64_t delta_cb = db * 128 - delta_l; + + uint32_t id = ((uint32_t)((delta_l * delta_l) >> 7U)) + + ((((uint32_t)((delta_cr * delta_cr) >> 7U)) * 26U) >> 7U) + + ((((uint32_t)((delta_cb * delta_cb) >> 7U)) * 3U) >> 7U); +#endif + + if (alpha) + { + int da = (e1.a - e2.a) << 7; + // This shouldn't overflow if da is 255 or -255: 29.99 bits after squaring. + id += ((uint32_t)(da * da) >> 7U); + } + + return id; +#else + int dr = e1.r - e2.r; + int dg = e1.g - e2.g; + int db = e1.b - e2.b; + + int64_t delta_l = dr * 27 + dg * 92 + db * 9; + int64_t delta_cr = dr * 128 - delta_l; + int64_t delta_cb = db * 128 - delta_l; + + int64_t id = ((delta_l * delta_l) * 128) + + ((delta_cr * delta_cr) * 26) + + ((delta_cb * delta_cb) * 3); + + if (alpha) + { + int64_t da = (e1.a - e2.a); + id += (da * da) * 128; + } + + int d = (id + 8192) >> 14; + + return d; +#endif + } + else + return color_distance(e1, e2, alpha); + } + + static inline uint32_t color_distance_la(const color_rgba& a, const color_rgba& b) + { + const int dl = a.r - b.r; + const int da = a.a - b.a; + return dl * dl + da * da; + } + + // String helpers + + inline int string_find_right(const std::string& filename, char c) + { + size_t result = filename.find_last_of(c); + return (result == std::string::npos) ? -1 : (int)result; + } + + inline std::string string_get_extension(const std::string &filename) + { + int sep = -1; +#ifdef _WIN32 + sep = string_find_right(filename, '\\'); +#endif + if (sep < 0) + sep = string_find_right(filename, '/'); + + int dot = string_find_right(filename, '.'); + if (dot <= sep) + return ""; + + std::string result(filename); + result.erase(0, dot + 1); + + return result; + } + + inline bool string_remove_extension(std::string &filename) + { + int sep = -1; +#ifdef _WIN32 + sep = string_find_right(filename, '\\'); +#endif + if (sep < 0) + sep = string_find_right(filename, '/'); + + int dot = string_find_right(filename, '.'); + if ((dot < sep) || (dot < 0)) + return false; + + filename.resize(dot); + + return true; + } + + inline std::string string_format(const char* pFmt, ...) + { + char buf[2048]; + + va_list args; + va_start(args, pFmt); +#ifdef _WIN32 + vsprintf_s(buf, sizeof(buf), pFmt, args); +#else + vsnprintf(buf, sizeof(buf), pFmt, args); +#endif + va_end(args); + + return std::string(buf); + } + + inline std::string string_tolower(const std::string& s) + { + std::string result(s); + for (size_t i = 0; i < result.size(); i++) + result[i] = (char)tolower((int)result[i]); + return result; + } + + inline char *strcpy_safe(char *pDst, size_t dst_len, const char *pSrc) + { + assert(pDst && pSrc && dst_len); + if (!dst_len) + return pDst; + + const size_t src_len = strlen(pSrc); + const size_t src_len_plus_terminator = src_len + 1; + + if (src_len_plus_terminator <= dst_len) + memcpy(pDst, pSrc, src_len_plus_terminator); + else + { + if (dst_len > 1) + memcpy(pDst, pSrc, dst_len - 1); + pDst[dst_len - 1] = '\0'; + } + + return pDst; + } + + inline bool string_ends_with(const std::string& s, char c) + { + return (s.size() != 0) && (s.back() == c); + } + + inline bool string_split_path(const char *p, std::string *pDrive, std::string *pDir, std::string *pFilename, std::string *pExt) + { +#ifdef _MSC_VER + char drive_buf[_MAX_DRIVE] = { 0 }; + char dir_buf[_MAX_DIR] = { 0 }; + char fname_buf[_MAX_FNAME] = { 0 }; + char ext_buf[_MAX_EXT] = { 0 }; + + errno_t error = _splitpath_s(p, + pDrive ? drive_buf : NULL, pDrive ? _MAX_DRIVE : 0, + pDir ? dir_buf : NULL, pDir ? _MAX_DIR : 0, + pFilename ? fname_buf : NULL, pFilename ? _MAX_FNAME : 0, + pExt ? ext_buf : NULL, pExt ? _MAX_EXT : 0); + if (error != 0) + return false; + + if (pDrive) *pDrive = drive_buf; + if (pDir) *pDir = dir_buf; + if (pFilename) *pFilename = fname_buf; + if (pExt) *pExt = ext_buf; + return true; +#else + char dirtmp[1024], nametmp[1024]; + strcpy_safe(dirtmp, sizeof(dirtmp), p); + strcpy_safe(nametmp, sizeof(nametmp), p); + + if (pDrive) + pDrive->resize(0); + + const char *pDirName = dirname(dirtmp); + const char* pBaseName = basename(nametmp); + if ((!pDirName) || (!pBaseName)) + return false; + + if (pDir) + { + *pDir = pDirName; + if ((pDir->size()) && (pDir->back() != '/')) + *pDir += "/"; + } + + if (pFilename) + { + *pFilename = pBaseName; + string_remove_extension(*pFilename); + } + + if (pExt) + { + *pExt = pBaseName; + *pExt = string_get_extension(*pExt); + if (pExt->size()) + *pExt = "." + *pExt; + } + + return true; +#endif + } + + inline bool is_path_separator(char c) + { +#ifdef _WIN32 + return (c == '/') || (c == '\\'); +#else + return (c == '/'); +#endif + } + + inline bool is_drive_separator(char c) + { +#ifdef _WIN32 + return (c == ':'); +#else + (void)c; + return false; +#endif + } + + inline void string_combine_path(std::string &dst, const char *p, const char *q) + { + std::string temp(p); + if (temp.size() && !is_path_separator(q[0])) + { + if (!is_path_separator(temp.back())) + temp.append(1, BASISU_PATH_SEPERATOR_CHAR); + } + temp += q; + dst.swap(temp); + } + + inline void string_combine_path(std::string &dst, const char *p, const char *q, const char *r) + { + string_combine_path(dst, p, q); + string_combine_path(dst, dst.c_str(), r); + } + + inline void string_combine_path_and_extension(std::string &dst, const char *p, const char *q, const char *r, const char *pExt) + { + string_combine_path(dst, p, q, r); + if ((!string_ends_with(dst, '.')) && (pExt[0]) && (pExt[0] != '.')) + dst.append(1, '.'); + dst.append(pExt); + } + + inline bool string_get_pathname(const char *p, std::string &path) + { + std::string temp_drive, temp_path; + if (!string_split_path(p, &temp_drive, &temp_path, NULL, NULL)) + return false; + string_combine_path(path, temp_drive.c_str(), temp_path.c_str()); + return true; + } + + inline bool string_get_filename(const char *p, std::string &filename) + { + std::string temp_ext; + if (!string_split_path(p, nullptr, nullptr, &filename, &temp_ext)) + return false; + filename += temp_ext; + return true; + } + + class rand + { + std::mt19937 m_mt; + + public: + rand() { } + + rand(uint32_t s) { seed(s); } + void seed(uint32_t s) { m_mt.seed(s); } + + // between [l,h] + int irand(int l, int h) { std::uniform_int_distribution d(l, h); return d(m_mt); } + + uint32_t urand32() { return static_cast(irand(INT32_MIN, INT32_MAX)); } + + bool bit() { return irand(0, 1) == 1; } + + uint8_t byte() { return static_cast(urand32()); } + + // between [l,h) + float frand(float l, float h) { std::uniform_real_distribution d(l, h); return d(m_mt); } + + float gaussian(float mean, float stddev) { std::normal_distribution d(mean, stddev); return d(m_mt); } + }; + + class priority_queue + { + public: + priority_queue() : + m_size(0) + { + } + + void clear() + { + m_heap.clear(); + m_size = 0; + } + + void init(uint32_t max_entries, uint32_t first_index, float first_priority) + { + m_heap.resize(max_entries + 1); + m_heap[1].m_index = first_index; + m_heap[1].m_priority = first_priority; + m_size = 1; + } + + inline uint32_t size() const { return m_size; } + + inline uint32_t get_top_index() const { return m_heap[1].m_index; } + inline float get_top_priority() const { return m_heap[1].m_priority; } + + inline void delete_top() + { + assert(m_size > 0); + m_heap[1] = m_heap[m_size]; + m_size--; + if (m_size) + down_heap(1); + } + + inline void add_heap(uint32_t index, float priority) + { + m_size++; + + uint32_t k = m_size; + + if (m_size >= m_heap.size()) + m_heap.resize(m_size + 1); + + for (;;) + { + uint32_t parent_index = k >> 1; + if ((!parent_index) || (m_heap[parent_index].m_priority > priority)) + break; + m_heap[k] = m_heap[parent_index]; + k = parent_index; + } + + m_heap[k].m_index = index; + m_heap[k].m_priority = priority; + } + + private: + struct entry + { + uint32_t m_index; + float m_priority; + }; + + basisu::vector m_heap; + uint32_t m_size; + + // Push down entry at index + inline void down_heap(uint32_t heap_index) + { + uint32_t orig_index = m_heap[heap_index].m_index; + const float orig_priority = m_heap[heap_index].m_priority; + + uint32_t child_index; + while ((child_index = (heap_index << 1)) <= m_size) + { + if ((child_index < m_size) && (m_heap[child_index].m_priority < m_heap[child_index + 1].m_priority)) ++child_index; + if (orig_priority > m_heap[child_index].m_priority) + break; + m_heap[heap_index] = m_heap[child_index]; + heap_index = child_index; + } + + m_heap[heap_index].m_index = orig_index; + m_heap[heap_index].m_priority = orig_priority; + } + }; + + // Tree structured vector quantization (TSVQ) + + template + class tree_vector_quant + { + public: + typedef TrainingVectorType training_vec_type; + typedef std::pair training_vec_with_weight; + typedef basisu::vector< training_vec_with_weight > array_of_weighted_training_vecs; + + tree_vector_quant() : + m_next_codebook_index(0) + { + } + + void clear() + { + clear_vector(m_training_vecs); + clear_vector(m_nodes); + m_next_codebook_index = 0; + } + + void add_training_vec(const TrainingVectorType &v, uint64_t weight) { m_training_vecs.push_back(std::make_pair(v, weight)); } + + size_t get_total_training_vecs() const { return m_training_vecs.size(); } + const array_of_weighted_training_vecs &get_training_vecs() const { return m_training_vecs; } + array_of_weighted_training_vecs &get_training_vecs() { return m_training_vecs; } + + void retrieve(basisu::vector< basisu::vector > &codebook) const + { + for (uint32_t i = 0; i < m_nodes.size(); i++) + { + const tsvq_node &n = m_nodes[i]; + if (!n.is_leaf()) + continue; + + codebook.resize(codebook.size() + 1); + codebook.back() = n.m_training_vecs; + } + } + + void retrieve(basisu::vector &codebook) const + { + for (uint32_t i = 0; i < m_nodes.size(); i++) + { + const tsvq_node &n = m_nodes[i]; + if (!n.is_leaf()) + continue; + + codebook.resize(codebook.size() + 1); + codebook.back() = n.m_origin; + } + } + + void retrieve(uint32_t max_clusters, basisu::vector &codebook) const + { + uint_vec node_stack; + node_stack.reserve(512); + + codebook.resize(0); + codebook.reserve(max_clusters); + + uint32_t node_index = 0; + + while (true) + { + const tsvq_node& cur = m_nodes[node_index]; + + if (cur.is_leaf() || ((2 + cur.m_codebook_index) > (int)max_clusters)) + { + codebook.resize(codebook.size() + 1); + codebook.back() = cur.m_training_vecs; + + if (node_stack.empty()) + break; + + node_index = node_stack.back(); + node_stack.pop_back(); + continue; + } + + node_stack.push_back(cur.m_right_index); + node_index = cur.m_left_index; + } + } + + bool generate(uint32_t max_size) + { + if (!m_training_vecs.size()) + return false; + + m_next_codebook_index = 0; + + clear_vector(m_nodes); + m_nodes.reserve(max_size * 2 + 1); + + m_nodes.push_back(prepare_root()); + + priority_queue var_heap; + var_heap.init(max_size, 0, m_nodes[0].m_var); + + basisu::vector l_children, r_children; + + // Now split the worst nodes + l_children.reserve(m_training_vecs.size() + 1); + r_children.reserve(m_training_vecs.size() + 1); + + uint32_t total_leaf_nodes = 1; + + //interval_timer tm; + //tm.start(); + + while ((var_heap.size()) && (total_leaf_nodes < max_size)) + { + const uint32_t node_index = var_heap.get_top_index(); + const tsvq_node &node = m_nodes[node_index]; + + assert(node.m_var == var_heap.get_top_priority()); + assert(node.is_leaf()); + + var_heap.delete_top(); + + if (node.m_training_vecs.size() > 1) + { + if (split_node(node_index, var_heap, l_children, r_children)) + { + // This removes one leaf node (making an internal node) and replaces it with two new leaves, so +1 total. + total_leaf_nodes += 1; + } + } + } + + //debug_printf("tree_vector_quant::generate %u: %3.3f secs\n", TrainingVectorType::num_elements, tm.get_elapsed_secs()); + + return true; + } + + private: + class tsvq_node + { + public: + inline tsvq_node() : m_weight(0), m_origin(cZero), m_left_index(-1), m_right_index(-1), m_codebook_index(-1) { } + + // vecs is erased + inline void set(const TrainingVectorType &org, uint64_t weight, float var, basisu::vector &vecs) { m_origin = org; m_weight = weight; m_var = var; m_training_vecs.swap(vecs); } + + inline bool is_leaf() const { return m_left_index < 0; } + + float m_var; + uint64_t m_weight; + TrainingVectorType m_origin; + int32_t m_left_index, m_right_index; + basisu::vector m_training_vecs; + int m_codebook_index; + }; + + typedef basisu::vector tsvq_node_vec; + tsvq_node_vec m_nodes; + + array_of_weighted_training_vecs m_training_vecs; + + uint32_t m_next_codebook_index; + + tsvq_node prepare_root() const + { + double ttsum = 0.0f; + + // Prepare root node containing all training vectors + tsvq_node root; + root.m_training_vecs.reserve(m_training_vecs.size()); + + for (uint32_t i = 0; i < m_training_vecs.size(); i++) + { + const TrainingVectorType &v = m_training_vecs[i].first; + const uint64_t weight = m_training_vecs[i].second; + + root.m_training_vecs.push_back(i); + + root.m_origin += (v * static_cast(weight)); + root.m_weight += weight; + + ttsum += v.dot(v) * weight; + } + + root.m_var = static_cast(ttsum - (root.m_origin.dot(root.m_origin) / root.m_weight)); + + root.m_origin *= (1.0f / root.m_weight); + + return root; + } + + bool split_node(uint32_t node_index, priority_queue &var_heap, basisu::vector &l_children, basisu::vector &r_children) + { + TrainingVectorType l_child_org, r_child_org; + uint64_t l_weight = 0, r_weight = 0; + float l_var = 0.0f, r_var = 0.0f; + + // Compute initial left/right child origins + if (!prep_split(m_nodes[node_index], l_child_org, r_child_org)) + return false; + + // Use k-means iterations to refine these children vectors + if (!refine_split(m_nodes[node_index], l_child_org, l_weight, l_var, l_children, r_child_org, r_weight, r_var, r_children)) + return false; + + // Create children + const uint32_t l_child_index = (uint32_t)m_nodes.size(), r_child_index = (uint32_t)m_nodes.size() + 1; + + m_nodes[node_index].m_left_index = l_child_index; + m_nodes[node_index].m_right_index = r_child_index; + + m_nodes[node_index].m_codebook_index = m_next_codebook_index; + m_next_codebook_index++; + + m_nodes.resize(m_nodes.size() + 2); + + tsvq_node &l_child = m_nodes[l_child_index], &r_child = m_nodes[r_child_index]; + + l_child.set(l_child_org, l_weight, l_var, l_children); + r_child.set(r_child_org, r_weight, r_var, r_children); + + if ((l_child.m_var <= 0.0f) && (l_child.m_training_vecs.size() > 1)) + { + TrainingVectorType v(m_training_vecs[l_child.m_training_vecs[0]].first); + + for (uint32_t i = 1; i < l_child.m_training_vecs.size(); i++) + { + if (!(v == m_training_vecs[l_child.m_training_vecs[i]].first)) + { + l_child.m_var = 1e-4f; + break; + } + } + } + + if ((r_child.m_var <= 0.0f) && (r_child.m_training_vecs.size() > 1)) + { + TrainingVectorType v(m_training_vecs[r_child.m_training_vecs[0]].first); + + for (uint32_t i = 1; i < r_child.m_training_vecs.size(); i++) + { + if (!(v == m_training_vecs[r_child.m_training_vecs[i]].first)) + { + r_child.m_var = 1e-4f; + break; + } + } + } + + if ((l_child.m_var > 0.0f) && (l_child.m_training_vecs.size() > 1)) + var_heap.add_heap(l_child_index, l_child.m_var); + + if ((r_child.m_var > 0.0f) && (r_child.m_training_vecs.size() > 1)) + var_heap.add_heap(r_child_index, r_child.m_var); + + return true; + } + + TrainingVectorType compute_split_axis(const tsvq_node &node) const + { + const uint32_t N = TrainingVectorType::num_elements; + + matrix cmatrix; + + if ((N != 16) || (!g_cpu_supports_sse41)) + { + cmatrix.set_zero(); + + // Compute covariance matrix from weighted input vectors + for (uint32_t i = 0; i < node.m_training_vecs.size(); i++) + { + const TrainingVectorType v(m_training_vecs[node.m_training_vecs[i]].first - node.m_origin); + const TrainingVectorType w(static_cast(m_training_vecs[node.m_training_vecs[i]].second) * v); + + for (uint32_t x = 0; x < N; x++) + for (uint32_t y = x; y < N; y++) + cmatrix[x][y] = cmatrix[x][y] + v[x] * w[y]; + } + } + else + { +#if BASISU_SUPPORT_SSE + // Specialize the case with 16x16 matrices, which are quite expensive without SIMD. + // This SSE function takes pointers to void types, so do some sanity checks. + assert(sizeof(TrainingVectorType) == sizeof(float) * 16); + assert(sizeof(training_vec_with_weight) == sizeof(std::pair)); + update_covar_matrix_16x16_sse41(node.m_training_vecs.size(), m_training_vecs.data(), &node.m_origin, node.m_training_vecs.data(), &cmatrix); +#endif + } + + const float renorm_scale = 1.0f / node.m_weight; + + for (uint32_t x = 0; x < N; x++) + for (uint32_t y = x; y < N; y++) + cmatrix[x][y] *= renorm_scale; + + // Diagonal flip + for (uint32_t x = 0; x < (N - 1); x++) + for (uint32_t y = x + 1; y < N; y++) + cmatrix[y][x] = cmatrix[x][y]; + + return compute_pca_from_covar(cmatrix); + } + + bool prep_split(const tsvq_node &node, TrainingVectorType &l_child_result, TrainingVectorType &r_child_result) const + { + //const uint32_t N = TrainingVectorType::num_elements; + + if (2 == node.m_training_vecs.size()) + { + l_child_result = m_training_vecs[node.m_training_vecs[0]].first; + r_child_result = m_training_vecs[node.m_training_vecs[1]].first; + return true; + } + + TrainingVectorType axis(compute_split_axis(node)), l_child(0.0f), r_child(0.0f); + double l_weight = 0.0f, r_weight = 0.0f; + + // Compute initial left/right children + for (uint32_t i = 0; i < node.m_training_vecs.size(); i++) + { + const float weight = (float)m_training_vecs[node.m_training_vecs[i]].second; + + const TrainingVectorType &v = m_training_vecs[node.m_training_vecs[i]].first; + + double t = (v - node.m_origin).dot(axis); + if (t >= 0.0f) + { + r_child += v * weight; + r_weight += weight; + } + else + { + l_child += v * weight; + l_weight += weight; + } + } + + if ((l_weight > 0.0f) && (r_weight > 0.0f)) + { + l_child_result = l_child * static_cast(1.0f / l_weight); + r_child_result = r_child * static_cast(1.0f / r_weight); + } + else + { + TrainingVectorType l(1e+20f); + TrainingVectorType h(-1e+20f); + for (uint32_t i = 0; i < node.m_training_vecs.size(); i++) + { + const TrainingVectorType& v = m_training_vecs[node.m_training_vecs[i]].first; + + l = TrainingVectorType::component_min(l, v); + h = TrainingVectorType::component_max(h, v); + } + + TrainingVectorType r(h - l); + + float largest_axis_v = 0.0f; + int largest_axis_index = -1; + for (uint32_t i = 0; i < TrainingVectorType::num_elements; i++) + { + if (r[i] > largest_axis_v) + { + largest_axis_v = r[i]; + largest_axis_index = i; + } + } + + if (largest_axis_index < 0) + return false; + + basisu::vector keys(node.m_training_vecs.size()); + for (uint32_t i = 0; i < node.m_training_vecs.size(); i++) + keys[i] = m_training_vecs[node.m_training_vecs[i]].first[largest_axis_index]; + + uint_vec indices(node.m_training_vecs.size()); + indirect_sort((uint32_t)node.m_training_vecs.size(), &indices[0], &keys[0]); + + l_child.set_zero(); + l_weight = 0; + + r_child.set_zero(); + r_weight = 0; + + const uint32_t half_index = (uint32_t)node.m_training_vecs.size() / 2; + for (uint32_t i = 0; i < node.m_training_vecs.size(); i++) + { + const float weight = (float)m_training_vecs[node.m_training_vecs[i]].second; + + const TrainingVectorType& v = m_training_vecs[node.m_training_vecs[i]].first; + + if (i < half_index) + { + l_child += v * weight; + l_weight += weight; + } + else + { + r_child += v * weight; + r_weight += weight; + } + } + + if ((l_weight > 0.0f) && (r_weight > 0.0f)) + { + l_child_result = l_child * static_cast(1.0f / l_weight); + r_child_result = r_child * static_cast(1.0f / r_weight); + } + else + { + l_child_result = l; + r_child_result = h; + } + } + + return true; + } + + bool refine_split(const tsvq_node &node, + TrainingVectorType &l_child, uint64_t &l_weight, float &l_var, basisu::vector &l_children, + TrainingVectorType &r_child, uint64_t &r_weight, float &r_var, basisu::vector &r_children) const + { + l_children.reserve(node.m_training_vecs.size()); + r_children.reserve(node.m_training_vecs.size()); + + float prev_total_variance = 1e+10f; + + // Refine left/right children locations using k-means iterations + const uint32_t cMaxIters = 6; + for (uint32_t iter = 0; iter < cMaxIters; iter++) + { + l_children.resize(0); + r_children.resize(0); + + TrainingVectorType new_l_child(cZero), new_r_child(cZero); + + double l_ttsum = 0.0f, r_ttsum = 0.0f; + + l_weight = 0; + r_weight = 0; + + for (uint32_t i = 0; i < node.m_training_vecs.size(); i++) + { + const TrainingVectorType &v = m_training_vecs[node.m_training_vecs[i]].first; + const uint64_t weight = m_training_vecs[node.m_training_vecs[i]].second; + + double left_dist2 = l_child.squared_distance_d(v), right_dist2 = r_child.squared_distance_d(v); + + if (left_dist2 >= right_dist2) + { + new_r_child += (v * static_cast(weight)); + r_weight += weight; + + r_ttsum += weight * v.dot(v); + r_children.push_back(node.m_training_vecs[i]); + } + else + { + new_l_child += (v * static_cast(weight)); + l_weight += weight; + + l_ttsum += weight * v.dot(v); + l_children.push_back(node.m_training_vecs[i]); + } + } + + // Node is unsplittable using the above algorithm - try something else to split it up. + if ((!l_weight) || (!r_weight)) + { + l_children.resize(0); + new_l_child.set(0.0f); + l_ttsum = 0.0f; + l_weight = 0; + + r_children.resize(0); + new_r_child.set(0.0f); + r_ttsum = 0.0f; + r_weight = 0; + + TrainingVectorType firstVec; + for (uint32_t i = 0; i < node.m_training_vecs.size(); i++) + { + const TrainingVectorType& v = m_training_vecs[node.m_training_vecs[i]].first; + const uint64_t weight = m_training_vecs[node.m_training_vecs[i]].second; + + if ((!i) || (v == firstVec)) + { + firstVec = v; + + new_r_child += (v * static_cast(weight)); + r_weight += weight; + + r_ttsum += weight * v.dot(v); + r_children.push_back(node.m_training_vecs[i]); + } + else + { + new_l_child += (v * static_cast(weight)); + l_weight += weight; + + l_ttsum += weight * v.dot(v); + l_children.push_back(node.m_training_vecs[i]); + } + } + + if ((!l_weight) || (!r_weight)) + return false; + } + + l_var = static_cast(l_ttsum - (new_l_child.dot(new_l_child) / l_weight)); + r_var = static_cast(r_ttsum - (new_r_child.dot(new_r_child) / r_weight)); + + new_l_child *= (1.0f / l_weight); + new_r_child *= (1.0f / r_weight); + + l_child = new_l_child; + r_child = new_r_child; + + float total_var = l_var + r_var; + const float cGiveupVariance = .00001f; + if (total_var < cGiveupVariance) + break; + + // Check to see if the variance has settled + const float cVarianceDeltaThresh = .00125f; + if (((prev_total_variance - total_var) / total_var) < cVarianceDeltaThresh) + break; + + prev_total_variance = total_var; + } + + return true; + } + }; + + struct weighted_block_group + { + uint64_t m_total_weight; + uint_vec m_indices; + }; + + template + bool generate_hierarchical_codebook_threaded_internal(Quantizer& q, + uint32_t max_codebook_size, uint32_t max_parent_codebook_size, + basisu::vector& codebook, + basisu::vector& parent_codebook, + uint32_t max_threads, bool limit_clusterizers, job_pool *pJob_pool) + { + codebook.resize(0); + parent_codebook.resize(0); + + if ((max_threads <= 1) || (q.get_training_vecs().size() < 256) || (max_codebook_size < max_threads * 16)) + { + if (!q.generate(max_codebook_size)) + return false; + + q.retrieve(codebook); + + if (max_parent_codebook_size) + q.retrieve(max_parent_codebook_size, parent_codebook); + + return true; + } + + const uint32_t cMaxThreads = 16; + if (max_threads > cMaxThreads) + max_threads = cMaxThreads; + + if (!q.generate(max_threads)) + return false; + + basisu::vector initial_codebook; + + q.retrieve(initial_codebook); + + if (initial_codebook.size() < max_threads) + { + codebook = initial_codebook; + + if (max_parent_codebook_size) + q.retrieve(max_parent_codebook_size, parent_codebook); + + return true; + } + + Quantizer quantizers[cMaxThreads]; + + bool success_flags[cMaxThreads]; + clear_obj(success_flags); + + basisu::vector local_clusters[cMaxThreads]; + basisu::vector local_parent_clusters[cMaxThreads]; + + for (uint32_t thread_iter = 0; thread_iter < max_threads; thread_iter++) + { +#ifndef __EMSCRIPTEN__ + pJob_pool->add_job( [thread_iter, &local_clusters, &local_parent_clusters, &success_flags, &quantizers, &initial_codebook, &q, &limit_clusterizers, &max_codebook_size, &max_threads, &max_parent_codebook_size] { +#endif + + Quantizer& lq = quantizers[thread_iter]; + uint_vec& cluster_indices = initial_codebook[thread_iter]; + + uint_vec local_to_global(cluster_indices.size()); + + for (uint32_t i = 0; i < cluster_indices.size(); i++) + { + const uint32_t global_training_vec_index = cluster_indices[i]; + local_to_global[i] = global_training_vec_index; + + lq.add_training_vec(q.get_training_vecs()[global_training_vec_index].first, q.get_training_vecs()[global_training_vec_index].second); + } + + const uint32_t max_clusters = limit_clusterizers ? ((max_codebook_size + max_threads - 1) / max_threads) : (uint32_t)lq.get_total_training_vecs(); + + success_flags[thread_iter] = lq.generate(max_clusters); + + if (success_flags[thread_iter]) + { + lq.retrieve(local_clusters[thread_iter]); + + for (uint32_t i = 0; i < local_clusters[thread_iter].size(); i++) + { + for (uint32_t j = 0; j < local_clusters[thread_iter][i].size(); j++) + local_clusters[thread_iter][i][j] = local_to_global[local_clusters[thread_iter][i][j]]; + } + + if (max_parent_codebook_size) + { + lq.retrieve((max_parent_codebook_size + max_threads - 1) / max_threads, local_parent_clusters[thread_iter]); + + for (uint32_t i = 0; i < local_parent_clusters[thread_iter].size(); i++) + { + for (uint32_t j = 0; j < local_parent_clusters[thread_iter][i].size(); j++) + local_parent_clusters[thread_iter][i][j] = local_to_global[local_parent_clusters[thread_iter][i][j]]; + } + } + } + +#ifndef __EMSCRIPTEN__ + } ); +#endif + + } // thread_iter + +#ifndef __EMSCRIPTEN__ + pJob_pool->wait_for_all(); +#endif + + uint32_t total_clusters = 0, total_parent_clusters = 0; + + for (int thread_iter = 0; thread_iter < (int)max_threads; thread_iter++) + { + if (!success_flags[thread_iter]) + return false; + total_clusters += (uint32_t)local_clusters[thread_iter].size(); + total_parent_clusters += (uint32_t)local_parent_clusters[thread_iter].size(); + } + + codebook.reserve(total_clusters); + parent_codebook.reserve(total_parent_clusters); + + for (uint32_t thread_iter = 0; thread_iter < max_threads; thread_iter++) + { + for (uint32_t j = 0; j < local_clusters[thread_iter].size(); j++) + { + codebook.resize(codebook.size() + 1); + codebook.back().swap(local_clusters[thread_iter][j]); + } + + for (uint32_t j = 0; j < local_parent_clusters[thread_iter].size(); j++) + { + parent_codebook.resize(parent_codebook.size() + 1); + parent_codebook.back().swap(local_parent_clusters[thread_iter][j]); + } + } + + return true; + } + + template + bool generate_hierarchical_codebook_threaded(Quantizer& q, + uint32_t max_codebook_size, uint32_t max_parent_codebook_size, + basisu::vector& codebook, + basisu::vector& parent_codebook, + uint32_t max_threads, job_pool *pJob_pool, + bool even_odd_input_pairs_equal) + { + typedef bit_hasher training_vec_bit_hasher; + + typedef std::unordered_map < typename Quantizer::training_vec_type, weighted_block_group, + training_vec_bit_hasher> group_hash; + + //interval_timer tm; + //tm.start(); + + group_hash unique_vecs; + + unique_vecs.reserve(20000); + + weighted_block_group g; + + if (even_odd_input_pairs_equal) + { + g.m_indices.resize(2); + + assert(q.get_training_vecs().size() >= 2 && (q.get_training_vecs().size() & 1) == 0); + + for (uint32_t i = 0; i < q.get_training_vecs().size(); i += 2) + { + assert(q.get_training_vecs()[i].first == q.get_training_vecs()[i + 1].first); + + g.m_total_weight = q.get_training_vecs()[i].second + q.get_training_vecs()[i + 1].second; + g.m_indices[0] = i; + g.m_indices[1] = i + 1; + + auto ins_res = unique_vecs.insert(std::make_pair(q.get_training_vecs()[i].first, g)); + + if (!ins_res.second) + { + (ins_res.first)->second.m_total_weight += g.m_total_weight; + (ins_res.first)->second.m_indices.push_back(i); + (ins_res.first)->second.m_indices.push_back(i + 1); + } + } + } + else + { + g.m_indices.resize(1); + + for (uint32_t i = 0; i < q.get_training_vecs().size(); i++) + { + g.m_total_weight = q.get_training_vecs()[i].second; + g.m_indices[0] = i; + + auto ins_res = unique_vecs.insert(std::make_pair(q.get_training_vecs()[i].first, g)); + + if (!ins_res.second) + { + (ins_res.first)->second.m_total_weight += g.m_total_weight; + (ins_res.first)->second.m_indices.push_back(i); + } + } + } + + //debug_printf("generate_hierarchical_codebook_threaded: %u training vectors, %u unique training vectors, %3.3f secs\n", q.get_total_training_vecs(), (uint32_t)unique_vecs.size(), tm.get_elapsed_secs()); + debug_printf("generate_hierarchical_codebook_threaded: %u training vectors, %u unique training vectors\n", q.get_total_training_vecs(), (uint32_t)unique_vecs.size()); + + Quantizer group_quant; + typedef typename group_hash::const_iterator group_hash_const_iter; + basisu::vector unique_vec_iters; + unique_vec_iters.reserve(unique_vecs.size()); + + for (auto iter = unique_vecs.begin(); iter != unique_vecs.end(); ++iter) + { + group_quant.add_training_vec(iter->first, iter->second.m_total_weight); + unique_vec_iters.push_back(iter); + } + + bool limit_clusterizers = true; + if (unique_vecs.size() <= max_codebook_size) + limit_clusterizers = false; + + debug_printf("Limit clusterizers: %u\n", limit_clusterizers); + + basisu::vector group_codebook, group_parent_codebook; + bool status = generate_hierarchical_codebook_threaded_internal(group_quant, + max_codebook_size, max_parent_codebook_size, + group_codebook, + group_parent_codebook, + (unique_vecs.size() < 65536*4) ? 1 : max_threads, limit_clusterizers, pJob_pool); + + if (!status) + return false; + + codebook.resize(0); + for (uint32_t i = 0; i < group_codebook.size(); i++) + { + codebook.resize(codebook.size() + 1); + + for (uint32_t j = 0; j < group_codebook[i].size(); j++) + { + const uint32_t group_index = group_codebook[i][j]; + + typename group_hash::const_iterator group_iter = unique_vec_iters[group_index]; + const uint_vec& training_vec_indices = group_iter->second.m_indices; + + append_vector(codebook.back(), training_vec_indices); + } + } + + parent_codebook.resize(0); + for (uint32_t i = 0; i < group_parent_codebook.size(); i++) + { + parent_codebook.resize(parent_codebook.size() + 1); + + for (uint32_t j = 0; j < group_parent_codebook[i].size(); j++) + { + const uint32_t group_index = group_parent_codebook[i][j]; + + typename group_hash::const_iterator group_iter = unique_vec_iters[group_index]; + const uint_vec& training_vec_indices = group_iter->second.m_indices; + + append_vector(parent_codebook.back(), training_vec_indices); + } + } + + return true; + } + + // Canonical Huffman coding + + class histogram + { + basisu::vector m_hist; + + public: + histogram(uint32_t size = 0) { init(size); } + + void clear() + { + clear_vector(m_hist); + } + + void init(uint32_t size) + { + m_hist.resize(0); + m_hist.resize(size); + } + + inline uint32_t size() const { return static_cast(m_hist.size()); } + + inline const uint32_t &operator[] (uint32_t index) const + { + return m_hist[index]; + } + + inline uint32_t &operator[] (uint32_t index) + { + return m_hist[index]; + } + + inline void inc(uint32_t index) + { + m_hist[index]++; + } + + uint64_t get_total() const + { + uint64_t total = 0; + for (uint32_t i = 0; i < m_hist.size(); ++i) + total += m_hist[i]; + return total; + } + + double get_entropy() const + { + double total = static_cast(get_total()); + if (total == 0.0f) + return 0.0f; + + const double inv_total = 1.0f / total; + const double neg_inv_log2 = -1.0f / log(2.0f); + + double e = 0.0f; + for (uint32_t i = 0; i < m_hist.size(); i++) + if (m_hist[i]) + e += log(m_hist[i] * inv_total) * neg_inv_log2 * static_cast(m_hist[i]); + + return e; + } + }; + + struct sym_freq + { + uint32_t m_key; + uint16_t m_sym_index; + }; + + sym_freq *canonical_huffman_radix_sort_syms(uint32_t num_syms, sym_freq *pSyms0, sym_freq *pSyms1); + void canonical_huffman_calculate_minimum_redundancy(sym_freq *A, int num_syms); + void canonical_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size); + + class huffman_encoding_table + { + public: + huffman_encoding_table() + { + } + + void clear() + { + clear_vector(m_codes); + clear_vector(m_code_sizes); + } + + bool init(const histogram &h, uint32_t max_code_size = cHuffmanMaxSupportedCodeSize) + { + return init(h.size(), &h[0], max_code_size); + } + + bool init(uint32_t num_syms, const uint16_t *pFreq, uint32_t max_code_size); + bool init(uint32_t num_syms, const uint32_t *pSym_freq, uint32_t max_code_size); + + inline const uint16_vec &get_codes() const { return m_codes; } + inline const uint8_vec &get_code_sizes() const { return m_code_sizes; } + + uint32_t get_total_used_codes() const + { + for (int i = static_cast(m_code_sizes.size()) - 1; i >= 0; i--) + if (m_code_sizes[i]) + return i + 1; + return 0; + } + + private: + uint16_vec m_codes; + uint8_vec m_code_sizes; + }; + + class bitwise_coder + { + public: + bitwise_coder() : + m_bit_buffer(0), + m_bit_buffer_size(0), + m_total_bits(0) + { + } + + inline void clear() + { + clear_vector(m_bytes); + m_bit_buffer = 0; + m_bit_buffer_size = 0; + m_total_bits = 0; + } + + inline const uint8_vec &get_bytes() const { return m_bytes; } + + inline uint64_t get_total_bits() const { return m_total_bits; } + inline void clear_total_bits() { m_total_bits = 0; } + + inline void init(uint32_t reserve_size = 1024) + { + m_bytes.reserve(reserve_size); + m_bytes.resize(0); + + m_bit_buffer = 0; + m_bit_buffer_size = 0; + m_total_bits = 0; + } + + inline uint32_t flush() + { + if (m_bit_buffer_size) + { + m_total_bits += 8 - (m_bit_buffer_size & 7); + append_byte(static_cast(m_bit_buffer)); + + m_bit_buffer = 0; + m_bit_buffer_size = 0; + + return 8; + } + + return 0; + } + + inline uint32_t put_bits(uint32_t bits, uint32_t num_bits) + { + assert(num_bits <= 32); + assert(bits < (1ULL << num_bits)); + + if (!num_bits) + return 0; + + m_total_bits += num_bits; + + uint64_t v = (static_cast(bits) << m_bit_buffer_size) | m_bit_buffer; + m_bit_buffer_size += num_bits; + + while (m_bit_buffer_size >= 8) + { + append_byte(static_cast(v)); + v >>= 8; + m_bit_buffer_size -= 8; + } + + m_bit_buffer = static_cast(v); + return num_bits; + } + + inline uint32_t put_code(uint32_t sym, const huffman_encoding_table &tab) + { + uint32_t code = tab.get_codes()[sym]; + uint32_t code_size = tab.get_code_sizes()[sym]; + assert(code_size >= 1); + put_bits(code, code_size); + return code_size; + } + + inline uint32_t put_truncated_binary(uint32_t v, uint32_t n) + { + assert((n >= 2) && (v < n)); + + uint32_t k = floor_log2i(n); + uint32_t u = (1 << (k + 1)) - n; + + if (v < u) + return put_bits(v, k); + + uint32_t x = v + u; + assert((x >> 1) >= u); + + put_bits(x >> 1, k); + put_bits(x & 1, 1); + return k + 1; + } + + inline uint32_t put_rice(uint32_t v, uint32_t m) + { + assert(m); + + const uint64_t start_bits = m_total_bits; + + uint32_t q = v >> m, r = v & ((1 << m) - 1); + + // rice coding sanity check + assert(q <= 64); + + for (; q > 16; q -= 16) + put_bits(0xFFFF, 16); + + put_bits((1 << q) - 1, q); + put_bits(r << 1, m + 1); + + return (uint32_t)(m_total_bits - start_bits); + } + + inline uint32_t put_vlc(uint32_t v, uint32_t chunk_bits) + { + assert(chunk_bits); + + const uint32_t chunk_size = 1 << chunk_bits; + const uint32_t chunk_mask = chunk_size - 1; + + uint32_t total_bits = 0; + + for ( ; ; ) + { + uint32_t next_v = v >> chunk_bits; + + total_bits += put_bits((v & chunk_mask) | (next_v ? chunk_size : 0), chunk_bits + 1); + if (!next_v) + break; + + v = next_v; + } + + return total_bits; + } + + uint32_t emit_huffman_table(const huffman_encoding_table &tab); + + private: + uint8_vec m_bytes; + uint32_t m_bit_buffer, m_bit_buffer_size; + uint64_t m_total_bits; + + void append_byte(uint8_t c) + { + m_bytes.resize(m_bytes.size() + 1); + m_bytes.back() = c; + } + + static void end_nonzero_run(uint16_vec &syms, uint32_t &run_size, uint32_t len); + static void end_zero_run(uint16_vec &syms, uint32_t &run_size); + }; + + class huff2D + { + public: + huff2D() { } + huff2D(uint32_t bits_per_sym, uint32_t total_syms_per_group) { init(bits_per_sym, total_syms_per_group); } + + inline const histogram &get_histogram() const { return m_histogram; } + inline const huffman_encoding_table &get_encoding_table() const { return m_encoding_table; } + + inline void init(uint32_t bits_per_sym, uint32_t total_syms_per_group) + { + assert((bits_per_sym * total_syms_per_group) <= 16 && total_syms_per_group >= 1 && bits_per_sym >= 1); + + m_bits_per_sym = bits_per_sym; + m_total_syms_per_group = total_syms_per_group; + m_cur_sym_bits = 0; + m_cur_num_syms = 0; + m_decode_syms_remaining = 0; + m_next_decoder_group_index = 0; + + m_histogram.init(1 << (bits_per_sym * total_syms_per_group)); + } + + inline void clear() + { + m_group_bits.clear(); + + m_cur_sym_bits = 0; + m_cur_num_syms = 0; + m_decode_syms_remaining = 0; + m_next_decoder_group_index = 0; + } + + inline void emit(uint32_t sym) + { + m_cur_sym_bits |= (sym << (m_cur_num_syms * m_bits_per_sym)); + m_cur_num_syms++; + + if (m_cur_num_syms == m_total_syms_per_group) + flush(); + } + + inline void flush() + { + if (m_cur_num_syms) + { + m_group_bits.push_back(m_cur_sym_bits); + m_histogram.inc(m_cur_sym_bits); + + m_cur_sym_bits = 0; + m_cur_num_syms = 0; + } + } + + inline bool start_encoding(uint32_t code_size_limit = 16) + { + flush(); + + if (!m_encoding_table.init(m_histogram, code_size_limit)) + return false; + + m_decode_syms_remaining = 0; + m_next_decoder_group_index = 0; + + return true; + } + + inline uint32_t emit_next_sym(bitwise_coder &c) + { + uint32_t bits = 0; + + if (!m_decode_syms_remaining) + { + bits = c.put_code(m_group_bits[m_next_decoder_group_index++], m_encoding_table); + m_decode_syms_remaining = m_total_syms_per_group; + } + + m_decode_syms_remaining--; + return bits; + } + + inline void emit_flush() + { + m_decode_syms_remaining = 0; + } + + private: + uint_vec m_group_bits; + huffman_encoding_table m_encoding_table; + histogram m_histogram; + uint32_t m_bits_per_sym, m_total_syms_per_group, m_cur_sym_bits, m_cur_num_syms, m_next_decoder_group_index, m_decode_syms_remaining; + }; + + bool huffman_test(int rand_seed); + + // VQ index reordering + + class palette_index_reorderer + { + public: + palette_index_reorderer() + { + } + + void clear() + { + clear_vector(m_hist); + clear_vector(m_total_count_to_picked); + clear_vector(m_entries_picked); + clear_vector(m_entries_to_do); + clear_vector(m_remap_table); + } + + // returns [0,1] distance of entry i to entry j + typedef float(*pEntry_dist_func)(uint32_t i, uint32_t j, void *pCtx); + + void init(uint32_t num_indices, const uint32_t *pIndices, uint32_t num_syms, pEntry_dist_func pDist_func, void *pCtx, float dist_func_weight); + + // Table remaps old to new symbol indices + inline const uint_vec &get_remap_table() const { return m_remap_table; } + + private: + uint_vec m_hist, m_total_count_to_picked, m_entries_picked, m_entries_to_do, m_remap_table; + + inline uint32_t get_hist(int i, int j, int n) const { return (i > j) ? m_hist[j * n + i] : m_hist[i * n + j]; } + inline void inc_hist(int i, int j, int n) { if ((i != j) && (i < j) && (i != -1) && (j != -1)) { assert(((uint32_t)i < (uint32_t)n) && ((uint32_t)j < (uint32_t)n)); m_hist[i * n + j]++; } } + + void prepare_hist(uint32_t num_syms, uint32_t num_indices, const uint32_t *pIndices); + void find_initial(uint32_t num_syms); + void find_next_entry(uint32_t &best_entry, double &best_count, pEntry_dist_func pDist_func, void *pCtx, float dist_func_weight); + float pick_side(uint32_t num_syms, uint32_t entry_to_move, pEntry_dist_func pDist_func, void *pCtx, float dist_func_weight); + }; + + // Simple 32-bit 2D image class + + class image + { + public: + image() : + m_width(0), m_height(0), m_pitch(0) + { + } + + image(uint32_t w, uint32_t h, uint32_t p = UINT32_MAX) : + m_width(0), m_height(0), m_pitch(0) + { + resize(w, h, p); + } + + image(const uint8_t *pImage, uint32_t width, uint32_t height, uint32_t comps) : + m_width(0), m_height(0), m_pitch(0) + { + init(pImage, width, height, comps); + } + + image(const image &other) : + m_width(0), m_height(0), m_pitch(0) + { + *this = other; + } + + image &swap(image &other) + { + std::swap(m_width, other.m_width); + std::swap(m_height, other.m_height); + std::swap(m_pitch, other.m_pitch); + m_pixels.swap(other.m_pixels); + return *this; + } + + image &operator= (const image &rhs) + { + if (this != &rhs) + { + m_width = rhs.m_width; + m_height = rhs.m_height; + m_pitch = rhs.m_pitch; + m_pixels = rhs.m_pixels; + } + return *this; + } + + image &clear() + { + m_width = 0; + m_height = 0; + m_pitch = 0; + clear_vector(m_pixels); + return *this; + } + + image &resize(uint32_t w, uint32_t h, uint32_t p = UINT32_MAX, const color_rgba& background = g_black_color) + { + return crop(w, h, p, background); + } + + image &set_all(const color_rgba &c) + { + for (uint32_t i = 0; i < m_pixels.size(); i++) + m_pixels[i] = c; + return *this; + } + + void init(const uint8_t *pImage, uint32_t width, uint32_t height, uint32_t comps) + { + assert(comps >= 1 && comps <= 4); + + resize(width, height); + + for (uint32_t y = 0; y < height; y++) + { + for (uint32_t x = 0; x < width; x++) + { + const uint8_t *pSrc = &pImage[(x + y * width) * comps]; + color_rgba &dst = (*this)(x, y); + + if (comps == 1) + { + dst.r = pSrc[0]; + dst.g = pSrc[0]; + dst.b = pSrc[0]; + dst.a = 255; + } + else if (comps == 2) + { + dst.r = pSrc[0]; + dst.g = pSrc[0]; + dst.b = pSrc[0]; + dst.a = pSrc[1]; + } + else + { + dst.r = pSrc[0]; + dst.g = pSrc[1]; + dst.b = pSrc[2]; + if (comps == 4) + dst.a = pSrc[3]; + else + dst.a = 255; + } + } + } + } + + image &fill_box(uint32_t x, uint32_t y, uint32_t w, uint32_t h, const color_rgba &c) + { + for (uint32_t iy = 0; iy < h; iy++) + for (uint32_t ix = 0; ix < w; ix++) + set_clipped(x + ix, y + iy, c); + return *this; + } + + image& fill_box_alpha(uint32_t x, uint32_t y, uint32_t w, uint32_t h, const color_rgba& c) + { + for (uint32_t iy = 0; iy < h; iy++) + for (uint32_t ix = 0; ix < w; ix++) + set_clipped_alpha(x + ix, y + iy, c); + return *this; + } + + image &crop_dup_borders(uint32_t w, uint32_t h) + { + const uint32_t orig_w = m_width, orig_h = m_height; + + crop(w, h); + + if (orig_w && orig_h) + { + if (m_width > orig_w) + { + for (uint32_t x = orig_w; x < m_width; x++) + for (uint32_t y = 0; y < m_height; y++) + set_clipped(x, y, get_clamped(minimum(x, orig_w - 1U), minimum(y, orig_h - 1U))); + } + + if (m_height > orig_h) + { + for (uint32_t y = orig_h; y < m_height; y++) + for (uint32_t x = 0; x < m_width; x++) + set_clipped(x, y, get_clamped(minimum(x, orig_w - 1U), minimum(y, orig_h - 1U))); + } + } + return *this; + } + + // pPixels MUST have been allocated using malloc() (basisu::vector will eventually use free() on the pointer). + image& grant_ownership(color_rgba* pPixels, uint32_t w, uint32_t h, uint32_t p = UINT32_MAX) + { + if (p == UINT32_MAX) + p = w; + + clear(); + + if ((!p) || (!w) || (!h)) + return *this; + + m_pixels.grant_ownership(pPixels, p * h, p * h); + + m_width = w; + m_height = h; + m_pitch = p; + + return *this; + } + + image &crop(uint32_t w, uint32_t h, uint32_t p = UINT32_MAX, const color_rgba &background = g_black_color, bool init_image = true) + { + if (p == UINT32_MAX) + p = w; + + if ((w == m_width) && (m_height == h) && (m_pitch == p)) + return *this; + + if ((!w) || (!h) || (!p)) + { + clear(); + return *this; + } + + color_rgba_vec cur_state; + cur_state.swap(m_pixels); + + m_pixels.resize(p * h); + + if (init_image) + { + if (m_width || m_height) + { + for (uint32_t y = 0; y < h; y++) + { + for (uint32_t x = 0; x < w; x++) + { + if ((x < m_width) && (y < m_height)) + m_pixels[x + y * p] = cur_state[x + y * m_pitch]; + else + m_pixels[x + y * p] = background; + } + } + } + else + { + m_pixels.set_all(background); + } + } + + m_width = w; + m_height = h; + m_pitch = p; + + return *this; + } + + inline const color_rgba &operator() (uint32_t x, uint32_t y) const { assert(x < m_width && y < m_height); return m_pixels[x + y * m_pitch]; } + inline color_rgba &operator() (uint32_t x, uint32_t y) { assert(x < m_width && y < m_height); return m_pixels[x + y * m_pitch]; } + + inline const color_rgba &get_clamped(int x, int y) const { return (*this)(clamp(x, 0, m_width - 1), clamp(y, 0, m_height - 1)); } + inline color_rgba &get_clamped(int x, int y) { return (*this)(clamp(x, 0, m_width - 1), clamp(y, 0, m_height - 1)); } + + inline const color_rgba &get_clamped_or_wrapped(int x, int y, bool wrap_u, bool wrap_v) const + { + x = wrap_u ? posmod(x, m_width) : clamp(x, 0, m_width - 1); + y = wrap_v ? posmod(y, m_height) : clamp(y, 0, m_height - 1); + return m_pixels[x + y * m_pitch]; + } + + inline color_rgba &get_clamped_or_wrapped(int x, int y, bool wrap_u, bool wrap_v) + { + x = wrap_u ? posmod(x, m_width) : clamp(x, 0, m_width - 1); + y = wrap_v ? posmod(y, m_height) : clamp(y, 0, m_height - 1); + return m_pixels[x + y * m_pitch]; + } + + inline image &set_clipped(int x, int y, const color_rgba &c) + { + if ((static_cast(x) < m_width) && (static_cast(y) < m_height)) + (*this)(x, y) = c; + return *this; + } + + inline image& set_clipped_alpha(int x, int y, const color_rgba& c) + { + if ((static_cast(x) < m_width) && (static_cast(y) < m_height)) + (*this)(x, y).m_comps[3] = c.m_comps[3]; + return *this; + } + + // Very straightforward blit with full clipping. Not fast, but it works. + image &blit(const image &src, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y) + { + for (int y = 0; y < src_h; y++) + { + const int sy = src_y + y; + if (sy < 0) + continue; + else if (sy >= (int)src.get_height()) + break; + + for (int x = 0; x < src_w; x++) + { + const int sx = src_x + x; + if (sx < 0) + continue; + else if (sx >= (int)src.get_height()) + break; + + set_clipped(dst_x + x, dst_y + y, src(sx, sy)); + } + } + + return *this; + } + + const image &extract_block_clamped(color_rgba *pDst, uint32_t src_x, uint32_t src_y, uint32_t w, uint32_t h) const + { + if (((src_x + w) > m_width) || ((src_y + h) > m_height)) + { + // Slower clamping case + for (uint32_t y = 0; y < h; y++) + for (uint32_t x = 0; x < w; x++) + *pDst++ = get_clamped(src_x + x, src_y + y); + } + else + { + const color_rgba* pSrc = &m_pixels[src_x + src_y * m_pitch]; + + for (uint32_t y = 0; y < h; y++) + { + memcpy(pDst, pSrc, w * sizeof(color_rgba)); + pSrc += m_pitch; + pDst += w; + } + } + + return *this; + } + + image &set_block_clipped(const color_rgba *pSrc, uint32_t dst_x, uint32_t dst_y, uint32_t w, uint32_t h) + { + for (uint32_t y = 0; y < h; y++) + for (uint32_t x = 0; x < w; x++) + set_clipped(dst_x + x, dst_y + y, *pSrc++); + return *this; + } + + inline uint32_t get_width() const { return m_width; } + inline uint32_t get_height() const { return m_height; } + inline uint32_t get_pitch() const { return m_pitch; } + inline uint32_t get_total_pixels() const { return m_width * m_height; } + + inline uint32_t get_block_width(uint32_t w) const { return (m_width + (w - 1)) / w; } + inline uint32_t get_block_height(uint32_t h) const { return (m_height + (h - 1)) / h; } + inline uint32_t get_total_blocks(uint32_t w, uint32_t h) const { return get_block_width(w) * get_block_height(h); } + + inline const color_rgba_vec &get_pixels() const { return m_pixels; } + inline color_rgba_vec &get_pixels() { return m_pixels; } + + inline const color_rgba *get_ptr() const { return &m_pixels[0]; } + inline color_rgba *get_ptr() { return &m_pixels[0]; } + + bool has_alpha() const + { + for (uint32_t y = 0; y < m_height; ++y) + for (uint32_t x = 0; x < m_width; ++x) + if ((*this)(x, y).a < 255) + return true; + + return false; + } + + image &set_alpha(uint8_t a) + { + for (uint32_t y = 0; y < m_height; ++y) + for (uint32_t x = 0; x < m_width; ++x) + (*this)(x, y).a = a; + return *this; + } + + image &flip_y() + { + for (uint32_t y = 0; y < m_height / 2; ++y) + for (uint32_t x = 0; x < m_width; ++x) + std::swap((*this)(x, y), (*this)(x, m_height - 1 - y)); + return *this; + } + + // TODO: There are many ways to do this, not sure this is the best way. + image &renormalize_normal_map() + { + for (uint32_t y = 0; y < m_height; y++) + { + for (uint32_t x = 0; x < m_width; x++) + { + color_rgba &c = (*this)(x, y); + if ((c.r == 128) && (c.g == 128) && (c.b == 128)) + continue; + + vec3F v(c.r, c.g, c.b); + v = (v * (2.0f / 255.0f)) - vec3F(1.0f); + v.clamp(-1.0f, 1.0f); + + float length = v.length(); + const float cValidThresh = .077f; + if (length < cValidThresh) + { + c.set(128, 128, 128, c.a); + } + else if (fabs(length - 1.0f) > cValidThresh) + { + if (length) + v /= length; + + for (uint32_t i = 0; i < 3; i++) + c[i] = static_cast(clamp(floor((v[i] + 1.0f) * 255.0f * .5f + .5f), 0.0f, 255.0f)); + + if ((c.g == 128) && (c.r == 128)) + { + if (c.b < 128) + c.b = 0; + else + c.b = 255; + } + } + } + } + return *this; + } + + void debug_text(uint32_t x_ofs, uint32_t y_ofs, uint32_t x_scale, uint32_t y_scale, const color_rgba &fg, const color_rgba *pBG, bool alpha_only, const char* p, ...); + + private: + uint32_t m_width, m_height, m_pitch; // all in pixels + color_rgba_vec m_pixels; + }; + + // Float images + + typedef basisu::vector vec4F_vec; + + class imagef + { + public: + imagef() : + m_width(0), m_height(0), m_pitch(0) + { + } + + imagef(uint32_t w, uint32_t h, uint32_t p = UINT32_MAX) : + m_width(0), m_height(0), m_pitch(0) + { + resize(w, h, p); + } + + imagef(const imagef &other) : + m_width(0), m_height(0), m_pitch(0) + { + *this = other; + } + + imagef &swap(imagef &other) + { + std::swap(m_width, other.m_width); + std::swap(m_height, other.m_height); + std::swap(m_pitch, other.m_pitch); + m_pixels.swap(other.m_pixels); + return *this; + } + + imagef &operator= (const imagef &rhs) + { + if (this != &rhs) + { + m_width = rhs.m_width; + m_height = rhs.m_height; + m_pitch = rhs.m_pitch; + m_pixels = rhs.m_pixels; + } + return *this; + } + + imagef &clear() + { + m_width = 0; + m_height = 0; + m_pitch = 0; + clear_vector(m_pixels); + return *this; + } + + imagef &set(const image &src, const vec4F &scale = vec4F(1), const vec4F &bias = vec4F(0)) + { + const uint32_t width = src.get_width(); + const uint32_t height = src.get_height(); + + resize(width, height); + + for (int y = 0; y < (int)height; y++) + { + for (uint32_t x = 0; x < width; x++) + { + const color_rgba &src_pixel = src(x, y); + (*this)(x, y).set((float)src_pixel.r * scale[0] + bias[0], (float)src_pixel.g * scale[1] + bias[1], (float)src_pixel.b * scale[2] + bias[2], (float)src_pixel.a * scale[3] + bias[3]); + } + } + + return *this; + } + + imagef &resize(const imagef &other, uint32_t p = UINT32_MAX, const vec4F& background = vec4F(0,0,0,1)) + { + return resize(other.get_width(), other.get_height(), p, background); + } + + imagef &resize(uint32_t w, uint32_t h, uint32_t p = UINT32_MAX, const vec4F& background = vec4F(0,0,0,1)) + { + return crop(w, h, p, background); + } + + imagef &set_all(const vec4F &c) + { + for (uint32_t i = 0; i < m_pixels.size(); i++) + m_pixels[i] = c; + return *this; + } + + imagef &fill_box(uint32_t x, uint32_t y, uint32_t w, uint32_t h, const vec4F &c) + { + for (uint32_t iy = 0; iy < h; iy++) + for (uint32_t ix = 0; ix < w; ix++) + set_clipped(x + ix, y + iy, c); + return *this; + } + + imagef &crop(uint32_t w, uint32_t h, uint32_t p = UINT32_MAX, const vec4F &background = vec4F(0,0,0,1)) + { + if (p == UINT32_MAX) + p = w; + + if ((w == m_width) && (m_height == h) && (m_pitch == p)) + return *this; + + if ((!w) || (!h) || (!p)) + { + clear(); + return *this; + } + + vec4F_vec cur_state; + cur_state.swap(m_pixels); + + m_pixels.resize(p * h); + + for (uint32_t y = 0; y < h; y++) + { + for (uint32_t x = 0; x < w; x++) + { + if ((x < m_width) && (y < m_height)) + m_pixels[x + y * p] = cur_state[x + y * m_pitch]; + else + m_pixels[x + y * p] = background; + } + } + + m_width = w; + m_height = h; + m_pitch = p; + + return *this; + } + + inline const vec4F &operator() (uint32_t x, uint32_t y) const { assert(x < m_width && y < m_height); return m_pixels[x + y * m_pitch]; } + inline vec4F &operator() (uint32_t x, uint32_t y) { assert(x < m_width && y < m_height); return m_pixels[x + y * m_pitch]; } + + inline const vec4F &get_clamped(int x, int y) const { return (*this)(clamp(x, 0, m_width - 1), clamp(y, 0, m_height - 1)); } + inline vec4F &get_clamped(int x, int y) { return (*this)(clamp(x, 0, m_width - 1), clamp(y, 0, m_height - 1)); } + + inline const vec4F &get_clamped_or_wrapped(int x, int y, bool wrap_u, bool wrap_v) const + { + x = wrap_u ? posmod(x, m_width) : clamp(x, 0, m_width - 1); + y = wrap_v ? posmod(y, m_height) : clamp(y, 0, m_height - 1); + return m_pixels[x + y * m_pitch]; + } + + inline vec4F &get_clamped_or_wrapped(int x, int y, bool wrap_u, bool wrap_v) + { + x = wrap_u ? posmod(x, m_width) : clamp(x, 0, m_width - 1); + y = wrap_v ? posmod(y, m_height) : clamp(y, 0, m_height - 1); + return m_pixels[x + y * m_pitch]; + } + + inline imagef &set_clipped(int x, int y, const vec4F &c) + { + if ((static_cast(x) < m_width) && (static_cast(y) < m_height)) + (*this)(x, y) = c; + return *this; + } + + // Very straightforward blit with full clipping. Not fast, but it works. + imagef &blit(const imagef &src, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y) + { + for (int y = 0; y < src_h; y++) + { + const int sy = src_y + y; + if (sy < 0) + continue; + else if (sy >= (int)src.get_height()) + break; + + for (int x = 0; x < src_w; x++) + { + const int sx = src_x + x; + if (sx < 0) + continue; + else if (sx >= (int)src.get_height()) + break; + + set_clipped(dst_x + x, dst_y + y, src(sx, sy)); + } + } + + return *this; + } + + const imagef &extract_block_clamped(vec4F *pDst, uint32_t src_x, uint32_t src_y, uint32_t w, uint32_t h) const + { + for (uint32_t y = 0; y < h; y++) + for (uint32_t x = 0; x < w; x++) + *pDst++ = get_clamped(src_x + x, src_y + y); + return *this; + } + + imagef &set_block_clipped(const vec4F *pSrc, uint32_t dst_x, uint32_t dst_y, uint32_t w, uint32_t h) + { + for (uint32_t y = 0; y < h; y++) + for (uint32_t x = 0; x < w; x++) + set_clipped(dst_x + x, dst_y + y, *pSrc++); + return *this; + } + + inline uint32_t get_width() const { return m_width; } + inline uint32_t get_height() const { return m_height; } + inline uint32_t get_pitch() const { return m_pitch; } + inline uint32_t get_total_pixels() const { return m_width * m_height; } + + inline uint32_t get_block_width(uint32_t w) const { return (m_width + (w - 1)) / w; } + inline uint32_t get_block_height(uint32_t h) const { return (m_height + (h - 1)) / h; } + inline uint32_t get_total_blocks(uint32_t w, uint32_t h) const { return get_block_width(w) * get_block_height(h); } + + inline const vec4F_vec &get_pixels() const { return m_pixels; } + inline vec4F_vec &get_pixels() { return m_pixels; } + + inline const vec4F *get_ptr() const { return &m_pixels[0]; } + inline vec4F *get_ptr() { return &m_pixels[0]; } + + private: + uint32_t m_width, m_height, m_pitch; // all in pixels + vec4F_vec m_pixels; + }; + + // Image metrics + + class image_metrics + { + public: + // TODO: Add ssim + float m_max, m_mean, m_mean_squared, m_rms, m_psnr, m_ssim; + + image_metrics() + { + clear(); + } + + void clear() + { + m_max = 0; + m_mean = 0; + m_mean_squared = 0; + m_rms = 0; + m_psnr = 0; + m_ssim = 0; + } + + void print(const char *pPrefix = nullptr) { printf("%sMax: %3.0f Mean: %3.3f RMS: %3.3f PSNR: %2.3f dB\n", pPrefix ? pPrefix : "", m_max, m_mean, m_rms, m_psnr); } + + void calc(const image &a, const image &b, uint32_t first_chan = 0, uint32_t total_chans = 0, bool avg_comp_error = true, bool use_601_luma = false); + }; + + // Image saving/loading/resampling + + bool load_png(const uint8_t* pBuf, size_t buf_size, image& img, const char* pFilename = nullptr); + bool load_png(const char* pFilename, image& img); + inline bool load_png(const std::string &filename, image &img) { return load_png(filename.c_str(), img); } + + bool load_tga(const char* pFilename, image& img); + inline bool load_tga(const std::string &filename, image &img) { return load_tga(filename.c_str(), img); } + + bool load_jpg(const char *pFilename, image& img); + inline bool load_jpg(const std::string &filename, image &img) { return load_jpg(filename.c_str(), img); } + + // Currently loads .PNG, .TGA, or .JPG + bool load_image(const char* pFilename, image& img); + inline bool load_image(const std::string &filename, image &img) { return load_image(filename.c_str(), img); } + + uint8_t *read_tga(const uint8_t *pBuf, uint32_t buf_size, int &width, int &height, int &n_chans); + uint8_t *read_tga(const char *pFilename, int &width, int &height, int &n_chans); + + enum + { + cImageSaveGrayscale = 1, + cImageSaveIgnoreAlpha = 2 + }; + + bool save_png(const char* pFilename, const image& img, uint32_t image_save_flags = 0, uint32_t grayscale_comp = 0); + inline bool save_png(const std::string &filename, const image &img, uint32_t image_save_flags = 0, uint32_t grayscale_comp = 0) { return save_png(filename.c_str(), img, image_save_flags, grayscale_comp); } + + bool read_file_to_vec(const char* pFilename, uint8_vec& data); + + bool write_data_to_file(const char* pFilename, const void* pData, size_t len); + + inline bool write_vec_to_file(const char* pFilename, const uint8_vec& v) { return v.size() ? write_data_to_file(pFilename, &v[0], v.size()) : write_data_to_file(pFilename, "", 0); } + + float linear_to_srgb(float l); + float srgb_to_linear(float s); + + bool image_resample(const image &src, image &dst, bool srgb = false, + const char *pFilter = "lanczos4", float filter_scale = 1.0f, + bool wrapping = false, + uint32_t first_comp = 0, uint32_t num_comps = 4); + + // Timing + + typedef uint64_t timer_ticks; + + class interval_timer + { + public: + interval_timer(); + + void start(); + void stop(); + + double get_elapsed_secs() const; + inline double get_elapsed_ms() const { return 1000.0f* get_elapsed_secs(); } + + static void init(); + static inline timer_ticks get_ticks_per_sec() { return g_freq; } + static timer_ticks get_ticks(); + static double ticks_to_secs(timer_ticks ticks); + static inline double ticks_to_ms(timer_ticks ticks) { return ticks_to_secs(ticks) * 1000.0f; } + + private: + static timer_ticks g_init_ticks, g_freq; + static double g_timer_freq; + + timer_ticks m_start_time, m_stop_time; + + bool m_started, m_stopped; + }; + + // 2D array + + template + class vector2D + { + typedef basisu::vector TVec; + + uint32_t m_width, m_height; + TVec m_values; + + public: + vector2D() : + m_width(0), + m_height(0) + { + } + + vector2D(uint32_t w, uint32_t h) : + m_width(0), + m_height(0) + { + resize(w, h); + } + + vector2D(const vector2D &other) + { + *this = other; + } + + vector2D &operator= (const vector2D &other) + { + if (this != &other) + { + m_width = other.m_width; + m_height = other.m_height; + m_values = other.m_values; + } + return *this; + } + + inline bool operator== (const vector2D &rhs) const + { + return (m_width == rhs.m_width) && (m_height == rhs.m_height) && (m_values == rhs.m_values); + } + + inline uint32_t size_in_bytes() const { return (uint32_t)m_values.size() * sizeof(m_values[0]); } + + inline const T &operator() (uint32_t x, uint32_t y) const { assert(x < m_width && y < m_height); return m_values[x + y * m_width]; } + inline T &operator() (uint32_t x, uint32_t y) { assert(x < m_width && y < m_height); return m_values[x + y * m_width]; } + + inline const T &operator[] (uint32_t i) const { return m_values[i]; } + inline T &operator[] (uint32_t i) { return m_values[i]; } + + inline const T &at_clamped(int x, int y) const { return (*this)(clamp(x, 0, m_width), clamp(y, 0, m_height)); } + inline T &at_clamped(int x, int y) { return (*this)(clamp(x, 0, m_width), clamp(y, 0, m_height)); } + + void clear() + { + m_width = 0; + m_height = 0; + m_values.clear(); + } + + void set_all(const T&val) + { + vector_set_all(m_values, val); + } + + inline const T* get_ptr() const { return &m_values[0]; } + inline T* get_ptr() { return &m_values[0]; } + + vector2D &resize(uint32_t new_width, uint32_t new_height) + { + if ((m_width == new_width) && (m_height == new_height)) + return *this; + + TVec oldVals(new_width * new_height); + oldVals.swap(m_values); + + const uint32_t w = minimum(m_width, new_width); + const uint32_t h = minimum(m_height, new_height); + + if ((w) && (h)) + { + for (uint32_t y = 0; y < h; y++) + for (uint32_t x = 0; x < w; x++) + m_values[x + y * new_width] = oldVals[x + y * m_width]; + } + + m_width = new_width; + m_height = new_height; + + return *this; + } + }; + + inline FILE *fopen_safe(const char *pFilename, const char *pMode) + { +#ifdef _WIN32 + FILE *pFile = nullptr; + fopen_s(&pFile, pFilename, pMode); + return pFile; +#else + return fopen(pFilename, pMode); +#endif + } + + void fill_buffer_with_random_bytes(void *pBuf, size_t size, uint32_t seed = 1); + + const uint32_t cPixelBlockWidth = 4; + const uint32_t cPixelBlockHeight = 4; + const uint32_t cPixelBlockTotalPixels = cPixelBlockWidth * cPixelBlockHeight; + + struct pixel_block + { + color_rgba m_pixels[cPixelBlockHeight][cPixelBlockWidth]; // [y][x] + + inline const color_rgba& operator() (uint32_t x, uint32_t y) const { assert((x < cPixelBlockWidth) && (y < cPixelBlockHeight)); return m_pixels[y][x]; } + inline color_rgba& operator() (uint32_t x, uint32_t y) { assert((x < cPixelBlockWidth) && (y < cPixelBlockHeight)); return m_pixels[y][x]; } + + inline const color_rgba* get_ptr() const { return &m_pixels[0][0]; } + inline color_rgba* get_ptr() { return &m_pixels[0][0]; } + + inline void clear() { clear_obj(*this); } + + inline bool operator== (const pixel_block& rhs) const + { + return memcmp(m_pixels, rhs.m_pixels, sizeof(m_pixels)) == 0; + } + }; + typedef basisu::vector pixel_block_vec; + +} // namespace basisu + + diff --git a/ktx/external/basisu/encoder/basisu_etc.cpp b/ktx/external/basisu/encoder/basisu_etc.cpp new file mode 100644 index 0000000..f8bd0f1 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_etc.cpp @@ -0,0 +1,1610 @@ +// basis_etc.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_etc.h" + +#if BASISU_SUPPORT_SSE +#define CPPSPMD_NAME(a) a##_sse41 +#include "basisu_kernels_declares.h" +#endif + +#define BASISU_DEBUG_ETC_ENCODER 0 +#define BASISU_DEBUG_ETC_ENCODER_DEEPER 0 + +namespace basisu +{ + const int8_t g_etc2_eac_tables[16][8] = + { + { -3, -6, -9, -15, 2, 5, 8, 14 }, { -3, -7, -10, -13, 2, 6, 9, 12 }, { -2, -5, -8, -13, 1, 4, 7, 12 }, { -2, -4, -6, -13, 1, 3, 5, 12 }, + { -3, -6, -8, -12, 2, 5, 7, 11 }, { -3, -7, -9, -11, 2, 6, 8, 10 }, { -4, -7, -8, -11, 3, 6, 7, 10 }, { -3, -5, -8, -11, 2, 4, 7, 10 }, + { -2, -6, -8, -10, 1, 5, 7, 9 }, { -2, -5, -8, -10, 1, 4, 7, 9 }, { -2, -4, -8, -10, 1, 3, 7, 9 }, { -2, -5, -7, -10, 1, 4, 6, 9 }, + { -3, -4, -7, -10, 2, 3, 6, 9 }, { -1, -2, -3, -10, 0, 1, 2, 9 }, { -4, -6, -8, -9, 3, 5, 7, 8 }, { -3, -5, -7, -9, 2, 4, 6, 8 } + }; + + const int8_t g_etc2_eac_tables8[16][8] = + { + { -24, -48, -72, -120, 16, 40, 64, 112 }, { -24,-56,-80,-104,16,48,72,96 }, { -16,-40,-64,-104,8,32,56,96 }, { -16,-32,-48,-104,8,24,40,96 }, + { -24,-48,-64,-96,16,40,56,88 }, { -24,-56,-72,-88,16,48,64,80 }, { -32,-56,-64,-88,24,48,56,80 }, { -24,-40,-64,-88,16,32,56,80 }, + { -16,-48,-64,-80,8,40,56,72 }, { -16,-40,-64,-80,8,32,56,72 }, { -16,-32,-64,-80,8,24,56,72 }, { -16,-40,-56,-80,8,32,48,72 }, + { -24,-32,-56,-80,16,24,48,72 }, { -8,-16,-24,-80,0,8,16,72 }, { -32,-48,-64,-72,24,40,56,64 }, { -24,-40,-56,-72,16,32,48,64 } + }; + + // Given an ETC1 diff/inten_table/selector, and an 8-bit desired color, this table encodes the best packed_color in the low byte, and the abs error in the high byte. + static uint16_t g_etc1_inverse_lookup[2 * 8 * 4][256]; // [ diff/inten_table/selector][desired_color ] + + // g_color8_to_etc_block_config[color][table_index] = Supplies for each 8-bit color value a list of packed ETC1 diff/intensity table/selectors/packed_colors that map to that color. + // To pack: diff | (inten << 1) | (selector << 4) | (packed_c << 8) + static const uint16_t g_etc1_color8_to_etc_block_config_0_255[2][33] = + { + { 0x0000, 0x0010, 0x0002, 0x0012, 0x0004, 0x0014, 0x0006, 0x0016, 0x0008, 0x0018, 0x000A, 0x001A, 0x000C, 0x001C, 0x000E, 0x001E, 0x0001, 0x0011, 0x0003, 0x0013, 0x0005, 0x0015, 0x0007, 0x0017, 0x0009, 0x0019, 0x000B, 0x001B, 0x000D, 0x001D, 0x000F, 0x001F, 0xFFFF }, + { 0x0F20, 0x0F30, 0x0E32, 0x0F22, 0x0E34, 0x0F24, 0x0D36, 0x0F26, 0x0C38, 0x0E28, 0x0B3A, 0x0E2A, 0x093C, 0x0E2C, 0x053E, 0x0D2E, 0x1E31, 0x1F21, 0x1D33, 0x1F23, 0x1C35, 0x1E25, 0x1A37, 0x1E27, 0x1839, 0x1D29, 0x163B, 0x1C2B, 0x133D, 0x1B2D, 0x093F, 0x1A2F, 0xFFFF }, + }; + + // Really only [254][11]. + static const uint16_t g_etc1_color8_to_etc_block_config_1_to_254[254][12] = + { + { 0x021C, 0x0D0D, 0xFFFF }, { 0x0020, 0x0021, 0x0A0B, 0x061F, 0xFFFF }, { 0x0113, 0x0217, 0xFFFF }, { 0x0116, 0x031E, 0x0B0E, 0x0405, 0xFFFF }, { 0x0022, 0x0204, 0x050A, 0x0023, 0xFFFF }, { 0x0111, 0x0319, 0x0809, 0x170F, 0xFFFF }, { + 0x0303, 0x0215, 0x0607, 0xFFFF }, { 0x0030, 0x0114, 0x0408, 0x0031, 0x0201, 0x051D, 0xFFFF }, { 0x0100, 0x0024, 0x0306, 0x0025, 0x041B, 0x0E0D, 0xFFFF }, { 0x021A, 0x0121, 0x0B0B, 0x071F, 0xFFFF }, { 0x0213, 0x0317, 0xFFFF }, { 0x0112, + 0x0505, 0xFFFF }, { 0x0026, 0x070C, 0x0123, 0x0027, 0xFFFF }, { 0x0211, 0x0909, 0xFFFF }, { 0x0110, 0x0315, 0x0707, 0x0419, 0x180F, 0xFFFF }, { 0x0218, 0x0131, 0x0301, 0x0403, 0x061D, 0xFFFF }, { 0x0032, 0x0202, 0x0033, 0x0125, 0x051B, + 0x0F0D, 0xFFFF }, { 0x0028, 0x031C, 0x0221, 0x0029, 0xFFFF }, { 0x0120, 0x0313, 0x0C0B, 0x081F, 0xFFFF }, { 0x0605, 0x0417, 0xFFFF }, { 0x0216, 0x041E, 0x0C0E, 0x0223, 0x0127, 0xFFFF }, { 0x0122, 0x0304, 0x060A, 0x0311, 0x0A09, 0xFFFF + }, { 0x0519, 0x190F, 0xFFFF }, { 0x002A, 0x0231, 0x0503, 0x0415, 0x0807, 0x002B, 0x071D, 0xFFFF }, { 0x0130, 0x0214, 0x0508, 0x0401, 0x0133, 0x0225, 0x061B, 0xFFFF }, { 0x0200, 0x0124, 0x0406, 0x0321, 0x0129, 0x100D, 0xFFFF }, { 0x031A, + 0x0D0B, 0x091F, 0xFFFF }, { 0x0413, 0x0705, 0x0517, 0xFFFF }, { 0x0212, 0x0034, 0x0323, 0x0035, 0x0227, 0xFFFF }, { 0x0126, 0x080C, 0x0B09, 0xFFFF }, { 0x0411, 0x0619, 0x1A0F, 0xFFFF }, { 0x0210, 0x0331, 0x0603, 0x0515, 0x0907, 0x012B, + 0xFFFF }, { 0x0318, 0x002C, 0x0501, 0x0233, 0x0325, 0x071B, 0x002D, 0x081D, 0xFFFF }, { 0x0132, 0x0302, 0x0229, 0x110D, 0xFFFF }, { 0x0128, 0x041C, 0x0421, 0x0E0B, 0x0A1F, 0xFFFF }, { 0x0220, 0x0513, 0x0617, 0xFFFF }, { 0x0135, 0x0805, + 0x0327, 0xFFFF }, { 0x0316, 0x051E, 0x0D0E, 0x0423, 0xFFFF }, { 0x0222, 0x0404, 0x070A, 0x0511, 0x0719, 0x0C09, 0x1B0F, 0xFFFF }, { 0x0703, 0x0615, 0x0A07, 0x022B, 0xFFFF }, { 0x012A, 0x0431, 0x0601, 0x0333, 0x012D, 0x091D, 0xFFFF }, { + 0x0230, 0x0314, 0x0036, 0x0608, 0x0425, 0x0037, 0x0329, 0x081B, 0x120D, 0xFFFF }, { 0x0300, 0x0224, 0x0506, 0x0521, 0x0F0B, 0x0B1F, 0xFFFF }, { 0x041A, 0x0613, 0x0717, 0xFFFF }, { 0x0235, 0x0905, 0xFFFF }, { 0x0312, 0x0134, 0x0523, + 0x0427, 0xFFFF }, { 0x0226, 0x090C, 0x002E, 0x0611, 0x0D09, 0x002F, 0xFFFF }, { 0x0715, 0x0B07, 0x0819, 0x032B, 0x1C0F, 0xFFFF }, { 0x0310, 0x0531, 0x0701, 0x0803, 0x022D, 0x0A1D, 0xFFFF }, { 0x0418, 0x012C, 0x0433, 0x0525, 0x0137, 0x091B, + 0x130D, 0xFFFF }, { 0x0232, 0x0402, 0x0621, 0x0429, 0xFFFF }, { 0x0228, 0x051C, 0x0713, 0x100B, 0x0C1F, 0xFFFF }, { 0x0320, 0x0335, 0x0A05, 0x0817, 0xFFFF }, { 0x0623, 0x0527, 0xFFFF }, { 0x0416, 0x061E, 0x0E0E, 0x0711, 0x0E09, 0x012F, + 0xFFFF }, { 0x0322, 0x0504, 0x080A, 0x0919, 0x1D0F, 0xFFFF }, { 0x0631, 0x0903, 0x0815, 0x0C07, 0x042B, 0x032D, 0x0B1D, 0xFFFF }, { 0x022A, 0x0801, 0x0533, 0x0625, 0x0237, 0x0A1B, 0xFFFF }, { 0x0330, 0x0414, 0x0136, 0x0708, 0x0721, 0x0529, + 0x140D, 0xFFFF }, { 0x0400, 0x0324, 0x0606, 0x0038, 0x0039, 0x110B, 0x0D1F, 0xFFFF }, { 0x051A, 0x0813, 0x0B05, 0x0917, 0xFFFF }, { 0x0723, 0x0435, 0x0627, 0xFFFF }, { 0x0412, 0x0234, 0x0F09, 0x022F, 0xFFFF }, { 0x0326, 0x0A0C, 0x012E, + 0x0811, 0x0A19, 0x1E0F, 0xFFFF }, { 0x0731, 0x0A03, 0x0915, 0x0D07, 0x052B, 0xFFFF }, { 0x0410, 0x0901, 0x0633, 0x0725, 0x0337, 0x0B1B, 0x042D, 0x0C1D, 0xFFFF }, { 0x0518, 0x022C, 0x0629, 0x150D, 0xFFFF }, { 0x0332, 0x0502, 0x0821, 0x0139, + 0x120B, 0x0E1F, 0xFFFF }, { 0x0328, 0x061C, 0x0913, 0x0A17, 0xFFFF }, { 0x0420, 0x0535, 0x0C05, 0x0727, 0xFFFF }, { 0x0823, 0x032F, 0xFFFF }, { 0x0516, 0x071E, 0x0F0E, 0x0911, 0x0B19, 0x1009, 0x1F0F, 0xFFFF }, { 0x0422, 0x0604, 0x090A, + 0x0B03, 0x0A15, 0x0E07, 0x062B, 0xFFFF }, { 0x0831, 0x0A01, 0x0733, 0x052D, 0x0D1D, 0xFFFF }, { 0x032A, 0x0825, 0x0437, 0x0729, 0x0C1B, 0x160D, 0xFFFF }, { 0x0430, 0x0514, 0x0236, 0x0808, 0x0921, 0x0239, 0x130B, 0x0F1F, 0xFFFF }, { 0x0500, + 0x0424, 0x0706, 0x0138, 0x0A13, 0x0B17, 0xFFFF }, { 0x061A, 0x0635, 0x0D05, 0xFFFF }, { 0x0923, 0x0827, 0xFFFF }, { 0x0512, 0x0334, 0x003A, 0x0A11, 0x1109, 0x003B, 0x042F, 0xFFFF }, { 0x0426, 0x0B0C, 0x022E, 0x0B15, 0x0F07, 0x0C19, + 0x072B, 0xFFFF }, { 0x0931, 0x0B01, 0x0C03, 0x062D, 0x0E1D, 0xFFFF }, { 0x0510, 0x0833, 0x0925, 0x0537, 0x0D1B, 0x170D, 0xFFFF }, { 0x0618, 0x032C, 0x0A21, 0x0339, 0x0829, 0xFFFF }, { 0x0432, 0x0602, 0x0B13, 0x140B, 0x101F, 0xFFFF }, { + 0x0428, 0x071C, 0x0735, 0x0E05, 0x0C17, 0xFFFF }, { 0x0520, 0x0A23, 0x0927, 0xFFFF }, { 0x0B11, 0x1209, 0x013B, 0x052F, 0xFFFF }, { 0x0616, 0x081E, 0x0D19, 0xFFFF }, { 0x0522, 0x0704, 0x0A0A, 0x0A31, 0x0D03, 0x0C15, 0x1007, 0x082B, 0x072D, + 0x0F1D, 0xFFFF }, { 0x0C01, 0x0933, 0x0A25, 0x0637, 0x0E1B, 0xFFFF }, { 0x042A, 0x0B21, 0x0929, 0x180D, 0xFFFF }, { 0x0530, 0x0614, 0x0336, 0x0908, 0x0439, 0x150B, 0x111F, 0xFFFF }, { 0x0600, 0x0524, 0x0806, 0x0238, 0x0C13, 0x0F05, + 0x0D17, 0xFFFF }, { 0x071A, 0x0B23, 0x0835, 0x0A27, 0xFFFF }, { 0x1309, 0x023B, 0x062F, 0xFFFF }, { 0x0612, 0x0434, 0x013A, 0x0C11, 0x0E19, 0xFFFF }, { 0x0526, 0x0C0C, 0x032E, 0x0B31, 0x0E03, 0x0D15, 0x1107, 0x092B, 0xFFFF }, { 0x0D01, + 0x0A33, 0x0B25, 0x0737, 0x0F1B, 0x082D, 0x101D, 0xFFFF }, { 0x0610, 0x0A29, 0x190D, 0xFFFF }, { 0x0718, 0x042C, 0x0C21, 0x0539, 0x160B, 0x121F, 0xFFFF }, { 0x0532, 0x0702, 0x0D13, 0x0E17, 0xFFFF }, { 0x0528, 0x081C, 0x0935, 0x1005, 0x0B27, + 0xFFFF }, { 0x0620, 0x0C23, 0x033B, 0x072F, 0xFFFF }, { 0x0D11, 0x0F19, 0x1409, 0xFFFF }, { 0x0716, 0x003C, 0x091E, 0x0F03, 0x0E15, 0x1207, 0x0A2B, 0x003D, 0xFFFF }, { 0x0622, 0x0804, 0x0B0A, 0x0C31, 0x0E01, 0x0B33, 0x092D, 0x111D, + 0xFFFF }, { 0x0C25, 0x0837, 0x0B29, 0x101B, 0x1A0D, 0xFFFF }, { 0x052A, 0x0D21, 0x0639, 0x170B, 0x131F, 0xFFFF }, { 0x0630, 0x0714, 0x0436, 0x0A08, 0x0E13, 0x0F17, 0xFFFF }, { 0x0700, 0x0624, 0x0906, 0x0338, 0x0A35, 0x1105, 0xFFFF }, { + 0x081A, 0x0D23, 0x0C27, 0xFFFF }, { 0x0E11, 0x1509, 0x043B, 0x082F, 0xFFFF }, { 0x0712, 0x0534, 0x023A, 0x0F15, 0x1307, 0x1019, 0x0B2B, 0x013D, 0xFFFF }, { 0x0626, 0x0D0C, 0x042E, 0x0D31, 0x0F01, 0x1003, 0x0A2D, 0x121D, 0xFFFF }, { 0x0C33, + 0x0D25, 0x0937, 0x111B, 0x1B0D, 0xFFFF }, { 0x0710, 0x0E21, 0x0739, 0x0C29, 0xFFFF }, { 0x0818, 0x052C, 0x0F13, 0x180B, 0x141F, 0xFFFF }, { 0x0632, 0x0802, 0x0B35, 0x1205, 0x1017, 0xFFFF }, { 0x0628, 0x091C, 0x0E23, 0x0D27, 0xFFFF }, { + 0x0720, 0x0F11, 0x1609, 0x053B, 0x092F, 0xFFFF }, { 0x1119, 0x023D, 0xFFFF }, { 0x0816, 0x013C, 0x0A1E, 0x0E31, 0x1103, 0x1015, 0x1407, 0x0C2B, 0x0B2D, 0x131D, 0xFFFF }, { 0x0722, 0x0904, 0x0C0A, 0x1001, 0x0D33, 0x0E25, 0x0A37, 0x121B, + 0xFFFF }, { 0x0F21, 0x0D29, 0x1C0D, 0xFFFF }, { 0x062A, 0x0839, 0x190B, 0x151F, 0xFFFF }, { 0x0730, 0x0814, 0x0536, 0x0B08, 0x1013, 0x1305, 0x1117, 0xFFFF }, { 0x0800, 0x0724, 0x0A06, 0x0438, 0x0F23, 0x0C35, 0x0E27, 0xFFFF }, { 0x091A, + 0x1709, 0x063B, 0x0A2F, 0xFFFF }, { 0x1011, 0x1219, 0x033D, 0xFFFF }, { 0x0812, 0x0634, 0x033A, 0x0F31, 0x1203, 0x1115, 0x1507, 0x0D2B, 0xFFFF }, { 0x0726, 0x0E0C, 0x052E, 0x1101, 0x0E33, 0x0F25, 0x0B37, 0x131B, 0x0C2D, 0x141D, 0xFFFF }, { + 0x0E29, 0x1D0D, 0xFFFF }, { 0x0810, 0x1021, 0x0939, 0x1A0B, 0x161F, 0xFFFF }, { 0x0918, 0x062C, 0x1113, 0x1217, 0xFFFF }, { 0x0732, 0x0902, 0x0D35, 0x1405, 0x0F27, 0xFFFF }, { 0x0728, 0x0A1C, 0x1023, 0x073B, 0x0B2F, 0xFFFF }, { 0x0820, + 0x1111, 0x1319, 0x1809, 0xFFFF }, { 0x1303, 0x1215, 0x1607, 0x0E2B, 0x043D, 0xFFFF }, { 0x0916, 0x023C, 0x0B1E, 0x1031, 0x1201, 0x0F33, 0x0D2D, 0x151D, 0xFFFF }, { 0x0822, 0x0A04, 0x0D0A, 0x1025, 0x0C37, 0x0F29, 0x141B, 0x1E0D, 0xFFFF }, { + 0x1121, 0x0A39, 0x1B0B, 0x171F, 0xFFFF }, { 0x072A, 0x1213, 0x1317, 0xFFFF }, { 0x0830, 0x0914, 0x0636, 0x0C08, 0x0E35, 0x1505, 0xFFFF }, { 0x0900, 0x0824, 0x0B06, 0x0538, 0x1123, 0x1027, 0xFFFF }, { 0x0A1A, 0x1211, 0x1909, 0x083B, 0x0C2F, + 0xFFFF }, { 0x1315, 0x1707, 0x1419, 0x0F2B, 0x053D, 0xFFFF }, { 0x0912, 0x0734, 0x043A, 0x1131, 0x1301, 0x1403, 0x0E2D, 0x161D, 0xFFFF }, { 0x0826, 0x0F0C, 0x062E, 0x1033, 0x1125, 0x0D37, 0x151B, 0x1F0D, 0xFFFF }, { 0x1221, 0x0B39, 0x1029, + 0xFFFF }, { 0x0910, 0x1313, 0x1C0B, 0x181F, 0xFFFF }, { 0x0A18, 0x072C, 0x0F35, 0x1605, 0x1417, 0xFFFF }, { 0x0832, 0x0A02, 0x1223, 0x1127, 0xFFFF }, { 0x0828, 0x0B1C, 0x1311, 0x1A09, 0x093B, 0x0D2F, 0xFFFF }, { 0x0920, 0x1519, 0x063D, + 0xFFFF }, { 0x1231, 0x1503, 0x1415, 0x1807, 0x102B, 0x0F2D, 0x171D, 0xFFFF }, { 0x0A16, 0x033C, 0x0C1E, 0x1401, 0x1133, 0x1225, 0x0E37, 0x161B, 0xFFFF }, { 0x0922, 0x0B04, 0x0E0A, 0x1321, 0x1129, 0xFFFF }, { 0x0C39, 0x1D0B, 0x191F, 0xFFFF + }, { 0x082A, 0x1413, 0x1705, 0x1517, 0xFFFF }, { 0x0930, 0x0A14, 0x0736, 0x0D08, 0x1323, 0x1035, 0x1227, 0xFFFF }, { 0x0A00, 0x0924, 0x0C06, 0x0638, 0x1B09, 0x0A3B, 0x0E2F, 0xFFFF }, { 0x0B1A, 0x1411, 0x1619, 0x073D, 0xFFFF }, { 0x1331, + 0x1603, 0x1515, 0x1907, 0x112B, 0xFFFF }, { 0x0A12, 0x0834, 0x053A, 0x1501, 0x1233, 0x1325, 0x0F37, 0x171B, 0x102D, 0x181D, 0xFFFF }, { 0x0926, 0x072E, 0x1229, 0xFFFF }, { 0x1421, 0x0D39, 0x1E0B, 0x1A1F, 0xFFFF }, { 0x0A10, 0x1513, + 0x1617, 0xFFFF }, { 0x0B18, 0x082C, 0x1135, 0x1805, 0x1327, 0xFFFF }, { 0x0932, 0x0B02, 0x1423, 0x0B3B, 0x0F2F, 0xFFFF }, { 0x0928, 0x0C1C, 0x1511, 0x1719, 0x1C09, 0xFFFF }, { 0x0A20, 0x1703, 0x1615, 0x1A07, 0x122B, 0x083D, 0xFFFF }, { + 0x1431, 0x1601, 0x1333, 0x112D, 0x191D, 0xFFFF }, { 0x0B16, 0x043C, 0x0D1E, 0x1425, 0x1037, 0x1329, 0x181B, 0xFFFF }, { 0x0A22, 0x0C04, 0x0F0A, 0x1521, 0x0E39, 0x1F0B, 0x1B1F, 0xFFFF }, { 0x1613, 0x1717, 0xFFFF }, { 0x092A, 0x1235, 0x1905, + 0xFFFF }, { 0x0A30, 0x0B14, 0x0836, 0x0E08, 0x1523, 0x1427, 0xFFFF }, { 0x0B00, 0x0A24, 0x0D06, 0x0738, 0x1611, 0x1D09, 0x0C3B, 0x102F, 0xFFFF }, { 0x0C1A, 0x1715, 0x1B07, 0x1819, 0x132B, 0x093D, 0xFFFF }, { 0x1531, 0x1701, 0x1803, 0x122D, + 0x1A1D, 0xFFFF }, { 0x0B12, 0x0934, 0x063A, 0x1433, 0x1525, 0x1137, 0x191B, 0xFFFF }, { 0x0A26, 0x003E, 0x082E, 0x1621, 0x0F39, 0x1429, 0x003F, 0xFFFF }, { 0x1713, 0x1C1F, 0xFFFF }, { 0x0B10, 0x1335, 0x1A05, 0x1817, 0xFFFF }, { 0x0C18, + 0x092C, 0x1623, 0x1527, 0xFFFF }, { 0x0A32, 0x0C02, 0x1711, 0x1E09, 0x0D3B, 0x112F, 0xFFFF }, { 0x0A28, 0x0D1C, 0x1919, 0x0A3D, 0xFFFF }, { 0x0B20, 0x1631, 0x1903, 0x1815, 0x1C07, 0x142B, 0x132D, 0x1B1D, 0xFFFF }, { 0x1801, 0x1533, 0x1625, + 0x1237, 0x1A1B, 0xFFFF }, { 0x0C16, 0x053C, 0x0E1E, 0x1721, 0x1529, 0x013F, 0xFFFF }, { 0x0B22, 0x0D04, 0x1039, 0x1D1F, 0xFFFF }, { 0x1813, 0x1B05, 0x1917, 0xFFFF }, { 0x0A2A, 0x1723, 0x1435, 0x1627, 0xFFFF }, { 0x0B30, 0x0C14, 0x0936, + 0x0F08, 0x1F09, 0x0E3B, 0x122F, 0xFFFF }, { 0x0C00, 0x0B24, 0x0E06, 0x0838, 0x1811, 0x1A19, 0x0B3D, 0xFFFF }, { 0x0D1A, 0x1731, 0x1A03, 0x1915, 0x1D07, 0x152B, 0xFFFF }, { 0x1901, 0x1633, 0x1725, 0x1337, 0x1B1B, 0x142D, 0x1C1D, 0xFFFF }, { + 0x0C12, 0x0A34, 0x073A, 0x1629, 0x023F, 0xFFFF }, { 0x0B26, 0x013E, 0x092E, 0x1821, 0x1139, 0x1E1F, 0xFFFF }, { 0x1913, 0x1A17, 0xFFFF }, { 0x0C10, 0x1535, 0x1C05, 0x1727, 0xFFFF }, { 0x0D18, 0x0A2C, 0x1823, 0x0F3B, 0x132F, 0xFFFF }, { + 0x0B32, 0x0D02, 0x1911, 0x1B19, 0xFFFF }, { 0x0B28, 0x0E1C, 0x1B03, 0x1A15, 0x1E07, 0x162B, 0x0C3D, 0xFFFF }, { 0x0C20, 0x1831, 0x1A01, 0x1733, 0x152D, 0x1D1D, 0xFFFF }, { 0x1825, 0x1437, 0x1729, 0x1C1B, 0x033F, 0xFFFF }, { 0x0D16, 0x063C, + 0x0F1E, 0x1921, 0x1239, 0x1F1F, 0xFFFF }, { 0x0C22, 0x0E04, 0x1A13, 0x1B17, 0xFFFF }, { 0x1635, 0x1D05, 0xFFFF }, { 0x0B2A, 0x1923, 0x1827, 0xFFFF }, { 0x0C30, 0x0D14, 0x0A36, 0x1A11, 0x103B, 0x142F, 0xFFFF }, { 0x0D00, 0x0C24, 0x0F06, + 0x0938, 0x1B15, 0x1F07, 0x1C19, 0x172B, 0x0D3D, 0xFFFF }, { 0x0E1A, 0x1931, 0x1B01, 0x1C03, 0x162D, 0x1E1D, 0xFFFF }, { 0x1833, 0x1925, 0x1537, 0x1D1B, 0xFFFF }, { 0x0D12, 0x0B34, 0x083A, 0x1A21, 0x1339, 0x1829, 0x043F, 0xFFFF }, { 0x0C26, + 0x023E, 0x0A2E, 0x1B13, 0xFFFF }, { 0x1735, 0x1E05, 0x1C17, 0xFFFF }, { 0x0D10, 0x1A23, 0x1927, 0xFFFF }, { 0x0E18, 0x0B2C, 0x1B11, 0x113B, 0x152F, 0xFFFF }, { 0x0C32, 0x0E02, 0x1D19, 0x0E3D, 0xFFFF }, { 0x0C28, 0x0F1C, 0x1A31, 0x1D03, + 0x1C15, 0x182B, 0x172D, 0x1F1D, 0xFFFF }, { 0x0D20, 0x1C01, 0x1933, 0x1A25, 0x1637, 0x1E1B, 0xFFFF }, { 0x1B21, 0x1929, 0x053F, 0xFFFF }, { 0x0E16, 0x073C, 0x1439, 0xFFFF }, { 0x0D22, 0x0F04, 0x1C13, 0x1F05, 0x1D17, 0xFFFF }, { 0x1B23, + 0x1835, 0x1A27, 0xFFFF }, { 0x0C2A, 0x123B, 0x162F, 0xFFFF }, { 0x0D30, 0x0E14, 0x0B36, 0x1C11, 0x1E19, 0x0F3D, 0xFFFF }, { 0x0E00, 0x0D24, 0x0A38, 0x1B31, 0x1E03, 0x1D15, 0x192B, 0xFFFF }, { 0x0F1A, 0x1D01, 0x1A33, 0x1B25, 0x1737, 0x1F1B, + 0x182D, 0xFFFF }, { 0x1A29, 0x063F, 0xFFFF }, { 0x0E12, 0x0C34, 0x093A, 0x1C21, 0x1539, 0xFFFF }, { 0x0D26, 0x033E, 0x0B2E, 0x1D13, 0x1E17, 0xFFFF }, { 0x1935, 0x1B27, 0xFFFF }, { 0x0E10, 0x1C23, 0x133B, 0x172F, 0xFFFF }, { 0x0F18, + 0x0C2C, 0x1D11, 0x1F19, 0xFFFF }, { 0x0D32, 0x0F02, 0x1F03, 0x1E15, 0x1A2B, 0x103D, 0xFFFF }, { 0x0D28, 0x1C31, 0x1E01, 0x1B33, 0x192D, 0xFFFF }, { 0x0E20, 0x1C25, 0x1837, 0x1B29, 0x073F, 0xFFFF }, { 0x1D21, 0x1639, 0xFFFF }, { 0x0F16, + 0x083C, 0x1E13, 0x1F17, 0xFFFF }, { 0x0E22, 0x1A35, 0xFFFF }, { 0x1D23, 0x1C27, 0xFFFF }, { 0x0D2A, 0x1E11, 0x143B, 0x182F, 0xFFFF }, { 0x0E30, 0x0F14, 0x0C36, 0x1F15, 0x1B2B, 0x113D, 0xFFFF }, { 0x0F00, 0x0E24, 0x0B38, 0x1D31, 0x1F01, + 0x1A2D, 0xFFFF }, { 0x1C33, 0x1D25, 0x1937, 0xFFFF }, { 0x1E21, 0x1739, 0x1C29, 0x083F, 0xFFFF }, { 0x0F12, 0x0D34, 0x0A3A, 0x1F13, 0xFFFF }, { 0x0E26, 0x043E, 0x0C2E, 0x1B35, 0xFFFF }, { 0x1E23, 0x1D27, 0xFFFF }, { 0x0F10, 0x1F11, 0x153B, 0x192F, 0xFFFF }, { 0x0D2C, 0x123D, 0xFFFF }, + }; + + static uint32_t etc1_decode_value(uint32_t diff, uint32_t inten, uint32_t selector, uint32_t packed_c) + { + const uint32_t limit = diff ? 32 : 16; + BASISU_NOTE_UNUSED(limit); + assert((diff < 2) && (inten < 8) && (selector < 4) && (packed_c < limit)); + int c; + if (diff) + c = (packed_c >> 2) | (packed_c << 3); + else + c = packed_c | (packed_c << 4); + c += g_etc1_inten_tables[inten][selector]; + c = clamp(c, 0, 255); + return c; + } + + void pack_etc1_solid_color_init() + { + for (uint32_t diff = 0; diff < 2; diff++) + { + const uint32_t limit = diff ? 32 : 16; + + for (uint32_t inten = 0; inten < 8; inten++) + { + for (uint32_t selector = 0; selector < 4; selector++) + { + const uint32_t inverse_table_index = diff + (inten << 1) + (selector << 4); + for (uint32_t color = 0; color < 256; color++) + { + uint32_t best_error = UINT32_MAX, best_packed_c = 0; + for (uint32_t packed_c = 0; packed_c < limit; packed_c++) + { + int v = etc1_decode_value(diff, inten, selector, packed_c); + uint32_t err = (uint32_t)labs(v - static_cast(color)); + if (err < best_error) + { + best_error = err; + best_packed_c = packed_c; + if (!best_error) + break; + } + } + assert(best_error <= 255); + g_etc1_inverse_lookup[inverse_table_index][color] = static_cast(best_packed_c | (best_error << 8)); + } + } + } + } + +#if 0 + for (uint32_t y = 0; y < 64; y++) + { + printf("{"); + for (uint32_t x = 0; x < 256; x++) + { + printf("0x%X", g_etc1_inverse_lookup[y][x]); + if (x != 255) + printf(","); + if (((x & 63) == 63) && (x != 255)) + printf("\n"); + } + printf("},\n"); + } +#endif + } + + // Packs solid color blocks efficiently using a set of small precomputed tables. + // For random 888 inputs, MSE results are better than Erricson's ETC1 packer in "slow" mode ~9.5% of the time, is slightly worse only ~.01% of the time, and is equal the rest of the time. + uint64_t pack_etc1_block_solid_color(etc_block& block, const uint8_t* pColor) + { + assert(g_etc1_inverse_lookup[0][255]); + + static uint32_t s_next_comp[4] = { 1, 2, 0, 1 }; + + uint32_t best_error = UINT32_MAX, best_i = 0; + int best_x = 0, best_packed_c1 = 0, best_packed_c2 = 0; + + // For each possible 8-bit value, there is a precomputed list of diff/inten/selector configurations that allow that 8-bit value to be encoded with no error. + for (uint32_t i = 0; i < 3; i++) + { + const uint32_t c1 = pColor[s_next_comp[i]], c2 = pColor[s_next_comp[i + 1]]; + + const int delta_range = 1; + for (int delta = -delta_range; delta <= delta_range; delta++) + { + const int c_plus_delta = clamp(pColor[i] + delta, 0, 255); + + const uint16_t* pTable; + if (!c_plus_delta) + pTable = g_etc1_color8_to_etc_block_config_0_255[0]; + else if (c_plus_delta == 255) + pTable = g_etc1_color8_to_etc_block_config_0_255[1]; + else + pTable = g_etc1_color8_to_etc_block_config_1_to_254[c_plus_delta - 1]; + + do + { + const uint32_t x = *pTable++; + +#ifdef _DEBUG + const uint32_t diff = x & 1; + const uint32_t inten = (x >> 1) & 7; + const uint32_t selector = (x >> 4) & 3; + const uint32_t p0 = (x >> 8) & 255; + assert(etc1_decode_value(diff, inten, selector, p0) == (uint32_t)c_plus_delta); +#endif + + const uint16_t* pInverse_table = g_etc1_inverse_lookup[x & 0xFF]; + uint16_t p1 = pInverse_table[c1]; + uint16_t p2 = pInverse_table[c2]; + const uint32_t trial_error = square(c_plus_delta - pColor[i]) + square(p1 >> 8) + square(p2 >> 8); + if (trial_error < best_error) + { + best_error = trial_error; + best_x = x; + best_packed_c1 = p1 & 0xFF; + best_packed_c2 = p2 & 0xFF; + best_i = i; + if (!best_error) + goto found_perfect_match; + } + } while (*pTable != 0xFFFF); + } + } + found_perfect_match: + + const uint32_t diff = best_x & 1; + const uint32_t inten = (best_x >> 1) & 7; + + block.m_bytes[3] = static_cast(((inten | (inten << 3)) << 2) | (diff << 1)); + + const uint32_t etc1_selector = g_selector_index_to_etc1[(best_x >> 4) & 3]; + *reinterpret_cast(&block.m_bytes[4]) = (etc1_selector & 2) ? 0xFFFF : 0; + *reinterpret_cast(&block.m_bytes[6]) = (etc1_selector & 1) ? 0xFFFF : 0; + + const uint32_t best_packed_c0 = (best_x >> 8) & 255; + if (diff) + { + block.m_bytes[best_i] = static_cast(best_packed_c0 << 3); + block.m_bytes[s_next_comp[best_i]] = static_cast(best_packed_c1 << 3); + block.m_bytes[s_next_comp[best_i + 1]] = static_cast(best_packed_c2 << 3); + } + else + { + block.m_bytes[best_i] = static_cast(best_packed_c0 | (best_packed_c0 << 4)); + block.m_bytes[s_next_comp[best_i]] = static_cast(best_packed_c1 | (best_packed_c1 << 4)); + block.m_bytes[s_next_comp[best_i + 1]] = static_cast(best_packed_c2 | (best_packed_c2 << 4)); + } + + return best_error; + } + + const uint32_t BASISU_ETC1_CLUSTER_FIT_ORDER_TABLE_SIZE = 165; + + static const struct { uint8_t m_v[4]; } g_cluster_fit_order_tab[BASISU_ETC1_CLUSTER_FIT_ORDER_TABLE_SIZE] = + { + { { 0, 0, 0, 8 } },{ { 0, 5, 2, 1 } },{ { 0, 6, 1, 1 } },{ { 0, 7, 0, 1 } },{ { 0, 7, 1, 0 } }, + { { 0, 0, 8, 0 } },{ { 0, 0, 3, 5 } },{ { 0, 1, 7, 0 } },{ { 0, 0, 4, 4 } },{ { 0, 0, 2, 6 } }, + { { 0, 0, 7, 1 } },{ { 0, 0, 1, 7 } },{ { 0, 0, 5, 3 } },{ { 1, 6, 0, 1 } },{ { 0, 0, 6, 2 } }, + { { 0, 2, 6, 0 } },{ { 2, 4, 2, 0 } },{ { 0, 3, 5, 0 } },{ { 3, 3, 1, 1 } },{ { 4, 2, 0, 2 } }, + { { 1, 5, 2, 0 } },{ { 0, 5, 3, 0 } },{ { 0, 6, 2, 0 } },{ { 2, 4, 1, 1 } },{ { 5, 1, 0, 2 } }, + { { 6, 1, 1, 0 } },{ { 3, 3, 0, 2 } },{ { 6, 0, 0, 2 } },{ { 0, 8, 0, 0 } },{ { 6, 1, 0, 1 } }, + { { 0, 1, 6, 1 } },{ { 1, 6, 1, 0 } },{ { 4, 1, 3, 0 } },{ { 0, 2, 5, 1 } },{ { 5, 0, 3, 0 } }, + { { 5, 3, 0, 0 } },{ { 0, 1, 5, 2 } },{ { 0, 3, 4, 1 } },{ { 2, 5, 1, 0 } },{ { 1, 7, 0, 0 } }, + { { 0, 1, 4, 3 } },{ { 6, 0, 2, 0 } },{ { 0, 4, 4, 0 } },{ { 2, 6, 0, 0 } },{ { 0, 2, 4, 2 } }, + { { 0, 5, 1, 2 } },{ { 0, 6, 0, 2 } },{ { 3, 5, 0, 0 } },{ { 0, 4, 3, 1 } },{ { 3, 4, 1, 0 } }, + { { 4, 3, 1, 0 } },{ { 1, 5, 0, 2 } },{ { 0, 3, 3, 2 } },{ { 1, 4, 1, 2 } },{ { 0, 4, 2, 2 } }, + { { 2, 3, 3, 0 } },{ { 4, 4, 0, 0 } },{ { 1, 2, 4, 1 } },{ { 0, 5, 0, 3 } },{ { 0, 1, 3, 4 } }, + { { 1, 5, 1, 1 } },{ { 1, 4, 2, 1 } },{ { 1, 3, 2, 2 } },{ { 5, 2, 1, 0 } },{ { 1, 3, 3, 1 } }, + { { 0, 1, 2, 5 } },{ { 1, 1, 5, 1 } },{ { 0, 3, 2, 3 } },{ { 2, 5, 0, 1 } },{ { 3, 2, 2, 1 } }, + { { 2, 3, 0, 3 } },{ { 1, 4, 3, 0 } },{ { 2, 2, 1, 3 } },{ { 6, 2, 0, 0 } },{ { 1, 0, 6, 1 } }, + { { 3, 3, 2, 0 } },{ { 7, 1, 0, 0 } },{ { 3, 1, 4, 0 } },{ { 0, 2, 3, 3 } },{ { 0, 4, 1, 3 } }, + { { 0, 4, 0, 4 } },{ { 0, 1, 0, 7 } },{ { 2, 0, 5, 1 } },{ { 2, 0, 4, 2 } },{ { 3, 0, 2, 3 } }, + { { 2, 2, 4, 0 } },{ { 2, 2, 3, 1 } },{ { 4, 0, 3, 1 } },{ { 3, 2, 3, 0 } },{ { 2, 3, 2, 1 } }, + { { 1, 3, 4, 0 } },{ { 7, 0, 1, 0 } },{ { 3, 0, 4, 1 } },{ { 1, 0, 5, 2 } },{ { 8, 0, 0, 0 } }, + { { 3, 0, 1, 4 } },{ { 4, 1, 1, 2 } },{ { 4, 0, 2, 2 } },{ { 1, 2, 5, 0 } },{ { 4, 2, 1, 1 } }, + { { 3, 4, 0, 1 } },{ { 2, 0, 3, 3 } },{ { 5, 0, 1, 2 } },{ { 5, 0, 0, 3 } },{ { 2, 4, 0, 2 } }, + { { 2, 1, 4, 1 } },{ { 4, 0, 1, 3 } },{ { 2, 1, 5, 0 } },{ { 4, 2, 2, 0 } },{ { 4, 0, 4, 0 } }, + { { 1, 0, 4, 3 } },{ { 1, 4, 0, 3 } },{ { 3, 0, 3, 2 } },{ { 4, 3, 0, 1 } },{ { 0, 1, 1, 6 } }, + { { 1, 3, 1, 3 } },{ { 0, 2, 2, 4 } },{ { 2, 0, 2, 4 } },{ { 5, 1, 1, 1 } },{ { 3, 0, 5, 0 } }, + { { 2, 3, 1, 2 } },{ { 3, 0, 0, 5 } },{ { 0, 3, 1, 4 } },{ { 5, 0, 2, 1 } },{ { 2, 1, 3, 2 } }, + { { 2, 0, 6, 0 } },{ { 3, 1, 3, 1 } },{ { 5, 1, 2, 0 } },{ { 1, 0, 3, 4 } },{ { 1, 1, 6, 0 } }, + { { 4, 0, 0, 4 } },{ { 2, 0, 1, 5 } },{ { 0, 3, 0, 5 } },{ { 1, 3, 0, 4 } },{ { 4, 1, 2, 1 } }, + { { 1, 2, 3, 2 } },{ { 3, 1, 0, 4 } },{ { 5, 2, 0, 1 } },{ { 1, 2, 2, 3 } },{ { 3, 2, 1, 2 } }, + { { 2, 2, 2, 2 } },{ { 6, 0, 1, 1 } },{ { 1, 2, 1, 4 } },{ { 1, 1, 4, 2 } },{ { 3, 2, 0, 3 } }, + { { 1, 2, 0, 5 } },{ { 1, 0, 7, 0 } },{ { 3, 1, 2, 2 } },{ { 1, 0, 2, 5 } },{ { 2, 0, 0, 6 } }, + { { 2, 1, 1, 4 } },{ { 2, 2, 0, 4 } },{ { 1, 1, 3, 3 } },{ { 7, 0, 0, 1 } },{ { 1, 0, 0, 7 } }, + { { 2, 1, 2, 3 } },{ { 4, 1, 0, 3 } },{ { 3, 1, 1, 3 } },{ { 1, 1, 2, 4 } },{ { 2, 1, 0, 5 } }, + { { 1, 0, 1, 6 } },{ { 0, 2, 1, 5 } },{ { 0, 2, 0, 6 } },{ { 1, 1, 1, 5 } },{ { 1, 1, 0, 6 } } + }; + + const int g_etc1_inten_tables[cETC1IntenModifierValues][cETC1SelectorValues] = + { + { -8, -2, 2, 8 }, { -17, -5, 5, 17 }, { -29, -9, 9, 29 }, { -42, -13, 13, 42 }, + { -60, -18, 18, 60 }, { -80, -24, 24, 80 }, { -106, -33, 33, 106 }, { -183, -47, 47, 183 } + }; + + const uint8_t g_etc1_to_selector_index[cETC1SelectorValues] = { 2, 3, 1, 0 }; + const uint8_t g_selector_index_to_etc1[cETC1SelectorValues] = { 3, 2, 0, 1 }; + + // [flip][subblock][pixel_index] + const etc_coord2 g_etc1_pixel_coords[2][2][8] = + { + { + { + { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 }, + { 1, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 } + }, + { + { 2, 0 }, { 2, 1 }, { 2, 2 }, { 2, 3 }, + { 3, 0 }, { 3, 1 }, { 3, 2 }, { 3, 3 } + } + }, + { + { + { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, + { 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1 } + }, + { + { 0, 2 }, { 1, 2 }, { 2, 2 }, { 3, 2 }, + { 0, 3 }, { 1, 3 }, { 2, 3 }, { 3, 3 } + }, + } + }; + + // [flip][subblock][pixel_index] + const uint32_t g_etc1_pixel_indices[2][2][8] = + { + { + { + 0 + 4 * 0, 0 + 4 * 1, 0 + 4 * 2, 0 + 4 * 3, + 1 + 4 * 0, 1 + 4 * 1, 1 + 4 * 2, 1 + 4 * 3 + }, + { + 2 + 4 * 0, 2 + 4 * 1, 2 + 4 * 2, 2 + 4 * 3, + 3 + 4 * 0, 3 + 4 * 1, 3 + 4 * 2, 3 + 4 * 3 + } + }, + { + { + 0 + 4 * 0, 1 + 4 * 0, 2 + 4 * 0, 3 + 4 * 0, + 0 + 4 * 1, 1 + 4 * 1, 2 + 4 * 1, 3 + 4 * 1 + }, + { + 0 + 4 * 2, 1 + 4 * 2, 2 + 4 * 2, 3 + 4 * 2, + 0 + 4 * 3, 1 + 4 * 3, 2 + 4 * 3, 3 + 4 * 3 + }, + } + }; + + uint16_t etc_block::pack_color5(const color_rgba& color, bool scaled, uint32_t bias) + { + return pack_color5(color.r, color.g, color.b, scaled, bias); + } + + uint16_t etc_block::pack_color5(uint32_t r, uint32_t g, uint32_t b, bool scaled, uint32_t bias) + { + if (scaled) + { + r = (r * 31U + bias) / 255U; + g = (g * 31U + bias) / 255U; + b = (b * 31U + bias) / 255U; + } + + r = minimum(r, 31U); + g = minimum(g, 31U); + b = minimum(b, 31U); + + return static_cast(b | (g << 5U) | (r << 10U)); + } + + color_rgba etc_block::unpack_color5(uint16_t packed_color5, bool scaled, uint32_t alpha) + { + uint32_t b = packed_color5 & 31U; + uint32_t g = (packed_color5 >> 5U) & 31U; + uint32_t r = (packed_color5 >> 10U) & 31U; + + if (scaled) + { + b = (b << 3U) | (b >> 2U); + g = (g << 3U) | (g >> 2U); + r = (r << 3U) | (r >> 2U); + } + + return color_rgba(cNoClamp, r, g, b, minimum(alpha, 255U)); + } + + void etc_block::unpack_color5(color_rgba& result, uint16_t packed_color5, bool scaled) + { + result = unpack_color5(packed_color5, scaled, 255); + } + + void etc_block::unpack_color5(uint32_t& r, uint32_t& g, uint32_t& b, uint16_t packed_color5, bool scaled) + { + color_rgba c(unpack_color5(packed_color5, scaled, 0)); + r = c.r; + g = c.g; + b = c.b; + } + + bool etc_block::unpack_color5(color_rgba& result, uint16_t packed_color5, uint16_t packed_delta3, bool scaled, uint32_t alpha) + { + color_rgba_i16 dc(unpack_delta3(packed_delta3)); + + int b = (packed_color5 & 31U) + dc.b; + int g = ((packed_color5 >> 5U) & 31U) + dc.g; + int r = ((packed_color5 >> 10U) & 31U) + dc.r; + + bool success = true; + if (static_cast(r | g | b) > 31U) + { + success = false; + r = clamp(r, 0, 31); + g = clamp(g, 0, 31); + b = clamp(b, 0, 31); + } + + if (scaled) + { + b = (b << 3U) | (b >> 2U); + g = (g << 3U) | (g >> 2U); + r = (r << 3U) | (r >> 2U); + } + + result.set_noclamp_rgba(r, g, b, minimum(alpha, 255U)); + return success; + } + + bool etc_block::unpack_color5(uint32_t& r, uint32_t& g, uint32_t& b, uint16_t packed_color5, uint16_t packed_delta3, bool scaled, uint32_t alpha) + { + color_rgba result; + const bool success = unpack_color5(result, packed_color5, packed_delta3, scaled, alpha); + r = result.r; + g = result.g; + b = result.b; + return success; + } + + uint16_t etc_block::pack_delta3(const color_rgba_i16& color) + { + return pack_delta3(color.r, color.g, color.b); + } + + uint16_t etc_block::pack_delta3(int r, int g, int b) + { + assert((r >= cETC1ColorDeltaMin) && (r <= cETC1ColorDeltaMax)); + assert((g >= cETC1ColorDeltaMin) && (g <= cETC1ColorDeltaMax)); + assert((b >= cETC1ColorDeltaMin) && (b <= cETC1ColorDeltaMax)); + if (r < 0) r += 8; + if (g < 0) g += 8; + if (b < 0) b += 8; + return static_cast(b | (g << 3) | (r << 6)); + } + + color_rgba_i16 etc_block::unpack_delta3(uint16_t packed_delta3) + { + int r = (packed_delta3 >> 6) & 7; + int g = (packed_delta3 >> 3) & 7; + int b = packed_delta3 & 7; + if (r >= 4) r -= 8; + if (g >= 4) g -= 8; + if (b >= 4) b -= 8; + return color_rgba_i16(r, g, b, 255); + } + + void etc_block::unpack_delta3(int& r, int& g, int& b, uint16_t packed_delta3) + { + r = (packed_delta3 >> 6) & 7; + g = (packed_delta3 >> 3) & 7; + b = packed_delta3 & 7; + if (r >= 4) r -= 8; + if (g >= 4) g -= 8; + if (b >= 4) b -= 8; + } + + uint16_t etc_block::pack_color4(const color_rgba& color, bool scaled, uint32_t bias) + { + return pack_color4(color.r, color.g, color.b, scaled, bias); + } + + uint16_t etc_block::pack_color4(uint32_t r, uint32_t g, uint32_t b, bool scaled, uint32_t bias) + { + if (scaled) + { + r = (r * 15U + bias) / 255U; + g = (g * 15U + bias) / 255U; + b = (b * 15U + bias) / 255U; + } + + r = minimum(r, 15U); + g = minimum(g, 15U); + b = minimum(b, 15U); + + return static_cast(b | (g << 4U) | (r << 8U)); + } + + color_rgba etc_block::unpack_color4(uint16_t packed_color4, bool scaled, uint32_t alpha) + { + uint32_t b = packed_color4 & 15U; + uint32_t g = (packed_color4 >> 4U) & 15U; + uint32_t r = (packed_color4 >> 8U) & 15U; + + if (scaled) + { + b = (b << 4U) | b; + g = (g << 4U) | g; + r = (r << 4U) | r; + } + + return color_rgba(cNoClamp, r, g, b, minimum(alpha, 255U)); + } + + void etc_block::unpack_color4(uint32_t& r, uint32_t& g, uint32_t& b, uint16_t packed_color4, bool scaled) + { + color_rgba c(unpack_color4(packed_color4, scaled, 0)); + r = c.r; + g = c.g; + b = c.b; + } + + void etc_block::get_diff_subblock_colors(color_rgba* pDst, uint16_t packed_color5, uint32_t table_idx) + { + assert(table_idx < cETC1IntenModifierValues); + const int *pInten_modifer_table = &g_etc1_inten_tables[table_idx][0]; + + uint32_t r, g, b; + unpack_color5(r, g, b, packed_color5, true); + + const int ir = static_cast(r), ig = static_cast(g), ib = static_cast(b); + + const int y0 = pInten_modifer_table[0]; + pDst[0].set(ir + y0, ig + y0, ib + y0, 255); + + const int y1 = pInten_modifer_table[1]; + pDst[1].set(ir + y1, ig + y1, ib + y1, 255); + + const int y2 = pInten_modifer_table[2]; + pDst[2].set(ir + y2, ig + y2, ib + y2, 255); + + const int y3 = pInten_modifer_table[3]; + pDst[3].set(ir + y3, ig + y3, ib + y3, 255); + } + + bool etc_block::get_diff_subblock_colors(color_rgba* pDst, uint16_t packed_color5, uint16_t packed_delta3, uint32_t table_idx) + { + assert(table_idx < cETC1IntenModifierValues); + const int *pInten_modifer_table = &g_etc1_inten_tables[table_idx][0]; + + uint32_t r, g, b; + bool success = unpack_color5(r, g, b, packed_color5, packed_delta3, true); + + const int ir = static_cast(r), ig = static_cast(g), ib = static_cast(b); + + const int y0 = pInten_modifer_table[0]; + pDst[0].set(ir + y0, ig + y0, ib + y0, 255); + + const int y1 = pInten_modifer_table[1]; + pDst[1].set(ir + y1, ig + y1, ib + y1, 255); + + const int y2 = pInten_modifer_table[2]; + pDst[2].set(ir + y2, ig + y2, ib + y2, 255); + + const int y3 = pInten_modifer_table[3]; + pDst[3].set(ir + y3, ig + y3, ib + y3, 255); + + return success; + } + + void etc_block::get_abs_subblock_colors(color_rgba* pDst, uint16_t packed_color4, uint32_t table_idx) + { + assert(table_idx < cETC1IntenModifierValues); + const int *pInten_modifer_table = &g_etc1_inten_tables[table_idx][0]; + + uint32_t r, g, b; + unpack_color4(r, g, b, packed_color4, true); + + const int ir = static_cast(r), ig = static_cast(g), ib = static_cast(b); + + const int y0 = pInten_modifer_table[0]; + pDst[0].set(ir + y0, ig + y0, ib + y0, 255); + + const int y1 = pInten_modifer_table[1]; + pDst[1].set(ir + y1, ig + y1, ib + y1, 255); + + const int y2 = pInten_modifer_table[2]; + pDst[2].set(ir + y2, ig + y2, ib + y2, 255); + + const int y3 = pInten_modifer_table[3]; + pDst[3].set(ir + y3, ig + y3, ib + y3, 255); + } + + bool unpack_etc1(const etc_block& block, color_rgba *pDst, bool preserve_alpha) + { + const bool diff_flag = block.get_diff_bit(); + const bool flip_flag = block.get_flip_bit(); + const uint32_t table_index0 = block.get_inten_table(0); + const uint32_t table_index1 = block.get_inten_table(1); + + color_rgba subblock_colors0[4]; + color_rgba subblock_colors1[4]; + + if (diff_flag) + { + const uint16_t base_color5 = block.get_base5_color(); + const uint16_t delta_color3 = block.get_delta3_color(); + etc_block::get_diff_subblock_colors(subblock_colors0, base_color5, table_index0); + + if (!etc_block::get_diff_subblock_colors(subblock_colors1, base_color5, delta_color3, table_index1)) + return false; + } + else + { + const uint16_t base_color4_0 = block.get_base4_color(0); + etc_block::get_abs_subblock_colors(subblock_colors0, base_color4_0, table_index0); + + const uint16_t base_color4_1 = block.get_base4_color(1); + etc_block::get_abs_subblock_colors(subblock_colors1, base_color4_1, table_index1); + } + + if (preserve_alpha) + { + if (flip_flag) + { + for (uint32_t y = 0; y < 2; y++) + { + pDst[0].set_rgb(subblock_colors0[block.get_selector(0, y)]); + pDst[1].set_rgb(subblock_colors0[block.get_selector(1, y)]); + pDst[2].set_rgb(subblock_colors0[block.get_selector(2, y)]); + pDst[3].set_rgb(subblock_colors0[block.get_selector(3, y)]); + pDst += 4; + } + + for (uint32_t y = 2; y < 4; y++) + { + pDst[0].set_rgb(subblock_colors1[block.get_selector(0, y)]); + pDst[1].set_rgb(subblock_colors1[block.get_selector(1, y)]); + pDst[2].set_rgb(subblock_colors1[block.get_selector(2, y)]); + pDst[3].set_rgb(subblock_colors1[block.get_selector(3, y)]); + pDst += 4; + } + } + else + { + for (uint32_t y = 0; y < 4; y++) + { + pDst[0].set_rgb(subblock_colors0[block.get_selector(0, y)]); + pDst[1].set_rgb(subblock_colors0[block.get_selector(1, y)]); + pDst[2].set_rgb(subblock_colors1[block.get_selector(2, y)]); + pDst[3].set_rgb(subblock_colors1[block.get_selector(3, y)]); + pDst += 4; + } + } + } + else + { + if (flip_flag) + { + // 0000 + // 0000 + // 1111 + // 1111 + for (uint32_t y = 0; y < 2; y++) + { + pDst[0] = subblock_colors0[block.get_selector(0, y)]; + pDst[1] = subblock_colors0[block.get_selector(1, y)]; + pDst[2] = subblock_colors0[block.get_selector(2, y)]; + pDst[3] = subblock_colors0[block.get_selector(3, y)]; + pDst += 4; + } + + for (uint32_t y = 2; y < 4; y++) + { + pDst[0] = subblock_colors1[block.get_selector(0, y)]; + pDst[1] = subblock_colors1[block.get_selector(1, y)]; + pDst[2] = subblock_colors1[block.get_selector(2, y)]; + pDst[3] = subblock_colors1[block.get_selector(3, y)]; + pDst += 4; + } + } + else + { + // 0011 + // 0011 + // 0011 + // 0011 + for (uint32_t y = 0; y < 4; y++) + { + pDst[0] = subblock_colors0[block.get_selector(0, y)]; + pDst[1] = subblock_colors0[block.get_selector(1, y)]; + pDst[2] = subblock_colors1[block.get_selector(2, y)]; + pDst[3] = subblock_colors1[block.get_selector(3, y)]; + pDst += 4; + } + } + } + + return true; + } + + inline int extend_6_to_8(uint32_t n) + { + return (n << 2) | (n >> 4); + } + + inline int extend_7_to_8(uint32_t n) + { + return (n << 1) | (n >> 6); + } + + inline int extend_4_to_8(uint32_t n) + { + return (n << 4) | n; + } + + uint64_t etc_block::evaluate_etc1_error(const color_rgba* pBlock_pixels, bool perceptual, int subblock_index) const + { + color_rgba unpacked_block[16]; + + unpack_etc1(*this, unpacked_block); + + uint64_t total_error = 0; + + if (subblock_index < 0) + { + for (uint32_t i = 0; i < 16; i++) + total_error += color_distance(perceptual, pBlock_pixels[i], unpacked_block[i], false); + } + else + { + const bool flip_bit = get_flip_bit(); + + for (uint32_t i = 0; i < 8; i++) + { + const uint32_t idx = g_etc1_pixel_indices[flip_bit][subblock_index][i]; + + total_error += color_distance(perceptual, pBlock_pixels[idx], unpacked_block[idx], false); + } + } + + return total_error; + } + + void etc_block::get_subblock_pixels(color_rgba* pPixels, int subblock_index) const + { + if (subblock_index < 0) + unpack_etc1(*this, pPixels); + else + { + color_rgba unpacked_block[16]; + + unpack_etc1(*this, unpacked_block); + + const bool flip_bit = get_flip_bit(); + + for (uint32_t i = 0; i < 8; i++) + { + const uint32_t idx = g_etc1_pixel_indices[flip_bit][subblock_index][i]; + + pPixels[i] = unpacked_block[idx]; + } + } + } + + bool etc1_optimizer::compute() + { + assert(m_pResult->m_pSelectors); + + if (m_pParams->m_pForce_selectors) + { + assert(m_pParams->m_quality >= cETCQualitySlow); + if (m_pParams->m_quality < cETCQualitySlow) + return false; + } + + const uint32_t n = m_pParams->m_num_src_pixels; + + if (m_pParams->m_cluster_fit) + { + if (m_pParams->m_quality == cETCQualityFast) + compute_internal_cluster_fit(4); + else if (m_pParams->m_quality == cETCQualityMedium) + compute_internal_cluster_fit(16); + else if (m_pParams->m_quality == cETCQualitySlow) + compute_internal_cluster_fit(64); + else + compute_internal_cluster_fit(BASISU_ETC1_CLUSTER_FIT_ORDER_TABLE_SIZE); + } + else + compute_internal_neighborhood(m_br, m_bg, m_bb); + + if (!m_best_solution.m_valid) + { + m_pResult->m_error = UINT32_MAX; + return false; + } + + //const uint8_t* pSelectors = &m_best_solution.m_selectors[0]; + const uint8_t* pSelectors = m_pParams->m_pForce_selectors ? m_pParams->m_pForce_selectors : &m_best_solution.m_selectors[0]; + +#if defined(DEBUG) || defined(_DEBUG) + { + // sanity check the returned error + color_rgba block_colors[4]; + m_best_solution.m_coords.get_block_colors(block_colors); + + const color_rgba* pSrc_pixels = m_pParams->m_pSrc_pixels; + uint64_t actual_error = 0; + + bool perceptual; + if (m_pParams->m_quality >= cETCQualityMedium) + perceptual = m_pParams->m_perceptual; + else + perceptual = (m_pParams->m_quality == cETCQualityFast) ? false : m_pParams->m_perceptual; + + for (uint32_t i = 0; i < n; i++) + actual_error += color_distance(perceptual, pSrc_pixels[i], block_colors[pSelectors[i]], false); + + assert(actual_error == m_best_solution.m_error); + } +#endif + + m_pResult->m_error = m_best_solution.m_error; + + m_pResult->m_block_color_unscaled = m_best_solution.m_coords.m_unscaled_color; + m_pResult->m_block_color4 = m_best_solution.m_coords.m_color4; + + m_pResult->m_block_inten_table = m_best_solution.m_coords.m_inten_table; + memcpy(m_pResult->m_pSelectors, pSelectors, n); + m_pResult->m_n = n; + + return true; + } + + void etc1_optimizer::refine_solution(uint32_t max_refinement_trials) + { + // Now we have the input block, the avg. color of the input pixels, a set of trial selector indices, and the block color+intensity index. + // Now, for each component, attempt to refine the current solution by solving a simple linear equation. For example, for 4 colors: + // The goal is: + // pixel0 - (block_color+inten_table[selector0]) + pixel1 - (block_color+inten_table[selector1]) + pixel2 - (block_color+inten_table[selector2]) + pixel3 - (block_color+inten_table[selector3]) = 0 + // Rearranging this: + // (pixel0 + pixel1 + pixel2 + pixel3) - (block_color+inten_table[selector0]) - (block_color+inten_table[selector1]) - (block_color+inten_table[selector2]) - (block_color+inten_table[selector3]) = 0 + // (pixel0 + pixel1 + pixel2 + pixel3) - block_color - inten_table[selector0] - block_color-inten_table[selector1] - block_color-inten_table[selector2] - block_color-inten_table[selector3] = 0 + // (pixel0 + pixel1 + pixel2 + pixel3) - 4*block_color - inten_table[selector0] - inten_table[selector1] - inten_table[selector2] - inten_table[selector3] = 0 + // (pixel0 + pixel1 + pixel2 + pixel3) - 4*block_color - (inten_table[selector0] + inten_table[selector1] + inten_table[selector2] + inten_table[selector3]) = 0 + // (pixel0 + pixel1 + pixel2 + pixel3)/4 - block_color - (inten_table[selector0] + inten_table[selector1] + inten_table[selector2] + inten_table[selector3])/4 = 0 + // block_color = (pixel0 + pixel1 + pixel2 + pixel3)/4 - (inten_table[selector0] + inten_table[selector1] + inten_table[selector2] + inten_table[selector3])/4 + // So what this means: + // optimal_block_color = avg_input - avg_inten_delta + // So the optimal block color can be computed by taking the average block color and subtracting the current average of the intensity delta. + // Unfortunately, optimal_block_color must then be quantized to 555 or 444 so it's not always possible to improve matters using this formula. + // Also, the above formula is for unclamped intensity deltas. The actual implementation takes into account clamping. + + const uint32_t n = m_pParams->m_num_src_pixels; + + for (uint32_t refinement_trial = 0; refinement_trial < max_refinement_trials; refinement_trial++) + { + const uint8_t* pSelectors = &m_best_solution.m_selectors[0]; + const int* pInten_table = g_etc1_inten_tables[m_best_solution.m_coords.m_inten_table]; + + int delta_sum_r = 0, delta_sum_g = 0, delta_sum_b = 0; + const color_rgba base_color(m_best_solution.m_coords.get_scaled_color()); + for (uint32_t r = 0; r < n; r++) + { + const uint32_t s = *pSelectors++; + const int yd_temp = pInten_table[s]; + // Compute actual delta being applied to each pixel, taking into account clamping. + delta_sum_r += clamp(base_color.r + yd_temp, 0, 255) - base_color.r; + delta_sum_g += clamp(base_color.g + yd_temp, 0, 255) - base_color.g; + delta_sum_b += clamp(base_color.b + yd_temp, 0, 255) - base_color.b; + } + + if ((!delta_sum_r) && (!delta_sum_g) && (!delta_sum_b)) + break; + + const float avg_delta_r_f = static_cast(delta_sum_r) / n; + const float avg_delta_g_f = static_cast(delta_sum_g) / n; + const float avg_delta_b_f = static_cast(delta_sum_b) / n; + const int br1 = clamp(static_cast((m_avg_color[0] - avg_delta_r_f) * m_limit / 255.0f + .5f), 0, m_limit); + const int bg1 = clamp(static_cast((m_avg_color[1] - avg_delta_g_f) * m_limit / 255.0f + .5f), 0, m_limit); + const int bb1 = clamp(static_cast((m_avg_color[2] - avg_delta_b_f) * m_limit / 255.0f + .5f), 0, m_limit); + +#if BASISU_DEBUG_ETC_ENCODER_DEEPER + printf("Refinement trial %u, avg_delta %f %f %f\n", refinement_trial, avg_delta_r_f, avg_delta_g_f, avg_delta_b_f); +#endif + + if (!evaluate_solution(etc1_solution_coordinates(br1, bg1, bb1, 0, m_pParams->m_use_color4), m_trial_solution, &m_best_solution)) + break; + + } // refinement_trial + } + + void etc1_optimizer::compute_internal_neighborhood(int scan_r, int scan_g, int scan_b) + { + if (m_best_solution.m_error == 0) + return; + + //const uint32_t n = m_pParams->m_num_src_pixels; + const int scan_delta_size = m_pParams->m_scan_delta_size; + + // Scan through a subset of the 3D lattice centered around the avg block color trying each 3D (555 or 444) lattice point as a potential block color. + // Each time a better solution is found try to refine the current solution's block color based of the current selectors and intensity table index. + for (int zdi = 0; zdi < scan_delta_size; zdi++) + { + const int zd = m_pParams->m_pScan_deltas[zdi]; + const int mbb = scan_b + zd; + if (mbb < 0) continue; else if (mbb > m_limit) break; + + for (int ydi = 0; ydi < scan_delta_size; ydi++) + { + const int yd = m_pParams->m_pScan_deltas[ydi]; + const int mbg = scan_g + yd; + if (mbg < 0) continue; else if (mbg > m_limit) break; + + for (int xdi = 0; xdi < scan_delta_size; xdi++) + { + const int xd = m_pParams->m_pScan_deltas[xdi]; + const int mbr = scan_r + xd; + if (mbr < 0) continue; else if (mbr > m_limit) break; + + etc1_solution_coordinates coords(mbr, mbg, mbb, 0, m_pParams->m_use_color4); + + if (!evaluate_solution(coords, m_trial_solution, &m_best_solution)) + continue; + + if (m_pParams->m_refinement) + { + refine_solution((m_pParams->m_quality == cETCQualityFast) ? 2 : (((xd | yd | zd) == 0) ? 4 : 2)); + } + + } // xdi + } // ydi + } // zdi + } + + void etc1_optimizer::compute_internal_cluster_fit(uint32_t total_perms_to_try) + { + if ((!m_best_solution.m_valid) || ((m_br != m_best_solution.m_coords.m_unscaled_color.r) || (m_bg != m_best_solution.m_coords.m_unscaled_color.g) || (m_bb != m_best_solution.m_coords.m_unscaled_color.b))) + { + evaluate_solution(etc1_solution_coordinates(m_br, m_bg, m_bb, 0, m_pParams->m_use_color4), m_trial_solution, &m_best_solution); + } + + if ((m_best_solution.m_error == 0) || (!m_best_solution.m_valid)) + return; + + for (uint32_t i = 0; i < total_perms_to_try; i++) + { + int delta_sum_r = 0, delta_sum_g = 0, delta_sum_b = 0; + + const int *pInten_table = g_etc1_inten_tables[m_best_solution.m_coords.m_inten_table]; + const color_rgba base_color(m_best_solution.m_coords.get_scaled_color()); + + const uint8_t *pNum_selectors = g_cluster_fit_order_tab[i].m_v; + + for (uint32_t q = 0; q < 4; q++) + { + const int yd_temp = pInten_table[q]; + + delta_sum_r += pNum_selectors[q] * (clamp(base_color.r + yd_temp, 0, 255) - base_color.r); + delta_sum_g += pNum_selectors[q] * (clamp(base_color.g + yd_temp, 0, 255) - base_color.g); + delta_sum_b += pNum_selectors[q] * (clamp(base_color.b + yd_temp, 0, 255) - base_color.b); + } + + if ((!delta_sum_r) && (!delta_sum_g) && (!delta_sum_b)) + continue; + + const float avg_delta_r_f = static_cast(delta_sum_r) / 8; + const float avg_delta_g_f = static_cast(delta_sum_g) / 8; + const float avg_delta_b_f = static_cast(delta_sum_b) / 8; + + const int br1 = clamp(static_cast((m_avg_color[0] - avg_delta_r_f) * m_limit / 255.0f + .5f), 0, m_limit); + const int bg1 = clamp(static_cast((m_avg_color[1] - avg_delta_g_f) * m_limit / 255.0f + .5f), 0, m_limit); + const int bb1 = clamp(static_cast((m_avg_color[2] - avg_delta_b_f) * m_limit / 255.0f + .5f), 0, m_limit); + +#if BASISU_DEBUG_ETC_ENCODER_DEEPER + printf("Second refinement trial %u, avg_delta %f %f %f\n", i, avg_delta_r_f, avg_delta_g_f, avg_delta_b_f); +#endif + + evaluate_solution(etc1_solution_coordinates(br1, bg1, bb1, 0, m_pParams->m_use_color4), m_trial_solution, &m_best_solution); + + if (m_best_solution.m_error == 0) + break; + } + } + + void etc1_optimizer::init(const params& params, results& result) + { + m_pParams = ¶ms; + m_pResult = &result; + + const uint32_t n = m_pParams->m_num_src_pixels; + + m_selectors.resize(n); + m_best_selectors.resize(n); + m_temp_selectors.resize(n); + m_trial_solution.m_selectors.resize(n); + m_best_solution.m_selectors.resize(n); + + m_limit = m_pParams->m_use_color4 ? 15 : 31; + + vec3F avg_color(0.0f); + + m_luma.resize(n); + m_sorted_luma_indices.resize(n); + m_sorted_luma.resize(n); + + int min_r = 255, min_g = 255, min_b = 255; + int max_r = 0, max_g = 0, max_b = 0; + + for (uint32_t i = 0; i < n; i++) + { + const color_rgba& c = m_pParams->m_pSrc_pixels[i]; + + min_r = basisu::minimum(min_r, c.r); + min_g = basisu::minimum(min_g, c.g); + min_b = basisu::minimum(min_b, c.b); + + max_r = basisu::maximum(max_r, c.r); + max_g = basisu::maximum(max_g, c.g); + max_b = basisu::maximum(max_b, c.b); + + const vec3F fc(c.r, c.g, c.b); + + avg_color += fc; + + m_luma[i] = static_cast(c.r + c.g + c.b); + m_sorted_luma_indices[i] = i; + } + avg_color /= static_cast(n); + m_avg_color = avg_color; + m_max_comp_spread = basisu::maximum(basisu::maximum(max_r - min_r, max_g - min_g), max_b - min_b); + + m_br = clamp(static_cast(m_avg_color[0] * m_limit / 255.0f + .5f), 0, m_limit); + m_bg = clamp(static_cast(m_avg_color[1] * m_limit / 255.0f + .5f), 0, m_limit); + m_bb = clamp(static_cast(m_avg_color[2] * m_limit / 255.0f + .5f), 0, m_limit); + +#if BASISU_DEBUG_ETC_ENCODER_DEEPER + printf("Avg block color: %u %u %u\n", m_br, m_bg, m_bb); +#endif + + if (m_pParams->m_quality == cETCQualityFast) + { + indirect_sort(n, &m_sorted_luma_indices[0], &m_luma[0]); + + m_pSorted_luma = &m_sorted_luma[0]; + m_pSorted_luma_indices = &m_sorted_luma_indices[0]; + + for (uint32_t i = 0; i < n; i++) + m_pSorted_luma[i] = m_luma[m_pSorted_luma_indices[i]]; + } + + m_best_solution.m_coords.clear(); + m_best_solution.m_valid = false; + m_best_solution.m_error = UINT64_MAX; + + clear_obj(m_solutions_tried); + } + + // Return false if we've probably already tried this solution, true if we have definitely not. + bool etc1_optimizer::check_for_redundant_solution(const etc1_solution_coordinates& coords) + { + // Hash first 3 bytes of color (RGB) + uint32_t kh = hash_hsieh((uint8_t*)&coords.m_unscaled_color.r, 3); + + uint32_t h0 = kh & cSolutionsTriedHashMask; + uint32_t h1 = (kh >> cSolutionsTriedHashBits) & cSolutionsTriedHashMask; + + // Simple Bloom filter lookup with k=2 + if ( ((m_solutions_tried[h0 >> 3] & (1 << (h0 & 7))) != 0) && + ((m_solutions_tried[h1 >> 3] & (1 << (h1 & 7))) != 0) ) + return false; + + m_solutions_tried[h0 >> 3] |= (1 << (h0 & 7)); + m_solutions_tried[h1 >> 3] |= (1 << (h1 & 7)); + + return true; + } + + static uint8_t g_eval_dist_tables[8][256] = + { + // 99% threshold + { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,}, + { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,}, + { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,}, + { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,}, + { 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,}, + { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,1,1,1,1,1,0,1,1,1,0,1,1,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}, + { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,} + }; + + bool etc1_optimizer::evaluate_solution_slow(const etc1_solution_coordinates& coords, potential_solution& trial_solution, potential_solution* pBest_solution) + { + if (!check_for_redundant_solution(coords)) + return false; + +#if BASISU_DEBUG_ETC_ENCODER_DEEPER + printf("Eval solution: %u %u %u\n", coords.m_unscaled_color.r, coords.m_unscaled_color.g, coords.m_unscaled_color.b); +#endif + + trial_solution.m_valid = false; + + if (m_pParams->m_constrain_against_base_color5) + { + const int dr = (int)coords.m_unscaled_color.r - (int)m_pParams->m_base_color5.r; + const int dg = (int)coords.m_unscaled_color.g - (int)m_pParams->m_base_color5.g; + const int db = (int)coords.m_unscaled_color.b - (int)m_pParams->m_base_color5.b; + + if ((minimum(dr, dg, db) < cETC1ColorDeltaMin) || (maximum(dr, dg, db) > cETC1ColorDeltaMax)) + { +#if BASISU_DEBUG_ETC_ENCODER_DEEPER + printf("Eval failed due to constraint from %u %u %u\n", m_pParams->m_base_color5.r, m_pParams->m_base_color5.g, m_pParams->m_base_color5.b); +#endif + return false; + } + } + + const color_rgba base_color(coords.get_scaled_color()); + + const uint32_t n = m_pParams->m_num_src_pixels; + assert(trial_solution.m_selectors.size() == n); + + trial_solution.m_error = INT64_MAX; + + const uint8_t *pSelectors_to_use = m_pParams->m_pForce_selectors; + + for (uint32_t inten_table = 0; inten_table < cETC1IntenModifierValues; inten_table++) + { + if (m_pParams->m_quality <= cETCQualityMedium) + { + if (!g_eval_dist_tables[inten_table][m_max_comp_spread]) + continue; + } + +#if 0 + if (m_pParams->m_quality <= cETCQualityMedium) + { + // For tables 5-7, if the max component spread falls within certain ranges, skip the inten table. Statistically they are extremely unlikely to result in lower error. + if (inten_table == 7) + { + if (m_max_comp_spread < 42) + continue; + } + else if (inten_table == 6) + { + if ((m_max_comp_spread >= 12) && (m_max_comp_spread <= 31)) + continue; + } + else if (inten_table == 5) + { + if ((m_max_comp_spread >= 13) && (m_max_comp_spread <= 21)) + continue; + } + } +#endif + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + color_rgba block_colors[4]; + for (uint32_t s = 0; s < 4; s++) + { + const int yd = pInten_table[s]; + block_colors[s].set(base_color.r + yd, base_color.g + yd, base_color.b + yd, 255); + } + + uint64_t total_error = 0; + + const color_rgba* pSrc_pixels = m_pParams->m_pSrc_pixels; + + if (!g_cpu_supports_sse41) + { + for (uint32_t c = 0; c < n; c++) + { + const color_rgba& src_pixel = *pSrc_pixels++; + + uint32_t best_selector_index = 0; + uint32_t best_error = 0; + + if (pSelectors_to_use) + { + best_selector_index = pSelectors_to_use[c]; + best_error = color_distance(m_pParams->m_perceptual, src_pixel, block_colors[best_selector_index], false); + } + else + { + best_error = color_distance(m_pParams->m_perceptual, src_pixel, block_colors[0], false); + + uint32_t trial_error = color_distance(m_pParams->m_perceptual, src_pixel, block_colors[1], false); + if (trial_error < best_error) + { + best_error = trial_error; + best_selector_index = 1; + } + + trial_error = color_distance(m_pParams->m_perceptual, src_pixel, block_colors[2], false); + if (trial_error < best_error) + { + best_error = trial_error; + best_selector_index = 2; + } + + trial_error = color_distance(m_pParams->m_perceptual, src_pixel, block_colors[3], false); + if (trial_error < best_error) + { + best_error = trial_error; + best_selector_index = 3; + } + } + + m_temp_selectors[c] = static_cast(best_selector_index); + + total_error += best_error; + if (total_error >= trial_solution.m_error) + break; + } + } + else + { +#if BASISU_SUPPORT_SSE + if (pSelectors_to_use) + { + if (m_pParams->m_perceptual) + perceptual_distance_rgb_4_N_sse41((int64_t*)&total_error, pSelectors_to_use, block_colors, pSrc_pixels, n, trial_solution.m_error); + else + linear_distance_rgb_4_N_sse41((int64_t*)&total_error, pSelectors_to_use, block_colors, pSrc_pixels, n, trial_solution.m_error); + } + else + { + if (m_pParams->m_perceptual) + find_selectors_perceptual_rgb_4_N_sse41((int64_t*)&total_error, &m_temp_selectors[0], block_colors, pSrc_pixels, n, trial_solution.m_error); + else + find_selectors_linear_rgb_4_N_sse41((int64_t*)&total_error, &m_temp_selectors[0], block_colors, pSrc_pixels, n, trial_solution.m_error); + } +#endif + } + + if (total_error < trial_solution.m_error) + { + trial_solution.m_error = total_error; + trial_solution.m_coords.m_inten_table = inten_table; + trial_solution.m_selectors.swap(m_temp_selectors); + trial_solution.m_valid = true; + } + } + trial_solution.m_coords.m_unscaled_color = coords.m_unscaled_color; + trial_solution.m_coords.m_color4 = m_pParams->m_use_color4; + +#if BASISU_DEBUG_ETC_ENCODER_DEEPER + printf("Eval done: %u error: %I64u best error so far: %I64u\n", (trial_solution.m_error < pBest_solution->m_error), trial_solution.m_error, pBest_solution->m_error); +#endif + + bool success = false; + if (pBest_solution) + { + if (trial_solution.m_error < pBest_solution->m_error) + { + *pBest_solution = trial_solution; + success = true; + } + } + + return success; + } + + bool etc1_optimizer::evaluate_solution_fast(const etc1_solution_coordinates& coords, potential_solution& trial_solution, potential_solution* pBest_solution) + { + if (!check_for_redundant_solution(coords)) + return false; + +#if BASISU_DEBUG_ETC_ENCODER_DEEPER + printf("Eval solution fast: %u %u %u\n", coords.m_unscaled_color.r, coords.m_unscaled_color.g, coords.m_unscaled_color.b); +#endif + + if (m_pParams->m_constrain_against_base_color5) + { + const int dr = (int)coords.m_unscaled_color.r - (int)m_pParams->m_base_color5.r; + const int dg = (int)coords.m_unscaled_color.g - (int)m_pParams->m_base_color5.g; + const int db = (int)coords.m_unscaled_color.b - (int)m_pParams->m_base_color5.b; + + if ((minimum(dr, dg, db) < cETC1ColorDeltaMin) || (maximum(dr, dg, db) > cETC1ColorDeltaMax)) + { + trial_solution.m_valid = false; + +#if BASISU_DEBUG_ETC_ENCODER_DEEPER + printf("Eval failed due to constraint from %u %u %u\n", m_pParams->m_base_color5.r, m_pParams->m_base_color5.g, m_pParams->m_base_color5.b); +#endif + return false; + } + } + + const color_rgba base_color(coords.get_scaled_color()); + + const uint32_t n = m_pParams->m_num_src_pixels; + assert(trial_solution.m_selectors.size() == n); + + trial_solution.m_error = UINT64_MAX; + + const bool perceptual = (m_pParams->m_quality == cETCQualityFast) ? false : m_pParams->m_perceptual; + + for (int inten_table = cETC1IntenModifierValues - 1; inten_table >= 0; --inten_table) + { + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + uint32_t block_inten[4]; + color_rgba block_colors[4]; + for (uint32_t s = 0; s < 4; s++) + { + const int yd = pInten_table[s]; + color_rgba block_color(base_color.r + yd, base_color.g + yd, base_color.b + yd, 255); + block_colors[s] = block_color; + block_inten[s] = block_color.r + block_color.g + block_color.b; + } + + // evaluate_solution_fast() enforces/assumes a total ordering of the input colors along the intensity (1,1,1) axis to more quickly classify the inputs to selectors. + // The inputs colors have been presorted along the projection onto this axis, and ETC1 block colors are always ordered along the intensity axis, so this classification is fast. + // 0 1 2 3 + // 01 12 23 + const uint32_t block_inten_midpoints[3] = { block_inten[0] + block_inten[1], block_inten[1] + block_inten[2], block_inten[2] + block_inten[3] }; + + uint64_t total_error = 0; + const color_rgba* pSrc_pixels = m_pParams->m_pSrc_pixels; + + if (perceptual) + { + if ((m_pSorted_luma[n - 1] * 2) < block_inten_midpoints[0]) + { + if (block_inten[0] > m_pSorted_luma[n - 1]) + { + const uint32_t min_error = iabs((int)block_inten[0] - (int)m_pSorted_luma[n - 1]); + if (min_error >= trial_solution.m_error) + continue; + } + + memset(&m_temp_selectors[0], 0, n); + + for (uint32_t c = 0; c < n; c++) + total_error += color_distance(true, block_colors[0], pSrc_pixels[c], false); + } + else if ((m_pSorted_luma[0] * 2) >= block_inten_midpoints[2]) + { + if (m_pSorted_luma[0] > block_inten[3]) + { + const uint32_t min_error = iabs((int)m_pSorted_luma[0] - (int)block_inten[3]); + if (min_error >= trial_solution.m_error) + continue; + } + + memset(&m_temp_selectors[0], 3, n); + + for (uint32_t c = 0; c < n; c++) + total_error += color_distance(true, block_colors[3], pSrc_pixels[c], false); + } + else + { + if (!g_cpu_supports_sse41) + { + uint32_t cur_selector = 0, c; + for (c = 0; c < n; c++) + { + const uint32_t y = m_pSorted_luma[c]; + while ((y * 2) >= block_inten_midpoints[cur_selector]) + if (++cur_selector > 2) + goto done; + const uint32_t sorted_pixel_index = m_pSorted_luma_indices[c]; + m_temp_selectors[sorted_pixel_index] = static_cast(cur_selector); + total_error += color_distance(true, block_colors[cur_selector], pSrc_pixels[sorted_pixel_index], false); + } + done: + while (c < n) + { + const uint32_t sorted_pixel_index = m_pSorted_luma_indices[c]; + m_temp_selectors[sorted_pixel_index] = 3; + total_error += color_distance(true, block_colors[3], pSrc_pixels[sorted_pixel_index], false); + ++c; + } + } + else + { +#if BASISU_SUPPORT_SSE + uint32_t cur_selector = 0, c; + + for (c = 0; c < n; c++) + { + const uint32_t y = m_pSorted_luma[c]; + while ((y * 2) >= block_inten_midpoints[cur_selector]) + { + if (++cur_selector > 2) + goto done3; + } + const uint32_t sorted_pixel_index = m_pSorted_luma_indices[c]; + m_temp_selectors[sorted_pixel_index] = static_cast(cur_selector); + } + done3: + + while (c < n) + { + const uint32_t sorted_pixel_index = m_pSorted_luma_indices[c]; + m_temp_selectors[sorted_pixel_index] = 3; + ++c; + } + + int64_t block_error; + perceptual_distance_rgb_4_N_sse41(&block_error, &m_temp_selectors[0], block_colors, pSrc_pixels, n, INT64_MAX); + total_error += block_error; +#endif + } + } + } + else + { + if ((m_pSorted_luma[n - 1] * 2) < block_inten_midpoints[0]) + { + if (block_inten[0] > m_pSorted_luma[n - 1]) + { + const uint32_t min_error = iabs((int)block_inten[0] - (int)m_pSorted_luma[n - 1]); + if (min_error >= trial_solution.m_error) + continue; + } + + memset(&m_temp_selectors[0], 0, n); + + for (uint32_t c = 0; c < n; c++) + total_error += color_distance(block_colors[0], pSrc_pixels[c], false); + } + else if ((m_pSorted_luma[0] * 2) >= block_inten_midpoints[2]) + { + if (m_pSorted_luma[0] > block_inten[3]) + { + const uint32_t min_error = iabs((int)m_pSorted_luma[0] - (int)block_inten[3]); + if (min_error >= trial_solution.m_error) + continue; + } + + memset(&m_temp_selectors[0], 3, n); + + for (uint32_t c = 0; c < n; c++) + total_error += color_distance(block_colors[3], pSrc_pixels[c], false); + } + else + { + uint32_t cur_selector = 0, c; + for (c = 0; c < n; c++) + { + const uint32_t y = m_pSorted_luma[c]; + while ((y * 2) >= block_inten_midpoints[cur_selector]) + if (++cur_selector > 2) + goto done2; + const uint32_t sorted_pixel_index = m_pSorted_luma_indices[c]; + m_temp_selectors[sorted_pixel_index] = static_cast(cur_selector); + total_error += color_distance(block_colors[cur_selector], pSrc_pixels[sorted_pixel_index], false); + } + done2: + while (c < n) + { + const uint32_t sorted_pixel_index = m_pSorted_luma_indices[c]; + m_temp_selectors[sorted_pixel_index] = 3; + total_error += color_distance(block_colors[3], pSrc_pixels[sorted_pixel_index], false); + ++c; + } + } + } + + if (total_error < trial_solution.m_error) + { + trial_solution.m_error = total_error; + trial_solution.m_coords.m_inten_table = inten_table; + trial_solution.m_selectors.swap(m_temp_selectors); + trial_solution.m_valid = true; + if (!total_error) + break; + } + } + trial_solution.m_coords.m_unscaled_color = coords.m_unscaled_color; + trial_solution.m_coords.m_color4 = m_pParams->m_use_color4; + +#if BASISU_DEBUG_ETC_ENCODER_DEEPER + printf("Eval done: %u error: %I64u best error so far: %I64u\n", (trial_solution.m_error < pBest_solution->m_error), trial_solution.m_error, pBest_solution->m_error); +#endif + + bool success = false; + if (pBest_solution) + { + if (trial_solution.m_error < pBest_solution->m_error) + { + *pBest_solution = trial_solution; + success = true; + } + } + + return success; + } + + uint64_t pack_eac_a8(pack_eac_a8_results& results, const uint8_t* pPixels, uint32_t num_pixels, uint32_t base_search_rad, uint32_t mul_search_rad, uint32_t table_mask) + { + results.m_selectors.resize(num_pixels); + results.m_selectors_temp.resize(num_pixels); + + uint32_t min_alpha = 255, max_alpha = 0; + for (uint32_t i = 0; i < num_pixels; i++) + { + const uint32_t a = pPixels[i]; + if (a < min_alpha) min_alpha = a; + if (a > max_alpha) max_alpha = a; + } + + if (min_alpha == max_alpha) + { + results.m_base = min_alpha; + results.m_table = 13; + results.m_multiplier = 1; + for (uint32_t i = 0; i < num_pixels; i++) + results.m_selectors[i] = 4; + return 0; + } + + const uint32_t alpha_range = max_alpha - min_alpha; + + uint64_t best_err = UINT64_MAX; + + for (uint32_t table = 0; table < 16; table++) + { + if ((table_mask & (1U << table)) == 0) + continue; + + const float range = (float)(g_etc2_eac_tables[table][ETC2_EAC_MAX_VALUE_SELECTOR] - g_etc2_eac_tables[table][ETC2_EAC_MIN_VALUE_SELECTOR]); + const int center = (int)roundf(lerp((float)min_alpha, (float)max_alpha, (float)(0 - g_etc2_eac_tables[table][ETC2_EAC_MIN_VALUE_SELECTOR]) / range)); + + const int base_min = clamp255(center - base_search_rad); + const int base_max = clamp255(center + base_search_rad); + + const int mul = (int)roundf(alpha_range / range); + const int mul_low = clamp(mul - mul_search_rad, 1, 15); + const int mul_high = clamp(mul + mul_search_rad, 1, 15); + + for (int base = base_min; base <= base_max; base++) + { + for (int multiplier = mul_low; multiplier <= mul_high; multiplier++) + { + uint64_t total_err = 0; + + for (uint32_t i = 0; i < num_pixels; i++) + { + const int a = pPixels[i]; + + uint32_t best_s_err = UINT32_MAX; + uint32_t best_s = 0; + for (uint32_t s = 0; s < 8; s++) + { + const int v = clamp255((int)multiplier * g_etc2_eac_tables[table][s] + (int)base); + + uint32_t err = iabs(a - v); + if (err < best_s_err) + { + best_s_err = err; + best_s = s; + } + } + + results.m_selectors_temp[i] = static_cast(best_s); + + total_err += best_s_err * best_s_err; + if (total_err >= best_err) + break; + } + + if (total_err < best_err) + { + best_err = total_err; + results.m_base = base; + results.m_multiplier = multiplier; + results.m_table = table; + results.m_selectors.swap(results.m_selectors_temp); + if (!best_err) + return best_err; + } + + } // table + + } // multiplier + + } // base + + return best_err; + } + + void pack_eac_a8(eac_a8_block* pBlock, const uint8_t* pPixels, uint32_t base_search_rad, uint32_t mul_search_rad, uint32_t table_mask) + { + pack_eac_a8_results results; + pack_eac_a8(results, pPixels, 16, base_search_rad, mul_search_rad, table_mask); + + pBlock->m_base = results.m_base; + pBlock->m_multiplier = results.m_multiplier; + pBlock->m_table = results.m_table; + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + pBlock->set_selector(x, y, results.m_selectors[x + y * 4]); + } + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_etc.h b/ktx/external/basisu/encoder/basisu_etc.h new file mode 100644 index 0000000..208f2aa --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_etc.h @@ -0,0 +1,1181 @@ +// basis_etc.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once +#include "../transcoder/basisu.h" +#include "basisu_enc.h" + +namespace basisu +{ + enum etc_constants + { + cETC1BytesPerBlock = 8U, + + cETC1SelectorBits = 2U, + cETC1SelectorValues = 1U << cETC1SelectorBits, + cETC1SelectorMask = cETC1SelectorValues - 1U, + + cETC1BlockShift = 2U, + cETC1BlockSize = 1U << cETC1BlockShift, + + cETC1LSBSelectorIndicesBitOffset = 0, + cETC1MSBSelectorIndicesBitOffset = 16, + + cETC1FlipBitOffset = 32, + cETC1DiffBitOffset = 33, + + cETC1IntenModifierNumBits = 3, + cETC1IntenModifierValues = 1 << cETC1IntenModifierNumBits, + cETC1RightIntenModifierTableBitOffset = 34, + cETC1LeftIntenModifierTableBitOffset = 37, + + // Base+Delta encoding (5 bit bases, 3 bit delta) + cETC1BaseColorCompNumBits = 5, + cETC1BaseColorCompMax = 1 << cETC1BaseColorCompNumBits, + + cETC1DeltaColorCompNumBits = 3, + cETC1DeltaColorComp = 1 << cETC1DeltaColorCompNumBits, + cETC1DeltaColorCompMax = 1 << cETC1DeltaColorCompNumBits, + + cETC1BaseColor5RBitOffset = 59, + cETC1BaseColor5GBitOffset = 51, + cETC1BaseColor5BBitOffset = 43, + + cETC1DeltaColor3RBitOffset = 56, + cETC1DeltaColor3GBitOffset = 48, + cETC1DeltaColor3BBitOffset = 40, + + // Absolute (non-delta) encoding (two 4-bit per component bases) + cETC1AbsColorCompNumBits = 4, + cETC1AbsColorCompMax = 1 << cETC1AbsColorCompNumBits, + + cETC1AbsColor4R1BitOffset = 60, + cETC1AbsColor4G1BitOffset = 52, + cETC1AbsColor4B1BitOffset = 44, + + cETC1AbsColor4R2BitOffset = 56, + cETC1AbsColor4G2BitOffset = 48, + cETC1AbsColor4B2BitOffset = 40, + + cETC1ColorDeltaMin = -4, + cETC1ColorDeltaMax = 3, + + // Delta3: + // 0 1 2 3 4 5 6 7 + // 000 001 010 011 100 101 110 111 + // 0 1 2 3 -4 -3 -2 -1 + }; + + extern const int g_etc1_inten_tables[cETC1IntenModifierValues][cETC1SelectorValues]; + extern const uint8_t g_etc1_to_selector_index[cETC1SelectorValues]; + extern const uint8_t g_selector_index_to_etc1[cETC1SelectorValues]; + + struct etc_coord2 + { + uint8_t m_x, m_y; + }; + extern const etc_coord2 g_etc1_pixel_coords[2][2][8]; // [flipped][subblock][subblock_pixel] + extern const uint32_t g_etc1_pixel_indices[2][2][8]; // [flipped][subblock][subblock_pixel] + + struct etc_block + { + // big endian uint64: + // bit ofs: 56 48 40 32 24 16 8 0 + // byte ofs: b0, b1, b2, b3, b4, b5, b6, b7 + union + { + uint64_t m_uint64; + + uint8_t m_bytes[8]; + }; + + inline void clear() + { + assert(sizeof(*this) == 8); + clear_obj(*this); + } + + inline uint64_t get_all_bits() const + { + return read_be64(&m_uint64); + } + + inline uint32_t get_general_bits(uint32_t ofs, uint32_t num) const + { + assert((ofs + num) <= 64U); + assert(num && (num < 32U)); + return (uint32_t)(read_be64(&m_uint64) >> ofs) & ((1UL << num) - 1UL); + } + + inline void set_general_bits(uint32_t ofs, uint32_t num, uint32_t bits) + { + assert((ofs + num) <= 64U); + assert(num && (num < 32U)); + + uint64_t x = read_be64(&m_uint64); + uint64_t msk = ((1ULL << static_cast(num)) - 1ULL) << static_cast(ofs); + x &= ~msk; + x |= (static_cast(bits) << static_cast(ofs)); + write_be64(&m_uint64, x); + } + + inline uint32_t get_byte_bits(uint32_t ofs, uint32_t num) const + { + assert((ofs + num) <= 64U); + assert(num && (num <= 8U)); + assert((ofs >> 3) == ((ofs + num - 1) >> 3)); + const uint32_t byte_ofs = 7 - (ofs >> 3); + const uint32_t byte_bit_ofs = ofs & 7; + return (m_bytes[byte_ofs] >> byte_bit_ofs) & ((1 << num) - 1); + } + + inline void set_byte_bits(uint32_t ofs, uint32_t num, uint32_t bits) + { + assert((ofs + num) <= 64U); + assert(num && (num < 32U)); + assert((ofs >> 3) == ((ofs + num - 1) >> 3)); + assert(bits < (1U << num)); + const uint32_t byte_ofs = 7 - (ofs >> 3); + const uint32_t byte_bit_ofs = ofs & 7; + const uint32_t mask = (1 << num) - 1; + m_bytes[byte_ofs] &= ~(mask << byte_bit_ofs); + m_bytes[byte_ofs] |= (bits << byte_bit_ofs); + } + + // false = left/right subblocks + // true = upper/lower subblocks + inline bool get_flip_bit() const + { + return (m_bytes[3] & 1) != 0; + } + + inline void set_flip_bit(bool flip) + { + m_bytes[3] &= ~1; + m_bytes[3] |= static_cast(flip); + } + + inline bool get_diff_bit() const + { + return (m_bytes[3] & 2) != 0; + } + + inline void set_diff_bit(bool diff) + { + m_bytes[3] &= ~2; + m_bytes[3] |= (static_cast(diff) << 1); + } + + // Returns intensity modifier table (0-7) used by subblock subblock_id. + // subblock_id=0 left/top (CW 1), 1=right/bottom (CW 2) + inline uint32_t get_inten_table(uint32_t subblock_id) const + { + assert(subblock_id < 2); + const uint32_t ofs = subblock_id ? 2 : 5; + return (m_bytes[3] >> ofs) & 7; + } + + // Sets intensity modifier table (0-7) used by subblock subblock_id (0 or 1) + inline void set_inten_table(uint32_t subblock_id, uint32_t t) + { + assert(subblock_id < 2); + assert(t < 8); + const uint32_t ofs = subblock_id ? 2 : 5; + m_bytes[3] &= ~(7 << ofs); + m_bytes[3] |= (t << ofs); + } + + inline void set_inten_tables_etc1s(uint32_t t) + { + set_inten_table(0, t); + set_inten_table(1, t); + } + + inline bool is_etc1s() const + { + if (get_inten_table(0) != get_inten_table(1)) + return false; + + if (get_diff_bit()) + { + if (get_delta3_color() != 0) + return false; + } + else + { + if (get_base4_color(0) != get_base4_color(1)) + return false; + } + + return true; + } + + // Returned encoded selector value ranges from 0-3 (this is NOT a direct index into g_etc1_inten_tables, see get_selector()) + inline uint32_t get_raw_selector(uint32_t x, uint32_t y) const + { + assert((x | y) < 4); + + const uint32_t bit_index = x * 4 + y; + const uint32_t byte_bit_ofs = bit_index & 7; + const uint8_t *p = &m_bytes[7 - (bit_index >> 3)]; + const uint32_t lsb = (p[0] >> byte_bit_ofs) & 1; + const uint32_t msb = (p[-2] >> byte_bit_ofs) & 1; + const uint32_t val = lsb | (msb << 1); + + return val; + } + + // Returned selector value ranges from 0-3 and is a direct index into g_etc1_inten_tables. + inline uint32_t get_selector(uint32_t x, uint32_t y) const + { + return g_etc1_to_selector_index[get_raw_selector(x, y)]; + } + + // Selector "val" ranges from 0-3 and is a direct index into g_etc1_inten_tables. + inline void set_selector(uint32_t x, uint32_t y, uint32_t val) + { + assert((x | y | val) < 4); + const uint32_t bit_index = x * 4 + y; + + uint8_t *p = &m_bytes[7 - (bit_index >> 3)]; + + const uint32_t byte_bit_ofs = bit_index & 7; + const uint32_t mask = 1 << byte_bit_ofs; + + const uint32_t etc1_val = g_selector_index_to_etc1[val]; + + const uint32_t lsb = etc1_val & 1; + const uint32_t msb = etc1_val >> 1; + + p[0] &= ~mask; + p[0] |= (lsb << byte_bit_ofs); + + p[-2] &= ~mask; + p[-2] |= (msb << byte_bit_ofs); + } + + // Selector "etc1_val" ranges from 0-3 and is a direct (raw) ETC1 selector. + inline void set_raw_selector(uint32_t x, uint32_t y, uint32_t etc1_val) + { + assert((x | y | etc1_val) < 4); + const uint32_t bit_index = x * 4 + y; + + uint8_t* p = &m_bytes[7 - (bit_index >> 3)]; + + const uint32_t byte_bit_ofs = bit_index & 7; + const uint32_t mask = 1 << byte_bit_ofs; + + const uint32_t lsb = etc1_val & 1; + const uint32_t msb = etc1_val >> 1; + + p[0] &= ~mask; + p[0] |= (lsb << byte_bit_ofs); + + p[-2] &= ~mask; + p[-2] |= (msb << byte_bit_ofs); + } + + inline uint32_t get_raw_selector_bits() const + { + return m_bytes[4] | (m_bytes[5] << 8) | (m_bytes[6] << 16) | (m_bytes[7] << 24); + } + + inline void set_raw_selector_bits(uint32_t bits) + { + m_bytes[4] = static_cast(bits); + m_bytes[5] = static_cast(bits >> 8); + m_bytes[6] = static_cast(bits >> 16); + m_bytes[7] = static_cast(bits >> 24); + } + + inline void set_raw_selector_bits(uint8_t byte0, uint8_t byte1, uint8_t byte2, uint8_t byte3) + { + m_bytes[4] = byte0; + m_bytes[5] = byte1; + m_bytes[6] = byte2; + m_bytes[7] = byte3; + } + + inline void set_base4_color(uint32_t idx, uint16_t c) + { + if (idx) + { + set_byte_bits(cETC1AbsColor4R2BitOffset, 4, (c >> 8) & 15); + set_byte_bits(cETC1AbsColor4G2BitOffset, 4, (c >> 4) & 15); + set_byte_bits(cETC1AbsColor4B2BitOffset, 4, c & 15); + } + else + { + set_byte_bits(cETC1AbsColor4R1BitOffset, 4, (c >> 8) & 15); + set_byte_bits(cETC1AbsColor4G1BitOffset, 4, (c >> 4) & 15); + set_byte_bits(cETC1AbsColor4B1BitOffset, 4, c & 15); + } + } + + inline uint16_t get_base4_color(uint32_t idx) const + { + uint32_t r, g, b; + if (idx) + { + r = get_byte_bits(cETC1AbsColor4R2BitOffset, 4); + g = get_byte_bits(cETC1AbsColor4G2BitOffset, 4); + b = get_byte_bits(cETC1AbsColor4B2BitOffset, 4); + } + else + { + r = get_byte_bits(cETC1AbsColor4R1BitOffset, 4); + g = get_byte_bits(cETC1AbsColor4G1BitOffset, 4); + b = get_byte_bits(cETC1AbsColor4B1BitOffset, 4); + } + return static_cast(b | (g << 4U) | (r << 8U)); + } + + inline void set_base5_color(uint16_t c) + { + set_byte_bits(cETC1BaseColor5RBitOffset, 5, (c >> 10) & 31); + set_byte_bits(cETC1BaseColor5GBitOffset, 5, (c >> 5) & 31); + set_byte_bits(cETC1BaseColor5BBitOffset, 5, c & 31); + } + + inline uint16_t get_base5_color() const + { + const uint32_t r = get_byte_bits(cETC1BaseColor5RBitOffset, 5); + const uint32_t g = get_byte_bits(cETC1BaseColor5GBitOffset, 5); + const uint32_t b = get_byte_bits(cETC1BaseColor5BBitOffset, 5); + return static_cast(b | (g << 5U) | (r << 10U)); + } + + void set_delta3_color(uint16_t c) + { + set_byte_bits(cETC1DeltaColor3RBitOffset, 3, (c >> 6) & 7); + set_byte_bits(cETC1DeltaColor3GBitOffset, 3, (c >> 3) & 7); + set_byte_bits(cETC1DeltaColor3BBitOffset, 3, c & 7); + } + + inline uint16_t get_delta3_color() const + { + const uint32_t r = get_byte_bits(cETC1DeltaColor3RBitOffset, 3); + const uint32_t g = get_byte_bits(cETC1DeltaColor3GBitOffset, 3); + const uint32_t b = get_byte_bits(cETC1DeltaColor3BBitOffset, 3); + return static_cast(b | (g << 3U) | (r << 6U)); + } + + uint64_t determine_selectors(const color_rgba* pSource_pixels, bool perceptual, uint32_t begin_subblock = 0, uint32_t end_subblock = 2) + { + uint64_t total_error = 0; + + for (uint32_t subblock = begin_subblock; subblock < end_subblock; subblock++) + { + color_rgba block_colors[4]; + get_block_colors(block_colors, subblock); + + if (get_flip_bit()) + { + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t best_selector = 0; + uint64_t best_error = UINT64_MAX; + + for (uint32_t s = 0; s < 4; s++) + { + uint64_t err = color_distance(perceptual, block_colors[s], pSource_pixels[x + (subblock * 2 + y) * 4], false); + if (err < best_error) + { + best_error = err; + best_selector = s; + } + } + + set_selector(x, subblock * 2 + y, best_selector); + + total_error += best_error; + } + } + } + else + { + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 2; x++) + { + uint32_t best_selector = 0; + uint64_t best_error = UINT64_MAX; + + for (uint32_t s = 0; s < 4; s++) + { + uint64_t err = color_distance(perceptual, block_colors[s], pSource_pixels[(subblock * 2) + x + y * 4], false); + if (err < best_error) + { + best_error = err; + best_selector = s; + } + } + + set_selector(subblock * 2 + x, y, best_selector); + + total_error += best_error; + } + } + } + } + + return total_error; + } + + color_rgba get_block_color(uint32_t subblock_index, bool scaled) const + { + color_rgba b; + + if (get_diff_bit()) + { + if (subblock_index) + unpack_color5(b, get_base5_color(), get_delta3_color(), scaled); + else + unpack_color5(b, get_base5_color(), scaled); + } + else + { + b = unpack_color4(get_base4_color(subblock_index), scaled); + } + + return b; + } + + uint32_t get_subblock_index(uint32_t x, uint32_t y) const + { + if (get_flip_bit()) + return y >= 2; + else + return x >= 2; + } + + bool get_block_colors(color_rgba* pBlock_colors, uint32_t subblock_index) const + { + color_rgba b; + + if (get_diff_bit()) + { + if (subblock_index) + unpack_color5(b, get_base5_color(), get_delta3_color(), true); + else + unpack_color5(b, get_base5_color(), true); + } + else + { + b = unpack_color4(get_base4_color(subblock_index), true); + } + + const int* pInten_table = g_etc1_inten_tables[get_inten_table(subblock_index)]; + + bool dc = false; + + pBlock_colors[0].set(clamp255(b.r + pInten_table[0], dc), clamp255(b.g + pInten_table[0], dc), clamp255(b.b + pInten_table[0], dc), 255); + pBlock_colors[1].set(clamp255(b.r + pInten_table[1], dc), clamp255(b.g + pInten_table[1], dc), clamp255(b.b + pInten_table[1], dc), 255); + pBlock_colors[2].set(clamp255(b.r + pInten_table[2], dc), clamp255(b.g + pInten_table[2], dc), clamp255(b.b + pInten_table[2], dc), 255); + pBlock_colors[3].set(clamp255(b.r + pInten_table[3], dc), clamp255(b.g + pInten_table[3], dc), clamp255(b.b + pInten_table[3], dc), 255); + + return dc; + } + + void get_block_colors_etc1s(color_rgba* pBlock_colors) const + { + color_rgba b; + + unpack_color5(b, get_base5_color(), true); + + const int* pInten_table = g_etc1_inten_tables[get_inten_table(0)]; + + pBlock_colors[0].set(clamp255(b.r + pInten_table[0]), clamp255(b.g + pInten_table[0]), clamp255(b.b + pInten_table[0]), 255); + pBlock_colors[1].set(clamp255(b.r + pInten_table[1]), clamp255(b.g + pInten_table[1]), clamp255(b.b + pInten_table[1]), 255); + pBlock_colors[2].set(clamp255(b.r + pInten_table[2]), clamp255(b.g + pInten_table[2]), clamp255(b.b + pInten_table[2]), 255); + pBlock_colors[3].set(clamp255(b.r + pInten_table[3]), clamp255(b.g + pInten_table[3]), clamp255(b.b + pInten_table[3]), 255); + } + + static void get_block_colors_etc1s(color_rgba* pBlock_colors, const color_rgba &base5_color, uint32_t inten_table) + { + color_rgba b; + b.r = (base5_color.r << 3U) | (base5_color.r >> 2U); + b.g = (base5_color.g << 3U) | (base5_color.g >> 2U); + b.b = (base5_color.b << 3U) | (base5_color.b >> 2U); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + pBlock_colors[0].set(clamp255(b.r + pInten_table[0]), clamp255(b.g + pInten_table[0]), clamp255(b.b + pInten_table[0]), 255); + pBlock_colors[1].set(clamp255(b.r + pInten_table[1]), clamp255(b.g + pInten_table[1]), clamp255(b.b + pInten_table[1]), 255); + pBlock_colors[2].set(clamp255(b.r + pInten_table[2]), clamp255(b.g + pInten_table[2]), clamp255(b.b + pInten_table[2]), 255); + pBlock_colors[3].set(clamp255(b.r + pInten_table[3]), clamp255(b.g + pInten_table[3]), clamp255(b.b + pInten_table[3]), 255); + } + + void get_block_color(color_rgba& color, uint32_t subblock_index, uint32_t selector_index) const + { + color_rgba b; + + if (get_diff_bit()) + { + if (subblock_index) + unpack_color5(b, get_base5_color(), get_delta3_color(), true); + else + unpack_color5(b, get_base5_color(), true); + } + else + { + b = unpack_color4(get_base4_color(subblock_index), true); + } + + const int* pInten_table = g_etc1_inten_tables[get_inten_table(subblock_index)]; + + color.set(clamp255(b.r + pInten_table[selector_index]), clamp255(b.g + pInten_table[selector_index]), clamp255(b.b + pInten_table[selector_index]), 255); + } + + bool get_block_low_high_colors(color_rgba* pBlock_colors, uint32_t subblock_index) const + { + color_rgba b; + + if (get_diff_bit()) + { + if (subblock_index) + unpack_color5(b, get_base5_color(), get_delta3_color(), true); + else + unpack_color5(b, get_base5_color(), true); + } + else + { + b = unpack_color4(get_base4_color(subblock_index), true); + } + + const int* pInten_table = g_etc1_inten_tables[get_inten_table(subblock_index)]; + + bool dc = false; + + pBlock_colors[0].set(clamp255(b.r + pInten_table[0], dc), clamp255(b.g + pInten_table[0], dc), clamp255(b.b + pInten_table[0], dc), 255); + pBlock_colors[1].set(clamp255(b.r + pInten_table[3], dc), clamp255(b.g + pInten_table[3], dc), clamp255(b.b + pInten_table[3], dc), 255); + + return dc; + } + + static void get_block_colors5(color_rgba *pBlock_colors, const color_rgba &base_color5, uint32_t inten_table, bool scaled = false) + { + color_rgba b(base_color5); + + if (!scaled) + { + b.r = (b.r << 3) | (b.r >> 2); + b.g = (b.g << 3) | (b.g >> 2); + b.b = (b.b << 3) | (b.b >> 2); + } + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + pBlock_colors[0].set(clamp255(b.r + pInten_table[0]), clamp255(b.g + pInten_table[0]), clamp255(b.b + pInten_table[0]), 255); + pBlock_colors[1].set(clamp255(b.r + pInten_table[1]), clamp255(b.g + pInten_table[1]), clamp255(b.b + pInten_table[1]), 255); + pBlock_colors[2].set(clamp255(b.r + pInten_table[2]), clamp255(b.g + pInten_table[2]), clamp255(b.b + pInten_table[2]), 255); + pBlock_colors[3].set(clamp255(b.r + pInten_table[3]), clamp255(b.g + pInten_table[3]), clamp255(b.b + pInten_table[3]), 255); + } + + static void get_block_colors4(color_rgba *pBlock_colors, const color_rgba &base_color4, uint32_t inten_table, bool scaled = false) + { + color_rgba b(base_color4); + + if (!scaled) + { + b.r = (b.r << 4) | b.r; + b.g = (b.g << 4) | b.g; + b.b = (b.b << 4) | b.b; + } + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + pBlock_colors[0].set(clamp255(b.r + pInten_table[0]), clamp255(b.g + pInten_table[0]), clamp255(b.b + pInten_table[0]), 255); + pBlock_colors[1].set(clamp255(b.r + pInten_table[1]), clamp255(b.g + pInten_table[1]), clamp255(b.b + pInten_table[1]), 255); + pBlock_colors[2].set(clamp255(b.r + pInten_table[2]), clamp255(b.g + pInten_table[2]), clamp255(b.b + pInten_table[2]), 255); + pBlock_colors[3].set(clamp255(b.r + pInten_table[3]), clamp255(b.g + pInten_table[3]), clamp255(b.b + pInten_table[3]), 255); + } + + uint64_t evaluate_etc1_error(const color_rgba* pBlock_pixels, bool perceptual, int subblock_index = -1) const; + void get_subblock_pixels(color_rgba* pPixels, int subblock_index = -1) const; + + void get_selector_range(uint32_t& low, uint32_t& high) const + { + low = 3; + high = 0; + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t s = get_selector(x, y); + low = minimum(low, s); + high = maximum(high, s); + } + } + } + + void set_block_color4(const color_rgba &c0_unscaled, const color_rgba &c1_unscaled) + { + set_diff_bit(false); + + set_base4_color(0, pack_color4(c0_unscaled, false)); + set_base4_color(1, pack_color4(c1_unscaled, false)); + } + + void set_block_color5(const color_rgba &c0_unscaled, const color_rgba &c1_unscaled) + { + set_diff_bit(true); + + set_base5_color(pack_color5(c0_unscaled, false)); + + int dr = c1_unscaled.r - c0_unscaled.r; + int dg = c1_unscaled.g - c0_unscaled.g; + int db = c1_unscaled.b - c0_unscaled.b; + + set_delta3_color(pack_delta3(dr, dg, db)); + } + + void set_block_color5_etc1s(const color_rgba &c_unscaled) + { + set_diff_bit(true); + + set_base5_color(pack_color5(c_unscaled, false)); + set_delta3_color(pack_delta3(0, 0, 0)); + } + + bool set_block_color5_check(const color_rgba &c0_unscaled, const color_rgba &c1_unscaled) + { + set_diff_bit(true); + + set_base5_color(pack_color5(c0_unscaled, false)); + + int dr = c1_unscaled.r - c0_unscaled.r; + int dg = c1_unscaled.g - c0_unscaled.g; + int db = c1_unscaled.b - c0_unscaled.b; + + if (((dr < cETC1ColorDeltaMin) || (dr > cETC1ColorDeltaMax)) || + ((dg < cETC1ColorDeltaMin) || (dg > cETC1ColorDeltaMax)) || + ((db < cETC1ColorDeltaMin) || (db > cETC1ColorDeltaMax))) + return false; + + set_delta3_color(pack_delta3(dr, dg, db)); + + return true; + } + + bool set_block_color5_clamp(const color_rgba &c0_unscaled, const color_rgba &c1_unscaled) + { + set_diff_bit(true); + set_base5_color(pack_color5(c0_unscaled, false)); + + int dr = c1_unscaled.r - c0_unscaled.r; + int dg = c1_unscaled.g - c0_unscaled.g; + int db = c1_unscaled.b - c0_unscaled.b; + + dr = clamp(dr, cETC1ColorDeltaMin, cETC1ColorDeltaMax); + dg = clamp(dg, cETC1ColorDeltaMin, cETC1ColorDeltaMax); + db = clamp(db, cETC1ColorDeltaMin, cETC1ColorDeltaMax); + + set_delta3_color(pack_delta3(dr, dg, db)); + + return true; + } + color_rgba get_selector_color(uint32_t x, uint32_t y, uint32_t s) const + { + color_rgba block_colors[4]; + + get_block_colors(block_colors, get_subblock_index(x, y)); + + return block_colors[s]; + } + + // Base color 5 + static uint16_t pack_color5(const color_rgba& color, bool scaled, uint32_t bias = 127U); + static uint16_t pack_color5(uint32_t r, uint32_t g, uint32_t b, bool scaled, uint32_t bias = 127U); + + static color_rgba unpack_color5(uint16_t packed_color5, bool scaled, uint32_t alpha = 255U); + static void unpack_color5(uint32_t& r, uint32_t& g, uint32_t& b, uint16_t packed_color, bool scaled); + static void unpack_color5(color_rgba& result, uint16_t packed_color5, bool scaled); + + static bool unpack_color5(color_rgba& result, uint16_t packed_color5, uint16_t packed_delta3, bool scaled, uint32_t alpha = 255U); + static bool unpack_color5(uint32_t& r, uint32_t& g, uint32_t& b, uint16_t packed_color5, uint16_t packed_delta3, bool scaled, uint32_t alpha = 255U); + + // Delta color 3 + // Inputs range from -4 to 3 (cETC1ColorDeltaMin to cETC1ColorDeltaMax) + static uint16_t pack_delta3(const color_rgba_i16& color); + static uint16_t pack_delta3(int r, int g, int b); + + // Results range from -4 to 3 (cETC1ColorDeltaMin to cETC1ColorDeltaMax) + static color_rgba_i16 unpack_delta3(uint16_t packed_delta3); + static void unpack_delta3(int& r, int& g, int& b, uint16_t packed_delta3); + + static bool try_pack_color5_delta3(const color_rgba *pColor5_unscaled) + { + int dr = pColor5_unscaled[1].r - pColor5_unscaled[0].r; + int dg = pColor5_unscaled[1].g - pColor5_unscaled[0].g; + int db = pColor5_unscaled[1].b - pColor5_unscaled[0].b; + + if ((minimum(dr, dg, db) < cETC1ColorDeltaMin) || (maximum(dr, dg, db) > cETC1ColorDeltaMax)) + return false; + + return true; + } + + // Abs color 4 + static uint16_t pack_color4(const color_rgba& color, bool scaled, uint32_t bias = 127U); + static uint16_t pack_color4(uint32_t r, uint32_t g, uint32_t b, bool scaled, uint32_t bias = 127U); + + static color_rgba unpack_color4(uint16_t packed_color4, bool scaled, uint32_t alpha = 255U); + static void unpack_color4(uint32_t& r, uint32_t& g, uint32_t& b, uint16_t packed_color4, bool scaled); + + // subblock colors + static void get_diff_subblock_colors(color_rgba* pDst, uint16_t packed_color5, uint32_t table_idx); + static bool get_diff_subblock_colors(color_rgba* pDst, uint16_t packed_color5, uint16_t packed_delta3, uint32_t table_idx); + static void get_abs_subblock_colors(color_rgba* pDst, uint16_t packed_color4, uint32_t table_idx); + + static inline void unscaled_to_scaled_color(color_rgba& dst, const color_rgba& src, bool color4) + { + if (color4) + { + dst.r = src.r | (src.r << 4); + dst.g = src.g | (src.g << 4); + dst.b = src.b | (src.b << 4); + } + else + { + dst.r = (src.r >> 2) | (src.r << 3); + dst.g = (src.g >> 2) | (src.g << 3); + dst.b = (src.b >> 2) | (src.b << 3); + } + dst.a = src.a; + } + + private: + static uint8_t clamp255(int x, bool &did_clamp) + { + if (x < 0) + { + did_clamp = true; + return 0; + } + else if (x > 255) + { + did_clamp = true; + return 255; + } + + return static_cast(x); + } + + static uint8_t clamp255(int x) + { + if (x < 0) + return 0; + else if (x > 255) + return 255; + + return static_cast(x); + } + }; + + typedef basisu::vector etc_block_vec; + + // Returns false if the unpack fails (could be bogus data or ETC2) + bool unpack_etc1(const etc_block& block, color_rgba *pDst, bool preserve_alpha = false); + + enum basis_etc_quality + { + cETCQualityFast, + cETCQualityMedium, + cETCQualitySlow, + cETCQualityUber, + cETCQualityTotal, + }; + + struct basis_etc1_pack_params + { + basis_etc_quality m_quality; + bool m_perceptual; + bool m_cluster_fit; + bool m_force_etc1s; + bool m_use_color4; + float m_flip_bias; + + inline basis_etc1_pack_params() + { + clear(); + } + + void clear() + { + m_quality = cETCQualitySlow; + m_perceptual = true; + m_cluster_fit = true; + m_force_etc1s = false; + m_use_color4 = true; + m_flip_bias = 0.0f; + } + }; + + struct etc1_solution_coordinates + { + inline etc1_solution_coordinates() : + m_unscaled_color(0, 0, 0, 0), + m_inten_table(0), + m_color4(false) + { + } + + inline etc1_solution_coordinates(uint32_t r, uint32_t g, uint32_t b, uint32_t inten_table, bool color4) : + m_unscaled_color((uint8_t)r, (uint8_t)g, (uint8_t)b, 255), + m_inten_table((uint8_t)inten_table), + m_color4(color4) + { + } + + inline etc1_solution_coordinates(const color_rgba& c, uint32_t inten_table, bool color4) : + m_unscaled_color(c), + m_inten_table(inten_table), + m_color4(color4) + { + } + + inline etc1_solution_coordinates(const etc1_solution_coordinates& other) + { + *this = other; + } + + inline etc1_solution_coordinates& operator= (const etc1_solution_coordinates& rhs) + { + m_unscaled_color = rhs.m_unscaled_color; + m_inten_table = rhs.m_inten_table; + m_color4 = rhs.m_color4; + return *this; + } + + inline void clear() + { + m_unscaled_color.clear(); + m_inten_table = 0; + m_color4 = false; + } + + inline void init(const color_rgba& c, uint32_t inten_table, bool color4) + { + m_unscaled_color = c; + m_inten_table = inten_table; + m_color4 = color4; + } + + inline color_rgba get_scaled_color() const + { + int br, bg, bb; + if (m_color4) + { + br = m_unscaled_color.r | (m_unscaled_color.r << 4); + bg = m_unscaled_color.g | (m_unscaled_color.g << 4); + bb = m_unscaled_color.b | (m_unscaled_color.b << 4); + } + else + { + br = (m_unscaled_color.r >> 2) | (m_unscaled_color.r << 3); + bg = (m_unscaled_color.g >> 2) | (m_unscaled_color.g << 3); + bb = (m_unscaled_color.b >> 2) | (m_unscaled_color.b << 3); + } + return color_rgba((uint8_t)br, (uint8_t)bg, (uint8_t)bb, 255); + } + + // returns true if anything was clamped + inline void get_block_colors(color_rgba* pBlock_colors) + { + int br, bg, bb; + if (m_color4) + { + br = m_unscaled_color.r | (m_unscaled_color.r << 4); + bg = m_unscaled_color.g | (m_unscaled_color.g << 4); + bb = m_unscaled_color.b | (m_unscaled_color.b << 4); + } + else + { + br = (m_unscaled_color.r >> 2) | (m_unscaled_color.r << 3); + bg = (m_unscaled_color.g >> 2) | (m_unscaled_color.g << 3); + bb = (m_unscaled_color.b >> 2) | (m_unscaled_color.b << 3); + } + const int* pInten_table = g_etc1_inten_tables[m_inten_table]; + pBlock_colors[0].set(br + pInten_table[0], bg + pInten_table[0], bb + pInten_table[0], 255); + pBlock_colors[1].set(br + pInten_table[1], bg + pInten_table[1], bb + pInten_table[1], 255); + pBlock_colors[2].set(br + pInten_table[2], bg + pInten_table[2], bb + pInten_table[2], 255); + pBlock_colors[3].set(br + pInten_table[3], bg + pInten_table[3], bb + pInten_table[3], 255); + } + + color_rgba m_unscaled_color; + uint32_t m_inten_table; + bool m_color4; + }; + + class etc1_optimizer + { + BASISU_NO_EQUALS_OR_COPY_CONSTRUCT(etc1_optimizer); + + public: + etc1_optimizer() + { + clear(); + } + + void clear() + { + m_pParams = nullptr; + m_pResult = nullptr; + m_pSorted_luma = nullptr; + m_pSorted_luma_indices = nullptr; + } + + struct params; + + typedef bool(*evaluate_solution_override_func)(uint64_t &error, const params &p, const color_rgba* pBlock_colors, const uint8_t* pSelectors, const etc1_solution_coordinates& coords); + + struct params : basis_etc1_pack_params + { + params() + { + clear(); + } + + params(const basis_etc1_pack_params& base_params) + { + clear_optimizer_params(); + + *static_cast(this) = base_params; + } + + void clear() + { + clear_optimizer_params(); + } + + void clear_optimizer_params() + { + basis_etc1_pack_params::clear(); + + m_num_src_pixels = 0; + m_pSrc_pixels = 0; + + m_use_color4 = false; + static const int s_default_scan_delta[] = { 0 }; + m_pScan_deltas = s_default_scan_delta; + m_scan_delta_size = 1; + + m_base_color5.clear(); + m_constrain_against_base_color5 = false; + + m_refinement = true; + + m_pForce_selectors = nullptr; + } + + uint32_t m_num_src_pixels; + const color_rgba* m_pSrc_pixels; + + bool m_use_color4; + const int* m_pScan_deltas; + uint32_t m_scan_delta_size; + + color_rgba m_base_color5; + bool m_constrain_against_base_color5; + + bool m_refinement; + + const uint8_t* m_pForce_selectors; + }; + + struct results + { + uint64_t m_error; + color_rgba m_block_color_unscaled; + uint32_t m_block_inten_table; + uint32_t m_n; + uint8_t* m_pSelectors; + bool m_block_color4; + + inline results& operator= (const results& rhs) + { + m_block_color_unscaled = rhs.m_block_color_unscaled; + m_block_color4 = rhs.m_block_color4; + m_block_inten_table = rhs.m_block_inten_table; + m_error = rhs.m_error; + memcpy(m_pSelectors, rhs.m_pSelectors, minimum(rhs.m_n, m_n)); + return *this; + } + }; + + void init(const params& params, results& result); + bool compute(); + + const params* get_params() const { return m_pParams; } + + private: + struct potential_solution + { + potential_solution() : m_coords(), m_error(UINT64_MAX), m_valid(false) + { + } + + etc1_solution_coordinates m_coords; + basisu::vector m_selectors; + uint64_t m_error; + bool m_valid; + + void clear() + { + m_coords.clear(); + m_selectors.resize(0); + m_error = UINT64_MAX; + m_valid = false; + } + + bool are_selectors_all_equal() const + { + if (!m_selectors.size()) + return false; + const uint32_t s = m_selectors[0]; + for (uint32_t i = 1; i < m_selectors.size(); i++) + if (m_selectors[i] != s) + return false; + return true; + } + }; + + const params* m_pParams; + results* m_pResult; + + int m_limit; + + vec3F m_avg_color; + int m_br, m_bg, m_bb; + int m_max_comp_spread; + basisu::vector m_luma; + basisu::vector m_sorted_luma; + basisu::vector m_sorted_luma_indices; + const uint32_t* m_pSorted_luma_indices; + uint32_t* m_pSorted_luma; + + basisu::vector m_selectors; + basisu::vector m_best_selectors; + + potential_solution m_best_solution; + potential_solution m_trial_solution; + basisu::vector m_temp_selectors; + + enum { cSolutionsTriedHashBits = 10, cTotalSolutionsTriedHashSize = 1 << cSolutionsTriedHashBits, cSolutionsTriedHashMask = cTotalSolutionsTriedHashSize - 1 }; + uint8_t m_solutions_tried[cTotalSolutionsTriedHashSize / 8]; + + void get_nearby_inten_tables(uint32_t idx, int &first_inten_table, int &last_inten_table) + { + first_inten_table = maximum(idx - 1, 0); + last_inten_table = minimum(cETC1IntenModifierValues, idx + 1); + } + + bool check_for_redundant_solution(const etc1_solution_coordinates& coords); + bool evaluate_solution_slow(const etc1_solution_coordinates& coords, potential_solution& trial_solution, potential_solution* pBest_solution); + bool evaluate_solution_fast(const etc1_solution_coordinates& coords, potential_solution& trial_solution, potential_solution* pBest_solution); + + inline bool evaluate_solution(const etc1_solution_coordinates& coords, potential_solution& trial_solution, potential_solution* pBest_solution) + { + if (m_pParams->m_quality >= cETCQualityMedium) + return evaluate_solution_slow(coords, trial_solution, pBest_solution); + else + return evaluate_solution_fast(coords, trial_solution, pBest_solution); + } + + void refine_solution(uint32_t max_refinement_trials); + void compute_internal_neighborhood(int scan_r, int scan_g, int scan_b); + void compute_internal_cluster_fit(uint32_t total_perms_to_try); + }; + + struct pack_etc1_block_context + { + etc1_optimizer m_optimizer; + }; + + void pack_etc1_solid_color_init(); + uint64_t pack_etc1_block_solid_color(etc_block& block, const uint8_t* pColor); + + // ETC EAC + extern const int8_t g_etc2_eac_tables[16][8]; + extern const int8_t g_etc2_eac_tables8[16][8]; + + const uint32_t ETC2_EAC_MIN_VALUE_SELECTOR = 3, ETC2_EAC_MAX_VALUE_SELECTOR = 7; + + struct eac_a8_block + { + uint16_t m_base : 8; + uint16_t m_table : 4; + uint16_t m_multiplier : 4; + + uint8_t m_selectors[6]; + + inline uint32_t get_selector(uint32_t x, uint32_t y, uint64_t selector_bits) const + { + assert((x < 4) && (y < 4)); + return static_cast((selector_bits >> (45 - (y + x * 4) * 3)) & 7); + } + + inline uint64_t get_selector_bits() const + { + uint64_t pixels = ((uint64_t)m_selectors[0] << 40) | ((uint64_t)m_selectors[1] << 32) | ((uint64_t)m_selectors[2] << 24) | ((uint64_t)m_selectors[3] << 16) | ((uint64_t)m_selectors[4] << 8) | m_selectors[5]; + return pixels; + } + + inline void set_selector_bits(uint64_t pixels) + { + m_selectors[0] = (uint8_t)(pixels >> 40); + m_selectors[1] = (uint8_t)(pixels >> 32); + m_selectors[2] = (uint8_t)(pixels >> 24); + m_selectors[3] = (uint8_t)(pixels >> 16); + m_selectors[4] = (uint8_t)(pixels >> 8); + m_selectors[5] = (uint8_t)(pixels); + } + + void set_selector(uint32_t x, uint32_t y, uint32_t s) + { + assert((x < 4) && (y < 4) && (s < 8)); + + const uint32_t ofs = 45 - (y + x * 4) * 3; + + uint64_t pixels = get_selector_bits(); + + pixels &= ~(7ULL << ofs); + pixels |= (static_cast(s) << ofs); + + set_selector_bits(pixels); + } + }; + + struct etc2_rgba_block + { + eac_a8_block m_alpha; + etc_block m_rgb; + }; + + struct pack_eac_a8_results + { + uint32_t m_base; + uint32_t m_table; + uint32_t m_multiplier; + uint8_vec m_selectors; + uint8_vec m_selectors_temp; + }; + + uint64_t pack_eac_a8(pack_eac_a8_results& results, const uint8_t* pPixels, uint32_t num_pixels, uint32_t base_search_rad, uint32_t mul_search_rad, uint32_t table_mask = UINT32_MAX); + void pack_eac_a8(eac_a8_block* pBlock, const uint8_t* pPixels, uint32_t base_search_rad, uint32_t mul_search_rad, uint32_t table_mask = UINT32_MAX); + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_frontend.cpp b/ktx/external/basisu/encoder/basisu_frontend.cpp new file mode 100644 index 0000000..a5f268f --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_frontend.cpp @@ -0,0 +1,3458 @@ +// basisu_frontend.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +// +// TODO: +// This code originally supported full ETC1 and ETC1S, so there's some legacy stuff to be cleaned up in here. +// Add endpoint tiling support (where we force adjacent blocks to use the same endpoints during quantization), for a ~10% or more increase in bitrate at same SSIM. The backend already supports this. +// +#include "../transcoder/basisu.h" +#include "basisu_frontend.h" +#include "basisu_opencl.h" +#include +#include + +#if BASISU_SUPPORT_SSE +#define CPPSPMD_NAME(a) a##_sse41 +#include "basisu_kernels_declares.h" +#endif + +#define BASISU_FRONTEND_VERIFY(c) do { if (!(c)) handle_verify_failure(__LINE__); } while(0) + +namespace basisu +{ + const uint32_t cMaxCodebookCreationThreads = 8; + + const uint32_t BASISU_MAX_ENDPOINT_REFINEMENT_STEPS = 3; + //const uint32_t BASISU_MAX_SELECTOR_REFINEMENT_STEPS = 3; + + const uint32_t BASISU_ENDPOINT_PARENT_CODEBOOK_SIZE = 16; + const uint32_t BASISU_SELECTOR_PARENT_CODEBOOK_SIZE_COMP_LEVEL_01 = 32; + const uint32_t BASISU_SELECTOR_PARENT_CODEBOOK_SIZE_COMP_LEVEL_DEFAULT = 16; + + // TODO - How to handle internal verifies in the basisu lib + static inline void handle_verify_failure(int line) + { + error_printf("basisu_frontend: verify check failed at line %i!\n", line); + abort(); + } + + bool basisu_frontend::init(const params &p) + { + debug_printf("basisu_frontend::init: Multithreaded: %u, Job pool total threads: %u, NumEndpointClusters: %u, NumSelectorClusters: %u, Perceptual: %u, CompressionLevel: %u\n", + p.m_multithreaded, p.m_pJob_pool ? p.m_pJob_pool->get_total_threads() : 0, + p.m_max_endpoint_clusters, p.m_max_selector_clusters, p.m_perceptual, p.m_compression_level); + + if ((p.m_max_endpoint_clusters < 1) || (p.m_max_endpoint_clusters > cMaxEndpointClusters)) + return false; + if ((p.m_max_selector_clusters < 1) || (p.m_max_selector_clusters > cMaxSelectorClusters)) + return false; + + m_source_blocks.resize(0); + append_vector(m_source_blocks, p.m_pSource_blocks, p.m_num_source_blocks); + + m_params = p; + + if (m_params.m_pOpenCL_context) + { + BASISU_ASSUME(sizeof(cl_pixel_block) == sizeof(pixel_block)); + + // Upload the RGBA pixel blocks a single time. + if (!opencl_set_pixel_blocks(m_params.m_pOpenCL_context, m_source_blocks.size(), (cl_pixel_block*)m_source_blocks.data())) + { + // This is not fatal, we just won't use OpenCL. + error_printf("basisu_frontend::init: opencl_set_pixel_blocks() failed\n"); + m_params.m_pOpenCL_context = nullptr; + m_opencl_failed = true; + } + } + + m_encoded_blocks.resize(m_params.m_num_source_blocks); + memset(&m_encoded_blocks[0], 0, m_encoded_blocks.size() * sizeof(m_encoded_blocks[0])); + + m_num_endpoint_codebook_iterations = 1; + m_num_selector_codebook_iterations = 1; + + switch (p.m_compression_level) + { + case 0: + { + m_endpoint_refinement = false; + m_use_hierarchical_endpoint_codebooks = true; + m_use_hierarchical_selector_codebooks = true; + break; + } + case 1: + { + m_endpoint_refinement = true; + m_use_hierarchical_endpoint_codebooks = true; + m_use_hierarchical_selector_codebooks = true; + + break; + } + case 2: + { + m_endpoint_refinement = true; + m_use_hierarchical_endpoint_codebooks = true; + m_use_hierarchical_selector_codebooks = true; + + break; + } + case 3: + { + m_endpoint_refinement = true; + m_use_hierarchical_endpoint_codebooks = false; + m_use_hierarchical_selector_codebooks = false; + break; + } + case 4: + { + m_endpoint_refinement = true; + m_use_hierarchical_endpoint_codebooks = true; + m_use_hierarchical_selector_codebooks = true; + m_num_endpoint_codebook_iterations = BASISU_MAX_ENDPOINT_REFINEMENT_STEPS; + m_num_selector_codebook_iterations = BASISU_MAX_ENDPOINT_REFINEMENT_STEPS; + break; + } + case 5: + { + m_endpoint_refinement = true; + m_use_hierarchical_endpoint_codebooks = false; + m_use_hierarchical_selector_codebooks = false; + m_num_endpoint_codebook_iterations = BASISU_MAX_ENDPOINT_REFINEMENT_STEPS; + m_num_selector_codebook_iterations = BASISU_MAX_ENDPOINT_REFINEMENT_STEPS; + break; + } + case 6: + default: + { + m_endpoint_refinement = true; + m_use_hierarchical_endpoint_codebooks = false; + m_use_hierarchical_selector_codebooks = false; + m_num_endpoint_codebook_iterations = BASISU_MAX_ENDPOINT_REFINEMENT_STEPS*2; + m_num_selector_codebook_iterations = BASISU_MAX_ENDPOINT_REFINEMENT_STEPS*2; + break; + } + + } + + if (m_params.m_disable_hierarchical_endpoint_codebooks) + m_use_hierarchical_endpoint_codebooks = false; + + debug_printf("Endpoint refinement: %u, Hierarchical endpoint codebooks: %u, Hierarchical selector codebooks: %u, Endpoint codebook iters: %u, Selector codebook iters: %u\n", + m_endpoint_refinement, m_use_hierarchical_endpoint_codebooks, m_use_hierarchical_selector_codebooks, m_num_endpoint_codebook_iterations, m_num_selector_codebook_iterations); + + return true; + } + + bool basisu_frontend::compress() + { + debug_printf("basisu_frontend::compress\n"); + + m_total_blocks = m_params.m_num_source_blocks; + m_total_pixels = m_total_blocks * cPixelBlockTotalPixels; + + // Encode the initial high quality ETC1S texture + + init_etc1_images(); + + // First quantize the ETC1S endpoints + + if (m_params.m_pGlobal_codebooks) + { + init_global_codebooks(); + } + else + { + init_endpoint_training_vectors(); + + generate_endpoint_clusters(); + + for (uint32_t refine_endpoint_step = 0; refine_endpoint_step < m_num_endpoint_codebook_iterations; refine_endpoint_step++) + { + if (m_params.m_validate) + { + BASISU_FRONTEND_VERIFY(check_etc1s_constraints()); + + BASISU_FRONTEND_VERIFY(validate_endpoint_cluster_hierarchy(false)); + } + + if (refine_endpoint_step) + { + introduce_new_endpoint_clusters(); + } + + if (m_params.m_validate) + { + BASISU_FRONTEND_VERIFY(validate_endpoint_cluster_hierarchy(false)); + } + + generate_endpoint_codebook(refine_endpoint_step); + + if ((m_params.m_debug_images) && (m_params.m_dump_endpoint_clusterization)) + { + char buf[256]; + snprintf(buf, sizeof(buf), "endpoint_cluster_vis_pre_%u.png", refine_endpoint_step); + dump_endpoint_clusterization_visualization(buf, false); + } + + bool early_out = false; + + if (m_endpoint_refinement) + { + //dump_endpoint_clusterization_visualization("endpoint_clusters_before_refinement.png"); + + if (!refine_endpoint_clusterization()) + early_out = true; + + if ((m_params.m_tex_type == basist::cBASISTexTypeVideoFrames) && (!refine_endpoint_step) && (m_num_endpoint_codebook_iterations == 1)) + { + eliminate_redundant_or_empty_endpoint_clusters(); + generate_endpoint_codebook(basisu::maximum(1U, refine_endpoint_step)); + } + + if ((m_params.m_debug_images) && (m_params.m_dump_endpoint_clusterization)) + { + char buf[256]; + snprintf(buf, sizeof(buf), "endpoint_cluster_vis_post_%u.png", refine_endpoint_step); + + dump_endpoint_clusterization_visualization(buf, false); + snprintf(buf, sizeof(buf), "endpoint_cluster_colors_vis_post_%u.png", refine_endpoint_step); + + dump_endpoint_clusterization_visualization(buf, true); + } + } + + if (m_params.m_validate) + { + BASISU_FRONTEND_VERIFY(validate_endpoint_cluster_hierarchy(false)); + } + + eliminate_redundant_or_empty_endpoint_clusters(); + + if (m_params.m_validate) + { + BASISU_FRONTEND_VERIFY(validate_endpoint_cluster_hierarchy(false)); + } + + if (m_params.m_debug_stats) + debug_printf("Total endpoint clusters: %u\n", (uint32_t)m_endpoint_clusters.size()); + + if (early_out) + break; + } + + if (m_params.m_validate) + { + BASISU_FRONTEND_VERIFY(check_etc1s_constraints()); + } + + generate_block_endpoint_clusters(); + + create_initial_packed_texture(); + + // Now quantize the ETC1S selectors + + generate_selector_clusters(); + + if (m_use_hierarchical_selector_codebooks) + compute_selector_clusters_within_each_parent_cluster(); + + if (m_params.m_compression_level == 0) + { + create_optimized_selector_codebook(0); + + find_optimal_selector_clusters_for_each_block(); + + introduce_special_selector_clusters(); + } + else + { + const uint32_t num_refine_selector_steps = m_num_selector_codebook_iterations; + for (uint32_t refine_selector_steps = 0; refine_selector_steps < num_refine_selector_steps; refine_selector_steps++) + { + create_optimized_selector_codebook(refine_selector_steps); + + find_optimal_selector_clusters_for_each_block(); + + introduce_special_selector_clusters(); + + if ((m_params.m_compression_level >= 4) || (m_params.m_tex_type == basist::cBASISTexTypeVideoFrames)) + { + if (!refine_block_endpoints_given_selectors()) + break; + } + } + } + + optimize_selector_codebook(); + + if (m_params.m_debug_stats) + debug_printf("Total selector clusters: %u\n", (uint32_t)m_selector_cluster_block_indices.size()); + } + + finalize(); + + if (m_params.m_validate) + { + if (!validate_output()) + return false; + } + + debug_printf("basisu_frontend::compress: Done\n"); + + return true; + } + + bool basisu_frontend::init_global_codebooks() + { + const basist::basisu_lowlevel_etc1s_transcoder* pTranscoder = m_params.m_pGlobal_codebooks; + + const basist::basisu_lowlevel_etc1s_transcoder::endpoint_vec& endpoints = pTranscoder->get_endpoints(); + const basist::basisu_lowlevel_etc1s_transcoder::selector_vec& selectors = pTranscoder->get_selectors(); + + m_endpoint_cluster_etc_params.resize(endpoints.size()); + for (uint32_t i = 0; i < endpoints.size(); i++) + { + m_endpoint_cluster_etc_params[i].m_inten_table[0] = endpoints[i].m_inten5; + m_endpoint_cluster_etc_params[i].m_inten_table[1] = endpoints[i].m_inten5; + + m_endpoint_cluster_etc_params[i].m_color_unscaled[0].set(endpoints[i].m_color5.r, endpoints[i].m_color5.g, endpoints[i].m_color5.b, 255); + m_endpoint_cluster_etc_params[i].m_color_used[0] = true; + m_endpoint_cluster_etc_params[i].m_valid = true; + } + + m_optimized_cluster_selectors.resize(selectors.size()); + for (uint32_t i = 0; i < m_optimized_cluster_selectors.size(); i++) + { + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + m_optimized_cluster_selectors[i].set_selector(x, y, selectors[i].get_selector(x, y)); + } + + m_block_endpoint_clusters_indices.resize(m_total_blocks); + + m_orig_encoded_blocks.resize(m_total_blocks); + + m_block_selector_cluster_index.resize(m_total_blocks); + +#if 0 + for (uint32_t block_index_iter = 0; block_index_iter < m_total_blocks; block_index_iter += N) + { + const uint32_t first_index = block_index_iter; + const uint32_t last_index = minimum(m_total_blocks, first_index + N); + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job([this, first_index, last_index] { +#endif + + for (uint32_t block_index = first_index; block_index < last_index; block_index++) + { + const etc_block& blk = m_etc1_blocks_etc1s[block_index]; + + const uint32_t block_endpoint_index = m_block_endpoint_clusters_indices[block_index][0]; + + etc_block trial_blk; + trial_blk.set_block_color5_etc1s(blk.m_color_unscaled[0]); + trial_blk.set_flip_bit(true); + + uint64_t best_err = UINT64_MAX; + uint32_t best_index = 0; + + for (uint32_t i = 0; i < m_optimized_cluster_selectors.size(); i++) + { + trial_blk.set_raw_selector_bits(m_optimized_cluster_selectors[i].get_raw_selector_bits()); + + const uint64_t cur_err = trial_blk.evaluate_etc1_error(get_source_pixel_block(block_index).get_ptr(), m_params.m_perceptual); + if (cur_err < best_err) + { + best_err = cur_err; + best_index = i; + if (!cur_err) + break; + } + + } // block_index + + m_block_selector_cluster_index[block_index] = best_index; + } + +#ifndef __EMSCRIPTEN__ + }); +#endif + + } + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + + m_encoded_blocks.resize(m_total_blocks); + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + const uint32_t endpoint_index = m_block_endpoint_clusters_indices[block_index][0]; + const uint32_t selector_index = m_block_selector_cluster_index[block_index]; + + etc_block& blk = m_encoded_blocks[block_index]; + + blk.set_block_color5_etc1s(m_endpoint_cluster_etc_params[endpoint_index].m_color_unscaled[0]); + blk.set_inten_tables_etc1s(m_endpoint_cluster_etc_params[endpoint_index].m_inten_table[0]); + blk.set_flip_bit(true); + blk.set_raw_selector_bits(m_optimized_cluster_selectors[selector_index].get_raw_selector_bits()); + } +#endif + + // HACK HACK + const uint32_t NUM_PASSES = 3; + for (uint32_t pass = 0; pass < NUM_PASSES; pass++) + { + debug_printf("init_global_codebooks: pass %u\n", pass); + + const uint32_t N = 128; + for (uint32_t block_index_iter = 0; block_index_iter < m_total_blocks; block_index_iter += N) + { + const uint32_t first_index = block_index_iter; + const uint32_t last_index = minimum(m_total_blocks, first_index + N); + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job([this, first_index, last_index, pass] { +#endif + + for (uint32_t block_index = first_index; block_index < last_index; block_index++) + { + const etc_block& blk = pass ? m_encoded_blocks[block_index] : m_etc1_blocks_etc1s[block_index]; + const uint32_t blk_raw_selector_bits = blk.get_raw_selector_bits(); + + etc_block trial_blk(blk); + trial_blk.set_raw_selector_bits(blk_raw_selector_bits); + trial_blk.set_flip_bit(true); + + uint64_t best_err = UINT64_MAX; + uint32_t best_index = 0; + etc_block best_block(trial_blk); + + for (uint32_t i = 0; i < m_endpoint_cluster_etc_params.size(); i++) + { + if (m_endpoint_cluster_etc_params[i].m_inten_table[0] > blk.get_inten_table(0)) + continue; + + trial_blk.set_block_color5_etc1s(m_endpoint_cluster_etc_params[i].m_color_unscaled[0]); + trial_blk.set_inten_tables_etc1s(m_endpoint_cluster_etc_params[i].m_inten_table[0]); + + const color_rgba* pSource_pixels = get_source_pixel_block(block_index).get_ptr(); + uint64_t cur_err; + if (!pass) + cur_err = trial_blk.determine_selectors(pSource_pixels, m_params.m_perceptual); + else + cur_err = trial_blk.evaluate_etc1_error(pSource_pixels, m_params.m_perceptual); + + if (cur_err < best_err) + { + best_err = cur_err; + best_index = i; + best_block = trial_blk; + + if (!cur_err) + break; + } + } + + m_block_endpoint_clusters_indices[block_index][0] = best_index; + m_block_endpoint_clusters_indices[block_index][1] = best_index; + + m_orig_encoded_blocks[block_index] = best_block; + + } // block_index + +#ifndef __EMSCRIPTEN__ + }); +#endif + + } + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + + m_endpoint_clusters.resize(0); + m_endpoint_clusters.resize(endpoints.size()); + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + const uint32_t endpoint_cluster_index = m_block_endpoint_clusters_indices[block_index][0]; + m_endpoint_clusters[endpoint_cluster_index].push_back(block_index * 2); + m_endpoint_clusters[endpoint_cluster_index].push_back(block_index * 2 + 1); + } + + m_block_selector_cluster_index.resize(m_total_blocks); + + for (uint32_t block_index_iter = 0; block_index_iter < m_total_blocks; block_index_iter += N) + { + const uint32_t first_index = block_index_iter; + const uint32_t last_index = minimum(m_total_blocks, first_index + N); + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job([this, first_index, last_index] { +#endif + + for (uint32_t block_index = first_index; block_index < last_index; block_index++) + { + const uint32_t block_endpoint_index = m_block_endpoint_clusters_indices[block_index][0]; + + etc_block trial_blk; + trial_blk.set_block_color5_etc1s(m_endpoint_cluster_etc_params[block_endpoint_index].m_color_unscaled[0]); + trial_blk.set_inten_tables_etc1s(m_endpoint_cluster_etc_params[block_endpoint_index].m_inten_table[0]); + trial_blk.set_flip_bit(true); + + uint64_t best_err = UINT64_MAX; + uint32_t best_index = 0; + + for (uint32_t i = 0; i < m_optimized_cluster_selectors.size(); i++) + { + trial_blk.set_raw_selector_bits(m_optimized_cluster_selectors[i].get_raw_selector_bits()); + + const uint64_t cur_err = trial_blk.evaluate_etc1_error(get_source_pixel_block(block_index).get_ptr(), m_params.m_perceptual); + if (cur_err < best_err) + { + best_err = cur_err; + best_index = i; + if (!cur_err) + break; + } + + } // block_index + + m_block_selector_cluster_index[block_index] = best_index; + } + +#ifndef __EMSCRIPTEN__ + }); +#endif + + } + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + + m_encoded_blocks.resize(m_total_blocks); + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + const uint32_t endpoint_index = m_block_endpoint_clusters_indices[block_index][0]; + const uint32_t selector_index = m_block_selector_cluster_index[block_index]; + + etc_block& blk = m_encoded_blocks[block_index]; + + blk.set_block_color5_etc1s(m_endpoint_cluster_etc_params[endpoint_index].m_color_unscaled[0]); + blk.set_inten_tables_etc1s(m_endpoint_cluster_etc_params[endpoint_index].m_inten_table[0]); + blk.set_flip_bit(true); + blk.set_raw_selector_bits(m_optimized_cluster_selectors[selector_index].get_raw_selector_bits()); + } + + } // pass + + m_selector_cluster_block_indices.resize(selectors.size()); + for (uint32_t block_index = 0; block_index < m_etc1_blocks_etc1s.size(); block_index++) + m_selector_cluster_block_indices[m_block_selector_cluster_index[block_index]].push_back(block_index); + + return true; + } + + void basisu_frontend::introduce_special_selector_clusters() + { + debug_printf("introduce_special_selector_clusters\n"); + + uint32_t total_blocks_relocated = 0; + const uint32_t initial_selector_clusters = (uint32_t)m_selector_cluster_block_indices.size(); + + bool_vec block_relocated_flags(m_total_blocks); + + // Make sure the selector codebook always has pure flat blocks for each possible selector, to avoid obvious artifacts. + // optimize_selector_codebook() will clean up any redundant clusters we create here. + for (uint32_t sel = 0; sel < 4; sel++) + { + etc_block blk; + clear_obj(blk); + for (uint32_t j = 0; j < 16; j++) + blk.set_selector(j & 3, j >> 2, sel); + + int k; + for (k = 0; k < (int)m_optimized_cluster_selectors.size(); k++) + if (m_optimized_cluster_selectors[k].get_raw_selector_bits() == blk.get_raw_selector_bits()) + break; + if (k < (int)m_optimized_cluster_selectors.size()) + continue; + + debug_printf("Introducing sel %u\n", sel); + + const uint32_t new_selector_cluster_index = (uint32_t)m_optimized_cluster_selectors.size(); + + m_optimized_cluster_selectors.push_back(blk); + + vector_ensure_element_is_valid(m_selector_cluster_block_indices, new_selector_cluster_index); + + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + if (m_orig_encoded_blocks[block_index].get_raw_selector_bits() != blk.get_raw_selector_bits()) + continue; + + // See if using flat selectors actually decreases the block's error. + const uint32_t old_selector_cluster_index = m_block_selector_cluster_index[block_index]; + + etc_block cur_blk; + const uint32_t endpoint_cluster_index = get_subblock_endpoint_cluster_index(block_index, 0); + cur_blk.set_block_color5_etc1s(get_endpoint_cluster_unscaled_color(endpoint_cluster_index, false)); + cur_blk.set_inten_tables_etc1s(get_endpoint_cluster_inten_table(endpoint_cluster_index, false)); + cur_blk.set_raw_selector_bits(get_selector_cluster_selector_bits(old_selector_cluster_index).get_raw_selector_bits()); + cur_blk.set_flip_bit(true); + + const uint64_t cur_err = cur_blk.evaluate_etc1_error(get_source_pixel_block(block_index).get_ptr(), m_params.m_perceptual); + + cur_blk.set_raw_selector_bits(blk.get_raw_selector_bits()); + + const uint64_t new_err = cur_blk.evaluate_etc1_error(get_source_pixel_block(block_index).get_ptr(), m_params.m_perceptual); + + if (new_err >= cur_err) + continue; + + // Change the block to use the new cluster + m_block_selector_cluster_index[block_index] = new_selector_cluster_index; + + m_selector_cluster_block_indices[new_selector_cluster_index].push_back(block_index); + + block_relocated_flags[block_index] = true; + +#if 0 + int j = vector_find(m_selector_cluster_block_indices[old_selector_cluster_index], block_index); + if (j >= 0) + m_selector_cluster_block_indices[old_selector_cluster_index].erase(m_selector_cluster_block_indices[old_selector_cluster_index].begin() + j); +#endif + + total_blocks_relocated++; + + m_encoded_blocks[block_index].set_raw_selector_bits(blk.get_raw_selector_bits()); + + } // block_index + + } // sel + + if (total_blocks_relocated) + { + debug_printf("Fixing selector codebook\n"); + + for (int selector_cluster_index = 0; selector_cluster_index < (int)initial_selector_clusters; selector_cluster_index++) + { + uint_vec& block_indices = m_selector_cluster_block_indices[selector_cluster_index]; + + uint32_t dst_ofs = 0; + + for (uint32_t i = 0; i < block_indices.size(); i++) + { + const uint32_t block_index = block_indices[i]; + if (!block_relocated_flags[block_index]) + block_indices[dst_ofs++] = block_index; + } + + block_indices.resize(dst_ofs); + } + } + + debug_printf("Total blocks relocated to new flat selector clusters: %u\n", total_blocks_relocated); + } + + // This method will change the number and ordering of the selector codebook clusters. + void basisu_frontend::optimize_selector_codebook() + { + debug_printf("optimize_selector_codebook\n"); + + const uint32_t orig_total_selector_clusters = (uint32_t)m_optimized_cluster_selectors.size(); + + bool_vec selector_cluster_was_used(m_optimized_cluster_selectors.size()); + for (uint32_t i = 0; i < m_total_blocks; i++) + selector_cluster_was_used[m_block_selector_cluster_index[i]] = true; + + int_vec old_to_new(m_optimized_cluster_selectors.size()); + int_vec new_to_old; + uint32_t total_new_entries = 0; + + std::unordered_map selector_hashmap; + + for (int i = 0; i < static_cast(m_optimized_cluster_selectors.size()); i++) + { + if (!selector_cluster_was_used[i]) + { + old_to_new[i] = -1; + continue; + } + + const uint32_t raw_selector_bits = m_optimized_cluster_selectors[i].get_raw_selector_bits(); + + auto find_res = selector_hashmap.insert(std::make_pair(raw_selector_bits, total_new_entries)); + if (!find_res.second) + { + old_to_new[i] = (find_res.first)->second; + continue; + } + + old_to_new[i] = total_new_entries++; + new_to_old.push_back(i); + } + + debug_printf("Original selector clusters: %u, new cluster selectors: %u\n", orig_total_selector_clusters, total_new_entries); + + for (uint32_t i = 0; i < m_block_selector_cluster_index.size(); i++) + { + BASISU_FRONTEND_VERIFY((old_to_new[m_block_selector_cluster_index[i]] >= 0) && (old_to_new[m_block_selector_cluster_index[i]] < (int)total_new_entries)); + m_block_selector_cluster_index[i] = old_to_new[m_block_selector_cluster_index[i]]; + } + + basisu::vector new_optimized_cluster_selectors(m_optimized_cluster_selectors.size() ? total_new_entries : 0); + basisu::vector new_selector_cluster_indices(m_selector_cluster_block_indices.size() ? total_new_entries : 0); + + for (uint32_t i = 0; i < total_new_entries; i++) + { + if (m_optimized_cluster_selectors.size()) + new_optimized_cluster_selectors[i] = m_optimized_cluster_selectors[new_to_old[i]]; + + //if (m_selector_cluster_block_indices.size()) + // new_selector_cluster_indices[i] = m_selector_cluster_block_indices[new_to_old[i]]; + } + + for (uint32_t i = 0; i < m_block_selector_cluster_index.size(); i++) + { + new_selector_cluster_indices[m_block_selector_cluster_index[i]].push_back(i); + } + + m_optimized_cluster_selectors.swap(new_optimized_cluster_selectors); + m_selector_cluster_block_indices.swap(new_selector_cluster_indices); + + // This isn't strictly necessary - doing it for completeness/future sanity. + if (m_selector_clusters_within_each_parent_cluster.size()) + { + for (uint32_t i = 0; i < m_selector_clusters_within_each_parent_cluster.size(); i++) + for (uint32_t j = 0; j < m_selector_clusters_within_each_parent_cluster[i].size(); j++) + m_selector_clusters_within_each_parent_cluster[i][j] = old_to_new[m_selector_clusters_within_each_parent_cluster[i][j]]; + } + + debug_printf("optimize_selector_codebook: Before: %u After: %u\n", orig_total_selector_clusters, total_new_entries); + } + + void basisu_frontend::init_etc1_images() + { + debug_printf("basisu_frontend::init_etc1_images\n"); + + interval_timer tm; + tm.start(); + + m_etc1_blocks_etc1s.resize(m_total_blocks); + + bool use_cpu = true; + + if (m_params.m_pOpenCL_context) + { + uint32_t total_perms = 64; + if (m_params.m_compression_level == 0) + total_perms = 4; + else if (m_params.m_compression_level == 1) + total_perms = 16; + else if (m_params.m_compression_level == BASISU_MAX_COMPRESSION_LEVEL) + total_perms = OPENCL_ENCODE_ETC1S_MAX_PERMS; + + bool status = opencl_encode_etc1s_blocks(m_params.m_pOpenCL_context, m_etc1_blocks_etc1s.data(), m_params.m_perceptual, total_perms); + if (status) + use_cpu = false; + else + { + error_printf("basisu_frontend::init_etc1_images: opencl_encode_etc1s_blocks() failed! Using CPU.\n"); + m_params.m_pOpenCL_context = nullptr; + m_opencl_failed = true; + } + } + + if (use_cpu) + { + const uint32_t N = 4096; + for (uint32_t block_index_iter = 0; block_index_iter < m_total_blocks; block_index_iter += N) + { + const uint32_t first_index = block_index_iter; + const uint32_t last_index = minimum(m_total_blocks, first_index + N); + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job([this, first_index, last_index] { +#endif + + for (uint32_t block_index = first_index; block_index < last_index; block_index++) + { + const pixel_block& source_blk = get_source_pixel_block(block_index); + + etc1_optimizer optimizer; + etc1_optimizer::params optimizer_params; + etc1_optimizer::results optimizer_results; + + if (m_params.m_compression_level == 0) + optimizer_params.m_quality = cETCQualityFast; + else if (m_params.m_compression_level == 1) + optimizer_params.m_quality = cETCQualityMedium; + else if (m_params.m_compression_level == BASISU_MAX_COMPRESSION_LEVEL) + optimizer_params.m_quality = cETCQualityUber; + + optimizer_params.m_num_src_pixels = 16; + optimizer_params.m_pSrc_pixels = source_blk.get_ptr(); + optimizer_params.m_perceptual = m_params.m_perceptual; + + uint8_t selectors[16]; + optimizer_results.m_pSelectors = selectors; + optimizer_results.m_n = 16; + + optimizer.init(optimizer_params, optimizer_results); + if (!optimizer.compute()) + BASISU_FRONTEND_VERIFY(false); + + etc_block& blk = m_etc1_blocks_etc1s[block_index]; + + memset(&blk, 0, sizeof(blk)); + blk.set_block_color5_etc1s(optimizer_results.m_block_color_unscaled); + blk.set_inten_tables_etc1s(optimizer_results.m_block_inten_table); + blk.set_flip_bit(true); + + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + blk.set_selector(x, y, selectors[x + y * 4]); + } + +#ifndef __EMSCRIPTEN__ + }); +#endif + + } + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + + } // use_cpu + + debug_printf("init_etc1_images: Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + } + + void basisu_frontend::init_endpoint_training_vectors() + { + debug_printf("init_endpoint_training_vectors\n"); + + vec6F_quantizer::array_of_weighted_training_vecs &training_vecs = m_endpoint_clusterizer.get_training_vecs(); + + training_vecs.resize(m_total_blocks * 2); + + const uint32_t N = 16384; + for (uint32_t block_index_iter = 0; block_index_iter < m_total_blocks; block_index_iter += N) + { + const uint32_t first_index = block_index_iter; + const uint32_t last_index = minimum(m_total_blocks, first_index + N); + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job( [this, first_index, last_index, &training_vecs] { +#endif + + for (uint32_t block_index = first_index; block_index < last_index; block_index++) + { + const etc_block &blk = m_etc1_blocks_etc1s[block_index]; + + color_rgba block_colors[2]; + blk.get_block_low_high_colors(block_colors, 0); + + vec6F v; + v[0] = block_colors[0].r * (1.0f / 255.0f); + v[1] = block_colors[0].g * (1.0f / 255.0f); + v[2] = block_colors[0].b * (1.0f / 255.0f); + v[3] = block_colors[1].r * (1.0f / 255.0f); + v[4] = block_colors[1].g * (1.0f / 255.0f); + v[5] = block_colors[1].b * (1.0f / 255.0f); + + training_vecs[block_index * 2 + 0] = std::make_pair(v, 1); + training_vecs[block_index * 2 + 1] = std::make_pair(v, 1); + + } // block_index; + +#ifndef __EMSCRIPTEN__ + } ); +#endif + + } // block_index_iter + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + } + + void basisu_frontend::generate_endpoint_clusters() + { + debug_printf("Begin endpoint quantization\n"); + + const uint32_t parent_codebook_size = (m_params.m_max_endpoint_clusters >= 256) ? BASISU_ENDPOINT_PARENT_CODEBOOK_SIZE : 0; + uint32_t max_threads = 0; + max_threads = m_params.m_multithreaded ? minimum(std::thread::hardware_concurrency(), cMaxCodebookCreationThreads) : 0; + if (m_params.m_pJob_pool) + max_threads = minimum((int)m_params.m_pJob_pool->get_total_threads(), max_threads); + + debug_printf("max_threads: %u\n", max_threads); + bool status = generate_hierarchical_codebook_threaded(m_endpoint_clusterizer, + m_params.m_max_endpoint_clusters, m_use_hierarchical_endpoint_codebooks ? parent_codebook_size : 0, + m_endpoint_clusters, + m_endpoint_parent_clusters, + max_threads, m_params.m_pJob_pool, true); + BASISU_FRONTEND_VERIFY(status); + + if (m_use_hierarchical_endpoint_codebooks) + { + if (!m_endpoint_parent_clusters.size()) + { + m_endpoint_parent_clusters.resize(0); + m_endpoint_parent_clusters.resize(1); + for (uint32_t i = 0; i < m_total_blocks; i++) + { + m_endpoint_parent_clusters[0].push_back(i*2); + m_endpoint_parent_clusters[0].push_back(i*2+1); + } + } + + BASISU_ASSUME(BASISU_ENDPOINT_PARENT_CODEBOOK_SIZE <= UINT8_MAX); + + m_block_parent_endpoint_cluster.resize(0); + m_block_parent_endpoint_cluster.resize(m_total_blocks); + vector_set_all(m_block_parent_endpoint_cluster, 0xFF); + for (uint32_t parent_cluster_index = 0; parent_cluster_index < m_endpoint_parent_clusters.size(); parent_cluster_index++) + { + const uint_vec &cluster = m_endpoint_parent_clusters[parent_cluster_index]; + for (uint32_t j = 0; j < cluster.size(); j++) + { + const uint32_t block_index = cluster[j] >> 1; + m_block_parent_endpoint_cluster[block_index] = static_cast(parent_cluster_index); + } + } + + for (uint32_t i = 0; i < m_total_blocks; i++) + { + BASISU_FRONTEND_VERIFY(m_block_parent_endpoint_cluster[i] != 0xFF); + } + + // Ensure that all the blocks within each cluster are all in the same parent cluster, or something is very wrong. + for (uint32_t cluster_index = 0; cluster_index < m_endpoint_clusters.size(); cluster_index++) + { + const uint_vec &cluster = m_endpoint_clusters[cluster_index]; + + uint32_t parent_cluster_index = 0; + for (uint32_t j = 0; j < cluster.size(); j++) + { + const uint32_t block_index = cluster[j] >> 1; + + BASISU_FRONTEND_VERIFY(block_index < m_block_parent_endpoint_cluster.size()); + + if (!j) + { + parent_cluster_index = m_block_parent_endpoint_cluster[block_index]; + } + else + { + BASISU_FRONTEND_VERIFY(m_block_parent_endpoint_cluster[block_index] == parent_cluster_index); + } + } + } + } + + if (m_params.m_debug_stats) + debug_printf("Total endpoint clusters: %u, parent clusters: %u\n", (uint32_t)m_endpoint_clusters.size(), (uint32_t)m_endpoint_parent_clusters.size()); + } + + // Iterate through each array of endpoint cluster block indices and set the m_block_endpoint_clusters_indices[][] array to indicaste which cluster index each block uses. + void basisu_frontend::generate_block_endpoint_clusters() + { + m_block_endpoint_clusters_indices.resize(m_total_blocks); + + for (int cluster_index = 0; cluster_index < static_cast(m_endpoint_clusters.size()); cluster_index++) + { + const basisu::vector& cluster_indices = m_endpoint_clusters[cluster_index]; + + for (uint32_t cluster_indices_iter = 0; cluster_indices_iter < cluster_indices.size(); cluster_indices_iter++) + { + const uint32_t block_index = cluster_indices[cluster_indices_iter] >> 1; + const uint32_t subblock_index = cluster_indices[cluster_indices_iter] & 1; + + m_block_endpoint_clusters_indices[block_index][subblock_index] = cluster_index; + + } // cluster_indices_iter + } + + if (m_params.m_validate) + { + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + uint32_t cluster_0 = m_block_endpoint_clusters_indices[block_index][0]; + uint32_t cluster_1 = m_block_endpoint_clusters_indices[block_index][1]; + BASISU_FRONTEND_VERIFY(cluster_0 == cluster_1); + } + } + } + + void basisu_frontend::compute_endpoint_clusters_within_each_parent_cluster() + { + generate_block_endpoint_clusters(); + + m_endpoint_clusters_within_each_parent_cluster.resize(0); + m_endpoint_clusters_within_each_parent_cluster.resize(m_endpoint_parent_clusters.size()); + + // Note: It's possible that some blocks got moved into the same cluster, but live in different parent clusters. + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + const uint32_t cluster_index = m_block_endpoint_clusters_indices[block_index][0]; + const uint32_t parent_cluster_index = m_block_parent_endpoint_cluster[block_index]; + + m_endpoint_clusters_within_each_parent_cluster[parent_cluster_index].push_back(cluster_index); + } + + for (uint32_t i = 0; i < m_endpoint_clusters_within_each_parent_cluster.size(); i++) + { + uint_vec &cluster_indices = m_endpoint_clusters_within_each_parent_cluster[i]; + + BASISU_FRONTEND_VERIFY(cluster_indices.size()); + + vector_sort(cluster_indices); + + auto last = std::unique(cluster_indices.begin(), cluster_indices.end()); + cluster_indices.erase(last, cluster_indices.end()); + } + } + + void basisu_frontend::compute_endpoint_subblock_error_vec() + { + m_subblock_endpoint_quant_err_vec.resize(0); + + const uint32_t N = 512; + for (uint32_t cluster_index_iter = 0; cluster_index_iter < m_endpoint_clusters.size(); cluster_index_iter += N) + { + const uint32_t first_index = cluster_index_iter; + const uint32_t last_index = minimum((uint32_t)m_endpoint_clusters.size(), cluster_index_iter + N); + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job( [this, first_index, last_index] { +#endif + + for (uint32_t cluster_index = first_index; cluster_index < last_index; cluster_index++) + { + const basisu::vector& cluster_indices = m_endpoint_clusters[cluster_index]; + + assert(cluster_indices.size()); + + for (uint32_t cluster_indices_iter = 0; cluster_indices_iter < cluster_indices.size(); cluster_indices_iter++) + { + basisu::vector cluster_pixels(8); + + const uint32_t block_index = cluster_indices[cluster_indices_iter] >> 1; + const uint32_t subblock_index = cluster_indices[cluster_indices_iter] & 1; + + const bool flipped = true; + + const color_rgba *pSource_block_pixels = get_source_pixel_block(block_index).get_ptr(); + + for (uint32_t pixel_index = 0; pixel_index < 8; pixel_index++) + { + cluster_pixels[pixel_index] = pSource_block_pixels[g_etc1_pixel_indices[flipped][subblock_index][pixel_index]]; + } + + const endpoint_cluster_etc_params &etc_params = m_endpoint_cluster_etc_params[cluster_index]; + + assert(etc_params.m_valid); + + color_rgba block_colors[4]; + etc_block::get_block_colors5(block_colors, etc_params.m_color_unscaled[0], etc_params.m_inten_table[0], true); + + uint64_t total_err = 0; + + for (uint32_t i = 0; i < 8; i++) + { + const color_rgba &c = cluster_pixels[i]; + + uint64_t best_err = UINT64_MAX; + //uint32_t best_index = 0; + + for (uint32_t s = 0; s < 4; s++) + { + uint64_t err = color_distance(m_params.m_perceptual, c, block_colors[s], false); + if (err < best_err) + { + best_err = err; + //best_index = s; + } + } + + total_err += best_err; + } + + subblock_endpoint_quant_err quant_err; + quant_err.m_total_err = total_err; + quant_err.m_cluster_index = cluster_index; + quant_err.m_cluster_subblock_index = cluster_indices_iter; + quant_err.m_block_index = block_index; + quant_err.m_subblock_index = subblock_index; + + { + std::lock_guard lock(m_lock); + + m_subblock_endpoint_quant_err_vec.push_back(quant_err); + } + } + } // cluster_index + +#ifndef __EMSCRIPTEN__ + } ); +#endif + + } // cluster_index_iter + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + + vector_sort(m_subblock_endpoint_quant_err_vec); + } + + void basisu_frontend::introduce_new_endpoint_clusters() + { + debug_printf("introduce_new_endpoint_clusters\n"); + + generate_block_endpoint_clusters(); + + int num_new_endpoint_clusters = m_params.m_max_endpoint_clusters - (uint32_t)m_endpoint_clusters.size(); + if (num_new_endpoint_clusters <= 0) + return; + + compute_endpoint_subblock_error_vec(); + + const uint32_t num_orig_endpoint_clusters = (uint32_t)m_endpoint_clusters.size(); + + std::unordered_set training_vector_was_relocated; + + uint_vec cluster_sizes(num_orig_endpoint_clusters); + for (uint32_t i = 0; i < num_orig_endpoint_clusters; i++) + cluster_sizes[i] = (uint32_t)m_endpoint_clusters[i].size(); + + std::unordered_set ignore_cluster; + + uint32_t total_new_clusters = 0; + + while (num_new_endpoint_clusters) + { + if (m_subblock_endpoint_quant_err_vec.size() == 0) + break; + + subblock_endpoint_quant_err subblock_to_move(m_subblock_endpoint_quant_err_vec.back()); + + m_subblock_endpoint_quant_err_vec.pop_back(); + + if (unordered_set_contains(ignore_cluster, subblock_to_move.m_cluster_index)) + continue; + + uint32_t training_vector_index = subblock_to_move.m_block_index * 2 + subblock_to_move.m_subblock_index; + + if (cluster_sizes[subblock_to_move.m_cluster_index] <= 2) + continue; + + if (unordered_set_contains(training_vector_was_relocated, training_vector_index)) + continue; + + if (unordered_set_contains(training_vector_was_relocated, training_vector_index ^ 1)) + continue; + +#if 0 + const uint32_t block_index = subblock_to_move.m_block_index; + const etc_block& blk = m_etc1_blocks_etc1s[block_index]; + uint32_t ls, hs; + blk.get_selector_range(ls, hs); + if (ls != hs) + continue; +#endif + + //const uint32_t new_endpoint_cluster_index = (uint32_t)m_endpoint_clusters.size(); + + enlarge_vector(m_endpoint_clusters, 1)->push_back(training_vector_index); + enlarge_vector(m_endpoint_cluster_etc_params, 1); + + assert(m_endpoint_clusters.size() == m_endpoint_cluster_etc_params.size()); + + training_vector_was_relocated.insert(training_vector_index); + + m_endpoint_clusters.back().push_back(training_vector_index ^ 1); + training_vector_was_relocated.insert(training_vector_index ^ 1); + + BASISU_FRONTEND_VERIFY(cluster_sizes[subblock_to_move.m_cluster_index] >= 2); + cluster_sizes[subblock_to_move.m_cluster_index] -= 2; + + ignore_cluster.insert(subblock_to_move.m_cluster_index); + + total_new_clusters++; + + num_new_endpoint_clusters--; + } + + debug_printf("Introduced %i new endpoint clusters\n", total_new_clusters); + + for (uint32_t i = 0; i < num_orig_endpoint_clusters; i++) + { + uint_vec &cluster_indices = m_endpoint_clusters[i]; + + uint_vec new_cluster_indices; + for (uint32_t j = 0; j < cluster_indices.size(); j++) + { + uint32_t training_vector_index = cluster_indices[j]; + + if (!unordered_set_contains(training_vector_was_relocated, training_vector_index)) + new_cluster_indices.push_back(training_vector_index); + } + + if (cluster_indices.size() != new_cluster_indices.size()) + { + BASISU_FRONTEND_VERIFY(new_cluster_indices.size() > 0); + cluster_indices.swap(new_cluster_indices); + } + } + + generate_block_endpoint_clusters(); + } + + struct color_rgba_hasher + { + inline std::size_t operator()(const color_rgba& k) const + { + uint32_t v = *(const uint32_t*)&k; + + //return bitmix32(v); + + //v ^= (v << 10); + //v ^= (v >> 12); + + return v; + } + }; + + // Given each endpoint cluster, gather all the block pixels which are in that cluster and compute optimized ETC1S endpoints for them. + // TODO: Don't optimize endpoint clusters which haven't changed. + // If step>=1, we check to ensure the new endpoint values actually decrease quantization error. + void basisu_frontend::generate_endpoint_codebook(uint32_t step) + { + debug_printf("generate_endpoint_codebook\n"); + + interval_timer tm; + tm.start(); + + m_endpoint_cluster_etc_params.resize(m_endpoint_clusters.size()); + + bool use_cpu = true; + // TODO: Get this working when step>0 + if (m_params.m_pOpenCL_context && !step) + { + const uint32_t total_clusters = m_endpoint_clusters.size(); + + basisu::vector pixel_clusters(total_clusters); + + std::vector input_pixels; + input_pixels.reserve(m_total_blocks * 16); + + std::vector pixel_weights; + pixel_weights.reserve(m_total_blocks * 16); + + uint_vec cluster_sizes(total_clusters); + + //typedef basisu::hash_map color_hasher_type; + //color_hasher_type color_hasher; + //color_hasher.reserve(2048); + + interval_timer hash_tm; + hash_tm.start(); + + basisu::vector colors, colors2; + colors.reserve(65536); + colors2.reserve(65536); + + for (uint32_t cluster_index = 0; cluster_index < m_endpoint_clusters.size(); cluster_index++) + { + const basisu::vector& cluster_indices = m_endpoint_clusters[cluster_index]; + assert((cluster_indices.size() & 1) == 0); + +#if 0 + uint64_t first_pixel_index = input_pixels.size(); + const uint32_t total_pixels = 16 * (cluster_indices.size() / 2); + + input_pixels.resize(input_pixels.size() + total_pixels); + pixel_weights.resize(pixel_weights.size() + total_pixels); + + uint64_t dst_ofs = first_pixel_index; + + uint64_t total_r = 0, total_g = 0, total_b = 0; + for (uint32_t cluster_indices_iter = 0; cluster_indices_iter < cluster_indices.size(); cluster_indices_iter++) + { + const uint32_t subblock_index = cluster_indices[cluster_indices_iter] & 1; + if (subblock_index) + continue; + + const uint32_t block_index = cluster_indices[cluster_indices_iter] >> 1; + const color_rgba* pBlock_pixels = get_source_pixel_block(block_index).get_ptr(); + + for (uint32_t i = 0; i < 16; i++) + { + input_pixels[dst_ofs] = pBlock_pixels[i]; + pixel_weights[dst_ofs] = 1; + dst_ofs++; + + total_r += pBlock_pixels[i].r; + total_g += pBlock_pixels[i].g; + total_b += pBlock_pixels[i].b; + } + } + + //printf("%i %f %f %f\n", cluster_index, total_r / (float)total_pixels, total_g / (float)total_pixels, total_b / (float)total_pixels); + + pixel_clusters[cluster_index].m_first_pixel_index = first_pixel_index; + pixel_clusters[cluster_index].m_total_pixels = total_pixels; + cluster_sizes[cluster_index] = total_pixels; +#elif 1 + colors.resize(cluster_indices.size() * 8); + colors2.resize(cluster_indices.size() * 8); + uint32_t dst_ofs = 0; + + for (uint32_t cluster_indices_iter = 0; cluster_indices_iter < cluster_indices.size(); cluster_indices_iter++) + { + const uint32_t subblock_index = cluster_indices[cluster_indices_iter] & 1; + if (subblock_index) + continue; + + const uint32_t block_index = cluster_indices[cluster_indices_iter] >> 1; + const color_rgba* pBlock_pixels = get_source_pixel_block(block_index).get_ptr(); + + memcpy(colors.data() + dst_ofs, pBlock_pixels, sizeof(color_rgba) * 16); + dst_ofs += 16; + + } // cluster_indices_iter + + uint32_t* pSorted = radix_sort(colors.size(), colors.data(), colors2.data(), 0, 3); + + const uint64_t first_pixel_index = input_pixels.size(); + + uint32_t prev_color = 0, cur_weight = 0; + + for (uint32_t i = 0; i < colors.size(); i++) + { + uint32_t cur_color = pSorted[i]; + if (cur_color == prev_color) + { + if (++cur_weight == 0) + cur_weight--; + } + else + { + if (cur_weight) + { + input_pixels.push_back(*(const color_rgba*)&prev_color); + pixel_weights.push_back(cur_weight); + } + + prev_color = cur_color; + cur_weight = 1; + } + } + + if (cur_weight) + { + input_pixels.push_back(*(const color_rgba*)&prev_color); + pixel_weights.push_back(cur_weight); + } + + uint32_t total_unique_pixels = (uint32_t)(input_pixels.size() - first_pixel_index); + + pixel_clusters[cluster_index].m_first_pixel_index = first_pixel_index; + pixel_clusters[cluster_index].m_total_pixels = total_unique_pixels; + + cluster_sizes[cluster_index] = total_unique_pixels; +#else + color_hasher.reset(); + + for (uint32_t cluster_indices_iter = 0; cluster_indices_iter < cluster_indices.size(); cluster_indices_iter++) + { + const uint32_t subblock_index = cluster_indices[cluster_indices_iter] & 1; + if (subblock_index) + continue; + + const uint32_t block_index = cluster_indices[cluster_indices_iter] >> 1; + const color_rgba* pBlock_pixels = get_source_pixel_block(block_index).get_ptr(); + + uint32_t *pPrev_weight = nullptr; + color_rgba prev_color; + + { + color_rgba cur_color = pBlock_pixels[0]; + auto res = color_hasher.insert(cur_color, 0); + + uint32_t& weight = (res.first)->second; + if (weight != UINT32_MAX) + weight++; + + prev_color = cur_color; + pPrev_weight = &(res.first)->second; + } + + for (uint32_t i = 1; i < 16; i++) + { + color_rgba cur_color = pBlock_pixels[i]; + + if (cur_color == prev_color) + { + if (*pPrev_weight != UINT32_MAX) + *pPrev_weight = *pPrev_weight + 1; + } + else + { + auto res = color_hasher.insert(cur_color, 0); + + uint32_t& weight = (res.first)->second; + if (weight != UINT32_MAX) + weight++; + + prev_color = cur_color; + pPrev_weight = &(res.first)->second; + } + } + + } // cluster_indices_iter + + const uint64_t first_pixel_index = input_pixels.size(); + uint32_t total_unique_pixels = color_hasher.size(); + + pixel_clusters[cluster_index].m_first_pixel_index = first_pixel_index; + pixel_clusters[cluster_index].m_total_pixels = total_unique_pixels; + + input_pixels.resize(first_pixel_index + total_unique_pixels); + pixel_weights.resize(first_pixel_index + total_unique_pixels); + + uint32_t j = 0; + + for (auto it = color_hasher.begin(); it != color_hasher.end(); ++it, ++j) + { + input_pixels[first_pixel_index + j] = it->first; + pixel_weights[first_pixel_index + j] = it->second; + } + + cluster_sizes[cluster_index] = total_unique_pixels; +#endif + + } // cluster_index + + debug_printf("Total hash time: %3.3f secs\n", hash_tm.get_elapsed_secs()); + + debug_printf("Total unique colors: %llu\n", input_pixels.size()); + + uint_vec sorted_cluster_indices_new_to_old(total_clusters); + indirect_sort(total_clusters, sorted_cluster_indices_new_to_old.data(), cluster_sizes.data()); + //for (uint32_t i = 0; i < total_clusters; i++) + // sorted_cluster_indices_new_to_old[i] = i; + + uint_vec sorted_cluster_indices_old_to_new(total_clusters); + for (uint32_t i = 0; i < total_clusters; i++) + sorted_cluster_indices_old_to_new[sorted_cluster_indices_new_to_old[i]] = i; + + basisu::vector sorted_pixel_clusters(total_clusters); + for (uint32_t i = 0; i < total_clusters; i++) + sorted_pixel_clusters[i] = pixel_clusters[sorted_cluster_indices_new_to_old[i]]; + + uint32_t total_perms = 64; + if (m_params.m_compression_level <= 1) + total_perms = 16; + else if (m_params.m_compression_level == BASISU_MAX_COMPRESSION_LEVEL) + total_perms = OPENCL_ENCODE_ETC1S_MAX_PERMS; + + basisu::vector output_blocks(total_clusters); + + if (opencl_encode_etc1s_pixel_clusters( + m_params.m_pOpenCL_context, + output_blocks.data(), + total_clusters, + sorted_pixel_clusters.data(), + input_pixels.size(), + input_pixels.data(), + pixel_weights.data(), + m_params.m_perceptual, total_perms)) + { + for (uint32_t old_cluster_index = 0; old_cluster_index < m_endpoint_clusters.size(); old_cluster_index++) + { + const uint32_t new_cluster_index = sorted_cluster_indices_old_to_new[old_cluster_index]; + + const etc_block& blk = output_blocks[new_cluster_index]; + + endpoint_cluster_etc_params& prev_etc_params = m_endpoint_cluster_etc_params[old_cluster_index]; + + prev_etc_params.m_valid = true; + etc_block::unpack_color5(prev_etc_params.m_color_unscaled[0], blk.get_base5_color(), false); + prev_etc_params.m_inten_table[0] = blk.get_inten_table(0); + prev_etc_params.m_color_error[0] = 0; // dummy value - we don't actually use this + } + + use_cpu = false; + } + else + { + error_printf("basisu_frontend::generate_endpoint_codebook: opencl_encode_etc1s_pixel_clusters() failed! Using CPU.\n"); + m_params.m_pOpenCL_context = nullptr; + m_opencl_failed = true; + } + + } // if (opencl_is_available() && m_params.m_use_opencl) + + if (use_cpu) + { + const uint32_t N = 128; + for (uint32_t cluster_index_iter = 0; cluster_index_iter < m_endpoint_clusters.size(); cluster_index_iter += N) + { + const uint32_t first_index = cluster_index_iter; + const uint32_t last_index = minimum((uint32_t)m_endpoint_clusters.size(), cluster_index_iter + N); + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job([this, first_index, last_index, step] { +#endif + + for (uint32_t cluster_index = first_index; cluster_index < last_index; cluster_index++) + { + const basisu::vector& cluster_indices = m_endpoint_clusters[cluster_index]; + + BASISU_FRONTEND_VERIFY(cluster_indices.size()); + + const uint32_t total_pixels = (uint32_t)cluster_indices.size() * 8; + + basisu::vector cluster_pixels(total_pixels); + + for (uint32_t cluster_indices_iter = 0; cluster_indices_iter < cluster_indices.size(); cluster_indices_iter++) + { + const uint32_t block_index = cluster_indices[cluster_indices_iter] >> 1; + const uint32_t subblock_index = cluster_indices[cluster_indices_iter] & 1; + + const bool flipped = true; + + const color_rgba* pBlock_pixels = get_source_pixel_block(block_index).get_ptr(); + + for (uint32_t pixel_index = 0; pixel_index < 8; pixel_index++) + { + const color_rgba& c = pBlock_pixels[g_etc1_pixel_indices[flipped][subblock_index][pixel_index]]; + cluster_pixels[cluster_indices_iter * 8 + pixel_index] = c; + } + } + + endpoint_cluster_etc_params new_subblock_params; + + { + etc1_optimizer optimizer; + etc1_solution_coordinates solutions[2]; + + etc1_optimizer::params cluster_optimizer_params; + cluster_optimizer_params.m_num_src_pixels = total_pixels; + cluster_optimizer_params.m_pSrc_pixels = &cluster_pixels[0]; + + cluster_optimizer_params.m_use_color4 = false; + cluster_optimizer_params.m_perceptual = m_params.m_perceptual; + + if (m_params.m_compression_level <= 1) + cluster_optimizer_params.m_quality = cETCQualityMedium; + else if (m_params.m_compression_level == BASISU_MAX_COMPRESSION_LEVEL) + cluster_optimizer_params.m_quality = cETCQualityUber; + + etc1_optimizer::results cluster_optimizer_results; + + basisu::vector cluster_selectors(total_pixels); + cluster_optimizer_results.m_n = total_pixels; + cluster_optimizer_results.m_pSelectors = &cluster_selectors[0]; + + optimizer.init(cluster_optimizer_params, cluster_optimizer_results); + + if (!optimizer.compute()) + BASISU_FRONTEND_VERIFY(false); + + new_subblock_params.m_color_unscaled[0] = cluster_optimizer_results.m_block_color_unscaled; + new_subblock_params.m_inten_table[0] = cluster_optimizer_results.m_block_inten_table; + new_subblock_params.m_color_error[0] = cluster_optimizer_results.m_error; + } + + endpoint_cluster_etc_params& prev_etc_params = m_endpoint_cluster_etc_params[cluster_index]; + + bool use_new_subblock_params = false; + if ((!step) || (!prev_etc_params.m_valid)) + use_new_subblock_params = true; + else + { + assert(prev_etc_params.m_valid); + + uint64_t total_prev_err = 0; + + { + color_rgba block_colors[4]; + + etc_block::get_block_colors5(block_colors, prev_etc_params.m_color_unscaled[0], prev_etc_params.m_inten_table[0], false); + + uint64_t total_err = 0; + + for (uint32_t i = 0; i < total_pixels; i++) + { + const color_rgba& c = cluster_pixels[i]; + + uint64_t best_err = UINT64_MAX; + //uint32_t best_index = 0; + + for (uint32_t s = 0; s < 4; s++) + { + uint64_t err = color_distance(m_params.m_perceptual, c, block_colors[s], false); + if (err < best_err) + { + best_err = err; + //best_index = s; + } + } + + total_err += best_err; + } + + total_prev_err += total_err; + } + + // See if we should update this cluster's endpoints (if the error has actually fallen) + if (total_prev_err > new_subblock_params.m_color_error[0]) + { + use_new_subblock_params = true; + } + } + + if (use_new_subblock_params) + { + new_subblock_params.m_valid = true; + + prev_etc_params = new_subblock_params; + } + + } // cluster_index + +#ifndef __EMSCRIPTEN__ + }); +#endif + + } // cluster_index_iter + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + } + + debug_printf("Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + } + + bool basisu_frontend::check_etc1s_constraints() const + { + basisu::vector block_clusters(m_total_blocks); + + for (int cluster_index = 0; cluster_index < static_cast(m_endpoint_clusters.size()); cluster_index++) + { + const basisu::vector& cluster_indices = m_endpoint_clusters[cluster_index]; + + for (uint32_t cluster_indices_iter = 0; cluster_indices_iter < cluster_indices.size(); cluster_indices_iter++) + { + const uint32_t block_index = cluster_indices[cluster_indices_iter] >> 1; + const uint32_t subblock_index = cluster_indices[cluster_indices_iter] & 1; + + block_clusters[block_index][subblock_index] = cluster_index; + + } // cluster_indices_iter + } + + for (uint32_t i = 0; i < m_total_blocks; i++) + { + if (block_clusters[i][0] != block_clusters[i][1]) + return false; + } + + return true; + } + + // For each block, determine which ETC1S endpoint cluster can encode that block with lowest error. + // This reassigns blocks to different endpoint clusters. + uint32_t basisu_frontend::refine_endpoint_clusterization() + { + debug_printf("refine_endpoint_clusterization\n"); + + if (m_use_hierarchical_endpoint_codebooks) + compute_endpoint_clusters_within_each_parent_cluster(); + + // Note: It's possible that an endpoint cluster may live in more than one parent cluster after the first refinement step. + + basisu::vector block_clusters(m_total_blocks); + + for (int cluster_index = 0; cluster_index < static_cast(m_endpoint_clusters.size()); cluster_index++) + { + const basisu::vector& cluster_indices = m_endpoint_clusters[cluster_index]; + + for (uint32_t cluster_indices_iter = 0; cluster_indices_iter < cluster_indices.size(); cluster_indices_iter++) + { + const uint32_t block_index = cluster_indices[cluster_indices_iter] >> 1; + const uint32_t subblock_index = cluster_indices[cluster_indices_iter] & 1; + + block_clusters[block_index][subblock_index] = cluster_index; + + } // cluster_indices_iter + } + + //---------------------------------------------------------- + + // Create a new endpoint clusterization + + interval_timer tm; + tm.start(); + + uint_vec best_cluster_indices(m_total_blocks); + + bool use_cpu = true; + // TODO: Support non-hierarchical endpoint codebooks here + if (m_params.m_pOpenCL_context && m_use_hierarchical_endpoint_codebooks) + { + // For the OpenCL kernel, we order the parent endpoint clusters by smallest to largest for efficiency. + // We also prepare an array of block info structs that point into this new parent endpoint cluster array. + const uint32_t total_parent_clusters = m_endpoint_clusters_within_each_parent_cluster.size(); + + basisu::vector cl_block_info_structs(m_total_blocks); + + // the size of each parent cluster, in total clusters + uint_vec parent_cluster_sizes(total_parent_clusters); + for (uint32_t i = 0; i < total_parent_clusters; i++) + parent_cluster_sizes[i] = m_endpoint_clusters_within_each_parent_cluster[i].size(); + + uint_vec first_parent_cluster_ofs(total_parent_clusters); + uint32_t cur_ofs = 0; + for (uint32_t i = 0; i < total_parent_clusters; i++) + { + first_parent_cluster_ofs[i] = cur_ofs; + + cur_ofs += parent_cluster_sizes[i]; + } + + // Note: total_actual_endpoint_clusters is not necessarly equal to m_endpoint_clusters.size(), because clusters may live in multiple parent clusters after the first refinement step. + BASISU_FRONTEND_VERIFY(cur_ofs >= m_endpoint_clusters.size()); + const uint32_t total_actual_endpoint_clusters = cur_ofs; + basisu::vector cl_endpoint_cluster_structs(total_actual_endpoint_clusters); + + for (uint32_t i = 0; i < total_parent_clusters; i++) + { + const uint32_t dst_ofs = first_parent_cluster_ofs[i]; + + const uint32_t parent_cluster_size = parent_cluster_sizes[i]; + + assert(m_endpoint_clusters_within_each_parent_cluster[i].size() == parent_cluster_size); + + for (uint32_t j = 0; j < parent_cluster_size; j++) + { + const uint32_t endpoint_cluster_index = m_endpoint_clusters_within_each_parent_cluster[i][j]; + + color_rgba cluster_etc_base_color(m_endpoint_cluster_etc_params[endpoint_cluster_index].m_color_unscaled[0]); + uint32_t cluster_etc_inten = m_endpoint_cluster_etc_params[endpoint_cluster_index].m_inten_table[0]; + + cl_endpoint_cluster_structs[dst_ofs + j].m_unscaled_color = cluster_etc_base_color; + cl_endpoint_cluster_structs[dst_ofs + j].m_etc_inten = (uint8_t)cluster_etc_inten; + cl_endpoint_cluster_structs[dst_ofs + j].m_cluster_index = (uint16_t)endpoint_cluster_index; + } + } + + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + const uint32_t block_parent_endpoint_cluster_index = m_block_parent_endpoint_cluster[block_index]; + + cl_block_info_structs[block_index].m_num_clusters = (uint16_t)(parent_cluster_sizes[block_parent_endpoint_cluster_index]); + cl_block_info_structs[block_index].m_first_cluster_ofs = (uint16_t)(first_parent_cluster_ofs[block_parent_endpoint_cluster_index]); + + const uint32_t block_cluster_index = block_clusters[block_index][0]; + cl_block_info_structs[block_index].m_cur_cluster_index = (uint16_t)block_cluster_index; + cl_block_info_structs[block_index].m_cur_cluster_etc_inten = (uint8_t)m_endpoint_cluster_etc_params[block_cluster_index].m_inten_table[0]; + } + + uint_vec block_cluster_indices(m_total_blocks); + for (uint32_t i = 0; i < m_total_blocks; i++) + block_cluster_indices[i] = block_clusters[i][0]; + + uint_vec sorted_block_indices(m_total_blocks); + indirect_sort(m_total_blocks, sorted_block_indices.data(), block_cluster_indices.data()); + + bool status = opencl_refine_endpoint_clusterization( + m_params.m_pOpenCL_context, + cl_block_info_structs.data(), + total_actual_endpoint_clusters, + cl_endpoint_cluster_structs.data(), + sorted_block_indices.data(), + best_cluster_indices.data(), + m_params.m_perceptual); + + if (status) + { + use_cpu = false; + } + else + { + error_printf("basisu_frontend::refine_endpoint_clusterization: opencl_refine_endpoint_clusterization() failed! Using CPU.\n"); + m_params.m_pOpenCL_context = nullptr; + m_opencl_failed = true; + } + } + + if (use_cpu) + { + const uint32_t N = 1024; + for (uint32_t block_index_iter = 0; block_index_iter < m_total_blocks; block_index_iter += N) + { + const uint32_t first_index = block_index_iter; + const uint32_t last_index = minimum(m_total_blocks, first_index + N); + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job([this, first_index, last_index, &best_cluster_indices, &block_clusters] { +#endif + + for (uint32_t block_index = first_index; block_index < last_index; block_index++) + { + const uint32_t cluster_index = block_clusters[block_index][0]; + BASISU_FRONTEND_VERIFY(cluster_index == block_clusters[block_index][1]); + + const color_rgba* pSubblock_pixels = get_source_pixel_block(block_index).get_ptr(); + const uint32_t num_subblock_pixels = 16; + + uint64_t best_cluster_err = INT64_MAX; + uint32_t best_cluster_index = 0; + + const uint32_t block_parent_endpoint_cluster_index = m_block_parent_endpoint_cluster.size() ? m_block_parent_endpoint_cluster[block_index] : 0; + const uint_vec* pCluster_indices = m_endpoint_clusters_within_each_parent_cluster.size() ? &m_endpoint_clusters_within_each_parent_cluster[block_parent_endpoint_cluster_index] : nullptr; + + const uint32_t total_clusters = m_use_hierarchical_endpoint_codebooks ? (uint32_t)pCluster_indices->size() : (uint32_t)m_endpoint_clusters.size(); + + for (uint32_t i = 0; i < total_clusters; i++) + { + const uint32_t cluster_iter = m_use_hierarchical_endpoint_codebooks ? (*pCluster_indices)[i] : i; + + color_rgba cluster_etc_base_color(m_endpoint_cluster_etc_params[cluster_iter].m_color_unscaled[0]); + uint32_t cluster_etc_inten = m_endpoint_cluster_etc_params[cluster_iter].m_inten_table[0]; + + uint64_t total_err = 0; + + const uint32_t low_selector = 0;//subblock_etc_params_vec[j].m_low_selectors[0]; + const uint32_t high_selector = 3;//subblock_etc_params_vec[j].m_high_selectors[0]; + color_rgba subblock_colors[4]; + // Can't assign it here - may result in too much error when selector quant occurs + if (cluster_etc_inten > m_endpoint_cluster_etc_params[cluster_index].m_inten_table[0]) + { + total_err = INT64_MAX; + goto skip_cluster; + } + + etc_block::get_block_colors5(subblock_colors, cluster_etc_base_color, cluster_etc_inten); + +#if 0 + for (uint32_t p = 0; p < num_subblock_pixels; p++) + { + uint64_t best_err = UINT64_MAX; + + for (uint32_t r = low_selector; r <= high_selector; r++) + { + uint64_t err = color_distance(m_params.m_perceptual, pSubblock_pixels[p], subblock_colors[r], false); + best_err = minimum(best_err, err); + if (!best_err) + break; + } + + total_err += best_err; + if (total_err > best_cluster_err) + break; + } // p +#else + if (m_params.m_perceptual) + { + if (!g_cpu_supports_sse41) + { + for (uint32_t p = 0; p < num_subblock_pixels; p++) + { + uint64_t best_err = UINT64_MAX; + + for (uint32_t r = low_selector; r <= high_selector; r++) + { + uint64_t err = color_distance(true, pSubblock_pixels[p], subblock_colors[r], false); + best_err = minimum(best_err, err); + if (!best_err) + break; + } + + total_err += best_err; + if (total_err > best_cluster_err) + break; + } // p + } + else + { +#if BASISU_SUPPORT_SSE + find_lowest_error_perceptual_rgb_4_N_sse41((int64_t*)&total_err, subblock_colors, pSubblock_pixels, num_subblock_pixels, best_cluster_err); +#endif + } + } + else + { + if (!g_cpu_supports_sse41) + { + for (uint32_t p = 0; p < num_subblock_pixels; p++) + { + uint64_t best_err = UINT64_MAX; + + for (uint32_t r = low_selector; r <= high_selector; r++) + { + uint64_t err = color_distance(false, pSubblock_pixels[p], subblock_colors[r], false); + best_err = minimum(best_err, err); + if (!best_err) + break; + } + + total_err += best_err; + if (total_err > best_cluster_err) + break; + } // p + } + else + { +#if BASISU_SUPPORT_SSE + find_lowest_error_linear_rgb_4_N_sse41((int64_t*)&total_err, subblock_colors, pSubblock_pixels, num_subblock_pixels, best_cluster_err); +#endif + } + } +#endif + + skip_cluster: + if ((total_err < best_cluster_err) || + ((cluster_iter == cluster_index) && (total_err == best_cluster_err))) + { + best_cluster_err = total_err; + best_cluster_index = cluster_iter; + + if (!best_cluster_err) + break; + } + } // j + + best_cluster_indices[block_index] = best_cluster_index; + + } // block_index + +#ifndef __EMSCRIPTEN__ + }); +#endif + + } // block_index_iter + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + + } // use_cpu + + debug_printf("refine_endpoint_clusterization time: %3.3f secs\n", tm.get_elapsed_secs()); + + basisu::vector > optimized_endpoint_clusters(m_endpoint_clusters.size()); + uint32_t total_subblocks_reassigned = 0; + + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + const uint32_t training_vector_index = block_index * 2 + 0; + + const uint32_t orig_cluster_index = block_clusters[block_index][0]; + const uint32_t best_cluster_index = best_cluster_indices[block_index]; + + optimized_endpoint_clusters[best_cluster_index].push_back(training_vector_index); + optimized_endpoint_clusters[best_cluster_index].push_back(training_vector_index + 1); + + if (best_cluster_index != orig_cluster_index) + { + total_subblocks_reassigned++; + } + } + + debug_printf("total_subblocks_reassigned: %u\n", total_subblocks_reassigned); + + m_endpoint_clusters = optimized_endpoint_clusters; + + return total_subblocks_reassigned; + } + + void basisu_frontend::eliminate_redundant_or_empty_endpoint_clusters() + { + debug_printf("eliminate_redundant_or_empty_endpoint_clusters\n"); + + // Step 1: Sort endpoint clusters by the base colors/intens + + uint_vec sorted_endpoint_cluster_indices(m_endpoint_clusters.size()); + for (uint32_t i = 0; i < m_endpoint_clusters.size(); i++) + sorted_endpoint_cluster_indices[i] = i; + + indirect_sort((uint32_t)m_endpoint_clusters.size(), &sorted_endpoint_cluster_indices[0], &m_endpoint_cluster_etc_params[0]); + + basisu::vector > new_endpoint_clusters(m_endpoint_clusters.size()); + basisu::vector new_subblock_etc_params(m_endpoint_clusters.size()); + + for (uint32_t i = 0; i < m_endpoint_clusters.size(); i++) + { + uint32_t j = sorted_endpoint_cluster_indices[i]; + new_endpoint_clusters[i] = m_endpoint_clusters[j]; + new_subblock_etc_params[i] = m_endpoint_cluster_etc_params[j]; + } + + new_endpoint_clusters.swap(m_endpoint_clusters); + new_subblock_etc_params.swap(m_endpoint_cluster_etc_params); + + // Step 2: Eliminate redundant endpoint clusters, or empty endpoint clusters + + new_endpoint_clusters.resize(0); + new_subblock_etc_params.resize(0); + + for (int i = 0; i < (int)m_endpoint_clusters.size(); ) + { + if (!m_endpoint_clusters[i].size()) + { + i++; + continue; + } + + int j; + for (j = i + 1; j < (int)m_endpoint_clusters.size(); j++) + { + if (!(m_endpoint_cluster_etc_params[i] == m_endpoint_cluster_etc_params[j])) + break; + } + + new_endpoint_clusters.push_back(m_endpoint_clusters[i]); + new_subblock_etc_params.push_back(m_endpoint_cluster_etc_params[i]); + + for (int k = i + 1; k < j; k++) + { + append_vector(new_endpoint_clusters.back(), m_endpoint_clusters[k]); + } + + i = j; + } + + if (m_endpoint_clusters.size() != new_endpoint_clusters.size()) + { + if (m_params.m_debug_stats) + debug_printf("Eliminated %u redundant or empty clusters\n", (uint32_t)(m_endpoint_clusters.size() - new_endpoint_clusters.size())); + + m_endpoint_clusters.swap(new_endpoint_clusters); + + m_endpoint_cluster_etc_params.swap(new_subblock_etc_params); + } + } + + void basisu_frontend::create_initial_packed_texture() + { + debug_printf("create_initial_packed_texture\n"); + + interval_timer tm; + tm.start(); + + bool use_cpu = true; + + if ((m_params.m_pOpenCL_context) && (opencl_is_available())) + { + basisu::vector block_etc5_color_intens(m_total_blocks); + + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + uint32_t cluster0 = m_block_endpoint_clusters_indices[block_index][0]; + + const color_rgba& color_unscaled = m_endpoint_cluster_etc_params[cluster0].m_color_unscaled[0]; + uint32_t inten = m_endpoint_cluster_etc_params[cluster0].m_inten_table[0]; + + block_etc5_color_intens[block_index].set(color_unscaled.r, color_unscaled.g, color_unscaled.b, inten); + } + + bool status = opencl_determine_selectors(m_params.m_pOpenCL_context, block_etc5_color_intens.data(), + m_encoded_blocks.data(), + m_params.m_perceptual); + if (!status) + { + error_printf("basisu_frontend::create_initial_packed_texture: opencl_determine_selectors() failed! Using CPU.\n"); + m_params.m_pOpenCL_context = nullptr; + m_opencl_failed = true; + } + else + { + use_cpu = false; + } + } + + if (use_cpu) + { + const uint32_t N = 4096; + for (uint32_t block_index_iter = 0; block_index_iter < m_total_blocks; block_index_iter += N) + { + const uint32_t first_index = block_index_iter; + const uint32_t last_index = minimum(m_total_blocks, first_index + N); + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job([this, first_index, last_index] { +#endif + + for (uint32_t block_index = first_index; block_index < last_index; block_index++) + { + uint32_t cluster0 = m_block_endpoint_clusters_indices[block_index][0]; + uint32_t cluster1 = m_block_endpoint_clusters_indices[block_index][1]; + BASISU_FRONTEND_VERIFY(cluster0 == cluster1); + + const color_rgba* pSource_pixels = get_source_pixel_block(block_index).get_ptr(); + + etc_block& blk = m_encoded_blocks[block_index]; + + color_rgba unscaled[2] = { m_endpoint_cluster_etc_params[cluster0].m_color_unscaled[0], m_endpoint_cluster_etc_params[cluster1].m_color_unscaled[0] }; + uint32_t inten[2] = { m_endpoint_cluster_etc_params[cluster0].m_inten_table[0], m_endpoint_cluster_etc_params[cluster1].m_inten_table[0] }; + + blk.set_block_color5(unscaled[0], unscaled[1]); + blk.set_flip_bit(true); + + blk.set_inten_table(0, inten[0]); + blk.set_inten_table(1, inten[1]); + + blk.determine_selectors(pSource_pixels, m_params.m_perceptual); + + } // block_index + +#ifndef __EMSCRIPTEN__ + }); +#endif + + } // block_index_iter + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + + } // use_cpu + + m_orig_encoded_blocks = m_encoded_blocks; + + debug_printf("Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + } + + void basisu_frontend::compute_selector_clusters_within_each_parent_cluster() + { + uint_vec block_selector_cluster_indices(m_total_blocks); + + for (int cluster_index = 0; cluster_index < static_cast(m_selector_cluster_block_indices.size()); cluster_index++) + { + const basisu::vector& cluster_indices = m_selector_cluster_block_indices[cluster_index]; + + for (uint32_t cluster_indices_iter = 0; cluster_indices_iter < cluster_indices.size(); cluster_indices_iter++) + { + const uint32_t block_index = cluster_indices[cluster_indices_iter]; + + block_selector_cluster_indices[block_index] = cluster_index; + + } // cluster_indices_iter + + } // cluster_index + + m_selector_clusters_within_each_parent_cluster.resize(0); + m_selector_clusters_within_each_parent_cluster.resize(m_selector_parent_cluster_block_indices.size()); + + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + const uint32_t cluster_index = block_selector_cluster_indices[block_index]; + const uint32_t parent_cluster_index = m_block_parent_selector_cluster[block_index]; + + m_selector_clusters_within_each_parent_cluster[parent_cluster_index].push_back(cluster_index); + } + + for (uint32_t i = 0; i < m_selector_clusters_within_each_parent_cluster.size(); i++) + { + uint_vec &cluster_indices = m_selector_clusters_within_each_parent_cluster[i]; + + BASISU_FRONTEND_VERIFY(cluster_indices.size()); + + vector_sort(cluster_indices); + + auto last = std::unique(cluster_indices.begin(), cluster_indices.end()); + cluster_indices.erase(last, cluster_indices.end()); + } + } + + void basisu_frontend::generate_selector_clusters() + { + debug_printf("generate_selector_clusters\n"); + + typedef tree_vector_quant vec16F_clusterizer; + + vec16F_clusterizer::array_of_weighted_training_vecs training_vecs(m_total_blocks); + + const uint32_t N = 4096; + for (uint32_t block_index_iter = 0; block_index_iter < m_total_blocks; block_index_iter += N) + { + const uint32_t first_index = block_index_iter; + const uint32_t last_index = minimum(m_total_blocks, first_index + N); + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job( [this, first_index, last_index, &training_vecs] { +#endif + + for (uint32_t block_index = first_index; block_index < last_index; block_index++) + { + const etc_block &blk = m_encoded_blocks[block_index]; + + vec16F v; + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + v[x + y * 4] = static_cast(blk.get_selector(x, y)); + + const uint32_t subblock_index = (blk.get_inten_table(0) > blk.get_inten_table(1)) ? 0 : 1; + + color_rgba block_colors[2]; + blk.get_block_low_high_colors(block_colors, subblock_index); + + const uint32_t dist = color_distance(m_params.m_perceptual, block_colors[0], block_colors[1], false); + + const uint32_t cColorDistToWeight = 300; + const uint32_t cMaxWeight = 4096; + uint32_t weight = clamp(dist / cColorDistToWeight, 1, cMaxWeight); + + training_vecs[block_index].first = v; + training_vecs[block_index].second = weight; + + } // block_index + +#ifndef __EMSCRIPTEN__ + } ); +#endif + + } // block_index_iter + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + + vec16F_clusterizer selector_clusterizer; + for (uint32_t i = 0; i < m_total_blocks; i++) + selector_clusterizer.add_training_vec(training_vecs[i].first, training_vecs[i].second); + + const int selector_parent_codebook_size = (m_params.m_compression_level <= 1) ? BASISU_SELECTOR_PARENT_CODEBOOK_SIZE_COMP_LEVEL_01 : BASISU_SELECTOR_PARENT_CODEBOOK_SIZE_COMP_LEVEL_DEFAULT; + const uint32_t parent_codebook_size = (m_params.m_max_selector_clusters >= 256) ? selector_parent_codebook_size : 0; + debug_printf("Using selector parent codebook size %u\n", parent_codebook_size); + + uint32_t max_threads = 0; + max_threads = m_params.m_multithreaded ? minimum(std::thread::hardware_concurrency(), cMaxCodebookCreationThreads) : 0; + if (m_params.m_pJob_pool) + max_threads = minimum((int)m_params.m_pJob_pool->get_total_threads(), max_threads); + + bool status = generate_hierarchical_codebook_threaded(selector_clusterizer, + m_params.m_max_selector_clusters, m_use_hierarchical_selector_codebooks ? parent_codebook_size : 0, + m_selector_cluster_block_indices, + m_selector_parent_cluster_block_indices, + max_threads, m_params.m_pJob_pool, false); + BASISU_FRONTEND_VERIFY(status); + + if (m_use_hierarchical_selector_codebooks) + { + if (!m_selector_parent_cluster_block_indices.size()) + { + m_selector_parent_cluster_block_indices.resize(0); + m_selector_parent_cluster_block_indices.resize(1); + for (uint32_t i = 0; i < m_total_blocks; i++) + m_selector_parent_cluster_block_indices[0].push_back(i); + } + + BASISU_ASSUME(BASISU_SELECTOR_PARENT_CODEBOOK_SIZE_COMP_LEVEL_01 <= UINT8_MAX); + BASISU_ASSUME(BASISU_SELECTOR_PARENT_CODEBOOK_SIZE_COMP_LEVEL_DEFAULT <= UINT8_MAX); + + m_block_parent_selector_cluster.resize(0); + m_block_parent_selector_cluster.resize(m_total_blocks); + vector_set_all(m_block_parent_selector_cluster, 0xFF); + + for (uint32_t parent_cluster_index = 0; parent_cluster_index < m_selector_parent_cluster_block_indices.size(); parent_cluster_index++) + { + const uint_vec &cluster = m_selector_parent_cluster_block_indices[parent_cluster_index]; + for (uint32_t j = 0; j < cluster.size(); j++) + m_block_parent_selector_cluster[cluster[j]] = static_cast(parent_cluster_index); + } + for (uint32_t i = 0; i < m_total_blocks; i++) + { + BASISU_FRONTEND_VERIFY(m_block_parent_selector_cluster[i] != 0xFF); + } + + // Ensure that all the blocks within each cluster are all in the same parent cluster, or something is very wrong. + for (uint32_t cluster_index = 0; cluster_index < m_selector_cluster_block_indices.size(); cluster_index++) + { + const uint_vec &cluster = m_selector_cluster_block_indices[cluster_index]; + + uint32_t parent_cluster_index = 0; + for (uint32_t j = 0; j < cluster.size(); j++) + { + const uint32_t block_index = cluster[j]; + if (!j) + { + parent_cluster_index = m_block_parent_selector_cluster[block_index]; + } + else + { + BASISU_FRONTEND_VERIFY(m_block_parent_selector_cluster[block_index] == parent_cluster_index); + } + } + } + } + + debug_printf("Total selector clusters: %u, total parent selector clusters: %u\n", (uint32_t)m_selector_cluster_block_indices.size(), (uint32_t)m_selector_parent_cluster_block_indices.size()); + } + + void basisu_frontend::create_optimized_selector_codebook(uint32_t iter) + { + debug_printf("create_optimized_selector_codebook\n"); + + interval_timer tm; + tm.start(); + + const uint32_t total_selector_clusters = (uint32_t)m_selector_cluster_block_indices.size(); + + debug_printf("Total selector clusters (from m_selector_cluster_block_indices.size()): %u\n", (uint32_t)m_selector_cluster_block_indices.size()); + + m_optimized_cluster_selectors.resize(total_selector_clusters); + + // For each selector codebook entry, and for each of the 4x4 selectors, determine which selector minimizes the error across all the blocks that use that quantized selector. + const uint32_t N = 256; + for (uint32_t cluster_index_iter = 0; cluster_index_iter < total_selector_clusters; cluster_index_iter += N) + { + const uint32_t first_index = cluster_index_iter; + const uint32_t last_index = minimum((uint32_t)total_selector_clusters, cluster_index_iter + N); + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job([this, first_index, last_index] { +#endif + + for (uint32_t cluster_index = first_index; cluster_index < last_index; cluster_index++) + { + const basisu::vector& cluster_block_indices = m_selector_cluster_block_indices[cluster_index]; + + if (!cluster_block_indices.size()) + continue; + + uint64_t total_err[4][4][4]; + clear_obj(total_err); + + for (uint32_t cluster_block_index = 0; cluster_block_index < cluster_block_indices.size(); cluster_block_index++) + { + const uint32_t block_index = cluster_block_indices[cluster_block_index]; + + const etc_block& blk = m_encoded_blocks[block_index]; + + color_rgba blk_colors[4]; + blk.get_block_colors(blk_colors, 0); + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const color_rgba& orig_color = get_source_pixel_block(block_index)(x, y); + + if (m_params.m_perceptual) + { + for (uint32_t s = 0; s < 4; s++) + total_err[y][x][s] += color_distance(true, blk_colors[s], orig_color, false); + } + else + { + for (uint32_t s = 0; s < 4; s++) + total_err[y][x][s] += color_distance(false, blk_colors[s], orig_color, false); + } + } // x + } // y + + } // cluster_block_index + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint64_t best_err = total_err[y][x][0]; + uint8_t best_sel = 0; + + for (uint32_t s = 1; s < 4; s++) + { + if (total_err[y][x][s] < best_err) + { + best_err = total_err[y][x][s]; + best_sel = (uint8_t)s; + } + } + + m_optimized_cluster_selectors[cluster_index].set_selector(x, y, best_sel); + } // x + } // y + + } // cluster_index + +#ifndef __EMSCRIPTEN__ + }); +#endif + + } // cluster_index_iter + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + + debug_printf("Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + + if (m_params.m_debug_images) + { + uint32_t max_selector_cluster_size = 0; + + for (uint32_t i = 0; i < m_selector_cluster_block_indices.size(); i++) + max_selector_cluster_size = maximum(max_selector_cluster_size, (uint32_t)m_selector_cluster_block_indices[i].size()); + + if ((max_selector_cluster_size * 5) < 32768) + { + const uint32_t x_spacer_len = 16; + image selector_cluster_vis(x_spacer_len + max_selector_cluster_size * 5, (uint32_t)m_selector_cluster_block_indices.size() * 5); + + for (uint32_t selector_cluster_index = 0; selector_cluster_index < m_selector_cluster_block_indices.size(); selector_cluster_index++) + { + const basisu::vector &cluster_block_indices = m_selector_cluster_block_indices[selector_cluster_index]; + + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + selector_cluster_vis.set_clipped(x_spacer_len + x - 12, selector_cluster_index * 5 + y, color_rgba((m_optimized_cluster_selectors[selector_cluster_index].get_selector(x, y) * 255) / 3)); + + for (uint32_t i = 0; i < cluster_block_indices.size(); i++) + { + uint32_t block_index = cluster_block_indices[i]; + + const etc_block &blk = m_orig_encoded_blocks[block_index]; + + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + selector_cluster_vis.set_clipped(x_spacer_len + x + 5 * i, selector_cluster_index * 5 + y, color_rgba((blk.get_selector(x, y) * 255) / 3)); + } + } + + char buf[256]; + snprintf(buf, sizeof(buf), "selector_cluster_vis_%u.png", iter); + save_png(buf, selector_cluster_vis); + } + } + } + + // For each block: Determine which quantized selectors best encode that block, given its quantized endpoints. + // Note that this method may leave some empty clusters (i.e. arrays with no block indices), including at the end. + void basisu_frontend::find_optimal_selector_clusters_for_each_block() + { + debug_printf("find_optimal_selector_clusters_for_each_block\n"); + + interval_timer tm; + tm.start(); + + if (m_params.m_validate) + { + // Sanity checks + BASISU_FRONTEND_VERIFY(m_selector_cluster_block_indices.size() == m_optimized_cluster_selectors.size()); + for (uint32_t i = 0; i < m_selector_clusters_within_each_parent_cluster.size(); i++) + { + for (uint32_t j = 0; j < m_selector_clusters_within_each_parent_cluster[i].size(); j++) + { + BASISU_FRONTEND_VERIFY(m_selector_clusters_within_each_parent_cluster[i][j] < m_optimized_cluster_selectors.size()); + } + } + } + + m_block_selector_cluster_index.resize(m_total_blocks); + + if (m_params.m_compression_level == 0) + { + // Just leave the blocks in their original selector clusters. + for (uint32_t selector_cluster_index = 0; selector_cluster_index < m_selector_cluster_block_indices.size(); selector_cluster_index++) + { + for (uint32_t j = 0; j < m_selector_cluster_block_indices[selector_cluster_index].size(); j++) + { + const uint32_t block_index = m_selector_cluster_block_indices[selector_cluster_index][j]; + + m_block_selector_cluster_index[block_index] = selector_cluster_index; + + etc_block& blk = m_encoded_blocks[block_index]; + blk.set_raw_selector_bits(m_optimized_cluster_selectors[selector_cluster_index].get_raw_selector_bits()); + } + } + + debug_printf("Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + + return; + } + + bool use_cpu = true; + + if ((m_params.m_pOpenCL_context) && m_use_hierarchical_selector_codebooks) + { + const uint32_t num_parent_clusters = m_selector_clusters_within_each_parent_cluster.size(); + + basisu::vector selector_structs; + selector_structs.reserve(m_optimized_cluster_selectors.size()); + + uint_vec parent_selector_cluster_offsets(num_parent_clusters); + + uint_vec selector_cluster_indices; + selector_cluster_indices.reserve(m_optimized_cluster_selectors.size()); + + uint32_t cur_ofs = 0; + for (uint32_t parent_index = 0; parent_index < num_parent_clusters; parent_index++) + { + parent_selector_cluster_offsets[parent_index] = cur_ofs; + + for (uint32_t j = 0; j < m_selector_clusters_within_each_parent_cluster[parent_index].size(); j++) + { + const uint32_t selector_cluster_index = m_selector_clusters_within_each_parent_cluster[parent_index][j]; + + uint32_t sel_bits = 0; + for (uint32_t p = 0; p < 16; p++) + sel_bits |= (m_optimized_cluster_selectors[selector_cluster_index].get_selector(p & 3, p >> 2) << (p * 2)); + + selector_structs.enlarge(1)->m_packed_selectors = sel_bits; + + selector_cluster_indices.push_back(selector_cluster_index); + } + + cur_ofs += m_selector_clusters_within_each_parent_cluster[parent_index].size(); + } + + const uint32_t total_input_selectors = cur_ofs; + + basisu::vector block_structs(m_total_blocks); + for (uint32_t i = 0; i < m_total_blocks; i++) + { + const uint32_t parent_selector_cluster = m_block_parent_selector_cluster[i]; + + const etc_block& blk = m_encoded_blocks[i]; + blk.unpack_color5(block_structs[i].m_etc_color5_inten, blk.get_base5_color(), false); + + block_structs[i].m_etc_color5_inten.a = (uint8_t)blk.get_inten_table(0); + block_structs[i].m_first_selector = parent_selector_cluster_offsets[parent_selector_cluster]; + block_structs[i].m_num_selectors = m_selector_clusters_within_each_parent_cluster[parent_selector_cluster].size(); + } + + uint_vec output_selector_cluster_indices(m_total_blocks); + + bool status = opencl_find_optimal_selector_clusters_for_each_block( + m_params.m_pOpenCL_context, + block_structs.data(), + total_input_selectors, + selector_structs.data(), + selector_cluster_indices.data(), + output_selector_cluster_indices.data(), + m_params.m_perceptual); + + if (!status) + { + error_printf("basisu_frontend::find_optimal_selector_clusters_for_each_block: opencl_find_optimal_selector_clusters_for_each_block() failed! Using CPU.\n"); + m_params.m_pOpenCL_context = nullptr; + m_opencl_failed = true; + } + else + { + for (uint32_t i = 0; i < m_selector_cluster_block_indices.size(); i++) + { + m_selector_cluster_block_indices[i].resize(0); + m_selector_cluster_block_indices[i].reserve(128); + } + + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + etc_block& blk = m_encoded_blocks[block_index]; + + uint32_t best_cluster_index = output_selector_cluster_indices[block_index]; + + blk.set_raw_selector_bits(m_optimized_cluster_selectors[best_cluster_index].get_raw_selector_bits()); + + m_block_selector_cluster_index[block_index] = best_cluster_index; + + vector_ensure_element_is_valid(m_selector_cluster_block_indices, best_cluster_index); + m_selector_cluster_block_indices[best_cluster_index].push_back(block_index); + } + + use_cpu = false; + } + } + + if (use_cpu) + { + basisu::vector unpacked_optimized_cluster_selectors(16 * m_optimized_cluster_selectors.size()); + for (uint32_t cluster_index = 0; cluster_index < m_optimized_cluster_selectors.size(); cluster_index++) + { + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + unpacked_optimized_cluster_selectors[cluster_index * 16 + y * 4 + x] = (uint8_t)m_optimized_cluster_selectors[cluster_index].get_selector(x, y); + } + } + } + + const uint32_t N = 2048; + for (uint32_t block_index_iter = 0; block_index_iter < m_total_blocks; block_index_iter += N) + { + const uint32_t first_index = block_index_iter; + const uint32_t last_index = minimum(m_total_blocks, first_index + N); + + #ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job( [this, first_index, last_index, &unpacked_optimized_cluster_selectors] { + #endif + + int prev_best_cluster_index = 0; + + for (uint32_t block_index = first_index; block_index < last_index; block_index++) + { + const pixel_block& block = get_source_pixel_block(block_index); + + etc_block& blk = m_encoded_blocks[block_index]; + + if ((block_index > first_index) && (block == get_source_pixel_block(block_index - 1))) + { + blk.set_raw_selector_bits(m_optimized_cluster_selectors[prev_best_cluster_index].get_raw_selector_bits()); + + m_block_selector_cluster_index[block_index] = prev_best_cluster_index; + + continue; + } + + const color_rgba* pBlock_pixels = block.get_ptr(); + + color_rgba trial_block_colors[4]; + blk.get_block_colors_etc1s(trial_block_colors); + + // precompute errors for the i-th block pixel and selector sel: [sel][i] + uint32_t trial_errors[4][16]; + + if (m_params.m_perceptual) + { + for (uint32_t sel = 0; sel < 4; ++sel) + for (uint32_t i = 0; i < 16; ++i) + trial_errors[sel][i] = color_distance(true, pBlock_pixels[i], trial_block_colors[sel], false); + } + else + { + for (uint32_t sel = 0; sel < 4; ++sel) + for (uint32_t i = 0; i < 16; ++i) + trial_errors[sel][i] = color_distance(false, pBlock_pixels[i], trial_block_colors[sel], false); + } + + // Compute the minimum possible errors (given any selectors) for pixels 0-15 + uint64_t min_possible_error_0_15 = 0; + for (uint32_t i = 0; i < 16; i++) + min_possible_error_0_15 += basisu::minimum(trial_errors[0][i], trial_errors[1][i], trial_errors[2][i], trial_errors[3][i]); + + // Compute the minimum possible errors (given any selectors) for pixels 4-15 + uint64_t min_possible_error_4_15 = 0; + for (uint32_t i = 4; i < 16; i++) + min_possible_error_4_15 += basisu::minimum(trial_errors[0][i], trial_errors[1][i], trial_errors[2][i], trial_errors[3][i]); + + // Compute the minimum possible errors (given any selectors) for pixels 8-15 + uint64_t min_possible_error_8_15 = 0; + for (uint32_t i = 8; i < 16; i++) + min_possible_error_8_15 += basisu::minimum(trial_errors[0][i], trial_errors[1][i], trial_errors[2][i], trial_errors[3][i]); + + // Compute the minimum possible errors (given any selectors) for pixels 12-15 + uint64_t min_possible_error_12_15 = 0; + for (uint32_t i = 12; i < 16; i++) + min_possible_error_12_15 += basisu::minimum(trial_errors[0][i], trial_errors[1][i], trial_errors[2][i], trial_errors[3][i]); + + uint64_t best_cluster_err = INT64_MAX; + uint32_t best_cluster_index = 0; + + const uint32_t parent_selector_cluster = m_block_parent_selector_cluster.size() ? m_block_parent_selector_cluster[block_index] : 0; + const uint_vec *pCluster_indices = m_selector_clusters_within_each_parent_cluster.size() ? &m_selector_clusters_within_each_parent_cluster[parent_selector_cluster] : nullptr; + + const uint32_t total_clusters = m_use_hierarchical_selector_codebooks ? (uint32_t)pCluster_indices->size() : (uint32_t)m_selector_cluster_block_indices.size(); + + #if 0 + for (uint32_t cluster_iter = 0; cluster_iter < total_clusters; cluster_iter++) + { + const uint32_t cluster_index = m_use_hierarchical_selector_codebooks ? (*pCluster_indices)[cluster_iter] : cluster_iter; + + const etc_block& cluster_blk = m_optimized_cluster_selectors[cluster_index]; + + uint64_t trial_err = 0; + for (int y = 0; y < 4; y++) + { + for (int x = 0; x < 4; x++) + { + const uint32_t sel = cluster_blk.get_selector(x, y); + + trial_err += color_distance(m_params.m_perceptual, trial_block_colors[sel], pBlock_pixels[x + y * 4], false); + if (trial_err > best_cluster_err) + goto early_out; + } + } + + if (trial_err < best_cluster_err) + { + best_cluster_err = trial_err; + best_cluster_index = cluster_index; + if (!best_cluster_err) + break; + } + + early_out: + ; + } + #else + for (uint32_t cluster_iter = 0; cluster_iter < total_clusters; cluster_iter++) + { + const uint32_t cluster_index = m_use_hierarchical_selector_codebooks ? (*pCluster_indices)[cluster_iter] : cluster_iter; + + const uint8_t* pSels = &unpacked_optimized_cluster_selectors[cluster_index * 16]; + + uint64_t trial_err = (uint64_t)trial_errors[pSels[0]][0] + trial_errors[pSels[1]][1] + trial_errors[pSels[2]][2] + trial_errors[pSels[3]][3]; + if ((trial_err + min_possible_error_4_15) >= best_cluster_err) + continue; + + trial_err += (uint64_t)trial_errors[pSels[4]][4] + trial_errors[pSels[5]][5] + trial_errors[pSels[6]][6] + trial_errors[pSels[7]][7]; + if ((trial_err + min_possible_error_8_15) >= best_cluster_err) + continue; + + trial_err += (uint64_t)trial_errors[pSels[8]][8] + trial_errors[pSels[9]][9] + trial_errors[pSels[10]][10] + trial_errors[pSels[11]][11]; + if ((trial_err + min_possible_error_12_15) >= best_cluster_err) + continue; + + trial_err += (uint64_t)trial_errors[pSels[12]][12] + trial_errors[pSels[13]][13] + trial_errors[pSels[14]][14] + trial_errors[pSels[15]][15]; + + if (trial_err < best_cluster_err) + { + best_cluster_err = trial_err; + best_cluster_index = cluster_index; + if (best_cluster_err == min_possible_error_0_15) + break; + } + + } // cluster_iter + #endif + + blk.set_raw_selector_bits(m_optimized_cluster_selectors[best_cluster_index].get_raw_selector_bits()); + + m_block_selector_cluster_index[block_index] = best_cluster_index; + + prev_best_cluster_index = best_cluster_index; + + } // block_index + + #ifndef __EMSCRIPTEN__ + } ); + #endif + + } // block_index_iter + + #ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); + #endif + + for (uint32_t i = 0; i < m_selector_cluster_block_indices.size(); i++) + { + m_selector_cluster_block_indices[i].resize(0); + m_selector_cluster_block_indices[i].reserve(128); + } + + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + const uint32_t best_cluster_index = m_block_selector_cluster_index[block_index]; + + vector_ensure_element_is_valid(m_selector_cluster_block_indices, best_cluster_index); + m_selector_cluster_block_indices[best_cluster_index].push_back(block_index); + } + + } // if (use_cpu) + + debug_printf("Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + } + + // TODO: Remove old ETC1 specific stuff, and thread this. + uint32_t basisu_frontend::refine_block_endpoints_given_selectors() + { + debug_printf("refine_block_endpoints_given_selectors\n"); + + for (int block_index = 0; block_index < static_cast(m_total_blocks); block_index++) + { + //uint32_t selector_cluster = m_block_selector_cluster_index(block_x, block_y); + vec2U &endpoint_clusters = m_block_endpoint_clusters_indices[block_index]; + + m_endpoint_cluster_etc_params[endpoint_clusters[0]].m_subblocks.push_back(block_index * 2); + + m_endpoint_cluster_etc_params[endpoint_clusters[1]].m_subblocks.push_back(block_index * 2 + 1); + } + + uint32_t total_subblocks_refined = 0; + uint32_t total_subblocks_examined = 0; + + for (uint32_t endpoint_cluster_index = 0; endpoint_cluster_index < m_endpoint_cluster_etc_params.size(); endpoint_cluster_index++) + { + endpoint_cluster_etc_params &subblock_params = m_endpoint_cluster_etc_params[endpoint_cluster_index]; + + const uint_vec &subblocks = subblock_params.m_subblocks; + //uint32_t total_pixels = subblock.m_subblocks.size() * 8; + + basisu::vector subblock_colors[2]; // [use_individual_mode] + uint8_vec subblock_selectors[2]; + + uint64_t cur_subblock_err[2] = { 0, 0 }; + + for (uint32_t subblock_iter = 0; subblock_iter < subblocks.size(); subblock_iter++) + { + uint32_t training_vector_index = subblocks[subblock_iter]; + + uint32_t block_index = training_vector_index >> 1; + uint32_t subblock_index = training_vector_index & 1; + const bool is_flipped = true; + + const etc_block &blk = m_encoded_blocks[block_index]; + + const bool use_individual_mode = !blk.get_diff_bit(); + + const color_rgba *pSource_block_pixels = get_source_pixel_block(block_index).get_ptr(); + + color_rgba unpacked_block_pixels[16]; + unpack_etc1(blk, unpacked_block_pixels); + + for (uint32_t i = 0; i < 8; i++) + { + const uint32_t pixel_index = g_etc1_pixel_indices[is_flipped][subblock_index][i]; + const etc_coord2 &coords = g_etc1_pixel_coords[is_flipped][subblock_index][i]; + + subblock_colors[use_individual_mode].push_back(pSource_block_pixels[pixel_index]); + + cur_subblock_err[use_individual_mode] += color_distance(m_params.m_perceptual, pSource_block_pixels[pixel_index], unpacked_block_pixels[pixel_index], false); + + subblock_selectors[use_individual_mode].push_back(static_cast(blk.get_selector(coords.m_x, coords.m_y))); + } + } // subblock_iter + + etc1_optimizer::results cluster_optimizer_results[2]; + bool results_valid[2] = { false, false }; + + clear_obj(cluster_optimizer_results); + + basisu::vector cluster_selectors[2]; + + for (uint32_t use_individual_mode = 0; use_individual_mode < 2; use_individual_mode++) + { + const uint32_t total_pixels = (uint32_t)subblock_colors[use_individual_mode].size(); + + if (!total_pixels) + continue; + + total_subblocks_examined += total_pixels / 8; + + etc1_optimizer optimizer; + etc1_solution_coordinates solutions[2]; + + etc1_optimizer::params cluster_optimizer_params; + cluster_optimizer_params.m_num_src_pixels = total_pixels; + cluster_optimizer_params.m_pSrc_pixels = &subblock_colors[use_individual_mode][0]; + + cluster_optimizer_params.m_use_color4 = use_individual_mode != 0; + cluster_optimizer_params.m_perceptual = m_params.m_perceptual; + + cluster_optimizer_params.m_pForce_selectors = &subblock_selectors[use_individual_mode][0]; + cluster_optimizer_params.m_quality = cETCQualityUber; + + cluster_selectors[use_individual_mode].resize(total_pixels); + + cluster_optimizer_results[use_individual_mode].m_n = total_pixels; + cluster_optimizer_results[use_individual_mode].m_pSelectors = &cluster_selectors[use_individual_mode][0]; + + optimizer.init(cluster_optimizer_params, cluster_optimizer_results[use_individual_mode]); + + if (!optimizer.compute()) + continue; + + if (cluster_optimizer_results[use_individual_mode].m_error < cur_subblock_err[use_individual_mode]) + results_valid[use_individual_mode] = true; + + } // use_individual_mode + + for (uint32_t use_individual_mode = 0; use_individual_mode < 2; use_individual_mode++) + { + if (!results_valid[use_individual_mode]) + continue; + + uint32_t num_passes = use_individual_mode ? 1 : 2; + + bool all_passed5 = true; + + for (uint32_t pass = 0; pass < num_passes; pass++) + { + for (uint32_t subblock_iter = 0; subblock_iter < subblocks.size(); subblock_iter++) + { + const uint32_t training_vector_index = subblocks[subblock_iter]; + + const uint32_t block_index = training_vector_index >> 1; + const uint32_t subblock_index = training_vector_index & 1; + //const bool is_flipped = true; + + etc_block &blk = m_encoded_blocks[block_index]; + + if (!blk.get_diff_bit() != static_cast(use_individual_mode != 0)) + continue; + + if (use_individual_mode) + { + blk.set_base4_color(subblock_index, etc_block::pack_color4(cluster_optimizer_results[1].m_block_color_unscaled, false)); + blk.set_inten_table(subblock_index, cluster_optimizer_results[1].m_block_inten_table); + + subblock_params.m_color_error[1] = cluster_optimizer_results[1].m_error; + subblock_params.m_inten_table[1] = cluster_optimizer_results[1].m_block_inten_table; + subblock_params.m_color_unscaled[1] = cluster_optimizer_results[1].m_block_color_unscaled; + + total_subblocks_refined++; + } + else + { + const uint16_t base_color5 = blk.get_base5_color(); + const uint16_t delta_color3 = blk.get_delta3_color(); + + uint32_t r[2], g[2], b[2]; + etc_block::unpack_color5(r[0], g[0], b[0], base_color5, false); + bool success = etc_block::unpack_color5(r[1], g[1], b[1], base_color5, delta_color3, false); + assert(success); + BASISU_NOTE_UNUSED(success); + + r[subblock_index] = cluster_optimizer_results[0].m_block_color_unscaled.r; + g[subblock_index] = cluster_optimizer_results[0].m_block_color_unscaled.g; + b[subblock_index] = cluster_optimizer_results[0].m_block_color_unscaled.b; + + color_rgba colors[2] = { color_rgba(r[0], g[0], b[0], 255), color_rgba(r[1], g[1], b[1], 255) }; + + if (!etc_block::try_pack_color5_delta3(colors)) + { + all_passed5 = false; + break; + } + + if ((pass == 1) && (all_passed5)) + { + blk.set_block_color5(colors[0], colors[1]); + blk.set_inten_table(subblock_index, cluster_optimizer_results[0].m_block_inten_table); + + subblock_params.m_color_error[0] = cluster_optimizer_results[0].m_error; + subblock_params.m_inten_table[0] = cluster_optimizer_results[0].m_block_inten_table; + subblock_params.m_color_unscaled[0] = cluster_optimizer_results[0].m_block_color_unscaled; + + total_subblocks_refined++; + } + } + + } // subblock_iter + + } // pass + + } // use_individual_mode + + } // endpoint_cluster_index + + if (m_params.m_debug_stats) + debug_printf("Total subblock endpoints refined: %u (%3.1f%%)\n", total_subblocks_refined, total_subblocks_refined * 100.0f / total_subblocks_examined); + + return total_subblocks_refined; + } + + void basisu_frontend::dump_endpoint_clusterization_visualization(const char *pFilename, bool vis_endpoint_colors) + { + debug_printf("dump_endpoint_clusterization_visualization\n"); + + uint32_t max_endpoint_cluster_size = 0; + + basisu::vector cluster_sizes(m_endpoint_clusters.size()); + basisu::vector sorted_cluster_indices(m_endpoint_clusters.size()); + for (uint32_t i = 0; i < m_endpoint_clusters.size(); i++) + { + max_endpoint_cluster_size = maximum(max_endpoint_cluster_size, (uint32_t)m_endpoint_clusters[i].size()); + cluster_sizes[i] = (uint32_t)m_endpoint_clusters[i].size(); + } + + if (!max_endpoint_cluster_size) + return; + + for (uint32_t i = 0; i < m_endpoint_clusters.size(); i++) + sorted_cluster_indices[i] = i; + + //indexed_heap_sort(endpoint_clusters.size(), cluster_sizes.get_ptr(), sorted_cluster_indices.get_ptr()); + + image endpoint_cluster_vis(12 + minimum(max_endpoint_cluster_size, 2048) * 5, (uint32_t)m_endpoint_clusters.size() * 3); + + for (uint32_t unsorted_cluster_iter = 0; unsorted_cluster_iter < m_endpoint_clusters.size(); unsorted_cluster_iter++) + { + const uint32_t cluster_iter = sorted_cluster_indices[unsorted_cluster_iter]; + + etc_block blk; + blk.clear(); + blk.set_flip_bit(false); + blk.set_diff_bit(true); + blk.set_inten_tables_etc1s(m_endpoint_cluster_etc_params[cluster_iter].m_inten_table[0]); + blk.set_base5_color(etc_block::pack_color5(m_endpoint_cluster_etc_params[cluster_iter].m_color_unscaled[0], false)); + + color_rgba blk_colors[4]; + blk.get_block_colors(blk_colors, 0); + for (uint32_t i = 0; i < 4; i++) + endpoint_cluster_vis.fill_box(i * 2, 3 * unsorted_cluster_iter, 2, 2, blk_colors[i]); + + for (uint32_t subblock_iter = 0; subblock_iter < m_endpoint_clusters[cluster_iter].size(); subblock_iter++) + { + uint32_t training_vector_index = m_endpoint_clusters[cluster_iter][subblock_iter]; + + const uint32_t block_index = training_vector_index >> 1; + const uint32_t subblock_index = training_vector_index & 1; + + const etc_block& blk2 = m_etc1_blocks_etc1s[block_index]; + + const color_rgba *pBlock_pixels = get_source_pixel_block(block_index).get_ptr(); + + color_rgba subblock_pixels[8]; + + if (vis_endpoint_colors) + { + color_rgba colors[2]; + blk2.get_block_low_high_colors(colors, subblock_index); + for (uint32_t i = 0; i < 8; i++) + subblock_pixels[i] = colors[subblock_index]; + } + else + { + for (uint32_t i = 0; i < 8; i++) + subblock_pixels[i] = pBlock_pixels[g_etc1_pixel_indices[blk2.get_flip_bit()][subblock_index][i]]; + } + + endpoint_cluster_vis.set_block_clipped(subblock_pixels, 12 + 5 * subblock_iter, 3 * unsorted_cluster_iter, 4, 2); + } + } + + save_png(pFilename, endpoint_cluster_vis); + debug_printf("Wrote debug visualization file %s\n", pFilename); + } + + void basisu_frontend::finalize() + { + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { + for (uint32_t subblock_index = 0; subblock_index < 2; subblock_index++) + { + const uint32_t endpoint_cluster_index = get_subblock_endpoint_cluster_index(block_index, subblock_index); + + m_endpoint_cluster_etc_params[endpoint_cluster_index].m_color_used[0] = true; + } + } + } + + // The backend has remapped the block endpoints while optimizing the output symbols for better rate distortion performance, so let's go and reoptimize the endpoint codebook. + // This is currently the only place where the backend actually goes and changes the quantization and calls the frontend to fix things up. + // This is basically a bottom up clusterization stage, where some leaves can be combined. + void basisu_frontend::reoptimize_remapped_endpoints(const uint_vec &new_block_endpoints, int_vec &old_to_new_endpoint_cluster_indices, bool optimize_final_codebook, uint_vec *pBlock_selector_indices) + { + debug_printf("reoptimize_remapped_endpoints\n"); + + basisu::vector new_endpoint_cluster_block_indices(m_endpoint_clusters.size()); + for (uint32_t i = 0; i < new_block_endpoints.size(); i++) + new_endpoint_cluster_block_indices[new_block_endpoints[i]].push_back(i); + + basisu::vector cluster_valid(new_endpoint_cluster_block_indices.size()); + basisu::vector cluster_improved(new_endpoint_cluster_block_indices.size()); + + const uint32_t N = 256; + for (uint32_t cluster_index_iter = 0; cluster_index_iter < new_endpoint_cluster_block_indices.size(); cluster_index_iter += N) + { + const uint32_t first_index = cluster_index_iter; + const uint32_t last_index = minimum((uint32_t)new_endpoint_cluster_block_indices.size(), cluster_index_iter + N); + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->add_job( [this, first_index, last_index, &cluster_improved, &cluster_valid, &new_endpoint_cluster_block_indices, &pBlock_selector_indices ] { +#endif + + for (uint32_t cluster_index = first_index; cluster_index < last_index; cluster_index++) + { + const basisu::vector& cluster_block_indices = new_endpoint_cluster_block_indices[cluster_index]; + + if (!cluster_block_indices.size()) + continue; + + const uint32_t total_pixels = (uint32_t)cluster_block_indices.size() * 16; + + basisu::vector cluster_pixels(total_pixels); + uint8_vec force_selectors(total_pixels); + + etc_block blk; + blk.set_block_color5_etc1s(get_endpoint_cluster_unscaled_color(cluster_index, false)); + blk.set_inten_tables_etc1s(get_endpoint_cluster_inten_table(cluster_index, false)); + blk.set_flip_bit(true); + + uint64_t cur_err = 0; + + for (uint32_t cluster_block_indices_iter = 0; cluster_block_indices_iter < cluster_block_indices.size(); cluster_block_indices_iter++) + { + const uint32_t block_index = cluster_block_indices[cluster_block_indices_iter]; + + const color_rgba *pBlock_pixels = get_source_pixel_block(block_index).get_ptr(); + + memcpy(&cluster_pixels[cluster_block_indices_iter * 16], pBlock_pixels, 16 * sizeof(color_rgba)); + + const uint32_t selector_cluster_index = pBlock_selector_indices ? (*pBlock_selector_indices)[block_index] : get_block_selector_cluster_index(block_index); + + const etc_block &blk_selectors = get_selector_cluster_selector_bits(selector_cluster_index); + + blk.set_raw_selector_bits(blk_selectors.get_raw_selector_bits()); + + cur_err += blk.evaluate_etc1_error(pBlock_pixels, m_params.m_perceptual); + + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + force_selectors[cluster_block_indices_iter * 16 + x + y * 4] = static_cast(blk_selectors.get_selector(x, y)); + } + + endpoint_cluster_etc_params new_endpoint_cluster_etc_params; + + { + etc1_optimizer optimizer; + etc1_solution_coordinates solutions[2]; + + etc1_optimizer::params cluster_optimizer_params; + cluster_optimizer_params.m_num_src_pixels = total_pixels; + cluster_optimizer_params.m_pSrc_pixels = &cluster_pixels[0]; + + cluster_optimizer_params.m_use_color4 = false; + cluster_optimizer_params.m_perceptual = m_params.m_perceptual; + cluster_optimizer_params.m_pForce_selectors = &force_selectors[0]; + + if (m_params.m_compression_level == BASISU_MAX_COMPRESSION_LEVEL) + cluster_optimizer_params.m_quality = cETCQualityUber; + else + cluster_optimizer_params.m_quality = cETCQualitySlow; + + etc1_optimizer::results cluster_optimizer_results; + + basisu::vector cluster_selectors(total_pixels); + cluster_optimizer_results.m_n = total_pixels; + cluster_optimizer_results.m_pSelectors = &cluster_selectors[0]; + + optimizer.init(cluster_optimizer_params, cluster_optimizer_results); + + if (!optimizer.compute()) + BASISU_FRONTEND_VERIFY(false); + + new_endpoint_cluster_etc_params.m_color_unscaled[0] = cluster_optimizer_results.m_block_color_unscaled; + new_endpoint_cluster_etc_params.m_inten_table[0] = cluster_optimizer_results.m_block_inten_table; + new_endpoint_cluster_etc_params.m_color_error[0] = cluster_optimizer_results.m_error; + new_endpoint_cluster_etc_params.m_color_used[0] = true; + new_endpoint_cluster_etc_params.m_valid = true; + } + + if (new_endpoint_cluster_etc_params.m_color_error[0] < cur_err) + { + m_endpoint_cluster_etc_params[cluster_index] = new_endpoint_cluster_etc_params; + + cluster_improved[cluster_index] = true; + } + + cluster_valid[cluster_index] = true; + + } // cluster_index + +#ifndef __EMSCRIPTEN__ + } ); +#endif + + } // cluster_index_iter + +#ifndef __EMSCRIPTEN__ + m_params.m_pJob_pool->wait_for_all(); +#endif + + uint32_t total_unused_clusters = 0; + uint32_t total_improved_clusters = 0; + + old_to_new_endpoint_cluster_indices.resize(m_endpoint_clusters.size()); + vector_set_all(old_to_new_endpoint_cluster_indices, -1); + + int total_new_endpoint_clusters = 0; + + for (uint32_t old_cluster_index = 0; old_cluster_index < m_endpoint_clusters.size(); old_cluster_index++) + { + if (!cluster_valid[old_cluster_index]) + total_unused_clusters++; + else + old_to_new_endpoint_cluster_indices[old_cluster_index] = total_new_endpoint_clusters++; + + if (cluster_improved[old_cluster_index]) + total_improved_clusters++; + } + + debug_printf("Total unused clusters: %u\n", total_unused_clusters); + debug_printf("Total improved_clusters: %u\n", total_improved_clusters); + debug_printf("Total endpoint clusters: %u\n", total_new_endpoint_clusters); + + if (optimize_final_codebook) + { + cluster_subblock_etc_params_vec new_endpoint_cluster_etc_params(total_new_endpoint_clusters); + + for (uint32_t old_cluster_index = 0; old_cluster_index < m_endpoint_clusters.size(); old_cluster_index++) + { + if (old_to_new_endpoint_cluster_indices[old_cluster_index] >= 0) + new_endpoint_cluster_etc_params[old_to_new_endpoint_cluster_indices[old_cluster_index]] = m_endpoint_cluster_etc_params[old_cluster_index]; + } + + debug_printf("basisu_frontend::reoptimize_remapped_endpoints: stage 1\n"); + + basisu::vector new_endpoint_clusters(total_new_endpoint_clusters); + + for (uint32_t block_index = 0; block_index < new_block_endpoints.size(); block_index++) + { + const uint32_t old_endpoint_cluster_index = new_block_endpoints[block_index]; + + const int new_endpoint_cluster_index = old_to_new_endpoint_cluster_indices[old_endpoint_cluster_index]; + BASISU_FRONTEND_VERIFY(new_endpoint_cluster_index >= 0); + + BASISU_FRONTEND_VERIFY(new_endpoint_cluster_index < (int)new_endpoint_clusters.size()); + + new_endpoint_clusters[new_endpoint_cluster_index].push_back(block_index * 2 + 0); + new_endpoint_clusters[new_endpoint_cluster_index].push_back(block_index * 2 + 1); + + BASISU_FRONTEND_VERIFY(new_endpoint_cluster_index < (int)new_endpoint_cluster_etc_params.size()); + + new_endpoint_cluster_etc_params[new_endpoint_cluster_index].m_subblocks.push_back(block_index * 2 + 0); + new_endpoint_cluster_etc_params[new_endpoint_cluster_index].m_subblocks.push_back(block_index * 2 + 1); + + m_block_endpoint_clusters_indices[block_index][0] = new_endpoint_cluster_index; + m_block_endpoint_clusters_indices[block_index][1] = new_endpoint_cluster_index; + } + + debug_printf("basisu_frontend::reoptimize_remapped_endpoints: stage 2\n"); + + m_endpoint_clusters = new_endpoint_clusters; + m_endpoint_cluster_etc_params = new_endpoint_cluster_etc_params; + + eliminate_redundant_or_empty_endpoint_clusters(); + + debug_printf("basisu_frontend::reoptimize_remapped_endpoints: stage 3\n"); + + for (uint32_t new_cluster_index = 0; new_cluster_index < m_endpoint_clusters.size(); new_cluster_index++) + { + for (uint32_t cluster_block_iter = 0; cluster_block_iter < m_endpoint_clusters[new_cluster_index].size(); cluster_block_iter++) + { + const uint32_t subblock_index = m_endpoint_clusters[new_cluster_index][cluster_block_iter]; + const uint32_t block_index = subblock_index >> 1; + + m_block_endpoint_clusters_indices[block_index][0] = new_cluster_index; + m_block_endpoint_clusters_indices[block_index][1] = new_cluster_index; + + const uint32_t old_cluster_index = new_block_endpoints[block_index]; + + old_to_new_endpoint_cluster_indices[old_cluster_index] = new_cluster_index; + } + } + + debug_printf("basisu_frontend::reoptimize_remapped_endpoints: stage 4\n"); + + for (uint32_t block_index = 0; block_index < m_encoded_blocks.size(); block_index++) + { + const uint32_t endpoint_cluster_index = get_subblock_endpoint_cluster_index(block_index, 0); + + m_encoded_blocks[block_index].set_block_color5_etc1s(get_endpoint_cluster_unscaled_color(endpoint_cluster_index, false)); + m_encoded_blocks[block_index].set_inten_tables_etc1s(get_endpoint_cluster_inten_table(endpoint_cluster_index, false)); + } + + debug_printf("Final (post-RDO) endpoint clusters: %u\n", m_endpoint_clusters.size()); + } + + //debug_printf("validate_output: %u\n", validate_output()); + } + + // Endpoint clusterization hierarchy integrity checker. + // Note this doesn't check for empty clusters. + bool basisu_frontend::validate_endpoint_cluster_hierarchy(bool ensure_clusters_have_same_parents) const + { + if (!m_endpoint_parent_clusters.size()) + return true; + + int_vec subblock_parent_indices(m_total_blocks * 2); + subblock_parent_indices.set_all(-1); + + int_vec subblock_cluster_indices(m_total_blocks * 2); + subblock_cluster_indices.set_all(-1); + + for (uint32_t parent_index = 0; parent_index < m_endpoint_parent_clusters.size(); parent_index++) + { + for (uint32_t i = 0; i < m_endpoint_parent_clusters[parent_index].size(); i++) + { + uint32_t subblock_index = m_endpoint_parent_clusters[parent_index][i]; + if (subblock_index >= m_total_blocks * 2) + return false; + + // If the endpoint cluster lives in more than one parent node, that's wrong. + if (subblock_parent_indices[subblock_index] != -1) + return false; + + subblock_parent_indices[subblock_index] = parent_index; + } + } + + // Make sure all endpoint clusters are present in the parent cluster. + for (uint32_t i = 0; i < subblock_parent_indices.size(); i++) + { + if (subblock_parent_indices[i] == -1) + return false; + } + + for (uint32_t cluster_index = 0; cluster_index < m_endpoint_clusters.size(); cluster_index++) + { + int parent_index = 0; + + for (uint32_t i = 0; i < m_endpoint_clusters[cluster_index].size(); i++) + { + uint32_t subblock_index = m_endpoint_clusters[cluster_index][i]; + if (subblock_index >= m_total_blocks * 2) + return false; + + if (subblock_cluster_indices[subblock_index] != -1) + return false; + + subblock_cluster_indices[subblock_index] = cluster_index; + + // There are transformations on the endpoint clusters that can break the strict tree requirement + if (ensure_clusters_have_same_parents) + { + // Make sure all the subblocks are in the same parent cluster + if (!i) + parent_index = subblock_parent_indices[subblock_index]; + else if (subblock_parent_indices[subblock_index] != parent_index) + return false; + } + } + } + + // Make sure all endpoint clusters are present in the parent cluster. + for (uint32_t i = 0; i < subblock_cluster_indices.size(); i++) + { + if (subblock_cluster_indices[i] == -1) + return false; + } + + return true; + } + + // This is very slow and only intended for debugging/development. It's enabled using the "-validate_etc1s" command line option. + bool basisu_frontend::validate_output() const + { + debug_printf("validate_output\n"); + + if (!check_etc1s_constraints()) + return false; + + for (uint32_t block_index = 0; block_index < m_total_blocks; block_index++) + { +//#define CHECK(x) do { if (!(x)) { DebugBreak(); return false; } } while(0) +#define CHECK(x) BASISU_FRONTEND_VERIFY(x); + + CHECK(get_output_block(block_index).get_flip_bit() == true); + + const bool diff_flag = get_diff_flag(block_index); + CHECK(diff_flag == true); + + etc_block blk; + memset(&blk, 0, sizeof(blk)); + blk.set_flip_bit(true); + blk.set_diff_bit(true); + + const uint32_t endpoint_cluster0_index = get_subblock_endpoint_cluster_index(block_index, 0); + const uint32_t endpoint_cluster1_index = get_subblock_endpoint_cluster_index(block_index, 1); + + // basisu only supports ETC1S, so these must be equal. + CHECK(endpoint_cluster0_index == endpoint_cluster1_index); + + CHECK(blk.set_block_color5_check(get_endpoint_cluster_unscaled_color(endpoint_cluster0_index, false), get_endpoint_cluster_unscaled_color(endpoint_cluster1_index, false))); + + CHECK(get_endpoint_cluster_color_is_used(endpoint_cluster0_index, false)); + + blk.set_inten_table(0, get_endpoint_cluster_inten_table(endpoint_cluster0_index, false)); + blk.set_inten_table(1, get_endpoint_cluster_inten_table(endpoint_cluster1_index, false)); + + const uint32_t selector_cluster_index = get_block_selector_cluster_index(block_index); + CHECK(selector_cluster_index < get_total_selector_clusters()); + + CHECK(vector_find(get_selector_cluster_block_indices(selector_cluster_index), block_index) != -1); + + blk.set_raw_selector_bits(get_selector_cluster_selector_bits(selector_cluster_index).get_raw_selector_bits()); + + const etc_block &rdo_output_block = get_output_block(block_index); + + CHECK(rdo_output_block.get_flip_bit() == blk.get_flip_bit()); + CHECK(rdo_output_block.get_diff_bit() == blk.get_diff_bit()); + CHECK(rdo_output_block.get_inten_table(0) == blk.get_inten_table(0)); + CHECK(rdo_output_block.get_inten_table(1) == blk.get_inten_table(1)); + CHECK(rdo_output_block.get_base5_color() == blk.get_base5_color()); + CHECK(rdo_output_block.get_delta3_color() == blk.get_delta3_color()); + CHECK(rdo_output_block.get_raw_selector_bits() == blk.get_raw_selector_bits()); + +#undef CHECK + } + + return true; + } + + void basisu_frontend::dump_debug_image(const char *pFilename, uint32_t first_block, uint32_t num_blocks_x, uint32_t num_blocks_y, bool output_blocks) + { + gpu_image g; + g.init(texture_format::cETC1, num_blocks_x * 4, num_blocks_y * 4); + + for (uint32_t y = 0; y < num_blocks_y; y++) + { + for (uint32_t x = 0; x < num_blocks_x; x++) + { + const uint32_t block_index = first_block + x + y * num_blocks_x; + + etc_block &blk = *(etc_block *)g.get_block_ptr(x, y); + + if (output_blocks) + blk = get_output_block(block_index); + else + { + const bool diff_flag = get_diff_flag(block_index); + + blk.set_diff_bit(diff_flag); + blk.set_flip_bit(true); + + const uint32_t endpoint_cluster0_index = get_subblock_endpoint_cluster_index(block_index, 0); + const uint32_t endpoint_cluster1_index = get_subblock_endpoint_cluster_index(block_index, 1); + + if (diff_flag) + blk.set_block_color5(get_endpoint_cluster_unscaled_color(endpoint_cluster0_index, false), get_endpoint_cluster_unscaled_color(endpoint_cluster1_index, false)); + else + blk.set_block_color4(get_endpoint_cluster_unscaled_color(endpoint_cluster0_index, true), get_endpoint_cluster_unscaled_color(endpoint_cluster1_index, true)); + + blk.set_inten_table(0, get_endpoint_cluster_inten_table(endpoint_cluster0_index, !diff_flag)); + blk.set_inten_table(1, get_endpoint_cluster_inten_table(endpoint_cluster1_index, !diff_flag)); + + const uint32_t selector_cluster_index = get_block_selector_cluster_index(block_index); + blk.set_raw_selector_bits(get_selector_cluster_selector_bits(selector_cluster_index).get_raw_selector_bits()); + } + } + } + + image img; + g.unpack(img); + + save_png(pFilename, img); + } + +} // namespace basisu + diff --git a/ktx/external/basisu/encoder/basisu_frontend.h b/ktx/external/basisu/encoder/basisu_frontend.h new file mode 100644 index 0000000..cda73f3 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_frontend.h @@ -0,0 +1,353 @@ +// basisu_frontend.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once +#include "basisu_enc.h" +#include "basisu_etc.h" +#include "basisu_gpu_texture.h" +#include "../transcoder/basisu_file_headers.h" +#include "../transcoder/basisu_transcoder.h" + +namespace basisu +{ + struct opencl_context; + typedef opencl_context* opencl_context_ptr; + + struct vec2U + { + uint32_t m_comps[2]; + + vec2U() { } + vec2U(uint32_t a, uint32_t b) { set(a, b); } + + void set(uint32_t a, uint32_t b) { m_comps[0] = a; m_comps[1] = b; } + + uint32_t operator[] (uint32_t i) const { assert(i < 2); return m_comps[i]; } + uint32_t &operator[] (uint32_t i) { assert(i < 2); return m_comps[i]; } + }; + + const uint32_t BASISU_DEFAULT_COMPRESSION_LEVEL = 2; + const uint32_t BASISU_MAX_COMPRESSION_LEVEL = 6; + + class basisu_frontend + { + BASISU_NO_EQUALS_OR_COPY_CONSTRUCT(basisu_frontend); + + public: + + basisu_frontend() : + m_total_blocks(0), + m_total_pixels(0), + m_endpoint_refinement(false), + m_use_hierarchical_endpoint_codebooks(false), + m_use_hierarchical_selector_codebooks(false), + m_num_endpoint_codebook_iterations(0), + m_num_selector_codebook_iterations(0), + m_opencl_failed(false) + { + } + + enum + { + cMaxEndpointClusters = 16128, + + cMaxSelectorClusters = 16128, + }; + + struct params + { + params() : + m_num_source_blocks(0), + m_pSource_blocks(NULL), + m_max_endpoint_clusters(256), + m_max_selector_clusters(256), + m_compression_level(BASISU_DEFAULT_COMPRESSION_LEVEL), + m_perceptual(true), + m_debug_stats(false), + m_debug_images(false), + m_dump_endpoint_clusterization(true), + m_validate(false), + m_multithreaded(false), + m_disable_hierarchical_endpoint_codebooks(false), + m_tex_type(basist::cBASISTexType2D), + m_pOpenCL_context(nullptr), + m_pJob_pool(nullptr) + { + } + + uint32_t m_num_source_blocks; + pixel_block *m_pSource_blocks; + + uint32_t m_max_endpoint_clusters; + uint32_t m_max_selector_clusters; + + uint32_t m_compression_level; + + bool m_perceptual; + bool m_debug_stats; + bool m_debug_images; + bool m_dump_endpoint_clusterization; + bool m_validate; + bool m_multithreaded; + bool m_disable_hierarchical_endpoint_codebooks; + + basist::basis_texture_type m_tex_type; + const basist::basisu_lowlevel_etc1s_transcoder *m_pGlobal_codebooks; + + opencl_context_ptr m_pOpenCL_context; + + job_pool *m_pJob_pool; + }; + + bool init(const params &p); + + bool compress(); + + const params &get_params() const { return m_params; } + + const pixel_block &get_source_pixel_block(uint32_t i) const { return m_source_blocks[i]; } + + // RDO output blocks + uint32_t get_total_output_blocks() const { return static_cast(m_encoded_blocks.size()); } + + const etc_block &get_output_block(uint32_t block_index) const { return m_encoded_blocks[block_index]; } + const etc_block_vec &get_output_blocks() const { return m_encoded_blocks; } + + // "Best" ETC1S blocks + const etc_block &get_etc1s_block(uint32_t block_index) const { return m_etc1_blocks_etc1s[block_index]; } + + // Per-block flags + bool get_diff_flag(uint32_t block_index) const { return m_encoded_blocks[block_index].get_diff_bit(); } + + // Endpoint clusters + uint32_t get_total_endpoint_clusters() const { return static_cast(m_endpoint_clusters.size()); } + uint32_t get_subblock_endpoint_cluster_index(uint32_t block_index, uint32_t subblock_index) const { return m_block_endpoint_clusters_indices[block_index][subblock_index]; } + + const color_rgba &get_endpoint_cluster_unscaled_color(uint32_t cluster_index, bool individual_mode) const { return m_endpoint_cluster_etc_params[cluster_index].m_color_unscaled[individual_mode]; } + uint32_t get_endpoint_cluster_inten_table(uint32_t cluster_index, bool individual_mode) const { return m_endpoint_cluster_etc_params[cluster_index].m_inten_table[individual_mode]; } + + bool get_endpoint_cluster_color_is_used(uint32_t cluster_index, bool individual_mode) const { return m_endpoint_cluster_etc_params[cluster_index].m_color_used[individual_mode]; } + + // Selector clusters + uint32_t get_total_selector_clusters() const { return static_cast(m_selector_cluster_block_indices.size()); } + uint32_t get_block_selector_cluster_index(uint32_t block_index) const { return m_block_selector_cluster_index[block_index]; } + const etc_block &get_selector_cluster_selector_bits(uint32_t cluster_index) const { return m_optimized_cluster_selectors[cluster_index]; } + + // Returns block indices using each selector cluster + const uint_vec &get_selector_cluster_block_indices(uint32_t selector_cluster_index) const { return m_selector_cluster_block_indices[selector_cluster_index]; } + + void dump_debug_image(const char *pFilename, uint32_t first_block, uint32_t num_blocks_x, uint32_t num_blocks_y, bool output_blocks); + + void reoptimize_remapped_endpoints(const uint_vec &new_block_endpoints, int_vec &old_to_new_endpoint_cluster_indices, bool optimize_final_codebook, uint_vec *pBlock_selector_indices = nullptr); + + bool get_opencl_failed() const { return m_opencl_failed; } + + private: + params m_params; + uint32_t m_total_blocks; + uint32_t m_total_pixels; + + bool m_endpoint_refinement; + bool m_use_hierarchical_endpoint_codebooks; + bool m_use_hierarchical_selector_codebooks; + + uint32_t m_num_endpoint_codebook_iterations; + uint32_t m_num_selector_codebook_iterations; + + // Source pixels for each blocks + pixel_block_vec m_source_blocks; + + // The quantized ETC1S texture. + etc_block_vec m_encoded_blocks; + + // Quantized blocks after endpoint quant, but before selector quant + etc_block_vec m_orig_encoded_blocks; + + // Full quality ETC1S texture + etc_block_vec m_etc1_blocks_etc1s; + + typedef vec<6, float> vec6F; + + // Endpoint clusterizer + typedef tree_vector_quant vec6F_quantizer; + vec6F_quantizer m_endpoint_clusterizer; + + // For each endpoint cluster: An array of which subblock indices (block_index*2+subblock) are located in that cluster. + basisu::vector m_endpoint_clusters; + + // Array of subblock indices for each parent endpoint cluster + // Note: Initially, each endpoint cluster will only live in a single parent cluster, in a shallow tree. + // As the endpoint clusters are manipulated this constraint gets broken. + basisu::vector m_endpoint_parent_clusters; + + // Each block's parent endpoint cluster index + uint8_vec m_block_parent_endpoint_cluster; + + // Array of endpoint cluster indices for each parent endpoint cluster + basisu::vector m_endpoint_clusters_within_each_parent_cluster; + + struct endpoint_cluster_etc_params + { + endpoint_cluster_etc_params() + { + clear(); + } + + void clear() + { + clear_obj(m_color_unscaled); + clear_obj(m_inten_table); + clear_obj(m_color_error); + m_subblocks.clear(); + + clear_obj(m_color_used); + m_valid = false; + } + + // TODO: basisu doesn't use individual mode. + color_rgba m_color_unscaled[2]; // [use_individual_mode] + uint32_t m_inten_table[2]; + + uint64_t m_color_error[2]; + + uint_vec m_subblocks; + + bool m_color_used[2]; + + bool m_valid; + + bool operator== (const endpoint_cluster_etc_params &other) const + { + for (uint32_t i = 0; i < 2; i++) + { + if (m_color_unscaled[i] != other.m_color_unscaled[i]) + return false; + } + + if (m_inten_table[0] != other.m_inten_table[0]) + return false; + if (m_inten_table[1] != other.m_inten_table[1]) + return false; + + return true; + } + + bool operator< (const endpoint_cluster_etc_params &other) const + { + for (uint32_t i = 0; i < 2; i++) + { + if (m_color_unscaled[i] < other.m_color_unscaled[i]) + return true; + else if (m_color_unscaled[i] != other.m_color_unscaled[i]) + return false; + } + + if (m_inten_table[0] < other.m_inten_table[0]) + return true; + else if (m_inten_table[0] == other.m_inten_table[0]) + { + if (m_inten_table[1] < other.m_inten_table[1]) + return true; + } + + return false; + } + }; + + typedef basisu::vector cluster_subblock_etc_params_vec; + + // Each endpoint cluster's ETC1S parameters + cluster_subblock_etc_params_vec m_endpoint_cluster_etc_params; + + // The endpoint cluster index used by each ETC1 subblock. + basisu::vector m_block_endpoint_clusters_indices; + + // The block(s) within each selector cluster + // Note: If you add anything here that uses selector cluster indicies, be sure to update optimize_selector_codebook()! + basisu::vector m_selector_cluster_block_indices; + + // The selector bits for each selector cluster. + basisu::vector m_optimized_cluster_selectors; + + // The block(s) within each parent selector cluster. + basisu::vector m_selector_parent_cluster_block_indices; + + // Each block's parent selector cluster + uint8_vec m_block_parent_selector_cluster; + + // Array of selector cluster indices for each parent selector cluster + basisu::vector m_selector_clusters_within_each_parent_cluster; + + // Each block's selector cluster index + basisu::vector m_block_selector_cluster_index; + + struct subblock_endpoint_quant_err + { + uint64_t m_total_err; + uint32_t m_cluster_index; + uint32_t m_cluster_subblock_index; + uint32_t m_block_index; + uint32_t m_subblock_index; + + bool operator< (const subblock_endpoint_quant_err &rhs) const + { + if (m_total_err < rhs.m_total_err) + return true; + else if (m_total_err == rhs.m_total_err) + { + if (m_block_index < rhs.m_block_index) + return true; + else if (m_block_index == rhs.m_block_index) + return m_subblock_index < rhs.m_subblock_index; + } + return false; + } + }; + + // The sorted subblock endpoint quant error for each endpoint cluster + basisu::vector m_subblock_endpoint_quant_err_vec; + + std::mutex m_lock; + + bool m_opencl_failed; + + //----------------------------------------------------------------------------- + + void init_etc1_images(); + bool init_global_codebooks(); + void init_endpoint_training_vectors(); + void dump_endpoint_clusterization_visualization(const char *pFilename, bool vis_endpoint_colors); + void generate_endpoint_clusters(); + void compute_endpoint_subblock_error_vec(); + void introduce_new_endpoint_clusters(); + void generate_endpoint_codebook(uint32_t step); + uint32_t refine_endpoint_clusterization(); + void eliminate_redundant_or_empty_endpoint_clusters(); + void generate_block_endpoint_clusters(); + void compute_endpoint_clusters_within_each_parent_cluster(); + void compute_selector_clusters_within_each_parent_cluster(); + void create_initial_packed_texture(); + void generate_selector_clusters(); + void create_optimized_selector_codebook(uint32_t iter); + void find_optimal_selector_clusters_for_each_block(); + uint32_t refine_block_endpoints_given_selectors(); + void finalize(); + bool validate_endpoint_cluster_hierarchy(bool ensure_clusters_have_same_parents) const; + bool validate_output() const; + void introduce_special_selector_clusters(); + void optimize_selector_codebook(); + bool check_etc1s_constraints() const; + }; + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_gpu_texture.cpp b/ktx/external/basisu/encoder/basisu_gpu_texture.cpp new file mode 100644 index 0000000..56c5884 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_gpu_texture.cpp @@ -0,0 +1,1626 @@ +// basisu_gpu_texture.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_gpu_texture.h" +#include "basisu_enc.h" +#include "basisu_pvrtc1_4.h" +#if BASISU_USE_ASTC_DECOMPRESS +#include "basisu_astc_decomp.h" +#endif +#include "basisu_bc7enc.h" + +namespace basisu +{ + void unpack_etc2_eac(const void *pBlock_bits, color_rgba *pPixels) + { + static_assert(sizeof(eac_a8_block) == 8, "sizeof(eac_a8_block) == 8"); + + const eac_a8_block *pBlock = static_cast(pBlock_bits); + + const int8_t *pTable = g_etc2_eac_tables[pBlock->m_table]; + + const uint64_t selector_bits = pBlock->get_selector_bits(); + + const int32_t base = pBlock->m_base; + const int32_t mul = pBlock->m_multiplier; + + pPixels[0].a = clamp255(base + pTable[pBlock->get_selector(0, 0, selector_bits)] * mul); + pPixels[1].a = clamp255(base + pTable[pBlock->get_selector(1, 0, selector_bits)] * mul); + pPixels[2].a = clamp255(base + pTable[pBlock->get_selector(2, 0, selector_bits)] * mul); + pPixels[3].a = clamp255(base + pTable[pBlock->get_selector(3, 0, selector_bits)] * mul); + + pPixels[4].a = clamp255(base + pTable[pBlock->get_selector(0, 1, selector_bits)] * mul); + pPixels[5].a = clamp255(base + pTable[pBlock->get_selector(1, 1, selector_bits)] * mul); + pPixels[6].a = clamp255(base + pTable[pBlock->get_selector(2, 1, selector_bits)] * mul); + pPixels[7].a = clamp255(base + pTable[pBlock->get_selector(3, 1, selector_bits)] * mul); + + pPixels[8].a = clamp255(base + pTable[pBlock->get_selector(0, 2, selector_bits)] * mul); + pPixels[9].a = clamp255(base + pTable[pBlock->get_selector(1, 2, selector_bits)] * mul); + pPixels[10].a = clamp255(base + pTable[pBlock->get_selector(2, 2, selector_bits)] * mul); + pPixels[11].a = clamp255(base + pTable[pBlock->get_selector(3, 2, selector_bits)] * mul); + + pPixels[12].a = clamp255(base + pTable[pBlock->get_selector(0, 3, selector_bits)] * mul); + pPixels[13].a = clamp255(base + pTable[pBlock->get_selector(1, 3, selector_bits)] * mul); + pPixels[14].a = clamp255(base + pTable[pBlock->get_selector(2, 3, selector_bits)] * mul); + pPixels[15].a = clamp255(base + pTable[pBlock->get_selector(3, 3, selector_bits)] * mul); + } + + struct bc1_block + { + enum { cTotalEndpointBytes = 2, cTotalSelectorBytes = 4 }; + + uint8_t m_low_color[cTotalEndpointBytes]; + uint8_t m_high_color[cTotalEndpointBytes]; + uint8_t m_selectors[cTotalSelectorBytes]; + + inline uint32_t get_high_color() const { return m_high_color[0] | (m_high_color[1] << 8U); } + inline uint32_t get_low_color() const { return m_low_color[0] | (m_low_color[1] << 8U); } + + static void unpack_color(uint32_t c, uint32_t &r, uint32_t &g, uint32_t &b) + { + r = (c >> 11) & 31; + g = (c >> 5) & 63; + b = c & 31; + + r = (r << 3) | (r >> 2); + g = (g << 2) | (g >> 4); + b = (b << 3) | (b >> 2); + } + + inline uint32_t get_selector(uint32_t x, uint32_t y) const { assert((x < 4U) && (y < 4U)); return (m_selectors[y] >> (x * 2)) & 3; } + }; + + // Returns true if the block uses 3 color punchthrough alpha mode. + bool unpack_bc1(const void *pBlock_bits, color_rgba *pPixels, bool set_alpha) + { + static_assert(sizeof(bc1_block) == 8, "sizeof(bc1_block) == 8"); + + const bc1_block *pBlock = static_cast(pBlock_bits); + + const uint32_t l = pBlock->get_low_color(); + const uint32_t h = pBlock->get_high_color(); + + color_rgba c[4]; + + uint32_t r0, g0, b0, r1, g1, b1; + bc1_block::unpack_color(l, r0, g0, b0); + bc1_block::unpack_color(h, r1, g1, b1); + + c[0].set_noclamp_rgba(r0, g0, b0, 255); + c[1].set_noclamp_rgba(r1, g1, b1, 255); + + bool used_punchthrough = false; + + if (l > h) + { + c[2].set_noclamp_rgba((r0 * 2 + r1) / 3, (g0 * 2 + g1) / 3, (b0 * 2 + b1) / 3, 255); + c[3].set_noclamp_rgba((r1 * 2 + r0) / 3, (g1 * 2 + g0) / 3, (b1 * 2 + b0) / 3, 255); + } + else + { + c[2].set_noclamp_rgba((r0 + r1) / 2, (g0 + g1) / 2, (b0 + b1) / 2, 255); + c[3].set_noclamp_rgba(0, 0, 0, 0); + used_punchthrough = true; + } + + if (set_alpha) + { + for (uint32_t y = 0; y < 4; y++, pPixels += 4) + { + pPixels[0] = c[pBlock->get_selector(0, y)]; + pPixels[1] = c[pBlock->get_selector(1, y)]; + pPixels[2] = c[pBlock->get_selector(2, y)]; + pPixels[3] = c[pBlock->get_selector(3, y)]; + } + } + else + { + for (uint32_t y = 0; y < 4; y++, pPixels += 4) + { + pPixels[0].set_rgb(c[pBlock->get_selector(0, y)]); + pPixels[1].set_rgb(c[pBlock->get_selector(1, y)]); + pPixels[2].set_rgb(c[pBlock->get_selector(2, y)]); + pPixels[3].set_rgb(c[pBlock->get_selector(3, y)]); + } + } + + return used_punchthrough; + } + + bool unpack_bc1_nv(const void *pBlock_bits, color_rgba *pPixels, bool set_alpha) + { + static_assert(sizeof(bc1_block) == 8, "sizeof(bc1_block) == 8"); + + const bc1_block *pBlock = static_cast(pBlock_bits); + + const uint32_t l = pBlock->get_low_color(); + const uint32_t h = pBlock->get_high_color(); + + color_rgba c[4]; + + int r0 = (l >> 11) & 31; + int g0 = (l >> 5) & 63; + int b0 = l & 31; + int r1 = (h >> 11) & 31; + int g1 = (h >> 5) & 63; + int b1 = h & 31; + + c[0].b = (uint8_t)((3 * b0 * 22) / 8); + c[0].g = (uint8_t)((g0 << 2) | (g0 >> 4)); + c[0].r = (uint8_t)((3 * r0 * 22) / 8); + c[0].a = 0xFF; + + c[1].r = (uint8_t)((3 * r1 * 22) / 8); + c[1].g = (uint8_t)((g1 << 2) | (g1 >> 4)); + c[1].b = (uint8_t)((3 * b1 * 22) / 8); + c[1].a = 0xFF; + + int gdiff = c[1].g - c[0].g; + + bool used_punchthrough = false; + + if (l > h) + { + c[2].r = (uint8_t)(((2 * r0 + r1) * 22) / 8); + c[2].g = (uint8_t)(((256 * c[0].g + gdiff/4 + 128 + gdiff * 80) / 256)); + c[2].b = (uint8_t)(((2 * b0 + b1) * 22) / 8); + c[2].a = 0xFF; + + c[3].r = (uint8_t)(((2 * r1 + r0) * 22) / 8); + c[3].g = (uint8_t)((256 * c[1].g - gdiff/4 + 128 - gdiff * 80) / 256); + c[3].b = (uint8_t)(((2 * b1 + b0) * 22) / 8); + c[3].a = 0xFF; + } + else + { + c[2].r = (uint8_t)(((r0 + r1) * 33) / 8); + c[2].g = (uint8_t)((256 * c[0].g + gdiff/4 + 128 + gdiff * 128) / 256); + c[2].b = (uint8_t)(((b0 + b1) * 33) / 8); + c[2].a = 0xFF; + + c[3].set_noclamp_rgba(0, 0, 0, 0); + used_punchthrough = true; + } + + if (set_alpha) + { + for (uint32_t y = 0; y < 4; y++, pPixels += 4) + { + pPixels[0] = c[pBlock->get_selector(0, y)]; + pPixels[1] = c[pBlock->get_selector(1, y)]; + pPixels[2] = c[pBlock->get_selector(2, y)]; + pPixels[3] = c[pBlock->get_selector(3, y)]; + } + } + else + { + for (uint32_t y = 0; y < 4; y++, pPixels += 4) + { + pPixels[0].set_rgb(c[pBlock->get_selector(0, y)]); + pPixels[1].set_rgb(c[pBlock->get_selector(1, y)]); + pPixels[2].set_rgb(c[pBlock->get_selector(2, y)]); + pPixels[3].set_rgb(c[pBlock->get_selector(3, y)]); + } + } + + return used_punchthrough; + } + + static inline int interp_5_6_amd(int c0, int c1) { assert(c0 < 256 && c1 < 256); return (c0 * 43 + c1 * 21 + 32) >> 6; } + static inline int interp_half_5_6_amd(int c0, int c1) { assert(c0 < 256 && c1 < 256); return (c0 + c1 + 1) >> 1; } + + bool unpack_bc1_amd(const void *pBlock_bits, color_rgba *pPixels, bool set_alpha) + { + const bc1_block *pBlock = static_cast(pBlock_bits); + + const uint32_t l = pBlock->get_low_color(); + const uint32_t h = pBlock->get_high_color(); + + color_rgba c[4]; + + uint32_t r0, g0, b0, r1, g1, b1; + bc1_block::unpack_color(l, r0, g0, b0); + bc1_block::unpack_color(h, r1, g1, b1); + + c[0].set_noclamp_rgba(r0, g0, b0, 255); + c[1].set_noclamp_rgba(r1, g1, b1, 255); + + bool used_punchthrough = false; + + if (l > h) + { + c[2].set_noclamp_rgba(interp_5_6_amd(r0, r1), interp_5_6_amd(g0, g1), interp_5_6_amd(b0, b1), 255); + c[3].set_noclamp_rgba(interp_5_6_amd(r1, r0), interp_5_6_amd(g1, g0), interp_5_6_amd(b1, b0), 255); + } + else + { + c[2].set_noclamp_rgba(interp_half_5_6_amd(r0, r1), interp_half_5_6_amd(g0, g1), interp_half_5_6_amd(b0, b1), 255); + c[3].set_noclamp_rgba(0, 0, 0, 0); + used_punchthrough = true; + } + + if (set_alpha) + { + for (uint32_t y = 0; y < 4; y++, pPixels += 4) + { + pPixels[0] = c[pBlock->get_selector(0, y)]; + pPixels[1] = c[pBlock->get_selector(1, y)]; + pPixels[2] = c[pBlock->get_selector(2, y)]; + pPixels[3] = c[pBlock->get_selector(3, y)]; + } + } + else + { + for (uint32_t y = 0; y < 4; y++, pPixels += 4) + { + pPixels[0].set_rgb(c[pBlock->get_selector(0, y)]); + pPixels[1].set_rgb(c[pBlock->get_selector(1, y)]); + pPixels[2].set_rgb(c[pBlock->get_selector(2, y)]); + pPixels[3].set_rgb(c[pBlock->get_selector(3, y)]); + } + } + + return used_punchthrough; + } + + struct bc4_block + { + enum { cBC4SelectorBits = 3, cTotalSelectorBytes = 6, cMaxSelectorValues = 8 }; + uint8_t m_endpoints[2]; + + uint8_t m_selectors[cTotalSelectorBytes]; + + inline uint32_t get_low_alpha() const { return m_endpoints[0]; } + inline uint32_t get_high_alpha() const { return m_endpoints[1]; } + inline bool is_alpha6_block() const { return get_low_alpha() <= get_high_alpha(); } + + inline uint64_t get_selector_bits() const + { + return ((uint64_t)((uint32_t)m_selectors[0] | ((uint32_t)m_selectors[1] << 8U) | ((uint32_t)m_selectors[2] << 16U) | ((uint32_t)m_selectors[3] << 24U))) | + (((uint64_t)m_selectors[4]) << 32U) | + (((uint64_t)m_selectors[5]) << 40U); + } + + inline uint32_t get_selector(uint32_t x, uint32_t y, uint64_t selector_bits) const + { + assert((x < 4U) && (y < 4U)); + return (selector_bits >> (((y * 4) + x) * cBC4SelectorBits)) & (cMaxSelectorValues - 1); + } + + static inline uint32_t get_block_values6(uint8_t *pDst, uint32_t l, uint32_t h) + { + pDst[0] = static_cast(l); + pDst[1] = static_cast(h); + pDst[2] = static_cast((l * 4 + h) / 5); + pDst[3] = static_cast((l * 3 + h * 2) / 5); + pDst[4] = static_cast((l * 2 + h * 3) / 5); + pDst[5] = static_cast((l + h * 4) / 5); + pDst[6] = 0; + pDst[7] = 255; + return 6; + } + + static inline uint32_t get_block_values8(uint8_t *pDst, uint32_t l, uint32_t h) + { + pDst[0] = static_cast(l); + pDst[1] = static_cast(h); + pDst[2] = static_cast((l * 6 + h) / 7); + pDst[3] = static_cast((l * 5 + h * 2) / 7); + pDst[4] = static_cast((l * 4 + h * 3) / 7); + pDst[5] = static_cast((l * 3 + h * 4) / 7); + pDst[6] = static_cast((l * 2 + h * 5) / 7); + pDst[7] = static_cast((l + h * 6) / 7); + return 8; + } + + static inline uint32_t get_block_values(uint8_t *pDst, uint32_t l, uint32_t h) + { + if (l > h) + return get_block_values8(pDst, l, h); + else + return get_block_values6(pDst, l, h); + } + }; + + void unpack_bc4(const void *pBlock_bits, uint8_t *pPixels, uint32_t stride) + { + static_assert(sizeof(bc4_block) == 8, "sizeof(bc4_block) == 8"); + + const bc4_block *pBlock = static_cast(pBlock_bits); + + uint8_t sel_values[8]; + bc4_block::get_block_values(sel_values, pBlock->get_low_alpha(), pBlock->get_high_alpha()); + + const uint64_t selector_bits = pBlock->get_selector_bits(); + + for (uint32_t y = 0; y < 4; y++, pPixels += (stride * 4U)) + { + pPixels[0] = sel_values[pBlock->get_selector(0, y, selector_bits)]; + pPixels[stride * 1] = sel_values[pBlock->get_selector(1, y, selector_bits)]; + pPixels[stride * 2] = sel_values[pBlock->get_selector(2, y, selector_bits)]; + pPixels[stride * 3] = sel_values[pBlock->get_selector(3, y, selector_bits)]; + } + } + + // Returns false if the block uses 3-color punchthrough alpha mode, which isn't supported on some GPU's for BC3. + bool unpack_bc3(const void *pBlock_bits, color_rgba *pPixels) + { + bool success = true; + + if (unpack_bc1((const uint8_t *)pBlock_bits + sizeof(bc4_block), pPixels, true)) + success = false; + + unpack_bc4(pBlock_bits, &pPixels[0].a, sizeof(color_rgba)); + + return success; + } + + // writes RG + void unpack_bc5(const void *pBlock_bits, color_rgba *pPixels) + { + unpack_bc4(pBlock_bits, &pPixels[0].r, sizeof(color_rgba)); + unpack_bc4((const uint8_t *)pBlock_bits + sizeof(bc4_block), &pPixels[0].g, sizeof(color_rgba)); + } + + // ATC isn't officially documented, so I'm assuming these references: + // http://www.guildsoftware.com/papers/2012.Converting.DXTC.to.ATC.pdf + // https://github.com/Triang3l/S3TConv/blob/master/s3tconv_atitc.c + // The paper incorrectly says the ATC lerp factors are 1/3 and 2/3, but they are actually 3/8 and 5/8. + void unpack_atc(const void* pBlock_bits, color_rgba* pPixels) + { + const uint8_t* pBytes = static_cast(pBlock_bits); + + const uint16_t color0 = pBytes[0] | (pBytes[1] << 8U); + const uint16_t color1 = pBytes[2] | (pBytes[3] << 8U); + uint32_t sels = pBytes[4] | (pBytes[5] << 8U) | (pBytes[6] << 16U) | (pBytes[7] << 24U); + + const bool mode = (color0 & 0x8000) != 0; + + color_rgba c[4]; + + c[0].set((color0 >> 10) & 31, (color0 >> 5) & 31, color0 & 31, 255); + c[0].r = (c[0].r << 3) | (c[0].r >> 2); + c[0].g = (c[0].g << 3) | (c[0].g >> 2); + c[0].b = (c[0].b << 3) | (c[0].b >> 2); + + c[3].set((color1 >> 11) & 31, (color1 >> 5) & 63, color1 & 31, 255); + c[3].r = (c[3].r << 3) | (c[3].r >> 2); + c[3].g = (c[3].g << 2) | (c[3].g >> 4); + c[3].b = (c[3].b << 3) | (c[3].b >> 2); + + if (mode) + { + c[1].set(basisu::maximum(0, c[0].r - (c[3].r >> 2)), basisu::maximum(0, c[0].g - (c[3].g >> 2)), basisu::maximum(0, c[0].b - (c[3].b >> 2)), 255); + c[2] = c[0]; + c[0].set(0, 0, 0, 255); + } + else + { + c[1].r = (c[0].r * 5 + c[3].r * 3) >> 3; + c[1].g = (c[0].g * 5 + c[3].g * 3) >> 3; + c[1].b = (c[0].b * 5 + c[3].b * 3) >> 3; + + c[2].r = (c[0].r * 3 + c[3].r * 5) >> 3; + c[2].g = (c[0].g * 3 + c[3].g * 5) >> 3; + c[2].b = (c[0].b * 3 + c[3].b * 5) >> 3; + } + + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t s = sels & 3; + + pPixels[i] = c[s]; + + sels >>= 2; + } + } + + // BC7 mode 0-7 decompression. + // Instead of one monster routine to unpack all the BC7 modes, we're lumping the 3 subset, 2 subset, 1 subset, and dual plane modes together into simple shared routines. + + static inline uint32_t bc7_dequant(uint32_t val, uint32_t pbit, uint32_t val_bits) { assert(val < (1U << val_bits)); assert(pbit < 2); assert(val_bits >= 4 && val_bits <= 8); const uint32_t total_bits = val_bits + 1; val = (val << 1) | pbit; val <<= (8 - total_bits); val |= (val >> total_bits); assert(val <= 255); return val; } + static inline uint32_t bc7_dequant(uint32_t val, uint32_t val_bits) { assert(val < (1U << val_bits)); assert(val_bits >= 4 && val_bits <= 8); val <<= (8 - val_bits); val |= (val >> val_bits); assert(val <= 255); return val; } + + static inline uint32_t bc7_interp2(uint32_t l, uint32_t h, uint32_t w) { assert(w < 4); return (l * (64 - basist::g_bc7_weights2[w]) + h * basist::g_bc7_weights2[w] + 32) >> 6; } + static inline uint32_t bc7_interp3(uint32_t l, uint32_t h, uint32_t w) { assert(w < 8); return (l * (64 - basist::g_bc7_weights3[w]) + h * basist::g_bc7_weights3[w] + 32) >> 6; } + static inline uint32_t bc7_interp4(uint32_t l, uint32_t h, uint32_t w) { assert(w < 16); return (l * (64 - basist::g_bc7_weights4[w]) + h * basist::g_bc7_weights4[w] + 32) >> 6; } + static inline uint32_t bc7_interp(uint32_t l, uint32_t h, uint32_t w, uint32_t bits) + { + assert(l <= 255 && h <= 255); + switch (bits) + { + case 2: return bc7_interp2(l, h, w); + case 3: return bc7_interp3(l, h, w); + case 4: return bc7_interp4(l, h, w); + default: + break; + } + return 0; + } + + bool unpack_bc7_mode0_2(uint32_t mode, const void* pBlock_bits, color_rgba* pPixels) + { + //const uint32_t SUBSETS = 3; + const uint32_t ENDPOINTS = 6; + const uint32_t COMPS = 3; + const uint32_t WEIGHT_BITS = (mode == 0) ? 3 : 2; + const uint32_t ENDPOINT_BITS = (mode == 0) ? 4 : 5; + const uint32_t PBITS = (mode == 0) ? 6 : 0; + const uint32_t WEIGHT_VALS = 1 << WEIGHT_BITS; + + uint32_t bit_offset = 0; + const uint8_t* pBuf = static_cast(pBlock_bits); + + if (read_bits32(pBuf, bit_offset, mode + 1) != (1U << mode)) return false; + + const uint32_t part = read_bits32(pBuf, bit_offset, (mode == 0) ? 4 : 6); + + color_rgba endpoints[ENDPOINTS]; + for (uint32_t c = 0; c < COMPS; c++) + for (uint32_t e = 0; e < ENDPOINTS; e++) + endpoints[e][c] = (uint8_t)read_bits32(pBuf, bit_offset, ENDPOINT_BITS); + + uint32_t pbits[6]; + for (uint32_t p = 0; p < PBITS; p++) + pbits[p] = read_bits32(pBuf, bit_offset, 1); + + uint32_t weights[16]; + for (uint32_t i = 0; i < 16; i++) + weights[i] = read_bits32(pBuf, bit_offset, ((!i) || (i == basist::g_bc7_table_anchor_index_third_subset_1[part]) || (i == basist::g_bc7_table_anchor_index_third_subset_2[part])) ? (WEIGHT_BITS - 1) : WEIGHT_BITS); + + assert(bit_offset == 128); + + for (uint32_t e = 0; e < ENDPOINTS; e++) + for (uint32_t c = 0; c < 4; c++) + endpoints[e][c] = (uint8_t)((c == 3) ? 255 : (PBITS ? bc7_dequant(endpoints[e][c], pbits[e], ENDPOINT_BITS) : bc7_dequant(endpoints[e][c], ENDPOINT_BITS))); + + color_rgba block_colors[3][8]; + for (uint32_t s = 0; s < 3; s++) + for (uint32_t i = 0; i < WEIGHT_VALS; i++) + { + for (uint32_t c = 0; c < 3; c++) + block_colors[s][i][c] = (uint8_t)bc7_interp(endpoints[s * 2 + 0][c], endpoints[s * 2 + 1][c], i, WEIGHT_BITS); + block_colors[s][i][3] = 255; + } + + for (uint32_t i = 0; i < 16; i++) + pPixels[i] = block_colors[basist::g_bc7_partition3[part * 16 + i]][weights[i]]; + + return true; + } + + bool unpack_bc7_mode1_3_7(uint32_t mode, const void* pBlock_bits, color_rgba* pPixels) + { + //const uint32_t SUBSETS = 2; + const uint32_t ENDPOINTS = 4; + const uint32_t COMPS = (mode == 7) ? 4 : 3; + const uint32_t WEIGHT_BITS = (mode == 1) ? 3 : 2; + const uint32_t ENDPOINT_BITS = (mode == 7) ? 5 : ((mode == 1) ? 6 : 7); + const uint32_t PBITS = (mode == 1) ? 2 : 4; + const uint32_t SHARED_PBITS = (mode == 1) ? true : false; + const uint32_t WEIGHT_VALS = 1 << WEIGHT_BITS; + + uint32_t bit_offset = 0; + const uint8_t* pBuf = static_cast(pBlock_bits); + + if (read_bits32(pBuf, bit_offset, mode + 1) != (1U << mode)) return false; + + const uint32_t part = read_bits32(pBuf, bit_offset, 6); + + color_rgba endpoints[ENDPOINTS]; + for (uint32_t c = 0; c < COMPS; c++) + for (uint32_t e = 0; e < ENDPOINTS; e++) + endpoints[e][c] = (uint8_t)read_bits32(pBuf, bit_offset, ENDPOINT_BITS); + + uint32_t pbits[4]; + for (uint32_t p = 0; p < PBITS; p++) + pbits[p] = read_bits32(pBuf, bit_offset, 1); + + uint32_t weights[16]; + for (uint32_t i = 0; i < 16; i++) + weights[i] = read_bits32(pBuf, bit_offset, ((!i) || (i == basist::g_bc7_table_anchor_index_second_subset[part])) ? (WEIGHT_BITS - 1) : WEIGHT_BITS); + + assert(bit_offset == 128); + + for (uint32_t e = 0; e < ENDPOINTS; e++) + for (uint32_t c = 0; c < 4; c++) + endpoints[e][c] = (uint8_t)((c == ((mode == 7U) ? 4U : 3U)) ? 255 : bc7_dequant(endpoints[e][c], pbits[SHARED_PBITS ? (e >> 1) : e], ENDPOINT_BITS)); + + color_rgba block_colors[2][8]; + for (uint32_t s = 0; s < 2; s++) + for (uint32_t i = 0; i < WEIGHT_VALS; i++) + { + for (uint32_t c = 0; c < COMPS; c++) + block_colors[s][i][c] = (uint8_t)bc7_interp(endpoints[s * 2 + 0][c], endpoints[s * 2 + 1][c], i, WEIGHT_BITS); + block_colors[s][i][3] = (COMPS == 3) ? 255 : block_colors[s][i][3]; + } + + for (uint32_t i = 0; i < 16; i++) + pPixels[i] = block_colors[basist::g_bc7_partition2[part * 16 + i]][weights[i]]; + + return true; + } + + bool unpack_bc7_mode4_5(uint32_t mode, const void* pBlock_bits, color_rgba* pPixels) + { + const uint32_t ENDPOINTS = 2; + const uint32_t COMPS = 4; + const uint32_t WEIGHT_BITS = 2; + const uint32_t A_WEIGHT_BITS = (mode == 4) ? 3 : 2; + const uint32_t ENDPOINT_BITS = (mode == 4) ? 5 : 7; + const uint32_t A_ENDPOINT_BITS = (mode == 4) ? 6 : 8; + //const uint32_t WEIGHT_VALS = 1 << WEIGHT_BITS; + //const uint32_t A_WEIGHT_VALS = 1 << A_WEIGHT_BITS; + + uint32_t bit_offset = 0; + const uint8_t* pBuf = static_cast(pBlock_bits); + + if (read_bits32(pBuf, bit_offset, mode + 1) != (1U << mode)) return false; + + const uint32_t comp_rot = read_bits32(pBuf, bit_offset, 2); + const uint32_t index_mode = (mode == 4) ? read_bits32(pBuf, bit_offset, 1) : 0; + + color_rgba endpoints[ENDPOINTS]; + for (uint32_t c = 0; c < COMPS; c++) + for (uint32_t e = 0; e < ENDPOINTS; e++) + endpoints[e][c] = (uint8_t)read_bits32(pBuf, bit_offset, (c == 3) ? A_ENDPOINT_BITS : ENDPOINT_BITS); + + const uint32_t weight_bits[2] = { index_mode ? A_WEIGHT_BITS : WEIGHT_BITS, index_mode ? WEIGHT_BITS : A_WEIGHT_BITS }; + + uint32_t weights[16], a_weights[16]; + + for (uint32_t i = 0; i < 16; i++) + (index_mode ? a_weights : weights)[i] = read_bits32(pBuf, bit_offset, weight_bits[index_mode] - ((!i) ? 1 : 0)); + + for (uint32_t i = 0; i < 16; i++) + (index_mode ? weights : a_weights)[i] = read_bits32(pBuf, bit_offset, weight_bits[1 - index_mode] - ((!i) ? 1 : 0)); + + assert(bit_offset == 128); + + for (uint32_t e = 0; e < ENDPOINTS; e++) + for (uint32_t c = 0; c < 4; c++) + endpoints[e][c] = (uint8_t)bc7_dequant(endpoints[e][c], (c == 3) ? A_ENDPOINT_BITS : ENDPOINT_BITS); + + color_rgba block_colors[8]; + for (uint32_t i = 0; i < (1U << weight_bits[0]); i++) + for (uint32_t c = 0; c < 3; c++) + block_colors[i][c] = (uint8_t)bc7_interp(endpoints[0][c], endpoints[1][c], i, weight_bits[0]); + + for (uint32_t i = 0; i < (1U << weight_bits[1]); i++) + block_colors[i][3] = (uint8_t)bc7_interp(endpoints[0][3], endpoints[1][3], i, weight_bits[1]); + + for (uint32_t i = 0; i < 16; i++) + { + pPixels[i] = block_colors[weights[i]]; + pPixels[i].a = block_colors[a_weights[i]].a; + if (comp_rot >= 1) + std::swap(pPixels[i].a, pPixels[i].m_comps[comp_rot - 1]); + } + + return true; + } + + struct bc7_mode_6 + { + struct + { + uint64_t m_mode : 7; + uint64_t m_r0 : 7; + uint64_t m_r1 : 7; + uint64_t m_g0 : 7; + uint64_t m_g1 : 7; + uint64_t m_b0 : 7; + uint64_t m_b1 : 7; + uint64_t m_a0 : 7; + uint64_t m_a1 : 7; + uint64_t m_p0 : 1; + } m_lo; + + union + { + struct + { + uint64_t m_p1 : 1; + uint64_t m_s00 : 3; + uint64_t m_s10 : 4; + uint64_t m_s20 : 4; + uint64_t m_s30 : 4; + + uint64_t m_s01 : 4; + uint64_t m_s11 : 4; + uint64_t m_s21 : 4; + uint64_t m_s31 : 4; + + uint64_t m_s02 : 4; + uint64_t m_s12 : 4; + uint64_t m_s22 : 4; + uint64_t m_s32 : 4; + + uint64_t m_s03 : 4; + uint64_t m_s13 : 4; + uint64_t m_s23 : 4; + uint64_t m_s33 : 4; + + } m_hi; + + uint64_t m_hi_bits; + }; + }; + + bool unpack_bc7_mode6(const void *pBlock_bits, color_rgba *pPixels) + { + static_assert(sizeof(bc7_mode_6) == 16, "sizeof(bc7_mode_6) == 16"); + + const bc7_mode_6 &block = *static_cast(pBlock_bits); + + if (block.m_lo.m_mode != (1 << 6)) + return false; + + const uint32_t r0 = (uint32_t)((block.m_lo.m_r0 << 1) | block.m_lo.m_p0); + const uint32_t g0 = (uint32_t)((block.m_lo.m_g0 << 1) | block.m_lo.m_p0); + const uint32_t b0 = (uint32_t)((block.m_lo.m_b0 << 1) | block.m_lo.m_p0); + const uint32_t a0 = (uint32_t)((block.m_lo.m_a0 << 1) | block.m_lo.m_p0); + const uint32_t r1 = (uint32_t)((block.m_lo.m_r1 << 1) | block.m_hi.m_p1); + const uint32_t g1 = (uint32_t)((block.m_lo.m_g1 << 1) | block.m_hi.m_p1); + const uint32_t b1 = (uint32_t)((block.m_lo.m_b1 << 1) | block.m_hi.m_p1); + const uint32_t a1 = (uint32_t)((block.m_lo.m_a1 << 1) | block.m_hi.m_p1); + + color_rgba vals[16]; + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t w = basist::g_bc7_weights4[i]; + const uint32_t iw = 64 - w; + vals[i].set_noclamp_rgba( + (r0 * iw + r1 * w + 32) >> 6, + (g0 * iw + g1 * w + 32) >> 6, + (b0 * iw + b1 * w + 32) >> 6, + (a0 * iw + a1 * w + 32) >> 6); + } + + pPixels[0] = vals[block.m_hi.m_s00]; + pPixels[1] = vals[block.m_hi.m_s10]; + pPixels[2] = vals[block.m_hi.m_s20]; + pPixels[3] = vals[block.m_hi.m_s30]; + + pPixels[4] = vals[block.m_hi.m_s01]; + pPixels[5] = vals[block.m_hi.m_s11]; + pPixels[6] = vals[block.m_hi.m_s21]; + pPixels[7] = vals[block.m_hi.m_s31]; + + pPixels[8] = vals[block.m_hi.m_s02]; + pPixels[9] = vals[block.m_hi.m_s12]; + pPixels[10] = vals[block.m_hi.m_s22]; + pPixels[11] = vals[block.m_hi.m_s32]; + + pPixels[12] = vals[block.m_hi.m_s03]; + pPixels[13] = vals[block.m_hi.m_s13]; + pPixels[14] = vals[block.m_hi.m_s23]; + pPixels[15] = vals[block.m_hi.m_s33]; + + return true; + } + + bool unpack_bc7(const void *pBlock, color_rgba *pPixels) + { + const uint32_t first_byte = static_cast(pBlock)[0]; + + for (uint32_t mode = 0; mode <= 7; mode++) + { + if (first_byte & (1U << mode)) + { + switch (mode) + { + case 0: + case 2: + return unpack_bc7_mode0_2(mode, pBlock, pPixels); + case 1: + case 3: + case 7: + return unpack_bc7_mode1_3_7(mode, pBlock, pPixels); + case 4: + case 5: + return unpack_bc7_mode4_5(mode, pBlock, pPixels); + case 6: + return unpack_bc7_mode6(pBlock, pPixels); + default: + break; + } + } + } + + return false; + } + + struct fxt1_block + { + union + { + struct + { + uint64_t m_t00 : 2; + uint64_t m_t01 : 2; + uint64_t m_t02 : 2; + uint64_t m_t03 : 2; + uint64_t m_t04 : 2; + uint64_t m_t05 : 2; + uint64_t m_t06 : 2; + uint64_t m_t07 : 2; + uint64_t m_t08 : 2; + uint64_t m_t09 : 2; + uint64_t m_t10 : 2; + uint64_t m_t11 : 2; + uint64_t m_t12 : 2; + uint64_t m_t13 : 2; + uint64_t m_t14 : 2; + uint64_t m_t15 : 2; + uint64_t m_t16 : 2; + uint64_t m_t17 : 2; + uint64_t m_t18 : 2; + uint64_t m_t19 : 2; + uint64_t m_t20 : 2; + uint64_t m_t21 : 2; + uint64_t m_t22 : 2; + uint64_t m_t23 : 2; + uint64_t m_t24 : 2; + uint64_t m_t25 : 2; + uint64_t m_t26 : 2; + uint64_t m_t27 : 2; + uint64_t m_t28 : 2; + uint64_t m_t29 : 2; + uint64_t m_t30 : 2; + uint64_t m_t31 : 2; + } m_lo; + uint64_t m_lo_bits; + uint8_t m_sels[8]; + }; + + union + { + struct + { +#ifdef BASISU_USE_ORIGINAL_3DFX_FXT1_ENCODING + // This is the format that 3DFX's DECOMP.EXE tool expects, which I'm assuming is what the actual 3DFX hardware wanted. + // Unfortunately, color0/color1 and color2/color3 are flipped relative to the official OpenGL extension and Intel's documentation! + uint64_t m_b1 : 5; + uint64_t m_g1 : 5; + uint64_t m_r1 : 5; + uint64_t m_b0 : 5; + uint64_t m_g0 : 5; + uint64_t m_r0 : 5; + uint64_t m_b3 : 5; + uint64_t m_g3 : 5; + uint64_t m_r3 : 5; + uint64_t m_b2 : 5; + uint64_t m_g2 : 5; + uint64_t m_r2 : 5; +#else + // Intel's encoding, and the encoding in the OpenGL FXT1 spec. + uint64_t m_b0 : 5; + uint64_t m_g0 : 5; + uint64_t m_r0 : 5; + uint64_t m_b1 : 5; + uint64_t m_g1 : 5; + uint64_t m_r1 : 5; + uint64_t m_b2 : 5; + uint64_t m_g2 : 5; + uint64_t m_r2 : 5; + uint64_t m_b3 : 5; + uint64_t m_g3 : 5; + uint64_t m_r3 : 5; +#endif + uint64_t m_alpha : 1; + uint64_t m_glsb : 2; + uint64_t m_mode : 1; + } m_hi; + + uint64_t m_hi_bits; + }; + }; + + static color_rgba expand_565(const color_rgba& c) + { + return color_rgba((c.r << 3) | (c.r >> 2), (c.g << 2) | (c.g >> 4), (c.b << 3) | (c.b >> 2), 255); + } + + // We only support CC_MIXED non-alpha blocks here because that's the only mode the transcoder uses at the moment. + bool unpack_fxt1(const void *p, color_rgba *pPixels) + { + const fxt1_block* pBlock = static_cast(p); + + if (pBlock->m_hi.m_mode == 0) + return false; + if (pBlock->m_hi.m_alpha == 1) + return false; + + color_rgba colors[4]; + + colors[0].r = pBlock->m_hi.m_r0; + colors[0].g = (uint8_t)((pBlock->m_hi.m_g0 << 1) | ((pBlock->m_lo.m_t00 >> 1) ^ (pBlock->m_hi.m_glsb & 1))); + colors[0].b = pBlock->m_hi.m_b0; + colors[0].a = 255; + + colors[1].r = pBlock->m_hi.m_r1; + colors[1].g = (uint8_t)((pBlock->m_hi.m_g1 << 1) | (pBlock->m_hi.m_glsb & 1)); + colors[1].b = pBlock->m_hi.m_b1; + colors[1].a = 255; + + colors[2].r = pBlock->m_hi.m_r2; + colors[2].g = (uint8_t)((pBlock->m_hi.m_g2 << 1) | ((pBlock->m_lo.m_t16 >> 1) ^ (pBlock->m_hi.m_glsb >> 1))); + colors[2].b = pBlock->m_hi.m_b2; + colors[2].a = 255; + + colors[3].r = pBlock->m_hi.m_r3; + colors[3].g = (uint8_t)((pBlock->m_hi.m_g3 << 1) | (pBlock->m_hi.m_glsb >> 1)); + colors[3].b = pBlock->m_hi.m_b3; + colors[3].a = 255; + + for (uint32_t i = 0; i < 4; i++) + colors[i] = expand_565(colors[i]); + + color_rgba block0_colors[4]; + block0_colors[0] = colors[0]; + block0_colors[1] = color_rgba((colors[0].r * 2 + colors[1].r + 1) / 3, (colors[0].g * 2 + colors[1].g + 1) / 3, (colors[0].b * 2 + colors[1].b + 1) / 3, 255); + block0_colors[2] = color_rgba((colors[1].r * 2 + colors[0].r + 1) / 3, (colors[1].g * 2 + colors[0].g + 1) / 3, (colors[1].b * 2 + colors[0].b + 1) / 3, 255); + block0_colors[3] = colors[1]; + + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t sel = (pBlock->m_sels[i >> 2] >> ((i & 3) * 2)) & 3; + + const uint32_t x = i & 3; + const uint32_t y = i >> 2; + pPixels[x + y * 8] = block0_colors[sel]; + } + + color_rgba block1_colors[4]; + block1_colors[0] = colors[2]; + block1_colors[1] = color_rgba((colors[2].r * 2 + colors[3].r + 1) / 3, (colors[2].g * 2 + colors[3].g + 1) / 3, (colors[2].b * 2 + colors[3].b + 1) / 3, 255); + block1_colors[2] = color_rgba((colors[3].r * 2 + colors[2].r + 1) / 3, (colors[3].g * 2 + colors[2].g + 1) / 3, (colors[3].b * 2 + colors[2].b + 1) / 3, 255); + block1_colors[3] = colors[3]; + + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t sel = (pBlock->m_sels[4 + (i >> 2)] >> ((i & 3) * 2)) & 3; + + const uint32_t x = i & 3; + const uint32_t y = i >> 2; + pPixels[4 + x + y * 8] = block1_colors[sel]; + } + + return true; + } + + struct pvrtc2_block + { + uint8_t m_modulation[4]; + + union + { + union + { + // Opaque mode: RGB colora=554 and colorb=555 + struct + { + uint32_t m_mod_flag : 1; + uint32_t m_blue_a : 4; + uint32_t m_green_a : 5; + uint32_t m_red_a : 5; + uint32_t m_hard_flag : 1; + uint32_t m_blue_b : 5; + uint32_t m_green_b : 5; + uint32_t m_red_b : 5; + uint32_t m_opaque_flag : 1; + + } m_opaque_color_data; + + // Transparent mode: RGBA colora=4433 and colorb=4443 + struct + { + uint32_t m_mod_flag : 1; + uint32_t m_blue_a : 3; + uint32_t m_green_a : 4; + uint32_t m_red_a : 4; + uint32_t m_alpha_a : 3; + uint32_t m_hard_flag : 1; + uint32_t m_blue_b : 4; + uint32_t m_green_b : 4; + uint32_t m_red_b : 4; + uint32_t m_alpha_b : 3; + uint32_t m_opaque_flag : 1; + + } m_trans_color_data; + }; + + uint32_t m_color_data_bits; + }; + }; + + static color_rgba convert_rgb_555_to_888(const color_rgba& col) + { + return color_rgba((col[0] << 3) | (col[0] >> 2), (col[1] << 3) | (col[1] >> 2), (col[2] << 3) | (col[2] >> 2), 255); + } + + static color_rgba convert_rgba_5554_to_8888(const color_rgba& col) + { + return color_rgba((col[0] << 3) | (col[0] >> 2), (col[1] << 3) | (col[1] >> 2), (col[2] << 3) | (col[2] >> 2), (col[3] << 4) | col[3]); + } + + // PVRTC2 is currently limited to only what our transcoder outputs (non-interpolated, hard_flag=1 modulation=0). In this mode, PVRTC2 looks much like BC1/ATC. + bool unpack_pvrtc2(const void *p, color_rgba *pPixels) + { + const pvrtc2_block* pBlock = static_cast(p); + + if ((!pBlock->m_opaque_color_data.m_hard_flag) || (pBlock->m_opaque_color_data.m_mod_flag)) + { + // This mode isn't supported by the transcoder, so we aren't bothering with it here. + return false; + } + + color_rgba colors[4]; + + if (pBlock->m_opaque_color_data.m_opaque_flag) + { + // colora=554 + color_rgba color_a(pBlock->m_opaque_color_data.m_red_a, pBlock->m_opaque_color_data.m_green_a, (pBlock->m_opaque_color_data.m_blue_a << 1) | (pBlock->m_opaque_color_data.m_blue_a >> 3), 255); + + // colora=555 + color_rgba color_b(pBlock->m_opaque_color_data.m_red_b, pBlock->m_opaque_color_data.m_green_b, pBlock->m_opaque_color_data.m_blue_b, 255); + + colors[0] = convert_rgb_555_to_888(color_a); + colors[3] = convert_rgb_555_to_888(color_b); + + colors[1].set((colors[0].r * 5 + colors[3].r * 3) / 8, (colors[0].g * 5 + colors[3].g * 3) / 8, (colors[0].b * 5 + colors[3].b * 3) / 8, 255); + colors[2].set((colors[0].r * 3 + colors[3].r * 5) / 8, (colors[0].g * 3 + colors[3].g * 5) / 8, (colors[0].b * 3 + colors[3].b * 5) / 8, 255); + } + else + { + // colora=4433 + color_rgba color_a( + (pBlock->m_trans_color_data.m_red_a << 1) | (pBlock->m_trans_color_data.m_red_a >> 3), + (pBlock->m_trans_color_data.m_green_a << 1) | (pBlock->m_trans_color_data.m_green_a >> 3), + (pBlock->m_trans_color_data.m_blue_a << 2) | (pBlock->m_trans_color_data.m_blue_a >> 1), + pBlock->m_trans_color_data.m_alpha_a << 1); + + //colorb=4443 + color_rgba color_b( + (pBlock->m_trans_color_data.m_red_b << 1) | (pBlock->m_trans_color_data.m_red_b >> 3), + (pBlock->m_trans_color_data.m_green_b << 1) | (pBlock->m_trans_color_data.m_green_b >> 3), + (pBlock->m_trans_color_data.m_blue_b << 1) | (pBlock->m_trans_color_data.m_blue_b >> 3), + (pBlock->m_trans_color_data.m_alpha_b << 1) | 1); + + colors[0] = convert_rgba_5554_to_8888(color_a); + colors[3] = convert_rgba_5554_to_8888(color_b); + } + + colors[1].set((colors[0].r * 5 + colors[3].r * 3) / 8, (colors[0].g * 5 + colors[3].g * 3) / 8, (colors[0].b * 5 + colors[3].b * 3) / 8, (colors[0].a * 5 + colors[3].a * 3) / 8); + colors[2].set((colors[0].r * 3 + colors[3].r * 5) / 8, (colors[0].g * 3 + colors[3].g * 5) / 8, (colors[0].b * 3 + colors[3].b * 5) / 8, (colors[0].a * 3 + colors[3].a * 5) / 8); + + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t sel = (pBlock->m_modulation[i >> 2] >> ((i & 3) * 2)) & 3; + pPixels[i] = colors[sel]; + } + + return true; + } + + struct etc2_eac_r11 + { + uint64_t m_base : 8; + uint64_t m_table : 4; + uint64_t m_mul : 4; + uint64_t m_sels_0 : 8; + uint64_t m_sels_1 : 8; + uint64_t m_sels_2 : 8; + uint64_t m_sels_3 : 8; + uint64_t m_sels_4 : 8; + uint64_t m_sels_5 : 8; + + uint64_t get_sels() const + { + return ((uint64_t)m_sels_0 << 40U) | ((uint64_t)m_sels_1 << 32U) | ((uint64_t)m_sels_2 << 24U) | ((uint64_t)m_sels_3 << 16U) | ((uint64_t)m_sels_4 << 8U) | m_sels_5; + } + + void set_sels(uint64_t v) + { + m_sels_0 = (v >> 40U) & 0xFF; + m_sels_1 = (v >> 32U) & 0xFF; + m_sels_2 = (v >> 24U) & 0xFF; + m_sels_3 = (v >> 16U) & 0xFF; + m_sels_4 = (v >> 8U) & 0xFF; + m_sels_5 = v & 0xFF; + } + }; + + struct etc2_eac_rg11 + { + etc2_eac_r11 m_c[2]; + }; + + void unpack_etc2_eac_r(const void *p, color_rgba* pPixels, uint32_t c) + { + const etc2_eac_r11* pBlock = static_cast(p); + const uint64_t sels = pBlock->get_sels(); + + const int base = (int)pBlock->m_base * 8 + 4; + const int mul = pBlock->m_mul ? ((int)pBlock->m_mul * 8) : 1; + const int table = (int)pBlock->m_table; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t shift = 45 - ((y + x * 4) * 3); + + const uint32_t sel = (uint32_t)((sels >> shift) & 7); + + int val = base + g_etc2_eac_tables[table][sel] * mul; + val = clamp(val, 0, 2047); + + // Convert to 8-bits with rounding + //pPixels[x + y * 4].m_comps[c] = static_cast((val * 255 + 1024) / 2047); + pPixels[x + y * 4].m_comps[c] = static_cast((val * 255 + 1023) / 2047); + + } // x + } // y + } + + void unpack_etc2_eac_rg(const void* p, color_rgba* pPixels) + { + for (uint32_t c = 0; c < 2; c++) + { + const etc2_eac_r11* pBlock = &static_cast(p)->m_c[c]; + + unpack_etc2_eac_r(pBlock, pPixels, c); + } + } + + void unpack_uastc(const void* p, color_rgba* pPixels) + { + basist::unpack_uastc(*static_cast(p), (basist::color32 *)pPixels, false); + } + + // Unpacks to RGBA, R, RG, or A + bool unpack_block(texture_format fmt, const void* pBlock, color_rgba* pPixels) + { + switch (fmt) + { + case texture_format::cBC1: + { + unpack_bc1(pBlock, pPixels, true); + break; + } + case texture_format::cBC1_NV: + { + unpack_bc1_nv(pBlock, pPixels, true); + break; + } + case texture_format::cBC1_AMD: + { + unpack_bc1_amd(pBlock, pPixels, true); + break; + } + case texture_format::cBC3: + { + return unpack_bc3(pBlock, pPixels); + } + case texture_format::cBC4: + { + // Unpack to R + unpack_bc4(pBlock, &pPixels[0].r, sizeof(color_rgba)); + break; + } + case texture_format::cBC5: + { + unpack_bc5(pBlock, pPixels); + break; + } + case texture_format::cBC7: + { + return unpack_bc7(pBlock, pPixels); + } + // Full ETC2 color blocks (planar/T/H modes) is currently unsupported in basisu, but we do support ETC2 with alpha (using ETC1 for color) + case texture_format::cETC2_RGB: + case texture_format::cETC1: + case texture_format::cETC1S: + { + return unpack_etc1(*static_cast(pBlock), pPixels); + } + case texture_format::cETC2_RGBA: + { + if (!unpack_etc1(static_cast(pBlock)[1], pPixels)) + return false; + unpack_etc2_eac(pBlock, pPixels); + break; + } + case texture_format::cETC2_ALPHA: + { + // Unpack to A + unpack_etc2_eac(pBlock, pPixels); + break; + } + case texture_format::cASTC4x4: + { +#if BASISU_USE_ASTC_DECOMPRESS + const bool astc_srgb = false; + basisu_astc::astc::decompress(reinterpret_cast(pPixels), static_cast(pBlock), astc_srgb, 4, 4); +#else + memset(pPixels, 255, 16 * sizeof(color_rgba)); +#endif + break; + } + case texture_format::cATC_RGB: + { + unpack_atc(pBlock, pPixels); + break; + } + case texture_format::cATC_RGBA_INTERPOLATED_ALPHA: + { + unpack_atc(static_cast(pBlock) + 8, pPixels); + unpack_bc4(pBlock, &pPixels[0].a, sizeof(color_rgba)); + break; + } + case texture_format::cFXT1_RGB: + { + unpack_fxt1(pBlock, pPixels); + break; + } + case texture_format::cPVRTC2_4_RGBA: + { + unpack_pvrtc2(pBlock, pPixels); + break; + } + case texture_format::cETC2_R11_EAC: + { + unpack_etc2_eac_r(static_cast(pBlock), pPixels, 0); + break; + } + case texture_format::cETC2_RG11_EAC: + { + unpack_etc2_eac_rg(pBlock, pPixels); + break; + } + case texture_format::cUASTC4x4: + { + unpack_uastc(pBlock, pPixels); + break; + } + default: + { + assert(0); + // TODO + return false; + } + } + return true; + } + + bool gpu_image::unpack(image& img) const + { + img.resize(get_pixel_width(), get_pixel_height()); + img.set_all(g_black_color); + + if (!img.get_width() || !img.get_height()) + return true; + + if ((m_fmt == texture_format::cPVRTC1_4_RGB) || (m_fmt == texture_format::cPVRTC1_4_RGBA)) + { + pvrtc4_image pi(m_width, m_height); + + if (get_total_blocks() != pi.get_total_blocks()) + return false; + + memcpy(&pi.get_blocks()[0], get_ptr(), get_size_in_bytes()); + + pi.deswizzle(); + + pi.unpack_all_pixels(img); + + return true; + } + + assert((m_block_width <= cMaxBlockSize) && (m_block_height <= cMaxBlockSize)); + color_rgba pixels[cMaxBlockSize * cMaxBlockSize]; + for (uint32_t i = 0; i < cMaxBlockSize * cMaxBlockSize; i++) + pixels[i] = g_black_color; + + bool success = true; + + for (uint32_t by = 0; by < m_blocks_y; by++) + { + for (uint32_t bx = 0; bx < m_blocks_x; bx++) + { + const void* pBlock = get_block_ptr(bx, by); + + if (!unpack_block(m_fmt, pBlock, pixels)) + success = false; + + img.set_block_clipped(pixels, bx * m_block_width, by * m_block_height, m_block_width, m_block_height); + } // bx + } // by + + return success; + } + + static const uint8_t g_ktx_file_id[12] = { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A }; + + // KTX/GL enums + enum + { + KTX_ENDIAN = 0x04030201, + KTX_OPPOSITE_ENDIAN = 0x01020304, + KTX_ETC1_RGB8_OES = 0x8D64, + KTX_RED = 0x1903, + KTX_RG = 0x8227, + KTX_RGB = 0x1907, + KTX_RGBA = 0x1908, + KTX_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0, + KTX_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3, + KTX_COMPRESSED_RED_RGTC1_EXT = 0x8DBB, + KTX_COMPRESSED_RED_GREEN_RGTC2_EXT = 0x8DBD, + KTX_COMPRESSED_RGB8_ETC2 = 0x9274, + KTX_COMPRESSED_RGBA8_ETC2_EAC = 0x9278, + KTX_COMPRESSED_RGBA_BPTC_UNORM = 0x8E8C, + KTX_COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 0x8E8D, + KTX_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00, + KTX_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02, + KTX_COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0, + KTX_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 0x93D0, + KTX_COMPRESSED_RGBA_UASTC_4x4_KHR = 0x94CC, // TODO - Use proper value! + KTX_ATC_RGB_AMD = 0x8C92, + KTX_ATC_RGBA_INTERPOLATED_ALPHA_AMD = 0x87EE, + KTX_COMPRESSED_RGB_FXT1_3DFX = 0x86B0, + KTX_COMPRESSED_RGBA_FXT1_3DFX = 0x86B1, + KTX_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG = 0x9138, + KTX_COMPRESSED_R11_EAC = 0x9270, + KTX_COMPRESSED_RG11_EAC = 0x9272 + }; + + struct ktx_header + { + uint8_t m_identifier[12]; + packed_uint<4> m_endianness; + packed_uint<4> m_glType; + packed_uint<4> m_glTypeSize; + packed_uint<4> m_glFormat; + packed_uint<4> m_glInternalFormat; + packed_uint<4> m_glBaseInternalFormat; + packed_uint<4> m_pixelWidth; + packed_uint<4> m_pixelHeight; + packed_uint<4> m_pixelDepth; + packed_uint<4> m_numberOfArrayElements; + packed_uint<4> m_numberOfFaces; + packed_uint<4> m_numberOfMipmapLevels; + packed_uint<4> m_bytesOfKeyValueData; + + void clear() { clear_obj(*this); } + }; + + // Input is a texture array of mipmapped gpu_image's: gpu_images[array_index][level_index] + bool create_ktx_texture_file(uint8_vec &ktx_data, const basisu::vector& gpu_images, bool cubemap_flag) + { + if (!gpu_images.size()) + { + assert(0); + return false; + } + + uint32_t width = 0, height = 0, total_levels = 0; + basisu::texture_format fmt = texture_format::cInvalidTextureFormat; + + if (cubemap_flag) + { + if ((gpu_images.size() % 6) != 0) + { + assert(0); + return false; + } + } + + for (uint32_t array_index = 0; array_index < gpu_images.size(); array_index++) + { + const gpu_image_vec &levels = gpu_images[array_index]; + + if (!levels.size()) + { + // Empty mip chain + assert(0); + return false; + } + + if (!array_index) + { + width = levels[0].get_pixel_width(); + height = levels[0].get_pixel_height(); + total_levels = (uint32_t)levels.size(); + fmt = levels[0].get_format(); + } + else + { + if ((width != levels[0].get_pixel_width()) || + (height != levels[0].get_pixel_height()) || + (total_levels != levels.size())) + { + // All cubemap/texture array faces must be the same dimension + assert(0); + return false; + } + } + + for (uint32_t level_index = 0; level_index < levels.size(); level_index++) + { + if (level_index) + { + if ( (levels[level_index].get_pixel_width() != maximum(1, levels[0].get_pixel_width() >> level_index)) || + (levels[level_index].get_pixel_height() != maximum(1, levels[0].get_pixel_height() >> level_index)) ) + { + // Malformed mipmap chain + assert(0); + return false; + } + } + + if (fmt != levels[level_index].get_format()) + { + // All input textures must use the same GPU format + assert(0); + return false; + } + } + } + + uint32_t internal_fmt = KTX_ETC1_RGB8_OES, base_internal_fmt = KTX_RGB; + + switch (fmt) + { + case texture_format::cBC1: + case texture_format::cBC1_NV: + case texture_format::cBC1_AMD: + { + internal_fmt = KTX_COMPRESSED_RGB_S3TC_DXT1_EXT; + break; + } + case texture_format::cBC3: + { + internal_fmt = KTX_COMPRESSED_RGBA_S3TC_DXT5_EXT; + base_internal_fmt = KTX_RGBA; + break; + } + case texture_format::cBC4: + { + internal_fmt = KTX_COMPRESSED_RED_RGTC1_EXT;// KTX_COMPRESSED_LUMINANCE_LATC1_EXT; + base_internal_fmt = KTX_RED; + break; + } + case texture_format::cBC5: + { + internal_fmt = KTX_COMPRESSED_RED_GREEN_RGTC2_EXT; + base_internal_fmt = KTX_RG; + break; + } + case texture_format::cETC1: + case texture_format::cETC1S: + { + internal_fmt = KTX_ETC1_RGB8_OES; + break; + } + case texture_format::cETC2_RGB: + { + internal_fmt = KTX_COMPRESSED_RGB8_ETC2; + break; + } + case texture_format::cETC2_RGBA: + { + internal_fmt = KTX_COMPRESSED_RGBA8_ETC2_EAC; + base_internal_fmt = KTX_RGBA; + break; + } + case texture_format::cBC7: + { + internal_fmt = KTX_COMPRESSED_RGBA_BPTC_UNORM; + base_internal_fmt = KTX_RGBA; + break; + } + case texture_format::cPVRTC1_4_RGB: + { + internal_fmt = KTX_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + break; + } + case texture_format::cPVRTC1_4_RGBA: + { + internal_fmt = KTX_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + base_internal_fmt = KTX_RGBA; + break; + } + case texture_format::cASTC4x4: + { + internal_fmt = KTX_COMPRESSED_RGBA_ASTC_4x4_KHR; + base_internal_fmt = KTX_RGBA; + break; + } + case texture_format::cATC_RGB: + { + internal_fmt = KTX_ATC_RGB_AMD; + break; + } + case texture_format::cATC_RGBA_INTERPOLATED_ALPHA: + { + internal_fmt = KTX_ATC_RGBA_INTERPOLATED_ALPHA_AMD; + base_internal_fmt = KTX_RGBA; + break; + } + case texture_format::cETC2_R11_EAC: + { + internal_fmt = KTX_COMPRESSED_R11_EAC; + base_internal_fmt = KTX_RED; + break; + } + case texture_format::cETC2_RG11_EAC: + { + internal_fmt = KTX_COMPRESSED_RG11_EAC; + base_internal_fmt = KTX_RG; + break; + } + case texture_format::cUASTC4x4: + { + internal_fmt = KTX_COMPRESSED_RGBA_UASTC_4x4_KHR; + base_internal_fmt = KTX_RGBA; + break; + } + case texture_format::cFXT1_RGB: + { + internal_fmt = KTX_COMPRESSED_RGB_FXT1_3DFX; + break; + } + case texture_format::cPVRTC2_4_RGBA: + { + internal_fmt = KTX_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG; + base_internal_fmt = KTX_RGBA; + break; + } + default: + { + // TODO + assert(0); + return false; + } + } + + ktx_header header; + header.clear(); + memcpy(&header.m_identifier, g_ktx_file_id, sizeof(g_ktx_file_id)); + header.m_endianness = KTX_ENDIAN; + + header.m_pixelWidth = width; + header.m_pixelHeight = height; + + header.m_glTypeSize = 1; + + header.m_glInternalFormat = internal_fmt; + header.m_glBaseInternalFormat = base_internal_fmt; + + header.m_numberOfArrayElements = (uint32_t)(cubemap_flag ? (gpu_images.size() / 6) : gpu_images.size()); + if (header.m_numberOfArrayElements == 1) + header.m_numberOfArrayElements = 0; + + header.m_numberOfMipmapLevels = total_levels; + header.m_numberOfFaces = cubemap_flag ? 6 : 1; + + append_vector(ktx_data, (uint8_t *)&header, sizeof(header)); + + for (uint32_t level_index = 0; level_index < total_levels; level_index++) + { + uint32_t img_size = gpu_images[0][level_index].get_size_in_bytes(); + + if ((header.m_numberOfFaces == 1) || (header.m_numberOfArrayElements > 1)) + { + img_size = img_size * header.m_numberOfFaces * maximum(1, header.m_numberOfArrayElements); + } + + assert(img_size && ((img_size & 3) == 0)); + + packed_uint<4> packed_img_size(img_size); + append_vector(ktx_data, (uint8_t *)&packed_img_size, sizeof(packed_img_size)); + + for (uint32_t array_index = 0; array_index < maximum(1, header.m_numberOfArrayElements); array_index++) + { + for (uint32_t face_index = 0; face_index < header.m_numberOfFaces; face_index++) + { + const gpu_image& img = gpu_images[cubemap_flag ? (array_index * 6 + face_index) : array_index][level_index]; + + append_vector(ktx_data, (uint8_t *)img.get_ptr(), img.get_size_in_bytes()); + } + + } // array_index + + } // level_index + + return true; + } + + bool write_compressed_texture_file(const char* pFilename, const basisu::vector& g, bool cubemap_flag) + { + std::string extension(string_tolower(string_get_extension(pFilename))); + + uint8_vec filedata; + if (extension == "ktx") + { + if (!create_ktx_texture_file(filedata, g, cubemap_flag)) + return false; + } + else if (extension == "pvr") + { + // TODO + return false; + } + else if (extension == "dds") + { + // TODO + return false; + } + else + { + // unsupported texture format + assert(0); + return false; + } + + return basisu::write_vec_to_file(pFilename, filedata); + } + + bool write_compressed_texture_file(const char* pFilename, const gpu_image& g) + { + basisu::vector v; + enlarge_vector(v, 1)->push_back(g); + return write_compressed_texture_file(pFilename, v, false); + } + + //const uint32_t OUT_FILE_MAGIC = 'TEXC'; + struct out_file_header + { + packed_uint<4> m_magic; + packed_uint<4> m_pad; + packed_uint<4> m_width; + packed_uint<4> m_height; + }; + + // As no modern tool supports FXT1 format .KTX files, let's write .OUT files and make sure 3DFX's original tools shipped in 1999 can decode our encoded output. + bool write_3dfx_out_file(const char* pFilename, const gpu_image& gi) + { + out_file_header hdr; + //hdr.m_magic = OUT_FILE_MAGIC; + hdr.m_magic.m_bytes[0] = 67; + hdr.m_magic.m_bytes[1] = 88; + hdr.m_magic.m_bytes[2] = 69; + hdr.m_magic.m_bytes[3] = 84; + hdr.m_pad = 0; + hdr.m_width = gi.get_blocks_x() * 8; + hdr.m_height = gi.get_blocks_y() * 4; + + FILE* pFile = nullptr; +#ifdef _WIN32 + fopen_s(&pFile, pFilename, "wb"); +#else + pFile = fopen(pFilename, "wb"); +#endif + if (!pFile) + return false; + + fwrite(&hdr, sizeof(hdr), 1, pFile); + fwrite(gi.get_ptr(), gi.get_size_in_bytes(), 1, pFile); + + return fclose(pFile) != EOF; + } +} // basisu + diff --git a/ktx/external/basisu/encoder/basisu_gpu_texture.h b/ktx/external/basisu/encoder/basisu_gpu_texture.h new file mode 100644 index 0000000..619926f --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_gpu_texture.h @@ -0,0 +1,154 @@ +// basisu_gpu_texture.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once +#include "../transcoder/basisu.h" +#include "basisu_etc.h" + +namespace basisu +{ + // GPU texture "image" + class gpu_image + { + public: + enum { cMaxBlockSize = 12 }; + + gpu_image() + { + clear(); + } + + gpu_image(texture_format fmt, uint32_t width, uint32_t height) + { + init(fmt, width, height); + } + + void clear() + { + m_fmt = texture_format::cInvalidTextureFormat; + m_width = 0; + m_height = 0; + m_block_width = 0; + m_block_height = 0; + m_blocks_x = 0; + m_blocks_y = 0; + m_qwords_per_block = 0; + m_blocks.clear(); + } + + inline texture_format get_format() const { return m_fmt; } + + // Width/height in pixels + inline uint32_t get_pixel_width() const { return m_width; } + inline uint32_t get_pixel_height() const { return m_height; } + + // Width/height in blocks, row pitch is assumed to be m_blocks_x. + inline uint32_t get_blocks_x() const { return m_blocks_x; } + inline uint32_t get_blocks_y() const { return m_blocks_y; } + + // Size of each block in pixels + inline uint32_t get_block_width() const { return m_block_width; } + inline uint32_t get_block_height() const { return m_block_height; } + + inline uint32_t get_qwords_per_block() const { return m_qwords_per_block; } + inline uint32_t get_total_blocks() const { return m_blocks_x * m_blocks_y; } + inline uint32_t get_bytes_per_block() const { return get_qwords_per_block() * sizeof(uint64_t); } + inline uint32_t get_row_pitch_in_bytes() const { return get_bytes_per_block() * get_blocks_x(); } + + inline const uint64_vec &get_blocks() const { return m_blocks; } + + inline const uint64_t *get_ptr() const { return &m_blocks[0]; } + inline uint64_t *get_ptr() { return &m_blocks[0]; } + + inline uint32_t get_size_in_bytes() const { return get_total_blocks() * get_qwords_per_block() * sizeof(uint64_t); } + + inline const void *get_block_ptr(uint32_t block_x, uint32_t block_y, uint32_t element_index = 0) const + { + assert(block_x < m_blocks_x && block_y < m_blocks_y); + return &m_blocks[(block_x + block_y * m_blocks_x) * m_qwords_per_block + element_index]; + } + + inline void *get_block_ptr(uint32_t block_x, uint32_t block_y, uint32_t element_index = 0) + { + assert(block_x < m_blocks_x && block_y < m_blocks_y && element_index < m_qwords_per_block); + return &m_blocks[(block_x + block_y * m_blocks_x) * m_qwords_per_block + element_index]; + } + + void init(texture_format fmt, uint32_t width, uint32_t height) + { + m_fmt = fmt; + m_width = width; + m_height = height; + m_block_width = basisu::get_block_width(m_fmt); + m_block_height = basisu::get_block_height(m_fmt); + m_blocks_x = (m_width + m_block_width - 1) / m_block_width; + m_blocks_y = (m_height + m_block_height - 1) / m_block_height; + m_qwords_per_block = basisu::get_qwords_per_block(m_fmt); + + m_blocks.resize(0); + m_blocks.resize(m_blocks_x * m_blocks_y * m_qwords_per_block); + } + + bool unpack(image& img) const; + + void override_dimensions(uint32_t w, uint32_t h) + { + m_width = w; + m_height = h; + } + + private: + texture_format m_fmt; + uint32_t m_width, m_height, m_blocks_x, m_blocks_y, m_block_width, m_block_height, m_qwords_per_block; + uint64_vec m_blocks; + }; + + typedef basisu::vector gpu_image_vec; + + // KTX file writing + + bool create_ktx_texture_file(uint8_vec &ktx_data, const basisu::vector& gpu_images, bool cubemap_flag); + + bool write_compressed_texture_file(const char *pFilename, const basisu::vector& g, bool cubemap_flag); + + inline bool write_compressed_texture_file(const char *pFilename, const gpu_image_vec &g) + { + basisu::vector a; + a.push_back(g); + return write_compressed_texture_file(pFilename, a, false); + } + + bool write_compressed_texture_file(const char *pFilename, const gpu_image &g); + + bool write_3dfx_out_file(const char* pFilename, const gpu_image& gi); + + // GPU texture block unpacking + void unpack_etc2_eac(const void *pBlock_bits, color_rgba *pPixels); + bool unpack_bc1(const void *pBlock_bits, color_rgba *pPixels, bool set_alpha); + void unpack_bc4(const void *pBlock_bits, uint8_t *pPixels, uint32_t stride); + bool unpack_bc3(const void *pBlock_bits, color_rgba *pPixels); + void unpack_bc5(const void *pBlock_bits, color_rgba *pPixels); + bool unpack_bc7_mode6(const void *pBlock_bits, color_rgba *pPixels); + bool unpack_bc7(const void* pBlock_bits, color_rgba* pPixels); + void unpack_atc(const void* pBlock_bits, color_rgba* pPixels); + bool unpack_fxt1(const void* p, color_rgba* pPixels); + bool unpack_pvrtc2(const void* p, color_rgba* pPixels); + void unpack_etc2_eac_r(const void *p, color_rgba* pPixels, uint32_t c); + void unpack_etc2_eac_rg(const void* p, color_rgba* pPixels); + + // unpack_block() is primarily intended to unpack texture data created by the transcoder. + // For some texture formats (like ETC2 RGB, PVRTC2, FXT1) it's not a complete implementation. + bool unpack_block(texture_format fmt, const void *pBlock, color_rgba *pPixels); + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_kernels_declares.h b/ktx/external/basisu/encoder/basisu_kernels_declares.h new file mode 100644 index 0000000..b03e2ea --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_kernels_declares.h @@ -0,0 +1,27 @@ +// basisu_kernels_declares.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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 BASISU_SUPPORT_SSE +void CPPSPMD_NAME(perceptual_distance_rgb_4_N)(int64_t* pDistance, const uint8_t* pSelectors, const basisu::color_rgba* pBlock_colors, const basisu::color_rgba* pSrc_pixels, uint32_t n, int64_t early_out_err); +void CPPSPMD_NAME(linear_distance_rgb_4_N)(int64_t* pDistance, const uint8_t* pSelectors, const basisu::color_rgba* pBlock_colors, const basisu::color_rgba* pSrc_pixels, uint32_t n, int64_t early_out_err); + +void CPPSPMD_NAME(find_selectors_perceptual_rgb_4_N)(int64_t* pDistance, uint8_t* pSelectors, const basisu::color_rgba* pBlock_colors, const basisu::color_rgba* pSrc_pixels, uint32_t n, int64_t early_out_err); +void CPPSPMD_NAME(find_selectors_linear_rgb_4_N)(int64_t* pDistance, uint8_t* pSelectors, const basisu::color_rgba* pBlock_colors, const basisu::color_rgba* pSrc_pixels, uint32_t n, int64_t early_out_err); + +void CPPSPMD_NAME(find_lowest_error_perceptual_rgb_4_N)(int64_t* pDistance, const basisu::color_rgba* pBlock_colors, const basisu::color_rgba* pSrc_pixels, uint32_t n, int64_t early_out_error); +void CPPSPMD_NAME(find_lowest_error_linear_rgb_4_N)(int64_t* pDistance, const basisu::color_rgba* pBlock_colors, const basisu::color_rgba* pSrc_pixels, uint32_t n, int64_t early_out_error); + +void CPPSPMD_NAME(update_covar_matrix_16x16)(uint32_t num_vecs, const void* pWeighted_vecs, const void *pOrigin, const uint32_t* pVec_indices, void *pMatrix16x16); +#endif diff --git a/ktx/external/basisu/encoder/basisu_kernels_imp.h b/ktx/external/basisu/encoder/basisu_kernels_imp.h new file mode 100644 index 0000000..dcf1ce0 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_kernels_imp.h @@ -0,0 +1,647 @@ +// basisu_kernels_imp.h - Do not directly include +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. + +using namespace CPPSPMD; + +namespace CPPSPMD_NAME(basisu_kernels_namespace) +{ + struct perceptual_distance_rgb_4_N : spmd_kernel + { + void _call(int64_t* pDistance, + const uint8_t* pSelectors, + const color_rgba* pBlock_colors, + const color_rgba* pSrc_pixels, uint32_t n, + int64_t early_out_err) + { + assert(early_out_err >= 0); + + *pDistance = 0; + + __m128i block_colors[4]; + vint block_colors_r[4], block_colors_g[4], block_colors_b[4]; + for (uint32_t i = 0; i < 4; i++) + { + block_colors[i] = load_rgba32(&pBlock_colors[i]); + store_all(block_colors_r[i], (int)pBlock_colors[i].r); + store_all(block_colors_g[i], (int)pBlock_colors[i].g); + store_all(block_colors_b[i], (int)pBlock_colors[i].b); + } + + uint32_t i; + for (i = 0; (i + 4) <= n; i += 4) + { + __m128i c0 = load_rgba32(&pSrc_pixels[i + 0]), c1 = load_rgba32(&pSrc_pixels[i + 1]), c2 = load_rgba32(&pSrc_pixels[i + 2]), c3 = load_rgba32(&pSrc_pixels[i + 3]); + + vint r, g, b, a; + transpose4x4(r.m_value, g.m_value, b.m_value, a.m_value, c0, c1, c2, c3); + + int s0 = pSelectors[i], s1 = pSelectors[i + 1], s2 = pSelectors[i + 2], s3 = pSelectors[i + 3]; + + vint base_r, base_g, base_b, base_a; + if ((s0 == s1) && (s0 == s2) && (s0 == s3)) + { + store_all(base_r, block_colors_r[s0]); + store_all(base_g, block_colors_g[s0]); + store_all(base_b, block_colors_b[s0]); + } + else + { + __m128i k0 = block_colors[s0], k1 = block_colors[s1], k2 = block_colors[s2], k3 = block_colors[s3]; + transpose4x4(base_r.m_value, base_g.m_value, base_b.m_value, base_a.m_value, k0, k1, k2, k3); + } + + vint dr = base_r - r; + vint dg = base_g - g; + vint db = base_b - b; + + vint delta_l = dr * 27 + dg * 92 + db * 9; + vint delta_cr = dr * 128 - delta_l; + vint delta_cb = db * 128 - delta_l; + + vint id = ((delta_l * delta_l) >> 7) + + ((((delta_cr * delta_cr) >> 7) * 26) >> 7) + + ((((delta_cb * delta_cb) >> 7) * 3) >> 7); + + *pDistance += reduce_add(id); + if (*pDistance >= early_out_err) + return; + } + + for (; i < n; i++) + { + int r = pSrc_pixels[i].r, g = pSrc_pixels[i].g, b = pSrc_pixels[i].b; + + int sel = pSelectors[i]; + int base_r = pBlock_colors[sel].r, base_g = pBlock_colors[sel].g, base_b = pBlock_colors[sel].b; + + int dr = base_r - r; + int dg = base_g - g; + int db = base_b - b; + + int delta_l = dr * 27 + dg * 92 + db * 9; + int delta_cr = dr * 128 - delta_l; + int delta_cb = db * 128 - delta_l; + + int id = ((delta_l * delta_l) >> 7) + + ((((delta_cr * delta_cr) >> 7) * 26) >> 7) + + ((((delta_cb * delta_cb) >> 7) * 3) >> 7); + + *pDistance += id; + if (*pDistance >= early_out_err) + return; + } + } + }; + + struct linear_distance_rgb_4_N : spmd_kernel + { + void _call(int64_t* pDistance, + const uint8_t* pSelectors, + const color_rgba* pBlock_colors, + const color_rgba* pSrc_pixels, uint32_t n, + int64_t early_out_err) + { + assert(early_out_err >= 0); + + *pDistance = 0; + + __m128i block_colors[4]; + vint block_colors_r[4], block_colors_g[4], block_colors_b[4]; + for (uint32_t i = 0; i < 4; i++) + { + block_colors[i] = load_rgba32(&pBlock_colors[i]); + store_all(block_colors_r[i], (int)pBlock_colors[i].r); + store_all(block_colors_g[i], (int)pBlock_colors[i].g); + store_all(block_colors_b[i], (int)pBlock_colors[i].b); + } + + uint32_t i; + for (i = 0; (i + 4) <= n; i += 4) + { + __m128i c0 = load_rgba32(&pSrc_pixels[i + 0]), c1 = load_rgba32(&pSrc_pixels[i + 1]), c2 = load_rgba32(&pSrc_pixels[i + 2]), c3 = load_rgba32(&pSrc_pixels[i + 3]); + + vint r, g, b, a; + transpose4x4(r.m_value, g.m_value, b.m_value, a.m_value, c0, c1, c2, c3); + + int s0 = pSelectors[i], s1 = pSelectors[i + 1], s2 = pSelectors[i + 2], s3 = pSelectors[i + 3]; + + vint base_r, base_g, base_b, base_a; + if ((s0 == s1) && (s0 == s2) && (s0 == s3)) + { + store_all(base_r, block_colors_r[s0]); + store_all(base_g, block_colors_g[s0]); + store_all(base_b, block_colors_b[s0]); + } + else + { + __m128i k0 = block_colors[s0], k1 = block_colors[s1], k2 = block_colors[s2], k3 = block_colors[s3]; + transpose4x4(base_r.m_value, base_g.m_value, base_b.m_value, base_a.m_value, k0, k1, k2, k3); + } + + vint dr = base_r - r; + vint dg = base_g - g; + vint db = base_b - b; + + vint id = dr * dr + dg * dg + db * db; + + *pDistance += reduce_add(id); + if (*pDistance >= early_out_err) + return; + } + + for (; i < n; i++) + { + int r = pSrc_pixels[i].r, g = pSrc_pixels[i].g, b = pSrc_pixels[i].b; + + int sel = pSelectors[i]; + int base_r = pBlock_colors[sel].r, base_g = pBlock_colors[sel].g, base_b = pBlock_colors[sel].b; + + int dr = base_r - r; + int dg = base_g - g; + int db = base_b - b; + + int id = dr * dr + dg * dg + db * db; + + *pDistance += id; + if (*pDistance >= early_out_err) + return; + } + } + }; + + struct find_selectors_perceptual_rgb_4_N : spmd_kernel + { + inline vint compute_dist( + const vint& base_r, const vint& base_g, const vint& base_b, + const vint& r, const vint& g, const vint& b) + { + vint dr = base_r - r; + vint dg = base_g - g; + vint db = base_b - b; + + vint delta_l = dr * 27 + dg * 92 + db * 9; + vint delta_cr = dr * 128 - delta_l; + vint delta_cb = db * 128 - delta_l; + + vint id = VINT_SHIFT_RIGHT(delta_l * delta_l, 7) + + VINT_SHIFT_RIGHT(VINT_SHIFT_RIGHT(delta_cr * delta_cr, 7) * 26, 7) + + VINT_SHIFT_RIGHT(VINT_SHIFT_RIGHT(delta_cb * delta_cb, 7) * 3, 7); + + return id; + } + + void _call(int64_t* pDistance, + uint8_t* pSelectors, + const color_rgba* pBlock_colors, + const color_rgba* pSrc_pixels, uint32_t n, + int64_t early_out_err) + { + assert(early_out_err >= 0); + + *pDistance = 0; + + vint block_colors_r[4], block_colors_g[4], block_colors_b[4]; + for (uint32_t i = 0; i < 4; i++) + { + store_all(block_colors_r[i], (int)pBlock_colors[i].r); + store_all(block_colors_g[i], (int)pBlock_colors[i].g); + store_all(block_colors_b[i], (int)pBlock_colors[i].b); + } + + const __m128i shuf = _mm_set_epi8(-128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, 12, 8, 4, 0); + + uint32_t i; + + for (i = 0; (i + 4) <= n; i += 4) + { + __m128i c0 = load_rgba32(&pSrc_pixels[i + 0]), c1 = load_rgba32(&pSrc_pixels[i + 1]), c2 = load_rgba32(&pSrc_pixels[i + 2]), c3 = load_rgba32(&pSrc_pixels[i + 3]); + + vint r, g, b, a; + transpose4x4(r.m_value, g.m_value, b.m_value, a.m_value, c0, c1, c2, c3); + + vint dist0 = compute_dist(block_colors_r[0], block_colors_g[0], block_colors_b[0], r, g, b); + vint dist1 = compute_dist(block_colors_r[1], block_colors_g[1], block_colors_b[1], r, g, b); + vint dist2 = compute_dist(block_colors_r[2], block_colors_g[2], block_colors_b[2], r, g, b); + vint dist3 = compute_dist(block_colors_r[3], block_colors_g[3], block_colors_b[3], r, g, b); + + vint min_dist = min(min(min(dist0, dist1), dist2), dist3); + + vint sels = spmd_ternaryi(min_dist == dist0, 0, spmd_ternaryi(min_dist == dist1, 1, spmd_ternaryi(min_dist == dist2, 2, 3))); + + __m128i vsels = shuffle_epi8(sels.m_value, shuf); + storeu_si32((void *)(pSelectors + i), vsels); + + *pDistance += reduce_add(min_dist); + if (*pDistance >= early_out_err) + return; + } + + for (; i < n; i++) + { + int r = pSrc_pixels[i].r, g = pSrc_pixels[i].g, b = pSrc_pixels[i].b; + + int best_err = INT_MAX, best_sel = 0; + for (int sel = 0; sel < 4; sel++) + { + int base_r = pBlock_colors[sel].r, base_g = pBlock_colors[sel].g, base_b = pBlock_colors[sel].b; + + int dr = base_r - r; + int dg = base_g - g; + int db = base_b - b; + + int delta_l = dr * 27 + dg * 92 + db * 9; + int delta_cr = dr * 128 - delta_l; + int delta_cb = db * 128 - delta_l; + + int id = ((delta_l * delta_l) >> 7) + + ((((delta_cr * delta_cr) >> 7) * 26) >> 7) + + ((((delta_cb * delta_cb) >> 7) * 3) >> 7); + if (id < best_err) + { + best_err = id; + best_sel = sel; + } + } + + pSelectors[i] = (uint8_t)best_sel; + + *pDistance += best_err; + if (*pDistance >= early_out_err) + return; + } + } + }; + + struct find_selectors_linear_rgb_4_N : spmd_kernel + { + inline vint compute_dist( + const vint& base_r, const vint& base_g, const vint& base_b, + const vint& r, const vint& g, const vint& b) + { + vint dr = base_r - r; + vint dg = base_g - g; + vint db = base_b - b; + + vint id = dr * dr + dg * dg + db * db; + return id; + } + + void _call(int64_t* pDistance, + uint8_t* pSelectors, + const color_rgba* pBlock_colors, + const color_rgba* pSrc_pixels, uint32_t n, + int64_t early_out_err) + { + assert(early_out_err >= 0); + + *pDistance = 0; + + vint block_colors_r[4], block_colors_g[4], block_colors_b[4]; + for (uint32_t i = 0; i < 4; i++) + { + store_all(block_colors_r[i], (int)pBlock_colors[i].r); + store_all(block_colors_g[i], (int)pBlock_colors[i].g); + store_all(block_colors_b[i], (int)pBlock_colors[i].b); + } + + const __m128i shuf = _mm_set_epi8(-128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, 12, 8, 4, 0); + + uint32_t i; + + for (i = 0; (i + 4) <= n; i += 4) + { + __m128i c0 = load_rgba32(&pSrc_pixels[i + 0]), c1 = load_rgba32(&pSrc_pixels[i + 1]), c2 = load_rgba32(&pSrc_pixels[i + 2]), c3 = load_rgba32(&pSrc_pixels[i + 3]); + + vint r, g, b, a; + transpose4x4(r.m_value, g.m_value, b.m_value, a.m_value, c0, c1, c2, c3); + + vint dist0 = compute_dist(block_colors_r[0], block_colors_g[0], block_colors_b[0], r, g, b); + vint dist1 = compute_dist(block_colors_r[1], block_colors_g[1], block_colors_b[1], r, g, b); + vint dist2 = compute_dist(block_colors_r[2], block_colors_g[2], block_colors_b[2], r, g, b); + vint dist3 = compute_dist(block_colors_r[3], block_colors_g[3], block_colors_b[3], r, g, b); + + vint min_dist = min(min(min(dist0, dist1), dist2), dist3); + + vint sels = spmd_ternaryi(min_dist == dist0, 0, spmd_ternaryi(min_dist == dist1, 1, spmd_ternaryi(min_dist == dist2, 2, 3))); + + __m128i vsels = shuffle_epi8(sels.m_value, shuf); + storeu_si32((void *)(pSelectors + i), vsels); + + *pDistance += reduce_add(min_dist); + if (*pDistance >= early_out_err) + return; + } + + for (; i < n; i++) + { + int r = pSrc_pixels[i].r, g = pSrc_pixels[i].g, b = pSrc_pixels[i].b; + + int best_err = INT_MAX, best_sel = 0; + for (int sel = 0; sel < 4; sel++) + { + int base_r = pBlock_colors[sel].r, base_g = pBlock_colors[sel].g, base_b = pBlock_colors[sel].b; + + int dr = base_r - r; + int dg = base_g - g; + int db = base_b - b; + + int id = dr * dr + dg * dg + db * db; + if (id < best_err) + { + best_err = id; + best_sel = sel; + } + } + + pSelectors[i] = (uint8_t)best_sel; + + *pDistance += best_err; + if (*pDistance >= early_out_err) + return; + } + } + }; + + struct find_lowest_error_perceptual_rgb_4_N : spmd_kernel + { + inline vint compute_dist( + const vint& base_r, const vint& base_g, const vint& base_b, + const vint& r, const vint& g, const vint& b) + { + vint dr = base_r - r; + vint dg = base_g - g; + vint db = base_b - b; + + vint delta_l = dr * 27 + dg * 92 + db * 9; + vint delta_cr = dr * 128 - delta_l; + vint delta_cb = db * 128 - delta_l; + + vint id = VINT_SHIFT_RIGHT(delta_l * delta_l, 7) + + VINT_SHIFT_RIGHT(VINT_SHIFT_RIGHT(delta_cr * delta_cr, 7) * 26, 7) + + VINT_SHIFT_RIGHT(VINT_SHIFT_RIGHT(delta_cb * delta_cb, 7) * 3, 7); + + return id; + } + + void _call(int64_t* pDistance, + const color_rgba* pBlock_colors, + const color_rgba* pSrc_pixels, uint32_t n, + int64_t early_out_error) + { + assert(early_out_error >= 0); + + *pDistance = 0; + + vint block_colors_r[4], block_colors_g[4], block_colors_b[4]; + for (uint32_t i = 0; i < 4; i++) + { + store_all(block_colors_r[i], (int)pBlock_colors[i].r); + store_all(block_colors_g[i], (int)pBlock_colors[i].g); + store_all(block_colors_b[i], (int)pBlock_colors[i].b); + } + + uint32_t i; + + for (i = 0; (i + 4) <= n; i += 4) + { + __m128i c0 = load_rgba32(&pSrc_pixels[i + 0]), c1 = load_rgba32(&pSrc_pixels[i + 1]), c2 = load_rgba32(&pSrc_pixels[i + 2]), c3 = load_rgba32(&pSrc_pixels[i + 3]); + + vint r, g, b, a; + transpose4x4(r.m_value, g.m_value, b.m_value, a.m_value, c0, c1, c2, c3); + + vint dist0 = compute_dist(block_colors_r[0], block_colors_g[0], block_colors_b[0], r, g, b); + vint dist1 = compute_dist(block_colors_r[1], block_colors_g[1], block_colors_b[1], r, g, b); + vint dist2 = compute_dist(block_colors_r[2], block_colors_g[2], block_colors_b[2], r, g, b); + vint dist3 = compute_dist(block_colors_r[3], block_colors_g[3], block_colors_b[3], r, g, b); + + vint min_dist = min(min(min(dist0, dist1), dist2), dist3); + + *pDistance += reduce_add(min_dist); + if (*pDistance > early_out_error) + return; + } + + for (; i < n; i++) + { + int r = pSrc_pixels[i].r, g = pSrc_pixels[i].g, b = pSrc_pixels[i].b; + + int best_err = INT_MAX; + for (int sel = 0; sel < 4; sel++) + { + int base_r = pBlock_colors[sel].r, base_g = pBlock_colors[sel].g, base_b = pBlock_colors[sel].b; + + int dr = base_r - r; + int dg = base_g - g; + int db = base_b - b; + + int delta_l = dr * 27 + dg * 92 + db * 9; + int delta_cr = dr * 128 - delta_l; + int delta_cb = db * 128 - delta_l; + + int id = ((delta_l * delta_l) >> 7) + + ((((delta_cr * delta_cr) >> 7) * 26) >> 7) + + ((((delta_cb * delta_cb) >> 7) * 3) >> 7); + + if (id < best_err) + { + best_err = id; + } + } + + *pDistance += best_err; + if (*pDistance > early_out_error) + return; + } + } + }; + + struct find_lowest_error_linear_rgb_4_N : spmd_kernel + { + inline vint compute_dist( + const vint& base_r, const vint& base_g, const vint& base_b, + const vint& r, const vint& g, const vint& b) + { + vint dr = base_r - r; + vint dg = base_g - g; + vint db = base_b - b; + + vint id = dr * dr + dg * dg + db * db; + + return id; + } + + void _call(int64_t* pDistance, + const color_rgba* pBlock_colors, + const color_rgba* pSrc_pixels, uint32_t n, + int64_t early_out_error) + { + assert(early_out_error >= 0); + + *pDistance = 0; + + vint block_colors_r[4], block_colors_g[4], block_colors_b[4]; + for (uint32_t i = 0; i < 4; i++) + { + store_all(block_colors_r[i], (int)pBlock_colors[i].r); + store_all(block_colors_g[i], (int)pBlock_colors[i].g); + store_all(block_colors_b[i], (int)pBlock_colors[i].b); + } + + uint32_t i; + + for (i = 0; (i + 4) <= n; i += 4) + { + __m128i c0 = load_rgba32(&pSrc_pixels[i + 0]), c1 = load_rgba32(&pSrc_pixels[i + 1]), c2 = load_rgba32(&pSrc_pixels[i + 2]), c3 = load_rgba32(&pSrc_pixels[i + 3]); + + vint r, g, b, a; + transpose4x4(r.m_value, g.m_value, b.m_value, a.m_value, c0, c1, c2, c3); + + vint dist0 = compute_dist(block_colors_r[0], block_colors_g[0], block_colors_b[0], r, g, b); + vint dist1 = compute_dist(block_colors_r[1], block_colors_g[1], block_colors_b[1], r, g, b); + vint dist2 = compute_dist(block_colors_r[2], block_colors_g[2], block_colors_b[2], r, g, b); + vint dist3 = compute_dist(block_colors_r[3], block_colors_g[3], block_colors_b[3], r, g, b); + + vint min_dist = min(min(min(dist0, dist1), dist2), dist3); + + *pDistance += reduce_add(min_dist); + if (*pDistance > early_out_error) + return; + } + + for (; i < n; i++) + { + int r = pSrc_pixels[i].r, g = pSrc_pixels[i].g, b = pSrc_pixels[i].b; + + int best_err = INT_MAX; + for (int sel = 0; sel < 4; sel++) + { + int base_r = pBlock_colors[sel].r, base_g = pBlock_colors[sel].g, base_b = pBlock_colors[sel].b; + + int dr = base_r - r; + int dg = base_g - g; + int db = base_b - b; + + int id = dr * dr + dg * dg + db * db; + + if (id < best_err) + { + best_err = id; + } + } + + *pDistance += best_err; + if (*pDistance > early_out_error) + return; + } + } + }; + + struct update_covar_matrix_16x16 : spmd_kernel + { + void _call( + uint32_t num_vecs, const void* pWeighted_vecs_void, const void* pOrigin_void, const uint32_t* pVec_indices, void* pMatrix16x16_void) + { + const std::pair* pWeighted_vecs = static_cast< const std::pair *>(pWeighted_vecs_void); + + const float* pOrigin = static_cast(pOrigin_void); + vfloat org0 = loadu_linear_all(pOrigin), org1 = loadu_linear_all(pOrigin + 4), org2 = loadu_linear_all(pOrigin + 8), org3 = loadu_linear_all(pOrigin + 12); + + vfloat mat[16][4]; + vfloat vzero(zero_vfloat()); + + for (uint32_t i = 0; i < 16; i++) + { + store_all(mat[i][0], vzero); + store_all(mat[i][1], vzero); + store_all(mat[i][2], vzero); + store_all(mat[i][3], vzero); + } + + for (uint32_t k = 0; k < num_vecs; k++) + { + const uint32_t vec_index = pVec_indices[k]; + + const float* pW = pWeighted_vecs[vec_index].first.get_ptr(); + vfloat weight((float)pWeighted_vecs[vec_index].second); + + vfloat vec[4] = { loadu_linear_all(pW) - org0, loadu_linear_all(pW + 4) - org1, loadu_linear_all(pW + 8) - org2, loadu_linear_all(pW + 12) - org3 }; + + vfloat wvec0 = vec[0] * weight, wvec1 = vec[1] * weight, wvec2 = vec[2] * weight, wvec3 = vec[3] * weight; + + for (uint32_t j = 0; j < 16; j++) + { + vfloat vx = ((const float*)vec)[j]; + + store_all(mat[j][0], mat[j][0] + vx * wvec0); + store_all(mat[j][1], mat[j][1] + vx * wvec1); + store_all(mat[j][2], mat[j][2] + vx * wvec2); + store_all(mat[j][3], mat[j][3] + vx * wvec3); + + } // j + + } // k + + float* pMatrix = static_cast(pMatrix16x16_void); + + float* pDst = pMatrix; + for (uint32_t i = 0; i < 16; i++) + { + storeu_linear_all(pDst, mat[i][0]); + storeu_linear_all(pDst + 4, mat[i][1]); + storeu_linear_all(pDst + 8, mat[i][2]); + storeu_linear_all(pDst + 12, mat[i][3]); + pDst += 16; + } + } + }; + +} // namespace + +using namespace CPPSPMD_NAME(basisu_kernels_namespace); + +void CPPSPMD_NAME(perceptual_distance_rgb_4_N)(int64_t* pDistance, const uint8_t* pSelectors, const color_rgba* pBlock_colors, const color_rgba* pSrc_pixels, uint32_t n, int64_t early_out_err) +{ + spmd_call< perceptual_distance_rgb_4_N >(pDistance, pSelectors, pBlock_colors, pSrc_pixels, n, early_out_err); +} + +void CPPSPMD_NAME(linear_distance_rgb_4_N)(int64_t* pDistance, const uint8_t* pSelectors, const color_rgba* pBlock_colors, const color_rgba* pSrc_pixels, uint32_t n, int64_t early_out_err) +{ + spmd_call< linear_distance_rgb_4_N >(pDistance, pSelectors, pBlock_colors, pSrc_pixels, n, early_out_err); +} + +void CPPSPMD_NAME(find_selectors_perceptual_rgb_4_N)(int64_t *pDistance, uint8_t* pSelectors, const color_rgba* pBlock_colors, const color_rgba* pSrc_pixels, uint32_t n, int64_t early_out_err) +{ + spmd_call< find_selectors_perceptual_rgb_4_N >(pDistance, pSelectors, pBlock_colors, pSrc_pixels, n, early_out_err); +} + +void CPPSPMD_NAME(find_selectors_linear_rgb_4_N)(int64_t* pDistance, uint8_t* pSelectors, const color_rgba* pBlock_colors, const color_rgba* pSrc_pixels, uint32_t n, int64_t early_out_err) +{ + spmd_call< find_selectors_linear_rgb_4_N >(pDistance, pSelectors, pBlock_colors, pSrc_pixels, n, early_out_err); +} + +void CPPSPMD_NAME(find_lowest_error_perceptual_rgb_4_N)(int64_t* pDistance, const color_rgba* pBlock_colors, const color_rgba* pSrc_pixels, uint32_t n, int64_t early_out_error) +{ + spmd_call< find_lowest_error_perceptual_rgb_4_N >(pDistance, pBlock_colors, pSrc_pixels, n, early_out_error); +} + +void CPPSPMD_NAME(find_lowest_error_linear_rgb_4_N)(int64_t* pDistance, const color_rgba* pBlock_colors, const color_rgba* pSrc_pixels, uint32_t n, int64_t early_out_error) +{ + spmd_call< find_lowest_error_linear_rgb_4_N >(pDistance, pBlock_colors, pSrc_pixels, n, early_out_error); +} + +void CPPSPMD_NAME(update_covar_matrix_16x16)(uint32_t num_vecs, const void* pWeighted_vecs, const void* pOrigin, const uint32_t *pVec_indices, void* pMatrix16x16) +{ + spmd_call < update_covar_matrix_16x16 >(num_vecs, pWeighted_vecs, pOrigin, pVec_indices, pMatrix16x16); +} diff --git a/ktx/external/basisu/encoder/basisu_kernels_sse.cpp b/ktx/external/basisu/encoder/basisu_kernels_sse.cpp new file mode 100644 index 0000000..4f15a5a --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_kernels_sse.cpp @@ -0,0 +1,161 @@ +// basisu_kernels_sse.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_enc.h" + +#if BASISU_SUPPORT_SSE + +#define CPPSPMD_SSE2 0 + +#ifdef _MSC_VER +#include +#endif + +#if !defined(_MSC_VER) + #if __AVX__ || __AVX2__ || __AVX512F__ + #error Please check your compiler options + #endif + + #if CPPSPMD_SSE2 + #if __SSE4_1__ || __SSE3__ || __SSE4_2__ || __SSSE3__ + #error SSE4.1/SSE3/SSE4.2/SSSE3 cannot be enabled to use this file + #endif + #else + #if !__SSE4_1__ || !__SSE3__ || !__SSSE3__ + #error Please check your compiler options + #endif + #endif +#endif + +#include "cppspmd_sse.h" + +#include "cppspmd_type_aliases.h" + +using namespace basisu; + +#include "basisu_kernels_declares.h" +#include "basisu_kernels_imp.h" + +namespace basisu +{ + +struct cpu_info +{ + cpu_info() { memset(this, 0, sizeof(*this)); } + + bool m_has_fpu; + bool m_has_mmx; + bool m_has_sse; + bool m_has_sse2; + bool m_has_sse3; + bool m_has_ssse3; + bool m_has_sse41; + bool m_has_sse42; + bool m_has_avx; + bool m_has_avx2; + bool m_has_pclmulqdq; +}; + +static void extract_x86_flags(cpu_info &info, uint32_t ecx, uint32_t edx) +{ + info.m_has_fpu = (edx & (1 << 0)) != 0; + info.m_has_mmx = (edx & (1 << 23)) != 0; + info.m_has_sse = (edx & (1 << 25)) != 0; + info.m_has_sse2 = (edx & (1 << 26)) != 0; + info.m_has_sse3 = (ecx & (1 << 0)) != 0; + info.m_has_ssse3 = (ecx & (1 << 9)) != 0; + info.m_has_sse41 = (ecx & (1 << 19)) != 0; + info.m_has_sse42 = (ecx & (1 << 20)) != 0; + info.m_has_pclmulqdq = (ecx & (1 << 1)) != 0; + info.m_has_avx = (ecx & (1 << 28)) != 0; +} + +static void extract_x86_extended_flags(cpu_info &info, uint32_t ebx) +{ + info.m_has_avx2 = (ebx & (1 << 5)) != 0; +} + +#ifndef _MSC_VER +static void do_cpuid(uint32_t eax, uint32_t ecx, uint32_t* regs) +{ + uint32_t ebx = 0, edx = 0; + +#if defined(__PIC__) && defined(__i386__) + __asm__("movl %%ebx, %%edi;" + "cpuid;" + "xchgl %%ebx, %%edi;" + : "=D"(ebx), "+a"(eax), "+c"(ecx), "=d"(edx)); +#else + __asm__("cpuid;" : "+b"(ebx), "+a"(eax), "+c"(ecx), "=d"(edx)); +#endif + + regs[0] = eax; regs[1] = ebx; regs[2] = ecx; regs[3] = edx; +} +#endif + +static void get_cpuinfo(cpu_info &info) +{ + int regs[4]; + +#ifdef _MSC_VER + __cpuid(regs, 0); +#else + do_cpuid(0, 0, (uint32_t *)regs); +#endif + + const uint32_t max_eax = regs[0]; + + if (max_eax >= 1U) + { +#ifdef _MSC_VER + __cpuid(regs, 1); +#else + do_cpuid(1, 0, (uint32_t*)regs); +#endif + extract_x86_flags(info, regs[2], regs[3]); + } + + if (max_eax >= 7U) + { +#ifdef _MSC_VER + __cpuidex(regs, 7, 0); +#else + do_cpuid(7, 0, (uint32_t*)regs); +#endif + + extract_x86_extended_flags(info, regs[1]); + } +} + +void detect_sse41() +{ + cpu_info info; + get_cpuinfo(info); + + // Check for everything from SSE to SSE 4.1 + g_cpu_supports_sse41 = info.m_has_sse && info.m_has_sse2 && info.m_has_sse3 && info.m_has_ssse3 && info.m_has_sse41; +} + +} // namespace basisu +#else // #if BASISU_SUPPORT_SSE +namespace basisu +{ + +void detect_sse41() +{ +} + +} // namespace basisu +#endif // #if BASISU_SUPPORT_SSE + diff --git a/ktx/external/basisu/encoder/basisu_miniz.h b/ktx/external/basisu/encoder/basisu_miniz.h new file mode 100644 index 0000000..a897abc --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_miniz.h @@ -0,0 +1,2538 @@ +/* miniz.c v1.15 - deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing + Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt + + Forked from the public domain/unlicense version at: https://code.google.com/archive/p/miniz/ + + Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. + + 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. +*/ + +#ifndef MINIZ_HEADER_INCLUDED +#define MINIZ_HEADER_INCLUDED + +#include + +// Defines to completely disable specific portions of miniz.c: +// If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl. + +// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O. +//#define MINIZ_NO_STDIO + +// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current time, or +// get/set file times, and the C run-time funcs that get/set times won't be called. +// The current downside is the times written to your archives will be from 1979. +//#define MINIZ_NO_TIME + +// Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's. +//#define MINIZ_NO_ARCHIVE_APIS + +// Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive API's. +//#define MINIZ_NO_ARCHIVE_WRITING_APIS + +// Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression API's. +//#define MINIZ_NO_ZLIB_APIS + +// Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent conflicts against stock zlib. +//#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES + +// Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc. +// Note if MINIZ_NO_MALLOC is defined then the user must always provide custom user alloc/free/realloc +// callbacks to the zlib and archive API's, and a few stand-alone helper API's which don't provide custom user +// functions (such as tdefl_compress_mem_to_heap() and tinfl_decompress_mem_to_heap()) won't work. +//#define MINIZ_NO_MALLOC + +#if defined(__TINYC__) && (defined(__linux) || defined(__linux__)) + // TODO: Work around "error: include file 'sys\utime.h' when compiling with tcc on Linux + #define MINIZ_NO_TIME +#endif + +#if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS) + #include +#endif + +#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__i386) || defined(__i486__) || defined(__i486) || defined(i386) || defined(__ia64__) || defined(__x86_64__) +// MINIZ_X86_OR_X64_CPU is only used to help set the below macros. +#define MINIZ_X86_OR_X64_CPU 1 +#endif + +#if (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU +// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. +#define MINIZ_LITTLE_ENDIAN 1 +#endif + +#if MINIZ_X86_OR_X64_CPU +// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses. +#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 +#endif + +// Using unaligned loads and stores causes errors when using UBSan. Jam it off. +#if defined(__has_feature) +#if __has_feature(undefined_behavior_sanitizer) +#undef MINIZ_USE_UNALIGNED_LOADS_AND_STORES +#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 0 +#endif +#endif + +#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) || defined(__ia64__) || defined(__x86_64__) +// Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are reasonably fast (and don't involve compiler generated calls to helper functions). +#define MINIZ_HAS_64BIT_REGISTERS 1 +#endif + +namespace buminiz { + +// ------------------- zlib-style API Definitions. + +// For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. Beware: mz_ulong can be either 32 or 64-bits! +typedef unsigned long mz_ulong; + +// mz_free() internally uses the MZ_FREE() macro (which by default calls free() unless you've modified the MZ_MALLOC macro) to release a block allocated from the heap. +void mz_free(void *p); + +#define MZ_ADLER32_INIT (1) +// mz_adler32() returns the initial adler-32 value to use when called with ptr==NULL. +mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len); + +#define MZ_CRC32_INIT (0) +// mz_crc32() returns the initial CRC-32 value to use when called with ptr==NULL. +mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len); + +// Compression strategies. +enum { MZ_DEFAULT_STRATEGY = 0, MZ_FILTERED = 1, MZ_HUFFMAN_ONLY = 2, MZ_RLE = 3, MZ_FIXED = 4 }; + +// Method +#define MZ_DEFLATED 8 + +#ifndef MINIZ_NO_ZLIB_APIS + +// Heap allocation callbacks. +// Note that mz_alloc_func parameter types purpsosely differ from zlib's: items/size is size_t, not unsigned long. +typedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size); +typedef void (*mz_free_func)(void *opaque, void *address); +typedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items, size_t size); + +#define MZ_VERSION "9.1.15" +#define MZ_VERNUM 0x91F0 +#define MZ_VER_MAJOR 9 +#define MZ_VER_MINOR 1 +#define MZ_VER_REVISION 15 +#define MZ_VER_SUBREVISION 0 + +// Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other values are for advanced use (refer to the zlib docs). +enum { MZ_NO_FLUSH = 0, MZ_PARTIAL_FLUSH = 1, MZ_SYNC_FLUSH = 2, MZ_FULL_FLUSH = 3, MZ_FINISH = 4, MZ_BLOCK = 5 }; + +// Return status codes. MZ_PARAM_ERROR is non-standard. +enum { MZ_OK = 0, MZ_STREAM_END = 1, MZ_NEED_DICT = 2, MZ_ERRNO = -1, MZ_STREAM_ERROR = -2, MZ_DATA_ERROR = -3, MZ_MEM_ERROR = -4, MZ_BUF_ERROR = -5, MZ_VERSION_ERROR = -6, MZ_PARAM_ERROR = -10000 }; + +// Compression levels: 0-9 are the standard zlib-style levels, 10 is best possible compression (not zlib compatible, and may be very slow), MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL. +enum { MZ_NO_COMPRESSION = 0, MZ_BEST_SPEED = 1, MZ_BEST_COMPRESSION = 9, MZ_UBER_COMPRESSION = 10, MZ_DEFAULT_LEVEL = 6, MZ_DEFAULT_COMPRESSION = -1 }; + +// Window bits +#define MZ_DEFAULT_WINDOW_BITS 15 + +struct mz_internal_state; + +// Compression/decompression stream struct. +typedef struct mz_stream_s +{ + const unsigned char *next_in; // pointer to next byte to read + unsigned int avail_in; // number of bytes available at next_in + mz_ulong total_in; // total number of bytes consumed so far + + unsigned char *next_out; // pointer to next byte to write + unsigned int avail_out; // number of bytes that can be written to next_out + mz_ulong total_out; // total number of bytes produced so far + + char *msg; // error msg (unused) + struct mz_internal_state *state; // internal state, allocated by zalloc/zfree + + mz_alloc_func zalloc; // optional heap allocation function (defaults to malloc) + mz_free_func zfree; // optional heap free function (defaults to free) + void *opaque; // heap alloc function user pointer + + int data_type; // data_type (unused) + mz_ulong adler; // adler32 of the source or uncompressed data + mz_ulong reserved; // not used +} mz_stream; + +typedef mz_stream *mz_streamp; + +// Returns the version string of miniz.c. +const char *mz_version(void); + +// mz_deflateInit() initializes a compressor with default options: +// Parameters: +// pStream must point to an initialized mz_stream struct. +// level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION]. +// level 1 enables a specially optimized compression function that's been optimized purely for performance, not ratio. +// (This special func. is currently only enabled when MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.) +// Return values: +// MZ_OK on success. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_PARAM_ERROR if the input parameters are bogus. +// MZ_MEM_ERROR on out of memory. +int mz_deflateInit(mz_streamp pStream, int level); + +// mz_deflateInit2() is like mz_deflate(), except with more control: +// Additional parameters: +// method must be MZ_DEFLATED +// window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no header or footer) +// mem_level must be between [1, 9] (it's checked but ignored by miniz.c) +int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy); + +// Quickly resets a compressor without having to reallocate anything. Same as calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2(). +int mz_deflateReset(mz_streamp pStream); + +// mz_deflate() compresses the input to output, consuming as much of the input and producing as much output as possible. +// Parameters: +// pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. +// flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or MZ_FINISH. +// Return values: +// MZ_OK on success (when flushing, or if more input is needed but not available, and/or there's more output to be written but the output buffer is full). +// MZ_STREAM_END if all input has been consumed and all output bytes have been written. Don't call mz_deflate() on the stream anymore. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_PARAM_ERROR if one of the parameters is invalid. +// MZ_BUF_ERROR if no forward progress is possible because the input and/or output buffers are empty. (Fill up the input buffer or free up some output space and try again.) +int mz_deflate(mz_streamp pStream, int flush); + +// mz_deflateEnd() deinitializes a compressor: +// Return values: +// MZ_OK on success. +// MZ_STREAM_ERROR if the stream is bogus. +int mz_deflateEnd(mz_streamp pStream); + +// mz_deflateBound() returns a (very) conservative upper bound on the amount of data that could be generated by deflate(), assuming flush is set to only MZ_NO_FLUSH or MZ_FINISH. +mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len); + +// Single-call compression functions mz_compress() and mz_compress2(): +// Returns MZ_OK on success, or one of the error codes from mz_deflate() on failure. +int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len); +int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level); + +// mz_compressBound() returns a (very) conservative upper bound on the amount of data that could be generated by calling mz_compress(). +mz_ulong mz_compressBound(mz_ulong source_len); + +// Initializes a decompressor. +int mz_inflateInit(mz_streamp pStream); + +// mz_inflateInit2() is like mz_inflateInit() with an additional option that controls the window size and whether or not the stream has been wrapped with a zlib header/footer: +// window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate). +int mz_inflateInit2(mz_streamp pStream, int window_bits); + +// Decompresses the input stream to the output, consuming only as much of the input as needed, and writing as much to the output as possible. +// Parameters: +// pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. +// flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH. +// On the first call, if flush is MZ_FINISH it's assumed the input and output buffers are both sized large enough to decompress the entire stream in a single call (this is slightly faster). +// MZ_FINISH implies that there are no more source bytes available beside what's already in the input buffer, and that the output buffer is large enough to hold the rest of the decompressed data. +// Return values: +// MZ_OK on success. Either more input is needed but not available, and/or there's more output to be written but the output buffer is full. +// MZ_STREAM_END if all needed input has been consumed and all output bytes have been written. For zlib streams, the adler-32 of the decompressed data has also been verified. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_DATA_ERROR if the deflate stream is invalid. +// MZ_PARAM_ERROR if one of the parameters is invalid. +// MZ_BUF_ERROR if no forward progress is possible because the input buffer is empty but the inflater needs more input to continue, or if the output buffer is not large enough. Call mz_inflate() again +// with more input data, or with more room in the output buffer (except when using single call decompression, described above). +int mz_inflate(mz_streamp pStream, int flush); +int mz_inflate2(mz_streamp pStream, int flush, int adler32_checking); + +// Deinitializes a decompressor. +int mz_inflateEnd(mz_streamp pStream); + +// Single-call decompression. +// Returns MZ_OK on success, or one of the error codes from mz_inflate() on failure. +int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len); + +// Returns a string description of the specified error code, or NULL if the error code is invalid. +const char *mz_error(int err); + +// Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used as a drop-in replacement for the subset of zlib that miniz.c supports. +// Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you use zlib in the same project. +#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES + typedef unsigned char Byte; + typedef unsigned int uInt; + typedef mz_ulong uLong; + typedef Byte Bytef; + typedef uInt uIntf; + typedef char charf; + typedef int intf; + typedef void *voidpf; + typedef uLong uLongf; + typedef void *voidp; + typedef void *const voidpc; + #define Z_NULL 0 + #define Z_NO_FLUSH MZ_NO_FLUSH + #define Z_PARTIAL_FLUSH MZ_PARTIAL_FLUSH + #define Z_SYNC_FLUSH MZ_SYNC_FLUSH + #define Z_FULL_FLUSH MZ_FULL_FLUSH + #define Z_FINISH MZ_FINISH + #define Z_BLOCK MZ_BLOCK + #define Z_OK MZ_OK + #define Z_STREAM_END MZ_STREAM_END + #define Z_NEED_DICT MZ_NEED_DICT + #define Z_ERRNO MZ_ERRNO + #define Z_STREAM_ERROR MZ_STREAM_ERROR + #define Z_DATA_ERROR MZ_DATA_ERROR + #define Z_MEM_ERROR MZ_MEM_ERROR + #define Z_BUF_ERROR MZ_BUF_ERROR + #define Z_VERSION_ERROR MZ_VERSION_ERROR + #define Z_PARAM_ERROR MZ_PARAM_ERROR + #define Z_NO_COMPRESSION MZ_NO_COMPRESSION + #define Z_BEST_SPEED MZ_BEST_SPEED + #define Z_BEST_COMPRESSION MZ_BEST_COMPRESSION + #define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION + #define Z_DEFAULT_STRATEGY MZ_DEFAULT_STRATEGY + #define Z_FILTERED MZ_FILTERED + #define Z_HUFFMAN_ONLY MZ_HUFFMAN_ONLY + #define Z_RLE MZ_RLE + #define Z_FIXED MZ_FIXED + #define Z_DEFLATED MZ_DEFLATED + #define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS + #define alloc_func mz_alloc_func + #define free_func mz_free_func + #define internal_state mz_internal_state + #define z_stream mz_stream + #define deflateInit mz_deflateInit + #define deflateInit2 mz_deflateInit2 + #define deflateReset mz_deflateReset + #define deflate mz_deflate + #define deflateEnd mz_deflateEnd + #define deflateBound mz_deflateBound + #define compress mz_compress + #define compress2 mz_compress2 + #define compressBound mz_compressBound + #define inflateInit mz_inflateInit + #define inflateInit2 mz_inflateInit2 + #define inflate mz_inflate + #define inflateEnd mz_inflateEnd + #define uncompress mz_uncompress + #define crc32 mz_crc32 + #define adler32 mz_adler32 + #define MAX_WBITS 15 + #define MAX_MEM_LEVEL 9 + #define zError mz_error + #define ZLIB_VERSION MZ_VERSION + #define ZLIB_VERNUM MZ_VERNUM + #define ZLIB_VER_MAJOR MZ_VER_MAJOR + #define ZLIB_VER_MINOR MZ_VER_MINOR + #define ZLIB_VER_REVISION MZ_VER_REVISION + #define ZLIB_VER_SUBREVISION MZ_VER_SUBREVISION + #define zlibVersion mz_version + #define zlib_version mz_version() +#endif // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES + +#endif // MINIZ_NO_ZLIB_APIS + +// ------------------- Types and macros + +typedef unsigned char mz_uint8; +typedef signed short mz_int16; +typedef unsigned short mz_uint16; +typedef unsigned int mz_uint32; +typedef unsigned int mz_uint; +typedef long long mz_int64; +typedef unsigned long long mz_uint64; +typedef int mz_bool; + +#define MZ_FALSE (0) +#define MZ_TRUE (1) + +// An attempt to work around MSVC's spammy "warning C4127: conditional expression is constant" message. +#ifdef _MSC_VER + #define MZ_MACRO_END while (0, 0) +#else + #define MZ_MACRO_END while (0) +#endif + +// ------------------- Low-level Decompression API Definitions + +// Decompression flags used by tinfl_decompress(). +// TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream. +// TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the supplied input buffer. If clear, the input buffer contains all remaining input. +// TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the entire decompressed stream. If clear, the output buffer is at least the size of the dictionary (typically 32KB). +// TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes. +enum +{ + TINFL_FLAG_PARSE_ZLIB_HEADER = 1, + TINFL_FLAG_HAS_MORE_INPUT = 2, + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4, + TINFL_FLAG_COMPUTE_ADLER32 = 8 +}; + +// High level decompression functions: +// tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc(). +// On entry: +// pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress. +// On return: +// Function returns a pointer to the decompressed data, or NULL on failure. +// *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data. +// The caller must call mz_free() on the returned block when it's no longer needed. +void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags); + +// tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory. +// Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success. +#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1)) +size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); + +// tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer. +// Returns 1 on success or 0 on failure. +typedef int (*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser); +int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + +struct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor; + +// Max size of LZ dictionary. +#define TINFL_LZ_DICT_SIZE 32768 + +// Return status. +typedef enum +{ + TINFL_STATUS_BAD_PARAM = -3, + TINFL_STATUS_ADLER32_MISMATCH = -2, + TINFL_STATUS_FAILED = -1, + TINFL_STATUS_DONE = 0, + TINFL_STATUS_NEEDS_MORE_INPUT = 1, + TINFL_STATUS_HAS_MORE_OUTPUT = 2 +} tinfl_status; + +// Initializes the decompressor to its initial state. +#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END +#define tinfl_get_adler32(r) (r)->m_check_adler32 + +// Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability. +// This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output. +tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags); + +// Internal/private bits follow. +enum +{ + TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19, + TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS +}; + +typedef struct +{ + mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0]; + mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2]; +} tinfl_huff_table; + +#if MINIZ_HAS_64BIT_REGISTERS + #define TINFL_USE_64BIT_BITBUF 1 +#endif + +#if TINFL_USE_64BIT_BITBUF + typedef mz_uint64 tinfl_bit_buf_t; + #define TINFL_BITBUF_SIZE (64) +#else + typedef mz_uint32 tinfl_bit_buf_t; + #define TINFL_BITBUF_SIZE (32) +#endif + +struct tinfl_decompressor_tag +{ + mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES]; + tinfl_bit_buf_t m_bit_buf; + size_t m_dist_from_out_buf_start; + tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES]; + mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137]; +}; + +// ------------------- Low-level Compression API Definitions + +// Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly slower, and raw/dynamic blocks will be output more frequently). +#define TDEFL_LESS_MEMORY 0 + +// tdefl_init() compression flags logically OR'd together (low 12 bits contain the max. number of probes per dictionary search): +// TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap compression), 4095=Huffman+LZ (slowest/best compression). +enum +{ + TDEFL_HUFFMAN_ONLY = 0, TDEFL_DEFAULT_MAX_PROBES = 128, TDEFL_MAX_PROBES_MASK = 0xFFF +}; + +// TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before the deflate data, and the Adler-32 of the source data at the end. Otherwise, you'll get raw deflate data. +// TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even when not writing zlib headers). +// TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more efficient lazy parsing. +// TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's initialization time to the minimum, but the output may vary from run to run given the same input (depending on the contents of memory). +// TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1) +// TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled. +// TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables. +// TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks. +// The low 12 bits are reserved to control the max # of hash probes per dictionary lookup (see TDEFL_MAX_PROBES_MASK). +enum +{ + TDEFL_WRITE_ZLIB_HEADER = 0x01000, + TDEFL_COMPUTE_ADLER32 = 0x02000, + TDEFL_GREEDY_PARSING_FLAG = 0x04000, + TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000, + TDEFL_RLE_MATCHES = 0x10000, + TDEFL_FILTER_MATCHES = 0x20000, + TDEFL_FORCE_ALL_STATIC_BLOCKS = 0x40000, + TDEFL_FORCE_ALL_RAW_BLOCKS = 0x80000 +}; + +// High level compression functions: +// tdefl_compress_mem_to_heap() compresses a block in memory to a heap block allocated via malloc(). +// On entry: +// pSrc_buf, src_buf_len: Pointer and size of source block to compress. +// flags: The max match finder probes (default is 128) logically OR'd against the above flags. Higher probes are slower but improve compression. +// On return: +// Function returns a pointer to the compressed data, or NULL on failure. +// *pOut_len will be set to the compressed data's size, which could be larger than src_buf_len on uncompressible data. +// The caller must free() the returned block when it's no longer needed. +void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags); + +// tdefl_compress_mem_to_mem() compresses a block in memory to another block in memory. +// Returns 0 on failure. +size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); + +// Compresses an image to a compressed PNG file in memory. +// On entry: +// pImage, w, h, and num_chans describe the image to compress. num_chans may be 1, 2, 3, or 4. +// The image pitch in bytes per scanline will be w*num_chans. The leftmost pixel on the top scanline is stored first in memory. +// level may range from [0,10], use MZ_NO_COMPRESSION, MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc. or a decent default is MZ_DEFAULT_LEVEL +// If flip is true, the image will be flipped on the Y axis (useful for OpenGL apps). +// On return: +// Function returns a pointer to the compressed data, or NULL on failure. +// *pLen_out will be set to the size of the PNG image file. +// The caller must mz_free() the returned heap block (which will typically be larger than *pLen_out) when it's no longer needed. +void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip); +void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out); + +// Output stream interface. The compressor uses this interface to write compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time. +typedef mz_bool (*tdefl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser); + +// tdefl_compress_mem_to_output() compresses a block to an output stream. The above helpers use this function internally. +mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + +enum { TDEFL_MAX_HUFF_TABLES = 3, TDEFL_MAX_HUFF_SYMBOLS_0 = 288, TDEFL_MAX_HUFF_SYMBOLS_1 = 32, TDEFL_MAX_HUFF_SYMBOLS_2 = 19, TDEFL_LZ_DICT_SIZE = 32768, TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1, TDEFL_MIN_MATCH_LEN = 3, TDEFL_MAX_MATCH_LEN = 258 }; + +// TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed output block (using static/fixed Huffman codes). +#if TDEFL_LESS_MEMORY +enum { TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 12, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; +#else +enum { TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 15, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; +#endif + +// The low-level tdefl functions below may be used directly if the above helper functions aren't flexible enough. The low-level functions don't make any heap allocations, unlike the above helper functions. +typedef enum +{ + TDEFL_STATUS_BAD_PARAM = -2, + TDEFL_STATUS_PUT_BUF_FAILED = -1, + TDEFL_STATUS_OKAY = 0, + TDEFL_STATUS_DONE = 1, +} tdefl_status; + +// Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums +typedef enum +{ + TDEFL_NO_FLUSH = 0, + TDEFL_SYNC_FLUSH = 2, + TDEFL_FULL_FLUSH = 3, + TDEFL_FINISH = 4 +} tdefl_flush; + +// tdefl's compression state structure. +typedef struct +{ + tdefl_put_buf_func_ptr m_pPut_buf_func; + void *m_pPut_buf_user; + mz_uint m_flags, m_max_probes[2]; + int m_greedy_parsing; + mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size; + mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end; + mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in, m_bit_buffer; + mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index, m_wants_to_finish; + tdefl_status m_prev_return_status; + const void *m_pIn_buf; + void *m_pOut_buf; + size_t *m_pIn_buf_size, *m_pOut_buf_size; + tdefl_flush m_flush; + const mz_uint8 *m_pSrc; + size_t m_src_buf_left, m_out_buf_ofs; + mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1]; + mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE]; + mz_uint16 m_next[TDEFL_LZ_DICT_SIZE]; + mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE]; + mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE]; +} tdefl_compressor; + +// Initializes the compressor. +// There is no corresponding deinit() function because the tdefl API's do not dynamically allocate memory. +// pBut_buf_func: If NULL, output data will be supplied to the specified callback. In this case, the user should call the tdefl_compress_buffer() API for compression. +// If pBut_buf_func is NULL the user should always call the tdefl_compress() API. +// flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER, etc.) +tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + +// Compresses a block of data, consuming as much of the specified input buffer as possible, and writing as much compressed data to the specified output buffer as possible. +tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush); + +// tdefl_compress_buffer() is only usable when the tdefl_init() is called with a non-NULL tdefl_put_buf_func_ptr. +// tdefl_compress_buffer() always consumes the entire input buffer. +tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush); + +tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d); +mz_uint32 tdefl_get_adler32(tdefl_compressor *d); + +// Can't use tdefl_create_comp_flags_from_zip_params if MINIZ_NO_ZLIB_APIS isn't defined, because it uses some of its macros. +#ifndef MINIZ_NO_ZLIB_APIS +// Create tdefl_compress() flags given zlib-style compression parameters. +// level may range from [0,10] (where 10 is absolute max compression, but may be much slower on some files) +// window_bits may be -15 (raw deflate) or 15 (zlib) +// strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, MZ_RLE, or MZ_FIXED +mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy); +#endif // #ifndef MINIZ_NO_ZLIB_APIS + +} // namespace buminiz + +#endif // MINIZ_HEADER_INCLUDED + +// ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.) + +#ifndef MINIZ_HEADER_FILE_ONLY + +#include +#include + +namespace buminiz { + +typedef unsigned char mz_validate_uint16[sizeof(mz_uint16)==2 ? 1 : -1]; +typedef unsigned char mz_validate_uint32[sizeof(mz_uint32)==4 ? 1 : -1]; +typedef unsigned char mz_validate_uint64[sizeof(mz_uint64)==8 ? 1 : -1]; + +#define MZ_ASSERT(x) assert(x) + +#ifdef MINIZ_NO_MALLOC + #define MZ_MALLOC(x) NULL + #define MZ_FREE(x) (void)x, ((void)0) + #define MZ_REALLOC(p, x) NULL +#else + #define MZ_MALLOC(x) malloc(x) + #define MZ_FREE(x) free(x) + #define MZ_REALLOC(p, x) realloc(p, x) +#endif + +#define MZ_MAX(a,b) (((a)>(b))?(a):(b)) +#define MZ_MIN(a,b) (((a)<(b))?(a):(b)) +#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj)) + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + #define MZ_READ_LE16(p) *((const mz_uint16 *)(p)) + #define MZ_READ_LE32(p) *((const mz_uint32 *)(p)) +#else + #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U)) + #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U)) +#endif + +#ifdef _MSC_VER + #define MZ_FORCEINLINE __forceinline +#elif defined(__GNUC__) + #define MZ_FORCEINLINE inline __attribute__((__always_inline__)) +#else + #define MZ_FORCEINLINE inline +#endif + +// ------------------- zlib-style API's + +mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len) +{ + mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16); size_t block_len = buf_len % 5552; + if (!ptr) return MZ_ADLER32_INIT; + while (buf_len) { + for (i = 0; i + 7 < block_len; i += 8, ptr += 8) { + s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1; + s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1; + } + for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1; + s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552; + } + return (s2 << 16) + s1; +} + +// Karl Malbrain's compact CRC-32. See "A compact CCITT crc16 and crc32 C implementation that balances processor cache usage against speed": http://www.geocities.com/malbrain/ +mz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len) +{ + static const mz_uint32 s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c }; + mz_uint32 crcu32 = (mz_uint32)crc; + if (!ptr) return MZ_CRC32_INIT; + crcu32 = ~crcu32; while (buf_len--) { mz_uint8 b = *ptr++; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)]; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)]; } + return ~crcu32; +} + +void mz_free(void *p) +{ + MZ_FREE(p); +} + +#ifndef MINIZ_NO_ZLIB_APIS + +static void *def_alloc_func(void *opaque, size_t items, size_t size) { (void)opaque, (void)items, (void)size; return MZ_MALLOC(items * size); } +static void def_free_func(void *opaque, void *address) { (void)opaque, (void)address; MZ_FREE(address); } +//static void *def_realloc_func(void *opaque, void *address, size_t items, size_t size) { (void)opaque, (void)address, (void)items, (void)size; return MZ_REALLOC(address, items * size); } + +const char *mz_version(void) +{ + return MZ_VERSION; +} + +int mz_deflateInit(mz_streamp pStream, int level) +{ + return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9, MZ_DEFAULT_STRATEGY); +} + +int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy) +{ + tdefl_compressor *pComp; + mz_uint comp_flags = TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy); + + if (!pStream) return MZ_STREAM_ERROR; + if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) || ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS))) return MZ_PARAM_ERROR; + + pStream->data_type = 0; + pStream->adler = MZ_ADLER32_INIT; + pStream->msg = NULL; + pStream->reserved = 0; + pStream->total_in = 0; + pStream->total_out = 0; + if (!pStream->zalloc) pStream->zalloc = def_alloc_func; + if (!pStream->zfree) pStream->zfree = def_free_func; + + pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1, sizeof(tdefl_compressor)); + if (!pComp) + return MZ_MEM_ERROR; + + pStream->state = (struct mz_internal_state *)pComp; + + if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY) + { + mz_deflateEnd(pStream); + return MZ_PARAM_ERROR; + } + + return MZ_OK; +} + +int mz_deflateReset(mz_streamp pStream) +{ + if ((!pStream) || (!pStream->state) || (!pStream->zalloc) || (!pStream->zfree)) return MZ_STREAM_ERROR; + pStream->total_in = pStream->total_out = 0; + tdefl_init((tdefl_compressor*)pStream->state, NULL, NULL, ((tdefl_compressor*)pStream->state)->m_flags); + return MZ_OK; +} + +int mz_deflate(mz_streamp pStream, int flush) +{ + size_t in_bytes, out_bytes; + mz_ulong orig_total_in, orig_total_out; + int mz_status = MZ_OK; + + if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) || (!pStream->next_out)) return MZ_STREAM_ERROR; + if (!pStream->avail_out) return MZ_BUF_ERROR; + + if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH; + + if (((tdefl_compressor*)pStream->state)->m_prev_return_status == TDEFL_STATUS_DONE) + return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR; + + orig_total_in = pStream->total_in; orig_total_out = pStream->total_out; + for ( ; ; ) + { + tdefl_status defl_status; + in_bytes = pStream->avail_in; out_bytes = pStream->avail_out; + + defl_status = tdefl_compress((tdefl_compressor*)pStream->state, pStream->next_in, &in_bytes, pStream->next_out, &out_bytes, (tdefl_flush)flush); + pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; + pStream->total_in += (mz_uint)in_bytes; pStream->adler = tdefl_get_adler32((tdefl_compressor*)pStream->state); + + pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; + pStream->total_out += (mz_uint)out_bytes; + + if (defl_status < 0) + { + mz_status = MZ_STREAM_ERROR; + break; + } + else if (defl_status == TDEFL_STATUS_DONE) + { + mz_status = MZ_STREAM_END; + break; + } + else if (!pStream->avail_out) + break; + else if ((!pStream->avail_in) && (flush != MZ_FINISH)) + { + if ((flush) || (pStream->total_in != orig_total_in) || (pStream->total_out != orig_total_out)) + break; + return MZ_BUF_ERROR; // Can't make forward progress without some input. + } + } + return mz_status; +} + +int mz_deflateEnd(mz_streamp pStream) +{ + if (!pStream) return MZ_STREAM_ERROR; + if (pStream->state) + { + pStream->zfree(pStream->opaque, pStream->state); + pStream->state = NULL; + } + return MZ_OK; +} + +mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len) +{ + (void)pStream; + // This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.) + mz_uint64 a = 128ULL + (source_len * 110ULL) / 100ULL; + mz_uint64 b = 128ULL + (mz_uint64)source_len + ((source_len / (31 * 1024)) + 1ULL) * 5ULL; + + mz_uint64 t = MZ_MAX(a, b); + if (((mz_ulong)t) != t) + t = (mz_ulong)(-1); + + return (mz_ulong)t; +} + +int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level) +{ + int status; + mz_stream stream; + memset(&stream, 0, sizeof(stream)); + + // In case mz_ulong is 64-bits (argh I hate longs). + if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR; + + stream.next_in = pSource; + stream.avail_in = (mz_uint32)source_len; + stream.next_out = pDest; + stream.avail_out = (mz_uint32)*pDest_len; + + status = mz_deflateInit(&stream, level); + if (status != MZ_OK) return status; + + status = mz_deflate(&stream, MZ_FINISH); + if (status != MZ_STREAM_END) + { + mz_deflateEnd(&stream); + return (status == MZ_OK) ? MZ_BUF_ERROR : status; + } + + *pDest_len = stream.total_out; + return mz_deflateEnd(&stream); +} + +int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len) +{ + return mz_compress2(pDest, pDest_len, pSource, source_len, MZ_DEFAULT_COMPRESSION); +} + +mz_ulong mz_compressBound(mz_ulong source_len) +{ + return mz_deflateBound(NULL, source_len); +} + +typedef struct +{ + tinfl_decompressor m_decomp; + mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; int m_window_bits; + mz_uint8 m_dict[TINFL_LZ_DICT_SIZE]; + tinfl_status m_last_status; +} inflate_state; + +int mz_inflateInit2(mz_streamp pStream, int window_bits) +{ + inflate_state *pDecomp; + if (!pStream) return MZ_STREAM_ERROR; + if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS)) return MZ_PARAM_ERROR; + + pStream->data_type = 0; + pStream->adler = 0; + pStream->msg = NULL; + pStream->total_in = 0; + pStream->total_out = 0; + pStream->reserved = 0; + if (!pStream->zalloc) pStream->zalloc = def_alloc_func; + if (!pStream->zfree) pStream->zfree = def_free_func; + + pDecomp = (inflate_state*)pStream->zalloc(pStream->opaque, 1, sizeof(inflate_state)); + if (!pDecomp) return MZ_MEM_ERROR; + + pStream->state = (struct mz_internal_state *)pDecomp; + + tinfl_init(&pDecomp->m_decomp); + pDecomp->m_dict_ofs = 0; + pDecomp->m_dict_avail = 0; + pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT; + pDecomp->m_first_call = 1; + pDecomp->m_has_flushed = 0; + pDecomp->m_window_bits = window_bits; + + return MZ_OK; +} + +int mz_inflateInit(mz_streamp pStream) +{ + return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS); +} + +int mz_inflate2(mz_streamp pStream, int flush, int adler32_checking) +{ + inflate_state* pState; + mz_uint n, first_call, decomp_flags = adler32_checking ? TINFL_FLAG_COMPUTE_ADLER32 : 0; + size_t in_bytes, out_bytes, orig_avail_in; + tinfl_status status; + + if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR; + if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH; + if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) return MZ_STREAM_ERROR; + + pState = (inflate_state*)pStream->state; + if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER; + orig_avail_in = pStream->avail_in; + + first_call = pState->m_first_call; pState->m_first_call = 0; + if (pState->m_last_status < 0) return MZ_DATA_ERROR; + + if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR; + pState->m_has_flushed |= (flush == MZ_FINISH); + + if ((flush == MZ_FINISH) && (first_call)) + { + // MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file. + decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF; + in_bytes = pStream->avail_in; out_bytes = pStream->avail_out; + status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags); + pState->m_last_status = status; + pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes; + pStream->adler = tinfl_get_adler32(&pState->m_decomp); + pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes; + + if (status < 0) + return MZ_DATA_ERROR; + else if (status != TINFL_STATUS_DONE) + { + pState->m_last_status = TINFL_STATUS_FAILED; + return MZ_BUF_ERROR; + } + return MZ_STREAM_END; + } + // flush != MZ_FINISH then we must assume there's more input. + if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT; + + if (pState->m_dict_avail) + { + n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); + memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); + pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n; + pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); + return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; + } + + for ( ; ; ) + { + in_bytes = pStream->avail_in; + out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs; + + status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags); + pState->m_last_status = status; + + pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; + pStream->total_in += (mz_uint)in_bytes; pStream->adler = tinfl_get_adler32(&pState->m_decomp); + + pState->m_dict_avail = (mz_uint)out_bytes; + + n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); + memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); + pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n; + pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); + + if (status < 0) + return MZ_DATA_ERROR; // Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well). + else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in)) + return MZ_BUF_ERROR; // Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH. + else if (flush == MZ_FINISH) + { + // The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH. + if (status == TINFL_STATUS_DONE) + return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END; + // status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong. + else if (!pStream->avail_out) + return MZ_BUF_ERROR; + } + else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || (!pStream->avail_out) || (pState->m_dict_avail)) + break; + } + + return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; +} + +int mz_inflate(mz_streamp pStream, int flush) +{ + return mz_inflate2(pStream, flush, MZ_TRUE); +} + +int mz_inflateEnd(mz_streamp pStream) +{ + if (!pStream) + return MZ_STREAM_ERROR; + if (pStream->state) + { + pStream->zfree(pStream->opaque, pStream->state); + pStream->state = NULL; + } + return MZ_OK; +} + +int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len) +{ + mz_stream stream; + int status; + memset(&stream, 0, sizeof(stream)); + + // In case mz_ulong is 64-bits (argh I hate longs). + if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR; + + stream.next_in = pSource; + stream.avail_in = (mz_uint32)source_len; + stream.next_out = pDest; + stream.avail_out = (mz_uint32)*pDest_len; + + status = mz_inflateInit(&stream); + if (status != MZ_OK) + return status; + + status = mz_inflate(&stream, MZ_FINISH); + if (status != MZ_STREAM_END) + { + mz_inflateEnd(&stream); + return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR : status; + } + *pDest_len = stream.total_out; + + return mz_inflateEnd(&stream); +} + +const char *mz_error(int err) +{ + static struct { int m_err; const char *m_pDesc; } s_error_descs[] = + { + { MZ_OK, "" }, { MZ_STREAM_END, "stream end" }, { MZ_NEED_DICT, "need dictionary" }, { MZ_ERRNO, "file error" }, { MZ_STREAM_ERROR, "stream error" }, + { MZ_DATA_ERROR, "data error" }, { MZ_MEM_ERROR, "out of memory" }, { MZ_BUF_ERROR, "buf error" }, { MZ_VERSION_ERROR, "version error" }, { MZ_PARAM_ERROR, "parameter error" } + }; + mz_uint i; for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc; + return NULL; +} + +#endif //MINIZ_NO_ZLIB_APIS + +// ------------------- Low-level Decompression (completely independent from all compression API's) + +#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l) +#define TINFL_MEMSET(p, c, l) memset(p, c, l) + +#define TINFL_CR_BEGIN switch(r->m_state) { case 0: +#define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END +#define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END +#define TINFL_CR_FINISH } + +// TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never +// reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario. +#define TINFL_GET_BYTE(state_index, c) do { \ + if (pIn_buf_cur >= pIn_buf_end) { \ + for ( ; ; ) { \ + if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \ + TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \ + if (pIn_buf_cur < pIn_buf_end) { \ + c = *pIn_buf_cur++; \ + break; \ + } \ + } else { \ + c = 0; \ + break; \ + } \ + } \ + } else c = *pIn_buf_cur++; } MZ_MACRO_END + +#define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n)) +#define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END +#define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END + +// TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2. +// It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a +// Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the +// bit buffer contains >=15 bits (deflate's max. Huffman code size). +#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \ + do { \ + temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \ + if (temp >= 0) { \ + code_len = temp >> 9; \ + if ((code_len) && (num_bits >= code_len)) \ + break; \ + } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \ + code_len = TINFL_FAST_LOOKUP_BITS; \ + do { \ + temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \ + } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \ + } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \ + } while (num_bits < 15); + +// TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read +// beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully +// decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32. +// The slow path is only executed at the very end of the input buffer. +#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \ + int temp; mz_uint code_len, c; \ + if (num_bits < 15) { \ + if ((pIn_buf_end - pIn_buf_cur) < 2) { \ + TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \ + } else { \ + bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \ + } \ + } \ + if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \ + code_len = temp >> 9, temp &= 511; \ + else { \ + code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \ + } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END + +tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags) +{ + static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 }; + static const int s_length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + static const int s_min_table_sizes[3] = { 257, 1, 4 }; + + tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf; + const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size; + mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size; + size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start; + + // Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter). + if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; } + + num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start; + TINFL_CR_BEGIN + + bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1; + if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) + { + TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1); + counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8)); + if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1ULL << (8U + (r->m_zhdr0 >> 4))))); + if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); } + } + + do + { + TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1; + if (r->m_type == 0) + { + TINFL_SKIP_BITS(5, num_bits & 7); + for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); } + if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); } + while ((counter) && (num_bits)) + { + TINFL_GET_BITS(51, dist, 8); + while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); } + *pOut_buf_cur++ = (mz_uint8)dist; + counter--; + } + while (counter) + { + size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); } + while (pIn_buf_cur >= pIn_buf_end) + { + if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) + { + TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT); + } + else + { + TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED); + } + } + n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter); + TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n; + } + } + else if (r->m_type == 3) + { + TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED); + } + else + { + if (r->m_type == 1) + { + mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i; + r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32); + for ( i = 0; i <= 143; ++i) *p++ = 8; + for ( ; i <= 255; ++i) *p++ = 9; + for ( ; i <= 279; ++i) *p++ = 7; + for ( ; i <= 287; ++i) *p++ = 8; + } + else + { + for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; } + MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; } + r->m_table_sizes[2] = 19; + } + for ( ; (int)r->m_type >= 0; r->m_type--) + { + int tree_next, tree_cur; tinfl_huff_table *pTable; + mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree); + for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++; + used_syms = 0, total = 0; next_code[0] = next_code[1] = 0; + for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); } + if ((65536 != total) && (used_syms > 1)) + { + TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED); + } + for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index) + { + mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue; + cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1); + if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; } + if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } + rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1); + for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--) + { + tree_cur -= ((rev_code >>= 1) & 1); + if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1]; + } + tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index; + } + if (r->m_type == 2) + { + for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); ) + { + mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; } + if ((dist == 16) && (!counter)) + { + TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED); + } + num_extra = "\02\03\07"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += "\03\03\013"[dist - 16]; + TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s; + } + if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter) + { + TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED); + } + TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]); + } + } + for ( ; ; ) + { + mz_uint8 *pSrc; + for ( ; ; ) + { + if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2)) + { + TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]); + if (counter >= 256) + break; + while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); } + *pOut_buf_cur++ = (mz_uint8)counter; + } + else + { + int sym2; mz_uint code_len; +#if TINFL_USE_64BIT_BITBUF + if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; } +#else + if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; } +#endif + if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) + code_len = sym2 >> 9; + else + { + code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0); + } + counter = sym2; bit_buf >>= code_len; num_bits -= code_len; + if (counter & 256) + break; + +#if !TINFL_USE_64BIT_BITBUF + if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; } +#endif + if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) + code_len = sym2 >> 9; + else + { + code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0); + } + bit_buf >>= code_len; num_bits -= code_len; + + pOut_buf_cur[0] = (mz_uint8)counter; + if (sym2 & 256) + { + pOut_buf_cur++; + counter = sym2; + break; + } + pOut_buf_cur[1] = (mz_uint8)sym2; + pOut_buf_cur += 2; + } + } + if ((counter &= 511) == 256) break; + + num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257]; + if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; } + + TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]); + num_extra = s_dist_extra[dist]; dist = s_dist_base[dist]; + if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; } + + dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start; + if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) + { + TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED); + } + + pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask); + + if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end) + { + while (counter--) + { + while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); } + *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask]; + } + continue; + } +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES + else if ((counter >= 9) && (counter <= dist)) + { + const mz_uint8 *pSrc_end = pSrc + (counter & ~7); + do + { + ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0]; + ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1]; + pOut_buf_cur += 8; + } while ((pSrc += 8) < pSrc_end); + if ((counter &= 7) < 3) + { + if (counter) + { + pOut_buf_cur[0] = pSrc[0]; + if (counter > 1) + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur += counter; + } + continue; + } + } +#endif + do + { + pOut_buf_cur[0] = pSrc[0]; + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur[2] = pSrc[2]; + pOut_buf_cur += 3; pSrc += 3; + } while ((int)(counter -= 3) > 2); + if ((int)counter > 0) + { + pOut_buf_cur[0] = pSrc[0]; + if ((int)counter > 1) + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur += counter; + } + } + } + } while (!(r->m_final & 1)); + if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) + { + TINFL_SKIP_BITS(32, num_bits & 7); for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; } + } + TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE); + TINFL_CR_FINISH + +common_exit: + r->m_num_bits = num_bits; r->m_bit_buf = bit_buf; r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start; + *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next; + //if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0)) + if ((decomp_flags & TINFL_FLAG_COMPUTE_ADLER32) && (status >= 0)) + { + const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size; + mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552; + while (buf_len) + { + for (i = 0; i + 7 < block_len; i += 8, ptr += 8) + { + s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1; + s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1; + } + for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1; + s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552; + } + r->m_check_adler32 = (s2 << 16) + s1; + if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) + status = TINFL_STATUS_ADLER32_MISMATCH; + } + return status; +} + +// Higher level helper functions. +void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) +{ + tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; size_t src_buf_ofs = 0, out_buf_capacity = 0; + *pOut_len = 0; + tinfl_init(&decomp); + for ( ; ; ) + { + size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity; + tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8*)pBuf, pBuf ? (mz_uint8*)pBuf + *pOut_len : NULL, &dst_buf_size, + (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) + { + MZ_FREE(pBuf); *pOut_len = 0; return NULL; + } + src_buf_ofs += src_buf_size; + *pOut_len += dst_buf_size; + if (status == TINFL_STATUS_DONE) break; + new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128; + pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity); + if (!pNew_buf) + { + MZ_FREE(pBuf); *pOut_len = 0; return NULL; + } + pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity; + } + return pBuf; +} + +size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) +{ + tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp); + status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf, &src_buf_len, (mz_uint8*)pOut_buf, (mz_uint8*)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len; +} + +int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) +{ + int result = 0; + tinfl_decompressor decomp; + mz_uint8 *pDict = (mz_uint8*)MZ_MALLOC(TINFL_LZ_DICT_SIZE); size_t in_buf_ofs = 0, dict_ofs = 0; + if (!pDict) + return TINFL_STATUS_FAILED; + tinfl_init(&decomp); + for ( ; ; ) + { + size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs; + tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size, + (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))); + in_buf_ofs += in_buf_size; + if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user))) + break; + if (status != TINFL_STATUS_HAS_MORE_OUTPUT) + { + result = (status == TINFL_STATUS_DONE); + break; + } + dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1); + } + MZ_FREE(pDict); + *pIn_buf_size = in_buf_ofs; + return result; +} + +// ------------------- Low-level Compression (independent from all decompression API's) + +// Purposely making these tables static for faster init and thread safety. +static const mz_uint16 s_tdefl_len_sym[256] = { + 257,258,259,260,261,262,263,264,265,265,266,266,267,267,268,268,269,269,269,269,270,270,270,270,271,271,271,271,272,272,272,272, + 273,273,273,273,273,273,273,273,274,274,274,274,274,274,274,274,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,276, + 277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278, + 279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280, + 281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281, + 282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282, + 283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283, + 284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,285 }; + +static const mz_uint8 s_tdefl_len_extra[256] = { + 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0 }; + +static const mz_uint8 s_tdefl_small_dist_sym[512] = { + 0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17 }; + +static const mz_uint8 s_tdefl_small_dist_extra[512] = { + 0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7 }; + +static const mz_uint8 s_tdefl_large_dist_sym[128] = { + 0,0,18,19,20,20,21,21,22,22,22,22,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26, + 26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, + 28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29 }; + +static const mz_uint8 s_tdefl_large_dist_extra[128] = { + 0,0,8,8,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 }; + +// Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted values. +typedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq; +static tdefl_sym_freq* tdefl_radix_sort_syms(mz_uint num_syms, tdefl_sym_freq* pSyms0, tdefl_sym_freq* pSyms1) +{ + mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2]; tdefl_sym_freq* pCur_syms = pSyms0, *pNew_syms = pSyms1; MZ_CLEAR_OBJ(hist); + for (i = 0; i < num_syms; i++) { mz_uint freq = pSyms0[i].m_key; hist[freq & 0xFF]++; hist[256 + ((freq >> 8) & 0xFF)]++; } + while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) total_passes--; + for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8) + { + const mz_uint32* pHist = &hist[pass << 8]; + mz_uint offsets[256], cur_ofs = 0; + for (i = 0; i < 256; i++) { offsets[i] = cur_ofs; cur_ofs += pHist[i]; } + for (i = 0; i < num_syms; i++) pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i]; + { tdefl_sym_freq* t = pCur_syms; pCur_syms = pNew_syms; pNew_syms = t; } + } + return pCur_syms; +} + +// tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat, alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996. +static void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n) +{ + int root, leaf, next, avbl, used, dpth; + if (n==0) return; else if (n==1) { A[0].m_key = 1; return; } + A[0].m_key += A[1].m_key; root = 0; leaf = 2; + for (next=1; next < n-1; next++) + { + if (leaf>=n || A[root].m_key=n || (root=0; next--) A[next].m_key = A[A[next].m_key].m_key+1; + avbl = 1; used = dpth = 0; root = n-2; next = n-1; + while (avbl>0) + { + while (root>=0 && (int)A[root].m_key==dpth) { used++; root--; } + while (avbl>used) { A[next--].m_key = (mz_uint16)(dpth); avbl--; } + avbl = 2*used; dpth++; used = 0; + } +} + +// Limits canonical Huffman code table's max code size. +enum { TDEFL_MAX_SUPPORTED_HUFF_CODESIZE = 32 }; +static void tdefl_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size) +{ + int i; mz_uint32 total = 0; if (code_list_len <= 1) return; + for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; i++) pNum_codes[max_code_size] += pNum_codes[i]; + for (i = max_code_size; i > 0; i--) total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i)); + while (total != (1UL << max_code_size)) + { + pNum_codes[max_code_size]--; + for (i = max_code_size - 1; i > 0; i--) if (pNum_codes[i]) { pNum_codes[i]--; pNum_codes[i + 1] += 2; break; } + total--; + } +} + +static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int table_len, int code_size_limit, int static_table) +{ + int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE]; mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1]; MZ_CLEAR_OBJ(num_codes); + if (static_table) + { + for (i = 0; i < table_len; i++) num_codes[d->m_huff_code_sizes[table_num][i]]++; + } + else + { + tdefl_sym_freq syms0[TDEFL_MAX_HUFF_SYMBOLS], syms1[TDEFL_MAX_HUFF_SYMBOLS], *pSyms; + int num_used_syms = 0; + const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0]; + for (i = 0; i < table_len; i++) if (pSym_count[i]) { syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i]; syms0[num_used_syms++].m_sym_index = (mz_uint16)i; } + + pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1); tdefl_calculate_minimum_redundancy(pSyms, num_used_syms); + + for (i = 0; i < num_used_syms; i++) num_codes[pSyms[i].m_key]++; + + tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, code_size_limit); + + MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]); MZ_CLEAR_OBJ(d->m_huff_codes[table_num]); + for (i = 1, j = num_used_syms; i <= code_size_limit; i++) + for (l = num_codes[i]; l > 0; l--) d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i); + } + + next_code[1] = 0; for (j = 0, i = 2; i <= code_size_limit; i++) next_code[i] = j = ((j + num_codes[i - 1]) << 1); + + for (i = 0; i < table_len; i++) + { + mz_uint rev_code = 0, code, code_size; if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0) continue; + code = next_code[code_size]++; for (l = code_size; l > 0; l--, code >>= 1) rev_code = (rev_code << 1) | (code & 1); + d->m_huff_codes[table_num][i] = (mz_uint16)rev_code; + } +} + +#define TDEFL_PUT_BITS(b, l) do { \ + mz_uint bits = b; mz_uint len = l; MZ_ASSERT(bits <= ((1U << len) - 1U)); \ + d->m_bit_buffer |= (bits << d->m_bits_in); d->m_bits_in += len; \ + while (d->m_bits_in >= 8) { \ + if (d->m_pOutput_buf < d->m_pOutput_buf_end) { \ + *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \ + } \ + d->m_bit_buffer >>= 8; \ + d->m_bits_in -= 8; \ + } \ +} MZ_MACRO_END + +#define TDEFL_RLE_PREV_CODE_SIZE() { if (rle_repeat_count) { \ + if (rle_repeat_count < 3) { \ + d->m_huff_count[2][prev_code_size] = (mz_uint16)(d->m_huff_count[2][prev_code_size] + rle_repeat_count); \ + while (rle_repeat_count--) packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \ + } else { \ + d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); packed_code_sizes[num_packed_code_sizes++] = 16; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_repeat_count - 3); \ +} rle_repeat_count = 0; } } + +#define TDEFL_RLE_ZERO_CODE_SIZE() { if (rle_z_count) { \ + if (rle_z_count < 3) { \ + d->m_huff_count[2][0] = (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); while (rle_z_count--) packed_code_sizes[num_packed_code_sizes++] = 0; \ + } else if (rle_z_count <= 10) { \ + d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); packed_code_sizes[num_packed_code_sizes++] = 17; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 3); \ + } else { \ + d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); packed_code_sizes[num_packed_code_sizes++] = 18; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 11); \ +} rle_z_count = 0; } } + +static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; + +static void tdefl_start_dynamic_block(tdefl_compressor *d) +{ + int num_lit_codes, num_dist_codes, num_bit_lengths; mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count, rle_repeat_count, packed_code_sizes_index; + mz_uint8 code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], prev_code_size = 0xFF; + + d->m_huff_count[0][256] = 1; + + tdefl_optimize_huffman_table(d, 0, TDEFL_MAX_HUFF_SYMBOLS_0, 15, MZ_FALSE); + tdefl_optimize_huffman_table(d, 1, TDEFL_MAX_HUFF_SYMBOLS_1, 15, MZ_FALSE); + + for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--) if (d->m_huff_code_sizes[0][num_lit_codes - 1]) break; + for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--) if (d->m_huff_code_sizes[1][num_dist_codes - 1]) break; + + memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes); + memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0], num_dist_codes); + total_code_sizes_to_pack = num_lit_codes + num_dist_codes; num_packed_code_sizes = 0; rle_z_count = 0; rle_repeat_count = 0; + + memset(&d->m_huff_count[2][0], 0, sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2); + for (i = 0; i < total_code_sizes_to_pack; i++) + { + mz_uint8 code_size = code_sizes_to_pack[i]; + if (!code_size) + { + TDEFL_RLE_PREV_CODE_SIZE(); + if (++rle_z_count == 138) { TDEFL_RLE_ZERO_CODE_SIZE(); } + } + else + { + TDEFL_RLE_ZERO_CODE_SIZE(); + if (code_size != prev_code_size) + { + TDEFL_RLE_PREV_CODE_SIZE(); + d->m_huff_count[2][code_size] = (mz_uint16)(d->m_huff_count[2][code_size] + 1); packed_code_sizes[num_packed_code_sizes++] = code_size; + } + else if (++rle_repeat_count == 6) + { + TDEFL_RLE_PREV_CODE_SIZE(); + } + } + prev_code_size = code_size; + } + if (rle_repeat_count) { TDEFL_RLE_PREV_CODE_SIZE(); } else { TDEFL_RLE_ZERO_CODE_SIZE(); } + + tdefl_optimize_huffman_table(d, 2, TDEFL_MAX_HUFF_SYMBOLS_2, 7, MZ_FALSE); + + TDEFL_PUT_BITS(2, 2); + + TDEFL_PUT_BITS(num_lit_codes - 257, 5); + TDEFL_PUT_BITS(num_dist_codes - 1, 5); + + for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--) if (d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]]) break; + num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1)); TDEFL_PUT_BITS(num_bit_lengths - 4, 4); + for (i = 0; (int)i < num_bit_lengths; i++) TDEFL_PUT_BITS(d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3); + + for (packed_code_sizes_index = 0; packed_code_sizes_index < num_packed_code_sizes; ) + { + mz_uint code = packed_code_sizes[packed_code_sizes_index++]; MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2); + TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]); + if (code >= 16) TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++], "\02\03\07"[code - 16]); + } +} + +static void tdefl_start_static_block(tdefl_compressor *d) +{ + mz_uint i; + mz_uint8 *p = &d->m_huff_code_sizes[0][0]; + + for (i = 0; i <= 143; ++i) *p++ = 8; + for ( ; i <= 255; ++i) *p++ = 9; + for ( ; i <= 279; ++i) *p++ = 7; + for ( ; i <= 287; ++i) *p++ = 8; + + memset(d->m_huff_code_sizes[1], 5, 32); + + tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE); + tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE); + + TDEFL_PUT_BITS(1, 2); +} + +static const mz_uint mz_bitmasks[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF }; + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS +static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) +{ + mz_uint flags; + mz_uint8 *pLZ_codes; + mz_uint8 *pOutput_buf = d->m_pOutput_buf; + mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf; + mz_uint64 bit_buffer = d->m_bit_buffer; + mz_uint bits_in = d->m_bits_in; + +#define TDEFL_PUT_BITS_FAST(b, l) { bit_buffer |= (((mz_uint64)(b)) << bits_in); bits_in += (l); } + + flags = 1; + for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end; flags >>= 1) + { + if (flags == 1) + flags = *pLZ_codes++ | 0x100; + + if (flags & 1) + { + mz_uint s0, s1, n0, n1, sym, num_extra_bits; + mz_uint match_len = pLZ_codes[0], match_dist = *(const mz_uint16 *)(pLZ_codes + 1); pLZ_codes += 3; + + MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]); + + // This sequence coaxes MSVC into using cmov's vs. jmp's. + s0 = s_tdefl_small_dist_sym[match_dist & 511]; + n0 = s_tdefl_small_dist_extra[match_dist & 511]; + s1 = s_tdefl_large_dist_sym[match_dist >> 8]; + n1 = s_tdefl_large_dist_extra[match_dist >> 8]; + sym = (match_dist < 512) ? s0 : s1; + num_extra_bits = (match_dist < 512) ? n0 : n1; + + MZ_ASSERT(d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); + } + else + { + mz_uint lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + + if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) + { + flags >>= 1; + lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + + if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) + { + flags >>= 1; + lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + } + } + } + + if (pOutput_buf >= d->m_pOutput_buf_end) + return MZ_FALSE; + + *(mz_uint64*)pOutput_buf = bit_buffer; + pOutput_buf += (bits_in >> 3); + bit_buffer >>= (bits_in & ~7); + bits_in &= 7; + } + +#undef TDEFL_PUT_BITS_FAST + + d->m_pOutput_buf = pOutput_buf; + d->m_bits_in = 0; + d->m_bit_buffer = 0; + + while (bits_in) + { + mz_uint32 n = MZ_MIN(bits_in, 16); + TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n); + bit_buffer >>= n; + bits_in -= n; + } + + TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); + + return (d->m_pOutput_buf < d->m_pOutput_buf_end); +} +#else +static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) +{ + mz_uint flags; + mz_uint8 *pLZ_codes; + + flags = 1; + for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf; flags >>= 1) + { + if (flags == 1) + flags = *pLZ_codes++ | 0x100; + if (flags & 1) + { + mz_uint sym, num_extra_bits; + mz_uint match_len = pLZ_codes[0], match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8)); pLZ_codes += 3; + + MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]); + + if (match_dist < 512) + { + sym = s_tdefl_small_dist_sym[match_dist]; num_extra_bits = s_tdefl_small_dist_extra[match_dist]; + } + else + { + sym = s_tdefl_large_dist_sym[match_dist >> 8]; num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8]; + } + MZ_ASSERT(d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); + } + else + { + mz_uint lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + } + } + + TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); + + return (d->m_pOutput_buf < d->m_pOutput_buf_end); +} +#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS + +static mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block) +{ + if (static_block) + tdefl_start_static_block(d); + else + tdefl_start_dynamic_block(d); + return tdefl_compress_lz_codes(d); +} + +static int tdefl_flush_block(tdefl_compressor *d, int flush) +{ + mz_uint saved_bit_buf, saved_bits_in; + mz_uint8 *pSaved_output_buf; + mz_bool comp_block_succeeded = MZ_FALSE; + int n, use_raw_block = ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size; + mz_uint8 *pOutput_buf_start = ((d->m_pPut_buf_func == NULL) && ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE)) ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs) : d->m_output_buf; + + d->m_pOutput_buf = pOutput_buf_start; + d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16; + + MZ_ASSERT(!d->m_output_flush_remaining); + d->m_output_flush_ofs = 0; + d->m_output_flush_remaining = 0; + + *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left); + d->m_pLZ_code_buf -= (d->m_num_flags_left == 8); + + if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index)) + { + TDEFL_PUT_BITS(0x78, 8); TDEFL_PUT_BITS(0x01, 8); + } + + TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1); + + pSaved_output_buf = d->m_pOutput_buf; saved_bit_buf = d->m_bit_buffer; saved_bits_in = d->m_bits_in; + + if (!use_raw_block) + comp_block_succeeded = tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || (d->m_total_lz_bytes < 48)); + + // If the block gets expanded, forget the current contents of the output buffer and send a raw block instead. + if ( ((use_raw_block) || ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >= d->m_total_lz_bytes))) && + ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size) ) + { + mz_uint i; d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; + TDEFL_PUT_BITS(0, 2); + if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } + for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF) + { + TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16); + } + for (i = 0; i < d->m_total_lz_bytes; ++i) + { + TDEFL_PUT_BITS(d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK], 8); + } + } + // Check for the extremely unlikely (if not impossible) case of the compressed block not fitting into the output buffer when using dynamic codes. + else if (!comp_block_succeeded) + { + d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; + tdefl_compress_block(d, MZ_TRUE); + } + + if (flush) + { + if (flush == TDEFL_FINISH) + { + if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } + if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) { mz_uint i, a = d->m_adler32; for (i = 0; i < 4; i++) { TDEFL_PUT_BITS((a >> 24) & 0xFF, 8); a <<= 8; } } + } + else + { + mz_uint i, z = 0; TDEFL_PUT_BITS(0, 3); if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } for (i = 2; i; --i, z ^= 0xFFFF) { TDEFL_PUT_BITS(z & 0xFFFF, 16); } + } + } + + MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end); + + memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); + memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); + + d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes; d->m_total_lz_bytes = 0; d->m_block_index++; + + if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0) + { + if (d->m_pPut_buf_func) + { + *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; + if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user)) + return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED); + } + else if (pOutput_buf_start == d->m_output_buf) + { + int bytes_to_copy = (int)MZ_MIN((size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs)); + memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf, bytes_to_copy); + d->m_out_buf_ofs += bytes_to_copy; + if ((n -= bytes_to_copy) != 0) + { + d->m_output_flush_ofs = bytes_to_copy; + d->m_output_flush_remaining = n; + } + } + else + { + d->m_out_buf_ofs += n; + } + } + + return d->m_output_flush_remaining; +} + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES +#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16*)(p) +static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) +{ + mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len; + mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; + const mz_uint16 *s = (const mz_uint16*)(d->m_dict + pos), *p, *q; + mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD(s); + MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return; + for ( ; ; ) + { + for ( ; ; ) + { + if (--num_probes_left == 0) return; + #define TDEFL_PROBE \ + next_probe_pos = d->m_next[probe_pos]; \ + if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \ + probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ + if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) break; + TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE; + } + if (!dist) break; + q = (const mz_uint16*)(d->m_dict + probe_pos); + if (TDEFL_READ_UNALIGNED_WORD(q) != s01) continue; + p = s; probe_len = 32; + do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) ); + if (!probe_len) + { + *pMatch_dist = dist; *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN); break; + } + else if ((probe_len = ((mz_uint)(p - s) * 2) + (mz_uint)(*(const mz_uint8*)p == *(const mz_uint8*)q)) > match_len) + { + *pMatch_dist = dist; if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) == max_match_len) break; + c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]); + } + } +} +#else +static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) +{ + mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len; + mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; + const mz_uint8 *s = d->m_dict + pos, *p, *q; + mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1]; + MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return; + for ( ; ; ) + { + for ( ; ; ) + { + if (--num_probes_left == 0) return; + #define TDEFL_PROBE \ + next_probe_pos = d->m_next[probe_pos]; \ + if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \ + probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ + if ((d->m_dict[probe_pos + match_len] == c0) && (d->m_dict[probe_pos + match_len - 1] == c1)) break; + TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE; + } + if (!dist) break; p = s; q = d->m_dict + probe_pos; for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) break; + if (probe_len > match_len) + { + *pMatch_dist = dist; if ((*pMatch_len = match_len = probe_len) == max_match_len) return; + c0 = d->m_dict[pos + match_len]; c1 = d->m_dict[pos + match_len - 1]; + } + } +} +#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN +static mz_bool tdefl_compress_fast(tdefl_compressor *d) +{ + // Faster, minimally featured LZRW1-style match+parse loop with better register utilization. Intended for applications where raw throughput is valued more highly than ratio. + mz_uint lookahead_pos = d->m_lookahead_pos, lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size, total_lz_bytes = d->m_total_lz_bytes, num_flags_left = d->m_num_flags_left; + mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags; + mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; + + while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size))) + { + const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096; + mz_uint dst_pos = (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; + mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size); + d->m_src_buf_left -= num_bytes_to_process; + lookahead_size += num_bytes_to_process; + + while (num_bytes_to_process) + { + mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process); + memcpy(d->m_dict + dst_pos, d->m_pSrc, n); + if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) + memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc, MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos)); + d->m_pSrc += n; + dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK; + num_bytes_to_process -= n; + } + + dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size); + if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE)) break; + + while (lookahead_size >= 4) + { + mz_uint cur_match_dist, cur_match_len = 1; + mz_uint8 *pCur_dict = d->m_dict + cur_pos; + mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF; + mz_uint hash = (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) & TDEFL_LEVEL1_HASH_SIZE_MASK; + mz_uint probe_pos = d->m_hash[hash]; + d->m_hash[hash] = (mz_uint16)lookahead_pos; + + if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= dict_size) && ((*(const mz_uint32 *)(d->m_dict + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & 0xFFFFFF) == first_trigram)) + { + const mz_uint16 *p = (const mz_uint16 *)pCur_dict; + const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos); + mz_uint32 probe_len = 32; + do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) ); + cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q); + if (!probe_len) + cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0; + + if ((cur_match_len < TDEFL_MIN_MATCH_LEN) || ((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U))) + { + cur_match_len = 1; + *pLZ_code_buf++ = (mz_uint8)first_trigram; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + d->m_huff_count[0][(mz_uint8)first_trigram]++; + } + else + { + mz_uint32 s0, s1; + cur_match_len = MZ_MIN(cur_match_len, lookahead_size); + + MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 1) && (cur_match_dist <= TDEFL_LZ_DICT_SIZE)); + + cur_match_dist--; + + pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN); + *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist; + pLZ_code_buf += 3; + *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80); + + s0 = s_tdefl_small_dist_sym[cur_match_dist & 511]; + s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8]; + d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++; + + d->m_huff_count[0][s_tdefl_len_sym[cur_match_len - TDEFL_MIN_MATCH_LEN]]++; + } + } + else + { + *pLZ_code_buf++ = (mz_uint8)first_trigram; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + d->m_huff_count[0][(mz_uint8)first_trigram]++; + } + + if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; } + + total_lz_bytes += cur_match_len; + lookahead_pos += cur_match_len; + dict_size = MZ_MIN(dict_size + cur_match_len, TDEFL_LZ_DICT_SIZE); + cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK; + MZ_ASSERT(lookahead_size >= cur_match_len); + lookahead_size -= cur_match_len; + + if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) + { + int n; + d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; + if ((n = tdefl_flush_block(d, 0)) != 0) + return (n < 0) ? MZ_FALSE : MZ_TRUE; + total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left; + } + } + + while (lookahead_size) + { + mz_uint8 lit = d->m_dict[cur_pos]; + + total_lz_bytes++; + *pLZ_code_buf++ = lit; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; } + + d->m_huff_count[0][lit]++; + + lookahead_pos++; + dict_size = MZ_MIN(dict_size + 1, TDEFL_LZ_DICT_SIZE); + cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; + lookahead_size--; + + if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) + { + int n; + d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; + if ((n = tdefl_flush_block(d, 0)) != 0) + return (n < 0) ? MZ_FALSE : MZ_TRUE; + total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left; + } + } + } + + d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; + return MZ_TRUE; +} +#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + +static MZ_FORCEINLINE void tdefl_record_literal(tdefl_compressor *d, mz_uint8 lit) +{ + d->m_total_lz_bytes++; + *d->m_pLZ_code_buf++ = lit; + *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; } + d->m_huff_count[0][lit]++; +} + +static MZ_FORCEINLINE void tdefl_record_match(tdefl_compressor *d, mz_uint match_len, mz_uint match_dist) +{ + mz_uint32 s0, s1; + + MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) && (match_dist <= TDEFL_LZ_DICT_SIZE)); + + d->m_total_lz_bytes += match_len; + + d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN); + + match_dist -= 1; + d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF); + d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8); d->m_pLZ_code_buf += 3; + + *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; } + + s0 = s_tdefl_small_dist_sym[match_dist & 511]; s1 = s_tdefl_large_dist_sym[(match_dist >> 8) & 127]; + d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++; + + if (match_len >= TDEFL_MIN_MATCH_LEN) d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++; +} + +static mz_bool tdefl_compress_normal(tdefl_compressor *d) +{ + const mz_uint8 *pSrc = d->m_pSrc; size_t src_buf_left = d->m_src_buf_left; + tdefl_flush flush = d->m_flush; + + while ((src_buf_left) || ((flush) && (d->m_lookahead_size))) + { + mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos; + // Update dictionary and hash chains. Keeps the lookahead size equal to TDEFL_MAX_MATCH_LEN. + if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1)) + { + mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK, ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2; + mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK]; + mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size); + const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process; + src_buf_left -= num_bytes_to_process; + d->m_lookahead_size += num_bytes_to_process; + while (pSrc != pSrc_end) + { + mz_uint8 c = *pSrc++; d->m_dict[dst_pos] = c; if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; + hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); + d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos); + dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; ins_pos++; + } + } + else + { + while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) + { + mz_uint8 c = *pSrc++; + mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; + src_buf_left--; + d->m_dict[dst_pos] = c; + if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) + d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; + if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN) + { + mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2; + mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << (TDEFL_LZ_HASH_SHIFT * 2)) ^ (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); + d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos); + } + } + } + d->m_dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size); + if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) + break; + + // Simple lazy/greedy parsing state machine. + len_to_move = 1; cur_match_dist = 0; cur_match_len = d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1); cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; + if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS)) + { + if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) + { + mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK]; + cur_match_len = 0; while (cur_match_len < d->m_lookahead_size) { if (d->m_dict[cur_pos + cur_match_len] != c) break; cur_match_len++; } + if (cur_match_len < TDEFL_MIN_MATCH_LEN) cur_match_len = 0; else cur_match_dist = 1; + } + } + else + { + tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size, d->m_lookahead_size, &cur_match_dist, &cur_match_len); + } + if (((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U)) || (cur_pos == cur_match_dist) || ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5))) + { + cur_match_dist = cur_match_len = 0; + } + if (d->m_saved_match_len) + { + if (cur_match_len > d->m_saved_match_len) + { + tdefl_record_literal(d, (mz_uint8)d->m_saved_lit); + if (cur_match_len >= 128) + { + tdefl_record_match(d, cur_match_len, cur_match_dist); + d->m_saved_match_len = 0; len_to_move = cur_match_len; + } + else + { + d->m_saved_lit = d->m_dict[cur_pos]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len; + } + } + else + { + tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist); + len_to_move = d->m_saved_match_len - 1; d->m_saved_match_len = 0; + } + } + else if (!cur_match_dist) + tdefl_record_literal(d, d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]); + else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) || (cur_match_len >= 128)) + { + tdefl_record_match(d, cur_match_len, cur_match_dist); + len_to_move = cur_match_len; + } + else + { + d->m_saved_lit = d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len; + } + // Move the lookahead forward by len_to_move bytes. + d->m_lookahead_pos += len_to_move; + MZ_ASSERT(d->m_lookahead_size >= len_to_move); + d->m_lookahead_size -= len_to_move; + d->m_dict_size = MZ_MIN(d->m_dict_size + len_to_move, TDEFL_LZ_DICT_SIZE); + // Check if it's time to flush the current LZ codes to the internal output buffer. + if ( (d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) || + ( (d->m_total_lz_bytes > 31*1024) && (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >= d->m_total_lz_bytes) || (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) ) + { + int n; + d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left; + if ((n = tdefl_flush_block(d, 0)) != 0) + return (n < 0) ? MZ_FALSE : MZ_TRUE; + } + } + + d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left; + return MZ_TRUE; +} + +static tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d) +{ + if (d->m_pIn_buf_size) + { + *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; + } + + if (d->m_pOut_buf_size) + { + size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs, d->m_output_flush_remaining); + memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf + d->m_output_flush_ofs, n); + d->m_output_flush_ofs += (mz_uint)n; + d->m_output_flush_remaining -= (mz_uint)n; + d->m_out_buf_ofs += n; + + *d->m_pOut_buf_size = d->m_out_buf_ofs; + } + + return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE : TDEFL_STATUS_OKAY; +} + +tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush) +{ + if (!d) + { + if (pIn_buf_size) *pIn_buf_size = 0; + if (pOut_buf_size) *pOut_buf_size = 0; + return TDEFL_STATUS_BAD_PARAM; + } + + d->m_pIn_buf = pIn_buf; d->m_pIn_buf_size = pIn_buf_size; + d->m_pOut_buf = pOut_buf; d->m_pOut_buf_size = pOut_buf_size; + d->m_pSrc = (const mz_uint8 *)(pIn_buf); d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0; + d->m_out_buf_ofs = 0; + d->m_flush = flush; + + if ( ((d->m_pPut_buf_func != NULL) == ((pOut_buf != NULL) || (pOut_buf_size != NULL))) || (d->m_prev_return_status != TDEFL_STATUS_OKAY) || + (d->m_wants_to_finish && (flush != TDEFL_FINISH)) || (pIn_buf_size && *pIn_buf_size && !pIn_buf) || (pOut_buf_size && *pOut_buf_size && !pOut_buf) ) + { + if (pIn_buf_size) *pIn_buf_size = 0; + if (pOut_buf_size) *pOut_buf_size = 0; + return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM); + } + d->m_wants_to_finish |= (flush == TDEFL_FINISH); + + if ((d->m_output_flush_remaining) || (d->m_finished)) + return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) && + ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) && + ((d->m_flags & (TDEFL_FILTER_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS | TDEFL_RLE_MATCHES)) == 0)) + { + if (!tdefl_compress_fast(d)) + return d->m_prev_return_status; + } + else +#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + { + if (!tdefl_compress_normal(d)) + return d->m_prev_return_status; + } + + if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) && (pIn_buf)) + d->m_adler32 = (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf, d->m_pSrc - (const mz_uint8 *)pIn_buf); + + if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) && (!d->m_output_flush_remaining)) + { + if (tdefl_flush_block(d, flush) < 0) + return d->m_prev_return_status; + d->m_finished = (flush == TDEFL_FINISH); + if (flush == TDEFL_FULL_FLUSH) { MZ_CLEAR_OBJ(d->m_hash); MZ_CLEAR_OBJ(d->m_next); d->m_dict_size = 0; } + } + + return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); +} + +tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush) +{ + MZ_ASSERT(d->m_pPut_buf_func); return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush); +} + +tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) +{ + d->m_pPut_buf_func = pPut_buf_func; d->m_pPut_buf_user = pPut_buf_user; + d->m_flags = (mz_uint)(flags); d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3; d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0; + d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3; + if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) MZ_CLEAR_OBJ(d->m_hash); + d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size = d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0; + d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished = d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0; + d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; + d->m_pOutput_buf = d->m_output_buf; d->m_pOutput_buf_end = d->m_output_buf; d->m_prev_return_status = TDEFL_STATUS_OKAY; + d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0; d->m_adler32 = 1; + d->m_pIn_buf = NULL; d->m_pOut_buf = NULL; + d->m_pIn_buf_size = NULL; d->m_pOut_buf_size = NULL; + d->m_flush = TDEFL_NO_FLUSH; d->m_pSrc = NULL; d->m_src_buf_left = 0; d->m_out_buf_ofs = 0; + memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); + memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); + return TDEFL_STATUS_OKAY; +} + +tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d) +{ + return d->m_prev_return_status; +} + +mz_uint32 tdefl_get_adler32(tdefl_compressor *d) +{ + return d->m_adler32; +} + +mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) +{ + tdefl_compressor *pComp; mz_bool succeeded; if (((buf_len) && (!pBuf)) || (!pPut_buf_func)) return MZ_FALSE; + pComp = (tdefl_compressor*)MZ_MALLOC(sizeof(tdefl_compressor)); if (!pComp) return MZ_FALSE; + succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) == TDEFL_STATUS_OKAY); + succeeded = succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) == TDEFL_STATUS_DONE); + MZ_FREE(pComp); return succeeded; +} + +typedef struct +{ + size_t m_size, m_capacity; + mz_uint8 *m_pBuf; + mz_bool m_expandable; +} tdefl_output_buffer; + +static mz_bool tdefl_output_buffer_putter(const void *pBuf, int len, void *pUser) +{ + tdefl_output_buffer *p = (tdefl_output_buffer *)pUser; + size_t new_size = p->m_size + len; + if (new_size > p->m_capacity) + { + size_t new_capacity = p->m_capacity; mz_uint8 *pNew_buf; if (!p->m_expandable) return MZ_FALSE; + do { new_capacity = MZ_MAX(128U, new_capacity << 1U); } while (new_size > new_capacity); + pNew_buf = (mz_uint8*)MZ_REALLOC(p->m_pBuf, new_capacity); if (!pNew_buf) return MZ_FALSE; + p->m_pBuf = pNew_buf; p->m_capacity = new_capacity; + } + memcpy((mz_uint8*)p->m_pBuf + p->m_size, pBuf, len); p->m_size = new_size; + return MZ_TRUE; +} + +void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) +{ + tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf); + if (!pOut_len) return MZ_FALSE; else *pOut_len = 0; + out_buf.m_expandable = MZ_TRUE; + if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return NULL; + *pOut_len = out_buf.m_size; return out_buf.m_pBuf; +} + +size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) +{ + tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf); + if (!pOut_buf) return 0; + out_buf.m_pBuf = (mz_uint8*)pOut_buf; out_buf.m_capacity = out_buf_len; + if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return 0; + return out_buf.m_size; +} + +#ifndef MINIZ_NO_ZLIB_APIS +static const mz_uint s_tdefl_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 }; + +// level may actually range from [0,10] (10 is a "hidden" max level, where we want a bit more compression and it's fine if throughput to fall off a cliff on some files). +mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy) +{ + mz_uint comp_flags = s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] | ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0); + if (window_bits > 0) comp_flags |= TDEFL_WRITE_ZLIB_HEADER; + + if (!level) comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS; + else if (strategy == MZ_FILTERED) comp_flags |= TDEFL_FILTER_MATCHES; + else if (strategy == MZ_HUFFMAN_ONLY) comp_flags &= ~TDEFL_MAX_PROBES_MASK; + else if (strategy == MZ_FIXED) comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS; + else if (strategy == MZ_RLE) comp_flags |= TDEFL_RLE_MATCHES; + + return comp_flags; +} +#endif //MINIZ_NO_ZLIB_APIS + +#ifdef _MSC_VER +#pragma warning (push) +#pragma warning (disable:4204) // nonstandard extension used : non-constant aggregate initializer (also supported by GNU C and C99, so no big deal) +#endif + +// Simple PNG writer function by Alex Evans, 2011. Released into the public domain: https://gist.github.com/908299, more context at +// http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/. +// This is actually a modification of Alex's original code so PNG files generated by this function pass pngcheck. +void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip) +{ + // Using a local copy of this array here in case MINIZ_NO_ZLIB_APIS was defined. + static const mz_uint s_tdefl_png_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 }; + tdefl_compressor *pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); tdefl_output_buffer out_buf; int i, bpl = w * num_chans, y, z; mz_uint32 c; *pLen_out = 0; + if (!pComp) return NULL; + MZ_CLEAR_OBJ(out_buf); out_buf.m_expandable = MZ_TRUE; out_buf.m_capacity = 57+MZ_MAX(64, (1+bpl)*h); if (NULL == (out_buf.m_pBuf = (mz_uint8*)MZ_MALLOC(out_buf.m_capacity))) { MZ_FREE(pComp); return NULL; } + // write dummy header + for (z = 41; z; --z) tdefl_output_buffer_putter(&z, 1, &out_buf); + // compress image data + tdefl_init(pComp, tdefl_output_buffer_putter, &out_buf, s_tdefl_png_num_probes[MZ_MIN(10, level)] | TDEFL_WRITE_ZLIB_HEADER | (level <= 3 ? TDEFL_GREEDY_PARSING_FLAG : 0)); + for (y = 0; y < h; ++y) { tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH); tdefl_compress_buffer(pComp, (mz_uint8*)pImage + (flip ? (h - 1 - y) : y) * bpl, bpl, TDEFL_NO_FLUSH); } + if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) != TDEFL_STATUS_DONE) { MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; } + // write real header + *pLen_out = out_buf.m_size-41; + { + static const mz_uint8 chans[] = {0x00, 0x00, 0x04, 0x02, 0x06}; + mz_uint8 pnghdr[41]={0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52, + 0,0,(mz_uint8)(w>>8),(mz_uint8)w,0,0,(mz_uint8)(h>>8),(mz_uint8)h,8,chans[num_chans],0,0,0,0,0,0,0, + (mz_uint8)(*pLen_out>>24),(mz_uint8)(*pLen_out>>16),(mz_uint8)(*pLen_out>>8),(mz_uint8)*pLen_out,0x49,0x44,0x41,0x54}; + c=(mz_uint32)mz_crc32(MZ_CRC32_INIT,pnghdr+12,17); for (i=0; i<4; ++i, c<<=8) ((mz_uint8*)(pnghdr+29))[i]=(mz_uint8)(c>>24); + memcpy(out_buf.m_pBuf, pnghdr, 41); + } + // write footer (IDAT CRC-32, followed by IEND chunk) + if (!tdefl_output_buffer_putter("\0\0\0\0\0\0\0\0\x49\x45\x4e\x44\xae\x42\x60\x82", 16, &out_buf)) { *pLen_out = 0; MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; } + c = (mz_uint32)mz_crc32(MZ_CRC32_INIT,out_buf.m_pBuf+41-4, *pLen_out+4); for (i=0; i<4; ++i, c<<=8) (out_buf.m_pBuf+out_buf.m_size-16)[i] = (mz_uint8)(c >> 24); + // compute final size of file, grab compressed data buffer and return + *pLen_out += 57; MZ_FREE(pComp); return out_buf.m_pBuf; +} +void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out) +{ + // Level 6 corresponds to TDEFL_DEFAULT_MAX_PROBES or MZ_DEFAULT_LEVEL (but we can't depend on MZ_DEFAULT_LEVEL being available in case the zlib API's where #defined out) + return tdefl_write_image_to_png_file_in_memory_ex(pImage, w, h, num_chans, pLen_out, 6, MZ_FALSE); +} + +#ifdef _MSC_VER +#pragma warning (pop) +#endif + +} // namespace buminiz + +#endif // MINIZ_HEADER_FILE_ONLY + diff --git a/ktx/external/basisu/encoder/basisu_ocl_kernels.h b/ktx/external/basisu/encoder/basisu_ocl_kernels.h new file mode 100644 index 0000000..46db61b --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_ocl_kernels.h @@ -0,0 +1,1439 @@ +unsigned char ocl_kernels_cl[] = { + 0x2f, 0x2f, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x4e, 0x55, 0x4c, 0x4c, + 0x0d, 0x0a, 0x09, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x20, 0x30, 0x4c, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, + 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x3b, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x75, 0x63, 0x68, 0x61, + 0x72, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x31, + 0x36, 0x5f, 0x74, 0x3b, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x75, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x3b, 0x0d, 0x0a, + 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x3b, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, + 0x75, 0x69, 0x6e, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3b, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x75, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3b, + 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x3b, 0x0d, 0x0a, + 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x5f, 0x4d, 0x41, 0x58, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x55, + 0x4c, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x4d, 0x41, 0x58, 0x20, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x0d, 0x0a, 0x23, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x4d, 0x41, 0x58, 0x20, 0x55, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x4d, 0x41, 0x58, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, + 0x6e, 0x74, 0x20, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x69, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x29, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x2a, 0x20, 0x61, + 0x3b, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x2a, 0x70, 0x4d, 0x73, 0x67, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, + 0x09, 0x69, 0x66, 0x20, 0x28, 0x21, 0x78, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x28, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x29, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x25, 0x69, 0x3a, 0x20, 0x25, 0x73, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x70, 0x4d, + 0x73, 0x67, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x78, 0x29, 0x20, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x78, 0x2c, 0x20, 0x23, 0x78, 0x2c, 0x20, 0x5f, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x5f, 0x29, 0x0d, 0x0a, 0x23, + 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x09, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x78, 0x29, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, + 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x69, 0x6e, 0x74, 0x20, + 0x78, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x78, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, + 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x5f, 0x66, + 0x6c, 0x61, 0x67, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x2a, 0x70, 0x44, 0x69, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, + 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x2a, 0x70, 0x44, 0x69, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x78, 0x20, 0x3e, 0x20, 0x32, 0x35, 0x35, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x2a, 0x70, 0x44, 0x69, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x32, 0x35, 0x35, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x29, 0x28, 0x78, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, + 0x66, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x5f, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x5f, 0x20, 0x28, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x29, + 0x29, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x0d, + 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x3b, 0x0d, 0x0a, 0x09, + 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x70, 0x65, 0x72, 0x6d, 0x73, 0x3b, 0x0d, 0x0a, 0x7d, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x5f, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x5f, 0x5f, 0x20, 0x28, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x29, 0x29, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x61, 0x67, 0x0d, + 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x5b, 0x31, 0x36, 0x5d, 0x3b, 0x20, 0x2f, 0x2f, + 0x20, 0x5b, 0x79, 0x2a, 0x34, 0x2b, 0x78, 0x5d, 0x0d, 0x0a, 0x7d, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x75, 0x69, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, + 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x65, 0x31, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x65, 0x32, 0x2c, 0x20, 0x62, + 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x29, 0x0d, + 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x30, 0x0d, 0x0a, 0x09, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x72, 0x67, 0x62, 0x20, 0x3d, + 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x29, 0x28, 0x65, 0x31, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x65, 0x32, 0x2e, 0x78, 0x2c, 0x20, 0x65, 0x31, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x65, 0x32, + 0x2e, 0x79, 0x2c, 0x20, 0x65, 0x31, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x65, 0x32, 0x2e, 0x7a, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x5f, 0x79, 0x63, 0x62, 0x63, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x79, 0x63, 0x62, 0x63, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x64, 0x6f, + 0x74, 0x28, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x72, 0x67, 0x62, 0x2c, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x29, 0x28, 0x2e, 0x32, 0x31, 0x32, 0x36, 0x66, 0x2c, 0x20, 0x2e, 0x37, + 0x31, 0x35, 0x32, 0x66, 0x2c, 0x20, 0x2e, 0x30, 0x37, 0x32, 0x32, 0x66, 0x29, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x79, 0x0d, 0x0a, 0x09, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x79, 0x63, + 0x62, 0x63, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x72, 0x67, 0x62, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x79, 0x63, 0x62, 0x63, + 0x72, 0x2e, 0x78, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x63, 0x72, 0x0d, 0x0a, 0x09, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x79, 0x63, 0x62, 0x63, 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x5f, 0x72, 0x67, 0x62, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x79, 0x63, 0x62, 0x63, 0x72, 0x2e, 0x78, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x63, 0x62, + 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x79, 0x63, 0x62, 0x63, 0x72, 0x20, 0x2a, 0x3d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x79, 0x63, 0x62, 0x63, 0x72, + 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x79, 0x63, 0x62, 0x63, 0x72, + 0x2c, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x29, 0x28, 0x31, 0x2e, 0x30, 0x66, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x30, 0x33, 0x31, 0x32, 0x35, 0x66, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x32, + 0x33, 0x34, 0x33, 0x37, 0x35, 0x66, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x7b, 0x0d, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x61, 0x20, 0x3d, 0x20, 0x65, 0x31, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x65, 0x32, 0x2e, 0x77, 0x3b, 0x0d, 0x0a, 0x09, + 0x09, 0x09, 0x64, 0x20, 0x2b, 0x3d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x61, 0x20, 0x2a, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x61, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, + 0x0d, 0x0a, 0x09, 0x09, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x64, 0x20, 0x2a, 0x20, 0x32, 0x35, 0x36, 0x2e, 0x30, 0x66, 0x20, 0x2b, 0x20, 0x2e, 0x35, 0x66, 0x2c, 0x20, + 0x30, 0x2e, 0x30, 0x66, 0x2c, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x5f, 0x4d, 0x41, 0x58, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x29, 0x28, 0x64, 0x29, 0x3b, 0x0d, 0x0a, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x09, 0x09, 0x2f, 0x2f, 0x20, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x50, 0x55, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, + 0x73, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x72, 0x20, + 0x3d, 0x20, 0x65, 0x31, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x65, 0x32, 0x2e, 0x78, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x67, 0x20, 0x3d, 0x20, 0x65, 0x31, 0x2e, 0x79, 0x20, + 0x2d, 0x20, 0x65, 0x32, 0x2e, 0x79, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x62, 0x20, 0x3d, 0x20, 0x65, 0x31, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x65, 0x32, 0x2e, 0x7a, 0x3b, + 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x6c, 0x20, 0x3d, 0x20, 0x64, 0x72, 0x20, 0x2a, 0x20, 0x32, 0x37, 0x20, 0x2b, 0x20, 0x64, 0x67, + 0x20, 0x2a, 0x20, 0x39, 0x32, 0x20, 0x2b, 0x20, 0x64, 0x62, 0x20, 0x2a, 0x20, 0x39, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x63, 0x72, 0x20, + 0x3d, 0x20, 0x64, 0x72, 0x20, 0x2a, 0x20, 0x31, 0x32, 0x38, 0x20, 0x2d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x6c, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x5f, 0x63, 0x62, 0x20, 0x3d, 0x20, 0x64, 0x62, 0x20, 0x2a, 0x20, 0x31, 0x32, 0x38, 0x20, 0x2d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x6c, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, + 0x09, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x29, 0x28, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x6c, 0x20, 0x2a, 0x20, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x5f, 0x6c, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x37, 0x55, 0x29, 0x20, 0x2b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x28, 0x28, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x29, 0x28, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x5f, 0x63, 0x72, 0x20, 0x2a, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x63, 0x72, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x37, 0x55, 0x29, 0x20, 0x2a, 0x20, 0x32, 0x36, 0x55, 0x29, 0x20, + 0x3e, 0x3e, 0x20, 0x37, 0x55, 0x29, 0x20, 0x2b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x28, 0x28, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x29, 0x28, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x63, 0x62, 0x20, + 0x2a, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x63, 0x62, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x37, 0x55, 0x29, 0x20, 0x2a, 0x20, 0x33, 0x55, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x37, 0x55, 0x29, 0x3b, + 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x61, + 0x20, 0x3d, 0x20, 0x28, 0x65, 0x31, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x65, 0x32, 0x2e, 0x77, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x37, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x64, 0x20, 0x2b, 0x3d, + 0x20, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x29, 0x28, 0x64, 0x61, 0x20, 0x2a, 0x20, 0x64, 0x61, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x37, 0x55, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, + 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x64, 0x3b, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x65, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x72, 0x20, 0x3d, 0x20, 0x65, + 0x31, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x65, 0x32, 0x2e, 0x78, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x67, 0x20, 0x3d, 0x20, 0x65, 0x31, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x65, + 0x32, 0x2e, 0x79, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x62, 0x20, 0x3d, 0x20, 0x65, 0x31, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x65, 0x32, 0x2e, 0x7a, 0x3b, 0x09, 0x0d, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x61, 0x20, 0x3d, 0x20, 0x65, 0x31, 0x2e, 0x77, 0x20, 0x2d, 0x20, 0x65, 0x32, 0x2e, 0x77, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x64, 0x72, 0x20, 0x2a, 0x20, 0x64, 0x72, 0x20, 0x2b, 0x20, 0x64, 0x67, 0x20, 0x2a, 0x20, 0x64, 0x67, 0x20, 0x2b, 0x20, 0x64, 0x62, 0x20, 0x2a, 0x20, 0x64, 0x62, 0x20, 0x2b, 0x20, + 0x64, 0x61, 0x20, 0x2a, 0x20, 0x64, 0x61, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, + 0x72, 0x20, 0x3d, 0x20, 0x65, 0x31, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x65, 0x32, 0x2e, 0x78, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x67, 0x20, 0x3d, 0x20, 0x65, 0x31, 0x2e, + 0x79, 0x20, 0x2d, 0x20, 0x65, 0x32, 0x2e, 0x79, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x62, 0x20, 0x3d, 0x20, 0x65, 0x31, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x65, 0x32, 0x2e, + 0x7a, 0x3b, 0x09, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x72, 0x20, 0x2a, 0x20, 0x64, 0x72, 0x20, 0x2b, 0x20, 0x64, 0x67, 0x20, 0x2a, 0x20, 0x64, 0x67, 0x20, + 0x2b, 0x20, 0x64, 0x62, 0x20, 0x2a, 0x20, 0x64, 0x62, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x5f, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x5f, 0x20, 0x28, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x29, 0x29, 0x20, 0x65, 0x74, 0x63, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x61, 0x67, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x62, 0x69, 0x67, 0x20, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x75, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x3a, 0x0d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x62, 0x69, 0x74, 0x20, 0x6f, 0x66, 0x73, 0x3a, 0x20, 0x20, 0x35, 0x36, 0x20, 0x20, 0x34, 0x38, 0x20, 0x20, 0x34, 0x30, 0x20, + 0x20, 0x33, 0x32, 0x20, 0x20, 0x32, 0x34, 0x20, 0x20, 0x31, 0x36, 0x20, 0x20, 0x20, 0x38, 0x20, 0x20, 0x20, 0x30, 0x0d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x6f, 0x66, + 0x73, 0x3a, 0x20, 0x62, 0x30, 0x2c, 0x20, 0x62, 0x31, 0x2c, 0x20, 0x62, 0x32, 0x2c, 0x20, 0x62, 0x33, 0x2c, 0x20, 0x62, 0x34, 0x2c, 0x20, 0x62, 0x35, 0x2c, 0x20, 0x62, 0x36, 0x2c, 0x20, 0x62, + 0x37, 0x20, 0x0d, 0x0a, 0x09, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x75, 0x69, 0x6e, + 0x74, 0x36, 0x34, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x38, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x3b, + 0x0d, 0x0a, 0x0d, 0x0a, 0x7d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, + 0x20, 0x38, 0x55, 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x32, 0x55, 0x2c, + 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x31, 0x55, 0x20, 0x3c, 0x3c, 0x20, 0x63, + 0x45, 0x54, 0x43, 0x31, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x69, 0x74, 0x73, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x4d, 0x61, 0x73, 0x6b, 0x20, 0x3d, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x2d, 0x20, 0x31, 0x55, + 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x32, 0x55, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, + 0x54, 0x43, 0x31, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x55, 0x20, 0x3c, 0x3c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, + 0x68, 0x69, 0x66, 0x74, 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x4c, 0x53, 0x42, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, + 0x73, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x4d, 0x53, 0x42, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x31, 0x36, 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, + 0x43, 0x31, 0x46, 0x6c, 0x69, 0x70, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x33, 0x32, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, 0x69, 0x66, + 0x66, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x33, 0x33, 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4e, 0x75, 0x6d, 0x42, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x49, 0x6e, 0x74, 0x65, 0x6e, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x49, 0x6e, 0x74, 0x65, 0x6e, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4e, 0x75, 0x6d, 0x42, 0x69, 0x74, 0x73, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x52, 0x69, 0x67, 0x68, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x6e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x33, 0x34, 0x2c, 0x0d, 0x0a, + 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x4c, 0x65, 0x66, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x69, 0x74, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x33, 0x37, 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x42, 0x61, 0x73, 0x65, 0x2b, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x35, 0x20, 0x62, 0x69, 0x74, 0x20, 0x62, 0x61, 0x73, 0x65, 0x73, 0x2c, 0x20, 0x33, 0x20, 0x62, 0x69, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, + 0x29, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x42, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x4e, 0x75, 0x6d, 0x42, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, + 0x35, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x42, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x4d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x3c, + 0x3c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x42, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x4e, 0x75, 0x6d, 0x42, 0x69, 0x74, 0x73, 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, + 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x4e, 0x75, 0x6d, 0x42, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x33, 0x2c, + 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x63, 0x45, + 0x54, 0x43, 0x31, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x4e, 0x75, 0x6d, 0x42, 0x69, 0x74, 0x73, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, + 0x31, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x4d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, + 0x65, 0x6c, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x4e, 0x75, 0x6d, 0x42, 0x69, 0x74, 0x73, 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x42, + 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x52, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x35, 0x39, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, + 0x31, 0x42, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x47, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x35, 0x31, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, + 0x54, 0x43, 0x31, 0x42, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x42, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x34, 0x33, 0x2c, 0x0d, 0x0a, 0x0d, + 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x33, 0x52, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x35, + 0x36, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x33, 0x47, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, + 0x3d, 0x20, 0x34, 0x38, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x33, 0x42, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x20, 0x3d, 0x20, 0x34, 0x30, 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x20, 0x28, 0x6e, 0x6f, 0x6e, 0x2d, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x29, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x74, 0x77, 0x6f, 0x20, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x70, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x61, 0x73, 0x65, 0x73, 0x29, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6d, + 0x70, 0x4e, 0x75, 0x6d, 0x42, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x34, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6d, + 0x70, 0x4d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x4e, 0x75, 0x6d, + 0x42, 0x69, 0x74, 0x73, 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x52, 0x31, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x36, 0x30, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x47, 0x31, 0x42, 0x69, 0x74, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x35, 0x32, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x42, 0x31, 0x42, 0x69, + 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x34, 0x34, 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, + 0x52, 0x32, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x35, 0x36, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, + 0x72, 0x34, 0x47, 0x32, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x34, 0x38, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, + 0x6c, 0x6f, 0x72, 0x34, 0x42, 0x32, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x34, 0x30, 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x43, + 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x2d, 0x34, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x45, 0x54, 0x43, 0x31, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, + 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x3a, 0x0d, 0x0a, 0x09, 0x2f, 0x2f, + 0x20, 0x30, 0x20, 0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x32, 0x20, 0x20, 0x20, 0x33, 0x20, 0x20, 0x20, 0x34, 0x20, 0x20, 0x20, 0x35, 0x20, 0x20, 0x20, 0x36, 0x20, 0x20, 0x20, 0x37, 0x0d, 0x0a, + 0x09, 0x2f, 0x2f, 0x20, 0x30, 0x30, 0x30, 0x20, 0x30, 0x30, 0x31, 0x20, 0x30, 0x31, 0x30, 0x20, 0x30, 0x31, 0x31, 0x20, 0x31, 0x30, 0x30, 0x20, 0x31, 0x30, 0x31, 0x20, 0x31, 0x31, 0x30, 0x20, + 0x31, 0x31, 0x31, 0x0d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x30, 0x20, 0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x32, 0x20, 0x20, 0x20, 0x33, 0x20, 0x20, 0x20, 0x2d, 0x34, 0x20, 0x20, 0x2d, 0x33, 0x20, + 0x20, 0x2d, 0x32, 0x20, 0x20, 0x2d, 0x31, 0x0d, 0x0a, 0x7d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x42, 0x41, 0x53, 0x49, 0x53, 0x55, 0x5f, 0x45, 0x54, + 0x43, 0x31, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x46, 0x49, 0x54, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x20, + 0x28, 0x31, 0x36, 0x35, 0x29, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x7b, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, + 0x20, 0x6d, 0x5f, 0x76, 0x5b, 0x34, 0x5d, 0x3b, 0x20, 0x7d, 0x20, 0x67, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x74, + 0x61, 0x62, 0x5b, 0x42, 0x41, 0x53, 0x49, 0x53, 0x55, 0x5f, 0x45, 0x54, 0x43, 0x31, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x46, 0x49, 0x54, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5d, 0x20, 0x3d, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, + 0x20, 0x38, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, + 0x20, 0x36, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x37, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, + 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x37, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, + 0x38, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x35, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, + 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x37, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x34, 0x20, 0x7d, 0x20, + 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x36, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x30, + 0x2c, 0x20, 0x37, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x37, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, + 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, + 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, + 0x20, 0x32, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, + 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x2c, 0x20, + 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, + 0x31, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, + 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x31, + 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x35, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, + 0x7b, 0x20, 0x36, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, + 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x36, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x38, 0x2c, + 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x36, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, + 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x31, 0x2c, 0x20, + 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, + 0x32, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, + 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x35, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x35, + 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, + 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x37, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, + 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x36, 0x2c, 0x20, 0x30, 0x2c, + 0x20, 0x32, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, + 0x20, 0x32, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x20, 0x7d, + 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, + 0x36, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, + 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, + 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, + 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, + 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x2c, + 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, + 0x20, 0x34, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x20, 0x7d, + 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, + 0x33, 0x2c, 0x20, 0x34, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, + 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x32, + 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x35, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x33, + 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x35, 0x20, 0x7d, 0x20, 0x7d, + 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x2c, + 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, + 0x20, 0x32, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x20, 0x7d, + 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x32, 0x2c, 0x20, + 0x31, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x36, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, + 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x30, + 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x37, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x31, + 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, + 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x2c, + 0x20, 0x34, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x37, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, + 0x20, 0x30, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, + 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x32, 0x2c, 0x20, + 0x34, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, + 0x34, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, + 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x33, + 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x37, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, + 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x32, 0x20, + 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x38, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, + 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x34, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, + 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x35, 0x2c, 0x20, + 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, + 0x33, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, + 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, + 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, + 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x20, + 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x2c, + 0x20, 0x32, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, + 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x2c, 0x20, + 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, + 0x33, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x36, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, + 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x32, + 0x2c, 0x20, 0x34, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x34, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x35, + 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, + 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x2c, + 0x20, 0x30, 0x2c, 0x20, 0x35, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x34, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, + 0x20, 0x35, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x20, 0x7d, + 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, + 0x31, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x35, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, + 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x34, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x30, + 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, + 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x35, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x35, 0x20, 0x7d, 0x20, 0x7d, + 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, + 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, + 0x20, 0x33, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x35, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x7d, + 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x2c, 0x20, + 0x31, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, + 0x20, 0x7b, 0x20, 0x36, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x34, + 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x32, + 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x35, 0x20, 0x7d, 0x20, 0x7d, + 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x37, 0x2c, 0x20, 0x30, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, + 0x20, 0x32, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x35, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, + 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x36, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x34, 0x20, 0x7d, + 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, + 0x33, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x37, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, + 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x37, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, + 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x31, + 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x34, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, + 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x35, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, + 0x20, 0x36, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x35, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x30, 0x2c, + 0x20, 0x32, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x36, 0x20, 0x7d, 0x20, 0x7d, 0x2c, 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x35, 0x20, 0x7d, 0x20, 0x7d, 0x2c, + 0x7b, 0x20, 0x7b, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x36, 0x20, 0x7d, 0x20, 0x7d, 0x0d, 0x0a, 0x7d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5b, 0x63, 0x45, 0x54, 0x43, 0x31, + 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5d, 0x5b, 0x63, 0x45, 0x54, 0x43, 0x31, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5d, 0x20, 0x3d, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x2d, 0x38, 0x2c, 0x20, 0x20, 0x2d, 0x32, 0x2c, 0x20, 0x20, 0x20, 0x32, 0x2c, + 0x20, 0x20, 0x20, 0x38, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x20, 0x2d, 0x31, 0x37, 0x2c, 0x20, 0x20, 0x2d, 0x35, 0x2c, 0x20, 0x20, 0x35, 0x2c, 0x20, 0x20, 0x31, 0x37, 0x20, 0x7d, 0x2c, 0x20, 0x7b, + 0x20, 0x2d, 0x32, 0x39, 0x2c, 0x20, 0x20, 0x2d, 0x39, 0x2c, 0x20, 0x20, 0x20, 0x39, 0x2c, 0x20, 0x20, 0x32, 0x39, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x20, 0x20, 0x2d, 0x34, 0x32, 0x2c, 0x20, 0x2d, + 0x31, 0x33, 0x2c, 0x20, 0x31, 0x33, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x2d, 0x36, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x38, 0x2c, 0x20, 0x31, 0x38, 0x2c, + 0x20, 0x20, 0x36, 0x30, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x20, 0x2d, 0x38, 0x30, 0x2c, 0x20, 0x2d, 0x32, 0x34, 0x2c, 0x20, 0x32, 0x34, 0x2c, 0x20, 0x20, 0x38, 0x30, 0x20, 0x7d, 0x2c, 0x20, 0x7b, + 0x20, 0x2d, 0x31, 0x30, 0x36, 0x2c, 0x20, 0x2d, 0x33, 0x33, 0x2c, 0x20, 0x33, 0x33, 0x2c, 0x20, 0x31, 0x30, 0x36, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x20, 0x2d, 0x31, 0x38, 0x33, 0x2c, 0x20, 0x2d, + 0x34, 0x37, 0x2c, 0x20, 0x34, 0x37, 0x2c, 0x20, 0x31, 0x38, 0x33, 0x20, 0x7d, 0x0d, 0x0a, 0x7d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x75, 0x69, + 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x67, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5b, 0x63, + 0x45, 0x54, 0x43, 0x31, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x2c, + 0x20, 0x30, 0x20, 0x7d, 0x3b, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x67, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x5b, 0x63, 0x45, 0x54, 0x43, 0x31, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x7d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6f, 0x66, 0x73, 0x2c, 0x20, 0x75, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x29, 0x20, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x6f, 0x66, 0x73, 0x20, 0x2b, 0x20, + 0x6e, 0x75, 0x6d, 0x29, 0x20, 0x3c, 0x3d, 0x20, 0x36, 0x34, 0x55, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x75, 0x6d, 0x20, 0x26, 0x26, 0x20, 0x28, 0x6e, + 0x75, 0x6d, 0x20, 0x3c, 0x3d, 0x20, 0x38, 0x55, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x6f, 0x66, 0x73, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x28, 0x28, 0x6f, 0x66, 0x73, 0x20, 0x2b, 0x20, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x37, 0x20, 0x2d, 0x20, 0x28, 0x6f, 0x66, 0x73, + 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, + 0x74, 0x5f, 0x6f, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x66, 0x73, 0x20, 0x26, 0x20, 0x37, 0x3b, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x70, 0x2d, 0x3e, 0x6d, 0x5f, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x73, 0x5d, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x73, 0x29, + 0x20, 0x26, 0x20, 0x28, 0x28, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x6e, 0x75, 0x6d, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x2a, 0x70, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6f, 0x66, 0x73, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6e, 0x75, 0x6d, + 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x69, 0x74, 0x73, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x6f, 0x66, + 0x73, 0x20, 0x2b, 0x20, 0x6e, 0x75, 0x6d, 0x29, 0x20, 0x3c, 0x3d, 0x20, 0x36, 0x34, 0x55, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x75, 0x6d, 0x20, 0x26, + 0x26, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x20, 0x3c, 0x20, 0x33, 0x32, 0x55, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x6f, 0x66, 0x73, 0x20, 0x3e, 0x3e, + 0x20, 0x33, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x28, 0x28, 0x6f, 0x66, 0x73, 0x20, 0x2b, 0x20, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x29, 0x29, 0x3b, 0x0d, + 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x69, 0x74, 0x73, 0x20, 0x3c, 0x20, 0x28, 0x31, 0x55, 0x20, 0x3c, 0x3c, 0x20, 0x6e, 0x75, 0x6d, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x09, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x37, 0x20, 0x2d, 0x20, 0x28, 0x6f, + 0x66, 0x73, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, + 0x62, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x66, 0x73, 0x20, 0x26, 0x20, 0x37, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x5f, 0x74, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x6e, 0x75, 0x6d, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x2d, 0x3e, + 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x73, 0x5d, 0x20, 0x26, 0x3d, 0x20, 0x7e, 0x28, 0x6d, 0x61, 0x73, 0x6b, 0x20, 0x3c, 0x3c, 0x20, 0x62, + 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x62, 0x79, 0x74, 0x65, 0x5f, + 0x6f, 0x66, 0x73, 0x5d, 0x20, 0x7c, 0x3d, 0x20, 0x28, 0x62, 0x69, 0x74, 0x73, 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x73, 0x29, 0x3b, 0x0d, + 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x69, 0x70, 0x5f, 0x62, 0x69, + 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x29, 0x20, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x70, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x26, 0x20, 0x31, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, + 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x69, 0x70, 0x5f, 0x62, 0x69, 0x74, 0x28, 0x65, + 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x66, 0x6c, 0x69, 0x70, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x70, 0x2d, 0x3e, + 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x26, 0x3d, 0x20, 0x7e, 0x31, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x33, + 0x5d, 0x20, 0x7c, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x29, 0x28, 0x66, 0x6c, 0x69, 0x70, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, + 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x62, 0x69, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x74, + 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x29, 0x20, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x70, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x26, 0x20, 0x32, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, + 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x62, 0x69, 0x74, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, + 0x70, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x64, 0x69, 0x66, 0x66, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x70, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x33, 0x5d, + 0x20, 0x26, 0x3d, 0x20, 0x7e, 0x32, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x7c, 0x3d, 0x20, 0x28, 0x28, 0x75, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x74, 0x29, 0x28, 0x64, 0x69, 0x66, 0x66, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x28, 0x30, + 0x2d, 0x37, 0x29, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x64, + 0x2e, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x3d, 0x30, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x2f, 0x74, 0x6f, 0x70, 0x20, 0x28, 0x43, 0x57, + 0x20, 0x31, 0x29, 0x2c, 0x20, 0x31, 0x3d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x28, 0x43, 0x57, 0x20, 0x32, 0x29, 0x0d, 0x0a, 0x75, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x75, 0x62, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x29, 0x20, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, + 0x64, 0x20, 0x3c, 0x20, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6f, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x73, + 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x20, 0x3f, 0x20, 0x32, 0x20, 0x3a, 0x20, 0x35, 0x3b, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x70, 0x2d, + 0x3e, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x3e, 0x3e, 0x20, 0x6f, 0x66, 0x73, 0x29, 0x20, 0x26, 0x20, 0x37, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, + 0x2f, 0x20, 0x53, 0x65, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x28, 0x30, 0x2d, 0x37, 0x29, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x69, 0x64, 0x20, 0x28, 0x30, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x74, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x74, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, + 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x20, 0x3c, 0x20, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x74, 0x20, 0x3c, 0x20, 0x38, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6f, 0x66, 0x73, 0x20, + 0x3d, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x20, 0x3f, 0x20, 0x32, 0x20, 0x3a, 0x20, 0x35, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x26, 0x3d, 0x20, 0x7e, 0x28, 0x37, 0x20, 0x3c, 0x3c, 0x20, 0x6f, 0x66, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x7c, 0x3d, 0x20, 0x28, 0x74, 0x20, 0x3c, 0x3c, 0x20, 0x6f, 0x66, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x65, 0x74, 0x63, 0x31, + 0x73, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x74, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, + 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x70, 0x2c, 0x20, 0x30, 0x2c, + 0x20, 0x74, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x70, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x74, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x78, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x74, 0x20, 0x79, 0x29, 0x20, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x78, 0x20, 0x7c, 0x20, 0x79, 0x29, 0x20, 0x3c, 0x20, 0x34, 0x29, 0x3b, + 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, + 0x78, 0x20, 0x2a, 0x20, 0x34, 0x20, 0x2b, 0x20, 0x79, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, + 0x5f, 0x62, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x37, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x2a, 0x70, 0x20, 0x3d, 0x20, 0x26, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, + 0x37, 0x20, 0x2d, 0x20, 0x28, 0x62, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x29, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6c, 0x73, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x5f, + 0x6f, 0x66, 0x73, 0x29, 0x20, 0x26, 0x20, 0x31, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6d, 0x73, 0x62, 0x20, 0x3d, + 0x20, 0x28, 0x70, 0x5b, 0x2d, 0x32, 0x5d, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x73, 0x29, 0x20, 0x26, 0x20, 0x31, 0x3b, 0x0d, 0x0a, 0x09, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6c, 0x73, 0x62, 0x20, 0x7c, 0x20, 0x28, 0x6d, 0x73, 0x62, 0x20, + 0x3c, 0x3c, 0x20, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x30, 0x2d, 0x33, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x69, 0x6e, + 0x74, 0x6f, 0x20, 0x67, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x0d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, + 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, + 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x78, 0x2c, 0x20, 0x75, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x79, 0x29, 0x20, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x5f, 0x74, 0x6f, + 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5b, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x61, + 0x77, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x5d, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, + 0x0a, 0x2f, 0x2f, 0x20, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x22, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x30, + 0x2d, 0x33, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x67, 0x5f, + 0x65, 0x74, 0x63, 0x31, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x78, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x79, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x5f, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x78, 0x20, 0x7c, 0x20, 0x79, 0x20, 0x7c, 0x20, 0x76, 0x61, + 0x6c, 0x29, 0x20, 0x3c, 0x20, 0x34, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x69, 0x74, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x2a, 0x20, 0x34, 0x20, 0x2b, 0x20, 0x79, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x2a, 0x70, 0x20, + 0x3d, 0x20, 0x26, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x37, 0x20, 0x2d, 0x20, 0x28, 0x62, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x29, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x79, 0x74, + 0x65, 0x5f, 0x62, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x20, 0x37, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, + 0x5f, 0x6f, 0x66, 0x73, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, 0x31, 0x5f, 0x76, 0x61, + 0x6c, 0x20, 0x3d, 0x20, 0x67, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x5b, 0x76, 0x61, 0x6c, + 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6c, 0x73, 0x62, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, + 0x31, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x26, 0x20, 0x31, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6d, 0x73, 0x62, 0x20, + 0x3d, 0x20, 0x65, 0x74, 0x63, 0x31, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3e, 0x3e, 0x20, 0x31, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x26, 0x3d, 0x20, 0x7e, 0x6d, 0x61, + 0x73, 0x6b, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x7c, 0x3d, 0x20, 0x28, 0x6c, 0x73, 0x62, 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x5f, 0x6f, + 0x66, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x70, 0x5b, 0x2d, 0x32, 0x5d, 0x20, 0x26, 0x3d, 0x20, 0x7e, 0x6d, 0x61, 0x73, 0x6b, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x5b, 0x2d, 0x32, 0x5d, + 0x20, 0x7c, 0x3d, 0x20, 0x28, 0x6d, 0x73, 0x62, 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, + 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x34, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, + 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x69, 0x64, 0x78, 0x2c, + 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x63, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x78, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, + 0x09, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x52, 0x32, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x34, 0x2c, 0x20, + 0x28, 0x63, 0x20, 0x3e, 0x3e, 0x20, 0x38, 0x29, 0x20, 0x26, 0x20, 0x31, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, + 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x34, 0x47, 0x32, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x28, 0x63, 0x20, 0x3e, 0x3e, 0x20, 0x34, 0x29, 0x20, 0x26, 0x20, 0x31, 0x35, 0x29, 0x3b, + 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x42, 0x32, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x34, + 0x2c, 0x20, 0x63, 0x20, 0x26, 0x20, 0x31, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x74, 0x63, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, + 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x52, 0x31, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x28, 0x63, 0x20, 0x3e, 0x3e, + 0x20, 0x38, 0x29, 0x20, 0x26, 0x20, 0x31, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x47, 0x31, 0x42, 0x69, + 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x28, 0x63, 0x20, 0x3e, 0x3e, 0x20, 0x34, 0x29, 0x20, 0x26, 0x20, 0x31, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x65, + 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, + 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x42, 0x31, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x63, 0x20, 0x26, + 0x20, 0x31, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x34, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x69, 0x64, 0x78, 0x29, 0x20, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x72, 0x2c, 0x20, 0x67, 0x2c, 0x20, 0x62, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x78, 0x29, 0x0d, 0x0a, 0x09, 0x7b, + 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, + 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x52, 0x32, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x2c, 0x20, 0x34, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x67, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x47, 0x32, 0x42, 0x69, + 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x34, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x62, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, + 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, + 0x72, 0x34, 0x42, 0x32, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x34, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x09, + 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, + 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x52, 0x31, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x2c, 0x20, 0x34, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x67, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x47, 0x31, 0x42, + 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x34, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x62, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, + 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x41, 0x62, 0x73, 0x43, 0x6f, 0x6c, + 0x6f, 0x72, 0x34, 0x42, 0x31, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x34, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x29, 0x28, 0x62, 0x20, 0x7c, 0x20, 0x28, 0x67, 0x20, 0x3c, 0x3c, 0x20, 0x34, 0x55, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x72, 0x20, 0x3c, + 0x3c, 0x20, 0x38, 0x55, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x35, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, + 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x63, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, + 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x42, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x35, + 0x52, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x28, 0x63, 0x20, 0x3e, 0x3e, 0x20, 0x31, 0x30, 0x29, 0x20, 0x26, 0x20, 0x33, 0x31, 0x29, 0x3b, 0x0d, + 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x42, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x47, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x35, 0x2c, 0x20, + 0x28, 0x63, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x29, 0x20, 0x26, 0x20, 0x33, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, + 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x42, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x35, 0x42, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x63, 0x20, 0x26, 0x20, 0x33, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x75, + 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x35, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, + 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x42, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, + 0x72, 0x35, 0x52, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x74, 0x20, 0x67, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x42, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x47, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x2c, 0x20, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, + 0x42, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x42, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x29, 0x28, 0x62, 0x20, 0x7c, 0x20, 0x28, 0x67, 0x20, 0x3c, 0x3c, 0x20, 0x35, 0x55, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x72, + 0x20, 0x3c, 0x3c, 0x20, 0x31, 0x30, 0x55, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x63, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, + 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x43, + 0x6f, 0x6c, 0x6f, 0x72, 0x33, 0x52, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x28, 0x63, 0x20, 0x3e, 0x3e, 0x20, 0x36, 0x29, 0x20, 0x26, 0x20, 0x37, + 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x33, 0x47, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, + 0x20, 0x33, 0x2c, 0x20, 0x28, 0x63, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x29, 0x20, 0x26, 0x20, 0x37, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, + 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x43, + 0x6f, 0x6c, 0x6f, 0x72, 0x33, 0x42, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x63, 0x20, 0x26, 0x20, 0x37, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, + 0x0d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x5f, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x29, 0x20, 0x0d, + 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, 0x65, 0x6c, + 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x33, 0x52, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x67, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, + 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x33, 0x47, 0x42, 0x69, + 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x20, + 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x2c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x33, 0x42, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x33, 0x29, + 0x3b, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x29, 0x28, 0x62, 0x20, 0x7c, 0x20, 0x28, 0x67, 0x20, 0x3c, 0x3c, 0x20, + 0x33, 0x55, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x72, 0x20, 0x3c, 0x3c, 0x20, 0x36, 0x55, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x2a, 0x70, 0x52, 0x2c, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x2a, 0x70, 0x47, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x2a, 0x70, 0x42, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, + 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x33, 0x20, 0x3e, 0x3e, 0x20, 0x36, 0x29, 0x20, 0x26, 0x20, 0x37, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, + 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x29, 0x20, 0x26, 0x20, 0x37, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, + 0x6b, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x20, 0x26, 0x20, 0x37, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x72, 0x20, 0x3e, 0x3d, 0x20, 0x34, 0x29, 0x20, 0x72, 0x20, + 0x2d, 0x3d, 0x20, 0x38, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x67, 0x20, 0x3e, 0x3d, 0x20, 0x34, 0x29, 0x20, 0x67, 0x20, 0x2d, 0x3d, 0x20, 0x38, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x66, + 0x20, 0x28, 0x62, 0x20, 0x3e, 0x3d, 0x20, 0x34, 0x29, 0x20, 0x62, 0x20, 0x2d, 0x3d, 0x20, 0x38, 0x3b, 0x0d, 0x0a, 0x09, 0x2a, 0x70, 0x52, 0x20, 0x3d, 0x20, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x2a, + 0x70, 0x47, 0x20, 0x3d, 0x20, 0x67, 0x3b, 0x0d, 0x0a, 0x09, 0x2a, 0x70, 0x42, 0x20, 0x3d, 0x20, 0x62, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x65, 0x74, + 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x28, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x2a, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, + 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x29, 0x0d, 0x0a, + 0x7b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x72, 0x2c, 0x20, 0x64, 0x67, 0x2c, 0x20, 0x64, 0x62, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x28, 0x26, 0x64, 0x72, 0x2c, 0x20, 0x26, 0x64, 0x67, 0x2c, 0x20, 0x26, 0x64, 0x62, 0x2c, 0x20, 0x70, 0x61, 0x63, + 0x6b, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x20, 0x26, 0x20, 0x33, 0x31, 0x55, 0x29, 0x20, 0x2b, 0x20, 0x64, 0x62, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x20, 0x3d, 0x20, 0x28, + 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x55, 0x29, 0x20, 0x26, 0x20, 0x33, 0x31, 0x55, 0x29, 0x20, 0x2b, 0x20, 0x64, + 0x67, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x20, 0x3e, 0x3e, 0x20, + 0x31, 0x30, 0x55, 0x29, 0x20, 0x26, 0x20, 0x33, 0x31, 0x55, 0x29, 0x20, 0x2b, 0x20, 0x64, 0x72, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x29, 0x28, 0x72, 0x20, 0x7c, 0x20, + 0x67, 0x20, 0x7c, 0x20, 0x62, 0x29, 0x20, 0x3e, 0x20, 0x33, 0x31, 0x55, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x72, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x09, + 0x09, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x67, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x62, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, + 0x6d, 0x70, 0x28, 0x62, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, + 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x55, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x62, 0x20, 0x3e, 0x3e, 0x20, 0x32, + 0x55, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x67, 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x55, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x67, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x55, 0x29, + 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x55, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x72, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x55, 0x29, 0x3b, 0x0d, + 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x2a, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x29, 0x28, + 0x72, 0x2c, 0x20, 0x67, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x55, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x65, + 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, + 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x5f, 0x74, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x70, 0x61, + 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x20, 0x26, 0x20, 0x33, 0x31, 0x55, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x67, 0x20, + 0x3d, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x55, 0x29, 0x20, 0x26, 0x20, 0x33, 0x31, 0x55, 0x3b, 0x0d, 0x0a, + 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x20, 0x3e, 0x3e, 0x20, + 0x31, 0x30, 0x55, 0x29, 0x20, 0x26, 0x20, 0x33, 0x31, 0x55, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, + 0x0a, 0x09, 0x09, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x55, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x62, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x55, 0x29, 0x3b, 0x0d, 0x0a, 0x09, + 0x09, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x67, 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x55, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x67, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x55, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x72, + 0x20, 0x3d, 0x20, 0x28, 0x72, 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x55, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x72, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x55, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, + 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x29, 0x28, 0x72, 0x2c, 0x20, 0x67, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x6d, + 0x69, 0x6e, 0x28, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x55, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, + 0x62, 0x61, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x31, + 0x36, 0x5f, 0x74, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2c, 0x20, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x20, + 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x20, 0x26, 0x20, 0x31, 0x35, 0x55, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, + 0x74, 0x20, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x20, 0x3e, 0x3e, 0x20, 0x34, 0x55, 0x29, 0x20, 0x26, 0x20, 0x31, 0x35, + 0x55, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x34, + 0x20, 0x3e, 0x3e, 0x20, 0x38, 0x55, 0x29, 0x20, 0x26, 0x20, 0x31, 0x35, 0x55, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x0d, 0x0a, + 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x20, 0x3c, 0x3c, 0x20, 0x34, 0x55, 0x29, 0x20, 0x7c, 0x20, 0x62, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x67, 0x20, 0x3d, 0x20, + 0x28, 0x67, 0x20, 0x3c, 0x3c, 0x20, 0x34, 0x55, 0x29, 0x20, 0x7c, 0x20, 0x67, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x20, 0x3c, 0x3c, 0x20, 0x34, 0x55, 0x29, 0x20, + 0x7c, 0x20, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x29, + 0x28, 0x72, 0x2c, 0x20, 0x67, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x55, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, + 0x0a, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x64, 0x69, 0x64, 0x6e, 0x27, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x2c, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x65, 0x64, 0x0d, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, + 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x28, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x2a, + 0x20, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x62, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x62, 0x69, 0x74, 0x28, 0x70, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x29, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x0d, + 0x0a, 0x09, 0x09, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x64, 0x65, 0x6c, 0x74, + 0x61, 0x33, 0x28, 0x26, 0x62, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x35, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x29, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x5f, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x29, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x6c, 0x73, + 0x65, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x62, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x35, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x35, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x29, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, + 0x0a, 0x09, 0x09, 0x62, 0x20, 0x3d, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x28, 0x65, + 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x34, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, + 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, + 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x2a, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x3d, 0x20, 0x67, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5b, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x64, 0x63, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x0d, + 0x0a, 0x09, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, + 0x29, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x28, 0x62, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x26, 0x64, 0x63, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x28, 0x62, 0x2e, 0x79, 0x20, 0x2b, + 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x26, 0x64, 0x63, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, + 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x28, 0x62, 0x2e, 0x7a, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x26, 0x64, 0x63, + 0x29, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x29, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x28, 0x62, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x70, + 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x26, 0x64, 0x63, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x5f, 0x66, + 0x6c, 0x61, 0x67, 0x28, 0x62, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x26, 0x64, 0x63, 0x29, 0x2c, + 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x28, 0x62, 0x2e, 0x7a, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x26, 0x64, 0x63, 0x29, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x73, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x29, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x5f, 0x66, 0x6c, 0x61, + 0x67, 0x28, 0x62, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x26, 0x64, 0x63, 0x29, 0x2c, 0x20, 0x63, + 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x28, 0x62, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, + 0x32, 0x5d, 0x2c, 0x20, 0x26, 0x64, 0x63, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x28, 0x62, 0x2e, 0x7a, 0x20, 0x2b, 0x20, 0x70, 0x49, + 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x26, 0x64, 0x63, 0x29, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x29, 0x28, 0x63, 0x6c, 0x61, + 0x6d, 0x70, 0x32, 0x35, 0x35, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x28, 0x62, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x33, 0x5d, + 0x2c, 0x20, 0x26, 0x64, 0x63, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x28, 0x62, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, + 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x26, 0x64, 0x63, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x5f, 0x66, 0x6c, 0x61, 0x67, + 0x28, 0x62, 0x2e, 0x7a, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x26, 0x64, 0x63, 0x29, 0x2c, 0x20, 0x32, 0x35, + 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x63, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x67, 0x65, 0x74, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x35, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x2a, 0x70, 0x42, 0x61, 0x73, 0x65, + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x62, + 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x2f, 0x2a, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x2a, 0x2f, 0x29, 0x20, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x2a, 0x70, 0x42, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, + 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x62, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x2e, 0x78, 0x20, 0x3c, + 0x3c, 0x20, 0x33, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x62, 0x2e, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x62, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x2e, 0x79, + 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x62, 0x2e, 0x79, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x62, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x62, + 0x2e, 0x7a, 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x62, 0x2e, 0x7a, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x2a, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x5f, 0x65, 0x74, + 0x63, 0x31, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, + 0x0a, 0x09, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, + 0x29, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x62, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x30, 0x5d, + 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x62, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x30, + 0x5d, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x62, 0x2e, 0x7a, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, + 0x30, 0x5d, 0x29, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, + 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x29, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x62, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, + 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x62, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, + 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x62, 0x2e, 0x7a, 0x20, 0x2b, 0x20, 0x70, 0x49, + 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x29, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, + 0x28, 0x62, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, + 0x35, 0x28, 0x62, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, + 0x35, 0x35, 0x28, 0x62, 0x2e, 0x7a, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, + 0x0d, 0x0a, 0x09, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, + 0x61, 0x29, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x62, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x33, + 0x5d, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x62, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, + 0x33, 0x5d, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x62, 0x2e, 0x7a, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5b, 0x33, 0x5d, 0x29, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x2a, 0x20, 0x70, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x75, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2f, 0x2a, 0x3d, 0x20, 0x30, 0x2a, 0x2f, 0x2c, 0x20, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2f, 0x2a, 0x3d, 0x20, 0x32, 0x2a, 0x2f, 0x29, 0x0d, 0x0a, + 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x0d, + 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, + 0x5f, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3c, 0x20, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x3b, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, + 0x61, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x34, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x67, 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x69, 0x70, 0x5f, 0x62, 0x69, 0x74, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x29, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x7b, 0x0d, + 0x0a, 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x79, 0x20, 0x3c, 0x20, 0x32, 0x3b, 0x20, + 0x79, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x78, 0x20, + 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x78, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x75, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x4d, 0x41, 0x58, + 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x73, + 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x73, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, + 0x5f, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, + 0x61, 0x6c, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x73, 0x5d, 0x2c, 0x20, 0x70, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x69, 0x78, + 0x65, 0x6c, 0x73, 0x5b, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x34, 0x5d, 0x2c, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x65, 0x72, 0x72, 0x20, 0x3c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x3d, + 0x20, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x65, 0x74, 0x63, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x73, + 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x79, 0x2c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x29, 0x3b, + 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x09, + 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x79, 0x20, 0x3c, 0x20, + 0x34, 0x3b, 0x20, 0x79, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, + 0x20, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x32, 0x3b, 0x20, 0x78, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, + 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x09, + 0x09, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, + 0x4d, 0x41, 0x58, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x30, + 0x3b, 0x20, 0x73, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x73, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x75, 0x69, 0x6e, + 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x73, 0x5d, 0x2c, 0x20, 0x70, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x5b, 0x28, 0x73, 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x79, 0x20, 0x2a, 0x20, + 0x34, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x65, 0x72, 0x72, 0x20, 0x3c, 0x20, 0x62, 0x65, 0x73, + 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x20, 0x3d, 0x20, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x73, + 0x75, 0x62, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x31, + 0x36, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x5f, 0x72, 0x67, 0x62, 0x28, 0x75, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x72, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x67, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, + 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x69, 0x61, + 0x73, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x37, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, + 0x72, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x20, 0x2a, 0x20, 0x31, 0x35, 0x55, 0x20, 0x2b, 0x20, 0x62, 0x69, 0x61, 0x73, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x35, 0x35, 0x55, 0x3b, 0x0d, 0x0a, 0x09, 0x09, + 0x67, 0x20, 0x3d, 0x20, 0x28, 0x67, 0x20, 0x2a, 0x20, 0x31, 0x35, 0x55, 0x20, 0x2b, 0x20, 0x62, 0x69, 0x61, 0x73, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x35, 0x35, 0x55, 0x3b, 0x0d, 0x0a, 0x09, 0x09, + 0x62, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x20, 0x2a, 0x20, 0x31, 0x35, 0x55, 0x20, 0x2b, 0x20, 0x62, 0x69, 0x61, 0x73, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x35, 0x35, 0x55, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, + 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x72, 0x2c, 0x20, 0x31, 0x35, 0x55, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x67, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, + 0x67, 0x2c, 0x20, 0x31, 0x35, 0x55, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x62, 0x2c, 0x20, 0x31, 0x35, 0x55, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x29, 0x28, 0x62, 0x20, 0x7c, 0x20, 0x28, 0x67, 0x20, 0x3c, 0x3c, 0x20, 0x34, 0x55, 0x29, 0x20, + 0x7c, 0x20, 0x28, 0x72, 0x20, 0x3c, 0x3c, 0x20, 0x38, 0x55, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, + 0x62, 0x69, 0x61, 0x73, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x37, 0x3b, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, + 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x5f, 0x72, 0x67, 0x62, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x2c, + 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x2c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, + 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x2c, 0x20, 0x69, + 0x6e, 0x74, 0x20, 0x67, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x72, 0x20, 0x3e, 0x3d, 0x20, 0x63, + 0x45, 0x54, 0x43, 0x31, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x69, 0x6e, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x20, 0x3c, 0x3d, 0x20, 0x63, 0x45, 0x54, 0x43, + 0x31, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x61, 0x78, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x67, 0x20, 0x3e, 0x3d, + 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x69, 0x6e, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x67, 0x20, 0x3c, 0x3d, 0x20, 0x63, 0x45, + 0x54, 0x43, 0x31, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x61, 0x78, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x62, 0x20, + 0x3e, 0x3d, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x69, 0x6e, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x62, 0x20, 0x3c, 0x3d, 0x20, + 0x63, 0x45, 0x54, 0x43, 0x31, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x61, 0x78, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x72, 0x20, 0x3c, 0x20, + 0x30, 0x29, 0x20, 0x72, 0x20, 0x2b, 0x3d, 0x20, 0x38, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x67, 0x20, 0x3c, 0x20, 0x30, 0x29, 0x20, 0x67, 0x20, 0x2b, 0x3d, 0x20, 0x38, 0x3b, 0x0d, + 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x3c, 0x20, 0x30, 0x29, 0x20, 0x62, 0x20, 0x2b, 0x3d, 0x20, 0x38, 0x3b, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, + 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x29, 0x28, 0x62, 0x20, 0x7c, 0x20, 0x28, 0x67, 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x72, 0x20, 0x3c, 0x3c, 0x20, 0x36, 0x29, + 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x63, 0x30, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x63, + 0x31, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, + 0x69, 0x66, 0x66, 0x5f, 0x62, 0x69, 0x74, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x34, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x30, 0x2c, + 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x28, 0x63, 0x30, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x64, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x34, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, + 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x34, 0x28, 0x63, 0x31, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x29, 0x3b, 0x0d, + 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x72, 0x67, 0x62, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x72, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x67, 0x2c, + 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x69, 0x61, 0x73, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x37, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x64, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x20, 0x2a, 0x20, 0x33, 0x31, 0x55, 0x20, 0x2b, 0x20, 0x62, 0x69, 0x61, 0x73, 0x29, 0x20, + 0x2f, 0x20, 0x32, 0x35, 0x35, 0x55, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x67, 0x20, 0x2a, 0x20, 0x33, 0x31, 0x55, 0x20, 0x2b, 0x20, 0x62, 0x69, 0x61, 0x73, 0x29, 0x20, + 0x2f, 0x20, 0x32, 0x35, 0x35, 0x55, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x20, 0x2a, 0x20, 0x33, 0x31, 0x55, 0x20, 0x2b, 0x20, 0x62, 0x69, 0x61, 0x73, 0x29, 0x20, + 0x2f, 0x20, 0x32, 0x35, 0x35, 0x55, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x72, 0x2c, 0x20, 0x33, 0x31, 0x55, 0x29, 0x3b, + 0x0d, 0x0a, 0x09, 0x67, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x67, 0x2c, 0x20, 0x33, 0x31, 0x55, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x62, 0x2c, + 0x20, 0x33, 0x31, 0x55, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x29, 0x28, 0x62, 0x20, 0x7c, + 0x20, 0x28, 0x67, 0x20, 0x3c, 0x3c, 0x20, 0x35, 0x55, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x72, 0x20, 0x3c, 0x3c, 0x20, 0x31, 0x30, 0x55, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, + 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x28, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x63, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x72, 0x67, 0x62, 0x28, + 0x63, 0x2e, 0x78, 0x2c, 0x20, 0x63, 0x2e, 0x79, 0x2c, 0x20, 0x63, 0x2e, 0x7a, 0x2c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x28, 0x65, 0x74, + 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x63, 0x30, 0x5f, 0x75, + 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x63, 0x31, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, + 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x62, 0x69, 0x74, 0x28, 0x70, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x35, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x28, 0x63, 0x30, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, + 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x31, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x63, 0x30, 0x5f, 0x75, 0x6e, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2e, 0x78, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x31, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, + 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x63, 0x30, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2e, 0x79, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x62, 0x20, 0x3d, 0x20, 0x63, + 0x31, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x63, 0x30, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2e, 0x7a, 0x3b, 0x0d, 0x0a, 0x0d, + 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x28, 0x64, 0x72, 0x2c, 0x20, 0x64, + 0x67, 0x2c, 0x20, 0x64, 0x62, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, + 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, + 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x63, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x0d, 0x0a, + 0x7b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x62, 0x69, 0x74, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x35, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x28, 0x63, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x09, + 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x28, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, + 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x63, 0x30, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x63, 0x31, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x62, 0x69, 0x74, 0x28, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, + 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x35, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x70, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x28, 0x63, 0x30, 0x5f, 0x75, 0x6e, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x31, 0x5f, + 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x63, 0x30, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2e, 0x78, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, + 0x74, 0x20, 0x64, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x31, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x63, 0x30, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x64, 0x2e, 0x79, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x62, 0x20, 0x3d, 0x20, 0x63, 0x31, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2e, 0x7a, 0x20, 0x2d, + 0x20, 0x63, 0x30, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2e, 0x7a, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x28, 0x28, 0x64, 0x72, 0x20, 0x3c, 0x20, 0x63, + 0x45, 0x54, 0x43, 0x31, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x69, 0x6e, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x64, 0x72, 0x20, 0x3e, 0x20, 0x63, 0x45, 0x54, 0x43, + 0x31, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x61, 0x78, 0x29, 0x29, 0x20, 0x7c, 0x7c, 0x0d, 0x0a, 0x09, 0x09, 0x28, 0x28, 0x64, 0x67, 0x20, 0x3c, 0x20, 0x63, 0x45, + 0x54, 0x43, 0x31, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x69, 0x6e, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x64, 0x67, 0x20, 0x3e, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x61, 0x78, 0x29, 0x29, 0x20, 0x7c, 0x7c, 0x0d, 0x0a, 0x09, 0x09, 0x28, 0x28, 0x64, 0x62, 0x20, 0x3c, 0x20, 0x63, 0x45, 0x54, + 0x43, 0x31, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x69, 0x6e, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x64, 0x62, 0x20, 0x3e, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x43, + 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x61, 0x78, 0x29, 0x29, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, + 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, + 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x33, 0x28, 0x64, 0x72, + 0x2c, 0x20, 0x64, 0x67, 0x2c, 0x20, 0x64, 0x62, 0x29, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, + 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, + 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x2a, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, + 0x20, 0x77, 0x6f, 0x72, 0x64, 0x33, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x79, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x79, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, + 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x78, 0x2b, 0x2b, + 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x69, 0x74, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x2a, 0x20, 0x34, 0x20, 0x2b, 0x20, 0x79, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x5f, 0x74, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x5b, 0x78, 0x20, 0x2b, 0x20, 0x79, 0x20, 0x2a, 0x20, 0x34, 0x5d, 0x3b, 0x0d, 0x0a, + 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6c, 0x73, 0x62, 0x20, 0x3d, 0x20, 0x73, 0x20, 0x26, 0x20, + 0x31, 0x2c, 0x20, 0x6d, 0x73, 0x62, 0x20, 0x3d, 0x20, 0x73, 0x20, 0x3e, 0x3e, 0x20, 0x31, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x77, 0x6f, 0x72, 0x64, 0x33, 0x20, 0x7c, + 0x3d, 0x20, 0x28, 0x6c, 0x73, 0x62, 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x77, 0x6f, 0x72, 0x64, 0x32, 0x20, + 0x7c, 0x3d, 0x20, 0x28, 0x6d, 0x73, 0x62, 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, + 0x0a, 0x0d, 0x0a, 0x09, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x37, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, + 0x74, 0x29, 0x28, 0x77, 0x6f, 0x72, 0x64, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x36, 0x5d, 0x20, + 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x29, 0x28, 0x77, 0x6f, 0x72, 0x64, 0x33, 0x20, 0x3e, 0x3e, 0x20, 0x38, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x29, 0x28, 0x77, 0x6f, 0x72, 0x64, 0x32, 0x29, + 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, + 0x74, 0x29, 0x28, 0x77, 0x6f, 0x72, 0x64, 0x32, 0x20, 0x3e, 0x3e, 0x20, 0x38, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x2d, 0x2d, 0x2d, 0x2d, 0x20, 0x45, 0x43, + 0x31, 0x53, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x67, 0x5f, 0x65, 0x76, + 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5b, 0x38, 0x5d, 0x5b, 0x32, 0x35, 0x36, 0x5d, 0x20, 0x3d, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x2f, 0x2f, + 0x20, 0x39, 0x39, 0x25, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, + 0x20, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, + 0x2c, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, + 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x7d, 0x2c, 0x0d, 0x0a, 0x09, 0x7b, 0x20, 0x31, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, + 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, + 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x7d, 0x2c, 0x0d, + 0x0a, 0x09, 0x7b, 0x20, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, + 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, 0x31, 0x2c, + 0x31, 0x2c, 0x31, 0x2c, 0x7d, 0x0d, 0x0a, 0x7d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x65, 0x74, 0x63, 0x31, + 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, + 0x5f, 0x74, 0x61, 0x67, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x6d, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3b, + 0x0d, 0x0a, 0x7d, 0x20, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, + 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x29, 0x20, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x72, 0x2c, 0x20, 0x62, 0x67, 0x2c, 0x20, 0x62, 0x62, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x62, + 0x72, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x75, + 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x62, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x75, + 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x2e, 0x7a, 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, + 0x62, 0x61, 0x29, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x29, 0x62, 0x72, 0x2c, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x29, 0x62, 0x67, 0x2c, 0x20, 0x28, 0x75, + 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x29, 0x62, 0x62, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x67, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x09, 0x09, 0x09, 0x09, 0x09, 0x6d, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x20, 0x6d, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x75, + 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x5b, 0x31, 0x36, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x62, + 0x6f, 0x6f, 0x6c, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x3b, 0x0d, 0x0a, 0x7d, 0x20, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, + 0x64, 0x65, 0x66, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x61, 0x67, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x5f, 0x62, 0x72, 0x2c, 0x20, 0x6d, 0x5f, 0x62, 0x67, 0x2c, 0x20, 0x6d, 0x5f, 0x62, 0x62, 0x3b, 0x0d, + 0x0a, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x6d, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x5f, 0x6d, 0x61, + 0x78, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x5f, 0x73, 0x70, 0x72, 0x65, 0x61, 0x64, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, + 0x5f, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x3b, 0x0d, 0x0a, 0x7d, 0x20, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3b, 0x0d, 0x0a, + 0x0d, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x5f, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x20, 0x2a, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x2a, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x0d, 0x0a, 0x09, + 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x2a, 0x70, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x2a, 0x70, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, + 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2c, 0x20, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x20, 0x70, 0x54, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x2c, 0x20, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x20, 0x70, 0x42, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, + 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x5b, 0x31, 0x36, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x70, 0x54, + 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x3e, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x0d, + 0x0a, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x6d, 0x5f, 0x75, 0x6e, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x70, 0x54, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x2d, 0x3e, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x4d, 0x41, 0x58, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x0d, 0x0a, 0x09, + 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3c, 0x20, 0x63, 0x45, 0x54, 0x43, 0x31, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3b, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x2f, 0x2f, 0x20, + 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x73, 0x20, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x21, 0x67, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5b, + 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5d, 0x5b, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x5f, + 0x73, 0x70, 0x72, 0x65, 0x61, 0x64, 0x5d, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x2a, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5b, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x34, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x73, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x73, 0x2b, 0x2b, 0x29, 0x0d, + 0x0a, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x64, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x73, + 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x73, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, + 0x72, 0x67, 0x62, 0x61, 0x29, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x79, 0x64, + 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x64, 0x29, 0x2c, 0x20, + 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x32, 0x35, 0x35, 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x2b, 0x20, 0x79, 0x64, 0x29, 0x2c, 0x20, 0x32, 0x35, 0x35, + 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x63, 0x20, + 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x63, 0x20, 0x3c, 0x20, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x3b, 0x20, 0x63, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x7b, 0x0d, 0x0a, + 0x09, 0x09, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x70, 0x50, 0x69, 0x78, 0x65, 0x6c, + 0x73, 0x5b, 0x63, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x33, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2d, 0x3e, + 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, + 0x20, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x70, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2d, 0x3e, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, + 0x28, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x7b, + 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3b, 0x0d, + 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x32, 0x3b, 0x0d, 0x0a, 0x09, + 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2d, 0x3e, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x72, + 0x63, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, + 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x69, 0x61, + 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2d, 0x3e, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x33, + 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3c, + 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x31, 0x36, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x5b, 0x63, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x29, 0x28, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2b, 0x3d, 0x20, + 0x70, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x3f, 0x20, 0x28, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2a, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, + 0x5f, 0x74, 0x29, 0x70, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5b, 0x63, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, + 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3e, 0x3d, 0x20, 0x70, 0x54, 0x72, 0x69, 0x61, 0x6c, + 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x3e, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0d, + 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3c, 0x20, 0x70, 0x54, 0x72, 0x69, + 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x3e, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x70, + 0x54, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x3e, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x70, 0x54, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x3e, 0x6d, 0x5f, 0x63, 0x6f, + 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x6d, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x31, 0x36, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, + 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, + 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x70, 0x54, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x3e, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x5b, 0x69, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x70, 0x54, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x3e, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, + 0x0a, 0x09, 0x70, 0x54, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x3e, 0x6d, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x6d, 0x5f, 0x75, 0x6e, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x6d, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x70, 0x42, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x69, + 0x66, 0x20, 0x28, 0x70, 0x54, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x3e, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3c, 0x20, 0x70, 0x42, + 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x3e, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, + 0x2a, 0x70, 0x42, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x2a, 0x70, 0x54, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x7d, + 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, + 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x2a, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x2a, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x69, 0x78, + 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x2a, 0x70, 0x50, + 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, + 0x2a, 0x70, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x20, + 0x3d, 0x20, 0x33, 0x31, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x20, 0x3d, 0x20, 0x32, 0x35, 0x35, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, + 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x3b, + 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x73, 0x75, 0x6d, 0x5f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x73, 0x75, 0x6d, 0x5f, 0x67, 0x20, 0x3d, 0x20, 0x30, + 0x2c, 0x20, 0x73, 0x75, 0x6d, 0x5f, 0x62, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, + 0x5f, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, + 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x70, 0x50, 0x69, 0x78, 0x65, + 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x6d, 0x69, 0x6e, 0x5f, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x61, + 0x78, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x70, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x0d, + 0x0a, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x57, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x73, 0x75, 0x6d, 0x5f, 0x72, 0x20, 0x2b, 0x3d, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2a, 0x20, + 0x63, 0x2e, 0x78, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x73, 0x75, 0x6d, 0x5f, 0x67, 0x20, 0x2b, 0x3d, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2a, 0x20, 0x63, 0x2e, 0x79, 0x3b, 0x0d, + 0x0a, 0x09, 0x09, 0x09, 0x73, 0x75, 0x6d, 0x5f, 0x62, 0x20, 0x2b, 0x3d, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2a, 0x20, 0x63, 0x2e, 0x7a, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x0d, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, + 0x0a, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x73, 0x75, 0x6d, 0x5f, 0x72, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x2e, 0x78, 0x3b, 0x0d, 0x0a, + 0x09, 0x09, 0x09, 0x73, 0x75, 0x6d, 0x5f, 0x67, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x2e, 0x79, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x73, 0x75, 0x6d, 0x5f, 0x62, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x2e, + 0x7a, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2b, 0x2b, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, + 0x7d, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x61, 0x76, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x61, 0x76, + 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x73, 0x75, 0x6d, 0x5f, 0x72, 0x20, 0x2f, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x0d, 0x0a, 0x09, 0x61, 0x76, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, + 0x73, 0x75, 0x6d, 0x5f, 0x67, 0x20, 0x2f, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x0d, 0x0a, 0x09, 0x61, 0x76, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x73, 0x75, 0x6d, 0x5f, 0x62, 0x20, 0x2f, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x76, 0x67, + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x5f, 0x73, 0x70, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x2d, + 0x20, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x6d, 0x61, + 0x78, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x29, 0x3b, 0x0d, 0x0a, + 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x2c, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x44, 0x58, 0x54, + 0x31, 0x2f, 0x42, 0x43, 0x31, 0x2e, 0x0d, 0x0a, 0x09, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x69, + 0x6e, 0x74, 0x29, 0x28, 0x61, 0x76, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x20, 0x2f, 0x20, 0x32, 0x35, 0x35, 0x2e, 0x30, + 0x66, 0x29, 0x20, 0x2b, 0x20, 0x2e, 0x35, 0x66, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, + 0x6d, 0x5f, 0x62, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x28, 0x61, 0x76, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x2a, + 0x20, 0x28, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x20, 0x2f, 0x20, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x66, 0x29, 0x20, 0x2b, 0x20, 0x2e, 0x35, 0x66, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x4c, 0x49, 0x4d, + 0x49, 0x54, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x62, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x69, 0x6e, 0x74, + 0x29, 0x28, 0x61, 0x76, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x2a, 0x20, 0x28, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x20, 0x2f, 0x20, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x66, 0x29, + 0x20, 0x2b, 0x20, 0x2e, 0x35, 0x66, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, + 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, + 0x0d, 0x0a, 0x09, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x4d, 0x41, 0x58, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x74, 0x63, 0x31, + 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x74, + 0x28, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x72, 0x79, 0x2c, + 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x2a, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x2a, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, + 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, + 0x67, 0x62, 0x61, 0x20, 0x2a, 0x70, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x2a, 0x70, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, + 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x20, 0x3d, 0x20, 0x33, 0x31, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, + 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x20, 0x63, 0x75, 0x72, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x75, 0x72, 0x5f, 0x63, 0x6f, + 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x6d, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, + 0x67, 0x62, 0x61, 0x29, 0x28, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x72, 0x2c, 0x20, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x67, 0x2c, + 0x20, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x62, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2c, + 0x20, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x70, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x70, + 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x63, 0x75, 0x72, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2c, 0x20, 0x26, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x26, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, + 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, + 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x70, 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x72, 0x79, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x67, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, + 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x62, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x20, 0x2a, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5b, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, + 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x6d, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x6d, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x6d, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, + 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x2a, 0x70, 0x4e, 0x75, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x62, 0x5b, 0x69, 0x5d, + 0x2e, 0x6d, 0x5f, 0x76, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x71, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, + 0x71, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x71, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x79, + 0x64, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x71, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, + 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x72, 0x20, 0x2b, 0x3d, 0x20, 0x70, 0x4e, 0x75, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x5b, 0x71, 0x5d, + 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x79, 0x64, 0x5f, 0x74, 0x65, 0x6d, 0x70, + 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x20, 0x2d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x67, 0x20, 0x2b, 0x3d, 0x20, 0x70, 0x4e, 0x75, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x5b, 0x71, 0x5d, 0x20, + 0x2a, 0x20, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x64, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x2c, + 0x20, 0x30, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x20, 0x2d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x62, 0x20, 0x2b, 0x3d, 0x20, 0x70, 0x4e, 0x75, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x5b, 0x71, 0x5d, 0x20, 0x2a, + 0x20, 0x28, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x2b, 0x20, 0x79, 0x64, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x2c, 0x20, + 0x30, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x20, 0x2d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, + 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x28, 0x21, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x72, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x21, 0x64, 0x65, 0x6c, 0x74, 0x61, + 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x67, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x21, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x62, 0x29, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x76, 0x67, 0x5f, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x5f, 0x72, 0x5f, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x28, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x72, 0x29, 0x20, 0x2f, + 0x20, 0x38, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x76, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x67, 0x5f, 0x66, + 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x28, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x67, 0x29, 0x20, 0x2f, 0x20, 0x38, 0x3b, 0x0d, 0x0a, 0x09, 0x09, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x76, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x62, 0x5f, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x29, 0x28, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x62, 0x29, 0x20, 0x2f, 0x20, 0x38, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x28, 0x28, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, + 0x6d, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x61, 0x76, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x72, 0x5f, 0x66, 0x29, 0x20, 0x2a, + 0x20, 0x28, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x20, 0x2f, 0x20, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x66, 0x29, 0x20, 0x2b, 0x20, 0x2e, 0x35, 0x66, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x4c, 0x49, 0x4d, + 0x49, 0x54, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x67, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x69, + 0x6e, 0x74, 0x29, 0x28, 0x28, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x61, 0x76, 0x67, + 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x67, 0x5f, 0x66, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x20, 0x2f, 0x20, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x66, 0x29, 0x20, 0x2b, + 0x20, 0x2e, 0x35, 0x66, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x62, + 0x62, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x28, 0x28, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x61, 0x76, 0x67, 0x5f, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x7a, 0x20, 0x2d, 0x20, 0x61, 0x76, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x62, 0x5f, 0x66, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x4c, 0x49, 0x4d, 0x49, + 0x54, 0x20, 0x2f, 0x20, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x66, 0x29, 0x20, 0x2b, 0x20, 0x2e, 0x35, 0x66, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x29, 0x3b, 0x0d, 0x0a, + 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x75, 0x72, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x6d, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x29, 0x28, 0x62, 0x72, 0x31, 0x2c, 0x20, 0x62, 0x67, 0x31, 0x2c, 0x20, 0x62, 0x62, 0x31, 0x2c, 0x20, + 0x32, 0x35, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, + 0x61, 0x74, 0x65, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, 0x6e, 0x75, + 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x70, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x70, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x63, 0x75, 0x72, + 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2c, 0x20, 0x26, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x26, 0x70, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x70, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, + 0x3d, 0x20, 0x30, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x54, 0x43, 0x31, 0x53, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x20, 0x34, 0x78, 0x34, 0x20, 0x70, + 0x69, 0x78, 0x65, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x0d, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, + 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x28, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x2a, 0x70, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x2c, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x65, + 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, + 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x26, 0x70, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, + 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, + 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x26, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x2c, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x3e, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x4e, 0x55, + 0x4c, 0x4c, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x74, 0x28, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2d, 0x3e, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x65, 0x72, + 0x6d, 0x73, 0x2c, 0x20, 0x26, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x3e, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x62, 0x6c, 0x6b, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x69, 0x70, + 0x5f, 0x62, 0x69, 0x74, 0x28, 0x26, 0x62, 0x6c, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, + 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x28, 0x26, 0x62, 0x6c, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x2e, 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x6d, 0x5f, 0x75, 0x6e, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x74, + 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x28, 0x26, 0x62, 0x6c, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x6d, 0x5f, 0x62, 0x65, + 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x6d, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x28, 0x26, 0x62, 0x6c, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x6c, 0x6b, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, + 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x5f, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x5f, 0x20, 0x28, + 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x29, 0x29, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x67, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, + 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x7d, 0x20, 0x70, 0x69, 0x78, + 0x65, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x44, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x45, 0x54, 0x43, 0x31, 0x53, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x20, 0x67, + 0x69, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x62, 0x69, 0x74, 0x72, 0x61, 0x72, 0x79, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, + 0x20, 0x34, 0x78, 0x34, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x0d, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x28, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, + 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x2a, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, 0x0d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x2a, 0x70, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x2a, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x0d, + 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x2a, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, + 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x5f, 0x74, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, + 0x64, 0x28, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x2a, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x26, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, + 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x3b, 0x0d, 0x0a, + 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2d, 0x3e, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x2a, 0x70, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, + 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2d, 0x3e, + 0x6d, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x2a, 0x70, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x2b, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2d, 0x3e, 0x6d, 0x5f, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, + 0x72, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x26, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x69, + 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x70, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x70, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x31, + 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x74, + 0x28, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2d, 0x3e, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x73, 0x2c, 0x20, 0x26, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2c, + 0x20, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x70, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, + 0x20, 0x70, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x62, 0x6c, 0x6b, 0x3b, 0x0d, + 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x69, 0x70, 0x5f, 0x62, 0x69, 0x74, 0x28, 0x26, 0x62, 0x6c, 0x6b, 0x2c, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x35, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x28, 0x26, 0x62, 0x6c, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x6d, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x29, 0x3b, + 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x65, 0x74, + 0x63, 0x31, 0x73, 0x28, 0x26, 0x62, 0x6c, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x6d, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x6d, 0x5f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x6d, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x6c, 0x6b, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x2d, 0x2d, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x5f, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x5f, 0x20, 0x28, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x29, 0x29, 0x20, + 0x72, 0x65, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, + 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, + 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x6d, 0x5f, + 0x63, 0x75, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x63, + 0x75, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x74, 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x3b, 0x0d, 0x0a, 0x7d, 0x20, 0x72, 0x65, 0x63, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x5f, 0x5f, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x5f, 0x20, 0x28, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x29, 0x29, 0x20, 0x72, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x6d, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, + 0x74, 0x20, 0x6d, 0x5f, 0x65, 0x74, 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x7d, 0x20, 0x72, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x5f, 0x5f, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x5f, 0x20, 0x28, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x29, 0x29, 0x20, 0x72, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x3b, 0x0d, 0x0a, 0x7d, 0x20, + 0x72, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x69, 0x74, 0x2e, 0x0d, 0x0a, 0x6b, + 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2c, 0x0d, 0x0a, 0x09, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x2a, 0x70, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x2a, 0x70, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x2a, 0x70, 0x53, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x0d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x2a, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, + 0x69, 0x63, 0x65, 0x73, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, + 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, + 0x70, 0x53, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x5b, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, + 0x6c, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x26, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x70, 0x72, 0x69, 0x76, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x0d, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x76, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x2a, 0x70, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x6f, 0x66, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x5f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x63, 0x75, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, + 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, + 0x6d, 0x5f, 0x63, 0x75, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x63, 0x75, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x74, 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x65, + 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5d, 0x2e, 0x6d, 0x5f, 0x63, 0x75, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x74, 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, + 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x55, 0x49, 0x4e, + 0x54, 0x36, 0x34, 0x5f, 0x4d, 0x41, 0x58, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6e, 0x75, 0x6d, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, + 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x73, 0x20, 0x2b, 0x20, 0x69, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x5f, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x5f, 0x65, 0x74, 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, + 0x36, 0x5f, 0x74, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x65, 0x74, 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x63, 0x75, + 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x74, 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x34, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x35, 0x28, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x26, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x65, 0x74, + 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x0d, 0x0a, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x63, 0x20, 0x3c, 0x20, 0x31, 0x36, 0x3b, 0x20, 0x63, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x7b, 0x0d, + 0x0a, 0x09, 0x09, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x69, 0x76, 0x5f, + 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x5b, 0x63, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x75, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x74, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x73, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x3c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, + 0x73, 0x72, 0x63, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, + 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, + 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, + 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x09, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3b, + 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x20, 0x28, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3c, 0x20, 0x6f, + 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7c, 0x7c, 0x0d, 0x0a, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x28, 0x6f, 0x72, + 0x69, 0x67, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x3d, 0x20, + 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x29, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, + 0x09, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x5f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x5f, + 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, + 0x0d, 0x0a, 0x09, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, + 0x3d, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x2d, + 0x2d, 0x2d, 0x2d, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x20, 0x5f, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x5f, 0x20, 0x28, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x29, 0x29, 0x20, 0x66, 0x6f, 0x73, + 0x63, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x09, 0x2f, 0x2f, 0x20, 0x34, 0x78, 0x34, 0x20, 0x67, + 0x72, 0x69, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x32, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x0d, 0x0a, 0x7d, 0x20, 0x66, 0x6f, 0x73, 0x63, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x20, 0x5f, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x5f, 0x20, 0x28, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x29, 0x29, 0x20, 0x66, 0x6f, 0x73, 0x63, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, + 0x20, 0x6d, 0x5f, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x3b, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x64, 0x20, 0x35, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x52, 0x47, 0x42, 0x2c, 0x20, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x27, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x0d, 0x0a, 0x09, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3b, 0x09, 0x09, 0x2f, 0x2f, 0x20, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x09, 0x09, 0x2f, 0x2f, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x0d, 0x0a, 0x7d, 0x20, 0x66, 0x6f, 0x73, 0x63, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x5f, + 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x5f, 0x20, 0x28, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x29, 0x29, 0x20, 0x66, 0x6f, 0x73, 0x63, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6d, 0x5f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x3b, 0x0d, + 0x0a, 0x7d, 0x20, 0x66, 0x6f, 0x73, 0x63, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, 0x46, 0x6f, 0x72, 0x20, + 0x65, 0x61, 0x63, 0x68, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x61, 0x6e, 0x74, + 0x69, 0x7a, 0x65, 0x64, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x0d, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x66, 0x69, + 0x6e, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x66, 0x6f, 0x72, + 0x5f, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6f, 0x73, 0x63, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2c, + 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x73, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x20, 0x2a, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x73, 0x63, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x2a, 0x70, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x5f, 0x74, 0x20, 0x2a, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, + 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x2a, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x3b, 0x0d, + 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x73, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x26, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x73, 0x63, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x2a, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x26, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x5b, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x2d, 0x3e, 0x6d, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x2d, 0x3e, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x34, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2d, 0x3e, 0x6d, 0x5f, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x3b, 0x0d, 0x0a, 0x09, + 0x67, 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x35, 0x28, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x26, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x35, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x2e, 0x77, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, + 0x74, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x5b, 0x34, 0x5d, 0x5b, 0x31, 0x36, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x73, 0x65, 0x6c, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x2b, 0x2b, 0x73, 0x65, 0x6c, + 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x31, + 0x36, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x5b, 0x73, 0x65, 0x6c, 0x5d, 0x5b, 0x69, + 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x73, 0x65, + 0x6c, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x66, 0x6f, + 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x73, 0x65, 0x6c, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x2b, 0x2b, + 0x73, 0x65, 0x6c, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, + 0x3c, 0x20, 0x31, 0x36, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x5b, 0x73, 0x65, 0x6c, + 0x5d, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x70, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x73, 0x5b, 0x73, 0x65, 0x6c, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, + 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x4d, 0x41, 0x58, 0x3b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x73, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3c, 0x20, + 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x20, 0x73, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, + 0x0a, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x5b, 0x73, 0x65, + 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x6d, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x09, + 0x0d, 0x0a, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x31, 0x36, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x2c, + 0x20, 0x73, 0x65, 0x6c, 0x73, 0x20, 0x3e, 0x3e, 0x3d, 0x20, 0x32, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x2b, 0x3d, 0x20, 0x74, 0x72, + 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x5b, 0x73, 0x65, 0x6c, 0x73, 0x20, 0x26, 0x20, 0x33, 0x5d, 0x5b, 0x69, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x66, + 0x20, 0x28, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, + 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x21, 0x62, 0x65, + 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x29, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, + 0x09, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, + 0x73, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x5b, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2d, 0x3e, 0x6d, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x2b, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2f, + 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x5f, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x5f, 0x20, 0x28, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x29, 0x29, 0x20, + 0x64, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, + 0x74, 0x20, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x3b, 0x0d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, + 0x74, 0x75, 0x61, 0x6c, 0x3b, 0x0d, 0x0a, 0x7d, 0x20, 0x64, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2f, 0x20, + 0x46, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x20, 0x44, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x45, 0x54, 0x43, 0x31, 0x53, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x27, 0x73, 0x20, 0x70, 0x72, 0x65, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x45, 0x54, 0x43, 0x31, 0x53, 0x20, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x35, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x20, 0x0d, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x64, 0x65, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x28, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x73, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x2c, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x2a, + 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x2c, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x73, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x2a, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x69, 0x78, + 0x65, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, + 0x2e, 0x6d, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x61, + 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x34, 0x5d, 0x3b, 0x0d, 0x0a, 0x09, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x35, 0x28, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x26, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x2e, 0x77, 0x2c, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x69, 0x70, 0x5f, 0x62, 0x69, 0x74, 0x28, 0x26, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, + 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x28, 0x26, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x65, 0x74, 0x63, 0x31, 0x73, 0x28, 0x26, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x35, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x2e, 0x77, 0x29, 0x3b, 0x0d, 0x0a, + 0x0d, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x31, 0x36, 0x3b, 0x20, + 0x69, 0x2b, 0x2b, 0x29, 0x0d, 0x0a, 0x09, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x72, 0x67, 0x62, 0x61, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, + 0x20, 0x65, 0x72, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x5f, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x65, 0x72, 0x72, 0x31, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, + 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x31, + 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x65, 0x72, 0x72, 0x32, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, + 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x70, 0x69, + 0x78, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x65, 0x72, 0x72, 0x33, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, + 0x09, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x6d, 0x69, 0x6e, 0x28, 0x6d, 0x69, 0x6e, 0x28, 0x65, 0x72, + 0x72, 0x30, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x31, 0x29, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x32, 0x29, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x75, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x65, + 0x72, 0x72, 0x32, 0x29, 0x20, 0x3f, 0x20, 0x32, 0x20, 0x3a, 0x20, 0x33, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x65, 0x73, + 0x74, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x31, 0x29, 0x20, 0x3f, 0x20, 0x31, 0x20, 0x3a, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x3b, 0x0d, 0x0a, + 0x09, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x30, 0x29, 0x20, + 0x3f, 0x20, 0x30, 0x20, 0x3a, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x74, 0x63, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, + 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x26, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x69, 0x20, 0x26, 0x20, 0x33, + 0x2c, 0x20, 0x69, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x2c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x09, 0x70, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a +}; +unsigned int ocl_kernels_cl_len = 45935; diff --git a/ktx/external/basisu/encoder/basisu_opencl.cpp b/ktx/external/basisu/encoder/basisu_opencl.cpp new file mode 100644 index 0000000..5757633 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_opencl.cpp @@ -0,0 +1,1334 @@ +// basisu_opencl.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_opencl.h" + +// If 1, the kernel source code will come from encoders/ocl_kernels.h. Otherwise, it will be read from the "ocl_kernels.cl" file in the current directory (for development). +#define BASISU_USE_OCL_KERNELS_HEADER (1) +#define BASISU_OCL_KERNELS_FILENAME "ocl_kernels.cl" + +#if BASISU_SUPPORT_OPENCL + +#include "basisu_enc.h" + +// We only use OpenCL v1.2 or less. +#define CL_TARGET_OPENCL_VERSION 120 + +#ifdef __APPLE__ +#include +#else +#include +#endif + +#define BASISU_OPENCL_ASSERT_ON_ANY_ERRORS (1) + +namespace basisu +{ +#if BASISU_USE_OCL_KERNELS_HEADER +#include "basisu_ocl_kernels.h" +#endif + + static void ocl_error_printf(const char* pFmt, ...) + { + va_list args; + va_start(args, pFmt); + error_vprintf(pFmt, args); + va_end(args); + +#if BASISU_OPENCL_ASSERT_ON_ANY_ERRORS + assert(0); +#endif + } + + class ocl + { + public: + ocl() + { + memset(&m_dev_fp_config, 0, sizeof(m_dev_fp_config)); + + m_ocl_mutex.lock(); + m_ocl_mutex.unlock(); + } + + ~ocl() + { + } + + bool is_initialized() const { return m_device_id != nullptr; } + + cl_device_id get_device_id() const { return m_device_id; } + cl_context get_context() const { return m_context; } + cl_command_queue get_command_queue() { return m_command_queue; } + cl_program get_program() const { return m_program; } + + bool init(bool force_serialization) + { + deinit(); + + interval_timer tm; + tm.start(); + + cl_uint num_platforms = 0; + cl_int ret = clGetPlatformIDs(0, NULL, &num_platforms); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::init: clGetPlatformIDs() failed with %i\n", ret); + return false; + } + + if ((!num_platforms) || (num_platforms > INT_MAX)) + { + ocl_error_printf("ocl::init: clGetPlatformIDs() returned an invalid number of num_platforms\n"); + return false; + } + + std::vector platforms(num_platforms); + + ret = clGetPlatformIDs(num_platforms, platforms.data(), NULL); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::init: clGetPlatformIDs() failed\n"); + return false; + } + + cl_uint num_devices = 0; + ret = clGetDeviceIDs(platforms[0], CL_DEVICE_TYPE_GPU, 1, &m_device_id, &num_devices); + + if (ret == CL_DEVICE_NOT_FOUND) + { +#if 0 // CI service VMs usually don't have GPUs so don't treat as an error. + ocl_error_printf("ocl::init: Couldn't get any GPU device ID's, trying CL_DEVICE_TYPE_CPU\n"); +#endif + ret = clGetDeviceIDs(platforms[0], CL_DEVICE_TYPE_CPU, 1, &m_device_id, &num_devices); + } + + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::init: Unable to get any device ID's\n"); + + m_device_id = nullptr; + return false; + } + + ret = clGetDeviceInfo(m_device_id, + CL_DEVICE_SINGLE_FP_CONFIG, + sizeof(m_dev_fp_config), + &m_dev_fp_config, + nullptr); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::init: clGetDeviceInfo() failed\n"); + return false; + } + + char plat_vers[256]; + size_t rv = 0; + ret = clGetPlatformInfo(platforms[0], CL_PLATFORM_VERSION, sizeof(plat_vers), plat_vers, &rv); +#if !defined(LIBKTX) + if (ret == CL_SUCCESS) + printf("OpenCL platform version: \"%s\"\n", plat_vers); +#endif + // Serialize CL calls with the AMD driver to avoid lockups when multiple command queues per thread are used. This sucks, but what can we do? + m_use_mutex = (strstr(plat_vers, "AMD") != nullptr) || force_serialization; +#if !defined(LIBKTX) + printf("Serializing OpenCL calls across threads: %u\n", (uint32_t)m_use_mutex); +#endif + m_context = clCreateContext(nullptr, 1, &m_device_id, nullptr, nullptr, &ret); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::init: clCreateContext() failed\n"); + + m_device_id = nullptr; + m_context = nullptr; + return false; + } + + m_command_queue = clCreateCommandQueue(m_context, m_device_id, 0, &ret); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::init: clCreateCommandQueue() failed\n"); + + deinit(); + return false; + } +#if !defined(LIBKTX) + printf("OpenCL init time: %3.3f secs\n", tm.get_elapsed_secs()); +#endif + return true; + } + + bool deinit() + { + if (m_program) + { + clReleaseProgram(m_program); + m_program = nullptr; + } + + if (m_command_queue) + { + clReleaseCommandQueue(m_command_queue); + m_command_queue = nullptr; + } + + if (m_context) + { + clReleaseContext(m_context); + m_context = nullptr; + } + + m_device_id = nullptr; + + return true; + } + + cl_command_queue create_command_queue() + { + cl_serializer serializer(this); + + cl_int ret = 0; + cl_command_queue p = clCreateCommandQueue(m_context, m_device_id, 0, &ret); + if (ret != CL_SUCCESS) + return nullptr; + + return p; + } + + void destroy_command_queue(cl_command_queue p) + { + if (p) + { + cl_serializer serializer(this); + + clReleaseCommandQueue(p); + } + } + + bool init_program(const char* pSrc, size_t src_size) + { + cl_int ret; + + if (m_program != nullptr) + { + clReleaseProgram(m_program); + m_program = nullptr; + } + + m_program = clCreateProgramWithSource(m_context, 1, (const char**)&pSrc, (const size_t*)&src_size, &ret); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::init_program: clCreateProgramWithSource() failed!\n"); + return false; + } + + std::string options; + if (m_dev_fp_config & CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT) + { + options += "-cl-fp32-correctly-rounded-divide-sqrt"; + } + + options += " -cl-std=CL1.2"; + //options += " -cl-opt-disable"; + //options += " -cl-mad-enable"; + //options += " -cl-fast-relaxed-math"; + + ret = clBuildProgram(m_program, 1, &m_device_id, + options.size() ? options.c_str() : nullptr, // options + nullptr, // notify + nullptr); // user_data + + if (ret != CL_SUCCESS) + { + const cl_int build_program_result = ret; + + size_t ret_val_size; + ret = clGetProgramBuildInfo(m_program, m_device_id, CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::init_program: clGetProgramBuildInfo() failed!\n"); + return false; + } + + std::vector build_log(ret_val_size + 1); + + ret = clGetProgramBuildInfo(m_program, m_device_id, CL_PROGRAM_BUILD_LOG, ret_val_size, build_log.data(), NULL); + + ocl_error_printf("\nclBuildProgram() failed with error %i:\n%s", build_program_result, build_log.data()); + + return false; + } + + return true; + } + + cl_kernel create_kernel(const char* pName) + { + if (!m_program) + return nullptr; + + cl_serializer serializer(this); + + cl_int ret; + cl_kernel kernel = clCreateKernel(m_program, pName, &ret); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::create_kernel: clCreateKernel() failed!\n"); + return nullptr; + } + + return kernel; + } + + bool destroy_kernel(cl_kernel k) + { + if (k) + { + cl_serializer serializer(this); + + cl_int ret = clReleaseKernel(k); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::destroy_kernel: clReleaseKernel() failed!\n"); + return false; + } + } + return true; + } + + cl_mem alloc_read_buffer(size_t size) + { + cl_serializer serializer(this); + + cl_int ret; + cl_mem obj = clCreateBuffer(m_context, CL_MEM_READ_ONLY, size, NULL, &ret); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::alloc_read_buffer: clCreateBuffer() failed!\n"); + return nullptr; + } + + return obj; + } + + cl_mem alloc_and_init_read_buffer(cl_command_queue command_queue, const void *pInit, size_t size) + { + cl_serializer serializer(this); + + cl_int ret; + cl_mem obj = clCreateBuffer(m_context, CL_MEM_READ_ONLY, size, NULL, &ret); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::alloc_and_init_read_buffer: clCreateBuffer() failed!\n"); + return nullptr; + } + +#if 0 + if (!write_to_buffer(command_queue, obj, pInit, size)) + { + destroy_buffer(obj); + return nullptr; + } +#else + ret = clEnqueueWriteBuffer(command_queue, obj, CL_TRUE, 0, size, pInit, 0, NULL, NULL); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::alloc_and_init_read_buffer: clEnqueueWriteBuffer() failed!\n"); + return nullptr; + } +#endif + + return obj; + } + + cl_mem alloc_write_buffer(size_t size) + { + cl_serializer serializer(this); + + cl_int ret; + cl_mem obj = clCreateBuffer(m_context, CL_MEM_WRITE_ONLY, size, NULL, &ret); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::alloc_write_buffer: clCreateBuffer() failed!\n"); + return nullptr; + } + + return obj; + } + + bool destroy_buffer(cl_mem buf) + { + if (buf) + { + cl_serializer serializer(this); + + cl_int ret = clReleaseMemObject(buf); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::destroy_buffer: clReleaseMemObject() failed!\n"); + return false; + } + } + + return true; + } + + bool write_to_buffer(cl_command_queue command_queue, cl_mem clmem, const void* d, const size_t m) + { + cl_serializer serializer(this); + + cl_int ret = clEnqueueWriteBuffer(command_queue, clmem, CL_TRUE, 0, m, d, 0, NULL, NULL); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::write_to_buffer: clEnqueueWriteBuffer() failed!\n"); + return false; + } + + return true; + } + + bool read_from_buffer(cl_command_queue command_queue, const cl_mem clmem, void* d, size_t m) + { + cl_serializer serializer(this); + + cl_int ret = clEnqueueReadBuffer(command_queue, clmem, CL_TRUE, 0, m, d, 0, NULL, NULL); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::read_from_buffer: clEnqueueReadBuffer() failed!\n"); + return false; + } + + return true; + } + + cl_mem create_read_image_u8(uint32_t width, uint32_t height, const void* pPixels, uint32_t bytes_per_pixel, bool normalized) + { + cl_image_format fmt = get_image_format(bytes_per_pixel, normalized); + + cl_image_desc desc; + memset(&desc, 0, sizeof(desc)); + desc.image_type = CL_MEM_OBJECT_IMAGE2D; + desc.image_width = width; + desc.image_height = height; + desc.image_row_pitch = width * bytes_per_pixel; + + cl_serializer serializer(this); + + cl_int ret; + cl_mem img = clCreateImage(m_context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, &fmt, &desc, (void*)pPixels, &ret); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::create_read_image_u8: clCreateImage() failed!\n"); + return nullptr; + } + + return img; + } + + cl_mem create_write_image_u8(uint32_t width, uint32_t height, uint32_t bytes_per_pixel, bool normalized) + { + cl_image_format fmt = get_image_format(bytes_per_pixel, normalized); + + cl_image_desc desc; + memset(&desc, 0, sizeof(desc)); + desc.image_type = CL_MEM_OBJECT_IMAGE2D; + desc.image_width = width; + desc.image_height = height; + + cl_serializer serializer(this); + + cl_int ret; + cl_mem img = clCreateImage(m_context, CL_MEM_WRITE_ONLY, &fmt, &desc, nullptr, &ret); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::create_write_image_u8: clCreateImage() failed!\n"); + return nullptr; + } + + return img; + } + + bool read_from_image(cl_command_queue command_queue, cl_mem img, void* pPixels, uint32_t ofs_x, uint32_t ofs_y, uint32_t width, uint32_t height) + { + cl_serializer serializer(this); + + size_t origin[3] = { ofs_x, ofs_y, 0 }, region[3] = { width, height, 1 }; + + cl_int err = clEnqueueReadImage(command_queue, img, CL_TRUE, origin, region, 0, 0, pPixels, 0, NULL, NULL); + if (err != CL_SUCCESS) + { + ocl_error_printf("ocl::read_from_image: clEnqueueReadImage() failed!\n"); + return false; + } + + return true; + } + + bool run_1D(cl_command_queue command_queue, const cl_kernel kernel, size_t num_items) + { + cl_serializer serializer(this); + + cl_int ret = clEnqueueNDRangeKernel(command_queue, kernel, + 1, // work_dim + nullptr, // global_work_offset + &num_items, // global_work_size + nullptr, // local_work_size + 0, // num_events_in_wait_list + nullptr, // event_wait_list + nullptr // event + ); + + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::run_1D: clEnqueueNDRangeKernel() failed!\n"); + return false; + } + + return true; + } + + bool run_2D(cl_command_queue command_queue, const cl_kernel kernel, size_t width, size_t height) + { + cl_serializer serializer(this); + + size_t num_global_items[2] = { width, height }; + //size_t num_local_items[2] = { 1, 1 }; + + cl_int ret = clEnqueueNDRangeKernel(command_queue, kernel, + 2, // work_dim + nullptr, // global_work_offset + num_global_items, // global_work_size + nullptr, // local_work_size + 0, // num_events_in_wait_list + nullptr, // event_wait_list + nullptr // event + ); + + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::run_2D: clEnqueueNDRangeKernel() failed!\n"); + return false; + } + + return true; + } + + bool run_2D(cl_command_queue command_queue, const cl_kernel kernel, size_t ofs_x, size_t ofs_y, size_t width, size_t height) + { + cl_serializer serializer(this); + + size_t global_ofs[2] = { ofs_x, ofs_y }; + size_t num_global_items[2] = { width, height }; + //size_t num_local_items[2] = { 1, 1 }; + + cl_int ret = clEnqueueNDRangeKernel(command_queue, kernel, + 2, // work_dim + global_ofs, // global_work_offset + num_global_items, // global_work_size + nullptr, // local_work_size + 0, // num_events_in_wait_list + nullptr, // event_wait_list + nullptr // event + ); + + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::run_2D: clEnqueueNDRangeKernel() failed!\n"); + return false; + } + + return true; + } + + void flush(cl_command_queue command_queue) + { + cl_serializer serializer(this); + + clFlush(command_queue); + clFinish(command_queue); + } + + template + bool set_kernel_arg(cl_kernel kernel, uint32_t index, const T& obj) + { + cl_serializer serializer(this); + + cl_int ret = clSetKernelArg(kernel, index, sizeof(T), (void*)&obj); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::set_kernel_arg: clSetKernelArg() failed!\n"); + return false; + } + return true; + } + + template + bool set_kernel_args(cl_kernel kernel, const T& obj1) + { + cl_serializer serializer(this); + + cl_int ret = clSetKernelArg(kernel, 0, sizeof(T), (void*)&obj1); + if (ret != CL_SUCCESS) + { + ocl_error_printf("ocl::set_kernel_arg: clSetKernelArg() failed!\n"); + return false; + } + return true; + } + +#define BASISU_CHECK_ERR if (ret != CL_SUCCESS) { ocl_error_printf("ocl::set_kernel_args: clSetKernelArg() failed!\n"); return false; } + + template + bool set_kernel_args(cl_kernel kernel, const T& obj1, const U& obj2) + { + cl_serializer serializer(this); + cl_int ret = clSetKernelArg(kernel, 0, sizeof(T), (void*)&obj1); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 1, sizeof(U), (void*)&obj2); BASISU_CHECK_ERR + return true; + } + + template + bool set_kernel_args(cl_kernel kernel, const T& obj1, const U& obj2, const V& obj3) + { + cl_serializer serializer(this); + cl_int ret = clSetKernelArg(kernel, 0, sizeof(T), (void*)&obj1); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 1, sizeof(U), (void*)&obj2); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 2, sizeof(V), (void*)&obj3); BASISU_CHECK_ERR + return true; + } + + template + bool set_kernel_args(cl_kernel kernel, const T& obj1, const U& obj2, const V& obj3, const W& obj4) + { + cl_serializer serializer(this); + cl_int ret = clSetKernelArg(kernel, 0, sizeof(T), (void*)&obj1); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 1, sizeof(U), (void*)&obj2); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 2, sizeof(V), (void*)&obj3); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 3, sizeof(W), (void*)&obj4); BASISU_CHECK_ERR + return true; + } + + template + bool set_kernel_args(cl_kernel kernel, const T& obj1, const U& obj2, const V& obj3, const W& obj4, const X& obj5) + { + cl_serializer serializer(this); + cl_int ret = clSetKernelArg(kernel, 0, sizeof(T), (void*)&obj1); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 1, sizeof(U), (void*)&obj2); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 2, sizeof(V), (void*)&obj3); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 3, sizeof(W), (void*)&obj4); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 4, sizeof(X), (void*)&obj5); BASISU_CHECK_ERR + return true; + } + + template + bool set_kernel_args(cl_kernel kernel, const T& obj1, const U& obj2, const V& obj3, const W& obj4, const X& obj5, const Y& obj6) + { + cl_serializer serializer(this); + cl_int ret = clSetKernelArg(kernel, 0, sizeof(T), (void*)&obj1); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 1, sizeof(U), (void*)&obj2); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 2, sizeof(V), (void*)&obj3); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 3, sizeof(W), (void*)&obj4); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 4, sizeof(X), (void*)&obj5); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 5, sizeof(Y), (void*)&obj6); BASISU_CHECK_ERR + return true; + } + + template + bool set_kernel_args(cl_kernel kernel, const T& obj1, const U& obj2, const V& obj3, const W& obj4, const X& obj5, const Y& obj6, const Z& obj7) + { + cl_serializer serializer(this); + cl_int ret = clSetKernelArg(kernel, 0, sizeof(T), (void*)&obj1); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 1, sizeof(U), (void*)&obj2); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 2, sizeof(V), (void*)&obj3); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 3, sizeof(W), (void*)&obj4); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 4, sizeof(X), (void*)&obj5); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 5, sizeof(Y), (void*)&obj6); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 6, sizeof(Z), (void*)&obj7); BASISU_CHECK_ERR + return true; + } + + template + bool set_kernel_args(cl_kernel kernel, const T& obj1, const U& obj2, const V& obj3, const W& obj4, const X& obj5, const Y& obj6, const Z& obj7, const A& obj8) + { + cl_serializer serializer(this); + cl_int ret = clSetKernelArg(kernel, 0, sizeof(T), (void*)&obj1); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 1, sizeof(U), (void*)&obj2); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 2, sizeof(V), (void*)&obj3); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 3, sizeof(W), (void*)&obj4); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 4, sizeof(X), (void*)&obj5); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 5, sizeof(Y), (void*)&obj6); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 6, sizeof(Z), (void*)&obj7); BASISU_CHECK_ERR + ret = clSetKernelArg(kernel, 7, sizeof(A), (void*)&obj8); BASISU_CHECK_ERR + return true; + } +#undef BASISU_CHECK_ERR + + private: + cl_device_id m_device_id = nullptr; + cl_context m_context = nullptr; + cl_command_queue m_command_queue = nullptr; + cl_program m_program = nullptr; + cl_device_fp_config m_dev_fp_config; + + bool m_use_mutex = false; + std::mutex m_ocl_mutex; + + // This helper object is used to optionally serialize all calls to the CL driver after initialization. + // Currently this is only used to work around race conditions in the Windows AMD driver. + struct cl_serializer + { + inline cl_serializer(const cl_serializer&); + cl_serializer& operator= (const cl_serializer&); + + inline cl_serializer(ocl *p) : m_p(p) + { + if (m_p->m_use_mutex) + m_p->m_ocl_mutex.lock(); + } + + inline ~cl_serializer() + { + if (m_p->m_use_mutex) + m_p->m_ocl_mutex.unlock(); + } + + private: + ocl* m_p; + }; + + cl_image_format get_image_format(uint32_t bytes_per_pixel, bool normalized) + { + cl_image_format fmt; + switch (bytes_per_pixel) + { + case 1: fmt.image_channel_order = CL_LUMINANCE; break; + case 2: fmt.image_channel_order = CL_RG; break; + case 3: fmt.image_channel_order = CL_RGB; break; + case 4: fmt.image_channel_order = CL_RGBA; break; + default: assert(0); fmt.image_channel_order = CL_LUMINANCE; break; + } + + fmt.image_channel_data_type = normalized ? CL_UNORM_INT8 : CL_UNSIGNED_INT8; + return fmt; + } + }; + + // Library blobal state + ocl g_ocl; + + bool opencl_init(bool force_serialization) + { + if (g_ocl.is_initialized()) + { + assert(0); + return false; + } + + if (!g_ocl.init(force_serialization)) + { + ocl_error_printf("opencl_init: Failed initializing OpenCL\n"); + return false; + } + + const char* pKernel_src = nullptr; + size_t kernel_src_size = 0; + uint8_vec kernel_src; + +#if BASISU_USE_OCL_KERNELS_HEADER + pKernel_src = reinterpret_cast(ocl_kernels_cl); + kernel_src_size = ocl_kernels_cl_len; +#else + if (!read_file_to_vec(BASISU_OCL_KERNELS_FILENAME, kernel_src)) + { + ocl_error_printf("opencl_init: Cannot read OpenCL kernel source file \"%s\"\n", BASISU_OCL_KERNELS_FILENAME); + g_ocl.deinit(); + return false; + } + + pKernel_src = (char*)kernel_src.data(); + kernel_src_size = kernel_src.size(); +#endif + + if (!kernel_src_size) + { + ocl_error_printf("opencl_init: Invalid OpenCL kernel source file \"%s\"\n", BASISU_OCL_KERNELS_FILENAME); + g_ocl.deinit(); + return false; + } + + if (!g_ocl.init_program(pKernel_src, kernel_src_size)) + { + ocl_error_printf("opencl_init: Failed compiling OpenCL program\n"); + g_ocl.deinit(); + return false; + } +#if !defined(LIBKTX) + printf("OpenCL support initialized successfully\n"); +#endif + return true; + } + + void opencl_deinit() + { + g_ocl.deinit(); + } + + bool opencl_is_available() + { + return g_ocl.is_initialized(); + } + + struct opencl_context + { + uint32_t m_ocl_total_pixel_blocks; + cl_mem m_ocl_pixel_blocks; + + cl_command_queue m_command_queue; + + cl_kernel m_ocl_encode_etc1s_blocks_kernel; + cl_kernel m_ocl_refine_endpoint_clusterization_kernel; + cl_kernel m_ocl_encode_etc1s_from_pixel_cluster_kernel; + cl_kernel m_ocl_find_optimal_selector_clusters_for_each_block_kernel; + cl_kernel m_ocl_determine_selectors_kernel; + }; + + opencl_context_ptr opencl_create_context() + { + if (!opencl_is_available()) + { + ocl_error_printf("opencl_create_context: OpenCL not initialized\n"); + assert(0); + return nullptr; + } + + interval_timer tm; + tm.start(); + + opencl_context* pContext = static_cast(calloc(sizeof(opencl_context), 1)); + if (!pContext) + return nullptr; + + // To avoid driver bugs in some drivers - serialize this. Likely not necessary, we don't know. + // https://community.intel.com/t5/OpenCL-for-CPU/Bug-report-clCreateKernelsInProgram-is-not-thread-safe/td-p/1159771 + + pContext->m_command_queue = g_ocl.create_command_queue(); + if (!pContext->m_command_queue) + { + ocl_error_printf("opencl_create_context: Failed creating OpenCL command queue!\n"); + opencl_destroy_context(pContext); + return nullptr; + } + + pContext->m_ocl_encode_etc1s_blocks_kernel = g_ocl.create_kernel("encode_etc1s_blocks"); + if (!pContext->m_ocl_encode_etc1s_blocks_kernel) + { + ocl_error_printf("opencl_create_context: Failed creating OpenCL kernel encode_etc1s_block\n"); + opencl_destroy_context(pContext); + return nullptr; + } + + pContext->m_ocl_refine_endpoint_clusterization_kernel = g_ocl.create_kernel("refine_endpoint_clusterization"); + if (!pContext->m_ocl_refine_endpoint_clusterization_kernel) + { + ocl_error_printf("opencl_create_context: Failed creating OpenCL kernel refine_endpoint_clusterization\n"); + opencl_destroy_context(pContext); + return nullptr; + } + + pContext->m_ocl_encode_etc1s_from_pixel_cluster_kernel = g_ocl.create_kernel("encode_etc1s_from_pixel_cluster"); + if (!pContext->m_ocl_encode_etc1s_from_pixel_cluster_kernel) + { + ocl_error_printf("opencl_create_context: Failed creating OpenCL kernel encode_etc1s_from_pixel_cluster\n"); + opencl_destroy_context(pContext); + return nullptr; + } + + pContext->m_ocl_find_optimal_selector_clusters_for_each_block_kernel = g_ocl.create_kernel("find_optimal_selector_clusters_for_each_block"); + if (!pContext->m_ocl_find_optimal_selector_clusters_for_each_block_kernel) + { + ocl_error_printf("opencl_create_context: Failed creating OpenCL kernel find_optimal_selector_clusters_for_each_block\n"); + opencl_destroy_context(pContext); + return nullptr; + } + + pContext->m_ocl_determine_selectors_kernel = g_ocl.create_kernel("determine_selectors"); + if (!pContext->m_ocl_determine_selectors_kernel) + { + ocl_error_printf("opencl_create_context: Failed creating OpenCL kernel determine_selectors\n"); + opencl_destroy_context(pContext); + return nullptr; + } + + debug_printf("opencl_create_context: Elapsed time: %f secs\n", tm.get_elapsed_secs()); + + return pContext; + } + + void opencl_destroy_context(opencl_context_ptr pContext) + { + if (!pContext) + return; + + interval_timer tm; + tm.start(); + + g_ocl.destroy_buffer(pContext->m_ocl_pixel_blocks); + + g_ocl.destroy_kernel(pContext->m_ocl_determine_selectors_kernel); + g_ocl.destroy_kernel(pContext->m_ocl_find_optimal_selector_clusters_for_each_block_kernel); + g_ocl.destroy_kernel(pContext->m_ocl_encode_etc1s_from_pixel_cluster_kernel); + g_ocl.destroy_kernel(pContext->m_ocl_encode_etc1s_blocks_kernel); + g_ocl.destroy_kernel(pContext->m_ocl_refine_endpoint_clusterization_kernel); + + g_ocl.destroy_command_queue(pContext->m_command_queue); + + memset(pContext, 0, sizeof(opencl_context)); + + free(pContext); + + debug_printf("opencl_destroy_context: Elapsed time: %f secs\n", tm.get_elapsed_secs()); + } + +#pragma pack(push, 1) + struct cl_encode_etc1s_param_struct + { + int m_total_blocks; + int m_perceptual; + int m_total_perms; + }; +#pragma pack(pop) + + bool opencl_set_pixel_blocks(opencl_context_ptr pContext, uint32_t total_blocks, const cl_pixel_block* pPixel_blocks) + { + if (!opencl_is_available()) + return false; + + if (pContext->m_ocl_pixel_blocks) + { + g_ocl.destroy_buffer(pContext->m_ocl_pixel_blocks); + pContext->m_ocl_pixel_blocks = nullptr; + } + + pContext->m_ocl_pixel_blocks = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue, pPixel_blocks, sizeof(cl_pixel_block) * total_blocks); + if (!pContext->m_ocl_pixel_blocks) + return false; + + pContext->m_ocl_total_pixel_blocks = total_blocks; + + return true; + } + + bool opencl_encode_etc1s_blocks(opencl_context_ptr pContext, etc_block* pOutput_blocks, bool perceptual, uint32_t total_perms) + { + if (!opencl_is_available()) + return false; + + interval_timer tm; + tm.start(); + + assert(pContext->m_ocl_pixel_blocks); + if (!pContext->m_ocl_pixel_blocks) + return false; + + cl_encode_etc1s_param_struct ps; + ps.m_total_blocks = pContext->m_ocl_total_pixel_blocks; + ps.m_perceptual = perceptual; + ps.m_total_perms = total_perms; + + bool status = false; + + cl_mem vars = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue , &ps, sizeof(ps)); + cl_mem block_buf = g_ocl.alloc_write_buffer(sizeof(etc_block) * pContext->m_ocl_total_pixel_blocks); + + if (!vars || !block_buf) + goto exit; + + if (!g_ocl.set_kernel_args(pContext->m_ocl_encode_etc1s_blocks_kernel, vars, pContext->m_ocl_pixel_blocks, block_buf)) + goto exit; + + if (!g_ocl.run_2D(pContext->m_command_queue, pContext->m_ocl_encode_etc1s_blocks_kernel, pContext->m_ocl_total_pixel_blocks, 1)) + goto exit; + + if (!g_ocl.read_from_buffer(pContext->m_command_queue, block_buf, pOutput_blocks, pContext->m_ocl_total_pixel_blocks * sizeof(etc_block))) + goto exit; + + status = true; + + debug_printf("opencl_encode_etc1s_blocks: Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + +exit: + g_ocl.destroy_buffer(block_buf); + g_ocl.destroy_buffer(vars); + + return status; + } + + bool opencl_encode_etc1s_pixel_clusters( + opencl_context_ptr pContext, + etc_block* pOutput_blocks, + uint32_t total_clusters, + const cl_pixel_cluster* pClusters, + uint64_t total_pixels, + const color_rgba* pPixels, const uint32_t* pPixel_weights, + bool perceptual, uint32_t total_perms) + { + if (!opencl_is_available()) + return false; + + interval_timer tm; + tm.start(); + + cl_encode_etc1s_param_struct ps; + ps.m_total_blocks = total_clusters; + ps.m_perceptual = perceptual; + ps.m_total_perms = total_perms; + + bool status = false; + + if (sizeof(size_t) == sizeof(uint32_t)) + { + if ( ((sizeof(cl_pixel_cluster) * total_clusters) > UINT32_MAX) || + ((sizeof(color_rgba) * total_pixels) > UINT32_MAX) || + ((sizeof(uint32_t) * total_pixels) > UINT32_MAX) ) + { + return false; + } + } + + cl_mem vars = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue , &ps, sizeof(ps)); + cl_mem input_clusters = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue, pClusters, (size_t)(sizeof(cl_pixel_cluster) * total_clusters)); + cl_mem input_pixels = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue, pPixels, (size_t)(sizeof(color_rgba) * total_pixels)); + cl_mem weights_buf = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue, pPixel_weights, (size_t)(sizeof(uint32_t) * total_pixels)); + cl_mem block_buf = g_ocl.alloc_write_buffer(sizeof(etc_block) * total_clusters); + + if (!vars || !input_clusters || !input_pixels || !weights_buf || !block_buf) + goto exit; + + if (!g_ocl.set_kernel_args(pContext->m_ocl_encode_etc1s_from_pixel_cluster_kernel, vars, input_clusters, input_pixels, weights_buf, block_buf)) + goto exit; + + if (!g_ocl.run_2D(pContext->m_command_queue, pContext->m_ocl_encode_etc1s_from_pixel_cluster_kernel, total_clusters, 1)) + goto exit; + + if (!g_ocl.read_from_buffer(pContext->m_command_queue, block_buf, pOutput_blocks, sizeof(etc_block) * total_clusters)) + goto exit; + + status = true; + + debug_printf("opencl_encode_etc1s_pixel_clusters: Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + + exit: + g_ocl.destroy_buffer(block_buf); + g_ocl.destroy_buffer(weights_buf); + g_ocl.destroy_buffer(input_pixels); + g_ocl.destroy_buffer(input_clusters); + g_ocl.destroy_buffer(vars); + + return status; + } + +#pragma pack(push, 1) + struct cl_rec_param_struct + { + int m_total_blocks; + int m_perceptual; + }; +#pragma pack(pop) + + bool opencl_refine_endpoint_clusterization( + opencl_context_ptr pContext, + const cl_block_info_struct* pPixel_block_info, + uint32_t total_clusters, + const cl_endpoint_cluster_struct* pCluster_info, + const uint32_t* pSorted_block_indices, + uint32_t* pOutput_cluster_indices, + bool perceptual) + { + if (!opencl_is_available()) + return false; + + interval_timer tm; + tm.start(); + + assert(pContext->m_ocl_pixel_blocks); + if (!pContext->m_ocl_pixel_blocks) + return false; + + cl_rec_param_struct ps; + ps.m_total_blocks = pContext->m_ocl_total_pixel_blocks; + ps.m_perceptual = perceptual; + + bool status = false; + + cl_mem pixel_block_info = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue, pPixel_block_info, sizeof(cl_block_info_struct) * pContext->m_ocl_total_pixel_blocks); + cl_mem cluster_info = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue, pCluster_info, sizeof(cl_endpoint_cluster_struct) * total_clusters); + cl_mem sorted_block_indices = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue, pSorted_block_indices, sizeof(uint32_t) * pContext->m_ocl_total_pixel_blocks); + cl_mem output_buf = g_ocl.alloc_write_buffer(sizeof(uint32_t) * pContext->m_ocl_total_pixel_blocks); + + if (!pixel_block_info || !cluster_info || !sorted_block_indices || !output_buf) + goto exit; + + if (!g_ocl.set_kernel_args(pContext->m_ocl_refine_endpoint_clusterization_kernel, ps, pContext->m_ocl_pixel_blocks, pixel_block_info, cluster_info, sorted_block_indices, output_buf)) + goto exit; + + if (!g_ocl.run_2D(pContext->m_command_queue, pContext->m_ocl_refine_endpoint_clusterization_kernel, pContext->m_ocl_total_pixel_blocks, 1)) + goto exit; + + if (!g_ocl.read_from_buffer(pContext->m_command_queue, output_buf, pOutput_cluster_indices, pContext->m_ocl_total_pixel_blocks * sizeof(uint32_t))) + goto exit; + + debug_printf("opencl_refine_endpoint_clusterization: Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + + status = true; + +exit: + g_ocl.destroy_buffer(pixel_block_info); + g_ocl.destroy_buffer(cluster_info); + g_ocl.destroy_buffer(sorted_block_indices); + g_ocl.destroy_buffer(output_buf); + + return status; + } + + bool opencl_find_optimal_selector_clusters_for_each_block( + opencl_context_ptr pContext, + const fosc_block_struct* pInput_block_info, // one per block + uint32_t total_input_selectors, + const fosc_selector_struct* pInput_selectors, + const uint32_t* pSelector_cluster_indices, + uint32_t* pOutput_selector_cluster_indices, // one per block + bool perceptual) + { + if (!opencl_is_available()) + return false; + + interval_timer tm; + tm.start(); + + assert(pContext->m_ocl_pixel_blocks); + if (!pContext->m_ocl_pixel_blocks) + return false; + + fosc_param_struct ps; + ps.m_total_blocks = pContext->m_ocl_total_pixel_blocks; + ps.m_perceptual = perceptual; + + bool status = false; + + cl_mem input_block_info = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue, pInput_block_info, sizeof(fosc_block_struct) * pContext->m_ocl_total_pixel_blocks); + cl_mem input_selectors = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue, pInput_selectors, sizeof(fosc_selector_struct) * total_input_selectors); + cl_mem selector_cluster_indices = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue, pSelector_cluster_indices, sizeof(uint32_t) * total_input_selectors); + cl_mem output_selector_cluster_indices = g_ocl.alloc_write_buffer(sizeof(uint32_t) * pContext->m_ocl_total_pixel_blocks); + + if (!input_block_info || !input_selectors || !selector_cluster_indices || !output_selector_cluster_indices) + goto exit; + + if (!g_ocl.set_kernel_args(pContext->m_ocl_find_optimal_selector_clusters_for_each_block_kernel, ps, pContext->m_ocl_pixel_blocks, input_block_info, input_selectors, selector_cluster_indices, output_selector_cluster_indices)) + goto exit; + + if (!g_ocl.run_2D(pContext->m_command_queue, pContext->m_ocl_find_optimal_selector_clusters_for_each_block_kernel, pContext->m_ocl_total_pixel_blocks, 1)) + goto exit; + + if (!g_ocl.read_from_buffer(pContext->m_command_queue, output_selector_cluster_indices, pOutput_selector_cluster_indices, pContext->m_ocl_total_pixel_blocks * sizeof(uint32_t))) + goto exit; + + debug_printf("opencl_find_optimal_selector_clusters_for_each_block: Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + + status = true; + + exit: + g_ocl.destroy_buffer(input_block_info); + g_ocl.destroy_buffer(input_selectors); + g_ocl.destroy_buffer(selector_cluster_indices); + g_ocl.destroy_buffer(output_selector_cluster_indices); + + return status; + } + + bool opencl_determine_selectors( + opencl_context_ptr pContext, + const color_rgba* pInput_etc_color5_and_inten, + etc_block* pOutput_blocks, + bool perceptual) + { + if (!opencl_is_available()) + return false; + + interval_timer tm; + tm.start(); + + assert(pContext->m_ocl_pixel_blocks); + if (!pContext->m_ocl_pixel_blocks) + return false; + + ds_param_struct ps; + ps.m_total_blocks = pContext->m_ocl_total_pixel_blocks; + ps.m_perceptual = perceptual; + + bool status = false; + + cl_mem input_etc_color5_intens = g_ocl.alloc_and_init_read_buffer(pContext->m_command_queue, pInput_etc_color5_and_inten, sizeof(color_rgba) * pContext->m_ocl_total_pixel_blocks); + cl_mem output_blocks = g_ocl.alloc_write_buffer(sizeof(etc_block) * pContext->m_ocl_total_pixel_blocks); + + if (!input_etc_color5_intens || !output_blocks) + goto exit; + + if (!g_ocl.set_kernel_args(pContext->m_ocl_determine_selectors_kernel, ps, pContext->m_ocl_pixel_blocks, input_etc_color5_intens, output_blocks)) + goto exit; + + if (!g_ocl.run_2D(pContext->m_command_queue, pContext->m_ocl_determine_selectors_kernel, pContext->m_ocl_total_pixel_blocks, 1)) + goto exit; + + if (!g_ocl.read_from_buffer(pContext->m_command_queue, output_blocks, pOutput_blocks, pContext->m_ocl_total_pixel_blocks * sizeof(etc_block))) + goto exit; + + debug_printf("opencl_determine_selectors: Elapsed time: %3.3f secs\n", tm.get_elapsed_secs()); + + status = true; + + exit: + g_ocl.destroy_buffer(input_etc_color5_intens); + g_ocl.destroy_buffer(output_blocks); + + return status; + } + +#else +namespace basisu +{ + // No OpenCL support - all dummy functions that return false; + bool opencl_init(bool force_serialization) + { + BASISU_NOTE_UNUSED(force_serialization); + + return false; + } + + void opencl_deinit() + { + } + + bool opencl_is_available() + { + return false; + } + + opencl_context_ptr opencl_create_context() + { + return nullptr; + } + + void opencl_destroy_context(opencl_context_ptr context) + { + BASISU_NOTE_UNUSED(context); + } + + bool opencl_set_pixel_blocks(opencl_context_ptr pContext, uint32_t total_blocks, const cl_pixel_block* pPixel_blocks) + { + BASISU_NOTE_UNUSED(pContext); + BASISU_NOTE_UNUSED(total_blocks); + BASISU_NOTE_UNUSED(pPixel_blocks); + + return false; + } + + bool opencl_encode_etc1s_blocks(opencl_context_ptr pContext, etc_block* pOutput_blocks, bool perceptual, uint32_t total_perms) + { + BASISU_NOTE_UNUSED(pContext); + BASISU_NOTE_UNUSED(pOutput_blocks); + BASISU_NOTE_UNUSED(perceptual); + BASISU_NOTE_UNUSED(total_perms); + + return false; + } + + bool opencl_encode_etc1s_pixel_clusters( + opencl_context_ptr pContext, + etc_block* pOutput_blocks, + uint32_t total_clusters, + const cl_pixel_cluster* pClusters, + uint64_t total_pixels, + const color_rgba* pPixels, const uint32_t *pPixel_weights, + bool perceptual, uint32_t total_perms) + { + BASISU_NOTE_UNUSED(pContext); + BASISU_NOTE_UNUSED(pOutput_blocks); + BASISU_NOTE_UNUSED(total_clusters); + BASISU_NOTE_UNUSED(pClusters); + BASISU_NOTE_UNUSED(total_pixels); + BASISU_NOTE_UNUSED(pPixels); + BASISU_NOTE_UNUSED(pPixel_weights); + BASISU_NOTE_UNUSED(perceptual); + BASISU_NOTE_UNUSED(total_perms); + + return false; + } + + bool opencl_refine_endpoint_clusterization( + opencl_context_ptr pContext, + const cl_block_info_struct* pPixel_block_info, + uint32_t total_clusters, + const cl_endpoint_cluster_struct* pCluster_info, + const uint32_t* pSorted_block_indices, + uint32_t* pOutput_cluster_indices, + bool perceptual) + { + BASISU_NOTE_UNUSED(pContext); + BASISU_NOTE_UNUSED(pPixel_block_info); + BASISU_NOTE_UNUSED(total_clusters); + BASISU_NOTE_UNUSED(pCluster_info); + BASISU_NOTE_UNUSED(pSorted_block_indices); + BASISU_NOTE_UNUSED(pOutput_cluster_indices); + BASISU_NOTE_UNUSED(perceptual); + + return false; + } + + bool opencl_find_optimal_selector_clusters_for_each_block( + opencl_context_ptr pContext, + const fosc_block_struct* pInput_block_info, // one per block + uint32_t total_input_selectors, + const fosc_selector_struct* pInput_selectors, + const uint32_t* pSelector_cluster_indices, + uint32_t* pOutput_selector_cluster_indices, // one per block + bool perceptual) + { + BASISU_NOTE_UNUSED(pContext); + BASISU_NOTE_UNUSED(pInput_block_info); + BASISU_NOTE_UNUSED(total_input_selectors); + BASISU_NOTE_UNUSED(pInput_selectors); + BASISU_NOTE_UNUSED(pSelector_cluster_indices); + BASISU_NOTE_UNUSED(pOutput_selector_cluster_indices); + BASISU_NOTE_UNUSED(perceptual); + + return false; + } + + bool opencl_determine_selectors( + opencl_context_ptr pContext, + const color_rgba* pInput_etc_color5_and_inten, + etc_block* pOutput_blocks, + bool perceptual) + { + BASISU_NOTE_UNUSED(pContext); + BASISU_NOTE_UNUSED(pInput_etc_color5_and_inten); + BASISU_NOTE_UNUSED(pOutput_blocks); + BASISU_NOTE_UNUSED(perceptual); + + return false; + } + +#endif // BASISU_SUPPORT_OPENCL + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_opencl.h b/ktx/external/basisu/encoder/basisu_opencl.h new file mode 100644 index 0000000..4194a08 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_opencl.h @@ -0,0 +1,143 @@ +// basisu_opencl.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// Note: Undefine or set BASISU_SUPPORT_OPENCL to 0 to completely OpenCL support. +// +// 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. +#pragma once +#include "../transcoder/basisu.h" +#include "basisu_enc.h" +#include "basisu_etc.h" + +namespace basisu +{ + bool opencl_init(bool force_serialization); + void opencl_deinit(); + bool opencl_is_available(); + + struct opencl_context; + + // Each thread calling OpenCL should have its own opencl_context_ptr. This corresponds to a OpenCL command queue. (Confusingly, we only use a single OpenCL device "context".) + typedef opencl_context* opencl_context_ptr; + + opencl_context_ptr opencl_create_context(); + void opencl_destroy_context(opencl_context_ptr context); + +#pragma pack(push, 1) + struct cl_pixel_block + { + color_rgba m_pixels[16]; // [y*4+x] + }; +#pragma pack(pop) + + // Must match BASISU_ETC1_CLUSTER_FIT_ORDER_TABLE_SIZE + const uint32_t OPENCL_ENCODE_ETC1S_MAX_PERMS = 165; + + bool opencl_set_pixel_blocks(opencl_context_ptr pContext, uint32_t total_blocks, const cl_pixel_block* pPixel_blocks); + + bool opencl_encode_etc1s_blocks(opencl_context_ptr pContext, etc_block* pOutput_blocks, bool perceptual, uint32_t total_perms); + + // opencl_encode_etc1s_pixel_clusters + +#pragma pack(push, 1) + struct cl_pixel_cluster + { + uint64_t m_total_pixels; + uint64_t m_first_pixel_index; + }; +#pragma pack(pop) + + bool opencl_encode_etc1s_pixel_clusters( + opencl_context_ptr pContext, + etc_block* pOutput_blocks, + uint32_t total_clusters, + const cl_pixel_cluster *pClusters, + uint64_t total_pixels, + const color_rgba *pPixels, + const uint32_t *pPixel_weights, + bool perceptual, uint32_t total_perms); + + // opencl_refine_endpoint_clusterization + +#pragma pack(push, 1) + struct cl_block_info_struct + { + uint16_t m_first_cluster_ofs; + uint16_t m_num_clusters; + uint16_t m_cur_cluster_index; + uint8_t m_cur_cluster_etc_inten; + }; + + struct cl_endpoint_cluster_struct + { + color_rgba m_unscaled_color; + uint8_t m_etc_inten; + uint16_t m_cluster_index; + }; +#pragma pack(pop) + + bool opencl_refine_endpoint_clusterization( + opencl_context_ptr pContext, + const cl_block_info_struct *pPixel_block_info, + uint32_t total_clusters, + const cl_endpoint_cluster_struct *pCluster_info, + const uint32_t *pSorted_block_indices, + uint32_t* pOutput_cluster_indices, + bool perceptual); + + // opencl_find_optimal_selector_clusters_for_each_block + +#pragma pack(push, 1) + struct fosc_selector_struct + { + uint32_t m_packed_selectors; // 4x4 grid of 2-bit selectors + }; + + struct fosc_block_struct + { + color_rgba m_etc_color5_inten; // unscaled 5-bit block color in RGB, alpha has block's intensity index + uint32_t m_first_selector; // offset into selector table + uint32_t m_num_selectors; // number of selectors to check + }; + + struct fosc_param_struct + { + uint32_t m_total_blocks; + int m_perceptual; + }; +#pragma pack(pop) + + bool opencl_find_optimal_selector_clusters_for_each_block( + opencl_context_ptr pContext, + const fosc_block_struct* pInput_block_info, // one per block + uint32_t total_input_selectors, + const fosc_selector_struct* pInput_selectors, + const uint32_t* pSelector_cluster_indices, + uint32_t* pOutput_selector_cluster_indices, // one per block + bool perceptual); + +#pragma pack(push, 1) + struct ds_param_struct + { + uint32_t m_total_blocks; + int m_perceptual; + }; +#pragma pack(pop) + + bool opencl_determine_selectors( + opencl_context_ptr pContext, + const color_rgba* pInput_etc_color5_and_inten, + etc_block* pOutput_blocks, + bool perceptual); + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_pvrtc1_4.cpp b/ktx/external/basisu/encoder/basisu_pvrtc1_4.cpp new file mode 100644 index 0000000..596fc19 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_pvrtc1_4.cpp @@ -0,0 +1,564 @@ +// basisu_pvrtc1_4.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_pvrtc1_4.h" + +namespace basisu +{ +#if 0 + static const uint8_t g_pvrtc_5[32] = { 0,8,16,24,33,41,49,57,66,74,82,90,99,107,115,123,132,140,148,156,165,173,181,189,198,206,214,222,231,239,247,255 }; + static const uint8_t g_pvrtc_4[16] = { 0,16,33,49,66,82,99,115,140,156,173,189,206,222,239,255 }; + static const uint8_t g_pvrtc_3[8] = { 0,33,74,107,148,181,222,255 }; + static const uint8_t g_pvrtc_alpha[9] = { 0,34,68,102,136,170,204,238,255 }; +#endif + + static const uint8_t g_pvrtc_5_nearest[256] = { 0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,31,31,31,31 }; + static const uint8_t g_pvrtc_4_nearest[256] = { 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15 }; +#if 0 + static const uint8_t g_pvrtc_3_nearest[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 }; + static const uint8_t g_pvrtc_alpha_nearest[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8 }; +#endif + +#if 0 + static const uint8_t g_pvrtc_5_floor[256] = + { + 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3, + 3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7, + 7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15, + 15,15,15,15,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19, + 19,19,19,19,19,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,23,23,23, + 23,23,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,27,27, + 27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,31 + }; + + static const uint8_t g_pvrtc_5_ceil[256] = + { + 0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4, + 4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,8,8,8, + 8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12, + 12,12,12,12,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,16,16,16,16, + 16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,20,20,20, + 20,20,20,20,20,20,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,24,24, + 24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,28, + 28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,31,31,31,31,31,31,31,31 + }; + + static const uint8_t g_pvrtc_4_floor[256] = + { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,15 + }; + + static const uint8_t g_pvrtc_4_ceil[256] = + { + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 + }; + + static const uint8_t g_pvrtc_3_floor[256] = + { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7 + }; + + static const uint8_t g_pvrtc_3_ceil[256] = + { + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 + }; + + static const uint8_t g_pvrtc_alpha_floor[256] = + { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8 + }; + + static const uint8_t g_pvrtc_alpha_ceil[256] = + { + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 + }; +#endif + + uint32_t pvrtc4_swizzle_uv(uint32_t width, uint32_t height, uint32_t x, uint32_t y) + { + assert((x < width) && (y < height) && basisu::is_pow2(height) && basisu::is_pow2(width)); + + uint32_t min_d = width, max_v = y; + if (height < width) + { + min_d = height; + max_v = x; + } + + // Interleave the XY LSB's + uint32_t shift_ofs = 0, swizzled = 0; + for (uint32_t s_bit = 1, d_bit = 1; s_bit < min_d; s_bit <<= 1, d_bit <<= 2, ++shift_ofs) + { + if (y & s_bit) swizzled |= d_bit; + if (x & s_bit) swizzled |= (2 * d_bit); + } + + max_v >>= shift_ofs; + + // OR in the rest of the bits from the largest dimension + swizzled |= (max_v << (2 * shift_ofs)); + + return swizzled; + } + + color_rgba pvrtc4_block::get_endpoint(uint32_t endpoint_index, bool unpack) const + { + assert(endpoint_index < 2); + const uint32_t packed = m_endpoints >> (endpoint_index * 16); + + uint32_t r, g, b, a; + if (packed & 0x8000) + { + // opaque 554 or 555 + if (!endpoint_index) + { + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = (packed >> 1) & 15; + + if (unpack) + { + b = (b << 1) | (b >> 3); + } + } + else + { + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + } + + a = unpack ? 255 : 7; + } + else + { + // translucent 4433 or 4443 + if (!endpoint_index) + { + a = (packed >> 12) & 7; + r = (packed >> 8) & 15; + g = (packed >> 4) & 15; + b = (packed >> 1) & 7; + + if (unpack) + { + a = (a << 1); + a = (a << 4) | a; + + r = (r << 1) | (r >> 3); + g = (g << 1) | (g >> 3); + b = (b << 2) | (b >> 1); + } + } + else + { + a = (packed >> 12) & 7; + r = (packed >> 8) & 15; + g = (packed >> 4) & 15; + b = packed & 15; + + if (unpack) + { + a = (a << 1); + a = (a << 4) | a; + + r = (r << 1) | (r >> 3); + g = (g << 1) | (g >> 3); + b = (b << 1) | (b >> 3); + } + } + } + + if (unpack) + { + r = (r << 3) | (r >> 2); + g = (g << 3) | (g >> 2); + b = (b << 3) | (b >> 2); + } + + assert((r < 256) && (g < 256) && (b < 256) && (a < 256)); + + return color_rgba(r, g, b, a); + } + + color_rgba pvrtc4_block::get_endpoint_5554(uint32_t endpoint_index) const + { + assert(endpoint_index < 2); + const uint32_t packed = m_endpoints >> (endpoint_index * 16); + + uint32_t r, g, b, a; + if (packed & 0x8000) + { + // opaque 554 or 555 + if (!endpoint_index) + { + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = (packed >> 1) & 15; + + b = (b << 1) | (b >> 3); + } + else + { + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + } + + a = 15; + } + else + { + // translucent 4433 or 4443 + if (!endpoint_index) + { + a = (packed >> 12) & 7; + r = (packed >> 8) & 15; + g = (packed >> 4) & 15; + b = (packed >> 1) & 7; + + a = a << 1; + + r = (r << 1) | (r >> 3); + g = (g << 1) | (g >> 3); + b = (b << 2) | (b >> 1); + } + else + { + a = (packed >> 12) & 7; + r = (packed >> 8) & 15; + g = (packed >> 4) & 15; + b = packed & 15; + + a = a << 1; + + r = (r << 1) | (r >> 3); + g = (g << 1) | (g >> 3); + b = (b << 1) | (b >> 3); + } + } + + assert((r < 32) && (g < 32) && (b < 32) && (a < 16)); + + return color_rgba(r, g, b, a); + } + + bool pvrtc4_image::get_interpolated_colors(uint32_t x, uint32_t y, color_rgba* pColors) const + { + assert((x < m_width) && (y < m_height)); + + int block_x0 = (static_cast(x) - 2) >> 2; + int block_x1 = block_x0 + 1; + int block_y0 = (static_cast(y) - 2) >> 2; + int block_y1 = block_y0 + 1; + + block_x0 = posmod(block_x0, m_block_width); + block_x1 = posmod(block_x1, m_block_width); + block_y0 = posmod(block_y0, m_block_height); + block_y1 = posmod(block_y1, m_block_height); + + pColors[0] = interpolate(x, y, m_blocks(block_x0, block_y0).get_endpoint_5554(0), m_blocks(block_x1, block_y0).get_endpoint_5554(0), m_blocks(block_x0, block_y1).get_endpoint_5554(0), m_blocks(block_x1, block_y1).get_endpoint_5554(0)); + pColors[3] = interpolate(x, y, m_blocks(block_x0, block_y0).get_endpoint_5554(1), m_blocks(block_x1, block_y0).get_endpoint_5554(1), m_blocks(block_x0, block_y1).get_endpoint_5554(1), m_blocks(block_x1, block_y1).get_endpoint_5554(1)); + + if (get_block_uses_transparent_modulation(x >> 2, y >> 2)) + { + for (uint32_t c = 0; c < 4; c++) + { + uint32_t m = (pColors[0][c] + pColors[3][c]) / 2; + pColors[1][c] = static_cast(m); + pColors[2][c] = static_cast(m); + } + pColors[2][3] = 0; + return true; + } + + for (uint32_t c = 0; c < 4; c++) + { + pColors[1][c] = static_cast((pColors[0][c] * 5 + pColors[3][c] * 3) / 8); + pColors[2][c] = static_cast((pColors[0][c] * 3 + pColors[3][c] * 5) / 8); + } + + return false; + } + + color_rgba pvrtc4_image::get_pixel(uint32_t x, uint32_t y, uint32_t m) const + { + assert((x < m_width) && (y < m_height)); + + int block_x0 = (static_cast(x) - 2) >> 2; + int block_x1 = block_x0 + 1; + int block_y0 = (static_cast(y) - 2) >> 2; + int block_y1 = block_y0 + 1; + + block_x0 = posmod(block_x0, m_block_width); + block_x1 = posmod(block_x1, m_block_width); + block_y0 = posmod(block_y0, m_block_height); + block_y1 = posmod(block_y1, m_block_height); + + if (get_block_uses_transparent_modulation(x >> 2, y >> 2)) + { + if (m == 0) + return interpolate(x, y, m_blocks(block_x0, block_y0).get_endpoint_5554(0), m_blocks(block_x1, block_y0).get_endpoint_5554(0), m_blocks(block_x0, block_y1).get_endpoint_5554(0), m_blocks(block_x1, block_y1).get_endpoint_5554(0)); + else if (m == 3) + return interpolate(x, y, m_blocks(block_x0, block_y0).get_endpoint_5554(1), m_blocks(block_x1, block_y0).get_endpoint_5554(1), m_blocks(block_x0, block_y1).get_endpoint_5554(1), m_blocks(block_x1, block_y1).get_endpoint_5554(1)); + + color_rgba l(interpolate(x, y, m_blocks(block_x0, block_y0).get_endpoint_5554(0), m_blocks(block_x1, block_y0).get_endpoint_5554(0), m_blocks(block_x0, block_y1).get_endpoint_5554(0), m_blocks(block_x1, block_y1).get_endpoint_5554(0))); + color_rgba h(interpolate(x, y, m_blocks(block_x0, block_y0).get_endpoint_5554(1), m_blocks(block_x1, block_y0).get_endpoint_5554(1), m_blocks(block_x0, block_y1).get_endpoint_5554(1), m_blocks(block_x1, block_y1).get_endpoint_5554(1))); + + return color_rgba((l[0] + h[0]) / 2, (l[1] + h[1]) / 2, (l[2] + h[2]) / 2, (m == 2) ? 0 : (l[3] + h[3]) / 2); + } + else + { + if (m == 0) + return interpolate(x, y, m_blocks(block_x0, block_y0).get_endpoint_5554(0), m_blocks(block_x1, block_y0).get_endpoint_5554(0), m_blocks(block_x0, block_y1).get_endpoint_5554(0), m_blocks(block_x1, block_y1).get_endpoint_5554(0)); + else if (m == 3) + return interpolate(x, y, m_blocks(block_x0, block_y0).get_endpoint_5554(1), m_blocks(block_x1, block_y0).get_endpoint_5554(1), m_blocks(block_x0, block_y1).get_endpoint_5554(1), m_blocks(block_x1, block_y1).get_endpoint_5554(1)); + + color_rgba l(interpolate(x, y, m_blocks(block_x0, block_y0).get_endpoint_5554(0), m_blocks(block_x1, block_y0).get_endpoint_5554(0), m_blocks(block_x0, block_y1).get_endpoint_5554(0), m_blocks(block_x1, block_y1).get_endpoint_5554(0))); + color_rgba h(interpolate(x, y, m_blocks(block_x0, block_y0).get_endpoint_5554(1), m_blocks(block_x1, block_y0).get_endpoint_5554(1), m_blocks(block_x0, block_y1).get_endpoint_5554(1), m_blocks(block_x1, block_y1).get_endpoint_5554(1))); + + if (m == 2) + return color_rgba((l[0] * 3 + h[0] * 5) / 8, (l[1] * 3 + h[1] * 5) / 8, (l[2] * 3 + h[2] * 5) / 8, (l[3] * 3 + h[3] * 5) / 8); + else + return color_rgba((l[0] * 5 + h[0] * 3) / 8, (l[1] * 5 + h[1] * 3) / 8, (l[2] * 5 + h[2] * 3) / 8, (l[3] * 5 + h[3] * 3) / 8); + } + } + + uint64_t pvrtc4_image::local_endpoint_optimization_opaque(uint32_t bx, uint32_t by, const image& orig_img, bool perceptual) + { + uint64_t initial_error = evaluate_1x1_endpoint_error(bx, by, orig_img, perceptual, false); + if (!initial_error) + return initial_error; + + vec3F c_avg_orig(0); + + for (int y = 0; y < 7; y++) + { + const uint32_t py = wrap_y(by * 4 + y - 1); + for (uint32_t x = 0; x < 7; x++) + { + const uint32_t px = wrap_x(bx * 4 + x - 1); + + const color_rgba& c = orig_img(px, py); + + c_avg_orig[0] += c[0]; + c_avg_orig[1] += c[1]; + c_avg_orig[2] += c[2]; + } + } + + c_avg_orig *= 1.0f / 49.0f; + + vec3F quant_colors[2]; + quant_colors[0].set(c_avg_orig); + quant_colors[0] -= vec3F(.0125f); + + quant_colors[1].set(c_avg_orig); + quant_colors[1] += vec3F(.0125f); + + float total_weight[2]; + + bool success = true; + + for (uint32_t pass = 0; pass < 4; pass++) + { + vec3F new_colors[2] = { vec3F(0), vec3F(0) }; + memset(total_weight, 0, sizeof(total_weight)); + + static const float s_weights[7][7] = + { + { 1.000000f, 1.637089f, 2.080362f, 2.242640f, 2.080362f, 1.637089f, 1.000000f }, + { 1.637089f, 2.414213f, 3.006572f, 3.242640f, 3.006572f, 2.414213f, 1.637089f }, + { 2.080362f, 3.006572f, 3.828426f, 4.242640f, 3.828426f, 3.006572f, 2.080362f }, + { 2.242640f, 3.242640f, 4.242640f, 5.000000f, 4.242640f, 3.242640f, 2.242640f }, + { 2.080362f, 3.006572f, 3.828426f, 4.242640f, 3.828426f, 3.006572f, 2.080362f }, + { 1.637089f, 2.414213f, 3.006572f, 3.242640f, 3.006572f, 2.414213f, 1.637089f }, + { 1.000000f, 1.637089f, 2.080362f, 2.242640f, 2.080362f, 1.637089f, 1.000000f } + }; + + for (int y = 0; y < 7; y++) + { + const uint32_t py = wrap_y(by * 4 + y - 1); + for (uint32_t x = 0; x < 7; x++) + { + const uint32_t px = wrap_x(bx * 4 + x - 1); + + const color_rgba& orig_c = orig_img(px, py); + + vec3F color(orig_c[0], orig_c[1], orig_c[2]); + + uint32_t c = quant_colors[0].squared_distance(color) > quant_colors[1].squared_distance(color); + + const float weight = s_weights[y][x]; + new_colors[c] += color * weight; + + total_weight[c] += weight; + } + } + + if (!total_weight[0] || !total_weight[1]) + success = false; + + quant_colors[0] = new_colors[0] / (float)total_weight[0]; + quant_colors[1] = new_colors[1] / (float)total_weight[1]; + } + + if (!success) + { + quant_colors[0] = c_avg_orig; + quant_colors[1] = c_avg_orig; + } + + vec4F colors[2] = { quant_colors[0], quant_colors[1] }; + + colors[0] += vec3F(.5f); + colors[1] += vec3F(.5f); + color_rgba color_0((int)colors[0][0], (int)colors[0][1], (int)colors[0][2], 0); + color_rgba color_1((int)colors[1][0], (int)colors[1][1], (int)colors[1][2], 0); + + pvrtc4_block cur_blocks[3][3]; + + for (int y = -1; y <= 1; y++) + { + for (int x = -1; x <= 1; x++) + { + const uint32_t block_x = wrap_block_x(bx + x); + const uint32_t block_y = wrap_block_y(by + y); + cur_blocks[x + 1][y + 1] = m_blocks(block_x, block_y); + } + } + + color_rgba l1(0), h1(0); + + l1[0] = g_pvrtc_5_nearest[color_0[0]]; + h1[0] = g_pvrtc_5_nearest[color_1[0]]; + + l1[1] = g_pvrtc_5_nearest[color_0[1]]; + h1[1] = g_pvrtc_5_nearest[color_1[1]]; + + l1[2] = g_pvrtc_4_nearest[color_0[2]]; + h1[2] = g_pvrtc_5_nearest[color_0[2]]; + + l1[3] = 0; + h1[3] = 0; + + m_blocks(bx, by).set_endpoint_raw(0, l1, true); + m_blocks(bx, by).set_endpoint_raw(1, h1, true); + + uint64_t e03_err_0 = remap_pixels_influenced_by_endpoint(bx, by, orig_img, perceptual, false); + + pvrtc4_block blocks0[3][3]; + for (int y = -1; y <= 1; y++) + { + for (int x = -1; x <= 1; x++) + { + const uint32_t block_x = wrap_block_x(bx + x); + const uint32_t block_y = wrap_block_y(by + y); + blocks0[x + 1][y + 1] = m_blocks(block_x, block_y); + } + } + + l1[0] = g_pvrtc_5_nearest[color_1[0]]; + h1[0] = g_pvrtc_5_nearest[color_0[0]]; + + l1[1] = g_pvrtc_5_nearest[color_1[1]]; + h1[1] = g_pvrtc_5_nearest[color_0[1]]; + + l1[2] = g_pvrtc_4_nearest[color_1[2]]; + h1[2] = g_pvrtc_5_nearest[color_0[2]]; + + l1[3] = 0; + h1[3] = 0; + + m_blocks(bx, by).set_endpoint_raw(0, l1, true); + m_blocks(bx, by).set_endpoint_raw(1, h1, true); + + uint64_t e03_err_1 = remap_pixels_influenced_by_endpoint(bx, by, orig_img, perceptual, false); + + if (initial_error < basisu::minimum(e03_err_0, e03_err_1)) + { + for (int y = -1; y <= 1; y++) + { + for (int x = -1; x <= 1; x++) + { + const uint32_t block_x = wrap_block_x(bx + x); + const uint32_t block_y = wrap_block_y(by + y); + m_blocks(block_x, block_y) = cur_blocks[x + 1][y + 1]; + } + } + return initial_error; + } + else if (e03_err_0 < e03_err_1) + { + for (int y = -1; y <= 1; y++) + { + for (int x = -1; x <= 1; x++) + { + const uint32_t block_x = wrap_block_x(bx + x); + const uint32_t block_y = wrap_block_y(by + y); + m_blocks(block_x, block_y) = blocks0[x + 1][y + 1]; + } + } + assert(e03_err_0 == evaluate_1x1_endpoint_error(bx, by, orig_img, perceptual, false)); + return e03_err_0; + } + + assert(e03_err_1 == evaluate_1x1_endpoint_error(bx, by, orig_img, perceptual, false)); + return e03_err_1; + } + +} // basisu diff --git a/ktx/external/basisu/encoder/basisu_pvrtc1_4.h b/ktx/external/basisu/encoder/basisu_pvrtc1_4.h new file mode 100644 index 0000000..db6985a --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_pvrtc1_4.h @@ -0,0 +1,457 @@ +// basisu_pvrtc1_4.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once +#include "basisu_gpu_texture.h" + +namespace basisu +{ + enum + { + PVRTC2_MIN_WIDTH = 16, + PVRTC2_MIN_HEIGHT = 8, + PVRTC4_MIN_WIDTH = 8, + PVRTC4_MIN_HEIGHT = 8 + }; + + struct pvrtc4_block + { + uint32_t m_modulation; + uint32_t m_endpoints; + + pvrtc4_block() : m_modulation(0), m_endpoints(0) { } + + inline bool operator== (const pvrtc4_block& rhs) const + { + return (m_modulation == rhs.m_modulation) && (m_endpoints == rhs.m_endpoints); + } + + inline void clear() + { + m_modulation = 0; + m_endpoints = 0; + } + + inline bool get_block_uses_transparent_modulation() const + { + return (m_endpoints & 1) != 0; + } + + inline bool is_endpoint_opaque(uint32_t endpoint_index) const + { + static const uint32_t s_bitmasks[2] = { 0x8000U, 0x80000000U }; + return (m_endpoints & s_bitmasks[open_range_check(endpoint_index, 2U)]) != 0; + } + + // Returns raw endpoint or 8888 + color_rgba get_endpoint(uint32_t endpoint_index, bool unpack) const; + + color_rgba get_endpoint_5554(uint32_t endpoint_index) const; + + static uint32_t get_component_precision_in_bits(uint32_t c, uint32_t endpoint_index, bool opaque_endpoint) + { + static const uint32_t s_comp_prec[4][4] = + { + // R0 G0 B0 A0 R1 G1 B1 A1 + { 4, 4, 3, 3 }, { 4, 4, 4, 3 }, // transparent endpoint + + { 5, 5, 4, 0 }, { 5, 5, 5, 0 } // opaque endpoint + }; + return s_comp_prec[open_range_check(endpoint_index, 2U) + (opaque_endpoint * 2)][open_range_check(c, 4U)]; + } + + static color_rgba get_color_precision_in_bits(uint32_t endpoint_index, bool opaque_endpoint) + { + static const color_rgba s_color_prec[4] = + { + color_rgba(4, 4, 3, 3), color_rgba(4, 4, 4, 3), // transparent endpoint + color_rgba(5, 5, 4, 0), color_rgba(5, 5, 5, 0) // opaque endpoint + }; + return s_color_prec[open_range_check(endpoint_index, 2U) + (opaque_endpoint * 2)]; + } + + inline uint32_t get_modulation(uint32_t x, uint32_t y) const + { + assert((x < 4) && (y < 4)); + return (m_modulation >> ((y * 4 + x) * 2)) & 3; + } + + inline void set_modulation(uint32_t x, uint32_t y, uint32_t s) + { + assert((x < 4) && (y < 4) && (s < 4)); + uint32_t n = (y * 4 + x) * 2; + m_modulation = (m_modulation & (~(3 << n))) | (s << n); + assert(get_modulation(x, y) == s); + } + + // Scaled by 8 + inline const uint32_t* get_scaled_modulation_values(bool block_uses_transparent_modulation) const + { + static const uint32_t s_block_scales[2][4] = { { 0, 3, 5, 8 }, { 0, 4, 4, 8 } }; + return s_block_scales[block_uses_transparent_modulation]; + } + + // Scaled by 8 + inline uint32_t get_scaled_modulation(uint32_t x, uint32_t y) const + { + return get_scaled_modulation_values(get_block_uses_transparent_modulation())[get_modulation(x, y)]; + } + + inline void byte_swap() + { + m_modulation = byteswap32(m_modulation); + m_endpoints = byteswap32(m_endpoints); + } + + // opaque endpoints: 554, 555 + // transparent endpoints: 3443, 3444 + inline void set_endpoint_raw(uint32_t endpoint_index, const color_rgba& c, bool opaque_endpoint) + { + assert(endpoint_index < 2); + const uint32_t m = m_endpoints & 1; + uint32_t r = c[0], g = c[1], b = c[2], a = c[3]; + + uint32_t packed; + + if (opaque_endpoint) + { + if (!endpoint_index) + { + // 554 + // 1RRRRRGGGGGBBBBM + assert((r < 32) && (g < 32) && (b < 16)); + packed = 0x8000 | (r << 10) | (g << 5) | (b << 1) | m; + } + else + { + // 555 + // 1RRRRRGGGGGBBBBB + assert((r < 32) && (g < 32) && (b < 32)); + packed = 0x8000 | (r << 10) | (g << 5) | b; + } + } + else + { + if (!endpoint_index) + { + // 3443 + // 0AAA RRRR GGGG BBBM + assert((r < 16) && (g < 16) && (b < 8) && (a < 8)); + packed = (a << 12) | (r << 8) | (g << 4) | (b << 1) | m; + } + else + { + // 3444 + // 0AAA RRRR GGGG BBBB + assert((r < 16) && (g < 16) && (b < 16) && (a < 8)); + packed = (a << 12) | (r << 8) | (g << 4) | b; + } + } + + assert(packed <= 0xFFFF); + + if (endpoint_index) + m_endpoints = (m_endpoints & 0xFFFFU) | (packed << 16); + else + m_endpoints = (m_endpoints & 0xFFFF0000U) | packed; + } + }; + + typedef vector2D pvrtc4_block_vector2D; + + uint32_t pvrtc4_swizzle_uv(uint32_t XSize, uint32_t YSize, uint32_t XPos, uint32_t YPos); + + class pvrtc4_image + { + public: + inline pvrtc4_image() : + m_width(0), m_height(0), m_block_width(0), m_block_height(0), m_uses_alpha(false) + { + } + + inline pvrtc4_image(uint32_t width, uint32_t height) : + m_width(0), m_height(0), m_block_width(0), m_block_height(0), m_uses_alpha(false) + { + resize(width, height); + } + + inline void clear() + { + m_width = 0; + m_height = 0; + m_block_width = 0; + m_block_height = 0; + m_blocks.clear(); + m_uses_alpha = false; + } + + inline void resize(uint32_t width, uint32_t height) + { + if ((width == m_width) && (height == m_height)) + return; + + m_width = width; + m_height = height; + + m_block_width = (width + 3) >> 2; + m_block_height = (height + 3) >> 2; + + m_blocks.resize(m_block_width, m_block_height); + } + + inline uint32_t get_width() const { return m_width; } + inline uint32_t get_height() const { return m_height; } + + inline uint32_t get_block_width() const { return m_block_width; } + inline uint32_t get_block_height() const { return m_block_height; } + + inline const pvrtc4_block_vector2D &get_blocks() const { return m_blocks; } + inline pvrtc4_block_vector2D &get_blocks() { return m_blocks; } + + inline uint32_t get_total_blocks() const { return m_block_width * m_block_height; } + + inline bool get_uses_alpha() const { return m_uses_alpha; } + inline void set_uses_alpha(bool uses_alpha) { m_uses_alpha = uses_alpha; } + + inline bool are_blocks_equal(const pvrtc4_image& rhs) const + { + return m_blocks == rhs.m_blocks; + } + + inline void set_to_black() + { + memset(m_blocks.get_ptr(), 0, m_blocks.size_in_bytes()); + } + + inline bool get_block_uses_transparent_modulation(uint32_t bx, uint32_t by) const + { + return m_blocks(bx, by).get_block_uses_transparent_modulation(); + } + + inline bool is_endpoint_opaque(uint32_t bx, uint32_t by, uint32_t endpoint_index) const + { + return m_blocks(bx, by).is_endpoint_opaque(endpoint_index); + } + + color_rgba get_endpoint(uint32_t bx, uint32_t by, uint32_t endpoint_index, bool unpack) const + { + assert((bx < m_block_width) && (by < m_block_height)); + return m_blocks(bx, by).get_endpoint(endpoint_index, unpack); + } + + inline uint32_t get_modulation(uint32_t x, uint32_t y) const + { + assert((x < m_width) && (y < m_height)); + return m_blocks(x >> 2, y >> 2).get_modulation(x & 3, y & 3); + } + + // Returns true if the block uses transparent modulation. + bool get_interpolated_colors(uint32_t x, uint32_t y, color_rgba* pColors) const; + + color_rgba get_pixel(uint32_t x, uint32_t y, uint32_t m) const; + + inline color_rgba get_pixel(uint32_t x, uint32_t y) const + { + assert((x < m_width) && (y < m_height)); + return get_pixel(x, y, m_blocks(x >> 2, y >> 2).get_modulation(x & 3, y & 3)); + } + + void deswizzle() + { + pvrtc4_block_vector2D temp(m_blocks); + + for (uint32_t y = 0; y < m_block_height; y++) + for (uint32_t x = 0; x < m_block_width; x++) + m_blocks(x, y) = temp[pvrtc4_swizzle_uv(m_block_width, m_block_height, x, y)]; + } + + void swizzle() + { + pvrtc4_block_vector2D temp(m_blocks); + + for (uint32_t y = 0; y < m_block_height; y++) + for (uint32_t x = 0; x < m_block_width; x++) + m_blocks[pvrtc4_swizzle_uv(m_block_width, m_block_height, x, y)] = temp(x, y); + } + + void unpack_all_pixels(image& img) const + { + img.crop(m_width, m_height); + + for (uint32_t y = 0; y < m_height; y++) + for (uint32_t x = 0; x < m_width; x++) + img(x, y) = get_pixel(x, y); + } + + void unpack_block(image &dst, uint32_t block_x, uint32_t block_y) + { + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + dst(x, y) = get_pixel(block_x * 4 + x, block_y * 4 + y); + } + + inline int wrap_x(int x) const + { + return posmod(x, m_width); + } + + inline int wrap_y(int y) const + { + return posmod(y, m_height); + } + + inline int wrap_block_x(int bx) const + { + return posmod(bx, m_block_width); + } + + inline int wrap_block_y(int by) const + { + return posmod(by, m_block_height); + } + + inline vec2F get_interpolation_factors(uint32_t x, uint32_t y) const + { + // 0 1 2 3 + // 2 3 0 1 + // .5 .75 0 .25 + static const float s_interp[4] = { 2, 3, 0, 1 }; + return vec2F(s_interp[x & 3], s_interp[y & 3]); + } + + inline color_rgba interpolate(int x, int y, + const color_rgba& p, const color_rgba& q, + const color_rgba& r, const color_rgba& s) const + { + static const int s_interp[4] = { 2, 3, 0, 1 }; + const int u_interp = s_interp[x & 3]; + const int v_interp = s_interp[y & 3]; + + color_rgba result; + + for (uint32_t c = 0; c < 4; c++) + { + int t = p[c] * 4 + u_interp * ((int)q[c] - (int)p[c]); + int b = r[c] * 4 + u_interp * ((int)s[c] - (int)r[c]); + int v = t * 4 + v_interp * (b - t); + if (c < 3) + { + v >>= 1; + v += (v >> 5); + } + else + { + v += (v >> 4); + } + assert((v >= 0) && (v < 256)); + result[c] = static_cast(v); + } + + return result; + } + + inline void set_modulation(uint32_t x, uint32_t y, uint32_t s) + { + assert((x < m_width) && (y < m_height)); + return m_blocks(x >> 2, y >> 2).set_modulation(x & 3, y & 3, s); + } + + inline uint64_t map_pixel(uint32_t x, uint32_t y, const color_rgba& c, bool perceptual, bool alpha_is_significant, bool record = true) + { + color_rgba v[4]; + get_interpolated_colors(x, y, v); + + uint64_t best_dist = color_distance(perceptual, c, v[0], alpha_is_significant); + uint32_t best_v = 0; + for (uint32_t i = 1; i < 4; i++) + { + uint64_t dist = color_distance(perceptual, c, v[i], alpha_is_significant); + if (dist < best_dist) + { + best_dist = dist; + best_v = i; + } + } + + if (record) + set_modulation(x, y, best_v); + + return best_dist; + } + + inline uint64_t remap_pixels_influenced_by_endpoint(uint32_t bx, uint32_t by, const image& orig_img, bool perceptual, bool alpha_is_significant) + { + uint64_t total_error = 0; + + for (int yd = -3; yd <= 3; yd++) + { + const int y = wrap_y((int)by * 4 + 2 + yd); + + for (int xd = -3; xd <= 3; xd++) + { + const int x = wrap_x((int)bx * 4 + 2 + xd); + + total_error += map_pixel(x, y, orig_img(x, y), perceptual, alpha_is_significant); + } + } + + return total_error; + } + + inline uint64_t evaluate_1x1_endpoint_error(uint32_t bx, uint32_t by, const image& orig_img, bool perceptual, bool alpha_is_significant, uint64_t threshold_error = 0) const + { + uint64_t total_error = 0; + + for (int yd = -3; yd <= 3; yd++) + { + const int y = wrap_y((int)by * 4 + 2 + yd); + + for (int xd = -3; xd <= 3; xd++) + { + const int x = wrap_x((int)bx * 4 + 2 + xd); + + total_error += color_distance(perceptual, get_pixel(x, y), orig_img(x, y), alpha_is_significant); + + if ((threshold_error) && (total_error >= threshold_error)) + return total_error; + } + } + + return total_error; + } + + uint64_t local_endpoint_optimization_opaque(uint32_t bx, uint32_t by, const image& orig_img, bool perceptual); + + inline uint64_t map_all_pixels(const image& img, bool perceptual, bool alpha_is_significant) + { + assert(m_width == img.get_width()); + assert(m_height == img.get_height()); + + uint64_t total_error = 0; + for (uint32_t y = 0; y < img.get_height(); y++) + for (uint32_t x = 0; x < img.get_width(); x++) + total_error += map_pixel(x, y, img(x, y), perceptual, alpha_is_significant); + + return total_error; + } + + public: + uint32_t m_width, m_height; + pvrtc4_block_vector2D m_blocks; + uint32_t m_block_width, m_block_height; + + bool m_uses_alpha; + }; + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_resample_filters.cpp b/ktx/external/basisu/encoder/basisu_resample_filters.cpp new file mode 100644 index 0000000..597cb3f --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_resample_filters.cpp @@ -0,0 +1,340 @@ +// basisu_resampler_filters.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_resampler_filters.h" + +#ifndef M_PI + #define M_PI 3.14159265358979323846 +#endif + +namespace basisu +{ +#define BOX_FILTER_SUPPORT (0.5f) + static float box_filter(float t) /* pulse/Fourier window */ + { + // make_clist() calls the filter function with t inverted (pos = left, neg = right) + if ((t >= -0.5f) && (t < 0.5f)) + return 1.0f; + else + return 0.0f; + } + +#define TENT_FILTER_SUPPORT (1.0f) + static float tent_filter(float t) /* box (*) box, bilinear/triangle */ + { + if (t < 0.0f) + t = -t; + + if (t < 1.0f) + return 1.0f - t; + else + return 0.0f; + } + +#define BELL_SUPPORT (1.5f) + static float bell_filter(float t) /* box (*) box (*) box */ + { + if (t < 0.0f) + t = -t; + + if (t < .5f) + return (.75f - (t * t)); + + if (t < 1.5f) + { + t = (t - 1.5f); + return (.5f * (t * t)); + } + + return (0.0f); + } + +#define B_SPLINE_SUPPORT (2.0f) + static float B_spline_filter(float t) /* box (*) box (*) box (*) box */ + { + float tt; + + if (t < 0.0f) + t = -t; + + if (t < 1.0f) + { + tt = t * t; + return ((.5f * tt * t) - tt + (2.0f / 3.0f)); + } + else if (t < 2.0f) + { + t = 2.0f - t; + return ((1.0f / 6.0f) * (t * t * t)); + } + + return (0.0f); + } + + // Dodgson, N., "Quadratic Interpolation for Image Resampling" +#define QUADRATIC_SUPPORT 1.5f + static float quadratic(float t, const float R) + { + if (t < 0.0f) + t = -t; + if (t < QUADRATIC_SUPPORT) + { + float tt = t * t; + if (t <= .5f) + return (-2.0f * R) * tt + .5f * (R + 1.0f); + else + return (R * tt) + (-2.0f * R - .5f) * t + (3.0f / 4.0f) * (R + 1.0f); + } + else + return 0.0f; + } + + static float quadratic_interp_filter(float t) + { + return quadratic(t, 1.0f); + } + + static float quadratic_approx_filter(float t) + { + return quadratic(t, .5f); + } + + static float quadratic_mix_filter(float t) + { + return quadratic(t, .8f); + } + + // Mitchell, D. and A. Netravali, "Reconstruction Filters in Computer Graphics." + // Computer Graphics, Vol. 22, No. 4, pp. 221-228. + // (B, C) + // (1/3, 1/3) - Defaults recommended by Mitchell and Netravali + // (1, 0) - Equivalent to the Cubic B-Spline + // (0, 0.5) - Equivalent to the Catmull-Rom Spline + // (0, C) - The family of Cardinal Cubic Splines + // (B, 0) - Duff's tensioned B-Splines. + static float mitchell(float t, const float B, const float C) + { + float tt; + + tt = t * t; + + if (t < 0.0f) + t = -t; + + if (t < 1.0f) + { + t = (((12.0f - 9.0f * B - 6.0f * C) * (t * tt)) + ((-18.0f + 12.0f * B + 6.0f * C) * tt) + (6.0f - 2.0f * B)); + + return (t / 6.0f); + } + else if (t < 2.0f) + { + t = (((-1.0f * B - 6.0f * C) * (t * tt)) + ((6.0f * B + 30.0f * C) * tt) + ((-12.0f * B - 48.0f * C) * t) + (8.0f * B + 24.0f * C)); + + return (t / 6.0f); + } + + return (0.0f); + } + +#define MITCHELL_SUPPORT (2.0f) + static float mitchell_filter(float t) + { + return mitchell(t, 1.0f / 3.0f, 1.0f / 3.0f); + } + +#define CATMULL_ROM_SUPPORT (2.0f) + static float catmull_rom_filter(float t) + { + return mitchell(t, 0.0f, .5f); + } + + static double sinc(double x) + { + x = (x * M_PI); + + if ((x < 0.01f) && (x > -0.01f)) + return 1.0f + x * x * (-1.0f / 6.0f + x * x * 1.0f / 120.0f); + + return sin(x) / x; + } + + static float clean(double t) + { + const float EPSILON = .0000125f; + if (fabs(t) < EPSILON) + return 0.0f; + return (float)t; + } + + //static double blackman_window(double x) + //{ + // return .42f + .50f * cos(M_PI*x) + .08f * cos(2.0f*M_PI*x); + //} + + static double blackman_exact_window(double x) + { + return 0.42659071f + 0.49656062f * cos(M_PI * x) + 0.07684867f * cos(2.0f * M_PI * x); + } + +#define BLACKMAN_SUPPORT (3.0f) + static float blackman_filter(float t) + { + if (t < 0.0f) + t = -t; + + if (t < 3.0f) + //return clean(sinc(t) * blackman_window(t / 3.0f)); + return clean(sinc(t) * blackman_exact_window(t / 3.0f)); + else + return (0.0f); + } + +#define GAUSSIAN_SUPPORT (1.25f) + static float gaussian_filter(float t) // with blackman window + { + if (t < 0) + t = -t; + if (t < GAUSSIAN_SUPPORT) + return clean(exp(-2.0f * t * t) * sqrt(2.0f / M_PI) * blackman_exact_window(t / GAUSSIAN_SUPPORT)); + else + return 0.0f; + } + + // Windowed sinc -- see "Jimm Blinn's Corner: Dirty Pixels" pg. 26. +#define LANCZOS3_SUPPORT (3.0f) + static float lanczos3_filter(float t) + { + if (t < 0.0f) + t = -t; + + if (t < 3.0f) + return clean(sinc(t) * sinc(t / 3.0f)); + else + return (0.0f); + } + +#define LANCZOS4_SUPPORT (4.0f) + static float lanczos4_filter(float t) + { + if (t < 0.0f) + t = -t; + + if (t < 4.0f) + return clean(sinc(t) * sinc(t / 4.0f)); + else + return (0.0f); + } + +#define LANCZOS6_SUPPORT (6.0f) + static float lanczos6_filter(float t) + { + if (t < 0.0f) + t = -t; + + if (t < 6.0f) + return clean(sinc(t) * sinc(t / 6.0f)); + else + return (0.0f); + } + +#define LANCZOS12_SUPPORT (12.0f) + static float lanczos12_filter(float t) + { + if (t < 0.0f) + t = -t; + + if (t < 12.0f) + return clean(sinc(t) * sinc(t / 12.0f)); + else + return (0.0f); + } + + static double bessel0(double x) + { + const double EPSILON_RATIO = 1E-16; + double xh, sum, pow, ds; + int k; + + xh = 0.5 * x; + sum = 1.0; + pow = 1.0; + k = 0; + ds = 1.0; + while (ds > sum * EPSILON_RATIO) // FIXME: Shouldn't this stop after X iterations for max. safety? + { + ++k; + pow = pow * (xh / k); + ds = pow * pow; + sum = sum + ds; + } + + return sum; + } + + //static const float KAISER_ALPHA = 4.0; + static double kaiser(double alpha, double half_width, double x) + { + const double ratio = (x / half_width); + return bessel0(alpha * sqrt(1 - ratio * ratio)) / bessel0(alpha); + } + +#define KAISER_SUPPORT 3 + static float kaiser_filter(float t) + { + if (t < 0.0f) + t = -t; + + if (t < KAISER_SUPPORT) + { + // db atten + const float att = 40.0f; + const float alpha = (float)(exp(log((double)0.58417 * (att - 20.96)) * 0.4) + 0.07886 * (att - 20.96)); + //const float alpha = KAISER_ALPHA; + return (float)clean(sinc(t) * kaiser(alpha, KAISER_SUPPORT, t)); + } + + return 0.0f; + } + + const resample_filter g_resample_filters[] = + { + { "box", box_filter, BOX_FILTER_SUPPORT }, + { "tent", tent_filter, TENT_FILTER_SUPPORT }, + { "bell", bell_filter, BELL_SUPPORT }, + { "b-spline", B_spline_filter, B_SPLINE_SUPPORT }, + { "mitchell", mitchell_filter, MITCHELL_SUPPORT }, + { "blackman", blackman_filter, BLACKMAN_SUPPORT }, + { "lanczos3", lanczos3_filter, LANCZOS3_SUPPORT }, + { "lanczos4", lanczos4_filter, LANCZOS4_SUPPORT }, + { "lanczos6", lanczos6_filter, LANCZOS6_SUPPORT }, + { "lanczos12", lanczos12_filter, LANCZOS12_SUPPORT }, + { "kaiser", kaiser_filter, KAISER_SUPPORT }, + { "gaussian", gaussian_filter, GAUSSIAN_SUPPORT }, + { "catmullrom", catmull_rom_filter, CATMULL_ROM_SUPPORT }, + { "quadratic_interp", quadratic_interp_filter, QUADRATIC_SUPPORT }, + { "quadratic_approx", quadratic_approx_filter, QUADRATIC_SUPPORT }, + { "quadratic_mix", quadratic_mix_filter, QUADRATIC_SUPPORT }, + }; + + const int g_num_resample_filters = BASISU_ARRAY_SIZE(g_resample_filters); + + int find_resample_filter(const char *pName) + { + for (int i = 0; i < g_num_resample_filters; i++) + if (strcmp(pName, g_resample_filters[i].name) == 0) + return i; + return -1; + } +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_resampler.cpp b/ktx/external/basisu/encoder/basisu_resampler.cpp new file mode 100644 index 0000000..f4cedf0 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_resampler.cpp @@ -0,0 +1,844 @@ +// basisu_resampler.cpp +// Copyright (C) 2019 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_resampler.h" +#include "basisu_resampler_filters.h" + +#define RESAMPLER_DEBUG 0 + +namespace basisu +{ + static inline int resampler_range_check(int v, int h) + { + BASISU_NOTE_UNUSED(h); + assert((v >= 0) && (v < h)); + return v; + } + + // Float to int cast with truncation. + static inline int cast_to_int(Resample_Real i) + { + return (int)i; + } + + // Ensure that the contributing source sample is within bounds. If not, reflect, clamp, or wrap. + int Resampler::reflect(const int j, const int src_x, const Boundary_Op boundary_op) + { + int n; + + if (j < 0) + { + if (boundary_op == BOUNDARY_REFLECT) + { + n = -j; + + if (n >= src_x) + n = src_x - 1; + } + else if (boundary_op == BOUNDARY_WRAP) + n = posmod(j, src_x); + else + n = 0; + } + else if (j >= src_x) + { + if (boundary_op == BOUNDARY_REFLECT) + { + n = (src_x - j) + (src_x - 1); + + if (n < 0) + n = 0; + } + else if (boundary_op == BOUNDARY_WRAP) + n = posmod(j, src_x); + else + n = src_x - 1; + } + else + n = j; + + return n; + } + + // The make_clist() method generates, for all destination samples, + // the list of all source samples with non-zero weighted contributions. + Resampler::Contrib_List * Resampler::make_clist( + int src_x, int dst_x, Boundary_Op boundary_op, + Resample_Real(*Pfilter)(Resample_Real), + Resample_Real filter_support, + Resample_Real filter_scale, + Resample_Real src_ofs) + { + struct Contrib_Bounds + { + // The center of the range in DISCRETE coordinates (pixel center = 0.0f). + Resample_Real center; + int left, right; + }; + + int i, j, k, n, left, right; + Resample_Real total_weight; + Resample_Real xscale, center, half_width, weight; + Contrib_List* Pcontrib; + Contrib* Pcpool; + Contrib* Pcpool_next; + Contrib_Bounds* Pcontrib_bounds; + + if ((Pcontrib = (Contrib_List*)calloc(dst_x, sizeof(Contrib_List))) == NULL) + return NULL; + + Pcontrib_bounds = (Contrib_Bounds*)calloc(dst_x, sizeof(Contrib_Bounds)); + if (!Pcontrib_bounds) + { + free(Pcontrib); + return (NULL); + } + + const Resample_Real oo_filter_scale = 1.0f / filter_scale; + + const Resample_Real NUDGE = 0.5f; + xscale = dst_x / (Resample_Real)src_x; + + if (xscale < 1.0f) + { + int total; + (void)total; + + // Handle case when there are fewer destination samples than source samples (downsampling/minification). + + // stretched half width of filter + half_width = (filter_support / xscale) * filter_scale; + + // Find the range of source sample(s) that will contribute to each destination sample. + + for (i = 0, n = 0; i < dst_x; i++) + { + // Convert from discrete to continuous coordinates, scale, then convert back to discrete. + center = ((Resample_Real)i + NUDGE) / xscale; + center -= NUDGE; + center += src_ofs; + + left = cast_to_int((Resample_Real)floor(center - half_width)); + right = cast_to_int((Resample_Real)ceil(center + half_width)); + + Pcontrib_bounds[i].center = center; + Pcontrib_bounds[i].left = left; + Pcontrib_bounds[i].right = right; + + n += (right - left + 1); + } + + // Allocate memory for contributors. + + if ((n == 0) || ((Pcpool = (Contrib*)calloc(n, sizeof(Contrib))) == NULL)) + { + free(Pcontrib); + free(Pcontrib_bounds); + return NULL; + } + total = n; + + Pcpool_next = Pcpool; + + // Create the list of source samples which contribute to each destination sample. + + for (i = 0; i < dst_x; i++) + { + int max_k = -1; + Resample_Real max_w = -1e+20f; + + center = Pcontrib_bounds[i].center; + left = Pcontrib_bounds[i].left; + right = Pcontrib_bounds[i].right; + + Pcontrib[i].n = 0; + Pcontrib[i].p = Pcpool_next; + Pcpool_next += (right - left + 1); + assert((Pcpool_next - Pcpool) <= total); + + total_weight = 0; + + for (j = left; j <= right; j++) + total_weight += (*Pfilter)((center - (Resample_Real)j) * xscale * oo_filter_scale); + const Resample_Real norm = static_cast(1.0f / total_weight); + + total_weight = 0; + +#if RESAMPLER_DEBUG + printf("%i: ", i); +#endif + + for (j = left; j <= right; j++) + { + weight = (*Pfilter)((center - (Resample_Real)j) * xscale * oo_filter_scale) * norm; + if (weight == 0.0f) + continue; + + n = reflect(j, src_x, boundary_op); + +#if RESAMPLER_DEBUG + printf("%i(%f), ", n, weight); +#endif + + // Increment the number of source samples which contribute to the current destination sample. + + k = Pcontrib[i].n++; + + Pcontrib[i].p[k].pixel = (unsigned short)n; /* store src sample number */ + Pcontrib[i].p[k].weight = weight; /* store src sample weight */ + + total_weight += weight; /* total weight of all contributors */ + + if (weight > max_w) + { + max_w = weight; + max_k = k; + } + } + +#if RESAMPLER_DEBUG + printf("\n\n"); +#endif + + //assert(Pcontrib[i].n); + //assert(max_k != -1); + if ((max_k == -1) || (Pcontrib[i].n == 0)) + { + free(Pcpool); + free(Pcontrib); + free(Pcontrib_bounds); + return NULL; + } + + if (total_weight != 1.0f) + Pcontrib[i].p[max_k].weight += 1.0f - total_weight; + } + } + else + { + // Handle case when there are more destination samples than source samples (upsampling). + + half_width = filter_support * filter_scale; + + // Find the source sample(s) that contribute to each destination sample. + + for (i = 0, n = 0; i < dst_x; i++) + { + // Convert from discrete to continuous coordinates, scale, then convert back to discrete. + center = ((Resample_Real)i + NUDGE) / xscale; + center -= NUDGE; + center += src_ofs; + + left = cast_to_int((Resample_Real)floor(center - half_width)); + right = cast_to_int((Resample_Real)ceil(center + half_width)); + + Pcontrib_bounds[i].center = center; + Pcontrib_bounds[i].left = left; + Pcontrib_bounds[i].right = right; + + n += (right - left + 1); + } + + /* Allocate memory for contributors. */ + + int total = n; + if ((total == 0) || ((Pcpool = (Contrib*)calloc(total, sizeof(Contrib))) == NULL)) + { + free(Pcontrib); + free(Pcontrib_bounds); + return NULL; + } + + Pcpool_next = Pcpool; + + // Create the list of source samples which contribute to each destination sample. + + for (i = 0; i < dst_x; i++) + { + int max_k = -1; + Resample_Real max_w = -1e+20f; + + center = Pcontrib_bounds[i].center; + left = Pcontrib_bounds[i].left; + right = Pcontrib_bounds[i].right; + + Pcontrib[i].n = 0; + Pcontrib[i].p = Pcpool_next; + Pcpool_next += (right - left + 1); + assert((Pcpool_next - Pcpool) <= total); + + total_weight = 0; + for (j = left; j <= right; j++) + total_weight += (*Pfilter)((center - (Resample_Real)j) * oo_filter_scale); + + const Resample_Real norm = static_cast(1.0f / total_weight); + + total_weight = 0; + +#if RESAMPLER_DEBUG + printf("%i: ", i); +#endif + + for (j = left; j <= right; j++) + { + weight = (*Pfilter)((center - (Resample_Real)j) * oo_filter_scale) * norm; + if (weight == 0.0f) + continue; + + n = reflect(j, src_x, boundary_op); + +#if RESAMPLER_DEBUG + printf("%i(%f), ", n, weight); +#endif + + // Increment the number of source samples which contribute to the current destination sample. + + k = Pcontrib[i].n++; + + Pcontrib[i].p[k].pixel = (unsigned short)n; /* store src sample number */ + Pcontrib[i].p[k].weight = weight; /* store src sample weight */ + + total_weight += weight; /* total weight of all contributors */ + + if (weight > max_w) + { + max_w = weight; + max_k = k; + } + } + +#if RESAMPLER_DEBUG + printf("\n\n"); +#endif + + //assert(Pcontrib[i].n); + //assert(max_k != -1); + + if ((max_k == -1) || (Pcontrib[i].n == 0)) + { + free(Pcpool); + free(Pcontrib); + free(Pcontrib_bounds); + return NULL; + } + + if (total_weight != 1.0f) + Pcontrib[i].p[max_k].weight += 1.0f - total_weight; + } + } + +#if RESAMPLER_DEBUG + printf("*******\n"); +#endif + + free(Pcontrib_bounds); + + return Pcontrib; + } + + void Resampler::resample_x(Sample * Pdst, const Sample * Psrc) + { + assert(Pdst); + assert(Psrc); + + int i, j; + Sample total; + Contrib_List* Pclist = m_Pclist_x; + Contrib* p; + + for (i = m_resample_dst_x; i > 0; i--, Pclist++) + { +#if BASISU_RESAMPLER_DEBUG_OPS + total_ops += Pclist->n; +#endif + + for (j = Pclist->n, p = Pclist->p, total = 0; j > 0; j--, p++) + total += Psrc[p->pixel] * p->weight; + + *Pdst++ = total; + } + } + + void Resampler::scale_y_mov(Sample * Ptmp, const Sample * Psrc, Resample_Real weight, int dst_x) + { + int i; + +#if BASISU_RESAMPLER_DEBUG_OPS + total_ops += dst_x; +#endif + + // Not += because temp buf wasn't cleared. + for (i = dst_x; i > 0; i--) + * Ptmp++ = *Psrc++ * weight; + } + + void Resampler::scale_y_add(Sample * Ptmp, const Sample * Psrc, Resample_Real weight, int dst_x) + { +#if BASISU_RESAMPLER_DEBUG_OPS + total_ops += dst_x; +#endif + + for (int i = dst_x; i > 0; i--) + (*Ptmp++) += *Psrc++ * weight; + } + + void Resampler::clamp(Sample * Pdst, int n) + { + while (n > 0) + { + Sample x = *Pdst; + *Pdst++ = clamp_sample(x); + n--; + } + } + + void Resampler::resample_y(Sample * Pdst) + { + int i, j; + Sample* Psrc; + Contrib_List* Pclist = &m_Pclist_y[m_cur_dst_y]; + + Sample* Ptmp = m_delay_x_resample ? m_Ptmp_buf : Pdst; + assert(Ptmp); + + /* Process each contributor. */ + + for (i = 0; i < Pclist->n; i++) + { + // locate the contributor's location in the scan buffer -- the contributor must always be found! + for (j = 0; j < MAX_SCAN_BUF_SIZE; j++) + if (m_Pscan_buf->scan_buf_y[j] == Pclist->p[i].pixel) + break; + + assert(j < MAX_SCAN_BUF_SIZE); + + Psrc = m_Pscan_buf->scan_buf_l[j]; + + if (!i) + scale_y_mov(Ptmp, Psrc, Pclist->p[i].weight, m_intermediate_x); + else + scale_y_add(Ptmp, Psrc, Pclist->p[i].weight, m_intermediate_x); + + /* If this source line doesn't contribute to any + * more destination lines then mark the scanline buffer slot + * which holds this source line as free. + * (The max. number of slots used depends on the Y + * axis sampling factor and the scaled filter width.) + */ + + if (--m_Psrc_y_count[resampler_range_check(Pclist->p[i].pixel, m_resample_src_y)] == 0) + { + m_Psrc_y_flag[resampler_range_check(Pclist->p[i].pixel, m_resample_src_y)] = false; + m_Pscan_buf->scan_buf_y[j] = -1; + } + } + + /* Now generate the destination line */ + + if (m_delay_x_resample) // Was X resampling delayed until after Y resampling? + { + assert(Pdst != Ptmp); + resample_x(Pdst, Ptmp); + } + else + { + assert(Pdst == Ptmp); + } + + if (m_lo < m_hi) + clamp(Pdst, m_resample_dst_x); + } + + bool Resampler::put_line(const Sample * Psrc) + { + int i; + + if (m_cur_src_y >= m_resample_src_y) + return false; + + /* Does this source line contribute + * to any destination line? if not, + * exit now. + */ + + if (!m_Psrc_y_count[resampler_range_check(m_cur_src_y, m_resample_src_y)]) + { + m_cur_src_y++; + return true; + } + + /* Find an empty slot in the scanline buffer. (FIXME: Perf. is terrible here with extreme scaling ratios.) */ + + for (i = 0; i < MAX_SCAN_BUF_SIZE; i++) + if (m_Pscan_buf->scan_buf_y[i] == -1) + break; + + /* If the buffer is full, exit with an error. */ + + if (i == MAX_SCAN_BUF_SIZE) + { + m_status = STATUS_SCAN_BUFFER_FULL; + return false; + } + + m_Psrc_y_flag[resampler_range_check(m_cur_src_y, m_resample_src_y)] = true; + m_Pscan_buf->scan_buf_y[i] = m_cur_src_y; + + /* Does this slot have any memory allocated to it? */ + + if (!m_Pscan_buf->scan_buf_l[i]) + { + if ((m_Pscan_buf->scan_buf_l[i] = (Sample*)malloc(m_intermediate_x * sizeof(Sample))) == NULL) + { + m_status = STATUS_OUT_OF_MEMORY; + return false; + } + } + + // Resampling on the X axis first? + if (m_delay_x_resample) + { + assert(m_intermediate_x == m_resample_src_x); + + // Y-X resampling order + memcpy(m_Pscan_buf->scan_buf_l[i], Psrc, m_intermediate_x * sizeof(Sample)); + } + else + { + assert(m_intermediate_x == m_resample_dst_x); + + // X-Y resampling order + resample_x(m_Pscan_buf->scan_buf_l[i], Psrc); + } + + m_cur_src_y++; + + return true; + } + + const Resampler::Sample* Resampler::get_line() + { + int i; + + /* If all the destination lines have been + * generated, then always return NULL. + */ + + if (m_cur_dst_y == m_resample_dst_y) + return NULL; + + /* Check to see if all the required + * contributors are present, if not, + * return NULL. + */ + + for (i = 0; i < m_Pclist_y[m_cur_dst_y].n; i++) + if (!m_Psrc_y_flag[resampler_range_check(m_Pclist_y[m_cur_dst_y].p[i].pixel, m_resample_src_y)]) + return NULL; + + resample_y(m_Pdst_buf); + + m_cur_dst_y++; + + return m_Pdst_buf; + } + + Resampler::~Resampler() + { + int i; + +#if BASISU_RESAMPLER_DEBUG_OPS + printf("actual ops: %i\n", total_ops); +#endif + + free(m_Pdst_buf); + m_Pdst_buf = NULL; + + if (m_Ptmp_buf) + { + free(m_Ptmp_buf); + m_Ptmp_buf = NULL; + } + + /* Don't deallocate a contibutor list + * if the user passed us one of their own. + */ + + if ((m_Pclist_x) && (!m_clist_x_forced)) + { + free(m_Pclist_x->p); + free(m_Pclist_x); + m_Pclist_x = NULL; + } + + if ((m_Pclist_y) && (!m_clist_y_forced)) + { + free(m_Pclist_y->p); + free(m_Pclist_y); + m_Pclist_y = NULL; + } + + free(m_Psrc_y_count); + m_Psrc_y_count = NULL; + + free(m_Psrc_y_flag); + m_Psrc_y_flag = NULL; + + if (m_Pscan_buf) + { + for (i = 0; i < MAX_SCAN_BUF_SIZE; i++) + free(m_Pscan_buf->scan_buf_l[i]); + + free(m_Pscan_buf); + m_Pscan_buf = NULL; + } + } + + void Resampler::restart() + { + if (STATUS_OKAY != m_status) + return; + + m_cur_src_y = m_cur_dst_y = 0; + + int i, j; + for (i = 0; i < m_resample_src_y; i++) + { + m_Psrc_y_count[i] = 0; + m_Psrc_y_flag[i] = false; + } + + for (i = 0; i < m_resample_dst_y; i++) + { + for (j = 0; j < m_Pclist_y[i].n; j++) + m_Psrc_y_count[resampler_range_check(m_Pclist_y[i].p[j].pixel, m_resample_src_y)]++; + } + + for (i = 0; i < MAX_SCAN_BUF_SIZE; i++) + { + m_Pscan_buf->scan_buf_y[i] = -1; + + free(m_Pscan_buf->scan_buf_l[i]); + m_Pscan_buf->scan_buf_l[i] = NULL; + } + } + + Resampler::Resampler(int src_x, int src_y, + int dst_x, int dst_y, + Boundary_Op boundary_op, + Resample_Real sample_low, Resample_Real sample_high, + const char* Pfilter_name, + Contrib_List * Pclist_x, + Contrib_List * Pclist_y, + Resample_Real filter_x_scale, + Resample_Real filter_y_scale, + Resample_Real src_x_ofs, + Resample_Real src_y_ofs) + { + int i, j; + Resample_Real support, (*func)(Resample_Real); + + assert(src_x > 0); + assert(src_y > 0); + assert(dst_x > 0); + assert(dst_y > 0); + +#if BASISU_RESAMPLER_DEBUG_OPS + total_ops = 0; +#endif + + m_lo = sample_low; + m_hi = sample_high; + + m_delay_x_resample = false; + m_intermediate_x = 0; + m_Pdst_buf = NULL; + m_Ptmp_buf = NULL; + m_clist_x_forced = false; + m_Pclist_x = NULL; + m_clist_y_forced = false; + m_Pclist_y = NULL; + m_Psrc_y_count = NULL; + m_Psrc_y_flag = NULL; + m_Pscan_buf = NULL; + m_status = STATUS_OKAY; + + m_resample_src_x = src_x; + m_resample_src_y = src_y; + m_resample_dst_x = dst_x; + m_resample_dst_y = dst_y; + + m_boundary_op = boundary_op; + + if ((m_Pdst_buf = (Sample*)malloc(m_resample_dst_x * sizeof(Sample))) == NULL) + { + m_status = STATUS_OUT_OF_MEMORY; + return; + } + + // Find the specified filter. + + if (Pfilter_name == NULL) + Pfilter_name = BASISU_RESAMPLER_DEFAULT_FILTER; + + for (i = 0; i < g_num_resample_filters; i++) + if (strcmp(Pfilter_name, g_resample_filters[i].name) == 0) + break; + + if (i == g_num_resample_filters) + { + m_status = STATUS_BAD_FILTER_NAME; + return; + } + + func = g_resample_filters[i].func; + support = g_resample_filters[i].support; + + /* Create contributor lists, unless the user supplied custom lists. */ + + if (!Pclist_x) + { + m_Pclist_x = make_clist(m_resample_src_x, m_resample_dst_x, m_boundary_op, func, support, filter_x_scale, src_x_ofs); + if (!m_Pclist_x) + { + m_status = STATUS_OUT_OF_MEMORY; + return; + } + } + else + { + m_Pclist_x = Pclist_x; + m_clist_x_forced = true; + } + + if (!Pclist_y) + { + m_Pclist_y = make_clist(m_resample_src_y, m_resample_dst_y, m_boundary_op, func, support, filter_y_scale, src_y_ofs); + if (!m_Pclist_y) + { + m_status = STATUS_OUT_OF_MEMORY; + return; + } + } + else + { + m_Pclist_y = Pclist_y; + m_clist_y_forced = true; + } + + if ((m_Psrc_y_count = (int*)calloc(m_resample_src_y, sizeof(int))) == NULL) + { + m_status = STATUS_OUT_OF_MEMORY; + return; + } + + if ((m_Psrc_y_flag = (unsigned char*)calloc(m_resample_src_y, sizeof(unsigned char))) == NULL) + { + m_status = STATUS_OUT_OF_MEMORY; + return; + } + + // Count how many times each source line contributes to a destination line. + + for (i = 0; i < m_resample_dst_y; i++) + for (j = 0; j < m_Pclist_y[i].n; j++) + m_Psrc_y_count[resampler_range_check(m_Pclist_y[i].p[j].pixel, m_resample_src_y)]++; + + if ((m_Pscan_buf = (Scan_Buf*)malloc(sizeof(Scan_Buf))) == NULL) + { + m_status = STATUS_OUT_OF_MEMORY; + return; + } + + for (i = 0; i < MAX_SCAN_BUF_SIZE; i++) + { + m_Pscan_buf->scan_buf_y[i] = -1; + m_Pscan_buf->scan_buf_l[i] = NULL; + } + + m_cur_src_y = m_cur_dst_y = 0; + { + // Determine which axis to resample first by comparing the number of multiplies required + // for each possibility. + int x_ops = count_ops(m_Pclist_x, m_resample_dst_x); + int y_ops = count_ops(m_Pclist_y, m_resample_dst_y); + + // Hack 10/2000: Weight Y axis ops a little more than X axis ops. + // (Y axis ops use more cache resources.) + int xy_ops = x_ops * m_resample_src_y + + (4 * y_ops * m_resample_dst_x) / 3; + + int yx_ops = (4 * y_ops * m_resample_src_x) / 3 + + x_ops * m_resample_dst_y; + +#if BASISU_RESAMPLER_DEBUG_OPS + printf("src: %i %i\n", m_resample_src_x, m_resample_src_y); + printf("dst: %i %i\n", m_resample_dst_x, m_resample_dst_y); + printf("x_ops: %i\n", x_ops); + printf("y_ops: %i\n", y_ops); + printf("xy_ops: %i\n", xy_ops); + printf("yx_ops: %i\n", yx_ops); +#endif + + // Now check which resample order is better. In case of a tie, choose the order + // which buffers the least amount of data. + if ((xy_ops > yx_ops) || + ((xy_ops == yx_ops) && (m_resample_src_x < m_resample_dst_x))) + { + m_delay_x_resample = true; + m_intermediate_x = m_resample_src_x; + } + else + { + m_delay_x_resample = false; + m_intermediate_x = m_resample_dst_x; + } +#if BASISU_RESAMPLER_DEBUG_OPS + printf("delaying: %i\n", m_delay_x_resample); +#endif + } + + if (m_delay_x_resample) + { + if ((m_Ptmp_buf = (Sample*)malloc(m_intermediate_x * sizeof(Sample))) == NULL) + { + m_status = STATUS_OUT_OF_MEMORY; + return; + } + } + } + + void Resampler::get_clists(Contrib_List * *ptr_clist_x, Contrib_List * *ptr_clist_y) + { + if (ptr_clist_x) + * ptr_clist_x = m_Pclist_x; + + if (ptr_clist_y) + * ptr_clist_y = m_Pclist_y; + } + + int Resampler::get_filter_num() + { + return g_num_resample_filters; + } + + const char* Resampler::get_filter_name(int filter_num) + { + if ((filter_num < 0) || (filter_num >= g_num_resample_filters)) + return NULL; + else + return g_resample_filters[filter_num].name; + } + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_resampler.h b/ktx/external/basisu/encoder/basisu_resampler.h new file mode 100644 index 0000000..dc0978c --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_resampler.h @@ -0,0 +1,196 @@ +// basisu_resampler.h +// Copyright (C) 2019 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once +#include "../transcoder/basisu.h" + +#define BASISU_RESAMPLER_DEBUG_OPS (0) +#define BASISU_RESAMPLER_DEFAULT_FILTER "lanczos4" +#define BASISU_RESAMPLER_MAX_DIMENSION (16384) + +namespace basisu +{ + // float or double + typedef float Resample_Real; + + class Resampler + { + public: + typedef Resample_Real Sample; + + struct Contrib + { + Resample_Real weight; + uint16_t pixel; + }; + + struct Contrib_List + { + uint16_t n; + Contrib *p; + }; + + enum Boundary_Op + { + BOUNDARY_WRAP = 0, + BOUNDARY_REFLECT = 1, + BOUNDARY_CLAMP = 2 + }; + + enum Status + { + STATUS_OKAY = 0, + STATUS_OUT_OF_MEMORY = 1, + STATUS_BAD_FILTER_NAME = 2, + STATUS_SCAN_BUFFER_FULL = 3 + }; + + // src_x/src_y - Input dimensions + // dst_x/dst_y - Output dimensions + // boundary_op - How to sample pixels near the image boundaries + // sample_low/sample_high - Clamp output samples to specified range, or disable clamping if sample_low >= sample_high + // Pclist_x/Pclist_y - Optional pointers to contributor lists from another instance of a Resampler + // src_x_ofs/src_y_ofs - Offset input image by specified amount (fractional values okay) + Resampler( + int src_x, int src_y, + int dst_x, int dst_y, + Boundary_Op boundary_op = BOUNDARY_CLAMP, + Resample_Real sample_low = 0.0f, Resample_Real sample_high = 0.0f, + const char *Pfilter_name = BASISU_RESAMPLER_DEFAULT_FILTER, + Contrib_List *Pclist_x = NULL, + Contrib_List *Pclist_y = NULL, + Resample_Real filter_x_scale = 1.0f, + Resample_Real filter_y_scale = 1.0f, + Resample_Real src_x_ofs = 0.0f, + Resample_Real src_y_ofs = 0.0f); + + ~Resampler(); + + // Reinits resampler so it can handle another frame. + void restart(); + + // false on out of memory. + bool put_line(const Sample *Psrc); + + // NULL if no scanlines are currently available (give the resampler more scanlines!) + const Sample *get_line(); + + Status status() const + { + return m_status; + } + + // Returned contributor lists can be shared with another Resampler. + void get_clists(Contrib_List **ptr_clist_x, Contrib_List **ptr_clist_y); + Contrib_List *get_clist_x() const + { + return m_Pclist_x; + } + Contrib_List *get_clist_y() const + { + return m_Pclist_y; + } + + // Filter accessors. + static int get_filter_num(); + static const char *get_filter_name(int filter_num); + + static Contrib_List *make_clist( + int src_x, int dst_x, Boundary_Op boundary_op, + Resample_Real(*Pfilter)(Resample_Real), + Resample_Real filter_support, + Resample_Real filter_scale, + Resample_Real src_ofs); + + private: + Resampler(); + Resampler(const Resampler &o); + Resampler &operator=(const Resampler &o); + +#ifdef BASISU_RESAMPLER_DEBUG_OPS + int total_ops; +#endif + + int m_intermediate_x; + + int m_resample_src_x; + int m_resample_src_y; + int m_resample_dst_x; + int m_resample_dst_y; + + Boundary_Op m_boundary_op; + + Sample *m_Pdst_buf; + Sample *m_Ptmp_buf; + + Contrib_List *m_Pclist_x; + Contrib_List *m_Pclist_y; + + bool m_clist_x_forced; + bool m_clist_y_forced; + + bool m_delay_x_resample; + + int *m_Psrc_y_count; + uint8_t *m_Psrc_y_flag; + + // The maximum number of scanlines that can be buffered at one time. + enum + { + MAX_SCAN_BUF_SIZE = BASISU_RESAMPLER_MAX_DIMENSION + }; + + struct Scan_Buf + { + int scan_buf_y[MAX_SCAN_BUF_SIZE]; + Sample *scan_buf_l[MAX_SCAN_BUF_SIZE]; + }; + + Scan_Buf *m_Pscan_buf; + + int m_cur_src_y; + int m_cur_dst_y; + + Status m_status; + + void resample_x(Sample *Pdst, const Sample *Psrc); + void scale_y_mov(Sample *Ptmp, const Sample *Psrc, Resample_Real weight, int dst_x); + void scale_y_add(Sample *Ptmp, const Sample *Psrc, Resample_Real weight, int dst_x); + void clamp(Sample *Pdst, int n); + void resample_y(Sample *Pdst); + + static int reflect(const int j, const int src_x, const Boundary_Op boundary_op); + + inline int count_ops(Contrib_List *Pclist, int k) + { + int i, t = 0; + for (i = 0; i < k; i++) + t += Pclist[i].n; + return (t); + } + + Resample_Real m_lo; + Resample_Real m_hi; + + inline Resample_Real clamp_sample(Resample_Real f) const + { + if (f < m_lo) + f = m_lo; + else if (f > m_hi) + f = m_hi; + return f; + } + }; + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_resampler_filters.h b/ktx/external/basisu/encoder/basisu_resampler_filters.h new file mode 100644 index 0000000..0ebb51c --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_resampler_filters.h @@ -0,0 +1,35 @@ +// basisu_resampler_filters.h +// Copyright (C) 2019 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once + +#include "../transcoder/basisu.h" + +namespace basisu +{ + typedef float (*resample_filter_func)(float t); + + struct resample_filter + { + const char *name; + resample_filter_func func; + float support; + }; + + extern const resample_filter g_resample_filters[]; + extern const int g_num_resample_filters; + + int find_resample_filter(const char *pName); + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_ssim.cpp b/ktx/external/basisu/encoder/basisu_ssim.cpp new file mode 100644 index 0000000..cceb400 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_ssim.cpp @@ -0,0 +1,408 @@ +// basisu_ssim.cpp +// Copyright (C) 2019 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_ssim.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +namespace basisu +{ + float gauss(int x, int y, float sigma_sqr) + { + float pow = expf(-((x * x + y * y) / (2.0f * sigma_sqr))); + float g = (1.0f / (sqrtf((float)(2.0f * M_PI * sigma_sqr)))) * pow; + return g; + } + + // size_x/y should be odd + void compute_gaussian_kernel(float *pDst, int size_x, int size_y, float sigma_sqr, uint32_t flags) + { + assert(size_x & size_y & 1); + + if (!(size_x | size_y)) + return; + + int mid_x = size_x / 2; + int mid_y = size_y / 2; + + double sum = 0; + for (int x = 0; x < size_x; x++) + { + for (int y = 0; y < size_y; y++) + { + float g; + if ((x > mid_x) && (y < mid_y)) + g = pDst[(size_x - x - 1) + y * size_x]; + else if ((x < mid_x) && (y > mid_y)) + g = pDst[x + (size_y - y - 1) * size_x]; + else if ((x > mid_x) && (y > mid_y)) + g = pDst[(size_x - x - 1) + (size_y - y - 1) * size_x]; + else + g = gauss(x - mid_x, y - mid_y, sigma_sqr); + + pDst[x + y * size_x] = g; + sum += g; + } + } + + if (flags & cComputeGaussianFlagNormalizeCenterToOne) + { + sum = pDst[mid_x + mid_y * size_x]; + } + + if (flags & (cComputeGaussianFlagNormalizeCenterToOne | cComputeGaussianFlagNormalize)) + { + double one_over_sum = 1.0f / sum; + for (int i = 0; i < size_x * size_y; i++) + pDst[i] = static_cast(pDst[i] * one_over_sum); + + if (flags & cComputeGaussianFlagNormalizeCenterToOne) + pDst[mid_x + mid_y * size_x] = 1.0f; + } + + if (flags & cComputeGaussianFlagPrint) + { + printf("{\n"); + for (int y = 0; y < size_y; y++) + { + printf(" "); + for (int x = 0; x < size_x; x++) + { + printf("%f, ", pDst[x + y * size_x]); + } + printf("\n"); + } + printf("}"); + } + } + + void gaussian_filter(imagef &dst, const imagef &orig_img, uint32_t odd_filter_width, float sigma_sqr, bool wrapping, uint32_t width_divisor, uint32_t height_divisor) + { + assert(odd_filter_width && (odd_filter_width & 1)); + odd_filter_width |= 1; + + vector2D kernel(odd_filter_width, odd_filter_width); + compute_gaussian_kernel(kernel.get_ptr(), odd_filter_width, odd_filter_width, sigma_sqr, cComputeGaussianFlagNormalize); + + const int dst_width = orig_img.get_width() / width_divisor; + const int dst_height = orig_img.get_height() / height_divisor; + + const int H = odd_filter_width / 2; + const int L = -H; + + dst.crop(dst_width, dst_height); + +//#pragma omp parallel for + for (int oy = 0; oy < dst_height; oy++) + { + for (int ox = 0; ox < dst_width; ox++) + { + vec4F c(0.0f); + + for (int yd = L; yd <= H; yd++) + { + int y = oy * height_divisor + (height_divisor >> 1) + yd; + + for (int xd = L; xd <= H; xd++) + { + int x = ox * width_divisor + (width_divisor >> 1) + xd; + + const vec4F &p = orig_img.get_clamped_or_wrapped(x, y, wrapping, wrapping); + + float w = kernel(xd + H, yd + H); + c[0] += p[0] * w; + c[1] += p[1] * w; + c[2] += p[2] * w; + c[3] += p[3] * w; + } + } + + dst(ox, oy).set(c[0], c[1], c[2], c[3]); + } + } + } + + void pow_image(const imagef &src, imagef &dst, const vec4F &power) + { + dst.resize(src); + +//#pragma omp parallel for + for (int y = 0; y < (int)dst.get_height(); y++) + { + for (uint32_t x = 0; x < dst.get_width(); x++) + { + const vec4F &p = src(x, y); + + if ((power[0] == 2.0f) && (power[1] == 2.0f) && (power[2] == 2.0f) && (power[3] == 2.0f)) + dst(x, y).set(p[0] * p[0], p[1] * p[1], p[2] * p[2], p[3] * p[3]); + else + dst(x, y).set(powf(p[0], power[0]), powf(p[1], power[1]), powf(p[2], power[2]), powf(p[3], power[3])); + } + } + } + + void mul_image(const imagef &src, imagef &dst, const vec4F &mul) + { + dst.resize(src); + +//#pragma omp parallel for + for (int y = 0; y < (int)dst.get_height(); y++) + { + for (uint32_t x = 0; x < dst.get_width(); x++) + { + const vec4F &p = src(x, y); + dst(x, y).set(p[0] * mul[0], p[1] * mul[1], p[2] * mul[2], p[3] * mul[3]); + } + } + } + + void scale_image(const imagef &src, imagef &dst, const vec4F &scale, const vec4F &shift) + { + dst.resize(src); + +//#pragma omp parallel for + for (int y = 0; y < (int)dst.get_height(); y++) + { + for (uint32_t x = 0; x < dst.get_width(); x++) + { + const vec4F &p = src(x, y); + + vec4F d; + + for (uint32_t c = 0; c < 4; c++) + d[c] = scale[c] * p[c] + shift[c]; + + dst(x, y).set(d[0], d[1], d[2], d[3]); + } + } + } + + void add_weighted_image(const imagef &src1, const vec4F &alpha, const imagef &src2, const vec4F &beta, const vec4F &gamma, imagef &dst) + { + dst.resize(src1); + +//#pragma omp parallel for + for (int y = 0; y < (int)dst.get_height(); y++) + { + for (uint32_t x = 0; x < dst.get_width(); x++) + { + const vec4F &s1 = src1(x, y); + const vec4F &s2 = src2(x, y); + + dst(x, y).set( + s1[0] * alpha[0] + s2[0] * beta[0] + gamma[0], + s1[1] * alpha[1] + s2[1] * beta[1] + gamma[1], + s1[2] * alpha[2] + s2[2] * beta[2] + gamma[2], + s1[3] * alpha[3] + s2[3] * beta[3] + gamma[3]); + } + } + } + + void add_image(const imagef &src1, const imagef &src2, imagef &dst) + { + dst.resize(src1); + +//#pragma omp parallel for + for (int y = 0; y < (int)dst.get_height(); y++) + { + for (uint32_t x = 0; x < dst.get_width(); x++) + { + const vec4F &s1 = src1(x, y); + const vec4F &s2 = src2(x, y); + + dst(x, y).set(s1[0] + s2[0], s1[1] + s2[1], s1[2] + s2[2], s1[3] + s2[3]); + } + } + } + + void adds_image(const imagef &src, const vec4F &value, imagef &dst) + { + dst.resize(src); + +//#pragma omp parallel for + for (int y = 0; y < (int)dst.get_height(); y++) + { + for (uint32_t x = 0; x < dst.get_width(); x++) + { + const vec4F &p = src(x, y); + + dst(x, y).set(p[0] + value[0], p[1] + value[1], p[2] + value[2], p[3] + value[3]); + } + } + } + + void mul_image(const imagef &src1, const imagef &src2, imagef &dst, const vec4F &scale) + { + dst.resize(src1); + +//#pragma omp parallel for + for (int y = 0; y < (int)dst.get_height(); y++) + { + for (uint32_t x = 0; x < dst.get_width(); x++) + { + const vec4F &s1 = src1(x, y); + const vec4F &s2 = src2(x, y); + + vec4F d; + + for (uint32_t c = 0; c < 4; c++) + { + float v1 = s1[c]; + float v2 = s2[c]; + d[c] = v1 * v2 * scale[c]; + } + + dst(x, y) = d; + } + } + } + + void div_image(const imagef &src1, const imagef &src2, imagef &dst, const vec4F &scale) + { + dst.resize(src1); + +//#pragma omp parallel for + for (int y = 0; y < (int)dst.get_height(); y++) + { + for (uint32_t x = 0; x < dst.get_width(); x++) + { + const vec4F &s1 = src1(x, y); + const vec4F &s2 = src2(x, y); + + vec4F d; + + for (uint32_t c = 0; c < 4; c++) + { + float v = s2[c]; + if (v == 0.0f) + d[c] = 0.0f; + else + d[c] = (s1[c] * scale[c]) / v; + } + + dst(x, y) = d; + } + } + } + + vec4F avg_image(const imagef &src) + { + vec4F avg(0.0f); + + for (uint32_t y = 0; y < src.get_height(); y++) + { + for (uint32_t x = 0; x < src.get_width(); x++) + { + const vec4F &s = src(x, y); + + avg += vec4F(s[0], s[1], s[2], s[3]); + } + } + + avg /= static_cast(src.get_total_pixels()); + + return avg; + } + + // Reference: https://ece.uwaterloo.ca/~z70wang/research/ssim/index.html + vec4F compute_ssim(const imagef &a, const imagef &b) + { + imagef axb, a_sq, b_sq, mu1, mu2, mu1_sq, mu2_sq, mu1_mu2, s1_sq, s2_sq, s12, smap, t1, t2, t3; + + const float C1 = 6.50250f, C2 = 58.52250f; + + pow_image(a, a_sq, vec4F(2)); + pow_image(b, b_sq, vec4F(2)); + mul_image(a, b, axb, vec4F(1.0f)); + + gaussian_filter(mu1, a, 11, 1.5f * 1.5f); + gaussian_filter(mu2, b, 11, 1.5f * 1.5f); + + pow_image(mu1, mu1_sq, vec4F(2)); + pow_image(mu2, mu2_sq, vec4F(2)); + mul_image(mu1, mu2, mu1_mu2, vec4F(1.0f)); + + gaussian_filter(s1_sq, a_sq, 11, 1.5f * 1.5f); + add_weighted_image(s1_sq, vec4F(1), mu1_sq, vec4F(-1), vec4F(0), s1_sq); + + gaussian_filter(s2_sq, b_sq, 11, 1.5f * 1.5f); + add_weighted_image(s2_sq, vec4F(1), mu2_sq, vec4F(-1), vec4F(0), s2_sq); + + gaussian_filter(s12, axb, 11, 1.5f * 1.5f); + add_weighted_image(s12, vec4F(1), mu1_mu2, vec4F(-1), vec4F(0), s12); + + scale_image(mu1_mu2, t1, vec4F(2), vec4F(0)); + adds_image(t1, vec4F(C1), t1); + + scale_image(s12, t2, vec4F(2), vec4F(0)); + adds_image(t2, vec4F(C2), t2); + + mul_image(t1, t2, t3, vec4F(1)); + + add_image(mu1_sq, mu2_sq, t1); + adds_image(t1, vec4F(C1), t1); + + add_image(s1_sq, s2_sq, t2); + adds_image(t2, vec4F(C2), t2); + + mul_image(t1, t2, t1, vec4F(1)); + + div_image(t3, t1, smap, vec4F(1)); + + return avg_image(smap); + } + + vec4F compute_ssim(const image &a, const image &b, bool luma, bool luma_601) + { + image ta(a), tb(b); + + if ((ta.get_width() != tb.get_width()) || (ta.get_height() != tb.get_height())) + { + debug_printf("compute_ssim: Cropping input images to equal dimensions\n"); + + const uint32_t w = minimum(a.get_width(), b.get_width()); + const uint32_t h = minimum(a.get_height(), b.get_height()); + ta.crop(w, h); + tb.crop(w, h); + } + + if (!ta.get_width() || !ta.get_height()) + { + assert(0); + return vec4F(0); + } + + if (luma) + { + for (uint32_t y = 0; y < ta.get_height(); y++) + { + for (uint32_t x = 0; x < ta.get_width(); x++) + { + ta(x, y).set(ta(x, y).get_luma(luma_601), ta(x, y).a); + tb(x, y).set(tb(x, y).get_luma(luma_601), tb(x, y).a); + } + } + } + + imagef fta, ftb; + + fta.set(ta); + ftb.set(tb); + + return compute_ssim(fta, ftb); + } + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_ssim.h b/ktx/external/basisu/encoder/basisu_ssim.h new file mode 100644 index 0000000..986ca3b --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_ssim.h @@ -0,0 +1,44 @@ +// basisu_ssim.h +// Copyright (C) 2019 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once +#include "basisu_enc.h" + +namespace basisu +{ + float gauss(int x, int y, float sigma_sqr); + + enum + { + cComputeGaussianFlagNormalize = 1, + cComputeGaussianFlagPrint = 2, + cComputeGaussianFlagNormalizeCenterToOne = 4 + }; + + void compute_gaussian_kernel(float *pDst, int size_x, int size_y, float sigma_sqr, uint32_t flags = 0); + + void scale_image(const imagef &src, imagef &dst, const vec4F &scale, const vec4F &shift); + void add_weighted_image(const imagef &src1, const vec4F &alpha, const imagef &src2, const vec4F &beta, const vec4F &gamma, imagef &dst); + void add_image(const imagef &src1, const imagef &src2, imagef &dst); + void adds_image(const imagef &src, const vec4F &value, imagef &dst); + void mul_image(const imagef &src1, const imagef &src2, imagef &dst, const vec4F &scale); + void div_image(const imagef &src1, const imagef &src2, imagef &dst, const vec4F &scale); + vec4F avg_image(const imagef &src); + + void gaussian_filter(imagef &dst, const imagef &orig_img, uint32_t odd_filter_width, float sigma_sqr, bool wrapping = false, uint32_t width_divisor = 1, uint32_t height_divisor = 1); + + vec4F compute_ssim(const imagef &a, const imagef &b); + vec4F compute_ssim(const image &a, const image &b, bool luma, bool luma_601); + +} // namespace basisu diff --git a/ktx/external/basisu/encoder/basisu_uastc_enc.cpp b/ktx/external/basisu/encoder/basisu_uastc_enc.cpp new file mode 100644 index 0000000..af3b5ce --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_uastc_enc.cpp @@ -0,0 +1,4203 @@ +// basisu_uastc_enc.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#include "basisu_uastc_enc.h" + +#if BASISU_USE_ASTC_DECOMPRESS +#include "basisu_astc_decomp.h" +#endif + +#include "basisu_gpu_texture.h" +#include "basisu_bc7enc.h" + +#ifdef _DEBUG +// When BASISU_VALIDATE_UASTC_ENC is 1, we pack and unpack to/from UASTC and ASTC, then validate that each codec returns the exact same results. This is slower. +#define BASISU_VALIDATE_UASTC_ENC 1 +#endif + +#define BASISU_SUPPORT_FORCE_MODE 0 + +using namespace basist; + +namespace basisu +{ + const uint32_t MAX_ENCODE_RESULTS = 512; + +#if BASISU_VALIDATE_UASTC_ENC + static void validate_func(bool condition, int line) + { + if (!condition) + { + fprintf(stderr, "basisu_uastc_enc: Internal validation failed on line %u!\n", line); + } + } + + #define VALIDATE(c) validate_func(c, __LINE__); +#else + #define VALIDATE(c) +#endif + + enum dxt_constants + { + cDXT1SelectorBits = 2U, cDXT1SelectorValues = 1U << cDXT1SelectorBits, cDXT1SelectorMask = cDXT1SelectorValues - 1U, + cDXT5SelectorBits = 3U, cDXT5SelectorValues = 1U << cDXT5SelectorBits, cDXT5SelectorMask = cDXT5SelectorValues - 1U, + }; + + struct dxt1_block + { + enum { cTotalEndpointBytes = 2, cTotalSelectorBytes = 4 }; + + uint8_t m_low_color[cTotalEndpointBytes]; + uint8_t m_high_color[cTotalEndpointBytes]; + uint8_t m_selectors[cTotalSelectorBytes]; + + inline void clear() { basisu::clear_obj(*this); } + + inline uint32_t get_high_color() const { return m_high_color[0] | (m_high_color[1] << 8U); } + inline uint32_t get_low_color() const { return m_low_color[0] | (m_low_color[1] << 8U); } + inline void set_low_color(uint16_t c) { m_low_color[0] = static_cast(c & 0xFF); m_low_color[1] = static_cast((c >> 8) & 0xFF); } + inline void set_high_color(uint16_t c) { m_high_color[0] = static_cast(c & 0xFF); m_high_color[1] = static_cast((c >> 8) & 0xFF); } + inline uint32_t get_selector(uint32_t x, uint32_t y) const { assert((x < 4U) && (y < 4U)); return (m_selectors[y] >> (x * cDXT1SelectorBits))& cDXT1SelectorMask; } + inline void set_selector(uint32_t x, uint32_t y, uint32_t val) { assert((x < 4U) && (y < 4U) && (val < 4U)); m_selectors[y] &= (~(cDXT1SelectorMask << (x * cDXT1SelectorBits))); m_selectors[y] |= (val << (x * cDXT1SelectorBits)); } + + static uint16_t pack_color(const color_rgba& color, bool scaled, uint32_t bias = 127U) + { + uint32_t r = color.r, g = color.g, b = color.b; + if (scaled) + { + r = (r * 31U + bias) / 255U; + g = (g * 63U + bias) / 255U; + b = (b * 31U + bias) / 255U; + } + return static_cast(basisu::minimum(b, 31U) | (basisu::minimum(g, 63U) << 5U) | (basisu::minimum(r, 31U) << 11U)); + } + + static uint16_t pack_unscaled_color(uint32_t r, uint32_t g, uint32_t b) { return static_cast(b | (g << 5U) | (r << 11U)); } + }; + +#define UASTC_WRITE_MODE_DESCS 0 + + static inline void uastc_write_bits(uint8_t* pBuf, uint32_t& bit_offset, uint64_t code, uint32_t codesize, const char* pDesc) + { + (void)pDesc; + +#if UASTC_WRITE_MODE_DESCS + if (pDesc) + printf("%s: %u %u\n", pDesc, bit_offset, codesize); +#endif + + assert((codesize == 64) || (code < (1ULL << codesize))); + + while (codesize) + { + uint32_t byte_bit_offset = bit_offset & 7; + uint32_t bits_to_write = basisu::minimum(codesize, 8 - byte_bit_offset); + + pBuf[bit_offset >> 3] |= (code << byte_bit_offset); + + code >>= bits_to_write; + codesize -= bits_to_write; + bit_offset += bits_to_write; + } + } + + void pack_uastc(basist::uastc_block& blk, const uastc_encode_results& result, const etc_block& etc1_blk, uint32_t etc1_bias, const eac_a8_block& etc_eac_a8_blk, bool bc1_hint0, bool bc1_hint1) + { + if ((g_uastc_mode_has_alpha[result.m_uastc_mode]) && (result.m_uastc_mode != UASTC_MODE_INDEX_SOLID_COLOR)) + { + assert(etc_eac_a8_blk.m_multiplier >= 1); + } + + uint8_t buf[32]; + memset(buf, 0, sizeof(buf)); + + uint32_t block_bit_offset = 0; + +#if UASTC_WRITE_MODE_DESCS + printf("**** Mode: %u\n", result.m_uastc_mode); +#endif + + uastc_write_bits(buf, block_bit_offset, g_uastc_mode_huff_codes[result.m_uastc_mode][0], g_uastc_mode_huff_codes[result.m_uastc_mode][1], "mode"); + + if (result.m_uastc_mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + uastc_write_bits(buf, block_bit_offset, result.m_solid_color.r, 8, "R"); + uastc_write_bits(buf, block_bit_offset, result.m_solid_color.g, 8, "G"); + uastc_write_bits(buf, block_bit_offset, result.m_solid_color.b, 8, "B"); + uastc_write_bits(buf, block_bit_offset, result.m_solid_color.a, 8, "A"); + + uastc_write_bits(buf, block_bit_offset, etc1_blk.get_diff_bit(), 1, "ETC1D"); + uastc_write_bits(buf, block_bit_offset, etc1_blk.get_inten_table(0), 3, "ETC1I"); + uastc_write_bits(buf, block_bit_offset, etc1_blk.get_selector(0, 0), 2, "ETC1S"); + + uint32_t r, g, b; + if (etc1_blk.get_diff_bit()) + etc_block::unpack_color5(r, g, b, etc1_blk.get_base5_color(), false); + else + etc_block::unpack_color4(r, g, b, etc1_blk.get_base4_color(0), false); + + uastc_write_bits(buf, block_bit_offset, r, 5, "ETC1R"); + uastc_write_bits(buf, block_bit_offset, g, 5, "ETC1G"); + uastc_write_bits(buf, block_bit_offset, b, 5, "ETC1B"); + + memcpy(&blk, buf, sizeof(blk)); + return; + } + + if (g_uastc_mode_has_bc1_hint0[result.m_uastc_mode]) + uastc_write_bits(buf, block_bit_offset, bc1_hint0, 1, "BC1H0"); + else + { + assert(bc1_hint0 == false); + } + + if (g_uastc_mode_has_bc1_hint1[result.m_uastc_mode]) + uastc_write_bits(buf, block_bit_offset, bc1_hint1, 1, "BC1H1"); + else + { + assert(bc1_hint1 == false); + } + + uastc_write_bits(buf, block_bit_offset, etc1_blk.get_flip_bit(), 1, "ETC1F"); + uastc_write_bits(buf, block_bit_offset, etc1_blk.get_diff_bit(), 1, "ETC1D"); + uastc_write_bits(buf, block_bit_offset, etc1_blk.get_inten_table(0), 3, "ETC1I0"); + uastc_write_bits(buf, block_bit_offset, etc1_blk.get_inten_table(1), 3, "ETC1I1"); + + if (g_uastc_mode_has_etc1_bias[result.m_uastc_mode]) + uastc_write_bits(buf, block_bit_offset, etc1_bias, 5, "ETC1BIAS"); + else + { + assert(etc1_bias == 0); + } + + if (g_uastc_mode_has_alpha[result.m_uastc_mode]) + { + const uint32_t etc2_hints = etc_eac_a8_blk.m_table | (etc_eac_a8_blk.m_multiplier << 4); + + assert(etc2_hints > 0 && etc2_hints <= 0xFF); + uastc_write_bits(buf, block_bit_offset, etc2_hints, 8, "ETC2TM"); + } + + uint32_t subsets = 1; + switch (result.m_uastc_mode) + { + case 2: + case 4: + case 7: + case 9: + case 16: + uastc_write_bits(buf, block_bit_offset, result.m_common_pattern, 5, "PAT"); + subsets = 2; + break; + case 3: + uastc_write_bits(buf, block_bit_offset, result.m_common_pattern, 4, "PAT"); + subsets = 3; + break; + default: + break; + } + +#ifdef _DEBUG + uint32_t part_seed = 0; + switch (result.m_uastc_mode) + { + case 2: + case 4: + case 9: + case 16: + part_seed = g_astc_bc7_common_partitions2[result.m_common_pattern].m_astc; + break; + case 3: + part_seed = g_astc_bc7_common_partitions3[result.m_common_pattern].m_astc; + break; + case 7: + part_seed = g_bc7_3_astc2_common_partitions[result.m_common_pattern].m_astc2; + break; + default: + break; + } +#endif + + uint32_t total_planes = 1; + switch (result.m_uastc_mode) + { + case 6: + case 11: + case 13: + uastc_write_bits(buf, block_bit_offset, result.m_astc.m_ccs, 2, "COMPSEL"); + total_planes = 2; + break; + case 17: + // CCS field is always 3 for dual plane LA. + assert(result.m_astc.m_ccs == 3); + total_planes = 2; + break; + default: + break; + } + + uint8_t weights[32]; + memcpy(weights, result.m_astc.m_weights, 16 * total_planes); + + uint8_t endpoints[18]; + memcpy(endpoints, result.m_astc.m_endpoints, sizeof(endpoints)); + + const uint32_t total_comps = g_uastc_mode_comps[result.m_uastc_mode]; + + // LLAA + // LLAA LLAA + // LLAA LLAA LLAA + // RRGGBB + // RRGGBB RRGGBB + // RRGGBB RRGGBB RRGGBB + // RRGGBBAA + // RRGGBBAA RRGGBBAA + + const uint32_t weight_bits = g_uastc_mode_weight_bits[result.m_uastc_mode]; + + const uint8_t* pPartition_pattern; + const uint8_t* pSubset_anchor_indices = basist::get_anchor_indices(subsets, result.m_uastc_mode, result.m_common_pattern, pPartition_pattern); + + for (uint32_t plane_index = 0; plane_index < total_planes; plane_index++) + { + for (uint32_t subset_index = 0; subset_index < subsets; subset_index++) + { + const uint32_t anchor_index = pSubset_anchor_indices[subset_index]; + +#ifdef _DEBUG + if (subsets >= 2) + { + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t part_index = astc_compute_texel_partition(part_seed, i & 3, i >> 2, 0, subsets, true); + if (part_index == subset_index) + { + assert(anchor_index == i); + break; + } + } + } + else + { + assert(!anchor_index); + } +#endif + + // Check anchor weight's MSB - if it's set then invert this subset's weights and swap the endpoints + if (weights[anchor_index * total_planes + plane_index] & (1 << (weight_bits - 1))) + { + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t part_index = pPartition_pattern[i]; + +#ifdef _DEBUG + if (subsets >= 2) + { + assert(part_index == (uint32_t)astc_compute_texel_partition(part_seed, i & 3, i >> 2, 0, subsets, true)); + } + else + { + assert(!part_index); + } +#endif + + if (part_index == subset_index) + weights[i * total_planes + plane_index] = ((1 << weight_bits) - 1) - weights[i * total_planes + plane_index]; + } + + if (total_planes == 2) + { + for (int c = 0; c < (int)total_comps; c++) + { + const uint32_t comp_plane = (total_comps == 2) ? c : ((c == result.m_astc.m_ccs) ? 1 : 0); + + if (comp_plane == plane_index) + std::swap(endpoints[c * 2 + 0], endpoints[c * 2 + 1]); + } + } + else + { + for (uint32_t c = 0; c < total_comps; c++) + std::swap(endpoints[subset_index * total_comps * 2 + c * 2 + 0], endpoints[subset_index * total_comps * 2 + c * 2 + 1]); + } + } + } // subset_index + } // plane_index + + const uint32_t total_values = total_comps * 2 * subsets; + const uint32_t endpoint_range = g_uastc_mode_endpoint_ranges[result.m_uastc_mode]; + + uint32_t bit_values[18]; + uint32_t tq_values[8]; + uint32_t total_tq_values = 0; + uint32_t tq_accum = 0; + uint32_t tq_mul = 1; + + const uint32_t ep_bits = g_astc_bise_range_table[endpoint_range][0]; + const uint32_t ep_trits = g_astc_bise_range_table[endpoint_range][1]; + const uint32_t ep_quints = g_astc_bise_range_table[endpoint_range][2]; + + for (uint32_t i = 0; i < total_values; i++) + { + uint32_t val = endpoints[i]; + + uint32_t bits = val & ((1 << ep_bits) - 1); + uint32_t tq = val >> ep_bits; + + bit_values[i] = bits; + + if (ep_trits) + { + assert(tq < 3); + tq_accum += tq * tq_mul; + tq_mul *= 3; + if (tq_mul == 243) + { + tq_values[total_tq_values++] = tq_accum; + tq_accum = 0; + tq_mul = 1; + } + } + else if (ep_quints) + { + assert(tq < 5); + tq_accum += tq * tq_mul; + tq_mul *= 5; + if (tq_mul == 125) + { + tq_values[total_tq_values++] = tq_accum; + tq_accum = 0; + tq_mul = 1; + } + } + } + +#if UASTC_WRITE_MODE_DESCS + uint32_t total_endpoint_bits = 0; +#endif + + for (uint32_t i = 0; i < total_tq_values; i++) + { + const uint32_t num_bits = ep_trits ? 8 : 7; + uastc_write_bits(buf, block_bit_offset, tq_values[i], num_bits, "ETQ"); +#if UASTC_WRITE_MODE_DESCS + total_endpoint_bits += num_bits; +#endif + } + + if (tq_mul > 1) + { + uint32_t num_bits; + if (ep_trits) + { + if (tq_mul == 3) + num_bits = 2; + else if (tq_mul == 9) + num_bits = 4; + else if (tq_mul == 27) + num_bits = 5; + else //if (tq_mul == 81) + num_bits = 7; + } + else + { + if (tq_mul == 5) + num_bits = 3; + else //if (tq_mul == 25) + num_bits = 5; + } + uastc_write_bits(buf, block_bit_offset, tq_accum, num_bits, "ETQ"); +#if UASTC_WRITE_MODE_DESCS + total_endpoint_bits += num_bits; +#endif + } + + for (uint32_t i = 0; i < total_values; i++) + { + uastc_write_bits(buf, block_bit_offset, bit_values[i], ep_bits, "EBITS"); +#if UASTC_WRITE_MODE_DESCS + total_endpoint_bits += ep_bits; +#endif + } + +#if UASTC_WRITE_MODE_DESCS + uint32_t weight_start = block_bit_offset; + uint32_t total_weight_bits = 0; +#endif + + const uint32_t plane_shift = (total_planes == 2) ? 1 : 0; + for (uint32_t i = 0; i < 16 * total_planes; i++) + { + uint32_t numbits = weight_bits; + for (uint32_t s = 0; s < subsets; s++) + { + if (pSubset_anchor_indices[s] == (i >> plane_shift)) + { + numbits--; + break; + } + } + + uastc_write_bits(buf, block_bit_offset, weights[i], numbits, nullptr); + +#if UASTC_WRITE_MODE_DESCS + total_weight_bits += numbits; +#endif + } + +#if UASTC_WRITE_MODE_DESCS + printf("WEIGHTS: %u %u\n", weight_start, total_weight_bits); +#endif + + assert(block_bit_offset <= 128); + memcpy(&blk, buf, sizeof(blk)); + +#if UASTC_WRITE_MODE_DESCS + printf("Total bits: %u, endpoint bits: %u, weight bits: %u\n", block_bit_offset, total_endpoint_bits, total_weight_bits); +#endif + } + + // MODE 0 + // 0. DualPlane: 0, WeightRange: 8 (16), Subsets: 1, CEM: 8 (RGB Direct ), EndpointRange: 19 (192) MODE6 RGB + // 18. DualPlane: 0, WeightRange: 11 (32), Subsets: 1, CEM: 8 (RGB Direct ), EndpointRange: 11 (32) MODE6 RGB + static void astc_mode0_or_18(uint32_t mode, const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params, const uint8_t *pForce_selectors = nullptr) + { + const uint32_t endpoint_range = (mode == 18) ? 11 : 19; + const uint32_t weight_range = (mode == 18) ? 11 : 8; + + color_cell_compressor_params ccell_params; + memset(&ccell_params, 0, sizeof(ccell_params)); + + ccell_params.m_num_pixels = 16; + ccell_params.m_pPixels = (color_quad_u8*)&block[0][0]; + ccell_params.m_num_selector_weights = (mode == 18) ? 32 : 16; + ccell_params.m_pSelector_weights = (mode == 18) ? g_astc_weights5 : g_astc_weights4; + ccell_params.m_pSelector_weightsx = (mode == 18) ? (const bc7enc_vec4F*)g_astc_weights5x : (const bc7enc_vec4F*)g_astc_weights4x; + ccell_params.m_astc_endpoint_range = endpoint_range; + ccell_params.m_weights[0] = 1; + ccell_params.m_weights[1] = 1; + ccell_params.m_weights[2] = 1; + ccell_params.m_weights[3] = 1; + ccell_params.m_pForce_selectors = pForce_selectors; + + color_cell_compressor_results ccell_results; + uint8_t ccell_result_selectors[16]; + uint8_t ccell_result_selectors_temp[16]; + memset(&ccell_results, 0, sizeof(ccell_results)); + ccell_results.m_pSelectors = &ccell_result_selectors[0]; + ccell_results.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + uint64_t part_err = color_cell_compression(255, &ccell_params, &ccell_results, &comp_params); + + // ASTC + astc_block_desc astc_results; + memset(&astc_results, 0, sizeof(astc_results)); + + astc_results.m_dual_plane = false; + astc_results.m_weight_range = weight_range;// (mode == 18) ? 11 : 8; + + astc_results.m_ccs = 0; + astc_results.m_subsets = 1; + astc_results.m_partition_seed = 0; + astc_results.m_cem = 8; + + astc_results.m_endpoints[0] = ccell_results.m_astc_low_endpoint.m_c[0]; + astc_results.m_endpoints[1] = ccell_results.m_astc_high_endpoint.m_c[0]; + astc_results.m_endpoints[2] = ccell_results.m_astc_low_endpoint.m_c[1]; + astc_results.m_endpoints[3] = ccell_results.m_astc_high_endpoint.m_c[1]; + astc_results.m_endpoints[4] = ccell_results.m_astc_low_endpoint.m_c[2]; + astc_results.m_endpoints[5] = ccell_results.m_astc_high_endpoint.m_c[2]; + + bool invert = false; + + if (pForce_selectors == nullptr) + { + int s0 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[0]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[2]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[4]].m_unquant; + int s1 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[1]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[3]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(astc_results.m_endpoints[0], astc_results.m_endpoints[1]); + std::swap(astc_results.m_endpoints[2], astc_results.m_endpoints[3]); + std::swap(astc_results.m_endpoints[4], astc_results.m_endpoints[5]); + invert = true; + } + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + astc_results.m_weights[x + y * 4] = ccell_result_selectors[x + y * 4]; + + if (invert) + astc_results.m_weights[x + y * 4] = ((mode == 18) ? 31 : 15) - astc_results.m_weights[x + y * 4]; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = mode; + pResults[total_results].m_common_pattern = 0; + pResults[total_results].m_astc = astc_results; + pResults[total_results].m_astc_err = part_err; + total_results++; + } + } + + // MODE 1 + // 1-subset, 2-bit indices, 8-bit endpoints, BC7 mode 3 + // DualPlane: 0, WeightRange: 2 (4), Subsets: 1, CEM: 8 (RGB Direct ), EndpointRange: 20 (256) MODE3 or MODE5 RGB + static void astc_mode1(const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params) + { + color_cell_compressor_params ccell_params; + memset(&ccell_params, 0, sizeof(ccell_params)); + + ccell_params.m_num_pixels = 16; + ccell_params.m_pPixels = (color_quad_u8*)&block[0][0]; + ccell_params.m_num_selector_weights = 4; + ccell_params.m_pSelector_weights = g_bc7_weights2; + ccell_params.m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights2x; + ccell_params.m_astc_endpoint_range = 20; + ccell_params.m_weights[0] = 1; + ccell_params.m_weights[1] = 1; + ccell_params.m_weights[2] = 1; + ccell_params.m_weights[3] = 1; + + color_cell_compressor_results ccell_results; + uint8_t ccell_result_selectors[16]; + uint8_t ccell_result_selectors_temp[16]; + memset(&ccell_results, 0, sizeof(ccell_results)); + ccell_results.m_pSelectors = &ccell_result_selectors[0]; + ccell_results.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + uint64_t part_err = color_cell_compression(255, &ccell_params, &ccell_results, &comp_params); + + // ASTC + astc_block_desc astc_results; + memset(&astc_results, 0, sizeof(astc_results)); + + astc_results.m_dual_plane = false; + astc_results.m_weight_range = 2; + + astc_results.m_ccs = 0; + astc_results.m_subsets = 1; + astc_results.m_partition_seed = 0; + astc_results.m_cem = 8; + + astc_results.m_endpoints[0] = ccell_results.m_astc_low_endpoint.m_c[0]; + astc_results.m_endpoints[1] = ccell_results.m_astc_high_endpoint.m_c[0]; + astc_results.m_endpoints[2] = ccell_results.m_astc_low_endpoint.m_c[1]; + astc_results.m_endpoints[3] = ccell_results.m_astc_high_endpoint.m_c[1]; + astc_results.m_endpoints[4] = ccell_results.m_astc_low_endpoint.m_c[2]; + astc_results.m_endpoints[5] = ccell_results.m_astc_high_endpoint.m_c[2]; + + const uint32_t range = 20; + + bool invert = false; + + int s0 = g_astc_unquant[range][astc_results.m_endpoints[0]].m_unquant + g_astc_unquant[range][astc_results.m_endpoints[2]].m_unquant + g_astc_unquant[range][astc_results.m_endpoints[4]].m_unquant; + int s1 = g_astc_unquant[range][astc_results.m_endpoints[1]].m_unquant + g_astc_unquant[range][astc_results.m_endpoints[3]].m_unquant + g_astc_unquant[range][astc_results.m_endpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(astc_results.m_endpoints[0], astc_results.m_endpoints[1]); + std::swap(astc_results.m_endpoints[2], astc_results.m_endpoints[3]); + std::swap(astc_results.m_endpoints[4], astc_results.m_endpoints[5]); + invert = true; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + astc_results.m_weights[x + y * 4] = ccell_result_selectors[x + y * 4]; + + if (invert) + astc_results.m_weights[x + y * 4] = 3 - astc_results.m_weights[x + y * 4]; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = 1; + pResults[total_results].m_common_pattern = 0; + pResults[total_results].m_astc = astc_results; + pResults[total_results].m_astc_err = part_err; + total_results++; + } + } + + static uint32_t estimate_partition2(uint32_t num_weights, uint32_t num_comps, const uint32_t* pWeights, const color_rgba block[4][4], const uint32_t weights[4]) + { + assert(pWeights[0] == 0 && pWeights[num_weights - 1] == 64); + + uint64_t best_err = UINT64_MAX; + uint32_t best_common_pattern = 0; + + for (uint32_t common_pattern = 0; common_pattern < TOTAL_ASTC_BC7_COMMON_PARTITIONS2; common_pattern++) + { + const uint32_t bc7_pattern = g_astc_bc7_common_partitions2[common_pattern].m_bc7; + + const uint8_t* pPartition = &g_bc7_partition2[bc7_pattern * 16]; + + color_quad_u8 subset_colors[2][16]; + uint32_t subset_total_colors[2] = { 0, 0 }; + for (uint32_t index = 0; index < 16; index++) + subset_colors[pPartition[index]][subset_total_colors[pPartition[index]]++] = ((const color_quad_u8*)block)[index]; + + uint64_t total_subset_err = 0; + for (uint32_t subset = 0; (subset < 2) && (total_subset_err < best_err); subset++) + total_subset_err += color_cell_compression_est_astc(num_weights, num_comps, pWeights, subset_total_colors[subset], &subset_colors[subset][0], best_err, weights); + + if (total_subset_err < best_err) + { + best_err = total_subset_err; + best_common_pattern = common_pattern; + } + } + + return best_common_pattern; + } + + // MODE 2 + // 2-subset, 3-bit indices, 4-bit endpoints, BC7 mode 1 + // DualPlane: 0, WeightRange: 5 (8), Subsets: 2, CEM: 8 (RGB Direct ), EndpointRange: 8 (16) MODE1 + static void astc_mode2(const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params, bool estimate_partition) + { + uint32_t first_common_pattern = 0; + uint32_t last_common_pattern = TOTAL_ASTC_BC7_COMMON_PARTITIONS2; + + if (estimate_partition) + { + const uint32_t weights[4] = { 1, 1, 1, 1 }; + first_common_pattern = estimate_partition2(8, 3, g_bc7_weights3, block, weights); + last_common_pattern = first_common_pattern + 1; + } + + for (uint32_t common_pattern = first_common_pattern; common_pattern < last_common_pattern; common_pattern++) + { + const uint32_t bc7_pattern = g_astc_bc7_common_partitions2[common_pattern].m_bc7; + + color_rgba part_pixels[2][16]; + uint32_t part_pixel_index[4][4]; + uint32_t num_part_pixels[2] = { 0, 0 }; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t part = g_bc7_partition2[16 * bc7_pattern + x + y * 4]; + part_pixel_index[y][x] = num_part_pixels[part]; + part_pixels[part][num_part_pixels[part]++] = block[y][x]; + } + } + + color_cell_compressor_params ccell_params[2]; + color_cell_compressor_results ccell_results[2]; + uint8_t ccell_result_selectors[2][16]; + uint8_t ccell_result_selectors_temp[2][16]; + + uint64_t total_part_err = 0; + for (uint32_t part = 0; part < 2; part++) + { + memset(&ccell_params[part], 0, sizeof(ccell_params[part])); + + ccell_params[part].m_num_pixels = num_part_pixels[part]; + ccell_params[part].m_pPixels = (color_quad_u8*)&part_pixels[part][0]; + ccell_params[part].m_num_selector_weights = 8; + ccell_params[part].m_pSelector_weights = g_bc7_weights3; + ccell_params[part].m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights3x; + ccell_params[part].m_astc_endpoint_range = 8; + ccell_params[part].m_weights[0] = 1; + ccell_params[part].m_weights[1] = 1; + ccell_params[part].m_weights[2] = 1; + ccell_params[part].m_weights[3] = 1; + + memset(&ccell_results[part], 0, sizeof(ccell_results[part])); + ccell_results[part].m_pSelectors = &ccell_result_selectors[part][0]; + ccell_results[part].m_pSelectors_temp = &ccell_result_selectors_temp[part][0]; + + uint64_t part_err = color_cell_compression(255, &ccell_params[part], &ccell_results[part], &comp_params); + total_part_err += part_err; + } // part + + { + // ASTC + astc_block_desc astc_results; + memset(&astc_results, 0, sizeof(astc_results)); + + astc_results.m_dual_plane = false; + astc_results.m_weight_range = 5; + + astc_results.m_ccs = 0; + astc_results.m_subsets = 2; + astc_results.m_partition_seed = g_astc_bc7_common_partitions2[common_pattern].m_astc; + astc_results.m_cem = 8; + + uint32_t p0 = 0; + uint32_t p1 = 1; + if (g_astc_bc7_common_partitions2[common_pattern].m_invert) + std::swap(p0, p1); + + astc_results.m_endpoints[0] = ccell_results[p0].m_astc_low_endpoint.m_c[0]; + astc_results.m_endpoints[1] = ccell_results[p0].m_astc_high_endpoint.m_c[0]; + astc_results.m_endpoints[2] = ccell_results[p0].m_astc_low_endpoint.m_c[1]; + astc_results.m_endpoints[3] = ccell_results[p0].m_astc_high_endpoint.m_c[1]; + astc_results.m_endpoints[4] = ccell_results[p0].m_astc_low_endpoint.m_c[2]; + astc_results.m_endpoints[5] = ccell_results[p0].m_astc_high_endpoint.m_c[2]; + + const uint32_t range = 8; + + bool invert[2] = { false, false }; + + int s0 = g_astc_unquant[range][astc_results.m_endpoints[0]].m_unquant + g_astc_unquant[range][astc_results.m_endpoints[2]].m_unquant + g_astc_unquant[range][astc_results.m_endpoints[4]].m_unquant; + int s1 = g_astc_unquant[range][astc_results.m_endpoints[1]].m_unquant + g_astc_unquant[range][astc_results.m_endpoints[3]].m_unquant + g_astc_unquant[range][astc_results.m_endpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(astc_results.m_endpoints[0], astc_results.m_endpoints[1]); + std::swap(astc_results.m_endpoints[2], astc_results.m_endpoints[3]); + std::swap(astc_results.m_endpoints[4], astc_results.m_endpoints[5]); + invert[0] = true; + } + + astc_results.m_endpoints[6] = ccell_results[p1].m_astc_low_endpoint.m_c[0]; + astc_results.m_endpoints[7] = ccell_results[p1].m_astc_high_endpoint.m_c[0]; + astc_results.m_endpoints[8] = ccell_results[p1].m_astc_low_endpoint.m_c[1]; + astc_results.m_endpoints[9] = ccell_results[p1].m_astc_high_endpoint.m_c[1]; + astc_results.m_endpoints[10] = ccell_results[p1].m_astc_low_endpoint.m_c[2]; + astc_results.m_endpoints[11] = ccell_results[p1].m_astc_high_endpoint.m_c[2]; + + s0 = g_astc_unquant[range][astc_results.m_endpoints[0 + 6]].m_unquant + g_astc_unquant[range][astc_results.m_endpoints[2 + 6]].m_unquant + g_astc_unquant[range][astc_results.m_endpoints[4 + 6]].m_unquant; + s1 = g_astc_unquant[range][astc_results.m_endpoints[1 + 6]].m_unquant + g_astc_unquant[range][astc_results.m_endpoints[3 + 6]].m_unquant + g_astc_unquant[range][astc_results.m_endpoints[5 + 6]].m_unquant; + + if (s1 < s0) + { + std::swap(astc_results.m_endpoints[0 + 6], astc_results.m_endpoints[1 + 6]); + std::swap(astc_results.m_endpoints[2 + 6], astc_results.m_endpoints[3 + 6]); + std::swap(astc_results.m_endpoints[4 + 6], astc_results.m_endpoints[5 + 6]); + invert[1] = true; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t bc7_part = g_bc7_partition2[16 * bc7_pattern + x + y * 4]; + + astc_results.m_weights[x + y * 4] = ccell_result_selectors[bc7_part][part_pixel_index[y][x]]; + + uint32_t astc_part = bc7_part; + if (g_astc_bc7_common_partitions2[common_pattern].m_invert) + astc_part = 1 - astc_part; + + if (invert[astc_part]) + astc_results.m_weights[x + y * 4] = 7 - astc_results.m_weights[x + y * 4]; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = 2; + pResults[total_results].m_common_pattern = common_pattern; + pResults[total_results].m_astc = astc_results; + pResults[total_results].m_astc_err = total_part_err; + total_results++; + } + } + + } // common_pattern + } + + // MODE 3 + // 3-subsets, 2-bit indices, [0,11] endpoints, BC7 mode 2 + // DualPlane: 0, WeightRange: 2 (4), Subsets: 3, CEM: 8 (RGB Direct ), EndpointRange: 7 (12) MODE2 + static void astc_mode3(const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params, bool estimate_partition) + { + uint32_t first_common_pattern = 0; + uint32_t last_common_pattern = TOTAL_ASTC_BC7_COMMON_PARTITIONS3; + + if (estimate_partition) + { + uint64_t best_err = UINT64_MAX; + uint32_t best_common_pattern = 0; + const uint32_t weights[4] = { 1, 1, 1, 1 }; + + for (uint32_t common_pattern = 0; common_pattern < TOTAL_ASTC_BC7_COMMON_PARTITIONS3; common_pattern++) + { + const uint32_t bc7_pattern = g_astc_bc7_common_partitions3[common_pattern].m_bc7; + + const uint8_t* pPartition = &g_bc7_partition3[bc7_pattern * 16]; + + color_quad_u8 subset_colors[3][16]; + uint32_t subset_total_colors[3] = { 0, 0 }; + for (uint32_t index = 0; index < 16; index++) + subset_colors[pPartition[index]][subset_total_colors[pPartition[index]]++] = ((const color_quad_u8*)block)[index]; + + uint64_t total_subset_err = 0; + for (uint32_t subset = 0; (subset < 3) && (total_subset_err < best_err); subset++) + total_subset_err += color_cell_compression_est_astc(4, 3, g_bc7_weights2, subset_total_colors[subset], &subset_colors[subset][0], best_err, weights); + + if (total_subset_err < best_err) + { + best_err = total_subset_err; + best_common_pattern = common_pattern; + } + } + + first_common_pattern = best_common_pattern; + last_common_pattern = best_common_pattern + 1; + } + + for (uint32_t common_pattern = first_common_pattern; common_pattern < last_common_pattern; common_pattern++) + { + const uint32_t endpoint_range = 7; + + const uint32_t bc7_pattern = g_astc_bc7_common_partitions3[common_pattern].m_bc7; + + color_rgba part_pixels[3][16]; + uint32_t part_pixel_index[4][4]; + uint32_t num_part_pixels[3] = { 0, 0, 0 }; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t bc7_part = g_bc7_partition3[16 * bc7_pattern + x + y * 4]; + part_pixel_index[y][x] = num_part_pixels[bc7_part]; + part_pixels[bc7_part][num_part_pixels[bc7_part]++] = block[y][x]; + } + } + + color_cell_compressor_params ccell_params[3]; + color_cell_compressor_results ccell_results[3]; + uint8_t ccell_result_selectors[3][16]; + uint8_t ccell_result_selectors_temp[3][16]; + + uint64_t total_part_err = 0; + for (uint32_t bc7_part = 0; bc7_part < 3; bc7_part++) + { + memset(&ccell_params[bc7_part], 0, sizeof(ccell_params[bc7_part])); + + ccell_params[bc7_part].m_num_pixels = num_part_pixels[bc7_part]; + ccell_params[bc7_part].m_pPixels = (color_quad_u8*)&part_pixels[bc7_part][0]; + ccell_params[bc7_part].m_num_selector_weights = 4; + ccell_params[bc7_part].m_pSelector_weights = g_bc7_weights2; + ccell_params[bc7_part].m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights2x; + ccell_params[bc7_part].m_astc_endpoint_range = endpoint_range; + ccell_params[bc7_part].m_weights[0] = 1; + ccell_params[bc7_part].m_weights[1] = 1; + ccell_params[bc7_part].m_weights[2] = 1; + ccell_params[bc7_part].m_weights[3] = 1; + + memset(&ccell_results[bc7_part], 0, sizeof(ccell_results[bc7_part])); + ccell_results[bc7_part].m_pSelectors = &ccell_result_selectors[bc7_part][0]; + ccell_results[bc7_part].m_pSelectors_temp = &ccell_result_selectors_temp[bc7_part][0]; + + uint64_t part_err = color_cell_compression(255, &ccell_params[bc7_part], &ccell_results[bc7_part], &comp_params); + total_part_err += part_err; + } // part + + { + // ASTC + astc_block_desc astc_results; + memset(&astc_results, 0, sizeof(astc_results)); + + astc_results.m_dual_plane = false; + astc_results.m_weight_range = 2; + + astc_results.m_ccs = 0; + astc_results.m_subsets = 3; + astc_results.m_partition_seed = g_astc_bc7_common_partitions3[common_pattern].m_astc; + astc_results.m_cem = 8; + + uint32_t astc_to_bc7_part[3]; // converts ASTC to BC7 partition index + const uint32_t perm = g_astc_bc7_common_partitions3[common_pattern].m_astc_to_bc7_perm; + astc_to_bc7_part[0] = g_astc_to_bc7_partition_index_perm_tables[perm][0]; + astc_to_bc7_part[1] = g_astc_to_bc7_partition_index_perm_tables[perm][1]; + astc_to_bc7_part[2] = g_astc_to_bc7_partition_index_perm_tables[perm][2]; + + bool invert_astc_part[3] = { false, false, false }; + + for (uint32_t astc_part = 0; astc_part < 3; astc_part++) + { + uint8_t* pEndpoints = &astc_results.m_endpoints[6 * astc_part]; + + pEndpoints[0] = ccell_results[astc_to_bc7_part[astc_part]].m_astc_low_endpoint.m_c[0]; + pEndpoints[1] = ccell_results[astc_to_bc7_part[astc_part]].m_astc_high_endpoint.m_c[0]; + pEndpoints[2] = ccell_results[astc_to_bc7_part[astc_part]].m_astc_low_endpoint.m_c[1]; + pEndpoints[3] = ccell_results[astc_to_bc7_part[astc_part]].m_astc_high_endpoint.m_c[1]; + pEndpoints[4] = ccell_results[astc_to_bc7_part[astc_part]].m_astc_low_endpoint.m_c[2]; + pEndpoints[5] = ccell_results[astc_to_bc7_part[astc_part]].m_astc_high_endpoint.m_c[2]; + + int s0 = g_astc_unquant[endpoint_range][pEndpoints[0]].m_unquant + g_astc_unquant[endpoint_range][pEndpoints[2]].m_unquant + g_astc_unquant[endpoint_range][pEndpoints[4]].m_unquant; + int s1 = g_astc_unquant[endpoint_range][pEndpoints[1]].m_unquant + g_astc_unquant[endpoint_range][pEndpoints[3]].m_unquant + g_astc_unquant[endpoint_range][pEndpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(pEndpoints[0], pEndpoints[1]); + std::swap(pEndpoints[2], pEndpoints[3]); + std::swap(pEndpoints[4], pEndpoints[5]); + invert_astc_part[astc_part] = true; + } + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t bc7_part = g_bc7_partition3[16 * bc7_pattern + x + y * 4]; + + astc_results.m_weights[x + y * 4] = ccell_result_selectors[bc7_part][part_pixel_index[y][x]]; + + uint32_t astc_part = 0; + for (uint32_t i = 0; i < 3; i++) + { + if (astc_to_bc7_part[i] == bc7_part) + { + astc_part = i; + break; + } + } + + if (invert_astc_part[astc_part]) + astc_results.m_weights[x + y * 4] = 3 - astc_results.m_weights[x + y * 4]; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = 3; + pResults[total_results].m_common_pattern = common_pattern; + pResults[total_results].m_astc = astc_results; + pResults[total_results].m_astc_err = total_part_err; + total_results++; + } + + } + + } // common_pattern + } + + // MODE 4 + // DualPlane: 0, WeightRange: 2 (4), Subsets: 2, CEM: 8 (RGB Direct ), EndpointRange: 12 (40) MODE3 + static void astc_mode4(const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params, bool estimate_partition) + { + //const uint32_t weight_range = 2; + const uint32_t endpoint_range = 12; + + uint32_t first_common_pattern = 0; + uint32_t last_common_pattern = TOTAL_ASTC_BC7_COMMON_PARTITIONS2; + + if (estimate_partition) + { + const uint32_t weights[4] = { 1, 1, 1, 1 }; + first_common_pattern = estimate_partition2(4, 3, g_bc7_weights2, block, weights); + last_common_pattern = first_common_pattern + 1; + } + + for (uint32_t common_pattern = first_common_pattern; common_pattern < last_common_pattern; common_pattern++) + { + const uint32_t bc7_pattern = g_astc_bc7_common_partitions2[common_pattern].m_bc7; + + color_rgba part_pixels[2][16]; + uint32_t part_pixel_index[4][4]; + uint32_t num_part_pixels[2] = { 0, 0 }; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t part = g_bc7_partition2[16 * bc7_pattern + x + y * 4]; + part_pixel_index[y][x] = num_part_pixels[part]; + part_pixels[part][num_part_pixels[part]++] = block[y][x]; + } + } + + color_cell_compressor_params ccell_params[2]; + color_cell_compressor_results ccell_results[2]; + uint8_t ccell_result_selectors[2][16]; + uint8_t ccell_result_selectors_temp[2][16]; + + uint64_t total_part_err = 0; + for (uint32_t part = 0; part < 2; part++) + { + memset(&ccell_params[part], 0, sizeof(ccell_params[part])); + + ccell_params[part].m_num_pixels = num_part_pixels[part]; + ccell_params[part].m_pPixels = (color_quad_u8*)&part_pixels[part][0]; + ccell_params[part].m_num_selector_weights = 4; + ccell_params[part].m_pSelector_weights = g_bc7_weights2; + ccell_params[part].m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights2x; + ccell_params[part].m_astc_endpoint_range = endpoint_range; + ccell_params[part].m_weights[0] = 1; + ccell_params[part].m_weights[1] = 1; + ccell_params[part].m_weights[2] = 1; + ccell_params[part].m_weights[3] = 1; + + memset(&ccell_results[part], 0, sizeof(ccell_results[part])); + ccell_results[part].m_pSelectors = &ccell_result_selectors[part][0]; + ccell_results[part].m_pSelectors_temp = &ccell_result_selectors_temp[part][0]; + + uint64_t part_err = color_cell_compression(255, &ccell_params[part], &ccell_results[part], &comp_params); + total_part_err += part_err; + } // part + + // ASTC + astc_block_desc astc_results; + memset(&astc_results, 0, sizeof(astc_results)); + + astc_results.m_dual_plane = false; + astc_results.m_weight_range = 2; + + astc_results.m_ccs = 0; + astc_results.m_subsets = 2; + astc_results.m_partition_seed = g_astc_bc7_common_partitions2[common_pattern].m_astc; + astc_results.m_cem = 8; + + uint32_t p0 = 0; + uint32_t p1 = 1; + if (g_astc_bc7_common_partitions2[common_pattern].m_invert) + std::swap(p0, p1); + + astc_results.m_endpoints[0] = ccell_results[p0].m_astc_low_endpoint.m_c[0]; + astc_results.m_endpoints[1] = ccell_results[p0].m_astc_high_endpoint.m_c[0]; + astc_results.m_endpoints[2] = ccell_results[p0].m_astc_low_endpoint.m_c[1]; + astc_results.m_endpoints[3] = ccell_results[p0].m_astc_high_endpoint.m_c[1]; + astc_results.m_endpoints[4] = ccell_results[p0].m_astc_low_endpoint.m_c[2]; + astc_results.m_endpoints[5] = ccell_results[p0].m_astc_high_endpoint.m_c[2]; + + bool invert[2] = { false, false }; + + int s0 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[0]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[2]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[4]].m_unquant; + int s1 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[1]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[3]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(astc_results.m_endpoints[0], astc_results.m_endpoints[1]); + std::swap(astc_results.m_endpoints[2], astc_results.m_endpoints[3]); + std::swap(astc_results.m_endpoints[4], astc_results.m_endpoints[5]); + invert[0] = true; + } + + astc_results.m_endpoints[6] = ccell_results[p1].m_astc_low_endpoint.m_c[0]; + astc_results.m_endpoints[7] = ccell_results[p1].m_astc_high_endpoint.m_c[0]; + astc_results.m_endpoints[8] = ccell_results[p1].m_astc_low_endpoint.m_c[1]; + astc_results.m_endpoints[9] = ccell_results[p1].m_astc_high_endpoint.m_c[1]; + astc_results.m_endpoints[10] = ccell_results[p1].m_astc_low_endpoint.m_c[2]; + astc_results.m_endpoints[11] = ccell_results[p1].m_astc_high_endpoint.m_c[2]; + + s0 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[0 + 6]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[2 + 6]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[4 + 6]].m_unquant; + s1 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[1 + 6]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[3 + 6]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[5 + 6]].m_unquant; + + if (s1 < s0) + { + std::swap(astc_results.m_endpoints[0 + 6], astc_results.m_endpoints[1 + 6]); + std::swap(astc_results.m_endpoints[2 + 6], astc_results.m_endpoints[3 + 6]); + std::swap(astc_results.m_endpoints[4 + 6], astc_results.m_endpoints[5 + 6]); + invert[1] = true; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t bc7_part = g_bc7_partition2[16 * bc7_pattern + x + y * 4]; + + astc_results.m_weights[x + y * 4] = ccell_result_selectors[bc7_part][part_pixel_index[y][x]]; + + uint32_t astc_part = bc7_part; + if (g_astc_bc7_common_partitions2[common_pattern].m_invert) + astc_part = 1 - astc_part; + + if (invert[astc_part]) + astc_results.m_weights[x + y * 4] = 3 - astc_results.m_weights[x + y * 4]; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = 4; + pResults[total_results].m_common_pattern = common_pattern; + pResults[total_results].m_astc = astc_results; + pResults[total_results].m_astc_err = total_part_err; + total_results++; + } + + } // common_pattern + } + + // MODE 5 + // DualPlane: 0, WeightRange: 5 (8), Subsets: 1, CEM: 8 (RGB Direct ), EndpointRange: 20 (256) BC7 MODE 6 (or MODE 1 1-subset) + static void astc_mode5(const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params) + { + const uint32_t weight_range = 5; + const uint32_t endpoint_range = 20; + + color_cell_compressor_params ccell_params; + memset(&ccell_params, 0, sizeof(ccell_params)); + + ccell_params.m_num_pixels = 16; + ccell_params.m_pPixels = (color_quad_u8*)&block[0][0]; + ccell_params.m_num_selector_weights = 8; + ccell_params.m_pSelector_weights = g_bc7_weights3; + ccell_params.m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights3x; + ccell_params.m_astc_endpoint_range = endpoint_range; + ccell_params.m_weights[0] = 1; + ccell_params.m_weights[1] = 1; + ccell_params.m_weights[2] = 1; + ccell_params.m_weights[3] = 1; + + color_cell_compressor_results ccell_results; + uint8_t ccell_result_selectors[16]; + uint8_t ccell_result_selectors_temp[16]; + memset(&ccell_results, 0, sizeof(ccell_results)); + ccell_results.m_pSelectors = &ccell_result_selectors[0]; + ccell_results.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + uint64_t part_err = color_cell_compression(255, &ccell_params, &ccell_results, &comp_params); + + // ASTC + astc_block_desc blk; + memset(&blk, 0, sizeof(blk)); + + blk.m_dual_plane = false; + blk.m_weight_range = weight_range; + + blk.m_ccs = 0; + blk.m_subsets = 1; + blk.m_partition_seed = 0; + blk.m_cem = 8; + + blk.m_endpoints[0] = ccell_results.m_astc_low_endpoint.m_c[0]; + blk.m_endpoints[1] = ccell_results.m_astc_high_endpoint.m_c[0]; + blk.m_endpoints[2] = ccell_results.m_astc_low_endpoint.m_c[1]; + blk.m_endpoints[3] = ccell_results.m_astc_high_endpoint.m_c[1]; + blk.m_endpoints[4] = ccell_results.m_astc_low_endpoint.m_c[2]; + blk.m_endpoints[5] = ccell_results.m_astc_high_endpoint.m_c[2]; + + bool invert = false; + + int s0 = g_astc_unquant[endpoint_range][blk.m_endpoints[0]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[2]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[4]].m_unquant; + int s1 = g_astc_unquant[endpoint_range][blk.m_endpoints[1]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[3]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert = true; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + blk.m_weights[x + y * 4] = ccell_result_selectors[x + y * 4]; + + if (invert) + blk.m_weights[x + y * 4] = 7 - blk.m_weights[x + y * 4]; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = 5; + pResults[total_results].m_common_pattern = 0; + pResults[total_results].m_astc = blk; + pResults[total_results].m_astc_err = part_err; + total_results++; + } + } + + // MODE 6 + // DualPlane: 1, WeightRange: 2 (4), Subsets: 1, CEM: 8 (RGB Direct ), EndpointRange: 18 (160) BC7 MODE5 + static void astc_mode6(const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params) + { + for (uint32_t rot_comp = 0; rot_comp < 3; rot_comp++) + { + const uint32_t weight_range = 2; + const uint32_t endpoint_range = 18; + + color_quad_u8 block_rgb[16]; + color_quad_u8 block_a[16]; + for (uint32_t i = 0; i < 16; i++) + { + block_rgb[i] = ((color_quad_u8*)&block[0][0])[i]; + block_a[i] = block_rgb[i]; + + uint8_t c = block_a[i].m_c[rot_comp]; + block_a[i].m_c[0] = c; + block_a[i].m_c[1] = c; + block_a[i].m_c[2] = c; + block_a[i].m_c[3] = 255; + + block_rgb[i].m_c[rot_comp] = 255; + } + + uint8_t ccell_result_selectors_temp[16]; + + color_cell_compressor_params ccell_params_rgb; + memset(&ccell_params_rgb, 0, sizeof(ccell_params_rgb)); + + ccell_params_rgb.m_num_pixels = 16; + ccell_params_rgb.m_pPixels = block_rgb; + ccell_params_rgb.m_num_selector_weights = 4; + ccell_params_rgb.m_pSelector_weights = g_bc7_weights2; + ccell_params_rgb.m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights2x; + ccell_params_rgb.m_astc_endpoint_range = endpoint_range; + ccell_params_rgb.m_weights[0] = 1; + ccell_params_rgb.m_weights[1] = 1; + ccell_params_rgb.m_weights[2] = 1; + ccell_params_rgb.m_weights[3] = 1; + + color_cell_compressor_results ccell_results_rgb; + uint8_t ccell_result_selectors_rgb[16]; + memset(&ccell_results_rgb, 0, sizeof(ccell_results_rgb)); + ccell_results_rgb.m_pSelectors = &ccell_result_selectors_rgb[0]; + ccell_results_rgb.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + uint64_t part_err_rgb = color_cell_compression(255, &ccell_params_rgb, &ccell_results_rgb, &comp_params); + + color_cell_compressor_params ccell_params_a; + memset(&ccell_params_a, 0, sizeof(ccell_params_a)); + + ccell_params_a.m_num_pixels = 16; + ccell_params_a.m_pPixels = block_a; + ccell_params_a.m_num_selector_weights = 4; + ccell_params_a.m_pSelector_weights = g_bc7_weights2; + ccell_params_a.m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights2x; + ccell_params_a.m_astc_endpoint_range = endpoint_range; + ccell_params_a.m_weights[0] = 1; + ccell_params_a.m_weights[1] = 1; + ccell_params_a.m_weights[2] = 1; + ccell_params_a.m_weights[3] = 1; + + color_cell_compressor_results ccell_results_a; + uint8_t ccell_result_selectors_a[16]; + memset(&ccell_results_a, 0, sizeof(ccell_results_a)); + ccell_results_a.m_pSelectors = &ccell_result_selectors_a[0]; + ccell_results_a.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + uint64_t part_err_a = color_cell_compression(255, &ccell_params_a, &ccell_results_a, &comp_params) / 3; + + uint64_t total_err = part_err_rgb + part_err_a; + + // ASTC + astc_block_desc blk; + memset(&blk, 0, sizeof(blk)); + + blk.m_dual_plane = true; + blk.m_weight_range = weight_range; + + blk.m_ccs = rot_comp; + blk.m_subsets = 1; + blk.m_partition_seed = 0; + blk.m_cem = 8; + + blk.m_endpoints[0] = (rot_comp == 0 ? ccell_results_a : ccell_results_rgb).m_astc_low_endpoint.m_c[0]; + blk.m_endpoints[1] = (rot_comp == 0 ? ccell_results_a : ccell_results_rgb).m_astc_high_endpoint.m_c[0]; + blk.m_endpoints[2] = (rot_comp == 1 ? ccell_results_a : ccell_results_rgb).m_astc_low_endpoint.m_c[1]; + blk.m_endpoints[3] = (rot_comp == 1 ? ccell_results_a : ccell_results_rgb).m_astc_high_endpoint.m_c[1]; + blk.m_endpoints[4] = (rot_comp == 2 ? ccell_results_a : ccell_results_rgb).m_astc_low_endpoint.m_c[2]; + blk.m_endpoints[5] = (rot_comp == 2 ? ccell_results_a : ccell_results_rgb).m_astc_high_endpoint.m_c[2]; + + bool invert = false; + + int s0 = g_astc_unquant[endpoint_range][blk.m_endpoints[0]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[2]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[4]].m_unquant; + int s1 = g_astc_unquant[endpoint_range][blk.m_endpoints[1]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[3]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert = true; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t rgb_index = ccell_result_selectors_rgb[x + y * 4]; + uint32_t a_index = ccell_result_selectors_a[x + y * 4]; + + if (invert) + { + rgb_index = 3 - rgb_index; + a_index = 3 - a_index; + } + + blk.m_weights[(x + y * 4) * 2 + 0] = (uint8_t)rgb_index; + blk.m_weights[(x + y * 4) * 2 + 1] = (uint8_t)a_index; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = 6; + pResults[total_results].m_common_pattern = 0; + pResults[total_results].m_astc = blk; + pResults[total_results].m_astc_err = total_err; + total_results++; + } + } // rot_comp + } + + // MODE 7 - 2 subset ASTC, 3 subset BC7 + // DualPlane: 0, WeightRange: 2 (4), Subsets: 2, CEM: 8 (RGB Direct ), EndpointRange: 12 (40) MODE2 + static void astc_mode7(const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params, bool estimate_partition) + { + uint32_t first_common_pattern = 0; + uint32_t last_common_pattern = TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS; + + if (estimate_partition) + { + uint64_t best_err = UINT64_MAX; + uint32_t best_common_pattern = 0; + const uint32_t weights[4] = { 1, 1, 1, 1 }; + + for (uint32_t common_pattern = 0; common_pattern < TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS; common_pattern++) + { + const uint8_t* pPartition = &g_bc7_3_astc2_patterns2[common_pattern][0]; + +#ifdef _DEBUG + const uint32_t astc_pattern = g_bc7_3_astc2_common_partitions[common_pattern].m_astc2; + const uint32_t bc7_pattern = g_bc7_3_astc2_common_partitions[common_pattern].m_bc73; + const uint32_t common_pattern_k = g_bc7_3_astc2_common_partitions[common_pattern].k; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t astc_part = bc7_convert_partition_index_3_to_2(g_bc7_partition3[16 * bc7_pattern + x + y * 4], common_pattern_k); + assert((int)astc_part == astc_compute_texel_partition(astc_pattern, x, y, 0, 2, true)); + assert(astc_part == pPartition[x + y * 4]); + } + } +#endif + + color_quad_u8 subset_colors[2][16]; + uint32_t subset_total_colors[2] = { 0, 0 }; + for (uint32_t index = 0; index < 16; index++) + subset_colors[pPartition[index]][subset_total_colors[pPartition[index]]++] = ((const color_quad_u8*)block)[index]; + + uint64_t total_subset_err = 0; + for (uint32_t subset = 0; (subset < 2) && (total_subset_err < best_err); subset++) + total_subset_err += color_cell_compression_est_astc(4, 3, g_bc7_weights2, subset_total_colors[subset], &subset_colors[subset][0], best_err, weights); + + if (total_subset_err < best_err) + { + best_err = total_subset_err; + best_common_pattern = common_pattern; + } + } + + first_common_pattern = best_common_pattern; + last_common_pattern = best_common_pattern + 1; + } + + //const uint32_t weight_range = 2; + const uint32_t endpoint_range = 12; + + for (uint32_t common_pattern = first_common_pattern; common_pattern < last_common_pattern; common_pattern++) + { + const uint32_t astc_pattern = g_bc7_3_astc2_common_partitions[common_pattern].m_astc2; + const uint32_t bc7_pattern = g_bc7_3_astc2_common_partitions[common_pattern].m_bc73; + const uint32_t common_pattern_k = g_bc7_3_astc2_common_partitions[common_pattern].k; + + color_rgba part_pixels[2][16]; + uint32_t part_pixel_index[4][4]; + uint32_t num_part_pixels[2] = { 0, 0 }; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t astc_part = bc7_convert_partition_index_3_to_2(g_bc7_partition3[16 * bc7_pattern + x + y * 4], common_pattern_k); +#ifdef _DEBUG + assert((int)astc_part == astc_compute_texel_partition(astc_pattern, x, y, 0, 2, true)); +#endif + + part_pixel_index[y][x] = num_part_pixels[astc_part]; + part_pixels[astc_part][num_part_pixels[astc_part]++] = block[y][x]; + } + } + + color_cell_compressor_params ccell_params[2]; + color_cell_compressor_results ccell_results[2]; + uint8_t ccell_result_selectors[2][16]; + uint8_t ccell_result_selectors_temp[2][16]; + + uint64_t total_part_err = 0; + for (uint32_t part = 0; part < 2; part++) + { + memset(&ccell_params[part], 0, sizeof(ccell_params[part])); + + ccell_params[part].m_num_pixels = num_part_pixels[part]; + ccell_params[part].m_pPixels = (color_quad_u8*)&part_pixels[part][0]; + ccell_params[part].m_num_selector_weights = 4; + ccell_params[part].m_pSelector_weights = g_bc7_weights2; + ccell_params[part].m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights2x; + ccell_params[part].m_astc_endpoint_range = endpoint_range; + ccell_params[part].m_weights[0] = 1; + ccell_params[part].m_weights[1] = 1; + ccell_params[part].m_weights[2] = 1; + ccell_params[part].m_weights[3] = 1; + + memset(&ccell_results[part], 0, sizeof(ccell_results[part])); + ccell_results[part].m_pSelectors = &ccell_result_selectors[part][0]; + ccell_results[part].m_pSelectors_temp = &ccell_result_selectors_temp[part][0]; + + uint64_t part_err = color_cell_compression(255, &ccell_params[part], &ccell_results[part], &comp_params); + total_part_err += part_err; + } // part + + // ASTC + astc_block_desc blk; + memset(&blk, 0, sizeof(blk)); + + blk.m_dual_plane = false; + blk.m_weight_range = 2; + + blk.m_ccs = 0; + blk.m_subsets = 2; + blk.m_partition_seed = astc_pattern; + blk.m_cem = 8; + + const uint32_t p0 = 0; + const uint32_t p1 = 1; + + blk.m_endpoints[0] = ccell_results[p0].m_astc_low_endpoint.m_c[0]; + blk.m_endpoints[1] = ccell_results[p0].m_astc_high_endpoint.m_c[0]; + blk.m_endpoints[2] = ccell_results[p0].m_astc_low_endpoint.m_c[1]; + blk.m_endpoints[3] = ccell_results[p0].m_astc_high_endpoint.m_c[1]; + blk.m_endpoints[4] = ccell_results[p0].m_astc_low_endpoint.m_c[2]; + blk.m_endpoints[5] = ccell_results[p0].m_astc_high_endpoint.m_c[2]; + + bool invert[2] = { false, false }; + + int s0 = g_astc_unquant[endpoint_range][blk.m_endpoints[0]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[2]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[4]].m_unquant; + int s1 = g_astc_unquant[endpoint_range][blk.m_endpoints[1]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[3]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert[0] = true; + } + + blk.m_endpoints[6] = ccell_results[p1].m_astc_low_endpoint.m_c[0]; + blk.m_endpoints[7] = ccell_results[p1].m_astc_high_endpoint.m_c[0]; + blk.m_endpoints[8] = ccell_results[p1].m_astc_low_endpoint.m_c[1]; + blk.m_endpoints[9] = ccell_results[p1].m_astc_high_endpoint.m_c[1]; + blk.m_endpoints[10] = ccell_results[p1].m_astc_low_endpoint.m_c[2]; + blk.m_endpoints[11] = ccell_results[p1].m_astc_high_endpoint.m_c[2]; + + s0 = g_astc_unquant[endpoint_range][blk.m_endpoints[0 + 6]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[2 + 6]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[4 + 6]].m_unquant; + s1 = g_astc_unquant[endpoint_range][blk.m_endpoints[1 + 6]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[3 + 6]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[5 + 6]].m_unquant; + + if (s1 < s0) + { + std::swap(blk.m_endpoints[0 + 6], blk.m_endpoints[1 + 6]); + std::swap(blk.m_endpoints[2 + 6], blk.m_endpoints[3 + 6]); + std::swap(blk.m_endpoints[4 + 6], blk.m_endpoints[5 + 6]); + invert[1] = true; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t astc_part = bc7_convert_partition_index_3_to_2(g_bc7_partition3[16 * bc7_pattern + x + y * 4], common_pattern_k); + + blk.m_weights[x + y * 4] = ccell_result_selectors[astc_part][part_pixel_index[y][x]]; + + if (invert[astc_part]) + blk.m_weights[x + y * 4] = 3 - blk.m_weights[x + y * 4]; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = 7; + pResults[total_results].m_common_pattern = common_pattern; + pResults[total_results].m_astc = blk; + pResults[total_results].m_astc_err = total_part_err; + total_results++; + } + + } // common_pattern + } + + static void estimate_partition2_list(uint32_t num_weights, uint32_t num_comps, const uint32_t* pWeights, const color_rgba block[4][4], uint32_t* pParts, uint32_t max_parts, const uint32_t weights[4]) + { + assert(pWeights[0] == 0 && pWeights[num_weights - 1] == 64); + + const uint32_t MAX_PARTS = 8; + assert(max_parts <= MAX_PARTS); + + uint64_t part_error[MAX_PARTS]; + memset(part_error, 0xFF, sizeof(part_error)); + memset(pParts, 0, sizeof(pParts[0]) * max_parts); + + for (uint32_t common_pattern = 0; common_pattern < TOTAL_ASTC_BC7_COMMON_PARTITIONS2; common_pattern++) + { + const uint32_t bc7_pattern = g_astc_bc7_common_partitions2[common_pattern].m_bc7; + + const uint8_t* pPartition = &g_bc7_partition2[bc7_pattern * 16]; + + color_quad_u8 subset_colors[2][16]; + uint32_t subset_total_colors[2] = { 0, 0 }; + for (uint32_t index = 0; index < 16; index++) + subset_colors[pPartition[index]][subset_total_colors[pPartition[index]]++] = ((const color_quad_u8*)block)[index]; + + uint64_t total_subset_err = 0; + for (uint32_t subset = 0; subset < 2; subset++) + total_subset_err += color_cell_compression_est_astc(num_weights, num_comps, pWeights, subset_total_colors[subset], &subset_colors[subset][0], UINT64_MAX, weights); + + for (int i = 0; i < (int)max_parts; i++) + { + if (total_subset_err < part_error[i]) + { + for (int j = max_parts - 1; j > i; --j) + { + pParts[j] = pParts[j - 1]; + part_error[j] = part_error[j - 1]; + } + + pParts[i] = common_pattern; + part_error[i] = total_subset_err; + + break; + } + } + } + +#ifdef _DEBUG + for (uint32_t i = 0; i < max_parts - 1; i++) + { + assert(part_error[i] <= part_error[i + 1]); + } +#endif + } + + // 9. DualPlane: 0, WeightRange: 2 (4), Subsets: 2, CEM: 12 (RGBA Direct), EndpointRange: 8 (16) - BC7 MODE 7 + // 16. DualPlane: 0, WeightRange : 2 (4), Subsets : 2, CEM: 4 (LA Direct), EndpointRange : 20 (256) - BC7 MODE 7 + static void astc_mode9_or_16(uint32_t mode, const color_rgba source_block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params, uint32_t estimate_partition_list_size) + { + assert(mode == 9 || mode == 16); + + const color_rgba* pBlock = &source_block[0][0]; + + color_rgba temp_block[16]; + if (mode == 16) + { + for (uint32_t i = 0; i < 16; i++) + { + if (mode == 16) + { + assert(pBlock[i].r == pBlock[i].g); + assert(pBlock[i].r == pBlock[i].b); + } + + const uint32_t l = pBlock[i].r; + const uint32_t a = pBlock[i].a; + + // Use (l,0,0,a) not (l,l,l,a) so both components are treated equally. + temp_block[i].set_noclamp_rgba(l, 0, 0, a); + } + + pBlock = temp_block; + } + + const uint32_t weights[4] = { 1, 1, 1, 1 }; + + //const uint32_t weight_range = 2; + const uint32_t endpoint_range = (mode == 16) ? 20 : 8; + + uint32_t first_common_pattern = 0; + uint32_t last_common_pattern = TOTAL_ASTC_BC7_COMMON_PARTITIONS2; + bool use_part_list = false; + + const uint32_t MAX_PARTS = 8; + uint32_t parts[MAX_PARTS]; + + if (estimate_partition_list_size == 1) + { + first_common_pattern = estimate_partition2(4, 4, g_bc7_weights2, (const color_rgba(*)[4])pBlock, weights); + last_common_pattern = first_common_pattern + 1; + } + else if (estimate_partition_list_size > 0) + { + assert(estimate_partition_list_size <= MAX_PARTS); + estimate_partition_list_size = basisu::minimum(estimate_partition_list_size, MAX_PARTS); + + estimate_partition2_list(4, 4, g_bc7_weights2, (const color_rgba(*)[4])pBlock, parts, estimate_partition_list_size, weights); + + first_common_pattern = 0; + last_common_pattern = estimate_partition_list_size; + use_part_list = true; + +#ifdef _DEBUG + assert(parts[0] == estimate_partition2(4, 4, g_bc7_weights2, (const color_rgba(*)[4])pBlock, weights)); +#endif + } + + for (uint32_t common_pattern_iter = first_common_pattern; common_pattern_iter < last_common_pattern; common_pattern_iter++) + { + const uint32_t common_pattern = use_part_list ? parts[common_pattern_iter] : common_pattern_iter; + + const uint32_t bc7_pattern = g_astc_bc7_common_partitions2[common_pattern].m_bc7; + + color_rgba part_pixels[2][16]; + uint32_t part_pixel_index[4][4]; + uint32_t num_part_pixels[2] = { 0, 0 }; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t part = g_bc7_partition2[16 * bc7_pattern + x + y * 4]; + part_pixel_index[y][x] = num_part_pixels[part]; + part_pixels[part][num_part_pixels[part]++] = pBlock[y * 4 + x]; + } + } + + color_cell_compressor_params ccell_params[2]; + color_cell_compressor_results ccell_results[2]; + uint8_t ccell_result_selectors[2][16]; + uint8_t ccell_result_selectors_temp[2][16]; + + uint64_t total_err = 0; + for (uint32_t subset = 0; subset < 2; subset++) + { + memset(&ccell_params[subset], 0, sizeof(ccell_params[subset])); + + ccell_params[subset].m_num_pixels = num_part_pixels[subset]; + ccell_params[subset].m_pPixels = (color_quad_u8*)&part_pixels[subset][0]; + ccell_params[subset].m_num_selector_weights = 4; + ccell_params[subset].m_pSelector_weights = g_bc7_weights2; + ccell_params[subset].m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights2x; + ccell_params[subset].m_astc_endpoint_range = endpoint_range; + ccell_params[subset].m_weights[0] = weights[0]; + ccell_params[subset].m_weights[1] = weights[1]; + ccell_params[subset].m_weights[2] = weights[2]; + ccell_params[subset].m_weights[3] = weights[3]; + ccell_params[subset].m_has_alpha = true; + + memset(&ccell_results[subset], 0, sizeof(ccell_results[subset])); + ccell_results[subset].m_pSelectors = &ccell_result_selectors[subset][0]; + ccell_results[subset].m_pSelectors_temp = &ccell_result_selectors_temp[subset][0]; + + uint64_t subset_err = color_cell_compression(255, &ccell_params[subset], &ccell_results[subset], &comp_params); + + if (mode == 16) + { + color_rgba colors[4]; + for (uint32_t c = 0; c < 4; c++) + { + colors[0].m_comps[c] = g_astc_unquant[endpoint_range][ccell_results[subset].m_astc_low_endpoint.m_c[(c < 3) ? 0 : 3]].m_unquant; + colors[3].m_comps[c] = g_astc_unquant[endpoint_range][ccell_results[subset].m_astc_high_endpoint.m_c[(c < 3) ? 0 : 3]].m_unquant; + } + + for (uint32_t i = 1; i < 4 - 1; i++) + for (uint32_t c = 0; c < 4; c++) + colors[i].m_comps[c] = (uint8_t)astc_interpolate(colors[0].m_comps[c], colors[3].m_comps[c], g_bc7_weights2[i], false); + + for (uint32_t p = 0; p < ccell_params[subset].m_num_pixels; p++) + { + color_rgba orig_pix(part_pixels[subset][p]); + orig_pix.g = orig_pix.r; + orig_pix.b = orig_pix.r; + total_err += color_distance_la(orig_pix, colors[ccell_result_selectors[subset][p]]); + } + } + else + { + total_err += subset_err; + } + } // subset + + // ASTC + astc_block_desc astc_results; + memset(&astc_results, 0, sizeof(astc_results)); + + astc_results.m_dual_plane = false; + astc_results.m_weight_range = 2; + + astc_results.m_ccs = 0; + astc_results.m_subsets = 2; + astc_results.m_partition_seed = g_astc_bc7_common_partitions2[common_pattern].m_astc; + astc_results.m_cem = (mode == 16) ? 4 : 12; + + uint32_t part[2] = { 0, 1 }; + if (g_astc_bc7_common_partitions2[common_pattern].m_invert) + std::swap(part[0], part[1]); + + bool invert[2] = { false, false }; + + for (uint32_t p = 0; p < 2; p++) + { + if (mode == 16) + { + astc_results.m_endpoints[p * 4 + 0] = ccell_results[part[p]].m_astc_low_endpoint.m_c[0]; + astc_results.m_endpoints[p * 4 + 1] = ccell_results[part[p]].m_astc_high_endpoint.m_c[0]; + + astc_results.m_endpoints[p * 4 + 2] = ccell_results[part[p]].m_astc_low_endpoint.m_c[3]; + astc_results.m_endpoints[p * 4 + 3] = ccell_results[part[p]].m_astc_high_endpoint.m_c[3]; + } + else + { + for (uint32_t c = 0; c < 4; c++) + { + astc_results.m_endpoints[p * 8 + c * 2] = ccell_results[part[p]].m_astc_low_endpoint.m_c[c]; + astc_results.m_endpoints[p * 8 + c * 2 + 1] = ccell_results[part[p]].m_astc_high_endpoint.m_c[c]; + } + + int s0 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[p * 8 + 0]].m_unquant + + g_astc_unquant[endpoint_range][astc_results.m_endpoints[p * 8 + 2]].m_unquant + + g_astc_unquant[endpoint_range][astc_results.m_endpoints[p * 8 + 4]].m_unquant; + + int s1 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[p * 8 + 1]].m_unquant + + g_astc_unquant[endpoint_range][astc_results.m_endpoints[p * 8 + 3]].m_unquant + + g_astc_unquant[endpoint_range][astc_results.m_endpoints[p * 8 + 5]].m_unquant; + + if (s1 < s0) + { + std::swap(astc_results.m_endpoints[p * 8 + 0], astc_results.m_endpoints[p * 8 + 1]); + std::swap(astc_results.m_endpoints[p * 8 + 2], astc_results.m_endpoints[p * 8 + 3]); + std::swap(astc_results.m_endpoints[p * 8 + 4], astc_results.m_endpoints[p * 8 + 5]); + std::swap(astc_results.m_endpoints[p * 8 + 6], astc_results.m_endpoints[p * 8 + 7]); + invert[p] = true; + } + } + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t bc7_part = g_bc7_partition2[16 * bc7_pattern + x + y * 4]; + + astc_results.m_weights[x + y * 4] = ccell_result_selectors[bc7_part][part_pixel_index[y][x]]; + + uint32_t astc_part = bc7_part; + if (g_astc_bc7_common_partitions2[common_pattern].m_invert) + astc_part = 1 - astc_part; + + if (invert[astc_part]) + astc_results.m_weights[x + y * 4] = 3 - astc_results.m_weights[x + y * 4]; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = mode; + pResults[total_results].m_common_pattern = common_pattern; + pResults[total_results].m_astc = astc_results; + pResults[total_results].m_astc_err = total_err; + total_results++; + } + + } // common_pattern + } + + // MODE 10 + // DualPlane: 0, WeightRange: 8 (16), Subsets: 1, CEM: 12 (RGBA Direct ), EndpointRange: 13 (48) MODE6 + static void astc_mode10(const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params) + { + const uint32_t weight_range = 8; + const uint32_t endpoint_range = 13; + + color_cell_compressor_params ccell_params; + memset(&ccell_params, 0, sizeof(ccell_params)); + + ccell_params.m_num_pixels = 16; + ccell_params.m_pPixels = (color_quad_u8*)&block[0][0]; + ccell_params.m_num_selector_weights = 16; + ccell_params.m_pSelector_weights = g_astc_weights4; + ccell_params.m_pSelector_weightsx = (const bc7enc_vec4F*)g_astc_weights4x; + ccell_params.m_astc_endpoint_range = endpoint_range; + ccell_params.m_weights[0] = 1; + ccell_params.m_weights[1] = 1; + ccell_params.m_weights[2] = 1; + ccell_params.m_weights[3] = 1; + ccell_params.m_has_alpha = true; + + color_cell_compressor_results ccell_results; + uint8_t ccell_result_selectors[16]; + uint8_t ccell_result_selectors_temp[16]; + memset(&ccell_results, 0, sizeof(ccell_results)); + ccell_results.m_pSelectors = &ccell_result_selectors[0]; + ccell_results.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + uint64_t part_err = color_cell_compression(255, &ccell_params, &ccell_results, &comp_params); + + // ASTC + astc_block_desc astc_results; + memset(&astc_results, 0, sizeof(astc_results)); + + astc_results.m_dual_plane = false; + astc_results.m_weight_range = weight_range; + + astc_results.m_ccs = 0; + astc_results.m_subsets = 1; + astc_results.m_partition_seed = 0; + astc_results.m_cem = 12; + + astc_results.m_endpoints[0] = ccell_results.m_astc_low_endpoint.m_c[0]; + astc_results.m_endpoints[1] = ccell_results.m_astc_high_endpoint.m_c[0]; + astc_results.m_endpoints[2] = ccell_results.m_astc_low_endpoint.m_c[1]; + astc_results.m_endpoints[3] = ccell_results.m_astc_high_endpoint.m_c[1]; + astc_results.m_endpoints[4] = ccell_results.m_astc_low_endpoint.m_c[2]; + astc_results.m_endpoints[5] = ccell_results.m_astc_high_endpoint.m_c[2]; + astc_results.m_endpoints[6] = ccell_results.m_astc_low_endpoint.m_c[3]; + astc_results.m_endpoints[7] = ccell_results.m_astc_high_endpoint.m_c[3]; + + bool invert = false; + + int s0 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[0]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[2]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[4]].m_unquant; + int s1 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[1]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[3]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(astc_results.m_endpoints[0], astc_results.m_endpoints[1]); + std::swap(astc_results.m_endpoints[2], astc_results.m_endpoints[3]); + std::swap(astc_results.m_endpoints[4], astc_results.m_endpoints[5]); + std::swap(astc_results.m_endpoints[6], astc_results.m_endpoints[7]); + invert = true; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + astc_results.m_weights[x + y * 4] = ccell_result_selectors[x + y * 4]; + + if (invert) + astc_results.m_weights[x + y * 4] = 15 - astc_results.m_weights[x + y * 4]; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = 10; + pResults[total_results].m_common_pattern = 0; + pResults[total_results].m_astc = astc_results; + pResults[total_results].m_astc_err = part_err; + total_results++; + } + } + + // 11. DualPlane: 1, WeightRange: 2 (4), Subsets: 1, CEM: 12 (RGBA Direct), EndpointRange: 13 (48) MODE5 + // 17. DualPlane: 1, WeightRange : 2 (4), Subsets : 1, CEM : 4 (LA Direct), EndpointRange : 20 (256) BC7 MODE5 + static void astc_mode11_or_17(uint32_t mode, const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params) + { + assert((mode == 11) || (mode == 17)); + + const uint32_t weight_range = 2; + const uint32_t endpoint_range = (mode == 17) ? 20 : 13; + + bc7enc_compress_block_params local_comp_params(comp_params); + local_comp_params.m_perceptual = false; + local_comp_params.m_weights[0] = 1; + local_comp_params.m_weights[1] = 1; + local_comp_params.m_weights[2] = 1; + local_comp_params.m_weights[3] = 1; + + const uint32_t last_rot_comp = (mode == 17) ? 1 : 4; + + for (uint32_t rot_comp = 0; rot_comp < last_rot_comp; rot_comp++) + { + color_quad_u8 block_rgb[16]; + color_quad_u8 block_a[16]; + for (uint32_t i = 0; i < 16; i++) + { + block_rgb[i] = ((color_quad_u8*)&block[0][0])[i]; + block_a[i] = block_rgb[i]; + + if (mode == 17) + { + assert(block_rgb[i].m_c[0] == block_rgb[i].m_c[1]); + assert(block_rgb[i].m_c[0] == block_rgb[i].m_c[2]); + + block_a[i].m_c[0] = block_rgb[i].m_c[3]; + block_a[i].m_c[1] = block_rgb[i].m_c[3]; + block_a[i].m_c[2] = block_rgb[i].m_c[3]; + block_a[i].m_c[3] = 255; + + block_rgb[i].m_c[1] = block_rgb[i].m_c[0]; + block_rgb[i].m_c[2] = block_rgb[i].m_c[0]; + block_rgb[i].m_c[3] = 255; + } + else + { + uint8_t c = block_a[i].m_c[rot_comp]; + block_a[i].m_c[0] = c; + block_a[i].m_c[1] = c; + block_a[i].m_c[2] = c; + block_a[i].m_c[3] = 255; + + block_rgb[i].m_c[rot_comp] = block_rgb[i].m_c[3]; + block_rgb[i].m_c[3] = 255; + } + } + + uint8_t ccell_result_selectors_temp[16]; + + color_cell_compressor_params ccell_params_rgb; + memset(&ccell_params_rgb, 0, sizeof(ccell_params_rgb)); + + ccell_params_rgb.m_num_pixels = 16; + ccell_params_rgb.m_pPixels = block_rgb; + ccell_params_rgb.m_num_selector_weights = 4; + ccell_params_rgb.m_pSelector_weights = g_bc7_weights2; + ccell_params_rgb.m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights2x; + ccell_params_rgb.m_astc_endpoint_range = endpoint_range; + ccell_params_rgb.m_weights[0] = 1; + ccell_params_rgb.m_weights[1] = 1; + ccell_params_rgb.m_weights[2] = 1; + ccell_params_rgb.m_weights[3] = 1; + + color_cell_compressor_results ccell_results_rgb; + uint8_t ccell_result_selectors_rgb[16]; + memset(&ccell_results_rgb, 0, sizeof(ccell_results_rgb)); + ccell_results_rgb.m_pSelectors = &ccell_result_selectors_rgb[0]; + ccell_results_rgb.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + uint64_t part_err_rgb = color_cell_compression(255, &ccell_params_rgb, &ccell_results_rgb, &local_comp_params); + + color_cell_compressor_params ccell_params_a; + memset(&ccell_params_a, 0, sizeof(ccell_params_a)); + + ccell_params_a.m_num_pixels = 16; + ccell_params_a.m_pPixels = block_a; + ccell_params_a.m_num_selector_weights = 4; + ccell_params_a.m_pSelector_weights = g_bc7_weights2; + ccell_params_a.m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights2x; + ccell_params_a.m_astc_endpoint_range = endpoint_range; + ccell_params_a.m_weights[0] = 1; + ccell_params_a.m_weights[1] = 1; + ccell_params_a.m_weights[2] = 1; + ccell_params_a.m_weights[3] = 1; + + color_cell_compressor_results ccell_results_a; + uint8_t ccell_result_selectors_a[16]; + memset(&ccell_results_a, 0, sizeof(ccell_results_a)); + ccell_results_a.m_pSelectors = &ccell_result_selectors_a[0]; + ccell_results_a.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + uint64_t part_err_a = color_cell_compression(255, &ccell_params_a, &ccell_results_a, &local_comp_params) / 3; + + uint64_t total_err = (mode == 17) ? ((part_err_rgb / 3) + part_err_a) : (part_err_rgb + part_err_a); + + // ASTC + astc_block_desc blk; + memset(&blk, 0, sizeof(blk)); + + blk.m_dual_plane = true; + blk.m_weight_range = weight_range; + + blk.m_ccs = (mode == 17) ? 3 : rot_comp; + blk.m_subsets = 1; + blk.m_partition_seed = 0; + blk.m_cem = (mode == 17) ? 4 : 12; + + bool invert = false; + + if (mode == 17) + { + assert(ccell_results_rgb.m_astc_low_endpoint.m_c[0] == ccell_results_rgb.m_astc_low_endpoint.m_c[1]); + assert(ccell_results_rgb.m_astc_low_endpoint.m_c[0] == ccell_results_rgb.m_astc_low_endpoint.m_c[2]); + + assert(ccell_results_rgb.m_astc_high_endpoint.m_c[0] == ccell_results_rgb.m_astc_high_endpoint.m_c[1]); + assert(ccell_results_rgb.m_astc_high_endpoint.m_c[0] == ccell_results_rgb.m_astc_high_endpoint.m_c[2]); + + blk.m_endpoints[0] = ccell_results_rgb.m_astc_low_endpoint.m_c[0]; + blk.m_endpoints[1] = ccell_results_rgb.m_astc_high_endpoint.m_c[0]; + + blk.m_endpoints[2] = ccell_results_a.m_astc_low_endpoint.m_c[0]; + blk.m_endpoints[3] = ccell_results_a.m_astc_high_endpoint.m_c[0]; + } + else + { + blk.m_endpoints[0] = (rot_comp == 0 ? ccell_results_a : ccell_results_rgb).m_astc_low_endpoint.m_c[0]; + blk.m_endpoints[1] = (rot_comp == 0 ? ccell_results_a : ccell_results_rgb).m_astc_high_endpoint.m_c[0]; + blk.m_endpoints[2] = (rot_comp == 1 ? ccell_results_a : ccell_results_rgb).m_astc_low_endpoint.m_c[1]; + blk.m_endpoints[3] = (rot_comp == 1 ? ccell_results_a : ccell_results_rgb).m_astc_high_endpoint.m_c[1]; + blk.m_endpoints[4] = (rot_comp == 2 ? ccell_results_a : ccell_results_rgb).m_astc_low_endpoint.m_c[2]; + blk.m_endpoints[5] = (rot_comp == 2 ? ccell_results_a : ccell_results_rgb).m_astc_high_endpoint.m_c[2]; + if (rot_comp == 3) + { + blk.m_endpoints[6] = ccell_results_a.m_astc_low_endpoint.m_c[0]; + blk.m_endpoints[7] = ccell_results_a.m_astc_high_endpoint.m_c[0]; + } + else + { + blk.m_endpoints[6] = ccell_results_rgb.m_astc_low_endpoint.m_c[rot_comp]; + blk.m_endpoints[7] = ccell_results_rgb.m_astc_high_endpoint.m_c[rot_comp]; + } + + int s0 = g_astc_unquant[endpoint_range][blk.m_endpoints[0]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[2]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[4]].m_unquant; + int s1 = g_astc_unquant[endpoint_range][blk.m_endpoints[1]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[3]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + std::swap(blk.m_endpoints[6], blk.m_endpoints[7]); + invert = true; + } + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t rgb_index = ccell_result_selectors_rgb[x + y * 4]; + uint32_t a_index = ccell_result_selectors_a[x + y * 4]; + + if (invert) + { + rgb_index = 3 - rgb_index; + a_index = 3 - a_index; + } + + blk.m_weights[(x + y * 4) * 2 + 0] = (uint8_t)rgb_index; + blk.m_weights[(x + y * 4) * 2 + 1] = (uint8_t)a_index; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = mode; + pResults[total_results].m_common_pattern = 0; + pResults[total_results].m_astc = blk; + pResults[total_results].m_astc_err = total_err; + total_results++; + } + } // rot_comp + } + + // MODE 12 + // DualPlane: 0, WeightRange: 5 (8), Subsets: 1, CEM: 12 (RGBA Direct ), EndpointRange: 19 (192) MODE6 + static void astc_mode12(const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params) + { + const uint32_t weight_range = 5; + const uint32_t endpoint_range = 19; + + color_cell_compressor_params ccell_params; + memset(&ccell_params, 0, sizeof(ccell_params)); + + ccell_params.m_num_pixels = 16; + ccell_params.m_pPixels = (color_quad_u8*)&block[0][0]; + ccell_params.m_num_selector_weights = 8; + ccell_params.m_pSelector_weights = g_bc7_weights3; + ccell_params.m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights3x; + ccell_params.m_astc_endpoint_range = endpoint_range; + ccell_params.m_weights[0] = 1; + ccell_params.m_weights[1] = 1; + ccell_params.m_weights[2] = 1; + ccell_params.m_weights[3] = 1; + ccell_params.m_has_alpha = true; + + color_cell_compressor_results ccell_results; + uint8_t ccell_result_selectors[16]; + uint8_t ccell_result_selectors_temp[16]; + memset(&ccell_results, 0, sizeof(ccell_results)); + ccell_results.m_pSelectors = &ccell_result_selectors[0]; + ccell_results.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + uint64_t part_err = color_cell_compression(255, &ccell_params, &ccell_results, &comp_params); + + // ASTC + astc_block_desc astc_results; + memset(&astc_results, 0, sizeof(astc_results)); + + astc_results.m_dual_plane = false; + astc_results.m_weight_range = weight_range; + + astc_results.m_ccs = 0; + astc_results.m_subsets = 1; + astc_results.m_partition_seed = 0; + astc_results.m_cem = 12; + + astc_results.m_endpoints[0] = ccell_results.m_astc_low_endpoint.m_c[0]; + astc_results.m_endpoints[1] = ccell_results.m_astc_high_endpoint.m_c[0]; + astc_results.m_endpoints[2] = ccell_results.m_astc_low_endpoint.m_c[1]; + astc_results.m_endpoints[3] = ccell_results.m_astc_high_endpoint.m_c[1]; + astc_results.m_endpoints[4] = ccell_results.m_astc_low_endpoint.m_c[2]; + astc_results.m_endpoints[5] = ccell_results.m_astc_high_endpoint.m_c[2]; + astc_results.m_endpoints[6] = ccell_results.m_astc_low_endpoint.m_c[3]; + astc_results.m_endpoints[7] = ccell_results.m_astc_high_endpoint.m_c[3]; + + bool invert = false; + + int s0 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[0]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[2]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[4]].m_unquant; + int s1 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[1]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[3]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(astc_results.m_endpoints[0], astc_results.m_endpoints[1]); + std::swap(astc_results.m_endpoints[2], astc_results.m_endpoints[3]); + std::swap(astc_results.m_endpoints[4], astc_results.m_endpoints[5]); + std::swap(astc_results.m_endpoints[6], astc_results.m_endpoints[7]); + invert = true; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + astc_results.m_weights[x + y * 4] = ccell_result_selectors[x + y * 4]; + + if (invert) + astc_results.m_weights[x + y * 4] = 7 - astc_results.m_weights[x + y * 4]; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = 12; + pResults[total_results].m_common_pattern = 0; + pResults[total_results].m_astc = astc_results; + pResults[total_results].m_astc_err = part_err; + total_results++; + } + } + + // 13. DualPlane: 1, WeightRange: 0 (2), Subsets: 1, CEM: 12 (RGBA Direct ), EndpointRange: 20 (256) MODE5 + static void astc_mode13(const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params) + { + bc7enc_compress_block_params local_comp_params(comp_params); + local_comp_params.m_perceptual = false; + local_comp_params.m_weights[0] = 1; + local_comp_params.m_weights[1] = 1; + local_comp_params.m_weights[2] = 1; + local_comp_params.m_weights[3] = 1; + + for (uint32_t rot_comp = 0; rot_comp < 4; rot_comp++) + { + const uint32_t weight_range = 0; + const uint32_t endpoint_range = 20; + + color_quad_u8 block_rgb[16]; + color_quad_u8 block_a[16]; + for (uint32_t i = 0; i < 16; i++) + { + block_rgb[i] = ((color_quad_u8*)&block[0][0])[i]; + block_a[i] = block_rgb[i]; + + uint8_t c = block_a[i].m_c[rot_comp]; + block_a[i].m_c[0] = c; + block_a[i].m_c[1] = c; + block_a[i].m_c[2] = c; + block_a[i].m_c[3] = 255; + + block_rgb[i].m_c[rot_comp] = block_rgb[i].m_c[3]; + block_rgb[i].m_c[3] = 255; + } + + uint8_t ccell_result_selectors_temp[16]; + + color_cell_compressor_params ccell_params_rgb; + memset(&ccell_params_rgb, 0, sizeof(ccell_params_rgb)); + + ccell_params_rgb.m_num_pixels = 16; + ccell_params_rgb.m_pPixels = block_rgb; + ccell_params_rgb.m_num_selector_weights = 2; + ccell_params_rgb.m_pSelector_weights = g_bc7_weights1; + ccell_params_rgb.m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights1x; + ccell_params_rgb.m_astc_endpoint_range = endpoint_range; + ccell_params_rgb.m_weights[0] = 1; + ccell_params_rgb.m_weights[1] = 1; + ccell_params_rgb.m_weights[2] = 1; + ccell_params_rgb.m_weights[3] = 1; + + color_cell_compressor_results ccell_results_rgb; + uint8_t ccell_result_selectors_rgb[16]; + memset(&ccell_results_rgb, 0, sizeof(ccell_results_rgb)); + ccell_results_rgb.m_pSelectors = &ccell_result_selectors_rgb[0]; + ccell_results_rgb.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + uint64_t part_err_rgb = color_cell_compression(255, &ccell_params_rgb, &ccell_results_rgb, &local_comp_params); + + color_cell_compressor_params ccell_params_a; + memset(&ccell_params_a, 0, sizeof(ccell_params_a)); + + ccell_params_a.m_num_pixels = 16; + ccell_params_a.m_pPixels = block_a; + ccell_params_a.m_num_selector_weights = 2; + ccell_params_a.m_pSelector_weights = g_bc7_weights1; + ccell_params_a.m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights1x; + ccell_params_a.m_astc_endpoint_range = endpoint_range; + ccell_params_a.m_weights[0] = 1; + ccell_params_a.m_weights[1] = 1; + ccell_params_a.m_weights[2] = 1; + ccell_params_a.m_weights[3] = 1; + + color_cell_compressor_results ccell_results_a; + uint8_t ccell_result_selectors_a[16]; + memset(&ccell_results_a, 0, sizeof(ccell_results_a)); + ccell_results_a.m_pSelectors = &ccell_result_selectors_a[0]; + ccell_results_a.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + uint64_t part_err_a = color_cell_compression(255, &ccell_params_a, &ccell_results_a, &local_comp_params) / 3; + + uint64_t total_err = part_err_rgb + part_err_a; + + // ASTC + astc_block_desc blk; + memset(&blk, 0, sizeof(blk)); + + blk.m_dual_plane = true; + blk.m_weight_range = weight_range; + + blk.m_ccs = rot_comp; + blk.m_subsets = 1; + blk.m_partition_seed = 0; + blk.m_cem = 12; + + blk.m_endpoints[0] = (rot_comp == 0 ? ccell_results_a : ccell_results_rgb).m_astc_low_endpoint.m_c[0]; + blk.m_endpoints[1] = (rot_comp == 0 ? ccell_results_a : ccell_results_rgb).m_astc_high_endpoint.m_c[0]; + blk.m_endpoints[2] = (rot_comp == 1 ? ccell_results_a : ccell_results_rgb).m_astc_low_endpoint.m_c[1]; + blk.m_endpoints[3] = (rot_comp == 1 ? ccell_results_a : ccell_results_rgb).m_astc_high_endpoint.m_c[1]; + blk.m_endpoints[4] = (rot_comp == 2 ? ccell_results_a : ccell_results_rgb).m_astc_low_endpoint.m_c[2]; + blk.m_endpoints[5] = (rot_comp == 2 ? ccell_results_a : ccell_results_rgb).m_astc_high_endpoint.m_c[2]; + if (rot_comp == 3) + { + blk.m_endpoints[6] = ccell_results_a.m_astc_low_endpoint.m_c[0]; + blk.m_endpoints[7] = ccell_results_a.m_astc_high_endpoint.m_c[0]; + } + else + { + blk.m_endpoints[6] = ccell_results_rgb.m_astc_low_endpoint.m_c[rot_comp]; + blk.m_endpoints[7] = ccell_results_rgb.m_astc_high_endpoint.m_c[rot_comp]; + } + + bool invert = false; + + int s0 = g_astc_unquant[endpoint_range][blk.m_endpoints[0]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[2]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[4]].m_unquant; + int s1 = g_astc_unquant[endpoint_range][blk.m_endpoints[1]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[3]].m_unquant + g_astc_unquant[endpoint_range][blk.m_endpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + std::swap(blk.m_endpoints[6], blk.m_endpoints[7]); + invert = true; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t rgb_index = ccell_result_selectors_rgb[x + y * 4]; + uint32_t a_index = ccell_result_selectors_a[x + y * 4]; + + if (invert) + { + rgb_index = 1 - rgb_index; + a_index = 1 - a_index; + } + + blk.m_weights[(x + y * 4) * 2 + 0] = (uint8_t)rgb_index; + blk.m_weights[(x + y * 4) * 2 + 1] = (uint8_t)a_index; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = 13; + pResults[total_results].m_common_pattern = 0; + pResults[total_results].m_astc = blk; + pResults[total_results].m_astc_err = total_err; + total_results++; + } + } // rot_comp + } + + // MODE14 + // DualPlane: 0, WeightRange: 2 (4), Subsets: 1, CEM: 12 (RGBA Direct ), EndpointRange: 20 (256) MODE6 + static void astc_mode14(const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params) + { + const uint32_t weight_range = 2; + const uint32_t endpoint_range = 20; + + color_cell_compressor_params ccell_params; + memset(&ccell_params, 0, sizeof(ccell_params)); + + ccell_params.m_num_pixels = 16; + ccell_params.m_pPixels = (color_quad_u8*)&block[0][0]; + ccell_params.m_num_selector_weights = 4; + ccell_params.m_pSelector_weights = g_bc7_weights2; + ccell_params.m_pSelector_weightsx = (const bc7enc_vec4F*)g_bc7_weights2x; + ccell_params.m_astc_endpoint_range = endpoint_range; + ccell_params.m_weights[0] = 1; + ccell_params.m_weights[1] = 1; + ccell_params.m_weights[2] = 1; + ccell_params.m_weights[3] = 1; + ccell_params.m_has_alpha = true; + + color_cell_compressor_results ccell_results; + uint8_t ccell_result_selectors[16]; + uint8_t ccell_result_selectors_temp[16]; + memset(&ccell_results, 0, sizeof(ccell_results)); + ccell_results.m_pSelectors = &ccell_result_selectors[0]; + ccell_results.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + uint64_t part_err = color_cell_compression(255, &ccell_params, &ccell_results, &comp_params); + + // ASTC + astc_block_desc astc_results; + memset(&astc_results, 0, sizeof(astc_results)); + + astc_results.m_dual_plane = false; + astc_results.m_weight_range = weight_range; + + astc_results.m_ccs = 0; + astc_results.m_subsets = 1; + astc_results.m_partition_seed = 0; + astc_results.m_cem = 12; + + astc_results.m_endpoints[0] = ccell_results.m_astc_low_endpoint.m_c[0]; + astc_results.m_endpoints[1] = ccell_results.m_astc_high_endpoint.m_c[0]; + astc_results.m_endpoints[2] = ccell_results.m_astc_low_endpoint.m_c[1]; + astc_results.m_endpoints[3] = ccell_results.m_astc_high_endpoint.m_c[1]; + astc_results.m_endpoints[4] = ccell_results.m_astc_low_endpoint.m_c[2]; + astc_results.m_endpoints[5] = ccell_results.m_astc_high_endpoint.m_c[2]; + astc_results.m_endpoints[6] = ccell_results.m_astc_low_endpoint.m_c[3]; + astc_results.m_endpoints[7] = ccell_results.m_astc_high_endpoint.m_c[3]; + + bool invert = false; + + int s0 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[0]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[2]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[4]].m_unquant; + int s1 = g_astc_unquant[endpoint_range][astc_results.m_endpoints[1]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[3]].m_unquant + g_astc_unquant[endpoint_range][astc_results.m_endpoints[5]].m_unquant; + if (s1 < s0) + { + std::swap(astc_results.m_endpoints[0], astc_results.m_endpoints[1]); + std::swap(astc_results.m_endpoints[2], astc_results.m_endpoints[3]); + std::swap(astc_results.m_endpoints[4], astc_results.m_endpoints[5]); + std::swap(astc_results.m_endpoints[6], astc_results.m_endpoints[7]); + invert = true; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + astc_results.m_weights[x + y * 4] = ccell_result_selectors[x + y * 4]; + + if (invert) + astc_results.m_weights[x + y * 4] = 3 - astc_results.m_weights[x + y * 4]; + } + } + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = 14; + pResults[total_results].m_common_pattern = 0; + pResults[total_results].m_astc = astc_results; + pResults[total_results].m_astc_err = part_err; + total_results++; + } + } + + // MODE 15 + // DualPlane: 0, WeightRange : 8 (16), Subsets : 1, CEM : 4 (LA Direct), EndpointRange : 20 (256) BC7 MODE6 + static void astc_mode15(const color_rgba block[4][4], uastc_encode_results* pResults, uint32_t& total_results, bc7enc_compress_block_params& comp_params) + { + const uint32_t weight_range = 8; + const uint32_t endpoint_range = 20; + + color_cell_compressor_params ccell_params; + memset(&ccell_params, 0, sizeof(ccell_params)); + + color_rgba temp_block[16]; + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t l = ((const color_rgba*)block)[i].r; + const uint32_t a = ((const color_rgba*)block)[i].a; + + // Use (l,0,0,a) not (l,l,l,a) so both components are treated equally. + temp_block[i].set_noclamp_rgba(l, 0, 0, a); + } + + ccell_params.m_num_pixels = 16; + //ccell_params.m_pPixels = (color_quad_u8*)&block[0][0]; + ccell_params.m_pPixels = (color_quad_u8*)temp_block; + ccell_params.m_num_selector_weights = 16; + ccell_params.m_pSelector_weights = g_astc_weights4; + ccell_params.m_pSelector_weightsx = (const bc7enc_vec4F*)g_astc_weights4x; + ccell_params.m_astc_endpoint_range = endpoint_range; + ccell_params.m_weights[0] = 1; + ccell_params.m_weights[1] = 1; + ccell_params.m_weights[2] = 1; + ccell_params.m_weights[3] = 1; + ccell_params.m_has_alpha = true; + + color_cell_compressor_results ccell_results; + uint8_t ccell_result_selectors[16]; + uint8_t ccell_result_selectors_temp[16]; + memset(&ccell_results, 0, sizeof(ccell_results)); + ccell_results.m_pSelectors = &ccell_result_selectors[0]; + ccell_results.m_pSelectors_temp = &ccell_result_selectors_temp[0]; + + color_cell_compression(255, &ccell_params, &ccell_results, &comp_params); + + // ASTC + astc_block_desc astc_results; + memset(&astc_results, 0, sizeof(astc_results)); + + astc_results.m_dual_plane = false; + astc_results.m_weight_range = weight_range; + + astc_results.m_ccs = 0; + astc_results.m_subsets = 1; + astc_results.m_partition_seed = 0; + astc_results.m_cem = 4; + + astc_results.m_endpoints[0] = ccell_results.m_astc_low_endpoint.m_c[0]; + astc_results.m_endpoints[1] = ccell_results.m_astc_high_endpoint.m_c[0]; + + astc_results.m_endpoints[2] = ccell_results.m_astc_low_endpoint.m_c[3]; + astc_results.m_endpoints[3] = ccell_results.m_astc_high_endpoint.m_c[3]; + + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + astc_results.m_weights[x + y * 4] = ccell_result_selectors[x + y * 4]; + + color_rgba colors[16]; + for (uint32_t c = 0; c < 4; c++) + { + colors[0].m_comps[c] = g_astc_unquant[endpoint_range][ccell_results.m_astc_low_endpoint.m_c[(c < 3) ? 0 : 3]].m_unquant; + colors[15].m_comps[c] = g_astc_unquant[endpoint_range][ccell_results.m_astc_high_endpoint.m_c[(c < 3) ? 0 : 3]].m_unquant; + } + + for (uint32_t i = 1; i < 16 - 1; i++) + for (uint32_t c = 0; c < 4; c++) + colors[i].m_comps[c] = (uint8_t)astc_interpolate(colors[0].m_comps[c], colors[15].m_comps[c], g_astc_weights4[i], false); + + uint64_t total_err = 0; + for (uint32_t p = 0; p < 16; p++) + total_err += color_distance_la(((const color_rgba*)block)[p], colors[ccell_result_selectors[p]]); + + assert(total_results < MAX_ENCODE_RESULTS); + if (total_results < MAX_ENCODE_RESULTS) + { + pResults[total_results].m_uastc_mode = 15; + pResults[total_results].m_common_pattern = 0; + pResults[total_results].m_astc = astc_results; + pResults[total_results].m_astc_err = total_err; + total_results++; + } + } + + static void compute_block_error(const color_rgba block[4][4], const color_rgba decoded_block[4][4], uint64_t &total_rgb_err, uint64_t &total_rgba_err, uint64_t &total_la_err) + { + uint64_t total_err_r = 0, total_err_g = 0, total_err_b = 0, total_err_a = 0; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const int dr = (int)block[y][x].m_comps[0] - (int)decoded_block[y][x].m_comps[0]; + const int dg = (int)block[y][x].m_comps[1] - (int)decoded_block[y][x].m_comps[1]; + const int db = (int)block[y][x].m_comps[2] - (int)decoded_block[y][x].m_comps[2]; + const int da = (int)block[y][x].m_comps[3] - (int)decoded_block[y][x].m_comps[3]; + + total_err_r += dr * dr; + total_err_g += dg * dg; + total_err_b += db * db; + total_err_a += da * da; + } + } + + total_la_err = total_err_r + total_err_a; + total_rgb_err = total_err_r + total_err_g + total_err_b; + total_rgba_err = total_rgb_err + total_err_a; + } + + static void compute_bc1_hints(bool &bc1_hint0, bool &bc1_hint1, const uastc_encode_results &best_results, const color_rgba block[4][4], const color_rgba decoded_uastc_block[4][4]) + { + const uint32_t best_mode = best_results.m_uastc_mode; + const bool perceptual = false; + + bc1_hint0 = false; + bc1_hint1 = false; + + if (best_mode == UASTC_MODE_INDEX_SOLID_COLOR) + return; + + if (!g_uastc_mode_has_bc1_hint0[best_mode] && !g_uastc_mode_has_bc1_hint1[best_mode]) + return; + + color_rgba tblock_bc1[4][4]; + dxt1_block tbc1_block[8]; + basist::encode_bc1(tbc1_block, (const uint8_t*)&decoded_uastc_block[0][0], 0); + unpack_block(texture_format::cBC1, tbc1_block, &tblock_bc1[0][0]); + + color_rgba tblock_hint0_bc1[4][4]; + color_rgba tblock_hint1_bc1[4][4]; + + etc_block etc1_blk; + memset(&etc1_blk, 0, sizeof(etc1_blk)); + + eac_a8_block etc2_blk; + memset(&etc2_blk, 0, sizeof(etc2_blk)); + etc2_blk.m_multiplier = 1; + + // Pack to UASTC, then unpack, because the endpoints may be swapped. + + uastc_block temp_ublock; + pack_uastc(temp_ublock, best_results, etc1_blk, 0, etc2_blk, false, false); + + unpacked_uastc_block temp_ublock_unpacked; + unpack_uastc(temp_ublock, temp_ublock_unpacked, false); + + unpacked_uastc_block ublock = {}; + ublock.m_mode = best_results.m_uastc_mode; + ublock.m_common_pattern = best_results.m_common_pattern; + ublock.m_astc = temp_ublock_unpacked.m_astc; + + dxt1_block b; + + // HINT1 + if (!g_uastc_mode_has_bc1_hint1[best_mode]) + { + memset(tblock_hint1_bc1, 0, sizeof(tblock_hint1_bc1)); + } + else + { + transcode_uastc_to_bc1_hint1(ublock, (color32 (*)[4]) decoded_uastc_block, &b, false); + + unpack_block(texture_format::cBC1, &b, &tblock_hint1_bc1[0][0]); + } + + // HINT0 + if (!g_uastc_mode_has_bc1_hint0[best_mode]) + { + memset(tblock_hint0_bc1, 0, sizeof(tblock_hint0_bc1)); + } + else + { + transcode_uastc_to_bc1_hint0(ublock, &b); + + unpack_block(texture_format::cBC1, &b, &tblock_hint0_bc1[0][0]); + } + + // Compute block errors + uint64_t total_t_err = 0, total_hint0_err = 0, total_hint1_err = 0; + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + total_t_err += color_distance(perceptual, block[y][x], tblock_bc1[y][x], false); + total_hint0_err += color_distance(perceptual, block[y][x], tblock_hint0_bc1[y][x], false); + total_hint1_err += color_distance(perceptual, block[y][x], tblock_hint1_bc1[y][x], false); + } + } + + const float t_err = sqrtf((float)total_t_err); + const float t_err_hint0 = sqrtf((float)total_hint0_err); + const float t_err_hint1 = sqrtf((float)total_hint1_err); + + const float err_thresh0 = 1.075f; + const float err_thresh1 = 1.075f; + + if ((g_uastc_mode_has_bc1_hint0[best_mode]) && (t_err_hint0 <= t_err * err_thresh0)) + bc1_hint0 = true; + + if ((g_uastc_mode_has_bc1_hint1[best_mode]) && (t_err_hint1 <= t_err * err_thresh1)) + bc1_hint1 = true; + } + + struct ycbcr + { + int32_t m_y; + int32_t m_cb; + int32_t m_cr; + }; + + static inline void rgb_to_y_cb_cr(const color_rgba& c, ycbcr& dst) + { + const int y = c.r * 54 + c.g * 183 + c.b * 19; + dst.m_y = y; + dst.m_cb = (c.b << 8) - y; + dst.m_cr = (c.r << 8) - y; + } + + static inline uint64_t color_diff(const ycbcr& a, const ycbcr& b) + { + const int y_delta = a.m_y - b.m_y; + const int cb_delta = a.m_cb - b.m_cb; + const int cr_delta = a.m_cr - b.m_cr; + return ((int64_t)y_delta * y_delta * 4) + ((int64_t)cr_delta * cr_delta) + ((int64_t)cb_delta * cb_delta); + } + + static inline int gray_distance2(const color_rgba& c, int r, int g, int b) + { + int gray_dist = (((int)c[0] - r) + ((int)c[1] - g) + ((int)c[2] - b) + 1) / 3; + + int gray_point_r = clamp255(r + gray_dist); + int gray_point_g = clamp255(g + gray_dist); + int gray_point_b = clamp255(b + gray_dist); + + int dist_to_gray_point_r = c[0] - gray_point_r; + int dist_to_gray_point_g = c[1] - gray_point_g; + int dist_to_gray_point_b = c[2] - gray_point_b; + + return (dist_to_gray_point_r * dist_to_gray_point_r) + (dist_to_gray_point_g * dist_to_gray_point_g) + (dist_to_gray_point_b * dist_to_gray_point_b); + } + + static bool pack_etc1_estimate_flipped(const color_rgba* pSrc_pixels) + { + int sums[3][2][2]; + +#define GET_XY(x, y, c) pSrc_pixels[(x) + ((y) * 4)][c] + + for (uint32_t c = 0; c < 3; c++) + { + sums[c][0][0] = GET_XY(0, 0, c) + GET_XY(0, 1, c) + GET_XY(1, 0, c) + GET_XY(1, 1, c); + sums[c][1][0] = GET_XY(2, 0, c) + GET_XY(2, 1, c) + GET_XY(3, 0, c) + GET_XY(3, 1, c); + sums[c][0][1] = GET_XY(0, 2, c) + GET_XY(0, 3, c) + GET_XY(1, 2, c) + GET_XY(1, 3, c); + sums[c][1][1] = GET_XY(2, 2, c) + GET_XY(2, 3, c) + GET_XY(3, 2, c) + GET_XY(3, 3, c); + } + + int upper_avg[3], lower_avg[3], left_avg[3], right_avg[3]; + for (uint32_t c = 0; c < 3; c++) + { + upper_avg[c] = (sums[c][0][0] + sums[c][1][0] + 4) / 8; + lower_avg[c] = (sums[c][0][1] + sums[c][1][1] + 4) / 8; + left_avg[c] = (sums[c][0][0] + sums[c][0][1] + 4) / 8; + right_avg[c] = (sums[c][1][0] + sums[c][1][1] + 4) / 8; + } + +#undef GET_XY +#define GET_XY(x, y, a) gray_distance2(pSrc_pixels[(x) + ((y) * 4)], a[0], a[1], a[2]) + + int upper_gray_dist = 0, lower_gray_dist = 0, left_gray_dist = 0, right_gray_dist = 0; + for (uint32_t i = 0; i < 4; i++) + { + for (uint32_t j = 0; j < 2; j++) + { + upper_gray_dist += GET_XY(i, j, upper_avg); + lower_gray_dist += GET_XY(i, 2 + j, lower_avg); + left_gray_dist += GET_XY(j, i, left_avg); + right_gray_dist += GET_XY(2 + j, i, right_avg); + } + } + +#undef GET_XY + + int upper_lower_sum = upper_gray_dist + lower_gray_dist; + int left_right_sum = left_gray_dist + right_gray_dist; + + return upper_lower_sum < left_right_sum; + } + + static void compute_etc1_hints(etc_block& best_etc1_blk, uint32_t& best_etc1_bias, const uastc_encode_results& best_results, const color_rgba block[4][4], const color_rgba decoded_uastc_block[4][4], int level, uint32_t flags) + { + best_etc1_bias = 0; + + if (best_results.m_uastc_mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + pack_etc1_block_solid_color(best_etc1_blk, &best_results.m_solid_color.m_comps[0]); + return; + } + + const bool faster_etc1 = (flags & cPackUASTCETC1FasterHints) != 0; + const bool fastest_etc1 = (flags & cPackUASTCETC1FastestHints) != 0; + + const bool has_bias = g_uastc_mode_has_etc1_bias[best_results.m_uastc_mode]; + + // 0 should be at the top, but we need 13 first because it represents bias (0,0,0). + const uint8_t s_sorted_bias_modes[32] = { 13, 0, 22, 29, 27, 12, 26, 9, 30, 31, 8, 10, 25, 2, 23, 5, 15, 7, 3, 11, 6, 17, 28, 18, 1, 19, 20, 21, 24, 4, 14, 16 }; + + uint32_t last_bias = 1; + bool use_faster_bias_mode_table = false; + const bool flip_estimate = (level <= cPackUASTCLevelFaster) || (faster_etc1) || (fastest_etc1); + if (has_bias) + { + switch (level) + { + case cPackUASTCLevelFastest: + { + last_bias = fastest_etc1 ? 1 : (faster_etc1 ? 1 : 2); + use_faster_bias_mode_table = true; + break; + } + case cPackUASTCLevelFaster: + { + last_bias = fastest_etc1 ? 1 : (faster_etc1 ? 3 : 5); + use_faster_bias_mode_table = true; + break; + } + case cPackUASTCLevelDefault: + { + last_bias = fastest_etc1 ? 1 : (faster_etc1 ? 10 : 20); + use_faster_bias_mode_table = true; + break; + } + case cPackUASTCLevelSlower: + { + last_bias = fastest_etc1 ? 1 : (faster_etc1 ? 16 : 32); + use_faster_bias_mode_table = true; + break; + } + default: + { + last_bias = 32; + break; + } + } + } + + memset(&best_etc1_blk, 0, sizeof(best_etc1_blk)); + uint64_t best_err = UINT64_MAX; + + etc_block trial_block; + memset(&trial_block, 0, sizeof(trial_block)); + + ycbcr block_ycbcr[4][4], decoded_uastc_block_ycbcr[4][4]; + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + rgb_to_y_cb_cr(block[y][x], block_ycbcr[y][x]); + rgb_to_y_cb_cr(decoded_uastc_block[y][x], decoded_uastc_block_ycbcr[y][x]); + } + } + + uint32_t first_flip = 0, last_flip = 2; + uint32_t first_individ = 0, last_individ = 2; + + if (flags & cPackUASTCETC1DisableFlipAndIndividual) + { + last_flip = 1; + last_individ = 1; + } + else if (flip_estimate) + { + if (pack_etc1_estimate_flipped(&decoded_uastc_block[0][0])) + first_flip = 1; + last_flip = first_flip + 1; + } + + for (uint32_t flip = first_flip; flip < last_flip; flip++) + { + trial_block.set_flip_bit(flip != 0); + + for (uint32_t individ = first_individ; individ < last_individ; individ++) + { + const uint32_t mul = individ ? 15 : 31; + + trial_block.set_diff_bit(individ == 0); + + color_rgba unbiased_block_colors[2]; + + int min_r[2] = { 255, 255 }, min_g[2] = { 255, 255 }, min_b[2] = { 255, 255 }, max_r[2] = { 0, 0 }, max_g[2] = { 0, 0 }, max_b[2] = { 0, 0 }; + + for (uint32_t subset = 0; subset < 2; subset++) + { + uint32_t avg_color[3]; + memset(avg_color, 0, sizeof(avg_color)); + + for (uint32_t j = 0; j < 8; j++) + { + const etc_coord2 &c = g_etc1_pixel_coords[flip][subset][j]; + const color_rgba& p = decoded_uastc_block[c.m_y][c.m_x]; + + avg_color[0] += p.r; + avg_color[1] += p.g; + avg_color[2] += p.b; + + min_r[subset] = basisu::minimum(min_r[subset], p.r); + min_g[subset] = basisu::minimum(min_g[subset], p.g); + min_b[subset] = basisu::minimum(min_b[subset], p.b); + + max_r[subset] = basisu::maximum(max_r[subset], p.r); + max_g[subset] = basisu::maximum(max_g[subset], p.g); + max_b[subset] = basisu::maximum(max_b[subset], p.b); + } // j + + unbiased_block_colors[subset][0] = (uint8_t)((avg_color[0] * mul + 1020) / (8 * 255)); + unbiased_block_colors[subset][1] = (uint8_t)((avg_color[1] * mul + 1020) / (8 * 255)); + unbiased_block_colors[subset][2] = (uint8_t)((avg_color[2] * mul + 1020) / (8 * 255)); + unbiased_block_colors[subset][3] = 0; + + } // subset + + for (uint32_t bias_iter = 0; bias_iter < last_bias; bias_iter++) + { + const uint32_t bias = use_faster_bias_mode_table ? s_sorted_bias_modes[bias_iter] : bias_iter; + + color_rgba block_colors[2]; + for (uint32_t subset = 0; subset < 2; subset++) + block_colors[subset] = has_bias ? apply_etc1_bias((color32&)unbiased_block_colors[subset], bias, mul, subset) : unbiased_block_colors[subset]; + + if (individ) + trial_block.set_block_color4(block_colors[0], block_colors[1]); + else + trial_block.set_block_color5_clamp(block_colors[0], block_colors[1]); + + uint32_t range[2]; + for (uint32_t subset = 0; subset < 2; subset++) + { + const color_rgba base_c(trial_block.get_block_color(subset, true)); + + const int pos_r = iabs(max_r[subset] - base_c.r); + const int neg_r = iabs(base_c.r - min_r[subset]); + + const int pos_g = iabs(max_g[subset] - base_c.g); + const int neg_g = iabs(base_c.g - min_g[subset]); + + const int pos_b = iabs(max_b[subset] - base_c.b); + const int neg_b = iabs(base_c.b - min_b[subset]); + + range[subset] = maximum(maximum(pos_r, neg_r, pos_g, neg_g), pos_b, neg_b); + } + + uint32_t best_inten_table[2] = { 0, 0 }; + + for (uint32_t subset = 0; subset < 2; subset++) + { + uint64_t best_subset_err = UINT64_MAX; + + const uint32_t inten_table_limit = (level == cPackUASTCLevelVerySlow) ? 8 : ((range[subset] > 51) ? 8 : (range[subset] >= 7 ? 4 : 2)); + + for (uint32_t inten_table = 0; inten_table < inten_table_limit; inten_table++) + { + trial_block.set_inten_table(subset, inten_table); + + color_rgba color_table[4]; + trial_block.get_block_colors(color_table, subset); + + ycbcr color_table_ycbcr[4]; + for (uint32_t i = 0; i < 4; i++) + rgb_to_y_cb_cr(color_table[i], color_table_ycbcr[i]); + + uint64_t total_error = 0; + if (flip) + { + for (uint32_t y = 0; y < 2; y++) + { + { + const ycbcr& c = decoded_uastc_block_ycbcr[subset * 2 + y][0]; + total_error += minimum(color_diff(color_table_ycbcr[0], c), color_diff(color_table_ycbcr[1], c), color_diff(color_table_ycbcr[2], c), color_diff(color_table_ycbcr[3], c)); + } + { + const ycbcr& c = decoded_uastc_block_ycbcr[subset * 2 + y][1]; + total_error += minimum(color_diff(color_table_ycbcr[0], c), color_diff(color_table_ycbcr[1], c), color_diff(color_table_ycbcr[2], c), color_diff(color_table_ycbcr[3], c)); + } + { + const ycbcr& c = decoded_uastc_block_ycbcr[subset * 2 + y][2]; + total_error += minimum(color_diff(color_table_ycbcr[0], c), color_diff(color_table_ycbcr[1], c), color_diff(color_table_ycbcr[2], c), color_diff(color_table_ycbcr[3], c)); + } + { + const ycbcr& c = decoded_uastc_block_ycbcr[subset * 2 + y][3]; + total_error += minimum(color_diff(color_table_ycbcr[0], c), color_diff(color_table_ycbcr[1], c), color_diff(color_table_ycbcr[2], c), color_diff(color_table_ycbcr[3], c)); + } + if (total_error >= best_subset_err) + break; + } + } + else + { + for (uint32_t y = 0; y < 4; y++) + { + { + const ycbcr& c = decoded_uastc_block_ycbcr[y][subset * 2 + 0]; + total_error += minimum(color_diff(color_table_ycbcr[0], c), color_diff(color_table_ycbcr[1], c), color_diff(color_table_ycbcr[2], c), color_diff(color_table_ycbcr[3], c)); + } + { + const ycbcr& c = decoded_uastc_block_ycbcr[y][subset * 2 + 1]; + total_error += minimum(color_diff(color_table_ycbcr[0], c), color_diff(color_table_ycbcr[1], c), color_diff(color_table_ycbcr[2], c), color_diff(color_table_ycbcr[3], c)); + } + } + if (total_error >= best_subset_err) + break; + } + + if (total_error < best_subset_err) + { + best_subset_err = total_error; + best_inten_table[subset] = inten_table; + } + + } // inten_table + + } // subset + + trial_block.set_inten_table(0, best_inten_table[0]); + trial_block.set_inten_table(1, best_inten_table[1]); + + // Compute error against the ORIGINAL block. + uint64_t err = 0; + + for (uint32_t subset = 0; subset < 2; subset++) + { + color_rgba color_table[4]; + trial_block.get_block_colors(color_table, subset); + + ycbcr color_table_ycbcr[4]; + for (uint32_t i = 0; i < 4; i++) + rgb_to_y_cb_cr(color_table[i], color_table_ycbcr[i]); + + if (flip) + { + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const ycbcr& c = decoded_uastc_block_ycbcr[subset * 2 + y][x]; + const uint64_t best_index_err = minimum(color_diff(color_table_ycbcr[0], c) << 2, (color_diff(color_table_ycbcr[1], c) << 2) + 1, (color_diff(color_table_ycbcr[2], c) << 2) + 2, (color_diff(color_table_ycbcr[3], c) << 2) + 3); + + const uint32_t best_index = (uint32_t)best_index_err & 3; + err += color_diff(block_ycbcr[subset * 2 + y][x], color_table_ycbcr[best_index]); + } + if (err >= best_err) + break; + } + } + else + { + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 2; x++) + { + const ycbcr& c = decoded_uastc_block_ycbcr[y][subset * 2 + x]; + const uint64_t best_index_err = minimum(color_diff(color_table_ycbcr[0], c) << 2, (color_diff(color_table_ycbcr[1], c) << 2) + 1, (color_diff(color_table_ycbcr[2], c) << 2) + 2, (color_diff(color_table_ycbcr[3], c) << 2) + 3); + + const uint32_t best_index = (uint32_t)best_index_err & 3; + err += color_diff(block_ycbcr[y][subset * 2 + x], color_table_ycbcr[best_index]); + } + if (err >= best_err) + break; + } + } + + } // subset + + if (err < best_err) + { + best_err = err; + + best_etc1_blk = trial_block; + best_etc1_bias = bias; + } + + } // bias_iter + + } // individ + + } // flip + } + + struct uastc_pack_eac_a8_results + { + uint32_t m_base; + uint32_t m_table; + uint32_t m_multiplier; + }; + + static uint64_t uastc_pack_eac_a8(uastc_pack_eac_a8_results& results, const uint8_t* pPixels, uint32_t num_pixels, uint32_t base_search_rad, uint32_t mul_search_rad, uint32_t table_mask) + { + assert(num_pixels <= 16); + + uint32_t min_alpha = 255, max_alpha = 0; + for (uint32_t i = 0; i < num_pixels; i++) + { + const uint32_t a = pPixels[i]; + if (a < min_alpha) min_alpha = a; + if (a > max_alpha) max_alpha = a; + } + + if (min_alpha == max_alpha) + { + results.m_base = min_alpha; + results.m_table = 13; + results.m_multiplier = 1; + return 0; + } + + const uint32_t alpha_range = max_alpha - min_alpha; + + uint64_t best_err = UINT64_MAX; + + for (uint32_t table = 0; table < 16; table++) + { + if ((table_mask & (1U << table)) == 0) + continue; + + const float range = (float)(g_etc2_eac_tables[table][ETC2_EAC_MAX_VALUE_SELECTOR] - g_etc2_eac_tables[table][ETC2_EAC_MIN_VALUE_SELECTOR]); + const int center = (int)roundf(lerp((float)min_alpha, (float)max_alpha, (float)(0 - g_etc2_eac_tables[table][ETC2_EAC_MIN_VALUE_SELECTOR]) / range)); + + const int base_min = clamp255(center - base_search_rad); + const int base_max = clamp255(center + base_search_rad); + + const int mul = (int)roundf(alpha_range / range); + const int mul_low = clamp(mul - mul_search_rad, 1, 15); + const int mul_high = clamp(mul + mul_search_rad, 1, 15); + + for (int base = base_min; base <= base_max; base++) + { + for (int multiplier = mul_low; multiplier <= mul_high; multiplier++) + { + uint64_t total_err = 0; + + for (uint32_t i = 0; i < num_pixels; i++) + { + const int a = pPixels[i]; + + uint32_t best_s_err = UINT32_MAX; + //uint32_t best_s = 0; + for (uint32_t s = 0; s < 8; s++) + { + const int v = clamp255((int)multiplier * g_etc2_eac_tables[table][s] + (int)base); + + uint32_t err = iabs(a - v); + if (err < best_s_err) + { + best_s_err = err; + //best_s = s; + } + } + + total_err += best_s_err * best_s_err; + if (total_err >= best_err) + break; + } + + if (total_err < best_err) + { + best_err = total_err; + results.m_base = base; + results.m_multiplier = multiplier; + results.m_table = table; + if (!best_err) + return best_err; + } + + } // table + + } // multiplier + + } // base + + return best_err; + } + + const int32_t DEFAULT_BC7_ERROR_WEIGHT = 50; + const float UASTC_ERROR_THRESH = 1.3f; + + // TODO: This is a quick hack to favor certain modes when we know we'll be followed up with an RDO postprocess. + static inline float get_uastc_mode_weight(uint32_t mode) + { + const float FAVORED_MODE_WEIGHT = .8f; + + switch (mode) + { + case 0: + case 10: + return FAVORED_MODE_WEIGHT; + default: + break; + } + + return 1.0f; + } + + void encode_uastc(const uint8_t* pRGBAPixels, uastc_block& output_block, uint32_t flags) + { +// printf("encode_uastc: \n"); +// for (int i = 0; i < 16; i++) +// printf("[%u %u %u %u] ", pRGBAPixels[i * 4 + 0], pRGBAPixels[i * 4 + 1], pRGBAPixels[i * 4 + 2], pRGBAPixels[i * 4 + 3]); +// printf("\n"); + + const color_rgba(*block)[4] = reinterpret_cast(pRGBAPixels); + + bool solid_color = true, has_alpha = false, is_la = true; + + const color_rgba first_color(block[0][0]); + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + if (block[y][x].a < 255) + has_alpha = true; + + if (block[y][x] != first_color) + solid_color = false; + + if ((block[y][x].r != block[y][x].g) || (block[y][x].r != block[y][x].b)) + is_la = false; + } + } + + if (solid_color) + { + // Solid color blocks are so common that we handle them specially and as quickly as we can. + uastc_encode_results solid_results; + solid_results.m_uastc_mode = UASTC_MODE_INDEX_SOLID_COLOR; + solid_results.m_astc_err = 0; + solid_results.m_common_pattern = 0; + solid_results.m_solid_color = first_color; + memset(&solid_results.m_astc, 0, sizeof(solid_results.m_astc)); + + etc_block etc1_blk; + uint32_t etc1_bias = 0; + + pack_etc1_block_solid_color(etc1_blk, &first_color.m_comps[0]); + + eac_a8_block eac_a8_blk; + eac_a8_blk.m_table = 0; + eac_a8_blk.m_multiplier = 1; + + pack_uastc(output_block, solid_results, etc1_blk, etc1_bias, eac_a8_blk, false, false); + +// printf(" Solid\n"); + + return; + } + + int level = flags & 7; + const bool favor_uastc_error = (flags & cPackUASTCFavorUASTCError) != 0; + const bool favor_bc7_error = !favor_uastc_error && ((flags & cPackUASTCFavorBC7Error) != 0); + //const bool etc1_perceptual = true; + + uastc_encode_results results[MAX_ENCODE_RESULTS]; + + level = clampi(level, cPackUASTCLevelFastest, cPackUASTCLevelVerySlow); + + // Set all options to slowest, then configure from there depending on the selected level. + uint32_t mode_mask = UINT32_MAX; + uint32_t uber_level = 6; + bool estimate_partition = false; + bool always_try_alpha_modes = true; + uint32_t eac_a8_mul_search_rad = 3; + uint32_t eac_a8_table_mask = UINT32_MAX; + uint32_t least_squares_passes = 2; + bool bc1_hints = true; + bool only_use_la_on_transparent_blocks = false; + + switch (level) + { + case cPackUASTCLevelFastest: + { + mode_mask = (1 << 0) | (1 << 8) | + (1 << 11) | (1 << 12) | + (1 << 15); + always_try_alpha_modes = false; + eac_a8_mul_search_rad = 0; + eac_a8_table_mask = (1 << 2) | (1 << 8) | (1 << 11) | (1 << 13); + uber_level = 0; + least_squares_passes = 1; + bc1_hints = false; + estimate_partition = true; + only_use_la_on_transparent_blocks = true; + break; + } + case cPackUASTCLevelFaster: + { + mode_mask = (1 << 0) | (1 << 4) | (1 << 6) | (1 << 8) | + (1 << 9) | (1 << 11) | (1 << 12) | + (1 << 15) | (1 << 17); + always_try_alpha_modes = false; + eac_a8_mul_search_rad = 0; + eac_a8_table_mask = (1 << 2) | (1 << 8) | (1 << 11) | (1 << 13); + uber_level = 0; + least_squares_passes = 1; + estimate_partition = true; + break; + } + case cPackUASTCLevelDefault: + { + mode_mask = (1 << 0) | (1 << 1) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 8) | + (1 << 9) | (1 << 10) | (1 << 11) | (1 << 12) | (1 << 13) | + (1 << 15) | (1 << 16) | (1 << 17); + always_try_alpha_modes = false; + eac_a8_mul_search_rad = 1; + eac_a8_table_mask = (1 << 0) | (1 << 2) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 10) | (1 << 11) | (1 << 13); + uber_level = 1; + least_squares_passes = 1; + estimate_partition = true; + break; + } + case cPackUASTCLevelSlower: + { + always_try_alpha_modes = false; + eac_a8_mul_search_rad = 2; + uber_level = 3; + estimate_partition = true; + break; + } + case cPackUASTCLevelVerySlow: + { + break; + } + } + +#if BASISU_SUPPORT_FORCE_MODE + static int force_mode = -1; + force_mode = (force_mode + 1) % TOTAL_UASTC_MODES; + mode_mask = UINT32_MAX; + always_try_alpha_modes = true; + only_use_la_on_transparent_blocks = false; +#endif + + // HACK HACK + //mode_mask &= ~(1 << 18); + //mode_mask = (1 << 18)| (1 << 10); + + uint32_t total_results = 0; + + if (only_use_la_on_transparent_blocks) + { + if ((is_la) && (!has_alpha)) + is_la = false; + } + + const bool try_alpha_modes = has_alpha || always_try_alpha_modes; + + bc7enc_compress_block_params comp_params; + memset(&comp_params, 0, sizeof(comp_params)); + comp_params.m_max_partitions_mode1 = 64; + comp_params.m_least_squares_passes = least_squares_passes; + comp_params.m_weights[0] = 1; + comp_params.m_weights[1] = 1; + comp_params.m_weights[2] = 1; + comp_params.m_weights[3] = 1; + comp_params.m_uber_level = uber_level; + + if (is_la) + { + if (mode_mask & (1U << 15)) + astc_mode15(block, results, total_results, comp_params); + + if (mode_mask & (1U << 16)) + astc_mode9_or_16(16, block, results, total_results, comp_params, estimate_partition ? 4 : 0); + + if (mode_mask & (1U << 17)) + astc_mode11_or_17(17, block, results, total_results, comp_params); + } + + if (!has_alpha) + { + if (mode_mask & (1U << 0)) + astc_mode0_or_18(0, block, results, total_results, comp_params); + + if (mode_mask & (1U << 1)) + astc_mode1(block, results, total_results, comp_params); + + if (mode_mask & (1U << 2)) + astc_mode2(block, results, total_results, comp_params, estimate_partition); + + if (mode_mask & (1U << 3)) + astc_mode3(block, results, total_results, comp_params, estimate_partition); + + if (mode_mask & (1U << 4)) + astc_mode4(block, results, total_results, comp_params, estimate_partition); + + if (mode_mask & (1U << 5)) + astc_mode5(block, results, total_results, comp_params); + + if (mode_mask & (1U << 6)) + astc_mode6(block, results, total_results, comp_params); + + if (mode_mask & (1U << 7)) + astc_mode7(block, results, total_results, comp_params, estimate_partition); + + if (mode_mask & (1U << 18)) + astc_mode0_or_18(18, block, results, total_results, comp_params); + } + + if (try_alpha_modes) + { + if (mode_mask & (1U << 9)) + astc_mode9_or_16(9, block, results, total_results, comp_params, estimate_partition ? 4 : 0); + + if (mode_mask & (1U << 10)) + astc_mode10(block, results, total_results, comp_params); + + if (mode_mask & (1U << 11)) + astc_mode11_or_17(11, block, results, total_results, comp_params); + + if (mode_mask & (1U << 12)) + astc_mode12(block, results, total_results, comp_params); + + if (mode_mask & (1U << 13)) + astc_mode13(block, results, total_results, comp_params); + + if (mode_mask & (1U << 14)) + astc_mode14(block, results, total_results, comp_params); + } + + assert(total_results); + + // Fix up the errors so we consistently have LA, RGB, or RGBA error. + for (uint32_t i = 0; i < total_results; i++) + { + uastc_encode_results& r = results[i]; + if (!is_la) + { + if (g_uastc_mode_is_la[r.m_uastc_mode]) + { + color_rgba unpacked_block[16]; + unpack_uastc(r.m_uastc_mode, r.m_common_pattern, r.m_solid_color.get_color32(), r.m_astc, (basist::color32 *)unpacked_block, false); + + uint64_t total_err = 0; + for (uint32_t j = 0; j < 16; j++) + total_err += color_distance(unpacked_block[j], ((const color_rgba*)block)[j], true); + + r.m_astc_err = total_err; + } + } + else + { + if (!g_uastc_mode_is_la[r.m_uastc_mode]) + { + color_rgba unpacked_block[16]; + unpack_uastc(r.m_uastc_mode, r.m_common_pattern, r.m_solid_color.get_color32(), r.m_astc, (basist::color32 *)unpacked_block, false); + + uint64_t total_err = 0; + for (uint32_t j = 0; j < 16; j++) + total_err += color_distance_la(unpacked_block[j], ((const color_rgba*)block)[j]); + + r.m_astc_err = total_err; + } + } + } + + unpacked_uastc_block unpacked_ublock = {}; + + uint64_t total_overall_err[MAX_ENCODE_RESULTS]; + float uastc_err_f[MAX_ENCODE_RESULTS]; + double best_uastc_err_f = 1e+20f; + + int best_index = -1; + + if (total_results == 1) + { + best_index = 0; + } + else + { + const uint32_t bc7_err_weight = favor_bc7_error ? 100 : ((favor_uastc_error ? 0 : DEFAULT_BC7_ERROR_WEIGHT)); + const uint32_t uastc_err_weight = favor_bc7_error ? 0 : 100; + + // Find best overall results, balancing UASTC and UASTC->BC7 error. + // We purposely allow UASTC error to increase a little, if doing so lowers the BC7 error. + for (uint32_t i = 0; i < total_results; i++) + { +#if BASISU_SUPPORT_FORCE_MODE + if (results[i].m_uastc_mode == force_mode) + { + best_index = i; + break; + } +#endif + + unpacked_ublock.m_mode = results[i].m_uastc_mode; + unpacked_ublock.m_astc = results[i].m_astc; + unpacked_ublock.m_common_pattern = results[i].m_common_pattern; + unpacked_ublock.m_solid_color = results[i].m_solid_color.get_color32(); + + color_rgba decoded_uastc_block[4][4]; + bool success = unpack_uastc(results[i].m_uastc_mode, results[i].m_common_pattern, results[i].m_solid_color.get_color32(), results[i].m_astc, (basist::color32 *)&decoded_uastc_block[0][0], false); + (void)success; + VALIDATE(success); + + uint64_t total_uastc_rgb_err, total_uastc_rgba_err, total_uastc_la_err; + compute_block_error(block, decoded_uastc_block, total_uastc_rgb_err, total_uastc_rgba_err, total_uastc_la_err); + + // Validate the computed error, or we're go mad if it's inaccurate. + if (results[i].m_uastc_mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + VALIDATE(total_uastc_rgba_err == 0); + } + else if (is_la) + { + VALIDATE(total_uastc_la_err == results[i].m_astc_err); + } + else if (g_uastc_mode_has_alpha[results[i].m_uastc_mode]) + { + VALIDATE(total_uastc_rgba_err == results[i].m_astc_err); + } + else + { + VALIDATE(total_uastc_rgb_err == results[i].m_astc_err); + } + + // Transcode to BC7 + bc7_optimization_results bc7_results; + transcode_uastc_to_bc7(unpacked_ublock, bc7_results); + + bc7_block bc7_data; + encode_bc7_block(&bc7_data, &bc7_results); + + color_rgba decoded_bc7_block[4][4]; + unpack_block(texture_format::cBC7, &bc7_data, &decoded_bc7_block[0][0]); + + // Compute BC7 error + uint64_t total_bc7_la_err, total_bc7_rgb_err, total_bc7_rgba_err; + compute_block_error(block, decoded_bc7_block, total_bc7_rgb_err, total_bc7_rgba_err, total_bc7_la_err); + + if (results[i].m_uastc_mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + VALIDATE(total_bc7_rgba_err == 0); + + best_index = i; + break; + } + + uint64_t total_uastc_err = 0, total_bc7_err = 0; + if (is_la) + { + total_bc7_err = total_bc7_la_err; + total_uastc_err = total_uastc_la_err; + } + else if (has_alpha) + { + total_bc7_err = total_bc7_rgba_err; + total_uastc_err = total_uastc_rgba_err; + } + else + { + total_bc7_err = total_bc7_rgb_err; + total_uastc_err = total_uastc_rgb_err; + } + + total_overall_err[i] = ((total_bc7_err * bc7_err_weight) / 100) + ((total_uastc_err * uastc_err_weight) / 100); + if (!total_overall_err[i]) + { + best_index = i; + break; + } + + uastc_err_f[i] = sqrtf((float)total_uastc_err); + + if (uastc_err_f[i] < best_uastc_err_f) + { + best_uastc_err_f = uastc_err_f[i]; + } + + } // total_results + + if (best_index < 0) + { + uint64_t best_err = UINT64_MAX; + + if ((best_uastc_err_f == 0.0f) || (favor_bc7_error)) + { + for (uint32_t i = 0; i < total_results; i++) + { + // TODO: This is a quick hack to favor modes 0 or 10 for better RDO compression. + const float err_weight = (flags & cPackUASTCFavorSimplerModes) ? get_uastc_mode_weight(results[i].m_uastc_mode) : 1.0f; + + const uint64_t w = (uint64_t)(total_overall_err[i] * err_weight); + if (w < best_err) + { + best_err = w; + best_index = i; + if (!best_err) + break; + } + } // i + } + else + { + // Scan the UASTC results, and consider all results within a window that has the best UASTC+BC7 error. + for (uint32_t i = 0; i < total_results; i++) + { + double err_delta = uastc_err_f[i] / best_uastc_err_f; + + if (err_delta <= UASTC_ERROR_THRESH) + { + // TODO: This is a quick hack to favor modes 0 or 10 for better RDO compression. + const float err_weight = (flags & cPackUASTCFavorSimplerModes) ? get_uastc_mode_weight(results[i].m_uastc_mode) : 1.0f; + + const uint64_t w = (uint64_t)(total_overall_err[i] * err_weight); + if (w < best_err) + { + best_err = w; + best_index = i; + if (!best_err) + break; + } + } + } // i + } + } + } + + const uastc_encode_results& best_results = results[best_index]; + const uint32_t best_mode = best_results.m_uastc_mode; + const astc_block_desc& best_astc_results = best_results.m_astc; + + color_rgba decoded_uastc_block[4][4]; + bool success = unpack_uastc(best_mode, best_results.m_common_pattern, best_results.m_solid_color.get_color32(), best_astc_results, (basist::color32 *)&decoded_uastc_block[0][0], false); + (void)success; + VALIDATE(success); + +#if BASISU_VALIDATE_UASTC_ENC + // Make sure that the UASTC block unpacks to the same exact pixels as the ASTC block does, using two different decoders. + { + // Round trip to packed UASTC and back, then decode to pixels. + etc_block etc1_blk; + memset(&etc1_blk, 0, sizeof(etc1_blk)); + eac_a8_block etc_eac_a8_blk; + memset(&etc_eac_a8_blk, 0, sizeof(etc_eac_a8_blk)); + etc_eac_a8_blk.m_multiplier = 1; + + basist::uastc_block temp_block; + pack_uastc(temp_block, best_results, etc1_blk, 0, etc_eac_a8_blk, false, false); + + basist::color32 temp_block_unpacked[4][4]; + success = basist::unpack_uastc(temp_block, (basist::color32 *)temp_block_unpacked, false); + VALIDATE(success); + +#if BASISU_USE_ASTC_DECOMPRESS + // Now round trip to packed ASTC and back, then decode to pixels. + uint32_t astc_data[4]; + + if (best_results.m_uastc_mode == UASTC_MODE_INDEX_SOLID_COLOR) + pack_astc_solid_block(astc_data, (color32 &)best_results.m_solid_color); + else + { + success = pack_astc_block(astc_data, &best_astc_results, best_results.m_uastc_mode); + VALIDATE(success); + } + + color_rgba decoded_astc_block[4][4]; + success = basisu_astc::astc::decompress((uint8_t*)decoded_astc_block, (uint8_t*)&astc_data, false, 4, 4); + VALIDATE(success); + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + VALIDATE(decoded_astc_block[y][x] == decoded_uastc_block[y][x]); + + VALIDATE(temp_block_unpacked[y][x].c[0] == decoded_uastc_block[y][x].r); + VALIDATE(temp_block_unpacked[y][x].c[1] == decoded_uastc_block[y][x].g); + VALIDATE(temp_block_unpacked[y][x].c[2] == decoded_uastc_block[y][x].b); + VALIDATE(temp_block_unpacked[y][x].c[3] == decoded_uastc_block[y][x].a); + } + } +#endif + } +#endif + + // Compute BC1 hints + bool bc1_hint0 = false, bc1_hint1 = false; + if (bc1_hints) + compute_bc1_hints(bc1_hint0, bc1_hint1, best_results, block, decoded_uastc_block); + + eac_a8_block eac_a8_blk; + if ((g_uastc_mode_has_alpha[best_mode]) && (best_mode != UASTC_MODE_INDEX_SOLID_COLOR)) + { + // Compute ETC2 hints + uint8_t decoded_uastc_block_alpha[16]; + for (uint32_t i = 0; i < 16; i++) + decoded_uastc_block_alpha[i] = decoded_uastc_block[i >> 2][i & 3].a; + + uastc_pack_eac_a8_results eac8_a8_results; + memset(&eac8_a8_results, 0, sizeof(eac8_a8_results)); + uastc_pack_eac_a8(eac8_a8_results, decoded_uastc_block_alpha, 16, 0, eac_a8_mul_search_rad, eac_a8_table_mask); + + // All we care about for hinting is the table and multiplier. + eac_a8_blk.m_table = eac8_a8_results.m_table; + eac_a8_blk.m_multiplier = eac8_a8_results.m_multiplier; + } + else + { + memset(&eac_a8_blk, 0, sizeof(eac_a8_blk)); + } + + // Compute ETC1 hints + etc_block etc1_blk; + uint32_t etc1_bias = 0; + compute_etc1_hints(etc1_blk, etc1_bias, best_results, block, decoded_uastc_block, level, flags); + + // Finally, pack the UASTC block with its hints and we're done. + pack_uastc(output_block, best_results, etc1_blk, etc1_bias, eac_a8_blk, bc1_hint0, bc1_hint1); + +// printf(" Packed: "); +// for (int i = 0; i < 16; i++) +// printf("%X ", output_block.m_bytes[i]); +// printf("\n"); + } + + static bool uastc_recompute_hints(basist::uastc_block* pBlock, const color_rgba* pBlock_pixels, uint32_t flags, const unpacked_uastc_block *pUnpacked_blk) + { + unpacked_uastc_block unpacked_blk; + + if (pUnpacked_blk) + unpacked_blk = *pUnpacked_blk; + else + { + if (!unpack_uastc(*pBlock, unpacked_blk, false, true)) + return false; + } + color_rgba decoded_uastc_block[4][4]; + if (!unpack_uastc(unpacked_blk, (basist::color32 *)decoded_uastc_block, false)) + return false; + uastc_encode_results results; + results.m_uastc_mode = unpacked_blk.m_mode; + results.m_common_pattern = unpacked_blk.m_common_pattern; + results.m_astc = unpacked_blk.m_astc; + results.m_solid_color = unpacked_blk.m_solid_color; + results.m_astc_err = 0; + bool bc1_hints = true; + uint32_t eac_a8_mul_search_rad = 3; + uint32_t eac_a8_table_mask = UINT32_MAX; + const uint32_t level = flags & cPackUASTCLevelMask; + switch (level) + { + case cPackUASTCLevelFastest: + { + eac_a8_mul_search_rad = 0; + eac_a8_table_mask = (1 << 2) | (1 << 8) | (1 << 11) | (1 << 13); + bc1_hints = false; + break; + } + case cPackUASTCLevelFaster: + { + eac_a8_mul_search_rad = 0; + eac_a8_table_mask = (1 << 2) | (1 << 8) | (1 << 11) | (1 << 13); + break; + } + case cPackUASTCLevelDefault: + { + eac_a8_mul_search_rad = 1; + eac_a8_table_mask = (1 << 0) | (1 << 2) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 10) | (1 << 11) | (1 << 13); + break; + } + case cPackUASTCLevelSlower: + { + eac_a8_mul_search_rad = 2; + break; + } + case cPackUASTCLevelVerySlow: + { + break; + } + } + bool bc1_hint0 = false, bc1_hint1 = false; + if (bc1_hints) + compute_bc1_hints(bc1_hint0, bc1_hint1, results, (color_rgba (*)[4])pBlock_pixels, decoded_uastc_block); + const uint32_t best_mode = unpacked_blk.m_mode; + eac_a8_block eac_a8_blk; + if ((g_uastc_mode_has_alpha[best_mode]) && (best_mode != UASTC_MODE_INDEX_SOLID_COLOR)) + { + uint8_t decoded_uastc_block_alpha[16]; + for (uint32_t i = 0; i < 16; i++) + decoded_uastc_block_alpha[i] = decoded_uastc_block[i >> 2][i & 3].a; + uastc_pack_eac_a8_results eac8_a8_results; + memset(&eac8_a8_results, 0, sizeof(eac8_a8_results)); + uastc_pack_eac_a8(eac8_a8_results, decoded_uastc_block_alpha, 16, 0, eac_a8_mul_search_rad, eac_a8_table_mask); + eac_a8_blk.m_table = eac8_a8_results.m_table; + eac_a8_blk.m_multiplier = eac8_a8_results.m_multiplier; + } + else + { + memset(&eac_a8_blk, 0, sizeof(eac_a8_blk)); + } + etc_block etc1_blk; + uint32_t etc1_bias = 0; + compute_etc1_hints(etc1_blk, etc1_bias, results, (color_rgba (*)[4])pBlock_pixels, decoded_uastc_block, level, flags); + pack_uastc(*pBlock, results, etc1_blk, etc1_bias, eac_a8_blk, bc1_hint0, bc1_hint1); + return true; + } + + static const uint8_t g_uastc_mode_selector_bits[TOTAL_UASTC_MODES][2] = + { + { 65, 63 }, { 69, 31 }, { 73, 46 }, { 89, 29 }, + { 89, 30 }, { 68, 47 }, { 66, 62 }, { 89, 30 }, + { 0, 0 }, { 97, 30 }, { 65, 63 }, { 66, 62 }, + { 81, 47 }, { 94, 30 }, { 92, 31 }, { 62, 63 }, + { 98, 30 }, { 61, 62 }, { 49, 79 } + }; + + static inline uint32_t set_block_bits(uint8_t* pBytes, uint64_t val, uint32_t num_bits, uint32_t cur_ofs) + { + assert(num_bits <= 64); + assert((num_bits == 64) || (val < (1ULL << num_bits))); + uint64_t mask = (num_bits == 64) ? UINT64_MAX : ((1ULL << num_bits) - 1); + while (num_bits) + { + const uint32_t n = basisu::minimum(8U - (cur_ofs & 7U), num_bits); + pBytes[cur_ofs >> 3] &= ~static_cast(mask << (cur_ofs & 7U)); + pBytes[cur_ofs >> 3] |= static_cast(val << (cur_ofs & 7U)); + val >>= n; + mask >>= n; + num_bits -= n; + cur_ofs += n; + } + return cur_ofs; + } + + static const uint8_t g_tdefl_small_dist_extra[512] = + { + 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7 + }; + + static const uint8_t g_tdefl_large_dist_extra[128] = + { + 0, 0, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13 + }; + + static inline uint32_t compute_match_cost_estimate(uint32_t dist) + { + uint32_t len_cost = 7; + uint32_t dist_cost = 5; + if (dist < 512) + dist_cost += g_tdefl_small_dist_extra[dist & 511]; + else + { + dist_cost += g_tdefl_large_dist_extra[basisu::minimum(dist, 32767) >> 8]; + while (dist >= 32768) + { + dist_cost++; + dist >>= 1; + } + } + return len_cost + dist_cost; + } + + struct selector_bitsequence + { + uint64_t m_sel; + uint32_t m_ofs; + selector_bitsequence() { } + selector_bitsequence(uint32_t bit_ofs, uint64_t sel) : m_sel(sel), m_ofs(bit_ofs) { } + bool operator== (const selector_bitsequence& other) const + { + return (m_ofs == other.m_ofs) && (m_sel == other.m_sel); + } + + bool operator< (const selector_bitsequence& other) const + { + if (m_ofs < other.m_ofs) + return true; + else if (m_ofs == other.m_ofs) + return m_sel < other.m_sel; + + return false; + } + }; + + struct selector_bitsequence_hash + { + std::size_t operator()(selector_bitsequence const& s) const noexcept + { + return static_cast(hash_hsieh((uint8_t *)&s, sizeof(s)) ^ s.m_sel); + } + }; + + class tracked_stat + { + public: + tracked_stat() { clear(); } + + void clear() { m_num = 0; m_total = 0; m_total2 = 0; } + + void update(uint32_t val) { m_num++; m_total += val; m_total2 += val * val; } + + tracked_stat& operator += (uint32_t val) { update(val); return *this; } + + uint32_t get_number_of_values() { return m_num; } + uint64_t get_total() const { return m_total; } + uint64_t get_total2() const { return m_total2; } + + float get_average() const { return m_num ? (float)m_total / m_num : 0.0f; }; + float get_std_dev() const { return m_num ? sqrtf((float)(m_num * m_total2 - m_total * m_total)) / m_num : 0.0f; } + float get_variance() const { float s = get_std_dev(); return s * s; } + + private: + uint32_t m_num; + uint64_t m_total; + uint64_t m_total2; + }; + + static bool uastc_rdo_blocks(uint32_t first_index, uint32_t last_index, basist::uastc_block* pBlocks, const color_rgba* pBlock_pixels, const uastc_rdo_params& params, uint32_t flags, + uint32_t &total_skipped, uint32_t &total_refined, uint32_t &total_modified, uint32_t &total_smooth) + { + debug_printf("uastc_rdo_blocks: Processing blocks %u to %u\n", first_index, last_index); + + const int total_blocks_to_check = basisu::maximum(1U, params.m_lz_dict_size / sizeof(basist::uastc_block)); + const bool perceptual = false; + + std::unordered_map selector_history; + + for (uint32_t block_index = first_index; block_index < last_index; block_index++) + { + const basist::uastc_block& blk = pBlocks[block_index]; + const color_rgba* pPixels = &pBlock_pixels[16 * block_index]; + + unpacked_uastc_block unpacked_blk; + if (!unpack_uastc(blk, unpacked_blk, false, true)) + return false; + + const uint32_t block_mode = unpacked_blk.m_mode; + if (block_mode == UASTC_MODE_INDEX_SOLID_COLOR) + continue; + + tracked_stat r_stats, g_stats, b_stats, a_stats; + + for (uint32_t i = 0; i < 16; i++) + { + r_stats.update(pPixels[i].r); + g_stats.update(pPixels[i].g); + b_stats.update(pPixels[i].b); + a_stats.update(pPixels[i].a); + } + + const float max_std_dev = basisu::maximum(basisu::maximum(basisu::maximum(r_stats.get_std_dev(), g_stats.get_std_dev()), b_stats.get_std_dev()), a_stats.get_std_dev()); + + float yl = clamp(max_std_dev / params.m_max_smooth_block_std_dev, 0.0f, 1.0f); + yl = yl * yl; + const float smooth_block_error_scale = lerp(params.m_smooth_block_max_error_scale, 1.0f, yl); + if (smooth_block_error_scale > 1.0f) + total_smooth++; + + color_rgba decoded_uastc_block[4][4]; + if (!unpack_uastc(unpacked_blk, (basist::color32*)decoded_uastc_block, false)) + return false; + + uint64_t uastc_err = 0; + for (uint32_t i = 0; i < 16; i++) + uastc_err += color_distance(perceptual, pPixels[i], ((color_rgba*)decoded_uastc_block)[i], true); + + // Transcode to BC7 + bc7_optimization_results b7_results; + if (!transcode_uastc_to_bc7(unpacked_blk, b7_results)) + return false; + + basist::bc7_block b7_block; + basist::encode_bc7_block(&b7_block, &b7_results); + + color_rgba decoded_b7_blk[4][4]; + unpack_block(texture_format::cBC7, &b7_block, &decoded_b7_blk[0][0]); + + uint64_t bc7_err = 0; + for (uint32_t i = 0; i < 16; i++) + bc7_err += color_distance(perceptual, pPixels[i], ((color_rgba*)decoded_b7_blk)[i], true); + + uint64_t cur_err = (uastc_err + bc7_err) / 2; + + // Divide by 16*4 to compute RMS error + const float cur_ms_err = (float)cur_err * (1.0f / 64.0f); + const float cur_rms_err = sqrt(cur_ms_err); + + const uint32_t first_sel_bit = g_uastc_mode_selector_bits[block_mode][0]; + const uint32_t total_sel_bits = g_uastc_mode_selector_bits[block_mode][1]; + assert(first_sel_bit + total_sel_bits <= 128); + assert(total_sel_bits > 0); + + uint32_t cur_bit_offset = first_sel_bit; + uint64_t cur_sel_bits = read_bits((const uint8_t*)&blk, cur_bit_offset, basisu::minimum(64U, total_sel_bits)); + + if (cur_rms_err >= params.m_skip_block_rms_thresh) + { + auto cur_search_res = selector_history.insert(std::make_pair(selector_bitsequence(first_sel_bit, cur_sel_bits), block_index)); + + // Block already has too much error, so don't mess with it. + if (!cur_search_res.second) + (*cur_search_res.first).second = block_index; + + total_skipped++; + continue; + } + + int cur_bits; + auto cur_find_res = selector_history.find(selector_bitsequence(first_sel_bit, cur_sel_bits)); + if (cur_find_res == selector_history.end()) + { + // Wasn't found - wildly estimate literal cost + //cur_bits = (total_sel_bits * 5) / 4; + cur_bits = (total_sel_bits * params.m_lz_literal_cost) / 100; + } + else + { + // Was found - wildly estimate match cost + uint32_t match_block_index = cur_find_res->second; + const int block_dist_in_bytes = (block_index - match_block_index) * 16; + cur_bits = compute_match_cost_estimate(block_dist_in_bytes); + } + + int first_block_to_check = basisu::maximum(first_index, block_index - total_blocks_to_check); + int last_block_to_check = block_index - 1; + + basist::uastc_block best_block(blk); + uint32_t best_block_index = block_index; + + float best_t = cur_ms_err * smooth_block_error_scale + cur_bits * params.m_lambda; + + // Now scan through previous blocks, insert their selector bit patterns into the current block, and find + // selector bit patterns which don't increase the overall block error too much. + for (int prev_block_index = last_block_to_check; prev_block_index >= first_block_to_check; --prev_block_index) + { + const basist::uastc_block& prev_blk = pBlocks[prev_block_index]; + + uint32_t bit_offset = first_sel_bit; + uint64_t sel_bits = read_bits((const uint8_t*)&prev_blk, bit_offset, basisu::minimum(64U, total_sel_bits)); + + int match_block_index = prev_block_index; + auto res = selector_history.find(selector_bitsequence(first_sel_bit, sel_bits)); + if (res != selector_history.end()) + match_block_index = res->second; + // Have we already checked this bit pattern? If so then skip this block. + if (match_block_index > prev_block_index) + continue; + + unpacked_uastc_block unpacked_prev_blk; + if (!unpack_uastc(prev_blk, unpacked_prev_blk, false, true)) + return false; + + basist::uastc_block trial_blk(blk); + + set_block_bits((uint8_t*)&trial_blk, sel_bits, basisu::minimum(64U, total_sel_bits), first_sel_bit); + + if (total_sel_bits > 64) + { + sel_bits = read_bits((const uint8_t*)&prev_blk, bit_offset, total_sel_bits - 64U); + + set_block_bits((uint8_t*)&trial_blk, sel_bits, total_sel_bits - 64U, first_sel_bit + basisu::minimum(64U, total_sel_bits)); + } + + unpacked_uastc_block unpacked_trial_blk; + if (!unpack_uastc(trial_blk, unpacked_trial_blk, false, true)) + continue; + + color_rgba decoded_trial_uastc_block[4][4]; + if (!unpack_uastc(unpacked_trial_blk, (basist::color32*)decoded_trial_uastc_block, false)) + continue; + + uint64_t trial_uastc_err = 0; + for (uint32_t i = 0; i < 16; i++) + trial_uastc_err += color_distance(perceptual, pPixels[i], ((color_rgba*)decoded_trial_uastc_block)[i], true); + + // Transcode trial to BC7, compute error + bc7_optimization_results trial_b7_results; + if (!transcode_uastc_to_bc7(unpacked_trial_blk, trial_b7_results)) + return false; + + basist::bc7_block trial_b7_block; + basist::encode_bc7_block(&trial_b7_block, &trial_b7_results); + + color_rgba decoded_trial_b7_blk[4][4]; + unpack_block(texture_format::cBC7, &trial_b7_block, &decoded_trial_b7_blk[0][0]); + + uint64_t trial_bc7_err = 0; + for (uint32_t i = 0; i < 16; i++) + trial_bc7_err += color_distance(perceptual, pPixels[i], ((color_rgba*)decoded_trial_b7_blk)[i], true); + + uint64_t trial_err = (trial_uastc_err + trial_bc7_err) / 2; + + const float trial_ms_err = (float)trial_err * (1.0f / 64.0f); + const float trial_rms_err = sqrtf(trial_ms_err); + + if (trial_rms_err > cur_rms_err * params.m_max_allowed_rms_increase_ratio) + continue; + + const int block_dist_in_bytes = (block_index - match_block_index) * 16; + const int match_bits = compute_match_cost_estimate(block_dist_in_bytes); + + float t = trial_ms_err * smooth_block_error_scale + match_bits * params.m_lambda; + if (t < best_t) + { + best_t = t; + best_block_index = prev_block_index; + + best_block = trial_blk; + } + + } // prev_block_index + + if (best_block_index != block_index) + { + total_modified++; + + unpacked_uastc_block unpacked_best_blk; + if (!unpack_uastc(best_block, unpacked_best_blk, false, false)) + return false; + + if ((params.m_endpoint_refinement) && (block_mode == 0)) + { + // Attempt to refine mode 0 block's endpoints, using the new selectors. This doesn't help much, but it does help. + // TODO: We could do this with the other modes too. + color_rgba decoded_best_uastc_block[4][4]; + if (!unpack_uastc(unpacked_best_blk, (basist::color32*)decoded_best_uastc_block, false)) + return false; + + // Compute the block's current error (with the modified selectors). + uint64_t best_uastc_err = 0; + for (uint32_t i = 0; i < 16; i++) + best_uastc_err += color_distance(perceptual, pPixels[i], ((color_rgba*)decoded_best_uastc_block)[i], true); + + bc7enc_compress_block_params comp_params; + memset(&comp_params, 0, sizeof(comp_params)); + comp_params.m_max_partitions_mode1 = 64; + comp_params.m_least_squares_passes = 1; + comp_params.m_weights[0] = 1; + comp_params.m_weights[1] = 1; + comp_params.m_weights[2] = 1; + comp_params.m_weights[3] = 1; + comp_params.m_uber_level = 0; + + uastc_encode_results results; + uint32_t total_results = 0; + astc_mode0_or_18(0, (color_rgba(*)[4])pPixels, &results, total_results, comp_params, unpacked_best_blk.m_astc.m_weights); + assert(total_results == 1); + + // See if the overall error has actually gone done. + + color_rgba decoded_trial_uastc_block[4][4]; + bool success = unpack_uastc(results.m_uastc_mode, results.m_common_pattern, results.m_solid_color.get_color32(), results.m_astc, (basist::color32*) & decoded_trial_uastc_block[0][0], false); + assert(success); + + BASISU_NOTE_UNUSED(success); + + uint64_t trial_uastc_err = 0; + for (uint32_t i = 0; i < 16; i++) + trial_uastc_err += color_distance(perceptual, pPixels[i], ((color_rgba*)decoded_trial_uastc_block)[i], true); + + if (trial_uastc_err < best_uastc_err) + { + // The error went down, so accept the new endpoints. + + // Ensure the selectors haven't changed, otherwise we'll invalidate the LZ matches. + for (uint32_t i = 0; i < 16; i++) + assert(unpacked_best_blk.m_astc.m_weights[i] == results.m_astc.m_weights[i]); + + unpacked_best_blk.m_astc = results.m_astc; + + total_refined++; + } + } // if ((params.m_endpoint_refinement) && (block_mode == 0)) + + // The selectors have changed, so go recompute the block hints. + if (!uastc_recompute_hints(&best_block, pPixels, flags, &unpacked_best_blk)) + return false; + + // Write the modified block + pBlocks[block_index] = best_block; + + } // if (best_block_index != block_index) + + { + uint32_t bit_offset = first_sel_bit; + uint64_t sel_bits = read_bits((const uint8_t*)&best_block, bit_offset, basisu::minimum(64U, total_sel_bits)); + + auto res = selector_history.insert(std::make_pair(selector_bitsequence(first_sel_bit, sel_bits), block_index)); + if (!res.second) + (*res.first).second = block_index; + } + + } // block_index + + return true; + } + + // This function implements a basic form of rate distortion optimization (RDO) for UASTC. + // It only changes selectors and then updates the hints. It uses very approximate LZ bitprice estimation. + // There's A LOT that can be done better in here, but it's a start. + // One nice advantage of the method used here is that it works for any input, no matter which or how many modes it uses. + bool uastc_rdo(uint32_t num_blocks, basist::uastc_block* pBlocks, const color_rgba* pBlock_pixels, const uastc_rdo_params& params, uint32_t flags, job_pool* pJob_pool, uint32_t total_jobs) + { + assert(params.m_max_allowed_rms_increase_ratio > 1.0f); + assert(params.m_lz_dict_size > 0); + assert(params.m_lambda > 0.0f); + + uint32_t total_skipped = 0, total_modified = 0, total_refined = 0, total_smooth = 0; + + uint32_t blocks_per_job = total_jobs ? (num_blocks / total_jobs) : 0; + + std::mutex stat_mutex; + + bool status = false; + + if ((!pJob_pool) || (total_jobs <= 1) || (blocks_per_job <= 8)) + { + status = uastc_rdo_blocks(0, num_blocks, pBlocks, pBlock_pixels, params, flags, total_skipped, total_refined, total_modified, total_smooth); + } + else + { + bool all_succeeded = true; + + for (uint32_t block_index_iter = 0; block_index_iter < num_blocks; block_index_iter += blocks_per_job) + { + const uint32_t first_index = block_index_iter; + const uint32_t last_index = minimum(num_blocks, block_index_iter + blocks_per_job); + +#ifndef __EMSCRIPTEN__ + pJob_pool->add_job([first_index, last_index, pBlocks, pBlock_pixels, ¶ms, flags, &total_skipped, &total_modified, &total_refined, &total_smooth, &all_succeeded, &stat_mutex] { +#endif + + uint32_t job_skipped = 0, job_modified = 0, job_refined = 0, job_smooth = 0; + + bool status = uastc_rdo_blocks(first_index, last_index, pBlocks, pBlock_pixels, params, flags, job_skipped, job_refined, job_modified, job_smooth); + + { + std::lock_guard lck(stat_mutex); + + all_succeeded = all_succeeded && status; + total_skipped += job_skipped; + total_modified += job_modified; + total_refined += job_refined; + total_smooth += job_smooth; + } + +#ifndef __EMSCRIPTEN__ + } + ); +#endif + + } // block_index_iter + +#ifndef __EMSCRIPTEN__ + pJob_pool->wait_for_all(); +#endif + + status = all_succeeded; + } + + debug_printf("uastc_rdo: Total modified: %3.2f%%, total skipped: %3.2f%%, total refined: %3.2f%%, total smooth: %3.2f%%\n", total_modified * 100.0f / num_blocks, total_skipped * 100.0f / num_blocks, total_refined * 100.0f / num_blocks, total_smooth * 100.0f / num_blocks); + + return status; + } +} // namespace basisu + + + + + diff --git a/ktx/external/basisu/encoder/basisu_uastc_enc.h b/ktx/external/basisu/encoder/basisu_uastc_enc.h new file mode 100644 index 0000000..ba39a55 --- /dev/null +++ b/ktx/external/basisu/encoder/basisu_uastc_enc.h @@ -0,0 +1,140 @@ +// basisu_uastc_enc.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once +#include "basisu_etc.h" + +#include "../transcoder/basisu_transcoder_uastc.h" + +namespace basisu +{ + const uint32_t TOTAL_PACK_UASTC_LEVELS = 5; + + enum + { + // Fastest is the lowest quality, although it's stil substantially higher quality vs. BC1/ETC1. It supports 5 modes. + // The output may be somewhat blocky because this setting doesn't support 2/3-subset UASTC modes, but it should be less blocky vs. BC1/ETC1. + // This setting doesn't write BC1 hints, so BC1 transcoding will be slower. + // Transcoded ETC1 quality will be lower because it only considers 2 hints out of 32. + // Avg. 43.45 dB + cPackUASTCLevelFastest = 0, + + // Faster is ~3x slower than fastest. It supports 9 modes. + // Avg. 46.49 dB + cPackUASTCLevelFaster = 1, + + // Default is ~5.5x slower than fastest. It supports 14 modes. + // Avg. 47.47 dB + cPackUASTCLevelDefault = 2, + + // Slower is ~14.5x slower than fastest. It supports all 18 modes. + // Avg. 48.01 dB + cPackUASTCLevelSlower = 3, + + // VerySlow is ~200x slower than fastest. + // The best quality the codec is capable of, but you'll need to be patient or have a lot of cores. + // Avg. 48.24 dB + cPackUASTCLevelVerySlow = 4, + + cPackUASTCLevelMask = 0xF, + + // By default the encoder tries to strike a balance between UASTC and transcoded BC7 quality. + // These flags allow you to favor only optimizing for lowest UASTC error, or lowest BC7 error. + cPackUASTCFavorUASTCError = 8, + cPackUASTCFavorBC7Error = 16, + + cPackUASTCETC1FasterHints = 64, + cPackUASTCETC1FastestHints = 128, + cPackUASTCETC1DisableFlipAndIndividual = 256, + + // Favor UASTC modes 0 and 10 more than the others (this is experimental, it's useful for RDO compression) + cPackUASTCFavorSimplerModes = 512, + }; + + // pRGBAPixels: Pointer to source 4x4 block of RGBA pixels (R first in memory). + // block: Reference to destination UASTC block. + // level: Controls compression speed vs. performance tradeoff. + void encode_uastc(const uint8_t* pRGBAPixels, basist::uastc_block& output_block, uint32_t flags = cPackUASTCLevelDefault); + + struct uastc_encode_results + { + uint32_t m_uastc_mode; + uint32_t m_common_pattern; + basist::astc_block_desc m_astc; + color_rgba m_solid_color; + uint64_t m_astc_err; + }; + + void pack_uastc(basist::uastc_block& blk, const uastc_encode_results& result, const etc_block& etc1_blk, uint32_t etc1_bias, const eac_a8_block& etc_eac_a8_blk, bool bc1_hint0, bool bc1_hint1); + + const uint32_t UASCT_RDO_DEFAULT_LZ_DICT_SIZE = 4096; + + const float UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO = 10.0f; + const float UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH = 8.0f; + + // The RDO encoder computes a smoothness factor, from [0,1], for each block. To do this it computes each block's maximum component variance, then it divides this by this factor and clamps the result. + // Larger values will result in more blocks being protected from too much distortion. + const float UASTC_RDO_DEFAULT_MAX_SMOOTH_BLOCK_STD_DEV = 18.0f; + + // The RDO encoder can artifically boost the error of smooth blocks, in order to suppress distortions on smooth areas of the texture. + // The encoder will use this value as the maximum error scale to use on smooth blocks. The larger this value, the better smooth bocks will look. Set to 1.0 to disable this completely. + const float UASTC_RDO_DEFAULT_SMOOTH_BLOCK_MAX_ERROR_SCALE = 10.0f; + + struct uastc_rdo_params + { + uastc_rdo_params() + { + clear(); + } + + void clear() + { + m_lz_dict_size = UASCT_RDO_DEFAULT_LZ_DICT_SIZE; + m_lambda = 0.5f; + m_max_allowed_rms_increase_ratio = UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO; + m_skip_block_rms_thresh = UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH; + m_endpoint_refinement = true; + m_lz_literal_cost = 100; + + m_max_smooth_block_std_dev = UASTC_RDO_DEFAULT_MAX_SMOOTH_BLOCK_STD_DEV; + m_smooth_block_max_error_scale = UASTC_RDO_DEFAULT_SMOOTH_BLOCK_MAX_ERROR_SCALE; + } + + // m_lz_dict_size: Size of LZ dictionary to simulate in bytes. The larger this value, the slower the encoder but the higher the quality per LZ compressed bit. + uint32_t m_lz_dict_size; + + // m_lambda: The post-processor tries to reduce distortion+rate*lambda (rate is approximate LZ bits and distortion is scaled MS error). + // Larger values push the postprocessor towards optimizing more for lower rate, and smaller values more for distortion. 0=minimal distortion. + float m_lambda; + + // m_max_allowed_rms_increase_ratio: How much the RMS error of a block is allowed to increase before a trial is rejected. 1.0=no increase allowed, 1.05=5% increase allowed, etc. + float m_max_allowed_rms_increase_ratio; + + // m_skip_block_rms_thresh: Blocks with this much RMS error or more are completely skipped by the RDO encoder. + float m_skip_block_rms_thresh; + + // m_endpoint_refinement: If true, the post-process will attempt to refine the endpoints of blocks with modified selectors. + bool m_endpoint_refinement; + + float m_max_smooth_block_std_dev; + float m_smooth_block_max_error_scale; + + uint32_t m_lz_literal_cost; + }; + + // num_blocks, pBlocks: Number of blocks and pointer to UASTC blocks to process. + // pBlock_pixels: Pointer to an array of 4x4 blocks containing the original texture pixels. This is NOT a raster image, but a pointer to individual 4x4 blocks. + // flags: Pass in the same flags used to encode the UASTC blocks. The flags are used to reencode the transcode hints in the same way. + bool uastc_rdo(uint32_t num_blocks, basist::uastc_block* pBlocks, const color_rgba* pBlock_pixels, const uastc_rdo_params ¶ms, uint32_t flags = cPackUASTCLevelDefault, job_pool* pJob_pool = nullptr, uint32_t total_jobs = 0); +} // namespace basisu diff --git a/ktx/external/basisu/encoder/cppspmd_flow.h b/ktx/external/basisu/encoder/cppspmd_flow.h new file mode 100644 index 0000000..f693047 --- /dev/null +++ b/ktx/external/basisu/encoder/cppspmd_flow.h @@ -0,0 +1,590 @@ +// Do not include this header directly. +// Control flow functionality in common between all the headers. +// +// Copyright 2020-2021 Binomial 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 +// +// 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. + +#ifdef _DEBUG +CPPSPMD_FORCE_INLINE void spmd_kernel::check_masks() +{ + assert(!any(andnot(m_kernel_exec, m_exec))); +} +#endif + +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_break() +{ +#ifdef _DEBUG + assert(m_in_loop); +#endif + + m_exec = exec_mask::all_off(); +} + +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_continue() +{ +#ifdef _DEBUG + assert(m_in_loop); +#endif + + // Kill any active lanes, and remember which lanes were active so we can re-enable them at the end of the loop body. + m_continue_mask = m_continue_mask | m_exec; + m_exec = exec_mask::all_off(); +} + +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_return() +{ + // Permenantly kill all active lanes + m_kernel_exec = andnot(m_exec, m_kernel_exec); + m_exec = exec_mask::all_off(); +} + +template +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_unmasked(const UnmaskedBody& unmaskedBody) +{ + exec_mask orig_exec = m_exec, orig_kernel_exec = m_kernel_exec; + + m_kernel_exec = exec_mask::all_on(); + m_exec = exec_mask::all_on(); + + unmaskedBody(); + + m_kernel_exec = m_kernel_exec & orig_kernel_exec; + m_exec = m_exec & orig_exec; + + check_masks(); +} + +struct scoped_unmasked_restorer +{ + spmd_kernel *m_pKernel; + exec_mask m_orig_exec, m_orig_kernel_exec; + + CPPSPMD_FORCE_INLINE scoped_unmasked_restorer(spmd_kernel *pKernel) : + m_pKernel(pKernel), + m_orig_exec(pKernel->m_exec), + m_orig_kernel_exec(pKernel->m_kernel_exec) + { + pKernel->m_kernel_exec = exec_mask::all_on(); + pKernel->m_exec = exec_mask::all_on(); + } + + CPPSPMD_FORCE_INLINE ~scoped_unmasked_restorer() + { + m_pKernel->m_kernel_exec = m_pKernel->m_kernel_exec & m_orig_kernel_exec; + m_pKernel->m_exec = m_pKernel->m_exec & m_orig_exec; + m_pKernel->check_masks(); + } +}; + +#define SPMD_UNMASKED_BEGIN { scoped_unmasked_restorer _unmasked_restorer(this); +#define SPMD_UNMASKED_END } + +#if 0 +template +CPPSPMD_FORCE_INLINE decltype(auto) spmd_kernel::spmd_call(Args&&... args) +{ + SPMDKernel kernel; + kernel.init(m_exec); + return kernel._call(std::forward(args)...); +} +#else +template +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_call(Args&&... args) +{ + SPMDKernel kernel; + kernel.init(m_exec); + kernel._call(std::forward(args)...); +} +#endif + +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_if_break(const vbool& cond) +{ +#ifdef _DEBUG + assert(m_in_loop); +#endif + + exec_mask cond_exec(cond); + + m_exec = andnot(m_exec & cond_exec, m_exec); + + check_masks(); +} + +// No SPMD breaks, continues, etc. allowed +template +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_sif(const vbool& cond, const IfBody& ifBody) +{ + exec_mask im = m_exec & exec_mask(cond); + + if (any(im)) + { + const exec_mask orig_exec = m_exec; + m_exec = im; + ifBody(); + m_exec = orig_exec; + } +} + +// No SPMD breaks, continues, etc. allowed +template +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_sifelse(const vbool& cond, const IfBody& ifBody, const ElseBody &elseBody) +{ + const exec_mask orig_exec = m_exec; + + exec_mask im = m_exec & exec_mask(cond); + + if (any(im)) + { + m_exec = im; + ifBody(); + } + + exec_mask em = orig_exec & exec_mask(!cond); + + if (any(em)) + { + m_exec = em; + elseBody(); + } + + m_exec = orig_exec; +} + +template +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_if(const vbool& cond, const IfBody& ifBody) +{ + exec_mask cond_exec(cond); + + exec_mask pre_if_exec = cond_exec & m_exec; + + if (any(pre_if_exec)) + { + exec_mask unexecuted_lanes = andnot(cond_exec, m_exec); + m_exec = pre_if_exec; + + ifBody(); + + // Propagate any lanes that got disabled inside the if body into the exec mask outside the if body, but turn on any lanes that didn't execute inside the if body. + m_exec = m_exec | unexecuted_lanes; + + check_masks(); + } +} + +template +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_ifelse(const vbool& cond, const IfBody& ifBody, const ElseBody& elseBody) +{ + bool all_flag = false; + + exec_mask cond_exec(cond); + + { + exec_mask pre_if_exec = cond_exec & m_exec; + + int mask = pre_if_exec.get_movemask(); + if (mask != 0) + { + all_flag = ((uint32_t)mask == m_exec.get_movemask()); + + exec_mask unexecuted_lanes = andnot(cond_exec, m_exec); + m_exec = pre_if_exec; + + ifBody(); + + // Propagate any lanes that got disabled inside the if body into the exec mask outside the if body, but turn on any lanes that didn't execute inside the if body. + m_exec = m_exec | unexecuted_lanes; + + check_masks(); + } + } + + if (!all_flag) + { + exec_mask pre_if_exec = andnot(cond_exec, m_exec); + + if (any(pre_if_exec)) + { + exec_mask unexecuted_lanes = cond_exec & m_exec; + m_exec = pre_if_exec; + + ifBody(); + + // Propagate any lanes that got disabled inside the if body into the exec mask outside the if body, but turn on any lanes that didn't execute inside the if body. + m_exec = m_exec | unexecuted_lanes; + + check_masks(); + } + } +} + +struct scoped_exec_restorer +{ + exec_mask *m_pMask; + exec_mask m_prev_mask; + CPPSPMD_FORCE_INLINE scoped_exec_restorer(exec_mask *pExec_mask) : m_pMask(pExec_mask), m_prev_mask(*pExec_mask) { } + CPPSPMD_FORCE_INLINE ~scoped_exec_restorer() { *m_pMask = m_prev_mask; } +}; + +// Cannot use SPMD break, continue, or return inside "simple" if/else +#define SPMD_SIF(cond) exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(m_exec & exec_mask(vbool(cond))); if (any(CPPSPMD_GLUER2(_exec_temp, __LINE__))) \ + { CPPSPMD::scoped_exec_restorer CPPSPMD_GLUER2(_exec_restore_, __LINE__)(&m_exec); m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__); + +#define SPMD_SELSE(cond) } exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(m_exec & exec_mask(!vbool(cond))); if (any(CPPSPMD_GLUER2(_exec_temp, __LINE__))) \ + { CPPSPMD::scoped_exec_restorer CPPSPMD_GLUER2(_exec_restore_, __LINE__)(&m_exec); m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__); + +#define SPMD_SENDIF } + +// Same as SPMD_SIF, except doesn't use a scoped object +#define SPMD_SIF2(cond) exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(m_exec & exec_mask(vbool(cond))); if (any(CPPSPMD_GLUER2(_exec_temp, __LINE__))) \ + { exec_mask _orig_exec = m_exec; m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__); + +#define SPMD_SELSE2(cond) m_exec = _orig_exec; } exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(m_exec & exec_mask(!vbool(cond))); if (any(CPPSPMD_GLUER2(_exec_temp, __LINE__))) \ + { exec_mask _orig_exec = m_exec; m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__); + +#define SPMD_SEND_IF2 m_exec = _orig_exec; } + +// Same as SPMD_SIF(), except the if/else blocks are always executed +#define SPMD_SAIF(cond) exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(m_exec & exec_mask(vbool(cond))); { CPPSPMD::scoped_exec_restorer CPPSPMD_GLUER2(_exec_restore_, __LINE__)(&m_exec); \ + m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__); + +#define SPMD_SAELSE(cond) } exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(m_exec & exec_mask(!vbool(cond))); { CPPSPMD::scoped_exec_restorer CPPSPMD_GLUER2(_exec_restore_, __LINE__)(&m_exec); \ + m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__); + +#define SPMD_SAENDIF } + +// Cannot use SPMD break, continue, or return inside sselect +#define SPMD_SSELECT(var) do { vint_t _select_var = var; scoped_exec_restorer _orig_exec(&m_exec); exec_mask _select_executed(exec_mask::all_off()); +#define SPMD_SCASE(value) exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(_orig_exec.m_prev_mask & exec_mask(vbool(_select_var == (value)))); if (any(CPPSPMD_GLUER2(_exec_temp, __LINE__))) \ + { m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__); _select_executed = _select_executed | m_exec; + +//#define SPMD_SCASE_END if (_select_executed.get_movemask() == _orig_exec.m_prev_mask.get_movemask()) break; } +#define SPMD_SCASE_END if (!any(_select_executed ^ _orig_exec.m_prev_mask)) break; } +#define SPMD_SDEFAULT exec_mask _all_other_lanes(andnot(_select_executed, _orig_exec.m_prev_mask)); if (any(_all_other_lanes)) { m_exec = _all_other_lanes; +#define SPMD_SDEFAULT_END } +#define SPMD_SSELECT_END } while(0); + +// Same as SPMD_SSELECT, except all cases are executed. +// Cannot use SPMD break, continue, or return inside sselect +#define SPMD_SASELECT(var) do { vint_t _select_var = var; scoped_exec_restorer _orig_exec(&m_exec); exec_mask _select_executed(exec_mask::all_off()); + +#define SPMD_SACASE(value) exec_mask CPPSPMD_GLUER2(_exec_temp, __LINE__)(_orig_exec.m_prev_mask & exec_mask(vbool(_select_var == (value)))); { m_exec = CPPSPMD_GLUER2(_exec_temp, __LINE__); \ + _select_executed = _select_executed | m_exec; + +#define SPMD_SACASE_END } +#define SPMD_SADEFAULT exec_mask _all_other_lanes(andnot(_select_executed, _orig_exec.m_prev_mask)); { m_exec = _all_other_lanes; +#define SPMD_SADEFAULT_END } +#define SPMD_SASELECT_END } while(0); + +struct scoped_exec_restorer2 +{ + spmd_kernel *m_pKernel; + exec_mask m_unexecuted_lanes; + + CPPSPMD_FORCE_INLINE scoped_exec_restorer2(spmd_kernel *pKernel, const vbool &cond) : + m_pKernel(pKernel) + { + exec_mask cond_exec(cond); + m_unexecuted_lanes = andnot(cond_exec, pKernel->m_exec); + pKernel->m_exec = cond_exec & pKernel->m_exec; + } + + CPPSPMD_FORCE_INLINE ~scoped_exec_restorer2() + { + m_pKernel->m_exec = m_pKernel->m_exec | m_unexecuted_lanes; + m_pKernel->check_masks(); + } +}; + +#define SPMD_IF(cond) { CPPSPMD::scoped_exec_restorer2 CPPSPMD_GLUER2(_exec_restore2_, __LINE__)(this, vbool(cond)); if (any(m_exec)) { +#define SPMD_ELSE(cond) } } { CPPSPMD::scoped_exec_restorer2 CPPSPMD_GLUER2(_exec_restore2_, __LINE__)(this, !vbool(cond)); if (any(m_exec)) { +#define SPMD_END_IF } } + +// Same as SPMD_IF, except the conditional block is always executed. +#define SPMD_AIF(cond) { CPPSPMD::scoped_exec_restorer2 CPPSPMD_GLUER2(_exec_restore2_, __LINE__)(this, vbool(cond)); { +#define SPMD_AELSE(cond) } } { CPPSPMD::scoped_exec_restorer2 CPPSPMD_GLUER2(_exec_restore2_, __LINE__)(this, !vbool(cond)); { +#define SPMD_AEND_IF } } + +class scoped_exec_saver +{ + exec_mask m_exec, m_kernel_exec, m_continue_mask; + spmd_kernel *m_pKernel; +#ifdef _DEBUG + bool m_in_loop; +#endif + +public: + inline scoped_exec_saver(spmd_kernel *pKernel) : + m_exec(pKernel->m_exec), m_kernel_exec(pKernel->m_kernel_exec), m_continue_mask(pKernel->m_continue_mask), + m_pKernel(pKernel) + { +#ifdef _DEBUG + m_in_loop = pKernel->m_in_loop; +#endif + } + + inline ~scoped_exec_saver() + { + m_pKernel->m_exec = m_exec; + m_pKernel->m_continue_mask = m_continue_mask; + m_pKernel->m_kernel_exec = m_kernel_exec; +#ifdef _DEBUG + m_pKernel->m_in_loop = m_in_loop; + m_pKernel->check_masks(); +#endif + } +}; + +#define SPMD_BEGIN_CALL scoped_exec_saver CPPSPMD_GLUER2(_begin_call_scoped_exec_saver, __LINE__)(this); m_continue_mask = exec_mask::all_off(); +#define SPMD_BEGIN_CALL_ALL_LANES scoped_exec_saver CPPSPMD_GLUER2(_begin_call_scoped_exec_saver, __LINE__)(this); m_exec = exec_mask::all_on(); m_continue_mask = exec_mask::all_off(); + +template +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_foreach(int begin, int end, const ForeachBody& foreachBody) +{ + if (begin == end) + return; + + if (!any(m_exec)) + return; + + // We don't support iterating backwards. + if (begin > end) + std::swap(begin, end); + + exec_mask prev_continue_mask = m_continue_mask, prev_exec = m_exec; + + int total_full = (end - begin) / PROGRAM_COUNT; + int total_partial = (end - begin) % PROGRAM_COUNT; + + lint_t loop_index = begin + program_index; + + const int total_loops = total_full + (total_partial ? 1 : 0); + + m_continue_mask = exec_mask::all_off(); + + for (int i = 0; i < total_loops; i++) + { + int n = PROGRAM_COUNT; + if ((i == (total_loops - 1)) && (total_partial)) + { + exec_mask partial_mask = exec_mask(vint_t(total_partial) > vint_t(program_index)); + m_exec = m_exec & partial_mask; + n = total_partial; + } + + foreachBody(loop_index, n); + + m_exec = m_exec | m_continue_mask; + if (!any(m_exec)) + break; + + m_continue_mask = exec_mask::all_off(); + check_masks(); + + store_all(loop_index, loop_index + PROGRAM_COUNT); + } + + m_exec = prev_exec & m_kernel_exec; + m_continue_mask = prev_continue_mask; + check_masks(); +} + +template +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_while(const WhileCondBody& whileCondBody, const WhileBody& whileBody) +{ + exec_mask orig_exec = m_exec; + + exec_mask orig_continue_mask = m_continue_mask; + m_continue_mask = exec_mask::all_off(); + +#ifdef _DEBUG + const bool prev_in_loop = m_in_loop; + m_in_loop = true; +#endif + + while(true) + { + exec_mask cond_exec = exec_mask(whileCondBody()); + m_exec = m_exec & cond_exec; + + if (!any(m_exec)) + break; + + whileBody(); + + m_exec = m_exec | m_continue_mask; + m_continue_mask = exec_mask::all_off(); + check_masks(); + } + +#ifdef _DEBUG + m_in_loop = prev_in_loop; +#endif + + m_exec = orig_exec & m_kernel_exec; + m_continue_mask = orig_continue_mask; + check_masks(); +} + +struct scoped_while_restorer +{ + spmd_kernel *m_pKernel; + exec_mask m_orig_exec, m_orig_continue_mask; +#ifdef _DEBUG + bool m_prev_in_loop; +#endif + + CPPSPMD_FORCE_INLINE scoped_while_restorer(spmd_kernel *pKernel) : + m_pKernel(pKernel), + m_orig_exec(pKernel->m_exec), + m_orig_continue_mask(pKernel->m_continue_mask) + { + pKernel->m_continue_mask.all_off(); + +#ifdef _DEBUG + m_prev_in_loop = pKernel->m_in_loop; + pKernel->m_in_loop = true; +#endif + } + + CPPSPMD_FORCE_INLINE ~scoped_while_restorer() + { + m_pKernel->m_exec = m_orig_exec & m_pKernel->m_kernel_exec; + m_pKernel->m_continue_mask = m_orig_continue_mask; +#ifdef _DEBUG + m_pKernel->m_in_loop = m_prev_in_loop; + m_pKernel->check_masks(); +#endif + } +}; + +#undef SPMD_WHILE +#undef SPMD_WEND +#define SPMD_WHILE(cond) { scoped_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); while(true) { exec_mask CPPSPMD_GLUER2(cond_exec, __LINE__) = exec_mask(vbool(cond)); \ + m_exec = m_exec & CPPSPMD_GLUER2(cond_exec, __LINE__); if (!any(m_exec)) break; + +#define SPMD_WEND m_exec = m_exec | m_continue_mask; m_continue_mask = exec_mask::all_off(); check_masks(); } } + +// Nesting is not supported (although it will compile, but the results won't make much sense). +#define SPMD_FOREACH(loop_var, bi, ei) if (((bi) != (ei)) && (any(m_exec))) { \ + scoped_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); \ + uint32_t b = (uint32_t)(bi), e = (uint32_t)(ei); if ((b) > (e)) { std::swap(b, e); } const uint32_t total_full = ((e) - (b)) >> PROGRAM_COUNT_SHIFT, total_partial = ((e) - (b)) & (PROGRAM_COUNT - 1); \ + lint_t loop_var = program_index + (int)b; const uint32_t total_loops = total_full + (total_partial ? 1U : 0U); \ + for (uint32_t CPPSPMD_GLUER2(_foreach_counter, __LINE__) = 0; CPPSPMD_GLUER2(_foreach_counter, __LINE__) < total_loops; ++CPPSPMD_GLUER2(_foreach_counter, __LINE__)) { \ + if ((CPPSPMD_GLUER2(_foreach_counter, __LINE__) == (total_loops - 1)) && (total_partial)) { exec_mask partial_mask = exec_mask(vint_t((int)total_partial) > vint_t(program_index)); m_exec = m_exec & partial_mask; } + +#define SPMD_FOREACH_END(loop_var) m_exec = m_exec | m_continue_mask; if (!any(m_exec)) break; m_continue_mask = exec_mask::all_off(); check_masks(); store_all(loop_var, loop_var + PROGRAM_COUNT); } } + +// Okay to use spmd_continue or spmd_return, but not spmd_break +#define SPMD_FOREACH_ACTIVE(index_var) int64_t index_var; { uint64_t _movemask = m_exec.get_movemask(); if (_movemask) { scoped_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); \ + for (uint32_t _i = 0; _i < PROGRAM_COUNT; ++_i) { \ + if (_movemask & (1U << _i)) { \ + m_exec.enable_lane(_i); m_exec = m_exec & m_kernel_exec; \ + (index_var) = _i; \ + +#define SPMD_FOREACH_ACTIVE_END } } } } + +// Okay to use spmd_continue, but not spmd_break/spmd_continue +#define SPMD_FOREACH_UNIQUE_INT(index_var, var) { scoped_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); \ + CPPSPMD_DECL(int_t, _vals[PROGRAM_COUNT]); store_linear_all(_vals, var); std::sort(_vals, _vals + PROGRAM_COUNT); \ + const int _n = (int)(std::unique(_vals, _vals + PROGRAM_COUNT) - _vals); \ + for (int _i = 0; _i < _n; ++_i) { int index_var = _vals[_i]; vbool cond = (vint_t(var) == vint_t(index_var)); m_exec = exec_mask(cond); + +#define SPMD_FOREACH_UNIQUE_INT_END } } + +struct scoped_simple_while_restorer +{ + spmd_kernel* m_pKernel; + exec_mask m_orig_exec; +#ifdef _DEBUG + bool m_prev_in_loop; +#endif + + CPPSPMD_FORCE_INLINE scoped_simple_while_restorer(spmd_kernel* pKernel) : + m_pKernel(pKernel), + m_orig_exec(pKernel->m_exec) + { + +#ifdef _DEBUG + m_prev_in_loop = pKernel->m_in_loop; + pKernel->m_in_loop = true; +#endif + } + + CPPSPMD_FORCE_INLINE ~scoped_simple_while_restorer() + { + m_pKernel->m_exec = m_orig_exec; +#ifdef _DEBUG + m_pKernel->m_in_loop = m_prev_in_loop; + m_pKernel->check_masks(); +#endif + } +}; + +// Cannot use SPMD break, continue, or return inside simple while + +#define SPMD_SWHILE(cond) { scoped_simple_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); \ + while(true) { \ + exec_mask CPPSPMD_GLUER2(cond_exec, __LINE__) = exec_mask(vbool(cond)); m_exec = m_exec & CPPSPMD_GLUER2(cond_exec, __LINE__); if (!any(m_exec)) break; +#define SPMD_SWEND } } + +// Cannot use SPMD break, continue, or return inside simple do +#define SPMD_SDO { scoped_simple_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); while(true) { +#define SPMD_SEND_DO(cond) exec_mask CPPSPMD_GLUER2(cond_exec, __LINE__) = exec_mask(vbool(cond)); m_exec = m_exec & CPPSPMD_GLUER2(cond_exec, __LINE__); if (!any(m_exec)) break; } } + +#undef SPMD_FOR +#undef SPMD_END_FOR +#define SPMD_FOR(for_init, for_cond) { for_init; scoped_while_restorer CPPSPMD_GLUER2(_while_restore_, __LINE__)(this); while(true) { exec_mask CPPSPMD_GLUER2(cond_exec, __LINE__) = exec_mask(vbool(for_cond)); \ + m_exec = m_exec & CPPSPMD_GLUER2(cond_exec, __LINE__); if (!any(m_exec)) break; +#define SPMD_END_FOR(for_inc) m_exec = m_exec | m_continue_mask; m_continue_mask = exec_mask::all_off(); check_masks(); for_inc; } } + +template +CPPSPMD_FORCE_INLINE void spmd_kernel::spmd_for(const ForInitBody& forInitBody, const ForCondBody& forCondBody, const ForIncrBody& forIncrBody, const ForBody& forBody) +{ + exec_mask orig_exec = m_exec; + + forInitBody(); + + exec_mask orig_continue_mask = m_continue_mask; + m_continue_mask = exec_mask::all_off(); + +#ifdef _DEBUG + const bool prev_in_loop = m_in_loop; + m_in_loop = true; +#endif + + while(true) + { + exec_mask cond_exec = exec_mask(forCondBody()); + m_exec = m_exec & cond_exec; + + if (!any(m_exec)) + break; + + forBody(); + + m_exec = m_exec | m_continue_mask; + m_continue_mask = exec_mask::all_off(); + check_masks(); + + forIncrBody(); + } + + m_exec = orig_exec & m_kernel_exec; + m_continue_mask = orig_continue_mask; + +#ifdef _DEBUG + m_in_loop = prev_in_loop; + check_masks(); +#endif +} diff --git a/ktx/external/basisu/encoder/cppspmd_math.h b/ktx/external/basisu/encoder/cppspmd_math.h new file mode 100644 index 0000000..e7b3202 --- /dev/null +++ b/ktx/external/basisu/encoder/cppspmd_math.h @@ -0,0 +1,725 @@ +// Do not include this header directly. +// +// Copyright 2020-2021 Binomial 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 +// +// 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. + +// The general goal of these vectorized estimated math functions is scalability/performance. +// There are explictly no checks NaN's/Inf's on the input arguments. There are no assertions either. +// These are fast estimate functions - if you need more than that, use stdlib. Please do a proper +// engineering analysis before relying on them. +// I have chosen functions written by others, ported them to CppSPMD, then measured their abs/rel errors. +// I compared each to the ones in DirectXMath and stdlib's for accuracy/performance. + +CPPSPMD_FORCE_INLINE vfloat fmod_inv(const vfloat& a, const vfloat& b, const vfloat& b_inv) +{ + vfloat c = frac(abs(a * b_inv)) * abs(b); + return spmd_ternaryf(a < 0, -c, c); +} + +CPPSPMD_FORCE_INLINE vfloat fmod_inv_p(const vfloat& a, const vfloat& b, const vfloat& b_inv) +{ + return frac(a * b_inv) * b; +} + +// Avoids dividing by zero or very small values. +CPPSPMD_FORCE_INLINE vfloat safe_div(vfloat a, vfloat b, float fDivThresh = 1e-7f) +{ + return a / spmd_ternaryf( abs(b) > fDivThresh, b, spmd_ternaryf(b < 0.0f, -fDivThresh, fDivThresh) ); +} + +/* + clang 9.0.0 for win /fp:precise release + f range: 0.0000000000001250 10000000000.0000000000000000, vals: 1073741824 + + log2_est(): + max abs err: 0.0000023076808731 + max rel err: 0.0000000756678881 + avg abs err: 0.0000007535452724 + avg rel err: 0.0000000235117843 + + XMVectorLog2(): + max abs err: 0.0000023329709933 + max rel err: 0.0000000826961046 + avg abs err: 0.0000007564889684 + avg rel err: 0.0000000236051899 + + std::log2f(): + max abs err: 0.0000020265979401 + max rel err: 0.0000000626647654 + avg abs err: 0.0000007494445227 + avg rel err: 0.0000000233800985 +*/ + +// See https://tech.ebayinc.com/engineering/fast-approximate-logarithms-part-iii-the-formulas/ +inline vfloat spmd_kernel::log2_est(vfloat v) +{ + vfloat signif, fexp; + + // Just clamp to a very small value, instead of checking for invalid inputs. + vfloat x = max(v, 2.2e-38f); + + /* + * Assume IEEE representation, which is sgn(1):exp(8):frac(23) + * representing (1+frac)*2^(exp-127). Call 1+frac the significand + */ + + // get exponent + vint ux1_i = cast_vfloat_to_vint(x); + + vint exp = VUINT_SHIFT_RIGHT(ux1_i & 0x7F800000, 23); + + // actual exponent is exp-127, will subtract 127 later + + vint ux2_i; + vfloat ux2_f; + + vint greater = ux1_i & 0x00400000; // true if signif > 1.5 + SPMD_SIF(greater != 0) + { + // signif >= 1.5 so need to divide by 2. Accomplish this by stuffing exp = 126 which corresponds to an exponent of -1 + store_all(ux2_i, (ux1_i & 0x007FFFFF) | 0x3f000000); + + store_all(ux2_f, cast_vint_to_vfloat(ux2_i)); + + // 126 instead of 127 compensates for division by 2 + store_all(fexp, vfloat(exp - 126)); + } + SPMD_SELSE(greater != 0) + { + // get signif by stuffing exp = 127 which corresponds to an exponent of 0 + store(ux2_i, (ux1_i & 0x007FFFFF) | 0x3f800000); + + store(ux2_f, cast_vint_to_vfloat(ux2_i)); + + store(fexp, vfloat(exp - 127)); + } + SPMD_SENDIF + + store_all(signif, ux2_f); + store_all(signif, signif - 1.0f); + + const float a = 0.1501692f, b = 3.4226132f, c = 5.0225057f, d = 4.1130283f, e = 3.4813372f; + + vfloat xm1 = signif; + vfloat xm1sqr = xm1 * xm1; + + return fexp + ((a * (xm1sqr * xm1) + b * xm1sqr + c * xm1) / (xm1sqr + d * xm1 + e)); + + // fma lowers accuracy for SSE4.1 - no idea why (compiler reordering?) + //return fexp + ((vfma(a, (xm1sqr * xm1), vfma(b, xm1sqr, c * xm1))) / (xm1sqr + vfma(d, xm1, e))); +} + +// Uses log2_est(), so this function must be <= the precision of that. +inline vfloat spmd_kernel::log_est(vfloat v) +{ + return log2_est(v) * 0.693147181f; +} + +CPPSPMD_FORCE_INLINE void spmd_kernel::reduce_expb(vfloat& arg, vfloat& two_int_a, vint& adjustment) +{ + // Assume we're using equation (2) + store_all(adjustment, 0); + + // integer part of the input argument + vint int_arg = (vint)arg; + + // if frac(arg) is in [0.5, 1.0]... + SPMD_SIF((arg - int_arg) > 0.5f) + { + store(adjustment, 1); + + // then change it to [0.0, 0.5] + store(arg, arg - 0.5f); + } + SPMD_SENDIF + + // arg == just the fractional part + store_all(arg, arg - (vfloat)int_arg); + + // Now compute 2** (int) arg. + store_all(int_arg, min(int_arg + 127, 254)); + + store_all(two_int_a, cast_vint_to_vfloat(VINT_SHIFT_LEFT(int_arg, 23))); +} + +/* + clang 9.0.0 for win /fp:precise release + f range : -50.0000000000000000 49.9999940395355225, vals : 16777216 + + exp2_est(): + Total passed near - zero check : 16777216 + Total sign diffs : 0 + max abs err: 1668910609.7500000000000000 + max rel err: 0.0000015642030031 + avg abs err: 10793794.4007573910057545 + avg rel err: 0.0000003890893282 + + XMVectorExp2(): + Total passed near-zero check: 16777216 + Total sign diffs: 0 + max abs err: 1665552836.8750000000000000 + max rel err: 0.0000114674862370 + avg abs err: 10771868.2627860084176064 + avg rel err: 0.0000011218880770 + + std::exp2f(): + Total passed near-zero check: 16777216 + Total sign diffs: 0 + max abs err: 1591636585.6250000000000000 + max rel err: 0.0000014849731018 + avg abs err: 10775800.3204844966530800 + avg rel err: 0.0000003851496422 +*/ + +// http://www.ganssle.com/item/approximations-c-code-exponentiation-log.htm +inline vfloat spmd_kernel::exp2_est(vfloat arg) +{ + SPMD_BEGIN_CALL + + const vfloat P00 = +7.2152891521493f; + const vfloat P01 = +0.0576900723731f; + const vfloat Q00 = +20.8189237930062f; + const vfloat Q01 = +1.0f; + const vfloat sqrt2 = 1.4142135623730950488f; // sqrt(2) for scaling + + vfloat result = 0.0f; + + // Return 0 if arg is too large. + // We're not introducing inf/nan's into calculations, or risk doing so by returning huge default values. + SPMD_IF(abs(arg) > 126.0f) + { + spmd_return(); + } + SPMD_END_IF + + // 2**(int(a)) + vfloat two_int_a; + + // set to 1 by reduce_expb + vint adjustment; + + // 0 if arg is +; 1 if negative + vint negative = 0; + + // If the input is negative, invert it. At the end we'll take the reciprocal, since n**(-1) = 1/(n**x). + SPMD_SIF(arg < 0.0f) + { + store(arg, -arg); + store(negative, 1); + } + SPMD_SENDIF + + store_all(arg, min(arg, 126.0f)); + + // reduce to [0.0, 0.5] + reduce_expb(arg, two_int_a, adjustment); + + // The format of the polynomial is: + // answer=(Q(x**2) + x*P(x**2))/(Q(x**2) - x*P(x**2)) + // + // The following computes the polynomial in several steps: + + // Q(x**2) + vfloat Q = vfma(Q01, (arg * arg), Q00); + + // x*P(x**2) + vfloat x_P = arg * (vfma(P01, arg * arg, P00)); + + vfloat answer = (Q + x_P) / (Q - x_P); + + // Now correct for the scaling factor of 2**(int(a)) + store_all(answer, answer * two_int_a); + + // If the result had a fractional part > 0.5, correct for that + store_all(answer, spmd_ternaryf(adjustment != 0, answer * sqrt2, answer)); + + // Correct for a negative input + SPMD_SIF(negative != 0) + { + store(answer, 1.0f / answer); + } + SPMD_SENDIF + + store(result, answer); + + return result; +} + +inline vfloat spmd_kernel::exp_est(vfloat arg) +{ + // e^x = exp2(x / log_base_e(2)) + // constant is 1.0/(log(2)/log(e)) or 1/log(2) + return exp2_est(arg * 1.44269504f); +} + +inline vfloat spmd_kernel::pow_est(vfloat arg1, vfloat arg2) +{ + return exp_est(log_est(arg1) * arg2); +} + +/* + clang 9.0.0 for win /fp:precise release + Total near-zero: 144, output above near-zero tresh: 30 + Total near-zero avg: 0.0000067941016621 max: 0.0000134706497192 + Total near-zero sign diffs: 5 + Total passed near-zero check: 16777072 + Total sign diffs: 5 + max abs err: 0.0000031375306036 + max rel err: 0.1140846017075028 + avg abs err: 0.0000003026226621 + avg rel err: 0.0000033564977623 +*/ + +// Math from this web page: http://developer.download.nvidia.com/cg/sin.html +// This is ~2x slower than sin_est() or cos_est(), and less accurate, but I'm keeping it here for comparison purposes to help validate/sanity check sin_est() and cos_est(). +inline vfloat spmd_kernel::sincos_est_a(vfloat a, bool sin_flag) +{ + const float c0_x = 0.0f, c0_y = 0.5f, c0_z = 1.0f; + const float c1_x = 0.25f, c1_y = -9.0f, c1_z = 0.75f, c1_w = 0.159154943091f; + const float c2_x = 24.9808039603f, c2_y = -24.9808039603f, c2_z = -60.1458091736f, c2_w = 60.1458091736f; + const float c3_x = 85.4537887573f, c3_y = -85.4537887573f, c3_z = -64.9393539429f, c3_w = 64.9393539429f; + const float c4_x = 19.7392082214f, c4_y = -19.7392082214f, c4_z = -1.0f, c4_w = 1.0f; + + vfloat r0_x, r0_y, r0_z, r1_x, r1_y, r1_z, r2_x, r2_y, r2_z; + + store_all(r1_x, sin_flag ? vfms(c1_w, a, c1_x) : c1_w * a); + + store_all(r1_y, frac(r1_x)); + + store_all(r2_x, (vfloat)(r1_y < c1_x)); + + store_all(r2_y, (vfloat)(r1_y >= c1_y)); + store_all(r2_z, (vfloat)(r1_y >= c1_z)); + + store_all(r2_y, vfma(r2_x, c4_z, vfma(r2_y, c4_w, r2_z * c4_z))); + + store_all(r0_x, c0_x - r1_y); + store_all(r0_y, c0_y - r1_y); + store_all(r0_z, c0_z - r1_y); + + store_all(r0_x, r0_x * r0_x); + store_all(r0_y, r0_y * r0_y); + store_all(r0_z, r0_z * r0_z); + + store_all(r1_x, vfma(c2_x, r0_x, c2_z)); + store_all(r1_y, vfma(c2_y, r0_y, c2_w)); + store_all(r1_z, vfma(c2_x, r0_z, c2_z)); + + store_all(r1_x, vfma(r1_x, r0_x, c3_x)); + store_all(r1_y, vfma(r1_y, r0_y, c3_y)); + store_all(r1_z, vfma(r1_z, r0_z, c3_x)); + + store_all(r1_x, vfma(r1_x, r0_x, c3_z)); + store_all(r1_y, vfma(r1_y, r0_y, c3_w)); + store_all(r1_z, vfma(r1_z, r0_z, c3_z)); + + store_all(r1_x, vfma(r1_x, r0_x, c4_x)); + store_all(r1_y, vfma(r1_y, r0_y, c4_y)); + store_all(r1_z, vfma(r1_z, r0_z, c4_x)); + + store_all(r1_x, vfma(r1_x, r0_x, c4_z)); + store_all(r1_y, vfma(r1_y, r0_y, c4_w)); + store_all(r1_z, vfma(r1_z, r0_z, c4_z)); + + store_all(r0_x, vfnma(r1_x, r2_x, vfnma(r1_y, r2_y, r1_z * -r2_z))); + + return r0_x; +} + +// positive values only +CPPSPMD_FORCE_INLINE vfloat spmd_kernel::recip_est1(const vfloat& q) +{ + //const int mag = 0x7EF312AC; // 2 NR iters, 3 is 0x7EEEEBB3 + const int mag = 0x7EF311C3; + const float fMinThresh = .0000125f; + + vfloat l = spmd_ternaryf(q >= fMinThresh, q, cast_vint_to_vfloat(vint(mag))); + + vint x_l = vint(mag) - cast_vfloat_to_vint(l); + + vfloat rcp_l = cast_vint_to_vfloat(x_l); + + return rcp_l * vfnma(rcp_l, q, 2.0f); +} + +CPPSPMD_FORCE_INLINE vfloat spmd_kernel::recip_est1_pn(const vfloat& t) +{ + //const int mag = 0x7EF312AC; // 2 NR iters, 3 is 0x7EEEEBB3 + const int mag = 0x7EF311C3; + const float fMinThresh = .0000125f; + + vfloat s = sign(t); + vfloat q = abs(t); + + vfloat l = spmd_ternaryf(q >= fMinThresh, q, cast_vint_to_vfloat(vint(mag))); + + vint x_l = vint(mag) - cast_vfloat_to_vint(l); + + vfloat rcp_l = cast_vint_to_vfloat(x_l); + + return rcp_l * vfnma(rcp_l, q, 2.0f) * s; +} + +// https://basesandframes.files.wordpress.com/2020/04/even_faster_math_functions_green_2020.pdf +// https://github.com/hcs0/Hackers-Delight/blob/master/rsqrt.c.txt +CPPSPMD_FORCE_INLINE vfloat spmd_kernel::rsqrt_est1(vfloat x0) +{ + vfloat xhalf = 0.5f * x0; + vfloat x = cast_vint_to_vfloat(vint(0x5F375A82) - (VINT_SHIFT_RIGHT(cast_vfloat_to_vint(x0), 1))); + return x * vfnma(xhalf * x, x, 1.5008909f); +} + +CPPSPMD_FORCE_INLINE vfloat spmd_kernel::rsqrt_est2(vfloat x0) +{ + vfloat xhalf = 0.5f * x0; + vfloat x = cast_vint_to_vfloat(vint(0x5F37599E) - (VINT_SHIFT_RIGHT(cast_vfloat_to_vint(x0), 1))); + vfloat x1 = x * vfnma(xhalf * x, x, 1.5); + vfloat x2 = x1 * vfnma(xhalf * x1, x1, 1.5); + return x2; +} + +// Math from: http://developer.download.nvidia.com/cg/atan2.html +// TODO: Needs more validation, parameter checking. +CPPSPMD_FORCE_INLINE vfloat spmd_kernel::atan2_est(vfloat y, vfloat x) +{ + vfloat t1 = abs(y); + vfloat t3 = abs(x); + + vfloat t0 = max(t3, t1); + store_all(t1, min(t3, t1)); + + store_all(t3, t1 / t0); + + vfloat t4 = t3 * t3; + store_all(t0, vfma(-0.013480470f, t4, 0.057477314f)); + store_all(t0, vfms(t0, t4, 0.121239071f)); + store_all(t0, vfma(t0, t4, 0.195635925f)); + store_all(t0, vfms(t0, t4, 0.332994597f)); + store_all(t0, vfma(t0, t4, 0.999995630f)); + store_all(t3, t0 * t3); + + store_all(t3, spmd_ternaryf(abs(y) > abs(x), vfloat(1.570796327f) - t3, t3)); + + store_all(t3, spmd_ternaryf(x < 0.0f, vfloat(3.141592654f) - t3, t3)); + store_all(t3, spmd_ternaryf(y < 0.0f, -t3, t3)); + + return t3; +} + +/* + clang 9.0.0 for win /fp:precise release + Tested range: -25.1327412287183449 25.1327382326621169, vals : 16777216 + Skipped angles near 90/270 within +- .001 radians. + Near-zero threshold: .0000125f + Near-zero output above check threshold: 1e-6f + + Total near-zero: 144, output above near-zero tresh: 20 + Total near-zero avg: 0.0000067510751968 max: 0.0000133514404297 + Total near-zero sign diffs: 5 + Total passed near-zero check: 16766400 + Total sign diffs: 5 + max abs err: 1.4982600811139264 + max rel err: 0.1459155900188041 + avg rel err: 0.0000054659502568 + + XMVectorTan() precise: + Total near-zero: 144, output above near-zero tresh: 18 + Total near-zero avg: 0.0000067641216186 max: 0.0000133524126795 + Total near-zero sign diffs: 0 + Total passed near-zero check: 16766400 + Total sign diffs: 0 + max abs err: 1.9883573246424930 + max rel err: 0.1459724171926864 + avg rel err: 0.0000054965766843 + + std::tanf(): + Total near-zero: 144, output above near-zero tresh: 0 + Total near-zero avg: 0.0000067116930779 max: 0.0000127713074107 + Total near-zero sign diffs: 11 + Total passed near-zero check: 16766400 + Total sign diffs: 11 + max abs err: 0.8989131818294709 + max rel err: 0.0573181403173166 + avg rel err: 0.0000030791301203 + + Originally from: + http://www.ganssle.com/approx.htm +*/ + +CPPSPMD_FORCE_INLINE vfloat spmd_kernel::tan82(vfloat x) +{ + // Original double version was 8.2 digits + //double c1 = 211.849369664121f, c2 = -12.5288887278448f, c3 = 269.7350131214121f, c4 = -71.4145309347748f; + // Tuned float constants for lower avg rel error (without using FMA3): + const float c1 = 211.849350f, c2 = -12.5288887f, c3 = 269.734985f, c4 = -71.4145203f; + vfloat x2 = x * x; + return (x * (vfma(c2, x2, c1)) / (vfma(x2, (c4 + x2), c3))); +} + +// Don't call this for angles close to 90/270!. +inline vfloat spmd_kernel::tan_est(vfloat x) +{ + const float fPi = 3.141592653589793f, fOneOverPi = 0.3183098861837907f; + CPPSPMD_DECL(const uint8_t, s_table0[16]) = { 128 + 0, 128 + 2, 128 + -2, 128 + 4, 128 + 0, 128 + 2, 128 + -2, 128 + 4, 128 + 0, 128 + 2, 128 + -2, 128 + 4, 128 + 0, 128 + 2, 128 + -2, 128 + 4 }; + + vint table = init_lookup4(s_table0); // a load + vint sgn = cast_vfloat_to_vint(x) & 0x80000000; + + store_all(x, abs(x)); + vfloat orig_x = x; + + vfloat q = x * fOneOverPi; + store_all(x, q - floor(q)); + + vfloat x4 = x * 4.0f; + vint octant = (vint)(x4); + + vfloat x0 = spmd_ternaryf((octant & 1) != 0, -x4, x4); + + vint k = table_lookup4_8(octant, table) & 0xFF; // a shuffle + + vfloat bias = (vfloat)k + -128.0f; + vfloat y = x0 + bias; + + vfloat z = tan82(y); + + vfloat r; + + vbool octant_one_or_two = (octant == 1) || (octant == 2); + + // SPMD optimization - skip costly divide if we can + if (spmd_any(octant_one_or_two)) + { + const float fDivThresh = .4371e-7f; + vfloat one_over_z = 1.0f / spmd_ternaryf(abs(z) > fDivThresh, z, spmd_ternaryf(z < 0.0f, -fDivThresh, fDivThresh)); + + vfloat b = spmd_ternaryf(octant_one_or_two, one_over_z, z); + store_all(r, spmd_ternaryf((octant & 2) != 0, -b, b)); + } + else + { + store_all(r, spmd_ternaryf(octant == 0, z, -z)); + } + + // Small angle approximation, to decrease the max rel error near Pi. + SPMD_SIF(x >= (1.0f - .0003125f*4.0f)) + { + store(r, vfnma(floor(q) + 1.0f, fPi, orig_x)); + } + SPMD_SENDIF + + return cast_vint_to_vfloat(cast_vfloat_to_vint(r) ^ sgn); +} + +inline void spmd_kernel::seed_rand(rand_context& x, vint seed) +{ + store(x.a, 0xf1ea5eed); + store(x.b, seed ^ 0xd8487b1f); + store(x.c, seed ^ 0xdbadef9a); + store(x.d, seed); + for (int i = 0; i < 20; ++i) + (void)get_randu(x); +} + +// https://burtleburtle.net/bob/rand/smallprng.html +// Returns 32-bit unsigned random numbers. +inline vint spmd_kernel::get_randu(rand_context& x) +{ + vint e = x.a - VINT_ROT(x.b, 27); + store(x.a, x.b ^ VINT_ROT(x.c, 17)); + store(x.b, x.c + x.d); + store(x.c, x.d + e); + store(x.d, e + x.a); + return x.d; +} + +// Returns random numbers between [low, high), or low if low >= high +inline vint spmd_kernel::get_randi(rand_context& x, vint low, vint high) +{ + vint rnd = get_randu(x); + + vint range = high - low; + + vint rnd_range = mulhiu(rnd, range); + + return spmd_ternaryi(low < high, low + rnd_range, low); +} + +// Returns random numbers between [low, high), or low if low >= high +inline vfloat spmd_kernel::get_randf(rand_context& x, vfloat low, vfloat high) +{ + vint rndi = get_randu(x) & 0x7fffff; + + vfloat rnd = (vfloat)(rndi) * (1.0f / 8388608.0f); + + return spmd_ternaryf(low < high, vfma(high - low, rnd, low), low); +} + +CPPSPMD_FORCE_INLINE void spmd_kernel::init_reverse_bits(vint& tab1, vint& tab2) +{ + const uint8_t tab1_bytes[16] = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 }; + const uint8_t tab2_bytes[16] = { 0, 8 << 4, 4 << 4, 12 << 4, 2 << 4, 10 << 4, 6 << 4, 14 << 4, 1 << 4, 9 << 4, 5 << 4, 13 << 4, 3 << 4, 11 << 4, 7 << 4, 15 << 4 }; + store_all(tab1, init_lookup4(tab1_bytes)); + store_all(tab2, init_lookup4(tab2_bytes)); +} + +CPPSPMD_FORCE_INLINE vint spmd_kernel::reverse_bits(vint k, vint tab1, vint tab2) +{ + vint r0 = table_lookup4_8(k & 0x7F7F7F7F, tab2); + vint r1 = table_lookup4_8(VUINT_SHIFT_RIGHT(k, 4) & 0x7F7F7F7F, tab1); + vint r3 = r0 | r1; + return byteswap(r3); +} + +CPPSPMD_FORCE_INLINE vint spmd_kernel::count_leading_zeros(vint x) +{ + CPPSPMD_DECL(const uint8_t, s_tab[16]) = { 0, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; + + vint tab = init_lookup4(s_tab); + + //x <= 0x0000ffff + vbool c0 = (x & 0xFFFF0000) == 0; + vint n0 = spmd_ternaryi(c0, 16, 0); + vint x0 = spmd_ternaryi(c0, VINT_SHIFT_LEFT(x, 16), x); + + //x <= 0x00ffffff + vbool c1 = (x0 & 0xFF000000) == 0; + vint n1 = spmd_ternaryi(c1, n0 + 8, n0); + vint x1 = spmd_ternaryi(c1, VINT_SHIFT_LEFT(x0, 8), x0); + + //x <= 0x0fffffff + vbool c2 = (x1 & 0xF0000000) == 0; + vint n2 = spmd_ternaryi(c2, n1 + 4, n1); + vint x2 = spmd_ternaryi(c2, VINT_SHIFT_LEFT(x1, 4), x1); + + return table_lookup4_8(VUINT_SHIFT_RIGHT(x2, 28), tab) + n2; +} + +CPPSPMD_FORCE_INLINE vint spmd_kernel::count_leading_zeros_alt(vint x) +{ + //x <= 0x0000ffff + vbool c0 = (x & 0xFFFF0000) == 0; + vint n0 = spmd_ternaryi(c0, 16, 0); + vint x0 = spmd_ternaryi(c0, VINT_SHIFT_LEFT(x, 16), x); + + //x <= 0x00ffffff + vbool c1 = (x0 & 0xFF000000) == 0; + vint n1 = spmd_ternaryi(c1, n0 + 8, n0); + vint x1 = spmd_ternaryi(c1, VINT_SHIFT_LEFT(x0, 8), x0); + + //x <= 0x0fffffff + vbool c2 = (x1 & 0xF0000000) == 0; + vint n2 = spmd_ternaryi(c2, n1 + 4, n1); + vint x2 = spmd_ternaryi(c2, VINT_SHIFT_LEFT(x1, 4), x1); + + // x <= 0x3fffffff + vbool c3 = (x2 & 0xC0000000) == 0; + vint n3 = spmd_ternaryi(c3, n2 + 2, n2); + vint x3 = spmd_ternaryi(c3, VINT_SHIFT_LEFT(x2, 2), x2); + + // x <= 0x7fffffff + vbool c4 = (x3 & 0x80000000) == 0; + return spmd_ternaryi(c4, n3 + 1, n3); +} + +CPPSPMD_FORCE_INLINE vint spmd_kernel::count_trailing_zeros(vint x) +{ + // cast the least significant bit in v to a float + vfloat f = (vfloat)(x & -x); + + // extract exponent and adjust + return VUINT_SHIFT_RIGHT(cast_vfloat_to_vint(f), 23) - 0x7F; +} + +CPPSPMD_FORCE_INLINE vint spmd_kernel::count_set_bits(vint x) +{ + vint v = x - (VUINT_SHIFT_RIGHT(x, 1) & 0x55555555); + vint v1 = (v & 0x33333333) + (VUINT_SHIFT_RIGHT(v, 2) & 0x33333333); + return VUINT_SHIFT_RIGHT(((v1 + VUINT_SHIFT_RIGHT(v1, 4) & 0xF0F0F0F) * 0x1010101), 24); +} + +CPPSPMD_FORCE_INLINE vint cmple_epu16(const vint &a, const vint &b) +{ + return cmpeq_epi16(subs_epu16(a, b), vint(0)); +} + +CPPSPMD_FORCE_INLINE vint cmpge_epu16(const vint &a, const vint &b) +{ + return cmple_epu16(b, a); +} + +CPPSPMD_FORCE_INLINE vint cmpgt_epu16(const vint &a, const vint &b) +{ + return andnot(cmpeq_epi16(a, b), cmple_epu16(b, a)); +} + +CPPSPMD_FORCE_INLINE vint cmplt_epu16(const vint &a, const vint &b) +{ + return cmpgt_epu16(b, a); +} + +CPPSPMD_FORCE_INLINE vint cmpge_epi16(const vint &a, const vint &b) +{ + return cmpeq_epi16(a, b) | cmpgt_epi16(a, b); +} + +CPPSPMD_FORCE_INLINE vint cmple_epi16(const vint &a, const vint &b) +{ + return cmpge_epi16(b, a); +} + +void spmd_kernel::print_vint(vint v) +{ + for (uint32_t i = 0; i < PROGRAM_COUNT; i++) + printf("%i ", extract(v, i)); + printf("\n"); +} + +void spmd_kernel::print_vbool(vbool v) +{ + for (uint32_t i = 0; i < PROGRAM_COUNT; i++) + printf("%i ", extract(v, i) ? 1 : 0); + printf("\n"); +} + +void spmd_kernel::print_vint_hex(vint v) +{ + for (uint32_t i = 0; i < PROGRAM_COUNT; i++) + printf("0x%X ", extract(v, i)); + printf("\n"); +} + +void spmd_kernel::print_active_lanes(const char *pPrefix) +{ + CPPSPMD_DECL(int, flags[PROGRAM_COUNT]); + memset(flags, 0, sizeof(flags)); + storeu_linear(flags, vint(1)); + + if (pPrefix) + printf("%s", pPrefix); + + for (uint32_t i = 0; i < PROGRAM_COUNT; i++) + { + if (flags[i]) + printf("%u ", i); + } + printf("\n"); +} + +void spmd_kernel::print_vfloat(vfloat v) +{ + for (uint32_t i = 0; i < PROGRAM_COUNT; i++) + printf("%f ", extract(v, i)); + printf("\n"); +} diff --git a/ktx/external/basisu/encoder/cppspmd_math_declares.h b/ktx/external/basisu/encoder/cppspmd_math_declares.h new file mode 100644 index 0000000..cdb6447 --- /dev/null +++ b/ktx/external/basisu/encoder/cppspmd_math_declares.h @@ -0,0 +1,89 @@ +// Do not include this header directly. +// This header defines shared struct spmd_kernel helpers. +// +// Copyright 2020-2021 Binomial 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 +// +// 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. + +// See cppspmd_math.h for detailed error statistics. + +CPPSPMD_FORCE_INLINE void reduce_expb(vfloat& arg, vfloat& two_int_a, vint& adjustment); +CPPSPMD_FORCE_INLINE vfloat tan56(vfloat x); +CPPSPMD_FORCE_INLINE vfloat tan82(vfloat x); + +inline vfloat log2_est(vfloat v); + +inline vfloat log_est(vfloat v); + +inline vfloat exp2_est(vfloat arg); + +inline vfloat exp_est(vfloat arg); + +inline vfloat pow_est(vfloat arg1, vfloat arg2); + +CPPSPMD_FORCE_INLINE vfloat recip_est1(const vfloat& q); +CPPSPMD_FORCE_INLINE vfloat recip_est1_pn(const vfloat& q); + +inline vfloat mod_angles(vfloat a); + +inline vfloat sincos_est_a(vfloat a, bool sin_flag); +CPPSPMD_FORCE_INLINE vfloat sin_est_a(vfloat a) { return sincos_est_a(a, true); } +CPPSPMD_FORCE_INLINE vfloat cos_est_a(vfloat a) { return sincos_est_a(a, false); } + +inline vfloat sin_est(vfloat a); + +inline vfloat cos_est(vfloat a); + +// Don't call with values <= 0. +CPPSPMD_FORCE_INLINE vfloat rsqrt_est1(vfloat x0); + +// Don't call with values <= 0. +CPPSPMD_FORCE_INLINE vfloat rsqrt_est2(vfloat x0); + +CPPSPMD_FORCE_INLINE vfloat atan2_est(vfloat y, vfloat x); + +CPPSPMD_FORCE_INLINE vfloat atan_est(vfloat x) { return atan2_est(x, vfloat(1.0f)); } + +// Don't call this for angles close to 90/270! +inline vfloat tan_est(vfloat x); + +// https://burtleburtle.net/bob/rand/smallprng.html +struct rand_context { vint a, b, c, d; }; + +inline void seed_rand(rand_context& x, vint seed); + +// Returns 32-bit unsigned random numbers. +inline vint get_randu(rand_context& x); + +// Returns random numbers between [low, high), or low if low >= high +inline vint get_randi(rand_context& x, vint low, vint high); + +// Returns random numbers between [low, high), or low if low >= high +inline vfloat get_randf(rand_context& x, vfloat low, vfloat high); + +CPPSPMD_FORCE_INLINE void init_reverse_bits(vint& tab1, vint& tab2); +CPPSPMD_FORCE_INLINE vint reverse_bits(vint k, vint tab1, vint tab2); + +CPPSPMD_FORCE_INLINE vint count_leading_zeros(vint x); +CPPSPMD_FORCE_INLINE vint count_leading_zeros_alt(vint x); + +CPPSPMD_FORCE_INLINE vint count_trailing_zeros(vint x); + +CPPSPMD_FORCE_INLINE vint count_set_bits(vint x); + +void print_vint(vint v); +void print_vbool(vbool v); +void print_vint_hex(vint v); +void print_active_lanes(const char *pPrefix); +void print_vfloat(vfloat v); + diff --git a/ktx/external/basisu/encoder/cppspmd_sse.h b/ktx/external/basisu/encoder/cppspmd_sse.h new file mode 100644 index 0000000..0c77a2d --- /dev/null +++ b/ktx/external/basisu/encoder/cppspmd_sse.h @@ -0,0 +1,2105 @@ +// cppspmd_sse.h +// Copyright 2020-2022 Binomial 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 +// +// 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. +// +// Notes for Basis Universal: +// All of the "cppspmd" code and headers are OPTIONAL to Basis Universal. if BASISU_SUPPORT_SSE is 0, it will never be included and does not impact compilation. +// The techniques used in this code were originally demonstrated for AVX2 by Nicolas Guillemot, Jefferson Amstutz in their "CppSPMD" project. +// This is new code for use in Basis Universal, although it uses the same general SPMD techniques in SSE 2/4. + +#include +#include +#include +#include +#include +#include + +#if CPPSPMD_SSE2 +#include // SSE +#include // SSE2 +#else +#include // SSE +#include // SSE2 +#include // SSE3 +#include // SSSE3 +#include // SSE4.1 +//#include // SSE4.2 +#endif + +#undef CPPSPMD_SSE +#undef CPPSPMD_AVX1 +#undef CPPSPMD_AVX2 +#undef CPPSPMD_AVX +#undef CPPSPMD_FLOAT4 +#undef CPPSPMD_INT16 + +#define CPPSPMD_SSE 1 +#define CPPSPMD_AVX 0 +#define CPPSPMD_AVX1 0 +#define CPPSPMD_AVX2 0 +#define CPPSPMD_FLOAT4 0 +#define CPPSPMD_INT16 0 + +#ifdef _MSC_VER + #ifndef CPPSPMD_DECL + #define CPPSPMD_DECL(type, name) __declspec(align(16)) type name + #endif + + #ifndef CPPSPMD_ALIGN + #define CPPSPMD_ALIGN(v) __declspec(align(v)) + #endif + + #define _mm_undefined_si128 _mm_setzero_si128 + #define _mm_undefined_ps _mm_setzero_ps +#else + #ifndef CPPSPMD_DECL + #define CPPSPMD_DECL(type, name) type name __attribute__((aligned(32))) + #endif + + #ifndef CPPSPMD_ALIGN + #define CPPSPMD_ALIGN(v) __attribute__((aligned(v))) + #endif +#endif + +#ifndef CPPSPMD_FORCE_INLINE +#ifdef _DEBUG +#define CPPSPMD_FORCE_INLINE inline +#else + #ifdef _MSC_VER + #define CPPSPMD_FORCE_INLINE __forceinline + #else + #define CPPSPMD_FORCE_INLINE inline + #endif +#endif +#endif + +#undef CPPSPMD +#undef CPPSPMD_ARCH + +#if CPPSPMD_SSE2 + #define CPPSPMD_SSE41 0 + #define CPPSPMD cppspmd_sse2 + #define CPPSPMD_ARCH _sse2 +#else + #define CPPSPMD_SSE41 1 + #define CPPSPMD cppspmd_sse41 + #define CPPSPMD_ARCH _sse41 +#endif + +#ifndef CPPSPMD_GLUER + #define CPPSPMD_GLUER(a, b) a##b +#endif + +#ifndef CPPSPMD_GLUER2 + #define CPPSPMD_GLUER2(a, b) CPPSPMD_GLUER(a, b) +#endif + +#ifndef CPPSPMD_NAME +#define CPPSPMD_NAME(a) CPPSPMD_GLUER2(a, CPPSPMD_ARCH) +#endif + +#undef VASSERT +#define VCOND(cond) ((exec_mask(vbool(cond)) & m_exec).get_movemask() == m_exec.get_movemask()) +#define VASSERT(cond) assert( VCOND(cond) ) + +#define CPPSPMD_ALIGNMENT (16) + +#define storeu_si32(p, a) (void)(*(int*)(p) = _mm_cvtsi128_si32((a))) + +namespace CPPSPMD +{ + +const int PROGRAM_COUNT_SHIFT = 2; +const int PROGRAM_COUNT = 1 << PROGRAM_COUNT_SHIFT; + +template inline N* aligned_new() { void* p = _mm_malloc(sizeof(N), 64); new (p) N; return static_cast(p); } +template void aligned_delete(N* p) { if (p) { p->~N(); _mm_free(p); } } + +CPPSPMD_DECL(const uint32_t, g_allones_128[4]) = { UINT32_MAX, UINT32_MAX, UINT32_MAX, UINT32_MAX }; +CPPSPMD_DECL(const uint32_t, g_x_128[4]) = { UINT32_MAX, 0, 0, 0 }; +CPPSPMD_DECL(const float, g_onef_128[4]) = { 1.0f, 1.0f, 1.0f, 1.0f }; +CPPSPMD_DECL(const uint32_t, g_oneu_128[4]) = { 1, 1, 1, 1 }; + +CPPSPMD_DECL(const uint32_t, g_lane_masks_128[4][4]) = +{ + { UINT32_MAX, 0, 0, 0 }, + { 0, UINT32_MAX, 0, 0 }, + { 0, 0, UINT32_MAX, 0 }, + { 0, 0, 0, UINT32_MAX }, +}; + +#if CPPSPMD_SSE41 +CPPSPMD_FORCE_INLINE __m128i _mm_blendv_epi32(__m128i a, __m128i b, __m128i c) { return _mm_castps_si128(_mm_blendv_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), _mm_castsi128_ps(c))); } +#endif + +CPPSPMD_FORCE_INLINE __m128i blendv_epi8(__m128i a, __m128i b, __m128i mask) +{ +#if CPPSPMD_SSE2 + return _mm_castps_si128(_mm_or_ps(_mm_and_ps(_mm_castsi128_ps(mask), _mm_castsi128_ps(b)), _mm_andnot_ps(_mm_castsi128_ps(mask), _mm_castsi128_ps(a)))); +#else + return _mm_blendv_epi8(a, b, mask); +#endif +} + +CPPSPMD_FORCE_INLINE __m128 blendv_mask_ps(__m128 a, __m128 b, __m128 mask) +{ +#if CPPSPMD_SSE2 + // We know it's a mask, so we can just emulate the blend. + return _mm_or_ps(_mm_and_ps(mask, b), _mm_andnot_ps(mask, a)); +#else + return _mm_blendv_ps(a, b, mask); +#endif +} + +CPPSPMD_FORCE_INLINE __m128 blendv_ps(__m128 a, __m128 b, __m128 mask) +{ +#if CPPSPMD_SSE2 + // Input is not a mask, but MSB bits - so emulate _mm_blendv_ps() by replicating bit 31. + mask = _mm_castsi128_ps(_mm_srai_epi32(_mm_castps_si128(mask), 31)); + return _mm_or_ps(_mm_and_ps(mask, b), _mm_andnot_ps(mask, a)); +#else + return _mm_blendv_ps(a, b, mask); +#endif +} + +CPPSPMD_FORCE_INLINE __m128i blendv_mask_epi32(__m128i a, __m128i b, __m128i mask) +{ + return _mm_castps_si128(blendv_mask_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), _mm_castsi128_ps(mask))); +} + +CPPSPMD_FORCE_INLINE __m128i blendv_epi32(__m128i a, __m128i b, __m128i mask) +{ + return _mm_castps_si128(blendv_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), _mm_castsi128_ps(mask))); +} + +#if CPPSPMD_SSE2 +CPPSPMD_FORCE_INLINE int extract_x(const __m128i& vec) { return _mm_cvtsi128_si32(vec); } +CPPSPMD_FORCE_INLINE int extract_y(const __m128i& vec) { return _mm_cvtsi128_si32(_mm_shuffle_epi32(vec, 0x55)); } +CPPSPMD_FORCE_INLINE int extract_z(const __m128i& vec) { return _mm_cvtsi128_si32(_mm_shuffle_epi32(vec, 0xAA)); } +CPPSPMD_FORCE_INLINE int extract_w(const __m128i& vec) { return _mm_cvtsi128_si32(_mm_shuffle_epi32(vec, 0xFF)); } + +// Returns float bits as int, to emulate _mm_extract_ps() +CPPSPMD_FORCE_INLINE int extract_ps_x(const __m128& vec) { float f = _mm_cvtss_f32(vec); return *(const int*)&f; } +CPPSPMD_FORCE_INLINE int extract_ps_y(const __m128& vec) { float f = _mm_cvtss_f32(_mm_shuffle_ps(vec, vec, 0x55)); return *(const int*)&f; } +CPPSPMD_FORCE_INLINE int extract_ps_z(const __m128& vec) { float f = _mm_cvtss_f32(_mm_shuffle_ps(vec, vec, 0xAA)); return *(const int*)&f; } +CPPSPMD_FORCE_INLINE int extract_ps_w(const __m128& vec) { float f = _mm_cvtss_f32(_mm_shuffle_ps(vec, vec, 0xFF)); return *(const int*)&f; } + +// Returns floats +CPPSPMD_FORCE_INLINE float extractf_ps_x(const __m128& vec) { return _mm_cvtss_f32(vec); } +CPPSPMD_FORCE_INLINE float extractf_ps_y(const __m128& vec) { return _mm_cvtss_f32(_mm_shuffle_ps(vec, vec, 0x55)); } +CPPSPMD_FORCE_INLINE float extractf_ps_z(const __m128& vec) { return _mm_cvtss_f32(_mm_shuffle_ps(vec, vec, 0xAA)); } +CPPSPMD_FORCE_INLINE float extractf_ps_w(const __m128& vec) { return _mm_cvtss_f32(_mm_shuffle_ps(vec, vec, 0xFF)); } +#else +CPPSPMD_FORCE_INLINE int extract_x(const __m128i& vec) { return _mm_extract_epi32(vec, 0); } +CPPSPMD_FORCE_INLINE int extract_y(const __m128i& vec) { return _mm_extract_epi32(vec, 1); } +CPPSPMD_FORCE_INLINE int extract_z(const __m128i& vec) { return _mm_extract_epi32(vec, 2); } +CPPSPMD_FORCE_INLINE int extract_w(const __m128i& vec) { return _mm_extract_epi32(vec, 3); } + +// Returns float bits as int +CPPSPMD_FORCE_INLINE int extract_ps_x(const __m128& vec) { return _mm_extract_ps(vec, 0); } +CPPSPMD_FORCE_INLINE int extract_ps_y(const __m128& vec) { return _mm_extract_ps(vec, 1); } +CPPSPMD_FORCE_INLINE int extract_ps_z(const __m128& vec) { return _mm_extract_ps(vec, 2); } +CPPSPMD_FORCE_INLINE int extract_ps_w(const __m128& vec) { return _mm_extract_ps(vec, 3); } + +// Returns floats +CPPSPMD_FORCE_INLINE float extractf_ps_x(const __m128& vec) { int v = extract_ps_x(vec); return *(const float*)&v; } +CPPSPMD_FORCE_INLINE float extractf_ps_y(const __m128& vec) { int v = extract_ps_y(vec); return *(const float*)&v; } +CPPSPMD_FORCE_INLINE float extractf_ps_z(const __m128& vec) { int v = extract_ps_z(vec); return *(const float*)&v; } +CPPSPMD_FORCE_INLINE float extractf_ps_w(const __m128& vec) { int v = extract_ps_w(vec); return *(const float*)&v; } +#endif + +#if CPPSPMD_SSE2 +CPPSPMD_FORCE_INLINE __m128i insert_x(const __m128i& vec, int v) { return _mm_insert_epi16(_mm_insert_epi16(vec, v, 0), (uint32_t)v >> 16U, 1); } +CPPSPMD_FORCE_INLINE __m128i insert_y(const __m128i& vec, int v) { return _mm_insert_epi16(_mm_insert_epi16(vec, v, 2), (uint32_t)v >> 16U, 3); } +CPPSPMD_FORCE_INLINE __m128i insert_z(const __m128i& vec, int v) { return _mm_insert_epi16(_mm_insert_epi16(vec, v, 4), (uint32_t)v >> 16U, 5); } +CPPSPMD_FORCE_INLINE __m128i insert_w(const __m128i& vec, int v) { return _mm_insert_epi16(_mm_insert_epi16(vec, v, 6), (uint32_t)v >> 16U, 7); } +#else +CPPSPMD_FORCE_INLINE __m128i insert_x(const __m128i& vec, int v) { return _mm_insert_epi32(vec, v, 0); } +CPPSPMD_FORCE_INLINE __m128i insert_y(const __m128i& vec, int v) { return _mm_insert_epi32(vec, v, 1); } +CPPSPMD_FORCE_INLINE __m128i insert_z(const __m128i& vec, int v) { return _mm_insert_epi32(vec, v, 2); } +CPPSPMD_FORCE_INLINE __m128i insert_w(const __m128i& vec, int v) { return _mm_insert_epi32(vec, v, 3); } +#endif + +#if CPPSPMD_SSE2 +inline __m128i shuffle_epi8(const __m128i& a, const __m128i& b) +{ + // Just emulate _mm_shuffle_epi8. This is very slow, but what else can we do? + CPPSPMD_ALIGN(16) uint8_t av[16]; + _mm_store_si128((__m128i*)av, a); + + CPPSPMD_ALIGN(16) uint8_t bvi[16]; + _mm_store_ps((float*)bvi, _mm_and_ps(_mm_castsi128_ps(b), _mm_castsi128_ps(_mm_set1_epi32(0x0F0F0F0F)))); + + CPPSPMD_ALIGN(16) uint8_t result[16]; + + result[0] = av[bvi[0]]; + result[1] = av[bvi[1]]; + result[2] = av[bvi[2]]; + result[3] = av[bvi[3]]; + + result[4] = av[bvi[4]]; + result[5] = av[bvi[5]]; + result[6] = av[bvi[6]]; + result[7] = av[bvi[7]]; + + result[8] = av[bvi[8]]; + result[9] = av[bvi[9]]; + result[10] = av[bvi[10]]; + result[11] = av[bvi[11]]; + + result[12] = av[bvi[12]]; + result[13] = av[bvi[13]]; + result[14] = av[bvi[14]]; + result[15] = av[bvi[15]]; + + return _mm_andnot_si128(_mm_cmplt_epi8(b, _mm_setzero_si128()), _mm_load_si128((__m128i*)result)); +} +#else +CPPSPMD_FORCE_INLINE __m128i shuffle_epi8(const __m128i& a, const __m128i& b) +{ + return _mm_shuffle_epi8(a, b); +} +#endif + +#if CPPSPMD_SSE2 +CPPSPMD_FORCE_INLINE __m128i min_epi32(__m128i a, __m128i b) +{ + return blendv_mask_epi32(b, a, _mm_cmplt_epi32(a, b)); +} +CPPSPMD_FORCE_INLINE __m128i max_epi32(__m128i a, __m128i b) +{ + return blendv_mask_epi32(b, a, _mm_cmpgt_epi32(a, b)); +} +CPPSPMD_FORCE_INLINE __m128i min_epu32(__m128i a, __m128i b) +{ + __m128i n = _mm_set1_epi32(0x80000000); + __m128i ac = _mm_add_epi32(a, n); + __m128i bc = _mm_add_epi32(b, n); + return blendv_mask_epi32(b, a, _mm_cmplt_epi32(ac, bc)); +} +CPPSPMD_FORCE_INLINE __m128i max_epu32(__m128i a, __m128i b) +{ + __m128i n = _mm_set1_epi32(0x80000000); + __m128i ac = _mm_add_epi32(a, n); + __m128i bc = _mm_add_epi32(b, n); + return blendv_mask_epi32(b, a, _mm_cmpgt_epi32(ac, bc)); +} +#else +CPPSPMD_FORCE_INLINE __m128i min_epi32(__m128i a, __m128i b) +{ + return _mm_min_epi32(a, b); +} +CPPSPMD_FORCE_INLINE __m128i max_epi32(__m128i a, __m128i b) +{ + return _mm_max_epi32(a, b); +} +CPPSPMD_FORCE_INLINE __m128i min_epu32(__m128i a, __m128i b) +{ + return _mm_min_epu32(a, b); +} +CPPSPMD_FORCE_INLINE __m128i max_epu32(__m128i a, __m128i b) +{ + return _mm_max_epu32(a, b); +} +#endif + +#if CPPSPMD_SSE2 +CPPSPMD_FORCE_INLINE __m128i abs_epi32(__m128i a) +{ + __m128i sign_mask = _mm_srai_epi32(a, 31); + return _mm_sub_epi32(_mm_castps_si128(_mm_xor_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(sign_mask))), sign_mask); +} +#else +CPPSPMD_FORCE_INLINE __m128i abs_epi32(__m128i a) +{ + return _mm_abs_epi32(a); +} +#endif + +#if CPPSPMD_SSE2 +CPPSPMD_FORCE_INLINE __m128i mullo_epi32(__m128i a, __m128i b) +{ + __m128i tmp1 = _mm_mul_epu32(a, b); + __m128i tmp2 = _mm_mul_epu32(_mm_srli_si128(a, 4), _mm_srli_si128(b, 4)); + return _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE(0, 0, 2, 0)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE(0, 0, 2, 0))); +} +#else +CPPSPMD_FORCE_INLINE __m128i mullo_epi32(__m128i a, __m128i b) +{ + return _mm_mullo_epi32(a, b); +} +#endif + +CPPSPMD_FORCE_INLINE __m128i mulhi_epu32(__m128i a, __m128i b) +{ + __m128i tmp1 = _mm_mul_epu32(a, b); + __m128i tmp2 = _mm_mul_epu32(_mm_srli_si128(a, 4), _mm_srli_si128(b, 4)); + return _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE(0, 0, 3, 1)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE(0, 0, 3, 1))); +} + +#if CPPSPMD_SSE2 +inline __m128i load_rgba32(const void* p) +{ + __m128i xmm = _mm_cvtsi32_si128(*(const int*)p); + xmm = _mm_unpacklo_epi8(xmm, _mm_setzero_si128()); + xmm = _mm_unpacklo_epi16(xmm, _mm_setzero_si128()); + return xmm; +} +#else +inline __m128i load_rgba32(const void* p) +{ + return _mm_cvtepu8_epi32(_mm_castps_si128(_mm_load_ss((const float*)p))); +} +#endif + +inline void transpose4x4(__m128i& x, __m128i& y, __m128i& z, __m128i& w, const __m128i& r0, const __m128i& r1, const __m128i& r2, const __m128i& r3) +{ + __m128i t0 = _mm_unpacklo_epi32(r0, r1); + __m128i t1 = _mm_unpacklo_epi32(r2, r3); + __m128i t2 = _mm_unpackhi_epi32(r0, r1); + __m128i t3 = _mm_unpackhi_epi32(r2, r3); + x = _mm_unpacklo_epi64(t0, t1); + y = _mm_unpackhi_epi64(t0, t1); + z = _mm_unpacklo_epi64(t2, t3); + w = _mm_unpackhi_epi64(t2, t3); +} + +const uint32_t ALL_ON_MOVEMASK = 0xF; + +struct spmd_kernel +{ + struct vint; + struct lint; + struct vbool; + struct vfloat; + + typedef int int_t; + typedef vint vint_t; + typedef lint lint_t; + + // Exec mask + struct exec_mask + { + __m128i m_mask; + + exec_mask() = default; + + CPPSPMD_FORCE_INLINE explicit exec_mask(const vbool& b); + CPPSPMD_FORCE_INLINE explicit exec_mask(const __m128i& mask) : m_mask(mask) { } + + CPPSPMD_FORCE_INLINE void enable_lane(uint32_t lane) { m_mask = _mm_load_si128((const __m128i *)&g_lane_masks_128[lane][0]); } + + static CPPSPMD_FORCE_INLINE exec_mask all_on() { return exec_mask{ _mm_load_si128((const __m128i*)g_allones_128) }; } + static CPPSPMD_FORCE_INLINE exec_mask all_off() { return exec_mask{ _mm_setzero_si128() }; } + + CPPSPMD_FORCE_INLINE uint32_t get_movemask() const { return _mm_movemask_ps(_mm_castsi128_ps(m_mask)); } + }; + + friend CPPSPMD_FORCE_INLINE bool all(const exec_mask& e); + friend CPPSPMD_FORCE_INLINE bool any(const exec_mask& e); + + CPPSPMD_FORCE_INLINE bool spmd_all() const { return all(m_exec); } + CPPSPMD_FORCE_INLINE bool spmd_any() const { return any(m_exec); } + CPPSPMD_FORCE_INLINE bool spmd_none() { return !any(m_exec); } + + // true if cond is true for all active lanes - false if no active lanes + CPPSPMD_FORCE_INLINE bool spmd_all(const vbool& e) { uint32_t m = m_exec.get_movemask(); return (m != 0) && ((exec_mask(e) & m_exec).get_movemask() == m); } + // true if cond is true for any active lanes + CPPSPMD_FORCE_INLINE bool spmd_any(const vbool& e) { return (exec_mask(e) & m_exec).get_movemask() != 0; } + CPPSPMD_FORCE_INLINE bool spmd_none(const vbool& e) { return !spmd_any(e); } + + friend CPPSPMD_FORCE_INLINE exec_mask operator^ (const exec_mask& a, const exec_mask& b); + friend CPPSPMD_FORCE_INLINE exec_mask operator& (const exec_mask& a, const exec_mask& b); + friend CPPSPMD_FORCE_INLINE exec_mask operator| (const exec_mask& a, const exec_mask& b); + + exec_mask m_exec; + exec_mask m_kernel_exec; + exec_mask m_continue_mask; +#ifdef _DEBUG + bool m_in_loop; +#endif + + CPPSPMD_FORCE_INLINE uint32_t get_movemask() const { return m_exec.get_movemask(); } + + void init(const exec_mask& kernel_exec); + + // Varying bool + + struct vbool + { + __m128i m_value; + + vbool() = default; + + CPPSPMD_FORCE_INLINE vbool(bool value) : m_value(_mm_set1_epi32(value ? UINT32_MAX : 0)) { } + + CPPSPMD_FORCE_INLINE explicit vbool(const __m128i& value) : m_value(value) { } + + CPPSPMD_FORCE_INLINE explicit operator vfloat() const; + CPPSPMD_FORCE_INLINE explicit operator vint() const; + + private: + vbool& operator=(const vbool&); + }; + + friend vbool operator!(const vbool& v); + + CPPSPMD_FORCE_INLINE vbool& store(vbool& dst, const vbool& src) + { + dst.m_value = blendv_mask_epi32(dst.m_value, src.m_value, m_exec.m_mask); + return dst; + } + + CPPSPMD_FORCE_INLINE vbool& store_all(vbool& dst, const vbool& src) + { + dst.m_value = src.m_value; + return dst; + } + + // Varying float + struct vfloat + { + __m128 m_value; + + vfloat() = default; + + CPPSPMD_FORCE_INLINE explicit vfloat(const __m128& v) : m_value(v) { } + + CPPSPMD_FORCE_INLINE vfloat(float value) : m_value(_mm_set1_ps(value)) { } + + CPPSPMD_FORCE_INLINE explicit vfloat(int value) : m_value(_mm_set1_ps((float)value)) { } + + private: + vfloat& operator=(const vfloat&); + }; + + CPPSPMD_FORCE_INLINE vfloat& store(vfloat& dst, const vfloat& src) + { + dst.m_value = blendv_mask_ps(dst.m_value, src.m_value, _mm_castsi128_ps(m_exec.m_mask)); + return dst; + } + + CPPSPMD_FORCE_INLINE vfloat& store(vfloat&& dst, const vfloat& src) + { + dst.m_value = blendv_mask_ps(dst.m_value, src.m_value, _mm_castsi128_ps(m_exec.m_mask)); + return { dst }; + } + + CPPSPMD_FORCE_INLINE vfloat& store_all(vfloat& dst, const vfloat& src) + { + dst.m_value = src.m_value; + return dst; + } + + CPPSPMD_FORCE_INLINE vfloat& store_all(vfloat&& dst, const vfloat& src) + { + dst.m_value = src.m_value; + return { dst }; + } + + // Linear ref to floats + struct float_lref + { + float* m_pValue; + + private: + float_lref& operator=(const float_lref&); + }; + + CPPSPMD_FORCE_INLINE const float_lref& store(const float_lref& dst, const vfloat& src) + { + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + if (mask == ALL_ON_MOVEMASK) + _mm_storeu_ps(dst.m_pValue, src.m_value); + else + _mm_storeu_ps(dst.m_pValue, blendv_mask_ps(_mm_loadu_ps(dst.m_pValue), src.m_value, _mm_castsi128_ps(m_exec.m_mask))); + return dst; + } + + CPPSPMD_FORCE_INLINE const float_lref& store(const float_lref&& dst, const vfloat& src) + { + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + if (mask == ALL_ON_MOVEMASK) + _mm_storeu_ps(dst.m_pValue, src.m_value); + else + _mm_storeu_ps(dst.m_pValue, blendv_mask_ps(_mm_loadu_ps(dst.m_pValue), src.m_value, _mm_castsi128_ps(m_exec.m_mask))); + return dst; + } + + CPPSPMD_FORCE_INLINE const float_lref& store_all(const float_lref& dst, const vfloat& src) + { + _mm_storeu_ps(dst.m_pValue, src.m_value); + return dst; + } + + CPPSPMD_FORCE_INLINE const float_lref& store_all(const float_lref&& dst, const vfloat& src) + { + _mm_storeu_ps(dst.m_pValue, src.m_value); + return dst; + } + + CPPSPMD_FORCE_INLINE vfloat load(const float_lref& src) + { + return vfloat{ _mm_and_ps(_mm_loadu_ps(src.m_pValue), _mm_castsi128_ps(m_exec.m_mask)) }; + } + + // Varying ref to floats + struct float_vref + { + __m128i m_vindex; + float* m_pValue; + + private: + float_vref& operator=(const float_vref&); + }; + + // Varying ref to varying float + struct vfloat_vref + { + __m128i m_vindex; + vfloat* m_pValue; + + private: + vfloat_vref& operator=(const vfloat_vref&); + }; + + // Varying ref to varying int + struct vint_vref + { + __m128i m_vindex; + vint* m_pValue; + + private: + vint_vref& operator=(const vint_vref&); + }; + + CPPSPMD_FORCE_INLINE const float_vref& store(const float_vref& dst, const vfloat& src); + CPPSPMD_FORCE_INLINE const float_vref& store(const float_vref&& dst, const vfloat& src); + + CPPSPMD_FORCE_INLINE const float_vref& store_all(const float_vref& dst, const vfloat& src); + CPPSPMD_FORCE_INLINE const float_vref& store_all(const float_vref&& dst, const vfloat& src); + + CPPSPMD_FORCE_INLINE vfloat load(const float_vref& src) + { + CPPSPMD_ALIGN(16) int vindex[4]; + _mm_store_si128((__m128i *)vindex, src.m_vindex); + + CPPSPMD_ALIGN(16) float loaded[4]; + + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + for (int i = 0; i < 4; i++) + { + if (mask & (1 << i)) + loaded[i] = src.m_pValue[vindex[i]]; + } + return vfloat{ _mm_and_ps(_mm_castsi128_ps(m_exec.m_mask), _mm_load_ps((const float*)loaded)) }; + } + + CPPSPMD_FORCE_INLINE vfloat load_all(const float_vref& src) + { + CPPSPMD_ALIGN(16) int vindex[4]; + _mm_store_si128((__m128i *)vindex, src.m_vindex); + + CPPSPMD_ALIGN(16) float loaded[4]; + + for (int i = 0; i < 4; i++) + loaded[i] = src.m_pValue[vindex[i]]; + return vfloat{ _mm_load_ps((const float*)loaded) }; + } + + // Linear ref to ints + struct int_lref + { + int* m_pValue; + + private: + int_lref& operator=(const int_lref&); + }; + + CPPSPMD_FORCE_INLINE const int_lref& store(const int_lref& dst, const vint& src) + { + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + if (mask == ALL_ON_MOVEMASK) + { + _mm_storeu_si128((__m128i *)dst.m_pValue, src.m_value); + } + else + { + CPPSPMD_ALIGN(16) int stored[4]; + _mm_store_si128((__m128i *)stored, src.m_value); + + for (int i = 0; i < 4; i++) + { + if (mask & (1 << i)) + dst.m_pValue[i] = stored[i]; + } + } + return dst; + } + + CPPSPMD_FORCE_INLINE vint load(const int_lref& src) + { + __m128i v = _mm_loadu_si128((const __m128i*)src.m_pValue); + + v = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(v), _mm_castsi128_ps(m_exec.m_mask))); + + return vint{ v }; + } + + // Linear ref to int16's + struct int16_lref + { + int16_t* m_pValue; + + private: + int16_lref& operator=(const int16_lref&); + }; + + CPPSPMD_FORCE_INLINE const int16_lref& store(const int16_lref& dst, const vint& src) + { + CPPSPMD_ALIGN(16) int stored[4]; + _mm_store_si128((__m128i *)stored, src.m_value); + + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + for (int i = 0; i < 4; i++) + { + if (mask & (1 << i)) + dst.m_pValue[i] = static_cast(stored[i]); + } + return dst; + } + + CPPSPMD_FORCE_INLINE const int16_lref& store_all(const int16_lref& dst, const vint& src) + { + CPPSPMD_ALIGN(16) int stored[4]; + _mm_store_si128((__m128i *)stored, src.m_value); + + for (int i = 0; i < 4; i++) + dst.m_pValue[i] = static_cast(stored[i]); + return dst; + } + + CPPSPMD_FORCE_INLINE vint load(const int16_lref& src) + { + CPPSPMD_ALIGN(16) int values[4]; + + for (int i = 0; i < 4; i++) + values[i] = static_cast(src.m_pValue[i]); + + __m128i t = _mm_load_si128( (const __m128i *)values ); + + return vint{ _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps( t ), _mm_castsi128_ps(m_exec.m_mask))) }; + } + + CPPSPMD_FORCE_INLINE vint load_all(const int16_lref& src) + { + CPPSPMD_ALIGN(16) int values[4]; + + for (int i = 0; i < 4; i++) + values[i] = static_cast(src.m_pValue[i]); + + __m128i t = _mm_load_si128( (const __m128i *)values ); + + return vint{ t }; + } + + // Linear ref to constant ints + struct cint_lref + { + const int* m_pValue; + + private: + cint_lref& operator=(const cint_lref&); + }; + + CPPSPMD_FORCE_INLINE vint load(const cint_lref& src) + { + __m128i v = _mm_loadu_si128((const __m128i *)src.m_pValue); + v = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(v), _mm_castsi128_ps(m_exec.m_mask))); + return vint{ v }; + } + + CPPSPMD_FORCE_INLINE vint load_all(const cint_lref& src) + { + return vint{ _mm_loadu_si128((const __m128i *)src.m_pValue) }; + } + + // Varying ref to ints + struct int_vref + { + __m128i m_vindex; + int* m_pValue; + + private: + int_vref& operator=(const int_vref&); + }; + + // Varying ref to constant ints + struct cint_vref + { + __m128i m_vindex; + const int* m_pValue; + + private: + cint_vref& operator=(const cint_vref&); + }; + + // Varying int + struct vint + { + __m128i m_value; + + vint() = default; + + CPPSPMD_FORCE_INLINE explicit vint(const __m128i& value) : m_value(value) { } + + CPPSPMD_FORCE_INLINE explicit vint(const lint &other) : m_value(other.m_value) { } + + CPPSPMD_FORCE_INLINE vint& operator=(const lint& other) { m_value = other.m_value; return *this; } + + CPPSPMD_FORCE_INLINE vint(int value) : m_value(_mm_set1_epi32(value)) { } + + CPPSPMD_FORCE_INLINE explicit vint(float value) : m_value(_mm_set1_epi32((int)value)) { } + + CPPSPMD_FORCE_INLINE explicit vint(const vfloat& other) : m_value(_mm_cvttps_epi32(other.m_value)) { } + + CPPSPMD_FORCE_INLINE explicit operator vbool() const + { + return vbool{ _mm_xor_si128( _mm_load_si128((const __m128i*)g_allones_128), _mm_cmpeq_epi32(m_value, _mm_setzero_si128())) }; + } + + CPPSPMD_FORCE_INLINE explicit operator vfloat() const + { + return vfloat{ _mm_cvtepi32_ps(m_value) }; + } + + CPPSPMD_FORCE_INLINE int_vref operator[](int* ptr) const + { + return int_vref{ m_value, ptr }; + } + + CPPSPMD_FORCE_INLINE cint_vref operator[](const int* ptr) const + { + return cint_vref{ m_value, ptr }; + } + + CPPSPMD_FORCE_INLINE float_vref operator[](float* ptr) const + { + return float_vref{ m_value, ptr }; + } + + CPPSPMD_FORCE_INLINE vfloat_vref operator[](vfloat* ptr) const + { + return vfloat_vref{ m_value, ptr }; + } + + CPPSPMD_FORCE_INLINE vint_vref operator[](vint* ptr) const + { + return vint_vref{ m_value, ptr }; + } + + private: + vint& operator=(const vint&); + }; + + // Load/store linear int + CPPSPMD_FORCE_INLINE void storeu_linear(int *pDst, const vint& src) + { + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + if (mask == ALL_ON_MOVEMASK) + _mm_storeu_si128((__m128i *)pDst, src.m_value); + else + { + if (mask & 1) pDst[0] = extract_x(src.m_value); + if (mask & 2) pDst[1] = extract_y(src.m_value); + if (mask & 4) pDst[2] = extract_z(src.m_value); + if (mask & 8) pDst[3] = extract_w(src.m_value); + } + } + + CPPSPMD_FORCE_INLINE void storeu_linear_all(int *pDst, const vint& src) + { + _mm_storeu_si128((__m128i*)pDst, src.m_value); + } + + CPPSPMD_FORCE_INLINE void store_linear_all(int *pDst, const vint& src) + { + _mm_store_si128((__m128i*)pDst, src.m_value); + } + + CPPSPMD_FORCE_INLINE vint loadu_linear(const int *pSrc) + { + __m128i v = _mm_loadu_si128((const __m128i*)pSrc); + + v = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(v), _mm_castsi128_ps(m_exec.m_mask))); + + return vint{ v }; + } + + CPPSPMD_FORCE_INLINE vint loadu_linear_all(const int *pSrc) + { + return vint{ _mm_loadu_si128((__m128i*)pSrc) }; + } + + CPPSPMD_FORCE_INLINE vint load_linear_all(const int *pSrc) + { + return vint{ _mm_load_si128((__m128i*)pSrc) }; + } + + // Load/store linear float + CPPSPMD_FORCE_INLINE void storeu_linear(float *pDst, const vfloat& src) + { + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + if (mask == ALL_ON_MOVEMASK) + _mm_storeu_ps((float*)pDst, src.m_value); + else + { + int *pDstI = (int *)pDst; + if (mask & 1) pDstI[0] = extract_ps_x(src.m_value); + if (mask & 2) pDstI[1] = extract_ps_y(src.m_value); + if (mask & 4) pDstI[2] = extract_ps_z(src.m_value); + if (mask & 8) pDstI[3] = extract_ps_w(src.m_value); + } + } + + CPPSPMD_FORCE_INLINE void storeu_linear_all(float *pDst, const vfloat& src) + { + _mm_storeu_ps((float*)pDst, src.m_value); + } + + CPPSPMD_FORCE_INLINE void store_linear_all(float *pDst, const vfloat& src) + { + _mm_store_ps((float*)pDst, src.m_value); + } + + CPPSPMD_FORCE_INLINE vfloat loadu_linear(const float *pSrc) + { + __m128 v = _mm_loadu_ps((const float*)pSrc); + + v = _mm_and_ps(v, _mm_castsi128_ps(m_exec.m_mask)); + + return vfloat{ v }; + } + + CPPSPMD_FORCE_INLINE vfloat loadu_linear_all(const float *pSrc) + { + return vfloat{ _mm_loadu_ps((float*)pSrc) }; + } + + CPPSPMD_FORCE_INLINE vfloat load_linear_all(const float *pSrc) + { + return vfloat{ _mm_load_ps((float*)pSrc) }; + } + + CPPSPMD_FORCE_INLINE vint& store(vint& dst, const vint& src) + { + dst.m_value = blendv_mask_epi32(dst.m_value, src.m_value, m_exec.m_mask); + return dst; + } + + CPPSPMD_FORCE_INLINE const int_vref& store(const int_vref& dst, const vint& src) + { + CPPSPMD_ALIGN(16) int vindex[4]; + _mm_store_si128((__m128i*)vindex, dst.m_vindex); + + CPPSPMD_ALIGN(16) int stored[4]; + _mm_store_si128((__m128i*)stored, src.m_value); + + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + for (int i = 0; i < 4; i++) + { + if (mask & (1 << i)) + dst.m_pValue[vindex[i]] = stored[i]; + } + return dst; + } + + CPPSPMD_FORCE_INLINE vint& store_all(vint& dst, const vint& src) + { + dst.m_value = src.m_value; + return dst; + } + + CPPSPMD_FORCE_INLINE const int_vref& store_all(const int_vref& dst, const vint& src) + { + CPPSPMD_ALIGN(16) int vindex[4]; + _mm_store_si128((__m128i*)vindex, dst.m_vindex); + + CPPSPMD_ALIGN(16) int stored[4]; + _mm_store_si128((__m128i*)stored, src.m_value); + + for (int i = 0; i < 4; i++) + dst.m_pValue[vindex[i]] = stored[i]; + + return dst; + } + + CPPSPMD_FORCE_INLINE vint load(const int_vref& src) + { + CPPSPMD_ALIGN(16) int values[4]; + + CPPSPMD_ALIGN(16) int indices[4]; + _mm_store_si128((__m128i *)indices, src.m_vindex); + + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + for (int i = 0; i < 4; i++) + { + if (mask & (1 << i)) + values[i] = src.m_pValue[indices[i]]; + } + + return vint{ _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(m_exec.m_mask), _mm_load_ps((const float*)values))) }; + } + + CPPSPMD_FORCE_INLINE vint load_all(const int_vref& src) + { + CPPSPMD_ALIGN(16) int values[4]; + + CPPSPMD_ALIGN(16) int indices[4]; + _mm_store_si128((__m128i *)indices, src.m_vindex); + + for (int i = 0; i < 4; i++) + values[i] = src.m_pValue[indices[i]]; + + return vint{ _mm_castps_si128( _mm_load_ps((const float*)values)) }; + } + + CPPSPMD_FORCE_INLINE vint load(const cint_vref& src) + { + CPPSPMD_ALIGN(16) int values[4]; + + CPPSPMD_ALIGN(16) int indices[4]; + _mm_store_si128((__m128i *)indices, src.m_vindex); + + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + for (int i = 0; i < 4; i++) + { + if (mask & (1 << i)) + values[i] = src.m_pValue[indices[i]]; + } + + return vint{ _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(m_exec.m_mask), _mm_load_ps((const float*)values))) }; + } + + CPPSPMD_FORCE_INLINE vint load_all(const cint_vref& src) + { + CPPSPMD_ALIGN(16) int values[4]; + + CPPSPMD_ALIGN(16) int indices[4]; + _mm_store_si128((__m128i *)indices, src.m_vindex); + + for (int i = 0; i < 4; i++) + values[i] = src.m_pValue[indices[i]]; + + return vint{ _mm_castps_si128( _mm_load_ps((const float*)values)) }; + } + + CPPSPMD_FORCE_INLINE vint load_bytes_all(const cint_vref& src) + { + __m128i v0_l; + + const uint8_t* pSrc = (const uint8_t*)src.m_pValue; + v0_l = insert_x(_mm_undefined_si128(), ((int*)(pSrc + extract_x(src.m_vindex)))[0]); + v0_l = insert_y(v0_l, ((int*)(pSrc + extract_y(src.m_vindex)))[0]); + v0_l = insert_z(v0_l, ((int*)(pSrc + extract_z(src.m_vindex)))[0]); + v0_l = insert_w(v0_l, ((int*)(pSrc + extract_w(src.m_vindex)))[0]); + + return vint{ v0_l }; + } + + CPPSPMD_FORCE_INLINE vint load_words_all(const cint_vref& src) + { + __m128i v0_l; + + const uint8_t* pSrc = (const uint8_t*)src.m_pValue; + v0_l = insert_x(_mm_undefined_si128(), ((int16_t*)(pSrc + 2 * extract_x(src.m_vindex)))[0]); + v0_l = insert_y(v0_l, ((int16_t*)(pSrc + 2 * extract_y(src.m_vindex)))[0]); + v0_l = insert_z(v0_l, ((int16_t*)(pSrc + 2 * extract_z(src.m_vindex)))[0]); + v0_l = insert_w(v0_l, ((int16_t*)(pSrc + 2 * extract_w(src.m_vindex)))[0]); + + return vint{ v0_l }; + } + + CPPSPMD_FORCE_INLINE void store_strided(int *pDst, uint32_t stride, const vint &v) + { + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + + if (mask & 1) pDst[0] = extract_x(v.m_value); + if (mask & 2) pDst[stride] = extract_y(v.m_value); + if (mask & 4) pDst[stride*2] = extract_z(v.m_value); + if (mask & 8) pDst[stride*3] = extract_w(v.m_value); + } + + CPPSPMD_FORCE_INLINE void store_strided(float *pDstF, uint32_t stride, const vfloat &v) + { + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + + if (mask & 1) ((int *)pDstF)[0] = extract_ps_x(v.m_value); + if (mask & 2) ((int *)pDstF)[stride] = extract_ps_y(v.m_value); + if (mask & 4) ((int *)pDstF)[stride*2] = extract_ps_z(v.m_value); + if (mask & 8) ((int *)pDstF)[stride*3] = extract_ps_w(v.m_value); + } + + CPPSPMD_FORCE_INLINE void store_all_strided(int *pDst, uint32_t stride, const vint &v) + { + pDst[0] = extract_x(v.m_value); + pDst[stride] = extract_y(v.m_value); + pDst[stride*2] = extract_z(v.m_value); + pDst[stride*3] = extract_w(v.m_value); + } + + CPPSPMD_FORCE_INLINE void store_all_strided(float *pDstF, uint32_t stride, const vfloat &v) + { + ((int *)pDstF)[0] = extract_ps_x(v.m_value); + ((int *)pDstF)[stride] = extract_ps_y(v.m_value); + ((int *)pDstF)[stride*2] = extract_ps_z(v.m_value); + ((int *)pDstF)[stride*3] = extract_ps_w(v.m_value); + } + + CPPSPMD_FORCE_INLINE vint load_strided(const int *pSrc, uint32_t stride) + { + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + +#if CPPSPMD_SSE2 + CPPSPMD_ALIGN(16) int vals[4] = { 0, 0, 0, 0 }; + if (mask & 1) vals[0] = pSrc[0]; + if (mask & 2) vals[1] = pSrc[stride]; + if (mask & 4) vals[2] = pSrc[stride * 2]; + if (mask & 8) vals[3] = pSrc[stride * 3]; + return vint{ _mm_load_si128((__m128i*)vals) }; +#else + const float* pSrcF = (const float*)pSrc; + __m128 v = _mm_setzero_ps(); + if (mask & 1) v = _mm_load_ss(pSrcF); + if (mask & 2) v = _mm_insert_ps(v, _mm_load_ss(pSrcF + stride), 0x10); + if (mask & 4) v = _mm_insert_ps(v, _mm_load_ss(pSrcF + 2 * stride), 0x20); + if (mask & 8) v = _mm_insert_ps(v, _mm_load_ss(pSrcF + 3 * stride), 0x30); + return vint{ _mm_castps_si128(v) }; +#endif + } + + CPPSPMD_FORCE_INLINE vfloat load_strided(const float *pSrc, uint32_t stride) + { + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + +#if CPPSPMD_SSE2 + CPPSPMD_ALIGN(16) float vals[4] = { 0, 0, 0, 0 }; + if (mask & 1) vals[0] = pSrc[0]; + if (mask & 2) vals[1] = pSrc[stride]; + if (mask & 4) vals[2] = pSrc[stride * 2]; + if (mask & 8) vals[3] = pSrc[stride * 3]; + return vfloat{ _mm_load_ps(vals) }; +#else + __m128 v = _mm_setzero_ps(); + if (mask & 1) v = _mm_load_ss(pSrc); + if (mask & 2) v = _mm_insert_ps(v, _mm_load_ss(pSrc + stride), 0x10); + if (mask & 4) v = _mm_insert_ps(v, _mm_load_ss(pSrc + 2 * stride), 0x20); + if (mask & 8) v = _mm_insert_ps(v, _mm_load_ss(pSrc + 3 * stride), 0x30); + return vfloat{ v }; +#endif + } + + CPPSPMD_FORCE_INLINE vint load_all_strided(const int *pSrc, uint32_t stride) + { +#if CPPSPMD_SSE2 + CPPSPMD_ALIGN(16) int vals[4]; + vals[0] = pSrc[0]; + vals[1] = pSrc[stride]; + vals[2] = pSrc[stride * 2]; + vals[3] = pSrc[stride * 3]; + return vint{ _mm_load_si128((__m128i*)vals) }; +#else + const float* pSrcF = (const float*)pSrc; + __m128 v = _mm_load_ss(pSrcF); + v = _mm_insert_ps(v, _mm_load_ss(pSrcF + stride), 0x10); + v = _mm_insert_ps(v, _mm_load_ss(pSrcF + 2 * stride), 0x20); + v = _mm_insert_ps(v, _mm_load_ss(pSrcF + 3 * stride), 0x30); + return vint{ _mm_castps_si128(v) }; +#endif + } + + CPPSPMD_FORCE_INLINE vfloat load_all_strided(const float *pSrc, uint32_t stride) + { +#if CPPSPMD_SSE2 + CPPSPMD_ALIGN(16) float vals[4]; + vals[0] = pSrc[0]; + vals[1] = pSrc[stride]; + vals[2] = pSrc[stride * 2]; + vals[3] = pSrc[stride * 3]; + return vfloat{ _mm_load_ps(vals) }; +#else + __m128 v = _mm_load_ss(pSrc); + v = _mm_insert_ps(v, _mm_load_ss(pSrc + stride), 0x10); + v = _mm_insert_ps(v, _mm_load_ss(pSrc + 2 * stride), 0x20); + v = _mm_insert_ps(v, _mm_load_ss(pSrc + 3 * stride), 0x30); + return vfloat{ v }; +#endif + } + + CPPSPMD_FORCE_INLINE const vfloat_vref& store(const vfloat_vref& dst, const vfloat& src) + { + // TODO: There's surely a better way + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + + if (mask & 1) ((int *)(&dst.m_pValue[extract_x(dst.m_vindex)]))[0] = extract_x(_mm_castps_si128(src.m_value)); + if (mask & 2) ((int *)(&dst.m_pValue[extract_y(dst.m_vindex)]))[1] = extract_y(_mm_castps_si128(src.m_value)); + if (mask & 4) ((int *)(&dst.m_pValue[extract_z(dst.m_vindex)]))[2] = extract_z(_mm_castps_si128(src.m_value)); + if (mask & 8) ((int *)(&dst.m_pValue[extract_w(dst.m_vindex)]))[3] = extract_w(_mm_castps_si128(src.m_value)); + + return dst; + } + + CPPSPMD_FORCE_INLINE vfloat load(const vfloat_vref& src) + { + // TODO: There's surely a better way + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + + __m128i k = _mm_setzero_si128(); + + if (mask & 1) k = insert_x(k, ((int *)(&src.m_pValue[extract_x(src.m_vindex)]))[0]); + if (mask & 2) k = insert_y(k, ((int *)(&src.m_pValue[extract_y(src.m_vindex)]))[1]); + if (mask & 4) k = insert_z(k, ((int *)(&src.m_pValue[extract_z(src.m_vindex)]))[2]); + if (mask & 8) k = insert_w(k, ((int *)(&src.m_pValue[extract_w(src.m_vindex)]))[3]); + + return vfloat{ _mm_castsi128_ps(k) }; + } + + CPPSPMD_FORCE_INLINE const vint_vref& store(const vint_vref& dst, const vint& src) + { + // TODO: There's surely a better way + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + + if (mask & 1) ((int *)(&dst.m_pValue[extract_x(dst.m_vindex)]))[0] = extract_x(src.m_value); + if (mask & 2) ((int *)(&dst.m_pValue[extract_y(dst.m_vindex)]))[1] = extract_y(src.m_value); + if (mask & 4) ((int *)(&dst.m_pValue[extract_z(dst.m_vindex)]))[2] = extract_z(src.m_value); + if (mask & 8) ((int *)(&dst.m_pValue[extract_w(dst.m_vindex)]))[3] = extract_w(src.m_value); + + return dst; + } + + CPPSPMD_FORCE_INLINE vint load(const vint_vref& src) + { + // TODO: There's surely a better way + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + + __m128i k = _mm_setzero_si128(); + + if (mask & 1) k = insert_x(k, ((int *)(&src.m_pValue[extract_x(src.m_vindex)]))[0]); + if (mask & 2) k = insert_y(k, ((int *)(&src.m_pValue[extract_y(src.m_vindex)]))[1]); + if (mask & 4) k = insert_z(k, ((int *)(&src.m_pValue[extract_z(src.m_vindex)]))[2]); + if (mask & 8) k = insert_w(k, ((int *)(&src.m_pValue[extract_w(src.m_vindex)]))[3]); + + return vint{ k }; + } + + CPPSPMD_FORCE_INLINE vint load_all(const vint_vref& src) + { + // TODO: There's surely a better way + __m128i k = {}; + + k = insert_x(k, ((int*)(&src.m_pValue[extract_x(src.m_vindex)]))[0]); + k = insert_y(k, ((int*)(&src.m_pValue[extract_y(src.m_vindex)]))[1]); + k = insert_z(k, ((int*)(&src.m_pValue[extract_z(src.m_vindex)]))[2]); + k = insert_w(k, ((int*)(&src.m_pValue[extract_w(src.m_vindex)]))[3]); + + return vint{ k }; + } + + // Linear integer + struct lint + { + __m128i m_value; + + CPPSPMD_FORCE_INLINE explicit lint(__m128i value) + : m_value(value) + { } + + CPPSPMD_FORCE_INLINE explicit operator vfloat() const + { + return vfloat{ _mm_cvtepi32_ps(m_value) }; + } + + CPPSPMD_FORCE_INLINE explicit operator vint() const + { + return vint{ m_value }; + } + + CPPSPMD_FORCE_INLINE int get_first_value() const + { + return _mm_cvtsi128_si32(m_value); + } + + CPPSPMD_FORCE_INLINE float_lref operator[](float* ptr) const + { + return float_lref{ ptr + get_first_value() }; + } + + CPPSPMD_FORCE_INLINE int_lref operator[](int* ptr) const + { + return int_lref{ ptr + get_first_value() }; + } + + CPPSPMD_FORCE_INLINE int16_lref operator[](int16_t* ptr) const + { + return int16_lref{ ptr + get_first_value() }; + } + + CPPSPMD_FORCE_INLINE cint_lref operator[](const int* ptr) const + { + return cint_lref{ ptr + get_first_value() }; + } + + private: + lint& operator=(const lint&); + }; + + CPPSPMD_FORCE_INLINE lint& store_all(lint& dst, const lint& src) + { + dst.m_value = src.m_value; + return dst; + } + + const lint program_index = lint{ _mm_set_epi32( 3, 2, 1, 0 ) }; + + // SPMD condition helpers + + template + CPPSPMD_FORCE_INLINE void spmd_if(const vbool& cond, const IfBody& ifBody); + + CPPSPMD_FORCE_INLINE void spmd_if_break(const vbool& cond); + + // No breaks, continues, etc. allowed + template + CPPSPMD_FORCE_INLINE void spmd_sif(const vbool& cond, const IfBody& ifBody); + + // No breaks, continues, etc. allowed + template + CPPSPMD_FORCE_INLINE void spmd_sifelse(const vbool& cond, const IfBody& ifBody, const ElseBody &elseBody); + + template + CPPSPMD_FORCE_INLINE void spmd_ifelse(const vbool& cond, const IfBody& ifBody, const ElseBody& elseBody); + + template + CPPSPMD_FORCE_INLINE void spmd_while(const WhileCondBody& whileCondBody, const WhileBody& whileBody); + + template + CPPSPMD_FORCE_INLINE void spmd_for(const ForInitBody& forInitBody, const ForCondBody& forCondBody, const ForIncrBody& forIncrBody, const ForBody& forBody); + + template + CPPSPMD_FORCE_INLINE void spmd_foreach(int begin, int end, const ForeachBody& foreachBody); + +#ifdef _DEBUG + CPPSPMD_FORCE_INLINE void check_masks(); +#else + CPPSPMD_FORCE_INLINE void check_masks() { } +#endif + + CPPSPMD_FORCE_INLINE void spmd_break(); + CPPSPMD_FORCE_INLINE void spmd_continue(); + + CPPSPMD_FORCE_INLINE void spmd_return(); + + template + CPPSPMD_FORCE_INLINE void spmd_unmasked(const UnmaskedBody& unmaskedBody); + + template + //CPPSPMD_FORCE_INLINE decltype(auto) spmd_call(Args&&... args); + CPPSPMD_FORCE_INLINE void spmd_call(Args&&... args); + + CPPSPMD_FORCE_INLINE void swap(vint &a, vint &b) { vint temp = a; store(a, b); store(b, temp); } + CPPSPMD_FORCE_INLINE void swap(vfloat &a, vfloat &b) { vfloat temp = a; store(a, b); store(b, temp); } + CPPSPMD_FORCE_INLINE void swap(vbool &a, vbool &b) { vbool temp = a; store(a, b); store(b, temp); } + + CPPSPMD_FORCE_INLINE float reduce_add(vfloat v) + { + __m128 k3210 = _mm_castsi128_ps(blendv_mask_epi32(_mm_setzero_si128(), _mm_castps_si128(v.m_value), m_exec.m_mask)); + __m128 temp = _mm_add_ps(_mm_shuffle_ps(k3210, k3210, _MM_SHUFFLE(0, 1, 2, 3)), k3210); + return _mm_cvtss_f32(_mm_add_ss(_mm_movehl_ps(temp, temp), temp)); + } + + CPPSPMD_FORCE_INLINE int reduce_add(vint v) + { + __m128i k3210 = blendv_mask_epi32(_mm_setzero_si128(), v.m_value, m_exec.m_mask); + __m128i temp = _mm_add_epi32(_mm_shuffle_epi32(k3210, _MM_SHUFFLE(0, 1, 2, 3)), k3210); + return extract_x(_mm_add_epi32(_mm_castps_si128(_mm_movehl_ps(_mm_castsi128_ps(temp), _mm_castsi128_ps(temp))), temp)); + } + + #include "cppspmd_math_declares.h" + +}; // struct spmd_kernel + +using exec_mask = spmd_kernel::exec_mask; +using vint = spmd_kernel::vint; +using int_lref = spmd_kernel::int_lref; +using cint_vref = spmd_kernel::cint_vref; +using cint_lref = spmd_kernel::cint_lref; +using int_vref = spmd_kernel::int_vref; +using lint = spmd_kernel::lint; +using vbool = spmd_kernel::vbool; +using vfloat = spmd_kernel::vfloat; +using float_lref = spmd_kernel::float_lref; +using float_vref = spmd_kernel::float_vref; +using vfloat_vref = spmd_kernel::vfloat_vref; +using vint_vref = spmd_kernel::vint_vref; + +CPPSPMD_FORCE_INLINE spmd_kernel::vbool::operator vfloat() const +{ + return vfloat { _mm_and_ps( _mm_castsi128_ps(m_value), *(const __m128 *)g_onef_128 ) }; +} + +// Returns UINT32_MAX's for true, 0 for false. (Should it return 1's?) +CPPSPMD_FORCE_INLINE spmd_kernel::vbool::operator vint() const +{ + return vint { m_value }; +} + +CPPSPMD_FORCE_INLINE vbool operator!(const vbool& v) +{ + return vbool{ _mm_castps_si128(_mm_xor_ps(_mm_load_ps((const float*)g_allones_128), _mm_castsi128_ps(v.m_value))) }; +} + +CPPSPMD_FORCE_INLINE exec_mask::exec_mask(const vbool& b) { m_mask = b.m_value; } + +CPPSPMD_FORCE_INLINE exec_mask operator^(const exec_mask& a, const exec_mask& b) { return exec_mask{ _mm_xor_si128(a.m_mask, b.m_mask) }; } +CPPSPMD_FORCE_INLINE exec_mask operator&(const exec_mask& a, const exec_mask& b) { return exec_mask{ _mm_and_si128(a.m_mask, b.m_mask) }; } +CPPSPMD_FORCE_INLINE exec_mask operator|(const exec_mask& a, const exec_mask& b) { return exec_mask{ _mm_or_si128(a.m_mask, b.m_mask) }; } + +CPPSPMD_FORCE_INLINE bool all(const exec_mask& e) { return _mm_movemask_ps(_mm_castsi128_ps(e.m_mask)) == ALL_ON_MOVEMASK; } +CPPSPMD_FORCE_INLINE bool any(const exec_mask& e) { return _mm_movemask_ps(_mm_castsi128_ps(e.m_mask)) != 0; } + +// Bad pattern - doesn't factor in the current exec mask. Prefer spmd_any() instead. +CPPSPMD_FORCE_INLINE bool all(const vbool& e) { return _mm_movemask_ps(_mm_castsi128_ps(e.m_value)) == ALL_ON_MOVEMASK; } +CPPSPMD_FORCE_INLINE bool any(const vbool& e) { return _mm_movemask_ps(_mm_castsi128_ps(e.m_value)) != 0; } + +CPPSPMD_FORCE_INLINE exec_mask andnot(const exec_mask& a, const exec_mask& b) { return exec_mask{ _mm_andnot_si128(a.m_mask, b.m_mask) }; } +CPPSPMD_FORCE_INLINE vbool operator||(const vbool& a, const vbool& b) { return vbool{ _mm_or_si128(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vbool operator&&(const vbool& a, const vbool& b) { return vbool{ _mm_and_si128(a.m_value, b.m_value) }; } + +CPPSPMD_FORCE_INLINE vfloat operator+(const vfloat& a, const vfloat& b) { return vfloat{ _mm_add_ps(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vfloat operator-(const vfloat& a, const vfloat& b) { return vfloat{ _mm_sub_ps(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vfloat operator+(float a, const vfloat& b) { return vfloat(a) + b; } +CPPSPMD_FORCE_INLINE vfloat operator+(const vfloat& a, float b) { return a + vfloat(b); } +CPPSPMD_FORCE_INLINE vfloat operator-(const vfloat& a, const vint& b) { return a - vfloat(b); } +CPPSPMD_FORCE_INLINE vfloat operator-(const vint& a, const vfloat& b) { return vfloat(a) - b; } +CPPSPMD_FORCE_INLINE vfloat operator-(const vfloat& a, int b) { return a - vfloat(b); } +CPPSPMD_FORCE_INLINE vfloat operator-(int a, const vfloat& b) { return vfloat(a) - b; } +CPPSPMD_FORCE_INLINE vfloat operator-(const vfloat& a, float b) { return a - vfloat(b); } +CPPSPMD_FORCE_INLINE vfloat operator-(float a, const vfloat& b) { return vfloat(a) - b; } + +CPPSPMD_FORCE_INLINE vfloat operator*(const vfloat& a, const vfloat& b) { return vfloat{ _mm_mul_ps(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vfloat operator*(const vfloat& a, float b) { return a * vfloat(b); } +CPPSPMD_FORCE_INLINE vfloat operator*(float a, const vfloat& b) { return vfloat(a) * b; } +CPPSPMD_FORCE_INLINE vfloat operator*(const vfloat& a, int b) { return a * vfloat(b); } +CPPSPMD_FORCE_INLINE vfloat operator*(int a, const vfloat& b) { return vfloat(a) * b; } + +CPPSPMD_FORCE_INLINE vfloat operator/(const vfloat& a, const vfloat& b) { return vfloat{ _mm_div_ps(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vfloat operator/(const vfloat& a, int b) { return a / vfloat(b); } +CPPSPMD_FORCE_INLINE vfloat operator/(int a, const vfloat& b) { return vfloat(a) / b; } +CPPSPMD_FORCE_INLINE vfloat operator/(const vfloat& a, float b) { return a / vfloat(b); } +CPPSPMD_FORCE_INLINE vfloat operator/(float a, const vfloat& b) { return vfloat(a) / b; } +CPPSPMD_FORCE_INLINE vfloat operator-(const vfloat& v) { return vfloat{ _mm_sub_ps(_mm_xor_ps(v.m_value, v.m_value), v.m_value) }; } + +CPPSPMD_FORCE_INLINE vbool operator==(const vfloat& a, const vfloat& b) { return vbool{ _mm_castps_si128(_mm_cmpeq_ps(a.m_value, b.m_value)) }; } +CPPSPMD_FORCE_INLINE vbool operator==(const vfloat& a, float b) { return a == vfloat(b); } + +CPPSPMD_FORCE_INLINE vbool operator!=(const vfloat& a, const vfloat& b) { return !vbool{ _mm_castps_si128(_mm_cmpeq_ps(a.m_value, b.m_value)) }; } +CPPSPMD_FORCE_INLINE vbool operator!=(const vfloat& a, float b) { return a != vfloat(b); } + +CPPSPMD_FORCE_INLINE vbool operator<(const vfloat& a, const vfloat& b) { return vbool{ _mm_castps_si128(_mm_cmplt_ps(a.m_value, b.m_value)) }; } +CPPSPMD_FORCE_INLINE vbool operator<(const vfloat& a, float b) { return a < vfloat(b); } + +CPPSPMD_FORCE_INLINE vbool operator>(const vfloat& a, const vfloat& b) { return vbool{ _mm_castps_si128(_mm_cmpgt_ps(a.m_value, b.m_value)) }; } +CPPSPMD_FORCE_INLINE vbool operator>(const vfloat& a, float b) { return a > vfloat(b); } + +CPPSPMD_FORCE_INLINE vbool operator<=(const vfloat& a, const vfloat& b) { return vbool{ _mm_castps_si128(_mm_cmple_ps(a.m_value, b.m_value)) }; } +CPPSPMD_FORCE_INLINE vbool operator<=(const vfloat& a, float b) { return a <= vfloat(b); } + +CPPSPMD_FORCE_INLINE vbool operator>=(const vfloat& a, const vfloat& b) { return vbool{ _mm_castps_si128(_mm_cmpge_ps(a.m_value, b.m_value)) }; } +CPPSPMD_FORCE_INLINE vbool operator>=(const vfloat& a, float b) { return a >= vfloat(b); } + +CPPSPMD_FORCE_INLINE vfloat spmd_ternaryf(const vbool& cond, const vfloat& a, const vfloat& b) { return vfloat{ blendv_mask_ps(b.m_value, a.m_value, _mm_castsi128_ps(cond.m_value)) }; } +CPPSPMD_FORCE_INLINE vint spmd_ternaryi(const vbool& cond, const vint& a, const vint& b) { return vint{ blendv_mask_epi32(b.m_value, a.m_value, cond.m_value) }; } + +CPPSPMD_FORCE_INLINE vfloat sqrt(const vfloat& v) { return vfloat{ _mm_sqrt_ps(v.m_value) }; } +CPPSPMD_FORCE_INLINE vfloat abs(const vfloat& v) { return vfloat{ _mm_andnot_ps(_mm_set1_ps(-0.0f), v.m_value) }; } +CPPSPMD_FORCE_INLINE vfloat max(const vfloat& a, const vfloat& b) { return vfloat{ _mm_max_ps(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vfloat min(const vfloat& a, const vfloat& b) { return vfloat{ _mm_min_ps(a.m_value, b.m_value) }; } + +#if CPPSPMD_SSE2 +CPPSPMD_FORCE_INLINE vfloat round_truncate(const vfloat& a) +{ + __m128i abs_a = _mm_and_si128(_mm_castps_si128(a.m_value), _mm_set1_epi32(0x7FFFFFFFU) ); + __m128i has_fractional = _mm_cmplt_epi32(abs_a, _mm_castps_si128(_mm_set1_ps(8388608.0f))); + + __m128i ai = _mm_cvttps_epi32(a.m_value); + + __m128 af = _mm_cvtepi32_ps(ai); + return vfloat{ blendv_mask_ps(a.m_value, af, _mm_castsi128_ps(has_fractional)) }; +} + +CPPSPMD_FORCE_INLINE vfloat floor(const vfloat& a) +{ + __m128i abs_a = _mm_and_si128(_mm_castps_si128(a.m_value), _mm_set1_epi32(0x7FFFFFFFU)); + __m128i has_fractional = _mm_cmplt_epi32(abs_a, _mm_castps_si128(_mm_set1_ps(8388608.0f))); + + __m128i ai = _mm_cvtps_epi32(a.m_value); + __m128 af = _mm_cvtepi32_ps(ai); + __m128 changed = _mm_cvtepi32_ps(_mm_castps_si128(_mm_cmpgt_ps(af, a.m_value))); + + af = _mm_add_ps(af, changed); + + return vfloat{ blendv_mask_ps(a.m_value, af, _mm_castsi128_ps(has_fractional)) }; +} + +CPPSPMD_FORCE_INLINE vfloat ceil(const vfloat& a) +{ + __m128i abs_a = _mm_and_si128(_mm_castps_si128(a.m_value), _mm_set1_epi32(0x7FFFFFFFU)); + __m128i has_fractional = _mm_cmplt_epi32(abs_a, _mm_castps_si128(_mm_set1_ps(8388608.0f))); + + __m128i ai = _mm_cvtps_epi32(a.m_value); + __m128 af = _mm_cvtepi32_ps(ai); + __m128 changed = _mm_cvtepi32_ps(_mm_castps_si128(_mm_cmplt_ps(af, a.m_value))); + + af = _mm_sub_ps(af, changed); + + return vfloat{ blendv_mask_ps(a.m_value, af, _mm_castsi128_ps(has_fractional)) }; +} + +// We need to disable unsafe math optimizations for the key operations used for rounding to nearest. +// I wish there was a better way. +#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__) +inline __m128 add_sub(__m128 a, __m128 b) __attribute__((optimize("-fno-unsafe-math-optimizations"))) +#elif defined(__clang__) +inline __m128 add_sub(__m128 a, __m128 b) __attribute__((optnone)) +#elif defined (_MSC_VER) +#pragma float_control(push) +#pragma float_control(precise, on) +inline __m128 add_sub(__m128 a, __m128 b) +#else +inline __m128 add_sub(__m128 a, __m128 b) +#endif +{ + return _mm_sub_ps(_mm_add_ps(a, b), b); +} + +#if defined (_MSC_VER) +#pragma float_control(pop) +#endif + +CPPSPMD_FORCE_INLINE vfloat round_nearest(const vfloat& a) +{ + __m128i no_fract_fp_bits = _mm_castps_si128(_mm_set1_ps(8388608.0f)); + + __m128i sign_a = _mm_and_si128(_mm_castps_si128(a.m_value), _mm_set1_epi32(0x80000000U)); + __m128 force_int = _mm_castsi128_ps(_mm_or_si128(no_fract_fp_bits, sign_a)); + + // Can't use individual _mm_add_ps/_mm_sub_ps - this will be optimized out with /fp:fast by clang and probably other compilers. + //__m128 temp1 = _mm_add_ps(a.m_value, force_int); + //__m128 temp2 = _mm_sub_ps(temp1, force_int); + __m128 temp2 = add_sub(a.m_value, force_int); + + __m128i abs_a = _mm_and_si128(_mm_castps_si128(a.m_value), _mm_set1_epi32(0x7FFFFFFFU)); + __m128i has_fractional = _mm_cmplt_epi32(abs_a, no_fract_fp_bits); + return vfloat{ blendv_mask_ps(a.m_value, temp2, _mm_castsi128_ps(has_fractional)) }; +} + +#else +CPPSPMD_FORCE_INLINE vfloat floor(const vfloat& v) { return vfloat{ _mm_floor_ps(v.m_value) }; } +CPPSPMD_FORCE_INLINE vfloat ceil(const vfloat& a) { return vfloat{ _mm_ceil_ps(a.m_value) }; } +CPPSPMD_FORCE_INLINE vfloat round_nearest(const vfloat &a) { return vfloat{ _mm_round_ps(a.m_value, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC ) }; } +CPPSPMD_FORCE_INLINE vfloat round_truncate(const vfloat &a) { return vfloat{ _mm_round_ps(a.m_value, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC ) }; } +#endif + +CPPSPMD_FORCE_INLINE vfloat frac(const vfloat& a) { return a - floor(a); } +CPPSPMD_FORCE_INLINE vfloat fmod(vfloat a, vfloat b) { vfloat c = frac(abs(a / b)) * abs(b); return spmd_ternaryf(a < 0, -c, c); } +CPPSPMD_FORCE_INLINE vfloat sign(const vfloat& a) { return spmd_ternaryf(a < 0.0f, 1.0f, 1.0f); } + +CPPSPMD_FORCE_INLINE vint max(const vint& a, const vint& b) { return vint{ max_epi32(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint min(const vint& a, const vint& b) { return vint{ min_epi32(a.m_value, b.m_value) }; } + +CPPSPMD_FORCE_INLINE vint maxu(const vint& a, const vint& b) { return vint{ max_epu32(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint minu(const vint& a, const vint& b) { return vint{ min_epu32(a.m_value, b.m_value) }; } + +CPPSPMD_FORCE_INLINE vint abs(const vint& v) { return vint{ abs_epi32(v.m_value) }; } + +CPPSPMD_FORCE_INLINE vint byteswap(const vint& v) { return vint{ shuffle_epi8(v.m_value, _mm_set_epi8(12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3)) }; } + +CPPSPMD_FORCE_INLINE vint cast_vfloat_to_vint(const vfloat& v) { return vint{ _mm_castps_si128(v.m_value) }; } +CPPSPMD_FORCE_INLINE vfloat cast_vint_to_vfloat(const vint& v) { return vfloat{ _mm_castsi128_ps(v.m_value) }; } + +CPPSPMD_FORCE_INLINE vfloat clamp(const vfloat& v, const vfloat& a, const vfloat& b) +{ + return vfloat{ _mm_min_ps(b.m_value, _mm_max_ps(v.m_value, a.m_value) ) }; +} + +CPPSPMD_FORCE_INLINE vint clamp(const vint& v, const vint& a, const vint& b) +{ + return vint{ min_epi32(b.m_value, max_epi32(v.m_value, a.m_value) ) }; +} + +CPPSPMD_FORCE_INLINE vfloat vfma(const vfloat& a, const vfloat& b, const vfloat& c) +{ + return vfloat{ _mm_add_ps(_mm_mul_ps(a.m_value, b.m_value), c.m_value) }; +} + +CPPSPMD_FORCE_INLINE vfloat vfms(const vfloat& a, const vfloat& b, const vfloat& c) +{ + return vfloat{ _mm_sub_ps(_mm_mul_ps(a.m_value, b.m_value), c.m_value) }; +} + +CPPSPMD_FORCE_INLINE vfloat vfnma(const vfloat& a, const vfloat& b, const vfloat& c) +{ + return vfloat{ _mm_sub_ps(c.m_value, _mm_mul_ps(a.m_value, b.m_value)) }; +} + +CPPSPMD_FORCE_INLINE vfloat vfnms(const vfloat& a, const vfloat& b, const vfloat& c) +{ + return vfloat{ _mm_sub_ps(_mm_sub_ps(_mm_xor_ps(a.m_value, a.m_value), _mm_mul_ps(a.m_value, b.m_value)), c.m_value) }; +} + +CPPSPMD_FORCE_INLINE vfloat lerp(const vfloat &x, const vfloat &y, const vfloat &s) { return vfma(y - x, s, x); } + +CPPSPMD_FORCE_INLINE lint operator+(int a, const lint& b) { return lint{ _mm_add_epi32(_mm_set1_epi32(a), b.m_value) }; } +CPPSPMD_FORCE_INLINE lint operator+(const lint& a, int b) { return lint{ _mm_add_epi32(a.m_value, _mm_set1_epi32(b)) }; } +CPPSPMD_FORCE_INLINE vfloat operator+(float a, const lint& b) { return vfloat(a) + vfloat(b); } +CPPSPMD_FORCE_INLINE vfloat operator+(const lint& a, float b) { return vfloat(a) + vfloat(b); } +CPPSPMD_FORCE_INLINE vfloat operator*(const lint& a, float b) { return vfloat(a) * vfloat(b); } +CPPSPMD_FORCE_INLINE vfloat operator*(float b, const lint& a) { return vfloat(a) * vfloat(b); } + +CPPSPMD_FORCE_INLINE vint operator&(const vint& a, const vint& b) { return vint{ _mm_and_si128(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint operator&(const vint& a, int b) { return a & vint(b); } +CPPSPMD_FORCE_INLINE vint andnot(const vint& a, const vint& b) { return vint{ _mm_andnot_si128(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint operator|(const vint& a, const vint& b) { return vint{ _mm_or_si128(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint operator|(const vint& a, int b) { return a | vint(b); } +CPPSPMD_FORCE_INLINE vint operator^(const vint& a, const vint& b) { return vint{ _mm_xor_si128(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint operator^(const vint& a, int b) { return a ^ vint(b); } +CPPSPMD_FORCE_INLINE vbool operator==(const vint& a, const vint& b) { return vbool{ _mm_cmpeq_epi32(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vbool operator!=(const vint& a, const vint& b) { return !vbool{ _mm_cmpeq_epi32(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vbool operator<(const vint& a, const vint& b) { return vbool{ _mm_cmpgt_epi32(b.m_value, a.m_value) }; } +CPPSPMD_FORCE_INLINE vbool operator<=(const vint& a, const vint& b) { return !vbool{ _mm_cmpgt_epi32(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vbool operator>=(const vint& a, const vint& b) { return !vbool{ _mm_cmpgt_epi32(b.m_value, a.m_value) }; } +CPPSPMD_FORCE_INLINE vbool operator>(const vint& a, const vint& b) { return vbool{ _mm_cmpgt_epi32(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint operator+(const vint& a, const vint& b) { return vint{ _mm_add_epi32(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint operator-(const vint& a, const vint& b) { return vint{ _mm_sub_epi32(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint operator+(const vint& a, int b) { return a + vint(b); } +CPPSPMD_FORCE_INLINE vint operator-(const vint& a, int b) { return a - vint(b); } +CPPSPMD_FORCE_INLINE vint operator+(int a, const vint& b) { return vint(a) + b; } +CPPSPMD_FORCE_INLINE vint operator-(int a, const vint& b) { return vint(a) - b; } +CPPSPMD_FORCE_INLINE vint operator*(const vint& a, const vint& b) { return vint{ mullo_epi32(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint operator*(const vint& a, int b) { return a * vint(b); } +CPPSPMD_FORCE_INLINE vint operator*(int a, const vint& b) { return vint(a) * b; } + +CPPSPMD_FORCE_INLINE vint mulhiu(const vint& a, const vint& b) { return vint{ mulhi_epu32(a.m_value, b.m_value) }; } + +CPPSPMD_FORCE_INLINE vint operator-(const vint& v) { return vint{ _mm_sub_epi32(_mm_setzero_si128(), v.m_value) }; } + +CPPSPMD_FORCE_INLINE vint operator~(const vint& a) { return vint{ -a - 1 }; } + +// A few of these break the lane-based abstraction model. They are supported in SSE2, so it makes sense to support them and let the user figure it out. +CPPSPMD_FORCE_INLINE vint adds_epu8(const vint& a, const vint& b) { return vint{ _mm_adds_epu8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint subs_epu8(const vint& a, const vint& b) { return vint{ _mm_subs_epu8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint avg_epu8(const vint & a, const vint & b) { return vint{ _mm_avg_epu8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint max_epu8(const vint& a, const vint& b) { return vint{ _mm_max_epu8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint min_epu8(const vint& a, const vint& b) { return vint{ _mm_min_epu8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint sad_epu8(const vint& a, const vint& b) { return vint{ _mm_sad_epu8(a.m_value, b.m_value) }; } + +CPPSPMD_FORCE_INLINE vint add_epi8(const vint& a, const vint& b) { return vint{ _mm_add_epi8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint adds_epi8(const vint& a, const vint& b) { return vint{ _mm_adds_epi8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint sub_epi8(const vint& a, const vint& b) { return vint{ _mm_sub_epi8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint subs_epi8(const vint& a, const vint& b) { return vint{ _mm_subs_epi8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint cmpeq_epi8(const vint& a, const vint& b) { return vint{ _mm_cmpeq_epi8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint cmpgt_epi8(const vint& a, const vint& b) { return vint{ _mm_cmpgt_epi8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint cmplt_epi8(const vint& a, const vint& b) { return vint{ _mm_cmplt_epi8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint unpacklo_epi8(const vint& a, const vint& b) { return vint{ _mm_unpacklo_epi8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint unpackhi_epi8(const vint& a, const vint& b) { return vint{ _mm_unpackhi_epi8(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE int movemask_epi8(const vint& a) { return _mm_movemask_epi8(a.m_value); } +CPPSPMD_FORCE_INLINE int movemask_epi32(const vint& a) { return _mm_movemask_ps(_mm_castsi128_ps(a.m_value)); } + +CPPSPMD_FORCE_INLINE vint cmple_epu8(const vint& a, const vint& b) { return vint{ _mm_cmpeq_epi8(_mm_min_epu8(a.m_value, b.m_value), a.m_value) }; } +CPPSPMD_FORCE_INLINE vint cmpge_epu8(const vint& a, const vint& b) { return vint{ cmple_epu8(b, a) }; } +CPPSPMD_FORCE_INLINE vint cmpgt_epu8(const vint& a, const vint& b) { return vint{ _mm_andnot_si128(_mm_cmpeq_epi8(a.m_value, b.m_value), _mm_cmpeq_epi8(_mm_max_epu8(a.m_value, b.m_value), a.m_value)) }; } +CPPSPMD_FORCE_INLINE vint cmplt_epu8(const vint& a, const vint& b) { return vint{ cmpgt_epu8(b, a) }; } +CPPSPMD_FORCE_INLINE vint absdiff_epu8(const vint& a, const vint& b) { return vint{ _mm_or_si128(_mm_subs_epu8(a.m_value, b.m_value), _mm_subs_epu8(b.m_value, a.m_value)) }; } + +CPPSPMD_FORCE_INLINE vint blendv_epi8(const vint& a, const vint& b, const vint &mask) { return vint{ blendv_epi8(a.m_value, b.m_value, _mm_cmplt_epi8(mask.m_value, _mm_setzero_si128())) }; } +CPPSPMD_FORCE_INLINE vint blendv_epi32(const vint& a, const vint& b, const vint &mask) { return vint{ blendv_epi32(a.m_value, b.m_value, mask.m_value) }; } + +CPPSPMD_FORCE_INLINE vint add_epi16(const vint& a, const vint& b) { return vint{ _mm_add_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint adds_epi16(const vint& a, const vint& b) { return vint{ _mm_adds_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint adds_epu16(const vint& a, const vint& b) { return vint{ _mm_adds_epu16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint avg_epu16(const vint& a, const vint& b) { return vint{ _mm_avg_epu16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint sub_epi16(const vint& a, const vint& b) { return vint{ _mm_sub_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint subs_epi16(const vint& a, const vint& b) { return vint{ _mm_subs_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint subs_epu16(const vint& a, const vint& b) { return vint{ _mm_subs_epu16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint mullo_epi16(const vint& a, const vint& b) { return vint{ _mm_mullo_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint mulhi_epi16(const vint& a, const vint& b) { return vint{ _mm_mulhi_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint mulhi_epu16(const vint& a, const vint& b) { return vint{ _mm_mulhi_epu16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint min_epi16(const vint& a, const vint& b) { return vint{ _mm_min_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint max_epi16(const vint& a, const vint& b) { return vint{ _mm_max_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint madd_epi16(const vint& a, const vint& b) { return vint{ _mm_madd_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint cmpeq_epi16(const vint& a, const vint& b) { return vint{ _mm_cmpeq_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint cmpgt_epi16(const vint& a, const vint& b) { return vint{ _mm_cmpgt_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint cmplt_epi16(const vint& a, const vint& b) { return vint{ _mm_cmplt_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint packs_epi16(const vint& a, const vint& b) { return vint{ _mm_packs_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint packus_epi16(const vint& a, const vint& b) { return vint{ _mm_packus_epi16(a.m_value, b.m_value) }; } + +CPPSPMD_FORCE_INLINE vint uniform_shift_left_epi16(const vint& a, const vint& b) { return vint{ _mm_sll_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint uniform_arith_shift_right_epi16(const vint& a, const vint& b) { return vint{ _mm_sra_epi16(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vint uniform_shift_right_epi16(const vint& a, const vint& b) { return vint{ _mm_srl_epi16(a.m_value, b.m_value) }; } + +#define VINT_SHIFT_LEFT_EPI16(a, b) vint(_mm_slli_epi16((a).m_value, b)) +#define VINT_SHIFT_RIGHT_EPI16(a, b) vint(_mm_srai_epi16((a).m_value, b)) +#define VUINT_SHIFT_RIGHT_EPI16(a, b) vint(_mm_srli_epi16((a).m_value, b)) + +CPPSPMD_FORCE_INLINE vint undefined_vint() { return vint{ _mm_undefined_si128() }; } +CPPSPMD_FORCE_INLINE vfloat undefined_vfloat() { return vfloat{ _mm_undefined_ps() }; } + +CPPSPMD_FORCE_INLINE vint zero_vint() { return vint{ _mm_setzero_si128() }; } +CPPSPMD_FORCE_INLINE vfloat zero_vfloat() { return vfloat{ _mm_setzero_ps() }; } + +CPPSPMD_FORCE_INLINE vint vint_lane_set(int v0, int v1, int v2, int v3) { return vint{ _mm_set_epi32(v3, v2, v1, v0) }; } +CPPSPMD_FORCE_INLINE vfloat vfloat_lane_set(float v0, float v1, float v2, float v3) { return vfloat{ _mm_set_ps(v3, v2, v1, v0) }; } +CPPSPMD_FORCE_INLINE vint vint_lane_set_r(int v3, int v2, int v1, int v0) { return vint{ _mm_set_epi32(v3, v2, v1, v0) }; } +CPPSPMD_FORCE_INLINE vfloat vfloat_lane_set_r(float v3, float v2, float v1, float v0) { return vfloat{ _mm_set_ps(v3, v2, v1, v0) }; } +// control is an 8-bit immediate value containing 4 2-bit indices which shuffles the int32's in each 128-bit lane. +#define VINT_LANE_SHUFFLE_EPI32(a, control) vint(_mm_shuffle_epi32((a).m_value, control)) +#define VFLOAT_LANE_SHUFFLE_PS(a, b, control) vfloat(_mm_shuffle_ps((a).m_value, (b).m_value, control)) + +// control is an 8-bit immediate value containing 4 2-bit indices which shuffles the int16's in either the high or low 64-bit lane. +#define VINT_LANE_SHUFFLELO_EPI16(a, control) vint(_mm_shufflelo_epi16((a).m_value, control)) +#define VINT_LANE_SHUFFLEHI_EPI16(a, control) vint(_mm_shufflehi_epi16((a).m_value, control)) + +#define VINT_LANE_SHUFFLE_MASK(a, b, c, d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6)) +#define VINT_LANE_SHUFFLE_MASK_R(d, c, b, a) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6)) + +#define VINT_LANE_SHIFT_LEFT_BYTES(a, l) vint(_mm_slli_si128((a).m_value, l)) +#define VINT_LANE_SHIFT_RIGHT_BYTES(a, l) vint(_mm_srli_si128((a).m_value, l)) + +// Unpack and interleave 8-bit integers from the low or high half of a and b +CPPSPMD_FORCE_INLINE vint vint_lane_unpacklo_epi8(const vint& a, const vint& b) { return vint(_mm_unpacklo_epi8(a.m_value, b.m_value)); } +CPPSPMD_FORCE_INLINE vint vint_lane_unpackhi_epi8(const vint& a, const vint& b) { return vint(_mm_unpackhi_epi8(a.m_value, b.m_value)); } + +// Unpack and interleave 16-bit integers from the low or high half of a and b +CPPSPMD_FORCE_INLINE vint vint_lane_unpacklo_epi16(const vint& a, const vint& b) { return vint(_mm_unpacklo_epi16(a.m_value, b.m_value)); } +CPPSPMD_FORCE_INLINE vint vint_lane_unpackhi_epi16(const vint& a, const vint& b) { return vint(_mm_unpackhi_epi16(a.m_value, b.m_value)); } + +// Unpack and interleave 32-bit integers from the low or high half of a and b +CPPSPMD_FORCE_INLINE vint vint_lane_unpacklo_epi32(const vint& a, const vint& b) { return vint(_mm_unpacklo_epi32(a.m_value, b.m_value)); } +CPPSPMD_FORCE_INLINE vint vint_lane_unpackhi_epi32(const vint& a, const vint& b) { return vint(_mm_unpackhi_epi32(a.m_value, b.m_value)); } + +// Unpack and interleave 64-bit integers from the low or high half of a and b +CPPSPMD_FORCE_INLINE vint vint_lane_unpacklo_epi64(const vint& a, const vint& b) { return vint(_mm_unpacklo_epi64(a.m_value, b.m_value)); } +CPPSPMD_FORCE_INLINE vint vint_lane_unpackhi_epi64(const vint& a, const vint& b) { return vint(_mm_unpackhi_epi64(a.m_value, b.m_value)); } + +CPPSPMD_FORCE_INLINE vint vint_set1_epi8(int8_t a) { return vint(_mm_set1_epi8(a)); } +CPPSPMD_FORCE_INLINE vint vint_set1_epi16(int16_t a) { return vint(_mm_set1_epi16(a)); } +CPPSPMD_FORCE_INLINE vint vint_set1_epi32(int32_t a) { return vint(_mm_set1_epi32(a)); } +CPPSPMD_FORCE_INLINE vint vint_set1_epi64(int64_t a) { return vint(_mm_set1_epi64x(a)); } + +CPPSPMD_FORCE_INLINE vint mul_epu32(const vint &a, const vint& b) { return vint(_mm_mul_epu32(a.m_value, b.m_value)); } + +CPPSPMD_FORCE_INLINE vint div_epi32(const vint &a, const vint& b) +{ + __m128d al = _mm_cvtepi32_pd(a.m_value); + __m128d ah = _mm_cvtepi32_pd(_mm_unpackhi_epi64(a.m_value, a.m_value)); + + __m128d bl = _mm_cvtepi32_pd(b.m_value); + __m128d bh = _mm_cvtepi32_pd(_mm_unpackhi_epi64(b.m_value, b.m_value)); + + __m128d rl = _mm_div_pd(al, bl); + __m128d rh = _mm_div_pd(ah, bh); + + __m128i rli = _mm_cvttpd_epi32(rl); + __m128i rhi = _mm_cvttpd_epi32(rh); + + return vint(_mm_unpacklo_epi64(rli, rhi)); +} + +CPPSPMD_FORCE_INLINE vint mod_epi32(const vint &a, const vint& b) +{ + vint aa = abs(a), ab = abs(b); + vint q = div_epi32(aa, ab); + vint r = aa - q * ab; + return spmd_ternaryi(a < 0, -r, r); +} + +CPPSPMD_FORCE_INLINE vint operator/ (const vint& a, const vint& b) +{ + return div_epi32(a, b); +} + +CPPSPMD_FORCE_INLINE vint operator/ (const vint& a, int b) +{ + return div_epi32(a, vint(b)); +} + +CPPSPMD_FORCE_INLINE vint operator% (const vint& a, const vint& b) +{ + return mod_epi32(a, b); +} + +CPPSPMD_FORCE_INLINE vint operator% (const vint& a, int b) +{ + return mod_epi32(a, vint(b)); +} + +CPPSPMD_FORCE_INLINE vint operator<< (const vint& a, const vint& b) +{ +#if 0 + CPPSPMD_ALIGN(32) int result[4]; + result[0] = extract_x(a.m_value) << extract_x(b.m_value); + result[1] = extract_y(a.m_value) << extract_y(b.m_value); + result[2] = extract_z(a.m_value) << extract_z(b.m_value); + result[3] = extract_w(a.m_value) << extract_w(b.m_value); + + return vint{ _mm_load_si128((__m128i*)result) }; +#elif 0 + int x = extract_x(a.m_value) << extract_x(b.m_value); + int y = extract_y(a.m_value) << extract_y(b.m_value); + int z = extract_z(a.m_value) << extract_z(b.m_value); + int w = extract_w(a.m_value) << extract_w(b.m_value); + + __m128i v = insert_x(_mm_undefined_si128(), x); + v = insert_y(v, y); + v = insert_z(v, z); + return vint{ insert_w(v, w) }; +#else + // What this does: shift left each b lane by 23 bits (to move the shift amount into the FP exponent position), then epi32 add to the integer rep of 1.0f, then cast that to float, then convert that to int to get fast 2^x. + return a * vint(cast_vint_to_vfloat(vint(_mm_slli_epi32(b.m_value, 23)) + cast_vfloat_to_vint(vfloat(1.0f)))); +#endif +} + +// uniform shift left +CPPSPMD_FORCE_INLINE vint operator<< (const vint& a, int b) +{ + __m128i bv = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(_mm_set1_epi32(b)), _mm_castsi128_ps(_mm_load_si128((const __m128i *)g_x_128)))); + return vint{ _mm_sll_epi32(a.m_value, bv) }; +} + +// uniform arithmetic shift right +CPPSPMD_FORCE_INLINE vint operator>> (const vint& a, int b) +{ + __m128i bv = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(_mm_set1_epi32(b)), _mm_castsi128_ps(_mm_load_si128((const __m128i *)g_x_128)))); + return vint{ _mm_sra_epi32(a.m_value, bv) }; +} + +// uniform shift right +CPPSPMD_FORCE_INLINE vint vuint_shift_right(const vint& a, int b) +{ + __m128i bv = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(_mm_set1_epi32(b)), _mm_castsi128_ps(_mm_load_si128((const __m128i *)g_x_128)))); + return vint{ _mm_srl_epi32(a.m_value, bv) }; +} + +CPPSPMD_FORCE_INLINE vint vuint_shift_right(const vint& a, const vint& b) +{ +#if 0 + CPPSPMD_ALIGN(32) int result[4]; + result[0] = ((uint32_t)extract_x(a.m_value)) >> extract_x(b.m_value); + result[1] = ((uint32_t)extract_y(a.m_value)) >> extract_y(b.m_value); + result[2] = ((uint32_t)extract_z(a.m_value)) >> extract_z(b.m_value); + result[3] = ((uint32_t)extract_w(a.m_value)) >> extract_w(b.m_value); + + return vint{ _mm_load_si128((__m128i*)result) }; +#elif 0 + uint32_t x = ((uint32_t)extract_x(a.m_value)) >> ((uint32_t)extract_x(b.m_value)); + uint32_t y = ((uint32_t)extract_y(a.m_value)) >> ((uint32_t)extract_y(b.m_value)); + uint32_t z = ((uint32_t)extract_z(a.m_value)) >> ((uint32_t)extract_z(b.m_value)); + uint32_t w = ((uint32_t)extract_w(a.m_value)) >> ((uint32_t)extract_w(b.m_value)); + + __m128i v = insert_x(_mm_undefined_si128(), x); + v = insert_y(v, y); + v = insert_z(v, z); + return vint{ insert_w(v, w) }; +#else + //vint inv_shift = 32 - b; + //vfloat f = cast_vint_to_vfloat(vint(_mm_slli_epi32(inv_shift.m_value, 23)) + cast_vfloat_to_vint(vfloat(1.0f))); + + // Take float rep of 1.0f (0x3f800000), subtract (32<<23), subtract (shift<<23), cast to float. + vfloat f = cast_vint_to_vfloat(vint(_mm_sub_epi32(_mm_set1_epi32(0x4f800000), _mm_slli_epi32(b.m_value, 23)))); + + // Now convert scale factor to integer. + vint r = vint(f); + + // mulhi_epu32 (using two _mm_mul_epu32), to emulate varying shift left. + vint q(mulhi_epu32(a.m_value, r.m_value)); + + // Handle shift amounts of 0. + return spmd_ternaryi(b > 0, q, a); +#endif +} + +CPPSPMD_FORCE_INLINE vint vuint_shift_right_not_zero(const vint& a, const vint& b) +{ + //vint inv_shift = 32 - b; + //vfloat f = cast_vint_to_vfloat(vint(_mm_slli_epi32(inv_shift.m_value, 23)) + cast_vfloat_to_vint(vfloat(1.0f))); + + // Take float rep of 1.0f (0x3f800000), subtract (32<<23), subtract (shift<<23), cast to float. + vfloat f = cast_vint_to_vfloat(vint(_mm_sub_epi32(_mm_set1_epi32(0x4f800000), _mm_slli_epi32(b.m_value, 23)))); + + // Now convert scale factor to integer. + vint r = vint(f); + + // mulhi_epu32 (using two _mm_mul_epu32), to emulate varying shift left. + return vint(mulhi_epu32(a.m_value, r.m_value)); +} + +CPPSPMD_FORCE_INLINE vint operator>> (const vint& a, const vint& b) +{ +#if 0 + CPPSPMD_ALIGN(32) int result[4]; + result[0] = extract_x(a.m_value) >> extract_x(b.m_value); + result[1] = extract_y(a.m_value) >> extract_y(b.m_value); + result[2] = extract_z(a.m_value) >> extract_z(b.m_value); + result[3] = extract_w(a.m_value) >> extract_w(b.m_value); + + return vint{ _mm_load_si128((__m128i*)result) }; +#elif 0 + int x = extract_x(a.m_value) >> extract_x(b.m_value); + int y = extract_y(a.m_value) >> extract_y(b.m_value); + int z = extract_z(a.m_value) >> extract_z(b.m_value); + int w = extract_w(a.m_value) >> extract_w(b.m_value); + + __m128i v = insert_x(_mm_undefined_si128(), x); + v = insert_y(v, y); + v = insert_z(v, z); + return vint{ insert_w(v, w) }; +#else + vint sign_mask(_mm_cmplt_epi32(a.m_value, _mm_setzero_si128())); + vint a_shifted = vuint_shift_right(a ^ sign_mask, b) ^ sign_mask; + return a_shifted; +#endif +} + +#undef VINT_SHIFT_LEFT +#undef VINT_SHIFT_RIGHT +#undef VUINT_SHIFT_RIGHT + +// Shift left/right by a uniform immediate constant +#define VINT_SHIFT_LEFT(a, b) vint(_mm_slli_epi32( (a).m_value, (b) ) ) +#define VINT_SHIFT_RIGHT(a, b) vint( _mm_srai_epi32( (a).m_value, (b) ) ) +#define VUINT_SHIFT_RIGHT(a, b) vint( _mm_srli_epi32( (a).m_value, (b) ) ) +#define VINT_ROT(x, k) (VINT_SHIFT_LEFT((x), (k)) | VUINT_SHIFT_RIGHT((x), 32 - (k))) + +CPPSPMD_FORCE_INLINE vbool operator==(const lint& a, const lint& b) { return vbool{ _mm_cmpeq_epi32(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vbool operator==(const lint& a, int b) { return vint(a) == vint(b); } +CPPSPMD_FORCE_INLINE vbool operator==(int a, const lint& b) { return vint(a) == vint(b); } +CPPSPMD_FORCE_INLINE vbool operator<(const lint& a, const lint& b) { return vbool{ _mm_cmpgt_epi32(b.m_value, a.m_value) }; } +CPPSPMD_FORCE_INLINE vbool operator>(const lint& a, const lint& b) { return vbool{ _mm_cmpgt_epi32(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vbool operator<=(const lint& a, const lint& b) { return !vbool{ _mm_cmpgt_epi32(a.m_value, b.m_value) }; } +CPPSPMD_FORCE_INLINE vbool operator>=(const lint& a, const lint& b) { return !vbool{ _mm_cmpgt_epi32(b.m_value, a.m_value) }; } + +CPPSPMD_FORCE_INLINE float extract(const vfloat& v, int instance) { assert(instance < 4); CPPSPMD_ALIGN(16) float values[4]; _mm_store_ps(values, v.m_value); return values[instance]; } +CPPSPMD_FORCE_INLINE int extract(const vint& v, int instance) { assert(instance < 4); CPPSPMD_ALIGN(16) int values[4]; _mm_store_si128((__m128i*)values, v.m_value); return values[instance]; } +CPPSPMD_FORCE_INLINE int extract(const lint& v, int instance) { assert(instance < 4); CPPSPMD_ALIGN(16) int values[4]; _mm_store_si128((__m128i*)values, v.m_value); return values[instance]; } +CPPSPMD_FORCE_INLINE bool extract(const vbool& v, int instance) { assert(instance < 4); CPPSPMD_ALIGN(16) int values[4]; _mm_store_si128((__m128i*)values, v.m_value); return values[instance] != 0; } + +#undef VINT_EXTRACT +#undef VBOOL_EXTRACT +#undef VFLOAT_EXTRACT + +#if CPPSPMD_SSE2 +// Pass in an immediate constant and the compiler will optimize these expressions. +#define VINT_EXTRACT(v, instance) ( ((instance) == 0) ? extract_x((v).m_value) : (((instance) == 1) ? extract_y((v).m_value) : (((instance) == 2) ? extract_z((v).m_value) : extract_w((v).m_value))) ) +#define VBOOL_EXTRACT(v, instance) ( ((instance) == 0) ? extract_x((v).m_value) : (((instance) == 1) ? extract_y((v).m_value) : (((instance) == 2) ? extract_z((v).m_value) : extract_w((v).m_value))) ) +#define VFLOAT_EXTRACT(v, instance) ( ((instance) == 0) ? extractf_ps_x((v).m_value) : (((instance) == 1) ? extractf_ps_y((v).m_value) : (((instance) == 2) ? extractf_ps_z((v).m_value) : extractf_ps_w((v).m_value))) ) +#else +CPPSPMD_FORCE_INLINE float cast_int_bits_as_float(int v) { return *(const float*)&v; } + +#define VINT_EXTRACT(v, instance) _mm_extract_epi32((v).m_value, instance) +#define VBOOL_EXTRACT(v, instance) _mm_extract_epi32((v).m_value, instance) +#define VFLOAT_EXTRACT(v, instance) cast_int_bits_as_float(_mm_extract_ps((v).m_value, instance)) +#endif + +CPPSPMD_FORCE_INLINE vfloat &insert(vfloat& v, int instance, float f) +{ + assert(instance < 4); + CPPSPMD_ALIGN(16) float values[4]; + _mm_store_ps(values, v.m_value); + values[instance] = f; + v.m_value = _mm_load_ps(values); + return v; +} + +CPPSPMD_FORCE_INLINE vint &insert(vint& v, int instance, int i) +{ + assert(instance < 4); + CPPSPMD_ALIGN(16) int values[4]; + _mm_store_si128((__m128i *)values, v.m_value); + values[instance] = i; + v.m_value = _mm_load_si128((__m128i *)values); + return v; +} + +CPPSPMD_FORCE_INLINE vint init_lookup4(const uint8_t pTab[16]) +{ + __m128i l = _mm_loadu_si128((const __m128i*)pTab); + return vint{ l }; +} + +CPPSPMD_FORCE_INLINE vint table_lookup4_8(const vint& a, const vint& table) +{ + return vint{ shuffle_epi8(table.m_value, a.m_value) }; +} + +CPPSPMD_FORCE_INLINE void init_lookup5(const uint8_t pTab[32], vint& table_0, vint& table_1) +{ + __m128i l = _mm_loadu_si128((const __m128i*)pTab); + __m128i h = _mm_loadu_si128((const __m128i*)(pTab + 16)); + table_0.m_value = l; + table_1.m_value = h; +} + +CPPSPMD_FORCE_INLINE vint table_lookup5_8(const vint& a, const vint& table_0, const vint& table_1) +{ + __m128i l_0 = shuffle_epi8(table_0.m_value, a.m_value); + __m128i h_0 = shuffle_epi8(table_1.m_value, a.m_value); + + __m128i m_0 = _mm_slli_epi32(a.m_value, 31 - 4); + + __m128 v_0 = blendv_ps(_mm_castsi128_ps(l_0), _mm_castsi128_ps(h_0), _mm_castsi128_ps(m_0)); + + return vint{ _mm_castps_si128(v_0) }; +} + +CPPSPMD_FORCE_INLINE void init_lookup6(const uint8_t pTab[64], vint& table_0, vint& table_1, vint& table_2, vint& table_3) +{ + __m128i a = _mm_loadu_si128((const __m128i*)pTab); + __m128i b = _mm_loadu_si128((const __m128i*)(pTab + 16)); + __m128i c = _mm_loadu_si128((const __m128i*)(pTab + 32)); + __m128i d = _mm_loadu_si128((const __m128i*)(pTab + 48)); + + table_0.m_value = a; + table_1.m_value = b; + table_2.m_value = c; + table_3.m_value = d; +} + +CPPSPMD_FORCE_INLINE vint table_lookup6_8(const vint& a, const vint& table_0, const vint& table_1, const vint& table_2, const vint& table_3) +{ + __m128i m_0 = _mm_slli_epi32(a.m_value, 31 - 4); + + __m128 av_0; + { + __m128i al_0 = shuffle_epi8(table_0.m_value, a.m_value); + __m128i ah_0 = shuffle_epi8(table_1.m_value, a.m_value); + av_0 = blendv_ps(_mm_castsi128_ps(al_0), _mm_castsi128_ps(ah_0), _mm_castsi128_ps(m_0)); + } + + __m128 bv_0; + { + __m128i bl_0 = shuffle_epi8(table_2.m_value, a.m_value); + __m128i bh_0 = shuffle_epi8(table_3.m_value, a.m_value); + bv_0 = blendv_ps(_mm_castsi128_ps(bl_0), _mm_castsi128_ps(bh_0), _mm_castsi128_ps(m_0)); + } + + __m128i m2_0 = _mm_slli_epi32(a.m_value, 31 - 5); + __m128 v2_0 = blendv_ps(av_0, bv_0, _mm_castsi128_ps(m2_0)); + + return vint{ _mm_castps_si128(v2_0) }; +} + +#if 0 +template +CPPSPMD_FORCE_INLINE decltype(auto) spmd_call(Args&&... args) +{ + SPMDKernel kernel; + kernel.init(exec_mask::all_on()); + return kernel._call(std::forward(args)...); +} +#else +template +CPPSPMD_FORCE_INLINE void spmd_call(Args&&... args) +{ + SPMDKernel kernel; + kernel.init(exec_mask::all_on()); + kernel._call(std::forward(args)...); +} +#endif + +CPPSPMD_FORCE_INLINE void spmd_kernel::init(const spmd_kernel::exec_mask& kernel_exec) +{ + m_exec = kernel_exec; + m_kernel_exec = kernel_exec; + m_continue_mask = exec_mask::all_off(); + +#ifdef _DEBUG + m_in_loop = false; +#endif +} + +CPPSPMD_FORCE_INLINE const float_vref& spmd_kernel::store(const float_vref& dst, const vfloat& src) +{ + CPPSPMD_ALIGN(16) int vindex[4]; + _mm_store_si128((__m128i*)vindex, dst.m_vindex); + + CPPSPMD_ALIGN(16) float stored[4]; + _mm_store_ps(stored, src.m_value); + + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + for (int i = 0; i < 4; i++) + { + if (mask & (1 << i)) + dst.m_pValue[vindex[i]] = stored[i]; + } + return dst; +} + +CPPSPMD_FORCE_INLINE const float_vref& spmd_kernel::store_all(const float_vref& dst, const vfloat& src) +{ + CPPSPMD_ALIGN(16) int vindex[4]; + _mm_store_si128((__m128i*)vindex, dst.m_vindex); + + CPPSPMD_ALIGN(16) float stored[4]; + _mm_store_ps(stored, src.m_value); + + for (int i = 0; i < 4; i++) + dst.m_pValue[vindex[i]] = stored[i]; + return dst; +} + +CPPSPMD_FORCE_INLINE const float_vref& spmd_kernel::store(const float_vref&& dst, const vfloat& src) +{ + CPPSPMD_ALIGN(16) int vindex[4]; + _mm_store_si128((__m128i*)vindex, dst.m_vindex); + + CPPSPMD_ALIGN(16) float stored[4]; + _mm_store_ps(stored, src.m_value); + + int mask = _mm_movemask_ps(_mm_castsi128_ps(m_exec.m_mask)); + for (int i = 0; i < 4; i++) + { + if (mask & (1 << i)) + dst.m_pValue[vindex[i]] = stored[i]; + } + return dst; +} + +CPPSPMD_FORCE_INLINE const float_vref& spmd_kernel::store_all(const float_vref&& dst, const vfloat& src) +{ + CPPSPMD_ALIGN(16) int vindex[4]; + _mm_store_si128((__m128i*)vindex, dst.m_vindex); + + CPPSPMD_ALIGN(16) float stored[4]; + _mm_store_ps(stored, src.m_value); + + for (int i = 0; i < 4; i++) + dst.m_pValue[vindex[i]] = stored[i]; + return dst; +} + +#include "cppspmd_flow.h" +#include "cppspmd_math.h" + +} // namespace cppspmd_sse41 + diff --git a/ktx/external/basisu/encoder/cppspmd_type_aliases.h b/ktx/external/basisu/encoder/cppspmd_type_aliases.h new file mode 100644 index 0000000..0dfb28b --- /dev/null +++ b/ktx/external/basisu/encoder/cppspmd_type_aliases.h @@ -0,0 +1,47 @@ +// cppspmd_type_aliases.h +// Do not include this file directly +// +// Copyright 2020-2021 Binomial 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 +// +// 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. + +#pragma once + +#ifndef CPPSPMD_TYPES +#define CPPSPMD_TYPES + +using exec_mask = CPPSPMD::exec_mask; + +#if CPPSPMD_INT16 +using vint16 = CPPSPMD::vint16; +using int16_lref = CPPSPMD::int16_lref; +using cint16_vref = CPPSPMD::cint16_vref; +using int16_vref = CPPSPMD::int16_vref; +using lint16 = CPPSPMD::lint16; +using vint16_vref = CPPSPMD::vint16_vref; +#else +using vint = CPPSPMD::vint; +using int_lref = CPPSPMD::int_lref; +using cint_vref = CPPSPMD::cint_vref; +using int_vref = CPPSPMD::int_vref; +using lint = CPPSPMD::lint; +using vint_vref = CPPSPMD::vint_vref; +#endif + +using vbool = CPPSPMD::vbool; +using vfloat = CPPSPMD::vfloat; +using float_lref = CPPSPMD::float_lref; +using float_vref = CPPSPMD::float_vref; +using vfloat_vref = CPPSPMD::vfloat_vref; + +#endif // CPPSPMD_TYPES diff --git a/ktx/external/basisu/encoder/jpgd.cpp b/ktx/external/basisu/encoder/jpgd.cpp new file mode 100644 index 0000000..bdc0082 --- /dev/null +++ b/ktx/external/basisu/encoder/jpgd.cpp @@ -0,0 +1,3230 @@ +// jpgd.cpp - C++ class for JPEG decompression. Written by Richard Geldreich between 1994-2020. +// Supports progressive and baseline sequential JPEG image files, and the most common chroma subsampling factors: Y, H1V1, H2V1, H1V2, and H2V2. +// Supports box and linear chroma upsampling. +// +// Released under two licenses. You are free to choose which license you want: +// License 1: +// Public Domain +// +// License 2: +// 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. +// +// Alex Evans: Linear memory allocator (taken from jpge.h). +// v1.04, May. 19, 2012: Code tweaks to fix VS2008 static code analysis warnings +// v2.00, March 20, 2020: Fuzzed with zzuf and afl. Fixed several issues, converted most assert()'s to run-time checks. Added chroma upsampling. Removed freq. domain upsampling. gcc/clang warnings. +// + +#include "jpgd.h" +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning (disable : 4611) // warning C4611: interaction between '_setjmp' and C++ object destruction is non-portable +#endif + +#define JPGD_TRUE (1) +#define JPGD_FALSE (0) + +#define JPGD_MAX(a,b) (((a)>(b)) ? (a) : (b)) +#define JPGD_MIN(a,b) (((a)<(b)) ? (a) : (b)) + +namespace jpgd { + + static inline void* jpgd_malloc(size_t nSize) { return malloc(nSize); } + static inline void jpgd_free(void* p) { free(p); } + + // DCT coefficients are stored in this sequence. + static int g_ZAG[64] = { 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63 }; + + enum JPEG_MARKER + { + M_SOF0 = 0xC0, M_SOF1 = 0xC1, M_SOF2 = 0xC2, M_SOF3 = 0xC3, M_SOF5 = 0xC5, M_SOF6 = 0xC6, M_SOF7 = 0xC7, M_JPG = 0xC8, + M_SOF9 = 0xC9, M_SOF10 = 0xCA, M_SOF11 = 0xCB, M_SOF13 = 0xCD, M_SOF14 = 0xCE, M_SOF15 = 0xCF, M_DHT = 0xC4, M_DAC = 0xCC, + M_RST0 = 0xD0, M_RST1 = 0xD1, M_RST2 = 0xD2, M_RST3 = 0xD3, M_RST4 = 0xD4, M_RST5 = 0xD5, M_RST6 = 0xD6, M_RST7 = 0xD7, + M_SOI = 0xD8, M_EOI = 0xD9, M_SOS = 0xDA, M_DQT = 0xDB, M_DNL = 0xDC, M_DRI = 0xDD, M_DHP = 0xDE, M_EXP = 0xDF, + M_APP0 = 0xE0, M_APP15 = 0xEF, M_JPG0 = 0xF0, M_JPG13 = 0xFD, M_COM = 0xFE, M_TEM = 0x01, M_ERROR = 0x100, RST0 = 0xD0 + }; + + enum JPEG_SUBSAMPLING { JPGD_GRAYSCALE = 0, JPGD_YH1V1, JPGD_YH2V1, JPGD_YH1V2, JPGD_YH2V2 }; + +#define CONST_BITS 13 +#define PASS1_BITS 2 +#define SCALEDONE ((int32)1) + +#define FIX_0_298631336 ((int32)2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((int32)3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((int32)4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((int32)6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((int32)7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((int32)9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((int32)12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((int32)15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((int32)16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((int32)16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((int32)20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((int32)25172) /* FIX(3.072711026) */ + +#define DESCALE(x,n) (((x) + (SCALEDONE << ((n)-1))) >> (n)) +#define DESCALE_ZEROSHIFT(x,n) (((x) + (128 << (n)) + (SCALEDONE << ((n)-1))) >> (n)) + +#define MULTIPLY(var, cnst) ((var) * (cnst)) + +#define CLAMP(i) ((static_cast(i) > 255) ? (((~i) >> 31) & 0xFF) : (i)) + + static inline int left_shifti(int val, uint32_t bits) + { + return static_cast(static_cast(val) << bits); + } + + // Compiler creates a fast path 1D IDCT for X non-zero columns + template + struct Row + { + static void idct(int* pTemp, const jpgd_block_t* pSrc) + { + // ACCESS_COL() will be optimized at compile time to either an array access, or 0. Good compilers will then optimize out muls against 0. +#define ACCESS_COL(x) (((x) < NONZERO_COLS) ? (int)pSrc[x] : 0) + + const int z2 = ACCESS_COL(2), z3 = ACCESS_COL(6); + + const int z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + const int tmp2 = z1 + MULTIPLY(z3, -FIX_1_847759065); + const int tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + + const int tmp0 = left_shifti(ACCESS_COL(0) + ACCESS_COL(4), CONST_BITS); + const int tmp1 = left_shifti(ACCESS_COL(0) - ACCESS_COL(4), CONST_BITS); + + const int tmp10 = tmp0 + tmp3, tmp13 = tmp0 - tmp3, tmp11 = tmp1 + tmp2, tmp12 = tmp1 - tmp2; + + const int atmp0 = ACCESS_COL(7), atmp1 = ACCESS_COL(5), atmp2 = ACCESS_COL(3), atmp3 = ACCESS_COL(1); + + const int bz1 = atmp0 + atmp3, bz2 = atmp1 + atmp2, bz3 = atmp0 + atmp2, bz4 = atmp1 + atmp3; + const int bz5 = MULTIPLY(bz3 + bz4, FIX_1_175875602); + + const int az1 = MULTIPLY(bz1, -FIX_0_899976223); + const int az2 = MULTIPLY(bz2, -FIX_2_562915447); + const int az3 = MULTIPLY(bz3, -FIX_1_961570560) + bz5; + const int az4 = MULTIPLY(bz4, -FIX_0_390180644) + bz5; + + const int btmp0 = MULTIPLY(atmp0, FIX_0_298631336) + az1 + az3; + const int btmp1 = MULTIPLY(atmp1, FIX_2_053119869) + az2 + az4; + const int btmp2 = MULTIPLY(atmp2, FIX_3_072711026) + az2 + az3; + const int btmp3 = MULTIPLY(atmp3, FIX_1_501321110) + az1 + az4; + + pTemp[0] = DESCALE(tmp10 + btmp3, CONST_BITS - PASS1_BITS); + pTemp[7] = DESCALE(tmp10 - btmp3, CONST_BITS - PASS1_BITS); + pTemp[1] = DESCALE(tmp11 + btmp2, CONST_BITS - PASS1_BITS); + pTemp[6] = DESCALE(tmp11 - btmp2, CONST_BITS - PASS1_BITS); + pTemp[2] = DESCALE(tmp12 + btmp1, CONST_BITS - PASS1_BITS); + pTemp[5] = DESCALE(tmp12 - btmp1, CONST_BITS - PASS1_BITS); + pTemp[3] = DESCALE(tmp13 + btmp0, CONST_BITS - PASS1_BITS); + pTemp[4] = DESCALE(tmp13 - btmp0, CONST_BITS - PASS1_BITS); + } + }; + + template <> + struct Row<0> + { + static void idct(int* pTemp, const jpgd_block_t* pSrc) + { + (void)pTemp; + (void)pSrc; + } + }; + + template <> + struct Row<1> + { + static void idct(int* pTemp, const jpgd_block_t* pSrc) + { + const int dcval = left_shifti(pSrc[0], PASS1_BITS); + + pTemp[0] = dcval; + pTemp[1] = dcval; + pTemp[2] = dcval; + pTemp[3] = dcval; + pTemp[4] = dcval; + pTemp[5] = dcval; + pTemp[6] = dcval; + pTemp[7] = dcval; + } + }; + + // Compiler creates a fast path 1D IDCT for X non-zero rows + template + struct Col + { + static void idct(uint8* pDst_ptr, const int* pTemp) + { + // ACCESS_ROW() will be optimized at compile time to either an array access, or 0. +#define ACCESS_ROW(x) (((x) < NONZERO_ROWS) ? pTemp[x * 8] : 0) + + const int z2 = ACCESS_ROW(2); + const int z3 = ACCESS_ROW(6); + + const int z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + const int tmp2 = z1 + MULTIPLY(z3, -FIX_1_847759065); + const int tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + + const int tmp0 = left_shifti(ACCESS_ROW(0) + ACCESS_ROW(4), CONST_BITS); + const int tmp1 = left_shifti(ACCESS_ROW(0) - ACCESS_ROW(4), CONST_BITS); + + const int tmp10 = tmp0 + tmp3, tmp13 = tmp0 - tmp3, tmp11 = tmp1 + tmp2, tmp12 = tmp1 - tmp2; + + const int atmp0 = ACCESS_ROW(7), atmp1 = ACCESS_ROW(5), atmp2 = ACCESS_ROW(3), atmp3 = ACCESS_ROW(1); + + const int bz1 = atmp0 + atmp3, bz2 = atmp1 + atmp2, bz3 = atmp0 + atmp2, bz4 = atmp1 + atmp3; + const int bz5 = MULTIPLY(bz3 + bz4, FIX_1_175875602); + + const int az1 = MULTIPLY(bz1, -FIX_0_899976223); + const int az2 = MULTIPLY(bz2, -FIX_2_562915447); + const int az3 = MULTIPLY(bz3, -FIX_1_961570560) + bz5; + const int az4 = MULTIPLY(bz4, -FIX_0_390180644) + bz5; + + const int btmp0 = MULTIPLY(atmp0, FIX_0_298631336) + az1 + az3; + const int btmp1 = MULTIPLY(atmp1, FIX_2_053119869) + az2 + az4; + const int btmp2 = MULTIPLY(atmp2, FIX_3_072711026) + az2 + az3; + const int btmp3 = MULTIPLY(atmp3, FIX_1_501321110) + az1 + az4; + + int i = DESCALE_ZEROSHIFT(tmp10 + btmp3, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 0] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp10 - btmp3, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 7] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp11 + btmp2, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 1] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp11 - btmp2, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 6] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp12 + btmp1, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 2] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp12 - btmp1, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 5] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp13 + btmp0, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 3] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp13 - btmp0, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 4] = (uint8)CLAMP(i); + } + }; + + template <> + struct Col<1> + { + static void idct(uint8* pDst_ptr, const int* pTemp) + { + int dcval = DESCALE_ZEROSHIFT(pTemp[0], PASS1_BITS + 3); + const uint8 dcval_clamped = (uint8)CLAMP(dcval); + pDst_ptr[0 * 8] = dcval_clamped; + pDst_ptr[1 * 8] = dcval_clamped; + pDst_ptr[2 * 8] = dcval_clamped; + pDst_ptr[3 * 8] = dcval_clamped; + pDst_ptr[4 * 8] = dcval_clamped; + pDst_ptr[5 * 8] = dcval_clamped; + pDst_ptr[6 * 8] = dcval_clamped; + pDst_ptr[7 * 8] = dcval_clamped; + } + }; + + static const uint8 s_idct_row_table[] = + { + 1,0,0,0,0,0,0,0, 2,0,0,0,0,0,0,0, 2,1,0,0,0,0,0,0, 2,1,1,0,0,0,0,0, 2,2,1,0,0,0,0,0, 3,2,1,0,0,0,0,0, 4,2,1,0,0,0,0,0, 4,3,1,0,0,0,0,0, + 4,3,2,0,0,0,0,0, 4,3,2,1,0,0,0,0, 4,3,2,1,1,0,0,0, 4,3,2,2,1,0,0,0, 4,3,3,2,1,0,0,0, 4,4,3,2,1,0,0,0, 5,4,3,2,1,0,0,0, 6,4,3,2,1,0,0,0, + 6,5,3,2,1,0,0,0, 6,5,4,2,1,0,0,0, 6,5,4,3,1,0,0,0, 6,5,4,3,2,0,0,0, 6,5,4,3,2,1,0,0, 6,5,4,3,2,1,1,0, 6,5,4,3,2,2,1,0, 6,5,4,3,3,2,1,0, + 6,5,4,4,3,2,1,0, 6,5,5,4,3,2,1,0, 6,6,5,4,3,2,1,0, 7,6,5,4,3,2,1,0, 8,6,5,4,3,2,1,0, 8,7,5,4,3,2,1,0, 8,7,6,4,3,2,1,0, 8,7,6,5,3,2,1,0, + 8,7,6,5,4,2,1,0, 8,7,6,5,4,3,1,0, 8,7,6,5,4,3,2,0, 8,7,6,5,4,3,2,1, 8,7,6,5,4,3,2,2, 8,7,6,5,4,3,3,2, 8,7,6,5,4,4,3,2, 8,7,6,5,5,4,3,2, + 8,7,6,6,5,4,3,2, 8,7,7,6,5,4,3,2, 8,8,7,6,5,4,3,2, 8,8,8,6,5,4,3,2, 8,8,8,7,5,4,3,2, 8,8,8,7,6,4,3,2, 8,8,8,7,6,5,3,2, 8,8,8,7,6,5,4,2, + 8,8,8,7,6,5,4,3, 8,8,8,7,6,5,4,4, 8,8,8,7,6,5,5,4, 8,8,8,7,6,6,5,4, 8,8,8,7,7,6,5,4, 8,8,8,8,7,6,5,4, 8,8,8,8,8,6,5,4, 8,8,8,8,8,7,5,4, + 8,8,8,8,8,7,6,4, 8,8,8,8,8,7,6,5, 8,8,8,8,8,7,6,6, 8,8,8,8,8,7,7,6, 8,8,8,8,8,8,7,6, 8,8,8,8,8,8,8,6, 8,8,8,8,8,8,8,7, 8,8,8,8,8,8,8,8, + }; + + static const uint8 s_idct_col_table[] = + { + 1, 1, 2, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 + }; + + // Scalar "fast pathing" IDCT. + static void idct(const jpgd_block_t* pSrc_ptr, uint8* pDst_ptr, int block_max_zag) + { + assert(block_max_zag >= 1); + assert(block_max_zag <= 64); + + if (block_max_zag <= 1) + { + int k = ((pSrc_ptr[0] + 4) >> 3) + 128; + k = CLAMP(k); + k = k | (k << 8); + k = k | (k << 16); + + for (int i = 8; i > 0; i--) + { + *(int*)&pDst_ptr[0] = k; + *(int*)&pDst_ptr[4] = k; + pDst_ptr += 8; + } + return; + } + + int temp[64]; + + const jpgd_block_t* pSrc = pSrc_ptr; + int* pTemp = temp; + + const uint8* pRow_tab = &s_idct_row_table[(block_max_zag - 1) * 8]; + int i; + for (i = 8; i > 0; i--, pRow_tab++) + { + switch (*pRow_tab) + { + case 0: Row<0>::idct(pTemp, pSrc); break; + case 1: Row<1>::idct(pTemp, pSrc); break; + case 2: Row<2>::idct(pTemp, pSrc); break; + case 3: Row<3>::idct(pTemp, pSrc); break; + case 4: Row<4>::idct(pTemp, pSrc); break; + case 5: Row<5>::idct(pTemp, pSrc); break; + case 6: Row<6>::idct(pTemp, pSrc); break; + case 7: Row<7>::idct(pTemp, pSrc); break; + case 8: Row<8>::idct(pTemp, pSrc); break; + } + + pSrc += 8; + pTemp += 8; + } + + pTemp = temp; + + const int nonzero_rows = s_idct_col_table[block_max_zag - 1]; + for (i = 8; i > 0; i--) + { + switch (nonzero_rows) + { + case 1: Col<1>::idct(pDst_ptr, pTemp); break; + case 2: Col<2>::idct(pDst_ptr, pTemp); break; + case 3: Col<3>::idct(pDst_ptr, pTemp); break; + case 4: Col<4>::idct(pDst_ptr, pTemp); break; + case 5: Col<5>::idct(pDst_ptr, pTemp); break; + case 6: Col<6>::idct(pDst_ptr, pTemp); break; + case 7: Col<7>::idct(pDst_ptr, pTemp); break; + case 8: Col<8>::idct(pDst_ptr, pTemp); break; + } + + pTemp++; + pDst_ptr++; + } + } + + // Retrieve one character from the input stream. + inline uint jpeg_decoder::get_char() + { + // Any bytes remaining in buffer? + if (!m_in_buf_left) + { + // Try to get more bytes. + prep_in_buffer(); + // Still nothing to get? + if (!m_in_buf_left) + { + // Pad the end of the stream with 0xFF 0xD9 (EOI marker) + int t = m_tem_flag; + m_tem_flag ^= 1; + if (t) + return 0xD9; + else + return 0xFF; + } + } + + uint c = *m_pIn_buf_ofs++; + m_in_buf_left--; + + return c; + } + + // Same as previous method, except can indicate if the character is a pad character or not. + inline uint jpeg_decoder::get_char(bool* pPadding_flag) + { + if (!m_in_buf_left) + { + prep_in_buffer(); + if (!m_in_buf_left) + { + *pPadding_flag = true; + int t = m_tem_flag; + m_tem_flag ^= 1; + if (t) + return 0xD9; + else + return 0xFF; + } + } + + *pPadding_flag = false; + + uint c = *m_pIn_buf_ofs++; + m_in_buf_left--; + + return c; + } + + // Inserts a previously retrieved character back into the input buffer. + inline void jpeg_decoder::stuff_char(uint8 q) + { + // This could write before the input buffer, but we've placed another array there. + *(--m_pIn_buf_ofs) = q; + m_in_buf_left++; + } + + // Retrieves one character from the input stream, but does not read past markers. Will continue to return 0xFF when a marker is encountered. + inline uint8 jpeg_decoder::get_octet() + { + bool padding_flag; + int c = get_char(&padding_flag); + + if (c == 0xFF) + { + if (padding_flag) + return 0xFF; + + c = get_char(&padding_flag); + if (padding_flag) + { + stuff_char(0xFF); + return 0xFF; + } + + if (c == 0x00) + return 0xFF; + else + { + stuff_char(static_cast(c)); + stuff_char(0xFF); + return 0xFF; + } + } + + return static_cast(c); + } + + // Retrieves a variable number of bits from the input stream. Does not recognize markers. + inline uint jpeg_decoder::get_bits(int num_bits) + { + if (!num_bits) + return 0; + + uint i = m_bit_buf >> (32 - num_bits); + + if ((m_bits_left -= num_bits) <= 0) + { + m_bit_buf <<= (num_bits += m_bits_left); + + uint c1 = get_char(); + uint c2 = get_char(); + m_bit_buf = (m_bit_buf & 0xFFFF0000) | (c1 << 8) | c2; + + m_bit_buf <<= -m_bits_left; + + m_bits_left += 16; + + assert(m_bits_left >= 0); + } + else + m_bit_buf <<= num_bits; + + return i; + } + + // Retrieves a variable number of bits from the input stream. Markers will not be read into the input bit buffer. Instead, an infinite number of all 1's will be returned when a marker is encountered. + inline uint jpeg_decoder::get_bits_no_markers(int num_bits) + { + if (!num_bits) + return 0; + + assert(num_bits <= 16); + + uint i = m_bit_buf >> (32 - num_bits); + + if ((m_bits_left -= num_bits) <= 0) + { + m_bit_buf <<= (num_bits += m_bits_left); + + if ((m_in_buf_left < 2) || (m_pIn_buf_ofs[0] == 0xFF) || (m_pIn_buf_ofs[1] == 0xFF)) + { + uint c1 = get_octet(); + uint c2 = get_octet(); + m_bit_buf |= (c1 << 8) | c2; + } + else + { + m_bit_buf |= ((uint)m_pIn_buf_ofs[0] << 8) | m_pIn_buf_ofs[1]; + m_in_buf_left -= 2; + m_pIn_buf_ofs += 2; + } + + m_bit_buf <<= -m_bits_left; + + m_bits_left += 16; + + assert(m_bits_left >= 0); + } + else + m_bit_buf <<= num_bits; + + return i; + } + + // Decodes a Huffman encoded symbol. + inline int jpeg_decoder::huff_decode(huff_tables* pH) + { + if (!pH) + stop_decoding(JPGD_DECODE_ERROR); + + int symbol; + // Check first 8-bits: do we have a complete symbol? + if ((symbol = pH->look_up[m_bit_buf >> 24]) < 0) + { + // Decode more bits, use a tree traversal to find symbol. + int ofs = 23; + do + { + unsigned int idx = -(int)(symbol + ((m_bit_buf >> ofs) & 1)); + + // This should never happen, but to be safe I'm turning these asserts into a run-time check. + if ((idx >= JPGD_HUFF_TREE_MAX_LENGTH) || (ofs < 0)) + stop_decoding(JPGD_DECODE_ERROR); + + symbol = pH->tree[idx]; + ofs--; + } while (symbol < 0); + + get_bits_no_markers(8 + (23 - ofs)); + } + else + { + assert(symbol < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); + get_bits_no_markers(pH->code_size[symbol]); + } + + return symbol; + } + + // Decodes a Huffman encoded symbol. + inline int jpeg_decoder::huff_decode(huff_tables* pH, int& extra_bits) + { + int symbol; + + if (!pH) + stop_decoding(JPGD_DECODE_ERROR); + + // Check first 8-bits: do we have a complete symbol? + if ((symbol = pH->look_up2[m_bit_buf >> 24]) < 0) + { + // Use a tree traversal to find symbol. + int ofs = 23; + do + { + unsigned int idx = -(int)(symbol + ((m_bit_buf >> ofs) & 1)); + + // This should never happen, but to be safe I'm turning these asserts into a run-time check. + if ((idx >= JPGD_HUFF_TREE_MAX_LENGTH) || (ofs < 0)) + stop_decoding(JPGD_DECODE_ERROR); + + symbol = pH->tree[idx]; + ofs--; + } while (symbol < 0); + + get_bits_no_markers(8 + (23 - ofs)); + + extra_bits = get_bits_no_markers(symbol & 0xF); + } + else + { + if (symbol & 0x8000) + { + //get_bits_no_markers((symbol >> 8) & 31); + assert(((symbol >> 8) & 31) <= 15); + get_bits_no_markers((symbol >> 8) & 15); + extra_bits = symbol >> 16; + } + else + { + int code_size = (symbol >> 8) & 31; + int num_extra_bits = symbol & 0xF; + int bits = code_size + num_extra_bits; + + if (bits <= 16) + extra_bits = get_bits_no_markers(bits) & ((1 << num_extra_bits) - 1); + else + { + get_bits_no_markers(code_size); + extra_bits = get_bits_no_markers(num_extra_bits); + } + } + + symbol &= 0xFF; + } + + return symbol; + } + + // Tables and macro used to fully decode the DPCM differences. + static const int s_extend_test[16] = { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; + static const int s_extend_offset[16] = { 0, -1, -3, -7, -15, -31, -63, -127, -255, -511, -1023, -2047, -4095, -8191, -16383, -32767 }; + //static const int s_extend_mask[] = { 0, (1 << 0), (1 << 1), (1 << 2), (1 << 3), (1 << 4), (1 << 5), (1 << 6), (1 << 7), (1 << 8), (1 << 9), (1 << 10), (1 << 11), (1 << 12), (1 << 13), (1 << 14), (1 << 15), (1 << 16) }; + +#define JPGD_HUFF_EXTEND(x, s) (((x) < s_extend_test[s & 15]) ? ((x) + s_extend_offset[s & 15]) : (x)) + + // Unconditionally frees all allocated m_blocks. + void jpeg_decoder::free_all_blocks() + { + m_pStream = nullptr; + for (mem_block* b = m_pMem_blocks; b; ) + { + mem_block* n = b->m_pNext; + jpgd_free(b); + b = n; + } + m_pMem_blocks = nullptr; + } + + // This method handles all errors. It will never return. + // It could easily be changed to use C++ exceptions. + JPGD_NORETURN void jpeg_decoder::stop_decoding(jpgd_status status) + { + m_error_code = status; + free_all_blocks(); + longjmp(m_jmp_state, status); + } + + void* jpeg_decoder::alloc(size_t nSize, bool zero) + { + nSize = (JPGD_MAX(nSize, 1) + 3) & ~3; + char* rv = nullptr; + for (mem_block* b = m_pMem_blocks; b; b = b->m_pNext) + { + if ((b->m_used_count + nSize) <= b->m_size) + { + rv = b->m_data + b->m_used_count; + b->m_used_count += nSize; + break; + } + } + if (!rv) + { + int capacity = JPGD_MAX(32768 - 256, ((int)nSize + 2047) & ~2047); + mem_block* b = (mem_block*)jpgd_malloc(sizeof(mem_block) + capacity); + if (!b) + { + stop_decoding(JPGD_NOTENOUGHMEM); + } + + b->m_pNext = m_pMem_blocks; + m_pMem_blocks = b; + b->m_used_count = nSize; + b->m_size = capacity; + rv = b->m_data; + } + if (zero) memset(rv, 0, nSize); + return rv; + } + + void jpeg_decoder::word_clear(void* p, uint16 c, uint n) + { + uint8* pD = (uint8*)p; + const uint8 l = c & 0xFF, h = (c >> 8) & 0xFF; + while (n) + { + pD[0] = l; + pD[1] = h; + pD += 2; + n--; + } + } + + // Refill the input buffer. + // This method will sit in a loop until (A) the buffer is full or (B) + // the stream's read() method reports and end of file condition. + void jpeg_decoder::prep_in_buffer() + { + m_in_buf_left = 0; + m_pIn_buf_ofs = m_in_buf; + + if (m_eof_flag) + return; + + do + { + int bytes_read = m_pStream->read(m_in_buf + m_in_buf_left, JPGD_IN_BUF_SIZE - m_in_buf_left, &m_eof_flag); + if (bytes_read == -1) + stop_decoding(JPGD_STREAM_READ); + + m_in_buf_left += bytes_read; + } while ((m_in_buf_left < JPGD_IN_BUF_SIZE) && (!m_eof_flag)); + + m_total_bytes_read += m_in_buf_left; + + // Pad the end of the block with M_EOI (prevents the decompressor from going off the rails if the stream is invalid). + // (This dates way back to when this decompressor was written in C/asm, and the all-asm Huffman decoder did some fancy things to increase perf.) + word_clear(m_pIn_buf_ofs + m_in_buf_left, 0xD9FF, 64); + } + + // Read a Huffman code table. + void jpeg_decoder::read_dht_marker() + { + int i, index, count; + uint8 huff_num[17]; + uint8 huff_val[256]; + + uint num_left = get_bits(16); + + if (num_left < 2) + stop_decoding(JPGD_BAD_DHT_MARKER); + + num_left -= 2; + + while (num_left) + { + index = get_bits(8); + + huff_num[0] = 0; + + count = 0; + + for (i = 1; i <= 16; i++) + { + huff_num[i] = static_cast(get_bits(8)); + count += huff_num[i]; + } + + if (count > 255) + stop_decoding(JPGD_BAD_DHT_COUNTS); + + bool symbol_present[256]; + memset(symbol_present, 0, sizeof(symbol_present)); + + for (i = 0; i < count; i++) + { + const int s = get_bits(8); + + // Check for obviously bogus tables. + if (symbol_present[s]) + stop_decoding(JPGD_BAD_DHT_COUNTS); + + huff_val[i] = static_cast(s); + symbol_present[s] = true; + } + + i = 1 + 16 + count; + + if (num_left < (uint)i) + stop_decoding(JPGD_BAD_DHT_MARKER); + + num_left -= i; + + if ((index & 0x10) > 0x10) + stop_decoding(JPGD_BAD_DHT_INDEX); + + index = (index & 0x0F) + ((index & 0x10) >> 4) * (JPGD_MAX_HUFF_TABLES >> 1); + + if (index >= JPGD_MAX_HUFF_TABLES) + stop_decoding(JPGD_BAD_DHT_INDEX); + + if (!m_huff_num[index]) + m_huff_num[index] = (uint8*)alloc(17); + + if (!m_huff_val[index]) + m_huff_val[index] = (uint8*)alloc(256); + + m_huff_ac[index] = (index & 0x10) != 0; + memcpy(m_huff_num[index], huff_num, 17); + memcpy(m_huff_val[index], huff_val, 256); + } + } + + // Read a quantization table. + void jpeg_decoder::read_dqt_marker() + { + int n, i, prec; + uint num_left; + uint temp; + + num_left = get_bits(16); + + if (num_left < 2) + stop_decoding(JPGD_BAD_DQT_MARKER); + + num_left -= 2; + + while (num_left) + { + n = get_bits(8); + prec = n >> 4; + n &= 0x0F; + + if (n >= JPGD_MAX_QUANT_TABLES) + stop_decoding(JPGD_BAD_DQT_TABLE); + + if (!m_quant[n]) + m_quant[n] = (jpgd_quant_t*)alloc(64 * sizeof(jpgd_quant_t)); + + // read quantization entries, in zag order + for (i = 0; i < 64; i++) + { + temp = get_bits(8); + + if (prec) + temp = (temp << 8) + get_bits(8); + + m_quant[n][i] = static_cast(temp); + } + + i = 64 + 1; + + if (prec) + i += 64; + + if (num_left < (uint)i) + stop_decoding(JPGD_BAD_DQT_LENGTH); + + num_left -= i; + } + } + + // Read the start of frame (SOF) marker. + void jpeg_decoder::read_sof_marker() + { + int i; + uint num_left; + + num_left = get_bits(16); + + /* precision: sorry, only 8-bit precision is supported */ + if (get_bits(8) != 8) + stop_decoding(JPGD_BAD_PRECISION); + + m_image_y_size = get_bits(16); + + if ((m_image_y_size < 1) || (m_image_y_size > JPGD_MAX_HEIGHT)) + stop_decoding(JPGD_BAD_HEIGHT); + + m_image_x_size = get_bits(16); + + if ((m_image_x_size < 1) || (m_image_x_size > JPGD_MAX_WIDTH)) + stop_decoding(JPGD_BAD_WIDTH); + + m_comps_in_frame = get_bits(8); + + if (m_comps_in_frame > JPGD_MAX_COMPONENTS) + stop_decoding(JPGD_TOO_MANY_COMPONENTS); + + if (num_left != (uint)(m_comps_in_frame * 3 + 8)) + stop_decoding(JPGD_BAD_SOF_LENGTH); + + for (i = 0; i < m_comps_in_frame; i++) + { + m_comp_ident[i] = get_bits(8); + m_comp_h_samp[i] = get_bits(4); + m_comp_v_samp[i] = get_bits(4); + + if (!m_comp_h_samp[i] || !m_comp_v_samp[i] || (m_comp_h_samp[i] > 2) || (m_comp_v_samp[i] > 2)) + stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); + + m_comp_quant[i] = get_bits(8); + if (m_comp_quant[i] >= JPGD_MAX_QUANT_TABLES) + stop_decoding(JPGD_DECODE_ERROR); + } + } + + // Used to skip unrecognized markers. + void jpeg_decoder::skip_variable_marker() + { + uint num_left; + + num_left = get_bits(16); + + if (num_left < 2) + stop_decoding(JPGD_BAD_VARIABLE_MARKER); + + num_left -= 2; + + while (num_left) + { + get_bits(8); + num_left--; + } + } + + // Read a define restart interval (DRI) marker. + void jpeg_decoder::read_dri_marker() + { + if (get_bits(16) != 4) + stop_decoding(JPGD_BAD_DRI_LENGTH); + + m_restart_interval = get_bits(16); + } + + // Read a start of scan (SOS) marker. + void jpeg_decoder::read_sos_marker() + { + uint num_left; + int i, ci, n, c, cc; + + num_left = get_bits(16); + + n = get_bits(8); + + m_comps_in_scan = n; + + num_left -= 3; + + if ((num_left != (uint)(n * 2 + 3)) || (n < 1) || (n > JPGD_MAX_COMPS_IN_SCAN)) + stop_decoding(JPGD_BAD_SOS_LENGTH); + + for (i = 0; i < n; i++) + { + cc = get_bits(8); + c = get_bits(8); + num_left -= 2; + + for (ci = 0; ci < m_comps_in_frame; ci++) + if (cc == m_comp_ident[ci]) + break; + + if (ci >= m_comps_in_frame) + stop_decoding(JPGD_BAD_SOS_COMP_ID); + + if (ci >= JPGD_MAX_COMPONENTS) + stop_decoding(JPGD_DECODE_ERROR); + + m_comp_list[i] = ci; + + m_comp_dc_tab[ci] = (c >> 4) & 15; + m_comp_ac_tab[ci] = (c & 15) + (JPGD_MAX_HUFF_TABLES >> 1); + + if (m_comp_dc_tab[ci] >= JPGD_MAX_HUFF_TABLES) + stop_decoding(JPGD_DECODE_ERROR); + + if (m_comp_ac_tab[ci] >= JPGD_MAX_HUFF_TABLES) + stop_decoding(JPGD_DECODE_ERROR); + } + + m_spectral_start = get_bits(8); + m_spectral_end = get_bits(8); + m_successive_high = get_bits(4); + m_successive_low = get_bits(4); + + if (!m_progressive_flag) + { + m_spectral_start = 0; + m_spectral_end = 63; + } + + num_left -= 3; + + /* read past whatever is num_left */ + while (num_left) + { + get_bits(8); + num_left--; + } + } + + // Finds the next marker. + int jpeg_decoder::next_marker() + { + uint c; //, bytes; + + //bytes = 0; + + do + { + do + { + //bytes++; + c = get_bits(8); + } while (c != 0xFF); + + do + { + c = get_bits(8); + } while (c == 0xFF); + + } while (c == 0); + + // If bytes > 0 here, there where extra bytes before the marker (not good). + + return c; + } + + // Process markers. Returns when an SOFx, SOI, EOI, or SOS marker is + // encountered. + int jpeg_decoder::process_markers() + { + int c; + + for (; ; ) + { + c = next_marker(); + + switch (c) + { + case M_SOF0: + case M_SOF1: + case M_SOF2: + case M_SOF3: + case M_SOF5: + case M_SOF6: + case M_SOF7: + // case M_JPG: + case M_SOF9: + case M_SOF10: + case M_SOF11: + case M_SOF13: + case M_SOF14: + case M_SOF15: + case M_SOI: + case M_EOI: + case M_SOS: + { + return c; + } + case M_DHT: + { + read_dht_marker(); + break; + } + // No arithmitic support - dumb patents! + case M_DAC: + { + stop_decoding(JPGD_NO_ARITHMITIC_SUPPORT); + break; + } + case M_DQT: + { + read_dqt_marker(); + break; + } + case M_DRI: + { + read_dri_marker(); + break; + } + //case M_APP0: /* no need to read the JFIF marker */ + case M_JPG: + case M_RST0: /* no parameters */ + case M_RST1: + case M_RST2: + case M_RST3: + case M_RST4: + case M_RST5: + case M_RST6: + case M_RST7: + case M_TEM: + { + stop_decoding(JPGD_UNEXPECTED_MARKER); + break; + } + default: /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn or APP0 */ + { + skip_variable_marker(); + break; + } + } + } + } + + // Finds the start of image (SOI) marker. + void jpeg_decoder::locate_soi_marker() + { + uint lastchar, thischar; + uint bytesleft; + + lastchar = get_bits(8); + + thischar = get_bits(8); + + /* ok if it's a normal JPEG file without a special header */ + + if ((lastchar == 0xFF) && (thischar == M_SOI)) + return; + + bytesleft = 4096; + + for (; ; ) + { + if (--bytesleft == 0) + stop_decoding(JPGD_NOT_JPEG); + + lastchar = thischar; + + thischar = get_bits(8); + + if (lastchar == 0xFF) + { + if (thischar == M_SOI) + break; + else if (thischar == M_EOI) // get_bits will keep returning M_EOI if we read past the end + stop_decoding(JPGD_NOT_JPEG); + } + } + + // Check the next character after marker: if it's not 0xFF, it can't be the start of the next marker, so the file is bad. + thischar = (m_bit_buf >> 24) & 0xFF; + + if (thischar != 0xFF) + stop_decoding(JPGD_NOT_JPEG); + } + + // Find a start of frame (SOF) marker. + void jpeg_decoder::locate_sof_marker() + { + locate_soi_marker(); + + int c = process_markers(); + + switch (c) + { + case M_SOF2: + { + m_progressive_flag = JPGD_TRUE; + read_sof_marker(); + break; + } + case M_SOF0: /* baseline DCT */ + case M_SOF1: /* extended sequential DCT */ + { + read_sof_marker(); + break; + } + case M_SOF9: /* Arithmitic coding */ + { + stop_decoding(JPGD_NO_ARITHMITIC_SUPPORT); + break; + } + default: + { + stop_decoding(JPGD_UNSUPPORTED_MARKER); + break; + } + } + } + + // Find a start of scan (SOS) marker. + int jpeg_decoder::locate_sos_marker() + { + int c; + + c = process_markers(); + + if (c == M_EOI) + return JPGD_FALSE; + else if (c != M_SOS) + stop_decoding(JPGD_UNEXPECTED_MARKER); + + read_sos_marker(); + + return JPGD_TRUE; + } + + // Reset everything to default/uninitialized state. + void jpeg_decoder::init(jpeg_decoder_stream* pStream, uint32_t flags) + { + m_flags = flags; + m_pMem_blocks = nullptr; + m_error_code = JPGD_SUCCESS; + m_ready_flag = false; + m_image_x_size = m_image_y_size = 0; + m_pStream = pStream; + m_progressive_flag = JPGD_FALSE; + + memset(m_huff_ac, 0, sizeof(m_huff_ac)); + memset(m_huff_num, 0, sizeof(m_huff_num)); + memset(m_huff_val, 0, sizeof(m_huff_val)); + memset(m_quant, 0, sizeof(m_quant)); + + m_scan_type = 0; + m_comps_in_frame = 0; + + memset(m_comp_h_samp, 0, sizeof(m_comp_h_samp)); + memset(m_comp_v_samp, 0, sizeof(m_comp_v_samp)); + memset(m_comp_quant, 0, sizeof(m_comp_quant)); + memset(m_comp_ident, 0, sizeof(m_comp_ident)); + memset(m_comp_h_blocks, 0, sizeof(m_comp_h_blocks)); + memset(m_comp_v_blocks, 0, sizeof(m_comp_v_blocks)); + + m_comps_in_scan = 0; + memset(m_comp_list, 0, sizeof(m_comp_list)); + memset(m_comp_dc_tab, 0, sizeof(m_comp_dc_tab)); + memset(m_comp_ac_tab, 0, sizeof(m_comp_ac_tab)); + + m_spectral_start = 0; + m_spectral_end = 0; + m_successive_low = 0; + m_successive_high = 0; + m_max_mcu_x_size = 0; + m_max_mcu_y_size = 0; + m_blocks_per_mcu = 0; + m_max_blocks_per_row = 0; + m_mcus_per_row = 0; + m_mcus_per_col = 0; + + memset(m_mcu_org, 0, sizeof(m_mcu_org)); + + m_total_lines_left = 0; + m_mcu_lines_left = 0; + m_num_buffered_scanlines = 0; + m_real_dest_bytes_per_scan_line = 0; + m_dest_bytes_per_scan_line = 0; + m_dest_bytes_per_pixel = 0; + + memset(m_pHuff_tabs, 0, sizeof(m_pHuff_tabs)); + + memset(m_dc_coeffs, 0, sizeof(m_dc_coeffs)); + memset(m_ac_coeffs, 0, sizeof(m_ac_coeffs)); + memset(m_block_y_mcu, 0, sizeof(m_block_y_mcu)); + + m_eob_run = 0; + + m_pIn_buf_ofs = m_in_buf; + m_in_buf_left = 0; + m_eof_flag = false; + m_tem_flag = 0; + + memset(m_in_buf_pad_start, 0, sizeof(m_in_buf_pad_start)); + memset(m_in_buf, 0, sizeof(m_in_buf)); + memset(m_in_buf_pad_end, 0, sizeof(m_in_buf_pad_end)); + + m_restart_interval = 0; + m_restarts_left = 0; + m_next_restart_num = 0; + + m_max_mcus_per_row = 0; + m_max_blocks_per_mcu = 0; + m_max_mcus_per_col = 0; + + memset(m_last_dc_val, 0, sizeof(m_last_dc_val)); + m_pMCU_coefficients = nullptr; + m_pSample_buf = nullptr; + m_pSample_buf_prev = nullptr; + m_sample_buf_prev_valid = false; + + m_total_bytes_read = 0; + + m_pScan_line_0 = nullptr; + m_pScan_line_1 = nullptr; + + // Ready the input buffer. + prep_in_buffer(); + + // Prime the bit buffer. + m_bits_left = 16; + m_bit_buf = 0; + + get_bits(16); + get_bits(16); + + for (int i = 0; i < JPGD_MAX_BLOCKS_PER_MCU; i++) + m_mcu_block_max_zag[i] = 64; + } + +#define SCALEBITS 16 +#define ONE_HALF ((int) 1 << (SCALEBITS-1)) +#define FIX(x) ((int) ((x) * (1L<> SCALEBITS; + m_cbb[i] = (FIX(1.77200f) * k + ONE_HALF) >> SCALEBITS; + m_crg[i] = (-FIX(0.71414f)) * k; + m_cbg[i] = (-FIX(0.34414f)) * k + ONE_HALF; + } + } + + // This method throws back into the stream any bytes that where read + // into the bit buffer during initial marker scanning. + void jpeg_decoder::fix_in_buffer() + { + // In case any 0xFF's where pulled into the buffer during marker scanning. + assert((m_bits_left & 7) == 0); + + if (m_bits_left == 16) + stuff_char((uint8)(m_bit_buf & 0xFF)); + + if (m_bits_left >= 8) + stuff_char((uint8)((m_bit_buf >> 8) & 0xFF)); + + stuff_char((uint8)((m_bit_buf >> 16) & 0xFF)); + stuff_char((uint8)((m_bit_buf >> 24) & 0xFF)); + + m_bits_left = 16; + get_bits_no_markers(16); + get_bits_no_markers(16); + } + + void jpeg_decoder::transform_mcu(int mcu_row) + { + jpgd_block_t* pSrc_ptr = m_pMCU_coefficients; + if (mcu_row * m_blocks_per_mcu >= m_max_blocks_per_row) + stop_decoding(JPGD_DECODE_ERROR); + + uint8* pDst_ptr = m_pSample_buf + mcu_row * m_blocks_per_mcu * 64; + + for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) + { + idct(pSrc_ptr, pDst_ptr, m_mcu_block_max_zag[mcu_block]); + pSrc_ptr += 64; + pDst_ptr += 64; + } + } + + // Loads and dequantizes the next row of (already decoded) coefficients. + // Progressive images only. + void jpeg_decoder::load_next_row() + { + int i; + jpgd_block_t* p; + jpgd_quant_t* q; + int mcu_row, mcu_block; //, row_block = 0; + int component_num, component_id; + int block_x_mcu[JPGD_MAX_COMPONENTS]; + + memset(block_x_mcu, 0, JPGD_MAX_COMPONENTS * sizeof(int)); + + for (mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++) + { + int block_x_mcu_ofs = 0, block_y_mcu_ofs = 0; + + for (mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) + { + component_id = m_mcu_org[mcu_block]; + if (m_comp_quant[component_id] >= JPGD_MAX_QUANT_TABLES) + stop_decoding(JPGD_DECODE_ERROR); + + q = m_quant[m_comp_quant[component_id]]; + + p = m_pMCU_coefficients + 64 * mcu_block; + + jpgd_block_t* pAC = coeff_buf_getp(m_ac_coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs); + jpgd_block_t* pDC = coeff_buf_getp(m_dc_coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs); + p[0] = pDC[0]; + memcpy(&p[1], &pAC[1], 63 * sizeof(jpgd_block_t)); + + for (i = 63; i > 0; i--) + if (p[g_ZAG[i]]) + break; + + m_mcu_block_max_zag[mcu_block] = i + 1; + + for (; i >= 0; i--) + if (p[g_ZAG[i]]) + p[g_ZAG[i]] = static_cast(p[g_ZAG[i]] * q[i]); + + //row_block++; + + if (m_comps_in_scan == 1) + block_x_mcu[component_id]++; + else + { + if (++block_x_mcu_ofs == m_comp_h_samp[component_id]) + { + block_x_mcu_ofs = 0; + + if (++block_y_mcu_ofs == m_comp_v_samp[component_id]) + { + block_y_mcu_ofs = 0; + + block_x_mcu[component_id] += m_comp_h_samp[component_id]; + } + } + } + } + + transform_mcu(mcu_row); + } + + if (m_comps_in_scan == 1) + m_block_y_mcu[m_comp_list[0]]++; + else + { + for (component_num = 0; component_num < m_comps_in_scan; component_num++) + { + component_id = m_comp_list[component_num]; + + m_block_y_mcu[component_id] += m_comp_v_samp[component_id]; + } + } + } + + // Restart interval processing. + void jpeg_decoder::process_restart() + { + int i; + int c = 0; + + // Align to a byte boundry + // FIXME: Is this really necessary? get_bits_no_markers() never reads in markers! + //get_bits_no_markers(m_bits_left & 7); + + // Let's scan a little bit to find the marker, but not _too_ far. + // 1536 is a "fudge factor" that determines how much to scan. + for (i = 1536; i > 0; i--) + if (get_char() == 0xFF) + break; + + if (i == 0) + stop_decoding(JPGD_BAD_RESTART_MARKER); + + for (; i > 0; i--) + if ((c = get_char()) != 0xFF) + break; + + if (i == 0) + stop_decoding(JPGD_BAD_RESTART_MARKER); + + // Is it the expected marker? If not, something bad happened. + if (c != (m_next_restart_num + M_RST0)) + stop_decoding(JPGD_BAD_RESTART_MARKER); + + // Reset each component's DC prediction values. + memset(&m_last_dc_val, 0, m_comps_in_frame * sizeof(uint)); + + m_eob_run = 0; + + m_restarts_left = m_restart_interval; + + m_next_restart_num = (m_next_restart_num + 1) & 7; + + // Get the bit buffer going again... + + m_bits_left = 16; + get_bits_no_markers(16); + get_bits_no_markers(16); + } + + static inline int dequantize_ac(int c, int q) { c *= q; return c; } + + // Decodes and dequantizes the next row of coefficients. + void jpeg_decoder::decode_next_row() + { + //int row_block = 0; + + for (int mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++) + { + if ((m_restart_interval) && (m_restarts_left == 0)) + process_restart(); + + jpgd_block_t* p = m_pMCU_coefficients; + for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++, p += 64) + { + int component_id = m_mcu_org[mcu_block]; + if (m_comp_quant[component_id] >= JPGD_MAX_QUANT_TABLES) + stop_decoding(JPGD_DECODE_ERROR); + + jpgd_quant_t* q = m_quant[m_comp_quant[component_id]]; + + int r, s; + s = huff_decode(m_pHuff_tabs[m_comp_dc_tab[component_id]], r); + if (s >= 16) + stop_decoding(JPGD_DECODE_ERROR); + + s = JPGD_HUFF_EXTEND(r, s); + + m_last_dc_val[component_id] = (s += m_last_dc_val[component_id]); + + p[0] = static_cast(s * q[0]); + + int prev_num_set = m_mcu_block_max_zag[mcu_block]; + + huff_tables* pH = m_pHuff_tabs[m_comp_ac_tab[component_id]]; + + int k; + for (k = 1; k < 64; k++) + { + int extra_bits; + s = huff_decode(pH, extra_bits); + + r = s >> 4; + s &= 15; + + if (s) + { + if (r) + { + if ((k + r) > 63) + stop_decoding(JPGD_DECODE_ERROR); + + if (k < prev_num_set) + { + int n = JPGD_MIN(r, prev_num_set - k); + int kt = k; + while (n--) + p[g_ZAG[kt++]] = 0; + } + + k += r; + } + + s = JPGD_HUFF_EXTEND(extra_bits, s); + + if (k >= 64) + stop_decoding(JPGD_DECODE_ERROR); + + p[g_ZAG[k]] = static_cast(dequantize_ac(s, q[k])); //s * q[k]; + } + else + { + if (r == 15) + { + if ((k + 16) > 64) + stop_decoding(JPGD_DECODE_ERROR); + + if (k < prev_num_set) + { + int n = JPGD_MIN(16, prev_num_set - k); + int kt = k; + while (n--) + { + if (kt > 63) + stop_decoding(JPGD_DECODE_ERROR); + p[g_ZAG[kt++]] = 0; + } + } + + k += 16 - 1; // - 1 because the loop counter is k + + if (p[g_ZAG[k & 63]] != 0) + stop_decoding(JPGD_DECODE_ERROR); + } + else + break; + } + } + + if (k < prev_num_set) + { + int kt = k; + while (kt < prev_num_set) + p[g_ZAG[kt++]] = 0; + } + + m_mcu_block_max_zag[mcu_block] = k; + + //row_block++; + } + + transform_mcu(mcu_row); + + m_restarts_left--; + } + } + + // YCbCr H1V1 (1x1:1:1, 3 m_blocks per MCU) to RGB + void jpeg_decoder::H1V1Convert() + { + int row = m_max_mcu_y_size - m_mcu_lines_left; + uint8* d = m_pScan_line_0; + uint8* s = m_pSample_buf + row * 8; + + for (int i = m_max_mcus_per_row; i > 0; i--) + { + for (int j = 0; j < 8; j++) + { + int y = s[j]; + int cb = s[64 + j]; + int cr = s[128 + j]; + + d[0] = clamp(y + m_crr[cr]); + d[1] = clamp(y + ((m_crg[cr] + m_cbg[cb]) >> 16)); + d[2] = clamp(y + m_cbb[cb]); + d[3] = 255; + + d += 4; + } + + s += 64 * 3; + } + } + + // YCbCr H2V1 (2x1:1:1, 4 m_blocks per MCU) to RGB + void jpeg_decoder::H2V1Convert() + { + int row = m_max_mcu_y_size - m_mcu_lines_left; + uint8* d0 = m_pScan_line_0; + uint8* y = m_pSample_buf + row * 8; + uint8* c = m_pSample_buf + 2 * 64 + row * 8; + + for (int i = m_max_mcus_per_row; i > 0; i--) + { + for (int l = 0; l < 2; l++) + { + for (int j = 0; j < 4; j++) + { + int cb = c[0]; + int cr = c[64]; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + int yy = y[j << 1]; + d0[0] = clamp(yy + rc); + d0[1] = clamp(yy + gc); + d0[2] = clamp(yy + bc); + d0[3] = 255; + + yy = y[(j << 1) + 1]; + d0[4] = clamp(yy + rc); + d0[5] = clamp(yy + gc); + d0[6] = clamp(yy + bc); + d0[7] = 255; + + d0 += 8; + + c++; + } + y += 64; + } + + y += 64 * 4 - 64 * 2; + c += 64 * 4 - 8; + } + } + + // YCbCr H2V1 (2x1:1:1, 4 m_blocks per MCU) to RGB + void jpeg_decoder::H2V1ConvertFiltered() + { + const uint BLOCKS_PER_MCU = 4; + int row = m_max_mcu_y_size - m_mcu_lines_left; + uint8* d0 = m_pScan_line_0; + + const int half_image_x_size = (m_image_x_size >> 1) - 1; + const int row_x8 = row * 8; + + for (int x = 0; x < m_image_x_size; x++) + { + int y = m_pSample_buf[check_sample_buf_ofs((x >> 4) * BLOCKS_PER_MCU * 64 + ((x & 8) ? 64 : 0) + (x & 7) + row_x8)]; + + int c_x0 = (x - 1) >> 1; + int c_x1 = JPGD_MIN(c_x0 + 1, half_image_x_size); + c_x0 = JPGD_MAX(c_x0, 0); + + int a = (c_x0 >> 3) * BLOCKS_PER_MCU * 64 + (c_x0 & 7) + row_x8 + 128; + int cb0 = m_pSample_buf[check_sample_buf_ofs(a)]; + int cr0 = m_pSample_buf[check_sample_buf_ofs(a + 64)]; + + int b = (c_x1 >> 3) * BLOCKS_PER_MCU * 64 + (c_x1 & 7) + row_x8 + 128; + int cb1 = m_pSample_buf[check_sample_buf_ofs(b)]; + int cr1 = m_pSample_buf[check_sample_buf_ofs(b + 64)]; + + int w0 = (x & 1) ? 3 : 1; + int w1 = (x & 1) ? 1 : 3; + + int cb = (cb0 * w0 + cb1 * w1 + 2) >> 2; + int cr = (cr0 * w0 + cr1 * w1 + 2) >> 2; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d0[0] = clamp(y + rc); + d0[1] = clamp(y + gc); + d0[2] = clamp(y + bc); + d0[3] = 255; + + d0 += 4; + } + } + + // YCbCr H2V1 (1x2:1:1, 4 m_blocks per MCU) to RGB + void jpeg_decoder::H1V2Convert() + { + int row = m_max_mcu_y_size - m_mcu_lines_left; + uint8* d0 = m_pScan_line_0; + uint8* d1 = m_pScan_line_1; + uint8* y; + uint8* c; + + if (row < 8) + y = m_pSample_buf + row * 8; + else + y = m_pSample_buf + 64 * 1 + (row & 7) * 8; + + c = m_pSample_buf + 64 * 2 + (row >> 1) * 8; + + for (int i = m_max_mcus_per_row; i > 0; i--) + { + for (int j = 0; j < 8; j++) + { + int cb = c[0 + j]; + int cr = c[64 + j]; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + int yy = y[j]; + d0[0] = clamp(yy + rc); + d0[1] = clamp(yy + gc); + d0[2] = clamp(yy + bc); + d0[3] = 255; + + yy = y[8 + j]; + d1[0] = clamp(yy + rc); + d1[1] = clamp(yy + gc); + d1[2] = clamp(yy + bc); + d1[3] = 255; + + d0 += 4; + d1 += 4; + } + + y += 64 * 4; + c += 64 * 4; + } + } + + // YCbCr H2V1 (1x2:1:1, 4 m_blocks per MCU) to RGB + void jpeg_decoder::H1V2ConvertFiltered() + { + const uint BLOCKS_PER_MCU = 4; + int y = m_image_y_size - m_total_lines_left; + int row = y & 15; + + const int half_image_y_size = (m_image_y_size >> 1) - 1; + + uint8* d0 = m_pScan_line_0; + + const int w0 = (row & 1) ? 3 : 1; + const int w1 = (row & 1) ? 1 : 3; + + int c_y0 = (y - 1) >> 1; + int c_y1 = JPGD_MIN(c_y0 + 1, half_image_y_size); + + const uint8_t* p_YSamples = m_pSample_buf; + const uint8_t* p_C0Samples = m_pSample_buf; + if ((c_y0 >= 0) && (((row & 15) == 0) || ((row & 15) == 15)) && (m_total_lines_left > 1)) + { + assert(y > 0); + assert(m_sample_buf_prev_valid); + + if ((row & 15) == 15) + p_YSamples = m_pSample_buf_prev; + + p_C0Samples = m_pSample_buf_prev; + } + + const int y_sample_base_ofs = ((row & 8) ? 64 : 0) + (row & 7) * 8; + const int y0_base = (c_y0 & 7) * 8 + 128; + const int y1_base = (c_y1 & 7) * 8 + 128; + + for (int x = 0; x < m_image_x_size; x++) + { + const int base_ofs = (x >> 3) * BLOCKS_PER_MCU * 64 + (x & 7); + + int y_sample = p_YSamples[check_sample_buf_ofs(base_ofs + y_sample_base_ofs)]; + + int a = base_ofs + y0_base; + int cb0_sample = p_C0Samples[check_sample_buf_ofs(a)]; + int cr0_sample = p_C0Samples[check_sample_buf_ofs(a + 64)]; + + int b = base_ofs + y1_base; + int cb1_sample = m_pSample_buf[check_sample_buf_ofs(b)]; + int cr1_sample = m_pSample_buf[check_sample_buf_ofs(b + 64)]; + + int cb = (cb0_sample * w0 + cb1_sample * w1 + 2) >> 2; + int cr = (cr0_sample * w0 + cr1_sample * w1 + 2) >> 2; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d0[0] = clamp(y_sample + rc); + d0[1] = clamp(y_sample + gc); + d0[2] = clamp(y_sample + bc); + d0[3] = 255; + + d0 += 4; + } + } + + // YCbCr H2V2 (2x2:1:1, 6 m_blocks per MCU) to RGB + void jpeg_decoder::H2V2Convert() + { + int row = m_max_mcu_y_size - m_mcu_lines_left; + uint8* d0 = m_pScan_line_0; + uint8* d1 = m_pScan_line_1; + uint8* y; + uint8* c; + + if (row < 8) + y = m_pSample_buf + row * 8; + else + y = m_pSample_buf + 64 * 2 + (row & 7) * 8; + + c = m_pSample_buf + 64 * 4 + (row >> 1) * 8; + + for (int i = m_max_mcus_per_row; i > 0; i--) + { + for (int l = 0; l < 2; l++) + { + for (int j = 0; j < 8; j += 2) + { + int cb = c[0]; + int cr = c[64]; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + int yy = y[j]; + d0[0] = clamp(yy + rc); + d0[1] = clamp(yy + gc); + d0[2] = clamp(yy + bc); + d0[3] = 255; + + yy = y[j + 1]; + d0[4] = clamp(yy + rc); + d0[5] = clamp(yy + gc); + d0[6] = clamp(yy + bc); + d0[7] = 255; + + yy = y[j + 8]; + d1[0] = clamp(yy + rc); + d1[1] = clamp(yy + gc); + d1[2] = clamp(yy + bc); + d1[3] = 255; + + yy = y[j + 8 + 1]; + d1[4] = clamp(yy + rc); + d1[5] = clamp(yy + gc); + d1[6] = clamp(yy + bc); + d1[7] = 255; + + d0 += 8; + d1 += 8; + + c++; + } + y += 64; + } + + y += 64 * 6 - 64 * 2; + c += 64 * 6 - 8; + } + } + + uint32_t jpeg_decoder::H2V2ConvertFiltered() + { + const uint BLOCKS_PER_MCU = 6; + int y = m_image_y_size - m_total_lines_left; + int row = y & 15; + + const int half_image_y_size = (m_image_y_size >> 1) - 1; + + uint8* d0 = m_pScan_line_0; + + int c_y0 = (y - 1) >> 1; + int c_y1 = JPGD_MIN(c_y0 + 1, half_image_y_size); + + const uint8_t* p_YSamples = m_pSample_buf; + const uint8_t* p_C0Samples = m_pSample_buf; + if ((c_y0 >= 0) && (((row & 15) == 0) || ((row & 15) == 15)) && (m_total_lines_left > 1)) + { + assert(y > 0); + assert(m_sample_buf_prev_valid); + + if ((row & 15) == 15) + p_YSamples = m_pSample_buf_prev; + + p_C0Samples = m_pSample_buf_prev; + } + + const int y_sample_base_ofs = ((row & 8) ? 128 : 0) + (row & 7) * 8; + const int y0_base = (c_y0 & 7) * 8 + 256; + const int y1_base = (c_y1 & 7) * 8 + 256; + + const int half_image_x_size = (m_image_x_size >> 1) - 1; + + static const uint8_t s_muls[2][2][4] = + { + { { 1, 3, 3, 9 }, { 3, 9, 1, 3 }, }, + { { 3, 1, 9, 3 }, { 9, 3, 3, 1 } } + }; + + if (((row & 15) >= 1) && ((row & 15) <= 14)) + { + assert((row & 1) == 1); + assert(((y + 1 - 1) >> 1) == c_y0); + + assert(p_YSamples == m_pSample_buf); + assert(p_C0Samples == m_pSample_buf); + + uint8* d1 = m_pScan_line_1; + const int y_sample_base_ofs1 = (((row + 1) & 8) ? 128 : 0) + ((row + 1) & 7) * 8; + + for (int x = 0; x < m_image_x_size; x++) + { + int k = (x >> 4) * BLOCKS_PER_MCU * 64 + ((x & 8) ? 64 : 0) + (x & 7); + int y_sample0 = p_YSamples[check_sample_buf_ofs(k + y_sample_base_ofs)]; + int y_sample1 = p_YSamples[check_sample_buf_ofs(k + y_sample_base_ofs1)]; + + int c_x0 = (x - 1) >> 1; + int c_x1 = JPGD_MIN(c_x0 + 1, half_image_x_size); + c_x0 = JPGD_MAX(c_x0, 0); + + int a = (c_x0 >> 3) * BLOCKS_PER_MCU * 64 + (c_x0 & 7); + int cb00_sample = p_C0Samples[check_sample_buf_ofs(a + y0_base)]; + int cr00_sample = p_C0Samples[check_sample_buf_ofs(a + y0_base + 64)]; + + int cb01_sample = m_pSample_buf[check_sample_buf_ofs(a + y1_base)]; + int cr01_sample = m_pSample_buf[check_sample_buf_ofs(a + y1_base + 64)]; + + int b = (c_x1 >> 3) * BLOCKS_PER_MCU * 64 + (c_x1 & 7); + int cb10_sample = p_C0Samples[check_sample_buf_ofs(b + y0_base)]; + int cr10_sample = p_C0Samples[check_sample_buf_ofs(b + y0_base + 64)]; + + int cb11_sample = m_pSample_buf[check_sample_buf_ofs(b + y1_base)]; + int cr11_sample = m_pSample_buf[check_sample_buf_ofs(b + y1_base + 64)]; + + { + const uint8_t* pMuls = &s_muls[row & 1][x & 1][0]; + int cb = (cb00_sample * pMuls[0] + cb01_sample * pMuls[1] + cb10_sample * pMuls[2] + cb11_sample * pMuls[3] + 8) >> 4; + int cr = (cr00_sample * pMuls[0] + cr01_sample * pMuls[1] + cr10_sample * pMuls[2] + cr11_sample * pMuls[3] + 8) >> 4; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d0[0] = clamp(y_sample0 + rc); + d0[1] = clamp(y_sample0 + gc); + d0[2] = clamp(y_sample0 + bc); + d0[3] = 255; + + d0 += 4; + } + + { + const uint8_t* pMuls = &s_muls[(row + 1) & 1][x & 1][0]; + int cb = (cb00_sample * pMuls[0] + cb01_sample * pMuls[1] + cb10_sample * pMuls[2] + cb11_sample * pMuls[3] + 8) >> 4; + int cr = (cr00_sample * pMuls[0] + cr01_sample * pMuls[1] + cr10_sample * pMuls[2] + cr11_sample * pMuls[3] + 8) >> 4; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d1[0] = clamp(y_sample1 + rc); + d1[1] = clamp(y_sample1 + gc); + d1[2] = clamp(y_sample1 + bc); + d1[3] = 255; + + d1 += 4; + } + + if (((x & 1) == 1) && (x < m_image_x_size - 1)) + { + const int nx = x + 1; + assert(c_x0 == (nx - 1) >> 1); + + k = (nx >> 4) * BLOCKS_PER_MCU * 64 + ((nx & 8) ? 64 : 0) + (nx & 7); + y_sample0 = p_YSamples[check_sample_buf_ofs(k + y_sample_base_ofs)]; + y_sample1 = p_YSamples[check_sample_buf_ofs(k + y_sample_base_ofs1)]; + + { + const uint8_t* pMuls = &s_muls[row & 1][nx & 1][0]; + int cb = (cb00_sample * pMuls[0] + cb01_sample * pMuls[1] + cb10_sample * pMuls[2] + cb11_sample * pMuls[3] + 8) >> 4; + int cr = (cr00_sample * pMuls[0] + cr01_sample * pMuls[1] + cr10_sample * pMuls[2] + cr11_sample * pMuls[3] + 8) >> 4; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d0[0] = clamp(y_sample0 + rc); + d0[1] = clamp(y_sample0 + gc); + d0[2] = clamp(y_sample0 + bc); + d0[3] = 255; + + d0 += 4; + } + + { + const uint8_t* pMuls = &s_muls[(row + 1) & 1][nx & 1][0]; + int cb = (cb00_sample * pMuls[0] + cb01_sample * pMuls[1] + cb10_sample * pMuls[2] + cb11_sample * pMuls[3] + 8) >> 4; + int cr = (cr00_sample * pMuls[0] + cr01_sample * pMuls[1] + cr10_sample * pMuls[2] + cr11_sample * pMuls[3] + 8) >> 4; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d1[0] = clamp(y_sample1 + rc); + d1[1] = clamp(y_sample1 + gc); + d1[2] = clamp(y_sample1 + bc); + d1[3] = 255; + + d1 += 4; + } + + ++x; + } + } + + return 2; + } + else + { + for (int x = 0; x < m_image_x_size; x++) + { + int y_sample = p_YSamples[check_sample_buf_ofs((x >> 4) * BLOCKS_PER_MCU * 64 + ((x & 8) ? 64 : 0) + (x & 7) + y_sample_base_ofs)]; + + int c_x0 = (x - 1) >> 1; + int c_x1 = JPGD_MIN(c_x0 + 1, half_image_x_size); + c_x0 = JPGD_MAX(c_x0, 0); + + int a = (c_x0 >> 3) * BLOCKS_PER_MCU * 64 + (c_x0 & 7); + int cb00_sample = p_C0Samples[check_sample_buf_ofs(a + y0_base)]; + int cr00_sample = p_C0Samples[check_sample_buf_ofs(a + y0_base + 64)]; + + int cb01_sample = m_pSample_buf[check_sample_buf_ofs(a + y1_base)]; + int cr01_sample = m_pSample_buf[check_sample_buf_ofs(a + y1_base + 64)]; + + int b = (c_x1 >> 3) * BLOCKS_PER_MCU * 64 + (c_x1 & 7); + int cb10_sample = p_C0Samples[check_sample_buf_ofs(b + y0_base)]; + int cr10_sample = p_C0Samples[check_sample_buf_ofs(b + y0_base + 64)]; + + int cb11_sample = m_pSample_buf[check_sample_buf_ofs(b + y1_base)]; + int cr11_sample = m_pSample_buf[check_sample_buf_ofs(b + y1_base + 64)]; + + const uint8_t* pMuls = &s_muls[row & 1][x & 1][0]; + int cb = (cb00_sample * pMuls[0] + cb01_sample * pMuls[1] + cb10_sample * pMuls[2] + cb11_sample * pMuls[3] + 8) >> 4; + int cr = (cr00_sample * pMuls[0] + cr01_sample * pMuls[1] + cr10_sample * pMuls[2] + cr11_sample * pMuls[3] + 8) >> 4; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d0[0] = clamp(y_sample + rc); + d0[1] = clamp(y_sample + gc); + d0[2] = clamp(y_sample + bc); + d0[3] = 255; + + d0 += 4; + } + + return 1; + } + } + + // Y (1 block per MCU) to 8-bit grayscale + void jpeg_decoder::gray_convert() + { + int row = m_max_mcu_y_size - m_mcu_lines_left; + uint8* d = m_pScan_line_0; + uint8* s = m_pSample_buf + row * 8; + + for (int i = m_max_mcus_per_row; i > 0; i--) + { + *(uint*)d = *(uint*)s; + *(uint*)(&d[4]) = *(uint*)(&s[4]); + + s += 64; + d += 8; + } + } + + // Find end of image (EOI) marker, so we can return to the user the exact size of the input stream. + void jpeg_decoder::find_eoi() + { + if (!m_progressive_flag) + { + // Attempt to read the EOI marker. + //get_bits_no_markers(m_bits_left & 7); + + // Prime the bit buffer + m_bits_left = 16; + get_bits(16); + get_bits(16); + + // The next marker _should_ be EOI + process_markers(); + } + + m_total_bytes_read -= m_in_buf_left; + } + + int jpeg_decoder::decode_next_mcu_row() + { + if (setjmp(m_jmp_state)) + return JPGD_FAILED; + + const bool chroma_y_filtering = (m_flags & cFlagLinearChromaFiltering) && ((m_scan_type == JPGD_YH2V2) || (m_scan_type == JPGD_YH1V2)) && (m_image_x_size >= 2) && (m_image_y_size >= 2); + if (chroma_y_filtering) + { + std::swap(m_pSample_buf, m_pSample_buf_prev); + + m_sample_buf_prev_valid = true; + } + + if (m_progressive_flag) + load_next_row(); + else + decode_next_row(); + + // Find the EOI marker if that was the last row. + if (m_total_lines_left <= m_max_mcu_y_size) + find_eoi(); + + m_mcu_lines_left = m_max_mcu_y_size; + return 0; + } + + int jpeg_decoder::decode(const void** pScan_line, uint* pScan_line_len) + { + if ((m_error_code) || (!m_ready_flag)) + return JPGD_FAILED; + + if (m_total_lines_left == 0) + return JPGD_DONE; + + const bool chroma_y_filtering = (m_flags & cFlagLinearChromaFiltering) && ((m_scan_type == JPGD_YH2V2) || (m_scan_type == JPGD_YH1V2)) && (m_image_x_size >= 2) && (m_image_y_size >= 2); + + bool get_another_mcu_row = false; + bool got_mcu_early = false; + if (chroma_y_filtering) + { + if (m_total_lines_left == m_image_y_size) + get_another_mcu_row = true; + else if ((m_mcu_lines_left == 1) && (m_total_lines_left > 1)) + { + get_another_mcu_row = true; + got_mcu_early = true; + } + } + else + { + get_another_mcu_row = (m_mcu_lines_left == 0); + } + + if (get_another_mcu_row) + { + int status = decode_next_mcu_row(); + if (status != 0) + return status; + } + + switch (m_scan_type) + { + case JPGD_YH2V2: + { + if ((m_flags & cFlagLinearChromaFiltering) && (m_image_x_size >= 2) && (m_image_y_size >= 2)) + { + if (m_num_buffered_scanlines == 1) + { + *pScan_line = m_pScan_line_1; + } + else if (m_num_buffered_scanlines == 0) + { + m_num_buffered_scanlines = H2V2ConvertFiltered(); + *pScan_line = m_pScan_line_0; + } + + m_num_buffered_scanlines--; + } + else + { + if ((m_mcu_lines_left & 1) == 0) + { + H2V2Convert(); + *pScan_line = m_pScan_line_0; + } + else + *pScan_line = m_pScan_line_1; + } + + break; + } + case JPGD_YH2V1: + { + if ((m_flags & cFlagLinearChromaFiltering) && (m_image_x_size >= 2) && (m_image_y_size >= 2)) + H2V1ConvertFiltered(); + else + H2V1Convert(); + *pScan_line = m_pScan_line_0; + break; + } + case JPGD_YH1V2: + { + if (chroma_y_filtering) + { + H1V2ConvertFiltered(); + *pScan_line = m_pScan_line_0; + } + else + { + if ((m_mcu_lines_left & 1) == 0) + { + H1V2Convert(); + *pScan_line = m_pScan_line_0; + } + else + *pScan_line = m_pScan_line_1; + } + + break; + } + case JPGD_YH1V1: + { + H1V1Convert(); + *pScan_line = m_pScan_line_0; + break; + } + case JPGD_GRAYSCALE: + { + gray_convert(); + *pScan_line = m_pScan_line_0; + + break; + } + } + + *pScan_line_len = m_real_dest_bytes_per_scan_line; + + if (!got_mcu_early) + { + m_mcu_lines_left--; + } + + m_total_lines_left--; + + return JPGD_SUCCESS; + } + + // Creates the tables needed for efficient Huffman decoding. + void jpeg_decoder::make_huff_table(int index, huff_tables* pH) + { + int p, i, l, si; + uint8 huffsize[258]; + uint huffcode[258]; + uint code; + uint subtree; + int code_size; + int lastp; + int nextfreeentry; + int currententry; + + pH->ac_table = m_huff_ac[index] != 0; + + p = 0; + + for (l = 1; l <= 16; l++) + { + for (i = 1; i <= m_huff_num[index][l]; i++) + { + if (p >= 257) + stop_decoding(JPGD_DECODE_ERROR); + huffsize[p++] = static_cast(l); + } + } + + assert(p < 258); + huffsize[p] = 0; + + lastp = p; + + code = 0; + si = huffsize[0]; + p = 0; + + while (huffsize[p]) + { + while (huffsize[p] == si) + { + if (p >= 257) + stop_decoding(JPGD_DECODE_ERROR); + huffcode[p++] = code; + code++; + } + + code <<= 1; + si++; + } + + memset(pH->look_up, 0, sizeof(pH->look_up)); + memset(pH->look_up2, 0, sizeof(pH->look_up2)); + memset(pH->tree, 0, sizeof(pH->tree)); + memset(pH->code_size, 0, sizeof(pH->code_size)); + + nextfreeentry = -1; + + p = 0; + + while (p < lastp) + { + i = m_huff_val[index][p]; + + code = huffcode[p]; + code_size = huffsize[p]; + + assert(i < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); + pH->code_size[i] = static_cast(code_size); + + if (code_size <= 8) + { + code <<= (8 - code_size); + + for (l = 1 << (8 - code_size); l > 0; l--) + { + if (code >= 256) + stop_decoding(JPGD_DECODE_ERROR); + + pH->look_up[code] = i; + + bool has_extrabits = false; + int extra_bits = 0; + int num_extra_bits = i & 15; + + int bits_to_fetch = code_size; + if (num_extra_bits) + { + int total_codesize = code_size + num_extra_bits; + if (total_codesize <= 8) + { + has_extrabits = true; + extra_bits = ((1 << num_extra_bits) - 1) & (code >> (8 - total_codesize)); + + if (extra_bits > 0x7FFF) + stop_decoding(JPGD_DECODE_ERROR); + + bits_to_fetch += num_extra_bits; + } + } + + if (!has_extrabits) + pH->look_up2[code] = i | (bits_to_fetch << 8); + else + pH->look_up2[code] = i | 0x8000 | (extra_bits << 16) | (bits_to_fetch << 8); + + code++; + } + } + else + { + subtree = (code >> (code_size - 8)) & 0xFF; + + currententry = pH->look_up[subtree]; + + if (currententry == 0) + { + pH->look_up[subtree] = currententry = nextfreeentry; + pH->look_up2[subtree] = currententry = nextfreeentry; + + nextfreeentry -= 2; + } + + code <<= (16 - (code_size - 8)); + + for (l = code_size; l > 9; l--) + { + if ((code & 0x8000) == 0) + currententry--; + + unsigned int idx = -currententry - 1; + + if (idx >= JPGD_HUFF_TREE_MAX_LENGTH) + stop_decoding(JPGD_DECODE_ERROR); + + if (pH->tree[idx] == 0) + { + pH->tree[idx] = nextfreeentry; + + currententry = nextfreeentry; + + nextfreeentry -= 2; + } + else + { + currententry = pH->tree[idx]; + } + + code <<= 1; + } + + if ((code & 0x8000) == 0) + currententry--; + + if ((-currententry - 1) >= JPGD_HUFF_TREE_MAX_LENGTH) + stop_decoding(JPGD_DECODE_ERROR); + + pH->tree[-currententry - 1] = i; + } + + p++; + } + } + + // Verifies the quantization tables needed for this scan are available. + void jpeg_decoder::check_quant_tables() + { + for (int i = 0; i < m_comps_in_scan; i++) + if (m_quant[m_comp_quant[m_comp_list[i]]] == nullptr) + stop_decoding(JPGD_UNDEFINED_QUANT_TABLE); + } + + // Verifies that all the Huffman tables needed for this scan are available. + void jpeg_decoder::check_huff_tables() + { + for (int i = 0; i < m_comps_in_scan; i++) + { + if ((m_spectral_start == 0) && (m_huff_num[m_comp_dc_tab[m_comp_list[i]]] == nullptr)) + stop_decoding(JPGD_UNDEFINED_HUFF_TABLE); + + if ((m_spectral_end > 0) && (m_huff_num[m_comp_ac_tab[m_comp_list[i]]] == nullptr)) + stop_decoding(JPGD_UNDEFINED_HUFF_TABLE); + } + + for (int i = 0; i < JPGD_MAX_HUFF_TABLES; i++) + if (m_huff_num[i]) + { + if (!m_pHuff_tabs[i]) + m_pHuff_tabs[i] = (huff_tables*)alloc(sizeof(huff_tables)); + + make_huff_table(i, m_pHuff_tabs[i]); + } + } + + // Determines the component order inside each MCU. + // Also calcs how many MCU's are on each row, etc. + bool jpeg_decoder::calc_mcu_block_order() + { + int component_num, component_id; + int max_h_samp = 0, max_v_samp = 0; + + for (component_id = 0; component_id < m_comps_in_frame; component_id++) + { + if (m_comp_h_samp[component_id] > max_h_samp) + max_h_samp = m_comp_h_samp[component_id]; + + if (m_comp_v_samp[component_id] > max_v_samp) + max_v_samp = m_comp_v_samp[component_id]; + } + + for (component_id = 0; component_id < m_comps_in_frame; component_id++) + { + m_comp_h_blocks[component_id] = ((((m_image_x_size * m_comp_h_samp[component_id]) + (max_h_samp - 1)) / max_h_samp) + 7) / 8; + m_comp_v_blocks[component_id] = ((((m_image_y_size * m_comp_v_samp[component_id]) + (max_v_samp - 1)) / max_v_samp) + 7) / 8; + } + + if (m_comps_in_scan == 1) + { + m_mcus_per_row = m_comp_h_blocks[m_comp_list[0]]; + m_mcus_per_col = m_comp_v_blocks[m_comp_list[0]]; + } + else + { + m_mcus_per_row = (((m_image_x_size + 7) / 8) + (max_h_samp - 1)) / max_h_samp; + m_mcus_per_col = (((m_image_y_size + 7) / 8) + (max_v_samp - 1)) / max_v_samp; + } + + if (m_comps_in_scan == 1) + { + m_mcu_org[0] = m_comp_list[0]; + + m_blocks_per_mcu = 1; + } + else + { + m_blocks_per_mcu = 0; + + for (component_num = 0; component_num < m_comps_in_scan; component_num++) + { + int num_blocks; + + component_id = m_comp_list[component_num]; + + num_blocks = m_comp_h_samp[component_id] * m_comp_v_samp[component_id]; + + while (num_blocks--) + m_mcu_org[m_blocks_per_mcu++] = component_id; + } + } + + if (m_blocks_per_mcu > m_max_blocks_per_mcu) + return false; + + for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) + { + int comp_id = m_mcu_org[mcu_block]; + if (comp_id >= JPGD_MAX_QUANT_TABLES) + return false; + } + + return true; + } + + // Starts a new scan. + int jpeg_decoder::init_scan() + { + if (!locate_sos_marker()) + return JPGD_FALSE; + + if (!calc_mcu_block_order()) + return JPGD_FALSE; + + check_huff_tables(); + + check_quant_tables(); + + memset(m_last_dc_val, 0, m_comps_in_frame * sizeof(uint)); + + m_eob_run = 0; + + if (m_restart_interval) + { + m_restarts_left = m_restart_interval; + m_next_restart_num = 0; + } + + fix_in_buffer(); + + return JPGD_TRUE; + } + + // Starts a frame. Determines if the number of components or sampling factors + // are supported. + void jpeg_decoder::init_frame() + { + int i; + + if (m_comps_in_frame == 1) + { + if ((m_comp_h_samp[0] != 1) || (m_comp_v_samp[0] != 1)) + stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); + + m_scan_type = JPGD_GRAYSCALE; + m_max_blocks_per_mcu = 1; + m_max_mcu_x_size = 8; + m_max_mcu_y_size = 8; + } + else if (m_comps_in_frame == 3) + { + if (((m_comp_h_samp[1] != 1) || (m_comp_v_samp[1] != 1)) || + ((m_comp_h_samp[2] != 1) || (m_comp_v_samp[2] != 1))) + stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); + + if ((m_comp_h_samp[0] == 1) && (m_comp_v_samp[0] == 1)) + { + m_scan_type = JPGD_YH1V1; + + m_max_blocks_per_mcu = 3; + m_max_mcu_x_size = 8; + m_max_mcu_y_size = 8; + } + else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 1)) + { + m_scan_type = JPGD_YH2V1; + m_max_blocks_per_mcu = 4; + m_max_mcu_x_size = 16; + m_max_mcu_y_size = 8; + } + else if ((m_comp_h_samp[0] == 1) && (m_comp_v_samp[0] == 2)) + { + m_scan_type = JPGD_YH1V2; + m_max_blocks_per_mcu = 4; + m_max_mcu_x_size = 8; + m_max_mcu_y_size = 16; + } + else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 2)) + { + m_scan_type = JPGD_YH2V2; + m_max_blocks_per_mcu = 6; + m_max_mcu_x_size = 16; + m_max_mcu_y_size = 16; + } + else + stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); + } + else + stop_decoding(JPGD_UNSUPPORTED_COLORSPACE); + + m_max_mcus_per_row = (m_image_x_size + (m_max_mcu_x_size - 1)) / m_max_mcu_x_size; + m_max_mcus_per_col = (m_image_y_size + (m_max_mcu_y_size - 1)) / m_max_mcu_y_size; + + // These values are for the *destination* pixels: after conversion. + if (m_scan_type == JPGD_GRAYSCALE) + m_dest_bytes_per_pixel = 1; + else + m_dest_bytes_per_pixel = 4; + + m_dest_bytes_per_scan_line = ((m_image_x_size + 15) & 0xFFF0) * m_dest_bytes_per_pixel; + + m_real_dest_bytes_per_scan_line = (m_image_x_size * m_dest_bytes_per_pixel); + + // Initialize two scan line buffers. + m_pScan_line_0 = (uint8*)alloc(m_dest_bytes_per_scan_line, true); + if ((m_scan_type == JPGD_YH1V2) || (m_scan_type == JPGD_YH2V2)) + m_pScan_line_1 = (uint8*)alloc(m_dest_bytes_per_scan_line, true); + + m_max_blocks_per_row = m_max_mcus_per_row * m_max_blocks_per_mcu; + + // Should never happen + if (m_max_blocks_per_row > JPGD_MAX_BLOCKS_PER_ROW) + stop_decoding(JPGD_DECODE_ERROR); + + // Allocate the coefficient buffer, enough for one MCU + m_pMCU_coefficients = (jpgd_block_t*)alloc(m_max_blocks_per_mcu * 64 * sizeof(jpgd_block_t)); + + for (i = 0; i < m_max_blocks_per_mcu; i++) + m_mcu_block_max_zag[i] = 64; + + m_pSample_buf = (uint8*)alloc(m_max_blocks_per_row * 64); + m_pSample_buf_prev = (uint8*)alloc(m_max_blocks_per_row * 64); + + m_total_lines_left = m_image_y_size; + + m_mcu_lines_left = 0; + + create_look_ups(); + } + + // The coeff_buf series of methods originally stored the coefficients + // into a "virtual" file which was located in EMS, XMS, or a disk file. A cache + // was used to make this process more efficient. Now, we can store the entire + // thing in RAM. + jpeg_decoder::coeff_buf* jpeg_decoder::coeff_buf_open(int block_num_x, int block_num_y, int block_len_x, int block_len_y) + { + coeff_buf* cb = (coeff_buf*)alloc(sizeof(coeff_buf)); + + cb->block_num_x = block_num_x; + cb->block_num_y = block_num_y; + cb->block_len_x = block_len_x; + cb->block_len_y = block_len_y; + cb->block_size = (block_len_x * block_len_y) * sizeof(jpgd_block_t); + cb->pData = (uint8*)alloc(cb->block_size * block_num_x * block_num_y, true); + return cb; + } + + inline jpgd_block_t* jpeg_decoder::coeff_buf_getp(coeff_buf* cb, int block_x, int block_y) + { + if ((block_x >= cb->block_num_x) || (block_y >= cb->block_num_y)) + stop_decoding(JPGD_DECODE_ERROR); + + return (jpgd_block_t*)(cb->pData + block_x * cb->block_size + block_y * (cb->block_size * cb->block_num_x)); + } + + // The following methods decode the various types of m_blocks encountered + // in progressively encoded images. + void jpeg_decoder::decode_block_dc_first(jpeg_decoder* pD, int component_id, int block_x, int block_y) + { + int s, r; + jpgd_block_t* p = pD->coeff_buf_getp(pD->m_dc_coeffs[component_id], block_x, block_y); + + if ((s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_dc_tab[component_id]])) != 0) + { + if (s >= 16) + pD->stop_decoding(JPGD_DECODE_ERROR); + + r = pD->get_bits_no_markers(s); + s = JPGD_HUFF_EXTEND(r, s); + } + + pD->m_last_dc_val[component_id] = (s += pD->m_last_dc_val[component_id]); + + p[0] = static_cast(s << pD->m_successive_low); + } + + void jpeg_decoder::decode_block_dc_refine(jpeg_decoder* pD, int component_id, int block_x, int block_y) + { + if (pD->get_bits_no_markers(1)) + { + jpgd_block_t* p = pD->coeff_buf_getp(pD->m_dc_coeffs[component_id], block_x, block_y); + + p[0] |= (1 << pD->m_successive_low); + } + } + + void jpeg_decoder::decode_block_ac_first(jpeg_decoder* pD, int component_id, int block_x, int block_y) + { + int k, s, r; + + if (pD->m_eob_run) + { + pD->m_eob_run--; + return; + } + + jpgd_block_t* p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y); + + for (k = pD->m_spectral_start; k <= pD->m_spectral_end; k++) + { + unsigned int idx = pD->m_comp_ac_tab[component_id]; + if (idx >= JPGD_MAX_HUFF_TABLES) + pD->stop_decoding(JPGD_DECODE_ERROR); + + s = pD->huff_decode(pD->m_pHuff_tabs[idx]); + + r = s >> 4; + s &= 15; + + if (s) + { + if ((k += r) > 63) + pD->stop_decoding(JPGD_DECODE_ERROR); + + r = pD->get_bits_no_markers(s); + s = JPGD_HUFF_EXTEND(r, s); + + p[g_ZAG[k]] = static_cast(s << pD->m_successive_low); + } + else + { + if (r == 15) + { + if ((k += 15) > 63) + pD->stop_decoding(JPGD_DECODE_ERROR); + } + else + { + pD->m_eob_run = 1 << r; + + if (r) + pD->m_eob_run += pD->get_bits_no_markers(r); + + pD->m_eob_run--; + + break; + } + } + } + } + + void jpeg_decoder::decode_block_ac_refine(jpeg_decoder* pD, int component_id, int block_x, int block_y) + { + int s, k, r; + + int p1 = 1 << pD->m_successive_low; + + //int m1 = (-1) << pD->m_successive_low; + int m1 = static_cast((UINT32_MAX << pD->m_successive_low)); + + jpgd_block_t* p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y); + if (pD->m_spectral_end > 63) + pD->stop_decoding(JPGD_DECODE_ERROR); + + k = pD->m_spectral_start; + + if (pD->m_eob_run == 0) + { + for (; k <= pD->m_spectral_end; k++) + { + unsigned int idx = pD->m_comp_ac_tab[component_id]; + if (idx >= JPGD_MAX_HUFF_TABLES) + pD->stop_decoding(JPGD_DECODE_ERROR); + + s = pD->huff_decode(pD->m_pHuff_tabs[idx]); + + r = s >> 4; + s &= 15; + + if (s) + { + if (s != 1) + pD->stop_decoding(JPGD_DECODE_ERROR); + + if (pD->get_bits_no_markers(1)) + s = p1; + else + s = m1; + } + else + { + if (r != 15) + { + pD->m_eob_run = 1 << r; + + if (r) + pD->m_eob_run += pD->get_bits_no_markers(r); + + break; + } + } + + do + { + jpgd_block_t* this_coef = p + g_ZAG[k & 63]; + + if (*this_coef != 0) + { + if (pD->get_bits_no_markers(1)) + { + if ((*this_coef & p1) == 0) + { + if (*this_coef >= 0) + *this_coef = static_cast(*this_coef + p1); + else + *this_coef = static_cast(*this_coef + m1); + } + } + } + else + { + if (--r < 0) + break; + } + + k++; + + } while (k <= pD->m_spectral_end); + + if ((s) && (k < 64)) + { + p[g_ZAG[k]] = static_cast(s); + } + } + } + + if (pD->m_eob_run > 0) + { + for (; k <= pD->m_spectral_end; k++) + { + jpgd_block_t* this_coef = p + g_ZAG[k & 63]; // logical AND to shut up static code analysis + + if (*this_coef != 0) + { + if (pD->get_bits_no_markers(1)) + { + if ((*this_coef & p1) == 0) + { + if (*this_coef >= 0) + *this_coef = static_cast(*this_coef + p1); + else + *this_coef = static_cast(*this_coef + m1); + } + } + } + } + + pD->m_eob_run--; + } + } + + // Decode a scan in a progressively encoded image. + void jpeg_decoder::decode_scan(pDecode_block_func decode_block_func) + { + int mcu_row, mcu_col, mcu_block; + int block_x_mcu[JPGD_MAX_COMPONENTS], block_y_mcu[JPGD_MAX_COMPONENTS]; + + memset(block_y_mcu, 0, sizeof(block_y_mcu)); + + for (mcu_col = 0; mcu_col < m_mcus_per_col; mcu_col++) + { + int component_num, component_id; + + memset(block_x_mcu, 0, sizeof(block_x_mcu)); + + for (mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++) + { + int block_x_mcu_ofs = 0, block_y_mcu_ofs = 0; + + if ((m_restart_interval) && (m_restarts_left == 0)) + process_restart(); + + for (mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) + { + component_id = m_mcu_org[mcu_block]; + + decode_block_func(this, component_id, block_x_mcu[component_id] + block_x_mcu_ofs, block_y_mcu[component_id] + block_y_mcu_ofs); + + if (m_comps_in_scan == 1) + block_x_mcu[component_id]++; + else + { + if (++block_x_mcu_ofs == m_comp_h_samp[component_id]) + { + block_x_mcu_ofs = 0; + + if (++block_y_mcu_ofs == m_comp_v_samp[component_id]) + { + block_y_mcu_ofs = 0; + block_x_mcu[component_id] += m_comp_h_samp[component_id]; + } + } + } + } + + m_restarts_left--; + } + + if (m_comps_in_scan == 1) + block_y_mcu[m_comp_list[0]]++; + else + { + for (component_num = 0; component_num < m_comps_in_scan; component_num++) + { + component_id = m_comp_list[component_num]; + block_y_mcu[component_id] += m_comp_v_samp[component_id]; + } + } + } + } + + // Decode a progressively encoded image. + void jpeg_decoder::init_progressive() + { + int i; + + if (m_comps_in_frame == 4) + stop_decoding(JPGD_UNSUPPORTED_COLORSPACE); + + // Allocate the coefficient buffers. + for (i = 0; i < m_comps_in_frame; i++) + { + m_dc_coeffs[i] = coeff_buf_open(m_max_mcus_per_row * m_comp_h_samp[i], m_max_mcus_per_col * m_comp_v_samp[i], 1, 1); + m_ac_coeffs[i] = coeff_buf_open(m_max_mcus_per_row * m_comp_h_samp[i], m_max_mcus_per_col * m_comp_v_samp[i], 8, 8); + } + + // See https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf + uint32_t total_scans = 0; + const uint32_t MAX_SCANS_TO_PROCESS = 1000; + + for (; ; ) + { + int dc_only_scan, refinement_scan; + pDecode_block_func decode_block_func; + + if (!init_scan()) + break; + + dc_only_scan = (m_spectral_start == 0); + refinement_scan = (m_successive_high != 0); + + if ((m_spectral_start > m_spectral_end) || (m_spectral_end > 63)) + stop_decoding(JPGD_BAD_SOS_SPECTRAL); + + if (dc_only_scan) + { + if (m_spectral_end) + stop_decoding(JPGD_BAD_SOS_SPECTRAL); + } + else if (m_comps_in_scan != 1) /* AC scans can only contain one component */ + stop_decoding(JPGD_BAD_SOS_SPECTRAL); + + if ((refinement_scan) && (m_successive_low != m_successive_high - 1)) + stop_decoding(JPGD_BAD_SOS_SUCCESSIVE); + + if (dc_only_scan) + { + if (refinement_scan) + decode_block_func = decode_block_dc_refine; + else + decode_block_func = decode_block_dc_first; + } + else + { + if (refinement_scan) + decode_block_func = decode_block_ac_refine; + else + decode_block_func = decode_block_ac_first; + } + + decode_scan(decode_block_func); + + m_bits_left = 16; + get_bits(16); + get_bits(16); + + total_scans++; + if (total_scans > MAX_SCANS_TO_PROCESS) + stop_decoding(JPGD_TOO_MANY_SCANS); + } + + m_comps_in_scan = m_comps_in_frame; + + for (i = 0; i < m_comps_in_frame; i++) + m_comp_list[i] = i; + + if (!calc_mcu_block_order()) + stop_decoding(JPGD_DECODE_ERROR); + } + + void jpeg_decoder::init_sequential() + { + if (!init_scan()) + stop_decoding(JPGD_UNEXPECTED_MARKER); + } + + void jpeg_decoder::decode_start() + { + init_frame(); + + if (m_progressive_flag) + init_progressive(); + else + init_sequential(); + } + + void jpeg_decoder::decode_init(jpeg_decoder_stream* pStream, uint32_t flags) + { + init(pStream, flags); + locate_sof_marker(); + } + + jpeg_decoder::jpeg_decoder(jpeg_decoder_stream* pStream, uint32_t flags) + { + if (setjmp(m_jmp_state)) + return; + decode_init(pStream, flags); + } + + int jpeg_decoder::begin_decoding() + { + if (m_ready_flag) + return JPGD_SUCCESS; + + if (m_error_code) + return JPGD_FAILED; + + if (setjmp(m_jmp_state)) + return JPGD_FAILED; + + decode_start(); + + m_ready_flag = true; + + return JPGD_SUCCESS; + } + + jpeg_decoder::~jpeg_decoder() + { + free_all_blocks(); + } + + jpeg_decoder_file_stream::jpeg_decoder_file_stream() + { + m_pFile = nullptr; + m_eof_flag = false; + m_error_flag = false; + } + + void jpeg_decoder_file_stream::close() + { + if (m_pFile) + { + fclose(m_pFile); + m_pFile = nullptr; + } + + m_eof_flag = false; + m_error_flag = false; + } + + jpeg_decoder_file_stream::~jpeg_decoder_file_stream() + { + close(); + } + + bool jpeg_decoder_file_stream::open(const char* Pfilename) + { + close(); + + m_eof_flag = false; + m_error_flag = false; + +#if defined(_MSC_VER) + m_pFile = nullptr; + fopen_s(&m_pFile, Pfilename, "rb"); +#else + m_pFile = fopen(Pfilename, "rb"); +#endif + return m_pFile != nullptr; + } + + int jpeg_decoder_file_stream::read(uint8* pBuf, int max_bytes_to_read, bool* pEOF_flag) + { + if (!m_pFile) + return -1; + + if (m_eof_flag) + { + *pEOF_flag = true; + return 0; + } + + if (m_error_flag) + return -1; + + int bytes_read = static_cast(fread(pBuf, 1, max_bytes_to_read, m_pFile)); + if (bytes_read < max_bytes_to_read) + { + if (ferror(m_pFile)) + { + m_error_flag = true; + return -1; + } + + m_eof_flag = true; + *pEOF_flag = true; + } + + return bytes_read; + } + + bool jpeg_decoder_mem_stream::open(const uint8* pSrc_data, uint size) + { + close(); + m_pSrc_data = pSrc_data; + m_ofs = 0; + m_size = size; + return true; + } + + int jpeg_decoder_mem_stream::read(uint8* pBuf, int max_bytes_to_read, bool* pEOF_flag) + { + *pEOF_flag = false; + + if (!m_pSrc_data) + return -1; + + uint bytes_remaining = m_size - m_ofs; + if ((uint)max_bytes_to_read > bytes_remaining) + { + max_bytes_to_read = bytes_remaining; + *pEOF_flag = true; + } + + memcpy(pBuf, m_pSrc_data + m_ofs, max_bytes_to_read); + m_ofs += max_bytes_to_read; + + return max_bytes_to_read; + } + + unsigned char* decompress_jpeg_image_from_stream(jpeg_decoder_stream* pStream, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags) + { + if (!actual_comps) + return nullptr; + *actual_comps = 0; + + if ((!pStream) || (!width) || (!height) || (!req_comps)) + return nullptr; + + if ((req_comps != 1) && (req_comps != 3) && (req_comps != 4)) + return nullptr; + + jpeg_decoder decoder(pStream, flags); + if (decoder.get_error_code() != JPGD_SUCCESS) + return nullptr; + + const int image_width = decoder.get_width(), image_height = decoder.get_height(); + *width = image_width; + *height = image_height; + *actual_comps = decoder.get_num_components(); + + if (decoder.begin_decoding() != JPGD_SUCCESS) + return nullptr; + + const int dst_bpl = image_width * req_comps; + + uint8* pImage_data = (uint8*)jpgd_malloc(dst_bpl * image_height); + if (!pImage_data) + return nullptr; + + for (int y = 0; y < image_height; y++) + { + const uint8* pScan_line = 0; // init to quiet compile warning. + uint scan_line_len; + if (decoder.decode((const void**)&pScan_line, &scan_line_len) != JPGD_SUCCESS) + { + jpgd_free(pImage_data); + return nullptr; + } + + uint8* pDst = pImage_data + y * dst_bpl; + + if (((req_comps == 1) && (decoder.get_num_components() == 1)) || ((req_comps == 4) && (decoder.get_num_components() == 3))) + memcpy(pDst, pScan_line, dst_bpl); + else if (decoder.get_num_components() == 1) + { + if (req_comps == 3) + { + for (int x = 0; x < image_width; x++) + { + uint8 luma = pScan_line[x]; + pDst[0] = luma; + pDst[1] = luma; + pDst[2] = luma; + pDst += 3; + } + } + else + { + for (int x = 0; x < image_width; x++) + { + uint8 luma = pScan_line[x]; + pDst[0] = luma; + pDst[1] = luma; + pDst[2] = luma; + pDst[3] = 255; + pDst += 4; + } + } + } + else if (decoder.get_num_components() == 3) + { + if (req_comps == 1) + { + const int YR = 19595, YG = 38470, YB = 7471; + for (int x = 0; x < image_width; x++) + { + int r = pScan_line[x * 4 + 0]; + int g = pScan_line[x * 4 + 1]; + int b = pScan_line[x * 4 + 2]; + *pDst++ = static_cast((r * YR + g * YG + b * YB + 32768) >> 16); + } + } + else + { + for (int x = 0; x < image_width; x++) + { + pDst[0] = pScan_line[x * 4 + 0]; + pDst[1] = pScan_line[x * 4 + 1]; + pDst[2] = pScan_line[x * 4 + 2]; + pDst += 3; + } + } + } + } + + return pImage_data; + } + + unsigned char* decompress_jpeg_image_from_memory(const unsigned char* pSrc_data, int src_data_size, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags) + { + jpgd::jpeg_decoder_mem_stream mem_stream(pSrc_data, src_data_size); + return decompress_jpeg_image_from_stream(&mem_stream, width, height, actual_comps, req_comps, flags); + } + + unsigned char* decompress_jpeg_image_from_file(const char* pSrc_filename, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags) + { + jpgd::jpeg_decoder_file_stream file_stream; + if (!file_stream.open(pSrc_filename)) + return nullptr; + return decompress_jpeg_image_from_stream(&file_stream, width, height, actual_comps, req_comps, flags); + } + +} // namespace jpgd diff --git a/ktx/external/basisu/encoder/jpgd.h b/ktx/external/basisu/encoder/jpgd.h new file mode 100644 index 0000000..86a7814 --- /dev/null +++ b/ktx/external/basisu/encoder/jpgd.h @@ -0,0 +1,347 @@ +// jpgd.h - C++ class for JPEG decompression. +// Public domain, Rich Geldreich +#ifndef JPEG_DECODER_H +#define JPEG_DECODER_H + +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +#define JPGD_NORETURN __declspec(noreturn) +#elif defined(__GNUC__) +#define JPGD_NORETURN __attribute__ ((noreturn)) +#else +#define JPGD_NORETURN +#endif + +#define JPGD_HUFF_TREE_MAX_LENGTH 512 +#define JPGD_HUFF_CODE_SIZE_MAX_LENGTH 256 + +namespace jpgd +{ + typedef unsigned char uint8; + typedef signed short int16; + typedef unsigned short uint16; + typedef unsigned int uint; + typedef signed int int32; + + // Loads a JPEG image from a memory buffer or a file. + // req_comps can be 1 (grayscale), 3 (RGB), or 4 (RGBA). + // On return, width/height will be set to the image's dimensions, and actual_comps will be set to the either 1 (grayscale) or 3 (RGB). + // Notes: For more control over where and how the source data is read, see the decompress_jpeg_image_from_stream() function below, or call the jpeg_decoder class directly. + // Requesting a 8 or 32bpp image is currently a little faster than 24bpp because the jpeg_decoder class itself currently always unpacks to either 8 or 32bpp. + unsigned char* decompress_jpeg_image_from_memory(const unsigned char* pSrc_data, int src_data_size, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags = 0); + unsigned char* decompress_jpeg_image_from_file(const char* pSrc_filename, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags = 0); + + // Success/failure error codes. + enum jpgd_status + { + JPGD_SUCCESS = 0, JPGD_FAILED = -1, JPGD_DONE = 1, + JPGD_BAD_DHT_COUNTS = -256, JPGD_BAD_DHT_INDEX, JPGD_BAD_DHT_MARKER, JPGD_BAD_DQT_MARKER, JPGD_BAD_DQT_TABLE, + JPGD_BAD_PRECISION, JPGD_BAD_HEIGHT, JPGD_BAD_WIDTH, JPGD_TOO_MANY_COMPONENTS, + JPGD_BAD_SOF_LENGTH, JPGD_BAD_VARIABLE_MARKER, JPGD_BAD_DRI_LENGTH, JPGD_BAD_SOS_LENGTH, + JPGD_BAD_SOS_COMP_ID, JPGD_W_EXTRA_BYTES_BEFORE_MARKER, JPGD_NO_ARITHMITIC_SUPPORT, JPGD_UNEXPECTED_MARKER, + JPGD_NOT_JPEG, JPGD_UNSUPPORTED_MARKER, JPGD_BAD_DQT_LENGTH, JPGD_TOO_MANY_BLOCKS, + JPGD_UNDEFINED_QUANT_TABLE, JPGD_UNDEFINED_HUFF_TABLE, JPGD_NOT_SINGLE_SCAN, JPGD_UNSUPPORTED_COLORSPACE, + JPGD_UNSUPPORTED_SAMP_FACTORS, JPGD_DECODE_ERROR, JPGD_BAD_RESTART_MARKER, + JPGD_BAD_SOS_SPECTRAL, JPGD_BAD_SOS_SUCCESSIVE, JPGD_STREAM_READ, JPGD_NOTENOUGHMEM, JPGD_TOO_MANY_SCANS + }; + + // Input stream interface. + // Derive from this class to read input data from sources other than files or memory. Set m_eof_flag to true when no more data is available. + // The decoder is rather greedy: it will keep on calling this method until its internal input buffer is full, or until the EOF flag is set. + // It the input stream contains data after the JPEG stream's EOI (end of image) marker it will probably be pulled into the internal buffer. + // Call the get_total_bytes_read() method to determine the actual size of the JPEG stream after successful decoding. + class jpeg_decoder_stream + { + public: + jpeg_decoder_stream() { } + virtual ~jpeg_decoder_stream() { } + + // The read() method is called when the internal input buffer is empty. + // Parameters: + // pBuf - input buffer + // max_bytes_to_read - maximum bytes that can be written to pBuf + // pEOF_flag - set this to true if at end of stream (no more bytes remaining) + // Returns -1 on error, otherwise return the number of bytes actually written to the buffer (which may be 0). + // Notes: This method will be called in a loop until you set *pEOF_flag to true or the internal buffer is full. + virtual int read(uint8* pBuf, int max_bytes_to_read, bool* pEOF_flag) = 0; + }; + + // stdio FILE stream class. + class jpeg_decoder_file_stream : public jpeg_decoder_stream + { + jpeg_decoder_file_stream(const jpeg_decoder_file_stream&); + jpeg_decoder_file_stream& operator =(const jpeg_decoder_file_stream&); + + FILE* m_pFile; + bool m_eof_flag, m_error_flag; + + public: + jpeg_decoder_file_stream(); + virtual ~jpeg_decoder_file_stream(); + + bool open(const char* Pfilename); + void close(); + + virtual int read(uint8* pBuf, int max_bytes_to_read, bool* pEOF_flag); + }; + + // Memory stream class. + class jpeg_decoder_mem_stream : public jpeg_decoder_stream + { + const uint8* m_pSrc_data; + uint m_ofs, m_size; + + public: + jpeg_decoder_mem_stream() : m_pSrc_data(NULL), m_ofs(0), m_size(0) { } + jpeg_decoder_mem_stream(const uint8* pSrc_data, uint size) : m_pSrc_data(pSrc_data), m_ofs(0), m_size(size) { } + + virtual ~jpeg_decoder_mem_stream() { } + + bool open(const uint8* pSrc_data, uint size); + void close() { m_pSrc_data = NULL; m_ofs = 0; m_size = 0; } + + virtual int read(uint8* pBuf, int max_bytes_to_read, bool* pEOF_flag); + }; + + // Loads JPEG file from a jpeg_decoder_stream. + unsigned char* decompress_jpeg_image_from_stream(jpeg_decoder_stream* pStream, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags = 0); + + enum + { + JPGD_IN_BUF_SIZE = 8192, JPGD_MAX_BLOCKS_PER_MCU = 10, JPGD_MAX_HUFF_TABLES = 8, JPGD_MAX_QUANT_TABLES = 4, + JPGD_MAX_COMPONENTS = 4, JPGD_MAX_COMPS_IN_SCAN = 4, JPGD_MAX_BLOCKS_PER_ROW = 16384, JPGD_MAX_HEIGHT = 32768, JPGD_MAX_WIDTH = 32768 + }; + + typedef int16 jpgd_quant_t; + typedef int16 jpgd_block_t; + + class jpeg_decoder + { + public: + enum + { + cFlagLinearChromaFiltering = 1 + }; + + // Call get_error_code() after constructing to determine if the stream is valid or not. You may call the get_width(), get_height(), etc. + // methods after the constructor is called. You may then either destruct the object, or begin decoding the image by calling begin_decoding(), then decode() on each scanline. + jpeg_decoder(jpeg_decoder_stream* pStream, uint32_t flags = cFlagLinearChromaFiltering); + + ~jpeg_decoder(); + + // Call this method after constructing the object to begin decompression. + // If JPGD_SUCCESS is returned you may then call decode() on each scanline. + + int begin_decoding(); + + // Returns the next scan line. + // For grayscale images, pScan_line will point to a buffer containing 8-bit pixels (get_bytes_per_pixel() will return 1). + // Otherwise, it will always point to a buffer containing 32-bit RGBA pixels (A will always be 255, and get_bytes_per_pixel() will return 4). + // Returns JPGD_SUCCESS if a scan line has been returned. + // Returns JPGD_DONE if all scan lines have been returned. + // Returns JPGD_FAILED if an error occurred. Call get_error_code() for a more info. + int decode(const void** pScan_line, uint* pScan_line_len); + + inline jpgd_status get_error_code() const { return m_error_code; } + + inline int get_width() const { return m_image_x_size; } + inline int get_height() const { return m_image_y_size; } + + inline int get_num_components() const { return m_comps_in_frame; } + + inline int get_bytes_per_pixel() const { return m_dest_bytes_per_pixel; } + inline int get_bytes_per_scan_line() const { return m_image_x_size * get_bytes_per_pixel(); } + + // Returns the total number of bytes actually consumed by the decoder (which should equal the actual size of the JPEG file). + inline int get_total_bytes_read() const { return m_total_bytes_read; } + + private: + jpeg_decoder(const jpeg_decoder&); + jpeg_decoder& operator =(const jpeg_decoder&); + + typedef void (*pDecode_block_func)(jpeg_decoder*, int, int, int); + + struct huff_tables + { + bool ac_table; + uint look_up[256]; + uint look_up2[256]; + uint8 code_size[JPGD_HUFF_CODE_SIZE_MAX_LENGTH]; + uint tree[JPGD_HUFF_TREE_MAX_LENGTH]; + }; + + struct coeff_buf + { + uint8* pData; + int block_num_x, block_num_y; + int block_len_x, block_len_y; + int block_size; + }; + + struct mem_block + { + mem_block* m_pNext; + size_t m_used_count; + size_t m_size; + char m_data[1]; + }; + + jmp_buf m_jmp_state; + uint32_t m_flags; + mem_block* m_pMem_blocks; + int m_image_x_size; + int m_image_y_size; + jpeg_decoder_stream* m_pStream; + + int m_progressive_flag; + + uint8 m_huff_ac[JPGD_MAX_HUFF_TABLES]; + uint8* m_huff_num[JPGD_MAX_HUFF_TABLES]; // pointer to number of Huffman codes per bit size + uint8* m_huff_val[JPGD_MAX_HUFF_TABLES]; // pointer to Huffman codes per bit size + jpgd_quant_t* m_quant[JPGD_MAX_QUANT_TABLES]; // pointer to quantization tables + int m_scan_type; // Gray, Yh1v1, Yh1v2, Yh2v1, Yh2v2 (CMYK111, CMYK4114 no longer supported) + int m_comps_in_frame; // # of components in frame + int m_comp_h_samp[JPGD_MAX_COMPONENTS]; // component's horizontal sampling factor + int m_comp_v_samp[JPGD_MAX_COMPONENTS]; // component's vertical sampling factor + int m_comp_quant[JPGD_MAX_COMPONENTS]; // component's quantization table selector + int m_comp_ident[JPGD_MAX_COMPONENTS]; // component's ID + int m_comp_h_blocks[JPGD_MAX_COMPONENTS]; + int m_comp_v_blocks[JPGD_MAX_COMPONENTS]; + int m_comps_in_scan; // # of components in scan + int m_comp_list[JPGD_MAX_COMPS_IN_SCAN]; // components in this scan + int m_comp_dc_tab[JPGD_MAX_COMPONENTS]; // component's DC Huffman coding table selector + int m_comp_ac_tab[JPGD_MAX_COMPONENTS]; // component's AC Huffman coding table selector + int m_spectral_start; // spectral selection start + int m_spectral_end; // spectral selection end + int m_successive_low; // successive approximation low + int m_successive_high; // successive approximation high + int m_max_mcu_x_size; // MCU's max. X size in pixels + int m_max_mcu_y_size; // MCU's max. Y size in pixels + int m_blocks_per_mcu; + int m_max_blocks_per_row; + int m_mcus_per_row, m_mcus_per_col; + int m_mcu_org[JPGD_MAX_BLOCKS_PER_MCU]; + int m_total_lines_left; // total # lines left in image + int m_mcu_lines_left; // total # lines left in this MCU + int m_num_buffered_scanlines; + int m_real_dest_bytes_per_scan_line; + int m_dest_bytes_per_scan_line; // rounded up + int m_dest_bytes_per_pixel; // 4 (RGB) or 1 (Y) + huff_tables* m_pHuff_tabs[JPGD_MAX_HUFF_TABLES]; + coeff_buf* m_dc_coeffs[JPGD_MAX_COMPONENTS]; + coeff_buf* m_ac_coeffs[JPGD_MAX_COMPONENTS]; + int m_eob_run; + int m_block_y_mcu[JPGD_MAX_COMPONENTS]; + uint8* m_pIn_buf_ofs; + int m_in_buf_left; + int m_tem_flag; + + uint8 m_in_buf_pad_start[64]; + uint8 m_in_buf[JPGD_IN_BUF_SIZE + 128]; + uint8 m_in_buf_pad_end[64]; + + int m_bits_left; + uint m_bit_buf; + int m_restart_interval; + int m_restarts_left; + int m_next_restart_num; + int m_max_mcus_per_row; + int m_max_blocks_per_mcu; + + int m_max_mcus_per_col; + uint m_last_dc_val[JPGD_MAX_COMPONENTS]; + jpgd_block_t* m_pMCU_coefficients; + int m_mcu_block_max_zag[JPGD_MAX_BLOCKS_PER_MCU]; + uint8* m_pSample_buf; + uint8* m_pSample_buf_prev; + int m_crr[256]; + int m_cbb[256]; + int m_crg[256]; + int m_cbg[256]; + uint8* m_pScan_line_0; + uint8* m_pScan_line_1; + jpgd_status m_error_code; + int m_total_bytes_read; + + bool m_ready_flag; + bool m_eof_flag; + bool m_sample_buf_prev_valid; + + inline int check_sample_buf_ofs(int ofs) const { assert(ofs >= 0); assert(ofs < m_max_blocks_per_row * 64); return ofs; } + void free_all_blocks(); + JPGD_NORETURN void stop_decoding(jpgd_status status); + void* alloc(size_t n, bool zero = false); + void word_clear(void* p, uint16 c, uint n); + void prep_in_buffer(); + void read_dht_marker(); + void read_dqt_marker(); + void read_sof_marker(); + void skip_variable_marker(); + void read_dri_marker(); + void read_sos_marker(); + int next_marker(); + int process_markers(); + void locate_soi_marker(); + void locate_sof_marker(); + int locate_sos_marker(); + void init(jpeg_decoder_stream* pStream, uint32_t flags); + void create_look_ups(); + void fix_in_buffer(); + void transform_mcu(int mcu_row); + coeff_buf* coeff_buf_open(int block_num_x, int block_num_y, int block_len_x, int block_len_y); + inline jpgd_block_t* coeff_buf_getp(coeff_buf* cb, int block_x, int block_y); + void load_next_row(); + void decode_next_row(); + void make_huff_table(int index, huff_tables* pH); + void check_quant_tables(); + void check_huff_tables(); + bool calc_mcu_block_order(); + int init_scan(); + void init_frame(); + void process_restart(); + void decode_scan(pDecode_block_func decode_block_func); + void init_progressive(); + void init_sequential(); + void decode_start(); + void decode_init(jpeg_decoder_stream* pStream, uint32_t flags); + void H2V2Convert(); + uint32_t H2V2ConvertFiltered(); + void H2V1Convert(); + void H2V1ConvertFiltered(); + void H1V2Convert(); + void H1V2ConvertFiltered(); + void H1V1Convert(); + void gray_convert(); + void find_eoi(); + inline uint get_char(); + inline uint get_char(bool* pPadding_flag); + inline void stuff_char(uint8 q); + inline uint8 get_octet(); + inline uint get_bits(int num_bits); + inline uint get_bits_no_markers(int numbits); + inline int huff_decode(huff_tables* pH); + inline int huff_decode(huff_tables* pH, int& extrabits); + + // Clamps a value between 0-255. + static inline uint8 clamp(int i) + { + if (static_cast(i) > 255) + i = (((~i) >> 31) & 0xFF); + return static_cast(i); + } + int decode_next_mcu_row(); + + static void decode_block_dc_first(jpeg_decoder* pD, int component_id, int block_x, int block_y); + static void decode_block_dc_refine(jpeg_decoder* pD, int component_id, int block_x, int block_y); + static void decode_block_ac_first(jpeg_decoder* pD, int component_id, int block_x, int block_y); + static void decode_block_ac_refine(jpeg_decoder* pD, int component_id, int block_x, int block_y); + }; + +} // namespace jpgd + +#endif // JPEG_DECODER_H diff --git a/ktx/external/basisu/encoder/pvpngreader.cpp b/ktx/external/basisu/encoder/pvpngreader.cpp new file mode 100644 index 0000000..46639f2 --- /dev/null +++ b/ktx/external/basisu/encoder/pvpngreader.cpp @@ -0,0 +1,2662 @@ +// pngreader.cpp - Public Domain - see unlicense at bottom of file. +// +// Notes: +// This is ancient code from ~1995 ported to C++. It was originally written for a +// DOS app with very limited memory. It's not as fast as it should be, but it works. +// The low-level PNG reader class was written assuming the PNG file could not fit +// entirely into memory, which dictated how it was written/structured. +// It has been modified to use either zlib or miniz. +// It supports all PNG color types/bit depths/interlacing, however 16-bit/component +// images are converted to 8-bit. +// TRNS chunks are converted to alpha as needed. +// GAMA chunk is read, but not applied. + +#include "../transcoder/basisu.h" + +#define MINIZ_HEADER_FILE_ONLY +#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES +#include "basisu_miniz.h" + +#include "pvpngreader.h" + +#include +#include +#include +#include +#include +#include + +#define PVPNG_IDAT_CRC_CHECKING (1) +#define PVPNG_ADLER32_CHECKING (1) + +namespace pv_png +{ + +const uint32_t MIN_PNG_SIZE = 8 + 13 + 8 + 1 + 4 + 12; + +template inline S maximum(S a, S b) { return (a > b) ? a : b; } +template inline S minimum(S a, S b) { return (a < b) ? a : b; } + +template inline void clear_obj(T& obj) { memset(&obj, 0, sizeof(obj)); } + +#define MAX_SUPPORTED_RES (32768) +#define FALSE (0) +#define TRUE (1) +#define PNG_MAX_ALLOC_BLOCKS (16) + +enum +{ + PNG_DECERROR = -3, + PNG_ALLDONE = -5, + PNG_READPASTEOF = -11, + PNG_UNKNOWNTYPE = -16, + PNG_FILEREADERROR = -17, + PNG_NOTENOUGHMEM = -108, + PNG_BAD_CHUNK_CRC32 = -13000, + PNG_NO_IHDR = -13001, + PNG_BAD_WIDTH = -13002, + PNG_BAD_HEIGHT = -13003, + PNG_UNS_COMPRESSION = -13004, + PNG_UNS_FILTER = -13005, + PNG_UNS_ILACE = -13006, + PNG_UNS_COLOR_TYPE = -13007, + PNG_BAD_BIT_DEPTH = -13008, + PNG_BAD_CHUNK_SIZE = -13009, + PNG_UNS_CRITICAL_CHUNK = -13010, + PNG_BAD_TRNS_CHUNK = -13011, + PNG_BAD_PLTE_CHUNK = -13012, + PNG_UNS_RESOLUTION = -13013, + PNG_INVALID_DATA_STREAM = -13014, + PNG_MISSING_PALETTE = -13015, + PNG_UNS_PREDICTOR = -13016, + PNG_INCOMPLETE_IMAGE = -13017, + PNG_TOO_MUCH_DATA = -13018 +}; + +#define PNG_COLOR_TYPE_PAL_MASK (1) +#define PNG_COLOR_TYPE_COL_MASK (2) +#define PNG_COLOR_TYPE_ALP_MASK (4) + +#define PNG_INFLATE_SRC_BUF_SIZE (4096) + +struct ihdr_struct +{ + uint32_t m_width; + uint32_t m_height; + uint8_t m_bit_depth; + uint8_t m_color_type; + uint8_t m_comp_type; + uint8_t m_filter_type; + uint8_t m_ilace_type; +}; + +class png_file +{ +public: + png_file() { } + virtual ~png_file() { } + + virtual bool resize(uint64_t new_size) = 0; + virtual uint64_t get_size() = 0; + virtual uint64_t tell() = 0; + virtual bool seek(uint64_t ofs) = 0; + virtual size_t write(const void* pBuf, size_t len) = 0; + virtual size_t read(void* pBuf, size_t len) = 0; +}; + +class png_memory_file : public png_file +{ +public: + std::vector m_buf; + uint64_t m_ofs; + + png_memory_file() : + png_file(), + m_ofs(0) + { + } + + virtual ~png_memory_file() + { + } + + std::vector& get_buf() { return m_buf; } + const std::vector& get_buf() const { return m_buf; } + + void init() + { + m_ofs = 0; + m_buf.resize(0); + } + + virtual bool resize(uint64_t new_size) + { + if ((sizeof(size_t) == sizeof(uint32_t)) && (new_size >= 0x7FFFFFFF)) + return false; + + m_buf.resize((size_t)new_size); + m_ofs = m_buf.size(); + + return true; + } + + virtual uint64_t get_size() + { + return m_buf.size(); + } + + virtual uint64_t tell() + { + return m_ofs; + } + + virtual bool seek(uint64_t ofs) + { + m_ofs = ofs; + return true; + } + + virtual size_t write(const void* pBuf, size_t len) + { + uint64_t new_size = m_ofs + len; + if (new_size > m_buf.size()) + { + if ((sizeof(size_t) == sizeof(uint32_t)) && (new_size > 0x7FFFFFFFUL)) + return 0; + m_buf.resize(new_size); + } + + memcpy(&m_buf[(size_t)m_ofs], pBuf, len); + m_ofs += len; + + return len; + } + + virtual size_t read(void* pBuf, size_t len) + { + if (m_ofs >= m_buf.size()) + return 0; + + uint64_t max_bytes = minimum(len, m_buf.size() - m_ofs); + memcpy(pBuf, &m_buf[(size_t)m_ofs], max_bytes); + + m_ofs += max_bytes; + + return max_bytes; + } +}; + +class png_readonly_memory_file : public png_file +{ +public: + const uint8_t* m_pBuf; + size_t m_buf_size; + uint64_t m_ofs; + + png_readonly_memory_file() : + png_file(), + m_pBuf(nullptr), + m_buf_size(0), + m_ofs(0) + { + } + + virtual ~png_readonly_memory_file() + { + } + + void init(const void *pBuf, size_t buf_size) + { + m_pBuf = static_cast(pBuf); + m_buf_size = buf_size; + m_ofs = 0; + } + + virtual bool resize(uint64_t new_size) + { + (void)new_size; + assert(0); + return false; + } + + virtual uint64_t get_size() + { + return m_buf_size; + } + + virtual uint64_t tell() + { + return m_ofs; + } + + virtual bool seek(uint64_t ofs) + { + m_ofs = ofs; + return true; + } + + virtual size_t write(const void* pBuf, size_t len) + { + (void)pBuf; + (void)len; + assert(0); + return 0; + } + + virtual size_t read(void* pBuf, size_t len) + { + if (m_ofs >= m_buf_size) + return 0; + + uint64_t max_bytes = minimum(len, m_buf_size - m_ofs); + memcpy(pBuf, &m_pBuf[(size_t)m_ofs], max_bytes); + + m_ofs += max_bytes; + + return max_bytes; + } +}; + +#ifdef _MSC_VER +#define ftell64 _ftelli64 +#define fseek64 _fseeki64 +#else +#define ftell64 ftello +#define fseek64 fseeko +#endif + +class png_cfile : public png_file +{ +public: + FILE* m_pFile; + + png_cfile() : + png_file(), + m_pFile(nullptr) + { + } + + virtual ~png_cfile() + { + close(); + } + + bool init(const char *pFilename, const char *pMode) + { + close(); + + m_pFile = nullptr; + +#ifdef _MSC_VER + fopen_s(&m_pFile, pFilename, pMode); +#else + m_pFile = fopen(pFilename, pMode); +#endif + + return m_pFile != nullptr; + } + + bool close() + { + bool status = true; + if (m_pFile) + { + if (fclose(m_pFile) == EOF) + status = false; + m_pFile = nullptr; + } + return status; + } + + virtual bool resize(uint64_t new_size) + { + if (new_size) + { + if (!seek(new_size - 1)) + return false; + + int v = 0; + if (write(&v, 1) != 1) + return false; + } + else + { + if (!seek(0)) + return false; + } + + return true; + } + + virtual uint64_t get_size() + { + int64_t cur_ofs = ftell64(m_pFile); + if (cur_ofs < 0) + return 0; + + if (fseek64(m_pFile, 0, SEEK_END) != 0) + return 0; + + const int64_t cur_size = ftell64(m_pFile); + if (cur_size < 0) + return 0; + + if (fseek64(m_pFile, cur_ofs, SEEK_SET) != 0) + return 0; + + return cur_size; + } + + virtual uint64_t tell() + { + int64_t cur_ofs = ftell64(m_pFile); + if (cur_ofs < 0) + return 0; + + return cur_ofs; + } + + virtual bool seek(uint64_t ofs) + { + return fseek64(m_pFile, ofs, SEEK_SET) == 0; + } + + virtual size_t write(const void* pBuf, size_t len) + { + return (size_t)fwrite(pBuf, 1, len, m_pFile); + } + + virtual size_t read(void* pBuf, size_t len) + { + return (size_t)fread(pBuf, 1, len, m_pFile); + } +}; + +// This low-level helper class handles the actual decoding of PNG files. +class png_decoder +{ +public: + png_decoder(); + ~png_decoder(); + + // Scans the PNG file, but doesn't decode the IDAT data. + // Returns 0 on success, or an error code. + // If the returned status is non-zero, or m_img_supported_flag==FALSE the image either the image is corrupted/not PNG or is unsupported in some way. + int png_scan(png_file *pFile); + + // Decodes a single scanline of PNG image data. + // Returns a pointer to the scanline's pixel data and its size in bytes. + // This data is only minimally processed from the internal PNG pixel data. + // The caller must use the ihdr, trns_flag and values, and the palette to actually decode the pixel data. + // + // Possible returned pixel formats is somewhat complex due to the history of this code: + // 8-bit RGBA, always 4 bytes/pixel - 24bpp PNG's are converted to 32bpp and TRNS processing is done automatically (8/16bpp RGB or RGBA PNG files) + // 1/2/4/8-bit grayscale, 1 byte per pixel - must convert to [0,255] using the palette or some other means, must optionally use the TRNS chunk for alpha (1/2/4/8 Grayscale PNG files - not 16bpp though!) + // 1/2/4/8-bit palettized, 1 byte per pixel - must convert to RGB using the 24bpp palette and optionally the TRNS chunk for alpha (1/2/4/8bpp palettized PNG files) + // 8-bit grayscale with alpha, 2 bytes per pixel - TRNS processing will be done for you on 16bpp images (there's a special case here for 16bpp Grey files) (8/16bpp Gray-Alpha *or 16bpp Grayscale* PNG files) + // + // Returns 0 on success, a non-zero error code, or PNG_ALLDONE. + int png_decode(void** ppImg_ptr, uint32_t* pImg_len); + + // Starts decoding. Returns 0 on success, otherwise an error code. + int png_decode_start(); + + // Deinitializes the decoder, freeing all allocations. + void png_decode_end(); + + png_file* m_pFile; + + // Image's 24bpp palette - 3 bytes per entry + uint8_t m_plte_flag; + uint8_t m_img_pal[768]; + + int m_img_supported_flag; + + ihdr_struct m_ihdr; + + uint8_t m_chunk_flag; + uint32_t m_chunk_size; + uint32_t m_chunk_left; + uint32_t m_chunk_crc32; + uint8_t m_chunk_name[4]; + + uint8_t m_end_of_idat_chunks; + + void* m_pMalloc_blocks[PNG_MAX_ALLOC_BLOCKS]; + + uint32_t m_dec_bytes_per_pixel; // bytes per pixel decoded from the PNG file (minimum 1 for 1/2/4 bpp), factors in the PNG 8/16 bit/component bit depth, may be up to 8 bytes (2*4) + uint32_t m_dst_bytes_per_pixel; // bytes per pixel returned to the caller (1-4), always has alpha if the PNG has alpha, 16-bit components always converted to 8-bits/component + + uint32_t m_dec_bytes_per_line; // bytes per line decoded from the PNG file (before 1/2/4 expansion), +1 for the filter byte + uint32_t m_src_bytes_per_line; // decoded PNG bytes per line, before 1/2/4 bpp expansion, not counting the filter byte, updated during adam7 deinterlacing + uint32_t m_dst_bytes_per_line; // bytes per line returned to the caller (1-4 times width) + + int (*m_pProcess_func)(uint8_t* src, uint8_t* dst, int pixels, png_decoder* pwi); + + uint8_t* m_pPre_line_buf; + uint8_t* m_pCur_line_buf; + uint8_t* m_pPro_line_buf; + + uint8_t m_bkgd_flag; + uint32_t m_bkgd_value[3]; + + uint8_t m_gama_flag; + uint32_t m_gama_value; + + uint8_t m_trns_flag; + uint32_t m_trns_value[256]; + + buminiz::mz_stream m_inflator; + + uint8_t inflate_src_buf[PNG_INFLATE_SRC_BUF_SIZE]; + + uint32_t m_inflate_src_buf_ofs; + uint32_t m_inflate_src_buf_size; + uint32_t m_inflate_dst_buf_ofs; + + int m_inflate_eof_flag; + + uint8_t m_gamma_table[256]; + + int m_pass_x_size; + int m_pass_y_left; + + int m_adam7_pass_num; + int m_adam7_pass_y; + int m_adam7_pass_size_x[7]; + int m_adam7_pass_size_y[7]; + + std::vector m_adam7_image_buf; + + int m_adam7_decoded_flag; + + bool m_scanned_flag; + + int m_terminate_status; + +#define TEMP_BUF_SIZE (384) + uint8_t m_temp_buf[TEMP_BUF_SIZE * 4]; + + void clear(); + void uninitialize(); + int terminate(int status); + void* png_malloc(uint32_t i); + void* png_calloc(uint32_t i); + int block_read(void* buf, uint32_t len); + int64_t block_read_dword(); + int fetch_next_chunk_data(uint8_t* buf, int bytes); + int fetch_next_chunk_byte(); + int fetch_next_chunk_word(); + int64_t fetch_next_chunk_dword(); + int fetch_next_chunk_init(); + int unchunk_data(uint8_t* buf, uint32_t bytes, uint32_t* ptr_bytes_read); + inline void adam7_write_pixel_8(int x, int y, int c); + inline void adam7_write_pixel_16(int x, int y, int r, int g); + inline void adam7_write_pixel_24(int x, int y, int r, int g, int b); + inline void adam7_write_pixel_32(int x, int y, int r, int g, int b, int a); + void unpredict_sub(uint8_t* lst, uint8_t* cur, uint32_t bytes, int bpp); + void unpredict_up(uint8_t* lst, uint8_t* cur, uint32_t bytes, int bpp); + void unpredict_average(uint8_t* lst, uint8_t* cur, uint32_t bytes, int bpp); + inline uint8_t paeth_predictor(int a, int b, int c); + void unpredict_paeth(uint8_t* lst, uint8_t* cur, uint32_t bytes, int bpp); + int adam7_pass_size(int size, int start, int step); + int decompress_line(uint32_t* bytes_decoded); + int find_iend_chunk(); + void calc_gamma_table(); + void create_grey_palette(); + int read_signature(); + int read_ihdr_chunk(); + int read_bkgd_chunk(); + int read_gama_chunk(); + int read_trns_chunk(); + int read_plte_chunk(); + int find_idat_chunk(); +}; + +void png_decoder::uninitialize() +{ + m_pFile = nullptr; + + for (int i = 0; i < PNG_MAX_ALLOC_BLOCKS; i++) + { + free(m_pMalloc_blocks[i]); + m_pMalloc_blocks[i] = nullptr; + } + + mz_inflateEnd(&m_inflator); +} + +int png_decoder::terminate(int status) +{ + if (m_terminate_status == 0) + m_terminate_status = status; + + uninitialize(); + return status; +} + +void* png_decoder::png_malloc(uint32_t len) +{ + if (!len) + len++; + + void* p = malloc(len); + + if (!p) + return nullptr; + + int j; + for (j = 0; j < PNG_MAX_ALLOC_BLOCKS; j++) + if (!m_pMalloc_blocks[j]) + break; + + if (j == PNG_MAX_ALLOC_BLOCKS) + return nullptr; + + m_pMalloc_blocks[j] = p; + + return p; +} + +void* png_decoder::png_calloc(uint32_t len) +{ + void* p = png_malloc(len); + if (!p) + return nullptr; + + if (p) + memset(p, 0, len); + + return p; +} + +int png_decoder::block_read(void* buf, uint32_t len) +{ + size_t bytes_read = m_pFile->read(buf, len); + if (bytes_read != len) + return terminate(PNG_READPASTEOF); + return 0; +} + +int64_t png_decoder::block_read_dword() +{ + uint8_t buf[4]; + + int status = block_read(buf, 4); + if (status != 0) + return status; + + uint32_t v = buf[3] + ((uint32_t)buf[2] << 8) + ((uint32_t)buf[1] << 16) + ((uint32_t)buf[0] << 24); + return (int64_t)v; +} + +int png_decoder::fetch_next_chunk_data(uint8_t* buf, int bytes) +{ + if (!m_chunk_flag) + return 0; + + bytes = minimum(bytes, m_chunk_left); + + int status = block_read(buf, bytes); + if (status != 0) + return status; + +#if PVPNG_IDAT_CRC_CHECKING + bool check_crc32 = true; +#else + const bool is_idat = (m_chunk_name[0] == 'I') && (m_chunk_name[1] == 'D') && (m_chunk_name[2] == 'A') && (m_chunk_name[3] == 'T'); + bool check_crc32 = !is_idat; +#endif + + if (check_crc32) + m_chunk_crc32 = buminiz::mz_crc32(m_chunk_crc32, buf, bytes); + + if ((m_chunk_left -= bytes) == 0) + { + int64_t res = block_read_dword(); + if (res < 0) + return (int)res; + + if (check_crc32) + { + if (m_chunk_crc32 != (uint32_t)res) + return terminate(PNG_BAD_CHUNK_CRC32); + } + + m_chunk_flag = FALSE; + } + + return bytes; +} + +int png_decoder::fetch_next_chunk_byte() +{ + uint8_t buf[1]; + + int status = fetch_next_chunk_data(buf, 1); + if (status < 0) + return status; + + if (status != 1) + return terminate(PNG_BAD_CHUNK_SIZE); + + return buf[0]; +} + +int png_decoder::fetch_next_chunk_word() +{ + uint8_t buf[2]; + + int status = fetch_next_chunk_data(buf, 2); + if (status < 0) + return status; + + if (status != 2) + return terminate(PNG_BAD_CHUNK_SIZE); + + return buf[1] + ((uint32_t)buf[0] << 8); +} + +int64_t png_decoder::fetch_next_chunk_dword() +{ + uint8_t buf[4]; + + int status = fetch_next_chunk_data(buf, 4); + if (status < 0) + return status; + + if (status != 4) + terminate(PNG_BAD_CHUNK_SIZE); + + uint32_t v = buf[3] + ((uint32_t)buf[2] << 8) + ((uint32_t)buf[1] << 16) + ((uint32_t)buf[0] << 24); + return (int64_t)v; +} + +int png_decoder::fetch_next_chunk_init() +{ + while (m_chunk_flag) + { + int status = fetch_next_chunk_data(m_temp_buf, TEMP_BUF_SIZE * 4); + if (status != 0) + return status; + } + + int64_t n = block_read_dword(); + if (n < 0) + return (int)n; + + m_chunk_size = (uint32_t)n; + + m_chunk_flag = TRUE; + m_chunk_left = m_chunk_size + 4; + m_chunk_crc32 = 0; + + int status = fetch_next_chunk_data(m_chunk_name, 4); + if (status < 0) + return status; + + return 0; +} + +int png_decoder::unchunk_data(uint8_t* buf, uint32_t bytes, uint32_t* ptr_bytes_read) +{ + uint32_t bytes_read = 0; + + if ((!bytes) || (m_end_of_idat_chunks)) + { + *ptr_bytes_read = 0; + return TRUE; + } + + while (bytes_read != bytes) + { + if (!m_chunk_flag) + { + int res = fetch_next_chunk_init(); + if (res < 0) + return res; + + if ((m_chunk_name[0] != 'I') || + (m_chunk_name[1] != 'D') || + (m_chunk_name[2] != 'A') || + (m_chunk_name[3] != 'T')) + { + *ptr_bytes_read = bytes_read; + m_end_of_idat_chunks = TRUE; + return TRUE; + } + } + + int res = fetch_next_chunk_data(buf + bytes_read, bytes - bytes_read); + if (res < 0) + return res; + + bytes_read += (uint32_t)res; + } + + *ptr_bytes_read = bytes_read; + + return FALSE; +} + +inline void png_decoder::adam7_write_pixel_8(int x, int y, int c) +{ + m_adam7_image_buf[x + y * m_dst_bytes_per_line] = (uint8_t)c; +} + +inline void png_decoder::adam7_write_pixel_16(int x, int y, int r, int g) +{ + uint32_t ofs = x * 2 + y * m_dst_bytes_per_line; + m_adam7_image_buf[ofs + 0] = (uint8_t)r; + m_adam7_image_buf[ofs + 1] = (uint8_t)g; +} + +inline void png_decoder::adam7_write_pixel_24(int x, int y, int r, int g, int b) +{ + uint32_t ofs = x * 3 + y * m_dst_bytes_per_line; + m_adam7_image_buf[ofs + 0] = (uint8_t)r; + m_adam7_image_buf[ofs + 1] = (uint8_t)g; + m_adam7_image_buf[ofs + 2] = (uint8_t)b; +} + +inline void png_decoder::adam7_write_pixel_32(int x, int y, int r, int g, int b, int a) +{ + uint32_t ofs = x * 4 + y * m_dst_bytes_per_line; + m_adam7_image_buf[ofs + 0] = (uint8_t)r; + m_adam7_image_buf[ofs + 1] = (uint8_t)g; + m_adam7_image_buf[ofs + 2] = (uint8_t)b; + m_adam7_image_buf[ofs + 3] = (uint8_t)a; +} + +static void PixelDePack2(void* src, void* dst, int numbytes) +{ + uint8_t* src8 = (uint8_t*)src; + uint8_t* dst8 = (uint8_t*)dst; + + while (numbytes) + { + uint8_t v = *src8++; + + for (uint32_t i = 0; i < 8; i++) + dst8[7 - i] = (v >> i) & 1; + + dst8 += 8; + numbytes--; + } +} + +static void PixelDePack16(void* src, void* dst, int numbytes) +{ + uint8_t* src8 = (uint8_t*)src; + uint8_t* dst8 = (uint8_t*)dst; + + while (numbytes) + { + uint8_t v = *src8++; + + dst8[0] = (uint8_t)v >> 4; + dst8[1] = (uint8_t)v & 0xF; + dst8 += 2; + + numbytes--; + } +} + +static int unpack_grey_1(uint8_t* src, uint8_t* dst, int pixels, png_decoder *pwi) +{ + (void)pwi; + PixelDePack2(src, dst, pixels >> 3); + + dst += (pixels & 0xFFF8); + + if ((pixels & 7) != 0) + { + uint8_t c = src[pixels >> 3]; + + pixels &= 7; + + while (pixels--) + { + *dst++ = ((c & 128) >> 7); + + c <<= 1; + } + } + + return TRUE; +} + +static int unpack_grey_2(uint8_t* src, uint8_t* dst, int pixels, png_decoder* pwi) +{ + (void)pwi; + int i = pixels; + uint8_t c; + + while (i >= 4) + { + c = *src++; + + *dst++ = (c >> 6); + *dst++ = (c >> 4) & 3; + *dst++ = (c >> 2) & 3; + *dst++ = (c) & 3; + + i -= 4; + } + + if (i) + { + c = *src; + + while (i--) + { + *dst++ = (c >> 6); + + c <<= 2; + } + } + + return TRUE; +} + +static int unpack_grey_4(uint8_t* src, uint8_t* dst, int pixels, png_decoder* pwi) +{ + (void)pwi; + + PixelDePack16(src, dst, pixels >> 1); + + if (pixels & 1) + dst[pixels & 0xFFFE] = (src[pixels >> 1] >> 4); + + return TRUE; +} + +static int unpack_grey_8(uint8_t* src, uint8_t* dst, int pixels, png_decoder* pwi) +{ + (void)src; + (void)dst; + (void)pixels; + (void)pwi; + return FALSE; +} + +static int unpack_grey_16(uint8_t* src, uint8_t* dst, int pixels, png_decoder* pwi) +{ + (void)pwi; + while (pixels--) + { + *dst++ = *src++; + + src++; + } + + return TRUE; +} + +static int unpack_grey_16_2(uint8_t* src, uint8_t* dst, int pixels, png_decoder* pwi) +{ + if (pwi->m_trns_flag) + { + while (pixels--) + { + uint32_t v = (src[0] << 8) + src[1]; + src += 2; + + *dst++ = (uint8_t)(v >> 8); + *dst++ = (v == pwi->m_trns_value[0]) ? 0 : 255; + } + } + else + { + while (pixels--) + { + *dst++ = *src++; + *dst++ = 0xFF; + + src++; + } + } + + return TRUE; +} + +static int unpack_true_8(uint8_t* src, uint8_t* dst, int pixels, png_decoder* pwi) +{ + if (pwi->m_trns_flag) + { + const uint32_t tr = pwi->m_trns_value[0]; + const uint32_t tg = pwi->m_trns_value[1]; + const uint32_t tb = pwi->m_trns_value[2]; + + for (int i = 0; i < pixels; i++) + { + uint8_t r = src[i * 3 + 0]; + uint8_t g = src[i * 3 + 1]; + uint8_t b = src[i * 3 + 2]; + + dst[i * 4 + 0] = r; + dst[i * 4 + 1] = g; + dst[i * 4 + 2] = b; + dst[i * 4 + 3] = ((r == tr) && (g == tg) && (b == tb)) ? 0 : 255; + } + } + else + { + for (int i = 0; i < pixels; i++) + { + dst[i * 4 + 0] = src[i * 3 + 0]; + dst[i * 4 + 1] = src[i * 3 + 1]; + dst[i * 4 + 2] = src[i * 3 + 2]; + dst[i * 4 + 3] = 255; + } + } + + return TRUE; +} + +static int unpack_true_16(uint8_t* src, uint8_t* dst, int pixels, png_decoder* pwi) +{ + if (pwi->m_trns_flag) + { + const uint32_t tr = pwi->m_trns_value[0]; + const uint32_t tg = pwi->m_trns_value[1]; + const uint32_t tb = pwi->m_trns_value[2]; + + for (int i = 0; i < pixels; i++) + { + uint32_t r = (src[i * 6 + 0] << 8) + src[i * 6 + 1]; + uint32_t g = (src[i * 6 + 2] << 8) + src[i * 6 + 3]; + uint32_t b = (src[i * 6 + 4] << 8) + src[i * 6 + 5]; + + dst[i * 4 + 0] = (uint8_t)(r >> 8); + dst[i * 4 + 1] = (uint8_t)(g >> 8); + dst[i * 4 + 2] = (uint8_t)(b >> 8); + dst[i * 4 + 3] = ((r == tr) && (g == tg) && (b == tb)) ? 0 : 255; + } + } + else + { + while (pixels--) + { + dst[0] = src[0]; + dst[1] = src[2]; + dst[2] = src[4]; + dst[3] = 255; + + dst += 4; + src += 6; + } + } + + return TRUE; +} + +static int unpack_grey_alpha_8(uint8_t* src, uint8_t* dst, int pixels, png_decoder* pwi) +{ + (void)pwi; + while (pixels--) + { + dst[0] = src[0]; + dst[1] = src[1]; + dst += 2; + src += 2; + } + + return TRUE; +} + +static int unpack_grey_alpha_16(uint8_t* src, uint8_t* dst, int pixels, png_decoder* pwi) +{ + (void)pwi; + while (pixels--) + { + dst[0] = src[0]; + dst[1] = src[2]; + dst += 2; + src += 4; + } + + return TRUE; +} + +static int unpack_true_alpha_8(uint8_t* src, uint8_t* dst, int pixels, png_decoder* pwi) +{ + (void)src; + (void)dst; + (void)pixels; + (void)pwi; + return FALSE; +} + +static int unpack_true_alpha_16(uint8_t* src, uint8_t* dst, int pixels, png_decoder* pwi) +{ + (void)pwi; + while (pixels--) + { + dst[0] = src[0]; + dst[1] = src[2]; + dst[2] = src[4]; + dst[3] = src[6]; + dst += 4; + src += 8; + } + + return TRUE; +} + +void png_decoder::unpredict_sub(uint8_t* lst, uint8_t* cur, uint32_t bytes, int bpp) +{ + (void)lst; + if (bytes == (uint32_t)bpp) + return; + + cur += bpp; + bytes -= bpp; + + while (bytes--) + { + *cur += *(cur - bpp); + cur++; + } +} + +void png_decoder::unpredict_up(uint8_t* lst, uint8_t* cur, uint32_t bytes, int bpp) +{ + (void)bpp; + while (bytes--) + *cur++ += *lst++; +} + +void png_decoder::unpredict_average(uint8_t* lst, uint8_t* cur, uint32_t bytes, int bpp) +{ + int i; + + for (i = 0; i < bpp; i++) + *cur++ += (*lst++ >> 1); + + if (bytes == (uint32_t)bpp) + return; + + bytes -= bpp; + + while (bytes--) + { + *cur += ((*lst++ + *(cur - bpp)) >> 1); + cur++; + } +} + +inline uint8_t png_decoder::paeth_predictor(int a, int b, int c) +{ + int p, pa, pb, pc; + + /* a = left, b = above, c = upper left */ + + p = a + b - c; + + pa = abs(p - a); + pb = abs(p - b); + pc = abs(p - c); + + if ((pa <= pb) && (pa <= pc)) + return (uint8_t)a; + else if (pb <= pc) + return (uint8_t)b; + else + return (uint8_t)c; +} + +void png_decoder::unpredict_paeth(uint8_t* lst, uint8_t* cur, uint32_t bytes, int bpp) +{ + int i; + + for (i = 0; i < bpp; i++) + *cur++ += paeth_predictor(0, *lst++, 0); + + if (bytes == (uint32_t)bpp) + return; + + bytes -= bpp; + + while (bytes--) + { + int p, a, b, c, pa, pb, pc; + + a = *(cur - bpp); + b = *lst; + c = *(lst - bpp); + + p = a + b - c; + + pa = abs(p - a); + pb = abs(p - b); + pc = abs(p - c); + + if ((pa <= pb) && (pa <= pc)) + *cur++ += (uint8_t)a; + else if (pb <= pc) + *cur++ += (uint8_t)b; + else + *cur++ += (uint8_t)c; + + lst++; + } +} + +int png_decoder::adam7_pass_size(int size, int start, int step) +{ + if (size > start) + return 1 + ((size - 1) - start) / step; + else + return 0; +} + +// TRUE if no more data, negative on error, FALSE if OK +int png_decoder::decompress_line(uint32_t* bytes_decoded) +{ + int status; + uint32_t temp, src_bytes_left, dst_bytes_left; + + m_inflate_dst_buf_ofs = 0; + + for (; ; ) + { + if (m_inflate_src_buf_ofs == PNG_INFLATE_SRC_BUF_SIZE) + { + int res = unchunk_data(inflate_src_buf, PNG_INFLATE_SRC_BUF_SIZE, &temp); + if (res < 0) + return res; + m_inflate_eof_flag = res; + + m_inflate_src_buf_size = temp; + + m_inflate_src_buf_ofs = 0; + } + + for (; ; ) + { + src_bytes_left = m_inflate_src_buf_size - m_inflate_src_buf_ofs; + dst_bytes_left = m_dec_bytes_per_line - m_inflate_dst_buf_ofs; + + m_inflator.next_in = inflate_src_buf + m_inflate_src_buf_ofs; + m_inflator.avail_in = src_bytes_left; + + m_inflator.next_out = m_pCur_line_buf + m_inflate_dst_buf_ofs; + m_inflator.avail_out = dst_bytes_left; + + status = buminiz::mz_inflate2(&m_inflator, buminiz::MZ_NO_FLUSH, PVPNG_ADLER32_CHECKING); + + const uint32_t src_bytes_consumed = src_bytes_left - m_inflator.avail_in; + const uint32_t dst_bytes_written = dst_bytes_left - m_inflator.avail_out; + + m_inflate_src_buf_ofs += src_bytes_consumed; + m_inflate_dst_buf_ofs += dst_bytes_written; + + if (status != buminiz::MZ_OK) + { + if (status != buminiz::MZ_STREAM_END) + return terminate(PNG_INVALID_DATA_STREAM); + + if (bytes_decoded) + *bytes_decoded = m_inflate_dst_buf_ofs; + + return TRUE; + } + + if (m_inflate_dst_buf_ofs == m_dec_bytes_per_line) + { + if (bytes_decoded) + *bytes_decoded = m_inflate_dst_buf_ofs; + + return FALSE; + } + + if ((m_inflate_src_buf_ofs == m_inflate_src_buf_size) && + (m_inflate_eof_flag == FALSE)) + break; + } + } +} + +int png_decoder::find_iend_chunk() +{ + uint32_t dummy; + + while (!m_end_of_idat_chunks) + { + int res = unchunk_data(m_temp_buf, TEMP_BUF_SIZE * 4, &dummy); + if (res < 0) + return res; + } + + for (; ; ) + { + if ((m_chunk_name[0] == 'I') && + (m_chunk_name[1] == 'E') && + (m_chunk_name[2] == 'N') && + (m_chunk_name[3] == 'D')) + break; + + int res = fetch_next_chunk_init(); + if (res < 0) + return res; + } + + return 0; +} + +int png_decoder::png_decode(void** ppImg_ptr, uint32_t* pImg_len) +{ + int status; + uint8_t* decoded_line; + uint32_t bytes_decoded; + + if (m_adam7_decoded_flag) + { + if (m_pass_y_left == 0) + return PNG_ALLDONE; + + *ppImg_ptr = &m_adam7_image_buf[(m_ihdr.m_height - m_pass_y_left) * m_dst_bytes_per_line]; + *pImg_len = m_dst_bytes_per_line; + + m_pass_y_left--; + + return 0; + } + + if (m_pass_y_left == 0) + { + if (m_ihdr.m_ilace_type == 0) + { + status = find_iend_chunk(); + if (status < 0) + return status; + + return PNG_ALLDONE; + } + + for (; ; ) + { + if (++m_adam7_pass_num == 7) + { + status = find_iend_chunk(); + if (status < 0) + return status; + + return PNG_ALLDONE; + } + + if (((m_pass_y_left = m_adam7_pass_size_y[m_adam7_pass_num]) != 0) && + ((m_pass_x_size = m_adam7_pass_size_x[m_adam7_pass_num]) != 0)) + break; + } + + switch (m_adam7_pass_num) + { + case 0: + case 1: + case 3: + case 5: + m_adam7_pass_y = 0; + break; + case 2: + m_adam7_pass_y = 4; + break; + case 4: + m_adam7_pass_y = 2; + break; + case 6: + m_adam7_pass_y = 1; + break; + } + + switch (m_ihdr.m_color_type) + { + case PNG_COLOR_TYPE_GREYSCALE: + case PNG_COLOR_TYPE_PALETTIZED: + { + m_src_bytes_per_line = (((uint32_t)m_pass_x_size * m_ihdr.m_bit_depth) + 7) / 8; + break; + } + case PNG_COLOR_TYPE_TRUECOLOR: + { + m_src_bytes_per_line = ((uint32_t)m_pass_x_size * m_dec_bytes_per_pixel); + break; + } + case PNG_COLOR_TYPE_GREYSCALE_ALPHA: + { + m_src_bytes_per_line = ((uint32_t)m_pass_x_size * m_dec_bytes_per_pixel); + break; + } + case PNG_COLOR_TYPE_TRUECOLOR_ALPHA: + { + m_src_bytes_per_line = ((uint32_t)m_pass_x_size * m_dec_bytes_per_pixel); + break; + } + } + + m_dec_bytes_per_line = m_src_bytes_per_line + 1; + + memset(m_pPre_line_buf, 0, m_src_bytes_per_line); + } + + int res = decompress_line(&bytes_decoded); + if (res < 0) + return terminate(res); + + if (res) + { + if (m_ihdr.m_ilace_type == 0) + { + if (m_pass_y_left != 1) + return terminate(PNG_INCOMPLETE_IMAGE); + } + else + { + if ((m_pass_y_left != 1) && (m_adam7_pass_num != 6)) + return terminate(PNG_INCOMPLETE_IMAGE); + } + } + + if (bytes_decoded != m_dec_bytes_per_line) + return terminate(PNG_INCOMPLETE_IMAGE); + + decoded_line = &m_pCur_line_buf[1]; + + switch (m_pCur_line_buf[0]) + { + case 0: + break; + case 1: + { + unpredict_sub(m_pPre_line_buf, m_pCur_line_buf + 1, m_src_bytes_per_line, m_dec_bytes_per_pixel); + break; + } + case 2: + { + unpredict_up(m_pPre_line_buf, m_pCur_line_buf + 1, m_src_bytes_per_line, m_dec_bytes_per_pixel); + break; + } + case 3: + { + unpredict_average(m_pPre_line_buf, m_pCur_line_buf + 1, m_src_bytes_per_line, m_dec_bytes_per_pixel); + break; + } + case 4: + { + unpredict_paeth(m_pPre_line_buf, m_pCur_line_buf + 1, m_src_bytes_per_line, m_dec_bytes_per_pixel); + break; + } + default: + return terminate(PNG_UNS_PREDICTOR); + } + + memmove(m_pPre_line_buf, m_pCur_line_buf + 1, m_src_bytes_per_line); + + if (m_pProcess_func) + { + if ((*m_pProcess_func)(m_pCur_line_buf + 1, m_pPro_line_buf, m_pass_x_size, this)) + decoded_line = m_pPro_line_buf; + } + + if (m_ihdr.m_ilace_type == 0) + { + *ppImg_ptr = decoded_line; + *pImg_len = m_dst_bytes_per_line; + + if (--m_pass_y_left == 0) + { + res = decompress_line(&bytes_decoded); + if (res < 0) + return terminate(res); + + if (res == FALSE) + return terminate(PNG_TOO_MUCH_DATA); + + if (bytes_decoded) + return terminate(PNG_TOO_MUCH_DATA); + } + } + else + { + int i, x_ofs = 0, y_ofs = 0, x_stp = 0; + uint8_t* p = decoded_line; + + switch (m_adam7_pass_num) + { + case 0: { x_ofs = 0; x_stp = 8; break; } + case 1: { x_ofs = 4; x_stp = 8; break; } + case 2: { x_ofs = 0; x_stp = 4; break; } + case 3: { x_ofs = 2; x_stp = 4; break; } + case 4: { x_ofs = 0; x_stp = 2; break; } + case 5: { x_ofs = 1; x_stp = 2; break; } + case 6: { x_ofs = 0; x_stp = 1; break; } + } + + y_ofs = m_adam7_pass_y; + + assert(x_ofs < (int)m_ihdr.m_width); + assert(y_ofs < (int)m_ihdr.m_height); + + if (m_dst_bytes_per_pixel == 1) + { + for (i = m_pass_x_size; i > 0; i--, x_ofs += x_stp) + adam7_write_pixel_8(x_ofs, y_ofs, *p++); + } + else if (m_dst_bytes_per_pixel == 2) + { + for (i = m_pass_x_size; i > 0; i--, x_ofs += x_stp, p += 2) + adam7_write_pixel_16(x_ofs, y_ofs, p[0], p[1]); + } + else if (m_dst_bytes_per_pixel == 3) + { + for (i = m_pass_x_size; i > 0; i--, x_ofs += x_stp, p += 3) + adam7_write_pixel_24(x_ofs, y_ofs, p[0], p[1], p[2]); + } + else if (m_dst_bytes_per_pixel == 4) + { + for (i = m_pass_x_size; i > 0; i--, x_ofs += x_stp, p += 4) + adam7_write_pixel_32(x_ofs, y_ofs, p[0], p[1], p[2], p[3]); + } + else + { + assert(0); + } + + switch (m_adam7_pass_num) + { + case 0: + case 1: + case 2: { m_adam7_pass_y += 8; break; } + case 3: + case 4: { m_adam7_pass_y += 4; break; } + case 5: + case 6: { m_adam7_pass_y += 2; break; } + } + + if ((--m_pass_y_left == 0) && (m_adam7_pass_num == 6)) + { + res = decompress_line(&bytes_decoded); + if (res < 0) + return terminate(res); + + if (res == FALSE) + return terminate(PNG_TOO_MUCH_DATA); + + if (bytes_decoded) + return terminate(PNG_TOO_MUCH_DATA); + } + } + + return 0; +} + +void png_decoder::png_decode_end() +{ + uninitialize(); +} + +int png_decoder::png_decode_start() +{ + int status; + + if (m_img_supported_flag != TRUE) + return terminate(m_img_supported_flag); + + switch (m_ihdr.m_color_type) + { + case PNG_COLOR_TYPE_GREYSCALE: + { + if (m_ihdr.m_bit_depth == 16) + { + // This is a special case. We can't pass back 8-bit samples and let the caller decide on transparency because the PNG is 16-bits. + // So we expand to 8-bit Gray-Alpha and handle transparency during decoding. + // We don't do this with all grayscale cases because that would require more code to deal with 1/2/4bpp expansion. + m_dec_bytes_per_pixel = (m_ihdr.m_bit_depth + 7) / 8; + m_dst_bytes_per_pixel = 2; + + m_src_bytes_per_line = (((uint32_t)m_ihdr.m_width * m_ihdr.m_bit_depth) + 7) / 8; + m_dst_bytes_per_line = 2 * m_ihdr.m_width; + + m_pProcess_func = unpack_grey_16_2; + } + else + { + m_dec_bytes_per_pixel = (m_ihdr.m_bit_depth + 7) / 8; + m_dst_bytes_per_pixel = 1; + + m_src_bytes_per_line = (((uint32_t)m_ihdr.m_width * m_ihdr.m_bit_depth) + 7) / 8; + m_dst_bytes_per_line = m_ihdr.m_width; + + if (m_ihdr.m_bit_depth == 1) + m_pProcess_func = unpack_grey_1; + else if (m_ihdr.m_bit_depth == 2) + m_pProcess_func = unpack_grey_2; + else if (m_ihdr.m_bit_depth == 4) + m_pProcess_func = unpack_grey_4; + else + m_pProcess_func = unpack_grey_8; + } + + break; + } + case PNG_COLOR_TYPE_PALETTIZED: + { + m_dec_bytes_per_pixel = (m_ihdr.m_bit_depth + 7) / 8; + m_dst_bytes_per_pixel = 1; + + m_src_bytes_per_line = (((uint32_t)m_ihdr.m_width * m_ihdr.m_bit_depth) + 7) / 8; + m_dst_bytes_per_line = m_ihdr.m_width; + + if (m_ihdr.m_bit_depth == 1) + m_pProcess_func = unpack_grey_1; + else if (m_ihdr.m_bit_depth == 2) + m_pProcess_func = unpack_grey_2; + else if (m_ihdr.m_bit_depth == 4) + m_pProcess_func = unpack_grey_4; + else if (m_ihdr.m_bit_depth == 8) + m_pProcess_func = unpack_grey_8; + else if (m_ihdr.m_bit_depth == 16) + m_pProcess_func = unpack_grey_16; + + break; + } + case PNG_COLOR_TYPE_TRUECOLOR: + { + // We always pass back alpha with transparency handling. + m_dec_bytes_per_pixel = 3 * (m_ihdr.m_bit_depth / 8); + m_dst_bytes_per_pixel = 4; + + m_src_bytes_per_line = ((uint32_t)m_ihdr.m_width * m_dec_bytes_per_pixel); + m_dst_bytes_per_line = 4 * m_ihdr.m_width; + + if (m_ihdr.m_bit_depth == 8) + m_pProcess_func = unpack_true_8; + else if (m_ihdr.m_bit_depth == 16) + m_pProcess_func = unpack_true_16; + + break; + } + case PNG_COLOR_TYPE_GREYSCALE_ALPHA: + { + m_dec_bytes_per_pixel = 2 * (m_ihdr.m_bit_depth / 8); + m_dst_bytes_per_pixel = 2; + + m_src_bytes_per_line = ((uint32_t)m_ihdr.m_width * m_dec_bytes_per_pixel); + m_dst_bytes_per_line = m_ihdr.m_width * 2; + + if (m_ihdr.m_bit_depth == 8) + m_pProcess_func = unpack_grey_alpha_8; + else if (m_ihdr.m_bit_depth == 16) + m_pProcess_func = unpack_grey_alpha_16; + + break; + } + case PNG_COLOR_TYPE_TRUECOLOR_ALPHA: + { + m_dec_bytes_per_pixel = 4 * (m_ihdr.m_bit_depth / 8); + m_dst_bytes_per_pixel = 4; + + m_src_bytes_per_line = ((uint32_t)m_ihdr.m_width * m_dec_bytes_per_pixel); + m_dst_bytes_per_line = 4 * m_ihdr.m_width; + + if (m_ihdr.m_bit_depth == 8) + m_pProcess_func = unpack_true_alpha_8; + else + m_pProcess_func = unpack_true_alpha_16; + + break; + } + } + + m_dec_bytes_per_line = m_src_bytes_per_line + 1; + + m_pPre_line_buf = (uint8_t*)png_calloc(m_src_bytes_per_line); + m_pCur_line_buf = (uint8_t*)png_calloc(m_dec_bytes_per_line); + m_pPro_line_buf = (uint8_t*)png_calloc(m_dst_bytes_per_line); + + if (!m_pPre_line_buf || !m_pCur_line_buf || !m_pPro_line_buf) + return terminate(PNG_NOTENOUGHMEM); + + m_inflate_src_buf_ofs = PNG_INFLATE_SRC_BUF_SIZE; + + int res = mz_inflateInit(&m_inflator); + if (res != 0) + return terminate(PNG_DECERROR); + + if (m_ihdr.m_ilace_type == 1) + { + int i; + uint32_t total_lines, lines_processed; + + m_adam7_pass_size_x[0] = adam7_pass_size(m_ihdr.m_width, 0, 8); + m_adam7_pass_size_x[1] = adam7_pass_size(m_ihdr.m_width, 4, 8); + m_adam7_pass_size_x[2] = adam7_pass_size(m_ihdr.m_width, 0, 4); + m_adam7_pass_size_x[3] = adam7_pass_size(m_ihdr.m_width, 2, 4); + m_adam7_pass_size_x[4] = adam7_pass_size(m_ihdr.m_width, 0, 2); + m_adam7_pass_size_x[5] = adam7_pass_size(m_ihdr.m_width, 1, 2); + m_adam7_pass_size_x[6] = adam7_pass_size(m_ihdr.m_width, 0, 1); + + m_adam7_pass_size_y[0] = adam7_pass_size(m_ihdr.m_height, 0, 8); + m_adam7_pass_size_y[1] = adam7_pass_size(m_ihdr.m_height, 0, 8); + m_adam7_pass_size_y[2] = adam7_pass_size(m_ihdr.m_height, 4, 8); + m_adam7_pass_size_y[3] = adam7_pass_size(m_ihdr.m_height, 0, 4); + m_adam7_pass_size_y[4] = adam7_pass_size(m_ihdr.m_height, 2, 4); + m_adam7_pass_size_y[5] = adam7_pass_size(m_ihdr.m_height, 0, 2); + m_adam7_pass_size_y[6] = adam7_pass_size(m_ihdr.m_height, 1, 2); + + m_adam7_image_buf.resize(m_dst_bytes_per_line * m_ihdr.m_height); + + m_adam7_pass_num = -1; + + m_pass_y_left = 0; + + total_lines = lines_processed = 0; + + for (i = 0; i < 7; i++) + total_lines += m_adam7_pass_size_y[i]; + + for (; ; ) + { + void* dummy_ptr = nullptr; + uint32_t dummy_len = 0; + + status = png_decode(&dummy_ptr, &dummy_len); + + if (status) + { + if (status == PNG_ALLDONE) + break; + else + { + uninitialize(); + + return status; + } + } + + lines_processed++; + } + + m_adam7_decoded_flag = TRUE; + m_pass_y_left = m_ihdr.m_height; + } + else + { + m_pass_x_size = m_ihdr.m_width; + m_pass_y_left = m_ihdr.m_height; + } + + return 0; +} + +void png_decoder::calc_gamma_table() +{ + if (m_gama_value == 45000) + { + for (int i = 0; i < 256; i++) + m_gamma_table[i] = (uint8_t)i; + return; + } + + float gamma = (float)(m_gama_value) / 100000.0f; + + gamma = 1.0f / (gamma * 2.2f); + + for (int i = 0; i < 256; i++) + { + float temp = powf((float)(i) / 255.0f, gamma) * 255.0f; + + int j = (int)(temp + .5f); + + if (j < 0) + j = 0; + else if (j > 255) + j = 255; + + m_gamma_table[i] = (uint8_t)j; + } +} + +void png_decoder::create_grey_palette() +{ + int i, j; + uint8_t* p = m_img_pal; + + const int img_colors = minimum(256, 1 << m_ihdr.m_bit_depth); + for (i = 0; i < img_colors; i++) + { + j = ((uint32_t)255 * (uint32_t)i) / (img_colors - 1); + + *p++ = (uint8_t)j; + *p++ = (uint8_t)j; + *p++ = (uint8_t)j; + } +} + +int png_decoder::read_signature() +{ + if (m_pFile->read(m_temp_buf, 8) != 8) + return terminate(PNG_UNKNOWNTYPE); + + if ((m_temp_buf[0] != 137) || + (m_temp_buf[1] != 80) || + (m_temp_buf[2] != 78) || + (m_temp_buf[3] != 71) || + (m_temp_buf[4] != 13) || + (m_temp_buf[5] != 10) || + (m_temp_buf[6] != 26) || + (m_temp_buf[7] != 10)) + { + return terminate(PNG_UNKNOWNTYPE); + } + + return 0; +} + +int png_decoder::read_ihdr_chunk() +{ + int res = fetch_next_chunk_init(); + if (res < 0) + return res; + + if ((m_chunk_name[0] != 'I') || (m_chunk_name[1] != 'H') || (m_chunk_name[2] != 'D') || (m_chunk_name[3] != 'R') || (m_chunk_size != 13)) + return terminate(PNG_NO_IHDR); + + int64_t v64 = fetch_next_chunk_dword(); + if (v64 < 0) + return (int)v64; + m_ihdr.m_width = (uint32_t)v64; + + v64 = fetch_next_chunk_dword(); + if (v64 < 0) + return (int)v64; + m_ihdr.m_height = (uint32_t)v64; + + if ((m_ihdr.m_width == 0) || (m_ihdr.m_width > MAX_SUPPORTED_RES)) + return terminate(PNG_BAD_WIDTH); + + if ((m_ihdr.m_height == 0) || (m_ihdr.m_height > MAX_SUPPORTED_RES)) + return terminate(PNG_BAD_HEIGHT); + + int v = fetch_next_chunk_byte(); + if (v < 0) + return v; + m_ihdr.m_bit_depth = (uint8_t)v; + + v = fetch_next_chunk_byte(); + if (v < 0) + return v; + m_ihdr.m_color_type = (uint8_t)v; + + v = fetch_next_chunk_byte(); + if (v < 0) + return v; + m_ihdr.m_comp_type = (uint8_t)v; + + v = fetch_next_chunk_byte(); + if (v < 0) + return v; + m_ihdr.m_filter_type = (uint8_t)v; + + v = fetch_next_chunk_byte(); + if (v < 0) + return v; + m_ihdr.m_ilace_type = (uint8_t)v; + + if (m_ihdr.m_comp_type != 0) + m_img_supported_flag = PNG_UNS_COMPRESSION; + + if (m_ihdr.m_filter_type != 0) + m_img_supported_flag = PNG_UNS_FILTER; + + if (m_ihdr.m_ilace_type > 1) + m_img_supported_flag = PNG_UNS_ILACE; + + switch (m_ihdr.m_color_type) + { + case PNG_COLOR_TYPE_GREYSCALE: + { + switch (m_ihdr.m_bit_depth) + { + case 1: + case 2: + case 4: + case 8: + case 16: + { + break; + } + default: + return terminate(PNG_BAD_BIT_DEPTH); + } + + break; + } + case PNG_COLOR_TYPE_PALETTIZED: + { + switch (m_ihdr.m_bit_depth) + { + case 1: + case 2: + case 4: + case 8: + { + break; + } + default: + return terminate(PNG_BAD_BIT_DEPTH); + } + + break; + } + case PNG_COLOR_TYPE_TRUECOLOR: + case PNG_COLOR_TYPE_GREYSCALE_ALPHA: + case PNG_COLOR_TYPE_TRUECOLOR_ALPHA: + { + switch (m_ihdr.m_bit_depth) + { + case 8: + case 16: + { + break; + } + default: + return terminate(PNG_BAD_BIT_DEPTH); + } + + break; + } + default: + return terminate(PNG_UNS_COLOR_TYPE); + } + + return 0; +} + +int png_decoder::read_bkgd_chunk() +{ + m_bkgd_flag = TRUE; + + if (m_ihdr.m_color_type == PNG_COLOR_TYPE_PALETTIZED) + { + int v = fetch_next_chunk_byte(); + if (v < 0) + return v; + m_bkgd_value[0] = v; + } + else if ((m_ihdr.m_color_type == PNG_COLOR_TYPE_GREYSCALE) || (m_ihdr.m_color_type == PNG_COLOR_TYPE_GREYSCALE_ALPHA)) + { + int v = fetch_next_chunk_word(); + if (v < 0) + return v; + m_bkgd_value[0] = v; + } + else if ((m_ihdr.m_color_type == PNG_COLOR_TYPE_TRUECOLOR) || (m_ihdr.m_color_type == PNG_COLOR_TYPE_TRUECOLOR_ALPHA)) + { + int v = fetch_next_chunk_word(); + if (v < 0) + return v; + m_bkgd_value[0] = v; + + v = fetch_next_chunk_word(); + if (v < 0) + return v; + m_bkgd_value[1] = v; + + v = fetch_next_chunk_word(); + if (v < 0) + return v; + m_bkgd_value[2] = v; + } + + return 0; +} + +int png_decoder::read_gama_chunk() +{ + m_gama_flag = TRUE; + + int64_t v = fetch_next_chunk_dword(); + if (v < 0) + return (int)v; + + m_gama_value = (uint32_t)v; + + return 0; +} + +int png_decoder::read_trns_chunk() +{ + int i; + + m_trns_flag = TRUE; + + if (m_ihdr.m_color_type == PNG_COLOR_TYPE_PALETTIZED) + { + for (i = 0; i < 256; i++) + m_trns_value[i] = 255; + + const uint32_t img_colors = 1 << m_ihdr.m_bit_depth; + if (m_chunk_size > (uint32_t)img_colors) + return terminate(PNG_BAD_TRNS_CHUNK); + + for (i = 0; i < (int)m_chunk_size; i++) + { + int v = fetch_next_chunk_byte(); + if (v < 0) + return v; + m_trns_value[i] = v; + } + } + else if (m_ihdr.m_color_type == PNG_COLOR_TYPE_GREYSCALE) + { + int v = fetch_next_chunk_word(); + if (v < 0) + return v; + m_trns_value[0] = v; + } + else if (m_ihdr.m_color_type == PNG_COLOR_TYPE_TRUECOLOR) + { + int v = fetch_next_chunk_word(); + if (v < 0) + return v; + m_trns_value[0] = v; + + v = fetch_next_chunk_word(); + if (v < 0) + return v; + m_trns_value[1] = v; + + v = fetch_next_chunk_word(); + if (v < 0) + return v; + m_trns_value[2] = v; + } + else + { + return terminate(PNG_BAD_TRNS_CHUNK); + } + return 0; +} + +int png_decoder::read_plte_chunk() +{ + int i, j; + uint8_t* p; + + if (m_plte_flag) + return terminate(PNG_BAD_PLTE_CHUNK); + + m_plte_flag = TRUE; + + memset(m_img_pal, 0, 768); + + if (m_chunk_size % 3) + return terminate(PNG_BAD_PLTE_CHUNK); + + j = m_chunk_size / 3; + + const int img_colors = minimum(256, 1 << m_ihdr.m_bit_depth); + if (j > img_colors) + return terminate(PNG_BAD_PLTE_CHUNK); + + if ((m_ihdr.m_color_type == PNG_COLOR_TYPE_GREYSCALE) || + (m_ihdr.m_color_type == PNG_COLOR_TYPE_GREYSCALE_ALPHA)) + return terminate(PNG_BAD_PLTE_CHUNK); + + p = m_img_pal; + + for (i = 0; i < j; i++) + { + int v = fetch_next_chunk_byte(); + if (v < 0) + return v; + *p++ = (uint8_t)v; + + v = fetch_next_chunk_byte(); + if (v < 0) + return v; + *p++ = (uint8_t)v; + + v = fetch_next_chunk_byte(); + if (v < 0) + return v; + *p++ = (uint8_t)v; + } + + return 0; +} + +int png_decoder::find_idat_chunk() +{ + for (; ; ) + { + int res = fetch_next_chunk_init(); + if (res < 0) + return res; + + if (m_chunk_name[0] & 32) /* ancillary? */ + { + if ((m_chunk_name[0] == 'b') && (m_chunk_name[1] == 'K') && (m_chunk_name[2] == 'G') && (m_chunk_name[3] == 'D')) + { + res = read_bkgd_chunk(); + if (res < 0) + return res; + } + else if ((m_chunk_name[0] == 'g') && (m_chunk_name[1] == 'A') && (m_chunk_name[2] == 'M') && (m_chunk_name[3] == 'A')) + { + res = read_gama_chunk(); + if (res < 0) + return res; + } + else if ((m_chunk_name[0] == 't') && (m_chunk_name[1] == 'R') && (m_chunk_name[2] == 'N') && (m_chunk_name[3] == 'S')) + { + res = read_trns_chunk(); + if (res < 0) + return res; + } + } + else + { + if ((m_chunk_name[0] == 'P') && (m_chunk_name[1] == 'L') && (m_chunk_name[2] == 'T') && (m_chunk_name[3] == 'E')) + { + res = read_plte_chunk(); + if (res < 0) + return res; + } + else if ((m_chunk_name[0] == 'I') && (m_chunk_name[1] == 'D') && (m_chunk_name[2] == 'A') && (m_chunk_name[3] == 'T')) + { + break; + } + else + { + m_img_supported_flag = PNG_UNS_CRITICAL_CHUNK; + } + } + } + + return 0; +} + +png_decoder::png_decoder() +{ + clear(); +} + +png_decoder::~png_decoder() +{ + uninitialize(); +} + +void png_decoder::clear() +{ + clear_obj(m_pMalloc_blocks); + + m_pFile = nullptr; + + clear_obj(m_img_pal); + + m_img_supported_flag = FALSE; + + m_adam7_image_buf.clear(); + + clear_obj(m_ihdr); + + m_chunk_flag = FALSE; + m_chunk_size = 0; + m_chunk_left = 0; + m_chunk_crc32 = 0; + clear_obj(m_chunk_name); + + m_end_of_idat_chunks = 0; + + m_dec_bytes_per_pixel = 0; + m_dst_bytes_per_pixel = 0; + + m_dec_bytes_per_line = 0; + m_src_bytes_per_line = 0; + m_dst_bytes_per_line = 0; + + m_pProcess_func = nullptr; + + m_pPre_line_buf = nullptr; + m_pCur_line_buf = nullptr; + m_pPro_line_buf = nullptr; + + m_bkgd_flag = FALSE; + clear_obj(m_bkgd_value); + + m_gama_flag = FALSE; + m_gama_value = 0; + + m_plte_flag = FALSE; + + m_trns_flag = FALSE; + clear_obj(m_trns_value); + + clear_obj(m_inflator); + + m_inflate_src_buf_ofs = 0; + m_inflate_src_buf_size = 0; + m_inflate_dst_buf_ofs = 0; + + m_inflate_eof_flag = FALSE; + + clear_obj(m_trns_value); + + m_pass_x_size = 0; + m_pass_y_left = 0; + + m_adam7_pass_num = 0; + m_adam7_pass_y = 0; + clear_obj(m_adam7_pass_size_x); + clear_obj(m_adam7_pass_size_y); + + m_adam7_decoded_flag = FALSE; + + m_scanned_flag = false; + + m_terminate_status = 0; +} + +int png_decoder::png_scan(png_file *pFile) +{ + m_pFile = pFile; + + m_img_supported_flag = TRUE; + m_terminate_status = 0; + + int res = read_signature(); + if (res != 0) + return res; + + res = read_ihdr_chunk(); + if (res != 0) + return res; + + res = find_idat_chunk(); + if (res != 0) + return res; + + if (m_gama_flag) + calc_gamma_table(); + + if (m_ihdr.m_color_type == PNG_COLOR_TYPE_PALETTIZED) + { + if (!m_plte_flag) + return terminate(PNG_MISSING_PALETTE); + } + else if ((m_ihdr.m_color_type == PNG_COLOR_TYPE_GREYSCALE) || (m_ihdr.m_color_type == PNG_COLOR_TYPE_GREYSCALE_ALPHA)) + { + create_grey_palette(); + } + + m_scanned_flag = true; + + return 0; +} + +static inline uint8_t get_709_luma(uint32_t r, uint32_t g, uint32_t b) +{ + return (uint8_t)((13938U * r + 46869U * g + 4729U * b + 32768U) >> 16U); +} + +bool get_png_info(const void* pImage_buf, size_t buf_size, png_info &info) +{ + memset(&info, 0, sizeof(info)); + + if ((!pImage_buf) || (buf_size < MIN_PNG_SIZE)) + return false; + + png_readonly_memory_file mf; + mf.init(pImage_buf, buf_size); + + png_decoder dec; + + int status = dec.png_scan(&mf); + if ((status != 0) || (dec.m_img_supported_flag != TRUE)) + return false; + + info.m_width = dec.m_ihdr.m_width; + info.m_height = dec.m_ihdr.m_height; + info.m_bit_depth = dec.m_ihdr.m_bit_depth; + info.m_color_type = dec.m_ihdr.m_color_type; + info.m_has_gamma = dec.m_gama_flag != 0; + info.m_gamma_value = dec.m_gama_value; + info.m_has_trns = dec.m_trns_flag != 0; + + switch (dec.m_ihdr.m_color_type) + { + case PNG_COLOR_TYPE_GREYSCALE: + info.m_num_chans = dec.m_trns_flag ? 2 : 1; + break; + case PNG_COLOR_TYPE_GREYSCALE_ALPHA: + info.m_num_chans = 2; + break; + case PNG_COLOR_TYPE_PALETTIZED: + case PNG_COLOR_TYPE_TRUECOLOR: + info.m_num_chans = dec.m_trns_flag ? 4 : 3; + break; + case PNG_COLOR_TYPE_TRUECOLOR_ALPHA: + info.m_num_chans = 4; + break; + default: + assert(0); + break; + } + + return true; +} + +void* load_png(const void* pImage_buf, size_t buf_size, uint32_t desired_chans, uint32_t& width, uint32_t& height, uint32_t& num_chans) +{ + width = 0; + height = 0; + num_chans = 0; + + if ((!pImage_buf) || (buf_size < MIN_PNG_SIZE)) + { + assert(0); + return nullptr; + } + + if (desired_chans > 4) + { + assert(0); + return nullptr; + } + + png_readonly_memory_file mf; + mf.init(pImage_buf, buf_size); + + png_decoder dec; + + int status = dec.png_scan(&mf); + if ((status != 0) || (dec.m_img_supported_flag != TRUE)) + return nullptr; + + uint32_t colortype = dec.m_ihdr.m_color_type; + switch (colortype) + { + case PNG_COLOR_TYPE_GREYSCALE: + num_chans = dec.m_trns_flag ? 2 : 1; + break; + case PNG_COLOR_TYPE_GREYSCALE_ALPHA: + num_chans = 2; + break; + case PNG_COLOR_TYPE_PALETTIZED: + case PNG_COLOR_TYPE_TRUECOLOR: + num_chans = dec.m_trns_flag ? 4 : 3; + break; + case PNG_COLOR_TYPE_TRUECOLOR_ALPHA: + num_chans = 4; + break; + default: + assert(0); + break; + } + + if (!desired_chans) + desired_chans = num_chans; + +#if 0 + printf("lode_png: %ux%u bitdepth: %u colortype: %u trns: %u ilace: %u\n", + dec.m_ihdr.m_width, + dec.m_ihdr.m_height, + dec.m_ihdr.m_bit_depth, + dec.m_ihdr.m_color_type, + dec.m_trns_flag, + dec.m_ihdr.m_ilace_type); +#endif + + width = dec.m_ihdr.m_width; + height = dec.m_ihdr.m_height; + uint32_t bitdepth = dec.m_ihdr.m_bit_depth; + uint32_t pitch = width * desired_chans; + + uint64_t total_size = (uint64_t)pitch * height; + if (total_size > 0x7FFFFFFFULL) + return nullptr; + + uint8_t* pBuf = (uint8_t*)malloc((size_t)total_size); + if (!pBuf) + return nullptr; + + if (dec.png_decode_start() != 0) + { + free(pBuf); + return nullptr; + } + + uint8_t* pDst = pBuf; + + for (uint32_t y = 0; y < height; y++, pDst += pitch) + { + uint8_t* pLine; + uint32_t line_bytes; + if (dec.png_decode((void**)&pLine, &line_bytes) != 0) + { + free(pBuf); + return nullptr; + } + + // This conversion matrix handles converting RGB->Luma, converting grayscale samples to 8-bit samples, converting palettized images, and PNG transparency. + switch (colortype) + { + case PNG_COLOR_TYPE_GREYSCALE: + { + uint32_t trans_value = dec.m_trns_value[0]; + + switch (desired_chans) + { + case 1: + if (bitdepth == 16) + { + assert(line_bytes == width * 2); + + for (uint32_t i = 0; i < width; i++) + pDst[i] = dec.m_img_pal[pLine[i * 2 + 0] * 3]; + } + else if (bitdepth == 8) + { + assert(line_bytes == width); + memcpy(pDst, pLine, pitch); + } + else + { + assert(line_bytes == width); + for (uint32_t i = 0; i < width; i++) + pDst[i] = dec.m_img_pal[pLine[i] * 3]; + } + break; + case 2: + if (bitdepth == 16) + { + assert(line_bytes == width * 2); + for (uint32_t i = 0; i < width; i++) + { + pDst[i * 2 + 0] = dec.m_img_pal[pLine[i * 2 + 0] * 3]; + pDst[i * 2 + 1] = pLine[i * 2 + 1]; + } + } + else if (dec.m_trns_flag) + { + assert(line_bytes == width); + for (uint32_t i = 0; i < width; i++) + { + pDst[i * 2 + 0] = dec.m_img_pal[pLine[i] * 3]; + pDst[i * 2 + 1] = (pLine[i] == trans_value) ? 0 : 255; + } + } + else + { + assert(line_bytes == width); + for (uint32_t i = 0; i < width; i++) + { + pDst[i * 2 + 0] = dec.m_img_pal[pLine[i] * 3]; + pDst[i * 2 + 1] = 255; + } + } + break; + case 3: + if (bitdepth == 16) + { + assert(line_bytes == width * 2); + for (uint32_t i = 0; i < width; i++) + { + uint8_t c = dec.m_img_pal[pLine[i * 2 + 0] * 3]; + pDst[i * 3 + 0] = c; + pDst[i * 3 + 1] = c; + pDst[i * 3 + 2] = c; + } + } + else + { + assert(line_bytes == width); + for (uint32_t i = 0; i < width; i++) + { + uint8_t c = dec.m_img_pal[pLine[i] * 3]; + pDst[i * 3 + 0] = c; + pDst[i * 3 + 1] = c; + pDst[i * 3 + 2] = c; + } + } + break; + case 4: + if (bitdepth == 16) + { + assert(line_bytes == width * 2); + for (uint32_t i = 0; i < width; i++) + { + uint8_t c = dec.m_img_pal[pLine[i * 2 + 0] * 3]; + pDst[i * 4 + 0] = c; + pDst[i * 4 + 1] = c; + pDst[i * 4 + 2] = c; + pDst[i * 4 + 3] = pLine[i * 2 + 1]; + } + } + else if (dec.m_trns_flag) + { + assert(line_bytes == width); + for (uint32_t i = 0; i < width; i++) + { + uint8_t c = dec.m_img_pal[pLine[i] * 3]; + pDst[i * 4 + 0] = c; + pDst[i * 4 + 1] = c; + pDst[i * 4 + 2] = c; + pDst[i * 4 + 3] = (pLine[i] == trans_value) ? 0 : 255; + } + } + else + { + assert(line_bytes == width); + for (uint32_t i = 0; i < width; i++) + { + uint8_t c = dec.m_img_pal[pLine[i] * 3]; + pDst[i * 4 + 0] = c; + pDst[i * 4 + 1] = c; + pDst[i * 4 + 2] = c; + pDst[i * 4 + 3] = 255; + } + } + break; + } + + break; + } + case PNG_COLOR_TYPE_GREYSCALE_ALPHA: + { + assert(line_bytes == width * 2); + + switch (desired_chans) + { + case 1: + for (uint32_t i = 0; i < width; i++) + pDst[i] = dec.m_img_pal[pLine[i * 2 + 0] * 3]; + break; + case 2: + assert(line_bytes == pitch); + if (bitdepth >= 8) + memcpy(pDst, pLine, pitch); + else + { + for (uint32_t i = 0; i < width; i++) + { + pDst[i * 2 + 0] = dec.m_img_pal[pLine[i * 2 + 0] * 3]; + pDst[i * 2 + 1] = pLine[i * 2 + 1]; + } + } + break; + case 3: + for (uint32_t i = 0; i < width; i++) + { + uint8_t c = dec.m_img_pal[pLine[i * 2 + 0] * 3]; + pDst[i * 3 + 0] = c; + pDst[i * 3 + 1] = c; + pDst[i * 3 + 2] = c; + } + break; + case 4: + for (uint32_t i = 0; i < width; i++) + { + uint8_t c = dec.m_img_pal[pLine[i * 2 + 0] * 3]; + pDst[i * 4 + 0] = c; + pDst[i * 4 + 1] = c; + pDst[i * 4 + 2] = c; + pDst[i * 4 + 3] = pLine[i * 2 + 1]; + } + break; + } + + break; + } + case PNG_COLOR_TYPE_PALETTIZED: + { + assert(line_bytes == width); + + switch (desired_chans) + { + case 1: + for (uint32_t i = 0; i < width; i++) + { + const uint8_t* p = &dec.m_img_pal[pLine[i] * 3]; + pDst[i] = get_709_luma(p[0], p[1], p[2]); + } + break; + case 2: + if (dec.m_trns_flag) + { + for (uint32_t i = 0; i < width; i++) + { + const uint8_t* p = &dec.m_img_pal[pLine[i] * 3]; + pDst[i * 2 + 0] = get_709_luma(p[0], p[1], p[2]); + pDst[i * 2 + 1] = (uint8_t)dec.m_trns_value[pLine[i]]; + } + } + else + { + for (uint32_t i = 0; i < width; i++) + { + const uint8_t* p = &dec.m_img_pal[pLine[i] * 3]; + pDst[i * 2 + 0] = get_709_luma(p[0], p[1], p[2]); + pDst[i * 2 + 1] = 255; + } + } + break; + case 3: + for (uint32_t i = 0; i < width; i++) + { + const uint8_t* p = &dec.m_img_pal[pLine[i] * 3]; + pDst[i * 3 + 0] = p[0]; + pDst[i * 3 + 1] = p[1]; + pDst[i * 3 + 2] = p[2]; + } + break; + case 4: + if (dec.m_trns_flag) + { + for (uint32_t i = 0; i < width; i++) + { + const uint8_t* p = &dec.m_img_pal[pLine[i] * 3]; + pDst[i * 4 + 0] = p[0]; + pDst[i * 4 + 1] = p[1]; + pDst[i * 4 + 2] = p[2]; + pDst[i * 4 + 3] = (uint8_t)dec.m_trns_value[pLine[i]]; + } + } + else + { + for (uint32_t i = 0; i < width; i++) + { + const uint8_t* p = &dec.m_img_pal[pLine[i] * 3]; + pDst[i * 4 + 0] = p[0]; + pDst[i * 4 + 1] = p[1]; + pDst[i * 4 + 2] = p[2]; + pDst[i * 4 + 3] = 255; + } + } + break; + } + + break; + } + case PNG_COLOR_TYPE_TRUECOLOR: + case PNG_COLOR_TYPE_TRUECOLOR_ALPHA: + { + assert(line_bytes == width * 4); + + switch (desired_chans) + { + case 1: + for (uint32_t i = 0; i < width; i++) + { + const uint8_t* p = &pLine[i * 4]; + pDst[i] = get_709_luma(p[0], p[1], p[2]); + } + break; + case 2: + for (uint32_t i = 0; i < width; i++) + { + const uint8_t* p = &pLine[i * 4]; + pDst[i * 2 + 0] = get_709_luma(p[0], p[1], p[2]); + pDst[i * 2 + 1] = p[3]; + } + break; + case 3: + for (uint32_t i = 0; i < width; i++) + { + const uint8_t* p = &pLine[i * 4]; + pDst[i * 3 + 0] = p[0]; + pDst[i * 3 + 1] = p[1]; + pDst[i * 3 + 2] = p[2]; + } + break; + case 4: + memcpy(pDst, pLine, pitch); + break; + } + + break; + } + default: + assert(0); + break; + } + + } // y + + return pBuf; +} + +} // namespace pv_png + +/* + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + For more information, please refer to + + Richard Geldreich, Jr. + 1/20/2022 +*/ diff --git a/ktx/external/basisu/encoder/pvpngreader.h b/ktx/external/basisu/encoder/pvpngreader.h new file mode 100644 index 0000000..4f3fe46 --- /dev/null +++ b/ktx/external/basisu/encoder/pvpngreader.h @@ -0,0 +1,48 @@ +// pngreader.h - Public Domain - see unlicense at bottom of pvpngreader.cpp +#pragma once +#include + +namespace pv_png +{ + // PNG color types + enum + { + PNG_COLOR_TYPE_GREYSCALE = 0, + PNG_COLOR_TYPE_TRUECOLOR = 2, + PNG_COLOR_TYPE_PALETTIZED = 3, + PNG_COLOR_TYPE_GREYSCALE_ALPHA = 4, + PNG_COLOR_TYPE_TRUECOLOR_ALPHA = 6 + }; + + // PNG file description + struct png_info + { + uint32_t m_width; + uint32_t m_height; + + uint32_t m_num_chans; // The number of channels, factoring in transparency. Ranges from [1-4]. + + uint32_t m_bit_depth; // PNG ihdr bit depth: 1, 2, 4, 8 or 16 + uint32_t m_color_type; // PNG ihdr color type, PNG_COLOR_TYPE_GRAYSCALE etc. + + bool m_has_gamma; // true if the PNG file had a GAMA chunk + uint32_t m_gamma_value; // PNG GAMA chunk value, scaled by 100000 + + bool m_has_trns; // true if the PNG file used colorkey transparency + }; + + // Retrieved information about the PNG file. + // Returns false on any errors. + bool get_png_info(const void* pImage_buf, size_t buf_size, png_info& info); + + // Input parameters: + // pImage_buf, buf_size - pointer to PNG image data + // desired_chans - desired number of output channels. 0=auto, 1=grayscale, 2=grayscale alpha, 3=24bpp RGB, 4=32bpp RGBA + // + // Output parameters: + // width, height - PNG image resolution + // num_chans - actual number of channels in PNG, from [1,4] (factoring in transparency) + // + // Returns nullptr on any errors. + void* load_png(const void* pImage_buf, size_t buf_size, uint32_t desired_chans, uint32_t &width, uint32_t &height, uint32_t& num_chans); +} diff --git a/ktx/external/basisu/encoder_lvl_vs_perf.png b/ktx/external/basisu/encoder_lvl_vs_perf.png new file mode 100644 index 0000000..5972ec7 Binary files /dev/null and b/ktx/external/basisu/encoder_lvl_vs_perf.png differ diff --git a/ktx/external/basisu/format.sh b/ktx/external/basisu/format.sh new file mode 100644 index 0000000..5760aec --- /dev/null +++ b/ktx/external/basisu/format.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# Loops through all text files tracked by Git. +git grep -zIl '' | +while IFS= read -rd '' f; do + # Exclude some types of files. + if [[ $f == *"proj" ]]; then + continue + elif [[ $f == *"filters" ]]; then + continue + elif [[ $f == *"sln" ]]; then + continue + elif [[ $f == *"json" ]]; then + continue + elif [[ $f == *"min.js" ]]; then + continue + elif [[ $f == *"coder.js" ]]; then + continue + fi + # Ensures that files are UTF-8 formatted. + recode UTF-8 $f 2> /dev/null + # Ensures that files have LF line endings. + dos2unix $f 2> /dev/null + # Ensures that files do not contain a BOM. + sed -i '1s/^\xEF\xBB\xBF//' "$f" + # Ensures that files end with newline characters. + tail -c1 < "$f" | read -r _ || echo >> "$f"; +done + +git diff > patch.patch +FILESIZE=$(stat -c%s patch.patch) +MAXSIZE=5 + +# If no patch has been generated all is OK, clean up, and exit. +if (( FILESIZE < MAXSIZE )); then + printf "Files in this commit comply with the formatting rules.\n" + rm -f patch.patch + exit 0 +fi + +# A patch has been created, notify the user, clean up, and exit. +printf "\n*** The following differences were found between the code " +printf "and the formatting rules:\n\n" +cat patch.patch +printf "\n*** Aborting, please fix your commit(s) with 'git commit --amend' or 'git rebase -i '\n" +rm -f patch.patch +exit 1 diff --git a/ktx/external/basisu/spec/basis_spec.txt b/ktx/external/basisu/spec/basis_spec.txt new file mode 100644 index 0000000..ba9fa4b --- /dev/null +++ b/ktx/external/basisu/spec/basis_spec.txt @@ -0,0 +1,865 @@ +Note: The latest specification is in the Basis Universal wiki, here: +https://github.com/BinomialLLC/basis_universal/wiki/.basis-File-Format-and-ETC1S-Texture-Video-Specification + +File: basis_spec.txt +Version 1.01 + +1.0 Introduction +---------------- + +The Basis Universal GPU texture codec supports reading and writing ".basis" files. +The .basis file format supports ETC1S or UASTC 4x4 texture data. + +* ETC1S is a simplified subset of ETC1. + +The mode is always differential (diff bit=1), the Rd, Gd, and Bd color deltas +are always (0,0,0), and the flip bit is always set. ETC1S texture data is fully +compliant with all existing software and hardware ETC1 decoders. Existing encoders +can be easily modified to limit their output to ETC1S. + +* UASTC 4x4 is a 19 mode subset of the ASTC texture format. Its specification is +[here](https://github.com/BinomialLLC/basis_universal/wiki/UASTC-Texture-Specification). UASTC texture data can always be losslessly transcoded to ASTC. + +2.0 High-Level File Structure +----------------------------- + +A .basis file consists of multiple sections. Apart from the header, which must always +be at the start of the file, the other sections may appear in any order. + +Here's the high level organization of a typical .basis file: + +* The file header +* Optional ETC1S compressed endpoint/selector codebooks +* Optional ETC1S Huffman table information +* A required "slice" description array describing the resolutions and file offset/compressed sizes of each texture slice present in the file +* 1 or more slices containing ETC1S or UASTC compressed texture data. +* For future expansion, the format supports an "extended" header which may be located anywhere in the file. This section contains .PNG-like chunked data. + +3.0 File Enums +-------------- + +// basis_file_header::m_tex_type +enum basis_texture_type +{ + cBASISTexType2D = 0, + cBASISTexType2DArray = 1, + cBASISTexTypeCubemapArray = 2, + cBASISTexTypeVideoFrames = 3, + cBASISTexTypeVolume = 4, + cBASISTexTypeTotal +}; + +// basis_slice_desc::flags +enum basis_slice_desc_flags +{ + cSliceDescFlagsHasAlpha = 1, + cSliceDescFlagsFrameIsIFrame = 2 +}; + +// basis_file_header::m_tex_format +enum basis_tex_format +{ + cETC1S = 0, + cUASTC4x4 = 1 +}; + +// basis_file_header::m_flags +enum basis_header_flags +{ + cBASISHeaderFlagETC1S = 1, + cBASISHeaderFlagYFlipped = 2, + cBASISHeaderFlagHasAlphaSlices = 4 +}; + +4.0 File Structures +------------------- + +All individual members in all file structures are byte aligned and little endian. The structs +have no padding (i.e. they are declared with #pragma pack(1)). + +4.1 "basis_file_header" structure +--------------------------------- + +The file header must always be at the beginning of the file. + +struct basis_file_header +{ + uint16 m_sig; // 2 byte file signature + uint16 m_ver; // File version + uint16 m_header_size; // Header size in bytes, sizeof(basis_file_header) or 0x4D + uint16 m_header_crc16; // CRC16/genibus of the remaining header data + + uint32 m_data_size; // The total size of all data after the header + uint16 m_data_crc16; // The CRC16 of all data after the header + + uint24 m_total_slices; // The number of compressed slices + uint24 m_total_images; // The total # of images + + byte m_tex_format; // enum basis_tex_format + uint16 m_flags; // enum basis_header_flags + byte m_tex_type; // enum basis_texture_type + uint24 m_us_per_frame; // Video: microseconds per frame + + uint32 m_reserved; // For future use + uint32 m_userdata0; // For client use + uint32 m_userdata1; // For client use + + uint16 m_total_endpoints; // ETC1S: The number of endpoints in the endpoint codebook + uint32 m_endpoint_cb_file_ofs; // ETC1S: The compressed endpoint codebook's file offset relative to the start of the file + uint24 m_endpoint_cb_file_size; // ETC1S: The compressed endpoint codebook's size in bytes + + uint16 m_total_selectors; // ETC1S: The number of selectors in the selector codebook + uint32 m_selector_cb_file_ofs; // ETC1S: The compressed selector codebook's file offset relative to the start of the file + uint24 m_selector_cb_file_size; // ETC1S: The compressed selector codebook's size in bytes + + uint32 m_tables_file_ofs; // ETC1S: The file offset of the compressed Huffman codelength tables. + uint32 m_tables_file_size; // ETC1S: The file size in bytes of the compressed Huffman codelength tables. + + uint32 m_slice_desc_file_ofs; // The file offset to the slice description array, usually follows the header + uint32 m_extended_file_ofs; // The file offset of the "extended" header and compressed data, for future use + uint32 m_extended_file_size; // The file size in bytes of the "extended" header and compressed data, for future use +}; + +4.1.1 Details: + +* m_sig is always 'B' * 256 + 's', or 0x4273. +* m_ver is currently always 0x10. +* m_header_size is sizeof(basis_file_header). It's always 0x4D. +* m_header_crc16 is the CRC-16 of the remaining header data. See the "CRC-16" section 5.0 below for more information. +* m_data_size, m_data_crc16: The size of all data following the header, and its CRC-16. +* m_total_slices: The total number of slices, from [1,2^24-1] +* m_total_images: The total number of images (where one image can contain multiple mipmap levels, and each mipmap level is a different slice). +* m_tex_format: basis_tex_format. Either cETC1S (0), or cUASTC4x4 (1). +* m_flags: A combination of flags from the basis_header_flags enum. +* m_tex_type: The texture type, from enum basis_texture_type +* m_us_per_frame: Microseconds per frame, only valid for cBASISTexTypeVideoFrames texture types. +* m_total_endpoints, m_endpoint_cb_file_ofs, m_endpoint_cb_file_size: Information about the compressed ETC1S endpoint codebook: The total # of entries, the offset to the compressed data, and the compressed data's size. +* m_total_selectors, m_selector_cb_file_ofs, m_selector_cb_file_size: Information about the compressed ETC1S selector codebook: The total # of entries, the offset to the compressed data, and the compressed data's size. +* m_tables_file_ofs, m_tables_file_size: The file offset and size of the compressed Huffman tables for ETC1S format files. +* m_slice_desc_file_ofs: The file offset to the array of slice description structures. There will be m_total_slices structures at this file offset. +* m_extended_file_ofs, m_extended_file_size: The "extended" header, for future expansion. Currently unused. + +4.2 "basis_slice_desc" structure +-------------------------------- + +struct basis_slice_desc +{ + uint24 m_image_index; + uint8 m_level_index; + uint8 m_flags; + + uint16 m_orig_width; + uint16 m_orig_height; + + uint16 m_num_blocks_x; + uint16 m_num_blocks_y; + + uint32 m_file_ofs; + uint32 m_file_size; + + uint16 m_slice_data_crc16; +}; + +4.2.1 Details: + +* m_image_index: The index of the source image provided to the encoder (will always appear in order from first to last, first image index is 0, no skipping allowed) +* m_level_index: The mipmap level index (mipmaps will always appear from largest to smallest) +* m_flags: enum basis_slice_desc_flags +* m_orig_width: The original image width (may not be a multiple of 4 pixels) +* m_orig_height: The original image height (may not be a multiple of 4 pixels) +* m_num_blocks_x: The slice's block X dimensions. Each block is 4x4 pixels. The slice's pixel resolution may or may not be a power of 2. +* m_num_blocks_y: The slice's block Y dimensions. +* m_file_ofs: Offset from the start of the file to the start of the slice's data +* m_file_size: The size of the compressed slice data in bytes +* m_slice_data_crc16: The CRC16 of the compressed slice data, for extra-paranoid use cases + +5.0 CRC-16 Function +------------------- + +.basis files use CRC-16/genibus(aka CRC-16 EPC, CRC-16 I-CODE, CRC-16 DARC) format CRC-16's. + +Here's an example function in C++: + +uint16_t crc16(const void* r, size_t size, uint16_t crc) +{ + crc = ~crc; + const uint8_t* p = static_cast(r); + for ( ; size; --size) + { + const uint16_t q = *p++ ^ (crc >> 8); + uint16_t k = (q >> 4) ^ q; + crc = (((crc << 8) ^ k) ^ (k << 5)) ^ (k << 12); + } + + return static_cast(~crc); +} + +This function is called with 0 in the final "crc" parameter when computing CRC-16's of file data. + +6.0 Compressed Huffman Tables +----------------------------- + +ETC1S format .basis files rely heavily on static [canonical Huffman +prefix coding](https://en.wikipedia.org/wiki/Canonical_Huffman_code). Multiple +Huffman tables are used by each compressed section. Huffman codes are stored in +each output byte in LSB to MSB order. (This is opposite of the JPEG format, +which stores the codes in MSB to LSB order.) + +Huffman coding in .basis is compatible with the canonical Huffman methods used +by Deflate encoders/decoders. Section 3.2.2 of [Deflate - RFC +1951](https://tools.ietf.org/html/rfc1951), which describes how to compute the +value of each Huffman code given an array of symbol codelengths. This document +assumes familiarity with how Huffman coding works in Deflate. + +First, some enums: + +enum +{ + // Max supported Huffman code size is 16-bits + cHuffmanMaxSupportedCodeSize = 16, + + // The maximum number of symbols is 2^14 + cHuffmanMaxSymsLog2 = 14, + cHuffmanMaxSyms = 1 << cHuffmanMaxSymsLog2, + + // Small zero runs may range from 3-10 entries + cHuffmanSmallZeroRunSizeMin = 3, + cHuffmanSmallZeroRunSizeMax = 10, + cHuffmanSmallZeroRunExtraBits = 3, + + // Big zero runs may range from 11-138 entries + cHuffmanBigZeroRunSizeMin = 11, + cHuffmanBigZeroRunSizeMax = 138, + cHuffmanBigZeroRunExtraBits = 7, + + // Small non-zero runs may range from 3-6 entries + cHuffmanSmallRepeatSizeMin = 3, + cHuffmanSmallRepeatSizeMax = 6, + cHuffmanSmallRepeatExtraBits = 2, + + // Big non-zero run may range from 7-134 entries + cHuffmanBigRepeatSizeMin = 7, + cHuffmanBigRepeatSizeMax = 134, + cHuffmanBigRepeatExtraBits = 7, + + // There are a maximum of 21 symbols in a compressed Huffman code length table. + cHuffmanTotalCodelengthCodes = 21, + + // Symbols [0,16] indicate code sizes. Other symbols indicate zero runs or repeats: + cHuffmanSmallZeroRunCode = 17, + cHuffmanBigZeroRunCode = 18, + cHuffmanSmallRepeatCode = 19, + cHuffmanBigRepeatCode = 20 +}; + +A .basis Huffman table consists of 1 to cHuffmanMaxSyms symbols. Each compressed +Huffman table is described by an array of symbol code lengths in bits. + +The table's symbol code lengths are themselves RLE+Huffman coded, just like +Deflate. (Note this can be confusing to developers unfamiliar with Deflate.) +Each table begins with a small fixed header: + + 14 bits: total_used_syms [1, cHuffmanMaxSyms] + 5 bits: num_codelength_codes [1, cHuffmanTotalCodelengthCodes] + +Next, the code lengths for the small Huffman table which is used to send the compressed codelengths (and RLE/repeat codes) are sent uncompressed but in a reordered manner: + + 3*num_codelength_codes bits: Code size of each Huffman symbol for the compressed Huffman codelength table. + + These code lengths are sent in this order (to help reduce the number that must be sent): + + { + cHuffmanSmallZeroRunCode, cHuffmanBigZeroRunCode, cHuffmanSmallRepeatCode, cHuffmanBigRepeatCode, + 0, 8, 7, 9, 6, 0xA, 5, 0xB, 4, 0xC, 3, 0xD, 2, 0xE, 1, 0xF, 0x10 + }; + +A canonical Huffman decoding table (of up to 21 symbols) should be built from +these code lengths. Immediately following this data are the Huffman symbols +(sometimes intermixed with raw bits) which describe how to unpack the +codelengths of each symbol in the Huffman table: + + - Symbols [0,16] indicate a specific symbol code length in bits. + + - Symbol cHuffmanSmallZeroRunCode (17) indicates a short run of symbols with 0 bit code lengths. + cHuffmanSmallZeroRunExtraBits (3) bits are sent after this symbol, which indicates the run's size after adding the minimum size (cHuffmanSmallZeroRunSizeMin). + + - Symbol cHuffmanBigZeroRunCode (18) indicates a long run of symbols with 0 bit code lengths. + cHuffmanBigZeroRunExtraBits (7) bits are sent after this symbol, which indicates the run's size after adding the minimum size (cHuffmanBigZeroRunSizeMin) + + - Symbol cHuffmanSmallRepeatCode (19) indicates a short run of symbols that repeat the previous symbol's code length. + cHuffmanSmallRepeatExtraBits (2) bits are sent after this symbol, which indicates the number of times to repeat the previous symbol's code length, + after adding the minimum size (cHuffmanSmallRepeatSizeMin). + Cannot be the first symbol, and the previous symbol cannot have a code length of 0. + + - Symbol cHuffmanBigRepeatCode (20) indicates a short run of symbols that repeat the previous symbol's code length. + cHuffmanBigRepeatExtraBits (7) bits are sent after this symbol, which indicates the number of times to repeat the previous symbol's code length, + after adding the minimum size (cHuffmanBigRepeatSizeMin). + Cannot be the first symbol, and the previous symbol cannot have a code length of 0. + +There should be exactly total_used_syms code lengths stored in the compressed Huffman table. If not the stream is either corrupted or invalid. + +After all the symbol codelengths are uncompressed, the symbol codes can be computed and the canonical Huffman decoding tables can be built. + +7.0 ETC1S Endpoint Codebooks +---------------------------- + +The endpoint codebook section starts at file offset +basis_file_header::m_endpoint_cb_file_ofs and is m_endpoint_cb_file_size bytes +long. The endpoint codebook will have basis_file_header::m_total_endpoints total +entries. + +At the beginning of the compressed endpoint codebook section are four compressed +Huffman tables, stored using the procedure outlined in section 6.0. The Huffman tables +appear in this order: + + 1. color5_delta_model0 + 2. color5_delta_model1 + 3. color5_delta_model2 + 4. inten_delta_model + +Following the data for these Huffman tables is a single 1-bit code which +indicates if the color endpoint codebook is grayscale or not. + +Immediately following this code is the compressed color endpoint codebook data. +A simple form of DPCM (Delta Pulse Code Modulation) coding is used to send the +ETC1S intensity table indices and color values. Here is the procedure to decode +the endpoint codebook: + + const int COLOR5_PAL0_PREV_HI = 9, COLOR5_PAL0_DELTA_LO = -9, COLOR5_PAL0_DELTA_HI = 31; + const int COLOR5_PAL1_PREV_HI = 21, COLOR5_PAL1_DELTA_LO = -21, COLOR5_PAL1_DELTA_HI = 21; + const int COLOR5_PAL2_PREV_HI = 31, COLOR5_PAL2_DELTA_LO = -31, COLOR5_PAL2_DELTA_HI = 9; + + // Assume previous endpoint color is (16, 16, 16), and the previous intensity is 0. + color32 prev_color5(16, 16, 16, 0); + uint32_t prev_inten = 0; + + // For each endpoint codebook entry + for (uint32_t i = 0; i < num_endpoints; i++) + { + // Decode the intensity delta Huffman code + uint32_t inten_delta = decode_huffman(inten_delta_model); + endpoints[i].m_inten5 = static_cast((inten_delta + prev_inten) & 7); + prev_inten = endpoints[i].m_inten5; + + // Now decode the endpoint entry's color or intensity value + for (uint32_t c = 0; c < (endpoints_are_grayscale ? 1U : 3U); c++) + { + // The Huffman table used to decode the delta depends on the previous color's value + int delta; + if (prev_color5[c] <= basist::COLOR5_PAL0_PREV_HI) + delta = decode_huffman(color5_delta_model0); + else if (prev_color5[c] <= basist::COLOR5_PAL1_PREV_HI) + delta = decode_huffman(color5_delta_model1); + else + delta = decode_huffman(color5_delta_model2); + + // Apply the delta + int v = (prev_color5[c] + delta) & 31; + + endpoints[i].m_color5[c] = static_cast(v); + + prev_color5[c] = static_cast(v); + } + + // If the endpoints are grayscale, set G and B to match R. + if (endpoints_are_grayscale) + { + endpoints[i].m_color5[1] = endpoints[i].m_color5[0]; + endpoints[i].m_color5[2] = endpoints[i].m_color5[0]; + } + } + +The rest of the section's data (if any) can be ignored. + +8.0 ETC1S Selector Codebooks +---------------------------- + +The selector codebook section starts at file offset +basis_file_header::m_selector_cb_file_ofs and is m_selector_cb_file_size bytes +long. The selector codebook will have basis_file_header::m_total_selectors total +entries. + +The first bit of this section indicates if "global" selector codebooks are used. +Basis Universal doesn't currently utilize global selector codebooks, so this bit +should always be 0. + +The second bit of this section indicates if "hybrid" global/local selector +codebooks are used. Hybrid codebooks are not supported either, so this bit +should always be 0. + +The third bit indicates if the selector codebook has been sent in raw form +(uncompressed). If it's set, each selector is sent as four 8-bit bytes. Each +byte corresponds to four 2-bit ETC1S selectors. The first selector of each group +of 4 selectors starts at the LSB (least significant bit) of each byte, and is +2-bits wide. + +If the third bit is 0, the selectors have been DPCM coded with Huffman coding. +The "delta_selector_pal_model" Huffman table will immediately follow the third +bit, and is stored using the procedure outlined in section 6.0. + +Immediately following the Huffman table is the compressed selector codebook. +Here is the DPCM decoding procedure: + + uint8_t prev_bytes[4] = { 0, 0, 0, 0 }; + + for (uint32_t i = 0; i < num_selectors; i++) + { + if (!i) + { + // First selector is sent raw + for (uint32_t j = 0; j < 4; j++) + { + uint32_t cur_byte = get_bits(8); + prev_bytes[j] = static_cast(cur_byte); + + for (uint32_t k = 0; k < 4; k++) + selectors[i].set_selector(k, j, (cur_byte >> (k * 2)) & 3); + } + selectors[i].init_flags(); + continue; + } + + // Subsequent selectors are sent with a simple form of byte-wise DPCM coding. + for (uint32_t j = 0; j < 4; j++) + { + int delta_byte = decode_huffman(delta_selector_pal_model); + + uint32_t cur_byte = delta_byte ^ prev_bytes[j]; + prev_bytes[j] = static_cast(cur_byte); + + for (uint32_t k = 0; k < 4; k++) + selectors[i].set_selector(k, j, (cur_byte >> (k * 2)) & 3); + } + } + +Any bytes in this section following the selector codebook bits can be safely ignored. + +9.0 ETC1S Compressed Slice Decoding Huffman Tables +-------------------------------------------------- + +Each ETC1S slice is compressed with four Huffman tables stored using the +procedure outlined in section 6.0. These Huffman tables are stored at file +offset basis_file_header::m_tables_file_ofs. This section will be +basis_file_header::m_tables_file_size bytes long. + +The following four Huffman tables are sent, in this order: + + 1. endpoint_pred_model + 2. delta_endpoint_model + 3. selector_model + 4. selector_history_buf_rle_model + +Following the last Huffman table are 13-bits indicating the size of the selector +history buffer. Any remaining bits may be safely ignored. + +10. ETC1S Slice Decoding +------------------------ + +ETC1S slices consist of a compressed 2D array of ETC1S blocks, always compressed +in top-down/left-right raster order. For texture video, the previous slice's +already decoded contents may be referred to when blocks are encoded using +Conditional Replenishment (also known as "skip blocks"). + +Each ETC1S block is encoded by using references to the color endpoint codebook +and the selector codebook. Sections 10.1 and 10.2 describe the helper procedures +using by the decoder, and section 10.3 describes how the array of ETC1S blocks +is actually decoded. + +10.1 ETC1S Approximate Move to Front Routines +--------------------------------------------- + +An approximate Move to Front (MTF) approach is used to efficiently encode the +selector codebook references. Here is the C++ example class for approximate MTF +decoding: + + class approx_move_to_front + { + public: + approx_move_to_front(uint32_t n) + { + init(n); + } + + void init(uint32_t n) + { + m_values.resize(n); + m_rover = n / 2; + } + + size_t size() const { return m_values.size(); } + + const int& operator[] (uint32_t index) const { return m_values[index]; } + int operator[] (uint32_t index) { return m_values[index]; } + + void add(int new_value) + { + m_values[m_rover++] = new_value; + if (m_rover == m_values.size()) + m_rover = (uint32_t)m_values.size() / 2; + } + + void use(uint32_t index) + { + if (index) + { + int x = m_values[index / 2]; + int y = m_values[index]; + m_values[index / 2] = y; + m_values[index] = x; + } + } + + private: + std::vector m_values; + uint32_t m_rover; + }; + +10.2 ETC1S VLC Decoding Procedure +--------------------------------- + +ETC1S slice decoding utilizes a simple Variable Length Coding (VLC) scheme that +sends raw bits using variable-size chunks. Here is the VLC decoding procedure: + + uint32_t decode_vlc(uint32_t chunk_bits) + { + assert(chunk_bits); + + const uint32_t chunk_size = 1 << chunk_bits; + const uint32_t chunk_mask = chunk_size - 1; + + uint32_t v = 0; + uint32_t ofs = 0; + + for ( ; ; ) + { + uint32_t s = get_bits(chunk_bits + 1); + v |= ((s & chunk_mask) << ofs); + ofs += chunk_bits; + + if ((s & chunk_size) == 0) + break; + + if (ofs >= 32) + { + assert(0); + break; + } + } + + return v; + } + +10.3 ETC1S Slice Block Decoding +------------------------------- + +Each slice has a corresponding "basis_slice_desc" structure, described in section +4.2. The slice's dimensions in ETC1S blocks are stored in +basis_slice_desc::m_num_blocks_x and basis_slice_desc::m_num_blocks_y. Each +slice is located at file offset basis_slice_desc::m_file_ofs, and is +basis_slice_desc::m_file_size bytes long. + +The decoder iterates through all the slice blocks in top-down, left-right raster +order. Each block is represented by an index into the color endpoint codebook +and another index into the selector endpoint codebook. The endpoint codebook +contains each ETC1S block's base RGB color and intensity table information, and +the selector codebook contains the 4x4 texel selector entry (which are 2-bits +each) information. This is all the information needed to fully represent the +texels within each block. + +The decoding procedure loops over all the blocks in raster order, and decodes +the endpoint and selector indices used to represent each block. The decoding +procedure is complex enough that commented code is best used to describe it. + +Here's the slice decoding procedure. This block of code shows the block loop, +and how endpoint codebook indices are decoded. The next block of code shows how +selector codebook indices are decoded. + + // Constants used by the decoder + const uint32_t ENDPOINT_PRED_TOTAL_SYMBOLS = (4 * 4 * 4 * 4) + 1; + const uint32_t ENDPOINT_PRED_REPEAT_LAST_SYMBOL = ENDPOINT_PRED_TOTAL_SYMBOLS - 1; + const uint32_t ENDPOINT_PRED_MIN_REPEAT_COUNT = 3; + const uint32_t ENDPOINT_PRED_COUNT_VLC_BITS = 4; + + const uint32_t NUM_ENDPOINT_PREDS = 3; + const uint32_t CR_ENDPOINT_PRED_INDEX = NUM_ENDPOINT_PREDS - 1; + const uint32_t NO_ENDPOINT_PRED_INDEX = 3; + + // Endpoint/selector codebooks - decoded previously. See sections 7.0 and 8.0. + endpoint endpoints[endpoint_codebook_size]; + selector selectors[selector_codebook_size]; + + // Array of per-block values used for endpoint index prediction (enough for 2 rows). + struct block_preds + { + uint16_t m_endpoint_index; + uint8_t m_pred_bits; + }; + block_preds block_endpoint_preds[2][num_blocks_x]; + + // Some constants and state used during block decoding + const uint32_t SELECTOR_HISTORY_BUF_FIRST_SYMBOL_INDEX = selector_codebook_size; + const uint32_t SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX = selector_history_buf_size + SELECTOR_HISTORY_BUF_FIRST_SYMBOL_INDEX; + uint32_t cur_selector_rle_count = 0; + + uint32_t cur_pred_bits = 0; + int prev_endpoint_pred_sym = 0; + int endpoint_pred_repeat_count = 0; + uint32_t prev_endpoint_index = 0; + + // This array is only used for texture video. It holds the previous frame's endpoint and selector indices (each 16-bits, for 32-bits total). + uint32_t prev_frame_indices[num_blocks_x][num_blocks_y]; + + // Selector history buffer - See section 10.1. + // For the selector history buffer's size, see section 9.0. + approx_move_to_front selector_history_buf(selector_history_buf_size); + + // Loop over all slice blocks in raster order + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + // The index into the block_endpoint_preds array + const uint32_t cur_block_endpoint_pred_array = block_y & 1; + + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + // Check if we're at the start of a 2x2 block group. + if ((block_x & 1) == 0) + { + // Are we on an even or odd row of blocks? + if ((block_y & 1) == 0) + { + // We're on an even row and column of blocks. Decode the combined endpoint index predictor symbols for 2x2 blocks. + // This symbol tells the decoder how the endpoints are decoded for each block in a 2x2 group of blocks. + + // Are we in an RLE run? + if (endpoint_pred_repeat_count) + { + // Inside a run of endpoint predictor symbols. + endpoint_pred_repeat_count--; + cur_pred_bits = prev_endpoint_pred_sym; + } + else + { + // Decode the endpoint prediction symbol, using the "endpoint pred" Huffman table (see section 9.0). + cur_pred_bits = decode_huffman(m_endpoint_pred_model); + if (cur_pred_bits == ENDPOINT_PRED_REPEAT_LAST_SYMBOL) + { + // It's a run of symbols, so decode the count using VLC decoding (see section 10.2) + endpoint_pred_repeat_count = decode_vlc(ENDPOINT_PRED_COUNT_VLC_BITS) + ENDPOINT_PRED_MIN_REPEAT_COUNT - 1; + + cur_pred_bits = prev_endpoint_pred_sym; + } + else + { + // It's not a run of symbols + prev_endpoint_pred_sym = cur_pred_bits; + } + } + + // The symbol has enough endpoint prediction information for 4 blocks (2 bits per block), so 8 bits total. + // Remember the prediction information we should use for the next row of 2 blocks beneath the current block. + block_endpoint_preds[cur_block_endpoint_pred_array ^ 1][block_x].m_pred_bits = (uint8_t)(cur_pred_bits >> 4); + } + else + { + // We're on an odd row of blocks, so use the endpoint prediction information we previously stored on the previous even row. + cur_pred_bits = block_endpoint_preds[cur_block_endpoint_pred_array][block_x].m_pred_bits; + } + } + + // Decode the current block's endpoint and selector indices. + uint32_t endpoint_index, selector_index = 0; + + // Get the 2-bit endpoint prediction index for this block. + const uint32_t pred = cur_pred_bits & 3; + + // Get the next block's endpoint prediction bits ready. + cur_pred_bits >>= 2; + + // Now check to see if we should reuse a previously encoded block's endpoints. + if (pred == 0) + { + // Reuse the left block's endpoint index + assert(block_x > 0); + endpoint_index = prev_endpoint_index; + } + else if (pred == 1) + { + // Reuse the upper block's endpoint index + assert(block_y > 0) + endpoint_index = block_endpoint_preds[cur_block_endpoint_pred_array ^ 1][block_x].m_endpoint_index; + } + else if (pred == 2) + { + if (is_video) + { + // If it's texture video, reuse the previous frame's endpoint index, at this block. + assert(pred == CR_ENDPOINT_PRED_INDEX); + endpoint_index = prev_frame_indices[block_x][block_y]; + selector_index = endpoint_index >> 16; + endpoint_index &= 0xFFFFU; + } + else + { + // Reuse the upper left block's endpoint index. + assert((block_x > 0) && (block_y > 0)); + endpoint_index = block_endpoint_preds[cur_block_endpoint_pred_array ^ 1][block_x - 1].m_endpoint_index; + } + } + else + { + // We need to decode and apply a DPCM encoded delta to the previously used endpoint index. + // This uses the delta endpoint Huffman table (see section 9.0). + const uint32_t delta_sym = decode_huffman(delta_endpoint_model); + + endpoint_index = delta_sym + prev_endpoint_index; + + // Wrap around if the index goes beyond the end of the endpoint codebook + if (endpoint_index >= endpoints.size()) + endpoint_index -= (int)endpoints.size(); + } + + // Remember the endpoint index we used on this block, so the next row can potentially reuse the index. + block_endpoint_preds[cur_block_endpoint_pred_array][block_x].m_endpoint_index = (uint16_t)endpoint_index; + + // Remember the endpoint index used + prev_endpoint_index = endpoint_index; + + // Now we have fully decoded the ETC1S endpoint codebook index, in endpoint_index. + + // Now decode the selector index (see the next block of code, below). + < selector decoding - see below > + + } // block_x + } // block_y + +The compressed format allows the encoder to reuse the endpoint index used by +the previous block, the block immediately above the current block, or the +block to the upper left (if the file is not texture video). Alternately, the +encoder can send a Huffman coded DPCM encoded index relative to the +previously used endpoint index. + +Which type of prediction was used by the encoder is controlled by the "endpoint +pred" (endpoint prediction) indices, which are sent with Huffman coding (using +the "endpoint_pred_model" table described in Section 9.0) once every 2x2 blocks. + +For texture video, the endpoint prediction symbol normally used to refer to the +upper left block (endpoint pred index 2) instead indicates that both the +endpoint and selector indices from the previous frame's block should be reused +on the current frame's block. The endpoint pred indices are RLE coded, so this +allows the encoder to efficiently skip over a large number of unchanged blocks +in a video sequence. + +The code to decode the selector codebook index immediately follows the code above for decoding the endpoint indices: + + const uint32_t MAX_SELECTOR_HISTORY_BUF_SIZE = 64; + const uint32_t SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH = 3; + const uint32_t SELECTOR_HISTORY_BUF_RLE_COUNT_BITS = 6; + const uint32_t SELECTOR_HISTORY_BUF_RLE_COUNT_TOTAL = (1 << SELECTOR_HISTORY_BUF_RLE_COUNT_BITS); + + // Decode selector index, unless it's texture video and the endpoint predictor indicated that the + // block's endpoints were reused from the previous frame. + if ((!is_video) || (pred != CR_ENDPOINT_PRED_INDEX)) + { + int selector_sym; + + // Are we in a selector RLE run? + if (cur_selector_rle_count > 0) + { + // Handle selector RLE run. + cur_selector_rle_count--; + + selector_sym = (int)selectors.size(); + } + else + { + // Decode the selector symbol, using the selector Huffman table (see section 9.0). + selector_sym = decode_huffman(m_selector_model); + + // Is it a run? + if (selector_sym == static_cast(SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX)) + { + // Decode the selector run's size, using the selector history buf RLE Huffman table (see section 9.0). + int run_sym = decode_huffman(selector_history_buf_rle_model); + + // Is it a very long run? + if (run_sym == (SELECTOR_HISTORY_BUF_RLE_COUNT_TOTAL - 1)) + cur_selector_rle_count = decode_vlc(7) + SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH; + else + cur_selector_rle_count = run_sym + SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH; + + selector_sym = (int)selectors.size(); + + cur_selector_rle_count--; + } + } + + // Is it a reference into the selector history buffer? + if (selector_sym >= (int)selectors.size()) + { + assert(m_selector_history_buf_size > 0); + + // Compute the history buffer index + int history_buf_index = selector_sym - (int)selectors.size(); + + assert(history_buf_index < selector_history_buf.size()); + + // Access the history buffer + selector_index = selector_history_buf[history_buf_index]; + + // Update the history buffer + if (history_buf_index != 0) + selector_history_buf.use(history_buf_index); + } + else + { + // It's an index into the selector codebook + selector_index = selector_sym; + + // Add it to the selector history buffer + if (m_selector_history_buf_size) + selector_history_buf.add(selector_index); + } + } + + // For texture video, remember the endpoint and selector indices used by the block on this frame, for later reuse on the next frame. + if (is_video) + prev_frame_indices[block_x][block_y] = endpoint_index | (selector_index << 16); + + // The block is fully decoded here. The codebook indices are endpoint_index and selector_index. + // Make sure they are valid + assert((endpoint_index < endpoints.size()) && (selector_index < selectors.size())); + +At this point, the decoder has decoded each block's endpoint and selector codebook indices. +It can now fetch the actual ETC1S endpoints/selectors from the codebooks and write out ETC1S +texture data, or it can immedately transcode the ETC1S data to another GPU texture format. + +11.0 Alpha Channels in ETC1S Format Files +----------------------------------------- + +ETC1S .basis files can have optional alpha channels, stored in odd slices. If any slice needs an alpha channel, +all slices must have alpha channels. basis_file_header::m_flags will be logically OR'd with +cBASISHeaderFlagHasAlphaSlices. Alpha channel ETC1S files will contain two slices for each mipmap level +(or face, or video frame, etc.). The basis_slice_desc::m_flags field will be logically OR'd with +cSliceDescFlagsHasAlpha for all odd alpha slices. + +The even slices will contain the RGB data, and the odd slices will contain the alpha data, both stored in ETC1S +format. Alpha channel ETC1S files must always have an even total number of slices. A decoder can first decode +the RGB data slice, then the next alpha channel slice, or it can decode them in parallel using multithreading. +The ETC1S green channel (on the odd slices) contains the alpha values. + +12.0 Texture Video +------------------ + +Both ETC1S and UASTC format files support texture video. Texture video files can be optionally mipmapped, and can +contain optional alpha channels (stored as separate slices in ETC1S format files). Currently, the first frame is +always an i-frame, and all subsequent frames are p-frames, but the file format and transcoder supports any +frame being an i-frame (and the encoder will be enhanced to support this feature). Decoders must track the previously +decoded frame's endpoints/selectors for all mipmap levels (if any), not just the top level's. + +Skip blocks always refer to the previous frame. i-frames cannot use skip blocks (encoded as endpoint predictor index 2). + +12.0 Example Bitstreams +----------------------- + +This section will include several example .basis file bitstreams, along with their decoded equivalents, which should be helpful for new decoder verification. + diff --git a/ktx/external/basisu/test_files/alpha0.png b/ktx/external/basisu/test_files/alpha0.png new file mode 100644 index 0000000..ea22fb2 Binary files /dev/null and b/ktx/external/basisu/test_files/alpha0.png differ diff --git a/ktx/external/basisu/test_files/black_1x1.png b/ktx/external/basisu/test_files/black_1x1.png new file mode 100644 index 0000000..7b435bc Binary files /dev/null and b/ktx/external/basisu/test_files/black_1x1.png differ diff --git a/ktx/external/basisu/test_files/kodim01.png b/ktx/external/basisu/test_files/kodim01.png new file mode 100644 index 0000000..14317f0 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim01.png differ diff --git a/ktx/external/basisu/test_files/kodim02.png b/ktx/external/basisu/test_files/kodim02.png new file mode 100644 index 0000000..20c7206 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim02.png differ diff --git a/ktx/external/basisu/test_files/kodim03.png b/ktx/external/basisu/test_files/kodim03.png new file mode 100644 index 0000000..d57e8bd Binary files /dev/null and b/ktx/external/basisu/test_files/kodim03.png differ diff --git a/ktx/external/basisu/test_files/kodim04.png b/ktx/external/basisu/test_files/kodim04.png new file mode 100644 index 0000000..de0991c Binary files /dev/null and b/ktx/external/basisu/test_files/kodim04.png differ diff --git a/ktx/external/basisu/test_files/kodim05.png b/ktx/external/basisu/test_files/kodim05.png new file mode 100644 index 0000000..400e4cf Binary files /dev/null and b/ktx/external/basisu/test_files/kodim05.png differ diff --git a/ktx/external/basisu/test_files/kodim06.png b/ktx/external/basisu/test_files/kodim06.png new file mode 100644 index 0000000..949d1e2 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim06.png differ diff --git a/ktx/external/basisu/test_files/kodim07.png b/ktx/external/basisu/test_files/kodim07.png new file mode 100644 index 0000000..d04374d Binary files /dev/null and b/ktx/external/basisu/test_files/kodim07.png differ diff --git a/ktx/external/basisu/test_files/kodim08.png b/ktx/external/basisu/test_files/kodim08.png new file mode 100644 index 0000000..d628801 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim08.png differ diff --git a/ktx/external/basisu/test_files/kodim09.png b/ktx/external/basisu/test_files/kodim09.png new file mode 100644 index 0000000..1d47188 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim09.png differ diff --git a/ktx/external/basisu/test_files/kodim10.png b/ktx/external/basisu/test_files/kodim10.png new file mode 100644 index 0000000..2e4b18b Binary files /dev/null and b/ktx/external/basisu/test_files/kodim10.png differ diff --git a/ktx/external/basisu/test_files/kodim11.png b/ktx/external/basisu/test_files/kodim11.png new file mode 100644 index 0000000..3c66526 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim11.png differ diff --git a/ktx/external/basisu/test_files/kodim12.png b/ktx/external/basisu/test_files/kodim12.png new file mode 100644 index 0000000..55db018 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim12.png differ diff --git a/ktx/external/basisu/test_files/kodim13.png b/ktx/external/basisu/test_files/kodim13.png new file mode 100644 index 0000000..b35c9d3 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim13.png differ diff --git a/ktx/external/basisu/test_files/kodim14.png b/ktx/external/basisu/test_files/kodim14.png new file mode 100644 index 0000000..e7b3283 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim14.png differ diff --git a/ktx/external/basisu/test_files/kodim15.png b/ktx/external/basisu/test_files/kodim15.png new file mode 100644 index 0000000..9c5eacf Binary files /dev/null and b/ktx/external/basisu/test_files/kodim15.png differ diff --git a/ktx/external/basisu/test_files/kodim16.png b/ktx/external/basisu/test_files/kodim16.png new file mode 100644 index 0000000..54b0d0d Binary files /dev/null and b/ktx/external/basisu/test_files/kodim16.png differ diff --git a/ktx/external/basisu/test_files/kodim17.png b/ktx/external/basisu/test_files/kodim17.png new file mode 100644 index 0000000..5e4583e Binary files /dev/null and b/ktx/external/basisu/test_files/kodim17.png differ diff --git a/ktx/external/basisu/test_files/kodim18.png b/ktx/external/basisu/test_files/kodim18.png new file mode 100644 index 0000000..48097fc Binary files /dev/null and b/ktx/external/basisu/test_files/kodim18.png differ diff --git a/ktx/external/basisu/test_files/kodim19.png b/ktx/external/basisu/test_files/kodim19.png new file mode 100644 index 0000000..e359a32 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim19.png differ diff --git a/ktx/external/basisu/test_files/kodim20.png b/ktx/external/basisu/test_files/kodim20.png new file mode 100644 index 0000000..86e2837 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim20.png differ diff --git a/ktx/external/basisu/test_files/kodim21.png b/ktx/external/basisu/test_files/kodim21.png new file mode 100644 index 0000000..ccd4c3f Binary files /dev/null and b/ktx/external/basisu/test_files/kodim21.png differ diff --git a/ktx/external/basisu/test_files/kodim22.png b/ktx/external/basisu/test_files/kodim22.png new file mode 100644 index 0000000..52bcd47 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim22.png differ diff --git a/ktx/external/basisu/test_files/kodim23.png b/ktx/external/basisu/test_files/kodim23.png new file mode 100644 index 0000000..ff22e83 Binary files /dev/null and b/ktx/external/basisu/test_files/kodim23.png differ diff --git a/ktx/external/basisu/test_files/kodim24.png b/ktx/external/basisu/test_files/kodim24.png new file mode 100644 index 0000000..85bd64f Binary files /dev/null and b/ktx/external/basisu/test_files/kodim24.png differ diff --git a/ktx/external/basisu/test_files/white_1x1.png b/ktx/external/basisu/test_files/white_1x1.png new file mode 100644 index 0000000..7fbca9a Binary files /dev/null and b/ktx/external/basisu/test_files/white_1x1.png differ diff --git a/ktx/external/basisu/test_files/wikipedia.png b/ktx/external/basisu/test_files/wikipedia.png new file mode 100644 index 0000000..4190fcc Binary files /dev/null and b/ktx/external/basisu/test_files/wikipedia.png differ diff --git a/ktx/external/basisu/transcoder/basisu.h b/ktx/external/basisu/transcoder/basisu.h new file mode 100644 index 0000000..5b9890d --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu.h @@ -0,0 +1,504 @@ +// basisu.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// Important: If compiling with gcc, be sure strict aliasing is disabled: -fno-strict-aliasing +// +// 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. +#pragma once + +#ifdef _MSC_VER + + #pragma warning (disable : 4201) + #pragma warning (disable : 4127) // warning C4127: conditional expression is constant + #pragma warning (disable : 4530) // C++ exception handler used, but unwind semantics are not enabled. + + // Slamming this off always for v1.16 because we've gotten rid of most std containers. + #ifndef BASISU_NO_ITERATOR_DEBUG_LEVEL + #define BASISU_NO_ITERATOR_DEBUG_LEVEL (1) + #endif + + #ifndef BASISU_NO_ITERATOR_DEBUG_LEVEL + //#define _HAS_ITERATOR_DEBUGGING 0 + + #if defined(_DEBUG) || defined(DEBUG) + // This is madness, but we need to disable iterator debugging in debug builds or the encoder is unsable because MSVC's iterator debugging implementation is totally broken. + #ifndef _ITERATOR_DEBUG_LEVEL + #define _ITERATOR_DEBUG_LEVEL 1 + #endif + #ifndef _SECURE_SCL + #define _SECURE_SCL 1 + #endif + #else // defined(_DEBUG) || defined(DEBUG) + #ifndef _SECURE_SCL + #define _SECURE_SCL 0 + #endif + #ifndef _ITERATOR_DEBUG_LEVEL + #define _ITERATOR_DEBUG_LEVEL 0 + #endif + #endif // defined(_DEBUG) || defined(DEBUG) + + #endif // BASISU_NO_ITERATOR_DEBUG_LEVEL + +#endif // _MSC_VER +#if !__clang__ && __GNUC__ // Grumble clang grumble +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wclass-memaccess" +#endif // __GNUC__ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "basisu_containers.h" + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +#ifdef _WIN32 +#define strcasecmp _stricmp +#endif + +// Set to one to enable debug printf()'s when any errors occur, for development/debugging. Especially useful for WebGL development. +#ifndef BASISU_FORCE_DEVEL_MESSAGES +#define BASISU_FORCE_DEVEL_MESSAGES 0 +#endif + +#define BASISU_NOTE_UNUSED(x) (void)(x) +#define BASISU_ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) +#define BASISU_NO_EQUALS_OR_COPY_CONSTRUCT(x) x(const x &) = delete; x& operator= (const x &) = delete; +#define BASISU_ASSUME(x) static_assert(x, #x); +#define BASISU_OFFSETOF(s, m) offsetof(s, m) +#define BASISU_STRINGIZE(x) #x +#define BASISU_STRINGIZE2(x) BASISU_STRINGIZE(x) + +#if BASISU_FORCE_DEVEL_MESSAGES + #define BASISU_DEVEL_ERROR(...) do { basisu::debug_printf(__VA_ARGS__); } while(0) +#else + #define BASISU_DEVEL_ERROR(...) +#endif + +namespace basisu +{ + // Types/utilities + +#ifdef _WIN32 + const char BASISU_PATH_SEPERATOR_CHAR = '\\'; +#else + const char BASISU_PATH_SEPERATOR_CHAR = '/'; +#endif + + typedef basisu::vector uint8_vec; + typedef basisu::vector int16_vec; + typedef basisu::vector uint16_vec; + typedef basisu::vector uint_vec; + typedef basisu::vector uint64_vec; + typedef basisu::vector int_vec; + typedef basisu::vector bool_vec; + + void enable_debug_printf(bool enabled); + void debug_printf(const char *pFmt, ...); + + + template inline void clear_obj(T& obj) { memset((void*)&obj, 0, sizeof(obj)); } + + template inline T0 lerp(T0 a, T0 b, T1 c) { return a + (b - a) * c; } + + template inline S maximum(S a, S b) { return (a > b) ? a : b; } + template inline S maximum(S a, S b, S c) { return maximum(maximum(a, b), c); } + template inline S maximum(S a, S b, S c, S d) { return maximum(maximum(maximum(a, b), c), d); } + + template inline S minimum(S a, S b) { return (a < b) ? a : b; } + template inline S minimum(S a, S b, S c) { return minimum(minimum(a, b), c); } + template inline S minimum(S a, S b, S c, S d) { return minimum(minimum(minimum(a, b), c), d); } + + inline float clampf(float value, float low, float high) { if (value < low) value = low; else if (value > high) value = high; return value; } + inline float saturate(float value) { return clampf(value, 0, 1.0f); } + inline uint8_t minimumub(uint8_t a, uint8_t b) { return (a < b) ? a : b; } + inline uint32_t minimumu(uint32_t a, uint32_t b) { return (a < b) ? a : b; } + inline int32_t minimumi(int32_t a, int32_t b) { return (a < b) ? a : b; } + inline float minimumf(float a, float b) { return (a < b) ? a : b; } + inline uint8_t maximumub(uint8_t a, uint8_t b) { return (a > b) ? a : b; } + inline uint32_t maximumu(uint32_t a, uint32_t b) { return (a > b) ? a : b; } + inline int32_t maximumi(int32_t a, int32_t b) { return (a > b) ? a : b; } + inline float maximumf(float a, float b) { return (a > b) ? a : b; } + inline int squarei(int i) { return i * i; } + inline float squaref(float i) { return i * i; } + template inline T square(T a) { return a * a; } + + template inline S clamp(S value, S low, S high) { return (value < low) ? low : ((value > high) ? high : value); } + + inline uint32_t iabs(int32_t i) { return (i < 0) ? static_cast(-i) : static_cast(i); } + inline uint64_t iabs64(int64_t i) { return (i < 0) ? static_cast(-i) : static_cast(i); } + + template inline void clear_vector(T &vec) { vec.erase(vec.begin(), vec.end()); } + template inline typename T::value_type *enlarge_vector(T &vec, size_t n) { size_t cs = vec.size(); vec.resize(cs + n); return &vec[cs]; } + + inline bool is_pow2(uint32_t x) { return x && ((x & (x - 1U)) == 0U); } + inline bool is_pow2(uint64_t x) { return x && ((x & (x - 1U)) == 0U); } + + template inline T open_range_check(T v, T minv, T maxv) { assert(v >= minv && v < maxv); BASISU_NOTE_UNUSED(minv); BASISU_NOTE_UNUSED(maxv); return v; } + template inline T open_range_check(T v, T maxv) { assert(v < maxv); BASISU_NOTE_UNUSED(maxv); return v; } + + inline uint32_t total_bits(uint32_t v) { uint32_t l = 0; for ( ; v > 0U; ++l) v >>= 1; return l; } + + template inline T saturate(T val) { return clamp(val, 0.0f, 1.0f); } + + template inline void append_vector(T &vec, const R *pObjs, size_t n) + { + if (n) + { + if (vec.size()) + { + assert((pObjs + n) <= vec.begin() || (pObjs >= vec.end())); + } + const size_t cur_s = vec.size(); + vec.resize(cur_s + n); + memcpy(&vec[cur_s], pObjs, sizeof(R) * n); + } + } + + template inline void append_vector(T &vec, const T &other_vec) + { + assert(&vec != &other_vec); + if (other_vec.size()) + append_vector(vec, &other_vec[0], other_vec.size()); + } + + template inline void vector_ensure_element_is_valid(T &vec, size_t idx) + { + if (idx >= vec.size()) + vec.resize(idx + 1); + } + + template inline void vector_sort(T &vec) + { + if (vec.size()) + std::sort(vec.begin(), vec.end()); + } + + template inline bool unordered_set_contains(T& set, const U&obj) + { + return set.find(obj) != set.end(); + } + + template int vector_find(const T &vec, const typename T::value_type &obj) + { + assert(vec.size() <= INT_MAX); + for (size_t i = 0; i < vec.size(); i++) + if (vec[i] == obj) + return static_cast(i); + return -1; + } + + template void vector_set_all(T &vec, const typename T::value_type &obj) + { + for (size_t i = 0; i < vec.size(); i++) + vec[i] = obj; + } + + inline uint64_t read_be64(const void *p) + { + uint64_t val = 0; + for (uint32_t i = 0; i < 8; i++) + val |= (static_cast(static_cast(p)[7 - i]) << (i * 8)); + return val; + } + + inline void write_be64(void *p, uint64_t x) + { + for (uint32_t i = 0; i < 8; i++) + static_cast(p)[7 - i] = static_cast(x >> (i * 8)); + } + + static inline uint16_t byteswap16(uint16_t x) { return static_cast((x << 8) | (x >> 8)); } + static inline uint32_t byteswap32(uint32_t x) { return ((x << 24) | ((x << 8) & 0x00FF0000) | ((x >> 8) & 0x0000FF00) | (x >> 24)); } + + inline uint32_t floor_log2i(uint32_t v) + { + uint32_t b = 0; + for (; v > 1U; ++b) + v >>= 1; + return b; + } + + inline uint32_t ceil_log2i(uint32_t v) + { + uint32_t b = floor_log2i(v); + if ((b != 32) && (v > (1U << b))) + ++b; + return b; + } + + inline int posmod(int x, int y) + { + if (x >= 0) + return (x < y) ? x : (x % y); + int m = (-x) % y; + return (m != 0) ? (y - m) : m; + } + + inline bool do_excl_ranges_overlap(int la, int ha, int lb, int hb) + { + assert(la < ha && lb < hb); + if ((ha <= lb) || (la >= hb)) return false; + return true; + } + + static inline uint32_t read_le_dword(const uint8_t *pBytes) + { + return (pBytes[3] << 24U) | (pBytes[2] << 16U) | (pBytes[1] << 8U) | (pBytes[0]); + } + + static inline void write_le_dword(uint8_t* pBytes, uint32_t val) + { + pBytes[0] = (uint8_t)val; + pBytes[1] = (uint8_t)(val >> 8U); + pBytes[2] = (uint8_t)(val >> 16U); + pBytes[3] = (uint8_t)(val >> 24U); + } + + // Always little endian 1-8 byte unsigned int + template + struct packed_uint + { + uint8_t m_bytes[NumBytes]; + + inline packed_uint() { static_assert(NumBytes <= sizeof(uint64_t), "Invalid NumBytes"); } + inline packed_uint(uint64_t v) { *this = v; } + inline packed_uint(const packed_uint& other) { *this = other; } + + inline packed_uint& operator= (uint64_t v) + { + for (uint32_t i = 0; i < NumBytes; i++) + m_bytes[i] = static_cast(v >> (i * 8)); + return *this; + } + + inline packed_uint& operator= (const packed_uint& rhs) + { + memcpy(m_bytes, rhs.m_bytes, sizeof(m_bytes)); + return *this; + } +// The casts for > 4 bytes are strange. Has been reported to basis_universal. +// See https://github.com/BinomialLLC/basis_universal/issues/306. +// Since I don't know the intention or correct fix, suppress the associated +// warning. We get this only in CI when it is compiling for iOS build-only +// device. +#if __clang__ + #pragma clang diagnostic push + #if __has_warning("-Wshorten-64-to-32") + #pragma clang diagnostic ignored "-Wshorten-64-to-32" + #endif +#endif + inline operator uint32_t() const + { + switch (NumBytes) + { + case 1: + { + return m_bytes[0]; + } + case 2: + { + return (m_bytes[1] << 8U) | m_bytes[0]; + } + case 3: + { + return (m_bytes[2] << 16U) | (m_bytes[1] << 8U) | m_bytes[0]; + } + case 4: + { + return read_le_dword(m_bytes); + } + case 5: + { + uint32_t l = read_le_dword(m_bytes); + uint32_t h = m_bytes[4]; + // I'm pretty sure compilers just return the low 32-bits + // when casting a 64-bit value to 32-bit so simply + // returning l should work. But in case I'm missing + // something useful that is being done, I'm just adding + // casts to avoid the compiler warnings. See + // https://github.com/BinomialLLC/basis_universal/issues/306. + return static_cast(static_cast(l) | (static_cast(h) << 32U)); + } + case 6: + { + uint32_t l = read_le_dword(m_bytes); + uint32_t h = (m_bytes[5] << 8U) | m_bytes[4]; + return static_cast(static_cast(l) | (static_cast(h) << 32U)); + } + case 7: + { + uint32_t l = read_le_dword(m_bytes); + uint32_t h = (m_bytes[6] << 16U) | (m_bytes[5] << 8U) | m_bytes[4]; + return static_cast(static_cast(l) | (static_cast(h) << 32U)); + } + case 8: + { + uint32_t l = read_le_dword(m_bytes); + uint32_t h = read_le_dword(m_bytes + 4); + return static_cast(static_cast(l) | (static_cast(h) << 32U)); + } + default: + { + assert(0); + return 0; + } + } + } + }; +#if __clang__ + #pragma clang diagnostic pop +#endif + + enum eZero { cZero }; + enum eNoClamp { cNoClamp }; + + // Rice/Huffman entropy coding + + // This is basically Deflate-style canonical Huffman, except we allow for a lot more symbols. + enum + { + cHuffmanMaxSupportedCodeSize = 16, cHuffmanMaxSupportedInternalCodeSize = 31, + cHuffmanFastLookupBits = 10, + cHuffmanMaxSymsLog2 = 14, cHuffmanMaxSyms = 1 << cHuffmanMaxSymsLog2, + + // Small zero runs + cHuffmanSmallZeroRunSizeMin = 3, cHuffmanSmallZeroRunSizeMax = 10, cHuffmanSmallZeroRunExtraBits = 3, + + // Big zero run + cHuffmanBigZeroRunSizeMin = 11, cHuffmanBigZeroRunSizeMax = 138, cHuffmanBigZeroRunExtraBits = 7, + + // Small non-zero run + cHuffmanSmallRepeatSizeMin = 3, cHuffmanSmallRepeatSizeMax = 6, cHuffmanSmallRepeatExtraBits = 2, + + // Big non-zero run + cHuffmanBigRepeatSizeMin = 7, cHuffmanBigRepeatSizeMax = 134, cHuffmanBigRepeatExtraBits = 7, + + cHuffmanTotalCodelengthCodes = 21, cHuffmanSmallZeroRunCode = 17, cHuffmanBigZeroRunCode = 18, cHuffmanSmallRepeatCode = 19, cHuffmanBigRepeatCode = 20 + }; + + static const uint8_t g_huffman_sorted_codelength_codes[] = { cHuffmanSmallZeroRunCode, cHuffmanBigZeroRunCode, cHuffmanSmallRepeatCode, cHuffmanBigRepeatCode, 0, 8, 7, 9, 6, 0xA, 5, 0xB, 4, 0xC, 3, 0xD, 2, 0xE, 1, 0xF, 0x10 }; + const uint32_t cHuffmanTotalSortedCodelengthCodes = sizeof(g_huffman_sorted_codelength_codes) / sizeof(g_huffman_sorted_codelength_codes[0]); + + // GPU texture formats + + enum class texture_format + { + cInvalidTextureFormat = -1, + + // Block-based formats + cETC1, // ETC1 + cETC1S, // ETC1 (subset: diff colors only, no subblocks) + cETC2_RGB, // ETC2 color block (basisu doesn't support ETC2 planar/T/H modes - just basic ETC1) + cETC2_RGBA, // ETC2 EAC alpha block followed by ETC2 color block + cETC2_ALPHA, // ETC2 EAC alpha block + cBC1, // DXT1 + cBC3, // DXT5 (BC4/DXT5A block followed by a BC1/DXT1 block) + cBC4, // DXT5A + cBC5, // 3DC/DXN (two BC4/DXT5A blocks) + cBC7, + cASTC4x4, // LDR only + cPVRTC1_4_RGB, + cPVRTC1_4_RGBA, + cATC_RGB, + cATC_RGBA_INTERPOLATED_ALPHA, + cFXT1_RGB, + cPVRTC2_4_RGBA, + cETC2_R11_EAC, + cETC2_RG11_EAC, + cUASTC4x4, + cBC1_NV, + cBC1_AMD, + + // Uncompressed/raw pixels + cRGBA32, + cRGB565, + cBGR565, + cRGBA4444, + cABGR4444 + }; + + inline uint32_t get_bytes_per_block(texture_format fmt) + { + switch (fmt) + { + case texture_format::cETC1: + case texture_format::cETC1S: + case texture_format::cETC2_RGB: + case texture_format::cETC2_ALPHA: + case texture_format::cBC1: + case texture_format::cBC1_NV: + case texture_format::cBC1_AMD: + case texture_format::cBC4: + case texture_format::cPVRTC1_4_RGB: + case texture_format::cPVRTC1_4_RGBA: + case texture_format::cATC_RGB: + case texture_format::cPVRTC2_4_RGBA: + case texture_format::cETC2_R11_EAC: + return 8; + case texture_format::cRGBA32: + return sizeof(uint32_t) * 16; + default: + break; + } + return 16; + } + + inline uint32_t get_qwords_per_block(texture_format fmt) + { + return get_bytes_per_block(fmt) >> 3; + } + + inline uint32_t get_block_width(texture_format fmt) + { + BASISU_NOTE_UNUSED(fmt); + switch (fmt) + { + case texture_format::cFXT1_RGB: + return 8; + default: + break; + } + return 4; + } + + inline uint32_t get_block_height(texture_format fmt) + { + BASISU_NOTE_UNUSED(fmt); + return 4; + } + +} // namespace basisu +#if !__clang__ && __GNUC__ + +#pragma GCC diagnostic pop +#endif diff --git a/ktx/external/basisu/transcoder/basisu_containers.h b/ktx/external/basisu/transcoder/basisu_containers.h new file mode 100644 index 0000000..07c7814 --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_containers.h @@ -0,0 +1,1997 @@ +// basisu_containers.h +#pragma once +#include +#include +#include +#include +#include + +#if !__clang__ && __GNUC__ // Grumble clang grumble +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-value" +#pragma GCC diagnostic ignored "-Wclass-memaccess" +#elif __clang__ +#if __has_warning("-Wdeprecated-builtins") +#pragma clang diagnostic ignored "-Wdeprecated-builtins" +#endif +#endif + +#if defined(__linux__) && !defined(ANDROID) +// Only for malloc_usable_size() in basisu_containers_impl.h +#include +#define HAS_MALLOC_USABLE_SIZE 1 +#endif + +// Set to 1 to always check vector operator[], front(), and back() even in release. +#define BASISU_VECTOR_FORCE_CHECKING 0 + +// If 1, the vector container will not query the CRT to get the size of resized memory blocks. +#define BASISU_VECTOR_DETERMINISTIC 1 + +#ifdef _MSC_VER +#define BASISU_FORCE_INLINE __forceinline +#else +#define BASISU_FORCE_INLINE inline +#endif + +namespace basisu +{ + enum { cInvalidIndex = -1 }; + + namespace helpers + { + inline bool is_power_of_2(uint32_t x) { return x && ((x & (x - 1U)) == 0U); } + inline bool is_power_of_2(uint64_t x) { return x && ((x & (x - 1U)) == 0U); } + template const T& minimum(const T& a, const T& b) { return (b < a) ? b : a; } + template const T& maximum(const T& a, const T& b) { return (a < b) ? b : a; } + + inline uint32_t floor_log2i(uint32_t v) + { + uint32_t l = 0; + while (v > 1U) + { + v >>= 1; + l++; + } + return l; + } + + inline uint32_t next_pow2(uint32_t val) + { + val--; + val |= val >> 16; + val |= val >> 8; + val |= val >> 4; + val |= val >> 2; + val |= val >> 1; + return val + 1; + } + + inline uint64_t next_pow2(uint64_t val) + { + val--; + val |= val >> 32; + val |= val >> 16; + val |= val >> 8; + val |= val >> 4; + val |= val >> 2; + val |= val >> 1; + return val + 1; + } + } // namespace helpers + + template + inline T* construct(T* p) + { + return new (static_cast(p)) T; + } + + template + inline T* construct(T* p, const U& init) + { + return new (static_cast(p)) T(init); + } + + template + inline void construct_array(T* p, size_t n) + { + T* q = p + n; + for (; p != q; ++p) + new (static_cast(p)) T; + } + + template + inline void construct_array(T* p, size_t n, const U& init) + { + T* q = p + n; + for (; p != q; ++p) + new (static_cast(p)) T(init); + } + + template + inline void destruct(T* p) + { + (void)p; + p->~T(); + } + + template inline void destruct_array(T* p, size_t n) + { + T* q = p + n; + for (; p != q; ++p) + p->~T(); + } + + template struct int_traits { enum { cMin = INT32_MIN, cMax = INT32_MAX, cSigned = true }; }; + + template<> struct int_traits { enum { cMin = INT8_MIN, cMax = INT8_MAX, cSigned = true }; }; + template<> struct int_traits { enum { cMin = INT16_MIN, cMax = INT16_MAX, cSigned = true }; }; + template<> struct int_traits { enum { cMin = INT32_MIN, cMax = INT32_MAX, cSigned = true }; }; + + template<> struct int_traits { enum { cMin = 0, cMax = UINT8_MAX, cSigned = false }; }; + template<> struct int_traits { enum { cMin = 0, cMax = UINT16_MAX, cSigned = false }; }; + template<> struct int_traits { enum { cMin = 0, cMax = UINT32_MAX, cSigned = false }; }; + + template + struct scalar_type + { + enum { cFlag = false }; + static inline void construct(T* p) { basisu::construct(p); } + static inline void construct(T* p, const T& init) { basisu::construct(p, init); } + static inline void construct_array(T* p, size_t n) { basisu::construct_array(p, n); } + static inline void destruct(T* p) { basisu::destruct(p); } + static inline void destruct_array(T* p, size_t n) { basisu::destruct_array(p, n); } + }; + + template struct scalar_type + { + enum { cFlag = true }; + static inline void construct(T** p) { memset(p, 0, sizeof(T*)); } + static inline void construct(T** p, T* init) { *p = init; } + static inline void construct_array(T** p, size_t n) { memset(p, 0, sizeof(T*) * n); } + static inline void destruct(T** p) { p; } + static inline void destruct_array(T** p, size_t n) { p, n; } + }; + +#define BASISU_DEFINE_BUILT_IN_TYPE(X) \ + template<> struct scalar_type { \ + enum { cFlag = true }; \ + static inline void construct(X* p) { memset(p, 0, sizeof(X)); } \ + static inline void construct(X* p, const X& init) { memcpy(p, &init, sizeof(X)); } \ + static inline void construct_array(X* p, size_t n) { memset(p, 0, sizeof(X) * n); } \ + static inline void destruct(X* p) { p; } \ + static inline void destruct_array(X* p, size_t n) { p, n; } }; + + BASISU_DEFINE_BUILT_IN_TYPE(bool) + BASISU_DEFINE_BUILT_IN_TYPE(char) + BASISU_DEFINE_BUILT_IN_TYPE(unsigned char) + BASISU_DEFINE_BUILT_IN_TYPE(short) + BASISU_DEFINE_BUILT_IN_TYPE(unsigned short) + BASISU_DEFINE_BUILT_IN_TYPE(int) + BASISU_DEFINE_BUILT_IN_TYPE(unsigned int) + BASISU_DEFINE_BUILT_IN_TYPE(long) + BASISU_DEFINE_BUILT_IN_TYPE(unsigned long) +#ifdef __GNUC__ + BASISU_DEFINE_BUILT_IN_TYPE(long long) + BASISU_DEFINE_BUILT_IN_TYPE(unsigned long long) +#else + BASISU_DEFINE_BUILT_IN_TYPE(__int64) + BASISU_DEFINE_BUILT_IN_TYPE(unsigned __int64) +#endif + BASISU_DEFINE_BUILT_IN_TYPE(float) + BASISU_DEFINE_BUILT_IN_TYPE(double) + BASISU_DEFINE_BUILT_IN_TYPE(long double) + +#undef BASISU_DEFINE_BUILT_IN_TYPE + + template + struct bitwise_movable { enum { cFlag = false }; }; + +#define BASISU_DEFINE_BITWISE_MOVABLE(Q) template<> struct bitwise_movable { enum { cFlag = true }; }; + + template + struct bitwise_copyable { enum { cFlag = false }; }; + +#define BASISU_DEFINE_BITWISE_COPYABLE(Q) template<> struct bitwise_copyable { enum { cFlag = true }; }; + +#define BASISU_IS_POD(T) __is_pod(T) + +#define BASISU_IS_SCALAR_TYPE(T) (scalar_type::cFlag) + +#if defined(__GNUC__) && __GNUC__<5 + #define BASISU_IS_TRIVIALLY_COPYABLE(...) __has_trivial_copy(__VA_ARGS__) +#else + #define BASISU_IS_TRIVIALLY_COPYABLE(...) std::is_trivially_copyable<__VA_ARGS__>::value +#endif + +// TODO: clean this up +#define BASISU_IS_BITWISE_COPYABLE(T) (BASISU_IS_SCALAR_TYPE(T) || BASISU_IS_POD(T) || BASISU_IS_TRIVIALLY_COPYABLE(T) || (bitwise_copyable::cFlag)) + +#define BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(T) (BASISU_IS_BITWISE_COPYABLE(T) || (bitwise_movable::cFlag)) + +#define BASISU_HAS_DESTRUCTOR(T) ((!scalar_type::cFlag) && (!__is_pod(T))) + + typedef char(&yes_t)[1]; + typedef char(&no_t)[2]; + + template yes_t class_test(int U::*); + template no_t class_test(...); + + template struct is_class + { + enum { value = (sizeof(class_test(0)) == sizeof(yes_t)) }; + }; + + template struct is_pointer + { + enum { value = false }; + }; + + template struct is_pointer + { + enum { value = true }; + }; + + struct empty_type { }; + + BASISU_DEFINE_BITWISE_COPYABLE(empty_type); + BASISU_DEFINE_BITWISE_MOVABLE(empty_type); + + template struct rel_ops + { + friend bool operator!=(const T& x, const T& y) { return (!(x == y)); } + friend bool operator> (const T& x, const T& y) { return (y < x); } + friend bool operator<=(const T& x, const T& y) { return (!(y < x)); } + friend bool operator>=(const T& x, const T& y) { return (!(x < y)); } + }; + + struct elemental_vector + { + void* m_p; + uint32_t m_size; + uint32_t m_capacity; + + typedef void (*object_mover)(void* pDst, void* pSrc, uint32_t num); + + bool increase_capacity(uint32_t min_new_capacity, bool grow_hint, uint32_t element_size, object_mover pRelocate, bool nofail); + }; + + template + class vector : public rel_ops< vector > + { + public: + typedef T* iterator; + typedef const T* const_iterator; + typedef T value_type; + typedef T& reference; + typedef const T& const_reference; + typedef T* pointer; + typedef const T* const_pointer; + + inline vector() : + m_p(NULL), + m_size(0), + m_capacity(0) + { + } + + inline vector(uint32_t n, const T& init) : + m_p(NULL), + m_size(0), + m_capacity(0) + { + increase_capacity(n, false); + construct_array(m_p, n, init); + m_size = n; + } + + inline vector(const vector& other) : + m_p(NULL), + m_size(0), + m_capacity(0) + { + increase_capacity(other.m_size, false); + + m_size = other.m_size; + + if (BASISU_IS_BITWISE_COPYABLE(T)) + { + if ((m_p) && (other.m_p)) + memcpy(m_p, other.m_p, m_size * sizeof(T)); + } + else + { + T* pDst = m_p; + const T* pSrc = other.m_p; + for (uint32_t i = m_size; i > 0; i--) + construct(pDst++, *pSrc++); + } + } + + inline explicit vector(size_t size) : + m_p(NULL), + m_size(0), + m_capacity(0) + { + resize(size); + } + + inline ~vector() + { + if (m_p) + { + scalar_type::destruct_array(m_p, m_size); + free(m_p); + } + } + + inline vector& operator= (const vector& other) + { + if (this == &other) + return *this; + + if (m_capacity >= other.m_size) + resize(0); + else + { + clear(); + increase_capacity(other.m_size, false); + } + + if (BASISU_IS_BITWISE_COPYABLE(T)) + { + if ((m_p) && (other.m_p)) + memcpy(m_p, other.m_p, other.m_size * sizeof(T)); + } + else + { + T* pDst = m_p; + const T* pSrc = other.m_p; + for (uint32_t i = other.m_size; i > 0; i--) + construct(pDst++, *pSrc++); + } + + m_size = other.m_size; + + return *this; + } + + BASISU_FORCE_INLINE const T* begin() const { return m_p; } + BASISU_FORCE_INLINE T* begin() { return m_p; } + + BASISU_FORCE_INLINE const T* end() const { return m_p + m_size; } + BASISU_FORCE_INLINE T* end() { return m_p + m_size; } + + BASISU_FORCE_INLINE bool empty() const { return !m_size; } + BASISU_FORCE_INLINE uint32_t size() const { return m_size; } + BASISU_FORCE_INLINE uint32_t size_in_bytes() const { return m_size * sizeof(T); } + BASISU_FORCE_INLINE uint32_t capacity() const { return m_capacity; } + + // operator[] will assert on out of range indices, but in final builds there is (and will never be) any range checking on this method. + //BASISU_FORCE_INLINE const T& operator[] (uint32_t i) const { assert(i < m_size); return m_p[i]; } + //BASISU_FORCE_INLINE T& operator[] (uint32_t i) { assert(i < m_size); return m_p[i]; } + +#if !BASISU_VECTOR_FORCE_CHECKING + BASISU_FORCE_INLINE const T& operator[] (size_t i) const { assert(i < m_size); return m_p[i]; } + BASISU_FORCE_INLINE T& operator[] (size_t i) { assert(i < m_size); return m_p[i]; } +#else + BASISU_FORCE_INLINE const T& operator[] (size_t i) const + { + if (i >= m_size) + { + fprintf(stderr, "operator[] invalid index: %u, max entries %u, type size %u\n", (uint32_t)i, m_size, (uint32_t)sizeof(T)); + abort(); + } + return m_p[i]; + } + BASISU_FORCE_INLINE T& operator[] (size_t i) + { + if (i >= m_size) + { + fprintf(stderr, "operator[] invalid index: %u, max entries %u, type size %u\n", (uint32_t)i, m_size, (uint32_t)sizeof(T)); + abort(); + } + return m_p[i]; + } +#endif + + // at() always includes range checking, even in final builds, unlike operator []. + // The first element is returned if the index is out of range. + BASISU_FORCE_INLINE const T& at(size_t i) const { assert(i < m_size); return (i >= m_size) ? m_p[0] : m_p[i]; } + BASISU_FORCE_INLINE T& at(size_t i) { assert(i < m_size); return (i >= m_size) ? m_p[0] : m_p[i]; } + +#if !BASISU_VECTOR_FORCE_CHECKING + BASISU_FORCE_INLINE const T& front() const { assert(m_size); return m_p[0]; } + BASISU_FORCE_INLINE T& front() { assert(m_size); return m_p[0]; } + + BASISU_FORCE_INLINE const T& back() const { assert(m_size); return m_p[m_size - 1]; } + BASISU_FORCE_INLINE T& back() { assert(m_size); return m_p[m_size - 1]; } +#else + BASISU_FORCE_INLINE const T& front() const + { + if (!m_size) + { + fprintf(stderr, "front: vector is empty, type size %u\n", (uint32_t)sizeof(T)); + abort(); + } + return m_p[0]; + } + BASISU_FORCE_INLINE T& front() + { + if (!m_size) + { + fprintf(stderr, "front: vector is empty, type size %u\n", (uint32_t)sizeof(T)); + abort(); + } + return m_p[0]; + } + + BASISU_FORCE_INLINE const T& back() const + { + if(!m_size) + { + fprintf(stderr, "back: vector is empty, type size %u\n", (uint32_t)sizeof(T)); + abort(); + } + return m_p[m_size - 1]; + } + BASISU_FORCE_INLINE T& back() + { + if (!m_size) + { + fprintf(stderr, "back: vector is empty, type size %u\n", (uint32_t)sizeof(T)); + abort(); + } + return m_p[m_size - 1]; + } +#endif + + BASISU_FORCE_INLINE const T* get_ptr() const { return m_p; } + BASISU_FORCE_INLINE T* get_ptr() { return m_p; } + + BASISU_FORCE_INLINE const T* data() const { return m_p; } + BASISU_FORCE_INLINE T* data() { return m_p; } + + // clear() sets the container to empty, then frees the allocated block. + inline void clear() + { + if (m_p) + { + scalar_type::destruct_array(m_p, m_size); + free(m_p); + m_p = NULL; + m_size = 0; + m_capacity = 0; + } + } + + inline void clear_no_destruction() + { + if (m_p) + { + free(m_p); + m_p = NULL; + m_size = 0; + m_capacity = 0; + } + } + + inline void reserve(size_t new_capacity_size_t) + { + if (new_capacity_size_t > UINT32_MAX) + { + assert(0); + return; + } + + uint32_t new_capacity = (uint32_t)new_capacity_size_t; + + if (new_capacity > m_capacity) + increase_capacity(new_capacity, false); + else if (new_capacity < m_capacity) + { + // Must work around the lack of a "decrease_capacity()" method. + // This case is rare enough in practice that it's probably not worth implementing an optimized in-place resize. + vector tmp; + tmp.increase_capacity(helpers::maximum(m_size, new_capacity), false); + tmp = *this; + swap(tmp); + } + } + + inline bool try_reserve(size_t new_capacity_size_t) + { + if (new_capacity_size_t > UINT32_MAX) + { + assert(0); + return false; + } + + uint32_t new_capacity = (uint32_t)new_capacity_size_t; + + if (new_capacity > m_capacity) + { + if (!increase_capacity(new_capacity, false)) + return false; + } + else if (new_capacity < m_capacity) + { + // Must work around the lack of a "decrease_capacity()" method. + // This case is rare enough in practice that it's probably not worth implementing an optimized in-place resize. + vector tmp; + tmp.increase_capacity(helpers::maximum(m_size, new_capacity), false); + tmp = *this; + swap(tmp); + } + + return true; + } + + // resize(0) sets the container to empty, but does not free the allocated block. + inline void resize(size_t new_size_size_t, bool grow_hint = false) + { + if (new_size_size_t > UINT32_MAX) + { + assert(0); + return; + } + + uint32_t new_size = (uint32_t)new_size_size_t; + + if (m_size != new_size) + { + if (new_size < m_size) + scalar_type::destruct_array(m_p + new_size, m_size - new_size); + else + { + if (new_size > m_capacity) + increase_capacity(new_size, (new_size == (m_size + 1)) || grow_hint); + + scalar_type::construct_array(m_p + m_size, new_size - m_size); + } + + m_size = new_size; + } + } + + inline bool try_resize(size_t new_size_size_t, bool grow_hint = false) + { + if (new_size_size_t > UINT32_MAX) + { + assert(0); + return false; + } + + uint32_t new_size = (uint32_t)new_size_size_t; + + if (m_size != new_size) + { + if (new_size < m_size) + scalar_type::destruct_array(m_p + new_size, m_size - new_size); + else + { + if (new_size > m_capacity) + { + if (!increase_capacity(new_size, (new_size == (m_size + 1)) || grow_hint, true)) + return false; + } + + scalar_type::construct_array(m_p + m_size, new_size - m_size); + } + + m_size = new_size; + } + + return true; + } + + // If size >= capacity/2, reset() sets the container's size to 0 but doesn't free the allocated block (because the container may be similarly loaded in the future). + // Otherwise it blows away the allocated block. See http://www.codercorner.com/blog/?p=494 + inline void reset() + { + if (m_size >= (m_capacity >> 1)) + resize(0); + else + clear(); + } + + inline T* enlarge(uint32_t i) + { + uint32_t cur_size = m_size; + resize(cur_size + i, true); + return get_ptr() + cur_size; + } + + inline T* try_enlarge(uint32_t i) + { + uint32_t cur_size = m_size; + if (!try_resize(cur_size + i, true)) + return NULL; + return get_ptr() + cur_size; + } + + BASISU_FORCE_INLINE void push_back(const T& obj) + { + assert(!m_p || (&obj < m_p) || (&obj >= (m_p + m_size))); + + if (m_size >= m_capacity) + increase_capacity(m_size + 1, true); + + scalar_type::construct(m_p + m_size, obj); + m_size++; + } + + inline bool try_push_back(const T& obj) + { + assert(!m_p || (&obj < m_p) || (&obj >= (m_p + m_size))); + + if (m_size >= m_capacity) + { + if (!increase_capacity(m_size + 1, true, true)) + return false; + } + + scalar_type::construct(m_p + m_size, obj); + m_size++; + + return true; + } + + inline void push_back_value(T obj) + { + if (m_size >= m_capacity) + increase_capacity(m_size + 1, true); + + scalar_type::construct(m_p + m_size, obj); + m_size++; + } + + inline void pop_back() + { + assert(m_size); + + if (m_size) + { + m_size--; + scalar_type::destruct(&m_p[m_size]); + } + } + + inline void insert(uint32_t index, const T* p, uint32_t n) + { + assert(index <= m_size); + if (!n) + return; + + const uint32_t orig_size = m_size; + resize(m_size + n, true); + + const uint32_t num_to_move = orig_size - index; + + if (BASISU_IS_BITWISE_COPYABLE(T)) + { + // This overwrites the destination object bits, but bitwise copyable means we don't need to worry about destruction. + memmove(m_p + index + n, m_p + index, sizeof(T) * num_to_move); + } + else + { + const T* pSrc = m_p + orig_size - 1; + T* pDst = const_cast(pSrc) + n; + + for (uint32_t i = 0; i < num_to_move; i++) + { + assert((pDst - m_p) < (int)m_size); + *pDst-- = *pSrc--; + } + } + + T* pDst = m_p + index; + + if (BASISU_IS_BITWISE_COPYABLE(T)) + { + // This copies in the new bits, overwriting the existing objects, which is OK for copyable types that don't need destruction. + memcpy(pDst, p, sizeof(T) * n); + } + else + { + for (uint32_t i = 0; i < n; i++) + { + assert((pDst - m_p) < (int)m_size); + *pDst++ = *p++; + } + } + } + + inline void insert(T* p, const T& obj) + { + int64_t ofs = p - begin(); + if ((ofs < 0) || (ofs > UINT32_MAX)) + { + assert(0); + return; + } + + insert((uint32_t)ofs, &obj, 1); + } + + // push_front() isn't going to be very fast - it's only here for usability. + inline void push_front(const T& obj) + { + insert(0, &obj, 1); + } + + vector& append(const vector& other) + { + if (other.m_size) + insert(m_size, &other[0], other.m_size); + return *this; + } + + vector& append(const T* p, uint32_t n) + { + if (n) + insert(m_size, p, n); + return *this; + } + + inline void erase(uint32_t start, uint32_t n) + { + assert((start + n) <= m_size); + if ((start + n) > m_size) + return; + + if (!n) + return; + + const uint32_t num_to_move = m_size - (start + n); + + T* pDst = m_p + start; + + const T* pSrc = m_p + start + n; + + if (BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(T)) + { + // This test is overly cautious. + if ((!BASISU_IS_BITWISE_COPYABLE(T)) || (BASISU_HAS_DESTRUCTOR(T))) + { + // Type has been marked explictly as bitwise movable, which means we can move them around but they may need to be destructed. + // First destroy the erased objects. + scalar_type::destruct_array(pDst, n); + } + + // Copy "down" the objects to preserve, filling in the empty slots. + memmove(pDst, pSrc, num_to_move * sizeof(T)); + } + else + { + // Type is not bitwise copyable or movable. + // Move them down one at a time by using the equals operator, and destroying anything that's left over at the end. + T* pDst_end = pDst + num_to_move; + while (pDst != pDst_end) + *pDst++ = *pSrc++; + + scalar_type::destruct_array(pDst_end, n); + } + + m_size -= n; + } + + inline void erase(uint32_t index) + { + erase(index, 1); + } + + inline void erase(T* p) + { + assert((p >= m_p) && (p < (m_p + m_size))); + erase(static_cast(p - m_p)); + } + + inline void erase(T *pFirst, T *pEnd) + { + assert(pFirst <= pEnd); + assert(pFirst >= begin() && pFirst <= end()); + assert(pEnd >= begin() && pEnd <= end()); + + int64_t ofs = pFirst - begin(); + if ((ofs < 0) || (ofs > UINT32_MAX)) + { + assert(0); + return; + } + + int64_t n = pEnd - pFirst; + if ((n < 0) || (n > UINT32_MAX)) + { + assert(0); + return; + } + + erase((uint32_t)ofs, (uint32_t)n); + } + + void erase_unordered(uint32_t index) + { + assert(index < m_size); + + if ((index + 1) < m_size) + (*this)[index] = back(); + + pop_back(); + } + + inline bool operator== (const vector& rhs) const + { + if (m_size != rhs.m_size) + return false; + else if (m_size) + { + if (scalar_type::cFlag) + return memcmp(m_p, rhs.m_p, sizeof(T) * m_size) == 0; + else + { + const T* pSrc = m_p; + const T* pDst = rhs.m_p; + for (uint32_t i = m_size; i; i--) + if (!(*pSrc++ == *pDst++)) + return false; + } + } + + return true; + } + + inline bool operator< (const vector& rhs) const + { + const uint32_t min_size = helpers::minimum(m_size, rhs.m_size); + + const T* pSrc = m_p; + const T* pSrc_end = m_p + min_size; + const T* pDst = rhs.m_p; + + while ((pSrc < pSrc_end) && (*pSrc == *pDst)) + { + pSrc++; + pDst++; + } + + if (pSrc < pSrc_end) + return *pSrc < *pDst; + + return m_size < rhs.m_size; + } + + inline void swap(vector& other) + { + std::swap(m_p, other.m_p); + std::swap(m_size, other.m_size); + std::swap(m_capacity, other.m_capacity); + } + + inline void sort() + { + std::sort(begin(), end()); + } + + inline void unique() + { + if (!empty()) + { + sort(); + + resize(std::unique(begin(), end()) - begin()); + } + } + + inline void reverse() + { + uint32_t j = m_size >> 1; + for (uint32_t i = 0; i < j; i++) + std::swap(m_p[i], m_p[m_size - 1 - i]); + } + + inline int find(const T& key) const + { + const T* p = m_p; + const T* p_end = m_p + m_size; + + uint32_t index = 0; + + while (p != p_end) + { + if (key == *p) + return index; + + p++; + index++; + } + + return cInvalidIndex; + } + + inline int find_sorted(const T& key) const + { + if (m_size) + { + // Uniform binary search - Knuth Algorithm 6.2.1 U, unrolled twice. + int i = ((m_size + 1) >> 1) - 1; + int m = m_size; + + for (; ; ) + { + assert(i >= 0 && i < (int)m_size); + const T* pKey_i = m_p + i; + int cmp = key < *pKey_i; +#if defined(_DEBUG) || defined(DEBUG) + int cmp2 = *pKey_i < key; + assert((cmp != cmp2) || (key == *pKey_i)); +#endif + if ((!cmp) && (key == *pKey_i)) return i; + m >>= 1; + if (!m) break; + cmp = -cmp; + i += (((m + 1) >> 1) ^ cmp) - cmp; + if (i < 0) + break; + + assert(i >= 0 && i < (int)m_size); + pKey_i = m_p + i; + cmp = key < *pKey_i; +#if defined(_DEBUG) || defined(DEBUG) + cmp2 = *pKey_i < key; + assert((cmp != cmp2) || (key == *pKey_i)); +#endif + if ((!cmp) && (key == *pKey_i)) return i; + m >>= 1; + if (!m) break; + cmp = -cmp; + i += (((m + 1) >> 1) ^ cmp) - cmp; + if (i < 0) + break; + } + } + + return cInvalidIndex; + } + + template + inline int find_sorted(const T& key, Q less_than) const + { + if (m_size) + { + // Uniform binary search - Knuth Algorithm 6.2.1 U, unrolled twice. + int i = ((m_size + 1) >> 1) - 1; + int m = m_size; + + for (; ; ) + { + assert(i >= 0 && i < (int)m_size); + const T* pKey_i = m_p + i; + int cmp = less_than(key, *pKey_i); + if ((!cmp) && (!less_than(*pKey_i, key))) return i; + m >>= 1; + if (!m) break; + cmp = -cmp; + i += (((m + 1) >> 1) ^ cmp) - cmp; + if (i < 0) + break; + + assert(i >= 0 && i < (int)m_size); + pKey_i = m_p + i; + cmp = less_than(key, *pKey_i); + if ((!cmp) && (!less_than(*pKey_i, key))) return i; + m >>= 1; + if (!m) break; + cmp = -cmp; + i += (((m + 1) >> 1) ^ cmp) - cmp; + if (i < 0) + break; + } + } + + return cInvalidIndex; + } + + inline uint32_t count_occurences(const T& key) const + { + uint32_t c = 0; + + const T* p = m_p; + const T* p_end = m_p + m_size; + + while (p != p_end) + { + if (key == *p) + c++; + + p++; + } + + return c; + } + + inline void set_all(const T& o) + { + if ((sizeof(T) == 1) && (scalar_type::cFlag)) + memset(m_p, *reinterpret_cast(&o), m_size); + else + { + T* pDst = m_p; + T* pDst_end = pDst + m_size; + while (pDst != pDst_end) + *pDst++ = o; + } + } + + // Caller assumes ownership of the heap block associated with the container. Container is cleared. + inline void* assume_ownership() + { + T* p = m_p; + m_p = NULL; + m_size = 0; + m_capacity = 0; + return p; + } + + // Caller is granting ownership of the indicated heap block. + // Block must have size constructed elements, and have enough room for capacity elements. + // The block must have been allocated using malloc(). + // Important: This method is used in Basis Universal. If you change how this container allocates memory, you'll need to change any users of this method. + inline bool grant_ownership(T* p, uint32_t size, uint32_t capacity) + { + // To to prevent the caller from obviously shooting themselves in the foot. + if (((p + capacity) > m_p) && (p < (m_p + m_capacity))) + { + // Can grant ownership of a block inside the container itself! + assert(0); + return false; + } + + if (size > capacity) + { + assert(0); + return false; + } + + if (!p) + { + if (capacity) + { + assert(0); + return false; + } + } + else if (!capacity) + { + assert(0); + return false; + } + + clear(); + m_p = p; + m_size = size; + m_capacity = capacity; + return true; + } + + private: + T* m_p; + uint32_t m_size; + uint32_t m_capacity; + + template struct is_vector { enum { cFlag = false }; }; + template struct is_vector< vector > { enum { cFlag = true }; }; + + static void object_mover(void* pDst_void, void* pSrc_void, uint32_t num) + { + T* pSrc = static_cast(pSrc_void); + T* const pSrc_end = pSrc + num; + T* pDst = static_cast(pDst_void); + + while (pSrc != pSrc_end) + { + // placement new + new (static_cast(pDst)) T(*pSrc); + pSrc->~T(); + ++pSrc; + ++pDst; + } + } + + inline bool increase_capacity(uint32_t min_new_capacity, bool grow_hint, bool nofail = false) + { + return reinterpret_cast(this)->increase_capacity( + min_new_capacity, grow_hint, sizeof(T), + (BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(T) || (is_vector::cFlag)) ? NULL : object_mover, nofail); + } + }; + + template struct bitwise_movable< vector > { enum { cFlag = true }; }; + + // Hash map + + template + struct hasher + { + inline size_t operator() (const T& key) const { return static_cast(key); } + }; + + template + struct equal_to + { + inline bool operator()(const T& a, const T& b) const { return a == b; } + }; + + // Important: The Hasher and Equals objects must be bitwise movable! + template, typename Equals = equal_to > + class hash_map + { + public: + class iterator; + class const_iterator; + + private: + friend class iterator; + friend class const_iterator; + + enum state + { + cStateInvalid = 0, + cStateValid = 1 + }; + + enum + { + cMinHashSize = 4U + }; + + public: + typedef hash_map hash_map_type; + typedef std::pair value_type; + typedef Key key_type; + typedef Value referent_type; + typedef Hasher hasher_type; + typedef Equals equals_type; + + hash_map() : + m_hash_shift(32), m_num_valid(0), m_grow_threshold(0) + { + } + + hash_map(const hash_map& other) : + m_values(other.m_values), + m_hash_shift(other.m_hash_shift), + m_hasher(other.m_hasher), + m_equals(other.m_equals), + m_num_valid(other.m_num_valid), + m_grow_threshold(other.m_grow_threshold) + { + } + + hash_map& operator= (const hash_map& other) + { + if (this == &other) + return *this; + + clear(); + + m_values = other.m_values; + m_hash_shift = other.m_hash_shift; + m_num_valid = other.m_num_valid; + m_grow_threshold = other.m_grow_threshold; + m_hasher = other.m_hasher; + m_equals = other.m_equals; + + return *this; + } + + inline ~hash_map() + { + clear(); + } + + const Equals& get_equals() const { return m_equals; } + Equals& get_equals() { return m_equals; } + + void set_equals(const Equals& equals) { m_equals = equals; } + + const Hasher& get_hasher() const { return m_hasher; } + Hasher& get_hasher() { return m_hasher; } + + void set_hasher(const Hasher& hasher) { m_hasher = hasher; } + + inline void clear() + { + if (!m_values.empty()) + { + if (BASISU_HAS_DESTRUCTOR(Key) || BASISU_HAS_DESTRUCTOR(Value)) + { + node* p = &get_node(0); + node* p_end = p + m_values.size(); + + uint32_t num_remaining = m_num_valid; + while (p != p_end) + { + if (p->state) + { + destruct_value_type(p); + num_remaining--; + if (!num_remaining) + break; + } + + p++; + } + } + + m_values.clear_no_destruction(); + + m_hash_shift = 32; + m_num_valid = 0; + m_grow_threshold = 0; + } + } + + inline void reset() + { + if (!m_num_valid) + return; + + if (BASISU_HAS_DESTRUCTOR(Key) || BASISU_HAS_DESTRUCTOR(Value)) + { + node* p = &get_node(0); + node* p_end = p + m_values.size(); + + uint32_t num_remaining = m_num_valid; + while (p != p_end) + { + if (p->state) + { + destruct_value_type(p); + p->state = cStateInvalid; + + num_remaining--; + if (!num_remaining) + break; + } + + p++; + } + } + else if (sizeof(node) <= 32) + { + memset(&m_values[0], 0, m_values.size_in_bytes()); + } + else + { + node* p = &get_node(0); + node* p_end = p + m_values.size(); + + uint32_t num_remaining = m_num_valid; + while (p != p_end) + { + if (p->state) + { + p->state = cStateInvalid; + + num_remaining--; + if (!num_remaining) + break; + } + + p++; + } + } + + m_num_valid = 0; + } + + inline uint32_t size() + { + return m_num_valid; + } + + inline uint32_t get_table_size() + { + return m_values.size(); + } + + inline bool empty() + { + return !m_num_valid; + } + + inline void reserve(uint32_t new_capacity) + { + uint64_t new_hash_size = helpers::maximum(1U, new_capacity); + + new_hash_size = new_hash_size * 2ULL; + + if (!helpers::is_power_of_2(new_hash_size)) + new_hash_size = helpers::next_pow2(new_hash_size); + + new_hash_size = helpers::maximum(cMinHashSize, new_hash_size); + + new_hash_size = helpers::minimum(0x80000000UL, new_hash_size); + + if (new_hash_size > m_values.size()) + rehash((uint32_t)new_hash_size); + } + + class iterator + { + friend class hash_map; + friend class hash_map::const_iterator; + + public: + inline iterator() : m_pTable(NULL), m_index(0) { } + inline iterator(hash_map_type& table, uint32_t index) : m_pTable(&table), m_index(index) { } + inline iterator(const iterator& other) : m_pTable(other.m_pTable), m_index(other.m_index) { } + + inline iterator& operator= (const iterator& other) + { + m_pTable = other.m_pTable; + m_index = other.m_index; + return *this; + } + + // post-increment + inline iterator operator++(int) + { + iterator result(*this); + ++*this; + return result; + } + + // pre-increment + inline iterator& operator++() + { + probe(); + return *this; + } + + inline value_type& operator*() const { return *get_cur(); } + inline value_type* operator->() const { return get_cur(); } + + inline bool operator == (const iterator& b) const { return (m_pTable == b.m_pTable) && (m_index == b.m_index); } + inline bool operator != (const iterator& b) const { return !(*this == b); } + inline bool operator == (const const_iterator& b) const { return (m_pTable == b.m_pTable) && (m_index == b.m_index); } + inline bool operator != (const const_iterator& b) const { return !(*this == b); } + + private: + hash_map_type* m_pTable; + uint32_t m_index; + + inline value_type* get_cur() const + { + assert(m_pTable && (m_index < m_pTable->m_values.size())); + assert(m_pTable->get_node_state(m_index) == cStateValid); + + return &m_pTable->get_node(m_index); + } + + inline void probe() + { + assert(m_pTable); + m_index = m_pTable->find_next(m_index); + } + }; + + class const_iterator + { + friend class hash_map; + friend class hash_map::iterator; + + public: + inline const_iterator() : m_pTable(NULL), m_index(0) { } + inline const_iterator(const hash_map_type& table, uint32_t index) : m_pTable(&table), m_index(index) { } + inline const_iterator(const iterator& other) : m_pTable(other.m_pTable), m_index(other.m_index) { } + inline const_iterator(const const_iterator& other) : m_pTable(other.m_pTable), m_index(other.m_index) { } + + inline const_iterator& operator= (const const_iterator& other) + { + m_pTable = other.m_pTable; + m_index = other.m_index; + return *this; + } + + inline const_iterator& operator= (const iterator& other) + { + m_pTable = other.m_pTable; + m_index = other.m_index; + return *this; + } + + // post-increment + inline const_iterator operator++(int) + { + const_iterator result(*this); + ++*this; + return result; + } + + // pre-increment + inline const_iterator& operator++() + { + probe(); + return *this; + } + + inline const value_type& operator*() const { return *get_cur(); } + inline const value_type* operator->() const { return get_cur(); } + + inline bool operator == (const const_iterator& b) const { return (m_pTable == b.m_pTable) && (m_index == b.m_index); } + inline bool operator != (const const_iterator& b) const { return !(*this == b); } + inline bool operator == (const iterator& b) const { return (m_pTable == b.m_pTable) && (m_index == b.m_index); } + inline bool operator != (const iterator& b) const { return !(*this == b); } + + private: + const hash_map_type* m_pTable; + uint32_t m_index; + + inline const value_type* get_cur() const + { + assert(m_pTable && (m_index < m_pTable->m_values.size())); + assert(m_pTable->get_node_state(m_index) == cStateValid); + + return &m_pTable->get_node(m_index); + } + + inline void probe() + { + assert(m_pTable); + m_index = m_pTable->find_next(m_index); + } + }; + + inline const_iterator begin() const + { + if (!m_num_valid) + return end(); + + return const_iterator(*this, find_next(UINT32_MAX)); + } + + inline const_iterator end() const + { + return const_iterator(*this, m_values.size()); + } + + inline iterator begin() + { + if (!m_num_valid) + return end(); + + return iterator(*this, find_next(UINT32_MAX)); + } + + inline iterator end() + { + return iterator(*this, m_values.size()); + } + + // insert_result.first will always point to inserted key/value (or the already existing key/value). + // insert_resutt.second will be true if a new key/value was inserted, or false if the key already existed (in which case first will point to the already existing value). + typedef std::pair insert_result; + + inline insert_result insert(const Key& k, const Value& v = Value()) + { + insert_result result; + if (!insert_no_grow(result, k, v)) + { + grow(); + + // This must succeed. + if (!insert_no_grow(result, k, v)) + { + fprintf(stderr, "insert() failed"); + abort(); + } + } + + return result; + } + + inline insert_result insert(const value_type& v) + { + return insert(v.first, v.second); + } + + inline const_iterator find(const Key& k) const + { + return const_iterator(*this, find_index(k)); + } + + inline iterator find(const Key& k) + { + return iterator(*this, find_index(k)); + } + + inline bool erase(const Key& k) + { + uint32_t i = find_index(k); + + if (i >= m_values.size()) + return false; + + node* pDst = &get_node(i); + destruct_value_type(pDst); + pDst->state = cStateInvalid; + + m_num_valid--; + + for (; ; ) + { + uint32_t r, j = i; + + node* pSrc = pDst; + + do + { + if (!i) + { + i = m_values.size() - 1; + pSrc = &get_node(i); + } + else + { + i--; + pSrc--; + } + + if (!pSrc->state) + return true; + + r = hash_key(pSrc->first); + + } while ((i <= r && r < j) || (r < j && j < i) || (j < i && i <= r)); + + move_node(pDst, pSrc); + + pDst = pSrc; + } + } + + inline void swap(hash_map_type& other) + { + m_values.swap(other.m_values); + std::swap(m_hash_shift, other.m_hash_shift); + std::swap(m_num_valid, other.m_num_valid); + std::swap(m_grow_threshold, other.m_grow_threshold); + std::swap(m_hasher, other.m_hasher); + std::swap(m_equals, other.m_equals); + } + + private: + struct node : public value_type + { + uint8_t state; + }; + + static inline void construct_value_type(value_type* pDst, const Key& k, const Value& v) + { + if (BASISU_IS_BITWISE_COPYABLE(Key)) + memcpy(&pDst->first, &k, sizeof(Key)); + else + scalar_type::construct(&pDst->first, k); + + if (BASISU_IS_BITWISE_COPYABLE(Value)) + memcpy(&pDst->second, &v, sizeof(Value)); + else + scalar_type::construct(&pDst->second, v); + } + + static inline void construct_value_type(value_type* pDst, const value_type* pSrc) + { + if ((BASISU_IS_BITWISE_COPYABLE(Key)) && (BASISU_IS_BITWISE_COPYABLE(Value))) + { + memcpy(pDst, pSrc, sizeof(value_type)); + } + else + { + if (BASISU_IS_BITWISE_COPYABLE(Key)) + memcpy(&pDst->first, &pSrc->first, sizeof(Key)); + else + scalar_type::construct(&pDst->first, pSrc->first); + + if (BASISU_IS_BITWISE_COPYABLE(Value)) + memcpy(&pDst->second, &pSrc->second, sizeof(Value)); + else + scalar_type::construct(&pDst->second, pSrc->second); + } + } + + static inline void destruct_value_type(value_type* p) + { + scalar_type::destruct(&p->first); + scalar_type::destruct(&p->second); + } + + // Moves *pSrc to *pDst efficiently. + // pDst should NOT be constructed on entry. + static inline void move_node(node* pDst, node* pSrc, bool update_src_state = true) + { + assert(!pDst->state); + + if (BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(Key) && BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(Value)) + { + memcpy(pDst, pSrc, sizeof(node)); + } + else + { + if (BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(Key)) + memcpy(&pDst->first, &pSrc->first, sizeof(Key)); + else + { + scalar_type::construct(&pDst->first, pSrc->first); + scalar_type::destruct(&pSrc->first); + } + + if (BASISU_IS_BITWISE_COPYABLE_OR_MOVABLE(Value)) + memcpy(&pDst->second, &pSrc->second, sizeof(Value)); + else + { + scalar_type::construct(&pDst->second, pSrc->second); + scalar_type::destruct(&pSrc->second); + } + + pDst->state = cStateValid; + } + + if (update_src_state) + pSrc->state = cStateInvalid; + } + + struct raw_node + { + inline raw_node() + { + node* p = reinterpret_cast(this); + p->state = cStateInvalid; + } + + inline ~raw_node() + { + node* p = reinterpret_cast(this); + if (p->state) + hash_map_type::destruct_value_type(p); + } + + inline raw_node(const raw_node& other) + { + node* pDst = reinterpret_cast(this); + const node* pSrc = reinterpret_cast(&other); + + if (pSrc->state) + { + hash_map_type::construct_value_type(pDst, pSrc); + pDst->state = cStateValid; + } + else + pDst->state = cStateInvalid; + } + + inline raw_node& operator= (const raw_node& rhs) + { + if (this == &rhs) + return *this; + + node* pDst = reinterpret_cast(this); + const node* pSrc = reinterpret_cast(&rhs); + + if (pSrc->state) + { + if (pDst->state) + { + pDst->first = pSrc->first; + pDst->second = pSrc->second; + } + else + { + hash_map_type::construct_value_type(pDst, pSrc); + pDst->state = cStateValid; + } + } + else if (pDst->state) + { + hash_map_type::destruct_value_type(pDst); + pDst->state = cStateInvalid; + } + + return *this; + } + + uint8_t m_bits[sizeof(node)]; + }; + + typedef basisu::vector node_vector; + + node_vector m_values; + uint32_t m_hash_shift; + + Hasher m_hasher; + Equals m_equals; + + uint32_t m_num_valid; + + uint32_t m_grow_threshold; + + inline uint32_t hash_key(const Key& k) const + { + assert((1U << (32U - m_hash_shift)) == m_values.size()); + + uint32_t hash = static_cast(m_hasher(k)); + + // Fibonacci hashing + hash = (2654435769U * hash) >> m_hash_shift; + + assert(hash < m_values.size()); + return hash; + } + + inline const node& get_node(uint32_t index) const + { + return *reinterpret_cast(&m_values[index]); + } + + inline node& get_node(uint32_t index) + { + return *reinterpret_cast(&m_values[index]); + } + + inline state get_node_state(uint32_t index) const + { + return static_cast(get_node(index).state); + } + + inline void set_node_state(uint32_t index, bool valid) + { + get_node(index).state = valid; + } + + inline void grow() + { + uint64_t n = m_values.size() * 3ULL; // was * 2 + + if (!helpers::is_power_of_2(n)) + n = helpers::next_pow2(n); + + if (n > 0x80000000UL) + n = 0x80000000UL; + + rehash(helpers::maximum(cMinHashSize, (uint32_t)n)); + } + + inline void rehash(uint32_t new_hash_size) + { + assert(new_hash_size >= m_num_valid); + assert(helpers::is_power_of_2(new_hash_size)); + + if ((new_hash_size < m_num_valid) || (new_hash_size == m_values.size())) + return; + + hash_map new_map; + new_map.m_values.resize(new_hash_size); + new_map.m_hash_shift = 32U - helpers::floor_log2i(new_hash_size); + assert(new_hash_size == (1U << (32U - new_map.m_hash_shift))); + new_map.m_grow_threshold = UINT_MAX; + + node* pNode = reinterpret_cast(m_values.begin()); + node* pNode_end = pNode + m_values.size(); + + while (pNode != pNode_end) + { + if (pNode->state) + { + new_map.move_into(pNode); + + if (new_map.m_num_valid == m_num_valid) + break; + } + + pNode++; + } + + new_map.m_grow_threshold = (new_hash_size + 1U) >> 1U; + + m_values.clear_no_destruction(); + m_hash_shift = 32; + + swap(new_map); + } + + inline uint32_t find_next(uint32_t index) const + { + index++; + + if (index >= m_values.size()) + return index; + + const node* pNode = &get_node(index); + + for (; ; ) + { + if (pNode->state) + break; + + if (++index >= m_values.size()) + break; + + pNode++; + } + + return index; + } + + inline uint32_t find_index(const Key& k) const + { + if (m_num_valid) + { + uint32_t index = hash_key(k); + const node* pNode = &get_node(index); + + if (pNode->state) + { + if (m_equals(pNode->first, k)) + return index; + + const uint32_t orig_index = index; + + for (; ; ) + { + if (!index) + { + index = m_values.size() - 1; + pNode = &get_node(index); + } + else + { + index--; + pNode--; + } + + if (index == orig_index) + break; + + if (!pNode->state) + break; + + if (m_equals(pNode->first, k)) + return index; + } + } + } + + return m_values.size(); + } + + inline bool insert_no_grow(insert_result& result, const Key& k, const Value& v = Value()) + { + if (!m_values.size()) + return false; + + uint32_t index = hash_key(k); + node* pNode = &get_node(index); + + if (pNode->state) + { + if (m_equals(pNode->first, k)) + { + result.first = iterator(*this, index); + result.second = false; + return true; + } + + const uint32_t orig_index = index; + + for (; ; ) + { + if (!index) + { + index = m_values.size() - 1; + pNode = &get_node(index); + } + else + { + index--; + pNode--; + } + + if (orig_index == index) + return false; + + if (!pNode->state) + break; + + if (m_equals(pNode->first, k)) + { + result.first = iterator(*this, index); + result.second = false; + return true; + } + } + } + + if (m_num_valid >= m_grow_threshold) + return false; + + construct_value_type(pNode, k, v); + + pNode->state = cStateValid; + + m_num_valid++; + assert(m_num_valid <= m_values.size()); + + result.first = iterator(*this, index); + result.second = true; + + return true; + } + + inline void move_into(node* pNode) + { + uint32_t index = hash_key(pNode->first); + node* pDst_node = &get_node(index); + + if (pDst_node->state) + { + const uint32_t orig_index = index; + + for (; ; ) + { + if (!index) + { + index = m_values.size() - 1; + pDst_node = &get_node(index); + } + else + { + index--; + pDst_node--; + } + + if (index == orig_index) + { + assert(false); + return; + } + + if (!pDst_node->state) + break; + } + } + + move_node(pDst_node, pNode, false); + + m_num_valid++; + } + }; + + template + struct bitwise_movable< hash_map > { enum { cFlag = true }; }; + +#if BASISU_HASHMAP_TEST + extern void hash_map_test(); +#endif + +} // namespace basisu + +namespace std +{ + template + inline void swap(basisu::vector& a, basisu::vector& b) + { + a.swap(b); + } + + template + inline void swap(basisu::hash_map& a, basisu::hash_map& b) + { + a.swap(b); + } + +} // namespace std + +#if !__clang__ && __GNUC__ +#pragma GCC diagnostic pop +#endif diff --git a/ktx/external/basisu/transcoder/basisu_containers_impl.h b/ktx/external/basisu/transcoder/basisu_containers_impl.h new file mode 100644 index 0000000..a7f010a --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_containers_impl.h @@ -0,0 +1,315 @@ +// basisu_containers_impl.h +// Do not include directly + +#ifdef _MSC_VER +#pragma warning (disable:4127) // warning C4127: conditional expression is constant +#endif + +namespace basisu +{ + bool elemental_vector::increase_capacity(uint32_t min_new_capacity, bool grow_hint, uint32_t element_size, object_mover pMover, bool nofail) + { + assert(m_size <= m_capacity); + + if (sizeof(void *) == sizeof(uint64_t)) + assert(min_new_capacity < (0x400000000ULL / element_size)); + else + assert(min_new_capacity < (0x7FFF0000U / element_size)); + + if (m_capacity >= min_new_capacity) + return true; + + size_t new_capacity = min_new_capacity; + if ((grow_hint) && (!helpers::is_power_of_2((uint64_t)new_capacity))) + { + new_capacity = (size_t)helpers::next_pow2((uint64_t)new_capacity); + + assert(new_capacity && (new_capacity > m_capacity)); + + if (new_capacity < min_new_capacity) + { + if (nofail) + return false; + fprintf(stderr, "vector too large\n"); + abort(); + } + } + + const size_t desired_size = element_size * new_capacity; + size_t actual_size = 0; + if (!pMover) + { + void* new_p = realloc(m_p, desired_size); + if (!new_p) + { + if (nofail) + return false; + + char buf[256]; +#ifdef _MSC_VER + sprintf_s(buf, sizeof(buf), "vector: realloc() failed allocating %u bytes", (uint32_t)desired_size); +#else + snprintf(buf, sizeof(buf), "vector: realloc() failed allocating %u bytes", (uint32_t)desired_size); +#endif + fprintf(stderr, "%s", buf); + abort(); + } + +#if BASISU_VECTOR_DETERMINISTIC + actual_size = desired_size; +#elif defined(_MSC_VER) + actual_size = _msize(new_p); +#elif HAS_MALLOC_USABLE_SIZE + actual_size = malloc_usable_size(new_p); +#else + actual_size = desired_size; +#endif + m_p = new_p; + } + else + { + void* new_p = malloc(desired_size); + if (!new_p) + { + if (nofail) + return false; + + char buf[256]; +#ifdef _MSC_VER + sprintf_s(buf, sizeof(buf), "vector: malloc() failed allocating %u bytes", (uint32_t)desired_size); +#else + snprintf(buf, sizeof(buf), "vector: malloc() failed allocating %u bytes", (uint32_t)desired_size); +#endif + fprintf(stderr, "%s", buf); + abort(); + } + +#if BASISU_VECTOR_DETERMINISTIC + actual_size = desired_size; +#elif defined(_MSC_VER) + actual_size = _msize(new_p); +#elif HAS_MALLOC_USABLE_SIZE + actual_size = malloc_usable_size(new_p); +#else + actual_size = desired_size; +#endif + + (*pMover)(new_p, m_p, m_size); + + if (m_p) + free(m_p); + + m_p = new_p; + } + + if (actual_size > desired_size) + m_capacity = static_cast(actual_size / element_size); + else + m_capacity = static_cast(new_capacity); + + return true; + } + +#if BASISU_HASHMAP_TEST + +#define HASHMAP_TEST_VERIFY(c) do { if (!(c)) handle_hashmap_test_verify_failure(__LINE__); } while(0) + + static void handle_hashmap_test_verify_failure(int line) + { + fprintf(stderr, "HASHMAP_TEST_VERIFY() faild on line %i\n", line); + abort(); + } + + class counted_obj + { + public: + counted_obj(uint32_t v = 0) : + m_val(v) + { + m_count++; + } + + counted_obj(const counted_obj& obj) : + m_val(obj.m_val) + { + m_count++; + } + + ~counted_obj() + { + assert(m_count > 0); + m_count--; + } + + static uint32_t m_count; + + uint32_t m_val; + + operator size_t() const { return m_val; } + + bool operator== (const counted_obj& rhs) const { return m_val == rhs.m_val; } + bool operator== (const uint32_t rhs) const { return m_val == rhs; } + + }; + + uint32_t counted_obj::m_count; + + static uint32_t urand32() + { + uint32_t a = rand(); + uint32_t b = rand() << 15; + uint32_t c = rand() << (32 - 15); + return a ^ b ^ c; + } + + static int irand32(int l, int h) + { + assert(l < h); + if (l >= h) + return l; + + uint32_t range = static_cast(h - l); + + uint32_t rnd = urand32(); + + uint32_t rnd_range = static_cast((((uint64_t)range) * ((uint64_t)rnd)) >> 32U); + + int result = l + rnd_range; + assert((result >= l) && (result < h)); + return result; + } + + void hash_map_test() + { + { + basisu::hash_map k; + basisu::hash_map l; + std::swap(k, l); + + k.begin(); + k.end(); + k.clear(); + k.empty(); + k.erase(0); + k.insert(0, 1); + k.find(0); + k.get_equals(); + k.get_hasher(); + k.get_table_size(); + k.reset(); + k.reserve(1); + k = l; + k.set_equals(l.get_equals()); + k.set_hasher(l.get_hasher()); + k.get_table_size(); + } + + uint32_t seed = 0; + for (; ; ) + { + seed++; + + typedef basisu::hash_map my_hash_map; + my_hash_map m; + + const uint32_t n = irand32(0, 100000); + + printf("%u\n", n); + + srand(seed); // r1.seed(seed); + + basisu::vector q; + + uint32_t count = 0; + for (uint32_t i = 0; i < n; i++) + { + uint32_t v = urand32() & 0x7FFFFFFF; + my_hash_map::insert_result res = m.insert(counted_obj(v), counted_obj(v ^ 0xdeadbeef)); + if (res.second) + { + count++; + q.push_back(v); + } + } + + HASHMAP_TEST_VERIFY(m.size() == count); + + srand(seed); + + my_hash_map cm(m); + m.clear(); + m = cm; + cm.reset(); + + for (uint32_t i = 0; i < n; i++) + { + uint32_t v = urand32() & 0x7FFFFFFF; + my_hash_map::const_iterator it = m.find(counted_obj(v)); + HASHMAP_TEST_VERIFY(it != m.end()); + HASHMAP_TEST_VERIFY(it->first == v); + HASHMAP_TEST_VERIFY(it->second == (v ^ 0xdeadbeef)); + } + + for (uint32_t t = 0; t < 2; t++) + { + const uint32_t nd = irand32(1, q.size() + 1); + for (uint32_t i = 0; i < nd; i++) + { + uint32_t p = irand32(0, q.size()); + + int k = q[p]; + if (k >= 0) + { + q[p] = -k - 1; + + bool s = m.erase(counted_obj(k)); + HASHMAP_TEST_VERIFY(s); + } + } + + typedef basisu::hash_map uint_hash_set; + uint_hash_set s; + + for (uint32_t i = 0; i < q.size(); i++) + { + int v = q[i]; + + if (v >= 0) + { + my_hash_map::const_iterator it = m.find(counted_obj(v)); + HASHMAP_TEST_VERIFY(it != m.end()); + HASHMAP_TEST_VERIFY(it->first == (uint32_t)v); + HASHMAP_TEST_VERIFY(it->second == ((uint32_t)v ^ 0xdeadbeef)); + + s.insert(v); + } + else + { + my_hash_map::const_iterator it = m.find(counted_obj(-v - 1)); + HASHMAP_TEST_VERIFY(it == m.end()); + } + } + + uint32_t found_count = 0; + for (my_hash_map::const_iterator it = m.begin(); it != m.end(); ++it) + { + HASHMAP_TEST_VERIFY(it->second == ((uint32_t)it->first ^ 0xdeadbeef)); + + uint_hash_set::const_iterator fit(s.find((uint32_t)it->first)); + HASHMAP_TEST_VERIFY(fit != s.end()); + + HASHMAP_TEST_VERIFY(fit->first == it->first); + + found_count++; + } + + HASHMAP_TEST_VERIFY(found_count == s.size()); + } + + HASHMAP_TEST_VERIFY(counted_obj::m_count == m.size() * 2); + } + } + +#endif // BASISU_HASHMAP_TEST + +} // namespace basisu diff --git a/ktx/external/basisu/transcoder/basisu_file_headers.h b/ktx/external/basisu/transcoder/basisu_file_headers.h new file mode 100644 index 0000000..4316d73 --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_file_headers.h @@ -0,0 +1,142 @@ +// basis_file_headers.h +// Copyright (C) 2019-2020 Binomial LLC. All Rights Reserved. +// +// 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. +#pragma once +#include "basisu_transcoder_internal.h" + +namespace basist +{ + // Slice desc header flags + enum basis_slice_desc_flags + { + cSliceDescFlagsHasAlpha = 1, + + // Video only: Frame doesn't refer to previous frame (no usage of conditional replenishment pred symbols) + // Currently the first frame is always an I-Frame, all subsequent frames are P-Frames. This will eventually be changed to periodic I-Frames. + cSliceDescFlagsFrameIsIFrame = 2 + }; + +#pragma pack(push) +#pragma pack(1) + struct basis_slice_desc + { + basisu::packed_uint<3> m_image_index; // The index of the source image provided to the encoder (will always appear in order from first to last, first image index is 0, no skipping allowed) + basisu::packed_uint<1> m_level_index; // The mipmap level index (mipmaps will always appear from largest to smallest) + basisu::packed_uint<1> m_flags; // enum basis_slice_desc_flags + + basisu::packed_uint<2> m_orig_width; // The original image width (may not be a multiple of 4 pixels) + basisu::packed_uint<2> m_orig_height; // The original image height (may not be a multiple of 4 pixels) + + basisu::packed_uint<2> m_num_blocks_x; // The slice's block X dimensions. Each block is 4x4 pixels. The slice's pixel resolution may or may not be a power of 2. + basisu::packed_uint<2> m_num_blocks_y; // The slice's block Y dimensions. + + basisu::packed_uint<4> m_file_ofs; // Offset from the start of the file to the start of the slice's data + basisu::packed_uint<4> m_file_size; // The size of the compressed slice data in bytes + + basisu::packed_uint<2> m_slice_data_crc16; // The CRC16 of the compressed slice data, for extra-paranoid use cases + }; + + // File header files + enum basis_header_flags + { + // Always set for ETC1S files. Not set for UASTC files. + cBASISHeaderFlagETC1S = 1, + + // Set if the texture had to be Y flipped before encoding. The actual interpretation of this (is Y up or down?) is up to the user. + cBASISHeaderFlagYFlipped = 2, + + // Set if any slices contain alpha (for ETC1S, if the odd slices contain alpha data) + cBASISHeaderFlagHasAlphaSlices = 4, + + // For ETC1S files, this will be true if the file utilizes a codebook from another .basis file. + cBASISHeaderFlagUsesGlobalCodebook = 8, + + // Set if the texture data is sRGB, otherwise it's linear. + // In reality, we have no idea if the texture data is actually linear or sRGB. This is the m_perceptual parameter passed to the compressor. + cBASISHeaderFlagSRGB = 16, + }; + + // The image type field attempts to describe how to interpret the image data in a Basis file. + // The encoder library doesn't really do anything special or different with these texture types, this is mostly here for the benefit of the user. + // We do make sure the various constraints are followed (2DArray/cubemap/videoframes/volume implies that each image has the same resolution and # of mipmap levels, etc., cubemap implies that the # of image slices is a multiple of 6) + enum basis_texture_type + { + cBASISTexType2D = 0, // An arbitrary array of 2D RGB or RGBA images with optional mipmaps, array size = # images, each image may have a different resolution and # of mipmap levels + cBASISTexType2DArray = 1, // An array of 2D RGB or RGBA images with optional mipmaps, array size = # images, each image has the same resolution and mipmap levels + cBASISTexTypeCubemapArray = 2, // an array of cubemap levels, total # of images must be divisable by 6, in X+, X-, Y+, Y-, Z+, Z- order, with optional mipmaps + cBASISTexTypeVideoFrames = 3, // An array of 2D video frames, with optional mipmaps, # frames = # images, each image has the same resolution and # of mipmap levels + cBASISTexTypeVolume = 4, // A 3D texture with optional mipmaps, Z dimension = # images, each image has the same resolution and # of mipmap levels + + cBASISTexTypeTotal + }; + + enum + { + cBASISMaxUSPerFrame = 0xFFFFFF + }; + + enum class basis_tex_format + { + cETC1S = 0, + cUASTC4x4 = 1 + }; + + struct basis_file_header + { + enum + { + cBASISSigValue = ('B' << 8) | 's', + cBASISFirstVersion = 0x10 + }; + + basisu::packed_uint<2> m_sig; // 2 byte file signature + basisu::packed_uint<2> m_ver; // Baseline file version + basisu::packed_uint<2> m_header_size; // Header size in bytes, sizeof(basis_file_header) + basisu::packed_uint<2> m_header_crc16; // CRC16 of the remaining header data + + basisu::packed_uint<4> m_data_size; // The total size of all data after the header + basisu::packed_uint<2> m_data_crc16; // The CRC16 of all data after the header + + basisu::packed_uint<3> m_total_slices; // The total # of compressed slices (1 slice per image, or 2 for alpha .basis files) + + basisu::packed_uint<3> m_total_images; // The total # of images + + basisu::packed_uint<1> m_tex_format; // enum basis_tex_format + basisu::packed_uint<2> m_flags; // enum basist::header_flags + basisu::packed_uint<1> m_tex_type; // enum basist::basis_texture_type + basisu::packed_uint<3> m_us_per_frame; // Framerate of video, in microseconds per frame + + basisu::packed_uint<4> m_reserved; // For future use + basisu::packed_uint<4> m_userdata0; // For client use + basisu::packed_uint<4> m_userdata1; // For client use + + basisu::packed_uint<2> m_total_endpoints; // The number of endpoints in the endpoint codebook + basisu::packed_uint<4> m_endpoint_cb_file_ofs; // The compressed endpoint codebook's file offset relative to the start of the file + basisu::packed_uint<3> m_endpoint_cb_file_size; // The compressed endpoint codebook's size in bytes + + basisu::packed_uint<2> m_total_selectors; // The number of selectors in the endpoint codebook + basisu::packed_uint<4> m_selector_cb_file_ofs; // The compressed selectors codebook's file offset relative to the start of the file + basisu::packed_uint<3> m_selector_cb_file_size; // The compressed selector codebook's size in bytes + + basisu::packed_uint<4> m_tables_file_ofs; // The file offset of the compressed Huffman codelength tables, for decompressing slices + basisu::packed_uint<4> m_tables_file_size; // The file size in bytes of the compressed huffman codelength tables + + basisu::packed_uint<4> m_slice_desc_file_ofs; // The file offset to the slice description array, usually follows the header + + basisu::packed_uint<4> m_extended_file_ofs; // The file offset of the "extended" header and compressed data, for future use + basisu::packed_uint<4> m_extended_file_size; // The file size in bytes of the "extended" header and compressed data, for future use + }; +#pragma pack (pop) + +} // namespace basist diff --git a/ktx/external/basisu/transcoder/basisu_transcoder.cpp b/ktx/external/basisu/transcoder/basisu_transcoder.cpp new file mode 100644 index 0000000..5f1b5f9 --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder.cpp @@ -0,0 +1,17481 @@ +// basisu_transcoder.cpp +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// 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. + +#include "basisu_transcoder.h" +#include +#include "basisu_containers_impl.h" + +#ifndef BASISD_IS_BIG_ENDIAN +// TODO: This doesn't work on OSX. How can this be so difficult? +//#if defined(__BIG_ENDIAN__) || defined(_BIG_ENDIAN) || defined(BIG_ENDIAN) +// #define BASISD_IS_BIG_ENDIAN (1) +//#else + #define BASISD_IS_BIG_ENDIAN (0) +//#endif +#endif + +#ifndef BASISD_USE_UNALIGNED_WORD_READS + #ifdef __EMSCRIPTEN__ + // Can't use unaligned loads/stores with WebAssembly. + #define BASISD_USE_UNALIGNED_WORD_READS (0) + #elif defined(_M_AMD64) || defined(_M_IX86) || defined(__i386__) || defined(__x86_64__) + #define BASISD_USE_UNALIGNED_WORD_READS (1) + #else + #define BASISD_USE_UNALIGNED_WORD_READS (0) + #endif +#endif + +// Using unaligned loads and stores causes errors when using UBSan. Jam it off. +#if defined(__has_feature) +#if __has_feature(undefined_behavior_sanitizer) +#undef BASISD_USE_UNALIGNED_WORD_READS +#define BASISD_USE_UNALIGNED_WORD_READS 0 +#endif +#endif + +#define BASISD_SUPPORTED_BASIS_VERSION (0x13) + +#ifndef BASISD_SUPPORT_KTX2 + #error Must have defined BASISD_SUPPORT_KTX2 +#endif + +#ifndef BASISD_SUPPORT_KTX2_ZSTD +#error Must have defined BASISD_SUPPORT_KTX2_ZSTD +#endif + +// Set to 1 for fuzz testing. This will disable all CRC16 checks on headers and compressed data. +#ifndef BASISU_NO_HEADER_OR_DATA_CRC16_CHECKS + #define BASISU_NO_HEADER_OR_DATA_CRC16_CHECKS 0 +#endif + +#ifndef BASISD_SUPPORT_DXT1 + #define BASISD_SUPPORT_DXT1 1 +#endif + +#ifndef BASISD_SUPPORT_DXT5A + #define BASISD_SUPPORT_DXT5A 1 +#endif + +// Disable all BC7 transcoders if necessary (useful when cross compiling to Javascript) +#if defined(BASISD_SUPPORT_BC7) && !BASISD_SUPPORT_BC7 + #ifndef BASISD_SUPPORT_BC7_MODE5 + #define BASISD_SUPPORT_BC7_MODE5 0 + #endif +#endif // !BASISD_SUPPORT_BC7 + +// BC7 mode 5 supports both opaque and opaque+alpha textures, and uses less memory BC1. +#ifndef BASISD_SUPPORT_BC7_MODE5 + #define BASISD_SUPPORT_BC7_MODE5 1 +#endif + +#ifndef BASISD_SUPPORT_PVRTC1 + #define BASISD_SUPPORT_PVRTC1 1 +#endif + +#ifndef BASISD_SUPPORT_ETC2_EAC_A8 + #define BASISD_SUPPORT_ETC2_EAC_A8 1 +#endif + +// Set BASISD_SUPPORT_UASTC to 0 to completely disable support for transcoding UASTC files. +#ifndef BASISD_SUPPORT_UASTC + #define BASISD_SUPPORT_UASTC 1 +#endif + +#ifndef BASISD_SUPPORT_ASTC + #define BASISD_SUPPORT_ASTC 1 +#endif + +// Note that if BASISD_SUPPORT_ATC is enabled, BASISD_SUPPORT_DXT5A should also be enabled for alpha support. +#ifndef BASISD_SUPPORT_ATC + #define BASISD_SUPPORT_ATC 1 +#endif + +// Support for ETC2 EAC R11 and ETC2 EAC RG11 +#ifndef BASISD_SUPPORT_ETC2_EAC_RG11 + #define BASISD_SUPPORT_ETC2_EAC_RG11 1 +#endif + +// If BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY is 1, opaque blocks will be transcoded to ASTC at slightly higher quality (higher than BC1), but the transcoder tables will be 2x as large. +// This impacts grayscale and grayscale+alpha textures the most. +#ifndef BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + #ifdef __EMSCRIPTEN__ + // Let's assume size matters more than quality when compiling with emscripten. + #define BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY 0 + #else + // Compiling native, so an extra 64K lookup table is probably acceptable. + #define BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY 1 + #endif +#endif + +#ifndef BASISD_SUPPORT_FXT1 + #define BASISD_SUPPORT_FXT1 1 +#endif + +#ifndef BASISD_SUPPORT_PVRTC2 + #define BASISD_SUPPORT_PVRTC2 1 +#endif + +#if BASISD_SUPPORT_PVRTC2 + #if !BASISD_SUPPORT_ATC + #error BASISD_SUPPORT_ATC must be 1 if BASISD_SUPPORT_PVRTC2 is 1 + #endif +#endif + +#if BASISD_SUPPORT_ATC + #if !BASISD_SUPPORT_DXT5A + #error BASISD_SUPPORT_DXT5A must be 1 if BASISD_SUPPORT_ATC is 1 + #endif +#endif + +#define BASISD_WRITE_NEW_BC7_MODE5_TABLES 0 +#define BASISD_WRITE_NEW_DXT1_TABLES 0 +#define BASISD_WRITE_NEW_ETC2_EAC_A8_TABLES 0 +#define BASISD_WRITE_NEW_ASTC_TABLES 0 +#define BASISD_WRITE_NEW_ATC_TABLES 0 +#define BASISD_WRITE_NEW_ETC2_EAC_R11_TABLES 0 + +#ifndef BASISD_ENABLE_DEBUG_FLAGS + #define BASISD_ENABLE_DEBUG_FLAGS 0 +#endif + +// If KTX2 support is enabled, we may need Zstd for decompression of supercompressed UASTC files. Include this header. +#if BASISD_SUPPORT_KTX2 + // If BASISD_SUPPORT_KTX2_ZSTD is 0, UASTC files compressed with Zstd cannot be loaded. + #if BASISD_SUPPORT_KTX2_ZSTD + // We only use two Zstd API's: ZSTD_decompress() and ZSTD_isError() + #include "../zstd/zstd.h" + #endif +#endif + +namespace basisu +{ + bool g_debug_printf; + + void enable_debug_printf(bool enabled) + { + g_debug_printf = enabled; + } + + void debug_printf(const char* pFmt, ...) + { +#if BASISU_FORCE_DEVEL_MESSAGES + g_debug_printf = true; +#endif + if (g_debug_printf) + { + va_list args; + va_start(args, pFmt); + vprintf(pFmt, args); + va_end(args); + } + } +} // namespace basisu + +namespace basist +{ + +#if BASISD_ENABLE_DEBUG_FLAGS + static uint32_t g_debug_flags = 0; +#endif + + uint32_t get_debug_flags() + { +#if BASISD_ENABLE_DEBUG_FLAGS + return g_debug_flags; +#else + return 0; +#endif + } + + void set_debug_flags(uint32_t f) + { + BASISU_NOTE_UNUSED(f); +#if BASISD_ENABLE_DEBUG_FLAGS + g_debug_flags = f; +#endif + } + + inline uint16_t byteswap_uint16(uint16_t v) + { + return static_cast((v >> 8) | (v << 8)); + } + + static inline int32_t clampi(int32_t value, int32_t low, int32_t high) { if (value < low) value = low; else if (value > high) value = high; return value; } + static inline float clampf(float value, float low, float high) { if (value < low) value = low; else if (value > high) value = high; return value; } + static inline float saturate(float value) { return clampf(value, 0, 1.0f); } + + static inline uint8_t mul_8(uint32_t v, uint32_t q) { v = v * q + 128; return (uint8_t)((v + (v >> 8)) >> 8); } + + uint16_t crc16(const void* r, size_t size, uint16_t crc) + { + crc = ~crc; + + const uint8_t* p = static_cast(r); + for (; size; --size) + { + const uint16_t q = *p++ ^ (crc >> 8); + uint16_t k = (q >> 4) ^ q; + crc = (((crc << 8) ^ k) ^ (k << 5)) ^ (k << 12); + } + + return static_cast(~crc); + } + + enum etc_constants + { + cETC1BytesPerBlock = 8U, + + cETC1SelectorBits = 2U, + cETC1SelectorValues = 1U << cETC1SelectorBits, + cETC1SelectorMask = cETC1SelectorValues - 1U, + + cETC1BlockShift = 2U, + cETC1BlockSize = 1U << cETC1BlockShift, + + cETC1LSBSelectorIndicesBitOffset = 0, + cETC1MSBSelectorIndicesBitOffset = 16, + + cETC1FlipBitOffset = 32, + cETC1DiffBitOffset = 33, + + cETC1IntenModifierNumBits = 3, + cETC1IntenModifierValues = 1 << cETC1IntenModifierNumBits, + cETC1RightIntenModifierTableBitOffset = 34, + cETC1LeftIntenModifierTableBitOffset = 37, + + // Base+Delta encoding (5 bit bases, 3 bit delta) + cETC1BaseColorCompNumBits = 5, + cETC1BaseColorCompMax = 1 << cETC1BaseColorCompNumBits, + + cETC1DeltaColorCompNumBits = 3, + cETC1DeltaColorComp = 1 << cETC1DeltaColorCompNumBits, + cETC1DeltaColorCompMax = 1 << cETC1DeltaColorCompNumBits, + + cETC1BaseColor5RBitOffset = 59, + cETC1BaseColor5GBitOffset = 51, + cETC1BaseColor5BBitOffset = 43, + + cETC1DeltaColor3RBitOffset = 56, + cETC1DeltaColor3GBitOffset = 48, + cETC1DeltaColor3BBitOffset = 40, + + // Absolute (non-delta) encoding (two 4-bit per component bases) + cETC1AbsColorCompNumBits = 4, + cETC1AbsColorCompMax = 1 << cETC1AbsColorCompNumBits, + + cETC1AbsColor4R1BitOffset = 60, + cETC1AbsColor4G1BitOffset = 52, + cETC1AbsColor4B1BitOffset = 44, + + cETC1AbsColor4R2BitOffset = 56, + cETC1AbsColor4G2BitOffset = 48, + cETC1AbsColor4B2BitOffset = 40, + + cETC1ColorDeltaMin = -4, + cETC1ColorDeltaMax = 3, + + // Delta3: + // 0 1 2 3 4 5 6 7 + // 000 001 010 011 100 101 110 111 + // 0 1 2 3 -4 -3 -2 -1 + }; + +#define DECLARE_ETC1_INTEN_TABLE(name, N) \ + static const int name[cETC1IntenModifierValues][cETC1SelectorValues] = \ + { \ + { N * -8, N * -2, N * 2, N * 8 },{ N * -17, N * -5, N * 5, N * 17 },{ N * -29, N * -9, N * 9, N * 29 },{ N * -42, N * -13, N * 13, N * 42 }, \ + { N * -60, N * -18, N * 18, N * 60 },{ N * -80, N * -24, N * 24, N * 80 },{ N * -106, N * -33, N * 33, N * 106 },{ N * -183, N * -47, N * 47, N * 183 } \ + }; + + DECLARE_ETC1_INTEN_TABLE(g_etc1_inten_tables, 1); + DECLARE_ETC1_INTEN_TABLE(g_etc1_inten_tables16, 16); + DECLARE_ETC1_INTEN_TABLE(g_etc1_inten_tables48, 3 * 16); + + //const uint8_t g_etc1_to_selector_index[cETC1SelectorValues] = { 2, 3, 1, 0 }; + const uint8_t g_selector_index_to_etc1[cETC1SelectorValues] = { 3, 2, 0, 1 }; + + static const uint8_t g_etc_5_to_8[32] = { 0, 8, 16, 24, 33, 41, 49, 57, 66, 74, 82, 90, 99, 107, 115, 123, 132, 140, 148, 156, 165, 173, 181, 189, 198, 206, 214, 222, 231, 239, 247, 255 }; + + struct decoder_etc_block + { + // big endian uint64: + // bit ofs: 56 48 40 32 24 16 8 0 + // byte ofs: b0, b1, b2, b3, b4, b5, b6, b7 + union + { + uint64_t m_uint64; + + uint32_t m_uint32[2]; + + uint8_t m_bytes[8]; + + struct + { + signed m_dred2 : 3; + uint32_t m_red1 : 5; + + signed m_dgreen2 : 3; + uint32_t m_green1 : 5; + + signed m_dblue2 : 3; + uint32_t m_blue1 : 5; + + uint32_t m_flip : 1; + uint32_t m_diff : 1; + uint32_t m_cw2 : 3; + uint32_t m_cw1 : 3; + + uint32_t m_selectors; + } m_differential; + }; + + inline void clear() + { + assert(sizeof(*this) == 8); + basisu::clear_obj(*this); + } + + inline void set_byte_bits(uint32_t ofs, uint32_t num, uint32_t bits) + { + assert((ofs + num) <= 64U); + assert(num && (num < 32U)); + assert((ofs >> 3) == ((ofs + num - 1) >> 3)); + assert(bits < (1U << num)); + const uint32_t byte_ofs = 7 - (ofs >> 3); + const uint32_t byte_bit_ofs = ofs & 7; + const uint32_t mask = (1 << num) - 1; + m_bytes[byte_ofs] &= ~(mask << byte_bit_ofs); + m_bytes[byte_ofs] |= (bits << byte_bit_ofs); + } + + inline void set_flip_bit(bool flip) + { + m_bytes[3] &= ~1; + m_bytes[3] |= static_cast(flip); + } + + inline void set_diff_bit(bool diff) + { + m_bytes[3] &= ~2; + m_bytes[3] |= (static_cast(diff) << 1); + } + + // Sets intensity modifier table (0-7) used by subblock subblock_id (0 or 1) + inline void set_inten_table(uint32_t subblock_id, uint32_t t) + { + assert(subblock_id < 2); + assert(t < 8); + const uint32_t ofs = subblock_id ? 2 : 5; + m_bytes[3] &= ~(7 << ofs); + m_bytes[3] |= (t << ofs); + } + + // Selector "val" ranges from 0-3 and is a direct index into g_etc1_inten_tables. + inline void set_selector(uint32_t x, uint32_t y, uint32_t val) + { + assert((x | y | val) < 4); + const uint32_t bit_index = x * 4 + y; + + uint8_t* p = &m_bytes[7 - (bit_index >> 3)]; + + const uint32_t byte_bit_ofs = bit_index & 7; + const uint32_t mask = 1 << byte_bit_ofs; + + static const uint8_t s_selector_index_to_etc1[4] = { 3, 2, 0, 1 }; + const uint32_t etc1_val = s_selector_index_to_etc1[val]; + + const uint32_t lsb = etc1_val & 1; + const uint32_t msb = etc1_val >> 1; + + p[0] &= ~mask; + p[0] |= (lsb << byte_bit_ofs); + + p[-2] &= ~mask; + p[-2] |= (msb << byte_bit_ofs); + } + + // Returned encoded selector value ranges from 0-3 (this is NOT a direct index into g_etc1_inten_tables, see get_selector()) + inline uint32_t get_raw_selector(uint32_t x, uint32_t y) const + { + assert((x | y) < 4); + + const uint32_t bit_index = x * 4 + y; + const uint32_t byte_bit_ofs = bit_index & 7; + const uint8_t* p = &m_bytes[7 - (bit_index >> 3)]; + const uint32_t lsb = (p[0] >> byte_bit_ofs) & 1; + const uint32_t msb = (p[-2] >> byte_bit_ofs) & 1; + const uint32_t val = lsb | (msb << 1); + + return val; + } + + // Returned selector value ranges from 0-3 and is a direct index into g_etc1_inten_tables. + inline uint32_t get_selector(uint32_t x, uint32_t y) const + { + static const uint8_t s_etc1_to_selector_index[cETC1SelectorValues] = { 2, 3, 1, 0 }; + return s_etc1_to_selector_index[get_raw_selector(x, y)]; + } + + inline void set_raw_selector_bits(uint32_t bits) + { + m_bytes[4] = static_cast(bits); + m_bytes[5] = static_cast(bits >> 8); + m_bytes[6] = static_cast(bits >> 16); + m_bytes[7] = static_cast(bits >> 24); + } + + inline bool are_all_selectors_the_same() const + { + uint32_t v = *reinterpret_cast(&m_bytes[4]); + + if ((v == 0xFFFFFFFF) || (v == 0xFFFF) || (!v) || (v == 0xFFFF0000)) + return true; + + return false; + } + + inline void set_raw_selector_bits(uint8_t byte0, uint8_t byte1, uint8_t byte2, uint8_t byte3) + { + m_bytes[4] = byte0; + m_bytes[5] = byte1; + m_bytes[6] = byte2; + m_bytes[7] = byte3; + } + + inline uint32_t get_raw_selector_bits() const + { + return m_bytes[4] | (m_bytes[5] << 8) | (m_bytes[6] << 16) | (m_bytes[7] << 24); + } + + inline void set_base4_color(uint32_t idx, uint16_t c) + { + if (idx) + { + set_byte_bits(cETC1AbsColor4R2BitOffset, 4, (c >> 8) & 15); + set_byte_bits(cETC1AbsColor4G2BitOffset, 4, (c >> 4) & 15); + set_byte_bits(cETC1AbsColor4B2BitOffset, 4, c & 15); + } + else + { + set_byte_bits(cETC1AbsColor4R1BitOffset, 4, (c >> 8) & 15); + set_byte_bits(cETC1AbsColor4G1BitOffset, 4, (c >> 4) & 15); + set_byte_bits(cETC1AbsColor4B1BitOffset, 4, c & 15); + } + } + + inline void set_base5_color(uint16_t c) + { + set_byte_bits(cETC1BaseColor5RBitOffset, 5, (c >> 10) & 31); + set_byte_bits(cETC1BaseColor5GBitOffset, 5, (c >> 5) & 31); + set_byte_bits(cETC1BaseColor5BBitOffset, 5, c & 31); + } + + void set_delta3_color(uint16_t c) + { + set_byte_bits(cETC1DeltaColor3RBitOffset, 3, (c >> 6) & 7); + set_byte_bits(cETC1DeltaColor3GBitOffset, 3, (c >> 3) & 7); + set_byte_bits(cETC1DeltaColor3BBitOffset, 3, c & 7); + } + + void set_block_color4(const color32& c0_unscaled, const color32& c1_unscaled) + { + set_diff_bit(false); + + set_base4_color(0, pack_color4(c0_unscaled, false)); + set_base4_color(1, pack_color4(c1_unscaled, false)); + } + + void set_block_color5(const color32& c0_unscaled, const color32& c1_unscaled) + { + set_diff_bit(true); + + set_base5_color(pack_color5(c0_unscaled, false)); + + int dr = c1_unscaled.r - c0_unscaled.r; + int dg = c1_unscaled.g - c0_unscaled.g; + int db = c1_unscaled.b - c0_unscaled.b; + + set_delta3_color(pack_delta3(dr, dg, db)); + } + + bool set_block_color5_check(const color32& c0_unscaled, const color32& c1_unscaled) + { + set_diff_bit(true); + + set_base5_color(pack_color5(c0_unscaled, false)); + + int dr = c1_unscaled.r - c0_unscaled.r; + int dg = c1_unscaled.g - c0_unscaled.g; + int db = c1_unscaled.b - c0_unscaled.b; + + if (((dr < cETC1ColorDeltaMin) || (dr > cETC1ColorDeltaMax)) || + ((dg < cETC1ColorDeltaMin) || (dg > cETC1ColorDeltaMax)) || + ((db < cETC1ColorDeltaMin) || (db > cETC1ColorDeltaMax))) + return false; + + set_delta3_color(pack_delta3(dr, dg, db)); + + return true; + } + + inline uint32_t get_byte_bits(uint32_t ofs, uint32_t num) const + { + assert((ofs + num) <= 64U); + assert(num && (num <= 8U)); + assert((ofs >> 3) == ((ofs + num - 1) >> 3)); + const uint32_t byte_ofs = 7 - (ofs >> 3); + const uint32_t byte_bit_ofs = ofs & 7; + return (m_bytes[byte_ofs] >> byte_bit_ofs) & ((1 << num) - 1); + } + + inline uint16_t get_base5_color() const + { + const uint32_t r = get_byte_bits(cETC1BaseColor5RBitOffset, 5); + const uint32_t g = get_byte_bits(cETC1BaseColor5GBitOffset, 5); + const uint32_t b = get_byte_bits(cETC1BaseColor5BBitOffset, 5); + return static_cast(b | (g << 5U) | (r << 10U)); + } + + inline uint16_t get_base4_color(uint32_t idx) const + { + uint32_t r, g, b; + if (idx) + { + r = get_byte_bits(cETC1AbsColor4R2BitOffset, 4); + g = get_byte_bits(cETC1AbsColor4G2BitOffset, 4); + b = get_byte_bits(cETC1AbsColor4B2BitOffset, 4); + } + else + { + r = get_byte_bits(cETC1AbsColor4R1BitOffset, 4); + g = get_byte_bits(cETC1AbsColor4G1BitOffset, 4); + b = get_byte_bits(cETC1AbsColor4B1BitOffset, 4); + } + return static_cast(b | (g << 4U) | (r << 8U)); + } + + inline color32 get_base5_color_unscaled() const + { + return color32(m_differential.m_red1, m_differential.m_green1, m_differential.m_blue1, 255); + } + + inline bool get_flip_bit() const + { + return (m_bytes[3] & 1) != 0; + } + + inline bool get_diff_bit() const + { + return (m_bytes[3] & 2) != 0; + } + + inline uint32_t get_inten_table(uint32_t subblock_id) const + { + assert(subblock_id < 2); + const uint32_t ofs = subblock_id ? 2 : 5; + return (m_bytes[3] >> ofs) & 7; + } + + inline uint16_t get_delta3_color() const + { + const uint32_t r = get_byte_bits(cETC1DeltaColor3RBitOffset, 3); + const uint32_t g = get_byte_bits(cETC1DeltaColor3GBitOffset, 3); + const uint32_t b = get_byte_bits(cETC1DeltaColor3BBitOffset, 3); + return static_cast(b | (g << 3U) | (r << 6U)); + } + + void get_block_colors(color32* pBlock_colors, uint32_t subblock_index) const + { + color32 b; + + if (get_diff_bit()) + { + if (subblock_index) + unpack_color5(b, get_base5_color(), get_delta3_color(), true, 255); + else + unpack_color5(b, get_base5_color(), true); + } + else + { + b = unpack_color4(get_base4_color(subblock_index), true, 255); + } + + const int* pInten_table = g_etc1_inten_tables[get_inten_table(subblock_index)]; + + pBlock_colors[0].set_noclamp_rgba(clamp255(b.r + pInten_table[0]), clamp255(b.g + pInten_table[0]), clamp255(b.b + pInten_table[0]), 255); + pBlock_colors[1].set_noclamp_rgba(clamp255(b.r + pInten_table[1]), clamp255(b.g + pInten_table[1]), clamp255(b.b + pInten_table[1]), 255); + pBlock_colors[2].set_noclamp_rgba(clamp255(b.r + pInten_table[2]), clamp255(b.g + pInten_table[2]), clamp255(b.b + pInten_table[2]), 255); + pBlock_colors[3].set_noclamp_rgba(clamp255(b.r + pInten_table[3]), clamp255(b.g + pInten_table[3]), clamp255(b.b + pInten_table[3]), 255); + } + + static uint16_t pack_color4(const color32& color, bool scaled, uint32_t bias = 127U) + { + return pack_color4(color.r, color.g, color.b, scaled, bias); + } + + static uint16_t pack_color4(uint32_t r, uint32_t g, uint32_t b, bool scaled, uint32_t bias = 127U) + { + if (scaled) + { + r = (r * 15U + bias) / 255U; + g = (g * 15U + bias) / 255U; + b = (b * 15U + bias) / 255U; + } + + r = basisu::minimum(r, 15U); + g = basisu::minimum(g, 15U); + b = basisu::minimum(b, 15U); + + return static_cast(b | (g << 4U) | (r << 8U)); + } + + static uint16_t pack_color5(const color32& color, bool scaled, uint32_t bias = 127U) + { + return pack_color5(color.r, color.g, color.b, scaled, bias); + } + + static uint16_t pack_color5(uint32_t r, uint32_t g, uint32_t b, bool scaled, uint32_t bias = 127U) + { + if (scaled) + { + r = (r * 31U + bias) / 255U; + g = (g * 31U + bias) / 255U; + b = (b * 31U + bias) / 255U; + } + + r = basisu::minimum(r, 31U); + g = basisu::minimum(g, 31U); + b = basisu::minimum(b, 31U); + + return static_cast(b | (g << 5U) | (r << 10U)); + } + + uint16_t pack_delta3(const color32& color) + { + return pack_delta3(color.r, color.g, color.b); + } + + uint16_t pack_delta3(int r, int g, int b) + { + assert((r >= cETC1ColorDeltaMin) && (r <= cETC1ColorDeltaMax)); + assert((g >= cETC1ColorDeltaMin) && (g <= cETC1ColorDeltaMax)); + assert((b >= cETC1ColorDeltaMin) && (b <= cETC1ColorDeltaMax)); + if (r < 0) r += 8; + if (g < 0) g += 8; + if (b < 0) b += 8; + return static_cast(b | (g << 3) | (r << 6)); + } + + static void unpack_delta3(int& r, int& g, int& b, uint16_t packed_delta3) + { + r = (packed_delta3 >> 6) & 7; + g = (packed_delta3 >> 3) & 7; + b = packed_delta3 & 7; + if (r >= 4) r -= 8; + if (g >= 4) g -= 8; + if (b >= 4) b -= 8; + } + + static color32 unpack_color5(uint16_t packed_color5, bool scaled, uint32_t alpha) + { + uint32_t b = packed_color5 & 31U; + uint32_t g = (packed_color5 >> 5U) & 31U; + uint32_t r = (packed_color5 >> 10U) & 31U; + + if (scaled) + { + b = (b << 3U) | (b >> 2U); + g = (g << 3U) | (g >> 2U); + r = (r << 3U) | (r >> 2U); + } + + assert(alpha <= 255); + + return color32(cNoClamp, r, g, b, alpha); + } + + static void unpack_color5(uint32_t& r, uint32_t& g, uint32_t& b, uint16_t packed_color5, bool scaled) + { + color32 c(unpack_color5(packed_color5, scaled, 0)); + r = c.r; + g = c.g; + b = c.b; + } + + static void unpack_color5(color32& result, uint16_t packed_color5, bool scaled) + { + result = unpack_color5(packed_color5, scaled, 255); + } + + static bool unpack_color5(color32& result, uint16_t packed_color5, uint16_t packed_delta3, bool scaled, uint32_t alpha) + { + int dr, dg, db; + unpack_delta3(dr, dg, db, packed_delta3); + + int r = ((packed_color5 >> 10U) & 31U) + dr; + int g = ((packed_color5 >> 5U) & 31U) + dg; + int b = (packed_color5 & 31U) + db; + + bool success = true; + if (static_cast(r | g | b) > 31U) + { + success = false; + r = basisu::clamp(r, 0, 31); + g = basisu::clamp(g, 0, 31); + b = basisu::clamp(b, 0, 31); + } + + if (scaled) + { + b = (b << 3U) | (b >> 2U); + g = (g << 3U) | (g >> 2U); + r = (r << 3U) | (r >> 2U); + } + + result.set_noclamp_rgba(r, g, b, basisu::minimum(alpha, 255U)); + return success; + } + + static color32 unpack_color4(uint16_t packed_color4, bool scaled, uint32_t alpha) + { + uint32_t b = packed_color4 & 15U; + uint32_t g = (packed_color4 >> 4U) & 15U; + uint32_t r = (packed_color4 >> 8U) & 15U; + + if (scaled) + { + b = (b << 4U) | b; + g = (g << 4U) | g; + r = (r << 4U) | r; + } + + return color32(cNoClamp, r, g, b, basisu::minimum(alpha, 255U)); + } + + static void unpack_color4(uint32_t& r, uint32_t& g, uint32_t& b, uint16_t packed_color4, bool scaled) + { + color32 c(unpack_color4(packed_color4, scaled, 0)); + r = c.r; + g = c.g; + b = c.b; + } + + static void get_diff_subblock_colors(color32* pDst, uint16_t packed_color5, uint32_t table_idx) + { + assert(table_idx < cETC1IntenModifierValues); + const int* pInten_modifer_table = &g_etc1_inten_tables[table_idx][0]; + + uint32_t r, g, b; + unpack_color5(r, g, b, packed_color5, true); + + const int ir = static_cast(r), ig = static_cast(g), ib = static_cast(b); + + const int y0 = pInten_modifer_table[0]; + pDst[0].set(clamp255(ir + y0), clamp255(ig + y0), clamp255(ib + y0), 255); + + const int y1 = pInten_modifer_table[1]; + pDst[1].set(clamp255(ir + y1), clamp255(ig + y1), clamp255(ib + y1), 255); + + const int y2 = pInten_modifer_table[2]; + pDst[2].set(clamp255(ir + y2), clamp255(ig + y2), clamp255(ib + y2), 255); + + const int y3 = pInten_modifer_table[3]; + pDst[3].set(clamp255(ir + y3), clamp255(ig + y3), clamp255(ib + y3), 255); + } + + static int clamp255(int x) + { + if (x & 0xFFFFFF00) + { + if (x < 0) + x = 0; + else if (x > 255) + x = 255; + } + + return x; + } + + static void get_block_colors5(color32* pBlock_colors, const color32& base_color5, uint32_t inten_table) + { + color32 b(base_color5); + + b.r = (b.r << 3) | (b.r >> 2); + b.g = (b.g << 3) | (b.g >> 2); + b.b = (b.b << 3) | (b.b >> 2); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + pBlock_colors[0].set(clamp255(b.r + pInten_table[0]), clamp255(b.g + pInten_table[0]), clamp255(b.b + pInten_table[0]), 255); + pBlock_colors[1].set(clamp255(b.r + pInten_table[1]), clamp255(b.g + pInten_table[1]), clamp255(b.b + pInten_table[1]), 255); + pBlock_colors[2].set(clamp255(b.r + pInten_table[2]), clamp255(b.g + pInten_table[2]), clamp255(b.b + pInten_table[2]), 255); + pBlock_colors[3].set(clamp255(b.r + pInten_table[3]), clamp255(b.g + pInten_table[3]), clamp255(b.b + pInten_table[3]), 255); + } + + static void get_block_color5(const color32& base_color5, uint32_t inten_table, uint32_t index, uint32_t& r, uint32_t &g, uint32_t &b) + { + assert(index < 4); + + uint32_t br = (base_color5.r << 3) | (base_color5.r >> 2); + uint32_t bg = (base_color5.g << 3) | (base_color5.g >> 2); + uint32_t bb = (base_color5.b << 3) | (base_color5.b >> 2); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + r = clamp255(br + pInten_table[index]); + g = clamp255(bg + pInten_table[index]); + b = clamp255(bb + pInten_table[index]); + } + + static void get_block_color5_r(const color32& base_color5, uint32_t inten_table, uint32_t index, uint32_t &r) + { + assert(index < 4); + + uint32_t br = (base_color5.r << 3) | (base_color5.r >> 2); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + r = clamp255(br + pInten_table[index]); + } + + static void get_block_colors5_g(int* pBlock_colors, const color32& base_color5, uint32_t inten_table) + { + const int g = (base_color5.g << 3) | (base_color5.g >> 2); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + pBlock_colors[0] = clamp255(g + pInten_table[0]); + pBlock_colors[1] = clamp255(g + pInten_table[1]); + pBlock_colors[2] = clamp255(g + pInten_table[2]); + pBlock_colors[3] = clamp255(g + pInten_table[3]); + } + + static void get_block_colors5_bounds(color32* pBlock_colors, const color32& base_color5, uint32_t inten_table, uint32_t l = 0, uint32_t h = 3) + { + color32 b(base_color5); + + b.r = (b.r << 3) | (b.r >> 2); + b.g = (b.g << 3) | (b.g >> 2); + b.b = (b.b << 3) | (b.b >> 2); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + pBlock_colors[0].set(clamp255(b.r + pInten_table[l]), clamp255(b.g + pInten_table[l]), clamp255(b.b + pInten_table[l]), 255); + pBlock_colors[1].set(clamp255(b.r + pInten_table[h]), clamp255(b.g + pInten_table[h]), clamp255(b.b + pInten_table[h]), 255); + } + + static void get_block_colors5_bounds_g(uint32_t* pBlock_colors, const color32& base_color5, uint32_t inten_table, uint32_t l = 0, uint32_t h = 3) + { + color32 b(base_color5); + + b.g = (b.g << 3) | (b.g >> 2); + + const int* pInten_table = g_etc1_inten_tables[inten_table]; + + pBlock_colors[0] = clamp255(b.g + pInten_table[l]); + pBlock_colors[1] = clamp255(b.g + pInten_table[h]); + } + }; + + enum dxt_constants + { + cDXT1SelectorBits = 2U, cDXT1SelectorValues = 1U << cDXT1SelectorBits, cDXT1SelectorMask = cDXT1SelectorValues - 1U, + cDXT5SelectorBits = 3U, cDXT5SelectorValues = 1U << cDXT5SelectorBits, cDXT5SelectorMask = cDXT5SelectorValues - 1U, + }; + + static const uint8_t g_etc1_x_selector_unpack[4][256] = + { + { + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + }, + { + 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, + 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, + 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, + 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, + }, + + { + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, + }, + + { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + } + }; + + struct dxt1_block + { + enum { cTotalEndpointBytes = 2, cTotalSelectorBytes = 4 }; + + uint8_t m_low_color[cTotalEndpointBytes]; + uint8_t m_high_color[cTotalEndpointBytes]; + uint8_t m_selectors[cTotalSelectorBytes]; + + inline void clear() { basisu::clear_obj(*this); } + + inline uint32_t get_high_color() const { return m_high_color[0] | (m_high_color[1] << 8U); } + inline uint32_t get_low_color() const { return m_low_color[0] | (m_low_color[1] << 8U); } + inline void set_low_color(uint16_t c) { m_low_color[0] = static_cast(c & 0xFF); m_low_color[1] = static_cast((c >> 8) & 0xFF); } + inline void set_high_color(uint16_t c) { m_high_color[0] = static_cast(c & 0xFF); m_high_color[1] = static_cast((c >> 8) & 0xFF); } + inline uint32_t get_selector(uint32_t x, uint32_t y) const { assert((x < 4U) && (y < 4U)); return (m_selectors[y] >> (x * cDXT1SelectorBits)) & cDXT1SelectorMask; } + inline void set_selector(uint32_t x, uint32_t y, uint32_t val) { assert((x < 4U) && (y < 4U) && (val < 4U)); m_selectors[y] &= (~(cDXT1SelectorMask << (x * cDXT1SelectorBits))); m_selectors[y] |= (val << (x * cDXT1SelectorBits)); } + + static uint16_t pack_color(const color32& color, bool scaled, uint32_t bias = 127U) + { + uint32_t r = color.r, g = color.g, b = color.b; + if (scaled) + { + r = (r * 31U + bias) / 255U; + g = (g * 63U + bias) / 255U; + b = (b * 31U + bias) / 255U; + } + return static_cast(basisu::minimum(b, 31U) | (basisu::minimum(g, 63U) << 5U) | (basisu::minimum(r, 31U) << 11U)); + } + + static uint16_t pack_unscaled_color(uint32_t r, uint32_t g, uint32_t b) { return static_cast(b | (g << 5U) | (r << 11U)); } + }; + + struct dxt_selector_range + { + uint32_t m_low; + uint32_t m_high; + }; + + struct etc1_to_dxt1_56_solution + { + uint8_t m_lo; + uint8_t m_hi; + uint16_t m_err; + }; + +#if BASISD_SUPPORT_DXT1 + static dxt_selector_range g_etc1_to_dxt1_selector_ranges[] = + { + { 0, 3 }, + + { 1, 3 }, + { 0, 2 }, + + { 1, 2 }, + + { 2, 3 }, + { 0, 1 }, + }; + + const uint32_t NUM_ETC1_TO_DXT1_SELECTOR_RANGES = sizeof(g_etc1_to_dxt1_selector_ranges) / sizeof(g_etc1_to_dxt1_selector_ranges[0]); + + static uint32_t g_etc1_to_dxt1_selector_range_index[4][4]; + + const uint32_t NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS = 10; + static const uint8_t g_etc1_to_dxt1_selector_mappings[NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS][4] = + { + { 0, 0, 1, 1 }, + { 0, 0, 1, 2 }, + { 0, 0, 1, 3 }, + { 0, 0, 2, 3 }, + { 0, 1, 1, 1 }, + { 0, 1, 2, 2 }, + { 0, 1, 2, 3 }, + { 0, 2, 3, 3 }, + { 1, 2, 2, 2 }, + { 1, 2, 3, 3 }, + }; + + static uint8_t g_etc1_to_dxt1_selector_mappings_raw_dxt1_256[NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS][256]; + static uint8_t g_etc1_to_dxt1_selector_mappings_raw_dxt1_inv_256[NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS][256]; + + static const etc1_to_dxt1_56_solution g_etc1_to_dxt_6[32 * 8 * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS * NUM_ETC1_TO_DXT1_SELECTOR_RANGES] = { +#include "basisu_transcoder_tables_dxt1_6.inc" + }; + + static const etc1_to_dxt1_56_solution g_etc1_to_dxt_5[32 * 8 * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS * NUM_ETC1_TO_DXT1_SELECTOR_RANGES] = { +#include "basisu_transcoder_tables_dxt1_5.inc" + }; +#endif // BASISD_SUPPORT_DXT1 + +#if BASISD_SUPPORT_DXT1 || BASISD_SUPPORT_UASTC + // First saw the idea for optimal BC1 single-color block encoding using lookup tables in ryg_dxt. + struct bc1_match_entry + { + uint8_t m_hi; + uint8_t m_lo; + }; + static bc1_match_entry g_bc1_match5_equals_1[256], g_bc1_match6_equals_1[256]; // selector 1, allow equals hi/lo + static bc1_match_entry g_bc1_match5_equals_0[256], g_bc1_match6_equals_0[256]; // selector 0, allow equals hi/lo + + static void prepare_bc1_single_color_table(bc1_match_entry* pTable, const uint8_t* pExpand, int size0, int size1, int sel) + { + for (int i = 0; i < 256; i++) + { + int lowest_e = 256; + for (int lo = 0; lo < size0; lo++) + { + for (int hi = 0; hi < size1; hi++) + { + const int lo_e = pExpand[lo], hi_e = pExpand[hi]; + int e; + + if (sel == 1) + { + // Selector 1 + e = basisu::iabs(((hi_e * 2 + lo_e) / 3) - i); + e += (basisu::iabs(hi_e - lo_e) * 3) / 100; + } + else + { + assert(sel == 0); + + // Selector 0 + e = basisu::iabs(hi_e - i); + } + + if (e < lowest_e) + { + pTable[i].m_hi = static_cast(hi); + pTable[i].m_lo = static_cast(lo); + + lowest_e = e; + } + + } // hi + } // lo + } + } +#endif + +#if BASISD_WRITE_NEW_DXT1_TABLES + static void create_etc1_to_dxt1_5_conversion_table() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_dxt1_5.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1_TO_DXT1_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1_to_dxt1_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1_to_dxt1_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 31; hi++) + { + for (uint32_t lo = 0; lo <= 31; lo++) + { + //if (lo == hi) continue; + + uint32_t colors[4]; + + colors[0] = (lo << 3) | (lo >> 2); + colors[3] = (hi << 3) | (hi >> 2); + + colors[1] = (colors[0] * 2 + colors[3]) / 3; + colors[2] = (colors[3] * 2 + colors[0]) / 3; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1_to_dxt1_selector_mappings[m][s]]; + + total_err += err * err; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + assert(best_err <= 0xFFFF); + + //table[g + inten * 32].m_solutions[sr][m].m_lo = static_cast(best_lo); + //table[g + inten * 32].m_solutions[sr][m].m_hi = static_cast(best_hi); + //table[g + inten * 32].m_solutions[sr][m].m_err = static_cast(best_err); + + //assert(best_lo != best_hi); + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); + } + + static void create_etc1_to_dxt1_6_conversion_table() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_dxt1_6.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1_TO_DXT1_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1_to_dxt1_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1_to_dxt1_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 63; hi++) + { + for (uint32_t lo = 0; lo <= 63; lo++) + { + //if (lo == hi) continue; + + uint32_t colors[4]; + + colors[0] = (lo << 2) | (lo >> 4); + colors[3] = (hi << 2) | (hi >> 4); + + colors[1] = (colors[0] * 2 + colors[3]) / 3; + colors[2] = (colors[3] * 2 + colors[0]) / 3; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1_to_dxt1_selector_mappings[m][s]]; + + total_err += err * err; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + assert(best_err <= 0xFFFF); + + //table[g + inten * 32].m_solutions[sr][m].m_lo = static_cast(best_lo); + //table[g + inten * 32].m_solutions[sr][m].m_hi = static_cast(best_hi); + //table[g + inten * 32].m_solutions[sr][m].m_err = static_cast(best_err); + + //assert(best_lo != best_hi); + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + + } // m + } // sr + } // g + } // inten + + fclose(pFile); + } +#endif + + +#if BASISD_SUPPORT_UASTC || BASISD_SUPPORT_ETC2_EAC_A8 || BASISD_SUPPORT_ETC2_EAC_RG11 + static const int8_t g_eac_modifier_table[16][8] = + { + { -3, -6, -9, -15, 2, 5, 8, 14 }, + { -3, -7, -10, -13, 2, 6, 9, 12 }, + { -2, -5, -8, -13, 1, 4, 7, 12 }, + { -2, -4, -6, -13, 1, 3, 5, 12 }, + { -3, -6, -8, -12, 2, 5, 7, 11 }, + { -3, -7, -9, -11, 2, 6, 8, 10 }, + { -4, -7, -8, -11, 3, 6, 7, 10 }, + { -3, -5, -8, -11, 2, 4, 7, 10 }, + + { -2, -6, -8, -10, 1, 5, 7, 9 }, + { -2, -5, -8, -10, 1, 4, 7, 9 }, + { -2, -4, -8, -10, 1, 3, 7, 9 }, + { -2, -5, -7, -10, 1, 4, 6, 9 }, + { -3, -4, -7, -10, 2, 3, 6, 9 }, + { -1, -2, -3, -10, 0, 1, 2, 9 }, // entry 13 + { -4, -6, -8, -9, 3, 5, 7, 8 }, + { -3, -5, -7, -9, 2, 4, 6, 8 } + }; + + // Used by ETC2 EAC A8 and ETC2 EAC R11/RG11. + struct eac_block + { + uint16_t m_base : 8; + + uint16_t m_table : 4; + uint16_t m_multiplier : 4; + + uint8_t m_selectors[6]; + + uint32_t get_selector(uint32_t x, uint32_t y) const + { + assert((x < 4) && (y < 4)); + + const uint32_t ofs = 45 - (y + x * 4) * 3; + + const uint64_t pixels = get_selector_bits(); + + return (pixels >> ofs) & 7; + } + + void set_selector(uint32_t x, uint32_t y, uint32_t s) + { + assert((x < 4) && (y < 4) && (s < 8)); + + const uint32_t ofs = 45 - (y + x * 4) * 3; + + uint64_t pixels = get_selector_bits(); + + pixels &= ~(7ULL << ofs); + pixels |= (static_cast(s) << ofs); + + set_selector_bits(pixels); + } + + uint64_t get_selector_bits() const + { + uint64_t pixels = ((uint64_t)m_selectors[0] << 40) | ((uint64_t)m_selectors[1] << 32) | + ((uint64_t)m_selectors[2] << 24) | + ((uint64_t)m_selectors[3] << 16) | ((uint64_t)m_selectors[4] << 8) | m_selectors[5]; + return pixels; + } + + void set_selector_bits(uint64_t pixels) + { + m_selectors[0] = (uint8_t)(pixels >> 40); + m_selectors[1] = (uint8_t)(pixels >> 32); + m_selectors[2] = (uint8_t)(pixels >> 24); + m_selectors[3] = (uint8_t)(pixels >> 16); + m_selectors[4] = (uint8_t)(pixels >> 8); + m_selectors[5] = (uint8_t)(pixels); + } + }; + +#endif // #if BASISD_SUPPORT_UASTC BASISD_SUPPORT_ETC2_EAC_A8 || BASISD_SUPPORT_ETC2_EAC_RG11 + +#if BASISD_SUPPORT_ETC2_EAC_A8 || BASISD_SUPPORT_ETC2_EAC_RG11 + static const dxt_selector_range s_etc2_eac_selector_ranges[] = + { + { 0, 3 }, + + { 1, 3 }, + { 0, 2 }, + + { 1, 2 }, + }; + + const uint32_t NUM_ETC2_EAC_SELECTOR_RANGES = sizeof(s_etc2_eac_selector_ranges) / sizeof(s_etc2_eac_selector_ranges[0]); + + struct etc1_g_to_eac_conversion + { + uint8_t m_base; + uint8_t m_table_mul; // mul*16+table + uint16_t m_trans; // translates ETC1 selectors to ETC2_EAC_A8 + }; +#endif // BASISD_SUPPORT_ETC2_EAC_A8 || BASISD_SUPPORT_ETC2_EAC_RG11 + +#if BASISD_SUPPORT_ETC2_EAC_A8 + +#if BASISD_WRITE_NEW_ETC2_EAC_A8_TABLES + struct pack_eac_a8_results + { + uint32_t m_base; + uint32_t m_table; + uint32_t m_multiplier; + basisu::vector m_selectors; + basisu::vector m_selectors_temp; + }; + + static uint64_t pack_eac_a8_exhaustive(pack_eac_a8_results& results, const uint8_t* pPixels, uint32_t num_pixels) + { + results.m_selectors.resize(num_pixels); + results.m_selectors_temp.resize(num_pixels); + + uint64_t best_err = UINT64_MAX; + + for (uint32_t base_color = 0; base_color < 256; base_color++) + { + for (uint32_t multiplier = 1; multiplier < 16; multiplier++) + { + for (uint32_t table = 0; table < 16; table++) + { + uint64_t total_err = 0; + + for (uint32_t i = 0; i < num_pixels; i++) + { + const int a = pPixels[i]; + + uint32_t best_s_err = UINT32_MAX; + uint32_t best_s = 0; + for (uint32_t s = 0; s < 8; s++) + { + int v = (int)multiplier * g_eac_modifier_table[table][s] + (int)base_color; + if (v < 0) + v = 0; + else if (v > 255) + v = 255; + + uint32_t err = abs(a - v); + if (err < best_s_err) + { + best_s_err = err; + best_s = s; + } + } + + results.m_selectors_temp[i] = static_cast(best_s); + + total_err += best_s_err * best_s_err; + if (total_err >= best_err) + break; + } + + if (total_err < best_err) + { + best_err = total_err; + results.m_base = base_color; + results.m_multiplier = multiplier; + results.m_table = table; + results.m_selectors.swap(results.m_selectors_temp); + } + + } // table + + } // multiplier + + } // base_color + + return best_err; + } +#endif // BASISD_WRITE_NEW_ETC2_EAC_A8_TABLES + + static +#if !BASISD_WRITE_NEW_ETC2_EAC_A8_TABLES + const +#endif + etc1_g_to_eac_conversion s_etc1_g_to_etc2_a8[32 * 8][NUM_ETC2_EAC_SELECTOR_RANGES] = + { + { { 0,1,3328 },{ 0,1,3328 },{ 0,1,256 },{ 0,1,256 } }, + { { 0,226,3936 },{ 0,226,3936 },{ 0,81,488 },{ 0,81,488 } }, + { { 6,178,4012 },{ 6,178,4008 },{ 0,146,501 },{ 0,130,496 } }, + { { 14,178,4012 },{ 14,178,4008 },{ 8,146,501 },{ 6,82,496 } }, + { { 23,178,4012 },{ 23,178,4008 },{ 17,146,501 },{ 3,228,496 } }, + { { 31,178,4012 },{ 31,178,4008 },{ 25,146,501 },{ 11,228,496 } }, + { { 39,178,4012 },{ 39,178,4008 },{ 33,146,501 },{ 19,228,496 } }, + { { 47,178,4012 },{ 47,178,4008 },{ 41,146,501 },{ 27,228,496 } }, + { { 56,178,4012 },{ 56,178,4008 },{ 50,146,501 },{ 36,228,496 } }, + { { 64,178,4012 },{ 64,178,4008 },{ 58,146,501 },{ 44,228,496 } }, + { { 72,178,4012 },{ 72,178,4008 },{ 66,146,501 },{ 52,228,496 } }, + { { 80,178,4012 },{ 80,178,4008 },{ 74,146,501 },{ 60,228,496 } }, + { { 89,178,4012 },{ 89,178,4008 },{ 83,146,501 },{ 69,228,496 } }, + { { 97,178,4012 },{ 97,178,4008 },{ 91,146,501 },{ 77,228,496 } }, + { { 105,178,4012 },{ 105,178,4008 },{ 99,146,501 },{ 85,228,496 } }, + { { 113,178,4012 },{ 113,178,4008 },{ 107,146,501 },{ 93,228,496 } }, + { { 122,178,4012 },{ 122,178,4008 },{ 116,146,501 },{ 102,228,496 } }, + { { 130,178,4012 },{ 130,178,4008 },{ 124,146,501 },{ 110,228,496 } }, + { { 138,178,4012 },{ 138,178,4008 },{ 132,146,501 },{ 118,228,496 } }, + { { 146,178,4012 },{ 146,178,4008 },{ 140,146,501 },{ 126,228,496 } }, + { { 155,178,4012 },{ 155,178,4008 },{ 149,146,501 },{ 135,228,496 } }, + { { 163,178,4012 },{ 163,178,4008 },{ 157,146,501 },{ 143,228,496 } }, + { { 171,178,4012 },{ 171,178,4008 },{ 165,146,501 },{ 151,228,496 } }, + { { 179,178,4012 },{ 179,178,4008 },{ 173,146,501 },{ 159,228,496 } }, + { { 188,178,4012 },{ 188,178,4008 },{ 182,146,501 },{ 168,228,496 } }, + { { 196,178,4012 },{ 196,178,4008 },{ 190,146,501 },{ 176,228,496 } }, + { { 204,178,4012 },{ 204,178,4008 },{ 198,146,501 },{ 184,228,496 } }, + { { 212,178,4012 },{ 212,178,4008 },{ 206,146,501 },{ 192,228,496 } }, + { { 221,178,4012 },{ 221,178,4008 },{ 215,146,501 },{ 201,228,496 } }, + { { 229,178,4012 },{ 229,178,4008 },{ 223,146,501 },{ 209,228,496 } }, + { { 235,66,4012 },{ 221,100,4008 },{ 231,146,501 },{ 217,228,496 } }, + { { 211,102,4085 },{ 118,31,4080 },{ 211,102,501 },{ 118,31,496 } }, + { { 1,2,3328 },{ 1,2,3328 },{ 0,1,320 },{ 0,1,320 } }, + { { 7,162,3905 },{ 7,162,3904 },{ 1,17,480 },{ 1,17,480 } }, + { { 15,162,3906 },{ 15,162,3904 },{ 1,117,352 },{ 1,117,352 } }, + { { 23,162,3906 },{ 23,162,3904 },{ 5,34,500 },{ 4,53,424 } }, + { { 32,162,3906 },{ 32,162,3904 },{ 14,34,500 },{ 3,69,424 } }, + { { 40,162,3906 },{ 40,162,3904 },{ 22,34,500 },{ 1,133,496 } }, + { { 48,162,3906 },{ 48,162,3904 },{ 30,34,500 },{ 4,85,496 } }, + { { 56,162,3906 },{ 56,162,3904 },{ 38,34,500 },{ 12,85,496 } }, + { { 65,162,3906 },{ 65,162,3904 },{ 47,34,500 },{ 1,106,424 } }, + { { 73,162,3906 },{ 73,162,3904 },{ 55,34,500 },{ 9,106,424 } }, + { { 81,162,3906 },{ 81,162,3904 },{ 63,34,500 },{ 7,234,496 } }, + { { 89,162,3906 },{ 89,162,3904 },{ 71,34,500 },{ 15,234,496 } }, + { { 98,162,3906 },{ 98,162,3904 },{ 80,34,500 },{ 24,234,496 } }, + { { 106,162,3906 },{ 106,162,3904 },{ 88,34,500 },{ 32,234,496 } }, + { { 114,162,3906 },{ 114,162,3904 },{ 96,34,500 },{ 40,234,496 } }, + { { 122,162,3906 },{ 122,162,3904 },{ 104,34,500 },{ 48,234,496 } }, + { { 131,162,3906 },{ 131,162,3904 },{ 113,34,500 },{ 57,234,496 } }, + { { 139,162,3906 },{ 139,162,3904 },{ 121,34,500 },{ 65,234,496 } }, + { { 147,162,3906 },{ 147,162,3904 },{ 129,34,500 },{ 73,234,496 } }, + { { 155,162,3906 },{ 155,162,3904 },{ 137,34,500 },{ 81,234,496 } }, + { { 164,162,3906 },{ 164,162,3904 },{ 146,34,500 },{ 90,234,496 } }, + { { 172,162,3906 },{ 172,162,3904 },{ 154,34,500 },{ 98,234,496 } }, + { { 180,162,3906 },{ 180,162,3904 },{ 162,34,500 },{ 106,234,496 } }, + { { 188,162,3906 },{ 188,162,3904 },{ 170,34,500 },{ 114,234,496 } }, + { { 197,162,3906 },{ 197,162,3904 },{ 179,34,500 },{ 123,234,496 } }, + { { 205,162,3906 },{ 205,162,3904 },{ 187,34,500 },{ 131,234,496 } }, + { { 213,162,3906 },{ 213,162,3904 },{ 195,34,500 },{ 139,234,496 } }, + { { 221,162,3906 },{ 221,162,3904 },{ 203,34,500 },{ 147,234,496 } }, + { { 230,162,3906 },{ 230,162,3904 },{ 212,34,500 },{ 156,234,496 } }, + { { 238,162,3906 },{ 174,106,4008 },{ 220,34,500 },{ 164,234,496 } }, + { { 240,178,4001 },{ 182,106,4008 },{ 228,34,500 },{ 172,234,496 } }, + { { 166,108,4085 },{ 115,31,4080 },{ 166,108,501 },{ 115,31,496 } }, + { { 1,68,3328 },{ 1,68,3328 },{ 0,17,384 },{ 0,17,384 } }, + { { 1,148,3904 },{ 1,148,3904 },{ 1,2,384 },{ 1,2,384 } }, + { { 21,18,3851 },{ 21,18,3848 },{ 1,50,488 },{ 1,50,488 } }, + { { 27,195,3851 },{ 29,18,3848 },{ 0,67,488 },{ 0,67,488 } }, + { { 34,195,3907 },{ 38,18,3848 },{ 20,66,482 },{ 0,3,496 } }, + { { 42,195,3907 },{ 46,18,3848 },{ 28,66,482 },{ 2,6,424 } }, + { { 50,195,3907 },{ 54,18,3848 },{ 36,66,482 },{ 4,22,424 } }, + { { 58,195,3907 },{ 62,18,3848 },{ 44,66,482 },{ 3,73,424 } }, + { { 67,195,3907 },{ 71,18,3848 },{ 53,66,482 },{ 3,22,496 } }, + { { 75,195,3907 },{ 79,18,3848 },{ 61,66,482 },{ 2,137,496 } }, + { { 83,195,3907 },{ 87,18,3848 },{ 69,66,482 },{ 1,89,496 } }, + { { 91,195,3907 },{ 95,18,3848 },{ 77,66,482 },{ 9,89,496 } }, + { { 100,195,3907 },{ 104,18,3848 },{ 86,66,482 },{ 18,89,496 } }, + { { 108,195,3907 },{ 112,18,3848 },{ 94,66,482 },{ 26,89,496 } }, + { { 116,195,3907 },{ 120,18,3848 },{ 102,66,482 },{ 34,89,496 } }, + { { 124,195,3907 },{ 128,18,3848 },{ 110,66,482 },{ 42,89,496 } }, + { { 133,195,3907 },{ 137,18,3848 },{ 119,66,482 },{ 51,89,496 } }, + { { 141,195,3907 },{ 145,18,3848 },{ 127,66,482 },{ 59,89,496 } }, + { { 149,195,3907 },{ 153,18,3848 },{ 135,66,482 },{ 67,89,496 } }, + { { 157,195,3907 },{ 161,18,3848 },{ 143,66,482 },{ 75,89,496 } }, + { { 166,195,3907 },{ 170,18,3848 },{ 152,66,482 },{ 84,89,496 } }, + { { 174,195,3907 },{ 178,18,3848 },{ 160,66,482 },{ 92,89,496 } }, + { { 182,195,3907 },{ 186,18,3848 },{ 168,66,482 },{ 100,89,496 } }, + { { 190,195,3907 },{ 194,18,3848 },{ 176,66,482 },{ 108,89,496 } }, + { { 199,195,3907 },{ 203,18,3848 },{ 185,66,482 },{ 117,89,496 } }, + { { 207,195,3907 },{ 211,18,3848 },{ 193,66,482 },{ 125,89,496 } }, + { { 215,195,3907 },{ 219,18,3848 },{ 201,66,482 },{ 133,89,496 } }, + { { 223,195,3907 },{ 227,18,3848 },{ 209,66,482 },{ 141,89,496 } }, + { { 231,195,3907 },{ 168,89,4008 },{ 218,66,482 },{ 150,89,496 } }, + { { 236,18,3907 },{ 176,89,4008 },{ 226,66,482 },{ 158,89,496 } }, + { { 158,90,4085 },{ 103,31,4080 },{ 158,90,501 },{ 103,31,496 } }, + { { 166,90,4085 },{ 111,31,4080 },{ 166,90,501 },{ 111,31,496 } }, + { { 0,70,3328 },{ 0,70,3328 },{ 0,45,256 },{ 0,45,256 } }, + { { 0,117,3904 },{ 0,117,3904 },{ 0,35,384 },{ 0,35,384 } }, + { { 13,165,3905 },{ 13,165,3904 },{ 3,221,416 },{ 3,221,416 } }, + { { 21,165,3906 },{ 21,165,3904 },{ 11,221,416 },{ 11,221,416 } }, + { { 30,165,3906 },{ 30,165,3904 },{ 7,61,352 },{ 7,61,352 } }, + { { 38,165,3906 },{ 38,165,3904 },{ 2,125,352 },{ 2,125,352 } }, + { { 46,165,3906 },{ 46,165,3904 },{ 2,37,500 },{ 10,125,352 } }, + { { 54,165,3906 },{ 54,165,3904 },{ 10,37,500 },{ 5,61,424 } }, + { { 63,165,3906 },{ 63,165,3904 },{ 19,37,500 },{ 1,189,424 } }, + { { 4,254,4012 },{ 71,165,3904 },{ 27,37,500 },{ 9,189,424 } }, + { { 12,254,4012 },{ 79,165,3904 },{ 35,37,500 },{ 4,77,424 } }, + { { 20,254,4012 },{ 87,165,3904 },{ 43,37,500 },{ 12,77,424 } }, + { { 29,254,4012 },{ 96,165,3904 },{ 52,37,500 },{ 8,93,424 } }, + { { 37,254,4012 },{ 104,165,3904 },{ 60,37,500 },{ 3,141,496 } }, + { { 45,254,4012 },{ 112,165,3904 },{ 68,37,500 },{ 11,141,496 } }, + { { 53,254,4012 },{ 120,165,3904 },{ 76,37,500 },{ 6,93,496 } }, + { { 62,254,4012 },{ 129,165,3904 },{ 85,37,500 },{ 15,93,496 } }, + { { 70,254,4012 },{ 137,165,3904 },{ 93,37,500 },{ 23,93,496 } }, + { { 78,254,4012 },{ 145,165,3904 },{ 101,37,500 },{ 31,93,496 } }, + { { 86,254,4012 },{ 153,165,3904 },{ 109,37,500 },{ 39,93,496 } }, + { { 95,254,4012 },{ 162,165,3904 },{ 118,37,500 },{ 48,93,496 } }, + { { 103,254,4012 },{ 170,165,3904 },{ 126,37,500 },{ 56,93,496 } }, + { { 111,254,4012 },{ 178,165,3904 },{ 134,37,500 },{ 64,93,496 } }, + { { 119,254,4012 },{ 186,165,3904 },{ 142,37,500 },{ 72,93,496 } }, + { { 128,254,4012 },{ 195,165,3904 },{ 151,37,500 },{ 81,93,496 } }, + { { 136,254,4012 },{ 203,165,3904 },{ 159,37,500 },{ 89,93,496 } }, + { { 212,165,3906 },{ 136,77,4008 },{ 167,37,500 },{ 97,93,496 } }, + { { 220,165,3394 },{ 131,93,4008 },{ 175,37,500 },{ 105,93,496 } }, + { { 214,181,4001 },{ 140,93,4008 },{ 184,37,500 },{ 114,93,496 } }, + { { 222,181,4001 },{ 148,93,4008 },{ 192,37,500 },{ 122,93,496 } }, + { { 114,95,4085 },{ 99,31,4080 },{ 114,95,501 },{ 99,31,496 } }, + { { 122,95,4085 },{ 107,31,4080 },{ 122,95,501 },{ 107,31,496 } }, + { { 0,102,3840 },{ 0,102,3840 },{ 0,18,384 },{ 0,18,384 } }, + { { 5,167,3904 },{ 5,167,3904 },{ 0,13,256 },{ 0,13,256 } }, + { { 4,54,3968 },{ 4,54,3968 },{ 1,67,448 },{ 1,67,448 } }, + { { 30,198,3850 },{ 30,198,3848 },{ 0,3,480 },{ 0,3,480 } }, + { { 39,198,3850 },{ 39,198,3848 },{ 3,52,488 },{ 3,52,488 } }, + { { 47,198,3851 },{ 47,198,3848 },{ 3,4,488 },{ 3,4,488 } }, + { { 55,198,3851 },{ 55,198,3848 },{ 1,70,488 },{ 1,70,488 } }, + { { 54,167,3906 },{ 63,198,3848 },{ 3,22,488 },{ 3,22,488 } }, + { { 62,167,3906 },{ 72,198,3848 },{ 24,118,488 },{ 0,6,496 } }, + { { 70,167,3906 },{ 80,198,3848 },{ 32,118,488 },{ 2,89,488 } }, + { { 78,167,3906 },{ 88,198,3848 },{ 40,118,488 },{ 1,73,496 } }, + { { 86,167,3906 },{ 96,198,3848 },{ 48,118,488 },{ 0,28,424 } }, + { { 95,167,3906 },{ 105,198,3848 },{ 57,118,488 },{ 9,28,424 } }, + { { 103,167,3906 },{ 113,198,3848 },{ 65,118,488 },{ 5,108,496 } }, + { { 111,167,3906 },{ 121,198,3848 },{ 73,118,488 },{ 13,108,496 } }, + { { 119,167,3906 },{ 129,198,3848 },{ 81,118,488 },{ 21,108,496 } }, + { { 128,167,3906 },{ 138,198,3848 },{ 90,118,488 },{ 6,28,496 } }, + { { 136,167,3906 },{ 146,198,3848 },{ 98,118,488 },{ 14,28,496 } }, + { { 144,167,3906 },{ 154,198,3848 },{ 106,118,488 },{ 22,28,496 } }, + { { 152,167,3906 },{ 162,198,3848 },{ 114,118,488 },{ 30,28,496 } }, + { { 161,167,3906 },{ 171,198,3848 },{ 123,118,488 },{ 39,28,496 } }, + { { 169,167,3906 },{ 179,198,3848 },{ 131,118,488 },{ 47,28,496 } }, + { { 177,167,3906 },{ 187,198,3848 },{ 139,118,488 },{ 55,28,496 } }, + { { 185,167,3906 },{ 195,198,3848 },{ 147,118,488 },{ 63,28,496 } }, + { { 194,167,3906 },{ 120,12,4008 },{ 156,118,488 },{ 72,28,496 } }, + { { 206,198,3907 },{ 116,28,4008 },{ 164,118,488 },{ 80,28,496 } }, + { { 214,198,3907 },{ 124,28,4008 },{ 172,118,488 },{ 88,28,496 } }, + { { 222,198,3395 },{ 132,28,4008 },{ 180,118,488 },{ 96,28,496 } }, + { { 207,134,4001 },{ 141,28,4008 },{ 189,118,488 },{ 105,28,496 } }, + { { 95,30,4085 },{ 86,31,4080 },{ 95,30,501 },{ 86,31,496 } }, + { { 103,30,4085 },{ 94,31,4080 },{ 103,30,501 },{ 94,31,496 } }, + { { 111,30,4085 },{ 102,31,4080 },{ 111,30,501 },{ 102,31,496 } }, + { { 0,104,3840 },{ 0,104,3840 },{ 0,18,448 },{ 0,18,448 } }, + { { 4,39,3904 },{ 4,39,3904 },{ 0,4,384 },{ 0,4,384 } }, + { { 0,56,3968 },{ 0,56,3968 },{ 0,84,448 },{ 0,84,448 } }, + { { 6,110,3328 },{ 6,110,3328 },{ 0,20,448 },{ 0,20,448 } }, + { { 41,200,3850 },{ 41,200,3848 },{ 1,4,480 },{ 1,4,480 } }, + { { 49,200,3850 },{ 49,200,3848 },{ 1,8,416 },{ 1,8,416 } }, + { { 57,200,3851 },{ 57,200,3848 },{ 1,38,488 },{ 1,38,488 } }, + { { 65,200,3851 },{ 65,200,3848 },{ 1,120,488 },{ 1,120,488 } }, + { { 74,200,3851 },{ 74,200,3848 },{ 2,72,488 },{ 2,72,488 } }, + { { 69,6,3907 },{ 82,200,3848 },{ 2,24,488 },{ 2,24,488 } }, + { { 77,6,3907 },{ 90,200,3848 },{ 26,120,488 },{ 10,24,488 } }, + { { 97,63,3330 },{ 98,200,3848 },{ 34,120,488 },{ 2,8,496 } }, + { { 106,63,3330 },{ 107,200,3848 },{ 43,120,488 },{ 3,92,488 } }, + { { 114,63,3330 },{ 115,200,3848 },{ 51,120,488 },{ 11,92,488 } }, + { { 122,63,3330 },{ 123,200,3848 },{ 59,120,488 },{ 7,76,496 } }, + { { 130,63,3330 },{ 131,200,3848 },{ 67,120,488 },{ 15,76,496 } }, + { { 139,63,3330 },{ 140,200,3848 },{ 76,120,488 },{ 24,76,496 } }, + { { 147,63,3330 },{ 148,200,3848 },{ 84,120,488 },{ 32,76,496 } }, + { { 155,63,3330 },{ 156,200,3848 },{ 92,120,488 },{ 40,76,496 } }, + { { 163,63,3330 },{ 164,200,3848 },{ 100,120,488 },{ 48,76,496 } }, + { { 172,63,3330 },{ 173,200,3848 },{ 109,120,488 },{ 57,76,496 } }, + { { 184,6,3851 },{ 181,200,3848 },{ 117,120,488 },{ 65,76,496 } }, + { { 192,6,3851 },{ 133,28,3936 },{ 125,120,488 },{ 73,76,496 } }, + { { 189,200,3907 },{ 141,28,3936 },{ 133,120,488 },{ 81,76,496 } }, + { { 198,200,3907 },{ 138,108,4000 },{ 142,120,488 },{ 90,76,496 } }, + { { 206,200,3907 },{ 146,108,4000 },{ 150,120,488 },{ 98,76,496 } }, + { { 214,200,3395 },{ 154,108,4000 },{ 158,120,488 },{ 106,76,496 } }, + { { 190,136,4001 },{ 162,108,4000 },{ 166,120,488 },{ 114,76,496 } }, + { { 123,30,4076 },{ 87,15,4080 },{ 123,30,492 },{ 87,15,496 } }, + { { 117,110,4084 },{ 80,31,4080 },{ 117,110,500 },{ 80,31,496 } }, + { { 125,110,4084 },{ 88,31,4080 },{ 125,110,500 },{ 88,31,496 } }, + { { 133,110,4084 },{ 96,31,4080 },{ 133,110,500 },{ 96,31,496 } }, + { { 9,56,3904 },{ 9,56,3904 },{ 0,67,448 },{ 0,67,448 } }, + { { 1,8,3904 },{ 1,8,3904 },{ 1,84,448 },{ 1,84,448 } }, + { { 1,124,3904 },{ 1,124,3904 },{ 0,39,384 },{ 0,39,384 } }, + { { 9,124,3904 },{ 9,124,3904 },{ 1,4,448 },{ 1,4,448 } }, + { { 6,76,3904 },{ 6,76,3904 },{ 0,70,448 },{ 0,70,448 } }, + { { 62,6,3859 },{ 62,6,3856 },{ 2,38,480 },{ 2,38,480 } }, + { { 70,6,3859 },{ 70,6,3856 },{ 5,43,416 },{ 5,43,416 } }, + { { 78,6,3859 },{ 78,6,3856 },{ 2,11,416 },{ 2,11,416 } }, + { { 87,6,3859 },{ 87,6,3856 },{ 0,171,488 },{ 0,171,488 } }, + { { 67,8,3906 },{ 95,6,3856 },{ 8,171,488 },{ 8,171,488 } }, + { { 75,8,3907 },{ 103,6,3856 },{ 5,123,488 },{ 5,123,488 } }, + { { 83,8,3907 },{ 111,6,3856 },{ 2,75,488 },{ 2,75,488 } }, + { { 92,8,3907 },{ 120,6,3856 },{ 0,27,488 },{ 0,27,488 } }, + { { 100,8,3907 },{ 128,6,3856 },{ 8,27,488 },{ 8,27,488 } }, + { { 120,106,3843 },{ 136,6,3856 },{ 100,6,387 },{ 16,27,488 } }, + { { 128,106,3843 },{ 144,6,3856 },{ 108,6,387 },{ 2,11,496 } }, + { { 137,106,3843 },{ 153,6,3856 },{ 117,6,387 },{ 11,11,496 } }, + { { 145,106,3843 },{ 161,6,3856 },{ 125,6,387 },{ 19,11,496 } }, + { { 163,8,3851 },{ 137,43,3904 },{ 133,6,387 },{ 27,11,496 } }, + { { 171,8,3851 },{ 101,11,4000 },{ 141,6,387 },{ 35,11,496 } }, + { { 180,8,3851 },{ 110,11,4000 },{ 150,6,387 },{ 44,11,496 } }, + { { 188,8,3851 },{ 118,11,4000 },{ 158,6,387 },{ 52,11,496 } }, + { { 172,72,3907 },{ 126,11,4000 },{ 166,6,387 },{ 60,11,496 } }, + { { 174,6,3971 },{ 134,11,4000 },{ 174,6,387 },{ 68,11,496 } }, + { { 183,6,3971 },{ 143,11,4000 },{ 183,6,387 },{ 77,11,496 } }, + { { 191,6,3971 },{ 151,11,4000 },{ 191,6,387 },{ 85,11,496 } }, + { { 199,6,3971 },{ 159,11,4000 },{ 199,6,387 },{ 93,11,496 } }, + { { 92,12,4084 },{ 69,15,4080 },{ 92,12,500 },{ 69,15,496 } }, + { { 101,12,4084 },{ 78,15,4080 },{ 101,12,500 },{ 78,15,496 } }, + { { 109,12,4084 },{ 86,15,4080 },{ 109,12,500 },{ 86,15,496 } }, + { { 117,12,4084 },{ 79,31,4080 },{ 117,12,500 },{ 79,31,496 } }, + { { 125,12,4084 },{ 87,31,4080 },{ 125,12,500 },{ 87,31,496 } }, + { { 71,8,3602 },{ 71,8,3600 },{ 2,21,384 },{ 2,21,384 } }, + { { 79,8,3611 },{ 79,8,3608 },{ 0,69,448 },{ 0,69,448 } }, + { { 87,8,3611 },{ 87,8,3608 },{ 0,23,384 },{ 0,23,384 } }, + { { 95,8,3611 },{ 95,8,3608 },{ 1,5,448 },{ 1,5,448 } }, + { { 104,8,3611 },{ 104,8,3608 },{ 0,88,448 },{ 0,88,448 } }, + { { 112,8,3611 },{ 112,8,3608 },{ 0,72,448 },{ 0,72,448 } }, + { { 120,8,3611 },{ 121,8,3608 },{ 36,21,458 },{ 36,21,456 } }, + { { 133,47,3091 },{ 129,8,3608 },{ 44,21,458 },{ 44,21,456 } }, + { { 142,47,3091 },{ 138,8,3608 },{ 53,21,459 },{ 53,21,456 } }, + { { 98,12,3850 },{ 98,12,3848 },{ 61,21,459 },{ 61,21,456 } }, + { { 106,12,3850 },{ 106,12,3848 },{ 10,92,480 },{ 69,21,456 } }, + { { 114,12,3851 },{ 114,12,3848 },{ 18,92,480 },{ 77,21,456 } }, + { { 87,12,3906 },{ 87,12,3904 },{ 3,44,488 },{ 86,21,456 } }, + { { 95,12,3906 },{ 95,12,3904 },{ 11,44,488 },{ 94,21,456 } }, + { { 103,12,3906 },{ 103,12,3904 },{ 19,44,488 },{ 102,21,456 } }, + { { 111,12,3907 },{ 111,12,3904 },{ 27,44,489 },{ 110,21,456 } }, + { { 120,12,3907 },{ 120,12,3904 },{ 36,44,489 },{ 119,21,456 } }, + { { 128,12,3907 },{ 128,12,3904 },{ 44,44,489 },{ 127,21,456 } }, + { { 136,12,3907 },{ 136,12,3904 },{ 52,44,489 },{ 135,21,456 } }, + { { 144,12,3907 },{ 144,12,3904 },{ 60,44,489 },{ 143,21,456 } }, + { { 153,12,3907 },{ 153,12,3904 },{ 69,44,490 },{ 152,21,456 } }, + { { 161,12,3395 },{ 149,188,3968 },{ 77,44,490 },{ 160,21,456 } }, + { { 169,12,3395 },{ 198,21,3928 },{ 85,44,490 },{ 168,21,456 } }, + { { 113,95,4001 },{ 201,69,3992 },{ 125,8,483 },{ 176,21,456 } }, + { { 122,95,4001 },{ 200,21,3984 },{ 134,8,483 },{ 185,21,456 } }, + { { 142,8,4067 },{ 208,21,3984 },{ 142,8,483 },{ 193,21,456 } }, + { { 151,8,4067 },{ 47,15,4080 },{ 151,8,483 },{ 47,15,496 } }, + { { 159,8,4067 },{ 55,15,4080 },{ 159,8,483 },{ 55,15,496 } }, + { { 168,8,4067 },{ 64,15,4080 },{ 168,8,483 },{ 64,15,496 } }, + { { 160,40,4075 },{ 72,15,4080 },{ 160,40,491 },{ 72,15,496 } }, + { { 168,40,4075 },{ 80,15,4080 },{ 168,40,491 },{ 80,15,496 } }, + { { 144,8,4082 },{ 88,15,4080 },{ 144,8,498 },{ 88,15,496 } } + }; +#endif // BASISD_SUPPORT_ETC2_EAC_A8 + +#if BASISD_WRITE_NEW_ETC2_EAC_A8_TABLES + static void create_etc2_eac_a8_conversion_table() + { + FILE* pFile = fopen("basisu_decoder_tables_etc2_eac_a8.inc", "w"); + + for (uint32_t inten = 0; inten < 8; inten++) + { + for (uint32_t base = 0; base < 32; base++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(base, base, base, 255), false), inten); + + fprintf(pFile, "{"); + + for (uint32_t sel_range = 0; sel_range < NUM_ETC2_EAC_SELECTOR_RANGES; sel_range++) + { + const uint32_t low_selector = s_etc2_eac_selector_ranges[sel_range].m_low; + const uint32_t high_selector = s_etc2_eac_selector_ranges[sel_range].m_high; + + // We have a ETC1 base color and intensity, and a used selector range from low_selector-high_selector. + // Now find the best ETC2 EAC A8 base/table/multiplier that fits these colors. + + uint8_t pixels[4]; + uint32_t num_pixels = 0; + for (uint32_t s = low_selector; s <= high_selector; s++) + pixels[num_pixels++] = block_colors[s].g; + + pack_eac_a8_results pack_results; + pack_eac_a8_exhaustive(pack_results, pixels, num_pixels); + + etc1_g_to_eac_conversion& c = s_etc1_g_to_etc2_a8[base + inten * 32][sel_range]; + + c.m_base = pack_results.m_base; + c.m_table_mul = pack_results.m_table * 16 + pack_results.m_multiplier; + c.m_trans = 0; + + for (uint32_t s = 0; s < 4; s++) + { + if ((s < low_selector) || (s > high_selector)) + continue; + + uint32_t etc2_selector = pack_results.m_selectors[s - low_selector]; + + c.m_trans |= (etc2_selector << (s * 3)); + } + + fprintf(pFile, "{%u,%u,%u}", c.m_base, c.m_table_mul, c.m_trans); + if (sel_range < (NUM_ETC2_EAC_SELECTOR_RANGES - 1)) + fprintf(pFile, ","); + } + + fprintf(pFile, "},\n"); + } + } + + fclose(pFile); + } +#endif + +#if BASISD_WRITE_NEW_ETC2_EAC_R11_TABLES + struct pack_eac_r11_results + { + uint32_t m_base; + uint32_t m_table; + uint32_t m_multiplier; + basisu::vector m_selectors; + basisu::vector m_selectors_temp; + }; + + static uint64_t pack_eac_r11_exhaustive(pack_eac_r11_results& results, const uint8_t* pPixels, uint32_t num_pixels) + { + results.m_selectors.resize(num_pixels); + results.m_selectors_temp.resize(num_pixels); + + uint64_t best_err = UINT64_MAX; + + for (uint32_t base_color = 0; base_color < 256; base_color++) + { + for (uint32_t multiplier = 0; multiplier < 16; multiplier++) + { + for (uint32_t table = 0; table < 16; table++) + { + uint64_t total_err = 0; + + for (uint32_t i = 0; i < num_pixels; i++) + { + // Convert 8-bit input to 11-bits + const int a = (pPixels[i] * 2047 + 128) / 255; + + uint32_t best_s_err = UINT32_MAX; + uint32_t best_s = 0; + for (uint32_t s = 0; s < 8; s++) + { + int v = (int)(multiplier ? (multiplier * 8) : 1) * g_eac_modifier_table[table][s] + (int)base_color * 8 + 4; + if (v < 0) + v = 0; + else if (v > 2047) + v = 2047; + + uint32_t err = abs(a - v); + if (err < best_s_err) + { + best_s_err = err; + best_s = s; + } + } + + results.m_selectors_temp[i] = static_cast(best_s); + + total_err += best_s_err * best_s_err; + if (total_err >= best_err) + break; + } + + if (total_err < best_err) + { + best_err = total_err; + results.m_base = base_color; + results.m_multiplier = multiplier; + results.m_table = table; + results.m_selectors.swap(results.m_selectors_temp); + } + + } // table + + } // multiplier + + } // base_color + + return best_err; + } + + static void create_etc2_eac_r11_conversion_table() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_decoder_tables_etc2_eac_r11.inc", "w"); + + for (uint32_t inten = 0; inten < 8; inten++) + { + for (uint32_t base = 0; base < 32; base++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(base, base, base, 255), false), inten); + + fprintf(pFile, "{"); + + for (uint32_t sel_range = 0; sel_range < NUM_ETC2_EAC_SELECTOR_RANGES; sel_range++) + { + const uint32_t low_selector = s_etc2_eac_selector_ranges[sel_range].m_low; + const uint32_t high_selector = s_etc2_eac_selector_ranges[sel_range].m_high; + + // We have a ETC1 base color and intensity, and a used selector range from low_selector-high_selector. + // Now find the best ETC2 EAC R11 base/table/multiplier that fits these colors. + + uint8_t pixels[4]; + uint32_t num_pixels = 0; + for (uint32_t s = low_selector; s <= high_selector; s++) + pixels[num_pixels++] = block_colors[s].g; + + pack_eac_r11_results pack_results; + pack_eac_r11_exhaustive(pack_results, pixels, num_pixels); + + etc1_g_to_eac_conversion c; + + c.m_base = (uint8_t)pack_results.m_base; + c.m_table_mul = (uint8_t)(pack_results.m_table * 16 + pack_results.m_multiplier); + c.m_trans = 0; + + for (uint32_t s = 0; s < 4; s++) + { + if ((s < low_selector) || (s > high_selector)) + continue; + + uint32_t etc2_selector = pack_results.m_selectors[s - low_selector]; + + c.m_trans |= (etc2_selector << (s * 3)); + } + + fprintf(pFile, "{%u,%u,%u}", c.m_base, c.m_table_mul, c.m_trans); + if (sel_range < (NUM_ETC2_EAC_SELECTOR_RANGES - 1)) + fprintf(pFile, ","); + } + + fprintf(pFile, "},\n"); + } + } + + fclose(pFile); + } +#endif // BASISD_WRITE_NEW_ETC2_EAC_R11_TABLES + +#if BASISD_WRITE_NEW_ASTC_TABLES + static void create_etc1_to_astc_conversion_table_0_47(); + static void create_etc1_to_astc_conversion_table_0_255(); +#endif + +#if BASISD_SUPPORT_ASTC + static void transcoder_init_astc(); +#endif + +#if BASISD_WRITE_NEW_BC7_MODE5_TABLES + static void create_etc1_to_bc7_m5_color_conversion_table(); + static void create_etc1_to_bc7_m5_alpha_conversion_table(); +#endif + +#if BASISD_SUPPORT_BC7_MODE5 + static void transcoder_init_bc7_mode5(); +#endif + +#if BASISD_WRITE_NEW_ATC_TABLES + static void create_etc1s_to_atc_conversion_tables(); +#endif + +#if BASISD_SUPPORT_ATC + static void transcoder_init_atc(); +#endif + +#if BASISD_SUPPORT_PVRTC2 + static void transcoder_init_pvrtc2(); +#endif + +#if BASISD_SUPPORT_UASTC + void uastc_init(); +#endif + + static bool g_transcoder_initialized; + + // Library global initialization. Requires ~9 milliseconds when compiled and executed natively on a Core i7 2.2 GHz. + // If this is too slow, these computed tables can easilky be moved to be compiled in. + void basisu_transcoder_init() + { + if (g_transcoder_initialized) + { + BASISU_DEVEL_ERROR("basisu_transcoder::basisu_transcoder_init: Called more than once\n"); + return; + } + + BASISU_DEVEL_ERROR("basisu_transcoder::basisu_transcoder_init: Initializing (this is not an error)\n"); + +#if BASISD_SUPPORT_UASTC + uastc_init(); +#endif + +#if BASISD_SUPPORT_ASTC + transcoder_init_astc(); +#endif + +#if BASISD_WRITE_NEW_ASTC_TABLES + create_etc1_to_astc_conversion_table_0_47(); + create_etc1_to_astc_conversion_table_0_255(); + exit(0); +#endif + +#if BASISD_WRITE_NEW_BC7_MODE5_TABLES + create_etc1_to_bc7_m5_color_conversion_table(); + create_etc1_to_bc7_m5_alpha_conversion_table(); + exit(0); +#endif + +#if BASISD_WRITE_NEW_DXT1_TABLES + create_etc1_to_dxt1_5_conversion_table(); + create_etc1_to_dxt1_6_conversion_table(); + exit(0); +#endif + +#if BASISD_WRITE_NEW_ETC2_EAC_A8_TABLES + create_etc2_eac_a8_conversion_table(); + exit(0); +#endif + +#if BASISD_WRITE_NEW_ATC_TABLES + create_etc1s_to_atc_conversion_tables(); + exit(0); +#endif + +#if BASISD_WRITE_NEW_ETC2_EAC_R11_TABLES + create_etc2_eac_r11_conversion_table(); + exit(0); +#endif + +#if BASISD_SUPPORT_DXT1 || BASISD_SUPPORT_UASTC + uint8_t bc1_expand5[32]; + for (int i = 0; i < 32; i++) + bc1_expand5[i] = static_cast((i << 3) | (i >> 2)); + prepare_bc1_single_color_table(g_bc1_match5_equals_1, bc1_expand5, 32, 32, 1); + prepare_bc1_single_color_table(g_bc1_match5_equals_0, bc1_expand5, 1, 32, 0); + + uint8_t bc1_expand6[64]; + for (int i = 0; i < 64; i++) + bc1_expand6[i] = static_cast((i << 2) | (i >> 4)); + prepare_bc1_single_color_table(g_bc1_match6_equals_1, bc1_expand6, 64, 64, 1); + prepare_bc1_single_color_table(g_bc1_match6_equals_0, bc1_expand6, 1, 64, 0); + +#if 0 + for (uint32_t i = 0; i < 256; i++) + { + printf("%u %u %u\n", i, (i * 63 + 127) / 255, g_bc1_match6_equals_0[i].m_hi); + } + exit(0); +#endif + +#endif + +#if BASISD_SUPPORT_DXT1 + for (uint32_t i = 0; i < NUM_ETC1_TO_DXT1_SELECTOR_RANGES; i++) + { + uint32_t l = g_etc1_to_dxt1_selector_ranges[i].m_low; + uint32_t h = g_etc1_to_dxt1_selector_ranges[i].m_high; + g_etc1_to_dxt1_selector_range_index[l][h] = i; + } + + for (uint32_t sm = 0; sm < NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS; sm++) + { + uint8_t etc1_to_dxt1_selector_mappings_raw_dxt1[4]; + uint8_t etc1_to_dxt1_selector_mappings_raw_dxt1_inv[4]; + + for (uint32_t j = 0; j < 4; j++) + { + static const uint8_t s_linear_dxt1_to_dxt1[4] = { 0, 2, 3, 1 }; + static const uint8_t s_dxt1_inverted_xlat[4] = { 1, 0, 3, 2 }; + + etc1_to_dxt1_selector_mappings_raw_dxt1[j] = (uint8_t)s_linear_dxt1_to_dxt1[g_etc1_to_dxt1_selector_mappings[sm][j]]; + etc1_to_dxt1_selector_mappings_raw_dxt1_inv[j] = (uint8_t)s_dxt1_inverted_xlat[etc1_to_dxt1_selector_mappings_raw_dxt1[j]]; + } + + for (uint32_t i = 0; i < 256; i++) + { + uint32_t k = 0, k_inv = 0; + for (uint32_t s = 0; s < 4; s++) + { + k |= (etc1_to_dxt1_selector_mappings_raw_dxt1[(i >> (s * 2)) & 3] << (s * 2)); + k_inv |= (etc1_to_dxt1_selector_mappings_raw_dxt1_inv[(i >> (s * 2)) & 3] << (s * 2)); + } + g_etc1_to_dxt1_selector_mappings_raw_dxt1_256[sm][i] = (uint8_t)k; + g_etc1_to_dxt1_selector_mappings_raw_dxt1_inv_256[sm][i] = (uint8_t)k_inv; + } + } +#endif + +#if BASISD_SUPPORT_BC7_MODE5 + transcoder_init_bc7_mode5(); +#endif + +#if BASISD_SUPPORT_ATC + transcoder_init_atc(); +#endif + +#if BASISD_SUPPORT_PVRTC2 + transcoder_init_pvrtc2(); +#endif + + g_transcoder_initialized = true; + } + +#if BASISD_SUPPORT_DXT1 + static void convert_etc1s_to_dxt1(dxt1_block* pDst_block, const endpoint *pEndpoints, const selector* pSelector, bool use_threecolor_blocks) + { +#if !BASISD_WRITE_NEW_DXT1_TABLES + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (low_selector == high_selector) + { + uint32_t r, g, b; + decoder_etc_block::get_block_color5(base_color, inten_table, low_selector, r, g, b); + + uint32_t mask = 0xAA; + uint32_t max16 = (g_bc1_match5_equals_1[r].m_hi << 11) | (g_bc1_match6_equals_1[g].m_hi << 5) | g_bc1_match5_equals_1[b].m_hi; + uint32_t min16 = (g_bc1_match5_equals_1[r].m_lo << 11) | (g_bc1_match6_equals_1[g].m_lo << 5) | g_bc1_match5_equals_1[b].m_lo; + + if ((!use_threecolor_blocks) && (min16 == max16)) + { + // This is an annoying edge case that impacts BC3. + // This is to guarantee that BC3 blocks never use punchthrough alpha (3 color) mode, which isn't supported on some (all?) GPU's. + mask = 0; + + // Make l > h + if (min16 > 0) + min16--; + else + { + // l = h = 0 + assert(min16 == max16 && max16 == 0); + + max16 = 1; + min16 = 0; + mask = 0x55; + } + + assert(max16 > min16); + } + + if (max16 < min16) + { + std::swap(max16, min16); + mask ^= 0x55; + } + + pDst_block->set_low_color(static_cast(max16)); + pDst_block->set_high_color(static_cast(min16)); + pDst_block->m_selectors[0] = static_cast(mask); + pDst_block->m_selectors[1] = static_cast(mask); + pDst_block->m_selectors[2] = static_cast(mask); + pDst_block->m_selectors[3] = static_cast(mask); + + return; + } + else if ((inten_table >= 7) && (pSelector->m_num_unique_selectors == 2) && (pSelector->m_lo_selector == 0) && (pSelector->m_hi_selector == 3)) + { + color32 block_colors[4]; + + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + const uint32_t r0 = block_colors[0].r; + const uint32_t g0 = block_colors[0].g; + const uint32_t b0 = block_colors[0].b; + + const uint32_t r1 = block_colors[3].r; + const uint32_t g1 = block_colors[3].g; + const uint32_t b1 = block_colors[3].b; + + uint32_t max16 = (g_bc1_match5_equals_0[r0].m_hi << 11) | (g_bc1_match6_equals_0[g0].m_hi << 5) | g_bc1_match5_equals_0[b0].m_hi; + uint32_t min16 = (g_bc1_match5_equals_0[r1].m_hi << 11) | (g_bc1_match6_equals_0[g1].m_hi << 5) | g_bc1_match5_equals_0[b1].m_hi; + + uint32_t l = 0, h = 1; + + if (min16 == max16) + { + // Make l > h + if (min16 > 0) + { + min16--; + + l = 0; + h = 0; + } + else + { + // l = h = 0 + assert(min16 == max16 && max16 == 0); + + max16 = 1; + min16 = 0; + + l = 1; + h = 1; + } + + assert(max16 > min16); + } + + if (max16 < min16) + { + std::swap(max16, min16); + l = 1; + h = 0; + } + + pDst_block->set_low_color((uint16_t)max16); + pDst_block->set_high_color((uint16_t)min16); + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + pDst_block->set_selector(x, y, (s == 3) ? h : l); + } + } + + return; + } + + const uint32_t selector_range_table = g_etc1_to_dxt1_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_dxt1_56_solution* pTable_r = &g_etc1_to_dxt_5[(inten_table * 32 + base_color.r) * (NUM_ETC1_TO_DXT1_SELECTOR_RANGES * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS]; + const etc1_to_dxt1_56_solution* pTable_g = &g_etc1_to_dxt_6[(inten_table * 32 + base_color.g) * (NUM_ETC1_TO_DXT1_SELECTOR_RANGES * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS]; + const etc1_to_dxt1_56_solution* pTable_b = &g_etc1_to_dxt_5[(inten_table * 32 + base_color.b) * (NUM_ETC1_TO_DXT1_SELECTOR_RANGES * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS]; + + uint32_t best_err = UINT_MAX; + uint32_t best_mapping = 0; + + assert(NUM_ETC1_TO_DXT1_SELECTOR_MAPPINGS == 10); +#define DO_ITER(m) { uint32_t total_err = pTable_r[m].m_err + pTable_g[m].m_err + pTable_b[m].m_err; if (total_err < best_err) { best_err = total_err; best_mapping = m; } } + DO_ITER(0); DO_ITER(1); DO_ITER(2); DO_ITER(3); DO_ITER(4); + DO_ITER(5); DO_ITER(6); DO_ITER(7); DO_ITER(8); DO_ITER(9); +#undef DO_ITER + + uint32_t l = dxt1_block::pack_unscaled_color(pTable_r[best_mapping].m_lo, pTable_g[best_mapping].m_lo, pTable_b[best_mapping].m_lo); + uint32_t h = dxt1_block::pack_unscaled_color(pTable_r[best_mapping].m_hi, pTable_g[best_mapping].m_hi, pTable_b[best_mapping].m_hi); + + const uint8_t* pSelectors_xlat_256 = &g_etc1_to_dxt1_selector_mappings_raw_dxt1_256[best_mapping][0]; + + if (l < h) + { + std::swap(l, h); + pSelectors_xlat_256 = &g_etc1_to_dxt1_selector_mappings_raw_dxt1_inv_256[best_mapping][0]; + } + + pDst_block->set_low_color(static_cast(l)); + pDst_block->set_high_color(static_cast(h)); + + if (l == h) + { + uint8_t mask = 0; + + if (!use_threecolor_blocks) + { + // This is an annoying edge case that impacts BC3. + + // Make l > h + if (h > 0) + h--; + else + { + // l = h = 0 + assert(l == h && h == 0); + + h = 0; + l = 1; + mask = 0x55; + } + + assert(l > h); + pDst_block->set_low_color(static_cast(l)); + pDst_block->set_high_color(static_cast(h)); + } + + pDst_block->m_selectors[0] = mask; + pDst_block->m_selectors[1] = mask; + pDst_block->m_selectors[2] = mask; + pDst_block->m_selectors[3] = mask; + + return; + } + + pDst_block->m_selectors[0] = pSelectors_xlat_256[pSelector->m_selectors[0]]; + pDst_block->m_selectors[1] = pSelectors_xlat_256[pSelector->m_selectors[1]]; + pDst_block->m_selectors[2] = pSelectors_xlat_256[pSelector->m_selectors[2]]; + pDst_block->m_selectors[3] = pSelectors_xlat_256[pSelector->m_selectors[3]]; +#endif + } + +#if BASISD_ENABLE_DEBUG_FLAGS + static void convert_etc1s_to_dxt1_vis(dxt1_block* pDst_block, const endpoint* pEndpoints, const selector* pSelector, bool use_threecolor_blocks) + { + convert_etc1s_to_dxt1(pDst_block, pEndpoints, pSelector, use_threecolor_blocks); + + if (g_debug_flags & cDebugFlagVisBC1Sels) + { + uint32_t l = dxt1_block::pack_unscaled_color(31, 63, 31); + uint32_t h = dxt1_block::pack_unscaled_color(0, 0, 0); + pDst_block->set_low_color(static_cast(l)); + pDst_block->set_high_color(static_cast(h)); + } + else if (g_debug_flags & cDebugFlagVisBC1Endpoints) + { + for (uint32_t y = 0; y < 4; y++) + for (uint32_t x = 0; x < 4; x++) + pDst_block->set_selector(x, y, (y < 2) ? 0 : 1); + } + } +#endif +#endif + +#if BASISD_SUPPORT_FXT1 + struct fxt1_block + { + union + { + struct + { + uint64_t m_t00 : 2; + uint64_t m_t01 : 2; + uint64_t m_t02 : 2; + uint64_t m_t03 : 2; + uint64_t m_t04 : 2; + uint64_t m_t05 : 2; + uint64_t m_t06 : 2; + uint64_t m_t07 : 2; + uint64_t m_t08 : 2; + uint64_t m_t09 : 2; + uint64_t m_t10 : 2; + uint64_t m_t11 : 2; + uint64_t m_t12 : 2; + uint64_t m_t13 : 2; + uint64_t m_t14 : 2; + uint64_t m_t15 : 2; + uint64_t m_t16 : 2; + uint64_t m_t17 : 2; + uint64_t m_t18 : 2; + uint64_t m_t19 : 2; + uint64_t m_t20 : 2; + uint64_t m_t21 : 2; + uint64_t m_t22 : 2; + uint64_t m_t23 : 2; + uint64_t m_t24 : 2; + uint64_t m_t25 : 2; + uint64_t m_t26 : 2; + uint64_t m_t27 : 2; + uint64_t m_t28 : 2; + uint64_t m_t29 : 2; + uint64_t m_t30 : 2; + uint64_t m_t31 : 2; + } m_lo; + uint64_t m_lo_bits; + uint8_t m_sels[8]; + }; + union + { + struct + { +#ifdef BASISU_USE_ORIGINAL_3DFX_FXT1_ENCODING + uint64_t m_b1 : 5; + uint64_t m_g1 : 5; + uint64_t m_r1 : 5; + uint64_t m_b0 : 5; + uint64_t m_g0 : 5; + uint64_t m_r0 : 5; + uint64_t m_b3 : 5; + uint64_t m_g3 : 5; + uint64_t m_r3 : 5; + uint64_t m_b2 : 5; + uint64_t m_g2 : 5; + uint64_t m_r2 : 5; +#else + uint64_t m_b0 : 5; + uint64_t m_g0 : 5; + uint64_t m_r0 : 5; + uint64_t m_b1 : 5; + uint64_t m_g1 : 5; + uint64_t m_r1 : 5; + uint64_t m_b2 : 5; + uint64_t m_g2 : 5; + uint64_t m_r2 : 5; + uint64_t m_b3 : 5; + uint64_t m_g3 : 5; + uint64_t m_r3 : 5; +#endif + uint64_t m_alpha : 1; + uint64_t m_glsb : 2; + uint64_t m_mode : 1; + } m_hi; + uint64_t m_hi_bits; + }; + }; + + static uint8_t conv_dxt1_to_fxt1_sels(uint32_t sels) + { + static uint8_t s_conv_table[16] = { 0, 3, 1, 2, 12, 15, 13, 14, 4, 7, 5, 6, 8, 11, 9, 10 }; + return s_conv_table[sels & 15] | (s_conv_table[sels >> 4] << 4); + } + + static void convert_etc1s_to_fxt1(void *pDst, const endpoint *pEndpoints, const selector *pSelectors, uint32_t fxt1_subblock) + { + fxt1_block* pBlock = static_cast(pDst); + + // CC_MIXED is basically DXT1 with different encoding tricks. + // So transcode ETC1S to DXT1, then transcode that to FXT1 which is easy and nearly lossless. + // (It's not completely lossless because FXT1 rounds in its color lerps while DXT1 doesn't, but it should be good enough.) + dxt1_block blk; + convert_etc1s_to_dxt1(&blk, pEndpoints, pSelectors, false); + + const uint32_t l = blk.get_low_color(); + const uint32_t h = blk.get_high_color(); + + color32 color0((l >> 11) & 31, (l >> 5) & 63, l & 31, 255); + color32 color1((h >> 11) & 31, (h >> 5) & 63, h & 31, 255); + + uint32_t g0 = color0.g & 1; + uint32_t g1 = color1.g & 1; + + color0.g >>= 1; + color1.g >>= 1; + + blk.m_selectors[0] = conv_dxt1_to_fxt1_sels(blk.m_selectors[0]); + blk.m_selectors[1] = conv_dxt1_to_fxt1_sels(blk.m_selectors[1]); + blk.m_selectors[2] = conv_dxt1_to_fxt1_sels(blk.m_selectors[2]); + blk.m_selectors[3] = conv_dxt1_to_fxt1_sels(blk.m_selectors[3]); + + if ((blk.get_selector(0, 0) >> 1) != (g0 ^ g1)) + { + std::swap(color0, color1); + std::swap(g0, g1); + + blk.m_selectors[0] ^= 0xFF; + blk.m_selectors[1] ^= 0xFF; + blk.m_selectors[2] ^= 0xFF; + blk.m_selectors[3] ^= 0xFF; + } + + if (fxt1_subblock == 0) + { + pBlock->m_hi.m_mode = 1; + pBlock->m_hi.m_alpha = 0; + pBlock->m_hi.m_glsb = g1 | (g1 << 1); + pBlock->m_hi.m_r0 = color0.r; + pBlock->m_hi.m_g0 = color0.g; + pBlock->m_hi.m_b0 = color0.b; + pBlock->m_hi.m_r1 = color1.r; + pBlock->m_hi.m_g1 = color1.g; + pBlock->m_hi.m_b1 = color1.b; + pBlock->m_hi.m_r2 = color0.r; + pBlock->m_hi.m_g2 = color0.g; + pBlock->m_hi.m_b2 = color0.b; + pBlock->m_hi.m_r3 = color1.r; + pBlock->m_hi.m_g3 = color1.g; + pBlock->m_hi.m_b3 = color1.b; + pBlock->m_sels[0] = blk.m_selectors[0]; + pBlock->m_sels[1] = blk.m_selectors[1]; + pBlock->m_sels[2] = blk.m_selectors[2]; + pBlock->m_sels[3] = blk.m_selectors[3]; + + static const uint8_t s_border_dup[4] = { 0, 85, 170, 255 }; + pBlock->m_sels[4] = s_border_dup[blk.m_selectors[0] >> 6]; + pBlock->m_sels[5] = s_border_dup[blk.m_selectors[1] >> 6]; + pBlock->m_sels[6] = s_border_dup[blk.m_selectors[2] >> 6]; + pBlock->m_sels[7] = s_border_dup[blk.m_selectors[3] >> 6]; + } + else + { + pBlock->m_hi.m_glsb = (pBlock->m_hi.m_glsb & 1) | (g1 << 1); + pBlock->m_hi.m_r2 = color0.r; + pBlock->m_hi.m_g2 = color0.g; + pBlock->m_hi.m_b2 = color0.b; + pBlock->m_hi.m_r3 = color1.r; + pBlock->m_hi.m_g3 = color1.g; + pBlock->m_hi.m_b3 = color1.b; + pBlock->m_sels[4] = blk.m_selectors[0]; + pBlock->m_sels[5] = blk.m_selectors[1]; + pBlock->m_sels[6] = blk.m_selectors[2]; + pBlock->m_sels[7] = blk.m_selectors[3]; + } + } +#endif // BASISD_SUPPORT_FXT1 +#if BASISD_SUPPORT_DXT5A + static dxt_selector_range s_dxt5a_selector_ranges[] = + { + { 0, 3 }, + + { 1, 3 }, + { 0, 2 }, + + { 1, 2 }, + }; + + const uint32_t NUM_DXT5A_SELECTOR_RANGES = sizeof(s_dxt5a_selector_ranges) / sizeof(s_dxt5a_selector_ranges[0]); + + struct etc1_g_to_dxt5a_conversion + { + uint8_t m_lo, m_hi; + uint16_t m_trans; + }; + + static etc1_g_to_dxt5a_conversion g_etc1_g_to_dxt5a[32 * 8][NUM_DXT5A_SELECTOR_RANGES] = + { + { { 8, 0, 393 },{ 8, 0, 392 },{ 2, 0, 9 },{ 2, 0, 8 }, }, { { 6, 16, 710 },{ 16, 6, 328 },{ 0, 10, 96 },{ 10, 6, 8 }, }, + { { 28, 5, 1327 },{ 24, 14, 328 },{ 8, 18, 96 },{ 18, 14, 8 }, }, { { 36, 13, 1327 },{ 32, 22, 328 },{ 16, 26, 96 },{ 26, 22, 8 }, }, + { { 45, 22, 1327 },{ 41, 31, 328 },{ 25, 35, 96 },{ 35, 31, 8 }, }, { { 53, 30, 1327 },{ 49, 39, 328 },{ 33, 43, 96 },{ 43, 39, 8 }, }, + { { 61, 38, 1327 },{ 57, 47, 328 },{ 41, 51, 96 },{ 51, 47, 8 }, }, { { 69, 46, 1327 },{ 65, 55, 328 },{ 49, 59, 96 },{ 59, 55, 8 }, }, + { { 78, 55, 1327 },{ 74, 64, 328 },{ 58, 68, 96 },{ 68, 64, 8 }, }, { { 86, 63, 1327 },{ 82, 72, 328 },{ 66, 76, 96 },{ 76, 72, 8 }, }, + { { 94, 71, 1327 },{ 90, 80, 328 },{ 74, 84, 96 },{ 84, 80, 8 }, }, { { 102, 79, 1327 },{ 98, 88, 328 },{ 82, 92, 96 },{ 92, 88, 8 }, }, + { { 111, 88, 1327 },{ 107, 97, 328 },{ 91, 101, 96 },{ 101, 97, 8 }, }, { { 119, 96, 1327 },{ 115, 105, 328 },{ 99, 109, 96 },{ 109, 105, 8 }, }, + { { 127, 104, 1327 },{ 123, 113, 328 },{ 107, 117, 96 },{ 117, 113, 8 }, }, { { 135, 112, 1327 },{ 131, 121, 328 },{ 115, 125, 96 },{ 125, 121, 8 }, }, + { { 144, 121, 1327 },{ 140, 130, 328 },{ 124, 134, 96 },{ 134, 130, 8 }, }, { { 152, 129, 1327 },{ 148, 138, 328 },{ 132, 142, 96 },{ 142, 138, 8 }, }, + { { 160, 137, 1327 },{ 156, 146, 328 },{ 140, 150, 96 },{ 150, 146, 8 }, }, { { 168, 145, 1327 },{ 164, 154, 328 },{ 148, 158, 96 },{ 158, 154, 8 }, }, + { { 177, 154, 1327 },{ 173, 163, 328 },{ 157, 167, 96 },{ 167, 163, 8 }, }, { { 185, 162, 1327 },{ 181, 171, 328 },{ 165, 175, 96 },{ 175, 171, 8 }, }, + { { 193, 170, 1327 },{ 189, 179, 328 },{ 173, 183, 96 },{ 183, 179, 8 }, }, { { 201, 178, 1327 },{ 197, 187, 328 },{ 181, 191, 96 },{ 191, 187, 8 }, }, + { { 210, 187, 1327 },{ 206, 196, 328 },{ 190, 200, 96 },{ 200, 196, 8 }, }, { { 218, 195, 1327 },{ 214, 204, 328 },{ 198, 208, 96 },{ 208, 204, 8 }, }, + { { 226, 203, 1327 },{ 222, 212, 328 },{ 206, 216, 96 },{ 216, 212, 8 }, }, { { 234, 211, 1327 },{ 230, 220, 328 },{ 214, 224, 96 },{ 224, 220, 8 }, }, + { { 243, 220, 1327 },{ 239, 229, 328 },{ 223, 233, 96 },{ 233, 229, 8 }, }, { { 251, 228, 1327 },{ 247, 237, 328 },{ 231, 241, 96 },{ 241, 237, 8 }, }, + { { 239, 249, 3680 },{ 245, 249, 3648 },{ 239, 249, 96 },{ 249, 245, 8 }, }, { { 247, 253, 4040 },{ 255, 253, 8 },{ 247, 253, 456 },{ 255, 253, 8 }, }, + { { 5, 17, 566 },{ 5, 17, 560 },{ 5, 0, 9 },{ 5, 0, 8 }, }, { { 25, 0, 313 },{ 25, 3, 328 },{ 13, 0, 49 },{ 13, 3, 8 }, }, + { { 39, 0, 1329 },{ 33, 11, 328 },{ 11, 21, 70 },{ 21, 11, 8 }, }, { { 47, 7, 1329 },{ 41, 19, 328 },{ 29, 7, 33 },{ 29, 19, 8 }, }, + { { 50, 11, 239 },{ 50, 28, 328 },{ 38, 16, 33 },{ 38, 28, 8 }, }, { { 92, 13, 2423 },{ 58, 36, 328 },{ 46, 24, 33 },{ 46, 36, 8 }, }, + { { 100, 21, 2423 },{ 66, 44, 328 },{ 54, 32, 33 },{ 54, 44, 8 }, }, { { 86, 7, 1253 },{ 74, 52, 328 },{ 62, 40, 33 },{ 62, 52, 8 }, }, + { { 95, 16, 1253 },{ 83, 61, 328 },{ 71, 49, 33 },{ 71, 61, 8 }, }, { { 103, 24, 1253 },{ 91, 69, 328 },{ 79, 57, 33 },{ 79, 69, 8 }, }, + { { 111, 32, 1253 },{ 99, 77, 328 },{ 87, 65, 33 },{ 87, 77, 8 }, }, { { 119, 40, 1253 },{ 107, 85, 328 },{ 95, 73, 33 },{ 95, 85, 8 }, }, + { { 128, 49, 1253 },{ 116, 94, 328 },{ 104, 82, 33 },{ 104, 94, 8 }, }, { { 136, 57, 1253 },{ 124, 102, 328 },{ 112, 90, 33 },{ 112, 102, 8 }, }, + { { 144, 65, 1253 },{ 132, 110, 328 },{ 120, 98, 33 },{ 120, 110, 8 }, }, { { 152, 73, 1253 },{ 140, 118, 328 },{ 128, 106, 33 },{ 128, 118, 8 }, }, + { { 161, 82, 1253 },{ 149, 127, 328 },{ 137, 115, 33 },{ 137, 127, 8 }, }, { { 169, 90, 1253 },{ 157, 135, 328 },{ 145, 123, 33 },{ 145, 135, 8 }, }, + { { 177, 98, 1253 },{ 165, 143, 328 },{ 153, 131, 33 },{ 153, 143, 8 }, }, { { 185, 106, 1253 },{ 173, 151, 328 },{ 161, 139, 33 },{ 161, 151, 8 }, }, + { { 194, 115, 1253 },{ 182, 160, 328 },{ 170, 148, 33 },{ 170, 160, 8 }, }, { { 202, 123, 1253 },{ 190, 168, 328 },{ 178, 156, 33 },{ 178, 168, 8 }, }, + { { 210, 131, 1253 },{ 198, 176, 328 },{ 186, 164, 33 },{ 186, 176, 8 }, }, { { 218, 139, 1253 },{ 206, 184, 328 },{ 194, 172, 33 },{ 194, 184, 8 }, }, + { { 227, 148, 1253 },{ 215, 193, 328 },{ 203, 181, 33 },{ 203, 193, 8 }, }, { { 235, 156, 1253 },{ 223, 201, 328 },{ 211, 189, 33 },{ 211, 201, 8 }, }, + { { 243, 164, 1253 },{ 231, 209, 328 },{ 219, 197, 33 },{ 219, 209, 8 }, }, { { 183, 239, 867 },{ 239, 217, 328 },{ 227, 205, 33 },{ 227, 217, 8 }, }, + { { 254, 214, 1329 },{ 248, 226, 328 },{ 236, 214, 33 },{ 236, 226, 8 }, }, { { 222, 244, 3680 },{ 234, 244, 3648 },{ 244, 222, 33 },{ 244, 234, 8 }, }, + { { 230, 252, 3680 },{ 242, 252, 3648 },{ 252, 230, 33 },{ 252, 242, 8 }, }, { { 238, 250, 4040 },{ 255, 250, 8 },{ 238, 250, 456 },{ 255, 250, 8 }, }, + { { 9, 29, 566 },{ 9, 29, 560 },{ 9, 0, 9 },{ 9, 0, 8 }, }, { { 17, 37, 566 },{ 17, 37, 560 },{ 17, 0, 9 },{ 17, 0, 8 }, }, + { { 45, 0, 313 },{ 45, 0, 312 },{ 25, 0, 49 },{ 25, 7, 8 }, }, { { 14, 63, 2758 },{ 5, 53, 784 },{ 15, 33, 70 },{ 33, 15, 8 }, }, + { { 71, 6, 1329 },{ 72, 4, 1328 },{ 42, 4, 33 },{ 42, 24, 8 }, }, { { 70, 3, 239 },{ 70, 2, 232 },{ 50, 12, 33 },{ 50, 32, 8 }, }, + { { 0, 98, 2842 },{ 78, 10, 232 },{ 58, 20, 33 },{ 58, 40, 8 }, }, { { 97, 27, 1329 },{ 86, 18, 232 },{ 66, 28, 33 },{ 66, 48, 8 }, }, + { { 0, 94, 867 },{ 95, 27, 232 },{ 75, 37, 33 },{ 75, 57, 8 }, }, { { 8, 102, 867 },{ 103, 35, 232 },{ 83, 45, 33 },{ 83, 65, 8 }, }, + { { 12, 112, 867 },{ 111, 43, 232 },{ 91, 53, 33 },{ 91, 73, 8 }, }, { { 139, 2, 1253 },{ 119, 51, 232 },{ 99, 61, 33 },{ 99, 81, 8 }, }, + { { 148, 13, 1253 },{ 128, 60, 232 },{ 108, 70, 33 },{ 108, 90, 8 }, }, { { 156, 21, 1253 },{ 136, 68, 232 },{ 116, 78, 33 },{ 116, 98, 8 }, }, + { { 164, 29, 1253 },{ 144, 76, 232 },{ 124, 86, 33 },{ 124, 106, 8 }, }, { { 172, 37, 1253 },{ 152, 84, 232 },{ 132, 94, 33 },{ 132, 114, 8 }, }, + { { 181, 46, 1253 },{ 161, 93, 232 },{ 141, 103, 33 },{ 141, 123, 8 }, }, { { 189, 54, 1253 },{ 169, 101, 232 },{ 149, 111, 33 },{ 149, 131, 8 }, }, + { { 197, 62, 1253 },{ 177, 109, 232 },{ 157, 119, 33 },{ 157, 139, 8 }, }, { { 205, 70, 1253 },{ 185, 117, 232 },{ 165, 127, 33 },{ 165, 147, 8 }, }, + { { 214, 79, 1253 },{ 194, 126, 232 },{ 174, 136, 33 },{ 174, 156, 8 }, }, { { 222, 87, 1253 },{ 202, 134, 232 },{ 182, 144, 33 },{ 182, 164, 8 }, }, + { { 230, 95, 1253 },{ 210, 142, 232 },{ 190, 152, 33 },{ 190, 172, 8 }, }, { { 238, 103, 1253 },{ 218, 150, 232 },{ 198, 160, 33 },{ 198, 180, 8 }, }, + { { 247, 112, 1253 },{ 227, 159, 232 },{ 207, 169, 33 },{ 207, 189, 8 }, }, { { 255, 120, 1253 },{ 235, 167, 232 },{ 215, 177, 33 },{ 215, 197, 8 }, }, + { { 146, 243, 867 },{ 243, 175, 232 },{ 223, 185, 33 },{ 223, 205, 8 }, }, { { 184, 231, 3682 },{ 203, 251, 784 },{ 231, 193, 33 },{ 231, 213, 8 }, }, + { { 193, 240, 3682 },{ 222, 240, 3648 },{ 240, 202, 33 },{ 240, 222, 8 }, }, { { 255, 210, 169 },{ 230, 248, 3648 },{ 248, 210, 33 },{ 248, 230, 8 }, }, + { { 218, 238, 4040 },{ 255, 238, 8 },{ 218, 238, 456 },{ 255, 238, 8 }, }, { { 226, 246, 4040 },{ 255, 246, 8 },{ 226, 246, 456 },{ 255, 246, 8 }, }, + { { 13, 42, 566 },{ 13, 42, 560 },{ 13, 0, 9 },{ 13, 0, 8 }, }, { { 50, 0, 329 },{ 50, 0, 328 },{ 21, 0, 9 },{ 21, 0, 8 }, }, + { { 29, 58, 566 },{ 67, 2, 1352 },{ 3, 29, 70 },{ 29, 3, 8 }, }, { { 10, 79, 2758 },{ 76, 11, 1352 },{ 11, 37, 70 },{ 37, 11, 8 }, }, + { { 7, 75, 790 },{ 7, 75, 784 },{ 20, 46, 70 },{ 46, 20, 8 }, }, { { 15, 83, 790 },{ 97, 1, 1328 },{ 28, 54, 70 },{ 54, 28, 8 }, }, + { { 101, 7, 1329 },{ 105, 9, 1328 },{ 62, 0, 39 },{ 62, 36, 8 }, }, { { 99, 1, 239 },{ 99, 3, 232 },{ 1, 71, 98 },{ 70, 44, 8 }, }, + { { 107, 11, 239 },{ 108, 12, 232 },{ 10, 80, 98 },{ 79, 53, 8 }, }, { { 115, 19, 239 },{ 116, 20, 232 },{ 18, 88, 98 },{ 87, 61, 8 }, }, + { { 123, 27, 239 },{ 124, 28, 232 },{ 26, 96, 98 },{ 95, 69, 8 }, }, { { 131, 35, 239 },{ 132, 36, 232 },{ 34, 104, 98 },{ 103, 77, 8 }, }, + { { 140, 44, 239 },{ 141, 45, 232 },{ 43, 113, 98 },{ 112, 86, 8 }, }, { { 148, 52, 239 },{ 149, 53, 232 },{ 51, 121, 98 },{ 120, 94, 8 }, }, + { { 156, 60, 239 },{ 157, 61, 232 },{ 59, 129, 98 },{ 128, 102, 8 }, }, { { 164, 68, 239 },{ 165, 69, 232 },{ 67, 137, 98 },{ 136, 110, 8 }, }, + { { 173, 77, 239 },{ 174, 78, 232 },{ 76, 146, 98 },{ 145, 119, 8 }, }, { { 181, 85, 239 },{ 182, 86, 232 },{ 84, 154, 98 },{ 153, 127, 8 }, }, + { { 189, 93, 239 },{ 190, 94, 232 },{ 92, 162, 98 },{ 161, 135, 8 }, }, { { 197, 101, 239 },{ 198, 102, 232 },{ 100, 170, 98 },{ 169, 143, 8 }, }, + { { 206, 110, 239 },{ 207, 111, 232 },{ 109, 179, 98 },{ 178, 152, 8 }, }, { { 214, 118, 239 },{ 215, 119, 232 },{ 117, 187, 98 },{ 186, 160, 8 }, }, + { { 222, 126, 239 },{ 223, 127, 232 },{ 125, 195, 98 },{ 194, 168, 8 }, }, { { 230, 134, 239 },{ 231, 135, 232 },{ 133, 203, 98 },{ 202, 176, 8 }, }, + { { 239, 143, 239 },{ 240, 144, 232 },{ 142, 212, 98 },{ 211, 185, 8 }, }, { { 247, 151, 239 },{ 180, 248, 784 },{ 150, 220, 98 },{ 219, 193, 8 }, }, + { { 159, 228, 3682 },{ 201, 227, 3648 },{ 158, 228, 98 },{ 227, 201, 8 }, }, { { 181, 249, 3928 },{ 209, 235, 3648 },{ 166, 236, 98 },{ 235, 209, 8 }, }, + { { 255, 189, 169 },{ 218, 244, 3648 },{ 175, 245, 98 },{ 244, 218, 8 }, }, { { 197, 226, 4040 },{ 226, 252, 3648 },{ 183, 253, 98 },{ 252, 226, 8 }, }, + { { 205, 234, 4040 },{ 255, 234, 8 },{ 205, 234, 456 },{ 255, 234, 8 }, }, { { 213, 242, 4040 },{ 255, 242, 8 },{ 213, 242, 456 },{ 255, 242, 8 }, }, + { { 18, 60, 566 },{ 18, 60, 560 },{ 18, 0, 9 },{ 18, 0, 8 }, }, { { 26, 68, 566 },{ 26, 68, 560 },{ 26, 0, 9 },{ 26, 0, 8 }, }, + { { 34, 76, 566 },{ 34, 76, 560 },{ 34, 0, 9 },{ 34, 0, 8 }, }, { { 5, 104, 2758 },{ 98, 5, 1352 },{ 42, 0, 57 },{ 42, 6, 8 }, }, + { { 92, 0, 313 },{ 93, 1, 312 },{ 15, 51, 70 },{ 51, 15, 8 }, }, { { 3, 101, 790 },{ 3, 101, 784 },{ 0, 59, 88 },{ 59, 23, 8 }, }, + { { 14, 107, 790 },{ 11, 109, 784 },{ 31, 67, 70 },{ 67, 31, 8 }, }, { { 19, 117, 790 },{ 19, 117, 784 },{ 39, 75, 70 },{ 75, 39, 8 }, }, + { { 28, 126, 790 },{ 28, 126, 784 },{ 83, 5, 33 },{ 84, 48, 8 }, }, { { 132, 0, 239 },{ 36, 134, 784 },{ 91, 13, 33 },{ 92, 56, 8 }, }, + { { 142, 4, 239 },{ 44, 142, 784 },{ 99, 21, 33 },{ 100, 64, 8 }, }, { { 150, 12, 239 },{ 52, 150, 784 },{ 107, 29, 33 },{ 108, 72, 8 }, }, + { { 159, 21, 239 },{ 61, 159, 784 },{ 116, 38, 33 },{ 117, 81, 8 }, }, { { 167, 29, 239 },{ 69, 167, 784 },{ 124, 46, 33 },{ 125, 89, 8 }, }, + { { 175, 37, 239 },{ 77, 175, 784 },{ 132, 54, 33 },{ 133, 97, 8 }, }, { { 183, 45, 239 },{ 85, 183, 784 },{ 140, 62, 33 },{ 141, 105, 8 }, }, + { { 192, 54, 239 },{ 94, 192, 784 },{ 149, 71, 33 },{ 150, 114, 8 }, }, { { 200, 62, 239 },{ 102, 200, 784 },{ 157, 79, 33 },{ 158, 122, 8 }, }, + { { 208, 70, 239 },{ 110, 208, 784 },{ 165, 87, 33 },{ 166, 130, 8 }, }, { { 216, 78, 239 },{ 118, 216, 784 },{ 173, 95, 33 },{ 174, 138, 8 }, }, + { { 225, 87, 239 },{ 127, 225, 784 },{ 182, 104, 33 },{ 183, 147, 8 }, }, { { 233, 95, 239 },{ 135, 233, 784 },{ 190, 112, 33 },{ 191, 155, 8 }, }, + { { 241, 103, 239 },{ 143, 241, 784 },{ 198, 120, 33 },{ 199, 163, 8 }, }, { { 111, 208, 3682 },{ 151, 249, 784 },{ 206, 128, 33 },{ 207, 171, 8 }, }, + { { 120, 217, 3682 },{ 180, 216, 3648 },{ 215, 137, 33 },{ 216, 180, 8 }, }, { { 128, 225, 3682 },{ 188, 224, 3648 },{ 223, 145, 33 },{ 224, 188, 8 }, }, + { { 155, 253, 3928 },{ 196, 232, 3648 },{ 231, 153, 33 },{ 232, 196, 8 }, }, { { 144, 241, 3682 },{ 204, 240, 3648 },{ 239, 161, 33 },{ 240, 204, 8 }, }, + { { 153, 250, 3682 },{ 213, 249, 3648 },{ 248, 170, 33 },{ 249, 213, 8 }, }, { { 179, 221, 4040 },{ 255, 221, 8 },{ 179, 221, 456 },{ 255, 221, 8 }, }, + { { 187, 229, 4040 },{ 255, 229, 8 },{ 187, 229, 456 },{ 255, 229, 8 }, }, { { 195, 237, 4040 },{ 255, 237, 8 },{ 195, 237, 456 },{ 255, 237, 8 }, }, + { { 24, 80, 566 },{ 24, 80, 560 },{ 24, 0, 9 },{ 24, 0, 8 }, }, { { 32, 88, 566 },{ 32, 88, 560 },{ 32, 0, 9 },{ 32, 0, 8 }, }, + { { 40, 96, 566 },{ 40, 96, 560 },{ 40, 0, 9 },{ 40, 0, 8 }, }, { { 48, 104, 566 },{ 48, 104, 560 },{ 48, 0, 9 },{ 48, 0, 8 }, }, + { { 9, 138, 2758 },{ 130, 7, 1352 },{ 9, 57, 70 },{ 57, 9, 8 }, }, { { 119, 0, 313 },{ 120, 0, 312 },{ 17, 65, 70 },{ 65, 17, 8 }, }, + { { 0, 128, 784 },{ 128, 6, 312 },{ 25, 73, 70 },{ 73, 25, 8 }, }, { { 6, 137, 790 },{ 5, 136, 784 },{ 33, 81, 70 },{ 81, 33, 8 }, }, + { { 42, 171, 2758 },{ 14, 145, 784 },{ 42, 90, 70 },{ 90, 42, 8 }, }, { { 50, 179, 2758 },{ 22, 153, 784 },{ 50, 98, 70 },{ 98, 50, 8 }, }, + { { 58, 187, 2758 },{ 30, 161, 784 },{ 58, 106, 70 },{ 106, 58, 8 }, }, { { 191, 18, 1329 },{ 38, 169, 784 },{ 112, 9, 33 },{ 114, 66, 8 }, }, + { { 176, 0, 239 },{ 47, 178, 784 },{ 121, 18, 33 },{ 123, 75, 8 }, }, { { 187, 1, 239 },{ 55, 186, 784 },{ 129, 26, 33 },{ 131, 83, 8 }, }, + { { 195, 10, 239 },{ 63, 194, 784 },{ 137, 34, 33 },{ 139, 91, 8 }, }, { { 203, 18, 239 },{ 71, 202, 784 },{ 145, 42, 33 },{ 147, 99, 8 }, }, + { { 212, 27, 239 },{ 80, 211, 784 },{ 154, 51, 33 },{ 156, 108, 8 }, }, { { 220, 35, 239 },{ 88, 219, 784 },{ 162, 59, 33 },{ 164, 116, 8 }, }, + { { 228, 43, 239 },{ 96, 227, 784 },{ 170, 67, 33 },{ 172, 124, 8 }, }, { { 236, 51, 239 },{ 104, 235, 784 },{ 178, 75, 33 },{ 180, 132, 8 }, }, + { { 245, 60, 239 },{ 113, 244, 784 },{ 187, 84, 33 },{ 189, 141, 8 }, }, { { 91, 194, 3680 },{ 149, 197, 3648 },{ 195, 92, 33 },{ 197, 149, 8 }, }, + { { 99, 202, 3680 },{ 157, 205, 3648 },{ 203, 100, 33 },{ 205, 157, 8 }, }, { { 107, 210, 3680 },{ 165, 213, 3648 },{ 211, 108, 33 },{ 213, 165, 8 }, }, + { { 119, 249, 3928 },{ 174, 222, 3648 },{ 220, 117, 33 },{ 222, 174, 8 }, }, { { 127, 255, 856 },{ 182, 230, 3648 },{ 228, 125, 33 },{ 230, 182, 8 }, }, + { { 255, 135, 169 },{ 190, 238, 3648 },{ 236, 133, 33 },{ 238, 190, 8 }, }, { { 140, 243, 3680 },{ 198, 246, 3648 },{ 244, 141, 33 },{ 246, 198, 8 }, }, + { { 151, 207, 4040 },{ 255, 207, 8 },{ 151, 207, 456 },{ 255, 207, 8 }, }, { { 159, 215, 4040 },{ 255, 215, 8 },{ 159, 215, 456 },{ 255, 215, 8 }, }, + { { 167, 223, 4040 },{ 255, 223, 8 },{ 167, 223, 456 },{ 255, 223, 8 }, }, { { 175, 231, 4040 },{ 255, 231, 8 },{ 175, 231, 456 },{ 255, 231, 8 }, }, + { { 33, 106, 566 },{ 33, 106, 560 },{ 33, 0, 9 },{ 33, 0, 8 }, }, { { 41, 114, 566 },{ 41, 114, 560 },{ 41, 0, 9 },{ 41, 0, 8 }, }, + { { 49, 122, 566 },{ 49, 122, 560 },{ 49, 0, 9 },{ 49, 0, 8 }, }, { { 57, 130, 566 },{ 57, 130, 560 },{ 57, 0, 9 },{ 57, 0, 8 }, }, + { { 66, 139, 566 },{ 66, 139, 560 },{ 66, 0, 9 },{ 66, 0, 8 }, }, { { 74, 147, 566 },{ 170, 7, 1352 },{ 8, 74, 70 },{ 74, 8, 8 }, }, + { { 152, 0, 313 },{ 178, 15, 1352 },{ 0, 82, 80 },{ 82, 16, 8 }, }, { { 162, 0, 313 },{ 186, 23, 1352 },{ 24, 90, 70 },{ 90, 24, 8 }, }, + { { 0, 171, 784 },{ 195, 32, 1352 },{ 33, 99, 70 },{ 99, 33, 8 }, }, { { 6, 179, 790 },{ 203, 40, 1352 },{ 41, 107, 70 },{ 107, 41, 8 }, }, + { { 15, 187, 790 },{ 211, 48, 1352 },{ 115, 0, 41 },{ 115, 49, 8 }, }, { { 61, 199, 710 },{ 219, 56, 1352 },{ 57, 123, 70 },{ 123, 57, 8 }, }, + { { 70, 208, 710 },{ 228, 65, 1352 },{ 66, 132, 70 },{ 132, 66, 8 }, }, { { 78, 216, 710 },{ 236, 73, 1352 },{ 74, 140, 70 },{ 140, 74, 8 }, }, + { { 86, 224, 710 },{ 244, 81, 1352 },{ 145, 7, 33 },{ 148, 82, 8 }, }, { { 222, 8, 233 },{ 252, 89, 1352 },{ 153, 15, 33 },{ 156, 90, 8 }, }, + { { 235, 0, 239 },{ 241, 101, 328 },{ 166, 6, 39 },{ 165, 99, 8 }, }, { { 32, 170, 3680 },{ 249, 109, 328 },{ 0, 175, 98 },{ 173, 107, 8 }, }, + { { 40, 178, 3680 },{ 115, 181, 3648 },{ 8, 183, 98 },{ 181, 115, 8 }, }, { { 48, 186, 3680 },{ 123, 189, 3648 },{ 16, 191, 98 },{ 189, 123, 8 }, }, + { { 57, 195, 3680 },{ 132, 198, 3648 },{ 25, 200, 98 },{ 198, 132, 8 }, }, { { 67, 243, 3928 },{ 140, 206, 3648 },{ 33, 208, 98 },{ 206, 140, 8 }, }, + { { 76, 251, 3928 },{ 148, 214, 3648 },{ 41, 216, 98 },{ 214, 148, 8 }, }, { { 86, 255, 856 },{ 156, 222, 3648 },{ 49, 224, 98 },{ 222, 156, 8 }, }, + { { 255, 93, 169 },{ 165, 231, 3648 },{ 58, 233, 98 },{ 231, 165, 8 }, }, { { 98, 236, 3680 },{ 173, 239, 3648 },{ 66, 241, 98 },{ 239, 173, 8 }, }, + { { 108, 181, 4040 },{ 181, 247, 3648 },{ 74, 249, 98 },{ 247, 181, 8 }, }, { { 116, 189, 4040 },{ 255, 189, 8 },{ 116, 189, 456 },{ 255, 189, 8 }, }, + { { 125, 198, 4040 },{ 255, 198, 8 },{ 125, 198, 456 },{ 255, 198, 8 }, }, { { 133, 206, 4040 },{ 255, 206, 8 },{ 133, 206, 456 },{ 255, 206, 8 }, }, + { { 141, 214, 4040 },{ 255, 214, 8 },{ 141, 214, 456 },{ 255, 214, 8 }, }, { { 149, 222, 4040 },{ 255, 222, 8 },{ 149, 222, 456 },{ 255, 222, 8 }, }, + { { 47, 183, 566 },{ 47, 183, 560 },{ 47, 0, 9 },{ 47, 0, 8 }, }, { { 55, 191, 566 },{ 55, 191, 560 },{ 55, 0, 9 },{ 55, 0, 8 }, }, + { { 63, 199, 566 },{ 63, 199, 560 },{ 63, 0, 9 },{ 63, 0, 8 }, }, { { 71, 207, 566 },{ 71, 207, 560 },{ 71, 0, 9 },{ 71, 0, 8 }, }, + { { 80, 216, 566 },{ 80, 216, 560 },{ 80, 0, 9 },{ 80, 0, 8 }, }, { { 88, 224, 566 },{ 88, 224, 560 },{ 88, 0, 9 },{ 88, 0, 8 }, }, + { { 3, 233, 710 },{ 3, 233, 704 },{ 2, 96, 70 },{ 96, 2, 8 }, }, { { 11, 241, 710 },{ 11, 241, 704 },{ 10, 104, 70 },{ 104, 10, 8 }, }, + { { 20, 250, 710 },{ 20, 250, 704 },{ 19, 113, 70 },{ 113, 19, 8 }, }, { { 27, 121, 3654 },{ 27, 121, 3648 },{ 27, 121, 70 },{ 121, 27, 8 }, }, + { { 35, 129, 3654 },{ 35, 129, 3648 },{ 35, 129, 70 },{ 129, 35, 8 }, }, { { 43, 137, 3654 },{ 43, 137, 3648 },{ 43, 137, 70 },{ 137, 43, 8 }, }, + { { 52, 146, 3654 },{ 52, 146, 3648 },{ 52, 146, 70 },{ 146, 52, 8 }, }, { { 60, 154, 3654 },{ 60, 154, 3648 },{ 60, 154, 70 },{ 154, 60, 8 }, }, + { { 68, 162, 3654 },{ 68, 162, 3648 },{ 68, 162, 70 },{ 162, 68, 8 }, }, { { 76, 170, 3654 },{ 76, 170, 3648 },{ 76, 170, 70 },{ 170, 76, 8 }, }, + { { 85, 179, 3654 },{ 85, 179, 3648 },{ 85, 179, 70 },{ 179, 85, 8 }, }, { { 93, 187, 3654 },{ 93, 187, 3648 },{ 93, 187, 70 },{ 187, 93, 8 }, }, + { { 101, 195, 3654 },{ 101, 195, 3648 },{ 101, 195, 70 },{ 195, 101, 8 }, }, { { 109, 203, 3654 },{ 109, 203, 3648 },{ 109, 203, 70 },{ 203, 109, 8 }, }, + { { 118, 212, 3654 },{ 118, 212, 3648 },{ 118, 212, 70 },{ 212, 118, 8 }, }, { { 126, 220, 3654 },{ 126, 220, 3648 },{ 126, 220, 70 },{ 220, 126, 8 }, }, + { { 134, 228, 3654 },{ 134, 228, 3648 },{ 134, 228, 70 },{ 228, 134, 8 }, }, { { 5, 236, 3680 },{ 142, 236, 3648 },{ 5, 236, 96 },{ 236, 142, 8 }, }, + { { 14, 245, 3680 },{ 151, 245, 3648 },{ 14, 245, 96 },{ 245, 151, 8 }, }, { { 23, 159, 4040 },{ 159, 253, 3648 },{ 23, 159, 456 },{ 253, 159, 8 }, }, + { { 31, 167, 4040 },{ 255, 167, 8 },{ 31, 167, 456 },{ 255, 167, 8 }, }, { { 39, 175, 4040 },{ 255, 175, 8 },{ 39, 175, 456 },{ 255, 175, 8 }, }, + { { 48, 184, 4040 },{ 255, 184, 8 },{ 48, 184, 456 },{ 255, 184, 8 }, }, { { 56, 192, 4040 },{ 255, 192, 8 },{ 56, 192, 456 },{ 255, 192, 8 }, }, + { { 64, 200, 4040 },{ 255, 200, 8 },{ 64, 200, 456 },{ 255, 200, 8 }, },{ { 72, 208, 4040 },{ 255, 208, 8 },{ 72, 208, 456 },{ 255, 208, 8 }, }, + + }; + + struct dxt5a_block + { + uint8_t m_endpoints[2]; + + enum { cTotalSelectorBytes = 6 }; + uint8_t m_selectors[cTotalSelectorBytes]; + + inline void clear() + { + basisu::clear_obj(*this); + } + + inline uint32_t get_low_alpha() const + { + return m_endpoints[0]; + } + + inline uint32_t get_high_alpha() const + { + return m_endpoints[1]; + } + + inline void set_low_alpha(uint32_t i) + { + assert(i <= UINT8_MAX); + m_endpoints[0] = static_cast(i); + } + + inline void set_high_alpha(uint32_t i) + { + assert(i <= UINT8_MAX); + m_endpoints[1] = static_cast(i); + } + + inline bool is_alpha6_block() const { return get_low_alpha() <= get_high_alpha(); } + + uint32_t get_endpoints_as_word() const { return m_endpoints[0] | (m_endpoints[1] << 8); } + uint32_t get_selectors_as_word(uint32_t index) { assert(index < 3); return m_selectors[index * 2] | (m_selectors[index * 2 + 1] << 8); } + + inline uint32_t get_selector(uint32_t x, uint32_t y) const + { + assert((x < 4U) && (y < 4U)); + + uint32_t selector_index = (y * 4) + x; + uint32_t bit_index = selector_index * cDXT5SelectorBits; + + uint32_t byte_index = bit_index >> 3; + uint32_t bit_ofs = bit_index & 7; + + uint32_t v = m_selectors[byte_index]; + if (byte_index < (cTotalSelectorBytes - 1)) + v |= (m_selectors[byte_index + 1] << 8); + + return (v >> bit_ofs) & 7; + } + + inline void set_selector(uint32_t x, uint32_t y, uint32_t val) + { + assert((x < 4U) && (y < 4U) && (val < 8U)); + + uint32_t selector_index = (y * 4) + x; + uint32_t bit_index = selector_index * cDXT5SelectorBits; + + uint32_t byte_index = bit_index >> 3; + uint32_t bit_ofs = bit_index & 7; + + uint32_t v = m_selectors[byte_index]; + if (byte_index < (cTotalSelectorBytes - 1)) + v |= (m_selectors[byte_index + 1] << 8); + + v &= (~(7 << bit_ofs)); + v |= (val << bit_ofs); + + m_selectors[byte_index] = static_cast(v); + if (byte_index < (cTotalSelectorBytes - 1)) + m_selectors[byte_index + 1] = static_cast(v >> 8); + } + + enum { cMaxSelectorValues = 8 }; + + static uint32_t get_block_values6(color32* pDst, uint32_t l, uint32_t h) + { + pDst[0].a = static_cast(l); + pDst[1].a = static_cast(h); + pDst[2].a = static_cast((l * 4 + h) / 5); + pDst[3].a = static_cast((l * 3 + h * 2) / 5); + pDst[4].a = static_cast((l * 2 + h * 3) / 5); + pDst[5].a = static_cast((l + h * 4) / 5); + pDst[6].a = 0; + pDst[7].a = 255; + return 6; + } + + static uint32_t get_block_values8(color32* pDst, uint32_t l, uint32_t h) + { + pDst[0].a = static_cast(l); + pDst[1].a = static_cast(h); + pDst[2].a = static_cast((l * 6 + h) / 7); + pDst[3].a = static_cast((l * 5 + h * 2) / 7); + pDst[4].a = static_cast((l * 4 + h * 3) / 7); + pDst[5].a = static_cast((l * 3 + h * 4) / 7); + pDst[6].a = static_cast((l * 2 + h * 5) / 7); + pDst[7].a = static_cast((l + h * 6) / 7); + return 8; + } + + static uint32_t get_block_values(color32* pDst, uint32_t l, uint32_t h) + { + if (l > h) + return get_block_values8(pDst, l, h); + else + return get_block_values6(pDst, l, h); + } + }; + + static void convert_etc1s_to_dxt5a(dxt5a_block* pDst_block, const endpoint* pEndpoints, const selector* pSelector) + { + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (low_selector == high_selector) + { + uint32_t r; + decoder_etc_block::get_block_color5_r(base_color, inten_table, low_selector, r); + + pDst_block->set_low_alpha(r); + pDst_block->set_high_alpha(r); + pDst_block->m_selectors[0] = 0; + pDst_block->m_selectors[1] = 0; + pDst_block->m_selectors[2] = 0; + pDst_block->m_selectors[3] = 0; + pDst_block->m_selectors[4] = 0; + pDst_block->m_selectors[5] = 0; + return; + } + else if (pSelector->m_num_unique_selectors == 2) + { + color32 block_colors[4]; + + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + const uint32_t r0 = block_colors[low_selector].r; + const uint32_t r1 = block_colors[high_selector].r; + + pDst_block->set_low_alpha(r0); + pDst_block->set_high_alpha(r1); + + // TODO: Optimize this + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + pDst_block->set_selector(x, y, (s == high_selector) ? 1 : 0); + } + } + + return; + } + + uint32_t selector_range_table = 0; + for (selector_range_table = 0; selector_range_table < NUM_DXT5A_SELECTOR_RANGES; selector_range_table++) + if ((low_selector == s_dxt5a_selector_ranges[selector_range_table].m_low) && (high_selector == s_dxt5a_selector_ranges[selector_range_table].m_high)) + break; + if (selector_range_table >= NUM_DXT5A_SELECTOR_RANGES) + selector_range_table = 0; + + const etc1_g_to_dxt5a_conversion* pTable_entry = &g_etc1_g_to_dxt5a[base_color.r + inten_table * 32][selector_range_table]; + + pDst_block->set_low_alpha(pTable_entry->m_lo); + pDst_block->set_high_alpha(pTable_entry->m_hi); + + // TODO: Optimize this (like ETC1->BC1) + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + + uint32_t ds = (pTable_entry->m_trans >> (s * 3)) & 7; + + pDst_block->set_selector(x, y, ds); + } + } + } +#endif //BASISD_SUPPORT_DXT5A + + // PVRTC + +#if BASISD_SUPPORT_PVRTC1 || BASISD_SUPPORT_UASTC + static const uint16_t g_pvrtc_swizzle_table[256] = + { + 0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015, 0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055, 0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115, 0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155, + 0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415, 0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455, 0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515, 0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555, + 0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015, 0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055, 0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115, 0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155, + 0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415, 0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455, 0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515, 0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555, + 0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015, 0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055, 0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115, 0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155, + 0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415, 0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455, 0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515, 0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555, + 0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015, 0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055, 0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115, 0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155, + 0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415, 0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455, 0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515, 0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555 + }; + + // Note we can't use simple calculations to convert PVRTC1 encoded endpoint components to/from 8-bits, due to hardware approximations. + static const uint8_t g_pvrtc_5[32] = { 0,8,16,24,33,41,49,57,66,74,82,90,99,107,115,123,132,140,148,156,165,173,181,189,198,206,214,222,231,239,247,255 }; + static const uint8_t g_pvrtc_4[16] = { 0,16,33,49,66,82,99,115,140,156,173,189,206,222,239,255 }; + static const uint8_t g_pvrtc_3[8] = { 0,33,74,107,148,181,222,255 }; + static const uint8_t g_pvrtc_alpha[9] = { 0,34,68,102,136,170,204,238,255 }; + + static const uint8_t g_pvrtc_5_floor[256] = + { + 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3, + 3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7, + 7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15, + 15,15,15,15,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19, + 19,19,19,19,19,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,23,23,23, + 23,23,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,27,27, + 27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,31 + }; + + static const uint8_t g_pvrtc_5_ceil[256] = + { + 0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4, + 4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,8,8,8, + 8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12, + 12,12,12,12,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,16,16,16,16, + 16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,20,20,20, + 20,20,20,20,20,20,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,24,24, + 24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,28, + 28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,31,31,31,31,31,31,31,31 + }; + + static const uint8_t g_pvrtc_4_floor[256] = + { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,15 + }; + + static const uint8_t g_pvrtc_4_ceil[256] = + { + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 + }; + + static const uint8_t g_pvrtc_3_floor[256] = + { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7 + }; + + static const uint8_t g_pvrtc_3_ceil[256] = + { + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 + }; + + static const uint8_t g_pvrtc_alpha_floor[256] = + { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8 + }; + + static const uint8_t g_pvrtc_alpha_ceil[256] = + { + 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 + }; + + struct pvrtc4_block + { + uint32_t m_modulation; + uint32_t m_endpoints; + + pvrtc4_block() : m_modulation(0), m_endpoints(0) { } + + inline bool operator== (const pvrtc4_block& rhs) const + { + return (m_modulation == rhs.m_modulation) && (m_endpoints == rhs.m_endpoints); + } + + inline void clear() + { + m_modulation = 0; + m_endpoints = 0; + } + + inline bool get_block_uses_transparent_modulation() const + { + return (m_endpoints & 1) != 0; + } + + inline void set_block_uses_transparent_modulation(bool m) + { + m_endpoints = (m_endpoints & ~1U) | static_cast(m); + } + + inline bool is_endpoint_opaque(uint32_t endpoint_index) const + { + static const uint32_t s_bitmasks[2] = { 0x8000U, 0x80000000U }; + return (m_endpoints & s_bitmasks[basisu::open_range_check(endpoint_index, 2U)]) != 0; + } + + inline void set_endpoint_opaque(uint32_t endpoint_index, bool opaque) + { + assert(endpoint_index < 2); + static const uint32_t s_bitmasks[2] = { 0x8000U, 0x80000000U }; + if (opaque) + m_endpoints |= s_bitmasks[endpoint_index]; + else + m_endpoints &= ~s_bitmasks[endpoint_index]; + } + + inline color32 get_endpoint_5554(uint32_t endpoint_index) const + { + assert(endpoint_index < 2); + static const uint32_t s_endpoint_mask[2] = { 0xFFFE, 0xFFFF }; + uint32_t packed = (m_endpoints >> (basisu::open_range_check(endpoint_index, 2U) ? 16 : 0)) & s_endpoint_mask[endpoint_index]; + + uint32_t r, g, b, a; + if (packed & 0x8000) + { + // opaque 554 or 555 + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + + if (!endpoint_index) + b |= (b >> 4); + + a = 0xF; + } + else + { + // translucent 4433 or 4443 + r = (packed >> 7) & 0x1E; + g = (packed >> 3) & 0x1E; + b = (packed & 0xF) << 1; + + r |= (r >> 4); + g |= (g >> 4); + + if (!endpoint_index) + b |= (b >> 3); + else + b |= (b >> 4); + + a = (packed >> 11) & 0xE; + } + + assert((r < 32) && (g < 32) && (b < 32) && (a < 16)); + + return color32(r, g, b, a); + } + + inline color32 get_endpoint_8888(uint32_t endpoint_index) const + { + assert(endpoint_index < 2); + static const uint32_t s_endpoint_mask[2] = { 0xFFFE, 0xFFFF }; + uint32_t packed = (m_endpoints >> (basisu::open_range_check(endpoint_index, 2U) ? 16 : 0)) & s_endpoint_mask[endpoint_index]; + + uint32_t r, g, b, a; + if (packed & 0x8000) + { + // opaque 554 or 555 + // 1RRRRRGGGGGBBBBM + // 1RRRRRGGGGGBBBBB + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + + r = g_pvrtc_5[r]; + g = g_pvrtc_5[g]; + + if (!endpoint_index) + b = g_pvrtc_4[b >> 1]; + else + b = g_pvrtc_5[b]; + + a = 255; + } + else + { + // translucent 4433 or 4443 + // 0AAA RRRR GGGG BBBM + // 0AAA RRRR GGGG BBBB + r = (packed >> 8) & 0xF; + g = (packed >> 4) & 0xF; + b = packed & 0xF; + a = (packed >> 12) & 7; + + r = g_pvrtc_4[r]; + g = g_pvrtc_4[g]; + + if (!endpoint_index) + b = g_pvrtc_3[b >> 1]; + else + b = g_pvrtc_4[b]; + + a = g_pvrtc_alpha[a]; + } + + return color32(r, g, b, a); + } + + inline uint32_t get_endpoint_l8(uint32_t endpoint_index) const + { + color32 c(get_endpoint_8888(endpoint_index)); + return c.r + c.g + c.b + c.a; + } + + inline uint32_t get_opaque_endpoint_l0() const + { + uint32_t packed = m_endpoints & 0xFFFE; + + uint32_t r, g, b; + assert(packed & 0x8000); + + // opaque 554 or 555 + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + b |= (b >> 4); + + return r + g + b; + } + + inline uint32_t get_opaque_endpoint_l1() const + { + uint32_t packed = m_endpoints >> 16; + + uint32_t r, g, b; + assert(packed & 0x8000); + + // opaque 554 or 555 + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + + return r + g + b; + } + + static uint32_t get_component_precision_in_bits(uint32_t c, uint32_t endpoint_index, bool opaque_endpoint) + { + static const uint32_t s_comp_prec[4][4] = + { + // R0 G0 B0 A0 R1 G1 B1 A1 + { 4, 4, 3, 3 },{ 4, 4, 4, 3 }, // transparent endpoint + + { 5, 5, 4, 0 },{ 5, 5, 5, 0 } // opaque endpoint + }; + return s_comp_prec[basisu::open_range_check(endpoint_index, 2U) + (opaque_endpoint * 2)][basisu::open_range_check(c, 4U)]; + } + + static color32 get_color_precision_in_bits(uint32_t endpoint_index, bool opaque_endpoint) + { + static const color32 s_color_prec[4] = + { + color32(4, 4, 3, 3), color32(4, 4, 4, 3), // transparent endpoint + color32(5, 5, 4, 0), color32(5, 5, 5, 0) // opaque endpoint + }; + return s_color_prec[basisu::open_range_check(endpoint_index, 2U) + (opaque_endpoint * 2)]; + } + + inline void set_opaque_endpoint_floor(uint32_t endpoint_index, const color32& c) + { + assert(endpoint_index < 2); + const uint32_t m = m_endpoints & 1; + + uint32_t r = g_pvrtc_5_floor[c[0]], g = g_pvrtc_5_floor[c[1]], b = c[2]; + + if (!endpoint_index) + b = g_pvrtc_4_floor[b] << 1; + else + b = g_pvrtc_5_floor[b]; + + // rgba=555 here + assert((r < 32) && (g < 32) && (b < 32)); + + // 1RRRRRGGGGGBBBBM + // 1RRRRRGGGGGBBBBB + + // opaque 554 or 555 + uint32_t packed = 0x8000 | (r << 10) | (g << 5) | b; + if (!endpoint_index) + packed = (packed & ~1) | m; + + assert(packed <= 0xFFFF); + + if (endpoint_index) + m_endpoints = (m_endpoints & 0xFFFFU) | (packed << 16); + else + m_endpoints = (m_endpoints & 0xFFFF0000U) | packed; + } + + inline void set_opaque_endpoint_ceil(uint32_t endpoint_index, const color32& c) + { + assert(endpoint_index < 2); + const uint32_t m = m_endpoints & 1; + + uint32_t r = g_pvrtc_5_ceil[c[0]], g = g_pvrtc_5_ceil[c[1]], b = c[2]; + + if (!endpoint_index) + b = g_pvrtc_4_ceil[b] << 1; + else + b = g_pvrtc_5_ceil[b]; + + // rgba=555 here + assert((r < 32) && (g < 32) && (b < 32)); + + // 1RRRRRGGGGGBBBBM + // 1RRRRRGGGGGBBBBB + + // opaque 554 or 555 + uint32_t packed = 0x8000 | (r << 10) | (g << 5) | b; + if (!endpoint_index) + packed |= m; + + assert(packed <= 0xFFFF); + + if (endpoint_index) + m_endpoints = (m_endpoints & 0xFFFFU) | (packed << 16); + else + m_endpoints = (m_endpoints & 0xFFFF0000U) | packed; + } + + // opaque endpoints: 554 or 555 + // transparent endpoints: 3443 or 3444 + inline void set_endpoint_raw(uint32_t endpoint_index, const color32& c, bool opaque_endpoint) + { + assert(endpoint_index < 2); + const uint32_t m = m_endpoints & 1; + uint32_t r = c[0], g = c[1], b = c[2], a = c[3]; + + uint32_t packed; + + if (opaque_endpoint) + { + if (!endpoint_index) + { + // 554 + // 1RRRRRGGGGGBBBBM + assert((r < 32) && (g < 32) && (b < 16)); + packed = 0x8000 | (r << 10) | (g << 5) | (b << 1) | m; + } + else + { + // 555 + // 1RRRRRGGGGGBBBBB + assert((r < 32) && (g < 32) && (b < 32)); + packed = 0x8000 | (r << 10) | (g << 5) | b; + } + } + else + { + if (!endpoint_index) + { + // 3443 + // 0AAA RRRR GGGG BBBM + assert((r < 16) && (g < 16) && (b < 8) && (a < 8)); + packed = (a << 12) | (r << 8) | (g << 4) | (b << 1) | m; + } + else + { + // 3444 + // 0AAA RRRR GGGG BBBB + assert((r < 16) && (g < 16) && (b < 16) && (a < 8)); + packed = (a << 12) | (r << 8) | (g << 4) | b; + } + } + + assert(packed <= 0xFFFF); + + if (endpoint_index) + m_endpoints = (m_endpoints & 0xFFFFU) | (packed << 16); + else + m_endpoints = (m_endpoints & 0xFFFF0000U) | packed; + } + + inline void set_endpoint_floor(uint32_t endpoint_index, const color32& c) + { + assert(endpoint_index < 2); + + int a = g_pvrtc_alpha_floor[c.a]; + if (a == 8) + { + // 554 or 555 + uint32_t r = g_pvrtc_5_floor[c[0]], g = g_pvrtc_5_floor[c[1]], b = c[2]; + + if (!endpoint_index) + b = g_pvrtc_4_floor[b]; + else + b = g_pvrtc_5_floor[b]; + + set_endpoint_raw(endpoint_index, color32(r, g, b, a), true); + } + else + { + // 4433 or 4443 + uint32_t r = g_pvrtc_4_floor[c[0]], g = g_pvrtc_4_floor[c[1]], b = c[2]; + + if (!endpoint_index) + b = g_pvrtc_3_floor[b]; + else + b = g_pvrtc_4_floor[b]; + + set_endpoint_raw(endpoint_index, color32(r, g, b, a), false); + } + } + + inline void set_endpoint_ceil(uint32_t endpoint_index, const color32& c) + { + assert(endpoint_index < 2); + + int a = g_pvrtc_alpha_ceil[c.a]; + if (a == 8) + { + // 554 or 555 + uint32_t r = g_pvrtc_5_ceil[c[0]], g = g_pvrtc_5_ceil[c[1]], b = c[2]; + + if (!endpoint_index) + b = g_pvrtc_4_ceil[b]; + else + b = g_pvrtc_5_ceil[b]; + + set_endpoint_raw(endpoint_index, color32(r, g, b, a), true); + } + else + { + // 4433 or 4443 + uint32_t r = g_pvrtc_4_ceil[c[0]], g = g_pvrtc_4_ceil[c[1]], b = c[2]; + + if (!endpoint_index) + b = g_pvrtc_3_ceil[b]; + else + b = g_pvrtc_4_ceil[b]; + + set_endpoint_raw(endpoint_index, color32(r, g, b, a), false); + } + } + + inline uint32_t get_modulation(uint32_t x, uint32_t y) const + { + assert((x < 4) && (y < 4)); + return (m_modulation >> ((y * 4 + x) * 2)) & 3; + } + + // Scaled by 8 + inline const uint32_t* get_scaled_modulation_values(bool block_uses_transparent_modulation) const + { + static const uint32_t s_block_scales[2][4] = { { 0, 3, 5, 8 },{ 0, 4, 4, 8 } }; + return s_block_scales[block_uses_transparent_modulation]; + } + + // Scaled by 8 + inline uint32_t get_scaled_modulation(uint32_t x, uint32_t y) const + { + return get_scaled_modulation_values(get_block_uses_transparent_modulation())[get_modulation(x, y)]; + } + + inline void set_modulation(uint32_t x, uint32_t y, uint32_t s) + { + assert((x < 4) && (y < 4) && (s < 4)); + uint32_t n = (y * 4 + x) * 2; + m_modulation = (m_modulation & (~(3 << n))) | (s << n); + assert(get_modulation(x, y) == s); + } + + // Assumes modulation was initialized to 0 + inline void set_modulation_fast(uint32_t x, uint32_t y, uint32_t s) + { + assert((x < 4) && (y < 4) && (s < 4)); + uint32_t n = (y * 4 + x) * 2; + m_modulation |= (s << n); + assert(get_modulation(x, y) == s); + } + }; + +#if 0 + static const uint8_t g_pvrtc_bilinear_weights[16][4] = + { + { 4, 4, 4, 4 }, { 2, 6, 2, 6 }, { 8, 0, 8, 0 }, { 6, 2, 6, 2 }, + { 2, 2, 6, 6 }, { 1, 3, 3, 9 }, { 4, 0, 12, 0 }, { 3, 1, 9, 3 }, + { 8, 8, 0, 0 }, { 4, 12, 0, 0 }, { 16, 0, 0, 0 }, { 12, 4, 0, 0 }, + { 6, 6, 2, 2 }, { 3, 9, 1, 3 }, { 12, 0, 4, 0 }, { 9, 3, 3, 1 }, + }; +#endif + + struct pvrtc1_temp_block + { + decoder_etc_block m_etc1_block; + uint32_t m_pvrtc_endpoints; + }; + + static inline uint32_t get_opaque_endpoint_l0(uint32_t endpoints) + { + uint32_t packed = endpoints; + + uint32_t r, g, b; + assert(packed & 0x8000); + + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 30; + b |= (b >> 4); + + return r + g + b; + } + + static inline uint32_t get_opaque_endpoint_l1(uint32_t endpoints) + { + uint32_t packed = endpoints >> 16; + + uint32_t r, g, b; + assert(packed & 0x8000); + + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + + return r + g + b; + } + + static color32 get_endpoint_8888(uint32_t endpoints, uint32_t endpoint_index) + { + assert(endpoint_index < 2); + static const uint32_t s_endpoint_mask[2] = { 0xFFFE, 0xFFFF }; + uint32_t packed = (endpoints >> (basisu::open_range_check(endpoint_index, 2U) ? 16 : 0)) & s_endpoint_mask[endpoint_index]; + + uint32_t r, g, b, a; + if (packed & 0x8000) + { + // opaque 554 or 555 + // 1RRRRRGGGGGBBBBM + // 1RRRRRGGGGGBBBBB + r = (packed >> 10) & 31; + g = (packed >> 5) & 31; + b = packed & 31; + + r = g_pvrtc_5[r]; + g = g_pvrtc_5[g]; + + if (!endpoint_index) + b = g_pvrtc_4[b >> 1]; + else + b = g_pvrtc_5[b]; + + a = 255; + } + else + { + // translucent 4433 or 4443 + // 0AAA RRRR GGGG BBBM + // 0AAA RRRR GGGG BBBB + r = (packed >> 8) & 0xF; + g = (packed >> 4) & 0xF; + b = packed & 0xF; + a = (packed >> 12) & 7; + + r = g_pvrtc_4[r]; + g = g_pvrtc_4[g]; + + if (!endpoint_index) + b = g_pvrtc_3[b >> 1]; + else + b = g_pvrtc_4[b]; + + a = g_pvrtc_alpha[a]; + } + + return color32(r, g, b, a); + } + + static uint32_t get_endpoint_l8(uint32_t endpoints, uint32_t endpoint_index) + { + color32 c(get_endpoint_8888(endpoints, endpoint_index)); + return c.r + c.g + c.b + c.a; + } +#endif + +#if BASISD_SUPPORT_PVRTC1 + // TODO: Support decoding a non-pow2 ETC1S texture into the next larger pow2 PVRTC texture. + static void fixup_pvrtc1_4_modulation_rgb(const decoder_etc_block* pETC_Blocks, const uint32_t* pPVRTC_endpoints, void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y) + { + const uint32_t x_mask = num_blocks_x - 1; + const uint32_t y_mask = num_blocks_y - 1; + const uint32_t x_bits = basisu::total_bits(x_mask); + const uint32_t y_bits = basisu::total_bits(y_mask); + const uint32_t min_bits = basisu::minimum(x_bits, y_bits); + //const uint32_t max_bits = basisu::maximum(x_bits, y_bits); + const uint32_t swizzle_mask = (1 << (min_bits * 2)) - 1; + + uint32_t block_index = 0; + + // really 3x3 + int e0[4][4], e1[4][4]; + + for (int y = 0; y < static_cast(num_blocks_y); y++) + { + const uint32_t* pE_rows[3]; + + for (int ey = 0; ey < 3; ey++) + { + int by = y + ey - 1; + + const uint32_t* pE = &pPVRTC_endpoints[(by & y_mask) * num_blocks_x]; + + pE_rows[ey] = pE; + + for (int ex = 0; ex < 3; ex++) + { + int bx = 0 + ex - 1; + + const uint32_t e = pE[bx & x_mask]; + + e0[ex][ey] = (get_opaque_endpoint_l0(e) * 255) / 31; + e1[ex][ey] = (get_opaque_endpoint_l1(e) * 255) / 31; + } + } + + const uint32_t y_swizzle = (g_pvrtc_swizzle_table[y >> 8] << 16) | g_pvrtc_swizzle_table[y & 0xFF]; + + for (int x = 0; x < static_cast(num_blocks_x); x++, block_index++) + { + const decoder_etc_block& src_block = pETC_Blocks[block_index]; + + const uint32_t x_swizzle = (g_pvrtc_swizzle_table[x >> 8] << 17) | (g_pvrtc_swizzle_table[x & 0xFF] << 1); + + uint32_t swizzled = x_swizzle | y_swizzle; + if (num_blocks_x != num_blocks_y) + { + swizzled &= swizzle_mask; + + if (num_blocks_x > num_blocks_y) + swizzled |= ((x >> min_bits) << (min_bits * 2)); + else + swizzled |= ((y >> min_bits) << (min_bits * 2)); + } + + pvrtc4_block* pDst_block = static_cast(pDst_blocks) + swizzled; + pDst_block->m_endpoints = pPVRTC_endpoints[block_index]; + + uint32_t base_r = g_etc_5_to_8[src_block.m_differential.m_red1]; + uint32_t base_g = g_etc_5_to_8[src_block.m_differential.m_green1]; + uint32_t base_b = g_etc_5_to_8[src_block.m_differential.m_blue1]; + + const int* pInten_table48 = g_etc1_inten_tables48[src_block.m_differential.m_cw1]; + int by = (base_r + base_g + base_b) * 16; + int block_colors_y_x16[4]; + block_colors_y_x16[0] = by + pInten_table48[2]; + block_colors_y_x16[1] = by + pInten_table48[3]; + block_colors_y_x16[2] = by + pInten_table48[1]; + block_colors_y_x16[3] = by + pInten_table48[0]; + + { + const uint32_t ex = 2; + int bx = x + ex - 1; + bx &= x_mask; + +#define DO_ROW(ey) \ + { \ + const uint32_t e = pE_rows[ey][bx]; \ + e0[ex][ey] = (get_opaque_endpoint_l0(e) * 255) / 31; \ + e1[ex][ey] = (get_opaque_endpoint_l1(e) * 255) / 31; \ + } + + DO_ROW(0); + DO_ROW(1); + DO_ROW(2); +#undef DO_ROW + } + + uint32_t mod = 0; + + uint32_t lookup_x[4]; + +#define DO_LOOKUP(lx) { \ + const uint32_t byte_ofs = 7 - (((lx) * 4) >> 3); \ + const uint32_t lsb_bits = src_block.m_bytes[byte_ofs] >> (((lx) & 1) * 4); \ + const uint32_t msb_bits = src_block.m_bytes[byte_ofs - 2] >> (((lx) & 1) * 4); \ + lookup_x[lx] = (lsb_bits & 0xF) | ((msb_bits & 0xF) << 4); } + + DO_LOOKUP(0); + DO_LOOKUP(1); + DO_LOOKUP(2); + DO_LOOKUP(3); +#undef DO_LOOKUP + +#define DO_PIX(lx, ly, w0, w1, w2, w3) \ + { \ + int ca_l = a0 * w0 + a1 * w1 + a2 * w2 + a3 * w3; \ + int cb_l = b0 * w0 + b1 * w1 + b2 * w2 + b3 * w3; \ + int cl = block_colors_y_x16[g_etc1_x_selector_unpack[ly][lookup_x[lx]]]; \ + int dl = cb_l - ca_l; \ + int vl = cl - ca_l; \ + int p = vl * 16; \ + if (ca_l > cb_l) { p = -p; dl = -dl; } \ + uint32_t m = 0; \ + if (p > 3 * dl) m = (uint32_t)(1 << ((ly) * 8 + (lx) * 2)); \ + if (p > 8 * dl) m = (uint32_t)(2 << ((ly) * 8 + (lx) * 2)); \ + if (p > 13 * dl) m = (uint32_t)(3 << ((ly) * 8 + (lx) * 2)); \ + mod |= m; \ + } + + { + const uint32_t ex = 0, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 0, 4, 4, 4, 4); + DO_PIX(1, 0, 2, 6, 2, 6); + DO_PIX(0, 1, 2, 2, 6, 6); + DO_PIX(1, 1, 1, 3, 3, 9); + } + + { + const uint32_t ex = 1, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 0, 8, 0, 8, 0); + DO_PIX(3, 0, 6, 2, 6, 2); + DO_PIX(2, 1, 4, 0, 12, 0); + DO_PIX(3, 1, 3, 1, 9, 3); + } + + { + const uint32_t ex = 0, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 2, 8, 8, 0, 0); + DO_PIX(1, 2, 4, 12, 0, 0); + DO_PIX(0, 3, 6, 6, 2, 2); + DO_PIX(1, 3, 3, 9, 1, 3); + } + + { + const uint32_t ex = 1, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 2, 16, 0, 0, 0); + DO_PIX(3, 2, 12, 4, 0, 0); + DO_PIX(2, 3, 12, 0, 4, 0); + DO_PIX(3, 3, 9, 3, 3, 1); + } +#undef DO_PIX + + pDst_block->m_modulation = mod; + + e0[0][0] = e0[1][0]; e0[1][0] = e0[2][0]; + e0[0][1] = e0[1][1]; e0[1][1] = e0[2][1]; + e0[0][2] = e0[1][2]; e0[1][2] = e0[2][2]; + + e1[0][0] = e1[1][0]; e1[1][0] = e1[2][0]; + e1[0][1] = e1[1][1]; e1[1][1] = e1[2][1]; + e1[0][2] = e1[1][2]; e1[1][2] = e1[2][2]; + + } // x + } // y + } + + static void fixup_pvrtc1_4_modulation_rgba( + const decoder_etc_block* pETC_Blocks, + const uint32_t* pPVRTC_endpoints, + void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, void *pAlpha_blocks, + const endpoint* pEndpoints, const selector* pSelectors) + { + const uint32_t x_mask = num_blocks_x - 1; + const uint32_t y_mask = num_blocks_y - 1; + const uint32_t x_bits = basisu::total_bits(x_mask); + const uint32_t y_bits = basisu::total_bits(y_mask); + const uint32_t min_bits = basisu::minimum(x_bits, y_bits); + //const uint32_t max_bits = basisu::maximum(x_bits, y_bits); + const uint32_t swizzle_mask = (1 << (min_bits * 2)) - 1; + + uint32_t block_index = 0; + + // really 3x3 + int e0[4][4], e1[4][4]; + + for (int y = 0; y < static_cast(num_blocks_y); y++) + { + const uint32_t* pE_rows[3]; + + for (int ey = 0; ey < 3; ey++) + { + int by = y + ey - 1; + + const uint32_t* pE = &pPVRTC_endpoints[(by & y_mask) * num_blocks_x]; + + pE_rows[ey] = pE; + + for (int ex = 0; ex < 3; ex++) + { + int bx = 0 + ex - 1; + + const uint32_t e = pE[bx & x_mask]; + + e0[ex][ey] = get_endpoint_l8(e, 0); + e1[ex][ey] = get_endpoint_l8(e, 1); + } + } + + const uint32_t y_swizzle = (g_pvrtc_swizzle_table[y >> 8] << 16) | g_pvrtc_swizzle_table[y & 0xFF]; + + for (int x = 0; x < static_cast(num_blocks_x); x++, block_index++) + { + const decoder_etc_block& src_block = pETC_Blocks[block_index]; + + const uint16_t* pSrc_alpha_block = reinterpret_cast(static_cast(pAlpha_blocks) + x + (y * num_blocks_x)); + const endpoint* pAlpha_endpoints = &pEndpoints[pSrc_alpha_block[0]]; + const selector* pAlpha_selectors = &pSelectors[pSrc_alpha_block[1]]; + + const uint32_t x_swizzle = (g_pvrtc_swizzle_table[x >> 8] << 17) | (g_pvrtc_swizzle_table[x & 0xFF] << 1); + + uint32_t swizzled = x_swizzle | y_swizzle; + if (num_blocks_x != num_blocks_y) + { + swizzled &= swizzle_mask; + + if (num_blocks_x > num_blocks_y) + swizzled |= ((x >> min_bits) << (min_bits * 2)); + else + swizzled |= ((y >> min_bits) << (min_bits * 2)); + } + + pvrtc4_block* pDst_block = static_cast(pDst_blocks) + swizzled; + pDst_block->m_endpoints = pPVRTC_endpoints[block_index]; + + uint32_t base_r = g_etc_5_to_8[src_block.m_differential.m_red1]; + uint32_t base_g = g_etc_5_to_8[src_block.m_differential.m_green1]; + uint32_t base_b = g_etc_5_to_8[src_block.m_differential.m_blue1]; + + const int* pInten_table48 = g_etc1_inten_tables48[src_block.m_differential.m_cw1]; + int by = (base_r + base_g + base_b) * 16; + int block_colors_y_x16[4]; + block_colors_y_x16[0] = basisu::clamp(by + pInten_table48[0], 0, 48 * 255); + block_colors_y_x16[1] = basisu::clamp(by + pInten_table48[1], 0, 48 * 255); + block_colors_y_x16[2] = basisu::clamp(by + pInten_table48[2], 0, 48 * 255); + block_colors_y_x16[3] = basisu::clamp(by + pInten_table48[3], 0, 48 * 255); + + uint32_t alpha_base_g = g_etc_5_to_8[pAlpha_endpoints->m_color5.g] * 16; + const int* pInten_table16 = g_etc1_inten_tables16[pAlpha_endpoints->m_inten5]; + int alpha_block_colors_x16[4]; + alpha_block_colors_x16[0] = basisu::clamp(alpha_base_g + pInten_table16[0], 0, 16 * 255); + alpha_block_colors_x16[1] = basisu::clamp(alpha_base_g + pInten_table16[1], 0, 16 * 255); + alpha_block_colors_x16[2] = basisu::clamp(alpha_base_g + pInten_table16[2], 0, 16 * 255); + alpha_block_colors_x16[3] = basisu::clamp(alpha_base_g + pInten_table16[3], 0, 16 * 255); + + // clamp((base_r + base_g + base_b) * 16 + color_inten[s] * 48) + clamp(alpha_base_g * 16 + alpha_inten[as] * 16) + + { + const uint32_t ex = 2; + int bx = x + ex - 1; + bx &= x_mask; + +#define DO_ROW(ey) \ + { \ + const uint32_t e = pE_rows[ey][bx]; \ + e0[ex][ey] = get_endpoint_l8(e, 0); \ + e1[ex][ey] = get_endpoint_l8(e, 1); \ + } + + DO_ROW(0); + DO_ROW(1); + DO_ROW(2); +#undef DO_ROW + } + + uint32_t mod = 0; + +#define DO_PIX(lx, ly, w0, w1, w2, w3) \ + { \ + int ca_l = a0 * w0 + a1 * w1 + a2 * w2 + a3 * w3; \ + int cb_l = b0 * w0 + b1 * w1 + b2 * w2 + b3 * w3; \ + int cl = block_colors_y_x16[(src_block.m_bytes[4 + ly] >> (lx * 2)) & 3] + alpha_block_colors_x16[(pAlpha_selectors->m_selectors[ly] >> (lx * 2)) & 3]; \ + int dl = cb_l - ca_l; \ + int vl = cl - ca_l; \ + int p = vl * 16; \ + if (ca_l > cb_l) { p = -p; dl = -dl; } \ + uint32_t m = 0; \ + if (p > 3 * dl) m = (uint32_t)(1 << ((ly) * 8 + (lx) * 2)); \ + if (p > 8 * dl) m = (uint32_t)(2 << ((ly) * 8 + (lx) * 2)); \ + if (p > 13 * dl) m = (uint32_t)(3 << ((ly) * 8 + (lx) * 2)); \ + mod |= m; \ + } + + { + const uint32_t ex = 0, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 0, 4, 4, 4, 4); + DO_PIX(1, 0, 2, 6, 2, 6); + DO_PIX(0, 1, 2, 2, 6, 6); + DO_PIX(1, 1, 1, 3, 3, 9); + } + + { + const uint32_t ex = 1, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 0, 8, 0, 8, 0); + DO_PIX(3, 0, 6, 2, 6, 2); + DO_PIX(2, 1, 4, 0, 12, 0); + DO_PIX(3, 1, 3, 1, 9, 3); + } + + { + const uint32_t ex = 0, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 2, 8, 8, 0, 0); + DO_PIX(1, 2, 4, 12, 0, 0); + DO_PIX(0, 3, 6, 6, 2, 2); + DO_PIX(1, 3, 3, 9, 1, 3); + } + + { + const uint32_t ex = 1, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 2, 16, 0, 0, 0); + DO_PIX(3, 2, 12, 4, 0, 0); + DO_PIX(2, 3, 12, 0, 4, 0); + DO_PIX(3, 3, 9, 3, 3, 1); + } +#undef DO_PIX + + pDst_block->m_modulation = mod; + + e0[0][0] = e0[1][0]; e0[1][0] = e0[2][0]; + e0[0][1] = e0[1][1]; e0[1][1] = e0[2][1]; + e0[0][2] = e0[1][2]; e0[1][2] = e0[2][2]; + + e1[0][0] = e1[1][0]; e1[1][0] = e1[2][0]; + e1[0][1] = e1[1][1]; e1[1][1] = e1[2][1]; + e1[0][2] = e1[1][2]; e1[1][2] = e1[2][2]; + + } // x + } // y + } +#endif // BASISD_SUPPORT_PVRTC1 + +#if BASISD_SUPPORT_BC7_MODE5 + static dxt_selector_range g_etc1_to_bc7_m5_selector_ranges[] = + { + { 0, 3 }, + { 1, 3 }, + { 0, 2 }, + { 1, 2 }, + { 2, 3 }, + { 0, 1 }, + }; + + const uint32_t NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES = sizeof(g_etc1_to_bc7_m5_selector_ranges) / sizeof(g_etc1_to_bc7_m5_selector_ranges[0]); + + static uint32_t g_etc1_to_bc7_m5_selector_range_index[4][4]; + + const uint32_t NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS = 10; + static const uint8_t g_etc1_to_bc7_m5_selector_mappings[NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS][4] = + { + { 0, 0, 1, 1 }, + { 0, 0, 1, 2 }, + { 0, 0, 1, 3 }, + { 0, 0, 2, 3 }, + { 0, 1, 1, 1 }, + { 0, 1, 2, 2 }, + { 0, 1, 2, 3 }, + { 0, 2, 3, 3 }, + { 1, 2, 2, 2 }, + { 1, 2, 3, 3 }, + }; + + struct etc1_to_bc7_m5_solution + { + uint8_t m_lo; + uint8_t m_hi; + uint16_t m_err; + }; + + static const etc1_to_bc7_m5_solution g_etc1_to_bc7_m5_color[32 * 8 * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS * NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES] = { +#include "basisu_transcoder_tables_bc7_m5_color.inc" + }; + + static dxt_selector_range g_etc1_to_bc7_m5a_selector_ranges[] = + { + { 0, 3 }, + { 1, 3 }, + { 0, 2 }, + { 1, 2 }, + { 2, 3 }, + { 0, 1 } + }; + + const uint32_t NUM_ETC1_TO_BC7_M5A_SELECTOR_RANGES = sizeof(g_etc1_to_bc7_m5a_selector_ranges) / sizeof(g_etc1_to_bc7_m5a_selector_ranges[0]); + + static uint32_t g_etc1_to_bc7_m5a_selector_range_index[4][4]; + + struct etc1_g_to_bc7_m5a_conversion + { + uint8_t m_lo, m_hi; + uint8_t m_trans; + }; + + static etc1_g_to_bc7_m5a_conversion g_etc1_g_to_bc7_m5a[8 * 32 * NUM_ETC1_TO_BC7_M5A_SELECTOR_RANGES] = + { + #include "basisu_transcoder_tables_bc7_m5_alpha.inc" + }; + + static inline uint32_t set_block_bits(uint8_t* pBytes, uint32_t val, uint32_t num_bits, uint32_t cur_ofs) + { + assert(num_bits < 32); + assert(val < (1ULL << num_bits)); + + uint32_t mask = static_cast((1ULL << num_bits) - 1); + + while (num_bits) + { + const uint32_t n = basisu::minimum(8 - (cur_ofs & 7), num_bits); + + pBytes[cur_ofs >> 3] &= ~static_cast(mask << (cur_ofs & 7)); + pBytes[cur_ofs >> 3] |= static_cast(val << (cur_ofs & 7)); + + val >>= n; + mask >>= n; + + num_bits -= n; + cur_ofs += n; + } + + return cur_ofs; + } + + struct bc7_mode_5 + { + union + { + struct + { + uint64_t m_mode : 6; + uint64_t m_rot : 2; + + uint64_t m_r0 : 7; + uint64_t m_r1 : 7; + uint64_t m_g0 : 7; + uint64_t m_g1 : 7; + uint64_t m_b0 : 7; + uint64_t m_b1 : 7; + uint64_t m_a0 : 8; + uint64_t m_a1_0 : 6; + + } m_lo; + + uint64_t m_lo_bits; + }; + + union + { + struct + { + uint64_t m_a1_1 : 2; + + // bit 2 + uint64_t m_c00 : 1; + uint64_t m_c10 : 2; + uint64_t m_c20 : 2; + uint64_t m_c30 : 2; + + uint64_t m_c01 : 2; + uint64_t m_c11 : 2; + uint64_t m_c21 : 2; + uint64_t m_c31 : 2; + + uint64_t m_c02 : 2; + uint64_t m_c12 : 2; + uint64_t m_c22 : 2; + uint64_t m_c32 : 2; + + uint64_t m_c03 : 2; + uint64_t m_c13 : 2; + uint64_t m_c23 : 2; + uint64_t m_c33 : 2; + + // bit 33 + uint64_t m_a00 : 1; + uint64_t m_a10 : 2; + uint64_t m_a20 : 2; + uint64_t m_a30 : 2; + + uint64_t m_a01 : 2; + uint64_t m_a11 : 2; + uint64_t m_a21 : 2; + uint64_t m_a31 : 2; + + uint64_t m_a02 : 2; + uint64_t m_a12 : 2; + uint64_t m_a22 : 2; + uint64_t m_a32 : 2; + + uint64_t m_a03 : 2; + uint64_t m_a13 : 2; + uint64_t m_a23 : 2; + uint64_t m_a33 : 2; + + } m_hi; + + uint64_t m_hi_bits; + }; + }; + +#if BASISD_WRITE_NEW_BC7_MODE5_TABLES + static void create_etc1_to_bc7_m5_color_conversion_table() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_bc7_m5_color.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1_to_bc7_m5_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1_to_bc7_m5_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 127; hi++) + { + for (uint32_t lo = 0; lo <= 127; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 1) | (lo >> 6); + colors[3] = (hi << 1) | (hi >> 6); + + colors[1] = (colors[0] * (64 - 21) + colors[3] * 21 + 32) / 64; + colors[2] = (colors[0] * (64 - 43) + colors[3] * 43 + 32) / 64; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1_to_bc7_m5_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); + } + + static void create_etc1_to_bc7_m5_alpha_conversion_table() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_bc7_m5_alpha.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1_TO_BC7_M5A_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1_to_bc7_m5a_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1_to_bc7_m5a_selector_ranges[sr].m_high; + + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + uint32_t best_output_selectors = 0; + + for (uint32_t hi = 0; hi <= 255; hi++) + { + for (uint32_t lo = 0; lo <= 255; lo++) + { + uint32_t colors[4]; + + colors[0] = lo; + colors[3] = hi; + + colors[1] = (colors[0] * (64 - 21) + colors[3] * 21 + 32) / 64; + colors[2] = (colors[0] * (64 - 43) + colors[3] * 43 + 32) / 64; + + uint64_t total_err = 0; + uint32_t output_selectors = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int best_mapping_err = INT_MAX; + int best_k = 0; + for (int k = 0; k < 4; k++) + { + int mapping_err = block_colors[s].g - colors[k]; + mapping_err *= mapping_err; + + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + mapping_err *= 5; + + if (mapping_err < best_mapping_err) + { + best_mapping_err = mapping_err; + best_k = k; + } + } // k + + total_err += best_mapping_err; + output_selectors |= (best_k << (s * 2)); + } // s + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + best_output_selectors = output_selectors; + } + + } // lo + } // hi + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, best_output_selectors); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + + } // sr + } // g + } // inten + + fclose(pFile); + } +#endif // BASISD_WRITE_NEW_BC7_MODE5_TABLES + + struct bc7_m5_match_entry + { + uint8_t m_hi; + uint8_t m_lo; + }; + + static bc7_m5_match_entry g_bc7_m5_equals_1[256] = + { + {0,0},{1,0},{3,0},{4,0},{6,0},{7,0},{9,0},{10,0},{12,0},{13,0},{15,0},{16,0},{18,0},{20,0},{21,0},{23,0}, + {24,0},{26,0},{27,0},{29,0},{30,0},{32,0},{33,0},{35,0},{36,0},{38,0},{39,0},{41,0},{42,0},{44,0},{45,0},{47,0}, + {48,0},{50,0},{52,0},{53,0},{55,0},{56,0},{58,0},{59,0},{61,0},{62,0},{64,0},{65,0},{66,0},{68,0},{69,0},{71,0}, + {72,0},{74,0},{75,0},{77,0},{78,0},{80,0},{82,0},{83,0},{85,0},{86,0},{88,0},{89,0},{91,0},{92,0},{94,0},{95,0}, + {97,0},{98,0},{100,0},{101,0},{103,0},{104,0},{106,0},{107,0},{109,0},{110,0},{112,0},{114,0},{115,0},{117,0},{118,0},{120,0}, + {121,0},{123,0},{124,0},{126,0},{127,0},{127,1},{126,2},{126,3},{127,3},{127,4},{126,5},{126,6},{127,6},{127,7},{126,8},{126,9}, + {127,9},{127,10},{126,11},{126,12},{127,12},{127,13},{126,14},{125,15},{127,15},{126,16},{126,17},{127,17},{127,18},{126,19},{126,20},{127,20}, + {127,21},{126,22},{126,23},{127,23},{127,24},{126,25},{126,26},{127,26},{127,27},{126,28},{126,29},{127,29},{127,30},{126,31},{126,32},{127,32}, + {127,33},{126,34},{126,35},{127,35},{127,36},{126,37},{126,38},{127,38},{127,39},{126,40},{126,41},{127,41},{127,42},{126,43},{126,44},{127,44}, + {127,45},{126,46},{125,47},{127,47},{126,48},{126,49},{127,49},{127,50},{126,51},{126,52},{127,52},{127,53},{126,54},{126,55},{127,55},{127,56}, + {126,57},{126,58},{127,58},{127,59},{126,60},{126,61},{127,61},{127,62},{126,63},{125,64},{126,64},{126,65},{127,65},{127,66},{126,67},{126,68}, + {127,68},{127,69},{126,70},{126,71},{127,71},{127,72},{126,73},{126,74},{127,74},{127,75},{126,76},{125,77},{127,77},{126,78},{126,79},{127,79}, + {127,80},{126,81},{126,82},{127,82},{127,83},{126,84},{126,85},{127,85},{127,86},{126,87},{126,88},{127,88},{127,89},{126,90},{126,91},{127,91}, + {127,92},{126,93},{126,94},{127,94},{127,95},{126,96},{126,97},{127,97},{127,98},{126,99},{126,100},{127,100},{127,101},{126,102},{126,103},{127,103}, + {127,104},{126,105},{126,106},{127,106},{127,107},{126,108},{125,109},{127,109},{126,110},{126,111},{127,111},{127,112},{126,113},{126,114},{127,114},{127,115}, + {126,116},{126,117},{127,117},{127,118},{126,119},{126,120},{127,120},{127,121},{126,122},{126,123},{127,123},{127,124},{126,125},{126,126},{127,126},{127,127} + }; + + static void transcoder_init_bc7_mode5() + { +#if 0 + // This is a little too much work to do at init time, so precompute it. + for (int i = 0; i < 256; i++) + { + int lowest_e = 256; + for (int lo = 0; lo < 128; lo++) + { + for (int hi = 0; hi < 128; hi++) + { + const int lo_e = (lo << 1) | (lo >> 6); + const int hi_e = (hi << 1) | (hi >> 6); + + // Selector 1 + int v = (lo_e * (64 - 21) + hi_e * 21 + 32) >> 6; + int e = abs(v - i); + + if (e < lowest_e) + { + g_bc7_m5_equals_1[i].m_hi = static_cast(hi); + g_bc7_m5_equals_1[i].m_lo = static_cast(lo); + + lowest_e = e; + } + + } // hi + + } // lo + + printf("{%u,%u},", g_bc7_m5_equals_1[i].m_hi, g_bc7_m5_equals_1[i].m_lo); + if ((i & 15) == 15) printf("\n"); + } +#endif + + for (uint32_t i = 0; i < NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES; i++) + { + uint32_t l = g_etc1_to_bc7_m5_selector_ranges[i].m_low; + uint32_t h = g_etc1_to_bc7_m5_selector_ranges[i].m_high; + g_etc1_to_bc7_m5_selector_range_index[l][h] = i; + } + + for (uint32_t i = 0; i < NUM_ETC1_TO_BC7_M5A_SELECTOR_RANGES; i++) + { + uint32_t l = g_etc1_to_bc7_m5a_selector_ranges[i].m_low; + uint32_t h = g_etc1_to_bc7_m5a_selector_ranges[i].m_high; + g_etc1_to_bc7_m5a_selector_range_index[l][h] = i; + } + } + + static void convert_etc1s_to_bc7_m5_color(void* pDst, const endpoint* pEndpoints, const selector* pSelector) + { + bc7_mode_5* pDst_block = static_cast(pDst); + + // First ensure the block is cleared to all 0's + static_cast(pDst)[0] = 0; + static_cast(pDst)[1] = 0; + + // Set alpha to 255 + pDst_block->m_lo.m_mode = 1 << 5; + pDst_block->m_lo.m_a0 = 255; + pDst_block->m_lo.m_a1_0 = 63; + pDst_block->m_hi.m_a1_1 = 3; + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const uint32_t base_color_r = pEndpoints->m_color5.r; + const uint32_t base_color_g = pEndpoints->m_color5.g; + const uint32_t base_color_b = pEndpoints->m_color5.b; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (pSelector->m_num_unique_selectors == 1) + { + // Solid color block - use precomputed tables and set selectors to 1. + uint32_t r, g, b; + decoder_etc_block::get_block_color5(pEndpoints->m_color5, inten_table, low_selector, r, g, b); + + pDst_block->m_lo.m_r0 = g_bc7_m5_equals_1[r].m_lo; + pDst_block->m_lo.m_g0 = g_bc7_m5_equals_1[g].m_lo; + pDst_block->m_lo.m_b0 = g_bc7_m5_equals_1[b].m_lo; + + pDst_block->m_lo.m_r1 = g_bc7_m5_equals_1[r].m_hi; + pDst_block->m_lo.m_g1 = g_bc7_m5_equals_1[g].m_hi; + pDst_block->m_lo.m_b1 = g_bc7_m5_equals_1[b].m_hi; + + set_block_bits((uint8_t*)pDst, 0x2aaaaaab, 31, 66); + return; + } + else if (pSelector->m_num_unique_selectors == 2) + { + // Only one or two unique selectors, so just switch to block truncation coding (BTC) to avoid quality issues on extreme blocks. + color32 block_colors[4]; + + decoder_etc_block::get_block_colors5(block_colors, color32(base_color_r, base_color_g, base_color_b, 255), inten_table); + + const uint32_t r0 = block_colors[low_selector].r; + const uint32_t g0 = block_colors[low_selector].g; + const uint32_t b0 = block_colors[low_selector].b; + + const uint32_t r1 = block_colors[high_selector].r; + const uint32_t g1 = block_colors[high_selector].g; + const uint32_t b1 = block_colors[high_selector].b; + + pDst_block->m_lo.m_r0 = r0 >> 1; + pDst_block->m_lo.m_g0 = g0 >> 1; + pDst_block->m_lo.m_b0 = b0 >> 1; + + pDst_block->m_lo.m_r1 = r1 >> 1; + pDst_block->m_lo.m_g1 = g1 >> 1; + pDst_block->m_lo.m_b1 = b1 >> 1; + + uint32_t output_low_selector = 0, output_bit_offset = 0, output_bits = 0; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + uint32_t os = (s == low_selector) ? output_low_selector : (3 ^ output_low_selector); + + uint32_t num_bits = 2; + + if ((x | y) == 0) + { + if (os & 2) + { + pDst_block->m_lo.m_r0 = r1 >> 1; + pDst_block->m_lo.m_g0 = g1 >> 1; + pDst_block->m_lo.m_b0 = b1 >> 1; + + pDst_block->m_lo.m_r1 = r0 >> 1; + pDst_block->m_lo.m_g1 = g0 >> 1; + pDst_block->m_lo.m_b1 = b0 >> 1; + + output_low_selector = 3; + os = 0; + } + + num_bits = 1; + } + + output_bits |= (os << output_bit_offset); + output_bit_offset += num_bits; + } + } + + set_block_bits((uint8_t*)pDst, output_bits, 31, 66); + return; + } + + const uint32_t selector_range_table = g_etc1_to_bc7_m5_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_bc7_m5_solution* pTable_r = &g_etc1_to_bc7_m5_color[(inten_table * 32 + base_color_r) * (NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS]; + const etc1_to_bc7_m5_solution* pTable_g = &g_etc1_to_bc7_m5_color[(inten_table * 32 + base_color_g) * (NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS]; + const etc1_to_bc7_m5_solution* pTable_b = &g_etc1_to_bc7_m5_color[(inten_table * 32 + base_color_b) * (NUM_ETC1_TO_BC7_M5_SELECTOR_RANGES * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS]; + + uint32_t best_err = UINT_MAX; + uint32_t best_mapping = 0; + + assert(NUM_ETC1_TO_BC7_M5_SELECTOR_MAPPINGS == 10); +#define DO_ITER(m) { uint32_t total_err = pTable_r[m].m_err + pTable_g[m].m_err + pTable_b[m].m_err; if (total_err < best_err) { best_err = total_err; best_mapping = m; } } + DO_ITER(0); DO_ITER(1); DO_ITER(2); DO_ITER(3); DO_ITER(4); + DO_ITER(5); DO_ITER(6); DO_ITER(7); DO_ITER(8); DO_ITER(9); +#undef DO_ITER + + const uint8_t* pSelectors_xlat = &g_etc1_to_bc7_m5_selector_mappings[best_mapping][0]; + + uint32_t s_inv = 0; + if (pSelectors_xlat[pSelector->get_selector(0, 0)] & 2) + { + pDst_block->m_lo.m_r0 = pTable_r[best_mapping].m_hi; + pDst_block->m_lo.m_g0 = pTable_g[best_mapping].m_hi; + pDst_block->m_lo.m_b0 = pTable_b[best_mapping].m_hi; + + pDst_block->m_lo.m_r1 = pTable_r[best_mapping].m_lo; + pDst_block->m_lo.m_g1 = pTable_g[best_mapping].m_lo; + pDst_block->m_lo.m_b1 = pTable_b[best_mapping].m_lo; + + s_inv = 3; + } + else + { + pDst_block->m_lo.m_r0 = pTable_r[best_mapping].m_lo; + pDst_block->m_lo.m_g0 = pTable_g[best_mapping].m_lo; + pDst_block->m_lo.m_b0 = pTable_b[best_mapping].m_lo; + + pDst_block->m_lo.m_r1 = pTable_r[best_mapping].m_hi; + pDst_block->m_lo.m_g1 = pTable_g[best_mapping].m_hi; + pDst_block->m_lo.m_b1 = pTable_b[best_mapping].m_hi; + } + + uint32_t output_bits = 0, output_bit_ofs = 0; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t s = pSelector->get_selector(x, y); + + const uint32_t os = pSelectors_xlat[s] ^ s_inv; + + output_bits |= (os << output_bit_ofs); + + output_bit_ofs += (((x | y) == 0) ? 1 : 2); + } + } + + set_block_bits((uint8_t*)pDst, output_bits, 31, 66); + } + + static void convert_etc1s_to_bc7_m5_alpha(void* pDst, const endpoint* pEndpoints, const selector* pSelector) + { + bc7_mode_5* pDst_block = static_cast(pDst); + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const uint32_t base_color_r = pEndpoints->m_color5.r; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (pSelector->m_num_unique_selectors == 1) + { + uint32_t r; + decoder_etc_block::get_block_color5_r(pEndpoints->m_color5, inten_table, low_selector, r); + + pDst_block->m_lo.m_a0 = r; + pDst_block->m_lo.m_a1_0 = r & 63; + pDst_block->m_hi.m_a1_1 = r >> 6; + + return; + } + else if (pSelector->m_num_unique_selectors == 2) + { + // Only one or two unique selectors, so just switch to block truncation coding (BTC) to avoid quality issues on extreme blocks. + int block_colors[4]; + + decoder_etc_block::get_block_colors5_g(block_colors, pEndpoints->m_color5, inten_table); + + pDst_block->m_lo.m_a0 = block_colors[low_selector]; + pDst_block->m_lo.m_a1_0 = block_colors[high_selector] & 63; + pDst_block->m_hi.m_a1_1 = block_colors[high_selector] >> 6; + + uint32_t output_low_selector = 0, output_bit_offset = 0, output_bits = 0; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t s = pSelector->get_selector(x, y); + uint32_t os = (s == low_selector) ? output_low_selector : (3 ^ output_low_selector); + + uint32_t num_bits = 2; + + if ((x | y) == 0) + { + if (os & 2) + { + pDst_block->m_lo.m_a0 = block_colors[high_selector]; + pDst_block->m_lo.m_a1_0 = block_colors[low_selector] & 63; + pDst_block->m_hi.m_a1_1 = block_colors[low_selector] >> 6; + + output_low_selector = 3; + os = 0; + } + + num_bits = 1; + } + + output_bits |= (os << output_bit_offset); + output_bit_offset += num_bits; + } + } + + set_block_bits((uint8_t*)pDst, output_bits, 31, 97); + return; + } + + const uint32_t selector_range_table = g_etc1_to_bc7_m5a_selector_range_index[low_selector][high_selector]; + + const etc1_g_to_bc7_m5a_conversion* pTable = &g_etc1_g_to_bc7_m5a[inten_table * (32 * NUM_ETC1_TO_BC7_M5A_SELECTOR_RANGES) + base_color_r * NUM_ETC1_TO_BC7_M5A_SELECTOR_RANGES + selector_range_table]; + + pDst_block->m_lo.m_a0 = pTable->m_lo; + pDst_block->m_lo.m_a1_0 = pTable->m_hi & 63; + pDst_block->m_hi.m_a1_1 = pTable->m_hi >> 6; + + uint32_t output_bit_offset = 0, output_bits = 0, selector_trans = pTable->m_trans; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t s = pSelector->get_selector(x, y); + uint32_t os = (selector_trans >> (s * 2)) & 3; + + uint32_t num_bits = 2; + + if ((x | y) == 0) + { + if (os & 2) + { + pDst_block->m_lo.m_a0 = pTable->m_hi; + pDst_block->m_lo.m_a1_0 = pTable->m_lo & 63; + pDst_block->m_hi.m_a1_1 = pTable->m_lo >> 6; + + selector_trans ^= 0xFF; + os ^= 3; + } + + num_bits = 1; + } + + output_bits |= (os << output_bit_offset); + output_bit_offset += num_bits; + } + } + + set_block_bits((uint8_t*)pDst, output_bits, 31, 97); + } +#endif // BASISD_SUPPORT_BC7_MODE5 + +#if BASISD_SUPPORT_ETC2_EAC_A8 || BASISD_SUPPORT_UASTC + static const uint8_t g_etc2_eac_a8_sel4[6] = { 0x92, 0x49, 0x24, 0x92, 0x49, 0x24 }; +#endif + +#if BASISD_SUPPORT_ETC2_EAC_A8 + static void convert_etc1s_to_etc2_eac_a8(eac_block* pDst_block, const endpoint* pEndpoints, const selector* pSelector) + { + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (low_selector == high_selector) + { + uint32_t r; + decoder_etc_block::get_block_color5_r(base_color, inten_table, low_selector, r); + + // Constant alpha block + // Select table 13, use selector 4 (0), set multiplier to 1 and base color g + pDst_block->m_base = r; + pDst_block->m_table = 13; + pDst_block->m_multiplier = 1; + + // selectors are all 4's + memcpy(pDst_block->m_selectors, g_etc2_eac_a8_sel4, sizeof(g_etc2_eac_a8_sel4)); + + return; + } + + uint32_t selector_range_table = 0; + for (selector_range_table = 0; selector_range_table < NUM_ETC2_EAC_SELECTOR_RANGES; selector_range_table++) + if ((low_selector == s_etc2_eac_selector_ranges[selector_range_table].m_low) && (high_selector == s_etc2_eac_selector_ranges[selector_range_table].m_high)) + break; + if (selector_range_table >= NUM_ETC2_EAC_SELECTOR_RANGES) + selector_range_table = 0; + + const etc1_g_to_eac_conversion* pTable_entry = &s_etc1_g_to_etc2_a8[base_color.r + inten_table * 32][selector_range_table]; + + pDst_block->m_base = pTable_entry->m_base; + pDst_block->m_table = pTable_entry->m_table_mul >> 4; + pDst_block->m_multiplier = pTable_entry->m_table_mul & 15; + + uint64_t selector_bits = 0; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + + uint32_t ds = (pTable_entry->m_trans >> (s * 3)) & 7; + + const uint32_t dst_ofs = 45 - (y + x * 4) * 3; + selector_bits |= (static_cast(ds) << dst_ofs); + } + } + + pDst_block->set_selector_bits(selector_bits); + } +#endif // BASISD_SUPPORT_ETC2_EAC_A8 + +#if BASISD_SUPPORT_ETC2_EAC_RG11 + static const etc1_g_to_eac_conversion s_etc1_g_to_etc2_r11[32 * 8][NUM_ETC2_EAC_SELECTOR_RANGES] = + { + {{0,1,3328},{0,1,3328},{0,16,457},{0,16,456}}, + {{0,226,3936},{0,226,3936},{0,17,424},{8,0,472}}, + {{6,178,4012},{6,178,4008},{0,146,501},{16,0,472}}, + {{14,178,4012},{14,178,4008},{8,146,501},{24,0,472}}, + {{23,178,4012},{23,178,4008},{17,146,501},{33,0,472}}, + {{31,178,4012},{31,178,4008},{25,146,501},{41,0,472}}, + {{39,178,4012},{39,178,4008},{33,146,501},{49,0,472}}, + {{47,178,4012},{47,178,4008},{41,146,501},{27,228,496}}, + {{56,178,4012},{56,178,4008},{50,146,501},{36,228,496}}, + {{64,178,4012},{64,178,4008},{58,146,501},{44,228,496}}, + {{72,178,4012},{72,178,4008},{66,146,501},{52,228,496}}, + {{80,178,4012},{80,178,4008},{74,146,501},{60,228,496}}, + {{89,178,4012},{89,178,4008},{83,146,501},{69,228,496}}, + {{97,178,4012},{97,178,4008},{91,146,501},{77,228,496}}, + {{105,178,4012},{105,178,4008},{99,146,501},{85,228,496}}, + {{113,178,4012},{113,178,4008},{107,146,501},{93,228,496}}, + {{122,178,4012},{122,178,4008},{116,146,501},{102,228,496}}, + {{130,178,4012},{130,178,4008},{124,146,501},{110,228,496}}, + {{138,178,4012},{138,178,4008},{132,146,501},{118,228,496}}, + {{146,178,4012},{146,178,4008},{140,146,501},{126,228,496}}, + {{155,178,4012},{155,178,4008},{149,146,501},{135,228,496}}, + {{163,178,4012},{163,178,4008},{157,146,501},{143,228,496}}, + {{171,178,4012},{171,178,4008},{165,146,501},{151,228,496}}, + {{179,178,4012},{179,178,4008},{173,146,501},{159,228,496}}, + {{188,178,4012},{188,178,4008},{182,146,501},{168,228,496}}, + {{196,178,4012},{196,178,4008},{190,146,501},{176,228,496}}, + {{204,178,4012},{204,178,4008},{198,146,501},{184,228,496}}, + {{212,178,4012},{212,178,4008},{206,146,501},{192,228,496}}, + {{221,178,4012},{221,178,4008},{215,146,501},{201,228,496}}, + {{229,178,4012},{229,178,4008},{223,146,501},{209,228,496}}, + {{235,66,4012},{221,100,4008},{231,146,501},{217,228,496}}, + {{211,102,4085},{254,32,4040},{211,102,501},{254,32,456}}, + {{0,2,3328},{0,2,3328},{0,1,320},{0,1,320}}, + {{7,162,3905},{7,162,3904},{0,17,480},{0,17,480}}, + {{15,162,3906},{15,162,3904},{1,117,352},{1,117,352}}, + {{23,162,3906},{23,162,3904},{5,34,500},{4,53,424}}, + {{32,162,3906},{32,162,3904},{14,34,500},{3,69,424}}, + {{40,162,3906},{40,162,3904},{22,34,500},{1,133,496}}, + {{48,162,3906},{48,162,3904},{30,34,500},{4,85,496}}, + {{56,162,3906},{56,162,3904},{38,34,500},{12,85,496}}, + {{65,162,3906},{65,162,3904},{47,34,500},{1,106,424}}, + {{73,162,3906},{73,162,3904},{55,34,500},{9,106,424}}, + {{81,162,3906},{81,162,3904},{63,34,500},{7,234,496}}, + {{89,162,3906},{89,162,3904},{71,34,500},{15,234,496}}, + {{98,162,3906},{98,162,3904},{80,34,500},{24,234,496}}, + {{106,162,3906},{106,162,3904},{88,34,500},{32,234,496}}, + {{114,162,3906},{114,162,3904},{96,34,500},{40,234,496}}, + {{122,162,3906},{122,162,3904},{104,34,500},{48,234,496}}, + {{131,162,3906},{131,162,3904},{113,34,500},{57,234,496}}, + {{139,162,3906},{139,162,3904},{121,34,500},{65,234,496}}, + {{147,162,3906},{147,162,3904},{129,34,500},{73,234,496}}, + {{155,162,3906},{155,162,3904},{137,34,500},{81,234,496}}, + {{164,162,3906},{164,162,3904},{146,34,500},{90,234,496}}, + {{172,162,3906},{172,162,3904},{154,34,500},{98,234,496}}, + {{180,162,3906},{180,162,3904},{162,34,500},{106,234,496}}, + {{188,162,3906},{188,162,3904},{170,34,500},{114,234,496}}, + {{197,162,3906},{197,162,3904},{179,34,500},{123,234,496}}, + {{205,162,3906},{205,162,3904},{187,34,500},{131,234,496}}, + {{213,162,3906},{213,162,3904},{195,34,500},{139,234,496}}, + {{221,162,3906},{221,162,3904},{203,34,500},{147,234,496}}, + {{230,162,3906},{230,162,3904},{212,34,500},{156,234,496}}, + {{238,162,3906},{174,106,4008},{220,34,500},{164,234,496}}, + {{240,178,4001},{182,106,4008},{228,34,500},{172,234,496}}, + {{166,108,4085},{115,31,4080},{166,108,501},{115,31,496}}, + {{1,68,3328},{1,68,3328},{0,1,384},{0,1,384}}, + {{1,51,3968},{1,51,3968},{0,2,384},{0,2,384}}, + {{21,18,3851},{21,18,3848},{1,50,488},{1,50,488}}, + {{26,195,3851},{29,18,3848},{0,67,488},{0,67,488}}, + {{35,195,3851},{38,18,3848},{12,115,488},{0,3,496}}, + {{43,195,3851},{46,18,3848},{20,115,488},{2,6,424}}, + {{51,195,3851},{54,18,3848},{36,66,482},{4,22,424}}, + {{59,195,3851},{62,18,3848},{44,66,482},{3,73,424}}, + {{68,195,3851},{71,18,3848},{53,66,482},{3,22,496}}, + {{76,195,3851},{79,18,3848},{61,66,482},{2,137,496}}, + {{84,195,3851},{87,18,3848},{69,66,482},{1,89,496}}, + {{92,195,3851},{95,18,3848},{77,66,482},{9,89,496}}, + {{101,195,3851},{104,18,3848},{86,66,482},{18,89,496}}, + {{109,195,3851},{112,18,3848},{94,66,482},{26,89,496}}, + {{117,195,3851},{120,18,3848},{102,66,482},{34,89,496}}, + {{125,195,3851},{128,18,3848},{110,66,482},{42,89,496}}, + {{134,195,3851},{137,18,3848},{119,66,482},{51,89,496}}, + {{141,195,3907},{145,18,3848},{127,66,482},{59,89,496}}, + {{149,195,3907},{153,18,3848},{135,66,482},{67,89,496}}, + {{157,195,3907},{161,18,3848},{143,66,482},{75,89,496}}, + {{166,195,3907},{170,18,3848},{152,66,482},{84,89,496}}, + {{174,195,3907},{178,18,3848},{160,66,482},{92,89,496}}, + {{182,195,3907},{186,18,3848},{168,66,482},{100,89,496}}, + {{190,195,3907},{194,18,3848},{176,66,482},{108,89,496}}, + {{199,195,3907},{203,18,3848},{185,66,482},{117,89,496}}, + {{207,195,3907},{211,18,3848},{193,66,482},{125,89,496}}, + {{215,195,3907},{219,18,3848},{201,66,482},{133,89,496}}, + {{223,195,3907},{227,18,3848},{209,66,482},{141,89,496}}, + {{232,195,3907},{168,89,4008},{218,66,482},{150,89,496}}, + {{236,18,3907},{176,89,4008},{226,66,482},{158,89,496}}, + {{158,90,4085},{103,31,4080},{158,90,501},{103,31,496}}, + {{166,90,4085},{111,31,4080},{166,90,501},{111,31,496}}, + {{0,70,3328},{0,70,3328},{0,17,448},{0,17,448}}, + {{0,117,3904},{0,117,3904},{0,35,384},{0,35,384}}, + {{13,165,3905},{13,165,3904},{2,211,480},{2,211,480}}, + {{21,165,3906},{21,165,3904},{1,51,488},{1,51,488}}, + {{30,165,3906},{30,165,3904},{7,61,352},{7,61,352}}, + {{38,165,3906},{38,165,3904},{2,125,352},{2,125,352}}, + {{46,165,3906},{46,165,3904},{1,37,500},{10,125,352}}, + {{54,165,3906},{54,165,3904},{9,37,500},{5,61,424}}, + {{63,165,3906},{63,165,3904},{18,37,500},{1,189,424}}, + {{71,165,3906},{71,165,3904},{26,37,500},{9,189,424}}, + {{79,165,3906},{79,165,3904},{34,37,500},{4,77,424}}, + {{87,165,3906},{87,165,3904},{42,37,500},{12,77,424}}, + {{96,165,3906},{96,165,3904},{51,37,500},{8,93,424}}, + {{104,165,3906},{104,165,3904},{59,37,500},{3,141,496}}, + {{112,165,3906},{112,165,3904},{68,37,500},{11,141,496}}, + {{120,165,3906},{120,165,3904},{76,37,500},{6,93,496}}, + {{129,165,3906},{129,165,3904},{85,37,500},{15,93,496}}, + {{70,254,4012},{137,165,3904},{93,37,500},{23,93,496}}, + {{145,165,3906},{145,165,3904},{101,37,500},{31,93,496}}, + {{86,254,4012},{153,165,3904},{109,37,500},{39,93,496}}, + {{163,165,3906},{162,165,3904},{118,37,500},{48,93,496}}, + {{171,165,3906},{170,165,3904},{126,37,500},{56,93,496}}, + {{179,165,3906},{178,165,3904},{134,37,500},{64,93,496}}, + {{187,165,3906},{187,165,3904},{142,37,500},{72,93,496}}, + {{196,165,3906},{196,165,3904},{151,37,500},{81,93,496}}, + {{204,165,3906},{204,165,3904},{159,37,500},{89,93,496}}, + {{212,165,3906},{136,77,4008},{167,37,500},{97,93,496}}, + {{220,165,3906},{131,93,4008},{175,37,500},{105,93,496}}, + {{214,181,4001},{140,93,4008},{184,37,500},{114,93,496}}, + {{222,181,4001},{148,93,4008},{192,37,500},{122,93,496}}, + {{115,95,4085},{99,31,4080},{115,95,501},{99,31,496}}, + {{123,95,4085},{107,31,4080},{123,95,501},{107,31,496}}, + {{0,102,3840},{0,102,3840},{0,18,384},{0,18,384}}, + {{5,167,3904},{5,167,3904},{0,13,256},{0,13,256}}, + {{4,54,3968},{4,54,3968},{1,67,448},{1,67,448}}, + {{30,198,3850},{30,198,3848},{0,3,480},{0,3,480}}, + {{39,198,3850},{39,198,3848},{3,52,488},{3,52,488}}, + {{47,198,3851},{47,198,3848},{3,4,488},{3,4,488}}, + {{55,198,3851},{55,198,3848},{1,70,488},{1,70,488}}, + {{53,167,3906},{63,198,3848},{3,22,488},{3,22,488}}, + {{62,167,3906},{72,198,3848},{24,118,488},{0,6,496}}, + {{70,167,3906},{80,198,3848},{32,118,488},{2,89,488}}, + {{78,167,3906},{88,198,3848},{40,118,488},{1,73,496}}, + {{86,167,3906},{96,198,3848},{48,118,488},{0,28,424}}, + {{95,167,3906},{105,198,3848},{57,118,488},{9,28,424}}, + {{103,167,3906},{113,198,3848},{65,118,488},{5,108,496}}, + {{111,167,3906},{121,198,3848},{73,118,488},{13,108,496}}, + {{119,167,3906},{129,198,3848},{81,118,488},{21,108,496}}, + {{128,167,3906},{138,198,3848},{90,118,488},{6,28,496}}, + {{136,167,3906},{146,198,3848},{98,118,488},{14,28,496}}, + {{145,167,3906},{154,198,3848},{106,118,488},{22,28,496}}, + {{153,167,3906},{162,198,3848},{114,118,488},{30,28,496}}, + {{162,167,3906},{171,198,3848},{123,118,488},{39,28,496}}, + {{170,167,3906},{179,198,3848},{131,118,488},{47,28,496}}, + {{178,167,3906},{187,198,3848},{139,118,488},{55,28,496}}, + {{186,167,3906},{195,198,3848},{147,118,488},{63,28,496}}, + {{194,167,3906},{120,12,4008},{156,118,488},{72,28,496}}, + {{206,198,3907},{116,28,4008},{164,118,488},{80,28,496}}, + {{214,198,3907},{124,28,4008},{172,118,488},{88,28,496}}, + {{222,198,3395},{132,28,4008},{180,118,488},{96,28,496}}, + {{207,134,4001},{141,28,4008},{189,118,488},{105,28,496}}, + {{95,30,4085},{86,31,4080},{95,30,501},{86,31,496}}, + {{103,30,4085},{94,31,4080},{103,30,501},{94,31,496}}, + {{111,30,4085},{102,31,4080},{111,30,501},{102,31,496}}, + {{0,104,3840},{0,104,3840},{0,18,448},{0,18,448}}, + {{4,39,3904},{4,39,3904},{0,4,384},{0,4,384}}, + {{0,56,3968},{0,56,3968},{0,84,448},{0,84,448}}, + {{6,110,3328},{6,110,3328},{0,20,448},{0,20,448}}, + {{41,200,3850},{41,200,3848},{1,4,480},{1,4,480}}, + {{49,200,3850},{49,200,3848},{1,8,416},{1,8,416}}, + {{57,200,3851},{57,200,3848},{1,38,488},{1,38,488}}, + {{65,200,3851},{65,200,3848},{1,120,488},{1,120,488}}, + {{74,200,3851},{74,200,3848},{2,72,488},{2,72,488}}, + {{68,6,3907},{82,200,3848},{2,24,488},{2,24,488}}, + {{77,6,3907},{90,200,3848},{26,120,488},{10,24,488}}, + {{97,63,3330},{98,200,3848},{34,120,488},{2,8,496}}, + {{106,63,3330},{107,200,3848},{43,120,488},{3,92,488}}, + {{114,63,3330},{115,200,3848},{51,120,488},{11,92,488}}, + {{122,63,3330},{123,200,3848},{59,120,488},{7,76,496}}, + {{130,63,3330},{131,200,3848},{67,120,488},{15,76,496}}, + {{139,63,3330},{140,200,3848},{76,120,488},{24,76,496}}, + {{147,63,3330},{148,200,3848},{84,120,488},{32,76,496}}, + {{155,63,3330},{156,200,3848},{92,120,488},{40,76,496}}, + {{164,63,3330},{164,200,3848},{100,120,488},{48,76,496}}, + {{173,63,3330},{173,200,3848},{109,120,488},{57,76,496}}, + {{184,6,3851},{181,200,3848},{117,120,488},{65,76,496}}, + {{192,6,3851},{133,28,3936},{125,120,488},{73,76,496}}, + {{189,200,3907},{141,28,3936},{133,120,488},{81,76,496}}, + {{198,200,3907},{138,108,4000},{142,120,488},{90,76,496}}, + {{206,200,3907},{146,108,4000},{150,120,488},{98,76,496}}, + {{214,200,3395},{154,108,4000},{158,120,488},{106,76,496}}, + {{190,136,4001},{162,108,4000},{166,120,488},{114,76,496}}, + {{123,30,4076},{87,15,4080},{123,30,492},{87,15,496}}, + {{117,110,4084},{80,31,4080},{117,110,500},{80,31,496}}, + {{125,110,4084},{88,31,4080},{125,110,500},{88,31,496}}, + {{133,110,4084},{96,31,4080},{133,110,500},{96,31,496}}, + {{9,56,3904},{9,56,3904},{0,67,448},{0,67,448}}, + {{1,8,3904},{1,8,3904},{1,84,448},{1,84,448}}, + {{1,124,3904},{1,124,3904},{0,39,384},{0,39,384}}, + {{9,124,3904},{9,124,3904},{1,4,448},{1,4,448}}, + {{6,76,3904},{6,76,3904},{0,70,448},{0,70,448}}, + {{62,6,3859},{62,6,3856},{2,38,480},{2,38,480}}, + {{70,6,3859},{70,6,3856},{5,43,416},{5,43,416}}, + {{78,6,3859},{78,6,3856},{2,11,416},{2,11,416}}, + {{87,6,3859},{87,6,3856},{0,171,488},{0,171,488}}, + {{67,8,3906},{95,6,3856},{8,171,488},{8,171,488}}, + {{75,8,3907},{103,6,3856},{5,123,488},{5,123,488}}, + {{83,8,3907},{111,6,3856},{2,75,488},{2,75,488}}, + {{92,8,3907},{120,6,3856},{0,27,488},{0,27,488}}, + {{100,8,3907},{128,6,3856},{8,27,488},{8,27,488}}, + {{120,106,3843},{136,6,3856},{99,6,387},{16,27,488}}, + {{128,106,3843},{144,6,3856},{107,6,387},{2,11,496}}, + {{137,106,3843},{153,6,3856},{117,6,387},{11,11,496}}, + {{145,106,3843},{161,6,3856},{125,6,387},{19,11,496}}, + {{163,8,3851},{137,43,3904},{133,6,387},{27,11,496}}, + {{171,8,3851},{145,43,3904},{141,6,387},{35,11,496}}, + {{180,8,3851},{110,11,4000},{150,6,387},{44,11,496}}, + {{188,8,3851},{118,11,4000},{158,6,387},{52,11,496}}, + {{172,72,3907},{126,11,4000},{166,6,387},{60,11,496}}, + {{174,6,3971},{134,11,4000},{174,6,387},{68,11,496}}, + {{183,6,3971},{143,11,4000},{183,6,387},{77,11,496}}, + {{191,6,3971},{151,11,4000},{191,6,387},{85,11,496}}, + {{199,6,3971},{159,11,4000},{199,6,387},{93,11,496}}, + {{92,12,4084},{69,15,4080},{92,12,500},{69,15,496}}, + {{101,12,4084},{78,15,4080},{101,12,500},{78,15,496}}, + {{110,12,4084},{86,15,4080},{110,12,500},{86,15,496}}, + {{118,12,4084},{79,31,4080},{118,12,500},{79,31,496}}, + {{126,12,4084},{87,31,4080},{126,12,500},{87,31,496}}, + {{71,8,3602},{71,8,3600},{2,21,384},{2,21,384}}, + {{79,8,3611},{79,8,3608},{0,69,448},{0,69,448}}, + {{87,8,3611},{87,8,3608},{0,23,384},{0,23,384}}, + {{95,8,3611},{95,8,3608},{1,5,448},{1,5,448}}, + {{104,8,3611},{104,8,3608},{0,88,448},{0,88,448}}, + {{112,8,3611},{112,8,3608},{0,72,448},{0,72,448}}, + {{120,8,3611},{121,8,3608},{36,21,458},{36,21,456}}, + {{133,47,3091},{129,8,3608},{44,21,458},{44,21,456}}, + {{142,47,3091},{138,8,3608},{53,21,459},{53,21,456}}, + {{98,12,3850},{98,12,3848},{61,21,459},{61,21,456}}, + {{106,12,3850},{106,12,3848},{10,92,480},{69,21,456}}, + {{114,12,3851},{114,12,3848},{18,92,480},{77,21,456}}, + {{123,12,3851},{123,12,3848},{3,44,488},{86,21,456}}, + {{95,12,3906},{95,12,3904},{11,44,488},{94,21,456}}, + {{103,12,3906},{103,12,3904},{19,44,488},{102,21,456}}, + {{111,12,3907},{111,12,3904},{27,44,489},{110,21,456}}, + {{120,12,3907},{120,12,3904},{36,44,489},{119,21,456}}, + {{128,12,3907},{128,12,3904},{44,44,489},{127,21,456}}, + {{136,12,3907},{136,12,3904},{52,44,489},{135,21,456}}, + {{144,12,3907},{144,12,3904},{60,44,490},{144,21,456}}, + {{153,12,3907},{153,12,3904},{69,44,490},{153,21,456}}, + {{161,12,3395},{149,188,3968},{77,44,490},{161,21,456}}, + {{169,12,3395},{199,21,3928},{85,44,490},{169,21,456}}, + {{113,95,4001},{202,69,3992},{125,8,483},{177,21,456}}, + {{122,95,4001},{201,21,3984},{134,8,483},{186,21,456}}, + {{143,8,4067},{209,21,3984},{142,8,483},{194,21,456}}, + {{151,8,4067},{47,15,4080},{151,8,483},{47,15,496}}, + {{159,8,4067},{55,15,4080},{159,8,483},{55,15,496}}, + {{168,8,4067},{64,15,4080},{168,8,483},{64,15,496}}, + {{160,40,4075},{72,15,4080},{160,40,491},{72,15,496}}, + {{168,40,4075},{80,15,4080},{168,40,491},{80,15,496}}, + {{144,8,4082},{88,15,4080},{144,8,498},{88,15,496}}, + }; + + static void convert_etc1s_to_etc2_eac_r11(eac_block* pDst_block, const endpoint* pEndpoints, const selector* pSelector) + { + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (low_selector == high_selector) + { + uint32_t r; + decoder_etc_block::get_block_color5_r(base_color, inten_table, low_selector, r); + + // Constant alpha block + // Select table 13, use selector 4 (0), set multiplier to 1 and base color r + pDst_block->m_base = r; + pDst_block->m_table = 13; + pDst_block->m_multiplier = 1; + + // selectors are all 4's + static const uint8_t s_etc2_eac_r11_sel4[6] = { 0x92, 0x49, 0x24, 0x92, 0x49, 0x24 }; + memcpy(pDst_block->m_selectors, s_etc2_eac_r11_sel4, sizeof(s_etc2_eac_r11_sel4)); + + return; + } + + uint32_t selector_range_table = 0; + for (selector_range_table = 0; selector_range_table < NUM_ETC2_EAC_SELECTOR_RANGES; selector_range_table++) + if ((low_selector == s_etc2_eac_selector_ranges[selector_range_table].m_low) && (high_selector == s_etc2_eac_selector_ranges[selector_range_table].m_high)) + break; + if (selector_range_table >= NUM_ETC2_EAC_SELECTOR_RANGES) + selector_range_table = 0; + + const etc1_g_to_eac_conversion* pTable_entry = &s_etc1_g_to_etc2_r11[base_color.r + inten_table * 32][selector_range_table]; + + pDst_block->m_base = pTable_entry->m_base; + pDst_block->m_table = pTable_entry->m_table_mul >> 4; + pDst_block->m_multiplier = pTable_entry->m_table_mul & 15; + + uint64_t selector_bits = 0; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + + uint32_t ds = (pTable_entry->m_trans >> (s * 3)) & 7; + + const uint32_t dst_ofs = 45 - (y + x * 4) * 3; + selector_bits |= (static_cast(ds) << dst_ofs); + } + } + + pDst_block->set_selector_bits(selector_bits); + } +#endif // BASISD_SUPPORT_ETC2_EAC_RG11 + +// ASTC + struct etc1_to_astc_solution + { + uint8_t m_lo; + uint8_t m_hi; + uint16_t m_err; + }; + +#if BASISD_SUPPORT_ASTC + static dxt_selector_range g_etc1_to_astc_selector_ranges[] = + { + { 0, 3 }, + + { 1, 3 }, + { 0, 2 }, + + { 1, 2 }, + + { 2, 3 }, + { 0, 1 }, + }; + + const uint32_t NUM_ETC1_TO_ASTC_SELECTOR_RANGES = sizeof(g_etc1_to_astc_selector_ranges) / sizeof(g_etc1_to_astc_selector_ranges[0]); + + static uint32_t g_etc1_to_astc_selector_range_index[4][4]; + + const uint32_t NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS = 10; + static const uint8_t g_etc1_to_astc_selector_mappings[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS][4] = + { + { 0, 0, 1, 1 }, + { 0, 0, 1, 2 }, + { 0, 0, 1, 3 }, + { 0, 0, 2, 3 }, + { 0, 1, 1, 1 }, + { 0, 1, 2, 2 }, + { 0, 1, 2, 3 }, + { 0, 2, 3, 3 }, + { 1, 2, 2, 2 }, + { 1, 2, 3, 3 }, + }; + + static const etc1_to_astc_solution g_etc1_to_astc[32 * 8 * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS * NUM_ETC1_TO_ASTC_SELECTOR_RANGES] = { +#include "basisu_transcoder_tables_astc.inc" + }; + + // The best selector mapping to use given a base base+inten table and used selector range for converting grayscale data. + static uint8_t g_etc1_to_astc_best_grayscale_mapping[32][8][NUM_ETC1_TO_ASTC_SELECTOR_RANGES]; + +#if BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + static const etc1_to_astc_solution g_etc1_to_astc_0_255[32 * 8 * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS * NUM_ETC1_TO_ASTC_SELECTOR_RANGES] = { +#include "basisu_transcoder_tables_astc_0_255.inc" + }; + static uint8_t g_etc1_to_astc_best_grayscale_mapping_0_255[32][8][NUM_ETC1_TO_ASTC_SELECTOR_RANGES]; +#endif + + static uint32_t g_ise_to_unquant[48]; + +#if BASISD_WRITE_NEW_ASTC_TABLES + static void create_etc1_to_astc_conversion_table_0_47() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_astc.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1_TO_ASTC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1_to_astc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1_to_astc_selector_ranges[sr].m_high; + + uint32_t mapping_best_low[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + uint32_t mapping_best_high[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + uint64_t mapping_best_err[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + uint64_t highest_best_err = 0; + + for (uint32_t m = 0; m < NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 47; hi++) + { + for (uint32_t lo = 0; lo <= 47; lo++) + { + uint32_t colors[4]; + + for (uint32_t s = 0; s < 4; s++) + { + uint32_t s_scaled = s | (s << 2) | (s << 4); + if (s_scaled > 32) + s_scaled++; + + uint32_t c0 = g_ise_to_unquant[lo] | (g_ise_to_unquant[lo] << 8); + uint32_t c1 = g_ise_to_unquant[hi] | (g_ise_to_unquant[hi] << 8); + colors[s] = ((c0 * (64 - s_scaled) + c1 * s_scaled + 32) / 64) >> 8; + } + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1_to_astc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 8; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + mapping_best_low[m] = best_lo; + mapping_best_high[m] = best_hi; + mapping_best_err[m] = best_err; + highest_best_err = basisu::maximum(highest_best_err, best_err); + + } // m + + for (uint32_t m = 0; m < NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS; m++) + { + uint64_t err = mapping_best_err[m]; + + err = basisu::minimum(err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", mapping_best_low[m], mapping_best_high[m], (uint32_t)err); + + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + + } // sr + } // g + } // inten + + fclose(pFile); + } + + static void create_etc1_to_astc_conversion_table_0_255() + { + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_astc_0_255.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1_TO_ASTC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1_to_astc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1_to_astc_selector_ranges[sr].m_high; + + uint32_t mapping_best_low[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + uint32_t mapping_best_high[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + uint64_t mapping_best_err[NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + uint64_t highest_best_err = 0; + + for (uint32_t m = 0; m < NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 255; hi++) + { + for (uint32_t lo = 0; lo <= 255; lo++) + { + uint32_t colors[4]; + + for (uint32_t s = 0; s < 4; s++) + { + uint32_t s_scaled = s | (s << 2) | (s << 4); + if (s_scaled > 32) + s_scaled++; + + uint32_t c0 = lo | (lo << 8); + uint32_t c1 = hi | (hi << 8); + colors[s] = ((c0 * (64 - s_scaled) + c1 * s_scaled + 32) / 64) >> 8; + } + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1_to_astc_selector_mappings[m][s]]; + + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + int err_scale = 1; + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 8; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + mapping_best_low[m] = best_lo; + mapping_best_high[m] = best_hi; + mapping_best_err[m] = best_err; + highest_best_err = basisu::maximum(highest_best_err, best_err); + } // m + + for (uint32_t m = 0; m < NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS; m++) + { + uint64_t err = mapping_best_err[m]; + + err = basisu::minimum(err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", mapping_best_low[m], mapping_best_high[m], (uint32_t)err); + + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + + } // sr + } // g + } // inten + + fclose(pFile); + } +#endif + +#endif + +#if BASISD_SUPPORT_UASTC || BASISD_SUPPORT_ASTC + // Table encodes 5 trits to 8 output bits. 3^5 entries. + // Inverse of the trit bit manipulation process in https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#astc-integer-sequence-encoding + static const uint8_t g_astc_trit_encode[243] = { 0, 1, 2, 4, 5, 6, 8, 9, 10, 16, 17, 18, 20, 21, 22, 24, 25, 26, 3, 7, 11, 19, 23, 27, 12, 13, 14, 32, 33, 34, 36, 37, 38, 40, 41, 42, 48, 49, 50, 52, 53, 54, 56, 57, 58, 35, 39, + 43, 51, 55, 59, 44, 45, 46, 64, 65, 66, 68, 69, 70, 72, 73, 74, 80, 81, 82, 84, 85, 86, 88, 89, 90, 67, 71, 75, 83, 87, 91, 76, 77, 78, 128, 129, 130, 132, 133, 134, 136, 137, 138, 144, 145, 146, 148, 149, 150, 152, 153, 154, + 131, 135, 139, 147, 151, 155, 140, 141, 142, 160, 161, 162, 164, 165, 166, 168, 169, 170, 176, 177, 178, 180, 181, 182, 184, 185, 186, 163, 167, 171, 179, 183, 187, 172, 173, 174, 192, 193, 194, 196, 197, 198, 200, 201, 202, + 208, 209, 210, 212, 213, 214, 216, 217, 218, 195, 199, 203, 211, 215, 219, 204, 205, 206, 96, 97, 98, 100, 101, 102, 104, 105, 106, 112, 113, 114, 116, 117, 118, 120, 121, 122, 99, 103, 107, 115, 119, 123, 108, 109, 110, 224, + 225, 226, 228, 229, 230, 232, 233, 234, 240, 241, 242, 244, 245, 246, 248, 249, 250, 227, 231, 235, 243, 247, 251, 236, 237, 238, 28, 29, 30, 60, 61, 62, 92, 93, 94, 156, 157, 158, 188, 189, 190, 220, 221, 222, 31, 63, 95, 159, + 191, 223, 124, 125, 126 }; + + // Extracts bits [low,high] + static inline uint32_t astc_extract_bits(uint32_t bits, int low, int high) + { + return (bits >> low) & ((1 << (high - low + 1)) - 1); + } + + // Writes bits to output in an endian safe way + static inline void astc_set_bits(uint32_t* pOutput, int& bit_pos, uint32_t value, uint32_t total_bits) + { + uint8_t* pBytes = reinterpret_cast(pOutput); + + while (total_bits) + { + const uint32_t bits_to_write = basisu::minimum(total_bits, 8 - (bit_pos & 7)); + + pBytes[bit_pos >> 3] |= static_cast(value << (bit_pos & 7)); + + bit_pos += bits_to_write; + total_bits -= bits_to_write; + value >>= bits_to_write; + } + } + + // Encodes 5 values to output, usable for any range that uses trits and bits + static void astc_encode_trits(uint32_t* pOutput, const uint8_t* pValues, int& bit_pos, int n) + { + // First extract the trits and the bits from the 5 input values + int trits = 0, bits[5]; + const uint32_t bit_mask = (1 << n) - 1; + for (int i = 0; i < 5; i++) + { + static const int s_muls[5] = { 1, 3, 9, 27, 81 }; + + const int t = pValues[i] >> n; + + trits += t * s_muls[i]; + bits[i] = pValues[i] & bit_mask; + } + + // Encode the trits, by inverting the bit manipulations done by the decoder, converting 5 trits into 8-bits. + // See https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#astc-integer-sequence-encoding + + assert(trits < 243); + const int T = g_astc_trit_encode[trits]; + + // Now interleave the 8 encoded trit bits with the bits to form the encoded output. See table 94. + astc_set_bits(pOutput, bit_pos, bits[0] | (astc_extract_bits(T, 0, 1) << n) | (bits[1] << (2 + n)), n * 2 + 2); + + astc_set_bits(pOutput, bit_pos, astc_extract_bits(T, 2, 3) | (bits[2] << 2) | (astc_extract_bits(T, 4, 4) << (2 + n)) | (bits[3] << (3 + n)) | (astc_extract_bits(T, 5, 6) << (3 + n * 2)) | + (bits[4] << (5 + n * 2)) | (astc_extract_bits(T, 7, 7) << (5 + n * 3)), n * 3 + 6); + } +#endif // #if BASISD_SUPPORT_UASTC || BASISD_SUPPORT_ASTC + +#if BASISD_SUPPORT_ASTC + struct astc_block_params + { + // 2 groups of 5, but only a max of 8 are used (RRGGBBAA00) + uint8_t m_endpoints[10]; + uint8_t m_weights[32]; + }; + + // Packs a single format ASTC block using Color Endpoint Mode 12 (LDR RGBA direct), endpoint BISE range 13, 2-bit weights (range 2). + // We're always going to output blocks containing alpha, even if the input doesn't have alpha, for simplicity. + // Each block always has 4x4 weights, uses range 13 BISE encoding on the endpoints (0-47), and each weight ranges from 0-3. This encoding should be roughly equal in quality vs. BC1 for color. + // 8 total endpoints, stored as RGBA LH LH LH LH order, each ranging from 0-47. + // Note the input [0,47] endpoint values are not linear - they are encoded as outlined in the ASTC spec: + // https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#astc-endpoint-unquantization + // 32 total weights, stored as 16 CA CA, each ranging from 0-3. + static void astc_pack_block_cem_12_weight_range2(uint32_t *pOutput, const astc_block_params* pBlock) + { + uint8_t* pBytes = reinterpret_cast(pOutput); + + // Write constant block mode, color component selector, number of partitions, color endpoint mode + // https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#_block_mode + pBytes[0] = 0x42; pBytes[1] = 0x84; pBytes[2] = 0x01; pBytes[3] = 0x00; + pBytes[4] = 0x00; pBytes[5] = 0x00; pBytes[6] = 0x00; pBytes[7] = 0xc0; + + pOutput[2] = 0; + pOutput[3] = 0; + + // Pack 8 endpoints (each ranging between [0,47]) using BISE starting at bit 17 + int bit_pos = 17; + astc_encode_trits(pOutput, pBlock->m_endpoints, bit_pos, 4); + astc_encode_trits(pOutput, pBlock->m_endpoints + 5, bit_pos, 4); + + // Pack 32 2-bit weights, which are stored from the top down into the block in opposite bit order. + + for (uint32_t i = 0; i < 32; i++) + { + static const uint8_t s_reverse_bits[4] = { 0, 2, 1, 3 }; + const uint32_t ofs = 126 - (i * 2); + pBytes[ofs >> 3] |= (s_reverse_bits[pBlock->m_weights[i]] << (ofs & 7)); + } + } + + // CEM mode 12 (LDR RGBA Direct), 8-bit endpoints, 1-bit weights + // This ASTC mode is basically block truncation coding (BTC) using 1-bit weights and 8-bit/component endpoints - very convenient. + static void astc_pack_block_cem_12_weight_range0(uint32_t* pOutput, const astc_block_params* pBlock) + { + uint8_t* pBytes = reinterpret_cast(pOutput); + + // Write constant block mode, color component selector, number of partitions, color endpoint mode + // https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#_block_mode + pBytes[0] = 0x41; pBytes[1] = 0x84; pBytes[2] = 0x01; pBytes[3] = 0x00; + pOutput[1] = 0; + pBytes[8] = 0x00; pBytes[9] = 0x00; pBytes[10] = 0x00; pBytes[11] = 0xc0; + pOutput[3] = 0; + + // Pack 8 endpoints (each ranging between [0,255]) as 8-bits starting at bit 17 + int bit_pos = 17; + for (uint32_t i = 0; i < 8; i++) + astc_set_bits(pOutput, bit_pos, pBlock->m_endpoints[i], 8); + + // Pack 32 1-bit weights, which are stored from the top down into the block in opposite bit order. + for (uint32_t i = 0; i < 32; i++) + { + const uint32_t ofs = 127 - i; + pBytes[ofs >> 3] |= (pBlock->m_weights[i] << (ofs & 7)); + } + } + +#if BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + // Optional 8-bit endpoint packing functions. + + // CEM mode 4 (LDR Luminance+Alpha Direct), 8-bit endpoints, 2 bit weights + static void astc_pack_block_cem_4_weight_range2(uint32_t* pOutput, const astc_block_params* pBlock) + { + uint8_t* pBytes = reinterpret_cast(pOutput); + + // Write constant block mode, color component selector, number of partitions, color endpoint mode + // https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#_block_mode + pBytes[0] = 0x42; pBytes[1] = 0x84; pBytes[2] = 0x00; pBytes[3] = 0x00; + pBytes[4] = 0x00; pBytes[5] = 0x00; pBytes[6] = 0x00; pBytes[7] = 0xc0; + + pOutput[2] = 0; + pOutput[3] = 0; + + // Pack 4 endpoints (each ranging between [0,255]) as 8-bits starting at bit 17 + int bit_pos = 17; + for (uint32_t i = 0; i < 4; i++) + astc_set_bits(pOutput, bit_pos, pBlock->m_endpoints[i], 8); + + // Pack 32 2-bit weights, which are stored from the top down into the block in opposite bit order. + for (uint32_t i = 0; i < 32; i++) + { + static const uint8_t s_reverse_bits[4] = { 0, 2, 1, 3 }; + const uint32_t ofs = 126 - (i * 2); + pBytes[ofs >> 3] |= (s_reverse_bits[pBlock->m_weights[i]] << (ofs & 7)); + } + } + + // CEM mode 8 (LDR RGB Direct), 8-bit endpoints, 2 bit weights + static void astc_pack_block_cem_8_weight_range2(uint32_t* pOutput, const astc_block_params* pBlock) + { + uint8_t* pBytes = reinterpret_cast(pOutput); + + // Write constant block mode, color component selector, number of partitions, color endpoint mode + // https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#_block_mode + pBytes[0] = 0x42; pBytes[1] = 0x00; pBytes[2] = 0x01; pBytes[3] = 0x00; + + pOutput[1] = 0; + pOutput[2] = 0; + pOutput[3] = 0; + + // Pack 6 endpoints (each ranging between [0,255]) as 8-bits starting at bit 17 + int bit_pos = 17; + for (uint32_t i = 0; i < 6; i++) + astc_set_bits(pOutput, bit_pos, pBlock->m_endpoints[i], 8); + + // Pack 16 2-bit weights, which are stored from the top down into the block in opposite bit order. + for (uint32_t i = 0; i < 16; i++) + { + static const uint8_t s_reverse_bits[4] = { 0, 2, 1, 3 }; + const uint32_t ofs = 126 - (i * 2); + pBytes[ofs >> 3] |= (s_reverse_bits[pBlock->m_weights[i]] << (ofs & 7)); + } + } +#endif + + // Optimal quantized [0,47] entry to use given [0,255] input + static uint8_t g_astc_single_color_encoding_0[256]; + + // Optimal quantized [0,47] low/high values given [0,255] input assuming a selector of 1 + static struct + { + uint8_t m_lo, m_hi; + } g_astc_single_color_encoding_1[256]; + + static void transcoder_init_astc() + { + for (uint32_t base_color = 0; base_color < 32; base_color++) + { + for (uint32_t inten_table = 0; inten_table < 8; inten_table++) + { + for (uint32_t range_index = 0; range_index < NUM_ETC1_TO_ASTC_SELECTOR_RANGES; range_index++) + { + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc[(inten_table * 32 + base_color) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + range_index * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + uint32_t best_mapping = 0; + uint32_t best_err = UINT32_MAX; + for (uint32_t mapping_index = 0; mapping_index < NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS; mapping_index++) + { + if (pTable_g[mapping_index].m_err < best_err) + { + best_err = pTable_g[mapping_index].m_err; + best_mapping = mapping_index; + } + } + + g_etc1_to_astc_best_grayscale_mapping[base_color][inten_table][range_index] = static_cast(best_mapping); + } + } + } + +#if BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + for (uint32_t base_color = 0; base_color < 32; base_color++) + { + for (uint32_t inten_table = 0; inten_table < 8; inten_table++) + { + for (uint32_t range_index = 0; range_index < NUM_ETC1_TO_ASTC_SELECTOR_RANGES; range_index++) + { + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc_0_255[(inten_table * 32 + base_color) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + range_index * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + uint32_t best_mapping = 0; + uint32_t best_err = UINT32_MAX; + for (uint32_t mapping_index = 0; mapping_index < NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS; mapping_index++) + { + if (pTable_g[mapping_index].m_err < best_err) + { + best_err = pTable_g[mapping_index].m_err; + best_mapping = mapping_index; + } + } + + g_etc1_to_astc_best_grayscale_mapping_0_255[base_color][inten_table][range_index] = static_cast(best_mapping); + } + } + } +#endif + + for (uint32_t i = 0; i < NUM_ETC1_TO_ASTC_SELECTOR_RANGES; i++) + { + uint32_t l = g_etc1_to_astc_selector_ranges[i].m_low; + uint32_t h = g_etc1_to_astc_selector_ranges[i].m_high; + g_etc1_to_astc_selector_range_index[l][h] = i; + } + + // Endpoint dequantization, see: + // https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#astc-endpoint-unquantization + for (uint32_t trit = 0; trit < 3; trit++) + { + for (uint32_t bit = 0; bit < 16; bit++) + { + const uint32_t A = (bit & 1) ? 511 : 0; + const uint32_t B = (bit >> 1) | ((bit >> 1) << 6); + const uint32_t C = 22; + const uint32_t D = trit; + + uint32_t unq = D * C + B; + unq = unq ^ A; + unq = (A & 0x80) | (unq >> 2); + + g_ise_to_unquant[bit | (trit << 4)] = unq; + } + } + + // Compute table used for optimal single color encoding. + for (int i = 0; i < 256; i++) + { + int lowest_e = INT_MAX; + + for (int lo = 0; lo < 48; lo++) + { + for (int hi = 0; hi < 48; hi++) + { + const int lo_v = g_ise_to_unquant[lo]; + const int hi_v = g_ise_to_unquant[hi]; + + int l = lo_v | (lo_v << 8); + int h = hi_v | (hi_v << 8); + + int v = ((l * (64 - 21) + (h * 21) + 32) / 64) >> 8; + + int e = abs(v - i); + + if (e < lowest_e) + { + g_astc_single_color_encoding_1[i].m_hi = static_cast(hi); + g_astc_single_color_encoding_1[i].m_lo = static_cast(lo); + + lowest_e = e; + } + + } // hi + } // lo + } + + for (int i = 0; i < 256; i++) + { + int lowest_e = INT_MAX; + + for (int lo = 0; lo < 48; lo++) + { + const int lo_v = g_ise_to_unquant[lo]; + + int e = abs(lo_v - i); + + if (e < lowest_e) + { + g_astc_single_color_encoding_0[i] = static_cast(lo); + + lowest_e = e; + } + } // lo + } + } + + // Converts opaque or color+alpha ETC1S block to ASTC 4x4. + // This function tries to use the best ASTC mode given the block's actual contents. + static void convert_etc1s_to_astc_4x4(void* pDst_block, const endpoint* pEndpoints, const selector* pSelector, + bool transcode_alpha, const endpoint *pEndpoint_codebook, const selector *pSelector_codebook) + { + astc_block_params blk; + + blk.m_endpoints[8] = 0; + blk.m_endpoints[9] = 0; + + int constant_alpha_val = 255; + int num_unique_alpha_selectors = 1; + + if (transcode_alpha) + { + const selector& alpha_selectors = pSelector_codebook[((uint16_t*)pDst_block)[1]]; + + num_unique_alpha_selectors = alpha_selectors.m_num_unique_selectors; + + if (num_unique_alpha_selectors == 1) + { + const endpoint& alpha_endpoint = pEndpoint_codebook[((uint16_t*)pDst_block)[0]]; + + const color32& alpha_base_color = alpha_endpoint.m_color5; + const uint32_t alpha_inten_table = alpha_endpoint.m_inten5; + + int alpha_block_colors[4]; + decoder_etc_block::get_block_colors5_g(alpha_block_colors, alpha_base_color, alpha_inten_table); + + constant_alpha_val = alpha_block_colors[alpha_selectors.m_lo_selector]; + } + } + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + // Handle solid color or BTC blocks, which can always be encoded from ETC1S to ASTC losslessly. + if ((pSelector->m_num_unique_selectors == 1) && (num_unique_alpha_selectors == 1)) + { + // Both color and alpha are constant, write a solid color block and exit. + // See https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#astc-void-extent-blocks + uint32_t r, g, b; + decoder_etc_block::get_block_color5(base_color, inten_table, low_selector, r, g, b); + + uint32_t* pOutput = static_cast(pDst_block); + uint8_t* pBytes = reinterpret_cast(pDst_block); + + pBytes[0] = 0xfc; pBytes[1] = 0xfd; pBytes[2] = 0xff; pBytes[3] = 0xff; + + pOutput[1] = 0xffffffff; + pOutput[2] = 0; + pOutput[3] = 0; + + int bit_pos = 64; + astc_set_bits(pOutput, bit_pos, r | (r << 8), 16); + astc_set_bits(pOutput, bit_pos, g | (g << 8), 16); + astc_set_bits(pOutput, bit_pos, b | (b << 8), 16); + astc_set_bits(pOutput, bit_pos, constant_alpha_val | (constant_alpha_val << 8), 16); + + return; + } + else if ((pSelector->m_num_unique_selectors <= 2) && (num_unique_alpha_selectors <= 2)) + { + // Both color and alpha use <= 2 unique selectors each. + // Use block truncation coding, which is lossless with ASTC (8-bit endpoints, 1-bit weights). + color32 block_colors[4]; + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + blk.m_endpoints[0] = block_colors[low_selector].r; + blk.m_endpoints[2] = block_colors[low_selector].g; + blk.m_endpoints[4] = block_colors[low_selector].b; + + blk.m_endpoints[1] = block_colors[high_selector].r; + blk.m_endpoints[3] = block_colors[high_selector].g; + blk.m_endpoints[5] = block_colors[high_selector].b; + + int s0 = blk.m_endpoints[0] + blk.m_endpoints[2] + blk.m_endpoints[4]; + int s1 = blk.m_endpoints[1] + blk.m_endpoints[3] + blk.m_endpoints[5]; + bool invert = false; + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert = true; + } + + if (transcode_alpha) + { + const endpoint& alpha_endpoint = pEndpoint_codebook[((uint16_t*)pDst_block)[0]]; + const selector& alpha_selectors = pSelector_codebook[((uint16_t*)pDst_block)[1]]; + + const color32& alpha_base_color = alpha_endpoint.m_color5; + const uint32_t alpha_inten_table = alpha_endpoint.m_inten5; + + const uint32_t alpha_low_selector = alpha_selectors.m_lo_selector; + const uint32_t alpha_high_selector = alpha_selectors.m_hi_selector; + + int alpha_block_colors[4]; + decoder_etc_block::get_block_colors5_g(alpha_block_colors, alpha_base_color, alpha_inten_table); + + blk.m_endpoints[6] = static_cast(alpha_block_colors[alpha_low_selector]); + blk.m_endpoints[7] = static_cast(alpha_block_colors[alpha_high_selector]); + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = alpha_selectors.get_selector(x, y); + s = (s == alpha_high_selector) ? 1 : 0; + + blk.m_weights[(x + y * 4) * 2 + 1] = static_cast(s); + } // x + } // y + } + else + { + blk.m_endpoints[6] = 255; + blk.m_endpoints[7] = 255; + + for (uint32_t i = 0; i < 16; i++) + blk.m_weights[i * 2 + 1] = 0; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + + s = (s == high_selector) ? 1 : 0; + + if (invert) + s = 1 - s; + + blk.m_weights[(x + y * 4) * 2] = static_cast(s); + } // x + } // y + + astc_pack_block_cem_12_weight_range0(reinterpret_cast(pDst_block), &blk); + + return; + } + + // Either alpha and/or color use > 2 unique selectors each, so we must do something more complex. + +#if BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + // The optional higher quality modes use 8-bits endpoints vs. [0,47] endpoints. + + // If the block's base color is grayscale, all pixels are grayscale, so encode the block as Luminance+Alpha. + if ((base_color.r == base_color.g) && (base_color.r == base_color.b)) + { + if (transcode_alpha) + { + const endpoint& alpha_endpoint = pEndpoint_codebook[((uint16_t*)pDst_block)[0]]; + const selector& alpha_selectors = pSelector_codebook[((uint16_t*)pDst_block)[1]]; + + const color32& alpha_base_color = alpha_endpoint.m_color5; + const uint32_t alpha_inten_table = alpha_endpoint.m_inten5; + + const uint32_t alpha_low_selector = alpha_selectors.m_lo_selector; + const uint32_t alpha_high_selector = alpha_selectors.m_hi_selector; + + if (num_unique_alpha_selectors <= 2) + { + // Simple alpha block with only 1 or 2 unique values, so use BTC. This is lossless. + int alpha_block_colors[4]; + decoder_etc_block::get_block_colors5_g(alpha_block_colors, alpha_base_color, alpha_inten_table); + + blk.m_endpoints[2] = static_cast(alpha_block_colors[alpha_low_selector]); + blk.m_endpoints[3] = static_cast(alpha_block_colors[alpha_high_selector]); + + for (uint32_t i = 0; i < 16; i++) + { + uint32_t s = alpha_selectors.get_selector(i & 3, i >> 2); + blk.m_weights[i * 2 + 1] = (s == alpha_high_selector) ? 3 : 0; + } + } + else + { + // Convert ETC1S alpha + const uint32_t alpha_selector_range_table = g_etc1_to_astc_selector_range_index[alpha_low_selector][alpha_high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc_0_255[(alpha_inten_table * 32 + alpha_base_color.g) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + alpha_selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + const uint32_t best_mapping = g_etc1_to_astc_best_grayscale_mapping_0_255[alpha_base_color.g][alpha_inten_table][alpha_selector_range_table]; + + blk.m_endpoints[2] = pTable_g[best_mapping].m_lo; + blk.m_endpoints[3] = pTable_g[best_mapping].m_hi; + + const uint8_t* pSelectors_xlat = &g_etc1_to_astc_selector_mappings[best_mapping][0]; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = alpha_selectors.get_selector(x, y); + uint32_t as = pSelectors_xlat[s]; + + blk.m_weights[(x + y * 4) * 2 + 1] = static_cast(as); + } // x + } // y + } + } + else + { + // No alpha slice - set output alpha to all 255's + blk.m_endpoints[2] = 255; + blk.m_endpoints[3] = 255; + + for (uint32_t i = 0; i < 16; i++) + blk.m_weights[i * 2 + 1] = 0; + } + + if (pSelector->m_num_unique_selectors <= 2) + { + // Simple color block with only 1 or 2 unique values, so use BTC. This is lossless. + int block_colors[4]; + decoder_etc_block::get_block_colors5_g(block_colors, base_color, inten_table); + + blk.m_endpoints[0] = static_cast(block_colors[low_selector]); + blk.m_endpoints[1] = static_cast(block_colors[high_selector]); + + for (uint32_t i = 0; i < 16; i++) + { + uint32_t s = pSelector->get_selector(i & 3, i >> 2); + blk.m_weights[i * 2] = (s == high_selector) ? 3 : 0; + } + } + else + { + // Convert ETC1S alpha + const uint32_t selector_range_table = g_etc1_to_astc_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc_0_255[(inten_table * 32 + base_color.g) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + const uint32_t best_mapping = g_etc1_to_astc_best_grayscale_mapping_0_255[base_color.g][inten_table][selector_range_table]; + + blk.m_endpoints[0] = pTable_g[best_mapping].m_lo; + blk.m_endpoints[1] = pTable_g[best_mapping].m_hi; + + const uint8_t* pSelectors_xlat = &g_etc1_to_astc_selector_mappings[best_mapping][0]; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + uint32_t as = pSelectors_xlat[s]; + + blk.m_weights[(x + y * 4) * 2] = static_cast(as); + } // x + } // y + } + + astc_pack_block_cem_4_weight_range2(reinterpret_cast(pDst_block), &blk); + return; + } + + // The block isn't grayscale and it uses > 2 unique selectors for opaque and/or alpha. + // Check for fully opaque blocks, if so use 8-bit endpoints for slightly higher opaque quality (higher than BC1, but lower than BC7 mode 6 opaque). + if ((num_unique_alpha_selectors == 1) && (constant_alpha_val == 255)) + { + // Convert ETC1S color + const uint32_t selector_range_table = g_etc1_to_astc_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_astc_solution* pTable_r = &g_etc1_to_astc_0_255[(inten_table * 32 + base_color.r) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc_0_255[(inten_table * 32 + base_color.g) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + const etc1_to_astc_solution* pTable_b = &g_etc1_to_astc_0_255[(inten_table * 32 + base_color.b) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + uint32_t best_err = UINT_MAX; + uint32_t best_mapping = 0; + + assert(NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS == 10); +#define DO_ITER(m) { uint32_t total_err = pTable_r[m].m_err + pTable_g[m].m_err + pTable_b[m].m_err; if (total_err < best_err) { best_err = total_err; best_mapping = m; } } + DO_ITER(0); DO_ITER(1); DO_ITER(2); DO_ITER(3); DO_ITER(4); + DO_ITER(5); DO_ITER(6); DO_ITER(7); DO_ITER(8); DO_ITER(9); +#undef DO_ITER + + blk.m_endpoints[0] = pTable_r[best_mapping].m_lo; + blk.m_endpoints[1] = pTable_r[best_mapping].m_hi; + + blk.m_endpoints[2] = pTable_g[best_mapping].m_lo; + blk.m_endpoints[3] = pTable_g[best_mapping].m_hi; + + blk.m_endpoints[4] = pTable_b[best_mapping].m_lo; + blk.m_endpoints[5] = pTable_b[best_mapping].m_hi; + + int s0 = blk.m_endpoints[0] + blk.m_endpoints[2] + blk.m_endpoints[4]; + int s1 = blk.m_endpoints[1] + blk.m_endpoints[3] + blk.m_endpoints[5]; + bool invert = false; + + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert = true; + } + + const uint8_t* pSelectors_xlat = &g_etc1_to_astc_selector_mappings[best_mapping][0]; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + uint32_t as = pSelectors_xlat[s]; + if (invert) + as = 3 - as; + + blk.m_weights[x + y * 4] = static_cast(as); + } // x + } // y + + // Now pack to ASTC + astc_pack_block_cem_8_weight_range2(reinterpret_cast(pDst_block), &blk); + return; + } +#endif //#if BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + + // Nothing else worked, so fall back to CEM Mode 12 (LDR RGBA Direct), [0,47] endpoints, weight range 2 (2-bit weights), dual planes. + // This mode can handle everything, but at slightly less quality than BC1. + if (transcode_alpha) + { + const endpoint& alpha_endpoint = pEndpoint_codebook[((uint16_t*)pDst_block)[0]]; + const selector& alpha_selectors = pSelector_codebook[((uint16_t*)pDst_block)[1]]; + + const color32& alpha_base_color = alpha_endpoint.m_color5; + const uint32_t alpha_inten_table = alpha_endpoint.m_inten5; + + const uint32_t alpha_low_selector = alpha_selectors.m_lo_selector; + const uint32_t alpha_high_selector = alpha_selectors.m_hi_selector; + + if (alpha_low_selector == alpha_high_selector) + { + // Solid alpha block - use precomputed tables. + int alpha_block_colors[4]; + decoder_etc_block::get_block_colors5_g(alpha_block_colors, alpha_base_color, alpha_inten_table); + + const uint32_t g = alpha_block_colors[alpha_low_selector]; + + blk.m_endpoints[6] = g_astc_single_color_encoding_1[g].m_lo; + blk.m_endpoints[7] = g_astc_single_color_encoding_1[g].m_hi; + + for (uint32_t i = 0; i < 16; i++) + blk.m_weights[i * 2 + 1] = 1; + } + else if ((alpha_inten_table >= 7) && (alpha_selectors.m_num_unique_selectors == 2) && (alpha_low_selector == 0) && (alpha_high_selector == 3)) + { + // Handle outlier case where only the two outer colors are used with inten table 7. + color32 alpha_block_colors[4]; + + decoder_etc_block::get_block_colors5(alpha_block_colors, alpha_base_color, alpha_inten_table); + + const uint32_t g0 = alpha_block_colors[0].g; + const uint32_t g1 = alpha_block_colors[3].g; + + blk.m_endpoints[6] = g_astc_single_color_encoding_0[g0]; + blk.m_endpoints[7] = g_astc_single_color_encoding_0[g1]; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = alpha_selectors.get_selector(x, y); + uint32_t as = (s == alpha_high_selector) ? 3 : 0; + + blk.m_weights[(x + y * 4) * 2 + 1] = static_cast(as); + } // x + } // y + } + else + { + // Convert ETC1S alpha + const uint32_t alpha_selector_range_table = g_etc1_to_astc_selector_range_index[alpha_low_selector][alpha_high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc[(alpha_inten_table * 32 + alpha_base_color.g) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + alpha_selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + const uint32_t best_mapping = g_etc1_to_astc_best_grayscale_mapping[alpha_base_color.g][alpha_inten_table][alpha_selector_range_table]; + + blk.m_endpoints[6] = pTable_g[best_mapping].m_lo; + blk.m_endpoints[7] = pTable_g[best_mapping].m_hi; + + const uint8_t* pSelectors_xlat = &g_etc1_to_astc_selector_mappings[best_mapping][0]; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = alpha_selectors.get_selector(x, y); + uint32_t as = pSelectors_xlat[s]; + + blk.m_weights[(x + y * 4) * 2 + 1] = static_cast(as); + } // x + } // y + } + } + else + { + // No alpha slice - set output alpha to all 255's + // 1 is 255 when dequantized + blk.m_endpoints[6] = 1; + blk.m_endpoints[7] = 1; + + for (uint32_t i = 0; i < 16; i++) + blk.m_weights[i * 2 + 1] = 0; + } + + if (low_selector == high_selector) + { + // Solid color block - use precomputed tables of optimal endpoints assuming selector weights are all 1. + color32 block_colors[4]; + + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + const uint32_t r = block_colors[low_selector].r; + const uint32_t g = block_colors[low_selector].g; + const uint32_t b = block_colors[low_selector].b; + + blk.m_endpoints[0] = g_astc_single_color_encoding_1[r].m_lo; + blk.m_endpoints[1] = g_astc_single_color_encoding_1[r].m_hi; + + blk.m_endpoints[2] = g_astc_single_color_encoding_1[g].m_lo; + blk.m_endpoints[3] = g_astc_single_color_encoding_1[g].m_hi; + + blk.m_endpoints[4] = g_astc_single_color_encoding_1[b].m_lo; + blk.m_endpoints[5] = g_astc_single_color_encoding_1[b].m_hi; + + int s0 = g_ise_to_unquant[blk.m_endpoints[0]] + g_ise_to_unquant[blk.m_endpoints[2]] + g_ise_to_unquant[blk.m_endpoints[4]]; + int s1 = g_ise_to_unquant[blk.m_endpoints[1]] + g_ise_to_unquant[blk.m_endpoints[3]] + g_ise_to_unquant[blk.m_endpoints[5]]; + bool invert = false; + + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert = true; + } + + for (uint32_t i = 0; i < 16; i++) + blk.m_weights[i * 2] = invert ? 2 : 1; + } + else if ((inten_table >= 7) && (pSelector->m_num_unique_selectors == 2) && (pSelector->m_lo_selector == 0) && (pSelector->m_hi_selector == 3)) + { + // Handle outlier case where only the two outer colors are used with inten table 7. + color32 block_colors[4]; + + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + const uint32_t r0 = block_colors[0].r; + const uint32_t g0 = block_colors[0].g; + const uint32_t b0 = block_colors[0].b; + + const uint32_t r1 = block_colors[3].r; + const uint32_t g1 = block_colors[3].g; + const uint32_t b1 = block_colors[3].b; + + blk.m_endpoints[0] = g_astc_single_color_encoding_0[r0]; + blk.m_endpoints[1] = g_astc_single_color_encoding_0[r1]; + + blk.m_endpoints[2] = g_astc_single_color_encoding_0[g0]; + blk.m_endpoints[3] = g_astc_single_color_encoding_0[g1]; + + blk.m_endpoints[4] = g_astc_single_color_encoding_0[b0]; + blk.m_endpoints[5] = g_astc_single_color_encoding_0[b1]; + + int s0 = g_ise_to_unquant[blk.m_endpoints[0]] + g_ise_to_unquant[blk.m_endpoints[2]] + g_ise_to_unquant[blk.m_endpoints[4]]; + int s1 = g_ise_to_unquant[blk.m_endpoints[1]] + g_ise_to_unquant[blk.m_endpoints[3]] + g_ise_to_unquant[blk.m_endpoints[5]]; + bool invert = false; + + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert = true; + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + uint32_t as = (s == low_selector) ? 0 : 3; + + if (invert) + as = 3 - as; + + blk.m_weights[(x + y * 4) * 2] = static_cast(as); + } // x + } // y + } + else + { + // Convert ETC1S color + const uint32_t selector_range_table = g_etc1_to_astc_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1_to_astc_solution* pTable_r = &g_etc1_to_astc[(inten_table * 32 + base_color.r) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + const etc1_to_astc_solution* pTable_g = &g_etc1_to_astc[(inten_table * 32 + base_color.g) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + const etc1_to_astc_solution* pTable_b = &g_etc1_to_astc[(inten_table * 32 + base_color.b) * (NUM_ETC1_TO_ASTC_SELECTOR_RANGES * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS]; + + uint32_t best_err = UINT_MAX; + uint32_t best_mapping = 0; + + assert(NUM_ETC1_TO_ASTC_SELECTOR_MAPPINGS == 10); +#define DO_ITER(m) { uint32_t total_err = pTable_r[m].m_err + pTable_g[m].m_err + pTable_b[m].m_err; if (total_err < best_err) { best_err = total_err; best_mapping = m; } } + DO_ITER(0); DO_ITER(1); DO_ITER(2); DO_ITER(3); DO_ITER(4); + DO_ITER(5); DO_ITER(6); DO_ITER(7); DO_ITER(8); DO_ITER(9); +#undef DO_ITER + + blk.m_endpoints[0] = pTable_r[best_mapping].m_lo; + blk.m_endpoints[1] = pTable_r[best_mapping].m_hi; + + blk.m_endpoints[2] = pTable_g[best_mapping].m_lo; + blk.m_endpoints[3] = pTable_g[best_mapping].m_hi; + + blk.m_endpoints[4] = pTable_b[best_mapping].m_lo; + blk.m_endpoints[5] = pTable_b[best_mapping].m_hi; + + int s0 = g_ise_to_unquant[blk.m_endpoints[0]] + g_ise_to_unquant[blk.m_endpoints[2]] + g_ise_to_unquant[blk.m_endpoints[4]]; + int s1 = g_ise_to_unquant[blk.m_endpoints[1]] + g_ise_to_unquant[blk.m_endpoints[3]] + g_ise_to_unquant[blk.m_endpoints[5]]; + bool invert = false; + + if (s1 < s0) + { + std::swap(blk.m_endpoints[0], blk.m_endpoints[1]); + std::swap(blk.m_endpoints[2], blk.m_endpoints[3]); + std::swap(blk.m_endpoints[4], blk.m_endpoints[5]); + invert = true; + } + + const uint8_t* pSelectors_xlat = &g_etc1_to_astc_selector_mappings[best_mapping][0]; + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = pSelector->get_selector(x, y); + uint32_t as = pSelectors_xlat[s]; + if (invert) + as = 3 - as; + + blk.m_weights[(x + y * 4) * 2] = static_cast(as); + } // x + } // y + } + + // Now pack to ASTC + astc_pack_block_cem_12_weight_range2(reinterpret_cast(pDst_block), &blk); + } +#endif + +#if BASISD_SUPPORT_ATC + // ATC and PVRTC2 both use these tables. + struct etc1s_to_atc_solution + { + uint8_t m_lo; + uint8_t m_hi; + uint16_t m_err; + }; + + static dxt_selector_range g_etc1s_to_atc_selector_ranges[] = + { + { 0, 3 }, + { 1, 3 }, + { 0, 2 }, + { 1, 2 }, + { 2, 3 }, + { 0, 1 }, + }; + + const uint32_t NUM_ETC1S_TO_ATC_SELECTOR_RANGES = sizeof(g_etc1s_to_atc_selector_ranges) / sizeof(g_etc1s_to_atc_selector_ranges[0]); + + static uint32_t g_etc1s_to_atc_selector_range_index[4][4]; + + const uint32_t NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS = 10; + static const uint8_t g_etc1s_to_atc_selector_mappings[NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS][4] = + { + { 0, 0, 1, 1 }, + { 0, 0, 1, 2 }, + { 0, 0, 1, 3 }, + { 0, 0, 2, 3 }, + { 0, 1, 1, 1 }, + { 0, 1, 2, 2 }, + { 0, 1, 2, 3 }, //6 - identity + { 0, 2, 3, 3 }, + { 1, 2, 2, 2 }, + { 1, 2, 3, 3 }, + }; + const uint32_t ATC_IDENTITY_SELECTOR_MAPPING_INDEX = 6; + +#if BASISD_SUPPORT_PVRTC2 + static const etc1s_to_atc_solution g_etc1s_to_pvrtc2_45[32 * 8 * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS * NUM_ETC1S_TO_ATC_SELECTOR_RANGES] = { +#include "basisu_transcoder_tables_pvrtc2_45.inc" + }; + +#if 0 + static const etc1s_to_atc_solution g_etc1s_to_pvrtc2_alpha_33[32 * 8 * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS * NUM_ETC1S_TO_ATC_SELECTOR_RANGES] = { +#include "basisu_transcoder_tables_pvrtc2_alpha_33.inc" + }; +#endif + +#endif + + static const etc1s_to_atc_solution g_etc1s_to_atc_55[32 * 8 * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS * NUM_ETC1S_TO_ATC_SELECTOR_RANGES] = { +#include "basisu_transcoder_tables_atc_55.inc" + }; + + static const etc1s_to_atc_solution g_etc1s_to_atc_56[32 * 8 * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS * NUM_ETC1S_TO_ATC_SELECTOR_RANGES] = { +#include "basisu_transcoder_tables_atc_56.inc" + }; + + struct atc_match_entry + { + uint8_t m_lo; + uint8_t m_hi; + }; + static atc_match_entry g_pvrtc2_match45_equals_1[256], g_atc_match55_equals_1[256], g_atc_match56_equals_1[256]; // selector 1 + static atc_match_entry g_pvrtc2_match4[256], g_atc_match5[256], g_atc_match6[256]; + + static void prepare_atc_single_color_table(atc_match_entry* pTable, int size0, int size1, int sel) + { + for (int i = 0; i < 256; i++) + { + int lowest_e = 256; + for (int lo = 0; lo < size0; lo++) + { + int lo_e = lo; + if (size0 == 16) + { + lo_e = (lo_e << 1) | (lo_e >> 3); + lo_e = (lo_e << 3) | (lo_e >> 2); + } + else if (size0 == 32) + lo_e = (lo_e << 3) | (lo_e >> 2); + else + lo_e = (lo_e << 2) | (lo_e >> 4); + + for (int hi = 0; hi < size1; hi++) + { + int hi_e = hi; + if (size1 == 16) + { + // This is only for PVRTC2 - expand to 5 then 8 + hi_e = (hi_e << 1) | (hi_e >> 3); + hi_e = (hi_e << 3) | (hi_e >> 2); + } + else if (size1 == 32) + hi_e = (hi_e << 3) | (hi_e >> 2); + else + hi_e = (hi_e << 2) | (hi_e >> 4); + + int e; + + if (sel == 1) + { + // Selector 1 + e = abs(((lo_e * 5 + hi_e * 3) / 8) - i); + } + else + { + assert(sel == 3); + + // Selector 3 + e = abs(hi_e - i); + } + + if (e < lowest_e) + { + pTable[i].m_lo = static_cast(lo); + pTable[i].m_hi = static_cast(hi); + + lowest_e = e; + } + + } // hi + } // lo + } // i + } + + static void transcoder_init_atc() + { + prepare_atc_single_color_table(g_pvrtc2_match45_equals_1, 16, 32, 1); + prepare_atc_single_color_table(g_atc_match55_equals_1, 32, 32, 1); + prepare_atc_single_color_table(g_atc_match56_equals_1, 32, 64, 1); + + prepare_atc_single_color_table(g_pvrtc2_match4, 1, 16, 3); + prepare_atc_single_color_table(g_atc_match5, 1, 32, 3); + prepare_atc_single_color_table(g_atc_match6, 1, 64, 3); + + for (uint32_t i = 0; i < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; i++) + { + uint32_t l = g_etc1s_to_atc_selector_ranges[i].m_low; + uint32_t h = g_etc1s_to_atc_selector_ranges[i].m_high; + g_etc1s_to_atc_selector_range_index[l][h] = i; + } + } + + struct atc_block + { + uint8_t m_lo[2]; + uint8_t m_hi[2]; + uint8_t m_sels[4]; + + void set_low_color(uint32_t r, uint32_t g, uint32_t b) + { + assert((r < 32) && (g < 32) && (b < 32)); + uint32_t x = (r << 10) | (g << 5) | b; + m_lo[0] = x & 0xFF; + m_lo[1] = (x >> 8) & 0xFF; + } + + void set_high_color(uint32_t r, uint32_t g, uint32_t b) + { + assert((r < 32) && (g < 64) && (b < 32)); + uint32_t x = (r << 11) | (g << 5) | b; + m_hi[0] = x & 0xFF; + m_hi[1] = (x >> 8) & 0xFF; + } + }; + + static void convert_etc1s_to_atc(void* pDst, const endpoint* pEndpoints, const selector* pSelector) + { + atc_block* pBlock = static_cast(pDst); + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (low_selector == high_selector) + { + uint32_t r, g, b; + decoder_etc_block::get_block_color5(base_color, inten_table, low_selector, r, g, b); + + pBlock->set_low_color(g_atc_match55_equals_1[r].m_lo, g_atc_match56_equals_1[g].m_lo, g_atc_match55_equals_1[b].m_lo); + pBlock->set_high_color(g_atc_match55_equals_1[r].m_hi, g_atc_match56_equals_1[g].m_hi, g_atc_match55_equals_1[b].m_hi); + + pBlock->m_sels[0] = 0x55; + pBlock->m_sels[1] = 0x55; + pBlock->m_sels[2] = 0x55; + pBlock->m_sels[3] = 0x55; + + return; + } + else if ((inten_table >= 7) && (pSelector->m_num_unique_selectors == 2) && (pSelector->m_lo_selector == 0) && (pSelector->m_hi_selector == 3)) + { + color32 block_colors[4]; + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + const uint32_t r0 = block_colors[0].r; + const uint32_t g0 = block_colors[0].g; + const uint32_t b0 = block_colors[0].b; + + const uint32_t r1 = block_colors[3].r; + const uint32_t g1 = block_colors[3].g; + const uint32_t b1 = block_colors[3].b; + + pBlock->set_low_color(g_atc_match5[r0].m_hi, g_atc_match5[g0].m_hi, g_atc_match5[b0].m_hi); + pBlock->set_high_color(g_atc_match5[r1].m_hi, g_atc_match6[g1].m_hi, g_atc_match5[b1].m_hi); + + pBlock->m_sels[0] = pSelector->m_selectors[0]; + pBlock->m_sels[1] = pSelector->m_selectors[1]; + pBlock->m_sels[2] = pSelector->m_selectors[2]; + pBlock->m_sels[3] = pSelector->m_selectors[3]; + + return; + } + + const uint32_t selector_range_table = g_etc1s_to_atc_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1s_to_atc_solution* pTable_r = &g_etc1s_to_atc_55[(inten_table * 32 + base_color.r) * (NUM_ETC1S_TO_ATC_SELECTOR_RANGES * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS]; + const etc1s_to_atc_solution* pTable_g = &g_etc1s_to_atc_56[(inten_table * 32 + base_color.g) * (NUM_ETC1S_TO_ATC_SELECTOR_RANGES * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS]; + const etc1s_to_atc_solution* pTable_b = &g_etc1s_to_atc_55[(inten_table * 32 + base_color.b) * (NUM_ETC1S_TO_ATC_SELECTOR_RANGES * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS]; + + uint32_t best_err = UINT_MAX; + uint32_t best_mapping = 0; + + assert(NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS == 10); +#define DO_ITER(m) { uint32_t total_err = pTable_r[m].m_err + pTable_g[m].m_err + pTable_b[m].m_err; if (total_err < best_err) { best_err = total_err; best_mapping = m; } } + DO_ITER(0); DO_ITER(1); DO_ITER(2); DO_ITER(3); DO_ITER(4); + DO_ITER(5); DO_ITER(6); DO_ITER(7); DO_ITER(8); DO_ITER(9); +#undef DO_ITER + + pBlock->set_low_color(pTable_r[best_mapping].m_lo, pTable_g[best_mapping].m_lo, pTable_b[best_mapping].m_lo); + pBlock->set_high_color(pTable_r[best_mapping].m_hi, pTable_g[best_mapping].m_hi, pTable_b[best_mapping].m_hi); + + if (ATC_IDENTITY_SELECTOR_MAPPING_INDEX == best_mapping) + { + pBlock->m_sels[0] = pSelector->m_selectors[0]; + pBlock->m_sels[1] = pSelector->m_selectors[1]; + pBlock->m_sels[2] = pSelector->m_selectors[2]; + pBlock->m_sels[3] = pSelector->m_selectors[3]; + } + else + { + const uint8_t* pSelectors_xlat = &g_etc1s_to_atc_selector_mappings[best_mapping][0]; + + const uint32_t sel_bits0 = pSelector->m_selectors[0]; + const uint32_t sel_bits1 = pSelector->m_selectors[1]; + const uint32_t sel_bits2 = pSelector->m_selectors[2]; + const uint32_t sel_bits3 = pSelector->m_selectors[3]; + + uint32_t atc_sels0 = 0, atc_sels1 = 0, atc_sels2 = 0, atc_sels3 = 0; + +#define DO_X(x) { \ + const uint32_t x_shift = (x) * 2; \ + atc_sels0 |= (pSelectors_xlat[(sel_bits0 >> x_shift) & 3] << x_shift); \ + atc_sels1 |= (pSelectors_xlat[(sel_bits1 >> x_shift) & 3] << x_shift); \ + atc_sels2 |= (pSelectors_xlat[(sel_bits2 >> x_shift) & 3] << x_shift); \ + atc_sels3 |= (pSelectors_xlat[(sel_bits3 >> x_shift) & 3] << x_shift); } + + DO_X(0); + DO_X(1); + DO_X(2); + DO_X(3); +#undef DO_X + + pBlock->m_sels[0] = (uint8_t)atc_sels0; + pBlock->m_sels[1] = (uint8_t)atc_sels1; + pBlock->m_sels[2] = (uint8_t)atc_sels2; + pBlock->m_sels[3] = (uint8_t)atc_sels3; + } + } + +#if BASISD_WRITE_NEW_ATC_TABLES + static void create_etc1s_to_atc_conversion_tables() + { + // ATC 55 + FILE* pFile = nullptr; + fopen_s(&pFile, "basisu_transcoder_tables_atc_55.inc", "w"); + + uint32_t n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1s_to_atc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1s_to_atc_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 31; hi++) + { + for (uint32_t lo = 0; lo <= 31; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 3) | (lo >> 2); + colors[3] = (hi << 3) | (hi >> 2); + + colors[1] = (colors[0] * 5 + colors[3] * 3) / 8; + colors[2] = (colors[3] * 5 + colors[0] * 3) / 8; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1s_to_atc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + //assert(best_err <= 0xFFFF); + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); + pFile = nullptr; + + // ATC 56 + fopen_s(&pFile, "basisu_transcoder_tables_atc_56.inc", "w"); + + n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1s_to_atc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1s_to_atc_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 63; hi++) + { + for (uint32_t lo = 0; lo <= 31; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 3) | (lo >> 2); + colors[3] = (hi << 2) | (hi >> 4); + + colors[1] = (colors[0] * 5 + colors[3] * 3) / 8; + colors[2] = (colors[3] * 5 + colors[0] * 3) / 8; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1s_to_atc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + //assert(best_err <= 0xFFFF); + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); + + // PVRTC2 45 + fopen_s(&pFile, "basisu_transcoder_tables_pvrtc2_45.inc", "w"); + + n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1s_to_atc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1s_to_atc_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 31; hi++) + { + for (uint32_t lo = 0; lo <= 15; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 1) | (lo >> 3); + colors[0] = (colors[0] << 3) | (colors[0] >> 2); + + colors[3] = (hi << 3) | (hi >> 2); + + colors[1] = (colors[0] * 5 + colors[3] * 3) / 8; + colors[2] = (colors[3] * 5 + colors[0] * 3) / 8; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1s_to_atc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + //assert(best_err <= 0xFFFF); + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); + +#if 0 + // PVRTC2 34 + fopen_s(&pFile, "basisu_transcoder_tables_pvrtc2_34.inc", "w"); + + n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1s_to_atc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1s_to_atc_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 15; hi++) + { + for (uint32_t lo = 0; lo <= 7; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 2) | (lo >> 1); + colors[0] = (colors[0] << 3) | (colors[0] >> 2); + + colors[3] = (hi << 1) | (hi >> 3); + colors[3] = (colors[3] << 3) | (colors[3] >> 2); + + colors[1] = (colors[0] * 5 + colors[3] * 3) / 8; + colors[2] = (colors[3] * 5 + colors[0] * 3) / 8; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1s_to_atc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + //assert(best_err <= 0xFFFF); + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); +#endif +#if 0 + // PVRTC2 44 + fopen_s(&pFile, "basisu_transcoder_tables_pvrtc2_44.inc", "w"); + + n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1s_to_atc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1s_to_atc_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 15; hi++) + { + for (uint32_t lo = 0; lo <= 15; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 1) | (lo >> 3); + colors[0] = (colors[0] << 3) | (colors[0] >> 2); + + colors[3] = (hi << 1) | (hi >> 3); + colors[3] = (colors[3] << 3) | (colors[3] >> 2); + + colors[1] = (colors[0] * 5 + colors[3] * 3) / 8; + colors[2] = (colors[3] * 5 + colors[0] * 3) / 8; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1s_to_atc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + //assert(best_err <= 0xFFFF); + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); +#endif + + // PVRTC2 alpha 33 + fopen_s(&pFile, "basisu_transcoder_tables_pvrtc2_alpha_33.inc", "w"); + + n = 0; + + for (int inten = 0; inten < 8; inten++) + { + for (uint32_t g = 0; g < 32; g++) + { + color32 block_colors[4]; + decoder_etc_block::get_diff_subblock_colors(block_colors, decoder_etc_block::pack_color5(color32(g, g, g, 255), false), inten); + + for (uint32_t sr = 0; sr < NUM_ETC1S_TO_ATC_SELECTOR_RANGES; sr++) + { + const uint32_t low_selector = g_etc1s_to_atc_selector_ranges[sr].m_low; + const uint32_t high_selector = g_etc1s_to_atc_selector_ranges[sr].m_high; + + for (uint32_t m = 0; m < NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS; m++) + { + uint32_t best_lo = 0; + uint32_t best_hi = 0; + uint64_t best_err = UINT64_MAX; + + for (uint32_t hi = 0; hi <= 7; hi++) + { + for (uint32_t lo = 0; lo <= 7; lo++) + { + uint32_t colors[4]; + + colors[0] = (lo << 1); + colors[0] = (colors[0] << 4) | colors[0]; + + colors[3] = (hi << 1) | 1; + colors[3] = (colors[3] << 4) | colors[3]; + + colors[1] = (colors[0] * 5 + colors[3] * 3) / 8; + colors[2] = (colors[3] * 5 + colors[0] * 3) / 8; + + uint64_t total_err = 0; + + for (uint32_t s = low_selector; s <= high_selector; s++) + { + int err = block_colors[s].g - colors[g_etc1s_to_atc_selector_mappings[m][s]]; + + int err_scale = 1; + // Special case when the intensity table is 7, low_selector is 0, and high_selector is 3. In this extreme case, it's likely the encoder is trying to strongly favor + // the low/high selectors which are clamping to either 0 or 255. + if (((inten == 7) && (low_selector == 0) && (high_selector == 3)) && ((s == 0) || (s == 3))) + err_scale = 5; + + total_err += (err * err) * err_scale; + } + + if (total_err < best_err) + { + best_err = total_err; + best_lo = lo; + best_hi = hi; + } + } + } + + //assert(best_err <= 0xFFFF); + best_err = basisu::minimum(best_err, 0xFFFF); + + fprintf(pFile, "{%u,%u,%u},", best_lo, best_hi, (uint32_t)best_err); + n++; + if ((n & 31) == 31) + fprintf(pFile, "\n"); + } // m + } // sr + } // g + } // inten + + fclose(pFile); + } +#endif // BASISD_WRITE_NEW_ATC_TABLES + +#endif // BASISD_SUPPORT_ATC + +#if BASISD_SUPPORT_PVRTC2 + struct pvrtc2_block + { + uint8_t m_modulation[4]; + + union + { + union + { + // Opaque mode: RGB colora=554 and colorb=555 + struct + { + uint32_t m_mod_flag : 1; + uint32_t m_blue_a : 4; + uint32_t m_green_a : 5; + uint32_t m_red_a : 5; + uint32_t m_hard_flag : 1; + uint32_t m_blue_b : 5; + uint32_t m_green_b : 5; + uint32_t m_red_b : 5; + uint32_t m_opaque_flag : 1; + + } m_opaque_color_data; + + // Transparent mode: RGBA colora=4433 and colorb=4443 + struct + { + uint32_t m_mod_flag : 1; + uint32_t m_blue_a : 3; + uint32_t m_green_a : 4; + uint32_t m_red_a : 4; + uint32_t m_alpha_a : 3; + uint32_t m_hard_flag : 1; + uint32_t m_blue_b : 4; + uint32_t m_green_b : 4; + uint32_t m_red_b : 4; + uint32_t m_alpha_b : 3; + uint32_t m_opaque_flag : 1; + + } m_trans_color_data; + }; + + uint32_t m_color_data_bits; + }; + + // 554 + void set_low_color(uint32_t r, uint32_t g, uint32_t b) + { + assert((r < 32) && (g < 32) && (b < 16)); + m_opaque_color_data.m_red_a = r; + m_opaque_color_data.m_green_a = g; + m_opaque_color_data.m_blue_a = b; + } + + // 555 + void set_high_color(uint32_t r, uint32_t g, uint32_t b) + { + assert((r < 32) && (g < 32) && (b < 32)); + m_opaque_color_data.m_red_b = r; + m_opaque_color_data.m_green_b = g; + m_opaque_color_data.m_blue_b = b; + } + + // 4433 + void set_trans_low_color(uint32_t r, uint32_t g, uint32_t b, uint32_t a) + { + assert((r < 16) && (g < 16) && (b < 8) && (a < 8)); + m_trans_color_data.m_red_a = r; + m_trans_color_data.m_green_a = g; + m_trans_color_data.m_blue_a = b; + m_trans_color_data.m_alpha_a = a; + } + + // 4443 + void set_trans_high_color(uint32_t r, uint32_t g, uint32_t b, uint32_t a) + { + assert((r < 16) && (g < 16) && (b < 16) && (a < 8)); + m_trans_color_data.m_red_b = r; + m_trans_color_data.m_green_b = g; + m_trans_color_data.m_blue_b = b; + m_trans_color_data.m_alpha_b = a; + } + }; + + static struct + { + uint8_t m_l, m_h; + } g_pvrtc2_trans_match34[256]; + + static struct + { + uint8_t m_l, m_h; + } g_pvrtc2_trans_match44[256]; + + static struct + { + uint8_t m_l, m_h; + } g_pvrtc2_alpha_match33[256]; + + static struct + { + uint8_t m_l, m_h; + } g_pvrtc2_alpha_match33_0[256]; + + static struct + { + uint8_t m_l, m_h; + } g_pvrtc2_alpha_match33_3[256]; + + // PVRTC2 can be forced to look like a slightly weaker variant of ATC/BC1, so that's what we do here for simplicity. + static void convert_etc1s_to_pvrtc2_rgb(void* pDst, const endpoint* pEndpoints, const selector* pSelector) + { + pvrtc2_block* pBlock = static_cast(pDst); + + pBlock->m_opaque_color_data.m_hard_flag = 1; + pBlock->m_opaque_color_data.m_mod_flag = 0; + pBlock->m_opaque_color_data.m_opaque_flag = 1; + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + if (low_selector == high_selector) + { + uint32_t r, g, b; + decoder_etc_block::get_block_color5(base_color, inten_table, low_selector, r, g, b); + + pBlock->set_low_color(g_atc_match55_equals_1[r].m_lo, g_atc_match55_equals_1[g].m_lo, g_pvrtc2_match45_equals_1[b].m_lo); + pBlock->set_high_color(g_atc_match55_equals_1[r].m_hi, g_atc_match55_equals_1[g].m_hi, g_pvrtc2_match45_equals_1[b].m_hi); + + pBlock->m_modulation[0] = 0x55; + pBlock->m_modulation[1] = 0x55; + pBlock->m_modulation[2] = 0x55; + pBlock->m_modulation[3] = 0x55; + + return; + } + else if ((inten_table >= 7) && (pSelector->m_num_unique_selectors == 2) && (pSelector->m_lo_selector == 0) && (pSelector->m_hi_selector == 3)) + { + color32 block_colors[4]; + decoder_etc_block::get_block_colors5(block_colors, base_color, inten_table); + + const uint32_t r0 = block_colors[0].r; + const uint32_t g0 = block_colors[0].g; + const uint32_t b0 = block_colors[0].b; + + const uint32_t r1 = block_colors[3].r; + const uint32_t g1 = block_colors[3].g; + const uint32_t b1 = block_colors[3].b; + + pBlock->set_low_color(g_atc_match5[r0].m_hi, g_atc_match5[g0].m_hi, g_pvrtc2_match4[b0].m_hi); + pBlock->set_high_color(g_atc_match5[r1].m_hi, g_atc_match5[g1].m_hi, g_atc_match5[b1].m_hi); + + pBlock->m_modulation[0] = pSelector->m_selectors[0]; + pBlock->m_modulation[1] = pSelector->m_selectors[1]; + pBlock->m_modulation[2] = pSelector->m_selectors[2]; + pBlock->m_modulation[3] = pSelector->m_selectors[3]; + + return; + } + + const uint32_t selector_range_table = g_etc1s_to_atc_selector_range_index[low_selector][high_selector]; + + //[32][8][RANGES][MAPPING] + const etc1s_to_atc_solution* pTable_r = &g_etc1s_to_atc_55[(inten_table * 32 + base_color.r) * (NUM_ETC1S_TO_ATC_SELECTOR_RANGES * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS]; + const etc1s_to_atc_solution* pTable_g = &g_etc1s_to_atc_55[(inten_table * 32 + base_color.g) * (NUM_ETC1S_TO_ATC_SELECTOR_RANGES * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS]; + const etc1s_to_atc_solution* pTable_b = &g_etc1s_to_pvrtc2_45[(inten_table * 32 + base_color.b) * (NUM_ETC1S_TO_ATC_SELECTOR_RANGES * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS) + selector_range_table * NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS]; + + uint32_t best_err = UINT_MAX; + uint32_t best_mapping = 0; + + assert(NUM_ETC1S_TO_ATC_SELECTOR_MAPPINGS == 10); +#define DO_ITER(m) { uint32_t total_err = pTable_r[m].m_err + pTable_g[m].m_err + pTable_b[m].m_err; if (total_err < best_err) { best_err = total_err; best_mapping = m; } } + DO_ITER(0); DO_ITER(1); DO_ITER(2); DO_ITER(3); DO_ITER(4); + DO_ITER(5); DO_ITER(6); DO_ITER(7); DO_ITER(8); DO_ITER(9); +#undef DO_ITER + + pBlock->set_low_color(pTable_r[best_mapping].m_lo, pTable_g[best_mapping].m_lo, pTable_b[best_mapping].m_lo); + pBlock->set_high_color(pTable_r[best_mapping].m_hi, pTable_g[best_mapping].m_hi, pTable_b[best_mapping].m_hi); + + if (ATC_IDENTITY_SELECTOR_MAPPING_INDEX == best_mapping) + { + pBlock->m_modulation[0] = pSelector->m_selectors[0]; + pBlock->m_modulation[1] = pSelector->m_selectors[1]; + pBlock->m_modulation[2] = pSelector->m_selectors[2]; + pBlock->m_modulation[3] = pSelector->m_selectors[3]; + } + else + { + // TODO: We could make this faster using several precomputed 256 entry tables, like ETC1S->BC1 does. + const uint8_t* pSelectors_xlat = &g_etc1s_to_atc_selector_mappings[best_mapping][0]; + + const uint32_t sel_bits0 = pSelector->m_selectors[0]; + const uint32_t sel_bits1 = pSelector->m_selectors[1]; + const uint32_t sel_bits2 = pSelector->m_selectors[2]; + const uint32_t sel_bits3 = pSelector->m_selectors[3]; + + uint32_t sels0 = 0, sels1 = 0, sels2 = 0, sels3 = 0; + +#define DO_X(x) { \ + const uint32_t x_shift = (x) * 2; \ + sels0 |= (pSelectors_xlat[(sel_bits0 >> x_shift) & 3] << x_shift); \ + sels1 |= (pSelectors_xlat[(sel_bits1 >> x_shift) & 3] << x_shift); \ + sels2 |= (pSelectors_xlat[(sel_bits2 >> x_shift) & 3] << x_shift); \ + sels3 |= (pSelectors_xlat[(sel_bits3 >> x_shift) & 3] << x_shift); } + + DO_X(0); + DO_X(1); + DO_X(2); + DO_X(3); +#undef DO_X + + pBlock->m_modulation[0] = (uint8_t)sels0; + pBlock->m_modulation[1] = (uint8_t)sels1; + pBlock->m_modulation[2] = (uint8_t)sels2; + pBlock->m_modulation[3] = (uint8_t)sels3; + } + } + + typedef struct { float c[4]; } vec4F; + + static inline vec4F* vec4F_set_scalar(vec4F* pV, float x) { pV->c[0] = x; pV->c[1] = x; pV->c[2] = x; pV->c[3] = x; return pV; } + static inline vec4F* vec4F_set(vec4F* pV, float x, float y, float z, float w) { pV->c[0] = x; pV->c[1] = y; pV->c[2] = z; pV->c[3] = w; return pV; } + static inline vec4F* vec4F_saturate_in_place(vec4F* pV) { pV->c[0] = saturate(pV->c[0]); pV->c[1] = saturate(pV->c[1]); pV->c[2] = saturate(pV->c[2]); pV->c[3] = saturate(pV->c[3]); return pV; } + static inline vec4F vec4F_saturate(const vec4F* pV) { vec4F res; res.c[0] = saturate(pV->c[0]); res.c[1] = saturate(pV->c[1]); res.c[2] = saturate(pV->c[2]); res.c[3] = saturate(pV->c[3]); return res; } + static inline vec4F vec4F_from_color(const color32* pC) { vec4F res; vec4F_set(&res, pC->c[0], pC->c[1], pC->c[2], pC->c[3]); return res; } + static inline vec4F vec4F_add(const vec4F* pLHS, const vec4F* pRHS) { vec4F res; vec4F_set(&res, pLHS->c[0] + pRHS->c[0], pLHS->c[1] + pRHS->c[1], pLHS->c[2] + pRHS->c[2], pLHS->c[3] + pRHS->c[3]); return res; } + static inline vec4F vec4F_sub(const vec4F* pLHS, const vec4F* pRHS) { vec4F res; vec4F_set(&res, pLHS->c[0] - pRHS->c[0], pLHS->c[1] - pRHS->c[1], pLHS->c[2] - pRHS->c[2], pLHS->c[3] - pRHS->c[3]); return res; } + static inline float vec4F_dot(const vec4F* pLHS, const vec4F* pRHS) { return pLHS->c[0] * pRHS->c[0] + pLHS->c[1] * pRHS->c[1] + pLHS->c[2] * pRHS->c[2] + pLHS->c[3] * pRHS->c[3]; } + static inline vec4F vec4F_mul(const vec4F* pLHS, float s) { vec4F res; vec4F_set(&res, pLHS->c[0] * s, pLHS->c[1] * s, pLHS->c[2] * s, pLHS->c[3] * s); return res; } + static inline vec4F* vec4F_normalize_in_place(vec4F* pV) { float s = pV->c[0] * pV->c[0] + pV->c[1] * pV->c[1] + pV->c[2] * pV->c[2] + pV->c[3] * pV->c[3]; if (s != 0.0f) { s = 1.0f / sqrtf(s); pV->c[0] *= s; pV->c[1] *= s; pV->c[2] *= s; pV->c[3] *= s; } return pV; } + + static color32 convert_rgba_5554_to_8888(const color32& col) + { + return color32((col[0] << 3) | (col[0] >> 2), (col[1] << 3) | (col[1] >> 2), (col[2] << 3) | (col[2] >> 2), (col[3] << 4) | col[3]); + } + + static inline int sq(int x) { return x * x; } + + // PVRTC2 is a slightly borked format for alpha: In Non-Interpolated mode, the way AlphaB8 is exanded from 4 to 8 bits means it can never be 0. + // This is actually very bad, because on 100% transparent blocks which have non-trivial color pixels, part of the color channel will leak into alpha! + // And there's nothing straightforward we can do because using the other modes is too expensive/complex. I can see why Apple didn't adopt it. + static void convert_etc1s_to_pvrtc2_rgba(void* pDst, const endpoint* pEndpoints, const selector* pSelector, const endpoint* pEndpoint_codebook, const selector* pSelector_codebook) + { + pvrtc2_block* pBlock = static_cast(pDst); + + const endpoint& alpha_endpoint = pEndpoint_codebook[((uint16_t*)pBlock)[0]]; + const selector& alpha_selectors = pSelector_codebook[((uint16_t*)pBlock)[1]]; + + pBlock->m_opaque_color_data.m_hard_flag = 1; + pBlock->m_opaque_color_data.m_mod_flag = 0; + pBlock->m_opaque_color_data.m_opaque_flag = 0; + + const int num_unique_alpha_selectors = alpha_selectors.m_num_unique_selectors; + + const color32& alpha_base_color = alpha_endpoint.m_color5; + const uint32_t alpha_inten_table = alpha_endpoint.m_inten5; + + int constant_alpha_val = -1; + + int alpha_block_colors[4]; + decoder_etc_block::get_block_colors5_g(alpha_block_colors, alpha_base_color, alpha_inten_table); + + if (num_unique_alpha_selectors == 1) + { + constant_alpha_val = alpha_block_colors[alpha_selectors.m_lo_selector]; + } + else + { + constant_alpha_val = alpha_block_colors[alpha_selectors.m_lo_selector]; + + for (uint32_t i = alpha_selectors.m_lo_selector + 1; i <= alpha_selectors.m_hi_selector; i++) + { + if (constant_alpha_val != alpha_block_colors[i]) + { + constant_alpha_val = -1; + break; + } + } + } + + if (constant_alpha_val >= 250) + { + // It's opaque enough, so don't bother trying to encode it as an alpha block. + convert_etc1s_to_pvrtc2_rgb(pDst, pEndpoints, pSelector); + return; + } + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + const int num_unique_color_selectors = pSelector->m_num_unique_selectors; + + // We need to reencode the block at the pixel level, unfortunately, from two ETC1S planes. + // Do 4D incremental PCA, project all pixels to this hyperline, then quantize to packed endpoints and compute the modulation values. + const int br = (base_color.r << 3) | (base_color.r >> 2); + const int bg = (base_color.g << 3) | (base_color.g >> 2); + const int bb = (base_color.b << 3) | (base_color.b >> 2); + + color32 block_cols[4]; + for (uint32_t i = 0; i < 4; i++) + { + const int ci = g_etc1_inten_tables[inten_table][i]; + block_cols[i].set_clamped(br + ci, bg + ci, bb + ci, alpha_block_colors[i]); + } + + bool solid_color_block = true; + if (num_unique_color_selectors > 1) + { + for (uint32_t i = low_selector + 1; i <= high_selector; i++) + { + if ((block_cols[low_selector].r != block_cols[i].r) || (block_cols[low_selector].g != block_cols[i].g) || (block_cols[low_selector].b != block_cols[i].b)) + { + solid_color_block = false; + break; + } + } + } + + if ((solid_color_block) && (constant_alpha_val >= 0)) + { + // Constant color/alpha block. + // This is more complex than it may seem because of the way color and alpha are packed in PVRTC2. We need to evaluate mod0, mod1 and mod3 encodings to find the best one. + uint32_t r, g, b; + decoder_etc_block::get_block_color5(base_color, inten_table, low_selector, r, g, b); + + // Mod 0 + uint32_t lr0 = (r * 15 + 128) / 255, lg0 = (g * 15 + 128) / 255, lb0 = (b * 7 + 128) / 255; + uint32_t la0 = g_pvrtc2_alpha_match33_0[constant_alpha_val].m_l; + + uint32_t cr0 = (lr0 << 1) | (lr0 >> 3); + uint32_t cg0 = (lg0 << 1) | (lg0 >> 3); + uint32_t cb0 = (lb0 << 2) | (lb0 >> 1); + uint32_t ca0 = (la0 << 1); + + cr0 = (cr0 << 3) | (cr0 >> 2); + cg0 = (cg0 << 3) | (cg0 >> 2); + cb0 = (cb0 << 3) | (cb0 >> 2); + ca0 = (ca0 << 4) | ca0; + + uint32_t err0 = sq(cr0 - r) + sq(cg0 - g) + sq(cb0 - b) + sq(ca0 - constant_alpha_val) * 2; + + // If the alpha is < 3 or so we're kinda screwed. It's better to have some RGB error than it is to turn a 100% transparent area slightly opaque. + if ((err0 == 0) || (constant_alpha_val < 3)) + { + pBlock->set_trans_low_color(lr0, lg0, lb0, la0); + pBlock->set_trans_high_color(0, 0, 0, 0); + + pBlock->m_modulation[0] = 0; + pBlock->m_modulation[1] = 0; + pBlock->m_modulation[2] = 0; + pBlock->m_modulation[3] = 0; + return; + } + + // Mod 3 + uint32_t lr3 = (r * 15 + 128) / 255, lg3 = (g * 15 + 128) / 255, lb3 = (b * 15 + 128) / 255; + uint32_t la3 = g_pvrtc2_alpha_match33_3[constant_alpha_val].m_l; + + uint32_t cr3 = (lr3 << 1) | (lr3 >> 3); + uint32_t cg3 = (lg3 << 1) | (lg3 >> 3); + uint32_t cb3 = (lb3 << 1) | (lb3 >> 3); + uint32_t ca3 = (la3 << 1) | 1; + + cr3 = (cr3 << 3) | (cr3 >> 2); + cg3 = (cg3 << 3) | (cg3 >> 2); + cb3 = (cb3 << 3) | (cb3 >> 2); + ca3 = (ca3 << 4) | ca3; + + uint32_t err3 = sq(cr3 - r) + sq(cg3 - g) + sq(cb3 - b) + sq(ca3 - constant_alpha_val) * 2; + + // Mod 1 + uint32_t lr1 = g_pvrtc2_trans_match44[r].m_l, lg1 = g_pvrtc2_trans_match44[g].m_l, lb1 = g_pvrtc2_trans_match34[b].m_l; + uint32_t hr1 = g_pvrtc2_trans_match44[r].m_h, hg1 = g_pvrtc2_trans_match44[g].m_h, hb1 = g_pvrtc2_trans_match34[b].m_h; + uint32_t la1 = g_pvrtc2_alpha_match33[constant_alpha_val].m_l, ha1 = g_pvrtc2_alpha_match33[constant_alpha_val].m_h; + + uint32_t clr1 = (lr1 << 1) | (lr1 >> 3); + uint32_t clg1 = (lg1 << 1) | (lg1 >> 3); + uint32_t clb1 = (lb1 << 2) | (lb1 >> 1); + uint32_t cla1 = (la1 << 1); + + clr1 = (clr1 << 3) | (clr1 >> 2); + clg1 = (clg1 << 3) | (clg1 >> 2); + clb1 = (clb1 << 3) | (clb1 >> 2); + cla1 = (cla1 << 4) | cla1; + + uint32_t chr1 = (hr1 << 1) | (hr1 >> 3); + uint32_t chg1 = (hg1 << 1) | (hg1 >> 3); + uint32_t chb1 = (hb1 << 1) | (hb1 >> 3); + uint32_t cha1 = (ha1 << 1) | 1; + + chr1 = (chr1 << 3) | (chr1 >> 2); + chg1 = (chg1 << 3) | (chg1 >> 2); + chb1 = (chb1 << 3) | (chb1 >> 2); + cha1 = (cha1 << 4) | cha1; + + uint32_t r1 = (clr1 * 5 + chr1 * 3) / 8; + uint32_t g1 = (clg1 * 5 + chg1 * 3) / 8; + uint32_t b1 = (clb1 * 5 + chb1 * 3) / 8; + uint32_t a1 = (cla1 * 5 + cha1 * 3) / 8; + + uint32_t err1 = sq(r1 - r) + sq(g1 - g) + sq(b1 - b) + sq(a1 - constant_alpha_val) * 2; + + if ((err1 < err0) && (err1 < err3)) + { + pBlock->set_trans_low_color(lr1, lg1, lb1, la1); + pBlock->set_trans_high_color(hr1, hg1, hb1, ha1); + + pBlock->m_modulation[0] = 0x55; + pBlock->m_modulation[1] = 0x55; + pBlock->m_modulation[2] = 0x55; + pBlock->m_modulation[3] = 0x55; + } + else if (err0 < err3) + { + pBlock->set_trans_low_color(lr0, lg0, lb0, la0); + pBlock->set_trans_high_color(0, 0, 0, 0); + + pBlock->m_modulation[0] = 0; + pBlock->m_modulation[1] = 0; + pBlock->m_modulation[2] = 0; + pBlock->m_modulation[3] = 0; + } + else + { + pBlock->set_trans_low_color(0, 0, 0, 0); + pBlock->set_trans_high_color(lr3, lg3, lb3, la3); + + pBlock->m_modulation[0] = 0xFF; + pBlock->m_modulation[1] = 0xFF; + pBlock->m_modulation[2] = 0xFF; + pBlock->m_modulation[3] = 0xFF; + } + + return; + } + + // It's a complex block with non-solid color and/or alpha pixels. + vec4F minColor, maxColor; + + if (solid_color_block) + { + // It's a solid color block. + uint32_t low_a = block_cols[alpha_selectors.m_lo_selector].a; + uint32_t high_a = block_cols[alpha_selectors.m_hi_selector].a; + + const float S = 1.0f / 255.0f; + vec4F_set(&minColor, block_cols[low_selector].r * S, block_cols[low_selector].g * S, block_cols[low_selector].b * S, low_a * S); + vec4F_set(&maxColor, block_cols[low_selector].r * S, block_cols[low_selector].g * S, block_cols[low_selector].b * S, high_a * S); + } + else if (constant_alpha_val >= 0) + { + // It's a solid alpha block. + const float S = 1.0f / 255.0f; + vec4F_set(&minColor, block_cols[low_selector].r * S, block_cols[low_selector].g * S, block_cols[low_selector].b * S, constant_alpha_val * S); + vec4F_set(&maxColor, block_cols[high_selector].r * S, block_cols[high_selector].g * S, block_cols[high_selector].b * S, constant_alpha_val * S); + } + // See if any of the block colors got clamped - if so the principle axis got distorted (it's no longer just the ETC1S luma axis). + // To keep quality up we need to use full 4D PCA in this case. + else if ((block_cols[low_selector].c[0] == 0) || (block_cols[high_selector].c[0] == 255) || + (block_cols[low_selector].c[1] == 0) || (block_cols[high_selector].c[1] == 255) || + (block_cols[low_selector].c[2] == 0) || (block_cols[high_selector].c[2] == 255) || + (block_cols[alpha_selectors.m_lo_selector].c[3] == 0) || (block_cols[alpha_selectors.m_hi_selector].c[3] == 255)) + { + // Find principle component of RGBA colors treated as 4D vectors. + color32 pixels[16]; + + uint32_t sum_r = 0, sum_g = 0, sum_b = 0, sum_a = 0; + for (uint32_t i = 0; i < 16; i++) + { + color32 rgb(block_cols[pSelector->get_selector(i & 3, i >> 2)]); + uint32_t a = block_cols[alpha_selectors.get_selector(i & 3, i >> 2)].a; + + pixels[i].set(rgb.r, rgb.g, rgb.b, a); + + sum_r += rgb.r; + sum_g += rgb.g; + sum_b += rgb.b; + sum_a += a; + } + + vec4F meanColor; + vec4F_set(&meanColor, (float)sum_r, (float)sum_g, (float)sum_b, (float)sum_a); + vec4F meanColorScaled = vec4F_mul(&meanColor, 1.0f / 16.0f); + + meanColor = vec4F_mul(&meanColor, 1.0f / (float)(16.0f * 255.0f)); + vec4F_saturate_in_place(&meanColor); + + vec4F axis; + vec4F_set_scalar(&axis, 0.0f); + // Why this incremental method? Because it's stable and predictable. Covar+power method can require a lot of iterations to converge in 4D. + for (uint32_t i = 0; i < 16; i++) + { + vec4F color = vec4F_from_color(&pixels[i]); + color = vec4F_sub(&color, &meanColorScaled); + vec4F a = vec4F_mul(&color, color.c[0]); + vec4F b = vec4F_mul(&color, color.c[1]); + vec4F c = vec4F_mul(&color, color.c[2]); + vec4F d = vec4F_mul(&color, color.c[3]); + vec4F n = i ? axis : color; + vec4F_normalize_in_place(&n); + axis.c[0] += vec4F_dot(&a, &n); + axis.c[1] += vec4F_dot(&b, &n); + axis.c[2] += vec4F_dot(&c, &n); + axis.c[3] += vec4F_dot(&d, &n); + } + + vec4F_normalize_in_place(&axis); + + if (vec4F_dot(&axis, &axis) < .5f) + vec4F_set_scalar(&axis, .5f); + + float l = 1e+9f, h = -1e+9f; + + for (uint32_t i = 0; i < 16; i++) + { + vec4F color = vec4F_from_color(&pixels[i]); + + vec4F q = vec4F_sub(&color, &meanColorScaled); + float d = vec4F_dot(&q, &axis); + + l = basisu::minimum(l, d); + h = basisu::maximum(h, d); + } + + l *= (1.0f / 255.0f); + h *= (1.0f / 255.0f); + + vec4F b0 = vec4F_mul(&axis, l); + vec4F b1 = vec4F_mul(&axis, h); + vec4F c0 = vec4F_add(&meanColor, &b0); + vec4F c1 = vec4F_add(&meanColor, &b1); + minColor = vec4F_saturate(&c0); + maxColor = vec4F_saturate(&c1); + if (minColor.c[3] > maxColor.c[3]) + { + // VS 2019 release Code Generator issue + //std::swap(minColor, maxColor); + + float a = minColor.c[0], b = minColor.c[1], c = minColor.c[2], d = minColor.c[3]; + minColor.c[0] = maxColor.c[0]; minColor.c[1] = maxColor.c[1]; minColor.c[2] = maxColor.c[2]; minColor.c[3] = maxColor.c[3]; + minColor.c[0] = maxColor.c[0]; minColor.c[1] = maxColor.c[1]; minColor.c[2] = maxColor.c[2]; minColor.c[3] = maxColor.c[3]; + maxColor.c[0] = a; maxColor.c[1] = b; maxColor.c[2] = c; maxColor.c[3] = d; + } + } + else + { + // We know the RGB axis is luma, because it's an ETC1S block and none of the block colors got clamped. So we only need to use 2D PCA. + // We project each LA vector onto two 2D lines with axes (1,1) and (1,-1) and find the largest projection to determine if axis A is flipped relative to L. + uint32_t block_cols_l[4], block_cols_a[4]; + for (uint32_t i = 0; i < 4; i++) + { + block_cols_l[i] = block_cols[i].r + block_cols[i].g + block_cols[i].b; + block_cols_a[i] = block_cols[i].a * 3; + } + + int p0_min = INT_MAX, p0_max = INT_MIN; + int p1_min = INT_MAX, p1_max = INT_MIN; + for (uint32_t y = 0; y < 4; y++) + { + const uint32_t cs = pSelector->m_selectors[y]; + const uint32_t as = alpha_selectors.m_selectors[y]; + + { + const int l = block_cols_l[cs & 3]; + const int a = block_cols_a[as & 3]; + const int p0 = l + a; p0_min = basisu::minimum(p0_min, p0); p0_max = basisu::maximum(p0_max, p0); + const int p1 = l - a; p1_min = basisu::minimum(p1_min, p1); p1_max = basisu::maximum(p1_max, p1); + } + { + const int l = block_cols_l[(cs >> 2) & 3]; + const int a = block_cols_a[(as >> 2) & 3]; + const int p0 = l + a; p0_min = basisu::minimum(p0_min, p0); p0_max = basisu::maximum(p0_max, p0); + const int p1 = l - a; p1_min = basisu::minimum(p1_min, p1); p1_max = basisu::maximum(p1_max, p1); + } + { + const int l = block_cols_l[(cs >> 4) & 3]; + const int a = block_cols_a[(as >> 4) & 3]; + const int p0 = l + a; p0_min = basisu::minimum(p0_min, p0); p0_max = basisu::maximum(p0_max, p0); + const int p1 = l - a; p1_min = basisu::minimum(p1_min, p1); p1_max = basisu::maximum(p1_max, p1); + } + { + const int l = block_cols_l[cs >> 6]; + const int a = block_cols_a[as >> 6]; + const int p0 = l + a; p0_min = basisu::minimum(p0_min, p0); p0_max = basisu::maximum(p0_max, p0); + const int p1 = l - a; p1_min = basisu::minimum(p1_min, p1); p1_max = basisu::maximum(p1_max, p1); + } + } + + int dist0 = p0_max - p0_min; + int dist1 = p1_max - p1_min; + + const float S = 1.0f / 255.0f; + + vec4F_set(&minColor, block_cols[low_selector].r * S, block_cols[low_selector].g * S, block_cols[low_selector].b * S, block_cols[alpha_selectors.m_lo_selector].a * S); + vec4F_set(&maxColor, block_cols[high_selector].r * S, block_cols[high_selector].g * S, block_cols[high_selector].b * S, block_cols[alpha_selectors.m_hi_selector].a * S); + + // See if the A component of the principle axis is flipped relative to L. If so, we need to flip either RGB or A bounds. + if (dist1 > dist0) + { + std::swap(minColor.c[0], maxColor.c[0]); + std::swap(minColor.c[1], maxColor.c[1]); + std::swap(minColor.c[2], maxColor.c[2]); + } + } + + // 4433 4443 + color32 trialMinColor, trialMaxColor; + + trialMinColor.set_clamped((int)(minColor.c[0] * 15.0f + .5f), (int)(minColor.c[1] * 15.0f + .5f), (int)(minColor.c[2] * 7.0f + .5f), (int)(minColor.c[3] * 7.0f + .5f)); + trialMaxColor.set_clamped((int)(maxColor.c[0] * 15.0f + .5f), (int)(maxColor.c[1] * 15.0f + .5f), (int)(maxColor.c[2] * 15.0f + .5f), (int)(maxColor.c[3] * 7.0f + .5f)); + + pBlock->set_trans_low_color(trialMinColor.r, trialMinColor.g, trialMinColor.b, trialMinColor.a); + pBlock->set_trans_high_color(trialMaxColor.r, trialMaxColor.g, trialMaxColor.b, trialMaxColor.a); + + color32 color_a((trialMinColor.r << 1) | (trialMinColor.r >> 3), (trialMinColor.g << 1) | (trialMinColor.g >> 3), (trialMinColor.b << 2) | (trialMinColor.b >> 1), trialMinColor.a << 1); + color32 color_b((trialMaxColor.r << 1) | (trialMaxColor.r >> 3), (trialMaxColor.g << 1) | (trialMaxColor.g >> 3), (trialMaxColor.b << 1) | (trialMaxColor.b >> 3), (trialMaxColor.a << 1) | 1); + + color32 color0(convert_rgba_5554_to_8888(color_a)); + color32 color3(convert_rgba_5554_to_8888(color_b)); + + const int lr = color0.r; + const int lg = color0.g; + const int lb = color0.b; + const int la = color0.a; + + const int axis_r = color3.r - lr; + const int axis_g = color3.g - lg; + const int axis_b = color3.b - lb; + const int axis_a = color3.a - la; + const int len_a = (axis_r * axis_r) + (axis_g * axis_g) + (axis_b * axis_b) + (axis_a * axis_a); + + const int thresh01 = (len_a * 3) / 16; + const int thresh12 = len_a >> 1; + const int thresh23 = (len_a * 13) / 16; + + if ((axis_r | axis_g | axis_b) == 0) + { + int ca_sel[4]; + + for (uint32_t i = 0; i < 4; i++) + { + int ca = (block_cols[i].a - la) * axis_a; + ca_sel[i] = (ca >= thresh23) + (ca >= thresh12) + (ca >= thresh01); + } + + for (uint32_t y = 0; y < 4; y++) + { + const uint32_t a_sels = alpha_selectors.m_selectors[y]; + + uint32_t sel = ca_sel[a_sels & 3] | (ca_sel[(a_sels >> 2) & 3] << 2) | (ca_sel[(a_sels >> 4) & 3] << 4) | (ca_sel[a_sels >> 6] << 6); + + pBlock->m_modulation[y] = (uint8_t)sel; + } + } + else + { + int cy[4], ca[4]; + + for (uint32_t i = 0; i < 4; i++) + { + cy[i] = (block_cols[i].r - lr) * axis_r + (block_cols[i].g - lg) * axis_g + (block_cols[i].b - lb) * axis_b; + ca[i] = (block_cols[i].a - la) * axis_a; + } + + for (uint32_t y = 0; y < 4; y++) + { + const uint32_t c_sels = pSelector->m_selectors[y]; + const uint32_t a_sels = alpha_selectors.m_selectors[y]; + + const int d0 = cy[c_sels & 3] + ca[a_sels & 3]; + const int d1 = cy[(c_sels >> 2) & 3] + ca[(a_sels >> 2) & 3]; + const int d2 = cy[(c_sels >> 4) & 3] + ca[(a_sels >> 4) & 3]; + const int d3 = cy[c_sels >> 6] + ca[a_sels >> 6]; + + uint32_t sel = ((d0 >= thresh23) + (d0 >= thresh12) + (d0 >= thresh01)) | + (((d1 >= thresh23) + (d1 >= thresh12) + (d1 >= thresh01)) << 2) | + (((d2 >= thresh23) + (d2 >= thresh12) + (d2 >= thresh01)) << 4) | + (((d3 >= thresh23) + (d3 >= thresh12) + (d3 >= thresh01)) << 6); + + pBlock->m_modulation[y] = (uint8_t)sel; + } + } + } + + static void transcoder_init_pvrtc2() + { + for (uint32_t v = 0; v < 256; v++) + { + int best_l = 0, best_h = 0, lowest_err = INT_MAX; + + for (uint32_t l = 0; l < 8; l++) + { + uint32_t le = (l << 1); + le = (le << 4) | le; + + for (uint32_t h = 0; h < 8; h++) + { + uint32_t he = (h << 1) | 1; + he = (he << 4) | he; + + uint32_t m = (le * 5 + he * 3) / 8; + + int err = (int)labs((int)v - (int)m); + if (err < lowest_err) + { + lowest_err = err; + best_l = l; + best_h = h; + } + } + } + + g_pvrtc2_alpha_match33[v].m_l = (uint8_t)best_l; + g_pvrtc2_alpha_match33[v].m_h = (uint8_t)best_h; + } + + for (uint32_t v = 0; v < 256; v++) + { + int best_l = 0, best_h = 0, lowest_err = INT_MAX; + + for (uint32_t l = 0; l < 8; l++) + { + uint32_t le = (l << 1); + le = (le << 4) | le; + + int err = (int)labs((int)v - (int)le); + if (err < lowest_err) + { + lowest_err = err; + best_l = l; + best_h = l; + } + } + + g_pvrtc2_alpha_match33_0[v].m_l = (uint8_t)best_l; + g_pvrtc2_alpha_match33_0[v].m_h = (uint8_t)best_h; + } + + for (uint32_t v = 0; v < 256; v++) + { + int best_l = 0, best_h = 0, lowest_err = INT_MAX; + + for (uint32_t h = 0; h < 8; h++) + { + uint32_t he = (h << 1) | 1; + he = (he << 4) | he; + + int err = (int)labs((int)v - (int)he); + if (err < lowest_err) + { + lowest_err = err; + best_l = h; + best_h = h; + } + } + + g_pvrtc2_alpha_match33_3[v].m_l = (uint8_t)best_l; + g_pvrtc2_alpha_match33_3[v].m_h = (uint8_t)best_h; + } + + for (uint32_t v = 0; v < 256; v++) + { + int best_l = 0, best_h = 0, lowest_err = INT_MAX; + + for (uint32_t l = 0; l < 8; l++) + { + uint32_t le = (l << 2) | (l >> 1); + le = (le << 3) | (le >> 2); + + for (uint32_t h = 0; h < 16; h++) + { + uint32_t he = (h << 1) | (h >> 3); + he = (he << 3) | (he >> 2); + + uint32_t m = (le * 5 + he * 3) / 8; + + int err = (int)labs((int)v - (int)m); + if (err < lowest_err) + { + lowest_err = err; + best_l = l; + best_h = h; + } + } + } + + g_pvrtc2_trans_match34[v].m_l = (uint8_t)best_l; + g_pvrtc2_trans_match34[v].m_h = (uint8_t)best_h; + } + + for (uint32_t v = 0; v < 256; v++) + { + int best_l = 0, best_h = 0, lowest_err = INT_MAX; + + for (uint32_t l = 0; l < 16; l++) + { + uint32_t le = (l << 1) | (l >> 3); + le = (le << 3) | (le >> 2); + + for (uint32_t h = 0; h < 16; h++) + { + uint32_t he = (h << 1) | (h >> 3); + he = (he << 3) | (he >> 2); + + uint32_t m = (le * 5 + he * 3) / 8; + + int err = (int)labs((int)v - (int)m); + if (err < lowest_err) + { + lowest_err = err; + best_l = l; + best_h = h; + } + } + } + + g_pvrtc2_trans_match44[v].m_l = (uint8_t)best_l; + g_pvrtc2_trans_match44[v].m_h = (uint8_t)best_h; + } + } +#endif // BASISD_SUPPORT_PVRTC2 + + basisu_lowlevel_etc1s_transcoder::basisu_lowlevel_etc1s_transcoder() : + m_pGlobal_codebook(nullptr), + m_selector_history_buf_size(0) + { + } + + bool basisu_lowlevel_etc1s_transcoder::decode_palettes( + uint32_t num_endpoints, const uint8_t* pEndpoints_data, uint32_t endpoints_data_size, + uint32_t num_selectors, const uint8_t* pSelectors_data, uint32_t selectors_data_size) + { + if (m_pGlobal_codebook) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 11\n"); + return false; + } + bitwise_decoder sym_codec; + + huffman_decoding_table color5_delta_model0, color5_delta_model1, color5_delta_model2, inten_delta_model; + + if (!sym_codec.init(pEndpoints_data, endpoints_data_size)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 0\n"); + return false; + } + + if (!sym_codec.read_huffman_table(color5_delta_model0)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 1\n"); + return false; + } + + if (!sym_codec.read_huffman_table(color5_delta_model1)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 1a\n"); + return false; + } + + if (!sym_codec.read_huffman_table(color5_delta_model2)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 2a\n"); + return false; + } + + if (!sym_codec.read_huffman_table(inten_delta_model)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 2b\n"); + return false; + } + + if (!color5_delta_model0.is_valid() || !color5_delta_model1.is_valid() || !color5_delta_model2.is_valid() || !inten_delta_model.is_valid()) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 2b\n"); + return false; + } + + const bool endpoints_are_grayscale = sym_codec.get_bits(1) != 0; + + m_local_endpoints.resize(num_endpoints); + + color32 prev_color5(16, 16, 16, 0); + uint32_t prev_inten = 0; + + for (uint32_t i = 0; i < num_endpoints; i++) + { + uint32_t inten_delta = sym_codec.decode_huffman(inten_delta_model); + m_local_endpoints[i].m_inten5 = static_cast((inten_delta + prev_inten) & 7); + prev_inten = m_local_endpoints[i].m_inten5; + + for (uint32_t c = 0; c < (endpoints_are_grayscale ? 1U : 3U); c++) + { + int delta; + if (prev_color5[c] <= basist::COLOR5_PAL0_PREV_HI) + delta = sym_codec.decode_huffman(color5_delta_model0); + else if (prev_color5[c] <= basist::COLOR5_PAL1_PREV_HI) + delta = sym_codec.decode_huffman(color5_delta_model1); + else + delta = sym_codec.decode_huffman(color5_delta_model2); + + int v = (prev_color5[c] + delta) & 31; + + m_local_endpoints[i].m_color5[c] = static_cast(v); + + prev_color5[c] = static_cast(v); + } + + if (endpoints_are_grayscale) + { + m_local_endpoints[i].m_color5[1] = m_local_endpoints[i].m_color5[0]; + m_local_endpoints[i].m_color5[2] = m_local_endpoints[i].m_color5[0]; + } + } + + sym_codec.stop(); + + m_local_selectors.resize(num_selectors); + + if (!sym_codec.init(pSelectors_data, selectors_data_size)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 5\n"); + return false; + } + + basist::huffman_decoding_table delta_selector_pal_model; + + const bool used_global_selector_cb = (sym_codec.get_bits(1) == 1); + + if (used_global_selector_cb) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: global selector codebooks are unsupported\n"); + return false; + } + else + { + const bool used_hybrid_selector_cb = (sym_codec.get_bits(1) == 1); + + if (used_hybrid_selector_cb) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: hybrid global selector codebooks are unsupported\n"); + return false; + } + + const bool used_raw_encoding = (sym_codec.get_bits(1) == 1); + + if (used_raw_encoding) + { + for (uint32_t i = 0; i < num_selectors; i++) + { + for (uint32_t j = 0; j < 4; j++) + { + uint32_t cur_byte = sym_codec.get_bits(8); + + for (uint32_t k = 0; k < 4; k++) + m_local_selectors[i].set_selector(k, j, (cur_byte >> (k * 2)) & 3); + } + + m_local_selectors[i].init_flags(); + } + } + else + { + if (!sym_codec.read_huffman_table(delta_selector_pal_model)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 10\n"); + return false; + } + + if ((num_selectors > 1) && (!delta_selector_pal_model.is_valid())) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_palettes: fail 10a\n"); + return false; + } + + uint8_t prev_bytes[4] = { 0, 0, 0, 0 }; + + for (uint32_t i = 0; i < num_selectors; i++) + { + if (!i) + { + for (uint32_t j = 0; j < 4; j++) + { + uint32_t cur_byte = sym_codec.get_bits(8); + prev_bytes[j] = static_cast(cur_byte); + + for (uint32_t k = 0; k < 4; k++) + m_local_selectors[i].set_selector(k, j, (cur_byte >> (k * 2)) & 3); + } + m_local_selectors[i].init_flags(); + continue; + } + + for (uint32_t j = 0; j < 4; j++) + { + int delta_byte = sym_codec.decode_huffman(delta_selector_pal_model); + + uint32_t cur_byte = delta_byte ^ prev_bytes[j]; + prev_bytes[j] = static_cast(cur_byte); + + for (uint32_t k = 0; k < 4; k++) + m_local_selectors[i].set_selector(k, j, (cur_byte >> (k * 2)) & 3); + } + m_local_selectors[i].init_flags(); + } + } + } + + sym_codec.stop(); + + return true; + } + + bool basisu_lowlevel_etc1s_transcoder::decode_tables(const uint8_t* pTable_data, uint32_t table_data_size) + { + basist::bitwise_decoder sym_codec; + if (!sym_codec.init(pTable_data, table_data_size)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 0\n"); + return false; + } + + if (!sym_codec.read_huffman_table(m_endpoint_pred_model)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 1\n"); + return false; + } + + if (m_endpoint_pred_model.get_code_sizes().size() == 0) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 1a\n"); + return false; + } + + if (!sym_codec.read_huffman_table(m_delta_endpoint_model)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 2\n"); + return false; + } + + if (m_delta_endpoint_model.get_code_sizes().size() == 0) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 2a\n"); + return false; + } + + if (!sym_codec.read_huffman_table(m_selector_model)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 3\n"); + return false; + } + + if (m_selector_model.get_code_sizes().size() == 0) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 3a\n"); + return false; + } + + if (!sym_codec.read_huffman_table(m_selector_history_buf_rle_model)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 4\n"); + return false; + } + + if (m_selector_history_buf_rle_model.get_code_sizes().size() == 0) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 4a\n"); + return false; + } + + m_selector_history_buf_size = sym_codec.get_bits(13); + // Check for bogus values. + if (!m_selector_history_buf_size) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::decode_tables: fail 5\n"); + return false; + } + + sym_codec.stop(); + + return true; + } + + bool basisu_lowlevel_etc1s_transcoder::transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, const bool is_video, const bool is_alpha_slice, const uint32_t level_index, const uint32_t orig_width, const uint32_t orig_height, uint32_t output_row_pitch_in_blocks_or_pixels, + basisu_transcoder_state* pState, bool transcode_alpha, void *pAlpha_blocks, uint32_t output_rows_in_pixels) + { + // 'pDst_blocks' unused when disabling *all* hardware transcode options + // (and 'bc1_allow_threecolor_blocks' when disabling DXT) + BASISU_NOTE_UNUSED(pDst_blocks); + BASISU_NOTE_UNUSED(bc1_allow_threecolor_blocks); + BASISU_NOTE_UNUSED(transcode_alpha); + BASISU_NOTE_UNUSED(pAlpha_blocks); + + assert(g_transcoder_initialized); + if (!g_transcoder_initialized) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: Transcoder not globally initialized.\n"); + return false; + } + + if (!pState) + pState = &m_def_state; + + const uint32_t total_blocks = num_blocks_x * num_blocks_y; + + if (!output_row_pitch_in_blocks_or_pixels) + { + if (basis_block_format_is_uncompressed(fmt)) + output_row_pitch_in_blocks_or_pixels = orig_width; + else + { + if (fmt == block_format::cFXT1_RGB) + output_row_pitch_in_blocks_or_pixels = (orig_width + 7) / 8; + else + output_row_pitch_in_blocks_or_pixels = num_blocks_x; + } + } + + if (basis_block_format_is_uncompressed(fmt)) + { + if (!output_rows_in_pixels) + output_rows_in_pixels = orig_height; + } + + basisu::vector* pPrev_frame_indices = nullptr; + if (is_video) + { + // TODO: Add check to make sure the caller hasn't tried skipping past p-frames + //const bool alpha_flag = (slice_desc.m_flags & cSliceDescFlagsHasAlpha) != 0; + //const uint32_t level_index = slice_desc.m_level_index; + + if (level_index >= basisu_transcoder_state::cMaxPrevFrameLevels) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: unsupported level_index\n"); + return false; + } + + pPrev_frame_indices = &pState->m_prev_frame_indices[is_alpha_slice][level_index]; + if (pPrev_frame_indices->size() < total_blocks) + pPrev_frame_indices->resize(total_blocks); + } + + basist::bitwise_decoder sym_codec; + + if (!sym_codec.init(pImage_data, image_data_size)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: sym_codec.init failed\n"); + return false; + } + + approx_move_to_front selector_history_buf(m_selector_history_buf_size); + + uint32_t cur_selector_rle_count = 0; + + decoder_etc_block block; + memset(&block, 0, sizeof(block)); + + //block.set_flip_bit(true); + // Setting the flip bit to false to be compatible with the Khronos KDFS. + block.set_flip_bit(false); + + block.set_diff_bit(true); + + void* pPVRTC_work_mem = nullptr; + uint32_t* pPVRTC_endpoints = nullptr; + if ((fmt == block_format::cPVRTC1_4_RGB) || (fmt == block_format::cPVRTC1_4_RGBA)) + { + pPVRTC_work_mem = malloc(num_blocks_x * num_blocks_y * (sizeof(decoder_etc_block) + sizeof(uint32_t))); + if (!pPVRTC_work_mem) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: malloc failed\n"); + return false; + } + pPVRTC_endpoints = (uint32_t*) & ((decoder_etc_block*)pPVRTC_work_mem)[num_blocks_x * num_blocks_y]; + } + + if (pState->m_block_endpoint_preds[0].size() < num_blocks_x) + { + pState->m_block_endpoint_preds[0].resize(num_blocks_x); + pState->m_block_endpoint_preds[1].resize(num_blocks_x); + } + + uint32_t cur_pred_bits = 0; + int prev_endpoint_pred_sym = 0; + int endpoint_pred_repeat_count = 0; + uint32_t prev_endpoint_index = 0; + const endpoint_vec& endpoints = m_pGlobal_codebook ? m_pGlobal_codebook->m_local_endpoints : m_local_endpoints; + const selector_vec& selectors = m_pGlobal_codebook ? m_pGlobal_codebook->m_local_selectors : m_local_selectors; + if (!endpoints.size() || !selectors.size()) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: global codebooks must be unpacked first\n"); + return false; + } + + const uint32_t SELECTOR_HISTORY_BUF_FIRST_SYMBOL_INDEX = (uint32_t)selectors.size(); + const uint32_t SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX = m_selector_history_buf_size + SELECTOR_HISTORY_BUF_FIRST_SYMBOL_INDEX; + + for (uint32_t block_y = 0; block_y < num_blocks_y; block_y++) + { + const uint32_t cur_block_endpoint_pred_array = block_y & 1; + + for (uint32_t block_x = 0; block_x < num_blocks_x; block_x++) + { + // Decode endpoint index predictor symbols + if ((block_x & 1) == 0) + { + if ((block_y & 1) == 0) + { + if (endpoint_pred_repeat_count) + { + endpoint_pred_repeat_count--; + cur_pred_bits = prev_endpoint_pred_sym; + } + else + { + cur_pred_bits = sym_codec.decode_huffman(m_endpoint_pred_model); + if (cur_pred_bits == ENDPOINT_PRED_REPEAT_LAST_SYMBOL) + { + endpoint_pred_repeat_count = sym_codec.decode_vlc(ENDPOINT_PRED_COUNT_VLC_BITS) + ENDPOINT_PRED_MIN_REPEAT_COUNT - 1; + + cur_pred_bits = prev_endpoint_pred_sym; + } + else + { + prev_endpoint_pred_sym = cur_pred_bits; + } + } + + pState->m_block_endpoint_preds[cur_block_endpoint_pred_array ^ 1][block_x].m_pred_bits = (uint8_t)(cur_pred_bits >> 4); + } + else + { + cur_pred_bits = pState->m_block_endpoint_preds[cur_block_endpoint_pred_array][block_x].m_pred_bits; + } + } + + // Decode endpoint index + uint32_t endpoint_index, selector_index = 0; + + const uint32_t pred = cur_pred_bits & 3; + cur_pred_bits >>= 2; + + if (pred == 0) + { + // Left + if (!block_x) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: invalid datastream (0)\n"); + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + return false; + } + + endpoint_index = prev_endpoint_index; + } + else if (pred == 1) + { + // Upper + if (!block_y) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: invalid datastream (1)\n"); + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + return false; + } + + endpoint_index = pState->m_block_endpoint_preds[cur_block_endpoint_pred_array ^ 1][block_x].m_endpoint_index; + } + else if (pred == 2) + { + if (is_video) + { + assert(pred == CR_ENDPOINT_PRED_INDEX); + endpoint_index = (*pPrev_frame_indices)[block_x + block_y * num_blocks_x]; + selector_index = endpoint_index >> 16; + endpoint_index &= 0xFFFFU; + } + else + { + // Upper left + if ((!block_x) || (!block_y)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: invalid datastream (2)\n"); + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + return false; + } + + endpoint_index = pState->m_block_endpoint_preds[cur_block_endpoint_pred_array ^ 1][block_x - 1].m_endpoint_index; + } + } + else + { + // Decode and apply delta + const uint32_t delta_sym = sym_codec.decode_huffman(m_delta_endpoint_model); + + endpoint_index = delta_sym + prev_endpoint_index; + if (endpoint_index >= endpoints.size()) + endpoint_index -= (int)endpoints.size(); + } + + pState->m_block_endpoint_preds[cur_block_endpoint_pred_array][block_x].m_endpoint_index = (uint16_t)endpoint_index; + + prev_endpoint_index = endpoint_index; + + // Decode selector index + if ((!is_video) || (pred != CR_ENDPOINT_PRED_INDEX)) + { + int selector_sym; + if (cur_selector_rle_count > 0) + { + cur_selector_rle_count--; + + selector_sym = (int)selectors.size(); + } + else + { + selector_sym = sym_codec.decode_huffman(m_selector_model); + + if (selector_sym == static_cast(SELECTOR_HISTORY_BUF_RLE_SYMBOL_INDEX)) + { + int run_sym = sym_codec.decode_huffman(m_selector_history_buf_rle_model); + + if (run_sym == (SELECTOR_HISTORY_BUF_RLE_COUNT_TOTAL - 1)) + cur_selector_rle_count = sym_codec.decode_vlc(7) + SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH; + else + cur_selector_rle_count = run_sym + SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH; + + if (cur_selector_rle_count > total_blocks) + { + // The file is corrupted or we've got a bug. + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: invalid datastream (3)\n"); + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + return false; + } + + selector_sym = (int)selectors.size(); + + cur_selector_rle_count--; + } + } + + if (selector_sym >= (int)selectors.size()) + { + assert(m_selector_history_buf_size > 0); + + int history_buf_index = selector_sym - (int)selectors.size(); + + if (history_buf_index >= (int)selector_history_buf.size()) + { + // The file is corrupted or we've got a bug. + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: invalid datastream (4)\n"); + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + return false; + } + + selector_index = selector_history_buf[history_buf_index]; + + if (history_buf_index != 0) + selector_history_buf.use(history_buf_index); + } + else + { + selector_index = selector_sym; + + if (m_selector_history_buf_size) + selector_history_buf.add(selector_index); + } + } + + if ((endpoint_index >= endpoints.size()) || (selector_index >= selectors.size())) + { + // The file is corrupted or we've got a bug. + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: invalid datastream (5)\n"); + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + return false; + } + + if (is_video) + (*pPrev_frame_indices)[block_x + block_y * num_blocks_x] = endpoint_index | (selector_index << 16); + +#if BASISD_ENABLE_DEBUG_FLAGS + if ((g_debug_flags & cDebugFlagVisCRs) && ((fmt == block_format::cETC1) || (fmt == block_format::cBC1))) + { + if ((is_video) && (pred == 2)) + { + decoder_etc_block* pDst_block = reinterpret_cast(static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes); + memset(pDst_block, 0xFF, 8); + continue; + } + } +#endif + + const endpoint* pEndpoints = &endpoints[endpoint_index]; + const selector* pSelector = &selectors[selector_index]; + + switch (fmt) + { + case block_format::cETC1: + { + decoder_etc_block* pDst_block = reinterpret_cast(static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes); + + block.set_base5_color(decoder_etc_block::pack_color5(pEndpoints->m_color5, false)); + block.set_inten_table(0, pEndpoints->m_inten5); + block.set_inten_table(1, pEndpoints->m_inten5); + + pDst_block->m_uint32[0] = block.m_uint32[0]; + pDst_block->set_raw_selector_bits(pSelector->m_bytes[0], pSelector->m_bytes[1], pSelector->m_bytes[2], pSelector->m_bytes[3]); + + break; + } + case block_format::cBC1: + { +#if BASISD_SUPPORT_DXT1 + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; +#if BASISD_ENABLE_DEBUG_FLAGS + if (g_debug_flags & (cDebugFlagVisBC1Sels | cDebugFlagVisBC1Endpoints)) + convert_etc1s_to_dxt1_vis(static_cast(pDst_block), pEndpoints, pSelector, bc1_allow_threecolor_blocks); + else +#endif + convert_etc1s_to_dxt1(static_cast(pDst_block), pEndpoints, pSelector, bc1_allow_threecolor_blocks); +#else + assert(0); +#endif + break; + } + case block_format::cBC4: + { +#if BASISD_SUPPORT_DXT5A + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_dxt5a(static_cast(pDst_block), pEndpoints, pSelector); +#else + assert(0); +#endif + break; + } + case block_format::cPVRTC1_4_RGB: + { +#if BASISD_SUPPORT_PVRTC1 + block.set_base5_color(decoder_etc_block::pack_color5(pEndpoints->m_color5, false)); + block.set_inten_table(0, pEndpoints->m_inten5); + block.set_inten_table(1, pEndpoints->m_inten5); + block.set_raw_selector_bits(pSelector->m_bytes[0], pSelector->m_bytes[1], pSelector->m_bytes[2], pSelector->m_bytes[3]); + + ((decoder_etc_block*)pPVRTC_work_mem)[block_x + block_y * num_blocks_x] = block; + + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + + // Get block's RGB bounding box + color32 block_colors[2]; + decoder_etc_block::get_block_colors5_bounds(block_colors, base_color, inten_table, low_selector, high_selector); + + assert(block_colors[0][0] <= block_colors[1][0]); + assert(block_colors[0][1] <= block_colors[1][1]); + assert(block_colors[0][2] <= block_colors[1][2]); + + // Set PVRTC1 endpoints to floor/ceil of bounding box's coordinates. + pvrtc4_block temp; + temp.set_opaque_endpoint_floor(0, block_colors[0]); + temp.set_opaque_endpoint_ceil(1, block_colors[1]); + + pPVRTC_endpoints[block_x + block_y * num_blocks_x] = temp.m_endpoints; +#else + assert(0); +#endif + + break; + } + case block_format::cPVRTC1_4_RGBA: + { +#if BASISD_SUPPORT_PVRTC1 + assert(pAlpha_blocks); + + block.set_base5_color(decoder_etc_block::pack_color5(pEndpoints->m_color5, false)); + block.set_inten_table(0, pEndpoints->m_inten5); + block.set_inten_table(1, pEndpoints->m_inten5); + block.set_raw_selector_bits(pSelector->m_selectors[0], pSelector->m_selectors[1], pSelector->m_selectors[2], pSelector->m_selectors[3]); + + ((decoder_etc_block*)pPVRTC_work_mem)[block_x + block_y * num_blocks_x] = block; + + // Get block's RGBA bounding box + const color32& base_color = pEndpoints->m_color5; + const uint32_t inten_table = pEndpoints->m_inten5; + const uint32_t low_selector = pSelector->m_lo_selector; + const uint32_t high_selector = pSelector->m_hi_selector; + color32 block_colors[2]; + decoder_etc_block::get_block_colors5_bounds(block_colors, base_color, inten_table, low_selector, high_selector); + + assert(block_colors[0][0] <= block_colors[1][0]); + assert(block_colors[0][1] <= block_colors[1][1]); + assert(block_colors[0][2] <= block_colors[1][2]); + + const uint16_t* pAlpha_block = reinterpret_cast(static_cast(pAlpha_blocks) + (block_x + block_y * num_blocks_x) * sizeof(uint32_t)); + + const endpoint* pAlpha_endpoints = &endpoints[pAlpha_block[0]]; + const selector* pAlpha_selector = &selectors[pAlpha_block[1]]; + + const color32& alpha_base_color = pAlpha_endpoints->m_color5; + const uint32_t alpha_inten_table = pAlpha_endpoints->m_inten5; + const uint32_t alpha_low_selector = pAlpha_selector->m_lo_selector; + const uint32_t alpha_high_selector = pAlpha_selector->m_hi_selector; + uint32_t alpha_block_colors[2]; + decoder_etc_block::get_block_colors5_bounds_g(alpha_block_colors, alpha_base_color, alpha_inten_table, alpha_low_selector, alpha_high_selector); + assert(alpha_block_colors[0] <= alpha_block_colors[1]); + block_colors[0].a = (uint8_t)alpha_block_colors[0]; + block_colors[1].a = (uint8_t)alpha_block_colors[1]; + + // Set PVRTC1 endpoints to floor/ceil of bounding box's coordinates. + pvrtc4_block temp; + temp.set_endpoint_floor(0, block_colors[0]); + temp.set_endpoint_ceil(1, block_colors[1]); + + pPVRTC_endpoints[block_x + block_y * num_blocks_x] = temp.m_endpoints; +#else + assert(0); +#endif + + break; + } + case block_format::cBC7: // for more consistency with UASTC + case block_format::cBC7_M5_COLOR: + { +#if BASISD_SUPPORT_BC7_MODE5 + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_bc7_m5_color(pDst_block, pEndpoints, pSelector); +#else + assert(0); +#endif + break; + } + case block_format::cBC7_M5_ALPHA: + { +#if BASISD_SUPPORT_BC7_MODE5 + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_bc7_m5_alpha(pDst_block, pEndpoints, pSelector); +#else + assert(0); +#endif + break; + } + case block_format::cETC2_EAC_A8: + { +#if BASISD_SUPPORT_ETC2_EAC_A8 + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_etc2_eac_a8(static_cast(pDst_block), pEndpoints, pSelector); +#else + assert(0); +#endif + break; + } + case block_format::cASTC_4x4: + { +#if BASISD_SUPPORT_ASTC + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_astc_4x4(pDst_block, pEndpoints, pSelector, transcode_alpha, &endpoints[0], &selectors[0]); +#else + assert(0); +#endif + break; + } + case block_format::cATC_RGB: + { +#if BASISD_SUPPORT_ATC + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_atc(pDst_block, pEndpoints, pSelector); +#else + assert(0); +#endif + break; + } + case block_format::cFXT1_RGB: + { +#if BASISD_SUPPORT_FXT1 + const uint32_t fxt1_block_x = block_x >> 1; + const uint32_t fxt1_block_y = block_y; + const uint32_t fxt1_subblock = block_x & 1; + + void* pDst_block = static_cast(pDst_blocks) + (fxt1_block_x + fxt1_block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + + convert_etc1s_to_fxt1(pDst_block, pEndpoints, pSelector, fxt1_subblock); +#else + assert(0); +#endif + break; + } + case block_format::cPVRTC2_4_RGB: + { +#if BASISD_SUPPORT_PVRTC2 + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_pvrtc2_rgb(pDst_block, pEndpoints, pSelector); +#endif + break; + } + case block_format::cPVRTC2_4_RGBA: + { +#if BASISD_SUPPORT_PVRTC2 + assert(transcode_alpha); + + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + + convert_etc1s_to_pvrtc2_rgba(pDst_block, pEndpoints, pSelector, &endpoints[0], &selectors[0]); +#endif + break; + } + case block_format::cIndices: + { + uint16_t* pDst_block = reinterpret_cast(static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes); + pDst_block[0] = static_cast(endpoint_index); + pDst_block[1] = static_cast(selector_index); + break; + } + case block_format::cA32: + { + assert(sizeof(uint32_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint32_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + int colors[4]; + decoder_etc_block::get_block_colors5_g(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + if (max_x == 4) + { + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + pDst_pixels[3] = static_cast(colors[s & 3]); + pDst_pixels[3+4] = static_cast(colors[(s >> 2) & 3]); + pDst_pixels[3+8] = static_cast(colors[(s >> 4) & 3]); + pDst_pixels[3+12] = static_cast(colors[(s >> 6) & 3]); + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint32_t); + } + } + else + { + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + pDst_pixels[3 + 4 * x] = static_cast(colors[(s >> (x * 2)) & 3]); + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint32_t); + } + } + + break; + } + case block_format::cRGB32: + { + assert(sizeof(uint32_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint32_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + color32 colors[4]; + decoder_etc_block::get_block_colors5(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + { + const color32& c = colors[(s >> (x * 2)) & 3]; + + pDst_pixels[0 + 4 * x] = c.r; + pDst_pixels[1 + 4 * x] = c.g; + pDst_pixels[2 + 4 * x] = c.b; + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint32_t); + } + + break; + } + case block_format::cRGBA32: + { + assert(sizeof(uint32_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint32_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + color32 colors[4]; + decoder_etc_block::get_block_colors5(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + { + const color32& c = colors[(s >> (x * 2)) & 3]; + + pDst_pixels[0 + 4 * x] = c.r; + pDst_pixels[1 + 4 * x] = c.g; + pDst_pixels[2 + 4 * x] = c.b; + pDst_pixels[3 + 4 * x] = 255; + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint32_t); + } + + break; + } + case block_format::cRGB565: + case block_format::cBGR565: + { + assert(sizeof(uint16_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint16_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + color32 colors[4]; + decoder_etc_block::get_block_colors5(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + uint16_t packed_colors[4]; + if (fmt == block_format::cRGB565) + { + for (uint32_t i = 0; i < 4; i++) + { + packed_colors[i] = static_cast((mul_8(colors[i].r, 31) << 11) | (mul_8(colors[i].g, 63) << 5) | mul_8(colors[i].b, 31)); + if (BASISD_IS_BIG_ENDIAN) + packed_colors[i] = byteswap_uint16(packed_colors[i]); + } + } + else + { + for (uint32_t i = 0; i < 4; i++) + { + packed_colors[i] = static_cast((mul_8(colors[i].b, 31) << 11) | (mul_8(colors[i].g, 63) << 5) | mul_8(colors[i].r, 31)); + if (BASISD_IS_BIG_ENDIAN) + packed_colors[i] = byteswap_uint16(packed_colors[i]); + } + } + + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + reinterpret_cast(pDst_pixels)[x] = packed_colors[(s >> (x * 2)) & 3]; + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint16_t); + } + + break; + } + case block_format::cRGBA4444_COLOR: + { + assert(sizeof(uint16_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint16_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + color32 colors[4]; + decoder_etc_block::get_block_colors5(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + uint16_t packed_colors[4]; + for (uint32_t i = 0; i < 4; i++) + { + packed_colors[i] = static_cast((mul_8(colors[i].r, 15) << 12) | (mul_8(colors[i].g, 15) << 8) | (mul_8(colors[i].b, 15) << 4)); + } + + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + { + uint16_t cur = reinterpret_cast(pDst_pixels)[x]; + if (BASISD_IS_BIG_ENDIAN) + cur = byteswap_uint16(cur); + + cur = (cur & 0xF) | packed_colors[(s >> (x * 2)) & 3]; + + if (BASISD_IS_BIG_ENDIAN) + cur = byteswap_uint16(cur); + + reinterpret_cast(pDst_pixels)[x] = cur; + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint16_t); + } + + break; + } + case block_format::cRGBA4444_COLOR_OPAQUE: + { + assert(sizeof(uint16_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint16_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + color32 colors[4]; + decoder_etc_block::get_block_colors5(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + uint16_t packed_colors[4]; + for (uint32_t i = 0; i < 4; i++) + { + packed_colors[i] = static_cast((mul_8(colors[i].r, 15) << 12) | (mul_8(colors[i].g, 15) << 8) | (mul_8(colors[i].b, 15) << 4) | 0xF); + if (BASISD_IS_BIG_ENDIAN) + packed_colors[i] = byteswap_uint16(packed_colors[i]); + } + + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + reinterpret_cast(pDst_pixels)[x] = packed_colors[(s >> (x * 2)) & 3]; + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint16_t); + } + + break; + } + case block_format::cRGBA4444_ALPHA: + { + assert(sizeof(uint16_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint16_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + color32 colors[4]; + decoder_etc_block::get_block_colors5(colors, pEndpoints->m_color5, pEndpoints->m_inten5); + + uint16_t packed_colors[4]; + for (uint32_t i = 0; i < 4; i++) + { + packed_colors[i] = mul_8(colors[i].g, 15); + if (BASISD_IS_BIG_ENDIAN) + packed_colors[i] = byteswap_uint16(packed_colors[i]); + } + + for (uint32_t y = 0; y < max_y; y++) + { + const uint32_t s = pSelector->m_selectors[y]; + + for (uint32_t x = 0; x < max_x; x++) + { + reinterpret_cast(pDst_pixels)[x] = packed_colors[(s >> (x * 2)) & 3]; + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint16_t); + } + + break; + } + case block_format::cETC2_EAC_R11: + { +#if BASISD_SUPPORT_ETC2_EAC_RG11 + void* pDst_block = static_cast(pDst_blocks) + (block_x + block_y * output_row_pitch_in_blocks_or_pixels) * output_block_or_pixel_stride_in_bytes; + convert_etc1s_to_etc2_eac_r11(static_cast(pDst_block), pEndpoints, pSelector); +#else + assert(0); +#endif + break; + } + default: + { + assert(0); + break; + } + } + + } // block_x + + } // block-y + + if (endpoint_pred_repeat_count != 0) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_slice: endpoint_pred_repeat_count != 0. The file is corrupted or this is a bug\n"); + return false; + } + + //assert(endpoint_pred_repeat_count == 0); + +#if BASISD_SUPPORT_PVRTC1 + // PVRTC post process - create per-pixel modulation values. + if (fmt == block_format::cPVRTC1_4_RGB) + fixup_pvrtc1_4_modulation_rgb((decoder_etc_block*)pPVRTC_work_mem, pPVRTC_endpoints, pDst_blocks, num_blocks_x, num_blocks_y); + else if (fmt == block_format::cPVRTC1_4_RGBA) + fixup_pvrtc1_4_modulation_rgba((decoder_etc_block*)pPVRTC_work_mem, pPVRTC_endpoints, pDst_blocks, num_blocks_x, num_blocks_y, pAlpha_blocks, &endpoints[0], &selectors[0]); +#endif // BASISD_SUPPORT_PVRTC1 + + if (pPVRTC_work_mem) + free(pPVRTC_work_mem); + + return true; + } + + bool basis_validate_output_buffer_size(transcoder_texture_format target_format, + uint32_t output_blocks_buf_size_in_blocks_or_pixels, + uint32_t orig_width, uint32_t orig_height, + uint32_t output_row_pitch_in_blocks_or_pixels, + uint32_t output_rows_in_pixels, + uint32_t total_slice_blocks) + { + if (basis_transcoder_format_is_uncompressed(target_format)) + { + // Assume the output buffer is orig_width by orig_height + if (!output_row_pitch_in_blocks_or_pixels) + output_row_pitch_in_blocks_or_pixels = orig_width; + + if (!output_rows_in_pixels) + output_rows_in_pixels = orig_height; + + // Now make sure the output buffer is large enough, or we'll overwrite memory. + if (output_blocks_buf_size_in_blocks_or_pixels < (output_rows_in_pixels * output_row_pitch_in_blocks_or_pixels)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: output_blocks_buf_size_in_blocks_or_pixels < (output_rows_in_pixels * output_row_pitch_in_blocks_or_pixels)\n"); + return false; + } + } + else if (target_format == transcoder_texture_format::cTFFXT1_RGB) + { + const uint32_t num_blocks_fxt1_x = (orig_width + 7) / 8; + const uint32_t num_blocks_fxt1_y = (orig_height + 3) / 4; + const uint32_t total_blocks_fxt1 = num_blocks_fxt1_x * num_blocks_fxt1_y; + + if (output_blocks_buf_size_in_blocks_or_pixels < total_blocks_fxt1) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: output_blocks_buf_size_in_blocks_or_pixels < total_blocks_fxt1\n"); + return false; + } + } + else + { + if (output_blocks_buf_size_in_blocks_or_pixels < total_slice_blocks) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: output_blocks_buf_size_in_blocks_or_pixels < transcode_image\n"); + return false; + } + } + return true; + } + + bool basisu_lowlevel_etc1s_transcoder::transcode_image( + transcoder_texture_format target_format, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + const uint8_t* pCompressed_data, uint32_t compressed_data_length, + uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, + uint32_t rgb_offset, uint32_t rgb_length, uint32_t alpha_offset, uint32_t alpha_length, + uint32_t decode_flags, + bool basis_file_has_alpha_slices, + bool is_video, + uint32_t output_row_pitch_in_blocks_or_pixels, + basisu_transcoder_state* pState, + uint32_t output_rows_in_pixels) + { + if (((uint64_t)rgb_offset + rgb_length) > (uint64_t)compressed_data_length) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: source data buffer too small (color)\n"); + return false; + } + + if (alpha_length) + { + if (((uint64_t)alpha_offset + alpha_length) > (uint64_t)compressed_data_length) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: source data buffer too small (alpha)\n"); + return false; + } + } + else + { + assert(!basis_file_has_alpha_slices); + } + + if ((target_format == transcoder_texture_format::cTFPVRTC1_4_RGB) || (target_format == transcoder_texture_format::cTFPVRTC1_4_RGBA)) + { + if ((!basisu::is_pow2(num_blocks_x * 4)) || (!basisu::is_pow2(num_blocks_y * 4))) + { + // PVRTC1 only supports power of 2 dimensions + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: PVRTC1 only supports power of 2 dimensions\n"); + return false; + } + } + + if ((target_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) && (!basis_file_has_alpha_slices)) + { + // Switch to PVRTC1 RGB if the input doesn't have alpha. + target_format = transcoder_texture_format::cTFPVRTC1_4_RGB; + } + + const bool transcode_alpha_data_to_opaque_formats = (decode_flags & cDecodeFlagsTranscodeAlphaDataToOpaqueFormats) != 0; + const uint32_t bytes_per_block_or_pixel = basis_get_bytes_per_block_or_pixel(target_format); + const uint32_t total_slice_blocks = num_blocks_x * num_blocks_y; + + if (!basis_validate_output_buffer_size(target_format, output_blocks_buf_size_in_blocks_or_pixels, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, output_rows_in_pixels, total_slice_blocks)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: output buffer size too small\n"); + return false; + } + + bool status = false; + + const uint8_t* pData = pCompressed_data + rgb_offset; + uint32_t data_len = rgb_length; + bool is_alpha_slice = false; + + // If the caller wants us to transcode the mip level's alpha data, then use the next slice. + if ((basis_file_has_alpha_slices) && (transcode_alpha_data_to_opaque_formats)) + { + pData = pCompressed_data + alpha_offset; + data_len = alpha_length; + is_alpha_slice = true; + } + + switch (target_format) + { + case transcoder_texture_format::cTFETC1_RGB: + { + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC1, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cETC1, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ETC1 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBC1_RGB: + { +#if !BASISD_SUPPORT_DXT1 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: BC1/DXT1 unsupported\n"); + return false; +#else + // status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC1, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cBC1, bytes_per_block_or_pixel, true, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC1 failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFBC4_R: + { +#if !BASISD_SUPPORT_DXT5A + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: BC4/DXT5A unsupported\n"); + return false; +#else + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC4, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cBC4, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC4 failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFPVRTC1_4_RGB: + { +#if !BASISD_SUPPORT_PVRTC1 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: PVRTC1 4 unsupported\n"); + return false; +#else + // output_row_pitch_in_blocks_or_pixels is actually ignored because we're transcoding to PVRTC1. (Print a dev warning if it's != 0?) + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC1_4_RGB, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cPVRTC1_4_RGB, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to PVRTC1 4 RGB failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFPVRTC1_4_RGBA: + { +#if !BASISD_SUPPORT_PVRTC1 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: PVRTC1 4 unsupported\n"); + return false; +#else + assert(basis_file_has_alpha_slices); + assert(alpha_length); + + // Temp buffer to hold alpha block endpoint/selector indices + basisu::vector temp_block_indices(total_slice_blocks); + + // First transcode alpha data to temp buffer + //status = transcode_slice(pData, data_size, slice_index + 1, &temp_block_indices[0], total_slice_blocks, block_format::cIndices, sizeof(uint32_t), decode_flags, pSlice_descs[slice_index].m_num_blocks_x, pState); + status = transcode_slice(&temp_block_indices[0], num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cIndices, sizeof(uint32_t), false, is_video, true, level_index, orig_width, orig_height, num_blocks_x, pState, false, nullptr, 0); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to PVRTC1 4 RGBA failed (0)\n"); + } + else + { + // output_row_pitch_in_blocks_or_pixels is actually ignored because we're transcoding to PVRTC1. (Print a dev warning if it's != 0?) + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC1_4_RGBA, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState, &temp_block_indices[0]); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cPVRTC1_4_RGBA, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, &temp_block_indices[0], 0); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to PVRTC1 4 RGBA failed (1)\n"); + } + } + + break; +#endif + } + case transcoder_texture_format::cTFBC7_RGBA: + case transcoder_texture_format::cTFBC7_ALT: + { +#if !BASISD_SUPPORT_BC7_MODE5 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: BC7 unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + // We used to support transcoding just alpha to BC7 - but is that useful at all? + + // First transcode the color slice. The cBC7_M5_COLOR transcoder will output opaque mode 5 blocks. + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC7_M5_COLOR, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cBC7_M5_COLOR, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + + if ((status) && (basis_file_has_alpha_slices)) + { + // Now transcode the alpha slice. The cBC7_M5_ALPHA transcoder will now change the opaque mode 5 blocks to blocks with alpha. + //status = transcode_slice(pData, data_size, slice_index + 1, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC7_M5_ALPHA, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cBC7_M5_ALPHA, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + } + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC7 failed (0)\n"); + } + + break; +#endif + } + case transcoder_texture_format::cTFETC2_RGBA: + { +#if !BASISD_SUPPORT_ETC2_EAC_A8 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: ETC2 EAC A8 unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + + if (basis_file_has_alpha_slices) + { + // First decode the alpha data + //status = transcode_slice(pData, data_size, slice_index + 1, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_A8, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cETC2_EAC_A8, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + } + else + { + //write_opaque_alpha_blocks(pSlice_descs[slice_index].m_num_blocks_x, pSlice_descs[slice_index].m_num_blocks_y, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_A8, 16, output_row_pitch_in_blocks_or_pixels); + basisu_transcoder::write_opaque_alpha_blocks(num_blocks_x, num_blocks_y, pOutput_blocks, block_format::cETC2_EAC_A8, 16, output_row_pitch_in_blocks_or_pixels); + status = true; + } + + if (status) + { + // Now decode the color data + //status = transcode_slice(pData, data_size, slice_index, (uint8_t*)pOutput_blocks + 8, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC1, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice((uint8_t *)pOutput_blocks + 8, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cETC1, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ETC2 RGB failed\n"); + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ETC2 A failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFBC3_RGBA: + { +#if !BASISD_SUPPORT_DXT1 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: DXT1 unsupported\n"); + return false; +#elif !BASISD_SUPPORT_DXT5A + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: DXT5A unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + + // First decode the alpha data + if (basis_file_has_alpha_slices) + { + //status = transcode_slice(pData, data_size, slice_index + 1, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC4, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cBC4, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + } + else + { + basisu_transcoder::write_opaque_alpha_blocks(num_blocks_x, num_blocks_y, pOutput_blocks, block_format::cBC4, 16, output_row_pitch_in_blocks_or_pixels); + status = true; + } + + if (status) + { + // Now decode the color data. Forbid 3 color blocks, which aren't allowed in BC3. + //status = transcode_slice(pData, data_size, slice_index, (uint8_t*)pOutput_blocks + 8, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC1, 16, decode_flags | cDecodeFlagsBC1ForbidThreeColorBlocks, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice((uint8_t *)pOutput_blocks + 8, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cBC1, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC3 RGB failed\n"); + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC3 A failed\n"); + } + + break; +#endif + } + case transcoder_texture_format::cTFBC5_RG: + { +#if !BASISD_SUPPORT_DXT5A + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: DXT5A unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + + //bool transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + // uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, const bool is_video, const bool is_alpha_slice, const uint32_t level_index, const uint32_t orig_width, const uint32_t orig_height, uint32_t output_row_pitch_in_blocks_or_pixels = 0, + // basisu_transcoder_state* pState = nullptr, bool astc_transcode_alpha = false, void* pAlpha_blocks = nullptr, uint32_t output_rows_in_pixels = 0); + + // Decode the R data (actually the green channel of the color data slice in the basis file) + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC4, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cBC4, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (status) + { + if (basis_file_has_alpha_slices) + { + // Decode the G data (actually the green channel of the alpha data slice in the basis file) + //status = transcode_slice(pData, data_size, slice_index + 1, (uint8_t*)pOutput_blocks + 8, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC4, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice((uint8_t *)pOutput_blocks + 8, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cBC4, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC5 1 failed\n"); + } + } + else + { + basisu_transcoder::write_opaque_alpha_blocks(num_blocks_x, num_blocks_y, (uint8_t*)pOutput_blocks + 8, block_format::cBC4, 16, output_row_pitch_in_blocks_or_pixels); + status = true; + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to BC5 channel 0 failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFASTC_4x4_RGBA: + { +#if !BASISD_SUPPORT_ASTC + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: ASTC unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + + if (basis_file_has_alpha_slices) + { + // First decode the alpha data to the output (we're using the output texture as a temp buffer here). + //status = transcode_slice(pData, data_size, slice_index + 1, (uint8_t*)pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cIndices, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cIndices, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (status) + { + // Now decode the color data and transcode to ASTC. The transcoder function will read the alpha selector data from the output texture as it converts and + // transcode both the alpha and color data at the same time to ASTC. + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cASTC_4x4, 16, decode_flags | cDecodeFlagsOutputHasAlphaIndices, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cASTC_4x4, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, true, nullptr, output_rows_in_pixels); + } + } + else + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cASTC_4x4, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cASTC_4x4, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ASTC failed (0)\n"); + } + + break; +#endif + } + case transcoder_texture_format::cTFATC_RGB: + { +#if !BASISD_SUPPORT_ATC + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: ATC unsupported\n"); + return false; +#else + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cATC_RGB, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cATC_RGB, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ATC_RGB failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFATC_RGBA: + { +#if !BASISD_SUPPORT_ATC + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: ATC unsupported\n"); + return false; +#elif !BASISD_SUPPORT_DXT5A + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: DXT5A unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + + // First decode the alpha data + if (basis_file_has_alpha_slices) + { + //status = transcode_slice(pData, data_size, slice_index + 1, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC4, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cBC4, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + } + else + { + basisu_transcoder::write_opaque_alpha_blocks(num_blocks_x, num_blocks_y, pOutput_blocks, block_format::cBC4, 16, output_row_pitch_in_blocks_or_pixels); + status = true; + } + + if (status) + { + //status = transcode_slice(pData, data_size, slice_index, (uint8_t*)pOutput_blocks + 8, output_blocks_buf_size_in_blocks_or_pixels, block_format::cATC_RGB, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice((uint8_t *)pOutput_blocks + 8, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cATC_RGB, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ATC RGB failed\n"); + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ATC A failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFPVRTC2_4_RGB: + { +#if !BASISD_SUPPORT_PVRTC2 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: PVRTC2 unsupported\n"); + return false; +#else + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC2_4_RGB, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cPVRTC2_4_RGB, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to cPVRTC2_4_RGB failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFPVRTC2_4_RGBA: + { +#if !BASISD_SUPPORT_PVRTC2 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: PVRTC2 unsupported\n"); + return false; +#else + if (basis_file_has_alpha_slices) + { + // First decode the alpha data to the output (we're using the output texture as a temp buffer here). + //status = transcode_slice(pData, data_size, slice_index + 1, (uint8_t*)pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cIndices, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cIndices, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to failed\n"); + } + else + { + // Now decode the color data and transcode to PVRTC2 RGBA. + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC2_4_RGBA, bytes_per_block_or_pixel, decode_flags | cDecodeFlagsOutputHasAlphaIndices, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cPVRTC2_4_RGBA, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, true, nullptr, output_rows_in_pixels); + } + } + else + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC2_4_RGB, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cPVRTC2_4_RGB, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to cPVRTC2_4_RGBA failed\n"); + } + + break; +#endif + } + case transcoder_texture_format::cTFRGBA32: + { + // Raw 32bpp pixels, decoded in the usual raster order (NOT block order) into an image in memory. + + // First decode the alpha data + if (basis_file_has_alpha_slices) + //status = transcode_slice(pData, data_size, slice_index + 1, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cA32, sizeof(uint32_t), decode_flags, output_row_pitch_in_blocks_or_pixels, pState, nullptr, output_rows_in_pixels); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cA32, sizeof(uint32_t), false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + else + status = true; + + if (status) + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, basis_file_has_alpha_slices ? block_format::cRGB32 : block_format::cRGBA32, sizeof(uint32_t), decode_flags, output_row_pitch_in_blocks_or_pixels, pState, nullptr, output_rows_in_pixels); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, basis_file_has_alpha_slices ? block_format::cRGB32 : block_format::cRGBA32, sizeof(uint32_t), false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to RGBA32 RGB failed\n"); + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to RGBA32 A failed\n"); + } + + break; + } + case transcoder_texture_format::cTFRGB565: + case transcoder_texture_format::cTFBGR565: + { + // Raw 16bpp pixels, decoded in the usual raster order (NOT block order) into an image in memory. + + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, (fmt == transcoder_texture_format::cTFRGB565) ? block_format::cRGB565 : block_format::cBGR565, sizeof(uint16_t), decode_flags, output_row_pitch_in_blocks_or_pixels, pState, nullptr, output_rows_in_pixels); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, (target_format == transcoder_texture_format::cTFRGB565) ? block_format::cRGB565 : block_format::cBGR565, sizeof(uint16_t), false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to RGB565 RGB failed\n"); + } + + break; + } + case transcoder_texture_format::cTFRGBA4444: + { + // Raw 16bpp pixels, decoded in the usual raster order (NOT block order) into an image in memory. + + // First decode the alpha data + if (basis_file_has_alpha_slices) + //status = transcode_slice(pData, data_size, slice_index + 1, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cRGBA4444_ALPHA, sizeof(uint16_t), decode_flags, output_row_pitch_in_blocks_or_pixels, pState, nullptr, output_rows_in_pixels); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cRGBA4444_ALPHA, sizeof(uint16_t), false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + else + status = true; + + if (status) + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, basis_file_has_alpha_slices ? block_format::cRGBA4444_COLOR : block_format::cRGBA4444_COLOR_OPAQUE, sizeof(uint16_t), decode_flags, output_row_pitch_in_blocks_or_pixels, pState, nullptr, output_rows_in_pixels); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, basis_file_has_alpha_slices ? block_format::cRGBA4444_COLOR : block_format::cRGBA4444_COLOR_OPAQUE, sizeof(uint16_t), false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to RGBA4444 RGB failed\n"); + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to RGBA4444 A failed\n"); + } + + break; + } + case transcoder_texture_format::cTFFXT1_RGB: + { +#if !BASISD_SUPPORT_FXT1 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: FXT1 unsupported\n"); + return false; +#else + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cFXT1_RGB, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cFXT1_RGB, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to FXT1_RGB failed\n"); + } + break; +#endif + } + case transcoder_texture_format::cTFETC2_EAC_R11: + { +#if !BASISD_SUPPORT_ETC2_EAC_RG11 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: EAC_RG11 unsupported\n"); + return false; +#else + //status = transcode_slice(pData, data_size, slice_index_to_decode, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_R11, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pData, data_len, block_format::cETC2_EAC_R11, bytes_per_block_or_pixel, false, is_video, is_alpha_slice, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ETC2_EAC_R11 failed\n"); + } + + break; +#endif + } + case transcoder_texture_format::cTFETC2_EAC_RG11: + { +#if !BASISD_SUPPORT_ETC2_EAC_RG11 + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: EAC_RG11 unsupported\n"); + return false; +#else + assert(bytes_per_block_or_pixel == 16); + + if (basis_file_has_alpha_slices) + { + // First decode the alpha data to G + //status = transcode_slice(pData, data_size, slice_index + 1, (uint8_t*)pOutput_blocks + 8, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_R11, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice((uint8_t *)pOutput_blocks + 8, num_blocks_x, num_blocks_y, pCompressed_data + alpha_offset, alpha_length, block_format::cETC2_EAC_R11, bytes_per_block_or_pixel, false, is_video, true, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + } + else + { + basisu_transcoder::write_opaque_alpha_blocks(num_blocks_x, num_blocks_y, (uint8_t*)pOutput_blocks + 8, block_format::cETC2_EAC_R11, 16, output_row_pitch_in_blocks_or_pixels); + status = true; + } + + if (status) + { + // Now decode the color data to R + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_R11, 16, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + rgb_offset, rgb_length, block_format::cETC2_EAC_R11, bytes_per_block_or_pixel, false, is_video, false, level_index, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, false, nullptr, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ETC2_EAC_R11 R failed\n"); + } + } + else + { + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: transcode_slice() to ETC2_EAC_R11 G failed\n"); + } + + break; +#endif + } + default: + { + assert(0); + BASISU_DEVEL_ERROR("basisu_lowlevel_etc1s_transcoder::transcode_image: Invalid fmt\n"); + break; + } + } + + return status; + } + + basisu_lowlevel_uastc_transcoder::basisu_lowlevel_uastc_transcoder() + { + } + + bool basisu_lowlevel_uastc_transcoder::transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, bool has_alpha, const uint32_t orig_width, const uint32_t orig_height, uint32_t output_row_pitch_in_blocks_or_pixels, + basisu_transcoder_state* pState, uint32_t output_rows_in_pixels, int channel0, int channel1, uint32_t decode_flags) + { + BASISU_NOTE_UNUSED(pState); + BASISU_NOTE_UNUSED(bc1_allow_threecolor_blocks); + + assert(g_transcoder_initialized); + if (!g_transcoder_initialized) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_slice: Transcoder not globally initialized.\n"); + return false; + } + +#if BASISD_SUPPORT_UASTC + const uint32_t total_blocks = num_blocks_x * num_blocks_y; + + if (!output_row_pitch_in_blocks_or_pixels) + { + if (basis_block_format_is_uncompressed(fmt)) + output_row_pitch_in_blocks_or_pixels = orig_width; + else + { + if (fmt == block_format::cFXT1_RGB) + output_row_pitch_in_blocks_or_pixels = (orig_width + 7) / 8; + else + output_row_pitch_in_blocks_or_pixels = num_blocks_x; + } + } + + if (basis_block_format_is_uncompressed(fmt)) + { + if (!output_rows_in_pixels) + output_rows_in_pixels = orig_height; + } + + uint32_t total_expected_block_bytes = sizeof(uastc_block) * total_blocks; + if (image_data_size < total_expected_block_bytes) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_slice: image_data_size < total_expected_block_bytes The file is corrupted or this is a bug.\n"); + return false; + } + + const uastc_block* pSource_block = reinterpret_cast(pImage_data); + + const bool high_quality = (decode_flags & cDecodeFlagsHighQuality) != 0; + const bool from_alpha = has_alpha && (decode_flags & cDecodeFlagsTranscodeAlphaDataToOpaqueFormats) != 0; + + bool status = false; + if ((fmt == block_format::cPVRTC1_4_RGB) || (fmt == block_format::cPVRTC1_4_RGBA)) + { + if (fmt == block_format::cPVRTC1_4_RGBA) + transcode_uastc_to_pvrtc1_4_rgba((const uastc_block*)pImage_data, pDst_blocks, num_blocks_x, num_blocks_y, high_quality); + else + transcode_uastc_to_pvrtc1_4_rgb((const uastc_block *)pImage_data, pDst_blocks, num_blocks_x, num_blocks_y, high_quality, from_alpha); + } + else + { + for (uint32_t block_y = 0; block_y < num_blocks_y; ++block_y) + { + void* pDst_block = (uint8_t*)pDst_blocks + block_y * output_row_pitch_in_blocks_or_pixels * output_block_or_pixel_stride_in_bytes; + + for (uint32_t block_x = 0; block_x < num_blocks_x; ++block_x, ++pSource_block, pDst_block = (uint8_t *)pDst_block + output_block_or_pixel_stride_in_bytes) + { + switch (fmt) + { + case block_format::cUASTC_4x4: + { + memcpy(pDst_block, pSource_block, sizeof(uastc_block)); + status = true; + break; + } + case block_format::cETC1: + { + if (from_alpha) + status = transcode_uastc_to_etc1(*pSource_block, pDst_block, 3); + else + status = transcode_uastc_to_etc1(*pSource_block, pDst_block); + break; + } + case block_format::cETC2_RGBA: + { + status = transcode_uastc_to_etc2_rgba(*pSource_block, pDst_block); + break; + } + case block_format::cBC1: + { + status = transcode_uastc_to_bc1(*pSource_block, pDst_block, high_quality); + break; + } + case block_format::cBC3: + { + status = transcode_uastc_to_bc3(*pSource_block, pDst_block, high_quality); + break; + } + case block_format::cBC4: + { + if (channel0 < 0) + channel0 = 0; + status = transcode_uastc_to_bc4(*pSource_block, pDst_block, high_quality, channel0); + break; + } + case block_format::cBC5: + { + if (channel0 < 0) + channel0 = 0; + if (channel1 < 0) + channel1 = 3; + status = transcode_uastc_to_bc5(*pSource_block, pDst_block, high_quality, channel0, channel1); + break; + } + case block_format::cBC7: + case block_format::cBC7_M5_COLOR: // for consistently with ETC1S + { + status = transcode_uastc_to_bc7(*pSource_block, pDst_block); + break; + } + case block_format::cASTC_4x4: + { + status = transcode_uastc_to_astc(*pSource_block, pDst_block); + break; + } + case block_format::cETC2_EAC_R11: + { + if (channel0 < 0) + channel0 = 0; + status = transcode_uastc_to_etc2_eac_r11(*pSource_block, pDst_block, high_quality, channel0); + break; + } + case block_format::cETC2_EAC_RG11: + { + if (channel0 < 0) + channel0 = 0; + if (channel1 < 0) + channel1 = 3; + status = transcode_uastc_to_etc2_eac_rg11(*pSource_block, pDst_block, high_quality, channel0, channel1); + break; + } + case block_format::cRGBA32: + { + color32 block_pixels[4][4]; + status = unpack_uastc(*pSource_block, (color32 *)block_pixels, false); + + assert(sizeof(uint32_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint32_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + for (uint32_t y = 0; y < max_y; y++) + { + for (uint32_t x = 0; x < max_x; x++) + { + const color32& c = block_pixels[y][x]; + + pDst_pixels[0 + 4 * x] = c.r; + pDst_pixels[1 + 4 * x] = c.g; + pDst_pixels[2 + 4 * x] = c.b; + pDst_pixels[3 + 4 * x] = c.a; + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint32_t); + } + + break; + } + case block_format::cRGB565: + case block_format::cBGR565: + { + color32 block_pixels[4][4]; + status = unpack_uastc(*pSource_block, (color32*)block_pixels, false); + + assert(sizeof(uint16_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint16_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + for (uint32_t y = 0; y < max_y; y++) + { + for (uint32_t x = 0; x < max_x; x++) + { + const color32& c = block_pixels[y][x]; + + const uint16_t packed = (fmt == block_format::cRGB565) ? static_cast((mul_8(c.r, 31) << 11) | (mul_8(c.g, 63) << 5) | mul_8(c.b, 31)) : + static_cast((mul_8(c.b, 31) << 11) | (mul_8(c.g, 63) << 5) | mul_8(c.r, 31)); + + pDst_pixels[x * 2 + 0] = (uint8_t)(packed & 0xFF); + pDst_pixels[x * 2 + 1] = (uint8_t)((packed >> 8) & 0xFF); + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint16_t); + } + + break; + } + case block_format::cRGBA4444: + { + color32 block_pixels[4][4]; + status = unpack_uastc(*pSource_block, (color32*)block_pixels, false); + + assert(sizeof(uint16_t) == output_block_or_pixel_stride_in_bytes); + uint8_t* pDst_pixels = static_cast(pDst_blocks) + (block_x * 4 + block_y * 4 * output_row_pitch_in_blocks_or_pixels) * sizeof(uint16_t); + + const uint32_t max_x = basisu::minimum(4, (int)output_row_pitch_in_blocks_or_pixels - (int)block_x * 4); + const uint32_t max_y = basisu::minimum(4, (int)output_rows_in_pixels - (int)block_y * 4); + + for (uint32_t y = 0; y < max_y; y++) + { + for (uint32_t x = 0; x < max_x; x++) + { + const color32& c = block_pixels[y][x]; + + const uint16_t packed = static_cast((mul_8(c.r, 15) << 12) | (mul_8(c.g, 15) << 8) | (mul_8(c.b, 15) << 4) | mul_8(c.a, 15)); + + pDst_pixels[x * 2 + 0] = (uint8_t)(packed & 0xFF); + pDst_pixels[x * 2 + 1] = (uint8_t)((packed >> 8) & 0xFF); + } + + pDst_pixels += output_row_pitch_in_blocks_or_pixels * sizeof(uint16_t); + } + break; + } + default: + assert(0); + break; + + } + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_slice: Transcoder failed to unpack a UASTC block - this is a bug, or the data was corrupted\n"); + return false; + } + + } // block_x + + } // block_y + } + + return true; +#else + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_slice: UASTC is unsupported\n"); + + BASISU_NOTE_UNUSED(decode_flags); + BASISU_NOTE_UNUSED(channel0); + BASISU_NOTE_UNUSED(channel1); + BASISU_NOTE_UNUSED(output_rows_in_pixels); + BASISU_NOTE_UNUSED(output_row_pitch_in_blocks_or_pixels); + BASISU_NOTE_UNUSED(output_block_or_pixel_stride_in_bytes); + BASISU_NOTE_UNUSED(fmt); + BASISU_NOTE_UNUSED(image_data_size); + BASISU_NOTE_UNUSED(pImage_data); + BASISU_NOTE_UNUSED(num_blocks_x); + BASISU_NOTE_UNUSED(num_blocks_y); + BASISU_NOTE_UNUSED(pDst_blocks); + + return false; +#endif + } + + bool basisu_lowlevel_uastc_transcoder::transcode_image( + transcoder_texture_format target_format, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + const uint8_t* pCompressed_data, uint32_t compressed_data_length, + uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, + uint32_t slice_offset, uint32_t slice_length, + uint32_t decode_flags, + bool has_alpha, + bool is_video, + uint32_t output_row_pitch_in_blocks_or_pixels, + basisu_transcoder_state* pState, + uint32_t output_rows_in_pixels, + int channel0, int channel1) + { + BASISU_NOTE_UNUSED(is_video); + BASISU_NOTE_UNUSED(level_index); + + if (((uint64_t)slice_offset + slice_length) > (uint64_t)compressed_data_length) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: source data buffer too small\n"); + return false; + } + + if ((target_format == transcoder_texture_format::cTFPVRTC1_4_RGB) || (target_format == transcoder_texture_format::cTFPVRTC1_4_RGBA)) + { + if ((!basisu::is_pow2(num_blocks_x * 4)) || (!basisu::is_pow2(num_blocks_y * 4))) + { + // PVRTC1 only supports power of 2 dimensions + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: PVRTC1 only supports power of 2 dimensions\n"); + return false; + } + } + + if ((target_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) && (!has_alpha)) + { + // Switch to PVRTC1 RGB if the input doesn't have alpha. + target_format = transcoder_texture_format::cTFPVRTC1_4_RGB; + } + + const bool transcode_alpha_data_to_opaque_formats = (decode_flags & cDecodeFlagsTranscodeAlphaDataToOpaqueFormats) != 0; + const uint32_t bytes_per_block_or_pixel = basis_get_bytes_per_block_or_pixel(target_format); + const uint32_t total_slice_blocks = num_blocks_x * num_blocks_y; + + if (!basis_validate_output_buffer_size(target_format, output_blocks_buf_size_in_blocks_or_pixels, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, output_rows_in_pixels, total_slice_blocks)) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: output buffer size too small\n"); + return false; + } + + bool status = false; + + // UASTC4x4 + switch (target_format) + { + case transcoder_texture_format::cTFETC1_RGB: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC1, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cETC1, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, channel0, channel1); + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to ETC1 failed\n"); + } + break; + } + case transcoder_texture_format::cTFETC2_RGBA: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_RGBA, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cETC2_RGBA, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, channel0, channel1); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to ETC2 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBC1_RGB: + { + // TODO: ETC1S allows BC1 from alpha channel. That doesn't seem actually useful, though. + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC1, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cBC1, + bytes_per_block_or_pixel, true, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, channel0, channel1); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to BC1 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBC3_RGBA: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC3, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cBC3, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, channel0, channel1); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to BC3 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBC4_R: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC4, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState, + // nullptr, 0, + // ((has_alpha) && (transcode_alpha_data_to_opaque_formats)) ? 3 : 0); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cBC4, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, + ((has_alpha) && (transcode_alpha_data_to_opaque_formats)) ? 3 : 0); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to BC4 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBC5_RG: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC5, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState, + // nullptr, 0, + // 0, 3); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cBC5, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, + 0, 3); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to BC5 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBC7_RGBA: + case transcoder_texture_format::cTFBC7_ALT: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBC7, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cBC7, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to BC7 failed\n"); + } + break; + } + case transcoder_texture_format::cTFPVRTC1_4_RGB: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC1_4_RGB, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cPVRTC1_4_RGB, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to PVRTC1 RGB 4bpp failed\n"); + } + break; + } + case transcoder_texture_format::cTFPVRTC1_4_RGBA: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cPVRTC1_4_RGBA, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cPVRTC1_4_RGBA, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to PVRTC1 RGBA 4bpp failed\n"); + } + break; + } + case transcoder_texture_format::cTFASTC_4x4_RGBA: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cASTC_4x4, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cASTC_4x4, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to ASTC 4x4 failed\n"); + } + break; + } + case transcoder_texture_format::cTFATC_RGB: + case transcoder_texture_format::cTFATC_RGBA: + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: UASTC->ATC currently unsupported\n"); + return false; + } + case transcoder_texture_format::cTFFXT1_RGB: + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: UASTC->FXT1 currently unsupported\n"); + return false; + } + case transcoder_texture_format::cTFPVRTC2_4_RGB: + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: UASTC->PVRTC2 currently unsupported\n"); + return false; + } + case transcoder_texture_format::cTFPVRTC2_4_RGBA: + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: UASTC->PVRTC2 currently unsupported\n"); + return false; + } + case transcoder_texture_format::cTFETC2_EAC_R11: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_R11, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState, + // nullptr, 0, + // ((has_alpha) && (transcode_alpha_data_to_opaque_formats)) ? 3 : 0); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cETC2_EAC_R11, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, + ((has_alpha) && (transcode_alpha_data_to_opaque_formats)) ? 3 : 0); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to EAC R11 failed\n"); + } + break; + } + case transcoder_texture_format::cTFETC2_EAC_RG11: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cETC2_EAC_RG11, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState, + // nullptr, 0, + // 0, 3); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cETC2_EAC_RG11, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels, + 0, 3); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_basisu_lowlevel_uastc_transcodertranscoder::transcode_image: transcode_slice() to EAC RG11 failed\n"); + } + break; + } + case transcoder_texture_format::cTFRGBA32: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cRGBA32, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cRGBA32, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to RGBA32 failed\n"); + } + break; + } + case transcoder_texture_format::cTFRGB565: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cRGB565, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cRGB565, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to RGB565 failed\n"); + } + break; + } + case transcoder_texture_format::cTFBGR565: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cBGR565, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cBGR565, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to RGB565 failed\n"); + } + break; + } + case transcoder_texture_format::cTFRGBA4444: + { + //status = transcode_slice(pData, data_size, slice_index, pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, block_format::cRGBA4444, bytes_per_block_or_pixel, decode_flags, output_row_pitch_in_blocks_or_pixels, pState); + status = transcode_slice(pOutput_blocks, num_blocks_x, num_blocks_y, pCompressed_data + slice_offset, slice_length, block_format::cRGBA4444, + bytes_per_block_or_pixel, false, has_alpha, orig_width, orig_height, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + if (!status) + { + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: transcode_slice() to RGBA4444 failed\n"); + } + break; + } + default: + { + assert(0); + BASISU_DEVEL_ERROR("basisu_lowlevel_uastc_transcoder::transcode_image: Invalid format\n"); + break; + } + } + + return status; + } + + basisu_transcoder::basisu_transcoder() : + m_ready_to_transcode(false) + { + } + + bool basisu_transcoder::validate_file_checksums(const void* pData, uint32_t data_size, bool full_validation) const + { + if (!validate_header(pData, data_size)) + return false; + + const basis_file_header* pHeader = reinterpret_cast(pData); + +#if !BASISU_NO_HEADER_OR_DATA_CRC16_CHECKS + if (crc16(&pHeader->m_data_size, sizeof(basis_file_header) - BASISU_OFFSETOF(basis_file_header, m_data_size), 0) != pHeader->m_header_crc16) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: header CRC check failed\n"); + return false; + } + + if (full_validation) + { + if (crc16(reinterpret_cast(pData) + sizeof(basis_file_header), pHeader->m_data_size, 0) != pHeader->m_data_crc16) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: data CRC check failed\n"); + return false; + } + } +#endif + + return true; + } + + bool basisu_transcoder::validate_header_quick(const void* pData, uint32_t data_size) const + { + if (data_size <= sizeof(basis_file_header)) + return false; + + const basis_file_header* pHeader = reinterpret_cast(pData); + + if ((pHeader->m_sig != basis_file_header::cBASISSigValue) || (pHeader->m_ver != BASISD_SUPPORTED_BASIS_VERSION) || (pHeader->m_header_size != sizeof(basis_file_header))) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: header has an invalid signature, or file version is unsupported\n"); + return false; + } + + uint32_t expected_file_size = sizeof(basis_file_header) + pHeader->m_data_size; + if (data_size < expected_file_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: source buffer is too small\n"); + return false; + } + + if ((!pHeader->m_total_slices) || (!pHeader->m_total_images)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::validate_header_quick: header is invalid\n"); + return false; + } + + if ((pHeader->m_slice_desc_file_ofs >= data_size) || + ((data_size - pHeader->m_slice_desc_file_ofs) < (sizeof(basis_slice_desc) * pHeader->m_total_slices)) + ) + { + BASISU_DEVEL_ERROR("basisu_transcoder::validate_header_quick: passed in buffer is too small or data is corrupted\n"); + return false; + } + + return true; + } + + bool basisu_transcoder::validate_header(const void* pData, uint32_t data_size) const + { + if (data_size <= sizeof(basis_file_header)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: input source buffer is too small\n"); + return false; + } + + const basis_file_header* pHeader = reinterpret_cast(pData); + + if ((pHeader->m_sig != basis_file_header::cBASISSigValue) || (pHeader->m_ver != BASISD_SUPPORTED_BASIS_VERSION) || (pHeader->m_header_size != sizeof(basis_file_header))) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: header has an invalid signature, or file version is unsupported\n"); + return false; + } + + uint32_t expected_file_size = sizeof(basis_file_header) + pHeader->m_data_size; + if (data_size < expected_file_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: input source buffer is too small, or header is corrupted\n"); + return false; + } + + if ((!pHeader->m_total_images) || (!pHeader->m_total_slices)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: invalid basis file (total images or slices are 0)\n"); + return false; + } + + if (pHeader->m_total_images > pHeader->m_total_slices) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: invalid basis file (too many images)\n"); + return false; + } + + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + { + if (pHeader->m_flags & cBASISHeaderFlagHasAlphaSlices) + { + if (pHeader->m_total_slices & 1) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: invalid alpha .basis file\n"); + return false; + } + } + + // This flag dates back to pre-Basis Universal, when .basis supported full ETC1 too. + if ((pHeader->m_flags & cBASISHeaderFlagETC1S) == 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: Invalid .basis file (ETC1S check)\n"); + return false; + } + } + else + { + if ((pHeader->m_flags & cBASISHeaderFlagETC1S) != 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: Invalid .basis file (ETC1S check)\n"); + return false; + } + } + + if ((pHeader->m_slice_desc_file_ofs >= data_size) || + ((data_size - pHeader->m_slice_desc_file_ofs) < (sizeof(basis_slice_desc) * pHeader->m_total_slices)) + ) + { + BASISU_DEVEL_ERROR("basisu_transcoder::validate_header_quick: passed in buffer is too small or data is corrupted\n"); + return false; + } + + return true; + } + + basis_texture_type basisu_transcoder::get_texture_type(const void* pData, uint32_t data_size) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_texture_type: header validation failed\n"); + return cBASISTexType2DArray; + } + + const basis_file_header* pHeader = static_cast(pData); + + basis_texture_type btt = static_cast(static_cast(pHeader->m_tex_type)); + + if (btt >= cBASISTexTypeTotal) + { + BASISU_DEVEL_ERROR("basisu_transcoder::validate_header_quick: header's texture type field is invalid\n"); + return cBASISTexType2DArray; + } + + return btt; + } + + bool basisu_transcoder::get_userdata(const void* pData, uint32_t data_size, uint32_t& userdata0, uint32_t& userdata1) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_userdata: header validation failed\n"); + return false; + } + + const basis_file_header* pHeader = static_cast(pData); + + userdata0 = pHeader->m_userdata0; + userdata1 = pHeader->m_userdata1; + return true; + } + + uint32_t basisu_transcoder::get_total_images(const void* pData, uint32_t data_size) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: header validation failed\n"); + return 0; + } + + const basis_file_header* pHeader = static_cast(pData); + + return pHeader->m_total_images; + } + + basis_tex_format basisu_transcoder::get_tex_format(const void* pData, uint32_t data_size) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_images: header validation failed\n"); + return basis_tex_format::cETC1S; + } + + const basis_file_header* pHeader = static_cast(pData); + + return (basis_tex_format)(uint32_t)pHeader->m_tex_format; + } + + bool basisu_transcoder::get_image_info(const void* pData, uint32_t data_size, basisu_image_info& image_info, uint32_t image_index) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_info: header validation failed\n"); + return false; + } + + int slice_index = find_first_slice_index(pData, data_size, image_index, 0); + if (slice_index < 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_info: invalid slice index\n"); + return false; + } + + const basis_file_header* pHeader = static_cast(pData); + + if (image_index >= pHeader->m_total_images) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_info: invalid image_index\n"); + return false; + } + + const basis_slice_desc* pSlice_descs = reinterpret_cast(static_cast(pData) + pHeader->m_slice_desc_file_ofs); + + uint32_t total_levels = 1; + for (uint32_t i = slice_index + 1; i < pHeader->m_total_slices; i++) + if (pSlice_descs[i].m_image_index == image_index) + total_levels = basisu::maximum(total_levels, pSlice_descs[i].m_level_index + 1); + else + break; + + if (total_levels > 16) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_info: invalid image_index\n"); + return false; + } + + const basis_slice_desc& slice_desc = pSlice_descs[slice_index]; + + image_info.m_image_index = image_index; + image_info.m_total_levels = total_levels; + + image_info.m_alpha_flag = false; + + // For ETC1S, if anything has alpha all images have alpha. For UASTC, we only report alpha when the image actually has alpha. + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + image_info.m_alpha_flag = (pHeader->m_flags & cBASISHeaderFlagHasAlphaSlices) != 0; + else + image_info.m_alpha_flag = (slice_desc.m_flags & cSliceDescFlagsHasAlpha) != 0; + + image_info.m_iframe_flag = (slice_desc.m_flags & cSliceDescFlagsFrameIsIFrame) != 0; + + image_info.m_width = slice_desc.m_num_blocks_x * 4; + image_info.m_height = slice_desc.m_num_blocks_y * 4; + image_info.m_orig_width = slice_desc.m_orig_width; + image_info.m_orig_height = slice_desc.m_orig_height; + image_info.m_num_blocks_x = slice_desc.m_num_blocks_x; + image_info.m_num_blocks_y = slice_desc.m_num_blocks_y; + image_info.m_total_blocks = image_info.m_num_blocks_x * image_info.m_num_blocks_y; + image_info.m_first_slice_index = slice_index; + + return true; + } + + uint32_t basisu_transcoder::get_total_image_levels(const void* pData, uint32_t data_size, uint32_t image_index) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_image_levels: header validation failed\n"); + return false; + } + + int slice_index = find_first_slice_index(pData, data_size, image_index, 0); + if (slice_index < 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_image_levels: failed finding slice\n"); + return false; + } + + const basis_file_header* pHeader = static_cast(pData); + + if (image_index >= pHeader->m_total_images) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_image_levels: invalid image_index\n"); + return false; + } + + const basis_slice_desc* pSlice_descs = reinterpret_cast(static_cast(pData) + pHeader->m_slice_desc_file_ofs); + + uint32_t total_levels = 1; + for (uint32_t i = slice_index + 1; i < pHeader->m_total_slices; i++) + if (pSlice_descs[i].m_image_index == image_index) + total_levels = basisu::maximum(total_levels, pSlice_descs[i].m_level_index + 1); + else + break; + + const uint32_t cMaxSupportedLevels = 16; + if (total_levels > cMaxSupportedLevels) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_total_image_levels: invalid image levels!\n"); + return false; + } + + return total_levels; + } + + bool basisu_transcoder::get_image_level_desc(const void* pData, uint32_t data_size, uint32_t image_index, uint32_t level_index, uint32_t& orig_width, uint32_t& orig_height, uint32_t& total_blocks) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_level_desc: header validation failed\n"); + return false; + } + + int slice_index = find_first_slice_index(pData, data_size, image_index, level_index); + if (slice_index < 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_level_desc: failed finding slice\n"); + return false; + } + + const basis_file_header* pHeader = static_cast(pData); + + if (image_index >= pHeader->m_total_images) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_level_desc: invalid image_index\n"); + return false; + } + + const basis_slice_desc* pSlice_descs = reinterpret_cast(static_cast(pData) + pHeader->m_slice_desc_file_ofs); + + const basis_slice_desc& slice_desc = pSlice_descs[slice_index]; + + orig_width = slice_desc.m_orig_width; + orig_height = slice_desc.m_orig_height; + total_blocks = slice_desc.m_num_blocks_x * slice_desc.m_num_blocks_y; + + return true; + } + + bool basisu_transcoder::get_image_level_info(const void* pData, uint32_t data_size, basisu_image_level_info& image_info, uint32_t image_index, uint32_t level_index) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_level_info: validate_file_checksums failed\n"); + return false; + } + + int slice_index = find_first_slice_index(pData, data_size, image_index, level_index); + if (slice_index < 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_level_info: failed finding slice\n"); + return false; + } + + const basis_file_header* pHeader = static_cast(pData); + + if (image_index >= pHeader->m_total_images) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_image_level_info: invalid image_index\n"); + return false; + } + + const basis_slice_desc* pSlice_descs = reinterpret_cast(static_cast(pData) + pHeader->m_slice_desc_file_ofs); + + const basis_slice_desc& slice_desc = pSlice_descs[slice_index]; + + image_info.m_image_index = image_index; + image_info.m_level_index = level_index; + + // For ETC1S, if anything has alpha all images have alpha. For UASTC, we only report alpha when the image actually has alpha. + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + image_info.m_alpha_flag = (pHeader->m_flags & cBASISHeaderFlagHasAlphaSlices) != 0; + else + image_info.m_alpha_flag = (slice_desc.m_flags & cSliceDescFlagsHasAlpha) != 0; + + image_info.m_iframe_flag = (slice_desc.m_flags & cSliceDescFlagsFrameIsIFrame) != 0; + image_info.m_width = slice_desc.m_num_blocks_x * 4; + image_info.m_height = slice_desc.m_num_blocks_y * 4; + image_info.m_orig_width = slice_desc.m_orig_width; + image_info.m_orig_height = slice_desc.m_orig_height; + image_info.m_num_blocks_x = slice_desc.m_num_blocks_x; + image_info.m_num_blocks_y = slice_desc.m_num_blocks_y; + image_info.m_total_blocks = image_info.m_num_blocks_x * image_info.m_num_blocks_y; + image_info.m_first_slice_index = slice_index; + + image_info.m_rgb_file_ofs = slice_desc.m_file_ofs; + image_info.m_rgb_file_len = slice_desc.m_file_size; + image_info.m_alpha_file_ofs = 0; + image_info.m_alpha_file_len = 0; + + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + { + if (pHeader->m_flags & cBASISHeaderFlagHasAlphaSlices) + { + assert((slice_index + 1) < (int)pHeader->m_total_slices); + image_info.m_alpha_file_ofs = pSlice_descs[slice_index + 1].m_file_ofs; + image_info.m_alpha_file_len = pSlice_descs[slice_index + 1].m_file_size; + } + } + + return true; + } + + bool basisu_transcoder::get_file_info(const void* pData, uint32_t data_size, basisu_file_info& file_info) const + { + if (!validate_file_checksums(pData, data_size, false)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_file_info: validate_file_checksums failed\n"); + return false; + } + + const basis_file_header* pHeader = static_cast(pData); + const basis_slice_desc* pSlice_descs = reinterpret_cast(static_cast(pData) + pHeader->m_slice_desc_file_ofs); + + file_info.m_version = pHeader->m_ver; + + file_info.m_total_header_size = sizeof(basis_file_header) + pHeader->m_total_slices * sizeof(basis_slice_desc); + + file_info.m_total_selectors = pHeader->m_total_selectors; + file_info.m_selector_codebook_ofs = pHeader->m_selector_cb_file_ofs; + file_info.m_selector_codebook_size = pHeader->m_selector_cb_file_size; + + file_info.m_total_endpoints = pHeader->m_total_endpoints; + file_info.m_endpoint_codebook_ofs = pHeader->m_endpoint_cb_file_ofs; + file_info.m_endpoint_codebook_size = pHeader->m_endpoint_cb_file_size; + + file_info.m_tables_ofs = pHeader->m_tables_file_ofs; + file_info.m_tables_size = pHeader->m_tables_file_size; + + file_info.m_tex_format = static_cast(static_cast(pHeader->m_tex_format)); + + file_info.m_etc1s = (pHeader->m_tex_format == (int)basis_tex_format::cETC1S); + + file_info.m_y_flipped = (pHeader->m_flags & cBASISHeaderFlagYFlipped) != 0; + file_info.m_has_alpha_slices = (pHeader->m_flags & cBASISHeaderFlagHasAlphaSlices) != 0; + + const uint32_t total_slices = pHeader->m_total_slices; + + file_info.m_slice_info.resize(total_slices); + + file_info.m_slices_size = 0; + + file_info.m_tex_type = static_cast(static_cast(pHeader->m_tex_type)); + + if (file_info.m_tex_type > cBASISTexTypeTotal) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_file_info: invalid texture type, file is corrupted\n"); + return false; + } + + file_info.m_us_per_frame = pHeader->m_us_per_frame; + file_info.m_userdata0 = pHeader->m_userdata0; + file_info.m_userdata1 = pHeader->m_userdata1; + + file_info.m_image_mipmap_levels.resize(0); + file_info.m_image_mipmap_levels.resize(pHeader->m_total_images); + + file_info.m_total_images = pHeader->m_total_images; + + for (uint32_t i = 0; i < total_slices; i++) + { + file_info.m_slices_size += pSlice_descs[i].m_file_size; + + basisu_slice_info& slice_info = file_info.m_slice_info[i]; + + slice_info.m_orig_width = pSlice_descs[i].m_orig_width; + slice_info.m_orig_height = pSlice_descs[i].m_orig_height; + slice_info.m_width = pSlice_descs[i].m_num_blocks_x * 4; + slice_info.m_height = pSlice_descs[i].m_num_blocks_y * 4; + slice_info.m_num_blocks_x = pSlice_descs[i].m_num_blocks_x; + slice_info.m_num_blocks_y = pSlice_descs[i].m_num_blocks_y; + slice_info.m_total_blocks = slice_info.m_num_blocks_x * slice_info.m_num_blocks_y; + slice_info.m_compressed_size = pSlice_descs[i].m_file_size; + slice_info.m_slice_index = i; + slice_info.m_image_index = pSlice_descs[i].m_image_index; + slice_info.m_level_index = pSlice_descs[i].m_level_index; + slice_info.m_unpacked_slice_crc16 = pSlice_descs[i].m_slice_data_crc16; + slice_info.m_alpha_flag = (pSlice_descs[i].m_flags & cSliceDescFlagsHasAlpha) != 0; + slice_info.m_iframe_flag = (pSlice_descs[i].m_flags & cSliceDescFlagsFrameIsIFrame) != 0; + + if (pSlice_descs[i].m_image_index >= pHeader->m_total_images) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_file_info: slice desc's image index is invalid\n"); + return false; + } + + file_info.m_image_mipmap_levels[pSlice_descs[i].m_image_index] = basisu::maximum(file_info.m_image_mipmap_levels[pSlice_descs[i].m_image_index], pSlice_descs[i].m_level_index + 1); + + if (file_info.m_image_mipmap_levels[pSlice_descs[i].m_image_index] > 16) + { + BASISU_DEVEL_ERROR("basisu_transcoder::get_file_info: slice mipmap level is invalid\n"); + return false; + } + } + + return true; + } + + bool basisu_transcoder::start_transcoding(const void* pData, uint32_t data_size) + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: header validation failed\n"); + return false; + } + + const basis_file_header* pHeader = reinterpret_cast(pData); + const uint8_t* pDataU8 = static_cast(pData); + + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + { + if (m_lowlevel_etc1s_decoder.m_local_endpoints.size()) + { + m_lowlevel_etc1s_decoder.clear(); + } + + if (pHeader->m_flags & cBASISHeaderFlagUsesGlobalCodebook) + { + if (!m_lowlevel_etc1s_decoder.get_global_codebooks()) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: File uses global codebooks, but set_global_codebooks() has not been called\n"); + return false; + } + if (!m_lowlevel_etc1s_decoder.get_global_codebooks()->get_endpoints().size()) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: Global codebooks must be unpacked first by calling start_transcoding()\n"); + return false; + } + if ((m_lowlevel_etc1s_decoder.get_global_codebooks()->get_endpoints().size() != pHeader->m_total_endpoints) || + (m_lowlevel_etc1s_decoder.get_global_codebooks()->get_selectors().size() != pHeader->m_total_selectors)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: Global codebook size mismatch (wrong codebooks for file).\n"); + return false; + } + if (!pHeader->m_tables_file_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted (2)\n"); + return false; + } + if (pHeader->m_tables_file_ofs > data_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted or passed in buffer too small (4)\n"); + return false; + } + if (pHeader->m_tables_file_size > (data_size - pHeader->m_tables_file_ofs)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted or passed in buffer too small (5)\n"); + return false; + } + } + else + { + if (!pHeader->m_endpoint_cb_file_size || !pHeader->m_selector_cb_file_size || !pHeader->m_tables_file_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted (0)\n"); + return false; + } + + if ((pHeader->m_endpoint_cb_file_ofs > data_size) || (pHeader->m_selector_cb_file_ofs > data_size) || (pHeader->m_tables_file_ofs > data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted or passed in buffer too small (1)\n"); + return false; + } + + if (pHeader->m_endpoint_cb_file_size > (data_size - pHeader->m_endpoint_cb_file_ofs)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted or passed in buffer too small (2)\n"); + return false; + } + + if (pHeader->m_selector_cb_file_size > (data_size - pHeader->m_selector_cb_file_ofs)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted or passed in buffer too small (3)\n"); + return false; + } + + if (pHeader->m_tables_file_size > (data_size - pHeader->m_tables_file_ofs)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: file is corrupted or passed in buffer too small (3)\n"); + return false; + } + + if (!m_lowlevel_etc1s_decoder.decode_palettes( + pHeader->m_total_endpoints, pDataU8 + pHeader->m_endpoint_cb_file_ofs, pHeader->m_endpoint_cb_file_size, + pHeader->m_total_selectors, pDataU8 + pHeader->m_selector_cb_file_ofs, pHeader->m_selector_cb_file_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: decode_palettes failed\n"); + return false; + } + } + + if (!m_lowlevel_etc1s_decoder.decode_tables(pDataU8 + pHeader->m_tables_file_ofs, pHeader->m_tables_file_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::start_transcoding: decode_tables failed\n"); + return false; + } + } + else + { + // Nothing special to do for UASTC. + if (m_lowlevel_etc1s_decoder.m_local_endpoints.size()) + { + m_lowlevel_etc1s_decoder.clear(); + } + } + + m_ready_to_transcode = true; + + return true; + } + + bool basisu_transcoder::stop_transcoding() + { + m_lowlevel_etc1s_decoder.clear(); + + m_ready_to_transcode = false; + + return true; + } + + bool basisu_transcoder::transcode_slice(const void* pData, uint32_t data_size, uint32_t slice_index, void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, uint32_t decode_flags, uint32_t output_row_pitch_in_blocks_or_pixels, basisu_transcoder_state* pState, void *pAlpha_blocks, uint32_t output_rows_in_pixels, int channel0, int channel1) const + { + if (!m_ready_to_transcode) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: must call start_transcoding first\n"); + return false; + } + + if (decode_flags & cDecodeFlagsPVRTCDecodeToNextPow2) + { + // TODO: Not yet supported + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: cDecodeFlagsPVRTCDecodeToNextPow2 currently unsupported\n"); + return false; + } + + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: header validation failed\n"); + return false; + } + + const basis_file_header* pHeader = reinterpret_cast(pData); + + const uint8_t* pDataU8 = static_cast(pData); + + if (slice_index >= pHeader->m_total_slices) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: slice_index >= pHeader->m_total_slices\n"); + return false; + } + + const basis_slice_desc& slice_desc = reinterpret_cast(pDataU8 + pHeader->m_slice_desc_file_ofs)[slice_index]; + + uint32_t total_4x4_blocks = slice_desc.m_num_blocks_x * slice_desc.m_num_blocks_y; + + if (basis_block_format_is_uncompressed(fmt)) + { + // Assume the output buffer is orig_width by orig_height + if (!output_row_pitch_in_blocks_or_pixels) + output_row_pitch_in_blocks_or_pixels = slice_desc.m_orig_width; + + if (!output_rows_in_pixels) + output_rows_in_pixels = slice_desc.m_orig_height; + + // Now make sure the output buffer is large enough, or we'll overwrite memory. + if (output_blocks_buf_size_in_blocks_or_pixels < (output_rows_in_pixels * output_row_pitch_in_blocks_or_pixels)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: output_blocks_buf_size_in_blocks_or_pixels < (output_rows_in_pixels * output_row_pitch_in_blocks_or_pixels)\n"); + return false; + } + } + else if (fmt == block_format::cFXT1_RGB) + { + const uint32_t num_blocks_fxt1_x = (slice_desc.m_orig_width + 7) / 8; + const uint32_t num_blocks_fxt1_y = (slice_desc.m_orig_height + 3) / 4; + const uint32_t total_blocks_fxt1 = num_blocks_fxt1_x * num_blocks_fxt1_y; + + if (output_blocks_buf_size_in_blocks_or_pixels < total_blocks_fxt1) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: output_blocks_buf_size_in_blocks_or_pixels < total_blocks_fxt1\n"); + return false; + } + } + else + { + if (output_blocks_buf_size_in_blocks_or_pixels < total_4x4_blocks) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: output_blocks_buf_size_in_blocks_or_pixels < total_blocks\n"); + return false; + } + } + + if (fmt != block_format::cETC1) + { + if ((fmt == block_format::cPVRTC1_4_RGB) || (fmt == block_format::cPVRTC1_4_RGBA)) + { + if ((!basisu::is_pow2(slice_desc.m_num_blocks_x * 4)) || (!basisu::is_pow2(slice_desc.m_num_blocks_y * 4))) + { + // PVRTC1 only supports power of 2 dimensions + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: PVRTC1 only supports power of 2 dimensions\n"); + return false; + } + } + } + + if (slice_desc.m_file_ofs > data_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: invalid slice_desc.m_file_ofs, or passed in buffer too small\n"); + return false; + } + + const uint32_t data_size_left = data_size - slice_desc.m_file_ofs; + if (data_size_left < slice_desc.m_file_size) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_slice: invalid slice_desc.m_file_size, or passed in buffer too small\n"); + return false; + } + + if (pHeader->m_tex_format == (int)basis_tex_format::cUASTC4x4) + { + return m_lowlevel_uastc_decoder.transcode_slice(pOutput_blocks, slice_desc.m_num_blocks_x, slice_desc.m_num_blocks_y, + pDataU8 + slice_desc.m_file_ofs, slice_desc.m_file_size, + fmt, output_block_or_pixel_stride_in_bytes, (decode_flags & cDecodeFlagsBC1ForbidThreeColorBlocks) == 0, *pHeader, slice_desc, output_row_pitch_in_blocks_or_pixels, pState, + output_rows_in_pixels, channel0, channel1, decode_flags); + } + else + { + return m_lowlevel_etc1s_decoder.transcode_slice(pOutput_blocks, slice_desc.m_num_blocks_x, slice_desc.m_num_blocks_y, + pDataU8 + slice_desc.m_file_ofs, slice_desc.m_file_size, + fmt, output_block_or_pixel_stride_in_bytes, (decode_flags & cDecodeFlagsBC1ForbidThreeColorBlocks) == 0, *pHeader, slice_desc, output_row_pitch_in_blocks_or_pixels, pState, + (decode_flags & cDecodeFlagsOutputHasAlphaIndices) != 0, pAlpha_blocks, output_rows_in_pixels); + } + } + + int basisu_transcoder::find_first_slice_index(const void* pData, uint32_t data_size, uint32_t image_index, uint32_t level_index) const + { + BASISU_NOTE_UNUSED(data_size); + + const basis_file_header* pHeader = reinterpret_cast(pData); + const uint8_t* pDataU8 = static_cast(pData); + + // For very large basis files this search could be painful + // TODO: Binary search this + for (uint32_t slice_iter = 0; slice_iter < pHeader->m_total_slices; slice_iter++) + { + const basis_slice_desc& slice_desc = reinterpret_cast(pDataU8 + pHeader->m_slice_desc_file_ofs)[slice_iter]; + if ((slice_desc.m_image_index == image_index) && (slice_desc.m_level_index == level_index)) + return slice_iter; + } + + BASISU_DEVEL_ERROR("basisu_transcoder::find_first_slice_index: didn't find slice\n"); + + return -1; + } + + int basisu_transcoder::find_slice(const void* pData, uint32_t data_size, uint32_t image_index, uint32_t level_index, bool alpha_data) const + { + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::find_slice: header validation failed\n"); + return false; + } + + const basis_file_header* pHeader = reinterpret_cast(pData); + const uint8_t* pDataU8 = static_cast(pData); + const basis_slice_desc* pSlice_descs = reinterpret_cast(pDataU8 + pHeader->m_slice_desc_file_ofs); + + // For very large basis files this search could be painful + // TODO: Binary search this + for (uint32_t slice_iter = 0; slice_iter < pHeader->m_total_slices; slice_iter++) + { + const basis_slice_desc& slice_desc = pSlice_descs[slice_iter]; + if ((slice_desc.m_image_index == image_index) && (slice_desc.m_level_index == level_index)) + { + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + { + const bool slice_alpha = (slice_desc.m_flags & cSliceDescFlagsHasAlpha) != 0; + if (slice_alpha == alpha_data) + return slice_iter; + } + else + { + return slice_iter; + } + } + } + + BASISU_DEVEL_ERROR("basisu_transcoder::find_slice: didn't find slice\n"); + + return -1; + } + + void basisu_transcoder::write_opaque_alpha_blocks( + uint32_t num_blocks_x, uint32_t num_blocks_y, + void* pOutput_blocks, block_format fmt, + uint32_t block_stride_in_bytes, uint32_t output_row_pitch_in_blocks_or_pixels) + { + // 'num_blocks_y', 'pOutput_blocks' & 'block_stride_in_bytes' unused + // when disabling BASISD_SUPPORT_ETC2_EAC_A8 *and* BASISD_SUPPORT_DXT5A + BASISU_NOTE_UNUSED(num_blocks_y); + BASISU_NOTE_UNUSED(pOutput_blocks); + BASISU_NOTE_UNUSED(block_stride_in_bytes); + + if (!output_row_pitch_in_blocks_or_pixels) + output_row_pitch_in_blocks_or_pixels = num_blocks_x; + + if ((fmt == block_format::cETC2_EAC_A8) || (fmt == block_format::cETC2_EAC_R11)) + { +#if BASISD_SUPPORT_ETC2_EAC_A8 + eac_block blk; + blk.m_base = 255; + blk.m_multiplier = 1; + blk.m_table = 13; + + // Selectors are all 4's + memcpy(&blk.m_selectors, g_etc2_eac_a8_sel4, sizeof(g_etc2_eac_a8_sel4)); + + for (uint32_t y = 0; y < num_blocks_y; y++) + { + uint32_t dst_ofs = y * output_row_pitch_in_blocks_or_pixels * block_stride_in_bytes; + for (uint32_t x = 0; x < num_blocks_x; x++) + { + memcpy((uint8_t*)pOutput_blocks + dst_ofs, &blk, sizeof(blk)); + dst_ofs += block_stride_in_bytes; + } + } +#endif + } + else if (fmt == block_format::cBC4) + { +#if BASISD_SUPPORT_DXT5A + dxt5a_block blk; + blk.m_endpoints[0] = 255; + blk.m_endpoints[1] = 255; + memset(blk.m_selectors, 0, sizeof(blk.m_selectors)); + + for (uint32_t y = 0; y < num_blocks_y; y++) + { + uint32_t dst_ofs = y * output_row_pitch_in_blocks_or_pixels * block_stride_in_bytes; + for (uint32_t x = 0; x < num_blocks_x; x++) + { + memcpy((uint8_t*)pOutput_blocks + dst_ofs, &blk, sizeof(blk)); + dst_ofs += block_stride_in_bytes; + } + } +#endif + } + } + + bool basisu_transcoder::transcode_image_level( + const void* pData, uint32_t data_size, + uint32_t image_index, uint32_t level_index, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + transcoder_texture_format fmt, + uint32_t decode_flags, uint32_t output_row_pitch_in_blocks_or_pixels, basisu_transcoder_state *pState, uint32_t output_rows_in_pixels) const + { + const uint32_t bytes_per_block_or_pixel = basis_get_bytes_per_block_or_pixel(fmt); + + if (!m_ready_to_transcode) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: must call start_transcoding() first\n"); + return false; + } + + //const bool transcode_alpha_data_to_opaque_formats = (decode_flags & cDecodeFlagsTranscodeAlphaDataToOpaqueFormats) != 0; + + if (decode_flags & cDecodeFlagsPVRTCDecodeToNextPow2) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: cDecodeFlagsPVRTCDecodeToNextPow2 currently unsupported\n"); + // TODO: Not yet supported + return false; + } + + if (!validate_header_quick(pData, data_size)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: header validation failed\n"); + return false; + } + + const basis_file_header* pHeader = reinterpret_cast(pData); + + const uint8_t* pDataU8 = static_cast(pData); + + const basis_slice_desc* pSlice_descs = reinterpret_cast(pDataU8 + pHeader->m_slice_desc_file_ofs); + + const bool basis_file_has_alpha_slices = (pHeader->m_flags & cBASISHeaderFlagHasAlphaSlices) != 0; + + int slice_index = find_first_slice_index(pData, data_size, image_index, level_index); + if (slice_index < 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: failed finding slice index\n"); + // Unable to find the requested image/level + return false; + } + + if ((fmt == transcoder_texture_format::cTFPVRTC1_4_RGBA) && (!basis_file_has_alpha_slices)) + { + // Switch to PVRTC1 RGB if the input doesn't have alpha. + fmt = transcoder_texture_format::cTFPVRTC1_4_RGB; + } + + if (pHeader->m_tex_format == (int)basis_tex_format::cETC1S) + { + if (pSlice_descs[slice_index].m_flags & cSliceDescFlagsHasAlpha) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: alpha basis file has out of order alpha slice\n"); + + // The first slice shouldn't have alpha data in a properly formed basis file + return false; + } + + if (basis_file_has_alpha_slices) + { + // The alpha data should immediately follow the color data, and have the same resolution. + if ((slice_index + 1U) >= pHeader->m_total_slices) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: alpha basis file has missing alpha slice\n"); + // basis file is missing the alpha slice + return false; + } + + // Basic sanity checks + if ((pSlice_descs[slice_index + 1].m_flags & cSliceDescFlagsHasAlpha) == 0) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: alpha basis file has missing alpha slice (flag check)\n"); + // This slice should have alpha data + return false; + } + + if ((pSlice_descs[slice_index].m_num_blocks_x != pSlice_descs[slice_index + 1].m_num_blocks_x) || (pSlice_descs[slice_index].m_num_blocks_y != pSlice_descs[slice_index + 1].m_num_blocks_y)) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: alpha basis file slice dimensions bad\n"); + // Alpha slice should have been the same res as the color slice + return false; + } + } + } + + bool status = false; + + const uint32_t total_slice_blocks = pSlice_descs[slice_index].m_num_blocks_x * pSlice_descs[slice_index].m_num_blocks_y; + + if (((fmt == transcoder_texture_format::cTFPVRTC1_4_RGB) || (fmt == transcoder_texture_format::cTFPVRTC1_4_RGBA)) && (output_blocks_buf_size_in_blocks_or_pixels > total_slice_blocks)) + { + // The transcoder doesn't write beyond total_slice_blocks, so we need to clear the rest ourselves. + // For GL usage, PVRTC1 4bpp image size is (max(width, 8)* max(height, 8) * 4 + 7) / 8. + // However, for KTX and internally in Basis this formula isn't used, it's just ((width+3)/4) * ((height+3)/4) * bytes_per_block_or_pixel. This is all the transcoder actually writes to memory. + memset(static_cast(pOutput_blocks) + total_slice_blocks * bytes_per_block_or_pixel, 0, (output_blocks_buf_size_in_blocks_or_pixels - total_slice_blocks) * bytes_per_block_or_pixel); + } + + if (pHeader->m_tex_format == (int)basis_tex_format::cUASTC4x4) + { + const basis_slice_desc* pSlice_desc = &pSlice_descs[slice_index]; + + // Use the container independent image transcode method. + status = m_lowlevel_uastc_decoder.transcode_image(fmt, + pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, + (const uint8_t*)pData, data_size, pSlice_desc->m_num_blocks_x, pSlice_desc->m_num_blocks_y, pSlice_desc->m_orig_width, pSlice_desc->m_orig_height, pSlice_desc->m_level_index, + pSlice_desc->m_file_ofs, pSlice_desc->m_file_size, + decode_flags, basis_file_has_alpha_slices, pHeader->m_tex_type == cBASISTexTypeVideoFrames, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + } + else + { + // ETC1S + const basis_slice_desc* pSlice_desc = &pSlice_descs[slice_index]; + const basis_slice_desc* pAlpha_slice_desc = basis_file_has_alpha_slices ? &pSlice_descs[slice_index + 1] : nullptr; + + assert((pSlice_desc->m_flags & cSliceDescFlagsHasAlpha) == 0); + + if (pAlpha_slice_desc) + { + // Basic sanity checks + assert((pAlpha_slice_desc->m_flags & cSliceDescFlagsHasAlpha) != 0); + assert(pSlice_desc->m_num_blocks_x == pAlpha_slice_desc->m_num_blocks_x); + assert(pSlice_desc->m_num_blocks_y == pAlpha_slice_desc->m_num_blocks_y); + assert(pSlice_desc->m_level_index == pAlpha_slice_desc->m_level_index); + } + + // Use the container independent image transcode method. + status = m_lowlevel_etc1s_decoder.transcode_image(fmt, + pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, + (const uint8_t *)pData, data_size, pSlice_desc->m_num_blocks_x, pSlice_desc->m_num_blocks_y, pSlice_desc->m_orig_width, pSlice_desc->m_orig_height, pSlice_desc->m_level_index, + pSlice_desc->m_file_ofs, pSlice_desc->m_file_size, + (pAlpha_slice_desc != nullptr) ? (uint32_t)pAlpha_slice_desc->m_file_ofs : 0U, (pAlpha_slice_desc != nullptr) ? (uint32_t)pAlpha_slice_desc->m_file_size : 0U, + decode_flags, basis_file_has_alpha_slices, pHeader->m_tex_type == cBASISTexTypeVideoFrames, output_row_pitch_in_blocks_or_pixels, pState, output_rows_in_pixels); + + } // if (pHeader->m_tex_format == (int)basis_tex_format::cUASTC4x4) + + if (!status) + { + BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: Returning false\n"); + } + else + { + //BASISU_DEVEL_ERROR("basisu_transcoder::transcode_image_level: Returning true\n"); + } + + return status; + } + + uint32_t basis_get_bytes_per_block_or_pixel(transcoder_texture_format fmt) + { + switch (fmt) + { + case transcoder_texture_format::cTFETC1_RGB: + case transcoder_texture_format::cTFBC1_RGB: + case transcoder_texture_format::cTFBC4_R: + case transcoder_texture_format::cTFPVRTC1_4_RGB: + case transcoder_texture_format::cTFPVRTC1_4_RGBA: + case transcoder_texture_format::cTFATC_RGB: + case transcoder_texture_format::cTFPVRTC2_4_RGB: + case transcoder_texture_format::cTFPVRTC2_4_RGBA: + case transcoder_texture_format::cTFETC2_EAC_R11: + return 8; + case transcoder_texture_format::cTFBC7_RGBA: + case transcoder_texture_format::cTFBC7_ALT: + case transcoder_texture_format::cTFETC2_RGBA: + case transcoder_texture_format::cTFBC3_RGBA: + case transcoder_texture_format::cTFBC5_RG: + case transcoder_texture_format::cTFASTC_4x4_RGBA: + case transcoder_texture_format::cTFATC_RGBA: + case transcoder_texture_format::cTFFXT1_RGB: + case transcoder_texture_format::cTFETC2_EAC_RG11: + return 16; + case transcoder_texture_format::cTFRGBA32: + return sizeof(uint32_t); + case transcoder_texture_format::cTFRGB565: + case transcoder_texture_format::cTFBGR565: + case transcoder_texture_format::cTFRGBA4444: + return sizeof(uint16_t); + default: + assert(0); + BASISU_DEVEL_ERROR("basis_get_basisu_texture_format: Invalid fmt\n"); + break; + } + return 0; + } + + const char* basis_get_format_name(transcoder_texture_format fmt) + { + switch (fmt) + { + case transcoder_texture_format::cTFETC1_RGB: return "ETC1_RGB"; + case transcoder_texture_format::cTFBC1_RGB: return "BC1_RGB"; + case transcoder_texture_format::cTFBC4_R: return "BC4_R"; + case transcoder_texture_format::cTFPVRTC1_4_RGB: return "PVRTC1_4_RGB"; + case transcoder_texture_format::cTFPVRTC1_4_RGBA: return "PVRTC1_4_RGBA"; + case transcoder_texture_format::cTFBC7_RGBA: return "BC7_RGBA"; + case transcoder_texture_format::cTFBC7_ALT: return "BC7_RGBA"; + case transcoder_texture_format::cTFETC2_RGBA: return "ETC2_RGBA"; + case transcoder_texture_format::cTFBC3_RGBA: return "BC3_RGBA"; + case transcoder_texture_format::cTFBC5_RG: return "BC5_RG"; + case transcoder_texture_format::cTFASTC_4x4_RGBA: return "ASTC_RGBA"; + case transcoder_texture_format::cTFATC_RGB: return "ATC_RGB"; + case transcoder_texture_format::cTFATC_RGBA: return "ATC_RGBA"; + case transcoder_texture_format::cTFRGBA32: return "RGBA32"; + case transcoder_texture_format::cTFRGB565: return "RGB565"; + case transcoder_texture_format::cTFBGR565: return "BGR565"; + case transcoder_texture_format::cTFRGBA4444: return "RGBA4444"; + case transcoder_texture_format::cTFFXT1_RGB: return "FXT1_RGB"; + case transcoder_texture_format::cTFPVRTC2_4_RGB: return "PVRTC2_4_RGB"; + case transcoder_texture_format::cTFPVRTC2_4_RGBA: return "PVRTC2_4_RGBA"; + case transcoder_texture_format::cTFETC2_EAC_R11: return "ETC2_EAC_R11"; + case transcoder_texture_format::cTFETC2_EAC_RG11: return "ETC2_EAC_RG11"; + default: + assert(0); + BASISU_DEVEL_ERROR("basis_get_basisu_texture_format: Invalid fmt\n"); + break; + } + return ""; + } + + const char* basis_get_block_format_name(block_format fmt) + { + switch (fmt) + { + case block_format::cETC1: return "ETC1"; + case block_format::cBC1: return "BC1"; + case block_format::cPVRTC1_4_RGB: return "PVRTC1_4_RGB"; + case block_format::cPVRTC1_4_RGBA: return "PVRTC1_4_RGBA"; + case block_format::cBC7: return "BC7"; + case block_format::cETC2_RGBA: return "ETC2_RGBA"; + case block_format::cBC3: return "BC3"; + case block_format::cASTC_4x4: return "ASTC_4x4"; + case block_format::cATC_RGB: return "ATC_RGB"; + case block_format::cRGBA32: return "RGBA32"; + case block_format::cRGB565: return "RGB565"; + case block_format::cBGR565: return "BGR565"; + case block_format::cRGBA4444: return "RGBA4444"; + case block_format::cUASTC_4x4: return "UASTC_4x4"; + case block_format::cFXT1_RGB: return "FXT1_RGB"; + case block_format::cPVRTC2_4_RGB: return "PVRTC2_4_RGB"; + case block_format::cPVRTC2_4_RGBA: return "PVRTC2_4_RGBA"; + case block_format::cETC2_EAC_R11: return "ETC2_EAC_R11"; + case block_format::cETC2_EAC_RG11: return "ETC2_EAC_RG11"; + default: + assert(0); + BASISU_DEVEL_ERROR("basis_get_basisu_texture_format: Invalid fmt\n"); + break; + } + return ""; + } + + const char* basis_get_texture_type_name(basis_texture_type tex_type) + { + switch (tex_type) + { + case cBASISTexType2D: return "2D"; + case cBASISTexType2DArray: return "2D array"; + case cBASISTexTypeCubemapArray: return "cubemap array"; + case cBASISTexTypeVideoFrames: return "video"; + case cBASISTexTypeVolume: return "3D"; + default: + assert(0); + BASISU_DEVEL_ERROR("basis_get_texture_type_name: Invalid tex_type\n"); + break; + } + return ""; + } + + bool basis_transcoder_format_has_alpha(transcoder_texture_format fmt) + { + switch (fmt) + { + case transcoder_texture_format::cTFETC2_RGBA: + case transcoder_texture_format::cTFBC3_RGBA: + case transcoder_texture_format::cTFASTC_4x4_RGBA: + case transcoder_texture_format::cTFBC7_RGBA: + case transcoder_texture_format::cTFBC7_ALT: + case transcoder_texture_format::cTFPVRTC1_4_RGBA: + case transcoder_texture_format::cTFPVRTC2_4_RGBA: + case transcoder_texture_format::cTFATC_RGBA: + case transcoder_texture_format::cTFRGBA32: + case transcoder_texture_format::cTFRGBA4444: + return true; + default: + break; + } + return false; + } + + basisu::texture_format basis_get_basisu_texture_format(transcoder_texture_format fmt) + { + switch (fmt) + { + case transcoder_texture_format::cTFETC1_RGB: return basisu::texture_format::cETC1; + case transcoder_texture_format::cTFBC1_RGB: return basisu::texture_format::cBC1; + case transcoder_texture_format::cTFBC4_R: return basisu::texture_format::cBC4; + case transcoder_texture_format::cTFPVRTC1_4_RGB: return basisu::texture_format::cPVRTC1_4_RGB; + case transcoder_texture_format::cTFPVRTC1_4_RGBA: return basisu::texture_format::cPVRTC1_4_RGBA; + case transcoder_texture_format::cTFBC7_RGBA: return basisu::texture_format::cBC7; + case transcoder_texture_format::cTFBC7_ALT: return basisu::texture_format::cBC7; + case transcoder_texture_format::cTFETC2_RGBA: return basisu::texture_format::cETC2_RGBA; + case transcoder_texture_format::cTFBC3_RGBA: return basisu::texture_format::cBC3; + case transcoder_texture_format::cTFBC5_RG: return basisu::texture_format::cBC5; + case transcoder_texture_format::cTFASTC_4x4_RGBA: return basisu::texture_format::cASTC4x4; + case transcoder_texture_format::cTFATC_RGB: return basisu::texture_format::cATC_RGB; + case transcoder_texture_format::cTFATC_RGBA: return basisu::texture_format::cATC_RGBA_INTERPOLATED_ALPHA; + case transcoder_texture_format::cTFRGBA32: return basisu::texture_format::cRGBA32; + case transcoder_texture_format::cTFRGB565: return basisu::texture_format::cRGB565; + case transcoder_texture_format::cTFBGR565: return basisu::texture_format::cBGR565; + case transcoder_texture_format::cTFRGBA4444: return basisu::texture_format::cRGBA4444; + case transcoder_texture_format::cTFFXT1_RGB: return basisu::texture_format::cFXT1_RGB; + case transcoder_texture_format::cTFPVRTC2_4_RGB: return basisu::texture_format::cPVRTC2_4_RGBA; + case transcoder_texture_format::cTFPVRTC2_4_RGBA: return basisu::texture_format::cPVRTC2_4_RGBA; + case transcoder_texture_format::cTFETC2_EAC_R11: return basisu::texture_format::cETC2_R11_EAC; + case transcoder_texture_format::cTFETC2_EAC_RG11: return basisu::texture_format::cETC2_RG11_EAC; + default: + assert(0); + BASISU_DEVEL_ERROR("basis_get_basisu_texture_format: Invalid fmt\n"); + break; + } + return basisu::texture_format::cInvalidTextureFormat; + } + + bool basis_transcoder_format_is_uncompressed(transcoder_texture_format tex_type) + { + switch (tex_type) + { + case transcoder_texture_format::cTFRGBA32: + case transcoder_texture_format::cTFRGB565: + case transcoder_texture_format::cTFBGR565: + case transcoder_texture_format::cTFRGBA4444: + return true; + default: + break; + } + return false; + } + + bool basis_block_format_is_uncompressed(block_format blk_fmt) + { + switch (blk_fmt) + { + case block_format::cRGB32: + case block_format::cRGBA32: + case block_format::cA32: + case block_format::cRGB565: + case block_format::cBGR565: + case block_format::cRGBA4444: + case block_format::cRGBA4444_COLOR: + case block_format::cRGBA4444_ALPHA: + case block_format::cRGBA4444_COLOR_OPAQUE: + return true; + default: + break; + } + return false; + } + + uint32_t basis_get_uncompressed_bytes_per_pixel(transcoder_texture_format fmt) + { + switch (fmt) + { + case transcoder_texture_format::cTFRGBA32: + return sizeof(uint32_t); + case transcoder_texture_format::cTFRGB565: + case transcoder_texture_format::cTFBGR565: + case transcoder_texture_format::cTFRGBA4444: + return sizeof(uint16_t); + default: + break; + } + return 0; + } + + uint32_t basis_get_block_width(transcoder_texture_format tex_type) + { + switch (tex_type) + { + case transcoder_texture_format::cTFFXT1_RGB: + return 8; + default: + break; + } + return 4; + } + + uint32_t basis_get_block_height(transcoder_texture_format tex_type) + { + BASISU_NOTE_UNUSED(tex_type); + return 4; + } + + bool basis_is_format_supported(transcoder_texture_format tex_type, basis_tex_format fmt) + { + if (fmt == basis_tex_format::cUASTC4x4) + { +#if BASISD_SUPPORT_UASTC + switch (tex_type) + { + // These niche formats aren't currently supported for UASTC - everything else is. + case transcoder_texture_format::cTFPVRTC2_4_RGB: + case transcoder_texture_format::cTFPVRTC2_4_RGBA: + case transcoder_texture_format::cTFATC_RGB: + case transcoder_texture_format::cTFATC_RGBA: + case transcoder_texture_format::cTFFXT1_RGB: + return false; + default: + return true; + } +#endif + } + else + { + switch (tex_type) + { + // ETC1 and uncompressed are always supported. + case transcoder_texture_format::cTFETC1_RGB: + case transcoder_texture_format::cTFRGBA32: + case transcoder_texture_format::cTFRGB565: + case transcoder_texture_format::cTFBGR565: + case transcoder_texture_format::cTFRGBA4444: + return true; +#if BASISD_SUPPORT_DXT1 + case transcoder_texture_format::cTFBC1_RGB: + return true; +#endif +#if BASISD_SUPPORT_DXT5A + case transcoder_texture_format::cTFBC4_R: + case transcoder_texture_format::cTFBC5_RG: + return true; +#endif +#if BASISD_SUPPORT_DXT1 && BASISD_SUPPORT_DXT5A + case transcoder_texture_format::cTFBC3_RGBA: + return true; +#endif +#if BASISD_SUPPORT_PVRTC1 + case transcoder_texture_format::cTFPVRTC1_4_RGB: + case transcoder_texture_format::cTFPVRTC1_4_RGBA: + return true; +#endif +#if BASISD_SUPPORT_BC7_MODE5 + case transcoder_texture_format::cTFBC7_RGBA: + case transcoder_texture_format::cTFBC7_ALT: + return true; +#endif +#if BASISD_SUPPORT_ETC2_EAC_A8 + case transcoder_texture_format::cTFETC2_RGBA: + return true; +#endif +#if BASISD_SUPPORT_ASTC + case transcoder_texture_format::cTFASTC_4x4_RGBA: + return true; +#endif +#if BASISD_SUPPORT_ATC + case transcoder_texture_format::cTFATC_RGB: + case transcoder_texture_format::cTFATC_RGBA: + return true; +#endif +#if BASISD_SUPPORT_FXT1 + case transcoder_texture_format::cTFFXT1_RGB: + return true; +#endif +#if BASISD_SUPPORT_PVRTC2 + case transcoder_texture_format::cTFPVRTC2_4_RGB: + case transcoder_texture_format::cTFPVRTC2_4_RGBA: + return true; +#endif +#if BASISD_SUPPORT_ETC2_EAC_RG11 + case transcoder_texture_format::cTFETC2_EAC_R11: + case transcoder_texture_format::cTFETC2_EAC_RG11: + return true; +#endif + default: + break; + } + } + + return false; + } + + // ------------------------------------------------------------------------------------------------------ + // UASTC + // ------------------------------------------------------------------------------------------------------ + +#if BASISD_SUPPORT_UASTC + const astc_bc7_common_partition2_desc g_astc_bc7_common_partitions2[TOTAL_ASTC_BC7_COMMON_PARTITIONS2] = + { + { 0, 28, false }, { 1, 20, false }, { 2, 16, true }, { 3, 29, false }, + { 4, 91, true }, { 5, 9, false }, { 6, 107, true }, { 7, 72, true }, + { 8, 149, false }, { 9, 204, true }, { 10, 50, false }, { 11, 114, true }, + { 12, 496, true }, { 13, 17, true }, { 14, 78, false }, { 15, 39, true }, + { 17, 252, true }, { 18, 828, true }, { 19, 43, false }, { 20, 156, false }, + { 21, 116, false }, { 22, 210, true }, { 23, 476, true }, { 24, 273, false }, + { 25, 684, true }, { 26, 359, false }, { 29, 246, true }, { 32, 195, true }, + { 33, 694, true }, { 52, 524, true } + }; + + const bc73_astc2_common_partition_desc g_bc7_3_astc2_common_partitions[TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS] = + { + { 10, 36, 4 }, { 11, 48, 4 }, { 0, 61, 3 }, { 2, 137, 4 }, + { 8, 161, 5 }, { 13, 183, 4 }, { 1, 226, 2 }, { 33, 281, 2 }, + { 40, 302, 3 }, { 20, 307, 4 }, { 21, 479, 0 }, { 58, 495, 3 }, + { 3, 593, 0 }, { 32, 594, 2 }, { 59, 605, 1 }, { 34, 799, 3 }, + { 20, 812, 1 }, { 14, 988, 4 }, { 31, 993, 3 } + }; + + const astc_bc7_common_partition3_desc g_astc_bc7_common_partitions3[TOTAL_ASTC_BC7_COMMON_PARTITIONS3] = + { + { 4, 260, 0 }, { 8, 74, 5 }, { 9, 32, 5 }, { 10, 156, 2 }, + { 11, 183, 2 }, { 12, 15, 0 }, { 13, 745, 4 }, { 20, 0, 1 }, + { 35, 335, 1 }, { 36, 902, 5 }, { 57, 254, 0 } + }; + + const uint8_t g_astc_to_bc7_partition_index_perm_tables[6][3] = { { 0, 1, 2 }, { 1, 2, 0 }, { 2, 0, 1 }, { 2, 1, 0 }, { 0, 2, 1 }, { 1, 0, 2 } }; + + const uint8_t g_bc7_to_astc_partition_index_perm_tables[6][3] = { { 0, 1, 2 }, { 2, 0, 1 }, { 1, 2, 0 }, { 2, 1, 0 }, { 0, 2, 1 }, { 1, 0, 2 } }; + + uint32_t bc7_convert_partition_index_3_to_2(uint32_t p, uint32_t k) + { + assert(k < 6); + switch (k >> 1) + { + case 0: + if (p <= 1) + p = 0; + else + p = 1; + break; + case 1: + if (p == 0) + p = 0; + else + p = 1; + break; + case 2: + if ((p == 0) || (p == 2)) + p = 0; + else + p = 1; + break; + } + if (k & 1) + p = 1 - p; + return p; + } + + static const uint8_t g_zero_pattern[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + const uint8_t g_astc_bc7_patterns2[TOTAL_ASTC_BC7_COMMON_PARTITIONS2][16] = + { + { 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1 }, { 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1 }, { 1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0 }, { 0,0,0,1,0,0,1,1,0,0,1,1,0,1,1,1 }, + { 1,1,1,1,1,1,1,0,1,1,1,0,1,1,0,0 }, { 0,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1 }, { 1,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0 }, { 1,1,1,1,1,1,1,0,1,1,0,0,1,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1 }, { 1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1 }, { 1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0 }, + { 1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0 }, { 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0 }, { 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 }, { 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0 }, + { 1,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1 }, { 1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,1 }, { 0,1,1,1,0,0,1,1,0,0,0,1,0,0,0,0 }, { 0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,1,0,0,0,1,1,0,0,1,1,1,0 }, { 1,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1 }, { 1,0,0,0,1,1,0,0,1,1,0,0,1,1,1,0 }, { 0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0 }, + { 1,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1 }, { 0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0 }, { 1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1 }, { 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0 }, + { 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0 }, { 1,0,0,1,0,0,1,1,0,1,1,0,1,1,0,0 } + }; + + const uint8_t g_astc_bc7_patterns3[TOTAL_ASTC_BC7_COMMON_PARTITIONS3][16] = + { + { 0,0,0,0,0,0,0,0,1,1,2,2,1,1,2,2 }, { 1,1,1,1,1,1,1,1,0,0,0,0,2,2,2,2 }, { 1,1,1,1,0,0,0,0,0,0,0,0,2,2,2,2 }, { 1,1,1,1,2,2,2,2,0,0,0,0,0,0,0,0 }, + { 1,1,2,0,1,1,2,0,1,1,2,0,1,1,2,0 }, { 0,1,1,2,0,1,1,2,0,1,1,2,0,1,1,2 }, { 0,2,1,1,0,2,1,1,0,2,1,1,0,2,1,1 }, { 2,0,0,0,2,0,0,0,2,1,1,1,2,1,1,1 }, + { 2,0,1,2,2,0,1,2,2,0,1,2,2,0,1,2 }, { 1,1,1,1,0,0,0,0,2,2,2,2,1,1,1,1 }, { 0,0,2,2,0,0,1,1,0,0,1,1,0,0,2,2 } + }; + + const uint8_t g_bc7_3_astc2_patterns2[TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS][16] = + { + { 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0 }, { 0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0 }, { 1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1 }, + { 1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1 }, { 0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0 }, { 0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1 }, { 0,1,1,1,0,0,1,1,0,0,1,1,0,0,1,1 }, + { 1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0 }, { 0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,0 }, { 1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0 }, + { 0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1 }, { 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0 }, { 1,1,0,0,1,1,0,0,1,1,0,0,1,0,0,0 }, + { 1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0 }, { 0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0 }, { 1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0 } + }; + + const uint8_t g_astc_bc7_pattern2_anchors[TOTAL_ASTC_BC7_COMMON_PARTITIONS2][3] = + { + { 0, 2 }, { 0, 3 }, { 1, 0 }, { 0, 3 }, { 7, 0 }, { 0, 2 }, { 3, 0 }, { 7, 0 }, + { 0, 11 }, { 2, 0 }, { 0, 7 }, { 11, 0 }, { 3, 0 }, { 8, 0 }, { 0, 4 }, { 12, 0 }, + { 1, 0 }, { 8, 0 }, { 0, 1 }, { 0, 2 }, { 0, 4 }, { 8, 0 }, { 1, 0 }, { 0, 2 }, + { 4, 0 }, { 0, 1 }, { 4, 0 }, { 1, 0 }, { 4, 0 }, { 1, 0 } + }; + + const uint8_t g_astc_bc7_pattern3_anchors[TOTAL_ASTC_BC7_COMMON_PARTITIONS3][3] = + { + { 0, 8, 10 }, { 8, 0, 12 }, { 4, 0, 12 }, { 8, 0, 4 }, { 3, 0, 2 }, { 0, 1, 3 }, { 0, 2, 1 }, { 1, 9, 0 }, { 1, 2, 0 }, { 4, 0, 8 }, { 0, 6, 2 } + }; + + const uint8_t g_bc7_3_astc2_patterns2_anchors[TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS][3] = + { + { 0, 4 }, { 0, 2 }, { 2, 0 }, { 0, 7 }, { 8, 0 }, { 0, 1 }, { 0, 3 }, { 0, 1 }, { 2, 0 }, { 0, 1 }, { 0, 8 }, { 2, 0 }, { 0, 1 }, { 0, 7 }, { 12, 0 }, { 2, 0 }, { 9, 0 }, { 0, 2 }, { 4, 0 } + }; + + const uint32_t g_uastc_mode_huff_codes[TOTAL_UASTC_MODES + 1][2] = + { + { 0x1, 4 }, + { 0x35, 6 }, + { 0x1D, 5 }, + { 0x3, 5 }, + + { 0x13, 5 }, + { 0xB, 5 }, + { 0x1B, 5 }, + { 0x7, 5 }, + + { 0x17, 5 }, + { 0xF, 5 }, + { 0x2, 3 }, + { 0x0, 2 }, + + { 0x6, 3 }, + { 0x1F, 5 }, + { 0xD, 5 }, + { 0x5, 7 }, + + { 0x15, 6 }, + { 0x25, 6 }, + { 0x9, 4 }, + { 0x45, 7 } // future expansion + }; + + // If g_uastc_mode_huff_codes[] changes this table must be updated! + static const uint8_t g_uastc_huff_modes[128] = + { + 11,0,10,3,11,15,12,7,11,18,10,5,11,14,12,9,11,0,10,4,11,16,12,8,11,18,10,6,11,2,12,13,11,0,10,3,11,17,12,7,11,18,10,5,11,14,12,9,11,0,10,4,11,1,12,8,11,18,10,6,11,2,12,13,11,0,10,3,11, + 19,12,7,11,18,10,5,11,14,12,9,11,0,10,4,11,16,12,8,11,18,10,6,11,2,12,13,11,0,10,3,11,17,12,7,11,18,10,5,11,14,12,9,11,0,10,4,11,1,12,8,11,18,10,6,11,2,12,13 + }; + + const uint8_t g_uastc_mode_weight_bits[TOTAL_UASTC_MODES] = { 4, 2, 3, 2, 2, 3, 2, 2, 0, 2, 4, 2, 3, 1, 2, 4, 2, 2, 5 }; + const uint8_t g_uastc_mode_weight_ranges[TOTAL_UASTC_MODES] = { 8, 2, 5, 2, 2, 5, 2, 2, 0, 2, 8, 2, 5, 0, 2, 8, 2, 2, 11 }; + const uint8_t g_uastc_mode_endpoint_ranges[TOTAL_UASTC_MODES] = { 19, 20, 8, 7, 12, 20, 18, 12, 0, 8, 13, 13, 19, 20, 20, 20, 20, 20, 11 }; + const uint8_t g_uastc_mode_subsets[TOTAL_UASTC_MODES] = { 1, 1, 2, 3, 2, 1, 1, 2, 0, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1 }; + const uint8_t g_uastc_mode_planes[TOTAL_UASTC_MODES] = { 1, 1, 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1 }; + const uint8_t g_uastc_mode_comps[TOTAL_UASTC_MODES] = { 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 3 }; + const uint8_t g_uastc_mode_has_etc1_bias[TOTAL_UASTC_MODES] = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 }; + const uint8_t g_uastc_mode_has_bc1_hint0[TOTAL_UASTC_MODES] = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + const uint8_t g_uastc_mode_has_bc1_hint1[TOTAL_UASTC_MODES] = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 }; + const uint8_t g_uastc_mode_cem[TOTAL_UASTC_MODES] = { 8, 8, 8, 8, 8, 8, 8, 8, 0, 12, 12, 12, 12, 12, 12, 4, 4, 4, 8 }; + const uint8_t g_uastc_mode_has_alpha[TOTAL_UASTC_MODES] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }; + const uint8_t g_uastc_mode_is_la[TOTAL_UASTC_MODES] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0 }; + const uint8_t g_uastc_mode_total_hint_bits[TOTAL_UASTC_MODES] = { 15, 15, 15, 15, 15, 15, 15, 15, 0, 23, 17, 17, 17, 23, 23, 23, 23, 23, 15 }; + + // bits, trits, quints + const int g_astc_bise_range_table[TOTAL_ASTC_RANGES][3] = + { + { 1, 0, 0 }, // 0-1 0 + { 0, 1, 0 }, // 0-2 1 + { 2, 0, 0 }, // 0-3 2 + { 0, 0, 1 }, // 0-4 3 + + { 1, 1, 0 }, // 0-5 4 + { 3, 0, 0 }, // 0-7 5 + { 1, 0, 1 }, // 0-9 6 + { 2, 1, 0 }, // 0-11 7 + + { 4, 0, 0 }, // 0-15 8 + { 2, 0, 1 }, // 0-19 9 + { 3, 1, 0 }, // 0-23 10 + { 5, 0, 0 }, // 0-31 11 + + { 3, 0, 1 }, // 0-39 12 + { 4, 1, 0 }, // 0-47 13 + { 6, 0, 0 }, // 0-63 14 + { 4, 0, 1 }, // 0-79 15 + + { 5, 1, 0 }, // 0-95 16 + { 7, 0, 0 }, // 0-127 17 + { 5, 0, 1 }, // 0-159 18 + { 6, 1, 0 }, // 0-191 19 + + { 8, 0, 0 }, // 0-255 20 + }; + + int astc_get_levels(int range) + { + assert(range < (int)BC7ENC_TOTAL_ASTC_RANGES); + return (1 + 2 * g_astc_bise_range_table[range][1] + 4 * g_astc_bise_range_table[range][2]) << g_astc_bise_range_table[range][0]; + } + + // g_astc_unquant[] is the inverse of g_astc_sorted_order_unquant[] + astc_quant_bin g_astc_unquant[BC7ENC_TOTAL_ASTC_RANGES][256]; // [ASTC encoded endpoint index] + + // Taken right from the ASTC spec. + static struct + { + const char* m_pB_str; + uint32_t m_c; + } g_astc_endpoint_unquant_params[BC7ENC_TOTAL_ASTC_RANGES] = + { + { "", 0 }, + { "", 0 }, + { "", 0 }, + { "", 0 }, + { "000000000", 204, }, // 0-5 + { "", 0 }, + { "000000000", 113, }, // 0-9 + { "b000b0bb0", 93 }, // 0-11 + { "", 0 }, + { "b0000bb00", 54 }, // 0-19 + { "cb000cbcb", 44 }, // 0-23 + { "", 0 }, + { "cb0000cbc", 26 }, // 0-39 + { "dcb000dcb", 22 }, // 0-47 + { "", 0 }, + { "dcb0000dc", 13 }, // 0-79 + { "edcb000ed", 11 }, // 0-95 + { "", 0 }, + { "edcb0000e", 6 }, // 0-159 + { "fedcb000f", 5 }, // 0-191 + { "", 0 }, + }; + + bool astc_is_valid_endpoint_range(uint32_t range) + { + if ((g_astc_bise_range_table[range][1] == 0) && (g_astc_bise_range_table[range][2] == 0)) + return true; + + return g_astc_endpoint_unquant_params[range].m_c != 0; + } + + uint32_t unquant_astc_endpoint(uint32_t packed_bits, uint32_t packed_trits, uint32_t packed_quints, uint32_t range) + { + assert(range < BC7ENC_TOTAL_ASTC_RANGES); + + const uint32_t bits = g_astc_bise_range_table[range][0]; + const uint32_t trits = g_astc_bise_range_table[range][1]; + const uint32_t quints = g_astc_bise_range_table[range][2]; + + uint32_t val = 0; + if ((!trits) && (!quints)) + { + assert(!packed_trits && !packed_quints); + + int bits_left = 8; + while (bits_left > 0) + { + uint32_t v = packed_bits; + + int n = basisu::minimumi(bits_left, bits); + if (n < (int)bits) + v >>= (bits - n); + + assert(v < (1U << n)); + + val |= (v << (bits_left - n)); + bits_left -= n; + } + } + else + { + const uint32_t A = (packed_bits & 1) ? 511 : 0; + const uint32_t C = g_astc_endpoint_unquant_params[range].m_c; + const uint32_t D = trits ? packed_trits : packed_quints; + + assert(C); + + uint32_t B = 0; + for (uint32_t i = 0; i < 9; i++) + { + B <<= 1; + + char c = g_astc_endpoint_unquant_params[range].m_pB_str[i]; + if (c != '0') + { + c -= 'a'; + B |= ((packed_bits >> c) & 1); + } + } + + val = D * C + B; + val = val ^ A; + val = (A & 0x80) | (val >> 2); + } + + return val; + } + + uint32_t unquant_astc_endpoint_val(uint32_t packed_val, uint32_t range) + { + assert(range < BC7ENC_TOTAL_ASTC_RANGES); + assert(packed_val < (uint32_t)astc_get_levels(range)); + + const uint32_t bits = g_astc_bise_range_table[range][0]; + const uint32_t trits = g_astc_bise_range_table[range][1]; + const uint32_t quints = g_astc_bise_range_table[range][2]; + + if ((!trits) && (!quints)) + return unquant_astc_endpoint(packed_val, 0, 0, range); + else if (trits) + return unquant_astc_endpoint(packed_val & ((1 << bits) - 1), packed_val >> bits, 0, range); + else + return unquant_astc_endpoint(packed_val & ((1 << bits) - 1), 0, packed_val >> bits, range); + } + + // BC7 - Various BC7 tables/helpers + const uint32_t g_bc7_weights1[2] = { 0, 64 }; + const uint32_t g_bc7_weights2[4] = { 0, 21, 43, 64 }; + const uint32_t g_bc7_weights3[8] = { 0, 9, 18, 27, 37, 46, 55, 64 }; + const uint32_t g_bc7_weights4[16] = { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 }; + const uint32_t g_astc_weights4[16] = { 0, 4, 8, 12, 17, 21, 25, 29, 35, 39, 43, 47, 52, 56, 60, 64 }; + const uint32_t g_astc_weights5[32] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 }; + const uint32_t g_astc_weights_3levels[3] = { 0, 32, 64 }; + + const uint8_t g_bc7_partition1[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; + + const uint8_t g_bc7_partition2[64 * 16] = + { + 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1, 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1, 0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1, 0,0,0,1,0,0,1,1,0,0,1,1,0,1,1,1, 0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1, 0,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1, 0,0,0,1,0,0,1,1,0,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,1,0,0,1,1,0,1,1,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1, 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1, 0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, + 0,0,0,0,1,0,0,0,1,1,1,0,1,1,1,1, 0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0, 0,1,1,1,0,0,1,1,0,0,0,1,0,0,0,0, 0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,1,1,0,0,1,1,1,0, 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0, 0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1, + 0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0, 0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0, 0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0, 0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0, 0,0,0,1,0,1,1,1,1,1,1,0,1,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0, 0,1,1,1,0,0,0,1,1,0,0,0,1,1,1,0, 0,0,1,1,1,0,0,1,1,0,0,1,1,1,0,0, + 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, 0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1, 0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,0, 0,0,1,1,0,0,1,1,1,1,0,0,1,1,0,0, 0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0, 0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0, 0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1, 0,1,0,1,1,0,1,0,1,0,1,0,0,1,0,1, + 0,1,1,1,0,0,1,1,1,1,0,0,1,1,1,0, 0,0,0,1,0,0,1,1,1,1,0,0,1,0,0,0, 0,0,1,1,0,0,1,0,0,1,0,0,1,1,0,0, 0,0,1,1,1,0,1,1,1,1,0,1,1,1,0,0, 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, 0,0,1,1,1,1,0,0,1,1,0,0,0,0,1,1, 0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1, 0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0, + 0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0, 0,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,1,1,1,0,0,1,0, 0,0,0,0,0,1,0,0,1,1,1,0,0,1,0,0, 0,1,1,0,1,1,0,0,1,0,0,1,0,0,1,1, 0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,1, 0,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0, 0,0,1,1,1,0,0,1,1,1,0,0,0,1,1,0, + 0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,1, 0,1,1,0,0,0,1,1,0,0,1,1,1,0,0,1, 0,1,1,1,1,1,1,0,1,0,0,0,0,0,0,1, 0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,1, 0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1, 0,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0, 0,0,1,0,0,0,1,0,1,1,1,0,1,1,1,0, 0,1,0,0,0,1,0,0,0,1,1,1,0,1,1,1 + }; + + const uint8_t g_bc7_partition3[64 * 16] = + { + 0,0,1,1,0,0,1,1,0,2,2,1,2,2,2,2, 0,0,0,1,0,0,1,1,2,2,1,1,2,2,2,1, 0,0,0,0,2,0,0,1,2,2,1,1,2,2,1,1, 0,2,2,2,0,0,2,2,0,0,1,1,0,1,1,1, 0,0,0,0,0,0,0,0,1,1,2,2,1,1,2,2, 0,0,1,1,0,0,1,1,0,0,2,2,0,0,2,2, 0,0,2,2,0,0,2,2,1,1,1,1,1,1,1,1, 0,0,1,1,0,0,1,1,2,2,1,1,2,2,1,1, + 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2, 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2, 0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2, 0,0,1,2,0,0,1,2,0,0,1,2,0,0,1,2, 0,1,1,2,0,1,1,2,0,1,1,2,0,1,1,2, 0,1,2,2,0,1,2,2,0,1,2,2,0,1,2,2, 0,0,1,1,0,1,1,2,1,1,2,2,1,2,2,2, 0,0,1,1,2,0,0,1,2,2,0,0,2,2,2,0, + 0,0,0,1,0,0,1,1,0,1,1,2,1,1,2,2, 0,1,1,1,0,0,1,1,2,0,0,1,2,2,0,0, 0,0,0,0,1,1,2,2,1,1,2,2,1,1,2,2, 0,0,2,2,0,0,2,2,0,0,2,2,1,1,1,1, 0,1,1,1,0,1,1,1,0,2,2,2,0,2,2,2, 0,0,0,1,0,0,0,1,2,2,2,1,2,2,2,1, 0,0,0,0,0,0,1,1,0,1,2,2,0,1,2,2, 0,0,0,0,1,1,0,0,2,2,1,0,2,2,1,0, + 0,1,2,2,0,1,2,2,0,0,1,1,0,0,0,0, 0,0,1,2,0,0,1,2,1,1,2,2,2,2,2,2, 0,1,1,0,1,2,2,1,1,2,2,1,0,1,1,0, 0,0,0,0,0,1,1,0,1,2,2,1,1,2,2,1, 0,0,2,2,1,1,0,2,1,1,0,2,0,0,2,2, 0,1,1,0,0,1,1,0,2,0,0,2,2,2,2,2, 0,0,1,1,0,1,2,2,0,1,2,2,0,0,1,1, 0,0,0,0,2,0,0,0,2,2,1,1,2,2,2,1, + 0,0,0,0,0,0,0,2,1,1,2,2,1,2,2,2, 0,2,2,2,0,0,2,2,0,0,1,2,0,0,1,1, 0,0,1,1,0,0,1,2,0,0,2,2,0,2,2,2, 0,1,2,0,0,1,2,0,0,1,2,0,0,1,2,0, 0,0,0,0,1,1,1,1,2,2,2,2,0,0,0,0, 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0, 0,1,2,0,2,0,1,2,1,2,0,1,0,1,2,0, 0,0,1,1,2,2,0,0,1,1,2,2,0,0,1,1, + 0,0,1,1,1,1,2,2,2,2,0,0,0,0,1,1, 0,1,0,1,0,1,0,1,2,2,2,2,2,2,2,2, 0,0,0,0,0,0,0,0,2,1,2,1,2,1,2,1, 0,0,2,2,1,1,2,2,0,0,2,2,1,1,2,2, 0,0,2,2,0,0,1,1,0,0,2,2,0,0,1,1, 0,2,2,0,1,2,2,1,0,2,2,0,1,2,2,1, 0,1,0,1,2,2,2,2,2,2,2,2,0,1,0,1, 0,0,0,0,2,1,2,1,2,1,2,1,2,1,2,1, + 0,1,0,1,0,1,0,1,0,1,0,1,2,2,2,2, 0,2,2,2,0,1,1,1,0,2,2,2,0,1,1,1, 0,0,0,2,1,1,1,2,0,0,0,2,1,1,1,2, 0,0,0,0,2,1,1,2,2,1,1,2,2,1,1,2, 0,2,2,2,0,1,1,1,0,1,1,1,0,2,2,2, 0,0,0,2,1,1,1,2,1,1,1,2,0,0,0,2, 0,1,1,0,0,1,1,0,0,1,1,0,2,2,2,2, 0,0,0,0,0,0,0,0,2,1,1,2,2,1,1,2, + 0,1,1,0,0,1,1,0,2,2,2,2,2,2,2,2, 0,0,2,2,0,0,1,1,0,0,1,1,0,0,2,2, 0,0,2,2,1,1,2,2,1,1,2,2,0,0,2,2, 0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,2, 0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1, 0,2,2,2,1,2,2,2,0,2,2,2,1,2,2,2, 0,1,0,1,2,2,2,2,2,2,2,2,2,2,2,2, 0,1,1,1,2,0,1,1,2,2,0,1,2,2,2,0, + }; + + const uint8_t g_bc7_table_anchor_index_second_subset[64] = { 15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15, 15, 2, 8, 2, 2, 8, 8,15, 2, 8, 2, 2, 8, 8, 2, 2, 15,15, 6, 8, 2, 8,15,15, 2, 8, 2, 2, 2,15,15, 6, 6, 2, 6, 8,15,15, 2, 2, 15,15,15,15,15, 2, 2,15 }; + + const uint8_t g_bc7_table_anchor_index_third_subset_1[64] = + { + 3, 3,15,15, 8, 3,15,15, 8, 8, 6, 6, 6, 5, 3, 3, 3, 3, 8,15, 3, 3, 6,10, 5, 8, 8, 6, 8, 5,15,15, 8,15, 3, 5, 6,10, 8,15, 15, 3,15, 5,15,15,15,15, 3,15, 5, 5, 5, 8, 5,10, 5,10, 8,13,15,12, 3, 3 + }; + + const uint8_t g_bc7_table_anchor_index_third_subset_2[64] = + { + 15, 8, 8, 3,15,15, 3, 8, 15,15,15,15,15,15,15, 8, 15, 8,15, 3,15, 8,15, 8, 3,15, 6,10,15,15,10, 8, 15, 3,15,10,10, 8, 9,10, 6,15, 8,15, 3, 6, 6, 8, 15, 3,15,15,15,15,15,15, 15,15,15,15, 3,15,15, 8 + }; + + const uint8_t g_bc7_num_subsets[8] = { 3, 2, 3, 2, 1, 1, 1, 2 }; + const uint8_t g_bc7_partition_bits[8] = { 4, 6, 6, 6, 0, 0, 0, 6 }; + const uint8_t g_bc7_color_index_bitcount[8] = { 3, 3, 2, 2, 2, 2, 4, 2 }; + + const uint8_t g_bc7_mode_has_p_bits[8] = { 1, 1, 0, 1, 0, 0, 1, 1 }; + const uint8_t g_bc7_mode_has_shared_p_bits[8] = { 0, 1, 0, 0, 0, 0, 0, 0 }; + const uint8_t g_bc7_color_precision_table[8] = { 4, 6, 5, 7, 5, 7, 7, 5 }; + const int8_t g_bc7_alpha_precision_table[8] = { 0, 0, 0, 0, 6, 8, 7, 5 }; + + const uint8_t g_bc7_alpha_index_bitcount[8] = { 0, 0, 0, 0, 3, 2, 4, 2 }; + + endpoint_err g_bc7_mode_6_optimal_endpoints[256][2]; // [c][pbit] + endpoint_err g_bc7_mode_5_optimal_endpoints[256]; // [c] + + static inline void bc7_set_block_bits(uint8_t* pBytes, uint32_t val, uint32_t num_bits, uint32_t* pCur_ofs) + { + assert((num_bits <= 32) && (val < (1ULL << num_bits))); + while (num_bits) + { + const uint32_t n = basisu::minimumu(8 - (*pCur_ofs & 7), num_bits); + pBytes[*pCur_ofs >> 3] |= (uint8_t)(val << (*pCur_ofs & 7)); + val >>= n; + num_bits -= n; + *pCur_ofs += n; + } + assert(*pCur_ofs <= 128); + } + + // TODO: Optimize this. + void encode_bc7_block(void* pBlock, const bc7_optimization_results* pResults) + { + const uint32_t best_mode = pResults->m_mode; + + const uint32_t total_subsets = g_bc7_num_subsets[best_mode]; + const uint32_t total_partitions = 1 << g_bc7_partition_bits[best_mode]; + //const uint32_t num_rotations = 1 << g_bc7_rotation_bits[best_mode]; + //const uint32_t num_index_selectors = (best_mode == 4) ? 2 : 1; + + const uint8_t* pPartition; + if (total_subsets == 1) + pPartition = &g_bc7_partition1[0]; + else if (total_subsets == 2) + pPartition = &g_bc7_partition2[pResults->m_partition * 16]; + else + pPartition = &g_bc7_partition3[pResults->m_partition * 16]; + + uint8_t color_selectors[16]; + memcpy(color_selectors, pResults->m_selectors, 16); + + uint8_t alpha_selectors[16]; + memcpy(alpha_selectors, pResults->m_alpha_selectors, 16); + + color_quad_u8 low[3], high[3]; + memcpy(low, pResults->m_low, sizeof(low)); + memcpy(high, pResults->m_high, sizeof(high)); + + uint32_t pbits[3][2]; + memcpy(pbits, pResults->m_pbits, sizeof(pbits)); + + int anchor[3] = { -1, -1, -1 }; + + for (uint32_t k = 0; k < total_subsets; k++) + { + uint32_t anchor_index = 0; + if (k) + { + if ((total_subsets == 3) && (k == 1)) + anchor_index = g_bc7_table_anchor_index_third_subset_1[pResults->m_partition]; + else if ((total_subsets == 3) && (k == 2)) + anchor_index = g_bc7_table_anchor_index_third_subset_2[pResults->m_partition]; + else + anchor_index = g_bc7_table_anchor_index_second_subset[pResults->m_partition]; + } + + anchor[k] = anchor_index; + + const uint32_t color_index_bits = get_bc7_color_index_size(best_mode, pResults->m_index_selector); + const uint32_t num_color_indices = 1 << color_index_bits; + + if (color_selectors[anchor_index] & (num_color_indices >> 1)) + { + for (uint32_t i = 0; i < 16; i++) + if (pPartition[i] == k) + color_selectors[i] = (uint8_t)((num_color_indices - 1) - color_selectors[i]); + + if (get_bc7_mode_has_seperate_alpha_selectors(best_mode)) + { + for (uint32_t q = 0; q < 3; q++) + { + uint8_t t = low[k].m_c[q]; + low[k].m_c[q] = high[k].m_c[q]; + high[k].m_c[q] = t; + } + } + else + { + color_quad_u8 tmp = low[k]; + low[k] = high[k]; + high[k] = tmp; + } + + if (!g_bc7_mode_has_shared_p_bits[best_mode]) + { + uint32_t t = pbits[k][0]; + pbits[k][0] = pbits[k][1]; + pbits[k][1] = t; + } + } + + if (get_bc7_mode_has_seperate_alpha_selectors(best_mode)) + { + const uint32_t alpha_index_bits = get_bc7_alpha_index_size(best_mode, pResults->m_index_selector); + const uint32_t num_alpha_indices = 1 << alpha_index_bits; + + if (alpha_selectors[anchor_index] & (num_alpha_indices >> 1)) + { + for (uint32_t i = 0; i < 16; i++) + if (pPartition[i] == k) + alpha_selectors[i] = (uint8_t)((num_alpha_indices - 1) - alpha_selectors[i]); + + uint8_t t = low[k].m_c[3]; + low[k].m_c[3] = high[k].m_c[3]; + high[k].m_c[3] = t; + } + } + } + + uint8_t* pBlock_bytes = (uint8_t*)(pBlock); + memset(pBlock_bytes, 0, BC7ENC_BLOCK_SIZE); + + uint32_t cur_bit_ofs = 0; + bc7_set_block_bits(pBlock_bytes, 1 << best_mode, best_mode + 1, &cur_bit_ofs); + + if ((best_mode == 4) || (best_mode == 5)) + bc7_set_block_bits(pBlock_bytes, pResults->m_rotation, 2, &cur_bit_ofs); + + if (best_mode == 4) + bc7_set_block_bits(pBlock_bytes, pResults->m_index_selector, 1, &cur_bit_ofs); + + if (total_partitions > 1) + bc7_set_block_bits(pBlock_bytes, pResults->m_partition, (total_partitions == 64) ? 6 : 4, &cur_bit_ofs); + + const uint32_t total_comps = (best_mode >= 4) ? 4 : 3; + for (uint32_t comp = 0; comp < total_comps; comp++) + { + for (uint32_t subset = 0; subset < total_subsets; subset++) + { + bc7_set_block_bits(pBlock_bytes, low[subset].m_c[comp], (comp == 3) ? g_bc7_alpha_precision_table[best_mode] : g_bc7_color_precision_table[best_mode], &cur_bit_ofs); + bc7_set_block_bits(pBlock_bytes, high[subset].m_c[comp], (comp == 3) ? g_bc7_alpha_precision_table[best_mode] : g_bc7_color_precision_table[best_mode], &cur_bit_ofs); + } + } + + if (g_bc7_mode_has_p_bits[best_mode]) + { + for (uint32_t subset = 0; subset < total_subsets; subset++) + { + bc7_set_block_bits(pBlock_bytes, pbits[subset][0], 1, &cur_bit_ofs); + if (!g_bc7_mode_has_shared_p_bits[best_mode]) + bc7_set_block_bits(pBlock_bytes, pbits[subset][1], 1, &cur_bit_ofs); + } + } + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + int idx = x + y * 4; + + uint32_t n = pResults->m_index_selector ? get_bc7_alpha_index_size(best_mode, pResults->m_index_selector) : get_bc7_color_index_size(best_mode, pResults->m_index_selector); + + if ((idx == anchor[0]) || (idx == anchor[1]) || (idx == anchor[2])) + n--; + + bc7_set_block_bits(pBlock_bytes, pResults->m_index_selector ? alpha_selectors[idx] : color_selectors[idx], n, &cur_bit_ofs); + } + } + + if (get_bc7_mode_has_seperate_alpha_selectors(best_mode)) + { + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + int idx = x + y * 4; + + uint32_t n = pResults->m_index_selector ? get_bc7_color_index_size(best_mode, pResults->m_index_selector) : get_bc7_alpha_index_size(best_mode, pResults->m_index_selector); + + if ((idx == anchor[0]) || (idx == anchor[1]) || (idx == anchor[2])) + n--; + + bc7_set_block_bits(pBlock_bytes, pResults->m_index_selector ? color_selectors[idx] : alpha_selectors[idx], n, &cur_bit_ofs); + } + } + } + + assert(cur_bit_ofs == 128); + } + + // ASTC + static inline void astc_set_bits_1_to_9(uint32_t* pDst, int& bit_offset, uint32_t code, uint32_t codesize) + { + uint8_t* pBuf = reinterpret_cast(pDst); + + assert(codesize <= 9); + if (codesize) + { + uint32_t byte_bit_offset = bit_offset & 7; + uint32_t val = code << byte_bit_offset; + + uint32_t index = bit_offset >> 3; + pBuf[index] |= (uint8_t)val; + + if (codesize > (8 - byte_bit_offset)) + pBuf[index + 1] |= (uint8_t)(val >> 8); + + bit_offset += codesize; + } + } + + void pack_astc_solid_block(void* pDst_block, const color32& color) + { + uint32_t r = color[0], g = color[1], b = color[2]; + uint32_t a = color[3]; + + uint32_t* pOutput = static_cast(pDst_block); + uint8_t* pBytes = reinterpret_cast(pDst_block); + + pBytes[0] = 0xfc; pBytes[1] = 0xfd; pBytes[2] = 0xff; pBytes[3] = 0xff; + + pOutput[1] = 0xffffffff; + pOutput[2] = 0; + pOutput[3] = 0; + + int bit_pos = 64; + astc_set_bits(reinterpret_cast(pDst_block), bit_pos, r | (r << 8), 16); + astc_set_bits(reinterpret_cast(pDst_block), bit_pos, g | (g << 8), 16); + astc_set_bits(reinterpret_cast(pDst_block), bit_pos, b | (b << 8), 16); + astc_set_bits(reinterpret_cast(pDst_block), bit_pos, a | (a << 8), 16); + } + + // See 23.21 https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.inline.html#_partition_pattern_generation +#ifdef _DEBUG + static inline uint32_t astc_hash52(uint32_t v) + { + uint32_t p = v; + p ^= p >> 15; p -= p << 17; p += p << 7; p += p << 4; + p ^= p >> 5; p += p << 16; p ^= p >> 7; p ^= p >> 3; + p ^= p << 6; p ^= p >> 17; + return p; + } + + int astc_compute_texel_partition(int seed, int x, int y, int z, int partitioncount, bool small_block) + { + if (small_block) + { + x <<= 1; y <<= 1; z <<= 1; + } + seed += (partitioncount - 1) * 1024; + uint32_t rnum = astc_hash52(seed); + uint8_t seed1 = rnum & 0xF; + uint8_t seed2 = (rnum >> 4) & 0xF; + uint8_t seed3 = (rnum >> 8) & 0xF; + uint8_t seed4 = (rnum >> 12) & 0xF; + uint8_t seed5 = (rnum >> 16) & 0xF; + uint8_t seed6 = (rnum >> 20) & 0xF; + uint8_t seed7 = (rnum >> 24) & 0xF; + uint8_t seed8 = (rnum >> 28) & 0xF; + uint8_t seed9 = (rnum >> 18) & 0xF; + uint8_t seed10 = (rnum >> 22) & 0xF; + uint8_t seed11 = (rnum >> 26) & 0xF; + uint8_t seed12 = ((rnum >> 30) | (rnum << 2)) & 0xF; + + seed1 *= seed1; seed2 *= seed2; + seed3 *= seed3; seed4 *= seed4; + seed5 *= seed5; seed6 *= seed6; + seed7 *= seed7; seed8 *= seed8; + seed9 *= seed9; seed10 *= seed10; + seed11 *= seed11; seed12 *= seed12; + + int sh1, sh2, sh3; + if (seed & 1) + { + sh1 = (seed & 2 ? 4 : 5); sh2 = (partitioncount == 3 ? 6 : 5); + } + else + { + sh1 = (partitioncount == 3 ? 6 : 5); sh2 = (seed & 2 ? 4 : 5); + } + sh3 = (seed & 0x10) ? sh1 : sh2; + + seed1 >>= sh1; seed2 >>= sh2; seed3 >>= sh1; seed4 >>= sh2; + seed5 >>= sh1; seed6 >>= sh2; seed7 >>= sh1; seed8 >>= sh2; + seed9 >>= sh3; seed10 >>= sh3; seed11 >>= sh3; seed12 >>= sh3; + + int a = seed1 * x + seed2 * y + seed11 * z + (rnum >> 14); + int b = seed3 * x + seed4 * y + seed12 * z + (rnum >> 10); + int c = seed5 * x + seed6 * y + seed9 * z + (rnum >> 6); + int d = seed7 * x + seed8 * y + seed10 * z + (rnum >> 2); + + a &= 0x3F; b &= 0x3F; c &= 0x3F; d &= 0x3F; + + if (partitioncount < 4) d = 0; + if (partitioncount < 3) c = 0; + + if (a >= b && a >= c && a >= d) + return 0; + else if (b >= c && b >= d) + return 1; + else if (c >= d) + return 2; + else + return 3; + } +#endif + + static const uint8_t g_astc_quint_encode[125] = + { + 0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 16, 17, 18, 19, 20, 24, 25, 26, 27, 28, 5, 13, 21, 29, 6, 32, 33, 34, 35, 36, 40, 41, 42, 43, 44, 48, 49, 50, 51, 52, 56, 57, + 58, 59, 60, 37, 45, 53, 61, 14, 64, 65, 66, 67, 68, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 88, 89, 90, 91, 92, 69, 77, 85, 93, 22, 96, 97, 98, 99, 100, 104, + 105, 106, 107, 108, 112, 113, 114, 115, 116, 120, 121, 122, 123, 124, 101, 109, 117, 125, 30, 102, 103, 70, 71, 38, 110, 111, 78, 79, 46, 118, 119, 86, 87, 54, + 126, 127, 94, 95, 62, 39, 47, 55, 63, 31 + }; + + // Encodes 3 values to output, usable for any range that uses quints and bits + static inline void astc_encode_quints(uint32_t* pOutput, const uint8_t* pValues, int& bit_pos, int n) + { + // First extract the trits and the bits from the 5 input values + int quints = 0, bits[3]; + const uint32_t bit_mask = (1 << n) - 1; + for (int i = 0; i < 3; i++) + { + static const int s_muls[3] = { 1, 5, 25 }; + + const int t = pValues[i] >> n; + + quints += t * s_muls[i]; + bits[i] = pValues[i] & bit_mask; + } + + // Encode the quints, by inverting the bit manipulations done by the decoder, converting 3 quints into 7-bits. + // See https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html#astc-integer-sequence-encoding + + assert(quints < 125); + const int T = g_astc_quint_encode[quints]; + + // Now interleave the 7 encoded quint bits with the bits to form the encoded output. See table 95-96. + astc_set_bits(pOutput, bit_pos, bits[0] | (astc_extract_bits(T, 0, 2) << n) | (bits[1] << (3 + n)) | (astc_extract_bits(T, 3, 4) << (3 + n * 2)) | + (bits[2] << (5 + n * 2)) | (astc_extract_bits(T, 5, 6) << (5 + n * 3)), 7 + n * 3); + } + + // Packs values using ASTC's BISE to output buffer. + static void astc_pack_bise(uint32_t* pDst, const uint8_t* pSrc_vals, int bit_pos, int num_vals, int range) + { + uint32_t temp[5] = { 0, 0, 0, 0, 0 }; + + const int num_bits = g_astc_bise_range_table[range][0]; + + int group_size = 0; + if (g_astc_bise_range_table[range][1]) + group_size = 5; + else if (g_astc_bise_range_table[range][2]) + group_size = 3; + + if (group_size) + { + // Range has trits or quints - pack each group of 5 or 3 values + const int total_groups = (group_size == 5) ? ((num_vals + 4) / 5) : ((num_vals + 2) / 3); + + for (int group_index = 0; group_index < total_groups; group_index++) + { + uint8_t vals[5] = { 0, 0, 0, 0, 0 }; + + const int limit = basisu::minimum(group_size, num_vals - group_index * group_size); + for (int i = 0; i < limit; i++) + vals[i] = pSrc_vals[group_index * group_size + i]; + + if (group_size == 5) + astc_encode_trits(temp, vals, bit_pos, num_bits); + else + astc_encode_quints(temp, vals, bit_pos, num_bits); + } + } + else + { + for (int i = 0; i < num_vals; i++) + astc_set_bits_1_to_9(temp, bit_pos, pSrc_vals[i], num_bits); + } + + pDst[0] |= temp[0]; pDst[1] |= temp[1]; + pDst[2] |= temp[2]; pDst[3] |= temp[3]; + } + + const uint32_t ASTC_BLOCK_MODE_BITS = 11; + const uint32_t ASTC_PART_BITS = 2; + const uint32_t ASTC_CEM_BITS = 4; + const uint32_t ASTC_PARTITION_INDEX_BITS = 10; + const uint32_t ASTC_CCS_BITS = 2; + + const uint32_t g_uastc_mode_astc_block_mode[TOTAL_UASTC_MODES] = { 0x242, 0x42, 0x53, 0x42, 0x42, 0x53, 0x442, 0x42, 0, 0x42, 0x242, 0x442, 0x53, 0x441, 0x42, 0x242, 0x42, 0x442, 0x253 }; + + bool pack_astc_block(uint32_t* pDst, const astc_block_desc* pBlock, uint32_t uastc_mode) + { + assert(uastc_mode < TOTAL_UASTC_MODES); + uint8_t* pDst_bytes = reinterpret_cast(pDst); + + const int total_weights = pBlock->m_dual_plane ? 32 : 16; + + // Set mode bits - see Table 146-147 + uint32_t mode = g_uastc_mode_astc_block_mode[uastc_mode]; + pDst_bytes[0] = (uint8_t)mode; + pDst_bytes[1] = (uint8_t)(mode >> 8); + + memset(pDst_bytes + 2, 0, 16 - 2); + + int bit_pos = ASTC_BLOCK_MODE_BITS; + + // We only support 1-5 bit weight indices + assert(!g_astc_bise_range_table[pBlock->m_weight_range][1] && !g_astc_bise_range_table[pBlock->m_weight_range][2]); + const int bits_per_weight = g_astc_bise_range_table[pBlock->m_weight_range][0]; + + // See table 143 - PART + astc_set_bits_1_to_9(pDst, bit_pos, pBlock->m_subsets - 1, ASTC_PART_BITS); + + if (pBlock->m_subsets == 1) + astc_set_bits_1_to_9(pDst, bit_pos, pBlock->m_cem, ASTC_CEM_BITS); + else + { + // See table 145 + astc_set_bits(pDst, bit_pos, pBlock->m_partition_seed, ASTC_PARTITION_INDEX_BITS); + + // Table 150 - we assume all CEM's are equal, so write 2 0's along with the CEM + astc_set_bits_1_to_9(pDst, bit_pos, (pBlock->m_cem << 2) & 63, ASTC_CEM_BITS + 2); + } + + if (pBlock->m_dual_plane) + { + const int total_weight_bits = total_weights * bits_per_weight; + + // See Illegal Encodings 23.24 + // https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.inline.html#_illegal_encodings + assert((total_weight_bits >= 24) && (total_weight_bits <= 96)); + + int ccs_bit_pos = 128 - total_weight_bits - ASTC_CCS_BITS; + astc_set_bits_1_to_9(pDst, ccs_bit_pos, pBlock->m_ccs, ASTC_CCS_BITS); + } + + const int num_cem_pairs = (1 + (pBlock->m_cem >> 2)) * pBlock->m_subsets; + assert(num_cem_pairs <= 9); + + astc_pack_bise(pDst, pBlock->m_endpoints, bit_pos, num_cem_pairs * 2, g_uastc_mode_endpoint_ranges[uastc_mode]); + + // Write the weight bits in reverse bit order. + switch (bits_per_weight) + { + case 1: + { + const uint32_t N = 1; + for (int i = 0; i < total_weights; i++) + { + const uint32_t ofs = 128 - N - i; + assert((ofs >> 3) < 16); + pDst_bytes[ofs >> 3] |= (pBlock->m_weights[i] << (ofs & 7)); + } + break; + } + case 2: + { + const uint32_t N = 2; + for (int i = 0; i < total_weights; i++) + { + static const uint8_t s_reverse_bits2[4] = { 0, 2, 1, 3 }; + const uint32_t ofs = 128 - N - (i * N); + assert((ofs >> 3) < 16); + pDst_bytes[ofs >> 3] |= (s_reverse_bits2[pBlock->m_weights[i]] << (ofs & 7)); + } + break; + } + case 3: + { + const uint32_t N = 3; + for (int i = 0; i < total_weights; i++) + { + static const uint8_t s_reverse_bits3[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; + + const uint32_t ofs = 128 - N - (i * N); + const uint32_t rev = s_reverse_bits3[pBlock->m_weights[i]] << (ofs & 7); + + uint32_t index = ofs >> 3; + assert(index < 16); + pDst_bytes[index++] |= rev & 0xFF; + if (index < 16) + pDst_bytes[index++] |= (rev >> 8); + } + break; + } + case 4: + { + const uint32_t N = 4; + for (int i = 0; i < total_weights; i++) + { + static const uint8_t s_reverse_bits4[16] = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 }; + const int ofs = 128 - N - (i * N); + assert(ofs >= 0 && (ofs >> 3) < 16); + pDst_bytes[ofs >> 3] |= (s_reverse_bits4[pBlock->m_weights[i]] << (ofs & 7)); + } + break; + } + case 5: + { + const uint32_t N = 5; + for (int i = 0; i < total_weights; i++) + { + static const uint8_t s_reverse_bits5[32] = { 0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30, 1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31 }; + + const uint32_t ofs = 128 - N - (i * N); + const uint32_t rev = s_reverse_bits5[pBlock->m_weights[i]] << (ofs & 7); + + uint32_t index = ofs >> 3; + assert(index < 16); + pDst_bytes[index++] |= rev & 0xFF; + if (index < 16) + pDst_bytes[index++] |= (rev >> 8); + } + + break; + } + default: + assert(0); + break; + } + + return true; + } + + const uint8_t* get_anchor_indices(uint32_t subsets, uint32_t mode, uint32_t common_pattern, const uint8_t*& pPartition_pattern) + { + const uint8_t* pSubset_anchor_indices = g_zero_pattern; + pPartition_pattern = g_zero_pattern; + + if (subsets >= 2) + { + if (subsets == 3) + { + pPartition_pattern = &g_astc_bc7_patterns3[common_pattern][0]; + pSubset_anchor_indices = &g_astc_bc7_pattern3_anchors[common_pattern][0]; + } + else if (mode == 7) + { + pPartition_pattern = &g_bc7_3_astc2_patterns2[common_pattern][0]; + pSubset_anchor_indices = &g_bc7_3_astc2_patterns2_anchors[common_pattern][0]; + } + else + { + pPartition_pattern = &g_astc_bc7_patterns2[common_pattern][0]; + pSubset_anchor_indices = &g_astc_bc7_pattern2_anchors[common_pattern][0]; + } + } + + return pSubset_anchor_indices; + } + + static inline uint32_t read_bit(const uint8_t* pBuf, uint32_t& bit_offset) + { + uint32_t byte_bits = pBuf[bit_offset >> 3] >> (bit_offset & 7); + bit_offset += 1; + return byte_bits & 1; + } + + static inline uint32_t read_bits1_to_9(const uint8_t* pBuf, uint32_t& bit_offset, uint32_t codesize) + { + assert(codesize <= 9); + if (!codesize) + return 0; + + if ((BASISD_IS_BIG_ENDIAN) || (!BASISD_USE_UNALIGNED_WORD_READS) || (bit_offset >= 112)) + { + const uint8_t* pBytes = &pBuf[bit_offset >> 3U]; + + uint32_t byte_bit_offset = bit_offset & 7U; + + uint32_t bits = pBytes[0] >> byte_bit_offset; + uint32_t bits_read = basisu::minimum(codesize, 8 - byte_bit_offset); + + uint32_t bits_remaining = codesize - bits_read; + if (bits_remaining) + bits |= ((uint32_t)pBytes[1]) << bits_read; + + bit_offset += codesize; + + return bits & ((1U << codesize) - 1U); + } + + uint32_t byte_bit_offset = bit_offset & 7U; + const uint16_t w = *(const uint16_t *)(&pBuf[bit_offset >> 3U]); + bit_offset += codesize; + return (w >> byte_bit_offset) & ((1U << codesize) - 1U); + } + + inline uint64_t read_bits64(const uint8_t* pBuf, uint32_t& bit_offset, uint32_t codesize) + { + assert(codesize <= 64U); + uint64_t bits = 0; + uint32_t total_bits = 0; + + while (total_bits < codesize) + { + uint32_t byte_bit_offset = bit_offset & 7U; + uint32_t bits_to_read = basisu::minimum(codesize - total_bits, 8U - byte_bit_offset); + + uint32_t byte_bits = pBuf[bit_offset >> 3U] >> byte_bit_offset; + byte_bits &= ((1U << bits_to_read) - 1U); + + bits |= ((uint64_t)(byte_bits) << total_bits); + + total_bits += bits_to_read; + bit_offset += bits_to_read; + } + + return bits; + } + + static inline uint32_t read_bits1_to_9_fst(const uint8_t* pBuf, uint32_t& bit_offset, uint32_t codesize) + { + assert(codesize <= 9); + if (!codesize) + return 0; + assert(bit_offset < 112); + + if ((BASISD_IS_BIG_ENDIAN) || (!BASISD_USE_UNALIGNED_WORD_READS)) + { + const uint8_t* pBytes = &pBuf[bit_offset >> 3U]; + + uint32_t byte_bit_offset = bit_offset & 7U; + + uint32_t bits = pBytes[0] >> byte_bit_offset; + uint32_t bits_read = basisu::minimum(codesize, 8 - byte_bit_offset); + + uint32_t bits_remaining = codesize - bits_read; + if (bits_remaining) + bits |= ((uint32_t)pBytes[1]) << bits_read; + + bit_offset += codesize; + + return bits & ((1U << codesize) - 1U); + } + + uint32_t byte_bit_offset = bit_offset & 7U; + const uint16_t w = *(const uint16_t*)(&pBuf[bit_offset >> 3U]); + bit_offset += codesize; + return (w >> byte_bit_offset)& ((1U << codesize) - 1U); + } + + bool unpack_uastc(const uastc_block& blk, unpacked_uastc_block& unpacked, bool blue_contract_check, bool read_hints) + { + //memset(&unpacked, 0, sizeof(unpacked)); + +#if 0 + uint8_t table[128]; + memset(table, 0xFF, sizeof(table)); + + { + for (uint32_t mode = 0; mode <= TOTAL_UASTC_MODES; mode++) + { + const uint32_t code = g_uastc_mode_huff_codes[mode][0]; + const uint32_t codesize = g_uastc_mode_huff_codes[mode][1]; + + table[code] = mode; + + uint32_t bits_left = 7 - codesize; + for (uint32_t i = 0; i < (1 << bits_left); i++) + table[code | (i << codesize)] = mode; + } + + for (uint32_t i = 0; i < 128; i++) + printf("%u,", table[i]); + exit(0); + } +#endif + + const int mode = g_uastc_huff_modes[blk.m_bytes[0] & 127]; + if (mode >= (int)TOTAL_UASTC_MODES) + return false; + + unpacked.m_mode = mode; + + uint32_t bit_ofs = g_uastc_mode_huff_codes[mode][1]; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + unpacked.m_solid_color.r = (uint8_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); + unpacked.m_solid_color.g = (uint8_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); + unpacked.m_solid_color.b = (uint8_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); + unpacked.m_solid_color.a = (uint8_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); + + if (read_hints) + { + unpacked.m_etc1_flip = false; + unpacked.m_etc1_diff = read_bit(blk.m_bytes, bit_ofs) != 0; + unpacked.m_etc1_inten0 = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 3); + unpacked.m_etc1_inten1 = 0; + unpacked.m_etc1_selector = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 2); + unpacked.m_etc1_r = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); + unpacked.m_etc1_g = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); + unpacked.m_etc1_b = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); + unpacked.m_etc1_bias = 0; + unpacked.m_etc2_hints = 0; + } + + return true; + } + + if (read_hints) + { + if (g_uastc_mode_has_bc1_hint0[mode]) + unpacked.m_bc1_hint0 = read_bit(blk.m_bytes, bit_ofs) != 0; + else + unpacked.m_bc1_hint0 = false; + + if (g_uastc_mode_has_bc1_hint1[mode]) + unpacked.m_bc1_hint1 = read_bit(blk.m_bytes, bit_ofs) != 0; + else + unpacked.m_bc1_hint1 = false; + + unpacked.m_etc1_flip = read_bit(blk.m_bytes, bit_ofs) != 0; + unpacked.m_etc1_diff = read_bit(blk.m_bytes, bit_ofs) != 0; + unpacked.m_etc1_inten0 = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 3); + unpacked.m_etc1_inten1 = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 3); + + if (g_uastc_mode_has_etc1_bias[mode]) + unpacked.m_etc1_bias = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); + else + unpacked.m_etc1_bias = 0; + + if (g_uastc_mode_has_alpha[mode]) + { + unpacked.m_etc2_hints = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 8); + //assert(unpacked.m_etc2_hints > 0); + } + else + unpacked.m_etc2_hints = 0; + } + else + bit_ofs += g_uastc_mode_total_hint_bits[mode]; + + uint32_t subsets = 1; + switch (mode) + { + case 2: + case 4: + case 7: + case 9: + case 16: + unpacked.m_common_pattern = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 5); + subsets = 2; + break; + case 3: + unpacked.m_common_pattern = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 4); + subsets = 3; + break; + default: + break; + } + + uint32_t part_seed = 0; + switch (mode) + { + case 2: + case 4: + case 9: + case 16: + if (unpacked.m_common_pattern >= TOTAL_ASTC_BC7_COMMON_PARTITIONS2) + return false; + + part_seed = g_astc_bc7_common_partitions2[unpacked.m_common_pattern].m_astc; + break; + case 3: + if (unpacked.m_common_pattern >= TOTAL_ASTC_BC7_COMMON_PARTITIONS3) + return false; + + part_seed = g_astc_bc7_common_partitions3[unpacked.m_common_pattern].m_astc; + break; + case 7: + if (unpacked.m_common_pattern >= TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS) + return false; + + part_seed = g_bc7_3_astc2_common_partitions[unpacked.m_common_pattern].m_astc2; + break; + default: + break; + } + + uint32_t total_planes = 1; + switch (mode) + { + case 6: + case 11: + case 13: + unpacked.m_astc.m_ccs = (int)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, 2); + total_planes = 2; + break; + case 17: + unpacked.m_astc.m_ccs = 3; + total_planes = 2; + break; + default: + break; + } + + unpacked.m_astc.m_dual_plane = (total_planes == 2); + + unpacked.m_astc.m_subsets = subsets; + unpacked.m_astc.m_partition_seed = part_seed; + + const uint32_t total_comps = g_uastc_mode_comps[mode]; + + const uint32_t weight_bits = g_uastc_mode_weight_bits[mode]; + + unpacked.m_astc.m_weight_range = g_uastc_mode_weight_ranges[mode]; + + const uint32_t total_values = total_comps * 2 * subsets; + const uint32_t endpoint_range = g_uastc_mode_endpoint_ranges[mode]; + + const uint32_t cem = g_uastc_mode_cem[mode]; + unpacked.m_astc.m_cem = cem; + + const uint32_t ep_bits = g_astc_bise_range_table[endpoint_range][0]; + const uint32_t ep_trits = g_astc_bise_range_table[endpoint_range][1]; + const uint32_t ep_quints = g_astc_bise_range_table[endpoint_range][2]; + + uint32_t total_tqs = 0; + uint32_t bundle_size = 0, mul = 0; + if (ep_trits) + { + total_tqs = (total_values + 4) / 5; + bundle_size = 5; + mul = 3; + } + else if (ep_quints) + { + total_tqs = (total_values + 2) / 3; + bundle_size = 3; + mul = 5; + } + + uint32_t tq_values[8]; + for (uint32_t i = 0; i < total_tqs; i++) + { + uint32_t num_bits = ep_trits ? 8 : 7; + if (i == (total_tqs - 1)) + { + uint32_t num_remaining = total_values - (total_tqs - 1) * bundle_size; + if (ep_trits) + { + switch (num_remaining) + { + case 1: num_bits = 2; break; + case 2: num_bits = 4; break; + case 3: num_bits = 5; break; + case 4: num_bits = 7; break; + default: break; + } + } + else if (ep_quints) + { + switch (num_remaining) + { + case 1: num_bits = 3; break; + case 2: num_bits = 5; break; + default: break; + } + } + } + + tq_values[i] = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, num_bits); + } // i + + uint32_t accum = 0; + uint32_t accum_remaining = 0; + uint32_t next_tq_index = 0; + + for (uint32_t i = 0; i < total_values; i++) + { + uint32_t value = (uint32_t)read_bits1_to_9_fst(blk.m_bytes, bit_ofs, ep_bits); + + if (total_tqs) + { + if (!accum_remaining) + { + assert(next_tq_index < total_tqs); + accum = tq_values[next_tq_index++]; + accum_remaining = bundle_size; + } + + // TODO: Optimize with tables + uint32_t v = accum % mul; + accum /= mul; + accum_remaining--; + + value |= (v << ep_bits); + } + + unpacked.m_astc.m_endpoints[i] = (uint8_t)value; + } + + const uint8_t* pPartition_pattern; + const uint8_t* pSubset_anchor_indices = get_anchor_indices(subsets, mode, unpacked.m_common_pattern, pPartition_pattern); + +#ifdef _DEBUG + for (uint32_t i = 0; i < 16; i++) + assert(pPartition_pattern[i] == astc_compute_texel_partition(part_seed, i & 3, i >> 2, 0, subsets, true)); + + for (uint32_t subset_index = 0; subset_index < subsets; subset_index++) + { + uint32_t anchor_index = 0; + + for (uint32_t i = 0; i < 16; i++) + { + if (pPartition_pattern[i] == subset_index) + { + anchor_index = i; + break; + } + } + + assert(pSubset_anchor_indices[subset_index] == anchor_index); + } +#endif + +#if 0 + const uint32_t total_planes_shift = total_planes - 1; + for (uint32_t i = 0; i < 16 * total_planes; i++) + { + uint32_t num_bits = weight_bits; + for (uint32_t s = 0; s < subsets; s++) + { + if (pSubset_anchor_indices[s] == (i >> total_planes_shift)) + { + num_bits--; + break; + } + } + + unpacked.m_astc.m_weights[i] = (uint8_t)read_bits1_to_9(blk.m_bytes, bit_ofs, num_bits); + } +#endif + + if (mode == 18) + { + // Mode 18 is the only mode with more than 64 weight bits. + for (uint32_t i = 0; i < 16; i++) + unpacked.m_astc.m_weights[i] = (uint8_t)read_bits1_to_9(blk.m_bytes, bit_ofs, i ? weight_bits : (weight_bits - 1)); + } + else + { + // All other modes have <= 64 weight bits. + uint64_t bits; + + // Read the weight bits + if ((BASISD_IS_BIG_ENDIAN) || (!BASISD_USE_UNALIGNED_WORD_READS)) + bits = read_bits64(blk.m_bytes, bit_ofs, basisu::minimum(64, 128 - (int)bit_ofs)); + else + { + bits = blk.m_dwords[2]; + bits |= (((uint64_t)blk.m_dwords[3]) << 32U); + + if (bit_ofs >= 64U) + bits >>= (bit_ofs - 64U); + else + { + assert(bit_ofs >= 56U); + + uint32_t bits_needed = 64U - bit_ofs; + bits <<= bits_needed; + bits |= (blk.m_bytes[7] >> (8U - bits_needed)); + } + } + + bit_ofs = 0; + + const uint32_t mask = (1U << weight_bits) - 1U; + const uint32_t anchor_mask = (1U << (weight_bits - 1U)) - 1U; + + if (total_planes == 2) + { + // Dual plane modes always have a single subset, and the first 2 weights are anchors. + + unpacked.m_astc.m_weights[0] = (uint8_t)((uint32_t)(bits >> bit_ofs) & anchor_mask); + bit_ofs += (weight_bits - 1); + + unpacked.m_astc.m_weights[1] = (uint8_t)((uint32_t)(bits >> bit_ofs) & anchor_mask); + bit_ofs += (weight_bits - 1); + + for (uint32_t i = 2; i < 32; i++) + { + unpacked.m_astc.m_weights[i] = (uint8_t)((uint32_t)(bits >> bit_ofs) & mask); + bit_ofs += weight_bits; + } + } + else + { + if (subsets == 1) + { + // Specialize the single subset case. + if (weight_bits == 4) + { + assert(bit_ofs == 0); + + // Specialize the most common case: 4-bit weights. + unpacked.m_astc.m_weights[0] = (uint8_t)((uint32_t)(bits) & 7); + unpacked.m_astc.m_weights[1] = (uint8_t)((uint32_t)(bits >> 3) & 15); + unpacked.m_astc.m_weights[2] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 1)) & 15); + unpacked.m_astc.m_weights[3] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 2)) & 15); + + unpacked.m_astc.m_weights[4] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 3)) & 15); + unpacked.m_astc.m_weights[5] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 4)) & 15); + unpacked.m_astc.m_weights[6] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 5)) & 15); + unpacked.m_astc.m_weights[7] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 6)) & 15); + + unpacked.m_astc.m_weights[8] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 7)) & 15); + unpacked.m_astc.m_weights[9] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 8)) & 15); + unpacked.m_astc.m_weights[10] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 9)) & 15); + unpacked.m_astc.m_weights[11] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 10)) & 15); + + unpacked.m_astc.m_weights[12] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 11)) & 15); + unpacked.m_astc.m_weights[13] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 12)) & 15); + unpacked.m_astc.m_weights[14] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 13)) & 15); + unpacked.m_astc.m_weights[15] = (uint8_t)((uint32_t)(bits >> (3 + 4 * 14)) & 15); + } + else + { + // First weight is always an anchor. + unpacked.m_astc.m_weights[0] = (uint8_t)((uint32_t)(bits >> bit_ofs) & anchor_mask); + bit_ofs += (weight_bits - 1); + + for (uint32_t i = 1; i < 16; i++) + { + unpacked.m_astc.m_weights[i] = (uint8_t)((uint32_t)(bits >> bit_ofs) & mask); + bit_ofs += weight_bits; + } + } + } + else + { + const uint32_t a0 = pSubset_anchor_indices[0], a1 = pSubset_anchor_indices[1], a2 = pSubset_anchor_indices[2]; + + for (uint32_t i = 0; i < 16; i++) + { + if ((i == a0) || (i == a1) || (i == a2)) + { + unpacked.m_astc.m_weights[i] = (uint8_t)((uint32_t)(bits >> bit_ofs) & anchor_mask); + bit_ofs += (weight_bits - 1); + } + else + { + unpacked.m_astc.m_weights[i] = (uint8_t)((uint32_t)(bits >> bit_ofs) & mask); + bit_ofs += weight_bits; + } + } + } + } + } + + if ((blue_contract_check) && (total_comps >= 3)) + { + // We only need to disable ASTC Blue Contraction when we'll be packing to ASTC. The other transcoders don't care. + bool invert_subset[3] = { false, false, false }; + bool any_flag = false; + + for (uint32_t subset_index = 0; subset_index < subsets; subset_index++) + { + const int s0 = g_astc_unquant[endpoint_range][unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + 0]].m_unquant + + g_astc_unquant[endpoint_range][unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + 2]].m_unquant + + g_astc_unquant[endpoint_range][unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + 4]].m_unquant; + + const int s1 = g_astc_unquant[endpoint_range][unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + 1]].m_unquant + + g_astc_unquant[endpoint_range][unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + 3]].m_unquant + + g_astc_unquant[endpoint_range][unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + 5]].m_unquant; + + if (s1 < s0) + { + for (uint32_t c = 0; c < total_comps; c++) + std::swap(unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + c * 2 + 0], unpacked.m_astc.m_endpoints[subset_index * total_comps * 2 + c * 2 + 1]); + + invert_subset[subset_index] = true; + any_flag = true; + } + } + + if (any_flag) + { + const uint32_t weight_mask = (1 << weight_bits) - 1; + + for (uint32_t i = 0; i < 16; i++) + { + uint32_t subset = pPartition_pattern[i]; + + if (invert_subset[subset]) + { + unpacked.m_astc.m_weights[i * total_planes] = (uint8_t)(weight_mask - unpacked.m_astc.m_weights[i * total_planes]); + + if (total_planes == 2) + unpacked.m_astc.m_weights[i * total_planes + 1] = (uint8_t)(weight_mask - unpacked.m_astc.m_weights[i * total_planes + 1]); + } + } + } + } + + return true; + } + + static const uint32_t* g_astc_weight_tables[6] = { nullptr, g_bc7_weights1, g_bc7_weights2, g_bc7_weights3, g_astc_weights4, g_astc_weights5 }; + + bool unpack_uastc(uint32_t mode, uint32_t common_pattern, const color32& solid_color, const astc_block_desc& astc, color32* pPixels, bool srgb) + { + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + for (uint32_t i = 0; i < 16; i++) + pPixels[i] = solid_color; + return true; + } + + color32 endpoints[3][2]; + + const uint32_t total_subsets = g_uastc_mode_subsets[mode]; + const uint32_t total_comps = basisu::minimum(4U, g_uastc_mode_comps[mode]); + const uint32_t endpoint_range = g_uastc_mode_endpoint_ranges[mode]; + const uint32_t total_planes = g_uastc_mode_planes[mode]; + const uint32_t weight_bits = g_uastc_mode_weight_bits[mode]; + const uint32_t weight_levels = 1 << weight_bits; + + for (uint32_t subset_index = 0; subset_index < total_subsets; subset_index++) + { + if (total_comps == 2) + { + const uint32_t ll = g_astc_unquant[endpoint_range][astc.m_endpoints[subset_index * total_comps * 2 + 0 * 2 + 0]].m_unquant; + const uint32_t lh = g_astc_unquant[endpoint_range][astc.m_endpoints[subset_index * total_comps * 2 + 0 * 2 + 1]].m_unquant; + + const uint32_t al = g_astc_unquant[endpoint_range][astc.m_endpoints[subset_index * total_comps * 2 + 1 * 2 + 0]].m_unquant; + const uint32_t ah = g_astc_unquant[endpoint_range][astc.m_endpoints[subset_index * total_comps * 2 + 1 * 2 + 1]].m_unquant; + + endpoints[subset_index][0].set_noclamp_rgba(ll, ll, ll, al); + endpoints[subset_index][1].set_noclamp_rgba(lh, lh, lh, ah); + } + else + { + for (uint32_t comp_index = 0; comp_index < total_comps; comp_index++) + { + endpoints[subset_index][0][comp_index] = g_astc_unquant[endpoint_range][astc.m_endpoints[subset_index * total_comps * 2 + comp_index * 2 + 0]].m_unquant; + endpoints[subset_index][1][comp_index] = g_astc_unquant[endpoint_range][astc.m_endpoints[subset_index * total_comps * 2 + comp_index * 2 + 1]].m_unquant; + } + for (uint32_t comp_index = total_comps; comp_index < 4; comp_index++) + { + endpoints[subset_index][0][comp_index] = 255; + endpoints[subset_index][1][comp_index] = 255; + } + } + } + + color32 block_colors[3][32]; + + const uint32_t* pWeights = g_astc_weight_tables[weight_bits]; + + for (uint32_t subset_index = 0; subset_index < total_subsets; subset_index++) + { + for (uint32_t l = 0; l < weight_levels; l++) + { + if (total_comps == 2) + { + const uint8_t lc = (uint8_t)astc_interpolate(endpoints[subset_index][0][0], endpoints[subset_index][1][0], pWeights[l], srgb); + const uint8_t ac = (uint8_t)astc_interpolate(endpoints[subset_index][0][3], endpoints[subset_index][1][3], pWeights[l], srgb); + + block_colors[subset_index][l].set(lc, lc, lc, ac); + } + else + { + uint32_t comp_index; + for (comp_index = 0; comp_index < total_comps; comp_index++) + block_colors[subset_index][l][comp_index] = (uint8_t)astc_interpolate(endpoints[subset_index][0][comp_index], endpoints[subset_index][1][comp_index], pWeights[l], srgb); + + for (; comp_index < 4; comp_index++) + block_colors[subset_index][l][comp_index] = 255; + } + } + } + + const uint8_t* pPartition_pattern = g_zero_pattern; + + if (total_subsets >= 2) + { + if (total_subsets == 3) + pPartition_pattern = &g_astc_bc7_patterns3[common_pattern][0]; + else if (mode == 7) + pPartition_pattern = &g_bc7_3_astc2_patterns2[common_pattern][0]; + else + pPartition_pattern = &g_astc_bc7_patterns2[common_pattern][0]; + +#ifdef _DEBUG + for (uint32_t i = 0; i < 16; i++) + { + assert(pPartition_pattern[i] == (uint8_t)astc_compute_texel_partition(astc.m_partition_seed, i & 3, i >> 2, 0, total_subsets, true)); + } +#endif + } + + if (total_planes == 1) + { + if (total_subsets == 1) + { + for (uint32_t i = 0; i < 16; i++) + { + assert(astc.m_weights[i] < weight_levels); + pPixels[i] = block_colors[0][astc.m_weights[i]]; + } + } + else + { + for (uint32_t i = 0; i < 16; i++) + { + assert(astc.m_weights[i] < weight_levels); + pPixels[i] = block_colors[pPartition_pattern[i]][astc.m_weights[i]]; + } + } + } + else + { + assert(total_subsets == 1); + + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t subset_index = 0; // pPartition_pattern[i]; + + const uint32_t weight_index0 = astc.m_weights[i * 2]; + const uint32_t weight_index1 = astc.m_weights[i * 2 + 1]; + + assert(weight_index0 < weight_levels && weight_index1 < weight_levels); + + color32& c = pPixels[i]; + for (uint32_t comp = 0; comp < 4; comp++) + { + if ((int)comp == astc.m_ccs) + c[comp] = block_colors[subset_index][weight_index1][comp]; + else + c[comp] = block_colors[subset_index][weight_index0][comp]; + } + } + } + + return true; + } + + bool unpack_uastc(const unpacked_uastc_block& unpacked_blk, color32* pPixels, bool srgb) + { + return unpack_uastc(unpacked_blk.m_mode, unpacked_blk.m_common_pattern, unpacked_blk.m_solid_color, unpacked_blk.m_astc, pPixels, srgb); + } + + bool unpack_uastc(const uastc_block& blk, color32* pPixels, bool srgb) + { + unpacked_uastc_block unpacked_blk; + + if (!unpack_uastc(blk, unpacked_blk, false, false)) + return false; + + return unpack_uastc(unpacked_blk, pPixels, srgb); + } + + // Determines the best shared pbits to use to encode xl/xh + static void determine_shared_pbits( + uint32_t total_comps, uint32_t comp_bits, float xl[4], float xh[4], + color_quad_u8& bestMinColor, color_quad_u8& bestMaxColor, uint32_t best_pbits[2]) + { + const uint32_t total_bits = comp_bits + 1; + assert(total_bits >= 4 && total_bits <= 8); + + const int iscalep = (1 << total_bits) - 1; + const float scalep = (float)iscalep; + + float best_err = 1e+9f; + + for (int p = 0; p < 2; p++) + { + color_quad_u8 xMinColor, xMaxColor; + for (uint32_t c = 0; c < 4; c++) + { + xMinColor.m_c[c] = (uint8_t)(clampi(((int)((xl[c] * scalep - p) / 2.0f + .5f)) * 2 + p, p, iscalep - 1 + p)); + xMaxColor.m_c[c] = (uint8_t)(clampi(((int)((xh[c] * scalep - p) / 2.0f + .5f)) * 2 + p, p, iscalep - 1 + p)); + } + + color_quad_u8 scaledLow, scaledHigh; + + for (uint32_t i = 0; i < 4; i++) + { + scaledLow.m_c[i] = (xMinColor.m_c[i] << (8 - total_bits)); + scaledLow.m_c[i] |= (scaledLow.m_c[i] >> total_bits); + assert(scaledLow.m_c[i] <= 255); + + scaledHigh.m_c[i] = (xMaxColor.m_c[i] << (8 - total_bits)); + scaledHigh.m_c[i] |= (scaledHigh.m_c[i] >> total_bits); + assert(scaledHigh.m_c[i] <= 255); + } + + float err = 0; + for (uint32_t i = 0; i < total_comps; i++) + err += basisu::squaref((scaledLow.m_c[i] / 255.0f) - xl[i]) + basisu::squaref((scaledHigh.m_c[i] / 255.0f) - xh[i]); + + if (err < best_err) + { + best_err = err; + best_pbits[0] = p; + best_pbits[1] = p; + for (uint32_t j = 0; j < 4; j++) + { + bestMinColor.m_c[j] = xMinColor.m_c[j] >> 1; + bestMaxColor.m_c[j] = xMaxColor.m_c[j] >> 1; + } + } + } + } + + // Determines the best unique pbits to use to encode xl/xh + static void determine_unique_pbits( + uint32_t total_comps, uint32_t comp_bits, float xl[4], float xh[4], + color_quad_u8& bestMinColor, color_quad_u8& bestMaxColor, uint32_t best_pbits[2]) + { + const uint32_t total_bits = comp_bits + 1; + const int iscalep = (1 << total_bits) - 1; + const float scalep = (float)iscalep; + + float best_err0 = 1e+9f; + float best_err1 = 1e+9f; + + for (int p = 0; p < 2; p++) + { + color_quad_u8 xMinColor, xMaxColor; + + for (uint32_t c = 0; c < 4; c++) + { + xMinColor.m_c[c] = (uint8_t)(clampi(((int)((xl[c] * scalep - p) / 2.0f + .5f)) * 2 + p, p, iscalep - 1 + p)); + xMaxColor.m_c[c] = (uint8_t)(clampi(((int)((xh[c] * scalep - p) / 2.0f + .5f)) * 2 + p, p, iscalep - 1 + p)); + } + + color_quad_u8 scaledLow, scaledHigh; + for (uint32_t i = 0; i < 4; i++) + { + scaledLow.m_c[i] = (xMinColor.m_c[i] << (8 - total_bits)); + scaledLow.m_c[i] |= (scaledLow.m_c[i] >> total_bits); + assert(scaledLow.m_c[i] <= 255); + + scaledHigh.m_c[i] = (xMaxColor.m_c[i] << (8 - total_bits)); + scaledHigh.m_c[i] |= (scaledHigh.m_c[i] >> total_bits); + assert(scaledHigh.m_c[i] <= 255); + } + + float err0 = 0, err1 = 0; + for (uint32_t i = 0; i < total_comps; i++) + { + err0 += basisu::squaref(scaledLow.m_c[i] - xl[i] * 255.0f); + err1 += basisu::squaref(scaledHigh.m_c[i] - xh[i] * 255.0f); + } + + if (err0 < best_err0) + { + best_err0 = err0; + best_pbits[0] = p; + + bestMinColor.m_c[0] = xMinColor.m_c[0] >> 1; + bestMinColor.m_c[1] = xMinColor.m_c[1] >> 1; + bestMinColor.m_c[2] = xMinColor.m_c[2] >> 1; + bestMinColor.m_c[3] = xMinColor.m_c[3] >> 1; + } + + if (err1 < best_err1) + { + best_err1 = err1; + best_pbits[1] = p; + + bestMaxColor.m_c[0] = xMaxColor.m_c[0] >> 1; + bestMaxColor.m_c[1] = xMaxColor.m_c[1] >> 1; + bestMaxColor.m_c[2] = xMaxColor.m_c[2] >> 1; + bestMaxColor.m_c[3] = xMaxColor.m_c[3] >> 1; + } + } + } + + bool transcode_uastc_to_astc(const uastc_block& src_blk, void* pDst) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, true, false)) + return false; + + bool success = false; + if (unpacked_src_blk.m_mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + pack_astc_solid_block(pDst, unpacked_src_blk.m_solid_color); + success = true; + } + else + { + success = pack_astc_block(static_cast(pDst), &unpacked_src_blk.m_astc, unpacked_src_blk.m_mode); + } + + return success; + } + + bool transcode_uastc_to_bc7(const unpacked_uastc_block& unpacked_src_blk, bc7_optimization_results& dst_blk) + { + memset(&dst_blk, 0, sizeof(dst_blk)); + + const uint32_t mode = unpacked_src_blk.m_mode; + + const uint32_t endpoint_range = g_uastc_mode_endpoint_ranges[mode]; + const uint32_t total_comps = g_uastc_mode_comps[mode]; + + switch (mode) + { + case 0: + case 5: + case 10: + case 12: + case 14: + case 15: + case 18: + { + // MODE 0: DualPlane: 0, WeightRange: 8 (16), Subsets: 1, EndpointRange: 19 (192) - BC7 MODE6 RGB + // MODE 5: DualPlane: 0, WeightRange : 5 (8), Subsets : 1, EndpointRange : 20 (256) - BC7 MODE6 RGB + // MODE 10 DualPlane: 0, WeightRange: 8 (16), Subsets: 1, EndpointRange: 13 (48) - BC7 MODE6 + // MODE 12: DualPlane: 0, WeightRange : 5 (8), Subsets : 1, EndpointRange : 19 (192) - BC7 MODE6 + // MODE 14: DualPlane: 0, WeightRange : 2 (4), Subsets : 1, EndpointRange : 20 (256) - BC7 MODE6 + // MODE 18: DualPlane: 0, WeightRange : 11 (32), Subsets : 1, CEM : 8, EndpointRange : 11 (32) - BC7 MODE6 + // MODE 15: DualPlane: 0, WeightRange : 8 (16), Subsets : 1, CEM : 4 (LA Direct), EndpointRange : 20 (256) - BC7 MODE6 + dst_blk.m_mode = 6; + + float xl[4], xh[4]; + if (total_comps == 2) + { + xl[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[0]].m_unquant / 255.0f; + xh[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[1]].m_unquant / 255.0f; + + xl[1] = xl[0]; + xh[1] = xh[0]; + + xl[2] = xl[0]; + xh[2] = xh[0]; + + xl[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[2]].m_unquant / 255.0f; + xh[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[3]].m_unquant / 255.0f; + } + else + { + xl[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[0]].m_unquant / 255.0f; + xl[1] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[2]].m_unquant / 255.0f; + xl[2] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[4]].m_unquant / 255.0f; + + xh[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[1]].m_unquant / 255.0f; + xh[1] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[3]].m_unquant / 255.0f; + xh[2] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[5]].m_unquant / 255.0f; + + if (total_comps == 4) + { + xl[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[6]].m_unquant / 255.0f; + xh[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[7]].m_unquant / 255.0f; + } + else + { + xl[3] = 1.0f; + xh[3] = 1.0f; + } + } + + uint32_t best_pbits[2]; + color_quad_u8 bestMinColor, bestMaxColor; + determine_unique_pbits((total_comps == 2) ? 4 : total_comps, 7, xl, xh, bestMinColor, bestMaxColor, best_pbits); + + dst_blk.m_low[0] = bestMinColor; + dst_blk.m_high[0] = bestMaxColor; + + if (total_comps == 3) + { + dst_blk.m_low[0].m_c[3] = 127; + dst_blk.m_high[0].m_c[3] = 127; + } + + dst_blk.m_pbits[0][0] = best_pbits[0]; + dst_blk.m_pbits[0][1] = best_pbits[1]; + + if (mode == 18) + { + const uint8_t s_bc7_5_to_4[32] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15 }; + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = s_bc7_5_to_4[unpacked_src_blk.m_astc.m_weights[i]]; + } + else if (mode == 14) + { + const uint8_t s_bc7_2_to_4[4] = { 0, 5, 10, 15 }; + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = s_bc7_2_to_4[unpacked_src_blk.m_astc.m_weights[i]]; + } + else if ((mode == 5) || (mode == 12)) + { + const uint8_t s_bc7_3_to_4[8] = { 0, 2, 4, 6, 9, 11, 13, 15 }; + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = s_bc7_3_to_4[unpacked_src_blk.m_astc.m_weights[i]]; + } + else + { + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + } + + break; + } + case 1: + { + // DualPlane: 0, WeightRange : 2 (4), Subsets : 1, EndpointRange : 20 (256) - BC7 MODE3 + // Mode 1 uses endpoint range 20 - no need to use ASTC dequant tables. + dst_blk.m_mode = 3; + + float xl[4], xh[4]; + xl[0] = unpacked_src_blk.m_astc.m_endpoints[0] / 255.0f; + xl[1] = unpacked_src_blk.m_astc.m_endpoints[2] / 255.0f; + xl[2] = unpacked_src_blk.m_astc.m_endpoints[4] / 255.0f; + xl[3] = 1.0f; + + xh[0] = unpacked_src_blk.m_astc.m_endpoints[1] / 255.0f; + xh[1] = unpacked_src_blk.m_astc.m_endpoints[3] / 255.0f; + xh[2] = unpacked_src_blk.m_astc.m_endpoints[5] / 255.0f; + xh[3] = 1.0f; + + uint32_t best_pbits[2]; + color_quad_u8 bestMinColor, bestMaxColor; + memset(&bestMinColor, 0, sizeof(bestMinColor)); + memset(&bestMaxColor, 0, sizeof(bestMaxColor)); + determine_unique_pbits(3, 7, xl, xh, bestMinColor, bestMaxColor, best_pbits); + + for (uint32_t i = 0; i < 3; i++) + { + dst_blk.m_low[0].m_c[i] = bestMinColor.m_c[i]; + dst_blk.m_high[0].m_c[i] = bestMaxColor.m_c[i]; + dst_blk.m_low[1].m_c[i] = bestMinColor.m_c[i]; + dst_blk.m_high[1].m_c[i] = bestMaxColor.m_c[i]; + } + dst_blk.m_pbits[0][0] = best_pbits[0]; + dst_blk.m_pbits[0][1] = best_pbits[1]; + dst_blk.m_pbits[1][0] = best_pbits[0]; + dst_blk.m_pbits[1][1] = best_pbits[1]; + + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + + break; + } + case 2: + { + // 2. DualPlane: 0, WeightRange : 5 (8), Subsets : 2, EndpointRange : 8 (16) - BC7 MODE1 + dst_blk.m_mode = 1; + dst_blk.m_partition = g_astc_bc7_common_partitions2[unpacked_src_blk.m_common_pattern].m_bc7; + + const bool invert_partition = g_astc_bc7_common_partitions2[unpacked_src_blk.m_common_pattern].m_invert; + + float xl[4], xh[4]; + xl[3] = 1.0f; + xh[3] = 1.0f; + + for (uint32_t subset = 0; subset < 2; subset++) + { + for (uint32_t i = 0; i < 3; i++) + { + uint32_t v = unpacked_src_blk.m_astc.m_endpoints[i * 2 + subset * 6]; + v = (v << 4) | v; + xl[i] = v / 255.0f; + + v = unpacked_src_blk.m_astc.m_endpoints[i * 2 + subset * 6 + 1]; + v = (v << 4) | v; + xh[i] = v / 255.0f; + } + + uint32_t best_pbits[2] = { 0, 0 }; + color_quad_u8 bestMinColor, bestMaxColor; + memset(&bestMinColor, 0, sizeof(bestMinColor)); + memset(&bestMaxColor, 0, sizeof(bestMaxColor)); + determine_shared_pbits(3, 6, xl, xh, bestMinColor, bestMaxColor, best_pbits); + + const uint32_t bc7_subset_index = invert_partition ? (1 - subset) : subset; + + for (uint32_t i = 0; i < 3; i++) + { + dst_blk.m_low[bc7_subset_index].m_c[i] = bestMinColor.m_c[i]; + dst_blk.m_high[bc7_subset_index].m_c[i] = bestMaxColor.m_c[i]; + } + + dst_blk.m_pbits[bc7_subset_index][0] = best_pbits[0]; + } // subset + + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + + break; + } + case 3: + { + // DualPlane: 0, WeightRange : 2 (4), Subsets : 3, EndpointRange : 7 (12) - BC7 MODE2 + dst_blk.m_mode = 2; + dst_blk.m_partition = g_astc_bc7_common_partitions3[unpacked_src_blk.m_common_pattern].m_bc7; + + const uint32_t perm = g_astc_bc7_common_partitions3[unpacked_src_blk.m_common_pattern].m_astc_to_bc7_perm; + + for (uint32_t subset = 0; subset < 3; subset++) + { + for (uint32_t comp = 0; comp < 3; comp++) + { + uint32_t lo = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[comp * 2 + 0 + subset * 6]].m_unquant; + uint32_t hi = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[comp * 2 + 1 + subset * 6]].m_unquant; + + // TODO: I think this can be improved by using tables like Basis Universal does with ETC1S conversion. + lo = (lo * 31 + 127) / 255; + hi = (hi * 31 + 127) / 255; + + const uint32_t bc7_subset_index = g_astc_to_bc7_partition_index_perm_tables[perm][subset]; + + dst_blk.m_low[bc7_subset_index].m_c[comp] = (uint8_t)lo; + dst_blk.m_high[bc7_subset_index].m_c[comp] = (uint8_t)hi; + } + } + + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + + break; + } + case 4: + { + // 4. DualPlane: 0, WeightRange: 2 (4), Subsets: 2, EndpointRange: 12 (40) - BC7 MODE3 + dst_blk.m_mode = 3; + dst_blk.m_partition = g_astc_bc7_common_partitions2[unpacked_src_blk.m_common_pattern].m_bc7; + + const bool invert_partition = g_astc_bc7_common_partitions2[unpacked_src_blk.m_common_pattern].m_invert; + + float xl[4], xh[4]; + xl[3] = 1.0f; + xh[3] = 1.0f; + + for (uint32_t subset = 0; subset < 2; subset++) + { + for (uint32_t i = 0; i < 3; i++) + { + xl[i] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[i * 2 + subset * 6]].m_unquant / 255.0f; + xh[i] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[i * 2 + subset * 6 + 1]].m_unquant / 255.0f; + } + + uint32_t best_pbits[2] = { 0, 0 }; + color_quad_u8 bestMinColor, bestMaxColor; + memset(&bestMinColor, 0, sizeof(bestMinColor)); + memset(&bestMaxColor, 0, sizeof(bestMaxColor)); + determine_unique_pbits(3, 7, xl, xh, bestMinColor, bestMaxColor, best_pbits); + + const uint32_t bc7_subset_index = invert_partition ? (1 - subset) : subset; + + for (uint32_t i = 0; i < 3; i++) + { + dst_blk.m_low[bc7_subset_index].m_c[i] = bestMinColor.m_c[i]; + dst_blk.m_high[bc7_subset_index].m_c[i] = bestMaxColor.m_c[i]; + } + dst_blk.m_low[bc7_subset_index].m_c[3] = 127; + dst_blk.m_high[bc7_subset_index].m_c[3] = 127; + + dst_blk.m_pbits[bc7_subset_index][0] = best_pbits[0]; + dst_blk.m_pbits[bc7_subset_index][1] = best_pbits[1]; + + } // subset + + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + + break; + } + case 6: + case 11: + case 13: + case 17: + { + // MODE 6: DualPlane: 1, WeightRange : 2 (4), Subsets : 1, EndpointRange : 18 (160) - BC7 MODE5 RGB + // MODE 11: DualPlane: 1, WeightRange: 2 (4), Subsets: 1, EndpointRange: 13 (48) - BC7 MODE5 + // MODE 13: DualPlane: 1, WeightRange: 0 (2), Subsets : 1, EndpointRange : 20 (256) - BC7 MODE5 + // MODE 17: DualPlane: 1, WeightRange: 2 (4), Subsets: 1, CEM: 4 (LA Direct), EndpointRange: 20 (256) - BC7 MODE5 + dst_blk.m_mode = 5; + dst_blk.m_rotation = (unpacked_src_blk.m_astc.m_ccs + 1) & 3; + + if (total_comps == 2) + { + assert(unpacked_src_blk.m_astc.m_ccs == 3); + + dst_blk.m_low->m_c[0] = (uint8_t)((g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[0]].m_unquant * 127 + 127) / 255); + dst_blk.m_high->m_c[0] = (uint8_t)((g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[1]].m_unquant * 127 + 127) / 255); + + dst_blk.m_low->m_c[1] = dst_blk.m_low->m_c[0]; + dst_blk.m_high->m_c[1] = dst_blk.m_high->m_c[0]; + + dst_blk.m_low->m_c[2] = dst_blk.m_low->m_c[0]; + dst_blk.m_high->m_c[2] = dst_blk.m_high->m_c[0]; + + dst_blk.m_low->m_c[3] = (uint8_t)(g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[2]].m_unquant); + dst_blk.m_high->m_c[3] = (uint8_t)(g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[3]].m_unquant); + } + else + { + for (uint32_t astc_comp = 0; astc_comp < 4; astc_comp++) + { + uint32_t bc7_comp = astc_comp; + // ASTC and BC7 handle dual plane component rotations differently: + // ASTC: 2nd plane separately interpolates the CCS channel. + // BC7: 2nd plane channel is swapped with alpha, 2nd plane controls alpha interpolation, then we swap alpha with the desired channel. + if (astc_comp == (uint32_t)unpacked_src_blk.m_astc.m_ccs) + bc7_comp = 3; + else if (astc_comp == 3) + bc7_comp = unpacked_src_blk.m_astc.m_ccs; + + uint32_t l = 255, h = 255; + if (astc_comp < total_comps) + { + l = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[astc_comp * 2 + 0]].m_unquant; + h = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[astc_comp * 2 + 1]].m_unquant; + } + + if (bc7_comp < 3) + { + l = (l * 127 + 127) / 255; + h = (h * 127 + 127) / 255; + } + + dst_blk.m_low->m_c[bc7_comp] = (uint8_t)l; + dst_blk.m_high->m_c[bc7_comp] = (uint8_t)h; + } + } + + if (mode == 13) + { + for (uint32_t i = 0; i < 16; i++) + { + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i * 2] ? 3 : 0; + dst_blk.m_alpha_selectors[i] = unpacked_src_blk.m_astc.m_weights[i * 2 + 1] ? 3 : 0; + } + } + else + { + for (uint32_t i = 0; i < 16; i++) + { + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i * 2]; + dst_blk.m_alpha_selectors[i] = unpacked_src_blk.m_astc.m_weights[i * 2 + 1]; + } + } + + break; + } + case 7: + { + // DualPlane: 0, WeightRange : 2 (4), Subsets : 2, EndpointRange : 12 (40) - BC7 MODE2 + dst_blk.m_mode = 2; + dst_blk.m_partition = g_bc7_3_astc2_common_partitions[unpacked_src_blk.m_common_pattern].m_bc73; + + const uint32_t common_pattern_k = g_bc7_3_astc2_common_partitions[unpacked_src_blk.m_common_pattern].k; + + for (uint32_t bc7_part = 0; bc7_part < 3; bc7_part++) + { + const uint32_t astc_part = bc7_convert_partition_index_3_to_2(bc7_part, common_pattern_k); + + for (uint32_t c = 0; c < 3; c++) + { + dst_blk.m_low[bc7_part].m_c[c] = (g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[c * 2 + 0 + astc_part * 6]].m_unquant * 31 + 127) / 255; + dst_blk.m_high[bc7_part].m_c[c] = (g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[c * 2 + 1 + astc_part * 6]].m_unquant * 31 + 127) / 255; + } + } + + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + + break; + } + case UASTC_MODE_INDEX_SOLID_COLOR: + { + // Void-Extent: Solid Color RGBA (BC7 MODE5 or MODE6) + const color32& solid_color = unpacked_src_blk.m_solid_color; + + uint32_t best_err0 = g_bc7_mode_6_optimal_endpoints[solid_color.r][0].m_error + g_bc7_mode_6_optimal_endpoints[solid_color.g][0].m_error + + g_bc7_mode_6_optimal_endpoints[solid_color.b][0].m_error + g_bc7_mode_6_optimal_endpoints[solid_color.a][0].m_error; + + uint32_t best_err1 = g_bc7_mode_6_optimal_endpoints[solid_color.r][1].m_error + g_bc7_mode_6_optimal_endpoints[solid_color.g][1].m_error + + g_bc7_mode_6_optimal_endpoints[solid_color.b][1].m_error + g_bc7_mode_6_optimal_endpoints[solid_color.a][1].m_error; + + if (best_err0 > 0 && best_err1 > 0) + { + dst_blk.m_mode = 5; + + for (uint32_t c = 0; c < 3; c++) + { + dst_blk.m_low[0].m_c[c] = g_bc7_mode_5_optimal_endpoints[solid_color.c[c]].m_lo; + dst_blk.m_high[0].m_c[c] = g_bc7_mode_5_optimal_endpoints[solid_color.c[c]].m_hi; + } + + memset(dst_blk.m_selectors, BC7ENC_MODE_5_OPTIMAL_INDEX, 16); + + dst_blk.m_low[0].m_c[3] = solid_color.c[3]; + dst_blk.m_high[0].m_c[3] = solid_color.c[3]; + + //memset(dst_blk.m_alpha_selectors, 0, 16); + } + else + { + dst_blk.m_mode = 6; + + uint32_t best_p = 0; + if (best_err1 < best_err0) + best_p = 1; + + for (uint32_t c = 0; c < 4; c++) + { + dst_blk.m_low[0].m_c[c] = g_bc7_mode_6_optimal_endpoints[solid_color.c[c]][best_p].m_lo; + dst_blk.m_high[0].m_c[c] = g_bc7_mode_6_optimal_endpoints[solid_color.c[c]][best_p].m_hi; + } + + dst_blk.m_pbits[0][0] = best_p; + dst_blk.m_pbits[0][1] = best_p; + memset(dst_blk.m_selectors, BC7ENC_MODE_6_OPTIMAL_INDEX, 16); + } + + break; + } + case 9: + case 16: + { + // 9. DualPlane: 0, WeightRange : 2 (4), Subsets : 2, EndpointRange : 8 (16) - BC7 MODE7 + // 16. DualPlane: 0, WeightRange: 2 (4), Subsets: 2, CEM: 4 (LA Direct), EndpointRange: 20 (256) - BC7 MODE7 + + dst_blk.m_mode = 7; + dst_blk.m_partition = g_astc_bc7_common_partitions2[unpacked_src_blk.m_common_pattern].m_bc7; + + const bool invert_partition = g_astc_bc7_common_partitions2[unpacked_src_blk.m_common_pattern].m_invert; + + for (uint32_t astc_subset = 0; astc_subset < 2; astc_subset++) + { + float xl[4], xh[4]; + + if (total_comps == 2) + { + xl[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[0 + astc_subset * 4]].m_unquant / 255.0f; + xh[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[1 + astc_subset * 4]].m_unquant / 255.0f; + + xl[1] = xl[0]; + xh[1] = xh[0]; + + xl[2] = xl[0]; + xh[2] = xh[0]; + + xl[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[2 + astc_subset * 4]].m_unquant / 255.0f; + xh[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[3 + astc_subset * 4]].m_unquant / 255.0f; + } + else + { + xl[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[0 + astc_subset * 8]].m_unquant / 255.0f; + xl[1] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[2 + astc_subset * 8]].m_unquant / 255.0f; + xl[2] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[4 + astc_subset * 8]].m_unquant / 255.0f; + xl[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[6 + astc_subset * 8]].m_unquant / 255.0f; + + xh[0] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[1 + astc_subset * 8]].m_unquant / 255.0f; + xh[1] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[3 + astc_subset * 8]].m_unquant / 255.0f; + xh[2] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[5 + astc_subset * 8]].m_unquant / 255.0f; + xh[3] = g_astc_unquant[endpoint_range][unpacked_src_blk.m_astc.m_endpoints[7 + astc_subset * 8]].m_unquant / 255.0f; + } + + uint32_t best_pbits[2] = { 0, 0 }; + color_quad_u8 bestMinColor, bestMaxColor; + memset(&bestMinColor, 0, sizeof(bestMinColor)); + memset(&bestMaxColor, 0, sizeof(bestMaxColor)); + determine_unique_pbits(4, 5, xl, xh, bestMinColor, bestMaxColor, best_pbits); + + const uint32_t bc7_subset_index = invert_partition ? (1 - astc_subset) : astc_subset; + + dst_blk.m_low[bc7_subset_index] = bestMinColor; + dst_blk.m_high[bc7_subset_index] = bestMaxColor; + + dst_blk.m_pbits[bc7_subset_index][0] = best_pbits[0]; + dst_blk.m_pbits[bc7_subset_index][1] = best_pbits[1]; + } // astc_subset + + for (uint32_t i = 0; i < 16; i++) + dst_blk.m_selectors[i] = unpacked_src_blk.m_astc.m_weights[i]; + + break; + } + default: + return false; + } + + return true; + } + + bool transcode_uastc_to_bc7(const uastc_block& src_blk, bc7_optimization_results& dst_blk) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false, false)) + return false; + + return transcode_uastc_to_bc7(unpacked_src_blk, dst_blk); + } + + bool transcode_uastc_to_bc7(const uastc_block& src_blk, void* pDst) + { + bc7_optimization_results temp; + if (!transcode_uastc_to_bc7(src_blk, temp)) + return false; + + encode_bc7_block(pDst, &temp); + return true; + } + + color32 apply_etc1_bias(const color32 &block_color, uint32_t bias, uint32_t limit, uint32_t subblock) + { + color32 result; + + for (uint32_t c = 0; c < 3; c++) + { + static const int s_divs[3] = { 1, 3, 9 }; + + int delta = 0; + + switch (bias) + { + case 2: delta = subblock ? 0 : ((c == 0) ? -1 : 0); break; + case 5: delta = subblock ? 0 : ((c == 1) ? -1 : 0); break; + case 6: delta = subblock ? 0 : ((c == 2) ? -1 : 0); break; + + case 7: delta = subblock ? 0 : ((c == 0) ? 1 : 0); break; + case 11: delta = subblock ? 0 : ((c == 1) ? 1 : 0); break; + case 15: delta = subblock ? 0 : ((c == 2) ? 1 : 0); break; + + case 18: delta = subblock ? ((c == 0) ? -1 : 0) : 0; break; + case 19: delta = subblock ? ((c == 1) ? -1 : 0) : 0; break; + case 20: delta = subblock ? ((c == 2) ? -1 : 0) : 0; break; + + case 21: delta = subblock ? ((c == 0) ? 1 : 0) : 0; break; + case 24: delta = subblock ? ((c == 1) ? 1 : 0) : 0; break; + case 8: delta = subblock ? ((c == 2) ? 1 : 0) : 0; break; + + case 10: delta = -2; break; + + case 27: delta = subblock ? 0 : -1; break; + case 28: delta = subblock ? -1 : 1; break; + case 29: delta = subblock ? 1 : 0; break; + case 30: delta = subblock ? -1 : 0; break; + case 31: delta = subblock ? 0 : 1; break; + + default: + delta = ((bias / s_divs[c]) % 3) - 1; + break; + } + + int v = block_color[c]; + if (v == 0) + { + if (delta == -2) + v += 3; + else + v += delta + 1; + } + else if (v == (int)limit) + { + v += (delta - 1); + } + else + { + v += delta; + if ((v < 0) || (v > (int)limit)) + v = (v - delta) - delta; + } + + assert(v >= 0); + assert(v <= (int)limit); + + result[c] = (uint8_t)v; + } + + return result; + } + + static void etc1_determine_selectors(decoder_etc_block& dst_blk, const color32* pSource_pixels, uint32_t first_subblock, uint32_t last_subblock) + { + static const uint8_t s_tran[4] = { 1, 0, 2, 3 }; + + uint16_t l_bitmask = 0; + uint16_t h_bitmask = 0; + + for (uint32_t subblock = first_subblock; subblock < last_subblock; subblock++) + { + color32 block_colors[4]; + dst_blk.get_block_colors(block_colors, subblock); + + uint32_t block_y[4]; + for (uint32_t i = 0; i < 4; i++) + block_y[i] = block_colors[i][0] * 54 + block_colors[i][1] * 183 + block_colors[i][2] * 19; + + const uint32_t block_y01 = block_y[0] + block_y[1]; + const uint32_t block_y12 = block_y[1] + block_y[2]; + const uint32_t block_y23 = block_y[2] + block_y[3]; + + // X0 X0 X0 X0 X1 X1 X1 X1 X2 X2 X2 X2 X3 X3 X3 X3 + // Y0 Y1 Y2 Y3 Y0 Y1 Y2 Y3 Y0 Y1 Y2 Y3 Y0 Y1 Y2 Y3 + + if (dst_blk.get_flip_bit()) + { + uint32_t ofs = subblock * 2; + + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const color32& c = pSource_pixels[x + (subblock * 2 + y) * 4]; + const uint32_t l = c[0] * 108 + c[1] * 366 + c[2] * 38; + + uint32_t t = s_tran[(l < block_y01) + (l < block_y12) + (l < block_y23)]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ofs += 4; + } + + ofs = (int)ofs + 1 - 4 * 4; + } + } + else + { + uint32_t ofs = (subblock * 2) * 4; + for (uint32_t x = 0; x < 2; x++) + { + for (uint32_t y = 0; y < 4; y++) + { + const color32& c = pSource_pixels[subblock * 2 + x + y * 4]; + const uint32_t l = c[0] * 108 + c[1] * 366 + c[2] * 38; + + uint32_t t = s_tran[(l < block_y01) + (l < block_y12) + (l < block_y23)]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ++ofs; + } + } + } + } + + dst_blk.m_bytes[7] = (uint8_t)(l_bitmask); + dst_blk.m_bytes[6] = (uint8_t)(l_bitmask >> 8); + dst_blk.m_bytes[5] = (uint8_t)(h_bitmask); + dst_blk.m_bytes[4] = (uint8_t)(h_bitmask >> 8); + } + + static const uint8_t s_etc1_solid_selectors[4][4] = { { 255, 255, 255, 255 }, { 255, 255, 0, 0 }, { 0, 0, 0, 0 }, {0, 0, 255, 255 } }; + + struct etc_coord2 + { + uint8_t m_x, m_y; + }; + + // [flip][subblock][pixel_index] + const etc_coord2 g_etc1_pixel_coords[2][2][8] = + { + { + { + { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 }, + { 1, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 } + }, + { + { 2, 0 }, { 2, 1 }, { 2, 2 }, { 2, 3 }, + { 3, 0 }, { 3, 1 }, { 3, 2 }, { 3, 3 } + } + }, + { + { + { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, + { 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1 } + }, + { + { 0, 2 }, { 1, 2 }, { 2, 2 }, { 3, 2 }, + { 0, 3 }, { 1, 3 }, { 2, 3 }, { 3, 3 } + }, + } + }; + + void transcode_uastc_to_etc1(unpacked_uastc_block& unpacked_src_blk, color32 block_pixels[4][4], void* pDst) + { + decoder_etc_block& dst_blk = *static_cast(pDst); + + if (unpacked_src_blk.m_mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + dst_blk.m_bytes[3] = (uint8_t)((unpacked_src_blk.m_etc1_diff << 1) | (unpacked_src_blk.m_etc1_inten0 << 5) | (unpacked_src_blk.m_etc1_inten0 << 2)); + + if (unpacked_src_blk.m_etc1_diff) + { + dst_blk.m_bytes[0] = (uint8_t)(unpacked_src_blk.m_etc1_r << 3); + dst_blk.m_bytes[1] = (uint8_t)(unpacked_src_blk.m_etc1_g << 3); + dst_blk.m_bytes[2] = (uint8_t)(unpacked_src_blk.m_etc1_b << 3); + } + else + { + dst_blk.m_bytes[0] = (uint8_t)(unpacked_src_blk.m_etc1_r | (unpacked_src_blk.m_etc1_r << 4)); + dst_blk.m_bytes[1] = (uint8_t)(unpacked_src_blk.m_etc1_g | (unpacked_src_blk.m_etc1_g << 4)); + dst_blk.m_bytes[2] = (uint8_t)(unpacked_src_blk.m_etc1_b | (unpacked_src_blk.m_etc1_b << 4)); + } + + memcpy(dst_blk.m_bytes + 4, &s_etc1_solid_selectors[unpacked_src_blk.m_etc1_selector][0], 4); + + return; + } + + const bool flip = unpacked_src_blk.m_etc1_flip != 0; + const bool diff = unpacked_src_blk.m_etc1_diff != 0; + + dst_blk.m_bytes[3] = (uint8_t)((int)flip | (diff << 1) | (unpacked_src_blk.m_etc1_inten0 << 5) | (unpacked_src_blk.m_etc1_inten1 << 2)); + + const uint32_t limit = diff ? 31 : 15; + + color32 block_colors[2]; + + for (uint32_t subset = 0; subset < 2; subset++) + { + uint32_t avg_color[3]; + memset(avg_color, 0, sizeof(avg_color)); + + for (uint32_t j = 0; j < 8; j++) + { + const etc_coord2& c = g_etc1_pixel_coords[flip][subset][j]; + + avg_color[0] += block_pixels[c.m_y][c.m_x].r; + avg_color[1] += block_pixels[c.m_y][c.m_x].g; + avg_color[2] += block_pixels[c.m_y][c.m_x].b; + } // j + + block_colors[subset][0] = (uint8_t)((avg_color[0] * limit + 1020) / (8 * 255)); + block_colors[subset][1] = (uint8_t)((avg_color[1] * limit + 1020) / (8 * 255)); + block_colors[subset][2] = (uint8_t)((avg_color[2] * limit + 1020) / (8 * 255)); + block_colors[subset][3] = 0; + + if (g_uastc_mode_has_etc1_bias[unpacked_src_blk.m_mode]) + { + block_colors[subset] = apply_etc1_bias(block_colors[subset], unpacked_src_blk.m_etc1_bias, limit, subset); + } + + } // subset + + if (diff) + { + int dr = block_colors[1].r - block_colors[0].r; + int dg = block_colors[1].g - block_colors[0].g; + int db = block_colors[1].b - block_colors[0].b; + + dr = basisu::clamp(dr, cETC1ColorDeltaMin, cETC1ColorDeltaMax); + dg = basisu::clamp(dg, cETC1ColorDeltaMin, cETC1ColorDeltaMax); + db = basisu::clamp(db, cETC1ColorDeltaMin, cETC1ColorDeltaMax); + + if (dr < 0) dr += 8; + if (dg < 0) dg += 8; + if (db < 0) db += 8; + + dst_blk.m_bytes[0] = (uint8_t)((block_colors[0].r << 3) | dr); + dst_blk.m_bytes[1] = (uint8_t)((block_colors[0].g << 3) | dg); + dst_blk.m_bytes[2] = (uint8_t)((block_colors[0].b << 3) | db); + } + else + { + dst_blk.m_bytes[0] = (uint8_t)(block_colors[1].r | (block_colors[0].r << 4)); + dst_blk.m_bytes[1] = (uint8_t)(block_colors[1].g | (block_colors[0].g << 4)); + dst_blk.m_bytes[2] = (uint8_t)(block_colors[1].b | (block_colors[0].b << 4)); + } + + etc1_determine_selectors(dst_blk, &block_pixels[0][0], 0, 2); + } + + bool transcode_uastc_to_etc1(const uastc_block& src_blk, void* pDst) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + color32 block_pixels[4][4]; + if (unpacked_src_blk.m_mode != UASTC_MODE_INDEX_SOLID_COLOR) + { + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + } + + transcode_uastc_to_etc1(unpacked_src_blk, block_pixels, pDst); + + return true; + } + + static inline int gray_distance2(const uint8_t c, int y) + { + int gray_dist = (int)c - y; + return gray_dist * gray_dist; + } + + static bool pack_etc1_y_estimate_flipped(const uint8_t* pSrc_pixels, + int& upper_avg, int& lower_avg, int& left_avg, int& right_avg) + { + int sums[2][2]; + +#define GET_XY(x, y) pSrc_pixels[(x) + ((y) * 4)] + + sums[0][0] = GET_XY(0, 0) + GET_XY(0, 1) + GET_XY(1, 0) + GET_XY(1, 1); + sums[1][0] = GET_XY(2, 0) + GET_XY(2, 1) + GET_XY(3, 0) + GET_XY(3, 1); + sums[0][1] = GET_XY(0, 2) + GET_XY(0, 3) + GET_XY(1, 2) + GET_XY(1, 3); + sums[1][1] = GET_XY(2, 2) + GET_XY(2, 3) + GET_XY(3, 2) + GET_XY(3, 3); + + upper_avg = (sums[0][0] + sums[1][0] + 4) / 8; + lower_avg = (sums[0][1] + sums[1][1] + 4) / 8; + left_avg = (sums[0][0] + sums[0][1] + 4) / 8; + right_avg = (sums[1][0] + sums[1][1] + 4) / 8; + +#undef GET_XY +#define GET_XY(x, y, a) gray_distance2(pSrc_pixels[(x) + ((y) * 4)], a) + + int upper_gray_dist = 0, lower_gray_dist = 0, left_gray_dist = 0, right_gray_dist = 0; + for (uint32_t i = 0; i < 4; i++) + { + for (uint32_t j = 0; j < 2; j++) + { + upper_gray_dist += GET_XY(i, j, upper_avg); + lower_gray_dist += GET_XY(i, 2 + j, lower_avg); + left_gray_dist += GET_XY(j, i, left_avg); + right_gray_dist += GET_XY(2 + j, i, right_avg); + } + } + +#undef GET_XY + + int upper_lower_sum = upper_gray_dist + lower_gray_dist; + int left_right_sum = left_gray_dist + right_gray_dist; + + return upper_lower_sum < left_right_sum; + } + + // Base Sel Table + // XXXXX XX XXX + static const uint16_t g_etc1_y_solid_block_configs[256] = + { + 0,781,64,161,260,192,33,131,96,320,65,162,261,193,34,291,97,224,66,163,262,194,35,549,98,4,67,653,164,195,523,36,99,5,578,68,165,353,196,37,135,100,324,69,166,354,197,38,295,101,228,70,167, + 355,198,39,553,102,8,71,608,168,199,527,40,103,9,582,72,169,357,200,41,139,104,328,73,170,358,201,42,299,105,232,74,171,359,202,43,557,106,12,75,612,172,203,531,44,107,13,586,76,173,361, + 204,45,143,108,332,77,174,362,205,46,303,109,236,78,175,363,206,47,561,110,16,79,616,176,207,535,48,111,17,590,80,177,365,208,49,147,112,336,81,178,366,209,50,307,113,240,82,179,367,210, + 51,565,114,20,83,620,180,211,539,52,115,21,594,84,181,369,212,53,151,116,340,85,182,370,213,54,311,117,244,86,183,371,214,55,569,118,24,87,624,184,215,543,56,119,25,598,88,185,373,216,57, + 155,120,344,89,186,374,217,58,315,121,248,90,187,375,218,59,573,122,28,91,628,188,219,754,60,123,29,602,92,189,377,220,61,159,124,348,93,190,378,221,62,319,125,252,94,191,379,222,63,882,126 + }; + + // individual + // table base sel0 sel1 sel2 sel3 + static const uint16_t g_etc1_y_solid_block_4i_configs[256] = + { + 0xA000,0xA800,0x540B,0xAA01,0xAA01,0xFE00,0xFF00,0xFF00,0x8,0x5515,0x5509,0x5509,0xAA03,0x5508,0x5508,0x9508,0xA508,0xA908,0xAA08,0x5513,0xAA09,0xAA09,0xAA05,0xFF08,0xFF08,0x10,0x551D,0x5511,0x5511, + 0xAA0B,0x5510,0x5510,0x9510,0xA510,0xA910,0xAA10,0x551B,0xAA11,0xAA11,0xAA0D,0xFF10,0xFF10,0x18,0x5525,0x5519,0x5519,0xAA13,0x5518,0x5518,0x9518,0xA518,0xA918,0xAA18,0x5523,0xAA19,0xAA19,0xAA15, + 0xFF18,0xFF18,0x20,0x552D,0x5521,0x5521,0xAA1B,0x5520,0x5520,0x9520,0xA520,0xA920,0xAA20,0x552B,0xAA21,0xAA21,0xAA1D,0xFF20,0xFF20,0x28,0x5535,0x5529,0x5529,0xAA23,0x5528,0x5528,0x9528,0xA528,0xA928, + 0xAA28,0x5533,0xAA29,0xAA29,0xAA25,0xFF28,0xFF28,0x30,0x553D,0x5531,0x5531,0xAA2B,0x5530,0x5530,0x9530,0xA530,0xA930,0xAA30,0x553B,0xAA31,0xAA31,0xAA2D,0xFF30,0xFF30,0x38,0x5545,0x5539,0x5539,0xAA33, + 0x5538,0x5538,0x9538,0xA538,0xA938,0xAA38,0x5543,0xAA39,0xAA39,0xAA35,0xFF38,0xFF38,0x40,0x554D,0x5541,0x5541,0xAA3B,0x5540,0x5540,0x9540,0xA540,0xA940,0xAA40,0x554B,0xAA41,0xAA41,0xAA3D,0xFF40,0xFF40, + 0x48,0x5555,0x5549,0x5549,0xAA43,0x5548,0x5548,0x9548,0xA548,0xA948,0xAA48,0x5553,0xAA49,0xAA49,0xAA45,0xFF48,0xFF48,0x50,0x555D,0x5551,0x5551,0xAA4B,0x5550,0x5550,0x9550,0xA550,0xA950,0xAA50,0x555B, + 0xAA51,0xAA51,0xAA4D,0xFF50,0xFF50,0x58,0x5565,0x5559,0x5559,0xAA53,0x5558,0x5558,0x9558,0xA558,0xA958,0xAA58,0x5563,0xAA59,0xAA59,0xAA55,0xFF58,0xFF58,0x60,0x556D,0x5561,0x5561,0xAA5B,0x5560,0x5560, + 0x9560,0xA560,0xA960,0xAA60,0x556B,0xAA61,0xAA61,0xAA5D,0xFF60,0xFF60,0x68,0x5575,0x5569,0x5569,0xAA63,0x5568,0x5568,0x9568,0xA568,0xA968,0xAA68,0x5573,0xAA69,0xAA69,0xAA65,0xFF68,0xFF68,0x70,0x557D, + 0x5571,0x5571,0xAA6B,0x5570,0x5570,0x9570,0xA570,0xA970,0xAA70,0x557B,0xAA71,0xAA71,0xAA6D,0xFF70,0xFF70,0x78,0x78,0x5579,0x5579,0xAA73,0x5578,0x9578,0x2578,0xE6E,0x278 + }; + + static const uint16_t g_etc1_y_solid_block_2i_configs[256] = + { + 0x416,0x800,0xA00,0x50B,0xA01,0xA01,0xF00,0xF00,0xF00,0x8,0x515,0x509,0x509,0xA03,0x508,0x508,0xF01,0xF01,0xA08,0xA08,0x513,0xA09,0xA09,0xA05,0xF08,0xF08,0x10,0x51D,0x511,0x511,0xA0B,0x510,0x510,0xF09, + 0xF09,0xA10,0xA10,0x51B,0xA11,0xA11,0xA0D,0xF10,0xF10,0x18,0x525,0x519,0x519,0xA13,0x518,0x518,0xF11,0xF11,0xA18,0xA18,0x523,0xA19,0xA19,0xA15,0xF18,0xF18,0x20,0x52D,0x521,0x521,0xA1B,0x520,0x520,0xF19, + 0xF19,0xA20,0xA20,0x52B,0xA21,0xA21,0xA1D,0xF20,0xF20,0x28,0x535,0x529,0x529,0xA23,0x528,0x528,0xF21,0xF21,0xA28,0xA28,0x533,0xA29,0xA29,0xA25,0xF28,0xF28,0x30,0x53D,0x531,0x531,0xA2B,0x530,0x530,0xF29, + 0xF29,0xA30,0xA30,0x53B,0xA31,0xA31,0xA2D,0xF30,0xF30,0x38,0x545,0x539,0x539,0xA33,0x538,0x538,0xF31,0xF31,0xA38,0xA38,0x543,0xA39,0xA39,0xA35,0xF38,0xF38,0x40,0x54D,0x541,0x541,0xA3B,0x540,0x540,0xF39, + 0xF39,0xA40,0xA40,0x54B,0xA41,0xA41,0xA3D,0xF40,0xF40,0x48,0x555,0x549,0x549,0xA43,0x548,0x548,0xF41,0xF41,0xA48,0xA48,0x553,0xA49,0xA49,0xA45,0xF48,0xF48,0x50,0x55D,0x551,0x551,0xA4B,0x550,0x550,0xF49, + 0xF49,0xA50,0xA50,0x55B,0xA51,0xA51,0xA4D,0xF50,0xF50,0x58,0x565,0x559,0x559,0xA53,0x558,0x558,0xF51,0xF51,0xA58,0xA58,0x563,0xA59,0xA59,0xA55,0xF58,0xF58,0x60,0x56D,0x561,0x561,0xA5B,0x560,0x560,0xF59, + 0xF59,0xA60,0xA60,0x56B,0xA61,0xA61,0xA5D,0xF60,0xF60,0x68,0x575,0x569,0x569,0xA63,0x568,0x568,0xF61,0xF61,0xA68,0xA68,0x573,0xA69,0xA69,0xA65,0xF68,0xF68,0x70,0x57D,0x571,0x571,0xA6B,0x570,0x570,0xF69, + 0xF69,0xA70,0xA70,0x57B,0xA71,0xA71,0xA6D,0xF70,0xF70,0x78,0x78,0x579,0x579,0xA73,0x578,0x578,0xE6E,0x278 + }; + + static const uint16_t g_etc1_y_solid_block_1i_configs[256] = + { + 0x0,0x116,0x200,0x200,0x10B,0x201,0x201,0x300,0x300,0x8,0x115,0x109,0x109,0x203,0x108,0x108,0x114,0x301,0x204,0x208,0x208,0x113,0x209,0x209,0x205,0x308,0x10,0x11D,0x111,0x111,0x20B,0x110,0x110,0x11C,0x309, + 0x20C,0x210,0x210,0x11B,0x211,0x211,0x20D,0x310,0x18,0x125,0x119,0x119,0x213,0x118,0x118,0x124,0x311,0x214,0x218,0x218,0x123,0x219,0x219,0x215,0x318,0x20,0x12D,0x121,0x121,0x21B,0x120,0x120,0x12C,0x319,0x21C, + 0x220,0x220,0x12B,0x221,0x221,0x21D,0x320,0x28,0x135,0x129,0x129,0x223,0x128,0x128,0x134,0x321,0x224,0x228,0x228,0x133,0x229,0x229,0x225,0x328,0x30,0x13D,0x131,0x131,0x22B,0x130,0x130,0x13C,0x329,0x22C,0x230, + 0x230,0x13B,0x231,0x231,0x22D,0x330,0x38,0x145,0x139,0x139,0x233,0x138,0x138,0x144,0x331,0x234,0x238,0x238,0x143,0x239,0x239,0x235,0x338,0x40,0x14D,0x141,0x141,0x23B,0x140,0x140,0x14C,0x339,0x23C,0x240,0x240, + 0x14B,0x241,0x241,0x23D,0x340,0x48,0x155,0x149,0x149,0x243,0x148,0x148,0x154,0x341,0x244,0x248,0x248,0x153,0x249,0x249,0x245,0x348,0x50,0x15D,0x151,0x151,0x24B,0x150,0x150,0x15C,0x349,0x24C,0x250,0x250,0x15B, + 0x251,0x251,0x24D,0x350,0x58,0x165,0x159,0x159,0x253,0x158,0x158,0x164,0x351,0x254,0x258,0x258,0x163,0x259,0x259,0x255,0x358,0x60,0x16D,0x161,0x161,0x25B,0x160,0x160,0x16C,0x359,0x25C,0x260,0x260,0x16B,0x261, + 0x261,0x25D,0x360,0x68,0x175,0x169,0x169,0x263,0x168,0x168,0x174,0x361,0x264,0x268,0x268,0x173,0x269,0x269,0x265,0x368,0x70,0x17D,0x171,0x171,0x26B,0x170,0x170,0x17C,0x369,0x26C,0x270,0x270,0x17B,0x271,0x271, + 0x26D,0x370,0x78,0x78,0x179,0x179,0x273,0x178,0x178,0x26E,0x278 + }; + + // We don't have any useful hints to accelerate single channel ETC1, so we need to real-time encode from scratch. + bool transcode_uastc_to_etc1(const uastc_block& src_blk, void* pDst, uint32_t channel) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + +#if 0 + for (uint32_t individ = 0; individ < 2; individ++) + { + uint32_t overall_error = 0; + + for (uint32_t c = 0; c < 256; c++) + { + uint32_t best_err = UINT32_MAX; + uint32_t best_individ = 0; + uint32_t best_base = 0; + uint32_t best_sels[4] = { 0,0,0,0 }; + uint32_t best_table = 0; + + const uint32_t limit = individ ? 16 : 32; + + for (uint32_t table = 0; table < 8; table++) + { + for (uint32_t base = 0; base < limit; base++) + { + uint32_t total_e = 0; + uint32_t sels[4] = { 0,0,0,0 }; + + const uint32_t N = 4; + for (uint32_t i = 0; i < basisu::minimum(N, (256 - c)); i++) + { + uint32_t best_sel_e = UINT32_MAX; + uint32_t best_sel = 0; + + for (uint32_t sel = 0; sel < 4; sel++) + { + int val = individ ? ((base << 4) | base) : ((base << 3) | (base >> 2)); + val = clamp255(val + g_etc1_inten_tables[table][sel]); + + int e = iabs(val - clamp255(c + i)); + if (e < best_sel_e) + { + best_sel_e = e; + best_sel = sel; + } + + } // sel + + sels[i] = best_sel; + total_e += best_sel_e * best_sel_e; + + } // i + + if (total_e < best_err) + { + best_err = total_e; + best_individ = individ; + best_base = base; + memcpy(best_sels, sels, sizeof(best_sels)); + best_table = table; + } + + } // base + } // table + + //printf("%u: %u,%u,%u,%u,%u,%u,%u,%u\n", c, best_err, best_individ, best_table, best_base, best_sels[0], best_sels[1], best_sels[2], best_sels[3]); + + uint32_t encoded = best_table | (best_base << 3) | + (best_sels[0] << 8) | + (best_sels[1] << 10) | + (best_sels[2] << 12) | + (best_sels[3] << 14); + + printf("0x%X,", encoded); + + overall_error += best_err; + } // c + + printf("\n"); + printf("Overall error: %u\n", overall_error); + + } // individ + + exit(0); +#endif + +#if 0 + for (uint32_t individ = 0; individ < 2; individ++) + { + uint32_t overall_error = 0; + + for (uint32_t c = 0; c < 256; c++) + { + uint32_t best_err = UINT32_MAX; + uint32_t best_individ = 0; + uint32_t best_base = 0; + uint32_t best_sels[4] = { 0,0,0,0 }; + uint32_t best_table = 0; + + const uint32_t limit = individ ? 16 : 32; + + for (uint32_t table = 0; table < 8; table++) + { + for (uint32_t base = 0; base < limit; base++) + { + uint32_t total_e = 0; + uint32_t sels[4] = { 0,0,0,0 }; + + const uint32_t N = 1; + for (uint32_t i = 0; i < basisu::minimum(N, (256 - c)); i++) + { + uint32_t best_sel_e = UINT32_MAX; + uint32_t best_sel = 0; + + for (uint32_t sel = 0; sel < 4; sel++) + { + int val = individ ? ((base << 4) | base) : ((base << 3) | (base >> 2)); + val = clamp255(val + g_etc1_inten_tables[table][sel]); + + int e = iabs(val - clamp255(c + i)); + if (e < best_sel_e) + { + best_sel_e = e; + best_sel = sel; + } + + } // sel + + sels[i] = best_sel; + total_e += best_sel_e * best_sel_e; + + } // i + + if (total_e < best_err) + { + best_err = total_e; + best_individ = individ; + best_base = base; + memcpy(best_sels, sels, sizeof(best_sels)); + best_table = table; + } + + } // base + } // table + + //printf("%u: %u,%u,%u,%u,%u,%u,%u,%u\n", c, best_err, best_individ, best_table, best_base, best_sels[0], best_sels[1], best_sels[2], best_sels[3]); + + uint32_t encoded = best_table | (best_base << 3) | + (best_sels[0] << 8) | + (best_sels[1] << 10) | + (best_sels[2] << 12) | + (best_sels[3] << 14); + + printf("0x%X,", encoded); + + overall_error += best_err; + } // c + + printf("\n"); + printf("Overall error: %u\n", overall_error); + + } // individ + + exit(0); +#endif + + decoder_etc_block& dst_blk = *static_cast(pDst); + + if (unpacked_src_blk.m_mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + const uint32_t y = unpacked_src_blk.m_solid_color[channel]; + const uint32_t encoded_config = g_etc1_y_solid_block_configs[y]; + + const uint32_t base = encoded_config & 31; + const uint32_t sel = (encoded_config >> 5) & 3; + const uint32_t table = encoded_config >> 7; + + dst_blk.m_bytes[3] = (uint8_t)(2 | (table << 5) | (table << 2)); + + dst_blk.m_bytes[0] = (uint8_t)(base << 3); + dst_blk.m_bytes[1] = (uint8_t)(base << 3); + dst_blk.m_bytes[2] = (uint8_t)(base << 3); + + memcpy(dst_blk.m_bytes + 4, &s_etc1_solid_selectors[sel][0], 4); + return true; + } + + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + uint8_t block_y[4][4]; + for (uint32_t i = 0; i < 16; i++) + ((uint8_t*)block_y)[i] = ((color32*)block_pixels)[i][channel]; + + int upper_avg, lower_avg, left_avg, right_avg; + bool flip = pack_etc1_y_estimate_flipped(&block_y[0][0], upper_avg, lower_avg, left_avg, right_avg); + + // non-flipped: | | + // vs. + // flipped: -- + // -- + + uint32_t low[2] = { 255, 255 }, high[2] = { 0, 0 }; + + if (flip) + { + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t v = block_y[y][x]; + low[0] = basisu::minimum(low[0], v); + high[0] = basisu::maximum(high[0], v); + } + } + for (uint32_t y = 2; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const uint32_t v = block_y[y][x]; + low[1] = basisu::minimum(low[1], v); + high[1] = basisu::maximum(high[1], v); + } + } + } + else + { + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 2; x++) + { + const uint32_t v = block_y[y][x]; + low[0] = basisu::minimum(low[0], v); + high[0] = basisu::maximum(high[0], v); + } + } + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 2; x < 4; x++) + { + const uint32_t v = block_y[y][x]; + low[1] = basisu::minimum(low[1], v); + high[1] = basisu::maximum(high[1], v); + } + } + } + + const uint32_t range[2] = { high[0] - low[0], high[1] - low[1] }; + + dst_blk.m_bytes[3] = (uint8_t)((int)flip); + + if ((range[0] <= 3) && (range[1] <= 3)) + { + // This is primarily for better gradients. + dst_blk.m_bytes[0] = 0; + dst_blk.m_bytes[1] = 0; + dst_blk.m_bytes[2] = 0; + + uint16_t l_bitmask = 0, h_bitmask = 0; + + for (uint32_t subblock = 0; subblock < 2; subblock++) + { + const uint32_t encoded = (range[subblock] == 0) ? g_etc1_y_solid_block_1i_configs[low[subblock]] : ((range[subblock] < 2) ? g_etc1_y_solid_block_2i_configs[low[subblock]] : g_etc1_y_solid_block_4i_configs[low[subblock]]); + + const uint32_t table = encoded & 7; + const uint32_t base = (encoded >> 3) & 31; + assert(base <= 15); + const uint32_t sels[4] = { (encoded >> 8) & 3, (encoded >> 10) & 3, (encoded >> 12) & 3, (encoded >> 14) & 3 }; + + dst_blk.m_bytes[3] |= (uint8_t)(table << (subblock ? 2 : 5)); + + const uint32_t sv = base << (subblock ? 0 : 4); + dst_blk.m_bytes[0] |= (uint8_t)(sv); + dst_blk.m_bytes[1] |= (uint8_t)(sv); + dst_blk.m_bytes[2] |= (uint8_t)(sv); + + if (flip) + { + uint32_t ofs = subblock * 2; + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t t = block_y[y + subblock * 2][x]; + assert(t >= low[subblock] && t <= high[subblock]); + t -= low[subblock]; + assert(t <= 3); + + t = g_selector_index_to_etc1[sels[t]]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ofs += 4; + } + + ofs = (int)ofs + 1 - 4 * 4; + } + } + else + { + uint32_t ofs = (subblock * 2) * 4; + for (uint32_t x = 0; x < 2; x++) + { + for (uint32_t y = 0; y < 4; y++) + { + uint32_t t = block_y[y][x + subblock * 2]; + assert(t >= low[subblock] && t <= high[subblock]); + t -= low[subblock]; + assert(t <= 3); + + t = g_selector_index_to_etc1[sels[t]]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ++ofs; + } + } + } + } // subblock + + dst_blk.m_bytes[7] = (uint8_t)(l_bitmask); + dst_blk.m_bytes[6] = (uint8_t)(l_bitmask >> 8); + dst_blk.m_bytes[5] = (uint8_t)(h_bitmask); + dst_blk.m_bytes[4] = (uint8_t)(h_bitmask >> 8); + + return true; + } + + uint32_t y0 = ((flip ? upper_avg : left_avg) * 31 + 127) / 255; + uint32_t y1 = ((flip ? lower_avg : right_avg) * 31 + 127) / 255; + + bool diff = true; + + int dy = y1 - y0; + + if ((dy < cETC1ColorDeltaMin) || (dy > cETC1ColorDeltaMax)) + { + diff = false; + + y0 = ((flip ? upper_avg : left_avg) * 15 + 127) / 255; + y1 = ((flip ? lower_avg : right_avg) * 15 + 127) / 255; + + dst_blk.m_bytes[0] = (uint8_t)(y1 | (y0 << 4)); + dst_blk.m_bytes[1] = (uint8_t)(y1 | (y0 << 4)); + dst_blk.m_bytes[2] = (uint8_t)(y1 | (y0 << 4)); + } + else + { + dy = basisu::clamp(dy, cETC1ColorDeltaMin, cETC1ColorDeltaMax); + + y1 = y0 + dy; + + if (dy < 0) dy += 8; + + dst_blk.m_bytes[0] = (uint8_t)((y0 << 3) | dy); + dst_blk.m_bytes[1] = (uint8_t)((y0 << 3) | dy); + dst_blk.m_bytes[2] = (uint8_t)((y0 << 3) | dy); + + dst_blk.m_bytes[3] |= 2; + } + + const uint32_t base_y[2] = { diff ? ((y0 << 3) | (y0 >> 2)) : ((y0 << 4) | y0), diff ? ((y1 << 3) | (y1 >> 2)) : ((y1 << 4) | y1) }; + + uint32_t enc_range[2]; + for (uint32_t subset = 0; subset < 2; subset++) + { + const int pos = basisu::iabs((int)high[subset] - (int)base_y[subset]); + const int neg = basisu::iabs((int)base_y[subset] - (int)low[subset]); + + enc_range[subset] = basisu::maximum(pos, neg); + } + + uint16_t l_bitmask = 0, h_bitmask = 0; + for (uint32_t subblock = 0; subblock < 2; subblock++) + { + if ((!diff) && (range[subblock] <= 3)) + { + const uint32_t encoded = (range[subblock] == 0) ? g_etc1_y_solid_block_1i_configs[low[subblock]] : ((range[subblock] < 2) ? g_etc1_y_solid_block_2i_configs[low[subblock]] : g_etc1_y_solid_block_4i_configs[low[subblock]]); + + const uint32_t table = encoded & 7; + const uint32_t base = (encoded >> 3) & 31; + assert(base <= 15); + const uint32_t sels[4] = { (encoded >> 8) & 3, (encoded >> 10) & 3, (encoded >> 12) & 3, (encoded >> 14) & 3 }; + + dst_blk.m_bytes[3] |= (uint8_t)(table << (subblock ? 2 : 5)); + + const uint32_t mask = ~(0xF << (subblock ? 0 : 4)); + + dst_blk.m_bytes[0] &= mask; + dst_blk.m_bytes[1] &= mask; + dst_blk.m_bytes[2] &= mask; + + const uint32_t sv = base << (subblock ? 0 : 4); + dst_blk.m_bytes[0] |= (uint8_t)(sv); + dst_blk.m_bytes[1] |= (uint8_t)(sv); + dst_blk.m_bytes[2] |= (uint8_t)(sv); + + if (flip) + { + uint32_t ofs = subblock * 2; + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t t = block_y[y + subblock * 2][x]; + assert(t >= low[subblock] && t <= high[subblock]); + t -= low[subblock]; + assert(t <= 3); + + t = g_selector_index_to_etc1[sels[t]]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ofs += 4; + } + + ofs = (int)ofs + 1 - 4 * 4; + } + } + else + { + uint32_t ofs = (subblock * 2) * 4; + for (uint32_t x = 0; x < 2; x++) + { + for (uint32_t y = 0; y < 4; y++) + { + uint32_t t = block_y[y][x + subblock * 2]; + assert(t >= low[subblock] && t <= high[subblock]); + t -= low[subblock]; + assert(t <= 3); + + t = g_selector_index_to_etc1[sels[t]]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ++ofs; + } + } + } + + continue; + } // if + + uint32_t best_err = UINT32_MAX; + uint8_t best_sels[8]; + uint32_t best_inten = 0; + + const int base = base_y[subblock]; + + const int low_limit = -base; + const int high_limit = 255 - base; + + assert(low_limit <= 0 && high_limit >= 0); + + uint32_t inten_table_mask = 0xFF; + const uint32_t er = enc_range[subblock]; + // Each one of these tables is expensive to evaluate, so let's only examine the ones we know may be useful. + if (er <= 51) + { + inten_table_mask = 0xF; + + if (er > 22) + inten_table_mask &= ~(1 << 0); + + if ((er < 4) || (er > 39)) + inten_table_mask &= ~(1 << 1); + + if (er < 9) + inten_table_mask &= ~(1 << 2); + + if (er < 12) + inten_table_mask &= ~(1 << 3); + } + else + { + inten_table_mask &= ~((1 << 0) | (1 << 1)); + + if (er > 60) + inten_table_mask &= ~(1 << 2); + + if (er > 89) + inten_table_mask &= ~(1 << 3); + + if (er > 120) + inten_table_mask &= ~(1 << 4); + + if (er > 136) + inten_table_mask &= ~(1 << 5); + + if (er > 174) + inten_table_mask &= ~(1 << 6); + } + + for (uint32_t inten = 0; inten < 8; inten++) + { + if ((inten_table_mask & (1 << inten)) == 0) + continue; + + const int t0 = basisu::maximum(low_limit, g_etc1_inten_tables[inten][0]); + const int t1 = basisu::maximum(low_limit, g_etc1_inten_tables[inten][1]); + const int t2 = basisu::minimum(high_limit, g_etc1_inten_tables[inten][2]); + const int t3 = basisu::minimum(high_limit, g_etc1_inten_tables[inten][3]); + assert((t0 <= t1) && (t1 <= t2) && (t2 <= t3)); + + const int tv[4] = { t2, t3, t1, t0 }; + + const int thresh01 = t0 + t1; + const int thresh12 = t1 + t2; + const int thresh23 = t2 + t3; + + assert(thresh01 <= thresh12 && thresh12 <= thresh23); + + static const uint8_t s_table[4] = { 1, 0, 2, 3 }; + + uint32_t total_err = 0; + uint8_t sels[8]; + + if (flip) + { + if (((int)high[subblock] - base) * 2 < thresh01) + { + memset(sels, 3, 8); + + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const int delta = (int)block_y[y + subblock * 2][x] - base; + + const uint32_t c = 3; + + uint32_t e = basisu::iabs(tv[c] - delta); + total_err += e * e; + } + if (total_err >= best_err) + break; + } + } + else if (((int)low[subblock] - base) * 2 >= thresh23) + { + memset(sels, 1, 8); + + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const int delta = (int)block_y[y + subblock * 2][x] - base; + + const uint32_t c = 1; + + uint32_t e = basisu::iabs(tv[c] - delta); + total_err += e * e; + } + if (total_err >= best_err) + break; + } + } + else + { + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + const int delta = (int)block_y[y + subblock * 2][x] - base; + const int delta2 = delta * 2; + + uint32_t c = s_table[(delta2 < thresh01) + (delta2 < thresh12) + (delta2 < thresh23)]; + sels[y * 4 + x] = (uint8_t)c; + + uint32_t e = basisu::iabs(tv[c] - delta); + total_err += e * e; + } + if (total_err >= best_err) + break; + } + } + } + else + { + if (((int)high[subblock] - base) * 2 < thresh01) + { + memset(sels, 3, 8); + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 2; x++) + { + const int delta = (int)block_y[y][x + subblock * 2] - base; + + const uint32_t c = 3; + + uint32_t e = basisu::iabs(tv[c] - delta); + total_err += e * e; + } + if (total_err >= best_err) + break; + } + } + else if (((int)low[subblock] - base) * 2 >= thresh23) + { + memset(sels, 1, 8); + + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 2; x++) + { + const int delta = (int)block_y[y][x + subblock * 2] - base; + + const uint32_t c = 1; + + uint32_t e = basisu::iabs(tv[c] - delta); + total_err += e * e; + } + if (total_err >= best_err) + break; + } + } + else + { + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 2; x++) + { + const int delta = (int)block_y[y][x + subblock * 2] - base; + const int delta2 = delta * 2; + + uint32_t c = s_table[(delta2 < thresh01) + (delta2 < thresh12) + (delta2 < thresh23)]; + sels[y * 2 + x] = (uint8_t)c; + + uint32_t e = basisu::iabs(tv[c] - delta); + total_err += e * e; + } + if (total_err >= best_err) + break; + } + } + } + + if (total_err < best_err) + { + best_err = total_err; + best_inten = inten; + memcpy(best_sels, sels, 8); + } + + } // inten + + //g_inten_hist[best_inten][enc_range[subblock]]++; + + dst_blk.m_bytes[3] |= (uint8_t)(best_inten << (subblock ? 2 : 5)); + + if (flip) + { + uint32_t ofs = subblock * 2; + for (uint32_t y = 0; y < 2; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t t = best_sels[y * 4 + x]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ofs += 4; + } + + ofs = (int)ofs + 1 - 4 * 4; + } + } + else + { + uint32_t ofs = (subblock * 2) * 4; + for (uint32_t x = 0; x < 2; x++) + { + for (uint32_t y = 0; y < 4; y++) + { + uint32_t t = best_sels[y * 2 + x]; + + assert(ofs < 16); + l_bitmask |= ((t & 1) << ofs); + h_bitmask |= ((t >> 1) << ofs); + ++ofs; + } + } + } + + } // subblock + + dst_blk.m_bytes[7] = (uint8_t)(l_bitmask); + dst_blk.m_bytes[6] = (uint8_t)(l_bitmask >> 8); + dst_blk.m_bytes[5] = (uint8_t)(h_bitmask); + dst_blk.m_bytes[4] = (uint8_t)(h_bitmask >> 8); + + return true; + } + + const uint32_t ETC2_EAC_MIN_VALUE_SELECTOR = 3, ETC2_EAC_MAX_VALUE_SELECTOR = 7; + + void transcode_uastc_to_etc2_eac_a8(unpacked_uastc_block& unpacked_src_blk, color32 block_pixels[4][4], void* pDst) + { + eac_block& dst = *static_cast(pDst); + const color32* pSrc_pixels = &block_pixels[0][0]; + + if ((!g_uastc_mode_has_alpha[unpacked_src_blk.m_mode]) || (unpacked_src_blk.m_mode == UASTC_MODE_INDEX_SOLID_COLOR)) + { + const uint32_t a = (unpacked_src_blk.m_mode == UASTC_MODE_INDEX_SOLID_COLOR) ? unpacked_src_blk.m_solid_color[3] : 255; + + dst.m_base = a; + dst.m_table = 13; + dst.m_multiplier = 1; + + memcpy(dst.m_selectors, g_etc2_eac_a8_sel4, sizeof(g_etc2_eac_a8_sel4)); + + return; + } + + uint32_t min_a = 255, max_a = 0; + for (uint32_t i = 0; i < 16; i++) + { + min_a = basisu::minimum(min_a, pSrc_pixels[i].a); + max_a = basisu::maximum(max_a, pSrc_pixels[i].a); + } + + if (min_a == max_a) + { + dst.m_base = min_a; + dst.m_table = 13; + dst.m_multiplier = 1; + + memcpy(dst.m_selectors, g_etc2_eac_a8_sel4, sizeof(g_etc2_eac_a8_sel4)); + return; + } + + const uint32_t table = unpacked_src_blk.m_etc2_hints & 0xF; + const int multiplier = unpacked_src_blk.m_etc2_hints >> 4; + + assert(multiplier >= 1); + + dst.m_multiplier = multiplier; + dst.m_table = table; + + const float range = (float)(g_eac_modifier_table[dst.m_table][ETC2_EAC_MAX_VALUE_SELECTOR] - g_eac_modifier_table[dst.m_table][ETC2_EAC_MIN_VALUE_SELECTOR]); + const int center = (int)roundf(basisu::lerp((float)min_a, (float)max_a, (float)(0 - g_eac_modifier_table[dst.m_table][ETC2_EAC_MIN_VALUE_SELECTOR]) / range)); + + dst.m_base = center; + + const int8_t* pTable = &g_eac_modifier_table[dst.m_table][0]; + + uint32_t vals[8]; + for (uint32_t j = 0; j < 8; j++) + vals[j] = clamp255(center + (pTable[j] * multiplier)); + + uint64_t sels = 0; + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t a = block_pixels[i & 3][i >> 2].a; + + const uint32_t err0 = (basisu::iabs(vals[0] - a) << 3) | 0; + const uint32_t err1 = (basisu::iabs(vals[1] - a) << 3) | 1; + const uint32_t err2 = (basisu::iabs(vals[2] - a) << 3) | 2; + const uint32_t err3 = (basisu::iabs(vals[3] - a) << 3) | 3; + const uint32_t err4 = (basisu::iabs(vals[4] - a) << 3) | 4; + const uint32_t err5 = (basisu::iabs(vals[5] - a) << 3) | 5; + const uint32_t err6 = (basisu::iabs(vals[6] - a) << 3) | 6; + const uint32_t err7 = (basisu::iabs(vals[7] - a) << 3) | 7; + + const uint32_t min_err = basisu::minimum(basisu::minimum(basisu::minimum(basisu::minimum(basisu::minimum(basisu::minimum(err0, err1, err2), err3), err4), err5), err6), err7); + + const uint64_t best_index = min_err & 7; + sels |= (best_index << (45 - i * 3)); + } + + dst.set_selector_bits(sels); + } + + bool transcode_uastc_to_etc2_rgba(const uastc_block& src_blk, void* pDst) + { + eac_block& dst_etc2_eac_a8_blk = *static_cast(pDst); + decoder_etc_block& dst_etc1_blk = static_cast(pDst)[1]; + + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + color32 block_pixels[4][4]; + if (unpacked_src_blk.m_mode != UASTC_MODE_INDEX_SOLID_COLOR) + { + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + } + + transcode_uastc_to_etc2_eac_a8(unpacked_src_blk, block_pixels, &dst_etc2_eac_a8_blk); + + transcode_uastc_to_etc1(unpacked_src_blk, block_pixels, &dst_etc1_blk); + + return true; + } + + static const uint8_t s_uastc5_to_bc1[32] = { 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1 }; + static const uint8_t s_uastc4_to_bc1[16] = { 0, 0, 0, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 1, 1, 1 }; + static const uint8_t s_uastc3_to_bc1[8] = { 0, 0, 2, 2, 3, 3, 1, 1 }; + static const uint8_t s_uastc2_to_bc1[4] = { 0, 2, 3, 1 }; + static const uint8_t s_uastc1_to_bc1[2] = { 0, 1 }; + const uint8_t* s_uastc_to_bc1_weights[6] = { nullptr, s_uastc1_to_bc1, s_uastc2_to_bc1, s_uastc3_to_bc1, s_uastc4_to_bc1, s_uastc5_to_bc1 }; + + void encode_bc4(void* pDst, const uint8_t* pPixels, uint32_t stride) + { + uint32_t min0_v, max0_v, min1_v, max1_v,min2_v, max2_v, min3_v, max3_v; + + { + min0_v = max0_v = pPixels[0 * stride]; + min1_v = max1_v = pPixels[1 * stride]; + min2_v = max2_v = pPixels[2 * stride]; + min3_v = max3_v = pPixels[3 * stride]; + } + + { + uint32_t v0 = pPixels[4 * stride]; min0_v = basisu::minimum(min0_v, v0); max0_v = basisu::maximum(max0_v, v0); + uint32_t v1 = pPixels[5 * stride]; min1_v = basisu::minimum(min1_v, v1); max1_v = basisu::maximum(max1_v, v1); + uint32_t v2 = pPixels[6 * stride]; min2_v = basisu::minimum(min2_v, v2); max2_v = basisu::maximum(max2_v, v2); + uint32_t v3 = pPixels[7 * stride]; min3_v = basisu::minimum(min3_v, v3); max3_v = basisu::maximum(max3_v, v3); + } + + { + uint32_t v0 = pPixels[8 * stride]; min0_v = basisu::minimum(min0_v, v0); max0_v = basisu::maximum(max0_v, v0); + uint32_t v1 = pPixels[9 * stride]; min1_v = basisu::minimum(min1_v, v1); max1_v = basisu::maximum(max1_v, v1); + uint32_t v2 = pPixels[10 * stride]; min2_v = basisu::minimum(min2_v, v2); max2_v = basisu::maximum(max2_v, v2); + uint32_t v3 = pPixels[11 * stride]; min3_v = basisu::minimum(min3_v, v3); max3_v = basisu::maximum(max3_v, v3); + } + + { + uint32_t v0 = pPixels[12 * stride]; min0_v = basisu::minimum(min0_v, v0); max0_v = basisu::maximum(max0_v, v0); + uint32_t v1 = pPixels[13 * stride]; min1_v = basisu::minimum(min1_v, v1); max1_v = basisu::maximum(max1_v, v1); + uint32_t v2 = pPixels[14 * stride]; min2_v = basisu::minimum(min2_v, v2); max2_v = basisu::maximum(max2_v, v2); + uint32_t v3 = pPixels[15 * stride]; min3_v = basisu::minimum(min3_v, v3); max3_v = basisu::maximum(max3_v, v3); + } + + const uint32_t min_v = basisu::minimum(min0_v, min1_v, min2_v, min3_v); + const uint32_t max_v = basisu::maximum(max0_v, max1_v, max2_v, max3_v); + + uint8_t* pDst_bytes = static_cast(pDst); + pDst_bytes[0] = (uint8_t)max_v; + pDst_bytes[1] = (uint8_t)min_v; + + if (max_v == min_v) + { + memset(pDst_bytes + 2, 0, 6); + return; + } + + const uint32_t delta = max_v - min_v; + + // min_v is now 0. Compute thresholds between values by scaling max_v. It's x14 because we're adding two x7 scale factors. + const int t0 = delta * 13; + const int t1 = delta * 11; + const int t2 = delta * 9; + const int t3 = delta * 7; + const int t4 = delta * 5; + const int t5 = delta * 3; + const int t6 = delta * 1; + + // BC4 floors in its divisions, which we compensate for with the 4 bias. + // This function is optimal for all possible inputs (i.e. it outputs the same results as checking all 8 values and choosing the closest one). + const int bias = 4 - min_v * 14; + + static const uint32_t s_tran0[8] = { 1U , 7U , 6U , 5U , 4U , 3U , 2U , 0U }; + static const uint32_t s_tran1[8] = { 1U << 3U, 7U << 3U, 6U << 3U, 5U << 3U, 4U << 3U, 3U << 3U, 2U << 3U, 0U << 3U }; + static const uint32_t s_tran2[8] = { 1U << 6U, 7U << 6U, 6U << 6U, 5U << 6U, 4U << 6U, 3U << 6U, 2U << 6U, 0U << 6U }; + static const uint32_t s_tran3[8] = { 1U << 9U, 7U << 9U, 6U << 9U, 5U << 9U, 4U << 9U, 3U << 9U, 2U << 9U, 0U << 9U }; + + uint64_t a0, a1, a2, a3; + { + const int v0 = pPixels[0 * stride] * 14 + bias; + const int v1 = pPixels[1 * stride] * 14 + bias; + const int v2 = pPixels[2 * stride] * 14 + bias; + const int v3 = pPixels[3 * stride] * 14 + bias; + a0 = s_tran0[(v0 >= t0) + (v0 >= t1) + (v0 >= t2) + (v0 >= t3) + (v0 >= t4) + (v0 >= t5) + (v0 >= t6)]; + a1 = s_tran1[(v1 >= t0) + (v1 >= t1) + (v1 >= t2) + (v1 >= t3) + (v1 >= t4) + (v1 >= t5) + (v1 >= t6)]; + a2 = s_tran2[(v2 >= t0) + (v2 >= t1) + (v2 >= t2) + (v2 >= t3) + (v2 >= t4) + (v2 >= t5) + (v2 >= t6)]; + a3 = s_tran3[(v3 >= t0) + (v3 >= t1) + (v3 >= t2) + (v3 >= t3) + (v3 >= t4) + (v3 >= t5) + (v3 >= t6)]; + } + + { + const int v0 = pPixels[4 * stride] * 14 + bias; + const int v1 = pPixels[5 * stride] * 14 + bias; + const int v2 = pPixels[6 * stride] * 14 + bias; + const int v3 = pPixels[7 * stride] * 14 + bias; + a0 |= (s_tran0[(v0 >= t0) + (v0 >= t1) + (v0 >= t2) + (v0 >= t3) + (v0 >= t4) + (v0 >= t5) + (v0 >= t6)] << 12U); + a1 |= (s_tran1[(v1 >= t0) + (v1 >= t1) + (v1 >= t2) + (v1 >= t3) + (v1 >= t4) + (v1 >= t5) + (v1 >= t6)] << 12U); + a2 |= (s_tran2[(v2 >= t0) + (v2 >= t1) + (v2 >= t2) + (v2 >= t3) + (v2 >= t4) + (v2 >= t5) + (v2 >= t6)] << 12U); + a3 |= (s_tran3[(v3 >= t0) + (v3 >= t1) + (v3 >= t2) + (v3 >= t3) + (v3 >= t4) + (v3 >= t5) + (v3 >= t6)] << 12U); + } + + { + const int v0 = pPixels[8 * stride] * 14 + bias; + const int v1 = pPixels[9 * stride] * 14 + bias; + const int v2 = pPixels[10 * stride] * 14 + bias; + const int v3 = pPixels[11 * stride] * 14 + bias; + a0 |= (((uint64_t)s_tran0[(v0 >= t0) + (v0 >= t1) + (v0 >= t2) + (v0 >= t3) + (v0 >= t4) + (v0 >= t5) + (v0 >= t6)]) << 24U); + a1 |= (((uint64_t)s_tran1[(v1 >= t0) + (v1 >= t1) + (v1 >= t2) + (v1 >= t3) + (v1 >= t4) + (v1 >= t5) + (v1 >= t6)]) << 24U); + a2 |= (((uint64_t)s_tran2[(v2 >= t0) + (v2 >= t1) + (v2 >= t2) + (v2 >= t3) + (v2 >= t4) + (v2 >= t5) + (v2 >= t6)]) << 24U); + a3 |= (((uint64_t)s_tran3[(v3 >= t0) + (v3 >= t1) + (v3 >= t2) + (v3 >= t3) + (v3 >= t4) + (v3 >= t5) + (v3 >= t6)]) << 24U); + } + + { + const int v0 = pPixels[12 * stride] * 14 + bias; + const int v1 = pPixels[13 * stride] * 14 + bias; + const int v2 = pPixels[14 * stride] * 14 + bias; + const int v3 = pPixels[15 * stride] * 14 + bias; + a0 |= (((uint64_t)s_tran0[(v0 >= t0) + (v0 >= t1) + (v0 >= t2) + (v0 >= t3) + (v0 >= t4) + (v0 >= t5) + (v0 >= t6)]) << 36U); + a1 |= (((uint64_t)s_tran1[(v1 >= t0) + (v1 >= t1) + (v1 >= t2) + (v1 >= t3) + (v1 >= t4) + (v1 >= t5) + (v1 >= t6)]) << 36U); + a2 |= (((uint64_t)s_tran2[(v2 >= t0) + (v2 >= t1) + (v2 >= t2) + (v2 >= t3) + (v2 >= t4) + (v2 >= t5) + (v2 >= t6)]) << 36U); + a3 |= (((uint64_t)s_tran3[(v3 >= t0) + (v3 >= t1) + (v3 >= t2) + (v3 >= t3) + (v3 >= t4) + (v3 >= t5) + (v3 >= t6)]) << 36U); + } + + const uint64_t f = a0 | a1 | a2 | a3; + + pDst_bytes[2] = (uint8_t)f; + pDst_bytes[3] = (uint8_t)(f >> 8U); + pDst_bytes[4] = (uint8_t)(f >> 16U); + pDst_bytes[5] = (uint8_t)(f >> 24U); + pDst_bytes[6] = (uint8_t)(f >> 32U); + pDst_bytes[7] = (uint8_t)(f >> 40U); + } + + static void bc1_find_sels(const color32 *pSrc_pixels, uint32_t lr, uint32_t lg, uint32_t lb, uint32_t hr, uint32_t hg, uint32_t hb, uint8_t sels[16]) + { + uint32_t block_r[4], block_g[4], block_b[4]; + + block_r[0] = (lr << 3) | (lr >> 2); block_g[0] = (lg << 2) | (lg >> 4); block_b[0] = (lb << 3) | (lb >> 2); + block_r[3] = (hr << 3) | (hr >> 2); block_g[3] = (hg << 2) | (hg >> 4); block_b[3] = (hb << 3) | (hb >> 2); + block_r[1] = (block_r[0] * 2 + block_r[3]) / 3; block_g[1] = (block_g[0] * 2 + block_g[3]) / 3; block_b[1] = (block_b[0] * 2 + block_b[3]) / 3; + block_r[2] = (block_r[3] * 2 + block_r[0]) / 3; block_g[2] = (block_g[3] * 2 + block_g[0]) / 3; block_b[2] = (block_b[3] * 2 + block_b[0]) / 3; + + int ar = block_r[3] - block_r[0], ag = block_g[3] - block_g[0], ab = block_b[3] - block_b[0]; + + int dots[4]; + for (uint32_t i = 0; i < 4; i++) + dots[i] = (int)block_r[i] * ar + (int)block_g[i] * ag + (int)block_b[i] * ab; + + int t0 = dots[0] + dots[1], t1 = dots[1] + dots[2], t2 = dots[2] + dots[3]; + + ar *= 2; ag *= 2; ab *= 2; + + for (uint32_t i = 0; i < 16; i++) + { + const int d = pSrc_pixels[i].r * ar + pSrc_pixels[i].g * ag + pSrc_pixels[i].b * ab; + static const uint8_t s_sels[4] = { 3, 2, 1, 0 }; + + // Rounding matters here! + // d <= t0: <=, not <, to the later LS step "sees" a wider range of selectors. It matters for quality. + sels[i] = s_sels[(d <= t0) + (d < t1) + (d < t2)]; + } + } + + static inline void bc1_find_sels_2(const color32* pSrc_pixels, uint32_t lr, uint32_t lg, uint32_t lb, uint32_t hr, uint32_t hg, uint32_t hb, uint8_t sels[16]) + { + uint32_t block_r[4], block_g[4], block_b[4]; + + block_r[0] = (lr << 3) | (lr >> 2); block_g[0] = (lg << 2) | (lg >> 4); block_b[0] = (lb << 3) | (lb >> 2); + block_r[3] = (hr << 3) | (hr >> 2); block_g[3] = (hg << 2) | (hg >> 4); block_b[3] = (hb << 3) | (hb >> 2); + block_r[1] = (block_r[0] * 2 + block_r[3]) / 3; block_g[1] = (block_g[0] * 2 + block_g[3]) / 3; block_b[1] = (block_b[0] * 2 + block_b[3]) / 3; + block_r[2] = (block_r[3] * 2 + block_r[0]) / 3; block_g[2] = (block_g[3] * 2 + block_g[0]) / 3; block_b[2] = (block_b[3] * 2 + block_b[0]) / 3; + + int ar = block_r[3] - block_r[0], ag = block_g[3] - block_g[0], ab = block_b[3] - block_b[0]; + + int dots[4]; + for (uint32_t i = 0; i < 4; i++) + dots[i] = (int)block_r[i] * ar + (int)block_g[i] * ag + (int)block_b[i] * ab; + + int t0 = dots[0] + dots[1], t1 = dots[1] + dots[2], t2 = dots[2] + dots[3]; + + ar *= 2; ag *= 2; ab *= 2; + + static const uint8_t s_sels[4] = { 3, 2, 1, 0 }; + + for (uint32_t i = 0; i < 16; i += 4) + { + const int d0 = pSrc_pixels[i+0].r * ar + pSrc_pixels[i+0].g * ag + pSrc_pixels[i+0].b * ab; + const int d1 = pSrc_pixels[i+1].r * ar + pSrc_pixels[i+1].g * ag + pSrc_pixels[i+1].b * ab; + const int d2 = pSrc_pixels[i+2].r * ar + pSrc_pixels[i+2].g * ag + pSrc_pixels[i+2].b * ab; + const int d3 = pSrc_pixels[i+3].r * ar + pSrc_pixels[i+3].g * ag + pSrc_pixels[i+3].b * ab; + + sels[i+0] = s_sels[(d0 <= t0) + (d0 < t1) + (d0 < t2)]; + sels[i+1] = s_sels[(d1 <= t0) + (d1 < t1) + (d1 < t2)]; + sels[i+2] = s_sels[(d2 <= t0) + (d2 < t1) + (d2 < t2)]; + sels[i+3] = s_sels[(d3 <= t0) + (d3 < t1) + (d3 < t2)]; + } + } + + struct vec3F { float c[3]; }; + + static bool compute_least_squares_endpoints_rgb(const color32* pColors, const uint8_t* pSelectors, vec3F* pXl, vec3F* pXh) + { + // Derived from bc7enc16's LS function. + // Least squares using normal equations: http://www.cs.cornell.edu/~bindel/class/cs3220-s12/notes/lec10.pdf + // I did this in matrix form first, expanded out all the ops, then optimized it a bit. + uint32_t uq00_r = 0, uq10_r = 0, ut_r = 0, uq00_g = 0, uq10_g = 0, ut_g = 0, uq00_b = 0, uq10_b = 0, ut_b = 0; + + // This table is: 9 * (w * w), 9 * ((1.0f - w) * w), 9 * ((1.0f - w) * (1.0f - w)) + // where w is [0,1/3,2/3,1]. 9 is the perfect multiplier. + static const uint32_t s_weight_vals[4] = { 0x000009, 0x010204, 0x040201, 0x090000 }; + + uint32_t weight_accum = 0; + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t r = pColors[i].c[0], g = pColors[i].c[1], b = pColors[i].c[2]; + const uint32_t sel = pSelectors[i]; + ut_r += r; + ut_g += g; + ut_b += b; + weight_accum += s_weight_vals[sel]; + uq00_r += sel * r; + uq00_g += sel * g; + uq00_b += sel * b; + } + + float q00_r = (float)uq00_r, q10_r = (float)uq10_r, t_r = (float)ut_r; + float q00_g = (float)uq00_g, q10_g = (float)uq10_g, t_g = (float)ut_g; + float q00_b = (float)uq00_b, q10_b = (float)uq10_b, t_b = (float)ut_b; + + q10_r = t_r * 3.0f - q00_r; + q10_g = t_g * 3.0f - q00_g; + q10_b = t_b * 3.0f - q00_b; + + float z00 = (float)((weight_accum >> 16) & 0xFF); + float z10 = (float)((weight_accum >> 8) & 0xFF); + float z11 = (float)(weight_accum & 0xFF); + float z01 = z10; + + float det = z00 * z11 - z01 * z10; + if (fabs(det) < 1e-8f) + return false; + + det = 3.0f / det; + + float iz00, iz01, iz10, iz11; + iz00 = z11 * det; + iz01 = -z01 * det; + iz10 = -z10 * det; + iz11 = z00 * det; + + pXl->c[0] = iz00 * q00_r + iz01 * q10_r; pXh->c[0] = iz10 * q00_r + iz11 * q10_r; + pXl->c[1] = iz00 * q00_g + iz01 * q10_g; pXh->c[1] = iz10 * q00_g + iz11 * q10_g; + pXl->c[2] = iz00 * q00_b + iz01 * q10_b; pXh->c[2] = iz10 * q00_b + iz11 * q10_b; + + // Check and fix channel singularities - might not be needed, but is in UASTC's encoder. + for (uint32_t c = 0; c < 3; c++) + { + if ((pXl->c[c] < 0.0f) || (pXh->c[c] > 255.0f)) + { + uint32_t lo_v = UINT32_MAX, hi_v = 0; + for (uint32_t i = 0; i < 16; i++) + { + lo_v = basisu::minimumu(lo_v, pColors[i].c[c]); + hi_v = basisu::maximumu(hi_v, pColors[i].c[c]); + } + + if (lo_v == hi_v) + { + pXl->c[c] = (float)lo_v; + pXh->c[c] = (float)hi_v; + } + } + } + + return true; + } + + void encode_bc1_solid_block(void* pDst, uint32_t fr, uint32_t fg, uint32_t fb) + { + dxt1_block* pDst_block = static_cast(pDst); + + uint32_t mask = 0xAA; + uint32_t max16 = (g_bc1_match5_equals_1[fr].m_hi << 11) | (g_bc1_match6_equals_1[fg].m_hi << 5) | g_bc1_match5_equals_1[fb].m_hi; + uint32_t min16 = (g_bc1_match5_equals_1[fr].m_lo << 11) | (g_bc1_match6_equals_1[fg].m_lo << 5) | g_bc1_match5_equals_1[fb].m_lo; + + if (min16 == max16) + { + // Always forbid 3 color blocks + // This is to guarantee that BC3 blocks never use punchthrough alpha (3 color) mode, which isn't supported on some (all?) GPU's. + mask = 0; + + // Make l > h + if (min16 > 0) + min16--; + else + { + // l = h = 0 + assert(min16 == max16 && max16 == 0); + + max16 = 1; + min16 = 0; + mask = 0x55; + } + + assert(max16 > min16); + } + + if (max16 < min16) + { + std::swap(max16, min16); + mask ^= 0x55; + } + + pDst_block->set_low_color(static_cast(max16)); + pDst_block->set_high_color(static_cast(min16)); + pDst_block->m_selectors[0] = static_cast(mask); + pDst_block->m_selectors[1] = static_cast(mask); + pDst_block->m_selectors[2] = static_cast(mask); + pDst_block->m_selectors[3] = static_cast(mask); + } + + static inline uint8_t to_5(uint32_t v) { v = v * 31 + 128; return (uint8_t)((v + (v >> 8)) >> 8); } + static inline uint8_t to_6(uint32_t v) { v = v * 63 + 128; return (uint8_t)((v + (v >> 8)) >> 8); } + + // Good references: squish library, stb_dxt. + void encode_bc1(void* pDst, const uint8_t* pPixels, uint32_t flags) + { + const color32* pSrc_pixels = (const color32*)pPixels; + dxt1_block* pDst_block = static_cast(pDst); + + int avg_r = -1, avg_g = 0, avg_b = 0; + int lr = 0, lg = 0, lb = 0, hr = 0, hg = 0, hb = 0; + uint8_t sels[16]; + + const bool use_sels = (flags & cEncodeBC1UseSelectors) != 0; + if (use_sels) + { + // Caller is jamming in their own selectors for us to try. + const uint32_t s = pDst_block->m_selectors[0] | (pDst_block->m_selectors[1] << 8) | (pDst_block->m_selectors[2] << 16) | (pDst_block->m_selectors[3] << 24); + + static const uint8_t s_sel_tran[4] = { 0, 3, 1, 2 }; + + for (uint32_t i = 0; i < 16; i++) + sels[i] = s_sel_tran[(s >> (i * 2)) & 3]; + } + else + { + const uint32_t fr = pSrc_pixels[0].r, fg = pSrc_pixels[0].g, fb = pSrc_pixels[0].b; + + uint32_t j; + for (j = 1; j < 16; j++) + if ((pSrc_pixels[j].r != fr) || (pSrc_pixels[j].g != fg) || (pSrc_pixels[j].b != fb)) + break; + + if (j == 16) + { + encode_bc1_solid_block(pDst, fr, fg, fb); + return; + } + + // Select 2 colors along the principle axis. (There must be a faster/simpler way.) + int total_r = fr, total_g = fg, total_b = fb; + int max_r = fr, max_g = fg, max_b = fb; + int min_r = fr, min_g = fg, min_b = fb; + for (uint32_t i = 1; i < 16; i++) + { + const int r = pSrc_pixels[i].r, g = pSrc_pixels[i].g, b = pSrc_pixels[i].b; + max_r = basisu::maximum(max_r, r); max_g = basisu::maximum(max_g, g); max_b = basisu::maximum(max_b, b); + min_r = basisu::minimum(min_r, r); min_g = basisu::minimum(min_g, g); min_b = basisu::minimum(min_b, b); + total_r += r; total_g += g; total_b += b; + } + + avg_r = (total_r + 8) >> 4; + avg_g = (total_g + 8) >> 4; + avg_b = (total_b + 8) >> 4; + + int icov[6] = { 0, 0, 0, 0, 0, 0 }; + for (uint32_t i = 0; i < 16; i++) + { + int r = (int)pSrc_pixels[i].r - avg_r; + int g = (int)pSrc_pixels[i].g - avg_g; + int b = (int)pSrc_pixels[i].b - avg_b; + icov[0] += r * r; + icov[1] += r * g; + icov[2] += r * b; + icov[3] += g * g; + icov[4] += g * b; + icov[5] += b * b; + } + + float cov[6]; + for (uint32_t i = 0; i < 6; i++) + cov[i] = static_cast(icov[i])* (1.0f / 255.0f); + +#if 0 + // Seems silly to use full PCA to choose 2 colors. The diff in avg. PSNR between using PCA vs. not is small (~.025 difference). + // TODO: Try 2 or 3 different normalized diagonal vectors, choose the one that results in the largest dot delta + int saxis_r = max_r - min_r; + int saxis_g = max_g - min_g; + int saxis_b = max_b - min_b; +#else + float xr = (float)(max_r - min_r); + float xg = (float)(max_g - min_g); + float xb = (float)(max_b - min_b); + //float xr = (float)(max_r - avg_r); // max-avg is nearly the same, and doesn't require computing min's + //float xg = (float)(max_g - avg_g); + //float xb = (float)(max_b - avg_b); + for (uint32_t power_iter = 0; power_iter < 4; power_iter++) + { + float r = xr * cov[0] + xg * cov[1] + xb * cov[2]; + float g = xr * cov[1] + xg * cov[3] + xb * cov[4]; + float b = xr * cov[2] + xg * cov[4] + xb * cov[5]; + xr = r; xg = g; xb = b; + } + + float k = basisu::maximum(fabsf(xr), fabsf(xg), fabsf(xb)); + int saxis_r = 306, saxis_g = 601, saxis_b = 117; + if (k >= 2) + { + float m = 1024.0f / k; + saxis_r = (int)(xr * m); + saxis_g = (int)(xg * m); + saxis_b = (int)(xb * m); + } +#endif + + int low_dot = INT_MAX, high_dot = INT_MIN, low_c = 0, high_c = 0; + for (uint32_t i = 0; i < 16; i++) + { + int dot = pSrc_pixels[i].r * saxis_r + pSrc_pixels[i].g * saxis_g + pSrc_pixels[i].b * saxis_b; + if (dot < low_dot) + { + low_dot = dot; + low_c = i; + } + if (dot > high_dot) + { + high_dot = dot; + high_c = i; + } + } + + lr = to_5(pSrc_pixels[low_c].r); + lg = to_6(pSrc_pixels[low_c].g); + lb = to_5(pSrc_pixels[low_c].b); + + hr = to_5(pSrc_pixels[high_c].r); + hg = to_6(pSrc_pixels[high_c].g); + hb = to_5(pSrc_pixels[high_c].b); + + bc1_find_sels(pSrc_pixels, lr, lg, lb, hr, hg, hb, sels); + } // if (use_sels) + + const uint32_t total_ls_passes = (flags & cEncodeBC1HigherQuality) ? 3 : (flags & cEncodeBC1HighQuality ? 2 : 1); + for (uint32_t ls_pass = 0; ls_pass < total_ls_passes; ls_pass++) + { + // This is where the real magic happens. We have an array of candidate selectors, so let's use least squares to compute the optimal low/high endpoint colors. + vec3F xl, xh; + if (!compute_least_squares_endpoints_rgb(pSrc_pixels, sels, &xl, &xh)) + { + if (avg_r < 0) + { + int total_r = 0, total_g = 0, total_b = 0; + for (uint32_t i = 0; i < 16; i++) + { + total_r += pSrc_pixels[i].r; + total_g += pSrc_pixels[i].g; + total_b += pSrc_pixels[i].b; + } + + avg_r = (total_r + 8) >> 4; + avg_g = (total_g + 8) >> 4; + avg_b = (total_b + 8) >> 4; + } + + // All selectors equal - treat it as a solid block which should always be equal or better. + lr = g_bc1_match5_equals_1[avg_r].m_hi; + lg = g_bc1_match6_equals_1[avg_g].m_hi; + lb = g_bc1_match5_equals_1[avg_b].m_hi; + + hr = g_bc1_match5_equals_1[avg_r].m_lo; + hg = g_bc1_match6_equals_1[avg_g].m_lo; + hb = g_bc1_match5_equals_1[avg_b].m_lo; + + // In high/higher quality mode, let it try again in case the optimal tables have caused the sels to diverge. + } + else + { + lr = basisu::clamp((int)((xl.c[0]) * (31.0f / 255.0f) + .5f), 0, 31); + lg = basisu::clamp((int)((xl.c[1]) * (63.0f / 255.0f) + .5f), 0, 63); + lb = basisu::clamp((int)((xl.c[2]) * (31.0f / 255.0f) + .5f), 0, 31); + + hr = basisu::clamp((int)((xh.c[0]) * (31.0f / 255.0f) + .5f), 0, 31); + hg = basisu::clamp((int)((xh.c[1]) * (63.0f / 255.0f) + .5f), 0, 63); + hb = basisu::clamp((int)((xh.c[2]) * (31.0f / 255.0f) + .5f), 0, 31); + } + + bc1_find_sels(pSrc_pixels, lr, lg, lb, hr, hg, hb, sels); + } + + uint32_t lc16 = dxt1_block::pack_unscaled_color(lr, lg, lb); + uint32_t hc16 = dxt1_block::pack_unscaled_color(hr, hg, hb); + + // Always forbid 3 color blocks + if (lc16 == hc16) + { + uint8_t mask = 0; + + // Make l > h + if (hc16 > 0) + hc16--; + else + { + // lc16 = hc16 = 0 + assert(lc16 == hc16 && hc16 == 0); + + hc16 = 0; + lc16 = 1; + mask = 0x55; // select hc16 + } + + assert(lc16 > hc16); + pDst_block->set_low_color(static_cast(lc16)); + pDst_block->set_high_color(static_cast(hc16)); + + pDst_block->m_selectors[0] = mask; + pDst_block->m_selectors[1] = mask; + pDst_block->m_selectors[2] = mask; + pDst_block->m_selectors[3] = mask; + } + else + { + uint8_t invert_mask = 0; + if (lc16 < hc16) + { + std::swap(lc16, hc16); + invert_mask = 0x55; + } + + assert(lc16 > hc16); + pDst_block->set_low_color((uint16_t)lc16); + pDst_block->set_high_color((uint16_t)hc16); + + uint32_t packed_sels = 0; + static const uint8_t s_sel_trans[4] = { 0, 2, 3, 1 }; + for (uint32_t i = 0; i < 16; i++) + packed_sels |= ((uint32_t)s_sel_trans[sels[i]] << (i * 2)); + + pDst_block->m_selectors[0] = (uint8_t)packed_sels ^ invert_mask; + pDst_block->m_selectors[1] = (uint8_t)(packed_sels >> 8) ^ invert_mask; + pDst_block->m_selectors[2] = (uint8_t)(packed_sels >> 16) ^ invert_mask; + pDst_block->m_selectors[3] = (uint8_t)(packed_sels >> 24) ^ invert_mask; + } + } + + void encode_bc1_alt(void* pDst, const uint8_t* pPixels, uint32_t flags) + { + const color32* pSrc_pixels = (const color32*)pPixels; + dxt1_block* pDst_block = static_cast(pDst); + + int avg_r = -1, avg_g = 0, avg_b = 0; + int lr = 0, lg = 0, lb = 0, hr = 0, hg = 0, hb = 0; + uint8_t sels[16]; + + const bool use_sels = (flags & cEncodeBC1UseSelectors) != 0; + if (use_sels) + { + // Caller is jamming in their own selectors for us to try. + const uint32_t s = pDst_block->m_selectors[0] | (pDst_block->m_selectors[1] << 8) | (pDst_block->m_selectors[2] << 16) | (pDst_block->m_selectors[3] << 24); + + static const uint8_t s_sel_tran[4] = { 0, 3, 1, 2 }; + + for (uint32_t i = 0; i < 16; i++) + sels[i] = s_sel_tran[(s >> (i * 2)) & 3]; + } + else + { + const uint32_t fr = pSrc_pixels[0].r, fg = pSrc_pixels[0].g, fb = pSrc_pixels[0].b; + + uint32_t j; + for (j = 1; j < 16; j++) + if ((pSrc_pixels[j].r != fr) || (pSrc_pixels[j].g != fg) || (pSrc_pixels[j].b != fb)) + break; + + if (j == 16) + { + encode_bc1_solid_block(pDst, fr, fg, fb); + return; + } + + // Select 2 colors along the principle axis. (There must be a faster/simpler way.) + int total_r = fr, total_g = fg, total_b = fb; + int max_r = fr, max_g = fg, max_b = fb; + int min_r = fr, min_g = fg, min_b = fb; + uint32_t grayscale_flag = (fr == fg) && (fr == fb); + for (uint32_t i = 1; i < 16; i++) + { + const int r = pSrc_pixels[i].r, g = pSrc_pixels[i].g, b = pSrc_pixels[i].b; + grayscale_flag &= ((r == g) && (r == b)); + max_r = basisu::maximum(max_r, r); max_g = basisu::maximum(max_g, g); max_b = basisu::maximum(max_b, b); + min_r = basisu::minimum(min_r, r); min_g = basisu::minimum(min_g, g); min_b = basisu::minimum(min_b, b); + total_r += r; total_g += g; total_b += b; + } + + if (grayscale_flag) + { + // Grayscale blocks are a common enough case to specialize. + if ((max_r - min_r) < 2) + { + lr = lb = hr = hb = to_5(fr); + lg = hg = to_6(fr); + } + else + { + lr = lb = to_5(min_r); + lg = to_6(min_r); + + hr = hb = to_5(max_r); + hg = to_6(max_r); + } + } + else + { + avg_r = (total_r + 8) >> 4; + avg_g = (total_g + 8) >> 4; + avg_b = (total_b + 8) >> 4; + + // Find the shortest vector from a AABB corner to the block's average color. + // This is to help avoid outliers. + + uint32_t dist[3][2]; + dist[0][0] = basisu::square(min_r - avg_r) << 3; dist[0][1] = basisu::square(max_r - avg_r) << 3; + dist[1][0] = basisu::square(min_g - avg_g) << 3; dist[1][1] = basisu::square(max_g - avg_g) << 3; + dist[2][0] = basisu::square(min_b - avg_b) << 3; dist[2][1] = basisu::square(max_b - avg_b) << 3; + + uint32_t min_d0 = (dist[0][0] + dist[1][0] + dist[2][0]); + uint32_t d4 = (dist[0][0] + dist[1][0] + dist[2][1]) | 4; + min_d0 = basisu::minimum(min_d0, d4); + + uint32_t min_d1 = (dist[0][1] + dist[1][0] + dist[2][0]) | 1; + uint32_t d5 = (dist[0][1] + dist[1][0] + dist[2][1]) | 5; + min_d1 = basisu::minimum(min_d1, d5); + + uint32_t d2 = (dist[0][0] + dist[1][1] + dist[2][0]) | 2; + min_d0 = basisu::minimum(min_d0, d2); + + uint32_t d3 = (dist[0][1] + dist[1][1] + dist[2][0]) | 3; + min_d1 = basisu::minimum(min_d1, d3); + + uint32_t d6 = (dist[0][0] + dist[1][1] + dist[2][1]) | 6; + min_d0 = basisu::minimum(min_d0, d6); + + uint32_t d7 = (dist[0][1] + dist[1][1] + dist[2][1]) | 7; + min_d1 = basisu::minimum(min_d1, d7); + + uint32_t min_d = basisu::minimum(min_d0, min_d1); + uint32_t best_i = min_d & 7; + + int delta_r = (best_i & 1) ? (max_r - avg_r) : (avg_r - min_r); + int delta_g = (best_i & 2) ? (max_g - avg_g) : (avg_g - min_g); + int delta_b = (best_i & 4) ? (max_b - avg_b) : (avg_b - min_b); + + // Note: if delta_r/g/b==0, we actually want to choose a single color, so the block average color optimization kicks in. + uint32_t low_c = 0, high_c = 0; + if ((delta_r | delta_g | delta_b) != 0) + { + // Now we have a smaller AABB going from the block's average color to a cornerpoint of the larger AABB. + // Project all pixels colors along the 4 vectors going from a smaller AABB cornerpoint to the opposite cornerpoint, find largest projection. + // One of these vectors will be a decent approximation of the block's PCA. + const int saxis0_r = delta_r, saxis0_g = delta_g, saxis0_b = delta_b; + + int low_dot0 = INT_MAX, high_dot0 = INT_MIN; + int low_dot1 = INT_MAX, high_dot1 = INT_MIN; + int low_dot2 = INT_MAX, high_dot2 = INT_MIN; + int low_dot3 = INT_MAX, high_dot3 = INT_MIN; + + //int low_c0, low_c1, low_c2, low_c3; + //int high_c0, high_c1, high_c2, high_c3; + + for (uint32_t i = 0; i < 16; i++) + { + const int dotx = pSrc_pixels[i].r * saxis0_r; + const int doty = pSrc_pixels[i].g * saxis0_g; + const int dotz = pSrc_pixels[i].b * saxis0_b; + + const int dot0 = ((dotz + dotx + doty) << 4) + i; + const int dot1 = ((dotz - dotx - doty) << 4) + i; + const int dot2 = ((dotz - dotx + doty) << 4) + i; + const int dot3 = ((dotz + dotx - doty) << 4) + i; + + if (dot0 < low_dot0) + { + low_dot0 = dot0; + //low_c0 = i; + } + if ((dot0 ^ 15) > high_dot0) + { + high_dot0 = dot0 ^ 15; + //high_c0 = i; + } + + if (dot1 < low_dot1) + { + low_dot1 = dot1; + //low_c1 = i; + } + if ((dot1 ^ 15) > high_dot1) + { + high_dot1 = dot1 ^ 15; + //high_c1 = i; + } + + if (dot2 < low_dot2) + { + low_dot2 = dot2; + //low_c2 = i; + } + if ((dot2 ^ 15) > high_dot2) + { + high_dot2 = dot2 ^ 15; + //high_c2 = i; + } + + if (dot3 < low_dot3) + { + low_dot3 = dot3; + //low_c3 = i; + } + if ((dot3 ^ 15) > high_dot3) + { + high_dot3 = dot3 ^ 15; + //high_c3 = i; + } + } + + low_c = low_dot0 & 15; + high_c = ~high_dot0 & 15; + uint32_t r = (high_dot0 & ~15) - (low_dot0 & ~15); + + uint32_t tr = (high_dot1 & ~15) - (low_dot1 & ~15); + if (tr > r) { + low_c = low_dot1 & 15; + high_c = ~high_dot1 & 15; + r = tr; + } + + tr = (high_dot2 & ~15) - (low_dot2 & ~15); + if (tr > r) { + low_c = low_dot2 & 15; + high_c = ~high_dot2 & 15; + r = tr; + } + + tr = (high_dot3 & ~15) - (low_dot3 & ~15); + if (tr > r) { + low_c = low_dot3 & 15; + high_c = ~high_dot3 & 15; + } + } + + lr = to_5(pSrc_pixels[low_c].r); + lg = to_6(pSrc_pixels[low_c].g); + lb = to_5(pSrc_pixels[low_c].b); + + hr = to_5(pSrc_pixels[high_c].r); + hg = to_6(pSrc_pixels[high_c].g); + hb = to_5(pSrc_pixels[high_c].b); + } + + bc1_find_sels_2(pSrc_pixels, lr, lg, lb, hr, hg, hb, sels); + } // if (use_sels) + + const uint32_t total_ls_passes = (flags & cEncodeBC1HigherQuality) ? 3 : (flags & cEncodeBC1HighQuality ? 2 : 1); + for (uint32_t ls_pass = 0; ls_pass < total_ls_passes; ls_pass++) + { + int prev_lr = lr, prev_lg = lg, prev_lb = lb, prev_hr = hr, prev_hg = hg, prev_hb = hb; + + // This is where the real magic happens. We have an array of candidate selectors, so let's use least squares to compute the optimal low/high endpoint colors. + vec3F xl, xh; + if (!compute_least_squares_endpoints_rgb(pSrc_pixels, sels, &xl, &xh)) + { + if (avg_r < 0) + { + int total_r = 0, total_g = 0, total_b = 0; + for (uint32_t i = 0; i < 16; i++) + { + total_r += pSrc_pixels[i].r; + total_g += pSrc_pixels[i].g; + total_b += pSrc_pixels[i].b; + } + + avg_r = (total_r + 8) >> 4; + avg_g = (total_g + 8) >> 4; + avg_b = (total_b + 8) >> 4; + } + + // All selectors equal - treat it as a solid block which should always be equal or better. + lr = g_bc1_match5_equals_1[avg_r].m_hi; + lg = g_bc1_match6_equals_1[avg_g].m_hi; + lb = g_bc1_match5_equals_1[avg_b].m_hi; + + hr = g_bc1_match5_equals_1[avg_r].m_lo; + hg = g_bc1_match6_equals_1[avg_g].m_lo; + hb = g_bc1_match5_equals_1[avg_b].m_lo; + + // In high/higher quality mode, let it try again in case the optimal tables have caused the sels to diverge. + } + else + { + lr = basisu::clamp((int)((xl.c[0]) * (31.0f / 255.0f) + .5f), 0, 31); + lg = basisu::clamp((int)((xl.c[1]) * (63.0f / 255.0f) + .5f), 0, 63); + lb = basisu::clamp((int)((xl.c[2]) * (31.0f / 255.0f) + .5f), 0, 31); + + hr = basisu::clamp((int)((xh.c[0]) * (31.0f / 255.0f) + .5f), 0, 31); + hg = basisu::clamp((int)((xh.c[1]) * (63.0f / 255.0f) + .5f), 0, 63); + hb = basisu::clamp((int)((xh.c[2]) * (31.0f / 255.0f) + .5f), 0, 31); + } + + if ((prev_lr == lr) && (prev_lg == lg) && (prev_lb == lb) && (prev_hr == hr) && (prev_hg == hg) && (prev_hb == hb)) + break; + + bc1_find_sels_2(pSrc_pixels, lr, lg, lb, hr, hg, hb, sels); + } + + uint32_t lc16 = dxt1_block::pack_unscaled_color(lr, lg, lb); + uint32_t hc16 = dxt1_block::pack_unscaled_color(hr, hg, hb); + + // Always forbid 3 color blocks + if (lc16 == hc16) + { + uint8_t mask = 0; + + // Make l > h + if (hc16 > 0) + hc16--; + else + { + // lc16 = hc16 = 0 + assert(lc16 == hc16 && hc16 == 0); + + hc16 = 0; + lc16 = 1; + mask = 0x55; // select hc16 + } + + assert(lc16 > hc16); + pDst_block->set_low_color(static_cast(lc16)); + pDst_block->set_high_color(static_cast(hc16)); + + pDst_block->m_selectors[0] = mask; + pDst_block->m_selectors[1] = mask; + pDst_block->m_selectors[2] = mask; + pDst_block->m_selectors[3] = mask; + } + else + { + uint8_t invert_mask = 0; + if (lc16 < hc16) + { + std::swap(lc16, hc16); + invert_mask = 0x55; + } + + assert(lc16 > hc16); + pDst_block->set_low_color((uint16_t)lc16); + pDst_block->set_high_color((uint16_t)hc16); + + uint32_t packed_sels = 0; + static const uint8_t s_sel_trans[4] = { 0, 2, 3, 1 }; + for (uint32_t i = 0; i < 16; i++) + packed_sels |= ((uint32_t)s_sel_trans[sels[i]] << (i * 2)); + + pDst_block->m_selectors[0] = (uint8_t)packed_sels ^ invert_mask; + pDst_block->m_selectors[1] = (uint8_t)(packed_sels >> 8) ^ invert_mask; + pDst_block->m_selectors[2] = (uint8_t)(packed_sels >> 16) ^ invert_mask; + pDst_block->m_selectors[3] = (uint8_t)(packed_sels >> 24) ^ invert_mask; + } + } + + // Scale the UASTC first subset endpoints and first plane's weight indices directly to BC1's - fastest. + void transcode_uastc_to_bc1_hint0(const unpacked_uastc_block& unpacked_src_blk, void* pDst) + { + const uint32_t mode = unpacked_src_blk.m_mode; + const astc_block_desc& astc_blk = unpacked_src_blk.m_astc; + + dxt1_block& b = *static_cast(pDst); + + const uint32_t endpoint_range = g_uastc_mode_endpoint_ranges[mode]; + + const uint32_t total_comps = g_uastc_mode_comps[mode]; + + if (total_comps == 2) + { + const uint32_t l = g_astc_unquant[endpoint_range][astc_blk.m_endpoints[0]].m_unquant; + const uint32_t h = g_astc_unquant[endpoint_range][astc_blk.m_endpoints[1]].m_unquant; + + b.set_low_color(dxt1_block::pack_color(color32(l, l, l, 255), true, 127)); + b.set_high_color(dxt1_block::pack_color(color32(h, h, h, 255), true, 127)); + } + else + { + b.set_low_color(dxt1_block::pack_color( + color32(g_astc_unquant[endpoint_range][astc_blk.m_endpoints[0]].m_unquant, + g_astc_unquant[endpoint_range][astc_blk.m_endpoints[2]].m_unquant, + g_astc_unquant[endpoint_range][astc_blk.m_endpoints[4]].m_unquant, + 255), true, 127) + ); + + b.set_high_color(dxt1_block::pack_color( + color32(g_astc_unquant[endpoint_range][astc_blk.m_endpoints[1]].m_unquant, + g_astc_unquant[endpoint_range][astc_blk.m_endpoints[3]].m_unquant, + g_astc_unquant[endpoint_range][astc_blk.m_endpoints[5]].m_unquant, + 255), true, 127) + ); + } + + if (b.get_low_color() == b.get_high_color()) + { + // Always forbid 3 color blocks + uint16_t lc16 = (uint16_t)b.get_low_color(); + uint16_t hc16 = (uint16_t)b.get_high_color(); + + uint8_t mask = 0; + + // Make l > h + if (hc16 > 0) + hc16--; + else + { + // lc16 = hc16 = 0 + assert(lc16 == hc16 && hc16 == 0); + + hc16 = 0; + lc16 = 1; + mask = 0x55; // select hc16 + } + + assert(lc16 > hc16); + b.set_low_color(static_cast(lc16)); + b.set_high_color(static_cast(hc16)); + + b.m_selectors[0] = mask; + b.m_selectors[1] = mask; + b.m_selectors[2] = mask; + b.m_selectors[3] = mask; + } + else + { + bool invert = false; + if (b.get_low_color() < b.get_high_color()) + { + std::swap(b.m_low_color[0], b.m_high_color[0]); + std::swap(b.m_low_color[1], b.m_high_color[1]); + invert = true; + } + + const uint8_t* pTran = s_uastc_to_bc1_weights[g_uastc_mode_weight_bits[mode]]; + + const uint32_t plane_shift = g_uastc_mode_planes[mode] - 1; + + uint32_t sels = 0; + for (int i = 15; i >= 0; --i) + { + uint32_t s = pTran[astc_blk.m_weights[i << plane_shift]]; + + if (invert) + s ^= 1; + + sels = (sels << 2) | s; + } + b.m_selectors[0] = sels & 0xFF; + b.m_selectors[1] = (sels >> 8) & 0xFF; + b.m_selectors[2] = (sels >> 16) & 0xFF; + b.m_selectors[3] = (sels >> 24) & 0xFF; + } + } + + // Scale the UASTC first plane's weight indices to BC1, use 1 or 2 least squares passes to compute endpoints - no PCA needed. + void transcode_uastc_to_bc1_hint1(const unpacked_uastc_block& unpacked_src_blk, const color32 block_pixels[4][4], void* pDst, bool high_quality) + { + const uint32_t mode = unpacked_src_blk.m_mode; + + const astc_block_desc& astc_blk = unpacked_src_blk.m_astc; + + dxt1_block& b = *static_cast(pDst); + + b.set_low_color(1); + b.set_high_color(0); + + const uint8_t* pTran = s_uastc_to_bc1_weights[g_uastc_mode_weight_bits[mode]]; + + const uint32_t plane_shift = g_uastc_mode_planes[mode] - 1; + + uint32_t sels = 0; + for (int i = 15; i >= 0; --i) + { + sels <<= 2; + sels |= pTran[astc_blk.m_weights[i << plane_shift]]; + } + + b.m_selectors[0] = sels & 0xFF; + b.m_selectors[1] = (sels >> 8) & 0xFF; + b.m_selectors[2] = (sels >> 16) & 0xFF; + b.m_selectors[3] = (sels >> 24) & 0xFF; + + encode_bc1(&b, (const uint8_t*)&block_pixels[0][0].c[0], (high_quality ? cEncodeBC1HighQuality : 0) | cEncodeBC1UseSelectors); + } + + bool transcode_uastc_to_bc1(const uastc_block& src_blk, void* pDst, bool high_quality) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + const uint32_t mode = unpacked_src_blk.m_mode; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + encode_bc1_solid_block(pDst, unpacked_src_blk.m_solid_color.r, unpacked_src_blk.m_solid_color.g, unpacked_src_blk.m_solid_color.b); + return true; + } + + if ((!high_quality) && (unpacked_src_blk.m_bc1_hint0)) + transcode_uastc_to_bc1_hint0(unpacked_src_blk, pDst); + else + { + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + if (unpacked_src_blk.m_bc1_hint1) + transcode_uastc_to_bc1_hint1(unpacked_src_blk, block_pixels, pDst, high_quality); + else + encode_bc1(pDst, &block_pixels[0][0].r, high_quality ? cEncodeBC1HighQuality : 0); + } + + return true; + } + + static void write_bc4_solid_block(uint8_t* pDst, uint32_t a) + { + pDst[0] = (uint8_t)a; + pDst[1] = (uint8_t)a; + memset(pDst + 2, 0, 6); + } + + bool transcode_uastc_to_bc3(const uastc_block& src_blk, void* pDst, bool high_quality) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + const uint32_t mode = unpacked_src_blk.m_mode; + + void* pBC4_block = pDst; + dxt1_block* pBC1_block = &static_cast(pDst)[1]; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + write_bc4_solid_block(static_cast(pBC4_block), unpacked_src_blk.m_solid_color.a); + encode_bc1_solid_block(pBC1_block, unpacked_src_blk.m_solid_color.r, unpacked_src_blk.m_solid_color.g, unpacked_src_blk.m_solid_color.b); + return true; + } + + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + basist::encode_bc4(pBC4_block, &block_pixels[0][0].a, sizeof(color32)); + + if ((!high_quality) && (unpacked_src_blk.m_bc1_hint0)) + transcode_uastc_to_bc1_hint0(unpacked_src_blk, pBC1_block); + else + { + if (unpacked_src_blk.m_bc1_hint1) + transcode_uastc_to_bc1_hint1(unpacked_src_blk, block_pixels, pBC1_block, high_quality); + else + encode_bc1(pBC1_block, &block_pixels[0][0].r, high_quality ? cEncodeBC1HighQuality : 0); + } + + return true; + } + + bool transcode_uastc_to_bc4(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0) + { + BASISU_NOTE_UNUSED(high_quality); + + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + const uint32_t mode = unpacked_src_blk.m_mode; + + void* pBC4_block = pDst; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + write_bc4_solid_block(static_cast(pBC4_block), unpacked_src_blk.m_solid_color.c[chan0]); + return true; + } + + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + basist::encode_bc4(pBC4_block, &block_pixels[0][0].c[chan0], sizeof(color32)); + + return true; + } + + bool transcode_uastc_to_bc5(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0, uint32_t chan1) + { + BASISU_NOTE_UNUSED(high_quality); + + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + const uint32_t mode = unpacked_src_blk.m_mode; + + void* pBC4_block0 = pDst; + void* pBC4_block1 = (uint8_t*)pDst + 8; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + write_bc4_solid_block(static_cast(pBC4_block0), unpacked_src_blk.m_solid_color.c[chan0]); + write_bc4_solid_block(static_cast(pBC4_block1), unpacked_src_blk.m_solid_color.c[chan1]); + return true; + } + + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + basist::encode_bc4(pBC4_block0, &block_pixels[0][0].c[chan0], sizeof(color32)); + basist::encode_bc4(pBC4_block1, &block_pixels[0][0].c[chan1], sizeof(color32)); + + return true; + } + + static const uint8_t s_etc2_eac_bit_ofs[16] = { 45, 33, 21, 9, 42, 30, 18, 6, 39, 27, 15, 3, 36, 24, 12, 0 }; + + static void pack_eac_solid_block(eac_block& blk, uint32_t a) + { + blk.m_base = static_cast(a); + blk.m_table = 13; + blk.m_multiplier = 0; + + memcpy(blk.m_selectors, g_etc2_eac_a8_sel4, sizeof(g_etc2_eac_a8_sel4)); + + return; + } + + // Only checks 4 tables. + static void pack_eac(eac_block& blk, const uint8_t* pPixels, uint32_t stride) + { + uint32_t min_alpha = 255, max_alpha = 0; + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t a = pPixels[i * stride]; + if (a < min_alpha) min_alpha = a; + if (a > max_alpha) max_alpha = a; + } + + if (min_alpha == max_alpha) + { + pack_eac_solid_block(blk, min_alpha); + return; + } + + const uint32_t alpha_range = max_alpha - min_alpha; + + const uint32_t SINGLE_TABLE_THRESH = 5; + if (alpha_range <= SINGLE_TABLE_THRESH) + { + // If alpha_range <= 5 table 13 is lossless + int base = clamp255((int)max_alpha - 2); + + blk.m_base = base; + blk.m_multiplier = 1; + blk.m_table = 13; + + base -= 3; + + uint64_t packed_sels = 0; + for (uint32_t i = 0; i < 16; i++) + { + const int a = pPixels[i * stride]; + + static const uint8_t s_sels[6] = { 2, 1, 0, 4, 5, 6 }; + + int sel = a - base; + assert(sel >= 0 && sel <= 5); + + packed_sels |= (static_cast(s_sels[sel]) << s_etc2_eac_bit_ofs[i]); + } + + blk.set_selector_bits(packed_sels); + + return; + } + + const uint32_t T0 = 2, T1 = 8, T2 = 11, T3 = 13; + static const uint8_t s_tables[4] = { T0, T1, T2, T3 }; + + int base[4], mul[4]; + uint32_t mul_or = 0; + for (uint32_t i = 0; i < 4; i++) + { + const uint32_t table = s_tables[i]; + + const float range = (float)(g_eac_modifier_table[table][ETC2_EAC_MAX_VALUE_SELECTOR] - g_eac_modifier_table[table][ETC2_EAC_MIN_VALUE_SELECTOR]); + + base[i] = clamp255((int)roundf(basisu::lerp((float)min_alpha, (float)max_alpha, (float)(0 - g_eac_modifier_table[table][ETC2_EAC_MIN_VALUE_SELECTOR]) / range))); + mul[i] = clampi((int)roundf(alpha_range / range), 1, 15); + mul_or |= mul[i]; + } + + uint32_t total_err[4] = { 0, 0, 0, 0 }; + uint8_t sels[4][16]; + + for (uint32_t i = 0; i < 16; i++) + { + const int a = pPixels[i * stride]; + + uint32_t l0 = UINT32_MAX, l1 = UINT32_MAX, l2 = UINT32_MAX, l3 = UINT32_MAX; + + if ((a < 7) || (a > (255 - 7))) + { + for (uint32_t s = 0; s < 8; s++) + { + const int v0 = clamp255(mul[0] * g_eac_modifier_table[T0][s] + base[0]); + const int v1 = clamp255(mul[1] * g_eac_modifier_table[T1][s] + base[1]); + const int v2 = clamp255(mul[2] * g_eac_modifier_table[T2][s] + base[2]); + const int v3 = clamp255(mul[3] * g_eac_modifier_table[T3][s] + base[3]); + + l0 = basisu::minimum(l0, (basisu::iabs(v0 - a) << 3) | s); + l1 = basisu::minimum(l1, (basisu::iabs(v1 - a) << 3) | s); + l2 = basisu::minimum(l2, (basisu::iabs(v2 - a) << 3) | s); + l3 = basisu::minimum(l3, (basisu::iabs(v3 - a) << 3) | s); + } + } + else if (mul_or == 1) + { + const int a0 = base[0] - a, a1 = base[1] - a, a2 = base[2] - a, a3 = base[3] - a; + + for (uint32_t s = 0; s < 8; s++) + { + const int v0 = g_eac_modifier_table[T0][s] + a0; + const int v1 = g_eac_modifier_table[T1][s] + a1; + const int v2 = g_eac_modifier_table[T2][s] + a2; + const int v3 = g_eac_modifier_table[T3][s] + a3; + + l0 = basisu::minimum(l0, (basisu::iabs(v0) << 3) | s); + l1 = basisu::minimum(l1, (basisu::iabs(v1) << 3) | s); + l2 = basisu::minimum(l2, (basisu::iabs(v2) << 3) | s); + l3 = basisu::minimum(l3, (basisu::iabs(v3) << 3) | s); + } + } + else + { + const int a0 = base[0] - a, a1 = base[1] - a, a2 = base[2] - a, a3 = base[3] - a; + + for (uint32_t s = 0; s < 8; s++) + { + const int v0 = mul[0] * g_eac_modifier_table[T0][s] + a0; + const int v1 = mul[1] * g_eac_modifier_table[T1][s] + a1; + const int v2 = mul[2] * g_eac_modifier_table[T2][s] + a2; + const int v3 = mul[3] * g_eac_modifier_table[T3][s] + a3; + + l0 = basisu::minimum(l0, (basisu::iabs(v0) << 3) | s); + l1 = basisu::minimum(l1, (basisu::iabs(v1) << 3) | s); + l2 = basisu::minimum(l2, (basisu::iabs(v2) << 3) | s); + l3 = basisu::minimum(l3, (basisu::iabs(v3) << 3) | s); + } + } + + sels[0][i] = l0 & 7; + sels[1][i] = l1 & 7; + sels[2][i] = l2 & 7; + sels[3][i] = l3 & 7; + + total_err[0] += basisu::square(l0 >> 3); + total_err[1] += basisu::square(l1 >> 3); + total_err[2] += basisu::square(l2 >> 3); + total_err[3] += basisu::square(l3 >> 3); + } + + uint32_t min_err = total_err[0], min_index = 0; + for (uint32_t i = 1; i < 4; i++) + { + if (total_err[i] < min_err) + { + min_err = total_err[i]; + min_index = i; + } + } + + blk.m_base = base[min_index]; + blk.m_multiplier = mul[min_index]; + blk.m_table = s_tables[min_index]; + + uint64_t packed_sels = 0; + const uint8_t* pSels = &sels[min_index][0]; + for (uint32_t i = 0; i < 16; i++) + packed_sels |= (static_cast(pSels[i]) << s_etc2_eac_bit_ofs[i]); + + blk.set_selector_bits(packed_sels); + } + + // Checks all 16 tables. Around ~2 dB better vs. pack_eac(), ~1.2 dB less than near-optimal. + static void pack_eac_high_quality(eac_block& blk, const uint8_t* pPixels, uint32_t stride) + { + uint32_t min_alpha = 255, max_alpha = 0; + for (uint32_t i = 0; i < 16; i++) + { + const uint32_t a = pPixels[i * stride]; + if (a < min_alpha) min_alpha = a; + if (a > max_alpha) max_alpha = a; + } + + if (min_alpha == max_alpha) + { + pack_eac_solid_block(blk, min_alpha); + return; + } + + const uint32_t alpha_range = max_alpha - min_alpha; + + const uint32_t SINGLE_TABLE_THRESH = 5; + if (alpha_range <= SINGLE_TABLE_THRESH) + { + // If alpha_range <= 5 table 13 is lossless + int base = clamp255((int)max_alpha - 2); + + blk.m_base = base; + blk.m_multiplier = 1; + blk.m_table = 13; + + base -= 3; + + uint64_t packed_sels = 0; + for (uint32_t i = 0; i < 16; i++) + { + const int a = pPixels[i * stride]; + + static const uint8_t s_sels[6] = { 2, 1, 0, 4, 5, 6 }; + + int sel = a - base; + assert(sel >= 0 && sel <= 5); + + packed_sels |= (static_cast(s_sels[sel]) << s_etc2_eac_bit_ofs[i]); + } + + blk.set_selector_bits(packed_sels); + + return; + } + + int base[16], mul[16]; + for (uint32_t table = 0; table < 16; table++) + { + const float range = (float)(g_eac_modifier_table[table][ETC2_EAC_MAX_VALUE_SELECTOR] - g_eac_modifier_table[table][ETC2_EAC_MIN_VALUE_SELECTOR]); + + base[table] = clamp255((int)roundf(basisu::lerp((float)min_alpha, (float)max_alpha, (float)(0 - g_eac_modifier_table[table][ETC2_EAC_MIN_VALUE_SELECTOR]) / range))); + mul[table] = clampi((int)roundf(alpha_range / range), 1, 15); + } + + uint32_t total_err[16]; + memset(total_err, 0, sizeof(total_err)); + + uint8_t sels[16][16]; + + for (uint32_t table = 0; table < 16; table++) + { + const int8_t* pTable = &g_eac_modifier_table[table][0]; + const int m = mul[table], b = base[table]; + + uint32_t prev_l = 0, prev_a = UINT32_MAX; + + for (uint32_t i = 0; i < 16; i++) + { + const int a = pPixels[i * stride]; + + if ((uint32_t)a == prev_a) + { + sels[table][i] = prev_l & 7; + total_err[table] += basisu::square(prev_l >> 3); + } + else + { + uint32_t l = basisu::iabs(clamp255(m * pTable[0] + b) - a) << 3; + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[1] + b) - a) << 3) | 1); + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[2] + b) - a) << 3) | 2); + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[3] + b) - a) << 3) | 3); + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[4] + b) - a) << 3) | 4); + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[5] + b) - a) << 3) | 5); + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[6] + b) - a) << 3) | 6); + l = basisu::minimum(l, (basisu::iabs(clamp255(m * pTable[7] + b) - a) << 3) | 7); + + sels[table][i] = l & 7; + total_err[table] += basisu::square(l >> 3); + + prev_l = l; + prev_a = a; + } + } + } + + uint32_t min_err = total_err[0], min_index = 0; + for (uint32_t i = 1; i < 16; i++) + { + if (total_err[i] < min_err) + { + min_err = total_err[i]; + min_index = i; + } + } + + blk.m_base = base[min_index]; + blk.m_multiplier = mul[min_index]; + blk.m_table = min_index; + + uint64_t packed_sels = 0; + const uint8_t* pSels = &sels[min_index][0]; + for (uint32_t i = 0; i < 16; i++) + packed_sels |= (static_cast(pSels[i]) << s_etc2_eac_bit_ofs[i]); + + blk.set_selector_bits(packed_sels); + } + + bool transcode_uastc_to_etc2_eac_r11(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + const uint32_t mode = unpacked_src_blk.m_mode; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + pack_eac_solid_block(*static_cast(pDst), unpacked_src_blk.m_solid_color.c[chan0]); + return true; + } + + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + if (chan0 == 3) + transcode_uastc_to_etc2_eac_a8(unpacked_src_blk, block_pixels, pDst); + else + (high_quality ? pack_eac_high_quality : pack_eac)(*static_cast(pDst), &block_pixels[0][0].c[chan0], sizeof(color32)); + + return true; + } + + bool transcode_uastc_to_etc2_eac_rg11(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0, uint32_t chan1) + { + unpacked_uastc_block unpacked_src_blk; + if (!unpack_uastc(src_blk, unpacked_src_blk, false)) + return false; + + const uint32_t mode = unpacked_src_blk.m_mode; + + if (mode == UASTC_MODE_INDEX_SOLID_COLOR) + { + pack_eac_solid_block(static_cast(pDst)[0], unpacked_src_blk.m_solid_color.c[chan0]); + pack_eac_solid_block(static_cast(pDst)[1], unpacked_src_blk.m_solid_color.c[chan1]); + return true; + } + + color32 block_pixels[4][4]; + const bool unpack_srgb = false; + if (!unpack_uastc(unpacked_src_blk, &block_pixels[0][0], unpack_srgb)) + return false; + + if (chan0 == 3) + transcode_uastc_to_etc2_eac_a8(unpacked_src_blk, block_pixels, &static_cast(pDst)[0]); + else + (high_quality ? pack_eac_high_quality : pack_eac)(static_cast(pDst)[0], &block_pixels[0][0].c[chan0], sizeof(color32)); + + if (chan1 == 3) + transcode_uastc_to_etc2_eac_a8(unpacked_src_blk, block_pixels, &static_cast(pDst)[1]); + else + (high_quality ? pack_eac_high_quality : pack_eac)(static_cast(pDst)[1], &block_pixels[0][0].c[chan1], sizeof(color32)); + return true; + } + + // PVRTC1 + static void fixup_pvrtc1_4_modulation_rgb( + const uastc_block* pSrc_blocks, + const uint32_t* pPVRTC_endpoints, + void* pDst_blocks, + uint32_t num_blocks_x, uint32_t num_blocks_y, bool from_alpha) + { + const uint32_t x_mask = num_blocks_x - 1; + const uint32_t y_mask = num_blocks_y - 1; + const uint32_t x_bits = basisu::total_bits(x_mask); + const uint32_t y_bits = basisu::total_bits(y_mask); + const uint32_t min_bits = basisu::minimum(x_bits, y_bits); + //const uint32_t max_bits = basisu::maximum(x_bits, y_bits); + const uint32_t swizzle_mask = (1 << (min_bits * 2)) - 1; + + uint32_t block_index = 0; + + // really 3x3 + int e0[4][4], e1[4][4]; + + for (int y = 0; y < static_cast(num_blocks_y); y++) + { + const uint32_t* pE_rows[3]; + + for (int ey = 0; ey < 3; ey++) + { + int by = y + ey - 1; + + const uint32_t* pE = &pPVRTC_endpoints[(by & y_mask) * num_blocks_x]; + + pE_rows[ey] = pE; + + for (int ex = 0; ex < 3; ex++) + { + int bx = 0 + ex - 1; + + const uint32_t e = pE[bx & x_mask]; + + e0[ex][ey] = (get_opaque_endpoint_l0(e) * 255) / 31; + e1[ex][ey] = (get_opaque_endpoint_l1(e) * 255) / 31; + } + } + + const uint32_t y_swizzle = (g_pvrtc_swizzle_table[y >> 8] << 16) | g_pvrtc_swizzle_table[y & 0xFF]; + + for (int x = 0; x < static_cast(num_blocks_x); x++, block_index++) + { + const uastc_block& src_block = pSrc_blocks[block_index]; + + color32 block_pixels[4][4]; + unpack_uastc(src_block, &block_pixels[0][0], false); + if (from_alpha) + { + // Just set RGB to alpha to avoid adding complexity below. + for (uint32_t i = 0; i < 16; i++) + { + const uint8_t a = ((color32*)block_pixels)[i].a; + ((color32*)block_pixels)[i].set(a, a, a, 255); + } + } + + const uint32_t x_swizzle = (g_pvrtc_swizzle_table[x >> 8] << 17) | (g_pvrtc_swizzle_table[x & 0xFF] << 1); + + uint32_t swizzled = x_swizzle | y_swizzle; + if (num_blocks_x != num_blocks_y) + { + swizzled &= swizzle_mask; + + if (num_blocks_x > num_blocks_y) + swizzled |= ((x >> min_bits) << (min_bits * 2)); + else + swizzled |= ((y >> min_bits) << (min_bits * 2)); + } + + pvrtc4_block* pDst_block = static_cast(pDst_blocks) + swizzled; + pDst_block->m_endpoints = pPVRTC_endpoints[block_index]; + + { + const uint32_t ex = 2; + int bx = x + ex - 1; + bx &= x_mask; + +#define DO_ROW(ey) \ + { \ + const uint32_t e = pE_rows[ey][bx]; \ + e0[ex][ey] = (get_opaque_endpoint_l0(e) * 255) / 31; \ + e1[ex][ey] = (get_opaque_endpoint_l1(e) * 255) / 31; \ + } + + DO_ROW(0); + DO_ROW(1); + DO_ROW(2); +#undef DO_ROW + } + + uint32_t mod = 0; + +#define DO_PIX(lx, ly, w0, w1, w2, w3) \ + { \ + int ca_l = a0 * w0 + a1 * w1 + a2 * w2 + a3 * w3; \ + int cb_l = b0 * w0 + b1 * w1 + b2 * w2 + b3 * w3; \ + int cl = (block_pixels[ly][lx].r + block_pixels[ly][lx].g + block_pixels[ly][lx].b) * 16; \ + int dl = cb_l - ca_l; \ + int vl = cl - ca_l; \ + int p = vl * 16; \ + if (ca_l > cb_l) { p = -p; dl = -dl; } \ + uint32_t m = 0; \ + if (p > 3 * dl) m = (uint32_t)(1 << ((ly) * 8 + (lx) * 2)); \ + if (p > 8 * dl) m = (uint32_t)(2 << ((ly) * 8 + (lx) * 2)); \ + if (p > 13 * dl) m = (uint32_t)(3 << ((ly) * 8 + (lx) * 2)); \ + mod |= m; \ + } + + { + const uint32_t ex = 0, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 0, 4, 4, 4, 4); + DO_PIX(1, 0, 2, 6, 2, 6); + DO_PIX(0, 1, 2, 2, 6, 6); + DO_PIX(1, 1, 1, 3, 3, 9); + } + + { + const uint32_t ex = 1, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 0, 8, 0, 8, 0); + DO_PIX(3, 0, 6, 2, 6, 2); + DO_PIX(2, 1, 4, 0, 12, 0); + DO_PIX(3, 1, 3, 1, 9, 3); + } + + { + const uint32_t ex = 0, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 2, 8, 8, 0, 0); + DO_PIX(1, 2, 4, 12, 0, 0); + DO_PIX(0, 3, 6, 6, 2, 2); + DO_PIX(1, 3, 3, 9, 1, 3); + } + + { + const uint32_t ex = 1, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 2, 16, 0, 0, 0); + DO_PIX(3, 2, 12, 4, 0, 0); + DO_PIX(2, 3, 12, 0, 4, 0); + DO_PIX(3, 3, 9, 3, 3, 1); + } +#undef DO_PIX + + pDst_block->m_modulation = mod; + + e0[0][0] = e0[1][0]; e0[1][0] = e0[2][0]; + e0[0][1] = e0[1][1]; e0[1][1] = e0[2][1]; + e0[0][2] = e0[1][2]; e0[1][2] = e0[2][2]; + + e1[0][0] = e1[1][0]; e1[1][0] = e1[2][0]; + e1[0][1] = e1[1][1]; e1[1][1] = e1[2][1]; + e1[0][2] = e1[1][2]; e1[1][2] = e1[2][2]; + + } // x + } // y + } + + static void fixup_pvrtc1_4_modulation_rgba( + const uastc_block* pSrc_blocks, + const uint32_t* pPVRTC_endpoints, + void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y) + { + const uint32_t x_mask = num_blocks_x - 1; + const uint32_t y_mask = num_blocks_y - 1; + const uint32_t x_bits = basisu::total_bits(x_mask); + const uint32_t y_bits = basisu::total_bits(y_mask); + const uint32_t min_bits = basisu::minimum(x_bits, y_bits); + //const uint32_t max_bits = basisu::maximum(x_bits, y_bits); + const uint32_t swizzle_mask = (1 << (min_bits * 2)) - 1; + + uint32_t block_index = 0; + + // really 3x3 + int e0[4][4], e1[4][4]; + + for (int y = 0; y < static_cast(num_blocks_y); y++) + { + const uint32_t* pE_rows[3]; + + for (int ey = 0; ey < 3; ey++) + { + int by = y + ey - 1; + + const uint32_t* pE = &pPVRTC_endpoints[(by & y_mask) * num_blocks_x]; + + pE_rows[ey] = pE; + + for (int ex = 0; ex < 3; ex++) + { + int bx = 0 + ex - 1; + + const uint32_t e = pE[bx & x_mask]; + + e0[ex][ey] = get_endpoint_l8(e, 0); + e1[ex][ey] = get_endpoint_l8(e, 1); + } + } + + const uint32_t y_swizzle = (g_pvrtc_swizzle_table[y >> 8] << 16) | g_pvrtc_swizzle_table[y & 0xFF]; + + for (int x = 0; x < static_cast(num_blocks_x); x++, block_index++) + { + const uastc_block& src_block = pSrc_blocks[block_index]; + + color32 block_pixels[4][4]; + unpack_uastc(src_block, &block_pixels[0][0], false); + + const uint32_t x_swizzle = (g_pvrtc_swizzle_table[x >> 8] << 17) | (g_pvrtc_swizzle_table[x & 0xFF] << 1); + + uint32_t swizzled = x_swizzle | y_swizzle; + if (num_blocks_x != num_blocks_y) + { + swizzled &= swizzle_mask; + + if (num_blocks_x > num_blocks_y) + swizzled |= ((x >> min_bits) << (min_bits * 2)); + else + swizzled |= ((y >> min_bits) << (min_bits * 2)); + } + + pvrtc4_block* pDst_block = static_cast(pDst_blocks) + swizzled; + pDst_block->m_endpoints = pPVRTC_endpoints[block_index]; + + { + const uint32_t ex = 2; + int bx = x + ex - 1; + bx &= x_mask; + +#define DO_ROW(ey) \ + { \ + const uint32_t e = pE_rows[ey][bx]; \ + e0[ex][ey] = get_endpoint_l8(e, 0); \ + e1[ex][ey] = get_endpoint_l8(e, 1); \ + } + + DO_ROW(0); + DO_ROW(1); + DO_ROW(2); +#undef DO_ROW + } + + uint32_t mod = 0; + +#define DO_PIX(lx, ly, w0, w1, w2, w3) \ + { \ + int ca_l = a0 * w0 + a1 * w1 + a2 * w2 + a3 * w3; \ + int cb_l = b0 * w0 + b1 * w1 + b2 * w2 + b3 * w3; \ + int cl = 16 * (block_pixels[ly][lx].r + block_pixels[ly][lx].g + block_pixels[ly][lx].b + block_pixels[ly][lx].a); \ + int dl = cb_l - ca_l; \ + int vl = cl - ca_l; \ + int p = vl * 16; \ + if (ca_l > cb_l) { p = -p; dl = -dl; } \ + uint32_t m = 0; \ + if (p > 3 * dl) m = (uint32_t)(1 << ((ly) * 8 + (lx) * 2)); \ + if (p > 8 * dl) m = (uint32_t)(2 << ((ly) * 8 + (lx) * 2)); \ + if (p > 13 * dl) m = (uint32_t)(3 << ((ly) * 8 + (lx) * 2)); \ + mod |= m; \ + } + + { + const uint32_t ex = 0, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 0, 4, 4, 4, 4); + DO_PIX(1, 0, 2, 6, 2, 6); + DO_PIX(0, 1, 2, 2, 6, 6); + DO_PIX(1, 1, 1, 3, 3, 9); + } + + { + const uint32_t ex = 1, ey = 0; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 0, 8, 0, 8, 0); + DO_PIX(3, 0, 6, 2, 6, 2); + DO_PIX(2, 1, 4, 0, 12, 0); + DO_PIX(3, 1, 3, 1, 9, 3); + } + + { + const uint32_t ex = 0, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(0, 2, 8, 8, 0, 0); + DO_PIX(1, 2, 4, 12, 0, 0); + DO_PIX(0, 3, 6, 6, 2, 2); + DO_PIX(1, 3, 3, 9, 1, 3); + } + + { + const uint32_t ex = 1, ey = 1; + const int a0 = e0[ex][ey], a1 = e0[ex + 1][ey], a2 = e0[ex][ey + 1], a3 = e0[ex + 1][ey + 1]; + const int b0 = e1[ex][ey], b1 = e1[ex + 1][ey], b2 = e1[ex][ey + 1], b3 = e1[ex + 1][ey + 1]; + DO_PIX(2, 2, 16, 0, 0, 0); + DO_PIX(3, 2, 12, 4, 0, 0); + DO_PIX(2, 3, 12, 0, 4, 0); + DO_PIX(3, 3, 9, 3, 3, 1); + } +#undef DO_PIX + + pDst_block->m_modulation = mod; + + e0[0][0] = e0[1][0]; e0[1][0] = e0[2][0]; + e0[0][1] = e0[1][1]; e0[1][1] = e0[2][1]; + e0[0][2] = e0[1][2]; e0[1][2] = e0[2][2]; + + e1[0][0] = e1[1][0]; e1[1][0] = e1[2][0]; + e1[0][1] = e1[1][1]; e1[1][1] = e1[2][1]; + e1[0][2] = e1[1][2]; e1[1][2] = e1[2][2]; + + } // x + } // y + } + + bool transcode_uastc_to_pvrtc1_4_rgb(const uastc_block* pSrc_blocks, void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, bool high_quality, bool from_alpha) + { + BASISU_NOTE_UNUSED(high_quality); + + if ((!num_blocks_x) || (!num_blocks_y)) + return false; + + const uint32_t width = num_blocks_x * 4; + const uint32_t height = num_blocks_y * 4; + if (!basisu::is_pow2(width) || !basisu::is_pow2(height)) + return false; + + basisu::vector temp_endpoints(num_blocks_x * num_blocks_y); + + for (uint32_t y = 0; y < num_blocks_y; y++) + { + for (uint32_t x = 0; x < num_blocks_x; x++) + { + color32 block_pixels[16]; + if (!unpack_uastc(pSrc_blocks[x + y * num_blocks_x], block_pixels, false)) + return false; + + // Get block's RGB bounding box + color32 low_color(255, 255, 255, 255), high_color(0, 0, 0, 0); + + if (from_alpha) + { + uint32_t low_a = 255, high_a = 0; + for (uint32_t i = 0; i < 16; i++) + { + low_a = basisu::minimum(low_a, block_pixels[i].a); + high_a = basisu::maximum(high_a, block_pixels[i].a); + } + low_color.set(low_a, low_a, low_a, 255); + high_color.set(high_a, high_a, high_a, 255); + } + else + { + for (uint32_t i = 0; i < 16; i++) + { + low_color = color32::comp_min(low_color, block_pixels[i]); + high_color = color32::comp_max(high_color, block_pixels[i]); + } + } + + // Set PVRTC1 endpoints to floor/ceil of bounding box's coordinates. + pvrtc4_block temp; + temp.set_opaque_endpoint_floor(0, low_color); + temp.set_opaque_endpoint_ceil(1, high_color); + + temp_endpoints[x + y * num_blocks_x] = temp.m_endpoints; + } + } + + fixup_pvrtc1_4_modulation_rgb(pSrc_blocks, &temp_endpoints[0], pDst_blocks, num_blocks_x, num_blocks_y, from_alpha); + + return true; + } + + bool transcode_uastc_to_pvrtc1_4_rgba(const uastc_block* pSrc_blocks, void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, bool high_quality) + { + BASISU_NOTE_UNUSED(high_quality); + + if ((!num_blocks_x) || (!num_blocks_y)) + return false; + + const uint32_t width = num_blocks_x * 4; + const uint32_t height = num_blocks_y * 4; + if (!basisu::is_pow2(width) || !basisu::is_pow2(height)) + return false; + + basisu::vector temp_endpoints(num_blocks_x * num_blocks_y); + + for (uint32_t y = 0; y < num_blocks_y; y++) + { + for (uint32_t x = 0; x < num_blocks_x; x++) + { + color32 block_pixels[16]; + if (!unpack_uastc(pSrc_blocks[x + y * num_blocks_x], block_pixels, false)) + return false; + + // Get block's RGBA bounding box + color32 low_color(255, 255, 255, 255), high_color(0, 0, 0, 0); + + for (uint32_t i = 0; i < 16; i++) + { + low_color = color32::comp_min(low_color, block_pixels[i]); + high_color = color32::comp_max(high_color, block_pixels[i]); + } + + // Set PVRTC1 endpoints to floor/ceil of bounding box's coordinates. + pvrtc4_block temp; + temp.set_endpoint_floor(0, low_color); + temp.set_endpoint_ceil(1, high_color); + + temp_endpoints[x + y * num_blocks_x] = temp.m_endpoints; + } + } + + fixup_pvrtc1_4_modulation_rgba(pSrc_blocks, &temp_endpoints[0], pDst_blocks, num_blocks_x, num_blocks_y); + + return true; + } + + void uastc_init() + { + for (uint32_t range = 0; range < BC7ENC_TOTAL_ASTC_RANGES; range++) + { + if (!astc_is_valid_endpoint_range(range)) + continue; + + const uint32_t levels = astc_get_levels(range); + + uint32_t vals[256]; + for (uint32_t i = 0; i < levels; i++) + vals[i] = (unquant_astc_endpoint_val(i, range) << 8) | i; + + std::sort(vals, vals + levels); + + for (uint32_t i = 0; i < levels; i++) + { + const uint32_t order = vals[i] & 0xFF; + const uint32_t unq = vals[i] >> 8; + + g_astc_unquant[range][order].m_unquant = (uint8_t)unq; + g_astc_unquant[range][order].m_index = (uint8_t)i; + + } // i + } + + // TODO: Precompute? + // BC7 777.1 + for (int c = 0; c < 256; c++) + { + for (uint32_t lp = 0; lp < 2; lp++) + { + endpoint_err best; + best.m_error = (uint16_t)UINT16_MAX; + + for (uint32_t l = 0; l < 128; l++) + { + const uint32_t low = (l << 1) | lp; + + for (uint32_t h = 0; h < 128; h++) + { + const uint32_t high = (h << 1) | lp; + + const int k = (low * (64 - g_bc7_weights4[BC7ENC_MODE_6_OPTIMAL_INDEX]) + high * g_bc7_weights4[BC7ENC_MODE_6_OPTIMAL_INDEX] + 32) >> 6; + + const int err = (k - c) * (k - c); + if (err < best.m_error) + { + best.m_error = (uint16_t)err; + best.m_lo = (uint8_t)l; + best.m_hi = (uint8_t)h; + } + } // h + } // l + + g_bc7_mode_6_optimal_endpoints[c][lp] = best; + } // lp + + } // c + + // BC7 777 + for (int c = 0; c < 256; c++) + { + endpoint_err best; + best.m_error = (uint16_t)UINT16_MAX; + + for (uint32_t l = 0; l < 128; l++) + { + const uint32_t low = (l << 1) | (l >> 6); + + for (uint32_t h = 0; h < 128; h++) + { + const uint32_t high = (h << 1) | (h >> 6); + + const int k = (low * (64 - g_bc7_weights2[BC7ENC_MODE_5_OPTIMAL_INDEX]) + high * g_bc7_weights2[BC7ENC_MODE_5_OPTIMAL_INDEX] + 32) >> 6; + + const int err = (k - c) * (k - c); + if (err < best.m_error) + { + best.m_error = (uint16_t)err; + best.m_lo = (uint8_t)l; + best.m_hi = (uint8_t)h; + } + } // h + } // l + + g_bc7_mode_5_optimal_endpoints[c] = best; + + } // c + } + +#endif // #if BASISD_SUPPORT_UASTC + +// ------------------------------------------------------------------------------------------------------ +// KTX2 +// ------------------------------------------------------------------------------------------------------ + +#if BASISD_SUPPORT_KTX2 + const uint8_t g_ktx2_file_identifier[12] = { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x32, 0x30, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A }; + + ktx2_transcoder::ktx2_transcoder() : + m_etc1s_transcoder() + { + clear(); + } + + void ktx2_transcoder::clear() + { + m_pData = nullptr; + m_data_size = 0; + + memset((void*)&m_header, 0, sizeof(m_header)); + m_levels.clear(); + m_dfd.clear(); + m_key_values.clear(); + memset((void*)&m_etc1s_header, 0, sizeof(m_etc1s_header)); + m_etc1s_image_descs.clear(); + + m_format = basist::basis_tex_format::cETC1S; + + m_dfd_color_model = 0; + m_dfd_color_prims = KTX2_DF_PRIMARIES_UNSPECIFIED; + m_dfd_transfer_func = 0; + m_dfd_flags = 0; + m_dfd_samples = 0; + m_dfd_chan0 = KTX2_DF_CHANNEL_UASTC_RGB; + m_dfd_chan1 = KTX2_DF_CHANNEL_UASTC_RGB; + + m_etc1s_transcoder.clear(); + + m_def_transcoder_state.clear(); + + m_has_alpha = false; + m_is_video = false; + } + + bool ktx2_transcoder::init(const void* pData, uint32_t data_size) + { + clear(); + + if (!pData) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: pData is nullptr\n"); + assert(0); + return false; + } + + if (data_size <= sizeof(ktx2_header)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: File is impossibly too small to be a valid KTX2 file\n"); + return false; + } + + if (memcmp(pData, g_ktx2_file_identifier, sizeof(g_ktx2_file_identifier)) != 0) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: KTX2 file identifier is not present\n"); + return false; + } + + m_pData = static_cast(pData); + m_data_size = data_size; + + memcpy((void*)&m_header, pData, sizeof(m_header)); + + // We only support UASTC and ETC1S + if (m_header.m_vk_format != KTX2_VK_FORMAT_UNDEFINED) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: KTX2 file must be in ETC1S or UASTC format\n"); + return false; + } + + // 3.3: "When format is VK_FORMAT_UNDEFINED, typeSize must equal 1." + if (m_header.m_type_size != 1) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid type_size\n"); + return false; + } + + // We only currently support 2D textures (plain, cubemapped, or texture array), which is by far the most common use case. + // The BasisU library does not support 1D or 3D textures at all. + if ((m_header.m_pixel_width < 1) || (m_header.m_pixel_height < 1) || (m_header.m_pixel_depth > 0)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Only 2D or cubemap textures are supported\n"); + return false; + } + + // Face count must be 1 or 6 + if ((m_header.m_face_count != 1) && (m_header.m_face_count != 6)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid face count, file is corrupted or invalid\n"); + return false; + } + + if (m_header.m_face_count > 1) + { + // 3.4: Make sure cubemaps are square. + if (m_header.m_pixel_width != m_header.m_pixel_height) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Cubemap is not square\n"); + return false; + } + } + + // 3.7 levelCount: "levelCount=0 is allowed, except for block-compressed formats" + if (m_header.m_level_count < 1) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid level count\n"); + return false; + } + + // Sanity check the level count. + if (m_header.m_level_count > KTX2_MAX_SUPPORTED_LEVEL_COUNT) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Too many levels or file is corrupted or invalid\n"); + return false; + } + + if (m_header.m_supercompression_scheme > KTX2_SS_ZSTANDARD) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid/unsupported supercompression or file is corrupted or invalid\n"); + return false; + } + + if (m_header.m_supercompression_scheme == KTX2_SS_BASISLZ) + { + if (m_header.m_sgd_byte_length <= sizeof(ktx2_etc1s_global_data_header)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Supercompression global data is too small\n"); + return false; + } + + if (m_header.m_sgd_byte_offset < sizeof(ktx2_header)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Supercompression global data offset is too low\n"); + return false; + } + + if (m_header.m_sgd_byte_offset + m_header.m_sgd_byte_length > m_data_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Supercompression global data offset and/or length is too high\n"); + return false; + } + } + + if (!m_levels.try_resize(m_header.m_level_count)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Out of memory\n"); + return false; + } + + const uint32_t level_index_size_in_bytes = basisu::maximum(1U, (uint32_t)m_header.m_level_count) * sizeof(ktx2_level_index); + + if ((sizeof(ktx2_header) + level_index_size_in_bytes) > m_data_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: File is too small (can't read level index array)\n"); + return false; + } + + memcpy((void*)&m_levels[0], m_pData + sizeof(ktx2_header), level_index_size_in_bytes); + + // Sanity check the level offsets and byte sizes + for (uint32_t i = 0; i < m_levels.size(); i++) + { + if (m_levels[i].m_byte_offset < sizeof(ktx2_header)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid level offset (too low)\n"); + return false; + } + + if (!m_levels[i].m_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid level byte length\n"); + } + + if ((m_levels[i].m_byte_offset + m_levels[i].m_byte_length) > m_data_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid level offset and/or length\n"); + return false; + } + + const uint64_t MAX_SANE_LEVEL_UNCOMP_SIZE = 2048ULL * 1024ULL * 1024ULL; + + if (m_levels[i].m_uncompressed_byte_length >= MAX_SANE_LEVEL_UNCOMP_SIZE) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid level offset (too large)\n"); + return false; + } + + if (m_header.m_supercompression_scheme == KTX2_SS_BASISLZ) + { + if (m_levels[i].m_uncompressed_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid uncompressed length (0)\n"); + return false; + } + } + else if (m_header.m_supercompression_scheme >= KTX2_SS_ZSTANDARD) + { + if (!m_levels[i].m_uncompressed_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid uncompressed length (1)\n"); + return false; + } + } + } + + const uint32_t DFD_MINIMUM_SIZE = 44, DFD_MAXIMUM_SIZE = 60; + if ((m_header.m_dfd_byte_length != DFD_MINIMUM_SIZE) && (m_header.m_dfd_byte_length != DFD_MAXIMUM_SIZE)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Unsupported DFD size\n"); + return false; + } + + if (((m_header.m_dfd_byte_offset + m_header.m_dfd_byte_length) > m_data_size) || (m_header.m_dfd_byte_offset < sizeof(ktx2_header))) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid DFD offset and/or length\n"); + return false; + } + + const uint8_t* pDFD = m_pData + m_header.m_dfd_byte_offset; + + if (!m_dfd.try_resize(m_header.m_dfd_byte_length)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Out of memory\n"); + return false; + } + + memcpy(m_dfd.data(), pDFD, m_header.m_dfd_byte_length); + + // This is all hard coded for only ETC1S and UASTC. + uint32_t dfd_total_size = basisu::read_le_dword(pDFD); + + // 3.10.3: Sanity check + if (dfd_total_size != m_header.m_dfd_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: DFD size validation failed (1)\n"); + return false; + } + + // 3.10.3: More sanity checking + if (m_header.m_kvd_byte_length) + { + if (dfd_total_size != m_header.m_kvd_byte_offset - m_header.m_dfd_byte_offset) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: DFD size validation failed (2)\n"); + return false; + } + } + + const uint32_t dfd_bits = basisu::read_le_dword(pDFD + 3 * sizeof(uint32_t)); + const uint32_t sample_channel0 = basisu::read_le_dword(pDFD + 7 * sizeof(uint32_t)); + + m_dfd_color_model = dfd_bits & 255; + m_dfd_color_prims = (ktx2_df_color_primaries)((dfd_bits >> 8) & 255); + m_dfd_transfer_func = (dfd_bits >> 16) & 255; + m_dfd_flags = (dfd_bits >> 24) & 255; + + // See 3.10.1.Restrictions + if ((m_dfd_transfer_func != KTX2_KHR_DF_TRANSFER_LINEAR) && (m_dfd_transfer_func != KTX2_KHR_DF_TRANSFER_SRGB)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Invalid DFD transfer function\n"); + return false; + } + + if (m_dfd_color_model == KTX2_KDF_DF_MODEL_ETC1S) + { + m_format = basist::basis_tex_format::cETC1S; + + // 3.10.2: "Whether the image has 1 or 2 slices can be determined from the DFD's sample count." + // If m_has_alpha is true it may be 2-channel RRRG or 4-channel RGBA, but we let the caller deal with that. + m_has_alpha = (m_header.m_dfd_byte_length == 60); + + m_dfd_samples = m_has_alpha ? 2 : 1; + m_dfd_chan0 = (ktx2_df_channel_id)((sample_channel0 >> 24) & 15); + + if (m_has_alpha) + { + const uint32_t sample_channel1 = basisu::read_le_dword(pDFD + 11 * sizeof(uint32_t)); + m_dfd_chan1 = (ktx2_df_channel_id)((sample_channel1 >> 24) & 15); + } + } + else if (m_dfd_color_model == KTX2_KDF_DF_MODEL_UASTC) + { + m_format = basist::basis_tex_format::cUASTC4x4; + + m_dfd_samples = 1; + m_dfd_chan0 = (ktx2_df_channel_id)((sample_channel0 >> 24) & 15); + + // We're assuming "DATA" means RGBA so it has alpha. + m_has_alpha = (m_dfd_chan0 == KTX2_DF_CHANNEL_UASTC_RGBA) || (m_dfd_chan0 == KTX2_DF_CHANNEL_UASTC_RRRG); + } + else + { + // Unsupported DFD color model. + BASISU_DEVEL_ERROR("ktx2_transcoder::init: Unsupported DFD color model\n"); + return false; + } + + if (!read_key_values()) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::init: read_key_values() failed\n"); + return false; + } + + // Check for a KTXanimData key + for (uint32_t i = 0; i < m_key_values.size(); i++) + { + if (strcmp(reinterpret_cast(m_key_values[i].m_key.data()), "KTXanimData") == 0) + { + m_is_video = true; + break; + } + } + + return true; + } + + uint32_t ktx2_transcoder::get_etc1s_image_descs_image_flags(uint32_t level_index, uint32_t layer_index, uint32_t face_index) const + { + const uint32_t etc1s_image_index = + (level_index * basisu::maximum(m_header.m_layer_count, 1) * m_header.m_face_count) + + layer_index * m_header.m_face_count + + face_index; + + if (etc1s_image_index >= get_etc1s_image_descs().size()) + { + assert(0); + return 0; + } + + return get_etc1s_image_descs()[etc1s_image_index].m_image_flags; + } + + const basisu::uint8_vec* ktx2_transcoder::find_key(const std::string& key_name) const + { + for (uint32_t i = 0; i < m_key_values.size(); i++) + if (strcmp((const char *)m_key_values[i].m_key.data(), key_name.c_str()) == 0) + return &m_key_values[i].m_value; + + return nullptr; + } + + bool ktx2_transcoder::start_transcoding() + { + if (!m_pData) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::start_transcoding: Must call init() first\n"); + return false; + } + + if (m_header.m_supercompression_scheme == KTX2_SS_BASISLZ) + { + // Check if we've already decompressed the ETC1S global data. If so don't unpack it again. + if (!m_etc1s_transcoder.get_endpoints().empty()) + return true; + + if (!decompress_etc1s_global_data()) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::start_transcoding: decompress_etc1s_global_data() failed\n"); + return false; + } + + if (!m_is_video) + { + // See if there are any P-frames. If so it must be a video, even if there wasn't a KTXanimData key. + // Video cannot be a cubemap, and it must be a texture array. + if ((m_header.m_face_count == 1) && (m_header.m_layer_count > 1)) + { + for (uint32_t i = 0; i < m_etc1s_image_descs.size(); i++) + { + if (m_etc1s_image_descs[i].m_image_flags & KTX2_IMAGE_IS_P_FRAME) + { + m_is_video = true; + break; + } + } + } + } + } + else if (m_header.m_supercompression_scheme == KTX2_SS_ZSTANDARD) + { +#if !BASISD_SUPPORT_KTX2_ZSTD + BASISU_DEVEL_ERROR("ktx2_transcoder::start_transcoding: File uses zstd supercompression, but zstd support was not enabled at compilation time (BASISD_SUPPORT_KTX2_ZSTD == 0)\n"); + return false; +#endif + } + + return true; + } + + bool ktx2_transcoder::get_image_level_info(ktx2_image_level_info& level_info, uint32_t level_index, uint32_t layer_index, uint32_t face_index) const + { + if (level_index >= m_levels.size()) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::get_image_level_info: level_index >= m_levels.size()\n"); + return false; + } + + if (m_header.m_face_count > 1) + { + if (face_index >= 6) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::get_image_level_info: face_index >= 6\n"); + return false; + } + } + else if (face_index != 0) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::get_image_level_info: face_index != 0\n"); + return false; + } + + if (layer_index >= basisu::maximum(m_header.m_layer_count, 1)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::get_image_level_info: layer_index >= maximum(m_header.m_layer_count, 1)\n"); + return false; + } + + const uint32_t level_width = basisu::maximum(m_header.m_pixel_width >> level_index, 1); + const uint32_t level_height = basisu::maximum(m_header.m_pixel_height >> level_index, 1); + const uint32_t num_blocks_x = (level_width + 3) >> 2; + const uint32_t num_blocks_y = (level_height + 3) >> 2; + + level_info.m_face_index = face_index; + level_info.m_layer_index = layer_index; + level_info.m_level_index = level_index; + level_info.m_orig_width = level_width; + level_info.m_orig_height = level_height; + level_info.m_width = num_blocks_x * 4; + level_info.m_height = num_blocks_y * 4; + level_info.m_num_blocks_x = num_blocks_x; + level_info.m_num_blocks_y = num_blocks_y; + level_info.m_total_blocks = num_blocks_x * num_blocks_y; + level_info.m_alpha_flag = m_has_alpha; + level_info.m_iframe_flag = false; + if (m_etc1s_image_descs.size()) + { + const uint32_t etc1s_image_index = + (level_index * basisu::maximum(m_header.m_layer_count, 1) * m_header.m_face_count) + + layer_index * m_header.m_face_count + + face_index; + + level_info.m_iframe_flag = (m_etc1s_image_descs[etc1s_image_index].m_image_flags & KTX2_IMAGE_IS_P_FRAME) == 0; + } + + return true; + } + + bool ktx2_transcoder::transcode_image_level( + uint32_t level_index, uint32_t layer_index, uint32_t face_index, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + basist::transcoder_texture_format fmt, + uint32_t decode_flags, uint32_t output_row_pitch_in_blocks_or_pixels, uint32_t output_rows_in_pixels, int channel0, int channel1, + ktx2_transcoder_state* pState) + { + if (!m_pData) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: Must call init() first\n"); + return false; + } + + if (!pState) + pState = &m_def_transcoder_state; + + if (level_index >= m_levels.size()) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: level_index >= m_levels.size()\n"); + return false; + } + + if (m_header.m_face_count > 1) + { + if (face_index >= 6) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: face_index >= 6\n"); + return false; + } + } + else if (face_index != 0) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: face_index != 0\n"); + return false; + } + + if (layer_index >= basisu::maximum(m_header.m_layer_count, 1)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: layer_index >= maximum(m_header.m_layer_count, 1)\n"); + return false; + } + + const uint8_t* pComp_level_data = m_pData + m_levels[level_index].m_byte_offset; + uint64_t comp_level_data_size = m_levels[level_index].m_byte_length; + + const uint8_t* pUncomp_level_data = pComp_level_data; + uint64_t uncomp_level_data_size = comp_level_data_size; + + if (uncomp_level_data_size > UINT32_MAX) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: uncomp_level_data_size > UINT32_MAX\n"); + return false; + } + + if (m_header.m_supercompression_scheme == KTX2_SS_ZSTANDARD) + { + // Check if we've already decompressed this level's supercompressed data. + if ((int)level_index != pState->m_uncomp_data_level_index) + { + // Uncompress the entire level's supercompressed data. + if (!decompress_level_data(level_index, pState->m_level_uncomp_data)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: decompress_level_data() failed\n"); + return false; + } + pState->m_uncomp_data_level_index = level_index; + } + + pUncomp_level_data = pState->m_level_uncomp_data.data(); + uncomp_level_data_size = pState->m_level_uncomp_data.size(); + } + + const uint32_t level_width = basisu::maximum(m_header.m_pixel_width >> level_index, 1); + const uint32_t level_height = basisu::maximum(m_header.m_pixel_height >> level_index, 1); + const uint32_t num_blocks_x = (level_width + 3) >> 2; + const uint32_t num_blocks_y = (level_height + 3) >> 2; + + if (m_format == basist::basis_tex_format::cETC1S) + { + // Ensure start_transcoding() was called. + if (m_etc1s_transcoder.get_endpoints().empty()) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: must call start_transcoding() first\n"); + return false; + } + + const uint32_t etc1s_image_index = + (level_index * basisu::maximum(m_header.m_layer_count, 1) * m_header.m_face_count) + + layer_index * m_header.m_face_count + + face_index; + + // Sanity check + if (etc1s_image_index >= m_etc1s_image_descs.size()) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: etc1s_image_index >= m_etc1s_image_descs.size()\n"); + assert(0); + return false; + } + + if (static_cast(m_data_size) != m_data_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: File is too large\n"); + return false; + } + + const ktx2_etc1s_image_desc& image_desc = m_etc1s_image_descs[etc1s_image_index]; + + if (!m_etc1s_transcoder.transcode_image(fmt, + pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, m_pData, static_cast(m_data_size), + num_blocks_x, num_blocks_y, level_width, level_height, + level_index, + m_levels[level_index].m_byte_offset + image_desc.m_rgb_slice_byte_offset, image_desc.m_rgb_slice_byte_length, + image_desc.m_alpha_slice_byte_length ? (m_levels[level_index].m_byte_offset + image_desc.m_alpha_slice_byte_offset) : 0, image_desc.m_alpha_slice_byte_length, + decode_flags, m_has_alpha, + m_is_video, output_row_pitch_in_blocks_or_pixels, &pState->m_transcoder_state, output_rows_in_pixels)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: ETC1S transcode_image() failed, this is either a bug or the file is corrupted/invalid\n"); + return false; + } + } + else if (m_format == basist::basis_tex_format::cUASTC4x4) + { + // Compute length and offset to uncompressed 2D UASTC texture data, given the face/layer indices. + assert(uncomp_level_data_size == m_levels[level_index].m_uncompressed_byte_length); + const uint32_t total_2D_image_size = num_blocks_x * num_blocks_y * KTX2_UASTC_BLOCK_SIZE; + + const uint32_t uncomp_ofs = (layer_index * m_header.m_face_count + face_index) * total_2D_image_size; + + // Sanity checks + if (uncomp_ofs >= uncomp_level_data_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: uncomp_ofs >= total_2D_image_size\n"); + return false; + } + + if ((uncomp_level_data_size - uncomp_ofs) < total_2D_image_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: (uncomp_level_data_size - uncomp_ofs) < total_2D_image_size\n"); + return false; + } + + if (!m_uastc_transcoder.transcode_image(fmt, + pOutput_blocks, output_blocks_buf_size_in_blocks_or_pixels, + (const uint8_t*)pUncomp_level_data + uncomp_ofs, (uint32_t)total_2D_image_size, num_blocks_x, num_blocks_y, level_width, level_height, level_index, + 0, (uint32_t)total_2D_image_size, + decode_flags, m_has_alpha, m_is_video, output_row_pitch_in_blocks_or_pixels, nullptr, output_rows_in_pixels, channel0, channel1)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: UASTC transcode_image() failed, this is either a bug or the file is corrupted/invalid\n"); + return false; + } + } + else + { + // Shouldn't get here. + BASISU_DEVEL_ERROR("ktx2_transcoder::transcode_image_2D: Internal error\n"); + assert(0); + return false; + } + + return true; + } + + bool ktx2_transcoder::decompress_level_data(uint32_t level_index, basisu::uint8_vec& uncomp_data) + { +#if BASISD_SUPPORT_KTX2_ZSTD + const uint8_t* pComp_data = m_levels[level_index].m_byte_offset + m_pData; +#endif + const uint64_t comp_size = m_levels[level_index].m_byte_length; + + const uint64_t uncomp_size = m_levels[level_index].m_uncompressed_byte_length; + + if (((size_t)comp_size) != comp_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_level_data: Compressed data too large\n"); + return false; + } + if (((size_t)uncomp_size) != uncomp_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_level_data: Uncompressed data too large\n"); + return false; + } + + if (!uncomp_data.try_resize((size_t)uncomp_size)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_level_data: Out of memory\n"); + return false; + } + + if (m_header.m_supercompression_scheme == KTX2_SS_ZSTANDARD) + { +#if BASISD_SUPPORT_KTX2_ZSTD + size_t actualUncompSize = ZSTD_decompress(uncomp_data.data(), (size_t)uncomp_size, pComp_data, (size_t)comp_size); + if (ZSTD_isError(actualUncompSize)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_level_data: Zstd decompression failed, file is invalid or corrupted\n"); + return false; + } + if (actualUncompSize != uncomp_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_level_data: Zstd decompression returned too few bytes, file is invalid or corrupted\n"); + return false; + } +#else + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_level_data: File uses Zstd supercompression, but Zstd support was not enabled at compile time (BASISD_SUPPORT_KTX2_ZSTD is 0)\n"); + return false; +#endif + } + + return true; + } + + bool ktx2_transcoder::decompress_etc1s_global_data() + { + // Note: we don't actually support 3D textures in here yet + //uint32_t layer_pixel_depth = basisu::maximum(m_header.m_pixel_depth, 1); + //for (uint32_t i = 1; i < m_header.m_level_count; i++) + // layer_pixel_depth += basisu::maximum(m_header.m_pixel_depth >> i, 1); + + const uint32_t image_count = basisu::maximum(m_header.m_layer_count, 1) * m_header.m_face_count * m_header.m_level_count; + assert(image_count); + + const uint8_t* pSrc = m_pData + m_header.m_sgd_byte_offset; + + memcpy((void*)&m_etc1s_header, pSrc, sizeof(ktx2_etc1s_global_data_header)); + pSrc += sizeof(ktx2_etc1s_global_data_header); + + if ((!m_etc1s_header.m_endpoints_byte_length) || (!m_etc1s_header.m_selectors_byte_length) || (!m_etc1s_header.m_tables_byte_length)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: Invalid ETC1S global data\n"); + return false; + } + + if ((!m_etc1s_header.m_endpoint_count) || (!m_etc1s_header.m_selector_count)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: endpoint and/or selector count is 0, file is invalid or corrupted\n"); + return false; + } + + // Sanity check the ETC1S header. + if ((sizeof(ktx2_etc1s_global_data_header) + + sizeof(ktx2_etc1s_image_desc) * image_count + + m_etc1s_header.m_endpoints_byte_length + + m_etc1s_header.m_selectors_byte_length + + m_etc1s_header.m_tables_byte_length + + m_etc1s_header.m_extended_byte_length) > m_header.m_sgd_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: SGD byte length is too small, file is invalid or corrupted\n"); + return false; + } + + if (!m_etc1s_image_descs.try_resize(image_count)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: Out of memory\n"); + return false; + } + + memcpy((void*)m_etc1s_image_descs.data(), pSrc, sizeof(ktx2_etc1s_image_desc) * image_count); + pSrc += sizeof(ktx2_etc1s_image_desc) * image_count; + + // Sanity check the ETC1S image descs + for (uint32_t i = 0; i < image_count; i++) + { + // m_etc1s_transcoder.transcode_image() will validate the slice offsets/lengths before transcoding. + + if (!m_etc1s_image_descs[i].m_rgb_slice_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: ETC1S image descs sanity check failed (1)\n"); + return false; + } + + if (m_has_alpha) + { + if (!m_etc1s_image_descs[i].m_alpha_slice_byte_length) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: ETC1S image descs sanity check failed (2)\n"); + return false; + } + } + } + + const uint8_t* pEndpoint_data = pSrc; + const uint8_t* pSelector_data = pSrc + m_etc1s_header.m_endpoints_byte_length; + const uint8_t* pTables_data = pSrc + m_etc1s_header.m_endpoints_byte_length + m_etc1s_header.m_selectors_byte_length; + + if (!m_etc1s_transcoder.decode_tables(pTables_data, m_etc1s_header.m_tables_byte_length)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: decode_tables() failed, file is invalid or corrupted\n"); + return false; + } + + if (!m_etc1s_transcoder.decode_palettes( + m_etc1s_header.m_endpoint_count, pEndpoint_data, m_etc1s_header.m_endpoints_byte_length, + m_etc1s_header.m_selector_count, pSelector_data, m_etc1s_header.m_selectors_byte_length)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::decompress_etc1s_global_data: decode_palettes() failed, file is likely corrupted\n"); + return false; + } + + return true; + } + + bool ktx2_transcoder::read_key_values() + { + if (!m_header.m_kvd_byte_length) + { + if (m_header.m_kvd_byte_offset) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Invalid KVD byte offset (it should be zero when the length is zero)\n"); + return false; + } + + return true; + } + + if (m_header.m_kvd_byte_offset < sizeof(ktx2_header)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Invalid KVD byte offset\n"); + return false; + } + + if ((m_header.m_kvd_byte_offset + m_header.m_kvd_byte_length) > m_data_size) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Invalid KVD byte offset and/or length\n"); + return false; + } + + const uint8_t* pSrc = m_pData + m_header.m_kvd_byte_offset; + uint32_t src_left = m_header.m_kvd_byte_length; + + if (!m_key_values.try_reserve(8)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Out of memory\n"); + return false; + } + + while (src_left > sizeof(uint32_t)) + { + uint32_t l = basisu::read_le_dword(pSrc); + + pSrc += sizeof(uint32_t); + src_left -= sizeof(uint32_t); + + if (l < 2) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Failed reading key value fields (0)\n"); + return false; + } + + if (src_left < l) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Failed reading key value fields (1)\n"); + return false; + } + + if (!m_key_values.try_resize(m_key_values.size() + 1)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Out of memory\n"); + return false; + } + + basisu::uint8_vec& key_data = m_key_values.back().m_key; + basisu::uint8_vec& value_data = m_key_values.back().m_value; + + do + { + if (!l) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Failed reading key value fields (2)\n"); + return false; + } + + if (!key_data.try_push_back(*pSrc++)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Out of memory\n"); + return false; + } + + src_left--; + l--; + + } while (key_data.back()); + + if (!value_data.try_resize(l)) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Out of memory\n"); + return false; + } + + if (l) + { + memcpy(value_data.data(), pSrc, l); + pSrc += l; + src_left -= l; + } + + uint32_t ofs = (uint32_t)(pSrc - m_pData) & 3; + uint32_t alignment_bytes = (4 - ofs) & 3; + + if (src_left < alignment_bytes) + { + BASISU_DEVEL_ERROR("ktx2_transcoder::read_key_values: Failed reading key value fields (3)\n"); + return false; + } + + pSrc += alignment_bytes; + src_left -= alignment_bytes; + } + + return true; + } + +#endif // BASISD_SUPPORT_KTX2 + + bool basisu_transcoder_supports_ktx2() + { +#if BASISD_SUPPORT_KTX2 + return true; +#else + return false; +#endif + } + + bool basisu_transcoder_supports_ktx2_zstd() + { +#if BASISD_SUPPORT_KTX2_ZSTD + return true; +#else + return false; +#endif + } + +} // namespace basist diff --git a/ktx/external/basisu/transcoder/basisu_transcoder.h b/ktx/external/basisu/transcoder/basisu_transcoder.h new file mode 100644 index 0000000..3327e8d --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder.h @@ -0,0 +1,936 @@ +// basisu_transcoder.h +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// Important: If compiling with gcc, be sure strict aliasing is disabled: -fno-strict-aliasing +// +// 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. +#pragma once + +// By default KTX2 support is enabled to simplify compilation. This implies the need for the Zstandard library (which we distribute as a single source file in the "zstd" directory) by default. +// Set BASISD_SUPPORT_KTX2 to 0 to completely disable KTX2 support as well as Zstd/miniz usage which is only required for UASTC supercompression in KTX2 files. +// Also see BASISD_SUPPORT_KTX2_ZSTD in basisu_transcoder.cpp, which individually disables Zstd usage. +#ifndef BASISD_SUPPORT_KTX2 + #define BASISD_SUPPORT_KTX2 1 +#endif + +// Set BASISD_SUPPORT_KTX2_ZSTD to 0 to disable Zstd usage and KTX2 UASTC Zstd supercompression support +#ifndef BASISD_SUPPORT_KTX2_ZSTD + #define BASISD_SUPPORT_KTX2_ZSTD 1 +#endif + +// Set BASISU_FORCE_DEVEL_MESSAGES to 1 to enable debug printf()'s whenever an error occurs, for easier debugging during development. +#ifndef BASISU_FORCE_DEVEL_MESSAGES + #define BASISU_FORCE_DEVEL_MESSAGES 0 +#endif + +#include "basisu_transcoder_internal.h" +#include "basisu_transcoder_uastc.h" +#include "basisu_file_headers.h" + +namespace basist +{ + // High-level composite texture formats supported by the transcoder. + // Each of these texture formats directly correspond to OpenGL/D3D/Vulkan etc. texture formats. + // Notes: + // - If you specify a texture format that supports alpha, but the .basis file doesn't have alpha, the transcoder will automatically output a + // fully opaque (255) alpha channel. + // - The PVRTC1 texture formats only support power of 2 dimension .basis files, but this may be relaxed in a future version. + // - The PVRTC1 transcoders are real-time encoders, so don't expect the highest quality. We may add a slower encoder with improved quality. + // - These enums must be kept in sync with Javascript code that calls the transcoder. + enum class transcoder_texture_format + { + // Compressed formats + + // ETC1-2 + cTFETC1_RGB = 0, // Opaque only, returns RGB or alpha data if cDecodeFlagsTranscodeAlphaDataToOpaqueFormats flag is specified + cTFETC2_RGBA = 1, // Opaque+alpha, ETC2_EAC_A8 block followed by a ETC1 block, alpha channel will be opaque for opaque .basis files + + // BC1-5, BC7 (desktop, some mobile devices) + cTFBC1_RGB = 2, // Opaque only, no punchthrough alpha support yet, transcodes alpha slice if cDecodeFlagsTranscodeAlphaDataToOpaqueFormats flag is specified + cTFBC3_RGBA = 3, // Opaque+alpha, BC4 followed by a BC1 block, alpha channel will be opaque for opaque .basis files + cTFBC4_R = 4, // Red only, alpha slice is transcoded to output if cDecodeFlagsTranscodeAlphaDataToOpaqueFormats flag is specified + cTFBC5_RG = 5, // XY: Two BC4 blocks, X=R and Y=Alpha, .basis file should have alpha data (if not Y will be all 255's) + cTFBC7_RGBA = 6, // RGB or RGBA, mode 5 for ETC1S, modes (1,2,3,5,6,7) for UASTC + + // PVRTC1 4bpp (mobile, PowerVR devices) + cTFPVRTC1_4_RGB = 8, // Opaque only, RGB or alpha if cDecodeFlagsTranscodeAlphaDataToOpaqueFormats flag is specified, nearly lowest quality of any texture format. + cTFPVRTC1_4_RGBA = 9, // Opaque+alpha, most useful for simple opacity maps. If .basis file doesn't have alpha cTFPVRTC1_4_RGB will be used instead. Lowest quality of any supported texture format. + + // ASTC (mobile, Intel devices, hopefully all desktop GPU's one day) + cTFASTC_4x4_RGBA = 10, // Opaque+alpha, ASTC 4x4, alpha channel will be opaque for opaque .basis files. Transcoder uses RGB/RGBA/L/LA modes, void extent, and up to two ([0,47] and [0,255]) endpoint precisions. + + // ATC (mobile, Adreno devices, this is a niche format) + cTFATC_RGB = 11, // Opaque, RGB or alpha if cDecodeFlagsTranscodeAlphaDataToOpaqueFormats flag is specified. ATI ATC (GL_ATC_RGB_AMD) + cTFATC_RGBA = 12, // Opaque+alpha, alpha channel will be opaque for opaque .basis files. ATI ATC (GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD) + + // FXT1 (desktop, Intel devices, this is a super obscure format) + cTFFXT1_RGB = 17, // Opaque only, uses exclusively CC_MIXED blocks. Notable for having a 8x4 block size. GL_3DFX_texture_compression_FXT1 is supported on Intel integrated GPU's (such as HD 630). + // Punch-through alpha is relatively easy to support, but full alpha is harder. This format is only here for completeness so opaque-only is fine for now. + // See the BASISU_USE_ORIGINAL_3DFX_FXT1_ENCODING macro in basisu_transcoder_internal.h. + + cTFPVRTC2_4_RGB = 18, // Opaque-only, almost BC1 quality, much faster to transcode and supports arbitrary texture dimensions (unlike PVRTC1 RGB). + cTFPVRTC2_4_RGBA = 19, // Opaque+alpha, slower to encode than cTFPVRTC2_4_RGB. Premultiplied alpha is highly recommended, otherwise the color channel can leak into the alpha channel on transparent blocks. + + cTFETC2_EAC_R11 = 20, // R only (ETC2 EAC R11 unsigned) + cTFETC2_EAC_RG11 = 21, // RG only (ETC2 EAC RG11 unsigned), R=opaque.r, G=alpha - for tangent space normal maps + + // Uncompressed (raw pixel) formats + cTFRGBA32 = 13, // 32bpp RGBA image stored in raster (not block) order in memory, R is first byte, A is last byte. + cTFRGB565 = 14, // 16bpp RGB image stored in raster (not block) order in memory, R at bit position 11 + cTFBGR565 = 15, // 16bpp RGB image stored in raster (not block) order in memory, R at bit position 0 + cTFRGBA4444 = 16, // 16bpp RGBA image stored in raster (not block) order in memory, R at bit position 12, A at bit position 0 + + cTFTotalTextureFormats = 22, + + // Old enums for compatibility with code compiled against previous versions + cTFETC1 = cTFETC1_RGB, + cTFETC2 = cTFETC2_RGBA, + cTFBC1 = cTFBC1_RGB, + cTFBC3 = cTFBC3_RGBA, + cTFBC4 = cTFBC4_R, + cTFBC5 = cTFBC5_RG, + + // Previously, the caller had some control over which BC7 mode the transcoder output. We've simplified this due to UASTC, which supports numerous modes. + cTFBC7_M6_RGB = cTFBC7_RGBA, // Opaque only, RGB or alpha if cDecodeFlagsTranscodeAlphaDataToOpaqueFormats flag is specified. Highest quality of all the non-ETC1 formats. + cTFBC7_M5_RGBA = cTFBC7_RGBA, // Opaque+alpha, alpha channel will be opaque for opaque .basis files + cTFBC7_M6_OPAQUE_ONLY = cTFBC7_RGBA, + cTFBC7_M5 = cTFBC7_RGBA, + cTFBC7_ALT = 7, + + cTFASTC_4x4 = cTFASTC_4x4_RGBA, + + cTFATC_RGBA_INTERPOLATED_ALPHA = cTFATC_RGBA, + }; + + // For compressed texture formats, this returns the # of bytes per block. For uncompressed, it returns the # of bytes per pixel. + // NOTE: Previously, this function was called basis_get_bytes_per_block(), and it always returned 16*bytes_per_pixel for uncompressed formats which was confusing. + uint32_t basis_get_bytes_per_block_or_pixel(transcoder_texture_format fmt); + + // Returns format's name in ASCII + const char* basis_get_format_name(transcoder_texture_format fmt); + + // Returns block format name in ASCII + const char* basis_get_block_format_name(block_format fmt); + + // Returns true if the format supports an alpha channel. + bool basis_transcoder_format_has_alpha(transcoder_texture_format fmt); + + // Returns the basisu::texture_format corresponding to the specified transcoder_texture_format. + basisu::texture_format basis_get_basisu_texture_format(transcoder_texture_format fmt); + + // Returns the texture type's name in ASCII. + const char* basis_get_texture_type_name(basis_texture_type tex_type); + + // Returns true if the transcoder texture type is an uncompressed (raw pixel) format. + bool basis_transcoder_format_is_uncompressed(transcoder_texture_format tex_type); + + // Returns the # of bytes per pixel for uncompressed formats, or 0 for block texture formats. + uint32_t basis_get_uncompressed_bytes_per_pixel(transcoder_texture_format fmt); + + // Returns the block width for the specified texture format, which is currently either 4 or 8 for FXT1. + uint32_t basis_get_block_width(transcoder_texture_format tex_type); + + // Returns the block height for the specified texture format, which is currently always 4. + uint32_t basis_get_block_height(transcoder_texture_format tex_type); + + // Returns true if the specified format was enabled at compile time. + bool basis_is_format_supported(transcoder_texture_format tex_type, basis_tex_format fmt = basis_tex_format::cETC1S); + + // Validates that the output buffer is large enough to hold the entire transcoded texture. + // For uncompressed texture formats, most input parameters are in pixels, not blocks. Blocks are 4x4 pixels. + bool basis_validate_output_buffer_size(transcoder_texture_format target_format, + uint32_t output_blocks_buf_size_in_blocks_or_pixels, + uint32_t orig_width, uint32_t orig_height, + uint32_t output_row_pitch_in_blocks_or_pixels, + uint32_t output_rows_in_pixels, + uint32_t total_slice_blocks); + + class basisu_transcoder; + + // This struct holds all state used during transcoding. For video, it needs to persist between image transcodes (it holds the previous frame). + // For threading you can use one state per thread. + struct basisu_transcoder_state + { + struct block_preds + { + uint16_t m_endpoint_index; + uint8_t m_pred_bits; + }; + + basisu::vector m_block_endpoint_preds[2]; + + enum { cMaxPrevFrameLevels = 16 }; + basisu::vector m_prev_frame_indices[2][cMaxPrevFrameLevels]; // [alpha_flag][level_index] + + void clear() + { + for (uint32_t i = 0; i < 2; i++) + { + m_block_endpoint_preds[i].clear(); + + for (uint32_t j = 0; j < cMaxPrevFrameLevels; j++) + m_prev_frame_indices[i][j].clear(); + } + } + }; + + // Low-level helper class that does the actual transcoding. + class basisu_lowlevel_etc1s_transcoder + { + friend class basisu_transcoder; + + public: + basisu_lowlevel_etc1s_transcoder(); + + void set_global_codebooks(const basisu_lowlevel_etc1s_transcoder* pGlobal_codebook) { m_pGlobal_codebook = pGlobal_codebook; } + const basisu_lowlevel_etc1s_transcoder* get_global_codebooks() const { return m_pGlobal_codebook; } + + bool decode_palettes( + uint32_t num_endpoints, const uint8_t* pEndpoints_data, uint32_t endpoints_data_size, + uint32_t num_selectors, const uint8_t* pSelectors_data, uint32_t selectors_data_size); + + bool decode_tables(const uint8_t* pTable_data, uint32_t table_data_size); + + bool transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, const bool is_video, const bool is_alpha_slice, const uint32_t level_index, const uint32_t orig_width, const uint32_t orig_height, uint32_t output_row_pitch_in_blocks_or_pixels = 0, + basisu_transcoder_state* pState = nullptr, bool astc_transcode_alpha = false, void* pAlpha_blocks = nullptr, uint32_t output_rows_in_pixels = 0); + + bool transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, const basis_file_header& header, const basis_slice_desc& slice_desc, uint32_t output_row_pitch_in_blocks_or_pixels = 0, + basisu_transcoder_state* pState = nullptr, bool astc_transcode_alpha = false, void* pAlpha_blocks = nullptr, uint32_t output_rows_in_pixels = 0) + { + return transcode_slice(pDst_blocks, num_blocks_x, num_blocks_y, pImage_data, image_data_size, fmt, output_block_or_pixel_stride_in_bytes, bc1_allow_threecolor_blocks, + header.m_tex_type == cBASISTexTypeVideoFrames, (slice_desc.m_flags & cSliceDescFlagsHasAlpha) != 0, slice_desc.m_level_index, + slice_desc.m_orig_width, slice_desc.m_orig_height, output_row_pitch_in_blocks_or_pixels, pState, + astc_transcode_alpha, + pAlpha_blocks, + output_rows_in_pixels); + } + + // Container independent transcoding + bool transcode_image( + transcoder_texture_format target_format, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + const uint8_t* pCompressed_data, uint32_t compressed_data_length, + uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, + uint32_t rgb_offset, uint32_t rgb_length, uint32_t alpha_offset, uint32_t alpha_length, + uint32_t decode_flags = 0, + bool basis_file_has_alpha_slices = false, + bool is_video = false, + uint32_t output_row_pitch_in_blocks_or_pixels = 0, + basisu_transcoder_state* pState = nullptr, + uint32_t output_rows_in_pixels = 0); + + void clear() + { + m_local_endpoints.clear(); + m_local_selectors.clear(); + m_endpoint_pred_model.clear(); + m_delta_endpoint_model.clear(); + m_selector_model.clear(); + m_selector_history_buf_rle_model.clear(); + m_selector_history_buf_size = 0; + } + + // Low-level methods + typedef basisu::vector endpoint_vec; + const endpoint_vec& get_endpoints() const { return m_local_endpoints; } + + typedef basisu::vector selector_vec; + const selector_vec& get_selectors() const { return m_local_selectors; } + + private: + const basisu_lowlevel_etc1s_transcoder* m_pGlobal_codebook; + + endpoint_vec m_local_endpoints; + selector_vec m_local_selectors; + + huffman_decoding_table m_endpoint_pred_model, m_delta_endpoint_model, m_selector_model, m_selector_history_buf_rle_model; + + uint32_t m_selector_history_buf_size; + + basisu_transcoder_state m_def_state; + }; + + enum basisu_decode_flags + { + // PVRTC1: decode non-pow2 ETC1S texture level to the next larger power of 2 (not implemented yet, but we're going to support it). Ignored if the slice's dimensions are already a power of 2. + cDecodeFlagsPVRTCDecodeToNextPow2 = 2, + + // When decoding to an opaque texture format, if the basis file has alpha, decode the alpha slice instead of the color slice to the output texture format. + // This is primarily to allow decoding of textures with alpha to multiple ETC1 textures (one for color, another for alpha). + cDecodeFlagsTranscodeAlphaDataToOpaqueFormats = 4, + + // Forbid usage of BC1 3 color blocks (we don't support BC1 punchthrough alpha yet). + // This flag is used internally when decoding to BC3. + cDecodeFlagsBC1ForbidThreeColorBlocks = 8, + + // The output buffer contains alpha endpoint/selector indices. + // Used internally when decoding formats like ASTC that require both color and alpha data to be available when transcoding to the output format. + cDecodeFlagsOutputHasAlphaIndices = 16, + + cDecodeFlagsHighQuality = 32 + }; + + class basisu_lowlevel_uastc_transcoder + { + friend class basisu_transcoder; + + public: + basisu_lowlevel_uastc_transcoder(); + + bool transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, bool has_alpha, const uint32_t orig_width, const uint32_t orig_height, uint32_t output_row_pitch_in_blocks_or_pixels = 0, + basisu_transcoder_state* pState = nullptr, uint32_t output_rows_in_pixels = 0, int channel0 = -1, int channel1 = -1, uint32_t decode_flags = 0); + + bool transcode_slice(void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, const uint8_t* pImage_data, uint32_t image_data_size, block_format fmt, + uint32_t output_block_or_pixel_stride_in_bytes, bool bc1_allow_threecolor_blocks, const basis_file_header& header, const basis_slice_desc& slice_desc, uint32_t output_row_pitch_in_blocks_or_pixels = 0, + basisu_transcoder_state* pState = nullptr, uint32_t output_rows_in_pixels = 0, int channel0 = -1, int channel1 = -1, uint32_t decode_flags = 0) + { + return transcode_slice(pDst_blocks, num_blocks_x, num_blocks_y, pImage_data, image_data_size, fmt, + output_block_or_pixel_stride_in_bytes, bc1_allow_threecolor_blocks, (header.m_flags & cBASISHeaderFlagHasAlphaSlices) != 0, slice_desc.m_orig_width, slice_desc.m_orig_height, output_row_pitch_in_blocks_or_pixels, + pState, output_rows_in_pixels, channel0, channel1, decode_flags); + } + + // Container independent transcoding + bool transcode_image( + transcoder_texture_format target_format, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + const uint8_t* pCompressed_data, uint32_t compressed_data_length, + uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, + uint32_t slice_offset, uint32_t slice_length, + uint32_t decode_flags = 0, + bool has_alpha = false, + bool is_video = false, + uint32_t output_row_pitch_in_blocks_or_pixels = 0, + basisu_transcoder_state* pState = nullptr, + uint32_t output_rows_in_pixels = 0, + int channel0 = -1, int channel1 = -1); + }; + + struct basisu_slice_info + { + uint32_t m_orig_width; + uint32_t m_orig_height; + + uint32_t m_width; + uint32_t m_height; + + uint32_t m_num_blocks_x; + uint32_t m_num_blocks_y; + uint32_t m_total_blocks; + + uint32_t m_compressed_size; + + uint32_t m_slice_index; // the slice index in the .basis file + uint32_t m_image_index; // the source image index originally provided to the encoder + uint32_t m_level_index; // the mipmap level within this image + + uint32_t m_unpacked_slice_crc16; + + bool m_alpha_flag; // true if the slice has alpha data + bool m_iframe_flag; // true if the slice is an I-Frame + }; + + typedef basisu::vector basisu_slice_info_vec; + + struct basisu_image_info + { + uint32_t m_image_index; + uint32_t m_total_levels; + + uint32_t m_orig_width; + uint32_t m_orig_height; + + uint32_t m_width; + uint32_t m_height; + + uint32_t m_num_blocks_x; + uint32_t m_num_blocks_y; + uint32_t m_total_blocks; + + uint32_t m_first_slice_index; + + bool m_alpha_flag; // true if the image has alpha data + bool m_iframe_flag; // true if the image is an I-Frame + }; + + struct basisu_image_level_info + { + uint32_t m_image_index; + uint32_t m_level_index; + + uint32_t m_orig_width; + uint32_t m_orig_height; + + uint32_t m_width; + uint32_t m_height; + + uint32_t m_num_blocks_x; + uint32_t m_num_blocks_y; + uint32_t m_total_blocks; + + uint32_t m_first_slice_index; + + uint32_t m_rgb_file_ofs; + uint32_t m_rgb_file_len; + uint32_t m_alpha_file_ofs; + uint32_t m_alpha_file_len; + + bool m_alpha_flag; // true if the image has alpha data + bool m_iframe_flag; // true if the image is an I-Frame + }; + + struct basisu_file_info + { + uint32_t m_version; + uint32_t m_total_header_size; + + uint32_t m_total_selectors; + // will be 0 for UASTC or if the file uses global codebooks + uint32_t m_selector_codebook_ofs; + uint32_t m_selector_codebook_size; + + uint32_t m_total_endpoints; + // will be 0 for UASTC or if the file uses global codebooks + uint32_t m_endpoint_codebook_ofs; + uint32_t m_endpoint_codebook_size; + + uint32_t m_tables_ofs; + uint32_t m_tables_size; + + uint32_t m_slices_size; + + basis_texture_type m_tex_type; + uint32_t m_us_per_frame; + + // Low-level slice information (1 slice per image for color-only basis files, 2 for alpha basis files) + basisu_slice_info_vec m_slice_info; + + uint32_t m_total_images; // total # of images + basisu::vector m_image_mipmap_levels; // the # of mipmap levels for each image + + uint32_t m_userdata0; + uint32_t m_userdata1; + + basis_tex_format m_tex_format; // ETC1S, UASTC, etc. + + bool m_y_flipped; // true if the image was Y flipped + bool m_etc1s; // true if the file is ETC1S + bool m_has_alpha_slices; // true if the texture has alpha slices (for ETC1S: even slices RGB, odd slices alpha) + }; + + // High-level transcoder class which accepts .basis file data and allows the caller to query information about the file and transcode image levels to various texture formats. + // If you're just starting out this is the class you care about. + class basisu_transcoder + { + basisu_transcoder(basisu_transcoder&); + basisu_transcoder& operator= (const basisu_transcoder&); + + public: + basisu_transcoder(); + + // Validates the .basis file. This computes a crc16 over the entire file, so it's slow. + bool validate_file_checksums(const void* pData, uint32_t data_size, bool full_validation) const; + + // Quick header validation - no crc16 checks. + bool validate_header(const void* pData, uint32_t data_size) const; + + basis_texture_type get_texture_type(const void* pData, uint32_t data_size) const; + bool get_userdata(const void* pData, uint32_t data_size, uint32_t& userdata0, uint32_t& userdata1) const; + + // Returns the total number of images in the basis file (always 1 or more). + // Note that the number of mipmap levels for each image may differ, and that images may have different resolutions. + uint32_t get_total_images(const void* pData, uint32_t data_size) const; + + basis_tex_format get_tex_format(const void* pData, uint32_t data_size) const; + + // Returns the number of mipmap levels in an image. + uint32_t get_total_image_levels(const void* pData, uint32_t data_size, uint32_t image_index) const; + + // Returns basic information about an image. Note that orig_width/orig_height may not be a multiple of 4. + bool get_image_level_desc(const void* pData, uint32_t data_size, uint32_t image_index, uint32_t level_index, uint32_t& orig_width, uint32_t& orig_height, uint32_t& total_blocks) const; + + // Returns information about the specified image. + bool get_image_info(const void* pData, uint32_t data_size, basisu_image_info& image_info, uint32_t image_index) const; + + // Returns information about the specified image's mipmap level. + bool get_image_level_info(const void* pData, uint32_t data_size, basisu_image_level_info& level_info, uint32_t image_index, uint32_t level_index) const; + + // Get a description of the basis file and low-level information about each slice. + bool get_file_info(const void* pData, uint32_t data_size, basisu_file_info& file_info) const; + + // start_transcoding() must be called before calling transcode_slice() or transcode_image_level(). + // For ETC1S files, this call decompresses the selector/endpoint codebooks, so ideally you would only call this once per .basis file (not each image/mipmap level). + bool start_transcoding(const void* pData, uint32_t data_size); + + bool stop_transcoding(); + + // Returns true if start_transcoding() has been called. + bool get_ready_to_transcode() const { return m_ready_to_transcode; } + + // transcode_image_level() decodes a single mipmap level from the .basis file to any of the supported output texture formats. + // It'll first find the slice(s) to transcode, then call transcode_slice() one or two times to decode both the color and alpha texture data (or RG texture data from two slices for BC5). + // If the .basis file doesn't have alpha slices, the output alpha blocks will be set to fully opaque (all 255's). + // Currently, to decode to PVRTC1 the basis texture's dimensions in pixels must be a power of 2, due to PVRTC1 format requirements. + // output_blocks_buf_size_in_blocks_or_pixels should be at least the image level's total_blocks (num_blocks_x * num_blocks_y), or the total number of output pixels if fmt==cTFRGBA32. + // output_row_pitch_in_blocks_or_pixels: Number of blocks or pixels per row. If 0, the transcoder uses the slice's num_blocks_x or orig_width (NOT num_blocks_x * 4). Ignored for PVRTC1 (due to texture swizzling). + // output_rows_in_pixels: Ignored unless fmt is uncompressed (cRGBA32, etc.). The total number of output rows in the output buffer. If 0, the transcoder assumes the slice's orig_height (NOT num_blocks_y * 4). + // Notes: + // - basisu_transcoder_init() must have been called first to initialize the transcoder lookup tables before calling this function. + // - This method assumes the output texture buffer is readable. In some cases to handle alpha, the transcoder will write temporary data to the output texture in + // a first pass, which will be read in a second pass. + bool transcode_image_level( + const void* pData, uint32_t data_size, + uint32_t image_index, uint32_t level_index, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + transcoder_texture_format fmt, + uint32_t decode_flags = 0, uint32_t output_row_pitch_in_blocks_or_pixels = 0, basisu_transcoder_state* pState = nullptr, uint32_t output_rows_in_pixels = 0) const; + + // Finds the basis slice corresponding to the specified image/level/alpha params, or -1 if the slice can't be found. + int find_slice(const void* pData, uint32_t data_size, uint32_t image_index, uint32_t level_index, bool alpha_data) const; + + // transcode_slice() decodes a single slice from the .basis file. It's a low-level API - most likely you want to use transcode_image_level(). + // This is a low-level API, and will be needed to be called multiple times to decode some texture formats (like BC3, BC5, or ETC2). + // output_blocks_buf_size_in_blocks_or_pixels is just used for verification to make sure the output buffer is large enough. + // output_blocks_buf_size_in_blocks_or_pixels should be at least the image level's total_blocks (num_blocks_x * num_blocks_y), or the total number of output pixels if fmt==cTFRGBA32. + // output_block_stride_in_bytes: Number of bytes between each output block. + // output_row_pitch_in_blocks_or_pixels: Number of blocks or pixels per row. If 0, the transcoder uses the slice's num_blocks_x or orig_width (NOT num_blocks_x * 4). Ignored for PVRTC1 (due to texture swizzling). + // output_rows_in_pixels: Ignored unless fmt is cRGBA32. The total number of output rows in the output buffer. If 0, the transcoder assumes the slice's orig_height (NOT num_blocks_y * 4). + // Notes: + // - basisu_transcoder_init() must have been called first to initialize the transcoder lookup tables before calling this function. + bool transcode_slice(const void* pData, uint32_t data_size, uint32_t slice_index, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + block_format fmt, uint32_t output_block_stride_in_bytes, uint32_t decode_flags = 0, uint32_t output_row_pitch_in_blocks_or_pixels = 0, basisu_transcoder_state* pState = nullptr, void* pAlpha_blocks = nullptr, + uint32_t output_rows_in_pixels = 0, int channel0 = -1, int channel1 = -1) const; + + static void write_opaque_alpha_blocks( + uint32_t num_blocks_x, uint32_t num_blocks_y, + void* pOutput_blocks, block_format fmt, + uint32_t block_stride_in_bytes, uint32_t output_row_pitch_in_blocks_or_pixels); + + void set_global_codebooks(const basisu_lowlevel_etc1s_transcoder* pGlobal_codebook) { m_lowlevel_etc1s_decoder.set_global_codebooks(pGlobal_codebook); } + const basisu_lowlevel_etc1s_transcoder* get_global_codebooks() const { return m_lowlevel_etc1s_decoder.get_global_codebooks(); } + + const basisu_lowlevel_etc1s_transcoder& get_lowlevel_etc1s_decoder() const { return m_lowlevel_etc1s_decoder; } + basisu_lowlevel_etc1s_transcoder& get_lowlevel_etc1s_decoder() { return m_lowlevel_etc1s_decoder; } + + const basisu_lowlevel_uastc_transcoder& get_lowlevel_uastc_decoder() const { return m_lowlevel_uastc_decoder; } + basisu_lowlevel_uastc_transcoder& get_lowlevel_uastc_decoder() { return m_lowlevel_uastc_decoder; } + + private: + mutable basisu_lowlevel_etc1s_transcoder m_lowlevel_etc1s_decoder; + mutable basisu_lowlevel_uastc_transcoder m_lowlevel_uastc_decoder; + + bool m_ready_to_transcode; + + int find_first_slice_index(const void* pData, uint32_t data_size, uint32_t image_index, uint32_t level_index) const; + + bool validate_header_quick(const void* pData, uint32_t data_size) const; + }; + + // basisu_transcoder_init() MUST be called before a .basis file can be transcoded. + void basisu_transcoder_init(); + + enum debug_flags_t + { + cDebugFlagVisCRs = 1, + cDebugFlagVisBC1Sels = 2, + cDebugFlagVisBC1Endpoints = 4 + }; + uint32_t get_debug_flags(); + void set_debug_flags(uint32_t f); + + // ------------------------------------------------------------------------------------------------------ + // Optional .KTX2 file format support + // KTX2 reading optionally requires miniz or Zstd decompressors for supercompressed UASTC files. + // ------------------------------------------------------------------------------------------------------ +#if BASISD_SUPPORT_KTX2 +#pragma pack(push) +#pragma pack(1) + struct ktx2_header + { + uint8_t m_identifier[12]; + basisu::packed_uint<4> m_vk_format; + basisu::packed_uint<4> m_type_size; + basisu::packed_uint<4> m_pixel_width; + basisu::packed_uint<4> m_pixel_height; + basisu::packed_uint<4> m_pixel_depth; + basisu::packed_uint<4> m_layer_count; + basisu::packed_uint<4> m_face_count; + basisu::packed_uint<4> m_level_count; + basisu::packed_uint<4> m_supercompression_scheme; + basisu::packed_uint<4> m_dfd_byte_offset; + basisu::packed_uint<4> m_dfd_byte_length; + basisu::packed_uint<4> m_kvd_byte_offset; + basisu::packed_uint<4> m_kvd_byte_length; + basisu::packed_uint<8> m_sgd_byte_offset; + basisu::packed_uint<8> m_sgd_byte_length; + }; + + struct ktx2_level_index + { + basisu::packed_uint<8> m_byte_offset; + basisu::packed_uint<8> m_byte_length; + basisu::packed_uint<8> m_uncompressed_byte_length; + }; + + struct ktx2_etc1s_global_data_header + { + basisu::packed_uint<2> m_endpoint_count; + basisu::packed_uint<2> m_selector_count; + basisu::packed_uint<4> m_endpoints_byte_length; + basisu::packed_uint<4> m_selectors_byte_length; + basisu::packed_uint<4> m_tables_byte_length; + basisu::packed_uint<4> m_extended_byte_length; + }; + + struct ktx2_etc1s_image_desc + { + basisu::packed_uint<4> m_image_flags; + basisu::packed_uint<4> m_rgb_slice_byte_offset; + basisu::packed_uint<4> m_rgb_slice_byte_length; + basisu::packed_uint<4> m_alpha_slice_byte_offset; + basisu::packed_uint<4> m_alpha_slice_byte_length; + }; + + struct ktx2_animdata + { + basisu::packed_uint<4> m_duration; + basisu::packed_uint<4> m_timescale; + basisu::packed_uint<4> m_loopcount; + }; +#pragma pack(pop) + + const uint32_t KTX2_VK_FORMAT_UNDEFINED = 0; + const uint32_t KTX2_KDF_DF_MODEL_UASTC = 166; + const uint32_t KTX2_KDF_DF_MODEL_ETC1S = 163; + const uint32_t KTX2_IMAGE_IS_P_FRAME = 2; + const uint32_t KTX2_UASTC_BLOCK_SIZE = 16; + const uint32_t KTX2_MAX_SUPPORTED_LEVEL_COUNT = 16; // this is an implementation specific constraint and can be increased + + // The KTX2 transfer functions supported by KTX2 + const uint32_t KTX2_KHR_DF_TRANSFER_LINEAR = 1; + const uint32_t KTX2_KHR_DF_TRANSFER_SRGB = 2; + + enum ktx2_supercompression + { + KTX2_SS_NONE = 0, + KTX2_SS_BASISLZ = 1, + KTX2_SS_ZSTANDARD = 2 + }; + + extern const uint8_t g_ktx2_file_identifier[12]; + + enum ktx2_df_channel_id + { + KTX2_DF_CHANNEL_ETC1S_RGB = 0U, + KTX2_DF_CHANNEL_ETC1S_RRR = 3U, + KTX2_DF_CHANNEL_ETC1S_GGG = 4U, + KTX2_DF_CHANNEL_ETC1S_AAA = 15U, + + KTX2_DF_CHANNEL_UASTC_DATA = 0U, + KTX2_DF_CHANNEL_UASTC_RGB = 0U, + KTX2_DF_CHANNEL_UASTC_RGBA = 3U, + KTX2_DF_CHANNEL_UASTC_RRR = 4U, + KTX2_DF_CHANNEL_UASTC_RRRG = 5U, + KTX2_DF_CHANNEL_UASTC_RG = 6U, + }; + + inline const char* ktx2_get_etc1s_df_channel_id_str(ktx2_df_channel_id id) + { + switch (id) + { + case KTX2_DF_CHANNEL_ETC1S_RGB: return "RGB"; + case KTX2_DF_CHANNEL_ETC1S_RRR: return "RRR"; + case KTX2_DF_CHANNEL_ETC1S_GGG: return "GGG"; + case KTX2_DF_CHANNEL_ETC1S_AAA: return "AAA"; + default: break; + } + return "?"; + } + + inline const char* ktx2_get_uastc_df_channel_id_str(ktx2_df_channel_id id) + { + switch (id) + { + case KTX2_DF_CHANNEL_UASTC_RGB: return "RGB"; + case KTX2_DF_CHANNEL_UASTC_RGBA: return "RGBA"; + case KTX2_DF_CHANNEL_UASTC_RRR: return "RRR"; + case KTX2_DF_CHANNEL_UASTC_RRRG: return "RRRG"; + case KTX2_DF_CHANNEL_UASTC_RG: return "RG"; + default: break; + } + return "?"; + } + + enum ktx2_df_color_primaries + { + KTX2_DF_PRIMARIES_UNSPECIFIED = 0, + KTX2_DF_PRIMARIES_BT709 = 1, + KTX2_DF_PRIMARIES_SRGB = 1, + KTX2_DF_PRIMARIES_BT601_EBU = 2, + KTX2_DF_PRIMARIES_BT601_SMPTE = 3, + KTX2_DF_PRIMARIES_BT2020 = 4, + KTX2_DF_PRIMARIES_CIEXYZ = 5, + KTX2_DF_PRIMARIES_ACES = 6, + KTX2_DF_PRIMARIES_ACESCC = 7, + KTX2_DF_PRIMARIES_NTSC1953 = 8, + KTX2_DF_PRIMARIES_PAL525 = 9, + KTX2_DF_PRIMARIES_DISPLAYP3 = 10, + KTX2_DF_PRIMARIES_ADOBERGB = 11 + }; + + inline const char* ktx2_get_df_color_primaries_str(ktx2_df_color_primaries p) + { + switch (p) + { + case KTX2_DF_PRIMARIES_UNSPECIFIED: return "UNSPECIFIED"; + case KTX2_DF_PRIMARIES_BT709: return "BT709"; + case KTX2_DF_PRIMARIES_BT601_EBU: return "EBU"; + case KTX2_DF_PRIMARIES_BT601_SMPTE: return "SMPTE"; + case KTX2_DF_PRIMARIES_BT2020: return "BT2020"; + case KTX2_DF_PRIMARIES_CIEXYZ: return "CIEXYZ"; + case KTX2_DF_PRIMARIES_ACES: return "ACES"; + case KTX2_DF_PRIMARIES_ACESCC: return "ACESCC"; + case KTX2_DF_PRIMARIES_NTSC1953: return "NTSC1953"; + case KTX2_DF_PRIMARIES_PAL525: return "PAL525"; + case KTX2_DF_PRIMARIES_DISPLAYP3: return "DISPLAYP3"; + case KTX2_DF_PRIMARIES_ADOBERGB: return "ADOBERGB"; + default: break; + } + return "?"; + } + + // Information about a single 2D texture "image" in a KTX2 file. + struct ktx2_image_level_info + { + // The mipmap level index (0=largest), texture array layer index, and cubemap face index of the image. + uint32_t m_level_index; + uint32_t m_layer_index; + uint32_t m_face_index; + + // The image's actual (or the original source image's) width/height in pixels, which may not be divisible by 4 pixels. + uint32_t m_orig_width; + uint32_t m_orig_height; + + // The image's physical width/height, which will always be divisible by 4 pixels. + uint32_t m_width; + uint32_t m_height; + + // The texture's dimensions in 4x4 texel blocks. + uint32_t m_num_blocks_x; + uint32_t m_num_blocks_y; + + // The total number of blocks + uint32_t m_total_blocks; + + // true if the image has alpha data + bool m_alpha_flag; + + // true if the image is an I-Frame. Currently, for ETC1S textures, the first frame will always be an I-Frame, and subsequent frames will always be P-Frames. + bool m_iframe_flag; + }; + + // Thread-specific ETC1S/supercompressed UASTC transcoder state. (If you're not doing multithreading transcoding you can ignore this.) + struct ktx2_transcoder_state + { + basist::basisu_transcoder_state m_transcoder_state; + basisu::uint8_vec m_level_uncomp_data; + int m_uncomp_data_level_index; + + void clear() + { + m_transcoder_state.clear(); + m_level_uncomp_data.clear(); + m_uncomp_data_level_index = -1; + } + }; + + // This class is quite similar to basisu_transcoder. It treats KTX2 files as a simple container for ETC1S/UASTC texture data. + // It does not support 1D or 3D textures. + // It only supports 2D and cubemap textures, with or without mipmaps, texture arrays of 2D/cubemap textures, and texture video files. + // It only supports raw non-supercompressed UASTC, ETC1S, UASTC+Zstd, or UASTC+zlib compressed files. + // DFD (Data Format Descriptor) parsing is purposely as simple as possible. + // If you need to know how to interpret the texture channels you'll need to parse the DFD yourself after calling get_dfd(). + class ktx2_transcoder + { + public: + ktx2_transcoder(); + + // Frees all allocations, resets object. + void clear(); + + // init() parses the KTX2 header, level index array, DFD, and key values, but nothing else. + // Importantly, it does not parse or decompress the ETC1S global supercompressed data, so some things (like which frames are I/P-Frames) won't be available until start_transcoding() is called. + // This method holds a pointer to the file data until clear() is called. + bool init(const void* pData, uint32_t data_size); + + // Returns the data/size passed to init(). + const uint8_t* get_data() const { return m_pData; } + uint32_t get_data_size() const { return m_data_size; } + + // Returns the KTX2 header. Valid after init(). + const ktx2_header& get_header() const { return m_header; } + + // Returns the KTX2 level index array. There will be one entry for each mipmap level. Valid after init(). + const basisu::vector& get_level_index() const { return m_levels; } + + // Returns the texture's width in texels. Always non-zero, might not be divisible by 4. Valid after init(). + uint32_t get_width() const { return m_header.m_pixel_width; } + + // Returns the texture's height in texels. Always non-zero, might not be divisible by 4. Valid after init(). + uint32_t get_height() const { return m_header.m_pixel_height; } + + // Returns the texture's number of mipmap levels. Always returns 1 or higher. Valid after init(). + uint32_t get_levels() const { return m_header.m_level_count; } + + // Returns the number of faces. Returns 1 for 2D textures and or 6 for cubemaps. Valid after init(). + uint32_t get_faces() const { return m_header.m_face_count; } + + // Returns 0 or the number of layers in the texture array or texture video. Valid after init(). + uint32_t get_layers() const { return m_header.m_layer_count; } + + // Returns cETC1S or cUASTC4x4. Valid after init(). + basist::basis_tex_format get_format() const { return m_format; } + + bool is_etc1s() const { return get_format() == basist::basis_tex_format::cETC1S; } + + bool is_uastc() const { return get_format() == basist::basis_tex_format::cUASTC4x4; } + + // Returns true if the ETC1S file has two planes (typically RGBA, or RRRG), or true if the UASTC file has alpha data. Valid after init(). + uint32_t get_has_alpha() const { return m_has_alpha; } + + // Returns the entire Data Format Descriptor (DFD) from the KTX2 file. Valid after init(). + // See https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html#_the_khronos_data_format_descriptor_overview + const basisu::uint8_vec& get_dfd() const { return m_dfd; } + + // Some basic DFD accessors. Valid after init(). + uint32_t get_dfd_color_model() const { return m_dfd_color_model; } + + // Returns the DFD color primary. + // We do not validate the color primaries, so the returned value may not be in the ktx2_df_color_primaries enum. + ktx2_df_color_primaries get_dfd_color_primaries() const { return m_dfd_color_prims; } + + // Returns KTX2_KHR_DF_TRANSFER_LINEAR or KTX2_KHR_DF_TRANSFER_SRGB. + uint32_t get_dfd_transfer_func() const { return m_dfd_transfer_func; } + + uint32_t get_dfd_flags() const { return m_dfd_flags; } + + // Returns 1 (ETC1S/UASTC) or 2 (ETC1S with an internal alpha channel). + uint32_t get_dfd_total_samples() const { return m_dfd_samples; } + + // Returns the channel mapping for each DFD "sample". UASTC always has 1 sample, ETC1S can have one or two. + // Note the returned value SHOULD be one of the ktx2_df_channel_id enums, but we don't validate that. + // It's up to the caller to decide what to do if the value isn't in the enum. + ktx2_df_channel_id get_dfd_channel_id0() const { return m_dfd_chan0; } + ktx2_df_channel_id get_dfd_channel_id1() const { return m_dfd_chan1; } + + // Key value field data. + struct key_value + { + // The key field is UTF8 and always zero terminated. + basisu::uint8_vec m_key; + + // The value may be empty. It consists of raw bytes which may or may not be zero terminated. + basisu::uint8_vec m_value; + + bool operator< (const key_value& rhs) const { return strcmp((const char*)m_key.data(), (const char *)rhs.m_key.data()) < 0; } + }; + typedef basisu::vector key_value_vec; + + // Returns the array of key-value entries. This may be empty. Valid after init(). + // The order of key values fields in this array exactly matches the order they were stored in the file. The keys are supposed to be sorted by their Unicode code points. + const key_value_vec& get_key_values() const { return m_key_values; } + + const basisu::uint8_vec *find_key(const std::string& key_name) const; + + // Low-level ETC1S specific accessors + + // Returns the ETC1S global supercompression data header, which is only valid after start_transcoding() is called. + const ktx2_etc1s_global_data_header& get_etc1s_header() const { return m_etc1s_header; } + + // Returns the array of ETC1S image descriptors, which is only valid after get_etc1s_image_descs() is called. + const basisu::vector& get_etc1s_image_descs() const { return m_etc1s_image_descs; } + + // Must have called startTranscoding() first + uint32_t get_etc1s_image_descs_image_flags(uint32_t level_index, uint32_t layer_index, uint32_t face_index) const; + + // is_video() is only valid after start_transcoding() is called. + // For ETC1S data, if this returns true you must currently transcode the file from first to last frame, in order, without skipping any frames. + bool is_video() const { return m_is_video; } + + // start_transcoding() MUST be called before calling transcode_image(). + // This method decompresses the ETC1S global endpoint/selector codebooks, which is not free, so try to avoid calling it excessively. + bool start_transcoding(); + + // get_image_level_info() be called after init(), but the m_iframe_flag's won't be valid until start_transcoding() is called. + // You can call this method before calling transcode_image_level() to retrieve basic information about the mipmap level's dimensions, etc. + bool get_image_level_info(ktx2_image_level_info& level_info, uint32_t level_index, uint32_t layer_index, uint32_t face_index) const; + + // transcode_image_level() transcodes a single 2D texture or cubemap face from the KTX2 file. + // Internally it uses the same low-level transcode API's as basisu_transcoder::transcode_image_level(). + // If the file is UASTC and is supercompressed with Zstandard, and the file is a texture array or cubemap, it's highly recommended that each mipmap level is + // completely transcoded before switching to another level. Every time the mipmap level is changed all supercompressed level data must be decompressed using Zstandard as a single unit. + // Currently ETC1S videos must always be transcoded from first to last frame (or KTX2 "layer"), in order, with no skipping of frames. + // By default this method is not thread safe unless you specify a pointer to a user allocated thread-specific transcoder_state struct. + bool transcode_image_level( + uint32_t level_index, uint32_t layer_index, uint32_t face_index, + void* pOutput_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + basist::transcoder_texture_format fmt, + uint32_t decode_flags = 0, uint32_t output_row_pitch_in_blocks_or_pixels = 0, uint32_t output_rows_in_pixels = 0, int channel0 = -1, int channel1 = -1, + ktx2_transcoder_state *pState = nullptr); + + private: + const uint8_t* m_pData; + uint32_t m_data_size; + + ktx2_header m_header; + basisu::vector m_levels; + basisu::uint8_vec m_dfd; + key_value_vec m_key_values; + + ktx2_etc1s_global_data_header m_etc1s_header; + basisu::vector m_etc1s_image_descs; + + basist::basis_tex_format m_format; + + uint32_t m_dfd_color_model; + ktx2_df_color_primaries m_dfd_color_prims; + uint32_t m_dfd_transfer_func; + uint32_t m_dfd_flags; + uint32_t m_dfd_samples; + ktx2_df_channel_id m_dfd_chan0, m_dfd_chan1; + + basist::basisu_lowlevel_etc1s_transcoder m_etc1s_transcoder; + basist::basisu_lowlevel_uastc_transcoder m_uastc_transcoder; + + ktx2_transcoder_state m_def_transcoder_state; + + bool m_has_alpha; + bool m_is_video; + + bool decompress_level_data(uint32_t level_index, basisu::uint8_vec& uncomp_data); + bool decompress_etc1s_global_data(); + bool read_key_values(); + }; + +#endif // BASISD_SUPPORT_KTX2 + + // Returns true if the transcoder was compiled with KTX2 support. + bool basisu_transcoder_supports_ktx2(); + + // Returns true if the transcoder was compiled with Zstandard support. + bool basisu_transcoder_supports_ktx2_zstd(); + +} // namespace basisu + diff --git a/ktx/external/basisu/transcoder/basisu_transcoder_internal.h b/ktx/external/basisu/transcoder/basisu_transcoder_internal.h new file mode 100644 index 0000000..776a998 --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder_internal.h @@ -0,0 +1,796 @@ +// basisu_transcoder_internal.h - Universal texture format transcoder library. +// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved. +// +// Important: If compiling with gcc, be sure strict aliasing is disabled: -fno-strict-aliasing +// +// 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. +#pragma once + +#ifdef _MSC_VER +#pragma warning (disable: 4127) // conditional expression is constant +#endif + +#define BASISD_LIB_VERSION 116 +#define BASISD_VERSION_STRING "01.16" + +#ifdef _DEBUG +#define BASISD_BUILD_DEBUG +#else +#define BASISD_BUILD_RELEASE +#endif + +#include "basisu.h" + +#define BASISD_znew (z = 36969 * (z & 65535) + (z >> 16)) + +namespace basisu +{ + extern bool g_debug_printf; +} + +namespace basist +{ + // Low-level formats directly supported by the transcoder (other supported texture formats are combinations of these low-level block formats). + // You probably don't care about these enum's unless you are going pretty low-level and calling the transcoder to decode individual slices. + enum class block_format + { + cETC1, // ETC1S RGB + cETC2_RGBA, // full ETC2 EAC RGBA8 block + cBC1, // DXT1 RGB + cBC3, // BC4 block followed by a four color BC1 block + cBC4, // DXT5A (alpha block only) + cBC5, // two BC4 blocks + cPVRTC1_4_RGB, // opaque-only PVRTC1 4bpp + cPVRTC1_4_RGBA, // PVRTC1 4bpp RGBA + cBC7, // Full BC7 block, any mode + cBC7_M5_COLOR, // RGB BC7 mode 5 color (writes an opaque mode 5 block) + cBC7_M5_ALPHA, // alpha portion of BC7 mode 5 (cBC7_M5_COLOR output data must have been written to the output buffer first to set the mode/rot fields etc.) + cETC2_EAC_A8, // alpha block of ETC2 EAC (first 8 bytes of the 16-bit ETC2 EAC RGBA format) + cASTC_4x4, // ASTC 4x4 (either color-only or color+alpha). Note that the transcoder always currently assumes sRGB is not enabled when outputting ASTC + // data. If you use a sRGB ASTC format you'll get ~1 LSB of additional error, because of the different way ASTC decoders scale 8-bit endpoints to 16-bits during unpacking. + + cATC_RGB, + cATC_RGBA_INTERPOLATED_ALPHA, + cFXT1_RGB, // Opaque-only, has oddball 8x4 pixel block size + + cPVRTC2_4_RGB, + cPVRTC2_4_RGBA, + + cETC2_EAC_R11, + cETC2_EAC_RG11, + + cIndices, // Used internally: Write 16-bit endpoint and selector indices directly to output (output block must be at least 32-bits) + + cRGB32, // Writes RGB components to 32bpp output pixels + cRGBA32, // Writes RGB255 components to 32bpp output pixels + cA32, // Writes alpha component to 32bpp output pixels + + cRGB565, + cBGR565, + + cRGBA4444_COLOR, + cRGBA4444_ALPHA, + cRGBA4444_COLOR_OPAQUE, + cRGBA4444, + + cUASTC_4x4, + + cTotalBlockFormats + }; + + const int COLOR5_PAL0_PREV_HI = 9, COLOR5_PAL0_DELTA_LO = -9, COLOR5_PAL0_DELTA_HI = 31; + const int COLOR5_PAL1_PREV_HI = 21, COLOR5_PAL1_DELTA_LO = -21, COLOR5_PAL1_DELTA_HI = 21; + const int COLOR5_PAL2_PREV_HI = 31, COLOR5_PAL2_DELTA_LO = -31, COLOR5_PAL2_DELTA_HI = 9; + const int COLOR5_PAL_MIN_DELTA_B_RUNLEN = 3, COLOR5_PAL_DELTA_5_RUNLEN_VLC_BITS = 3; + + const uint32_t ENDPOINT_PRED_TOTAL_SYMBOLS = (4 * 4 * 4 * 4) + 1; + const uint32_t ENDPOINT_PRED_REPEAT_LAST_SYMBOL = ENDPOINT_PRED_TOTAL_SYMBOLS - 1; + const uint32_t ENDPOINT_PRED_MIN_REPEAT_COUNT = 3; + const uint32_t ENDPOINT_PRED_COUNT_VLC_BITS = 4; + + const uint32_t NUM_ENDPOINT_PREDS = 3;// BASISU_ARRAY_SIZE(g_endpoint_preds); + const uint32_t CR_ENDPOINT_PRED_INDEX = NUM_ENDPOINT_PREDS - 1; + const uint32_t NO_ENDPOINT_PRED_INDEX = 3;//NUM_ENDPOINT_PREDS; + const uint32_t MAX_SELECTOR_HISTORY_BUF_SIZE = 64; + const uint32_t SELECTOR_HISTORY_BUF_RLE_COUNT_THRESH = 3; + const uint32_t SELECTOR_HISTORY_BUF_RLE_COUNT_BITS = 6; + const uint32_t SELECTOR_HISTORY_BUF_RLE_COUNT_TOTAL = (1 << SELECTOR_HISTORY_BUF_RLE_COUNT_BITS); + + uint16_t crc16(const void *r, size_t size, uint16_t crc); + + class huffman_decoding_table + { + friend class bitwise_decoder; + + public: + huffman_decoding_table() + { + } + + void clear() + { + basisu::clear_vector(m_code_sizes); + basisu::clear_vector(m_lookup); + basisu::clear_vector(m_tree); + } + + bool init(uint32_t total_syms, const uint8_t *pCode_sizes, uint32_t fast_lookup_bits = basisu::cHuffmanFastLookupBits) + { + if (!total_syms) + { + clear(); + return true; + } + + m_code_sizes.resize(total_syms); + memcpy(&m_code_sizes[0], pCode_sizes, total_syms); + + const uint32_t huffman_fast_lookup_size = 1 << fast_lookup_bits; + + m_lookup.resize(0); + m_lookup.resize(huffman_fast_lookup_size); + + m_tree.resize(0); + m_tree.resize(total_syms * 2); + + uint32_t syms_using_codesize[basisu::cHuffmanMaxSupportedInternalCodeSize + 1]; + basisu::clear_obj(syms_using_codesize); + for (uint32_t i = 0; i < total_syms; i++) + { + if (pCode_sizes[i] > basisu::cHuffmanMaxSupportedInternalCodeSize) + return false; + syms_using_codesize[pCode_sizes[i]]++; + } + + uint32_t next_code[basisu::cHuffmanMaxSupportedInternalCodeSize + 1]; + next_code[0] = next_code[1] = 0; + + uint32_t used_syms = 0, total = 0; + for (uint32_t i = 1; i < basisu::cHuffmanMaxSupportedInternalCodeSize; i++) + { + used_syms += syms_using_codesize[i]; + next_code[i + 1] = (total = ((total + syms_using_codesize[i]) << 1)); + } + + if (((1U << basisu::cHuffmanMaxSupportedInternalCodeSize) != total) && (used_syms > 1U)) + return false; + + for (int tree_next = -1, sym_index = 0; sym_index < (int)total_syms; ++sym_index) + { + uint32_t rev_code = 0, l, cur_code, code_size = pCode_sizes[sym_index]; + if (!code_size) + continue; + + cur_code = next_code[code_size]++; + + for (l = code_size; l > 0; l--, cur_code >>= 1) + rev_code = (rev_code << 1) | (cur_code & 1); + + if (code_size <= fast_lookup_bits) + { + uint32_t k = (code_size << 16) | sym_index; + while (rev_code < huffman_fast_lookup_size) + { + if (m_lookup[rev_code] != 0) + { + // Supplied codesizes can't create a valid prefix code. + return false; + } + + m_lookup[rev_code] = k; + rev_code += (1 << code_size); + } + continue; + } + + int tree_cur; + if (0 == (tree_cur = m_lookup[rev_code & (huffman_fast_lookup_size - 1)])) + { + const uint32_t idx = rev_code & (huffman_fast_lookup_size - 1); + if (m_lookup[idx] != 0) + { + // Supplied codesizes can't create a valid prefix code. + return false; + } + + m_lookup[idx] = tree_next; + tree_cur = tree_next; + tree_next -= 2; + } + + if (tree_cur >= 0) + { + // Supplied codesizes can't create a valid prefix code. + return false; + } + + rev_code >>= (fast_lookup_bits - 1); + + for (int j = code_size; j > ((int)fast_lookup_bits + 1); j--) + { + tree_cur -= ((rev_code >>= 1) & 1); + + const int idx = -tree_cur - 1; + if (idx < 0) + return false; + else if (idx >= (int)m_tree.size()) + m_tree.resize(idx + 1); + + if (!m_tree[idx]) + { + m_tree[idx] = (int16_t)tree_next; + tree_cur = tree_next; + tree_next -= 2; + } + else + { + tree_cur = m_tree[idx]; + if (tree_cur >= 0) + { + // Supplied codesizes can't create a valid prefix code. + return false; + } + } + } + + tree_cur -= ((rev_code >>= 1) & 1); + + const int idx = -tree_cur - 1; + if (idx < 0) + return false; + else if (idx >= (int)m_tree.size()) + m_tree.resize(idx + 1); + + if (m_tree[idx] != 0) + { + // Supplied codesizes can't create a valid prefix code. + return false; + } + + m_tree[idx] = (int16_t)sym_index; + } + + return true; + } + + const basisu::uint8_vec &get_code_sizes() const { return m_code_sizes; } + const basisu::int_vec get_lookup() const { return m_lookup; } + const basisu::int16_vec get_tree() const { return m_tree; } + + bool is_valid() const { return m_code_sizes.size() > 0; } + + private: + basisu::uint8_vec m_code_sizes; + basisu::int_vec m_lookup; + basisu::int16_vec m_tree; + }; + + class bitwise_decoder + { + public: + bitwise_decoder() : + m_buf_size(0), + m_pBuf(nullptr), + m_pBuf_start(nullptr), + m_pBuf_end(nullptr), + m_bit_buf(0), + m_bit_buf_size(0) + { + } + + void clear() + { + m_buf_size = 0; + m_pBuf = nullptr; + m_pBuf_start = nullptr; + m_pBuf_end = nullptr; + m_bit_buf = 0; + m_bit_buf_size = 0; + } + + bool init(const uint8_t *pBuf, uint32_t buf_size) + { + if ((!pBuf) && (buf_size)) + return false; + + m_buf_size = buf_size; + m_pBuf = pBuf; + m_pBuf_start = pBuf; + m_pBuf_end = pBuf + buf_size; + m_bit_buf = 0; + m_bit_buf_size = 0; + return true; + } + + void stop() + { + } + + inline uint32_t peek_bits(uint32_t num_bits) + { + if (!num_bits) + return 0; + + assert(num_bits <= 25); + + while (m_bit_buf_size < num_bits) + { + uint32_t c = 0; + if (m_pBuf < m_pBuf_end) + c = *m_pBuf++; + + m_bit_buf |= (c << m_bit_buf_size); + m_bit_buf_size += 8; + assert(m_bit_buf_size <= 32); + } + + return m_bit_buf & ((1 << num_bits) - 1); + } + + void remove_bits(uint32_t num_bits) + { + assert(m_bit_buf_size >= num_bits); + + m_bit_buf >>= num_bits; + m_bit_buf_size -= num_bits; + } + + uint32_t get_bits(uint32_t num_bits) + { + if (num_bits > 25) + { + assert(num_bits <= 32); + + const uint32_t bits0 = peek_bits(25); + m_bit_buf >>= 25; + m_bit_buf_size -= 25; + num_bits -= 25; + + const uint32_t bits = peek_bits(num_bits); + m_bit_buf >>= num_bits; + m_bit_buf_size -= num_bits; + + return bits0 | (bits << 25); + } + + const uint32_t bits = peek_bits(num_bits); + + m_bit_buf >>= num_bits; + m_bit_buf_size -= num_bits; + + return bits; + } + + uint32_t decode_truncated_binary(uint32_t n) + { + assert(n >= 2); + + const uint32_t k = basisu::floor_log2i(n); + const uint32_t u = (1 << (k + 1)) - n; + + uint32_t result = get_bits(k); + + if (result >= u) + result = ((result << 1) | get_bits(1)) - u; + + return result; + } + + uint32_t decode_rice(uint32_t m) + { + assert(m); + + uint32_t q = 0; + for (;;) + { + uint32_t k = peek_bits(16); + + uint32_t l = 0; + while (k & 1) + { + l++; + k >>= 1; + } + + q += l; + + remove_bits(l); + + if (l < 16) + break; + } + + return (q << m) + (get_bits(m + 1) >> 1); + } + + inline uint32_t decode_vlc(uint32_t chunk_bits) + { + assert(chunk_bits); + + const uint32_t chunk_size = 1 << chunk_bits; + const uint32_t chunk_mask = chunk_size - 1; + + uint32_t v = 0; + uint32_t ofs = 0; + + for ( ; ; ) + { + uint32_t s = get_bits(chunk_bits + 1); + v |= ((s & chunk_mask) << ofs); + ofs += chunk_bits; + + if ((s & chunk_size) == 0) + break; + + if (ofs >= 32) + { + assert(0); + break; + } + } + + return v; + } + + inline uint32_t decode_huffman(const huffman_decoding_table &ct, int fast_lookup_bits = basisu::cHuffmanFastLookupBits) + { + assert(ct.m_code_sizes.size()); + + const uint32_t huffman_fast_lookup_size = 1 << fast_lookup_bits; + + while (m_bit_buf_size < 16) + { + uint32_t c = 0; + if (m_pBuf < m_pBuf_end) + c = *m_pBuf++; + + m_bit_buf |= (c << m_bit_buf_size); + m_bit_buf_size += 8; + assert(m_bit_buf_size <= 32); + } + + int code_len; + + int sym; + if ((sym = ct.m_lookup[m_bit_buf & (huffman_fast_lookup_size - 1)]) >= 0) + { + code_len = sym >> 16; + sym &= 0xFFFF; + } + else + { + code_len = fast_lookup_bits; + do + { + sym = ct.m_tree[~sym + ((m_bit_buf >> code_len++) & 1)]; // ~sym = -sym - 1 + } while (sym < 0); + } + + m_bit_buf >>= code_len; + m_bit_buf_size -= code_len; + + return sym; + } + + bool read_huffman_table(huffman_decoding_table &ct) + { + ct.clear(); + + const uint32_t total_used_syms = get_bits(basisu::cHuffmanMaxSymsLog2); + + if (!total_used_syms) + return true; + if (total_used_syms > basisu::cHuffmanMaxSyms) + return false; + + uint8_t code_length_code_sizes[basisu::cHuffmanTotalCodelengthCodes]; + basisu::clear_obj(code_length_code_sizes); + + const uint32_t num_codelength_codes = get_bits(5); + if ((num_codelength_codes < 1) || (num_codelength_codes > basisu::cHuffmanTotalCodelengthCodes)) + return false; + + for (uint32_t i = 0; i < num_codelength_codes; i++) + code_length_code_sizes[basisu::g_huffman_sorted_codelength_codes[i]] = static_cast(get_bits(3)); + + huffman_decoding_table code_length_table; + if (!code_length_table.init(basisu::cHuffmanTotalCodelengthCodes, code_length_code_sizes)) + return false; + + if (!code_length_table.is_valid()) + return false; + + basisu::uint8_vec code_sizes(total_used_syms); + + uint32_t cur = 0; + while (cur < total_used_syms) + { + int c = decode_huffman(code_length_table); + + if (c <= 16) + code_sizes[cur++] = static_cast(c); + else if (c == basisu::cHuffmanSmallZeroRunCode) + cur += get_bits(basisu::cHuffmanSmallZeroRunExtraBits) + basisu::cHuffmanSmallZeroRunSizeMin; + else if (c == basisu::cHuffmanBigZeroRunCode) + cur += get_bits(basisu::cHuffmanBigZeroRunExtraBits) + basisu::cHuffmanBigZeroRunSizeMin; + else + { + if (!cur) + return false; + + uint32_t l; + if (c == basisu::cHuffmanSmallRepeatCode) + l = get_bits(basisu::cHuffmanSmallRepeatExtraBits) + basisu::cHuffmanSmallRepeatSizeMin; + else + l = get_bits(basisu::cHuffmanBigRepeatExtraBits) + basisu::cHuffmanBigRepeatSizeMin; + + const uint8_t prev = code_sizes[cur - 1]; + if (prev == 0) + return false; + do + { + if (cur >= total_used_syms) + return false; + code_sizes[cur++] = prev; + } while (--l > 0); + } + } + + if (cur != total_used_syms) + return false; + + return ct.init(total_used_syms, &code_sizes[0]); + } + + private: + uint32_t m_buf_size; + const uint8_t *m_pBuf; + const uint8_t *m_pBuf_start; + const uint8_t *m_pBuf_end; + + uint32_t m_bit_buf; + uint32_t m_bit_buf_size; + }; + + inline uint32_t basisd_rand(uint32_t seed) + { + if (!seed) + seed++; + uint32_t z = seed; + BASISD_znew; + return z; + } + + // Returns random number in [0,limit). Max limit is 0xFFFF. + inline uint32_t basisd_urand(uint32_t& seed, uint32_t limit) + { + seed = basisd_rand(seed); + return (((seed ^ (seed >> 16)) & 0xFFFF) * limit) >> 16; + } + + class approx_move_to_front + { + public: + approx_move_to_front(uint32_t n) + { + init(n); + } + + void init(uint32_t n) + { + m_values.resize(n); + m_rover = n / 2; + } + + const basisu::int_vec& get_values() const { return m_values; } + basisu::int_vec& get_values() { return m_values; } + + uint32_t size() const { return (uint32_t)m_values.size(); } + + const int& operator[] (uint32_t index) const { return m_values[index]; } + int operator[] (uint32_t index) { return m_values[index]; } + + void add(int new_value) + { + m_values[m_rover++] = new_value; + if (m_rover == m_values.size()) + m_rover = (uint32_t)m_values.size() / 2; + } + + void use(uint32_t index) + { + if (index) + { + //std::swap(m_values[index / 2], m_values[index]); + int x = m_values[index / 2]; + int y = m_values[index]; + m_values[index / 2] = y; + m_values[index] = x; + } + } + + // returns -1 if not found + int find(int value) const + { + for (uint32_t i = 0; i < m_values.size(); i++) + if (m_values[i] == value) + return i; + return -1; + } + + void reset() + { + const uint32_t n = (uint32_t)m_values.size(); + + m_values.clear(); + + init(n); + } + + private: + basisu::int_vec m_values; + uint32_t m_rover; + }; + + struct decoder_etc_block; + + inline uint8_t clamp255(int32_t i) + { + return (uint8_t)((i & 0xFFFFFF00U) ? (~(i >> 31)) : i); + } + + enum eNoClamp + { + cNoClamp = 0 + }; + + struct color32 + { + union + { + struct + { + uint8_t r; + uint8_t g; + uint8_t b; + uint8_t a; + }; + + uint8_t c[4]; + + uint32_t m; + }; + + color32() { } + + color32(uint32_t vr, uint32_t vg, uint32_t vb, uint32_t va) { set(vr, vg, vb, va); } + color32(eNoClamp unused, uint32_t vr, uint32_t vg, uint32_t vb, uint32_t va) { (void)unused; set_noclamp_rgba(vr, vg, vb, va); } + + void set(uint32_t vr, uint32_t vg, uint32_t vb, uint32_t va) { c[0] = static_cast(vr); c[1] = static_cast(vg); c[2] = static_cast(vb); c[3] = static_cast(va); } + + void set_noclamp_rgb(uint32_t vr, uint32_t vg, uint32_t vb) { c[0] = static_cast(vr); c[1] = static_cast(vg); c[2] = static_cast(vb); } + void set_noclamp_rgba(uint32_t vr, uint32_t vg, uint32_t vb, uint32_t va) { set(vr, vg, vb, va); } + + void set_clamped(int vr, int vg, int vb, int va) { c[0] = clamp255(vr); c[1] = clamp255(vg); c[2] = clamp255(vb); c[3] = clamp255(va); } + + uint8_t operator[] (uint32_t idx) const { assert(idx < 4); return c[idx]; } + uint8_t &operator[] (uint32_t idx) { assert(idx < 4); return c[idx]; } + + bool operator== (const color32&rhs) const { return m == rhs.m; } + + static color32 comp_min(const color32& a, const color32& b) { return color32(cNoClamp, basisu::minimum(a[0], b[0]), basisu::minimum(a[1], b[1]), basisu::minimum(a[2], b[2]), basisu::minimum(a[3], b[3])); } + static color32 comp_max(const color32& a, const color32& b) { return color32(cNoClamp, basisu::maximum(a[0], b[0]), basisu::maximum(a[1], b[1]), basisu::maximum(a[2], b[2]), basisu::maximum(a[3], b[3])); } + }; + + struct endpoint + { + color32 m_color5; + uint8_t m_inten5; + bool operator== (const endpoint& rhs) const + { + return (m_color5.r == rhs.m_color5.r) && (m_color5.g == rhs.m_color5.g) && (m_color5.b == rhs.m_color5.b) && (m_inten5 == rhs.m_inten5); + } + bool operator!= (const endpoint& rhs) const { return !(*this == rhs); } + }; + + struct selector + { + // Plain selectors (2-bits per value) + uint8_t m_selectors[4]; + + // ETC1 selectors + uint8_t m_bytes[4]; + + uint8_t m_lo_selector, m_hi_selector; + uint8_t m_num_unique_selectors; + bool operator== (const selector& rhs) const + { + return (m_selectors[0] == rhs.m_selectors[0]) && + (m_selectors[1] == rhs.m_selectors[1]) && + (m_selectors[2] == rhs.m_selectors[2]) && + (m_selectors[3] == rhs.m_selectors[3]); + } + bool operator!= (const selector& rhs) const + { + return !(*this == rhs); + } + + void init_flags() + { + uint32_t hist[4] = { 0, 0, 0, 0 }; + for (uint32_t y = 0; y < 4; y++) + { + for (uint32_t x = 0; x < 4; x++) + { + uint32_t s = get_selector(x, y); + hist[s]++; + } + } + + m_lo_selector = 3; + m_hi_selector = 0; + m_num_unique_selectors = 0; + + for (uint32_t i = 0; i < 4; i++) + { + if (hist[i]) + { + m_num_unique_selectors++; + if (i < m_lo_selector) m_lo_selector = static_cast(i); + if (i > m_hi_selector) m_hi_selector = static_cast(i); + } + } + } + + // Returned selector value ranges from 0-3 and is a direct index into g_etc1_inten_tables. + inline uint32_t get_selector(uint32_t x, uint32_t y) const + { + assert((x < 4) && (y < 4)); + return (m_selectors[y] >> (x * 2)) & 3; + } + + void set_selector(uint32_t x, uint32_t y, uint32_t val) + { + static const uint8_t s_selector_index_to_etc1[4] = { 3, 2, 0, 1 }; + + assert((x | y | val) < 4); + + m_selectors[y] &= ~(3 << (x * 2)); + m_selectors[y] |= (val << (x * 2)); + + const uint32_t etc1_bit_index = x * 4 + y; + + uint8_t *p = &m_bytes[3 - (etc1_bit_index >> 3)]; + + const uint32_t byte_bit_ofs = etc1_bit_index & 7; + const uint32_t mask = 1 << byte_bit_ofs; + + const uint32_t etc1_val = s_selector_index_to_etc1[val]; + + const uint32_t lsb = etc1_val & 1; + const uint32_t msb = etc1_val >> 1; + + p[0] &= ~mask; + p[0] |= (lsb << byte_bit_ofs); + + p[-2] &= ~mask; + p[-2] |= (msb << byte_bit_ofs); + } + }; + + bool basis_block_format_is_uncompressed(block_format tex_type); + +} // namespace basist + + + diff --git a/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc.inc b/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc.inc new file mode 100644 index 0000000..cd634c0 --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc.inc @@ -0,0 +1,481 @@ +{0,2,18},{0,32,2},{0,16,10},{0,16,10},{0,32,35},{0,16,27},{0,16,11},{0,16,27},{0,16,36},{0,16,28},{0,2,18},{0,32,2},{0,16,10},{0,16,10},{16,0,35},{0,16,27},{0,16,11},{0,16,27},{32,0,35},{0,16,27},{0,16,1},{0,16,1},{0,16,1},{0,16,1},{0,16,2},{0,16,2},{0,16,2},{0,0,4},{0,0,4},{0,0,4},{0,16,1}, +{0,16,1},{0,16,1},{0,16,1},{0,16,2},{0,16,2},{0,16,2},{0,0,4},{16,0,2},{0,0,4},{0,2,18},{0,32,2},{0,16,10},{0,16,10},{0,2,18},{2,0,18},{0,16,10},{0,16,18},{2,0,18},{0,16,18},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{16,4,44},{16,18,27},{16,2,30}, +{16,2,30},{0,4,52},{0,18,20},{0,2,1},{0,32,27},{0,2,77},{0,32,36},{16,4,19},{16,18,2},{16,2,5},{16,2,5},{32,32,51},{0,18,20},{0,2,1},{0,32,27},{32,32,51},{0,32,27},{16,18,26},{16,18,26},{16,18,26},{16,32,27},{0,34,8},{0,2,1},{0,2,1},{0,32,2},{0,32,19},{0,32,11},{16,18,1},{16,18,1},{16,18,1},{16,32,2},{16,2,8}, +{0,2,1},{0,2,1},{0,32,2},{34,0,8},{0,32,2},{16,4,18},{16,18,1},{16,2,4},{0,2,0},{16,4,18},{4,16,18},{0,2,0},{0,32,26},{4,16,18},{0,32,26},{16,0,26},{16,0,26},{16,0,26},{16,0,26},{0,18,0},{0,18,0},{0,18,0},{0,32,1},{0,16,10},{0,16,10},{32,36,36},{32,4,20},{32,34,31},{32,18,28},{16,6,60},{32,34,31},{32,18,19}, +{16,18,28},{0,34,52},{0,18,22},{2,4,22},{2,34,6},{2,18,14},{2,18,14},{18,2,51},{32,34,22},{32,18,10},{0,18,18},{38,0,51},{0,18,18},{32,4,19},{32,4,19},{32,4,19},{32,18,19},{32,34,17},{32,18,10},{32,18,10},{32,2,13},{16,18,14},{16,2,8},{2,18,5},{2,18,5},{2,18,5},{2,18,5},{2,2,8},{32,18,1},{32,18,1},{32,2,4},{2,2,8}, +{32,2,4},{4,0,18},{32,4,2},{2,18,10},{0,34,9},{4,0,18},{8,0,18},{0,34,9},{0,18,18},{8,0,18},{0,18,18},{32,0,18},{32,0,18},{32,0,18},{32,0,18},{32,18,9},{32,18,9},{32,18,9},{32,2,9},{16,2,4},{16,2,4},{18,6,44},{18,20,26},{18,4,30},{18,4,30},{2,6,52},{2,20,21},{2,4,1},{2,34,27},{16,20,52},{32,34,27},{18,6,19}, +{18,20,1},{18,4,5},{18,4,5},{20,16,51},{2,20,21},{2,4,1},{2,34,27},{16,20,51},{2,34,27},{18,20,26},{18,20,26},{18,20,26},{18,34,27},{2,36,8},{2,4,1},{2,4,1},{2,34,2},{32,4,11},{32,34,2},{18,20,1},{18,20,1},{18,20,1},{18,34,2},{18,4,8},{2,4,1},{2,4,1},{2,34,2},{36,2,8},{2,34,2},{36,0,18},{18,20,0},{18,4,4}, +{2,4,0},{36,0,18},{6,18,18},{2,4,0},{0,34,26},{6,18,18},{0,34,26},{18,0,26},{18,0,26},{18,0,26},{18,0,26},{2,4,1},{2,4,1},{2,4,1},{2,34,1},{32,34,1},{32,34,1},{34,8,40},{34,6,21},{34,36,33},{34,36,28},{34,22,55},{34,36,25},{34,36,13},{34,20,31},{32,6,55},{18,20,20},{4,6,21},{4,36,5},{4,36,5},{4,20,11},{22,0,51}, +{34,36,21},{34,36,9},{2,20,19},{32,6,51},{2,20,19},{34,6,21},{34,6,21},{34,6,21},{34,20,21},{34,6,14},{34,20,6},{34,20,6},{34,4,14},{18,20,11},{18,20,11},{4,36,1},{4,36,1},{4,36,1},{4,20,2},{2,24,8},{34,20,2},{34,20,2},{4,4,10},{28,0,8},{4,4,10},{22,16,18},{34,6,1},{4,36,4},{18,36,4},{22,16,18},{44,16,18},{18,36,4}, +{0,20,18},{44,16,18},{0,20,18},{34,0,20},{34,0,20},{34,0,20},{34,0,20},{34,20,5},{34,20,5},{34,20,5},{34,4,5},{18,20,2},{18,20,2},{20,8,46},{20,22,27},{20,6,31},{20,6,28},{4,24,52},{4,22,19},{4,6,7},{4,6,36},{18,22,56},{34,6,31},{20,8,21},{20,22,2},{20,6,6},{20,6,3},{36,6,51},{4,22,18},{4,6,6},{18,6,26},{31,0,51}, +{18,6,26},{20,22,26},{20,22,26},{20,22,26},{20,6,27},{4,38,9},{4,6,6},{4,6,6},{4,36,1},{34,6,9},{4,36,4},{20,22,1},{20,22,1},{20,22,1},{20,6,2},{22,2,8},{20,36,4},{20,36,4},{4,36,0},{42,2,8},{4,36,0},{22,4,18},{20,22,1},{36,6,2},{4,6,2},{22,4,18},{15,0,18},{4,6,2},{0,6,26},{15,0,18},{0,6,26},{20,0,26}, +{20,0,26},{20,0,26},{20,0,26},{4,22,1},{4,22,1},{4,22,1},{4,36,1},{4,36,4},{4,36,4},{36,40,38},{36,8,22},{36,38,33},{36,38,28},{36,24,55},{36,38,25},{36,38,13},{20,22,28},{34,8,55},{4,22,23},{6,8,21},{6,38,5},{6,38,5},{6,22,11},{24,2,51},{36,38,21},{20,38,9},{4,22,19},{13,0,51},{4,22,19},{36,8,21},{36,8,21},{36,8,21}, +{36,22,21},{36,8,14},{36,22,6},{36,22,6},{36,6,14},{4,38,10},{4,22,14},{6,38,1},{6,38,1},{6,38,1},{6,22,2},{8,2,8},{36,22,2},{36,22,2},{6,6,10},{30,2,8},{6,6,10},{10,0,18},{36,8,2},{6,38,4},{4,38,5},{10,0,18},{4,8,18},{4,38,5},{0,22,18},{4,8,18},{0,22,18},{36,0,20},{36,0,20},{36,0,20},{36,0,20},{36,22,5}, +{36,22,5},{36,22,5},{36,6,5},{4,22,5},{4,22,5},{22,10,46},{22,24,26},{22,8,30},{22,8,30},{6,26,52},{6,24,21},{6,8,5},{6,38,37},{20,24,53},{6,38,40},{22,10,21},{22,24,1},{22,8,5},{22,8,5},{16,11,51},{6,24,20},{6,8,4},{6,38,36},{25,0,51},{6,38,36},{22,24,26},{22,24,26},{22,24,26},{22,8,30},{6,40,9},{6,8,5},{6,8,5}, +{6,38,1},{36,8,11},{6,38,4},{22,24,1},{22,24,1},{22,24,1},{22,8,5},{24,4,8},{6,8,4},{6,8,4},{6,38,0},{11,0,8},{6,38,0},{42,0,18},{22,24,0},{22,8,4},{6,8,0},{42,0,18},{9,0,18},{6,8,0},{0,8,36},{9,0,18},{0,8,36},{22,0,26},{22,0,26},{22,0,26},{22,0,26},{6,24,1},{6,24,1},{6,24,1},{6,38,1},{6,38,4}, +{6,38,4},{38,12,44},{38,10,30},{38,40,46},{38,40,34},{38,26,53},{38,40,21},{38,40,9},{38,24,25},{6,10,57},{22,24,22},{8,10,21},{8,40,5},{8,40,5},{8,24,17},{28,0,51},{38,40,20},{38,40,8},{6,24,21},{37,0,51},{6,24,21},{38,26,26},{38,26,26},{38,26,26},{38,24,30},{38,10,9},{38,40,5},{38,40,5},{38,24,9},{22,24,11},{22,24,6},{8,40,1}, +{8,40,1},{8,40,1},{8,24,1},{38,10,8},{8,24,4},{8,24,4},{6,24,5},{23,0,8},{6,24,5},{16,7,18},{38,10,4},{8,40,4},{6,40,5},{16,7,18},{21,0,18},{6,40,5},{0,24,20},{21,0,18},{0,24,20},{38,0,26},{38,0,26},{38,0,26},{38,0,26},{38,40,1},{38,40,1},{38,40,1},{38,8,2},{22,24,2},{22,24,2},{24,12,38},{24,26,22},{24,10,30}, +{24,10,22},{8,28,52},{8,26,19},{8,10,6},{8,40,37},{38,26,55},{38,10,30},{24,12,22},{24,26,6},{24,10,14},{24,10,6},{42,6,51},{8,26,18},{24,10,3},{22,10,26},{19,0,51},{22,10,26},{24,26,21},{24,26,21},{24,26,21},{24,10,21},{8,42,9},{8,10,5},{8,10,5},{8,40,1},{38,10,8},{8,40,4},{24,26,5},{24,26,5},{24,26,5},{24,10,5},{28,2,8}, +{24,10,2},{24,10,2},{8,40,0},{42,8,8},{8,40,0},{26,8,18},{24,26,2},{40,10,2},{8,10,1},{26,8,18},{15,6,18},{8,10,1},{0,10,26},{15,6,18},{0,10,26},{24,0,20},{24,0,20},{24,0,20},{24,0,20},{8,26,1},{8,26,1},{8,26,1},{8,40,1},{38,10,4},{38,10,4},{40,14,40},{40,12,21},{40,42,33},{40,42,33},{40,28,55},{40,42,23},{40,42,18}, +{40,26,33},{8,12,57},{24,26,22},{10,12,21},{10,42,5},{10,42,5},{10,26,17},{30,2,51},{40,42,19},{24,42,14},{8,26,21},{35,2,51},{8,26,21},{40,12,21},{40,12,21},{40,12,21},{40,26,21},{40,12,14},{40,26,6},{40,26,6},{40,10,14},{8,42,10},{24,26,6},{10,42,1},{10,42,1},{10,42,1},{10,26,1},{16,3,8},{40,26,2},{40,26,2},{8,26,5},{17,0,8}, +{8,26,5},{16,1,18},{40,12,1},{10,42,4},{8,42,5},{16,1,18},{19,2,18},{8,42,5},{0,26,20},{19,2,18},{0,26,20},{40,0,20},{40,0,20},{40,0,20},{40,0,20},{40,26,5},{40,26,5},{40,26,5},{40,10,5},{24,26,2},{24,26,2},{26,14,38},{26,28,22},{26,12,30},{26,12,22},{10,30,52},{10,28,21},{10,12,6},{10,42,37},{24,28,53},{40,12,31},{26,14,22}, +{26,28,6},{26,12,14},{26,12,6},{47,2,51},{10,28,20},{26,12,3},{24,12,26},{17,2,51},{24,12,26},{26,28,21},{26,28,21},{26,28,21},{26,12,21},{10,44,9},{10,12,5},{10,12,5},{10,42,1},{40,12,9},{40,42,2},{26,28,5},{26,28,5},{26,28,5},{26,12,5},{30,4,8},{26,12,2},{26,12,2},{10,42,0},{15,8,8},{10,42,0},{15,0,18},{26,28,2},{42,12,5}, +{10,12,1},{15,0,18},{5,4,18},{10,12,1},{0,12,26},{5,4,18},{0,12,26},{26,0,20},{26,0,20},{26,0,20},{26,0,20},{10,28,1},{10,28,1},{10,28,1},{10,42,1},{40,42,2},{40,42,2},{42,47,46},{42,14,31},{12,44,37},{42,44,31},{42,46,52},{42,44,21},{42,44,6},{42,28,25},{10,14,51},{26,28,20},{12,30,18},{12,14,2},{12,44,1},{12,44,10},{29,0,51}, +{42,44,20},{42,44,5},{26,28,20},{37,6,51},{26,28,20},{42,30,26},{42,30,26},{42,30,26},{42,28,30},{42,14,9},{42,44,5},{42,44,5},{42,28,9},{10,44,9},{26,28,4},{12,44,0},{12,44,0},{12,44,0},{12,28,0},{45,0,8},{12,28,4},{12,28,4},{26,28,4},{27,8,8},{26,28,4},{45,2,18},{12,14,2},{12,44,1},{26,44,1},{45,2,18},{25,8,18},{26,44,1}, +{0,28,20},{25,8,18},{0,28,20},{42,0,26},{42,0,26},{42,0,26},{42,0,26},{42,44,1},{42,44,1},{42,44,1},{42,12,5},{26,28,0},{26,28,0},{28,47,38},{28,30,22},{28,14,33},{28,14,25},{12,31,55},{12,30,23},{12,14,18},{12,14,33},{42,30,55},{42,14,21},{28,47,22},{28,30,6},{44,14,14},{28,14,9},{46,10,51},{12,30,19},{28,14,6},{26,14,21},{23,8,51}, +{26,14,21},{28,30,21},{28,30,21},{28,30,21},{28,14,21},{12,46,14},{12,14,14},{12,14,14},{12,44,6},{42,14,10},{12,44,6},{28,30,5},{28,30,5},{28,30,5},{28,14,5},{29,2,8},{28,14,2},{28,14,2},{12,44,2},{35,6,8},{12,44,2},{8,7,18},{28,30,2},{44,14,5},{12,14,5},{8,7,18},{33,6,18},{12,14,5},{0,14,20},{33,6,18},{0,14,20},{28,0,20}, +{28,0,20},{28,0,20},{28,0,20},{12,30,5},{12,30,5},{12,30,5},{12,44,5},{42,14,1},{42,14,1},{44,15,46},{44,47,27},{14,46,37},{44,46,31},{44,31,53},{44,46,21},{44,46,6},{44,30,25},{42,47,55},{28,30,22},{14,31,20},{14,47,8},{14,46,1},{14,46,10},{38,3,51},{44,46,20},{44,46,5},{12,30,21},{35,8,51},{12,30,21},{44,31,26},{44,31,26},{44,31,26}, +{44,30,30},{44,47,11},{44,46,5},{44,46,5},{44,30,9},{12,46,9},{28,30,6},{14,46,0},{14,46,0},{14,46,0},{14,30,0},{43,2,8},{14,30,4},{14,30,4},{12,30,5},{21,8,8},{12,30,5},{41,0,18},{44,47,1},{14,46,1},{28,46,1},{41,0,18},{19,8,18},{28,46,1},{0,30,20},{19,8,18},{0,30,20},{44,0,26},{44,0,26},{44,0,26},{44,0,26},{44,46,1}, +{44,46,1},{44,46,1},{44,14,5},{28,30,2},{28,30,2},{30,45,38},{30,31,21},{30,47,24},{30,47,24},{14,29,55},{14,31,22},{14,47,8},{14,46,55},{28,31,53},{44,47,41},{30,45,22},{30,31,5},{30,47,8},{30,47,8},{41,2,51},{14,31,18},{14,47,4},{12,47,37},{17,8,51},{12,47,37},{30,31,20},{30,31,20},{30,31,20},{30,47,24},{14,15,14},{14,47,8},{14,47,8}, +{14,46,6},{44,47,9},{14,46,6},{30,31,4},{30,31,4},{30,31,4},{30,47,8},{38,1,8},{14,47,4},{14,47,4},{14,46,2},{43,28,8},{14,46,2},{9,0,18},{30,31,1},{46,47,1},{14,47,0},{9,0,18},{0,9,18},{14,47,0},{0,47,36},{0,9,18},{0,47,36},{30,0,20},{30,0,20},{30,0,20},{30,0,20},{14,31,4},{14,31,4},{14,31,4},{14,46,5},{14,46,5}, +{14,46,5},{46,43,54},{46,45,41},{47,15,55},{46,15,44},{46,13,51},{46,15,20},{46,15,8},{46,31,24},{14,45,56},{30,31,21},{47,29,21},{47,15,6},{47,15,6},{47,31,17},{23,0,51},{46,15,20},{46,15,8},{30,31,20},{18,9,51},{30,31,20},{46,13,37},{46,13,37},{46,13,37},{46,15,40},{46,45,8},{46,15,4},{46,15,4},{46,31,8},{14,15,14},{30,31,5},{47,15,2}, +{47,15,2},{47,15,2},{47,31,1},{39,0,8},{46,15,4},{46,15,4},{30,31,4},{9,28,8},{30,31,4},{39,2,18},{47,15,5},{47,15,5},{30,15,4},{39,2,18},{34,9,18},{30,15,4},{0,31,20},{34,9,18},{0,31,20},{46,0,36},{46,0,36},{46,0,36},{46,0,36},{46,15,0},{46,15,0},{46,15,0},{46,47,1},{30,31,1},{30,31,1},{31,43,38},{31,29,22},{31,45,25}, +{31,45,22},{47,43,53},{47,29,19},{47,45,6},{47,15,37},{46,29,52},{46,45,27},{31,43,22},{31,29,6},{31,45,9},{31,45,6},{9,6,51},{47,29,18},{47,45,5},{30,45,26},{32,7,51},{30,45,26},{31,13,21},{31,13,21},{31,13,21},{31,45,21},{47,13,9},{47,45,5},{47,45,5},{47,15,1},{46,45,10},{46,15,8},{31,13,5},{31,13,5},{31,13,5},{31,45,5},{23,2,8}, +{31,15,4},{31,15,4},{47,15,0},{20,9,8},{47,15,0},{47,11,18},{31,29,2},{15,45,5},{47,45,1},{47,11,18},{22,9,18},{47,45,1},{0,45,26},{22,9,18},{0,45,26},{31,0,20},{31,0,20},{31,0,20},{31,0,20},{47,29,1},{47,29,1},{47,29,1},{47,15,1},{46,45,1},{46,45,1},{15,11,38},{15,43,21},{15,13,33},{15,13,33},{15,27,55},{15,13,23},{15,13,18}, +{15,29,33},{47,13,59},{31,29,22},{45,27,21},{45,13,6},{45,13,6},{45,29,17},{21,2,51},{15,13,19},{15,13,14},{31,29,21},{24,9,51},{31,29,21},{15,27,21},{15,27,21},{15,27,21},{15,29,21},{15,13,14},{15,29,6},{15,29,6},{15,45,14},{47,13,10},{31,29,6},{45,13,2},{45,13,2},{45,13,2},{45,29,1},{37,2,8},{15,29,2},{15,29,2},{31,29,5},{34,7,8}, +{31,29,5},{35,0,18},{15,43,1},{45,13,5},{31,13,5},{35,0,18},{36,7,18},{31,13,5},{0,29,20},{36,7,18},{0,29,20},{15,0,20},{15,0,20},{15,0,20},{15,0,20},{15,13,5},{15,13,5},{15,13,5},{15,45,5},{31,29,2},{31,29,2},{29,41,38},{29,27,20},{29,43,25},{29,43,25},{45,41,53},{45,27,21},{45,43,6},{45,13,37},{31,27,53},{15,43,31},{29,41,22}, +{29,27,4},{29,43,9},{29,43,9},{35,2,51},{45,27,20},{45,43,5},{31,43,26},{34,5,51},{31,43,26},{29,27,20},{29,27,20},{29,27,20},{29,13,24},{45,11,9},{45,43,5},{45,43,5},{45,13,1},{15,43,9},{15,13,2},{29,27,4},{29,27,4},{29,27,4},{29,13,8},{44,1,8},{29,13,4},{29,13,4},{45,13,0},{26,9,8},{45,13,0},{3,0,18},{29,27,0},{13,43,5}, +{45,43,1},{3,0,18},{0,3,18},{45,43,1},{0,43,26},{0,3,18},{0,43,26},{29,0,20},{29,0,20},{29,0,20},{29,0,20},{45,27,1},{45,27,1},{45,27,1},{45,13,1},{15,13,2},{15,13,2},{13,9,46},{13,41,31},{43,11,37},{13,11,31},{13,25,53},{13,11,21},{13,11,6},{13,27,30},{29,11,56},{29,27,22},{43,25,18},{43,41,2},{43,11,1},{43,27,16},{17,0,51}, +{13,11,20},{13,11,5},{29,27,21},{18,3,51},{29,27,21},{13,25,26},{13,25,26},{13,25,26},{13,27,27},{13,41,9},{13,27,3},{13,27,3},{13,27,14},{45,11,9},{29,27,6},{43,11,0},{43,11,0},{43,11,0},{43,27,0},{31,5,8},{13,27,2},{13,27,2},{29,27,5},{14,9,8},{29,27,5},{31,3,18},{43,41,2},{43,11,1},{29,11,1},{31,3,18},{34,3,18},{29,11,1}, +{0,27,20},{34,3,18},{0,27,20},{13,0,26},{13,0,26},{13,0,26},{13,0,26},{13,11,1},{13,11,1},{13,11,1},{13,43,5},{29,27,2},{29,27,2},{27,39,38},{27,25,22},{27,41,33},{27,41,25},{43,23,55},{43,25,23},{43,41,18},{43,41,33},{13,25,55},{13,41,21},{27,39,22},{27,25,6},{11,41,14},{27,41,9},{27,9,51},{43,25,19},{27,41,6},{13,41,21},{14,7,51}, +{13,41,21},{27,9,21},{27,9,21},{27,9,21},{27,41,21},{43,9,14},{43,25,14},{43,25,14},{43,11,5},{13,41,10},{43,11,5},{27,9,5},{27,9,5},{27,9,5},{27,41,5},{17,2,8},{27,41,2},{27,41,2},{43,11,1},{16,1,8},{43,11,1},{43,7,18},{27,25,2},{11,41,5},{27,41,5},{43,7,18},{18,1,18},{27,41,5},{0,41,20},{18,1,18},{0,41,20},{27,0,20}, +{27,0,20},{27,0,20},{27,0,20},{43,9,5},{43,9,5},{43,9,5},{43,11,4},{13,41,1},{13,41,1},{11,7,46},{11,39,30},{41,9,37},{11,9,31},{11,23,53},{11,9,21},{11,9,6},{11,25,30},{13,39,55},{27,25,22},{41,23,18},{41,9,4},{41,9,1},{41,25,16},{17,6,51},{11,9,20},{11,9,5},{27,25,21},{20,1,51},{27,25,21},{11,23,26},{11,23,26},{11,23,26}, +{11,25,27},{11,39,9},{11,25,3},{11,25,3},{11,25,14},{43,9,9},{27,25,6},{41,9,0},{41,9,0},{41,9,0},{41,25,0},{29,3,8},{11,25,2},{11,25,2},{27,25,5},{43,9,8},{27,25,5},{29,1,18},{41,9,4},{41,9,1},{27,9,1},{29,1,18},{36,1,18},{27,9,1},{0,25,20},{36,1,18},{0,25,20},{11,0,26},{11,0,26},{11,0,26},{11,0,26},{11,9,1}, +{11,9,1},{11,9,1},{11,41,2},{27,25,2},{27,25,2},{25,37,38},{25,23,22},{25,39,25},{25,39,25},{41,21,55},{41,23,23},{41,39,9},{41,39,46},{27,23,53},{11,39,30},{25,37,22},{25,23,6},{25,39,9},{25,39,9},{27,3,51},{41,23,19},{41,39,5},{27,39,26},{39,9,51},{27,39,26},{25,7,21},{25,7,21},{25,7,21},{25,9,24},{41,7,14},{41,39,8},{41,39,8}, +{41,9,5},{11,39,8},{41,9,5},{25,7,5},{25,7,5},{25,7,5},{25,9,8},{39,11,8},{25,9,4},{25,9,4},{41,9,1},{22,1,8},{41,9,1},{41,5,18},{25,23,2},{9,39,2},{41,39,1},{41,5,18},{23,9,18},{41,39,1},{0,39,26},{23,9,18},{0,39,26},{25,0,20},{25,0,20},{25,0,20},{25,0,20},{41,7,5},{41,7,5},{41,7,5},{41,9,4},{41,9,4}, +{41,9,4},{39,21,54},{39,7,40},{39,7,37},{9,7,41},{9,5,51},{9,7,20},{9,7,5},{9,23,30},{41,37,51},{25,23,26},{39,21,18},{39,7,4},{39,7,1},{39,7,17},{11,1,51},{9,7,20},{9,7,5},{25,23,26},{5,9,51},{25,23,26},{39,7,36},{39,7,36},{39,7,36},{39,23,36},{9,21,10},{9,7,4},{9,7,4},{9,23,5},{41,7,12},{25,23,1},{39,7,0}, +{39,7,0},{39,7,0},{39,23,0},{25,5,8},{9,7,4},{9,7,4},{25,23,1},{10,1,8},{25,23,1},{25,3,18},{39,7,4},{39,7,1},{25,7,1},{25,3,18},{12,1,18},{25,7,1},{0,23,26},{12,1,18},{0,23,26},{9,0,36},{9,0,36},{9,0,36},{9,0,36},{9,7,0},{9,7,0},{9,7,0},{9,23,4},{25,23,0},{25,23,0},{23,19,38},{23,5,23},{23,21,28}, +{23,37,23},{39,19,55},{39,21,25},{39,37,13},{39,37,33},{9,21,53},{9,37,22},{7,21,27},{23,5,14},{7,37,14},{23,37,14},{23,5,51},{39,21,21},{23,37,6},{9,37,21},{14,1,51},{9,37,21},{23,5,19},{23,5,19},{23,5,19},{23,37,19},{39,5,14},{39,21,9},{39,21,9},{39,7,5},{9,37,11},{39,7,5},{23,5,10},{23,5,10},{23,5,10},{7,7,10},{9,3,8}, +{23,37,2},{23,37,2},{39,7,1},{31,3,8},{39,7,1},{37,7,18},{23,5,5},{7,37,5},{23,37,5},{37,7,18},{30,1,18},{23,37,5},{0,37,20},{30,1,18},{0,37,20},{23,0,18},{23,0,18},{23,0,18},{23,0,18},{39,5,5},{39,5,5},{39,5,5},{39,7,4},{9,37,2},{9,37,2},{7,33,44},{7,35,31},{7,5,36},{7,5,31},{7,19,53},{7,5,22},{7,5,7}, +{7,21,31},{39,35,57},{23,21,27},{37,19,20},{37,5,4},{37,5,1},{37,5,17},{23,17,51},{7,5,21},{7,5,6},{23,21,26},{45,17,51},{23,21,26},{7,19,26},{7,19,26},{7,19,26},{7,5,30},{7,35,9},{7,5,6},{7,5,6},{7,21,6},{39,5,9},{23,21,2},{37,5,0},{37,5,0},{37,5,0},{37,21,0},{23,3,8},{37,21,4},{37,21,4},{23,21,1},{43,3,8}, +{23,21,1},{23,1,18},{37,5,4},{37,5,1},{23,5,1},{23,1,18},{33,7,18},{23,5,1},{0,21,26},{33,7,18},{0,21,26},{7,0,26},{7,0,26},{7,0,26},{7,0,26},{7,5,2},{7,5,2},{7,5,2},{7,37,2},{23,21,1},{23,21,1},{21,17,38},{21,19,20},{21,35,31},{21,35,23},{37,17,55},{37,19,22},{37,35,13},{37,35,33},{23,19,56},{7,35,21},{5,19,27}, +{21,19,11},{5,35,14},{21,35,14},{21,3,51},{37,19,18},{21,35,6},{7,35,21},{43,1,51},{7,35,21},{21,3,19},{21,3,19},{21,3,19},{21,35,19},{37,3,14},{37,35,9},{37,35,9},{37,5,5},{7,35,10},{37,5,5},{21,3,10},{21,3,10},{21,3,10},{5,5,10},{3,25,8},{21,35,2},{21,35,2},{37,5,1},{29,1,8},{37,5,1},{35,5,18},{21,19,2},{5,35,5}, +{21,35,5},{35,5,18},{27,1,18},{21,35,5},{0,35,20},{27,1,18},{0,35,20},{21,0,18},{21,0,18},{21,0,18},{21,0,18},{37,19,4},{37,19,4},{37,19,4},{37,5,4},{7,35,1},{7,35,1},{35,17,44},{35,33,27},{35,3,27},{35,3,35},{5,1,51},{5,3,26},{5,3,1},{5,19,30},{37,33,51},{21,19,26},{35,17,19},{35,33,2},{35,3,2},{35,3,10},{5,1,51}, +{5,3,26},{5,3,1},{21,19,26},{9,1,51},{21,19,26},{35,3,27},{35,3,27},{35,3,27},{35,19,27},{5,17,10},{5,3,1},{5,3,1},{5,19,5},{37,3,12},{21,19,1},{35,3,2},{35,3,2},{35,3,2},{35,19,2},{19,5,8},{5,3,1},{5,3,1},{21,19,1},{37,3,8},{21,19,1},{19,3,18},{35,33,1},{35,3,1},{5,3,1},{19,3,18},{39,1,18},{5,3,1}, +{0,19,26},{39,1,18},{0,19,26},{35,0,26},{35,0,26},{35,0,26},{35,0,26},{5,3,0},{5,3,0},{5,3,0},{5,19,4},{21,19,0},{21,19,0},{19,1,54},{19,1,22},{19,17,28},{19,33,27},{19,1,61},{35,17,30},{19,33,19},{35,33,31},{5,17,52},{5,33,20},{3,1,24},{3,17,8},{3,33,13},{3,33,17},{17,5,51},{35,17,21},{19,33,10},{5,33,19},{5,17,51}, +{5,33,19},{19,1,18},{19,1,18},{19,1,18},{19,33,18},{19,17,19},{19,33,10},{19,33,10},{19,3,14},{5,33,11},{35,3,6},{3,33,4},{3,33,4},{3,33,4},{3,3,8},{3,3,8},{19,33,1},{19,33,1},{19,3,5},{3,3,8},{19,3,5},{33,33,18},{19,1,4},{3,33,9},{19,33,9},{33,33,18},{33,33,18},{19,33,9},{0,33,18},{33,33,18},{0,33,18},{19,0,18}, +{19,0,18},{19,0,18},{19,0,18},{35,1,9},{35,1,9},{35,1,9},{19,3,10},{35,3,2},{35,3,2},{33,1,76},{33,1,36},{33,1,27},{33,1,35},{33,1,84},{3,1,26},{3,1,1},{3,17,30},{19,1,56},{19,17,27},{17,1,43},{33,1,11},{33,1,2},{33,1,10},{1,3,51},{3,1,26},{3,1,1},{19,17,26},{3,1,51},{19,17,26},{33,1,27},{33,1,27},{33,1,27}, +{33,17,26},{3,1,16},{3,1,1},{3,1,1},{3,17,5},{35,1,12},{19,17,2},{33,1,2},{33,1,2},{33,1,2},{33,17,1},{17,3,8},{3,1,1},{3,1,1},{19,17,1},{35,1,8},{19,17,1},{17,1,18},{17,1,10},{33,1,1},{19,1,0},{17,1,18},{33,1,18},{19,1,0},{0,17,26},{33,1,18},{0,17,26},{33,0,26},{33,0,26},{33,0,26},{33,0,26},{3,1,0}, +{3,1,0},{3,1,0},{3,17,4},{19,17,1},{19,17,1},{17,1,36},{17,1,28},{17,1,27},{17,1,19},{17,1,28},{17,1,12},{17,1,11},{17,1,10},{33,1,20},{33,1,2},{1,1,4},{1,1,4},{1,1,4},{1,1,4},{1,17,3},{17,1,3},{17,1,2},{17,1,1},{17,1,3},{17,1,1},{17,1,27},{17,1,27},{17,1,27},{17,1,19},{17,1,19},{17,1,11},{17,1,11}, +{17,1,10},{33,1,11},{33,1,2},{1,1,4},{1,1,4},{1,1,4},{1,1,4},{1,17,2},{17,1,2},{17,1,2},{17,1,1},{17,1,2},{17,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{17,0,18},{17,0,18},{17,0,18},{17,0,18},{17,1,10},{17,1,10},{17,1,10},{17,1,10},{33,1,2}, +{33,1,2},{0,4,74},{0,18,10},{0,2,1},{0,2,26},{0,34,154},{0,2,99},{0,32,49},{0,32,121},{0,32,162},{0,32,130},{0,4,74},{0,18,10},{0,2,1},{0,2,26},{32,0,153},{0,2,99},{0,32,49},{0,32,121},{0,32,153},{0,32,121},{0,2,0},{0,2,0},{0,2,0},{0,16,4},{0,32,13},{0,16,5},{0,16,5},{0,16,9},{0,16,14},{0,16,10},{0,2,0}, +{0,2,0},{0,2,0},{0,16,4},{16,0,13},{0,16,5},{0,16,5},{0,16,9},{32,0,13},{0,16,9},{32,32,72},{0,18,10},{0,2,1},{0,2,26},{32,32,72},{32,32,72},{0,2,26},{0,32,72},{32,32,72},{0,32,72},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,38,81},{0,20,10},{16,34,34}, +{0,18,26},{0,36,243},{0,34,99},{0,18,26},{0,2,139},{0,18,279},{0,2,164},{16,6,76},{16,4,8},{16,34,9},{16,18,24},{18,0,243},{0,34,99},{0,18,26},{0,2,139},{36,0,243},{0,2,139},{0,20,10},{0,20,10},{0,20,10},{0,18,10},{0,34,50},{0,18,10},{0,18,10},{0,32,20},{0,32,61},{0,32,29},{16,4,4},{16,4,4},{16,4,4},{16,2,5},{16,2,50}, +{0,18,10},{0,18,10},{0,32,20},{34,0,50},{0,32,20},{18,2,72},{0,20,1},{16,34,5},{0,18,17},{18,2,72},{38,0,72},{0,18,17},{0,18,80},{38,0,72},{0,18,80},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,32,0},{0,32,0},{0,32,0},{0,16,0},{0,16,1},{0,16,1},{16,24,135},{16,6,66},{16,20,122},{16,4,66},{0,8,244},{0,20,81},{0,4,2}, +{0,34,121},{0,4,344},{0,34,185},{32,8,74},{32,36,1},{32,4,17},{32,4,17},{16,38,243},{0,20,81},{0,4,2},{0,34,121},{38,16,243},{0,34,121},{16,22,61},{16,22,61},{16,22,61},{16,4,65},{0,6,52},{0,4,1},{0,4,1},{0,18,9},{0,18,94},{0,18,45},{32,36,0},{32,36,0},{32,36,0},{32,34,0},{2,2,50},{0,4,1},{0,4,1},{0,18,9},{2,2,50}, +{0,18,9},{20,16,72},{32,36,1},{2,4,1},{0,4,1},{20,16,72},{16,20,72},{0,4,1},{0,34,72},{16,20,72},{0,34,72},{16,0,61},{16,0,61},{16,0,61},{16,0,61},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,32,25},{0,32,25},{32,26,152},{2,22,91},{2,36,119},{32,20,89},{16,10,247},{16,6,78},{16,36,13},{16,4,110},{0,36,293},{0,4,103},{18,8,76}, +{18,6,8},{18,36,9},{2,20,19},{20,2,243},{16,6,74},{32,20,9},{0,4,94},{42,0,243},{0,4,94},{32,8,81},{32,8,81},{32,8,81},{32,20,80},{16,8,54},{16,36,9},{16,36,9},{16,34,8},{0,4,77},{0,34,6},{18,6,4},{18,6,4},{18,6,4},{18,4,5},{18,4,50},{32,20,0},{32,20,0},{16,34,4},{36,2,50},{16,34,4},{18,8,72},{2,22,1},{18,36,5}, +{0,36,4},{18,8,72},{44,0,72},{0,36,4},{0,4,90},{44,0,72},{0,4,90},{32,0,80},{32,0,80},{32,0,80},{32,0,80},{16,6,4},{16,6,4},{16,6,4},{16,34,4},{0,34,2},{0,34,2},{18,42,146},{18,8,83},{18,22,139},{18,6,79},{2,26,243},{2,38,78},{2,6,9},{2,36,110},{0,38,252},{0,36,79},{34,10,73},{34,8,6},{4,6,21},{34,6,14},{38,0,243}, +{2,38,78},{18,6,6},{0,36,75},{30,0,243},{0,36,75},{18,24,75},{18,24,75},{18,24,75},{18,6,75},{2,24,50},{2,6,5},{2,6,5},{2,20,4},{0,6,53},{16,20,2},{34,8,2},{34,8,2},{34,8,2},{34,36,2},{2,24,50},{18,6,2},{18,6,2},{16,20,1},{28,0,50},{16,20,1},{36,6,72},{34,8,5},{4,6,5},{2,6,5},{36,6,72},{31,0,72},{2,6,5}, +{0,36,74},{31,0,72},{0,36,74},{18,0,74},{18,0,74},{18,0,74},{18,0,74},{2,22,0},{2,22,0},{2,22,0},{2,4,4},{16,20,2},{16,20,2},{4,12,154},{4,24,85},{4,38,106},{34,38,95},{18,12,253},{18,8,90},{34,38,15},{18,6,122},{0,24,244},{16,22,93},{20,10,76},{20,8,9},{20,38,6},{20,22,24},{24,0,243},{18,8,81},{34,38,6},{0,22,80},{32,8,243}, +{0,22,80},{4,40,80},{4,40,80},{4,40,80},{4,22,80},{34,24,59},{34,22,10},{34,22,10},{18,36,19},{32,22,53},{32,6,5},{20,8,5},{20,8,5},{20,8,5},{20,6,8},{22,2,50},{34,22,1},{34,22,1},{32,6,4},{42,2,50},{32,6,4},{24,2,72},{20,8,5},{20,38,2},{18,38,1},{24,2,72},{13,0,72},{18,38,1},{0,22,80},{13,0,72},{0,22,80},{4,0,80}, +{4,0,80},{4,0,80},{4,0,80},{34,22,9},{34,22,9},{34,22,9},{18,36,10},{32,6,1},{32,6,1},{20,28,146},{20,10,77},{20,8,122},{20,8,77},{4,28,243},{4,40,78},{4,8,5},{4,38,110},{32,40,244},{2,38,79},{36,12,73},{36,40,2},{6,8,18},{36,8,18},{38,6,243},{34,40,73},{4,8,5},{2,38,75},{27,0,243},{2,38,75},{20,26,73},{20,26,73},{20,26,73}, +{20,8,76},{4,26,50},{4,8,4},{4,8,4},{4,22,4},{2,8,50},{18,22,2},{36,40,1},{36,40,1},{36,40,1},{36,38,2},{8,2,50},{4,8,4},{4,8,4},{18,22,1},{30,2,50},{18,22,1},{16,11,72},{36,40,1},{6,8,2},{4,8,1},{16,11,72},{25,0,72},{4,8,1},{0,38,74},{25,0,72},{0,38,74},{20,0,72},{20,0,72},{20,0,72},{20,0,72},{4,24,0}, +{4,24,0},{4,24,0},{4,6,4},{18,22,2},{18,22,2},{6,14,154},{6,26,85},{6,40,109},{6,24,97},{20,14,248},{20,10,78},{20,40,13},{20,8,110},{2,26,244},{34,8,91},{22,12,76},{22,10,9},{22,40,9},{22,24,29},{26,2,243},{20,10,74},{20,40,9},{2,24,80},{38,8,243},{2,24,80},{6,42,80},{6,42,80},{6,42,80},{6,24,81},{20,12,54},{20,40,9},{20,40,9}, +{20,38,13},{34,24,53},{34,8,10},{22,10,5},{22,10,5},{22,10,5},{22,8,5},{24,4,50},{36,24,1},{36,24,1},{34,8,9},{11,0,50},{34,8,9},{26,4,72},{22,10,5},{22,40,5},{4,40,5},{26,4,72},{7,0,72},{4,40,5},{0,24,80},{7,0,72},{0,24,80},{6,0,80},{6,0,80},{6,0,80},{6,0,80},{20,10,4},{20,10,4},{20,10,4},{20,38,4},{34,8,1}, +{34,8,1},{22,46,146},{22,12,83},{38,26,122},{22,10,79},{6,30,245},{6,42,74},{6,10,10},{6,40,111},{4,42,247},{20,40,79},{38,14,76},{38,12,5},{8,10,21},{38,10,17},{44,0,243},{6,42,73},{6,10,9},{4,40,74},{26,8,243},{4,40,74},{22,28,75},{22,28,75},{22,28,75},{22,10,75},{6,28,51},{6,10,6},{6,10,6},{6,24,6},{4,10,53},{20,24,6},{38,12,4}, +{38,12,4},{38,12,4},{38,40,5},{38,10,50},{22,40,4},{22,40,4},{36,24,1},{23,0,50},{36,24,1},{42,6,72},{38,12,1},{8,10,5},{6,10,5},{42,6,72},{19,0,72},{6,10,5},{0,40,74},{19,0,72},{0,40,74},{22,0,74},{22,0,74},{22,0,74},{22,0,74},{6,26,2},{6,26,2},{6,26,2},{6,8,5},{20,24,5},{20,24,5},{8,46,154},{8,28,85},{8,42,106}, +{8,42,97},{38,46,247},{38,12,82},{38,42,10},{22,26,119},{4,28,247},{36,26,83},{24,14,75},{24,28,6},{24,42,6},{24,26,30},{30,0,243},{38,12,78},{38,42,6},{4,26,75},{33,0,243},{4,26,75},{8,44,80},{8,44,80},{8,44,80},{8,26,80},{38,28,56},{38,26,9},{38,26,9},{38,40,14},{20,42,54},{6,10,9},{24,12,1},{24,12,1},{24,12,1},{24,10,5},{28,2,50}, +{38,26,5},{38,26,5},{6,10,5},{42,8,50},{6,10,5},{30,2,72},{8,28,5},{24,42,5},{22,42,1},{30,2,72},{35,2,72},{22,42,1},{0,26,74},{35,2,72},{0,26,74},{8,0,80},{8,0,80},{8,0,80},{8,0,80},{38,26,5},{38,26,5},{38,26,5},{38,40,5},{6,40,4},{6,40,4},{24,15,146},{24,14,83},{24,28,126},{24,12,79},{8,31,243},{8,44,78},{8,12,9}, +{8,42,110},{36,44,245},{22,42,79},{40,46,75},{40,14,6},{10,12,21},{40,12,14},{47,0,243},{8,44,78},{8,12,9},{6,42,74},{27,6,243},{6,42,74},{24,30,75},{24,30,75},{24,30,75},{24,12,75},{8,14,52},{8,12,5},{8,12,5},{8,26,5},{6,12,53},{22,26,6},{40,14,2},{40,14,2},{40,14,2},{40,42,1},{16,3,50},{24,42,4},{24,42,4},{38,26,1},{17,0,50}, +{38,26,1},{47,2,72},{40,14,5},{10,12,5},{8,12,5},{47,2,72},{17,2,72},{8,12,5},{0,42,74},{17,2,72},{0,42,74},{24,0,74},{24,0,74},{24,0,74},{24,0,74},{8,28,0},{8,28,0},{8,28,0},{8,10,1},{22,26,5},{22,26,5},{10,15,152},{10,30,85},{10,44,106},{40,44,95},{40,31,252},{24,14,90},{40,44,15},{24,12,122},{6,30,247},{38,28,89},{26,47,73}, +{26,30,6},{26,44,6},{26,28,21},{34,3,243},{8,30,76},{40,44,6},{6,28,80},{35,4,243},{6,28,80},{10,46,80},{10,46,80},{10,46,80},{10,28,81},{40,30,59},{40,28,10},{40,28,10},{24,42,18},{22,44,51},{8,12,9},{26,14,1},{26,14,1},{26,14,1},{26,12,5},{30,4,50},{40,28,1},{40,28,1},{8,12,5},{15,8,50},{8,12,5},{15,2,72},{10,30,5},{26,44,5}, +{24,44,1},{15,2,72},{33,4,72},{24,44,1},{0,28,80},{33,4,72},{0,28,80},{10,0,80},{10,0,80},{10,0,80},{10,0,80},{40,28,9},{40,28,9},{40,28,9},{24,42,9},{8,12,5},{8,12,5},{26,13,152},{26,47,89},{42,30,122},{26,14,89},{10,29,245},{10,46,74},{10,30,15},{10,44,106},{8,46,247},{24,44,81},{42,45,76},{42,47,9},{12,30,18},{42,14,17},{4,1,243}, +{10,46,73},{26,14,10},{8,44,80},{1,4,243},{8,44,80},{26,15,80},{26,15,80},{26,15,80},{26,14,80},{10,31,51},{10,30,6},{10,30,6},{10,28,6},{24,14,54},{24,28,6},{42,47,5},{42,47,5},{42,47,5},{42,44,5},{45,0,50},{26,14,1},{26,14,1},{40,28,1},{27,8,50},{40,28,1},{46,10,72},{12,46,5},{12,30,9},{26,14,9},{46,10,72},{23,8,72},{26,14,9}, +{0,44,80},{23,8,72},{0,44,80},{26,0,80},{26,0,80},{26,0,80},{26,0,80},{10,30,2},{10,30,2},{10,30,2},{10,12,5},{24,44,1},{24,44,1},{12,13,148},{12,31,79},{12,46,110},{12,46,83},{42,29,248},{42,47,85},{42,46,5},{26,30,126},{8,31,247},{40,30,83},{28,29,75},{28,47,5},{28,46,5},{28,46,26},{27,0,243},{26,31,80},{42,46,1},{8,30,75},{37,8,243}, +{8,30,75},{12,15,74},{12,15,74},{12,15,74},{12,30,74},{42,15,56},{42,46,5},{42,46,5},{26,14,21},{24,46,56},{10,14,2},{28,47,1},{28,47,1},{28,47,1},{28,14,5},{29,2,50},{42,46,1},{42,46,1},{10,14,1},{35,6,50},{10,14,1},{38,3,72},{28,47,4},{44,46,1},{26,46,1},{38,3,72},{35,8,72},{26,46,1},{0,30,74},{35,8,72},{0,30,74},{12,0,74}, +{12,0,74},{12,0,74},{12,0,74},{42,46,4},{42,46,4},{42,46,4},{42,44,5},{10,14,1},{10,14,1},{28,11,146},{28,45,84},{44,47,121},{28,47,79},{12,27,244},{12,15,79},{12,47,6},{12,46,106},{40,15,244},{26,46,81},{44,43,76},{44,15,6},{14,47,11},{44,47,14},{28,13,243},{42,15,76},{12,47,5},{10,46,80},{27,12,243},{10,46,80},{28,13,75},{28,13,75},{28,13,75}, +{28,47,78},{12,29,51},{12,47,5},{12,47,5},{12,30,6},{10,47,51},{26,30,6},{44,15,5},{44,15,5},{44,15,5},{44,46,5},{43,2,50},{12,47,4},{12,47,4},{42,30,1},{21,8,50},{42,30,1},{41,2,72},{44,15,2},{14,47,2},{12,47,1},{41,2,72},{17,8,72},{12,47,1},{0,46,80},{17,8,72},{0,46,80},{28,0,74},{28,0,74},{28,0,74},{28,0,74},{12,31,1}, +{12,31,1},{12,31,1},{12,14,5},{26,46,1},{26,46,1},{14,11,148},{14,29,79},{14,15,114},{14,31,90},{44,27,248},{28,45,84},{28,15,18},{28,47,115},{10,29,247},{42,47,91},{30,27,75},{30,45,5},{30,15,6},{30,31,21},{40,3,243},{28,45,75},{28,15,9},{10,31,80},{16,9,243},{10,31,80},{14,13,74},{14,13,74},{14,13,74},{14,31,74},{44,13,56},{44,31,6},{44,31,6}, +{44,46,21},{42,31,52},{42,47,10},{30,45,1},{30,45,1},{30,45,1},{30,47,2},{38,1,50},{44,31,2},{44,31,2},{42,47,9},{43,28,50},{42,47,9},{29,12,72},{30,45,4},{30,15,5},{12,15,5},{29,12,72},{26,13,72},{12,15,5},{0,31,80},{26,13,72},{0,31,80},{14,0,74},{14,0,74},{14,0,74},{14,0,74},{44,15,5},{44,15,5},{44,15,5},{44,46,5},{42,47,1}, +{42,47,1},{30,9,154},{46,43,91},{46,29,115},{30,45,85},{14,9,247},{14,13,77},{14,29,18},{14,15,114},{12,13,247},{28,15,79},{46,25,83},{46,43,10},{47,45,21},{46,45,17},{10,1,243},{14,13,73},{30,45,6},{12,15,74},{4,9,243},{12,15,74},{30,11,80},{30,11,80},{30,11,80},{30,45,81},{14,11,56},{14,29,9},{14,29,9},{14,31,6},{12,45,56},{44,31,5},{46,43,9}, +{46,43,9},{46,43,9},{46,15,10},{39,0,50},{30,45,2},{30,45,2},{44,31,1},{9,28,50},{44,31,1},{9,6,72},{46,43,1},{47,45,5},{14,45,5},{9,6,72},{32,7,72},{14,45,5},{0,15,74},{32,7,72},{0,15,74},{30,0,80},{30,0,80},{30,0,80},{30,0,80},{14,13,5},{14,13,5},{14,13,5},{14,31,5},{44,31,4},{44,31,4},{47,9,154},{47,27,81},{47,13,106}, +{47,13,97},{46,9,244},{46,43,79},{46,13,6},{46,45,121},{12,27,248},{44,29,84},{31,25,75},{31,27,6},{31,13,6},{31,29,30},{21,0,243},{46,43,78},{46,13,5},{12,29,75},{18,7,243},{12,29,75},{47,11,80},{47,11,80},{47,11,80},{47,29,80},{46,11,51},{46,13,5},{46,13,5},{46,15,11},{28,13,54},{14,45,6},{31,43,1},{31,43,1},{31,43,1},{31,29,5},{23,2,50}, +{46,13,4},{46,13,4},{14,45,5},{20,9,50},{14,45,5},{21,2,72},{47,27,1},{15,13,5},{30,13,1},{21,2,72},{24,9,72},{30,13,1},{0,29,74},{24,9,72},{0,29,74},{47,0,80},{47,0,80},{47,0,80},{47,0,80},{46,13,1},{46,13,1},{46,13,1},{46,15,2},{14,45,2},{14,45,2},{31,7,146},{31,41,83},{31,27,126},{31,43,79},{47,23,243},{47,11,78},{47,43,5}, +{47,13,110},{14,11,247},{30,13,79},{15,9,75},{15,11,2},{15,27,21},{15,43,14},{14,3,243},{47,11,78},{47,43,5},{14,13,74},{32,5,243},{14,13,74},{31,9,75},{31,9,75},{31,9,75},{31,43,75},{47,25,52},{47,43,1},{47,43,1},{47,29,5},{14,43,56},{46,29,5},{15,11,1},{15,11,1},{15,11,1},{15,13,1},{37,2,50},{47,43,1},{47,43,1},{46,29,1},{34,7,50}, +{46,29,1},{35,2,72},{15,11,1},{45,43,5},{47,43,4},{35,2,72},{34,5,72},{47,43,4},{0,13,74},{34,5,72},{0,13,74},{31,0,74},{31,0,74},{31,0,74},{31,0,74},{47,27,1},{47,27,1},{47,27,1},{47,45,1},{46,29,4},{46,29,4},{45,7,152},{45,25,81},{45,11,106},{45,11,97},{15,23,253},{31,25,90},{31,11,15},{31,43,122},{14,25,247},{46,27,89},{29,39,73}, +{29,25,6},{29,11,6},{29,27,26},{46,3,243},{47,25,76},{31,11,6},{14,27,80},{16,3,243},{14,27,80},{45,9,80},{45,9,80},{45,9,80},{45,27,81},{15,25,59},{15,27,10},{15,27,10},{31,13,18},{30,11,54},{46,43,9},{29,41,1},{29,41,1},{29,41,1},{29,43,2},{44,1,50},{15,27,1},{15,27,1},{46,43,5},{26,9,50},{46,43,5},{46,1,72},{45,25,1},{13,11,5}, +{31,11,2},{46,1,72},{26,7,72},{31,11,2},{0,27,80},{26,7,72},{0,27,80},{45,0,80},{45,0,80},{45,0,80},{45,0,80},{15,27,9},{15,27,9},{15,27,9},{31,13,9},{47,13,5},{47,13,5},{29,5,154},{29,39,89},{13,25,122},{29,41,89},{45,21,245},{45,9,74},{45,41,15},{45,11,106},{47,9,247},{31,11,85},{13,37,76},{13,9,9},{43,25,18},{13,41,17},{1,0,243}, +{45,9,73},{29,41,10},{47,11,80},{0,1,243},{47,11,80},{29,7,80},{29,7,80},{29,7,80},{29,41,80},{45,23,51},{45,41,6},{45,41,6},{45,27,6},{31,41,54},{31,27,6},{13,9,5},{13,9,5},{13,9,5},{13,11,5},{31,5,50},{29,41,1},{29,41,1},{15,27,1},{14,9,50},{15,27,1},{27,9,72},{13,9,5},{43,25,9},{29,41,9},{27,9,72},{14,7,72},{29,41,9}, +{0,11,80},{14,7,72},{0,11,80},{29,0,80},{29,0,80},{29,0,80},{29,0,80},{45,25,1},{45,25,1},{45,25,1},{45,27,5},{31,11,5},{31,11,5},{43,5,148},{43,23,79},{43,9,110},{43,9,83},{13,21,248},{13,39,85},{13,9,9},{29,25,126},{47,23,248},{15,25,83},{27,21,75},{27,23,6},{27,9,5},{27,9,26},{15,1,243},{29,23,74},{13,9,5},{31,25,75},{9,11,243}, +{31,25,75},{43,7,74},{43,7,74},{43,7,74},{43,25,74},{13,7,56},{13,9,9},{13,9,9},{13,11,21},{15,9,56},{15,41,6},{27,39,1},{27,39,1},{27,39,1},{27,25,5},{17,2,50},{43,25,4},{43,25,4},{15,41,2},{16,1,50},{15,41,2},{17,6,72},{27,23,5},{11,9,1},{29,9,0},{17,6,72},{20,1,72},{29,9,0},{0,25,74},{20,1,72},{0,25,74},{43,0,74}, +{43,0,74},{43,0,74},{43,0,74},{13,9,5},{13,9,5},{13,9,5},{13,11,5},{15,41,5},{15,41,5},{27,3,146},{27,37,83},{27,23,119},{27,39,79},{43,19,244},{43,7,79},{43,39,10},{43,9,106},{15,7,245},{29,9,85},{11,35,76},{11,7,9},{41,39,14},{11,39,17},{27,5,243},{13,7,78},{27,39,9},{45,9,80},{6,1,243},{45,9,80},{27,5,75},{27,5,75},{27,5,75}, +{27,39,75},{43,21,51},{43,39,6},{43,39,6},{43,25,6},{45,39,53},{29,25,6},{11,7,5},{11,7,5},{11,7,5},{11,9,5},{29,3,50},{27,39,5},{27,39,5},{13,25,1},{43,9,50},{13,25,1},{27,3,72},{41,7,4},{41,39,5},{27,39,5},{27,3,72},{39,9,72},{27,39,5},{0,9,80},{39,9,72},{0,9,80},{27,0,74},{27,0,74},{27,0,74},{27,0,74},{43,23,1}, +{43,23,1},{43,23,1},{43,25,5},{29,9,5},{29,9,5},{41,3,148},{41,21,79},{41,7,111},{41,7,91},{11,19,248},{11,37,85},{11,7,10},{27,39,122},{45,21,248},{13,23,83},{25,19,75},{25,21,6},{25,7,6},{25,23,30},{17,10,243},{27,21,81},{11,7,6},{29,23,75},{24,1,243},{29,23,75},{41,5,74},{41,5,74},{41,5,74},{41,23,74},{11,5,56},{11,7,9},{11,7,9}, +{11,9,21},{29,7,54},{13,39,5},{25,37,1},{25,37,1},{25,37,1},{25,39,2},{39,11,50},{41,23,4},{41,23,4},{13,39,4},{22,1,50},{13,39,4},{39,7,72},{25,21,5},{9,7,5},{27,7,2},{39,7,72},{26,1,72},{27,7,2},{0,23,74},{26,1,72},{0,23,74},{41,0,74},{41,0,74},{41,0,74},{41,0,74},{11,7,5},{11,7,5},{11,7,5},{11,9,5},{13,39,1}, +{13,39,1},{25,1,154},{9,35,91},{9,21,110},{25,37,89},{41,1,247},{41,5,77},{41,21,13},{41,7,109},{43,5,247},{27,7,85},{39,19,81},{9,35,10},{39,21,13},{9,37,22},{41,1,243},{41,5,73},{41,21,9},{43,7,80},{47,3,243},{43,7,80},{25,3,80},{25,3,80},{25,3,80},{25,37,80},{41,3,56},{41,21,9},{41,21,9},{41,23,9},{27,37,54},{11,23,9},{39,21,9}, +{39,21,9},{39,21,9},{9,7,10},{25,5,50},{25,37,1},{25,37,1},{11,23,5},{10,1,50},{11,23,5},{23,5,72},{9,35,1},{39,21,4},{11,21,4},{23,5,72},{14,1,72},{11,21,4},{0,7,80},{14,1,72},{0,7,80},{25,0,80},{25,0,80},{25,0,80},{25,0,80},{41,5,5},{41,5,5},{41,5,5},{41,23,5},{27,7,5},{27,7,5},{39,1,148},{39,3,79},{39,5,110}, +{39,5,83},{9,1,244},{9,35,79},{9,5,5},{9,21,122},{43,19,248},{11,21,77},{23,17,72},{23,19,2},{23,5,4},{23,5,25},{9,1,243},{25,19,74},{9,5,4},{27,21,73},{46,1,243},{27,21,73},{39,3,75},{39,3,75},{39,3,75},{39,21,75},{9,3,51},{9,5,5},{9,5,5},{9,7,18},{11,5,53},{41,37,2},{23,19,1},{23,19,1},{23,19,1},{23,21,1},{9,3,50}, +{9,5,4},{9,5,4},{41,37,1},{31,3,50},{41,37,1},{23,17,72},{23,19,2},{7,5,4},{25,5,0},{23,17,72},{45,17,72},{25,5,0},{0,21,72},{45,17,72},{0,21,72},{39,0,74},{39,0,74},{39,0,74},{39,0,74},{9,5,1},{9,5,1},{9,5,1},{9,7,2},{41,37,1},{41,37,1},{7,1,184},{23,17,93},{7,19,122},{23,35,89},{23,1,260},{39,3,74},{39,35,15}, +{39,5,106},{41,3,247},{25,5,85},{37,17,81},{7,33,5},{37,19,19},{7,35,17},{19,9,243},{39,3,73},{23,35,10},{41,5,80},{45,1,243},{41,5,80},{23,1,80},{23,1,80},{23,1,80},{23,35,80},{39,17,51},{39,35,6},{39,35,6},{39,21,6},{25,35,54},{9,21,9},{7,33,4},{7,33,4},{7,33,4},{7,5,5},{23,3,50},{23,35,1},{23,35,1},{9,21,5},{43,3,50}, +{9,21,5},{21,3,72},{7,33,1},{37,19,10},{23,35,9},{21,3,72},{43,1,72},{23,35,9},{0,5,80},{43,1,72},{0,5,80},{23,0,80},{23,0,80},{23,0,80},{23,0,80},{39,19,1},{39,19,1},{39,19,1},{39,21,2},{25,5,5},{25,5,5},{21,1,234},{37,1,79},{37,3,110},{37,3,90},{37,1,300},{7,33,82},{7,3,9},{23,19,139},{41,17,248},{9,19,83},{21,1,90}, +{21,17,2},{21,3,4},{21,3,25},{21,17,243},{23,17,74},{7,3,5},{25,19,75},{17,21,243},{25,19,75},{37,1,75},{37,1,75},{37,1,75},{37,19,74},{7,1,56},{7,19,6},{7,19,6},{7,5,21},{9,3,53},{9,35,6},{21,17,1},{21,17,1},{21,17,1},{21,19,4},{3,25,50},{7,19,2},{7,19,2},{9,35,2},{29,1,50},{9,35,2},{17,39,72},{21,17,2},{5,3,4}, +{23,3,0},{17,39,72},{39,17,72},{23,3,0},{0,19,74},{39,17,72},{0,19,74},{37,0,74},{37,0,74},{37,0,74},{37,0,74},{7,3,5},{7,3,5},{7,3,5},{7,5,5},{9,35,5},{9,35,5},{5,1,290},{5,1,103},{5,17,110},{21,33,106},{5,1,345},{37,1,78},{37,17,13},{37,3,119},{39,1,248},{23,3,91},{35,1,126},{35,1,6},{35,17,8},{5,33,29},{35,1,243}, +{37,1,74},{37,17,9},{9,33,81},{1,35,243},{9,33,81},{5,1,94},{5,1,94},{5,1,94},{21,33,90},{21,1,61},{37,17,9},{37,17,9},{37,19,9},{23,33,53},{7,19,8},{35,17,4},{35,17,4},{35,17,4},{35,3,4},{19,5,50},{21,33,0},{21,33,0},{7,19,4},{37,3,50},{7,19,4},{17,5,72},{35,1,2},{35,17,4},{7,17,4},{17,5,72},{5,17,72},{7,17,4}, +{0,33,80},{5,17,72},{0,33,80},{5,0,90},{5,0,90},{5,0,90},{5,0,90},{37,1,4},{37,1,4},{37,1,4},{37,19,5},{23,3,1},{23,3,1},{19,1,349},{35,1,185},{35,1,121},{35,1,81},{19,1,398},{5,1,102},{5,1,2},{21,17,122},{37,1,270},{7,17,66},{3,1,126},{19,1,45},{19,1,9},{19,1,25},{33,33,221},{35,1,82},{5,1,1},{23,17,61},{33,33,221}, +{23,17,61},{35,1,121},{35,1,121},{35,1,121},{35,17,73},{35,1,94},{5,1,2},{5,1,2},{5,33,17},{7,1,53},{37,33,1},{19,1,9},{19,1,9},{19,1,9},{19,17,1},{3,3,50},{5,1,1},{5,1,1},{37,33,0},{3,3,50},{37,33,0},{1,3,61},{33,1,25},{3,1,1},{5,1,1},{1,3,61},{3,1,61},{5,1,1},{0,17,61},{3,1,61},{0,17,61},{35,0,72}, +{35,0,72},{35,0,72},{35,0,72},{5,1,1},{5,1,1},{5,1,1},{5,3,1},{37,33,1},{37,33,1},{3,1,239},{3,1,164},{3,1,139},{19,1,89},{3,1,239},{19,1,62},{19,1,26},{35,17,34},{35,1,163},{21,1,10},{33,1,69},{33,1,29},{33,1,20},{33,1,4},{1,3,93},{3,1,38},{19,1,10},{21,1,10},{3,1,93},{21,1,10},{3,1,139},{3,1,139},{3,1,139}, +{19,1,89},{19,1,138},{19,1,26},{19,1,26},{35,17,9},{5,1,74},{5,17,8},{33,1,20},{33,1,20},{33,1,20},{33,1,4},{17,3,50},{19,1,10},{19,1,10},{5,17,4},{35,1,50},{5,17,4},{1,17,5},{17,1,1},{17,1,0},{33,1,0},{1,17,5},{17,1,5},{33,1,0},{0,1,9},{17,1,5},{0,1,9},{19,0,80},{19,0,80},{19,0,80},{19,0,80},{19,1,17}, +{19,1,17},{19,1,17},{35,17,5},{21,1,1},{21,1,1},{17,1,162},{33,1,130},{33,1,121},{33,1,81},{33,1,138},{33,1,58},{33,1,49},{3,1,1},{19,1,82},{19,1,10},{17,1,18},{17,1,10},{17,1,9},{17,1,1},{1,17,18},{17,1,6},{17,1,5},{3,1,0},{17,1,18},{3,1,0},{33,1,121},{33,1,121},{33,1,121},{33,1,81},{33,1,89},{33,1,49},{33,1,49}, +{3,1,1},{19,1,46},{19,1,10},{17,1,9},{17,1,9},{17,1,9},{17,1,1},{17,1,13},{17,1,5},{17,1,5},{3,1,0},{33,1,13},{3,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{33,0,72},{33,0,72},{33,0,72},{33,0,72},{3,1,26},{3,1,26},{3,1,26},{3,1,1},{19,1,10}, +{19,1,10},{0,38,200},{0,20,25},{0,34,5},{0,34,85},{0,20,442},{0,34,266},{0,18,125},{0,2,318},{0,18,482},{0,2,343},{0,38,200},{0,20,25},{0,34,5},{0,34,85},{16,4,441},{0,34,266},{0,18,125},{0,2,318},{4,16,441},{0,2,318},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,2,41},{0,32,13},{0,32,13},{0,16,25},{0,16,46},{0,16,26},{0,4,1}, +{0,4,1},{0,4,1},{0,2,1},{0,2,41},{0,32,13},{0,32,13},{0,16,25},{2,0,41},{0,16,25},{18,2,200},{0,20,25},{0,34,5},{0,34,85},{18,2,200},{38,0,200},{0,34,85},{0,18,208},{38,0,200},{0,18,208},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,10,202},{0,22,1},{0,20,26}, +{0,4,41},{0,22,689},{0,20,352},{0,4,141},{0,18,468},{0,34,750},{0,18,504},{0,10,202},{0,22,1},{0,20,26},{0,4,41},{34,0,686},{0,20,352},{0,4,141},{0,18,468},{0,34,686},{0,18,468},{0,22,0},{0,22,0},{0,22,0},{0,34,1},{0,34,145},{0,18,45},{0,18,45},{0,32,85},{0,32,158},{0,32,94},{0,22,0},{0,22,0},{0,22,0},{0,34,1},{16,2,145}, +{0,18,45},{0,18,45},{0,32,85},{34,0,145},{0,32,85},{20,16,200},{0,22,1},{16,20,5},{0,4,41},{20,16,200},{16,20,200},{0,4,41},{0,34,200},{16,20,200},{0,34,200},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{16,12,229},{16,8,30},{16,6,74},{16,36,58},{0,10,723},{0,6,282},{0,36,69}, +{0,4,414},{0,20,868},{0,34,513},{16,12,204},{16,8,5},{32,6,29},{16,36,33},{4,2,723},{0,6,282},{0,36,69},{0,4,414},{10,0,723},{0,4,414},{16,8,30},{16,8,30},{16,8,30},{16,4,33},{0,6,164},{0,4,25},{0,4,25},{0,18,65},{0,18,206},{0,18,101},{16,8,5},{16,8,5},{16,8,5},{16,4,8},{2,2,162},{0,4,25},{0,4,25},{0,18,65},{2,2,162}, +{0,18,65},{18,8,200},{16,8,1},{2,36,5},{0,36,20},{18,8,200},{44,0,200},{0,36,20},{0,4,218},{44,0,200},{0,4,218},{16,0,29},{16,0,29},{16,0,29},{16,0,29},{0,18,1},{0,18,1},{0,18,1},{0,32,0},{0,32,9},{0,32,9},{16,30,327},{32,40,139},{32,22,202},{16,6,151},{0,28,724},{0,8,236},{0,22,14},{0,20,350},{0,6,956},{0,20,494},{2,12,203}, +{2,24,2},{2,22,27},{2,6,42},{36,2,723},{0,8,236},{0,22,14},{0,20,350},{20,4,723},{0,20,350},{16,42,125},{16,42,125},{16,42,125},{16,6,126},{0,24,164},{0,6,1},{0,6,1},{0,4,37},{0,4,280},{0,34,109},{2,24,1},{2,24,1},{2,24,1},{2,36,2},{18,4,162},{0,6,1},{0,6,1},{0,4,37},{36,2,162},{0,4,37},{8,0,200},{2,24,1},{18,22,5}, +{0,22,10},{8,0,200},{47,0,200},{0,22,10},{0,36,200},{47,0,200},{0,36,200},{16,0,125},{16,0,125},{16,0,125},{16,0,125},{0,6,0},{0,6,0},{0,6,0},{0,18,1},{0,18,37},{0,18,37},{2,46,410},{2,26,218},{2,8,317},{2,38,226},{16,30,725},{16,40,217},{16,38,15},{0,6,312},{0,38,988},{0,6,417},{34,28,209},{18,26,13},{34,8,27},{18,38,34},{8,0,723}, +{0,40,203},{16,38,14},{0,6,296},{47,0,723},{0,6,296},{2,12,208},{2,12,208},{2,12,208},{2,22,209},{16,42,163},{16,38,6},{16,38,6},{16,20,26},{0,6,285},{0,20,81},{18,26,9},{18,26,9},{18,26,9},{34,6,10},{2,24,162},{32,22,5},{32,22,5},{0,20,17},{28,0,162},{0,20,17},{24,2,200},{18,26,4},{4,8,9},{0,8,10},{24,2,200},{13,0,200},{0,8,10}, +{0,22,208},{13,0,200},{0,22,208},{2,0,208},{2,0,208},{2,0,208},{2,0,208},{16,8,1},{16,8,1},{16,8,1},{16,4,2},{0,4,45},{0,4,45},{18,15,402},{18,12,222},{34,24,331},{18,24,218},{32,47,725},{32,26,212},{32,24,5},{32,38,324},{0,24,884},{0,38,300},{4,30,200},{4,26,5},{4,24,36},{4,8,41},{40,0,723},{16,26,203},{32,24,4},{0,38,251},{46,2,723}, +{0,38,251},{18,14,203},{18,14,203},{18,14,203},{18,8,202},{32,28,163},{32,24,5},{32,24,5},{32,6,21},{0,38,219},{0,6,13},{4,26,1},{4,26,1},{4,26,1},{4,38,0},{22,2,162},{2,8,1},{2,8,1},{0,6,4},{42,2,162},{0,6,4},{16,11,200},{34,42,4},{20,24,4},{32,24,0},{16,11,200},{25,0,200},{32,24,0},{0,38,202},{25,0,200},{0,38,202},{18,0,202}, +{18,0,202},{18,0,202},{18,0,202},{32,40,1},{32,40,1},{32,40,1},{32,36,1},{0,6,9},{0,6,9},{4,15,408},{4,28,221},{4,10,317},{4,40,221},{18,31,725},{18,42,217},{18,40,6},{2,8,315},{0,26,788},{0,8,228},{20,47,204},{20,12,6},{36,10,27},{20,40,33},{10,2,723},{32,12,203},{18,40,5},{0,8,227},{45,2,723},{0,8,227},{4,14,208},{4,14,208},{4,14,208}, +{4,24,209},{18,44,163},{18,40,2},{18,40,2},{18,22,26},{0,24,179},{0,38,3},{20,12,5},{20,12,5},{20,12,5},{20,24,5},{8,2,162},{18,40,1},{18,40,1},{0,38,2},{30,2,162},{0,38,2},{26,4,200},{20,12,2},{6,40,5},{18,40,4},{26,4,200},{7,0,200},{18,40,4},{0,24,208},{7,0,200},{0,24,208},{4,0,208},{4,0,208},{4,0,208},{4,0,208},{18,10,1}, +{18,10,1},{18,10,1},{18,6,2},{0,38,2},{0,38,2},{20,13,402},{20,14,220},{36,26,331},{20,26,216},{34,45,725},{34,12,213},{34,26,5},{34,24,337},{0,12,740},{16,40,216},{6,31,202},{6,28,1},{6,26,36},{6,10,41},{42,2,723},{18,28,200},{34,26,4},{0,40,209},{44,6,723},{0,40,209},{20,46,200},{20,46,200},{20,46,200},{20,10,201},{34,30,163},{34,26,5},{34,26,5}, +{34,8,18},{0,26,164},{32,8,2},{6,28,0},{6,28,0},{6,28,0},{6,40,1},{24,4,162},{4,10,1},{4,10,1},{2,8,2},{11,0,162},{2,8,2},{14,0,200},{6,28,1},{22,26,4},{34,26,0},{14,0,200},{8,10,200},{34,26,0},{0,40,200},{8,10,200},{0,40,200},{20,0,200},{20,0,200},{20,0,200},{20,0,200},{34,42,1},{34,42,1},{34,42,1},{34,38,1},{32,8,1}, +{32,8,1},{6,13,404},{6,30,219},{6,12,327},{6,42,215},{20,29,725},{20,44,217},{20,12,9},{4,10,321},{0,14,723},{32,26,222},{38,15,206},{38,14,8},{38,12,24},{22,42,34},{14,0,723},{4,14,203},{20,12,8},{0,26,203},{8,10,723},{0,26,203},{6,47,202},{6,47,202},{6,47,202},{6,26,206},{20,46,163},{20,12,5},{20,12,5},{20,24,30},{32,42,164},{2,40,6},{38,44,4}, +{38,44,4},{38,44,4},{38,10,5},{38,10,162},{20,12,4},{20,12,4},{2,40,2},{23,0,162},{2,40,2},{30,2,200},{38,14,4},{8,12,4},{4,12,4},{30,2,200},{35,2,200},{4,12,4},{0,26,202},{35,2,200},{0,26,202},{6,0,202},{6,0,202},{6,0,202},{6,0,202},{20,12,1},{20,12,1},{20,12,1},{20,8,2},{2,10,4},{2,10,4},{22,11,402},{22,47,227},{38,44,321}, +{22,28,218},{36,27,727},{36,30,215},{36,28,13},{36,42,327},{32,30,725},{18,42,212},{8,29,200},{8,30,4},{24,28,29},{8,12,45},{0,1,723},{20,30,203},{6,28,5},{32,42,202},{1,0,723},{32,42,202},{22,15,202},{22,15,202},{22,15,202},{22,12,202},{36,15,168},{36,28,13},{36,28,13},{36,10,17},{2,28,163},{34,10,9},{8,30,0},{8,30,0},{8,30,0},{8,42,0},{28,2,162}, +{6,12,5},{6,12,5},{4,10,4},{42,8,162},{4,10,4},{47,2,200},{8,30,4},{24,28,4},{36,28,0},{47,2,200},{17,2,200},{36,28,0},{0,42,202},{17,2,200},{0,42,202},{22,0,202},{22,0,202},{22,0,202},{22,0,202},{36,14,5},{36,14,5},{36,14,5},{36,40,4},{34,26,2},{34,26,2},{8,11,408},{8,31,221},{8,14,312},{8,44,226},{22,27,724},{22,46,217},{22,44,12}, +{6,12,321},{2,47,728},{34,28,234},{40,29,209},{24,47,10},{40,14,22},{24,44,34},{18,3,723},{36,47,203},{22,44,11},{32,28,208},{45,8,723},{32,28,208},{8,15,209},{8,15,209},{8,15,209},{8,28,209},{22,15,165},{22,44,3},{22,44,3},{22,26,30},{34,44,164},{4,42,6},{40,30,10},{40,30,10},{40,30,10},{40,12,10},{16,3,162},{22,44,2},{22,44,2},{4,42,2},{17,0,162}, +{4,42,2},{15,2,200},{24,47,1},{10,14,4},{6,14,5},{15,2,200},{33,4,200},{6,14,5},{0,28,208},{33,4,200},{0,28,208},{8,0,208},{8,0,208},{8,0,208},{8,0,208},{22,14,1},{22,14,1},{22,14,1},{22,10,2},{4,12,4},{4,12,4},{24,9,402},{24,45,227},{40,46,324},{24,30,218},{38,25,727},{38,47,213},{38,30,13},{38,28,325},{34,31,727},{20,44,218},{10,27,202}, +{10,31,1},{26,30,29},{10,14,45},{4,3,723},{22,31,200},{8,30,8},{34,44,202},{3,4,723},{34,44,202},{24,13,202},{24,13,202},{24,13,202},{24,14,202},{38,13,168},{38,30,13},{38,30,13},{38,12,17},{4,30,163},{36,12,9},{10,31,0},{10,31,0},{10,31,0},{10,44,0},{30,4,162},{8,14,4},{8,14,4},{6,12,4},{15,8,162},{6,12,4},{43,0,200},{10,31,1},{26,30,4}, +{38,30,0},{43,0,200},{19,6,200},{38,30,0},{0,44,202},{19,6,200},{0,44,202},{24,0,202},{24,0,202},{24,0,202},{24,0,202},{38,46,5},{38,46,5},{38,46,5},{38,42,4},{20,28,4},{20,28,4},{10,9,404},{10,29,219},{26,47,330},{10,46,222},{24,9,723},{24,15,209},{24,47,18},{8,14,324},{4,45,723},{36,30,222},{42,11,206},{42,15,8},{42,47,22},{26,46,41},{43,0,723}, +{8,15,202},{24,47,18},{4,30,202},{19,6,723},{4,30,202},{10,43,202},{10,43,202},{10,43,202},{10,30,206},{24,13,162},{24,46,8},{24,46,8},{24,44,25},{20,47,168},{22,44,4},{42,15,4},{42,15,4},{42,15,4},{42,14,8},{45,0,162},{40,46,4},{40,46,4},{22,44,0},{27,8,162},{22,44,0},{38,3,200},{42,15,4},{12,47,9},{8,47,10},{38,3,200},{35,8,200},{8,47,10}, +{0,30,202},{35,8,200},{0,30,202},{10,0,202},{10,0,202},{10,0,202},{10,0,202},{24,47,0},{24,47,0},{24,47,0},{24,12,4},{22,44,4},{22,44,4},{26,7,408},{42,13,236},{42,15,332},{26,31,224},{40,23,727},{40,45,213},{40,31,8},{40,46,312},{36,29,725},{22,46,218},{12,25,201},{12,13,6},{28,31,29},{12,47,42},{11,0,723},{24,29,203},{40,31,4},{6,46,209},{5,8,723}, +{6,46,209},{26,41,208},{26,41,208},{26,41,208},{26,47,208},{40,11,168},{40,31,8},{40,31,8},{40,14,22},{6,31,163},{38,30,10},{12,13,2},{12,13,2},{12,13,2},{12,46,2},{29,2,162},{10,47,2},{10,47,2},{22,30,9},{35,6,162},{22,30,9},{41,2,200},{42,13,4},{44,31,1},{40,31,0},{41,2,200},{17,8,200},{40,31,0},{0,46,208},{17,8,200},{0,46,208},{26,0,208}, +{26,0,208},{26,0,208},{26,0,208},{40,15,4},{40,15,4},{40,15,4},{40,44,5},{38,30,1},{38,30,1},{12,7,404},{12,27,212},{12,45,332},{12,15,215},{26,23,724},{26,13,216},{26,15,8},{26,47,318},{6,43,723},{8,47,227},{44,9,206},{44,13,8},{44,45,22},{28,15,38},{24,3,723},{10,13,202},{26,15,8},{6,31,209},{3,24,723},{6,31,209},{12,41,202},{12,41,202},{12,41,202}, +{12,31,203},{26,11,162},{26,15,4},{26,15,4},{26,46,25},{38,15,162},{24,46,4},{44,13,4},{44,13,4},{44,13,4},{44,47,5},{43,2,162},{26,15,4},{26,15,4},{24,46,0},{21,8,162},{24,46,0},{29,12,200},{28,43,2},{14,15,8},{26,15,4},{29,12,200},{26,13,200},{26,15,4},{0,31,208},{26,13,200},{0,31,208},{12,0,202},{12,0,202},{12,0,202},{12,0,202},{26,45,0}, +{26,45,0},{26,45,0},{26,14,4},{24,46,4},{24,46,4},{28,5,402},{28,41,222},{44,13,332},{28,29,218},{42,21,727},{42,43,213},{42,29,8},{42,31,340},{38,27,724},{24,15,217},{14,23,201},{14,27,3},{30,29,29},{14,45,42},{9,2,723},{26,27,201},{42,29,4},{22,15,201},{2,9,723},{22,15,201},{28,9,202},{28,9,202},{28,9,202},{28,45,203},{42,9,168},{42,29,8},{42,29,8}, +{42,47,21},{8,29,163},{40,47,2},{14,11,2},{14,11,2},{14,11,2},{14,15,2},{38,1,162},{12,45,2},{12,45,2},{10,47,2},{43,28,162},{10,47,2},{37,0,200},{14,27,2},{46,29,1},{42,29,0},{37,0,200},{36,9,200},{42,29,0},{0,15,200},{36,9,200},{0,15,200},{28,0,202},{28,0,202},{28,0,202},{28,0,202},{42,13,4},{42,13,4},{42,13,4},{42,46,5},{40,47,1}, +{40,47,1},{14,35,400},{14,25,217},{30,43,340},{14,13,213},{28,5,723},{28,11,209},{28,43,8},{12,45,332},{8,41,724},{40,29,222},{46,7,201},{46,41,2},{46,43,21},{30,13,41},{37,0,723},{12,41,203},{28,43,8},{8,29,202},{36,9,723},{8,29,202},{14,23,201},{14,23,201},{14,23,201},{14,13,204},{28,9,162},{28,43,4},{28,43,4},{28,31,29},{40,13,164},{26,15,3},{46,11,2}, +{46,11,2},{46,11,2},{46,29,5},{39,0,162},{44,13,2},{44,13,2},{10,15,2},{9,28,162},{10,15,2},{21,2,200},{46,41,1},{47,43,5},{12,43,4},{21,2,200},{24,9,200},{12,43,4},{0,29,202},{24,9,200},{0,29,202},{14,0,200},{14,0,200},{14,0,200},{14,0,200},{28,43,0},{28,43,0},{28,43,0},{28,47,1},{26,15,2},{26,15,2},{30,3,410},{46,9,227},{46,27,318}, +{30,27,224},{14,5,728},{44,25,215},{14,27,8},{44,13,332},{40,25,725},{26,13,212},{47,21,200},{47,25,4},{47,27,25},{47,43,52},{5,0,723},{28,25,203},{14,27,4},{40,13,202},{0,5,723},{40,13,202},{30,7,209},{30,7,209},{30,7,209},{30,43,208},{14,39,166},{14,27,8},{14,27,8},{44,45,22},{10,27,163},{12,45,8},{47,25,0},{47,25,0},{47,25,0},{47,13,0},{23,2,162}, +{14,27,4},{14,27,4},{12,45,4},{20,9,162},{12,45,4},{35,2,200},{47,25,4},{15,27,4},{44,27,0},{35,2,200},{34,5,200},{44,27,0},{0,13,202},{34,5,200},{0,13,202},{30,0,208},{30,0,208},{30,0,208},{30,0,208},{14,27,4},{14,27,4},{14,27,4},{14,15,8},{42,29,2},{42,29,2},{47,3,408},{47,23,218},{47,41,312},{47,11,226},{30,3,723},{30,9,209},{30,41,8}, +{14,43,332},{10,39,723},{12,43,236},{15,21,209},{31,39,10},{15,41,22},{31,11,43},{30,3,723},{44,39,204},{30,41,8},{40,27,208},{42,9,723},{40,27,208},{47,7,209},{47,7,209},{47,7,209},{47,27,208},{30,7,162},{30,41,4},{30,41,4},{30,29,29},{42,11,164},{12,13,6},{31,23,9},{31,23,9},{31,23,9},{31,27,10},{37,2,162},{46,11,2},{46,11,2},{12,13,2},{34,7,162}, +{12,13,2},{46,1,200},{31,39,1},{45,41,5},{14,41,4},{46,1,200},{26,7,200},{14,41,4},{0,27,208},{26,7,200},{0,27,208},{47,0,208},{47,0,208},{47,0,208},{47,0,208},{30,41,0},{30,41,0},{30,41,0},{30,45,1},{12,43,4},{12,43,4},{31,1,402},{31,37,222},{15,9,324},{31,25,218},{46,17,733},{46,23,215},{46,25,18},{46,27,330},{42,23,725},{28,11,219},{45,19,202}, +{45,23,4},{45,25,25},{45,41,52},{3,2,723},{30,23,203},{47,25,8},{42,11,202},{2,3,723},{42,11,202},{31,5,202},{31,5,202},{31,5,202},{31,41,202},{46,5,173},{46,25,18},{46,25,18},{46,43,22},{12,25,163},{14,43,8},{45,23,0},{45,23,0},{45,23,0},{45,11,0},{44,1,162},{47,41,4},{47,41,4},{14,43,4},{26,9,162},{14,43,4},{31,1,200},{45,23,4},{13,25,4}, +{46,25,0},{31,1,200},{32,1,200},{46,25,0},{0,11,202},{32,1,200},{0,11,202},{31,0,202},{31,0,202},{31,0,202},{31,0,202},{46,9,10},{46,9,10},{46,9,10},{46,13,9},{28,27,4},{28,27,4},{45,1,404},{45,21,218},{29,39,325},{45,9,222},{31,1,723},{31,7,209},{31,39,13},{47,41,324},{12,37,725},{44,25,227},{13,3,206},{13,37,9},{13,39,17},{29,9,48},{31,1,723}, +{47,7,208},{31,39,13},{12,25,202},{32,1,723},{12,25,202},{45,35,202},{45,35,202},{45,35,202},{45,25,203},{31,5,162},{31,9,8},{31,9,8},{31,27,29},{14,9,166},{30,11,1},{13,7,4},{13,7,4},{13,7,4},{13,25,8},{31,5,162},{15,9,4},{15,9,4},{30,11,0},{14,9,162},{30,11,0},{17,6,200},{29,21,4},{43,39,4},{46,39,5},{17,6,200},{20,1,200},{46,39,5}, +{0,25,202},{20,1,200},{0,25,202},{45,0,202},{45,0,202},{45,0,202},{45,0,202},{31,39,0},{31,39,0},{31,39,0},{31,27,4},{30,11,1},{30,11,1},{13,1,440},{29,35,234},{13,7,321},{29,23,218},{45,1,732},{15,21,215},{45,23,12},{15,9,312},{44,21,731},{30,9,221},{43,17,201},{43,5,6},{27,23,30},{43,39,46},{45,1,723},{31,21,203},{45,23,3},{14,9,209},{27,9,723}, +{14,9,209},{29,33,208},{29,33,208},{29,33,208},{29,39,208},{15,3,168},{45,23,11},{45,23,11},{15,41,22},{14,23,168},{46,25,10},{43,5,2},{43,5,2},{43,5,2},{43,9,2},{17,2,162},{45,23,2},{45,23,2},{30,25,10},{16,1,162},{30,25,10},{27,3,200},{13,5,4},{11,23,2},{15,23,1},{27,3,200},{39,9,200},{15,23,1},{0,9,208},{39,9,200},{0,9,208},{29,0,208}, +{29,0,208},{29,0,208},{29,0,208},{15,7,5},{15,7,5},{15,7,5},{15,11,4},{46,25,1},{46,25,1},{43,1,500},{43,19,212},{43,37,327},{43,7,220},{13,1,760},{29,5,209},{29,37,13},{45,39,321},{14,35,724},{46,23,227},{11,1,206},{11,35,9},{11,37,17},{27,7,43},{33,10,723},{15,35,204},{29,37,13},{14,23,202},{38,1,723},{14,23,202},{43,33,202},{43,33,202},{43,33,202}, +{43,23,203},{29,3,162},{29,7,5},{29,7,5},{29,25,29},{46,7,165},{31,9,4},{11,5,4},{11,5,4},{11,5,4},{11,39,5},{29,3,162},{13,7,5},{13,7,5},{31,9,0},{43,9,162},{31,9,0},{39,7,200},{27,35,2},{41,37,4},{15,37,5},{39,7,200},{26,1,200},{15,37,5},{0,23,202},{26,1,200},{0,23,202},{43,0,202},{43,0,202},{43,0,202},{43,0,202},{29,37,0}, +{29,37,0},{29,37,0},{29,25,4},{31,9,4},{31,9,4},{11,1,530},{27,33,222},{11,5,321},{27,21,219},{27,1,812},{13,19,215},{13,21,9},{13,7,327},{46,19,724},{31,7,219},{25,1,225},{41,3,6},{25,21,30},{41,37,46},{41,3,723},{29,19,203},{13,21,5},{46,7,202},{21,9,723},{46,7,202},{27,1,203},{27,1,203},{27,1,203},{27,37,202},{13,1,168},{13,21,8},{13,21,8}, +{13,39,24},{47,21,163},{15,39,8},{41,3,2},{41,3,2},{41,3,2},{41,7,1},{39,11,162},{13,21,4},{13,21,4},{45,39,4},{22,1,162},{45,39,4},{25,1,200},{11,3,4},{9,21,2},{13,21,1},{25,1,200},{33,9,200},{13,21,1},{0,7,202},{33,9,200},{0,7,202},{27,0,202},{27,0,202},{27,0,202},{27,0,202},{13,5,4},{13,5,4},{13,5,4},{13,9,4},{15,39,4}, +{15,39,4},{25,1,634},{41,17,216},{25,35,337},{41,5,220},{41,1,863},{27,3,211},{27,35,5},{27,37,331},{47,33,725},{15,21,220},{9,1,251},{9,33,2},{9,35,18},{25,5,48},{25,1,723},{43,33,203},{27,35,5},{47,21,200},{33,9,723},{47,21,200},{41,1,209},{41,1,209},{41,1,209},{41,5,204},{27,1,164},{27,35,4},{27,35,4},{27,7,36},{15,5,164},{29,7,1},{9,3,2}, +{9,3,2},{9,3,2},{9,21,2},{25,5,162},{11,5,1},{11,5,1},{29,7,0},{10,1,162},{29,7,0},{23,17,200},{9,33,1},{39,35,1},{43,35,1},{23,17,200},{45,17,200},{43,35,1},{0,21,200},{45,17,200},{0,21,200},{41,0,200},{41,0,200},{41,0,200},{41,0,200},{27,35,0},{27,35,0},{27,35,0},{27,23,4},{29,7,1},{29,7,1},{39,1,724},{9,1,228},{9,3,315}, +{25,19,218},{9,1,932},{11,17,213},{41,19,6},{11,5,317},{15,17,725},{29,5,221},{23,1,288},{39,1,3},{23,19,26},{39,19,51},{39,1,723},{27,17,203},{41,19,2},{15,5,208},{31,1,723},{15,5,208},{9,1,227},{9,1,227},{9,1,227},{25,35,209},{41,1,174},{41,19,5},{41,19,5},{11,37,27},{45,19,163},{13,21,6},{39,1,2},{39,1,2},{39,1,2},{39,5,2},{9,3,162}, +{41,19,1},{41,19,1},{13,21,5},{31,3,162},{13,21,5},{21,3,200},{39,1,2},{7,19,2},{11,19,1},{21,3,200},{43,1,200},{11,19,1},{0,5,208},{43,1,200},{0,5,208},{25,0,208},{25,0,208},{25,0,208},{25,0,208},{41,19,4},{41,19,4},{41,19,4},{41,7,5},{13,21,2},{13,21,2},{23,1,864},{39,1,300},{39,33,324},{39,3,222},{39,1,1020},{25,1,211},{25,33,5}, +{25,35,331},{29,1,732},{13,19,222},{37,1,347},{7,1,13},{7,33,21},{23,3,48},{1,13,723},{25,1,211},{25,33,5},{15,19,203},{13,1,723},{15,19,203},{39,1,251},{39,1,251},{39,1,251},{39,19,203},{9,1,195},{25,33,4},{25,33,4},{25,5,36},{13,3,164},{27,5,5},{7,1,4},{7,1,4},{7,1,4},{7,35,8},{23,3,162},{9,3,1},{9,3,1},{27,5,1},{43,3,162}, +{27,5,1},{17,39,200},{7,1,9},{37,33,1},{41,33,1},{17,39,200},{39,17,200},{41,33,1},{0,19,202},{39,17,200},{0,19,202},{39,0,202},{39,0,202},{39,0,202},{39,0,202},{25,33,0},{25,33,0},{25,33,0},{25,21,4},{43,35,4},{43,35,4},{37,1,1012},{7,1,417},{7,1,312},{23,17,218},{7,1,1144},{39,1,268},{39,17,15},{9,3,317},{27,1,804},{27,3,218},{5,1,398}, +{21,1,81},{21,17,26},{37,17,51},{35,3,723},{23,1,254},{39,17,6},{13,3,208},{25,1,723},{13,3,208},{7,1,296},{7,1,296},{7,1,296},{23,33,209},{39,1,243},{39,17,14},{39,17,14},{9,35,27},{43,17,163},{27,19,13},{21,1,17},{21,1,17},{21,1,17},{37,3,1},{3,25,162},{39,17,5},{39,17,5},{27,19,9},{29,1,162},{27,19,9},{19,1,200},{5,1,45},{5,17,2}, +{9,17,1},{19,1,200},{37,1,200},{9,17,1},{0,3,208},{37,1,200},{0,3,208},{23,0,208},{23,0,208},{23,0,208},{23,0,208},{9,1,10},{9,1,10},{9,1,10},{9,5,9},{27,19,4},{27,19,4},{5,1,919},{21,1,494},{21,1,350},{37,1,201},{21,1,1014},{7,1,251},{23,1,14},{23,33,202},{9,1,721},{41,33,139},{19,1,341},{35,1,109},{5,1,37},{5,1,26},{3,3,546}, +{37,1,213},{7,1,1},{43,17,125},{3,3,546},{43,17,125},{21,1,350},{21,1,350},{21,1,350},{37,1,201},{37,1,312},{23,1,14},{23,1,14},{23,3,27},{41,1,168},{25,3,2},{5,1,37},{5,1,37},{5,1,37},{5,17,5},{19,5,162},{7,1,1},{7,1,1},{25,3,1},{37,3,162},{25,3,1},{33,1,113},{19,1,37},{19,1,1},{7,1,0},{33,1,113},{35,1,113},{7,1,0}, +{0,17,125},{35,1,113},{0,17,125},{37,0,200},{37,0,200},{37,0,200},{37,0,200},{23,1,10},{23,1,10},{23,1,10},{23,19,5},{25,3,1},{25,3,1},{35,1,773},{35,1,513},{5,1,414},{5,1,227},{35,1,818},{21,1,218},{37,1,69},{7,17,74},{23,1,534},{9,17,30},{3,1,190},{19,1,101},{19,1,65},{35,1,5},{33,33,333},{35,1,114},{5,1,25},{9,17,30},{33,33,333}, +{9,17,30},{5,1,414},{5,1,414},{5,1,414},{5,1,227},{21,1,373},{37,1,69},{37,1,69},{7,33,29},{9,1,216},{9,17,5},{19,1,65},{19,1,65},{19,1,65},{35,1,5},{3,3,162},{5,1,25},{5,1,25},{9,17,5},{3,3,162},{9,17,5},{17,1,25},{33,1,9},{33,1,0},{19,1,1},{17,1,25},{33,1,25},{19,1,1},{0,17,29},{33,1,25},{0,17,29},{5,0,218}, +{5,0,218},{5,0,218},{5,0,218},{37,1,20},{37,1,20},{37,1,20},{37,3,5},{9,17,1},{9,17,1},{3,1,642},{19,1,504},{19,1,468},{35,1,264},{19,1,657},{35,1,229},{5,1,141},{21,1,26},{21,1,457},{23,1,1},{33,1,134},{33,1,94},{33,1,85},{3,1,26},{1,19,193},{19,1,81},{19,1,45},{23,1,0},{19,1,193},{23,1,0},{19,1,468},{19,1,468},{19,1,468}, +{35,1,264},{35,1,425},{5,1,141},{5,1,141},{21,1,26},{7,1,254},{23,1,1},{33,1,85},{33,1,85},{33,1,85},{3,1,26},{17,3,145},{19,1,45},{19,1,45},{23,1,0},{35,1,145},{23,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{35,0,200},{35,0,200},{35,0,200},{35,0,200},{5,1,41}, +{5,1,41},{5,1,41},{21,17,5},{23,1,1},{23,1,1},{3,1,418},{3,1,343},{3,1,318},{3,1,243},{3,1,370},{19,1,161},{19,1,125},{35,1,5},{35,1,250},{21,1,25},{17,1,34},{17,1,26},{17,1,25},{33,1,13},{17,1,54},{33,1,22},{33,1,13},{5,1,1},{33,1,54},{5,1,1},{3,1,318},{3,1,318},{3,1,318},{3,1,243},{3,1,270},{19,1,125},{19,1,125}, +{35,1,5},{5,1,165},{21,1,25},{17,1,25},{17,1,25},{17,1,25},{33,1,13},{1,3,41},{33,1,13},{33,1,13},{5,1,1},{3,1,41},{5,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{19,0,208},{19,0,208},{19,0,208},{19,0,208},{35,1,85},{35,1,85},{35,1,85},{35,1,5},{21,1,25}, +{21,1,25},{0,26,421},{0,38,45},{0,36,2},{0,20,160},{0,38,926},{0,20,577},{0,4,264},{0,18,701},{0,34,989},{0,18,737},{0,26,421},{0,38,45},{0,36,2},{0,20,160},{34,0,925},{0,20,577},{0,4,264},{0,18,701},{0,34,925},{0,18,701},{0,20,1},{0,20,1},{0,20,1},{0,18,1},{0,18,85},{0,2,34},{0,2,34},{0,32,53},{0,32,94},{0,32,62},{0,20,1}, +{0,20,1},{0,20,1},{0,18,1},{32,0,85},{0,2,34},{0,2,34},{0,32,53},{18,0,85},{0,32,53},{34,4,421},{0,38,45},{0,36,2},{0,20,160},{34,4,421},{26,0,421},{0,20,160},{0,34,421},{26,0,421},{0,34,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,44,421},{0,24,13},{0,22,32}, +{0,36,113},{0,24,1262},{0,6,670},{0,20,304},{0,4,886},{0,4,1382},{0,34,953},{0,44,421},{0,24,13},{0,22,32},{0,36,113},{18,4,1261},{0,6,670},{0,20,304},{0,4,886},{36,2,1261},{0,4,886},{0,8,0},{0,8,0},{0,8,0},{0,4,0},{0,4,221},{0,34,73},{0,34,73},{0,2,125},{0,2,246},{0,2,150},{0,8,0},{0,8,0},{0,8,0},{0,4,0},{2,0,221}, +{0,34,73},{0,34,73},{0,2,125},{4,0,221},{0,2,125},{22,0,421},{0,24,13},{16,6,8},{0,36,113},{22,0,421},{44,0,421},{0,36,113},{0,20,433},{44,0,421},{0,20,433},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,31,430},{0,26,10},{16,38,79},{0,22,74},{0,42,1514},{0,38,717},{0,6,253}, +{0,20,965},{0,36,1713},{0,4,1109},{16,46,425},{16,10,9},{16,38,54},{0,22,74},{20,2,1514},{0,38,717},{0,6,253},{0,20,965},{42,0,1514},{0,20,965},{0,26,10},{0,26,10},{0,26,10},{0,36,9},{0,6,340},{0,20,97},{0,20,97},{0,18,185},{0,18,382},{0,18,221},{16,10,5},{16,10,5},{16,10,5},{16,36,5},{2,2,338},{0,20,97},{0,20,97},{0,18,185},{2,2,338}, +{0,18,185},{8,0,421},{0,26,1},{2,38,2},{0,22,65},{8,0,421},{31,0,421},{0,22,65},{0,36,421},{31,0,421},{0,36,421},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,32,0},{0,32,0},{0,32,0},{0,16,0},{0,16,1},{0,16,1},{16,45,482},{16,12,66},{32,24,186},{16,8,126},{0,14,1517},{0,24,605},{0,38,117},{0,6,886},{0,22,1815},{0,36,1085},{32,31,421}, +{32,42,1},{2,8,51},{32,38,85},{22,16,1514},{0,24,605},{0,38,117},{0,6,886},{44,16,1514},{0,6,886},{16,28,61},{16,28,61},{16,28,61},{16,22,62},{0,24,340},{0,22,37},{0,22,37},{0,4,125},{0,4,456},{0,34,213},{32,42,0},{32,42,0},{32,42,0},{32,6,1},{18,4,338},{0,22,37},{0,22,37},{0,4,125},{36,2,338},{0,4,125},{40,0,421},{32,42,1},{18,8,5}, +{0,8,37},{40,0,421},{13,0,421},{0,8,37},{0,22,433},{13,0,421},{0,22,433},{16,0,61},{16,0,61},{16,0,61},{16,0,61},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,32,25},{0,32,25},{32,43,623},{32,44,219},{32,10,382},{32,24,243},{0,15,1517},{0,26,497},{0,24,35},{0,22,761},{0,8,2003},{0,22,1050},{18,15,422},{18,28,6},{18,40,51},{2,24,77},{24,0,1514}, +{0,26,497},{0,24,35},{0,22,761},{32,8,1514},{0,22,761},{32,30,202},{32,30,202},{32,30,202},{32,8,203},{0,28,338},{0,8,10},{0,8,10},{0,20,89},{0,6,565},{0,20,233},{18,12,1},{18,12,1},{18,12,1},{18,38,1},{2,24,338},{0,8,10},{0,8,10},{0,20,89},{28,0,338},{0,20,89},{40,4,421},{2,28,5},{4,40,1},{0,24,26},{40,4,421},{25,0,421},{0,24,26}, +{0,38,425},{25,0,421},{0,38,425},{32,0,202},{32,0,202},{32,0,202},{32,0,202},{0,8,1},{0,8,1},{0,8,1},{0,4,1},{0,34,68},{0,34,68},{2,11,821},{2,30,429},{2,26,634},{2,10,429},{0,27,1514},{0,28,446},{0,10,8},{0,8,670},{0,40,2187},{0,38,1083},{34,29,422},{34,14,6},{4,26,50},{34,10,86},{38,6,1514},{0,28,446},{0,10,8},{0,8,670},{27,0,1514}, +{0,8,670},{2,31,401},{2,31,401},{2,31,401},{2,24,404},{0,46,340},{0,10,4},{0,10,4},{0,6,52},{0,22,677},{0,6,277},{34,14,2},{34,14,2},{34,14,2},{34,8,5},{22,2,338},{0,10,4},{0,10,4},{0,6,52},{42,2,338},{0,6,52},{28,0,421},{34,14,5},{36,10,5},{0,10,4},{28,0,421},{7,0,421},{0,10,4},{0,24,425},{7,0,421},{0,24,425},{2,0,400}, +{2,0,400},{2,0,400},{2,0,400},{0,26,0},{0,26,0},{0,26,0},{0,36,1},{0,4,149},{0,4,149},{18,9,842},{18,47,462},{34,12,661},{18,26,450},{16,25,1521},{16,14,441},{16,42,15},{16,24,653},{0,26,2030},{0,24,882},{20,13,425},{20,30,9},{20,42,54},{4,26,77},{26,2,1514},{0,14,422},{16,42,11},{0,24,626},{38,8,1514},{0,24,626},{18,45,421},{18,45,421},{18,45,421}, +{18,10,422},{16,15,344},{16,42,14},{16,42,14},{16,38,38},{0,24,602},{0,38,162},{20,14,4},{20,14,4},{20,14,4},{20,40,5},{8,2,338},{32,26,2},{32,26,2},{0,38,18},{30,2,338},{0,38,18},{14,0,421},{4,30,5},{6,42,1},{0,42,1},{14,0,421},{19,0,421},{0,42,1},{0,40,421},{19,0,421},{0,40,421},{18,0,421},{18,0,421},{18,0,421},{18,0,421},{16,12,5}, +{16,12,5},{16,12,5},{16,6,8},{0,6,80},{0,6,80},{4,9,854},{4,31,458},{4,28,674},{34,12,453},{2,25,1515},{32,30,445},{2,12,9},{32,10,657},{0,28,1850},{0,10,666},{36,27,422},{36,46,6},{6,28,48},{36,12,86},{16,7,1514},{16,46,421},{2,12,8},{0,10,545},{21,0,1514},{0,10,545},{34,13,433},{34,13,433},{34,13,433},{34,42,433},{2,15,339},{2,12,5},{2,12,5}, +{32,8,50},{0,10,477},{0,8,62},{36,46,2},{36,46,2},{36,46,2},{36,10,5},{24,4,338},{2,12,4},{2,12,4},{0,24,9},{11,0,338},{0,24,9},{0,1,421},{36,46,5},{38,12,5},{2,12,4},{0,1,421},{1,0,421},{2,12,4},{0,26,425},{1,0,421},{0,26,425},{4,0,433},{4,0,433},{4,0,433},{4,0,433},{2,28,1},{2,28,1},{2,28,1},{2,38,2},{0,8,37}, +{0,8,37},{20,7,842},{20,45,455},{36,14,655},{20,28,450},{34,9,1523},{18,47,450},{34,44,13},{18,42,659},{0,14,1731},{0,42,542},{22,11,422},{22,47,5},{22,44,50},{6,28,86},{30,0,1514},{2,47,421},{34,44,4},{0,42,506},{33,0,1514},{0,42,506},{20,43,421},{20,43,421},{20,43,421},{20,12,425},{18,13,347},{34,28,11},{34,28,11},{18,40,43},{0,12,389},{0,10,9},{22,47,1}, +{22,47,1},{22,47,1},{22,42,1},{38,10,338},{34,28,2},{34,28,2},{0,10,5},{23,0,338},{0,10,5},{2,1,421},{22,47,4},{8,44,0},{18,44,0},{2,1,421},{1,2,421},{18,44,0},{0,42,425},{1,2,421},{0,42,425},{20,0,421},{20,0,421},{20,0,421},{20,0,421},{18,30,9},{18,30,9},{18,30,9},{34,8,10},{0,10,5},{0,10,5},{6,37,846},{6,29,454},{6,46,685}, +{6,14,459},{4,7,1517},{4,31,446},{4,14,19},{34,12,655},{0,47,1635},{0,12,478},{38,9,425},{38,15,6},{8,30,41},{38,14,77},{47,0,1514},{18,15,422},{20,14,11},{0,12,477},{27,6,1514},{0,12,477},{6,27,426},{6,27,426},{6,27,426},{6,44,426},{4,13,340},{4,14,10},{4,14,10},{4,26,50},{0,44,355},{16,26,6},{38,15,5},{38,15,5},{38,15,5},{38,28,5},{28,2,338}, +{20,14,2},{20,14,2},{32,26,1},{42,8,338},{32,26,1},{29,0,421},{38,15,2},{40,14,10},{18,30,9},{29,0,421},{33,4,421},{18,30,9},{0,28,425},{33,4,421},{0,28,425},{6,0,425},{6,0,425},{6,0,425},{6,0,425},{4,30,1},{4,30,1},{4,30,1},{4,40,0},{16,26,5},{16,26,5},{22,5,842},{22,43,455},{38,47,679},{22,30,455},{20,21,1521},{20,15,438},{36,46,13}, +{20,28,653},{0,15,1553},{16,44,454},{24,9,422},{24,45,5},{24,46,50},{8,30,77},{34,3,1514},{4,45,422},{36,46,4},{0,44,434},{35,4,1514},{0,44,434},{22,41,421},{22,41,421},{22,41,421},{22,14,422},{20,11,342},{36,30,11},{36,30,11},{20,42,38},{0,46,340},{32,12,5},{24,45,1},{24,45,1},{24,45,1},{24,44,1},{16,3,338},{36,30,2},{36,30,2},{32,12,4},{17,0,338}, +{32,12,4},{43,0,421},{24,45,4},{10,46,0},{4,46,1},{43,0,421},{19,6,421},{4,46,1},{0,44,425},{19,6,421},{0,44,425},{22,0,421},{22,0,421},{22,0,421},{22,0,421},{20,31,5},{20,31,5},{20,31,5},{20,26,5},{32,12,1},{32,12,1},{8,5,854},{8,27,458},{24,31,670},{38,47,462},{6,5,1517},{6,29,446},{6,47,6},{36,14,655},{0,29,1530},{32,30,465},{40,23,422}, +{40,13,2},{10,31,48},{40,46,90},{45,2,1514},{20,13,425},{6,47,6},{0,30,434},{25,8,1514},{0,30,434},{8,25,434},{8,25,434},{8,25,434},{8,30,437},{6,11,340},{6,47,5},{6,47,5},{6,12,52},{16,47,342},{18,28,1},{40,13,1},{40,13,1},{40,13,1},{40,14,5},{30,4,338},{22,46,4},{22,46,4},{18,28,1},{15,8,338},{18,28,1},{11,0,421},{40,13,1},{26,47,5}, +{6,47,2},{11,0,421},{5,8,421},{6,47,2},{0,30,425},{5,8,421},{0,30,425},{8,0,433},{8,0,433},{8,0,433},{8,0,433},{6,31,0},{6,31,0},{6,31,0},{6,42,0},{18,28,1},{18,28,1},{24,33,846},{24,41,465},{40,15,658},{24,31,454},{38,5,1518},{22,13,446},{38,15,14},{22,46,667},{0,27,1518},{18,46,453},{26,7,421},{26,27,2},{42,15,53},{10,31,86},{27,0,1514}, +{6,43,425},{38,15,10},{16,46,434},{37,8,1514},{16,46,434},{24,23,426},{24,23,426},{24,23,426},{24,47,426},{38,25,344},{38,31,9},{38,31,9},{22,44,41},{18,31,341},{4,14,2},{26,27,1},{26,27,1},{26,27,1},{26,46,1},{45,0,338},{8,31,5},{8,31,5},{4,14,1},{27,8,338},{4,14,1},{8,1,421},{26,27,2},{12,15,1},{6,15,2},{8,1,421},{1,8,421},{6,15,2}, +{0,46,433},{1,8,421},{0,46,433},{24,0,425},{24,0,425},{24,0,425},{24,0,425},{38,15,4},{38,15,4},{38,15,4},{38,12,8},{4,14,1},{4,14,1},{10,33,846},{10,25,454},{26,29,658},{10,45,454},{8,3,1517},{8,27,446},{8,45,8},{38,47,650},{32,11,1518},{4,47,462},{42,5,425},{42,11,9},{12,29,43},{42,15,89},{28,13,1514},{22,11,422},{8,45,8},{16,31,426},{27,12,1514}, +{16,31,426},{10,23,425},{10,23,425},{10,23,425},{10,15,429},{8,9,340},{8,45,4},{8,45,4},{8,30,50},{34,45,341},{20,30,6},{42,11,5},{42,11,5},{42,11,5},{42,31,8},{29,2,338},{8,45,4},{8,45,4},{36,30,1},{35,6,338},{36,30,1},{23,0,421},{12,11,4},{44,45,5},{8,45,4},{23,0,421},{18,9,421},{8,45,4},{0,31,425},{18,9,421},{0,31,425},{10,0,425}, +{10,0,425},{10,0,425},{10,0,425},{8,13,1},{8,13,1},{8,13,1},{8,44,0},{20,30,5},{20,30,5},{26,1,846},{26,39,470},{42,13,658},{26,29,454},{40,3,1523},{24,11,446},{24,13,20},{24,31,658},{2,25,1521},{20,15,458},{28,5,422},{28,25,6},{28,13,51},{12,29,86},{40,3,1514},{8,41,421},{24,13,11},{18,15,421},{16,9,1514},{18,15,421},{26,21,426},{26,21,426},{26,21,426}, +{26,45,426},{24,7,347},{40,29,11},{40,29,11},{24,46,41},{20,29,342},{36,47,10},{28,41,1},{28,41,1},{28,41,1},{28,15,2},{43,2,338},{40,29,2},{40,29,2},{36,47,9},{21,8,338},{36,47,9},{37,0,421},{12,25,5},{14,13,1},{8,13,2},{37,0,421},{32,7,421},{8,13,2},{0,15,421},{32,7,421},{0,15,421},{26,0,425},{26,0,425},{26,0,425},{26,0,425},{24,27,9}, +{24,27,9},{24,27,9},{40,14,10},{36,47,1},{36,47,1},{12,1,850},{12,23,454},{12,27,666},{12,43,454},{10,1,1517},{10,25,446},{10,43,8},{40,45,666},{34,9,1515},{6,45,462},{44,3,425},{44,9,9},{14,27,50},{44,13,89},{39,2,1514},{24,9,422},{10,43,8},{18,29,426},{34,9,1514},{18,29,426},{12,21,425},{12,21,425},{12,21,425},{12,13,429},{10,7,340},{10,43,4},{10,43,4}, +{10,47,50},{36,43,341},{22,31,1},{44,9,5},{44,9,5},{44,9,5},{44,29,8},{38,1,338},{26,13,4},{26,13,4},{22,31,1},{43,28,338},{22,31,1},{5,0,421},{14,9,4},{46,43,5},{10,43,4},{5,0,421},{0,5,421},{10,43,4},{0,29,425},{0,5,421},{0,29,425},{12,0,425},{12,0,425},{12,0,425},{12,0,425},{10,27,0},{10,27,0},{10,27,0},{10,46,0},{22,31,1}, +{22,31,1},{44,1,890},{44,7,462},{44,41,666},{28,27,454},{42,1,1518},{26,39,446},{42,11,8},{26,13,666},{4,23,1523},{22,13,454},{30,33,421},{30,23,1},{46,11,50},{30,27,89},{21,0,1514},{40,23,425},{42,11,4},{20,13,425},{18,7,1514},{20,13,425},{28,19,426},{28,19,426},{28,19,426},{28,27,429},{42,21,344},{42,11,8},{42,11,8},{26,15,50},{6,11,341},{8,45,9},{30,23,1}, +{30,23,1},{30,23,1},{30,13,0},{39,0,338},{42,11,4},{42,11,4},{8,45,5},{9,28,338},{8,45,5},{14,1,421},{30,23,1},{47,11,0},{26,11,0},{14,1,421},{4,5,421},{26,11,0},{0,13,425},{4,5,421},{0,13,425},{28,0,425},{28,0,425},{28,0,425},{28,0,425},{42,11,4},{42,11,4},{42,11,4},{42,47,5},{8,15,4},{8,15,4},{30,1,950},{14,21,458},{30,25,658}, +{14,41,446},{28,1,1542},{12,23,438},{12,25,20},{12,43,658},{36,7,1518},{38,27,470},{46,1,430},{46,37,10},{47,25,41},{46,41,82},{14,3,1514},{26,7,422},{28,41,11},{20,27,426},{32,5,1514},{20,27,426},{14,19,421},{14,19,421},{14,19,421},{14,11,422},{12,35,339},{12,25,11},{12,25,11},{12,29,51},{38,41,338},{24,29,6},{46,37,9},{46,37,9},{46,37,9},{46,27,10},{23,2,338}, +{28,41,2},{28,41,2},{40,29,1},{20,9,338},{40,29,1},{17,0,421},{46,37,1},{31,25,10},{26,25,9},{17,0,421},{18,3,421},{26,25,9},{0,27,425},{18,3,421},{0,27,425},{14,0,421},{14,0,421},{14,0,421},{14,0,421},{12,9,2},{12,9,2},{12,9,2},{12,15,1},{24,13,5},{24,13,5},{46,1,1010},{46,5,462},{46,39,650},{30,25,454},{14,1,1575},{28,7,446},{44,9,8}, +{28,27,658},{6,21,1523},{24,11,454},{31,1,422},{31,21,6},{31,9,50},{47,25,77},{46,3,1514},{42,21,425},{44,9,4},{22,11,425},{16,3,1514},{22,11,425},{30,17,426},{30,17,426},{30,17,426},{30,25,429},{44,19,344},{44,9,8},{44,9,8},{28,13,43},{8,9,340},{10,43,9},{31,37,1},{31,37,1},{31,37,1},{31,11,2},{37,2,338},{44,9,4},{44,9,4},{10,43,5},{34,7,338}, +{10,43,5},{31,1,421},{31,21,5},{45,9,0},{12,9,1},{31,1,421},{32,1,421},{12,9,1},{0,11,425},{32,1,421},{0,11,425},{30,0,425},{30,0,425},{30,0,425},{30,0,425},{44,9,4},{44,9,4},{44,9,4},{44,45,5},{10,13,4},{10,13,4},{31,1,1098},{47,19,453},{47,23,667},{47,39,473},{46,1,1641},{14,21,438},{14,39,14},{14,41,658},{38,5,1518},{40,25,465},{45,1,437}, +{15,5,2},{45,23,41},{15,39,86},{31,3,1514},{28,5,422},{30,39,9},{22,25,426},{34,3,1514},{22,25,426},{47,17,434},{47,17,434},{47,17,434},{47,9,437},{14,33,339},{14,39,10},{14,39,10},{14,43,53},{40,39,341},{26,27,2},{15,5,1},{15,5,1},{15,5,1},{15,25,5},{44,1,338},{30,9,5},{30,9,5},{26,27,1},{26,9,338},{26,27,1},{45,1,421},{15,5,1},{13,39,8}, +{14,39,4},{45,1,421},{20,1,421},{14,39,4},{0,25,425},{20,1,421},{0,25,425},{47,0,433},{47,0,433},{47,0,433},{47,0,433},{14,7,2},{14,7,2},{14,7,2},{14,13,1},{26,27,2},{26,27,2},{45,1,1202},{31,33,465},{15,37,655},{31,7,461},{47,1,1725},{30,35,446},{46,7,6},{30,25,670},{24,19,1518},{26,9,458},{13,1,469},{29,19,1},{13,7,52},{29,23,85},{15,1,1514}, +{14,35,426},{46,7,5},{24,9,434},{9,11,1514},{24,9,434},{31,1,434},{31,1,434},{31,1,434},{31,39,426},{46,17,339},{46,7,6},{46,7,6},{30,11,48},{10,7,341},{12,41,2},{29,19,1},{29,19,1},{29,19,1},{29,9,0},{31,5,338},{47,23,4},{47,23,4},{12,41,1},{14,9,338},{12,41,1},{43,1,421},{29,19,1},{43,7,0},{30,7,0},{43,1,421},{8,1,421},{30,7,0}, +{0,9,433},{8,1,421},{0,9,433},{31,0,425},{31,0,425},{31,0,425},{31,0,425},{46,7,2},{46,7,2},{46,7,2},{46,27,5},{12,41,1},{12,41,1},{29,1,1346},{45,17,454},{29,21,653},{45,37,459},{45,1,1818},{47,19,446},{47,37,13},{46,39,679},{10,3,1518},{42,23,455},{27,1,526},{13,33,5},{43,21,38},{13,7,93},{27,5,1514},{30,3,425},{31,37,11},{40,23,421},{6,1,1514}, +{40,23,421},{45,1,434},{45,1,434},{45,1,434},{45,7,429},{47,1,340},{47,37,4},{47,37,4},{47,25,50},{42,37,338},{44,25,5},{13,33,4},{13,33,4},{13,33,4},{13,23,5},{17,2,338},{31,37,2},{31,37,2},{44,25,1},{16,1,338},{44,25,1},{11,1,421},{13,33,1},{27,21,5},{30,21,5},{11,1,421},{26,1,421},{30,21,5},{0,23,421},{26,1,421},{0,23,421},{45,0,425}, +{45,0,425},{45,0,425},{45,0,425},{47,5,1},{47,5,1},{47,5,1},{47,11,0},{44,25,4},{44,25,4},{43,1,1502},{13,1,478},{13,35,655},{29,5,461},{29,1,1926},{31,3,446},{15,5,19},{47,7,685},{26,17,1518},{28,7,454},{11,1,569},{27,17,6},{27,5,50},{43,21,97},{17,10,1514},{47,33,425},{15,5,10},{26,7,426},{24,1,1514},{26,7,426},{13,1,477},{13,1,477},{13,1,477}, +{29,37,426},{15,1,355},{15,21,11},{15,21,11},{31,9,41},{12,5,341},{14,39,6},{27,33,1},{27,33,1},{27,33,1},{27,7,2},{29,3,338},{15,21,2},{15,21,2},{14,39,5},{43,9,338},{14,39,5},{25,1,421},{43,1,5},{41,5,0},{31,5,1},{25,1,421},{14,1,421},{31,5,1},{0,7,425},{14,1,421},{0,7,425},{29,0,425},{29,0,425},{29,0,425},{29,0,425},{31,19,9}, +{31,19,9},{31,19,9},{31,25,10},{14,39,2},{14,39,2},{11,1,1634},{43,1,542},{43,19,659},{43,35,459},{43,1,2070},{45,17,446},{45,35,13},{15,37,655},{12,1,1518},{44,21,455},{25,1,646},{11,1,9},{41,19,43},{11,5,93},{25,3,1514},{31,1,422},{29,35,11},{42,21,421},{12,1,1514},{42,21,421},{43,1,506},{43,1,506},{43,1,506},{43,5,429},{29,1,381},{45,35,4},{45,35,4}, +{45,23,50},{44,35,338},{46,23,5},{11,1,5},{11,1,5},{11,1,5},{11,21,5},{39,11,338},{29,35,2},{29,35,2},{46,23,1},{22,1,338},{46,23,1},{39,1,421},{11,1,5},{25,19,10},{31,19,9},{39,1,421},{31,1,421},{31,19,9},{0,21,421},{31,1,421},{0,21,421},{43,0,425},{43,0,425},{43,0,425},{43,0,425},{45,19,0},{45,19,0},{45,19,0},{45,9,0},{46,23,4}, +{46,23,4},{25,1,1874},{11,1,666},{11,33,657},{27,3,451},{11,1,2201},{13,1,454},{13,3,9},{29,5,674},{14,1,1557},{30,5,458},{39,1,722},{9,1,62},{9,33,50},{25,19,85},{9,1,1514},{29,1,446},{13,3,5},{44,5,433},{46,1,1514},{44,5,433},{11,1,545},{11,1,545},{11,1,545},{27,19,429},{43,1,437},{13,3,8},{13,3,8},{29,7,48},{30,19,341},{47,37,6},{25,1,9}, +{25,1,9},{25,1,9},{25,5,0},{25,5,338},{13,3,4},{13,3,4},{47,37,2},{10,1,338},{47,37,2},{37,1,421},{9,1,37},{39,3,2},{29,3,1},{37,1,421},{43,1,421},{29,3,1},{0,5,433},{43,1,421},{0,5,433},{27,0,425},{27,0,425},{27,0,425},{27,0,425},{13,3,4},{13,3,4},{13,3,4},{13,39,5},{46,21,5},{46,21,5},{9,1,2030},{25,1,882},{25,17,653}, +{41,33,453},{9,1,2382},{27,1,546},{43,17,15},{13,35,661},{47,1,1653},{46,19,462},{7,1,837},{39,1,162},{39,17,38},{9,33,89},{19,9,1514},{27,1,521},{43,17,14},{44,19,421},{45,1,1514},{44,19,421},{25,1,626},{25,1,626},{25,1,626},{41,3,422},{11,1,488},{43,17,11},{43,17,11},{43,21,54},{46,33,340},{31,21,9},{39,1,18},{39,1,18},{39,1,18},{9,19,10},{9,3,338}, +{27,33,2},{27,33,2},{15,21,4},{31,3,338},{15,21,4},{5,1,421},{7,1,80},{7,17,8},{13,17,5},{5,1,421},{9,1,421},{13,17,5},{0,19,421},{9,1,421},{0,19,421},{41,0,421},{41,0,421},{41,0,421},{41,0,421},{43,1,1},{43,1,1},{43,1,1},{43,7,1},{31,5,5},{31,5,5},{23,1,2201},{39,1,1083},{9,1,670},{25,1,450},{39,1,2443},{11,1,684},{11,1,8}, +{27,3,634},{29,1,1751},{31,3,429},{21,1,890},{7,1,277},{7,1,52},{23,17,74},{21,17,1459},{25,1,603},{11,1,4},{30,3,401},{17,21,1459},{30,3,401},{9,1,670},{9,1,670},{9,1,670},{25,17,429},{25,1,579},{11,1,8},{11,1,8},{27,5,50},{47,1,340},{15,35,6},{7,1,52},{7,1,52},{7,1,52},{23,3,0},{23,3,338},{11,1,4},{11,1,4},{15,35,2},{43,3,338}, +{15,35,2},{19,1,392},{5,1,149},{37,1,1},{27,1,0},{19,1,392},{37,1,392},{27,1,0},{0,3,400},{37,1,392},{0,3,400},{25,0,425},{25,0,425},{25,0,425},{25,0,425},{11,1,4},{11,1,4},{11,1,4},{11,37,5},{15,35,5},{15,35,5},{7,1,1901},{23,1,1050},{23,1,761},{39,1,426},{7,1,2093},{9,1,551},{25,1,35},{11,33,382},{13,1,1407},{45,33,219},{5,1,638}, +{21,1,233},{21,1,89},{7,1,29},{17,39,1064},{23,1,398},{9,1,10},{31,33,202},{39,17,1064},{31,33,202},{23,1,761},{23,1,761},{23,1,761},{39,1,426},{9,1,638},{25,1,35},{25,1,35},{41,19,51},{45,1,355},{29,19,6},{21,1,89},{21,1,89},{21,1,89},{7,17,5},{3,25,338},{9,1,10},{9,1,10},{13,19,1},{29,1,338},{13,19,1},{3,1,200},{35,1,68},{5,1,1}, +{9,1,1},{3,1,200},{5,1,200},{9,1,1},{0,33,202},{5,1,200},{0,33,202},{39,0,425},{39,0,425},{39,0,425},{39,0,425},{25,1,26},{25,1,26},{25,1,26},{41,5,1},{29,3,5},{29,3,5},{21,1,1606},{37,1,1085},{7,1,886},{7,1,461},{21,1,1749},{23,1,470},{39,1,117},{25,33,186},{11,1,1166},{13,17,66},{19,1,461},{35,1,213},{5,1,125},{21,1,2},{3,3,722}, +{7,1,266},{23,1,37},{29,17,61},{3,3,722},{29,17,61},{7,1,886},{7,1,886},{7,1,886},{7,1,461},{23,1,770},{39,1,117},{39,1,117},{9,3,51},{43,1,426},{43,33,1},{5,1,125},{5,1,125},{5,1,125},{21,1,2},{19,5,338},{23,1,37},{23,1,37},{43,33,0},{37,3,338},{43,33,0},{1,3,61},{33,1,25},{3,1,1},{5,1,1},{1,3,61},{3,1,61},{5,1,1}, +{0,17,61},{3,1,61},{0,17,61},{23,0,433},{23,0,433},{23,0,433},{23,0,433},{9,1,37},{9,1,37},{9,1,37},{9,19,5},{43,33,1},{43,33,1},{5,1,1450},{5,1,1109},{21,1,965},{37,1,542},{5,1,1505},{7,1,478},{7,1,253},{39,17,79},{9,1,1054},{27,1,10},{3,1,318},{19,1,221},{19,1,185},{35,1,29},{33,33,509},{35,1,210},{21,1,97},{27,1,10},{33,33,509}, +{27,1,10},{21,1,965},{21,1,965},{21,1,965},{37,1,542},{21,1,900},{7,1,253},{7,1,253},{39,17,54},{41,1,549},{11,17,9},{19,1,185},{19,1,185},{19,1,185},{35,1,29},{3,3,338},{21,1,97},{21,1,97},{11,17,5},{3,3,338},{11,17,5},{1,17,5},{17,1,1},{17,1,0},{33,1,0},{1,17,5},{17,1,5},{33,1,0},{0,1,9},{17,1,5},{0,1,9},{37,0,421}, +{37,0,421},{37,0,421},{37,0,421},{23,1,65},{23,1,65},{23,1,65},{39,3,2},{27,1,1},{27,1,1},{35,1,1213},{35,1,953},{5,1,886},{5,1,545},{35,1,1186},{21,1,448},{21,1,304},{23,1,32},{23,1,790},{25,1,13},{33,1,198},{3,1,150},{3,1,125},{19,1,36},{33,1,294},{19,1,121},{35,1,73},{9,1,0},{1,33,294},{9,1,0},{5,1,886},{5,1,886},{5,1,886}, +{5,1,545},{5,1,765},{21,1,304},{21,1,304},{23,1,32},{39,1,486},{25,1,13},{3,1,125},{3,1,125},{3,1,125},{19,1,36},{3,1,221},{35,1,73},{35,1,73},{9,1,0},{5,1,221},{9,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{21,0,433},{21,0,433},{21,0,433},{21,0,433},{37,1,113}, +{37,1,113},{37,1,113},{7,17,8},{25,1,13},{25,1,13},{3,1,885},{19,1,737},{19,1,701},{35,1,485},{19,1,834},{5,1,364},{5,1,264},{37,1,2},{7,1,554},{39,1,45},{17,1,82},{33,1,62},{33,1,53},{33,1,13},{1,3,114},{33,1,54},{3,1,34},{21,1,1},{3,1,114},{21,1,1},{19,1,701},{19,1,701},{19,1,701},{35,1,485},{35,1,574},{5,1,264},{5,1,264}, +{37,1,2},{7,1,329},{39,1,45},{33,1,53},{33,1,53},{33,1,53},{33,1,13},{33,1,85},{3,1,34},{3,1,34},{21,1,1},{19,1,85},{21,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{35,0,421},{35,0,421},{35,0,421},{35,0,421},{21,1,160},{21,1,160},{21,1,160},{37,1,2},{39,1,45}, +{39,1,45},{0,30,882},{0,10,100},{0,38,2},{0,6,340},{0,10,1896},{0,22,1189},{0,6,565},{0,4,1421},{0,20,2043},{0,4,1521},{0,30,882},{0,10,100},{0,38,2},{0,6,340},{4,2,1896},{0,22,1189},{0,6,565},{0,4,1421},{10,0,1896},{0,4,1421},{0,22,1},{0,22,1},{0,22,1},{0,34,0},{0,4,164},{0,18,52},{0,18,52},{0,32,98},{0,32,179},{0,32,107},{0,22,1}, +{0,22,1},{0,22,1},{0,34,0},{32,16,162},{0,18,52},{0,18,52},{0,32,98},{16,32,162},{0,32,98},{38,0,882},{0,10,100},{0,38,2},{0,6,340},{38,0,882},{30,0,882},{0,6,340},{0,20,884},{30,0,882},{0,20,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,15,884},{0,12,34},{0,24,13}, +{0,38,250},{0,12,2355},{0,8,1355},{0,22,585},{0,20,1669},{0,36,2567},{0,20,1813},{0,15,884},{0,12,34},{0,24,13},{0,38,250},{0,12,2355},{0,8,1355},{0,22,585},{0,20,1669},{12,0,2355},{0,20,1669},{0,10,0},{0,10,0},{0,10,0},{0,20,1},{0,20,340},{0,4,125},{0,4,125},{0,2,200},{0,18,376},{0,2,225},{0,10,0},{0,10,0},{0,10,0},{0,20,1},{16,4,338}, +{0,4,125},{0,4,125},{0,2,200},{4,16,338},{0,2,200},{24,0,882},{0,12,34},{16,24,4},{0,38,250},{24,0,882},{32,8,882},{0,38,250},{0,6,884},{32,8,882},{0,6,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,27,882},{0,14,9},{0,40,81},{0,8,202},{0,14,2899},{0,24,1539},{0,8,643}, +{0,6,2004},{0,6,3189},{0,36,2207},{0,27,882},{0,14,9},{16,40,61},{0,8,202},{6,2,2899},{0,24,1539},{0,8,643},{0,6,2004},{14,0,2899},{0,6,2004},{0,28,1},{0,28,1},{0,28,1},{0,6,4},{0,22,578},{0,36,221},{0,36,221},{0,18,365},{0,18,632},{0,18,401},{0,28,1},{0,28,1},{0,28,1},{0,6,4},{32,4,578},{0,36,221},{0,36,221},{0,18,365},{22,0,578}, +{0,18,365},{38,6,882},{0,14,9},{2,40,1},{0,8,202},{38,6,882},{27,0,882},{0,8,202},{0,22,884},{27,0,882},{0,22,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{16,25,910},{16,46,31},{16,26,151},{0,40,181},{0,31,3048},{0,26,1416},{0,40,506},{0,22,1944},{0,38,3484},{0,6,2233},{16,25,885}, +{16,46,6},{32,26,78},{16,40,165},{36,6,3048},{0,26,1416},{0,40,506},{0,22,1944},{31,0,3048},{0,22,1944},{16,30,26},{16,30,26},{16,30,26},{16,38,27},{0,24,650},{0,22,157},{0,22,157},{0,4,325},{0,4,766},{0,4,425},{16,30,1},{16,30,1},{16,30,1},{16,38,2},{18,4,648},{0,22,157},{0,22,157},{0,4,325},{36,2,648},{0,4,325},{26,2,882},{0,46,5},{18,26,4}, +{0,40,145},{26,2,882},{38,8,882},{0,40,145},{0,8,890},{38,8,882},{0,8,890},{16,0,26},{16,0,26},{16,0,26},{16,0,26},{0,18,0},{0,18,0},{0,18,0},{0,32,1},{0,16,10},{0,16,10},{16,7,1009},{16,31,134},{32,12,297},{16,26,238},{0,43,3048},{0,28,1224},{0,26,267},{0,8,1764},{0,24,3685},{0,38,2157},{2,9,885},{2,47,5},{18,12,77},{32,26,165},{6,8,3048}, +{0,28,1224},{0,26,267},{0,8,1764},{43,0,3048},{0,8,1764},{16,45,125},{16,45,125},{16,45,125},{16,40,126},{0,28,648},{0,24,80},{0,24,80},{0,36,260},{0,6,875},{0,20,413},{2,46,1},{2,46,1},{2,46,1},{2,24,2},{2,24,648},{0,24,80},{0,24,80},{0,36,260},{28,0,648},{0,36,260},{44,0,882},{2,47,4},{4,42,1},{0,26,98},{44,0,882},{26,8,882},{0,26,98}, +{0,24,890},{26,8,882},{0,24,890},{16,0,125},{16,0,125},{16,0,125},{16,0,125},{0,6,0},{0,6,0},{0,6,0},{0,18,1},{0,18,37},{0,18,37},{32,5,1147},{32,45,282},{2,44,523},{32,12,381},{0,9,3051},{0,14,1110},{0,12,116},{0,24,1658},{0,26,3859},{0,8,2173},{18,23,886},{18,15,6},{34,28,69},{18,42,166},{40,4,3048},{0,14,1110},{0,12,116},{0,24,1658},{22,8,3048}, +{0,24,1658},{32,13,265},{32,13,265},{32,13,265},{32,10,266},{0,46,650},{0,26,26},{0,26,26},{0,22,194},{0,22,987},{0,6,427},{18,15,5},{18,15,5},{18,15,5},{18,40,5},{22,2,648},{0,26,26},{0,26,26},{0,22,194},{42,2,648},{0,22,194},{30,0,882},{18,15,2},{20,28,4},{0,12,52},{30,0,882},{33,0,882},{0,12,52},{0,10,884},{33,0,882},{0,10,884},{32,0,265}, +{32,0,265},{32,0,265},{32,0,265},{0,24,0},{0,24,0},{0,24,0},{0,4,4},{0,34,89},{0,34,89},{2,3,1365},{2,13,510},{18,14,813},{2,28,566},{0,37,3048},{0,46,1013},{0,44,42},{0,10,1509},{0,12,4057},{0,10,2185},{4,7,885},{4,45,10},{20,44,86},{34,28,173},{28,0,3048},{0,46,1013},{0,44,42},{0,10,1509},{37,0,3048},{0,10,1509},{2,11,482},{2,11,482},{2,11,482}, +{2,42,481},{0,29,650},{0,12,4},{0,12,4},{0,38,128},{0,8,1161},{0,22,483},{4,15,2},{4,15,2},{4,15,2},{4,26,2},{8,2,648},{0,12,4},{0,12,4},{0,38,128},{30,2,648},{0,38,128},{47,0,882},{34,45,2},{6,44,1},{0,44,26},{47,0,882},{27,6,882},{0,44,26},{0,26,890},{27,6,882},{0,26,890},{2,0,481},{2,0,481},{2,0,481},{2,0,481},{0,12,0}, +{0,12,0},{0,12,0},{0,6,1},{0,20,180},{0,20,180},{18,17,1647},{18,27,810},{34,46,1178},{2,14,837},{0,19,3048},{0,15,933},{0,14,21},{0,26,1443},{0,28,4329},{0,26,2227},{20,21,885},{20,29,5},{36,30,69},{20,44,182},{42,6,3048},{0,15,933},{0,14,21},{0,26,1443},{19,0,3048},{0,26,1443},{18,25,765},{18,25,765},{18,25,765},{18,28,766},{0,11,648},{0,14,5},{0,14,5}, +{0,24,89},{0,10,1342},{0,8,557},{20,29,1},{20,29,1},{20,29,1},{20,42,2},{24,4,648},{16,44,2},{16,44,2},{0,24,89},{11,0,648},{0,24,89},{34,3,882},{4,13,4},{22,30,4},{0,14,17},{34,3,882},{35,4,882},{0,14,17},{0,12,884},{35,4,882},{0,12,884},{18,0,765},{18,0,765},{18,0,765},{18,0,765},{0,30,0},{0,30,0},{0,30,0},{0,38,0},{0,6,274}, +{0,6,274},{34,1,1782},{34,41,940},{4,31,1356},{34,46,950},{16,1,3052},{16,29,910},{16,46,22},{0,12,1335},{0,46,4231},{0,12,1924},{6,5,882},{6,43,5},{22,47,86},{36,30,174},{32,3,3048},{0,13,900},{32,46,13},{0,12,1299},{39,4,3048},{0,12,1299},{34,23,882},{34,23,882},{34,23,882},{34,14,883},{16,9,651},{16,46,18},{16,46,18},{16,10,74},{0,42,1256},{0,40,434},{6,13,0}, +{6,13,0},{6,13,0},{6,28,1},{38,10,648},{2,30,2},{2,30,2},{0,10,45},{23,0,648},{0,10,45},{4,1,882},{36,27,4},{8,46,4},{0,46,5},{4,1,882},{1,4,882},{0,46,5},{0,28,890},{1,4,882},{0,28,890},{34,0,882},{34,0,882},{34,0,882},{34,0,882},{16,31,1},{16,31,1},{16,31,1},{16,24,1},{0,8,250},{0,8,250},{20,1,1814},{20,25,945},{36,15,1363}, +{4,47,945},{2,1,3052},{32,43,916},{2,47,23},{16,44,1337},{0,31,3975},{0,28,1612},{22,19,886},{22,11,6},{38,31,77},{22,46,185},{2,1,3048},{0,27,883},{2,47,19},{0,44,1188},{1,2,3048},{0,44,1188},{20,7,901},{20,7,901},{20,7,901},{20,30,900},{2,9,654},{2,47,14},{2,47,14},{32,26,70},{0,28,1059},{0,26,236},{22,27,4},{22,27,4},{22,27,4},{22,14,8},{28,2,648}, +{18,46,5},{18,46,5},{0,42,36},{42,8,648},{0,42,36},{27,0,882},{22,11,2},{24,31,4},{0,31,5},{27,0,882},{37,8,882},{0,31,5},{0,14,882},{37,8,882},{0,14,882},{4,0,900},{4,0,900},{4,0,900},{4,0,900},{2,15,5},{2,15,5},{2,15,5},{2,40,4},{0,40,146},{0,40,146},{6,1,1864},{36,39,947},{6,29,1356},{36,31,943},{34,1,3073},{18,27,910},{18,15,21}, +{2,14,1335},{0,45,3751},{0,14,1379},{8,3,885},{8,41,5},{24,15,85},{38,31,182},{29,0,3048},{32,11,884},{34,15,16},{0,30,1146},{37,6,3048},{0,30,1146},{36,21,882},{36,21,882},{36,21,882},{36,47,886},{18,7,649},{18,15,21},{18,15,21},{18,12,74},{0,14,945},{0,12,91},{8,11,2},{8,11,2},{8,11,2},{8,30,2},{16,3,648},{34,31,1},{34,31,1},{0,12,10},{17,0,648}, +{0,12,10},{28,13,882},{38,25,4},{10,15,1},{2,15,1},{28,13,882},{27,12,882},{2,15,1},{0,30,890},{27,12,882},{0,30,890},{36,0,882},{36,0,882},{36,0,882},{36,0,882},{18,29,1},{18,29,1},{18,29,1},{18,26,1},{0,42,68},{0,42,68},{22,1,1944},{22,23,945},{38,13,1363},{6,45,945},{20,1,3115},{34,41,916},{4,45,18},{18,46,1337},{0,13,3580},{0,46,1153},{24,17,886}, +{24,9,6},{40,29,69},{24,15,168},{46,10,3048},{2,25,885},{4,45,14},{0,46,1053},{23,8,3048},{0,46,1053},{22,5,901},{22,5,901},{22,5,901},{6,31,901},{4,7,654},{4,45,9},{4,45,9},{34,28,70},{0,47,825},{0,44,25},{24,25,4},{24,25,4},{24,25,4},{24,46,8},{30,4,648},{20,15,0},{20,15,0},{0,44,0},{15,8,648},{0,44,0},{40,3,882},{24,9,2},{26,29,4}, +{2,29,5},{40,3,882},{16,9,882},{2,29,5},{0,47,890},{16,9,882},{0,47,890},{6,0,900},{6,0,900},{6,0,900},{6,0,900},{4,13,5},{4,13,5},{4,13,5},{4,42,4},{0,28,18},{0,28,18},{8,1,2056},{38,21,956},{8,43,1348},{38,29,949},{6,1,3156},{20,25,910},{20,13,22},{4,47,1318},{0,11,3384},{0,31,1015},{10,1,882},{10,39,5},{26,13,75},{40,29,174},{27,2,3048}, +{34,9,885},{36,13,10},{0,31,990},{39,10,3048},{0,31,990},{38,3,885},{38,3,885},{38,3,885},{38,45,885},{20,5,649},{20,13,21},{20,13,21},{20,14,66},{0,15,729},{0,30,5},{10,9,0},{10,9,0},{10,9,0},{10,31,1},{45,0,648},{6,29,2},{6,29,2},{16,30,4},{27,8,648},{16,30,4},{10,1,882},{40,23,1},{12,13,1},{4,13,1},{10,1,882},{4,9,882},{4,13,1}, +{0,31,890},{4,9,882},{0,31,890},{38,0,884},{38,0,884},{38,0,884},{38,0,884},{20,27,1},{20,27,1},{20,27,1},{20,28,1},{0,30,1},{0,30,1},{40,1,2134},{24,21,943},{40,11,1348},{8,43,952},{38,1,3240},{36,39,914},{6,27,22},{36,15,1330},{0,25,3244},{0,15,951},{42,1,891},{26,7,10},{42,27,77},{26,13,171},{8,1,3048},{4,23,886},{6,27,21},{0,15,950},{1,8,3048}, +{0,15,950},{24,3,890},{24,3,890},{24,3,890},{24,29,890},{6,35,649},{6,43,10},{6,43,10},{36,30,77},{0,13,675},{32,46,6},{26,7,10},{26,7,10},{26,7,10},{26,15,10},{29,2,648},{22,13,2},{22,13,2},{2,46,2},{35,6,648},{2,46,2},{21,0,882},{26,7,1},{28,27,4},{4,27,5},{21,0,882},{18,7,882},{4,27,5},{0,45,884},{18,7,882},{0,45,884},{24,0,890}, +{24,0,890},{24,0,890},{24,0,890},{6,11,1},{6,11,1},{6,11,1},{6,44,2},{16,47,2},{16,47,2},{26,1,2252},{40,35,940},{10,41,1348},{40,27,954},{24,1,3321},{22,23,910},{22,11,22},{6,45,1318},{0,39,3156},{0,29,940},{28,1,920},{12,37,5},{28,41,77},{12,27,180},{23,0,3048},{36,7,884},{38,11,10},{0,29,915},{18,9,3048},{0,29,915},{40,17,882},{40,17,882},{40,17,882}, +{40,43,883},{22,3,649},{38,27,20},{38,27,20},{22,47,86},{0,27,656},{2,31,9},{12,7,0},{12,7,0},{12,7,0},{12,29,1},{43,2,648},{38,27,4},{38,27,4},{34,47,4},{21,8,648},{34,47,4},{14,3,882},{42,21,1},{14,11,1},{6,11,1},{14,3,882},{32,5,882},{6,11,1},{0,29,890},{32,5,882},{0,29,890},{40,0,882},{40,0,882},{40,0,882},{40,0,882},{22,25,1}, +{22,25,1},{22,25,1},{22,30,2},{2,31,0},{2,31,0},{42,1,2404},{26,19,935},{42,9,1348},{10,41,952},{40,1,3409},{38,37,914},{8,41,30},{38,29,1354},{0,37,3087},{2,13,951},{14,1,954},{28,5,6},{44,25,77},{28,11,185},{9,6,3048},{6,21,886},{24,41,21},{0,43,900},{32,7,3048},{0,43,900},{26,1,891},{26,1,891},{26,1,891},{26,27,891},{8,3,654},{8,41,14},{8,41,14}, +{38,31,77},{16,41,651},{34,15,3},{28,5,5},{28,5,5},{28,5,5},{28,13,5},{38,1,648},{24,11,2},{24,11,2},{4,15,2},{43,28,648},{4,15,2},{46,3,882},{28,5,2},{30,25,4},{6,25,5},{46,3,882},{16,3,882},{6,25,5},{0,43,884},{16,3,882},{0,43,884},{26,0,890},{26,0,890},{26,0,890},{26,0,890},{8,9,5},{8,9,5},{8,9,5},{8,46,4},{34,15,2}, +{34,15,2},{28,1,2612},{12,3,951},{28,39,1354},{42,9,952},{26,1,3544},{24,21,910},{40,9,30},{8,43,1348},{0,35,3060},{18,27,935},{30,1,1005},{14,35,3},{30,39,77},{44,25,185},{41,12,3048},{38,35,890},{40,9,14},{0,27,891},{16,5,3048},{0,27,891},{42,1,900},{42,1,900},{42,1,900},{42,41,885},{24,1,654},{40,25,21},{40,25,21},{24,45,77},{2,9,651},{4,29,6},{14,5,2}, +{14,5,2},{14,5,2},{14,27,2},{39,0,648},{10,25,2},{10,25,2},{4,29,5},{9,28,648},{4,29,5},{1,0,882},{44,19,2},{47,9,4},{8,9,5},{1,0,882},{0,1,882},{8,9,5},{0,27,890},{0,1,882},{0,27,890},{42,0,884},{42,0,884},{42,0,884},{42,0,884},{24,7,5},{24,7,5},{24,7,5},{24,31,4},{4,29,2},{4,29,2},{14,1,2774},{28,1,940},{44,7,1318}, +{12,39,966},{12,1,3700},{40,35,916},{10,23,22},{40,11,1348},{16,19,3051},{34,41,940},{47,1,1061},{30,3,9},{46,23,86},{30,9,190},{14,1,3048},{8,19,886},{26,39,20},{16,41,882},{4,5,3048},{16,41,882},{28,1,915},{28,1,915},{28,1,915},{28,25,890},{10,1,657},{10,39,10},{10,39,10},{40,29,77},{18,39,654},{36,13,5},{46,35,4},{46,35,4},{46,35,4},{46,11,4},{23,2,648}, +{42,9,4},{42,9,4},{6,13,0},{20,9,648},{6,13,0},{15,1,882},{30,3,0},{31,23,2},{24,23,1},{15,1,882},{9,11,882},{24,23,1},{0,41,882},{9,11,882},{0,41,882},{28,0,890},{28,0,890},{28,0,890},{28,0,890},{10,7,1},{10,7,1},{10,7,1},{10,15,1},{20,43,1},{20,43,1},{46,1,3014},{14,1,951},{14,37,1330},{44,23,958},{14,1,3865},{26,19,913},{26,7,22}, +{10,41,1348},{32,33,3049},{20,25,943},{15,1,1154},{47,33,6},{31,37,77},{46,23,185},{17,0,3048},{40,3,885},{42,7,10},{2,25,890},{18,3,3048},{2,25,890},{14,1,950},{14,1,950},{14,1,950},{44,39,885},{42,1,672},{26,7,21},{26,7,21},{26,43,77},{34,7,652},{6,27,10},{47,3,2},{47,3,2},{47,3,2},{47,25,2},{37,2,648},{12,23,2},{12,23,2},{6,27,10},{34,7,648}, +{6,27,10},{27,5,882},{46,17,2},{45,7,2},{10,7,1},{27,5,882},{6,1,882},{10,7,1},{0,25,890},{6,1,882},{0,25,890},{44,0,884},{44,0,884},{44,0,884},{44,0,884},{26,5,5},{26,5,5},{26,5,5},{26,29,4},{6,27,1},{6,27,1},{47,1,3214},{30,1,1015},{46,5,1318},{14,37,966},{30,1,4009},{42,33,916},{12,21,22},{42,9,1348},{18,17,3051},{20,39,956},{29,1,1240}, +{31,1,5},{15,21,66},{31,7,185},{27,9,3048},{10,17,886},{12,21,21},{2,39,885},{14,7,3048},{2,39,885},{30,1,990},{30,1,990},{30,1,990},{30,23,890},{28,1,715},{12,37,10},{12,37,10},{12,27,75},{20,37,651},{38,11,5},{31,17,4},{31,17,4},{31,17,4},{31,9,8},{44,1,648},{28,7,2},{28,7,2},{8,11,0},{26,9,648},{8,11,0},{17,10,882},{31,1,1},{29,21,1}, +{26,21,1},{17,10,882},{24,1,882},{26,21,1},{0,39,884},{24,1,882},{0,39,884},{30,0,890},{30,0,890},{30,0,890},{30,0,890},{12,5,1},{12,5,1},{12,5,1},{12,13,1},{22,41,1},{22,41,1},{15,1,3526},{47,1,1153},{47,19,1337},{46,5,958},{47,1,4231},{28,17,910},{44,5,18},{12,39,1363},{20,1,3067},{22,23,945},{43,1,1380},{45,1,25},{29,35,70},{45,21,185},{13,3,3048}, +{12,1,888},{44,5,9},{18,7,901},{44,5,3048},{18,7,901},{47,1,1053},{47,1,1053},{47,1,1053},{46,37,890},{14,1,762},{44,5,14},{44,5,14},{28,41,69},{6,5,650},{8,25,6},{45,1,0},{45,1,0},{45,1,0},{45,23,0},{31,5,648},{14,21,0},{14,21,0},{24,25,4},{14,9,648},{24,25,4},{41,1,882},{29,1,18},{43,5,4},{12,5,5},{41,1,882},{47,3,882},{12,5,5}, +{0,7,900},{47,3,882},{0,7,900},{46,0,890},{46,0,890},{46,0,890},{46,0,890},{28,3,5},{28,3,5},{28,3,5},{28,27,4},{8,25,2},{8,25,2},{29,1,3764},{15,1,1379},{15,3,1335},{47,35,950},{15,1,4477},{14,1,925},{14,19,21},{28,7,1356},{22,1,3145},{38,37,947},{11,1,1485},{13,1,91},{13,19,74},{29,35,178},{43,1,3048},{14,1,925},{14,19,21},{20,37,882},{8,1,3048}, +{20,37,882},{31,1,1146},{31,1,1146},{31,1,1146},{31,21,890},{46,1,841},{14,35,16},{14,35,16},{14,25,85},{38,35,649},{40,9,5},{13,1,10},{13,1,10},{13,1,10},{13,7,9},{17,2,648},{30,35,1},{30,35,1},{10,9,2},{16,1,648},{10,9,2},{9,1,882},{43,1,68},{27,19,1},{28,19,1},{9,1,882},{46,1,882},{28,19,1},{0,37,882},{46,1,882},{0,37,882},{31,0,890}, +{31,0,890},{31,0,890},{31,0,890},{14,3,1},{14,3,1},{14,3,1},{14,11,1},{40,9,4},{40,9,4},{13,1,4076},{29,1,1612},{45,17,1337},{15,3,950},{29,1,4684},{46,1,1035},{46,3,23},{14,37,1363},{24,1,3256},{24,21,945},{41,1,1650},{27,1,236},{27,33,70},{13,19,174},{11,1,3048},{47,1,1013},{46,3,14},{20,5,901},{5,9,3048},{20,5,901},{45,1,1188},{45,1,1188},{45,1,1188}, +{15,35,883},{47,1,910},{46,3,19},{46,3,19},{30,39,77},{8,3,651},{10,23,6},{43,1,36},{43,1,36},{43,1,36},{43,21,1},{29,3,648},{47,19,5},{47,19,5},{26,23,4},{43,9,648},{26,23,4},{19,9,882},{41,1,146},{41,3,4},{14,3,5},{19,9,882},{45,1,882},{14,3,5},{0,5,900},{45,1,882},{0,5,900},{15,0,882},{15,0,882},{15,0,882},{15,0,882},{30,1,5}, +{30,1,5},{30,1,5},{30,25,4},{10,23,2},{10,23,2},{11,1,4374},{13,1,1924},{13,1,1335},{45,33,961},{13,1,4972},{47,1,1225},{47,17,22},{30,5,1356},{26,1,3460},{40,35,940},{9,1,1755},{41,1,434},{11,17,74},{27,3,185},{23,5,3048},{15,1,1146},{47,17,18},{22,35,882},{14,1,3048},{22,35,882},{13,1,1299},{13,1,1299},{13,1,1299},{29,19,890},{15,1,1017},{47,33,13},{47,33,13}, +{46,23,86},{40,33,652},{42,7,5},{11,1,45},{11,1,45},{11,1,45},{27,5,5},{39,11,648},{31,3,2},{31,3,2},{12,7,0},{22,1,648},{12,7,0},{21,17,882},{9,1,250},{25,17,1},{30,17,1},{21,17,882},{17,21,882},{30,17,1},{0,35,882},{17,21,882},{0,35,882},{29,0,890},{29,0,890},{29,0,890},{29,0,890},{47,1,5},{47,1,5},{47,1,5},{47,9,4},{26,37,4}, +{26,37,4},{41,1,4427},{27,1,2227},{27,1,1443},{13,17,925},{11,1,4878},{45,1,1331},{15,1,21},{47,35,1178},{44,1,3438},{26,19,810},{23,1,1746},{9,1,557},{25,1,89},{11,17,142},{23,17,2814},{13,1,1125},{15,1,5},{24,19,765},{45,17,2814},{24,19,765},{27,1,1443},{27,1,1443},{27,1,1443},{13,33,884},{29,1,1132},{15,1,21},{15,1,21},{31,37,69},{10,1,648},{28,21,5},{25,1,89}, +{25,1,89},{25,1,89},{41,19,1},{25,5,648},{45,17,2},{45,17,2},{28,21,1},{10,1,648},{28,21,1},{19,3,761},{7,1,274},{39,1,0},{31,1,0},{19,3,761},{39,1,761},{31,1,0},{0,19,765},{39,1,761},{0,19,765},{13,0,884},{13,0,884},{13,0,884},{13,0,884},{15,1,17},{15,1,17},{15,1,17},{31,23,4},{12,5,4},{12,5,4},{9,1,3933},{11,1,2185},{11,1,1509}, +{27,1,899},{41,1,4346},{13,1,1109},{45,1,42},{15,19,813},{30,1,2958},{12,3,510},{7,1,1386},{23,1,483},{39,1,128},{25,17,59},{3,25,2249},{11,1,870},{13,1,4},{10,3,482},{29,1,2249},{10,3,482},{11,1,1509},{11,1,1509},{11,1,1509},{27,17,890},{43,1,1275},{45,1,42},{45,1,42},{45,21,86},{12,1,675},{44,5,10},{39,1,128},{39,1,128},{39,1,128},{9,3,5},{9,3,648}, +{13,1,4},{13,1,4},{14,5,2},{31,3,648},{14,5,2},{3,3,481},{21,1,180},{7,1,1},{13,1,0},{3,3,481},{7,1,481},{13,1,0},{0,3,481},{7,1,481},{0,3,481},{27,0,890},{27,0,890},{27,0,890},{27,0,890},{45,1,26},{45,1,26},{45,1,26},{45,7,1},{44,35,2},{44,35,2},{39,1,3541},{9,1,2173},{25,1,1658},{11,1,893},{9,1,3801},{27,1,1035},{13,1,116}, +{45,3,523},{47,1,2574},{44,33,282},{21,1,1070},{7,1,427},{23,1,194},{39,1,16},{21,17,1769},{25,1,673},{27,1,26},{12,33,265},{17,21,1769},{12,33,265},{25,1,1658},{25,1,1658},{25,1,1658},{11,1,893},{11,1,1386},{13,1,116},{13,1,116},{29,35,69},{14,1,734},{14,19,6},{23,1,194},{23,1,194},{23,1,194},{39,17,1},{23,3,648},{27,1,26},{27,1,26},{14,19,5},{43,3,648}, +{14,19,5},{33,3,265},{35,1,89},{5,1,4},{25,1,0},{33,3,265},{21,1,265},{25,1,0},{0,33,265},{21,1,265},{0,33,265},{11,0,884},{11,0,884},{11,0,884},{11,0,884},{13,1,52},{13,1,52},{13,1,52},{29,21,4},{14,19,2},{14,19,2},{23,1,3267},{39,1,2157},{9,1,1764},{25,1,954},{39,1,3397},{11,1,950},{27,1,267},{13,33,297},{29,1,2313},{30,17,134},{5,1,838}, +{21,1,413},{37,1,260},{7,1,9},{17,39,1374},{23,1,518},{25,1,80},{44,17,125},{39,17,1374},{44,17,125},{9,1,1764},{9,1,1764},{9,1,1764},{25,1,954},{25,1,1569},{27,1,267},{27,1,267},{13,19,77},{47,1,846},{46,3,5},{37,1,260},{37,1,260},{37,1,260},{7,1,9},{3,25,648},{25,1,80},{25,1,80},{47,3,1},{29,1,648},{47,3,1},{33,1,113},{19,1,37},{19,1,1}, +{7,1,0},{33,1,113},{35,1,113},{7,1,0},{0,17,125},{35,1,113},{0,17,125},{25,0,890},{25,0,890},{25,0,890},{25,0,890},{27,1,98},{27,1,98},{27,1,98},{43,5,1},{46,3,4},{46,3,4},{7,1,3032},{7,1,2233},{23,1,1944},{39,1,1083},{7,1,3096},{9,1,1028},{41,1,506},{27,17,151},{13,1,2068},{47,17,31},{35,1,693},{5,1,425},{5,1,325},{21,1,52},{3,3,1032}, +{7,1,406},{23,1,157},{31,17,26},{3,3,1032},{31,17,26},{23,1,1944},{23,1,1944},{23,1,1944},{39,1,1083},{39,1,1723},{41,1,506},{41,1,506},{27,33,78},{45,1,1034},{47,17,6},{5,1,325},{5,1,325},{5,1,325},{21,1,52},{19,5,648},{23,1,157},{23,1,157},{31,17,1},{37,3,648},{31,17,1},{17,1,18},{17,1,10},{33,1,1},{19,1,0},{17,1,18},{33,1,18},{19,1,0}, +{0,17,26},{33,1,18},{0,17,26},{9,0,890},{9,0,890},{9,0,890},{9,0,890},{41,1,145},{41,1,145},{41,1,145},{27,19,4},{47,1,5},{47,1,5},{21,1,2710},{37,1,2207},{7,1,2004},{23,1,1173},{21,1,2775},{39,1,1036},{9,1,643},{41,1,81},{11,1,1900},{15,1,9},{3,1,524},{19,1,401},{19,1,365},{5,1,104},{33,33,771},{5,1,369},{37,1,221},{29,1,1},{33,33,771}, +{29,1,1},{7,1,2004},{7,1,2004},{7,1,2004},{23,1,1173},{23,1,1784},{9,1,643},{9,1,643},{41,17,61},{13,1,1091},{15,1,9},{19,1,365},{19,1,365},{19,1,365},{5,1,104},{33,5,578},{37,1,221},{37,1,221},{29,1,1},{23,1,578},{29,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{23,0,884}, +{23,0,884},{23,0,884},{23,0,884},{9,1,202},{9,1,202},{9,1,202},{41,3,1},{15,1,9},{15,1,9},{5,1,2214},{21,1,1813},{21,1,1669},{7,1,1109},{21,1,2151},{23,1,874},{23,1,585},{25,1,13},{25,1,1508},{13,1,34},{3,1,300},{3,1,225},{3,1,200},{19,1,61},{33,17,451},{35,1,192},{5,1,125},{11,1,0},{17,33,451},{11,1,0},{21,1,1669},{21,1,1669},{21,1,1669}, +{7,1,1109},{7,1,1460},{23,1,585},{23,1,585},{25,1,13},{11,1,872},{13,1,34},{3,1,200},{3,1,200},{3,1,200},{19,1,61},{17,5,338},{5,1,125},{5,1,125},{11,1,0},{5,17,338},{11,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{7,0,884},{7,0,884},{7,0,884},{7,0,884},{39,1,250}, +{39,1,250},{39,1,250},{25,17,4},{13,1,34},{13,1,34},{35,1,1818},{5,1,1521},{5,1,1421},{21,1,1028},{5,1,1675},{7,1,790},{7,1,565},{39,1,2},{23,1,1155},{11,1,100},{33,1,147},{33,1,107},{33,1,98},{3,1,29},{1,19,216},{19,1,88},{19,1,52},{23,1,1},{19,1,216},{23,1,1},{5,1,1421},{5,1,1421},{5,1,1421},{21,1,1028},{21,1,1158},{7,1,565},{7,1,565}, +{39,1,2},{25,1,723},{11,1,100},{33,1,98},{33,1,98},{33,1,98},{3,1,29},{33,17,162},{19,1,52},{19,1,52},{23,1,1},{17,33,162},{23,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{21,0,884},{21,0,884},{21,0,884},{21,0,884},{7,1,340},{7,1,340},{7,1,340},{39,1,2},{11,1,100}, +{11,1,100},{0,13,1568},{0,14,185},{0,10,5},{0,8,586},{0,44,3371},{0,24,2147},{0,8,1027},{0,36,2571},{0,6,3617},{0,20,2729},{0,13,1568},{0,14,185},{0,10,5},{0,8,586},{18,8,3371},{0,24,2147},{0,8,1027},{0,36,2571},{44,0,3371},{0,36,2571},{0,24,1},{0,24,1},{0,24,1},{0,20,1},{0,20,288},{0,34,100},{0,34,100},{0,2,164},{0,2,321},{0,2,189},{0,24,1}, +{0,24,1},{0,24,1},{0,20,1},{32,2,288},{0,34,100},{0,34,100},{0,2,164},{20,0,288},{0,2,164},{24,2,1568},{0,14,185},{0,10,5},{0,8,586},{24,2,1568},{13,0,1568},{0,8,586},{0,22,1576},{13,0,1568},{0,22,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,25,1568},{0,46,89},{0,26,20}, +{0,40,505},{0,46,3968},{0,10,2316},{0,24,1078},{0,6,2880},{0,22,4305},{0,6,3105},{0,25,1568},{0,46,89},{0,26,20},{0,40,505},{18,10,3968},{0,10,2316},{0,24,1078},{0,6,2880},{46,0,3968},{0,6,2880},{0,12,1},{0,12,1},{0,12,1},{0,6,0},{0,6,514},{0,20,193},{0,20,193},{0,18,317},{0,18,556},{0,18,353},{0,12,1},{0,12,1},{0,12,1},{0,6,0},{2,2,512}, +{0,20,193},{0,20,193},{0,18,317},{2,2,512},{0,18,317},{16,11,1568},{0,46,89},{16,26,5},{0,40,505},{16,11,1568},{25,0,1568},{0,40,505},{0,38,1570},{25,0,1568},{0,38,1570},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,7,1568},{0,15,37},{16,12,76},{0,10,421},{0,15,4652},{0,42,2540},{0,10,1097}, +{0,38,3251},{0,8,5108},{0,22,3545},{0,7,1568},{0,15,37},{16,12,51},{0,10,421},{38,2,4651},{0,42,2540},{0,10,1097},{0,38,3251},{16,8,4651},{0,38,3251},{0,46,0},{0,46,0},{0,46,0},{0,38,1},{0,8,802},{0,6,289},{0,6,289},{0,34,493},{0,34,872},{0,34,557},{0,46,0},{0,46,0},{0,46,0},{0,38,1},{4,0,802},{0,6,289},{0,6,289},{0,34,493},{8,0,802}, +{0,34,493},{26,4,1568},{0,15,37},{32,12,2},{0,10,421},{26,4,1568},{7,0,1568},{0,10,421},{0,24,1576},{7,0,1568},{0,24,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,19,1570},{0,29,8},{16,44,166},{0,12,338},{0,29,5420},{0,28,2755},{0,26,1208},{0,8,3659},{0,24,5988},{0,38,4028},{0,19,1570}, +{0,29,8},{16,44,141},{0,12,338},{40,0,5419},{0,28,2755},{0,26,1208},{0,8,3659},{46,2,5419},{0,8,3659},{0,45,0},{0,45,0},{0,45,0},{0,24,1},{0,24,1154},{0,22,433},{0,22,433},{0,4,697},{0,4,1270},{0,4,797},{0,45,0},{0,45,0},{0,45,0},{0,24,1},{18,4,1152},{0,22,433},{0,22,433},{0,4,697},{36,2,1152},{0,4,697},{14,0,1568},{0,29,8},{18,28,1}, +{0,12,338},{14,0,1568},{8,10,1568},{0,12,338},{0,40,1568},{8,10,1568},{0,40,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{16,17,1609},{16,43,45},{32,30,282},{0,28,325},{0,25,5419},{0,14,2514},{0,12,804},{0,24,3462},{0,10,6191},{0,8,3965},{32,3,1574},{32,13,17},{2,14,130},{16,28,312},{16,11,5419}, +{0,14,2514},{0,12,804},{0,24,3462},{25,0,5419},{0,24,3462},{16,43,41},{16,43,41},{16,43,41},{16,10,42},{0,28,1152},{0,40,292},{0,40,292},{0,36,596},{0,6,1379},{0,20,761},{32,29,4},{32,29,4},{32,29,4},{32,10,5},{2,24,1152},{0,40,292},{0,40,292},{0,36,596},{28,0,1152},{0,36,596},{30,2,1568},{0,27,4},{4,14,1},{0,28,244},{30,2,1568},{35,2,1568},{0,28,244}, +{0,26,1570},{35,2,1568},{0,26,1570},{16,0,41},{16,0,41},{16,0,41},{16,0,41},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,32,13},{0,32,13},{32,1,1733},{32,11,159},{32,46,455},{16,14,377},{0,7,5419},{0,47,2294},{0,44,542},{0,10,3225},{0,12,6401},{0,10,3901},{2,17,1569},{2,27,6},{18,46,125},{32,14,296},{26,4,5419},{0,47,2294},{0,44,542},{0,10,3225},{7,0,5419}, +{0,10,3225},{32,11,158},{32,11,158},{32,11,158},{32,42,157},{0,46,1154},{0,26,170},{0,26,170},{0,22,482},{0,22,1491},{0,6,739},{2,27,2},{2,27,2},{2,27,2},{2,26,5},{22,2,1152},{0,26,170},{0,26,170},{0,22,482},{42,2,1152},{0,22,482},{47,2,1568},{32,11,2},{20,30,5},{0,14,185},{47,2,1568},{17,2,1568},{0,14,185},{0,42,1570},{17,2,1568},{0,42,1570},{32,0,157}, +{32,0,157},{32,0,157},{32,0,157},{0,22,0},{0,22,0},{0,22,0},{0,34,1},{0,18,45},{0,18,45},{2,1,2003},{32,9,330},{2,31,710},{32,30,517},{0,35,5420},{0,15,2081},{0,30,345},{0,42,3099},{0,28,6641},{0,10,3885},{34,1,1574},{34,11,17},{4,47,134},{18,30,312},{14,0,5419},{0,15,2081},{0,30,345},{0,42,3099},{8,10,5419},{0,42,3099},{32,23,317},{32,23,317},{32,23,317}, +{32,28,317},{0,29,1154},{0,28,80},{0,28,80},{0,8,388},{0,8,1665},{0,38,753},{34,27,4},{34,27,4},{34,27,4},{34,12,5},{8,2,1152},{0,28,80},{0,28,80},{0,8,388},{30,2,1152},{0,8,388},{15,2,1568},{18,41,4},{36,47,5},{0,46,125},{15,2,1568},{33,4,1568},{0,46,125},{0,28,1576},{33,4,1568},{0,28,1576},{32,0,317},{32,0,317},{32,0,317},{32,0,317},{0,40,0}, +{0,40,0},{0,40,0},{0,20,0},{0,34,113},{0,34,113},{18,1,2395},{2,23,570},{18,45,1046},{2,47,725},{0,1,5419},{0,13,1947},{0,47,185},{0,12,2880},{0,14,6964},{0,12,3841},{20,1,1593},{4,25,6},{20,15,131},{34,46,326},{0,1,5419},{0,13,1947},{0,47,185},{0,12,2880},{1,0,5419},{0,12,2880},{2,21,546},{2,21,546},{2,21,546},{2,14,545},{0,11,1152},{0,30,37},{0,30,37}, +{0,24,317},{0,10,1846},{0,8,797},{4,25,2},{4,25,2},{4,25,2},{4,28,2},{24,4,1152},{0,30,37},{0,30,37},{0,24,317},{11,0,1152},{0,24,317},{43,0,1568},{34,9,1},{22,31,1},{0,47,85},{43,0,1568},{19,6,1568},{0,47,85},{0,44,1570},{19,6,1568},{0,44,1570},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,28,0},{0,28,0},{0,28,0},{0,6,1},{0,20,208}, +{0,20,208},{4,1,3030},{18,37,927},{34,29,1474},{18,15,1042},{16,1,5540},{0,27,1787},{0,15,57},{0,44,2668},{0,46,7299},{0,28,3836},{6,1,1612},{36,39,10},{6,29,136},{20,31,312},{47,2,5419},{0,27,1787},{0,15,57},{0,44,2668},{17,2,5419},{0,44,2668},{18,19,883},{18,19,883},{18,19,883},{18,46,882},{0,23,1152},{0,31,5},{0,31,5},{0,10,225},{0,26,2064},{0,10,901},{36,9,2}, +{36,9,2},{36,9,2},{36,14,1},{38,10,1152},{0,31,5},{0,31,5},{0,10,225},{23,0,1152},{0,10,225},{38,3,1568},{20,39,4},{8,45,5},{0,15,41},{38,3,1568},{35,8,1568},{0,15,41},{0,30,1570},{35,8,1568},{0,30,1570},{18,0,882},{18,0,882},{18,0,882},{18,0,882},{0,47,1},{0,47,1},{0,47,1},{0,8,1},{0,6,325},{0,6,325},{20,1,3734},{34,5,1332},{4,43,1958}, +{18,45,1395},{2,1,5808},{0,25,1676},{0,29,20},{0,30,2566},{0,15,7631},{0,44,3925},{22,1,1656},{6,7,9},{22,13,132},{6,45,309},{15,2,5419},{0,25,1676},{0,29,20},{0,30,2566},{33,4,5419},{0,30,2566},{34,33,1258},{34,33,1258},{34,33,1258},{34,47,1259},{0,5,1154},{0,45,5},{0,45,5},{0,42,180},{0,12,2275},{0,10,981},{6,23,4},{6,23,4},{6,23,4},{6,46,5},{28,2,1152}, +{16,15,1},{16,15,1},{0,42,180},{42,8,1152},{0,42,180},{41,2,1568},{36,7,2},{24,29,5},{0,29,20},{41,2,1568},{17,8,1568},{0,29,20},{0,46,1576},{17,8,1568},{0,46,1576},{34,0,1258},{34,0,1258},{34,0,1258},{34,0,1258},{0,29,0},{0,29,0},{0,29,0},{0,40,1},{0,38,482},{0,38,482},{36,1,4356},{4,19,1676},{20,27,2370},{34,13,1683},{18,1,6121},{0,39,1616},{16,43,36}, +{0,46,2397},{0,45,7815},{0,46,3837},{8,1,1715},{38,37,10},{8,43,131},{22,29,312},{43,0,5419},{0,39,1612},{16,43,27},{0,46,2393},{19,6,5419},{0,46,2393},{4,1,1577},{4,1,1577},{4,1,1577},{4,15,1576},{0,17,1156},{16,13,22},{16,13,22},{0,12,134},{0,44,2441},{0,12,971},{38,23,1},{38,23,1},{38,23,1},{38,47,2},{16,3,1152},{32,29,1},{32,29,1},{0,12,130},{17,0,1152}, +{0,12,130},{29,12,1568},{22,37,4},{10,43,5},{0,43,10},{29,12,1568},{26,13,1568},{0,43,10},{0,31,1576},{26,13,1568},{0,31,1576},{4,0,1576},{4,0,1576},{4,0,1576},{4,0,1576},{0,41,4},{0,41,4},{0,41,4},{0,26,4},{0,24,562},{0,24,562},{22,1,4616},{20,3,1677},{6,41,2378},{20,43,1681},{4,1,6311},{16,7,1620},{32,27,20},{0,31,2365},{0,43,7444},{0,47,3383},{40,1,1766}, +{8,5,11},{24,11,132},{8,13,314},{11,0,5419},{0,37,1577},{32,27,19},{0,31,2265},{5,8,5419},{0,31,2265},{20,1,1593},{20,1,1593},{20,1,1593},{20,29,1569},{32,1,1155},{32,27,19},{32,27,19},{16,44,125},{0,46,2150},{0,28,659},{8,21,2},{8,21,2},{8,21,2},{8,31,2},{30,4,1152},{18,13,1},{18,13,1},{0,44,72},{15,8,1152},{0,44,72},{37,0,1568},{38,5,2},{26,27,2}, +{0,27,2},{37,0,1568},{36,9,1568},{0,27,2},{0,15,1568},{36,9,1568},{0,15,1568},{20,0,1568},{20,0,1568},{20,0,1568},{20,0,1568},{32,41,1},{32,41,1},{32,41,1},{32,42,2},{0,26,388},{0,26,388},{8,1,4936},{6,17,1676},{22,9,2363},{36,11,1689},{36,1,6476},{2,37,1620},{18,41,24},{32,15,2370},{0,41,7036},{0,15,2859},{26,1,1851},{40,35,11},{10,25,136},{24,27,321},{41,2,5419}, +{16,5,1571},{18,41,20},{0,15,2130},{17,8,5419},{0,15,2130},{6,1,1619},{6,1,1619},{6,1,1619},{6,13,1571},{18,1,1158},{18,11,21},{18,11,21},{2,30,125},{0,31,1905},{0,14,425},{40,5,2},{40,5,2},{40,5,2},{40,45,2},{45,0,1152},{4,27,5},{4,27,5},{0,30,41},{27,8,1152},{0,30,41},{21,2,1568},{24,19,2},{12,41,1},{16,41,1},{21,2,1568},{24,9,1568},{16,41,1}, +{0,29,1570},{24,9,1568},{0,29,1570},{6,0,1570},{6,0,1570},{6,0,1570},{6,0,1570},{18,25,4},{18,25,4},{18,25,4},{18,28,5},{0,28,232},{0,28,232},{24,1,5154},{38,1,1680},{8,39,2378},{22,41,1683},{22,1,6708},{18,5,1628},{34,25,24},{2,29,2363},{0,9,6740},{0,45,2553},{12,1,1964},{10,3,8},{26,9,139},{40,41,309},{29,12,5419},{2,35,1572},{4,25,21},{0,29,2027},{26,13,5419}, +{0,29,2027},{38,1,1664},{38,1,1664},{38,1,1664},{22,27,1570},{4,1,1185},{34,25,20},{34,25,20},{34,46,130},{0,45,1721},{0,46,218},{10,19,4},{10,19,4},{10,19,4},{10,13,8},{29,2,1152},{20,11,5},{20,11,5},{0,47,25},{35,6,1152},{0,47,25},{35,2,1568},{10,3,4},{28,25,5},{18,25,4},{35,2,1568},{34,5,1568},{18,25,4},{0,13,1570},{34,5,1568},{0,13,1570},{22,0,1570}, +{22,0,1570},{22,0,1570},{22,0,1570},{34,23,1},{34,23,1},{34,23,1},{34,14,4},{0,14,149},{0,14,149},{26,1,5444},{8,1,1724},{24,23,2378},{38,9,1689},{8,1,6964},{4,35,1620},{20,39,36},{34,13,2370},{0,23,6513},{0,13,2244},{44,1,2099},{42,33,11},{12,23,136},{26,25,321},{37,0,5419},{18,3,1571},{20,39,27},{0,43,1924},{36,9,5419},{0,43,1924},{8,1,1720},{8,1,1720},{8,1,1720}, +{8,11,1577},{36,1,1224},{20,9,19},{20,9,19},{4,47,122},{0,43,1548},{0,31,90},{42,19,1},{42,19,1},{42,19,1},{42,43,2},{43,2,1152},{6,25,5},{6,25,5},{0,31,9},{21,8,1152},{0,31,9},{46,1,1568},{26,17,2},{14,39,2},{18,39,1},{46,1,1568},{26,7,1568},{18,39,1},{0,27,1576},{26,7,1568},{0,27,1576},{8,0,1576},{8,0,1576},{8,0,1576},{8,0,1576},{20,23,9}, +{20,23,9},{20,23,9},{4,30,10},{0,47,73},{0,47,73},{42,1,5700},{40,1,1798},{40,37,2375},{24,39,1683},{40,1,7153},{20,3,1626},{36,23,24},{4,27,2386},{0,21,6243},{0,27,1980},{30,1,2210},{12,1,8},{28,7,132},{42,39,323},{5,0,5419},{4,33,1572},{6,23,21},{0,27,1836},{0,5,5419},{0,27,1836},{40,1,1762},{40,1,1762},{40,1,1762},{24,25,1570},{6,1,1275},{36,23,20},{36,23,20}, +{36,15,125},{0,41,1395},{0,45,25},{12,17,4},{12,17,4},{12,17,4},{12,11,8},{38,1,1152},{22,9,4},{22,9,4},{0,45,0},{43,28,1152},{0,45,0},{31,1,1568},{42,1,2},{30,23,5},{4,23,5},{31,1,1568},{32,1,1568},{4,23,5},{0,11,1570},{32,1,1568},{0,11,1570},{24,0,1570},{24,0,1570},{24,0,1570},{24,0,1570},{36,21,1},{36,21,1},{36,21,1},{36,46,4},{0,15,25}, +{0,15,25},{28,1,6116},{26,1,1980},{26,5,2386},{40,7,1689},{26,1,7408},{6,17,1620},{22,37,24},{36,41,2375},{0,35,6044},{0,41,1798},{47,1,2385},{44,1,25},{14,37,125},{28,23,315},{35,2,5419},{20,1,1569},{22,37,20},{0,41,1762},{34,5,5419},{0,41,1762},{26,1,1836},{26,1,1836},{26,1,1836},{10,9,1574},{38,1,1363},{22,7,21},{22,7,21},{6,29,132},{0,9,1284},{0,13,8},{44,1,0}, +{44,1,0},{44,1,0},{44,41,0},{39,0,1152},{8,23,4},{8,23,4},{16,13,4},{9,28,1152},{16,13,4},{17,6,1568},{14,1,25},{47,37,4},{20,37,1},{17,6,1568},{20,1,1568},{20,37,1},{0,25,1570},{20,1,1568},{0,25,1570},{10,0,1570},{10,0,1570},{10,0,1570},{10,0,1570},{22,5,5},{22,5,5},{22,5,5},{22,31,5},{0,43,2},{0,43,2},{14,1,6434},{12,1,2244},{12,35,2370}, +{26,21,1685},{12,1,7724},{38,1,1620},{38,21,36},{22,25,2378},{0,3,5839},{0,9,1724},{31,1,2546},{30,1,90},{46,5,122},{14,7,322},{46,1,5419},{22,1,1602},{8,21,19},{0,9,1720},{26,7,5419},{0,9,1720},{42,1,1924},{42,1,1924},{42,1,1924},{26,23,1577},{24,1,1414},{38,21,27},{38,21,27},{22,13,136},{0,7,1218},{32,43,11},{30,1,9},{30,1,9},{30,1,9},{14,9,10},{23,2,1152}, +{24,7,5},{24,7,5},{18,43,1},{20,9,1152},{18,43,1},{27,3,1568},{46,1,73},{31,5,10},{36,5,9},{27,3,1568},{39,9,1568},{36,5,9},{0,9,1576},{39,9,1568},{0,9,1576},{26,0,1576},{26,0,1576},{26,0,1576},{26,0,1576},{38,19,1},{38,19,1},{38,19,1},{38,15,2},{16,27,2},{16,27,2},{30,1,6786},{44,1,2553},{28,3,2363},{42,5,1689},{28,1,8052},{24,1,1671},{24,35,24}, +{38,9,2378},{0,1,5715},{0,39,1680},{45,1,2675},{47,1,218},{47,35,130},{30,21,315},{31,1,5419},{24,1,1667},{24,35,20},{0,39,1664},{32,1,5419},{0,39,1664},{28,1,2027},{28,1,2027},{28,1,2027},{12,7,1571},{10,1,1521},{24,5,21},{24,5,21},{8,27,139},{0,21,1169},{2,11,8},{46,1,25},{46,1,25},{46,1,25},{46,39,1},{37,2,1152},{10,21,5},{10,21,5},{18,11,4},{34,7,1152}, +{18,11,4},{39,7,1568},{15,1,149},{15,35,4},{22,35,1},{39,7,1568},{26,1,1568},{22,35,1},{0,23,1570},{26,1,1568},{0,23,1570},{12,0,1570},{12,0,1570},{12,0,1570},{12,0,1570},{24,19,4},{24,19,4},{24,19,4},{24,29,5},{2,11,4},{2,11,4},{47,1,7186},{14,1,2859},{14,33,2370},{28,35,1683},{30,1,8313},{40,1,1819},{40,19,24},{8,23,2363},{16,1,5820},{16,7,1676},{13,1,2892}, +{15,1,425},{31,3,125},{47,35,321},{45,1,5419},{26,1,1796},{10,19,21},{0,7,1619},{27,9,5419},{0,7,1619},{14,1,2130},{14,1,2130},{14,1,2130},{28,21,1570},{42,1,1608},{40,19,20},{40,19,20},{24,11,136},{0,19,1155},{34,41,11},{31,1,41},{31,1,41},{31,1,41},{47,7,5},{44,1,1152},{26,5,5},{26,5,5},{4,41,2},{26,9,1152},{4,41,2},{25,1,1568},{29,1,232},{29,19,5}, +{24,19,4},{25,1,1568},{33,9,1568},{24,19,4},{0,7,1570},{33,9,1568},{0,7,1570},{28,0,1570},{28,0,1570},{28,0,1570},{28,0,1570},{40,17,1},{40,17,1},{40,17,1},{40,13,1},{18,25,2},{18,25,2},{15,1,7706},{46,1,3383},{30,1,2365},{14,3,1685},{47,1,8695},{42,1,2092},{26,33,20},{40,7,2378},{4,1,6099},{2,21,1677},{27,1,3152},{29,1,659},{45,17,125},{31,19,315},{27,3,5419}, +{44,1,1993},{26,33,19},{0,21,1593},{39,9,5419},{0,21,1593},{30,1,2265},{30,1,2265},{30,1,2265},{14,5,1572},{28,1,1764},{26,33,19},{26,33,19},{10,25,132},{32,3,1155},{4,9,11},{45,1,72},{45,1,72},{45,1,72},{15,37,1},{31,5,1152},{12,19,1},{12,19,1},{20,9,2},{14,9,1152},{20,9,2},{23,17,1568},{27,1,388},{43,33,2},{40,33,1},{23,17,1568},{45,17,1568},{40,33,1}, +{0,21,1568},{45,17,1568},{0,21,1568},{14,0,1568},{14,0,1568},{14,0,1568},{14,0,1568},{26,1,2},{26,1,2},{26,1,2},{26,27,2},{4,39,2},{4,39,2},{45,1,8016},{47,1,3837},{47,1,2397},{30,17,1685},{31,1,9093},{28,1,2484},{42,17,36},{26,21,2370},{36,1,6379},{18,5,1676},{11,1,3345},{13,1,971},{13,1,134},{15,33,326},{39,7,5419},{30,1,2185},{12,17,22},{0,5,1577},{26,1,5419}, +{0,5,1577},{47,1,2393},{47,1,2393},{47,1,2393},{30,19,1576},{14,1,1890},{42,17,27},{42,17,27},{42,9,131},{2,17,1152},{36,39,10},{13,1,130},{13,1,130},{13,1,130},{45,5,5},{17,2,1152},{28,33,1},{28,33,1},{22,39,1},{16,1,1152},{22,39,1},{21,3,1568},{25,1,562},{27,1,4},{40,1,4},{21,3,1568},{43,1,1568},{40,1,4},{0,5,1576},{43,1,1568},{0,5,1576},{30,0,1576}, +{30,0,1576},{30,0,1576},{30,0,1576},{42,1,10},{42,1,10},{42,1,10},{42,11,5},{36,23,4},{36,23,4},{13,1,7700},{45,1,3925},{31,1,2566},{47,17,1637},{45,1,8460},{14,1,2285},{28,1,20},{42,5,1958},{38,1,5932},{4,35,1332},{9,1,2987},{11,1,981},{43,1,180},{29,17,219},{9,3,4803},{47,1,1925},{44,1,5},{32,35,1258},{31,3,4803},{32,35,1258},{31,1,2566},{31,1,2566},{31,1,2566}, +{47,3,1577},{30,1,2054},{28,1,20},{28,1,20},{12,23,132},{34,1,1155},{6,7,9},{43,1,180},{43,1,180},{43,1,180},{13,35,1},{29,3,1152},{14,17,1},{14,17,1},{22,7,4},{43,9,1152},{22,7,4},{21,1,1250},{39,1,482},{41,1,1},{28,1,0},{21,1,1250},{41,1,1250},{28,1,0},{0,35,1258},{41,1,1250},{0,35,1258},{47,0,1576},{47,0,1576},{47,0,1576},{47,0,1576},{28,1,20}, +{28,1,20},{28,1,20},{28,25,5},{6,37,2},{6,37,2},{43,1,7164},{29,1,3836},{45,1,2668},{31,1,1579},{13,1,7780},{30,1,2041},{14,1,57},{28,35,1474},{24,1,5308},{36,19,927},{9,1,2475},{11,1,901},{11,1,225},{43,17,110},{37,7,4056},{15,1,1590},{30,1,5},{18,19,883},{30,1,4056},{18,19,883},{45,1,2668},{45,1,2668},{45,1,2668},{31,17,1570},{47,1,2214},{14,1,57},{14,1,57}, +{28,7,136},{36,1,1186},{38,37,10},{11,1,225},{11,1,225},{11,1,225},{43,3,5},{39,11,1152},{30,1,5},{30,1,5},{8,37,2},{22,1,1152},{8,37,2},{5,1,882},{7,1,325},{9,1,1},{46,1,1},{5,1,882},{9,1,882},{46,1,1},{0,19,882},{9,1,882},{0,19,882},{31,0,1570},{31,0,1570},{31,0,1570},{31,0,1570},{14,1,41},{14,1,41},{14,1,41},{44,9,5},{38,21,4}, +{38,21,4},{11,1,6493},{13,1,3841},{13,1,2880},{45,1,1574},{43,1,7071},{47,1,1822},{46,1,185},{44,19,1046},{26,1,4761},{22,3,570},{23,1,2034},{9,1,797},{25,1,317},{11,17,34},{23,17,3318},{13,1,1221},{31,1,37},{20,3,546},{45,17,3318},{20,3,546},{13,1,2880},{13,1,2880},{13,1,2880},{45,1,1574},{45,1,2443},{46,1,185},{46,1,185},{14,21,131},{38,1,1275},{24,5,6},{25,1,317}, +{25,1,317},{25,1,317},{11,33,1},{25,5,1152},{31,1,37},{31,1,37},{24,5,2},{10,1,1152},{24,5,2},{3,3,545},{21,1,208},{7,1,1},{29,1,0},{3,3,545},{23,1,545},{29,1,0},{0,3,545},{23,1,545},{0,3,545},{45,0,1570},{45,0,1570},{45,0,1570},{45,0,1570},{46,1,85},{46,1,85},{46,1,85},{30,23,1},{8,35,1},{8,35,1},{41,1,6095},{11,1,3885},{43,1,3099}, +{13,1,1636},{11,1,6422},{45,1,1767},{31,1,345},{30,3,710},{44,1,4358},{8,33,330},{7,1,1698},{39,1,753},{9,1,388},{41,1,9},{3,25,2753},{27,1,1018},{29,1,80},{22,33,317},{29,1,2753},{22,33,317},{43,1,3099},{43,1,3099},{43,1,3099},{13,1,1636},{29,1,2628},{31,1,345},{31,1,345},{46,5,134},{40,1,1395},{10,35,17},{9,1,388},{9,1,388},{9,1,388},{41,1,9},{9,3,1152}, +{29,1,80},{29,1,80},{26,35,4},{31,3,1152},{26,35,4},{33,3,313},{35,1,113},{21,1,0},{41,1,0},{33,3,313},{21,1,313},{41,1,0},{0,33,317},{21,1,313},{0,33,317},{29,0,1576},{29,0,1576},{29,0,1576},{29,0,1576},{47,1,125},{47,1,125},{47,1,125},{46,37,5},{40,19,4},{40,19,4},{9,1,5661},{11,1,3901},{11,1,3225},{43,1,1739},{41,1,5978},{29,1,1685},{45,1,542}, +{47,33,455},{14,1,3994},{10,33,159},{21,1,1418},{7,1,739},{23,1,482},{9,1,16},{21,17,2273},{11,1,878},{27,1,170},{10,33,158},{17,21,2273},{10,33,158},{11,1,3225},{11,1,3225},{11,1,3225},{43,1,1739},{43,1,2875},{45,1,542},{45,1,542},{47,19,125},{42,1,1584},{26,3,6},{23,1,482},{23,1,482},{23,1,482},{9,1,16},{23,3,1152},{27,1,170},{27,1,170},{26,3,2},{43,3,1152}, +{26,3,2},{17,3,145},{19,1,45},{35,1,1},{23,1,0},{17,3,145},{35,1,145},{23,1,0},{0,33,157},{35,1,145},{0,33,157},{43,0,1570},{43,0,1570},{43,0,1570},{43,0,1570},{15,1,185},{15,1,185},{15,1,185},{31,21,5},{10,33,2},{10,33,2},{39,1,5341},{9,1,3965},{25,1,3462},{11,1,1889},{9,1,5505},{13,1,1765},{13,1,804},{31,33,282},{47,1,3750},{42,17,45},{5,1,1210}, +{21,1,761},{37,1,596},{23,1,73},{17,39,1878},{9,1,781},{41,1,292},{42,17,41},{39,17,1878},{42,17,41},{25,1,3462},{25,1,3462},{25,1,3462},{11,1,1889},{11,1,3058},{13,1,804},{13,1,804},{15,3,130},{44,1,1798},{12,33,17},{37,1,596},{37,1,596},{37,1,596},{23,1,73},{3,25,1152},{41,1,292},{41,1,292},{28,33,4},{29,1,1152},{28,33,4},{1,3,41},{33,1,13},{3,1,1}, +{5,1,1},{1,3,41},{3,1,41},{5,1,1},{0,17,41},{3,1,41},{0,17,41},{27,0,1570},{27,0,1570},{27,0,1570},{27,0,1570},{29,1,244},{29,1,244},{29,1,244},{15,5,1},{26,1,4},{26,1,4},{23,1,5128},{39,1,4028},{9,1,3659},{25,1,2169},{39,1,5148},{11,1,1917},{27,1,1208},{45,17,166},{29,1,3628},{28,1,8},{35,1,1089},{5,1,797},{5,1,697},{37,1,221},{3,3,1536}, +{7,1,706},{23,1,433},{44,1,0},{3,3,1536},{44,1,0},{9,1,3659},{9,1,3659},{9,1,3659},{25,1,2169},{25,1,3366},{27,1,1208},{27,1,1208},{45,17,141},{47,1,2105},{28,1,8},{5,1,697},{5,1,697},{5,1,697},{37,1,221},{19,5,1152},{23,1,433},{23,1,433},{44,1,0},{37,3,1152},{44,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0}, +{0,1,0},{1,1,0},{0,1,0},{41,0,1568},{41,0,1568},{41,0,1568},{41,0,1568},{13,1,338},{13,1,338},{13,1,338},{29,19,1},{28,1,8},{28,1,8},{7,1,4416},{23,1,3545},{39,1,3251},{9,1,2027},{23,1,4372},{41,1,1771},{11,1,1097},{13,17,76},{29,1,2956},{14,1,37},{19,1,753},{35,1,557},{35,1,493},{21,1,148},{17,5,1067},{21,1,513},{7,1,289},{47,1,0},{5,17,1067}, +{47,1,0},{39,1,3251},{39,1,3251},{39,1,3251},{9,1,2027},{9,1,2819},{11,1,1097},{11,1,1097},{13,17,51},{47,1,1769},{14,1,37},{35,1,493},{35,1,493},{35,1,493},{21,1,148},{5,1,802},{7,1,289},{7,1,289},{47,1,0},{9,1,802},{47,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{25,0,1576}, +{25,0,1576},{25,0,1576},{25,0,1576},{11,1,421},{11,1,421},{11,1,421},{13,33,2},{14,1,37},{14,1,37},{21,1,3786},{7,1,3105},{7,1,2880},{23,1,1929},{7,1,3648},{9,1,1532},{25,1,1078},{27,1,20},{13,1,2452},{47,1,89},{3,1,456},{19,1,353},{19,1,317},{35,1,89},{33,33,683},{5,1,321},{21,1,193},{13,1,1},{33,33,683},{13,1,1},{7,1,2880},{7,1,2880},{7,1,2880}, +{23,1,1929},{39,1,2411},{25,1,1078},{25,1,1078},{27,1,20},{29,1,1451},{47,1,89},{19,1,317},{19,1,317},{19,1,317},{35,1,89},{3,3,512},{21,1,193},{21,1,193},{13,1,1},{3,3,512},{13,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{39,0,1570},{39,0,1570},{39,0,1570},{39,0,1570},{41,1,505}, +{41,1,505},{41,1,505},{27,17,5},{47,1,89},{47,1,89},{21,1,3210},{21,1,2729},{37,1,2571},{7,1,1825},{21,1,3015},{39,1,1388},{9,1,1027},{11,1,5},{11,1,2032},{15,1,185},{3,1,264},{3,1,189},{3,1,164},{19,1,45},{17,3,384},{35,1,164},{35,1,100},{25,1,1},{35,1,384},{25,1,1},{37,1,2571},{37,1,2571},{37,1,2571},{7,1,1825},{7,1,2112},{9,1,1027},{9,1,1027}, +{11,1,5},{13,1,1235},{15,1,185},{3,1,164},{3,1,164},{3,1,164},{19,1,45},{33,3,288},{35,1,100},{35,1,100},{25,1,1},{21,1,288},{25,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{23,0,1576},{23,0,1576},{23,0,1576},{23,0,1576},{9,1,586},{9,1,586},{9,1,586},{11,1,5},{15,1,185}, +{15,1,185},{0,37,2665},{0,45,274},{0,44,8},{0,26,1025},{0,15,5885},{0,12,3666},{0,10,1742},{0,38,4406},{0,8,6359},{0,22,4730},{0,37,2665},{0,45,274},{0,44,8},{0,26,1025},{22,4,5885},{0,12,3666},{0,10,1742},{0,38,4406},{15,0,5885},{0,38,4406},{0,28,0},{0,28,0},{0,28,0},{0,6,1},{0,22,545},{0,20,208},{0,20,208},{0,18,340},{0,18,593},{0,18,376},{0,28,0}, +{0,28,0},{0,28,0},{0,6,1},{2,2,545},{0,20,208},{0,20,208},{0,18,340},{22,0,545},{0,18,340},{28,0,2665},{0,45,274},{0,44,8},{0,26,1025},{28,0,2665},{37,0,2665},{0,26,1025},{0,24,2665},{37,0,2665},{0,24,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,3,2665},{0,43,169},{0,14,17}, +{0,12,865},{0,13,6669},{0,28,3898},{0,42,1825},{0,8,4826},{0,24,7263},{0,38,5231},{0,3,2665},{0,43,169},{0,14,17},{0,12,865},{24,2,6669},{0,28,3898},{0,42,1825},{0,8,4826},{13,0,6669},{0,8,4826},{0,46,1},{0,46,1},{0,46,1},{0,8,4},{0,8,841},{0,6,306},{0,6,306},{0,34,520},{0,34,917},{0,34,584},{0,46,1},{0,46,1},{0,46,1},{0,8,4},{4,0,841}, +{0,6,306},{0,6,306},{0,34,520},{8,0,841},{0,34,520},{44,2,2665},{0,43,169},{16,14,2},{0,12,865},{44,2,2665},{3,0,2665},{0,12,865},{0,40,2669},{3,0,2665},{0,40,2669},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,1,2669},{0,41,85},{16,46,79},{0,44,725},{0,11,7538},{0,14,4214},{0,12,1842}, +{0,8,5354},{0,10,8241},{0,8,5795},{0,1,2669},{0,41,85},{16,46,54},{0,44,725},{24,4,7538},{0,14,4214},{0,12,1842},{0,8,5354},{11,0,7538},{0,8,5354},{0,29,1},{0,29,1},{0,29,1},{0,24,4},{0,40,1201},{0,22,458},{0,22,458},{0,4,730},{0,4,1325},{0,4,830},{0,29,1},{0,29,1},{0,29,1},{0,24,4},{20,0,1201},{0,22,458},{0,22,458},{0,4,730},{40,0,1201}, +{0,4,730},{30,2,2665},{0,41,85},{32,46,5},{0,44,725},{30,2,2665},{35,2,2665},{0,44,725},{0,26,2665},{35,2,2665},{0,26,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{16,1,2799},{0,9,29},{16,31,167},{0,14,650},{0,9,8493},{0,46,4485},{0,44,1934},{0,40,5878},{0,26,9333},{0,40,6503},{16,1,2774}, +{0,9,29},{16,31,142},{0,14,650},{42,0,8493},{0,46,4485},{0,44,1934},{0,40,5878},{9,0,8493},{0,40,5878},{0,11,0},{0,11,0},{0,11,0},{0,26,1},{0,26,1625},{0,24,629},{0,24,629},{0,20,986},{0,20,1793},{0,20,1130},{0,11,0},{0,11,0},{0,11,0},{0,26,1},{36,0,1625},{0,24,629},{0,24,629},{0,20,986},{26,0,1625},{0,20,986},{2,1,2665},{0,9,29},{18,47,1}, +{0,14,650},{2,1,2665},{1,2,2665},{0,14,650},{0,42,2669},{1,2,2665},{0,42,2669},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{32,1,3171},{0,7,4},{16,15,315},{0,46,514},{0,7,9669},{0,31,4865},{0,46,2114},{0,10,6505},{0,12,10663},{0,10,7181},{32,1,3050},{0,7,4},{32,15,274},{0,46,514},{26,4,9669}, +{0,31,4865},{0,46,2114},{0,10,6505},{7,0,9669},{0,10,6505},{0,23,0},{0,23,0},{0,23,0},{0,12,1},{0,28,2178},{0,10,820},{0,10,820},{0,6,1348},{0,6,2405},{0,20,1553},{0,23,0},{0,23,0},{0,23,0},{0,12,1},{2,24,2178},{0,10,820},{0,10,820},{0,6,1348},{28,0,2178},{0,6,1348},{29,0,2665},{0,7,4},{4,31,9},{0,46,514},{29,0,2665},{17,4,2665},{0,46,514}, +{0,28,2665},{17,4,2665},{0,28,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,1,3529},{16,21,35},{32,29,444},{0,31,474},{0,19,9670},{0,45,4529},{0,46,1634},{0,42,6265},{0,28,10919},{0,26,7149},{18,1,3146},{16,21,10},{2,29,285},{0,31,474},{14,0,9669},{0,45,4529},{0,46,1634},{0,42,6265},{8,10,9669}, +{0,42,6265},{16,21,34},{16,21,34},{16,21,34},{16,44,34},{0,46,2180},{0,12,610},{0,12,610},{0,22,1184},{0,22,2517},{0,22,1473},{16,21,9},{16,21,9},{16,21,9},{16,44,9},{22,2,2178},{0,12,610},{0,12,610},{0,22,1184},{42,2,2178},{0,22,1184},{13,2,2665},{16,21,1},{20,45,0},{0,31,410},{13,2,2665},{3,6,2665},{0,31,410},{0,14,2677},{3,6,2665},{0,14,2677},{16,0,34}, +{16,0,34},{16,0,34},{16,0,34},{0,34,0},{0,34,0},{0,34,0},{0,32,1},{0,32,10},{0,32,10},{18,1,3971},{32,35,150},{2,43,644},{16,45,534},{0,1,9669},{0,43,4214},{0,31,1226},{0,28,5954},{0,14,11246},{0,12,6951},{4,1,3285},{2,5,4},{34,13,274},{32,15,483},{0,1,9669},{0,43,4214},{0,31,1226},{0,28,5954},{1,0,9669},{0,28,5954},{16,3,146},{16,3,146},{16,3,146}, +{16,30,147},{0,29,2180},{0,28,458},{0,28,458},{0,8,1018},{0,8,2691},{0,38,1419},{2,21,0},{2,21,0},{2,21,0},{2,14,1},{8,2,2178},{0,28,458},{0,28,458},{0,8,1018},{30,2,2178},{0,8,1018},{27,2,2665},{2,5,4},{6,29,9},{0,15,338},{27,2,2665},{35,8,2665},{0,15,338},{0,30,2665},{35,8,2665},{0,30,2665},{16,0,146},{16,0,146},{16,0,146},{16,0,146},{0,6,1}, +{0,6,1},{0,6,1},{0,18,4},{0,18,40},{0,18,40},{34,1,4603},{32,3,307},{2,11,925},{32,29,667},{16,1,9779},{0,41,3905},{0,45,913},{0,44,5653},{0,46,11530},{0,44,6878},{36,1,3390},{18,19,11},{4,27,269},{2,29,474},{18,3,9669},{0,41,3905},{0,45,913},{0,44,5653},{45,8,9669},{0,44,5653},{32,1,291},{32,1,291},{32,1,291},{32,47,291},{0,11,2178},{0,46,305},{0,46,305}, +{0,40,925},{0,10,2872},{0,8,1427},{34,5,10},{34,5,10},{34,5,10},{18,46,9},{24,4,2178},{0,46,305},{0,46,305},{0,40,925},{11,0,2178},{0,40,925},{8,1,2665},{18,19,2},{22,43,0},{0,29,265},{8,1,2665},{1,8,2665},{0,29,265},{0,46,2677},{1,8,2665},{0,46,2677},{32,0,290},{32,0,290},{32,0,290},{32,0,290},{0,24,1},{0,24,1},{0,24,1},{0,20,1},{0,34,100}, +{0,34,100},{20,1,5538},{2,17,582},{34,41,1298},{2,43,882},{2,1,10086},{0,9,3618},{0,43,581},{0,30,5418},{0,15,11905},{0,14,6895},{22,1,3586},{4,3,3},{36,11,273},{34,43,478},{15,2,9669},{0,9,3618},{0,43,581},{0,30,5418},{33,4,9669},{0,30,5418},{2,1,570},{2,1,570},{2,1,570},{2,15,549},{0,23,2178},{0,15,185},{0,15,185},{0,10,765},{0,26,3090},{0,10,1441},{4,3,2}, +{4,3,2},{4,3,2},{4,47,2},{38,10,2178},{0,15,185},{0,15,185},{0,10,765},{23,0,2178},{0,10,765},{23,0,2665},{4,3,2},{8,11,8},{0,43,181},{23,0,2665},{18,9,2665},{0,43,181},{0,31,2665},{18,9,2665},{0,31,2665},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,28,0},{0,28,0},{0,28,0},{0,6,1},{0,20,208},{0,20,208},{36,1,6378},{18,1,926},{4,9,1734}, +{18,27,1131},{18,1,10495},{0,7,3434},{0,27,353},{0,47,5186},{0,45,12293},{0,46,6789},{8,1,3785},{20,17,10},{6,25,270},{4,27,491},{43,0,9669},{0,7,3434},{0,27,353},{0,47,5186},{19,6,9669},{0,47,5186},{18,1,922},{18,1,922},{18,1,922},{18,45,842},{0,5,2180},{0,29,106},{0,29,106},{0,42,666},{0,12,3301},{0,26,1514},{36,3,4},{36,3,4},{36,3,4},{36,15,8},{28,2,2178}, +{0,29,106},{0,29,106},{0,42,666},{42,8,2178},{0,42,666},{7,2,2665},{20,17,1},{24,41,2},{0,11,136},{7,2,2665},{2,7,2665},{0,11,136},{0,15,2669},{2,7,2665},{0,15,2669},{18,0,841},{18,0,841},{18,0,841},{18,0,841},{0,46,1},{0,46,1},{0,46,1},{0,8,4},{0,6,306},{0,6,306},{6,1,7490},{34,1,1446},{4,39,2218},{18,41,1450},{34,1,11103},{0,21,3209},{0,41,187}, +{0,31,4909},{0,43,12686},{0,31,6845},{40,1,3938},{6,1,3},{38,9,273},{36,41,478},{11,0,9669},{0,21,3209},{0,41,187},{0,31,4909},{5,8,9669},{0,31,4909},{34,1,1382},{34,1,1382},{34,1,1382},{34,13,1213},{0,17,2178},{0,27,40},{0,27,40},{0,28,544},{0,44,3603},{0,12,1541},{6,1,2},{6,1,2},{6,1,2},{6,45,2},{16,3,2178},{0,27,40},{0,27,40},{0,28,544},{17,0,2178}, +{0,28,544},{21,2,2665},{6,1,2},{10,9,8},{0,25,90},{21,2,2665},{16,5,2665},{0,25,90},{0,29,2665},{16,5,2665},{0,29,2665},{34,0,1213},{34,0,1213},{34,0,1213},{34,0,1213},{0,29,1},{0,29,1},{0,29,1},{0,24,4},{0,22,458},{0,22,458},{22,1,8710},{20,1,2145},{20,7,2826},{34,25,1850},{20,1,11913},{0,35,3073},{0,9,86},{0,15,4721},{0,41,13118},{0,15,6837},{26,1,4118}, +{38,1,29},{8,23,258},{6,25,491},{24,3,9669},{0,35,3073},{0,9,86},{0,15,4721},{3,24,9669},{0,15,4721},{4,1,1973},{4,1,1973},{4,1,1973},{34,27,1630},{16,1,2221},{0,25,10},{0,25,10},{0,44,450},{0,46,3876},{0,28,1633},{38,1,4},{38,1,4},{38,1,4},{38,29,8},{30,4,2178},{0,25,10},{0,25,10},{0,44,450},{15,8,2178},{0,44,450},{14,1,2665},{8,1,25},{26,39,1}, +{0,9,61},{14,1,2665},{4,5,2665},{0,9,61},{0,13,2669},{4,5,2665},{0,13,2669},{34,0,1629},{34,0,1629},{34,0,1629},{34,0,1629},{0,11,0},{0,11,0},{0,11,0},{0,26,1},{0,24,629},{0,24,629},{8,1,10335},{36,1,3100},{36,21,3546},{4,39,2361},{36,1,12883},{0,33,2901},{0,23,25},{0,13,4485},{0,25,13589},{0,45,6982},{42,1,4353},{24,1,117},{40,37,270},{38,39,491},{29,12,9669}, +{0,33,2901},{0,23,25},{0,13,4485},{26,13,9669},{0,13,4485},{36,1,2739},{36,1,2739},{36,1,2739},{4,41,2181},{32,1,2427},{0,39,4},{0,39,4},{0,46,353},{0,31,4242},{0,14,1830},{24,1,17},{24,1,17},{24,1,17},{8,43,2},{45,0,2178},{16,39,2},{16,39,2},{0,46,353},{27,8,2178},{0,46,353},{17,0,2665},{40,1,73},{12,7,5},{0,23,25},{17,0,2665},{18,3,2665},{0,23,25}, +{0,27,2665},{18,3,2665},{0,27,2665},{4,0,2180},{4,0,2180},{4,0,2180},{4,0,2180},{0,23,0},{0,23,0},{0,23,0},{0,12,1},{0,10,820},{0,10,820},{24,1,11582},{6,1,4137},{6,35,4199},{20,7,2845},{6,1,13958},{0,1,2826},{0,37,31},{0,43,4255},{0,39,13958},{0,43,6958},{28,1,4610},{10,1,278},{10,21,261},{8,23,481},{37,0,9669},{0,1,2825},{16,37,18},{0,43,4254},{36,9,9669}, +{0,43,4254},{36,1,3454},{36,1,3454},{36,1,3454},{20,9,2665},{18,1,2740},{16,7,26},{16,7,26},{0,47,278},{0,15,4491},{0,46,1858},{40,1,29},{40,1,29},{40,1,29},{40,27,5},{29,2,2178},{32,23,2},{32,23,2},{0,47,277},{35,6,2178},{0,47,277},{1,2,2665},{42,1,157},{28,37,2},{0,37,5},{1,2,2665},{2,1,2665},{0,37,5},{0,11,2677},{2,1,2665},{0,11,2677},{20,0,2665}, +{20,0,2665},{20,0,2665},{20,0,2665},{0,5,2},{0,5,2},{0,5,2},{0,14,5},{0,12,981},{0,12,981},{40,1,12090},{38,1,4554},{22,19,4203},{36,21,2837},{38,1,14410},{32,1,2930},{32,21,37},{0,27,4187},{0,37,13477},{0,27,6222},{14,1,4826},{42,1,465},{42,35,270},{40,7,488},{5,0,9669},{2,1,2921},{2,21,25},{0,27,4106},{0,5,9669},{0,27,4106},{22,1,3593},{22,1,3593},{22,1,3593}, +{6,39,2677},{34,1,2840},{32,21,21},{32,21,21},{16,15,277},{0,43,4186},{0,31,1450},{26,1,52},{26,1,52},{26,1,52},{10,41,2},{43,2,2178},{18,7,4},{18,7,4},{0,15,205},{21,8,2178},{0,15,205},{13,3,2665},{44,1,260},{14,5,5},{0,5,8},{13,3,2665},{20,1,2665},{0,5,8},{0,25,2665},{20,1,2665},{0,25,2665},{6,0,2677},{6,0,2677},{6,0,2677},{6,0,2677},{32,35,4}, +{32,35,4},{32,35,4},{32,30,5},{0,28,745},{0,28,745},{26,1,12542},{24,1,4990},{8,33,4178},{22,5,2845},{24,1,14719},{2,1,3162},{18,35,34},{16,41,4197},{0,5,13013},{0,41,5610},{46,1,5121},{28,1,754},{12,19,270},{26,21,484},{30,3,9669},{4,1,3110},{18,35,18},{0,41,3929},{42,9,9669},{0,41,3929},{8,1,3770},{8,1,3770},{8,1,3770},{22,7,2666},{20,1,3011},{18,5,26},{18,5,26}, +{32,45,261},{0,27,3822},{0,15,1062},{12,1,98},{12,1,98},{12,1,98},{42,25,5},{38,1,2178},{34,21,2},{34,21,2},{0,29,160},{43,28,2178},{0,29,160},{43,1,2665},{30,1,388},{30,35,2},{16,35,2},{43,1,2665},{8,1,2665},{16,35,2},{0,9,2677},{8,1,2665},{0,9,2677},{22,0,2665},{22,0,2665},{22,0,2665},{22,0,2665},{2,3,2},{2,3,2},{2,3,2},{2,46,5},{0,46,578}, +{0,46,578},{12,1,13222},{40,1,5610},{40,17,4197},{38,19,2849},{26,1,15194},{4,1,3497},{34,19,34},{32,9,4178},{0,3,12493},{0,25,4990},{47,1,5429},{14,1,1062},{44,33,261},{42,5,499},{46,1,9669},{36,1,3341},{4,19,26},{0,9,3770},{26,7,9669},{0,9,3770},{40,1,3929},{40,1,3929},{40,1,3929},{8,37,2678},{6,1,3174},{34,19,18},{34,19,18},{18,13,270},{0,25,3462},{0,29,754},{28,1,160}, +{28,1,160},{28,1,160},{12,39,5},{39,0,2178},{20,35,2},{20,35,2},{0,13,98},{9,28,2178},{0,13,98},{11,1,2665},{47,1,578},{47,3,5},{2,3,2},{11,1,2665},{42,1,2665},{2,3,2},{0,23,2665},{42,1,2665},{0,23,2665},{8,0,2677},{8,0,2677},{8,0,2677},{8,0,2677},{34,17,2},{34,17,2},{34,17,2},{34,31,2},{0,31,388},{0,31,388},{28,1,13826},{26,1,6222},{26,1,4187}, +{24,3,2835},{42,1,15614},{36,1,3886},{20,33,37},{18,23,4203},{0,17,12134},{0,39,4554},{45,1,5669},{30,1,1450},{14,17,277},{28,19,484},{31,1,9669},{38,1,3605},{20,33,21},{0,23,3593},{32,1,9669},{0,23,3593},{26,1,4106},{26,1,4106},{26,1,4106},{24,5,2665},{22,1,3378},{20,3,25},{20,3,25},{34,43,270},{0,39,3206},{0,43,465},{14,1,205},{14,1,205},{14,1,205},{44,7,5},{23,2,2178}, +{36,3,4},{36,3,4},{0,27,52},{20,9,2178},{0,27,52},{39,3,2665},{29,1,745},{31,33,5},{34,33,4},{39,3,2665},{14,1,2665},{34,33,4},{0,7,2677},{14,1,2665},{0,7,2677},{24,0,2665},{24,0,2665},{24,0,2665},{24,0,2665},{4,1,8},{4,1,8},{4,1,8},{4,15,5},{0,45,260},{0,45,260},{14,1,14322},{42,1,6958},{42,1,4255},{40,17,2837},{28,1,16150},{38,1,4422},{36,1,31}, +{34,7,4199},{0,1,11889},{0,7,4137},{29,1,6018},{47,1,1858},{46,1,278},{44,3,499},{45,1,9669},{40,1,3905},{6,17,26},{0,37,3454},{27,9,9669},{0,37,3454},{42,1,4254},{42,1,4254},{42,1,4254},{40,19,2678},{24,1,3540},{36,17,18},{36,17,18},{20,11,261},{0,37,2979},{0,11,278},{46,1,277},{46,1,277},{46,1,277},{14,37,5},{37,2,2178},{22,33,2},{22,33,2},{0,41,29},{34,7,2178}, +{0,41,29},{7,3,2665},{13,1,981},{15,1,5},{4,1,2},{7,3,2665},{15,1,2665},{4,1,2},{0,21,2665},{15,1,2665},{0,21,2665},{10,0,2677},{10,0,2677},{10,0,2677},{10,0,2677},{36,1,5},{36,1,5},{36,1,5},{36,29,2},{0,43,157},{0,43,157},{30,1,13683},{44,1,6982},{12,1,4485},{26,17,2739},{14,1,15204},{24,1,4100},{22,1,25},{20,37,3546},{0,1,10840},{0,37,3100},{13,1,5451}, +{15,1,1830},{47,1,353},{30,33,333},{39,11,8712},{26,1,3507},{38,1,4},{0,37,2739},{22,1,8712},{0,37,2739},{12,1,4485},{12,1,4485},{12,1,4485},{26,3,2665},{40,1,3736},{22,1,25},{22,1,25},{36,41,270},{0,5,2779},{0,25,117},{47,1,353},{47,1,353},{47,1,353},{46,5,5},{44,1,2178},{38,17,2},{38,17,2},{0,25,17},{26,9,2178},{0,25,17},{3,25,2178},{11,1,820},{13,1,1}, +{22,1,0},{3,25,2178},{29,1,2178},{22,1,0},{0,5,2180},{29,1,2178},{0,5,2180},{26,0,2665},{26,0,2665},{26,0,2665},{26,0,2665},{22,1,25},{22,1,25},{22,1,25},{6,13,5},{0,41,73},{0,41,73},{47,1,12750},{14,1,6837},{14,1,4721},{12,1,2694},{30,1,14061},{40,1,3663},{8,1,86},{6,21,2826},{2,1,9775},{0,21,2145},{11,1,4689},{29,1,1633},{45,1,450},{47,17,195},{17,10,7578}, +{44,1,2961},{24,1,10},{0,5,1973},{24,1,7578},{0,5,1973},{14,1,4721},{14,1,4721},{14,1,4721},{12,17,2673},{26,1,3965},{8,1,86},{8,1,86},{22,9,258},{0,3,2571},{0,39,29},{45,1,450},{45,1,450},{45,1,450},{47,19,5},{31,5,2178},{24,1,10},{24,1,10},{0,39,4},{14,9,2178},{0,39,4},{37,1,1625},{25,1,629},{27,1,1},{10,1,0},{37,1,1625},{27,1,1625},{10,1,0}, +{0,35,1629},{27,1,1625},{0,35,1629},{12,0,2669},{12,0,2669},{12,0,2669},{12,0,2669},{8,1,61},{8,1,61},{8,1,61},{38,27,1},{0,9,25},{0,9,25},{15,1,12134},{30,1,6845},{30,1,4909},{28,1,2666},{47,1,13165},{26,1,3426},{40,1,187},{38,5,2218},{2,1,9023},{0,35,1446},{11,1,4097},{13,1,1541},{29,1,544},{31,17,90},{39,7,6661},{14,1,2525},{26,1,40},{0,35,1382},{26,1,6661}, +{0,35,1382},{30,1,4909},{30,1,4909},{30,1,4909},{28,1,2666},{12,1,4230},{40,1,187},{40,1,187},{8,39,273},{0,17,2453},{0,7,3},{29,1,544},{29,1,544},{29,1,544},{15,3,5},{17,2,2178},{26,1,40},{26,1,40},{0,7,2},{16,1,2178},{0,7,2},{21,1,1201},{23,1,458},{25,1,4},{28,1,1},{21,1,1201},{41,1,1201},{28,1,1},{0,35,1213},{41,1,1201},{0,35,1213},{28,0,2665}, +{28,0,2665},{28,0,2665},{28,0,2665},{24,1,90},{24,1,90},{24,1,90},{8,11,8},{0,7,2},{0,7,2},{45,1,11330},{47,1,6789},{46,1,5186},{14,1,2694},{47,1,12365},{42,1,3246},{26,1,353},{8,5,1734},{20,1,8393},{0,19,926},{25,1,3614},{27,1,1514},{43,1,666},{45,17,35},{9,3,5829},{47,1,2177},{28,1,106},{0,19,922},{31,3,5829},{0,19,922},{46,1,5186},{46,1,5186},{46,1,5186}, +{14,1,2694},{14,1,4504},{26,1,353},{26,1,353},{24,7,270},{16,1,2450},{16,21,10},{43,1,666},{43,1,666},{43,1,666},{45,33,2},{29,3,2178},{28,1,106},{28,1,106},{2,37,4},{43,9,2178},{2,37,4},{5,1,841},{7,1,306},{9,1,4},{47,1,1},{5,1,841},{9,1,841},{47,1,1},{0,19,841},{9,1,841},{0,19,841},{14,0,2669},{14,0,2669},{14,0,2669},{14,0,2669},{10,1,136}, +{10,1,136},{10,1,136},{40,25,2},{16,21,1},{16,21,1},{29,1,10834},{15,1,6895},{31,1,5418},{30,1,2786},{45,1,11530},{44,1,3154},{42,1,581},{40,35,1298},{36,1,7857},{16,3,582},{9,1,3105},{11,1,1441},{11,1,765},{13,1,8},{37,7,5082},{47,1,1905},{14,1,185},{0,3,570},{30,1,5082},{0,3,570},{31,1,5418},{31,1,5418},{31,1,5418},{30,1,2786},{30,1,4724},{42,1,581},{42,1,581}, +{10,37,273},{2,1,2587},{2,5,3},{11,1,765},{11,1,765},{11,1,765},{13,1,8},{39,11,2178},{14,1,185},{14,1,185},{2,5,2},{22,1,2178},{2,5,2},{3,3,545},{21,1,208},{7,1,1},{29,1,0},{3,3,545},{23,1,545},{29,1,0},{0,3,545},{23,1,545},{0,3,545},{30,0,2665},{30,0,2665},{30,0,2665},{30,0,2665},{42,1,181},{42,1,181},{42,1,181},{10,9,8},{2,5,2}, +{2,5,2},{13,1,10311},{45,1,6878},{45,1,5653},{47,1,2933},{29,1,10827},{14,1,3066},{44,1,913},{10,3,925},{8,1,7297},{2,33,307},{39,1,2707},{9,1,1427},{41,1,925},{27,1,32},{23,17,4344},{29,1,1611},{47,1,305},{0,33,291},{45,17,4344},{0,33,291},{45,1,5653},{45,1,5653},{45,1,5653},{47,1,2933},{47,1,5051},{44,1,913},{44,1,913},{26,5,269},{4,1,2859},{18,19,11},{41,1,925}, +{41,1,925},{41,1,925},{27,1,32},{25,5,2178},{47,1,305},{47,1,305},{18,19,10},{10,1,2178},{18,19,10},{33,3,288},{35,1,100},{21,1,1},{25,1,1},{33,3,288},{21,1,288},{25,1,1},{0,33,290},{21,1,288},{0,33,290},{47,0,2677},{47,0,2677},{47,0,2677},{47,0,2677},{28,1,265},{28,1,265},{28,1,265},{42,23,0},{18,19,2},{18,19,2},{11,1,9837},{13,1,6951},{29,1,5954}, +{15,1,3166},{13,1,10279},{47,1,3138},{30,1,1226},{42,3,644},{40,1,6929},{34,33,150},{7,1,2436},{39,1,1419},{9,1,1018},{11,1,101},{3,25,3779},{13,1,1475},{29,1,458},{2,17,146},{29,1,3779},{2,17,146},{29,1,5954},{29,1,5954},{29,1,5954},{15,1,3166},{31,1,5396},{30,1,1226},{30,1,1226},{12,35,274},{36,1,3147},{4,3,4},{9,1,1018},{9,1,1018},{9,1,1018},{11,1,101},{9,3,2178}, +{29,1,458},{29,1,458},{20,3,0},{31,3,2178},{20,3,0},{17,3,128},{19,1,40},{19,1,4},{7,1,1},{17,3,128},{35,1,128},{7,1,1},{0,17,146},{35,1,128},{0,17,146},{31,0,2665},{31,0,2665},{31,0,2665},{31,0,2665},{14,1,338},{14,1,338},{14,1,338},{28,7,9},{4,3,4},{4,3,4},{11,1,9437},{27,1,7149},{43,1,6265},{29,1,3402},{11,1,9788},{47,1,3234},{47,1,1634}, +{28,33,444},{42,1,6719},{20,17,35},{21,1,2210},{23,1,1473},{23,1,1184},{25,1,241},{21,17,3299},{11,1,1400},{13,1,610},{20,17,34},{17,21,3299},{20,17,34},{43,1,6265},{43,1,6265},{43,1,6265},{29,1,3402},{45,1,5621},{47,1,1634},{47,1,1634},{28,3,285},{8,1,3421},{20,17,10},{23,1,1184},{23,1,1184},{23,1,1184},{25,1,241},{23,3,2178},{13,1,610},{13,1,610},{20,17,9},{43,3,2178}, +{20,17,9},{17,1,34},{33,1,10},{33,1,1},{35,1,0},{17,1,34},{3,1,34},{35,1,0},{0,17,34},{3,1,34},{0,17,34},{15,0,2677},{15,0,2677},{15,0,2677},{15,0,2677},{30,1,410},{30,1,410},{30,1,410},{44,21,0},{20,17,1},{20,17,1},{9,1,9175},{11,1,7181},{11,1,6505},{13,1,3686},{11,1,9340},{45,1,3447},{47,1,2114},{14,17,315},{44,1,6532},{6,1,4},{21,1,2034}, +{21,1,1553},{7,1,1348},{39,1,410},{17,39,2904},{9,1,1411},{11,1,820},{22,1,0},{39,17,2904},{22,1,0},{11,1,6505},{11,1,6505},{11,1,6505},{13,1,3686},{13,1,5990},{47,1,2114},{47,1,2114},{14,33,274},{40,1,3789},{6,1,4},{7,1,1348},{7,1,1348},{7,1,1348},{39,1,410},{3,25,2178},{11,1,820},{11,1,820},{22,1,0},{29,1,2178},{22,1,0},{1,1,0},{1,1,0},{1,1,0}, +{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{29,0,2665},{29,0,2665},{29,0,2665},{29,0,2665},{47,1,514},{47,1,514},{47,1,514},{30,5,9},{6,1,4},{6,1,4},{9,1,7987},{41,1,6503},{41,1,5878},{27,1,3561},{25,1,8118},{29,1,3051},{45,1,1934},{30,17,167},{30,1,5562},{8,1,29},{5,1,1507},{21,1,1130},{21,1,986},{23,1,298},{19,3,2166}, +{23,1,1019},{25,1,629},{10,1,0},{39,1,2166},{10,1,0},{41,1,5878},{41,1,5878},{41,1,5878},{27,1,3561},{27,1,5301},{45,1,1934},{45,1,1934},{30,17,142},{42,1,3266},{8,1,29},{21,1,986},{21,1,986},{21,1,986},{23,1,298},{37,1,1625},{25,1,629},{25,1,629},{10,1,0},{27,1,1625},{10,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0}, +{0,1,0},{1,1,0},{0,1,0},{43,0,2669},{43,0,2669},{43,0,2669},{43,0,2669},{15,1,650},{15,1,650},{15,1,650},{46,19,1},{8,1,29},{8,1,29},{39,1,7111},{9,1,5795},{9,1,5354},{11,1,3381},{9,1,6983},{13,1,2803},{13,1,1842},{47,17,79},{47,1,4802},{40,1,85},{35,1,1132},{5,1,830},{5,1,730},{7,1,226},{3,3,1601},{7,1,739},{23,1,458},{28,1,1},{3,3,1601}, +{28,1,1},{9,1,5354},{9,1,5354},{9,1,5354},{11,1,3381},{11,1,4622},{13,1,1842},{13,1,1842},{47,17,54},{44,1,2834},{40,1,85},{5,1,730},{5,1,730},{5,1,730},{7,1,226},{21,1,1201},{23,1,458},{23,1,458},{28,1,1},{41,1,1201},{28,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{27,0,2665}, +{27,0,2665},{27,0,2665},{27,0,2665},{45,1,725},{45,1,725},{45,1,725},{47,33,5},{40,1,85},{40,1,85},{23,1,6361},{39,1,5231},{9,1,4826},{41,1,3294},{39,1,6071},{11,1,2610},{43,1,1825},{15,1,17},{47,1,4162},{42,1,169},{19,1,792},{35,1,584},{35,1,520},{21,1,153},{19,1,1121},{7,1,531},{7,1,306},{47,1,1},{37,1,1121},{47,1,1},{9,1,4826},{9,1,4826},{9,1,4826}, +{41,1,3294},{41,1,4145},{43,1,1825},{43,1,1825},{15,1,17},{30,1,2474},{42,1,169},{35,1,520},{35,1,520},{35,1,520},{21,1,153},{5,1,841},{7,1,306},{7,1,306},{47,1,1},{9,1,841},{47,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{41,0,2669},{41,0,2669},{41,0,2669},{41,0,2669},{13,1,865}, +{13,1,865},{13,1,865},{15,17,2},{42,1,169},{42,1,169},{7,1,5637},{23,1,4730},{39,1,4406},{9,1,3146},{39,1,5287},{11,1,2418},{11,1,1742},{45,1,8},{29,1,3547},{44,1,274},{3,1,489},{19,1,376},{19,1,340},{35,1,100},{33,33,726},{5,1,344},{21,1,208},{29,1,0},{33,33,726},{29,1,0},{39,1,4406},{39,1,4406},{39,1,4406},{9,1,3146},{9,1,3630},{11,1,1742},{11,1,1742}, +{45,1,8},{47,1,2178},{44,1,274},{19,1,340},{19,1,340},{19,1,340},{35,1,100},{3,3,545},{21,1,208},{21,1,208},{29,1,0},{23,1,545},{29,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{25,0,2665},{25,0,2665},{25,0,2665},{25,0,2665},{27,1,1025},{27,1,1025},{27,1,1025},{45,1,8},{44,1,274}, +{44,1,274},{36,1,50644},{0,1,2121},{0,25,169},{0,41,4591},{20,1,59804},{0,3,19310},{0,11,7401},{0,43,24008},{0,9,65535},{0,15,40741},{18,1,10267},{0,3,1445},{0,41,137},{0,15,3985},{42,6,18065},{0,45,12064},{0,31,6081},{0,12,14121},{19,0,18065},{0,12,14121},{0,15,1},{0,15,1},{0,15,1},{0,24,0},{0,24,1105},{0,22,410},{0,22,410},{0,4,666},{0,4,1217},{0,4,766},{0,15,1}, +{0,15,1},{0,15,1},{0,24,0},{34,2,1105},{0,22,410},{0,22,410},{0,4,666},{24,0,1105},{0,4,666},{43,2,9248},{0,3,1445},{0,41,137},{0,15,3985},{43,2,9248},{21,8,9248},{0,15,3985},{0,14,9256},{21,8,9248},{0,14,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{36,1,53600},{16,1,2998},{0,9,44}, +{0,25,3941},{36,1,62123},{0,1,18506},{0,25,6750},{0,27,23131},{0,39,65535},{0,29,40569},{34,1,10859},{0,1,1241},{0,9,50},{0,13,3690},{16,3,19334},{0,43,12449},{0,15,6117},{0,28,14809},{17,0,19334},{0,28,14809},{0,27,0},{0,27,0},{0,27,0},{0,10,1},{0,26,1513},{0,8,585},{0,8,585},{0,20,914},{0,20,1669},{0,20,1058},{0,27,0},{0,27,0},{0,27,0},{0,10,1},{34,4,1513}, +{0,8,585},{0,8,585},{0,20,914},{26,0,1513},{0,20,914},{38,1,9248},{0,1,1241},{0,9,50},{0,13,3690},{38,1,9248},{43,28,9248},{0,13,3690},{0,46,9250},{43,28,9248},{0,46,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{36,1,56716},{16,1,4497},{0,23,30},{0,39,3500},{36,1,64625},{0,1,18101},{0,9,6313}, +{0,11,22459},{0,37,65535},{0,43,39632},{4,1,11624},{0,1,1225},{0,39,10},{0,27,3400},{16,1,20689},{0,41,12854},{0,43,6221},{0,44,15490},{19,2,20689},{0,44,15490},{0,9,1},{0,9,1},{0,9,1},{0,42,1},{0,12,1985},{0,10,757},{0,10,757},{0,36,1241},{0,36,2193},{0,20,1394},{0,9,1},{0,9,1},{0,9,1},{0,42,1},{6,0,1985},{0,10,757},{0,10,757},{0,36,1241},{12,0,1985}, +{0,36,1241},{24,1,9248},{0,1,1225},{0,39,10},{0,27,3400},{24,1,9248},{32,9,9248},{0,27,3400},{0,47,9248},{32,9,9248},{0,47,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,1,58324},{32,1,6344},{0,7,6},{0,23,2873},{36,1,65535},{16,1,17968},{0,23,5727},{0,25,21128},{0,21,63585},{0,27,38087},{36,1,12449}, +{16,1,1437},{0,7,9},{0,41,3185},{47,2,22129},{0,25,13298},{0,43,6189},{0,44,16354},{17,2,22129},{0,44,16354},{0,21,0},{0,21,0},{0,21,0},{0,44,1},{0,44,2521},{0,26,953},{0,26,953},{0,6,1553},{0,6,2770},{0,6,1778},{0,21,0},{0,21,0},{0,21,0},{0,44,1},{22,0,2521},{0,26,953},{0,26,953},{0,6,1553},{44,0,2521},{0,6,1553},{7,0,9248},{16,1,1412},{16,7,0}, +{0,41,3185},{7,0,9248},{0,7,9248},{0,41,3185},{0,15,9266},{0,7,9248},{0,15,9266},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{22,1,58878},{32,1,8497},{0,21,52},{0,37,2302},{22,1,65535},{16,1,18091},{0,37,5062},{0,9,19646},{0,5,60796},{0,41,35977},{36,1,13547},{16,1,1923},{16,21,62},{0,25,2897},{45,0,23851}, +{0,39,13856},{0,27,6323},{0,46,17289},{27,8,23851},{0,46,17289},{0,33,0},{0,33,0},{0,33,0},{0,30,0},{0,46,3200},{0,12,1186},{0,12,1186},{0,38,1962},{0,22,3521},{0,22,2261},{0,33,0},{0,33,0},{0,33,0},{0,30,0},{18,10,3200},{0,12,1186},{0,12,1186},{0,38,1962},{46,0,3200},{0,38,1962},{37,2,9248},{2,1,1717},{2,21,5},{0,25,2897},{37,2,9248},{34,7,9248},{0,25,2897}, +{0,45,9250},{34,7,9248},{0,45,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{22,1,59528},{2,1,10468},{0,5,122},{0,21,1965},{22,1,65535},{16,1,18728},{0,21,4602},{0,23,18427},{0,3,58418},{0,25,34396},{6,1,14752},{2,1,2501},{16,35,141},{0,39,2720},{45,2,25472},{0,37,14401},{0,41,6413},{0,46,18185},{25,8,25472}, +{0,46,18185},{0,1,16},{0,1,16},{0,1,16},{0,47,0},{0,31,3872},{0,28,1450},{0,28,1450},{0,38,2362},{0,38,4283},{0,38,2723},{0,1,16},{0,1,16},{0,1,16},{0,47,0},{36,6,3872},{0,28,1450},{0,28,1450},{0,38,2362},{31,0,3872},{0,38,2362},{44,1,9248},{20,1,2041},{18,5,2},{0,39,2720},{44,1,9248},{26,9,9248},{0,39,2720},{0,13,9256},{26,9,9248},{0,13,9256},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{24,1,60070},{2,1,12544},{0,19,188},{0,35,1604},{22,1,65535},{32,1,19503},{0,5,4081},{0,7,17117},{0,3,56204},{0,25,32856},{22,1,15824},{2,1,3225},{32,19,229},{0,7,2478},{46,10,26744},{0,21,14657},{0,25,6357},{0,31,18737},{23,8,26744},{0,31,18737},{16,1,115},{16,1,115},{16,1,115}, +{0,15,5},{0,29,4420},{0,46,1613},{0,46,1613},{0,8,2642},{0,8,4931},{0,8,3083},{16,1,90},{16,1,90},{16,1,90},{0,15,5},{8,2,4418},{0,46,1613},{0,46,1613},{0,8,2642},{30,2,4418},{0,8,2642},{33,0,9248},{36,1,2405},{34,19,5},{0,7,2474},{33,0,9248},{32,3,9248},{0,7,2474},{0,43,9250},{32,3,9248},{0,43,9250},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,16,1}, +{0,16,1},{0,16,1},{0,16,1},{0,16,2},{0,16,2},{24,1,60699},{2,1,14864},{16,3,314},{0,19,1400},{24,1,65535},{2,1,20230},{0,19,3323},{0,37,15488},{0,17,54456},{0,39,31364},{24,1,16210},{4,1,3849},{2,33,221},{0,37,2328},{38,3,26744},{0,3,14114},{0,23,5618},{0,15,18273},{35,8,26744},{0,15,18273},{32,1,291},{32,1,291},{32,1,291},{16,29,50},{0,11,4418},{0,31,1325},{0,31,1325}, +{0,10,2465},{0,10,5112},{0,8,3051},{2,1,136},{2,1,136},{2,1,136},{32,29,5},{24,4,4418},{0,31,1325},{0,31,1325},{0,10,2465},{11,0,4418},{0,10,2465},{47,1,9248},{8,1,2738},{20,3,1},{0,37,2228},{47,1,9248},{31,9,9248},{0,37,2228},{0,11,9256},{31,9,9248},{0,11,9256},{16,0,50},{16,0,50},{16,0,50},{16,0,50},{0,4,0},{0,4,0},{0,4,0},{0,2,0},{0,32,18}, +{0,32,18},{24,1,61549},{2,1,17597},{16,17,476},{0,33,1268},{24,1,65535},{2,1,21346},{0,33,2615},{0,5,13900},{0,17,52724},{0,37,29656},{40,1,16729},{36,1,4545},{34,1,221},{32,21,2384},{8,1,26744},{0,3,13529},{0,37,4710},{0,29,17819},{1,8,26744},{0,29,17819},{2,1,626},{2,1,626},{2,1,626},{32,43,185},{0,23,4418},{0,45,1037},{0,45,1037},{0,10,2249},{0,26,5330},{0,10,2925},{34,1,185}, +{34,1,185},{34,1,185},{18,13,4},{38,10,4418},{0,45,1037},{0,45,1037},{0,10,2249},{23,0,4418},{0,10,2249},{29,3,9248},{40,1,3188},{6,17,2},{0,35,2041},{29,3,9248},{43,9,9248},{0,35,2041},{0,41,9256},{43,9,9248},{0,41,9256},{32,0,185},{32,0,185},{32,0,185},{32,0,185},{0,38,0},{0,38,0},{0,38,0},{0,34,1},{0,18,61},{0,18,61},{40,1,62083},{4,1,19345},{16,1,697}, +{0,17,1188},{24,1,65535},{2,1,22086},{0,17,2057},{0,35,12551},{0,1,51532},{0,37,28158},{26,1,16691},{36,1,5081},{20,1,265},{32,35,2281},{29,12,26259},{0,17,12803},{0,5,3981},{0,43,16952},{26,13,26259},{0,43,16952},{18,1,1006},{18,1,1006},{18,1,1006},{2,11,378},{0,5,4420},{0,43,820},{0,43,820},{0,12,2020},{0,12,5541},{0,42,2966},{20,1,265},{20,1,265},{20,1,265},{34,27,1},{28,2,4418}, +{0,43,820},{0,43,820},{0,12,2020},{42,8,4418},{0,12,2020},{43,3,8978},{42,1,3434},{22,1,1},{0,19,1737},{43,3,8978},{45,7,8978},{0,19,1737},{0,9,8986},{45,7,8978},{0,9,8986},{2,0,377},{2,0,377},{2,0,377},{2,0,377},{0,10,1},{0,10,1},{0,10,1},{0,20,4},{0,4,136},{0,4,136},{40,1,62361},{4,1,19653},{16,1,1095},{0,17,1126},{24,1,65535},{2,1,21601},{0,17,1502}, +{0,19,11253},{0,1,50904},{0,37,27226},{42,1,15419},{38,1,4708},{36,1,320},{18,19,1862},{23,2,24371},{0,1,11221},{0,35,2905},{0,27,15080},{20,9,24371},{0,27,15080},{34,1,1522},{34,1,1522},{34,1,1522},{2,25,618},{0,17,4418},{0,41,610},{0,41,610},{0,44,1810},{0,44,5843},{0,12,2885},{36,1,320},{36,1,320},{36,1,320},{20,11,9},{16,3,4418},{0,41,610},{0,41,610},{0,44,1810},{17,0,4418}, +{0,44,1810},{27,3,7938},{44,1,3033},{8,1,4},{0,19,1225},{27,3,7938},{39,9,7938},{0,19,1225},{0,9,7946},{39,9,7938},{0,9,7946},{2,0,617},{2,0,617},{2,0,617},{2,0,617},{0,44,0},{0,44,0},{0,44,0},{0,22,1},{0,36,232},{0,36,232},{40,1,62690},{4,1,20049},{32,1,1585},{16,17,1131},{40,1,65535},{2,1,21187},{0,17,1035},{0,19,10004},{0,1,50320},{0,37,26351},{28,1,14260}, +{24,1,4365},{22,1,410},{4,19,1523},{47,11,22568},{0,1,9893},{0,19,1997},{0,27,13320},{22,9,22568},{0,27,13320},{4,1,2169},{4,1,2169},{4,1,2169},{18,9,929},{16,1,4461},{0,9,442},{0,9,442},{0,14,1665},{0,46,6116},{0,44,2907},{22,1,410},{22,1,410},{22,1,410},{36,25,1},{30,4,4418},{0,9,442},{0,9,442},{0,14,1665},{15,8,4418},{0,14,1665},{11,3,6962},{14,1,2645},{10,1,1}, +{0,3,832},{11,3,6962},{44,3,6962},{0,3,832},{0,39,6962},{44,3,6962},{0,39,6962},{18,0,925},{18,0,925},{18,0,925},{18,0,925},{0,47,0},{0,47,0},{0,47,0},{0,8,0},{0,22,338},{0,22,338},{40,1,63078},{4,1,20586},{32,1,2208},{16,1,1221},{40,1,65535},{2,1,20797},{0,17,616},{0,19,8676},{0,1,49684},{0,37,25424},{14,1,12942},{40,1,4061},{8,1,530},{36,19,1147},{21,2,20642}, +{16,1,8678},{0,3,1157},{0,41,11489},{24,9,20642},{0,41,11489},{20,1,3009},{20,1,3009},{20,1,3009},{34,7,1358},{32,1,4667},{0,7,305},{0,7,305},{0,46,1445},{0,31,6482},{0,14,3034},{8,1,530},{8,1,530},{8,1,530},{22,9,5},{45,0,4418},{0,7,305},{0,7,305},{0,46,1445},{27,8,4418},{0,46,1445},{11,1,5941},{30,1,2260},{42,1,0},{0,33,445},{11,1,5941},{26,1,5941},{0,33,445}, +{0,23,5941},{26,1,5941},{0,23,5941},{34,0,1354},{34,0,1354},{34,0,1354},{34,0,1354},{0,13,0},{0,13,0},{0,13,0},{0,40,1},{0,8,522},{0,8,522},{40,1,63433},{4,1,21145},{32,1,2873},{16,1,1404},{40,1,65535},{2,1,20517},{0,1,339},{0,19,7570},{0,1,49136},{0,37,24652},{30,1,11862},{26,1,3845},{40,1,617},{22,3,868},{44,1,19021},{2,1,7769},{0,33,621},{0,25,9957},{26,9,19021}, +{0,25,9957},{36,1,3819},{36,1,3819},{36,1,3819},{4,37,1809},{2,1,5012},{0,5,185},{0,5,185},{0,31,1285},{0,15,6822},{0,46,3029},{40,1,617},{40,1,617},{40,1,617},{38,23,2},{29,2,4418},{0,5,185},{0,5,185},{0,31,1285},{35,6,4418},{0,31,1285},{41,1,5101},{47,1,1924},{28,1,1},{0,17,221},{41,1,5101},{28,1,5101},{0,17,221},{0,7,5113},{28,1,5101},{0,7,5113},{4,0,1808}, +{4,0,1808},{4,0,1808},{4,0,1808},{0,25,0},{0,25,0},{0,25,0},{0,26,4},{0,24,698},{0,24,698},{26,1,63733},{4,1,21777},{32,1,3641},{16,1,1687},{40,1,65535},{2,1,20303},{0,1,133},{0,3,6539},{0,1,48607},{0,37,23935},{30,1,10886},{42,1,3641},{26,1,724},{8,33,659},{46,3,17485},{2,1,6985},{0,17,257},{0,25,8565},{16,3,17485},{0,25,8565},{6,1,4820},{6,1,4820},{6,1,4820}, +{4,5,2324},{18,1,5437},{0,3,101},{0,3,101},{0,15,1129},{0,45,7234},{0,31,3141},{26,1,724},{26,1,724},{26,1,724},{24,7,4},{43,2,4418},{0,3,101},{0,3,101},{0,15,1129},{21,8,4418},{0,15,1129},{25,1,4325},{15,1,1658},{14,1,4},{0,17,61},{25,1,4325},{14,1,4325},{0,17,61},{0,7,4329},{14,1,4325},{0,7,4329},{4,0,2320},{4,0,2320},{4,0,2320},{4,0,2320},{0,7,0}, +{0,7,0},{0,7,0},{0,28,1},{0,10,872},{0,10,872},{26,1,63992},{4,1,22482},{2,1,4507},{32,1,2059},{40,1,65535},{2,1,20157},{0,1,26},{0,3,5537},{0,1,48100},{0,21,23272},{47,1,9918},{28,1,3518},{42,1,832},{24,33,446},{46,1,16034},{4,1,6314},{0,1,65},{0,39,7293},{26,7,16034},{0,39,7293},{22,1,5900},{22,1,5900},{22,1,5900},{20,19,2888},{34,1,6029},{0,17,40},{0,17,40}, +{0,29,1000},{0,43,7619},{0,15,3261},{42,1,832},{42,1,832},{42,1,832},{40,21,1},{38,1,4418},{0,17,40},{0,17,40},{0,29,1000},{43,28,4418},{0,29,1000},{9,1,3613},{29,1,1345},{47,1,4},{0,1,1},{9,1,3613},{46,1,3613},{0,1,1},{0,37,3613},{46,1,3613},{0,37,3613},{20,0,2888},{20,0,2888},{20,0,2888},{20,0,2888},{0,19,1},{0,19,1},{0,19,1},{0,14,0},{0,12,1082}, +{0,12,1082},{26,1,64289},{20,1,23310},{2,1,5546},{32,1,2553},{40,1,65535},{2,1,20076},{0,1,26},{0,3,4514},{0,1,47560},{0,5,22518},{31,1,9017},{14,1,3261},{28,1,1000},{10,33,281},{17,2,14504},{36,1,5594},{16,1,40},{0,23,5900},{16,1,14504},{0,23,5900},{38,1,7293},{38,1,7293},{38,1,7293},{36,33,3614},{4,1,6900},{0,1,65},{0,1,65},{0,43,832},{0,41,8070},{0,29,3518},{28,1,1000}, +{28,1,1000},{28,1,1000},{26,5,2},{39,0,4418},{16,1,40},{16,1,40},{0,43,832},{9,28,4418},{0,43,832},{23,17,2888},{13,1,1082},{15,1,0},{18,1,1},{23,17,2888},{45,17,2888},{18,1,1},{0,21,2888},{45,17,2888},{0,21,2888},{36,0,3613},{36,0,3613},{36,0,3613},{36,0,3613},{0,1,1},{0,1,1},{0,1,1},{0,46,4},{0,28,1345},{0,28,1345},{26,1,64605},{36,1,24062},{2,1,6574}, +{32,1,3098},{26,1,65535},{2,1,20094},{0,1,133},{0,33,3661},{0,1,47145},{0,5,21893},{45,1,8116},{30,1,3141},{14,1,1129},{42,17,147},{43,7,13235},{38,1,5012},{2,1,101},{0,7,4820},{18,1,13235},{0,7,4820},{24,1,8565},{24,1,8565},{24,1,8565},{6,1,4329},{36,1,7725},{16,1,257},{16,1,257},{0,27,724},{0,25,8530},{0,43,3641},{14,1,1129},{14,1,1129},{14,1,1129},{42,19,2},{23,2,4418}, +{2,1,101},{2,1,101},{0,27,724},{20,9,4418},{0,27,724},{37,3,2312},{11,1,872},{29,1,1},{6,1,0},{37,3,2312},{21,5,2312},{6,1,0},{0,5,2320},{21,5,2312},{0,5,2320},{6,0,4329},{6,0,4329},{6,0,4329},{6,0,4329},{16,1,61},{16,1,61},{16,1,61},{0,15,4},{0,14,1658},{0,14,1658},{26,1,64960},{36,1,24888},{18,1,7643},{32,1,3742},{26,1,65535},{4,1,20161},{0,1,342}, +{0,33,2900},{0,1,46786},{0,5,21347},{29,1,7443},{47,1,3029},{30,1,1285},{12,17,66},{17,6,12051},{24,1,4500},{4,1,185},{0,37,3819},{20,1,12051},{0,37,3819},{24,1,9957},{24,1,9957},{24,1,9957},{22,1,5161},{36,1,8717},{32,1,621},{32,1,621},{0,41,617},{0,39,9026},{0,27,3845},{30,1,1285},{30,1,1285},{30,1,1285},{28,3,4},{37,2,4418},{4,1,185},{4,1,185},{0,41,617},{34,7,4418}, +{0,41,617},{21,3,1800},{25,1,698},{27,1,4},{24,1,0},{21,3,1800},{43,1,1800},{24,1,0},{0,5,1808},{43,1,1800},{0,5,1808},{6,0,5113},{6,0,5113},{6,0,5113},{6,0,5113},{16,1,221},{16,1,221},{16,1,221},{0,29,1},{0,46,1924},{0,46,1924},{26,1,65314},{36,1,25774},{18,1,8796},{32,1,4480},{26,1,65535},{4,1,20229},{16,1,625},{0,33,2238},{0,1,46456},{0,5,20870},{13,1,6795}, +{15,1,3034},{47,1,1445},{44,1,17},{39,11,10952},{40,1,4076},{6,1,305},{0,21,3009},{22,1,10952},{0,21,3009},{40,1,11489},{40,1,11489},{40,1,11489},{38,1,6125},{6,1,9922},{2,1,1157},{2,1,1157},{0,9,530},{0,37,9571},{0,41,4061},{47,1,1445},{47,1,1445},{47,1,1445},{44,17,2},{44,1,4418},{6,1,305},{6,1,305},{0,9,530},{26,9,4418},{0,9,530},{5,3,1352},{9,1,522},{41,1,1}, +{12,1,0},{5,3,1352},{11,1,1352},{12,1,0},{0,35,1354},{11,1,1352},{0,35,1354},{22,0,5941},{22,0,5941},{22,0,5941},{22,0,5941},{32,1,445},{32,1,445},{32,1,445},{0,43,0},{0,31,2260},{0,31,2260},{26,1,65535},{36,1,26766},{18,1,10162},{2,1,5359},{26,1,65359},{4,1,20334},{16,1,1051},{0,33,1610},{0,1,45998},{0,5,20364},{11,1,6173},{45,1,2907},{15,1,1665},{30,1,2},{17,10,9818}, +{42,1,3693},{8,1,442},{0,5,2169},{24,1,9818},{0,5,2169},{26,1,13320},{26,1,13320},{26,1,13320},{8,1,7395},{22,1,11384},{18,1,1997},{18,1,1997},{0,23,410},{0,21,10181},{0,25,4365},{15,1,1665},{15,1,1665},{15,1,1665},{30,1,2},{31,5,4418},{8,1,442},{8,1,442},{0,23,410},{14,9,4418},{0,23,410},{5,1,925},{23,1,338},{9,1,0},{46,1,0},{5,1,925},{9,1,925},{46,1,0}, +{0,19,925},{9,1,925},{0,19,925},{38,0,6962},{38,0,6962},{38,0,6962},{38,0,6962},{2,1,832},{2,1,832},{2,1,832},{0,11,1},{0,15,2645},{0,15,2645},{26,1,65535},{36,1,27616},{18,1,11415},{2,1,6203},{26,1,65014},{4,1,20439},{16,1,1524},{0,17,1111},{0,1,45494},{0,5,19935},{11,1,5581},{13,1,2885},{45,1,1810},{47,1,50},{39,7,8901},{44,1,3373},{40,1,610},{0,35,1522},{26,1,8901}, +{0,35,1522},{26,1,15080},{26,1,15080},{26,1,15080},{24,1,8661},{24,1,12846},{34,1,2905},{34,1,2905},{0,37,320},{0,3,10790},{0,39,4708},{45,1,1810},{45,1,1810},{45,1,1810},{47,1,50},{17,2,4418},{40,1,610},{40,1,610},{0,37,320},{16,1,4418},{0,37,320},{35,1,613},{37,1,232},{23,1,1},{45,1,0},{35,1,613},{23,1,613},{45,1,0},{0,3,617},{23,1,613},{0,3,617},{8,0,7946}, +{8,0,7946},{8,0,7946},{8,0,7946},{18,1,1225},{18,1,1225},{18,1,1225},{0,9,4},{0,45,3033},{0,45,3033},{26,1,65535},{36,1,28505},{34,1,12706},{2,1,7117},{26,1,64677},{4,1,20609},{16,1,2082},{0,17,705},{0,1,45031},{0,5,19583},{41,1,5202},{43,1,2966},{13,1,2020},{31,1,148},{9,3,8069},{30,1,3125},{42,1,820},{0,19,1006},{31,3,8069},{0,19,1006},{42,1,16952},{42,1,16952},{42,1,16952}, +{24,1,10085},{24,1,14318},{4,1,3981},{4,1,3981},{0,21,265},{0,3,11302},{0,37,5081},{13,1,2020},{13,1,2020},{13,1,2020},{31,1,148},{29,3,4418},{42,1,820},{42,1,820},{0,21,265},{43,9,4418},{0,21,265},{19,1,365},{5,1,136},{21,1,4},{11,1,1},{19,1,365},{37,1,365},{11,1,1},{0,3,377},{37,1,365},{0,3,377},{8,0,8986},{8,0,8986},{8,0,8986},{8,0,8986},{18,1,1737}, +{18,1,1737},{18,1,1737},{0,23,1},{0,43,3434},{0,43,3434},{42,1,65535},{36,1,29412},{4,1,13785},{18,1,7875},{26,1,64490},{20,1,20801},{32,1,2593},{16,17,472},{0,1,43813},{0,3,17452},{9,1,4729},{11,1,2925},{11,1,2249},{45,1,281},{37,7,7322},{47,1,2941},{44,1,1037},{0,3,626},{30,1,7322},{0,3,626},{28,1,17819},{28,1,17819},{28,1,17819},{40,1,10777},{40,1,15150},{36,1,4710},{36,1,4710}, +{0,35,221},{0,17,11076},{0,37,4545},{11,1,2249},{11,1,2249},{11,1,2249},{45,1,281},{39,11,4418},{44,1,1037},{44,1,1037},{0,35,185},{22,1,4418},{0,35,185},{3,1,181},{19,1,61},{35,1,1},{39,1,0},{3,1,181},{5,1,181},{39,1,0},{0,33,185},{5,1,181},{0,33,185},{40,0,9256},{40,0,9256},{40,0,9256},{40,0,9256},{34,1,2041},{34,1,2041},{34,1,2041},{16,7,2},{0,41,3188}, +{0,41,3188},{42,1,65535},{38,1,30127},{36,1,14877},{4,1,8601},{42,1,64081},{36,1,20736},{18,1,3192},{2,17,302},{0,1,42247},{0,3,14278},{39,1,4387},{9,1,3051},{11,1,2465},{13,1,490},{23,17,6584},{29,1,2843},{30,1,1325},{0,33,291},{45,17,6584},{0,33,291},{14,1,18273},{14,1,18273},{14,1,18273},{42,1,11259},{26,1,15731},{22,1,5618},{22,1,5618},{32,3,221},{0,1,10637},{0,5,3849},{11,1,2465}, +{11,1,2465},{11,1,2465},{13,1,490},{25,5,4418},{30,1,1325},{30,1,1325},{0,3,136},{10,1,4418},{0,3,136},{1,3,50},{33,1,18},{3,1,0},{5,1,0},{1,3,50},{3,1,50},{5,1,0},{0,17,50},{3,1,50},{0,17,50},{10,0,9256},{10,0,9256},{10,0,9256},{10,0,9256},{36,1,2228},{36,1,2228},{36,1,2228},{2,21,1},{0,9,2738},{0,9,2738},{28,1,65535},{24,1,30766},{6,1,16028}, +{36,1,9391},{28,1,64158},{36,1,21269},{4,1,3821},{18,1,176},{0,1,41339},{0,3,11746},{23,1,4216},{9,1,3083},{9,1,2642},{27,1,776},{3,25,6019},{13,1,2763},{47,1,1613},{0,17,115},{29,1,6019},{0,17,115},{30,1,18737},{30,1,18737},{30,1,18737},{12,1,11820},{42,1,16379},{24,1,6357},{24,1,6357},{18,33,229},{0,1,10589},{0,3,3225},{9,1,2642},{9,1,2642},{9,1,2642},{27,1,776},{9,3,4418}, +{47,1,1613},{47,1,1613},{0,17,90},{31,3,4418},{0,17,90},{1,17,2},{17,1,2},{17,1,1},{17,1,1},{1,17,2},{17,1,2},{17,1,1},{0,1,4},{17,1,2},{0,1,4},{42,0,9250},{42,0,9250},{42,0,9250},{42,0,9250},{6,1,2474},{6,1,2474},{6,1,2474},{18,35,5},{0,37,2405},{0,37,2405},{14,1,65535},{24,1,31241},{22,1,16737},{6,1,10024},{14,1,64173},{38,1,21415},{20,1,4180}, +{4,1,111},{16,1,40689},{0,3,9508},{7,1,3648},{39,1,2723},{39,1,2362},{11,1,725},{37,1,5163},{13,1,2451},{29,1,1450},{0,1,16},{7,19,5163},{0,1,16},{47,1,18185},{47,1,18185},{47,1,18185},{44,1,11714},{28,1,15784},{40,1,6413},{40,1,6413},{34,17,141},{0,1,9881},{0,3,2501},{39,1,2362},{39,1,2362},{39,1,2362},{11,1,725},{37,7,3872},{29,1,1450},{29,1,1450},{0,1,16},{30,1,3872}, +{0,1,16},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{12,0,9256},{12,0,9256},{12,0,9256},{12,0,9256},{38,1,2720},{38,1,2720},{38,1,2720},{4,19,2},{0,21,2041},{0,21,2041},{30,1,65535},{40,1,31563},{8,1,17236},{38,1,10554},{14,1,63701},{24,1,21372},{36,1,4441},{20,1,45},{16,1,40151},{0,33,7454},{21,1,3014}, +{23,1,2261},{39,1,1962},{25,1,629},{21,17,4267},{11,1,2028},{13,1,1186},{32,1,0},{17,21,4267},{32,1,0},{47,1,17289},{47,1,17289},{47,1,17289},{14,1,11436},{14,1,14726},{26,1,6323},{26,1,6323},{20,17,62},{16,1,9032},{0,17,1923},{39,1,1962},{39,1,1962},{39,1,1962},{25,1,629},{19,11,3200},{13,1,1186},{13,1,1186},{32,1,0},{47,1,3200},{32,1,0},{1,1,0},{1,1,0},{1,1,0}, +{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{44,0,9250},{44,0,9250},{44,0,9250},{44,0,9250},{24,1,2897},{24,1,2897},{24,1,2897},{20,3,5},{0,3,1717},{0,3,1717},{30,1,65535},{26,1,31988},{24,1,17745},{8,1,11181},{30,1,63430},{40,1,21435},{22,1,4810},{6,1,5},{2,1,39477},{0,33,5328},{21,1,2339},{7,1,1778},{7,1,1553},{9,1,477},{19,5,3361}, +{25,1,1634},{27,1,953},{20,1,0},{37,3,3361},{20,1,0},{45,1,16354},{45,1,16354},{45,1,16354},{30,1,11202},{30,1,13722},{42,1,6189},{42,1,6189},{6,1,9},{2,1,8249},{0,17,1437},{7,1,1553},{7,1,1553},{7,1,1553},{9,1,477},{23,1,2521},{27,1,953},{27,1,953},{20,1,0},{45,1,2521},{20,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0}, +{0,1,0},{1,1,0},{0,1,0},{14,0,9266},{14,0,9266},{14,0,9266},{14,0,9266},{40,1,3185},{40,1,3185},{40,1,3185},{6,17,0},{0,17,1412},{0,17,1412},{47,1,65535},{42,1,32389},{10,1,18354},{40,1,11850},{30,1,63370},{40,1,21737},{8,1,5159},{22,1,24},{2,1,39380},{0,17,3675},{5,1,1843},{21,1,1394},{37,1,1241},{23,1,370},{5,1,2646},{9,1,1282},{11,1,757},{8,1,1},{9,1,2646}, +{8,1,1},{45,1,15490},{45,1,15490},{45,1,15490},{47,1,10946},{47,1,12914},{42,1,6221},{42,1,6221},{38,1,10},{2,1,7753},{0,1,1225},{37,1,1241},{37,1,1241},{37,1,1241},{23,1,370},{7,1,1985},{11,1,757},{11,1,757},{8,1,1},{13,1,1985},{8,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{46,0,9248}, +{46,0,9248},{46,0,9248},{46,0,9248},{26,1,3400},{26,1,3400},{26,1,3400},{38,1,10},{0,1,1225},{0,1,1225},{47,1,65535},{28,1,33179},{26,1,18917},{10,1,12588},{47,1,62997},{26,1,21996},{24,1,5521},{8,1,36},{4,1,39403},{0,17,2452},{5,1,1411},{21,1,1058},{21,1,914},{7,1,274},{35,1,2017},{23,1,939},{9,1,585},{26,1,0},{1,35,2017},{26,1,0},{29,1,14809},{29,1,14809},{29,1,14809}, +{31,1,10801},{47,1,12162},{14,1,6117},{14,1,6117},{8,1,50},{20,1,7322},{0,1,1241},{21,1,914},{21,1,914},{21,1,914},{7,1,274},{35,5,1513},{9,1,585},{9,1,585},{26,1,0},{27,1,1513},{26,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{47,0,9250},{47,0,9250},{47,0,9250},{47,0,9250},{12,1,3690}, +{12,1,3690},{12,1,3690},{8,1,50},{0,1,1241},{0,1,1241},{45,1,65535},{14,1,33274},{42,1,19608},{42,1,13375},{47,1,62627},{42,1,22211},{10,1,6045},{24,1,138},{36,1,39015},{0,1,1732},{35,1,1048},{5,1,766},{5,1,666},{37,1,212},{3,3,1473},{7,1,675},{23,1,410},{14,1,1},{3,3,1473},{14,1,1},{13,1,14121},{13,1,14121},{13,1,14121},{45,1,10571},{45,1,11434},{30,1,6081},{30,1,6081}, +{40,1,137},{36,1,6926},{2,1,1445},{5,1,666},{5,1,666},{5,1,666},{37,1,212},{35,3,1105},{23,1,410},{23,1,410},{14,1,1},{25,1,1105},{14,1,1},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{1,1,0},{0,1,0},{1,1,0},{0,1,0},{15,0,9256},{15,0,9256},{15,0,9256},{15,0,9256},{14,1,3985},{14,1,3985},{14,1,3985},{40,1,137},{2,1,1445}, +{2,1,1445}, diff --git a/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc b/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc new file mode 100644 index 0000000..da4e7fe --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder_tables_astc_0_255.inc @@ -0,0 +1,481 @@ +{0,16,18},{0,12,1},{0,8,0},{0,7,5},{0,10,35},{0,6,21},{0,6,9},{0,4,24},{1,4,36},{0,4,25},{0,16,18},{0,12,1},{0,8,0},{0,7,5},{5,0,35},{0,6,21},{0,6,9},{0,4,24},{10,0,35},{0,4,24},{0,7,0},{0,7,0},{0,7,0},{0,3,0},{0,4,2},{0,3,0},{0,3,0},{0,1,1},{0,2,2},{0,1,1},{0,7,0}, +{0,7,0},{0,7,0},{0,3,0},{2,0,2},{0,3,0},{0,3,0},{0,1,1},{4,0,2},{0,1,1},{8,0,18},{0,12,1},{0,8,0},{0,7,5},{8,0,18},{16,0,18},{0,7,5},{0,5,18},{16,0,18},{0,5,18},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,34,36},{3,23,19},{4,17,25}, +{3,16,19},{0,34,51},{0,20,18},{0,16,1},{0,13,22},{0,15,68},{0,12,33},{6,28,18},{6,21,0},{6,16,1},{5,15,3},{17,0,51},{1,19,18},{2,15,1},{0,13,22},{34,0,51},{0,13,22},{3,25,18},{3,25,18},{3,25,18},{3,14,18},{0,25,8},{0,16,1},{0,16,1},{0,10,0},{0,12,17},{0,9,5},{6,19,0},{6,19,0},{6,19,0},{6,12,0},{12,0,8}, +{4,13,0},{4,13,0},{0,10,0},{25,0,8},{0,10,0},{20,0,18},{6,21,0},{8,16,0},{0,16,0},{20,0,18},{40,0,18},{0,16,0},{0,13,18},{40,0,18},{0,13,18},{3,0,18},{3,0,18},{3,0,18},{3,0,18},{0,19,0},{0,19,0},{0,19,0},{0,9,0},{0,9,4},{0,9,4},{11,42,36},{11,31,19},{12,24,24},{11,24,19},{8,42,51},{8,28,18},{8,24,1}, +{7,20,22},{0,27,52},{2,21,18},{14,36,18},{14,29,0},{14,24,1},{13,23,3},{29,0,51},{9,27,18},{10,23,1},{0,21,18},{58,0,51},{0,21,18},{11,33,18},{11,33,18},{11,33,18},{11,22,18},{8,33,8},{8,24,1},{8,24,1},{8,18,0},{2,23,8},{4,18,1},{14,26,0},{14,26,0},{14,26,0},{14,20,0},{24,0,8},{11,22,0},{11,22,0},{6,18,0},{49,0,8}, +{6,18,0},{32,0,18},{14,29,0},{15,24,0},{6,24,0},{32,0,18},{64,0,18},{6,24,0},{0,21,18},{64,0,18},{0,21,18},{11,0,18},{11,0,18},{11,0,18},{11,0,18},{8,27,0},{8,27,0},{8,27,0},{8,17,0},{4,19,0},{4,19,0},{19,50,36},{19,39,19},{20,32,24},{19,32,19},{16,50,51},{16,36,18},{16,32,1},{15,28,22},{7,37,51},{10,29,18},{22,43,18}, +{22,36,1},{22,32,1},{21,31,3},{41,0,51},{17,35,18},{18,31,1},{8,29,18},{82,0,51},{8,29,18},{19,41,18},{19,41,18},{19,41,18},{19,30,18},{16,41,8},{16,31,1},{16,31,1},{16,26,0},{10,31,8},{12,26,1},{22,34,0},{22,34,0},{22,34,0},{22,28,0},{36,0,8},{18,30,0},{18,30,0},{14,26,0},{73,0,8},{14,26,0},{43,0,18},{20,38,0},{23,32,0}, +{14,32,0},{43,0,18},{89,0,18},{14,32,0},{0,29,18},{89,0,18},{0,29,18},{19,0,18},{19,0,18},{19,0,18},{19,0,18},{16,35,0},{16,35,0},{16,35,0},{16,25,0},{12,27,0},{12,27,0},{28,59,36},{28,48,19},{29,41,24},{28,41,19},{25,59,51},{25,45,18},{25,41,1},{24,37,22},{16,46,51},{19,38,18},{31,52,18},{31,45,1},{31,41,1},{30,40,3},{54,0,51}, +{24,45,18},{27,40,1},{17,38,18},{110,0,51},{17,38,18},{28,49,18},{28,49,18},{28,49,18},{28,39,18},{25,49,8},{25,40,1},{25,40,1},{25,35,0},{19,40,8},{20,35,1},{31,43,0},{31,43,0},{31,43,0},{31,37,0},{49,0,8},{27,39,0},{27,39,0},{23,35,0},{101,0,8},{23,35,0},{57,0,18},{29,47,0},{32,41,0},{23,41,0},{57,0,18},{116,0,18},{23,41,0}, +{0,38,18},{116,0,18},{0,38,18},{28,0,18},{28,0,18},{28,0,18},{28,0,18},{25,43,0},{25,43,0},{25,43,0},{25,34,0},{19,37,0},{19,37,0},{36,66,36},{36,56,19},{37,49,24},{36,49,19},{33,66,51},{33,53,18},{33,49,1},{32,45,22},{23,54,51},{27,46,18},{39,60,18},{39,53,1},{39,49,1},{38,48,3},{66,0,51},{32,53,18},{35,48,1},{25,46,18},{134,0,51}, +{25,46,18},{36,57,18},{36,57,18},{36,57,18},{36,47,18},{33,57,8},{33,48,1},{33,48,1},{33,43,0},{25,49,8},{28,43,1},{39,51,0},{39,51,0},{39,51,0},{39,45,0},{61,0,8},{35,47,0},{35,47,0},{31,43,0},{125,0,8},{31,43,0},{69,0,18},{37,55,0},{40,49,0},{31,49,0},{69,0,18},{140,0,18},{31,49,0},{0,46,18},{140,0,18},{0,46,18},{36,0,18}, +{36,0,18},{36,0,18},{36,0,18},{33,51,0},{33,51,0},{33,51,0},{33,42,0},{27,45,0},{27,45,0},{44,74,36},{44,64,19},{45,57,24},{44,57,19},{41,74,51},{41,61,18},{41,57,1},{40,53,22},{31,62,51},{35,54,18},{47,68,18},{47,61,1},{47,57,1},{46,56,3},{78,0,51},{40,61,18},{43,56,1},{33,54,18},{158,0,51},{33,54,18},{44,65,18},{44,65,18},{44,65,18}, +{44,55,18},{41,65,8},{41,56,1},{41,56,1},{41,51,0},{33,57,8},{36,51,1},{47,59,0},{47,59,0},{47,59,0},{47,53,0},{73,0,8},{43,55,0},{43,55,0},{39,51,0},{149,0,8},{39,51,0},{81,0,18},{45,63,0},{48,57,0},{39,57,0},{81,0,18},{164,0,18},{39,57,0},{0,54,18},{164,0,18},{0,54,18},{44,0,18},{44,0,18},{44,0,18},{44,0,18},{41,59,0}, +{41,59,0},{41,59,0},{41,50,0},{35,53,0},{35,53,0},{52,82,36},{52,71,19},{53,65,24},{52,65,19},{49,82,51},{49,68,18},{49,65,1},{48,61,22},{39,70,51},{43,62,18},{55,76,18},{55,69,1},{55,65,1},{54,64,3},{89,0,51},{49,68,18},{51,64,1},{41,62,18},{183,0,51},{41,62,18},{52,73,18},{52,73,18},{52,73,18},{52,63,18},{49,73,8},{49,64,1},{49,64,1}, +{49,59,0},{42,64,8},{44,59,1},{55,67,0},{55,67,0},{55,67,0},{55,61,0},{85,0,8},{51,63,0},{51,63,0},{47,59,0},{174,0,8},{47,59,0},{92,0,18},{54,70,0},{56,65,0},{47,65,0},{92,0,18},{189,0,18},{47,65,0},{0,62,18},{189,0,18},{0,62,18},{52,0,18},{52,0,18},{52,0,18},{52,0,18},{49,67,0},{49,67,0},{49,67,0},{49,58,0},{43,61,0}, +{43,61,0},{61,91,36},{61,80,19},{62,74,24},{61,73,20},{58,91,51},{58,77,18},{58,73,2},{57,70,22},{48,79,51},{50,71,19},{64,85,18},{64,77,1},{64,74,1},{63,73,3},{103,0,51},{58,77,18},{59,74,1},{49,71,18},{210,0,51},{49,71,18},{61,82,18},{61,82,18},{61,82,18},{61,72,18},{58,82,8},{58,73,1},{58,73,1},{58,68,0},{51,73,8},{53,68,1},{64,76,0}, +{64,76,0},{64,76,0},{64,70,0},{98,0,8},{60,72,0},{60,72,0},{56,68,0},{201,0,8},{56,68,0},{106,0,18},{63,79,0},{65,74,0},{55,74,0},{106,0,18},{216,0,18},{55,74,0},{0,71,18},{216,0,18},{0,71,18},{61,0,18},{61,0,18},{61,0,18},{61,0,18},{58,76,0},{58,76,0},{58,76,0},{58,67,0},{53,69,0},{53,69,0},{69,99,36},{69,88,19},{70,82,24}, +{69,81,20},{66,99,51},{66,85,18},{66,81,2},{65,79,23},{56,87,51},{58,79,19},{72,93,18},{72,85,1},{72,82,1},{72,80,5},{115,0,51},{66,85,18},{67,82,1},{57,79,18},{234,0,51},{57,79,18},{69,90,18},{69,90,18},{69,90,18},{69,79,18},{66,90,8},{66,81,1},{66,81,1},{66,75,1},{59,81,8},{61,76,1},{72,84,0},{72,84,0},{72,84,0},{72,78,0},{110,0,8}, +{69,79,0},{69,79,0},{63,76,0},{225,0,8},{63,76,0},{118,0,18},{71,87,0},{73,82,0},{63,82,0},{118,0,18},{240,0,18},{63,82,0},{0,79,18},{240,0,18},{0,79,18},{69,0,18},{69,0,18},{69,0,18},{69,0,18},{66,84,0},{66,84,0},{66,84,0},{66,75,0},{61,77,0},{61,77,0},{77,107,36},{77,96,19},{78,90,24},{77,89,20},{74,107,51},{74,93,18},{74,89,2}, +{73,87,23},{64,95,51},{66,87,19},{80,101,18},{80,93,1},{80,90,1},{80,88,5},{127,0,51},{74,93,18},{75,90,1},{65,87,18},{254,2,51},{65,87,18},{77,98,18},{77,98,18},{77,98,18},{77,87,18},{74,98,8},{74,89,1},{74,89,1},{74,83,1},{67,89,8},{69,84,1},{80,92,0},{80,92,0},{80,92,0},{80,86,0},{122,0,8},{77,87,0},{77,87,0},{71,84,0},{249,0,8}, +{71,84,0},{129,0,18},{79,95,0},{81,90,0},{71,90,0},{129,0,18},{254,5,18},{71,90,0},{0,87,18},{254,5,18},{0,87,18},{77,0,18},{77,0,18},{77,0,18},{77,0,18},{74,92,0},{74,92,0},{74,92,0},{74,83,0},{69,85,0},{69,85,0},{85,115,36},{85,104,19},{86,98,24},{85,97,20},{82,115,51},{82,101,18},{82,97,2},{81,95,23},{72,103,51},{74,95,19},{88,109,18}, +{88,101,1},{88,98,1},{88,96,5},{138,0,51},{82,101,18},{83,98,1},{73,95,18},{254,14,51},{73,95,18},{85,106,18},{85,106,18},{85,106,18},{85,95,18},{82,106,8},{82,97,1},{82,97,1},{82,91,1},{75,97,8},{77,92,1},{88,100,0},{88,100,0},{88,100,0},{88,94,0},{134,0,8},{85,95,0},{85,95,0},{79,92,0},{255,9,8},{79,92,0},{141,0,18},{87,103,0},{89,98,0}, +{79,98,0},{141,0,18},{254,17,18},{79,98,0},{0,95,18},{254,17,18},{0,95,18},{85,0,18},{85,0,18},{85,0,18},{85,0,18},{82,100,0},{82,100,0},{82,100,0},{82,91,0},{77,93,0},{77,93,0},{94,124,36},{94,113,19},{95,107,24},{94,106,20},{91,124,51},{91,110,18},{91,106,2},{90,104,23},{81,112,51},{83,104,19},{97,118,18},{97,110,1},{97,107,1},{97,105,5},{152,0,51}, +{91,110,18},{92,107,1},{82,104,18},{255,27,51},{82,104,18},{94,115,18},{94,115,18},{94,115,18},{94,104,18},{91,115,8},{91,106,1},{91,106,1},{91,100,1},{84,106,8},{86,101,1},{97,108,0},{97,108,0},{97,108,0},{97,103,0},{147,0,8},{94,104,0},{94,104,0},{88,101,0},{254,23,8},{88,101,0},{155,0,18},{96,112,0},{98,107,0},{88,107,0},{155,0,18},{255,30,18},{88,107,0}, +{0,104,18},{255,30,18},{0,104,18},{94,0,18},{94,0,18},{94,0,18},{94,0,18},{91,109,0},{91,109,0},{91,109,0},{91,100,0},{86,102,0},{86,102,0},{102,132,36},{102,121,19},{102,116,23},{102,114,20},{99,132,51},{99,118,18},{99,114,2},{98,112,23},{89,120,51},{91,112,19},{105,125,18},{105,118,1},{105,115,1},{105,113,5},{164,0,51},{99,118,18},{100,114,1},{90,112,18},{255,39,51}, +{90,112,18},{102,123,18},{102,123,18},{102,123,18},{102,112,18},{99,123,8},{99,114,1},{99,114,1},{99,108,1},{92,114,8},{94,109,1},{105,116,0},{105,116,0},{105,116,0},{105,111,0},{159,0,8},{102,112,0},{102,112,0},{96,109,0},{254,35,8},{96,109,0},{167,0,18},{104,120,0},{106,115,0},{96,115,0},{167,0,18},{254,42,18},{96,115,0},{0,112,18},{254,42,18},{0,112,18},{102,0,18}, +{102,0,18},{102,0,18},{102,0,18},{99,117,0},{99,117,0},{99,117,0},{99,108,0},{94,110,0},{94,110,0},{110,140,36},{110,130,18},{110,124,23},{110,122,20},{107,140,51},{107,126,18},{107,122,2},{106,120,23},{97,128,51},{99,120,19},{113,133,18},{113,126,1},{113,123,1},{113,121,5},{175,0,51},{107,126,18},{108,122,1},{98,120,18},{254,51,51},{98,120,18},{110,130,18},{110,130,18},{110,130,18}, +{110,120,18},{107,131,8},{107,122,1},{107,122,1},{107,116,1},{100,122,8},{102,117,1},{113,124,0},{113,124,0},{113,124,0},{113,119,0},{171,0,8},{110,120,0},{110,120,0},{104,117,0},{255,46,8},{104,117,0},{178,0,18},{112,128,0},{114,123,0},{104,123,0},{178,0,18},{254,54,18},{104,123,0},{0,120,18},{254,54,18},{0,120,18},{110,0,18},{110,0,18},{110,0,18},{110,0,18},{107,124,0}, +{107,124,0},{107,124,0},{107,116,0},{102,118,0},{102,118,0},{118,147,36},{118,138,18},{118,132,23},{118,130,20},{115,148,51},{115,134,18},{115,130,2},{114,128,23},{105,136,51},{108,128,18},{121,141,18},{121,134,1},{121,131,1},{121,129,5},{187,0,51},{115,134,18},{116,130,1},{106,128,18},{254,63,51},{106,128,18},{118,138,18},{118,138,18},{118,138,18},{118,128,18},{115,138,8},{115,130,1},{115,130,1}, +{115,124,1},{108,130,8},{110,125,1},{121,132,0},{121,132,0},{121,132,0},{121,127,0},{183,0,8},{118,128,0},{118,128,0},{112,125,0},{255,58,8},{112,125,0},{190,0,18},{120,136,0},{122,131,0},{112,131,0},{190,0,18},{254,66,18},{112,131,0},{0,128,18},{254,66,18},{0,128,18},{118,0,18},{118,0,18},{118,0,18},{118,0,18},{115,132,0},{115,132,0},{115,132,0},{115,124,0},{110,126,0}, +{110,126,0},{127,156,36},{127,147,18},{127,141,23},{127,139,20},{124,156,51},{124,143,18},{124,139,2},{123,137,23},{114,145,51},{117,137,18},{130,150,18},{130,143,1},{130,140,1},{130,138,5},{201,0,51},{124,143,18},{125,139,1},{115,137,18},{255,76,51},{115,137,18},{127,147,18},{127,147,18},{127,147,18},{127,137,18},{124,147,8},{124,139,1},{124,139,1},{124,133,1},{117,139,8},{119,134,1},{130,141,0}, +{130,141,0},{130,141,0},{130,136,0},{196,0,8},{127,137,0},{127,137,0},{121,134,0},{254,72,8},{121,134,0},{204,0,18},{129,145,0},{131,140,0},{121,140,0},{204,0,18},{255,79,18},{121,140,0},{0,137,18},{255,79,18},{0,137,18},{127,0,18},{127,0,18},{127,0,18},{127,0,18},{124,141,0},{124,141,0},{124,141,0},{124,133,0},{119,135,0},{119,135,0},{135,164,36},{135,154,19},{135,149,23}, +{135,147,20},{132,164,51},{132,151,18},{132,147,2},{131,145,23},{121,153,51},{125,145,18},{138,158,18},{138,151,1},{138,148,1},{138,146,5},{213,0,51},{131,151,18},{133,147,1},{123,145,18},{254,88,51},{123,145,18},{135,155,18},{135,155,18},{135,155,18},{135,145,18},{132,155,8},{132,147,1},{132,147,1},{132,141,1},{125,147,8},{127,142,1},{138,149,0},{138,149,0},{138,149,0},{138,144,0},{208,0,8}, +{135,145,0},{135,145,0},{129,142,0},{254,84,8},{129,142,0},{215,0,18},{137,153,0},{139,148,0},{129,148,0},{215,0,18},{254,91,18},{129,148,0},{0,145,18},{254,91,18},{0,145,18},{135,0,18},{135,0,18},{135,0,18},{135,0,18},{132,149,0},{132,149,0},{132,149,0},{132,141,0},{127,143,0},{127,143,0},{143,172,36},{143,162,19},{143,157,23},{143,155,20},{140,172,51},{140,159,18},{140,155,2}, +{139,153,23},{129,161,51},{132,153,19},{146,166,18},{146,159,1},{146,156,1},{146,154,5},{224,0,51},{139,159,18},{141,155,1},{130,153,18},{254,100,51},{130,153,18},{143,163,18},{143,163,18},{143,163,18},{143,153,18},{140,163,8},{140,155,1},{140,155,1},{140,149,1},{132,155,8},{135,150,1},{146,157,0},{146,157,0},{146,157,0},{146,152,0},{220,0,8},{143,153,0},{143,153,0},{137,150,0},{255,95,8}, +{137,150,0},{227,0,18},{144,161,0},{147,156,0},{136,156,0},{227,0,18},{254,103,18},{136,156,0},{0,153,18},{254,103,18},{0,153,18},{143,0,18},{143,0,18},{143,0,18},{143,0,18},{140,157,0},{140,157,0},{140,157,0},{140,149,0},{135,151,0},{135,151,0},{151,180,36},{151,170,19},{151,165,23},{151,163,20},{148,180,51},{148,167,18},{148,163,2},{148,160,24},{137,169,51},{140,161,19},{154,174,18}, +{154,167,1},{154,164,1},{154,162,5},{236,0,51},{147,167,18},{149,164,1},{138,161,18},{254,112,51},{138,161,18},{151,171,18},{151,171,18},{151,171,18},{151,161,18},{148,171,8},{148,162,1},{148,162,1},{148,157,1},{140,163,8},{143,158,1},{154,165,0},{154,165,0},{154,165,0},{154,160,0},{232,0,8},{150,161,0},{150,161,0},{144,158,0},{255,107,8},{144,158,0},{239,0,18},{152,169,0},{155,164,0}, +{144,164,0},{239,0,18},{254,115,18},{144,164,0},{0,161,18},{254,115,18},{0,161,18},{151,0,18},{151,0,18},{151,0,18},{151,0,18},{148,165,0},{148,165,0},{148,165,0},{148,157,0},{142,159,0},{142,159,0},{160,189,36},{160,179,19},{160,174,23},{160,172,20},{157,189,51},{157,176,18},{157,172,2},{157,169,24},{146,178,51},{149,170,19},{163,183,18},{163,176,1},{163,173,1},{163,172,5},{250,0,51}, +{156,176,18},{158,173,1},{147,170,18},{255,125,51},{147,170,18},{160,180,18},{160,180,18},{160,180,18},{160,170,18},{157,180,8},{157,171,1},{157,171,1},{157,166,1},{149,172,8},{152,167,1},{163,174,0},{163,174,0},{163,174,0},{163,168,0},{245,0,8},{159,170,0},{159,170,0},{153,167,0},{254,121,8},{153,167,0},{253,0,18},{161,178,0},{164,173,0},{153,173,0},{253,0,18},{254,128,18},{153,173,0}, +{0,170,18},{254,128,18},{0,170,18},{160,0,18},{160,0,18},{160,0,18},{160,0,18},{157,174,0},{157,174,0},{157,174,0},{157,165,0},{151,168,0},{151,168,0},{168,197,36},{168,187,19},{168,182,23},{168,180,20},{165,197,51},{165,184,18},{165,180,2},{165,177,24},{154,186,51},{157,178,19},{171,191,18},{171,184,1},{171,181,1},{171,180,5},{255,13,51},{164,184,18},{166,181,1},{155,178,18},{254,137,51}, +{155,178,18},{168,188,18},{168,188,18},{168,188,18},{168,178,18},{165,188,8},{165,179,1},{165,179,1},{165,174,1},{157,180,8},{160,175,1},{171,182,0},{171,182,0},{171,182,0},{171,176,0},{255,4,8},{167,178,0},{167,178,0},{161,175,0},{255,132,8},{161,175,0},{255,19,18},{169,186,0},{172,181,0},{161,181,0},{255,19,18},{254,140,18},{161,181,0},{0,178,18},{254,140,18},{0,178,18},{168,0,18}, +{168,0,18},{168,0,18},{168,0,18},{165,182,0},{165,182,0},{165,182,0},{165,173,0},{159,176,0},{159,176,0},{176,205,36},{176,195,19},{176,190,23},{176,188,20},{173,205,51},{173,192,18},{173,188,2},{173,185,24},{162,194,51},{165,186,19},{179,199,18},{179,192,1},{179,189,1},{179,188,5},{255,37,51},{172,192,18},{174,189,1},{163,186,18},{254,149,51},{163,186,18},{176,196,18},{176,196,18},{176,196,18}, +{176,186,18},{173,196,8},{173,187,1},{173,187,1},{173,182,1},{165,188,8},{168,183,1},{179,190,0},{179,190,0},{179,190,0},{179,184,0},{255,28,8},{175,186,0},{175,186,0},{169,183,0},{255,144,8},{169,183,0},{255,43,18},{177,194,0},{180,189,0},{169,189,0},{255,43,18},{254,152,18},{169,189,0},{0,186,18},{254,152,18},{0,186,18},{176,0,18},{176,0,18},{176,0,18},{176,0,18},{173,190,0}, +{173,190,0},{173,190,0},{173,181,0},{167,184,0},{167,184,0},{184,213,36},{184,203,19},{184,197,22},{184,196,20},{181,213,51},{181,200,18},{181,196,2},{181,193,24},{170,202,51},{173,194,19},{187,207,18},{187,201,1},{187,197,0},{187,196,5},{255,61,51},{180,200,18},{182,197,1},{171,194,18},{254,161,51},{171,194,18},{184,204,18},{184,204,18},{184,204,18},{184,194,18},{181,204,8},{181,195,1},{181,195,1}, +{181,190,1},{173,196,8},{176,191,1},{187,197,0},{187,197,0},{187,197,0},{187,192,0},{255,52,8},{183,194,0},{183,194,0},{177,191,0},{255,156,8},{177,191,0},{255,67,18},{185,202,0},{187,197,0},{177,197,0},{255,67,18},{254,164,18},{177,197,0},{0,194,18},{254,164,18},{0,194,18},{184,0,18},{184,0,18},{184,0,18},{184,0,18},{181,198,0},{181,198,0},{181,198,0},{181,189,0},{175,192,0}, +{175,192,0},{193,222,36},{193,212,18},{193,206,22},{193,205,20},{190,222,51},{189,209,19},{190,206,1},{190,202,24},{179,211,51},{182,203,19},{196,215,18},{196,210,1},{196,206,0},{196,205,5},{255,89,51},{189,209,18},{190,206,1},{180,203,18},{254,174,51},{180,203,18},{193,212,18},{193,212,18},{193,212,18},{193,203,18},{190,213,8},{190,204,1},{190,204,1},{190,199,1},{182,205,8},{185,200,1},{196,206,0}, +{196,206,0},{196,206,0},{196,201,0},{255,79,8},{192,203,0},{192,203,0},{186,200,0},{253,170,8},{186,200,0},{255,95,18},{194,211,0},{196,206,0},{186,206,0},{255,95,18},{254,177,18},{186,206,0},{0,203,18},{254,177,18},{0,203,18},{193,0,18},{193,0,18},{193,0,18},{193,0,18},{190,206,0},{190,206,0},{190,206,0},{190,198,0},{184,201,0},{184,201,0},{201,229,36},{201,220,18},{201,214,22}, +{201,213,20},{198,230,51},{197,217,19},{198,214,1},{198,210,24},{187,219,51},{190,211,19},{204,223,18},{204,218,1},{204,214,0},{204,213,5},{255,113,51},{197,217,18},{198,214,1},{188,211,18},{254,186,51},{188,211,18},{201,220,18},{201,220,18},{201,220,18},{201,211,18},{198,220,8},{198,212,1},{198,212,1},{198,207,1},{190,213,8},{192,208,1},{204,214,0},{204,214,0},{204,214,0},{204,209,0},{255,104,8}, +{200,211,0},{200,211,0},{194,208,0},{255,181,8},{194,208,0},{255,119,18},{202,219,0},{204,214,0},{194,214,0},{255,119,18},{254,189,18},{194,214,0},{0,211,18},{254,189,18},{0,211,18},{201,0,18},{201,0,18},{201,0,18},{201,0,18},{198,214,0},{198,214,0},{198,214,0},{198,206,0},{192,209,0},{192,209,0},{209,237,36},{209,228,18},{209,222,22},{209,221,20},{206,237,51},{205,225,19},{206,222,1}, +{206,218,24},{196,226,51},{197,219,19},{212,231,18},{212,226,1},{212,222,0},{212,221,5},{255,137,51},{205,225,18},{206,222,1},{196,219,18},{254,198,51},{196,219,18},{209,228,18},{209,228,18},{209,228,18},{209,219,18},{206,228,8},{206,220,1},{206,220,1},{206,215,1},{198,221,8},{200,216,1},{212,222,0},{212,222,0},{212,222,0},{212,217,0},{255,128,8},{208,219,0},{208,219,0},{202,216,0},{255,193,8}, +{202,216,0},{255,143,18},{210,227,0},{212,222,0},{202,222,0},{255,143,18},{254,201,18},{202,222,0},{0,219,18},{254,201,18},{0,219,18},{209,0,18},{209,0,18},{209,0,18},{209,0,18},{206,222,0},{206,222,0},{206,222,0},{206,214,0},{200,217,0},{200,217,0},{217,245,36},{217,236,18},{217,230,22},{217,229,20},{214,245,51},{213,233,19},{214,230,1},{214,226,24},{204,234,51},{205,227,19},{220,239,18}, +{220,234,1},{220,230,0},{220,229,5},{255,161,51},{213,233,18},{214,230,1},{204,227,18},{254,210,51},{204,227,18},{217,236,18},{217,236,18},{217,236,18},{217,227,18},{214,236,8},{214,228,1},{214,228,1},{214,223,1},{206,229,8},{208,224,1},{220,230,0},{220,230,0},{220,230,0},{220,225,0},{255,152,8},{216,227,0},{216,227,0},{210,224,0},{255,205,8},{210,224,0},{255,167,18},{218,235,0},{220,230,0}, +{210,230,0},{255,167,18},{253,213,18},{210,230,0},{0,227,18},{253,213,18},{0,227,18},{217,0,18},{217,0,18},{217,0,18},{217,0,18},{214,230,0},{214,230,0},{214,230,0},{214,222,0},{208,225,0},{208,225,0},{226,254,36},{226,245,18},{226,239,22},{226,238,20},{223,254,51},{223,241,18},{223,239,1},{223,235,24},{213,243,51},{214,236,19},{229,248,18},{228,243,1},{229,239,0},{229,238,5},{255,189,51}, +{223,241,18},{223,239,1},{212,236,18},{254,223,51},{212,236,18},{226,245,18},{226,245,18},{226,245,18},{226,236,18},{223,245,8},{223,237,1},{223,237,1},{223,232,1},{216,237,8},{217,233,1},{229,239,0},{229,239,0},{229,239,0},{229,234,0},{255,180,8},{225,236,0},{225,236,0},{219,233,0},{255,218,8},{219,233,0},{255,195,18},{228,243,0},{229,239,0},{218,239,0},{255,195,18},{254,226,18},{218,239,0}, +{0,236,18},{254,226,18},{0,236,18},{226,0,18},{226,0,18},{226,0,18},{226,0,18},{223,239,0},{223,239,0},{223,239,0},{223,231,0},{217,234,0},{217,234,0},{235,254,46},{234,253,18},{234,247,22},{233,246,22},{233,255,56},{231,249,18},{231,247,1},{231,243,24},{221,251,51},{222,244,19},{238,254,19},{237,249,1},{237,247,0},{237,246,5},{255,213,51},{231,249,18},{231,247,1},{220,244,18},{254,235,51}, +{220,244,18},{234,253,18},{234,253,18},{234,253,18},{234,244,18},{231,253,8},{231,245,1},{231,245,1},{231,240,1},{224,245,8},{226,241,0},{237,247,0},{237,247,0},{237,247,0},{237,242,0},{255,204,8},{233,244,0},{233,244,0},{226,241,0},{255,230,8},{226,241,0},{255,219,18},{236,251,0},{237,247,0},{226,247,0},{255,219,18},{254,238,18},{226,247,0},{0,244,18},{254,238,18},{0,244,18},{234,0,18}, +{234,0,18},{234,0,18},{234,0,18},{231,247,0},{231,247,0},{231,247,0},{231,239,0},{226,241,0},{226,241,0},{245,255,72},{243,255,33},{242,255,22},{241,254,22},{242,255,81},{240,255,21},{239,255,1},{238,251,25},{234,255,56},{230,252,19},{248,255,29},{246,255,5},{245,255,0},{244,254,6},{255,237,51},{240,255,20},{239,255,1},{228,252,18},{254,247,51},{228,252,18},{242,255,22},{242,255,22},{242,255,22}, +{242,251,18},{241,254,14},{239,253,1},{239,253,1},{239,249,1},{232,253,8},{234,249,0},{245,255,0},{245,255,0},{245,255,0},{245,250,0},{255,228,8},{242,251,0},{242,251,0},{234,249,0},{255,242,8},{234,249,0},{255,243,18},{246,255,4},{245,255,0},{234,255,0},{255,243,18},{254,250,18},{234,255,0},{0,252,18},{254,250,18},{0,252,18},{242,0,18},{242,0,18},{242,0,18},{242,0,18},{239,255,0}, +{239,255,0},{239,255,0},{239,247,0},{234,249,0},{234,249,0},{251,255,28},{251,255,25},{251,255,24},{250,255,19},{251,255,24},{249,255,10},{248,255,9},{247,255,0},{246,255,12},{243,255,1},{254,255,1},{253,255,1},{253,255,1},{253,255,0},{255,249,3},{252,255,0},{252,255,0},{246,255,0},{254,253,3},{246,255,0},{251,255,24},{251,255,24},{251,255,24},{250,255,19},{250,254,19},{248,255,9},{248,255,9}, +{247,255,0},{246,255,8},{243,255,1},{253,254,1},{253,254,1},{253,254,1},{253,255,0},{255,249,2},{252,255,0},{252,255,0},{246,255,0},{254,253,2},{246,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{250,0,18},{250,0,18},{250,0,18},{250,0,18},{248,255,5},{248,255,5},{248,255,5},{247,255,0},{243,255,1}, +{243,255,1},{0,34,72},{0,24,5},{0,17,0},{0,13,25},{0,22,153},{0,15,90},{0,13,41},{0,10,110},{0,9,162},{0,8,119},{0,34,72},{0,24,5},{0,17,0},{0,13,25},{11,0,153},{0,15,90},{0,13,41},{0,10,110},{22,0,153},{0,10,110},{0,16,0},{0,16,0},{0,16,0},{0,8,0},{0,7,13},{0,6,2},{0,6,2},{0,4,5},{0,3,13},{0,4,6},{0,16,0}, +{0,16,0},{0,16,0},{0,8,0},{3,0,13},{0,6,2},{0,6,2},{0,4,5},{7,0,13},{0,4,5},{17,0,72},{0,24,5},{0,17,0},{0,13,25},{17,0,72},{34,0,72},{0,13,25},{0,11,72},{34,0,72},{0,11,72},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,54,77},{2,37,5},{3,25,18}, +{1,23,13},{0,43,243},{0,27,99},{0,23,24},{0,16,139},{0,18,276},{0,16,164},{3,52,72},{3,36,0},{4,26,6},{2,24,11},{21,0,243},{0,27,99},{0,23,24},{0,16,139},{43,0,243},{0,16,139},{2,36,5},{2,36,5},{2,36,5},{1,19,5},{0,25,50},{0,18,5},{0,18,5},{0,10,18},{0,12,59},{0,10,27},{3,34,0},{3,34,0},{3,34,0},{3,18,0},{12,0,50}, +{0,18,5},{0,18,5},{0,10,18},{25,0,50},{0,10,18},{29,0,72},{3,36,0},{8,25,0},{0,23,8},{29,0,72},{58,0,72},{0,23,8},{0,19,72},{58,0,72},{0,19,72},{1,0,5},{1,0,5},{1,0,5},{1,0,5},{0,10,0},{0,10,0},{0,10,0},{0,5,0},{0,3,1},{0,3,1},{6,70,133},{6,46,65},{7,35,94},{5,33,65},{0,67,243},{0,39,75},{0,32,2}, +{0,25,105},{0,30,332},{0,24,164},{11,60,72},{11,44,0},{12,34,6},{10,32,11},{33,0,243},{0,39,75},{1,32,1},{0,25,105},{67,0,243},{0,25,105},{6,52,61},{6,52,61},{6,52,61},{5,29,61},{0,49,50},{0,32,1},{0,32,1},{0,19,5},{0,21,94},{0,18,35},{11,42,0},{11,42,0},{11,42,0},{11,26,0},{24,0,50},{3,30,0},{3,30,0},{0,19,5},{49,0,50}, +{0,19,5},{41,0,72},{11,44,0},{16,33,0},{0,32,1},{41,0,72},{82,0,72},{0,32,1},{0,27,72},{82,0,72},{0,27,72},{5,0,61},{5,0,61},{5,0,61},{5,0,61},{0,34,0},{0,34,0},{0,34,0},{0,17,0},{0,15,17},{0,15,17},{13,80,144},{13,56,77},{15,43,109},{12,40,76},{7,77,243},{7,49,73},{7,41,1},{5,33,100},{0,42,287},{0,33,98},{19,68,72}, +{19,52,0},{20,42,6},{18,40,11},{45,0,243},{4,50,72},{9,40,1},{0,34,83},{92,0,243},{0,34,83},{13,62,72},{13,62,72},{13,62,72},{13,37,72},{7,59,50},{7,41,1},{7,41,1},{6,28,3},{0,36,66},{0,29,4},{19,50,0},{19,50,0},{19,50,0},{19,34,0},{36,0,50},{11,38,0},{11,38,0},{0,29,0},{73,0,50},{0,29,0},{52,0,72},{18,52,0},{23,41,0}, +{5,41,0},{52,0,72},{107,0,72},{5,41,0},{0,35,72},{107,0,72},{0,35,72},{13,0,72},{13,0,72},{13,0,72},{13,0,72},{7,44,0},{7,44,0},{7,44,0},{7,25,0},{0,27,2},{0,27,2},{22,89,144},{22,65,77},{24,52,109},{21,49,76},{16,86,243},{16,58,73},{16,50,1},{14,42,100},{0,57,248},{3,43,75},{28,77,72},{28,61,0},{29,50,5},{27,49,11},{58,0,243}, +{13,59,72},{18,49,1},{0,44,73},{119,0,243},{0,44,73},{22,71,72},{22,71,72},{22,71,72},{22,46,72},{16,68,50},{16,50,1},{16,50,1},{15,37,3},{0,49,50},{6,38,1},{28,59,0},{28,59,0},{28,59,0},{28,43,0},{49,0,50},{20,47,0},{20,47,0},{8,38,0},{101,0,50},{8,38,0},{66,0,72},{27,61,0},{32,50,0},{13,50,0},{66,0,72},{134,0,72},{13,50,0}, +{0,44,72},{134,0,72},{0,44,72},{22,0,72},{22,0,72},{22,0,72},{22,0,72},{16,53,0},{16,53,0},{16,53,0},{16,34,0},{6,39,0},{6,39,0},{30,97,144},{30,73,77},{32,59,106},{30,56,77},{24,94,243},{24,66,73},{24,58,2},{22,50,100},{2,69,243},{10,51,76},{36,85,72},{36,67,1},{37,58,5},{35,57,11},{70,0,243},{21,67,72},{26,58,1},{3,52,72},{143,0,243}, +{3,52,72},{30,79,72},{30,79,72},{30,79,72},{30,54,72},{24,76,50},{25,56,2},{25,56,2},{23,45,3},{8,57,50},{14,46,1},{36,66,0},{36,66,0},{36,66,0},{36,51,0},{61,0,50},{27,56,0},{27,56,0},{16,46,0},{125,0,50},{16,46,0},{78,0,72},{35,69,0},{40,58,0},{21,58,0},{78,0,72},{158,0,72},{21,58,0},{0,52,72},{158,0,72},{0,52,72},{30,0,72}, +{30,0,72},{30,0,72},{30,0,72},{24,61,0},{24,61,0},{24,61,0},{24,42,0},{14,47,0},{14,47,0},{38,105,144},{38,81,77},{40,67,106},{38,64,77},{32,102,243},{32,74,73},{32,66,2},{30,59,103},{10,77,243},{18,59,76},{44,93,72},{44,75,1},{45,66,5},{44,63,13},{82,0,243},{29,75,72},{33,66,1},{11,60,72},{167,0,243},{11,60,72},{38,87,72},{38,87,72},{38,87,72}, +{38,62,72},{32,84,50},{33,64,2},{33,64,2},{31,53,3},{16,65,50},{22,54,1},{44,74,0},{44,74,0},{44,74,0},{44,59,0},{73,0,50},{35,63,0},{35,63,0},{23,54,0},{149,0,50},{23,54,0},{89,0,72},{43,77,0},{48,66,0},{29,66,0},{89,0,72},{183,0,72},{29,66,0},{0,60,72},{183,0,72},{0,60,72},{38,0,72},{38,0,72},{38,0,72},{38,0,72},{32,69,0}, +{32,69,0},{32,69,0},{32,50,0},{21,55,0},{21,55,0},{46,113,144},{46,88,76},{48,75,106},{46,72,77},{40,110,243},{40,82,73},{40,73,2},{38,67,103},{18,85,243},{26,67,76},{52,100,72},{52,83,1},{53,74,5},{52,72,13},{94,0,243},{37,83,72},{41,74,1},{19,68,72},{192,0,243},{19,68,72},{46,95,72},{46,95,72},{46,95,72},{46,70,72},{40,92,50},{40,73,1},{40,73,1}, +{39,61,3},{24,73,50},{30,62,1},{52,82,0},{52,82,0},{52,82,0},{52,67,0},{85,0,50},{43,71,0},{43,71,0},{31,62,0},{174,0,50},{31,62,0},{101,0,72},{51,85,0},{56,74,0},{37,74,0},{101,0,72},{207,0,72},{37,74,0},{0,68,72},{207,0,72},{0,68,72},{46,0,72},{46,0,72},{46,0,72},{46,0,72},{40,76,0},{40,76,0},{40,76,0},{40,58,0},{29,63,0}, +{29,63,0},{55,122,144},{55,97,76},{57,84,106},{55,81,77},{49,119,243},{48,91,74},{49,82,2},{47,76,103},{27,94,243},{35,76,76},{61,109,72},{61,92,1},{62,83,5},{61,81,13},{107,0,243},{46,92,72},{50,83,1},{28,77,72},{219,0,243},{28,77,72},{55,103,72},{55,103,72},{55,103,72},{55,79,72},{49,101,50},{49,82,1},{49,82,1},{49,69,5},{33,82,50},{38,71,1},{61,91,0}, +{61,91,0},{61,91,0},{61,76,0},{98,0,50},{52,80,0},{52,80,0},{40,71,0},{201,0,50},{40,71,0},{115,0,72},{60,94,0},{65,83,0},{46,83,0},{115,0,72},{234,0,72},{46,83,0},{0,77,72},{234,0,72},{0,77,72},{55,0,72},{55,0,72},{55,0,72},{55,0,72},{49,85,0},{49,85,0},{49,85,0},{49,67,0},{38,72,0},{38,72,0},{63,130,144},{63,105,76},{65,92,106}, +{63,89,77},{57,127,243},{56,99,74},{57,90,2},{55,84,103},{35,102,243},{42,84,76},{69,117,72},{69,100,1},{70,91,5},{69,89,13},{119,0,243},{54,100,72},{58,91,1},{36,85,72},{243,0,243},{36,85,72},{63,111,72},{63,111,72},{63,111,72},{63,87,72},{57,108,50},{57,90,1},{57,90,1},{57,77,5},{41,90,50},{46,79,1},{69,99,0},{69,99,0},{69,99,0},{69,84,0},{110,0,50}, +{60,88,0},{60,88,0},{48,79,0},{225,0,50},{48,79,0},{127,0,72},{68,102,0},{73,91,0},{54,91,0},{127,0,72},{254,2,72},{54,91,0},{0,85,72},{254,2,72},{0,85,72},{63,0,72},{63,0,72},{63,0,72},{63,0,72},{57,93,0},{57,93,0},{57,93,0},{57,75,0},{46,80,0},{46,80,0},{71,137,144},{71,113,76},{73,100,106},{71,97,77},{65,135,243},{64,107,74},{65,98,2}, +{63,92,103},{44,109,243},{50,92,76},{77,125,72},{77,108,1},{78,99,5},{77,97,13},{131,0,243},{62,108,72},{66,99,1},{44,93,72},{255,6,243},{44,93,72},{71,119,72},{71,119,72},{71,119,72},{71,95,72},{65,116,50},{65,98,1},{65,98,1},{65,85,5},{49,98,50},{54,87,1},{77,107,0},{77,107,0},{77,107,0},{77,92,0},{122,0,50},{68,96,0},{68,96,0},{56,87,0},{249,0,50}, +{56,87,0},{138,0,72},{76,110,0},{81,99,0},{62,99,0},{138,0,72},{254,14,72},{62,99,0},{0,93,72},{254,14,72},{0,93,72},{71,0,72},{71,0,72},{71,0,72},{71,0,72},{65,101,0},{65,101,0},{65,101,0},{65,83,0},{54,88,0},{54,88,0},{79,145,144},{79,121,76},{81,108,106},{79,105,77},{73,142,243},{72,115,74},{73,106,2},{71,100,103},{52,117,243},{58,100,76},{85,133,72}, +{85,116,1},{86,107,5},{85,105,13},{143,0,243},{70,116,72},{74,107,1},{52,101,72},{255,18,243},{52,101,72},{79,127,72},{79,127,72},{79,127,72},{79,103,72},{73,124,50},{73,106,1},{73,106,1},{73,93,5},{57,106,50},{62,95,1},{85,115,0},{85,115,0},{85,115,0},{85,100,0},{134,0,50},{76,104,0},{76,104,0},{64,95,0},{255,9,50},{64,95,0},{150,0,72},{84,118,0},{89,107,0}, +{70,107,0},{150,0,72},{254,26,72},{70,107,0},{0,101,72},{254,26,72},{0,101,72},{79,0,72},{79,0,72},{79,0,72},{79,0,72},{73,109,0},{73,109,0},{73,109,0},{73,91,0},{62,96,0},{62,96,0},{88,154,144},{88,130,76},{90,117,106},{88,114,77},{82,151,243},{81,124,74},{82,115,2},{80,109,103},{61,126,243},{67,109,76},{94,142,72},{94,125,1},{95,116,5},{94,114,13},{156,0,243}, +{79,125,72},{83,116,1},{61,110,72},{254,32,243},{61,110,72},{88,136,72},{88,136,72},{88,136,72},{88,112,72},{82,133,50},{82,115,1},{82,115,1},{82,102,5},{66,115,50},{71,104,1},{94,124,0},{94,124,0},{94,124,0},{94,109,0},{147,0,50},{85,113,0},{85,113,0},{73,104,0},{254,23,50},{73,104,0},{164,0,72},{93,127,0},{98,116,0},{79,116,0},{164,0,72},{255,39,72},{79,116,0}, +{0,110,72},{255,39,72},{0,110,72},{88,0,72},{88,0,72},{88,0,72},{88,0,72},{82,118,0},{82,118,0},{82,118,0},{82,100,0},{71,105,0},{71,105,0},{96,162,144},{96,138,76},{98,125,106},{96,122,77},{90,159,243},{90,131,73},{90,123,2},{88,117,103},{69,134,243},{75,117,76},{102,150,72},{102,133,1},{103,124,5},{102,122,13},{168,0,243},{88,132,72},{91,124,1},{69,118,72},{255,43,243}, +{69,118,72},{96,144,72},{96,144,72},{96,144,72},{96,120,72},{90,141,50},{90,123,1},{90,123,1},{90,110,5},{74,123,50},{79,112,1},{102,132,0},{102,132,0},{102,132,0},{102,117,0},{159,0,50},{93,121,0},{93,121,0},{81,112,0},{254,35,50},{81,112,0},{175,0,72},{101,135,0},{106,124,0},{87,124,0},{175,0,72},{254,51,72},{87,124,0},{0,118,72},{254,51,72},{0,118,72},{96,0,72}, +{96,0,72},{96,0,72},{96,0,72},{90,126,0},{90,126,0},{90,126,0},{90,108,0},{79,113,0},{79,113,0},{104,170,144},{104,146,76},{106,133,106},{104,130,77},{98,167,243},{98,139,73},{98,131,2},{96,125,103},{77,142,243},{83,125,76},{110,158,72},{110,142,0},{111,132,5},{110,130,13},{180,0,243},{96,140,72},{99,132,1},{76,126,72},{255,55,243},{76,126,72},{104,152,72},{104,152,72},{104,152,72}, +{104,128,72},{98,149,50},{98,131,1},{98,131,1},{98,118,5},{83,130,50},{87,120,1},{110,140,0},{110,140,0},{110,140,0},{110,125,0},{171,0,50},{101,129,0},{101,129,0},{89,120,0},{255,46,50},{89,120,0},{187,0,72},{110,142,0},{114,132,0},{94,132,0},{187,0,72},{254,63,72},{94,132,0},{0,126,72},{254,63,72},{0,126,72},{104,0,72},{104,0,72},{104,0,72},{104,0,72},{98,134,0}, +{98,134,0},{98,134,0},{98,116,0},{87,121,0},{87,121,0},{112,178,144},{112,154,76},{114,140,105},{112,138,77},{106,175,243},{106,147,73},{106,139,2},{104,133,103},{85,150,243},{91,133,76},{118,166,72},{118,149,1},{119,140,5},{118,138,13},{192,0,243},{104,148,72},{107,140,1},{84,134,72},{255,67,243},{84,134,72},{112,160,72},{112,160,72},{112,160,72},{112,136,72},{106,157,50},{106,139,1},{106,139,1}, +{106,126,5},{91,138,50},{95,128,1},{118,147,0},{118,147,0},{118,147,0},{118,133,0},{183,0,50},{109,137,0},{109,137,0},{97,128,0},{255,58,50},{97,128,0},{199,0,72},{117,151,0},{122,140,0},{102,140,0},{199,0,72},{254,75,72},{102,140,0},{0,134,72},{254,75,72},{0,134,72},{112,0,72},{112,0,72},{112,0,72},{112,0,72},{106,142,0},{106,142,0},{106,142,0},{106,124,0},{95,129,0}, +{95,129,0},{121,187,144},{121,163,76},{122,151,103},{121,148,77},{115,184,243},{115,156,73},{115,148,2},{112,141,105},{94,159,243},{100,142,76},{127,175,72},{127,158,1},{128,149,5},{127,147,13},{205,0,243},{113,157,72},{116,149,1},{93,143,72},{254,81,243},{93,143,72},{121,169,72},{121,169,72},{121,169,72},{121,145,72},{115,166,50},{115,148,1},{115,148,1},{115,135,5},{100,147,50},{104,137,1},{127,156,0}, +{127,156,0},{127,156,0},{127,142,0},{196,0,50},{117,146,0},{117,146,0},{106,137,0},{254,72,50},{106,137,0},{213,0,72},{125,160,0},{131,149,0},{111,149,0},{213,0,72},{254,88,72},{111,149,0},{0,143,72},{254,88,72},{0,143,72},{121,0,72},{121,0,72},{121,0,72},{121,0,72},{115,151,0},{115,151,0},{115,151,0},{115,133,0},{104,138,0},{104,138,0},{129,195,144},{129,170,76},{130,159,103}, +{129,156,77},{123,192,243},{123,164,73},{123,156,2},{122,149,106},{102,167,243},{108,150,76},{135,182,72},{135,166,1},{136,157,5},{134,155,14},{217,0,243},{121,165,72},{124,157,1},{101,151,72},{255,92,243},{101,151,72},{129,177,72},{129,177,72},{129,177,72},{129,152,72},{123,174,50},{123,155,1},{123,155,1},{123,143,5},{108,155,50},{113,145,0},{135,164,0},{135,164,0},{135,164,0},{135,150,0},{208,0,50}, +{125,154,0},{125,154,0},{113,145,0},{254,84,50},{113,145,0},{224,0,72},{133,168,0},{139,157,0},{119,157,0},{224,0,72},{254,100,72},{119,157,0},{0,151,72},{254,100,72},{0,151,72},{129,0,72},{129,0,72},{129,0,72},{129,0,72},{123,158,0},{123,158,0},{123,158,0},{123,141,0},{113,145,0},{113,145,0},{137,203,144},{137,178,76},{138,167,103},{137,164,77},{131,200,243},{130,173,74},{131,164,2}, +{130,157,106},{110,175,243},{116,158,76},{143,190,72},{143,174,1},{144,165,5},{142,163,14},{229,0,243},{129,173,72},{132,165,1},{109,159,72},{255,104,243},{109,159,72},{137,184,72},{137,184,72},{137,184,72},{137,160,72},{131,182,50},{131,163,1},{131,163,1},{131,152,5},{116,163,50},{120,153,1},{143,172,0},{143,172,0},{143,172,0},{143,157,0},{220,0,50},{133,162,0},{133,162,0},{121,153,0},{255,95,50}, +{121,153,0},{236,0,72},{141,176,0},{147,165,0},{127,165,0},{236,0,72},{254,112,72},{127,165,0},{0,159,72},{254,112,72},{0,159,72},{137,0,72},{137,0,72},{137,0,72},{137,0,72},{131,166,0},{131,166,0},{131,166,0},{131,149,0},{120,154,0},{120,154,0},{145,211,144},{145,186,76},{146,175,103},{145,172,77},{139,208,243},{138,181,74},{139,172,2},{138,165,106},{118,183,243},{124,166,76},{151,198,72}, +{151,182,1},{152,173,5},{150,171,14},{241,0,243},{135,182,72},{140,173,1},{117,167,72},{255,116,243},{117,167,72},{145,192,72},{145,192,72},{145,192,72},{145,168,72},{139,189,50},{139,171,1},{139,171,1},{139,160,5},{124,171,50},{128,161,1},{151,180,0},{151,180,0},{151,180,0},{151,165,0},{232,0,50},{141,170,0},{141,170,0},{129,161,0},{255,107,50},{129,161,0},{248,0,72},{149,184,0},{155,173,0}, +{135,173,0},{248,0,72},{254,124,72},{135,173,0},{0,167,72},{254,124,72},{0,167,72},{145,0,72},{145,0,72},{145,0,72},{145,0,72},{139,174,0},{139,174,0},{139,174,0},{139,156,0},{127,162,0},{127,162,0},{154,219,144},{154,195,76},{155,184,103},{154,181,77},{148,217,243},{147,190,74},{148,181,2},{147,174,106},{126,192,243},{133,175,76},{160,207,72},{160,191,1},{161,182,5},{159,180,14},{254,0,243}, +{144,191,72},{149,182,1},{126,176,72},{255,129,243},{126,176,72},{154,201,72},{154,201,72},{154,201,72},{154,177,72},{148,198,50},{148,180,1},{148,180,1},{148,169,5},{132,181,50},{137,170,1},{160,189,0},{160,189,0},{160,189,0},{160,174,0},{245,0,50},{150,179,0},{150,179,0},{138,170,0},{254,121,50},{138,170,0},{255,13,72},{158,193,0},{164,182,0},{144,182,0},{255,13,72},{254,137,72},{144,182,0}, +{0,176,72},{254,137,72},{0,176,72},{154,0,72},{154,0,72},{154,0,72},{154,0,72},{148,183,0},{148,183,0},{148,183,0},{148,165,0},{136,171,0},{136,171,0},{162,227,144},{162,203,76},{163,192,103},{162,189,77},{156,224,243},{155,198,74},{156,189,2},{155,182,106},{134,200,243},{141,183,76},{168,215,72},{168,199,1},{169,190,5},{167,188,14},{255,22,243},{152,199,72},{157,190,1},{134,184,72},{255,141,243}, +{134,184,72},{162,209,72},{162,209,72},{162,209,72},{162,185,72},{156,206,50},{156,188,1},{156,188,1},{156,177,5},{139,189,50},{145,178,1},{168,197,0},{168,197,0},{168,197,0},{168,182,0},{255,4,50},{158,187,0},{158,187,0},{146,178,0},{255,132,50},{146,178,0},{255,37,72},{166,201,0},{172,190,0},{152,190,0},{255,37,72},{254,149,72},{152,190,0},{0,184,72},{254,149,72},{0,184,72},{162,0,72}, +{162,0,72},{162,0,72},{162,0,72},{156,191,0},{156,191,0},{156,191,0},{156,173,0},{144,179,0},{144,179,0},{170,235,144},{170,211,76},{171,200,103},{170,197,77},{164,232,243},{163,206,74},{164,197,2},{163,190,106},{142,208,243},{149,191,76},{176,223,72},{176,207,1},{177,198,5},{175,196,14},{255,46,243},{160,207,72},{165,198,1},{142,192,72},{255,153,243},{142,192,72},{170,217,72},{170,217,72},{170,217,72}, +{170,193,72},{164,214,50},{164,196,1},{164,196,1},{164,185,5},{147,197,50},{153,186,1},{176,205,0},{176,205,0},{176,205,0},{176,190,0},{255,28,50},{166,195,0},{166,195,0},{154,186,0},{255,144,50},{154,186,0},{255,61,72},{174,209,0},{180,198,0},{160,198,0},{255,61,72},{254,161,72},{160,198,0},{0,192,72},{254,161,72},{0,192,72},{170,0,72},{170,0,72},{170,0,72},{170,0,72},{164,199,0}, +{164,199,0},{164,199,0},{164,181,0},{152,187,0},{152,187,0},{178,243,144},{178,219,76},{179,208,103},{178,205,77},{172,240,243},{171,214,74},{172,205,2},{171,198,106},{150,216,243},{157,199,76},{184,231,72},{184,215,1},{185,206,5},{183,204,14},{255,70,243},{169,214,72},{173,206,1},{150,200,72},{255,165,243},{150,200,72},{178,225,72},{178,225,72},{178,225,72},{178,201,72},{172,222,50},{172,204,1},{172,204,1}, +{172,193,5},{155,205,50},{161,194,1},{184,213,0},{184,213,0},{184,213,0},{184,198,0},{255,52,50},{174,203,0},{174,203,0},{162,194,0},{255,156,50},{162,194,0},{255,86,72},{182,217,0},{188,206,0},{168,206,0},{255,86,72},{255,172,72},{168,206,0},{0,200,72},{255,172,72},{0,200,72},{178,0,72},{178,0,72},{178,0,72},{178,0,72},{172,207,0},{172,207,0},{172,207,0},{172,189,0},{160,195,0}, +{160,195,0},{187,252,144},{187,228,76},{188,217,103},{187,214,77},{181,249,243},{180,222,74},{181,214,2},{180,207,106},{159,225,243},{166,208,76},{193,240,72},{193,224,1},{194,216,3},{192,213,14},{255,98,243},{178,223,72},{182,215,1},{158,209,72},{255,178,243},{158,209,72},{187,234,72},{187,234,72},{187,234,72},{187,210,72},{181,231,50},{181,213,1},{181,213,1},{181,202,5},{165,213,50},{170,203,1},{193,222,0}, +{193,222,0},{193,222,0},{193,207,0},{255,79,50},{183,212,0},{183,212,0},{171,203,0},{253,170,50},{171,203,0},{255,113,72},{192,225,0},{196,215,0},{177,215,0},{255,113,72},{254,186,72},{177,215,0},{0,209,72},{254,186,72},{0,209,72},{187,0,72},{187,0,72},{187,0,72},{187,0,72},{181,216,0},{181,216,0},{181,216,0},{181,198,0},{169,204,0},{169,204,0},{196,255,148},{195,236,76},{196,225,103}, +{195,222,77},{189,254,244},{188,230,74},{189,222,2},{188,215,106},{167,233,243},{173,217,77},{201,248,72},{201,231,1},{202,224,3},{200,221,14},{255,122,243},{186,231,72},{189,222,2},{166,217,72},{255,190,243},{166,217,72},{195,242,72},{195,242,72},{195,242,72},{195,218,72},{189,239,50},{189,221,1},{189,221,1},{189,210,5},{173,221,50},{178,211,1},{201,229,0},{201,229,0},{201,229,0},{201,215,0},{255,104,50}, +{191,220,0},{191,220,0},{179,211,0},{255,181,50},{179,211,0},{255,137,72},{200,233,0},{204,223,0},{184,223,0},{255,137,72},{254,198,72},{184,223,0},{0,217,72},{254,198,72},{0,217,72},{195,0,72},{195,0,72},{195,0,72},{195,0,72},{189,224,0},{189,224,0},{189,224,0},{189,206,0},{177,212,0},{177,212,0},{205,255,170},{203,244,76},{204,232,100},{202,230,79},{199,255,255},{196,238,74},{197,231,2}, +{196,223,106},{175,241,243},{181,225,77},{210,254,73},{209,239,1},{210,232,3},{208,229,14},{255,146,243},{194,239,72},{198,230,2},{174,225,72},{255,202,243},{174,225,72},{203,250,72},{203,250,72},{203,250,72},{203,226,72},{197,247,50},{197,229,1},{197,229,1},{197,218,5},{181,229,50},{186,219,1},{209,237,0},{209,237,0},{209,237,0},{209,223,0},{255,128,50},{199,228,0},{199,228,0},{187,219,0},{255,193,50}, +{187,219,0},{255,161,72},{208,241,0},{212,231,0},{192,231,0},{255,161,72},{254,210,72},{192,231,0},{0,225,72},{254,210,72},{0,225,72},{203,0,72},{203,0,72},{203,0,72},{203,0,72},{197,232,0},{197,232,0},{197,232,0},{197,214,0},{185,220,0},{185,220,0},{215,255,208},{212,252,75},{212,240,100},{210,238,79},{211,255,287},{204,246,74},{205,239,1},{203,231,109},{183,249,243},{189,233,77},{218,255,81}, +{217,247,1},{218,240,3},{215,237,17},{255,171,243},{202,247,72},{205,239,1},{182,233,72},{254,214,243},{182,233,72},{211,255,73},{211,255,73},{211,255,73},{211,234,72},{205,255,50},{205,237,1},{205,237,1},{205,226,5},{189,237,50},{194,227,0},{217,245,0},{217,245,0},{217,245,0},{217,231,0},{255,152,50},{208,235,0},{208,235,0},{194,227,0},{255,205,50},{194,227,0},{255,186,72},{216,249,0},{220,239,0}, +{200,239,0},{255,186,72},{255,221,72},{200,239,0},{0,233,72},{255,221,72},{0,233,72},{211,0,72},{211,0,72},{211,0,72},{211,0,72},{205,239,0},{205,239,0},{205,239,0},{205,222,0},{194,227,0},{194,227,0},{224,255,274},{222,255,98},{221,249,100},{219,247,79},{221,255,332},{213,255,74},{214,248,1},{212,240,109},{195,255,245},{198,242,77},{230,255,106},{226,255,4},{227,249,3},{224,246,17},{255,198,243}, +{213,255,73},{214,248,1},{191,242,72},{255,227,243},{191,242,72},{221,255,83},{221,255,83},{221,255,83},{220,243,72},{215,255,59},{214,246,1},{214,246,1},{213,234,6},{198,246,50},{203,236,0},{226,254,0},{226,254,0},{226,254,0},{226,240,0},{255,180,50},{217,244,0},{217,244,0},{203,236,0},{255,218,50},{203,236,0},{255,213,72},{228,255,2},{229,248,0},{209,248,0},{255,213,72},{254,235,72},{209,248,0}, +{0,242,72},{254,235,72},{0,242,72},{220,0,72},{220,0,72},{220,0,72},{220,0,72},{214,248,0},{214,248,0},{214,248,0},{214,231,0},{203,236,0},{203,236,0},{233,255,327},{231,255,164},{230,255,105},{228,253,77},{230,255,370},{225,255,95},{222,254,2},{220,248,94},{213,255,262},{208,249,65},{239,255,126},{237,255,35},{235,255,5},{234,253,13},{255,219,221},{228,255,82},{223,254,1},{201,249,61},{254,238,221}, +{201,249,61},{230,255,105},{230,255,105},{230,255,105},{228,251,72},{227,255,83},{222,254,1},{222,254,1},{221,243,6},{206,254,50},{211,244,0},{235,254,5},{235,254,5},{235,254,5},{234,248,0},{255,204,50},{225,252,0},{225,252,0},{211,244,0},{255,230,50},{211,244,0},{255,234,61},{240,255,17},{238,255,0},{219,255,0},{255,234,61},{255,245,61},{219,255,0},{0,249,61},{255,245,61},{0,249,61},{228,0,72}, +{228,0,72},{228,0,72},{228,0,72},{222,253,1},{222,253,1},{222,253,1},{222,239,0},{211,244,0},{211,244,0},{242,255,233},{239,255,164},{239,255,139},{237,255,78},{239,255,239},{234,255,62},{232,255,24},{230,252,18},{225,255,158},{218,253,5},{248,255,53},{245,255,27},{245,255,18},{242,255,1},{255,237,93},{240,255,26},{237,255,5},{217,253,5},{254,247,93},{217,253,5},{239,255,139},{239,255,139},{239,255,139}, +{237,255,78},{236,255,118},{232,255,24},{232,255,24},{229,251,6},{222,255,67},{219,252,0},{245,255,18},{245,255,18},{245,255,18},{242,254,1},{255,228,50},{237,255,5},{237,255,5},{219,252,0},{255,242,50},{219,252,0},{255,246,5},{251,254,1},{250,255,0},{243,255,0},{255,246,5},{255,251,5},{243,255,0},{0,253,5},{255,251,5},{0,253,5},{236,0,72},{236,0,72},{236,0,72},{236,0,72},{232,254,8}, +{232,254,8},{232,254,8},{230,247,0},{219,252,0},{219,252,0},{248,255,136},{245,255,119},{245,255,110},{244,255,81},{245,255,122},{243,255,52},{241,255,41},{238,255,0},{237,255,75},{231,255,5},{251,255,9},{251,255,6},{251,255,5},{250,255,1},{255,246,17},{249,255,3},{249,255,2},{237,255,0},{255,251,17},{237,255,0},{245,255,110},{245,255,110},{245,255,110},{244,255,81},{245,255,86},{241,255,41},{241,255,41}, +{238,255,0},{234,255,46},{231,255,5},{251,255,5},{251,255,5},{251,255,5},{250,255,1},{255,243,13},{249,255,2},{249,255,2},{237,255,0},{254,250,13},{237,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{244,0,72},{244,0,72},{244,0,72},{244,0,72},{241,254,25},{241,254,25},{241,254,25},{238,255,0},{231,255,5}, +{231,255,5},{0,58,200},{0,42,17},{0,29,0},{0,25,65},{0,40,441},{0,27,266},{0,23,121},{0,16,318},{0,18,467},{0,16,343},{0,58,200},{0,42,17},{0,29,0},{0,25,65},{20,0,441},{0,27,266},{0,23,121},{0,16,318},{40,0,441},{0,16,318},{0,28,0},{0,28,0},{0,28,0},{0,14,0},{0,13,41},{0,12,10},{0,12,10},{0,7,20},{0,6,42},{0,7,24},{0,28,0}, +{0,28,0},{0,28,0},{0,14,0},{6,0,41},{0,12,10},{0,12,10},{0,7,20},{13,0,41},{0,7,20},{29,0,200},{0,42,17},{0,29,0},{0,25,65},{29,0,200},{58,0,200},{0,25,65},{0,19,200},{58,0,200},{0,19,200},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,82,200},{0,54,1},{1,38,19}, +{0,34,34},{0,55,686},{0,36,339},{0,30,139},{0,22,446},{0,24,747},{0,22,495},{0,82,200},{0,54,1},{2,39,17},{0,34,34},{27,0,686},{0,36,339},{0,30,139},{0,22,446},{55,0,686},{0,22,446},{0,52,0},{0,52,0},{0,52,0},{0,26,0},{0,25,145},{0,21,45},{0,21,45},{0,13,80},{0,12,154},{0,10,94},{0,52,0},{0,52,0},{0,52,0},{0,26,0},{12,0,145}, +{0,21,45},{0,21,45},{0,13,80},{25,0,145},{0,13,80},{41,0,200},{0,54,1},{8,37,0},{0,34,34},{41,0,200},{82,0,200},{0,34,34},{0,27,200},{82,0,200},{0,27,200},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,99,225},{4,65,26},{6,46,74},{3,43,45},{0,79,723},{0,48,282},{0,42,54}, +{0,31,401},{0,36,852},{0,29,497},{7,92,200},{7,64,0},{9,46,21},{5,42,29},{39,0,723},{0,48,282},{0,42,54},{0,31,401},{79,0,723},{0,31,401},{4,68,25},{4,68,25},{4,68,25},{3,36,25},{0,49,162},{0,36,17},{0,36,17},{0,22,58},{0,21,206},{0,19,97},{7,62,0},{7,62,0},{7,62,0},{7,34,0},{24,0,162},{0,36,17},{0,36,17},{0,22,58},{49,0,162}, +{0,22,58},{52,0,200},{6,64,0},{16,45,0},{0,44,17},{52,0,200},{107,0,200},{0,44,17},{0,35,200},{107,0,200},{0,35,200},{3,0,25},{3,0,25},{3,0,25},{3,0,25},{0,22,0},{0,22,0},{0,22,0},{0,11,0},{0,9,5},{0,9,5},{8,115,313},{8,78,121},{10,56,198},{7,51,126},{0,104,723},{0,63,227},{0,51,6},{0,40,339},{0,48,956},{0,38,494},{15,100,200}, +{15,72,0},{17,54,21},{15,49,32},{51,0,723},{0,63,227},{0,51,6},{0,40,339},{104,0,723},{0,40,339},{8,84,113},{8,84,113},{8,84,113},{7,46,113},{0,73,162},{0,48,1},{0,48,1},{0,31,29},{0,33,270},{0,27,109},{15,70,0},{15,70,0},{15,70,0},{15,42,0},{36,0,162},{0,48,1},{0,48,1},{0,31,29},{73,0,162},{0,31,29},{64,0,200},{14,72,0},{24,53,0}, +{0,53,4},{64,0,200},{131,0,200},{0,53,4},{0,43,200},{131,0,200},{0,43,200},{7,0,113},{7,0,113},{7,0,113},{7,0,113},{0,46,0},{0,46,0},{0,46,0},{0,23,0},{0,18,34},{0,18,34},{14,130,400},{15,88,215},{17,66,315},{13,60,210},{4,123,723},{3,75,207},{4,62,2},{2,49,303},{0,60,969},{0,48,417},{24,109,200},{24,81,0},{26,63,21},{23,58,33},{64,0,723}, +{0,78,201},{6,62,1},{0,50,289},{131,0,723},{0,50,289},{14,99,200},{14,99,200},{14,99,200},{14,56,200},{4,92,162},{5,60,2},{5,60,2},{3,40,14},{0,45,280},{0,39,77},{24,79,0},{24,79,0},{24,79,0},{24,51,0},{49,0,162},{7,59,0},{7,59,0},{0,40,8},{101,0,162},{0,40,8},{78,0,200},{23,81,0},{32,62,0},{1,62,0},{78,0,200},{158,0,200},{1,62,0}, +{0,52,200},{158,0,200},{0,52,200},{14,0,200},{14,0,200},{14,0,200},{14,0,200},{4,65,0},{4,65,0},{4,65,0},{4,34,0},{0,33,40},{0,33,40},{22,138,400},{23,96,215},{25,74,315},{21,68,210},{12,131,723},{11,83,207},{12,70,2},{10,57,303},{0,72,865},{0,57,290},{32,117,200},{32,89,0},{34,71,21},{31,66,33},{76,0,723},{5,87,200},{14,70,1},{0,59,251},{155,0,723}, +{0,59,251},{22,107,200},{22,107,200},{22,107,200},{22,64,200},{12,100,162},{13,68,2},{13,68,2},{10,47,17},{0,60,213},{0,48,13},{32,87,0},{32,87,0},{32,87,0},{32,59,0},{61,0,162},{15,67,0},{15,67,0},{0,50,1},{125,0,162},{0,50,1},{89,0,200},{31,89,0},{40,70,0},{9,70,0},{89,0,200},{183,0,200},{9,70,0},{0,60,200},{183,0,200},{0,60,200},{22,0,200}, +{22,0,200},{22,0,200},{22,0,200},{12,73,0},{12,73,0},{12,73,0},{12,42,0},{0,45,8},{0,45,8},{30,145,400},{31,104,215},{33,82,315},{29,76,210},{20,139,723},{19,91,207},{20,78,2},{18,65,303},{0,88,787},{0,66,225},{40,125,200},{40,97,0},{43,79,19},{39,74,33},{88,0,723},{14,94,200},{22,78,1},{0,66,224},{180,0,723},{0,66,224},{30,115,200},{30,115,200},{30,115,200}, +{30,72,200},{20,108,162},{21,76,2},{21,76,2},{18,56,17},{0,72,173},{2,58,1},{40,95,0},{40,95,0},{40,95,0},{40,67,0},{73,0,162},{23,75,0},{23,75,0},{3,58,0},{149,0,162},{3,58,0},{101,0,200},{39,97,0},{48,78,0},{17,78,0},{101,0,200},{207,0,200},{17,78,0},{0,68,200},{207,0,200},{0,68,200},{30,0,200},{30,0,200},{30,0,200},{30,0,200},{20,81,0}, +{20,81,0},{20,81,0},{20,50,0},{1,59,0},{1,59,0},{38,153,400},{39,112,215},{41,90,315},{37,84,210},{28,147,723},{27,99,207},{28,86,2},{26,73,303},{0,100,739},{4,75,212},{48,133,200},{48,105,0},{51,87,19},{47,82,33},{100,0,723},{22,102,200},{30,86,1},{0,75,206},{204,0,723},{0,75,206},{38,123,200},{38,123,200},{38,123,200},{38,80,200},{28,116,162},{29,84,2},{29,84,2}, +{26,64,17},{0,85,162},{10,66,1},{48,103,0},{48,103,0},{48,103,0},{48,75,0},{85,0,162},{31,83,0},{31,83,0},{11,66,0},{174,0,162},{11,66,0},{113,0,200},{47,105,0},{56,86,0},{25,86,0},{113,0,200},{231,0,200},{25,86,0},{0,76,200},{231,0,200},{0,76,200},{38,0,200},{38,0,200},{38,0,200},{38,0,200},{28,89,0},{28,89,0},{28,89,0},{28,58,0},{9,67,0}, +{9,67,0},{47,162,400},{48,121,215},{50,98,308},{46,93,210},{37,155,723},{36,107,207},{37,95,2},{35,82,303},{0,113,723},{13,84,212},{57,142,200},{57,112,1},{60,96,19},{56,91,33},{113,0,723},{31,111,200},{39,95,1},{0,85,200},{231,0,723},{0,85,200},{47,132,200},{47,132,200},{47,132,200},{47,89,200},{37,125,162},{38,93,2},{38,93,2},{35,73,17},{10,93,162},{19,75,1},{57,111,0}, +{57,111,0},{57,111,0},{57,84,0},{98,0,162},{40,92,0},{40,92,0},{20,75,0},{201,0,162},{20,75,0},{127,0,200},{56,114,0},{65,95,0},{34,95,0},{127,0,200},{254,2,200},{34,95,0},{0,85,200},{254,2,200},{0,85,200},{47,0,200},{47,0,200},{47,0,200},{47,0,200},{37,98,0},{37,98,0},{37,98,0},{37,67,0},{18,76,0},{18,76,0},{55,170,400},{56,129,215},{58,106,308}, +{54,101,210},{45,163,723},{44,115,207},{45,103,2},{43,90,303},{8,121,723},{21,92,212},{65,150,200},{65,121,0},{68,104,19},{64,99,33},{125,0,723},{39,119,200},{47,103,1},{7,93,200},{255,0,723},{7,93,200},{55,140,200},{55,140,200},{55,140,200},{55,97,200},{45,133,162},{46,101,2},{46,101,2},{43,81,17},{18,101,162},{27,83,1},{65,119,0},{65,119,0},{65,119,0},{65,92,0},{110,0,162}, +{48,100,0},{48,100,0},{28,83,0},{225,0,162},{28,83,0},{138,0,200},{65,121,0},{73,103,0},{42,103,0},{138,0,200},{254,14,200},{42,103,0},{0,93,200},{254,14,200},{0,93,200},{55,0,200},{55,0,200},{55,0,200},{55,0,200},{45,106,0},{45,106,0},{45,106,0},{45,75,0},{26,84,0},{26,84,0},{63,178,400},{64,137,215},{66,114,308},{62,109,210},{53,171,723},{52,123,207},{53,111,2}, +{51,98,303},{16,129,723},{27,100,215},{73,158,200},{73,129,0},{76,112,19},{72,107,33},{137,0,723},{47,127,200},{55,111,1},{15,101,200},{255,12,723},{15,101,200},{63,148,200},{63,148,200},{63,148,200},{63,105,200},{53,141,162},{54,109,2},{54,109,2},{51,89,17},{26,109,162},{35,91,1},{73,127,0},{73,127,0},{73,127,0},{73,100,0},{122,0,162},{56,108,0},{56,108,0},{36,91,0},{249,0,162}, +{36,91,0},{150,0,200},{73,129,0},{81,111,0},{49,111,0},{150,0,200},{254,26,200},{49,111,0},{0,101,200},{254,26,200},{0,101,200},{63,0,200},{63,0,200},{63,0,200},{63,0,200},{53,114,0},{53,114,0},{53,114,0},{53,83,0},{34,92,0},{34,92,0},{71,186,400},{72,144,212},{74,122,308},{70,117,210},{61,179,723},{60,131,207},{61,118,2},{59,106,303},{24,137,723},{35,108,215},{81,166,200}, +{81,137,0},{84,120,19},{80,115,33},{149,0,723},{55,135,200},{62,119,1},{23,109,200},{255,24,723},{23,109,200},{71,156,200},{71,156,200},{71,156,200},{71,113,200},{61,149,162},{61,118,1},{61,118,1},{59,97,17},{34,117,162},{43,99,1},{81,135,0},{81,135,0},{81,135,0},{81,108,0},{134,0,162},{64,116,0},{64,116,0},{44,99,0},{255,9,162},{44,99,0},{162,0,200},{81,137,0},{89,119,0}, +{57,119,0},{162,0,200},{254,38,200},{57,119,0},{0,109,200},{254,38,200},{0,109,200},{71,0,200},{71,0,200},{71,0,200},{71,0,200},{61,121,0},{61,121,0},{61,121,0},{61,91,0},{42,100,0},{42,100,0},{80,195,400},{81,153,212},{83,131,308},{79,127,212},{70,188,723},{69,140,207},{70,127,2},{68,115,303},{34,145,723},{44,117,215},{90,174,200},{90,146,0},{93,129,19},{89,124,33},{162,0,723}, +{64,144,200},{71,128,1},{32,118,200},{254,38,723},{32,118,200},{80,165,200},{80,165,200},{80,165,200},{80,122,200},{70,158,162},{70,127,1},{70,127,1},{68,106,17},{43,126,162},{52,108,1},{90,144,0},{90,144,0},{90,144,0},{90,117,0},{147,0,162},{74,124,0},{74,124,0},{53,108,0},{254,23,162},{53,108,0},{175,0,200},{90,146,0},{98,128,0},{66,128,0},{175,0,200},{254,51,200},{66,128,0}, +{0,118,200},{254,51,200},{0,118,200},{80,0,200},{80,0,200},{80,0,200},{80,0,200},{70,130,0},{70,130,0},{70,130,0},{70,100,0},{51,109,0},{51,109,0},{88,203,400},{89,161,212},{91,139,308},{87,135,212},{78,196,723},{77,148,207},{78,135,2},{75,122,305},{42,153,723},{52,125,215},{98,182,200},{98,154,0},{101,137,19},{97,132,33},{174,0,723},{72,152,200},{79,136,1},{40,126,200},{255,49,723}, +{40,126,200},{88,172,200},{88,172,200},{88,172,200},{88,129,200},{78,166,162},{78,135,1},{78,135,1},{76,114,17},{51,134,162},{60,116,0},{98,152,0},{98,152,0},{98,152,0},{98,125,0},{159,0,162},{82,132,0},{82,132,0},{60,116,0},{254,35,162},{60,116,0},{187,0,200},{98,154,0},{106,136,0},{74,136,0},{187,0,200},{254,63,200},{74,136,0},{0,126,200},{254,63,200},{0,126,200},{88,0,200}, +{88,0,200},{88,0,200},{88,0,200},{78,138,0},{78,138,0},{78,138,0},{78,108,0},{60,116,0},{60,116,0},{96,211,400},{97,169,212},{99,147,308},{95,143,212},{86,204,723},{85,156,207},{86,143,2},{83,131,308},{50,161,723},{60,133,215},{106,190,200},{106,162,0},{109,145,19},{105,141,35},{186,0,723},{80,160,200},{87,144,1},{48,134,200},{255,61,723},{48,134,200},{96,180,200},{96,180,200},{96,180,200}, +{96,137,200},{86,174,162},{86,143,1},{86,143,1},{84,122,17},{59,142,162},{68,124,0},{106,160,0},{106,160,0},{106,160,0},{106,133,0},{171,0,162},{90,140,0},{90,140,0},{68,124,0},{255,46,162},{68,124,0},{199,0,200},{106,162,0},{114,144,0},{82,144,0},{199,0,200},{254,75,200},{82,144,0},{0,134,200},{254,75,200},{0,134,200},{96,0,200},{96,0,200},{96,0,200},{96,0,200},{86,146,0}, +{86,146,0},{86,146,0},{86,116,0},{68,124,0},{68,124,0},{104,219,400},{105,177,212},{107,155,308},{103,151,212},{94,212,723},{93,164,207},{94,151,2},{91,139,308},{58,169,723},{68,141,215},{114,198,200},{114,170,0},{117,153,19},{113,149,35},{198,0,723},{88,168,200},{95,152,1},{56,142,200},{255,73,723},{56,142,200},{104,188,200},{104,188,200},{104,188,200},{104,145,200},{94,181,162},{94,151,1},{94,151,1}, +{92,130,17},{67,150,162},{76,132,0},{114,168,0},{114,168,0},{114,168,0},{114,141,0},{183,0,162},{98,148,0},{98,148,0},{76,132,0},{255,58,162},{76,132,0},{211,0,200},{114,170,0},{122,152,0},{90,152,0},{211,0,200},{255,86,200},{90,152,0},{0,142,200},{255,86,200},{0,142,200},{104,0,200},{104,0,200},{104,0,200},{104,0,200},{94,154,0},{94,154,0},{94,154,0},{94,124,0},{76,132,0}, +{76,132,0},{113,228,400},{114,186,215},{116,164,308},{112,160,212},{103,221,723},{102,173,207},{103,160,2},{100,148,308},{67,178,723},{78,150,212},{123,207,200},{123,179,0},{125,163,17},{122,158,35},{211,0,723},{96,177,200},{104,161,1},{65,151,200},{255,86,723},{65,151,200},{113,197,200},{113,197,200},{113,197,200},{113,154,200},{103,190,162},{103,160,1},{103,160,1},{102,138,19},{76,159,162},{85,141,0},{123,177,0}, +{123,177,0},{123,177,0},{123,149,0},{196,0,162},{107,157,0},{107,157,0},{85,141,0},{254,72,162},{85,141,0},{224,0,200},{123,179,0},{131,161,0},{99,161,0},{224,0,200},{254,100,200},{99,161,0},{0,151,200},{254,100,200},{0,151,200},{113,0,200},{113,0,200},{113,0,200},{113,0,200},{103,163,0},{103,163,0},{103,163,0},{103,133,0},{85,141,0},{85,141,0},{121,235,400},{122,194,215},{124,172,308}, +{120,168,212},{111,229,723},{110,181,207},{111,168,2},{108,156,308},{75,186,723},{86,158,212},{131,215,200},{131,187,0},{133,171,17},{130,166,35},{223,0,723},{104,185,200},{112,169,1},{73,159,200},{255,98,723},{73,159,200},{121,205,200},{121,205,200},{121,205,200},{121,162,200},{111,198,162},{111,168,1},{111,168,1},{110,146,19},{84,167,162},{93,149,0},{131,185,0},{131,185,0},{131,185,0},{131,157,0},{208,0,162}, +{115,165,0},{115,165,0},{93,149,0},{254,84,162},{93,149,0},{236,0,200},{131,187,0},{139,169,0},{107,169,0},{236,0,200},{254,112,200},{107,169,0},{0,159,200},{254,112,200},{0,159,200},{121,0,200},{121,0,200},{121,0,200},{121,0,200},{111,171,0},{111,171,0},{111,171,0},{111,141,0},{93,149,0},{93,149,0},{129,243,400},{130,202,215},{133,180,305},{128,176,212},{119,236,723},{118,189,207},{119,176,2}, +{116,164,308},{83,194,723},{94,166,212},{139,223,200},{139,195,0},{141,179,17},{138,174,35},{235,0,723},{112,193,200},{120,177,1},{81,167,200},{255,110,723},{81,167,200},{129,213,200},{129,213,200},{129,213,200},{129,170,200},{119,206,162},{119,176,1},{119,176,1},{118,154,19},{91,175,162},{101,157,0},{139,192,0},{139,192,0},{139,192,0},{139,165,0},{220,0,162},{123,173,0},{123,173,0},{101,157,0},{255,95,162}, +{101,157,0},{248,0,200},{139,195,0},{147,177,0},{115,177,0},{248,0,200},{254,124,200},{115,177,0},{0,167,200},{254,124,200},{0,167,200},{129,0,200},{129,0,200},{129,0,200},{129,0,200},{119,179,0},{119,179,0},{119,179,0},{119,148,0},{101,157,0},{101,157,0},{137,251,400},{138,210,215},{140,187,303},{136,184,212},{127,244,723},{126,197,207},{127,184,2},{124,172,308},{91,202,723},{102,174,212},{147,231,200}, +{147,202,1},{149,187,17},{146,182,35},{247,0,723},{120,201,200},{128,185,1},{88,175,200},{255,122,723},{88,175,200},{137,221,200},{137,221,200},{137,221,200},{137,178,200},{127,214,162},{127,184,1},{127,184,1},{126,162,19},{99,183,162},{109,165,0},{147,200,0},{147,200,0},{147,200,0},{147,173,0},{232,0,162},{131,181,0},{131,181,0},{109,165,0},{255,107,162},{109,165,0},{255,10,200},{146,203,0},{155,185,0}, +{123,185,0},{255,10,200},{255,135,200},{123,185,0},{0,175,200},{255,135,200},{0,175,200},{137,0,200},{137,0,200},{137,0,200},{137,0,200},{127,187,0},{127,187,0},{127,187,0},{127,156,0},{109,165,0},{109,165,0},{147,255,404},{147,219,215},{149,196,303},{145,193,212},{136,253,723},{135,206,207},{136,193,2},{133,181,308},{100,211,723},{111,183,212},{156,240,200},{156,210,1},{158,196,17},{155,191,35},{255,10,723}, +{129,210,200},{137,194,1},{97,184,200},{255,135,723},{97,184,200},{146,230,200},{146,230,200},{146,230,200},{146,187,200},{136,223,162},{136,193,1},{136,193,1},{135,171,19},{108,192,162},{118,174,0},{156,209,0},{156,209,0},{156,209,0},{156,182,0},{245,0,162},{139,191,0},{139,191,0},{118,174,0},{254,121,162},{118,174,0},{255,37,200},{155,212,0},{164,194,0},{131,194,0},{255,37,200},{254,149,200},{131,194,0}, +{0,184,200},{254,149,200},{0,184,200},{146,0,200},{146,0,200},{146,0,200},{146,0,200},{136,196,0},{136,196,0},{136,196,0},{136,165,0},{118,174,0},{118,174,0},{156,255,426},{155,227,215},{157,204,303},{153,201,212},{146,254,728},{143,214,207},{144,202,2},{141,189,308},{108,219,723},{118,191,215},{164,248,200},{164,218,1},{166,204,17},{163,199,35},{255,34,723},{137,218,200},{145,201,2},{105,192,200},{255,147,723}, +{105,192,200},{154,238,200},{154,238,200},{154,238,200},{154,195,200},{144,231,162},{144,200,1},{144,200,1},{143,179,19},{116,200,162},{126,182,0},{164,217,0},{164,217,0},{164,217,0},{164,190,0},{255,4,162},{146,199,0},{146,199,0},{126,182,0},{255,132,162},{126,182,0},{255,61,200},{163,220,0},{172,202,0},{139,202,0},{255,61,200},{254,161,200},{139,202,0},{0,192,200},{254,161,200},{0,192,200},{154,0,200}, +{154,0,200},{154,0,200},{154,0,200},{144,204,0},{144,204,0},{144,204,0},{144,173,0},{126,182,0},{126,182,0},{165,255,468},{163,234,212},{165,212,303},{162,207,213},{156,255,747},{151,222,207},{152,210,2},{149,197,308},{115,228,723},{126,199,215},{172,255,200},{172,226,1},{174,212,17},{171,207,35},{255,58,723},{145,226,200},{153,209,2},{113,200,200},{255,159,723},{113,200,200},{162,246,200},{162,246,200},{162,246,200}, +{162,203,200},{152,239,162},{152,208,1},{152,208,1},{151,187,19},{124,208,162},{134,190,0},{172,225,0},{172,225,0},{172,225,0},{172,198,0},{255,28,162},{155,206,0},{155,206,0},{134,190,0},{255,144,162},{134,190,0},{255,86,200},{171,228,0},{180,210,0},{147,210,0},{255,86,200},{255,172,200},{147,210,0},{0,200,200},{255,172,200},{0,200,200},{162,0,200},{162,0,200},{162,0,200},{162,0,200},{152,211,0}, +{152,211,0},{152,211,0},{152,181,0},{134,190,0},{134,190,0},{175,255,522},{171,242,212},{173,220,303},{170,216,213},{165,255,788},{158,232,208},{160,218,2},{157,205,308},{123,235,723},{134,207,215},{181,255,209},{180,234,1},{182,220,17},{179,215,35},{255,82,723},{153,234,200},{161,217,2},{121,208,200},{254,171,723},{121,208,200},{170,253,200},{170,253,200},{170,253,200},{170,211,200},{160,247,162},{160,216,1},{160,216,1}, +{159,195,19},{132,216,162},{141,198,1},{180,233,0},{180,233,0},{180,233,0},{180,206,0},{255,52,162},{163,214,0},{163,214,0},{142,198,0},{255,156,162},{142,198,0},{255,110,200},{179,236,0},{188,218,0},{155,218,0},{255,110,200},{255,184,200},{155,218,0},{0,208,200},{255,184,200},{0,208,200},{170,0,200},{170,0,200},{170,0,200},{170,0,200},{160,219,0},{160,219,0},{160,219,0},{160,189,0},{141,199,0}, +{141,199,0},{184,255,612},{180,251,212},{182,229,303},{179,225,213},{178,255,844},{167,239,210},{169,227,2},{165,214,315},{132,244,723},{143,216,215},{193,255,234},{189,243,1},{191,229,17},{187,224,38},{255,110,723},{162,243,200},{170,226,2},{130,217,200},{255,184,723},{130,217,200},{180,254,206},{180,254,206},{180,254,206},{179,220,200},{170,253,163},{169,225,1},{169,225,1},{168,204,19},{141,225,162},{150,207,0},{189,242,0}, +{189,242,0},{189,242,0},{189,215,0},{255,79,162},{172,223,0},{172,223,0},{150,207,0},{253,170,162},{150,207,0},{255,137,200},{188,245,0},{197,227,0},{164,227,0},{255,137,200},{254,198,200},{164,227,0},{0,217,200},{254,198,200},{0,217,200},{179,0,200},{179,0,200},{179,0,200},{179,0,200},{169,228,0},{169,228,0},{169,228,0},{169,198,0},{150,207,0},{150,207,0},{193,255,714},{189,255,225},{190,237,303}, +{187,233,213},{187,255,919},{175,247,210},{177,235,2},{173,222,315},{140,252,723},{151,224,215},{202,255,275},{197,251,1},{199,237,17},{195,232,38},{255,134,723},{170,251,200},{178,234,2},{138,225,200},{255,196,723},{138,225,200},{189,254,224},{189,254,224},{189,254,224},{187,228,200},{178,255,171},{177,233,1},{177,233,1},{176,212,19},{149,233,162},{158,215,0},{197,250,0},{197,250,0},{197,250,0},{197,223,0},{255,104,162}, +{180,231,0},{180,231,0},{158,215,0},{255,181,162},{158,215,0},{255,161,200},{196,253,0},{204,235,0},{172,235,0},{255,161,200},{254,210,200},{172,235,0},{0,225,200},{254,210,200},{0,225,200},{187,0,200},{187,0,200},{187,0,200},{187,0,200},{177,236,0},{177,236,0},{177,236,0},{177,206,0},{158,215,0},{158,215,0},{202,255,836},{198,255,290},{198,245,303},{195,241,213},{199,255,1015},{183,255,210},{185,243,2}, +{181,230,315},{152,255,732},{159,232,215},{214,254,331},{207,255,13},{207,245,17},{203,240,38},{255,158,723},{183,255,206},{186,242,2},{146,233,200},{255,208,723},{146,233,200},{196,255,251},{196,255,251},{196,255,251},{195,236,200},{190,255,195},{185,241,1},{185,241,1},{184,221,21},{157,241,162},{166,223,0},{205,255,1},{205,255,1},{205,255,1},{205,231,0},{255,128,162},{188,239,0},{188,239,0},{166,223,0},{255,193,162}, +{166,223,0},{255,186,200},{210,255,8},{212,243,0},{180,243,0},{255,186,200},{255,221,200},{180,243,0},{0,233,200},{255,221,200},{0,233,200},{195,0,200},{195,0,200},{195,0,200},{195,0,200},{185,244,0},{185,244,0},{185,244,0},{185,214,0},{166,223,0},{166,223,0},{215,255,976},{207,255,417},{206,253,303},{203,249,213},{208,255,1124},{195,255,258},{193,251,2},{189,238,315},{167,255,797},{166,240,215},{221,255,392}, +{216,255,77},{215,252,14},{211,248,38},{255,183,723},{198,255,248},{194,250,2},{154,241,200},{254,220,723},{154,241,200},{205,255,289},{205,255,289},{205,255,289},{203,244,200},{199,255,230},{193,249,1},{193,249,1},{192,229,21},{165,249,162},{174,231,0},{215,255,8},{215,255,8},{215,255,8},{213,239,0},{255,152,162},{196,247,0},{196,247,0},{174,231,0},{255,205,162},{174,231,0},{255,210,200},{222,255,40},{220,251,0}, +{188,251,0},{255,210,200},{255,233,200},{188,251,0},{0,241,200},{255,233,200},{0,241,200},{203,0,200},{203,0,200},{203,0,200},{203,0,200},{193,252,0},{193,252,0},{193,252,0},{193,222,0},{174,231,0},{174,231,0},{221,255,895},{217,255,494},{215,255,339},{212,255,201},{218,255,994},{207,255,251},{204,255,6},{199,245,198},{189,255,702},{176,247,121},{233,255,318},{228,255,109},{224,255,29},{222,253,13},{255,204,546}, +{213,255,198},{205,255,1},{169,247,113},{255,230,546},{169,247,113},{215,255,339},{215,255,339},{215,255,339},{212,253,200},{211,255,293},{204,255,6},{204,255,6},{201,238,21},{177,255,165},{183,240,0},{224,255,29},{224,255,29},{224,255,29},{222,248,0},{255,180,162},{206,254,1},{206,254,1},{183,240,0},{255,218,162},{183,240,0},{255,228,113},{237,255,34},{232,255,0},{207,255,0},{255,228,113},{255,242,113},{207,255,0}, +{0,247,113},{255,242,113},{0,247,113},{212,0,200},{212,0,200},{212,0,200},{212,0,200},{202,255,4},{202,255,4},{202,255,4},{202,231,0},{183,240,0},{183,240,0},{230,255,737},{226,255,497},{224,255,401},{220,255,216},{227,255,783},{216,255,206},{213,255,54},{209,249,74},{201,255,534},{189,251,26},{239,255,190},{235,255,97},{233,255,58},{230,255,1},{255,219,333},{225,255,110},{219,255,17},{185,251,25},{254,238,333}, +{185,251,25},{224,255,401},{224,255,401},{224,255,401},{220,255,216},{218,255,354},{213,255,54},{213,255,54},{209,246,21},{192,255,203},{191,248,0},{233,255,58},{233,255,58},{233,255,58},{230,254,1},{255,204,162},{219,255,17},{219,255,17},{191,248,0},{255,230,162},{191,248,0},{255,240,25},{246,255,5},{244,255,0},{231,255,0},{255,240,25},{255,248,25},{231,255,0},{0,251,25},{255,248,25},{0,251,25},{220,0,200}, +{220,0,200},{220,0,200},{220,0,200},{211,255,17},{211,255,17},{211,255,17},{210,239,0},{191,248,0},{191,248,0},{236,255,616},{233,255,495},{233,255,446},{228,255,264},{233,255,626},{225,255,220},{225,255,139},{217,254,19},{216,255,434},{199,255,1},{245,255,121},{244,255,94},{242,255,80},{240,255,20},{255,234,193},{237,255,75},{234,255,45},{201,255,0},{255,245,193},{201,255,0},{233,255,446},{233,255,446},{233,255,446}, +{228,255,264},{230,255,401},{225,255,139},{225,255,139},{216,253,17},{207,255,254},{199,255,1},{242,255,80},{242,255,80},{242,255,80},{240,255,20},{255,225,145},{234,255,45},{234,255,45},{201,255,0},{254,241,145},{201,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{228,0,200},{228,0,200},{228,0,200},{228,0,200},{221,255,34}, +{221,255,34},{221,255,34},{218,247,0},{200,254,1},{200,254,1},{242,255,400},{239,255,343},{239,255,318},{237,255,227},{239,255,370},{234,255,161},{232,255,121},{226,255,0},{225,255,243},{213,255,17},{251,255,33},{248,255,24},{248,255,20},{246,255,4},{255,243,54},{246,255,17},{243,255,10},{225,255,0},{254,250,54},{225,255,0},{239,255,318},{239,255,318},{239,255,318},{237,255,227},{236,255,253},{232,255,121},{232,255,121}, +{226,255,0},{219,255,150},{213,255,17},{248,255,20},{248,255,20},{248,255,20},{246,255,4},{255,237,41},{243,255,10},{243,255,10},{225,255,0},{254,247,41},{225,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{236,0,200},{236,0,200},{236,0,200},{236,0,200},{230,255,65},{230,255,65},{230,255,65},{226,255,0},{213,255,17}, +{213,255,17},{0,82,421},{0,60,40},{0,42,0},{0,34,145},{0,55,925},{0,36,566},{0,33,262},{0,22,677},{0,27,989},{0,22,726},{0,82,421},{0,60,40},{0,42,0},{0,34,145},{27,0,925},{0,36,566},{0,33,262},{0,22,677},{55,0,925},{0,22,677},{0,40,0},{0,40,0},{0,40,0},{0,20,0},{0,19,85},{0,15,25},{0,15,25},{0,10,45},{0,9,89},{0,8,54},{0,40,0}, +{0,40,0},{0,40,0},{0,20,0},{9,0,85},{0,15,25},{0,15,25},{0,10,45},{19,0,85},{0,10,45},{41,0,421},{0,60,40},{0,42,0},{0,34,145},{41,0,421},{82,0,421},{0,34,145},{0,27,421},{82,0,421},{0,27,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,107,421},{0,72,8},{1,50,18}, +{0,44,100},{0,73,1261},{0,48,670},{0,42,282},{0,28,857},{0,33,1369},{0,28,938},{0,107,421},{0,72,8},{2,51,14},{0,44,100},{36,0,1261},{0,48,670},{0,42,282},{0,28,857},{73,0,1261},{0,28,857},{0,64,0},{0,64,0},{0,64,0},{0,32,0},{0,31,221},{0,27,73},{0,27,73},{0,16,125},{0,15,237},{0,13,144},{0,64,0},{0,64,0},{0,64,0},{0,32,0},{15,0,221}, +{0,27,73},{0,27,73},{0,16,125},{31,0,221},{0,16,125},{52,0,421},{0,72,8},{7,50,0},{0,44,100},{52,0,421},{107,0,421},{0,44,100},{0,35,421},{107,0,421},{0,35,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,127,426},{1,86,5},{4,59,67},{0,53,70},{0,92,1514},{0,60,701},{0,51,243}, +{0,37,946},{0,42,1695},{0,34,1083},{3,125,421},{3,84,1},{7,59,42},{1,54,69},{45,0,1514},{0,60,701},{0,51,243},{0,37,946},{92,0,1514},{0,37,946},{2,84,5},{2,84,5},{2,84,5},{1,43,5},{0,49,338},{0,36,89},{0,36,89},{0,22,170},{0,21,382},{0,19,217},{3,82,0},{3,82,0},{3,82,0},{3,42,0},{24,0,338},{0,36,89},{0,36,89},{0,22,170},{49,0,338}, +{0,22,170},{64,0,421},{1,86,0},{15,58,0},{0,53,61},{64,0,421},{131,0,421},{0,53,61},{0,43,421},{131,0,421},{0,43,421},{1,0,5},{1,0,5},{1,0,5},{1,0,5},{0,10,0},{0,10,0},{0,10,0},{0,5,0},{0,3,1},{0,3,1},{6,143,482},{6,97,63},{8,69,163},{4,63,110},{0,116,1514},{0,72,589},{0,60,109},{0,44,857},{0,54,1815},{0,44,1053},{11,133,421}, +{11,91,1},{15,67,42},{9,62,69},{57,0,1514},{0,72,589},{0,60,109},{0,44,857},{116,0,1514},{0,44,857},{6,101,61},{6,101,61},{6,101,61},{6,52,61},{0,73,338},{0,51,34},{0,51,34},{0,31,117},{0,33,446},{0,29,209},{11,90,0},{11,90,0},{11,90,0},{11,50,0},{36,0,338},{0,51,34},{0,51,34},{0,31,117},{73,0,338},{0,31,117},{76,0,421},{10,93,0},{23,66,0}, +{0,62,32},{76,0,421},{155,0,421},{0,62,32},{0,51,421},{155,0,421},{0,51,421},{5,0,61},{5,0,61},{5,0,61},{5,0,61},{0,34,0},{0,34,0},{0,34,0},{0,17,0},{0,15,17},{0,15,17},{10,162,621},{11,109,215},{14,78,362},{9,71,234},{0,143,1514},{0,88,489},{0,72,22},{0,56,750},{0,66,1982},{0,53,1047},{20,142,421},{20,100,1},{24,76,42},{18,71,69},{70,0,1514}, +{0,88,489},{0,72,22},{0,56,750},{143,0,1514},{0,56,750},{10,120,200},{10,120,200},{10,120,200},{10,64,200},{0,101,338},{0,69,4},{0,69,4},{0,40,72},{0,45,552},{0,39,229},{20,99,0},{20,99,0},{20,99,0},{20,59,0},{49,0,338},{0,69,4},{0,69,4},{0,40,72},{101,0,338},{0,40,72},{89,0,421},{19,102,0},{32,75,0},{0,74,10},{89,0,421},{183,0,421},{0,74,10}, +{0,60,421},{183,0,421},{0,60,421},{10,0,200},{10,0,200},{10,0,200},{10,0,200},{0,61,0},{0,61,0},{0,61,0},{0,30,0},{0,24,65},{0,24,65},{14,178,813},{15,119,423},{18,88,618},{13,81,414},{0,167,1514},{0,100,441},{0,83,2},{0,65,670},{0,75,2165},{0,60,1070},{28,150,421},{28,108,1},{32,84,42},{26,79,69},{82,0,1514},{0,100,441},{2,82,2},{0,65,670},{167,0,1514}, +{0,65,670},{14,136,392},{14,136,392},{14,136,392},{14,74,392},{0,125,338},{1,80,2},{1,80,2},{0,50,41},{0,54,677},{0,48,277},{28,107,0},{28,107,0},{28,107,0},{28,67,0},{61,0,338},{3,79,0},{3,79,0},{0,50,41},{125,0,338},{0,50,41},{101,0,421},{27,110,0},{40,83,0},{0,83,1},{101,0,421},{207,0,421},{0,83,1},{0,68,421},{207,0,421},{0,68,421},{14,0,392}, +{14,0,392},{14,0,392},{14,0,392},{0,85,0},{0,85,0},{0,85,0},{0,42,0},{0,33,136},{0,33,136},{22,186,842},{22,128,450},{26,96,655},{21,89,441},{7,177,1514},{5,111,434},{8,90,4},{4,72,639},{0,88,2003},{0,69,858},{36,157,421},{36,116,1},{40,92,42},{34,87,69},{94,0,1514},{0,113,422},{8,90,3},{0,71,602},{192,0,1514},{0,71,602},{22,144,421},{22,144,421},{22,144,421}, +{21,82,421},{7,135,338},{8,90,3},{8,90,3},{6,59,35},{0,69,581},{0,57,150},{36,115,0},{36,115,0},{36,115,0},{36,75,0},{73,0,338},{11,87,0},{11,87,0},{0,59,18},{149,0,338},{0,59,18},{113,0,421},{35,118,0},{48,91,0},{2,91,0},{113,0,421},{231,0,421},{2,91,0},{0,76,421},{231,0,421},{0,76,421},{21,0,421},{21,0,421},{21,0,421},{21,0,421},{7,95,0}, +{7,95,0},{7,95,0},{7,50,0},{0,48,80},{0,48,80},{30,194,842},{30,136,450},{34,104,655},{29,97,441},{15,185,1514},{13,119,434},{16,98,4},{12,80,639},{0,103,1850},{0,80,663},{44,165,421},{44,124,1},{48,100,42},{42,95,69},{106,0,1514},{6,122,421},{16,98,3},{0,80,542},{216,0,1514},{0,80,542},{30,152,421},{30,152,421},{30,152,421},{29,90,421},{15,143,338},{16,98,3},{16,98,3}, +{14,67,35},{0,81,477},{0,66,52},{44,123,0},{44,123,0},{44,123,0},{44,83,0},{85,0,338},{19,95,0},{19,95,0},{0,68,5},{174,0,338},{0,68,5},{125,0,421},{43,126,0},{56,99,0},{10,99,0},{125,0,421},{255,0,421},{10,99,0},{0,84,421},{255,0,421},{0,84,421},{29,0,421},{29,0,421},{29,0,421},{29,0,421},{15,103,0},{15,103,0},{15,103,0},{15,58,0},{0,63,29}, +{0,63,29},{39,203,842},{39,145,450},{43,113,655},{37,106,445},{24,194,1514},{22,126,438},{25,107,4},{21,89,639},{0,115,1710},{0,90,519},{53,174,421},{53,133,1},{56,110,38},{51,104,69},{119,0,1514},{15,131,421},{25,107,3},{0,90,494},{243,0,1514},{0,90,494},{39,160,421},{39,160,421},{39,160,421},{38,99,421},{24,152,338},{25,107,3},{25,107,3},{23,76,35},{0,97,389},{0,78,3},{53,132,0}, +{53,132,0},{53,132,0},{53,92,0},{98,0,338},{29,103,0},{29,103,0},{0,79,0},{201,0,338},{0,79,0},{138,0,421},{52,135,0},{65,108,0},{19,108,0},{138,0,421},{254,14,421},{19,108,0},{0,93,421},{254,14,421},{0,93,421},{38,0,421},{38,0,421},{38,0,421},{38,0,421},{24,112,0},{24,112,0},{24,112,0},{24,67,0},{0,78,2},{0,78,2},{47,211,842},{47,153,450},{51,121,655}, +{45,114,445},{32,202,1514},{30,134,438},{33,115,4},{29,97,639},{0,129,1617},{0,99,458},{61,182,421},{61,141,1},{64,118,38},{59,112,69},{131,0,1514},{23,139,421},{33,115,3},{0,99,458},{255,6,1514},{0,99,458},{47,168,421},{47,168,421},{47,168,421},{46,107,421},{32,160,338},{33,115,3},{33,115,3},{31,84,35},{0,109,349},{5,87,1},{61,140,0},{61,140,0},{61,140,0},{61,100,0},{110,0,338}, +{37,111,0},{37,111,0},{8,87,0},{225,0,338},{8,87,0},{150,0,421},{60,143,0},{73,116,0},{27,116,0},{150,0,421},{254,26,421},{27,116,0},{0,101,421},{254,26,421},{0,101,421},{46,0,421},{46,0,421},{46,0,421},{46,0,421},{32,120,0},{32,120,0},{32,120,0},{32,75,0},{5,88,0},{5,88,0},{55,219,842},{55,161,450},{59,129,655},{53,122,445},{40,210,1514},{38,142,438},{41,123,4}, +{36,105,646},{0,141,1553},{3,108,450},{69,190,421},{69,149,1},{72,126,38},{68,118,73},{143,0,1514},{32,146,421},{41,123,3},{0,108,434},{255,18,1514},{0,108,434},{55,176,421},{55,176,421},{55,176,421},{55,114,421},{40,168,338},{41,123,3},{41,123,3},{39,92,35},{0,122,338},{13,95,1},{69,148,0},{69,148,0},{69,148,0},{69,108,0},{122,0,338},{45,119,0},{45,119,0},{15,95,0},{249,0,338}, +{15,95,0},{162,0,421},{68,151,0},{81,124,0},{35,124,0},{162,0,421},{254,38,421},{35,124,0},{0,109,421},{254,38,421},{0,109,421},{54,0,421},{54,0,421},{54,0,421},{54,0,421},{40,128,0},{40,128,0},{40,128,0},{40,83,0},{13,96,0},{13,96,0},{63,227,842},{63,169,450},{68,134,654},{61,130,445},{48,218,1514},{46,151,434},{49,131,4},{44,113,646},{0,153,1521},{11,116,450},{77,198,421}, +{77,157,1},{80,134,38},{74,128,74},{155,0,1514},{40,154,421},{49,131,3},{0,117,422},{255,30,1514},{0,117,422},{63,184,421},{63,184,421},{63,184,421},{63,122,421},{48,175,338},{49,131,3},{49,131,3},{47,100,35},{8,130,338},{21,103,1},{77,156,0},{77,156,0},{77,156,0},{77,116,0},{134,0,338},{53,127,0},{53,127,0},{23,103,0},{255,9,338},{23,103,0},{174,0,421},{76,159,0},{89,132,0}, +{43,132,0},{174,0,421},{255,49,421},{43,132,0},{0,117,421},{255,49,421},{0,117,421},{62,0,421},{62,0,421},{62,0,421},{62,0,421},{48,136,0},{48,136,0},{48,136,0},{48,91,0},{21,104,0},{21,104,0},{72,236,842},{72,178,450},{76,145,646},{70,139,445},{57,227,1514},{55,160,434},{58,140,4},{53,122,646},{4,166,1514},{20,125,450},{86,207,421},{86,166,1},{89,143,38},{83,137,74},{168,0,1514}, +{49,163,421},{58,140,3},{4,126,421},{255,43,1514},{4,126,421},{72,193,421},{72,193,421},{72,193,421},{72,131,421},{57,184,338},{58,140,3},{58,140,3},{56,109,35},{18,138,338},{30,112,1},{86,164,0},{86,164,0},{86,164,0},{86,125,0},{147,0,338},{62,136,0},{62,136,0},{32,112,0},{254,23,338},{32,112,0},{187,0,421},{85,168,0},{98,141,0},{52,141,0},{187,0,421},{254,63,421},{52,141,0}, +{0,126,421},{254,63,421},{0,126,421},{71,0,421},{71,0,421},{71,0,421},{71,0,421},{57,145,0},{57,145,0},{57,145,0},{57,100,0},{30,113,0},{30,113,0},{80,243,842},{80,186,450},{84,153,646},{78,147,445},{65,235,1514},{63,168,434},{66,148,4},{61,130,646},{12,174,1514},{27,133,450},{94,215,421},{94,174,1},{97,151,38},{91,145,74},{180,0,1514},{57,171,421},{66,148,3},{11,134,421},{255,55,1514}, +{11,134,421},{80,201,421},{80,201,421},{80,201,421},{80,139,421},{65,192,338},{66,148,3},{66,148,3},{63,116,36},{26,146,338},{38,120,1},{94,172,0},{94,172,0},{94,172,0},{94,132,0},{159,0,338},{70,144,0},{70,144,0},{40,120,0},{254,35,338},{40,120,0},{199,0,421},{92,176,0},{106,149,0},{60,149,0},{199,0,421},{254,75,421},{60,149,0},{0,134,421},{254,75,421},{0,134,421},{79,0,421}, +{79,0,421},{79,0,421},{79,0,421},{65,153,0},{65,153,0},{65,153,0},{65,108,0},{38,121,0},{38,121,0},{88,251,842},{88,194,450},{92,161,646},{86,155,445},{73,243,1514},{71,176,434},{74,156,4},{69,138,646},{21,181,1514},{35,141,450},{102,223,421},{102,182,1},{105,159,38},{99,153,74},{192,0,1514},{65,179,421},{74,156,3},{19,142,421},{255,67,1514},{19,142,421},{88,209,421},{88,209,421},{88,209,421}, +{88,147,421},{73,200,338},{74,156,3},{74,156,3},{71,125,38},{34,154,338},{46,128,1},{102,180,0},{102,180,0},{102,180,0},{102,140,0},{171,0,338},{78,152,0},{78,152,0},{48,128,0},{255,46,338},{48,128,0},{211,0,421},{100,184,0},{114,157,0},{68,157,0},{211,0,421},{255,86,421},{68,157,0},{0,142,421},{255,86,421},{0,142,421},{87,0,421},{87,0,421},{87,0,421},{87,0,421},{73,161,0}, +{73,161,0},{73,161,0},{73,116,0},{46,129,0},{46,129,0},{97,254,850},{96,202,450},{100,169,646},{94,163,445},{81,251,1514},{79,184,434},{82,164,4},{77,146,646},{29,189,1514},{43,149,450},{110,231,421},{110,190,1},{113,167,38},{107,161,74},{204,0,1514},{73,187,421},{83,164,2},{27,150,421},{255,79,1514},{27,150,421},{96,217,421},{96,217,421},{96,217,421},{96,155,421},{81,208,338},{82,163,2},{82,163,2}, +{79,133,38},{42,162,338},{54,136,1},{110,188,0},{110,188,0},{110,188,0},{110,148,0},{183,0,338},{86,160,0},{86,160,0},{56,136,0},{255,58,338},{56,136,0},{223,0,421},{108,192,0},{122,165,0},{76,165,0},{223,0,421},{255,98,421},{76,165,0},{0,150,421},{255,98,421},{0,150,421},{95,0,421},{95,0,421},{95,0,421},{95,0,421},{81,169,0},{81,169,0},{81,169,0},{81,124,0},{54,137,0}, +{54,137,0},{107,255,878},{105,211,450},{109,178,646},{103,172,445},{91,254,1518},{88,193,434},{91,173,4},{86,155,646},{38,198,1514},{52,158,450},{119,240,421},{119,199,1},{122,176,38},{116,170,74},{217,0,1514},{82,196,421},{92,173,2},{36,159,421},{255,92,1514},{36,159,421},{105,226,421},{105,226,421},{105,226,421},{105,164,421},{90,217,338},{91,172,2},{91,172,2},{88,142,38},{51,171,338},{63,145,1},{119,197,0}, +{119,197,0},{119,197,0},{119,157,0},{196,0,338},{95,169,0},{95,169,0},{65,145,0},{254,72,338},{65,145,0},{236,0,421},{117,201,0},{130,174,0},{84,174,0},{236,0,421},{254,112,421},{84,174,0},{0,159,421},{254,112,421},{0,159,421},{104,0,421},{104,0,421},{104,0,421},{104,0,421},{90,177,0},{90,177,0},{90,177,0},{90,133,0},{63,146,0},{63,146,0},{116,255,926},{113,218,450},{117,186,646}, +{111,180,445},{101,255,1535},{96,201,434},{99,181,4},{94,163,646},{46,206,1514},{60,166,450},{127,247,421},{127,207,1},{130,184,38},{124,178,74},{229,0,1514},{90,204,421},{99,181,3},{44,167,421},{255,104,1514},{44,167,421},{113,234,421},{113,234,421},{113,234,421},{113,172,421},{98,225,338},{99,180,3},{99,180,3},{96,150,38},{59,179,338},{71,153,1},{127,205,0},{127,205,0},{127,205,0},{127,165,0},{208,0,338}, +{103,177,0},{103,177,0},{73,153,0},{254,84,338},{73,153,0},{248,0,421},{125,209,0},{138,182,0},{92,182,0},{248,0,421},{254,124,421},{92,182,0},{0,167,421},{254,124,421},{0,167,421},{112,0,421},{112,0,421},{112,0,421},{112,0,421},{98,185,0},{98,185,0},{98,185,0},{98,141,0},{71,154,0},{71,154,0},{125,255,994},{121,226,450},{125,194,646},{120,186,446},{113,255,1575},{104,209,434},{107,189,4}, +{102,171,646},{54,214,1514},{68,174,450},{135,255,421},{135,215,1},{139,192,36},{132,186,74},{241,0,1514},{98,212,421},{107,189,3},{52,175,421},{255,116,1514},{52,175,421},{121,241,421},{121,241,421},{121,241,421},{121,180,421},{106,233,338},{107,188,3},{107,188,3},{104,158,38},{67,187,338},{79,161,1},{135,213,0},{135,213,0},{135,213,0},{135,173,0},{220,0,338},{110,185,0},{110,185,0},{81,161,0},{255,95,338}, +{81,161,0},{255,10,421},{133,217,0},{146,190,0},{100,190,0},{255,10,421},{255,135,421},{100,190,0},{0,175,421},{255,135,421},{0,175,421},{120,0,421},{120,0,421},{120,0,421},{120,0,421},{106,193,0},{106,193,0},{106,193,0},{106,149,0},{79,162,0},{79,162,0},{135,255,1070},{129,234,450},{133,202,646},{128,195,446},{122,255,1626},{112,216,438},{115,197,4},{110,179,646},{62,222,1514},{76,182,450},{146,254,434}, +{143,223,1},{146,199,35},{140,194,74},{253,0,1514},{106,220,421},{115,197,3},{60,183,421},{254,128,1514},{60,183,421},{129,249,421},{129,249,421},{129,249,421},{129,188,421},{114,241,338},{115,196,3},{115,196,3},{112,166,38},{75,195,338},{87,169,1},{143,221,0},{143,221,0},{143,221,0},{143,181,0},{232,0,338},{118,193,0},{118,193,0},{89,169,0},{255,107,338},{89,169,0},{255,34,421},{141,225,0},{154,198,0}, +{108,198,0},{255,34,421},{255,147,421},{108,198,0},{0,183,421},{255,147,421},{0,183,421},{128,0,421},{128,0,421},{128,0,421},{128,0,421},{114,201,0},{114,201,0},{114,201,0},{114,157,0},{87,170,0},{87,170,0},{144,255,1190},{138,243,450},{142,211,646},{137,204,446},{132,255,1703},{121,225,438},{124,206,4},{121,187,654},{71,231,1514},{85,191,450},{156,255,461},{152,232,1},{155,208,35},{151,202,75},{255,22,1514}, +{114,229,421},{124,206,3},{69,192,421},{255,141,1514},{69,192,421},{138,255,422},{138,255,422},{138,255,422},{137,197,421},{123,250,338},{124,205,3},{124,205,3},{121,175,38},{84,204,338},{96,178,1},{152,230,0},{152,230,0},{152,230,0},{152,190,0},{245,0,338},{127,202,0},{127,202,0},{97,178,0},{254,121,338},{97,178,0},{255,61,421},{150,234,0},{163,207,0},{117,207,0},{255,61,421},{254,161,421},{117,207,0}, +{0,192,421},{254,161,421},{0,192,421},{137,0,421},{137,0,421},{137,0,421},{137,0,421},{123,210,0},{123,210,0},{123,210,0},{123,166,0},{95,179,0},{95,179,0},{153,255,1318},{146,251,450},{150,219,646},{145,212,446},{144,255,1791},{129,233,438},{132,214,4},{126,196,655},{78,240,1514},{93,199,450},{165,255,506},{160,240,1},{163,216,35},{158,210,78},{255,46,1514},{122,237,421},{132,214,3},{77,200,421},{255,153,1514}, +{77,200,421},{147,255,434},{147,255,434},{147,255,434},{145,205,421},{132,255,339},{132,213,3},{132,213,3},{129,183,38},{92,212,338},{104,186,1},{160,238,0},{160,238,0},{160,238,0},{160,198,0},{255,4,338},{135,210,0},{135,210,0},{105,186,0},{255,132,338},{105,186,0},{255,86,421},{158,242,0},{171,215,0},{125,215,0},{255,86,421},{255,172,421},{125,215,0},{0,200,421},{255,172,421},{0,200,421},{145,0,421}, +{145,0,421},{145,0,421},{145,0,421},{131,218,0},{131,218,0},{131,218,0},{131,174,0},{103,187,0},{103,187,0},{162,255,1466},{156,255,458},{158,226,639},{153,220,446},{153,255,1902},{137,240,438},{140,222,4},{134,204,655},{85,248,1514},{101,207,450},{175,255,554},{168,249,1},{171,224,35},{166,218,78},{255,70,1514},{130,245,421},{140,222,3},{85,208,421},{255,165,1514},{85,208,421},{156,255,458},{156,255,458},{156,255,458}, +{153,213,421},{141,255,350},{140,221,3},{140,221,3},{137,191,38},{99,220,338},{112,194,1},{168,245,0},{168,245,0},{168,245,0},{168,206,0},{255,28,338},{143,218,0},{143,218,0},{113,194,0},{255,144,338},{113,194,0},{255,110,421},{166,250,0},{179,223,0},{133,223,0},{255,110,421},{255,184,421},{133,223,0},{0,208,421},{255,184,421},{0,208,421},{153,0,421},{153,0,421},{153,0,421},{153,0,421},{139,226,0}, +{139,226,0},{139,226,0},{139,182,0},{111,195,0},{111,195,0},{172,255,1606},{165,255,519},{166,234,639},{161,228,446},{165,255,2030},{145,248,438},{148,230,4},{142,212,655},{95,255,1515},{109,215,450},{187,255,626},{177,255,3},{179,232,35},{174,226,78},{255,95,1514},{138,253,421},{148,230,3},{93,216,421},{254,177,1514},{93,216,421},{165,255,494},{165,255,494},{165,255,494},{161,221,421},{150,255,379},{148,229,3},{148,229,3}, +{145,199,38},{107,228,338},{120,202,1},{176,253,0},{176,253,0},{176,253,0},{176,214,0},{255,52,338},{151,226,0},{151,226,0},{121,202,0},{255,156,338},{121,202,0},{255,134,421},{177,255,2},{187,231,0},{141,231,0},{255,134,421},{255,196,421},{141,231,0},{0,216,421},{255,196,421},{0,216,421},{161,0,421},{161,0,421},{161,0,421},{161,0,421},{147,234,0},{147,234,0},{147,234,0},{147,190,0},{119,203,0}, +{119,203,0},{184,255,1818},{175,255,663},{175,243,639},{170,237,446},{175,255,2175},{155,255,443},{157,239,4},{151,221,655},{113,255,1557},{118,224,450},{196,255,722},{189,255,52},{188,241,35},{183,235,78},{255,122,1514},{155,255,442},{157,239,3},{101,225,421},{255,190,1514},{101,225,421},{175,255,542},{175,255,542},{175,255,542},{170,230,421},{162,255,424},{157,238,3},{157,238,3},{155,207,42},{116,237,338},{129,211,1},{186,254,5}, +{186,254,5},{186,254,5},{185,223,0},{255,79,338},{160,235,0},{160,235,0},{130,211,0},{253,170,338},{130,211,0},{255,161,421},{192,255,29},{196,240,0},{150,240,0},{255,161,421},{254,210,421},{150,240,0},{0,225,421},{254,210,421},{0,225,421},{170,0,421},{170,0,421},{170,0,421},{170,0,421},{156,243,0},{156,243,0},{156,243,0},{156,199,0},{128,212,0},{128,212,0},{193,255,2022},{184,255,858},{183,251,639}, +{178,245,446},{187,255,2343},{167,255,523},{165,247,4},{159,229,655},{131,255,1653},{126,232,450},{208,255,826},{198,255,150},{196,249,35},{191,243,78},{255,146,1514},{167,255,514},{165,247,3},{109,233,421},{255,202,1514},{109,233,421},{181,255,602},{181,255,602},{181,255,602},{178,238,421},{172,255,474},{165,246,3},{165,246,3},{163,215,42},{124,245,338},{137,219,1},{196,255,18},{196,255,18},{196,255,18},{193,231,0},{255,104,338}, +{168,243,0},{168,243,0},{138,219,0},{255,181,338},{138,219,0},{255,186,421},{207,255,80},{204,248,0},{158,248,0},{255,186,421},{255,221,421},{158,248,0},{0,233,421},{255,221,421},{0,233,421},{178,0,421},{178,0,421},{178,0,421},{178,0,421},{164,251,0},{164,251,0},{164,251,0},{164,207,0},{136,220,0},{136,220,0},{202,255,2175},{195,255,1070},{190,255,670},{186,253,441},{196,255,2443},{177,255,663},{172,255,2}, +{167,237,618},{146,255,1735},{135,240,423},{215,255,876},{207,255,277},{205,255,41},{199,251,69},{255,171,1459},{186,255,584},{174,254,2},{117,241,392},{254,214,1459},{117,241,392},{190,255,670},{190,255,670},{190,255,670},{186,246,421},{181,255,547},{173,253,2},{173,253,2},{171,223,42},{132,253,338},{145,227,1},{205,255,41},{205,255,41},{205,255,41},{201,239,0},{255,128,338},{176,251,0},{176,251,0},{146,227,0},{255,193,338}, +{146,227,0},{255,210,392},{222,255,136},{213,255,0},{167,255,0},{255,210,392},{255,233,392},{167,255,0},{0,241,392},{255,233,392},{0,241,392},{186,0,421},{186,0,421},{186,0,421},{186,0,421},{172,255,1},{172,255,1},{172,255,1},{172,214,0},{144,228,0},{144,228,0},{208,255,1867},{202,255,1047},{199,255,750},{194,255,421},{205,255,2052},{186,255,524},{183,255,22},{177,241,362},{161,255,1400},{145,244,215},{224,255,625}, +{216,255,229},{215,255,72},{207,253,17},{255,186,1064},{198,255,392},{186,255,4},{133,245,200},{255,221,1064},{133,245,200},{199,255,750},{199,255,750},{199,255,750},{194,254,421},{193,255,635},{183,255,22},{183,255,22},{179,231,42},{146,255,350},{153,235,1},{215,255,72},{215,255,72},{215,255,72},{209,247,0},{255,152,338},{186,255,4},{186,255,4},{154,235,0},{255,205,338},{154,235,0},{255,222,200},{231,255,65},{224,255,0}, +{192,255,0},{255,222,200},{255,239,200},{192,255,0},{0,245,200},{255,239,200},{0,245,200},{194,0,421},{194,0,421},{194,0,421},{194,0,421},{181,255,10},{181,255,10},{181,255,10},{180,222,0},{152,236,0},{152,236,0},{215,255,1586},{211,255,1053},{211,255,857},{204,255,446},{215,255,1698},{198,255,455},{195,255,109},{186,247,163},{177,255,1161},{158,249,63},{230,255,425},{226,255,209},{224,255,117},{218,255,1},{255,204,722}, +{210,255,254},{204,255,34},{152,249,61},{255,230,722},{152,249,61},{211,255,857},{211,255,857},{211,255,857},{204,255,446},{202,255,749},{195,255,109},{195,255,109},{188,240,42},{164,255,413},{162,244,1},{224,255,117},{224,255,117},{224,255,117},{218,254,1},{255,180,338},{204,255,34},{204,255,34},{163,244,0},{255,218,338},{163,244,0},{255,234,61},{240,255,17},{238,255,0},{219,255,0},{255,234,61},{255,245,61},{219,255,0}, +{0,249,61},{255,245,61},{0,249,61},{203,0,421},{203,0,421},{203,0,421},{203,0,421},{193,255,32},{193,255,32},{193,255,32},{189,231,0},{161,245,0},{161,245,0},{224,255,1422},{221,255,1083},{218,255,946},{213,255,525},{221,255,1470},{207,255,478},{204,255,243},{196,251,67},{189,255,1025},{169,253,5},{239,255,318},{235,255,217},{233,255,170},{228,255,29},{255,219,509},{222,255,198},{219,255,89},{169,253,5},{254,238,509}, +{169,253,5},{218,255,946},{218,255,946},{218,255,946},{213,255,525},{215,255,862},{204,255,243},{204,255,243},{196,248,42},{180,255,530},{169,252,1},{233,255,170},{233,255,170},{233,255,170},{228,255,29},{255,204,338},{219,255,89},{219,255,89},{171,252,0},{255,230,338},{171,252,0},{255,246,5},{251,254,1},{250,255,0},{243,255,0},{255,246,5},{255,251,5},{243,255,0},{0,253,5},{255,251,5},{0,253,5},{211,0,421}, +{211,0,421},{211,0,421},{211,0,421},{202,255,61},{202,255,61},{202,255,61},{197,239,0},{169,253,0},{169,253,0},{230,255,1153},{227,255,938},{227,255,857},{222,255,533},{227,255,1141},{216,255,434},{213,255,282},{204,253,18},{201,255,790},{183,255,8},{242,255,192},{242,255,144},{239,255,125},{237,255,34},{255,231,294},{234,255,121},{228,255,73},{189,255,0},{254,244,294},{189,255,0},{227,255,857},{227,255,857},{227,255,857}, +{222,255,533},{221,255,741},{213,255,282},{213,255,282},{204,253,14},{192,255,465},{183,255,8},{239,255,125},{239,255,125},{239,255,125},{237,255,34},{255,219,221},{228,255,73},{228,255,73},{189,255,0},{254,238,221},{189,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{219,0,421},{219,0,421},{219,0,421},{219,0,421},{211,255,100}, +{211,255,100},{211,255,100},{205,247,0},{183,255,8},{183,255,8},{236,255,853},{233,255,726},{233,255,677},{228,255,485},{233,255,793},{225,255,355},{222,255,262},{213,255,0},{213,255,534},{195,255,40},{248,255,68},{245,255,54},{245,255,45},{243,255,10},{255,240,113},{240,255,41},{240,255,25},{213,255,0},{255,248,113},{213,255,0},{233,255,677},{233,255,677},{233,255,677},{228,255,485},{227,255,545},{222,255,262},{222,255,262}, +{213,255,0},{204,255,329},{195,255,40},{245,255,45},{245,255,45},{245,255,45},{243,255,10},{255,231,85},{240,255,25},{240,255,25},{213,255,0},{254,244,85},{213,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{227,0,421},{227,0,421},{227,0,421},{227,0,421},{221,255,145},{221,255,145},{221,255,145},{213,255,0},{195,255,40}, +{195,255,40},{0,119,882},{0,84,97},{0,60,1},{0,50,325},{0,79,1896},{0,51,1188},{0,47,563},{0,31,1410},{0,36,2029},{0,31,1510},{0,119,882},{0,84,97},{0,60,1},{0,50,325},{39,0,1896},{0,51,1188},{0,47,563},{0,31,1410},{79,0,1896},{0,31,1410},{0,55,0},{0,55,0},{0,55,0},{0,27,0},{0,28,162},{0,21,52},{0,21,52},{0,13,89},{0,12,173},{0,13,105},{0,55,0}, +{0,55,0},{0,55,0},{0,27,0},{14,0,162},{0,21,52},{0,21,52},{0,13,89},{28,0,162},{0,13,89},{58,0,882},{0,84,97},{0,60,1},{0,50,325},{58,0,882},{119,0,882},{0,50,325},{0,39,882},{119,0,882},{0,39,882},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,143,882},{0,97,34},{1,68,11}, +{0,59,250},{0,95,2355},{0,63,1332},{0,54,585},{0,40,1656},{0,45,2556},{0,37,1802},{0,143,882},{0,97,34},{2,69,9},{0,59,250},{46,0,2355},{0,63,1332},{0,54,585},{0,40,1656},{95,0,2355},{0,40,1656},{0,79,0},{0,79,0},{0,79,0},{0,39,0},{0,40,338},{0,33,116},{0,33,116},{0,19,193},{0,18,365},{0,16,225},{0,79,0},{0,79,0},{0,79,0},{0,39,0},{20,0,338}, +{0,33,116},{0,33,116},{0,19,193},{40,0,338},{0,19,193},{70,0,882},{0,97,34},{6,68,0},{0,59,250},{70,0,882},{143,0,882},{0,59,250},{0,47,882},{143,0,882},{0,47,882},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,167,882},{0,112,5},{2,78,61},{0,68,185},{0,113,2899},{0,75,1508},{0,63,633}, +{0,44,1965},{0,51,3176},{0,44,2161},{0,167,882},{0,112,5},{4,77,53},{0,68,185},{55,0,2899},{0,75,1508},{0,63,633},{0,44,1965},{113,0,2899},{0,44,1965},{0,104,0},{0,104,0},{0,104,0},{0,51,0},{0,52,578},{0,42,205},{0,42,205},{0,25,337},{0,24,629},{0,22,389},{0,104,0},{0,104,0},{0,104,0},{0,51,0},{26,0,578},{0,42,205},{0,42,205},{0,25,337},{52,0,578}, +{0,25,337},{82,0,882},{0,112,5},{14,76,0},{0,68,185},{82,0,882},{167,0,882},{0,68,185},{0,55,882},{167,0,882},{0,55,882},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,186,900},{3,124,18},{6,88,133},{1,78,162},{0,134,3048},{0,88,1398},{0,72,469},{0,53,1923},{0,60,3457},{0,50,2205},{6,179,882}, +{6,121,2},{10,86,69},{3,77,158},{66,0,3048},{0,88,1398},{0,72,469},{0,53,1923},{134,0,3048},{0,53,1923},{3,122,18},{3,122,18},{3,122,18},{3,61,18},{0,73,648},{0,54,157},{0,54,157},{0,31,317},{0,33,756},{0,31,417},{6,116,0},{6,116,0},{6,116,0},{6,60,0},{36,0,648},{0,54,157},{0,54,157},{0,31,317},{73,0,648},{0,31,317},{94,0,882},{2,124,0},{22,84,0}, +{0,77,130},{94,0,882},{192,0,882},{0,77,130},{0,63,882},{192,0,882},{0,63,882},{3,0,18},{3,0,18},{3,0,18},{3,0,18},{0,19,0},{0,19,0},{0,19,0},{0,9,0},{0,9,4},{0,9,4},{8,203,995},{8,136,115},{11,96,290},{6,86,230},{0,161,3048},{0,100,1221},{0,84,250},{0,62,1758},{0,75,3651},{0,60,2156},{15,188,882},{15,130,2},{19,95,69},{12,86,158},{79,0,3048}, +{0,100,1221},{0,84,250},{0,62,1758},{161,0,3048},{0,62,1758},{8,139,113},{8,139,113},{8,139,113},{8,72,113},{0,101,648},{0,72,73},{0,72,73},{0,40,242},{0,45,862},{0,39,409},{15,125,0},{15,125,0},{15,125,0},{15,69,0},{49,0,648},{0,72,73},{0,72,73},{0,40,242},{101,0,648},{0,40,242},{107,0,882},{11,133,0},{31,93,0},{0,87,85},{107,0,882},{219,0,882},{0,87,85}, +{0,72,882},{219,0,882},{0,72,882},{7,0,113},{7,0,113},{7,0,113},{7,0,113},{0,46,0},{0,46,0},{0,46,0},{0,23,0},{0,18,34},{0,18,34},{12,219,1147},{12,146,275},{16,104,510},{11,95,365},{0,186,3048},{0,115,1096},{0,94,114},{0,71,1620},{0,88,3844},{0,69,2137},{23,196,882},{23,138,2},{27,103,69},{20,94,158},{91,0,3048},{0,115,1096},{0,94,114},{0,71,1620},{186,0,3048}, +{0,71,1620},{12,155,265},{12,155,265},{12,155,265},{12,82,265},{0,125,648},{0,84,25},{0,84,25},{0,53,180},{0,54,987},{0,48,427},{23,133,0},{23,133,0},{23,133,0},{23,77,0},{61,0,648},{0,84,25},{0,84,25},{0,53,180},{125,0,648},{0,53,180},{119,0,882},{20,140,0},{39,101,0},{0,96,50},{119,0,882},{243,0,882},{0,96,50},{0,80,882},{243,0,882},{0,80,882},{11,0,265}, +{11,0,265},{11,0,265},{11,0,265},{0,70,0},{0,70,0},{0,70,0},{0,35,0},{0,27,89},{0,27,89},{16,235,1363},{17,157,505},{20,114,802},{14,104,559},{0,210,3048},{0,127,1000},{0,105,34},{0,80,1494},{0,94,4056},{0,78,2148},{31,204,882},{31,145,2},{35,111,69},{27,102,165},{103,0,3048},{0,127,1000},{0,105,34},{0,80,1494},{210,0,3048},{0,80,1494},{16,171,481},{16,171,481},{16,171,481}, +{16,92,481},{0,149,648},{0,100,1},{0,100,1},{0,62,125},{0,66,1139},{0,57,473},{31,140,0},{31,140,0},{31,140,0},{31,85,0},{73,0,648},{0,100,1},{0,100,1},{0,62,125},{149,0,648},{0,62,125},{131,0,882},{28,148,0},{47,109,0},{0,105,25},{131,0,882},{255,6,882},{0,105,25},{0,88,882},{255,6,882},{0,88,882},{15,0,481},{15,0,481},{15,0,481},{15,0,481},{0,95,0}, +{0,95,0},{0,95,0},{0,46,0},{0,39,169},{0,39,169},{20,251,1643},{21,167,805},{25,122,1170},{19,112,822},{0,234,3048},{0,141,933},{1,115,10},{0,90,1395},{0,106,4312},{0,84,2188},{39,212,882},{39,153,2},{43,119,69},{35,110,165},{115,0,3048},{0,141,933},{1,115,9},{0,90,1395},{234,0,3048},{0,90,1395},{20,187,761},{20,187,761},{20,187,761},{19,102,761},{0,174,648},{1,111,5},{1,111,5}, +{0,71,80},{0,75,1322},{0,66,547},{39,148,0},{39,148,0},{39,148,0},{39,93,0},{85,0,648},{5,109,0},{5,109,0},{0,71,80},{174,0,648},{0,71,80},{143,0,882},{36,156,0},{55,117,0},{0,115,8},{143,0,882},{255,18,882},{0,115,8},{0,96,882},{255,18,882},{0,96,882},{19,0,761},{19,0,761},{19,0,761},{19,0,761},{0,119,0},{0,119,0},{0,119,0},{0,58,0},{0,48,274}, +{0,48,274},{29,254,1780},{29,178,935},{33,133,1327},{26,122,936},{6,249,3048},{3,153,909},{8,125,13},{0,99,1314},{0,121,4212},{0,97,1924},{48,221,882},{48,162,2},{52,128,69},{44,119,165},{128,0,3048},{0,156,891},{10,124,9},{0,99,1278},{255,3,3048},{0,99,1278},{27,200,882},{27,200,882},{27,200,882},{27,112,882},{6,189,648},{7,123,11},{7,123,11},{3,80,61},{0,91,1227},{0,75,409},{48,157,0}, +{48,157,0},{48,157,0},{48,102,0},{98,0,648},{14,118,0},{14,118,0},{0,80,41},{201,0,648},{0,80,41},{156,0,882},{45,165,0},{63,126,0},{0,126,0},{156,0,882},{254,32,882},{0,126,0},{0,105,882},{254,32,882},{0,105,882},{27,0,882},{27,0,882},{27,0,882},{27,0,882},{6,134,0},{6,134,0},{6,134,0},{6,69,0},{0,63,232},{0,63,232},{38,254,1814},{37,186,935},{41,141,1327}, +{34,130,936},{15,255,3049},{11,161,909},{16,133,13},{8,107,1314},{0,132,3964},{0,106,1605},{56,229,882},{56,170,2},{60,136,69},{52,127,165},{140,0,3048},{2,167,882},{18,132,9},{0,108,1188},{255,15,3048},{0,108,1188},{35,208,882},{35,208,882},{35,208,882},{35,120,882},{14,196,648},{15,131,11},{15,131,11},{11,88,61},{0,103,1059},{0,88,221},{56,165,0},{56,165,0},{56,165,0},{56,110,0},{110,0,648}, +{22,126,0},{22,126,0},{0,90,20},{225,0,648},{0,90,20},{168,0,882},{53,173,0},{71,134,0},{5,134,0},{168,0,882},{255,43,882},{5,134,0},{0,113,882},{255,43,882},{0,113,882},{35,0,882},{35,0,882},{35,0,882},{35,0,882},{14,142,0},{14,142,0},{14,142,0},{14,77,0},{0,75,136},{0,75,136},{46,255,1854},{45,194,935},{49,149,1327},{42,138,936},{24,255,3064},{19,169,909},{22,141,14}, +{16,115,1314},{0,144,3748},{0,115,1348},{64,237,882},{64,178,2},{68,144,69},{60,135,165},{152,0,3048},{10,175,882},{26,140,9},{0,117,1110},{255,27,3048},{0,117,1110},{43,216,882},{43,216,882},{43,216,882},{43,128,882},{22,204,648},{23,139,11},{23,139,11},{21,95,62},{0,118,922},{0,97,91},{64,173,0},{64,173,0},{64,173,0},{64,117,0},{122,0,648},{30,134,0},{30,134,0},{0,99,5},{249,0,648}, +{0,99,5},{180,0,882},{61,181,0},{79,142,0},{13,142,0},{180,0,882},{255,55,882},{13,142,0},{0,121,882},{255,55,882},{0,121,882},{43,0,882},{43,0,882},{43,0,882},{43,0,882},{22,150,0},{22,150,0},{22,150,0},{22,85,0},{0,91,58},{0,91,58},{55,255,1924},{53,202,935},{57,157,1327},{50,146,936},{36,255,3096},{27,177,909},{30,149,14},{24,123,1314},{0,159,3559},{0,124,1153},{72,245,882}, +{72,186,2},{77,152,65},{68,143,165},{164,0,3048},{19,182,882},{33,148,9},{0,126,1044},{255,39,3048},{0,126,1044},{51,224,882},{51,224,882},{51,224,882},{51,136,882},{30,212,648},{32,147,9},{32,147,9},{28,103,65},{0,129,810},{0,106,21},{72,181,0},{72,181,0},{72,181,0},{72,125,0},{134,0,648},{38,142,0},{38,142,0},{0,108,0},{255,9,648},{0,108,0},{192,0,882},{69,189,0},{87,150,0}, +{21,150,0},{192,0,882},{255,67,882},{21,150,0},{0,129,882},{255,67,882},{0,129,882},{51,0,882},{51,0,882},{51,0,882},{51,0,882},{30,158,0},{30,158,0},{30,158,0},{30,93,0},{0,106,17},{0,106,17},{67,255,2024},{62,211,935},{66,166,1327},{59,155,936},{46,255,3145},{36,186,909},{40,158,10},{33,132,1314},{0,172,3364},{0,133,1012},{81,254,882},{81,195,2},{86,161,65},{77,152,165},{177,0,3048}, +{28,191,882},{42,157,9},{0,136,990},{255,52,3048},{0,136,990},{60,233,882},{60,233,882},{60,233,882},{60,145,882},{39,221,648},{41,156,9},{41,156,9},{37,112,65},{0,144,720},{2,118,3},{81,190,0},{81,190,0},{81,190,0},{81,134,0},{147,0,648},{47,151,0},{47,151,0},{7,117,0},{254,23,648},{7,117,0},{205,0,882},{78,198,0},{96,159,0},{30,159,0},{205,0,882},{254,81,882},{30,159,0}, +{0,138,882},{254,81,882},{0,138,882},{60,0,882},{60,0,882},{60,0,882},{60,0,882},{39,167,0},{39,167,0},{39,167,0},{39,102,0},{0,121,0},{0,121,0},{76,255,2134},{70,218,935},{74,174,1327},{66,163,942},{58,255,3217},{45,193,904},{48,166,10},{41,140,1314},{0,184,3244},{0,145,948},{91,254,888},{89,203,2},{94,169,65},{85,160,165},{189,0,3048},{36,199,882},{50,165,9},{0,145,948},{255,64,3048}, +{0,145,948},{68,241,882},{68,241,882},{68,241,882},{68,153,882},{47,229,648},{49,164,9},{49,164,9},{45,120,65},{0,156,672},{10,126,3},{89,198,0},{89,198,0},{89,198,0},{89,142,0},{159,0,648},{56,158,0},{56,158,0},{15,125,0},{254,35,648},{15,125,0},{217,0,882},{86,206,0},{104,167,0},{38,167,0},{217,0,882},{255,92,882},{38,167,0},{0,146,882},{255,92,882},{0,146,882},{68,0,882}, +{68,0,882},{68,0,882},{68,0,882},{47,174,0},{47,174,0},{47,174,0},{47,109,0},{7,129,0},{7,129,0},{86,255,2252},{78,226,935},{82,182,1327},{74,171,942},{67,255,3300},{53,201,904},{56,174,10},{49,148,1314},{0,199,3151},{3,152,935},{101,255,906},{97,211,2},{102,177,65},{93,168,165},{201,0,3048},{44,207,882},{58,173,9},{0,152,915},{255,76,3048},{0,152,915},{76,249,882},{76,249,882},{76,249,882}, +{76,161,882},{55,237,648},{57,172,9},{57,172,9},{53,128,65},{0,171,649},{18,134,3},{97,206,0},{97,206,0},{97,206,0},{97,150,0},{171,0,648},{64,166,0},{64,166,0},{23,133,0},{255,46,648},{23,133,0},{229,0,882},{94,214,0},{112,175,0},{46,175,0},{229,0,882},{255,104,882},{46,175,0},{0,154,882},{255,104,882},{0,154,882},{76,0,882},{76,0,882},{76,0,882},{76,0,882},{55,182,0}, +{55,182,0},{55,182,0},{55,117,0},{16,136,0},{16,136,0},{95,255,2398},{86,234,935},{90,190,1327},{82,179,942},{76,255,3409},{61,209,904},{64,182,10},{56,155,1318},{0,211,3087},{11,160,935},{110,255,939},{105,219,2},{110,185,65},{101,176,165},{213,0,3048},{52,215,882},{66,181,9},{0,161,893},{254,88,3048},{0,161,893},{84,254,883},{84,254,883},{84,254,883},{84,169,882},{63,245,648},{65,180,9},{65,180,9}, +{61,136,65},{7,179,648},{27,141,2},{105,214,0},{105,214,0},{105,214,0},{105,158,0},{183,0,648},{72,174,0},{72,174,0},{31,141,0},{255,58,648},{31,141,0},{241,0,882},{101,222,0},{120,183,0},{54,183,0},{241,0,882},{255,116,882},{54,183,0},{0,162,882},{255,116,882},{0,162,882},{84,0,882},{84,0,882},{84,0,882},{84,0,882},{63,190,0},{63,190,0},{63,190,0},{63,125,0},{24,144,0}, +{24,144,0},{104,255,2584},{95,243,935},{100,199,1318},{91,188,942},{89,255,3529},{69,219,909},{73,191,10},{65,165,1327},{0,224,3052},{20,169,935},{122,255,996},{114,228,2},{119,194,65},{111,183,171},{226,0,3048},{61,224,882},{75,190,9},{0,171,883},{255,101,3048},{0,171,883},{94,254,893},{94,254,893},{94,254,893},{93,177,882},{72,254,648},{74,189,9},{74,189,9},{70,145,65},{16,188,648},{36,150,2},{114,222,0}, +{114,222,0},{114,222,0},{114,167,0},{196,0,648},{81,183,0},{81,183,0},{39,150,0},{254,72,648},{39,150,0},{254,0,882},{110,231,0},{129,192,0},{63,192,0},{254,0,882},{255,129,882},{63,192,0},{0,171,882},{255,129,882},{0,171,882},{93,0,882},{93,0,882},{93,0,882},{93,0,882},{72,199,0},{72,199,0},{72,199,0},{72,134,0},{33,153,0},{33,153,0},{113,255,2774},{103,251,935},{107,206,1314}, +{99,196,942},{98,255,3672},{77,227,909},{81,199,10},{73,173,1327},{5,235,3048},{28,177,935},{132,255,1054},{121,236,3},{127,202,65},{119,192,173},{238,0,3048},{69,232,882},{83,198,9},{4,179,882},{255,113,3048},{4,179,882},{103,254,915},{103,254,915},{103,254,915},{101,185,882},{82,255,654},{82,197,9},{82,197,9},{78,153,65},{24,196,648},{44,158,2},{122,230,0},{122,230,0},{122,230,0},{122,175,0},{208,0,648}, +{89,191,0},{89,191,0},{47,158,0},{254,84,648},{47,158,0},{255,22,882},{118,239,0},{137,200,0},{71,200,0},{255,22,882},{255,141,882},{71,200,0},{0,179,882},{255,141,882},{0,179,882},{101,0,882},{101,0,882},{101,0,882},{101,0,882},{80,207,0},{80,207,0},{80,207,0},{80,142,0},{41,161,0},{41,161,0},{122,255,2984},{110,255,948},{115,214,1314},{107,204,942},{110,255,3832},{85,235,909},{89,207,10}, +{81,181,1327},{13,243,3048},{36,185,935},{141,255,1131},{129,244,3},{135,210,65},{127,200,173},{250,0,3048},{77,240,882},{91,206,9},{12,187,882},{255,125,3048},{12,187,882},{110,255,948},{110,255,948},{110,255,948},{109,193,882},{92,255,672},{90,205,9},{90,205,9},{86,161,65},{32,204,648},{52,166,2},{130,238,0},{130,238,0},{130,238,0},{130,183,0},{220,0,648},{97,199,0},{97,199,0},{55,166,0},{255,95,648}, +{55,166,0},{255,46,882},{126,247,0},{145,208,0},{79,208,0},{255,46,882},{255,153,882},{79,208,0},{0,187,882},{255,153,882},{0,187,882},{109,0,882},{109,0,882},{109,0,882},{109,0,882},{88,215,0},{88,215,0},{88,215,0},{88,150,0},{49,169,0},{49,169,0},{132,255,3182},{122,255,1012},{123,222,1314},{115,212,942},{119,255,4009},{93,243,909},{97,215,10},{89,189,1327},{21,251,3048},{44,193,935},{150,255,1226}, +{137,252,3},{143,218,65},{135,208,173},{255,13,3048},{83,249,882},{99,214,9},{20,195,882},{254,137,3048},{20,195,882},{119,255,990},{119,255,990},{119,255,990},{117,201,882},{101,255,705},{98,213,9},{98,213,9},{94,169,65},{40,212,648},{60,174,2},{138,246,0},{138,246,0},{138,246,0},{138,191,0},{232,0,648},{104,208,0},{104,208,0},{63,174,0},{255,107,648},{63,174,0},{255,70,882},{134,255,0},{153,216,0}, +{86,216,0},{255,70,882},{255,165,882},{86,216,0},{0,195,882},{255,165,882},{0,195,882},{117,0,882},{117,0,882},{117,0,882},{117,0,882},{96,223,0},{96,223,0},{96,223,0},{96,158,0},{57,177,0},{57,177,0},{141,255,3464},{131,255,1153},{132,231,1314},{124,221,942},{132,255,4209},{102,252,909},{105,224,14},{98,198,1327},{37,255,3060},{53,202,935},{162,255,1349},{149,255,21},{152,227,65},{144,217,173},{255,40,3048}, +{95,255,885},{108,223,9},{29,204,882},{255,150,3048},{29,204,882},{129,255,1044},{129,255,1044},{129,255,1044},{126,210,882},{113,255,762},{107,222,9},{107,222,9},{103,178,65},{49,221,648},{69,183,2},{147,255,0},{147,255,0},{147,255,0},{147,200,0},{245,0,648},{112,217,0},{112,217,0},{72,183,0},{254,121,648},{72,183,0},{255,98,882},{149,255,17},{162,225,0},{95,225,0},{255,98,882},{255,178,882},{95,225,0}, +{0,204,882},{255,178,882},{0,204,882},{126,0,882},{126,0,882},{126,0,882},{126,0,882},{105,232,0},{105,232,0},{105,232,0},{105,167,0},{66,186,0},{66,186,0},{150,255,3734},{140,255,1348},{140,239,1314},{132,229,942},{141,255,4420},{113,255,925},{113,232,14},{106,206,1327},{52,255,3132},{61,210,935},{172,255,1459},{158,255,91},{160,234,62},{152,225,173},{255,64,3048},{110,255,923},{116,232,11},{37,212,882},{255,162,3048}, +{37,212,882},{138,255,1110},{138,255,1110},{138,255,1110},{134,218,882},{122,255,827},{115,229,9},{115,229,9},{111,187,69},{57,229,648},{77,191,2},{156,255,5},{156,255,5},{156,255,5},{155,208,0},{255,4,648},{120,225,0},{120,225,0},{80,191,0},{255,132,648},{80,191,0},{255,122,882},{164,255,58},{170,233,0},{103,233,0},{255,122,882},{255,190,882},{103,233,0},{0,212,882},{255,190,882},{0,212,882},{134,0,882}, +{134,0,882},{134,0,882},{134,0,882},{113,240,0},{113,240,0},{113,240,0},{113,175,0},{74,194,0},{74,194,0},{162,255,4022},{149,255,1605},{148,247,1314},{140,237,942},{150,255,4657},{122,255,1020},{122,239,13},{114,214,1327},{70,255,3256},{69,218,935},{181,255,1598},{167,255,221},{167,244,61},{160,233,173},{255,89,3048},{128,255,1003},{123,240,11},{45,220,882},{254,174,3048},{45,220,882},{147,255,1188},{147,255,1188},{147,255,1188}, +{142,226,882},{132,255,897},{123,237,9},{123,237,9},{119,195,69},{65,237,648},{85,199,2},{165,255,20},{165,255,20},{165,255,20},{163,216,0},{255,28,648},{128,233,0},{128,233,0},{88,199,0},{255,144,648},{88,199,0},{255,146,882},{180,255,136},{178,241,0},{111,241,0},{255,146,882},{255,202,882},{111,241,0},{0,220,882},{255,202,882},{0,220,882},{142,0,882},{142,0,882},{142,0,882},{142,0,882},{121,248,0}, +{121,248,0},{121,248,0},{121,183,0},{82,202,0},{82,202,0},{172,255,4300},{158,255,1924},{156,255,1314},{150,244,943},{162,255,4905},{134,255,1204},{130,247,13},{122,222,1327},{82,255,3448},{77,226,935},{190,255,1755},{180,255,409},{175,252,61},{168,241,173},{255,113,3048},{143,255,1125},{131,248,11},{53,228,882},{254,186,3048},{53,228,882},{156,255,1278},{156,255,1278},{156,255,1278},{150,234,882},{141,255,992},{131,245,9},{131,245,9}, +{127,203,69},{73,245,648},{93,207,2},{175,255,41},{175,255,41},{175,255,41},{171,224,0},{255,52,648},{137,240,0},{137,240,0},{96,207,0},{255,156,648},{96,207,0},{255,171,882},{192,255,232},{186,249,0},{119,249,0},{255,171,882},{254,214,882},{119,249,0},{0,228,882},{254,214,882},{0,228,882},{150,0,882},{150,0,882},{150,0,882},{150,0,882},{129,255,0},{129,255,0},{129,255,0},{129,191,0},{90,210,0}, +{90,210,0},{178,255,4349},{171,255,2188},{165,255,1395},{159,251,923},{172,255,4837},{146,255,1309},{140,254,10},{132,229,1170},{104,255,3433},{88,234,805},{202,255,1725},{189,255,547},{184,255,80},{176,249,133},{255,137,2814},{158,255,1125},{143,254,5},{66,235,761},{254,198,2814},{66,235,761},{165,255,1395},{165,255,1395},{165,255,1395},{159,243,882},{153,255,1115},{140,254,9},{140,254,9},{136,212,69},{81,254,648},{102,216,2},{184,255,80}, +{184,255,80},{184,255,80},{180,233,0},{255,79,648},{146,249,0},{146,249,0},{105,216,0},{253,170,648},{105,216,0},{255,192,761},{207,255,274},{196,255,0},{134,255,0},{255,192,761},{255,224,761},{134,255,0},{0,235,761},{255,224,761},{0,235,761},{159,0,882},{159,0,882},{159,0,882},{159,0,882},{140,254,8},{140,254,8},{140,254,8},{138,200,0},{99,219,0},{99,219,0},{187,255,3903},{177,255,2148},{175,255,1494}, +{167,253,887},{181,255,4274},{155,255,1106},{149,255,34},{140,234,802},{119,255,2958},{98,238,505},{208,255,1361},{198,255,473},{193,255,125},{187,251,53},{255,152,2249},{167,255,857},{155,255,1},{82,239,481},{255,205,2249},{82,239,481},{175,255,1494},{175,255,1494},{175,255,1494},{167,251,882},{162,255,1242},{149,255,34},{149,255,34},{144,220,69},{95,255,670},{110,224,2},{193,255,125},{193,255,125},{193,255,125},{188,241,0},{255,104,648}, +{155,255,1},{155,255,1},{113,224,0},{255,181,648},{113,224,0},{255,204,481},{216,255,169},{208,255,0},{158,255,0},{255,204,481},{255,230,481},{158,255,0},{0,239,481},{255,230,481},{0,239,481},{167,0,882},{167,0,882},{167,0,882},{167,0,882},{149,254,25},{149,254,25},{149,254,25},{146,208,0},{106,227,0},{106,227,0},{193,255,3535},{186,255,2137},{184,255,1620},{175,255,891},{187,255,3794},{167,255,978},{159,255,114}, +{150,238,510},{131,255,2574},{109,243,275},{215,255,1046},{207,255,427},{202,255,180},{195,253,9},{255,171,1769},{183,255,650},{167,255,25},{98,243,265},{254,214,1769},{98,243,265},{184,255,1620},{184,255,1620},{184,255,1620},{175,255,891},{172,255,1364},{159,255,114},{159,255,114},{152,228,69},{113,255,734},{117,232,2},{202,255,180},{202,255,180},{202,255,180},{196,249,0},{255,128,648},{167,255,25},{167,255,25},{120,232,0},{255,193,648}, +{120,232,0},{255,216,265},{228,255,89},{220,255,0},{183,255,0},{255,216,265},{255,236,265},{183,255,0},{0,243,265},{255,236,265},{0,243,265},{175,0,882},{175,0,882},{175,0,882},{175,0,882},{159,255,50},{159,255,50},{159,255,50},{154,216,0},{114,235,0},{114,235,0},{202,255,3229},{195,255,2156},{193,255,1758},{183,255,946},{196,255,3397},{174,255,950},{171,255,250},{158,243,290},{146,255,2281},{119,247,115},{221,255,822}, +{216,255,409},{215,255,242},{204,255,1},{255,186,1374},{195,255,498},{183,255,73},{114,247,113},{255,221,1374},{114,247,113},{193,255,1758},{193,255,1758},{193,255,1758},{183,255,946},{181,255,1521},{171,255,250},{171,255,250},{160,236,69},{128,255,840},{125,240,2},{215,255,242},{215,255,242},{215,255,242},{204,255,1},{255,152,648},{183,255,73},{183,255,73},{128,240,0},{255,205,648},{128,240,0},{255,228,113},{237,255,34},{232,255,0}, +{207,255,0},{255,228,113},{255,242,113},{207,255,0},{0,247,113},{255,242,113},{0,247,113},{183,0,882},{183,0,882},{183,0,882},{183,0,882},{168,255,85},{168,255,85},{168,255,85},{162,224,0},{122,243,0},{122,243,0},{211,255,2974},{205,255,2205},{202,255,1923},{195,255,1069},{205,255,3055},{186,255,981},{180,255,469},{167,249,133},{161,255,2061},{131,252,18},{230,255,645},{224,255,417},{224,255,317},{216,255,45},{255,204,1032}, +{210,255,404},{201,255,157},{131,252,18},{255,230,1032},{131,252,18},{202,255,1923},{202,255,1923},{202,255,1923},{195,255,1069},{193,255,1710},{180,255,469},{180,255,469},{169,245,69},{146,255,1011},{134,249,2},{224,255,317},{224,255,317},{224,255,317},{216,255,45},{255,180,648},{201,255,157},{201,255,157},{137,249,0},{255,218,648},{137,249,0},{255,243,18},{246,255,4},{245,255,0},{234,255,0},{255,243,18},{254,250,18},{234,255,0}, +{0,252,18},{254,250,18},{0,252,18},{192,0,882},{192,0,882},{192,0,882},{192,0,882},{178,255,130},{178,255,130},{178,255,130},{171,233,0},{131,252,0},{131,252,0},{218,255,2682},{211,255,2161},{211,255,1965},{204,255,1170},{215,255,2712},{195,255,1014},{192,255,633},{177,253,61},{167,255,1893},{143,255,5},{236,255,513},{233,255,389},{230,255,337},{225,255,97},{255,219,771},{219,255,342},{213,255,205},{149,255,0},{254,238,771}, +{149,255,0},{211,255,1965},{211,255,1965},{211,255,1965},{204,255,1170},{202,255,1755},{192,255,633},{192,255,633},{178,251,53},{161,255,1085},{143,255,5},{230,255,337},{230,255,337},{230,255,337},{225,255,97},{255,201,578},{213,255,205},{213,255,205},{149,255,0},{254,229,578},{149,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{200,0,882}, +{200,0,882},{200,0,882},{200,0,882},{187,255,185},{187,255,185},{187,255,185},{179,241,0},{143,255,5},{143,255,5},{221,255,2188},{218,255,1802},{215,255,1656},{210,255,1086},{218,255,2117},{204,255,865},{201,255,585},{187,254,11},{183,255,1467},{158,255,34},{242,255,297},{239,255,225},{236,255,193},{231,255,53},{255,225,451},{228,255,192},{222,255,116},{174,255,0},{254,241,451},{174,255,0},{215,255,1656},{215,255,1656},{215,255,1656}, +{210,255,1086},{211,255,1426},{201,255,585},{201,255,585},{186,253,9},{167,255,869},{158,255,34},{236,255,193},{236,255,193},{236,255,193},{231,255,53},{255,213,338},{222,255,116},{222,255,116},{174,255,0},{254,235,338},{174,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{208,0,882},{208,0,882},{208,0,882},{208,0,882},{196,255,250}, +{196,255,250},{196,255,250},{187,249,0},{158,255,34},{158,255,34},{227,255,1772},{224,255,1510},{224,255,1410},{219,255,1021},{224,255,1645},{210,255,761},{208,255,563},{195,255,1},{195,255,1123},{171,255,97},{245,255,136},{242,255,105},{242,255,89},{237,255,25},{255,234,216},{237,255,86},{234,255,52},{198,255,0},{255,245,216},{198,255,0},{224,255,1410},{224,255,1410},{224,255,1410},{219,255,1021},{215,255,1140},{208,255,563},{208,255,563}, +{195,255,1},{186,255,696},{171,255,97},{242,255,89},{242,255,89},{242,255,89},{237,255,25},{255,225,162},{234,255,52},{234,255,52},{198,255,0},{254,241,162},{198,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{216,0,882},{216,0,882},{216,0,882},{216,0,882},{205,255,325},{205,255,325},{205,255,325},{195,255,1},{171,255,97}, +{171,255,97},{0,158,1568},{0,112,169},{0,80,4},{0,68,585},{0,107,3371},{0,69,2124},{0,62,1013},{0,40,2532},{0,48,3617},{0,40,2701},{0,158,1568},{0,112,169},{0,80,4},{0,68,585},{52,0,3371},{0,69,2124},{0,62,1013},{0,40,2532},{107,0,3371},{0,40,2532},{0,73,0},{0,73,0},{0,73,0},{0,36,0},{0,37,288},{0,30,97},{0,30,97},{0,16,164},{0,15,312},{0,16,189},{0,73,0}, +{0,73,0},{0,73,0},{0,36,0},{18,0,288},{0,30,97},{0,30,97},{0,16,164},{37,0,288},{0,16,164},{78,0,1568},{0,112,169},{0,80,4},{0,68,585},{78,0,1568},{158,0,1568},{0,68,585},{0,52,1568},{158,0,1568},{0,52,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,183,1568},{0,124,89},{0,89,10}, +{0,77,482},{0,122,3968},{0,81,2316},{0,69,1041},{0,50,2857},{0,57,4304},{0,47,3092},{0,183,1568},{0,124,89},{2,88,8},{0,77,482},{60,0,3968},{0,81,2316},{0,69,1041},{0,50,2857},{122,0,3968},{0,50,2857},{0,98,0},{0,98,0},{0,98,0},{0,48,0},{0,49,512},{0,39,180},{0,39,180},{0,22,296},{0,21,556},{0,22,345},{0,98,0},{0,98,0},{0,98,0},{0,48,0},{24,0,512}, +{0,39,180},{0,39,180},{0,22,296},{49,0,512},{0,22,296},{89,0,1568},{0,124,89},{5,88,0},{0,77,482},{89,0,1568},{183,0,1568},{0,77,482},{0,60,1568},{183,0,1568},{0,60,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,207,1568},{0,138,34},{2,97,58},{0,83,394},{0,137,4651},{0,91,2507},{0,78,1093}, +{0,56,3225},{0,63,5084},{0,53,3532},{0,207,1568},{0,138,34},{3,98,49},{0,83,394},{67,0,4651},{0,91,2507},{0,78,1093},{0,56,3225},{137,0,4651},{0,56,3225},{0,122,0},{0,122,0},{0,122,0},{0,60,0},{0,61,800},{0,48,289},{0,48,289},{0,28,468},{0,27,872},{0,25,545},{0,122,0},{0,122,0},{0,122,0},{0,60,0},{30,0,800},{0,48,289},{0,48,289},{0,28,468},{61,0,800}, +{0,28,468},{101,0,1568},{0,138,34},{13,96,0},{0,83,394},{101,0,1568},{207,0,1568},{0,83,394},{0,68,1568},{207,0,1568},{0,68,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,231,1568},{0,153,5},{3,107,148},{0,93,317},{0,155,5419},{0,100,2754},{0,88,1161},{0,62,3641},{0,69,5968},{0,59,4028},{0,231,1568}, +{0,153,5},{6,107,126},{0,93,317},{76,0,5419},{0,100,2754},{0,88,1161},{0,62,3641},{155,0,5419},{0,62,3641},{0,146,0},{0,146,0},{0,146,0},{0,72,0},{0,73,1152},{0,57,424},{0,57,424},{0,34,680},{0,33,1260},{0,31,789},{0,146,0},{0,146,0},{0,146,0},{0,72,0},{36,0,1152},{0,57,424},{0,57,424},{0,34,680},{73,0,1152},{0,34,680},{113,0,1568},{0,153,5},{21,104,0}, +{0,93,317},{113,0,1568},{231,0,1568},{0,93,317},{0,76,1568},{231,0,1568},{0,76,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{5,248,1609},{4,166,41},{9,116,259},{2,104,303},{0,183,5419},{0,115,2480},{0,100,798},{0,71,3404},{0,84,6188},{0,68,3926},{9,240,1568},{9,162,5},{15,115,121},{5,104,293},{89,0,5419}, +{0,115,2480},{0,100,798},{0,71,3404},{183,0,5419},{0,71,3404},{5,163,41},{5,163,41},{5,163,41},{4,83,41},{0,101,1152},{0,75,274},{0,75,274},{0,44,569},{0,45,1366},{0,40,747},{9,155,0},{9,155,0},{9,155,0},{9,81,0},{49,0,1152},{0,75,274},{0,75,274},{0,44,569},{101,0,1152},{0,44,569},{127,0,1568},{4,166,0},{30,113,0},{0,105,233},{127,0,1568},{254,2,1568},{0,105,233}, +{0,85,1568},{254,2,1568},{0,85,1568},{4,0,41},{4,0,41},{4,0,41},{4,0,41},{0,28,0},{0,28,0},{0,28,0},{0,14,0},{0,12,10},{0,12,10},{9,255,1731},{9,176,146},{13,126,435},{7,112,374},{0,207,5419},{0,129,2265},{0,109,532},{0,80,3202},{0,94,6384},{0,77,3861},{17,248,1568},{17,170,5},{23,123,121},{13,112,293},{101,0,5419},{0,129,2265},{0,109,532},{0,80,3202},{207,0,5419}, +{0,80,3202},{9,179,145},{9,179,145},{9,179,145},{9,92,145},{0,125,1152},{0,88,157},{0,88,157},{0,53,468},{0,54,1491},{0,50,737},{17,163,0},{17,163,0},{17,163,0},{17,89,0},{61,0,1152},{0,88,157},{0,88,157},{0,53,468},{125,0,1152},{0,53,468},{138,0,1568},{12,174,0},{38,121,0},{0,114,170},{138,0,1568},{254,14,1568},{0,114,170},{0,93,1568},{254,14,1568},{0,93,1568},{8,0,145}, +{8,0,145},{8,0,145},{8,0,145},{0,52,0},{0,52,0},{0,52,0},{0,26,0},{0,21,45},{0,21,45},{15,255,1991},{13,189,321},{18,134,687},{10,121,510},{0,231,5419},{0,141,2081},{0,121,324},{0,90,3035},{0,106,6640},{0,87,3833},{26,254,1569},{25,178,5},{31,131,121},{21,120,293},{113,0,5419},{0,141,2081},{0,121,324},{0,90,3035},{231,0,5419},{0,90,3035},{13,195,313},{13,195,313},{13,195,313}, +{13,102,313},{0,149,1152},{0,103,80},{0,103,80},{0,62,377},{0,66,1643},{0,57,749},{25,171,0},{25,171,0},{25,171,0},{25,97,0},{73,0,1152},{0,103,80},{0,103,80},{0,62,377},{149,0,1152},{0,62,377},{150,0,1568},{21,181,0},{46,129,0},{0,123,117},{150,0,1568},{254,26,1568},{0,123,117},{0,101,1568},{254,26,1568},{0,101,1568},{12,0,313},{12,0,313},{12,0,313},{12,0,313},{0,76,0}, +{0,76,0},{0,76,0},{0,38,0},{0,30,106},{0,30,106},{24,255,2387},{17,199,565},{23,142,1015},{15,129,713},{0,255,5419},{0,156,1924},{0,130,166},{0,99,2857},{0,115,6921},{0,94,3818},{36,255,1579},{33,187,4},{39,139,121},{29,128,293},{125,0,5419},{0,156,1924},{0,130,166},{0,99,2857},{255,0,5419},{0,99,2857},{17,212,545},{17,212,545},{17,212,545},{17,112,545},{0,174,1152},{0,118,29},{0,118,29}, +{0,71,296},{0,75,1826},{0,66,787},{33,179,0},{33,179,0},{33,179,0},{33,104,0},{85,0,1152},{0,118,29},{0,118,29},{0,71,296},{174,0,1152},{0,71,296},{162,0,1568},{29,189,0},{54,137,0},{0,133,80},{162,0,1568},{254,38,1568},{0,133,80},{0,109,1568},{254,38,1568},{0,109,1568},{16,0,545},{16,0,545},{16,0,545},{16,0,545},{0,101,0},{0,101,0},{0,101,0},{0,49,0},{0,39,193}, +{0,39,193},{30,255,3004},{22,210,924},{28,153,1470},{19,140,1026},{6,255,5520},{0,172,1772},{0,142,57},{0,108,2668},{0,127,7276},{0,103,3836},{46,255,1602},{41,195,3},{48,148,121},{38,137,293},{138,0,5419},{0,172,1772},{0,142,57},{0,108,2668},{254,14,5419},{0,108,2668},{21,231,882},{21,231,882},{21,231,882},{21,124,882},{0,201,1152},{0,132,2},{0,132,2},{0,83,218},{0,88,2034},{0,75,865},{42,188,0}, +{42,188,0},{42,188,0},{42,113,0},{98,0,1152},{0,132,2},{0,132,2},{0,83,218},{201,0,1152},{0,83,218},{175,0,1568},{38,198,0},{63,146,0},{0,142,41},{175,0,1568},{254,51,1568},{0,142,41},{0,118,1568},{254,51,1568},{0,118,1568},{21,0,882},{21,0,882},{21,0,882},{21,0,882},{0,128,0},{0,128,0},{0,128,0},{0,63,0},{0,51,320},{0,51,320},{36,255,3708},{27,221,1316},{33,161,1956}, +{24,148,1369},{15,255,5777},{0,184,1676},{0,151,19},{0,117,2514},{0,138,7620},{0,112,3881},{55,255,1643},{49,203,3},{56,156,121},{46,145,293},{150,0,5419},{0,184,1676},{0,151,19},{0,117,2514},{254,26,5419},{0,117,2514},{25,247,1250},{25,247,1250},{25,247,1250},{25,134,1250},{0,225,1152},{1,147,3},{1,147,3},{0,90,164},{0,100,2274},{0,84,961},{50,196,0},{50,196,0},{50,196,0},{50,121,0},{110,0,1152}, +{5,143,0},{5,143,0},{0,90,164},{225,0,1152},{0,90,164},{187,0,1568},{46,206,0},{71,154,0},{0,151,18},{187,0,1568},{254,63,1568},{0,151,18},{0,126,1568},{254,63,1568},{0,126,1568},{25,0,1250},{25,0,1250},{25,0,1250},{25,0,1250},{0,152,0},{0,152,0},{0,152,0},{0,75,0},{0,60,461},{0,60,461},{43,255,4356},{32,232,1665},{38,169,2370},{29,156,1670},{21,255,6121},{0,196,1616},{3,161,20}, +{0,126,2376},{0,150,7804},{0,121,3804},{67,255,1699},{57,211,3},{64,164,121},{54,153,293},{162,0,5419},{0,196,1612},{5,160,17},{0,126,2372},{254,38,5419},{0,126,2372},{30,255,1572},{30,255,1572},{30,255,1572},{30,143,1568},{2,245,1152},{4,159,17},{4,159,17},{0,99,117},{0,109,2403},{0,94,953},{58,204,0},{58,204,0},{58,204,0},{58,129,0},{122,0,1152},{13,151,0},{13,151,0},{0,99,113},{249,0,1152}, +{0,99,113},{199,0,1568},{54,214,0},{79,162,0},{0,160,5},{199,0,1568},{254,75,1568},{0,160,5},{0,134,1568},{254,75,1568},{0,134,1568},{30,0,1568},{30,0,1568},{30,0,1568},{30,0,1568},{2,172,0},{2,172,0},{2,172,0},{2,86,0},{0,72,541},{0,72,541},{52,255,4586},{40,240,1665},{47,177,2355},{37,164,1670},{33,255,6289},{7,206,1615},{11,169,20},{1,134,2353},{0,162,7444},{0,130,3321},{76,255,1766}, +{65,219,3},{72,172,121},{61,161,302},{174,0,5419},{0,211,1577},{13,168,17},{0,133,2259},{255,49,5419},{0,133,2259},{39,255,1586},{39,255,1586},{39,255,1586},{38,151,1568},{10,253,1152},{12,167,17},{12,167,17},{7,109,115},{0,124,2150},{0,103,659},{66,211,0},{66,211,0},{66,211,0},{66,137,0},{134,0,1152},{21,159,0},{21,159,0},{0,108,72},{255,9,1152},{0,108,72},{211,0,1568},{62,222,0},{86,170,0}, +{0,170,0},{211,0,1568},{255,86,1568},{0,170,0},{0,142,1568},{255,86,1568},{0,142,1568},{38,0,1568},{38,0,1568},{38,0,1568},{38,0,1568},{10,180,0},{10,180,0},{10,180,0},{10,93,0},{0,88,373},{0,88,373},{64,255,4866},{49,249,1665},{55,188,2353},{46,173,1670},{43,255,6476},{16,215,1615},{20,178,20},{10,143,2353},{0,178,7036},{0,139,2856},{86,255,1851},{75,228,5},{81,181,121},{70,170,302},{187,0,5419}, +{4,222,1568},{22,177,17},{0,145,2124},{254,63,5419},{0,145,2124},{49,255,1612},{49,255,1612},{49,255,1612},{47,160,1568},{21,255,1158},{21,176,17},{21,176,17},{16,118,115},{0,138,1900},{0,115,392},{75,220,0},{75,220,0},{75,220,0},{75,146,0},{147,0,1152},{30,168,0},{30,168,0},{0,120,34},{254,23,1152},{0,120,34},{224,0,1568},{71,231,0},{95,179,0},{7,179,0},{224,0,1568},{254,100,1568},{7,179,0}, +{0,151,1568},{254,100,1568},{0,151,1568},{47,0,1568},{47,0,1568},{47,0,1568},{47,0,1568},{19,189,0},{19,189,0},{19,189,0},{19,102,0},{0,103,232},{0,103,232},{73,255,5136},{57,254,1666},{63,196,2353},{54,181,1670},{55,255,6684},{24,223,1615},{28,186,20},{18,151,2353},{0,190,6740},{0,151,2504},{95,255,1954},{83,236,5},{89,189,121},{78,178,302},{199,0,5419},{12,230,1568},{30,185,17},{0,154,2018},{254,75,5419}, +{0,154,2018},{58,255,1650},{58,255,1650},{58,255,1650},{55,168,1568},{30,255,1179},{29,184,17},{29,184,17},{24,126,115},{0,150,1708},{0,127,216},{83,228,0},{83,228,0},{83,228,0},{83,154,0},{159,0,1152},{38,176,0},{38,176,0},{0,130,17},{254,35,1152},{0,130,17},{236,0,1568},{78,240,0},{103,187,0},{15,187,0},{236,0,1568},{254,112,1568},{15,187,0},{0,159,1568},{254,112,1568},{0,159,1568},{55,0,1568}, +{55,0,1568},{55,0,1568},{55,0,1568},{27,197,0},{27,197,0},{27,197,0},{27,110,0},{0,115,136},{0,115,136},{82,255,5426},{67,255,1701},{71,204,2353},{62,189,1670},{64,255,6905},{32,231,1615},{36,194,20},{26,159,2353},{0,202,6476},{0,160,2211},{107,255,2066},{91,244,5},{97,197,121},{86,186,302},{211,0,5419},{20,238,1568},{38,193,17},{0,160,1922},{255,86,5419},{0,160,1922},{67,255,1700},{67,255,1700},{67,255,1700}, +{63,176,1568},{39,255,1218},{37,192,17},{37,192,17},{32,134,115},{0,165,1545},{0,136,90},{91,236,0},{91,236,0},{91,236,0},{91,162,0},{171,0,1152},{46,184,0},{46,184,0},{0,139,4},{255,46,1152},{0,139,4},{248,0,1568},{85,248,0},{111,195,0},{23,195,0},{248,0,1568},{254,124,1568},{23,195,0},{0,167,1568},{254,124,1568},{0,167,1568},{63,0,1568},{63,0,1568},{63,0,1568},{63,0,1568},{35,205,0}, +{35,205,0},{35,205,0},{35,118,0},{0,129,65},{0,129,65},{92,255,5700},{76,255,1798},{79,212,2353},{70,197,1670},{73,255,7152},{40,239,1615},{44,202,20},{34,167,2353},{0,215,6213},{0,169,1980},{116,255,2195},{99,252,5},{104,206,115},{94,194,302},{223,0,5419},{28,246,1568},{46,201,17},{0,169,1836},{255,98,5419},{0,169,1836},{76,255,1762},{76,255,1762},{76,255,1762},{71,184,1568},{49,255,1260},{45,200,17},{45,200,17}, +{40,142,115},{0,178,1395},{0,145,24},{99,244,0},{99,244,0},{99,244,0},{99,170,0},{183,0,1152},{54,192,0},{54,192,0},{0,147,0},{255,58,1152},{0,147,0},{255,10,1568},{94,254,1},{119,203,0},{31,203,0},{255,10,1568},{255,135,1568},{31,203,0},{0,175,1568},{255,135,1568},{0,175,1568},{71,0,1568},{71,0,1568},{71,0,1568},{71,0,1568},{43,213,0},{43,213,0},{43,213,0},{43,126,0},{0,144,20}, +{0,144,20},{101,255,6066},{86,255,1980},{88,221,2353},{79,206,1670},{86,255,7408},{49,248,1615},{53,211,20},{43,176,2353},{0,230,5988},{0,179,1798},{129,255,2347},{110,255,24},{113,215,115},{103,203,302},{236,0,5419},{37,255,1568},{55,210,17},{0,179,1762},{254,112,5419},{0,179,1762},{86,255,1836},{86,255,1836},{86,255,1836},{80,193,1568},{61,255,1331},{54,209,17},{54,209,17},{49,151,115},{0,193,1281},{3,156,5},{108,253,0}, +{108,253,0},{108,253,0},{108,179,0},{196,0,1152},{63,201,0},{63,201,0},{9,156,0},{254,72,1152},{9,156,0},{255,37,1568},{110,255,20},{128,212,0},{40,212,0},{255,37,1568},{254,149,1568},{40,212,0},{0,184,1568},{254,149,1568},{0,184,1568},{80,0,1568},{80,0,1568},{80,0,1568},{80,0,1568},{52,222,0},{52,222,0},{52,222,0},{52,135,0},{0,159,1},{0,159,1},{110,255,6416},{95,255,2211},{96,229,2353}, +{86,213,1674},{95,255,7689},{58,254,1616},{61,219,20},{51,184,2353},{0,242,5820},{0,188,1701},{138,255,2502},{119,255,90},{121,223,115},{111,211,302},{248,0,5419},{52,255,1595},{63,218,17},{0,188,1700},{254,124,5419},{0,188,1700},{95,255,1922},{95,255,1922},{95,255,1922},{88,201,1568},{70,255,1414},{62,217,17},{62,217,17},{58,158,121},{0,205,1209},{11,164,5},{116,255,4},{116,255,4},{116,255,4},{116,187,0},{208,0,1152}, +{70,209,0},{70,209,0},{17,164,0},{254,84,1152},{17,164,0},{255,61,1568},{125,255,65},{136,220,0},{48,220,0},{255,61,1568},{254,161,1568},{48,220,0},{0,192,1568},{254,161,1568},{0,192,1568},{88,0,1568},{88,0,1568},{88,0,1568},{88,0,1568},{60,230,0},{60,230,0},{60,230,0},{60,143,0},{7,169,0},{7,169,0},{119,255,6786},{104,255,2504},{104,237,2353},{94,222,1676},{107,255,7985},{68,255,1665},{69,227,20}, +{59,192,2353},{0,254,5684},{0,197,1666},{147,255,2675},{128,255,216},{129,231,115},{119,219,302},{255,10,5419},{67,255,1665},{71,226,17},{0,197,1650},{255,135,5419},{0,197,1650},{101,255,2018},{101,255,2018},{101,255,2018},{96,209,1568},{82,255,1510},{70,224,17},{70,224,17},{66,166,121},{0,218,1163},{19,172,5},{125,255,17},{125,255,17},{125,255,17},{124,195,0},{220,0,1152},{78,217,0},{78,217,0},{25,172,0},{255,95,1152}, +{25,172,0},{255,86,1568},{140,255,136},{144,228,0},{56,228,0},{255,86,1568},{255,172,1568},{56,228,0},{0,200,1568},{255,172,1568},{0,200,1568},{96,0,1568},{96,0,1568},{96,0,1568},{96,0,1568},{68,238,0},{68,238,0},{68,238,0},{68,151,0},{15,177,0},{15,177,0},{129,255,7124},{116,255,2856},{112,245,2353},{102,230,1676},{116,255,8300},{79,255,1802},{77,235,20},{67,200,2353},{7,255,5788},{5,206,1665},{156,255,2866}, +{140,255,392},{137,239,115},{127,227,302},{255,34,5419},{82,255,1779},{79,234,17},{0,206,1612},{255,147,5419},{0,206,1612},{110,255,2124},{110,255,2124},{110,255,2124},{104,217,1568},{92,255,1608},{78,232,17},{78,232,17},{74,174,121},{1,231,1152},{27,180,5},{135,255,34},{135,255,34},{135,255,34},{132,203,0},{232,0,1152},{86,225,0},{86,225,0},{33,180,0},{255,107,1152},{33,180,0},{255,110,1568},{152,255,232},{152,236,0}, +{64,236,0},{255,110,1568},{255,184,1568},{64,236,0},{0,208,1568},{255,184,1568},{0,208,1568},{104,0,1568},{104,0,1568},{104,0,1568},{104,0,1568},{76,246,0},{76,246,0},{76,246,0},{76,159,0},{24,184,0},{24,184,0},{138,255,7586},{125,255,3321},{121,254,2353},{111,239,1676},{129,255,8636},{92,255,2092},{86,244,20},{78,208,2355},{28,255,6049},{14,215,1665},{168,255,3097},{152,255,659},{146,248,115},{136,236,302},{255,61,5419}, +{101,255,1977},{88,243,17},{0,216,1586},{254,161,5419},{0,216,1586},{122,255,2259},{122,255,2259},{122,255,2259},{113,226,1568},{101,255,1746},{87,241,17},{87,241,17},{83,183,121},{10,240,1152},{36,190,3},{147,255,72},{147,255,72},{147,255,72},{141,212,0},{245,0,1152},{95,234,0},{95,234,0},{42,189,0},{254,121,1152},{42,189,0},{255,137,1568},{167,255,373},{161,245,0},{73,245,0},{255,137,1568},{254,198,1568},{73,245,0}, +{0,217,1568},{254,198,1568},{0,217,1568},{113,0,1568},{113,0,1568},{113,0,1568},{113,0,1568},{85,254,0},{85,254,0},{85,254,0},{85,168,0},{33,193,0},{33,193,0},{147,255,8016},{134,255,3804},{129,255,2376},{119,247,1676},{138,255,8985},{104,255,2436},{94,252,20},{85,216,2370},{40,255,6353},{22,223,1665},{178,255,3291},{161,255,953},{156,255,117},{146,243,305},{255,86,5419},{119,255,2185},{96,251,17},{0,225,1572},{255,172,5419}, +{0,225,1572},{129,255,2372},{129,255,2372},{129,255,2372},{121,233,1568},{113,255,1890},{95,249,17},{95,249,17},{91,191,121},{18,248,1152},{44,198,3},{156,255,113},{156,255,113},{156,255,113},{149,220,0},{255,4,1152},{103,242,0},{103,242,0},{49,197,0},{255,132,1152},{49,197,0},{255,161,1568},{183,255,541},{169,253,0},{80,253,0},{255,161,1568},{254,210,1568},{80,253,0},{0,225,1568},{254,210,1568},{0,225,1568},{121,0,1568}, +{121,0,1568},{121,0,1568},{121,0,1568},{94,254,5},{94,254,5},{94,254,5},{93,176,0},{41,201,0},{41,201,0},{156,255,7638},{143,255,3881},{138,255,2514},{128,250,1620},{147,255,8460},{113,255,2285},{104,255,19},{94,222,1956},{58,255,5932},{34,228,1316},{184,255,2947},{171,255,961},{165,255,164},{152,246,206},{255,104,4803},{131,255,1925},{108,254,3},{6,230,1250},{255,181,4803},{6,230,1250},{138,255,2514},{138,255,2514},{138,255,2514}, +{129,241,1568},{122,255,2043},{104,255,19},{104,255,19},{99,199,121},{28,255,1153},{52,206,3},{165,255,164},{165,255,164},{165,255,164},{157,228,0},{255,28,1152},{111,250,0},{111,250,0},{57,205,0},{255,144,1152},{57,205,0},{255,177,1250},{195,255,461},{180,255,0},{101,255,0},{255,177,1250},{254,217,1250},{101,255,0},{0,230,1250},{254,217,1250},{0,230,1250},{129,0,1568},{129,0,1568},{129,0,1568},{129,0,1568},{104,255,18}, +{104,255,18},{104,255,18},{101,184,0},{49,209,0},{49,209,0},{165,255,7060},{152,255,3836},{147,255,2668},{137,253,1576},{156,255,7717},{122,255,2020},{113,255,57},{102,227,1470},{73,255,5307},{44,232,924},{193,255,2466},{180,255,865},{172,255,218},{162,250,98},{255,119,4056},{143,255,1557},{122,255,2},{22,234,882},{254,189,4056},{22,234,882},{147,255,2668},{147,255,2668},{147,255,2668},{137,249,1568},{132,255,2193},{113,255,57},{113,255,57}, +{107,207,121},{40,255,1185},{60,214,3},{172,255,218},{172,255,218},{172,255,218},{165,236,0},{255,52,1152},{122,255,2},{122,255,2},{65,213,0},{255,156,1152},{65,213,0},{255,189,882},{204,255,320},{192,255,0},{125,255,0},{255,189,882},{254,223,882},{125,255,0},{0,234,882},{254,223,882},{0,234,882},{137,0,1568},{137,0,1568},{137,0,1568},{137,0,1568},{113,255,41},{113,255,41},{113,255,41},{109,192,0},{57,217,0}, +{57,217,0},{172,255,6429},{161,255,3818},{156,255,2857},{146,255,1572},{165,255,6979},{134,255,1813},{125,255,166},{113,232,1015},{82,255,4731},{56,238,565},{199,255,2010},{189,255,787},{184,255,296},{173,252,26},{255,137,3318},{155,255,1221},{137,255,29},{41,238,545},{254,198,3318},{41,238,545},{156,255,2857},{156,255,2857},{156,255,2857},{146,255,1572},{141,255,2403},{125,255,166},{125,255,166},{116,216,121},{61,255,1273},{68,222,4},{184,255,296}, +{184,255,296},{184,255,296},{174,245,0},{255,79,1152},{137,255,29},{137,255,29},{74,222,0},{253,170,1152},{74,222,0},{255,201,545},{216,255,193},{205,255,0},{152,255,0},{255,201,545},{254,229,545},{152,255,0},{0,238,545},{254,229,545},{0,238,545},{146,0,1568},{146,0,1568},{146,0,1568},{146,0,1568},{122,255,80},{122,255,80},{122,255,80},{118,201,0},{66,226,0},{66,226,0},{178,255,5997},{168,255,3833},{165,255,3035}, +{155,255,1619},{172,255,6365},{143,255,1710},{134,255,324},{121,237,687},{101,255,4330},{66,242,321},{208,255,1673},{198,255,749},{193,255,377},{182,255,1},{255,152,2753},{167,255,989},{152,255,80},{57,242,313},{255,205,2753},{57,242,313},{165,255,3035},{165,255,3035},{165,255,3035},{155,255,1619},{153,255,2603},{134,255,324},{134,255,324},{124,224,121},{76,255,1395},{76,230,5},{193,255,377},{193,255,377},{193,255,377},{182,253,0},{255,104,1152}, +{152,255,80},{152,255,80},{82,230,0},{255,181,1152},{82,230,0},{255,213,313},{225,255,106},{217,255,0},{177,255,0},{255,213,313},{254,235,313},{177,255,0},{0,242,313},{254,235,313},{0,242,313},{154,0,1568},{154,0,1568},{154,0,1568},{154,0,1568},{132,255,117},{132,255,117},{132,255,117},{126,209,0},{74,234,0},{74,234,0},{187,255,5627},{178,255,3861},{175,255,3202},{164,255,1720},{178,255,5889},{152,255,1685},{146,255,532}, +{129,242,435},{116,255,3993},{79,246,146},{215,255,1382},{205,255,737},{202,255,468},{192,255,13},{255,171,2273},{180,255,850},{167,255,157},{74,246,145},{254,214,2273},{74,246,145},{175,255,3202},{175,255,3202},{175,255,3202},{164,255,1720},{162,255,2818},{146,255,532},{146,255,532},{132,232,121},{92,255,1584},{84,238,5},{202,255,468},{202,255,468},{202,255,468},{192,255,13},{255,128,1152},{167,255,157},{167,255,157},{90,238,0},{255,193,1152}, +{90,238,0},{255,225,145},{234,255,45},{229,255,0},{201,255,0},{255,225,145},{254,241,145},{201,255,0},{0,246,145},{254,241,145},{0,246,145},{162,0,1568},{162,0,1568},{162,0,1568},{162,0,1568},{141,255,170},{141,255,170},{141,255,170},{134,217,0},{80,243,0},{80,243,0},{193,255,5331},{187,255,3926},{184,255,3404},{174,255,1889},{187,255,5490},{161,255,1738},{155,255,798},{139,246,259},{128,255,3745},{88,251,41},{221,255,1182}, +{215,255,747},{211,255,569},{201,255,73},{255,186,1878},{192,255,746},{180,255,274},{90,250,41},{255,221,1878},{90,250,41},{184,255,3404},{184,255,3404},{184,255,3404},{174,255,1889},{172,255,3020},{155,255,798},{155,255,798},{140,240,121},{107,255,1798},{92,246,5},{211,255,569},{211,255,569},{211,255,569},{201,255,73},{255,152,1152},{180,255,274},{180,255,274},{98,246,0},{255,205,1152},{98,246,0},{255,237,41},{243,255,10},{241,255,0}, +{225,255,0},{255,237,41},{254,247,41},{225,255,0},{0,250,41},{254,247,41},{0,250,41},{170,0,1568},{170,0,1568},{170,0,1568},{170,0,1568},{150,255,233},{150,255,233},{150,255,233},{142,225,0},{88,251,0},{88,251,0},{202,255,5076},{196,255,4028},{193,255,3641},{183,255,2129},{196,255,5148},{174,255,1917},{167,255,1161},{147,251,148},{143,255,3577},{101,255,5},{230,255,1041},{224,255,789},{221,255,680},{210,255,205},{255,204,1536}, +{207,255,706},{198,255,424},{107,255,0},{255,230,1536},{107,255,0},{193,255,3641},{193,255,3641},{193,255,3641},{183,255,2129},{184,255,3299},{167,255,1161},{167,255,1161},{148,249,126},{125,255,2089},{101,255,5},{221,255,680},{221,255,680},{221,255,680},{210,255,205},{255,180,1152},{198,255,424},{198,255,424},{107,255,0},{255,218,1152},{107,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0}, +{0,255,0},{255,254,0},{0,255,0},{179,0,1568},{179,0,1568},{179,0,1568},{179,0,1568},{162,255,317},{162,255,317},{162,255,317},{151,234,0},{101,255,5},{101,255,5},{208,255,4372},{202,255,3532},{199,255,3225},{189,255,2017},{202,255,4324},{180,255,1693},{177,255,1093},{157,252,58},{155,255,2953},{116,255,34},{233,255,716},{230,255,545},{227,255,468},{219,255,137},{255,213,1067},{213,255,482},{207,255,289},{131,255,0},{254,235,1067}, +{131,255,0},{199,255,3225},{199,255,3225},{199,255,3225},{189,255,2017},{190,255,2819},{177,255,1093},{177,255,1093},{157,252,49},{137,255,1737},{116,255,34},{227,255,468},{227,255,468},{227,255,468},{219,255,137},{255,192,800},{207,255,289},{207,255,289},{131,255,0},{255,224,800},{131,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{187,0,1568}, +{187,0,1568},{187,0,1568},{187,0,1568},{172,255,394},{172,255,394},{172,255,394},{159,242,0},{116,255,34},{116,255,34},{215,255,3720},{208,255,3092},{205,255,2857},{198,255,1910},{208,255,3604},{189,255,1510},{183,255,1041},{165,254,10},{164,255,2420},{131,255,89},{239,255,456},{233,255,345},{233,255,296},{225,255,85},{255,219,683},{222,255,300},{216,255,180},{155,255,0},{254,238,683},{155,255,0},{205,255,2857},{205,255,2857},{205,255,2857}, +{198,255,1910},{196,255,2411},{183,255,1041},{183,255,1041},{167,253,8},{149,255,1449},{131,255,89},{233,255,296},{233,255,296},{233,255,296},{225,255,85},{255,204,512},{216,255,180},{216,255,180},{155,255,0},{255,230,512},{155,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{195,0,1568},{195,0,1568},{195,0,1568},{195,0,1568},{178,255,482}, +{178,255,482},{178,255,482},{167,250,0},{131,255,89},{131,255,89},{218,255,3170},{215,255,2701},{215,255,2532},{207,255,1825},{215,255,2956},{198,255,1373},{192,255,1013},{175,255,4},{167,255,2025},{143,255,169},{242,255,249},{239,255,189},{239,255,164},{234,255,45},{255,228,384},{231,255,162},{225,255,97},{180,255,0},{255,242,384},{180,255,0},{215,255,2532},{215,255,2532},{215,255,2532},{207,255,1825},{205,255,2070},{192,255,1013},{192,255,1013}, +{175,255,4},{161,255,1225},{143,255,169},{239,255,164},{239,255,164},{239,255,164},{234,255,45},{255,216,288},{225,255,97},{225,255,97},{180,255,0},{255,236,288},{180,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{203,0,1568},{203,0,1568},{203,0,1568},{203,0,1568},{187,255,585},{187,255,585},{187,255,585},{175,255,4},{143,255,169}, +{143,255,169},{0,210,2665},{0,147,274},{0,106,1},{0,90,985},{0,140,5885},{0,94,3649},{0,81,1742},{0,56,4398},{0,63,6341},{0,56,4722},{0,210,2665},{0,147,274},{0,106,1},{0,90,985},{69,0,5885},{0,94,3649},{0,81,1742},{0,56,4398},{140,0,5885},{0,56,4398},{0,101,0},{0,101,0},{0,101,0},{0,49,0},{0,49,545},{0,39,193},{0,39,193},{0,22,317},{0,21,593},{0,22,366},{0,101,0}, +{0,101,0},{0,101,0},{0,49,0},{24,0,545},{0,39,193},{0,39,193},{0,22,317},{49,0,545},{0,22,317},{103,0,2665},{0,147,274},{0,106,1},{0,90,985},{103,0,2665},{210,0,2665},{0,90,985},{0,69,2665},{210,0,2665},{0,69,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,234,2665},{0,162,169},{1,114,11}, +{0,99,850},{0,158,6669},{0,103,3898},{0,91,1770},{0,62,4826},{0,72,7238},{0,62,5226},{0,234,2665},{0,162,169},{2,115,9},{0,99,850},{78,0,6669},{0,103,3898},{0,91,1770},{0,62,4826},{158,0,6669},{0,62,4826},{0,125,0},{0,125,0},{0,125,0},{0,61,0},{0,61,841},{0,51,305},{0,51,305},{0,28,493},{0,27,917},{0,28,574},{0,125,0},{0,125,0},{0,125,0},{0,61,0},{30,0,841}, +{0,51,305},{0,51,305},{0,28,493},{61,0,841},{0,28,493},{115,0,2665},{0,162,169},{6,114,0},{0,99,850},{115,0,2665},{234,0,2665},{0,99,850},{0,77,2665},{234,0,2665},{0,77,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,255,2669},{0,175,80},{2,124,61},{0,108,725},{0,174,7538},{0,115,4178},{0,100,1832}, +{0,71,5294},{0,78,8238},{0,68,5786},{2,254,2669},{0,175,80},{4,123,53},{0,108,725},{85,0,7538},{0,115,4178},{0,100,1832},{0,71,5294},{174,0,7538},{0,71,5294},{0,149,0},{0,149,0},{0,149,0},{0,73,0},{0,73,1201},{0,60,442},{0,60,442},{0,34,709},{0,33,1313},{0,31,824},{0,149,0},{0,149,0},{0,149,0},{0,73,0},{36,0,1201},{0,60,442},{0,60,442},{0,34,709},{73,0,1201}, +{0,34,709},{127,0,2665},{0,175,80},{14,122,0},{0,108,725},{127,0,2665},{254,2,2665},{0,108,725},{0,85,2665},{254,2,2665},{0,85,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,255,2795},{0,190,29},{3,134,155},{0,117,610},{0,189,8493},{0,124,4485},{0,109,1922},{0,77,5810},{0,88,9310},{0,74,6402},{6,255,2761}, +{0,190,29},{6,134,133},{0,117,610},{92,0,8493},{0,124,4485},{0,109,1922},{0,77,5810},{189,0,8493},{0,77,5810},{0,174,0},{0,174,0},{0,174,0},{0,85,0},{0,85,1625},{0,69,605},{0,69,605},{0,40,965},{0,39,1781},{0,37,1120},{0,174,0},{0,174,0},{0,174,0},{0,85,0},{42,0,1625},{0,69,605},{0,69,605},{0,40,965},{85,0,1625},{0,40,965},{138,0,2665},{0,190,29},{22,130,0}, +{0,117,610},{138,0,2665},{254,14,2665},{0,117,610},{0,93,2665},{254,14,2665},{0,93,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{9,255,3139},{0,205,2},{5,145,311},{0,126,493},{0,207,9669},{0,135,4865},{0,118,2054},{0,83,6450},{0,94,10654},{0,80,7162},{12,255,3029},{0,205,2},{9,143,266},{0,126,493},{101,0,9669}, +{0,135,4865},{0,118,2054},{0,83,6450},{207,0,9669},{0,83,6450},{0,201,0},{0,201,0},{0,201,0},{0,98,0},{0,101,2178},{0,81,820},{0,81,820},{0,47,1322},{0,45,2392},{0,40,1521},{0,201,0},{0,201,0},{0,201,0},{0,98,0},{49,0,2178},{0,81,820},{0,81,820},{0,47,1322},{101,0,2178},{0,47,1322},{152,0,2665},{0,205,2},{30,139,0},{0,126,493},{152,0,2665},{255,27,2665},{0,126,493}, +{0,102,2665},{255,27,2665},{0,102,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{15,255,3483},{4,217,32},{10,153,429},{2,135,473},{0,231,9669},{0,150,4526},{0,127,1610},{0,93,6193},{0,106,10910},{0,90,7050},{24,255,3141},{8,213,2},{17,151,266},{2,135,469},{113,0,9669},{0,150,4526},{0,127,1610},{0,93,6193},{231,0,9669}, +{0,93,6193},{4,217,32},{4,217,32},{4,217,32},{4,108,32},{0,125,2178},{0,94,605},{0,94,605},{0,56,1165},{0,54,2517},{0,50,1457},{8,209,0},{8,209,0},{8,209,0},{8,106,0},{61,0,2178},{0,94,605},{0,94,605},{0,56,1165},{125,0,2178},{0,56,1165},{164,0,2665},{5,216,0},{38,147,0},{0,136,410},{164,0,2665},{255,39,2665},{0,136,410},{0,110,2665},{255,39,2665},{0,110,2665},{4,0,32}, +{4,0,32},{4,0,32},{4,0,32},{0,25,0},{0,25,0},{0,25,0},{0,12,0},{0,9,8},{0,9,8},{21,255,3971},{8,227,132},{15,161,623},{5,144,523},{0,255,9669},{0,162,4214},{0,139,1218},{0,102,5913},{0,118,11198},{0,96,6942},{33,255,3266},{16,222,1},{25,159,266},{10,143,469},{125,0,9669},{0,162,4214},{0,139,1218},{0,102,5913},{255,0,9669},{0,102,5913},{8,233,128},{8,233,128},{8,233,128}, +{8,118,128},{0,149,2178},{0,109,442},{0,109,442},{0,65,1018},{0,66,2669},{0,59,1419},{16,217,0},{16,217,0},{16,217,0},{16,114,0},{73,0,2178},{0,109,442},{0,109,442},{0,65,1018},{149,0,2178},{0,65,1018},{175,0,2665},{14,223,0},{46,155,0},{0,145,325},{175,0,2665},{254,51,2665},{0,145,325},{0,118,2665},{254,51,2665},{0,118,2665},{8,0,128},{8,0,128},{8,0,128},{8,0,128},{0,49,0}, +{0,49,0},{0,49,0},{0,24,0},{0,21,40},{0,21,40},{27,255,4603},{13,238,300},{19,171,891},{10,152,642},{6,255,9761},{0,175,3898},{0,148,882},{0,111,5645},{0,127,11511},{0,105,6861},{43,255,3390},{24,230,1},{33,167,266},{18,151,469},{137,0,9669},{0,175,3898},{0,148,882},{0,111,5645},{255,12,9669},{0,111,5645},{12,249,288},{12,249,288},{12,249,288},{12,128,288},{0,174,2178},{0,124,305},{0,124,305}, +{0,74,881},{0,75,2852},{0,68,1409},{24,225,0},{24,225,0},{24,225,0},{24,122,0},{85,0,2178},{0,124,305},{0,124,305},{0,74,881},{174,0,2178},{0,74,881},{187,0,2665},{22,231,0},{54,163,0},{0,154,250},{187,0,2665},{254,63,2665},{0,154,250},{0,126,2665},{254,63,2665},{0,126,2665},{12,0,288},{12,0,288},{12,0,288},{12,0,288},{0,73,0},{0,73,0},{0,73,0},{0,36,0},{0,30,97}, +{0,30,97},{36,255,5482},{17,251,574},{24,179,1282},{14,162,853},{15,255,10055},{0,190,3618},{0,160,569},{0,120,5354},{0,138,11902},{0,114,6807},{55,255,3569},{33,239,1},{42,176,266},{27,160,469},{150,0,9669},{0,190,3618},{0,160,569},{0,120,5354},{254,26,9669},{0,120,5354},{18,255,558},{18,255,558},{18,255,558},{16,139,545},{0,201,2178},{0,138,180},{0,138,180},{0,83,740},{0,88,3060},{0,78,1427},{33,233,0}, +{33,233,0},{33,233,0},{33,131,0},{98,0,2178},{0,138,180},{0,138,180},{0,83,740},{201,0,2178},{0,83,740},{201,0,2665},{31,240,0},{63,172,0},{0,166,180},{201,0,2665},{255,76,2665},{0,166,180},{0,135,2665},{255,76,2665},{0,135,2665},{16,0,545},{16,0,545},{16,0,545},{16,0,545},{0,101,0},{0,101,0},{0,101,0},{0,49,0},{0,39,193},{0,39,193},{43,255,6378},{24,255,915},{29,187,1710}, +{18,172,1113},{21,255,10495},{0,205,3401},{0,169,353},{0,126,5126},{0,150,12278},{0,123,6786},{64,255,3738},{41,246,2},{50,183,259},{35,168,469},{162,0,9669},{0,205,3401},{0,169,353},{0,126,5126},{254,38,9669},{0,126,5126},{24,255,914},{24,255,914},{24,255,914},{20,149,841},{0,225,2178},{0,153,97},{0,153,97},{0,93,637},{0,100,3300},{0,88,1469},{41,241,0},{41,241,0},{41,241,0},{41,139,0},{110,0,2178}, +{0,153,97},{0,153,97},{0,93,637},{225,0,2178},{0,93,637},{213,0,2665},{38,249,0},{71,180,0},{0,173,130},{213,0,2665},{254,88,2665},{0,173,130},{0,143,2665},{254,88,2665},{0,143,2665},{20,0,841},{20,0,841},{20,0,841},{20,0,841},{0,125,0},{0,125,0},{0,125,0},{0,61,0},{0,51,305},{0,51,305},{49,255,7446},{30,255,1431},{33,197,2210},{22,179,1438},{30,255,11102},{0,218,3189},{0,182,185}, +{0,136,4909},{0,162,12686},{0,130,6797},{73,255,3925},{49,254,2},{57,193,258},{43,176,469},{174,0,9669},{0,218,3189},{0,182,185},{0,136,4909},{255,49,9669},{0,136,4909},{27,255,1382},{27,255,1382},{27,255,1382},{24,159,1201},{0,249,2178},{0,168,40},{0,168,40},{0,102,530},{0,109,3565},{0,94,1537},{49,249,0},{49,249,0},{49,249,0},{49,147,0},{122,0,2178},{0,168,40},{0,168,40},{0,102,530},{249,0,2178}, +{0,102,530},{224,0,2665},{46,255,1},{79,188,0},{0,182,85},{224,0,2665},{254,100,2665},{0,182,85},{0,151,2665},{254,100,2665},{0,151,2665},{24,0,1201},{24,0,1201},{24,0,1201},{24,0,1201},{0,149,0},{0,149,0},{0,149,0},{0,73,0},{0,60,442},{0,60,442},{55,255,8658},{36,255,2131},{38,205,2786},{27,188,1837},{36,255,11866},{0,230,3029},{0,191,75},{0,145,4685},{0,172,13066},{0,139,6826},{86,255,4118}, +{58,255,26},{65,201,258},{51,184,469},{186,0,9669},{0,230,3029},{0,191,75},{0,145,4685},{255,61,9669},{0,145,4685},{33,255,1954},{33,255,1954},{33,255,1954},{28,169,1625},{3,255,2219},{0,181,5},{0,181,5},{0,111,433},{0,121,3861},{0,103,1633},{57,254,1},{57,254,1},{57,254,1},{57,155,0},{134,0,2178},{0,181,5},{0,181,5},{0,111,433},{255,9,2178},{0,111,433},{236,0,2665},{61,255,20},{87,196,0}, +{0,191,50},{236,0,2665},{254,112,2665},{0,191,50},{0,159,2665},{254,112,2665},{0,159,2665},{28,0,1625},{28,0,1625},{28,0,1625},{28,0,1625},{0,174,0},{0,174,0},{0,174,0},{0,85,0},{0,69,605},{0,69,605},{61,255,10195},{43,255,3100},{43,216,3523},{31,198,2356},{43,255,12883},{0,245,2885},{0,203,20},{0,157,4450},{0,184,13589},{0,148,6898},{95,255,4346},{70,255,117},{74,210,258},{60,193,469},{199,0,9669}, +{0,245,2885},{0,203,20},{0,157,4450},{254,75,9669},{0,157,4450},{39,255,2734},{39,255,2734},{39,255,2734},{33,180,2178},{12,255,2420},{1,196,2},{1,196,2},{0,123,337},{0,132,4227},{0,112,1777},{67,255,10},{67,255,10},{67,255,10},{66,164,0},{147,0,2178},{4,194,0},{4,194,0},{0,123,337},{254,23,2178},{0,123,337},{250,0,2665},{76,255,73},{96,205,0},{0,203,20},{250,0,2665},{255,125,2665},{0,203,20}, +{0,168,2665},{255,125,2665},{0,168,2665},{33,0,2178},{33,0,2178},{33,0,2178},{33,0,2178},{0,201,0},{0,201,0},{0,201,0},{0,98,0},{0,81,820},{0,81,820},{67,255,11582},{49,255,4083},{48,224,4162},{36,206,2818},{49,255,13898},{1,255,2805},{2,212,20},{0,163,4255},{0,196,13958},{0,157,6886},{104,255,4577},{79,255,259},{82,218,258},{68,201,469},{211,0,9669},{1,255,2805},{4,211,17},{0,163,4254},{255,86,9669}, +{0,163,4254},{46,255,3434},{46,255,3434},{46,255,3434},{37,190,2665},{18,255,2709},{3,210,17},{3,210,17},{0,130,270},{0,141,4491},{0,121,1854},{76,255,29},{76,255,29},{76,255,29},{74,172,0},{159,0,2178},{12,202,0},{12,202,0},{0,130,269},{254,35,2178},{0,130,269},{255,13,2665},{92,255,157},{104,213,0},{0,212,5},{255,13,2665},{254,137,2665},{0,212,5},{0,176,2665},{254,137,2665},{0,176,2665},{37,0,2665}, +{37,0,2665},{37,0,2665},{37,0,2665},{1,223,0},{1,223,0},{1,223,0},{1,110,0},{0,91,953},{0,91,953},{79,255,12086},{58,255,4502},{56,232,4162},{44,214,2818},{61,255,14298},{10,255,2910},{10,220,20},{0,173,4166},{0,208,13470},{0,166,6215},{113,255,4826},{89,255,465},{90,226,258},{78,208,474},{223,0,9669},{10,255,2909},{12,219,17},{0,173,4085},{255,98,9669},{0,173,4085},{55,255,3574},{55,255,3574},{55,255,3574}, +{46,197,2665},{27,255,2840},{11,218,17},{11,218,17},{4,140,258},{0,156,4142},{0,133,1430},{86,255,52},{86,255,52},{86,255,52},{82,180,0},{171,0,2178},{20,210,0},{20,210,0},{0,139,202},{255,46,2178},{0,139,202},{255,37,2665},{107,255,260},{112,221,0},{0,220,1},{255,37,2665},{254,149,2665},{0,220,1},{0,184,2665},{254,149,2665},{0,184,2665},{45,0,2665},{45,0,2665},{45,0,2665},{45,0,2665},{9,231,0}, +{9,231,0},{9,231,0},{9,118,0},{0,103,745},{0,103,745},{86,255,12542},{67,255,4983},{64,240,4162},{52,222,2818},{70,255,14719},{22,255,3118},{18,228,20},{5,181,4162},{0,221,12955},{0,176,5593},{125,255,5090},{101,255,713},{98,234,258},{84,218,481},{235,0,9669},{28,255,3073},{20,227,17},{0,182,3909},{255,110,9669},{0,182,3909},{64,255,3726},{64,255,3726},{64,255,3726},{54,205,2665},{36,255,2989},{19,226,17},{19,226,17}, +{12,148,258},{0,172,3797},{0,142,1062},{95,255,89},{95,255,89},{95,255,89},{90,188,0},{183,0,2178},{28,218,0},{28,218,0},{0,148,145},{255,58,2178},{0,148,145},{255,61,2665},{119,255,388},{120,229,0},{5,229,0},{255,61,2665},{254,161,2665},{5,229,0},{0,192,2665},{254,161,2665},{0,192,2665},{53,0,2665},{53,0,2665},{53,0,2665},{53,0,2665},{17,239,0},{17,239,0},{17,239,0},{17,126,0},{0,118,562}, +{0,118,562},{98,255,13154},{79,255,5593},{73,249,4162},{61,231,2818},{86,255,15194},{34,255,3462},{27,237,20},{14,190,4162},{0,236,12478},{0,188,4983},{135,255,5365},{113,255,1062},{107,243,258},{93,227,481},{248,0,9669},{40,255,3330},{29,236,17},{0,191,3726},{254,124,9669},{0,191,3726},{73,255,3909},{73,255,3909},{73,255,3909},{63,214,2665},{46,255,3156},{28,235,17},{28,235,17},{21,157,258},{0,184,3462},{0,154,713},{107,255,145}, +{107,255,145},{107,255,145},{99,197,0},{196,0,2178},{37,227,0},{37,227,0},{0,160,89},{254,72,2178},{0,160,89},{255,89,2665},{137,255,562},{129,238,0},{14,238,0},{255,89,2665},{254,174,2665},{14,238,0},{0,201,2665},{254,174,2665},{0,201,2665},{62,0,2665},{62,0,2665},{62,0,2665},{62,0,2665},{26,248,0},{26,248,0},{26,248,0},{26,135,0},{0,135,388},{0,135,388},{107,255,13718},{89,255,6215},{82,255,4166}, +{69,239,2818},{92,255,15614},{46,255,3885},{35,245,20},{22,198,4162},{0,248,12086},{0,197,4502},{144,255,5658},{122,255,1430},{115,251,258},{101,235,481},{255,10,9669},{61,255,3601},{37,244,17},{0,200,3574},{255,135,9669},{0,200,3574},{82,255,4085},{82,255,4085},{82,255,4085},{71,222,2665},{58,255,3332},{36,242,17},{36,242,17},{29,165,258},{0,196,3206},{0,163,465},{116,255,202},{116,255,202},{116,255,202},{107,205,0},{208,0,2178}, +{44,235,0},{44,235,0},{0,169,52},{254,84,2178},{0,169,52},{255,113,2665},{152,255,745},{137,246,0},{22,246,0},{255,113,2665},{254,186,2665},{22,246,0},{0,209,2665},{254,186,2665},{0,209,2665},{70,0,2665},{70,0,2665},{70,0,2665},{70,0,2665},{34,253,1},{34,253,1},{34,253,1},{34,143,0},{0,147,260},{0,147,260},{116,255,14302},{98,255,6886},{89,255,4255},{77,247,2818},{104,255,16094},{55,255,4382},{43,253,20}, +{30,206,4162},{0,254,11806},{0,206,4083},{153,255,5969},{134,255,1854},{125,255,270},{109,243,481},{255,34,9669},{76,255,3905},{45,252,17},{0,209,3434},{255,147,9669},{0,209,3434},{89,255,4254},{89,255,4254},{89,255,4254},{79,230,2665},{67,255,3525},{44,250,17},{44,250,17},{37,173,258},{0,211,2979},{0,176,259},{125,255,269},{125,255,269},{125,255,269},{115,213,0},{220,0,2178},{52,243,0},{52,243,0},{0,179,29},{255,95,2178}, +{0,179,29},{255,137,2665},{164,255,953},{145,254,0},{30,254,0},{255,137,2665},{254,198,2665},{30,254,0},{0,217,2665},{254,198,2665},{0,217,2665},{78,0,2665},{78,0,2665},{78,0,2665},{78,0,2665},{43,255,5},{43,255,5},{43,255,5},{42,150,0},{0,162,157},{0,162,157},{122,255,13635},{107,255,6898},{98,255,4450},{86,250,2739},{110,255,15195},{67,255,4071},{52,255,20},{39,212,3523},{1,255,10735},{0,212,3100},{162,255,5381}, +{143,255,1777},{132,255,337},{118,246,331},{255,52,8712},{82,255,3492},{59,254,2},{0,216,2734},{255,156,8712},{0,216,2734},{98,255,4450},{98,255,4450},{98,255,4450},{87,238,2665},{76,255,3736},{52,255,20},{52,255,20},{45,181,258},{0,224,2757},{0,185,117},{132,255,337},{132,255,337},{132,255,337},{123,221,0},{232,0,2178},{60,251,0},{60,251,0},{0,188,10},{255,107,2178},{0,188,10},{255,152,2178},{174,255,820},{156,255,0}, +{52,255,0},{255,152,2178},{255,205,2178},{52,255,0},{0,222,2178},{255,205,2178},{0,222,2178},{86,0,2665},{86,0,2665},{86,0,2665},{86,0,2665},{52,255,20},{52,255,20},{52,255,20},{50,158,0},{0,178,73},{0,178,73},{132,255,12678},{116,255,6826},{110,255,4685},{95,253,2678},{119,255,14061},{76,255,3663},{64,255,75},{49,216,2786},{10,255,9739},{0,219,2131},{172,255,4629},{152,255,1633},{144,255,433},{129,248,179},{255,70,7578}, +{101,255,2949},{73,255,5},{0,222,1954},{255,165,7578},{0,222,1954},{110,255,4685},{110,255,4685},{110,255,4685},{96,247,2665},{89,255,3960},{64,255,75},{64,255,75},{54,190,258},{0,239,2571},{0,197,26},{144,255,433},{144,255,433},{144,255,433},{132,230,0},{245,0,2178},{73,255,5},{73,255,5},{0,197,1},{254,121,2178},{0,197,1},{255,164,1625},{186,255,605},{170,255,0},{79,255,0},{255,164,1625},{255,211,1625},{79,255,0}, +{0,226,1625},{255,211,1625},{0,226,1625},{95,0,2665},{95,0,2665},{95,0,2665},{95,0,2665},{64,255,50},{64,255,50},{64,255,50},{59,167,0},{0,193,20},{0,193,20},{138,255,11970},{125,255,6797},{119,255,4909},{104,255,2665},{129,255,13086},{82,255,3411},{73,255,185},{57,221,2210},{22,255,8987},{0,225,1431},{178,255,4049},{161,255,1537},{153,255,530},{137,250,83},{255,86,6661},{113,255,2525},{86,255,40},{0,225,1382},{255,172,6661}, +{0,225,1382},{119,255,4909},{119,255,4909},{119,255,4909},{104,255,2665},{98,255,4197},{73,255,185},{73,255,185},{62,198,258},{0,251,2435},{1,206,2},{153,255,530},{153,255,530},{153,255,530},{140,238,0},{255,4,2178},{86,255,40},{86,255,40},{4,206,0},{255,132,2178},{4,206,0},{255,177,1201},{195,255,442},{181,255,0},{104,255,0},{255,177,1201},{254,217,1201},{104,255,0},{0,230,1201},{254,217,1201},{0,230,1201},{103,0,2665}, +{103,0,2665},{103,0,2665},{103,0,2665},{73,255,85},{73,255,85},{73,255,85},{67,175,0},{0,208,1},{0,208,1},{147,255,11330},{132,255,6786},{129,255,5126},{113,255,2694},{135,255,12250},{95,255,3225},{86,255,353},{67,225,1710},{37,255,8326},{0,231,915},{184,255,3541},{167,255,1469},{162,255,637},{146,253,24},{255,104,5829},{125,255,2165},{101,255,97},{0,231,914},{255,181,5829},{0,231,914},{129,255,5126},{129,255,5126},{129,255,5126}, +{113,255,2694},{107,255,4452},{86,255,353},{86,255,353},{72,205,259},{1,255,2421},{9,214,2},{162,255,637},{162,255,637},{162,255,637},{148,245,0},{255,28,2178},{101,255,97},{101,255,97},{12,214,0},{255,144,2178},{12,214,0},{255,189,841},{204,255,305},{193,255,0},{128,255,0},{255,189,841},{254,223,841},{128,255,0},{0,234,841},{254,223,841},{0,234,841},{111,0,2665},{111,0,2665},{111,0,2665},{111,0,2665},{82,255,130}, +{82,255,130},{82,255,130},{75,183,0},{6,217,0},{6,217,0},{153,255,10758},{141,255,6807},{135,255,5354},{122,255,2777},{144,255,11503},{104,255,3102},{95,255,569},{75,230,1282},{49,255,7825},{3,237,574},{190,255,3105},{177,255,1427},{172,255,740},{156,254,1},{255,119,5082},{137,255,1869},{116,255,180},{0,237,558},{254,189,5082},{0,237,558},{135,255,5354},{135,255,5354},{135,255,5354},{122,255,2777},{119,255,4724},{95,255,569},{95,255,569}, +{79,213,266},{16,255,2587},{16,222,1},{172,255,740},{172,255,740},{172,255,740},{156,253,0},{255,52,2178},{116,255,180},{116,255,180},{20,222,0},{255,156,2178},{20,222,0},{255,201,545},{216,255,193},{205,255,0},{152,255,0},{255,201,545},{254,229,545},{152,255,0},{0,238,545},{254,229,545},{0,238,545},{119,0,2665},{119,0,2665},{119,0,2665},{119,0,2665},{89,255,180},{89,255,180},{89,255,180},{83,191,0},{15,224,0}, +{15,224,0},{162,255,10197},{150,255,6861},{144,255,5645},{131,255,2933},{153,255,10765},{116,255,3051},{107,255,882},{84,236,891},{64,255,7297},{17,242,300},{199,255,2694},{186,255,1409},{181,255,881},{167,255,20},{255,137,4344},{152,255,1611},{131,255,305},{4,243,288},{254,198,4344},{4,243,288},{144,255,5645},{144,255,5645},{144,255,5645},{131,255,2933},{129,255,5005},{107,255,882},{107,255,882},{88,222,266},{34,255,2824},{25,231,1},{181,255,881}, +{181,255,881},{181,255,881},{167,255,20},{255,79,2178},{131,255,305},{131,255,305},{28,231,0},{253,170,2178},{28,231,0},{255,216,288},{225,255,97},{218,255,0},{180,255,0},{255,216,288},{255,236,288},{180,255,0},{0,243,288},{255,236,288},{0,243,288},{128,0,2665},{128,0,2665},{128,0,2665},{128,0,2665},{101,255,250},{101,255,250},{101,255,250},{92,200,0},{24,233,0},{24,233,0},{172,255,9731},{159,255,6942},{153,255,5913}, +{140,255,3130},{162,255,10204},{125,255,3090},{116,255,1218},{94,240,623},{79,255,6924},{27,246,132},{205,255,2402},{196,255,1419},{190,255,1018},{177,255,97},{255,152,3779},{164,255,1451},{146,255,442},{20,247,128},{255,205,3779},{20,247,128},{153,255,5913},{153,255,5913},{153,255,5913},{140,255,3130},{138,255,5304},{116,255,1218},{116,255,1218},{96,230,266},{49,255,3115},{33,239,1},{190,255,1018},{190,255,1018},{190,255,1018},{177,255,97},{255,104,2178}, +{146,255,442},{146,255,442},{36,239,0},{255,181,2178},{36,239,0},{255,228,128},{234,255,40},{230,255,0},{204,255,0},{255,228,128},{255,242,128},{204,255,0},{0,247,128},{255,242,128},{0,247,128},{136,0,2665},{136,0,2665},{136,0,2665},{136,0,2665},{110,255,325},{110,255,325},{110,255,325},{100,208,0},{32,241,0},{32,241,0},{175,255,9359},{165,255,7050},{162,255,6193},{149,255,3381},{172,255,9691},{134,255,3207},{128,255,1610}, +{102,245,429},{92,255,6719},{38,251,32},{215,255,2156},{205,255,1457},{199,255,1165},{186,255,221},{255,171,3299},{177,255,1398},{161,255,605},{36,251,32},{254,214,3299},{36,251,32},{162,255,6193},{162,255,6193},{162,255,6193},{149,255,3381},{147,255,5621},{128,255,1610},{128,255,1610},{104,238,266},{67,255,3419},{41,247,2},{199,255,1165},{199,255,1165},{199,255,1165},{186,255,221},{255,128,2178},{161,255,605},{161,255,605},{44,247,0},{255,193,2178}, +{44,247,0},{255,240,32},{246,255,8},{242,255,0},{228,255,0},{255,240,32},{255,248,32},{228,255,0},{0,251,32},{255,248,32},{0,251,32},{144,0,2665},{144,0,2665},{144,0,2665},{144,0,2665},{119,255,410},{119,255,410},{119,255,410},{108,216,0},{39,250,0},{39,250,0},{184,255,9067},{175,255,7162},{172,255,6450},{158,255,3686},{175,255,9268},{146,255,3399},{137,255,2054},{110,250,311},{107,255,6532},{49,255,2},{221,255,1992}, +{211,255,1521},{208,255,1322},{195,255,397},{255,186,2904},{189,255,1366},{174,255,820},{52,255,0},{255,221,2904},{52,255,0},{172,255,6450},{172,255,6450},{172,255,6450},{158,255,3686},{159,255,5949},{137,255,2054},{137,255,2054},{112,246,266},{82,255,3765},{49,255,2},{208,255,1322},{208,255,1322},{208,255,1322},{195,255,397},{255,152,2178},{174,255,820},{174,255,820},{52,255,0},{255,205,2178},{52,255,0},{255,252,0},{255,254,0},{254,255,0}, +{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{152,0,2665},{152,0,2665},{152,0,2665},{152,0,2665},{129,255,493},{129,255,493},{129,255,493},{116,224,0},{49,255,2},{49,255,2},{190,255,7987},{181,255,6402},{178,255,5810},{167,255,3509},{184,255,7999},{155,255,3048},{146,255,1922},{121,252,155},{119,255,5562},{64,255,29},{224,255,1476},{218,255,1120},{215,255,965},{204,255,292},{255,195,2166}, +{198,255,1009},{186,255,605},{79,255,0},{254,226,2166},{79,255,0},{178,255,5810},{178,255,5810},{178,255,5810},{167,255,3509},{165,255,5209},{146,255,1922},{146,255,1922},{121,249,133},{95,255,3258},{64,255,29},{215,255,965},{215,255,965},{215,255,965},{204,255,292},{255,164,1625},{186,255,605},{186,255,605},{79,255,0},{255,211,1625},{79,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0}, +{0,255,0},{255,254,0},{0,255,0},{161,0,2665},{161,0,2665},{161,0,2665},{161,0,2665},{138,255,610},{138,255,610},{138,255,610},{125,233,0},{64,255,29},{64,255,29},{196,255,7111},{187,255,5786},{184,255,5294},{174,255,3381},{187,255,6982},{161,255,2780},{155,255,1832},{131,253,61},{128,255,4795},{79,255,80},{230,255,1088},{224,255,824},{221,255,709},{210,255,212},{255,204,1601},{204,255,737},{195,255,442},{104,255,0},{255,230,1601}, +{104,255,0},{184,255,5294},{184,255,5294},{184,255,5294},{174,255,3381},{172,255,4582},{155,255,1832},{155,255,1832},{132,251,53},{107,255,2834},{79,255,80},{221,255,709},{221,255,709},{221,255,709},{210,255,212},{255,177,1201},{195,255,442},{195,255,442},{104,255,0},{254,217,1201},{104,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{169,0,2665}, +{169,0,2665},{169,0,2665},{169,0,2665},{147,255,725},{147,255,725},{147,255,725},{133,241,0},{79,255,80},{79,255,80},{202,255,6315},{193,255,5226},{190,255,4826},{180,255,3253},{193,255,6066},{167,255,2568},{164,255,1770},{141,254,11},{137,255,4122},{92,255,169},{233,255,753},{227,255,574},{227,255,493},{219,255,146},{255,210,1121},{213,255,507},{204,255,305},{128,255,0},{255,233,1121},{128,255,0},{190,255,4826},{190,255,4826},{190,255,4826}, +{180,255,3253},{181,255,4065},{164,255,1770},{164,255,1770},{140,253,9},{119,255,2474},{92,255,169},{227,255,493},{227,255,493},{227,255,493},{219,255,146},{255,189,841},{204,255,305},{204,255,305},{128,255,0},{254,223,841},{128,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{177,0,2665},{177,0,2665},{177,0,2665},{177,0,2665},{156,255,850}, +{156,255,850},{156,255,850},{141,249,0},{92,255,169},{92,255,169},{208,255,5599},{199,255,4722},{199,255,4398},{189,255,3130},{199,255,5254},{177,255,2395},{171,255,1742},{149,255,1},{149,255,3538},{107,255,274},{236,255,484},{233,255,366},{233,255,317},{225,255,90},{255,219,726},{222,255,321},{216,255,193},{152,255,0},{254,238,726},{152,255,0},{199,255,4398},{199,255,4398},{199,255,4398},{189,255,3130},{187,255,3613},{171,255,1742},{171,255,1742}, +{149,255,1},{131,255,2178},{107,255,274},{233,255,317},{233,255,317},{233,255,317},{225,255,90},{255,201,545},{216,255,193},{216,255,193},{152,255,0},{254,229,545},{152,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{185,0,2665},{185,0,2665},{185,0,2665},{185,0,2665},{165,255,985},{165,255,985},{165,255,985},{149,255,1},{107,255,274}, +{107,255,274},{43,255,50657},{1,255,1974},{0,182,128},{0,176,4572},{36,255,59540},{0,242,19268},{0,176,7306},{0,160,23941},{0,187,65535},{0,148,40590},{21,255,10267},{0,248,1412},{0,179,137},{0,148,3929},{115,0,18065},{0,153,12036},{0,139,6077},{0,93,14060},{234,0,18065},{0,93,14060},{0,143,0},{0,143,0},{0,143,0},{0,70,0},{0,70,1105},{0,57,405},{0,57,405},{0,34,653},{0,33,1209},{0,31,756},{0,143,0}, +{0,143,0},{0,143,0},{0,70,0},{35,0,1105},{0,57,405},{0,57,405},{0,34,653},{70,0,1105},{0,34,653},{171,0,9248},{0,248,1412},{0,179,137},{0,148,3929},{171,0,9248},{255,46,9248},{0,148,3929},{0,115,9248},{255,46,9248},{0,115,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{43,255,53600},{4,255,2885},{0,191,38}, +{0,185,3941},{43,255,62123},{0,254,18376},{0,182,6726},{0,169,23131},{0,196,65535},{0,154,40086},{27,255,10859},{0,254,1184},{0,188,45},{0,157,3656},{122,0,19334},{0,162,12449},{0,145,6089},{0,102,14754},{249,0,19334},{0,102,14754},{0,167,0},{0,167,0},{0,167,0},{0,82,0},{0,82,1513},{0,66,562},{0,66,562},{0,37,900},{0,36,1658},{0,37,1044},{0,167,0},{0,167,0},{0,167,0},{0,82,0},{41,0,1513}, +{0,66,562},{0,66,562},{0,37,900},{82,0,1513},{0,37,900},{183,0,9248},{0,254,1184},{0,188,45},{0,157,3656},{183,0,9248},{255,58,9248},{0,157,3656},{0,123,9248},{255,58,9248},{0,123,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{46,255,56765},{7,255,4404},{0,199,3},{0,194,3404},{43,255,64774},{1,255,17986},{0,191,6229}, +{0,176,22449},{0,215,65535},{0,160,39678},{33,255,11587},{1,255,1171},{0,199,4},{0,166,3393},{129,0,20689},{0,172,12834},{0,154,6125},{0,108,15490},{254,5,20689},{0,108,15490},{0,192,0},{0,192,0},{0,192,0},{0,94,0},{0,95,1985},{0,75,745},{0,75,745},{0,44,1202},{0,42,2178},{0,40,1374},{0,192,0},{0,192,0},{0,192,0},{0,94,0},{46,0,1985},{0,75,745},{0,75,745},{0,44,1202},{95,0,1985}, +{0,44,1202},{195,0,9248},{1,255,1170},{0,199,4},{0,166,3393},{195,0,9248},{255,70,9248},{0,166,3393},{0,131,9248},{255,70,9248},{0,131,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{49,255,58131},{7,255,6200},{0,207,6},{0,203,2858},{46,255,65535},{1,255,17772},{0,200,5638},{0,182,21148},{0,215,63337},{0,166,38166},{43,255,12449}, +{1,255,1395},{1,208,6},{0,176,3170},{138,0,22129},{0,184,13298},{0,163,6189},{0,114,16274},{254,14,22129},{0,114,16274},{0,216,0},{0,216,0},{0,216,0},{0,106,0},{0,107,2521},{0,88,928},{0,88,928},{0,50,1530},{0,48,2770},{0,47,1762},{0,216,0},{0,216,0},{0,216,0},{0,106,0},{52,0,2521},{0,88,928},{0,88,928},{0,50,1530},{107,0,2521},{0,50,1530},{207,0,9248},{7,255,1378},{5,207,0}, +{0,176,3170},{207,0,9248},{255,82,9248},{0,176,3170},{0,139,9248},{255,82,9248},{0,139,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{55,255,58853},{10,255,8410},{0,216,47},{0,212,2312},{52,255,65535},{4,255,18024},{0,209,5015},{0,191,19619},{0,224,60697},{0,176,36050},{46,255,13542},{7,255,1877},{4,217,53},{0,185,2897},{147,0,23851}, +{0,196,13856},{0,173,6281},{0,120,17216},{254,23,23851},{0,120,17216},{0,243,0},{0,243,0},{0,243,0},{0,119,0},{0,122,3200},{0,97,1186},{0,97,1186},{0,56,1945},{0,54,3521},{0,53,2243},{0,243,0},{0,243,0},{0,243,0},{0,119,0},{60,0,3200},{0,97,1186},{0,97,1186},{0,56,1945},{122,0,3200},{0,56,1945},{220,0,9248},{22,255,1693},{14,216,0},{0,185,2897},{220,0,9248},{255,95,9248},{0,185,2897}, +{0,148,9248},{255,95,9248},{0,148,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{58,255,59395},{13,255,10486},{0,225,107},{0,219,1933},{55,255,65535},{7,255,18658},{0,215,4619},{0,200,18436},{0,233,58566},{0,182,34489},{52,255,14690},{13,255,2489},{6,228,133},{0,194,2664},{155,0,25472},{0,208,14384},{0,182,6401},{0,126,18104},{255,30,25472}, +{0,126,18104},{0,255,16},{0,255,16},{0,255,16},{0,131,0},{0,134,3872},{0,106,1445},{0,106,1445},{0,62,2357},{0,60,4265},{0,56,2717},{2,254,13},{2,254,13},{2,254,13},{0,131,0},{66,0,3872},{0,106,1445},{0,106,1445},{0,62,2357},{134,0,3872},{0,62,2357},{232,0,9248},{37,255,2000},{22,224,0},{0,194,2664},{232,0,9248},{255,107,9248},{0,194,2664},{0,156,9248},{255,107,9248},{0,156,9248},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{61,255,59976},{16,255,12621},{2,233,174},{0,228,1613},{58,255,65535},{10,255,19459},{0,224,4093},{0,206,17181},{0,242,56514},{0,188,32973},{58,255,15746},{19,255,3205},{10,235,217},{0,206,2444},{164,0,26744},{0,218,14587},{0,191,6305},{0,136,18737},{255,39,26744},{0,136,18737},{3,255,110},{3,255,110},{3,255,110}, +{1,142,2},{0,149,4418},{0,118,1585},{0,118,1585},{0,68,2633},{0,66,4909},{0,62,3077},{6,255,80},{6,255,80},{6,255,80},{2,142,0},{73,0,4418},{0,118,1585},{0,118,1585},{0,68,2633},{149,0,4418},{0,68,2633},{244,0,9248},{49,255,2377},{30,232,0},{0,206,2440},{244,0,9248},{255,119,9248},{0,206,2440},{0,164,9248},{255,119,9248},{0,164,9248},{1,0,2},{1,0,2},{1,0,2},{1,0,2},{0,7,0}, +{0,7,0},{0,7,0},{0,3,0},{0,3,0},{0,3,0},{67,255,60796},{19,255,14846},{3,240,286},{0,234,1405},{64,255,65535},{13,255,20226},{0,233,3321},{0,212,15538},{0,254,54317},{0,197,31240},{67,255,16195},{31,255,3805},{18,243,217},{0,212,2328},{175,0,26744},{0,230,14051},{0,200,5525},{0,142,18273},{254,51,26744},{0,142,18273},{9,255,278},{9,255,278},{9,255,278},{5,152,50},{0,174,4418},{0,129,1313},{0,129,1313}, +{0,77,2410},{0,75,5092},{0,71,2987},{15,255,125},{15,255,125},{15,255,125},{10,150,0},{85,0,4418},{0,129,1313},{0,129,1313},{0,77,2410},{174,0,4418},{0,77,2410},{255,1,9248},{64,255,2738},{37,240,0},{0,212,2228},{255,1,9248},{254,131,9248},{0,212,2228},{0,172,9248},{254,131,9248},{0,172,9248},{5,0,50},{5,0,50},{5,0,50},{5,0,50},{0,31,0},{0,31,0},{0,31,0},{0,15,0},{0,12,13}, +{0,12,13},{70,255,61549},{25,255,17357},{4,250,459},{1,244,1256},{70,255,65535},{16,255,21346},{0,242,2603},{0,225,13862},{0,254,52221},{0,206,29474},{79,255,16720},{43,255,4545},{27,252,217},{7,223,2341},{189,0,26744},{0,245,13481},{0,212,4710},{0,154,17762},{255,64,26744},{0,154,17762},{15,255,602},{15,255,602},{15,255,602},{10,163,181},{0,201,4418},{0,147,1037},{0,147,1037},{0,83,2196},{0,88,5300},{0,80,2921},{27,255,185}, +{27,255,185},{27,255,185},{19,159,0},{98,0,4418},{0,147,1037},{0,147,1037},{0,83,2196},{201,0,4418},{0,83,2196},{255,28,9248},{82,255,3176},{46,249,0},{0,225,2020},{255,28,9248},{255,144,9248},{0,225,2020},{0,181,9248},{255,144,9248},{0,181,9248},{9,0,181},{9,0,181},{9,0,181},{9,0,181},{0,58,0},{0,58,0},{0,58,0},{0,29,0},{0,24,58},{0,24,58},{73,255,62082},{28,255,19099},{6,255,688}, +{2,251,1170},{73,255,65535},{19,255,22086},{0,248,2054},{0,231,12530},{0,254,51038},{0,212,28165},{86,255,16691},{52,255,4985},{36,255,250},{14,230,2238},{199,0,26259},{0,254,12692},{0,221,3965},{0,160,16946},{254,75,26259},{0,160,16946},{21,255,1006},{21,255,1006},{21,255,1006},{14,173,365},{0,225,4418},{0,162,820},{0,162,820},{0,96,1994},{0,100,5540},{0,90,2891},{36,255,250},{36,255,250},{36,255,250},{27,167,0},{110,0,4418}, +{0,162,820},{0,162,820},{0,96,1994},{225,0,4418},{0,96,1994},{255,49,8978},{95,255,3433},{55,255,0},{0,231,1732},{255,49,8978},{254,155,8978},{0,231,1732},{0,188,8978},{254,155,8978},{0,188,8978},{13,0,365},{13,0,365},{13,0,365},{13,0,365},{0,82,0},{0,82,0},{0,82,0},{0,41,0},{0,33,125},{0,33,125},{76,255,62399},{28,255,19454},{6,255,1075},{2,251,1090},{73,255,65535},{19,255,21590},{0,250,1503}, +{0,231,11251},{0,254,50424},{0,212,27242},{95,255,15410},{58,255,4661},{46,255,317},{24,231,1853},{208,0,24371},{0,254,11124},{0,227,2881},{0,166,15066},{254,84,24371},{0,166,15066},{27,255,1522},{27,255,1522},{27,255,1522},{17,183,613},{0,249,4418},{0,175,605},{0,175,605},{0,105,1801},{0,109,5805},{0,97,2885},{46,255,317},{46,255,317},{46,255,317},{35,175,0},{122,0,4418},{0,175,605},{0,175,605},{0,105,1801},{249,0,4418}, +{0,105,1801},{255,61,7938},{104,255,3026},{67,255,0},{0,237,1224},{255,61,7938},{254,161,7938},{0,237,1224},{0,192,7938},{254,161,7938},{0,192,7938},{17,0,613},{17,0,613},{17,0,613},{17,0,613},{0,107,0},{0,107,0},{0,107,0},{0,52,0},{0,42,218},{0,42,218},{76,255,62711},{28,255,19886},{9,255,1549},{3,252,1093},{73,255,65535},{19,255,21152},{0,251,1032},{0,234,10008},{0,254,49821},{0,212,26360},{101,255,14198}, +{67,255,4361},{55,255,400},{33,234,1502},{215,0,22568},{1,255,9795},{0,230,1973},{0,169,13320},{254,91,22568},{0,169,13320},{33,255,2150},{33,255,2150},{33,255,2150},{21,193,925},{3,255,4459},{0,190,442},{0,190,442},{0,114,1618},{0,121,6101},{0,106,2901},{55,255,400},{55,255,400},{55,255,400},{43,183,0},{134,0,4418},{0,190,442},{0,190,442},{0,114,1618},{255,9,4418},{0,114,1618},{255,73,6962},{113,255,2645},{79,255,0}, +{0,240,801},{255,73,6962},{254,167,6962},{0,240,801},{0,196,6962},{254,167,6962},{0,196,6962},{21,0,925},{21,0,925},{21,0,925},{21,0,925},{0,131,0},{0,131,0},{0,131,0},{0,64,0},{0,51,337},{0,51,337},{76,255,63078},{31,255,20439},{9,255,2192},{4,253,1202},{76,255,65535},{19,255,20732},{0,251,606},{0,234,8676},{0,254,49164},{0,212,25424},{110,255,12917},{79,255,4059},{64,255,505},{43,234,1147},{224,0,20642}, +{1,255,8589},{0,236,1155},{0,179,11489},{254,100,20642},{0,179,11489},{39,255,2986},{39,255,2986},{39,255,2986},{26,204,1352},{12,255,4660},{0,205,289},{0,205,289},{0,126,1424},{0,132,6467},{0,115,2955},{64,255,505},{64,255,505},{64,255,505},{52,192,0},{147,0,4418},{0,205,289},{0,205,289},{0,126,1424},{254,23,4418},{0,126,1424},{255,86,5941},{125,255,2248},{92,255,0},{0,243,433},{255,86,5941},{255,172,5941},{0,243,433}, +{0,200,5941},{255,172,5941},{0,200,5941},{26,0,1352},{26,0,1352},{26,0,1352},{26,0,1352},{0,158,0},{0,158,0},{0,158,0},{0,78,0},{0,63,500},{0,63,500},{79,255,63411},{31,255,21008},{12,255,2858},{7,253,1393},{76,255,65535},{22,255,20416},{0,253,320},{0,237,7549},{0,254,48613},{0,218,24643},{116,255,11849},{82,255,3845},{73,255,610},{53,238,867},{232,0,19021},{10,255,7741},{0,242,611},{0,182,9957},{255,107,19021}, +{0,182,9957},{43,255,3819},{43,255,3819},{43,255,3819},{30,214,1800},{15,255,4981},{0,221,169},{0,221,169},{0,133,1282},{0,141,6822},{0,124,3029},{73,255,610},{73,255,610},{73,255,610},{60,200,0},{159,0,4418},{0,221,169},{0,221,169},{0,133,1282},{254,35,4418},{0,133,1282},{255,98,5101},{134,255,1921},{104,255,0},{0,246,202},{255,98,5101},{255,178,5101},{0,246,202},{0,204,5101},{255,178,5101},{0,204,5101},{30,0,1800}, +{30,0,1800},{30,0,1800},{30,0,1800},{0,183,0},{0,183,0},{0,183,0},{0,89,0},{0,72,673},{0,72,673},{86,255,63733},{34,255,21637},{12,255,3614},{8,254,1668},{76,255,65535},{22,255,20164},{0,254,123},{0,237,6489},{0,254,48082},{0,218,23857},{122,255,10853},{95,255,3629},{86,255,724},{62,241,632},{241,0,17485},{22,255,6965},{0,248,243},{0,188,8529},{255,116,17485},{0,188,8529},{49,255,4787},{49,255,4787},{49,255,4787}, +{34,224,2312},{21,255,5437},{0,233,89},{0,233,89},{0,142,1129},{0,153,7206},{0,133,3131},{86,255,724},{86,255,724},{86,255,724},{68,207,0},{171,0,4418},{0,233,89},{0,233,89},{0,142,1129},{255,46,4418},{0,142,1129},{255,110,4325},{143,255,1620},{116,255,0},{0,252,58},{255,110,4325},{255,184,4325},{0,252,58},{0,208,4325},{255,184,4325},{0,208,4325},{34,0,2312},{34,0,2312},{34,0,2312},{34,0,2312},{0,207,0}, +{0,207,0},{0,207,0},{0,101,0},{0,88,865},{0,88,865},{86,255,63992},{34,255,22322},{15,255,4457},{8,255,2033},{76,255,65535},{22,255,19980},{0,254,23},{0,240,5494},{0,254,47573},{0,218,23129},{129,255,9866},{104,255,3441},{92,255,832},{71,244,435},{248,0,16034},{34,255,6253},{0,254,51},{0,194,7213},{254,124,16034},{0,194,7213},{55,255,5867},{55,255,5867},{55,255,5867},{38,234,2888},{27,255,6029},{0,248,34},{0,248,34}, +{0,154,985},{0,162,7619},{0,142,3261},{92,255,832},{92,255,832},{92,255,832},{76,215,0},{183,0,4418},{0,248,34},{0,248,34},{0,154,985},{255,58,4418},{0,154,985},{255,122,3613},{152,255,1345},{128,255,0},{0,255,1},{255,122,3613},{255,190,3613},{0,255,1},{0,212,3613},{255,190,3613},{0,212,3613},{38,0,2888},{38,0,2888},{38,0,2888},{38,0,2888},{0,231,0},{0,231,0},{0,231,0},{0,113,0},{0,91,1066}, +{0,91,1066},{86,255,64310},{37,255,23174},{15,255,5504},{10,255,2546},{79,255,65535},{25,255,19854},{1,255,23},{0,240,4466},{0,254,47048},{0,221,22366},{138,255,8897},{113,255,3261},{101,255,985},{80,247,258},{255,4,14504},{40,255,5561},{7,255,34},{0,200,5867},{255,132,14504},{0,200,5867},{61,255,7213},{61,255,7213},{61,255,7213},{42,245,3613},{33,255,6859},{1,255,51},{1,255,51},{0,163,832},{0,175,8059},{0,151,3441},{101,255,985}, +{101,255,985},{101,255,985},{85,224,0},{196,0,4418},{7,255,34},{7,255,34},{0,163,832},{254,72,4418},{0,163,832},{255,137,2888},{164,255,1066},{141,255,0},{22,255,0},{255,137,2888},{254,198,2888},{22,255,0},{0,217,2888},{254,198,2888},{0,217,2888},{42,0,3613},{42,0,3613},{42,0,3613},{42,0,3613},{0,255,1},{0,255,1},{0,255,1},{0,127,0},{0,103,1345},{0,103,1345},{86,255,64605},{37,255,23983},{18,255,6523}, +{10,255,3097},{86,255,65535},{25,255,19808},{1,255,124},{0,243,3633},{0,254,46617},{0,221,21751},{144,255,8113},{122,255,3131},{113,255,1129},{90,248,139},{255,19,13235},{58,255,5012},{22,255,89},{0,206,4787},{254,140,13235},{0,206,4787},{67,255,8529},{67,255,8529},{67,255,8529},{46,255,4325},{43,255,7725},{7,255,243},{7,255,243},{0,169,724},{0,184,8530},{0,160,3629},{113,255,1129},{113,255,1129},{113,255,1129},{93,232,0},{208,0,4418}, +{22,255,89},{22,255,89},{0,169,724},{254,84,4418},{0,169,724},{255,149,2312},{167,255,865},{153,255,0},{46,255,0},{255,149,2312},{254,204,2312},{46,255,0},{0,221,2312},{254,204,2312},{0,221,2312},{46,0,4325},{46,0,4325},{46,0,4325},{46,0,4325},{3,255,58},{3,255,58},{3,255,58},{0,138,0},{0,112,1620},{0,112,1620},{86,255,64960},{37,255,24878},{18,255,7621},{13,255,3738},{86,255,65535},{25,255,19851},{2,255,323}, +{0,243,2885},{0,254,46257},{0,224,21209},{153,255,7392},{131,255,3029},{122,255,1282},{99,251,56},{255,37,12051},{70,255,4500},{34,255,169},{0,212,3819},{254,149,12051},{0,212,3819},{70,255,9957},{70,255,9957},{70,255,9957},{52,255,5141},{46,255,8712},{13,255,611},{13,255,611},{0,182,610},{0,196,9026},{0,169,3845},{122,255,1282},{122,255,1282},{122,255,1282},{101,240,0},{220,0,4418},{34,255,169},{34,255,169},{0,182,610},{255,95,4418}, +{0,182,610},{255,161,1800},{183,255,673},{165,255,0},{70,255,0},{255,161,1800},{254,210,1800},{70,255,0},{0,225,1800},{254,210,1800},{0,225,1800},{50,0,5101},{50,0,5101},{50,0,5101},{50,0,5101},{9,255,202},{9,255,202},{9,255,202},{0,150,0},{0,121,1921},{0,121,1921},{86,255,65314},{43,255,25774},{21,255,8796},{13,255,4456},{86,255,65535},{25,255,19965},{4,255,614},{0,246,2222},{0,254,45929},{0,224,20720},{159,255,6740}, +{140,255,2955},{129,255,1424},{108,254,11},{255,52,10952},{82,255,4052},{49,255,289},{0,216,2986},{255,156,10952},{0,216,2986},{76,255,11489},{76,255,11489},{76,255,11489},{58,255,6109},{52,255,9860},{19,255,1155},{19,255,1155},{0,191,505},{0,208,9554},{0,176,4059},{129,255,1424},{129,255,1424},{129,255,1424},{109,248,0},{232,0,4418},{49,255,289},{49,255,289},{0,191,505},{255,107,4418},{0,191,505},{255,174,1352},{192,255,500},{177,255,0}, +{95,255,0},{255,174,1352},{255,215,1352},{95,255,0},{0,229,1352},{255,215,1352},{0,229,1352},{54,0,5941},{54,0,5941},{54,0,5941},{54,0,5941},{12,255,433},{12,255,433},{12,255,433},{0,162,0},{0,129,2248},{0,129,2248},{86,255,65535},{43,255,26766},{21,255,10162},{13,255,5358},{86,255,65359},{28,255,20101},{4,255,1047},{0,246,1573},{0,254,45474},{0,227,20192},{172,255,6085},{149,255,2901},{141,255,1618},{119,255,2},{255,70,9818}, +{95,255,3685},{64,255,442},{0,222,2150},{255,165,9818},{0,222,2150},{86,255,13320},{86,255,13320},{86,255,13320},{61,255,7370},{58,255,11310},{22,255,1973},{22,255,1973},{0,200,400},{0,218,10107},{0,188,4361},{141,255,1618},{141,255,1618},{141,255,1618},{119,255,2},{245,0,4418},{64,255,442},{64,255,442},{0,200,400},{254,121,4418},{0,200,400},{255,186,925},{204,255,337},{190,255,0},{122,255,0},{255,186,925},{255,221,925},{122,255,0}, +{0,233,925},{255,221,925},{0,233,925},{59,0,6962},{59,0,6962},{59,0,6962},{59,0,6962},{15,255,801},{15,255,801},{15,255,801},{0,175,0},{0,141,2645},{0,141,2645},{86,255,65535},{43,255,27616},{24,255,11405},{16,255,6203},{86,255,65014},{28,255,20233},{5,255,1524},{0,249,1090},{1,255,44974},{0,227,19721},{175,255,5534},{156,255,2885},{150,255,1801},{128,255,40},{255,86,8901},{107,255,3373},{79,255,605},{0,228,1522},{255,172,8901}, +{0,228,1522},{89,255,15066},{89,255,15066},{89,255,15066},{67,255,8646},{64,255,12746},{28,255,2881},{28,255,2881},{0,209,317},{0,230,10691},{0,194,4661},{150,255,1801},{150,255,1801},{150,255,1801},{128,255,40},{255,4,4418},{79,255,605},{79,255,605},{0,209,317},{255,132,4418},{0,209,317},{255,198,613},{213,255,218},{202,255,0},{146,255,0},{255,198,613},{255,227,613},{146,255,0},{0,237,613},{255,227,613},{0,237,613},{63,0,7938}, +{63,0,7938},{63,0,7938},{63,0,7938},{18,255,1224},{18,255,1224},{18,255,1224},{0,187,0},{0,150,3026},{0,150,3026},{89,255,65535},{43,255,28505},{24,255,12681},{16,255,7117},{86,255,64678},{28,255,20430},{7,255,2079},{0,249,697},{1,255,44506},{0,227,19330},{181,255,5094},{165,255,2891},{159,255,1994},{137,255,130},{255,104,8069},{119,255,3125},{92,255,820},{0,234,1006},{255,181,8069},{0,234,1006},{95,255,16946},{95,255,16946},{95,255,16946}, +{73,255,10074},{67,255,14315},{34,255,3965},{34,255,3965},{0,219,250},{0,239,11302},{0,203,4985},{159,255,1994},{159,255,1994},{159,255,1994},{137,255,130},{255,28,4418},{92,255,820},{92,255,820},{0,219,250},{255,144,4418},{0,219,250},{255,210,365},{222,255,125},{214,255,0},{171,255,0},{255,210,365},{255,233,365},{171,255,0},{0,241,365},{255,233,365},{0,241,365},{67,0,8978},{67,0,8978},{67,0,8978},{67,0,8978},{24,255,1732}, +{24,255,1732},{24,255,1732},{0,199,0},{0,159,3433},{0,159,3433},{92,255,65535},{49,255,29231},{30,255,13748},{22,255,7832},{89,255,64474},{34,255,20616},{13,255,2581},{5,251,455},{1,255,43254},{0,230,17214},{187,255,4726},{175,255,2921},{172,255,2196},{146,255,272},{255,119,7322},{131,255,2941},{107,255,1037},{0,240,602},{254,189,7322},{0,240,602},{101,255,17762},{101,255,17762},{101,255,17762},{79,255,10742},{76,255,15150},{43,255,4710},{43,255,4710}, +{3,228,217},{0,251,10994},{0,212,4545},{172,255,2196},{172,255,2196},{172,255,2196},{146,255,272},{255,52,4418},{107,255,1037},{107,255,1037},{0,228,185},{255,156,4418},{0,228,185},{255,222,181},{231,255,58},{226,255,0},{195,255,0},{255,222,181},{255,239,181},{195,255,0},{0,245,181},{255,239,181},{0,245,181},{74,0,9248},{74,0,9248},{74,0,9248},{74,0,9248},{30,255,2020},{30,255,2020},{30,255,2020},{6,208,0},{0,172,3176}, +{0,172,3176},{98,255,65535},{58,255,30030},{43,255,14936},{31,255,8624},{95,255,64295},{43,255,20818},{22,255,3192},{15,252,275},{1,255,41806},{0,236,14271},{196,255,4387},{184,255,2987},{178,255,2410},{158,255,490},{255,137,6584},{146,255,2811},{125,255,1313},{0,246,278},{254,198,6584},{0,246,278},{113,255,18273},{113,255,18273},{113,255,18273},{89,255,11256},{89,255,15726},{55,255,5525},{55,255,5525},{12,237,217},{0,254,10500},{0,224,3805},{178,255,2410}, +{178,255,2410},{178,255,2410},{158,255,490},{255,79,4418},{125,255,1313},{125,255,1313},{0,240,125},{253,170,4418},{0,240,125},{255,237,50},{243,255,13},{239,255,0},{222,255,0},{255,237,50},{254,247,50},{222,255,0},{0,250,50},{254,247,50},{0,250,50},{83,0,9248},{83,0,9248},{83,0,9248},{83,0,9248},{43,255,2228},{43,255,2228},{43,255,2228},{15,217,0},{0,190,2738},{0,190,2738},{104,255,65535},{67,255,30820},{49,255,16060}, +{40,255,9410},{101,255,64140},{52,255,21086},{31,255,3826},{22,253,162},{1,255,40863},{0,239,11797},{202,255,4163},{193,255,3077},{187,255,2633},{167,255,740},{255,152,6019},{158,255,2763},{137,255,1585},{0,252,110},{255,205,6019},{0,252,110},{119,255,18737},{119,255,18737},{119,255,18737},{98,255,11747},{98,255,16315},{64,255,6305},{64,255,6305},{20,245,217},{1,255,10451},{0,236,3205},{187,255,2633},{187,255,2633},{187,255,2633},{167,255,740},{255,104,4418}, +{137,255,1585},{137,255,1585},{0,249,80},{255,181,4418},{0,249,80},{255,249,2},{252,255,0},{251,255,0},{246,255,0},{255,249,2},{254,253,2},{246,255,0},{0,254,2},{254,253,2},{0,254,2},{91,0,9248},{91,0,9248},{91,0,9248},{91,0,9248},{49,255,2440},{49,255,2440},{49,255,2440},{23,225,0},{0,205,2377},{0,205,2377},{110,255,65535},{73,255,31223},{55,255,16690},{49,255,9985},{107,255,63957},{58,255,21217},{38,255,4182}, +{30,255,97},{1,255,40169},{0,242,9493},{208,255,3603},{199,255,2717},{193,255,2357},{174,255,725},{255,164,5163},{167,255,2409},{149,255,1445},{0,255,16},{255,211,5163},{0,255,16},{129,255,18104},{129,255,18104},{129,255,18104},{107,255,11680},{107,255,15698},{73,255,6401},{73,255,6401},{27,249,133},{1,255,9723},{0,242,2489},{193,255,2357},{193,255,2357},{193,255,2357},{174,255,725},{255,119,3872},{149,255,1445},{149,255,1445},{0,252,13},{254,189,3872}, +{0,252,13},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{99,0,9248},{99,0,9248},{99,0,9248},{99,0,9248},{61,255,2664},{61,255,2664},{61,255,2664},{31,233,0},{0,218,2000},{0,218,2000},{116,255,65535},{79,255,31523},{64,255,17156},{55,255,10522},{113,255,63756},{67,255,21315},{46,255,4385},{38,254,41},{4,255,39799},{0,245,7354},{215,255,2952}, +{202,255,2243},{199,255,1945},{183,255,593},{255,171,4267},{167,255,2009},{158,255,1186},{10,255,0},{254,214,4267},{10,255,0},{135,255,17216},{135,255,17216},{135,255,17216},{116,255,11435},{113,255,14726},{82,255,6281},{82,255,6281},{38,251,53},{1,255,8923},{0,248,1877},{199,255,1945},{199,255,1945},{199,255,1945},{183,255,593},{255,131,3200},{158,255,1186},{158,255,1186},{10,255,0},{254,195,3200},{10,255,0},{255,252,0},{255,254,0},{254,255,0}, +{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{107,0,9248},{107,0,9248},{107,0,9248},{107,0,9248},{70,255,2897},{70,255,2897},{70,255,2897},{39,241,0},{0,233,1693},{0,233,1693},{122,255,65535},{89,255,32024},{73,255,17745},{64,255,11181},{119,255,63505},{73,255,21450},{55,255,4731},{48,255,5},{13,255,39517},{0,248,5202},{218,255,2308},{208,255,1762},{205,255,1530},{192,255,464},{255,180,3361}, +{183,255,1587},{167,255,928},{37,255,0},{255,218,3361},{37,255,0},{141,255,16274},{141,255,16274},{141,255,16274},{122,255,11169},{122,255,13721},{92,255,6189},{92,255,6189},{47,254,6},{13,255,8241},{0,254,1395},{205,255,1530},{205,255,1530},{205,255,1530},{192,255,464},{255,143,2521},{167,255,928},{167,255,928},{37,255,0},{254,201,2521},{37,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0}, +{0,255,0},{255,254,0},{0,255,0},{116,0,9248},{116,0,9248},{116,0,9248},{116,0,9248},{79,255,3170},{79,255,3170},{79,255,3170},{48,250,0},{0,248,1378},{0,248,1378},{129,255,65535},{95,255,32533},{79,255,18407},{73,255,11877},{129,255,63435},{82,255,21690},{64,255,5107},{56,255,2},{25,255,39436},{0,248,3611},{221,255,1809},{215,255,1374},{211,255,1202},{198,255,360},{255,189,2646},{192,255,1241},{180,255,745},{61,255,0},{254,223,2646}, +{61,255,0},{147,255,15490},{147,255,15490},{147,255,15490},{131,255,10946},{129,255,12826},{101,255,6125},{101,255,6125},{56,255,4},{25,255,7705},{0,254,1171},{211,255,1202},{211,255,1202},{211,255,1202},{198,255,360},{255,155,1985},{180,255,745},{180,255,745},{61,255,0},{254,207,1985},{61,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{124,0,9248}, +{124,0,9248},{124,0,9248},{124,0,9248},{89,255,3393},{89,255,3393},{89,255,3393},{56,255,4},{0,254,1170},{0,254,1170},{132,255,65535},{101,255,32957},{86,255,19017},{82,255,12610},{129,255,62977},{89,255,22061},{73,255,5530},{64,255,31},{34,255,39178},{0,251,2372},{224,255,1376},{218,255,1044},{218,255,900},{204,255,272},{255,198,2017},{198,255,937},{189,255,562},{86,255,0},{255,227,2017},{86,255,0},{153,255,14754},{153,255,14754},{153,255,14754}, +{137,255,10742},{135,255,12066},{107,255,6089},{107,255,6089},{67,255,45},{37,255,7233},{1,255,1184},{218,255,900},{218,255,900},{218,255,900},{204,255,272},{255,167,1513},{189,255,562},{189,255,562},{86,255,0},{253,213,1513},{86,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{132,0,9248},{132,0,9248},{132,0,9248},{132,0,9248},{98,255,3656}, +{98,255,3656},{98,255,3656},{67,255,45},{1,255,1184},{1,255,1184},{138,255,65535},{107,255,33448},{95,255,19729},{89,255,13446},{135,255,62717},{95,255,22307},{79,255,6021},{73,255,105},{40,255,38959},{0,254,1627},{230,255,996},{224,255,756},{221,255,653},{213,255,194},{255,204,1473},{207,255,675},{198,255,405},{110,255,0},{255,230,1473},{110,255,0},{162,255,14060},{162,255,14060},{162,255,14060},{146,255,10545},{141,255,11378},{116,255,6077},{116,255,6077}, +{76,255,137},{40,255,6873},{7,255,1412},{221,255,653},{221,255,653},{221,255,653},{213,255,194},{255,180,1105},{198,255,405},{198,255,405},{110,255,0},{255,218,1105},{110,255,0},{255,252,0},{255,254,0},{254,255,0},{252,255,0},{255,252,0},{255,254,0},{252,255,0},{0,255,0},{255,254,0},{0,255,0},{140,0,9248},{140,0,9248},{140,0,9248},{140,0,9248},{107,255,3929},{107,255,3929},{107,255,3929},{76,255,137},{7,255,1412}, +{7,255,1412}, diff --git a/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_55.inc b/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_55.inc new file mode 100644 index 0000000..7acedd6 --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_55.inc @@ -0,0 +1,481 @@ +{0,2,20},{0,1,10},{0,1,1},{0,1,9},{0,1,35},{0,1,27},{0,1,18},{0,1,61},{0,1,52},{0,0,68},{0,2,20},{0,1,10},{0,1,1},{0,1,9},{0,1,35},{0,1,27},{0,1,18},{0,1,61},{1,0,35},{0,1,61},{0,1,1},{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,1}, +{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{1,0,18},{0,1,10},{0,1,1},{0,1,9},{1,0,18},{0,1,18},{0,1,9},{0,1,36},{0,1,18},{0,1,36},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,4,56},{0,3,38},{0,2,52}, +{0,2,36},{0,4,56},{0,3,35},{0,2,0},{0,2,52},{0,2,88},{0,1,78},{1,3,24},{1,2,14},{1,2,5},{1,2,13},{1,2,51},{0,3,35},{0,2,0},{0,2,52},{2,1,51},{0,2,52},{0,3,37},{0,3,37},{0,3,37},{0,2,36},{0,3,10},{0,2,0},{0,2,0},{0,1,5},{0,1,35},{0,1,14},{1,2,5},{1,2,5},{1,2,5},{1,1,8},{1,1,8}, +{0,2,0},{0,2,0},{0,1,5},{1,1,8},{0,1,5},{2,1,18},{0,3,2},{1,2,1},{0,2,0},{2,1,18},{1,2,18},{0,2,0},{0,2,36},{1,2,18},{0,2,36},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,2,0},{0,2,0},{0,2,0},{0,1,1},{0,1,10},{0,1,10},{1,5,56},{1,4,38},{1,3,52},{1,3,36},{1,5,56},{1,4,35},{1,3,0}, +{1,3,52},{0,4,72},{0,3,38},{2,4,24},{2,3,14},{2,3,5},{2,3,13},{2,3,51},{0,4,24},{1,3,0},{0,3,37},{3,2,51},{0,3,37},{1,4,37},{1,4,37},{1,4,37},{1,3,36},{1,4,10},{1,3,0},{1,3,0},{1,2,5},{0,3,11},{1,2,14},{2,3,5},{2,3,5},{2,3,5},{2,2,8},{2,2,8},{1,3,0},{1,3,0},{1,2,5},{2,2,8}, +{1,2,5},{3,2,18},{1,4,2},{2,3,1},{1,3,0},{3,2,18},{7,0,18},{1,3,0},{0,3,36},{7,0,18},{0,3,36},{1,0,36},{1,0,36},{1,0,36},{1,0,36},{1,3,0},{1,3,0},{1,3,0},{1,2,1},{0,3,2},{0,3,2},{2,6,56},{2,5,38},{2,4,53},{2,4,37},{2,6,56},{2,5,35},{2,4,1},{2,4,66},{0,5,60},{1,4,52},{3,5,24}, +{3,4,14},{3,4,6},{3,4,14},{3,4,51},{1,5,24},{2,4,1},{1,4,51},{9,0,51},{1,4,51},{2,5,37},{2,5,37},{2,5,37},{2,4,36},{2,5,10},{2,4,0},{2,4,0},{2,3,5},{1,4,11},{2,3,14},{3,4,5},{3,4,5},{3,4,5},{3,3,8},{3,3,8},{2,4,0},{2,4,0},{2,3,5},{8,0,8},{2,3,5},{4,3,18},{2,5,2},{3,4,2}, +{2,4,1},{4,3,18},{8,1,18},{2,4,1},{0,4,50},{8,1,18},{0,4,50},{2,0,36},{2,0,36},{2,0,36},{2,0,36},{2,4,0},{2,4,0},{2,4,0},{2,3,1},{1,4,2},{1,4,2},{3,8,70},{3,6,58},{4,5,69},{3,5,51},{3,7,52},{3,6,25},{3,5,3},{3,5,46},{2,6,60},{2,5,36},{4,6,24},{4,5,14},{4,5,5},{4,5,13},{6,2,51}, +{3,6,24},{3,5,2},{2,5,36},{7,3,51},{2,5,36},{3,7,51},{3,7,51},{3,7,51},{3,5,51},{3,6,9},{3,5,3},{3,5,3},{3,4,9},{1,6,12},{3,4,12},{4,5,5},{4,5,5},{4,5,5},{4,4,8},{6,1,8},{3,5,2},{3,5,2},{3,4,8},{11,0,8},{3,4,8},{7,1,18},{3,6,8},{4,5,1},{3,5,1},{7,1,18},{11,1,18},{3,5,1}, +{0,5,36},{11,1,18},{0,5,36},{3,0,50},{3,0,50},{3,0,50},{3,0,50},{3,5,2},{3,5,2},{3,5,2},{3,4,5},{2,5,0},{2,5,0},{4,8,56},{4,7,38},{4,6,52},{4,6,36},{4,8,56},{4,7,35},{4,6,0},{4,6,52},{3,7,60},{3,6,36},{5,7,24},{5,6,14},{5,6,5},{5,6,13},{8,1,51},{3,7,35},{4,6,0},{3,6,36},{6,5,51}, +{3,6,36},{4,7,37},{4,7,37},{4,7,37},{4,6,36},{4,7,10},{4,6,0},{4,6,0},{4,5,5},{2,7,12},{4,5,14},{5,6,5},{5,6,5},{5,6,5},{5,5,8},{8,0,8},{4,6,0},{4,6,0},{4,5,5},{5,5,8},{4,5,5},{9,0,18},{4,7,2},{5,6,1},{4,6,0},{9,0,18},{15,0,18},{4,6,0},{0,6,36},{15,0,18},{0,6,36},{4,0,36}, +{4,0,36},{4,0,36},{4,0,36},{4,6,0},{4,6,0},{4,6,0},{4,5,1},{3,6,0},{3,6,0},{5,9,56},{5,8,38},{5,7,52},{5,7,36},{5,9,56},{5,8,35},{5,7,0},{5,7,52},{3,8,63},{4,7,38},{6,8,24},{6,7,14},{6,7,5},{6,7,13},{9,2,51},{4,8,24},{5,7,0},{4,7,37},{17,0,51},{4,7,37},{5,8,37},{5,8,37},{5,8,37}, +{5,7,36},{5,8,10},{5,7,0},{5,7,0},{5,6,5},{4,7,11},{5,6,14},{6,7,5},{6,7,5},{6,7,5},{6,6,8},{9,1,8},{5,7,0},{5,7,0},{5,6,5},{16,0,8},{5,6,5},{10,1,18},{5,8,2},{6,7,1},{5,7,0},{10,1,18},{16,1,18},{5,7,0},{0,7,36},{16,1,18},{0,7,36},{5,0,36},{5,0,36},{5,0,36},{5,0,36},{5,7,0}, +{5,7,0},{5,7,0},{5,6,1},{4,7,2},{4,7,2},{6,10,56},{6,9,38},{6,8,53},{6,8,37},{6,10,56},{6,9,35},{6,8,1},{6,8,66},{4,9,60},{5,8,52},{7,9,24},{7,8,14},{7,8,6},{7,8,14},{10,3,51},{5,9,24},{6,8,1},{5,8,51},{18,1,51},{5,8,51},{6,9,37},{6,9,37},{6,9,37},{6,8,36},{6,9,10},{6,8,0},{6,8,0}, +{6,7,5},{5,8,11},{6,7,14},{7,8,5},{7,8,5},{7,8,5},{7,7,8},{10,2,8},{6,8,0},{6,8,0},{6,7,5},{17,1,8},{6,7,5},{11,2,18},{6,9,2},{7,8,2},{6,8,1},{11,2,18},{17,2,18},{6,8,1},{0,8,50},{17,2,18},{0,8,50},{6,0,36},{6,0,36},{6,0,36},{6,0,36},{6,8,0},{6,8,0},{6,8,0},{6,7,1},{5,8,2}, +{5,8,2},{7,12,70},{7,10,58},{8,9,69},{7,9,51},{7,11,52},{7,10,25},{7,9,3},{7,9,46},{6,10,60},{6,9,36},{8,10,24},{8,9,14},{8,9,5},{8,9,13},{13,1,51},{7,10,24},{7,9,2},{6,9,36},{21,1,51},{6,9,36},{7,11,51},{7,11,51},{7,11,51},{7,9,51},{7,10,9},{7,9,3},{7,9,3},{7,8,9},{5,10,12},{7,8,12},{8,9,5}, +{8,9,5},{8,9,5},{8,8,8},{13,0,8},{7,9,2},{7,9,2},{7,8,8},{20,1,8},{7,8,8},{14,0,18},{7,10,8},{8,9,1},{7,9,1},{14,0,18},{20,2,18},{7,9,1},{0,9,36},{20,2,18},{0,9,36},{7,0,50},{7,0,50},{7,0,50},{7,0,50},{7,9,2},{7,9,2},{7,9,2},{7,8,5},{6,9,0},{6,9,0},{8,12,56},{8,11,38},{8,10,52}, +{8,10,36},{8,12,56},{8,11,35},{8,10,0},{8,10,52},{7,11,60},{7,10,36},{9,11,24},{9,10,14},{9,10,5},{9,10,13},{14,2,51},{7,11,35},{8,10,0},{7,10,36},{25,0,51},{7,10,36},{8,11,37},{8,11,37},{8,11,37},{8,10,36},{8,11,10},{8,10,0},{8,10,0},{8,9,5},{6,11,12},{8,9,14},{9,10,5},{9,10,5},{9,10,5},{9,9,8},{14,1,8}, +{8,10,0},{8,10,0},{8,9,5},{24,0,8},{8,9,5},{15,1,18},{8,11,2},{9,10,1},{8,10,0},{15,1,18},{24,1,18},{8,10,0},{0,10,36},{24,1,18},{0,10,36},{8,0,36},{8,0,36},{8,0,36},{8,0,36},{8,10,0},{8,10,0},{8,10,0},{8,9,1},{7,10,0},{7,10,0},{9,13,56},{9,12,38},{9,11,52},{9,11,36},{9,13,56},{9,12,35},{9,11,0}, +{9,11,52},{7,12,63},{8,11,38},{10,12,24},{10,11,14},{10,11,5},{10,11,13},{16,1,51},{8,12,24},{9,11,0},{8,11,37},{26,1,51},{8,11,37},{9,12,37},{9,12,37},{9,12,37},{9,11,36},{9,12,10},{9,11,0},{9,11,0},{9,10,5},{8,11,11},{9,10,14},{10,11,5},{10,11,5},{10,11,5},{10,10,8},{16,0,8},{9,11,0},{9,11,0},{9,10,5},{25,1,8}, +{9,10,5},{17,0,18},{9,12,2},{10,11,1},{9,11,0},{17,0,18},{25,2,18},{9,11,0},{0,11,36},{25,2,18},{0,11,36},{9,0,36},{9,0,36},{9,0,36},{9,0,36},{9,11,0},{9,11,0},{9,11,0},{9,10,1},{8,11,2},{8,11,2},{10,14,56},{10,13,38},{10,12,53},{10,12,37},{10,14,56},{10,13,35},{10,12,1},{10,12,66},{8,13,60},{9,12,52},{11,13,24}, +{11,12,14},{11,12,6},{11,12,14},{17,2,51},{9,13,24},{10,12,1},{9,12,51},{27,2,51},{9,12,51},{10,13,37},{10,13,37},{10,13,37},{10,12,36},{10,13,10},{10,12,0},{10,12,0},{10,11,5},{9,12,11},{10,11,14},{11,12,5},{11,12,5},{11,12,5},{11,11,8},{17,1,8},{10,12,0},{10,12,0},{10,11,5},{26,2,8},{10,11,5},{18,1,18},{10,13,2},{11,12,2}, +{10,12,1},{18,1,18},{31,0,18},{10,12,1},{0,12,50},{31,0,18},{0,12,50},{10,0,36},{10,0,36},{10,0,36},{10,0,36},{10,12,0},{10,12,0},{10,12,0},{10,11,1},{9,12,2},{9,12,2},{11,16,70},{11,14,58},{12,13,69},{11,13,51},{11,15,52},{11,14,25},{11,13,3},{11,13,46},{10,14,60},{10,13,36},{12,14,24},{12,13,14},{12,13,5},{12,13,13},{17,5,51}, +{11,14,24},{11,13,2},{10,13,36},{30,2,51},{10,13,36},{11,15,51},{11,15,51},{11,15,51},{11,13,51},{11,14,9},{11,13,3},{11,13,3},{11,12,9},{9,14,12},{11,12,12},{12,13,5},{12,13,5},{12,13,5},{12,12,8},{17,4,8},{11,13,2},{11,13,2},{11,12,8},{29,2,8},{11,12,8},{18,4,18},{11,14,8},{12,13,1},{11,13,1},{18,4,18},{29,3,18},{11,13,1}, +{0,13,36},{29,3,18},{0,13,36},{11,0,50},{11,0,50},{11,0,50},{11,0,50},{11,13,2},{11,13,2},{11,13,2},{11,12,5},{10,13,0},{10,13,0},{12,16,56},{12,15,38},{12,14,52},{12,14,36},{12,16,56},{12,15,35},{12,14,0},{12,14,52},{11,15,60},{11,14,36},{13,15,24},{13,14,14},{13,14,5},{13,14,13},{18,6,51},{11,15,35},{12,14,0},{11,14,36},{31,3,51}, +{11,14,36},{12,15,37},{12,15,37},{12,15,37},{12,14,36},{12,15,10},{12,14,0},{12,14,0},{12,13,5},{10,15,12},{12,13,14},{13,14,5},{13,14,5},{13,14,5},{13,13,8},{18,5,8},{12,14,0},{12,14,0},{12,13,5},{30,3,8},{12,13,5},{20,3,18},{12,15,2},{13,14,1},{12,14,0},{20,3,18},{28,5,18},{12,14,0},{0,14,36},{28,5,18},{0,14,36},{12,0,36}, +{12,0,36},{12,0,36},{12,0,36},{12,14,0},{12,14,0},{12,14,0},{12,13,1},{11,14,0},{11,14,0},{13,17,56},{13,16,38},{13,15,52},{13,15,36},{13,17,56},{13,16,35},{13,15,0},{13,15,52},{11,16,63},{12,15,38},{14,16,24},{14,15,14},{14,15,5},{14,15,13},{23,0,51},{12,16,24},{13,15,0},{12,15,37},{30,5,51},{12,15,37},{13,16,37},{13,16,37},{13,16,37}, +{13,15,36},{13,16,10},{13,15,0},{13,15,0},{13,14,5},{12,15,11},{13,14,14},{14,15,5},{14,15,5},{14,15,5},{14,14,8},{20,4,8},{13,15,0},{13,15,0},{13,14,5},{29,5,8},{13,14,5},{21,4,18},{13,16,2},{14,15,1},{13,15,0},{21,4,18},{29,6,18},{13,15,0},{0,15,36},{29,6,18},{0,15,36},{13,0,36},{13,0,36},{13,0,36},{13,0,36},{13,15,0}, +{13,15,0},{13,15,0},{13,14,1},{12,15,2},{12,15,2},{14,18,56},{14,17,38},{14,16,53},{14,16,37},{14,18,56},{14,17,35},{14,16,1},{14,16,66},{12,17,60},{13,16,52},{15,17,24},{15,16,14},{15,16,6},{15,16,14},{24,1,51},{13,17,24},{14,16,1},{13,16,51},{31,6,51},{13,16,51},{14,17,37},{14,17,37},{14,17,37},{14,16,36},{14,17,10},{14,16,0},{14,16,0}, +{14,15,5},{13,16,11},{14,15,14},{15,16,5},{15,16,5},{15,16,5},{15,15,8},{24,0,8},{14,16,0},{14,16,0},{14,15,5},{30,6,8},{14,15,5},{25,0,18},{14,17,2},{15,16,2},{14,16,1},{25,0,18},{30,7,18},{14,16,1},{0,16,50},{30,7,18},{0,16,50},{14,0,36},{14,0,36},{14,0,36},{14,0,36},{14,16,0},{14,16,0},{14,16,0},{14,15,1},{13,16,2}, +{13,16,2},{15,20,70},{15,18,58},{16,17,69},{15,17,51},{15,19,52},{15,18,25},{15,17,3},{15,17,46},{14,18,60},{14,17,36},{16,18,24},{16,17,14},{16,17,5},{16,17,13},{21,9,51},{15,18,24},{15,17,2},{14,17,36},{29,9,51},{14,17,36},{15,19,51},{15,19,51},{15,19,51},{15,17,51},{15,18,9},{15,17,3},{15,17,3},{15,16,9},{13,18,12},{15,16,12},{16,17,5}, +{16,17,5},{16,17,5},{16,16,8},{24,3,8},{15,17,2},{15,17,2},{15,16,8},{28,9,8},{15,16,8},{25,3,18},{15,18,8},{16,17,1},{15,17,1},{25,3,18},{28,10,18},{15,17,1},{0,17,36},{28,10,18},{0,17,36},{15,0,50},{15,0,50},{15,0,50},{15,0,50},{15,17,2},{15,17,2},{15,17,2},{15,16,5},{14,17,0},{14,17,0},{16,20,56},{16,19,38},{16,18,52}, +{16,18,36},{16,20,56},{16,19,35},{16,18,0},{16,18,52},{15,19,60},{15,18,36},{17,19,24},{17,18,14},{17,18,5},{17,18,13},{22,10,51},{15,19,35},{16,18,0},{15,18,36},{30,10,51},{15,18,36},{16,19,37},{16,19,37},{16,19,37},{16,18,36},{16,19,10},{16,18,0},{16,18,0},{16,17,5},{14,19,12},{16,17,14},{17,18,5},{17,18,5},{17,18,5},{17,17,8},{22,9,8}, +{16,18,0},{16,18,0},{16,17,5},{29,10,8},{16,17,5},{24,7,18},{16,19,2},{17,18,1},{16,18,0},{24,7,18},{29,11,18},{16,18,0},{0,18,36},{29,11,18},{0,18,36},{16,0,36},{16,0,36},{16,0,36},{16,0,36},{16,18,0},{16,18,0},{16,18,0},{16,17,1},{15,18,0},{15,18,0},{17,21,56},{17,20,38},{17,19,52},{17,19,36},{17,21,56},{17,20,35},{17,19,0}, +{17,19,52},{15,20,63},{16,19,38},{18,20,24},{18,19,14},{18,19,5},{18,19,13},{27,4,51},{16,20,24},{17,19,0},{16,19,37},{31,11,51},{16,19,37},{17,20,37},{17,20,37},{17,20,37},{17,19,36},{17,20,10},{17,19,0},{17,19,0},{17,18,5},{16,19,11},{17,18,14},{18,19,5},{18,19,5},{18,19,5},{18,18,8},{24,8,8},{17,19,0},{17,19,0},{17,18,5},{30,11,8}, +{17,18,5},{28,3,18},{17,20,2},{18,19,1},{17,19,0},{28,3,18},{28,13,18},{17,19,0},{0,19,36},{28,13,18},{0,19,36},{17,0,36},{17,0,36},{17,0,36},{17,0,36},{17,19,0},{17,19,0},{17,19,0},{17,18,1},{16,19,2},{16,19,2},{18,22,56},{18,21,38},{18,20,53},{18,20,37},{18,22,56},{18,21,35},{18,20,1},{18,20,66},{16,21,60},{17,20,52},{19,21,24}, +{19,20,14},{19,20,6},{19,20,14},{31,0,51},{17,21,24},{18,20,1},{17,20,51},{30,13,51},{17,20,51},{18,21,37},{18,21,37},{18,21,37},{18,20,36},{18,21,10},{18,20,0},{18,20,0},{18,19,5},{17,20,11},{18,19,14},{19,20,5},{19,20,5},{19,20,5},{19,19,8},{28,4,8},{18,20,0},{18,20,0},{18,19,5},{29,13,8},{18,19,5},{29,4,18},{18,21,2},{19,20,2}, +{18,20,1},{29,4,18},{29,14,18},{18,20,1},{0,20,50},{29,14,18},{0,20,50},{18,0,36},{18,0,36},{18,0,36},{18,0,36},{18,20,0},{18,20,0},{18,20,0},{18,19,1},{17,20,2},{17,20,2},{19,24,70},{19,22,58},{20,21,69},{19,21,51},{19,23,52},{19,22,25},{19,21,3},{19,21,46},{18,22,60},{18,21,36},{20,22,24},{20,21,14},{20,21,5},{20,21,13},{31,3,51}, +{19,22,24},{19,21,2},{18,21,36},{23,19,51},{18,21,36},{19,23,51},{19,23,51},{19,23,51},{19,21,51},{19,22,9},{19,21,3},{19,21,3},{19,20,9},{17,22,12},{19,20,12},{20,21,5},{20,21,5},{20,21,5},{20,20,8},{31,2,8},{19,21,2},{19,21,2},{19,20,8},{27,16,8},{19,20,8},{29,7,18},{19,22,8},{20,21,1},{19,21,1},{29,7,18},{27,17,18},{19,21,1}, +{0,21,36},{27,17,18},{0,21,36},{19,0,50},{19,0,50},{19,0,50},{19,0,50},{19,21,2},{19,21,2},{19,21,2},{19,20,5},{18,21,0},{18,21,0},{20,24,56},{20,23,38},{20,22,52},{20,22,36},{20,24,56},{20,23,35},{20,22,0},{20,22,52},{19,23,60},{19,22,36},{21,23,24},{21,22,14},{21,22,5},{21,22,13},{26,14,51},{19,23,35},{20,22,0},{19,22,36},{22,21,51}, +{19,22,36},{20,23,37},{20,23,37},{20,23,37},{20,22,36},{20,23,10},{20,22,0},{20,22,0},{20,21,5},{18,23,12},{20,21,14},{21,22,5},{21,22,5},{21,22,5},{21,21,8},{26,13,8},{20,22,0},{20,22,0},{20,21,5},{21,21,8},{20,21,5},{28,11,18},{20,23,2},{21,22,1},{20,22,0},{28,11,18},{31,16,18},{20,22,0},{0,22,36},{31,16,18},{0,22,36},{20,0,36}, +{20,0,36},{20,0,36},{20,0,36},{20,22,0},{20,22,0},{20,22,0},{20,21,1},{19,22,0},{19,22,0},{21,25,56},{21,24,38},{21,23,52},{21,23,36},{21,25,56},{21,24,35},{21,23,0},{21,23,52},{19,24,63},{20,23,38},{22,24,24},{22,23,14},{22,23,5},{22,23,13},{31,8,51},{20,24,24},{21,23,0},{20,23,37},{28,19,51},{20,23,37},{21,24,37},{21,24,37},{21,24,37}, +{21,23,36},{21,24,10},{21,23,0},{21,23,0},{21,22,5},{20,23,11},{21,22,14},{22,23,5},{22,23,5},{22,23,5},{22,22,8},{28,12,8},{21,23,0},{21,23,0},{21,22,5},{22,22,8},{21,22,5},{29,12,18},{21,24,2},{22,23,1},{21,23,0},{29,12,18},{27,20,18},{21,23,0},{0,23,36},{27,20,18},{0,23,36},{21,0,36},{21,0,36},{21,0,36},{21,0,36},{21,23,0}, +{21,23,0},{21,23,0},{21,22,1},{20,23,2},{20,23,2},{22,26,56},{22,25,38},{22,24,53},{22,24,37},{22,26,56},{22,25,35},{22,24,1},{22,24,66},{20,25,60},{21,24,52},{23,25,24},{23,24,14},{23,24,6},{23,24,14},{29,14,51},{21,25,24},{22,24,1},{21,24,51},{29,20,51},{21,24,51},{22,25,37},{22,25,37},{22,25,37},{22,24,36},{22,25,10},{22,24,0},{22,24,0}, +{22,23,5},{21,24,11},{22,23,14},{23,24,5},{23,24,5},{23,24,5},{23,23,8},{29,13,8},{22,24,0},{22,24,0},{22,23,5},{28,20,8},{22,23,5},{30,13,18},{22,25,2},{23,24,2},{22,24,1},{30,13,18},{28,21,18},{22,24,1},{0,24,50},{28,21,18},{0,24,50},{22,0,36},{22,0,36},{22,0,36},{22,0,36},{22,24,0},{22,24,0},{22,24,0},{22,23,1},{21,24,2}, +{21,24,2},{23,28,70},{23,26,58},{24,25,69},{23,25,51},{23,27,52},{23,26,25},{23,25,3},{23,25,46},{22,26,60},{22,25,36},{24,26,24},{24,25,14},{24,25,5},{24,25,13},{29,17,51},{23,26,24},{23,25,2},{22,25,36},{27,23,51},{22,25,36},{23,27,51},{23,27,51},{23,27,51},{23,25,51},{23,26,9},{23,25,3},{23,25,3},{23,24,9},{21,26,12},{23,24,12},{24,25,5}, +{24,25,5},{24,25,5},{24,24,8},{29,16,8},{23,25,2},{23,25,2},{23,24,8},{31,20,8},{23,24,8},{30,16,18},{23,26,8},{24,25,1},{23,25,1},{30,16,18},{31,21,18},{23,25,1},{0,25,36},{31,21,18},{0,25,36},{23,0,50},{23,0,50},{23,0,50},{23,0,50},{23,25,2},{23,25,2},{23,25,2},{23,24,5},{22,25,0},{22,25,0},{24,28,56},{24,27,38},{24,26,52}, +{24,26,36},{24,28,56},{24,27,35},{24,26,0},{24,26,52},{23,27,60},{23,26,36},{25,27,24},{25,26,14},{25,26,5},{25,26,13},{30,18,51},{23,27,35},{24,26,0},{23,26,36},{26,25,51},{23,26,36},{24,27,37},{24,27,37},{24,27,37},{24,26,36},{24,27,10},{24,26,0},{24,26,0},{24,25,5},{22,27,12},{24,25,14},{25,26,5},{25,26,5},{25,26,5},{25,25,8},{30,17,8}, +{24,26,0},{24,26,0},{24,25,5},{25,25,8},{24,25,5},{31,17,18},{24,27,2},{25,26,1},{24,26,0},{31,17,18},{25,26,18},{24,26,0},{0,26,36},{25,26,18},{0,26,36},{24,0,36},{24,0,36},{24,0,36},{24,0,36},{24,26,0},{24,26,0},{24,26,0},{24,25,1},{23,26,0},{23,26,0},{25,29,56},{25,28,38},{25,27,52},{25,27,36},{25,29,56},{25,28,35},{25,27,0}, +{25,27,52},{23,28,63},{24,27,38},{26,28,24},{26,27,14},{26,27,5},{26,27,13},{31,19,51},{24,28,24},{25,27,0},{24,27,37},{27,26,51},{24,27,37},{25,28,37},{25,28,37},{25,28,37},{25,27,36},{25,28,10},{25,27,0},{25,27,0},{25,26,5},{24,27,11},{25,26,14},{26,27,5},{26,27,5},{26,27,5},{26,26,8},{31,18,8},{25,27,0},{25,27,0},{25,26,5},{26,26,8}, +{25,26,5},{30,21,18},{25,28,2},{26,27,1},{25,27,0},{30,21,18},{31,24,18},{25,27,0},{0,27,36},{31,24,18},{0,27,36},{25,0,36},{25,0,36},{25,0,36},{25,0,36},{25,27,0},{25,27,0},{25,27,0},{25,26,1},{24,27,2},{24,27,2},{26,30,56},{26,29,38},{26,28,53},{26,28,37},{26,30,56},{26,29,35},{26,28,1},{26,28,66},{24,29,60},{25,28,52},{27,29,24}, +{27,28,14},{27,28,6},{27,28,14},{30,23,51},{25,29,24},{26,28,1},{25,28,51},{28,27,51},{25,28,51},{26,29,37},{26,29,37},{26,29,37},{26,28,36},{26,29,10},{26,28,0},{26,28,0},{26,27,5},{25,28,11},{26,27,14},{27,28,5},{27,28,5},{27,28,5},{27,27,8},{30,22,8},{26,28,0},{26,28,0},{26,27,5},{27,27,8},{26,27,5},{31,22,18},{26,29,2},{27,28,2}, +{26,28,1},{31,22,18},{27,28,18},{26,28,1},{0,28,50},{27,28,18},{0,28,50},{26,0,36},{26,0,36},{26,0,36},{26,0,36},{26,28,0},{26,28,0},{26,28,0},{26,27,1},{25,28,2},{25,28,2},{27,31,76},{27,30,58},{28,29,69},{27,29,51},{27,31,52},{27,30,25},{27,29,3},{27,29,46},{26,30,60},{26,29,36},{28,30,24},{28,29,14},{28,29,5},{28,29,13},{30,26,51}, +{27,30,24},{27,29,2},{26,29,36},{31,27,51},{26,29,36},{27,31,51},{27,31,51},{27,31,51},{27,29,51},{27,30,9},{27,29,3},{27,29,3},{27,28,9},{25,30,12},{27,28,12},{28,29,5},{28,29,5},{28,29,5},{28,28,8},{30,25,8},{27,29,2},{27,29,2},{27,28,8},{30,27,8},{27,28,8},{31,25,18},{27,30,8},{28,29,1},{27,29,1},{31,25,18},{28,29,18},{27,29,1}, +{0,29,36},{28,29,18},{0,29,36},{27,0,50},{27,0,50},{27,0,50},{27,0,50},{27,29,2},{27,29,2},{27,29,2},{27,28,5},{26,29,0},{26,29,0},{28,31,86},{28,31,38},{28,30,52},{28,30,36},{28,31,59},{28,31,35},{28,30,0},{28,30,52},{27,31,60},{27,30,36},{29,31,24},{29,30,14},{29,30,5},{29,30,13},{31,27,51},{27,31,35},{28,30,0},{27,30,36},{30,29,51}, +{27,30,36},{28,31,37},{28,31,37},{28,31,37},{28,30,36},{28,31,10},{28,30,0},{28,30,0},{28,29,5},{26,31,12},{28,29,14},{29,30,5},{29,30,5},{29,30,5},{29,29,8},{31,26,8},{28,30,0},{28,30,0},{28,29,5},{29,29,8},{28,29,5},{30,29,18},{28,31,2},{29,30,1},{28,30,0},{30,29,18},{29,30,18},{28,30,0},{0,30,36},{29,30,18},{0,30,36},{28,0,36}, +{28,0,36},{28,0,36},{28,0,36},{28,30,0},{28,30,0},{28,30,0},{28,29,1},{27,30,0},{27,30,0},{30,31,94},{30,31,78},{29,31,52},{29,31,36},{30,31,115},{29,31,36},{29,31,0},{29,31,52},{29,31,88},{28,31,38},{30,31,30},{30,31,14},{30,31,5},{30,31,13},{30,31,51},{29,31,36},{29,31,0},{28,31,37},{31,30,51},{28,31,37},{29,31,52},{29,31,52},{29,31,52}, +{29,31,36},{29,31,16},{29,31,0},{29,31,0},{29,30,5},{28,31,11},{29,30,14},{30,31,5},{30,31,5},{30,31,5},{30,30,8},{30,30,8},{29,31,0},{29,31,0},{29,30,5},{30,30,8},{29,30,5},{31,30,18},{30,31,10},{30,31,1},{29,31,0},{31,30,18},{30,31,18},{29,31,0},{0,31,36},{30,31,18},{0,31,36},{29,0,36},{29,0,36},{29,0,36},{29,0,36},{29,31,0}, +{29,31,0},{29,31,0},{29,30,1},{28,31,2},{28,31,2},{31,31,68},{31,31,68},{30,31,61},{30,31,45},{30,31,59},{30,31,27},{30,31,18},{30,31,1},{30,31,28},{30,31,10},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{30,31,1},{31,31,4},{30,31,1},{30,31,61},{30,31,61},{30,31,61},{30,31,45},{30,31,34},{30,31,18},{30,31,18}, +{30,31,1},{30,31,19},{30,31,10},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{30,31,1},{31,31,4},{30,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{30,0,36},{30,0,36},{30,0,36},{30,0,36},{30,31,9},{30,31,9},{30,31,9},{30,31,1},{30,31,10}, +{30,31,10},{0,4,74},{0,3,20},{0,2,2},{0,2,26},{0,2,158},{0,2,110},{0,2,62},{0,1,115},{0,1,178},{0,1,124},{0,4,74},{0,3,20},{0,2,2},{0,2,26},{1,1,154},{0,2,110},{0,2,62},{0,1,115},{1,1,154},{0,1,115},{0,2,1},{0,2,1},{0,2,1},{0,1,0},{0,1,13},{0,1,9},{0,1,9},{0,0,25},{0,0,25},{0,0,25},{0,2,1}, +{0,2,1},{0,2,1},{0,1,0},{0,1,13},{0,1,9},{0,1,9},{0,0,25},{1,0,13},{0,0,25},{1,2,72},{0,3,20},{0,2,2},{0,2,26},{1,2,72},{2,1,72},{0,2,26},{0,1,90},{2,1,72},{0,1,90},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,6,83},{0,5,13},{0,3,26}, +{0,3,14},{0,5,248},{0,3,140},{0,3,41},{0,2,139},{0,2,319},{0,2,175},{0,6,83},{0,5,13},{0,3,26},{0,3,14},{1,3,243},{0,3,140},{0,3,41},{0,2,139},{3,1,243},{0,2,139},{0,4,10},{0,4,10},{0,4,10},{0,3,13},{0,3,52},{0,2,18},{0,2,18},{0,1,29},{0,1,77},{0,1,38},{0,4,10},{0,4,10},{0,4,10},{0,3,13},{1,1,50}, +{0,2,18},{0,2,18},{0,1,29},{1,1,50},{0,1,29},{2,3,72},{0,5,4},{1,3,2},{0,3,5},{2,3,72},{3,2,72},{0,3,5},{0,2,90},{3,2,72},{0,2,90},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,1,0},{0,1,0},{0,1,0},{0,1,4},{0,0,9},{0,0,9},{1,7,147},{1,6,77},{1,4,89},{1,4,77},{0,7,244},{0,5,96},{0,4,2}, +{0,3,106},{0,4,395},{0,3,187},{1,7,83},{1,6,13},{1,4,25},{1,4,13},{2,4,243},{0,5,96},{0,4,2},{0,3,106},{4,2,243},{0,3,106},{1,5,74},{1,5,74},{1,5,74},{1,4,77},{0,5,52},{0,4,2},{0,4,2},{0,3,25},{0,3,133},{0,2,62},{1,5,10},{1,5,10},{1,5,10},{1,4,13},{2,2,50},{0,4,2},{0,4,2},{0,3,25},{2,2,50}, +{0,3,25},{3,4,72},{1,6,4},{2,4,1},{0,4,1},{3,4,72},{9,0,72},{0,4,1},{0,3,90},{9,0,72},{0,3,90},{1,0,73},{1,0,73},{1,0,73},{1,0,73},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,2,37},{0,2,37},{2,8,164},{2,7,94},{2,5,106},{2,5,94},{1,8,245},{1,6,97},{1,5,3},{1,4,97},{0,6,364},{0,4,106},{2,8,83}, +{2,7,13},{2,5,25},{2,5,13},{6,0,243},{0,7,76},{1,5,2},{0,4,81},{10,0,243},{0,4,81},{2,6,91},{2,6,91},{2,6,91},{2,5,94},{1,6,53},{1,5,3},{1,5,3},{1,3,27},{0,4,107},{0,4,42},{2,6,10},{2,6,10},{2,6,10},{2,5,13},{3,3,50},{1,5,2},{1,5,2},{0,4,17},{8,0,50},{0,4,17},{7,0,72},{2,7,4},{3,5,1}, +{1,5,1},{7,0,72},{10,1,72},{1,5,1},{0,4,80},{10,1,72},{0,4,80},{2,0,90},{2,0,90},{2,0,90},{2,0,90},{1,5,2},{1,5,2},{1,5,2},{1,3,2},{0,3,20},{0,3,20},{3,10,154},{3,8,81},{3,6,106},{3,6,82},{2,10,248},{2,7,99},{2,6,5},{2,5,99},{0,7,308},{0,5,100},{3,10,90},{3,8,17},{4,6,27},{3,6,18},{6,3,243}, +{1,8,73},{2,6,5},{1,5,90},{8,3,243},{1,5,90},{3,8,81},{3,8,81},{3,8,81},{3,6,81},{2,8,52},{2,6,4},{2,6,4},{2,5,18},{0,6,72},{0,5,19},{3,8,17},{3,8,17},{3,8,17},{3,6,17},{6,1,50},{2,6,4},{2,6,4},{1,5,9},{11,0,50},{1,5,9},{8,1,72},{3,8,1},{4,6,2},{3,6,2},{8,1,72},{6,5,72},{3,6,2}, +{0,5,90},{6,5,72},{0,5,90},{3,0,80},{3,0,80},{3,0,80},{3,0,80},{2,6,0},{2,6,0},{2,6,0},{2,4,4},{0,6,8},{0,6,8},{4,10,164},{4,9,94},{4,7,107},{4,7,95},{3,11,248},{3,8,89},{3,7,5},{3,6,99},{0,9,253},{1,6,100},{4,10,83},{4,9,13},{4,7,26},{4,7,14},{8,2,243},{2,9,73},{3,7,5},{2,6,90},{12,2,243}, +{2,6,90},{4,8,91},{4,8,91},{4,8,91},{4,7,94},{3,9,52},{3,7,4},{3,7,4},{3,6,18},{0,8,50},{1,6,19},{4,8,10},{4,8,10},{4,8,10},{4,7,13},{8,0,50},{3,7,4},{3,7,4},{2,6,9},{5,5,50},{2,6,9},{9,2,72},{4,9,4},{5,7,2},{3,7,5},{9,2,72},{17,0,72},{3,7,5},{0,6,90},{17,0,72},{0,6,90},{4,0,90}, +{4,0,90},{4,0,90},{4,0,90},{3,7,0},{3,7,0},{3,7,0},{3,5,4},{1,7,8},{1,7,8},{5,11,164},{5,10,94},{5,8,106},{5,8,94},{4,11,245},{4,9,97},{4,8,3},{4,7,107},{0,11,249},{2,7,100},{5,11,83},{5,10,13},{5,8,25},{5,8,13},{9,3,243},{3,10,73},{4,8,2},{3,7,90},{18,0,243},{3,7,90},{5,9,91},{5,9,91},{5,9,91}, +{5,8,94},{4,9,53},{4,8,3},{4,8,3},{4,7,26},{1,9,50},{2,7,19},{5,9,10},{5,9,10},{5,9,10},{5,8,13},{9,1,50},{4,8,2},{4,8,2},{3,7,9},{16,0,50},{3,7,9},{10,3,72},{5,10,4},{6,8,1},{4,8,1},{10,3,72},{18,1,72},{4,8,1},{0,7,90},{18,1,72},{0,7,90},{5,0,90},{5,0,90},{5,0,90},{5,0,90},{4,8,2}, +{4,8,2},{4,8,2},{4,6,2},{1,8,9},{1,8,9},{6,12,164},{6,11,94},{6,9,106},{6,9,94},{5,12,245},{5,10,97},{5,9,3},{5,8,97},{1,12,252},{3,8,85},{6,12,83},{6,11,13},{6,9,25},{6,9,13},{10,4,243},{4,11,76},{5,9,2},{4,8,81},{19,1,243},{4,8,81},{6,10,91},{6,10,91},{6,10,91},{6,9,94},{5,10,53},{5,9,3},{5,9,3}, +{5,7,27},{2,10,50},{3,8,21},{6,10,10},{6,10,10},{6,10,10},{6,9,13},{10,2,50},{5,9,2},{5,9,2},{4,8,17},{17,1,50},{4,8,17},{11,4,72},{6,11,4},{7,9,1},{5,9,1},{11,4,72},{19,2,72},{5,9,1},{0,8,80},{19,2,72},{0,8,80},{6,0,90},{6,0,90},{6,0,90},{6,0,90},{5,9,2},{5,9,2},{5,9,2},{5,7,2},{3,8,5}, +{3,8,5},{7,14,154},{7,12,81},{7,10,106},{7,10,82},{6,14,248},{6,11,99},{6,10,5},{6,9,99},{2,13,244},{4,9,100},{7,14,90},{7,12,17},{8,10,27},{7,10,18},{13,2,243},{5,12,73},{6,10,5},{5,9,90},{22,1,243},{5,9,90},{7,12,81},{7,12,81},{7,12,81},{7,10,81},{6,12,52},{6,10,4},{6,10,4},{6,9,18},{3,11,53},{4,9,19},{7,12,17}, +{7,12,17},{7,12,17},{7,10,17},{13,0,50},{6,10,4},{6,10,4},{5,9,9},{20,1,50},{5,9,9},{14,2,72},{7,12,1},{8,10,2},{7,10,2},{14,2,72},{25,0,72},{7,10,2},{0,9,90},{25,0,72},{0,9,90},{7,0,80},{7,0,80},{7,0,80},{7,0,80},{6,10,0},{6,10,0},{6,10,0},{6,8,4},{4,10,8},{4,10,8},{8,14,164},{8,13,94},{8,11,107}, +{8,11,95},{7,15,248},{7,12,89},{7,11,5},{7,10,99},{3,14,244},{5,10,100},{8,14,83},{8,13,13},{8,11,26},{8,11,14},{14,3,243},{6,13,73},{7,11,5},{6,10,90},{26,0,243},{6,10,90},{8,12,91},{8,12,91},{8,12,91},{8,11,94},{7,13,52},{7,11,4},{7,11,4},{7,10,18},{4,12,50},{5,10,19},{8,12,10},{8,12,10},{8,12,10},{8,11,13},{14,1,50}, +{7,11,4},{7,11,4},{6,10,9},{24,0,50},{6,10,9},{16,1,72},{8,13,4},{9,11,2},{7,11,5},{16,1,72},{26,1,72},{7,11,5},{0,10,90},{26,1,72},{0,10,90},{8,0,90},{8,0,90},{8,0,90},{8,0,90},{7,11,0},{7,11,0},{7,11,0},{7,9,4},{5,11,8},{5,11,8},{9,15,164},{9,14,94},{9,12,106},{9,12,94},{8,15,245},{8,13,97},{8,12,3}, +{8,11,107},{4,15,249},{6,11,100},{9,15,83},{9,14,13},{9,12,25},{9,12,13},{16,2,243},{7,14,73},{8,12,2},{7,11,90},{27,1,243},{7,11,90},{9,13,91},{9,13,91},{9,13,91},{9,12,94},{8,13,53},{8,12,3},{8,12,3},{8,11,26},{5,13,50},{6,11,19},{9,13,10},{9,13,10},{9,13,10},{9,12,13},{16,0,50},{8,12,2},{8,12,2},{7,11,9},{25,1,50}, +{7,11,9},{17,2,72},{9,14,4},{10,12,1},{8,12,1},{17,2,72},{27,2,72},{8,12,1},{0,11,90},{27,2,72},{0,11,90},{9,0,90},{9,0,90},{9,0,90},{9,0,90},{8,12,2},{8,12,2},{8,12,2},{8,10,2},{5,12,9},{5,12,9},{10,16,164},{10,15,94},{10,13,106},{10,13,94},{9,16,245},{9,14,97},{9,13,3},{9,12,97},{5,16,252},{7,12,85},{10,16,83}, +{10,15,13},{10,13,25},{10,13,13},{17,3,243},{8,15,76},{9,13,2},{8,12,81},{28,2,243},{8,12,81},{10,14,91},{10,14,91},{10,14,91},{10,13,94},{9,14,53},{9,13,3},{9,13,3},{9,11,27},{6,14,50},{7,12,21},{10,14,10},{10,14,10},{10,14,10},{10,13,13},{17,1,50},{9,13,2},{9,13,2},{8,12,17},{26,2,50},{8,12,17},{18,3,72},{10,15,4},{11,13,1}, +{9,13,1},{18,3,72},{28,3,72},{9,13,1},{0,12,80},{28,3,72},{0,12,80},{10,0,90},{10,0,90},{10,0,90},{10,0,90},{9,13,2},{9,13,2},{9,13,2},{9,11,2},{7,12,5},{7,12,5},{11,18,154},{11,16,81},{11,14,106},{11,14,82},{10,18,248},{10,15,99},{10,14,5},{10,13,99},{6,17,244},{8,13,100},{11,18,90},{11,16,17},{12,14,27},{11,14,18},{17,6,243}, +{9,16,73},{10,14,5},{9,13,90},{31,2,243},{9,13,90},{11,16,81},{11,16,81},{11,16,81},{11,14,81},{10,16,52},{10,14,4},{10,14,4},{10,13,18},{7,15,53},{8,13,19},{11,16,17},{11,16,17},{11,16,17},{11,14,17},{17,4,50},{10,14,4},{10,14,4},{9,13,9},{29,2,50},{9,13,9},{18,6,72},{11,16,1},{12,14,2},{11,14,2},{18,6,72},{31,3,72},{11,14,2}, +{0,13,90},{31,3,72},{0,13,90},{11,0,80},{11,0,80},{11,0,80},{11,0,80},{10,14,0},{10,14,0},{10,14,0},{10,12,4},{8,14,8},{8,14,8},{12,18,164},{12,17,94},{12,15,107},{12,15,95},{11,19,248},{11,16,89},{11,15,5},{11,14,99},{7,18,244},{9,14,100},{12,18,83},{12,17,13},{12,15,26},{12,15,14},{22,0,243},{10,17,73},{11,15,5},{10,14,90},{30,4,243}, +{10,14,90},{12,16,91},{12,16,91},{12,16,91},{12,15,94},{11,17,52},{11,15,4},{11,15,4},{11,14,18},{8,16,50},{9,14,19},{12,16,10},{12,16,10},{12,16,10},{12,15,13},{18,5,50},{11,15,4},{11,15,4},{10,14,9},{30,3,50},{10,14,9},{23,0,72},{12,17,4},{13,15,2},{11,15,5},{23,0,72},{30,5,72},{11,15,5},{0,14,90},{30,5,72},{0,14,90},{12,0,90}, +{12,0,90},{12,0,90},{12,0,90},{11,15,0},{11,15,0},{11,15,0},{11,13,4},{9,15,8},{9,15,8},{13,19,164},{13,18,94},{13,16,106},{13,16,94},{12,19,245},{12,17,97},{12,16,3},{12,15,107},{8,19,249},{10,15,100},{13,19,83},{13,18,13},{13,16,25},{13,16,13},{23,1,243},{11,18,73},{12,16,2},{11,15,90},{31,5,243},{11,15,90},{13,17,91},{13,17,91},{13,17,91}, +{13,16,94},{12,17,53},{12,16,3},{12,16,3},{12,15,26},{9,17,50},{10,15,19},{13,17,10},{13,17,10},{13,17,10},{13,16,13},{20,4,50},{12,16,2},{12,16,2},{11,15,9},{29,5,50},{11,15,9},{24,1,72},{13,18,4},{14,16,1},{12,16,1},{24,1,72},{31,6,72},{12,16,1},{0,15,90},{31,6,72},{0,15,90},{13,0,90},{13,0,90},{13,0,90},{13,0,90},{12,16,2}, +{12,16,2},{12,16,2},{12,14,2},{9,16,9},{9,16,9},{14,20,164},{14,19,94},{14,17,106},{14,17,94},{13,20,245},{13,18,97},{13,17,3},{13,16,97},{9,20,252},{11,16,85},{14,20,83},{14,19,13},{14,17,25},{14,17,13},{24,2,243},{12,19,76},{13,17,2},{12,16,81},{27,9,243},{12,16,81},{14,18,91},{14,18,91},{14,18,91},{14,17,94},{13,18,53},{13,17,3},{13,17,3}, +{13,15,27},{10,18,50},{11,16,21},{14,18,10},{14,18,10},{14,18,10},{14,17,13},{24,0,50},{13,17,2},{13,17,2},{12,16,17},{30,6,50},{12,16,17},{25,2,72},{14,19,4},{15,17,1},{13,17,1},{25,2,72},{27,10,72},{13,17,1},{0,16,80},{27,10,72},{0,16,80},{14,0,90},{14,0,90},{14,0,90},{14,0,90},{13,17,2},{13,17,2},{13,17,2},{13,15,2},{11,16,5}, +{11,16,5},{15,22,154},{15,20,81},{15,18,106},{15,18,82},{14,22,248},{14,19,99},{14,18,5},{14,17,99},{10,21,244},{12,17,100},{15,22,90},{15,20,17},{16,18,27},{15,18,18},{27,0,243},{13,20,73},{14,18,5},{13,17,90},{30,9,243},{13,17,90},{15,20,81},{15,20,81},{15,20,81},{15,18,81},{14,20,52},{14,18,4},{14,18,4},{14,17,18},{11,19,53},{12,17,19},{15,20,17}, +{15,20,17},{15,20,17},{15,18,17},{24,3,50},{14,18,4},{14,18,4},{13,17,9},{28,9,50},{13,17,9},{22,10,72},{15,20,1},{16,18,2},{15,18,2},{22,10,72},{30,10,72},{15,18,2},{0,17,90},{30,10,72},{0,17,90},{15,0,80},{15,0,80},{15,0,80},{15,0,80},{14,18,0},{14,18,0},{14,18,0},{14,16,4},{12,18,8},{12,18,8},{16,22,164},{16,21,94},{16,19,107}, +{16,19,95},{15,23,248},{15,20,89},{15,19,5},{15,18,99},{11,22,244},{13,18,100},{16,22,83},{16,21,13},{16,19,26},{16,19,14},{26,4,243},{14,21,73},{15,19,5},{14,18,90},{31,10,243},{14,18,90},{16,20,91},{16,20,91},{16,20,91},{16,19,94},{15,21,52},{15,19,4},{15,19,4},{15,18,18},{12,20,50},{13,18,19},{16,20,10},{16,20,10},{16,20,10},{16,19,13},{22,9,50}, +{15,19,4},{15,19,4},{14,18,9},{29,10,50},{14,18,9},{27,4,72},{16,21,4},{17,19,2},{15,19,5},{27,4,72},{31,11,72},{15,19,5},{0,18,90},{31,11,72},{0,18,90},{16,0,90},{16,0,90},{16,0,90},{16,0,90},{15,19,0},{15,19,0},{15,19,0},{15,17,4},{13,19,8},{13,19,8},{17,23,164},{17,22,94},{17,20,106},{17,20,94},{16,23,245},{16,21,97},{16,20,3}, +{16,19,107},{12,23,249},{14,19,100},{17,23,83},{17,22,13},{17,20,25},{17,20,13},{30,0,243},{15,22,73},{16,20,2},{15,19,90},{30,12,243},{15,19,90},{17,21,91},{17,21,91},{17,21,91},{17,20,94},{16,21,53},{16,20,3},{16,20,3},{16,19,26},{13,21,50},{14,19,19},{17,21,10},{17,21,10},{17,21,10},{17,20,13},{24,8,50},{16,20,2},{16,20,2},{15,19,9},{30,11,50}, +{15,19,9},{31,0,72},{17,22,4},{18,20,1},{16,20,1},{31,0,72},{30,13,72},{16,20,1},{0,19,90},{30,13,72},{0,19,90},{17,0,90},{17,0,90},{17,0,90},{17,0,90},{16,20,2},{16,20,2},{16,20,2},{16,18,2},{13,20,9},{13,20,9},{18,24,164},{18,23,94},{18,21,106},{18,21,94},{17,24,245},{17,22,97},{17,21,3},{17,20,97},{13,24,252},{15,20,85},{18,24,83}, +{18,23,13},{18,21,25},{18,21,13},{31,1,243},{16,23,76},{17,21,2},{16,20,81},{31,13,243},{16,20,81},{18,22,91},{18,22,91},{18,22,91},{18,21,94},{17,22,53},{17,21,3},{17,21,3},{17,19,27},{14,22,50},{15,20,21},{18,22,10},{18,22,10},{18,22,10},{18,21,13},{28,4,50},{17,21,2},{17,21,2},{16,20,17},{29,13,50},{16,20,17},{29,6,72},{18,23,4},{19,21,1}, +{17,21,1},{29,6,72},{31,14,72},{17,21,1},{0,20,80},{31,14,72},{0,20,80},{18,0,90},{18,0,90},{18,0,90},{18,0,90},{17,21,2},{17,21,2},{17,21,2},{17,19,2},{15,20,5},{15,20,5},{19,26,154},{19,24,81},{19,22,106},{19,22,82},{18,26,248},{18,23,99},{18,22,5},{18,21,99},{14,25,244},{16,21,100},{19,26,90},{19,24,17},{20,22,27},{19,22,18},{31,4,243}, +{17,24,73},{18,22,5},{17,21,90},{24,19,243},{17,21,90},{19,24,81},{19,24,81},{19,24,81},{19,22,81},{18,24,52},{18,22,4},{18,22,4},{18,21,18},{15,23,53},{16,21,19},{19,24,17},{19,24,17},{19,24,17},{19,22,17},{31,2,50},{18,22,4},{18,22,4},{17,21,9},{27,16,50},{17,21,9},{26,14,72},{19,24,1},{20,22,2},{19,22,2},{26,14,72},{22,21,72},{19,22,2}, +{0,21,90},{22,21,72},{0,21,90},{19,0,80},{19,0,80},{19,0,80},{19,0,80},{18,22,0},{18,22,0},{18,22,0},{18,20,4},{16,22,8},{16,22,8},{20,26,164},{20,25,94},{20,23,107},{20,23,95},{19,27,248},{19,24,89},{19,23,5},{19,22,99},{15,26,244},{17,22,100},{20,26,83},{20,25,13},{20,23,26},{20,23,14},{30,8,243},{18,25,73},{19,23,5},{18,22,90},{28,18,243}, +{18,22,90},{20,24,91},{20,24,91},{20,24,91},{20,23,94},{19,25,52},{19,23,4},{19,23,4},{19,22,18},{16,24,50},{17,22,19},{20,24,10},{20,24,10},{20,24,10},{20,23,13},{26,13,50},{19,23,4},{19,23,4},{18,22,9},{21,21,50},{18,22,9},{31,8,72},{20,25,4},{21,23,2},{19,23,5},{31,8,72},{28,19,72},{19,23,5},{0,22,90},{28,19,72},{0,22,90},{20,0,90}, +{20,0,90},{20,0,90},{20,0,90},{19,23,0},{19,23,0},{19,23,0},{19,21,4},{17,23,8},{17,23,8},{21,27,164},{21,26,94},{21,24,106},{21,24,94},{20,27,245},{20,25,97},{20,24,3},{20,23,107},{16,27,249},{18,23,100},{21,27,83},{21,26,13},{21,24,25},{21,24,13},{31,9,243},{19,26,73},{20,24,2},{19,23,90},{29,19,243},{19,23,90},{21,25,91},{21,25,91},{21,25,91}, +{21,24,94},{20,25,53},{20,24,3},{20,24,3},{20,23,26},{17,25,50},{18,23,19},{21,25,10},{21,25,10},{21,25,10},{21,24,13},{28,12,50},{20,24,2},{20,24,2},{19,23,9},{22,22,50},{19,23,9},{29,14,72},{21,26,4},{22,24,1},{20,24,1},{29,14,72},{29,20,72},{20,24,1},{0,23,90},{29,20,72},{0,23,90},{21,0,90},{21,0,90},{21,0,90},{21,0,90},{20,24,2}, +{20,24,2},{20,24,2},{20,22,2},{17,24,9},{17,24,9},{22,28,164},{22,27,94},{22,25,106},{22,25,94},{21,28,245},{21,26,97},{21,25,3},{21,24,97},{17,28,252},{19,24,85},{22,28,83},{22,27,13},{22,25,25},{22,25,13},{29,15,243},{20,27,76},{21,25,2},{20,24,81},{30,20,243},{20,24,81},{22,26,91},{22,26,91},{22,26,91},{22,25,94},{21,26,53},{21,25,3},{21,25,3}, +{21,23,27},{18,26,50},{19,24,21},{22,26,10},{22,26,10},{22,26,10},{22,25,13},{29,13,50},{21,25,2},{21,25,2},{20,24,17},{28,20,50},{20,24,17},{30,15,72},{22,27,4},{23,25,1},{21,25,1},{30,15,72},{30,21,72},{21,25,1},{0,24,80},{30,21,72},{0,24,80},{22,0,90},{22,0,90},{22,0,90},{22,0,90},{21,25,2},{21,25,2},{21,25,2},{21,23,2},{19,24,5}, +{19,24,5},{23,30,154},{23,28,81},{23,26,106},{23,26,82},{22,30,248},{22,27,99},{22,26,5},{22,25,99},{18,29,244},{20,25,100},{23,30,90},{23,28,17},{24,26,27},{23,26,18},{29,18,243},{21,28,73},{22,26,5},{21,25,90},{28,23,243},{21,25,90},{23,28,81},{23,28,81},{23,28,81},{23,26,81},{22,28,52},{22,26,4},{22,26,4},{22,25,18},{19,27,53},{20,25,19},{23,28,17}, +{23,28,17},{23,28,17},{23,26,17},{29,16,50},{22,26,4},{22,26,4},{21,25,9},{31,20,50},{21,25,9},{30,18,72},{23,28,1},{24,26,2},{23,26,2},{30,18,72},{26,25,72},{23,26,2},{0,25,90},{26,25,72},{0,25,90},{23,0,80},{23,0,80},{23,0,80},{23,0,80},{22,26,0},{22,26,0},{22,26,0},{22,24,4},{20,26,8},{20,26,8},{24,30,164},{24,29,94},{24,27,107}, +{24,27,95},{23,31,248},{23,28,89},{23,27,5},{23,26,99},{19,30,244},{21,26,100},{24,30,83},{24,29,13},{24,27,26},{24,27,14},{30,19,243},{22,29,73},{23,27,5},{22,26,90},{27,25,243},{22,26,90},{24,28,91},{24,28,91},{24,28,91},{24,27,94},{23,29,52},{23,27,4},{23,27,4},{23,26,18},{20,28,50},{21,26,19},{24,28,10},{24,28,10},{24,28,10},{24,27,13},{30,17,50}, +{23,27,4},{23,27,4},{22,26,9},{25,25,50},{22,26,9},{31,19,72},{24,29,4},{25,27,2},{23,27,5},{31,19,72},{27,26,72},{23,27,5},{0,26,90},{27,26,72},{0,26,90},{24,0,90},{24,0,90},{24,0,90},{24,0,90},{23,27,0},{23,27,0},{23,27,0},{23,25,4},{21,27,8},{21,27,8},{25,31,164},{25,30,94},{25,28,106},{25,28,94},{24,31,245},{24,29,97},{24,28,3}, +{24,27,107},{20,31,249},{22,27,100},{25,31,83},{25,30,13},{25,28,25},{25,28,13},{29,23,243},{23,30,73},{24,28,2},{23,27,90},{28,26,243},{23,27,90},{25,29,91},{25,29,91},{25,29,91},{25,28,94},{24,29,53},{24,28,3},{24,28,3},{24,27,26},{21,29,50},{22,27,19},{25,29,10},{25,29,10},{25,29,10},{25,28,13},{31,18,50},{24,28,2},{24,28,2},{23,27,9},{26,26,50}, +{23,27,9},{30,23,72},{25,30,4},{26,28,1},{24,28,1},{30,23,72},{28,27,72},{24,28,1},{0,27,90},{28,27,72},{0,27,90},{25,0,90},{25,0,90},{25,0,90},{25,0,90},{24,28,2},{24,28,2},{24,28,2},{24,26,2},{21,28,9},{21,28,9},{26,31,194},{26,31,94},{26,29,106},{26,29,94},{25,31,284},{25,30,97},{25,29,3},{25,28,97},{22,31,253},{23,28,85},{27,31,99}, +{26,31,13},{26,29,25},{26,29,13},{30,24,243},{24,31,76},{25,29,2},{24,28,81},{29,27,243},{24,28,81},{26,30,91},{26,30,91},{26,30,91},{26,29,94},{25,30,53},{25,29,3},{25,29,3},{25,27,27},{22,30,50},{23,28,21},{26,30,10},{26,30,10},{26,30,10},{26,29,13},{30,22,50},{25,29,2},{25,29,2},{24,28,17},{27,27,50},{24,28,17},{31,24,72},{26,31,4},{27,29,1}, +{25,29,1},{31,24,72},{24,31,72},{25,29,1},{0,28,80},{24,31,72},{0,28,80},{26,0,90},{26,0,90},{26,0,90},{26,0,90},{25,29,2},{25,29,2},{25,29,2},{25,27,2},{23,28,5},{23,28,5},{27,31,280},{27,31,120},{27,30,106},{27,30,82},{27,31,328},{26,31,99},{26,30,5},{26,29,99},{24,31,308},{24,29,100},{28,31,105},{28,31,45},{28,30,27},{27,30,18},{30,27,243}, +{26,31,99},{26,30,5},{25,29,90},{30,28,243},{25,29,90},{27,31,84},{27,31,84},{27,31,84},{27,30,81},{26,31,58},{26,30,4},{26,30,4},{26,29,18},{23,31,53},{24,29,19},{27,31,20},{27,31,20},{27,31,20},{27,30,17},{30,25,50},{26,30,4},{26,30,4},{25,29,9},{30,27,50},{25,29,9},{31,27,72},{28,31,20},{28,30,2},{27,30,2},{31,27,72},{30,29,72},{27,30,2}, +{0,29,90},{30,29,72},{0,29,90},{27,0,80},{27,0,80},{27,0,80},{27,0,80},{26,30,0},{26,30,0},{26,30,0},{26,28,4},{24,30,8},{24,30,8},{28,31,331},{28,31,187},{28,31,106},{28,31,94},{28,31,358},{27,31,173},{27,31,4},{27,30,82},{26,31,355},{25,30,83},{29,31,126},{29,31,62},{28,31,25},{28,31,13},{30,29,221},{28,31,121},{27,31,4},{26,30,73},{29,30,221}, +{26,30,73},{28,31,106},{28,31,106},{28,31,106},{28,31,94},{27,31,100},{27,31,4},{27,31,4},{27,30,18},{25,31,72},{25,30,19},{28,31,25},{28,31,25},{28,31,25},{28,31,13},{31,26,50},{27,31,4},{27,31,4},{26,30,9},{29,29,50},{26,30,9},{31,29,61},{29,31,37},{29,31,1},{27,31,4},{31,29,61},{31,30,61},{27,31,4},{0,30,73},{31,30,61},{0,30,73},{28,0,90}, +{28,0,90},{28,0,90},{28,0,90},{27,31,0},{27,31,0},{27,31,0},{27,29,4},{25,31,8},{25,31,8},{29,31,239},{29,31,175},{29,31,139},{29,31,99},{29,31,239},{28,31,122},{28,31,41},{28,31,26},{28,31,233},{26,31,19},{30,31,54},{30,31,38},{30,31,29},{29,31,18},{30,31,93},{29,31,54},{29,31,18},{27,31,9},{31,30,93},{27,31,9},{29,31,139},{29,31,139},{29,31,139}, +{29,31,99},{29,31,139},{28,31,41},{28,31,41},{28,31,26},{27,31,116},{26,31,19},{30,31,29},{30,31,29},{30,31,29},{29,31,18},{30,30,50},{29,31,18},{29,31,18},{27,31,9},{30,30,50},{27,31,9},{31,30,9},{31,31,9},{30,31,4},{30,31,0},{31,30,9},{30,31,9},{30,31,0},{0,31,9},{30,31,9},{0,31,9},{29,0,90},{29,0,90},{29,0,90},{29,0,90},{28,31,5}, +{28,31,5},{28,31,5},{28,30,2},{26,31,10},{26,31,10},{30,31,140},{30,31,124},{30,31,115},{30,31,99},{30,31,131},{29,31,98},{29,31,62},{29,31,2},{29,31,122},{28,31,20},{31,31,25},{31,31,25},{31,31,25},{30,31,18},{31,30,22},{30,31,18},{30,31,9},{29,31,1},{30,31,22},{29,31,1},{30,31,115},{30,31,115},{30,31,115},{30,31,99},{30,31,106},{29,31,62},{29,31,62}, +{29,31,2},{29,31,86},{28,31,20},{31,31,25},{31,31,25},{31,31,25},{30,31,18},{31,30,13},{30,31,9},{30,31,9},{29,31,1},{30,31,13},{29,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{30,0,90},{30,0,90},{30,0,90},{30,0,90},{29,31,26},{29,31,26},{29,31,26},{29,31,2},{28,31,20}, +{28,31,20},{0,6,202},{0,5,52},{0,3,25},{0,3,61},{0,4,442},{0,3,313},{0,3,142},{0,2,318},{0,2,498},{0,2,354},{0,6,202},{0,5,52},{0,3,25},{0,3,61},{2,1,441},{0,3,313},{0,3,142},{0,2,318},{1,2,441},{0,2,318},{0,3,0},{0,3,0},{0,3,0},{0,2,1},{0,1,45},{0,1,25},{0,1,25},{0,1,26},{0,1,50},{0,1,35},{0,3,0}, +{0,3,0},{0,3,0},{0,2,1},{1,0,41},{0,1,25},{0,1,25},{0,1,26},{0,1,41},{0,1,26},{2,3,200},{0,5,52},{0,3,25},{0,3,61},{2,3,200},{3,2,200},{0,3,61},{0,2,218},{3,2,200},{0,2,218},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,9,200},{0,7,20},{0,5,20}, +{0,4,25},{0,6,686},{0,5,433},{0,4,169},{0,3,443},{0,3,794},{0,3,524},{0,9,200},{0,7,20},{0,5,20},{0,4,25},{3,1,686},{0,5,433},{0,4,169},{0,3,443},{6,0,686},{0,3,443},{0,6,1},{0,6,1},{0,6,1},{0,3,4},{0,3,145},{0,2,85},{0,2,85},{0,2,101},{0,1,178},{0,1,115},{0,6,1},{0,6,1},{0,6,1},{0,3,4},{1,1,145}, +{0,2,85},{0,2,85},{0,2,101},{3,0,145},{0,2,101},{3,4,200},{0,7,20},{1,4,16},{0,4,25},{3,4,200},{9,0,200},{0,4,25},{0,3,218},{9,0,200},{0,3,218},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,11,257},{0,9,54},{1,6,85},{0,5,65},{0,9,728},{0,6,371},{0,5,80}, +{0,4,377},{0,5,949},{0,4,521},{1,10,201},{1,8,18},{1,6,21},{1,5,26},{4,2,723},{0,6,371},{0,5,80},{0,4,377},{7,1,723},{0,4,377},{0,8,50},{0,8,50},{0,8,50},{0,5,49},{0,5,164},{0,4,50},{0,4,50},{0,3,65},{0,3,245},{0,2,126},{1,7,2},{1,7,2},{1,7,2},{1,4,5},{2,2,162},{0,4,50},{0,4,50},{0,3,65},{2,2,162}, +{0,3,65},{7,0,200},{0,9,5},{2,5,16},{0,5,16},{7,0,200},{10,1,200},{0,5,16},{0,4,208},{10,1,200},{0,4,208},{0,0,49},{0,0,49},{0,0,49},{0,0,49},{0,2,1},{0,2,1},{0,2,1},{0,1,4},{0,1,13},{0,1,13},{1,12,315},{1,10,118},{1,7,178},{1,6,129},{0,11,724},{0,8,289},{0,6,34},{0,5,308},{0,6,1087},{0,5,533},{2,11,201}, +{2,9,18},{2,7,21},{2,6,26},{5,3,723},{0,8,289},{0,6,34},{0,5,308},{8,2,723},{0,5,308},{1,9,114},{1,9,114},{1,9,114},{1,6,113},{0,8,162},{0,6,18},{0,6,18},{0,4,25},{0,4,338},{0,3,162},{2,8,2},{2,8,2},{2,8,2},{2,5,5},{3,3,162},{0,6,18},{0,6,18},{0,4,25},{8,0,162},{0,4,25},{6,4,200},{1,10,5},{3,6,16}, +{1,6,16},{6,4,200},{14,0,200},{1,6,16},{0,5,208},{14,0,200},{0,5,208},{1,0,113},{1,0,113},{1,0,113},{1,0,113},{0,5,0},{0,5,0},{0,5,0},{0,3,0},{0,2,61},{0,2,61},{2,14,410},{2,11,209},{2,8,288},{2,7,234},{0,14,739},{0,10,254},{0,8,33},{0,6,270},{0,8,1131},{0,6,450},{3,12,200},{3,10,13},{3,8,25},{3,7,29},{6,4,723}, +{0,10,238},{0,8,17},{0,6,254},{14,0,723},{0,6,254},{2,11,209},{2,11,209},{2,11,209},{2,7,209},{0,11,178},{0,8,17},{0,8,17},{0,5,18},{0,6,376},{0,5,123},{3,9,0},{3,9,0},{3,9,0},{3,7,4},{6,1,162},{0,8,1},{0,8,1},{0,5,2},{11,0,162},{0,5,2},{9,2,200},{2,11,1},{4,7,25},{0,8,17},{9,2,200},{17,0,200},{0,8,17}, +{0,6,218},{17,0,200},{0,6,218},{2,0,208},{2,0,208},{2,0,208},{2,0,208},{0,8,16},{0,8,16},{0,8,16},{1,4,17},{0,4,80},{0,4,80},{3,15,410},{3,12,212},{3,9,288},{3,8,224},{1,15,739},{1,11,254},{1,9,33},{1,7,270},{0,9,1013},{0,7,308},{4,13,201},{4,11,21},{4,9,21},{4,8,26},{10,0,723},{0,12,227},{1,9,17},{0,7,227},{15,1,723}, +{0,7,227},{3,11,212},{3,11,212},{3,11,212},{3,8,208},{2,10,180},{1,9,17},{1,9,17},{1,6,18},{0,8,306},{0,6,41},{4,10,2},{4,10,2},{4,10,2},{4,7,5},{8,0,162},{1,9,1},{1,9,1},{1,6,2},{5,5,162},{1,6,2},{10,3,200},{3,12,4},{5,8,16},{3,8,16},{10,3,200},{18,1,200},{3,8,16},{0,7,218},{18,1,200},{0,7,218},{3,0,208}, +{3,0,208},{3,0,208},{3,0,208},{1,9,16},{1,9,16},{1,9,16},{2,5,17},{0,6,40},{0,6,40},{4,15,426},{4,13,223},{4,10,283},{4,9,234},{2,16,739},{2,12,267},{2,10,33},{2,8,273},{0,11,913},{0,8,225},{5,14,201},{5,12,18},{5,10,21},{5,9,26},{11,1,723},{0,13,208},{2,10,17},{0,8,209},{16,2,723},{0,8,209},{4,12,219},{4,12,219},{4,12,219}, +{4,9,218},{3,11,180},{2,10,17},{2,10,17},{2,7,18},{0,9,229},{0,7,27},{5,11,2},{5,11,2},{5,11,2},{5,8,5},{9,1,162},{2,10,1},{2,10,1},{2,7,2},{16,0,162},{2,7,2},{11,4,200},{3,14,4},{6,9,16},{4,9,16},{11,4,200},{19,2,200},{4,9,16},{0,8,208},{19,2,200},{0,8,208},{4,0,218},{4,0,218},{4,0,218},{4,0,218},{2,10,16}, +{2,10,16},{2,10,16},{3,6,17},{0,8,17},{0,8,17},{5,16,420},{5,14,223},{5,11,283},{5,10,234},{3,17,739},{3,13,267},{3,11,33},{3,9,273},{0,13,868},{0,9,213},{6,15,201},{6,13,18},{6,11,21},{6,10,26},{12,2,723},{0,15,204},{3,11,17},{1,9,209},{22,0,723},{1,9,209},{5,13,219},{5,13,219},{5,13,219},{5,10,218},{3,14,180},{3,11,17},{3,11,17}, +{3,8,20},{0,11,189},{1,8,17},{6,12,2},{6,12,2},{6,12,2},{6,9,5},{10,2,162},{3,11,1},{3,11,1},{2,8,1},{17,1,162},{2,8,1},{15,0,200},{5,14,5},{7,10,16},{5,10,16},{15,0,200},{20,3,200},{5,10,16},{0,9,208},{20,3,200},{0,9,208},{5,0,218},{5,0,218},{5,0,218},{5,0,218},{3,11,16},{3,11,16},{3,11,16},{3,8,20},{0,9,5}, +{0,9,5},{6,18,410},{6,15,209},{6,12,288},{6,11,234},{4,18,739},{4,14,254},{4,12,33},{4,10,270},{0,15,804},{2,10,227},{7,16,200},{7,14,13},{7,12,25},{7,11,29},{15,0,723},{1,16,209},{4,12,17},{2,10,218},{20,3,723},{2,10,218},{6,15,209},{6,15,209},{6,15,209},{6,11,209},{4,15,178},{4,12,17},{4,12,17},{4,9,18},{0,13,171},{2,9,26},{7,13,0}, +{7,13,0},{7,13,0},{7,11,4},{13,0,162},{4,12,1},{4,12,1},{4,9,2},{20,1,162},{4,9,2},{16,1,200},{6,15,1},{8,11,25},{4,12,17},{16,1,200},{26,1,200},{4,12,17},{0,10,218},{26,1,200},{0,10,218},{6,0,208},{6,0,208},{6,0,208},{6,0,208},{4,12,16},{4,12,16},{4,12,16},{5,8,17},{1,11,5},{1,11,5},{7,19,410},{7,16,212},{7,13,288}, +{7,12,224},{5,19,739},{5,15,254},{5,13,33},{5,11,270},{0,16,747},{3,11,227},{8,17,201},{8,15,21},{8,13,21},{8,12,26},{14,4,723},{3,16,209},{5,13,17},{3,11,218},{24,2,723},{3,11,218},{7,15,212},{7,15,212},{7,15,212},{7,12,208},{6,14,180},{5,13,17},{5,13,17},{5,10,18},{1,14,171},{3,10,26},{8,14,2},{8,14,2},{8,14,2},{8,11,5},{14,1,162}, +{5,13,1},{5,13,1},{5,10,2},{24,0,162},{5,10,2},{17,2,200},{7,16,4},{9,12,16},{7,12,16},{17,2,200},{27,2,200},{7,12,16},{0,11,218},{27,2,200},{0,11,218},{7,0,208},{7,0,208},{7,0,208},{7,0,208},{5,13,16},{5,13,16},{5,13,16},{6,9,17},{2,12,8},{2,12,8},{8,19,426},{8,17,223},{8,14,283},{8,13,234},{6,20,739},{6,16,267},{6,14,33}, +{6,12,273},{0,18,727},{3,12,218},{9,18,201},{9,16,18},{9,14,21},{9,13,26},{18,0,723},{4,17,208},{6,14,17},{4,12,209},{30,0,723},{4,12,209},{8,16,219},{8,16,219},{8,16,219},{8,13,218},{7,15,180},{6,14,17},{6,14,17},{6,11,18},{2,15,171},{4,11,27},{9,15,2},{9,15,2},{9,15,2},{9,12,5},{16,0,162},{6,14,1},{6,14,1},{6,11,2},{25,1,162}, +{6,11,2},{18,3,200},{7,18,4},{10,13,16},{8,13,16},{18,3,200},{28,3,200},{8,13,16},{0,12,208},{28,3,200},{0,12,208},{8,0,218},{8,0,218},{8,0,218},{8,0,218},{6,14,16},{6,14,16},{6,14,16},{7,10,17},{3,13,8},{3,13,8},{9,20,420},{9,18,223},{9,15,283},{9,14,234},{7,21,739},{7,17,267},{7,15,33},{7,13,273},{1,19,727},{4,13,213},{10,19,201}, +{10,17,18},{10,15,21},{10,14,26},{19,1,723},{4,19,204},{7,15,17},{5,13,209},{31,1,723},{5,13,209},{9,17,219},{9,17,219},{9,17,219},{9,14,218},{7,18,180},{7,15,17},{7,15,17},{7,12,20},{3,16,173},{5,12,17},{10,16,2},{10,16,2},{10,16,2},{10,13,5},{17,1,162},{7,15,1},{7,15,1},{6,12,1},{26,2,162},{6,12,1},{20,2,200},{9,18,5},{11,14,16}, +{9,14,16},{20,2,200},{24,7,200},{9,14,16},{0,13,208},{24,7,200},{0,13,208},{9,0,218},{9,0,218},{9,0,218},{9,0,218},{7,15,16},{7,15,16},{7,15,16},{7,12,20},{4,13,5},{4,13,5},{10,22,410},{10,19,209},{10,16,288},{10,15,234},{8,22,739},{8,18,254},{8,16,33},{8,14,270},{2,20,724},{6,14,227},{11,20,200},{11,18,13},{11,16,25},{11,15,29},{20,2,723}, +{5,20,209},{8,16,17},{6,14,218},{24,7,723},{6,14,218},{10,19,209},{10,19,209},{10,19,209},{10,15,209},{8,19,178},{8,16,17},{8,16,17},{8,13,18},{3,18,170},{6,13,26},{11,17,0},{11,17,0},{11,17,0},{11,15,4},{17,4,162},{8,16,1},{8,16,1},{8,13,2},{29,2,162},{8,13,2},{23,0,200},{10,19,1},{12,15,25},{8,16,17},{23,0,200},{30,5,200},{8,16,17}, +{0,14,218},{30,5,200},{0,14,218},{10,0,208},{10,0,208},{10,0,208},{10,0,208},{8,16,16},{8,16,16},{8,16,16},{9,12,17},{5,15,5},{5,15,5},{11,23,410},{11,20,212},{11,17,288},{11,16,224},{9,23,739},{9,19,254},{9,17,33},{9,15,270},{3,21,724},{7,15,227},{12,21,201},{12,19,21},{12,17,21},{12,16,26},{21,3,723},{7,20,209},{9,17,17},{7,15,218},{28,6,723}, +{7,15,218},{11,19,212},{11,19,212},{11,19,212},{11,16,208},{10,18,180},{9,17,17},{9,17,17},{9,14,18},{5,18,171},{7,14,26},{12,18,2},{12,18,2},{12,18,2},{12,15,5},{18,5,162},{9,17,1},{9,17,1},{9,14,2},{30,3,162},{9,14,2},{24,1,200},{11,20,4},{13,16,16},{11,16,16},{24,1,200},{31,6,200},{11,16,16},{0,15,218},{31,6,200},{0,15,218},{11,0,208}, +{11,0,208},{11,0,208},{11,0,208},{9,17,16},{9,17,16},{9,17,16},{10,13,17},{6,16,8},{6,16,8},{12,23,426},{12,21,223},{12,18,283},{12,17,234},{10,24,739},{10,20,267},{10,18,33},{10,16,273},{4,22,727},{7,16,218},{13,22,201},{13,20,18},{13,18,21},{13,17,26},{22,4,723},{8,21,208},{10,18,17},{8,16,209},{29,7,723},{8,16,209},{12,20,219},{12,20,219},{12,20,219}, +{12,17,218},{11,19,180},{10,18,17},{10,18,17},{10,15,18},{6,19,171},{8,15,27},{13,19,2},{13,19,2},{13,19,2},{13,16,5},{20,4,162},{10,18,1},{10,18,1},{10,15,2},{29,5,162},{10,15,2},{25,2,200},{11,22,4},{14,17,16},{12,17,16},{25,2,200},{27,10,200},{12,17,16},{0,16,208},{27,10,200},{0,16,208},{12,0,218},{12,0,218},{12,0,218},{12,0,218},{10,18,16}, +{10,18,16},{10,18,16},{11,14,17},{7,17,8},{7,17,8},{13,24,420},{13,22,223},{13,19,283},{13,18,234},{11,25,739},{11,21,267},{11,19,33},{11,17,273},{5,23,727},{8,17,213},{14,23,201},{14,21,18},{14,19,21},{14,18,26},{26,0,723},{8,23,204},{11,19,17},{9,17,209},{30,8,723},{9,17,209},{13,21,219},{13,21,219},{13,21,219},{13,18,218},{11,22,180},{11,19,17},{11,19,17}, +{11,16,20},{7,20,173},{9,16,17},{14,20,2},{14,20,2},{14,20,2},{14,17,5},{24,0,162},{11,19,1},{11,19,1},{10,16,1},{30,6,162},{10,16,1},{26,3,200},{13,22,5},{15,18,16},{13,18,16},{26,3,200},{28,11,200},{13,18,16},{0,17,208},{28,11,200},{0,17,208},{13,0,218},{13,0,218},{13,0,218},{13,0,218},{11,19,16},{11,19,16},{11,19,16},{11,16,20},{8,17,5}, +{8,17,5},{14,26,410},{14,23,209},{14,20,288},{14,19,234},{12,26,739},{12,22,254},{12,20,33},{12,18,270},{6,24,724},{10,18,227},{15,24,200},{15,22,13},{15,20,25},{15,19,29},{26,3,723},{9,24,209},{12,20,17},{10,18,218},{28,11,723},{10,18,218},{14,23,209},{14,23,209},{14,23,209},{14,19,209},{12,23,178},{12,20,17},{12,20,17},{12,17,18},{7,22,170},{10,17,26},{15,21,0}, +{15,21,0},{15,21,0},{15,19,4},{24,3,162},{12,20,1},{12,20,1},{12,17,2},{28,9,162},{12,17,2},{27,4,200},{14,23,1},{16,19,25},{12,20,17},{27,4,200},{31,11,200},{12,20,17},{0,18,218},{31,11,200},{0,18,218},{14,0,208},{14,0,208},{14,0,208},{14,0,208},{12,20,16},{12,20,16},{12,20,16},{13,16,17},{9,19,5},{9,19,5},{15,27,410},{15,24,212},{15,21,288}, +{15,20,224},{13,27,739},{13,23,254},{13,21,33},{13,19,270},{7,25,724},{11,19,227},{16,25,201},{16,23,21},{16,21,21},{16,20,26},{28,2,723},{11,24,209},{13,21,17},{11,19,218},{27,13,723},{11,19,218},{15,23,212},{15,23,212},{15,23,212},{15,20,208},{14,22,180},{13,21,17},{13,21,17},{13,18,18},{9,22,171},{11,18,26},{16,22,2},{16,22,2},{16,22,2},{16,19,5},{22,9,162}, +{13,21,1},{13,21,1},{13,18,2},{29,10,162},{13,18,2},{31,0,200},{15,24,4},{17,20,16},{15,20,16},{31,0,200},{30,13,200},{15,20,16},{0,19,218},{30,13,200},{0,19,218},{15,0,208},{15,0,208},{15,0,208},{15,0,208},{13,21,16},{13,21,16},{13,21,16},{14,17,17},{10,20,8},{10,20,8},{16,27,426},{16,25,223},{16,22,283},{16,21,234},{14,28,739},{14,24,267},{14,22,33}, +{14,20,273},{8,26,727},{11,20,218},{17,26,201},{17,24,18},{17,22,21},{17,21,26},{29,3,723},{12,25,208},{14,22,17},{12,20,209},{28,14,723},{12,20,209},{16,24,219},{16,24,219},{16,24,219},{16,21,218},{15,23,180},{14,22,17},{14,22,17},{14,19,18},{10,23,171},{12,19,27},{17,23,2},{17,23,2},{17,23,2},{17,20,5},{24,8,162},{14,22,1},{14,22,1},{14,19,2},{30,11,162}, +{14,19,2},{29,6,200},{15,26,4},{18,21,16},{16,21,16},{29,6,200},{31,14,200},{16,21,16},{0,20,208},{31,14,200},{0,20,208},{16,0,218},{16,0,218},{16,0,218},{16,0,218},{14,22,16},{14,22,16},{14,22,16},{15,18,17},{11,21,8},{11,21,8},{17,28,420},{17,26,223},{17,23,283},{17,22,234},{15,29,739},{15,25,267},{15,23,33},{15,21,273},{9,27,727},{12,21,213},{18,27,201}, +{18,25,18},{18,23,21},{18,22,26},{30,4,723},{12,27,204},{15,23,17},{13,21,209},{29,15,723},{13,21,209},{17,25,219},{17,25,219},{17,25,219},{17,22,218},{15,26,180},{15,23,17},{15,23,17},{15,20,20},{11,24,173},{13,20,17},{18,24,2},{18,24,2},{18,24,2},{18,21,5},{28,4,162},{15,23,1},{15,23,1},{14,20,1},{29,13,162},{14,20,1},{30,7,200},{17,26,5},{19,22,16}, +{17,22,16},{30,7,200},{30,16,200},{17,22,16},{0,21,208},{30,16,200},{0,21,208},{17,0,218},{17,0,218},{17,0,218},{17,0,218},{15,23,16},{15,23,16},{15,23,16},{15,20,20},{12,21,5},{12,21,5},{18,30,410},{18,27,209},{18,24,288},{18,23,234},{16,30,739},{16,26,254},{16,24,33},{16,22,270},{10,28,724},{14,22,227},{19,28,200},{19,26,13},{19,24,25},{19,23,29},{30,7,723}, +{13,28,209},{16,24,17},{14,22,218},{30,16,723},{14,22,218},{18,27,209},{18,27,209},{18,27,209},{18,23,209},{16,27,178},{16,24,17},{16,24,17},{16,21,18},{11,26,170},{14,21,26},{19,25,0},{19,25,0},{19,25,0},{19,23,4},{31,2,162},{16,24,1},{16,24,1},{16,21,2},{27,16,162},{16,21,2},{31,8,200},{18,27,1},{20,23,25},{16,24,17},{31,8,200},{28,19,200},{16,24,17}, +{0,22,218},{28,19,200},{0,22,218},{18,0,208},{18,0,208},{18,0,208},{18,0,208},{16,24,16},{16,24,16},{16,24,16},{17,20,17},{13,23,5},{13,23,5},{19,31,410},{19,28,212},{19,25,288},{19,24,224},{17,31,739},{17,27,254},{17,25,33},{17,23,270},{11,29,724},{15,23,227},{20,29,201},{20,27,21},{20,25,21},{20,24,26},{29,11,723},{15,28,209},{17,25,17},{15,23,218},{31,17,723}, +{15,23,218},{19,27,212},{19,27,212},{19,27,212},{19,24,208},{18,26,180},{17,25,17},{17,25,17},{17,22,18},{13,26,171},{15,22,26},{20,26,2},{20,26,2},{20,26,2},{20,23,5},{26,13,162},{17,25,1},{17,25,1},{17,22,2},{21,21,162},{17,22,2},{29,14,200},{19,28,4},{21,24,16},{19,24,16},{29,14,200},{29,20,200},{19,24,16},{0,23,218},{29,20,200},{0,23,218},{19,0,208}, +{19,0,208},{19,0,208},{19,0,208},{17,25,16},{17,25,16},{17,25,16},{18,21,17},{14,24,8},{14,24,8},{20,31,426},{20,29,223},{20,26,283},{20,25,234},{19,30,740},{18,28,267},{18,26,33},{18,24,273},{12,30,727},{15,24,218},{21,30,201},{21,28,18},{21,26,21},{21,25,26},{30,12,723},{16,29,208},{18,26,17},{16,24,209},{27,21,723},{16,24,209},{20,28,219},{20,28,219},{20,28,219}, +{20,25,218},{19,27,180},{18,26,17},{18,26,17},{18,23,18},{14,27,171},{16,23,27},{21,27,2},{21,27,2},{21,27,2},{21,24,5},{28,12,162},{18,26,1},{18,26,1},{18,23,2},{22,22,162},{18,23,2},{30,15,200},{19,30,4},{22,25,16},{20,25,16},{30,15,200},{30,21,200},{20,25,16},{0,24,208},{30,21,200},{0,24,208},{20,0,218},{20,0,218},{20,0,218},{20,0,218},{18,26,16}, +{18,26,16},{18,26,16},{19,22,17},{15,25,8},{15,25,8},{21,31,468},{21,30,223},{21,27,283},{21,26,234},{20,31,749},{19,29,267},{19,27,33},{19,25,273},{13,31,727},{16,25,213},{22,31,201},{22,29,18},{22,27,21},{22,26,26},{31,13,723},{16,31,204},{19,27,17},{17,25,209},{28,22,723},{17,25,209},{21,29,219},{21,29,219},{21,29,219},{21,26,218},{19,30,180},{19,27,17},{19,27,17}, +{19,24,20},{15,28,173},{17,24,17},{22,28,2},{22,28,2},{22,28,2},{22,25,5},{29,13,162},{19,27,1},{19,27,1},{18,24,1},{28,20,162},{18,24,1},{31,16,200},{21,30,5},{23,26,16},{21,26,16},{31,16,200},{31,22,200},{21,26,16},{0,25,208},{31,22,200},{0,25,208},{21,0,218},{21,0,218},{21,0,218},{21,0,218},{19,27,16},{19,27,16},{19,27,16},{19,24,20},{16,25,5}, +{16,25,5},{22,31,570},{22,31,209},{22,28,288},{22,27,234},{21,31,804},{20,30,254},{20,28,33},{20,26,270},{15,31,753},{18,26,227},{23,31,232},{23,30,13},{23,28,25},{23,27,29},{31,16,723},{19,31,216},{20,28,17},{18,26,218},{31,22,723},{18,26,218},{22,31,209},{22,31,209},{22,31,209},{22,27,209},{20,31,178},{20,28,17},{20,28,17},{20,25,18},{15,30,170},{18,25,26},{23,29,0}, +{23,29,0},{23,29,0},{23,27,4},{29,16,162},{20,28,1},{20,28,1},{20,25,2},{31,20,162},{20,25,2},{31,19,200},{22,31,1},{24,27,25},{20,28,17},{31,19,200},{27,26,200},{20,28,17},{0,26,218},{27,26,200},{0,26,218},{22,0,208},{22,0,208},{22,0,208},{22,0,208},{20,28,16},{20,28,16},{20,28,16},{21,24,17},{17,27,5},{17,27,5},{23,31,696},{23,31,237},{23,29,288}, +{23,28,224},{23,31,888},{21,31,254},{21,29,33},{21,27,270},{17,31,824},{19,27,227},{24,31,273},{24,31,21},{24,29,21},{24,28,26},{30,20,723},{20,31,233},{21,29,17},{19,27,218},{30,24,723},{19,27,218},{23,31,212},{23,31,212},{23,31,212},{23,28,208},{22,30,180},{21,29,17},{21,29,17},{21,26,18},{17,30,171},{19,26,26},{24,30,2},{24,30,2},{24,30,2},{24,27,5},{30,17,162}, +{21,29,1},{21,29,1},{21,26,2},{25,25,162},{21,26,2},{30,23,200},{24,31,20},{25,28,16},{23,28,16},{30,23,200},{28,27,200},{23,28,16},{0,27,218},{28,27,200},{0,27,218},{23,0,208},{23,0,208},{23,0,208},{23,0,208},{21,29,16},{21,29,16},{21,29,16},{22,25,17},{18,28,8},{18,28,8},{25,31,804},{24,31,334},{24,30,283},{24,29,234},{24,31,957},{22,31,297},{22,30,33}, +{22,28,273},{20,31,913},{19,28,218},{26,31,313},{25,31,51},{25,30,21},{25,29,26},{31,21,723},{22,31,281},{22,30,17},{20,28,209},{31,25,723},{20,28,209},{24,31,234},{24,31,234},{24,31,234},{24,29,218},{23,31,180},{22,30,17},{22,30,17},{22,27,18},{18,31,171},{20,27,27},{25,31,2},{25,31,2},{25,31,2},{25,28,5},{31,18,162},{22,30,1},{22,30,1},{22,27,2},{26,26,162}, +{22,27,2},{31,24,200},{25,31,50},{26,29,16},{24,29,16},{31,24,200},{24,31,200},{24,29,16},{0,28,208},{24,31,200},{0,28,208},{24,0,218},{24,0,218},{24,0,218},{24,0,218},{22,30,16},{22,30,16},{22,30,16},{23,26,17},{19,29,8},{19,29,8},{26,31,930},{25,31,492},{25,31,283},{25,30,234},{25,31,1068},{24,31,389},{23,31,33},{23,29,273},{21,31,999},{20,29,213},{27,31,379}, +{26,31,149},{26,31,21},{26,30,26},{29,27,723},{24,31,364},{23,31,17},{21,29,209},{27,29,723},{21,29,209},{25,31,267},{25,31,267},{25,31,267},{25,30,218},{24,31,205},{23,31,17},{23,31,17},{23,28,20},{20,31,189},{21,28,17},{26,31,5},{26,31,5},{26,31,5},{26,29,5},{30,22,162},{23,31,1},{23,31,1},{22,28,1},{27,27,162},{22,28,1},{30,28,200},{27,31,90},{27,30,16}, +{25,30,16},{30,28,200},{28,30,200},{25,30,16},{0,29,208},{28,30,200},{0,29,208},{25,0,218},{25,0,218},{25,0,218},{25,0,218},{23,31,16},{23,31,16},{23,31,16},{23,28,20},{20,29,5},{20,29,5},{27,31,877},{26,31,585},{26,31,329},{26,31,209},{26,31,990},{25,31,397},{25,31,36},{24,30,165},{23,31,910},{22,30,122},{28,31,306},{28,31,162},{27,31,36},{27,31,4},{31,26,546}, +{26,31,306},{25,31,20},{22,30,113},{29,29,546},{22,30,113},{26,31,329},{26,31,329},{26,31,329},{26,31,209},{25,31,276},{25,31,36},{25,31,36},{24,29,18},{22,31,230},{22,29,26},{27,31,36},{27,31,36},{27,31,36},{27,31,4},{30,25,162},{25,31,20},{25,31,20},{24,29,2},{30,27,162},{24,29,2},{30,30,113},{29,31,61},{28,31,0},{26,31,1},{30,30,113},{30,30,113},{26,31,1}, +{0,30,113},{30,30,113},{0,30,113},{26,0,208},{26,0,208},{26,0,208},{26,0,208},{25,30,17},{25,30,17},{25,30,17},{25,28,17},{21,31,5},{21,31,5},{28,31,731},{27,31,573},{27,31,404},{27,31,244},{27,31,797},{26,31,354},{26,31,98},{25,30,82},{25,31,737},{23,31,58},{29,31,190},{29,31,126},{28,31,65},{28,31,5},{30,29,333},{28,31,185},{27,31,52},{23,31,49},{29,30,333}, +{23,31,49},{27,31,404},{27,31,404},{27,31,404},{27,31,244},{27,31,356},{26,31,98},{26,31,98},{25,30,18},{24,31,315},{23,30,26},{28,31,65},{28,31,65},{28,31,65},{28,31,5},{31,26,162},{27,31,52},{27,31,52},{25,30,2},{29,29,162},{25,30,2},{31,30,25},{30,31,13},{30,31,4},{29,31,1},{31,30,25},{30,31,25},{29,31,1},{0,31,49},{30,31,25},{0,31,49},{27,0,208}, +{27,0,208},{27,0,208},{27,0,208},{26,31,17},{26,31,17},{26,31,17},{26,29,17},{23,31,9},{23,31,9},{29,31,642},{28,31,524},{28,31,443},{28,31,299},{28,31,623},{28,31,335},{27,31,201},{26,31,17},{27,31,610},{24,31,26},{30,31,131},{30,31,115},{29,31,101},{29,31,37},{31,29,193},{29,31,121},{28,31,85},{26,31,1},{29,31,193},{26,31,1},{28,31,443},{28,31,443},{28,31,443}, +{28,31,299},{28,31,398},{27,31,201},{27,31,201},{26,31,17},{26,31,378},{24,31,26},{29,31,101},{29,31,101},{29,31,101},{29,31,37},{31,28,145},{28,31,85},{28,31,85},{26,31,1},{30,30,145},{26,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{28,0,218},{28,0,218},{28,0,218},{28,0,218},{27,31,32}, +{27,31,32},{27,31,32},{27,30,17},{24,31,26},{24,31,26},{29,31,418},{29,31,354},{29,31,318},{29,31,254},{29,31,370},{28,31,223},{28,31,142},{28,31,25},{28,31,358},{26,31,58},{30,31,51},{30,31,35},{30,31,26},{30,31,10},{31,30,54},{30,31,34},{30,31,25},{28,31,0},{30,31,54},{28,31,0},{29,31,318},{29,31,318},{29,31,318},{29,31,254},{29,31,270},{28,31,142},{28,31,142}, +{28,31,25},{27,31,249},{26,31,58},{30,31,26},{30,31,26},{30,31,26},{30,31,10},{30,31,41},{30,31,25},{30,31,25},{28,31,0},{31,30,41},{28,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{29,0,218},{29,0,218},{29,0,218},{29,0,218},{28,31,61},{28,31,61},{28,31,61},{28,31,25},{26,31,58}, +{26,31,58},{0,9,421},{0,7,113},{0,5,5},{0,4,130},{0,6,925},{0,5,658},{0,4,274},{0,3,670},{0,3,1039},{0,3,751},{0,9,421},{0,7,113},{0,5,5},{0,4,130},{3,1,925},{0,5,658},{0,4,274},{0,3,670},{6,0,925},{0,3,670},{0,4,1},{0,4,1},{0,4,1},{0,3,4},{0,2,85},{0,2,45},{0,2,45},{0,1,50},{0,1,98},{0,1,59},{0,4,1}, +{0,4,1},{0,4,1},{0,3,4},{0,2,85},{0,2,45},{0,2,45},{0,1,50},{2,0,85},{0,1,50},{5,1,421},{0,7,113},{0,5,5},{0,4,130},{5,1,421},{9,0,421},{0,4,130},{0,3,445},{9,0,421},{0,3,445},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,12,425},{0,9,52},{0,6,10}, +{0,6,82},{0,8,1261},{0,6,805},{0,5,322},{0,4,833},{0,4,1445},{0,4,977},{0,12,425},{0,9,52},{0,6,10},{0,6,82},{3,3,1261},{0,6,805},{0,5,322},{0,4,833},{8,0,1261},{0,4,833},{0,7,0},{0,7,0},{0,7,0},{0,4,1},{0,3,225},{0,3,117},{0,3,117},{0,2,125},{0,2,257},{0,2,161},{0,7,0},{0,7,0},{0,7,0},{0,4,1},{2,0,221}, +{0,3,117},{0,3,117},{0,2,125},{2,1,221},{0,2,125},{7,0,421},{0,9,52},{1,6,5},{0,6,82},{7,0,421},{10,1,421},{0,6,82},{0,4,433},{10,1,421},{0,4,433},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,14,430},{0,11,29},{0,7,74},{0,7,46},{0,10,1514},{0,8,874},{0,6,307}, +{0,5,917},{0,5,1814},{0,4,1074},{0,14,430},{0,11,29},{1,7,35},{0,7,46},{6,0,1514},{0,8,874},{0,6,307},{0,5,917},{10,0,1514},{0,5,917},{0,10,10},{0,10,10},{0,10,10},{0,6,10},{0,5,340},{0,5,160},{0,5,160},{0,3,169},{0,3,421},{0,3,250},{0,10,10},{0,10,10},{0,10,10},{0,6,10},{2,2,338},{0,5,160},{0,5,160},{0,3,169},{2,2,338}, +{0,3,169},{8,1,421},{0,11,20},{2,7,5},{0,7,37},{8,1,421},{14,0,421},{0,7,37},{0,5,433},{14,0,421},{0,5,433},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,1,0},{0,1,0},{0,1,0},{0,1,4},{0,0,9},{0,0,9},{1,15,494},{1,12,102},{1,8,137},{1,8,122},{0,12,1517},{0,9,737},{0,7,185},{0,6,794},{0,7,1982},{0,5,1062},{1,15,430}, +{1,12,38},{2,8,34},{1,8,58},{7,1,1514},{0,9,737},{0,7,185},{0,6,794},{11,1,1514},{0,6,794},{1,11,74},{1,11,74},{1,11,74},{1,7,74},{0,8,338},{0,6,98},{0,6,98},{0,4,97},{0,4,514},{0,4,241},{1,11,10},{1,11,10},{1,11,10},{1,7,10},{3,3,338},{0,6,98},{0,6,98},{0,4,97},{8,0,338},{0,4,97},{10,0,421},{0,13,9},{3,8,4}, +{0,8,16},{10,0,421},{17,0,421},{0,8,16},{0,6,433},{17,0,421},{0,6,433},{1,0,73},{1,0,73},{1,0,73},{1,0,73},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,2,37},{0,2,37},{1,18,629},{1,14,213},{2,9,354},{1,9,218},{0,15,1517},{0,11,630},{0,9,50},{0,7,670},{0,8,2198},{0,6,1109},{3,15,437},{2,13,41},{3,9,33},{2,9,53},{8,2,1514}, +{0,11,630},{0,9,50},{0,7,670},{12,2,1514},{0,7,670},{1,13,209},{1,13,209},{1,13,209},{1,8,212},{0,11,338},{0,8,41},{0,8,41},{0,5,50},{0,6,680},{0,5,275},{3,10,17},{3,10,17},{3,10,17},{2,8,17},{6,1,338},{0,8,41},{0,8,41},{0,5,50},{11,0,338},{0,5,50},{12,0,421},{0,15,1},{4,9,5},{0,9,1},{12,0,421},{20,0,421},{0,9,1}, +{0,7,445},{20,0,421},{0,7,445},{1,0,208},{1,0,208},{1,0,208},{1,0,208},{0,7,1},{0,7,1},{0,7,1},{0,4,0},{0,3,106},{0,3,106},{2,19,821},{2,15,405},{2,11,570},{2,10,410},{0,18,1514},{0,13,577},{0,10,14},{0,8,602},{0,10,2462},{0,7,1175},{3,17,441},{3,14,41},{4,10,35},{3,10,53},{9,3,1514},{0,13,577},{0,10,14},{0,8,602},{18,0,1514}, +{0,8,602},{2,14,401},{2,14,401},{2,14,401},{2,9,404},{0,13,340},{0,10,13},{0,10,13},{0,6,29},{0,7,851},{0,6,353},{3,13,17},{3,13,17},{3,13,17},{3,9,17},{8,0,338},{0,10,13},{0,10,13},{0,6,29},{5,5,338},{0,6,29},{13,1,421},{1,16,4},{5,10,5},{1,10,1},{13,1,421},{21,1,421},{1,10,1},{0,8,433},{21,1,421},{0,8,433},{2,0,400}, +{2,0,400},{2,0,400},{2,0,400},{0,9,1},{0,9,1},{0,9,1},{0,6,4},{0,4,208},{0,4,208},{3,20,854},{3,16,437},{3,12,597},{3,11,443},{1,19,1515},{0,15,570},{1,11,15},{0,9,582},{0,11,2337},{0,9,933},{4,18,430},{4,15,29},{5,11,35},{4,11,46},{10,4,1514},{0,15,521},{1,11,14},{0,9,533},{19,1,1514},{0,9,533},{3,15,434},{3,15,434},{3,15,434}, +{3,10,437},{1,14,341},{1,11,14},{1,11,14},{1,7,30},{0,8,755},{0,7,222},{4,14,10},{4,14,10},{4,14,10},{4,10,10},{9,1,338},{0,12,2},{0,12,2},{0,7,26},{16,0,338},{0,7,26},{15,0,421},{3,16,4},{6,11,5},{2,11,1},{15,0,421},{25,0,421},{2,11,1},{0,9,433},{25,0,421},{0,9,433},{3,0,433},{3,0,433},{3,0,433},{3,0,433},{1,10,2}, +{1,10,2},{1,10,2},{1,7,5},{0,6,157},{0,6,157},{4,21,866},{4,17,454},{4,13,609},{4,12,461},{2,20,1515},{1,16,570},{2,12,19},{1,10,582},{0,13,2214},{0,10,707},{5,19,430},{5,16,38},{6,12,34},{5,12,58},{14,0,1514},{0,16,458},{2,12,18},{0,10,482},{20,2,1514},{0,10,482},{4,16,445},{4,16,445},{4,16,445},{4,11,449},{2,15,341},{2,12,19},{2,12,19}, +{2,8,26},{0,10,635},{0,8,106},{5,15,10},{5,15,10},{5,15,10},{5,11,10},{10,2,338},{1,13,2},{1,13,2},{1,8,16},{17,1,338},{1,8,16},{16,1,421},{3,18,4},{7,12,4},{3,12,0},{16,1,421},{26,1,421},{3,12,0},{0,10,433},{26,1,421},{0,10,433},{4,0,445},{4,0,445},{4,0,445},{4,0,445},{2,11,2},{2,11,2},{2,11,2},{2,7,10},{0,8,90}, +{0,8,90},{5,22,854},{5,18,438},{5,14,603},{5,13,443},{3,21,1517},{3,16,554},{3,13,21},{3,11,589},{0,15,2046},{0,11,535},{7,19,437},{6,17,41},{7,13,33},{6,13,53},{14,3,1514},{0,18,429},{3,13,21},{0,11,454},{26,0,1514},{0,11,454},{5,17,434},{5,17,434},{5,17,434},{5,12,437},{3,17,340},{3,13,20},{3,13,20},{3,9,29},{0,12,557},{0,10,49},{7,14,17}, +{7,14,17},{7,14,17},{6,12,17},{13,0,338},{2,14,4},{2,14,4},{1,10,10},{20,1,338},{1,10,10},{17,2,421},{4,19,1},{8,13,5},{4,13,1},{17,2,421},{29,1,421},{4,13,1},{0,11,445},{29,1,421},{0,11,445},{5,0,433},{5,0,433},{5,0,433},{5,0,433},{3,12,1},{3,12,1},{3,12,1},{3,9,4},{0,10,40},{0,10,40},{6,23,854},{6,19,438},{6,15,603}, +{6,14,443},{4,22,1515},{3,18,566},{4,14,15},{3,12,578},{0,16,1911},{0,12,458},{7,21,441},{7,18,41},{8,14,35},{7,14,53},{16,2,1514},{0,20,425},{4,14,14},{0,12,433},{27,1,1514},{0,12,433},{6,18,434},{6,18,434},{6,18,434},{6,13,437},{4,17,341},{4,14,14},{4,14,14},{4,10,30},{0,14,477},{0,11,35},{7,17,17},{7,17,17},{7,17,17},{7,13,17},{14,1,338}, +{3,15,4},{3,15,4},{2,11,10},{24,0,338},{2,11,10},{18,3,421},{5,20,4},{9,14,5},{5,14,1},{18,3,421},{30,2,421},{5,14,1},{0,12,433},{30,2,421},{0,12,433},{6,0,433},{6,0,433},{6,0,433},{6,0,433},{4,13,2},{4,13,2},{4,13,2},{4,10,5},{0,12,25},{0,12,25},{7,24,854},{7,20,437},{7,16,597},{7,15,443},{5,23,1515},{4,19,570},{5,15,15}, +{4,13,582},{0,18,1787},{0,13,442},{8,22,430},{8,19,29},{9,15,35},{8,15,46},{17,3,1514},{2,20,425},{5,15,14},{1,13,433},{28,2,1514},{1,13,433},{7,19,434},{7,19,434},{7,19,434},{7,14,437},{5,18,341},{5,15,14},{5,15,14},{5,11,30},{0,16,419},{1,12,45},{8,18,10},{8,18,10},{8,18,10},{8,14,10},{16,0,338},{4,16,2},{4,16,2},{3,12,17},{25,1,338}, +{3,12,17},{20,2,421},{7,20,4},{10,15,5},{6,15,1},{20,2,421},{31,3,421},{6,15,1},{0,13,433},{31,3,421},{0,13,433},{7,0,433},{7,0,433},{7,0,433},{7,0,433},{5,14,2},{5,14,2},{5,14,2},{5,11,5},{0,13,9},{0,13,9},{8,25,866},{8,21,454},{8,17,609},{8,16,461},{6,24,1515},{5,20,570},{6,16,19},{5,14,582},{0,20,1686},{1,14,442},{9,23,430}, +{9,20,38},{10,16,34},{9,16,58},{18,4,1514},{3,21,425},{6,16,18},{2,14,433},{29,3,1514},{2,14,433},{8,20,445},{8,20,445},{8,20,445},{8,15,449},{6,19,341},{6,16,19},{6,16,19},{6,12,26},{0,17,372},{2,13,45},{9,19,10},{9,19,10},{9,19,10},{9,15,10},{17,1,338},{5,17,2},{5,17,2},{5,12,16},{26,2,338},{5,12,16},{23,0,421},{7,22,4},{11,16,4}, +{7,16,0},{23,0,421},{30,5,421},{7,16,0},{0,14,433},{30,5,421},{0,14,433},{8,0,445},{8,0,445},{8,0,445},{8,0,445},{6,15,2},{6,15,2},{6,15,2},{6,11,10},{0,15,5},{0,15,5},{9,26,854},{9,22,438},{9,18,603},{9,17,443},{7,25,1517},{7,20,554},{7,17,21},{7,15,589},{0,22,1614},{2,15,462},{11,23,437},{10,21,41},{11,17,33},{10,17,53},{22,0,1514}, +{3,23,422},{7,17,21},{3,15,446},{30,4,1514},{3,15,446},{9,21,434},{9,21,434},{9,21,434},{9,16,437},{7,21,340},{7,17,20},{7,17,20},{7,13,29},{0,19,347},{3,14,46},{11,18,17},{11,18,17},{11,18,17},{10,16,17},{17,4,338},{6,18,4},{6,18,4},{5,14,10},{29,2,338},{5,14,10},{24,1,421},{8,23,1},{12,17,5},{8,17,1},{24,1,421},{31,6,421},{8,17,1}, +{0,15,445},{31,6,421},{0,15,445},{9,0,433},{9,0,433},{9,0,433},{9,0,433},{7,16,1},{7,16,1},{7,16,1},{7,13,4},{2,16,8},{2,16,8},{10,27,854},{10,23,438},{10,19,603},{10,18,443},{8,26,1515},{7,22,566},{8,18,15},{7,16,578},{0,23,1566},{3,16,443},{11,25,441},{11,22,41},{12,18,35},{11,18,53},{23,1,1514},{4,24,425},{8,18,14},{4,16,433},{31,5,1514}, +{4,16,433},{10,22,434},{10,22,434},{10,22,434},{10,17,437},{8,21,341},{8,18,14},{8,18,14},{8,14,30},{1,20,341},{4,15,35},{11,21,17},{11,21,17},{11,21,17},{11,17,17},{18,5,338},{7,19,4},{7,19,4},{6,15,10},{30,3,338},{6,15,10},{25,2,421},{9,24,4},{13,18,5},{9,18,1},{25,2,421},{29,9,421},{9,18,1},{0,16,433},{29,9,421},{0,16,433},{10,0,433}, +{10,0,433},{10,0,433},{10,0,433},{8,17,2},{8,17,2},{8,17,2},{8,14,5},{3,17,8},{3,17,8},{11,28,854},{11,24,437},{11,20,597},{11,19,443},{9,27,1515},{8,23,570},{9,19,15},{8,17,582},{0,25,1533},{4,17,442},{12,26,430},{12,23,29},{13,19,35},{12,19,46},{24,2,1514},{6,24,425},{9,19,14},{5,17,433},{27,9,1514},{5,17,433},{11,23,434},{11,23,434},{11,23,434}, +{11,18,437},{9,22,341},{9,19,14},{9,19,14},{9,15,30},{2,21,341},{5,16,45},{12,22,10},{12,22,10},{12,22,10},{12,18,10},{20,4,338},{8,20,2},{8,20,2},{7,16,17},{29,5,338},{7,16,17},{26,3,421},{11,24,4},{14,19,5},{10,19,1},{26,3,421},{30,10,421},{10,19,1},{0,17,433},{30,10,421},{0,17,433},{11,0,433},{11,0,433},{11,0,433},{11,0,433},{9,18,2}, +{9,18,2},{9,18,2},{9,15,5},{4,17,9},{4,17,9},{12,29,866},{12,25,454},{12,21,609},{12,20,461},{10,28,1515},{9,24,570},{10,20,19},{9,18,582},{0,27,1521},{5,18,442},{13,27,430},{13,24,38},{14,20,34},{13,20,58},{25,3,1514},{7,25,425},{10,20,18},{6,18,433},{28,10,1514},{6,18,433},{12,24,445},{12,24,445},{12,24,445},{12,19,449},{10,23,341},{10,20,19},{10,20,19}, +{10,16,26},{3,22,341},{6,17,45},{13,23,10},{13,23,10},{13,23,10},{13,19,10},{24,0,338},{9,21,2},{9,21,2},{9,16,16},{30,6,338},{9,16,16},{28,2,421},{11,26,4},{15,20,4},{11,20,0},{28,2,421},{31,11,421},{11,20,0},{0,18,433},{31,11,421},{0,18,433},{12,0,445},{12,0,445},{12,0,445},{12,0,445},{10,19,2},{10,19,2},{10,19,2},{10,15,10},{4,19,5}, +{4,19,5},{13,30,854},{13,26,438},{13,22,603},{13,21,443},{11,29,1517},{11,24,554},{11,21,21},{11,19,589},{1,28,1518},{6,19,462},{15,27,437},{14,25,41},{15,21,33},{14,21,53},{26,4,1514},{7,27,422},{11,21,21},{7,19,446},{31,10,1514},{7,19,446},{13,25,434},{13,25,434},{13,25,434},{13,20,437},{11,25,340},{11,21,20},{11,21,20},{11,17,29},{3,24,339},{7,18,46},{15,22,17}, +{15,22,17},{15,22,17},{14,20,17},{24,3,338},{10,22,4},{10,22,4},{9,18,10},{28,9,338},{9,18,10},{31,0,421},{12,27,1},{16,21,5},{12,21,1},{31,0,421},{30,13,421},{12,21,1},{0,19,445},{30,13,421},{0,19,445},{13,0,433},{13,0,433},{13,0,433},{13,0,433},{11,20,1},{11,20,1},{11,20,1},{11,17,4},{6,20,8},{6,20,8},{14,31,854},{14,27,438},{14,23,603}, +{14,22,443},{12,30,1515},{11,26,566},{12,22,15},{11,20,578},{2,29,1518},{7,20,443},{15,29,441},{15,26,41},{16,22,35},{15,22,53},{30,0,1514},{8,28,425},{12,22,14},{8,20,433},{30,12,1514},{8,20,433},{14,26,434},{14,26,434},{14,26,434},{14,21,437},{12,25,341},{12,22,14},{12,22,14},{12,18,30},{5,24,341},{8,19,35},{15,25,17},{15,25,17},{15,25,17},{15,21,17},{22,9,338}, +{11,23,4},{11,23,4},{10,19,10},{29,10,338},{10,19,10},{31,3,421},{13,28,4},{17,22,5},{13,22,1},{31,3,421},{31,14,421},{13,22,1},{0,20,433},{31,14,421},{0,20,433},{14,0,433},{14,0,433},{14,0,433},{14,0,433},{12,21,2},{12,21,2},{12,21,2},{12,18,5},{7,21,8},{7,21,8},{15,31,878},{15,28,437},{15,24,597},{15,23,443},{13,31,1515},{12,27,570},{13,23,15}, +{12,21,582},{3,30,1518},{8,21,442},{16,30,430},{16,27,29},{17,23,35},{16,23,46},{31,1,1514},{10,28,425},{13,23,14},{9,21,433},{31,13,1514},{9,21,433},{15,27,434},{15,27,434},{15,27,434},{15,22,437},{13,26,341},{13,23,14},{13,23,14},{13,19,30},{6,25,341},{9,20,45},{16,26,10},{16,26,10},{16,26,10},{16,22,10},{24,8,338},{12,24,2},{12,24,2},{11,20,17},{30,11,338}, +{11,20,17},{30,7,421},{15,28,4},{18,23,5},{14,23,1},{30,7,421},{30,16,421},{14,23,1},{0,21,433},{30,16,421},{0,21,433},{15,0,433},{15,0,433},{15,0,433},{15,0,433},{13,22,2},{13,22,2},{13,22,2},{13,19,5},{8,21,9},{8,21,9},{16,31,926},{16,29,454},{16,25,609},{16,24,461},{14,31,1542},{13,28,570},{14,24,19},{13,22,582},{4,31,1521},{9,22,442},{17,31,430}, +{17,28,38},{18,24,34},{17,24,58},{29,7,1514},{11,29,425},{14,24,18},{10,22,433},{27,17,1514},{10,22,433},{16,28,445},{16,28,445},{16,28,445},{16,23,449},{14,27,341},{14,24,19},{14,24,19},{14,20,26},{7,26,341},{10,21,45},{17,27,10},{17,27,10},{17,27,10},{17,23,10},{28,4,338},{13,25,2},{13,25,2},{13,20,16},{29,13,338},{13,20,16},{31,8,421},{15,30,4},{19,24,4}, +{15,24,0},{31,8,421},{31,17,421},{15,24,0},{0,22,433},{31,17,421},{0,22,433},{16,0,445},{16,0,445},{16,0,445},{16,0,445},{14,23,2},{14,23,2},{14,23,2},{14,19,10},{8,23,5},{8,23,5},{17,31,1034},{17,30,438},{17,26,603},{17,25,443},{16,31,1598},{15,28,554},{15,25,21},{15,23,589},{6,31,1535},{10,23,462},{19,31,437},{18,29,41},{19,25,33},{18,25,53},{30,8,1514}, +{11,31,422},{15,25,21},{11,23,446},{28,18,1514},{11,23,446},{17,29,434},{17,29,434},{17,29,434},{17,24,437},{15,29,340},{15,25,20},{15,25,20},{15,21,29},{7,28,339},{11,22,46},{19,26,17},{19,26,17},{19,26,17},{18,24,17},{31,2,338},{14,26,4},{14,26,4},{13,22,10},{27,16,338},{13,22,10},{31,11,421},{16,31,1},{20,25,5},{16,25,1},{31,11,421},{31,19,421},{16,25,1}, +{0,23,445},{31,19,421},{0,23,445},{17,0,433},{17,0,433},{17,0,433},{17,0,433},{15,24,1},{15,24,1},{15,24,1},{15,21,4},{10,24,8},{10,24,8},{18,31,1166},{18,31,438},{18,27,603},{18,26,443},{17,31,1643},{15,30,566},{16,26,15},{15,24,578},{8,31,1566},{11,24,443},{20,31,458},{19,30,41},{20,26,35},{19,26,53},{31,9,1514},{13,31,429},{16,26,14},{12,24,433},{29,19,1514}, +{12,24,433},{18,30,434},{18,30,434},{18,30,434},{18,25,437},{16,29,341},{16,26,14},{16,26,14},{16,22,30},{9,28,341},{12,23,35},{19,29,17},{19,29,17},{19,29,17},{19,25,17},{26,13,338},{15,27,4},{15,27,4},{14,23,10},{21,21,338},{14,23,10},{30,15,421},{18,31,5},{21,26,5},{17,26,1},{30,15,421},{30,21,421},{17,26,1},{0,24,433},{30,21,421},{0,24,433},{18,0,433}, +{18,0,433},{18,0,433},{18,0,433},{16,25,2},{16,25,2},{16,25,2},{16,22,5},{11,25,8},{11,25,8},{20,31,1326},{19,31,470},{19,28,597},{19,27,443},{18,31,1742},{16,31,570},{17,27,15},{16,25,582},{10,31,1638},{12,25,442},{21,31,506},{20,31,29},{21,27,35},{20,27,46},{29,15,1514},{15,31,461},{17,27,14},{13,25,433},{30,20,1514},{13,25,433},{19,31,434},{19,31,434},{19,31,434}, +{19,26,437},{17,30,341},{17,27,14},{17,27,14},{17,23,30},{10,29,341},{13,24,45},{20,30,10},{20,30,10},{20,30,10},{20,26,10},{28,12,338},{16,28,2},{16,28,2},{15,24,17},{22,22,338},{15,24,17},{31,16,421},{20,31,20},{22,27,5},{18,27,1},{31,16,421},{31,22,421},{18,27,1},{0,25,433},{31,22,421},{0,25,433},{19,0,433},{19,0,433},{19,0,433},{19,0,433},{17,26,2}, +{17,26,2},{17,26,2},{17,23,5},{12,25,9},{12,25,9},{21,31,1470},{20,31,561},{20,29,609},{20,28,461},{19,31,1895},{18,31,578},{18,28,19},{17,26,582},{12,31,1761},{13,26,442},{22,31,590},{21,31,59},{22,28,34},{21,28,58},{30,16,1514},{17,31,530},{18,28,18},{14,26,433},{31,21,1514},{14,26,433},{20,31,461},{20,31,461},{20,31,461},{20,27,449},{18,31,341},{18,28,19},{18,28,19}, +{18,24,26},{11,30,341},{14,25,45},{21,31,10},{21,31,10},{21,31,10},{21,27,10},{29,13,338},{17,29,2},{17,29,2},{17,24,16},{28,20,338},{17,24,16},{31,19,421},{21,31,50},{23,28,4},{19,28,0},{31,19,421},{30,24,421},{19,28,0},{0,26,433},{30,24,421},{0,26,433},{20,0,445},{20,0,445},{20,0,445},{20,0,445},{18,27,2},{18,27,2},{18,27,2},{18,23,10},{12,27,5}, +{12,27,5},{22,31,1674},{21,31,753},{21,30,603},{21,29,443},{21,31,2046},{19,31,629},{19,29,21},{19,27,589},{15,31,1917},{14,27,462},{24,31,674},{23,31,120},{23,29,33},{22,29,53},{30,19,1514},{19,31,629},{19,29,21},{15,27,446},{27,25,1514},{15,27,446},{21,31,497},{21,31,497},{21,31,497},{21,28,437},{19,31,388},{19,29,20},{19,29,20},{19,25,29},{12,31,347},{15,26,46},{23,30,17}, +{23,30,17},{23,30,17},{22,28,17},{29,16,338},{18,30,4},{18,30,4},{17,26,10},{31,20,338},{17,26,10},{30,23,421},{23,31,104},{24,29,5},{20,29,1},{30,23,421},{30,26,421},{20,29,1},{0,27,445},{30,26,421},{0,27,445},{21,0,433},{21,0,433},{21,0,433},{21,0,433},{19,28,1},{19,28,1},{19,28,1},{19,25,4},{14,28,8},{14,28,8},{23,31,1902},{22,31,995},{22,31,603}, +{22,30,443},{22,31,2235},{20,31,759},{20,30,15},{19,28,578},{17,31,2118},{15,28,443},{25,31,770},{24,31,250},{24,30,35},{23,30,53},{29,23,1514},{21,31,701},{20,30,14},{16,28,433},{28,26,1514},{16,28,433},{22,31,554},{22,31,554},{22,31,554},{22,29,437},{21,31,437},{20,30,14},{20,30,14},{20,26,30},{14,31,379},{16,27,35},{24,31,25},{24,31,25},{24,31,25},{23,29,17},{30,17,338}, +{19,31,4},{19,31,4},{18,27,10},{25,25,338},{18,27,10},{31,24,421},{25,31,169},{25,30,5},{21,30,1},{31,24,421},{31,27,421},{21,30,1},{0,28,433},{31,27,421},{0,28,433},{22,0,433},{22,0,433},{22,0,433},{22,0,433},{20,29,2},{20,29,2},{20,29,2},{20,26,5},{15,29,8},{15,29,8},{24,31,2045},{24,31,1233},{23,31,629},{23,31,442},{24,31,2360},{22,31,914},{21,31,14}, +{20,29,549},{19,31,2241},{16,29,409},{26,31,849},{25,31,395},{25,31,34},{24,31,45},{30,24,1459},{23,31,778},{21,31,13},{17,29,400},{29,27,1459},{17,29,400},{23,31,629},{23,31,629},{23,31,629},{23,30,437},{22,31,491},{21,31,14},{21,31,14},{21,27,30},{16,31,446},{17,28,45},{25,31,34},{25,31,34},{25,31,34},{24,30,10},{31,18,338},{21,31,13},{21,31,13},{19,28,17},{26,26,338}, +{19,28,17},{30,28,392},{27,31,218},{26,31,4},{22,31,0},{30,28,392},{28,30,392},{22,31,0},{0,29,400},{28,30,392},{0,29,400},{23,0,433},{23,0,433},{23,0,433},{23,0,433},{21,30,2},{21,30,2},{21,30,2},{21,27,5},{16,29,9},{16,29,9},{25,31,1767},{25,31,1167},{24,31,701},{24,31,449},{24,31,1976},{23,31,747},{22,31,66},{22,29,337},{20,31,1820},{17,30,217},{27,31,611}, +{26,31,317},{26,31,61},{25,31,10},{31,24,1064},{25,31,587},{23,31,41},{18,30,208},{24,31,1064},{18,30,208},{24,31,701},{24,31,701},{24,31,701},{24,31,449},{23,31,581},{22,31,66},{22,31,66},{22,28,26},{18,31,530},{18,29,45},{26,31,61},{26,31,61},{26,31,61},{25,31,10},{30,22,338},{23,31,41},{23,31,41},{21,28,16},{27,27,338},{21,28,16},{29,31,200},{28,31,106},{27,31,1}, +{25,31,1},{29,31,200},{31,29,200},{25,31,1},{0,30,208},{31,29,200},{0,30,208},{24,0,445},{24,0,445},{24,0,445},{24,0,445},{22,31,2},{22,31,2},{22,31,2},{22,27,10},{16,31,5},{16,31,5},{26,31,1542},{26,31,1122},{25,31,833},{25,31,497},{26,31,1647},{24,31,687},{24,31,203},{23,30,122},{22,31,1515},{19,30,110},{28,31,410},{28,31,266},{27,31,116},{27,31,20},{31,26,722}, +{26,31,402},{25,31,100},{21,30,74},{29,29,722},{21,30,74},{25,31,833},{25,31,833},{25,31,833},{25,31,497},{24,31,707},{24,31,203},{24,31,203},{23,29,29},{20,31,619},{19,30,46},{27,31,116},{27,31,116},{27,31,116},{27,31,20},{30,25,338},{25,31,100},{25,31,100},{21,30,10},{30,27,338},{21,30,10},{31,29,61},{29,31,37},{29,31,1},{27,31,4},{31,29,61},{31,30,61},{27,31,4}, +{0,30,73},{31,30,61},{0,30,73},{25,0,433},{25,0,433},{25,0,433},{25,0,433},{23,31,25},{23,31,25},{23,31,25},{23,29,4},{18,31,17},{18,31,17},{27,31,1406},{27,31,1134},{26,31,962},{26,31,602},{27,31,1454},{25,31,702},{25,31,341},{24,31,59},{24,31,1378},{20,31,35},{29,31,318},{28,31,250},{28,31,169},{28,31,61},{30,29,509},{28,31,313},{27,31,164},{22,31,10},{29,30,509}, +{22,31,10},{26,31,962},{26,31,962},{26,31,962},{26,31,602},{26,31,827},{25,31,341},{25,31,341},{24,30,30},{22,31,747},{20,31,35},{28,31,169},{28,31,169},{28,31,169},{28,31,61},{31,26,338},{27,31,164},{27,31,164},{22,31,10},{29,29,338},{22,31,10},{31,30,9},{31,31,9},{30,31,4},{30,31,0},{31,30,9},{30,31,9},{30,31,0},{0,31,9},{30,31,9},{0,31,9},{26,0,433}, +{26,0,433},{26,0,433},{26,0,433},{24,31,50},{24,31,50},{24,31,50},{24,30,5},{20,31,26},{20,31,26},{28,31,1135},{28,31,991},{27,31,874},{27,31,602},{28,31,1162},{26,31,618},{26,31,362},{25,31,5},{25,31,1087},{22,31,58},{30,31,219},{29,31,161},{29,31,125},{29,31,61},{31,29,297},{29,31,193},{28,31,117},{24,31,1},{30,30,297},{24,31,1},{27,31,874},{27,31,874},{27,31,874}, +{27,31,602},{27,31,730},{26,31,362},{26,31,362},{25,31,5},{24,31,681},{22,31,58},{29,31,125},{29,31,125},{29,31,125},{29,31,61},{30,29,221},{28,31,117},{28,31,117},{24,31,1},{31,29,221},{24,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{27,0,433},{27,0,433},{27,0,433},{27,0,433},{25,31,101}, +{25,31,101},{25,31,101},{25,31,5},{22,31,58},{22,31,58},{29,31,885},{28,31,751},{28,31,670},{28,31,526},{28,31,778},{27,31,483},{27,31,314},{26,31,10},{26,31,777},{24,31,117},{30,31,75},{30,31,59},{30,31,50},{30,31,34},{30,31,114},{29,31,81},{29,31,45},{27,31,0},{31,30,114},{27,31,0},{28,31,670},{28,31,670},{28,31,670},{28,31,526},{28,31,553},{27,31,314},{27,31,314}, +{26,31,10},{25,31,518},{24,31,117},{30,31,50},{30,31,50},{30,31,50},{30,31,34},{31,29,85},{29,31,45},{29,31,45},{27,31,0},{29,31,85},{27,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{28,0,445},{28,0,445},{28,0,445},{28,0,445},{27,31,145},{27,31,145},{27,31,145},{26,31,10},{24,31,117}, +{24,31,117},{0,13,884},{0,10,225},{0,7,18},{0,6,265},{0,9,1899},{0,7,1355},{0,6,589},{0,4,1354},{0,5,2124},{0,4,1498},{0,13,884},{0,10,225},{0,7,18},{0,6,265},{4,2,1896},{0,7,1355},{0,6,589},{0,4,1354},{7,1,1896},{0,4,1354},{0,6,0},{0,6,0},{0,6,0},{0,4,4},{0,3,162},{0,3,90},{0,3,90},{0,2,104},{0,2,200},{0,1,134},{0,6,0}, +{0,6,0},{0,6,0},{0,4,4},{0,3,162},{0,3,90},{0,3,90},{0,2,104},{3,0,162},{0,2,104},{6,3,882},{0,10,225},{0,7,18},{0,6,265},{6,3,882},{8,3,882},{0,6,265},{0,5,890},{8,3,882},{0,5,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,15,884},{0,12,170},{0,8,8}, +{0,7,202},{0,10,2360},{0,8,1530},{0,7,643},{0,5,1579},{0,6,2684},{0,5,1804},{0,15,884},{0,12,170},{0,8,8},{0,7,202},{5,2,2355},{0,8,1530},{0,7,643},{0,5,1579},{7,2,2355},{0,5,1579},{0,9,1},{0,9,1},{0,9,1},{0,5,1},{0,4,340},{0,4,180},{0,4,180},{0,2,200},{0,2,392},{0,2,236},{0,9,1},{0,9,1},{0,9,1},{0,5,1},{2,1,338}, +{0,4,180},{0,4,180},{0,2,200},{1,2,338},{0,2,200},{8,2,882},{0,12,170},{0,8,8},{0,7,202},{8,2,882},{12,2,882},{0,7,202},{0,6,890},{12,2,882},{0,6,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,18,882},{0,14,106},{0,10,52},{0,9,148},{0,12,2899},{0,9,1773},{0,8,725}, +{0,6,1854},{0,7,3348},{0,5,2124},{0,18,882},{0,14,106},{0,10,52},{0,9,148},{2,9,2899},{0,9,1773},{0,8,725},{0,6,1854},{12,0,2899},{0,6,1854},{0,11,1},{0,11,1},{0,11,1},{0,7,1},{0,6,580},{0,5,306},{0,5,306},{0,3,325},{0,3,667},{0,3,406},{0,11,1},{0,11,1},{0,11,1},{0,7,1},{1,4,578},{0,5,306},{0,5,306},{0,3,325},{4,1,578}, +{0,3,325},{9,3,882},{0,14,106},{1,9,8},{0,9,148},{9,3,882},{18,0,882},{0,9,148},{0,7,890},{18,0,882},{0,7,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,21,920},{0,16,89},{1,11,120},{0,10,121},{0,14,3051},{0,11,1709},{0,9,557},{0,7,1795},{0,8,3651},{0,6,2174},{1,19,886}, +{0,16,89},{1,11,56},{0,10,121},{8,1,3048},{0,11,1709},{0,9,557},{0,7,1795},{6,5,3048},{0,7,1795},{0,14,37},{0,14,37},{0,14,37},{0,8,37},{0,8,648},{0,7,274},{0,7,274},{0,4,277},{0,4,824},{0,4,421},{1,12,4},{1,12,4},{1,12,4},{1,8,8},{3,3,648},{0,7,274},{0,7,274},{0,4,277},{8,0,648},{0,4,277},{10,4,882},{0,16,53},{2,10,8}, +{0,10,85},{10,4,882},{19,1,882},{0,10,85},{0,8,900},{19,1,882},{0,8,900},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,2,0},{0,2,0},{0,2,0},{0,1,1},{0,1,10},{0,1,10},{1,22,995},{1,17,158},{1,12,230},{1,11,186},{0,17,3051},{0,13,1579},{0,10,346},{0,8,1630},{0,9,3924},{0,7,2173},{2,20,885},{2,16,90},{2,12,53},{1,11,122},{8,4,3048}, +{0,13,1579},{0,10,346},{0,8,1630},{14,2,3048},{0,8,1630},{1,15,113},{1,15,113},{1,15,113},{1,9,117},{0,11,648},{0,9,169},{0,9,169},{0,5,200},{0,6,990},{0,5,425},{2,13,2},{2,13,2},{2,13,2},{2,9,2},{6,1,648},{0,9,169},{0,9,169},{0,5,200},{11,0,648},{0,5,200},{13,2,882},{0,18,17},{3,11,18},{0,11,34},{13,2,882},{22,1,882},{0,11,34}, +{0,9,890},{22,1,882},{0,9,890},{1,0,113},{1,0,113},{1,0,113},{1,0,113},{0,5,0},{0,5,0},{0,5,0},{0,3,0},{0,2,61},{0,2,61},{1,24,1173},{1,19,306},{2,13,422},{1,12,318},{0,20,3048},{0,15,1443},{0,12,204},{0,9,1483},{0,11,4212},{0,8,2174},{3,21,885},{3,17,90},{3,13,53},{2,12,117},{12,0,3048},{0,15,1443},{0,12,204},{0,9,1483},{20,0,3048}, +{0,9,1483},{1,18,290},{1,18,290},{1,18,290},{1,11,289},{0,13,650},{0,11,109},{0,11,109},{0,7,148},{0,7,1161},{0,6,473},{3,14,2},{3,14,2},{3,14,2},{3,10,2},{8,0,648},{0,11,109},{0,11,109},{0,7,148},{5,5,648},{0,7,148},{14,3,882},{0,20,8},{4,12,8},{0,12,8},{14,3,882},{26,0,882},{0,12,8},{0,10,890},{26,0,882},{0,10,890},{1,0,289}, +{1,0,289},{1,0,289},{1,0,289},{0,8,1},{0,8,1},{0,8,1},{0,5,4},{0,3,145},{0,3,145},{2,25,1365},{2,20,497},{2,14,713},{2,13,510},{0,23,3051},{0,16,1278},{0,13,86},{0,10,1354},{0,12,4609},{0,9,2228},{4,22,886},{3,19,94},{4,14,56},{3,13,117},{13,1,3048},{0,16,1278},{0,13,86},{0,10,1354},{21,1,3048},{0,10,1354},{2,19,482},{2,19,482},{2,19,482}, +{2,12,481},{0,16,648},{0,12,72},{0,12,72},{0,8,101},{0,8,1352},{0,7,557},{4,15,5},{4,15,5},{4,15,5},{4,11,5},{9,1,648},{0,12,72},{0,12,72},{0,8,101},{16,0,648},{0,8,101},{16,2,882},{1,21,8},{5,13,8},{0,13,5},{16,2,882},{27,1,882},{0,13,5},{0,11,890},{27,1,882},{0,11,890},{2,0,481},{2,0,481},{2,0,481},{2,0,481},{0,10,1}, +{0,10,1},{0,10,1},{0,6,1},{0,5,261},{0,5,261},{2,28,1667},{2,22,793},{3,15,1033},{2,14,793},{0,25,3048},{0,18,1170},{0,14,36},{0,11,1243},{0,14,5005},{0,10,2318},{5,23,886},{4,20,89},{5,15,56},{4,14,121},{14,2,3048},{0,18,1170},{0,14,36},{0,11,1243},{25,0,3048},{0,11,1243},{2,21,786},{2,21,786},{2,21,786},{2,14,789},{0,19,650},{0,14,32},{0,14,32}, +{0,9,50},{0,9,1619},{0,8,661},{5,16,4},{5,16,4},{5,16,4},{5,12,8},{10,2,648},{0,14,32},{0,14,32},{0,9,50},{17,1,648},{0,9,50},{17,3,882},{2,22,8},{6,14,8},{1,14,5},{17,3,882},{28,2,882},{1,14,5},{0,12,900},{28,2,882},{0,12,900},{2,0,785},{2,0,785},{2,0,785},{2,0,785},{0,13,1},{0,13,1},{0,13,1},{0,8,4},{0,6,405}, +{0,6,405},{3,29,1784},{3,23,902},{4,16,1186},{3,15,910},{1,26,3055},{0,20,1095},{1,15,47},{0,12,1159},{0,16,4945},{0,12,2084},{6,24,885},{6,20,90},{6,16,53},{5,15,122},{12,8,3048},{0,20,1059},{0,16,41},{0,12,1123},{28,0,3048},{0,12,1123},{3,23,901},{3,23,901},{3,23,901},{3,15,901},{1,20,652},{1,15,38},{1,15,38},{1,10,44},{0,11,1577},{0,9,545},{6,17,2}, +{6,17,2},{6,17,2},{6,13,2},{13,0,648},{0,16,5},{0,16,5},{0,10,13},{20,1,648},{0,10,13},{17,6,882},{3,23,2},{7,15,18},{3,15,10},{17,6,882},{31,2,882},{3,15,10},{0,13,890},{31,2,882},{0,13,890},{3,0,900},{3,0,900},{3,0,900},{3,0,900},{1,14,4},{1,14,4},{1,14,4},{1,9,5},{0,8,373},{0,8,373},{4,30,1772},{4,24,898},{5,17,1186}, +{4,16,898},{2,27,3055},{1,21,1095},{2,16,33},{1,13,1159},{0,17,4639},{0,13,1730},{7,25,885},{7,21,90},{7,17,53},{6,16,117},{16,4,3048},{0,21,996},{2,16,29},{0,13,1054},{29,1,3048},{0,13,1054},{4,23,891},{4,23,891},{4,23,891},{4,16,894},{2,21,652},{2,16,29},{2,16,29},{2,11,44},{0,13,1452},{0,11,365},{7,18,2},{7,18,2},{7,18,2},{7,14,2},{14,1,648}, +{0,18,1},{0,18,1},{0,11,4},{24,0,648},{0,11,4},{22,0,882},{4,24,8},{8,16,8},{3,16,5},{22,0,882},{30,4,882},{3,16,5},{0,14,890},{30,4,882},{0,14,890},{4,0,890},{4,0,890},{4,0,890},{4,0,890},{2,15,4},{2,15,4},{2,15,4},{2,10,5},{0,9,269},{0,9,269},{5,31,1772},{5,25,898},{6,18,1186},{5,17,898},{3,28,3055},{2,22,1095},{3,17,33}, +{2,14,1159},{0,19,4419},{0,14,1444},{8,26,886},{7,23,94},{8,18,56},{7,17,117},{17,5,3048},{0,23,936},{3,17,29},{0,14,1003},{30,2,3048},{0,14,1003},{5,24,891},{5,24,891},{5,24,891},{5,17,894},{3,22,652},{3,17,29},{3,17,29},{3,12,41},{0,15,1296},{0,12,235},{8,19,5},{8,19,5},{8,19,5},{8,15,5},{16,0,648},{1,19,1},{1,19,1},{1,12,1},{25,1,648}, +{1,12,1},{23,1,882},{5,25,8},{9,17,8},{4,17,5},{23,1,882},{31,5,882},{4,17,5},{0,15,890},{31,5,882},{0,15,890},{5,0,890},{5,0,890},{5,0,890},{5,0,890},{3,16,4},{3,16,4},{3,16,4},{3,11,5},{0,11,185},{0,11,185},{6,31,1790},{6,26,898},{7,19,1186},{6,18,898},{4,29,3057},{3,23,1095},{4,18,45},{3,15,1159},{0,20,4156},{0,15,1226},{9,27,886}, +{8,24,89},{9,19,56},{8,18,121},{18,6,3048},{0,25,909},{4,18,36},{0,15,970},{31,3,3048},{0,15,970},{6,25,891},{6,25,891},{6,25,891},{6,18,894},{4,23,659},{4,18,41},{4,18,41},{3,13,46},{0,16,1137},{0,13,137},{9,20,4},{9,20,4},{9,20,4},{9,16,8},{17,1,648},{2,20,2},{2,20,2},{2,13,1},{26,2,648},{2,13,1},{24,2,882},{6,26,8},{10,18,8}, +{5,18,5},{24,2,882},{27,9,882},{5,18,5},{0,16,900},{27,9,882},{0,16,900},{6,0,890},{6,0,890},{6,0,890},{6,0,890},{4,17,10},{4,17,10},{4,17,10},{4,12,13},{0,13,136},{0,13,136},{8,31,1844},{7,27,902},{8,20,1186},{7,19,910},{5,30,3055},{4,24,1095},{5,19,47},{4,16,1159},{0,22,3940},{0,16,1055},{10,28,885},{10,24,90},{10,20,53},{9,19,122},{22,2,3048}, +{0,27,886},{4,20,41},{0,17,926},{22,10,3048},{0,17,926},{7,27,901},{7,27,901},{7,27,901},{7,19,901},{5,24,652},{5,19,38},{5,19,38},{5,14,44},{0,18,1002},{0,15,110},{10,21,2},{10,21,2},{10,21,2},{10,17,2},{17,4,648},{3,21,4},{3,21,4},{3,14,5},{29,2,648},{3,14,5},{27,0,882},{7,27,2},{11,19,18},{7,19,10},{27,0,882},{30,9,882},{7,19,10}, +{0,17,890},{30,9,882},{0,17,890},{7,0,900},{7,0,900},{7,0,900},{7,0,900},{5,18,4},{5,18,4},{5,18,4},{5,13,5},{0,15,74},{0,15,74},{9,31,1886},{8,28,898},{9,21,1186},{8,20,898},{6,31,3055},{5,25,1095},{6,20,33},{5,17,1159},{0,23,3820},{0,18,963},{11,29,885},{11,25,90},{11,21,53},{10,20,117},{23,3,3048},{1,28,888},{6,20,29},{0,18,899},{28,8,3048}, +{0,18,899},{8,27,891},{8,27,891},{8,27,891},{8,20,894},{6,25,652},{6,20,29},{6,20,29},{6,15,44},{0,20,876},{0,16,102},{11,22,2},{11,22,2},{11,22,2},{11,18,2},{18,5,648},{4,22,1},{4,22,1},{4,15,4},{30,3,648},{4,15,4},{26,4,882},{8,28,8},{12,20,8},{7,20,5},{26,4,882},{31,10,882},{7,20,5},{0,18,890},{31,10,882},{0,18,890},{8,0,890}, +{8,0,890},{8,0,890},{8,0,890},{6,19,4},{6,19,4},{6,19,4},{6,14,5},{0,17,29},{0,17,29},{10,31,1964},{9,29,898},{10,22,1186},{9,21,898},{7,31,3100},{6,26,1095},{7,21,33},{6,18,1159},{0,25,3679},{0,19,899},{12,30,886},{11,27,94},{12,22,56},{11,21,117},{21,9,3048},{2,29,888},{7,21,29},{0,19,890},{29,9,3048},{0,19,890},{9,28,891},{9,28,891},{9,28,891}, +{9,21,894},{7,26,652},{7,21,29},{7,21,29},{7,16,41},{0,22,800},{2,16,98},{12,23,5},{12,23,5},{12,23,5},{12,19,5},{20,4,648},{5,23,1},{5,23,1},{5,16,1},{29,5,648},{5,16,1},{30,0,882},{9,29,8},{13,21,8},{8,21,5},{30,0,882},{30,12,882},{8,21,5},{0,19,890},{30,12,882},{0,19,890},{9,0,890},{9,0,890},{9,0,890},{9,0,890},{7,20,4}, +{7,20,4},{7,20,4},{7,15,5},{0,19,9},{0,19,9},{11,31,2078},{10,30,898},{11,23,1186},{10,22,898},{9,31,3181},{7,27,1095},{8,22,45},{7,19,1159},{0,27,3523},{0,20,908},{13,31,886},{12,28,89},{13,23,56},{12,22,121},{22,10,3048},{3,30,888},{8,22,36},{1,20,901},{30,10,3048},{1,20,901},{10,29,891},{10,29,891},{10,29,891},{10,22,894},{8,27,659},{8,22,41},{8,22,41}, +{7,17,46},{0,23,747},{3,17,98},{13,24,4},{13,24,4},{13,24,4},{13,20,8},{24,0,648},{6,24,2},{6,24,2},{6,17,1},{30,6,648},{6,17,1},{31,1,882},{10,30,8},{14,22,8},{9,22,5},{31,1,882},{31,13,882},{9,22,5},{0,20,900},{31,13,882},{0,20,900},{10,0,890},{10,0,890},{10,0,890},{10,0,890},{8,21,10},{8,21,10},{8,21,10},{8,16,13},{0,20,8}, +{0,20,8},{12,31,2228},{11,31,902},{12,24,1186},{11,23,910},{10,31,3256},{8,28,1095},{9,23,47},{8,20,1159},{0,29,3364},{2,21,894},{14,31,915},{14,28,90},{14,24,53},{13,23,122},{29,1,3048},{4,31,886},{8,24,41},{2,21,890},{26,14,3048},{2,21,890},{11,31,901},{11,31,901},{11,31,901},{11,23,901},{9,28,652},{9,23,38},{9,23,38},{9,18,44},{0,25,705},{3,19,101},{14,25,2}, +{14,25,2},{14,25,2},{14,21,2},{24,3,648},{7,25,4},{7,25,4},{7,18,5},{28,9,648},{7,18,5},{31,4,882},{11,31,2},{15,23,18},{11,23,10},{31,4,882},{24,19,882},{11,23,10},{0,21,890},{24,19,882},{0,21,890},{11,0,900},{11,0,900},{11,0,900},{11,0,900},{9,22,4},{9,22,4},{9,22,4},{9,17,5},{2,21,4},{2,21,4},{13,31,2414},{12,31,907},{13,25,1186}, +{12,24,898},{11,31,3391},{9,29,1095},{10,24,33},{9,21,1159},{0,31,3276},{3,22,894},{15,31,981},{15,29,90},{15,25,53},{14,24,117},{30,2,3048},{6,31,906},{10,24,29},{3,22,890},{27,15,3048},{3,22,890},{12,31,891},{12,31,891},{12,31,891},{12,24,894},{10,29,652},{10,24,29},{10,24,29},{10,19,44},{0,27,665},{4,20,102},{15,26,2},{15,26,2},{15,26,2},{15,22,2},{22,9,648}, +{8,26,1},{8,26,1},{8,19,4},{29,10,648},{8,19,4},{30,8,882},{12,31,17},{16,24,8},{11,24,5},{30,8,882},{28,18,882},{11,24,5},{0,22,890},{28,18,882},{0,22,890},{12,0,890},{12,0,890},{12,0,890},{12,0,890},{10,23,4},{10,23,4},{10,23,4},{10,18,5},{3,22,4},{3,22,4},{15,31,2606},{13,31,987},{14,26,1186},{13,25,898},{13,31,3517},{10,30,1095},{11,25,33}, +{10,22,1159},{1,31,3300},{4,23,899},{17,31,1014},{15,31,94},{16,26,56},{15,25,117},{31,3,3048},{8,31,936},{11,25,29},{4,23,890},{23,19,3048},{4,23,890},{13,31,906},{13,31,906},{13,31,906},{13,25,894},{11,30,652},{11,25,29},{11,25,29},{11,20,41},{0,29,651},{6,20,98},{16,27,5},{16,27,5},{16,27,5},{16,23,5},{24,8,648},{9,27,1},{9,27,1},{9,20,1},{30,11,648}, +{9,20,1},{31,9,882},{14,31,37},{17,25,8},{12,25,5},{31,9,882},{29,19,882},{12,25,5},{0,23,890},{29,19,882},{0,23,890},{13,0,890},{13,0,890},{13,0,890},{13,0,890},{11,24,4},{11,24,4},{11,24,4},{11,19,5},{3,24,5},{3,24,5},{16,31,2792},{15,31,1079},{15,27,1186},{14,26,898},{14,31,3652},{11,31,1095},{12,26,45},{11,23,1159},{3,31,3436},{4,24,908},{18,31,1080}, +{17,31,110},{17,27,56},{16,26,121},{26,14,3048},{10,31,996},{12,26,36},{5,24,901},{22,21,3048},{5,24,901},{14,31,939},{14,31,939},{14,31,939},{14,26,894},{12,31,659},{12,26,41},{12,26,41},{11,21,46},{1,30,651},{7,21,98},{17,28,4},{17,28,4},{17,28,4},{17,24,8},{28,4,648},{10,28,2},{10,28,2},{10,21,1},{29,13,648},{10,21,1},{29,15,882},{16,31,80},{18,26,8}, +{13,26,5},{29,15,882},{30,20,882},{13,26,5},{0,24,900},{30,20,882},{0,24,900},{14,0,890},{14,0,890},{14,0,890},{14,0,890},{12,25,10},{12,25,10},{12,25,10},{12,20,13},{4,24,8},{4,24,8},{17,31,3038},{16,31,1268},{16,28,1186},{15,27,910},{15,31,3879},{12,31,1146},{13,27,47},{12,24,1159},{5,31,3667},{6,25,894},{19,31,1205},{18,31,147},{18,28,53},{17,27,122},{30,10,3048}, +{12,31,1110},{12,28,41},{6,25,890},{30,18,3048},{6,25,890},{16,31,979},{16,31,979},{16,31,979},{15,27,901},{13,31,670},{13,27,38},{13,27,38},{13,22,44},{2,31,648},{7,23,101},{18,29,2},{18,29,2},{18,29,2},{18,25,2},{31,2,648},{11,29,4},{11,29,4},{11,22,5},{27,16,648},{11,22,5},{29,18,882},{18,31,146},{19,27,18},{15,27,10},{29,18,882},{28,23,882},{15,27,10}, +{0,25,890},{28,23,882},{0,25,890},{15,0,900},{15,0,900},{15,0,900},{15,0,900},{13,26,4},{13,26,4},{13,26,4},{13,21,5},{6,25,4},{6,25,4},{18,31,3308},{17,31,1502},{17,29,1186},{16,28,898},{17,31,4077},{14,31,1230},{14,28,33},{13,25,1159},{8,31,3820},{7,26,894},{21,31,1368},{19,31,261},{19,29,53},{18,28,117},{31,11,3048},{14,31,1226},{14,28,29},{7,26,890},{31,19,3048}, +{7,26,890},{17,31,1018},{17,31,1018},{17,31,1018},{16,28,894},{14,31,724},{14,28,29},{14,28,29},{14,23,44},{4,31,665},{8,24,102},{19,30,2},{19,30,2},{19,30,2},{19,26,2},{26,13,648},{12,30,1},{12,30,1},{12,23,4},{21,21,648},{12,23,4},{30,19,882},{20,31,193},{20,28,8},{15,28,5},{30,19,882},{27,25,882},{15,28,5},{0,26,890},{27,25,882},{0,26,890},{16,0,890}, +{16,0,890},{16,0,890},{16,0,890},{14,27,4},{14,27,4},{14,27,4},{14,22,5},{7,26,4},{7,26,4},{19,31,3614},{18,31,1804},{18,30,1186},{17,29,898},{18,31,4284},{15,31,1417},{15,29,33},{14,26,1159},{9,31,4036},{8,27,899},{22,31,1494},{20,31,405},{20,30,56},{19,29,117},{29,17,3048},{16,31,1395},{15,29,29},{8,27,890},{27,23,3048},{8,27,890},{18,31,1075},{18,31,1075},{18,31,1075}, +{17,29,894},{16,31,787},{15,29,29},{15,29,29},{15,24,41},{6,31,705},{10,24,98},{20,31,5},{20,31,5},{20,31,5},{20,27,5},{28,12,648},{13,31,1},{13,31,1},{13,24,1},{22,22,648},{13,24,1},{29,23,882},{22,31,277},{21,29,8},{16,29,5},{29,23,882},{28,26,882},{16,29,5},{0,27,890},{28,26,882},{0,27,890},{17,0,890},{17,0,890},{17,0,890},{17,0,890},{15,28,4}, +{15,28,4},{15,28,4},{15,23,5},{7,28,5},{7,28,5},{20,31,4014},{19,31,2174},{19,31,1186},{18,30,898},{19,31,4545},{17,31,1725},{16,30,45},{15,27,1159},{11,31,4300},{8,28,908},{23,31,1656},{22,31,585},{21,31,56},{20,30,121},{30,18,3048},{18,31,1563},{16,30,36},{9,28,901},{26,25,3048},{9,28,901},{19,31,1150},{19,31,1150},{19,31,1150},{18,30,894},{17,31,841},{16,30,41},{16,30,41}, +{15,25,46},{8,31,747},{11,25,98},{21,31,20},{21,31,20},{21,31,20},{21,28,8},{29,13,648},{15,31,5},{15,31,5},{14,25,1},{28,20,648},{14,25,1},{30,24,882},{23,31,397},{22,30,8},{17,30,5},{30,24,882},{29,27,882},{17,30,5},{0,28,900},{29,27,882},{0,28,900},{18,0,890},{18,0,890},{18,0,890},{18,0,890},{16,29,10},{16,29,10},{16,29,10},{16,24,13},{8,28,8}, +{8,28,8},{22,31,4123},{21,31,2404},{20,31,1278},{19,31,901},{20,31,4626},{18,31,1849},{17,31,38},{16,28,1006},{14,31,4330},{10,29,789},{24,31,1629},{23,31,715},{22,31,65},{22,30,101},{31,19,2814},{20,31,1505},{17,31,34},{10,29,785},{27,26,2814},{10,29,785},{20,31,1278},{20,31,1278},{20,31,1278},{19,31,901},{18,31,948},{17,31,38},{17,31,38},{17,26,44},{10,31,840},{11,27,101},{22,31,65}, +{22,31,65},{22,31,65},{22,29,2},{29,16,648},{17,31,34},{17,31,34},{15,26,5},{31,20,648},{15,26,5},{31,25,761},{25,31,425},{23,31,9},{19,31,1},{31,25,761},{28,29,761},{19,31,1},{0,29,785},{28,29,761},{0,29,785},{19,0,900},{19,0,900},{19,0,900},{19,0,900},{17,30,4},{17,30,4},{17,30,4},{17,25,5},{10,29,4},{10,29,4},{23,31,3735},{22,31,2314},{21,31,1395}, +{20,31,899},{22,31,4090},{19,31,1618},{18,31,104},{17,29,686},{15,31,3826},{11,29,507},{25,31,1285},{24,31,609},{23,31,122},{23,31,37},{30,22,2249},{21,31,1186},{19,31,74},{13,29,482},{27,27,2249},{13,29,482},{21,31,1395},{21,31,1395},{21,31,1395},{20,31,899},{19,31,1086},{18,31,104},{18,31,104},{18,27,44},{12,31,969},{12,28,102},{23,31,122},{23,31,122},{23,31,122},{23,30,2},{30,17,648}, +{19,31,74},{19,31,74},{16,27,4},{25,25,648},{16,27,4},{31,26,481},{27,31,269},{25,31,0},{21,31,0},{31,26,481},{31,28,481},{21,31,0},{0,29,481},{31,28,481},{0,29,481},{20,0,890},{20,0,890},{20,0,890},{20,0,890},{18,31,4},{18,31,4},{18,31,4},{18,26,5},{11,30,4},{11,30,4},{23,31,3399},{23,31,2260},{22,31,1530},{21,31,954},{23,31,3639},{20,31,1402},{19,31,238}, +{18,29,405},{17,31,3443},{12,30,314},{26,31,1009},{25,31,525},{25,31,164},{24,31,5},{30,24,1769},{23,31,918},{21,31,113},{14,30,290},{29,27,1769},{14,30,290},{22,31,1530},{22,31,1530},{22,31,1530},{21,31,954},{21,31,1251},{19,31,238},{19,31,238},{19,28,41},{14,31,1105},{14,28,98},{25,31,164},{25,31,164},{25,31,164},{24,31,5},{31,18,648},{21,31,113},{21,31,113},{17,28,1},{26,26,648}, +{17,28,1},{30,29,265},{28,31,145},{27,31,4},{24,31,1},{30,29,265},{29,30,265},{24,31,1},{0,30,289},{29,30,265},{0,30,289},{21,0,890},{21,0,890},{21,0,890},{21,0,890},{19,31,13},{19,31,13},{19,31,13},{19,27,5},{12,31,9},{12,31,9},{24,31,3069},{24,31,2257},{23,31,1683},{23,31,1054},{24,31,3258},{22,31,1330},{21,31,378},{19,30,213},{20,31,3102},{14,30,166},{27,31,801}, +{26,31,477},{26,31,221},{25,31,20},{31,24,1374},{24,31,758},{23,31,181},{16,30,114},{24,31,1374},{16,30,114},{23,31,1683},{23,31,1683},{23,31,1683},{23,31,1054},{22,31,1401},{21,31,378},{21,31,378},{19,29,46},{16,31,1296},{15,29,98},{26,31,221},{26,31,221},{26,31,221},{25,31,20},{30,22,648},{23,31,181},{23,31,181},{18,29,1},{27,27,648},{18,29,1},{30,30,113},{29,31,61},{28,31,0}, +{26,31,1},{30,30,113},{30,30,113},{26,31,1},{0,30,113},{30,30,113},{0,30,113},{22,0,890},{22,0,890},{22,0,890},{22,0,890},{20,31,45},{20,31,45},{20,31,45},{20,28,13},{13,31,25},{13,31,25},{25,31,2860},{25,31,2260},{24,31,1854},{24,31,1210},{25,31,2932},{23,31,1310},{22,31,609},{21,30,108},{21,31,2731},{15,31,101},{28,31,630},{27,31,475},{27,31,306},{26,31,101},{31,26,1032}, +{26,31,612},{25,31,290},{18,31,37},{29,29,1032},{18,31,37},{24,31,1854},{24,31,1854},{24,31,1854},{24,31,1210},{23,31,1620},{22,31,609},{22,31,609},{21,30,44},{18,31,1515},{15,31,101},{27,31,306},{27,31,306},{27,31,306},{26,31,101},{30,25,648},{25,31,290},{25,31,290},{19,30,5},{30,27,648},{19,30,5},{31,30,18},{30,31,10},{30,31,1},{29,31,0},{31,30,18},{30,31,18},{29,31,0}, +{0,31,36},{30,31,18},{0,31,36},{23,0,900},{23,0,900},{23,0,900},{23,0,900},{21,31,104},{21,31,104},{21,31,104},{21,29,5},{15,31,65},{15,31,65},{26,31,2626},{26,31,2206},{25,31,1915},{25,31,1315},{26,31,2641},{24,31,1333},{23,31,789},{22,31,40},{22,31,2445},{17,31,116},{29,31,524},{28,31,406},{28,31,325},{27,31,170},{30,29,771},{27,31,507},{26,31,320},{20,31,0},{29,30,771}, +{20,31,0},{25,31,1915},{25,31,1915},{25,31,1915},{25,31,1315},{24,31,1661},{23,31,789},{23,31,789},{22,31,40},{20,31,1517},{17,31,116},{28,31,325},{28,31,325},{28,31,325},{27,31,170},{31,26,580},{26,31,320},{26,31,320},{20,31,0},{30,28,580},{20,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{24,0,890}, +{24,0,890},{24,0,890},{24,0,890},{23,31,164},{23,31,164},{23,31,164},{22,30,5},{17,31,116},{17,31,116},{27,31,2156},{27,31,1884},{26,31,1630},{26,31,1210},{26,31,2081},{25,31,1108},{24,31,705},{23,31,5},{23,31,1927},{19,31,180},{29,31,300},{29,31,236},{29,31,200},{28,31,85},{31,28,451},{28,31,283},{27,31,194},{23,31,1},{28,31,451},{23,31,1},{26,31,1630},{26,31,1630},{26,31,1630}, +{26,31,1210},{25,31,1347},{24,31,705},{24,31,705},{23,31,5},{22,31,1229},{19,31,180},{29,31,200},{29,31,200},{29,31,200},{28,31,85},{31,27,338},{27,31,194},{27,31,194},{23,31,1},{30,29,338},{23,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{25,0,890},{25,0,890},{25,0,890},{25,0,890},{24,31,221}, +{24,31,221},{24,31,221},{23,31,5},{19,31,180},{19,31,180},{28,31,1782},{27,31,1564},{27,31,1395},{27,31,1123},{27,31,1620},{26,31,937},{25,31,651},{24,31,25},{24,31,1560},{21,31,233},{30,31,150},{30,31,134},{29,31,104},{29,31,40},{31,29,216},{29,31,136},{28,31,90},{25,31,1},{29,31,216},{25,31,1},{27,31,1395},{27,31,1395},{27,31,1395},{27,31,1123},{26,31,1101},{25,31,651},{25,31,651}, +{24,31,25},{23,31,998},{21,31,233},{29,31,104},{29,31,104},{29,31,104},{29,31,40},{31,28,162},{28,31,90},{28,31,90},{25,31,1},{28,31,162},{25,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{26,0,890},{26,0,890},{26,0,890},{26,0,890},{25,31,290},{25,31,290},{25,31,290},{24,31,25},{21,31,233}, +{21,31,233},{0,17,1568},{0,14,442},{0,10,40},{0,8,485},{0,11,3379},{0,9,2369},{0,8,1061},{0,5,2435},{0,6,3760},{0,5,2660},{0,17,1568},{0,14,442},{0,10,40},{0,8,485},{7,0,3371},{0,9,2369},{0,8,1061},{0,5,2435},{10,1,3371},{0,5,2435},{0,8,0},{0,8,0},{0,8,0},{0,5,1},{0,4,288},{0,4,160},{0,4,160},{0,2,164},{0,2,332},{0,2,200},{0,8,0}, +{0,8,0},{0,8,0},{0,5,1},{0,4,288},{0,4,160},{0,4,160},{0,2,164},{4,0,288},{0,2,164},{9,2,1568},{0,14,442},{0,10,40},{0,8,485},{9,2,1568},{17,0,1568},{0,8,485},{0,6,1586},{17,0,1568},{0,6,1586},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,20,1570},{0,16,325},{0,11,5}, +{0,9,392},{0,13,3968},{0,10,2630},{0,9,1121},{0,6,2710},{0,7,4484},{0,6,3034},{0,20,1570},{0,16,325},{0,11,5},{0,9,392},{2,10,3968},{0,10,2630},{0,9,1121},{0,6,2710},{13,0,3968},{0,6,2710},{0,11,1},{0,11,1},{0,11,1},{0,6,4},{0,5,514},{0,5,274},{0,5,274},{0,3,289},{0,3,595},{0,3,370},{0,11,1},{0,11,1},{0,11,1},{0,6,4},{2,2,512}, +{0,5,274},{0,5,274},{0,3,289},{2,2,512},{0,3,289},{10,3,1568},{0,16,325},{0,11,5},{0,9,392},{10,3,1568},{18,1,1568},{0,9,392},{0,7,1586},{18,1,1568},{0,7,1586},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,22,1570},{0,17,225},{0,12,18},{0,11,292},{0,15,4652},{0,11,2945},{0,10,1217}, +{0,7,3035},{0,8,5283},{0,7,3476},{0,22,1570},{0,17,225},{0,12,18},{0,11,292},{4,8,4651},{0,11,2945},{0,10,1217},{0,7,3035},{13,1,4651},{0,7,3035},{0,13,0},{0,13,0},{0,13,0},{0,8,1},{0,7,802},{0,6,424},{0,6,424},{0,4,449},{0,3,931},{0,3,562},{0,13,0},{0,13,0},{0,13,0},{0,8,1},{4,0,800},{0,6,424},{0,6,424},{0,4,449},{5,1,800}, +{0,4,449},{11,4,1568},{0,17,225},{1,12,13},{0,11,292},{11,4,1568},{19,2,1568},{0,11,292},{0,8,1576},{19,2,1568},{0,8,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,25,1570},{0,19,149},{0,13,73},{0,12,194},{0,17,5424},{0,13,3368},{0,11,1349},{0,8,3449},{0,9,6213},{0,7,3956},{0,25,1570}, +{0,19,149},{0,13,73},{0,12,194},{10,0,5419},{0,13,3368},{0,11,1349},{0,8,3449},{15,1,5419},{0,8,3449},{0,16,1},{0,16,1},{0,16,1},{0,9,4},{0,8,1152},{0,7,610},{0,7,610},{0,4,625},{0,4,1328},{0,4,769},{0,16,1},{0,16,1},{0,16,1},{0,9,4},{3,3,1152},{0,7,610},{0,7,610},{0,4,625},{8,0,1152},{0,4,625},{15,0,1568},{0,19,149},{2,13,13}, +{0,12,194},{15,0,1568},{20,3,1568},{0,12,194},{0,9,1576},{20,3,1568},{0,9,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,26,1633},{0,21,155},{1,14,150},{0,13,198},{0,20,5424},{0,15,3099},{0,12,996},{0,9,3179},{0,10,6544},{0,8,3890},{1,26,1569},{1,20,131},{2,14,69},{1,13,181},{10,3,5419}, +{0,15,3099},{0,12,996},{0,9,3179},{18,1,5419},{0,9,3179},{1,17,65},{1,17,65},{1,17,65},{1,11,69},{0,11,1152},{0,9,445},{0,9,445},{0,6,505},{0,6,1494},{0,5,737},{1,17,1},{1,17,1},{1,17,1},{1,11,5},{6,1,1152},{0,9,445},{0,9,445},{0,6,505},{11,0,1152},{0,6,505},{16,1,1568},{0,21,74},{3,14,5},{0,13,117},{16,1,1568},{26,1,1568},{0,13,117}, +{0,10,1586},{26,1,1568},{0,10,1586},{1,0,65},{1,0,65},{1,0,65},{1,0,65},{0,3,0},{0,3,0},{0,3,0},{0,2,1},{0,1,25},{0,1,25},{1,29,1715},{1,22,219},{2,15,342},{1,14,262},{0,22,5420},{0,16,2834},{0,13,726},{0,10,2966},{0,11,6916},{0,9,3860},{2,27,1569},{2,21,131},{3,15,69},{2,14,181},{11,4,5419},{0,16,2834},{0,13,726},{0,10,2966},{19,2,5419}, +{0,10,2966},{1,20,146},{1,20,146},{1,20,146},{1,12,146},{0,13,1154},{0,11,337},{0,11,337},{0,7,388},{0,7,1665},{0,6,749},{2,18,1},{2,18,1},{2,18,1},{2,12,5},{8,0,1152},{0,11,337},{0,11,337},{0,7,388},{5,5,1152},{0,7,388},{17,2,1568},{0,23,34},{4,15,5},{0,14,72},{17,2,1568},{27,2,1568},{0,14,72},{0,11,1586},{27,2,1568},{0,11,1586},{1,0,145}, +{1,0,145},{1,0,145},{1,0,145},{0,6,1},{0,6,1},{0,6,1},{0,3,4},{0,2,85},{0,2,85},{2,30,1907},{1,24,398},{2,16,542},{1,15,425},{0,25,5424},{0,18,2630},{0,15,486},{0,11,2771},{0,13,7299},{0,11,3860},{3,28,1569},{3,22,131},{4,16,82},{3,15,181},{15,0,5419},{0,18,2630},{0,15,486},{0,11,2771},{20,3,5419},{0,11,2771},{2,21,338},{2,21,338},{2,21,338}, +{2,13,338},{0,16,1152},{0,13,274},{0,13,274},{0,8,305},{0,8,1856},{0,7,797},{3,19,1},{3,19,1},{3,19,1},{3,13,5},{9,1,1152},{0,13,274},{0,13,274},{0,8,305},{16,0,1152},{0,8,305},{18,3,1568},{0,25,17},{5,16,13},{0,15,45},{18,3,1568},{28,3,1568},{0,15,45},{0,12,1576},{28,3,1568},{0,12,1576},{2,0,337},{2,0,337},{2,0,337},{2,0,337},{0,8,1}, +{0,8,1},{0,8,1},{0,5,0},{0,4,169},{0,4,169},{2,31,2145},{2,25,590},{3,17,862},{2,16,619},{0,27,5420},{0,20,2424},{0,16,282},{0,12,2552},{0,15,7711},{0,11,3908},{4,29,1570},{4,23,149},{4,17,73},{4,16,194},{14,4,5419},{0,20,2424},{0,16,282},{0,12,2552},{24,2,5419},{0,12,2552},{2,23,546},{2,23,546},{2,23,546},{2,15,546},{0,19,1154},{0,15,194},{0,15,194}, +{0,9,218},{0,9,2123},{0,8,865},{4,20,1},{4,20,1},{4,20,1},{4,13,4},{10,2,1152},{0,15,194},{0,15,194},{0,9,218},{17,1,1152},{0,9,218},{20,2,1568},{0,27,5},{6,17,13},{0,16,26},{20,2,1568},{24,7,1568},{0,16,26},{0,13,1576},{24,7,1568},{0,13,1576},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,11,0},{0,11,0},{0,11,0},{0,7,4},{0,5,289}, +{0,5,289},{3,31,2596},{3,26,941},{3,19,1289},{3,17,972},{0,30,5420},{0,22,2243},{0,17,145},{0,13,2386},{0,16,8161},{0,13,3986},{5,30,1569},{5,24,131},{6,18,69},{5,17,181},{17,2,5419},{0,22,2243},{0,17,145},{0,13,2386},{27,2,5419},{0,13,2386},{3,24,901},{3,24,901},{3,24,901},{3,16,901},{0,22,1154},{0,17,109},{0,17,109},{0,10,145},{0,11,2441},{0,9,1001},{5,21,1}, +{5,21,1},{5,21,1},{5,15,5},{13,0,1152},{0,17,109},{0,17,109},{0,10,145},{20,1,1152},{0,10,145},{23,0,1568},{1,28,2},{7,18,5},{0,18,8},{23,0,1568},{30,5,1568},{0,18,8},{0,14,1586},{30,5,1568},{0,14,1586},{3,0,900},{3,0,900},{3,0,900},{3,0,900},{0,14,1},{0,14,1},{0,14,1},{0,8,1},{0,6,468},{0,6,468},{4,31,3146},{3,28,1262},{4,19,1743}, +{3,18,1297},{1,31,5484},{0,23,2096},{0,19,69},{0,14,2251},{0,18,8669},{0,14,4100},{6,31,1569},{6,25,131},{7,19,69},{6,18,181},{18,3,5419},{0,23,2096},{0,19,69},{0,14,2251},{28,3,5419},{0,14,2251},{3,27,1252},{3,27,1252},{3,27,1252},{3,17,1256},{0,24,1152},{0,18,61},{0,18,61},{0,11,100},{0,12,2859},{0,10,1157},{6,22,1},{6,22,1},{6,22,1},{6,16,5},{14,1,1152}, +{0,18,61},{0,18,61},{0,11,100},{24,0,1152},{0,11,100},{24,1,1568},{2,29,2},{8,19,5},{0,19,5},{24,1,1568},{31,6,1568},{0,19,5},{0,15,1586},{31,6,1568},{0,15,1586},{3,0,1252},{3,0,1252},{3,0,1252},{3,0,1252},{0,16,1},{0,16,1},{0,16,1},{0,10,1},{0,8,657},{0,8,657},{5,31,3716},{4,29,1603},{4,21,2148},{4,19,1631},{2,31,5655},{0,25,2005},{0,20,31}, +{0,15,2138},{0,19,8963},{0,15,4070},{7,31,1587},{7,26,131},{8,20,82},{7,19,181},{20,2,5419},{0,25,2001},{0,20,27},{0,15,2134},{24,7,5419},{0,15,2134},{4,28,1587},{4,28,1587},{4,28,1587},{4,18,1590},{0,27,1158},{0,20,22},{0,20,22},{0,12,62},{0,14,3075},{0,11,1221},{7,23,1},{7,23,1},{7,23,1},{7,17,5},{16,0,1152},{0,20,18},{0,20,18},{0,12,58},{25,1,1152}, +{0,12,58},{25,2,1568},{3,30,2},{9,20,13},{1,20,9},{25,2,1568},{27,10,1568},{1,20,9},{0,16,1576},{27,10,1568},{0,16,1576},{4,0,1586},{4,0,1586},{4,0,1586},{4,0,1586},{0,19,4},{0,19,4},{0,19,4},{0,11,8},{0,9,769},{0,9,769},{6,31,3890},{5,30,1603},{5,22,2148},{5,20,1627},{3,31,5748},{0,27,1989},{1,21,31},{0,17,2117},{0,21,8560},{0,16,3545},{9,31,1634}, +{8,27,149},{8,21,73},{8,20,194},{21,3,5419},{0,27,1889},{1,21,27},{0,17,2017},{28,6,5419},{0,17,2017},{5,29,1587},{5,29,1587},{5,29,1587},{5,19,1590},{1,28,1158},{1,21,22},{1,21,22},{1,13,62},{0,16,2801},{0,13,949},{8,24,1},{8,24,1},{8,24,1},{8,17,4},{17,1,1152},{0,22,2},{0,22,2},{0,14,26},{26,2,1152},{0,14,26},{26,3,1568},{4,31,5},{10,21,13}, +{2,21,9},{26,3,1568},{28,11,1568},{2,21,9},{0,17,1576},{28,11,1568},{0,17,1576},{5,0,1586},{5,0,1586},{5,0,1586},{5,0,1586},{1,20,4},{1,20,4},{1,20,4},{1,12,8},{0,10,625},{0,10,625},{7,31,4136},{6,31,1589},{7,23,2157},{6,21,1621},{4,31,5895},{1,28,1977},{2,22,33},{1,18,2107},{0,23,8196},{0,17,3043},{10,31,1667},{9,28,131},{10,22,69},{9,21,181},{24,1,5419}, +{0,29,1772},{2,22,24},{0,18,1875},{31,6,5419},{0,18,1875},{6,30,1576},{6,30,1576},{6,30,1576},{6,20,1580},{2,29,1161},{2,22,29},{2,22,29},{2,15,58},{0,17,2529},{0,14,656},{9,25,1},{9,25,1},{9,25,1},{9,19,5},{17,4,1152},{0,24,1},{0,24,1},{0,15,1},{29,2,1152},{0,15,1},{27,4,1568},{6,31,13},{11,22,5},{3,22,5},{27,4,1568},{31,11,1568},{3,22,5}, +{0,18,1586},{31,11,1568},{0,18,1586},{6,0,1576},{6,0,1576},{6,0,1576},{6,0,1576},{2,21,10},{2,21,10},{2,21,10},{2,14,13},{0,12,520},{0,12,520},{8,31,4436},{7,31,1625},{8,23,2175},{7,22,1621},{6,31,6079},{3,28,1973},{3,23,33},{2,19,2107},{0,24,7969},{0,18,2675},{11,31,1745},{10,29,131},{11,23,69},{10,22,181},{25,2,5419},{0,30,1699},{3,23,24},{0,19,1782},{27,10,5419}, +{0,19,1782},{7,31,1576},{7,31,1576},{7,31,1576},{7,21,1580},{3,30,1161},{3,23,29},{3,23,29},{3,16,74},{0,19,2313},{0,15,474},{10,26,1},{10,26,1},{10,26,1},{10,20,5},{18,5,1152},{1,25,1},{1,25,1},{0,16,2},{30,3,1152},{0,16,2},{31,0,1568},{8,31,34},{12,23,5},{4,23,5},{31,0,1568},{30,13,1568},{4,23,5},{0,19,1586},{30,13,1568},{0,19,1586},{7,0,1576}, +{7,0,1576},{7,0,1576},{7,0,1576},{3,22,10},{3,22,10},{3,22,10},{3,15,13},{0,14,400},{0,14,400},{9,31,4730},{8,31,1716},{8,25,2148},{8,23,1631},{7,31,6244},{3,30,1977},{4,24,31},{4,19,2138},{0,26,7669},{0,19,2375},{12,31,1832},{11,30,131},{12,24,82},{11,23,181},{26,3,5419},{1,31,1699},{4,24,27},{0,20,1720},{28,11,5419},{0,20,1720},{8,31,1595},{8,31,1595},{8,31,1595}, +{8,22,1590},{4,31,1158},{4,24,22},{4,24,22},{4,16,62},{0,21,2091},{0,17,306},{11,27,1},{11,27,1},{11,27,1},{11,21,5},{20,4,1152},{2,26,1},{2,26,1},{1,17,2},{29,5,1152},{1,17,2},{29,6,1568},{9,31,68},{13,24,13},{5,24,9},{29,6,1568},{31,14,1568},{5,24,9},{0,20,1576},{31,14,1568},{0,20,1576},{8,0,1586},{8,0,1586},{8,0,1586},{8,0,1586},{4,23,4}, +{4,23,4},{4,23,4},{4,15,8},{0,16,277},{0,16,277},{11,31,5010},{9,31,1878},{9,26,2148},{9,24,1627},{8,31,6508},{4,31,1989},{5,25,31},{4,21,2117},{0,28,7364},{0,21,2098},{14,31,1952},{12,31,149},{12,25,73},{12,24,194},{28,2,5419},{3,31,1787},{5,25,27},{0,21,1657},{27,13,5419},{0,21,1657},{9,31,1622},{9,31,1622},{9,31,1622},{9,23,1590},{5,31,1164},{5,25,22},{5,25,22}, +{5,17,62},{0,22,1928},{0,18,194},{12,28,1},{12,28,1},{12,28,1},{12,21,4},{24,0,1152},{3,27,1},{3,27,1},{2,18,2},{30,6,1152},{2,18,2},{30,7,1568},{11,31,116},{14,25,13},{6,25,9},{30,7,1568},{30,16,1568},{6,25,9},{0,21,1576},{30,16,1568},{0,21,1576},{9,0,1586},{9,0,1586},{9,0,1586},{9,0,1586},{5,24,4},{5,24,4},{5,24,4},{5,16,8},{0,18,193}, +{0,18,193},{12,31,5316},{11,31,2154},{11,27,2157},{10,25,1621},{10,31,6800},{6,31,1999},{6,26,33},{5,22,2107},{0,29,7068},{0,22,1836},{15,31,2081},{13,31,206},{14,26,69},{13,25,181},{31,0,5419},{5,31,1937},{6,26,24},{0,22,1611},{30,13,5419},{0,22,1611},{10,31,1676},{10,31,1676},{10,31,1676},{10,24,1580},{7,31,1179},{6,26,29},{6,26,29},{6,19,58},{0,24,1798},{0,19,157},{13,29,1}, +{13,29,1},{13,29,1},{13,23,5},{24,3,1152},{4,28,1},{4,28,1},{4,19,1},{28,9,1152},{4,19,1},{31,8,1568},{13,31,205},{15,26,5},{7,26,5},{31,8,1568},{28,19,1568},{7,26,5},{0,22,1586},{28,19,1568},{0,22,1586},{10,0,1576},{10,0,1576},{10,0,1576},{10,0,1576},{6,25,10},{6,25,10},{6,25,10},{6,18,13},{0,20,106},{0,20,106},{13,31,5658},{12,31,2435},{12,27,2175}, +{11,26,1621},{11,31,7055},{7,31,2090},{7,27,33},{6,23,2107},{0,31,6820},{0,23,1690},{16,31,2216},{14,31,334},{15,27,69},{14,26,181},{29,6,5419},{7,31,2081},{7,27,24},{0,23,1590},{31,14,5419},{0,23,1590},{11,31,1745},{11,31,1745},{11,31,1745},{11,25,1580},{8,31,1220},{7,27,29},{7,27,29},{7,20,74},{0,26,1650},{1,20,137},{14,30,1},{14,30,1},{14,30,1},{14,24,5},{22,9,1152}, +{5,29,1},{5,29,1},{4,20,2},{29,10,1152},{4,20,2},{29,14,1568},{15,31,289},{16,27,5},{8,27,5},{29,14,1568},{29,20,1568},{8,27,5},{0,23,1586},{29,20,1568},{0,23,1586},{11,0,1576},{11,0,1576},{11,0,1576},{11,0,1576},{7,26,10},{7,26,10},{7,26,10},{7,19,13},{0,22,58},{0,22,58},{14,31,6036},{13,31,2751},{12,29,2148},{12,27,1631},{12,31,7316},{8,31,2228},{8,28,31}, +{8,23,2138},{0,31,6884},{0,24,1613},{17,31,2402},{16,31,500},{16,28,82},{15,27,181},{30,7,5419},{9,31,2195},{8,28,27},{0,24,1577},{30,16,5419},{0,24,1577},{12,31,1811},{12,31,1811},{12,31,1811},{12,26,1590},{9,31,1286},{8,28,22},{8,28,22},{8,20,62},{0,28,1508},{2,21,137},{15,31,1},{15,31,1},{15,31,1},{15,25,5},{24,8,1152},{6,30,1},{6,30,1},{5,21,2},{30,11,1152}, +{5,21,2},{30,15,1568},{17,31,410},{17,28,13},{9,28,9},{30,15,1568},{30,21,1568},{9,28,9},{0,24,1576},{30,21,1568},{0,24,1576},{12,0,1586},{12,0,1586},{12,0,1586},{12,0,1586},{8,27,4},{8,27,4},{8,27,4},{8,19,8},{0,24,37},{0,24,37},{15,31,6450},{14,31,3135},{13,30,2148},{13,28,1627},{13,31,7661},{10,31,2448},{9,29,31},{8,25,2117},{2,31,7196},{0,25,1593},{19,31,2594}, +{17,31,698},{16,29,73},{16,28,194},{29,11,5419},{11,31,2379},{9,29,27},{1,25,1577},{31,17,5419},{1,25,1577},{13,31,1910},{13,31,1910},{13,31,1910},{13,27,1590},{10,31,1388},{9,29,22},{9,29,22},{9,21,62},{0,30,1416},{3,22,137},{16,31,4},{16,31,4},{16,31,4},{16,25,4},{28,4,1152},{7,31,1},{7,31,1},{6,22,2},{29,13,1152},{6,22,2},{31,16,1568},{19,31,530},{18,29,13}, +{10,29,9},{31,16,1568},{31,22,1568},{10,29,9},{0,25,1576},{31,22,1568},{0,25,1576},{13,0,1586},{13,0,1586},{13,0,1586},{13,0,1586},{9,28,4},{9,28,4},{9,28,4},{9,20,8},{0,25,17},{0,25,17},{16,31,6900},{15,31,3657},{15,31,2157},{14,29,1621},{15,31,8023},{11,31,2845},{10,30,33},{9,26,2107},{5,31,7651},{1,26,1611},{20,31,2866},{18,31,1011},{18,30,69},{17,29,181},{29,14,5419}, +{13,31,2657},{10,30,24},{3,26,1587},{29,20,5419},{3,26,1587},{15,31,2057},{15,31,2057},{15,31,2057},{14,28,1580},{12,31,1476},{10,30,29},{10,30,29},{10,23,58},{0,31,1324},{4,23,157},{17,31,37},{17,31,37},{17,31,37},{17,27,5},{31,2,1152},{9,31,4},{9,31,4},{8,23,1},{27,16,1152},{8,23,1},{31,19,1568},{21,31,637},{19,30,5},{11,30,5},{31,19,1568},{27,26,1568},{11,30,5}, +{0,26,1586},{27,26,1568},{0,26,1586},{14,0,1576},{14,0,1576},{14,0,1576},{14,0,1576},{10,29,10},{10,29,10},{10,29,10},{10,22,13},{1,27,9},{1,27,9},{18,31,7332},{16,31,4196},{16,31,2175},{15,30,1621},{16,31,8348},{13,31,3285},{11,31,33},{10,27,2107},{8,31,8004},{2,27,1611},{21,31,3112},{20,31,1281},{19,31,69},{18,30,181},{30,15,5419},{15,31,2897},{11,31,24},{3,27,1590},{30,21,5419}, +{3,27,1590},{16,31,2171},{16,31,2171},{16,31,2171},{15,29,1580},{13,31,1590},{11,31,29},{11,31,29},{11,24,74},{2,31,1424},{5,24,137},{19,31,65},{19,31,65},{19,31,65},{18,28,5},{26,13,1152},{11,31,20},{11,31,20},{8,24,2},{21,21,1152},{8,24,2},{30,23,1568},{23,31,785},{20,31,5},{12,31,5},{30,23,1568},{28,27,1568},{12,31,5},{0,27,1586},{28,27,1568},{0,27,1586},{15,0,1576}, +{15,0,1576},{15,0,1576},{15,0,1576},{11,30,10},{11,30,10},{11,30,10},{11,23,13},{1,28,8},{1,28,8},{19,31,7014},{17,31,4230},{17,31,2294},{16,31,1595},{17,31,7865},{14,31,3114},{12,31,85},{12,27,1706},{8,31,7436},{3,28,1268},{22,31,2794},{21,31,1221},{20,31,113},{19,30,114},{30,17,4803},{17,31,2648},{13,31,61},{4,28,1253},{25,25,4803},{4,28,1253},{17,31,2294},{17,31,2294},{17,31,2294}, +{16,30,1590},{14,31,1740},{12,31,85},{12,31,85},{12,24,62},{3,31,1571},{6,25,137},{20,31,113},{20,31,113},{20,31,113},{19,29,5},{28,12,1152},{13,31,61},{13,31,61},{9,25,2},{22,22,1152},{9,25,2},{31,23,1250},{24,31,680},{21,31,4},{15,31,0},{31,23,1250},{23,31,1250},{15,31,0},{0,28,1252},{23,31,1250},{0,28,1252},{16,0,1586},{16,0,1586},{16,0,1586},{16,0,1586},{12,31,4}, +{12,31,4},{12,31,4},{12,23,8},{2,29,8},{2,29,8},{19,31,6534},{18,31,4116},{18,31,2435},{17,31,1590},{18,31,7164},{15,31,2809},{14,31,161},{12,28,1256},{10,31,6748},{5,28,945},{23,31,2340},{22,31,1065},{21,31,164},{20,31,64},{31,17,4056},{18,31,2211},{15,31,113},{7,28,900},{25,26,4056},{7,28,900},{18,31,2435},{18,31,2435},{18,31,2435},{17,31,1590},{16,31,1923},{14,31,161},{14,31,161}, +{13,25,62},{6,31,1729},{7,26,137},{21,31,164},{21,31,164},{21,31,164},{20,29,4},{29,13,1152},{15,31,113},{15,31,113},{10,26,2},{28,20,1152},{10,26,2},{30,26,882},{25,31,482},{23,31,0},{18,31,1},{30,26,882},{31,27,882},{18,31,1},{0,28,900},{31,27,882},{0,28,900},{17,0,1586},{17,0,1586},{17,0,1586},{17,0,1586},{13,31,13},{13,31,13},{13,31,13},{13,24,8},{3,30,8}, +{3,30,8},{21,31,6091},{20,31,4022},{19,31,2609},{18,31,1640},{19,31,6490},{16,31,2617},{15,31,318},{14,28,835},{11,31,6135},{6,29,598},{24,31,1881},{23,31,931},{22,31,245},{21,31,5},{31,19,3318},{20,31,1733},{17,31,202},{8,29,545},{27,26,3318},{8,29,545},{19,31,2609},{19,31,2609},{19,31,2609},{18,31,1640},{17,31,2086},{15,31,318},{15,31,318},{14,27,58},{8,31,1868},{8,27,157},{22,31,245}, +{22,31,245},{22,31,245},{21,31,5},{29,16,1152},{17,31,202},{17,31,202},{12,27,1},{31,20,1152},{12,27,1},{31,26,545},{26,31,305},{25,31,4},{20,31,1},{31,26,545},{29,29,545},{20,31,1},{0,29,545},{29,29,545},{0,29,545},{18,0,1576},{18,0,1576},{18,0,1576},{18,0,1576},{15,31,29},{15,31,29},{15,31,29},{14,26,13},{5,31,9},{5,31,9},{22,31,5719},{21,31,3980},{20,31,2834}, +{19,31,1745},{20,31,6050},{18,31,2457},{16,31,536},{15,29,515},{14,31,5674},{7,30,406},{25,31,1573},{24,31,861},{23,31,338},{22,31,10},{30,22,2753},{21,31,1438},{19,31,290},{11,29,338},{27,27,2753},{11,29,338},{20,31,2834},{20,31,2834},{20,31,2834},{19,31,1745},{18,31,2284},{16,31,536},{16,31,536},{15,28,74},{10,31,2064},{9,28,137},{23,31,338},{23,31,338},{23,31,338},{22,31,10},{30,17,1152}, +{19,31,290},{19,31,290},{12,28,2},{25,25,1152},{12,28,2},{31,27,313},{28,31,181},{26,31,1},{23,31,0},{31,27,313},{30,29,313},{23,31,0},{0,29,337},{30,29,313},{0,29,337},{19,0,1576},{19,0,1576},{19,0,1576},{19,0,1576},{16,31,52},{16,31,52},{16,31,52},{15,27,13},{6,31,25},{6,31,25},{22,31,5399},{22,31,3974},{21,31,3035},{20,31,1875},{21,31,5619},{19,31,2378},{18,31,776}, +{16,30,318},{15,31,5258},{9,30,225},{26,31,1333},{25,31,813},{24,31,425},{23,31,65},{30,24,2273},{23,31,1218},{20,31,353},{12,30,146},{29,27,2273},{12,30,146},{21,31,3035},{21,31,3035},{21,31,3035},{20,31,1875},{19,31,2518},{18,31,776},{18,31,776},{16,28,62},{11,31,2323},{10,29,137},{24,31,425},{24,31,425},{24,31,425},{23,31,65},{31,18,1152},{20,31,353},{20,31,353},{13,29,2},{26,26,1152}, +{13,29,2},{31,28,145},{28,31,85},{28,31,4},{26,31,1},{31,28,145},{30,30,145},{26,31,1},{0,30,145},{30,30,145},{0,30,145},{20,0,1586},{20,0,1586},{20,0,1586},{20,0,1586},{17,31,85},{17,31,85},{17,31,85},{16,27,8},{8,31,40},{8,31,40},{23,31,5143},{23,31,4004},{22,31,3254},{21,31,2070},{22,31,5274},{20,31,2310},{19,31,1062},{17,30,133},{17,31,5011},{10,31,161},{27,31,1161}, +{26,31,801},{26,31,545},{25,31,164},{31,24,1878},{24,31,1094},{22,31,461},{14,30,66},{24,31,1878},{14,30,66},{22,31,3254},{22,31,3254},{22,31,3254},{21,31,2070},{20,31,2833},{19,31,1062},{19,31,1062},{17,29,62},{14,31,2577},{11,30,137},{26,31,545},{26,31,545},{26,31,545},{25,31,164},{30,22,1152},{22,31,461},{22,31,461},{14,30,2},{27,27,1152},{14,30,2},{30,31,41},{30,31,25},{29,31,1}, +{28,31,0},{30,31,41},{31,30,41},{28,31,0},{0,30,65},{31,30,41},{0,30,65},{21,0,1586},{21,0,1586},{21,0,1586},{21,0,1586},{18,31,136},{18,31,136},{18,31,136},{17,28,8},{10,31,80},{10,31,80},{24,31,4882},{24,31,4070},{23,31,3532},{22,31,2360},{24,31,4945},{21,31,2422},{20,31,1433},{18,31,58},{20,31,4717},{12,31,157},{28,31,1026},{27,31,835},{27,31,666},{26,31,305},{31,26,1536}, +{26,31,996},{24,31,628},{16,31,1},{29,29,1536},{16,31,1},{23,31,3532},{23,31,3532},{23,31,3532},{22,31,2360},{22,31,3110},{20,31,1433},{20,31,1433},{18,31,58},{16,31,2939},{12,31,157},{27,31,666},{27,31,666},{27,31,666},{26,31,305},{30,25,1152},{24,31,628},{24,31,628},{16,31,1},{30,27,1152},{16,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0}, +{0,31,0},{31,31,0},{0,31,0},{22,0,1576},{22,0,1576},{22,0,1576},{22,0,1576},{19,31,221},{19,31,221},{19,31,221},{18,30,13},{12,31,157},{12,31,157},{25,31,4212},{24,31,3590},{24,31,3106},{23,31,2201},{24,31,4129},{22,31,2101},{21,31,1301},{19,31,13},{20,31,3869},{14,31,233},{28,31,706},{28,31,562},{28,31,481},{27,31,218},{31,27,1067},{27,31,699},{25,31,442},{18,31,1},{30,29,1067}, +{18,31,1},{24,31,3106},{24,31,3106},{24,31,3106},{23,31,2201},{23,31,2668},{21,31,1301},{21,31,1301},{19,31,13},{18,31,2523},{14,31,233},{28,31,481},{28,31,481},{28,31,481},{27,31,218},{31,25,802},{25,31,442},{25,31,442},{18,31,1},{31,27,802},{18,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{23,0,1576}, +{23,0,1576},{23,0,1576},{23,0,1576},{20,31,325},{20,31,325},{20,31,325},{19,31,13},{14,31,233},{14,31,233},{26,31,3642},{25,31,3132},{25,31,2771},{24,31,2070},{25,31,3444},{23,31,1834},{22,31,1205},{20,31,8},{21,31,3219},{16,31,346},{29,31,456},{28,31,370},{28,31,289},{28,31,145},{30,29,683},{28,31,451},{27,31,290},{21,31,1},{29,30,683},{21,31,1},{25,31,2771},{25,31,2771},{25,31,2771}, +{24,31,2070},{24,31,2273},{22,31,1205},{22,31,1205},{20,31,8},{20,31,2121},{16,31,346},{28,31,289},{28,31,289},{28,31,289},{28,31,145},{31,26,512},{27,31,290},{27,31,290},{21,31,1},{29,29,512},{21,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{24,0,1586},{24,0,1586},{24,0,1586},{24,0,1586},{22,31,421}, +{22,31,421},{22,31,421},{20,31,8},{16,31,346},{16,31,346},{26,31,3162},{26,31,2742},{26,31,2486},{25,31,1947},{26,31,2877},{24,31,1641},{23,31,1145},{22,31,52},{22,31,2673},{18,31,458},{29,31,264},{29,31,200},{29,31,164},{28,31,81},{30,30,384},{28,31,243},{28,31,162},{23,31,1},{30,30,384},{23,31,1},{26,31,2486},{26,31,2486},{26,31,2486},{25,31,1947},{24,31,1969},{23,31,1145},{23,31,1145}, +{22,31,52},{20,31,1785},{18,31,458},{29,31,164},{29,31,164},{29,31,164},{28,31,81},{31,27,290},{28,31,162},{28,31,162},{23,31,1},{30,29,290},{23,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{25,0,1586},{25,0,1586},{25,0,1586},{25,0,1586},{23,31,520},{23,31,520},{23,31,520},{22,31,52},{18,31,458}, +{18,31,458},{0,23,2665},{0,18,680},{0,13,50},{0,11,785},{0,15,5885},{0,11,4118},{0,10,1800},{0,7,4202},{0,8,6546},{0,7,4643},{0,23,2665},{0,18,680},{0,13,50},{0,11,785},{9,0,5885},{0,11,4118},{0,10,1800},{0,7,4202},{15,0,5885},{0,7,4202},{0,11,0},{0,11,0},{0,11,0},{0,7,4},{0,5,549},{0,5,289},{0,5,289},{0,3,306},{0,3,630},{0,3,387},{0,11,0}, +{0,11,0},{0,11,0},{0,7,4},{2,2,545},{0,5,289},{0,5,289},{0,3,306},{4,1,545},{0,3,306},{13,1,2665},{0,18,680},{0,13,50},{0,11,785},{13,1,2665},{23,0,2665},{0,11,785},{0,8,2689},{23,0,2665},{0,8,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,25,2665},{0,20,521},{0,14,5}, +{0,12,625},{0,17,6669},{0,13,4529},{0,11,1890},{0,8,4610},{0,9,7494},{0,7,5171},{0,25,2665},{0,20,521},{0,14,5},{0,12,625},{9,2,6669},{0,13,4529},{0,11,1890},{0,8,4610},{17,0,6669},{0,8,4610},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{0,7,841},{0,6,445},{0,6,445},{0,4,464},{0,3,982},{0,3,595},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{4,0,841}, +{0,6,445},{0,6,445},{0,4,464},{7,0,841},{0,4,464},{14,2,2665},{0,20,521},{0,14,5},{0,12,625},{14,2,2665},{25,0,2665},{0,12,625},{0,9,2689},{25,0,2665},{0,9,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,28,2665},{0,22,405},{0,15,10},{0,13,514},{0,19,7541},{0,14,4934},{0,12,2042}, +{0,9,5045},{0,10,8546},{0,8,5682},{0,28,2665},{0,22,405},{0,15,10},{0,13,514},{10,2,7538},{0,14,4934},{0,12,2042},{0,9,5045},{17,1,7538},{0,9,5045},{0,16,0},{0,16,0},{0,16,0},{0,10,4},{0,8,1201},{0,7,637},{0,7,637},{0,4,656},{0,4,1385},{0,4,800},{0,16,0},{0,16,0},{0,16,0},{0,10,4},{5,0,1201},{0,7,637},{0,7,637},{0,4,656},{8,0,1201}, +{0,4,656},{16,1,2665},{0,22,405},{1,15,5},{0,13,514},{16,1,2665},{28,0,2665},{0,13,514},{0,10,2689},{28,0,2665},{0,10,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,30,2669},{0,23,313},{0,16,68},{0,15,410},{0,20,8498},{0,16,5330},{0,13,2210},{0,10,5530},{0,11,9702},{0,9,6270},{0,30,2669}, +{0,23,313},{0,16,68},{0,15,410},{11,2,8493},{0,16,5330},{0,13,2210},{0,10,5530},{17,2,8493},{0,10,5530},{0,19,1},{0,19,1},{0,19,1},{0,11,1},{0,9,1629},{0,8,832},{0,8,832},{0,5,881},{0,5,1874},{0,5,1106},{0,19,1},{0,19,1},{0,19,1},{0,11,1},{5,1,1625},{0,8,832},{0,8,832},{0,5,881},{8,1,1625},{0,5,881},{17,2,2665},{0,23,313},{2,16,8}, +{0,15,410},{17,2,2665},{29,1,2665},{0,15,410},{0,11,2689},{29,1,2665},{0,11,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,31,2777},{0,26,232},{0,17,197},{0,16,305},{0,22,9674},{0,17,5849},{0,14,2450},{0,10,6106},{0,12,11199},{0,10,7006},{1,31,2741},{0,26,232},{1,17,146},{0,16,305},{11,4,9669}, +{0,17,5849},{0,14,2450},{0,10,6106},{19,2,9669},{0,10,6106},{0,22,1},{0,22,1},{0,22,1},{0,13,0},{0,11,2178},{0,10,1125},{0,10,1125},{0,6,1189},{0,6,2520},{0,5,1475},{0,22,1},{0,22,1},{0,22,1},{0,13,0},{6,1,2178},{0,10,1125},{0,10,1125},{0,6,1189},{11,0,2178},{0,6,1189},{20,0,2665},{0,26,232},{3,17,2},{0,16,305},{20,0,2665},{30,2,2665},{0,16,305}, +{0,12,2689},{30,2,2665},{0,12,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,31,2949},{0,28,217},{1,18,261},{0,17,282},{0,25,9670},{0,19,5529},{0,16,1970},{0,12,5738},{0,13,11589},{0,11,6898},{2,31,2789},{0,28,217},{2,18,146},{0,17,282},{15,0,9669},{0,19,5529},{0,16,1970},{0,12,5738},{20,3,9669}, +{0,12,5738},{0,24,64},{0,24,64},{0,24,64},{1,14,64},{0,13,2180},{0,11,949},{0,11,949},{0,7,1018},{0,7,2691},{0,6,1433},{1,23,1},{1,23,1},{1,23,1},{1,14,0},{8,0,2178},{0,11,949},{0,11,949},{0,7,1018},{5,5,2178},{0,7,1018},{21,1,2665},{0,28,153},{4,18,5},{0,17,218},{21,1,2665},{31,3,2665},{0,17,218},{0,13,2689},{31,3,2665},{0,13,2689},{0,0,64}, +{0,0,64},{0,0,64},{0,0,64},{0,3,1},{0,3,1},{0,3,1},{0,2,4},{0,1,18},{0,1,18},{2,31,3285},{1,28,273},{2,19,453},{1,18,346},{0,27,9674},{0,20,5170},{0,17,1546},{0,13,5429},{0,15,11993},{0,12,6819},{3,31,2873},{1,28,209},{3,19,146},{1,18,282},{14,4,9669},{0,20,5170},{0,17,1546},{0,13,5429},{24,2,9669},{0,13,5429},{1,25,128},{1,25,128},{1,25,128}, +{1,15,137},{0,16,2178},{0,13,832},{0,13,832},{0,8,881},{0,8,2882},{0,7,1427},{2,23,4},{2,23,4},{2,23,4},{2,15,0},{9,1,2178},{0,13,832},{0,13,832},{0,8,881},{16,0,2178},{0,8,881},{23,0,2665},{0,29,85},{5,19,5},{0,18,149},{23,0,2665},{30,5,2665},{0,18,149},{0,14,2689},{30,5,2665},{0,14,2689},{1,0,128},{1,0,128},{1,0,128},{1,0,128},{0,5,1}, +{0,5,1},{0,5,1},{0,3,1},{0,2,72},{0,2,72},{3,31,3785},{1,30,405},{2,21,676},{1,19,469},{0,30,9669},{0,22,4878},{0,18,1190},{0,14,5138},{0,16,12390},{0,13,6789},{4,31,2966},{2,29,209},{4,20,149},{2,19,282},{18,0,9669},{0,22,4878},{0,18,1190},{0,14,5138},{30,0,9669},{0,14,5138},{2,26,320},{2,26,320},{2,26,320},{1,17,320},{0,19,2180},{0,15,680},{0,15,680}, +{0,9,740},{0,9,3149},{0,8,1441},{3,24,1},{3,24,1},{3,24,1},{3,16,1},{10,2,2178},{0,15,680},{0,15,680},{0,9,740},{17,1,2178},{0,9,740},{24,1,2665},{0,31,41},{6,20,8},{0,19,98},{24,1,2665},{31,6,2665},{0,19,98},{0,15,2689},{31,6,2665},{0,15,2689},{1,0,320},{1,0,320},{1,0,320},{1,0,320},{0,8,0},{0,8,0},{0,8,0},{0,5,1},{0,4,160}, +{0,4,160},{4,31,4514},{2,31,630},{3,22,1027},{2,20,694},{1,31,9738},{0,23,4646},{0,20,849},{0,15,4826},{0,18,12955},{0,14,6798},{6,31,3101},{3,31,218},{5,21,146},{3,20,299},{18,3,9669},{0,23,4646},{0,20,849},{0,15,4826},{28,3,9669},{0,15,4826},{2,29,545},{2,29,545},{2,29,545},{2,18,546},{0,22,2180},{0,17,505},{0,17,505},{0,11,610},{0,11,3467},{0,10,1513},{4,26,1}, +{4,26,1},{4,26,1},{4,17,0},{13,0,2178},{0,17,505},{0,17,505},{0,11,610},{20,1,2178},{0,11,610},{26,1,2665},{2,31,85},{7,21,2},{0,20,65},{26,1,2665},{31,8,2665},{0,20,65},{0,16,2689},{31,8,2665},{0,16,2689},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,11,0},{0,11,0},{0,11,0},{0,7,4},{0,5,289},{0,5,289},{4,31,5330},{3,31,1018},{3,23,1430}, +{2,21,979},{2,31,9981},{0,26,4406},{0,21,579},{0,16,4610},{0,19,13489},{0,15,6846},{7,31,3233},{4,31,226},{6,22,146},{4,21,282},{20,2,9669},{0,26,4406},{0,21,579},{0,16,4610},{24,7,9669},{0,16,4610},{3,30,865},{3,30,865},{3,30,865},{3,19,866},{0,24,2178},{0,19,389},{0,19,389},{0,12,464},{0,12,3885},{0,11,1603},{5,27,1},{5,27,1},{5,27,1},{5,18,0},{14,1,2178}, +{0,19,389},{0,19,389},{0,12,464},{24,0,2178},{0,12,464},{28,0,2665},{3,31,153},{8,22,5},{0,22,37},{28,0,2665},{30,10,2665},{0,22,37},{0,17,2689},{30,10,2665},{0,17,2689},{3,0,865},{3,0,865},{3,0,865},{3,0,865},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{0,6,445},{0,6,445},{5,31,6270},{3,31,1626},{4,24,1886},{3,22,1299},{2,31,10381},{0,28,4146},{0,22,377}, +{0,17,4373},{0,20,14006},{0,16,6915},{8,31,3434},{6,31,242},{7,23,146},{5,22,282},{21,3,9669},{0,28,4146},{0,22,377},{0,17,4373},{28,6,9669},{0,17,4373},{3,31,1226},{3,31,1226},{3,31,1226},{3,21,1205},{0,27,2180},{0,21,274},{0,21,274},{0,13,353},{0,14,4269},{0,11,1763},{6,27,4},{6,27,4},{6,27,4},{6,19,0},{16,0,2178},{0,21,274},{0,21,274},{0,13,353},{25,1,2178}, +{0,13,353},{29,1,2665},{5,31,232},{9,23,5},{0,23,10},{29,1,2665},{31,11,2665},{0,23,10},{0,18,2689},{31,11,2665},{0,18,2689},{3,0,1201},{3,0,1201},{3,0,1201},{3,0,1201},{0,16,0},{0,16,0},{0,16,0},{0,10,4},{0,7,637},{0,7,637},{6,31,7374},{4,31,2339},{4,25,2441},{3,23,1730},{3,31,10950},{0,29,3909},{0,23,243},{0,18,4154},{0,22,14614},{0,17,7029},{9,31,3638}, +{7,31,320},{8,24,149},{6,23,282},{22,4,9669},{0,29,3909},{0,23,243},{0,18,4154},{29,7,9669},{0,18,4154},{4,31,1714},{4,31,1714},{4,31,1714},{3,22,1666},{0,29,2180},{0,23,194},{0,23,194},{0,14,260},{0,15,4686},{0,13,1937},{7,28,1},{7,28,1},{7,28,1},{7,20,1},{17,1,2178},{0,23,194},{0,23,194},{0,14,260},{26,2,2178},{0,14,260},{31,0,2665},{8,31,313},{10,24,8}, +{0,24,4},{31,0,2665},{30,13,2665},{0,24,4},{0,19,2689},{30,13,2665},{0,19,2689},{3,0,1665},{3,0,1665},{3,0,1665},{3,0,1665},{0,19,1},{0,19,1},{0,19,1},{0,11,1},{0,8,832},{0,8,832},{7,31,8807},{5,31,3388},{5,26,3116},{4,24,2243},{4,31,11766},{0,31,3686},{0,25,138},{0,19,3938},{0,23,15369},{0,18,7206},{11,31,3853},{8,31,457},{9,25,146},{7,24,299},{25,2,9669}, +{0,31,3686},{0,25,138},{0,19,3938},{27,10,9669},{0,19,3938},{5,31,2427},{5,31,2427},{5,31,2427},{4,23,2182},{0,31,2210},{0,25,137},{0,25,137},{0,15,181},{0,16,5157},{0,14,2163},{8,30,1},{8,30,1},{8,30,1},{8,21,0},{17,4,2178},{0,25,137},{0,25,137},{0,15,181},{29,2,2178},{0,15,181},{31,3,2665},{9,31,405},{11,25,2},{1,25,2},{31,3,2665},{30,15,2665},{1,25,2}, +{0,20,2689},{30,15,2665},{0,20,2689},{4,0,2178},{4,0,2178},{4,0,2178},{4,0,2178},{0,22,1},{0,22,1},{0,22,1},{0,13,0},{0,10,1125},{0,10,1125},{7,31,10230},{6,31,4421},{6,27,3739},{4,26,2742},{5,31,12634},{0,31,3719},{0,26,87},{0,20,3771},{0,25,16061},{0,19,7283},{12,31,4050},{10,31,629},{10,26,146},{8,25,282},{26,3,9669},{0,31,3718},{0,26,86},{0,20,3770},{28,11,9669}, +{0,20,3770},{5,31,3050},{5,31,3050},{5,31,3050},{5,24,2690},{1,31,2325},{0,26,86},{0,26,86},{0,16,129},{0,18,5544},{0,15,2318},{9,31,1},{9,31,1},{9,31,1},{9,22,0},{18,5,2178},{0,26,85},{0,26,85},{0,16,128},{30,3,2178},{0,16,128},{31,6,2665},{11,31,521},{12,26,5},{2,26,2},{31,6,2665},{29,17,2665},{2,26,2},{0,21,2689},{29,17,2665},{0,21,2689},{5,0,2689}, +{5,0,2689},{5,0,2689},{5,0,2689},{0,24,1},{0,24,1},{0,24,1},{0,15,5},{0,11,1348},{0,11,1348},{9,31,10738},{7,31,4899},{7,28,3705},{5,27,2742},{6,31,13045},{1,31,4002},{1,27,87},{0,21,3686},{0,27,15601},{0,20,6570},{13,31,4302},{11,31,857},{11,27,146},{9,26,282},{28,2,9669},{2,31,3954},{1,27,86},{0,21,3605},{27,13,9669},{0,21,3605},{6,31,3173},{6,31,3173},{6,31,3173}, +{6,25,2690},{2,31,2427},{1,28,83},{1,28,83},{1,17,129},{0,20,5170},{0,16,1856},{10,31,4},{10,31,4},{10,31,4},{10,23,0},{20,4,2178},{0,28,32},{0,28,32},{0,17,89},{29,5,2178},{0,17,89},{31,8,2665},{13,31,680},{13,27,5},{3,27,2},{31,8,2665},{30,18,2665},{3,27,2},{0,22,2689},{30,18,2665},{0,22,2689},{6,0,2689},{6,0,2689},{6,0,2689},{6,0,2689},{1,25,1}, +{1,25,1},{1,25,1},{1,15,10},{0,13,1217},{0,13,1217},{10,31,11278},{8,31,5402},{7,29,3750},{6,28,2745},{7,31,13510},{3,31,4314},{2,28,77},{1,22,3686},{0,28,15046},{0,21,5958},{14,31,4590},{12,31,1171},{12,28,149},{10,27,282},{29,3,9669},{3,31,4265},{2,28,76},{0,22,3458},{28,14,9669},{0,22,3458},{7,31,3314},{7,31,3314},{7,31,3314},{7,26,2690},{4,31,2532},{2,28,73},{2,28,73}, +{2,18,129},{0,21,4837},{0,17,1490},{11,31,25},{11,31,25},{11,31,25},{11,24,1},{24,0,2178},{0,30,8},{0,30,8},{0,19,49},{30,6,2178},{0,19,49},{31,11,2665},{15,31,832},{14,28,8},{4,28,4},{31,11,2665},{31,19,2665},{4,28,4},{0,23,2689},{31,19,2665},{0,23,2689},{7,0,2689},{7,0,2689},{7,0,2689},{7,0,2689},{2,26,1},{2,26,1},{2,26,1},{2,16,5},{0,14,1037}, +{0,14,1037},{11,31,11942},{10,31,6090},{9,30,3739},{7,29,2751},{9,31,14053},{4,31,4863},{3,29,79},{2,24,3689},{0,30,14558},{0,23,5274},{16,31,4858},{14,31,1556},{13,29,146},{11,28,299},{29,6,9669},{6,31,4594},{3,29,75},{0,24,3265},{31,14,9669},{0,24,3265},{9,31,3505},{9,31,3505},{9,31,3505},{8,27,2693},{5,31,2645},{3,30,72},{3,30,72},{3,19,134},{0,23,4506},{0,19,1109},{12,31,64}, +{12,31,64},{12,31,64},{12,25,0},{24,3,2178},{1,31,10},{1,31,10},{0,20,16},{28,9,2178},{0,20,16},{31,14,2665},{17,31,1053},{15,29,2},{5,29,2},{31,14,2665},{29,22,2665},{5,29,2},{0,24,2689},{29,22,2665},{0,24,2689},{8,0,2689},{8,0,2689},{8,0,2689},{8,0,2689},{3,27,5},{3,27,5},{3,27,5},{3,18,8},{0,16,818},{0,16,818},{12,31,12466},{11,31,6718},{10,31,3739}, +{8,30,2742},{10,31,14554},{6,31,5363},{4,30,87},{3,24,3654},{0,31,14190},{0,24,4785},{17,31,5158},{15,31,1938},{14,30,146},{12,29,282},{30,7,9669},{8,31,4806},{4,30,86},{0,25,3130},{30,16,9669},{0,25,3130},{10,31,3658},{10,31,3658},{10,31,3658},{9,28,2690},{6,31,2795},{4,30,86},{4,30,86},{4,20,129},{0,25,4315},{0,20,809},{14,31,100},{14,31,100},{14,31,100},{13,26,0},{22,9,2178}, +{3,31,34},{3,31,34},{0,21,1},{29,10,2178},{0,21,1},{30,18,2665},{19,31,1241},{16,30,5},{6,30,2},{30,18,2665},{30,23,2665},{6,30,2},{0,25,2689},{30,23,2665},{0,25,2689},{9,0,2689},{9,0,2689},{9,0,2689},{9,0,2689},{4,28,1},{4,28,1},{4,28,1},{4,19,5},{0,18,666},{0,18,666},{14,31,13094},{12,31,7445},{11,31,3830},{9,31,2742},{12,31,14998},{8,31,5926},{5,31,87}, +{4,25,3686},{0,31,14254},{0,25,4323},{18,31,5494},{16,31,2414},{15,31,146},{13,30,282},{29,11,9669},{10,31,5138},{5,31,86},{0,26,3013},{31,17,9669},{0,26,3013},{11,31,3829},{11,31,3829},{11,31,3829},{10,29,2690},{7,31,2981},{5,31,86},{5,31,86},{5,21,129},{0,27,4059},{0,21,597},{15,31,145},{15,31,145},{15,31,145},{14,27,0},{24,8,2178},{5,31,85},{5,31,85},{1,22,1},{30,11,2178}, +{1,22,1},{31,19,2665},{20,31,1378},{17,31,5},{7,31,2},{31,19,2665},{29,25,2665},{7,31,2},{0,26,2689},{29,25,2665},{0,26,2689},{10,0,2689},{10,0,2689},{10,0,2689},{10,0,2689},{5,29,1},{5,29,1},{5,29,1},{5,19,10},{0,20,505},{0,20,505},{15,31,12507},{13,31,7370},{12,31,4001},{11,31,2705},{13,31,14148},{8,31,5491},{6,31,154},{5,26,3063},{1,31,13399},{0,26,3306},{19,31,4949}, +{17,31,2261},{16,31,202},{15,30,185},{29,13,8712},{11,31,4644},{7,31,145},{0,27,2403},{28,20,8712},{0,27,2403},{12,31,4001},{12,31,4001},{12,31,4001},{11,30,2690},{9,31,3204},{6,31,154},{6,31,154},{6,22,129},{0,28,3762},{0,23,425},{16,31,202},{16,31,202},{16,31,202},{15,28,1},{28,4,2178},{7,31,145},{7,31,145},{2,23,1},{29,13,2178},{2,23,1},{30,22,2178},{22,31,1145},{18,31,1}, +{10,31,1},{30,22,2178},{27,27,2178},{10,31,1},{0,27,2178},{27,27,2178},{0,27,2178},{11,0,2689},{11,0,2689},{11,0,2689},{11,0,2689},{6,30,1},{6,30,1},{6,30,1},{6,20,5},{0,22,389},{0,22,389},{16,31,11658},{14,31,7195},{13,31,4225},{12,31,2693},{14,31,13066},{10,31,5014},{8,31,261},{6,27,2390},{3,31,12366},{0,27,2277},{20,31,4338},{18,31,2037},{17,31,289},{16,30,89},{29,15,7578}, +{13,31,4037},{9,31,202},{0,27,1701},{30,20,7578},{0,27,1701},{13,31,4225},{13,31,4225},{13,31,4225},{12,31,2693},{10,31,3429},{8,31,261},{8,31,261},{7,23,134},{0,30,3509},{0,24,306},{17,31,289},{17,31,289},{17,31,289},{16,29,0},{31,2,2178},{9,31,202},{9,31,202},{3,24,0},{27,16,2178},{3,24,0},{31,22,1625},{23,31,850},{20,31,0},{13,31,1},{31,22,1625},{30,26,1625},{13,31,1}, +{0,27,1665},{30,26,1625},{0,27,1665},{12,0,2689},{12,0,2689},{12,0,2689},{12,0,2689},{7,31,5},{7,31,5},{7,31,5},{7,22,8},{0,24,306},{0,24,306},{16,31,11002},{15,31,7081},{14,31,4450},{13,31,2738},{15,31,12205},{11,31,4663},{9,31,411},{7,27,1845},{4,31,11643},{0,28,1578},{21,31,3802},{20,31,1845},{18,31,388},{17,31,25},{30,15,6661},{15,31,3525},{11,31,290},{0,28,1217},{30,21,6661}, +{0,28,1217},{14,31,4450},{14,31,4450},{14,31,4450},{13,31,2738},{11,31,3675},{9,31,411},{9,31,411},{8,24,129},{0,31,3354},{0,25,244},{18,31,388},{18,31,388},{18,31,388},{17,30,0},{26,13,2178},{11,31,290},{11,31,290},{4,25,1},{21,21,2178},{4,25,1},{31,23,1201},{24,31,653},{22,31,4},{15,31,1},{31,23,1201},{30,27,1201},{15,31,1},{0,28,1201},{30,27,1201},{0,28,1201},{13,0,2689}, +{13,0,2689},{13,0,2689},{13,0,2689},{8,31,17},{8,31,17},{8,31,17},{8,23,5},{0,26,218},{0,26,218},{17,31,10434},{16,31,7010},{15,31,4693},{14,31,2833},{16,31,11374},{12,31,4462},{10,31,629},{8,28,1387},{6,31,10895},{0,28,1002},{22,31,3334},{20,31,1701},{19,31,505},{18,31,0},{30,17,5829},{16,31,3145},{12,31,405},{1,28,866},{25,25,5829},{1,28,866},{15,31,4693},{15,31,4693},{15,31,4693}, +{14,31,2833},{12,31,3906},{10,31,629},{10,31,629},{9,25,129},{1,31,3525},{0,27,228},{19,31,505},{19,31,505},{19,31,505},{18,31,0},{28,12,2178},{12,31,405},{12,31,405},{5,26,1},{22,22,2178},{5,26,1},{30,26,841},{25,31,461},{23,31,1},{18,31,0},{30,26,841},{31,27,841},{18,31,0},{0,28,865},{31,27,841},{0,28,865},{14,0,2689},{14,0,2689},{14,0,2689},{14,0,2689},{9,31,50}, +{9,31,50},{9,31,50},{9,23,10},{0,28,137},{0,28,137},{18,31,9934},{17,31,6962},{16,31,4913},{15,31,2978},{17,31,10683},{13,31,4277},{11,31,915},{9,28,994},{8,31,10078},{0,29,630},{23,31,2934},{22,31,1605},{21,31,650},{19,31,25},{31,17,5082},{18,31,2769},{14,31,521},{2,29,546},{25,26,5082},{2,29,546},{16,31,4913},{16,31,4913},{16,31,4913},{15,31,2978},{14,31,4170},{11,31,915},{11,31,915}, +{10,26,129},{3,31,3789},{1,28,226},{21,31,650},{21,31,650},{21,31,650},{19,31,25},{29,13,2178},{14,31,521},{14,31,521},{6,27,1},{28,20,2178},{6,27,1},{31,26,545},{26,31,305},{25,31,4},{20,31,1},{31,26,545},{29,29,545},{20,31,1},{0,29,545},{29,29,545},{0,29,545},{15,0,2689},{15,0,2689},{15,0,2689},{15,0,2689},{11,31,74},{11,31,74},{11,31,74},{10,24,5},{0,29,85}, +{0,29,85},{19,31,9465},{18,31,6955},{17,31,5233},{16,31,3218},{18,31,10003},{14,31,4183},{13,31,1258},{10,29,645},{9,31,9445},{1,30,409},{24,31,2529},{23,31,1525},{22,31,785},{20,31,100},{31,19,4344},{20,31,2345},{16,31,698},{5,29,321},{27,26,4344},{5,29,321},{17,31,5233},{17,31,5233},{17,31,5233},{16,31,3218},{15,31,4491},{13,31,1258},{13,31,1258},{11,27,134},{5,31,4171},{2,29,213},{22,31,785}, +{22,31,785},{22,31,785},{20,31,100},{29,16,2178},{16,31,698},{16,31,698},{7,28,0},{31,20,2178},{7,28,0},{31,27,290},{28,31,162},{26,31,4},{23,31,1},{31,27,290},{30,29,290},{23,31,1},{0,29,320},{30,29,290},{0,29,320},{16,0,2689},{16,0,2689},{16,0,2689},{16,0,2689},{12,31,113},{12,31,113},{12,31,113},{11,26,8},{0,31,45},{0,31,45},{20,31,9219},{19,31,6985},{18,31,5530}, +{17,31,3473},{19,31,9496},{15,31,4186},{14,31,1630},{12,29,426},{11,31,8961},{3,30,277},{25,31,2275},{24,31,1509},{23,31,932},{22,31,208},{30,22,3779},{21,31,2086},{18,31,850},{6,30,129},{27,27,3779},{6,30,129},{18,31,5530},{18,31,5530},{18,31,5530},{17,31,3473},{16,31,4770},{14,31,1630},{14,31,1630},{12,28,129},{8,31,4442},{3,30,213},{23,31,932},{23,31,932},{23,31,932},{22,31,208},{30,17,2178}, +{18,31,850},{18,31,850},{8,29,1},{25,25,2178},{8,29,1},{30,30,128},{29,31,72},{28,31,1},{26,31,0},{30,30,128},{30,30,128},{26,31,0},{0,30,128},{30,30,128},{0,30,128},{17,0,2689},{17,0,2689},{17,0,2689},{17,0,2689},{13,31,170},{13,31,170},{13,31,170},{12,27,5},{2,31,89},{2,31,89},{21,31,8929},{20,31,7062},{19,31,5845},{18,31,3778},{20,31,9188},{17,31,4260},{15,31,2070}, +{13,30,234},{13,31,8680},{4,31,228},{26,31,2089},{25,31,1515},{24,31,1073},{23,31,353},{30,24,3299},{22,31,1913},{20,31,965},{9,30,65},{29,27,3299},{9,30,65},{19,31,5845},{19,31,5845},{19,31,5845},{18,31,3778},{17,31,5124},{15,31,2070},{15,31,2070},{13,29,129},{9,31,4725},{4,31,228},{24,31,1073},{24,31,1073},{24,31,1073},{23,31,353},{31,18,2178},{20,31,965},{20,31,965},{9,30,1},{26,26,2178}, +{9,30,1},{31,30,34},{30,31,18},{29,31,4},{28,31,1},{31,30,34},{31,30,34},{28,31,1},{0,30,64},{31,30,34},{0,30,64},{18,0,2689},{18,0,2689},{18,0,2689},{18,0,2689},{14,31,245},{14,31,245},{14,31,245},{13,27,10},{4,31,164},{4,31,164},{22,31,8707},{21,31,7170},{21,31,6209},{19,31,4133},{21,31,8853},{18,31,4387},{17,31,2548},{14,31,170},{14,31,8388},{6,31,244},{27,31,1971}, +{26,31,1557},{25,31,1250},{24,31,565},{31,24,2904},{23,31,1826},{22,31,1145},{10,31,1},{24,31,2904},{10,31,1},{21,31,6209},{21,31,6209},{21,31,6209},{19,31,4133},{19,31,5460},{17,31,2548},{17,31,2548},{14,30,129},{11,31,5085},{6,31,244},{25,31,1250},{25,31,1250},{25,31,1250},{24,31,565},{30,22,2178},{22,31,1145},{22,31,1145},{10,31,1},{27,27,2178},{10,31,1},{31,31,0},{31,31,0},{31,31,0}, +{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{19,0,2689},{19,0,2689},{19,0,2689},{19,0,2689},{15,31,338},{15,31,338},{15,31,338},{14,28,5},{6,31,244},{6,31,244},{23,31,7705},{22,31,6418},{21,31,5633},{20,31,3845},{22,31,7654},{19,31,3874},{18,31,2310},{15,31,53},{15,31,7258},{8,31,317},{27,31,1458},{27,31,1186},{26,31,932},{25,31,425},{31,25,2166}, +{25,31,1398},{23,31,850},{13,31,1},{28,29,2166},{13,31,1},{21,31,5633},{21,31,5633},{21,31,5633},{20,31,3845},{19,31,4830},{18,31,2310},{18,31,2310},{15,31,53},{13,31,4506},{8,31,317},{26,31,932},{26,31,932},{26,31,932},{25,31,425},{31,22,1625},{23,31,850},{23,31,850},{13,31,1},{30,26,1625},{13,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0}, +{0,31,0},{31,31,0},{0,31,0},{20,0,2689},{20,0,2689},{20,0,2689},{20,0,2689},{16,31,449},{16,31,449},{16,31,449},{15,30,8},{8,31,317},{8,31,317},{24,31,6881},{23,31,5814},{22,31,5138},{21,31,3650},{23,31,6713},{20,31,3400},{19,31,2142},{16,31,5},{17,31,6397},{9,31,425},{28,31,1075},{27,31,866},{27,31,697},{26,31,320},{31,26,1601},{26,31,1041},{24,31,653},{15,31,1},{29,29,1601}, +{15,31,1},{22,31,5138},{22,31,5138},{22,31,5138},{21,31,3650},{21,31,4313},{19,31,2142},{19,31,2142},{16,31,5},{14,31,3981},{9,31,425},{27,31,697},{27,31,697},{27,31,697},{26,31,320},{31,23,1201},{24,31,653},{24,31,653},{15,31,1},{30,27,1201},{15,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{21,0,2689}, +{21,0,2689},{21,0,2689},{21,0,2689},{18,31,549},{18,31,549},{18,31,549},{16,31,5},{9,31,425},{9,31,425},{24,31,6097},{24,31,5285},{23,31,4693},{22,31,3473},{23,31,5833},{21,31,3067},{20,31,1988},{17,31,10},{18,31,5571},{11,31,541},{28,31,739},{28,31,595},{27,31,505},{27,31,233},{30,28,1121},{26,31,737},{25,31,461},{18,31,0},{28,30,1121},{18,31,0},{23,31,4693},{23,31,4693},{23,31,4693}, +{22,31,3473},{22,31,3845},{20,31,1988},{20,31,1988},{17,31,10},{15,31,3542},{11,31,541},{27,31,505},{27,31,505},{27,31,505},{27,31,233},{30,26,841},{25,31,461},{25,31,461},{18,31,0},{31,27,841},{18,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{22,0,2689},{22,0,2689},{22,0,2689},{22,0,2689},{19,31,666}, +{19,31,666},{19,31,666},{17,31,10},{11,31,541},{11,31,541},{25,31,5427},{24,31,4757},{24,31,4273},{23,31,3314},{24,31,5002},{22,31,2788},{21,31,1898},{18,31,65},{20,31,4714},{13,31,698},{29,31,489},{28,31,387},{28,31,306},{28,31,162},{30,29,726},{27,31,482},{26,31,305},{20,31,1},{29,30,726},{20,31,1},{24,31,4273},{24,31,4273},{24,31,4273},{23,31,3314},{22,31,3429},{21,31,1898},{21,31,1898}, +{18,31,65},{17,31,3213},{13,31,698},{28,31,306},{28,31,306},{28,31,306},{28,31,162},{31,26,545},{26,31,305},{26,31,305},{20,31,1},{29,29,545},{20,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{23,0,2689},{23,0,2689},{23,0,2689},{23,0,2689},{20,31,832},{20,31,832},{20,31,832},{18,31,65},{13,31,698}, +{13,31,698},{4,31,33740},{0,31,5184},{0,22,420},{0,21,4221},{3,31,45594},{0,29,24105},{0,21,8317},{0,18,24790},{0,21,63990},{0,16,38959},{2,31,9704},{0,30,2866},{0,21,389},{0,19,3229},{14,2,18065},{0,20,13257},{0,17,6153},{0,12,13481},{25,0,18065},{0,12,13481},{0,15,1},{0,15,1},{0,15,1},{0,9,1},{0,8,1105},{0,7,585},{0,7,585},{0,4,596},{0,4,1273},{0,4,740},{0,15,1}, +{0,15,1},{0,15,1},{0,9,1},{4,1,1105},{0,7,585},{0,7,585},{0,4,596},{8,0,1105},{0,4,596},{20,4,9248},{0,30,2866},{0,21,389},{0,19,3229},{20,4,9248},{29,5,9248},{0,19,3229},{0,14,9248},{29,5,9248},{0,14,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,31,38380},{1,31,6614},{0,23,245}, +{0,22,3864},{4,31,50747},{0,31,24961},{0,22,8353},{0,19,25735},{0,22,65535},{0,17,41319},{2,31,10152},{0,31,2624},{0,23,229},{0,20,2980},{16,0,19334},{0,20,13769},{0,18,6243},{0,13,14116},{25,1,19334},{0,13,14116},{0,18,0},{0,18,0},{0,18,0},{0,11,1},{0,9,1513},{0,8,772},{0,8,772},{0,5,821},{0,5,1750},{0,4,1028},{0,18,0},{0,18,0},{0,18,0},{0,11,1},{5,1,1513}, +{0,8,772},{0,8,772},{0,5,821},{9,0,1513},{0,5,821},{24,0,9248},{0,31,2624},{0,23,229},{0,20,2980},{24,0,9248},{30,6,9248},{0,20,2980},{0,15,9248},{30,6,9248},{0,15,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,31,43788},{1,31,8598},{0,24,126},{0,23,3525},{4,31,56155},{0,31,26241},{0,23,8425}, +{0,20,26793},{0,23,65535},{0,18,43819},{3,31,10706},{0,31,2624},{0,24,122},{0,21,2701},{17,0,20689},{0,22,14385},{0,19,6369},{0,13,14756},{25,2,20689},{0,13,14756},{0,21,1},{0,21,1},{0,21,1},{0,12,4},{0,10,1989},{0,9,1018},{0,9,1018},{0,6,1096},{0,5,2294},{0,5,1334},{0,21,1},{0,21,1},{0,21,1},{0,12,4},{5,2,1985},{0,9,1018},{0,9,1018},{0,6,1096},{9,1,1985}, +{0,6,1096},{25,1,9248},{0,31,2624},{0,24,122},{0,21,2701},{25,1,9248},{31,7,9248},{0,21,2701},{0,16,9250},{31,7,9248},{0,16,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{5,31,49566},{1,31,11350},{0,25,41},{0,24,3109},{4,31,62331},{0,31,28289},{0,24,8585},{0,21,27848},{0,23,65535},{0,19,46459},{4,31,11395}, +{0,31,2880},{0,25,37},{0,22,2440},{17,2,22129},{0,23,15030},{0,20,6509},{0,14,15441},{27,2,22129},{0,14,15441},{0,23,1},{0,23,1},{0,23,1},{0,14,0},{0,12,2525},{0,10,1300},{0,10,1300},{0,6,1384},{0,6,2905},{0,6,1708},{0,23,1},{0,23,1},{0,23,1},{0,14,0},{7,0,2521},{0,10,1300},{0,10,1300},{0,6,1384},{10,1,2521},{0,6,1384},{26,2,9248},{1,31,2866},{0,25,37}, +{0,22,2440},{26,2,9248},{27,11,9248},{0,22,2440},{0,17,9250},{27,11,9248},{0,17,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{5,31,56892},{2,31,15166},{0,26,20},{0,25,2804},{5,31,65535},{0,31,31511},{0,25,8733},{0,22,29095},{0,26,65535},{0,20,49444},{4,31,12385},{1,31,3380},{0,26,4},{0,23,2173},{17,4,23851}, +{0,23,15948},{0,21,6729},{0,15,16274},{29,2,23851},{0,15,16274},{0,26,0},{0,26,0},{0,26,0},{0,16,4},{0,13,3200},{0,11,1665},{0,11,1665},{0,7,1754},{0,7,3691},{0,6,2185},{0,26,0},{0,26,0},{0,26,0},{0,16,4},{2,10,3200},{0,11,1665},{0,11,1665},{0,7,1754},{13,0,3200},{0,7,1754},{24,8,9248},{3,31,3204},{0,26,4},{0,23,2173},{24,8,9248},{30,11,9248},{0,23,2173}, +{0,18,9248},{30,11,9248},{0,18,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,31,63870},{2,31,19230},{0,27,45},{0,27,2520},{5,31,65535},{1,31,35016},{0,26,8925},{0,23,30250},{0,28,65535},{0,21,52374},{5,31,13379},{2,31,4026},{0,27,29},{0,24,1901},{18,4,25472},{0,26,16706},{0,22,6963},{0,16,17124},{29,3,25472}, +{0,16,17124},{0,29,1},{0,29,1},{0,29,1},{0,17,1},{0,14,3874},{0,13,2084},{0,13,2084},{0,8,2165},{0,8,4466},{0,7,2627},{0,29,1},{0,29,1},{0,29,1},{0,17,1},{8,1,3872},{0,13,2084},{0,13,2084},{0,8,2165},{6,5,3872},{0,8,2165},{28,4,9248},{5,31,3589},{1,27,4},{0,24,1901},{28,4,9248},{29,13,9248},{0,24,1901},{0,19,9248},{29,13,9248},{0,19,9248},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,31,65535},{2,31,24002},{0,28,109},{0,27,2268},{6,31,65535},{1,31,38780},{0,27,8825},{0,24,30825},{0,28,65535},{0,22,54996},{6,31,14345},{2,31,4766},{1,28,62},{0,26,1697},{18,6,26744},{0,28,17104},{0,23,6957},{0,17,17625},{31,3,26744},{0,17,17625},{0,31,5},{0,31,5},{0,31,5}, +{0,19,5},{0,16,4418},{0,14,2306},{0,14,2306},{0,9,2420},{0,8,5122},{0,8,2997},{0,31,5},{0,31,5},{0,31,5},{0,19,5},{9,1,4418},{0,14,2306},{0,14,2306},{0,9,2420},{16,0,4418},{0,9,2420},{29,5,9248},{8,31,3904},{2,28,1},{0,26,1693},{29,5,9248},{30,14,9248},{0,26,1693},{0,20,9250},{30,14,9248},{0,20,9250},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,1}, +{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{7,31,65535},{3,31,29032},{0,29,330},{0,28,2105},{6,31,65535},{2,31,42151},{0,28,7781},{0,25,30108},{0,29,65535},{0,22,56388},{7,31,14819},{3,31,5416},{2,29,62},{0,27,1580},{23,0,26744},{0,29,16547},{0,24,6221},{0,18,17124},{30,5,26744},{0,18,17124},{1,31,84},{1,31,84},{1,31,84},{1,20,72},{0,19,4420},{0,16,2005},{0,16,2005}, +{0,10,2165},{0,9,5389},{0,9,2925},{1,31,20},{1,31,20},{1,31,20},{1,20,8},{10,2,4418},{0,16,2005},{0,16,2005},{0,10,2165},{17,1,4418},{0,10,2165},{30,6,9248},{8,31,4160},{3,29,1},{0,27,1480},{30,6,9248},{31,15,9248},{0,27,1480},{0,21,9250},{31,15,9248},{0,21,9250},{1,0,68},{1,0,68},{1,0,68},{1,0,68},{0,3,1},{0,3,1},{0,3,1},{0,2,0},{0,1,34}, +{0,1,34},{7,31,65535},{3,31,35719},{1,30,717},{0,30,2062},{7,31,65535},{2,31,46660},{0,29,6696},{0,26,29322},{0,31,65535},{0,23,58077},{9,31,15473},{5,31,6173},{3,30,65},{1,28,1601},{23,3,26744},{0,31,15992},{0,26,5346},{0,19,16582},{28,8,26744},{0,19,16582},{2,31,329},{2,31,329},{2,31,329},{1,21,189},{0,22,4420},{0,18,1737},{0,18,1737},{0,11,1898},{0,11,5707},{0,10,2885},{3,31,34}, +{3,31,34},{3,31,34},{2,21,10},{13,0,4418},{0,18,1737},{0,18,1737},{0,11,1898},{20,1,4418},{0,11,1898},{28,12,9248},{10,31,4570},{4,30,4},{0,28,1285},{28,12,9248},{22,22,9248},{0,28,1285},{0,22,9248},{22,22,9248},{0,22,9248},{1,0,185},{1,0,185},{1,0,185},{1,0,185},{0,6,1},{0,6,1},{0,6,1},{0,4,1},{0,3,97},{0,3,97},{7,31,65535},{4,31,40786},{1,31,1122}, +{0,30,2138},{7,31,65535},{2,31,49800},{0,30,5634},{0,27,27967},{0,31,65535},{0,24,58770},{10,31,15531},{6,31,6593},{4,31,61},{2,29,1533},{25,2,26259},{0,31,15284},{0,27,4514},{0,20,15812},{27,10,26259},{0,20,15812},{2,31,633},{2,31,633},{2,31,633},{2,22,381},{0,24,4418},{0,20,1480},{0,20,1480},{0,12,1640},{0,12,6125},{0,11,2891},{4,31,61},{4,31,61},{4,31,61},{3,22,10},{14,1,4418}, +{0,20,1480},{0,20,1480},{0,12,1640},{24,0,4418},{0,12,1640},{30,11,8978},{11,31,4744},{5,31,0},{0,29,1040},{30,11,8978},{31,18,8978},{0,29,1040},{0,23,8980},{31,18,8978},{0,23,8980},{2,0,377},{2,0,377},{2,0,377},{2,0,377},{0,9,0},{0,9,0},{0,9,0},{0,5,4},{0,4,193},{0,4,193},{8,31,65535},{4,31,40898},{1,31,1890},{0,31,2125},{7,31,65535},{3,31,47871},{0,30,4194}, +{0,27,24703},{0,31,65535},{0,24,56130},{11,31,14325},{8,31,6051},{5,31,100},{3,29,1218},{22,9,24371},{0,31,13716},{0,28,3402},{0,21,13989},{29,10,24371},{0,21,13989},{3,31,1058},{3,31,1058},{3,31,1058},{2,24,617},{0,27,4420},{0,22,1280},{0,22,1280},{0,13,1445},{0,14,6509},{0,12,2945},{5,31,100},{5,31,100},{5,31,100},{4,23,5},{16,0,4418},{0,22,1280},{0,22,1280},{0,13,1445},{25,1,4418}, +{0,13,1445},{29,14,7938},{13,31,4225},{7,31,4},{0,29,656},{29,14,7938},{29,20,7938},{0,29,656},{0,23,7956},{29,20,7938},{0,23,7956},{2,0,617},{2,0,617},{2,0,617},{2,0,617},{0,11,4},{0,11,4},{0,11,4},{0,7,0},{0,5,325},{0,5,325},{8,31,65535},{4,31,41266},{1,31,2914},{1,31,2170},{7,31,65535},{3,31,46175},{0,30,3010},{0,27,21695},{0,31,65535},{0,25,53636},{12,31,13140}, +{8,31,5571},{6,31,157},{4,29,932},{24,7,22568},{0,31,12404},{0,28,2474},{0,21,12245},{29,11,22568},{0,21,12245},{4,31,1630},{4,31,1630},{4,31,1630},{3,25,937},{0,29,4420},{0,23,1090},{0,23,1090},{0,14,1268},{0,15,6926},{0,13,3029},{6,31,157},{6,31,157},{6,31,157},{5,24,8},{17,1,4418},{0,23,1090},{0,23,1090},{0,14,1268},{26,2,4418},{0,14,1268},{31,12,6962},{14,31,3709},{8,31,1}, +{0,30,353},{31,12,6962},{27,22,6962},{0,30,353},{0,24,6970},{27,22,6962},{0,24,6970},{3,0,937},{3,0,937},{3,0,937},{3,0,937},{0,14,0},{0,14,0},{0,14,0},{0,8,4},{0,6,493},{0,6,493},{9,31,65535},{5,31,41956},{2,31,4257},{1,31,2512},{7,31,65535},{3,31,44573},{0,30,1984},{0,28,18569},{0,31,65535},{0,25,51026},{13,31,11930},{10,31,5125},{7,31,250},{5,29,701},{27,4,20642}, +{1,31,11209},{0,29,1634},{0,22,10422},{31,11,20642},{0,22,10422},{4,31,2350},{4,31,2350},{4,31,2350},{3,27,1361},{0,31,4450},{0,25,949},{0,25,949},{0,16,1096},{0,16,7397},{0,14,3171},{7,31,250},{7,31,250},{7,31,250},{6,25,10},{17,4,4418},{0,25,949},{0,25,949},{0,16,1096},{29,2,4418},{0,16,1096},{30,15,5941},{15,31,3176},{10,31,0},{0,30,128},{30,15,5941},{30,21,5941},{0,30,128}, +{0,24,5953},{30,21,5941},{0,24,5953},{3,0,1360},{3,0,1360},{3,0,1360},{3,0,1360},{0,17,0},{0,17,0},{0,17,0},{0,10,1},{0,8,697},{0,8,697},{9,31,65535},{5,31,42660},{2,31,5617},{1,31,3088},{8,31,65535},{3,31,43421},{0,31,1250},{0,28,15865},{0,31,65535},{0,25,48978},{13,31,10922},{11,31,4753},{8,31,360},{6,30,509},{28,4,19021},{2,31,10246},{0,30,1088},{0,23,8945},{29,13,19021}, +{0,23,8945},{5,31,3131},{5,31,3131},{5,31,3131},{4,28,1822},{1,31,4580},{0,28,776},{0,28,776},{0,17,925},{0,18,7893},{0,15,3333},{8,31,360},{8,31,360},{8,31,360},{7,26,10},{18,5,4418},{0,28,776},{0,28,776},{0,17,925},{30,3,4418},{0,17,925},{31,15,5101},{17,31,2777},{11,31,9},{0,31,25},{31,15,5101},{30,22,5101},{0,31,25},{0,25,5105},{30,22,5101},{0,25,5105},{4,0,1818}, +{4,0,1818},{4,0,1818},{4,0,1818},{0,20,1},{0,20,1},{0,20,1},{0,12,1},{0,9,925},{0,9,925},{9,31,65535},{5,31,43620},{2,31,7233},{1,31,3920},{8,31,65535},{3,31,42525},{0,31,738},{0,28,13417},{0,31,65535},{0,25,47186},{14,31,9978},{11,31,4449},{10,31,452},{7,30,354},{31,1,17485},{3,31,9369},{0,30,704},{0,24,7570},{31,13,17485},{0,24,7570},{6,31,4058},{6,31,4058},{6,31,4058}, +{4,29,2315},{2,31,4874},{0,29,610},{0,29,610},{0,18,772},{0,20,8427},{0,16,3497},{10,31,452},{10,31,452},{10,31,452},{8,27,5},{20,4,4418},{0,29,610},{0,29,610},{0,18,772},{29,5,4418},{0,18,772},{31,16,4325},{18,31,2357},{13,31,0},{1,31,0},{31,16,4325},{31,22,4325},{1,31,0},{0,25,4337},{31,22,4325},{0,25,4337},{4,0,2314},{4,0,2314},{4,0,2314},{4,0,2314},{0,22,1}, +{0,22,1},{0,22,1},{0,13,4},{0,10,1189},{0,10,1189},{9,31,65535},{5,31,44836},{2,31,9105},{2,31,4905},{8,31,65535},{3,31,41885},{0,31,482},{0,28,11225},{0,31,65535},{0,26,45590},{15,31,9102},{13,31,4161},{11,31,557},{9,30,212},{29,6,16034},{5,31,8602},{0,31,482},{0,24,6242},{31,14,16034},{0,24,6242},{6,31,5066},{6,31,5066},{6,31,5066},{5,30,2907},{2,31,5322},{0,31,482},{0,31,482}, +{0,19,637},{0,20,8939},{0,17,3725},{11,31,557},{11,31,557},{11,31,557},{9,28,8},{24,0,4418},{0,31,482},{0,31,482},{0,19,637},{30,6,4418},{0,19,637},{30,19,3613},{20,31,1940},{15,31,4},{4,31,1},{30,19,3613},{31,23,3613},{4,31,1},{0,26,3617},{31,23,3613},{0,26,3617},{5,0,2906},{5,0,2906},{5,0,2906},{5,0,2906},{0,25,1},{0,25,1},{0,25,1},{0,15,0},{0,11,1489}, +{0,11,1489},{9,31,65535},{5,31,46510},{3,31,11362},{2,31,6237},{9,31,65535},{3,31,41471},{0,31,500},{0,29,8976},{0,31,65535},{0,26,43934},{16,31,8139},{14,31,3853},{12,31,680},{10,30,109},{26,13,14504},{8,31,7667},{0,31,500},{0,25,4979},{21,21,14504},{0,25,4979},{7,31,6337},{7,31,6337},{7,31,6337},{5,31,3642},{3,31,5962},{0,31,500},{0,31,500},{0,20,520},{0,22,9629},{0,18,4035},{12,31,680}, +{12,31,680},{12,31,680},{10,29,10},{24,3,4418},{0,31,500},{0,31,500},{0,20,520},{28,9,4418},{0,20,520},{31,19,2888},{20,31,1517},{16,31,1},{7,31,1},{31,19,2888},{27,26,2888},{7,31,1},{0,26,2906},{27,26,2888},{0,26,2906},{5,0,3617},{5,0,3617},{5,0,3617},{5,0,3617},{0,28,1},{0,28,1},{0,28,1},{0,17,4},{0,11,1930},{0,11,1930},{10,31,65535},{6,31,48082},{3,31,13570}, +{2,31,7693},{9,31,65535},{3,31,41375},{0,31,788},{0,29,7120},{0,31,65535},{0,26,42734},{17,31,7409},{15,31,3625},{13,31,821},{11,31,45},{28,11,13235},{8,31,6899},{2,31,628},{0,25,3987},{31,16,13235},{0,25,3987},{7,31,7681},{7,31,7681},{7,31,7681},{6,31,4437},{4,31,6659},{1,31,738},{1,31,738},{0,21,421},{0,23,10286},{0,20,4305},{13,31,821},{13,31,821},{13,31,821},{11,30,10},{22,9,4418}, +{2,31,628},{2,31,628},{0,21,421},{29,10,4418},{0,21,421},{31,20,2312},{21,31,1217},{18,31,1},{9,31,0},{31,20,2312},{30,25,2312},{9,31,0},{0,27,2314},{30,25,2312},{0,27,2314},{6,0,4337},{6,0,4337},{6,0,4337},{6,0,4337},{0,30,1},{0,30,1},{0,30,1},{0,18,1},{0,13,2329},{0,13,2329},{10,31,65535},{6,31,49890},{3,31,16034},{2,31,9405},{9,31,65535},{4,31,41526},{0,31,1332}, +{0,29,5520},{0,31,65535},{0,26,41790},{18,31,6747},{16,31,3459},{14,31,980},{12,31,5},{31,8,12051},{10,31,6275},{4,31,801},{0,26,3066},{28,19,12051},{0,26,3066},{8,31,9062},{8,31,9062},{8,31,9062},{7,31,5410},{4,31,7555},{1,31,1154},{1,31,1154},{0,23,325},{0,23,11118},{0,20,4625},{14,31,980},{14,31,980},{14,31,980},{12,31,5},{24,8,4418},{4,31,801},{4,31,801},{0,23,325},{30,11,4418}, +{0,23,325},{30,23,1800},{23,31,949},{19,31,4},{12,31,1},{30,23,1800},{28,27,1800},{12,31,1},{0,27,1818},{28,27,1800},{0,27,1818},{6,0,5105},{6,0,5105},{6,0,5105},{6,0,5105},{0,31,36},{0,31,36},{0,31,36},{0,20,4},{0,15,2741},{0,15,2741},{10,31,65535},{6,31,51954},{3,31,18754},{3,31,11330},{9,31,65535},{4,31,41798},{1,31,2082},{0,29,4176},{0,31,65535},{0,27,41092},{19,31,6153}, +{17,31,3297},{16,31,1154},{13,31,20},{29,13,10952},{11,31,5708},{6,31,965},{0,27,2291},{28,20,10952},{0,27,2291},{9,31,10545},{9,31,10545},{9,31,10545},{7,31,6482},{5,31,8549},{2,31,1716},{2,31,1716},{0,24,221},{0,26,11876},{0,22,4989},{16,31,1154},{16,31,1154},{16,31,1154},{13,31,20},{28,4,4418},{6,31,965},{6,31,965},{0,24,221},{29,13,4418},{0,24,221},{29,26,1352},{23,31,725},{21,31,0}, +{14,31,1},{29,26,1352},{31,26,1352},{14,31,1},{0,28,1360},{31,26,1352},{0,28,1360},{7,0,5953},{7,0,5953},{7,0,5953},{7,0,5953},{1,31,145},{1,31,145},{1,31,145},{0,21,1},{0,16,3130},{0,16,3130},{10,31,65535},{6,31,54582},{4,31,21886},{3,31,13652},{9,31,65535},{4,31,42410},{1,31,3144},{0,30,2841},{0,31,65535},{0,27,40390},{19,31,5649},{18,31,3157},{17,31,1325},{15,31,74},{29,15,9818}, +{13,31,5241},{8,31,1108},{0,27,1589},{30,20,9818},{0,27,1589},{10,31,12376},{10,31,12376},{10,31,12376},{8,31,7844},{6,31,9861},{3,31,2576},{3,31,2576},{0,25,136},{0,28,12696},{0,23,5429},{17,31,1325},{17,31,1325},{17,31,1325},{15,31,74},{31,2,4418},{8,31,1108},{8,31,1108},{0,25,136},{27,16,4418},{0,25,136},{31,24,925},{25,31,505},{23,31,1},{17,31,1},{31,24,925},{31,27,925},{17,31,1}, +{0,28,937},{31,27,925},{0,28,937},{7,0,6970},{7,0,6970},{7,0,6970},{7,0,6970},{1,31,388},{1,31,388},{1,31,388},{0,23,0},{0,17,3665},{0,17,3665},{10,31,65535},{7,31,57052},{4,31,24910},{3,31,15988},{9,31,65535},{4,31,43226},{1,31,4360},{0,30,1833},{0,31,65535},{0,27,40038},{21,31,5202},{19,31,3073},{18,31,1508},{16,31,180},{30,15,8901},{14,31,4814},{10,31,1300},{0,28,1021},{30,21,8901}, +{0,28,1021},{10,31,14136},{10,31,14136},{10,31,14136},{8,31,9252},{7,31,11195},{3,31,3536},{3,31,3536},{0,26,85},{0,29,13491},{0,23,5925},{18,31,1508},{18,31,1508},{18,31,1508},{16,31,180},{26,13,4418},{10,31,1300},{10,31,1300},{0,26,85},{21,21,4418},{0,26,85},{30,27,613},{26,31,337},{24,31,1},{20,31,1},{30,27,613},{30,28,613},{20,31,1},{0,29,617},{30,28,613},{0,29,617},{8,0,7956}, +{8,0,7956},{8,0,7956},{8,0,7956},{2,31,697},{2,31,697},{2,31,697},{0,25,4},{0,18,4181},{0,18,4181},{11,31,65535},{7,31,59708},{4,31,28190},{3,31,18580},{10,31,65535},{5,31,44295},{1,31,5832},{0,30,1081},{0,31,65535},{0,27,39942},{22,31,4818},{20,31,3017},{19,31,1709},{17,31,325},{30,17,8069},{15,31,4473},{11,31,1514},{0,29,602},{25,25,8069},{0,29,602},{11,31,15965},{11,31,15965},{11,31,15965}, +{9,31,10757},{7,31,12667},{4,31,4662},{4,31,4662},{0,27,52},{0,30,14340},{0,25,6449},{19,31,1709},{19,31,1709},{19,31,1709},{17,31,325},{28,12,4418},{11,31,1514},{11,31,1514},{0,27,52},{22,22,4418},{0,27,52},{31,27,365},{27,31,205},{26,31,1},{22,31,1},{31,27,365},{30,29,365},{22,31,1},{0,29,377},{30,29,365},{0,29,377},{8,0,8980},{8,0,8980},{8,0,8980},{8,0,8980},{2,31,1097}, +{2,31,1097},{2,31,1097},{0,26,1},{0,20,4682},{0,20,4682},{11,31,65535},{8,31,58981},{5,31,29551},{4,31,19751},{10,31,65535},{5,31,43215},{2,31,6910},{1,30,686},{0,31,65535},{0,28,34909},{23,31,4502},{21,31,3011},{20,31,1973},{18,31,520},{31,17,7322},{17,31,4242},{13,31,1769},{0,29,314},{25,26,7322},{0,29,314},{12,31,16739},{12,31,16739},{12,31,16739},{10,31,11492},{8,31,13636},{5,31,5510},{5,31,5510}, +{1,28,54},{0,31,14139},{0,26,6041},{20,31,1973},{20,31,1973},{20,31,1973},{18,31,520},{29,13,4418},{13,31,1769},{13,31,1769},{0,28,29},{28,20,4418},{0,28,29},{31,28,181},{28,31,97},{27,31,4},{25,31,0},{31,28,181},{31,29,181},{25,31,0},{0,30,185},{31,29,181},{0,30,185},{9,0,9248},{9,0,9248},{9,0,9248},{9,0,9248},{3,31,1348},{3,31,1348},{3,31,1348},{1,27,5},{0,21,4520}, +{0,21,4520},{12,31,65535},{9,31,57270},{6,31,30345},{5,31,20521},{11,31,65535},{6,31,41449},{3,31,8015},{2,31,301},{0,31,65535},{0,28,28330},{24,31,4181},{22,31,3053},{21,31,2248},{20,31,772},{31,19,6584},{20,31,3941},{15,31,2041},{0,30,77},{27,26,6584},{0,30,77},{13,31,17289},{13,31,17289},{13,31,17289},{11,31,12050},{10,31,14315},{7,31,6389},{7,31,6389},{2,29,53},{0,31,13860},{0,28,5286},{21,31,2248}, +{21,31,2248},{21,31,2248},{20,31,772},{29,16,4418},{15,31,2041},{15,31,2041},{0,30,13},{31,20,4418},{0,30,13},{30,31,50},{30,31,34},{29,31,0},{28,31,1},{30,31,50},{31,30,50},{28,31,1},{0,30,68},{31,30,50},{0,30,68},{10,0,9250},{10,0,9250},{10,0,9250},{10,0,9250},{4,31,1549},{4,31,1549},{4,31,1549},{2,28,2},{0,23,4114},{0,23,4114},{13,31,65535},{9,31,55894},{7,31,31068}, +{6,31,21256},{12,31,65535},{8,31,39740},{4,31,9073},{3,31,90},{0,31,65535},{0,29,23356},{24,31,3973},{23,31,3125},{23,31,2500},{21,31,1037},{30,22,6019},{20,31,3701},{17,31,2340},{0,31,4},{27,27,6019},{0,31,4},{14,31,17796},{14,31,17796},{14,31,17796},{12,31,12625},{11,31,14957},{8,31,7139},{8,31,7139},{3,30,53},{0,31,14020},{0,29,4652},{23,31,2500},{23,31,2500},{23,31,2500},{21,31,1037},{30,17,4418}, +{17,31,2340},{17,31,2340},{0,31,4},{25,25,4418},{0,31,4},{31,31,4},{31,31,4},{31,31,4},{30,31,1},{31,31,4},{31,31,4},{30,31,1},{0,31,4},{31,31,4},{0,31,4},{11,0,9250},{11,0,9250},{11,0,9250},{11,0,9250},{6,31,1765},{6,31,1765},{6,31,1765},{3,29,2},{0,25,3877},{0,25,3877},{13,31,65535},{10,31,53236},{8,31,30487},{7,31,21105},{13,31,65535},{8,31,37332},{5,31,9177}, +{4,31,36},{1,31,65535},{0,29,18680},{25,31,3443},{24,31,2741},{23,31,2248},{22,31,980},{29,25,5163},{21,31,3218},{20,31,2117},{3,31,1},{30,26,5163},{3,31,1},{15,31,17289},{15,31,17289},{15,31,17289},{13,31,12512},{12,31,14328},{9,31,7149},{9,31,7149},{4,31,20},{0,31,13376},{0,29,3944},{23,31,2248},{23,31,2248},{23,31,2248},{22,31,980},{31,17,3872},{20,31,2117},{20,31,2117},{3,31,1},{25,26,3872}, +{3,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{12,0,9248},{12,0,9248},{12,0,9248},{12,0,9248},{7,31,1972},{7,31,1972},{7,31,1972},{4,30,5},{0,27,3545},{0,27,3545},{14,31,65535},{11,31,50266},{9,31,29322},{8,31,20567},{13,31,65535},{9,31,35025},{6,31,8985},{5,31,21},{2,31,65535},{0,29,14712},{26,31,2873}, +{25,31,2283},{24,31,1825},{22,31,820},{30,24,4267},{22,31,2657},{20,31,1685},{5,31,1},{29,27,4267},{5,31,1},{16,31,16427},{16,31,16427},{16,31,16427},{14,31,12185},{13,31,13442},{10,31,6915},{10,31,6915},{5,31,5},{1,31,12539},{0,30,3314},{24,31,1825},{24,31,1825},{24,31,1825},{22,31,820},{28,23,3200},{20,31,1685},{20,31,1685},{5,31,1},{28,25,3200},{5,31,1},{31,31,0},{31,31,0},{31,31,0}, +{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{13,0,9248},{13,0,9248},{13,0,9248},{13,0,9248},{8,31,2250},{8,31,2250},{8,31,2250},{5,31,5},{0,28,3170},{0,28,3170},{15,31,65535},{12,31,47239},{10,31,28065},{9,31,20104},{14,31,65535},{10,31,32574},{7,31,8839},{6,31,54},{3,31,64890},{0,30,10964},{26,31,2252},{25,31,1806},{25,31,1445},{23,31,650},{30,25,3361}, +{23,31,2091},{21,31,1322},{8,31,0},{30,27,3361},{8,31,0},{17,31,15584},{17,31,15584},{17,31,15584},{15,31,11846},{14,31,12522},{11,31,6697},{11,31,6697},{6,31,50},{3,31,11669},{0,31,2834},{25,31,1445},{25,31,1445},{25,31,1445},{23,31,650},{30,21,2521},{21,31,1322},{21,31,1322},{8,31,0},{31,24,2521},{8,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0}, +{0,31,0},{31,31,0},{0,31,0},{14,0,9250},{14,0,9250},{14,0,9250},{14,0,9250},{9,31,2525},{9,31,2525},{9,31,2525},{6,31,50},{0,31,2834},{0,31,2834},{16,31,65535},{13,31,44559},{11,31,27000},{10,31,19705},{15,31,64179},{11,31,30525},{8,31,8677},{7,31,149},{3,31,60570},{0,30,8308},{27,31,1782},{26,31,1416},{25,31,1157},{24,31,520},{30,26,2646},{23,31,1691},{22,31,1040},{11,31,1},{31,27,2646}, +{11,31,1},{18,31,14889},{18,31,14889},{18,31,14889},{16,31,11585},{15,31,11778},{12,31,6555},{12,31,6555},{7,31,145},{3,31,11061},{0,31,2610},{25,31,1157},{25,31,1157},{25,31,1157},{24,31,520},{31,21,1985},{22,31,1040},{22,31,1040},{11,31,1},{31,25,1985},{11,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{15,0,9250}, +{15,0,9250},{15,0,9250},{15,0,9250},{10,31,2792},{10,31,2792},{10,31,2792},{7,31,145},{0,31,2610},{0,31,2610},{16,31,63318},{14,31,42019},{12,31,25930},{11,31,19324},{16,31,59178},{11,31,28845},{9,31,8605},{8,31,276},{6,31,56253},{0,30,6420},{27,31,1366},{27,31,1094},{26,31,872},{25,31,397},{30,27,2017},{25,31,1298},{23,31,794},{13,31,1},{30,28,2017},{13,31,1},{19,31,14244},{19,31,14244},{19,31,14244}, +{17,31,11312},{16,31,11037},{13,31,6429},{13,31,6429},{8,31,260},{6,31,10457},{0,31,2642},{26,31,872},{26,31,872},{26,31,872},{25,31,397},{31,22,1513},{23,31,794},{23,31,794},{13,31,1},{29,27,1513},{13,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{16,0,9248},{16,0,9248},{16,0,9248},{16,0,9248},{12,31,3074}, +{12,31,3074},{12,31,3074},{8,31,260},{0,31,2642},{0,31,2642},{17,31,58848},{15,31,39619},{13,31,24975},{12,31,19007},{16,31,54474},{13,31,27057},{10,31,8569},{9,31,461},{8,31,51302},{0,31,5046},{28,31,979},{27,31,806},{27,31,637},{26,31,292},{31,26,1473},{26,31,953},{24,31,605},{16,31,0},{29,29,1473},{16,31,0},{19,31,13604},{19,31,13604},{19,31,13604},{18,31,11057},{16,31,10429},{14,31,6339},{14,31,6339}, +{10,31,424},{8,31,9713},{1,31,2900},{27,31,637},{27,31,637},{27,31,637},{26,31,292},{30,25,1105},{24,31,605},{24,31,605},{16,31,0},{30,27,1105},{16,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{17,0,9248},{17,0,9248},{17,0,9248},{17,0,9248},{12,31,3330},{12,31,3330},{12,31,3330},{10,31,424},{1,31,2900}, +{1,31,2900}, diff --git a/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_56.inc b/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_56.inc new file mode 100644 index 0000000..2b56c09 --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder_tables_atc_56.inc @@ -0,0 +1,481 @@ +{0,3,20},{0,3,5},{0,2,1},{0,2,9},{0,2,35},{0,2,27},{0,1,17},{0,1,24},{0,1,41},{0,1,25},{0,3,20},{0,3,5},{0,2,1},{0,2,9},{0,2,35},{0,2,27},{0,1,17},{0,1,24},{1,0,35},{0,1,24},{0,1,1},{0,1,1},{0,1,1},{0,1,0},{0,1,2},{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{0,1,1}, +{0,1,1},{0,1,1},{0,1,0},{0,1,2},{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{1,0,18},{0,3,5},{0,2,1},{0,2,9},{1,0,18},{1,1,18},{0,2,9},{0,1,20},{1,1,18},{0,1,20},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,9,54},{0,7,37},{0,4,52}, +{0,4,36},{0,7,52},{0,5,21},{0,4,0},{0,3,21},{0,4,88},{0,3,37},{1,5,24},{1,5,9},{1,4,5},{1,4,13},{2,1,51},{0,5,21},{0,4,0},{0,3,21},{3,1,51},{0,3,21},{0,7,36},{0,7,36},{0,7,36},{0,4,36},{0,5,10},{0,4,0},{0,4,0},{0,2,5},{0,3,26},{0,2,14},{1,3,5},{1,3,5},{1,3,5},{1,3,4},{1,2,8}, +{0,4,0},{0,4,0},{0,2,5},{2,1,8},{0,2,5},{2,2,18},{0,7,1},{1,4,1},{0,4,0},{2,2,18},{2,3,18},{0,4,0},{0,3,20},{2,3,18},{0,3,20},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,4,0},{0,4,0},{0,4,0},{0,2,1},{0,2,10},{0,2,10},{1,11,54},{1,9,37},{1,6,52},{1,6,36},{1,9,52},{1,7,21},{1,6,0}, +{1,5,21},{0,7,63},{0,5,25},{2,7,24},{2,7,9},{2,6,5},{2,6,13},{3,3,51},{1,7,21},{1,6,0},{1,5,21},{4,3,51},{1,5,21},{1,9,36},{1,9,36},{1,9,36},{1,6,36},{1,7,10},{1,6,0},{1,6,0},{1,4,5},{0,6,11},{0,5,9},{2,5,5},{2,5,5},{2,5,5},{2,5,4},{3,1,8},{1,6,0},{1,6,0},{1,4,5},{3,3,8}, +{1,4,5},{3,4,18},{1,9,1},{2,6,1},{1,6,0},{3,4,18},{7,0,18},{1,6,0},{0,5,20},{7,0,18},{0,5,20},{1,0,36},{1,0,36},{1,0,36},{1,0,36},{1,6,0},{1,6,0},{1,6,0},{1,4,1},{0,6,2},{0,6,2},{2,13,54},{2,11,37},{2,8,52},{2,8,36},{2,11,52},{2,9,21},{2,8,0},{2,7,21},{0,11,51},{1,7,25},{3,9,24}, +{3,9,9},{3,8,5},{3,8,13},{5,1,51},{2,9,21},{2,8,0},{2,7,21},{9,0,51},{2,7,21},{2,11,36},{2,11,36},{2,11,36},{2,8,36},{2,9,10},{2,8,0},{2,8,0},{2,6,5},{1,8,11},{1,7,9},{3,7,5},{3,7,5},{3,7,5},{3,7,4},{3,6,8},{2,8,0},{2,8,0},{2,6,5},{8,0,8},{2,6,5},{4,6,18},{2,11,1},{3,8,1}, +{2,8,0},{4,6,18},{8,2,18},{2,8,0},{0,7,20},{8,2,18},{0,7,20},{2,0,36},{2,0,36},{2,0,36},{2,0,36},{2,8,0},{2,8,0},{2,8,0},{2,6,1},{1,8,2},{1,8,2},{3,15,70},{3,13,51},{4,10,69},{3,10,52},{3,14,52},{3,12,25},{3,10,4},{3,9,27},{1,13,53},{2,10,26},{4,12,22},{4,11,12},{4,10,5},{4,10,9},{6,4,51}, +{2,13,22},{3,10,3},{3,9,26},{11,1,51},{3,9,26},{3,13,51},{3,13,51},{3,13,51},{3,10,51},{3,12,9},{3,11,2},{3,11,2},{3,9,2},{2,11,9},{3,9,10},{4,10,4},{4,10,4},{4,10,4},{4,9,5},{6,2,8},{3,11,1},{3,11,1},{3,9,1},{11,0,8},{3,9,1},{7,2,18},{3,13,1},{4,10,1},{3,10,2},{7,2,18},{11,2,18},{3,10,2}, +{0,9,26},{11,2,18},{0,9,26},{3,0,50},{3,0,50},{3,0,50},{3,0,50},{3,11,1},{3,11,1},{3,11,1},{3,9,1},{2,10,0},{2,10,0},{4,17,54},{4,15,36},{4,13,54},{4,12,38},{4,15,52},{4,14,24},{4,12,3},{4,11,26},{2,15,53},{3,12,26},{5,14,22},{5,13,12},{5,12,5},{5,12,9},{8,2,51},{3,15,22},{4,12,3},{4,11,26},{12,3,51}, +{4,11,26},{4,15,36},{4,15,36},{4,15,36},{4,12,37},{4,14,8},{4,12,2},{4,12,2},{4,11,1},{3,13,9},{3,11,14},{5,12,4},{5,12,4},{5,12,4},{5,11,5},{8,0,8},{4,12,2},{4,12,2},{4,11,1},{11,3,8},{4,11,1},{9,0,18},{4,15,0},{5,12,1},{4,12,2},{9,0,18},{15,0,18},{4,12,2},{0,11,26},{15,0,18},{0,11,26},{4,0,36}, +{4,0,36},{4,0,36},{4,0,36},{4,12,1},{4,12,1},{4,12,1},{4,11,0},{3,12,0},{3,12,0},{5,19,54},{5,17,37},{5,15,54},{5,14,38},{5,17,52},{5,15,27},{5,14,3},{5,13,26},{3,17,52},{4,14,26},{6,15,24},{6,15,12},{6,14,5},{6,14,9},{10,1,51},{4,17,21},{5,14,3},{5,13,26},{17,0,51},{5,13,26},{5,17,36},{5,17,36},{5,17,36}, +{5,14,37},{5,15,10},{5,14,2},{5,14,2},{5,13,1},{4,15,12},{4,13,11},{6,14,4},{6,14,4},{6,14,4},{6,13,5},{9,2,8},{5,14,2},{5,14,2},{5,13,1},{16,0,8},{5,13,1},{10,2,18},{5,17,1},{6,14,1},{5,14,2},{10,2,18},{16,2,18},{5,14,2},{0,13,26},{16,2,18},{0,13,26},{5,0,36},{5,0,36},{5,0,36},{5,0,36},{5,14,1}, +{5,14,1},{5,14,1},{5,13,0},{4,14,0},{4,14,0},{6,21,54},{6,19,37},{6,16,52},{6,16,36},{6,19,52},{6,17,21},{6,16,0},{6,15,26},{4,19,51},{5,15,36},{7,17,24},{7,17,9},{7,16,5},{7,16,13},{11,3,51},{6,17,21},{6,16,0},{6,15,26},{18,2,51},{6,15,26},{6,19,36},{6,19,36},{6,19,36},{6,16,36},{6,17,10},{6,16,0},{6,16,0}, +{6,15,1},{5,16,11},{5,15,11},{7,15,5},{7,15,5},{7,15,5},{7,15,5},{11,1,8},{6,16,0},{6,16,0},{6,15,1},{17,2,8},{6,15,1},{11,4,18},{6,19,1},{7,16,1},{6,16,0},{11,4,18},{17,4,18},{6,16,0},{0,15,26},{17,4,18},{0,15,26},{6,0,36},{6,0,36},{6,0,36},{6,0,36},{6,16,0},{6,16,0},{6,16,0},{6,15,0},{5,16,2}, +{5,16,2},{7,23,70},{7,21,51},{8,18,69},{7,18,52},{7,22,52},{7,20,25},{7,18,4},{7,17,27},{5,21,53},{6,18,26},{8,20,22},{8,19,12},{8,18,5},{8,18,9},{13,2,51},{6,21,22},{7,18,3},{7,17,26},{21,2,51},{7,17,26},{7,21,51},{7,21,51},{7,21,51},{7,18,51},{7,20,9},{7,19,2},{7,19,2},{7,17,2},{6,19,9},{7,17,10},{8,18,4}, +{8,18,4},{8,18,4},{8,17,5},{13,0,8},{7,19,1},{7,19,1},{7,17,1},{20,2,8},{7,17,1},{14,0,18},{7,21,1},{8,18,1},{7,18,2},{14,0,18},{20,4,18},{7,18,2},{0,17,26},{20,4,18},{0,17,26},{7,0,50},{7,0,50},{7,0,50},{7,0,50},{7,19,1},{7,19,1},{7,19,1},{7,17,1},{6,18,0},{6,18,0},{8,25,54},{8,23,36},{8,21,54}, +{8,20,38},{8,24,51},{8,22,24},{8,20,3},{8,19,26},{6,23,53},{7,20,26},{9,22,22},{9,21,12},{9,20,5},{9,20,9},{14,4,51},{7,23,22},{8,20,3},{8,19,26},{25,0,51},{8,19,26},{8,23,36},{8,23,36},{8,23,36},{8,20,37},{8,22,8},{8,20,2},{8,20,2},{8,19,1},{7,21,9},{7,19,14},{9,20,4},{9,20,4},{9,20,4},{9,19,5},{14,2,8}, +{8,20,2},{8,20,2},{8,19,1},{24,0,8},{8,19,1},{15,2,18},{8,23,0},{9,20,1},{8,20,2},{15,2,18},{25,1,18},{8,20,2},{0,19,26},{25,1,18},{0,19,26},{8,0,36},{8,0,36},{8,0,36},{8,0,36},{8,20,1},{8,20,1},{8,20,1},{8,19,0},{7,20,0},{7,20,0},{9,27,54},{9,25,36},{9,23,54},{9,22,38},{9,26,51},{9,24,24},{9,22,3}, +{9,21,26},{7,25,53},{8,22,26},{10,24,22},{10,23,12},{10,22,5},{10,22,9},{16,2,51},{8,25,19},{9,22,3},{9,21,26},{27,1,51},{9,21,26},{9,25,36},{9,25,36},{9,25,36},{9,22,37},{9,24,8},{9,22,2},{9,22,2},{9,21,1},{8,23,12},{8,21,11},{10,22,4},{10,22,4},{10,22,4},{10,21,5},{16,0,8},{9,22,2},{9,22,2},{9,21,1},{26,1,8}, +{9,21,1},{17,0,18},{9,25,0},{10,22,1},{9,22,2},{17,0,18},{26,3,18},{9,22,2},{0,21,26},{26,3,18},{0,21,26},{9,0,36},{9,0,36},{9,0,36},{9,0,36},{9,22,1},{9,22,1},{9,22,1},{9,21,0},{8,22,0},{8,22,0},{10,29,54},{10,27,36},{10,25,54},{10,24,38},{10,28,51},{10,26,24},{10,24,3},{10,23,26},{8,27,52},{9,24,26},{11,26,22}, +{11,25,12},{11,24,5},{11,24,9},{17,4,51},{9,27,19},{10,24,3},{10,23,26},{27,4,51},{10,23,26},{10,27,36},{10,27,36},{10,27,36},{10,24,37},{10,26,8},{10,24,2},{10,24,2},{10,23,1},{9,25,12},{9,23,11},{11,24,4},{11,24,4},{11,24,4},{11,23,5},{17,2,8},{10,24,2},{10,24,2},{10,23,1},{27,3,8},{10,23,1},{18,2,18},{10,27,0},{11,24,1}, +{10,24,2},{18,2,18},{31,0,18},{10,24,2},{0,23,26},{31,0,18},{0,23,26},{10,0,36},{10,0,36},{10,0,36},{10,0,36},{10,24,1},{10,24,1},{10,24,1},{10,23,0},{9,24,0},{9,24,0},{11,31,70},{11,29,52},{11,27,70},{11,27,54},{11,30,53},{11,28,20},{11,27,5},{11,26,25},{10,28,56},{10,26,22},{12,28,22},{12,27,9},{12,26,8},{12,26,9},{19,3,51}, +{11,28,19},{11,27,4},{10,26,21},{30,4,51},{10,26,21},{11,30,50},{11,30,50},{11,30,50},{11,27,50},{11,28,11},{11,27,1},{11,27,1},{11,25,2},{10,27,11},{11,25,10},{12,26,4},{12,26,4},{12,26,4},{12,25,5},{19,1,8},{11,27,0},{11,27,0},{11,25,1},{29,4,8},{11,25,1},{20,1,18},{11,29,2},{12,26,4},{11,27,4},{20,1,18},{29,6,18},{11,27,4}, +{0,26,20},{29,6,18},{0,26,20},{11,0,50},{11,0,50},{11,0,50},{11,0,50},{11,27,1},{11,27,1},{11,27,1},{11,25,2},{10,26,2},{10,26,2},{12,33,54},{12,31,37},{12,29,56},{12,29,41},{12,32,51},{12,30,22},{12,29,5},{12,28,24},{11,30,56},{11,28,22},{13,30,22},{13,29,9},{13,28,8},{13,28,9},{20,5,51},{12,30,22},{12,29,5},{11,28,21},{31,6,51}, +{11,28,21},{12,31,37},{12,31,37},{12,31,37},{12,29,37},{12,30,8},{12,29,1},{12,29,1},{12,27,0},{11,29,11},{12,27,9},{13,28,4},{13,28,4},{13,28,4},{13,27,5},{20,3,8},{12,29,1},{12,29,1},{12,27,0},{30,6,8},{12,27,0},{21,3,18},{12,31,1},{13,28,4},{13,28,5},{21,3,18},{30,8,18},{13,28,5},{0,28,20},{30,8,18},{0,28,20},{12,0,36}, +{12,0,36},{12,0,36},{12,0,36},{12,29,0},{12,29,0},{12,29,0},{12,27,0},{11,28,2},{11,28,2},{13,35,54},{13,33,36},{13,31,56},{13,31,41},{13,34,51},{13,32,24},{13,31,5},{13,30,24},{11,33,53},{12,30,21},{14,32,22},{14,31,9},{14,30,8},{14,30,9},{23,0,51},{12,33,19},{13,31,5},{12,30,21},{31,9,51},{12,30,21},{13,33,36},{13,33,36},{13,33,36}, +{13,31,37},{13,32,8},{13,31,1},{13,31,1},{13,29,0},{12,31,9},{13,29,9},{14,30,4},{14,30,4},{14,30,4},{14,29,5},{21,5,8},{13,31,1},{13,31,1},{13,29,0},{31,8,8},{13,29,0},{22,5,18},{13,33,0},{14,30,4},{14,30,5},{22,5,18},{31,10,18},{14,30,5},{0,30,20},{31,10,18},{0,30,20},{13,0,36},{13,0,36},{13,0,36},{13,0,36},{13,31,0}, +{13,31,0},{13,31,0},{13,29,0},{12,30,1},{12,30,1},{14,37,54},{14,35,36},{14,33,54},{14,32,38},{14,36,51},{14,34,24},{14,32,3},{14,32,35},{12,35,52},{13,32,26},{15,34,22},{15,33,12},{15,32,5},{15,32,9},{24,2,51},{13,35,19},{14,32,3},{13,32,26},{27,17,51},{13,32,26},{14,35,36},{14,35,36},{14,35,36},{14,32,37},{14,34,8},{14,32,2},{14,32,2}, +{14,31,0},{13,33,12},{14,31,9},{15,32,4},{15,32,4},{15,32,4},{15,31,5},{24,0,8},{14,32,2},{14,32,2},{14,31,0},{31,11,8},{14,31,0},{25,0,18},{14,35,0},{15,32,1},{14,32,2},{25,0,18},{31,13,18},{14,32,2},{0,32,26},{31,13,18},{0,32,26},{14,0,36},{14,0,36},{14,0,36},{14,0,36},{14,32,1},{14,32,1},{14,32,1},{14,31,0},{13,32,0}, +{13,32,0},{15,40,68},{15,37,52},{15,35,70},{15,35,54},{15,38,53},{15,36,20},{15,35,5},{15,34,25},{14,36,56},{14,34,22},{16,36,22},{16,35,9},{16,34,8},{16,34,9},{26,1,51},{15,36,19},{15,35,4},{14,34,21},{30,17,51},{14,34,21},{15,38,50},{15,38,50},{15,38,50},{15,35,50},{15,36,11},{15,35,1},{15,35,1},{15,33,2},{14,35,11},{15,33,10},{16,34,4}, +{16,34,4},{16,34,4},{16,33,5},{24,6,8},{15,35,0},{15,35,0},{15,33,1},{29,17,8},{15,33,1},{25,6,18},{15,37,2},{16,34,4},{15,35,4},{25,6,18},{29,19,18},{15,35,4},{0,34,20},{29,19,18},{0,34,20},{15,0,50},{15,0,50},{15,0,50},{15,0,50},{15,35,1},{15,35,1},{15,35,1},{15,33,2},{14,34,2},{14,34,2},{16,41,56},{16,39,37},{16,37,56}, +{16,37,41},{16,40,51},{16,38,22},{16,37,5},{16,36,24},{15,38,56},{15,36,22},{17,38,22},{17,37,9},{17,36,8},{17,36,9},{27,3,51},{16,38,22},{16,37,5},{15,36,21},{31,19,51},{15,36,21},{16,39,37},{16,39,37},{16,39,37},{16,37,37},{16,38,8},{16,37,1},{16,37,1},{16,35,0},{15,37,11},{16,35,9},{17,36,4},{17,36,4},{17,36,4},{17,35,5},{27,1,8}, +{16,37,1},{16,37,1},{16,35,0},{30,19,8},{16,35,0},{28,1,18},{16,39,1},{17,36,4},{17,36,5},{28,1,18},{30,21,18},{17,36,5},{0,36,20},{30,21,18},{0,36,20},{16,0,36},{16,0,36},{16,0,36},{16,0,36},{16,37,0},{16,37,0},{16,37,0},{16,35,0},{15,36,2},{15,36,2},{17,43,56},{17,41,37},{17,39,56},{17,39,41},{17,42,51},{17,40,22},{17,39,5}, +{17,38,24},{15,42,56},{16,38,21},{18,40,22},{18,39,9},{18,38,8},{18,38,9},{28,5,51},{17,40,22},{17,39,5},{16,38,21},{31,22,51},{16,38,21},{17,41,37},{17,41,37},{17,41,37},{17,39,37},{17,40,8},{17,39,1},{17,39,1},{17,37,0},{16,39,9},{17,37,9},{18,38,4},{18,38,4},{18,38,4},{18,37,5},{28,3,8},{17,39,1},{17,39,1},{17,37,0},{31,21,8}, +{17,37,0},{29,3,18},{17,41,1},{18,38,4},{18,38,5},{29,3,18},{31,23,18},{18,38,5},{0,38,20},{31,23,18},{0,38,20},{17,0,36},{17,0,36},{17,0,36},{17,0,36},{17,39,0},{17,39,0},{17,39,0},{17,37,0},{16,38,1},{16,38,1},{18,45,56},{18,43,37},{18,41,56},{18,41,41},{18,44,51},{18,42,22},{18,41,5},{18,40,24},{16,43,53},{17,40,21},{19,42,22}, +{19,41,9},{19,40,8},{19,40,9},{31,0,51},{18,42,22},{18,41,5},{17,40,21},{28,29,51},{17,40,21},{18,43,37},{18,43,37},{18,43,37},{18,41,37},{18,42,8},{18,41,1},{18,41,1},{18,39,0},{17,41,9},{18,39,9},{19,40,4},{19,40,4},{19,40,4},{19,39,5},{29,5,8},{18,41,1},{18,41,1},{18,39,0},{31,24,8},{18,39,0},{30,5,18},{18,43,1},{19,40,4}, +{19,40,5},{30,5,18},{31,26,18},{19,40,5},{0,40,20},{31,26,18},{0,40,20},{18,0,36},{18,0,36},{18,0,36},{18,0,36},{18,41,0},{18,41,0},{18,41,0},{18,39,0},{17,40,1},{17,40,1},{19,48,68},{19,46,51},{20,43,70},{19,43,51},{19,47,52},{19,44,22},{19,43,3},{19,42,20},{17,46,51},{18,42,23},{20,44,24},{20,44,8},{20,43,6},{20,42,14},{31,6,51}, +{19,44,21},{19,43,2},{19,42,19},{31,29,51},{19,42,19},{19,46,50},{19,46,50},{19,46,50},{19,43,50},{19,45,9},{19,43,2},{19,43,2},{19,41,3},{18,43,10},{19,41,6},{20,42,5},{20,42,5},{20,42,5},{20,42,5},{31,4,8},{19,43,1},{19,43,1},{19,41,2},{30,29,8},{19,41,2},{30,11,18},{19,46,1},{20,43,2},{19,43,1},{30,11,18},{30,31,18},{19,43,1}, +{0,42,18},{30,31,18},{0,42,18},{19,0,50},{19,0,50},{19,0,50},{19,0,50},{19,43,2},{19,43,2},{19,43,2},{19,41,2},{18,43,1},{18,43,1},{20,49,56},{20,47,38},{20,45,53},{20,45,37},{20,48,51},{20,46,19},{20,45,1},{20,44,22},{18,48,56},{19,44,23},{21,46,24},{21,46,8},{21,45,6},{21,44,14},{30,15,51},{20,46,19},{20,45,1},{19,44,22},{31,32,51}, +{19,44,22},{20,47,37},{20,47,37},{20,47,37},{20,45,36},{20,46,10},{20,45,0},{20,45,0},{20,43,2},{19,45,10},{20,43,11},{21,44,5},{21,44,5},{21,44,5},{21,44,5},{30,13,8},{20,45,0},{20,45,0},{20,43,2},{31,31,8},{20,43,2},{31,13,18},{20,47,2},{21,45,2},{20,45,1},{31,13,18},{30,34,18},{20,45,1},{0,44,18},{30,34,18},{0,44,18},{20,0,36}, +{20,0,36},{20,0,36},{20,0,36},{20,45,0},{20,45,0},{20,45,0},{20,43,1},{19,45,1},{19,45,1},{21,51,56},{21,49,37},{21,47,53},{21,47,37},{21,50,51},{21,48,22},{21,47,1},{21,46,22},{19,50,56},{20,46,20},{22,48,22},{22,48,13},{22,47,6},{22,46,14},{30,20,51},{21,48,22},{21,47,1},{20,46,19},{31,35,51},{20,46,19},{21,49,37},{21,49,37},{21,49,37}, +{21,47,36},{21,48,8},{21,47,0},{21,47,0},{21,45,2},{20,47,11},{21,45,11},{22,46,5},{22,46,5},{22,46,5},{22,46,5},{31,15,8},{21,47,0},{21,47,0},{21,45,2},{31,34,8},{21,45,2},{31,18,18},{21,49,1},{22,47,2},{21,47,1},{31,18,18},{31,36,18},{21,47,1},{0,46,18},{31,36,18},{0,46,18},{21,0,36},{21,0,36},{21,0,36},{21,0,36},{21,47,0}, +{21,47,0},{21,47,0},{21,45,1},{20,46,2},{20,46,2},{22,53,56},{22,51,37},{22,49,56},{22,49,41},{22,52,51},{22,50,22},{22,49,5},{22,48,24},{20,51,53},{21,48,21},{23,50,22},{23,49,9},{23,48,8},{23,48,9},{31,22,51},{22,50,22},{22,49,5},{21,48,21},{28,42,51},{21,48,21},{22,51,37},{22,51,37},{22,51,37},{22,49,37},{22,50,8},{22,49,1},{22,49,1}, +{22,47,2},{21,49,9},{22,47,11},{23,48,4},{23,48,4},{23,48,4},{23,48,5},{31,20,8},{22,49,1},{22,49,1},{22,47,2},{31,37,8},{22,47,2},{31,23,18},{22,51,1},{23,48,4},{23,48,5},{31,23,18},{31,39,18},{23,48,5},{0,48,20},{31,39,18},{0,48,20},{22,0,36},{22,0,36},{22,0,36},{22,0,36},{22,49,0},{22,49,0},{22,49,0},{22,47,1},{21,48,1}, +{21,48,1},{23,56,68},{23,54,51},{24,51,70},{23,51,51},{23,55,52},{23,52,22},{23,51,3},{23,50,20},{21,54,51},{22,50,23},{24,52,24},{24,52,8},{24,51,6},{24,50,14},{31,28,51},{23,52,21},{23,51,2},{23,50,19},{31,42,51},{23,50,19},{23,54,50},{23,54,50},{23,54,50},{23,51,50},{23,53,9},{23,51,2},{23,51,2},{23,49,3},{22,51,10},{23,49,6},{24,50,5}, +{24,50,5},{24,50,5},{24,50,5},{31,26,8},{23,51,1},{23,51,1},{23,49,2},{30,42,8},{23,49,2},{31,29,18},{23,54,1},{24,51,2},{23,51,1},{31,29,18},{30,44,18},{23,51,1},{0,50,18},{30,44,18},{0,50,18},{23,0,50},{23,0,50},{23,0,50},{23,0,50},{23,51,2},{23,51,2},{23,51,2},{23,49,2},{22,51,1},{22,51,1},{24,58,54},{24,55,38},{24,53,53}, +{24,53,37},{24,56,52},{24,54,19},{24,53,1},{24,52,22},{22,56,51},{23,52,23},{25,54,24},{25,54,8},{25,53,6},{25,52,14},{31,33,51},{24,54,19},{24,53,1},{23,52,22},{31,45,51},{23,52,22},{24,56,36},{24,56,36},{24,56,36},{24,53,36},{24,54,10},{24,53,0},{24,53,0},{24,51,2},{23,53,10},{24,51,11},{25,52,5},{25,52,5},{25,52,5},{25,52,5},{31,31,8}, +{24,53,0},{24,53,0},{24,51,2},{31,44,8},{24,51,2},{31,34,18},{24,55,2},{25,53,2},{24,53,1},{31,34,18},{31,46,18},{24,53,1},{0,52,18},{31,46,18},{0,52,18},{24,0,36},{24,0,36},{24,0,36},{24,0,36},{24,53,0},{24,53,0},{24,53,0},{24,51,1},{23,53,1},{23,53,1},{25,60,54},{25,57,38},{25,55,53},{25,55,37},{25,58,52},{25,56,19},{25,55,1}, +{25,54,22},{23,58,51},{24,54,20},{26,56,24},{26,56,8},{26,55,6},{26,54,14},{31,38,51},{25,56,19},{25,55,1},{24,54,19},{31,48,51},{24,54,19},{25,58,36},{25,58,36},{25,58,36},{25,55,36},{25,56,10},{25,55,0},{25,55,0},{25,53,2},{24,55,11},{25,53,11},{26,54,5},{26,54,5},{26,54,5},{26,54,5},{31,36,8},{25,55,0},{25,55,0},{25,53,2},{31,47,8}, +{25,53,2},{30,43,18},{25,57,2},{26,55,2},{25,55,1},{30,43,18},{30,50,18},{25,55,1},{0,54,18},{30,50,18},{0,54,18},{25,0,36},{25,0,36},{25,0,36},{25,0,36},{25,55,0},{25,55,0},{25,55,0},{25,53,1},{24,54,2},{24,54,2},{26,62,54},{26,59,38},{26,57,53},{26,57,37},{26,60,52},{26,58,19},{26,57,1},{26,56,22},{25,58,56},{25,56,20},{27,58,24}, +{27,58,8},{27,57,6},{27,56,14},{30,47,51},{26,58,19},{26,57,1},{25,56,19},{31,51,51},{25,56,19},{26,60,36},{26,60,36},{26,60,36},{26,57,36},{26,58,10},{26,57,0},{26,57,0},{26,55,2},{25,57,11},{26,55,11},{27,56,5},{27,56,5},{27,56,5},{27,56,5},{30,45,8},{26,57,0},{26,57,0},{26,55,2},{31,50,8},{26,55,2},{31,45,18},{26,59,2},{27,57,2}, +{26,57,1},{31,45,18},{31,52,18},{26,57,1},{0,56,18},{31,52,18},{0,56,18},{26,0,36},{26,0,36},{26,0,36},{26,0,36},{26,57,0},{26,57,0},{26,57,0},{26,55,1},{25,56,2},{25,56,2},{27,63,76},{27,62,52},{28,59,69},{27,59,51},{27,63,52},{27,60,21},{27,59,3},{27,58,22},{25,62,52},{26,58,28},{28,60,24},{28,60,9},{28,59,5},{28,59,13},{31,49,51}, +{27,60,20},{27,59,2},{27,58,21},{30,56,51},{27,58,21},{27,62,51},{27,62,51},{27,62,51},{27,59,51},{27,61,9},{27,59,3},{27,59,3},{27,58,6},{26,60,11},{27,57,12},{28,58,5},{28,58,5},{28,58,5},{28,58,4},{29,54,8},{27,59,2},{27,59,2},{27,58,5},{29,56,8},{27,58,5},{30,54,18},{27,62,2},{28,59,1},{27,59,1},{30,54,18},{29,58,18},{27,59,1}, +{0,58,20},{29,58,18},{0,58,20},{27,0,50},{27,0,50},{27,0,50},{27,0,50},{27,60,1},{27,60,1},{27,60,1},{27,58,2},{26,59,0},{26,59,0},{28,63,86},{28,63,38},{28,61,52},{28,61,36},{28,63,59},{28,62,21},{28,61,0},{28,60,21},{27,62,60},{27,60,28},{29,62,24},{29,62,9},{29,61,5},{29,61,13},{30,58,51},{28,62,21},{28,61,0},{28,60,21},{31,58,51}, +{28,60,21},{28,63,37},{28,63,37},{28,63,37},{28,61,36},{28,62,10},{28,61,0},{28,61,0},{28,59,5},{27,62,11},{27,60,12},{29,60,5},{29,60,5},{29,60,5},{29,60,4},{30,56,8},{28,61,0},{28,61,0},{28,59,5},{30,58,8},{28,59,5},{31,56,18},{28,63,2},{29,61,1},{28,61,0},{31,56,18},{30,60,18},{28,61,0},{0,60,20},{30,60,18},{0,60,20},{28,0,36}, +{28,0,36},{28,0,36},{28,0,36},{28,61,0},{28,61,0},{28,61,0},{28,59,1},{27,61,0},{27,61,0},{30,63,94},{30,63,78},{29,63,52},{29,63,36},{30,63,115},{29,63,36},{29,63,0},{29,62,21},{29,63,88},{28,62,25},{30,63,30},{30,63,14},{30,63,5},{30,63,13},{31,60,51},{29,63,36},{29,63,0},{29,62,21},{31,61,51},{29,62,21},{29,63,52},{29,63,52},{29,63,52}, +{29,63,36},{29,63,16},{29,63,0},{29,63,0},{29,61,5},{28,63,11},{28,62,9},{30,62,5},{30,62,5},{30,62,5},{30,62,4},{31,58,8},{29,63,0},{29,63,0},{29,61,5},{31,60,8},{29,61,5},{31,61,18},{30,63,10},{30,63,1},{29,63,0},{31,61,18},{31,62,18},{29,63,0},{0,62,20},{31,62,18},{0,62,20},{29,0,36},{29,0,36},{29,0,36},{29,0,36},{29,63,0}, +{29,63,0},{29,63,0},{29,61,1},{28,63,2},{28,63,2},{31,63,68},{31,63,68},{30,63,61},{30,63,45},{30,63,59},{30,63,27},{30,63,18},{30,63,1},{30,63,28},{30,63,10},{31,63,4},{31,63,4},{31,63,4},{31,63,4},{31,63,4},{31,63,4},{31,63,4},{30,63,1},{31,63,4},{30,63,1},{30,63,61},{30,63,61},{30,63,61},{30,63,45},{30,63,34},{30,63,18},{30,63,18}, +{30,63,1},{30,63,19},{30,63,10},{31,63,4},{31,63,4},{31,63,4},{31,63,4},{31,62,4},{31,63,4},{31,63,4},{30,63,1},{31,63,4},{30,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{30,0,36},{30,0,36},{30,0,36},{30,0,36},{30,63,9},{30,63,9},{30,63,9},{30,63,1},{30,63,10}, +{30,63,10},{0,7,74},{0,6,20},{0,4,2},{0,4,26},{0,5,153},{0,4,110},{0,3,45},{0,2,115},{0,3,169},{0,2,124},{0,7,74},{0,6,20},{0,4,2},{0,4,26},{0,5,153},{0,4,110},{0,3,45},{0,2,115},{0,3,153},{0,2,115},{0,3,1},{0,3,1},{0,3,1},{0,2,0},{0,2,13},{0,2,9},{0,2,9},{0,1,5},{0,1,14},{0,1,6},{0,3,1}, +{0,3,1},{0,3,1},{0,2,0},{0,2,13},{0,2,9},{0,2,9},{0,1,5},{1,0,13},{0,1,5},{2,1,72},{0,6,20},{0,4,2},{0,4,26},{2,1,72},{3,1,72},{0,4,26},{0,3,74},{3,1,72},{0,3,74},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,13,81},{0,10,13},{0,6,26}, +{0,6,14},{0,9,244},{0,7,129},{0,6,41},{0,4,139},{0,5,300},{0,4,175},{0,13,81},{0,10,13},{0,6,26},{0,6,14},{2,3,243},{0,7,129},{0,6,41},{0,4,139},{4,1,243},{0,4,139},{0,9,9},{0,9,9},{0,9,9},{0,5,10},{0,5,52},{0,5,17},{0,5,17},{0,3,17},{0,3,68},{0,3,33},{0,9,9},{0,9,9},{0,9,9},{0,5,10},{1,2,50}, +{0,5,17},{0,5,17},{0,3,17},{2,1,50},{0,3,17},{3,3,72},{0,10,4},{1,6,2},{0,6,5},{3,3,72},{4,3,72},{0,6,5},{0,5,74},{4,3,72},{0,5,74},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,2,0},{0,2,0},{0,2,0},{0,1,1},{0,1,2},{0,1,2},{1,15,145},{1,12,77},{1,8,90},{1,8,78},{0,15,243},{0,10,96},{0,8,3}, +{0,6,106},{0,8,395},{0,6,187},{1,15,81},{1,12,13},{1,8,26},{1,8,14},{4,1,243},{0,10,96},{0,8,3},{0,6,106},{5,3,243},{0,6,106},{1,11,73},{1,11,73},{1,11,73},{1,7,74},{0,11,50},{0,8,2},{0,8,2},{0,5,2},{0,5,131},{0,5,51},{1,11,9},{1,11,9},{1,11,9},{1,7,10},{3,1,50},{0,8,2},{0,8,2},{0,5,2},{3,3,50}, +{0,5,2},{5,1,72},{1,12,4},{2,8,2},{0,8,2},{5,1,72},{9,0,72},{0,8,2},{0,7,74},{9,0,72},{0,7,74},{1,0,73},{1,0,73},{1,0,73},{1,0,73},{0,7,1},{0,7,1},{0,7,1},{0,4,1},{0,3,32},{0,3,32},{2,17,162},{2,14,94},{2,10,107},{2,10,95},{1,17,244},{1,12,97},{1,10,4},{1,8,107},{0,11,345},{0,8,116},{2,17,81}, +{2,14,13},{2,10,26},{2,10,14},{6,0,243},{0,14,76},{1,10,3},{0,9,83},{10,0,243},{0,9,83},{2,13,90},{2,13,90},{2,13,90},{2,9,91},{1,13,51},{1,10,3},{1,10,3},{1,7,3},{0,9,94},{0,7,14},{2,13,9},{2,13,9},{2,13,9},{2,9,10},{3,6,50},{1,10,2},{1,10,2},{1,7,2},{8,0,50},{1,7,2},{7,0,72},{2,14,4},{3,10,2}, +{1,10,2},{7,0,72},{10,2,72},{1,10,2},{0,9,74},{10,2,72},{0,9,74},{2,0,90},{2,0,90},{2,0,90},{2,0,90},{1,9,2},{1,9,2},{1,9,2},{1,6,2},{0,7,13},{0,7,13},{3,19,154},{3,16,82},{3,13,100},{3,12,85},{2,19,244},{2,15,90},{2,13,5},{2,11,97},{0,15,287},{0,11,73},{3,19,90},{3,16,18},{4,12,29},{3,12,21},{6,6,243}, +{1,16,75},{2,13,5},{0,11,73},{12,1,243},{0,11,73},{3,15,81},{3,15,81},{3,15,81},{3,12,81},{2,15,52},{2,13,1},{2,13,1},{2,9,4},{0,13,61},{0,10,14},{3,15,17},{3,15,17},{3,15,17},{3,12,17},{6,2,50},{2,13,1},{2,13,1},{2,9,4},{11,0,50},{2,9,4},{8,2,72},{3,16,2},{4,12,4},{2,13,4},{8,2,72},{12,3,72},{2,13,4}, +{0,11,72},{12,3,72},{0,11,72},{3,0,80},{3,0,80},{3,0,80},{3,0,80},{2,12,0},{2,12,0},{2,12,0},{2,9,0},{0,11,1},{0,11,1},{4,21,162},{4,18,94},{4,15,103},{4,14,95},{3,21,244},{3,17,88},{3,15,5},{3,13,97},{0,18,260},{1,13,73},{4,21,81},{4,18,13},{4,15,22},{4,14,14},{9,1,243},{2,18,75},{3,15,5},{1,13,73},{13,3,243}, +{1,13,73},{4,17,90},{4,17,90},{4,17,90},{4,14,91},{3,17,52},{3,15,1},{3,15,1},{3,11,4},{0,16,52},{1,12,14},{4,17,9},{4,17,9},{4,17,9},{4,14,10},{8,0,50},{3,15,1},{3,15,1},{3,11,4},{11,3,50},{3,11,4},{10,1,72},{3,20,2},{5,14,4},{3,15,4},{10,1,72},{17,0,72},{3,15,4},{0,13,72},{17,0,72},{0,13,72},{4,0,90}, +{4,0,90},{4,0,90},{4,0,90},{3,14,0},{3,14,0},{3,14,0},{3,11,0},{1,13,1},{1,13,1},{5,23,162},{5,20,94},{5,16,107},{5,16,95},{4,23,244},{4,18,97},{4,16,4},{4,15,98},{0,22,244},{2,15,73},{5,23,81},{5,20,13},{5,16,26},{5,16,14},{10,3,243},{3,20,75},{4,16,3},{2,15,73},{18,0,243},{2,15,73},{5,19,90},{5,19,90},{5,19,90}, +{5,15,94},{4,19,51},{4,16,3},{4,16,3},{4,13,5},{1,18,52},{2,14,14},{5,19,9},{5,19,9},{5,19,9},{5,15,13},{9,2,50},{4,16,2},{4,16,2},{4,13,4},{16,0,50},{4,13,4},{11,3,72},{5,20,4},{6,16,2},{4,16,2},{11,3,72},{18,2,72},{4,16,2},{0,15,72},{18,2,72},{0,15,72},{5,0,90},{5,0,90},{5,0,90},{5,0,90},{4,15,2}, +{4,15,2},{4,15,2},{4,13,1},{2,15,1},{2,15,1},{6,25,162},{6,22,94},{6,18,107},{6,18,95},{5,25,244},{5,20,97},{5,18,4},{5,16,107},{1,24,244},{3,17,74},{6,25,81},{6,22,13},{6,18,26},{6,18,14},{12,1,243},{3,24,75},{5,18,3},{3,17,74},{19,2,243},{3,17,74},{6,21,90},{6,21,90},{6,21,90},{6,17,91},{5,21,51},{5,18,3},{5,18,3}, +{5,15,5},{2,20,52},{3,16,19},{6,21,9},{6,21,9},{6,21,9},{6,17,10},{11,1,50},{5,18,2},{5,18,2},{5,15,4},{17,2,50},{5,15,4},{13,1,72},{6,22,4},{7,18,2},{5,18,2},{13,1,72},{19,4,72},{5,18,2},{0,17,74},{19,4,72},{0,17,74},{6,0,90},{6,0,90},{6,0,90},{6,0,90},{5,17,2},{5,17,2},{5,17,2},{5,15,1},{3,17,0}, +{3,17,0},{7,27,154},{7,24,82},{7,21,100},{7,20,85},{6,27,244},{6,23,90},{6,21,5},{6,19,97},{2,26,244},{4,19,73},{7,27,90},{7,24,18},{8,20,29},{7,20,21},{13,4,243},{5,24,75},{6,21,5},{4,19,73},{22,2,243},{4,19,73},{7,23,81},{7,23,81},{7,23,81},{7,20,81},{6,23,52},{6,21,1},{6,21,1},{6,17,4},{3,23,52},{4,18,14},{7,23,17}, +{7,23,17},{7,23,17},{7,20,17},{13,0,50},{6,21,1},{6,21,1},{6,17,4},{20,2,50},{6,17,4},{14,4,72},{7,24,2},{8,20,4},{6,21,4},{14,4,72},{25,0,72},{6,21,4},{0,19,72},{25,0,72},{0,19,72},{7,0,80},{7,0,80},{7,0,80},{7,0,80},{6,20,0},{6,20,0},{6,20,0},{6,17,0},{4,19,1},{4,19,1},{8,29,162},{8,26,92},{8,23,103}, +{8,22,95},{7,29,244},{7,25,90},{7,23,5},{7,21,97},{3,28,244},{5,21,73},{8,29,81},{8,26,11},{8,23,22},{8,22,14},{14,6,243},{6,26,75},{7,23,5},{5,21,73},{26,0,243},{5,21,73},{8,25,90},{8,25,90},{8,25,90},{8,22,91},{7,25,52},{7,23,1},{7,23,1},{7,19,4},{4,24,52},{5,20,14},{8,25,9},{8,25,9},{8,25,9},{8,22,10},{14,2,50}, +{7,23,1},{7,23,1},{7,19,4},{24,0,50},{7,19,4},{16,2,72},{8,26,2},{9,22,4},{7,23,4},{16,2,72},{27,1,72},{7,23,4},{0,21,72},{27,1,72},{0,21,72},{8,0,90},{8,0,90},{8,0,90},{8,0,90},{7,22,0},{7,22,0},{7,22,0},{7,19,0},{5,21,1},{5,21,1},{9,31,162},{9,28,92},{9,25,103},{9,24,95},{8,31,244},{8,26,100},{8,24,9}, +{8,23,98},{4,30,244},{6,23,73},{9,31,81},{9,28,11},{9,25,22},{9,24,14},{16,4,243},{7,28,75},{8,24,8},{6,23,73},{27,2,243},{6,23,73},{9,27,90},{9,27,90},{9,27,90},{9,24,91},{8,27,51},{8,24,5},{8,24,5},{8,21,5},{5,26,52},{6,22,14},{9,27,9},{9,27,9},{9,27,9},{9,24,10},{16,0,50},{8,24,4},{8,24,4},{8,21,4},{26,1,50}, +{8,21,4},{17,4,72},{9,28,2},{10,24,4},{8,25,4},{17,4,72},{27,4,72},{8,25,4},{0,23,72},{27,4,72},{0,23,72},{9,0,90},{9,0,90},{9,0,90},{9,0,90},{8,24,1},{8,24,1},{8,24,1},{8,21,1},{6,23,1},{6,23,1},{10,33,162},{10,30,92},{10,27,103},{10,26,95},{9,33,244},{9,28,100},{9,26,9},{9,25,98},{5,32,244},{7,25,73},{10,33,81}, +{10,30,11},{10,27,22},{10,26,14},{17,6,243},{8,30,75},{9,26,8},{7,25,73},{28,4,243},{7,25,73},{10,29,90},{10,29,90},{10,29,90},{10,26,91},{9,29,51},{9,26,5},{9,26,5},{9,23,5},{6,28,52},{7,24,14},{10,29,9},{10,29,9},{10,29,9},{10,26,10},{17,2,50},{9,26,4},{9,26,4},{9,23,4},{27,3,50},{9,23,4},{18,6,72},{10,30,2},{11,26,4}, +{9,27,4},{18,6,72},{28,6,72},{9,27,4},{0,25,72},{28,6,72},{0,25,72},{10,0,90},{10,0,90},{10,0,90},{10,0,90},{9,26,1},{9,26,1},{9,26,1},{9,23,1},{7,25,1},{7,25,1},{11,35,154},{11,32,82},{11,29,97},{11,29,85},{10,35,244},{10,31,96},{10,29,3},{10,27,90},{6,34,244},{8,27,78},{11,35,90},{11,32,18},{12,29,27},{11,29,21},{19,5,243}, +{9,32,75},{10,29,3},{9,27,75},{31,4,243},{9,27,75},{11,31,81},{11,31,81},{11,31,81},{11,28,80},{10,31,52},{10,29,2},{10,29,2},{10,26,5},{7,31,50},{9,26,11},{11,31,17},{11,31,17},{11,31,17},{11,28,16},{19,1,50},{10,29,2},{10,29,2},{9,26,2},{29,4,50},{9,26,2},{20,5,72},{11,32,2},{12,29,2},{10,29,2},{20,5,72},{31,6,72},{10,29,2}, +{0,27,74},{31,6,72},{0,27,74},{11,0,80},{11,0,80},{11,0,80},{11,0,80},{10,28,1},{10,28,1},{10,28,1},{10,25,1},{8,28,2},{8,28,2},{12,37,162},{12,34,92},{12,31,107},{12,30,99},{11,37,244},{11,33,90},{11,31,3},{11,29,90},{7,36,244},{9,29,78},{12,37,81},{12,34,11},{12,31,26},{12,30,18},{22,0,243},{10,34,75},{11,31,3},{10,29,75},{31,7,243}, +{10,29,75},{12,33,90},{12,33,90},{12,33,90},{12,30,90},{11,33,52},{11,31,2},{11,31,2},{11,28,5},{8,32,52},{10,28,11},{12,33,9},{12,33,9},{12,33,9},{12,30,9},{20,3,50},{11,31,2},{11,31,2},{10,28,2},{30,6,50},{10,28,2},{23,0,72},{12,34,2},{13,31,2},{11,31,2},{23,0,72},{31,9,72},{11,31,2},{0,29,74},{31,9,72},{0,29,74},{12,0,90}, +{12,0,90},{12,0,90},{12,0,90},{11,30,1},{11,30,1},{11,30,1},{11,27,1},{9,30,2},{9,30,2},{13,39,162},{13,36,92},{13,33,103},{13,32,95},{12,39,244},{12,34,100},{12,32,9},{12,31,100},{8,38,244},{10,31,78},{13,39,81},{13,36,11},{13,33,22},{13,32,14},{23,2,243},{11,36,75},{12,32,8},{11,31,75},{28,14,243},{11,31,75},{13,35,90},{13,35,90},{13,35,90}, +{13,32,91},{12,35,51},{12,32,5},{12,32,5},{12,30,6},{9,34,52},{11,30,11},{13,35,9},{13,35,9},{13,35,9},{13,32,10},{21,5,50},{12,32,4},{12,32,4},{11,30,2},{31,8,50},{11,30,2},{24,2,72},{13,36,2},{14,32,4},{12,33,4},{24,2,72},{27,17,72},{12,33,4},{0,31,74},{27,17,72},{0,31,74},{13,0,90},{13,0,90},{13,0,90},{13,0,90},{12,32,1}, +{12,32,1},{12,32,1},{12,29,1},{10,31,4},{10,31,4},{14,41,162},{14,38,92},{14,35,103},{14,34,95},{13,41,244},{13,36,100},{13,34,9},{13,33,98},{9,40,244},{11,33,73},{14,41,81},{14,38,11},{14,35,22},{14,34,14},{24,4,243},{12,38,75},{13,34,8},{11,33,73},{28,17,243},{11,33,73},{14,37,90},{14,37,90},{14,37,90},{14,34,91},{13,37,51},{13,34,5},{13,34,5}, +{13,31,10},{10,36,52},{11,32,14},{14,37,9},{14,37,9},{14,37,9},{14,34,10},{24,0,50},{13,34,4},{13,34,4},{12,32,4},{31,11,50},{12,32,4},{25,4,72},{14,38,2},{15,34,4},{13,35,4},{25,4,72},{28,19,72},{13,35,4},{0,33,72},{28,19,72},{0,33,72},{14,0,90},{14,0,90},{14,0,90},{14,0,90},{13,34,1},{13,34,1},{13,34,1},{13,31,1},{11,33,1}, +{11,33,1},{15,44,152},{15,40,84},{15,37,97},{15,37,85},{14,44,243},{14,39,96},{14,37,3},{14,35,90},{10,42,244},{12,35,78},{15,44,88},{15,40,20},{16,37,27},{15,37,21},{27,0,243},{13,41,76},{14,37,3},{13,35,75},{31,17,243},{13,35,75},{15,40,80},{15,40,80},{15,40,80},{15,36,80},{14,40,50},{14,37,2},{14,37,2},{14,34,5},{11,39,50},{13,34,11},{15,40,16}, +{15,40,16},{15,40,16},{15,36,16},{24,6,50},{14,37,2},{14,37,2},{13,34,2},{29,17,50},{13,34,2},{27,3,72},{15,40,4},{16,37,2},{14,37,2},{27,3,72},{31,19,72},{14,37,2},{0,35,74},{31,19,72},{0,35,74},{15,0,80},{15,0,80},{15,0,80},{15,0,80},{14,36,1},{14,36,1},{14,36,1},{14,33,1},{12,36,2},{12,36,2},{16,45,164},{16,42,95},{16,39,107}, +{16,38,99},{15,46,243},{15,41,96},{15,39,3},{15,37,90},{11,44,244},{13,37,78},{16,45,83},{16,42,14},{16,39,26},{16,38,18},{27,5,243},{14,43,76},{15,39,3},{14,37,75},{31,20,243},{14,37,75},{16,41,91},{16,41,91},{16,41,91},{16,38,90},{15,42,50},{15,39,2},{15,39,2},{15,36,5},{12,41,51},{14,36,11},{16,41,10},{16,41,10},{16,41,10},{16,38,9},{27,1,50}, +{15,39,2},{15,39,2},{14,36,2},{30,19,50},{14,36,2},{28,5,72},{15,44,4},{17,39,2},{15,39,2},{28,5,72},{31,22,72},{15,39,2},{0,37,74},{31,22,72},{0,37,74},{16,0,90},{16,0,90},{16,0,90},{16,0,90},{15,38,1},{15,38,1},{15,38,1},{15,35,1},{13,38,2},{13,38,2},{17,47,164},{17,44,95},{17,41,107},{17,40,99},{16,47,245},{16,43,91},{16,41,3}, +{16,39,100},{12,46,244},{14,39,78},{17,47,83},{17,44,14},{17,41,26},{17,40,18},{30,0,243},{15,45,76},{16,41,2},{15,39,75},{28,27,243},{15,39,75},{17,43,91},{17,43,91},{17,43,91},{17,40,90},{16,43,53},{16,41,2},{16,41,2},{16,38,6},{13,43,51},{15,38,11},{17,43,10},{17,43,10},{17,43,10},{17,40,9},{28,3,50},{16,41,1},{16,41,1},{15,38,2},{31,21,50}, +{15,38,2},{31,0,72},{16,46,1},{18,41,2},{16,41,1},{31,0,72},{28,29,72},{16,41,1},{0,39,74},{28,29,72},{0,39,74},{17,0,90},{17,0,90},{17,0,90},{17,0,90},{16,40,1},{16,40,1},{16,40,1},{16,37,1},{14,40,2},{14,40,2},{18,49,162},{18,46,95},{18,43,107},{18,42,99},{17,49,244},{17,45,91},{17,43,3},{17,41,100},{13,48,244},{15,41,78},{18,49,81}, +{18,46,14},{18,43,26},{18,42,18},{31,2,243},{15,48,75},{17,43,2},{15,41,78},{29,29,243},{15,41,78},{18,45,91},{18,45,91},{18,45,91},{18,42,90},{17,45,53},{17,43,2},{17,43,2},{17,40,6},{14,45,51},{16,40,18},{18,45,10},{18,45,10},{18,45,10},{18,42,9},{29,5,50},{17,43,1},{17,43,1},{16,40,2},{31,24,50},{16,40,2},{30,9,72},{17,48,2},{19,43,2}, +{17,43,1},{30,9,72},{29,31,72},{17,43,1},{0,41,74},{29,31,72},{0,41,74},{18,0,90},{18,0,90},{18,0,90},{18,0,90},{17,42,1},{17,42,1},{17,42,1},{17,39,1},{15,42,2},{15,42,2},{19,52,152},{19,48,84},{19,45,105},{19,45,84},{18,52,243},{18,47,89},{18,45,1},{18,43,96},{14,50,244},{16,44,81},{19,52,88},{19,48,20},{20,45,26},{19,45,20},{31,8,243}, +{17,49,76},{18,45,1},{16,44,80},{31,30,243},{16,44,80},{19,48,80},{19,48,80},{19,48,80},{19,44,81},{18,48,50},{18,45,1},{18,45,1},{18,42,1},{15,47,52},{17,42,13},{19,48,16},{19,48,16},{19,48,16},{19,44,17},{31,4,50},{18,45,1},{18,45,1},{18,42,1},{30,29,50},{18,42,1},{30,15,72},{19,48,4},{20,45,1},{18,45,1},{30,15,72},{31,32,72},{18,45,1}, +{0,43,80},{31,32,72},{0,43,80},{19,0,80},{19,0,80},{19,0,80},{19,0,80},{18,45,0},{18,45,0},{18,45,0},{18,41,1},{16,44,1},{16,44,1},{20,53,164},{20,50,95},{20,47,106},{20,47,94},{19,54,243},{19,49,96},{19,47,1},{19,45,96},{15,52,244},{17,46,81},{20,53,83},{20,50,14},{20,47,25},{20,47,13},{29,20,243},{18,51,76},{19,47,1},{17,46,80},{31,33,243}, +{17,46,80},{20,49,91},{20,49,91},{20,49,91},{20,46,90},{19,50,50},{19,47,1},{19,47,1},{19,44,1},{16,49,51},{18,44,13},{20,49,10},{20,49,10},{20,49,10},{20,46,9},{30,13,50},{19,47,1},{19,47,1},{19,44,1},{31,31,50},{19,44,1},{30,20,72},{19,52,4},{21,47,1},{19,47,1},{30,20,72},{31,35,72},{19,47,1},{0,45,80},{31,35,72},{0,45,80},{20,0,90}, +{20,0,90},{20,0,90},{20,0,90},{19,47,0},{19,47,0},{19,47,0},{19,43,1},{17,46,1},{17,46,1},{21,55,164},{21,52,95},{21,49,107},{21,48,99},{20,55,245},{20,51,91},{20,49,3},{20,47,97},{16,54,244},{18,47,85},{21,55,83},{21,52,14},{21,49,26},{21,48,18},{30,22,243},{19,53,76},{20,49,2},{19,47,81},{28,40,243},{19,47,81},{21,51,91},{21,51,91},{21,51,91}, +{21,48,90},{20,51,53},{20,49,2},{20,49,2},{20,46,5},{17,51,51},{19,46,13},{21,51,10},{21,51,10},{21,51,10},{21,48,9},{31,15,50},{20,49,1},{20,49,1},{19,46,4},{31,34,50},{19,46,4},{31,22,72},{20,54,1},{22,49,2},{20,49,1},{31,22,72},{28,42,72},{20,49,1},{0,47,80},{28,42,72},{0,47,80},{21,0,90},{21,0,90},{21,0,90},{21,0,90},{20,48,1}, +{20,48,1},{20,48,1},{20,45,2},{18,48,2},{18,48,2},{22,57,164},{22,54,95},{22,51,107},{22,50,99},{21,57,245},{21,53,91},{21,51,3},{21,49,100},{17,56,244},{19,49,78},{22,57,83},{22,54,14},{22,51,26},{22,50,18},{31,24,243},{19,56,76},{21,51,2},{19,49,78},{29,42,243},{19,49,78},{22,53,91},{22,53,91},{22,53,91},{22,50,90},{21,53,53},{21,51,2},{21,51,2}, +{21,48,6},{18,53,51},{20,48,18},{22,53,10},{22,53,10},{22,53,10},{22,50,9},{31,20,50},{21,51,1},{21,51,1},{20,48,2},{31,37,50},{20,48,2},{31,27,72},{21,56,1},{23,51,2},{21,51,1},{31,27,72},{29,44,72},{21,51,1},{0,49,74},{29,44,72},{0,49,74},{22,0,90},{22,0,90},{22,0,90},{22,0,90},{21,50,1},{21,50,1},{21,50,1},{21,47,2},{19,50,2}, +{19,50,2},{23,60,152},{23,57,81},{23,53,105},{23,53,84},{22,60,243},{22,55,89},{22,53,1},{22,51,96},{18,59,244},{20,52,81},{23,60,88},{23,57,17},{24,53,26},{23,53,20},{31,30,243},{21,57,73},{22,53,1},{20,52,80},{31,43,243},{20,52,80},{23,56,80},{23,56,80},{23,56,80},{23,52,81},{22,56,50},{22,53,1},{22,53,1},{22,50,1},{19,55,52},{21,50,13},{23,56,16}, +{23,56,16},{23,56,16},{23,52,17},{31,26,50},{22,53,1},{22,53,1},{22,50,1},{30,42,50},{22,50,1},{31,33,72},{23,57,1},{24,53,1},{22,53,1},{31,33,72},{31,45,72},{22,53,1},{0,51,80},{31,45,72},{0,51,80},{23,0,80},{23,0,80},{23,0,80},{23,0,80},{22,53,0},{22,53,0},{22,53,0},{22,49,1},{20,52,1},{20,52,1},{24,62,162},{24,58,94},{24,55,106}, +{24,55,94},{23,62,243},{23,57,89},{23,55,1},{23,53,96},{19,61,244},{21,54,81},{24,62,81},{24,58,13},{24,55,25},{24,55,13},{31,35,243},{22,59,73},{23,55,1},{21,54,80},{27,51,243},{21,54,80},{24,58,90},{24,58,90},{24,58,90},{24,54,90},{23,58,50},{23,55,1},{23,55,1},{23,52,1},{20,57,50},{22,52,13},{24,58,9},{24,58,9},{24,58,9},{24,54,9},{31,31,50}, +{23,55,1},{23,55,1},{23,52,1},{31,44,50},{23,52,1},{31,38,72},{24,58,4},{25,55,1},{23,55,1},{31,38,72},{31,48,72},{23,55,1},{0,53,80},{31,48,72},{0,53,80},{24,0,90},{24,0,90},{24,0,90},{24,0,90},{23,55,0},{23,55,0},{23,55,0},{23,51,1},{21,54,1},{21,54,1},{25,63,164},{25,60,94},{25,57,106},{25,57,94},{24,63,245},{24,59,97},{24,57,3}, +{24,55,97},{20,63,249},{22,56,81},{25,63,83},{25,60,13},{25,57,25},{25,57,13},{31,40,243},{23,61,73},{24,57,2},{22,56,80},{31,49,243},{22,56,80},{25,60,90},{25,60,90},{25,60,90},{25,56,90},{24,60,51},{24,57,3},{24,57,3},{24,54,5},{21,59,50},{23,54,13},{25,60,9},{25,60,9},{25,60,9},{25,56,9},{31,36,50},{24,57,2},{24,57,2},{23,54,4},{31,47,50}, +{23,54,4},{30,47,72},{25,60,4},{26,57,1},{24,57,1},{30,47,72},{31,51,72},{24,57,1},{0,55,80},{31,51,72},{0,55,80},{25,0,90},{25,0,90},{25,0,90},{25,0,90},{24,56,2},{24,56,2},{24,56,2},{24,53,2},{22,56,1},{22,56,1},{26,63,194},{26,62,94},{26,59,106},{26,59,94},{25,63,284},{25,61,97},{25,59,3},{25,57,97},{22,63,253},{23,58,81},{27,62,99}, +{26,62,13},{26,59,25},{26,59,13},{29,52,243},{24,63,76},{25,59,2},{23,58,80},{28,56,243},{23,58,80},{26,62,90},{26,62,90},{26,62,90},{26,58,90},{25,62,51},{25,59,3},{25,59,3},{25,56,5},{22,61,50},{24,56,10},{26,62,9},{26,62,9},{26,62,9},{26,58,9},{30,45,50},{25,59,2},{25,59,2},{24,56,1},{31,50,50},{24,56,1},{30,52,72},{26,62,4},{27,59,1}, +{25,59,1},{30,52,72},{28,58,72},{25,59,1},{0,57,80},{28,58,72},{0,57,80},{26,0,90},{26,0,90},{26,0,90},{26,0,90},{25,58,2},{25,58,2},{25,58,2},{25,55,2},{23,58,1},{23,58,1},{27,63,280},{27,63,120},{27,62,105},{27,61,82},{27,63,328},{26,63,99},{26,61,5},{26,59,99},{24,63,308},{24,60,74},{28,63,105},{28,63,45},{28,61,27},{27,61,18},{31,51,243}, +{26,63,99},{26,61,5},{24,60,74},{31,56,243},{24,60,74},{27,63,84},{27,63,84},{27,63,84},{27,60,81},{26,63,58},{26,62,2},{26,62,2},{26,58,2},{23,63,53},{25,58,9},{27,63,20},{27,63,20},{27,63,20},{27,60,17},{29,54,50},{26,62,2},{26,62,2},{26,58,2},{29,56,50},{26,58,2},{30,58,72},{28,63,20},{28,61,2},{27,61,2},{30,58,72},{31,58,72},{27,61,2}, +{0,60,74},{31,58,72},{0,60,74},{27,0,80},{27,0,80},{27,0,80},{27,0,80},{26,61,0},{26,61,0},{26,61,0},{26,58,1},{24,60,0},{24,60,0},{28,63,331},{28,63,187},{28,63,106},{28,63,94},{28,63,358},{27,63,173},{27,63,4},{27,61,82},{26,63,355},{25,62,65},{29,63,126},{29,63,62},{28,63,25},{28,63,13},{31,56,221},{28,63,121},{27,63,4},{25,62,65},{30,60,221}, +{25,62,65},{28,63,106},{28,63,106},{28,63,106},{28,62,91},{27,63,100},{27,63,4},{27,63,4},{27,60,2},{25,63,72},{26,60,9},{28,63,25},{28,63,25},{28,63,25},{28,62,10},{30,56,50},{27,63,4},{27,63,4},{27,60,2},{30,58,50},{27,60,2},{31,59,61},{29,63,37},{29,63,1},{27,63,4},{31,59,61},{31,61,61},{27,63,4},{0,62,65},{31,61,61},{0,62,65},{28,0,90}, +{28,0,90},{28,0,90},{28,0,90},{27,63,0},{27,63,0},{27,63,0},{27,60,1},{25,62,0},{25,62,0},{29,63,239},{29,63,175},{29,63,139},{29,63,99},{29,63,239},{28,63,122},{28,63,41},{28,62,19},{28,63,233},{26,63,19},{30,63,54},{30,63,38},{30,63,29},{29,63,18},{31,60,93},{29,63,54},{29,63,18},{27,63,9},{31,61,93},{27,63,9},{29,63,139},{29,63,139},{29,63,139}, +{29,63,99},{29,63,139},{28,63,41},{28,63,41},{28,62,3},{27,63,116},{27,62,9},{30,63,29},{30,63,29},{30,63,29},{29,63,18},{31,58,50},{29,63,18},{29,63,18},{28,62,2},{31,60,50},{28,62,2},{31,62,5},{31,63,9},{30,63,4},{30,63,0},{31,62,5},{31,62,9},{30,63,0},{0,63,9},{31,62,9},{0,63,9},{29,0,90},{29,0,90},{29,0,90},{29,0,90},{28,63,5}, +{28,63,5},{28,63,5},{28,61,2},{27,62,8},{27,62,8},{30,63,140},{30,63,124},{30,63,115},{30,63,99},{30,63,131},{29,63,98},{29,63,62},{29,63,2},{29,63,122},{28,63,20},{31,63,25},{31,63,25},{31,63,25},{30,63,18},{31,62,17},{30,63,18},{30,63,9},{29,63,1},{31,62,22},{29,63,1},{30,63,115},{30,63,115},{30,63,115},{30,63,99},{30,63,106},{29,63,62},{29,63,62}, +{29,63,2},{29,63,86},{28,63,20},{31,63,25},{31,63,25},{31,63,25},{30,63,18},{31,61,13},{30,63,9},{30,63,9},{29,63,1},{31,62,13},{29,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{30,0,90},{30,0,90},{30,0,90},{30,0,90},{29,63,26},{29,63,26},{29,63,26},{29,63,2},{28,63,20}, +{28,63,20},{0,13,200},{0,10,52},{0,7,2},{0,6,61},{0,9,441},{0,7,308},{0,5,139},{0,4,318},{0,5,491},{0,4,354},{0,13,200},{0,10,52},{0,7,2},{0,6,61},{2,2,441},{0,7,308},{0,5,139},{0,4,318},{2,3,441},{0,4,318},{0,6,0},{0,6,0},{0,6,0},{0,4,1},{0,3,41},{0,3,20},{0,3,20},{0,2,26},{0,2,50},{0,1,30},{0,6,0}, +{0,6,0},{0,6,0},{0,4,1},{1,0,41},{0,3,20},{0,3,20},{0,2,26},{1,1,41},{0,2,26},{3,3,200},{0,10,52},{0,7,2},{0,6,61},{3,3,200},{4,3,200},{0,6,61},{0,5,202},{4,3,200},{0,5,202},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,18,200},{0,14,20},{0,10,13}, +{0,9,26},{0,12,686},{0,9,419},{0,8,178},{0,5,442},{0,7,789},{0,5,491},{0,18,200},{0,14,20},{0,10,13},{0,9,26},{3,2,686},{0,9,419},{0,8,178},{0,5,442},{6,0,686},{0,5,442},{0,11,1},{0,11,1},{0,11,1},{0,7,0},{0,6,145},{0,5,74},{0,5,74},{0,3,74},{0,3,165},{0,3,90},{0,11,1},{0,11,1},{0,11,1},{0,7,0},{1,2,145}, +{0,5,74},{0,5,74},{0,3,74},{3,0,145},{0,3,74},{5,1,200},{0,14,20},{1,9,2},{0,9,26},{5,1,200},{9,0,200},{0,9,26},{0,7,202},{9,0,200},{0,7,202},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,23,251},{0,17,53},{1,12,78},{0,11,54},{0,17,724},{0,13,362},{0,11,86}, +{0,8,387},{0,9,932},{0,7,498},{1,20,201},{1,16,21},{1,12,14},{1,11,27},{4,4,723},{0,13,362},{0,11,86},{0,8,387},{7,2,723},{0,8,387},{0,17,49},{0,17,49},{0,17,49},{0,10,49},{0,11,162},{0,9,45},{0,9,45},{0,5,50},{0,5,243},{0,5,99},{1,13,2},{1,13,2},{1,13,2},{1,9,1},{3,1,162},{0,9,45},{0,9,45},{0,5,50},{3,3,162}, +{0,5,50},{7,0,200},{0,17,4},{2,11,2},{0,11,5},{7,0,200},{10,2,200},{0,11,5},{0,9,202},{10,2,200},{0,9,202},{0,0,49},{0,0,49},{0,0,49},{0,0,49},{0,5,0},{0,5,0},{0,5,0},{0,3,0},{0,2,13},{0,2,13},{1,25,315},{1,19,117},{1,14,171},{1,13,118},{0,23,723},{0,16,299},{0,13,18},{0,10,318},{0,12,1087},{0,9,516},{2,22,201}, +{2,17,21},{2,14,14},{2,13,27},{5,6,723},{0,16,299},{0,13,18},{0,10,318},{8,4,723},{0,10,318},{1,19,113},{1,19,113},{1,19,113},{1,12,113},{0,16,162},{0,13,17},{0,13,17},{0,8,26},{0,8,338},{0,7,129},{2,15,2},{2,15,2},{2,15,2},{2,11,1},{3,6,162},{0,13,17},{0,13,17},{0,8,26},{8,0,162},{0,8,26},{7,5,200},{1,19,4},{3,13,2}, +{0,13,2},{7,5,200},{14,0,200},{0,13,2},{0,11,202},{14,0,200},{0,11,202},{1,0,113},{1,0,113},{1,0,113},{1,0,113},{0,10,0},{0,10,0},{0,10,0},{0,6,0},{0,5,58},{0,5,58},{2,28,408},{2,22,210},{2,16,281},{2,15,213},{0,29,739},{0,20,260},{0,16,29},{0,13,280},{0,15,1143},{0,12,464},{3,25,200},{3,21,16},{3,16,18},{3,15,20},{7,5,723}, +{0,20,244},{0,16,13},{0,13,264},{14,0,723},{0,13,264},{2,21,209},{2,21,209},{2,21,209},{2,14,209},{1,19,178},{0,17,18},{0,17,18},{0,10,21},{0,12,376},{0,9,121},{3,18,0},{3,18,0},{3,18,0},{3,13,1},{6,2,162},{0,17,2},{0,17,2},{0,10,5},{11,0,162},{0,10,5},{10,1,200},{2,22,2},{4,15,5},{2,15,5},{10,1,200},{17,0,200},{2,15,5}, +{0,13,200},{17,0,200},{0,13,200},{2,0,208},{2,0,208},{2,0,208},{2,0,208},{1,13,16},{1,13,16},{1,13,16},{1,8,17},{0,8,80},{0,8,80},{3,30,408},{3,24,210},{3,18,281},{3,17,213},{1,31,739},{1,22,260},{2,17,27},{1,15,280},{0,19,1000},{0,14,322},{4,26,201},{4,22,21},{4,18,14},{4,17,27},{10,0,723},{0,23,212},{2,17,11},{0,15,225},{15,2,723}, +{0,15,225},{3,23,209},{3,23,209},{3,23,209},{3,16,209},{2,21,178},{1,19,18},{1,19,18},{1,12,21},{0,15,294},{0,12,44},{4,19,2},{4,19,2},{4,19,2},{4,15,2},{8,0,162},{1,19,2},{1,19,2},{0,13,4},{11,3,162},{0,13,4},{11,3,200},{3,24,2},{5,17,2},{2,17,2},{11,3,200},{18,2,200},{2,17,2},{0,15,200},{18,2,200},{0,15,200},{3,0,208}, +{3,0,208},{3,0,208},{3,0,208},{2,15,16},{2,15,16},{2,15,16},{2,10,17},{0,12,40},{0,12,40},{4,31,420},{4,26,222},{4,20,276},{4,19,223},{3,29,740},{2,24,260},{3,19,27},{2,16,270},{0,23,920},{0,16,234},{5,28,201},{5,24,21},{5,20,14},{5,19,27},{11,2,723},{0,27,200},{3,19,11},{0,17,211},{16,4,723},{0,17,211},{4,25,218},{4,25,218},{4,25,218}, +{4,18,218},{3,23,178},{2,21,18},{2,21,18},{2,14,21},{0,19,228},{0,15,17},{5,21,2},{5,21,2},{5,21,2},{5,17,1},{9,2,162},{2,21,2},{2,21,2},{1,15,4},{16,0,162},{1,15,4},{13,1,200},{3,28,2},{6,19,2},{3,19,2},{13,1,200},{19,4,200},{3,19,2},{0,17,202},{19,4,200},{0,17,202},{4,0,218},{4,0,218},{4,0,218},{4,0,218},{3,17,16}, +{3,17,16},{3,17,16},{3,12,17},{0,15,13},{0,15,13},{5,33,420},{5,28,222},{5,22,276},{5,21,223},{3,34,740},{3,26,260},{3,22,29},{3,18,270},{0,25,844},{0,19,202},{6,30,201},{6,26,21},{6,22,14},{6,21,27},{12,4,723},{1,29,200},{3,22,13},{0,19,202},{22,0,723},{0,19,202},{5,27,218},{5,27,218},{5,27,218},{5,20,218},{3,28,178},{3,23,18},{3,23,18}, +{3,16,18},{0,22,195},{1,17,17},{6,23,2},{6,23,2},{6,23,2},{6,19,1},{11,1,162},{3,23,2},{3,23,2},{3,16,2},{17,2,162},{3,16,2},{15,0,200},{5,28,4},{7,21,2},{4,21,2},{15,0,200},{24,1,200},{4,21,2},{0,19,202},{24,1,200},{0,19,202},{5,0,218},{5,0,218},{5,0,218},{5,0,218},{3,22,16},{3,22,16},{3,22,16},{3,16,17},{0,19,0}, +{0,19,0},{6,36,408},{6,30,210},{6,24,276},{6,23,213},{4,37,739},{4,28,260},{4,24,24},{4,21,280},{0,29,780},{1,21,202},{7,33,200},{7,29,17},{7,24,13},{7,23,20},{15,0,723},{2,31,203},{4,24,8},{1,21,201},{24,1,723},{1,21,201},{6,29,209},{6,29,209},{6,29,209},{6,22,209},{5,27,178},{4,25,17},{4,25,17},{4,18,21},{0,26,168},{2,19,14},{7,26,0}, +{7,26,0},{7,26,0},{7,21,1},{13,0,162},{4,25,1},{4,25,1},{3,19,4},{20,2,162},{3,19,4},{16,2,200},{6,30,2},{8,23,5},{6,23,5},{16,2,200},{27,1,200},{6,23,5},{0,21,200},{27,1,200},{0,21,200},{6,0,208},{6,0,208},{6,0,208},{6,0,208},{5,21,16},{5,21,16},{5,21,16},{5,16,17},{1,21,2},{1,21,2},{7,38,408},{7,32,210},{7,26,276}, +{7,25,213},{5,39,739},{5,30,260},{5,26,24},{5,23,280},{0,33,749},{2,23,202},{8,34,201},{8,30,19},{8,26,14},{8,25,21},{16,1,723},{3,33,202},{5,26,8},{2,23,201},{25,3,723},{2,23,201},{7,31,209},{7,31,209},{7,31,209},{7,24,209},{6,29,178},{5,27,17},{5,27,17},{5,20,21},{0,30,164},{3,21,14},{8,28,1},{8,28,1},{8,28,1},{8,23,2},{14,2,162}, +{5,27,1},{5,27,1},{4,21,4},{24,0,162},{4,21,4},{17,4,200},{7,32,2},{9,25,5},{7,25,5},{17,4,200},{27,4,200},{7,25,5},{0,23,200},{27,4,200},{0,23,200},{7,0,208},{7,0,208},{7,0,208},{7,0,208},{6,23,16},{6,23,16},{6,23,16},{6,18,17},{2,23,2},{2,23,2},{8,39,420},{8,34,222},{8,28,286},{8,27,223},{6,41,739},{6,32,260},{6,28,24}, +{6,25,280},{0,36,725},{3,25,202},{9,36,201},{9,32,21},{9,28,14},{9,27,21},{18,0,723},{4,35,200},{6,28,8},{3,25,201},{30,0,723},{3,25,201},{8,33,218},{8,33,218},{8,33,218},{8,26,219},{7,31,178},{6,29,17},{6,29,17},{6,22,21},{2,30,168},{4,23,17},{9,30,1},{9,30,1},{9,30,1},{9,25,2},{16,0,162},{6,29,1},{6,29,1},{5,23,4},{26,1,162}, +{5,23,4},{18,6,200},{7,36,2},{10,27,5},{8,27,5},{18,6,200},{28,6,200},{8,27,5},{0,25,200},{28,6,200},{0,25,200},{8,0,218},{8,0,218},{8,0,218},{8,0,218},{7,25,16},{7,25,16},{7,25,16},{7,20,17},{3,25,2},{3,25,2},{9,41,420},{9,36,222},{9,30,286},{9,29,223},{7,43,739},{7,34,260},{7,30,24},{7,27,280},{1,38,725},{4,27,201},{10,38,201}, +{10,34,21},{10,30,14},{10,29,21},{19,2,723},{5,37,200},{7,30,8},{4,27,201},{31,2,723},{4,27,201},{9,35,218},{9,35,218},{9,35,218},{9,28,219},{7,36,178},{7,31,17},{7,31,17},{7,24,21},{2,33,165},{5,25,17},{10,31,2},{10,31,2},{10,31,2},{10,27,2},{17,2,162},{7,31,1},{7,31,1},{6,25,4},{27,3,162},{6,25,4},{21,1,200},{9,36,4},{11,29,5}, +{9,29,5},{21,1,200},{29,8,200},{9,29,5},{0,27,200},{29,8,200},{0,27,200},{9,0,218},{9,0,218},{9,0,218},{9,0,218},{7,30,16},{7,30,16},{7,30,16},{7,24,17},{4,27,1},{4,27,1},{10,44,408},{10,38,210},{10,32,276},{10,31,217},{8,45,739},{8,36,260},{8,32,24},{8,29,267},{2,41,727},{5,29,207},{11,41,200},{11,37,17},{11,32,13},{11,31,18},{21,1,723}, +{6,39,203},{8,32,8},{6,29,203},{29,8,723},{6,29,203},{10,37,209},{10,37,209},{10,37,209},{10,31,208},{9,35,178},{8,33,17},{8,33,17},{8,27,21},{3,36,165},{6,27,18},{11,34,0},{11,34,0},{11,34,0},{11,30,1},{19,1,162},{8,33,1},{8,33,1},{7,27,2},{29,4,162},{7,27,2},{23,0,200},{10,38,2},{12,32,8},{9,32,5},{23,0,200},{31,9,200},{9,32,5}, +{0,29,202},{31,9,200},{0,29,202},{10,0,208},{10,0,208},{10,0,208},{10,0,208},{9,29,16},{9,29,16},{9,29,16},{9,25,16},{5,30,2},{5,30,2},{11,46,408},{11,40,210},{11,34,276},{11,33,213},{9,47,739},{9,38,260},{9,34,24},{9,31,267},{3,43,727},{6,31,207},{12,42,203},{12,38,19},{12,34,14},{12,33,21},{22,3,723},{7,41,203},{9,34,8},{7,31,203},{30,10,723}, +{7,31,203},{11,39,209},{11,39,209},{11,39,209},{11,32,209},{10,37,178},{9,35,17},{9,35,17},{9,29,21},{4,38,164},{7,29,18},{12,36,1},{12,36,1},{12,36,1},{12,31,2},{20,3,162},{9,35,1},{9,35,1},{8,29,2},{30,6,162},{8,29,2},{24,2,200},{11,40,2},{13,33,5},{11,33,5},{24,2,200},{27,17,200},{11,33,5},{0,31,202},{27,17,200},{0,31,202},{11,0,208}, +{11,0,208},{11,0,208},{11,0,208},{10,31,16},{10,31,16},{10,31,16},{10,27,16},{6,32,2},{6,32,2},{12,47,420},{12,42,220},{12,36,286},{12,35,223},{10,49,739},{10,40,260},{10,36,24},{10,33,280},{3,46,727},{7,33,202},{13,44,203},{13,40,19},{13,36,14},{13,35,21},{24,1,723},{8,43,202},{10,36,8},{7,33,201},{31,12,723},{7,33,201},{12,41,218},{12,41,218},{12,41,218}, +{12,34,219},{11,39,178},{10,37,17},{10,37,17},{10,31,21},{5,40,164},{8,31,21},{13,38,1},{13,38,1},{13,38,1},{13,33,2},{21,5,162},{10,37,1},{10,37,1},{9,31,2},{31,8,162},{9,31,2},{25,4,200},{12,42,2},{14,35,5},{12,35,5},{25,4,200},{28,19,200},{12,35,5},{0,33,200},{28,19,200},{0,33,200},{12,0,218},{12,0,218},{12,0,218},{12,0,218},{11,33,16}, +{11,33,16},{11,33,16},{11,29,16},{7,33,2},{7,33,2},{13,49,420},{13,44,220},{13,38,286},{13,37,223},{11,51,739},{11,42,260},{11,38,24},{11,35,280},{4,48,729},{8,35,201},{14,46,203},{14,42,19},{14,38,14},{14,37,21},{26,0,723},{9,45,202},{11,38,8},{8,35,201},{31,15,723},{8,35,201},{13,43,218},{13,43,218},{13,43,218},{13,36,219},{11,44,178},{11,39,17},{11,39,17}, +{11,32,21},{6,42,164},{9,33,17},{14,40,1},{14,40,1},{14,40,1},{14,35,2},{24,0,162},{11,39,1},{11,39,1},{10,33,4},{31,11,162},{10,33,4},{26,6,200},{13,44,2},{15,37,5},{13,37,5},{26,6,200},{29,21,200},{13,37,5},{0,35,200},{29,21,200},{0,35,200},{13,0,218},{13,0,218},{13,0,218},{13,0,218},{11,38,16},{11,38,16},{11,38,16},{11,32,17},{8,35,1}, +{8,35,1},{14,52,408},{14,46,212},{14,41,282},{14,39,217},{12,53,739},{12,44,259},{12,40,27},{12,37,267},{6,49,727},{9,37,207},{15,49,200},{15,44,20},{15,40,17},{15,39,18},{26,6,723},{10,48,203},{12,40,11},{10,37,203},{29,21,723},{10,37,203},{14,46,208},{14,46,208},{14,46,208},{14,39,208},{13,43,178},{12,41,18},{12,41,18},{12,35,21},{7,44,163},{10,35,18},{15,42,1}, +{15,42,1},{15,42,1},{15,38,1},{24,6,162},{12,41,2},{12,41,2},{11,35,2},{29,17,162},{11,35,2},{28,5,200},{13,48,2},{16,40,5},{13,40,1},{28,5,200},{31,22,200},{13,40,1},{0,37,202},{31,22,200},{0,37,202},{14,0,208},{14,0,208},{14,0,208},{14,0,208},{13,37,16},{13,37,16},{13,37,16},{13,33,16},{9,38,2},{9,38,2},{15,54,408},{15,48,210},{15,43,282}, +{15,41,217},{13,55,739},{13,46,259},{13,42,27},{13,39,267},{7,51,727},{10,39,207},{16,50,203},{16,47,18},{16,42,11},{16,41,26},{29,1,723},{11,49,203},{13,42,11},{11,39,203},{30,23,723},{11,39,203},{15,47,209},{15,47,209},{15,47,209},{15,41,208},{14,45,178},{13,43,18},{13,43,18},{13,37,21},{8,46,164},{11,37,18},{16,44,1},{16,44,1},{16,44,1},{16,39,2},{27,1,162}, +{13,43,2},{13,43,2},{12,37,2},{30,19,162},{12,37,2},{31,0,200},{15,48,2},{17,42,5},{14,42,1},{31,0,200},{28,29,200},{14,42,1},{0,39,202},{28,29,200},{0,39,202},{15,0,208},{15,0,208},{15,0,208},{15,0,208},{14,39,16},{14,39,16},{14,39,16},{14,35,16},{10,40,2},{10,40,2},{16,56,418},{16,50,220},{16,44,283},{16,43,228},{14,57,739},{14,48,260},{14,44,27}, +{14,41,267},{7,54,727},{11,41,207},{17,52,203},{17,48,19},{17,44,11},{17,43,26},{30,3,723},{12,51,202},{14,44,11},{12,41,203},{31,25,723},{12,41,203},{16,49,218},{16,49,218},{16,49,218},{16,43,219},{15,47,178},{14,45,18},{14,45,18},{14,39,21},{9,48,164},{12,39,21},{17,46,1},{17,46,1},{17,46,1},{17,41,2},{28,3,162},{14,45,2},{14,45,2},{13,39,2},{31,21,162}, +{13,39,2},{30,9,200},{16,50,2},{18,44,5},{15,44,1},{30,9,200},{29,31,200},{15,44,1},{0,41,202},{29,31,200},{0,41,202},{16,0,218},{16,0,218},{16,0,218},{16,0,218},{15,41,16},{15,41,16},{15,41,16},{15,37,16},{11,42,2},{11,42,2},{17,58,418},{17,52,220},{17,46,283},{17,45,228},{15,59,739},{15,50,260},{15,46,27},{15,43,267},{8,56,724},{12,43,206},{18,54,203}, +{18,50,19},{18,46,11},{18,45,26},{31,5,723},{13,53,202},{15,46,11},{13,43,203},{31,28,723},{13,43,203},{17,51,218},{17,51,218},{17,51,218},{17,45,219},{15,52,178},{15,47,18},{15,47,18},{15,41,21},{10,50,164},{13,41,21},{18,48,1},{18,48,1},{18,48,1},{18,43,2},{29,5,162},{15,47,2},{15,47,2},{14,41,2},{31,24,162},{14,41,2},{31,11,200},{17,52,2},{19,46,5}, +{16,46,1},{31,11,200},{29,34,200},{16,46,1},{0,43,202},{29,34,200},{0,43,202},{17,0,218},{17,0,218},{17,0,218},{17,0,218},{15,46,17},{15,46,17},{15,46,17},{15,40,16},{12,44,2},{12,44,2},{18,60,410},{18,54,212},{18,49,282},{18,48,218},{17,58,739},{16,52,259},{16,48,27},{16,45,273},{10,57,724},{13,46,208},{19,57,200},{19,52,20},{19,48,17},{19,47,25},{31,11,723}, +{14,56,203},{16,48,11},{14,45,208},{29,34,723},{14,45,208},{18,54,208},{18,54,208},{18,54,208},{18,47,208},{17,51,178},{16,49,18},{16,49,18},{16,43,20},{11,52,163},{14,44,24},{19,50,1},{19,50,1},{19,50,1},{19,46,0},{31,4,162},{16,49,2},{16,49,2},{15,43,4},{30,29,162},{15,43,4},{30,20,200},{18,54,4},{20,48,5},{17,48,1},{30,20,200},{31,35,200},{17,48,1}, +{0,45,208},{31,35,200},{0,45,208},{18,0,208},{18,0,208},{18,0,208},{18,0,208},{17,45,17},{17,45,17},{17,45,17},{17,41,16},{13,46,0},{13,46,0},{19,62,410},{19,56,212},{19,51,282},{19,49,217},{18,60,739},{17,54,259},{17,50,27},{17,47,273},{11,59,724},{14,47,218},{20,59,201},{20,55,18},{20,50,11},{20,49,26},{31,16,723},{15,58,203},{17,50,11},{15,47,208},{30,36,723}, +{15,47,208},{19,56,208},{19,56,208},{19,56,208},{19,49,208},{18,53,178},{17,51,18},{17,51,18},{17,45,20},{12,54,164},{15,46,24},{20,52,1},{20,52,1},{20,52,1},{20,48,2},{30,13,162},{17,51,2},{17,51,2},{16,45,1},{31,31,162},{16,45,1},{31,22,200},{19,56,4},{21,50,5},{18,50,1},{31,22,200},{28,42,200},{18,50,1},{0,47,208},{28,42,200},{0,47,208},{19,0,208}, +{19,0,208},{19,0,208},{19,0,208},{18,47,17},{18,47,17},{18,47,17},{18,43,16},{14,48,2},{14,48,2},{20,63,426},{20,58,223},{20,52,283},{20,51,228},{19,62,739},{18,56,259},{18,52,27},{18,49,267},{12,61,727},{15,49,207},{21,61,201},{21,57,18},{21,52,11},{21,51,26},{31,21,723},{16,60,203},{18,52,11},{16,49,203},{31,38,723},{16,49,203},{20,57,219},{20,57,219},{20,57,219}, +{20,51,219},{19,55,178},{18,53,18},{18,53,18},{18,47,20},{13,56,164},{16,47,17},{21,54,1},{21,54,1},{21,54,1},{21,49,2},{31,15,162},{18,53,2},{18,53,2},{17,47,1},{31,34,162},{17,47,1},{31,27,200},{19,60,4},{22,52,5},{19,52,1},{31,27,200},{29,44,200},{19,52,1},{0,49,202},{29,44,200},{0,49,202},{20,0,218},{20,0,218},{20,0,218},{20,0,218},{19,49,16}, +{19,49,16},{19,49,16},{19,45,16},{15,50,2},{15,50,2},{21,63,468},{21,60,223},{21,54,283},{21,53,228},{20,63,749},{19,58,259},{19,54,27},{19,51,267},{13,63,727},{16,51,206},{22,63,201},{22,59,18},{22,54,11},{22,53,26},{30,30,723},{17,62,203},{19,54,11},{17,51,203},{31,41,723},{17,51,203},{21,59,219},{21,59,219},{21,59,219},{21,53,219},{19,60,180},{19,55,18},{19,55,18}, +{19,49,21},{14,58,164},{17,49,21},{22,56,1},{22,56,1},{22,56,1},{22,51,2},{31,20,162},{19,55,2},{19,55,2},{18,49,2},{31,37,162},{18,49,2},{31,32,200},{20,62,1},{23,54,5},{20,54,1},{31,32,200},{30,46,200},{20,54,1},{0,51,202},{30,46,200},{0,51,202},{21,0,218},{21,0,218},{21,0,218},{21,0,218},{19,54,17},{19,54,17},{19,54,17},{19,48,16},{16,52,2}, +{16,52,2},{22,63,570},{22,63,209},{22,57,288},{22,56,212},{21,63,804},{20,61,254},{20,56,33},{20,53,273},{15,63,753},{17,54,208},{23,63,232},{23,61,13},{23,56,16},{23,55,25},{31,32,723},{19,62,212},{20,56,17},{18,53,208},{30,46,723},{18,53,208},{22,62,208},{22,62,208},{22,62,208},{22,55,208},{20,63,178},{20,57,17},{20,57,17},{20,51,20},{15,60,163},{18,52,24},{23,59,0}, +{23,59,0},{23,59,0},{23,54,0},{31,26,162},{20,57,1},{20,57,1},{19,51,4},{30,42,162},{19,51,4},{31,38,200},{22,63,1},{24,56,1},{21,56,1},{31,38,200},{31,48,200},{21,56,1},{0,53,208},{31,48,200},{0,53,208},{22,0,208},{22,0,208},{22,0,208},{22,0,208},{20,57,16},{20,57,16},{20,57,16},{21,49,16},{17,54,0},{17,54,0},{23,63,696},{23,63,237},{23,59,288}, +{23,58,212},{23,63,888},{21,63,254},{21,58,33},{21,55,273},{17,63,824},{18,56,208},{24,63,273},{24,62,21},{24,58,17},{24,57,26},{30,41,723},{20,63,233},{21,58,17},{19,55,208},{29,50,723},{19,55,208},{23,63,212},{23,63,212},{23,63,212},{23,57,208},{22,61,180},{21,59,17},{21,59,17},{21,53,20},{16,62,163},{19,54,24},{24,60,2},{24,60,2},{24,60,2},{24,56,2},{31,31,162}, +{21,59,1},{21,59,1},{20,53,1},{31,44,162},{20,53,1},{30,47,200},{24,62,20},{25,58,1},{22,58,1},{30,47,200},{31,51,200},{22,58,1},{0,55,208},{31,51,200},{0,55,208},{23,0,208},{23,0,208},{23,0,208},{23,0,208},{21,59,16},{21,59,16},{21,59,16},{22,51,16},{18,56,0},{18,56,0},{25,63,804},{24,63,334},{24,61,283},{24,60,227},{24,63,957},{22,63,297},{22,60,33}, +{22,57,273},{20,63,913},{19,58,208},{26,63,313},{25,63,51},{25,60,17},{25,59,26},{31,43,723},{22,63,281},{22,60,17},{19,58,208},{30,52,723},{19,58,208},{24,63,234},{24,63,234},{24,63,234},{24,59,218},{23,63,180},{22,61,17},{22,61,17},{22,55,20},{18,62,171},{20,55,17},{25,62,2},{25,62,2},{25,62,2},{25,58,2},{31,36,162},{22,61,1},{22,61,1},{21,55,1},{31,47,162}, +{21,55,1},{30,52,200},{25,63,50},{26,60,1},{23,60,1},{30,52,200},{28,58,200},{23,60,1},{0,57,208},{28,58,200},{0,57,208},{24,0,218},{24,0,218},{24,0,218},{24,0,218},{22,61,16},{22,61,16},{22,61,16},{23,53,16},{19,58,0},{19,58,0},{26,63,930},{25,63,492},{25,63,283},{25,62,227},{25,63,1068},{24,63,389},{23,62,33},{23,59,273},{21,63,999},{20,60,209},{27,63,379}, +{26,63,149},{26,62,17},{26,61,26},{31,48,723},{24,63,364},{24,62,16},{20,60,208},{31,54,723},{20,60,208},{25,63,267},{25,63,267},{25,63,267},{25,61,218},{24,63,205},{23,63,17},{23,63,17},{23,57,20},{20,63,189},{21,57,17},{26,63,5},{26,63,5},{26,63,5},{26,60,2},{30,45,162},{23,63,1},{23,63,1},{22,57,1},{31,50,162},{22,57,1},{31,54,200},{27,63,90},{27,62,1}, +{24,62,0},{31,54,200},{29,60,200},{24,62,0},{0,59,208},{29,60,200},{0,59,208},{25,0,218},{25,0,218},{25,0,218},{25,0,218},{23,63,16},{23,63,16},{23,63,16},{23,56,17},{20,60,1},{20,60,1},{27,63,877},{26,63,585},{26,63,329},{26,63,209},{26,63,990},{25,63,397},{25,63,36},{24,61,165},{23,63,910},{22,61,122},{28,63,306},{28,63,162},{27,63,36},{27,63,4},{30,56,546}, +{26,63,306},{25,63,20},{22,61,113},{30,58,546},{22,61,113},{26,63,329},{26,63,329},{26,63,329},{26,63,209},{25,63,276},{25,63,36},{25,63,36},{24,59,18},{22,63,230},{22,60,22},{27,63,36},{27,63,36},{27,63,36},{27,62,0},{29,54,162},{25,63,20},{25,63,20},{24,59,2},{29,56,162},{24,59,2},{31,58,113},{29,63,61},{28,63,0},{26,63,1},{31,58,113},{31,60,113},{26,63,1}, +{0,61,113},{31,60,113},{0,61,113},{26,0,208},{26,0,208},{26,0,208},{26,0,208},{25,62,16},{25,62,16},{25,62,16},{25,57,17},{21,62,1},{21,62,1},{28,63,731},{27,63,573},{27,63,404},{27,63,244},{27,63,797},{26,63,354},{26,63,98},{25,62,57},{25,63,737},{23,62,38},{29,63,190},{29,63,126},{28,63,65},{28,63,5},{31,56,333},{28,63,185},{27,63,52},{24,62,26},{30,60,333}, +{24,62,26},{27,63,404},{27,63,404},{27,63,404},{27,63,244},{27,63,356},{26,63,98},{26,63,98},{25,61,18},{24,63,315},{23,62,22},{28,63,65},{28,63,65},{28,63,65},{28,63,5},{30,56,162},{27,63,52},{27,63,52},{25,61,2},{30,58,162},{25,61,2},{31,61,25},{30,63,13},{30,63,4},{29,63,1},{31,61,25},{31,62,25},{29,63,1},{0,62,25},{31,62,25},{0,62,25},{27,0,208}, +{27,0,208},{27,0,208},{27,0,208},{26,63,17},{26,63,17},{26,63,17},{26,59,17},{23,63,9},{23,63,9},{29,63,642},{28,63,524},{28,63,443},{28,63,299},{28,63,623},{28,63,335},{27,63,201},{26,63,17},{27,63,610},{24,63,26},{30,63,131},{30,63,115},{29,63,101},{29,63,37},{31,59,193},{29,63,121},{28,63,85},{26,63,1},{30,62,193},{26,63,1},{28,63,443},{28,63,443},{28,63,443}, +{28,63,299},{28,63,398},{27,63,201},{27,63,201},{26,63,17},{26,63,378},{24,63,26},{29,63,101},{29,63,101},{29,63,101},{29,63,37},{31,57,145},{28,63,85},{28,63,85},{26,63,1},{31,60,145},{26,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{28,0,218},{28,0,218},{28,0,218},{28,0,218},{27,63,32}, +{27,63,32},{27,63,32},{27,61,17},{24,63,26},{24,63,26},{29,63,418},{29,63,354},{29,63,318},{29,63,254},{29,63,370},{28,63,223},{28,63,142},{28,63,25},{28,63,358},{26,63,58},{30,63,51},{30,63,35},{30,63,26},{30,63,10},{31,61,54},{30,63,34},{30,63,25},{28,63,0},{31,62,54},{28,63,0},{29,63,318},{29,63,318},{29,63,318},{29,63,254},{29,63,270},{28,63,142},{28,63,142}, +{28,63,25},{27,63,249},{26,63,58},{30,63,26},{30,63,26},{30,63,26},{30,63,10},{31,60,41},{30,63,25},{30,63,25},{28,63,0},{31,61,41},{28,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{29,0,218},{29,0,218},{29,0,218},{29,0,218},{28,63,61},{28,63,61},{28,63,61},{28,63,25},{26,63,58}, +{26,63,58},{0,18,421},{0,15,106},{0,10,8},{0,9,117},{0,12,925},{0,9,650},{0,9,286},{0,6,670},{0,7,1030},{0,5,726},{0,18,421},{0,15,106},{0,10,8},{0,9,117},{3,2,925},{0,9,650},{0,9,286},{0,6,670},{6,0,925},{0,6,670},{0,9,0},{0,9,0},{0,9,0},{0,5,1},{0,4,85},{0,4,45},{0,4,45},{0,2,50},{0,2,98},{0,2,59},{0,9,0}, +{0,9,0},{0,9,0},{0,5,1},{1,1,85},{0,4,45},{0,4,45},{0,2,50},{2,0,85},{0,2,50},{5,1,421},{0,15,106},{0,10,8},{0,9,117},{5,1,421},{9,0,421},{0,9,117},{0,7,421},{9,0,421},{0,7,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,24,421},{0,19,53},{0,13,8}, +{0,11,72},{0,16,1261},{0,12,805},{0,11,328},{0,7,822},{0,9,1438},{0,7,922},{0,24,421},{0,19,53},{0,13,8},{0,11,72},{3,6,1261},{0,12,805},{0,11,328},{0,7,822},{8,0,1261},{0,7,822},{0,14,0},{0,14,0},{0,14,0},{0,8,1},{0,7,221},{0,7,116},{0,7,116},{0,4,125},{0,4,257},{0,3,146},{0,14,0},{0,14,0},{0,14,0},{0,8,1},{2,0,221}, +{0,7,116},{0,7,116},{0,4,125},{3,1,221},{0,4,125},{7,0,421},{0,19,53},{1,12,8},{0,11,72},{7,0,421},{11,1,421},{0,11,72},{0,9,421},{11,1,421},{0,9,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,29,430},{0,22,34},{0,15,62},{0,14,49},{0,20,1514},{0,15,866},{0,13,301}, +{0,9,894},{0,11,1797},{0,9,1063},{0,29,430},{0,22,34},{1,15,33},{0,14,49},{6,0,1514},{0,15,866},{0,13,301},{0,9,894},{10,0,1514},{0,9,894},{0,19,10},{0,19,10},{0,19,10},{0,12,10},{0,11,338},{0,9,149},{0,9,149},{0,5,162},{0,5,419},{0,5,211},{0,19,10},{0,19,10},{0,19,10},{0,12,10},{3,1,338},{0,9,149},{0,9,149},{0,5,162},{3,3,338}, +{0,5,162},{8,2,421},{0,22,25},{2,14,8},{0,14,40},{8,2,421},{14,0,421},{0,14,40},{0,11,421},{14,0,421},{0,11,421},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,2,0},{0,2,0},{0,2,0},{0,1,1},{0,1,2},{0,1,2},{1,31,494},{1,24,98},{1,17,131},{1,16,110},{0,25,1517},{0,19,734},{0,15,157},{0,11,789},{0,14,1982},{0,11,1045},{1,31,430}, +{1,24,34},{2,16,35},{1,16,46},{7,2,1514},{0,19,734},{0,15,157},{0,11,789},{11,2,1514},{0,11,789},{1,21,74},{1,21,74},{1,21,74},{1,14,74},{0,16,338},{0,13,89},{0,13,89},{0,8,106},{0,8,514},{0,7,217},{1,21,10},{1,21,10},{1,21,10},{1,14,10},{3,6,338},{0,13,89},{0,13,89},{0,8,106},{8,0,338},{0,8,106},{10,0,421},{0,26,5},{3,16,5}, +{0,16,10},{10,0,421},{17,0,421},{0,16,10},{0,13,421},{17,0,421},{0,13,421},{1,0,73},{1,0,73},{1,0,73},{1,0,73},{0,7,1},{0,7,1},{0,7,1},{0,4,1},{0,3,32},{0,3,32},{1,37,629},{1,28,213},{2,19,340},{1,18,216},{0,31,1517},{0,23,629},{0,18,54},{0,14,686},{0,17,2187},{0,13,1070},{3,30,437},{2,27,33},{3,19,29},{2,18,45},{9,1,1514}, +{0,23,629},{0,18,54},{0,14,686},{13,3,1514},{0,14,686},{1,27,209},{1,27,209},{1,27,209},{1,17,208},{0,22,338},{0,17,34},{0,17,34},{0,11,53},{0,11,666},{0,9,273},{3,21,16},{3,21,16},{3,21,16},{3,15,16},{6,2,338},{0,17,34},{0,17,34},{0,11,53},{11,0,338},{0,11,53},{12,0,421},{0,30,1},{4,18,8},{0,18,5},{12,0,421},{20,0,421},{0,18,5}, +{0,15,421},{20,0,421},{0,15,421},{1,0,208},{1,0,208},{1,0,208},{1,0,208},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{0,6,106},{0,6,106},{2,39,821},{2,30,405},{2,22,557},{2,20,408},{0,36,1517},{0,25,562},{0,21,14},{0,16,589},{0,19,2445},{0,15,1130},{3,35,437},{3,29,33},{4,21,33},{3,20,45},{10,3,1514},{0,25,562},{0,21,14},{0,16,589},{18,0,1514}, +{0,16,589},{2,29,401},{2,29,401},{2,29,401},{2,19,400},{0,27,340},{0,21,10},{0,21,10},{0,13,20},{0,14,851},{0,11,357},{3,26,16},{3,26,16},{3,26,16},{3,18,16},{8,0,338},{0,21,10},{0,21,10},{0,13,20},{11,3,338},{0,13,20},{13,1,421},{1,32,2},{5,20,8},{1,20,5},{13,1,421},{21,2,421},{1,20,5},{0,17,421},{21,2,421},{0,17,421},{2,0,400}, +{2,0,400},{2,0,400},{2,0,400},{0,19,0},{0,19,0},{0,19,0},{0,11,1},{0,9,205},{0,9,205},{3,41,854},{3,32,435},{3,24,590},{3,22,441},{1,38,1518},{0,29,543},{1,23,15},{0,18,575},{0,23,2318},{0,17,906},{4,37,430},{4,30,34},{5,23,33},{4,22,49},{12,1,1514},{0,29,494},{1,23,14},{0,18,526},{19,2,1514},{0,18,526},{3,31,434},{3,31,434},{3,31,434}, +{3,21,433},{1,29,341},{1,23,11},{1,23,11},{1,15,21},{0,17,734},{0,15,230},{4,27,10},{4,27,10},{4,27,10},{4,20,10},{9,2,338},{0,25,2},{0,25,2},{0,15,5},{16,0,338},{0,15,5},{15,0,421},{3,32,2},{6,22,8},{2,22,5},{15,0,421},{25,0,421},{2,22,5},{0,19,421},{25,0,421},{0,19,421},{3,0,433},{3,0,433},{3,0,433},{3,0,433},{1,21,1}, +{1,21,1},{1,21,1},{1,13,2},{0,12,157},{0,12,157},{4,42,866},{4,34,450},{4,26,581},{4,24,458},{2,40,1518},{1,31,543},{2,25,15},{1,20,575},{0,27,2166},{0,20,706},{5,39,430},{5,32,34},{6,25,33},{5,24,49},{14,0,1514},{0,32,461},{2,25,14},{0,20,481},{20,4,1514},{0,20,481},{4,33,445},{4,33,445},{4,33,445},{4,23,445},{2,31,341},{2,25,11},{2,25,11}, +{2,17,27},{0,21,626},{0,17,102},{5,29,10},{5,29,10},{5,29,10},{5,22,10},{11,1,338},{1,27,2},{1,27,2},{0,17,2},{17,2,338},{0,17,2},{16,1,421},{3,36,2},{7,24,8},{3,24,5},{16,1,421},{27,1,421},{3,24,5},{0,21,421},{27,1,421},{0,21,421},{4,0,445},{4,0,445},{4,0,445},{4,0,445},{2,23,1},{2,23,1},{2,23,1},{2,15,2},{0,16,97}, +{0,16,97},{5,45,854},{5,36,438},{5,28,579},{5,26,446},{3,43,1514},{3,32,545},{3,27,9},{3,22,582},{0,31,2010},{0,22,546},{7,38,437},{6,35,33},{7,27,26},{6,26,50},{14,6,1514},{0,37,430},{3,27,9},{0,23,446},{26,0,1514},{0,23,446},{5,35,434},{5,35,434},{5,35,434},{5,25,434},{3,34,338},{3,27,8},{3,27,8},{3,19,20},{0,25,525},{0,19,45},{7,29,16}, +{7,29,16},{7,29,16},{7,23,16},{13,0,338},{2,29,0},{2,29,0},{1,20,4},{20,2,338},{1,20,4},{18,1,421},{4,38,1},{8,26,10},{4,27,2},{18,1,421},{29,2,421},{4,27,2},{0,23,421},{29,2,421},{0,23,421},{5,0,433},{5,0,433},{5,0,433},{5,0,433},{3,25,1},{3,25,1},{3,25,1},{3,17,1},{0,19,41},{0,19,41},{6,47,854},{6,38,438},{6,30,579}, +{6,28,446},{4,45,1515},{3,36,553},{4,29,15},{3,24,589},{0,34,1887},{0,25,450},{7,44,437},{7,37,33},{8,29,30},{7,28,50},{16,4,1514},{0,40,422},{4,29,14},{0,25,425},{27,2,1514},{0,25,425},{6,37,434},{6,37,434},{6,37,434},{6,27,434},{4,35,341},{4,29,14},{4,29,14},{4,21,21},{0,29,461},{0,22,41},{7,34,16},{7,34,16},{7,34,16},{7,26,16},{14,2,338}, +{3,31,0},{3,31,0},{2,22,4},{24,0,338},{2,22,4},{19,3,421},{5,40,1},{8,29,5},{5,29,2},{19,3,421},{30,4,421},{5,29,2},{0,25,421},{30,4,421},{0,25,421},{6,0,433},{6,0,433},{6,0,433},{6,0,433},{4,27,1},{4,27,1},{4,27,1},{4,19,2},{0,23,13},{0,23,13},{7,49,854},{7,40,438},{7,32,590},{7,30,446},{5,47,1515},{4,37,543},{5,31,15}, +{4,26,591},{0,36,1785},{0,27,422},{8,45,430},{8,38,34},{9,31,30},{8,30,43},{17,6,1514},{1,42,422},{5,31,14},{0,27,422},{28,4,1514},{0,27,422},{7,39,434},{7,39,434},{7,39,434},{7,29,434},{5,37,341},{5,31,14},{5,31,14},{5,23,21},{0,32,404},{1,24,41},{8,35,10},{8,35,10},{8,35,10},{8,28,9},{16,0,338},{4,33,2},{4,33,2},{3,24,4},{26,1,338}, +{3,24,4},{21,1,421},{6,42,1},{9,31,5},{6,31,2},{21,1,421},{31,6,421},{6,31,2},{0,27,421},{31,6,421},{0,27,421},{7,0,433},{7,0,433},{7,0,433},{7,0,433},{5,29,1},{5,29,1},{5,29,1},{5,21,2},{0,27,1},{0,27,1},{8,50,866},{8,42,450},{8,34,581},{8,32,458},{6,48,1518},{5,39,543},{6,33,15},{5,28,591},{0,40,1685},{1,29,422},{9,47,430}, +{9,40,34},{10,33,33},{9,32,49},{20,1,1514},{2,44,422},{6,33,14},{1,29,422},{29,6,1514},{1,29,422},{8,41,445},{8,41,445},{8,41,445},{8,31,446},{6,39,341},{6,33,11},{6,33,11},{6,25,21},{0,35,371},{2,26,41},{9,37,10},{9,37,10},{9,37,10},{9,30,9},{17,2,338},{5,35,2},{5,35,2},{5,25,5},{27,3,338},{5,25,5},{23,0,421},{7,44,1},{11,32,8}, +{7,32,5},{23,0,421},{31,9,421},{7,32,5},{0,29,421},{31,9,421},{0,29,421},{8,0,445},{8,0,445},{8,0,445},{8,0,445},{6,31,1},{6,31,1},{6,31,1},{6,23,2},{1,29,1},{1,29,1},{9,53,854},{9,45,437},{9,36,579},{9,34,446},{7,51,1514},{7,41,546},{7,35,9},{6,31,589},{0,44,1607},{2,31,430},{11,46,437},{10,43,36},{11,35,26},{10,34,50},{22,0,1514}, +{3,47,421},{7,35,9},{3,31,426},{31,7,1514},{3,31,426},{9,43,434},{9,43,434},{9,43,434},{9,33,434},{7,42,338},{7,35,8},{7,35,8},{7,27,18},{0,39,344},{3,29,42},{11,37,16},{11,37,16},{11,37,16},{10,32,16},{19,1,338},{6,37,0},{6,37,0},{5,28,1},{29,4,338},{5,28,1},{24,2,421},{8,46,1},{12,34,10},{8,35,2},{24,2,421},{30,14,421},{8,35,2}, +{0,31,425},{30,14,421},{0,31,425},{9,0,433},{9,0,433},{9,0,433},{9,0,433},{7,33,1},{7,33,1},{7,33,1},{7,26,1},{2,32,2},{2,32,2},{10,55,854},{10,47,437},{10,38,579},{10,36,446},{8,53,1515},{7,43,561},{8,37,15},{7,32,589},{0,47,1577},{3,33,425},{11,52,437},{11,45,36},{12,37,30},{11,36,50},{23,2,1514},{4,48,422},{8,37,14},{3,33,425},{28,14,1514}, +{3,33,425},{10,45,434},{10,45,434},{10,45,434},{10,35,434},{8,43,341},{8,37,14},{8,37,14},{8,29,19},{0,43,340},{4,30,38},{11,42,16},{11,42,16},{11,42,16},{11,34,16},{20,3,338},{7,39,0},{7,39,0},{6,30,1},{30,6,338},{6,30,1},{26,1,421},{9,48,1},{12,37,5},{9,37,2},{26,1,421},{30,17,421},{9,37,2},{0,33,421},{30,17,421},{0,33,421},{10,0,433}, +{10,0,433},{10,0,433},{10,0,433},{8,35,1},{8,35,1},{8,35,1},{8,28,2},{3,34,2},{3,34,2},{11,57,854},{11,48,438},{11,40,579},{11,38,446},{9,55,1515},{8,46,555},{9,39,15},{8,34,591},{0,51,1530},{4,35,422},{12,53,430},{12,46,34},{13,39,30},{12,38,43},{24,4,1514},{5,50,422},{9,39,14},{4,35,422},{28,17,1514},{4,35,422},{11,47,434},{11,47,434},{11,47,434}, +{11,37,434},{9,45,341},{9,39,14},{9,39,14},{9,31,19},{1,45,340},{5,32,41},{12,44,9},{12,44,9},{12,44,9},{12,36,9},{21,5,338},{8,41,1},{8,41,1},{7,32,4},{31,8,338},{7,32,4},{27,3,421},{10,50,1},{13,39,5},{10,39,2},{27,3,421},{31,19,421},{10,39,2},{0,35,421},{31,19,421},{0,35,421},{11,0,433},{11,0,433},{11,0,433},{11,0,433},{9,37,1}, +{9,37,1},{9,37,1},{9,30,2},{4,35,1},{4,35,1},{12,58,866},{12,50,450},{12,41,590},{12,40,458},{10,57,1515},{9,48,555},{10,41,15},{9,36,591},{0,54,1518},{5,37,422},{13,55,430},{13,48,34},{14,41,30},{13,40,43},{25,6,1514},{6,52,422},{10,41,14},{5,37,422},{29,19,1514},{5,37,422},{12,49,445},{12,49,445},{12,49,445},{12,39,446},{10,47,341},{10,41,14},{10,41,14}, +{10,33,21},{2,47,340},{6,34,41},{13,46,9},{13,46,9},{13,46,9},{13,38,9},{24,0,338},{9,43,1},{9,43,1},{9,33,5},{31,11,338},{9,33,5},{29,1,421},{11,52,1},{14,41,5},{11,41,2},{29,1,421},{31,22,421},{11,41,2},{0,37,421},{31,22,421},{0,37,421},{12,0,445},{12,0,445},{12,0,445},{12,0,445},{10,39,1},{10,39,1},{10,39,1},{10,31,5},{5,37,1}, +{5,37,1},{13,61,854},{13,53,437},{13,44,593},{13,43,442},{11,59,1517},{11,49,546},{11,43,13},{10,39,589},{1,57,1518},{6,39,430},{15,54,437},{14,51,36},{15,43,25},{14,42,48},{27,5,1514},{7,55,421},{11,43,13},{7,39,426},{31,20,1514},{7,39,426},{13,51,434},{13,51,434},{13,51,434},{13,42,434},{11,50,338},{11,43,13},{11,43,13},{11,35,18},{4,47,341},{7,37,42},{15,45,16}, +{15,45,16},{15,45,16},{15,39,17},{24,6,338},{10,45,1},{10,45,1},{9,36,1},{29,17,338},{9,36,1},{31,0,421},{12,54,1},{16,43,4},{12,43,0},{31,0,421},{30,27,421},{12,43,0},{0,39,425},{30,27,421},{0,39,425},{13,0,433},{13,0,433},{13,0,433},{13,0,433},{11,41,1},{11,41,1},{11,41,1},{11,34,1},{6,40,1},{6,40,1},{14,63,854},{14,55,437},{14,46,593}, +{14,45,442},{12,61,1515},{11,51,561},{12,45,19},{11,41,589},{2,59,1518},{7,41,430},{15,60,437},{15,53,36},{16,45,34},{15,44,48},{30,0,1514},{9,55,425},{12,45,18},{8,41,426},{28,27,1514},{8,41,426},{14,53,434},{14,53,434},{14,53,434},{14,44,434},{12,51,341},{12,46,17},{12,46,17},{12,37,19},{4,51,340},{8,38,38},{15,50,16},{15,50,16},{15,50,16},{15,42,17},{27,1,338}, +{11,47,1},{11,47,1},{10,38,1},{30,19,338},{10,38,1},{31,6,421},{13,56,1},{17,45,4},{13,45,0},{31,6,421},{31,29,421},{13,45,0},{0,41,425},{31,29,421},{0,41,425},{14,0,433},{14,0,433},{14,0,433},{14,0,433},{12,43,1},{12,43,1},{12,43,1},{12,36,2},{7,42,1},{7,42,1},{15,63,878},{15,57,437},{15,48,579},{15,47,442},{13,63,1515},{12,54,555},{13,47,19}, +{12,43,574},{3,61,1518},{8,43,429},{16,61,430},{16,54,34},{17,47,34},{16,46,41},{31,2,1514},{10,57,425},{13,47,18},{9,43,426},{29,29,1514},{9,43,426},{15,55,434},{15,55,434},{15,55,434},{15,46,434},{13,53,341},{13,47,19},{13,47,19},{13,39,19},{5,53,340},{9,40,38},{16,52,9},{16,52,9},{16,52,9},{16,44,10},{28,3,338},{12,49,1},{12,49,1},{11,40,1},{31,21,338}, +{11,40,1},{31,11,421},{14,58,1},{18,47,4},{14,47,0},{31,11,421},{31,32,421},{14,47,0},{0,43,425},{31,32,421},{0,43,425},{15,0,433},{15,0,433},{15,0,433},{15,0,433},{13,45,1},{13,45,1},{13,45,1},{13,38,2},{8,43,4},{8,43,4},{16,63,926},{16,58,450},{16,49,590},{16,48,458},{14,63,1542},{13,56,555},{14,49,15},{13,45,574},{4,62,1517},{9,45,429},{17,63,430}, +{17,56,34},{18,49,30},{17,48,43},{30,11,1514},{11,59,425},{14,49,14},{10,45,426},{30,31,1514},{10,45,426},{16,57,445},{16,57,445},{16,57,445},{16,47,446},{14,55,341},{14,49,14},{14,49,14},{14,41,19},{6,55,340},{10,42,38},{17,54,9},{17,54,9},{17,54,9},{17,46,10},{29,5,338},{13,51,1},{13,51,1},{12,42,1},{31,24,338},{12,42,1},{31,16,421},{15,60,1},{18,49,5}, +{15,49,2},{31,16,421},{31,35,421},{15,49,2},{0,45,425},{31,35,421},{0,45,425},{16,0,445},{16,0,445},{16,0,445},{16,0,445},{14,47,1},{14,47,1},{14,47,1},{14,40,2},{9,45,4},{9,45,4},{17,63,1034},{17,61,438},{17,52,593},{17,51,442},{16,63,1598},{15,57,554},{15,51,13},{15,47,577},{6,63,1535},{10,48,434},{19,63,437},{18,59,41},{19,51,25},{18,50,48},{29,20,1514}, +{11,63,422},{15,51,13},{11,47,433},{31,33,1514},{11,47,433},{17,60,433},{17,60,433},{17,60,433},{17,50,434},{15,58,338},{15,51,13},{15,51,13},{15,43,20},{7,57,339},{12,44,41},{19,53,16},{19,53,16},{19,53,16},{19,47,17},{31,4,338},{14,53,1},{14,53,1},{13,44,1},{30,29,338},{13,44,1},{31,22,421},{16,63,1},{20,51,4},{16,51,0},{31,22,421},{30,40,421},{16,51,0}, +{0,47,433},{30,40,421},{0,47,433},{17,0,433},{17,0,433},{17,0,433},{17,0,433},{15,49,1},{15,49,1},{15,49,1},{15,42,0},{10,48,1},{10,48,1},{18,63,1166},{18,63,438},{18,54,593},{18,53,442},{17,63,1643},{15,60,561},{16,53,19},{15,49,589},{8,63,1566},{11,49,430},{20,63,458},{19,61,41},{20,53,34},{19,52,48},{30,22,1514},{13,63,429},{16,53,18},{12,49,426},{28,40,1514}, +{12,49,426},{18,62,433},{18,62,433},{18,62,433},{18,52,434},{16,60,339},{16,54,17},{16,54,17},{16,45,26},{9,57,341},{13,46,41},{19,58,17},{19,58,17},{19,58,17},{19,50,17},{30,13,338},{15,55,1},{15,55,1},{14,46,1},{31,31,338},{14,46,1},{31,27,421},{18,63,5},{21,53,4},{17,53,0},{31,27,421},{31,42,421},{17,53,0},{0,49,425},{31,42,421},{0,49,425},{18,0,433}, +{18,0,433},{18,0,433},{18,0,433},{16,51,1},{16,51,1},{16,51,1},{16,44,1},{11,50,1},{11,50,1},{20,63,1326},{19,63,470},{19,56,593},{19,55,442},{18,63,1742},{16,62,546},{17,55,19},{16,51,574},{10,63,1638},{12,51,429},{21,63,506},{20,63,29},{21,55,34},{20,54,41},{31,24,1514},{15,63,461},{17,55,18},{13,51,426},{29,42,1514},{13,51,426},{19,63,434},{19,63,434},{19,63,434}, +{19,54,434},{17,62,339},{17,56,17},{17,56,17},{17,47,26},{10,59,341},{13,48,38},{20,60,9},{20,60,9},{20,60,9},{20,52,10},{31,15,338},{16,57,2},{16,57,2},{15,48,1},{31,34,338},{15,48,1},{31,32,421},{20,63,20},{22,55,4},{18,55,0},{31,32,421},{31,45,421},{18,55,0},{0,51,425},{31,45,421},{0,51,425},{19,0,433},{19,0,433},{19,0,433},{19,0,433},{17,53,1}, +{17,53,1},{17,53,1},{17,46,1},{12,51,4},{12,51,4},{21,63,1470},{20,63,561},{20,58,582},{20,57,461},{19,63,1895},{18,62,562},{18,57,19},{17,53,574},{12,63,1761},{13,53,429},{22,63,590},{21,63,59},{22,57,34},{21,56,41},{31,29,1514},{17,63,530},{18,57,18},{14,53,426},{30,44,1514},{14,53,426},{20,63,461},{20,63,461},{20,63,461},{20,55,446},{18,63,341},{18,58,17},{18,58,17}, +{18,49,19},{11,61,341},{14,50,38},{21,62,9},{21,62,9},{21,62,9},{21,54,10},{31,20,338},{17,59,2},{17,59,2},{16,50,1},{31,37,338},{16,50,1},{31,38,421},{21,63,50},{23,57,4},{19,57,0},{31,38,421},{31,48,421},{19,57,0},{0,53,425},{31,48,421},{0,53,425},{20,0,445},{20,0,445},{20,0,445},{20,0,445},{18,55,1},{18,55,1},{18,55,1},{18,48,2},{13,53,4}, +{13,53,4},{22,63,1674},{21,63,753},{21,60,586},{21,59,443},{21,63,2046},{19,63,629},{19,60,19},{19,55,577},{15,63,1917},{14,56,426},{24,63,674},{23,63,120},{23,60,29},{22,58,50},{31,35,1514},{19,63,629},{19,60,19},{14,56,425},{27,51,1514},{14,56,425},{21,63,497},{21,63,497},{21,63,497},{21,58,433},{19,63,388},{19,60,10},{19,60,10},{19,51,20},{12,63,347},{16,52,41},{23,61,17}, +{23,61,17},{23,61,17},{23,55,17},{31,26,338},{18,62,2},{18,62,2},{17,52,1},{30,42,338},{17,52,1},{31,44,421},{23,63,104},{24,59,5},{20,59,1},{31,44,421},{31,51,421},{20,59,1},{0,56,425},{31,51,421},{0,56,425},{21,0,433},{21,0,433},{21,0,433},{21,0,433},{19,58,0},{19,58,0},{19,58,0},{19,50,0},{14,56,1},{14,56,1},{23,63,1902},{22,63,995},{22,62,586}, +{22,61,443},{22,63,2235},{20,63,759},{20,61,15},{19,57,578},{17,63,2118},{15,58,426},{25,63,770},{24,63,250},{24,61,35},{23,60,50},{31,40,1514},{21,63,701},{20,61,14},{15,58,425},{31,49,1514},{15,58,425},{22,63,554},{22,63,554},{22,63,554},{22,60,433},{21,63,437},{20,61,14},{20,61,14},{20,53,26},{14,63,379},{17,54,41},{24,63,25},{24,63,25},{24,63,25},{23,59,17},{31,31,338}, +{19,63,4},{19,63,4},{18,54,1},{31,44,338},{18,54,1},{31,49,421},{25,63,169},{25,61,5},{21,61,1},{31,49,421},{30,56,421},{21,61,1},{0,58,425},{30,56,421},{0,58,425},{22,0,433},{22,0,433},{22,0,433},{22,0,433},{20,59,2},{20,59,2},{20,59,2},{20,52,1},{15,58,1},{15,58,1},{24,63,2045},{24,63,1233},{23,63,629},{23,63,442},{24,63,2360},{22,63,914},{21,63,14}, +{20,59,549},{19,63,2241},{16,60,401},{26,63,849},{25,63,395},{25,63,34},{24,62,41},{29,52,1459},{23,63,778},{21,63,13},{17,59,400},{28,56,1459},{17,59,400},{23,63,629},{23,63,629},{23,63,629},{23,62,433},{22,63,491},{21,63,14},{21,63,14},{21,55,26},{16,63,446},{18,56,41},{25,63,34},{25,63,34},{25,63,34},{24,60,10},{31,36,338},{21,63,13},{21,63,13},{19,56,1},{31,47,338}, +{19,56,1},{31,54,392},{27,63,218},{26,63,4},{22,63,0},{31,54,392},{29,60,392},{22,63,0},{0,59,400},{29,60,392},{0,59,400},{23,0,433},{23,0,433},{23,0,433},{23,0,433},{21,61,2},{21,61,2},{21,61,2},{21,54,1},{16,60,1},{16,60,1},{25,63,1767},{25,63,1167},{24,63,701},{24,63,449},{24,63,1976},{23,63,747},{22,63,66},{21,60,306},{20,63,1820},{17,61,217},{27,63,611}, +{26,63,317},{26,63,61},{25,63,10},{30,52,1064},{25,63,587},{23,63,41},{18,61,208},{28,58,1064},{18,61,208},{24,63,701},{24,63,701},{24,63,701},{24,63,449},{23,63,581},{22,63,66},{22,63,66},{22,57,26},{18,63,530},{19,58,41},{26,63,61},{26,63,61},{26,63,61},{25,62,10},{30,45,338},{23,63,41},{23,63,41},{20,58,1},{31,50,338},{20,58,1},{30,60,200},{28,63,106},{27,63,1}, +{25,63,1},{30,60,200},{31,59,200},{25,63,1},{0,60,208},{31,59,200},{0,60,208},{24,0,445},{24,0,445},{24,0,445},{24,0,445},{22,63,2},{22,63,2},{22,63,2},{22,56,1},{17,62,1},{17,62,1},{26,63,1542},{26,63,1122},{25,63,833},{25,63,497},{26,63,1647},{24,63,687},{24,63,203},{23,61,122},{22,63,1515},{19,62,78},{28,63,410},{28,63,266},{27,63,116},{27,63,20},{30,56,722}, +{26,63,402},{25,63,100},{20,62,65},{30,58,722},{20,62,65},{25,63,833},{25,63,833},{25,63,833},{25,63,497},{24,63,707},{24,63,203},{24,63,203},{23,60,17},{20,63,619},{19,61,46},{27,63,116},{27,63,116},{27,63,116},{27,63,20},{29,54,338},{25,63,100},{25,63,100},{22,60,2},{29,56,338},{22,60,2},{31,59,61},{29,63,37},{29,63,1},{27,63,4},{31,59,61},{31,61,61},{27,63,4}, +{0,62,65},{31,61,61},{0,62,65},{25,0,433},{25,0,433},{25,0,433},{25,0,433},{23,63,25},{23,63,25},{23,63,25},{23,58,1},{19,62,13},{19,62,13},{27,63,1406},{27,63,1134},{26,63,962},{26,63,602},{27,63,1454},{25,63,702},{25,63,341},{24,62,43},{24,63,1378},{20,63,35},{29,63,318},{28,63,250},{28,63,169},{28,63,61},{31,56,509},{28,63,313},{27,63,164},{22,63,10},{30,60,509}, +{22,63,10},{26,63,962},{26,63,962},{26,63,962},{26,63,602},{26,63,827},{25,63,341},{25,63,341},{24,62,27},{22,63,747},{20,63,35},{28,63,169},{28,63,169},{28,63,169},{28,63,61},{30,56,338},{27,63,164},{27,63,164},{23,62,2},{30,58,338},{23,62,2},{31,62,5},{31,63,9},{30,63,4},{30,63,0},{31,62,5},{31,62,9},{30,63,0},{0,63,9},{31,62,9},{0,63,9},{26,0,433}, +{26,0,433},{26,0,433},{26,0,433},{24,63,50},{24,63,50},{24,63,50},{24,60,1},{20,63,26},{20,63,26},{28,63,1135},{28,63,991},{27,63,874},{27,63,602},{28,63,1162},{26,63,618},{26,63,362},{25,63,5},{25,63,1087},{22,63,58},{30,63,219},{29,63,161},{29,63,125},{29,63,61},{30,62,294},{29,63,193},{28,63,117},{24,63,1},{31,60,297},{24,63,1},{27,63,874},{27,63,874},{27,63,874}, +{27,63,602},{27,63,730},{26,63,362},{26,63,362},{25,63,5},{24,63,681},{22,63,58},{29,63,125},{29,63,125},{29,63,125},{29,63,61},{31,56,221},{28,63,117},{28,63,117},{24,63,1},{31,59,221},{24,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{27,0,433},{27,0,433},{27,0,433},{27,0,433},{25,63,101}, +{25,63,101},{25,63,101},{25,62,1},{22,63,58},{22,63,58},{29,63,885},{28,63,751},{28,63,670},{28,63,526},{28,63,778},{27,63,483},{27,63,314},{26,63,10},{26,63,777},{24,63,117},{30,63,75},{30,63,59},{30,63,50},{30,63,34},{31,60,114},{29,63,81},{29,63,45},{27,63,0},{31,61,114},{27,63,0},{28,63,670},{28,63,670},{28,63,670},{28,63,526},{28,63,553},{27,63,314},{27,63,314}, +{26,63,10},{25,63,518},{24,63,117},{30,63,50},{30,63,50},{30,63,50},{30,63,34},{31,59,85},{29,63,45},{29,63,45},{27,63,0},{30,62,85},{27,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{28,0,445},{28,0,445},{28,0,445},{28,0,445},{27,63,145},{27,63,145},{27,63,145},{26,63,10},{24,63,117}, +{24,63,117},{0,26,882},{0,21,218},{0,15,16},{0,13,260},{0,17,1899},{0,13,1341},{0,11,593},{0,8,1380},{0,9,2113},{0,7,1513},{0,26,882},{0,21,218},{0,15,16},{0,13,260},{4,4,1896},{0,13,1341},{0,11,593},{0,8,1380},{7,2,1896},{0,8,1380},{0,12,0},{0,12,0},{0,12,0},{0,7,1},{0,6,162},{0,5,85},{0,5,85},{0,3,85},{0,3,186},{0,3,101},{0,12,0}, +{0,12,0},{0,12,0},{0,7,1},{1,3,162},{0,5,85},{0,5,85},{0,3,85},{3,0,162},{0,3,85},{6,6,882},{0,21,218},{0,15,16},{0,13,260},{6,6,882},{12,1,882},{0,13,260},{0,10,884},{12,1,882},{0,10,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,31,884},{0,25,146},{0,17,2}, +{0,15,185},{0,21,2355},{0,17,1539},{0,13,653},{0,10,1605},{0,11,2667},{0,9,1777},{0,31,884},{0,25,146},{0,17,2},{0,15,185},{5,4,2355},{0,17,1539},{0,13,653},{0,10,1605},{7,4,2355},{0,10,1605},{0,17,1},{0,17,1},{0,17,1},{0,10,1},{0,9,338},{0,8,180},{0,8,180},{0,5,180},{0,5,389},{0,5,229},{0,17,1},{0,17,1},{0,17,1},{0,10,1},{2,2,338}, +{0,8,180},{0,8,180},{0,5,180},{2,3,338},{0,5,180},{9,1,882},{0,25,146},{0,17,2},{0,15,185},{9,1,882},{13,3,882},{0,15,185},{0,12,884},{13,3,882},{0,12,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,36,884},{0,29,90},{0,19,37},{0,17,130},{0,25,2899},{0,19,1764},{0,16,733}, +{0,11,1853},{0,13,3325},{0,11,2109},{0,36,884},{0,29,90},{0,19,37},{0,17,130},{7,1,2899},{0,19,1764},{0,16,733},{0,11,1853},{12,0,2899},{0,11,1853},{0,23,0},{0,23,0},{0,23,0},{0,14,1},{0,11,580},{0,11,305},{0,11,305},{0,6,325},{0,6,667},{0,5,389},{0,23,0},{0,23,0},{0,23,0},{0,14,1},{2,5,578},{0,11,305},{0,11,305},{0,6,325},{5,1,578}, +{0,6,325},{10,3,882},{0,29,90},{1,19,2},{0,17,130},{10,3,882},{18,0,882},{0,17,130},{0,14,884},{18,0,882},{0,14,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,42,918},{0,32,81},{1,21,105},{0,20,109},{0,29,3051},{0,21,1707},{0,19,569},{0,13,1800},{0,16,3672},{0,13,2161},{1,38,888}, +{0,32,81},{1,21,41},{0,20,109},{8,2,3048},{0,21,1707},{0,19,569},{0,13,1800},{12,3,3048},{0,13,1800},{0,28,36},{0,28,36},{0,28,36},{0,17,37},{0,16,648},{0,13,269},{0,13,269},{0,9,292},{0,8,824},{0,7,417},{1,25,4},{1,25,4},{1,25,4},{1,16,5},{3,6,648},{0,13,269},{0,13,269},{0,9,292},{8,0,648},{0,9,292},{12,1,882},{0,32,45},{2,21,2}, +{0,20,73},{12,1,882},{19,2,882},{0,20,73},{0,16,890},{19,2,882},{0,16,890},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,4,0},{0,4,0},{0,4,0},{0,2,1},{0,2,10},{0,2,10},{1,44,997},{1,34,154},{1,24,229},{1,22,178},{0,35,3048},{0,25,1528},{0,21,324},{0,16,1605},{0,19,3907},{0,15,2138},{2,41,883},{2,32,86},{2,24,42},{1,22,114},{9,5,3048}, +{0,25,1528},{0,21,324},{0,16,1605},{15,3,3048},{0,16,1605},{1,31,113},{1,31,113},{1,31,113},{1,19,113},{0,22,648},{0,17,164},{0,17,164},{0,11,193},{0,11,976},{0,9,443},{2,27,2},{2,27,2},{2,27,2},{2,18,1},{6,2,648},{0,17,164},{0,17,164},{0,11,193},{11,0,648},{0,11,193},{13,4,882},{0,36,13},{3,23,4},{0,22,32},{13,4,882},{22,2,882},{0,22,32}, +{0,18,884},{22,2,882},{0,18,884},{1,0,113},{1,0,113},{1,0,113},{1,0,113},{0,10,0},{0,10,0},{0,10,0},{0,6,0},{0,5,58},{0,5,58},{1,49,1173},{1,38,302},{2,26,421},{1,24,321},{0,40,3051},{0,29,1380},{0,23,186},{0,18,1464},{0,21,4201},{0,17,2149},{3,43,883},{3,34,86},{3,26,42},{2,24,114},{12,0,3048},{0,29,1380},{0,23,186},{0,18,1464},{20,0,3048}, +{0,18,1464},{1,36,289},{1,36,289},{1,36,289},{1,22,290},{0,27,650},{0,21,100},{0,21,100},{0,13,130},{0,14,1161},{0,13,491},{3,29,2},{3,29,2},{3,29,2},{3,20,1},{8,0,648},{0,21,100},{0,21,100},{0,13,130},{11,3,648},{0,13,130},{14,6,882},{0,40,1},{4,25,1},{0,25,16},{14,6,882},{26,0,882},{0,25,16},{0,20,884},{26,0,882},{0,20,884},{1,0,289}, +{1,0,289},{1,0,289},{1,0,289},{0,15,1},{0,15,1},{0,15,1},{0,9,1},{0,7,136},{0,7,136},{2,51,1365},{2,40,494},{2,28,722},{2,26,513},{0,46,3048},{0,32,1269},{0,27,82},{0,20,1341},{0,25,4525},{0,19,2197},{4,45,886},{3,38,90},{4,28,36},{3,26,114},{13,2,3048},{0,32,1269},{0,27,82},{0,20,1341},{21,2,3048},{0,20,1341},{2,38,481},{2,38,481},{2,38,481}, +{2,24,482},{0,32,650},{0,25,52},{0,25,52},{0,15,85},{0,17,1345},{0,15,569},{4,31,4},{4,31,4},{4,31,4},{4,22,5},{9,2,648},{0,25,52},{0,25,52},{0,15,85},{16,0,648},{0,15,85},{16,4,882},{1,42,1},{5,27,1},{0,27,1},{16,4,882},{27,2,882},{0,27,1},{0,22,884},{27,2,882},{0,22,884},{2,0,481},{2,0,481},{2,0,481},{2,0,481},{0,21,0}, +{0,21,0},{0,21,0},{0,12,1},{0,9,250},{0,9,250},{2,57,1667},{2,44,786},{3,30,1042},{2,29,801},{0,51,3048},{0,36,1157},{0,29,20},{0,22,1236},{0,27,4891},{0,21,2281},{5,47,886},{4,41,86},{5,30,36},{4,28,116},{14,4,3048},{0,36,1157},{0,29,20},{0,22,1236},{25,0,3048},{0,22,1236},{2,43,785},{2,43,785},{2,43,785},{2,27,786},{0,38,648},{0,29,20},{0,29,20}, +{0,18,40},{0,19,1594},{0,16,677},{5,33,4},{5,33,4},{5,33,4},{5,24,5},{11,1,648},{0,29,20},{0,29,20},{0,18,40},{17,2,648},{0,18,40},{17,6,882},{2,44,1},{6,29,1},{1,29,1},{17,6,882},{28,4,882},{1,29,1},{0,24,884},{28,4,882},{0,24,884},{2,0,785},{2,0,785},{2,0,785},{2,0,785},{0,26,0},{0,26,0},{0,26,0},{0,16,1},{0,11,400}, +{0,11,400},{3,59,1784},{3,46,901},{4,32,1195},{3,31,910},{1,53,3055},{0,40,1094},{1,31,23},{0,25,1175},{0,31,4840},{0,23,2054},{6,49,883},{6,41,81},{6,32,42},{5,30,123},{14,10,3048},{0,40,1058},{1,31,19},{0,25,1139},{28,0,3048},{0,25,1139},{3,46,900},{3,46,900},{3,46,900},{3,30,900},{1,40,654},{1,31,22},{1,31,22},{1,20,38},{0,23,1560},{0,19,533},{6,35,2}, +{6,35,2},{6,35,2},{6,26,1},{13,0,648},{0,33,5},{0,33,5},{0,20,13},{20,2,648},{0,20,13},{19,5,882},{3,46,1},{7,31,5},{2,31,1},{19,5,882},{31,4,882},{2,31,1},{0,26,882},{31,4,882},{0,26,882},{3,0,900},{3,0,900},{3,0,900},{3,0,900},{1,29,4},{1,29,4},{1,29,4},{1,18,4},{0,15,377},{0,15,377},{4,61,1772},{4,48,891},{5,34,1195}, +{4,33,906},{2,55,3055},{1,42,1094},{2,33,29},{1,27,1175},{0,34,4609},{0,26,1716},{7,51,883},{7,43,81},{7,34,42},{6,32,114},{18,1,3048},{0,44,990},{2,33,25},{0,27,1058},{29,2,3048},{0,27,1058},{4,47,891},{4,47,891},{4,47,891},{4,32,891},{2,42,654},{2,33,29},{2,33,29},{2,22,38},{0,27,1396},{0,21,347},{7,37,2},{7,37,2},{7,37,2},{7,28,1},{14,2,648}, +{0,37,1},{0,37,1},{0,23,5},{24,0,648},{0,23,5},{22,0,882},{4,48,1},{8,33,1},{3,33,0},{22,0,882},{31,7,882},{3,33,0},{0,28,882},{31,7,882},{0,28,882},{4,0,890},{4,0,890},{4,0,890},{4,0,890},{2,31,4},{2,31,4},{2,31,4},{2,20,4},{0,19,260},{0,19,260},{5,63,1772},{5,50,891},{6,36,1195},{5,35,906},{3,57,3055},{2,44,1094},{3,35,29}, +{2,29,1175},{0,38,4381},{0,29,1436},{8,53,886},{7,47,89},{8,36,36},{7,34,114},{19,3,3048},{0,47,949},{3,35,25},{0,29,995},{30,4,3048},{0,29,995},{5,49,890},{5,49,890},{5,49,890},{5,33,891},{3,44,654},{3,35,29},{3,35,29},{3,24,38},{0,29,1251},{0,24,221},{8,39,4},{8,39,4},{8,39,4},{8,30,4},{16,0,648},{1,39,1},{1,39,1},{0,25,2},{26,1,648}, +{0,25,2},{23,2,882},{5,50,1},{9,35,1},{4,35,1},{23,2,882},{28,14,882},{4,35,1},{0,30,882},{28,14,882},{0,30,882},{5,0,890},{5,0,890},{5,0,890},{5,0,890},{3,32,5},{3,32,5},{3,32,5},{3,22,4},{0,23,180},{0,23,180},{6,63,1790},{6,52,891},{7,38,1195},{6,37,906},{4,59,3057},{3,46,1094},{4,37,29},{3,31,1175},{0,42,4185},{0,31,1206},{9,55,886}, +{8,49,86},{9,38,36},{8,36,116},{20,5,3048},{0,51,907},{4,37,20},{0,31,950},{31,6,3048},{0,31,950},{6,51,890},{6,51,890},{6,51,890},{6,35,891},{4,46,657},{4,37,29},{4,37,29},{3,26,49},{0,34,1121},{0,27,117},{9,41,4},{9,41,4},{9,41,4},{9,32,5},{17,2,648},{2,41,1},{2,41,1},{1,27,2},{27,3,648},{1,27,2},{24,4,882},{6,52,1},{10,37,1}, +{5,37,1},{24,4,882},{28,17,882},{5,37,1},{0,32,884},{28,17,882},{0,32,884},{6,0,890},{6,0,890},{6,0,890},{6,0,890},{4,34,9},{4,34,9},{4,34,9},{4,24,10},{0,27,116},{0,27,116},{8,63,1844},{7,54,901},{8,40,1188},{7,39,910},{5,62,3052},{4,48,1094},{5,39,23},{4,33,1175},{0,44,3969},{0,33,1039},{10,57,885},{10,49,81},{10,40,35},{9,38,123},{23,1,3048}, +{0,55,888},{5,39,19},{0,34,907},{29,12,3048},{0,34,907},{7,54,900},{7,54,900},{7,54,900},{7,38,900},{5,48,654},{5,39,22},{5,39,22},{5,28,45},{0,38,990},{0,29,80},{10,43,2},{10,43,2},{10,43,2},{10,34,1},{19,1,648},{3,43,1},{3,43,1},{3,29,1},{29,4,648},{3,29,1},{27,0,882},{7,54,1},{11,39,5},{6,39,1},{27,0,882},{31,17,882},{6,39,1}, +{0,34,882},{31,17,882},{0,34,882},{7,0,900},{7,0,900},{7,0,900},{7,0,900},{5,37,4},{5,37,4},{5,37,4},{5,26,4},{0,31,58},{0,31,58},{9,63,1886},{8,56,892},{9,42,1188},{8,41,900},{6,63,3055},{5,50,1094},{6,41,23},{5,35,1175},{0,49,3804},{0,36,935},{11,59,885},{11,51,81},{11,42,35},{10,40,123},{23,6,3048},{0,58,883},{6,41,19},{0,36,886},{30,14,3048}, +{0,36,886},{8,55,891},{8,55,891},{8,55,891},{8,40,891},{6,50,654},{6,41,22},{6,41,22},{6,30,45},{0,40,889},{1,31,80},{11,45,2},{11,45,2},{11,45,2},{11,36,1},{20,3,648},{5,43,2},{5,43,2},{4,31,1},{30,6,648},{4,31,1},{27,5,882},{8,56,2},{12,41,2},{7,41,1},{27,5,882},{31,20,882},{7,41,1},{0,36,882},{31,20,882},{0,36,882},{8,0,890}, +{8,0,890},{8,0,890},{8,0,890},{6,39,4},{6,39,4},{6,39,4},{6,28,4},{0,34,25},{0,34,25},{10,63,1964},{9,58,892},{10,44,1188},{9,43,900},{7,63,3100},{6,52,1094},{7,43,23},{6,37,1175},{0,51,3640},{0,38,887},{12,61,886},{11,55,89},{12,44,38},{11,42,123},{26,1,3048},{1,60,883},{7,43,19},{0,38,883},{30,17,3048},{0,38,883},{9,57,891},{9,57,891},{9,57,891}, +{9,42,891},{7,52,654},{7,43,22},{7,43,22},{7,32,38},{0,44,801},{2,34,86},{12,47,4},{12,47,4},{12,47,4},{12,38,4},{21,5,648},{6,45,2},{6,45,2},{4,33,2},{31,8,648},{4,33,2},{30,0,882},{9,58,2},{13,43,2},{8,43,1},{30,0,882},{28,27,882},{8,43,1},{0,38,882},{28,27,882},{0,38,882},{9,0,890},{9,0,890},{9,0,890},{9,0,890},{7,41,4}, +{7,41,4},{7,41,4},{7,30,4},{0,38,5},{0,38,5},{11,63,2078},{10,60,892},{11,46,1188},{10,45,900},{9,63,3181},{7,54,1094},{8,45,35},{7,39,1175},{0,55,3496},{1,40,887},{13,63,886},{12,56,88},{13,46,38},{12,44,110},{27,3,3048},{2,62,883},{7,46,25},{1,40,883},{31,19,3048},{1,40,883},{10,59,891},{10,59,891},{10,59,891},{10,44,891},{8,54,657},{8,45,34},{8,45,34}, +{7,34,49},{0,48,756},{3,36,86},{13,49,4},{13,49,4},{13,49,4},{13,40,4},{24,0,648},{6,49,1},{6,49,1},{5,35,2},{31,11,648},{5,35,2},{31,2,882},{10,60,2},{14,45,2},{9,45,1},{31,2,882},{29,29,882},{9,45,1},{0,40,882},{29,29,882},{0,40,882},{10,0,890},{10,0,890},{10,0,890},{10,0,890},{8,42,9},{8,42,9},{8,42,9},{8,32,10},{0,42,1}, +{0,42,1},{12,63,2228},{11,63,902},{12,48,1188},{11,47,908},{10,63,3256},{8,57,1095},{9,47,33},{8,41,1164},{0,59,3364},{2,42,889},{14,63,915},{14,57,90},{14,48,35},{13,47,117},{29,2,3048},{4,63,886},{8,48,25},{3,42,885},{29,25,3048},{3,42,885},{11,62,900},{11,62,900},{11,62,900},{11,46,900},{9,57,652},{9,47,29},{9,47,29},{9,36,45},{0,51,691},{4,37,80},{14,51,2}, +{14,51,2},{14,51,2},{14,42,2},{24,6,648},{7,51,1},{7,51,1},{7,37,1},{29,17,648},{7,37,1},{31,8,882},{11,63,2},{15,47,8},{10,47,5},{31,8,882},{31,30,882},{10,47,5},{0,42,884},{31,30,882},{0,42,884},{11,0,900},{11,0,900},{11,0,900},{11,0,900},{9,45,4},{9,45,4},{9,45,4},{9,34,4},{1,44,1},{1,44,1},{13,63,2414},{12,63,907},{13,50,1188}, +{12,49,900},{11,63,3391},{9,59,1095},{10,49,23},{9,43,1164},{0,63,3276},{3,44,889},{15,63,981},{15,59,90},{15,50,35},{14,48,123},{31,1,3048},{6,63,906},{10,49,19},{4,44,885},{30,27,3048},{4,44,885},{12,63,891},{12,63,891},{12,63,891},{12,48,891},{10,59,652},{10,49,22},{10,49,22},{10,38,45},{0,55,659},{5,39,80},{15,53,2},{15,53,2},{15,53,2},{15,44,2},{27,1,648}, +{9,51,2},{9,51,2},{8,39,1},{30,19,648},{8,39,1},{29,20,882},{12,63,17},{16,49,2},{11,49,1},{29,20,882},{31,33,882},{11,49,1},{0,44,884},{31,33,882},{0,44,884},{12,0,890},{12,0,890},{12,0,890},{12,0,890},{10,47,4},{10,47,4},{10,47,4},{10,36,4},{2,46,1},{2,46,1},{15,63,2606},{13,63,987},{14,52,1188},{13,51,900},{13,63,3517},{10,61,1095},{11,51,23}, +{10,45,1164},{1,63,3300},{4,46,892},{17,63,1014},{15,63,94},{16,52,38},{15,50,123},{31,6,3048},{8,63,936},{11,51,19},{5,46,885},{31,29,3048},{5,46,885},{13,63,906},{13,63,906},{13,63,906},{13,50,891},{11,61,652},{11,51,22},{11,51,22},{11,40,45},{0,59,651},{6,41,80},{16,55,4},{16,55,4},{16,55,4},{16,46,5},{28,3,648},{10,53,2},{10,53,2},{9,41,1},{31,21,648}, +{9,41,1},{30,22,882},{14,63,37},{17,51,2},{12,51,1},{30,22,882},{28,40,882},{12,51,1},{0,46,884},{28,40,882},{0,46,884},{13,0,890},{13,0,890},{13,0,890},{13,0,890},{11,49,4},{11,49,4},{11,49,4},{11,38,4},{3,48,0},{3,48,0},{16,63,2792},{15,63,1079},{15,54,1188},{14,53,900},{14,63,3652},{11,63,1095},{12,53,35},{11,47,1164},{3,63,3436},{5,48,887},{18,63,1080}, +{17,62,102},{17,54,38},{16,52,110},{30,15,3048},{10,63,996},{11,54,25},{5,48,883},{31,32,3048},{5,48,883},{14,63,939},{14,63,939},{14,63,939},{14,52,891},{12,62,657},{12,53,34},{12,53,34},{12,42,50},{1,61,651},{7,43,80},{17,57,4},{17,57,4},{17,57,4},{17,48,4},{29,5,648},{11,55,2},{11,55,2},{10,43,1},{31,24,648},{10,43,1},{31,24,882},{16,63,80},{18,53,2}, +{13,53,1},{31,24,882},{29,42,882},{13,53,1},{0,48,882},{29,42,882},{0,48,882},{14,0,890},{14,0,890},{14,0,890},{14,0,890},{12,50,9},{12,50,9},{12,50,9},{12,40,9},{4,50,1},{4,50,1},{17,63,3038},{16,63,1268},{16,57,1186},{15,55,908},{15,63,3879},{12,63,1146},{13,55,33},{12,49,1164},{5,63,3667},{6,50,889},{19,63,1205},{18,63,147},{18,56,41},{17,55,117},{31,17,3048}, +{12,63,1110},{12,56,20},{7,50,885},{29,38,3048},{7,50,885},{16,63,979},{16,63,979},{16,63,979},{15,54,900},{13,63,670},{13,55,29},{13,55,29},{13,45,41},{2,63,648},{8,46,81},{18,60,1},{18,60,1},{18,60,1},{18,50,2},{31,4,648},{11,59,4},{11,59,4},{11,45,1},{30,29,648},{11,45,1},{31,30,882},{18,63,146},{19,56,5},{14,55,5},{31,30,882},{31,43,882},{14,55,5}, +{0,50,884},{31,43,882},{0,50,884},{15,0,900},{15,0,900},{15,0,900},{15,0,900},{13,53,4},{13,53,4},{13,53,4},{13,42,5},{5,52,1},{5,52,1},{18,63,3308},{17,63,1502},{17,59,1186},{16,57,898},{17,63,4077},{14,63,1230},{14,57,33},{13,51,1164},{8,63,3820},{7,52,889},{21,63,1368},{19,63,261},{19,58,41},{18,57,117},{30,26,3048},{14,63,1226},{13,58,20},{8,52,885},{30,40,3048}, +{8,52,885},{17,63,1018},{17,63,1018},{17,63,1018},{16,56,890},{14,63,724},{14,57,29},{14,57,29},{14,47,41},{4,63,665},{9,48,88},{19,62,1},{19,62,1},{19,62,1},{19,52,2},{30,13,648},{12,61,1},{12,61,1},{12,47,1},{31,31,648},{12,47,1},{31,35,882},{20,63,193},{20,58,4},{15,57,5},{31,35,882},{27,51,882},{15,57,5},{0,52,884},{27,51,882},{0,52,884},{16,0,890}, +{16,0,890},{16,0,890},{16,0,890},{14,55,4},{14,55,4},{14,55,4},{14,44,5},{6,54,1},{6,54,1},{19,63,3614},{18,63,1804},{18,61,1186},{17,59,898},{18,63,4284},{15,63,1417},{15,59,33},{14,53,1164},{9,63,4036},{8,54,892},{22,63,1494},{20,63,405},{20,60,33},{19,59,117},{31,28,3048},{16,63,1395},{14,60,20},{9,54,885},{31,42,3048},{9,54,885},{18,63,1075},{18,63,1075},{18,63,1075}, +{17,58,890},{16,63,787},{15,59,29},{15,59,29},{15,48,45},{6,63,705},{10,49,80},{20,63,5},{20,63,5},{20,63,5},{20,54,5},{31,15,648},{13,63,1},{13,63,1},{13,49,1},{31,34,648},{13,49,1},{31,40,882},{22,63,277},{21,60,4},{16,59,5},{31,40,882},{31,49,882},{16,59,5},{0,54,884},{31,49,882},{0,54,884},{17,0,890},{17,0,890},{17,0,890},{17,0,890},{15,57,4}, +{15,57,4},{15,57,4},{15,46,5},{7,56,1},{7,56,1},{20,63,4014},{19,63,2174},{19,63,1186},{18,61,898},{19,63,4545},{17,63,1725},{16,62,39},{15,55,1164},{11,63,4300},{9,56,892},{23,63,1656},{22,63,585},{21,62,33},{20,60,108},{31,33,3048},{18,63,1563},{15,62,20},{10,56,885},{31,45,3048},{10,56,885},{19,63,1150},{19,63,1150},{19,63,1150},{18,60,890},{17,63,841},{16,62,35},{16,62,35}, +{16,50,50},{8,63,747},{11,51,80},{21,63,20},{21,63,20},{21,63,20},{21,56,5},{31,20,648},{15,63,5},{15,63,5},{14,51,1},{31,37,648},{14,51,1},{29,52,882},{23,63,397},{22,62,4},{17,61,5},{29,52,882},{28,56,882},{17,61,5},{0,56,884},{28,56,882},{0,56,884},{18,0,890},{18,0,890},{18,0,890},{18,0,890},{16,58,10},{16,58,10},{16,58,10},{16,48,9},{8,58,0}, +{8,58,0},{22,63,4123},{21,63,2404},{20,63,1278},{19,63,901},{20,63,4626},{18,63,1849},{17,63,38},{16,57,1006},{14,63,4330},{10,58,771},{24,63,1629},{23,63,715},{22,63,65},{22,62,81},{31,38,2814},{20,63,1505},{17,63,34},{11,58,761},{31,48,2814},{11,58,761},{20,63,1278},{20,63,1278},{20,63,1278},{19,62,901},{18,63,948},{17,63,38},{17,63,38},{17,53,41},{10,63,840},{12,54,81},{22,63,65}, +{22,63,65},{22,63,65},{22,59,2},{31,26,648},{17,63,34},{17,63,34},{15,53,1},{30,42,648},{15,53,1},{31,50,761},{25,63,425},{23,63,9},{19,63,1},{31,50,761},{31,55,761},{19,63,1},{0,58,761},{31,55,761},{0,58,761},{19,0,900},{19,0,900},{19,0,900},{19,0,900},{17,61,4},{17,61,4},{17,61,4},{17,50,5},{9,60,2},{9,60,2},{23,63,3735},{22,63,2314},{21,63,1395}, +{20,63,899},{22,63,4090},{19,63,1618},{18,63,104},{17,58,678},{15,63,3826},{11,59,507},{25,63,1285},{24,63,609},{23,63,122},{23,62,26},{30,45,2249},{21,63,1186},{19,63,74},{13,59,482},{31,50,2249},{13,59,482},{21,63,1395},{21,63,1395},{21,63,1395},{20,63,899},{19,63,1086},{18,63,104},{18,63,104},{18,55,41},{12,63,969},{13,56,81},{23,63,122},{23,63,122},{23,63,122},{23,61,2},{31,31,648}, +{19,63,74},{19,63,74},{16,55,1},{31,44,648},{16,55,1},{31,53,481},{27,63,269},{25,63,0},{21,63,0},{31,53,481},{31,57,481},{21,63,0},{0,59,481},{31,57,481},{0,59,481},{20,0,890},{20,0,890},{20,0,890},{20,0,890},{18,63,4},{18,63,4},{18,63,4},{18,52,5},{10,62,2},{10,62,2},{23,63,3399},{23,63,2260},{22,63,1530},{21,63,954},{23,63,3639},{20,63,1402},{19,63,238}, +{18,59,405},{17,63,3443},{13,60,297},{26,63,1009},{25,63,525},{25,63,164},{24,63,5},{29,52,1769},{23,63,918},{21,63,113},{14,60,266},{28,56,1769},{14,60,266},{22,63,1530},{22,63,1530},{22,63,1530},{21,63,954},{21,63,1251},{19,63,238},{19,63,238},{19,57,41},{14,63,1105},{14,58,81},{25,63,164},{25,63,164},{25,63,164},{24,62,5},{31,36,648},{21,63,113},{21,63,113},{17,57,1},{31,47,648}, +{17,57,1},{31,55,265},{28,63,145},{27,63,4},{24,63,1},{31,55,265},{30,60,265},{24,63,1},{0,60,265},{30,60,265},{0,60,265},{21,0,890},{21,0,890},{21,0,890},{21,0,890},{19,63,13},{19,63,13},{19,63,13},{19,54,5},{12,62,8},{12,62,8},{24,63,3069},{24,63,2257},{23,63,1683},{23,63,1054},{24,63,3258},{22,63,1330},{21,63,378},{19,61,213},{20,63,3102},{14,61,166},{27,63,801}, +{26,63,477},{26,63,221},{25,63,20},{30,52,1374},{24,63,758},{23,63,181},{16,61,114},{28,58,1374},{16,61,114},{23,63,1683},{23,63,1683},{23,63,1683},{23,63,1054},{22,63,1401},{21,63,378},{21,63,378},{19,59,46},{16,63,1296},{15,60,81},{26,63,221},{26,63,221},{26,63,221},{25,63,20},{30,45,648},{23,63,181},{23,63,181},{18,59,1},{31,50,648},{18,59,1},{31,58,113},{29,63,61},{28,63,0}, +{26,63,1},{31,58,113},{31,60,113},{26,63,1},{0,61,113},{31,60,113},{0,61,113},{22,0,890},{22,0,890},{22,0,890},{22,0,890},{20,63,45},{20,63,45},{20,63,45},{20,56,10},{13,63,25},{13,63,25},{25,63,2860},{25,63,2260},{24,63,1854},{24,63,1210},{25,63,2932},{23,63,1310},{22,63,609},{20,62,81},{21,63,2731},{16,62,94},{28,63,630},{27,63,475},{27,63,306},{26,63,101},{30,56,1032}, +{26,63,612},{25,63,290},{18,62,21},{30,58,1032},{18,62,21},{24,63,1854},{24,63,1854},{24,63,1854},{24,63,1210},{23,63,1620},{22,63,609},{22,63,609},{21,61,44},{18,63,1515},{16,62,78},{27,63,306},{27,63,306},{27,63,306},{26,63,101},{29,54,648},{25,63,290},{25,63,290},{19,61,5},{29,56,648},{19,61,5},{31,61,18},{30,63,10},{30,63,1},{29,63,0},{31,61,18},{31,62,18},{29,63,0}, +{0,62,20},{31,62,18},{0,62,20},{23,0,900},{23,0,900},{23,0,900},{23,0,900},{21,63,104},{21,63,104},{21,63,104},{21,59,5},{15,63,65},{15,63,65},{26,63,2626},{26,63,2206},{25,63,1915},{25,63,1315},{26,63,2641},{24,63,1333},{23,63,789},{22,63,40},{22,63,2445},{17,63,116},{29,63,524},{28,63,406},{28,63,325},{27,63,170},{31,56,771},{27,63,507},{26,63,320},{20,63,0},{30,60,771}, +{20,63,0},{25,63,1915},{25,63,1915},{25,63,1915},{25,63,1315},{24,63,1661},{23,63,789},{23,63,789},{22,62,29},{20,63,1517},{17,63,116},{28,63,325},{28,63,325},{28,63,325},{27,63,170},{31,52,578},{26,63,320},{26,63,320},{20,63,0},{28,60,578},{20,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{24,0,890}, +{24,0,890},{24,0,890},{24,0,890},{23,63,164},{23,63,164},{23,63,164},{22,61,5},{17,63,116},{17,63,116},{27,63,2156},{27,63,1884},{26,63,1630},{26,63,1210},{26,63,2081},{25,63,1108},{24,63,705},{23,63,5},{23,63,1927},{19,63,180},{29,63,300},{29,63,236},{29,63,200},{28,63,85},{31,57,451},{28,63,283},{27,63,194},{23,63,1},{29,62,451},{23,63,1},{26,63,1630},{26,63,1630},{26,63,1630}, +{26,63,1210},{25,63,1347},{24,63,705},{24,63,705},{23,63,5},{22,63,1229},{19,63,180},{29,63,200},{29,63,200},{29,63,200},{28,63,85},{30,58,338},{27,63,194},{27,63,194},{23,63,1},{31,58,338},{23,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{25,0,890},{25,0,890},{25,0,890},{25,0,890},{24,63,221}, +{24,63,221},{24,63,221},{23,63,5},{19,63,180},{19,63,180},{28,63,1782},{27,63,1564},{27,63,1395},{27,63,1123},{27,63,1620},{26,63,937},{25,63,651},{24,63,25},{24,63,1560},{21,63,233},{30,63,150},{30,63,134},{29,63,104},{29,63,40},{31,59,216},{29,63,136},{28,63,90},{25,63,1},{30,62,216},{25,63,1},{27,63,1395},{27,63,1395},{27,63,1395},{27,63,1123},{26,63,1101},{25,63,651},{25,63,651}, +{24,63,25},{23,63,998},{21,63,233},{29,63,104},{29,63,104},{29,63,104},{29,63,40},{31,57,162},{28,63,90},{28,63,90},{25,63,1},{29,62,162},{25,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{26,0,890},{26,0,890},{26,0,890},{26,0,890},{25,63,290},{25,63,290},{25,63,290},{24,63,25},{21,63,233}, +{21,63,233},{0,34,1570},{0,27,400},{0,19,25},{0,16,481},{0,23,3372},{0,17,2355},{0,15,1053},{0,11,2425},{0,13,3753},{0,11,2681},{0,34,1570},{0,27,400},{0,19,25},{0,16,481},{7,0,3371},{0,17,2355},{0,15,1053},{0,11,2425},{10,2,3371},{0,11,2425},{0,16,0},{0,16,0},{0,16,0},{0,10,1},{0,8,288},{0,7,149},{0,7,149},{0,5,160},{0,4,332},{0,4,200},{0,16,0}, +{0,16,0},{0,16,0},{0,10,1},{1,5,288},{0,7,149},{0,7,149},{0,5,160},{4,0,288},{0,5,160},{10,1,1568},{0,27,400},{0,19,25},{0,16,481},{10,1,1568},{17,0,1568},{0,16,481},{0,13,1568},{17,0,1568},{0,13,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,40,1568},{0,31,296},{0,22,2}, +{0,20,373},{0,27,3968},{0,21,2627},{0,17,1107},{0,13,2720},{0,15,4479},{0,11,3065},{0,40,1568},{0,31,296},{0,22,2},{0,20,373},{7,3,3968},{0,21,2627},{0,17,1107},{0,13,2720},{13,0,3968},{0,13,2720},{0,21,1},{0,21,1},{0,21,1},{0,13,0},{0,11,512},{0,9,269},{0,9,269},{0,5,288},{0,5,593},{0,5,337},{0,21,1},{0,21,1},{0,21,1},{0,13,0},{3,1,512}, +{0,9,269},{0,9,269},{0,5,288},{3,3,512},{0,5,288},{11,3,1568},{0,31,296},{0,22,2},{0,20,373},{11,3,1568},{18,2,1568},{0,20,373},{0,15,1568},{18,2,1568},{0,15,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,45,1568},{0,34,221},{0,24,17},{0,22,274},{0,30,4651},{0,23,2924},{0,19,1209}, +{0,15,3065},{0,17,5292},{0,13,3465},{0,45,1568},{0,34,221},{0,24,17},{0,22,274},{8,3,4651},{0,23,2924},{0,19,1209},{0,15,3065},{14,1,4651},{0,15,3065},{0,27,0},{0,27,0},{0,27,0},{0,16,0},{0,13,802},{0,12,424},{0,12,424},{0,7,433},{0,7,918},{0,7,533},{0,27,0},{0,27,0},{0,27,0},{0,16,0},{4,0,800},{0,12,424},{0,12,424},{0,7,433},{6,1,800}, +{0,7,433},{13,1,1568},{0,34,221},{1,24,2},{0,22,274},{13,1,1568},{19,4,1568},{0,22,274},{0,17,1570},{19,4,1568},{0,17,1570},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,50,1568},{0,38,145},{0,26,82},{0,24,193},{0,34,5419},{0,25,3275},{0,21,1347},{0,16,3410},{0,17,6220},{0,15,3933},{0,50,1568}, +{0,38,145},{1,26,81},{0,24,193},{10,0,5419},{0,25,3275},{0,21,1347},{0,16,3410},{15,2,5419},{0,16,3410},{0,32,0},{0,32,0},{0,32,0},{0,19,0},{0,16,1152},{0,15,605},{0,15,605},{0,9,628},{0,8,1328},{0,7,789},{0,32,0},{0,32,0},{0,32,0},{0,19,0},{3,6,1152},{0,15,605},{0,15,605},{0,9,628},{8,0,1152},{0,9,628},{15,0,1568},{0,38,145},{2,26,2}, +{0,24,193},{15,0,1568},{24,1,1568},{0,24,193},{0,19,1570},{24,1,1568},{0,19,1570},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,53,1633},{0,42,166},{1,29,162},{0,26,209},{0,40,5419},{0,29,3012},{0,25,964},{0,18,3152},{0,21,6513},{0,17,3861},{1,53,1569},{1,42,138},{2,28,74},{1,26,186},{11,3,5419}, +{0,29,3012},{0,25,964},{0,18,3152},{18,2,5419},{0,18,3152},{1,34,66},{1,34,66},{1,34,66},{1,21,66},{0,22,1152},{0,19,442},{0,19,442},{0,11,493},{0,11,1480},{0,11,749},{1,34,2},{1,34,2},{1,34,2},{1,21,2},{6,2,1152},{0,19,442},{0,19,442},{0,11,493},{11,0,1152},{0,11,493},{16,2,1568},{0,42,85},{3,28,0},{0,26,128},{16,2,1568},{27,1,1568},{0,26,128}, +{0,21,1568},{27,1,1568},{0,21,1568},{1,0,65},{1,0,65},{1,0,65},{1,0,65},{0,6,0},{0,6,0},{0,6,0},{0,4,1},{0,3,20},{0,3,20},{1,58,1713},{1,44,230},{2,31,354},{1,28,273},{0,45,5419},{0,32,2817},{0,27,682},{0,20,2945},{0,25,6853},{0,19,3825},{2,55,1569},{2,44,138},{3,30,74},{2,28,186},{13,1,5419},{0,32,2817},{0,27,682},{0,20,2945},{19,4,5419}, +{0,20,2945},{1,40,145},{1,40,145},{1,40,145},{1,25,146},{0,27,1154},{0,23,338},{0,23,338},{0,13,394},{0,14,1665},{0,13,755},{2,36,2},{2,36,2},{2,36,2},{2,23,2},{8,0,1152},{0,23,338},{0,23,338},{0,13,394},{11,3,1152},{0,13,394},{17,4,1568},{0,46,41},{4,30,1},{0,29,80},{17,4,1568},{27,4,1568},{0,29,80},{0,23,1568},{27,4,1568},{0,23,1568},{1,0,145}, +{1,0,145},{1,0,145},{1,0,145},{0,11,1},{0,11,1},{0,11,1},{0,7,0},{0,5,74},{0,5,74},{2,60,1905},{1,49,393},{2,33,531},{1,31,433},{0,50,5419},{0,36,2609},{0,29,468},{0,22,2756},{0,27,7195},{0,21,3825},{3,57,1569},{3,46,138},{4,32,81},{3,30,186},{15,0,5419},{0,36,2609},{0,29,468},{0,22,2756},{24,1,5419},{0,22,2756},{2,42,337},{2,42,337},{2,42,337}, +{2,27,338},{0,32,1154},{0,25,244},{0,25,244},{0,16,289},{0,17,1849},{0,15,797},{3,38,2},{3,38,2},{3,38,2},{3,25,2},{9,2,1152},{0,25,244},{0,25,244},{0,16,289},{16,0,1152},{0,16,289},{18,6,1568},{0,51,16},{5,32,2},{0,31,41},{18,6,1568},{28,6,1568},{0,31,41},{0,25,1568},{28,6,1568},{0,25,1568},{2,0,337},{2,0,337},{2,0,337},{2,0,337},{0,17,0}, +{0,17,0},{0,17,0},{0,10,0},{0,7,164},{0,7,164},{2,63,2145},{2,51,585},{3,35,851},{2,33,618},{0,55,5420},{0,40,2425},{0,32,274},{0,24,2585},{0,29,7609},{0,23,3861},{4,58,1570},{4,47,136},{5,34,81},{4,32,193},{16,1,5419},{0,40,2425},{0,32,274},{0,24,2585},{25,3,5419},{0,24,2585},{2,47,545},{2,47,545},{2,47,545},{2,30,545},{0,38,1152},{0,29,164},{0,29,164}, +{0,18,208},{0,19,2098},{0,17,869},{4,40,0},{4,40,0},{4,40,0},{4,27,1},{11,1,1152},{0,29,164},{0,29,164},{0,18,208},{17,2,1152},{0,18,208},{21,1,1568},{0,54,2},{6,34,2},{0,33,13},{21,1,1568},{29,8,1568},{0,33,13},{0,27,1568},{29,8,1568},{0,27,1568},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,22,0},{0,22,0},{0,22,0},{0,13,1},{0,10,289}, +{0,10,289},{3,63,2596},{3,53,934},{3,37,1277},{2,35,964},{0,61,5420},{0,44,2242},{0,35,141},{0,28,2402},{0,32,8131},{0,25,3956},{5,61,1569},{5,50,138},{6,36,74},{5,34,186},{17,4,5419},{0,44,2242},{0,35,141},{0,28,2402},{27,4,5419},{0,28,2402},{3,49,901},{3,49,901},{3,49,901},{3,32,900},{0,44,1152},{0,34,97},{0,34,97},{0,20,145},{0,23,2436},{0,19,989},{5,43,1}, +{5,43,1},{5,43,1},{5,30,2},{13,0,1152},{0,34,97},{0,34,97},{0,20,145},{20,2,1152},{0,20,145},{23,0,1568},{1,57,2},{7,36,0},{0,36,1},{23,0,1568},{31,9,1568},{0,36,1},{0,29,1570},{31,9,1568},{0,29,1570},{3,0,900},{3,0,900},{3,0,900},{3,0,900},{0,28,0},{0,28,0},{0,28,0},{0,17,1},{0,13,461},{0,13,461},{4,63,3146},{3,57,1262},{4,40,1731}, +{3,37,1284},{1,63,5484},{0,46,2129},{0,38,53},{0,30,2243},{0,36,8615},{0,27,4070},{6,63,1569},{6,52,138},{7,38,74},{6,36,186},{18,6,5419},{0,46,2129},{0,38,53},{0,30,2243},{28,6,5419},{0,30,2243},{3,55,1252},{3,55,1252},{3,55,1252},{3,35,1253},{0,49,1152},{0,38,53},{0,38,53},{0,23,89},{0,25,2763},{0,21,1139},{6,45,1},{6,45,1},{6,45,1},{6,32,2},{14,2,1152}, +{0,38,53},{0,38,53},{0,23,89},{24,0,1152},{0,23,89},{24,2,1568},{2,59,2},{8,38,1},{1,38,1},{24,2,1568},{27,17,1568},{1,38,1},{0,31,1570},{27,17,1568},{0,31,1570},{3,0,1252},{3,0,1252},{3,0,1252},{3,0,1252},{0,33,0},{0,33,0},{0,33,0},{0,20,0},{0,15,653},{0,15,653},{5,63,3716},{4,58,1599},{4,42,2134},{4,39,1627},{2,63,5655},{0,51,1983},{0,40,33}, +{0,32,2133},{0,38,8925},{0,30,4044},{7,63,1587},{7,54,138},{8,40,80},{7,38,186},{21,1,5419},{0,51,1979},{0,40,29},{0,32,2129},{29,8,5419},{0,32,2129},{4,56,1587},{4,56,1587},{4,56,1587},{4,37,1586},{0,54,1156},{0,41,29},{0,41,29},{0,25,54},{0,27,2988},{0,23,1193},{7,47,1},{7,47,1},{7,47,1},{7,33,2},{16,0,1152},{0,41,25},{0,41,25},{0,25,50},{26,1,1152}, +{0,25,50},{25,4,1568},{3,61,2},{9,40,1},{2,40,1},{25,4,1568},{28,19,1568},{2,40,1},{0,33,1568},{28,19,1568},{0,33,1568},{4,0,1586},{4,0,1586},{4,0,1586},{4,0,1586},{0,38,5},{0,38,5},{0,38,5},{0,23,4},{0,17,754},{0,17,754},{6,63,3890},{5,60,1599},{5,44,2134},{5,41,1627},{3,63,5748},{0,55,1975},{1,42,33},{0,33,2085},{0,42,8569},{0,32,3525},{9,63,1634}, +{8,55,136},{9,42,80},{8,40,208},{22,3,5419},{0,55,1875},{1,42,29},{0,33,1985},{30,10,5419},{0,33,1985},{5,58,1587},{5,58,1587},{5,58,1587},{5,39,1586},{1,56,1156},{1,43,29},{1,43,29},{1,27,54},{0,31,2736},{0,25,907},{8,48,0},{8,48,0},{8,48,0},{8,35,1},{17,2,1152},{0,45,5},{0,45,5},{0,28,17},{27,3,1152},{0,28,17},{26,6,1568},{4,62,1},{10,42,1}, +{3,42,1},{26,6,1568},{29,21,1568},{3,42,1},{0,35,1568},{29,21,1568},{0,35,1568},{5,0,1586},{5,0,1586},{5,0,1586},{5,0,1586},{1,40,5},{1,40,5},{1,40,5},{1,25,4},{0,21,610},{0,21,610},{7,63,4136},{6,63,1589},{7,46,2141},{6,44,1613},{4,63,5895},{2,55,1973},{2,45,43},{2,35,2100},{0,46,8199},{0,34,3051},{10,63,1667},{9,57,131},{10,45,74},{9,43,195},{24,2,5419}, +{0,59,1772},{2,45,34},{0,36,1874},{27,17,5419},{0,36,1874},{6,61,1576},{6,61,1576},{6,61,1576},{6,41,1577},{2,59,1161},{2,46,26},{2,46,26},{2,30,49},{0,36,2505},{0,29,616},{9,51,1},{9,51,1},{9,51,1},{9,38,2},{19,1,1152},{0,49,2},{0,49,2},{0,30,4},{29,4,1152},{0,30,4},{28,5,1568},{6,63,13},{11,44,1},{4,44,1},{28,5,1568},{31,22,1568},{4,44,1}, +{0,37,1570},{31,22,1568},{0,37,1570},{6,0,1576},{6,0,1576},{6,0,1576},{6,0,1576},{2,43,9},{2,43,9},{2,43,9},{2,27,10},{0,25,468},{0,25,468},{8,63,4436},{7,63,1625},{7,49,2161},{7,46,1613},{6,63,6079},{3,57,1973},{3,47,43},{3,37,2100},{0,49,7908},{0,37,2671},{11,63,1745},{10,59,131},{11,47,74},{10,45,195},{25,4,5419},{0,61,1699},{3,47,34},{0,38,1787},{28,19,5419}, +{0,38,1787},{7,63,1576},{7,63,1576},{7,63,1576},{7,43,1577},{3,61,1161},{3,47,34},{3,47,34},{3,32,59},{0,38,2294},{0,31,422},{10,53,1},{10,53,1},{10,53,1},{10,40,2},{20,3,1152},{2,49,2},{2,49,2},{1,32,2},{30,6,1152},{1,32,2},{31,0,1568},{8,63,34},{12,46,1},{5,46,1},{31,0,1568},{28,29,1568},{5,46,1},{0,39,1570},{28,29,1568},{0,39,1570},{7,0,1576}, +{7,0,1576},{7,0,1576},{7,0,1576},{3,45,9},{3,45,9},{3,45,9},{3,29,10},{0,29,356},{0,29,356},{9,63,4730},{8,63,1716},{8,50,2134},{8,47,1627},{7,63,6244},{3,61,1977},{4,48,33},{3,40,2100},{0,53,7620},{0,40,2343},{12,63,1832},{11,61,131},{12,48,80},{11,47,195},{26,6,5419},{1,63,1699},{4,48,29},{0,41,1714},{29,21,5419},{0,41,1714},{8,63,1595},{8,63,1595},{8,63,1595}, +{8,45,1587},{4,62,1158},{4,49,29},{4,49,29},{4,33,54},{0,42,2098},{0,34,282},{11,55,1},{11,55,1},{11,55,1},{11,42,2},{21,5,1152},{3,51,2},{3,51,2},{2,34,2},{31,8,1152},{2,34,2},{30,9,1568},{9,63,68},{13,48,1},{6,48,1},{30,9,1568},{29,31,1568},{6,48,1},{0,41,1570},{29,31,1568},{0,41,1570},{8,0,1586},{8,0,1586},{8,0,1586},{8,0,1586},{4,47,4}, +{4,47,4},{4,47,4},{4,31,5},{0,32,269},{0,32,269},{11,63,5010},{9,63,1878},{9,52,2134},{9,49,1627},{8,63,6508},{4,62,1965},{5,50,33},{4,42,2079},{0,55,7360},{0,42,2067},{14,63,1952},{12,63,149},{13,50,80},{12,48,208},{29,1,5419},{3,63,1787},{5,50,29},{0,43,1651},{30,23,5419},{0,43,1651},{9,63,1622},{9,63,1622},{9,63,1622},{9,47,1587},{5,63,1164},{5,51,29},{5,51,29}, +{5,35,54},{0,46,1926},{0,36,186},{12,56,0},{12,56,0},{12,56,0},{12,44,1},{24,0,1152},{3,55,2},{3,55,2},{3,36,2},{31,11,1152},{3,36,2},{31,11,1568},{11,63,116},{14,50,1},{7,50,1},{31,11,1568},{29,34,1568},{7,50,1},{0,43,1570},{29,34,1568},{0,43,1570},{9,0,1586},{9,0,1586},{9,0,1586},{9,0,1586},{5,48,5},{5,48,5},{5,48,5},{5,33,4},{0,36,185}, +{0,36,185},{12,63,5316},{11,63,2154},{11,54,2141},{10,52,1613},{10,63,6800},{6,62,1995},{6,53,43},{5,44,2085},{0,59,7068},{0,44,1845},{15,63,2081},{13,63,206},{14,53,74},{13,51,195},{31,0,5419},{5,63,1937},{6,53,34},{0,45,1601},{28,29,5419},{0,45,1601},{10,63,1676},{10,63,1676},{10,63,1676},{10,49,1577},{7,63,1179},{6,54,26},{6,54,26},{6,38,49},{0,49,1764},{0,40,149},{13,59,1}, +{13,59,1},{13,59,1},{13,46,1},{24,6,1152},{4,57,1},{4,57,1},{4,38,4},{29,17,1152},{4,38,4},{30,20,1568},{13,63,205},{15,52,1},{8,52,1},{30,20,1568},{31,35,1568},{8,52,1},{0,45,1576},{31,35,1568},{0,45,1576},{10,0,1576},{10,0,1576},{10,0,1576},{10,0,1576},{6,51,9},{6,51,9},{6,51,9},{6,35,10},{0,40,113},{0,40,113},{13,63,5658},{12,63,2435},{12,56,2148}, +{11,54,1613},{11,63,7055},{7,63,2090},{7,55,43},{6,46,2085},{0,63,6820},{0,47,1701},{16,63,2216},{14,63,334},{15,55,74},{14,53,195},{30,9,5419},{7,63,2081},{7,55,34},{0,47,1580},{29,31,5419},{0,47,1580},{11,63,1745},{11,63,1745},{11,63,1745},{11,51,1577},{8,63,1220},{7,56,26},{7,56,26},{7,40,49},{0,53,1624},{0,42,145},{14,61,1},{14,61,1},{14,61,1},{14,48,2},{27,1,1152}, +{5,59,1},{5,59,1},{5,40,4},{30,19,1152},{5,40,4},{31,22,1568},{15,63,289},{16,54,1},{9,54,1},{31,22,1568},{28,42,1568},{9,54,1},{0,47,1576},{28,42,1568},{0,47,1576},{11,0,1576},{11,0,1576},{11,0,1576},{11,0,1576},{7,53,9},{7,53,9},{7,53,9},{7,37,10},{0,44,61},{0,44,61},{14,63,6036},{13,63,2751},{12,58,2119},{12,55,1627},{12,63,7316},{8,63,2228},{8,57,31}, +{7,48,2100},{0,63,6884},{0,49,1606},{17,63,2402},{16,63,500},{16,57,82},{15,55,195},{31,11,5419},{9,63,2195},{8,57,27},{0,49,1570},{29,34,5419},{0,49,1570},{12,63,1811},{12,63,1811},{12,63,1811},{12,53,1587},{9,63,1286},{8,57,22},{8,57,22},{8,41,56},{0,57,1508},{1,44,145},{15,63,1},{15,63,1},{15,63,1},{15,50,2},{28,3,1152},{6,61,1},{6,61,1},{6,42,4},{31,21,1152}, +{6,42,4},{31,27,1568},{17,63,410},{17,56,1},{10,56,1},{31,27,1568},{29,44,1568},{10,56,1},{0,49,1570},{29,44,1568},{0,49,1570},{12,0,1586},{12,0,1586},{12,0,1586},{12,0,1586},{8,55,4},{8,55,4},{8,55,4},{8,39,5},{0,48,34},{0,48,34},{15,63,6450},{14,63,3135},{13,60,2119},{13,57,1627},{13,63,7661},{10,63,2448},{9,59,31},{8,50,2079},{2,63,7196},{0,51,1580},{19,63,2594}, +{17,63,698},{16,59,73},{16,57,194},{31,16,5419},{11,63,2379},{9,59,27},{1,51,1570},{30,36,5419},{1,51,1570},{13,63,1910},{13,63,1910},{13,63,1910},{13,55,1587},{10,63,1388},{9,59,22},{9,59,22},{9,43,56},{0,61,1416},{2,46,145},{16,63,4},{16,63,4},{16,63,4},{16,52,1},{29,5,1152},{7,63,1},{7,63,1},{7,44,4},{31,24,1152},{7,44,4},{31,32,1568},{19,63,530},{18,58,1}, +{11,58,1},{31,32,1568},{30,46,1568},{11,58,1},{0,51,1570},{30,46,1568},{0,51,1570},{13,0,1586},{13,0,1586},{13,0,1586},{13,0,1586},{9,57,4},{9,57,4},{9,57,4},{9,41,5},{0,51,10},{0,51,10},{16,63,6900},{15,63,3657},{15,62,2128},{14,60,1616},{15,63,8023},{11,63,2845},{10,61,33},{9,52,2085},{5,63,7651},{1,54,1584},{20,63,2866},{18,63,1011},{18,61,69},{17,59,181},{31,22,5419}, +{13,63,2657},{10,61,24},{2,53,1577},{28,42,5419},{2,53,1577},{15,63,2057},{15,63,2057},{15,63,2057},{14,58,1577},{12,63,1476},{10,61,29},{10,61,29},{10,46,54},{0,63,1324},{4,47,137},{17,63,37},{17,63,37},{17,63,37},{17,54,1},{31,4,1152},{9,63,4},{9,63,4},{7,47,2},{30,29,1152},{7,47,2},{31,38,1568},{21,63,637},{19,60,5},{12,60,4},{31,38,1568},{31,48,1568},{12,60,4}, +{0,53,1576},{31,48,1568},{0,53,1576},{14,0,1576},{14,0,1576},{14,0,1576},{14,0,1576},{10,59,10},{10,59,10},{10,59,10},{10,44,10},{0,56,0},{0,56,0},{18,63,7332},{16,63,4196},{16,63,2175},{15,62,1616},{16,63,8348},{13,63,3285},{11,63,33},{10,54,2085},{8,63,8004},{2,56,1584},{21,63,3112},{20,63,1281},{19,63,69},{18,61,181},{31,27,5419},{15,63,2897},{11,63,24},{3,55,1577},{29,44,5419}, +{3,55,1577},{16,63,2171},{16,63,2171},{16,63,2171},{15,60,1577},{13,63,1590},{11,63,29},{11,63,29},{11,48,49},{2,63,1424},{4,50,145},{19,63,65},{19,63,65},{19,63,65},{18,56,1},{30,13,1152},{11,63,20},{11,63,20},{9,48,4},{31,31,1152},{9,48,4},{30,47,1568},{23,63,785},{20,62,4},{13,62,4},{30,47,1568},{31,51,1568},{13,62,4},{0,55,1576},{31,51,1568},{0,55,1576},{15,0,1576}, +{15,0,1576},{15,0,1576},{15,0,1576},{11,61,10},{11,61,10},{11,61,10},{11,46,10},{1,58,0},{1,58,0},{19,63,7014},{17,63,4230},{17,63,2294},{16,63,1595},{17,63,7865},{14,63,3114},{12,63,85},{12,55,1713},{8,63,7436},{3,57,1268},{22,63,2794},{21,63,1221},{20,63,113},{19,61,114},{31,31,4803},{17,63,2648},{13,63,61},{4,57,1253},{31,44,4803},{4,57,1253},{17,63,2294},{17,63,2294},{17,63,2294}, +{16,62,1587},{14,63,1740},{12,63,85},{12,63,85},{12,49,56},{3,63,1571},{5,52,145},{20,63,113},{20,63,113},{20,63,113},{19,58,1},{31,15,1152},{13,63,61},{13,63,61},{10,50,4},{31,34,1152},{10,50,4},{31,47,1250},{24,63,680},{21,63,4},{15,63,0},{31,47,1250},{31,53,1250},{15,63,0},{0,57,1252},{31,53,1250},{0,57,1252},{16,0,1586},{16,0,1586},{16,0,1586},{16,0,1586},{12,63,4}, +{12,63,4},{12,63,4},{12,47,8},{2,60,0},{2,60,0},{19,63,6534},{18,63,4116},{18,63,2435},{17,63,1590},{18,63,7164},{15,63,2809},{14,63,161},{12,57,1256},{10,63,6748},{5,58,909},{23,63,2340},{22,63,1065},{21,63,164},{20,62,41},{31,34,4056},{18,63,2211},{15,63,113},{6,58,884},{31,46,4056},{6,58,884},{18,63,2435},{18,63,2435},{18,63,2435},{17,63,1590},{16,63,1923},{14,63,161},{14,63,161}, +{13,51,56},{6,63,1729},{6,54,145},{21,63,164},{21,63,164},{21,63,164},{20,60,0},{31,20,1152},{15,63,113},{15,63,113},{11,52,4},{31,37,1152},{11,52,4},{31,49,882},{25,63,482},{23,63,0},{18,63,1},{31,49,882},{30,56,882},{18,63,1},{0,58,884},{30,56,882},{0,58,884},{17,0,1586},{17,0,1586},{17,0,1586},{17,0,1586},{13,63,13},{13,63,13},{13,63,13},{13,49,5},{3,62,0}, +{3,62,0},{21,63,6091},{20,63,4022},{19,63,2609},{18,63,1640},{19,63,6490},{16,63,2617},{15,63,318},{14,58,834},{11,63,6135},{6,59,598},{24,63,1881},{23,63,931},{22,63,245},{21,63,5},{31,38,3318},{20,63,1733},{17,63,202},{8,59,545},{31,48,3318},{8,59,545},{19,63,2609},{19,63,2609},{19,63,2609},{18,63,1640},{17,63,2086},{15,63,318},{15,63,318},{14,54,54},{8,63,1868},{8,55,137},{22,63,245}, +{22,63,245},{22,63,245},{21,62,2},{31,26,1152},{17,63,202},{17,63,202},{11,55,2},{30,42,1152},{11,55,2},{31,52,545},{26,63,305},{25,63,4},{20,63,1},{31,52,545},{30,58,545},{20,63,1},{0,59,545},{30,58,545},{0,59,545},{18,0,1576},{18,0,1576},{18,0,1576},{18,0,1576},{15,63,29},{15,63,29},{15,63,29},{14,52,10},{5,62,5},{5,62,5},{22,63,5719},{21,63,3980},{20,63,2834}, +{19,63,1745},{20,63,6050},{18,63,2457},{16,63,536},{15,59,515},{14,63,5674},{8,60,385},{25,63,1573},{24,63,861},{23,63,338},{22,63,10},{30,45,2753},{21,63,1438},{19,63,290},{10,60,313},{31,50,2753},{10,60,313},{20,63,2834},{20,63,2834},{20,63,2834},{19,63,1745},{18,63,2284},{16,63,536},{16,63,536},{15,56,54},{10,63,2064},{9,57,137},{23,63,338},{23,63,338},{23,63,338},{22,63,10},{31,31,1152}, +{19,63,290},{19,63,290},{12,57,2},{31,44,1152},{12,57,2},{31,55,313},{28,63,181},{26,63,1},{23,63,0},{31,55,313},{31,58,313},{23,63,0},{0,60,313},{31,58,313},{0,60,313},{19,0,1576},{19,0,1576},{19,0,1576},{19,0,1576},{16,63,52},{16,63,52},{16,63,52},{15,54,10},{7,62,25},{7,62,25},{22,63,5399},{22,63,3974},{21,63,3035},{20,63,1875},{21,63,5619},{19,63,2378},{18,63,776}, +{16,60,294},{15,63,5258},{9,61,225},{26,63,1333},{25,63,813},{24,63,425},{23,63,65},{29,52,2273},{23,63,1218},{20,63,353},{12,61,146},{28,56,2273},{12,61,146},{21,63,3035},{21,63,3035},{21,63,3035},{20,63,1875},{19,63,2518},{18,63,776},{18,63,776},{16,58,49},{11,63,2323},{10,59,137},{24,63,425},{24,63,425},{24,63,425},{23,63,65},{31,36,1152},{20,63,353},{20,63,353},{13,59,2},{31,47,1152}, +{13,59,2},{31,57,145},{28,63,85},{28,63,4},{26,63,1},{31,57,145},{31,60,145},{26,63,1},{0,61,145},{31,60,145},{0,61,145},{20,0,1586},{20,0,1586},{20,0,1586},{20,0,1586},{17,63,85},{17,63,85},{17,63,85},{16,56,5},{8,63,40},{8,63,40},{23,63,5143},{23,63,4004},{22,63,3254},{21,63,2070},{22,63,5274},{20,63,2310},{19,63,1062},{17,61,133},{17,63,5011},{10,63,161},{27,63,1161}, +{26,63,801},{26,63,545},{25,63,164},{30,52,1878},{24,63,1094},{22,63,461},{13,62,42},{28,58,1878},{13,62,42},{22,63,3254},{22,63,3254},{22,63,3254},{21,63,2070},{20,63,2833},{19,63,1062},{19,63,1062},{17,60,49},{14,63,2577},{11,61,137},{26,63,545},{26,63,545},{26,63,545},{25,63,164},{30,45,1152},{22,63,461},{22,63,461},{14,61,2},{31,50,1152},{14,61,2},{31,60,41},{30,63,25},{29,63,1}, +{28,63,0},{31,60,41},{31,61,41},{28,63,0},{0,62,41},{31,61,41},{0,62,41},{21,0,1586},{21,0,1586},{21,0,1586},{21,0,1586},{18,63,136},{18,63,136},{18,63,136},{17,58,5},{10,63,80},{10,63,80},{24,63,4882},{24,63,4070},{23,63,3532},{22,63,2360},{24,63,4945},{21,63,2422},{20,63,1433},{18,63,58},{20,63,4717},{12,63,157},{28,63,1026},{27,63,835},{27,63,666},{26,63,305},{30,56,1536}, +{26,63,996},{24,63,628},{16,63,1},{30,58,1536},{16,63,1},{23,63,3532},{23,63,3532},{23,63,3532},{22,63,2360},{22,63,3110},{20,63,1433},{20,63,1433},{18,62,50},{16,63,2939},{12,63,157},{27,63,666},{27,63,666},{27,63,666},{26,63,305},{29,54,1152},{24,63,628},{24,63,628},{16,63,1},{29,56,1152},{16,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0}, +{0,63,0},{31,63,0},{0,63,0},{22,0,1576},{22,0,1576},{22,0,1576},{22,0,1576},{19,63,221},{19,63,221},{19,63,221},{18,60,9},{12,63,157},{12,63,157},{25,63,4212},{24,63,3590},{24,63,3106},{23,63,2201},{24,63,4129},{22,63,2101},{21,63,1301},{19,63,13},{20,63,3869},{14,63,233},{28,63,706},{28,63,562},{28,63,481},{27,63,218},{30,58,1067},{27,63,699},{25,63,442},{18,63,1},{31,58,1067}, +{18,63,1},{24,63,3106},{24,63,3106},{24,63,3106},{23,63,2201},{23,63,2668},{21,63,1301},{21,63,1301},{19,63,13},{18,63,2523},{14,63,233},{28,63,481},{28,63,481},{28,63,481},{27,63,218},{31,50,800},{25,63,442},{25,63,442},{18,63,1},{31,55,800},{18,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{23,0,1576}, +{23,0,1576},{23,0,1576},{23,0,1576},{20,63,325},{20,63,325},{20,63,325},{19,62,9},{14,63,233},{14,63,233},{26,63,3642},{25,63,3132},{25,63,2771},{24,63,2070},{25,63,3444},{23,63,1834},{22,63,1205},{20,63,8},{21,63,3219},{16,63,346},{29,63,456},{28,63,370},{28,63,289},{28,63,145},{31,56,683},{28,63,451},{27,63,290},{21,63,1},{30,60,683},{21,63,1},{25,63,2771},{25,63,2771},{25,63,2771}, +{24,63,2070},{24,63,2273},{22,63,1205},{22,63,1205},{20,63,8},{20,63,2121},{16,63,346},{28,63,289},{28,63,289},{28,63,289},{28,63,145},{30,56,512},{27,63,290},{27,63,290},{21,63,1},{30,58,512},{21,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{24,0,1586},{24,0,1586},{24,0,1586},{24,0,1586},{22,63,421}, +{22,63,421},{22,63,421},{20,63,8},{16,63,346},{16,63,346},{26,63,3162},{26,63,2742},{26,63,2486},{25,63,1947},{26,63,2877},{24,63,1641},{23,63,1145},{22,63,52},{22,63,2673},{18,63,458},{29,63,264},{29,63,200},{29,63,164},{28,63,81},{31,58,384},{28,63,243},{28,63,162},{23,63,1},{31,60,384},{23,63,1},{26,63,2486},{26,63,2486},{26,63,2486},{25,63,1947},{24,63,1969},{23,63,1145},{23,63,1145}, +{22,63,52},{20,63,1785},{18,63,458},{29,63,164},{29,63,164},{29,63,164},{28,63,81},{31,55,288},{28,63,162},{28,63,162},{23,63,1},{28,62,288},{23,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{25,0,1586},{25,0,1586},{25,0,1586},{25,0,1586},{23,63,520},{23,63,520},{23,63,520},{22,63,52},{18,63,458}, +{18,63,458},{0,46,2665},{0,36,666},{0,26,37},{0,22,773},{0,31,5885},{0,23,4085},{0,21,1802},{0,15,4214},{0,17,6543},{0,13,4662},{0,46,2665},{0,36,666},{0,26,37},{0,22,773},{9,0,5885},{0,23,4085},{0,21,1802},{0,15,4214},{15,0,5885},{0,15,4214},{0,22,0},{0,22,0},{0,22,0},{0,13,1},{0,11,545},{0,10,289},{0,10,289},{0,6,306},{0,6,630},{0,5,362},{0,22,0}, +{0,22,0},{0,22,0},{0,13,1},{3,1,545},{0,10,289},{0,10,289},{0,6,306},{5,1,545},{0,6,306},{13,2,2665},{0,36,666},{0,26,37},{0,22,773},{13,2,2665},{23,0,2665},{0,22,773},{0,17,2665},{23,0,2665},{0,17,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,51,2665},{0,40,530},{0,28,2}, +{0,24,650},{0,34,6670},{0,27,4445},{0,23,1886},{0,16,4577},{0,19,7493},{0,15,5130},{0,51,2665},{0,40,530},{0,28,2},{0,24,650},{10,1,6669},{0,27,4445},{0,23,1886},{0,16,4577},{17,0,6669},{0,16,4577},{0,27,1},{0,27,1},{0,27,1},{0,16,1},{0,14,841},{0,13,442},{0,13,442},{0,7,458},{0,7,965},{0,7,558},{0,27,1},{0,27,1},{0,27,1},{0,16,1},{4,0,841}, +{0,13,442},{0,13,442},{0,7,458},{7,0,841},{0,7,458},{15,1,2665},{0,40,530},{0,28,2},{0,24,650},{15,1,2665},{25,0,2665},{0,24,650},{0,19,2665},{25,0,2665},{0,19,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,56,2665},{0,44,410},{0,30,17},{0,28,522},{0,38,7538},{0,29,4826},{0,25,2006}, +{0,18,5002},{0,21,8547},{0,16,5681},{0,56,2665},{0,44,410},{0,30,17},{0,28,522},{11,1,7538},{0,29,4826},{0,25,2006},{0,18,5002},{17,2,7538},{0,18,5002},{0,32,1},{0,32,1},{0,32,1},{0,19,1},{0,16,1201},{0,15,628},{0,15,628},{0,9,653},{0,9,1382},{0,9,822},{0,32,1},{0,32,1},{0,32,1},{0,19,1},{5,0,1201},{0,15,628},{0,15,628},{0,9,653},{8,0,1201}, +{0,9,653},{16,2,2665},{0,44,410},{1,30,2},{0,28,522},{16,2,2665},{28,0,2665},{0,28,522},{0,21,2665},{28,0,2665},{0,21,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,62,2665},{0,49,325},{0,33,65},{0,30,405},{0,41,8493},{0,31,5261},{0,27,2162},{0,20,5477},{0,23,9705},{0,18,6259},{0,62,2665}, +{0,49,325},{0,33,65},{0,30,405},{11,4,8493},{0,31,5261},{0,27,2162},{0,20,5477},{17,4,8493},{0,20,5477},{0,38,0},{0,38,0},{0,38,0},{0,23,1},{0,19,1625},{0,17,821},{0,17,821},{0,11,898},{0,10,1874},{0,9,1094},{0,38,0},{0,38,0},{0,38,0},{0,23,1},{5,2,1625},{0,17,821},{0,17,821},{0,11,898},{8,2,1625},{0,11,898},{18,1,2665},{0,49,325},{2,32,1}, +{0,30,405},{18,1,2665},{29,2,2665},{0,30,405},{0,23,2665},{29,2,2665},{0,23,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,63,2777},{0,51,221},{0,35,178},{0,32,306},{0,45,9669},{0,34,5810},{0,29,2382},{0,22,6054},{0,25,11123},{0,20,6989},{1,63,2741},{0,51,221},{1,35,137},{0,32,306},{13,1,9669}, +{0,34,5810},{0,29,2382},{0,22,6054},{19,4,9669},{0,22,6054},{0,44,0},{0,44,0},{0,44,0},{0,26,1},{0,22,2178},{0,19,1108},{0,19,1108},{0,11,1213},{0,11,2506},{0,11,1469},{0,44,0},{0,44,0},{0,44,0},{0,26,1},{6,2,2178},{0,19,1108},{0,19,1108},{0,11,1213},{11,0,2178},{0,11,1213},{20,0,2665},{0,51,221},{3,34,1},{0,32,306},{20,0,2665},{31,3,2665},{0,32,306}, +{0,25,2669},{31,3,2665},{0,25,2669},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,63,2949},{0,55,209},{1,37,242},{0,35,285},{0,50,9669},{0,38,5486},{0,32,1938},{0,24,5733},{0,27,11477},{0,22,6887},{2,63,2789},{0,55,209},{2,37,137},{0,35,285},{15,0,9669},{0,38,5486},{0,32,1938},{0,24,5733},{24,1,9669}, +{0,24,5733},{1,46,64},{1,46,64},{1,46,64},{1,28,65},{0,27,2180},{0,23,932},{0,23,932},{0,15,1037},{0,14,2691},{0,13,1421},{1,46,0},{1,46,0},{1,46,0},{1,28,1},{8,0,2178},{0,23,932},{0,23,932},{0,15,1037},{11,3,2178},{0,15,1037},{21,2,2665},{0,55,145},{4,36,2},{0,35,221},{21,2,2665},{31,6,2665},{0,35,221},{0,27,2669},{31,6,2665},{0,27,2669},{0,0,64}, +{0,0,64},{0,0,64},{0,0,64},{0,5,1},{0,5,1},{0,5,1},{0,3,1},{0,3,17},{0,3,17},{2,63,3285},{1,57,273},{2,39,434},{1,37,349},{0,56,9670},{0,42,5186},{0,34,1530},{0,26,5430},{0,29,11903},{0,24,6821},{3,63,2873},{1,57,209},{3,39,137},{1,37,285},{16,1,9669},{0,42,5186},{0,34,1530},{0,26,5430},{25,3,9669},{0,26,5430},{1,51,128},{1,51,128},{1,51,128}, +{1,31,129},{0,32,2180},{0,27,772},{0,27,772},{0,16,865},{0,17,2875},{0,15,1409},{2,47,1},{2,47,1},{2,47,1},{2,30,1},{9,2,2178},{0,27,772},{0,27,772},{0,16,865},{16,0,2178},{0,16,865},{23,0,2665},{0,59,85},{5,38,2},{0,37,146},{23,0,2665},{31,9,2665},{0,37,146},{0,29,2669},{31,9,2665},{0,29,2669},{1,0,128},{1,0,128},{1,0,128},{1,0,128},{0,11,0}, +{0,11,0},{0,11,0},{0,6,1},{0,5,65},{0,5,65},{3,63,3785},{1,61,405},{2,41,653},{1,39,466},{0,61,9669},{0,44,4909},{0,36,1190},{0,28,5145},{0,32,12358},{0,26,6791},{4,63,2966},{2,59,209},{4,41,154},{2,39,285},{18,0,9669},{0,44,4909},{0,36,1190},{0,28,5145},{30,0,9669},{0,28,5145},{2,53,320},{2,53,320},{2,53,320},{2,33,321},{0,38,2178},{0,31,628},{0,31,628}, +{0,18,730},{0,19,3124},{0,17,1427},{3,49,1},{3,49,1},{3,49,1},{3,32,0},{11,1,2178},{0,31,628},{0,31,628},{0,18,730},{17,2,2178},{0,18,730},{24,2,2665},{0,63,41},{6,40,2},{0,39,89},{24,2,2665},{30,14,2665},{0,39,89},{0,31,2669},{30,14,2665},{0,31,2669},{1,0,320},{1,0,320},{1,0,320},{1,0,320},{0,16,0},{0,16,0},{0,16,0},{0,10,1},{0,7,149}, +{0,7,149},{4,63,4514},{2,63,630},{3,45,1013},{2,41,681},{1,63,9738},{0,49,4610},{0,40,833},{0,30,4849},{0,36,12905},{0,29,6798},{6,63,3101},{4,60,208},{5,43,149},{3,41,286},{18,6,9669},{0,49,4610},{0,40,833},{0,30,4849},{28,6,9669},{0,30,4849},{2,59,545},{2,59,545},{2,59,545},{2,37,545},{0,44,2178},{0,34,493},{0,34,493},{0,22,584},{0,23,3462},{0,19,1493},{4,52,0}, +{4,52,0},{4,52,0},{4,34,1},{13,0,2178},{0,34,493},{0,34,493},{0,22,584},{20,2,2178},{0,22,584},{26,1,2665},{2,63,85},{7,42,4},{0,41,52},{26,1,2665},{31,16,2665},{0,41,52},{0,33,2669},{31,16,2665},{0,33,2669},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,22,0},{0,22,0},{0,22,0},{0,13,1},{0,10,289},{0,10,289},{4,63,5330},{3,63,1018},{3,47,1406}, +{2,43,966},{2,63,9981},{0,53,4366},{0,42,585},{0,33,4609},{0,38,13451},{0,31,6834},{7,63,3233},{5,62,208},{6,45,149},{4,42,285},{21,1,9669},{0,53,4366},{0,42,585},{0,33,4609},{29,8,9669},{0,33,4609},{3,61,865},{3,61,865},{3,61,865},{3,39,865},{0,49,2178},{0,38,377},{0,38,377},{0,24,461},{0,25,3789},{0,21,1589},{5,54,0},{5,54,0},{5,54,0},{5,36,1},{14,2,2178}, +{0,38,377},{0,38,377},{0,24,461},{24,0,2178},{0,24,461},{28,0,2665},{3,63,153},{8,44,5},{0,44,20},{28,0,2665},{31,19,2665},{0,44,20},{0,35,2669},{31,19,2665},{0,35,2669},{3,0,865},{3,0,865},{3,0,865},{3,0,865},{0,27,1},{0,27,1},{0,27,1},{0,16,1},{0,13,442},{0,13,442},{5,63,6270},{3,63,1626},{4,49,1866},{3,45,1286},{2,63,10381},{0,55,4133},{0,45,401}, +{0,35,4366},{0,42,14023},{0,32,6917},{8,63,3434},{6,63,242},{7,47,149},{5,44,285},{22,3,9669},{0,55,4133},{0,45,401},{0,35,4366},{30,10,9669},{0,35,4366},{3,63,1226},{3,63,1226},{3,63,1226},{3,42,1201},{0,54,2178},{0,42,277},{0,42,277},{0,26,356},{0,27,4170},{0,23,1721},{6,56,0},{6,56,0},{6,56,0},{6,38,1},{16,0,2178},{0,42,277},{0,42,277},{0,26,356},{26,1,2178}, +{0,26,356},{29,2,2665},{5,63,232},{9,46,5},{0,46,5},{29,2,2665},{31,22,2665},{0,46,5},{0,37,2669},{31,22,2665},{0,37,2669},{3,0,1201},{3,0,1201},{3,0,1201},{3,0,1201},{0,32,1},{0,32,1},{0,32,1},{0,19,1},{0,15,628},{0,15,628},{6,63,7374},{4,63,2339},{4,51,2411},{3,48,1715},{3,63,10950},{0,59,3909},{0,47,257},{0,37,4141},{0,44,14641},{0,34,7031},{9,63,3638}, +{7,63,320},{8,49,154},{6,46,285},{24,1,9669},{0,59,3909},{0,47,257},{0,37,4141},{31,12,9669},{0,37,4141},{4,63,1714},{4,63,1714},{4,63,1714},{4,44,1665},{0,59,2180},{0,46,193},{0,46,193},{0,28,269},{0,31,4582},{0,25,1889},{7,58,0},{7,58,0},{7,58,0},{7,40,1},{17,2,2178},{0,46,193},{0,46,193},{0,28,269},{27,3,2178},{0,28,269},{31,0,2665},{8,63,313},{10,48,2}, +{1,48,2},{31,0,2665},{30,27,2665},{1,48,2},{0,39,2669},{30,27,2665},{0,39,2669},{3,0,1665},{3,0,1665},{3,0,1665},{3,0,1665},{0,38,0},{0,38,0},{0,38,0},{0,23,1},{0,17,821},{0,17,821},{7,63,8807},{5,63,3388},{5,53,3082},{4,49,2230},{4,63,11766},{0,63,3686},{0,51,134},{0,39,3909},{0,46,15438},{0,37,7214},{11,63,3853},{8,63,457},{9,51,149},{7,49,286},{25,4,9669}, +{0,63,3686},{0,51,134},{0,39,3909},{28,19,9669},{0,39,3909},{5,63,2427},{5,63,2427},{5,63,2427},{4,47,2179},{0,63,2210},{0,49,128},{0,49,128},{0,31,193},{0,34,5117},{0,29,2123},{8,60,0},{8,60,0},{8,60,0},{8,42,1},{19,1,2178},{0,49,128},{0,49,128},{0,31,193},{29,4,2178},{0,31,193},{31,6,2665},{9,63,405},{11,50,4},{2,50,4},{31,6,2665},{31,29,2665},{2,50,4}, +{0,42,2669},{31,29,2665},{0,42,2669},{4,0,2178},{4,0,2178},{4,0,2178},{4,0,2178},{0,44,0},{0,44,0},{0,44,0},{0,26,1},{0,19,1108},{0,19,1108},{7,63,10230},{6,63,4421},{6,55,3705},{4,52,2725},{5,63,12634},{0,63,3719},{0,53,77},{0,41,3727},{0,51,15978},{0,39,7289},{12,63,4050},{10,63,629},{10,53,149},{8,50,285},{26,6,9669},{0,63,3718},{0,53,76},{0,41,3726},{29,21,9669}, +{0,41,3726},{5,63,3050},{5,63,3050},{5,63,3050},{5,49,2690},{1,63,2325},{0,53,73},{0,53,73},{0,33,118},{0,36,5499},{0,31,2266},{9,62,0},{9,62,0},{9,62,0},{9,44,1},{20,3,2178},{0,53,72},{0,53,72},{0,33,117},{30,6,2178},{0,33,117},{31,12,2665},{11,63,521},{12,52,5},{3,52,4},{31,12,2665},{31,32,2665},{3,52,4},{0,44,2669},{31,32,2665},{0,44,2669},{5,0,2689}, +{5,0,2689},{5,0,2689},{5,0,2689},{0,49,1},{0,49,1},{0,49,1},{0,29,2},{0,21,1341},{0,21,1341},{9,63,10738},{7,63,4899},{7,57,3705},{5,54,2725},{6,63,13045},{1,63,4002},{1,55,77},{0,43,3642},{0,53,15510},{0,42,6577},{13,63,4302},{11,63,857},{11,55,149},{9,52,285},{29,1,9669},{2,63,3954},{1,55,76},{0,43,3561},{30,23,9669},{0,43,3561},{6,63,3173},{6,63,3173},{6,63,3173}, +{6,51,2690},{2,63,2427},{1,55,73},{1,55,73},{1,35,118},{0,40,5171},{0,32,1846},{10,63,4},{10,63,4},{10,63,4},{10,46,1},{21,5,2178},{0,57,32},{0,57,32},{0,35,72},{31,8,2178},{0,35,72},{31,17,2665},{13,63,680},{13,54,5},{3,55,4},{31,17,2665},{31,35,2665},{3,55,4},{0,46,2669},{31,35,2665},{0,46,2669},{6,0,2689},{6,0,2689},{6,0,2689},{6,0,2689},{1,51,1}, +{1,51,1},{1,51,1},{1,31,2},{0,25,1145},{0,25,1145},{10,63,11278},{8,63,5402},{8,58,3742},{6,56,2725},{7,63,13510},{3,63,4314},{2,57,77},{1,45,3642},{0,57,15046},{0,44,5927},{14,63,4590},{12,63,1171},{12,57,149},{10,54,285},{30,3,9669},{3,63,4265},{2,57,76},{0,45,3414},{31,25,9669},{0,45,3414},{7,63,3314},{7,63,3314},{7,63,3314},{7,53,2690},{4,63,2532},{2,57,73},{2,57,73}, +{2,37,118},{0,44,4867},{0,36,1470},{11,63,25},{11,63,25},{11,63,25},{11,48,1},{24,0,2178},{0,61,8},{0,61,8},{0,38,40},{31,11,2178},{0,38,40},{31,22,2665},{15,63,832},{14,56,5},{4,57,4},{31,22,2665},{30,40,2665},{4,57,4},{0,47,2677},{30,40,2665},{0,47,2677},{7,0,2689},{7,0,2689},{7,0,2689},{7,0,2689},{2,53,1},{2,53,1},{2,53,1},{2,33,2},{0,29,965}, +{0,29,965},{11,63,11942},{10,63,6090},{9,62,3723},{8,58,2734},{9,63,14053},{4,63,4863},{3,59,79},{2,48,3633},{0,61,14558},{0,46,5283},{16,63,4858},{14,63,1556},{13,60,138},{11,57,299},{30,9,9669},{6,63,4594},{3,59,75},{0,48,3233},{29,31,9669},{0,48,3233},{9,63,3505},{9,63,3505},{9,63,3505},{8,55,2690},{5,63,2645},{3,61,72},{3,61,72},{3,39,117},{0,46,4539},{0,38,1091},{12,63,64}, +{12,63,64},{12,63,64},{12,50,1},{24,6,2178},{1,63,10},{1,63,10},{0,40,13},{29,17,2178},{0,40,13},{31,28,2665},{17,63,1053},{15,59,2},{5,59,2},{31,28,2665},{31,42,2665},{5,59,2},{0,50,2669},{31,42,2665},{0,50,2669},{8,0,2689},{8,0,2689},{8,0,2689},{8,0,2689},{3,55,5},{3,55,5},{3,55,5},{3,36,5},{0,34,794},{0,34,794},{12,63,12466},{11,63,6718},{10,62,3738}, +{8,60,2723},{10,63,14554},{6,63,5363},{4,61,87},{3,50,3633},{0,63,14190},{0,49,4774},{17,63,5158},{15,63,1938},{14,62,138},{12,59,282},{31,11,9669},{8,63,4806},{4,61,86},{0,50,3110},{29,34,9669},{0,50,3110},{10,63,3658},{10,63,3658},{10,63,3658},{9,57,2690},{6,63,2795},{4,62,66},{4,62,66},{4,41,131},{0,51,4269},{0,40,833},{14,63,100},{14,63,100},{14,63,100},{13,52,1},{27,1,2178}, +{3,63,34},{3,63,34},{0,43,2},{30,19,2178},{0,43,2},{31,33,2665},{19,63,1241},{16,61,5},{6,61,2},{31,33,2665},{31,45,2665},{6,61,2},{0,52,2669},{31,45,2665},{0,52,2669},{9,0,2689},{9,0,2689},{9,0,2689},{9,0,2689},{4,57,1},{4,57,1},{4,57,1},{4,37,2},{0,38,650},{0,38,650},{14,63,13094},{12,63,7445},{11,63,3830},{9,62,2723},{12,63,14998},{8,63,5926},{5,63,87}, +{4,51,3642},{0,63,14254},{0,51,4306},{18,63,5494},{16,63,2414},{15,63,146},{13,61,282},{31,16,9669},{10,63,5138},{5,63,86},{0,52,3005},{30,36,9669},{0,52,3005},{11,63,3829},{11,63,3829},{11,63,3829},{10,59,2690},{7,63,2981},{5,63,86},{5,63,86},{5,43,131},{0,53,4014},{0,44,601},{15,63,145},{15,63,145},{15,63,145},{14,54,1},{28,3,2178},{5,63,85},{5,63,85},{1,45,2},{31,21,2178}, +{1,45,2},{31,38,2665},{20,63,1378},{17,63,5},{7,63,2},{31,38,2665},{31,48,2665},{7,63,2},{0,54,2669},{31,48,2665},{0,54,2669},{10,0,2689},{10,0,2689},{10,0,2689},{10,0,2689},{5,59,1},{5,59,1},{5,59,1},{5,39,2},{0,40,520},{0,40,520},{15,63,12507},{13,63,7370},{12,63,4001},{11,63,2705},{13,63,14148},{8,63,5491},{6,63,154},{5,53,3033},{1,63,13399},{0,53,3297},{19,63,4949}, +{17,63,2261},{16,63,202},{15,61,185},{31,20,8712},{11,63,4644},{7,63,145},{0,54,2365},{31,37,8712},{0,54,2365},{12,63,4001},{12,63,4001},{12,63,4001},{11,61,2690},{9,63,3204},{6,63,154},{6,63,154},{6,45,131},{0,57,3762},{0,46,419},{16,63,202},{16,63,202},{16,63,202},{15,56,1},{29,5,2178},{7,63,145},{7,63,145},{2,47,2},{31,24,2178},{2,47,2},{30,45,2178},{22,63,1145},{18,63,1}, +{10,63,1},{30,45,2178},{31,50,2178},{10,63,1},{0,55,2180},{31,50,2178},{0,55,2180},{11,0,2689},{11,0,2689},{11,0,2689},{11,0,2689},{6,61,1},{6,61,1},{6,61,1},{6,41,2},{0,44,400},{0,44,400},{16,63,11658},{14,63,7195},{13,63,4225},{12,63,2693},{14,63,13066},{10,63,5014},{8,63,261},{6,54,2366},{3,63,12366},{0,55,2274},{20,63,4338},{18,63,2037},{17,63,289},{16,62,80},{31,24,7578}, +{13,63,4037},{9,63,202},{0,55,1698},{29,42,7578},{0,55,1698},{13,63,4225},{13,63,4225},{13,63,4225},{12,63,2693},{10,63,3429},{8,63,261},{8,63,261},{7,47,132},{0,61,3509},{0,49,290},{17,63,289},{17,63,289},{17,63,289},{16,59,0},{31,4,2178},{9,63,202},{9,63,202},{3,49,2},{30,29,2178},{3,49,2},{31,44,1625},{23,63,850},{20,63,0},{13,63,1},{31,44,1625},{31,52,1625},{13,63,1}, +{0,56,1625},{31,52,1625},{0,56,1625},{12,0,2689},{12,0,2689},{12,0,2689},{12,0,2689},{7,63,5},{7,63,5},{7,63,5},{7,44,4},{0,49,289},{0,49,289},{16,63,11002},{15,63,7081},{14,63,4450},{13,63,2738},{15,63,12205},{11,63,4663},{9,63,411},{7,55,1813},{4,63,11643},{0,56,1550},{21,63,3802},{20,63,1845},{18,63,388},{17,62,25},{31,27,6661},{15,63,3525},{11,63,290},{0,57,1217},{29,44,6661}, +{0,57,1217},{14,63,4450},{14,63,4450},{14,63,4450},{13,63,2738},{11,63,3675},{9,63,411},{9,63,411},{8,49,131},{0,63,3354},{0,51,222},{18,63,388},{18,63,388},{18,63,388},{17,61,0},{30,13,2178},{11,63,290},{11,63,290},{4,51,2},{31,31,2178},{4,51,2},{31,47,1201},{24,63,653},{22,63,4},{15,63,1},{31,47,1201},{31,53,1201},{15,63,1},{0,57,1201},{31,53,1201},{0,57,1201},{13,0,2689}, +{13,0,2689},{13,0,2689},{13,0,2689},{8,63,17},{8,63,17},{8,63,17},{8,46,2},{0,53,205},{0,53,205},{17,63,10434},{16,63,7010},{15,63,4693},{14,63,2833},{16,63,11374},{12,63,4462},{10,63,629},{8,56,1358},{6,63,10895},{0,57,1002},{22,63,3334},{20,63,1701},{19,63,505},{18,63,0},{31,31,5829},{16,63,3145},{12,63,405},{1,58,842},{31,44,5829},{1,58,842},{15,63,4693},{15,63,4693},{15,63,4693}, +{14,63,2833},{12,63,3906},{10,63,629},{10,63,629},{9,51,131},{1,63,3525},{0,54,218},{19,63,505},{19,63,505},{19,63,505},{18,63,0},{31,15,2178},{12,63,405},{12,63,405},{5,53,2},{31,34,2178},{5,53,2},{31,49,841},{25,63,461},{23,63,1},{18,63,0},{31,49,841},{31,55,841},{18,63,0},{0,58,841},{31,55,841},{0,58,841},{14,0,2689},{14,0,2689},{14,0,2689},{14,0,2689},{9,63,50}, +{9,63,50},{9,63,50},{9,48,2},{0,57,137},{0,57,137},{18,63,9934},{17,63,6962},{16,63,4913},{15,63,2978},{17,63,10683},{13,63,4277},{11,63,915},{9,58,974},{8,63,10078},{0,59,630},{23,63,2934},{22,63,1605},{21,63,650},{19,63,25},{31,34,5082},{18,63,2769},{14,63,521},{2,59,546},{31,46,5082},{2,59,546},{16,63,4913},{16,63,4913},{16,63,4913},{15,63,2978},{14,63,4170},{11,63,915},{11,63,915}, +{10,53,131},{3,63,3789},{1,56,218},{21,63,650},{21,63,650},{21,63,650},{19,63,25},{31,20,2178},{14,63,521},{14,63,521},{6,55,2},{31,37,2178},{6,55,2},{31,52,545},{26,63,305},{25,63,4},{20,63,1},{31,52,545},{30,58,545},{20,63,1},{0,59,545},{30,58,545},{0,59,545},{15,0,2689},{15,0,2689},{15,0,2689},{15,0,2689},{11,63,74},{11,63,74},{11,63,74},{10,49,2},{0,59,85}, +{0,59,85},{19,63,9465},{18,63,6955},{17,63,5233},{16,63,3218},{18,63,10003},{14,63,4183},{13,63,1258},{11,58,645},{9,63,9445},{1,61,409},{24,63,2529},{23,63,1525},{22,63,785},{20,63,100},{31,38,4344},{20,63,2345},{16,63,698},{4,60,289},{31,48,4344},{4,60,289},{17,63,5233},{17,63,5233},{17,63,5233},{16,63,3218},{15,63,4491},{13,63,1258},{13,63,1258},{11,56,120},{5,63,4171},{2,59,213},{22,63,785}, +{22,63,785},{22,63,785},{20,63,100},{31,26,2178},{16,63,698},{16,63,698},{7,57,0},{30,42,2178},{7,57,0},{31,55,288},{28,63,162},{26,63,4},{23,63,1},{31,55,288},{28,62,288},{23,63,1},{0,60,288},{28,62,288},{0,60,288},{16,0,2689},{16,0,2689},{16,0,2689},{16,0,2689},{12,63,113},{12,63,113},{12,63,113},{11,52,4},{0,63,45},{0,63,45},{20,63,9219},{19,63,6985},{18,63,5530}, +{17,63,3473},{19,63,9496},{15,63,4186},{14,63,1630},{11,60,404},{11,63,8961},{3,61,277},{25,63,2275},{24,63,1509},{23,63,932},{22,63,208},{30,45,3779},{21,63,2086},{18,63,850},{6,61,129},{31,50,3779},{6,61,129},{18,63,5530},{18,63,5530},{18,63,5530},{17,63,3473},{16,63,4770},{14,63,1630},{14,63,1630},{12,57,129},{8,63,4442},{3,61,213},{23,63,932},{23,63,932},{23,63,932},{22,63,208},{31,31,2178}, +{18,63,850},{18,63,850},{8,59,1},{31,44,2178},{8,59,1},{31,58,128},{29,63,72},{28,63,1},{26,63,0},{31,58,128},{31,60,128},{26,63,0},{0,61,128},{31,60,128},{0,61,128},{17,0,2689},{17,0,2689},{17,0,2689},{17,0,2689},{13,63,170},{13,63,170},{13,63,170},{12,54,2},{2,63,89},{2,63,89},{21,63,8929},{20,63,7062},{19,63,5845},{18,63,3778},{20,63,9188},{17,63,4260},{15,63,2070}, +{13,61,234},{13,63,8680},{4,62,212},{26,63,2089},{25,63,1515},{24,63,1073},{23,63,353},{29,52,3299},{22,63,1913},{20,63,965},{8,62,32},{28,56,3299},{8,62,32},{19,63,5845},{19,63,5845},{19,63,5845},{18,63,3778},{17,63,5124},{15,63,2070},{15,63,2070},{13,59,129},{9,63,4725},{4,62,196},{24,63,1073},{24,63,1073},{24,63,1073},{23,63,353},{31,36,2178},{20,63,965},{20,63,965},{9,61,1},{31,47,2178}, +{9,61,1},{31,60,34},{30,63,18},{29,63,4},{28,63,1},{31,60,34},{31,61,34},{28,63,1},{0,62,32},{31,61,34},{0,62,32},{18,0,2689},{18,0,2689},{18,0,2689},{18,0,2689},{14,63,245},{14,63,245},{14,63,245},{13,56,2},{4,63,164},{4,63,164},{22,63,8707},{21,63,7170},{21,63,6209},{19,63,4133},{21,63,8853},{18,63,4387},{17,63,2548},{14,62,154},{14,63,8388},{6,63,244},{27,63,1971}, +{26,63,1557},{25,63,1250},{24,63,565},{30,52,2904},{23,63,1826},{22,63,1145},{10,63,1},{28,58,2904},{10,63,1},{21,63,6209},{21,63,6209},{21,63,6209},{19,63,4133},{19,63,5460},{17,63,2548},{17,63,2548},{14,61,129},{11,63,5085},{6,63,244},{25,63,1250},{25,63,1250},{25,63,1250},{24,63,565},{30,45,2178},{22,63,1145},{22,63,1145},{10,63,1},{31,50,2178},{10,63,1},{31,63,0},{31,63,0},{31,63,0}, +{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{19,0,2689},{19,0,2689},{19,0,2689},{19,0,2689},{15,63,338},{15,63,338},{15,63,338},{14,58,2},{6,63,244},{6,63,244},{23,63,7705},{22,63,6418},{21,63,5633},{20,63,3845},{22,63,7654},{19,63,3874},{18,63,2310},{15,63,53},{15,63,7258},{8,63,317},{27,63,1458},{27,63,1186},{26,63,932},{25,63,425},{30,54,2166}, +{25,63,1398},{23,63,850},{13,63,1},{29,58,2166},{13,63,1},{21,63,5633},{21,63,5633},{21,63,5633},{20,63,3845},{19,63,4830},{18,63,2310},{18,63,2310},{15,62,45},{13,63,4506},{8,63,317},{26,63,932},{26,63,932},{26,63,932},{25,63,425},{31,44,1625},{23,63,850},{23,63,850},{13,63,1},{31,52,1625},{13,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0}, +{0,63,0},{31,63,0},{0,63,0},{20,0,2689},{20,0,2689},{20,0,2689},{20,0,2689},{16,63,449},{16,63,449},{16,63,449},{15,60,4},{8,63,317},{8,63,317},{24,63,6881},{23,63,5814},{22,63,5138},{21,63,3650},{23,63,6713},{20,63,3400},{19,63,2142},{16,63,5},{17,63,6397},{9,63,425},{28,63,1075},{27,63,866},{27,63,697},{26,63,320},{30,56,1601},{26,63,1041},{24,63,653},{15,63,1},{30,58,1601}, +{15,63,1},{22,63,5138},{22,63,5138},{22,63,5138},{21,63,3650},{21,63,4313},{19,63,2142},{19,63,2142},{16,63,5},{14,63,3981},{9,63,425},{27,63,697},{27,63,697},{27,63,697},{26,63,320},{31,47,1201},{24,63,653},{24,63,653},{15,63,1},{31,53,1201},{15,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{21,0,2689}, +{21,0,2689},{21,0,2689},{21,0,2689},{18,63,549},{18,63,549},{18,63,549},{16,62,1},{9,63,425},{9,63,425},{24,63,6097},{24,63,5285},{23,63,4693},{22,63,3473},{23,63,5833},{21,63,3067},{20,63,1988},{17,63,10},{18,63,5571},{11,63,541},{28,63,739},{28,63,595},{27,63,505},{27,63,233},{31,54,1121},{26,63,737},{25,63,461},{18,63,0},{29,60,1121},{18,63,0},{23,63,4693},{23,63,4693},{23,63,4693}, +{22,63,3473},{22,63,3845},{20,63,1988},{20,63,1988},{17,63,10},{15,63,3542},{11,63,541},{27,63,505},{27,63,505},{27,63,505},{27,63,233},{31,49,841},{25,63,461},{25,63,461},{18,63,0},{31,55,841},{18,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{22,0,2689},{22,0,2689},{22,0,2689},{22,0,2689},{19,63,666}, +{19,63,666},{19,63,666},{17,63,10},{11,63,541},{11,63,541},{25,63,5427},{24,63,4757},{24,63,4273},{23,63,3314},{24,63,5002},{22,63,2788},{21,63,1898},{18,63,65},{20,63,4714},{13,63,698},{29,63,489},{28,63,387},{28,63,306},{28,63,162},{31,56,726},{27,63,482},{26,63,305},{20,63,1},{30,60,726},{20,63,1},{24,63,4273},{24,63,4273},{24,63,4273},{23,63,3314},{22,63,3429},{21,63,1898},{21,63,1898}, +{18,63,65},{17,63,3213},{13,63,698},{28,63,306},{28,63,306},{28,63,306},{28,63,162},{31,52,545},{26,63,305},{26,63,305},{20,63,1},{30,58,545},{20,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{23,0,2689},{23,0,2689},{23,0,2689},{23,0,2689},{20,63,832},{20,63,832},{20,63,832},{18,63,65},{13,63,698}, +{13,63,698},{4,63,33740},{0,63,5184},{0,45,446},{0,43,4126},{3,63,45594},{0,59,24105},{0,42,8295},{0,37,24703},{0,44,64117},{0,34,38807},{2,63,9704},{0,61,2866},{0,44,386},{0,37,3205},{14,4,18065},{0,38,13219},{0,34,6147},{0,24,13496},{25,0,18065},{0,24,13496},{0,31,1},{0,31,1},{0,31,1},{0,19,1},{0,16,1105},{0,15,584},{0,15,584},{0,9,605},{0,8,1273},{0,7,750},{0,31,1}, +{0,31,1},{0,31,1},{0,19,1},{4,2,1105},{0,15,584},{0,15,584},{0,9,605},{8,0,1105},{0,9,605},{21,5,9248},{0,61,2866},{0,44,386},{0,37,3205},{21,5,9248},{31,8,9248},{0,37,3205},{0,28,9256},{31,8,9248},{0,28,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,63,38380},{1,63,6614},{0,47,261}, +{0,45,3769},{4,63,50747},{0,63,24961},{0,44,8337},{0,39,25658},{0,46,65535},{0,36,41267},{2,63,10152},{0,63,2624},{0,46,221},{0,41,2929},{16,0,19334},{0,42,13795},{0,36,6237},{0,26,14121},{26,1,19334},{0,26,14121},{0,36,1},{0,36,1},{0,36,1},{0,22,0},{0,18,1513},{0,17,769},{0,17,769},{0,9,845},{0,9,1742},{0,9,1014},{0,36,1},{0,36,1},{0,36,1},{0,22,0},{5,1,1513}, +{0,17,769},{0,17,769},{0,9,845},{9,0,1513},{0,9,845},{24,0,9248},{0,63,2624},{0,46,221},{0,41,2929},{24,0,9248},{31,11,9248},{0,41,2929},{0,30,9256},{31,11,9248},{0,30,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,63,43788},{1,63,8598},{0,49,121},{0,47,3430},{4,63,56155},{0,63,26241},{0,46,8415}, +{0,41,26663},{0,46,65535},{0,36,43795},{3,63,10706},{0,63,2624},{0,48,116},{0,43,2650},{17,0,20689},{0,44,14404},{0,38,6363},{0,28,14796},{26,3,20689},{0,28,14796},{0,42,0},{0,42,0},{0,42,0},{0,25,0},{0,21,1985},{0,19,1009},{0,19,1009},{0,11,1090},{0,11,2281},{0,11,1346},{0,42,0},{0,42,0},{0,42,0},{0,25,0},{6,1,1985},{0,19,1009},{0,19,1009},{0,11,1090},{9,2,1985}, +{0,11,1090},{25,2,9248},{0,63,2624},{0,48,116},{0,43,2650},{25,2,9248},{27,19,9248},{0,43,2650},{0,32,9250},{27,19,9248},{0,32,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{5,63,49566},{1,63,11350},{0,51,36},{0,50,3105},{4,63,62331},{0,63,28289},{0,48,8549},{0,43,27718},{0,49,65535},{0,38,46395},{4,63,11395}, +{0,63,2880},{0,51,36},{0,45,2389},{17,4,22129},{0,46,15067},{0,40,6525},{0,28,15500},{27,4,22129},{0,28,15500},{0,47,0},{0,47,0},{0,47,0},{0,28,1},{0,24,2521},{0,21,1285},{0,21,1285},{0,13,1385},{0,12,2905},{0,11,1714},{0,47,0},{0,47,0},{0,47,0},{0,28,1},{7,0,2521},{0,21,1285},{0,21,1285},{0,13,1385},{11,1,2521},{0,13,1385},{26,4,9248},{1,63,2866},{0,51,36}, +{0,45,2389},{26,4,9248},{28,21,9248},{0,45,2389},{0,34,9250},{28,21,9248},{0,34,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{5,63,56892},{2,63,15166},{0,53,5},{0,52,2726},{5,63,65535},{0,63,31511},{0,51,8735},{0,45,28953},{0,53,65535},{0,40,49505},{4,63,12385},{1,63,3380},{0,53,1},{0,47,2120},{19,1,23851}, +{0,49,15876},{0,42,6761},{0,30,16331},{29,4,23851},{0,30,16331},{0,53,0},{0,53,0},{0,53,0},{0,32,1},{0,27,3200},{0,23,1640},{0,23,1640},{0,15,1769},{0,13,3689},{0,13,2169},{0,53,0},{0,53,0},{0,53,0},{0,32,1},{7,3,3200},{0,23,1640},{0,23,1640},{0,15,1769},{13,0,3200},{0,15,1769},{28,3,9248},{3,63,3204},{0,53,1},{0,47,2120},{28,3,9248},{31,21,9248},{0,47,2120}, +{0,36,9256},{31,21,9248},{0,36,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,63,63870},{2,63,19230},{0,55,30},{0,54,2429},{5,63,65535},{1,63,35016},{0,53,8921},{0,47,30108},{0,55,65535},{0,42,52385},{5,63,13379},{2,63,4026},{0,56,18},{0,50,1885},{20,1,25472},{0,53,16616},{0,46,6989},{0,33,17105},{29,6,25472}, +{0,33,17105},{0,58,0},{0,58,0},{0,58,0},{0,35,0},{0,29,3874},{0,25,1994},{0,25,1994},{0,16,2129},{0,15,4454},{0,15,2637},{0,58,0},{0,58,0},{0,58,0},{0,35,0},{8,2,3872},{0,25,1994},{0,25,1994},{0,16,2129},{12,3,3872},{0,16,2129},{29,5,9248},{5,63,3589},{1,55,1},{0,50,1885},{29,5,9248},{31,24,9248},{0,50,1885},{0,38,9256},{31,24,9248},{0,38,9256},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,63,65535},{2,63,24002},{0,57,109},{0,56,2154},{6,63,65535},{1,63,38780},{0,55,8815},{0,48,30807},{0,57,65535},{0,44,54965},{6,63,14345},{2,63,4766},{1,58,54},{0,52,1670},{20,5,26744},{0,55,17059},{0,46,7005},{0,33,17609},{31,6,26744},{0,33,17609},{0,63,5},{0,63,5},{0,63,5}, +{0,38,4},{0,32,4420},{0,29,2210},{0,29,2210},{0,18,2378},{0,17,5115},{0,16,2981},{0,63,5},{0,63,5},{0,63,5},{0,38,4},{9,2,4418},{0,29,2210},{0,29,2210},{0,18,2378},{16,0,4418},{0,18,2378},{30,7,9248},{8,63,3904},{2,57,1},{0,52,1666},{30,7,9248},{28,31,9248},{0,52,1666},{0,40,9256},{28,31,9248},{0,40,9256},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,1}, +{0,1,1},{0,1,1},{0,1,0},{0,1,1},{0,1,1},{7,63,65535},{3,63,29032},{0,60,314},{0,58,1989},{6,63,65535},{2,63,42151},{0,57,7781},{0,50,30102},{0,59,65535},{0,46,56345},{7,63,14819},{3,63,5416},{2,60,54},{0,54,1565},{23,0,26744},{0,59,16547},{0,49,6177},{0,37,17105},{31,9,26744},{0,37,17105},{1,63,84},{1,63,84},{1,63,84},{1,40,68},{0,38,4418},{0,31,1972},{0,31,1972}, +{0,20,2129},{0,19,5364},{0,18,2915},{1,63,20},{1,63,20},{1,63,20},{1,40,4},{11,1,4418},{0,31,1972},{0,31,1972},{0,20,2129},{17,2,4418},{0,20,2129},{31,9,9248},{8,63,4160},{3,59,1},{0,54,1465},{31,9,9248},{28,34,9248},{0,54,1465},{0,42,9256},{28,34,9248},{0,42,9256},{1,0,68},{1,0,68},{1,0,68},{1,0,68},{0,7,0},{0,7,0},{0,7,0},{0,4,0},{0,3,25}, +{0,3,25},{7,63,65535},{3,63,35719},{1,62,657},{0,60,1985},{7,63,65535},{2,63,46660},{0,59,6696},{0,52,29368},{0,63,65535},{0,49,58301},{9,63,15473},{5,63,6173},{3,62,45},{1,56,1566},{23,6,26744},{0,63,15992},{0,53,5318},{0,39,16547},{30,14,26744},{0,39,16547},{2,63,329},{2,63,329},{2,63,329},{1,44,186},{0,44,4418},{0,36,1709},{0,36,1709},{0,22,1872},{0,23,5702},{0,20,2885},{3,63,34}, +{3,63,34},{3,63,34},{2,42,10},{13,0,4418},{0,36,1709},{0,36,1709},{0,22,1872},{20,2,4418},{0,22,1872},{31,15,9248},{10,63,4570},{4,61,4},{0,56,1268},{31,15,9248},{31,34,9248},{0,56,1268},{0,45,9250},{31,34,9248},{0,45,9250},{1,0,185},{1,0,185},{1,0,185},{1,0,185},{0,13,0},{0,13,0},{0,13,0},{0,8,1},{0,6,97},{0,6,97},{7,63,65535},{4,63,40786},{1,63,1122}, +{0,62,2034},{7,63,65535},{2,63,49800},{0,61,5634},{0,54,27965},{0,63,65535},{0,49,58553},{10,63,15531},{6,63,6593},{4,63,61},{2,58,1482},{25,4,26259},{0,63,15284},{0,55,4484},{0,41,15722},{28,19,26259},{0,41,15722},{2,63,633},{2,63,633},{2,63,633},{2,46,378},{0,49,4418},{0,40,1489},{0,40,1489},{0,24,1665},{0,25,6029},{0,22,2897},{4,63,61},{4,63,61},{4,63,61},{3,44,10},{14,2,4418}, +{0,40,1489},{0,40,1489},{0,24,1665},{24,0,4418},{0,24,1665},{31,19,8978},{11,63,4744},{5,63,0},{0,58,1025},{31,19,8978},{30,38,8978},{0,58,1025},{0,46,8986},{30,38,8978},{0,46,8986},{2,0,377},{2,0,377},{2,0,377},{2,0,377},{0,18,0},{0,18,0},{0,18,0},{0,11,0},{0,8,193},{0,8,193},{8,63,65535},{4,63,40898},{1,63,1890},{1,62,2029},{7,63,65535},{3,63,47871},{0,61,4194}, +{0,56,24760},{0,63,65535},{0,49,55881},{11,63,14325},{8,63,6051},{5,63,100},{3,58,1197},{27,1,24371},{0,63,13716},{0,57,3402},{0,41,13914},{30,19,24371},{0,41,13914},{3,63,1058},{3,63,1058},{3,63,1058},{2,49,618},{0,54,4418},{0,44,1285},{0,44,1285},{0,26,1476},{0,27,6410},{0,25,2937},{5,63,100},{5,63,100},{5,63,100},{4,46,5},{16,0,4418},{0,44,1285},{0,44,1285},{0,26,1476},{26,1,4418}, +{0,26,1476},{31,22,7938},{13,63,4225},{7,63,4},{0,60,628},{31,22,7938},{28,42,7938},{0,60,628},{0,47,7946},{28,42,7938},{0,47,7946},{2,0,617},{2,0,617},{2,0,617},{2,0,617},{0,23,1},{0,23,1},{0,23,1},{0,14,0},{0,11,320},{0,11,320},{8,63,65535},{4,63,41266},{1,63,2914},{1,62,2109},{7,63,65535},{3,63,46175},{0,61,3010},{0,56,21624},{0,63,65535},{0,51,53461},{12,63,13140}, +{8,63,5571},{6,63,157},{4,59,932},{28,1,22568},{0,63,12404},{0,57,2474},{0,43,12155},{30,21,22568},{0,43,12155},{4,63,1630},{4,63,1630},{4,63,1630},{3,51,938},{0,59,4420},{0,46,1117},{0,46,1117},{0,30,1280},{0,31,6822},{0,27,3009},{6,63,157},{6,63,157},{6,63,157},{5,48,4},{17,2,4418},{0,46,1117},{0,46,1117},{0,30,1280},{27,3,4418},{0,30,1280},{30,28,6962},{14,63,3709},{8,63,1}, +{0,60,340},{30,28,6962},{31,40,6962},{0,60,340},{0,48,6964},{31,40,6962},{0,48,6964},{3,0,937},{3,0,937},{3,0,937},{3,0,937},{0,29,0},{0,29,0},{0,29,0},{0,17,0},{0,13,482},{0,13,482},{9,63,65535},{5,63,41956},{2,63,4257},{1,62,2505},{7,63,65535},{3,63,44573},{0,62,1944},{0,56,18402},{0,63,65535},{0,51,50815},{13,63,11930},{10,63,5125},{7,63,250},{5,59,701},{28,5,20642}, +{1,63,11209},{0,59,1634},{0,45,10346},{31,22,20642},{0,45,10346},{4,63,2350},{4,63,2350},{4,63,2350},{3,54,1361},{0,63,4450},{0,51,914},{0,51,914},{0,32,1097},{0,34,7357},{0,29,3131},{7,63,250},{7,63,250},{7,63,250},{6,50,10},{19,1,4418},{0,51,914},{0,51,914},{0,32,1097},{29,4,4418},{0,32,1097},{31,27,5941},{15,63,3176},{10,63,0},{0,62,116},{31,27,5941},{31,42,5941},{0,62,116}, +{0,49,5945},{31,42,5941},{0,49,5945},{3,0,1360},{3,0,1360},{3,0,1360},{3,0,1360},{0,34,1},{0,34,1},{0,34,1},{0,21,1},{0,17,706},{0,17,706},{9,63,65535},{5,63,42660},{2,63,5617},{1,63,3088},{8,63,65535},{3,63,43421},{0,62,1240},{0,56,15810},{0,63,65535},{0,51,48735},{13,63,10922},{11,63,4753},{8,63,360},{6,61,509},{29,5,19021},{2,63,10246},{0,61,1088},{0,47,8885},{31,24,19021}, +{0,47,8885},{5,63,3131},{5,63,3131},{5,63,3131},{4,56,1818},{1,63,4580},{0,55,754},{0,55,754},{0,35,928},{0,36,7846},{0,31,3281},{8,63,360},{8,63,360},{8,63,360},{7,52,10},{20,3,4418},{0,55,754},{0,55,754},{0,35,928},{30,6,4418},{0,35,928},{31,30,5101},{17,63,2777},{11,63,9},{0,62,20},{31,30,5101},{31,43,5101},{0,62,20},{0,50,5105},{31,43,5101},{0,50,5105},{4,0,1818}, +{4,0,1818},{4,0,1818},{4,0,1818},{0,40,0},{0,40,0},{0,40,0},{0,24,0},{0,17,914},{0,17,914},{9,63,65535},{5,63,43620},{2,63,7233},{1,63,3920},{8,63,65535},{3,63,42525},{0,63,738},{0,58,13413},{0,63,65535},{0,51,46911},{14,63,9978},{11,63,4449},{10,63,452},{8,60,344},{31,2,17485},{3,63,9369},{0,61,704},{0,48,7498},{29,29,17485},{0,48,7498},{6,63,4058},{6,63,4058},{6,63,4058}, +{4,59,2315},{2,63,4874},{0,59,610},{0,59,610},{0,37,769},{0,38,8389},{0,32,3497},{10,63,452},{10,63,452},{10,63,452},{8,54,5},{21,5,4418},{0,59,610},{0,59,610},{0,37,769},{31,8,4418},{0,37,769},{31,32,4325},{18,63,2357},{13,63,0},{1,63,0},{31,32,4325},{31,45,4325},{1,63,0},{0,51,4329},{31,45,4325},{0,51,4329},{4,0,2314},{4,0,2314},{4,0,2314},{4,0,2314},{0,45,0}, +{0,45,0},{0,45,0},{0,27,0},{0,19,1184},{0,19,1184},{9,63,65535},{5,63,44836},{2,63,9105},{2,63,4905},{8,63,65535},{3,63,41885},{0,63,482},{0,58,11125},{0,63,65535},{0,51,45343},{15,63,9102},{13,63,4161},{11,63,557},{9,61,212},{30,9,16034},{5,63,8602},{0,63,482},{0,48,6250},{29,31,16034},{0,48,6250},{6,63,5066},{6,63,5066},{6,63,5066},{5,61,2907},{2,63,5322},{0,63,482},{0,63,482}, +{0,39,628},{0,42,8965},{0,36,3717},{11,63,557},{11,63,557},{11,63,557},{9,56,5},{24,0,4418},{0,63,482},{0,63,482},{0,39,628},{31,11,4418},{0,39,628},{31,35,3613},{20,63,1940},{15,63,4},{4,63,1},{31,35,3613},{28,50,3613},{4,63,1},{0,52,3617},{28,50,3613},{0,52,3617},{5,0,2906},{5,0,2906},{5,0,2906},{5,0,2906},{0,50,0},{0,50,0},{0,50,0},{0,30,1},{0,23,1480}, +{0,23,1480},{9,63,65535},{5,63,46510},{3,63,11362},{2,63,6237},{9,63,65535},{3,63,41471},{0,63,500},{0,58,8857},{0,63,65535},{0,53,43697},{16,63,8139},{14,63,3853},{12,63,680},{10,62,89},{30,13,14504},{8,63,7667},{0,63,500},{0,50,4961},{31,31,14504},{0,50,4961},{7,63,6337},{7,63,6337},{7,63,6337},{5,63,3642},{3,63,5962},{0,63,500},{0,63,500},{0,41,493},{0,44,9656},{0,38,3995},{12,63,680}, +{12,63,680},{12,63,680},{10,59,10},{24,6,4418},{0,63,500},{0,63,500},{0,41,493},{29,17,4418},{0,41,493},{31,38,2888},{20,63,1517},{16,63,1},{7,63,1},{31,38,2888},{31,48,2888},{7,63,1},{0,53,2896},{31,48,2888},{0,53,2896},{5,0,3617},{5,0,3617},{5,0,3617},{5,0,3617},{0,56,0},{0,56,0},{0,56,0},{0,34,1},{0,25,1853},{0,25,1853},{10,63,65535},{6,63,48082},{3,63,13570}, +{2,63,7693},{9,63,65535},{3,63,41375},{0,63,788},{0,58,7113},{0,63,65535},{0,53,42465},{17,63,7409},{15,63,3625},{13,63,821},{11,62,34},{31,13,13235},{8,63,6899},{2,63,628},{0,52,3956},{30,34,13235},{0,52,3956},{7,63,7681},{7,63,7681},{7,63,7681},{6,63,4437},{4,63,6659},{1,63,738},{1,63,738},{0,43,394},{0,46,10331},{0,40,4289},{13,63,821},{13,63,821},{13,63,821},{11,61,10},{27,1,4418}, +{2,63,628},{2,63,628},{0,43,394},{30,19,4418},{0,43,394},{31,41,2312},{21,63,1217},{18,63,1},{9,63,0},{31,41,2312},{29,52,2312},{9,63,0},{0,54,2320},{29,52,2312},{0,54,2320},{6,0,4337},{6,0,4337},{6,0,4337},{6,0,4337},{0,61,1},{0,61,1},{0,61,1},{0,37,0},{0,27,2225},{0,27,2225},{10,63,65535},{6,63,49890},{3,63,16034},{2,63,9405},{9,63,65535},{4,63,41526},{0,63,1332}, +{0,59,5520},{0,63,65535},{0,53,41489},{18,63,6747},{16,63,3459},{14,63,980},{12,63,5},{30,20,12051},{10,63,6275},{4,63,801},{0,53,3089},{31,35,12051},{0,53,3089},{8,63,9062},{8,63,9062},{8,63,9062},{7,63,5410},{4,63,7555},{1,63,1154},{1,63,1154},{0,46,306},{0,49,11046},{0,42,4619},{14,63,980},{14,63,980},{14,63,980},{12,62,5},{28,3,4418},{4,63,801},{4,63,801},{0,46,306},{31,21,4418}, +{0,46,306},{30,47,1800},{23,63,949},{19,63,4},{12,63,1},{30,47,1800},{31,51,1800},{12,63,1},{0,55,1808},{31,51,1800},{0,55,1808},{6,0,5105},{6,0,5105},{6,0,5105},{6,0,5105},{0,63,36},{0,63,36},{0,63,36},{0,40,0},{0,29,2633},{0,29,2633},{10,63,65535},{6,63,51954},{3,63,18754},{3,63,11330},{9,63,65535},{4,63,41798},{1,63,2082},{0,60,4084},{0,63,65535},{0,53,40769},{19,63,6153}, +{17,63,3297},{16,63,1154},{13,63,20},{31,20,10952},{11,63,5708},{6,63,965},{0,54,2281},{31,37,10952},{0,54,2281},{9,63,10545},{9,63,10545},{9,63,10545},{7,63,6482},{5,63,8549},{2,63,1716},{2,63,1716},{0,48,208},{0,53,11786},{0,44,4985},{16,63,1154},{16,63,1154},{16,63,1154},{13,63,20},{29,5,4418},{6,63,965},{6,63,965},{0,48,208},{31,24,4418},{0,48,208},{31,46,1352},{23,63,725},{21,63,0}, +{14,63,1},{31,46,1352},{30,54,1352},{14,63,1},{0,56,1360},{30,54,1352},{0,56,1360},{7,0,5953},{7,0,5953},{7,0,5953},{7,0,5953},{1,63,145},{1,63,145},{1,63,145},{0,43,1},{0,31,3077},{0,31,3077},{10,63,65535},{6,63,54582},{4,63,21886},{3,63,13652},{9,63,65535},{4,63,42410},{1,63,3144},{0,60,2770},{0,63,65535},{0,55,40127},{19,63,5649},{18,63,3157},{17,63,1325},{15,63,74},{31,24,9818}, +{13,63,5241},{8,63,1108},{0,56,1538},{29,42,9818},{0,56,1538},{10,63,12376},{10,63,12376},{10,63,12376},{8,63,7844},{6,63,9861},{3,63,2576},{3,63,2576},{0,50,145},{0,55,12659},{0,46,5441},{17,63,1325},{17,63,1325},{17,63,1325},{15,63,74},{31,4,4418},{8,63,1108},{8,63,1108},{0,50,145},{30,29,4418},{0,50,145},{31,49,925},{25,63,505},{23,63,1},{17,63,1},{31,49,925},{30,56,925},{17,63,1}, +{0,58,929},{30,56,925},{0,58,929},{7,0,6970},{7,0,6970},{7,0,6970},{7,0,6970},{1,63,388},{1,63,388},{1,63,388},{0,47,0},{0,34,3625},{0,34,3625},{10,63,65535},{7,63,57052},{4,63,24910},{3,63,15988},{9,63,65535},{4,63,43226},{1,63,4360},{0,61,1833},{0,63,65535},{0,55,39743},{21,63,5202},{19,63,3073},{18,63,1508},{16,63,180},{31,27,8901},{14,63,4814},{10,63,1300},{0,57,1021},{29,44,8901}, +{0,57,1021},{10,63,14136},{10,63,14136},{10,63,14136},{8,63,9252},{7,63,11195},{3,63,3536},{3,63,3536},{0,53,89},{0,59,13491},{0,49,5921},{18,63,1508},{18,63,1508},{18,63,1508},{16,63,180},{30,13,4418},{10,63,1300},{10,63,1300},{0,53,89},{31,31,4418},{0,53,89},{31,51,613},{26,63,337},{24,63,1},{20,63,1},{31,51,613},{31,56,613},{20,63,1},{0,59,617},{31,56,613},{0,59,617},{8,0,7956}, +{8,0,7956},{8,0,7956},{8,0,7956},{2,63,697},{2,63,697},{2,63,697},{0,50,0},{0,36,4141},{0,36,4141},{11,63,65535},{7,63,59708},{4,63,28190},{3,63,18580},{10,63,65535},{5,63,44295},{1,63,5832},{0,61,1081},{0,63,65535},{0,55,39615},{22,63,4818},{20,63,3017},{19,63,1709},{17,63,325},{31,31,8069},{15,63,4473},{11,63,1514},{0,58,593},{31,44,8069},{0,58,593},{11,63,15965},{11,63,15965},{11,63,15965}, +{9,63,10757},{7,63,12667},{4,63,4662},{4,63,4662},{0,55,50},{0,61,14340},{0,51,6395},{19,63,1709},{19,63,1709},{19,63,1709},{17,63,325},{31,15,4418},{11,63,1514},{11,63,1514},{0,55,50},{31,34,4418},{0,55,50},{31,54,365},{27,63,205},{26,63,1},{22,63,1},{31,54,365},{31,58,365},{22,63,1},{0,60,369},{31,58,365},{0,60,369},{8,0,8980},{8,0,8980},{8,0,8980},{8,0,8980},{2,63,1097}, +{2,63,1097},{2,63,1097},{0,53,0},{0,40,4689},{0,40,4689},{11,63,65535},{8,63,58981},{5,63,29551},{4,63,19751},{10,63,65535},{5,63,43215},{2,63,6910},{1,62,614},{0,63,65535},{0,57,34909},{23,63,4502},{21,63,3011},{20,63,1973},{18,63,520},{31,34,7322},{17,63,4242},{13,63,1769},{0,60,274},{31,46,7322},{0,60,274},{12,63,16739},{12,63,16739},{12,63,16739},{10,63,11492},{8,63,13636},{5,63,5510},{5,63,5510}, +{0,58,53},{0,63,14139},{0,53,5981},{20,63,1973},{20,63,1973},{20,63,1973},{18,63,520},{31,20,4418},{13,63,1769},{13,63,1769},{0,58,17},{31,37,4418},{0,58,17},{31,57,181},{28,63,97},{27,63,4},{25,63,0},{31,57,181},{31,59,181},{25,63,0},{0,61,185},{31,59,181},{0,61,185},{9,0,9248},{9,0,9248},{9,0,9248},{9,0,9248},{3,63,1348},{3,63,1348},{3,63,1348},{1,55,4},{0,42,4545}, +{0,42,4545},{12,63,65535},{9,63,57270},{6,63,30345},{5,63,20521},{11,63,65535},{6,63,41449},{3,63,8015},{2,62,242},{0,63,65535},{0,57,28330},{24,63,4181},{22,63,3053},{21,63,2248},{20,63,772},{31,38,6584},{20,63,3941},{15,63,2041},{0,61,77},{31,48,6584},{0,61,77},{13,63,17289},{13,63,17289},{13,63,17289},{11,63,12050},{10,63,14315},{7,63,6389},{7,63,6389},{2,60,41},{0,63,13860},{0,55,5252},{21,63,2248}, +{21,63,2248},{21,63,2248},{20,63,772},{31,26,4418},{15,63,2041},{15,63,2041},{0,60,4},{30,42,4418},{0,60,4},{31,60,50},{30,63,34},{29,63,0},{28,63,1},{31,60,50},{31,61,50},{28,63,1},{0,62,52},{31,61,50},{0,62,52},{10,0,9250},{10,0,9250},{10,0,9250},{10,0,9250},{4,63,1549},{4,63,1549},{4,63,1549},{2,57,2},{0,46,4141},{0,46,4141},{13,63,65535},{9,63,55894},{7,63,31068}, +{6,63,21256},{12,63,65535},{8,63,39740},{4,63,9073},{3,63,90},{0,63,65535},{0,59,23356},{24,63,3973},{23,63,3125},{23,63,2500},{21,63,1037},{30,45,6019},{20,63,3701},{17,63,2340},{0,63,4},{31,50,6019},{0,63,4},{14,63,17796},{14,63,17796},{14,63,17796},{12,63,12625},{11,63,14957},{8,63,7139},{8,63,7139},{3,62,41},{0,63,14020},{0,59,4652},{23,63,2500},{23,63,2500},{23,63,2500},{21,63,1037},{31,31,4418}, +{17,63,2340},{17,63,2340},{1,62,4},{31,44,4418},{1,62,4},{31,62,4},{31,63,4},{31,63,4},{30,63,1},{31,62,4},{31,63,4},{30,63,1},{0,63,4},{31,63,4},{0,63,4},{11,0,9250},{11,0,9250},{11,0,9250},{11,0,9250},{6,63,1765},{6,63,1765},{6,63,1765},{3,59,2},{0,51,3816},{0,51,3816},{13,63,65535},{10,63,53236},{8,63,30487},{7,63,21105},{13,63,65535},{8,63,37332},{5,63,9177}, +{4,63,36},{1,63,65535},{0,59,18680},{25,63,3443},{24,63,2741},{23,63,2248},{22,63,980},{31,44,5163},{21,63,3218},{20,63,2117},{3,63,1},{29,54,5163},{3,63,1},{15,63,17289},{15,63,17289},{15,63,17289},{13,63,12512},{12,63,14328},{9,63,7149},{9,63,7149},{4,63,20},{0,63,13376},{0,59,3944},{23,63,2248},{23,63,2248},{23,63,2248},{22,63,980},{31,34,3872},{20,63,2117},{20,63,2117},{3,63,1},{31,46,3872}, +{3,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{12,0,9248},{12,0,9248},{12,0,9248},{12,0,9248},{7,63,1972},{7,63,1972},{7,63,1972},{4,61,5},{0,55,3488},{0,55,3488},{14,63,65535},{11,63,50266},{9,63,29322},{8,63,20567},{13,63,65535},{9,63,35025},{6,63,8985},{5,63,21},{2,63,65535},{0,59,14712},{26,63,2873}, +{25,63,2283},{24,63,1825},{22,63,820},{29,52,4267},{22,63,2657},{20,63,1685},{5,63,1},{28,56,4267},{5,63,1},{16,63,16427},{16,63,16427},{16,63,16427},{14,63,12185},{13,63,13442},{10,63,6915},{10,63,6915},{5,63,5},{1,63,12539},{0,61,3314},{24,63,1825},{24,63,1825},{24,63,1825},{22,63,820},{31,37,3200},{20,63,1685},{20,63,1685},{5,63,1},{27,52,3200},{5,63,1},{31,63,0},{31,63,0},{31,63,0}, +{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{13,0,9248},{13,0,9248},{13,0,9248},{13,0,9248},{8,63,2250},{8,63,2250},{8,63,2250},{5,63,5},{0,57,3170},{0,57,3170},{15,63,65535},{12,63,47239},{10,63,28065},{9,63,20104},{14,63,65535},{10,63,32574},{7,63,8839},{6,63,54},{3,63,64890},{0,61,10964},{26,63,2252},{25,63,1806},{25,63,1445},{23,63,650},{29,54,3361}, +{23,63,2091},{21,63,1322},{8,63,0},{29,56,3361},{8,63,0},{17,63,15584},{17,63,15584},{17,63,15584},{15,63,11846},{14,63,12522},{11,63,6697},{11,63,6697},{6,63,50},{3,63,11669},{0,63,2834},{25,63,1445},{25,63,1445},{25,63,1445},{23,63,650},{31,40,2521},{21,63,1322},{21,63,1322},{8,63,0},{31,49,2521},{8,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0}, +{0,63,0},{31,63,0},{0,63,0},{14,0,9250},{14,0,9250},{14,0,9250},{14,0,9250},{9,63,2525},{9,63,2525},{9,63,2525},{6,63,50},{0,63,2834},{0,63,2834},{16,63,65535},{13,63,44559},{11,63,27000},{10,63,19705},{15,63,64179},{11,63,30525},{8,63,8677},{7,63,149},{3,63,60570},{0,61,8308},{27,63,1782},{26,63,1416},{25,63,1157},{24,63,520},{31,49,2646},{23,63,1691},{22,63,1040},{11,63,1},{30,56,2646}, +{11,63,1},{18,63,14889},{18,63,14889},{18,63,14889},{16,63,11585},{15,63,11778},{12,63,6555},{12,63,6555},{7,63,145},{3,63,11061},{0,63,2610},{25,63,1157},{25,63,1157},{25,63,1157},{24,63,520},{31,42,1985},{22,63,1040},{22,63,1040},{11,63,1},{30,52,1985},{11,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{15,0,9250}, +{15,0,9250},{15,0,9250},{15,0,9250},{10,63,2792},{10,63,2792},{10,63,2792},{7,63,145},{0,63,2610},{0,63,2610},{16,63,63318},{14,63,42019},{12,63,25930},{11,63,19324},{16,63,59178},{11,63,28845},{9,63,8605},{8,63,276},{6,63,56253},{0,61,6420},{27,63,1366},{27,63,1094},{26,63,872},{25,63,397},{31,51,2017},{25,63,1298},{23,63,794},{13,63,1},{31,56,2017},{13,63,1},{19,63,14244},{19,63,14244},{19,63,14244}, +{17,63,11312},{16,63,11037},{13,63,6429},{13,63,6429},{8,63,260},{6,63,10457},{0,63,2642},{26,63,872},{26,63,872},{26,63,872},{25,63,397},{31,45,1513},{23,63,794},{23,63,794},{13,63,1},{31,52,1513},{13,63,1},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{16,0,9248},{16,0,9248},{16,0,9248},{16,0,9248},{12,63,3074}, +{12,63,3074},{12,63,3074},{8,63,260},{0,63,2642},{0,63,2642},{17,63,58848},{15,63,39619},{13,63,24975},{12,63,19007},{16,63,54474},{13,63,27057},{10,63,8569},{9,63,461},{8,63,51302},{0,63,5046},{28,63,979},{27,63,806},{27,63,637},{26,63,292},{30,56,1473},{26,63,953},{24,63,605},{16,63,0},{30,58,1473},{16,63,0},{19,63,13604},{19,63,13604},{19,63,13604},{18,63,11057},{16,63,10429},{14,63,6339},{14,63,6339}, +{10,63,424},{8,63,9713},{1,63,2900},{27,63,637},{27,63,637},{27,63,637},{26,63,292},{31,48,1105},{24,63,605},{24,63,605},{16,63,0},{31,54,1105},{16,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{31,63,0},{0,63,0},{31,63,0},{0,63,0},{17,0,9248},{17,0,9248},{17,0,9248},{17,0,9248},{12,63,3330},{12,63,3330},{12,63,3330},{10,63,424},{1,63,2900}, +{1,63,2900}, diff --git a/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc b/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc new file mode 100644 index 0000000..6669852 --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_alpha.inc @@ -0,0 +1,49 @@ +{7,0,47},{7,0,44},{2,0,15},{2,0,12},{8,2,48},{0,0,0},{15,0,27},{15,1,24},{9,0,7},{15,1,24},{23,3,96},{6,0,3},{24,7,27},{24,7,24},{18,3,6},{18,5,4},{24,5,16},{21,1,6},{32,15,27},{32,15,24},{26,11,6},{26,13,4},{32,13,16},{22,3,1},{41,24,27},{41,24,24},{35,20,6},{35,22,4},{41,22,16},{31,12,1},{49,32,27}, +{49,32,24},{43,28,6},{43,30,4},{49,30,16},{39,20,1},{57,40,27},{57,40,24},{51,36,6},{51,38,4},{57,38,16},{47,28,1},{65,48,27},{65,48,24},{59,44,6},{59,46,4},{65,46,16},{55,36,1},{74,57,27},{74,57,24},{68,53,6},{68,55,4},{74,55,16},{64,45,1},{82,65,27},{82,65,24},{76,61,6},{76,63,4},{82,63,16},{72,53,1},{90,73,27},{90,73,24},{84,69,6}, +{84,71,4},{90,71,16},{80,61,1},{98,81,27},{98,81,24},{92,77,6},{92,79,4},{98,79,16},{88,69,1},{107,90,27},{107,90,24},{101,86,6},{101,88,4},{107,88,16},{97,78,1},{115,98,27},{115,98,24},{109,94,6},{109,96,4},{115,96,16},{105,86,1},{123,106,27},{123,106,24},{117,102,6},{117,104,4},{123,104,16},{113,94,1},{131,114,27},{131,114,24},{125,110,6},{125,112,4},{131,112,16}, +{121,102,1},{140,123,27},{140,123,24},{134,119,6},{134,121,4},{140,121,16},{130,111,1},{148,131,27},{148,131,24},{142,127,6},{142,129,4},{148,129,16},{138,119,1},{156,139,27},{156,139,24},{150,135,6},{150,137,4},{156,137,16},{146,127,1},{164,147,27},{164,147,24},{158,143,6},{158,145,4},{164,145,16},{154,135,1},{173,156,27},{173,156,24},{167,152,6},{167,154,4},{173,154,16},{163,144,1},{181,164,27}, +{181,164,24},{175,160,6},{175,162,4},{181,162,16},{171,152,1},{189,172,27},{189,172,24},{183,168,6},{183,170,4},{189,170,16},{179,160,1},{197,180,27},{197,180,24},{191,176,6},{191,178,4},{197,178,16},{187,168,1},{206,189,27},{206,189,24},{200,185,6},{200,187,4},{206,187,16},{196,177,1},{214,197,27},{214,197,24},{208,193,6},{208,195,4},{214,195,16},{204,185,1},{222,205,27},{222,205,24},{216,201,6}, +{216,203,4},{222,203,16},{212,193,1},{230,213,27},{230,213,24},{224,209,6},{224,211,4},{230,211,16},{220,201,1},{239,222,27},{239,222,24},{233,218,6},{233,220,4},{239,220,16},{229,210,1},{247,230,27},{247,230,24},{241,226,6},{241,228,4},{247,228,16},{237,218,1},{255,238,27},{255,238,24},{249,234,6},{249,236,4},{255,236,16},{245,226,1},{255,247,7},{255,248,4},{255,247,7},{255,248,4},{255,0,0}, +{253,234,1},{16,0,47},{16,0,44},{5,0,15},{5,0,12},{17,5,48},{0,0,0},{37,1,111},{36,2,108},{13,0,11},{13,3,12},{37,1,96},{3,0,3},{33,0,27},{33,0,24},{31,0,27},{31,1,24},{45,9,96},{11,0,3},{40,7,27},{41,8,24},{39,7,27},{29,0,4},{41,3,16},{19,1,2},{49,16,27},{50,17,24},{38,5,6},{38,6,4},{50,12,16},{40,4,6},{57,24,27}, +{58,25,24},{46,13,6},{46,14,4},{58,20,16},{36,0,1},{65,32,27},{66,33,24},{54,21,6},{54,22,4},{66,28,16},{44,6,1},{73,40,27},{74,41,24},{62,29,6},{62,30,4},{74,36,16},{52,14,1},{82,49,27},{83,50,24},{71,38,6},{71,39,4},{83,45,16},{61,23,1},{90,57,27},{91,58,24},{79,46,6},{79,47,4},{91,53,16},{69,31,1},{98,65,27},{99,66,24},{87,54,6}, +{87,55,4},{99,61,16},{77,39,1},{106,73,27},{107,74,24},{95,62,6},{95,63,4},{107,69,16},{85,47,1},{115,82,27},{116,83,24},{104,71,6},{104,72,4},{116,78,16},{94,56,1},{123,90,27},{124,91,24},{112,79,6},{112,80,4},{124,86,16},{102,64,1},{131,98,27},{132,99,24},{120,87,6},{120,88,4},{132,94,16},{110,72,1},{139,106,27},{140,107,24},{128,95,6},{128,96,4},{140,102,16}, +{118,80,1},{148,115,27},{149,116,24},{137,104,6},{137,105,4},{149,111,16},{127,89,1},{156,123,27},{157,124,24},{145,112,6},{145,113,4},{157,119,16},{135,97,1},{164,131,27},{165,132,24},{153,120,6},{153,121,4},{165,127,16},{143,105,1},{172,139,27},{173,140,24},{161,128,6},{161,129,4},{173,135,16},{151,113,1},{181,148,27},{182,149,24},{170,137,6},{170,138,4},{182,144,16},{160,122,1},{189,156,27}, +{190,157,24},{178,145,6},{178,146,4},{190,152,16},{168,130,1},{197,164,27},{198,165,24},{186,153,6},{186,154,4},{198,160,16},{176,138,1},{205,172,27},{206,173,24},{194,161,6},{194,162,4},{206,168,16},{184,146,1},{214,181,27},{215,182,24},{203,170,6},{203,171,4},{215,177,16},{193,155,1},{222,189,27},{223,190,24},{211,178,6},{211,179,4},{223,185,16},{201,163,1},{230,197,27},{231,198,24},{219,186,6}, +{219,187,4},{231,193,16},{209,171,1},{238,205,27},{239,206,24},{227,194,6},{227,195,4},{239,201,16},{217,179,1},{247,214,27},{248,215,24},{236,203,6},{236,204,4},{248,210,16},{226,188,1},{255,222,27},{255,222,24},{244,211,6},{244,212,4},{255,220,16},{234,196,1},{254,218,6},{255,242,28},{252,219,6},{252,220,4},{255,245,16},{242,204,1},{255,238,7},{255,239,4},{255,238,7},{255,239,4},{255,0,0}, +{250,212,1},{28,0,47},{28,0,44},{9,0,15},{9,0,12},{29,9,48},{0,0,0},{53,0,111},{53,0,108},{17,0,15},{17,0,12},{37,7,32},{0,0,0},{66,3,111},{63,7,108},{25,0,11},{25,7,12},{65,5,96},{7,0,3},{51,0,27},{71,15,108},{47,0,27},{33,6,8},{73,13,96},{15,0,3},{61,4,27},{80,24,108},{61,4,27},{60,6,24},{62,0,16},{24,4,3},{69,12,27}, +{88,32,108},{69,12,27},{68,14,24},{70,8,16},{32,2,2},{77,20,27},{96,40,108},{58,2,6},{58,2,4},{78,16,16},{60,0,6},{85,28,27},{104,48,108},{66,10,6},{66,10,4},{86,24,16},{68,8,6},{94,37,27},{113,57,108},{75,19,6},{75,19,4},{95,33,16},{77,17,6},{102,45,27},{121,65,108},{83,27,6},{83,27,4},{103,41,16},{65,3,1},{110,53,27},{129,73,108},{91,35,6}, +{91,35,4},{111,49,16},{73,11,1},{118,61,27},{137,81,108},{99,43,6},{99,43,4},{119,57,16},{81,19,1},{127,70,27},{146,90,108},{108,52,6},{108,52,4},{128,66,16},{90,28,1},{135,78,27},{154,98,108},{116,60,6},{116,60,4},{136,74,16},{98,36,1},{143,86,27},{162,106,108},{124,68,6},{124,68,4},{144,82,16},{106,44,1},{151,94,27},{170,114,108},{132,76,6},{132,76,4},{152,90,16}, +{114,52,1},{160,103,27},{179,123,108},{141,85,6},{141,85,4},{161,99,16},{123,61,1},{168,111,27},{187,131,108},{149,93,6},{149,93,4},{169,107,16},{131,69,1},{176,119,27},{195,139,108},{157,101,6},{157,101,4},{177,115,16},{139,77,1},{184,127,27},{203,147,108},{165,109,6},{165,109,4},{185,123,16},{147,85,1},{193,136,27},{212,156,108},{174,118,6},{174,118,4},{194,132,16},{156,94,1},{201,144,27}, +{220,164,108},{182,126,6},{182,126,4},{202,140,16},{164,102,1},{209,152,27},{228,172,108},{190,134,6},{190,134,4},{210,148,16},{172,110,1},{217,160,27},{236,180,108},{198,142,6},{198,142,4},{218,156,16},{180,118,1},{226,169,27},{245,189,108},{207,151,6},{207,151,4},{227,165,16},{189,127,1},{234,177,27},{253,197,108},{215,159,6},{215,159,4},{235,173,16},{197,135,1},{242,185,27},{243,186,24},{223,167,6}, +{223,167,4},{243,181,16},{205,143,1},{250,193,27},{251,194,24},{231,175,6},{231,175,4},{251,189,16},{213,151,1},{255,203,27},{255,206,24},{240,184,6},{240,184,4},{255,208,16},{222,160,1},{251,188,6},{255,230,28},{248,192,6},{248,192,4},{255,233,16},{230,168,1},{255,200,6},{255,202,4},{255,200,6},{255,202,4},{255,0,0},{238,176,1},{255,226,7},{255,227,4},{255,226,7},{255,227,4},{255,0,0}, +{246,184,1},{41,0,47},{41,0,44},{13,0,15},{13,0,12},{42,13,48},{0,0,0},{71,0,111},{71,0,108},{21,0,15},{21,0,12},{50,7,32},{0,0,0},{86,1,111},{85,2,108},{29,1,15},{29,3,12},{87,0,96},{3,0,3},{96,6,111},{93,10,108},{37,0,11},{37,11,12},{95,8,96},{11,0,3},{71,0,27},{102,19,108},{68,0,27},{46,7,8},{104,17,96},{20,0,3},{82,0,27}, +{110,27,108},{81,0,27},{80,2,24},{112,25,96},{28,0,3},{91,7,27},{118,35,108},{91,7,27},{88,10,24},{91,2,16},{36,7,3},{99,15,27},{126,43,108},{99,15,27},{96,18,24},{99,10,16},{44,1,2},{108,24,27},{135,52,108},{108,24,27},{79,0,4},{108,19,16},{53,10,2},{116,32,27},{143,60,108},{87,5,6},{87,7,4},{116,27,16},{90,3,6},{124,40,27},{151,68,108},{95,13,6}, +{95,15,4},{124,35,16},{98,11,6},{132,48,27},{159,76,108},{103,21,6},{103,23,4},{132,43,16},{106,19,6},{141,57,27},{168,85,108},{112,30,6},{112,32,4},{141,52,16},{115,28,6},{149,65,27},{176,93,108},{120,38,6},{120,40,4},{149,60,16},{94,5,1},{157,73,27},{184,101,108},{128,46,6},{128,48,4},{157,68,16},{102,13,1},{165,81,27},{192,109,108},{136,54,6},{136,56,4},{165,76,16}, +{110,21,1},{174,90,27},{201,118,108},{145,63,6},{145,65,4},{174,85,16},{119,30,1},{182,98,27},{209,126,108},{153,71,6},{153,73,4},{182,93,16},{127,38,1},{190,106,27},{217,134,108},{161,79,6},{161,81,4},{190,101,16},{135,46,1},{198,114,27},{225,142,108},{169,87,6},{169,89,4},{198,109,16},{143,54,1},{207,123,27},{234,151,108},{178,96,6},{178,98,4},{207,118,16},{152,63,1},{215,131,27}, +{242,159,108},{186,104,6},{186,106,4},{215,126,16},{160,71,1},{223,139,27},{250,167,108},{194,112,6},{194,114,4},{223,134,16},{168,79,1},{231,147,27},{231,147,24},{202,120,6},{202,122,4},{231,142,16},{176,87,1},{240,156,27},{240,156,24},{211,129,6},{211,131,4},{240,151,16},{185,96,1},{248,164,27},{248,164,24},{219,137,6},{219,139,4},{248,159,16},{193,104,1},{254,173,27},{255,174,24},{227,145,6}, +{227,147,4},{255,169,16},{201,112,1},{255,182,27},{255,187,24},{235,153,6},{235,155,4},{255,193,16},{209,120,1},{249,159,6},{255,218,28},{244,162,6},{244,164,4},{255,220,16},{218,129,1},{254,169,6},{254,168,4},{252,170,6},{252,172,4},{255,245,16},{226,137,1},{255,184,6},{255,190,4},{255,184,6},{255,190,4},{255,0,0},{234,145,1},{255,213,7},{255,214,4},{255,213,7},{255,214,4},{255,0,0}, +{242,153,1},{59,0,47},{59,0,44},{18,0,15},{18,0,12},{60,18,48},{0,0,0},{69,0,47},{68,2,44},{26,0,15},{26,0,12},{68,5,32},{0,0,0},{111,0,111},{111,0,108},{34,0,15},{34,0,12},{76,13,32},{0,0,0},{123,3,111},{122,5,108},{42,3,15},{42,6,12},{125,1,96},{6,0,3},{135,8,111},{131,14,108},{50,0,11},{51,15,12},{134,10,96},{15,0,3},{95,0,27}, +{139,22,108},{59,2,11},{59,5,8},{142,18,96},{23,0,3},{105,0,27},{147,30,108},{99,0,27},{67,13,8},{150,26,96},{31,0,3},{115,0,27},{155,38,108},{113,1,27},{110,4,24},{158,34,96},{39,0,3},{125,7,27},{164,47,108},{125,7,27},{119,13,24},{167,43,96},{48,6,3},{133,15,27},{172,55,108},{133,15,27},{127,21,24},{134,5,16},{56,14,3},{141,23,27},{180,63,108},{141,23,27}, +{135,29,24},{142,13,16},{64,1,2},{149,31,27},{188,71,108},{149,31,27},{143,37,24},{150,21,16},{72,9,2},{158,40,27},{197,80,108},{118,1,6},{117,6,4},{159,30,16},{120,0,6},{166,48,27},{205,88,108},{126,9,6},{125,14,4},{167,38,16},{130,6,6},{174,56,27},{213,96,108},{134,17,6},{133,22,4},{175,46,16},{138,14,6},{182,64,27},{221,104,108},{142,25,6},{141,30,4},{183,54,16}, +{146,22,6},{191,73,27},{230,113,108},{151,34,6},{150,39,4},{192,63,16},{155,31,6},{199,81,27},{238,121,108},{159,42,6},{158,47,4},{200,71,16},{163,39,6},{207,89,27},{246,129,108},{167,50,6},{166,55,4},{208,79,16},{130,1,1},{215,97,27},{254,137,108},{175,58,6},{174,63,4},{216,87,16},{138,9,1},{224,106,27},{224,106,24},{184,67,6},{183,72,4},{225,96,16},{147,18,1},{232,114,27}, +{232,114,24},{192,75,6},{191,80,4},{233,104,16},{155,26,1},{240,122,27},{240,122,24},{200,83,6},{199,88,4},{241,112,16},{163,34,1},{248,130,27},{248,130,24},{208,91,6},{207,96,4},{249,120,16},{171,42,1},{255,140,27},{254,142,24},{217,100,6},{216,105,4},{255,135,16},{180,51,1},{255,149,27},{255,156,24},{225,108,6},{224,113,4},{255,159,16},{188,59,1},{255,159,27},{253,196,28},{233,116,6}, +{232,121,4},{255,184,16},{196,67,1},{247,120,6},{255,205,28},{241,124,6},{240,129,4},{255,208,16},{204,75,1},{252,132,6},{252,132,4},{250,133,6},{249,138,4},{255,236,16},{213,84,1},{255,144,6},{255,150,4},{255,144,6},{255,150,4},{255,0,0},{221,92,1},{254,185,7},{255,175,4},{253,187,7},{255,175,4},{255,0,0},{229,100,1},{255,196,7},{255,199,4},{255,196,7},{255,199,4},{255,0,0}, +{237,108,1},{80,0,47},{80,0,44},{24,0,15},{24,0,12},{80,24,48},{0,0,0},{88,1,47},{88,1,44},{32,0,15},{32,0,12},{88,4,32},{0,0,0},{138,0,111},{138,0,108},{40,0,15},{40,0,12},{96,12,32},{0,0,0},{153,0,111},{153,0,108},{48,0,15},{48,0,12},{104,20,32},{0,0,0},{166,4,111},{164,8,108},{57,4,15},{57,9,12},{167,3,96},{9,0,3},{176,9,111}, +{172,16,108},{65,0,11},{65,17,12},{175,11,96},{17,0,3},{189,13,111},{180,24,108},{73,0,11},{73,1,8},{183,19,96},{25,0,3},{129,0,27},{188,32,108},{83,2,11},{81,9,8},{191,27,96},{33,0,3},{141,0,27},{197,41,108},{132,0,27},{90,18,8},{200,36,96},{42,0,3},{151,0,27},{205,49,108},{148,0,27},{145,3,24},{208,44,96},{50,0,3},{160,3,27},{213,57,108},{160,3,27}, +{153,11,24},{216,52,96},{58,2,3},{168,11,27},{221,65,108},{168,11,27},{161,19,24},{170,0,16},{66,10,3},{177,20,27},{230,74,108},{177,20,27},{170,28,24},{179,7,16},{75,19,3},{185,28,27},{238,82,108},{185,28,27},{178,36,24},{187,15,16},{83,0,2},{193,36,27},{246,90,108},{193,36,27},{186,44,24},{195,23,16},{91,7,2},{201,44,27},{254,98,108},{201,44,27},{147,0,4},{203,31,16}, +{99,15,2},{210,53,27},{211,54,24},{157,1,6},{156,9,4},{212,40,16},{108,24,2},{218,61,27},{219,62,24},{165,9,6},{164,17,4},{220,48,16},{170,6,6},{226,69,27},{227,70,24},{173,17,6},{172,25,4},{228,56,16},{178,14,6},{234,77,27},{235,78,24},{181,25,6},{180,33,4},{236,64,16},{186,22,6},{243,86,27},{244,87,24},{190,34,6},{189,42,4},{245,73,16},{195,31,6},{251,94,27}, +{252,95,24},{198,42,6},{197,50,4},{253,81,16},{203,39,6},{255,104,27},{255,107,24},{206,50,6},{205,58,4},{255,102,16},{211,47,6},{255,113,27},{255,123,24},{214,58,6},{213,66,4},{255,126,16},{219,55,6},{255,126,27},{253,172,28},{223,67,6},{222,75,4},{255,153,16},{174,2,1},{242,66,6},{254,182,28},{231,75,6},{230,83,4},{255,178,16},{182,10,1},{246,79,6},{255,190,28},{239,83,6}, +{238,91,4},{255,202,16},{190,18,1},{251,89,6},{251,88,4},{247,91,6},{246,99,4},{255,227,16},{198,26,1},{255,102,6},{255,108,4},{255,102,6},{255,108,4},{255,0,0},{207,35,1},{255,117,6},{255,132,4},{255,117,6},{255,132,4},{255,0,0},{215,43,1},{254,167,7},{255,156,4},{254,167,7},{255,156,4},{255,0,0},{223,51,1},{255,175,7},{255,181,4},{255,175,7},{255,181,4},{255,0,0}, +{231,59,1},{105,0,47},{105,0,44},{33,0,15},{33,0,12},{106,33,48},{0,0,0},{115,0,47},{114,2,44},{41,0,15},{41,0,12},{114,5,32},{0,0,0},{123,2,47},{124,3,44},{49,0,15},{49,0,12},{122,13,32},{0,0,0},{190,0,111},{190,0,108},{57,0,15},{57,0,12},{130,21,32},{0,0,0},{205,0,111},{205,0,108},{66,0,15},{66,0,12},{139,30,32},{0,0,0},{217,4,111}, +{215,7,108},{74,4,15},{74,8,12},{218,3,96},{8,0,3},{229,8,111},{223,15,108},{80,0,11},{82,16,12},{226,11,96},{16,0,3},{237,13,111},{231,23,108},{89,0,11},{90,24,12},{234,19,96},{24,0,3},{251,17,111},{240,32,108},{99,0,11},{99,1,8},{243,28,96},{33,0,3},{169,0,27},{248,40,108},{108,2,11},{107,9,8},{251,36,96},{41,0,3},{181,0,27},{254,49,108},{166,0,27}, +{115,17,8},{188,79,32},{49,0,3},{190,0,27},{255,59,108},{181,0,27},{123,25,8},{196,87,32},{57,0,3},{203,0,27},{203,0,24},{197,0,27},{196,2,24},{205,96,32},{66,0,3},{213,1,27},{212,3,24},{211,2,27},{204,10,24},{213,104,32},{74,1,3},{221,9,27},{220,11,24},{219,10,27},{212,18,24},{221,0,16},{82,9,3},{229,17,27},{228,19,24},{227,18,27},{220,26,24},{229,5,16}, +{90,17,3},{238,26,27},{237,28,24},{236,27,27},{229,35,24},{238,14,16},{99,26,3},{246,34,27},{245,36,24},{244,35,27},{237,43,24},{246,22,16},{107,34,3},{254,42,27},{253,44,24},{252,43,27},{245,51,24},{254,30,16},{115,6,2},{255,52,27},{255,58,24},{255,52,27},{253,59,24},{255,53,16},{123,14,2},{255,64,27},{255,74,24},{196,0,6},{198,100,8},{255,80,16},{132,23,2},{255,74,27}, +{255,89,24},{206,1,6},{206,4,4},{255,105,16},{140,31,2},{255,86,27},{253,147,28},{215,7,6},{214,12,4},{255,129,16},{219,4,6},{255,95,27},{255,155,28},{223,15,6},{222,20,4},{255,153,16},{227,12,6},{242,17,6},{255,166,28},{232,24,6},{231,29,4},{255,181,16},{236,21,6},{247,26,6},{255,175,28},{240,32,6},{239,37,4},{255,205,16},{244,29,6},{251,38,6},{251,37,4},{248,40,6}, +{247,45,4},{255,230,16},{252,37,6},{255,50,6},{255,53,4},{255,50,6},{255,53,4},{255,0,0},{189,80,2},{255,65,6},{255,80,4},{255,65,6},{255,80,4},{255,0,0},{198,89,2},{252,131,7},{255,105,4},{252,131,7},{255,105,4},{255,0,0},{206,97,2},{254,139,7},{255,129,4},{253,141,7},{255,129,4},{255,0,0},{214,105,2},{255,150,7},{255,153,4},{255,150,7},{255,153,4},{255,0,0}, +{222,0,1},{181,0,47},{178,0,44},{47,0,15},{47,0,12},{183,47,48},{0,0,0},{190,0,47},{190,0,44},{55,0,15},{55,0,12},{191,55,48},{0,0,0},{199,0,47},{199,0,44},{63,0,15},{63,0,12},{199,63,48},{0,0,0},{207,0,47},{207,1,44},{71,0,15},{71,0,12},{207,4,32},{0,0,0},{216,1,47},{218,3,44},{80,0,15},{80,0,12},{216,13,32},{0,0,0},{225,1,47}, +{227,6,44},{88,0,15},{88,0,12},{224,21,32},{0,0,0},{233,2,47},{235,11,44},{96,1,15},{96,2,12},{232,29,32},{2,0,3},{241,4,47},{243,19,44},{104,5,15},{104,10,12},{240,37,32},{10,0,3},{251,5,47},{252,28,44},{113,9,15},{113,19,12},{249,46,32},{19,0,3},{255,9,47},{255,37,44},{117,0,11},{121,27,12},{255,55,32},{27,0,3},{255,9,47},{255,46,44},{126,0,11}, +{129,35,12},{255,67,32},{35,0,3},{248,0,27},{255,55,44},{137,0,11},{137,43,12},{255,79,32},{43,0,3},{250,0,27},{255,64,44},{147,2,11},{146,6,8},{255,93,32},{52,0,3},{251,0,27},{255,73,44},{155,4,11},{154,14,8},{255,104,32},{60,0,3},{253,0,27},{248,0,24},{233,0,27},{162,22,8},{255,116,32},{68,0,3},{254,0,27},{254,0,24},{248,0,27},{170,30,8},{255,128,32}, +{76,0,3},{255,1,27},{255,7,24},{255,1,27},{179,39,8},{255,22,16},{85,0,3},{255,2,27},{255,22,24},{255,7,27},{187,47,8},{255,47,16},{93,0,3},{255,4,27},{251,100,28},{182,0,7},{195,55,8},{255,71,16},{101,0,3},{255,4,27},{253,108,28},{191,0,7},{203,63,8},{255,95,16},{109,0,3},{255,7,27},{255,118,28},{200,0,7},{212,72,8},{255,123,16},{118,0,3},{246,0,7}, +{255,129,28},{209,0,7},{220,80,8},{255,147,16},{126,0,3},{246,0,7},{255,138,28},{218,0,7},{228,88,8},{255,172,16},{134,0,3},{249,3,7},{245,91,8},{228,3,7},{236,96,8},{255,196,16},{142,6,3},{251,14,7},{250,102,8},{237,12,7},{245,105,8},{255,223,16},{151,15,3},{253,22,7},{254,112,8},{245,20,7},{253,113,8},{255,248,16},{159,23,3},{253,31,7},{255,124,8},{249,28,7}, +{255,124,8},{255,0,0},{167,31,3},{254,39,7},{255,10,4},{252,37,7},{255,10,4},{255,0,0},{175,39,3},{255,48,7},{255,38,4},{254,48,7},{255,38,4},{255,0,0},{184,48,3},{255,56,7},{255,62,4},{255,56,7},{255,62,4},{255,0,0},{192,56,3},{255,65,7},{255,86,4},{255,65,7},{255,86,4},{255,0,0},{200,64,3},{255,74,7},{255,111,4},{255,77,7},{255,111,4},{255,0,0}, +{208,5,2}, diff --git a/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc b/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc new file mode 100644 index 0000000..c078098 --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder_tables_bc7_m5_color.inc @@ -0,0 +1,481 @@ +{0,7,18},{0,5,2},{0,4,1},{0,3,8},{0,4,35},{0,3,24},{0,3,12},{0,2,29},{0,2,36},{0,2,30},{0,7,18},{0,5,2},{0,4,1},{0,3,8},{2,0,35},{0,3,24},{0,3,12},{0,2,29},{4,0,35},{0,2,29},{0,3,0},{0,3,0},{0,3,0},{0,1,1},{0,1,2},{0,1,2},{0,1,2},{0,1,1},{1,0,3},{0,1,2},{0,3,0}, +{0,3,0},{0,3,0},{0,1,1},{1,0,2},{1,0,2},{1,0,2},{0,1,1},{1,0,2},{0,1,1},{4,0,18},{0,5,2},{0,4,1},{0,3,8},{4,0,18},{7,0,18},{0,3,8},{0,2,20},{7,0,18},{0,2,20},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,15,38},{2,11,20},{2,8,24}, +{1,8,21},{0,16,51},{0,10,19},{0,8,2},{0,6,24},{0,8,76},{0,6,40},{3,13,18},{3,10,2},{3,8,1},{3,7,5},{8,0,51},{1,9,19},{0,8,2},{0,6,24},{16,0,51},{0,6,24},{2,11,20},{2,11,20},{2,11,20},{1,7,20},{0,12,8},{0,7,2},{0,7,2},{0,5,1},{0,5,19},{0,5,10},{3,9,0},{3,9,0},{3,9,0},{3,6,0},{6,0,8}, +{1,7,0},{1,7,0},{0,5,1},{12,0,8},{0,5,1},{10,0,18},{2,11,0},{3,8,1},{0,8,1},{10,0,18},{20,0,18},{0,8,1},{0,6,20},{20,0,18},{0,6,20},{1,0,20},{1,0,20},{1,0,20},{1,0,20},{0,9,0},{0,9,0},{0,9,0},{0,4,1},{0,3,8},{0,3,8},{6,19,38},{6,15,20},{6,12,24},{5,12,21},{4,20,51},{4,14,19},{4,12,2}, +{4,10,24},{0,14,52},{1,10,20},{7,17,18},{7,14,2},{7,12,1},{7,11,5},{14,0,51},{5,13,19},{4,12,2},{1,10,20},{29,0,51},{1,10,20},{6,15,20},{6,15,20},{6,15,20},{5,11,20},{4,16,8},{4,11,2},{4,11,2},{4,9,1},{0,12,8},{1,9,2},{7,13,0},{7,13,0},{7,13,0},{7,10,0},{12,0,8},{5,11,0},{5,11,0},{3,9,0},{24,0,8}, +{3,9,0},{15,1,18},{6,15,0},{7,12,1},{3,12,0},{15,1,18},{32,0,18},{3,12,0},{0,10,20},{32,0,18},{0,10,20},{5,0,20},{5,0,20},{5,0,20},{5,0,20},{4,13,0},{4,13,0},{4,13,0},{4,8,1},{1,10,0},{1,10,0},{10,23,38},{10,19,20},{10,16,24},{9,16,21},{8,24,51},{8,18,19},{8,16,2},{8,14,24},{3,18,52},{5,14,20},{11,21,18}, +{11,18,2},{11,16,1},{11,15,5},{20,0,51},{9,17,19},{8,16,2},{5,14,20},{41,0,51},{5,14,20},{10,19,20},{10,19,20},{10,19,20},{9,15,20},{8,20,8},{8,15,2},{8,15,2},{8,13,1},{4,16,8},{5,13,2},{11,17,0},{11,17,0},{11,17,0},{11,14,0},{18,0,8},{9,15,0},{9,15,0},{7,13,0},{36,0,8},{7,13,0},{21,1,18},{10,19,0},{11,16,1}, +{7,16,0},{21,1,18},{44,0,18},{7,16,0},{0,14,20},{44,0,18},{0,14,20},{9,0,20},{9,0,20},{9,0,20},{9,0,20},{8,17,0},{8,17,0},{8,17,0},{8,12,1},{5,14,0},{5,14,0},{14,29,36},{14,24,18},{14,21,23},{14,20,20},{13,28,52},{13,22,20},{13,20,2},{12,19,23},{7,23,51},{9,19,18},{16,25,19},{15,23,1},{16,20,2},{15,20,6},{27,0,51}, +{13,22,19},{13,20,1},{8,19,18},{55,0,51},{8,19,18},{14,24,18},{14,24,18},{14,24,18},{14,19,18},{13,23,9},{13,20,1},{13,20,1},{12,17,2},{9,20,8},{10,18,1},{16,20,1},{16,20,1},{16,20,1},{16,18,1},{24,1,8},{14,19,0},{14,19,0},{12,17,1},{50,0,8},{12,17,1},{28,0,18},{15,23,0},{16,20,1},{12,20,1},{28,0,18},{58,0,18},{12,20,1}, +{0,19,18},{58,0,18},{0,19,18},{14,0,18},{14,0,18},{14,0,18},{14,0,18},{13,20,1},{13,20,1},{13,20,1},{12,17,1},{10,18,0},{10,18,0},{18,33,36},{18,28,18},{18,25,23},{18,24,20},{17,32,52},{17,26,20},{17,24,2},{16,23,23},{11,27,51},{13,23,18},{20,29,19},{19,27,1},{20,24,2},{19,24,6},{33,0,51},{17,26,19},{17,24,1},{12,23,18},{66,0,51}, +{12,23,18},{18,28,18},{18,28,18},{18,28,18},{18,23,18},{17,27,9},{17,24,1},{17,24,1},{16,21,2},{13,24,8},{14,22,1},{20,24,1},{20,24,1},{20,24,1},{20,22,1},{30,1,8},{18,23,0},{18,23,0},{16,21,1},{62,0,8},{16,21,1},{34,0,18},{19,27,0},{20,24,1},{16,24,1},{34,0,18},{69,0,18},{16,24,1},{0,23,18},{69,0,18},{0,23,18},{18,0,18}, +{18,0,18},{18,0,18},{18,0,18},{17,24,1},{17,24,1},{17,24,1},{16,21,1},{14,22,0},{14,22,0},{22,37,36},{22,32,18},{22,29,23},{22,28,20},{21,36,52},{21,30,20},{21,28,2},{20,27,23},{15,31,51},{17,27,18},{24,33,19},{23,31,1},{24,28,2},{23,28,6},{39,0,51},{21,30,19},{21,28,1},{16,27,18},{78,0,51},{16,27,18},{22,32,18},{22,32,18},{22,32,18}, +{22,27,18},{21,31,9},{21,28,1},{21,28,1},{20,25,2},{17,28,8},{18,26,1},{24,28,1},{24,28,1},{24,28,1},{24,26,1},{36,1,8},{22,27,0},{22,27,0},{20,25,1},{74,0,8},{20,25,1},{40,0,18},{23,31,0},{24,28,1},{20,28,1},{40,0,18},{82,0,18},{20,28,1},{0,27,18},{82,0,18},{0,27,18},{22,0,18},{22,0,18},{22,0,18},{22,0,18},{21,28,1}, +{21,28,1},{21,28,1},{20,25,1},{18,26,0},{18,26,0},{26,41,36},{26,36,18},{26,33,23},{26,32,20},{25,40,52},{25,34,20},{25,32,2},{24,31,23},{19,35,51},{21,31,18},{28,37,19},{27,35,1},{28,32,2},{27,32,6},{45,0,51},{25,34,19},{25,32,1},{20,31,18},{91,0,51},{20,31,18},{26,36,18},{26,36,18},{26,36,18},{26,31,18},{25,35,9},{25,32,1},{25,32,1}, +{24,29,2},{21,32,8},{22,30,1},{28,32,1},{28,32,1},{28,32,1},{28,30,1},{42,1,8},{26,31,0},{26,31,0},{24,29,1},{86,0,8},{24,29,1},{46,0,18},{27,35,0},{28,32,1},{24,32,1},{46,0,18},{94,0,18},{24,32,1},{0,31,18},{94,0,18},{0,31,18},{26,0,18},{26,0,18},{26,0,18},{26,0,18},{25,32,1},{25,32,1},{25,32,1},{24,29,1},{22,30,0}, +{22,30,0},{31,44,38},{31,40,20},{31,37,24},{30,37,21},{29,45,51},{29,39,19},{29,37,2},{29,35,24},{24,39,52},{26,35,20},{32,42,18},{32,39,2},{32,37,1},{32,36,5},{51,0,51},{30,38,19},{29,37,2},{26,35,20},{104,0,51},{26,35,20},{31,40,20},{31,40,20},{31,40,20},{30,36,20},{29,41,8},{29,36,2},{29,36,2},{29,34,1},{25,37,8},{26,34,2},{32,38,0}, +{32,38,0},{32,38,0},{32,35,0},{49,0,8},{30,36,0},{30,36,0},{28,34,0},{100,0,8},{28,34,0},{53,0,18},{31,40,0},{32,37,1},{28,37,0},{53,0,18},{107,0,18},{28,37,0},{0,35,20},{107,0,18},{0,35,20},{30,0,20},{30,0,20},{30,0,20},{30,0,20},{29,38,0},{29,38,0},{29,38,0},{29,33,1},{26,35,0},{26,35,0},{35,48,38},{35,44,20},{35,41,24}, +{34,41,21},{33,49,51},{33,43,19},{33,41,2},{33,39,24},{28,43,52},{30,39,20},{36,46,18},{36,43,2},{36,41,1},{36,40,5},{57,0,51},{34,42,19},{33,41,2},{30,39,20},{117,0,51},{30,39,20},{35,44,20},{35,44,20},{35,44,20},{34,40,20},{33,45,8},{33,40,2},{33,40,2},{33,38,1},{29,41,8},{30,38,2},{36,42,0},{36,42,0},{36,42,0},{36,39,0},{55,0,8}, +{34,40,0},{34,40,0},{32,38,0},{112,0,8},{32,38,0},{59,0,18},{35,44,0},{36,41,1},{32,41,0},{59,0,18},{120,0,18},{32,41,0},{0,39,20},{120,0,18},{0,39,20},{34,0,20},{34,0,20},{34,0,20},{34,0,20},{33,42,0},{33,42,0},{33,42,0},{33,37,1},{30,39,0},{30,39,0},{39,52,38},{39,48,20},{39,45,24},{38,45,21},{37,53,51},{37,47,19},{37,45,2}, +{37,43,24},{32,47,52},{34,43,20},{40,50,18},{40,47,2},{40,45,1},{40,44,5},{63,0,51},{38,46,19},{37,45,2},{34,43,20},{127,1,51},{34,43,20},{39,48,20},{39,48,20},{39,48,20},{38,44,20},{37,49,8},{37,44,2},{37,44,2},{37,42,1},{33,45,8},{34,42,2},{40,46,0},{40,46,0},{40,46,0},{40,43,0},{61,0,8},{38,44,0},{38,44,0},{36,42,0},{124,0,8}, +{36,42,0},{64,0,18},{39,48,0},{40,45,1},{36,45,0},{64,0,18},{126,3,18},{36,45,0},{0,43,20},{126,3,18},{0,43,20},{38,0,20},{38,0,20},{38,0,20},{38,0,20},{37,46,0},{37,46,0},{37,46,0},{37,41,1},{34,43,0},{34,43,0},{43,56,38},{43,52,20},{43,49,24},{42,49,21},{41,57,51},{41,51,19},{41,49,2},{41,47,24},{36,51,52},{38,47,20},{44,54,18}, +{44,51,2},{44,49,1},{44,48,5},{69,0,51},{42,50,19},{41,49,2},{38,47,20},{127,7,51},{38,47,20},{43,52,20},{43,52,20},{43,52,20},{42,48,20},{41,53,8},{41,48,2},{41,48,2},{41,46,1},{37,49,8},{38,46,2},{44,50,0},{44,50,0},{44,50,0},{44,47,0},{66,1,8},{42,48,0},{42,48,0},{40,46,0},{126,5,8},{40,46,0},{70,0,18},{43,52,0},{44,49,1}, +{40,49,0},{70,0,18},{126,9,18},{40,49,0},{0,47,20},{126,9,18},{0,47,20},{42,0,20},{42,0,20},{42,0,20},{42,0,20},{41,50,0},{41,50,0},{41,50,0},{41,45,1},{38,47,0},{38,47,0},{47,62,36},{47,57,18},{47,54,23},{47,53,20},{46,61,52},{46,55,20},{46,53,2},{45,52,23},{40,56,51},{42,52,18},{49,58,19},{48,56,1},{49,53,2},{48,53,6},{75,1,51}, +{46,55,19},{46,53,1},{41,52,18},{126,14,51},{41,52,18},{47,57,18},{47,57,18},{47,57,18},{47,52,18},{46,56,9},{46,53,1},{46,53,1},{45,50,2},{42,53,8},{43,51,1},{49,53,1},{49,53,1},{49,53,1},{49,51,1},{73,0,8},{47,52,0},{47,52,0},{45,50,1},{126,12,8},{45,50,1},{77,0,18},{48,56,0},{49,53,1},{45,53,1},{77,0,18},{127,15,18},{45,53,1}, +{0,52,18},{127,15,18},{0,52,18},{47,0,18},{47,0,18},{47,0,18},{47,0,18},{46,53,1},{46,53,1},{46,53,1},{45,50,1},{43,51,0},{43,51,0},{51,65,36},{51,61,18},{51,58,23},{51,57,20},{50,64,52},{50,59,20},{50,57,2},{49,56,23},{44,60,51},{46,56,18},{53,62,19},{52,60,1},{53,57,2},{52,57,6},{81,0,51},{50,59,19},{50,57,1},{45,56,18},{126,20,51}, +{45,56,18},{51,61,18},{51,61,18},{51,61,18},{51,56,18},{50,60,9},{50,57,1},{50,57,1},{49,54,2},{46,57,8},{47,55,1},{53,57,1},{53,57,1},{53,57,1},{53,55,1},{79,0,8},{51,56,0},{51,56,0},{49,54,1},{127,17,8},{49,54,1},{83,0,18},{52,60,0},{53,57,1},{49,57,1},{83,0,18},{127,21,18},{49,57,1},{0,56,18},{127,21,18},{0,56,18},{51,0,18}, +{51,0,18},{51,0,18},{51,0,18},{50,57,1},{50,57,1},{50,57,1},{49,54,1},{47,55,0},{47,55,0},{55,69,36},{55,64,19},{55,62,23},{55,61,20},{54,68,52},{54,63,20},{54,61,2},{53,60,23},{48,64,51},{50,60,18},{57,65,19},{56,64,2},{57,61,2},{56,61,6},{87,0,51},{54,63,19},{54,61,1},{49,60,18},{126,26,51},{49,60,18},{55,65,18},{55,65,18},{55,65,18}, +{55,60,18},{54,64,9},{54,61,1},{54,61,1},{53,58,2},{50,61,8},{51,59,1},{57,61,1},{57,61,1},{57,61,1},{57,59,1},{85,0,8},{55,60,0},{55,60,0},{53,58,1},{127,23,8},{53,58,1},{89,0,18},{55,64,1},{57,61,1},{53,61,1},{89,0,18},{127,27,18},{53,61,1},{0,60,18},{127,27,18},{0,60,18},{55,0,18},{55,0,18},{55,0,18},{55,0,18},{54,61,1}, +{54,61,1},{54,61,1},{53,58,1},{51,59,0},{51,59,0},{59,73,36},{59,68,19},{59,66,26},{59,64,22},{58,72,52},{57,67,19},{57,65,2},{57,63,28},{52,68,51},{53,64,21},{61,69,19},{60,67,2},{61,65,1},{60,65,5},{93,0,51},{57,67,18},{57,65,1},{52,64,20},{126,32,51},{52,64,20},{59,69,18},{59,69,18},{59,69,18},{59,64,18},{58,68,9},{58,64,2},{58,64,2}, +{57,62,2},{55,64,9},{55,63,1},{61,65,1},{61,65,1},{61,65,1},{61,63,1},{91,0,8},{58,64,1},{58,64,1},{57,62,1},{127,29,8},{57,62,1},{95,0,18},{60,67,1},{61,65,0},{56,65,0},{95,0,18},{127,33,18},{56,65,0},{0,64,20},{127,33,18},{0,64,20},{59,0,18},{59,0,18},{59,0,18},{59,0,18},{58,65,1},{58,65,1},{58,65,1},{57,62,1},{55,63,0}, +{55,63,0},{63,79,38},{63,73,21},{64,70,28},{63,69,22},{62,78,51},{62,71,18},{62,69,2},{61,68,26},{57,72,51},{58,68,19},{65,74,19},{64,72,1},{65,69,2},{64,69,6},{100,0,51},{62,71,18},{62,69,2},{58,68,18},{127,38,51},{58,68,18},{63,74,20},{63,74,20},{63,74,20},{63,68,21},{62,73,8},{62,69,1},{62,69,1},{62,66,1},{59,69,9},{60,66,2},{65,69,1}, +{65,69,1},{65,69,1},{65,67,1},{98,0,8},{63,68,1},{63,68,1},{62,66,1},{127,36,8},{62,66,1},{101,1,18},{64,72,0},{65,69,1},{62,69,1},{101,1,18},{126,40,18},{62,69,1},{0,68,18},{126,40,18},{0,68,18},{63,0,20},{63,0,20},{63,0,20},{63,0,20},{62,70,0},{62,70,0},{62,70,0},{62,66,0},{60,66,1},{60,66,1},{67,82,36},{67,77,18},{67,74,23}, +{67,73,20},{66,81,52},{66,75,20},{66,73,2},{65,72,23},{61,76,51},{62,72,19},{69,78,19},{68,76,1},{69,73,2},{68,73,6},{106,0,51},{66,75,19},{66,73,1},{62,72,18},{127,44,51},{62,72,18},{67,77,18},{67,77,18},{67,77,18},{67,72,18},{66,76,9},{66,73,1},{66,73,1},{65,70,2},{63,73,9},{63,71,2},{69,73,1},{69,73,1},{69,73,1},{69,71,1},{104,0,8}, +{67,72,0},{67,72,0},{65,70,1},{127,42,8},{65,70,1},{107,1,18},{68,76,0},{69,73,1},{65,73,1},{107,1,18},{126,46,18},{65,73,1},{0,72,18},{126,46,18},{0,72,18},{67,0,18},{67,0,18},{67,0,18},{67,0,18},{66,73,1},{66,73,1},{66,73,1},{65,70,1},{63,71,1},{63,71,1},{71,86,36},{71,81,18},{71,78,23},{71,77,20},{70,85,52},{70,79,20},{70,77,2}, +{69,76,23},{64,80,51},{66,76,18},{73,82,19},{72,80,1},{73,77,2},{72,77,6},{112,0,51},{70,79,19},{70,77,1},{65,76,18},{127,50,51},{65,76,18},{71,81,18},{71,81,18},{71,81,18},{71,76,18},{70,80,9},{70,77,1},{70,77,1},{69,74,2},{66,77,8},{67,75,1},{73,77,1},{73,77,1},{73,77,1},{73,75,1},{110,0,8},{71,76,0},{71,76,0},{69,74,1},{126,48,8}, +{69,74,1},{113,0,18},{72,80,0},{73,77,1},{69,77,1},{113,0,18},{126,52,18},{69,77,1},{0,76,18},{126,52,18},{0,76,18},{71,0,18},{71,0,18},{71,0,18},{71,0,18},{70,77,1},{70,77,1},{70,77,1},{69,74,1},{67,75,0},{67,75,0},{75,90,36},{75,85,18},{75,82,23},{75,81,20},{74,89,52},{74,83,20},{74,81,2},{73,80,23},{68,84,51},{70,80,18},{77,86,19}, +{76,84,1},{77,81,2},{76,81,6},{118,0,51},{74,83,19},{74,81,1},{69,80,18},{127,56,51},{69,80,18},{75,85,18},{75,85,18},{75,85,18},{75,80,18},{74,84,9},{74,81,1},{74,81,1},{73,78,2},{70,81,8},{71,79,1},{77,81,1},{77,81,1},{77,81,1},{77,79,1},{115,1,8},{75,80,0},{75,80,0},{73,78,1},{126,54,8},{73,78,1},{119,0,18},{76,84,0},{77,81,1}, +{73,81,1},{119,0,18},{126,58,18},{73,81,1},{0,80,18},{126,58,18},{0,80,18},{75,0,18},{75,0,18},{75,0,18},{75,0,18},{74,81,1},{74,81,1},{74,81,1},{73,78,1},{71,79,0},{71,79,0},{80,93,38},{80,89,20},{80,86,24},{79,86,21},{78,94,51},{78,88,19},{78,86,2},{78,84,24},{73,88,52},{75,84,20},{81,91,18},{81,88,2},{81,86,1},{81,85,5},{124,1,51}, +{79,87,19},{78,86,2},{75,84,20},{126,63,51},{75,84,20},{80,89,20},{80,89,20},{80,89,20},{79,85,20},{78,90,8},{78,85,2},{78,85,2},{78,83,1},{74,86,8},{75,83,2},{81,87,0},{81,87,0},{81,87,0},{81,84,0},{122,0,8},{79,85,0},{79,85,0},{77,83,0},{126,61,8},{77,83,0},{126,0,18},{80,89,0},{81,86,1},{77,86,0},{126,0,18},{126,64,18},{77,86,0}, +{0,84,20},{126,64,18},{0,84,20},{79,0,20},{79,0,20},{79,0,20},{79,0,20},{78,87,0},{78,87,0},{78,87,0},{78,82,1},{75,84,0},{75,84,0},{84,97,38},{84,93,20},{84,90,24},{83,90,21},{82,98,51},{82,92,19},{82,90,2},{82,88,24},{77,92,52},{79,88,20},{85,95,18},{85,92,2},{85,90,1},{85,89,5},{127,7,51},{83,91,19},{82,90,2},{79,88,20},{127,68,51}, +{79,88,20},{84,93,20},{84,93,20},{84,93,20},{83,89,20},{82,94,8},{82,89,2},{82,89,2},{82,87,1},{78,90,8},{79,87,2},{85,91,0},{85,91,0},{85,91,0},{85,88,0},{127,2,8},{83,89,0},{83,89,0},{81,87,0},{127,66,8},{81,87,0},{127,10,18},{84,93,0},{85,90,1},{81,90,0},{127,10,18},{126,70,18},{81,90,0},{0,88,20},{126,70,18},{0,88,20},{83,0,20}, +{83,0,20},{83,0,20},{83,0,20},{82,91,0},{82,91,0},{82,91,0},{82,86,1},{79,88,0},{79,88,0},{88,101,38},{88,97,20},{88,94,24},{87,94,21},{86,102,51},{86,96,19},{86,94,2},{86,92,24},{81,96,52},{83,92,20},{89,99,18},{89,96,2},{89,94,1},{89,93,5},{127,19,51},{87,95,19},{86,94,2},{83,92,20},{127,74,51},{83,92,20},{88,97,20},{88,97,20},{88,97,20}, +{87,93,20},{86,98,8},{86,93,2},{86,93,2},{86,91,1},{82,94,8},{83,91,2},{89,95,0},{89,95,0},{89,95,0},{89,92,0},{127,14,8},{87,93,0},{87,93,0},{85,91,0},{127,72,8},{85,91,0},{127,22,18},{88,97,0},{89,94,1},{85,94,0},{127,22,18},{126,76,18},{85,94,0},{0,92,20},{126,76,18},{0,92,20},{87,0,20},{87,0,20},{87,0,20},{87,0,20},{86,95,0}, +{86,95,0},{86,95,0},{86,90,1},{83,92,0},{83,92,0},{92,105,38},{92,101,20},{92,98,24},{91,98,21},{90,106,51},{90,100,19},{90,98,2},{90,96,24},{85,100,52},{87,96,20},{93,103,18},{93,100,2},{93,98,1},{93,97,5},{127,31,51},{91,99,19},{90,98,2},{87,96,20},{127,80,51},{87,96,20},{92,101,20},{92,101,20},{92,101,20},{91,97,20},{90,102,8},{90,97,2},{90,97,2}, +{90,95,1},{86,98,8},{87,95,2},{93,99,0},{93,99,0},{93,99,0},{93,96,0},{127,27,8},{91,97,0},{91,97,0},{89,95,0},{126,78,8},{89,95,0},{127,34,18},{92,101,0},{93,98,1},{89,98,0},{127,34,18},{126,82,18},{89,98,0},{0,96,20},{126,82,18},{0,96,20},{91,0,20},{91,0,20},{91,0,20},{91,0,20},{90,99,0},{90,99,0},{90,99,0},{90,94,1},{87,96,0}, +{87,96,0},{96,111,36},{96,106,18},{96,103,23},{96,102,20},{95,110,52},{95,104,20},{95,102,2},{94,101,23},{89,105,51},{91,101,18},{98,107,19},{97,105,1},{98,102,2},{97,102,6},{127,45,51},{95,104,19},{95,102,1},{90,101,18},{126,87,51},{90,101,18},{96,106,18},{96,106,18},{96,106,18},{96,101,18},{95,105,9},{95,102,1},{95,102,1},{94,99,2},{91,102,8},{92,100,1},{98,102,1}, +{98,102,1},{98,102,1},{98,100,1},{127,40,8},{96,101,0},{96,101,0},{94,99,1},{126,85,8},{94,99,1},{127,48,18},{97,105,0},{98,102,1},{94,102,1},{127,48,18},{127,88,18},{94,102,1},{0,101,18},{127,88,18},{0,101,18},{96,0,18},{96,0,18},{96,0,18},{96,0,18},{95,102,1},{95,102,1},{95,102,1},{94,99,1},{92,100,0},{92,100,0},{100,115,36},{100,110,18},{100,107,23}, +{100,106,20},{99,114,52},{99,108,20},{99,106,2},{98,105,23},{93,109,51},{95,105,18},{102,111,19},{101,109,1},{102,106,2},{101,106,6},{127,57,51},{99,108,19},{99,106,1},{94,105,18},{126,93,51},{94,105,18},{100,110,18},{100,110,18},{100,110,18},{100,105,18},{99,109,9},{99,106,1},{99,106,1},{98,103,2},{95,106,8},{96,104,1},{102,106,1},{102,106,1},{102,106,1},{102,104,1},{127,53,8}, +{100,105,0},{100,105,0},{98,103,1},{126,91,8},{98,103,1},{127,60,18},{101,109,0},{102,106,1},{98,106,1},{127,60,18},{127,94,18},{98,106,1},{0,105,18},{127,94,18},{0,105,18},{100,0,18},{100,0,18},{100,0,18},{100,0,18},{99,106,1},{99,106,1},{99,106,1},{98,103,1},{96,104,0},{96,104,0},{104,119,36},{104,114,18},{104,111,23},{104,110,20},{103,118,52},{103,112,20},{103,110,2}, +{102,109,23},{97,113,51},{99,109,18},{106,115,19},{105,113,1},{106,110,2},{105,110,6},{127,69,51},{103,112,19},{103,110,1},{98,109,18},{126,99,51},{98,109,18},{104,114,18},{104,114,18},{104,114,18},{104,109,18},{103,113,9},{103,110,1},{103,110,1},{102,107,2},{99,110,8},{100,108,1},{106,110,1},{106,110,1},{106,110,1},{106,108,1},{127,64,8},{104,109,0},{104,109,0},{102,107,1},{126,97,8}, +{102,107,1},{127,72,18},{105,113,0},{106,110,1},{102,110,1},{127,72,18},{127,100,18},{102,110,1},{0,109,18},{127,100,18},{0,109,18},{104,0,18},{104,0,18},{104,0,18},{104,0,18},{103,110,1},{103,110,1},{103,110,1},{102,107,1},{100,108,0},{100,108,0},{108,123,36},{108,118,18},{108,115,23},{108,114,20},{107,122,52},{107,116,20},{107,114,2},{106,113,23},{101,117,51},{103,113,18},{110,119,19}, +{109,117,1},{110,114,2},{109,114,6},{127,81,51},{107,116,19},{107,114,1},{102,113,18},{126,105,51},{102,113,18},{108,118,18},{108,118,18},{108,118,18},{108,113,18},{107,117,9},{107,114,1},{107,114,1},{106,111,2},{103,114,8},{104,112,1},{110,114,1},{110,114,1},{110,114,1},{110,112,1},{127,76,8},{108,113,0},{108,113,0},{106,111,1},{126,103,8},{106,111,1},{127,84,18},{109,117,0},{110,114,1}, +{106,114,1},{127,84,18},{127,106,18},{106,114,1},{0,113,18},{127,106,18},{0,113,18},{108,0,18},{108,0,18},{108,0,18},{108,0,18},{107,114,1},{107,114,1},{107,114,1},{106,111,1},{104,112,0},{104,112,0},{113,126,38},{113,122,20},{113,119,24},{112,119,21},{111,127,51},{111,121,19},{111,119,2},{111,117,24},{106,121,52},{108,117,20},{114,124,18},{114,121,2},{114,119,1},{114,118,5},{127,95,51}, +{112,120,19},{111,119,2},{108,117,20},{127,111,51},{108,117,20},{113,122,20},{113,122,20},{113,122,20},{112,118,20},{111,123,8},{111,118,2},{111,118,2},{111,116,1},{107,119,8},{108,116,2},{114,120,0},{114,120,0},{114,120,0},{114,117,0},{127,90,8},{112,118,0},{112,118,0},{110,116,0},{127,109,8},{110,116,0},{127,98,18},{113,122,0},{114,119,1},{110,119,0},{127,98,18},{126,113,18},{110,119,0}, +{0,117,20},{126,113,18},{0,117,20},{112,0,20},{112,0,20},{112,0,20},{112,0,20},{111,120,0},{111,120,0},{111,120,0},{111,115,1},{108,117,0},{108,117,0},{117,127,46},{117,126,20},{117,123,24},{116,123,21},{116,126,63},{115,125,19},{115,123,2},{115,121,24},{110,125,52},{112,121,20},{118,127,20},{118,125,2},{118,123,1},{118,122,5},{127,107,51},{116,124,19},{115,123,2},{112,121,20},{127,117,51}, +{112,121,20},{117,126,20},{117,126,20},{117,126,20},{116,122,20},{115,127,8},{115,122,2},{115,122,2},{115,120,1},{111,123,8},{112,120,2},{118,124,0},{118,124,0},{118,124,0},{118,121,0},{127,102,8},{116,122,0},{116,122,0},{114,120,0},{127,115,8},{114,120,0},{127,110,18},{117,126,0},{118,123,1},{114,123,0},{127,110,18},{126,119,18},{114,123,0},{0,121,20},{126,119,18},{0,121,20},{116,0,20}, +{116,0,20},{116,0,20},{116,0,20},{115,124,0},{115,124,0},{115,124,0},{115,119,1},{112,121,0},{112,121,0},{122,126,86},{121,127,40},{121,127,24},{120,127,21},{121,127,88},{119,127,27},{119,127,2},{119,125,24},{116,127,60},{116,125,20},{123,127,30},{122,127,10},{122,127,1},{122,126,5},{127,119,51},{121,127,24},{119,127,2},{116,125,20},{127,123,51},{116,125,20},{121,127,24},{121,127,24},{121,127,24}, +{120,126,20},{120,127,14},{119,126,2},{119,126,2},{119,124,1},{115,127,8},{116,124,2},{122,126,1},{122,126,1},{122,126,1},{122,125,0},{127,115,8},{120,126,0},{120,126,0},{118,124,0},{127,121,8},{118,124,0},{127,122,18},{124,127,8},{122,127,1},{118,127,0},{127,122,18},{126,125,18},{118,127,0},{0,125,20},{126,125,18},{0,125,20},{120,0,20},{120,0,20},{120,0,20},{120,0,20},{119,126,1}, +{119,126,1},{119,126,1},{119,123,1},{116,125,0},{116,125,0},{125,126,38},{125,127,30},{125,127,29},{125,127,21},{125,126,35},{124,127,16},{124,127,12},{123,127,1},{122,127,20},{122,127,2},{126,127,2},{126,127,2},{126,127,1},{126,127,1},{127,125,3},{127,126,3},{125,127,2},{124,127,0},{127,126,3},{124,127,0},{125,126,29},{125,126,29},{125,126,29},{125,127,21},{124,127,24},{124,127,12},{124,127,12}, +{123,127,1},{122,127,11},{122,127,2},{126,127,1},{126,127,1},{126,127,1},{126,127,1},{127,125,2},{127,126,2},{127,126,2},{124,127,0},{127,126,2},{124,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{124,0,20},{124,0,20},{124,0,20},{124,0,20},{124,127,8},{124,127,8},{124,127,8},{123,127,1},{122,127,2}, +{122,127,2},{0,16,72},{0,11,8},{0,8,1},{0,7,25},{0,10,153},{0,8,97},{0,6,50},{0,4,115},{0,5,162},{0,4,124},{0,16,72},{0,11,8},{0,8,1},{0,7,25},{5,0,153},{0,8,97},{0,6,50},{0,4,115},{10,0,153},{0,4,115},{0,7,0},{0,7,0},{0,7,0},{0,4,0},{0,3,13},{0,2,5},{0,2,5},{0,1,10},{0,2,14},{0,1,11},{0,7,0}, +{0,7,0},{0,7,0},{0,4,0},{2,0,13},{0,2,5},{0,2,5},{0,1,10},{3,0,13},{0,1,10},{8,0,72},{0,11,8},{0,8,1},{0,7,25},{8,0,72},{16,0,72},{0,7,25},{0,5,74},{16,0,72},{0,5,74},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,27,77},{1,18,5},{1,13,15}, +{1,11,18},{0,21,243},{0,14,108},{0,11,29},{0,8,154},{0,9,287},{0,8,179},{2,25,73},{1,18,1},{2,12,6},{1,11,14},{10,1,243},{0,14,108},{0,11,29},{0,8,154},{21,0,243},{0,8,154},{1,17,5},{1,17,5},{1,17,5},{1,9,5},{0,12,50},{0,8,8},{0,8,8},{0,5,25},{0,5,61},{0,5,34},{2,15,1},{2,15,1},{2,15,1},{1,9,1},{6,0,50}, +{0,8,8},{0,8,8},{0,5,25},{12,0,50},{0,5,25},{14,0,72},{1,18,0},{4,12,1},{0,12,10},{14,0,72},{29,0,72},{0,12,10},{0,9,74},{29,0,72},{0,9,74},{1,0,5},{1,0,5},{1,0,5},{1,0,5},{0,4,0},{0,4,0},{0,4,0},{0,2,0},{0,2,1},{0,2,1},{3,35,133},{3,24,63},{4,17,90},{3,16,66},{0,33,243},{0,19,75},{0,16,2}, +{0,13,110},{0,14,345},{0,12,179},{6,29,73},{5,22,1},{6,16,6},{5,15,14},{16,0,243},{0,19,75},{0,16,2},{0,13,110},{33,0,243},{0,13,110},{3,26,61},{3,26,61},{3,26,61},{3,14,61},{0,24,50},{0,16,1},{0,16,1},{0,10,5},{0,11,101},{0,9,46},{6,19,1},{6,19,1},{6,19,1},{5,13,1},{12,0,50},{1,15,0},{1,15,0},{0,10,5},{24,0,50}, +{0,10,5},{20,0,72},{5,22,0},{8,16,1},{0,16,2},{20,0,72},{41,0,72},{0,16,2},{0,13,74},{41,0,72},{0,13,74},{3,0,61},{3,0,61},{3,0,61},{3,0,61},{0,16,0},{0,16,0},{0,16,0},{0,8,0},{0,5,25},{0,5,25},{7,39,146},{7,28,76},{8,21,107},{6,20,79},{4,37,244},{4,23,76},{4,20,3},{3,16,107},{0,22,292},{0,17,106},{10,33,73}, +{9,26,1},{10,20,6},{9,19,14},{22,0,243},{2,25,72},{4,20,2},{0,17,90},{45,0,243},{0,17,90},{7,30,74},{7,30,74},{7,30,74},{7,18,74},{4,28,51},{4,20,2},{4,20,2},{3,14,6},{0,17,68},{0,14,5},{10,23,1},{10,23,1},{10,23,1},{9,17,1},{18,0,50},{5,19,0},{5,19,0},{0,14,1},{36,0,50},{0,14,1},{26,0,72},{9,26,0},{12,20,1}, +{3,20,1},{26,0,72},{53,0,72},{3,20,1},{0,17,74},{53,0,72},{0,17,74},{6,0,74},{6,0,74},{6,0,74},{6,0,74},{4,20,1},{4,20,1},{4,20,1},{4,12,1},{0,14,4},{0,14,4},{11,44,144},{11,32,76},{12,25,105},{11,24,77},{8,43,243},{8,28,75},{8,25,2},{8,21,105},{0,28,248},{1,22,76},{14,38,72},{14,30,1},{15,25,5},{14,24,13},{29,0,243}, +{7,29,72},{8,25,2},{0,22,76},{59,0,243},{0,22,76},{11,35,72},{11,35,72},{11,35,72},{11,23,72},{8,34,50},{8,24,1},{8,24,1},{8,18,5},{1,24,51},{3,19,1},{14,29,0},{14,29,0},{14,29,0},{14,21,1},{24,1,50},{9,24,0},{9,24,0},{3,19,0},{50,0,50},{3,19,0},{33,0,72},{13,31,0},{16,25,0},{6,25,0},{33,0,72},{66,0,72},{6,25,0}, +{0,22,72},{66,0,72},{0,22,72},{11,0,72},{11,0,72},{11,0,72},{11,0,72},{8,26,0},{8,26,0},{8,26,0},{8,17,0},{2,20,0},{2,20,0},{15,48,144},{15,36,76},{16,29,105},{15,28,77},{12,47,243},{12,32,75},{12,29,2},{12,25,105},{2,33,244},{5,26,76},{18,42,72},{18,34,1},{19,29,5},{18,28,13},{35,0,243},{11,33,72},{12,29,2},{1,26,72},{71,0,243}, +{1,26,72},{15,39,72},{15,39,72},{15,39,72},{15,27,72},{12,38,50},{12,28,1},{12,28,1},{12,22,5},{5,28,51},{7,23,1},{18,33,0},{18,33,0},{18,33,0},{18,25,1},{30,1,50},{13,28,0},{13,28,0},{7,23,0},{62,0,50},{7,23,0},{39,0,72},{17,35,0},{20,29,0},{10,29,0},{39,0,72},{78,0,72},{10,29,0},{0,26,72},{78,0,72},{0,26,72},{15,0,72}, +{15,0,72},{15,0,72},{15,0,72},{12,30,0},{12,30,0},{12,30,0},{12,21,0},{6,24,0},{6,24,0},{19,52,144},{19,40,76},{20,33,105},{19,32,77},{16,51,243},{16,36,75},{16,33,2},{16,29,105},{6,37,244},{9,30,76},{22,46,72},{22,38,1},{23,33,5},{22,32,13},{41,0,243},{15,37,72},{16,33,2},{5,30,72},{83,0,243},{5,30,72},{19,43,72},{19,43,72},{19,43,72}, +{19,31,72},{16,42,50},{16,32,1},{16,32,1},{16,26,5},{9,32,51},{11,27,1},{22,37,0},{22,37,0},{22,37,0},{22,29,1},{36,1,50},{17,32,0},{17,32,0},{11,27,0},{74,0,50},{11,27,0},{45,0,72},{21,39,0},{24,33,0},{14,33,0},{45,0,72},{91,0,72},{14,33,0},{0,30,72},{91,0,72},{0,30,72},{19,0,72},{19,0,72},{19,0,72},{19,0,72},{16,34,0}, +{16,34,0},{16,34,0},{16,25,0},{10,28,0},{10,28,0},{23,56,144},{23,44,76},{24,37,105},{23,36,77},{20,55,243},{20,40,75},{20,37,2},{20,33,105},{10,41,244},{13,34,76},{26,50,72},{26,42,1},{27,37,5},{26,36,13},{47,0,243},{19,41,72},{20,37,2},{9,34,72},{95,0,243},{9,34,72},{23,47,72},{23,47,72},{23,47,72},{23,35,72},{20,46,50},{20,36,1},{20,36,1}, +{20,30,5},{13,36,51},{15,31,1},{26,41,0},{26,41,0},{26,41,0},{26,33,1},{42,1,50},{21,36,0},{21,36,0},{15,31,0},{86,0,50},{15,31,0},{50,1,72},{25,43,0},{28,37,0},{18,37,0},{50,1,72},{103,0,72},{18,37,0},{0,34,72},{103,0,72},{0,34,72},{23,0,72},{23,0,72},{23,0,72},{23,0,72},{20,38,0},{20,38,0},{20,38,0},{20,29,0},{14,32,0}, +{14,32,0},{28,60,146},{28,49,76},{29,42,107},{27,41,79},{25,58,244},{25,44,76},{25,41,3},{24,37,107},{14,46,244},{17,38,76},{31,54,73},{30,47,1},{31,41,6},{30,40,14},{53,1,243},{23,46,72},{25,41,2},{15,38,74},{109,0,243},{15,38,74},{28,51,74},{28,51,74},{28,51,74},{28,39,74},{25,49,51},{25,41,2},{25,41,2},{24,35,6},{18,40,51},{19,36,1},{31,44,1}, +{31,44,1},{31,44,1},{30,38,1},{49,0,50},{26,40,0},{26,40,0},{21,35,1},{100,0,50},{21,35,1},{57,0,72},{30,47,0},{33,41,1},{24,41,1},{57,0,72},{117,0,72},{24,41,1},{0,38,74},{117,0,72},{0,38,74},{27,0,74},{27,0,74},{27,0,74},{27,0,74},{25,41,1},{25,41,1},{25,41,1},{25,33,1},{19,36,0},{19,36,0},{32,64,146},{32,53,76},{33,46,107}, +{31,45,79},{29,62,244},{29,48,76},{29,45,3},{28,41,107},{18,50,244},{21,42,76},{35,58,73},{34,51,1},{35,45,6},{34,44,14},{59,1,243},{27,50,72},{29,45,2},{19,42,74},{121,0,243},{19,42,74},{32,55,74},{32,55,74},{32,55,74},{32,43,74},{29,53,51},{29,45,2},{29,45,2},{28,39,6},{22,44,51},{23,40,1},{35,48,1},{35,48,1},{35,48,1},{34,42,1},{55,0,50}, +{30,44,0},{30,44,0},{25,39,1},{112,0,50},{25,39,1},{63,0,72},{34,51,0},{37,45,1},{28,45,1},{63,0,72},{127,1,72},{28,45,1},{0,42,74},{127,1,72},{0,42,74},{31,0,74},{31,0,74},{31,0,74},{31,0,74},{29,45,1},{29,45,1},{29,45,1},{29,37,1},{23,40,0},{23,40,0},{36,67,146},{36,57,76},{37,50,107},{35,49,79},{33,66,244},{33,52,76},{33,49,3}, +{32,45,107},{22,54,244},{25,46,76},{39,62,73},{38,55,1},{39,49,6},{38,48,14},{65,0,243},{31,54,72},{33,49,2},{23,46,74},{127,3,243},{23,46,74},{36,59,74},{36,59,74},{36,59,74},{36,47,74},{33,57,51},{33,49,2},{33,49,2},{32,43,6},{26,48,51},{27,44,1},{39,52,1},{39,52,1},{39,52,1},{38,46,1},{61,0,50},{34,48,0},{34,48,0},{29,43,1},{124,0,50}, +{29,43,1},{69,0,72},{38,55,0},{41,49,1},{32,49,1},{69,0,72},{127,7,72},{32,49,1},{0,46,74},{127,7,72},{0,46,74},{35,0,74},{35,0,74},{35,0,74},{35,0,74},{33,49,1},{33,49,1},{33,49,1},{33,41,1},{27,44,0},{27,44,0},{40,71,146},{40,61,76},{41,54,107},{39,53,79},{37,70,244},{37,56,76},{37,53,3},{36,49,107},{26,58,244},{29,50,76},{43,65,73}, +{42,59,1},{43,53,6},{42,52,14},{71,0,243},{35,58,72},{37,53,2},{27,50,74},{127,9,243},{27,50,74},{40,63,74},{40,63,74},{40,63,74},{40,51,74},{37,61,51},{37,53,2},{37,53,2},{36,47,6},{30,52,51},{31,48,1},{43,56,1},{43,56,1},{43,56,1},{42,50,1},{66,1,50},{38,52,0},{38,52,0},{33,47,1},{126,5,50},{33,47,1},{75,0,72},{42,59,0},{45,53,1}, +{36,53,1},{75,0,72},{127,13,72},{36,53,1},{0,50,74},{127,13,72},{0,50,74},{39,0,74},{39,0,74},{39,0,74},{39,0,74},{37,53,1},{37,53,1},{37,53,1},{37,45,1},{31,48,0},{31,48,0},{44,77,144},{44,65,77},{45,58,105},{44,57,77},{41,75,243},{41,61,75},{41,58,2},{41,54,105},{31,62,244},{34,55,76},{47,71,72},{47,63,1},{48,58,5},{47,57,13},{78,0,243}, +{40,62,72},{41,58,2},{30,55,72},{126,16,243},{30,55,72},{44,68,72},{44,68,72},{44,68,72},{44,56,72},{41,66,50},{41,57,1},{41,57,1},{41,51,5},{34,57,51},{36,52,1},{47,62,0},{47,62,0},{47,62,0},{47,54,1},{73,0,50},{42,57,0},{42,57,0},{36,52,0},{126,12,50},{36,52,0},{81,0,72},{47,63,1},{49,58,0},{39,58,0},{81,0,72},{126,20,72},{39,58,0}, +{0,55,72},{126,20,72},{0,55,72},{44,0,72},{44,0,72},{44,0,72},{44,0,72},{41,59,0},{41,59,0},{41,59,0},{41,50,0},{35,53,0},{35,53,0},{48,81,144},{48,69,77},{49,62,105},{48,61,77},{45,79,243},{45,65,73},{45,62,2},{45,58,105},{34,67,243},{38,59,76},{51,75,72},{51,66,1},{52,62,5},{51,61,13},{83,1,243},{45,65,73},{45,62,2},{34,59,72},{126,22,243}, +{34,59,72},{48,72,72},{48,72,72},{48,72,72},{48,60,72},{45,70,50},{45,61,1},{45,61,1},{45,55,5},{38,61,51},{40,56,1},{51,65,0},{51,65,0},{51,65,0},{51,58,1},{79,0,50},{46,61,0},{46,61,0},{40,56,0},{127,17,50},{40,56,0},{87,0,72},{51,66,1},{53,62,0},{43,62,0},{87,0,72},{126,26,72},{43,62,0},{0,59,72},{126,26,72},{0,59,72},{48,0,72}, +{48,0,72},{48,0,72},{48,0,72},{45,63,0},{45,63,0},{45,63,0},{45,54,0},{39,57,0},{39,57,0},{52,85,144},{52,73,77},{53,67,105},{52,65,77},{49,83,243},{49,69,73},{49,65,2},{49,62,105},{38,71,243},{42,63,76},{55,79,72},{55,70,1},{55,66,5},{54,65,14},{89,1,243},{49,69,73},{49,65,2},{38,63,72},{126,28,243},{38,63,72},{52,76,72},{52,76,72},{52,76,72}, +{52,63,73},{49,74,50},{49,65,1},{49,65,1},{49,59,5},{41,65,50},{44,60,1},{55,69,0},{55,69,0},{55,69,0},{55,62,1},{85,0,50},{50,64,1},{50,64,1},{44,60,0},{127,23,50},{44,60,0},{93,0,72},{55,70,1},{57,65,1},{48,65,1},{93,0,72},{126,32,72},{48,65,1},{0,63,72},{126,32,72},{0,63,72},{52,0,72},{52,0,72},{52,0,72},{52,0,72},{49,67,0}, +{49,67,0},{49,67,0},{49,58,0},{43,61,0},{43,61,0},{56,89,144},{56,77,77},{57,71,105},{56,69,77},{53,87,243},{53,73,73},{53,69,2},{52,66,103},{42,75,243},{45,66,79},{59,83,72},{59,74,1},{59,70,5},{58,69,14},{95,1,243},{53,73,73},{53,69,2},{43,66,74},{126,34,243},{43,66,74},{56,80,72},{56,80,72},{56,80,72},{56,67,73},{53,78,50},{53,69,1},{53,69,1}, +{53,63,5},{45,69,50},{47,64,2},{59,73,0},{59,73,0},{59,73,0},{59,66,0},{91,0,50},{55,67,1},{55,67,1},{47,64,1},{127,29,50},{47,64,1},{99,0,72},{59,74,1},{61,69,1},{52,69,1},{99,0,72},{126,38,72},{52,69,1},{0,66,74},{126,38,72},{0,66,74},{56,0,72},{56,0,72},{56,0,72},{56,0,72},{53,71,0},{53,71,0},{53,71,0},{53,62,0},{47,64,1}, +{47,64,1},{61,92,146},{61,80,79},{61,75,103},{60,74,78},{58,91,244},{57,78,74},{58,74,2},{56,70,105},{47,79,243},{49,71,77},{63,88,73},{63,79,2},{64,74,5},{63,73,14},{102,0,243},{57,78,73},{58,74,1},{47,71,72},{126,41,243},{47,71,72},{61,83,74},{61,83,74},{61,83,74},{60,72,74},{58,82,51},{58,73,2},{58,73,2},{57,68,5},{50,73,50},{52,68,1},{63,79,1}, +{63,79,1},{63,79,1},{63,71,1},{98,0,50},{59,72,1},{59,72,1},{53,68,0},{127,36,50},{53,68,0},{106,0,72},{63,79,1},{65,74,0},{56,74,0},{106,0,72},{127,44,72},{56,74,0},{0,71,72},{127,44,72},{0,71,72},{60,0,74},{60,0,74},{60,0,74},{60,0,74},{58,74,1},{58,74,1},{58,74,1},{57,66,1},{52,68,1},{52,68,1},{64,97,144},{64,85,76},{65,78,105}, +{64,77,77},{62,95,244},{61,82,74},{62,78,2},{60,74,105},{51,83,243},{53,75,77},{67,91,72},{67,83,1},{68,78,5},{67,77,13},{108,0,243},{61,82,73},{62,78,1},{51,75,72},{125,47,243},{51,75,72},{64,88,72},{64,88,72},{64,88,72},{64,76,72},{62,86,51},{62,77,2},{62,77,2},{61,72,5},{54,77,50},{56,72,1},{67,82,0},{67,82,0},{67,82,0},{67,74,1},{104,0,50}, +{63,76,1},{63,76,1},{57,72,0},{127,42,50},{57,72,0},{112,0,72},{66,84,0},{69,78,0},{60,78,0},{112,0,72},{127,50,72},{60,78,0},{0,75,72},{127,50,72},{0,75,72},{64,0,72},{64,0,72},{64,0,72},{64,0,72},{62,78,1},{62,78,1},{62,78,1},{61,70,1},{56,72,1},{56,72,1},{68,101,144},{68,89,76},{69,82,105},{68,81,77},{65,100,243},{65,85,75},{65,82,2}, +{65,78,105},{55,87,243},{57,79,77},{71,95,72},{71,87,1},{72,82,5},{71,81,13},{114,0,243},{64,86,72},{65,82,2},{55,79,72},{127,52,243},{55,79,72},{68,92,72},{68,92,72},{68,92,72},{68,80,72},{65,91,50},{65,81,1},{65,81,1},{65,75,5},{58,81,50},{60,76,1},{71,86,0},{71,86,0},{71,86,0},{71,78,1},{110,0,50},{66,81,0},{66,81,0},{61,76,0},{126,48,50}, +{61,76,0},{118,0,72},{70,88,0},{73,82,0},{64,82,0},{118,0,72},{127,56,72},{64,82,0},{0,79,72},{127,56,72},{0,79,72},{68,0,72},{68,0,72},{68,0,72},{68,0,72},{65,83,0},{65,83,0},{65,83,0},{65,74,0},{60,76,1},{60,76,1},{72,105,144},{72,93,76},{73,86,105},{72,85,77},{69,104,243},{69,89,75},{69,86,2},{69,82,105},{59,91,243},{61,83,77},{75,99,72}, +{75,91,1},{76,86,5},{75,85,13},{120,0,243},{68,90,72},{69,86,2},{59,83,72},{127,58,243},{59,83,72},{72,96,72},{72,96,72},{72,96,72},{72,84,72},{69,95,50},{69,85,1},{69,85,1},{69,79,5},{62,85,50},{64,80,1},{75,90,0},{75,90,0},{75,90,0},{75,82,1},{115,1,50},{70,85,0},{70,85,0},{64,80,0},{126,54,50},{64,80,0},{124,0,72},{74,92,0},{77,86,0}, +{67,86,0},{124,0,72},{127,62,72},{67,86,0},{0,83,72},{127,62,72},{0,83,72},{72,0,72},{72,0,72},{72,0,72},{72,0,72},{69,87,0},{69,87,0},{69,87,0},{69,78,0},{64,80,1},{64,80,1},{77,109,146},{77,98,76},{78,91,107},{76,90,79},{74,107,244},{74,93,76},{74,90,3},{73,86,107},{63,96,243},{66,87,76},{80,103,73},{79,96,1},{80,90,6},{79,89,14},{127,0,243}, +{72,95,72},{74,90,2},{64,87,74},{126,65,243},{64,87,74},{77,100,74},{77,100,74},{77,100,74},{77,88,74},{74,98,51},{74,90,2},{74,90,2},{73,84,6},{67,89,51},{68,85,1},{80,93,1},{80,93,1},{80,93,1},{79,87,1},{122,0,50},{75,89,0},{75,89,0},{70,84,1},{126,61,50},{70,84,1},{127,7,72},{79,96,0},{82,90,1},{73,90,1},{127,7,72},{127,68,72},{73,90,1}, +{0,87,74},{127,68,72},{0,87,74},{76,0,74},{76,0,74},{76,0,74},{76,0,74},{74,90,1},{74,90,1},{74,90,1},{74,82,1},{68,85,0},{68,85,0},{81,113,146},{81,102,76},{82,95,107},{80,94,79},{78,111,244},{78,97,76},{78,94,3},{77,90,107},{67,99,244},{70,91,76},{84,107,73},{83,100,1},{84,94,6},{83,93,14},{127,11,243},{76,99,72},{78,94,2},{68,91,74},{126,71,243}, +{68,91,74},{81,104,74},{81,104,74},{81,104,74},{81,92,74},{78,102,51},{78,94,2},{78,94,2},{77,88,6},{71,93,51},{72,89,1},{84,97,1},{84,97,1},{84,97,1},{83,91,1},{127,2,50},{79,93,0},{79,93,0},{74,88,1},{127,66,50},{74,88,1},{127,19,72},{83,100,0},{86,94,1},{77,94,1},{127,19,72},{127,74,72},{77,94,1},{0,91,74},{127,74,72},{0,91,74},{80,0,74}, +{80,0,74},{80,0,74},{80,0,74},{78,94,1},{78,94,1},{78,94,1},{78,86,1},{72,89,0},{72,89,0},{85,117,146},{85,106,76},{86,99,107},{84,98,79},{82,115,244},{82,101,76},{82,98,3},{81,94,107},{71,103,244},{74,95,76},{88,111,73},{87,104,1},{88,98,6},{87,97,14},{127,24,243},{80,103,72},{82,98,2},{72,95,74},{125,77,243},{72,95,74},{85,108,74},{85,108,74},{85,108,74}, +{85,96,74},{82,106,51},{82,98,2},{82,98,2},{81,92,6},{75,97,51},{76,93,1},{88,101,1},{88,101,1},{88,101,1},{87,95,1},{127,14,50},{83,97,0},{83,97,0},{78,92,1},{127,72,50},{78,92,1},{127,31,72},{87,104,0},{90,98,1},{81,98,1},{127,31,72},{127,80,72},{81,98,1},{0,95,74},{127,80,72},{0,95,74},{84,0,74},{84,0,74},{84,0,74},{84,0,74},{82,98,1}, +{82,98,1},{82,98,1},{82,90,1},{76,93,0},{76,93,0},{89,121,146},{89,110,76},{90,103,107},{88,102,79},{86,119,244},{86,105,76},{86,102,3},{85,98,107},{75,107,244},{78,99,76},{92,115,73},{91,108,1},{92,102,6},{91,101,14},{127,36,243},{84,107,72},{86,102,2},{76,99,74},{127,82,243},{76,99,74},{89,112,74},{89,112,74},{89,112,74},{89,100,74},{86,110,51},{86,102,2},{86,102,2}, +{85,96,6},{79,101,51},{80,97,1},{92,105,1},{92,105,1},{92,105,1},{91,99,1},{127,27,50},{87,101,0},{87,101,0},{82,96,1},{126,78,50},{82,96,1},{127,43,72},{91,108,0},{94,102,1},{85,102,1},{127,43,72},{127,86,72},{85,102,1},{0,99,74},{127,86,72},{0,99,74},{88,0,74},{88,0,74},{88,0,74},{88,0,74},{86,102,1},{86,102,1},{86,102,1},{86,94,1},{80,97,0}, +{80,97,0},{93,126,144},{93,114,76},{94,107,105},{93,106,77},{90,125,243},{90,110,75},{90,107,2},{90,103,105},{80,111,244},{83,104,76},{96,120,72},{96,112,1},{97,107,5},{96,106,13},{127,50,243},{89,111,72},{90,107,2},{79,104,72},{127,89,243},{79,104,72},{93,117,72},{93,117,72},{93,117,72},{93,105,72},{90,116,50},{90,106,1},{90,106,1},{90,100,5},{83,106,51},{85,101,1},{96,111,0}, +{96,111,0},{96,111,0},{96,103,1},{127,40,50},{91,106,0},{91,106,0},{85,101,0},{126,85,50},{85,101,0},{127,57,72},{95,113,0},{98,107,0},{88,107,0},{127,57,72},{126,93,72},{88,107,0},{0,104,72},{126,93,72},{0,104,72},{93,0,72},{93,0,72},{93,0,72},{93,0,72},{90,108,0},{90,108,0},{90,108,0},{90,99,0},{84,102,0},{84,102,0},{97,127,152},{97,118,76},{98,111,105}, +{97,110,77},{94,127,244},{94,114,75},{94,111,2},{94,107,105},{84,115,244},{87,108,76},{100,124,72},{100,116,1},{101,111,5},{100,110,13},{127,62,243},{93,115,72},{94,111,2},{83,108,72},{127,95,243},{83,108,72},{97,121,72},{97,121,72},{97,121,72},{97,109,72},{94,120,50},{94,110,1},{94,110,1},{94,104,5},{87,110,51},{89,105,1},{100,115,0},{100,115,0},{100,115,0},{100,107,1},{127,53,50}, +{95,110,0},{95,110,0},{89,105,0},{126,91,50},{89,105,0},{127,69,72},{99,117,0},{102,111,0},{92,111,0},{127,69,72},{126,99,72},{92,111,0},{0,108,72},{126,99,72},{0,108,72},{97,0,72},{97,0,72},{97,0,72},{97,0,72},{94,112,0},{94,112,0},{94,112,0},{94,103,0},{88,106,0},{88,106,0},{102,126,184},{101,122,76},{102,115,105},{101,114,77},{100,127,260},{98,118,75},{98,115,2}, +{98,111,105},{88,119,244},{91,112,76},{104,127,74},{104,120,1},{105,115,5},{104,114,13},{127,73,243},{97,119,72},{98,115,2},{87,112,72},{127,101,243},{87,112,72},{101,125,72},{101,125,72},{101,125,72},{101,113,72},{98,124,50},{98,114,1},{98,114,1},{98,108,5},{91,114,51},{93,109,1},{104,119,0},{104,119,0},{104,119,0},{104,111,1},{127,64,50},{99,114,0},{99,114,0},{93,109,0},{126,97,50}, +{93,109,0},{127,81,72},{103,121,0},{106,115,0},{96,115,0},{127,81,72},{126,105,72},{96,115,0},{0,112,72},{126,105,72},{0,112,72},{101,0,72},{101,0,72},{101,0,72},{101,0,72},{98,116,0},{98,116,0},{98,116,0},{98,107,0},{92,110,0},{92,110,0},{106,127,224},{105,126,76},{106,119,105},{105,118,77},{104,127,299},{102,122,75},{102,119,2},{102,115,105},{92,123,244},{95,116,76},{109,127,84}, +{108,124,1},{109,119,5},{108,118,13},{127,86,243},{101,123,72},{102,119,2},{91,116,72},{127,107,243},{91,116,72},{105,126,76},{105,126,76},{105,126,76},{105,117,72},{102,126,52},{102,118,1},{102,118,1},{102,112,5},{95,118,51},{97,113,1},{108,123,0},{108,123,0},{108,123,0},{108,115,1},{127,76,50},{103,118,0},{103,118,0},{97,113,0},{126,103,50},{97,113,0},{127,93,72},{107,125,0},{110,119,0}, +{100,119,0},{127,93,72},{126,111,72},{100,119,0},{0,116,72},{126,111,72},{0,116,72},{105,0,72},{105,0,72},{105,0,72},{105,0,72},{102,120,0},{102,120,0},{102,120,0},{102,111,0},{96,114,0},{96,114,0},{111,127,290},{111,127,103},{111,124,107},{109,123,79},{111,127,345},{107,126,76},{107,123,3},{106,119,107},{98,127,248},{99,120,76},{114,127,113},{113,127,5},{113,123,6},{112,122,14},{127,99,243}, +{107,126,75},{107,123,2},{97,120,74},{126,114,243},{97,120,74},{110,126,90},{110,126,90},{110,126,90},{110,121,74},{108,126,67},{107,123,2},{107,123,2},{106,117,6},{100,122,51},{101,118,1},{113,126,1},{113,126,1},{113,126,1},{112,120,1},{127,90,50},{108,122,0},{108,122,0},{103,117,1},{127,109,50},{103,117,1},{127,107,72},{113,127,4},{115,123,1},{106,123,1},{127,107,72},{127,117,72},{106,123,1}, +{0,120,74},{127,117,72},{0,120,74},{109,0,74},{109,0,74},{109,0,74},{109,0,74},{107,123,1},{107,123,1},{107,123,1},{107,115,1},{101,118,0},{101,118,0},{117,127,343},{115,127,179},{114,127,110},{113,126,78},{115,127,387},{111,127,102},{111,127,2},{110,123,90},{105,127,263},{103,124,63},{120,127,134},{118,127,46},{117,127,5},{116,126,9},{127,110,221},{113,127,89},{111,127,1},{101,124,61},{126,119,221}, +{101,124,61},{114,127,110},{114,127,110},{114,127,110},{114,125,74},{112,127,91},{111,127,2},{111,127,2},{110,121,6},{104,126,51},{105,122,1},{117,127,5},{117,127,5},{117,127,5},{116,124,1},{127,102,50},{112,126,0},{112,126,0},{107,121,1},{127,115,50},{107,121,1},{127,118,61},{119,127,25},{119,127,0},{110,127,0},{127,118,61},{126,123,61},{110,127,0},{0,124,61},{126,123,61},{0,124,61},{113,0,74}, +{113,0,74},{113,0,74},{113,0,74},{111,127,1},{111,127,1},{111,127,1},{111,119,1},{105,122,0},{105,122,0},{120,127,239},{119,127,179},{119,127,154},{118,127,83},{120,127,254},{116,127,78},{116,127,29},{114,126,15},{113,127,169},{109,126,5},{123,127,54},{122,127,34},{122,127,25},{121,127,2},{127,119,93},{119,127,33},{119,127,8},{109,126,5},{127,123,93},{109,126,5},{119,126,154},{119,126,154},{119,126,154}, +{118,127,83},{117,127,125},{116,127,29},{116,127,29},{114,125,6},{110,127,72},{109,126,1},{122,126,25},{122,126,25},{122,126,25},{121,127,2},{127,115,50},{119,127,8},{119,127,8},{111,125,1},{127,121,50},{111,125,1},{127,124,5},{125,127,1},{125,127,0},{122,127,0},{127,124,5},{126,126,5},{122,127,0},{0,126,5},{126,126,5},{0,126,5},{117,0,74},{117,0,74},{117,0,74},{117,0,74},{115,127,10}, +{115,127,10},{115,127,10},{115,123,1},{109,126,0},{109,126,0},{123,127,140},{123,127,124},{123,127,115},{122,127,83},{123,127,131},{121,127,66},{120,127,50},{119,127,1},{119,127,86},{116,127,8},{126,127,11},{125,127,11},{125,127,10},{125,127,2},{127,124,17},{125,127,6},{124,127,5},{119,127,0},{126,126,17},{119,127,0},{123,127,115},{123,127,115},{123,127,115},{122,127,83},{121,127,98},{120,127,50},{120,127,50}, +{119,127,1},{116,127,57},{116,127,8},{125,126,10},{125,126,10},{125,126,10},{125,127,2},{127,122,13},{124,127,5},{124,127,5},{119,127,0},{126,125,13},{119,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{121,0,74},{121,0,74},{121,0,74},{121,0,74},{120,127,25},{120,127,25},{120,127,25},{119,127,1},{116,127,8}, +{116,127,8},{0,29,200},{0,19,18},{0,14,1},{0,13,73},{0,20,441},{0,11,281},{0,11,134},{0,7,331},{0,8,474},{0,7,356},{0,29,200},{0,19,18},{0,14,1},{0,13,73},{10,0,441},{0,11,281},{0,11,134},{0,7,331},{20,0,441},{0,7,331},{0,13,0},{0,13,0},{0,13,0},{0,7,0},{0,6,41},{0,5,13},{0,5,13},{0,3,25},{0,3,45},{0,3,29},{0,13,0}, +{0,13,0},{0,13,0},{0,7,0},{3,0,41},{0,5,13},{0,5,13},{0,3,25},{6,0,41},{0,3,25},{14,0,200},{0,19,18},{0,14,1},{0,13,73},{14,0,200},{29,0,200},{0,13,73},{0,9,202},{29,0,200},{0,9,202},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,41,200},{0,27,2},{1,19,18}, +{0,17,45},{0,27,686},{0,19,346},{0,15,158},{0,10,467},{0,11,762},{0,10,516},{0,41,200},{0,27,2},{1,19,14},{0,17,45},{13,1,686},{0,19,346},{0,15,158},{0,10,467},{27,0,686},{0,10,467},{0,26,0},{0,26,0},{0,26,0},{0,13,0},{0,12,145},{0,11,53},{0,11,53},{0,6,89},{0,5,158},{0,6,105},{0,26,0},{0,26,0},{0,26,0},{0,13,0},{6,0,145}, +{0,11,53},{0,11,53},{0,6,89},{12,0,145},{0,6,89},{20,0,200},{1,26,2},{4,18,1},{0,17,45},{20,0,200},{41,0,200},{0,17,45},{0,13,202},{41,0,200},{0,13,202},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,49,225},{2,32,27},{3,24,71},{1,21,54},{0,39,723},{0,25,283},{0,20,65}, +{0,15,419},{0,17,865},{0,15,519},{4,45,201},{3,32,1},{5,23,19},{3,21,35},{19,0,723},{0,25,283},{0,20,65},{0,15,419},{39,0,723},{0,15,419},{2,34,25},{2,34,25},{2,34,25},{2,17,26},{0,24,162},{0,17,20},{0,17,20},{0,10,61},{0,11,213},{0,9,110},{4,30,1},{4,30,1},{4,30,1},{3,17,1},{12,0,162},{0,17,20},{0,17,20},{0,10,61},{24,0,162}, +{0,10,61},{26,0,200},{3,32,0},{8,22,1},{0,21,18},{26,0,200},{53,0,200},{0,21,18},{0,17,202},{53,0,200},{0,17,202},{2,0,25},{2,0,25},{2,0,25},{2,0,25},{0,10,0},{0,10,0},{0,10,0},{0,5,0},{0,5,9},{0,5,9},{4,57,313},{4,39,121},{5,28,198},{4,25,131},{0,52,723},{0,31,227},{0,26,9},{0,20,362},{0,22,959},{0,19,515},{8,49,201}, +{7,36,1},{9,27,19},{7,25,35},{25,0,723},{0,31,227},{0,26,9},{0,20,362},{52,0,723},{0,20,362},{4,42,113},{4,42,113},{4,42,113},{4,22,114},{0,36,162},{0,24,2},{0,24,2},{0,15,34},{0,17,285},{0,14,122},{8,34,1},{8,34,1},{8,34,1},{7,21,1},{18,0,162},{1,23,2},{1,23,2},{0,15,34},{36,0,162},{0,15,34},{32,0,200},{7,36,0},{12,26,1}, +{0,26,5},{32,0,200},{65,0,200},{0,26,5},{0,21,202},{65,0,200},{0,21,202},{4,0,113},{4,0,113},{4,0,113},{4,0,113},{0,23,0},{0,23,0},{0,23,0},{0,11,0},{0,8,41},{0,8,41},{7,64,400},{7,43,216},{8,32,312},{7,30,213},{2,61,723},{1,38,208},{2,31,2},{0,24,312},{0,31,980},{0,24,440},{12,54,200},{12,40,0},{13,31,20},{11,29,36},{32,0,723}, +{0,38,203},{2,31,2},{0,24,296},{65,0,723},{0,24,296},{7,49,200},{7,49,200},{7,49,200},{7,28,200},{2,46,162},{2,31,2},{2,31,2},{2,20,20},{0,22,280},{0,19,84},{12,39,0},{12,39,0},{12,39,0},{12,25,1},{24,1,162},{4,29,0},{4,29,0},{0,20,13},{50,0,162},{0,20,13},{39,0,200},{12,40,0},{16,31,0},{0,31,0},{39,0,200},{78,0,200},{0,31,0}, +{0,26,200},{78,0,200},{0,26,200},{7,0,200},{7,0,200},{7,0,200},{7,0,200},{2,32,0},{2,32,0},{2,32,0},{2,17,0},{0,14,50},{0,14,50},{11,68,400},{11,47,216},{12,36,312},{11,34,213},{6,65,723},{5,42,208},{6,35,2},{4,28,312},{0,37,868},{0,28,304},{16,58,200},{16,44,0},{17,35,20},{15,33,36},{38,0,723},{3,43,200},{6,35,2},{0,29,257},{77,0,723}, +{0,29,257},{11,53,200},{11,53,200},{11,53,200},{11,32,200},{6,50,162},{6,35,2},{6,35,2},{6,24,20},{0,28,216},{0,24,20},{16,43,0},{16,43,0},{16,43,0},{16,29,1},{30,1,162},{8,33,0},{8,33,0},{0,24,4},{62,0,162},{0,24,4},{45,0,200},{16,44,0},{20,35,0},{4,35,0},{45,0,200},{91,0,200},{4,35,0},{0,30,200},{91,0,200},{0,30,200},{11,0,200}, +{11,0,200},{11,0,200},{11,0,200},{6,36,0},{6,36,0},{6,36,0},{6,21,0},{0,22,8},{0,22,8},{15,72,400},{15,51,216},{16,40,312},{15,38,213},{10,69,723},{9,46,208},{10,39,2},{8,32,312},{0,43,788},{0,33,228},{20,62,200},{20,48,0},{21,39,20},{19,37,36},{44,0,723},{7,47,200},{10,39,2},{0,33,224},{89,0,723},{0,33,224},{15,57,200},{15,57,200},{15,57,200}, +{15,36,200},{10,54,162},{10,39,2},{10,39,2},{10,28,20},{0,35,179},{1,29,0},{20,47,0},{20,47,0},{20,47,0},{20,33,1},{36,1,162},{12,37,0},{12,37,0},{1,29,0},{74,0,162},{1,29,0},{50,1,200},{20,48,0},{24,39,0},{8,39,0},{50,1,200},{103,0,200},{8,39,0},{0,34,200},{103,0,200},{0,34,200},{15,0,200},{15,0,200},{15,0,200},{15,0,200},{10,40,0}, +{10,40,0},{10,40,0},{10,25,0},{1,29,0},{1,29,0},{19,76,400},{19,55,216},{20,44,312},{19,42,213},{14,73,723},{13,50,208},{14,43,2},{12,36,312},{0,49,740},{1,37,216},{24,66,200},{24,52,0},{25,43,20},{23,41,36},{50,0,723},{11,51,200},{14,43,2},{0,38,209},{101,0,723},{0,38,209},{19,61,200},{19,61,200},{19,61,200},{19,40,200},{14,58,162},{14,43,2},{14,43,2}, +{14,32,20},{1,42,163},{5,33,0},{24,51,0},{24,51,0},{24,51,0},{24,37,1},{42,1,162},{16,41,0},{16,41,0},{5,33,0},{86,0,162},{5,33,0},{56,1,200},{24,52,0},{28,43,0},{12,43,0},{56,1,200},{115,0,200},{12,43,0},{0,38,200},{115,0,200},{0,38,200},{19,0,200},{19,0,200},{19,0,200},{19,0,200},{14,44,0},{14,44,0},{14,44,0},{14,29,0},{5,33,0}, +{5,33,0},{24,80,402},{24,60,212},{25,49,308},{23,47,212},{19,76,724},{19,53,212},{19,47,4},{17,41,308},{1,55,724},{6,42,212},{29,69,201},{28,57,1},{30,48,19},{28,46,35},{56,1,723},{15,56,200},{19,47,3},{1,42,202},{115,0,723},{1,42,202},{24,64,202},{24,64,202},{24,64,202},{24,44,202},{19,61,163},{19,46,3},{19,46,3},{18,36,19},{6,46,163},{9,38,1},{29,55,1}, +{29,55,1},{29,55,1},{28,42,1},{49,0,162},{20,46,0},{20,46,0},{11,37,1},{100,0,162},{11,37,1},{63,0,200},{28,57,0},{33,47,1},{18,47,1},{63,0,200},{127,1,200},{18,47,1},{0,42,202},{127,1,200},{0,42,202},{23,0,202},{23,0,202},{23,0,202},{23,0,202},{19,48,1},{19,48,1},{19,48,1},{19,33,1},{9,38,0},{9,38,0},{28,84,402},{28,64,215},{29,53,308}, +{27,51,212},{23,80,724},{23,57,212},{23,51,4},{21,45,308},{5,59,724},{10,46,212},{33,73,201},{32,61,1},{34,52,19},{32,50,35},{62,1,723},{19,60,200},{23,51,3},{5,46,202},{127,0,723},{5,46,202},{28,68,202},{28,68,202},{28,68,202},{28,48,202},{23,65,163},{23,50,3},{23,50,3},{22,40,19},{10,50,163},{13,42,1},{33,59,1},{33,59,1},{33,59,1},{32,46,1},{55,0,162}, +{24,50,0},{24,50,0},{15,41,1},{112,0,162},{15,41,1},{69,0,200},{32,61,0},{37,51,1},{22,51,1},{69,0,200},{127,7,200},{22,51,1},{0,46,202},{127,7,200},{0,46,202},{27,0,202},{27,0,202},{27,0,202},{27,0,202},{23,52,1},{23,52,1},{23,52,1},{23,37,1},{13,42,0},{13,42,0},{32,88,402},{32,68,215},{33,57,308},{31,55,212},{27,84,724},{27,61,212},{27,55,4}, +{25,49,308},{8,64,723},{14,50,212},{37,77,201},{36,64,2},{38,56,19},{36,54,35},{68,0,723},{22,64,201},{27,55,3},{9,50,202},{127,6,723},{9,50,202},{32,72,202},{32,72,202},{32,72,202},{32,52,202},{27,69,163},{27,54,3},{27,54,3},{26,44,19},{14,54,163},{17,46,1},{37,63,1},{37,63,1},{37,63,1},{36,50,1},{61,0,162},{28,54,0},{28,54,0},{19,45,1},{124,0,162}, +{19,45,1},{75,0,200},{36,64,1},{41,55,1},{26,55,1},{75,0,200},{127,13,200},{26,55,1},{0,50,202},{127,13,200},{0,50,202},{31,0,202},{31,0,202},{31,0,202},{31,0,202},{27,56,1},{27,56,1},{27,56,1},{27,41,1},{17,46,0},{17,46,0},{36,92,402},{36,72,215},{37,61,308},{35,59,212},{31,88,724},{30,65,207},{31,59,4},{29,53,308},{12,68,723},{18,54,212},{41,81,201}, +{41,67,2},{42,60,19},{40,58,35},{74,0,723},{28,67,201},{31,59,3},{13,54,202},{127,12,723},{13,54,202},{36,76,202},{36,76,202},{36,76,202},{36,56,202},{31,73,163},{31,58,3},{31,58,3},{30,48,19},{18,58,163},{21,50,1},{41,66,1},{41,66,1},{41,66,1},{40,54,1},{66,1,162},{32,58,0},{32,58,0},{23,49,1},{126,5,162},{23,49,1},{80,1,200},{41,67,1},{45,59,1}, +{30,59,1},{80,1,200},{126,19,200},{30,59,1},{0,54,202},{126,19,200},{0,54,202},{35,0,202},{35,0,202},{35,0,202},{35,0,202},{31,60,1},{31,60,1},{31,60,1},{31,45,1},{21,50,0},{21,50,0},{40,97,400},{40,77,213},{42,64,314},{40,63,213},{35,94,723},{35,70,209},{35,64,6},{33,57,312},{17,72,723},{22,58,216},{45,87,200},{45,72,1},{46,64,21},{44,62,36},{80,1,723}, +{33,71,201},{36,63,4},{16,59,200},{126,19,723},{16,59,200},{40,82,200},{40,82,200},{40,82,200},{40,61,200},{35,78,162},{35,63,4},{35,63,4},{35,53,20},{22,63,163},{26,54,0},{45,72,0},{45,72,0},{45,72,0},{45,58,1},{73,0,162},{37,62,0},{37,62,0},{26,54,0},{126,12,162},{26,54,0},{87,0,200},{45,72,1},{49,64,1},{32,64,1},{87,0,200},{126,26,200},{32,64,1}, +{0,59,200},{126,26,200},{0,59,200},{40,0,200},{40,0,200},{40,0,200},{40,0,200},{35,65,0},{35,65,0},{35,65,0},{35,50,0},{26,54,0},{26,54,0},{44,101,400},{44,81,213},{46,68,314},{44,66,213},{39,98,723},{39,74,209},{39,67,2},{37,61,312},{21,76,723},{26,62,216},{49,91,200},{49,76,1},{50,68,21},{48,66,38},{86,1,723},{37,75,201},{39,67,2},{20,63,200},{126,25,723}, +{20,63,200},{44,86,200},{44,86,200},{44,86,200},{44,64,200},{39,82,162},{39,67,1},{39,67,1},{39,57,20},{25,67,162},{30,58,0},{49,76,0},{49,76,0},{49,76,0},{49,62,1},{79,0,162},{41,65,1},{41,65,1},{30,58,0},{127,17,162},{30,58,0},{93,0,200},{49,76,1},{53,67,1},{38,67,1},{93,0,200},{126,32,200},{38,67,1},{0,63,200},{126,32,200},{0,63,200},{44,0,200}, +{44,0,200},{44,0,200},{44,0,200},{39,69,0},{39,69,0},{39,69,0},{39,54,0},{30,58,0},{30,58,0},{48,105,400},{48,85,213},{50,72,314},{48,70,213},{43,102,723},{43,78,209},{43,71,2},{41,65,315},{25,80,723},{29,66,215},{53,95,200},{53,80,1},{54,72,21},{52,70,38},{92,1,723},{41,79,201},{43,71,2},{25,66,202},{126,31,723},{25,66,202},{48,90,200},{48,90,200},{48,90,200}, +{48,68,200},{43,86,162},{43,71,1},{43,71,1},{43,61,20},{29,71,162},{34,62,0},{53,80,0},{53,80,0},{53,80,0},{53,66,0},{85,0,162},{45,69,1},{45,69,1},{34,62,0},{127,23,162},{34,62,0},{99,0,200},{53,80,1},{57,71,1},{42,71,1},{99,0,200},{126,38,200},{42,71,1},{0,66,202},{126,38,200},{0,66,202},{48,0,200},{48,0,200},{48,0,200},{48,0,200},{43,73,0}, +{43,73,0},{43,73,0},{43,58,0},{34,62,0},{34,62,0},{52,109,400},{52,89,213},{54,76,314},{52,74,213},{47,106,723},{47,82,209},{47,75,2},{45,69,315},{29,84,723},{33,70,215},{57,99,200},{57,84,1},{58,76,21},{56,74,38},{98,1,723},{45,83,201},{47,75,2},{29,70,202},{126,37,723},{29,70,202},{52,94,200},{52,94,200},{52,94,200},{52,72,200},{47,90,162},{47,75,1},{47,75,1}, +{46,65,21},{33,75,162},{38,65,2},{57,84,0},{57,84,0},{57,84,0},{57,70,0},{91,0,162},{49,73,1},{49,73,1},{39,65,1},{127,29,162},{39,65,1},{105,0,200},{57,84,1},{61,75,1},{46,75,1},{105,0,200},{126,44,200},{46,75,1},{0,70,202},{126,44,200},{0,70,202},{52,0,200},{52,0,200},{52,0,200},{52,0,200},{47,77,0},{47,77,0},{47,77,0},{47,62,0},{38,65,1}, +{38,65,1},{57,113,402},{57,93,215},{58,82,315},{56,79,215},{52,109,724},{51,86,207},{52,80,2},{51,73,314},{33,89,723},{38,75,213},{62,102,201},{62,88,2},{62,81,21},{60,79,38},{105,0,723},{49,88,201},{52,80,1},{33,75,200},{126,44,723},{33,75,200},{57,97,202},{57,97,202},{57,97,202},{56,77,202},{52,94,163},{52,79,2},{52,79,2},{51,69,21},{38,79,162},{42,70,1},{62,87,1}, +{62,87,1},{62,87,1},{62,74,1},{98,0,162},{54,77,1},{54,77,1},{43,70,0},{127,36,162},{43,70,0},{112,0,200},{62,88,1},{65,80,0},{50,80,0},{112,0,200},{127,50,200},{50,80,0},{0,75,200},{127,50,200},{0,75,200},{56,0,202},{56,0,202},{56,0,202},{56,0,202},{52,80,1},{52,80,1},{52,80,1},{51,66,1},{43,69,1},{43,69,1},{61,117,402},{61,97,215},{62,86,315}, +{60,83,215},{56,113,724},{55,90,207},{56,84,2},{55,77,314},{37,93,723},{42,79,213},{65,107,200},{65,93,0},{66,84,20},{64,82,36},{111,0,723},{53,92,201},{56,84,1},{37,79,200},{127,49,723},{37,79,200},{61,101,202},{61,101,202},{61,101,202},{60,81,202},{56,98,163},{56,83,2},{56,83,2},{55,73,21},{42,83,162},{46,74,1},{65,92,0},{65,92,0},{65,92,0},{65,78,1},{104,0,162}, +{58,81,1},{58,81,1},{47,74,0},{127,42,162},{47,74,0},{118,0,200},{65,93,0},{69,84,0},{54,84,0},{118,0,200},{127,56,200},{54,84,0},{0,79,200},{127,56,200},{0,79,200},{60,0,202},{60,0,202},{60,0,202},{60,0,202},{56,84,1},{56,84,1},{56,84,1},{55,70,1},{47,73,1},{47,73,1},{64,122,400},{64,100,216},{65,89,312},{64,87,213},{60,117,724},{59,94,207},{60,88,2}, +{59,81,314},{41,97,723},{46,83,213},{69,111,200},{69,97,0},{70,88,20},{68,86,36},{117,0,723},{57,96,201},{60,88,1},{41,83,200},{127,55,723},{41,83,200},{64,106,200},{64,106,200},{64,106,200},{64,85,200},{60,102,163},{60,87,2},{60,87,2},{59,77,21},{46,87,162},{50,78,1},{69,96,0},{69,96,0},{69,96,0},{69,82,1},{110,0,162},{62,85,1},{62,85,1},{51,78,0},{126,48,162}, +{51,78,0},{124,0,200},{69,97,0},{73,88,0},{58,88,0},{124,0,200},{127,62,200},{58,88,0},{0,83,200},{127,62,200},{0,83,200},{64,0,200},{64,0,200},{64,0,200},{64,0,200},{60,88,1},{60,88,1},{60,88,1},{59,74,1},{51,77,1},{51,77,1},{68,126,400},{68,104,216},{69,93,312},{68,91,213},{63,123,724},{63,98,207},{63,92,6},{63,85,314},{45,101,723},{50,87,213},{73,115,200}, +{73,101,0},{74,92,20},{72,90,36},{123,0,723},{61,100,201},{64,91,4},{45,87,200},{127,61,723},{45,87,200},{68,110,200},{68,110,200},{68,110,200},{68,89,200},{63,108,163},{64,91,4},{64,91,4},{63,81,21},{50,91,162},{54,82,1},{73,100,0},{73,100,0},{73,100,0},{73,86,1},{115,1,162},{65,90,0},{65,90,0},{55,82,0},{126,54,162},{55,82,0},{127,5,200},{73,101,0},{77,92,0}, +{62,92,0},{127,5,200},{126,68,200},{62,92,0},{0,87,200},{126,68,200},{0,87,200},{68,0,200},{68,0,200},{68,0,200},{68,0,200},{63,94,1},{63,94,1},{63,94,1},{63,78,1},{55,81,1},{55,81,1},{73,126,410},{73,109,212},{74,98,308},{72,96,212},{68,126,724},{68,102,212},{68,96,4},{66,90,308},{50,105,723},{54,91,215},{78,119,201},{77,106,1},{79,97,19},{77,95,35},{127,5,723}, +{64,105,200},{68,96,3},{50,91,202},{126,68,723},{50,91,202},{73,114,202},{73,114,202},{73,114,202},{73,93,202},{68,110,163},{68,95,3},{68,95,3},{67,85,19},{54,96,162},{59,86,2},{78,104,1},{78,104,1},{78,104,1},{77,91,1},{122,0,162},{69,95,0},{69,95,0},{60,86,1},{126,61,162},{60,86,1},{127,19,200},{77,106,0},{82,96,1},{67,96,1},{127,19,200},{127,74,200},{67,96,1}, +{0,91,202},{127,74,200},{0,91,202},{72,0,202},{72,0,202},{72,0,202},{72,0,202},{68,97,1},{68,97,1},{68,97,1},{68,82,1},{59,86,1},{59,86,1},{77,127,434},{77,113,212},{78,102,308},{76,100,212},{72,127,732},{72,106,212},{72,100,4},{70,94,308},{54,109,723},{58,95,215},{82,123,201},{81,110,1},{83,101,19},{81,99,35},{127,18,723},{68,109,200},{72,100,3},{54,95,202},{126,74,723}, +{54,95,202},{77,118,202},{77,118,202},{77,118,202},{77,97,202},{72,114,163},{72,99,3},{72,99,3},{71,89,19},{58,100,162},{63,90,2},{82,108,1},{82,108,1},{82,108,1},{81,95,1},{127,2,162},{73,99,0},{73,99,0},{64,90,1},{127,66,162},{64,90,1},{127,31,200},{81,110,0},{86,100,1},{71,100,1},{127,31,200},{127,80,200},{71,100,1},{0,95,202},{127,80,200},{0,95,202},{76,0,202}, +{76,0,202},{76,0,202},{76,0,202},{72,101,1},{72,101,1},{72,101,1},{72,86,1},{63,90,1},{63,90,1},{82,127,468},{81,117,212},{82,106,308},{80,104,212},{77,127,753},{76,110,212},{76,104,4},{74,98,308},{58,113,723},{62,99,215},{86,127,201},{85,114,1},{87,105,19},{85,103,35},{127,30,723},{72,113,200},{76,104,3},{58,99,202},{127,79,723},{58,99,202},{81,122,202},{81,122,202},{81,122,202}, +{81,101,202},{76,118,163},{76,103,3},{76,103,3},{75,93,19},{62,104,162},{66,95,1},{86,112,1},{86,112,1},{86,112,1},{85,99,1},{127,14,162},{77,103,0},{77,103,0},{68,94,1},{127,72,162},{68,94,1},{127,43,200},{85,114,0},{90,104,1},{75,104,1},{127,43,200},{127,86,200},{75,104,1},{0,99,202},{127,86,200},{0,99,202},{80,0,202},{80,0,202},{80,0,202},{80,0,202},{76,105,1}, +{76,105,1},{76,105,1},{76,90,1},{66,95,0},{66,95,0},{86,127,546},{85,121,212},{86,110,308},{84,108,212},{82,127,788},{80,114,212},{80,108,4},{78,102,308},{62,117,723},{67,103,212},{91,127,211},{89,118,1},{91,109,19},{89,107,35},{127,42,723},{76,117,200},{80,108,3},{62,103,202},{127,85,723},{62,103,202},{85,126,202},{85,126,202},{85,126,202},{85,105,202},{80,122,163},{80,107,3},{80,107,3}, +{79,97,19},{67,107,163},{70,99,1},{90,116,1},{90,116,1},{90,116,1},{89,103,1},{127,27,162},{81,107,0},{81,107,0},{72,98,1},{126,78,162},{72,98,1},{127,56,200},{89,118,0},{94,108,1},{79,108,1},{127,56,200},{127,92,200},{79,108,1},{0,103,202},{127,92,200},{0,103,202},{84,0,202},{84,0,202},{84,0,202},{84,0,202},{80,109,1},{80,109,1},{80,109,1},{80,94,1},{70,99,0}, +{70,99,0},{91,127,632},{89,125,216},{90,114,312},{89,112,213},{88,127,852},{83,120,208},{84,113,2},{82,106,312},{66,121,724},{71,107,216},{97,127,244},{94,122,0},{95,113,20},{93,111,36},{127,56,723},{81,121,200},{84,113,2},{65,108,200},{127,92,723},{65,108,200},{89,127,209},{89,127,209},{89,127,209},{89,110,200},{84,126,164},{84,113,2},{84,113,2},{84,102,20},{71,112,163},{75,103,0},{94,121,0}, +{94,121,0},{94,121,0},{94,107,1},{127,40,162},{86,111,0},{86,111,0},{75,103,0},{126,85,162},{75,103,0},{127,69,200},{94,122,0},{98,113,0},{82,113,0},{127,69,200},{126,99,200},{82,113,0},{0,108,200},{126,99,200},{0,108,200},{89,0,200},{89,0,200},{89,0,200},{89,0,200},{84,114,0},{84,114,0},{84,114,0},{84,99,0},{75,103,0},{75,103,0},{97,127,728},{94,127,228},{94,118,312}, +{93,116,213},{94,127,932},{87,124,208},{88,117,2},{86,110,312},{70,125,724},{75,111,216},{101,127,286},{98,126,0},{99,117,20},{97,115,36},{127,67,723},{85,125,200},{88,117,2},{69,112,200},{127,98,723},{69,112,200},{94,127,224},{94,127,224},{94,127,224},{93,114,200},{89,127,174},{88,117,2},{88,117,2},{88,106,20},{75,116,163},{79,107,0},{98,125,0},{98,125,0},{98,125,0},{98,111,1},{127,53,162}, +{90,115,0},{90,115,0},{79,107,0},{126,91,162},{79,107,0},{127,81,200},{98,126,0},{102,117,0},{86,117,0},{127,81,200},{126,105,200},{86,117,0},{0,112,200},{126,105,200},{0,112,200},{93,0,200},{93,0,200},{93,0,200},{93,0,200},{88,118,0},{88,118,0},{88,118,0},{88,103,0},{79,107,0},{79,107,0},{100,127,864},{99,127,304},{98,122,312},{97,120,213},{98,127,1043},{92,127,211},{92,121,2}, +{90,114,312},{76,127,732},{79,115,216},{106,127,336},{102,127,20},{103,121,20},{101,119,36},{127,79,723},{90,127,208},{92,121,2},{73,116,200},{127,104,723},{73,116,200},{98,127,257},{98,127,257},{98,127,257},{97,118,200},{94,127,196},{92,121,2},{92,121,2},{92,110,20},{79,120,163},{83,111,0},{102,126,4},{102,126,4},{102,126,4},{102,115,1},{127,64,162},{94,119,0},{94,119,0},{83,111,0},{126,97,162}, +{83,111,0},{127,93,200},{105,127,8},{106,121,0},{90,121,0},{127,93,200},{126,111,200},{90,121,0},{0,116,200},{126,111,200},{0,116,200},{97,0,200},{97,0,200},{97,0,200},{97,0,200},{92,122,0},{92,122,0},{92,122,0},{92,107,0},{83,111,0},{83,111,0},{106,127,992},{103,127,440},{102,126,312},{101,124,213},{103,127,1144},{96,127,272},{96,125,2},{94,118,312},{84,127,804},{83,119,216},{111,127,398}, +{108,127,84},{107,125,20},{105,123,36},{127,92,723},{99,127,248},{96,125,2},{77,120,200},{126,110,723},{77,120,200},{103,127,296},{103,127,296},{103,127,296},{101,122,200},{100,127,244},{96,125,2},{96,125,2},{96,114,20},{83,124,163},{87,115,0},{107,127,13},{107,127,13},{107,127,13},{106,119,1},{127,76,162},{98,123,0},{98,123,0},{87,115,0},{126,103,162},{87,115,0},{127,105,200},{111,127,45},{110,125,0}, +{94,125,0},{127,105,200},{126,117,200},{94,125,0},{0,120,200},{126,117,200},{0,120,200},{101,0,200},{101,0,200},{101,0,200},{101,0,200},{96,126,0},{96,126,0},{96,126,0},{96,111,0},{87,115,0},{87,115,0},{111,127,919},{108,127,515},{107,127,362},{105,127,203},{109,127,1027},{102,127,267},{101,127,9},{99,122,198},{93,127,703},{88,123,121},{115,127,338},{113,127,122},{112,127,34},{110,126,14},{127,102,546}, +{108,127,202},{102,127,2},{85,123,113},{127,115,546},{85,123,113},{107,127,362},{107,127,362},{107,127,362},{106,126,202},{104,127,309},{101,127,9},{101,127,9},{100,118,19},{89,127,168},{91,120,1},{112,127,34},{112,127,34},{112,127,34},{110,124,1},{127,90,162},{104,126,2},{104,126,2},{93,119,1},{127,109,162},{93,119,1},{127,115,113},{119,127,41},{116,127,0},{104,127,0},{127,115,113},{127,121,113},{104,127,0}, +{0,123,113},{127,121,113},{0,123,113},{105,0,202},{105,0,202},{105,0,202},{105,0,202},{101,127,5},{101,127,5},{101,127,5},{101,115,1},{91,120,0},{91,120,0},{114,127,751},{111,127,514},{111,127,414},{110,127,218},{114,127,814},{108,127,219},{107,127,65},{103,124,71},{102,127,539},{94,125,27},{120,127,206},{117,127,110},{117,127,61},{115,127,2},{127,110,333},{113,127,121},{110,127,20},{93,125,25},{126,119,333}, +{93,125,25},{111,127,414},{111,127,414},{111,127,414},{110,127,218},{109,127,371},{107,127,65},{107,127,65},{104,122,19},{96,127,203},{95,124,1},{117,127,61},{117,127,61},{117,127,61},{115,127,2},{127,102,162},{110,127,20},{110,127,20},{97,123,1},{127,115,162},{97,123,1},{127,121,25},{122,127,9},{122,127,0},{116,127,0},{127,121,25},{127,124,25},{116,127,0},{0,125,25},{127,124,25},{0,125,25},{109,0,202}, +{109,0,202},{109,0,202},{109,0,202},{106,127,18},{106,127,18},{106,127,18},{105,119,1},{95,124,0},{95,124,0},{117,127,636},{117,127,516},{117,127,467},{115,127,282},{117,127,643},{111,127,241},{111,127,141},{108,126,18},{108,127,434},{99,127,2},{123,127,131},{121,127,105},{121,127,89},{119,127,26},{127,118,193},{119,127,86},{116,127,53},{101,127,0},{126,123,193},{101,127,0},{117,127,467},{117,127,467},{117,127,467}, +{115,127,282},{114,127,410},{111,127,141},{111,127,141},{108,126,14},{105,127,254},{99,127,2},{121,127,89},{121,127,89},{121,127,89},{119,127,26},{127,113,145},{116,127,53},{116,127,53},{101,127,0},{127,120,145},{101,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{113,0,202},{113,0,202},{113,0,202},{113,0,202},{111,127,41}, +{111,127,41},{111,127,41},{109,123,1},{101,126,2},{101,126,2},{120,127,412},{120,127,356},{120,127,331},{118,127,238},{120,127,387},{116,127,183},{116,127,134},{113,127,1},{113,127,262},{108,127,18},{124,127,41},{124,127,29},{124,127,25},{122,127,10},{127,122,54},{122,127,22},{122,127,13},{113,127,0},{126,125,54},{113,127,0},{120,127,331},{120,127,331},{120,127,331},{118,127,238},{117,127,266},{116,127,134},{116,127,134}, +{113,127,1},{110,127,161},{108,127,18},{124,127,25},{124,127,25},{124,127,25},{122,127,10},{127,119,41},{122,127,13},{122,127,13},{113,127,0},{127,123,41},{113,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{117,0,202},{117,0,202},{117,0,202},{117,0,202},{114,127,73},{114,127,73},{114,127,73},{113,127,1},{108,127,18}, +{108,127,18},{0,41,421},{0,28,41},{0,21,1},{0,18,157},{0,27,925},{0,19,569},{0,17,285},{0,12,701},{0,12,1005},{0,10,751},{0,41,421},{0,28,41},{0,21,1},{0,18,157},{13,1,925},{0,19,569},{0,17,285},{0,12,701},{27,0,925},{0,12,701},{0,20,0},{0,20,0},{0,20,0},{0,10,0},{0,9,85},{0,8,29},{0,8,29},{0,4,50},{0,5,94},{0,4,59},{0,20,0}, +{0,20,0},{0,20,0},{0,10,0},{5,0,85},{0,8,29},{0,8,29},{0,4,50},{9,0,85},{0,4,50},{20,0,421},{0,28,41},{0,21,1},{0,18,157},{20,0,421},{41,0,421},{0,18,157},{0,14,421},{41,0,421},{0,14,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,53,421},{0,37,9},{1,25,17}, +{0,21,113},{0,36,1261},{0,22,677},{0,20,305},{0,15,881},{0,17,1383},{0,13,971},{0,53,421},{0,37,9},{1,25,13},{0,21,113},{18,0,1261},{0,22,677},{0,20,305},{0,15,881},{36,0,1261},{0,15,881},{0,32,0},{0,32,0},{0,32,0},{0,15,1},{0,15,221},{0,11,85},{0,11,85},{0,7,130},{0,8,246},{0,7,155},{0,32,0},{0,32,0},{0,32,0},{0,15,1},{8,0,221}, +{0,11,85},{0,11,85},{0,7,130},{15,0,221},{0,7,130},{26,0,421},{0,37,9},{3,25,1},{0,21,113},{26,0,421},{53,0,421},{0,21,113},{0,18,421},{53,0,421},{0,18,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,63,426},{1,42,6},{2,29,66},{0,27,74},{0,45,1514},{0,28,706},{0,25,258}, +{0,18,974},{0,19,1706},{0,18,1118},{2,61,422},{1,42,2},{3,30,38},{0,27,74},{22,0,1514},{0,28,706},{0,25,258},{0,18,974},{45,0,1514},{0,18,974},{1,42,5},{1,42,5},{1,42,5},{1,21,5},{0,24,338},{0,19,90},{0,19,90},{0,10,181},{0,11,389},{0,10,230},{2,40,1},{2,40,1},{2,40,1},{1,21,1},{12,0,338},{0,19,90},{0,19,90},{0,10,181},{24,0,338}, +{0,10,181},{32,0,421},{1,42,1},{7,29,1},{0,27,65},{32,0,421},{65,0,421},{0,27,65},{0,22,421},{65,0,421},{0,22,421},{1,0,5},{1,0,5},{1,0,5},{1,0,5},{0,4,0},{0,4,0},{0,4,0},{0,2,0},{0,2,1},{0,2,1},{3,71,482},{3,48,62},{4,34,158},{2,31,117},{0,58,1514},{0,37,594},{0,31,122},{0,23,881},{0,25,1818},{0,21,1086},{6,65,422}, +{5,46,2},{7,34,38},{4,31,74},{28,0,1514},{0,37,594},{0,31,122},{0,23,881},{58,0,1514},{0,23,881},{3,50,61},{3,50,61},{3,50,61},{3,26,61},{0,36,338},{0,25,34},{0,25,34},{0,15,130},{0,17,461},{0,14,226},{6,44,1},{6,44,1},{6,44,1},{5,25,1},{18,0,338},{0,25,34},{0,25,34},{0,15,130},{36,0,338},{0,15,130},{38,0,421},{5,46,1},{11,33,1}, +{0,32,40},{38,0,421},{77,0,421},{0,32,40},{0,26,421},{77,0,421},{0,26,421},{3,0,61},{3,0,61},{3,0,61},{3,0,61},{0,16,0},{0,16,0},{0,16,0},{0,8,0},{0,5,25},{0,5,25},{5,80,621},{5,55,213},{7,40,357},{5,35,241},{0,71,1514},{0,43,497},{0,36,29},{0,27,761},{0,31,1989},{0,26,1079},{10,70,421},{10,50,1},{11,38,41},{8,35,77},{35,0,1514}, +{0,43,497},{0,36,29},{0,27,761},{71,0,1514},{0,27,761},{5,60,200},{5,60,200},{5,60,200},{5,32,200},{0,50,338},{0,34,4},{0,34,4},{0,21,80},{0,22,552},{0,19,244},{10,49,0},{10,49,0},{10,49,0},{10,29,0},{24,1,338},{0,34,4},{0,34,4},{0,21,80},{50,0,338},{0,21,80},{45,0,421},{10,50,1},{16,37,1},{0,36,13},{45,0,421},{91,0,421},{0,36,13}, +{0,30,421},{91,0,421},{0,30,421},{5,0,200},{5,0,200},{5,0,200},{5,0,200},{0,30,0},{0,30,0},{0,30,0},{0,15,0},{0,11,74},{0,11,74},{7,89,813},{7,60,421},{10,43,617},{7,40,417},{0,83,1514},{0,51,446},{0,41,3},{0,32,686},{0,37,2165},{0,31,1101},{14,74,421},{14,54,1},{15,42,41},{12,39,77},{41,0,1514},{0,51,446},{0,41,3},{0,32,686},{83,0,1514}, +{0,32,686},{7,67,392},{7,67,392},{7,67,392},{7,37,392},{0,62,338},{0,41,2},{0,41,2},{0,24,52},{0,28,680},{0,23,298},{14,53,0},{14,53,0},{14,53,0},{14,33,0},{30,1,338},{2,39,0},{2,39,0},{0,24,52},{62,0,338},{0,24,52},{51,0,421},{14,54,1},{20,41,1},{0,41,2},{51,0,421},{103,0,421},{0,41,2},{0,34,421},{103,0,421},{0,34,421},{7,0,392}, +{7,0,392},{7,0,392},{7,0,392},{0,42,0},{0,42,0},{0,42,0},{0,21,0},{0,17,146},{0,17,146},{11,93,842},{11,65,453},{12,48,654},{11,44,446},{4,87,1515},{3,54,435},{4,45,4},{0,36,654},{0,43,2030},{0,35,882},{18,78,421},{18,58,1},{19,46,41},{16,43,77},{47,0,1514},{0,57,422},{4,45,3},{0,36,605},{95,0,1514},{0,36,605},{11,71,421},{11,71,421},{11,71,421}, +{11,41,421},{4,66,339},{4,45,3},{4,45,3},{2,29,41},{0,34,581},{0,28,161},{18,57,0},{18,57,0},{18,57,0},{18,37,0},{36,1,338},{6,43,0},{6,43,0},{0,30,20},{74,0,338},{0,30,20},{57,0,421},{18,58,1},{24,45,1},{2,45,1},{57,0,421},{115,0,421},{2,45,1},{0,38,421},{115,0,421},{0,38,421},{11,0,421},{11,0,421},{11,0,421},{11,0,421},{4,46,1}, +{4,46,1},{4,46,1},{3,25,1},{0,22,85},{0,22,85},{15,97,842},{16,67,453},{16,52,654},{15,48,446},{8,91,1515},{7,58,435},{8,49,4},{4,40,654},{0,51,1850},{0,40,682},{22,82,421},{22,62,1},{23,50,41},{20,47,77},{53,0,1514},{3,61,421},{8,49,3},{0,41,554},{107,0,1514},{0,41,554},{15,75,421},{15,75,421},{15,75,421},{15,45,421},{8,70,339},{8,49,3},{8,49,3}, +{6,33,41},{0,40,477},{0,34,57},{22,61,0},{22,61,0},{22,61,0},{22,41,0},{42,1,338},{10,47,0},{10,47,0},{0,34,8},{86,0,338},{0,34,8},{63,0,421},{22,62,1},{28,49,1},{6,49,1},{63,0,421},{127,0,421},{6,49,1},{0,42,421},{127,0,421},{0,42,421},{15,0,421},{15,0,421},{15,0,421},{15,0,421},{8,50,1},{8,50,1},{8,50,1},{7,29,1},{0,31,29}, +{0,31,29},{19,102,842},{20,71,451},{21,57,650},{19,52,446},{12,97,1514},{12,63,437},{12,54,2},{9,45,650},{0,57,1710},{0,45,530},{27,86,422},{26,67,1},{28,55,38},{25,52,74},{59,1,1514},{7,66,421},{12,54,2},{0,45,494},{121,0,1514},{0,45,494},{19,81,421},{19,81,421},{19,81,421},{19,49,422},{12,75,338},{12,54,2},{12,54,2},{11,38,38},{0,49,402},{0,39,6},{27,64,1}, +{27,64,1},{27,64,1},{26,46,1},{49,0,338},{14,52,0},{14,52,0},{1,39,1},{100,0,338},{1,39,1},{69,0,421},{26,67,0},{32,54,1},{10,54,0},{69,0,421},{127,7,421},{10,54,0},{0,47,421},{127,7,421},{0,47,421},{19,0,421},{19,0,421},{19,0,421},{19,0,421},{12,56,0},{12,56,0},{12,56,0},{12,33,1},{0,38,5},{0,38,5},{23,106,842},{24,75,451},{25,61,650}, +{23,56,446},{16,101,1514},{15,67,434},{16,58,2},{13,49,650},{0,64,1617},{0,50,462},{31,90,422},{30,71,1},{32,59,38},{29,56,74},{65,0,1514},{11,70,421},{16,58,2},{0,50,461},{127,3,1514},{0,50,461},{23,85,421},{23,85,421},{23,85,421},{23,53,422},{16,79,338},{16,58,2},{16,58,2},{15,42,38},{0,54,349},{3,43,2},{31,68,1},{31,68,1},{31,68,1},{30,50,1},{55,0,338}, +{18,56,0},{18,56,0},{5,43,1},{112,0,338},{5,43,1},{75,0,421},{30,71,0},{36,58,1},{14,58,0},{75,0,421},{127,13,421},{14,58,0},{0,51,421},{127,13,421},{0,51,421},{23,0,421},{23,0,421},{23,0,421},{23,0,421},{16,60,0},{16,60,0},{16,60,0},{16,37,1},{3,43,1},{3,43,1},{27,110,842},{28,79,451},{30,64,650},{27,60,446},{20,105,1514},{19,71,434},{20,62,2}, +{17,53,650},{0,70,1553},{1,54,450},{35,94,422},{34,75,1},{36,63,38},{33,60,74},{71,0,1514},{15,74,421},{20,62,2},{0,54,441},{127,9,1514},{0,54,441},{27,89,421},{27,89,421},{27,89,421},{27,57,422},{20,83,338},{20,62,2},{20,62,2},{19,46,38},{0,61,338},{7,47,2},{35,72,1},{35,72,1},{35,72,1},{34,54,1},{61,0,338},{22,60,0},{22,60,0},{9,47,1},{124,0,338}, +{9,47,1},{81,0,421},{34,75,0},{40,62,1},{18,62,0},{81,0,421},{126,19,421},{18,62,0},{0,55,421},{126,19,421},{0,55,421},{27,0,421},{27,0,421},{27,0,421},{27,0,421},{20,64,0},{20,64,0},{20,64,0},{20,41,1},{7,47,1},{7,47,1},{31,114,842},{32,83,451},{33,67,650},{31,64,446},{24,109,1514},{23,75,434},{24,65,6},{21,57,650},{0,76,1521},{5,58,450},{39,98,422}, +{38,79,1},{41,66,42},{37,63,81},{77,0,1514},{19,78,421},{25,65,2},{0,59,425},{127,15,1514},{0,59,425},{31,93,421},{31,93,421},{31,93,421},{31,61,422},{24,87,338},{24,64,5},{24,64,5},{23,50,38},{5,64,339},{11,51,2},{39,76,1},{39,76,1},{39,76,1},{38,58,1},{66,1,338},{25,64,1},{25,64,1},{13,51,1},{126,5,338},{13,51,1},{87,0,421},{38,79,0},{45,65,1}, +{23,65,1},{87,0,421},{126,25,421},{23,65,1},{0,59,421},{126,25,421},{0,59,421},{31,0,421},{31,0,421},{31,0,421},{31,0,421},{24,67,0},{24,67,0},{24,67,0},{24,45,1},{11,51,1},{11,51,1},{36,118,842},{37,88,453},{38,72,646},{35,69,445},{29,112,1515},{27,79,438},{29,69,6},{25,61,654},{3,82,1515},{10,63,450},{43,103,421},{43,83,2},{45,70,41},{42,67,76},{83,1,1514}, +{24,82,421},{29,69,5},{2,63,421},{126,22,1514},{2,63,421},{36,96,421},{36,96,421},{36,96,421},{36,65,421},{29,91,339},{29,69,2},{29,69,2},{27,54,41},{10,68,339},{15,56,1},{43,82,0},{43,82,0},{43,82,0},{43,62,0},{73,0,338},{31,67,1},{31,67,1},{16,56,0},{126,12,338},{16,56,0},{93,0,421},{42,84,0},{49,70,0},{26,70,0},{93,0,421},{126,32,421},{26,70,0}, +{0,63,421},{126,32,421},{0,63,421},{36,0,421},{36,0,421},{36,0,421},{36,0,421},{29,71,1},{29,71,1},{29,71,1},{28,50,1},{15,56,1},{15,56,1},{40,122,842},{41,92,453},{42,76,646},{39,73,445},{33,116,1515},{31,83,438},{33,73,6},{30,64,650},{7,86,1515},{15,66,451},{47,107,421},{47,87,2},{49,74,41},{46,71,76},{89,1,1514},{28,86,421},{33,73,5},{5,67,421},{126,28,1514}, +{5,67,421},{40,100,421},{40,100,421},{40,100,421},{40,69,421},{33,95,339},{33,73,2},{33,73,2},{31,58,41},{14,72,339},{19,60,1},{47,86,0},{47,86,0},{47,86,0},{47,66,0},{79,0,338},{35,71,1},{35,71,1},{20,60,0},{127,17,338},{20,60,0},{99,0,421},{46,88,0},{53,74,0},{30,74,0},{99,0,421},{126,38,421},{30,74,0},{0,67,421},{126,38,421},{0,67,421},{40,0,421}, +{40,0,421},{40,0,421},{40,0,421},{33,75,1},{33,75,1},{33,75,1},{32,54,1},{19,60,1},{19,60,1},{44,126,842},{45,96,453},{46,80,646},{43,77,445},{37,120,1515},{35,87,438},{37,77,6},{34,68,650},{11,90,1515},{19,70,451},{51,111,421},{51,91,2},{53,78,41},{50,75,76},{95,1,1514},{32,90,421},{37,77,5},{9,71,421},{126,34,1514},{9,71,421},{44,104,421},{44,104,421},{44,104,421}, +{44,73,421},{37,99,339},{37,77,2},{37,77,2},{35,62,41},{18,76,339},{23,64,1},{51,90,0},{51,90,0},{51,90,0},{51,70,0},{85,0,338},{39,75,1},{39,75,1},{23,64,1},{127,23,338},{23,64,1},{105,0,421},{50,92,0},{57,78,0},{34,78,0},{105,0,421},{126,44,421},{34,78,0},{0,71,421},{126,44,421},{0,71,421},{44,0,421},{44,0,421},{44,0,421},{44,0,421},{37,79,1}, +{37,79,1},{37,79,1},{36,58,1},{23,64,0},{23,64,0},{48,126,854},{49,100,453},{50,84,646},{47,81,445},{41,124,1515},{39,91,438},{41,81,6},{38,72,650},{15,94,1515},{23,74,451},{55,115,421},{55,95,2},{57,82,41},{54,79,76},{101,1,1514},{36,94,421},{41,81,5},{13,75,421},{126,40,1514},{13,75,421},{48,108,421},{48,108,421},{48,108,421},{48,77,421},{41,103,339},{41,81,2},{41,81,2}, +{40,65,42},{22,80,339},{27,68,1},{55,94,0},{55,94,0},{55,94,0},{55,74,0},{91,0,338},{43,79,1},{43,79,1},{29,67,1},{127,29,338},{29,67,1},{111,0,421},{54,96,0},{61,82,0},{38,82,0},{111,0,421},{127,49,421},{38,82,0},{0,75,421},{127,49,421},{0,75,421},{48,0,421},{48,0,421},{48,0,421},{48,0,421},{41,83,1},{41,83,1},{41,83,1},{40,62,1},{27,68,0}, +{27,68,0},{53,127,886},{53,104,451},{54,88,650},{52,85,446},{46,126,1521},{44,96,434},{45,86,6},{43,77,646},{18,99,1515},{27,78,453},{60,119,422},{59,100,1},{62,87,42},{59,84,75},{108,0,1514},{40,99,421},{46,86,2},{18,79,421},{125,47,1514},{18,79,421},{52,114,421},{52,114,421},{52,114,421},{52,82,421},{45,108,338},{45,85,5},{45,85,5},{45,70,41},{26,85,339},{31,72,2},{60,97,1}, +{60,97,1},{60,97,1},{60,78,1},{98,0,338},{48,83,1},{48,83,1},{33,72,0},{127,36,338},{33,72,0},{118,0,421},{59,100,0},{65,86,1},{44,86,1},{118,0,421},{127,56,421},{44,86,1},{0,79,421},{127,56,421},{0,79,421},{52,0,421},{52,0,421},{52,0,421},{52,0,421},{45,88,0},{45,88,0},{45,88,0},{45,66,0},{31,73,0},{31,73,0},{58,127,926},{57,108,451},{58,92,650}, +{56,89,446},{51,126,1542},{48,100,434},{49,90,6},{47,81,646},{22,103,1515},{31,82,453},{63,125,422},{63,104,1},{64,91,41},{63,88,75},{114,0,1514},{44,103,421},{50,90,2},{22,83,421},{127,52,1514},{22,83,421},{56,118,421},{56,118,421},{56,118,421},{56,86,421},{49,112,338},{49,89,5},{49,89,5},{49,74,41},{30,89,339},{35,76,2},{63,103,1},{63,103,1},{63,103,1},{63,82,2},{104,0,338}, +{52,87,1},{52,87,1},{37,76,0},{127,42,338},{37,76,0},{124,0,421},{63,104,0},{69,90,1},{48,90,1},{124,0,421},{127,62,421},{48,90,1},{0,83,421},{127,62,421},{0,83,421},{56,0,421},{56,0,421},{56,0,421},{56,0,421},{49,92,0},{49,92,0},{49,92,0},{49,70,0},{35,77,0},{35,77,0},{62,127,1010},{61,112,451},{62,96,650},{60,93,446},{56,127,1577},{52,104,434},{53,94,6}, +{51,85,646},{26,107,1515},{35,86,453},{67,126,425},{67,107,1},{68,95,41},{65,92,77},{120,0,1514},{48,107,421},{54,94,2},{26,87,421},{127,58,1514},{26,87,421},{60,122,421},{60,122,421},{60,122,421},{60,90,421},{53,116,338},{53,93,5},{53,93,5},{53,78,41},{34,93,339},{39,80,2},{67,106,0},{67,106,0},{67,106,0},{67,86,0},{110,0,338},{56,91,1},{56,91,1},{41,80,0},{126,48,338}, +{41,80,0},{127,5,421},{67,107,1},{73,94,1},{52,94,1},{127,5,421},{126,68,421},{52,94,1},{0,87,421},{126,68,421},{0,87,421},{60,0,421},{60,0,421},{60,0,421},{60,0,421},{53,96,0},{53,96,0},{53,96,0},{53,74,0},{39,81,0},{39,81,0},{68,127,1098},{64,117,450},{65,101,654},{64,97,446},{61,127,1626},{56,108,434},{57,98,6},{55,89,646},{30,111,1515},{39,90,453},{72,127,437}, +{71,111,1},{72,99,41},{69,96,77},{126,0,1514},{52,111,421},{58,98,2},{30,91,421},{126,64,1514},{30,91,421},{64,125,421},{64,125,421},{64,125,421},{64,94,421},{57,120,338},{57,97,5},{57,97,5},{57,82,41},{38,97,339},{43,84,2},{71,110,0},{71,110,0},{71,110,0},{71,90,0},{115,1,338},{60,95,1},{60,95,1},{45,84,0},{126,54,338},{45,84,0},{127,18,421},{71,111,1},{77,98,1}, +{56,98,1},{127,18,421},{126,74,421},{56,98,1},{0,91,421},{126,74,421},{0,91,421},{64,0,421},{64,0,421},{64,0,421},{64,0,421},{57,100,0},{57,100,0},{57,100,0},{57,78,0},{43,85,0},{43,85,0},{71,127,1214},{69,122,450},{70,106,650},{68,101,446},{66,127,1722},{60,112,438},{62,102,6},{59,93,650},{36,115,1515},{44,95,451},{78,126,470},{75,116,2},{77,104,38},{74,101,74},{127,11,1514}, +{57,115,421},{62,102,5},{34,96,421},{126,71,1514},{34,96,421},{68,127,425},{68,127,425},{68,127,425},{68,98,422},{62,124,339},{62,102,2},{62,102,2},{61,86,42},{43,101,339},{48,89,1},{76,114,1},{76,114,1},{76,114,1},{75,95,1},{122,0,338},{63,101,1},{63,101,1},{50,88,1},{126,61,338},{50,88,1},{127,31,421},{75,116,1},{81,103,1},{59,103,0},{127,31,421},{127,80,421},{59,103,0}, +{0,96,421},{127,80,421},{0,96,421},{68,0,421},{68,0,421},{68,0,421},{68,0,421},{62,104,1},{62,104,1},{62,104,1},{62,82,1},{48,89,0},{48,89,0},{77,127,1334},{73,126,450},{74,110,650},{72,105,446},{71,127,1805},{65,116,437},{65,107,2},{63,97,650},{40,119,1515},{48,99,451},{82,127,506},{79,120,2},{81,108,38},{78,105,74},{127,24,1514},{61,119,421},{65,107,2},{38,100,421},{125,77,1514}, +{38,100,421},{73,126,441},{73,126,441},{73,126,441},{72,102,422},{65,127,340},{65,107,2},{65,107,2},{64,91,38},{47,105,339},{52,93,1},{80,118,1},{80,118,1},{80,118,1},{79,99,1},{127,2,338},{67,105,0},{67,105,0},{54,92,1},{127,66,338},{54,92,1},{127,43,421},{79,120,1},{85,107,1},{63,107,0},{127,43,421},{127,86,421},{63,107,0},{0,100,421},{127,86,421},{0,100,421},{72,0,421}, +{72,0,421},{72,0,421},{72,0,421},{65,109,0},{65,109,0},{65,109,0},{65,86,1},{52,93,0},{52,93,0},{82,127,1470},{77,127,462},{78,114,650},{76,109,446},{77,127,1917},{69,120,437},{69,111,2},{66,102,650},{44,123,1515},{52,103,451},{88,127,562},{83,124,2},{85,112,38},{82,109,74},{127,36,1514},{65,122,421},{69,111,2},{42,104,421},{127,82,1514},{42,104,421},{77,127,461},{77,127,461},{77,127,461}, +{76,106,422},{71,127,356},{69,111,2},{69,111,2},{68,95,38},{51,109,339},{56,97,1},{84,122,1},{84,122,1},{84,122,1},{83,103,1},{127,14,338},{71,109,0},{71,109,0},{58,96,1},{127,72,338},{58,96,1},{127,56,421},{83,124,1},{89,111,1},{67,111,0},{127,56,421},{127,92,421},{67,111,0},{0,104,421},{127,92,421},{0,104,421},{76,0,421},{76,0,421},{76,0,421},{76,0,421},{69,113,0}, +{69,113,0},{69,113,0},{69,90,1},{56,97,0},{56,97,0},{85,127,1634},{82,127,530},{82,118,650},{80,113,446},{82,127,2030},{73,124,437},{73,115,2},{70,106,650},{48,127,1515},{56,107,451},{92,127,646},{87,127,6},{89,116,38},{86,113,74},{127,48,1514},{69,126,421},{73,115,2},{46,108,421},{127,88,1514},{46,108,421},{82,127,494},{82,127,494},{82,127,494},{80,110,422},{75,127,386},{73,115,2},{73,115,2}, +{72,99,38},{55,113,339},{60,101,1},{88,126,1},{88,126,1},{88,126,1},{87,107,1},{127,27,338},{75,113,0},{75,113,0},{62,100,1},{126,78,338},{62,100,1},{127,67,421},{89,126,5},{93,115,1},{71,115,0},{127,67,421},{127,98,421},{71,115,0},{0,108,421},{127,98,421},{0,108,421},{80,0,421},{80,0,421},{80,0,421},{80,0,421},{73,117,0},{73,117,0},{73,117,0},{73,94,1},{60,101,0}, +{60,101,0},{91,127,1838},{87,127,682},{86,122,654},{85,118,446},{88,127,2198},{78,127,450},{78,119,4},{74,110,654},{57,127,1557},{60,111,453},{97,127,741},{93,127,57},{93,120,41},{90,117,77},{127,62,1514},{76,127,446},{78,119,3},{51,112,421},{127,95,1514},{51,112,421},{86,127,554},{86,127,554},{86,127,554},{85,115,421},{80,127,435},{78,119,3},{78,119,3},{76,103,41},{59,118,339},{64,105,1},{93,126,8}, +{93,126,8},{93,126,8},{92,111,0},{127,40,338},{80,117,0},{80,117,0},{65,105,0},{126,85,338},{65,105,0},{127,81,421},{96,127,29},{98,119,1},{76,119,1},{127,81,421},{126,105,421},{76,119,1},{0,112,421},{126,105,421},{0,112,421},{85,0,421},{85,0,421},{85,0,421},{85,0,421},{78,120,1},{78,120,1},{78,120,1},{77,99,1},{64,105,1},{64,105,1},{97,127,2070},{92,127,882},{90,126,654}, +{89,122,446},{91,127,2382},{84,127,546},{82,123,4},{78,114,654},{64,127,1658},{62,116,453},{103,127,837},{99,127,161},{97,124,41},{94,121,77},{127,73,1514},{84,127,521},{82,123,3},{55,116,421},{127,101,1514},{55,116,421},{91,127,605},{91,127,605},{91,127,605},{89,119,421},{85,127,485},{82,123,3},{82,123,3},{80,107,41},{63,122,339},{68,109,1},{97,127,20},{97,127,20},{97,127,20},{96,115,0},{127,53,338}, +{84,121,0},{84,121,0},{69,109,0},{126,91,338},{69,109,0},{127,93,421},{102,127,85},{102,123,1},{80,123,1},{127,93,421},{126,111,421},{80,123,1},{0,116,421},{126,111,421},{0,116,421},{89,0,421},{89,0,421},{89,0,421},{89,0,421},{82,124,1},{82,124,1},{82,124,1},{81,103,1},{68,109,1},{68,109,1},{100,127,2201},{96,127,1101},{95,127,686},{93,126,441},{97,127,2469},{87,127,689},{86,127,3}, +{84,117,617},{73,127,1735},{67,120,421},{109,127,916},{104,127,298},{102,127,52},{98,125,68},{127,86,1459},{93,127,584},{86,127,2},{59,120,392},{127,107,1459},{59,120,392},{95,127,686},{95,127,686},{95,127,686},{93,123,421},{91,127,557},{86,127,3},{86,127,3},{84,111,41},{66,126,338},{72,113,1},{102,126,52},{102,126,52},{102,126,52},{100,119,0},{127,64,338},{88,125,0},{88,125,0},{73,113,0},{126,97,338}, +{73,113,0},{127,105,392},{110,127,146},{106,127,0},{84,127,0},{127,105,392},{126,117,392},{84,127,0},{0,120,392},{126,117,392},{0,120,392},{93,0,421},{93,0,421},{93,0,421},{93,0,421},{86,127,2},{86,127,2},{86,127,2},{85,107,1},{72,113,1},{72,113,1},{103,127,1901},{101,127,1079},{100,127,761},{97,127,421},{100,127,2093},{93,127,537},{91,127,29},{87,120,357},{81,127,1425},{72,122,213},{111,127,638}, +{108,127,244},{106,127,80},{103,126,17},{127,93,1064},{99,127,392},{93,127,4},{67,122,200},{126,111,1064},{67,122,200},{100,127,761},{100,127,761},{100,127,761},{97,127,421},{95,127,659},{91,127,29},{91,127,29},{88,115,41},{73,127,350},{76,117,1},{106,127,80},{106,127,80},{106,127,80},{104,123,0},{127,76,338},{93,127,4},{93,127,4},{77,117,0},{126,103,338},{77,117,0},{127,111,200},{116,127,74},{112,127,0}, +{96,127,0},{127,111,200},{126,120,200},{96,127,0},{0,122,200},{126,120,200},{0,122,200},{97,0,421},{97,0,421},{97,0,421},{97,0,421},{91,127,13},{91,127,13},{91,127,13},{89,111,1},{76,117,1},{76,117,1},{109,127,1646},{106,127,1086},{104,127,881},{102,127,450},{106,127,1730},{99,127,474},{96,127,122},{93,123,158},{87,127,1166},{79,124,62},{114,127,446},{111,127,225},{111,127,125},{108,127,2},{127,102,722}, +{105,127,254},{102,127,34},{76,124,61},{127,115,722},{76,124,61},{104,127,881},{104,127,881},{104,127,881},{102,127,450},{100,127,770},{96,127,122},{96,127,122},{93,120,38},{81,127,426},{81,121,2},{111,127,125},{111,127,125},{111,127,125},{108,127,2},{127,90,338},{102,127,34},{102,127,34},{83,121,1},{127,109,338},{83,121,1},{127,118,61},{119,127,25},{119,127,0},{110,127,0},{127,118,61},{126,123,61},{110,127,0}, +{0,124,61},{126,123,61},{0,124,61},{101,0,421},{101,0,421},{101,0,421},{101,0,421},{95,127,40},{95,127,40},{95,127,40},{94,115,1},{81,121,1},{81,121,1},{111,127,1450},{111,127,1109},{109,127,974},{105,127,542},{111,127,1505},{102,127,514},{102,127,258},{98,125,66},{96,127,1026},{84,126,6},{120,127,342},{117,127,230},{117,127,181},{113,127,37},{127,110,509},{111,127,213},{108,127,90},{85,126,5},{126,119,509}, +{85,126,5},{109,127,974},{109,127,974},{109,127,974},{105,127,542},{106,127,882},{102,127,258},{102,127,258},{97,124,38},{90,127,530},{85,125,2},{117,127,181},{117,127,181},{117,127,181},{113,127,37},{127,102,338},{108,127,90},{108,127,90},{87,125,1},{127,115,338},{87,125,1},{127,124,5},{125,127,1},{125,127,0},{122,127,0},{127,124,5},{126,126,5},{122,127,0},{0,126,5},{126,126,5},{0,126,5},{105,0,421}, +{105,0,421},{105,0,421},{105,0,421},{100,127,65},{100,127,65},{100,127,65},{98,119,1},{85,125,1},{85,125,1},{114,127,1179},{114,127,971},{112,127,881},{111,127,545},{114,127,1170},{108,127,457},{107,127,305},{102,126,17},{102,127,793},{90,127,9},{121,127,209},{120,127,155},{120,127,130},{118,127,45},{127,116,294},{116,127,134},{113,127,85},{95,127,0},{126,122,294},{95,127,0},{112,127,881},{112,127,881},{112,127,881}, +{111,127,545},{111,127,765},{107,127,305},{107,127,305},{102,126,13},{96,127,465},{90,127,9},{120,127,130},{120,127,130},{120,127,130},{118,127,45},{127,110,221},{113,127,85},{113,127,85},{95,127,0},{126,119,221},{95,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{109,0,421},{109,0,421},{109,0,421},{109,0,421},{106,127,113}, +{106,127,113},{106,127,113},{102,123,1},{90,127,9},{90,127,9},{117,127,871},{117,127,751},{115,127,701},{113,127,502},{117,127,822},{111,127,364},{111,127,264},{106,127,1},{105,127,537},{99,127,41},{123,127,75},{123,127,59},{123,127,50},{121,127,17},{127,121,113},{119,127,54},{119,127,29},{107,127,0},{127,124,113},{107,127,0},{115,127,701},{115,127,701},{115,127,701},{113,127,502},{114,127,561},{111,127,264},{111,127,264}, +{106,127,1},{102,127,329},{99,127,41},{123,127,50},{123,127,50},{123,127,50},{121,127,17},{127,116,85},{119,127,29},{119,127,29},{107,127,0},{126,122,85},{107,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{113,0,421},{113,0,421},{113,0,421},{113,0,421},{109,127,157},{109,127,157},{109,127,157},{106,127,1},{99,127,41}, +{99,127,41},{0,59,882},{0,40,100},{0,30,4},{0,24,340},{0,39,1896},{0,25,1188},{0,23,590},{0,15,1444},{0,19,2040},{0,15,1544},{0,59,882},{0,40,100},{0,30,4},{0,24,340},{19,0,1896},{0,25,1188},{0,23,590},{0,15,1444},{39,0,1896},{0,15,1444},{0,27,0},{0,27,0},{0,27,0},{0,13,1},{0,13,162},{0,11,58},{0,11,58},{0,7,97},{0,5,179},{0,6,116},{0,27,0}, +{0,27,0},{0,27,0},{0,13,1},{7,0,162},{0,11,58},{0,11,58},{0,7,97},{13,0,162},{0,7,97},{29,0,882},{0,40,100},{0,30,4},{0,24,340},{29,0,882},{59,0,882},{0,24,340},{0,19,884},{59,0,882},{0,19,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,71,882},{0,49,40},{1,34,12}, +{0,30,260},{0,47,2355},{0,31,1332},{0,28,612},{0,18,1700},{0,22,2556},{0,18,1844},{0,71,882},{0,49,40},{1,34,8},{0,30,260},{23,0,2355},{0,31,1332},{0,28,612},{0,18,1700},{47,0,2355},{0,18,1700},{0,39,0},{0,39,0},{0,39,0},{0,19,0},{0,20,338},{0,14,130},{0,14,130},{0,10,205},{0,8,371},{0,9,244},{0,39,0},{0,39,0},{0,39,0},{0,19,0},{10,0,338}, +{0,14,130},{0,14,130},{0,10,205},{20,0,338},{0,10,205},{35,0,882},{0,49,40},{3,34,0},{0,30,260},{35,0,882},{71,0,882},{0,30,260},{0,23,884},{71,0,882},{0,23,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,83,882},{0,55,8},{1,40,60},{0,33,200},{0,56,2899},{0,37,1508},{0,31,660}, +{0,21,2004},{0,25,3176},{0,21,2200},{0,83,882},{0,55,8},{2,38,52},{0,33,200},{27,1,2899},{0,37,1508},{0,31,660},{0,21,2004},{56,0,2899},{0,21,2004},{0,52,0},{0,52,0},{0,52,0},{0,25,0},{0,26,578},{0,19,208},{0,19,208},{0,13,353},{0,11,635},{0,10,414},{0,52,0},{0,52,0},{0,52,0},{0,25,0},{13,0,578},{0,19,208},{0,19,208},{0,13,353},{26,0,578}, +{0,13,353},{41,0,882},{0,55,8},{7,38,0},{0,33,200},{41,0,882},{83,0,882},{0,33,200},{0,27,884},{83,0,882},{0,27,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,91,902},{1,62,20},{3,44,133},{0,39,172},{0,66,3048},{0,43,1416},{0,37,488},{0,27,1944},{0,31,3460},{0,26,2254},{3,89,882}, +{3,60,2},{5,44,68},{2,38,168},{33,0,3048},{0,43,1416},{0,37,488},{0,27,1944},{66,0,3048},{0,27,1944},{2,60,20},{2,60,20},{2,60,20},{2,30,20},{0,36,648},{0,28,160},{0,28,160},{0,15,340},{0,17,771},{0,15,440},{3,58,0},{3,58,0},{3,58,0},{3,30,0},{18,0,648},{0,28,160},{0,28,160},{0,15,340},{36,0,648},{0,15,340},{47,0,882},{1,62,0},{11,42,0}, +{0,39,136},{47,0,882},{95,0,882},{0,39,136},{0,31,884},{95,0,882},{0,31,884},{1,0,20},{1,0,20},{1,0,20},{1,0,20},{0,9,0},{0,9,0},{0,9,0},{0,4,1},{0,3,8},{0,3,8},{4,101,995},{4,67,114},{6,48,283},{3,44,242},{0,80,3048},{0,51,1224},{0,43,267},{0,32,1794},{0,37,3651},{0,30,2195},{8,93,883},{7,65,2},{9,48,67},{6,42,171},{39,1,3048}, +{0,51,1224},{0,43,267},{0,32,1794},{80,0,3048},{0,32,1794},{4,69,113},{4,69,113},{4,69,113},{4,36,113},{0,50,648},{0,34,74},{0,34,74},{0,21,250},{0,22,862},{0,19,434},{8,61,1},{8,61,1},{8,61,1},{8,34,1},{24,1,648},{0,34,74},{0,34,74},{0,21,250},{50,0,648},{0,21,250},{53,1,882},{6,65,1},{15,47,1},{0,44,89},{53,1,882},{109,0,882},{0,44,89}, +{0,36,882},{109,0,882},{0,36,882},{4,0,113},{4,0,113},{4,0,113},{4,0,113},{0,23,0},{0,23,0},{0,23,0},{0,11,0},{0,8,41},{0,8,41},{6,109,1147},{6,72,274},{8,53,499},{5,47,367},{0,92,3048},{0,57,1096},{0,47,129},{0,36,1635},{0,43,3859},{0,34,2183},{12,97,883},{11,69,2},{13,52,67},{10,46,171},{45,1,3048},{0,57,1096},{0,47,129},{0,36,1635},{92,0,3048}, +{0,36,1635},{6,77,265},{6,77,265},{6,77,265},{6,41,265},{0,62,648},{0,43,26},{0,43,26},{0,26,193},{0,28,990},{0,23,458},{12,65,1},{12,65,1},{12,65,1},{12,38,1},{30,1,648},{0,43,26},{0,43,26},{0,26,193},{62,0,648},{0,26,193},{59,1,882},{10,69,1},{19,51,1},{0,49,58},{59,1,882},{121,0,882},{0,49,58},{0,40,882},{121,0,882},{0,40,882},{6,0,265}, +{6,0,265},{6,0,265},{6,0,265},{0,35,0},{0,35,0},{0,35,0},{0,17,0},{0,14,97},{0,14,97},{8,117,1363},{8,77,506},{10,58,795},{7,52,559},{0,104,3048},{0,63,1000},{0,53,41},{0,39,1523},{0,46,4095},{0,38,2195},{16,101,883},{15,73,2},{17,56,67},{14,50,171},{51,0,3048},{0,63,1000},{0,53,41},{0,39,1523},{104,0,3048},{0,39,1523},{8,85,481},{8,85,481},{8,85,481}, +{8,46,481},{0,74,648},{0,49,2},{0,49,2},{0,30,130},{0,31,1146},{0,28,494},{16,69,1},{16,69,1},{16,69,1},{16,42,1},{36,1,648},{0,49,2},{0,49,2},{0,30,130},{74,0,648},{0,30,130},{65,0,882},{14,73,1},{23,55,1},{0,53,25},{65,0,882},{127,3,882},{0,53,25},{0,44,882},{127,3,882},{0,44,882},{8,0,481},{8,0,481},{8,0,481},{8,0,481},{0,47,0}, +{0,47,0},{0,47,0},{0,23,0},{0,19,169},{0,19,169},{10,125,1643},{11,83,802},{13,61,1159},{9,56,826},{0,117,3048},{0,70,933},{0,58,11},{0,45,1395},{0,54,4321},{0,43,2227},{20,105,883},{19,77,2},{21,60,67},{18,54,171},{57,0,3048},{0,70,933},{0,58,11},{0,45,1395},{117,0,3048},{0,45,1395},{10,93,761},{10,93,761},{10,93,761},{10,51,761},{0,86,648},{0,56,4},{0,56,4}, +{0,35,89},{0,37,1322},{0,31,578},{20,73,1},{20,73,1},{20,73,1},{20,46,1},{42,1,648},{3,54,0},{3,54,0},{0,35,89},{86,0,648},{0,35,89},{71,0,882},{18,77,1},{27,59,1},{0,58,10},{71,0,882},{127,9,882},{0,58,10},{0,48,882},{127,9,882},{0,48,882},{10,0,761},{10,0,761},{10,0,761},{10,0,761},{0,59,0},{0,59,0},{0,59,0},{0,29,0},{0,22,277}, +{0,22,277},{14,126,1784},{14,89,929},{17,65,1329},{13,60,945},{3,124,3048},{2,75,910},{3,62,14},{0,50,1329},{0,60,4212},{0,47,1974},{24,110,882},{24,80,5},{27,64,70},{23,59,168},{63,2,3048},{0,77,893},{4,63,10},{0,50,1293},{126,2,3048},{0,50,1293},{14,99,884},{14,99,884},{14,99,884},{13,56,884},{3,94,648},{3,62,10},{3,62,10},{1,40,68},{0,46,1256},{0,37,428},{24,78,0}, +{24,78,0},{24,78,0},{24,51,0},{49,0,648},{7,59,0},{7,59,0},{0,39,52},{100,0,648},{0,39,52},{78,0,882},{23,81,1},{32,63,0},{0,63,1},{78,0,882},{126,16,882},{0,63,1},{0,52,884},{126,16,882},{0,52,884},{13,0,884},{13,0,884},{13,0,884},{13,0,884},{3,66,0},{3,66,0},{3,66,0},{3,34,0},{0,31,232},{0,31,232},{19,126,1814},{18,93,929},{21,69,1329}, +{17,65,942},{7,127,3051},{6,79,910},{7,66,14},{4,54,1329},{0,67,3975},{0,52,1640},{28,114,882},{28,84,5},{30,67,66},{27,63,168},{69,1,3048},{1,83,882},{9,66,10},{0,53,1205},{126,8,3048},{0,53,1205},{18,103,884},{18,103,884},{18,103,884},{17,60,884},{7,98,648},{8,65,9},{8,65,9},{5,44,68},{0,51,1059},{0,43,236},{28,82,0},{28,82,0},{28,82,0},{28,55,0},{55,0,648}, +{11,63,0},{11,63,0},{0,45,20},{112,0,648},{0,45,20},{83,1,882},{27,85,1},{36,66,1},{4,66,1},{83,1,882},{126,22,882},{4,66,1},{0,56,884},{126,22,882},{0,56,884},{17,0,884},{17,0,884},{17,0,884},{17,0,884},{7,70,0},{7,70,0},{7,70,0},{7,38,0},{0,37,136},{0,37,136},{23,127,1854},{22,97,929},{25,73,1329},{21,69,942},{12,127,3064},{10,83,910},{11,70,14}, +{8,58,1329},{0,73,3751},{0,57,1374},{32,118,882},{32,88,5},{34,71,66},{30,67,165},{75,1,3048},{5,87,882},{13,70,10},{0,59,1125},{126,14,3048},{0,59,1125},{22,107,884},{22,107,884},{22,107,884},{21,64,884},{11,102,648},{12,69,9},{12,69,9},{9,48,68},{0,57,923},{0,49,108},{32,86,0},{32,86,0},{32,86,0},{32,59,0},{61,0,648},{16,65,1},{16,65,1},{0,49,8},{124,0,648}, +{0,49,8},{89,1,882},{31,89,1},{40,70,1},{8,70,1},{89,1,882},{126,28,882},{8,70,1},{0,60,884},{126,28,882},{0,60,884},{21,0,884},{21,0,884},{21,0,884},{21,0,884},{11,74,0},{11,74,0},{11,74,0},{11,42,0},{0,46,68},{0,46,68},{29,127,1934},{26,101,929},{29,77,1329},{25,73,942},{17,127,3091},{14,87,910},{15,74,14},{12,62,1329},{0,79,3559},{0,62,1174},{36,122,882}, +{36,92,5},{38,75,66},{34,71,165},{81,0,3048},{9,91,882},{17,74,10},{0,62,1053},{126,20,3048},{0,62,1053},{26,111,884},{26,111,884},{26,111,884},{26,67,884},{15,106,648},{16,73,9},{16,73,9},{13,52,68},{0,64,810},{0,54,26},{36,90,0},{36,90,0},{36,90,0},{36,63,0},{66,1,648},{20,69,1},{20,69,1},{0,54,1},{126,5,648},{0,54,1},{95,1,882},{35,93,1},{44,74,1}, +{12,74,1},{95,1,882},{126,34,882},{12,74,1},{0,64,882},{126,34,882},{0,64,882},{25,0,884},{25,0,884},{25,0,884},{25,0,884},{15,78,0},{15,78,0},{15,78,0},{15,46,0},{0,51,18},{0,51,18},{33,127,2036},{31,106,931},{33,81,1331},{29,77,942},{23,127,3145},{19,92,910},{19,79,14},{17,65,1329},{0,87,3375},{0,66,1021},{41,126,883},{40,98,2},{43,80,65},{39,76,166},{88,0,3048}, +{14,95,882},{21,78,9},{0,66,996},{127,26,3048},{0,66,996},{30,116,882},{30,116,882},{30,116,882},{30,72,882},{20,109,649},{20,77,10},{20,77,10},{18,57,67},{0,70,729},{1,59,3},{41,94,1},{41,94,1},{41,94,1},{40,67,1},{73,0,648},{24,74,1},{24,74,1},{4,58,1},{126,12,648},{4,58,1},{102,0,882},{39,98,1},{48,79,0},{15,79,0},{102,0,882},{126,41,882},{15,79,0}, +{0,68,884},{126,41,882},{0,68,884},{30,0,882},{30,0,882},{30,0,882},{30,0,882},{20,82,1},{20,82,1},{20,82,1},{19,51,1},{0,60,0},{0,60,0},{38,127,2134},{35,110,931},{37,85,1331},{33,81,942},{29,127,3217},{23,96,910},{23,83,14},{21,69,1329},{0,93,3247},{0,71,949},{45,127,891},{44,102,2},{47,84,65},{43,80,166},{94,0,3048},{18,99,882},{25,82,9},{0,72,948},{127,32,3048}, +{0,72,948},{34,120,882},{34,120,882},{34,120,882},{34,76,882},{24,113,649},{24,81,10},{24,81,10},{22,61,67},{0,79,673},{5,63,3},{45,98,1},{45,98,1},{45,98,1},{44,71,1},{79,0,648},{28,78,1},{28,78,1},{8,62,1},{127,17,648},{8,62,1},{108,0,882},{43,102,1},{52,83,0},{19,83,0},{108,0,882},{125,47,882},{19,83,0},{0,72,884},{125,47,882},{0,72,884},{34,0,882}, +{34,0,882},{34,0,882},{34,0,882},{24,86,1},{24,86,1},{24,86,1},{23,55,1},{3,64,1},{3,64,1},{42,127,2284},{39,114,931},{41,89,1331},{37,85,942},{33,127,3316},{27,100,910},{27,87,14},{25,73,1329},{0,99,3151},{1,76,929},{50,127,909},{48,106,2},{51,88,65},{47,84,166},{100,0,3048},{22,103,882},{29,86,9},{0,75,916},{127,38,3048},{0,75,916},{38,124,882},{38,124,882},{38,124,882}, +{38,80,882},{28,117,649},{28,85,10},{28,85,10},{27,64,66},{0,85,649},{8,66,5},{49,102,1},{49,102,1},{49,102,1},{48,75,1},{85,0,648},{32,82,1},{32,82,1},{11,66,0},{127,23,648},{11,66,0},{114,0,882},{47,106,1},{56,87,0},{23,87,0},{114,0,882},{127,52,882},{23,87,0},{0,76,884},{127,52,882},{0,76,884},{38,0,882},{38,0,882},{38,0,882},{38,0,882},{28,90,1}, +{28,90,1},{28,90,1},{27,59,1},{8,67,1},{8,67,1},{47,127,2414},{43,118,931},{45,93,1331},{41,89,942},{38,127,3409},{31,104,910},{31,91,14},{29,77,1329},{0,105,3087},{5,80,929},{55,127,939},{52,110,2},{55,92,65},{51,88,166},{106,0,3048},{26,107,882},{33,90,9},{0,80,893},{127,44,3048},{0,80,893},{42,127,883},{42,127,883},{42,127,883},{42,84,882},{32,121,649},{32,89,10},{32,89,10}, +{31,68,66},{4,89,649},{12,70,5},{53,106,1},{53,106,1},{53,106,1},{52,79,1},{91,0,648},{36,86,1},{36,86,1},{15,70,0},{127,29,648},{15,70,0},{120,0,882},{51,110,1},{60,91,0},{27,91,0},{120,0,882},{127,58,882},{27,91,0},{0,80,884},{127,58,882},{0,80,884},{42,0,882},{42,0,882},{42,0,882},{42,0,882},{32,94,1},{32,94,1},{32,94,1},{31,63,1},{12,71,1}, +{12,71,1},{52,127,2584},{47,122,929},{50,98,1329},{46,94,942},{44,127,3547},{35,108,910},{36,95,14},{34,82,1331},{0,112,3055},{9,84,931},{61,127,996},{57,113,5},{59,96,66},{55,92,165},{112,1,3048},{30,112,882},{38,95,10},{0,85,883},{126,51,3048},{0,85,883},{47,127,893},{47,127,893},{47,127,893},{47,88,884},{36,127,648},{37,94,9},{37,94,9},{35,72,65},{9,93,649},{17,75,2},{57,111,0}, +{57,111,0},{57,111,0},{57,83,0},{98,0,648},{41,90,1},{41,90,1},{21,74,1},{127,36,648},{21,74,1},{127,0,882},{56,114,1},{64,96,1},{33,95,1},{127,0,882},{126,65,882},{33,95,1},{0,85,882},{126,65,882},{0,85,882},{46,0,884},{46,0,884},{46,0,884},{46,0,884},{36,99,0},{36,99,0},{36,99,0},{36,67,0},{17,75,1},{17,75,1},{58,127,2792},{51,126,929},{54,102,1329}, +{50,98,942},{49,127,3672},{39,112,910},{40,99,14},{38,86,1331},{3,117,3049},{13,88,931},{65,127,1061},{61,117,5},{63,100,66},{59,96,165},{118,1,3048},{34,116,882},{42,99,10},{2,89,882},{126,57,3048},{2,89,882},{52,127,916},{52,127,916},{52,127,916},{51,92,884},{41,127,654},{41,98,9},{41,98,9},{39,76,65},{13,97,649},{21,79,2},{61,115,0},{61,115,0},{61,115,0},{61,87,0},{104,0,648}, +{45,94,1},{45,94,1},{25,78,1},{127,42,648},{25,78,1},{127,11,882},{60,118,1},{68,100,1},{37,99,1},{127,11,882},{126,71,882},{37,99,1},{0,89,882},{126,71,882},{0,89,882},{50,0,884},{50,0,884},{50,0,884},{50,0,884},{40,103,0},{40,103,0},{40,103,0},{40,71,0},{21,79,1},{21,79,1},{61,127,2984},{55,127,949},{58,106,1329},{54,102,942},{55,127,3832},{43,116,910},{44,103,14}, +{42,90,1331},{7,121,3049},{17,92,931},{71,127,1149},{64,122,3},{66,105,67},{63,100,165},{124,1,3048},{38,120,882},{46,103,10},{6,93,882},{126,63,3048},{6,93,882},{55,127,948},{55,127,948},{55,127,948},{55,96,884},{46,126,682},{45,102,9},{45,102,9},{43,80,65},{17,101,649},{25,83,2},{65,118,1},{65,118,1},{65,118,1},{65,91,1},{110,0,648},{49,98,1},{49,98,1},{29,82,1},{126,48,648}, +{29,82,1},{127,24,882},{63,123,1},{72,104,1},{41,103,1},{127,24,882},{125,77,882},{41,103,1},{0,93,882},{125,77,882},{0,93,882},{54,0,884},{54,0,884},{54,0,884},{54,0,884},{44,107,0},{44,107,0},{44,107,0},{44,75,0},{25,83,1},{25,83,1},{65,127,3214},{61,127,1021},{62,110,1329},{58,106,942},{61,127,4024},{47,120,910},{48,107,14},{46,94,1331},{11,125,3049},{21,96,931},{74,127,1245}, +{68,126,3},{70,109,67},{67,103,171},{127,7,3048},{42,124,882},{50,107,10},{10,97,882},{127,68,3048},{10,97,882},{61,127,996},{61,127,996},{61,127,996},{59,100,884},{50,127,714},{49,106,9},{49,106,9},{47,84,65},{21,105,649},{29,87,2},{69,122,1},{69,122,1},{69,122,1},{69,95,1},{115,1,648},{53,102,1},{53,102,1},{33,86,1},{126,54,648},{33,86,1},{127,36,882},{67,127,0},{76,108,1}, +{45,107,1},{127,36,882},{127,82,882},{45,107,1},{0,97,882},{127,82,882},{0,97,882},{58,0,884},{58,0,884},{58,0,884},{58,0,884},{48,111,0},{48,111,0},{48,111,0},{48,79,0},{29,87,1},{29,87,1},{71,127,3494},{65,127,1174},{66,114,1320},{62,110,942},{65,127,4231},{52,125,910},{52,112,14},{50,98,1329},{19,127,3067},{26,101,929},{79,127,1364},{73,127,26},{75,114,68},{72,108,168},{127,21,3048}, +{48,127,885},{54,111,9},{16,101,884},{127,75,3048},{16,101,884},{65,127,1053},{65,127,1053},{65,127,1053},{63,105,882},{56,127,769},{53,110,10},{53,110,10},{52,89,66},{25,110,649},{33,91,5},{73,126,1},{73,126,1},{73,126,1},{73,100,0},{122,0,648},{57,107,1},{57,107,1},{36,91,0},{126,61,648},{36,91,0},{127,50,882},{76,127,18},{81,112,0},{48,112,0},{127,50,882},{127,89,882},{48,112,0}, +{0,101,884},{127,89,882},{0,101,884},{63,0,882},{63,0,882},{63,0,882},{63,0,882},{53,115,1},{53,115,1},{53,115,1},{53,83,1},{33,92,1},{33,92,1},{74,127,3782},{70,127,1374},{70,118,1320},{66,113,945},{71,127,4455},{57,127,926},{56,116,14},{54,102,1329},{25,127,3139},{30,105,929},{85,127,1476},{79,127,97},{79,118,68},{76,112,168},{127,33,3048},{57,127,925},{58,115,9},{20,105,884},{126,81,3048}, +{20,105,884},{68,127,1125},{68,127,1125},{68,127,1125},{66,109,884},{61,127,827},{57,114,10},{57,114,10},{56,93,66},{29,114,649},{37,95,5},{78,126,8},{78,126,8},{78,126,8},{77,104,0},{127,2,648},{61,111,1},{61,111,1},{40,95,0},{127,66,648},{40,95,0},{127,62,882},{81,127,68},{85,116,0},{52,116,0},{127,62,882},{127,95,882},{52,116,0},{0,105,884},{127,95,882},{0,105,884},{66,0,884}, +{66,0,884},{66,0,884},{66,0,884},{57,119,1},{57,119,1},{57,119,1},{57,87,1},{37,96,1},{37,96,1},{79,127,4024},{75,127,1640},{74,122,1320},{70,117,945},{74,127,4699},{63,127,1030},{60,120,14},{58,106,1329},{34,127,3259},{34,109,929},{91,127,1620},{84,127,236},{83,122,68},{80,116,168},{127,45,3048},{64,127,1003},{62,119,9},{24,109,884},{126,87,3048},{24,109,884},{74,127,1205},{74,127,1205},{74,127,1205}, +{70,113,884},{65,127,910},{61,118,10},{61,118,10},{60,97,66},{33,118,649},{41,99,5},{82,127,20},{82,127,20},{82,127,20},{81,108,0},{127,14,648},{64,116,0},{64,116,0},{44,99,0},{127,72,648},{44,99,0},{127,73,882},{90,127,136},{89,120,0},{56,120,0},{127,73,882},{127,101,882},{56,120,0},{0,109,884},{127,101,882},{0,109,884},{70,0,884},{70,0,884},{70,0,884},{70,0,884},{61,123,1}, +{61,123,1},{61,123,1},{61,91,1},{41,100,1},{41,100,1},{85,127,4328},{79,127,1925},{78,126,1320},{74,121,945},{79,127,4920},{67,127,1215},{64,123,14},{62,110,1329},{43,127,3435},{38,113,929},{94,127,1784},{90,127,428},{87,126,68},{84,120,168},{127,57,3048},{70,127,1131},{65,124,10},{28,113,884},{126,93,3048},{28,113,884},{77,127,1293},{77,127,1293},{77,127,1293},{74,117,884},{71,127,1006},{64,123,10},{64,123,10}, +{63,100,70},{37,122,649},{45,103,5},{87,126,52},{87,126,52},{87,126,52},{85,112,0},{127,27,648},{68,120,0},{68,120,0},{48,103,0},{126,78,648},{48,103,0},{127,86,882},{96,127,232},{93,124,0},{60,124,0},{127,86,882},{127,107,882},{60,124,0},{0,113,884},{127,107,882},{0,113,884},{74,0,884},{74,0,884},{74,0,884},{74,0,884},{64,126,1},{64,126,1},{64,126,1},{64,95,0},{45,104,1}, +{45,104,1},{88,127,4403},{84,127,2227},{82,127,1395},{78,125,922},{85,127,4875},{73,127,1326},{69,127,11},{65,115,1174},{54,127,3438},{44,116,802},{100,127,1746},{95,127,578},{92,127,89},{88,124,126},{127,69,2814},{79,127,1146},{71,127,4},{33,117,761},{126,99,2814},{33,117,761},{82,127,1395},{82,127,1395},{82,127,1395},{79,121,883},{77,127,1137},{69,127,11},{69,127,11},{67,106,67},{42,126,649},{50,108,2},{92,127,89}, +{92,127,89},{92,127,89},{90,116,1},{127,40,648},{73,124,0},{73,124,0},{54,107,1},{126,85,648},{54,107,1},{127,96,761},{105,127,277},{98,127,0},{67,127,0},{127,96,761},{127,112,761},{67,127,0},{0,117,761},{127,112,761},{0,117,761},{79,0,882},{79,0,882},{79,0,882},{79,0,882},{69,127,10},{69,127,10},{69,127,10},{68,100,1},{50,108,1},{50,108,1},{94,127,3955},{89,127,2195},{88,127,1523}, +{83,127,886},{91,127,4323},{79,127,1139},{74,127,41},{71,116,799},{60,127,2958},{49,118,506},{103,127,1386},{99,127,494},{97,127,130},{92,125,50},{127,76,2249},{87,127,870},{78,127,2},{42,119,481},{126,103,2249},{42,119,481},{88,127,1523},{88,127,1523},{88,127,1523},{83,125,883},{82,127,1251},{74,127,41},{74,127,41},{71,110,67},{48,127,670},{54,112,2},{97,127,130},{97,127,130},{97,127,130},{94,120,1},{127,53,648}, +{78,127,2},{78,127,2},{58,111,1},{126,91,648},{58,111,1},{127,102,481},{108,127,169},{104,127,0},{79,127,0},{127,102,481},{127,115,481},{79,127,0},{0,119,481},{127,115,481},{0,119,481},{83,0,882},{83,0,882},{83,0,882},{83,0,882},{74,127,25},{74,127,25},{74,127,25},{72,104,1},{54,112,1},{54,112,1},{97,127,3571},{93,127,2183},{91,127,1635},{87,127,891},{94,127,3827},{84,127,1035},{79,127,114}, +{74,119,499},{67,127,2577},{55,121,274},{106,127,1098},{102,127,458},{101,127,193},{97,126,9},{127,86,1769},{93,127,654},{84,127,26},{50,121,265},{127,107,1769},{50,121,265},{91,127,1635},{91,127,1635},{91,127,1635},{87,127,891},{85,127,1387},{79,127,114},{79,127,114},{75,114,67},{57,127,734},{58,116,2},{101,127,193},{101,127,193},{101,127,193},{98,124,1},{127,64,648},{84,127,26},{84,127,26},{62,115,1},{126,97,648}, +{62,115,1},{127,108,265},{113,127,97},{110,127,0},{92,127,0},{127,108,265},{127,118,265},{92,127,0},{0,121,265},{127,118,265},{0,121,265},{87,0,882},{87,0,882},{87,0,882},{87,0,882},{79,127,50},{79,127,50},{79,127,50},{76,108,1},{58,116,1},{58,116,1},{100,127,3267},{97,127,2195},{95,127,1794},{92,127,954},{97,127,3435},{87,127,975},{84,127,267},{79,121,283},{73,127,2281},{60,123,114},{111,127,838}, +{107,127,434},{106,127,250},{102,127,2},{127,93,1374},{99,127,502},{93,127,74},{58,123,113},{126,111,1374},{58,123,113},{95,127,1794},{95,127,1794},{95,127,1794},{92,127,954},{91,127,1539},{84,127,267},{84,127,267},{79,118,67},{64,127,840},{62,120,2},{106,127,250},{106,127,250},{106,127,250},{102,127,2},{127,76,648},{93,127,74},{93,127,74},{65,119,1},{126,103,648},{65,119,1},{127,115,113},{119,127,41},{116,127,0}, +{104,127,0},{127,115,113},{127,121,113},{104,127,0},{0,123,113},{127,121,113},{0,123,113},{91,0,882},{91,0,882},{91,0,882},{91,0,882},{83,127,89},{83,127,89},{83,127,89},{80,112,1},{62,120,1},{62,120,1},{103,127,3032},{101,127,2254},{100,127,1944},{96,127,1080},{103,127,3096},{93,127,1012},{90,127,488},{83,124,133},{81,127,2104},{65,126,20},{114,127,666},{111,127,425},{111,127,325},{108,127,52},{127,102,1032}, +{105,127,404},{99,127,160},{67,125,20},{127,115,1032},{67,125,20},{100,127,1944},{100,127,1944},{100,127,1944},{96,127,1080},{97,127,1736},{90,127,488},{90,127,488},{83,122,68},{73,127,1011},{67,124,2},{111,127,325},{111,127,325},{111,127,325},{108,127,52},{127,90,648},{99,127,160},{99,127,160},{69,124,0},{127,109,648},{69,124,0},{127,122,18},{124,127,8},{122,127,1},{118,127,0},{127,122,18},{126,125,18},{118,127,0}, +{0,125,20},{126,125,18},{0,125,20},{95,0,884},{95,0,884},{95,0,884},{95,0,884},{88,127,136},{88,127,136},{88,127,136},{85,116,0},{65,126,0},{65,126,0},{109,127,2756},{106,127,2200},{103,127,2004},{102,127,1188},{106,127,2760},{96,127,1060},{96,127,660},{87,126,60},{87,127,1900},{72,127,8},{117,127,534},{117,127,414},{114,127,353},{111,127,104},{127,110,771},{108,127,352},{108,127,208},{75,127,0},{126,119,771}, +{75,127,0},{103,127,2004},{103,127,2004},{103,127,2004},{102,127,1188},{100,127,1784},{96,127,660},{96,127,660},{89,125,52},{81,127,1112},{72,127,8},{114,127,353},{114,127,353},{114,127,353},{111,127,104},{127,101,578},{108,127,208},{108,127,208},{75,127,0},{127,114,578},{75,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{99,0,884}, +{99,0,884},{99,0,884},{99,0,884},{94,127,200},{94,127,200},{94,127,200},{89,120,0},{72,127,8},{72,127,8},{111,127,2214},{109,127,1844},{109,127,1700},{105,127,1096},{109,127,2180},{102,127,900},{99,127,612},{93,126,12},{93,127,1468},{78,127,40},{120,127,306},{118,127,244},{117,127,205},{116,127,65},{127,113,451},{113,127,211},{111,127,125},{87,127,0},{127,120,451},{87,127,0},{109,127,1700},{109,127,1700},{109,127,1700}, +{105,127,1096},{103,127,1460},{99,127,612},{99,127,612},{93,126,8},{87,127,872},{78,127,40},{117,127,205},{117,127,205},{117,127,205},{116,127,65},{127,107,338},{111,127,125},{111,127,125},{87,127,0},{127,117,338},{87,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{103,0,884},{103,0,884},{103,0,884},{103,0,884},{97,127,260}, +{97,127,260},{97,127,260},{93,124,0},{78,127,40},{78,127,40},{114,127,1798},{111,127,1521},{111,127,1421},{108,127,1028},{111,127,1675},{105,127,792},{104,127,590},{97,127,4},{96,127,1128},{87,127,100},{123,127,150},{121,127,116},{120,127,97},{119,127,29},{127,118,216},{119,127,99},{116,127,58},{99,127,0},{126,123,216},{99,127,0},{111,127,1421},{111,127,1421},{111,127,1421},{108,127,1028},{109,127,1188},{104,127,590},{104,127,590}, +{97,127,4},{93,127,696},{87,127,100},{120,127,97},{120,127,97},{120,127,97},{119,127,29},{127,113,162},{116,127,58},{116,127,58},{99,127,0},{127,120,162},{99,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{107,0,884},{107,0,884},{107,0,884},{107,0,884},{103,127,340},{103,127,340},{103,127,340},{97,127,4},{87,127,100}, +{87,127,100},{0,78,1568},{0,54,170},{0,40,4},{0,33,596},{0,53,3371},{0,34,2124},{0,31,1048},{0,21,2552},{0,25,3628},{0,21,2748},{0,78,1568},{0,54,170},{0,40,4},{0,33,596},{26,0,3371},{0,34,2124},{0,31,1048},{0,21,2552},{53,0,3371},{0,21,2552},{0,36,0},{0,36,0},{0,36,0},{0,18,0},{0,18,288},{0,14,106},{0,14,106},{0,9,180},{0,8,315},{0,7,206},{0,36,0}, +{0,36,0},{0,36,0},{0,18,0},{9,0,288},{0,14,106},{0,14,106},{0,9,180},{18,0,288},{0,9,180},{39,0,1568},{0,54,170},{0,40,4},{0,33,596},{39,0,1568},{78,0,1568},{0,33,596},{0,26,1568},{78,0,1568},{0,26,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,91,1568},{0,63,90},{0,45,8}, +{0,39,500},{0,61,3968},{0,40,2316},{0,35,1078},{0,24,2880},{0,28,4304},{0,24,3136},{0,91,1568},{0,63,90},{1,44,8},{0,39,500},{30,0,3968},{0,40,2316},{0,35,1078},{0,24,2880},{61,0,3968},{0,24,2880},{0,48,0},{0,48,0},{0,48,0},{0,24,0},{0,24,512},{0,19,180},{0,19,180},{0,10,313},{0,11,563},{0,10,362},{0,48,0},{0,48,0},{0,48,0},{0,24,0},{12,0,512}, +{0,19,180},{0,19,180},{0,10,313},{24,0,512},{0,10,313},{45,0,1568},{0,63,90},{2,44,0},{0,39,500},{45,0,1568},{91,0,1568},{0,39,500},{0,30,1568},{91,0,1568},{0,30,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,103,1568},{0,70,37},{1,49,48},{0,42,400},{0,68,4651},{0,46,2540},{0,40,1128}, +{0,27,3256},{0,31,5084},{0,27,3580},{0,103,1568},{0,70,37},{1,49,44},{0,42,400},{33,1,4651},{0,46,2540},{0,40,1128},{0,27,3256},{68,0,4651},{0,27,3256},{0,61,0},{0,61,0},{0,61,0},{0,30,0},{0,30,800},{0,25,292},{0,25,292},{0,13,485},{0,14,883},{0,13,566},{0,61,0},{0,61,0},{0,61,0},{0,30,0},{15,0,800},{0,25,292},{0,25,292},{0,13,485},{30,0,800}, +{0,13,485},{50,1,1568},{0,70,37},{6,48,0},{0,42,400},{50,1,1568},{103,0,1568},{0,42,400},{0,34,1568},{103,0,1568},{0,34,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,115,1568},{0,76,5},{1,54,145},{0,47,325},{0,77,5419},{0,51,2755},{0,43,1208},{0,30,3680},{0,34,5968},{0,30,4080},{0,115,1568}, +{0,76,5},{3,53,121},{0,47,325},{38,0,5419},{0,51,2755},{0,43,1208},{0,30,3680},{77,0,5419},{0,30,3680},{0,72,0},{0,72,0},{0,72,0},{0,36,0},{0,36,1152},{0,28,424},{0,28,424},{0,18,720},{0,17,1275},{0,15,824},{0,72,0},{0,72,0},{0,72,0},{0,36,0},{18,0,1152},{0,28,424},{0,28,424},{0,18,720},{36,0,1152},{0,18,720},{56,1,1568},{0,76,5},{10,52,0}, +{0,47,325},{56,1,1568},{115,0,1568},{0,47,325},{0,38,1568},{115,0,1568},{0,38,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,125,1609},{2,82,42},{5,58,254},{1,51,318},{0,91,5419},{0,57,2480},{0,49,835},{0,36,3427},{0,40,6191},{0,35,3991},{5,119,1569},{4,80,6},{8,58,122},{2,52,302},{45,0,5419}, +{0,57,2480},{0,49,835},{0,36,3427},{91,0,5419},{0,36,3427},{2,82,41},{2,82,41},{2,82,41},{2,41,42},{0,50,1152},{0,37,274},{0,37,274},{0,21,586},{0,22,1366},{0,20,782},{5,76,1},{5,76,1},{5,76,1},{5,40,1},{24,1,1152},{0,37,274},{0,37,274},{0,21,586},{50,0,1152},{0,21,586},{63,0,1568},{2,82,1},{15,56,1},{0,53,245},{63,0,1568},{127,1,1568},{0,53,245}, +{0,42,1570},{127,1,1568},{0,42,1570},{2,0,41},{2,0,41},{2,0,41},{2,0,41},{0,13,0},{0,13,0},{0,13,0},{0,7,0},{0,5,13},{0,5,13},{5,126,1735},{4,87,150},{7,63,426},{3,56,382},{0,103,5419},{0,64,2265},{0,54,557},{0,39,3243},{0,46,6415},{0,39,3919},{9,123,1569},{8,84,6},{12,62,122},{6,56,302},{50,1,5419},{0,64,2265},{0,54,557},{0,39,3243},{103,0,5419}, +{0,39,3243},{4,90,145},{4,90,145},{4,90,145},{4,46,146},{0,62,1152},{0,43,170},{0,43,170},{0,27,482},{0,28,1494},{0,24,770},{9,80,1},{9,80,1},{9,80,1},{9,44,1},{30,1,1152},{0,43,170},{0,43,170},{0,27,482},{62,0,1152},{0,27,482},{69,0,1568},{6,86,1},{19,60,1},{0,56,181},{69,0,1568},{127,7,1568},{0,56,181},{0,46,1570},{127,7,1568},{0,46,1570},{4,0,145}, +{4,0,145},{4,0,145},{4,0,145},{0,26,0},{0,26,0},{0,26,0},{0,13,0},{0,11,53},{0,11,53},{9,127,1991},{7,93,322},{9,66,678},{5,61,518},{0,115,5419},{0,70,2081},{0,60,341},{0,45,3035},{0,51,6641},{0,42,3891},{13,127,1569},{12,88,6},{15,66,122},{10,60,302},{56,1,5419},{0,70,2081},{0,60,341},{0,45,3035},{115,0,5419},{0,45,3035},{6,98,313},{6,98,313},{6,98,313}, +{6,51,314},{0,74,1152},{0,51,80},{0,51,80},{0,30,394},{0,31,1650},{0,28,782},{13,84,1},{13,84,1},{13,84,1},{13,48,1},{36,1,1152},{0,51,80},{0,51,80},{0,30,394},{74,0,1152},{0,30,394},{75,0,1568},{10,90,1},{23,64,0},{0,62,125},{75,0,1568},{127,13,1568},{0,62,125},{0,50,1570},{127,13,1568},{0,50,1570},{6,0,313},{6,0,313},{6,0,313},{6,0,313},{0,38,0}, +{0,38,0},{0,38,0},{0,18,1},{0,14,117},{0,14,117},{12,127,2387},{9,98,566},{11,71,1002},{7,64,721},{0,127,5419},{0,76,1929},{0,64,181},{0,50,2886},{0,57,6921},{0,47,3879},{17,127,1577},{16,92,6},{19,70,122},{13,64,309},{62,1,5419},{0,76,1929},{0,64,181},{0,50,2886},{127,0,5419},{0,50,2886},{8,106,545},{8,106,545},{8,106,545},{8,56,545},{0,86,1152},{0,57,32},{0,57,32}, +{0,36,306},{0,37,1826},{0,34,822},{17,88,1},{17,88,1},{17,88,1},{17,52,1},{42,1,1152},{0,57,32},{0,57,32},{0,36,306},{86,0,1152},{0,36,306},{80,1,1568},{14,94,1},{27,68,0},{0,66,80},{80,1,1568},{126,19,1568},{0,66,80},{0,54,1570},{126,19,1568},{0,54,1570},{8,0,545},{8,0,545},{8,0,545},{8,0,545},{0,50,0},{0,50,0},{0,50,0},{0,24,1},{0,19,193}, +{0,19,193},{15,127,3004},{11,106,925},{14,77,1461},{9,69,1030},{3,127,5520},{0,84,1769},{0,70,66},{0,53,2697},{0,63,7276},{0,51,3898},{23,127,1602},{21,97,5},{23,74,125},{19,67,306},{69,0,5419},{0,84,1769},{0,70,66},{0,53,2697},{127,7,5419},{0,53,2697},{11,114,884},{11,114,884},{11,114,884},{10,62,884},{0,100,1152},{0,65,5},{0,65,5},{0,42,232},{0,43,2064},{0,37,896},{21,93,0}, +{21,93,0},{21,93,0},{21,57,0},{49,0,1152},{0,65,5},{0,65,5},{0,42,232},{100,0,1152},{0,42,232},{87,0,1568},{19,98,1},{31,73,1},{0,71,45},{87,0,1568},{126,26,1568},{0,71,45},{0,59,1568},{126,26,1568},{0,59,1568},{10,0,884},{10,0,884},{10,0,884},{10,0,884},{0,64,0},{0,64,0},{0,64,0},{0,31,0},{0,25,320},{0,25,320},{17,127,3702},{13,111,1317},{17,80,1945}, +{11,74,1374},{6,127,5788},{0,90,1681},{0,75,18},{0,59,2537},{0,70,7631},{0,55,3952},{29,127,1650},{25,101,5},{27,78,125},{23,71,306},{75,0,5419},{0,90,1681},{0,75,18},{0,59,2537},{127,13,5419},{0,59,2537},{13,122,1252},{13,122,1252},{13,122,1252},{13,66,1252},{0,112,1152},{0,72,5},{0,72,5},{0,45,164},{0,51,2291},{0,43,992},{25,97,0},{25,97,0},{25,97,0},{25,61,0},{55,0,1152}, +{3,70,1},{3,70,1},{0,45,164},{112,0,1152},{0,45,164},{93,0,1568},{23,102,1},{35,77,1},{0,75,18},{93,0,1568},{126,32,1568},{0,75,18},{0,63,1568},{126,32,1568},{0,63,1568},{12,0,1252},{12,0,1252},{12,0,1252},{12,0,1252},{0,75,0},{0,75,0},{0,75,0},{0,37,0},{0,31,464},{0,31,464},{23,127,4370},{16,114,1661},{19,85,2353},{14,77,1674},{12,127,6128},{0,99,1621},{2,80,18}, +{0,62,2397},{0,73,7815},{0,60,3858},{32,127,1702},{29,105,5},{31,82,125},{27,75,306},{80,1,5419},{0,99,1617},{2,80,14},{0,62,2393},{126,19,5419},{0,62,2393},{15,127,1572},{15,127,1572},{15,127,1572},{15,71,1568},{1,122,1152},{1,79,17},{1,79,17},{0,50,121},{0,54,2403},{0,46,996},{29,101,0},{29,101,0},{29,101,0},{29,64,0},{61,0,1152},{7,74,1},{7,74,1},{0,50,117},{124,0,1152}, +{0,50,117},{99,0,1568},{27,106,1},{39,81,1},{0,80,5},{99,0,1568},{126,38,1568},{0,80,5},{0,66,1570},{126,38,1568},{0,66,1570},{15,0,1568},{15,0,1568},{15,0,1568},{15,0,1568},{1,86,0},{1,86,0},{1,86,0},{1,43,0},{0,34,544},{0,34,544},{26,127,4586},{20,118,1661},{23,89,2353},{18,81,1674},{17,127,6275},{3,102,1617},{6,84,18},{1,67,2355},{0,81,7401},{0,64,3371},{38,127,1766}, +{33,109,5},{35,86,125},{31,79,306},{86,1,5419},{0,105,1577},{6,84,14},{0,66,2259},{126,25,5419},{0,66,2259},{20,127,1585},{20,127,1585},{20,127,1585},{19,75,1568},{5,126,1152},{5,83,17},{5,83,17},{4,54,121},{0,60,2155},{0,51,682},{33,105,0},{33,105,0},{33,105,0},{33,68,0},{66,1,1152},{11,78,1},{11,78,1},{0,55,80},{126,5,1152},{0,55,80},{105,0,1568},{31,110,1},{43,85,1}, +{0,84,1},{105,0,1568},{126,44,1568},{0,84,1},{0,70,1570},{126,44,1568},{0,70,1570},{19,0,1568},{19,0,1568},{19,0,1568},{19,0,1568},{5,90,0},{5,90,0},{5,90,0},{5,47,0},{0,43,388},{0,43,388},{32,127,4866},{25,123,1659},{27,93,2355},{23,86,1670},{23,127,6489},{8,107,1615},{10,88,18},{5,71,2353},{0,87,7039},{0,70,2897},{44,127,1865},{37,113,6},{40,91,122},{36,84,305},{93,0,5419}, +{2,111,1569},{10,88,17},{0,72,2124},{126,32,5419},{0,72,2124},{24,127,1619},{24,127,1619},{24,127,1619},{24,79,1570},{10,127,1161},{10,88,14},{10,88,14},{8,58,122},{0,67,1905},{0,57,409},{38,109,1},{38,109,1},{38,109,1},{37,73,1},{73,0,1152},{15,83,1},{15,83,1},{0,59,41},{126,12,1152},{0,59,41},{112,0,1568},{35,115,1},{48,89,0},{4,89,0},{112,0,1568},{127,50,1568},{4,89,0}, +{0,75,1568},{127,50,1568},{0,75,1568},{23,0,1570},{23,0,1570},{23,0,1570},{23,0,1570},{10,93,1},{10,93,1},{10,93,1},{10,51,1},{0,51,232},{0,51,232},{35,127,5154},{29,127,1659},{31,97,2355},{27,90,1670},{26,127,6689},{12,111,1615},{14,92,18},{9,75,2353},{0,93,6751},{0,74,2541},{49,127,1955},{41,117,6},{44,95,122},{40,88,305},{99,0,5419},{6,115,1569},{14,92,17},{0,75,2020},{126,38,5419}, +{0,75,2020},{29,127,1650},{29,127,1650},{29,127,1650},{28,83,1570},{15,127,1179},{14,92,14},{14,92,14},{12,62,122},{0,76,1713},{0,63,225},{42,113,1},{42,113,1},{42,113,1},{41,77,1},{79,0,1152},{19,87,1},{19,87,1},{0,64,20},{127,17,1152},{0,64,20},{118,0,1568},{39,119,1},{52,93,0},{8,93,0},{118,0,1568},{127,56,1568},{8,93,0},{0,79,1568},{127,56,1568},{0,79,1568},{27,0,1570}, +{27,0,1570},{27,0,1570},{27,0,1570},{14,97,1},{14,97,1},{14,97,1},{14,55,1},{0,57,136},{0,57,136},{41,127,5426},{33,127,1711},{35,101,2355},{31,94,1670},{32,127,6905},{16,115,1615},{18,96,18},{13,79,2353},{0,102,6483},{0,79,2241},{52,127,2075},{45,121,6},{48,99,122},{44,92,305},{105,0,5419},{10,119,1569},{18,96,17},{0,80,1929},{126,44,5419},{0,80,1929},{33,127,1707},{33,127,1707},{33,127,1707}, +{32,87,1570},{20,127,1209},{18,96,14},{18,96,14},{15,66,125},{0,81,1526},{0,67,97},{46,117,1},{46,117,1},{46,117,1},{45,81,1},{85,0,1152},{23,91,1},{23,91,1},{0,69,4},{127,23,1152},{0,69,4},{124,0,1568},{43,123,1},{56,97,0},{12,97,0},{124,0,1568},{127,62,1568},{12,97,0},{0,83,1568},{127,62,1568},{0,83,1568},{31,0,1570},{31,0,1570},{31,0,1570},{31,0,1570},{18,101,1}, +{18,101,1},{18,101,1},{18,59,1},{0,64,65},{0,64,65},{44,127,5762},{38,127,1811},{39,105,2355},{35,98,1670},{38,127,7153},{20,119,1615},{22,100,18},{17,83,2353},{0,108,6243},{0,83,2009},{58,127,2195},{49,125,6},{52,103,122},{48,96,305},{111,0,5419},{14,123,1569},{22,100,17},{0,85,1856},{127,49,5419},{0,85,1856},{38,127,1762},{38,127,1762},{38,127,1762},{36,91,1570},{26,127,1265},{22,100,14},{22,100,14}, +{19,70,125},{0,87,1398},{0,73,25},{50,121,1},{50,121,1},{50,121,1},{49,85,1},{91,0,1152},{27,95,1},{27,95,1},{0,73,0},{127,29,1152},{0,73,0},{127,5,1568},{47,127,1},{60,101,0},{16,101,0},{127,5,1568},{126,68,1568},{16,101,0},{0,87,1568},{126,68,1568},{0,87,1568},{35,0,1570},{35,0,1570},{35,0,1570},{35,0,1570},{22,105,1},{22,105,1},{22,105,1},{22,63,1},{0,70,25}, +{0,70,25},{52,127,6088},{43,127,2009},{44,110,2353},{39,102,1674},{44,127,7451},{24,123,1617},{27,105,18},{22,88,2355},{0,113,5999},{0,89,1811},{65,127,2385},{54,127,25},{56,107,125},{52,100,306},{118,0,5419},{19,127,1569},{27,105,14},{0,89,1762},{127,56,5419},{0,89,1762},{42,127,1856},{42,127,1856},{42,127,1856},{40,96,1568},{30,127,1344},{26,104,17},{26,104,17},{24,75,122},{0,96,1281},{1,78,6},{54,126,0}, +{54,126,0},{54,126,0},{54,89,0},{98,0,1152},{32,99,1},{32,99,1},{6,77,1},{127,36,1152},{6,77,1},{127,19,1568},{54,127,25},{64,105,1},{21,105,1},{127,19,1568},{127,74,1568},{21,105,1},{0,91,1570},{127,74,1568},{0,91,1570},{40,0,1568},{40,0,1568},{40,0,1568},{40,0,1568},{26,111,0},{26,111,0},{26,111,0},{26,67,0},{0,79,1},{0,79,1},{55,127,6416},{48,127,2241},{48,114,2353}, +{43,106,1674},{49,127,7696},{28,127,1617},{31,109,18},{26,92,2355},{0,122,5827},{0,94,1711},{68,127,2521},{60,127,97},{60,111,125},{56,104,306},{124,0,5419},{25,127,1601},{31,109,14},{0,94,1707},{127,62,5419},{0,94,1707},{47,127,1929},{47,127,1929},{47,127,1929},{44,100,1568},{35,127,1414},{30,108,17},{30,108,17},{28,79,122},{0,102,1209},{5,82,6},{58,127,4},{58,127,4},{58,127,4},{58,93,0},{104,0,1152}, +{36,103,1},{36,103,1},{10,81,1},{127,42,1152},{10,81,1},{127,31,1568},{63,127,65},{68,109,1},{25,109,1},{127,31,1568},{127,80,1568},{25,109,1},{0,95,1570},{127,80,1568},{0,95,1570},{44,0,1568},{44,0,1568},{44,0,1568},{44,0,1568},{30,115,0},{30,115,0},{30,115,0},{30,71,0},{4,83,1},{4,83,1},{61,127,6800},{53,127,2541},{52,118,2353},{47,110,1674},{52,127,7996},{34,127,1665},{35,113,18}, +{30,96,2355},{0,126,5709},{0,98,1659},{74,127,2705},{64,127,225},{65,115,122},{60,108,306},{127,5,5419},{34,127,1665},{35,113,14},{0,98,1650},{126,68,5419},{0,98,1650},{52,127,2020},{52,127,2020},{52,127,2020},{48,104,1568},{41,127,1510},{34,112,17},{34,112,17},{32,83,122},{0,108,1169},{9,86,6},{63,126,20},{63,126,20},{63,126,20},{62,97,0},{110,0,1152},{40,107,1},{40,107,1},{14,85,1},{126,48,1152}, +{14,85,1},{127,43,1568},{70,127,136},{72,113,1},{29,113,1},{127,43,1568},{127,86,1568},{29,113,1},{0,99,1570},{127,86,1568},{0,99,1570},{48,0,1568},{48,0,1568},{48,0,1568},{48,0,1568},{34,119,0},{34,119,0},{34,119,0},{34,75,0},{8,87,1},{8,87,1},{65,127,7186},{57,127,2897},{56,122,2353},{51,114,1674},{58,127,8300},{40,127,1809},{39,117,18},{34,100,2355},{5,127,5791},{4,102,1659},{79,127,2875}, +{70,127,409},{69,119,122},{63,114,310},{127,18,5419},{43,127,1777},{39,117,14},{0,103,1619},{126,74,5419},{0,103,1619},{55,127,2124},{55,127,2124},{55,127,2124},{52,108,1568},{44,127,1634},{38,116,17},{38,116,17},{36,87,122},{1,115,1153},{13,90,6},{68,127,41},{68,127,41},{68,127,41},{66,101,1},{115,1,1152},{44,111,1},{44,111,1},{18,89,1},{126,54,1152},{18,89,1},{127,56,1568},{76,127,232},{76,117,1}, +{33,117,1},{127,56,1568},{127,92,1568},{33,117,1},{0,103,1570},{127,92,1568},{0,103,1570},{52,0,1568},{52,0,1568},{52,0,1568},{52,0,1568},{38,123,0},{38,123,0},{38,123,0},{38,79,0},{12,91,1},{12,91,1},{68,127,7650},{63,127,3371},{60,126,2355},{56,119,1670},{65,127,8695},{46,127,2083},{43,121,18},{38,104,2353},{14,127,6049},{6,107,1661},{82,127,3112},{76,127,682},{73,123,121},{67,117,305},{127,31,5419}, +{51,127,1977},{43,121,17},{0,107,1585},{127,80,5419},{0,107,1585},{61,127,2259},{61,127,2259},{61,127,2259},{57,112,1570},{52,127,1755},{43,121,14},{43,121,14},{40,91,125},{6,119,1153},{18,94,5},{72,127,80},{72,127,80},{72,127,80},{70,106,0},{122,0,1152},{48,116,1},{48,116,1},{21,94,0},{126,61,1152},{21,94,0},{127,69,1568},{84,127,388},{80,122,0},{37,122,0},{127,69,1568},{126,99,1568},{37,122,0}, +{0,108,1568},{126,99,1568},{0,108,1568},{56,0,1570},{56,0,1570},{56,0,1570},{56,0,1570},{43,126,1},{43,126,1},{43,126,1},{42,84,1},{16,96,1},{16,96,1},{74,127,8066},{67,127,3858},{65,127,2397},{60,123,1670},{68,127,9035},{51,127,2458},{47,125,18},{42,108,2353},{22,127,6379},{10,111,1661},{88,127,3320},{79,127,977},{77,127,121},{71,121,305},{127,43,5419},{60,127,2185},{47,125,17},{0,112,1572},{127,86,5419}, +{0,112,1572},{65,127,2393},{65,127,2393},{65,127,2393},{61,116,1570},{55,127,1891},{47,125,14},{47,125,14},{44,95,125},{10,123,1153},{22,98,5},{77,127,117},{77,127,117},{77,127,117},{74,110,0},{127,2,1152},{52,120,1},{52,120,1},{25,98,0},{127,66,1152},{25,98,0},{127,81,1568},{93,127,544},{84,126,0},{41,126,0},{127,81,1568},{126,105,1568},{41,126,0},{0,112,1568},{126,105,1568},{0,112,1568},{60,0,1570}, +{60,0,1570},{60,0,1570},{60,0,1570},{47,127,5},{47,127,5},{47,127,5},{46,88,1},{20,100,1},{20,100,1},{79,127,7660},{72,127,3952},{68,127,2537},{64,125,1620},{74,127,8515},{57,127,2310},{52,127,18},{47,110,1945},{28,127,5939},{16,114,1317},{91,127,2984},{84,127,992},{82,127,164},{76,123,201},{127,53,4803},{64,127,1931},{54,126,5},{5,114,1252},{126,91,4803},{5,114,1252},{68,127,2537},{68,127,2537},{68,127,2537}, +{64,120,1569},{61,127,2043},{52,127,18},{52,127,18},{48,99,125},{14,127,1153},{26,102,5},{82,127,164},{82,127,164},{82,127,164},{78,114,0},{127,14,1152},{56,124,1},{56,124,1},{29,102,0},{127,72,1152},{29,102,0},{127,89,1250},{96,127,464},{90,127,0},{51,127,0},{127,89,1250},{125,109,1250},{51,127,0},{0,114,1252},{125,109,1250},{0,114,1252},{64,0,1568},{64,0,1568},{64,0,1568},{64,0,1568},{52,127,18}, +{52,127,18},{52,127,18},{50,92,1},{24,104,1},{24,104,1},{82,127,7060},{76,127,3898},{74,127,2697},{68,126,1576},{79,127,7756},{60,127,2062},{57,127,66},{50,113,1461},{37,127,5307},{21,116,925},{97,127,2504},{90,127,896},{85,127,232},{80,125,96},{127,60,4056},{70,127,1563},{60,127,5},{13,116,884},{127,94,4056},{13,116,884},{74,127,2697},{74,127,2697},{74,127,2697},{68,124,1569},{65,127,2214},{57,127,66},{57,127,66}, +{52,103,125},{22,127,1186},{30,106,5},{85,127,232},{85,127,232},{85,127,232},{82,118,0},{127,27,1152},{62,126,5},{62,126,5},{33,106,0},{126,78,1152},{33,106,0},{127,95,882},{102,127,320},{96,127,0},{63,127,0},{127,95,882},{127,111,882},{63,127,0},{0,116,884},{127,111,882},{0,116,884},{68,0,1568},{68,0,1568},{68,0,1568},{68,0,1568},{56,127,45},{56,127,45},{56,127,45},{54,96,1},{28,108,1}, +{28,108,1},{85,127,6483},{79,127,3828},{79,127,2867},{73,127,1574},{82,127,6979},{67,127,1846},{63,127,181},{56,116,1002},{43,127,4714},{29,118,566},{100,127,2034},{93,127,822},{91,127,306},{86,125,26},{127,69,3318},{76,127,1233},{70,127,32},{20,119,545},{126,99,3318},{20,119,545},{79,127,2867},{79,127,2867},{79,127,2867},{73,127,1574},{71,127,2425},{63,127,181},{63,127,181},{57,108,122},{31,127,1273},{34,111,6},{91,127,306}, +{91,127,306},{91,127,306},{87,122,1},{127,40,1152},{70,127,32},{70,127,32},{39,110,1},{126,85,1152},{39,110,1},{127,101,545},{108,127,193},{102,127,1},{76,127,0},{127,101,545},{127,114,545},{76,127,0},{0,119,545},{127,114,545},{0,119,545},{72,0,1570},{72,0,1570},{72,0,1570},{72,0,1570},{61,127,80},{61,127,80},{61,127,80},{59,100,0},{33,112,1},{33,112,1},{88,127,6059},{84,127,3891},{82,127,3035}, +{76,127,1634},{85,127,6411},{70,127,1754},{67,127,341},{61,118,678},{51,127,4330},{34,120,322},{103,127,1698},{98,127,782},{97,127,394},{90,127,2},{127,76,2753},{84,127,1018},{76,127,80},{28,121,313},{126,103,2753},{28,121,313},{82,127,3035},{82,127,3035},{82,127,3035},{76,127,1634},{77,127,2641},{67,127,341},{67,127,341},{61,112,122},{37,127,1401},{38,115,6},{97,127,394},{97,127,394},{97,127,394},{91,126,1},{127,53,1152}, +{76,127,80},{76,127,80},{43,114,1},{126,91,1152},{43,114,1},{127,107,313},{111,127,116},{108,127,1},{89,127,0},{127,107,313},{127,117,313},{89,127,0},{0,121,313},{127,117,313},{0,121,313},{76,0,1570},{76,0,1570},{76,0,1570},{76,0,1570},{65,127,125},{65,127,125},{65,127,125},{63,104,0},{37,116,1},{37,116,1},{94,127,5691},{88,127,3919},{88,127,3243},{81,127,1739},{88,127,5947},{76,127,1722},{73,127,557}, +{64,120,426},{57,127,3994},{39,122,150},{106,127,1434},{102,127,770},{100,127,482},{95,127,17},{127,86,2273},{90,127,850},{84,127,170},{36,123,145},{127,107,2273},{36,123,145},{88,127,3243},{88,127,3243},{88,127,3243},{81,127,1739},{79,127,2835},{73,127,557},{73,127,557},{65,115,122},{46,127,1561},{42,119,6},{100,127,482},{100,127,482},{100,127,482},{95,127,17},{127,64,1152},{84,127,170},{84,127,170},{47,118,1},{126,97,1152}, +{47,118,1},{127,113,145},{116,127,53},{114,127,0},{101,127,0},{127,113,145},{127,120,145},{101,127,0},{0,123,145},{127,120,145},{0,123,145},{80,0,1570},{80,0,1570},{80,0,1570},{80,0,1570},{71,127,181},{71,127,181},{71,127,181},{67,108,1},{41,120,1},{41,120,1},{97,127,5379},{92,127,3991},{91,127,3427},{87,127,1907},{94,127,5539},{79,127,1783},{79,127,822},{69,122,254},{64,127,3745},{44,125,42},{111,127,1210}, +{106,127,782},{106,127,586},{99,127,82},{127,93,1878},{96,127,746},{90,127,274},{44,125,41},{126,111,1878},{44,125,41},{91,127,3427},{91,127,3427},{91,127,3427},{87,127,1907},{85,127,3051},{79,127,822},{79,127,822},{69,119,122},{54,127,1798},{46,123,6},{106,127,586},{106,127,586},{106,127,586},{99,127,82},{127,76,1152},{90,127,274},{90,127,274},{51,122,1},{126,103,1152},{51,122,1},{127,119,41},{122,127,13},{120,127,0}, +{113,127,0},{127,119,41},{127,123,41},{113,127,0},{0,125,41},{127,123,41},{0,125,41},{84,0,1570},{84,0,1570},{84,0,1570},{84,0,1570},{74,127,245},{74,127,245},{74,127,245},{71,112,1},{45,124,1},{45,124,1},{100,127,5128},{97,127,4080},{97,127,3680},{90,127,2152},{97,127,5200},{87,127,1964},{84,127,1208},{73,126,145},{73,127,3580},{51,127,5},{114,127,1062},{111,127,797},{111,127,697},{105,127,212},{127,102,1536}, +{102,127,708},{99,127,424},{54,127,0},{127,115,1536},{54,127,0},{97,127,3680},{97,127,3680},{97,127,3680},{90,127,2152},{91,127,3328},{84,127,1208},{84,127,1208},{74,124,121},{63,127,2089},{51,127,5},{111,127,697},{111,127,697},{111,127,697},{105,127,212},{127,90,1152},{99,127,424},{99,127,424},{54,127,0},{127,109,1152},{54,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0}, +{0,127,0},{127,127,0},{0,127,0},{89,0,1568},{89,0,1568},{89,0,1568},{89,0,1568},{79,127,320},{79,127,320},{79,127,320},{75,117,0},{51,127,5},{51,127,5},{103,127,4416},{100,127,3580},{100,127,3256},{96,127,2040},{100,127,4372},{90,127,1736},{87,127,1128},{79,126,57},{76,127,2956},{57,127,37},{117,127,738},{114,127,566},{114,127,485},{108,127,148},{127,107,1067},{108,127,484},{102,127,292},{66,127,0},{127,117,1067}, +{66,127,0},{100,127,3256},{100,127,3256},{100,127,3256},{96,127,2040},{94,127,2852},{87,127,1128},{87,127,1128},{78,125,45},{70,127,1739},{57,127,37},{114,127,485},{114,127,485},{114,127,485},{108,127,148},{127,96,800},{102,127,292},{102,127,292},{66,127,0},{127,112,800},{66,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{93,0,1568}, +{93,0,1568},{93,0,1568},{93,0,1568},{85,127,400},{85,127,400},{85,127,400},{79,121,0},{57,127,37},{57,127,37},{106,127,3784},{103,127,3136},{103,127,2880},{99,127,1924},{103,127,3648},{93,127,1564},{92,127,1078},{82,127,8},{81,127,2480},{64,127,90},{117,127,482},{117,127,362},{117,127,313},{113,127,97},{127,110,683},{111,127,321},{108,127,180},{78,127,0},{126,119,683},{78,127,0},{103,127,2880},{103,127,2880},{103,127,2880}, +{99,127,1924},{97,127,2448},{92,127,1078},{92,127,1078},{83,126,8},{76,127,1451},{64,127,90},{117,127,313},{117,127,313},{117,127,313},{113,127,97},{127,102,512},{108,127,180},{108,127,180},{78,127,0},{127,115,512},{78,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{97,0,1568},{97,0,1568},{97,0,1568},{97,0,1568},{88,127,500}, +{88,127,500},{88,127,500},{83,125,0},{64,127,90},{64,127,90},{109,127,3232},{106,127,2748},{106,127,2552},{102,127,1832},{106,127,3028},{99,127,1420},{96,127,1048},{87,127,4},{87,127,2032},{73,127,170},{120,127,262},{120,127,206},{118,127,180},{116,127,53},{127,115,384},{116,127,179},{113,127,106},{90,127,0},{127,121,384},{90,127,0},{106,127,2552},{106,127,2552},{106,127,2552},{102,127,1832},{103,127,2112},{96,127,1048},{96,127,1048}, +{87,127,4},{81,127,1260},{73,127,170},{118,127,180},{118,127,180},{118,127,180},{116,127,53},{127,108,288},{113,127,106},{113,127,106},{90,127,0},{127,118,288},{90,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{101,0,1568},{101,0,1568},{101,0,1568},{101,0,1568},{94,127,596},{94,127,596},{94,127,596},{87,127,4},{73,127,170}, +{73,127,170},{0,104,2665},{0,73,274},{0,53,4},{0,45,985},{0,69,5885},{0,46,3677},{0,41,1789},{0,27,4441},{0,31,6341},{0,27,4765},{0,104,2665},{0,73,274},{0,53,4},{0,45,985},{34,0,5885},{0,46,3677},{0,41,1789},{0,27,4441},{69,0,5885},{0,27,4441},{0,50,0},{0,50,0},{0,50,0},{0,24,1},{0,24,545},{0,19,193},{0,19,193},{0,12,337},{0,11,598},{0,10,387},{0,50,0}, +{0,50,0},{0,50,0},{0,24,1},{12,0,545},{0,19,193},{0,19,193},{0,12,337},{24,0,545},{0,12,337},{51,0,2665},{0,73,274},{0,53,4},{0,45,985},{51,0,2665},{104,0,2665},{0,45,985},{0,35,2665},{104,0,2665},{0,35,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,117,2665},{0,81,160},{1,57,12}, +{0,50,872},{0,78,6669},{0,51,3898},{0,46,1825},{0,33,4865},{0,34,7249},{0,30,5277},{0,117,2665},{0,81,160},{1,57,8},{0,50,872},{39,0,6669},{0,51,3898},{0,46,1825},{0,33,4865},{78,0,6669},{0,33,4865},{0,62,0},{0,62,0},{0,62,0},{0,30,1},{0,30,841},{0,25,305},{0,25,305},{0,13,514},{0,14,926},{0,13,595},{0,62,0},{0,62,0},{0,62,0},{0,30,1},{15,0,841}, +{0,25,305},{0,25,305},{0,13,514},{30,0,841},{0,13,514},{57,0,2665},{0,81,160},{3,57,0},{0,50,872},{57,0,2665},{117,0,2665},{0,50,872},{0,39,2665},{117,0,2665},{0,39,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,127,2669},{0,87,80},{1,63,60},{0,53,740},{0,86,7538},{0,57,4178},{0,49,1889}, +{0,36,5333},{0,40,8241},{0,33,5845},{0,127,2669},{0,87,80},{2,61,52},{0,53,740},{42,1,7538},{0,57,4178},{0,49,1889},{0,36,5333},{86,0,7538},{0,36,5333},{0,74,0},{0,74,0},{0,74,0},{0,36,1},{0,36,1201},{0,28,445},{0,28,445},{0,18,745},{0,17,1326},{0,15,861},{0,74,0},{0,74,0},{0,74,0},{0,36,1},{18,0,1201},{0,28,445},{0,28,445},{0,18,745},{36,0,1201}, +{0,18,745},{63,0,2665},{0,87,80},{7,61,0},{0,53,740},{63,0,2665},{127,1,2665},{0,53,740},{0,43,2665},{127,1,2665},{0,43,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,127,2797},{0,93,32},{2,65,154},{0,59,628},{0,94,8493},{0,63,4490},{0,54,1965},{0,39,5849},{0,43,9333},{0,36,6469},{3,127,2761}, +{0,93,32},{3,66,126},{0,59,628},{46,0,8493},{0,63,4490},{0,54,1965},{0,39,5849},{94,0,8493},{0,39,5849},{0,86,0},{0,86,0},{0,86,0},{0,42,1},{0,42,1625},{0,34,605},{0,34,605},{0,21,1009},{0,19,1781},{0,18,1161},{0,86,0},{0,86,0},{0,86,0},{0,42,1},{21,0,1625},{0,34,605},{0,34,605},{0,21,1009},{42,0,1625},{0,21,1009},{69,0,2665},{0,93,32},{11,64,1}, +{0,59,628},{69,0,2665},{127,7,2665},{0,59,628},{0,47,2665},{127,7,2665},{0,47,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,127,3157},{0,102,2},{2,71,304},{0,62,514},{0,103,9669},{0,67,4865},{0,60,2107},{0,42,6485},{0,46,10689},{0,39,7245},{6,127,3029},{0,102,2},{5,71,260},{0,62,514},{50,1,9669}, +{0,67,4865},{0,60,2107},{0,42,6485},{103,0,9669},{0,42,6485},{0,100,0},{0,100,0},{0,100,0},{0,49,0},{0,50,2178},{0,40,820},{0,40,820},{0,24,1348},{0,22,2392},{0,21,1556},{0,100,0},{0,100,0},{0,100,0},{0,49,0},{24,1,2178},{0,40,820},{0,40,820},{0,24,1348},{50,0,2178},{0,24,1348},{76,0,2665},{0,102,2},{15,69,0},{0,62,514},{76,0,2665},{126,14,2665},{0,62,514}, +{0,51,2665},{126,14,2665},{0,51,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,127,3509},{2,108,32},{4,76,424},{1,67,473},{0,115,9669},{0,73,4529},{0,64,1649},{0,45,6209},{0,51,10919},{0,45,7109},{12,127,3141},{4,106,2},{9,75,260},{1,67,469},{56,1,9669},{0,73,4529},{0,64,1649},{0,45,6209},{115,0,9669}, +{0,45,6209},{2,108,32},{2,108,32},{2,108,32},{2,54,32},{0,62,2178},{0,46,628},{0,46,628},{0,27,1184},{0,28,2520},{0,26,1502},{4,104,0},{4,104,0},{4,104,0},{4,53,0},{30,1,2178},{0,46,628},{0,46,628},{0,27,1184},{62,0,2178},{0,27,1184},{81,0,2665},{2,108,0},{19,73,0},{0,66,421},{81,0,2665},{126,20,2665},{0,66,421},{0,55,2665},{126,20,2665},{0,55,2665},{2,0,32}, +{2,0,32},{2,0,32},{2,0,32},{0,12,0},{0,12,0},{0,12,0},{0,6,0},{0,5,10},{0,5,10},{12,127,3989},{4,114,130},{7,79,616},{3,72,525},{0,127,9669},{0,81,4178},{0,67,1265},{0,50,5950},{0,57,11199},{0,49,7029},{17,127,3253},{8,110,2},{13,79,260},{5,71,469},{62,1,9669},{0,81,4178},{0,67,1265},{0,50,5950},{127,0,9669},{0,50,5950},{4,116,128},{4,116,128},{4,116,128}, +{4,59,128},{0,74,2178},{0,54,442},{0,54,442},{0,33,1040},{0,31,2676},{0,30,1460},{8,108,0},{8,108,0},{8,108,0},{8,57,0},{36,1,2178},{0,54,442},{0,54,442},{0,33,1040},{74,0,2178},{0,33,1040},{87,0,2665},{6,112,0},{23,77,0},{0,72,325},{87,0,2665},{126,26,2665},{0,72,325},{0,59,2665},{126,26,2665},{0,59,2665},{4,0,128},{4,0,128},{4,0,128},{4,0,128},{0,24,0}, +{0,24,0},{0,24,0},{0,12,0},{0,8,50},{0,8,50},{15,127,4613},{6,118,304},{9,84,880},{4,76,645},{3,127,9761},{0,87,3898},{0,73,913},{0,56,5686},{0,63,11511},{0,53,6939},{20,127,3401},{12,114,2},{17,83,260},{9,75,469},{68,0,9669},{0,87,3898},{0,73,913},{0,56,5686},{127,6,9669},{0,56,5686},{6,124,288},{6,124,288},{6,124,288},{6,63,289},{0,86,2178},{0,60,306},{0,60,306}, +{0,36,900},{0,37,2852},{0,34,1452},{12,112,0},{12,112,0},{12,112,0},{12,61,0},{42,1,2178},{0,60,306},{0,60,306},{0,36,900},{86,0,2178},{0,36,900},{93,0,2665},{10,116,0},{27,81,0},{0,77,260},{93,0,2665},{126,32,2665},{0,77,260},{0,63,2665},{126,32,2665},{0,63,2665},{6,0,288},{6,0,288},{6,0,288},{6,0,288},{0,36,0},{0,36,0},{0,36,0},{0,18,0},{0,14,106}, +{0,14,106},{17,127,5446},{9,124,575},{12,90,1267},{8,80,862},{7,127,10073},{0,96,3625},{0,79,594},{0,59,5393},{0,70,11905},{0,57,6894},{26,127,3570},{16,119,3},{21,87,259},{14,80,470},{75,0,9669},{0,96,3625},{0,79,594},{0,59,5393},{127,13,9669},{0,59,5393},{9,127,558},{9,127,558},{9,127,558},{8,69,545},{0,100,2178},{0,67,185},{0,67,185},{0,42,754},{0,43,3090},{0,38,1478},{17,115,1}, +{17,115,1},{17,115,1},{16,65,1},{49,0,2178},{0,67,185},{0,67,185},{0,42,754},{100,0,2178},{0,42,754},{100,0,2665},{15,120,0},{32,85,1},{0,82,193},{100,0,2665},{127,38,2665},{0,82,193},{0,67,2665},{127,38,2665},{0,67,2665},{8,0,545},{8,0,545},{8,0,545},{8,0,545},{0,50,0},{0,50,0},{0,50,0},{0,24,1},{0,19,193},{0,19,193},{20,127,6378},{12,127,915},{15,93,1695}, +{9,84,1118},{12,127,10506},{0,102,3401},{0,84,366},{0,65,5186},{0,76,12289},{0,61,6870},{32,127,3738},{20,123,3},{25,91,259},{18,84,470},{80,1,9669},{0,102,3401},{0,84,366},{0,65,5186},{126,19,9669},{0,65,5186},{12,127,914},{12,127,914},{12,127,914},{10,74,841},{0,112,2178},{0,76,97},{0,76,97},{0,45,650},{0,51,3317},{0,43,1514},{21,119,1},{21,119,1},{21,119,1},{20,69,1},{55,0,2178}, +{0,76,97},{0,76,97},{0,45,650},{112,0,2178},{0,45,650},{106,0,2665},{19,124,0},{36,89,1},{0,86,130},{106,0,2665},{127,44,2665},{0,86,130},{0,71,2665},{127,44,2665},{0,71,2665},{10,0,841},{10,0,841},{10,0,841},{10,0,841},{0,62,0},{0,62,0},{0,62,0},{0,30,1},{0,25,305},{0,25,305},{23,127,7454},{15,127,1431},{17,97,2214},{11,89,1438},{15,127,11102},{0,108,3209},{0,90,198}, +{0,69,4913},{0,81,12639},{0,65,6875},{38,127,3938},{24,127,3},{29,95,259},{22,88,470},{86,1,9669},{0,108,3209},{0,90,198},{0,69,4913},{126,25,9669},{0,69,4913},{15,127,1382},{15,127,1382},{15,127,1382},{12,79,1201},{0,124,2178},{0,84,37},{0,84,37},{0,50,549},{0,54,3565},{0,46,1598},{25,123,1},{25,123,1},{25,123,1},{24,73,1},{61,0,2178},{0,84,37},{0,84,37},{0,50,549},{124,0,2178}, +{0,50,549},{112,0,2665},{24,127,2},{40,93,1},{0,91,89},{112,0,2665},{127,50,2665},{0,91,89},{0,75,2665},{127,50,2665},{0,75,2665},{12,0,1201},{12,0,1201},{12,0,1201},{12,0,1201},{0,74,0},{0,74,0},{0,74,0},{0,36,1},{0,28,445},{0,28,445},{26,127,8674},{18,127,2131},{19,102,2786},{13,93,1839},{17,127,11833},{0,113,3038},{0,95,86},{0,72,4685},{0,84,13079},{0,70,6909},{41,127,4130}, +{30,127,35},{33,99,259},{26,92,470},{92,1,9669},{0,113,3038},{0,95,86},{0,72,4685},{126,31,9669},{0,72,4685},{17,127,1941},{17,127,1941},{17,127,1941},{14,84,1625},{3,127,2222},{0,90,5},{0,90,5},{0,56,445},{0,60,3861},{0,51,1674},{29,127,1},{29,127,1},{29,127,1},{28,77,1},{66,1,2178},{0,90,5},{0,90,5},{0,56,445},{126,5,2178},{0,56,445},{118,0,2665},{31,127,20},{44,97,1}, +{0,95,50},{118,0,2665},{127,56,2665},{0,95,50},{0,79,2665},{127,56,2665},{0,79,2665},{14,0,1625},{14,0,1625},{14,0,1625},{14,0,1625},{0,86,0},{0,86,0},{0,86,0},{0,42,1},{0,34,605},{0,34,605},{32,127,10209},{21,127,3140},{22,108,3525},{15,98,2360},{20,127,12902},{0,122,2885},{0,101,21},{0,78,4450},{0,93,13598},{0,73,6982},{47,127,4373},{34,127,134},{38,104,260},{30,96,469},{99,0,9669}, +{0,122,2885},{0,101,21},{0,78,4450},{126,38,9669},{0,78,4450},{20,127,2717},{20,127,2717},{20,127,2717},{16,90,2180},{6,127,2420},{0,98,1},{0,98,1},{0,62,353},{0,64,4230},{0,57,1814},{34,126,13},{34,126,13},{34,126,13},{33,81,1},{73,0,2178},{2,96,1},{2,96,1},{0,62,353},{126,12,2178},{0,62,353},{125,0,2665},{40,127,74},{48,102,0},{0,101,20},{125,0,2665},{126,63,2665},{0,101,20}, +{0,84,2665},{126,63,2665},{0,84,2665},{16,0,2180},{16,0,2180},{16,0,2180},{16,0,2180},{0,100,0},{0,100,0},{0,100,0},{0,49,0},{0,40,820},{0,40,820},{35,127,11582},{25,127,4131},{25,111,4166},{17,103,2825},{26,127,13903},{1,126,2826},{1,105,18},{0,83,4290},{0,96,13969},{0,79,6967},{52,127,4577},{40,127,270},{42,108,260},{34,100,469},{105,0,9669},{1,126,2825},{1,105,17},{0,83,4289},{126,44,9669}, +{0,83,4289},{23,127,3434},{23,127,3434},{23,127,3434},{19,94,2666},{9,127,2709},{1,105,14},{1,105,14},{0,66,275},{0,70,4491},{0,60,1893},{38,127,29},{38,127,29},{38,127,29},{37,85,1},{79,0,2178},{6,100,1},{6,100,1},{0,66,274},{127,17,2178},{0,66,274},{127,7,2665},{46,127,146},{52,106,0},{0,105,8},{127,7,2665},{127,68,2665},{0,105,8},{0,88,2665},{127,68,2665},{0,88,2665},{19,0,2665}, +{19,0,2665},{19,0,2665},{19,0,2665},{1,110,1},{1,110,1},{1,110,1},{0,55,1},{0,43,985},{0,43,985},{38,127,12090},{30,127,4561},{29,115,4166},{21,107,2825},{29,127,14311},{5,127,2910},{5,109,18},{0,86,4166},{0,105,13477},{0,84,6285},{58,127,4833},{46,127,470},{46,112,260},{38,104,469},{111,0,9669},{5,127,2909},{5,109,17},{0,86,4085},{127,49,9669},{0,86,4085},{26,127,3590},{26,127,3590},{26,127,3590}, +{23,98,2666},{12,127,2853},{5,109,14},{5,109,14},{3,69,259},{0,76,4147},{0,64,1475},{44,127,61},{44,127,61},{44,127,61},{41,89,1},{85,0,2178},{10,104,1},{10,104,1},{0,69,202},{127,23,2178},{0,69,202},{127,19,2665},{54,127,260},{56,110,0},{0,110,0},{127,19,2665},{127,74,2665},{0,110,0},{0,92,2665},{127,74,2665},{0,92,2665},{23,0,2665},{23,0,2665},{23,0,2665},{23,0,2665},{5,114,1}, +{5,114,1},{5,114,1},{4,59,1},{0,51,745},{0,51,745},{44,127,12610},{34,127,5039},{33,119,4166},{25,111,2825},{35,127,14719},{11,127,3118},{9,113,18},{4,90,4166},{0,113,13003},{0,87,5661},{61,127,5093},{51,127,736},{50,116,260},{42,108,469},{117,0,9669},{14,127,3073},{9,113,17},{0,89,3929},{127,55,9669},{0,89,3929},{32,127,3726},{32,127,3726},{32,127,3726},{27,102,2666},{17,127,2979},{9,113,14},{9,113,14}, +{7,73,259},{0,84,3784},{0,70,1091},{47,127,97},{47,127,97},{47,127,97},{45,93,1},{91,0,2178},{14,108,1},{14,108,1},{0,75,146},{127,29,2178},{0,75,146},{127,31,2665},{60,127,388},{60,114,0},{3,114,0},{127,31,2665},{127,80,2665},{3,114,0},{0,96,2665},{127,80,2665},{0,96,2665},{27,0,2665},{27,0,2665},{27,0,2665},{27,0,2665},{9,118,1},{9,118,1},{9,118,1},{8,63,1},{0,60,565}, +{0,60,565},{49,127,13154},{40,127,5661},{37,123,4166},{30,116,2823},{41,127,15213},{16,127,3497},{14,118,18},{8,94,4166},{0,116,12489},{0,93,5039},{68,127,5409},{57,127,1091},{54,120,259},{47,113,470},{124,0,9669},{22,127,3341},{14,118,14},{0,95,3726},{127,62,9669},{0,95,3726},{38,127,3929},{38,127,3929},{38,127,3929},{31,107,2665},{23,127,3156},{13,117,17},{13,117,17},{11,77,260},{0,90,3467},{0,76,736},{52,127,146}, +{52,127,146},{52,127,146},{49,98,1},{98,0,2178},{19,112,1},{19,112,1},{0,80,97},{127,36,2178},{0,80,97},{127,45,2665},{67,127,565},{64,119,1},{9,118,1},{127,45,2665},{126,87,2665},{9,118,1},{0,100,2665},{126,87,2665},{0,100,2665},{31,0,2665},{31,0,2665},{31,0,2665},{31,0,2665},{13,123,0},{13,123,0},{13,123,0},{13,67,0},{0,67,388},{0,67,388},{52,127,13734},{43,127,6285},{41,127,4166}, +{34,120,2823},{47,127,15677},{22,127,3905},{18,122,18},{12,98,4166},{0,125,12093},{0,97,4561},{71,127,5701},{60,127,1475},{58,124,259},{51,117,470},{127,5,9669},{31,127,3601},{18,122,14},{0,101,3590},{126,68,9669},{0,101,3590},{41,127,4085},{41,127,4085},{41,127,4085},{35,111,2665},{29,127,3332},{17,121,17},{17,121,17},{15,81,260},{0,99,3211},{0,81,470},{58,127,202},{58,127,202},{58,127,202},{53,102,1},{104,0,2178}, +{23,116,1},{23,116,1},{0,83,61},{127,42,2178},{0,83,61},{127,57,2665},{76,127,745},{68,123,1},{13,122,1},{127,57,2665},{126,93,2665},{13,122,1},{0,104,2665},{126,93,2665},{0,104,2665},{35,0,2665},{35,0,2665},{35,0,2665},{35,0,2665},{17,127,0},{17,127,0},{17,127,0},{17,71,0},{0,73,260},{0,73,260},{58,127,14302},{48,127,6967},{44,127,4290},{38,124,2823},{52,127,16094},{28,127,4409},{22,126,18}, +{16,102,4166},{0,126,11883},{0,102,4131},{77,127,6005},{67,127,1893},{61,127,275},{55,121,470},{127,18,9669},{40,127,3909},{22,126,14},{0,104,3434},{126,74,9669},{0,104,3434},{44,127,4289},{44,127,4289},{44,127,4289},{39,115,2665},{35,127,3540},{21,125,17},{21,125,17},{19,85,260},{0,105,2979},{0,87,270},{61,127,274},{61,127,274},{61,127,274},{57,106,1},{110,0,2178},{27,120,1},{27,120,1},{0,89,29},{126,48,2178}, +{0,89,29},{127,69,2665},{81,127,985},{72,127,1},{17,126,1},{127,69,2665},{126,99,2665},{17,126,1},{0,108,2665},{126,99,2665},{0,108,2665},{39,0,2665},{39,0,2665},{39,0,2665},{39,0,2665},{22,126,8},{22,126,8},{22,126,8},{21,75,0},{0,81,146},{0,81,146},{61,127,13635},{53,127,6982},{49,127,4450},{42,125,2742},{55,127,15195},{34,127,4106},{26,127,21},{19,105,3525},{2,127,10776},{0,106,3140},{79,127,5396}, +{70,127,1814},{65,127,353},{59,122,321},{127,27,8712},{46,127,3462},{29,127,1},{0,107,2717},{126,78,8712},{0,107,2717},{49,127,4450},{49,127,4450},{49,127,4450},{43,119,2665},{38,127,3736},{26,127,21},{26,127,21},{23,89,260},{0,113,2772},{0,93,134},{65,127,353},{65,127,353},{65,127,353},{61,110,1},{115,1,2178},{31,124,1},{31,124,1},{0,93,13},{126,54,2178},{0,93,13},{127,76,2178},{87,127,820},{78,127,0}, +{27,127,0},{127,76,2178},{126,103,2178},{27,127,0},{0,110,2180},{126,103,2178},{0,110,2180},{43,0,2665},{43,0,2665},{43,0,2665},{43,0,2665},{26,127,20},{26,127,20},{26,127,20},{25,79,0},{0,87,74},{0,87,74},{65,127,12750},{57,127,6909},{55,127,4685},{48,126,2678},{61,127,14070},{37,127,3711},{32,127,86},{25,108,2786},{5,127,9739},{0,109,2131},{85,127,4658},{76,127,1674},{71,127,445},{64,123,173},{127,36,7578}, +{51,127,2949},{37,127,5},{0,110,1941},{127,82,7578},{0,110,1941},{55,127,4685},{55,127,4685},{55,127,4685},{48,123,2666},{44,127,3987},{32,127,86},{32,127,86},{28,94,259},{0,119,2571},{0,97,35},{71,127,445},{71,127,445},{71,127,445},{66,114,1},{122,0,2178},{37,127,5},{37,127,5},{0,98,1},{126,61,2178},{0,98,1},{127,83,1625},{93,127,605},{84,127,1},{40,127,0},{127,83,1625},{126,106,1625},{40,127,0}, +{0,113,1625},{126,106,1625},{0,113,1625},{48,0,2665},{48,0,2665},{48,0,2665},{48,0,2665},{32,127,50},{32,127,50},{32,127,50},{30,83,1},{0,96,20},{0,96,20},{68,127,12050},{62,127,6875},{58,127,4913},{52,127,2666},{65,127,13165},{43,127,3423},{37,127,198},{30,110,2214},{11,127,8987},{0,112,1431},{88,127,4082},{79,127,1547},{77,127,549},{68,124,81},{127,43,6661},{57,127,2525},{43,127,37},{0,112,1382},{127,86,6661}, +{0,112,1382},{58,127,4913},{58,127,4913},{58,127,4913},{52,127,2666},{49,127,4197},{37,127,198},{37,127,198},{32,98,259},{0,125,2435},{0,103,3},{77,127,549},{77,127,549},{77,127,549},{70,118,1},{127,2,2178},{43,127,37},{43,127,37},{3,102,1},{127,66,2178},{3,102,1},{127,89,1201},{99,127,445},{90,127,1},{53,127,0},{127,89,1201},{125,109,1201},{53,127,0},{0,115,1201},{125,109,1201},{0,115,1201},{52,0,2665}, +{52,0,2665},{52,0,2665},{52,0,2665},{36,127,89},{36,127,89},{36,127,89},{34,87,1},{0,103,2},{0,103,2},{74,127,11418},{65,127,6870},{62,127,5186},{56,127,2701},{68,127,12313},{46,127,3251},{43,127,366},{34,112,1695},{14,127,8383},{0,115,915},{91,127,3578},{84,127,1514},{79,127,650},{73,126,21},{127,53,5829},{63,127,2165},{51,127,97},{0,115,914},{126,91,5829},{0,115,914},{62,127,5186},{62,127,5186},{62,127,5186}, +{56,127,2701},{55,127,4461},{43,127,366},{43,127,366},{36,102,259},{2,127,2427},{4,107,3},{79,127,650},{79,127,650},{79,127,650},{74,122,1},{127,14,2178},{51,127,97},{51,127,97},{7,106,1},{127,72,2178},{7,106,1},{127,95,841},{102,127,305},{96,127,1},{64,127,0},{127,95,841},{127,111,841},{64,127,0},{0,117,841},{127,111,841},{0,117,841},{56,0,2665},{56,0,2665},{56,0,2665},{56,0,2665},{41,127,130}, +{41,127,130},{41,127,130},{38,91,1},{3,108,0},{3,108,0},{77,127,10830},{69,127,6894},{68,127,5393},{60,127,2786},{71,127,11565},{54,127,3154},{48,127,594},{37,115,1267},{25,127,7825},{3,118,575},{94,127,3146},{87,127,1478},{85,127,754},{77,127,1},{127,60,5082},{70,127,1869},{57,127,185},{0,118,558},{127,94,5082},{0,118,558},{68,127,5393},{68,127,5393},{68,127,5393},{60,127,2786},{58,127,4725},{48,127,594},{48,127,594}, +{40,106,259},{8,127,2587},{8,111,3},{85,127,754},{85,127,754},{85,127,754},{78,126,1},{127,27,2178},{57,127,185},{57,127,185},{11,110,1},{126,78,2178},{11,110,1},{127,101,545},{108,127,193},{102,127,1},{76,127,0},{127,101,545},{127,114,545},{76,127,0},{0,119,545},{127,114,545},{0,119,545},{60,0,2665},{60,0,2665},{60,0,2665},{60,0,2665},{45,127,193},{45,127,193},{45,127,193},{42,95,1},{7,112,0}, +{7,112,0},{79,127,10221},{74,127,6939},{71,127,5686},{64,127,2954},{77,127,10836},{57,127,3109},{54,127,913},{42,117,880},{34,127,7300},{8,120,304},{100,127,2736},{93,127,1452},{91,127,900},{83,127,29},{127,69,4344},{76,127,1611},{67,127,306},{2,121,288},{126,99,4344},{2,121,288},{71,127,5686},{71,127,5686},{71,127,5686},{64,127,2954},{65,127,5051},{54,127,913},{54,127,913},{44,110,260},{14,127,2856},{13,115,2},{91,127,900}, +{91,127,900},{91,127,900},{83,127,29},{127,40,2178},{67,127,306},{67,127,306},{15,115,0},{126,85,2178},{15,115,0},{127,108,288},{113,127,106},{109,127,0},{90,127,0},{127,108,288},{127,118,288},{90,127,0},{0,121,288},{127,118,288},{0,121,288},{64,0,2665},{64,0,2665},{64,0,2665},{64,0,2665},{50,127,260},{50,127,260},{50,127,260},{46,100,0},{11,117,0},{11,117,0},{85,127,9781},{79,127,6942},{77,127,5950}, +{70,127,3146},{79,127,10205},{63,127,3141},{57,127,1265},{47,119,616},{40,127,6924},{13,123,130},{103,127,2436},{97,127,1460},{94,127,1040},{87,127,104},{127,76,3779},{81,127,1496},{73,127,442},{10,123,128},{126,103,3779},{10,123,128},{77,127,5950},{77,127,5950},{77,127,5950},{70,127,3146},{68,127,5347},{57,127,1265},{57,127,1265},{48,114,260},{25,127,3115},{17,119,2},{94,127,1040},{94,127,1040},{94,127,1040},{87,127,104},{127,53,2178}, +{73,127,442},{73,127,442},{19,119,0},{126,91,2178},{19,119,0},{127,115,128},{116,127,50},{115,127,0},{102,127,0},{127,115,128},{127,121,128},{102,127,0},{0,123,128},{127,121,128},{0,123,128},{68,0,2665},{68,0,2665},{68,0,2665},{68,0,2665},{55,127,325},{55,127,325},{55,127,325},{50,104,0},{15,121,0},{15,121,0},{88,127,9417},{82,127,7109},{82,127,6209},{73,127,3406},{85,127,9733},{67,127,3260},{63,127,1649}, +{50,122,424},{46,127,6644},{19,125,32},{106,127,2208},{101,127,1502},{100,127,1184},{93,127,232},{127,86,3299},{87,127,1400},{81,127,628},{19,125,32},{127,107,3299},{19,125,32},{82,127,6209},{82,127,6209},{82,127,6209},{73,127,3406},{74,127,5659},{63,127,1649},{63,127,1649},{52,118,260},{34,127,3419},{21,123,2},{100,127,1184},{100,127,1184},{100,127,1184},{93,127,232},{127,64,2178},{81,127,628},{81,127,628},{23,123,0},{126,97,2178}, +{23,123,0},{127,121,32},{122,127,10},{121,127,0},{115,127,0},{127,121,32},{127,124,32},{115,127,0},{0,125,32},{127,124,32},{0,125,32},{72,0,2665},{72,0,2665},{72,0,2665},{72,0,2665},{61,127,421},{61,127,421},{61,127,421},{54,108,0},{19,125,0},{19,125,0},{91,127,9133},{88,127,7245},{85,127,6485},{79,127,3710},{88,127,9325},{73,127,3460},{67,127,2107},{55,124,304},{54,127,6532},{25,127,2},{111,127,2038}, +{106,127,1556},{103,127,1348},{96,127,416},{127,93,2904},{93,127,1368},{87,127,820},{27,127,0},{126,111,2904},{27,127,0},{85,127,6485},{85,127,6485},{85,127,6485},{79,127,3710},{79,127,5949},{67,127,2107},{67,127,2107},{56,122,260},{40,127,3771},{25,127,2},{103,127,1348},{103,127,1348},{103,127,1348},{96,127,416},{127,76,2178},{87,127,820},{87,127,820},{27,127,0},{126,103,2178},{27,127,0},{127,127,0},{127,127,0},{127,127,0}, +{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{76,0,2665},{76,0,2665},{76,0,2665},{76,0,2665},{65,127,514},{65,127,514},{65,127,514},{58,112,0},{25,127,2},{25,127,2},{94,127,8049},{91,127,6469},{88,127,5849},{84,127,3561},{91,127,8053},{76,127,3106},{73,127,1965},{62,125,154},{60,127,5562},{34,127,32},{111,127,1507},{109,127,1161},{106,127,1009},{102,127,305},{127,98,2166}, +{99,127,1009},{93,127,605},{40,127,0},{126,113,2166},{40,127,0},{88,127,5849},{88,127,5849},{88,127,5849},{84,127,3561},{82,127,5209},{73,127,1965},{73,127,1965},{61,124,126},{46,127,3225},{34,127,32},{106,127,1009},{106,127,1009},{106,127,1009},{102,127,305},{127,83,1625},{93,127,605},{93,127,605},{40,127,0},{126,106,1625},{40,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0}, +{0,127,0},{127,127,0},{0,127,0},{80,0,2665},{80,0,2665},{80,0,2665},{80,0,2665},{68,127,628},{68,127,628},{68,127,628},{63,116,1},{34,127,32},{34,127,32},{97,127,7165},{94,127,5845},{91,127,5333},{87,127,3401},{94,127,7033},{79,127,2823},{79,127,1862},{64,126,60},{64,127,4795},{40,127,80},{114,127,1107},{111,127,830},{111,127,730},{105,127,221},{127,102,1601},{102,127,737},{99,127,445},{53,127,0},{127,115,1601}, +{53,127,0},{91,127,5333},{91,127,5333},{91,127,5333},{87,127,3401},{85,127,4629},{79,127,1862},{79,127,1862},{66,125,52},{54,127,2834},{40,127,80},{111,127,730},{111,127,730},{111,127,730},{105,127,221},{127,89,1201},{99,127,445},{99,127,445},{53,127,0},{125,109,1201},{53,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{84,0,2665}, +{84,0,2665},{84,0,2665},{84,0,2665},{74,127,740},{74,127,740},{74,127,740},{66,120,0},{40,127,80},{40,127,80},{100,127,6361},{97,127,5277},{94,127,4865},{90,127,3265},{97,127,6117},{84,127,2641},{79,127,1814},{70,126,12},{70,127,4123},{46,127,160},{117,127,779},{114,127,595},{114,127,514},{108,127,153},{127,105,1121},{105,127,513},{102,127,305},{64,127,0},{126,117,1121},{64,127,0},{94,127,4865},{94,127,4865},{94,127,4865}, +{90,127,3265},{91,127,4117},{79,127,1814},{79,127,1814},{70,126,8},{60,127,2474},{46,127,160},{114,127,514},{114,127,514},{114,127,514},{108,127,153},{127,95,841},{102,127,305},{102,127,305},{64,127,0},{127,111,841},{64,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{88,0,2665},{88,0,2665},{88,0,2665},{88,0,2665},{79,127,853}, +{79,127,853},{79,127,853},{70,124,0},{46,127,160},{46,127,160},{103,127,5637},{100,127,4765},{100,127,4441},{93,127,3153},{100,127,5305},{90,127,2465},{86,127,1789},{74,127,4},{73,127,3543},{54,127,274},{117,127,507},{117,127,387},{115,127,337},{111,127,101},{127,110,726},{108,127,337},{108,127,193},{76,127,0},{126,119,726},{76,127,0},{100,127,4441},{100,127,4441},{100,127,4441},{93,127,3153},{94,127,3657},{86,127,1789},{86,127,1789}, +{74,127,4},{67,127,2182},{54,127,274},{115,127,337},{115,127,337},{115,127,337},{111,127,101},{127,101,545},{108,127,193},{108,127,193},{76,127,0},{127,114,545},{76,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{92,0,2665},{92,0,2665},{92,0,2665},{92,0,2665},{82,127,985},{82,127,985},{82,127,985},{74,127,4},{54,127,274}, +{54,127,274},{17,127,39416},{1,127,2073},{0,90,164},{0,86,5261},{17,127,49709},{0,113,21212},{0,85,8480},{0,75,26137},{0,87,56335},{0,67,37225},{12,127,10274},{0,122,1413},{0,90,148},{0,75,3940},{57,0,18065},{0,76,12036},{0,68,6166},{0,45,14098},{117,0,18065},{0,45,14098},{0,71,0},{0,71,0},{0,71,0},{0,35,0},{0,35,1105},{0,28,405},{0,28,405},{0,15,689},{0,14,1226},{0,15,789},{0,71,0}, +{0,71,0},{0,71,0},{0,35,0},{17,0,1105},{0,28,405},{0,28,405},{0,15,689},{35,0,1105},{0,15,689},{85,0,9248},{0,122,1413},{0,90,148},{0,75,3940},{85,0,9248},{127,23,9248},{0,75,3940},{0,57,9250},{127,23,9248},{0,57,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{20,127,44736},{2,127,2677},{0,95,64}, +{0,92,4941},{17,127,55213},{0,119,21820},{0,89,8426},{0,78,27209},{0,90,60583},{0,73,39465},{15,127,10870},{0,125,1213},{0,93,52},{0,78,3656},{61,0,19334},{0,81,12395},{0,73,6176},{0,50,14795},{124,0,19334},{0,50,14795},{0,83,0},{0,83,0},{0,83,0},{0,41,0},{0,41,1513},{0,34,565},{0,34,565},{0,18,937},{0,19,1661},{0,18,1081},{0,83,0},{0,83,0},{0,83,0},{0,41,0},{20,0,1513}, +{0,34,565},{0,34,565},{0,18,937},{41,0,1513},{0,18,937},{91,0,9248},{0,125,1213},{0,93,52},{0,78,3656},{91,0,9248},{127,29,9248},{0,78,3656},{0,61,9250},{127,29,9248},{0,61,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{20,127,50624},{2,127,4005},{0,99,4},{0,95,4545},{20,127,61345},{0,125,22460},{0,93,8410}, +{0,83,28480},{0,96,65039},{0,76,41789},{17,127,11556},{1,127,1217},{0,99,4},{0,83,3425},{64,0,20689},{0,87,12835},{0,76,6216},{0,53,15539},{126,3,20689},{0,53,15539},{0,95,0},{0,95,0},{0,95,0},{0,47,0},{0,47,1985},{0,37,745},{0,37,745},{0,21,1225},{0,22,2185},{0,21,1421},{0,95,0},{0,95,0},{0,95,0},{0,47,0},{23,0,1985},{0,37,745},{0,37,745},{0,21,1225},{47,0,1985}, +{0,21,1225},{97,0,9248},{2,127,1205},{0,99,4},{0,83,3425},{97,0,9248},{127,35,9248},{0,83,3425},{0,65,9248},{127,35,9248},{0,65,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{23,127,56952},{5,127,6081},{0,103,9},{0,98,4221},{20,127,65535},{0,126,23535},{0,97,8416},{0,86,29640},{0,99,65535},{0,79,44233},{20,127,12416}, +{2,127,1397},{1,103,8},{0,86,3181},{69,0,22129},{0,90,13307},{0,81,6266},{0,56,16331},{127,7,22129},{0,56,16331},{0,107,0},{0,107,0},{0,107,0},{0,53,0},{0,53,2521},{0,43,953},{0,43,953},{0,24,1553},{0,22,2777},{0,24,1809},{0,107,0},{0,107,0},{0,107,0},{0,53,0},{26,0,2521},{0,43,953},{0,43,953},{0,24,1553},{53,0,2521},{0,24,1553},{103,0,9248},{2,127,1381},{2,103,0}, +{0,86,3181},{103,0,9248},{127,41,9248},{0,86,3181},{0,69,9248},{127,41,9248},{0,69,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{26,127,64790},{5,127,9105},{1,108,78},{0,104,3845},{23,127,65535},{2,127,25370},{0,102,8458},{0,89,31046},{0,105,65535},{0,81,47079},{23,127,13542},{5,127,1881},{2,109,50},{0,92,2897},{73,0,23851}, +{0,96,13865},{0,87,6374},{0,59,17289},{126,12,23851},{0,59,17289},{0,121,0},{0,121,0},{0,121,0},{0,59,1},{0,61,3200},{0,51,1210},{0,51,1210},{0,27,1972},{0,25,3528},{0,27,2296},{0,121,0},{0,121,0},{0,121,0},{0,59,1},{30,0,3200},{0,51,1210},{0,51,1210},{0,27,1972},{61,0,3200},{0,27,1972},{110,0,9248},{11,127,1693},{7,107,1},{0,92,2897},{110,0,9248},{126,48,9248},{0,92,2897}, +{0,73,9250},{126,48,9248},{0,73,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{26,127,65535},{5,127,12609},{1,111,198},{0,107,3541},{26,127,65535},{2,127,27706},{0,105,8522},{0,92,32390},{0,113,65535},{0,87,49743},{26,127,14690},{8,127,2501},{3,113,126},{0,98,2665},{77,0,25472},{0,102,14385},{0,90,6486},{0,62,18185},{127,15,25472}, +{0,62,18185},{0,127,16},{0,127,16},{0,127,16},{0,65,0},{0,66,3872},{0,51,1450},{0,51,1450},{0,30,2384},{0,28,4268},{0,27,2776},{1,127,13},{1,127,13},{1,127,13},{0,65,0},{33,0,3872},{0,51,1450},{0,51,1450},{0,30,2384},{66,0,3872},{0,30,2384},{115,1,9248},{19,127,2041},{11,111,1},{0,98,2665},{115,1,9248},{126,54,9248},{0,98,2665},{0,77,9250},{126,54,9248},{0,77,9250},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{29,127,65535},{8,127,16605},{1,116,349},{0,112,3274},{26,127,65535},{2,127,30470},{0,109,8346},{0,98,33226},{0,113,65535},{0,90,52035},{29,127,15746},{11,127,3213},{5,117,217},{0,101,2445},{81,0,26744},{0,108,14657},{0,96,6398},{0,66,18739},{126,20,26744},{0,66,18739},{3,127,116},{3,127,116},{3,127,116}, +{0,71,4},{0,74,4418},{0,57,1586},{0,57,1586},{0,33,2664},{0,31,4916},{0,30,3140},{3,127,80},{3,127,80},{3,127,80},{1,70,1},{36,1,4418},{0,57,1586},{0,57,1586},{0,33,2664},{74,0,4418},{0,33,2664},{121,1,9248},{25,127,2377},{15,115,1},{0,101,2441},{121,1,9248},{126,60,9248},{0,101,2441},{0,81,9250},{126,60,9248},{0,81,9250},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,3,0}, +{0,3,0},{0,3,0},{0,1,1},{1,0,2},{1,0,2},{32,127,65535},{11,127,21205},{2,120,605},{0,115,3106},{29,127,65535},{2,127,33062},{0,114,7330},{0,101,32522},{0,119,65535},{0,93,52995},{35,127,16210},{14,127,3809},{9,121,217},{0,107,2325},{87,0,26744},{0,116,14054},{0,99,5606},{0,72,18275},{126,26,26744},{0,72,18275},{6,127,292},{6,127,292},{6,127,292},{2,76,52},{0,86,4418},{0,64,1313},{0,64,1313}, +{0,39,2440},{0,37,5092},{0,36,3044},{9,127,128},{9,127,128},{9,127,128},{5,74,1},{42,1,4418},{0,64,1313},{0,64,1313},{0,39,2440},{86,0,4418},{0,39,2440},{127,1,9248},{34,127,2741},{19,119,1},{0,107,2225},{127,1,9248},{127,65,9248},{0,107,2225},{0,85,9250},{127,65,9248},{0,85,9250},{2,0,52},{2,0,52},{2,0,52},{2,0,52},{0,15,0},{0,15,0},{0,15,0},{0,7,1},{0,5,18}, +{0,5,18},{35,127,65535},{11,127,27154},{3,124,1078},{0,121,3041},{32,127,65535},{5,127,36765},{0,119,6285},{0,107,31809},{0,125,65535},{0,96,54246},{38,127,16729},{22,127,4594},{14,126,218},{4,111,2318},{94,0,26744},{0,122,13481},{0,105,4785},{0,75,17772},{127,32,26744},{0,75,17772},{9,127,614},{9,127,614},{9,127,614},{5,81,181},{0,100,4418},{0,73,1037},{0,73,1037},{0,42,2210},{0,43,5330},{0,41,2986},{13,127,193}, +{13,127,193},{13,127,193},{9,79,1},{49,0,4418},{0,73,1037},{0,73,1037},{0,42,2210},{100,0,4418},{0,42,2210},{127,14,9248},{40,127,3177},{23,124,0},{0,110,2009},{127,14,9248},{127,72,9248},{0,110,2009},{0,90,9248},{127,72,9248},{0,90,9248},{5,0,181},{5,0,181},{5,0,181},{5,0,181},{0,29,0},{0,29,0},{0,29,0},{0,14,0},{0,11,65},{0,11,65},{35,127,65535},{14,127,31662},{4,127,1705}, +{0,124,3025},{35,127,65535},{8,127,39325},{0,122,5245},{0,110,30421},{0,125,65535},{0,102,54322},{44,127,16749},{25,127,5034},{17,127,245},{7,114,2214},{99,0,26259},{0,125,12725},{0,111,3981},{0,78,16984},{126,38,26259},{0,78,16984},{10,127,1025},{10,127,1025},{10,127,1025},{7,86,365},{0,112,4418},{0,81,797},{0,81,797},{0,47,2025},{0,51,5557},{0,45,2950},{17,127,245},{17,127,245},{17,127,245},{13,83,1},{55,0,4418}, +{0,81,797},{0,81,797},{0,47,2025},{112,0,4418},{0,47,2025},{127,25,8978},{46,127,3385},{28,127,0},{0,115,1732},{127,25,8978},{127,77,8978},{0,115,1732},{0,93,8980},{127,77,8978},{0,93,8980},{7,0,365},{7,0,365},{7,0,365},{7,0,365},{0,41,0},{0,41,0},{0,41,0},{0,20,0},{0,17,137},{0,17,137},{38,127,65535},{14,127,32078},{6,127,2618},{1,125,2789},{35,127,65535},{8,127,37485},{0,123,3805}, +{0,110,27013},{0,125,65535},{0,102,51330},{49,127,15435},{31,127,4714},{23,127,317},{12,116,1830},{104,0,24371},{0,125,11205},{0,113,2881},{0,83,15117},{127,42,24371},{0,83,15117},{12,127,1538},{12,127,1538},{12,127,1538},{9,91,613},{0,124,4418},{0,87,605},{0,87,605},{0,53,1825},{0,54,5805},{0,49,2946},{23,127,317},{23,127,317},{23,127,317},{17,87,1},{61,0,4418},{0,87,605},{0,87,605},{0,53,1825},{124,0,4418}, +{0,53,1825},{127,31,7938},{51,127,3029},{34,127,0},{0,118,1224},{127,31,7938},{127,80,7938},{0,118,1224},{0,95,7940},{127,80,7938},{0,95,7940},{9,0,613},{9,0,613},{9,0,613},{9,0,613},{0,53,0},{0,53,0},{0,53,0},{0,26,0},{0,22,221},{0,22,221},{38,127,65535},{14,127,32750},{6,127,3706},{3,124,2753},{35,127,65535},{8,127,35901},{0,124,2601},{0,110,23861},{0,125,65535},{0,102,48594},{52,127,14211}, +{34,127,4410},{26,127,405},{16,117,1482},{107,1,22568},{2,127,9869},{0,116,1973},{0,86,13349},{126,46,22568},{0,86,13349},{17,127,2137},{17,127,2137},{17,127,2137},{11,96,925},{3,127,4462},{0,93,445},{0,93,445},{0,56,1649},{0,60,6101},{0,54,2966},{26,127,405},{26,127,405},{26,127,405},{21,91,1},{66,1,4418},{0,93,445},{0,93,445},{0,56,1649},{126,5,4418},{0,56,1649},{127,37,6962},{57,127,2645},{40,127,0}, +{0,118,808},{127,37,6962},{127,83,6962},{0,118,808},{0,97,6964},{127,83,6962},{0,97,6964},{11,0,925},{11,0,925},{11,0,925},{11,0,925},{0,65,0},{0,65,0},{0,65,0},{0,32,0},{0,25,337},{0,25,337},{38,127,65535},{14,127,33812},{7,127,5233},{4,125,2961},{35,127,65535},{8,127,34425},{0,125,1509},{0,112,20542},{0,125,65535},{0,105,45810},{55,127,12917},{40,127,4114},{32,127,505},{22,117,1140},{112,0,20642}, +{2,127,8609},{0,119,1157},{0,89,11489},{127,50,20642},{0,89,11489},{20,127,2969},{20,127,2969},{20,127,2969},{13,102,1352},{6,127,4660},{0,102,289},{0,102,289},{0,62,1445},{0,64,6470},{0,57,3018},{32,127,505},{32,127,505},{32,127,505},{26,95,1},{73,0,4418},{0,102,289},{0,102,289},{0,62,1445},{126,12,4418},{0,62,1445},{127,43,5941},{63,127,2248},{46,127,1},{0,121,433},{127,43,5941},{127,86,5941},{0,121,433}, +{0,100,5941},{127,86,5941},{0,100,5941},{13,0,1352},{13,0,1352},{13,0,1352},{13,0,1352},{0,78,0},{0,78,0},{0,78,0},{0,39,0},{0,31,500},{0,31,500},{38,127,65535},{19,127,34934},{9,127,6748},{5,126,3381},{38,127,65535},{11,127,33369},{0,125,789},{0,112,17822},{0,125,65535},{0,105,43458},{58,127,11849},{43,127,3870},{38,127,617},{27,119,868},{115,1,19021},{5,127,7741},{0,120,621},{0,92,9957},{126,54,19021}, +{0,92,9957},{23,127,3833},{23,127,3833},{23,127,3833},{15,107,1800},{9,127,4984},{0,108,185},{0,108,185},{0,66,1282},{0,70,6822},{0,63,3090},{38,127,617},{38,127,617},{38,127,617},{30,99,1},{79,0,4418},{0,108,185},{0,108,185},{0,66,1282},{127,17,4418},{0,66,1282},{127,50,5101},{67,127,1921},{52,127,0},{0,124,205},{127,50,5101},{127,89,5101},{0,124,205},{0,102,5101},{127,89,5101},{0,102,5101},{15,0,1800}, +{15,0,1800},{15,0,1800},{15,0,1800},{0,91,0},{0,91,0},{0,91,0},{0,45,0},{0,37,676},{0,37,676},{41,127,65535},{19,127,36134},{9,127,8476},{5,126,4005},{38,127,65535},{11,127,32489},{0,126,309},{0,115,15210},{0,125,65535},{0,105,41362},{61,127,10853},{46,127,3674},{41,127,725},{31,120,632},{120,0,17485},{11,127,6965},{0,123,249},{0,95,8537},{127,58,17485},{0,95,8537},{23,127,4809},{23,127,4809},{23,127,4809}, +{17,112,2312},{12,127,5444},{0,116,89},{0,116,89},{0,72,1130},{0,76,7206},{0,67,3194},{41,127,725},{41,127,725},{41,127,725},{34,103,1},{85,0,4418},{0,116,89},{0,116,89},{0,72,1130},{127,23,4418},{0,72,1130},{127,56,4325},{70,127,1625},{58,127,0},{0,124,61},{127,56,4325},{127,92,4325},{0,124,61},{0,104,4325},{127,92,4325},{0,104,4325},{17,0,2312},{17,0,2312},{17,0,2312},{17,0,2312},{0,103,0}, +{0,103,0},{0,103,0},{0,50,1},{0,40,872},{0,40,872},{41,127,65535},{19,127,37590},{9,127,10460},{6,127,4841},{38,127,65535},{11,127,31865},{0,127,65},{0,115,12842},{0,125,65535},{0,105,39522},{65,127,9918},{51,127,3500},{47,127,853},{35,121,436},{124,0,16034},{14,127,6273},{0,125,53},{0,98,7229},{127,62,16034},{0,98,7229},{26,127,5881},{26,127,5881},{26,127,5881},{19,117,2888},{15,127,6040},{0,125,37},{0,125,37}, +{0,75,986},{0,81,7565},{0,70,3318},{47,127,853},{47,127,853},{47,127,853},{38,107,1},{91,0,4418},{0,125,37},{0,125,37},{0,75,986},{127,29,4418},{0,75,986},{127,62,3613},{76,127,1345},{64,127,0},{0,127,1},{127,62,3613},{127,95,3613},{0,127,1},{0,106,3613},{127,95,3613},{0,106,3613},{19,0,2888},{19,0,2888},{19,0,2888},{19,0,2888},{0,115,0},{0,115,0},{0,115,0},{0,56,1},{0,46,1096}, +{0,46,1096},{41,127,65535},{22,127,39522},{12,127,12842},{7,127,6030},{38,127,65535},{11,127,31469},{0,127,65},{0,118,10460},{0,125,65535},{0,108,37590},{68,127,8954},{57,127,3318},{52,127,986},{40,123,258},{127,2,14504},{22,127,5594},{2,127,37},{0,101,5881},{127,66,14504},{0,101,5881},{29,127,7229},{29,127,7229},{29,127,7229},{21,122,3614},{17,127,6824},{1,127,53},{1,127,53},{0,80,853},{0,87,8059},{0,76,3500},{52,127,986}, +{52,127,986},{52,127,986},{42,112,1},{98,0,4418},{2,127,37},{2,127,37},{0,80,853},{127,36,4418},{0,80,853},{127,69,2888},{81,127,1096},{70,127,1},{11,127,0},{127,69,2888},{126,99,2888},{11,127,0},{0,108,2888},{126,99,2888},{0,108,2888},{21,0,3613},{21,0,3613},{21,0,3613},{21,0,3613},{0,127,1},{0,127,1},{0,127,1},{0,63,0},{0,51,1345},{0,51,1345},{41,127,65535},{22,127,41362},{12,127,15210}, +{8,127,7309},{41,127,65535},{11,127,31389},{1,127,309},{0,118,8476},{0,125,65535},{0,108,36134},{71,127,8174},{60,127,3194},{55,127,1130},{45,123,137},{127,10,13235},{28,127,5018},{11,127,89},{0,101,4809},{126,70,13235},{0,101,4809},{32,127,8537},{32,127,8537},{32,127,8537},{23,127,4326},{20,127,7700},{4,127,249},{4,127,249},{0,86,725},{0,93,8531},{0,81,3674},{55,127,1130},{55,127,1130},{55,127,1130},{46,116,1},{104,0,4418}, +{11,127,89},{11,127,89},{0,86,725},{127,42,4418},{0,86,725},{127,75,2312},{87,127,872},{76,127,1},{24,127,0},{127,75,2312},{126,102,2312},{24,127,0},{0,110,2312},{126,102,2312},{0,110,2312},{23,0,4325},{23,0,4325},{23,0,4325},{23,0,4325},{3,127,61},{3,127,61},{3,127,61},{0,69,0},{0,54,1625},{0,54,1625},{44,127,65535},{22,127,43458},{15,127,17822},{8,127,8829},{41,127,65535},{14,127,31497},{2,127,789}, +{0,118,6748},{0,125,65535},{0,108,34934},{77,127,7454},{64,127,3090},{61,127,1282},{50,125,53},{127,19,12051},{34,127,4506},{16,127,185},{0,104,3833},{127,74,12051},{0,104,3833},{35,127,9957},{35,127,9957},{35,127,9957},{25,127,5150},{23,127,8712},{5,127,621},{5,127,621},{0,89,617},{0,96,9035},{0,84,3870},{61,127,1282},{61,127,1282},{61,127,1282},{50,120,1},{110,0,4418},{16,127,185},{16,127,185},{0,89,617},{126,48,4418}, +{0,89,617},{127,81,1800},{90,127,676},{82,127,0},{36,127,0},{127,81,1800},{126,105,1800},{36,127,0},{0,112,1800},{126,105,1800},{0,112,1800},{25,0,5101},{25,0,5101},{25,0,5101},{25,0,5101},{3,127,205},{3,127,205},{3,127,205},{0,75,0},{0,60,1921},{0,60,1921},{44,127,65535},{22,127,45810},{15,127,20542},{10,127,10546},{41,127,65535},{14,127,31833},{2,127,1509},{0,120,5233},{0,125,65535},{0,113,33812},{79,127,6740}, +{70,127,3018},{65,127,1445},{54,126,9},{127,27,10952},{40,127,4058},{25,127,289},{0,107,2969},{126,78,10952},{0,107,2969},{38,127,11489},{38,127,11489},{38,127,11489},{28,127,6114},{26,127,9860},{8,127,1157},{8,127,1157},{0,95,505},{0,102,9555},{0,87,4114},{65,127,1445},{65,127,1445},{65,127,1445},{54,124,1},{115,1,4418},{25,127,289},{25,127,289},{0,95,505},{126,54,4418},{0,95,505},{127,87,1352},{96,127,500},{88,127,0}, +{48,127,0},{127,87,1352},{126,108,1352},{48,127,0},{0,114,1352},{126,108,1352},{0,114,1352},{27,0,5941},{27,0,5941},{27,0,5941},{27,0,5941},{6,127,433},{6,127,433},{6,127,433},{0,80,1},{0,64,2248},{0,64,2248},{44,127,65535},{25,127,48594},{17,127,23861},{11,127,12725},{41,127,65535},{14,127,32517},{3,127,2601},{0,121,3706},{0,126,65535},{0,113,32750},{82,127,6098},{73,127,2966},{71,127,1649},{59,127,4},{127,36,9818}, +{46,127,3638},{34,127,445},{0,110,2137},{127,82,9818},{0,110,2137},{41,127,13349},{41,127,13349},{41,127,13349},{31,127,7380},{29,127,11310},{11,127,1973},{11,127,1973},{0,101,405},{0,108,10181},{0,93,4410},{71,127,1649},{71,127,1649},{71,127,1649},{59,127,4},{122,0,4418},{34,127,445},{34,127,445},{0,101,405},{126,61,4418},{0,101,405},{127,93,925},{102,127,337},{95,127,0},{62,127,0},{127,93,925},{126,111,925},{62,127,0}, +{0,116,925},{126,111,925},{0,116,925},{29,0,6964},{29,0,6964},{29,0,6964},{29,0,6964},{9,127,808},{9,127,808},{9,127,808},{0,87,0},{0,70,2645},{0,70,2645},{44,127,65535},{25,127,51330},{17,127,27013},{11,127,14917},{41,127,65535},{14,127,33397},{4,127,3805},{0,121,2618},{1,126,65535},{0,113,32078},{88,127,5594},{79,127,2891},{74,127,1825},{64,127,45},{127,43,8901},{54,127,3373},{40,127,605},{0,115,1538},{127,86,8901}, +{0,115,1538},{44,127,15117},{44,127,15117},{44,127,15117},{34,127,8664},{32,127,12746},{14,127,2881},{14,127,2881},{0,104,317},{0,113,10694},{0,96,4714},{74,127,1825},{74,127,1825},{74,127,1825},{64,127,45},{127,2,4418},{40,127,605},{40,127,605},{0,104,317},{127,66,4418},{0,104,317},{127,99,613},{105,127,221},{101,127,0},{73,127,0},{127,99,613},{126,114,613},{73,127,0},{0,118,613},{126,114,613},{0,118,613},{31,0,7940}, +{31,0,7940},{31,0,7940},{31,0,7940},{9,127,1224},{9,127,1224},{9,127,1224},{0,93,0},{0,76,3029},{0,76,3029},{49,127,65535},{25,127,54322},{17,127,30421},{13,127,17348},{44,127,65535},{14,127,34533},{5,127,5245},{0,123,1705},{2,127,65535},{0,113,31662},{91,127,5146},{82,127,2950},{79,127,1994},{67,127,145},{127,53,8069},{60,127,3125},{46,127,797},{0,117,1025},{126,91,8069},{0,117,1025},{49,127,16984},{49,127,16984},{49,127,16984}, +{37,127,10100},{35,127,14318},{16,127,3981},{16,127,3981},{0,110,245},{0,119,11302},{0,102,5034},{79,127,1994},{79,127,1994},{79,127,1994},{67,127,145},{127,14,4418},{46,127,797},{46,127,797},{0,110,245},{127,72,4418},{0,110,245},{127,105,365},{111,127,136},{107,127,0},{86,127,0},{127,105,365},{126,117,365},{86,127,0},{0,120,365},{126,117,365},{0,120,365},{33,0,8980},{33,0,8980},{33,0,8980},{33,0,8980},{12,127,1732}, +{12,127,1732},{12,127,1732},{0,99,0},{0,81,3385},{0,81,3385},{49,127,65535},{28,127,54246},{20,127,31809},{16,127,18396},{49,127,65535},{19,127,34118},{8,127,6285},{3,124,1078},{2,127,65535},{0,116,27154},{94,127,4770},{86,127,2986},{82,127,2210},{73,127,281},{127,60,7322},{67,127,2945},{54,127,1037},{0,118,614},{127,94,7322},{0,118,614},{52,127,17772},{52,127,17772},{52,127,17772},{40,127,10764},{38,127,15150},{22,127,4785},{22,127,4785}, +{1,113,218},{0,125,10994},{0,105,4594},{82,127,2210},{82,127,2210},{82,127,2210},{73,127,281},{127,27,4418},{54,127,1037},{54,127,1037},{0,114,193},{126,78,4418},{0,114,193},{127,111,181},{116,127,65},{113,127,0},{98,127,0},{127,111,181},{126,120,181},{98,127,0},{0,122,181},{126,120,181},{0,122,181},{37,0,9248},{37,0,9248},{37,0,9248},{37,0,9248},{17,127,2009},{17,127,2009},{17,127,2009},{3,104,0},{0,87,3177}, +{0,87,3177},{52,127,65535},{34,127,52995},{26,127,32522},{21,127,19126},{49,127,65535},{22,127,32935},{13,127,7330},{7,125,605},{2,127,64493},{0,116,21205},{97,127,4436},{91,127,3044},{88,127,2440},{79,127,505},{127,69,6584},{73,127,2811},{63,127,1313},{0,121,292},{126,99,6584},{0,121,292},{55,127,18275},{55,127,18275},{55,127,18275},{46,127,11259},{44,127,15797},{28,127,5606},{28,127,5606},{6,118,217},{0,125,10589},{0,113,3809},{88,127,2440}, +{88,127,2440},{88,127,2440},{79,127,505},{127,40,4418},{63,127,1313},{63,127,1313},{0,118,128},{126,85,4418},{0,118,128},{127,119,50},{122,127,18},{119,127,1},{111,127,0},{127,119,50},{127,123,50},{111,127,0},{0,124,52},{127,123,50},{0,124,52},{41,0,9250},{41,0,9250},{41,0,9250},{41,0,9250},{20,127,2225},{20,127,2225},{20,127,2225},{8,108,1},{0,93,2741},{0,93,2741},{55,127,65535},{37,127,52035},{29,127,33226}, +{25,127,19751},{52,127,65535},{28,127,31983},{18,127,8346},{11,126,349},{2,127,60061},{0,119,16605},{100,127,4216},{97,127,3140},{94,127,2664},{84,127,776},{127,76,6019},{76,127,2779},{70,127,1586},{0,124,116},{126,103,6019},{0,124,116},{61,127,18739},{61,127,18739},{61,127,18739},{51,127,11794},{49,127,16315},{31,127,6398},{31,127,6398},{10,122,217},{2,127,10565},{0,116,3213},{94,127,2664},{94,127,2664},{94,127,2664},{84,127,776},{127,53,4418}, +{70,127,1586},{70,127,1586},{0,124,80},{126,91,4418},{0,124,80},{127,125,2},{127,126,2},{125,127,1},{124,127,0},{127,125,2},{127,126,2},{124,127,0},{0,126,4},{127,126,2},{0,126,4},{45,0,9250},{45,0,9250},{45,0,9250},{45,0,9250},{26,127,2441},{26,127,2441},{26,127,2441},{12,112,1},{0,102,2377},{0,102,2377},{58,127,65535},{40,127,49743},{35,127,32390},{28,127,19671},{55,127,65535},{31,127,30383},{22,127,8522}, +{15,126,198},{2,127,55505},{0,122,12609},{103,127,3648},{100,127,2776},{97,127,2384},{87,127,740},{127,83,5163},{84,127,2468},{73,127,1450},{0,127,16},{126,106,5163},{0,127,16},{65,127,18185},{65,127,18185},{65,127,18185},{54,127,11714},{52,127,15699},{37,127,6486},{37,127,6486},{14,124,126},{2,127,9785},{0,119,2501},{97,127,2384},{97,127,2384},{97,127,2384},{87,127,740},{127,60,3872},{73,127,1450},{73,127,1450},{0,126,13},{127,94,3872}, +{0,126,13},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{49,0,9250},{49,0,9250},{49,0,9250},{49,0,9250},{29,127,2665},{29,127,2665},{29,127,2665},{16,116,1},{0,108,2041},{0,108,2041},{61,127,65535},{46,127,47079},{38,127,31046},{33,127,19370},{58,127,65535},{34,127,28647},{25,127,8458},{19,126,78},{2,127,51393},{0,122,9105},{106,127,3012}, +{100,127,2296},{100,127,1972},{90,127,612},{127,86,4267},{87,127,2028},{76,127,1210},{5,127,0},{127,107,4267},{5,127,0},{65,127,17289},{65,127,17289},{65,127,17289},{57,127,11462},{55,127,14739},{40,127,6374},{40,127,6374},{18,125,50},{2,127,8937},{0,122,1881},{100,127,1972},{100,127,1972},{100,127,1972},{90,127,612},{127,66,3200},{76,127,1210},{76,127,1210},{5,127,0},{127,97,3200},{5,127,0},{127,127,0},{127,127,0},{127,127,0}, +{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{53,0,9250},{53,0,9250},{53,0,9250},{53,0,9250},{35,127,2897},{35,127,2897},{35,127,2897},{20,120,1},{0,116,1693},{0,116,1693},{65,127,65535},{48,127,44233},{41,127,29640},{37,127,18961},{61,127,65535},{40,127,26823},{30,127,8416},{24,127,9},{8,127,47133},{0,122,6081},{109,127,2377},{103,127,1809},{103,127,1553},{96,127,481},{127,90,3361}, +{90,127,1593},{84,127,953},{19,127,0},{127,109,3361},{19,127,0},{71,127,16331},{71,127,16331},{71,127,16331},{63,127,11212},{61,127,13721},{46,127,6266},{46,127,6266},{24,126,8},{5,127,8245},{0,125,1397},{103,127,1553},{103,127,1553},{103,127,1553},{96,127,481},{127,72,2521},{84,127,953},{84,127,953},{19,127,0},{127,100,2521},{19,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0}, +{0,127,0},{127,127,0},{0,127,0},{58,0,9248},{58,0,9248},{58,0,9248},{58,0,9248},{41,127,3181},{41,127,3181},{41,127,3181},{24,125,0},{0,125,1381},{0,125,1381},{65,127,65535},{51,127,41789},{44,127,28480},{40,127,18673},{65,127,65535},{43,127,25251},{34,127,8410},{28,127,4},{14,127,43557},{0,125,4005},{111,127,1843},{106,127,1421},{106,127,1225},{99,127,373},{127,95,2646},{96,127,1241},{90,127,745},{31,127,0},{127,111,2646}, +{31,127,0},{74,127,15539},{74,127,15539},{74,127,15539},{64,127,10979},{65,127,12914},{51,127,6216},{51,127,6216},{28,127,4},{11,127,7709},{0,126,1217},{106,127,1225},{106,127,1225},{106,127,1225},{99,127,373},{127,78,1985},{90,127,745},{90,127,745},{31,127,0},{127,103,1985},{31,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{62,0,9248}, +{62,0,9248},{62,0,9248},{62,0,9248},{44,127,3425},{44,127,3425},{44,127,3425},{28,127,4},{0,125,1205},{0,125,1205},{68,127,65535},{54,127,39465},{49,127,27209},{46,127,18393},{65,127,64563},{46,127,23799},{38,127,8426},{32,127,64},{14,127,40437},{0,125,2677},{111,127,1411},{111,127,1070},{109,127,937},{102,127,281},{127,99,2017},{99,127,937},{93,127,565},{43,127,0},{126,114,2017},{43,127,0},{77,127,14795},{77,127,14795},{77,127,14795}, +{70,127,10779},{68,127,12146},{54,127,6176},{54,127,6176},{34,127,52},{14,127,7281},{2,127,1213},{109,127,937},{109,127,937},{109,127,937},{102,127,281},{127,84,1513},{93,127,565},{93,127,565},{43,127,0},{127,106,1513},{43,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{65,0,9250},{65,0,9250},{65,0,9250},{65,0,9250},{49,127,3656}, +{49,127,3656},{49,127,3656},{34,127,52},{2,127,1213},{2,127,1213},{71,127,63180},{60,127,37225},{52,127,26137},{48,127,18128},{68,127,59595},{51,127,22636},{42,127,8480},{37,127,164},{22,127,37455},{0,126,2073},{114,127,1019},{111,127,766},{111,127,666},{105,127,205},{127,102,1473},{102,127,681},{99,127,405},{56,127,0},{127,115,1473},{56,127,0},{79,127,14066},{79,127,14066},{79,127,14066},{73,127,10571},{71,127,11450},{59,127,6166},{59,127,6166}, +{37,127,148},{25,127,6914},{5,127,1413},{111,127,666},{111,127,666},{111,127,666},{105,127,205},{127,90,1105},{99,127,405},{99,127,405},{56,127,0},{127,109,1105},{56,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{127,127,0},{0,127,0},{127,127,0},{0,127,0},{69,0,9250},{69,0,9250},{69,0,9250},{69,0,9250},{52,127,3940},{52,127,3940},{52,127,3940},{37,127,148},{5,127,1413}, +{5,127,1413}, diff --git a/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc b/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc new file mode 100644 index 0000000..8244550 --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_5.inc @@ -0,0 +1,494 @@ +// Copyright (C) 2017-2019 Binomial LLC. All Rights Reserved. +// +// 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. +{0,2,18},{0,1,9},{0,1,0},{0,1,9},{0,1,40},{0,1,22},{0,1,13},{0,1,61},{0,1,47},{0,1,65},{0,2,18},{0,1,9},{0,1,0},{0,1,9},{0,1,40},{0,1,22},{0,1,13},{0,1,61},{1,0,40},{0,1,61},{0,1,0},{0,1,0},{0,1,0},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,0}, +{0,1,0},{0,1,0},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{1,0,18},{0,1,9},{0,1,0},{0,1,9},{1,0,18},{2,0,18},{0,1,9},{0,1,36},{2,0,18},{0,1,36},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,5,54},{0,3,40},{0,2,61}, +{0,2,36},{0,4,51},{0,2,37},{0,2,1},{0,2,52},{0,2,77},{0,1,73},{1,3,22},{1,2,13},{1,2,4},{1,2,13},{0,4,51},{1,2,34},{0,2,1},{0,2,52},{4,0,51},{0,2,52},{0,4,37},{0,4,37},{0,4,37},{0,2,36},{0,3,8},{0,2,1},{0,2,1},{0,1,5},{0,1,30},{0,1,9},{1,2,4},{1,2,4},{1,2,4},{1,1,8},{1,1,8}, +{0,2,1},{0,2,1},{0,1,5},{3,0,8},{0,1,5},{2,1,18},{0,3,4},{1,2,0},{0,2,0},{2,1,18},{5,0,18},{0,2,0},{0,2,36},{5,0,18},{0,2,36},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,2,1},{0,2,1},{0,2,1},{0,1,1},{0,1,5},{0,1,5},{1,6,54},{1,4,40},{1,3,61},{1,3,36},{1,5,51},{1,3,37},{1,3,1}, +{1,3,52},{0,3,72},{0,3,40},{2,4,22},{2,3,13},{2,3,4},{2,3,13},{1,5,51},{0,4,29},{1,3,1},{0,3,40},{7,0,51},{0,3,40},{1,5,37},{1,5,37},{1,5,37},{1,3,36},{1,4,8},{1,3,1},{1,3,1},{1,2,5},{0,3,8},{1,2,9},{2,3,4},{2,3,4},{2,3,4},{2,2,8},{3,0,8},{1,3,1},{1,3,1},{1,2,5},{6,0,8}, +{1,2,5},{3,2,18},{1,4,4},{2,3,0},{1,3,0},{3,2,18},{6,1,18},{1,3,0},{0,3,36},{6,1,18},{0,3,36},{1,0,36},{1,0,36},{1,0,36},{1,0,36},{1,3,1},{1,3,1},{1,3,1},{1,2,1},{0,3,4},{0,3,4},{2,7,54},{2,5,40},{2,4,62},{2,4,38},{2,6,51},{2,4,27},{2,4,3},{2,3,69},{0,5,60},{1,4,54},{3,5,22}, +{3,4,9},{3,4,6},{3,4,21},{5,0,51},{2,4,27},{2,4,3},{0,4,50},{10,0,51},{0,4,50},{2,6,37},{2,6,37},{2,6,37},{2,4,37},{2,5,8},{2,4,2},{2,4,2},{2,3,5},{1,4,8},{2,3,9},{3,4,5},{3,4,5},{3,4,5},{3,3,8},{4,1,8},{2,4,2},{2,4,2},{2,3,5},{9,0,8},{2,3,5},{3,5,18},{2,5,4},{3,4,2}, +{2,4,2},{3,5,18},{7,2,18},{2,4,2},{0,4,50},{7,2,18},{0,4,50},{2,0,36},{2,0,36},{2,0,36},{2,0,36},{2,4,1},{2,4,1},{2,4,1},{2,3,1},{1,4,4},{1,4,4},{3,8,68},{3,6,60},{4,5,68},{3,5,50},{3,7,53},{3,6,28},{3,5,5},{3,5,53},{3,5,68},{2,5,38},{4,6,22},{4,5,13},{4,5,4},{4,5,13},{6,1,52}, +{3,6,27},{3,5,4},{1,5,37},{13,0,52},{1,5,37},{3,7,50},{3,7,50},{3,7,50},{3,5,50},{3,6,11},{3,5,5},{3,5,5},{3,4,6},{2,5,11},{3,4,9},{4,5,4},{4,5,4},{4,5,4},{4,4,8},{4,4,8},{3,5,4},{3,5,4},{3,4,5},{12,0,8},{3,4,5},{7,0,18},{4,5,9},{4,5,0},{3,5,0},{7,0,18},{14,0,18},{3,5,0}, +{0,5,36},{14,0,18},{0,5,36},{3,0,50},{3,0,50},{3,0,50},{3,0,50},{3,6,2},{3,6,2},{3,6,2},{3,4,2},{2,5,2},{2,5,2},{4,9,54},{4,7,40},{4,6,61},{4,6,36},{4,8,51},{4,6,37},{4,6,1},{4,6,52},{2,7,68},{3,6,38},{5,7,22},{5,6,13},{5,6,4},{5,6,13},{8,0,51},{5,6,34},{4,6,1},{2,6,37},{16,0,51}, +{2,6,37},{4,8,37},{4,8,37},{4,8,37},{4,6,36},{4,7,8},{4,6,1},{4,6,1},{4,5,5},{3,6,11},{4,5,9},{5,6,4},{5,6,4},{5,6,4},{5,5,8},{5,5,8},{4,6,1},{4,6,1},{4,5,5},{15,0,8},{4,5,5},{8,1,18},{4,7,4},{5,6,0},{4,6,0},{8,1,18},{17,0,18},{4,6,0},{0,6,36},{17,0,18},{0,6,36},{4,0,36}, +{4,0,36},{4,0,36},{4,0,36},{4,6,1},{4,6,1},{4,6,1},{4,5,1},{3,6,2},{3,6,2},{5,10,54},{5,8,40},{5,7,61},{5,7,36},{5,9,51},{5,7,37},{5,7,1},{5,7,52},{3,8,60},{4,7,40},{6,8,22},{6,7,13},{6,7,4},{6,7,13},{9,1,51},{4,8,29},{5,7,1},{3,7,37},{19,0,51},{3,7,37},{5,9,37},{5,9,37},{5,9,37}, +{5,7,36},{5,8,8},{5,7,1},{5,7,1},{5,6,5},{4,7,8},{5,6,9},{6,7,4},{6,7,4},{6,7,4},{6,6,8},{9,0,8},{5,7,1},{5,7,1},{5,6,5},{18,0,8},{5,6,5},{10,0,18},{5,8,4},{6,7,0},{5,7,0},{10,0,18},{18,1,18},{5,7,0},{0,7,36},{18,1,18},{0,7,36},{5,0,36},{5,0,36},{5,0,36},{5,0,36},{5,7,1}, +{5,7,1},{5,7,1},{5,6,1},{4,7,4},{4,7,4},{6,11,54},{6,9,40},{6,8,62},{6,8,38},{6,10,51},{6,8,27},{6,8,3},{6,7,69},{4,9,60},{5,8,54},{7,9,22},{7,8,9},{7,8,6},{7,8,21},{11,0,51},{6,8,27},{6,8,3},{4,8,50},{22,0,51},{4,8,50},{6,10,37},{6,10,37},{6,10,37},{6,8,37},{6,9,8},{6,8,2},{6,8,2}, +{6,7,5},{5,8,8},{6,7,9},{7,8,5},{7,8,5},{7,8,5},{7,7,8},{10,1,8},{6,8,2},{6,8,2},{6,7,5},{21,0,8},{6,7,5},{11,1,18},{6,9,4},{7,8,2},{6,8,2},{11,1,18},{19,2,18},{6,8,2},{0,8,50},{19,2,18},{0,8,50},{6,0,36},{6,0,36},{6,0,36},{6,0,36},{6,8,1},{6,8,1},{6,8,1},{6,7,1},{5,8,4}, +{5,8,4},{7,12,68},{7,10,60},{8,9,68},{7,9,50},{7,11,53},{7,10,28},{7,9,5},{7,9,53},{7,9,68},{6,9,38},{8,10,22},{8,9,13},{8,9,4},{8,9,13},{12,1,52},{7,10,27},{7,9,4},{5,9,37},{25,0,52},{5,9,37},{7,11,50},{7,11,50},{7,11,50},{7,9,50},{7,10,11},{7,9,5},{7,9,5},{7,8,6},{6,9,11},{7,8,9},{8,9,4}, +{8,9,4},{8,9,4},{8,8,8},{12,0,8},{7,9,4},{7,9,4},{7,8,5},{24,0,8},{7,8,5},{13,0,18},{8,9,9},{8,9,0},{7,9,0},{13,0,18},{26,0,18},{7,9,0},{0,9,36},{26,0,18},{0,9,36},{7,0,50},{7,0,50},{7,0,50},{7,0,50},{7,10,2},{7,10,2},{7,10,2},{7,8,2},{6,9,2},{6,9,2},{8,13,54},{8,11,40},{8,10,61}, +{8,10,36},{8,12,51},{8,10,37},{8,10,1},{8,10,52},{6,11,68},{7,10,38},{9,11,22},{9,10,13},{9,10,4},{9,10,13},{12,4,51},{9,10,34},{8,10,1},{6,10,37},{28,0,51},{6,10,37},{8,12,37},{8,12,37},{8,12,37},{8,10,36},{8,11,8},{8,10,1},{8,10,1},{8,9,5},{7,10,11},{8,9,9},{9,10,4},{9,10,4},{9,10,4},{9,9,8},{13,1,8}, +{8,10,1},{8,10,1},{8,9,5},{27,0,8},{8,9,5},{14,1,18},{8,11,4},{9,10,0},{8,10,0},{14,1,18},{29,0,18},{8,10,0},{0,10,36},{29,0,18},{0,10,36},{8,0,36},{8,0,36},{8,0,36},{8,0,36},{8,10,1},{8,10,1},{8,10,1},{8,9,1},{7,10,2},{7,10,2},{9,14,54},{9,12,40},{9,11,61},{9,11,36},{9,13,51},{9,11,37},{9,11,1}, +{9,11,52},{7,12,60},{8,11,40},{10,12,22},{10,11,13},{10,11,4},{10,11,13},{13,5,51},{8,12,29},{9,11,1},{7,11,37},{31,0,51},{7,11,37},{9,13,37},{9,13,37},{9,13,37},{9,11,36},{9,12,8},{9,11,1},{9,11,1},{9,10,5},{8,11,8},{9,10,9},{10,11,4},{10,11,4},{10,11,4},{10,10,8},{15,0,8},{9,11,1},{9,11,1},{9,10,5},{30,0,8}, +{9,10,5},{15,2,18},{9,12,4},{10,11,0},{9,11,0},{15,2,18},{30,1,18},{9,11,0},{0,11,36},{30,1,18},{0,11,36},{9,0,36},{9,0,36},{9,0,36},{9,0,36},{9,11,1},{9,11,1},{9,11,1},{9,10,1},{8,11,4},{8,11,4},{10,15,54},{10,13,40},{10,12,62},{10,12,38},{10,14,51},{10,12,27},{10,12,3},{10,11,69},{8,13,60},{9,12,54},{11,13,22}, +{11,12,9},{11,12,6},{11,12,21},{17,0,51},{10,12,27},{10,12,3},{8,12,50},{30,2,51},{8,12,50},{10,14,37},{10,14,37},{10,14,37},{10,12,37},{10,13,8},{10,12,2},{10,12,2},{10,11,5},{9,12,8},{10,11,9},{11,12,5},{11,12,5},{11,12,5},{11,11,8},{16,1,8},{10,12,2},{10,12,2},{10,11,5},{31,1,8},{10,11,5},{15,5,18},{10,13,4},{11,12,2}, +{10,12,2},{15,5,18},{31,2,18},{10,12,2},{0,12,50},{31,2,18},{0,12,50},{10,0,36},{10,0,36},{10,0,36},{10,0,36},{10,12,1},{10,12,1},{10,12,1},{10,11,1},{9,12,4},{9,12,4},{11,16,68},{11,14,60},{12,13,68},{11,13,50},{11,15,53},{11,14,28},{11,13,5},{11,13,53},{11,13,68},{10,13,38},{12,14,22},{12,13,13},{12,13,4},{12,13,13},{18,1,52}, +{11,14,27},{11,13,4},{9,13,37},{31,3,52},{9,13,37},{11,15,50},{11,15,50},{11,15,50},{11,13,50},{11,14,11},{11,13,5},{11,13,5},{11,12,6},{10,13,11},{11,12,9},{12,13,4},{12,13,4},{12,13,4},{12,12,8},{16,4,8},{11,13,4},{11,13,4},{11,12,5},{28,4,8},{11,12,5},{19,0,18},{12,13,9},{12,13,0},{11,13,0},{19,0,18},{30,4,18},{11,13,0}, +{0,13,36},{30,4,18},{0,13,36},{11,0,50},{11,0,50},{11,0,50},{11,0,50},{11,14,2},{11,14,2},{11,14,2},{11,12,2},{10,13,2},{10,13,2},{12,17,54},{12,15,40},{12,14,61},{12,14,36},{12,16,51},{12,14,37},{12,14,1},{12,14,52},{10,15,68},{11,14,38},{13,15,22},{13,14,13},{13,14,4},{13,14,13},{20,0,51},{13,14,34},{12,14,1},{10,14,37},{24,8,51}, +{10,14,37},{12,16,37},{12,16,37},{12,16,37},{12,14,36},{12,15,8},{12,14,1},{12,14,1},{12,13,5},{11,14,11},{12,13,9},{13,14,4},{13,14,4},{13,14,4},{13,13,8},{17,5,8},{12,14,1},{12,14,1},{12,13,5},{31,4,8},{12,13,5},{20,1,18},{12,15,4},{13,14,0},{12,14,0},{20,1,18},{31,5,18},{12,14,0},{0,14,36},{31,5,18},{0,14,36},{12,0,36}, +{12,0,36},{12,0,36},{12,0,36},{12,14,1},{12,14,1},{12,14,1},{12,13,1},{11,14,2},{11,14,2},{13,18,54},{13,16,40},{13,15,61},{13,15,36},{13,17,51},{13,15,37},{13,15,1},{13,15,52},{11,16,60},{12,15,40},{14,16,22},{14,15,13},{14,15,4},{14,15,13},{21,1,51},{12,16,29},{13,15,1},{11,15,37},{27,8,51},{11,15,37},{13,17,37},{13,17,37},{13,17,37}, +{13,15,36},{13,16,8},{13,15,1},{13,15,1},{13,14,5},{12,15,8},{13,14,9},{14,15,4},{14,15,4},{14,15,4},{14,14,8},{21,0,8},{13,15,1},{13,15,1},{13,14,5},{30,6,8},{13,14,5},{22,0,18},{13,16,4},{14,15,0},{13,15,0},{22,0,18},{30,7,18},{13,15,0},{0,15,36},{30,7,18},{0,15,36},{13,0,36},{13,0,36},{13,0,36},{13,0,36},{13,15,1}, +{13,15,1},{13,15,1},{13,14,1},{12,15,4},{12,15,4},{14,19,54},{14,17,40},{14,16,62},{14,16,38},{14,18,51},{14,16,27},{14,16,3},{14,15,69},{12,17,60},{13,16,54},{15,17,22},{15,16,9},{15,16,6},{15,16,21},{23,0,51},{14,16,27},{14,16,3},{12,16,50},{30,8,51},{12,16,50},{14,18,37},{14,18,37},{14,18,37},{14,16,37},{14,17,8},{14,16,2},{14,16,2}, +{14,15,5},{13,16,8},{14,15,9},{15,16,5},{15,16,5},{15,16,5},{15,15,8},{22,1,8},{14,16,2},{14,16,2},{14,15,5},{31,7,8},{14,15,5},{23,1,18},{14,17,4},{15,16,2},{14,16,2},{23,1,18},{27,10,18},{14,16,2},{0,16,50},{27,10,18},{0,16,50},{14,0,36},{14,0,36},{14,0,36},{14,0,36},{14,16,1},{14,16,1},{14,16,1},{14,15,1},{13,16,4}, +{13,16,4},{15,20,68},{15,18,60},{16,17,68},{15,17,50},{15,19,53},{15,18,28},{15,17,5},{15,17,53},{15,17,68},{14,17,38},{16,18,22},{16,17,13},{16,17,4},{16,17,13},{24,1,52},{15,18,27},{15,17,4},{13,17,37},{31,9,52},{13,17,37},{15,19,50},{15,19,50},{15,19,50},{15,17,50},{15,18,11},{15,17,5},{15,17,5},{15,16,6},{14,17,11},{15,16,9},{16,17,4}, +{16,17,4},{16,17,4},{16,16,8},{24,0,8},{15,17,4},{15,17,4},{15,16,5},{24,12,8},{15,16,5},{25,0,18},{16,17,9},{16,17,0},{15,17,0},{25,0,18},{30,10,18},{15,17,0},{0,17,36},{30,10,18},{0,17,36},{15,0,50},{15,0,50},{15,0,50},{15,0,50},{15,18,2},{15,18,2},{15,18,2},{15,16,2},{14,17,2},{14,17,2},{16,21,54},{16,19,40},{16,18,61}, +{16,18,36},{16,20,51},{16,18,37},{16,18,1},{16,18,52},{14,19,68},{15,18,38},{17,19,22},{17,18,13},{17,18,4},{17,18,13},{24,4,51},{17,18,34},{16,18,1},{14,18,37},{28,12,51},{14,18,37},{16,20,37},{16,20,37},{16,20,37},{16,18,36},{16,19,8},{16,18,1},{16,18,1},{16,17,5},{15,18,11},{16,17,9},{17,18,4},{17,18,4},{17,18,4},{17,17,8},{25,1,8}, +{16,18,1},{16,18,1},{16,17,5},{27,12,8},{16,17,5},{26,1,18},{16,19,4},{17,18,0},{16,18,0},{26,1,18},{31,11,18},{16,18,0},{0,18,36},{31,11,18},{0,18,36},{16,0,36},{16,0,36},{16,0,36},{16,0,36},{16,18,1},{16,18,1},{16,18,1},{16,17,1},{15,18,2},{15,18,2},{17,22,54},{17,20,40},{17,19,61},{17,19,36},{17,21,51},{17,19,37},{17,19,1}, +{17,19,52},{15,20,60},{16,19,40},{18,20,22},{18,19,13},{18,19,4},{18,19,13},{25,5,51},{16,20,29},{17,19,1},{15,19,37},{31,12,51},{15,19,37},{17,21,37},{17,21,37},{17,21,37},{17,19,36},{17,20,8},{17,19,1},{17,19,1},{17,18,5},{16,19,8},{17,18,9},{18,19,4},{18,19,4},{18,19,4},{18,18,8},{27,0,8},{17,19,1},{17,19,1},{17,18,5},{30,12,8}, +{17,18,5},{27,2,18},{17,20,4},{18,19,0},{17,19,0},{27,2,18},{30,13,18},{17,19,0},{0,19,36},{30,13,18},{0,19,36},{17,0,36},{17,0,36},{17,0,36},{17,0,36},{17,19,1},{17,19,1},{17,19,1},{17,18,1},{16,19,4},{16,19,4},{18,23,54},{18,21,40},{18,20,62},{18,20,38},{18,22,51},{18,20,27},{18,20,3},{18,19,69},{16,21,60},{17,20,54},{19,21,22}, +{19,20,9},{19,20,6},{19,20,21},{29,0,51},{18,20,27},{18,20,3},{16,20,50},{30,14,51},{16,20,50},{18,22,37},{18,22,37},{18,22,37},{18,20,37},{18,21,8},{18,20,2},{18,20,2},{18,19,5},{17,20,8},{18,19,9},{19,20,5},{19,20,5},{19,20,5},{19,19,8},{28,1,8},{18,20,2},{18,20,2},{18,19,5},{31,13,8},{18,19,5},{27,5,18},{18,21,4},{19,20,2}, +{18,20,2},{27,5,18},{31,14,18},{18,20,2},{0,20,50},{31,14,18},{0,20,50},{18,0,36},{18,0,36},{18,0,36},{18,0,36},{18,20,1},{18,20,1},{18,20,1},{18,19,1},{17,20,4},{17,20,4},{19,24,68},{19,22,60},{20,21,68},{19,21,50},{19,23,53},{19,22,28},{19,21,5},{19,21,53},{19,21,68},{18,21,38},{20,22,22},{20,21,13},{20,21,4},{20,21,13},{30,1,52}, +{19,22,27},{19,21,4},{17,21,37},{31,15,52},{17,21,37},{19,23,50},{19,23,50},{19,23,50},{19,21,50},{19,22,11},{19,21,5},{19,21,5},{19,20,6},{18,21,11},{19,20,9},{20,21,4},{20,21,4},{20,21,4},{20,20,8},{28,4,8},{19,21,4},{19,21,4},{19,20,5},{28,16,8},{19,20,5},{31,0,18},{20,21,9},{20,21,0},{19,21,0},{31,0,18},{30,16,18},{19,21,0}, +{0,21,36},{30,16,18},{0,21,36},{19,0,50},{19,0,50},{19,0,50},{19,0,50},{19,22,2},{19,22,2},{19,22,2},{19,20,2},{18,21,2},{18,21,2},{20,25,54},{20,23,40},{20,22,61},{20,22,36},{20,24,51},{20,22,37},{20,22,1},{20,22,52},{18,23,68},{19,22,38},{21,23,22},{21,22,13},{21,22,4},{21,22,13},{28,8,51},{21,22,34},{20,22,1},{18,22,37},{24,20,51}, +{18,22,37},{20,24,37},{20,24,37},{20,24,37},{20,22,36},{20,23,8},{20,22,1},{20,22,1},{20,21,5},{19,22,11},{20,21,9},{21,22,4},{21,22,4},{21,22,4},{21,21,8},{29,5,8},{20,22,1},{20,22,1},{20,21,5},{31,16,8},{20,21,5},{31,3,18},{20,23,4},{21,22,0},{20,22,0},{31,3,18},{31,17,18},{20,22,0},{0,22,36},{31,17,18},{0,22,36},{20,0,36}, +{20,0,36},{20,0,36},{20,0,36},{20,22,1},{20,22,1},{20,22,1},{20,21,1},{19,22,2},{19,22,2},{21,26,54},{21,24,40},{21,23,61},{21,23,36},{21,25,51},{21,23,37},{21,23,1},{21,23,52},{19,24,60},{20,23,40},{22,24,22},{22,23,13},{22,23,4},{22,23,13},{29,9,51},{20,24,29},{21,23,1},{19,23,37},{27,20,51},{19,23,37},{21,25,37},{21,25,37},{21,25,37}, +{21,23,36},{21,24,8},{21,23,1},{21,23,1},{21,22,5},{20,23,8},{21,22,9},{22,23,4},{22,23,4},{22,23,4},{22,22,8},{31,4,8},{21,23,1},{21,23,1},{21,22,5},{30,18,8},{21,22,5},{31,6,18},{21,24,4},{22,23,0},{21,23,0},{31,6,18},{30,19,18},{21,23,0},{0,23,36},{30,19,18},{0,23,36},{21,0,36},{21,0,36},{21,0,36},{21,0,36},{21,23,1}, +{21,23,1},{21,23,1},{21,22,1},{20,23,4},{20,23,4},{22,27,54},{22,25,40},{22,24,62},{22,24,38},{22,26,51},{22,24,27},{22,24,3},{22,23,69},{20,25,60},{21,24,54},{23,25,22},{23,24,9},{23,24,6},{23,24,21},{31,8,51},{22,24,27},{22,24,3},{20,24,50},{30,20,51},{20,24,50},{22,26,37},{22,26,37},{22,26,37},{22,24,37},{22,25,8},{22,24,2},{22,24,2}, +{22,23,5},{21,24,8},{22,23,9},{23,24,5},{23,24,5},{23,24,5},{23,23,8},{31,7,8},{22,24,2},{22,24,2},{22,23,5},{31,19,8},{22,23,5},{31,9,18},{22,25,4},{23,24,2},{22,24,2},{31,9,18},{27,22,18},{22,24,2},{0,24,50},{27,22,18},{0,24,50},{22,0,36},{22,0,36},{22,0,36},{22,0,36},{22,24,1},{22,24,1},{22,24,1},{22,23,1},{21,24,4}, +{21,24,4},{23,28,68},{23,26,60},{24,25,68},{23,25,50},{23,27,53},{23,26,28},{23,25,5},{23,25,53},{23,25,68},{22,25,38},{24,26,22},{24,25,13},{24,25,4},{24,25,13},{31,11,52},{23,26,27},{23,25,4},{21,25,37},{31,21,52},{21,25,37},{23,27,50},{23,27,50},{23,27,50},{23,25,50},{23,26,11},{23,25,5},{23,25,5},{23,24,6},{22,25,11},{23,24,9},{24,25,4}, +{24,25,4},{24,25,4},{24,24,8},{28,16,8},{23,25,4},{23,25,4},{23,24,5},{24,24,8},{23,24,5},{31,12,18},{24,25,9},{24,25,0},{23,25,0},{31,12,18},{30,22,18},{23,25,0},{0,25,36},{30,22,18},{0,25,36},{23,0,50},{23,0,50},{23,0,50},{23,0,50},{23,26,2},{23,26,2},{23,26,2},{23,24,2},{22,25,2},{22,25,2},{24,29,54},{24,27,40},{24,26,61}, +{24,26,36},{24,28,51},{24,26,37},{24,26,1},{24,26,52},{22,27,68},{23,26,38},{25,27,22},{25,26,13},{25,26,4},{25,26,13},{28,20,51},{25,26,34},{24,26,1},{22,26,37},{28,24,51},{22,26,37},{24,28,37},{24,28,37},{24,28,37},{24,26,36},{24,27,8},{24,26,1},{24,26,1},{24,25,5},{23,26,11},{24,25,9},{25,26,4},{25,26,4},{25,26,4},{25,25,8},{29,17,8}, +{24,26,1},{24,26,1},{24,25,5},{27,24,8},{24,25,5},{31,15,18},{24,27,4},{25,26,0},{24,26,0},{31,15,18},{31,23,18},{24,26,0},{0,26,36},{31,23,18},{0,26,36},{24,0,36},{24,0,36},{24,0,36},{24,0,36},{24,26,1},{24,26,1},{24,26,1},{24,25,1},{23,26,2},{23,26,2},{25,30,54},{25,28,40},{25,27,61},{25,27,36},{25,29,51},{25,27,37},{25,27,1}, +{25,27,52},{23,28,60},{24,27,40},{26,28,22},{26,27,13},{26,27,4},{26,27,13},{29,21,51},{24,28,29},{25,27,1},{23,27,37},{31,24,51},{23,27,37},{25,29,37},{25,29,37},{25,29,37},{25,27,36},{25,28,8},{25,27,1},{25,27,1},{25,26,5},{24,27,8},{25,26,9},{26,27,4},{26,27,4},{26,27,4},{26,26,8},{31,16,8},{25,27,1},{25,27,1},{25,26,5},{30,24,8}, +{25,26,5},{31,18,18},{25,28,4},{26,27,0},{25,27,0},{31,18,18},{30,25,18},{25,27,0},{0,27,36},{30,25,18},{0,27,36},{25,0,36},{25,0,36},{25,0,36},{25,0,36},{25,27,1},{25,27,1},{25,27,1},{25,26,1},{24,27,4},{24,27,4},{26,31,54},{26,29,40},{26,28,62},{26,28,38},{26,30,51},{26,28,27},{26,28,3},{26,27,69},{24,29,60},{25,28,54},{27,29,22}, +{27,28,9},{27,28,6},{27,28,21},{31,20,51},{26,28,27},{26,28,3},{24,28,50},{30,26,51},{24,28,50},{26,30,37},{26,30,37},{26,30,37},{26,28,37},{26,29,8},{26,28,2},{26,28,2},{26,27,5},{25,28,8},{26,27,9},{27,28,5},{27,28,5},{27,28,5},{27,27,8},{31,19,8},{26,28,2},{26,28,2},{26,27,5},{31,25,8},{26,27,5},{31,21,18},{26,29,4},{27,28,2}, +{26,28,2},{31,21,18},{31,26,18},{26,28,2},{0,28,50},{31,26,18},{0,28,50},{26,0,36},{26,0,36},{26,0,36},{26,0,36},{26,28,1},{26,28,1},{26,28,1},{26,27,1},{25,28,4},{25,28,4},{28,30,86},{27,30,60},{28,29,68},{27,29,50},{27,31,53},{27,30,28},{27,29,5},{27,29,53},{27,29,68},{26,29,38},{28,30,22},{28,29,13},{28,29,4},{28,29,13},{31,23,52}, +{27,30,27},{27,29,4},{25,29,37},{31,27,52},{25,29,37},{27,31,50},{27,31,50},{27,31,50},{27,29,50},{27,30,11},{27,29,5},{27,29,5},{27,28,6},{26,29,11},{27,28,9},{28,29,4},{28,29,4},{28,29,4},{28,28,8},{28,28,8},{27,29,4},{27,29,4},{27,28,5},{28,28,8},{27,28,5},{31,24,18},{28,29,9},{28,29,0},{27,29,0},{31,24,18},{30,28,18},{27,29,0}, +{0,29,36},{30,28,18},{0,29,36},{27,0,50},{27,0,50},{27,0,50},{27,0,50},{27,30,2},{27,30,2},{27,30,2},{27,28,2},{26,29,2},{26,29,2},{29,31,86},{28,31,40},{28,30,61},{28,30,36},{28,31,72},{28,30,37},{28,30,1},{28,30,52},{26,31,68},{27,30,38},{29,31,22},{29,30,13},{29,30,4},{29,30,13},{31,26,52},{29,30,34},{28,30,1},{26,30,37},{30,29,52}, +{26,30,37},{28,31,40},{28,31,40},{28,31,40},{28,30,36},{28,31,8},{28,30,1},{28,30,1},{28,29,5},{27,30,11},{28,29,9},{29,30,4},{29,30,4},{29,30,4},{29,29,8},{29,29,8},{28,30,1},{28,30,1},{28,29,5},{31,28,8},{28,29,5},{31,27,18},{28,31,4},{29,30,0},{28,30,0},{31,27,18},{31,29,18},{28,30,0},{0,30,36},{31,29,18},{0,30,36},{28,0,36}, +{28,0,36},{28,0,36},{28,0,36},{28,30,1},{28,30,1},{28,30,1},{28,29,1},{27,30,2},{27,30,2},{30,31,104},{30,31,77},{29,31,61},{29,31,36},{30,31,116},{29,31,37},{29,31,1},{29,31,52},{28,31,72},{28,31,40},{30,31,40},{30,31,13},{30,31,4},{30,31,13},{31,29,52},{30,31,34},{29,31,1},{27,31,37},{31,30,52},{27,31,37},{29,31,61},{29,31,61},{29,31,61}, +{29,31,36},{29,31,26},{29,31,1},{29,31,1},{29,30,5},{28,31,8},{29,30,9},{30,31,4},{30,31,4},{30,31,4},{30,30,8},{31,28,8},{29,31,1},{29,31,1},{29,30,5},{30,30,8},{29,30,5},{31,30,18},{30,31,9},{30,31,0},{29,31,0},{31,30,18},{30,31,18},{29,31,0},{0,31,36},{30,31,18},{0,31,36},{29,0,36},{29,0,36},{29,0,36},{29,0,36},{29,31,1}, +{29,31,1},{29,31,1},{29,30,1},{28,31,4},{28,31,4},{31,31,68},{31,31,68},{31,31,68},{30,31,45},{31,31,68},{30,31,34},{30,31,25},{30,31,1},{30,31,23},{30,31,5},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{30,31,1},{31,31,4},{30,31,1},{31,31,68},{31,31,68},{31,31,68},{30,31,45},{30,31,52},{30,31,25},{30,31,25}, +{30,31,1},{30,31,14},{30,31,5},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{31,31,4},{30,31,1},{31,31,4},{30,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{30,0,36},{30,0,36},{30,0,36},{30,0,36},{30,31,16},{30,31,16},{30,31,16},{30,31,1},{30,31,5}, +{30,31,5},{0,4,72},{0,3,10},{0,2,1},{0,2,26},{0,3,154},{0,2,99},{0,2,51},{0,1,115},{0,1,173},{0,1,119},{0,4,72},{0,3,10},{0,2,1},{0,2,26},{1,1,154},{0,2,99},{0,2,51},{0,1,115},{3,0,154},{0,1,115},{0,2,0},{0,2,0},{0,2,0},{0,1,0},{0,1,13},{0,1,4},{0,1,4},{0,0,25},{0,0,25},{0,0,25},{0,2,0}, +{0,2,0},{0,2,0},{0,1,0},{0,1,13},{0,1,4},{0,1,4},{0,0,25},{1,0,13},{0,0,25},{0,4,72},{0,3,10},{0,2,1},{0,2,26},{0,4,72},{4,0,72},{0,2,26},{0,1,90},{4,0,72},{0,1,90},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,7,81},{0,5,13},{0,3,35}, +{0,3,19},{0,5,244},{0,3,115},{0,3,35},{0,2,139},{0,2,308},{0,2,164},{0,7,81},{0,5,13},{1,3,26},{0,3,19},{2,1,244},{0,3,115},{0,3,35},{0,2,139},{5,0,244},{0,2,139},{0,5,9},{0,5,9},{0,5,9},{0,2,18},{0,3,50},{0,2,13},{0,2,13},{0,1,29},{0,1,72},{0,1,33},{0,5,9},{0,5,9},{0,5,9},{0,2,18},{1,1,50}, +{0,2,13},{0,2,13},{0,1,29},{3,0,50},{0,1,29},{1,5,72},{0,5,4},{1,3,1},{0,3,10},{1,5,72},{7,0,72},{0,3,10},{0,2,90},{7,0,72},{0,2,90},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,1,1},{0,1,1},{0,1,1},{0,1,4},{0,1,8},{0,1,8},{1,8,145},{1,6,77},{1,4,98},{1,4,82},{0,8,243},{0,5,76},{0,4,1}, +{0,3,115},{0,4,364},{0,3,179},{1,8,81},{1,6,13},{2,4,25},{1,4,18},{4,0,243},{0,5,76},{0,4,1},{0,3,115},{8,0,243},{0,3,115},{1,6,73},{1,6,73},{1,6,73},{1,3,82},{0,6,50},{0,4,1},{0,4,1},{0,2,26},{0,3,114},{0,2,51},{1,6,9},{1,6,9},{1,6,9},{1,3,18},{3,0,50},{0,4,1},{0,4,1},{0,2,26},{6,0,50}, +{0,2,26},{5,0,72},{1,6,4},{2,4,0},{0,4,1},{5,0,72},{10,0,72},{0,4,1},{0,3,90},{10,0,72},{0,3,90},{1,0,73},{1,0,73},{1,0,73},{1,0,73},{0,4,0},{0,4,0},{0,4,0},{0,2,1},{0,2,26},{0,2,26},{2,9,162},{2,7,94},{2,5,115},{2,5,99},{1,9,244},{1,6,77},{1,5,2},{1,4,106},{0,5,300},{0,4,105},{2,9,81}, +{2,7,13},{3,5,25},{2,5,18},{5,1,243},{1,6,76},{1,5,1},{0,4,89},{11,0,243},{0,4,89},{2,7,90},{2,7,90},{2,7,90},{2,4,94},{1,7,51},{1,5,2},{1,5,2},{1,3,27},{0,4,74},{0,3,35},{2,7,9},{2,7,9},{2,7,9},{2,4,13},{4,1,50},{1,5,1},{1,5,1},{0,4,25},{9,0,50},{0,4,25},{6,1,72},{2,7,4},{3,5,0}, +{1,5,1},{6,1,72},{13,0,72},{1,5,1},{0,4,80},{13,0,72},{0,4,80},{2,0,90},{2,0,90},{2,0,90},{2,0,90},{1,5,1},{1,5,1},{1,5,1},{1,3,2},{0,3,10},{0,3,10},{3,10,154},{3,8,84},{3,6,117},{3,6,85},{2,10,244},{2,7,75},{2,6,2},{2,5,106},{0,7,253},{0,5,100},{3,10,90},{3,8,20},{4,6,26},{3,6,21},{7,0,244}, +{2,7,75},{2,6,2},{0,5,91},{14,0,244},{0,5,91},{3,8,80},{3,8,80},{3,8,80},{3,6,84},{2,8,52},{2,6,1},{2,6,1},{2,5,25},{0,6,52},{0,5,19},{3,8,16},{3,8,16},{3,8,16},{3,6,20},{4,4,50},{2,6,1},{2,6,1},{0,5,10},{12,0,50},{0,5,10},{8,0,72},{3,8,4},{4,6,1},{2,6,1},{8,0,72},{16,0,72},{2,6,1}, +{0,5,90},{16,0,72},{0,5,90},{3,0,80},{3,0,80},{3,0,80},{3,0,80},{2,6,1},{2,6,1},{2,6,1},{2,4,1},{0,5,10},{0,5,10},{4,11,162},{4,9,94},{4,7,116},{4,7,100},{3,11,244},{3,8,76},{3,7,2},{3,6,106},{1,8,253},{1,6,100},{4,11,81},{4,9,13},{5,7,26},{4,7,19},{8,1,244},{3,8,76},{3,7,2},{1,6,91},{17,0,244}, +{1,6,91},{4,9,90},{4,9,90},{4,9,90},{4,6,99},{3,9,52},{3,7,1},{3,7,1},{3,6,25},{1,7,52},{1,6,19},{4,9,9},{4,9,9},{4,9,9},{4,6,18},{5,5,50},{3,7,1},{3,7,1},{1,6,10},{15,0,50},{1,6,10},{9,1,72},{4,9,4},{5,7,1},{3,7,1},{9,1,72},{19,0,72},{3,7,1},{0,6,90},{19,0,72},{0,6,90},{4,0,90}, +{4,0,90},{4,0,90},{4,0,90},{3,7,1},{3,7,1},{3,7,1},{3,5,1},{1,6,10},{1,6,10},{5,12,162},{5,10,94},{5,8,115},{5,8,99},{4,12,244},{4,9,77},{4,8,2},{4,7,116},{2,9,253},{2,7,100},{5,12,81},{5,10,13},{6,8,25},{5,8,18},{8,4,243},{4,9,76},{4,8,1},{2,7,91},{20,0,243},{2,7,91},{5,10,90},{5,10,90},{5,10,90}, +{5,7,99},{4,10,51},{4,8,2},{4,8,2},{4,6,27},{2,8,50},{2,7,19},{5,10,9},{5,10,9},{5,10,9},{5,7,18},{9,0,50},{4,8,1},{4,8,1},{2,7,10},{18,0,50},{2,7,10},{11,0,72},{5,10,4},{6,8,0},{4,8,1},{11,0,72},{22,0,72},{4,8,1},{0,7,90},{22,0,72},{0,7,90},{5,0,90},{5,0,90},{5,0,90},{5,0,90},{4,8,1}, +{4,8,1},{4,8,1},{4,6,2},{2,7,10},{2,7,10},{6,13,162},{6,11,94},{6,9,115},{6,9,99},{5,13,244},{5,10,77},{5,9,2},{5,8,106},{3,10,253},{3,8,84},{6,13,81},{6,11,13},{7,9,25},{6,9,18},{9,5,243},{5,10,76},{5,9,1},{3,8,80},{23,0,243},{3,8,80},{6,11,90},{6,11,90},{6,11,90},{6,8,94},{5,11,51},{5,9,2},{5,9,2}, +{5,7,27},{3,9,50},{3,8,20},{6,11,9},{6,11,9},{6,11,9},{6,8,13},{10,1,50},{5,9,1},{5,9,1},{3,8,16},{21,0,50},{3,8,16},{12,1,72},{6,11,4},{7,9,0},{5,9,1},{12,1,72},{25,0,72},{5,9,1},{0,8,80},{25,0,72},{0,8,80},{6,0,90},{6,0,90},{6,0,90},{6,0,90},{5,9,1},{5,9,1},{5,9,1},{5,7,2},{3,8,4}, +{3,8,4},{7,14,154},{7,12,84},{7,10,117},{7,10,85},{6,14,244},{6,11,75},{6,10,2},{6,9,106},{4,11,253},{4,9,100},{7,14,90},{7,12,20},{8,10,26},{7,10,21},{13,0,244},{6,11,75},{6,10,2},{4,9,91},{26,0,244},{4,9,91},{7,12,80},{7,12,80},{7,12,80},{7,10,84},{6,12,52},{6,10,1},{6,10,1},{6,9,25},{4,10,52},{4,9,19},{7,12,16}, +{7,12,16},{7,12,16},{7,10,20},{12,0,50},{6,10,1},{6,10,1},{4,9,10},{24,0,50},{4,9,10},{12,4,72},{7,12,4},{8,10,1},{6,10,1},{12,4,72},{28,0,72},{6,10,1},{0,9,90},{28,0,72},{0,9,90},{7,0,80},{7,0,80},{7,0,80},{7,0,80},{6,10,1},{6,10,1},{6,10,1},{6,8,1},{4,9,10},{4,9,10},{8,15,162},{8,13,94},{8,11,116}, +{8,11,100},{7,15,244},{7,12,76},{7,11,2},{7,10,106},{5,12,253},{5,10,100},{8,15,81},{8,13,13},{9,11,26},{8,11,19},{14,1,244},{7,12,76},{7,11,2},{5,10,91},{29,0,244},{5,10,91},{8,13,90},{8,13,90},{8,13,90},{8,10,99},{7,13,52},{7,11,1},{7,11,1},{7,10,25},{5,11,52},{5,10,19},{8,13,9},{8,13,9},{8,13,9},{8,10,18},{13,1,50}, +{7,11,1},{7,11,1},{5,10,10},{27,0,50},{5,10,10},{13,5,72},{8,13,4},{9,11,1},{7,11,1},{13,5,72},{31,0,72},{7,11,1},{0,10,90},{31,0,72},{0,10,90},{8,0,90},{8,0,90},{8,0,90},{8,0,90},{7,11,1},{7,11,1},{7,11,1},{7,9,1},{5,10,10},{5,10,10},{9,16,162},{9,14,94},{9,12,115},{9,12,99},{8,16,244},{8,13,77},{8,12,2}, +{8,11,116},{6,13,253},{6,11,100},{9,16,81},{9,14,13},{10,12,25},{9,12,18},{16,0,243},{8,13,76},{8,12,1},{6,11,91},{24,4,243},{6,11,91},{9,14,90},{9,14,90},{9,14,90},{9,11,99},{8,14,51},{8,12,2},{8,12,2},{8,10,27},{6,12,50},{6,11,19},{9,14,9},{9,14,9},{9,14,9},{9,11,18},{15,0,50},{8,12,1},{8,12,1},{6,11,10},{30,0,50}, +{6,11,10},{17,0,72},{9,14,4},{10,12,0},{8,12,1},{17,0,72},{30,2,72},{8,12,1},{0,11,90},{30,2,72},{0,11,90},{9,0,90},{9,0,90},{9,0,90},{9,0,90},{8,12,1},{8,12,1},{8,12,1},{8,10,2},{6,11,10},{6,11,10},{10,17,162},{10,15,94},{10,13,115},{10,13,99},{9,17,244},{9,14,77},{9,13,2},{9,12,106},{7,14,253},{7,12,84},{10,17,81}, +{10,15,13},{11,13,25},{10,13,18},{17,1,243},{9,14,76},{9,13,1},{7,12,80},{27,4,243},{7,12,80},{10,15,90},{10,15,90},{10,15,90},{10,12,94},{9,15,51},{9,13,2},{9,13,2},{9,11,27},{7,13,50},{7,12,20},{10,15,9},{10,15,9},{10,15,9},{10,12,13},{16,1,50},{9,13,1},{9,13,1},{7,12,16},{31,1,50},{7,12,16},{18,1,72},{10,15,4},{11,13,0}, +{9,13,1},{18,1,72},{31,3,72},{9,13,1},{0,12,80},{31,3,72},{0,12,80},{10,0,90},{10,0,90},{10,0,90},{10,0,90},{9,13,1},{9,13,1},{9,13,1},{9,11,2},{7,12,4},{7,12,4},{11,18,154},{11,16,84},{11,14,117},{11,14,85},{10,18,244},{10,15,75},{10,14,2},{10,13,106},{8,15,253},{8,13,100},{11,18,90},{11,16,20},{12,14,26},{11,14,21},{19,0,244}, +{10,15,75},{10,14,2},{8,13,91},{30,4,244},{8,13,91},{11,16,80},{11,16,80},{11,16,80},{11,14,84},{10,16,52},{10,14,1},{10,14,1},{10,13,25},{8,14,52},{8,13,19},{11,16,16},{11,16,16},{11,16,16},{11,14,20},{16,4,50},{10,14,1},{10,14,1},{8,13,10},{28,4,50},{8,13,10},{20,0,72},{11,16,4},{12,14,1},{10,14,1},{20,0,72},{24,8,72},{10,14,1}, +{0,13,90},{24,8,72},{0,13,90},{11,0,80},{11,0,80},{11,0,80},{11,0,80},{10,14,1},{10,14,1},{10,14,1},{10,12,1},{8,13,10},{8,13,10},{12,19,162},{12,17,94},{12,15,116},{12,15,100},{11,19,244},{11,16,76},{11,15,2},{11,14,106},{9,16,253},{9,14,100},{12,19,81},{12,17,13},{13,15,26},{12,15,19},{20,1,244},{11,16,76},{11,15,2},{9,14,91},{31,5,244}, +{9,14,91},{12,17,90},{12,17,90},{12,17,90},{12,14,99},{11,17,52},{11,15,1},{11,15,1},{11,14,25},{9,15,52},{9,14,19},{12,17,9},{12,17,9},{12,17,9},{12,14,18},{17,5,50},{11,15,1},{11,15,1},{9,14,10},{31,4,50},{9,14,10},{21,1,72},{12,17,4},{13,15,1},{11,15,1},{21,1,72},{27,8,72},{11,15,1},{0,14,90},{27,8,72},{0,14,90},{12,0,90}, +{12,0,90},{12,0,90},{12,0,90},{11,15,1},{11,15,1},{11,15,1},{11,13,1},{9,14,10},{9,14,10},{13,20,162},{13,18,94},{13,16,115},{13,16,99},{12,20,244},{12,17,77},{12,16,2},{12,15,116},{10,17,253},{10,15,100},{13,20,81},{13,18,13},{14,16,25},{13,16,18},{20,4,243},{12,17,76},{12,16,1},{10,15,91},{28,8,243},{10,15,91},{13,18,90},{13,18,90},{13,18,90}, +{13,15,99},{12,18,51},{12,16,2},{12,16,2},{12,14,27},{10,16,50},{10,15,19},{13,18,9},{13,18,9},{13,18,9},{13,15,18},{21,0,50},{12,16,1},{12,16,1},{10,15,10},{30,6,50},{10,15,10},{23,0,72},{13,18,4},{14,16,0},{12,16,1},{23,0,72},{30,8,72},{12,16,1},{0,15,90},{30,8,72},{0,15,90},{13,0,90},{13,0,90},{13,0,90},{13,0,90},{12,16,1}, +{12,16,1},{12,16,1},{12,14,2},{10,15,10},{10,15,10},{14,21,162},{14,19,94},{14,17,115},{14,17,99},{13,21,244},{13,18,77},{13,17,2},{13,16,106},{11,18,253},{11,16,84},{14,21,81},{14,19,13},{15,17,25},{14,17,18},{21,5,243},{13,18,76},{13,17,1},{11,16,80},{31,8,243},{11,16,80},{14,19,90},{14,19,90},{14,19,90},{14,16,94},{13,19,51},{13,17,2},{13,17,2}, +{13,15,27},{11,17,50},{11,16,20},{14,19,9},{14,19,9},{14,19,9},{14,16,13},{22,1,50},{13,17,1},{13,17,1},{11,16,16},{31,7,50},{11,16,16},{24,1,72},{14,19,4},{15,17,0},{13,17,1},{24,1,72},{31,9,72},{13,17,1},{0,16,80},{31,9,72},{0,16,80},{14,0,90},{14,0,90},{14,0,90},{14,0,90},{13,17,1},{13,17,1},{13,17,1},{13,15,2},{11,16,4}, +{11,16,4},{15,22,154},{15,20,84},{15,18,117},{15,18,85},{14,22,244},{14,19,75},{14,18,2},{14,17,106},{12,19,253},{12,17,100},{15,22,90},{15,20,20},{16,18,26},{15,18,21},{25,0,244},{14,19,75},{14,18,2},{12,17,91},{30,10,244},{12,17,91},{15,20,80},{15,20,80},{15,20,80},{15,18,84},{14,20,52},{14,18,1},{14,18,1},{14,17,25},{12,18,52},{12,17,19},{15,20,16}, +{15,20,16},{15,20,16},{15,18,20},{24,0,50},{14,18,1},{14,18,1},{12,17,10},{24,12,50},{12,17,10},{24,4,72},{15,20,4},{16,18,1},{14,18,1},{24,4,72},{28,12,72},{14,18,1},{0,17,90},{28,12,72},{0,17,90},{15,0,80},{15,0,80},{15,0,80},{15,0,80},{14,18,1},{14,18,1},{14,18,1},{14,16,1},{12,17,10},{12,17,10},{16,23,162},{16,21,94},{16,19,116}, +{16,19,100},{15,23,244},{15,20,76},{15,19,2},{15,18,106},{13,20,253},{13,18,100},{16,23,81},{16,21,13},{17,19,26},{16,19,19},{26,1,244},{15,20,76},{15,19,2},{13,18,91},{31,11,244},{13,18,91},{16,21,90},{16,21,90},{16,21,90},{16,18,99},{15,21,52},{15,19,1},{15,19,1},{15,18,25},{13,19,52},{13,18,19},{16,21,9},{16,21,9},{16,21,9},{16,18,18},{25,1,50}, +{15,19,1},{15,19,1},{13,18,10},{27,12,50},{13,18,10},{25,5,72},{16,21,4},{17,19,1},{15,19,1},{25,5,72},{31,12,72},{15,19,1},{0,18,90},{31,12,72},{0,18,90},{16,0,90},{16,0,90},{16,0,90},{16,0,90},{15,19,1},{15,19,1},{15,19,1},{15,17,1},{13,18,10},{13,18,10},{17,24,162},{17,22,94},{17,20,115},{17,20,99},{16,24,244},{16,21,77},{16,20,2}, +{16,19,116},{14,21,253},{14,19,100},{17,24,81},{17,22,13},{18,20,25},{17,20,18},{28,0,243},{16,21,76},{16,20,1},{14,19,91},{24,16,243},{14,19,91},{17,22,90},{17,22,90},{17,22,90},{17,19,99},{16,22,51},{16,20,2},{16,20,2},{16,18,27},{14,20,50},{14,19,19},{17,22,9},{17,22,9},{17,22,9},{17,19,18},{27,0,50},{16,20,1},{16,20,1},{14,19,10},{30,12,50}, +{14,19,10},{29,0,72},{17,22,4},{18,20,0},{16,20,1},{29,0,72},{30,14,72},{16,20,1},{0,19,90},{30,14,72},{0,19,90},{17,0,90},{17,0,90},{17,0,90},{17,0,90},{16,20,1},{16,20,1},{16,20,1},{16,18,2},{14,19,10},{14,19,10},{18,25,162},{18,23,94},{18,21,115},{18,21,99},{17,25,244},{17,22,77},{17,21,2},{17,20,106},{15,22,253},{15,20,84},{18,25,81}, +{18,23,13},{19,21,25},{18,21,18},{29,1,243},{17,22,76},{17,21,1},{15,20,80},{27,16,243},{15,20,80},{18,23,90},{18,23,90},{18,23,90},{18,20,94},{17,23,51},{17,21,2},{17,21,2},{17,19,27},{15,21,50},{15,20,20},{18,23,9},{18,23,9},{18,23,9},{18,20,13},{28,1,50},{17,21,1},{17,21,1},{15,20,16},{31,13,50},{15,20,16},{30,1,72},{18,23,4},{19,21,0}, +{17,21,1},{30,1,72},{31,15,72},{17,21,1},{0,20,80},{31,15,72},{0,20,80},{18,0,90},{18,0,90},{18,0,90},{18,0,90},{17,21,1},{17,21,1},{17,21,1},{17,19,2},{15,20,4},{15,20,4},{19,26,154},{19,24,84},{19,22,117},{19,22,85},{18,26,244},{18,23,75},{18,22,2},{18,21,106},{16,23,253},{16,21,100},{19,26,90},{19,24,20},{20,22,26},{19,22,21},{31,0,244}, +{18,23,75},{18,22,2},{16,21,91},{30,16,244},{16,21,91},{19,24,80},{19,24,80},{19,24,80},{19,22,84},{18,24,52},{18,22,1},{18,22,1},{18,21,25},{16,22,52},{16,21,19},{19,24,16},{19,24,16},{19,24,16},{19,22,20},{28,4,50},{18,22,1},{18,22,1},{16,21,10},{28,16,50},{16,21,10},{28,8,72},{19,24,4},{20,22,1},{18,22,1},{28,8,72},{24,20,72},{18,22,1}, +{0,21,90},{24,20,72},{0,21,90},{19,0,80},{19,0,80},{19,0,80},{19,0,80},{18,22,1},{18,22,1},{18,22,1},{18,20,1},{16,21,10},{16,21,10},{20,27,162},{20,25,94},{20,23,116},{20,23,100},{19,27,244},{19,24,76},{19,23,2},{19,22,106},{17,24,253},{17,22,100},{20,27,81},{20,25,13},{21,23,26},{20,23,19},{31,3,244},{19,24,76},{19,23,2},{17,22,91},{31,17,244}, +{17,22,91},{20,25,90},{20,25,90},{20,25,90},{20,22,99},{19,25,52},{19,23,1},{19,23,1},{19,22,25},{17,23,52},{17,22,19},{20,25,9},{20,25,9},{20,25,9},{20,22,18},{29,5,50},{19,23,1},{19,23,1},{17,22,10},{31,16,50},{17,22,10},{29,9,72},{20,25,4},{21,23,1},{19,23,1},{29,9,72},{27,20,72},{19,23,1},{0,22,90},{27,20,72},{0,22,90},{20,0,90}, +{20,0,90},{20,0,90},{20,0,90},{19,23,1},{19,23,1},{19,23,1},{19,21,1},{17,22,10},{17,22,10},{21,28,162},{21,26,94},{21,24,115},{21,24,99},{20,28,244},{20,25,77},{20,24,2},{20,23,116},{18,25,253},{18,23,100},{21,28,81},{21,26,13},{22,24,25},{21,24,18},{28,12,243},{20,25,76},{20,24,1},{18,23,91},{28,20,243},{18,23,91},{21,26,90},{21,26,90},{21,26,90}, +{21,23,99},{20,26,51},{20,24,2},{20,24,2},{20,22,27},{18,24,50},{18,23,19},{21,26,9},{21,26,9},{21,26,9},{21,23,18},{31,4,50},{20,24,1},{20,24,1},{18,23,10},{30,18,50},{18,23,10},{31,8,72},{21,26,4},{22,24,0},{20,24,1},{31,8,72},{30,20,72},{20,24,1},{0,23,90},{30,20,72},{0,23,90},{21,0,90},{21,0,90},{21,0,90},{21,0,90},{20,24,1}, +{20,24,1},{20,24,1},{20,22,2},{18,23,10},{18,23,10},{22,29,162},{22,27,94},{22,25,115},{22,25,99},{21,29,244},{21,26,77},{21,25,2},{21,24,106},{19,26,253},{19,24,84},{22,29,81},{22,27,13},{23,25,25},{22,25,18},{29,13,243},{21,26,76},{21,25,1},{19,24,80},{31,20,243},{19,24,80},{22,27,90},{22,27,90},{22,27,90},{22,24,94},{21,27,51},{21,25,2},{21,25,2}, +{21,23,27},{19,25,50},{19,24,20},{22,27,9},{22,27,9},{22,27,9},{22,24,13},{31,7,50},{21,25,1},{21,25,1},{19,24,16},{31,19,50},{19,24,16},{31,11,72},{22,27,4},{23,25,0},{21,25,1},{31,11,72},{31,21,72},{21,25,1},{0,24,80},{31,21,72},{0,24,80},{22,0,90},{22,0,90},{22,0,90},{22,0,90},{21,25,1},{21,25,1},{21,25,1},{21,23,2},{19,24,4}, +{19,24,4},{23,30,154},{23,28,84},{23,26,117},{23,26,85},{22,30,244},{22,27,75},{22,26,2},{22,25,106},{20,27,253},{20,25,100},{23,30,90},{23,28,20},{24,26,26},{23,26,21},{31,12,244},{22,27,75},{22,26,2},{20,25,91},{30,22,244},{20,25,91},{23,28,80},{23,28,80},{23,28,80},{23,26,84},{22,28,52},{22,26,1},{22,26,1},{22,25,25},{20,26,52},{20,25,19},{23,28,16}, +{23,28,16},{23,28,16},{23,26,20},{28,16,50},{22,26,1},{22,26,1},{20,25,10},{24,24,50},{20,25,10},{28,20,72},{23,28,4},{24,26,1},{22,26,1},{28,20,72},{28,24,72},{22,26,1},{0,25,90},{28,24,72},{0,25,90},{23,0,80},{23,0,80},{23,0,80},{23,0,80},{22,26,1},{22,26,1},{22,26,1},{22,24,1},{20,25,10},{20,25,10},{24,31,162},{24,29,94},{24,27,116}, +{24,27,100},{23,31,244},{23,28,76},{23,27,2},{23,26,106},{21,28,253},{21,26,100},{24,31,81},{24,29,13},{25,27,26},{24,27,19},{31,15,244},{23,28,76},{23,27,2},{21,26,91},{31,23,244},{21,26,91},{24,29,90},{24,29,90},{24,29,90},{24,26,99},{23,29,52},{23,27,1},{23,27,1},{23,26,25},{21,27,52},{21,26,19},{24,29,9},{24,29,9},{24,29,9},{24,26,18},{29,17,50}, +{23,27,1},{23,27,1},{21,26,10},{27,24,50},{21,26,10},{29,21,72},{24,29,4},{25,27,1},{23,27,1},{29,21,72},{31,24,72},{23,27,1},{0,26,90},{31,24,72},{0,26,90},{24,0,90},{24,0,90},{24,0,90},{24,0,90},{23,27,1},{23,27,1},{23,27,1},{23,25,1},{21,26,10},{21,26,10},{25,31,180},{25,30,94},{25,28,115},{25,28,99},{24,31,265},{24,29,77},{24,28,2}, +{24,27,116},{22,29,253},{22,27,100},{26,30,97},{25,30,13},{26,28,25},{25,28,18},{28,24,243},{24,29,76},{24,28,1},{22,27,91},{24,28,243},{22,27,91},{25,30,90},{25,30,90},{25,30,90},{25,27,99},{24,30,51},{24,28,2},{24,28,2},{24,26,27},{22,28,50},{22,27,19},{25,30,9},{25,30,9},{25,30,9},{25,27,18},{31,16,50},{24,28,1},{24,28,1},{22,27,10},{30,24,50}, +{22,27,10},{31,20,72},{25,30,4},{26,28,0},{24,28,1},{31,20,72},{30,26,72},{24,28,1},{0,27,90},{30,26,72},{0,27,90},{25,0,90},{25,0,90},{25,0,90},{25,0,90},{24,28,1},{24,28,1},{24,28,1},{24,26,2},{22,27,10},{22,27,10},{26,31,234},{26,31,94},{26,29,115},{26,29,99},{26,31,325},{25,30,77},{25,29,2},{25,28,106},{23,30,253},{23,28,84},{27,31,97}, +{26,31,13},{27,29,25},{26,29,18},{29,25,243},{25,30,76},{25,29,1},{23,28,80},{27,28,243},{23,28,80},{26,31,90},{26,31,90},{26,31,90},{26,28,94},{25,31,51},{25,29,2},{25,29,2},{25,27,27},{23,29,50},{23,28,20},{26,31,9},{26,31,9},{26,31,9},{26,28,13},{31,19,50},{25,29,1},{25,29,1},{23,28,16},{31,25,50},{23,28,16},{31,23,72},{26,31,4},{27,29,0}, +{25,29,1},{31,23,72},{31,27,72},{25,29,1},{0,28,80},{31,27,72},{0,28,80},{26,0,90},{26,0,90},{26,0,90},{26,0,90},{25,29,1},{25,29,1},{25,29,1},{25,27,2},{23,28,4},{23,28,4},{27,31,314},{27,31,105},{27,30,117},{27,30,85},{27,31,347},{26,31,75},{26,30,2},{26,29,106},{24,31,253},{24,29,100},{28,31,115},{28,31,35},{28,30,26},{27,30,21},{31,24,244}, +{26,31,75},{26,30,2},{24,29,91},{30,28,244},{24,29,91},{27,31,89},{27,31,89},{27,31,89},{27,30,84},{26,31,82},{26,30,1},{26,30,1},{26,29,25},{24,30,52},{24,29,19},{28,30,25},{28,30,25},{28,30,25},{27,30,20},{28,28,50},{26,30,1},{26,30,1},{24,29,10},{28,28,50},{24,29,10},{31,26,74},{28,31,10},{28,30,1},{26,30,1},{31,26,74},{30,29,74},{26,30,1}, +{0,29,90},{30,29,74},{0,29,90},{27,0,80},{27,0,80},{27,0,80},{27,0,80},{26,30,1},{26,30,1},{26,30,1},{26,28,1},{24,29,10},{24,29,10},{28,31,371},{28,31,179},{28,31,115},{28,31,99},{28,31,387},{27,31,122},{27,31,1},{27,30,89},{26,31,279},{25,30,83},{29,31,146},{29,31,61},{29,31,25},{28,31,18},{31,27,221},{28,31,98},{27,31,1},{25,30,74},{31,29,221}, +{25,30,74},{28,31,115},{28,31,115},{28,31,115},{28,30,99},{27,31,122},{27,31,1},{27,31,1},{27,30,25},{25,31,52},{25,30,19},{29,31,25},{29,31,25},{29,31,25},{28,30,18},{29,29,50},{27,31,1},{27,31,1},{25,30,10},{31,28,50},{25,30,10},{31,29,61},{30,31,34},{29,31,0},{27,31,0},{31,29,61},{31,30,61},{27,31,0},{0,30,73},{31,30,61},{0,30,73},{28,0,90}, +{28,0,90},{28,0,90},{28,0,90},{27,31,1},{27,31,1},{27,31,1},{27,29,1},{25,30,10},{25,30,10},{29,31,275},{29,31,190},{29,31,154},{29,31,99},{29,31,270},{28,31,99},{28,31,35},{28,31,35},{28,31,195},{26,31,19},{30,31,70},{30,31,43},{30,31,34},{29,31,18},{31,29,94},{29,31,49},{29,31,13},{26,31,10},{31,30,94},{26,31,10},{29,31,154},{29,31,154},{29,31,154}, +{29,31,99},{29,31,149},{28,31,35},{28,31,35},{28,30,27},{27,31,77},{26,31,19},{30,31,34},{30,31,34},{30,31,34},{29,31,18},{31,28,50},{29,31,13},{29,31,13},{26,31,10},{30,30,50},{26,31,10},{31,30,9},{31,31,9},{30,31,9},{30,31,0},{31,30,9},{30,31,9},{30,31,0},{0,31,9},{30,31,9},{0,31,9},{29,0,90},{29,0,90},{29,0,90},{29,0,90},{28,31,10}, +{28,31,10},{28,31,10},{28,30,2},{26,31,10},{26,31,10},{30,31,162},{30,31,135},{30,31,126},{30,31,99},{30,31,154},{30,31,100},{29,31,73},{29,31,2},{29,31,109},{28,31,10},{31,31,25},{31,31,25},{31,31,25},{30,31,18},{31,30,22},{30,31,19},{30,31,10},{29,31,1},{30,31,22},{29,31,1},{30,31,126},{30,31,126},{30,31,126},{30,31,99},{30,31,118},{29,31,73},{29,31,73}, +{29,31,2},{29,31,73},{28,31,10},{31,31,25},{31,31,25},{31,31,25},{30,31,18},{31,30,13},{30,31,10},{30,31,10},{29,31,1},{30,31,13},{29,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{30,0,90},{30,0,90},{30,0,90},{30,0,90},{29,31,37},{29,31,37},{29,31,37},{29,31,2},{28,31,10}, +{28,31,10},{0,7,200},{0,5,20},{0,4,20},{0,3,74},{0,5,441},{0,3,282},{0,3,138},{0,2,318},{0,2,487},{0,2,343},{0,7,200},{0,5,20},{0,4,20},{0,3,74},{2,1,441},{0,3,282},{0,3,138},{0,2,318},{5,0,441},{0,2,318},{0,3,1},{0,3,1},{0,3,1},{0,2,1},{0,2,41},{0,1,20},{0,1,20},{0,1,26},{0,1,45},{0,1,30},{0,3,1}, +{0,3,1},{0,3,1},{0,2,1},{1,0,41},{0,1,20},{0,1,20},{0,1,26},{2,0,41},{0,1,26},{1,5,200},{0,5,20},{0,4,20},{0,3,74},{1,5,200},{7,0,200},{0,3,74},{0,2,218},{7,0,200},{0,2,218},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,10,200},{0,7,5},{0,5,32}, +{0,4,41},{0,7,689},{0,5,369},{0,4,162},{0,3,474},{0,3,762},{0,3,538},{0,10,200},{0,7,5},{0,5,32},{0,4,41},{3,1,686},{0,5,369},{0,4,162},{0,3,474},{3,2,686},{0,3,474},{0,6,1},{0,6,1},{0,6,1},{0,3,1},{0,3,145},{0,3,65},{0,3,65},{0,2,101},{0,1,173},{0,1,110},{0,6,1},{0,6,1},{0,6,1},{0,3,1},{1,1,145}, +{0,3,65},{0,3,65},{0,2,101},{3,0,145},{0,2,101},{5,0,200},{0,7,5},{1,4,17},{0,4,41},{5,0,200},{10,0,200},{0,4,41},{0,3,218},{10,0,200},{0,3,218},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,13,249},{0,8,59},{1,6,97},{0,5,69},{0,10,728},{0,6,299},{0,5,56}, +{0,4,433},{0,4,884},{0,4,554},{1,11,201},{1,8,6},{1,6,33},{1,5,42},{5,0,728},{0,6,299},{0,5,56},{0,4,433},{10,0,728},{0,4,433},{0,9,50},{0,9,50},{0,9,50},{0,5,53},{0,6,162},{0,4,25},{0,4,25},{0,3,82},{0,3,226},{0,2,115},{1,7,2},{1,7,2},{1,7,2},{1,4,2},{3,0,162},{0,4,25},{0,4,25},{0,3,82},{6,0,162}, +{0,3,82},{6,1,200},{1,8,5},{2,5,17},{0,5,20},{6,1,200},{13,0,200},{0,5,20},{0,4,208},{13,0,200},{0,4,208},{0,0,49},{0,0,49},{0,0,49},{0,0,49},{0,3,1},{0,3,1},{0,3,1},{0,1,4},{0,1,8},{0,1,8},{1,14,313},{1,9,123},{1,7,210},{1,6,133},{0,12,724},{0,8,251},{0,6,18},{0,5,352},{0,6,987},{0,5,521},{2,12,201}, +{2,9,6},{2,7,33},{2,6,42},{4,4,724},{0,8,251},{0,6,18},{0,5,352},{12,0,724},{0,5,352},{1,10,114},{1,10,114},{1,10,114},{1,6,117},{0,9,162},{0,6,2},{0,6,2},{0,4,49},{0,4,291},{0,3,146},{2,8,2},{2,8,2},{2,8,2},{2,5,2},{4,1,162},{0,6,2},{0,6,2},{0,4,49},{9,0,162},{0,4,49},{7,2,200},{2,9,5},{3,6,17}, +{0,6,17},{7,2,200},{14,1,200},{0,6,17},{0,5,208},{14,1,200},{0,5,208},{1,0,113},{1,0,113},{1,0,113},{1,0,113},{0,6,1},{0,6,1},{0,6,1},{0,3,1},{0,2,50},{0,2,50},{2,15,410},{2,11,221},{2,8,324},{2,7,234},{1,14,739},{0,10,233},{0,8,40},{0,6,298},{0,7,1013},{0,6,426},{3,13,202},{3,10,1},{3,8,32},{3,7,41},{7,2,723}, +{0,10,217},{0,8,24},{0,6,282},{14,1,723},{0,6,282},{2,12,209},{2,12,209},{2,12,209},{2,7,209},{0,12,178},{1,7,20},{1,7,20},{0,5,26},{0,6,308},{0,5,91},{3,10,1},{3,10,1},{3,10,1},{3,6,4},{4,4,162},{1,7,4},{1,7,4},{0,5,10},{12,0,162},{0,5,10},{9,1,200},{3,10,1},{4,8,20},{0,8,20},{9,1,200},{19,0,200},{0,8,20}, +{0,6,218},{19,0,200},{0,6,218},{2,0,208},{2,0,208},{2,0,208},{2,0,208},{1,7,16},{1,7,16},{1,7,16},{1,4,16},{0,4,53},{0,4,53},{3,16,408},{3,12,225},{3,9,324},{3,8,228},{2,15,739},{1,11,233},{2,8,33},{1,7,298},{0,9,875},{0,7,303},{4,14,201},{4,11,6},{4,9,33},{4,8,42},{7,5,723},{0,11,204},{2,8,17},{0,7,254},{15,2,723}, +{0,7,254},{3,12,209},{3,12,209},{3,12,209},{3,8,212},{1,13,178},{2,8,17},{2,8,17},{1,6,26},{0,7,229},{0,6,17},{4,10,2},{4,10,2},{4,10,2},{4,7,2},{5,5,162},{2,8,1},{2,8,1},{0,6,1},{15,0,162},{0,6,1},{11,0,200},{4,11,5},{5,8,17},{2,8,17},{11,0,200},{22,0,200},{2,8,17},{0,7,218},{22,0,200},{0,7,218},{3,0,208}, +{3,0,208},{3,0,208},{3,0,208},{2,8,16},{2,8,16},{2,8,16},{2,5,16},{0,6,16},{0,6,16},{4,17,418},{4,12,228},{4,10,315},{4,9,238},{3,16,744},{2,11,234},{3,9,33},{2,8,305},{0,11,828},{0,8,228},{5,15,201},{5,12,6},{5,10,33},{5,9,42},{11,0,728},{1,12,204},{3,9,17},{0,8,224},{22,0,728},{0,8,224},{4,13,219},{4,13,219},{4,13,219}, +{4,9,222},{3,12,178},{3,9,17},{3,9,17},{2,7,26},{0,9,178},{0,7,6},{5,11,2},{5,11,2},{5,11,2},{5,8,2},{9,0,162},{3,9,1},{3,9,1},{1,7,1},{18,0,162},{1,7,1},{12,1,200},{5,12,5},{6,9,17},{3,9,17},{12,1,200},{25,0,200},{3,9,17},{0,8,208},{25,0,200},{0,8,208},{4,0,218},{4,0,218},{4,0,218},{4,0,218},{3,9,16}, +{3,9,16},{3,9,16},{3,6,16},{0,7,5},{0,7,5},{5,18,418},{5,13,228},{5,11,315},{5,10,238},{3,19,744},{3,12,225},{3,11,40},{3,9,305},{0,12,749},{0,9,225},{6,16,201},{6,13,6},{6,11,33},{6,10,42},{12,0,724},{2,13,204},{4,10,18},{0,9,209},{24,0,724},{0,9,209},{5,14,219},{5,14,219},{5,14,219},{5,10,222},{3,15,178},{3,11,24},{3,11,24}, +{3,8,32},{1,10,178},{1,8,5},{6,12,2},{6,12,2},{6,12,2},{6,9,2},{10,1,162},{4,10,2},{4,10,2},{2,8,1},{21,0,162},{2,8,1},{14,0,200},{6,13,5},{7,10,17},{4,10,17},{14,0,200},{26,1,200},{4,10,17},{0,9,208},{26,1,200},{0,9,208},{5,0,218},{5,0,218},{5,0,218},{5,0,218},{3,12,17},{3,12,17},{3,12,17},{3,7,20},{1,8,5}, +{1,8,5},{6,19,410},{6,15,221},{6,12,324},{6,11,234},{5,18,739},{4,14,233},{4,12,40},{4,10,298},{0,14,724},{2,10,228},{7,17,202},{7,14,1},{7,12,32},{7,11,41},{14,0,723},{3,14,211},{4,12,24},{1,10,218},{26,1,723},{1,10,218},{6,16,209},{6,16,209},{6,16,209},{6,11,209},{4,16,178},{5,11,20},{5,11,20},{4,9,26},{1,12,171},{3,9,10},{7,14,1}, +{7,14,1},{7,14,1},{7,10,4},{12,0,162},{5,11,4},{5,11,4},{3,9,1},{24,0,162},{3,9,1},{13,5,200},{7,14,1},{8,12,20},{3,12,17},{13,5,200},{31,0,200},{3,12,17},{0,10,218},{31,0,200},{0,10,218},{6,0,208},{6,0,208},{6,0,208},{6,0,208},{5,11,16},{5,11,16},{5,11,16},{5,8,16},{3,9,9},{3,9,9},{7,20,408},{7,16,225},{7,13,324}, +{7,12,228},{6,19,739},{5,15,233},{6,12,33},{5,11,298},{1,15,724},{3,11,228},{8,18,201},{8,15,6},{8,13,33},{8,12,42},{15,1,723},{4,15,204},{6,12,17},{2,11,218},{27,2,723},{2,11,218},{7,16,209},{7,16,209},{7,16,209},{7,12,212},{5,17,178},{6,12,17},{6,12,17},{5,10,26},{2,13,171},{3,10,14},{8,14,2},{8,14,2},{8,14,2},{8,11,2},{13,1,162}, +{6,12,1},{6,12,1},{4,10,1},{27,0,162},{4,10,1},{17,0,200},{8,15,5},{9,12,17},{6,12,17},{17,0,200},{30,2,200},{6,12,17},{0,11,218},{30,2,200},{0,11,218},{7,0,208},{7,0,208},{7,0,208},{7,0,208},{6,12,16},{6,12,16},{6,12,16},{6,9,16},{3,11,10},{3,11,10},{8,21,418},{8,16,228},{8,14,315},{8,13,238},{7,20,744},{6,15,234},{7,13,33}, +{6,12,305},{2,16,729},{3,12,225},{9,19,201},{9,16,6},{9,14,33},{9,13,42},{17,0,728},{5,16,204},{7,13,17},{3,12,209},{30,2,728},{3,12,209},{8,17,219},{8,17,219},{8,17,219},{8,13,222},{7,16,178},{7,13,17},{7,13,17},{6,11,26},{3,14,171},{4,11,6},{9,15,2},{9,15,2},{9,15,2},{9,12,2},{15,0,162},{7,13,1},{7,13,1},{5,11,1},{30,0,162}, +{5,11,1},{18,1,200},{9,16,5},{10,13,17},{7,13,17},{18,1,200},{31,3,200},{7,13,17},{0,12,208},{31,3,200},{0,12,208},{8,0,218},{8,0,218},{8,0,218},{8,0,218},{7,13,16},{7,13,16},{7,13,16},{7,10,16},{4,11,5},{4,11,5},{9,22,418},{9,17,228},{9,15,315},{9,14,238},{7,23,744},{7,16,225},{7,15,40},{7,13,305},{3,17,729},{4,13,225},{10,20,201}, +{10,17,6},{10,15,33},{10,14,42},{16,4,724},{6,17,204},{8,14,18},{4,13,209},{28,4,724},{4,13,209},{9,18,219},{9,18,219},{9,18,219},{9,14,222},{7,19,178},{7,15,24},{7,15,24},{7,12,32},{5,14,178},{5,12,5},{10,16,2},{10,16,2},{10,16,2},{10,13,2},{16,1,162},{8,14,2},{8,14,2},{6,12,1},{31,1,162},{6,12,1},{19,2,200},{10,17,5},{11,14,17}, +{8,14,17},{19,2,200},{30,5,200},{8,14,17},{0,13,208},{30,5,200},{0,13,208},{9,0,218},{9,0,218},{9,0,218},{9,0,218},{7,16,17},{7,16,17},{7,16,17},{7,11,20},{5,12,5},{5,12,5},{10,23,410},{10,19,221},{10,16,324},{10,15,234},{9,22,739},{8,18,233},{8,16,40},{8,14,298},{4,18,724},{6,14,228},{11,21,202},{11,18,1},{11,16,32},{11,15,41},{19,2,723}, +{7,18,211},{8,16,24},{5,14,218},{30,5,723},{5,14,218},{10,20,209},{10,20,209},{10,20,209},{10,15,209},{8,20,178},{9,15,20},{9,15,20},{8,13,26},{5,16,171},{7,13,10},{11,18,1},{11,18,1},{11,18,1},{11,14,4},{16,4,162},{9,15,4},{9,15,4},{7,13,1},{28,4,162},{7,13,1},{21,1,200},{11,18,1},{12,16,20},{7,16,17},{21,1,200},{27,8,200},{7,16,17}, +{0,14,218},{27,8,200},{0,14,218},{10,0,208},{10,0,208},{10,0,208},{10,0,208},{9,15,16},{9,15,16},{9,15,16},{9,12,16},{7,13,9},{7,13,9},{11,24,408},{11,20,225},{11,17,324},{11,16,228},{10,23,739},{9,19,233},{10,16,33},{9,15,298},{5,19,724},{7,15,228},{12,22,201},{12,19,6},{12,17,33},{12,16,42},{19,5,723},{8,19,204},{10,16,17},{6,15,218},{31,6,723}, +{6,15,218},{11,20,209},{11,20,209},{11,20,209},{11,16,212},{9,21,178},{10,16,17},{10,16,17},{9,14,26},{6,17,171},{7,14,14},{12,18,2},{12,18,2},{12,18,2},{12,15,2},{17,5,162},{10,16,1},{10,16,1},{8,14,1},{31,4,162},{8,14,1},{23,0,200},{12,19,5},{13,16,17},{10,16,17},{23,0,200},{30,8,200},{10,16,17},{0,15,218},{30,8,200},{0,15,218},{11,0,208}, +{11,0,208},{11,0,208},{11,0,208},{10,16,16},{10,16,16},{10,16,16},{10,13,16},{7,15,10},{7,15,10},{12,25,418},{12,20,228},{12,18,315},{12,17,238},{11,24,744},{10,19,234},{11,17,33},{10,16,305},{6,20,729},{7,16,225},{13,23,201},{13,20,6},{13,18,33},{13,17,42},{23,0,728},{9,20,204},{11,17,17},{7,16,209},{30,8,728},{7,16,209},{12,21,219},{12,21,219},{12,21,219}, +{12,17,222},{11,20,178},{11,17,17},{11,17,17},{10,15,26},{7,18,171},{8,15,6},{13,19,2},{13,19,2},{13,19,2},{13,16,2},{21,0,162},{11,17,1},{11,17,1},{9,15,1},{30,6,162},{9,15,1},{24,1,200},{13,20,5},{14,17,17},{11,17,17},{24,1,200},{31,9,200},{11,17,17},{0,16,208},{31,9,200},{0,16,208},{12,0,218},{12,0,218},{12,0,218},{12,0,218},{11,17,16}, +{11,17,16},{11,17,16},{11,14,16},{8,15,5},{8,15,5},{13,26,418},{13,21,228},{13,19,315},{13,18,238},{11,27,744},{11,20,225},{11,19,40},{11,17,305},{7,21,729},{8,17,225},{14,24,201},{14,21,6},{14,19,33},{14,18,42},{24,0,724},{10,21,204},{12,18,18},{8,17,209},{24,12,724},{8,17,209},{13,22,219},{13,22,219},{13,22,219},{13,18,222},{11,23,178},{11,19,24},{11,19,24}, +{11,16,32},{9,18,178},{9,16,5},{14,20,2},{14,20,2},{14,20,2},{14,17,2},{22,1,162},{12,18,2},{12,18,2},{10,16,1},{31,7,162},{10,16,1},{26,0,200},{14,21,5},{15,18,17},{12,18,17},{26,0,200},{30,11,200},{12,18,17},{0,17,208},{30,11,200},{0,17,208},{13,0,218},{13,0,218},{13,0,218},{13,0,218},{11,20,17},{11,20,17},{11,20,17},{11,15,20},{9,16,5}, +{9,16,5},{14,27,410},{14,23,221},{14,20,324},{14,19,234},{13,26,739},{12,22,233},{12,20,40},{12,18,298},{8,22,724},{10,18,228},{15,25,202},{15,22,1},{15,20,32},{15,19,41},{26,0,723},{11,22,211},{12,20,24},{9,18,218},{30,11,723},{9,18,218},{14,24,209},{14,24,209},{14,24,209},{14,19,209},{12,24,178},{13,19,20},{13,19,20},{12,17,26},{9,20,171},{11,17,10},{15,22,1}, +{15,22,1},{15,22,1},{15,18,4},{24,0,162},{13,19,4},{13,19,4},{11,17,1},{24,12,162},{11,17,1},{25,5,200},{15,22,1},{16,20,20},{11,20,17},{25,5,200},{31,12,200},{11,20,17},{0,18,218},{31,12,200},{0,18,218},{14,0,208},{14,0,208},{14,0,208},{14,0,208},{13,19,16},{13,19,16},{13,19,16},{13,16,16},{11,17,9},{11,17,9},{15,28,408},{15,24,225},{15,21,324}, +{15,20,228},{14,27,739},{13,23,233},{14,20,33},{13,19,298},{9,23,724},{11,19,228},{16,26,201},{16,23,6},{16,21,33},{16,20,42},{27,1,723},{12,23,204},{14,20,17},{10,19,218},{27,14,723},{10,19,218},{15,24,209},{15,24,209},{15,24,209},{15,20,212},{13,25,178},{14,20,17},{14,20,17},{13,18,26},{10,21,171},{11,18,14},{16,22,2},{16,22,2},{16,22,2},{16,19,2},{25,1,162}, +{14,20,1},{14,20,1},{12,18,1},{27,12,162},{12,18,1},{29,0,200},{16,23,5},{17,20,17},{14,20,17},{29,0,200},{30,14,200},{14,20,17},{0,19,218},{30,14,200},{0,19,218},{15,0,208},{15,0,208},{15,0,208},{15,0,208},{14,20,16},{14,20,16},{14,20,16},{14,17,16},{11,19,10},{11,19,10},{16,29,418},{16,24,228},{16,22,315},{16,21,238},{15,28,744},{14,23,234},{15,21,33}, +{14,20,305},{10,24,729},{11,20,225},{17,27,201},{17,24,6},{17,22,33},{17,21,42},{29,0,728},{13,24,204},{15,21,17},{11,20,209},{30,14,728},{11,20,209},{16,25,219},{16,25,219},{16,25,219},{16,21,222},{15,24,178},{15,21,17},{15,21,17},{14,19,26},{11,22,171},{12,19,6},{17,23,2},{17,23,2},{17,23,2},{17,20,2},{27,0,162},{15,21,1},{15,21,1},{13,19,1},{30,12,162}, +{13,19,1},{30,1,200},{17,24,5},{18,21,17},{15,21,17},{30,1,200},{31,15,200},{15,21,17},{0,20,208},{31,15,200},{0,20,208},{16,0,218},{16,0,218},{16,0,218},{16,0,218},{15,21,16},{15,21,16},{15,21,16},{15,18,16},{12,19,5},{12,19,5},{17,30,418},{17,25,228},{17,23,315},{17,22,238},{15,31,744},{15,24,225},{15,23,40},{15,21,305},{11,25,729},{12,21,225},{18,28,201}, +{18,25,6},{18,23,33},{18,22,42},{28,4,724},{14,25,204},{16,22,18},{12,21,209},{28,16,724},{12,21,209},{17,26,219},{17,26,219},{17,26,219},{17,22,222},{15,27,178},{15,23,24},{15,23,24},{15,20,32},{13,22,178},{13,20,5},{18,24,2},{18,24,2},{18,24,2},{18,21,2},{28,1,162},{16,22,2},{16,22,2},{14,20,1},{31,13,162},{14,20,1},{31,2,200},{18,25,5},{19,22,17}, +{16,22,17},{31,2,200},{30,17,200},{16,22,17},{0,21,208},{30,17,200},{0,21,208},{17,0,218},{17,0,218},{17,0,218},{17,0,218},{15,24,17},{15,24,17},{15,24,17},{15,19,20},{13,20,5},{13,20,5},{18,31,410},{18,27,221},{18,24,324},{18,23,234},{17,30,739},{16,26,233},{16,24,40},{16,22,298},{12,26,724},{14,22,228},{19,29,202},{19,26,1},{19,24,32},{19,23,41},{31,2,723}, +{15,26,211},{16,24,24},{13,22,218},{30,17,723},{13,22,218},{18,28,209},{18,28,209},{18,28,209},{18,23,209},{16,28,178},{17,23,20},{17,23,20},{16,21,26},{13,24,171},{15,21,10},{19,26,1},{19,26,1},{19,26,1},{19,22,4},{28,4,162},{17,23,4},{17,23,4},{15,21,1},{28,16,162},{15,21,1},{29,9,200},{19,26,1},{20,24,20},{15,24,17},{29,9,200},{27,20,200},{15,24,17}, +{0,22,218},{27,20,200},{0,22,218},{18,0,208},{18,0,208},{18,0,208},{18,0,208},{17,23,16},{17,23,16},{17,23,16},{17,20,16},{15,21,9},{15,21,9},{19,31,426},{19,28,225},{19,25,324},{19,24,228},{18,31,739},{17,27,233},{18,24,33},{17,23,298},{13,27,724},{15,23,228},{20,30,201},{20,27,6},{20,25,33},{20,24,42},{31,5,723},{16,27,204},{18,24,17},{14,23,218},{31,18,723}, +{14,23,218},{19,28,209},{19,28,209},{19,28,209},{19,24,212},{17,29,178},{18,24,17},{18,24,17},{17,22,26},{14,25,171},{15,22,14},{20,26,2},{20,26,2},{20,26,2},{20,23,2},{29,5,162},{18,24,1},{18,24,1},{16,22,1},{31,16,162},{16,22,1},{31,8,200},{20,27,5},{21,24,17},{18,24,17},{31,8,200},{30,20,200},{18,24,17},{0,23,218},{30,20,200},{0,23,218},{19,0,208}, +{19,0,208},{19,0,208},{19,0,208},{18,24,16},{18,24,16},{18,24,16},{18,21,16},{15,23,10},{15,23,10},{20,31,468},{20,28,228},{20,26,315},{20,25,238},{19,31,747},{18,27,234},{19,25,33},{18,24,305},{14,28,729},{15,24,225},{21,31,201},{21,28,6},{21,26,33},{21,25,42},{31,8,728},{17,28,204},{19,25,17},{15,24,209},{30,20,728},{15,24,209},{20,29,219},{20,29,219},{20,29,219}, +{20,25,222},{19,28,178},{19,25,17},{19,25,17},{18,23,26},{15,26,171},{16,23,6},{21,27,2},{21,27,2},{21,27,2},{21,24,2},{31,4,162},{19,25,1},{19,25,1},{17,23,1},{30,18,162},{17,23,1},{31,11,200},{21,28,5},{22,25,17},{19,25,17},{31,11,200},{31,21,200},{19,25,17},{0,24,208},{31,21,200},{0,24,208},{20,0,218},{20,0,218},{20,0,218},{20,0,218},{19,25,16}, +{19,25,16},{19,25,16},{19,22,16},{16,23,5},{16,23,5},{21,31,546},{21,29,228},{21,27,315},{21,26,238},{20,31,788},{19,28,225},{19,27,40},{19,25,305},{15,29,729},{16,25,225},{22,31,219},{22,29,6},{22,27,33},{22,26,42},{28,16,724},{18,29,204},{20,26,18},{16,25,209},{24,24,724},{16,25,209},{21,30,219},{21,30,219},{21,30,219},{21,26,222},{19,31,178},{19,27,24},{19,27,24}, +{19,24,32},{17,26,178},{17,24,5},{22,28,2},{22,28,2},{22,28,2},{22,25,2},{31,7,162},{20,26,2},{20,26,2},{18,24,1},{31,19,162},{18,24,1},{31,14,200},{22,29,5},{23,26,17},{20,26,17},{31,14,200},{30,23,200},{20,26,17},{0,25,208},{30,23,200},{0,25,208},{21,0,218},{21,0,218},{21,0,218},{21,0,218},{19,28,17},{19,28,17},{19,28,17},{19,23,20},{17,24,5}, +{17,24,5},{23,31,672},{22,31,221},{22,28,324},{22,27,234},{22,31,888},{20,30,233},{20,28,40},{20,26,298},{16,30,724},{18,26,228},{23,31,272},{23,30,1},{23,28,32},{23,27,41},{31,14,723},{19,30,211},{20,28,24},{17,26,218},{30,23,723},{17,26,218},{22,31,212},{22,31,212},{22,31,212},{22,27,209},{21,30,180},{21,27,20},{21,27,20},{20,25,26},{17,28,171},{19,25,10},{23,30,1}, +{23,30,1},{23,30,1},{23,26,4},{28,16,162},{21,27,4},{21,27,4},{19,25,1},{24,24,162},{19,25,1},{29,21,200},{23,30,1},{24,28,20},{19,28,17},{29,21,200},{31,24,200},{19,28,17},{0,26,218},{31,24,200},{0,26,218},{22,0,208},{22,0,208},{22,0,208},{22,0,208},{21,27,16},{21,27,16},{21,27,16},{21,24,16},{19,25,9},{19,25,9},{24,31,770},{23,31,228},{23,29,324}, +{23,28,228},{23,31,932},{21,31,233},{22,28,33},{21,27,298},{17,31,724},{19,27,228},{25,31,299},{24,31,6},{24,29,33},{24,28,42},{31,17,723},{20,31,204},{22,28,17},{18,27,218},{27,26,723},{18,27,218},{23,31,224},{23,31,224},{23,31,224},{23,28,212},{22,31,180},{22,28,17},{22,28,17},{21,26,26},{18,29,171},{19,26,14},{24,30,2},{24,30,2},{24,30,2},{24,27,2},{29,17,162}, +{22,28,1},{22,28,1},{20,26,1},{27,24,162},{20,26,1},{31,20,200},{24,31,5},{25,28,17},{22,28,17},{31,20,200},{30,26,200},{22,28,17},{0,27,218},{30,26,200},{0,27,218},{23,0,208},{23,0,208},{23,0,208},{23,0,208},{22,28,16},{22,28,16},{22,28,16},{22,25,16},{19,27,10},{19,27,10},{25,31,884},{24,31,303},{24,30,315},{24,29,238},{24,31,1025},{22,31,234},{23,29,33}, +{22,28,305},{19,31,747},{19,28,225},{26,31,353},{25,31,27},{25,30,33},{25,29,42},{31,20,728},{22,31,218},{23,29,17},{19,28,209},{30,26,728},{19,28,209},{24,31,254},{24,31,254},{24,31,254},{24,29,222},{23,31,196},{23,29,17},{23,29,17},{22,27,26},{19,30,171},{20,27,6},{25,31,2},{25,31,2},{25,31,2},{25,28,2},{31,16,162},{23,29,1},{23,29,1},{21,27,1},{30,24,162}, +{21,27,1},{31,23,200},{26,31,20},{26,29,17},{23,29,17},{31,23,200},{31,27,200},{23,29,17},{0,28,208},{31,27,200},{0,28,208},{24,0,218},{24,0,218},{24,0,218},{24,0,218},{23,29,16},{23,29,16},{23,29,16},{23,26,16},{20,27,5},{20,27,5},{26,31,1034},{25,31,468},{25,31,315},{25,30,238},{25,31,1172},{24,31,291},{23,31,40},{23,29,305},{21,31,837},{20,29,225},{27,31,409}, +{26,31,117},{26,31,33},{26,30,42},{28,28,724},{24,31,266},{24,30,18},{20,29,209},{28,28,724},{20,29,209},{25,31,299},{25,31,299},{25,31,299},{25,30,222},{24,31,237},{23,31,24},{23,31,24},{23,28,32},{21,30,178},{21,28,5},{26,31,17},{26,31,17},{26,31,17},{26,29,2},{31,19,162},{24,30,2},{24,30,2},{22,28,1},{31,25,162},{22,28,1},{31,26,200},{27,31,53},{27,30,17}, +{24,30,17},{31,26,200},{30,29,200},{24,30,17},{0,29,208},{30,29,200},{0,29,208},{25,0,218},{25,0,218},{25,0,218},{25,0,218},{23,31,20},{23,31,20},{23,31,20},{23,27,20},{21,28,5},{21,28,5},{27,31,933},{27,31,570},{26,31,377},{26,31,209},{27,31,1054},{25,31,309},{25,31,20},{24,30,193},{23,31,735},{22,30,123},{28,31,338},{28,31,146},{27,31,49},{27,31,16},{29,29,546}, +{26,31,222},{25,31,4},{21,30,113},{31,28,546},{21,30,113},{26,31,377},{26,31,377},{26,31,377},{26,31,209},{26,31,338},{25,31,20},{25,31,20},{24,29,26},{22,31,173},{23,29,10},{27,31,49},{27,31,49},{27,31,49},{27,30,4},{28,28,162},{25,31,4},{25,31,4},{23,29,1},{28,28,162},{23,29,1},{31,28,113},{29,31,52},{28,31,1},{26,31,1},{31,28,113},{30,30,113},{26,31,1}, +{0,30,113},{30,30,113},{0,30,113},{26,0,208},{26,0,208},{26,0,208},{26,0,208},{25,31,16},{25,31,16},{25,31,16},{25,28,16},{23,29,9},{23,29,9},{28,31,779},{27,31,554},{27,31,433},{27,31,224},{28,31,859},{26,31,270},{26,31,74},{25,30,90},{24,31,590},{23,31,59},{29,31,218},{29,31,133},{28,31,82},{28,31,2},{31,27,333},{27,31,146},{27,31,25},{22,31,49},{31,29,333}, +{22,31,49},{27,31,433},{27,31,433},{27,31,433},{27,31,224},{27,31,378},{26,31,74},{26,31,74},{25,30,26},{24,31,229},{23,30,14},{28,31,82},{28,31,82},{28,31,82},{28,31,2},{29,29,162},{27,31,25},{27,31,25},{24,30,1},{31,28,162},{24,30,1},{31,30,25},{30,31,10},{30,31,1},{28,31,1},{31,30,25},{30,31,25},{28,31,1},{0,31,49},{30,31,25},{0,31,49},{27,0,208}, +{27,0,208},{27,0,208},{27,0,208},{26,31,25},{26,31,25},{26,31,25},{26,29,16},{23,31,10},{23,31,10},{29,31,684},{28,31,538},{28,31,474},{28,31,282},{28,31,682},{27,31,283},{27,31,162},{26,31,25},{26,31,482},{24,31,5},{30,31,153},{30,31,126},{30,31,117},{29,31,37},{31,29,193},{29,31,108},{28,31,65},{25,31,0},{31,30,193},{25,31,0},{28,31,474},{28,31,474},{28,31,474}, +{28,31,282},{28,31,426},{27,31,162},{27,31,162},{26,31,25},{26,31,286},{24,31,5},{30,31,117},{30,31,117},{30,31,117},{29,31,37},{31,28,145},{28,31,65},{28,31,65},{25,31,0},{30,30,145},{25,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{28,0,218},{28,0,218},{28,0,218},{28,0,218},{27,31,41}, +{27,31,41},{27,31,41},{27,30,16},{24,31,5},{24,31,5},{29,31,460},{29,31,375},{29,31,339},{29,31,254},{29,31,415},{28,31,202},{28,31,138},{27,31,20},{27,31,295},{26,31,26},{30,31,73},{30,31,46},{30,31,37},{30,31,10},{31,30,54},{30,31,27},{30,31,18},{28,31,1},{30,31,54},{28,31,1},{29,31,339},{29,31,339},{29,31,339},{29,31,254},{29,31,294},{28,31,138},{28,31,138}, +{27,31,20},{27,31,174},{26,31,26},{30,31,37},{30,31,37},{30,31,37},{30,31,10},{31,29,45},{30,31,18},{30,31,18},{28,31,1},{31,30,45},{28,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{29,0,218},{29,0,218},{29,0,218},{29,0,218},{28,31,74},{28,31,74},{28,31,74},{27,31,20},{26,31,26}, +{26,31,26},{0,10,421},{0,7,52},{0,5,1},{0,4,162},{0,7,926},{0,5,590},{0,4,283},{0,3,701},{0,3,1005},{0,3,765},{0,10,421},{0,7,52},{0,5,1},{0,4,162},{3,1,925},{0,5,590},{0,4,283},{0,3,701},{3,2,925},{0,3,701},{0,5,0},{0,5,0},{0,5,0},{0,2,9},{0,2,89},{0,2,34},{0,2,34},{0,1,50},{0,1,93},{0,1,54},{0,5,0}, +{0,5,0},{0,5,0},{0,2,9},{1,0,89},{0,2,34},{0,2,34},{0,1,50},{2,0,89},{0,1,50},{5,0,421},{0,7,52},{0,5,1},{0,4,162},{5,0,421},{10,0,421},{0,4,162},{0,3,445},{10,0,421},{0,3,445},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,13,421},{0,9,10},{0,6,26}, +{0,5,117},{0,9,1261},{0,6,701},{0,5,286},{0,4,917},{0,4,1390},{0,3,1005},{0,13,421},{0,9,10},{0,6,26},{0,5,117},{4,1,1261},{0,6,701},{0,5,286},{0,4,917},{9,0,1261},{0,4,917},{0,8,1},{0,8,1},{0,8,1},{0,4,1},{0,4,221},{0,3,89},{0,3,89},{0,2,125},{0,2,246},{0,2,150},{0,8,1},{0,8,1},{0,8,1},{0,4,1},{2,0,221}, +{0,3,89},{0,3,89},{0,2,125},{4,0,221},{0,2,125},{6,1,421},{0,9,10},{1,6,1},{0,5,117},{6,1,421},{13,0,421},{0,5,117},{0,4,433},{13,0,421},{0,4,433},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,16,430},{0,11,14},{0,7,110},{0,7,91},{0,11,1514},{0,7,737},{0,6,259}, +{0,4,1002},{0,5,1710},{0,4,1123},{0,16,430},{0,11,14},{1,7,51},{0,7,91},{5,1,1514},{0,7,737},{0,6,259},{0,4,1002},{11,0,1514},{0,4,1002},{0,11,10},{0,11,10},{0,11,10},{0,5,13},{0,6,338},{0,5,104},{0,5,104},{0,3,194},{0,3,402},{0,2,243},{0,11,10},{0,11,10},{0,11,10},{0,5,13},{3,0,338},{0,5,104},{0,5,104},{0,3,194},{6,0,338}, +{0,3,194},{8,0,421},{0,11,5},{2,7,1},{0,7,82},{8,0,421},{16,0,421},{0,7,82},{0,5,433},{16,0,421},{0,5,433},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,1,1},{0,1,1},{0,1,1},{0,1,4},{0,1,8},{0,1,8},{1,17,494},{1,12,78},{1,8,173},{1,8,154},{0,14,1514},{0,9,602},{0,7,146},{0,6,874},{0,7,1875},{0,5,1066},{1,17,430}, +{1,12,14},{2,8,50},{1,8,90},{7,0,1514},{0,9,602},{0,7,146},{0,6,874},{14,0,1514},{0,6,874},{1,12,74},{1,12,74},{1,12,74},{1,6,77},{0,9,338},{0,6,50},{0,6,50},{0,4,137},{0,4,467},{0,3,258},{1,12,10},{1,12,10},{1,12,10},{1,6,13},{4,1,338},{0,6,50},{0,6,50},{0,4,137},{9,0,338},{0,4,137},{9,1,421},{1,12,5},{3,8,1}, +{0,8,49},{9,1,421},{19,0,421},{0,8,49},{0,6,433},{19,0,421},{0,6,433},{1,0,73},{1,0,73},{1,0,73},{1,0,73},{0,4,0},{0,4,0},{0,4,0},{0,2,1},{0,2,26},{0,2,26},{1,20,629},{1,14,233},{2,10,385},{1,9,245},{0,17,1517},{0,11,521},{0,9,26},{0,7,769},{0,8,2025},{0,6,1085},{3,16,437},{2,13,17},{3,9,53},{2,9,81},{8,1,1517}, +{0,11,521},{0,9,26},{0,7,769},{17,0,1517},{0,7,769},{1,15,208},{1,15,208},{1,15,208},{1,8,208},{0,12,338},{0,8,8},{0,8,8},{0,5,74},{0,5,579},{0,5,243},{3,11,16},{3,11,16},{3,11,16},{3,7,16},{4,4,338},{0,8,8},{0,8,8},{0,5,74},{12,0,338},{0,5,74},{11,0,421},{2,13,1},{4,9,1},{0,9,10},{11,0,421},{22,0,421},{0,9,10}, +{0,7,445},{22,0,421},{0,7,445},{1,0,208},{1,0,208},{1,0,208},{1,0,208},{0,7,1},{0,7,1},{0,7,1},{0,4,4},{0,3,80},{0,3,80},{2,21,821},{2,15,425},{2,11,645},{2,10,437},{0,20,1514},{0,12,458},{0,10,2},{0,8,689},{0,9,2198},{0,7,1146},{3,19,437},{3,14,17},{4,10,51},{3,10,81},{8,4,1514},{0,12,458},{0,10,2},{0,8,689},{20,0,1514}, +{0,8,689},{2,16,400},{2,16,400},{2,16,400},{2,9,400},{0,15,338},{0,10,1},{0,10,1},{0,6,41},{0,7,717},{0,6,297},{3,14,16},{3,14,16},{3,14,16},{3,8,20},{5,5,338},{0,10,1},{0,10,1},{0,6,41},{15,0,338},{0,6,41},{12,1,421},{3,14,1},{5,10,1},{0,10,1},{12,1,421},{25,0,421},{0,10,1},{0,8,433},{25,0,421},{0,8,433},{2,0,400}, +{2,0,400},{2,0,400},{2,0,400},{0,10,1},{0,10,1},{0,10,1},{0,5,1},{0,4,157},{0,4,157},{3,22,854},{3,15,459},{3,12,666},{3,11,470},{1,21,1515},{1,13,459},{1,11,3},{0,9,651},{0,11,2070},{0,9,891},{4,20,430},{4,15,14},{5,11,51},{4,11,91},{9,5,1514},{0,14,425},{1,11,2},{0,9,602},{23,0,1514},{0,9,602},{3,17,433},{3,17,433},{3,17,433}, +{3,10,433},{1,16,339},{1,11,2},{1,11,2},{1,7,42},{0,8,613},{0,7,173},{4,15,10},{4,15,10},{4,15,10},{4,9,13},{9,0,338},{1,11,1},{1,11,1},{0,7,29},{18,0,338},{0,7,29},{14,0,421},{4,15,5},{6,11,1},{1,11,1},{14,0,421},{28,0,421},{1,11,1},{0,9,433},{28,0,421},{0,9,433},{3,0,433},{3,0,433},{3,0,433},{3,0,433},{1,11,2}, +{1,11,2},{1,11,2},{1,6,2},{0,6,97},{0,6,97},{4,23,866},{4,16,461},{4,12,670},{4,12,494},{2,22,1515},{2,14,459},{2,12,3},{1,10,651},{0,12,1913},{0,10,677},{5,21,430},{5,16,14},{6,12,50},{5,12,90},{13,0,1514},{1,15,425},{2,12,2},{0,10,533},{26,0,1514},{0,10,533},{4,18,446},{4,18,446},{4,18,446},{4,11,446},{2,17,339},{2,12,3},{2,12,3}, +{2,8,42},{0,10,500},{0,8,65},{5,16,10},{5,16,10},{5,16,10},{5,10,13},{10,1,338},{2,12,2},{2,12,2},{0,8,16},{21,0,338},{0,8,16},{15,1,421},{5,16,5},{7,12,1},{2,12,1},{15,1,421},{31,0,421},{2,12,1},{0,10,433},{31,0,421},{0,10,433},{4,0,445},{4,0,445},{4,0,445},{4,0,445},{2,12,2},{2,12,2},{2,12,2},{2,7,2},{0,8,49}, +{0,8,49},{5,24,854},{5,18,458},{5,14,678},{5,13,470},{3,23,1517},{3,15,461},{3,13,5},{2,11,653},{0,14,1758},{0,11,530},{7,20,437},{6,17,17},{7,13,53},{6,13,81},{14,1,1517},{2,16,422},{3,13,5},{0,11,494},{29,0,1517},{0,11,494},{5,19,433},{5,19,433},{5,19,433},{5,12,433},{3,18,340},{3,13,4},{3,13,4},{3,9,41},{0,12,419},{0,10,19},{7,15,16}, +{7,15,16},{7,15,16},{7,11,16},{12,0,338},{3,13,4},{3,13,4},{0,10,10},{24,0,338},{0,10,10},{17,0,421},{6,17,1},{8,13,1},{3,13,1},{17,0,421},{30,2,421},{3,13,1},{0,11,445},{30,2,421},{0,11,445},{5,0,433},{5,0,433},{5,0,433},{5,0,433},{3,14,1},{3,14,1},{3,14,1},{3,8,1},{0,10,10},{0,10,10},{6,25,854},{6,19,458},{6,15,678}, +{6,14,470},{4,24,1515},{4,16,459},{4,14,3},{3,12,666},{0,16,1658},{0,12,459},{7,23,437},{7,18,17},{8,14,51},{7,14,81},{16,0,1514},{3,17,422},{4,14,2},{0,12,458},{24,4,1514},{0,12,458},{6,20,433},{6,20,433},{6,20,433},{6,13,433},{4,19,339},{4,14,2},{4,14,2},{4,10,42},{0,13,365},{0,11,14},{7,18,16},{7,18,16},{7,18,16},{7,12,20},{13,1,338}, +{4,14,1},{4,14,1},{0,11,10},{27,0,338},{0,11,10},{18,1,421},{7,18,1},{9,14,1},{4,14,1},{18,1,421},{31,3,421},{4,14,1},{0,12,433},{31,3,421},{0,12,433},{6,0,433},{6,0,433},{6,0,433},{6,0,433},{4,14,2},{4,14,2},{4,14,2},{4,9,2},{0,11,5},{0,11,5},{7,26,854},{7,19,459},{7,16,666},{7,15,470},{5,25,1515},{5,17,459},{5,15,3}, +{4,13,651},{0,17,1577},{1,13,459},{8,24,430},{8,19,14},{9,15,51},{8,15,91},{17,1,1514},{4,18,425},{5,15,2},{0,13,437},{27,4,1514},{0,13,437},{7,21,433},{7,21,433},{7,21,433},{7,14,433},{5,20,339},{5,15,2},{5,15,2},{5,11,42},{0,15,339},{1,12,21},{8,19,10},{8,19,10},{8,19,10},{8,13,13},{15,0,338},{5,15,1},{5,15,1},{1,12,17},{30,0,338}, +{1,12,17},{20,0,421},{8,19,5},{10,15,1},{5,15,1},{20,0,421},{30,5,421},{5,15,1},{0,13,433},{30,5,421},{0,13,433},{7,0,433},{7,0,433},{7,0,433},{7,0,433},{5,15,2},{5,15,2},{5,15,2},{5,10,2},{1,12,5},{1,12,5},{8,27,866},{8,20,461},{8,16,670},{8,16,494},{6,26,1515},{6,18,459},{6,16,3},{5,14,651},{0,19,1530},{2,14,459},{9,25,430}, +{9,20,14},{10,16,50},{9,16,90},{19,0,1514},{5,19,425},{6,16,2},{0,14,434},{30,4,1514},{0,14,434},{8,22,446},{8,22,446},{8,22,446},{8,15,446},{6,21,339},{6,16,3},{6,16,3},{6,12,42},{1,16,339},{2,13,21},{9,20,10},{9,20,10},{9,20,10},{9,14,13},{16,1,338},{6,16,2},{6,16,2},{4,12,16},{31,1,338},{4,12,16},{21,1,421},{9,20,5},{11,16,1}, +{6,16,1},{21,1,421},{31,6,421},{6,16,1},{0,14,433},{31,6,421},{0,14,433},{8,0,445},{8,0,445},{8,0,445},{8,0,445},{6,16,2},{6,16,2},{6,16,2},{6,11,2},{2,13,5},{2,13,5},{9,28,854},{9,22,458},{9,18,678},{9,17,470},{7,27,1517},{7,19,461},{7,17,5},{6,15,653},{1,20,1526},{3,15,461},{11,24,437},{10,21,17},{11,17,53},{10,17,81},{20,1,1517}, +{6,20,422},{7,17,5},{2,15,446},{31,5,1517},{2,15,446},{9,23,433},{9,23,433},{9,23,433},{9,16,433},{7,22,340},{7,17,4},{7,17,4},{7,13,41},{2,17,340},{4,14,19},{11,19,16},{11,19,16},{11,19,16},{11,15,16},{16,4,338},{7,17,4},{7,17,4},{4,14,10},{28,4,338},{4,14,10},{23,0,421},{10,21,1},{12,17,1},{7,17,1},{23,0,421},{30,8,421},{7,17,1}, +{0,15,445},{30,8,421},{0,15,445},{9,0,433},{9,0,433},{9,0,433},{9,0,433},{7,18,1},{7,18,1},{7,18,1},{7,12,1},{4,14,10},{4,14,10},{10,29,854},{10,23,458},{10,19,678},{10,18,470},{8,28,1515},{8,20,459},{8,18,3},{7,16,666},{2,21,1526},{4,16,459},{11,27,437},{11,22,17},{12,18,51},{11,18,81},{20,4,1514},{7,21,422},{8,18,2},{2,16,434},{28,8,1514}, +{2,16,434},{10,24,433},{10,24,433},{10,24,433},{10,17,433},{8,23,339},{8,18,2},{8,18,2},{8,14,42},{3,18,340},{4,15,14},{11,22,16},{11,22,16},{11,22,16},{11,16,20},{17,5,338},{8,18,1},{8,18,1},{4,15,10},{31,4,338},{4,15,10},{24,1,421},{11,22,1},{13,18,1},{8,18,1},{24,1,421},{31,9,421},{8,18,1},{0,16,433},{31,9,421},{0,16,433},{10,0,433}, +{10,0,433},{10,0,433},{10,0,433},{8,18,2},{8,18,2},{8,18,2},{8,13,2},{4,15,5},{4,15,5},{11,30,854},{11,23,459},{11,20,666},{11,19,470},{9,29,1515},{9,21,459},{9,19,3},{8,17,651},{3,22,1526},{5,17,459},{12,28,430},{12,23,14},{13,19,51},{12,19,91},{21,5,1514},{8,22,425},{9,19,2},{3,17,434},{31,8,1514},{3,17,434},{11,25,433},{11,25,433},{11,25,433}, +{11,18,433},{9,24,339},{9,19,2},{9,19,2},{9,15,42},{4,19,339},{5,16,21},{12,23,10},{12,23,10},{12,23,10},{12,17,13},{21,0,338},{9,19,1},{9,19,1},{5,16,17},{30,6,338},{5,16,17},{26,0,421},{12,23,5},{14,19,1},{9,19,1},{26,0,421},{30,11,421},{9,19,1},{0,17,433},{30,11,421},{0,17,433},{11,0,433},{11,0,433},{11,0,433},{11,0,433},{9,19,2}, +{9,19,2},{9,19,2},{9,14,2},{5,16,5},{5,16,5},{12,31,866},{12,24,461},{12,20,670},{12,20,494},{10,30,1515},{10,22,459},{10,20,3},{9,18,651},{4,23,1530},{6,18,459},{13,29,430},{13,24,14},{14,20,50},{13,20,90},{25,0,1514},{9,23,425},{10,20,2},{4,18,434},{30,10,1514},{4,18,434},{12,26,446},{12,26,446},{12,26,446},{12,19,446},{10,25,339},{10,20,3},{10,20,3}, +{10,16,42},{5,20,339},{6,17,21},{13,24,10},{13,24,10},{13,24,10},{13,18,13},{22,1,338},{10,20,2},{10,20,2},{8,16,16},{31,7,338},{8,16,16},{27,1,421},{13,24,5},{15,20,1},{10,20,1},{27,1,421},{31,12,421},{10,20,1},{0,18,433},{31,12,421},{0,18,433},{12,0,445},{12,0,445},{12,0,445},{12,0,445},{10,20,2},{10,20,2},{10,20,2},{10,15,2},{6,17,5}, +{6,17,5},{13,31,878},{13,26,458},{13,22,678},{13,21,470},{11,31,1517},{11,23,461},{11,21,5},{10,19,653},{5,24,1526},{7,19,461},{15,28,437},{14,25,17},{15,21,53},{14,21,81},{26,1,1517},{10,24,422},{11,21,5},{6,19,446},{31,11,1517},{6,19,446},{13,27,433},{13,27,433},{13,27,433},{13,20,433},{11,26,340},{11,21,4},{11,21,4},{11,17,41},{6,21,340},{8,18,19},{15,23,16}, +{15,23,16},{15,23,16},{15,19,16},{24,0,338},{11,21,4},{11,21,4},{8,18,10},{24,12,338},{8,18,10},{29,0,421},{14,25,1},{16,21,1},{11,21,1},{29,0,421},{30,14,421},{11,21,1},{0,19,445},{30,14,421},{0,19,445},{13,0,433},{13,0,433},{13,0,433},{13,0,433},{11,22,1},{11,22,1},{11,22,1},{11,16,1},{8,18,10},{8,18,10},{14,31,938},{14,27,458},{14,23,678}, +{14,22,470},{12,31,1542},{12,24,459},{12,22,3},{11,20,666},{6,25,1526},{8,20,459},{15,31,437},{15,26,17},{16,22,51},{15,22,81},{28,0,1514},{11,25,422},{12,22,2},{6,20,434},{24,16,1514},{6,20,434},{14,28,433},{14,28,433},{14,28,433},{14,21,433},{12,27,339},{12,22,2},{12,22,2},{12,18,42},{7,22,340},{8,19,14},{15,26,16},{15,26,16},{15,26,16},{15,20,20},{25,1,338}, +{12,22,1},{12,22,1},{8,19,10},{27,12,338},{8,19,10},{30,1,421},{15,26,1},{17,22,1},{12,22,1},{30,1,421},{31,15,421},{12,22,1},{0,20,433},{31,15,421},{0,20,433},{14,0,433},{14,0,433},{14,0,433},{14,0,433},{12,22,2},{12,22,2},{12,22,2},{12,17,2},{8,19,5},{8,19,5},{15,31,998},{15,27,459},{15,24,666},{15,23,470},{14,31,1598},{13,25,459},{13,23,3}, +{12,21,651},{7,26,1526},{9,21,459},{16,31,442},{16,27,14},{17,23,51},{16,23,91},{29,1,1514},{12,26,425},{13,23,2},{7,21,434},{27,16,1514},{7,21,434},{15,29,433},{15,29,433},{15,29,433},{15,22,433},{13,28,339},{13,23,2},{13,23,2},{13,19,42},{8,23,339},{9,20,21},{16,27,10},{16,27,10},{16,27,10},{16,21,13},{27,0,338},{13,23,1},{13,23,1},{9,20,17},{30,12,338}, +{9,20,17},{31,2,421},{16,27,5},{18,23,1},{13,23,1},{31,2,421},{30,17,421},{13,23,1},{0,21,433},{30,17,421},{0,21,433},{15,0,433},{15,0,433},{15,0,433},{15,0,433},{13,23,2},{13,23,2},{13,23,2},{13,18,2},{9,20,5},{9,20,5},{16,31,1086},{16,28,461},{16,24,670},{16,24,494},{15,31,1622},{14,26,459},{14,24,3},{13,22,651},{8,27,1530},{10,22,459},{18,31,446}, +{17,28,14},{18,24,50},{17,24,90},{31,0,1514},{13,27,425},{14,24,2},{8,22,434},{30,16,1514},{8,22,434},{16,30,446},{16,30,446},{16,30,446},{16,23,446},{14,29,339},{14,24,3},{14,24,3},{14,20,42},{9,24,339},{10,21,21},{17,28,10},{17,28,10},{17,28,10},{17,22,13},{28,1,338},{14,24,2},{14,24,2},{12,20,16},{31,13,338},{12,20,16},{31,5,421},{17,28,5},{19,24,1}, +{14,24,1},{31,5,421},{31,18,421},{14,24,1},{0,22,433},{31,18,421},{0,22,433},{16,0,445},{16,0,445},{16,0,445},{16,0,445},{14,24,2},{14,24,2},{14,24,2},{14,19,2},{10,21,5},{10,21,5},{18,31,1242},{17,30,458},{17,26,678},{17,25,470},{16,31,1703},{15,27,461},{15,25,5},{14,23,653},{9,28,1526},{11,23,461},{19,31,461},{18,29,17},{19,25,53},{18,25,81},{31,3,1517}, +{14,28,422},{15,25,5},{10,23,446},{31,17,1517},{10,23,446},{17,31,433},{17,31,433},{17,31,433},{17,24,433},{15,30,340},{15,25,4},{15,25,4},{15,21,41},{10,25,340},{12,22,19},{19,27,16},{19,27,16},{19,27,16},{19,23,16},{28,4,338},{15,25,4},{15,25,4},{12,22,10},{28,16,338},{12,22,10},{31,8,421},{18,29,1},{20,25,1},{15,25,1},{31,8,421},{30,20,421},{15,25,1}, +{0,23,445},{30,20,421},{0,23,445},{17,0,433},{17,0,433},{17,0,433},{17,0,433},{15,26,1},{15,26,1},{15,26,1},{15,20,1},{12,22,10},{12,22,10},{19,31,1326},{18,31,458},{18,27,678},{18,26,470},{17,31,1838},{16,28,459},{16,26,3},{15,24,666},{10,29,1526},{12,24,459},{20,31,506},{19,30,17},{20,26,51},{19,26,81},{28,12,1514},{15,29,422},{16,26,2},{10,24,434},{28,20,1514}, +{10,24,434},{18,31,442},{18,31,442},{18,31,442},{18,25,433},{16,31,339},{16,26,2},{16,26,2},{16,22,42},{11,26,340},{12,23,14},{19,30,16},{19,30,16},{19,30,16},{19,24,20},{29,5,338},{16,26,1},{16,26,1},{12,23,10},{31,16,338},{12,23,10},{31,11,421},{19,30,1},{21,26,1},{16,26,1},{31,11,421},{31,21,421},{16,26,1},{0,24,433},{31,21,421},{0,24,433},{18,0,433}, +{18,0,433},{18,0,433},{18,0,433},{16,26,2},{16,26,2},{16,26,2},{16,21,2},{12,23,5},{12,23,5},{20,31,1470},{19,31,459},{19,28,666},{19,27,470},{19,31,1911},{17,29,459},{17,27,3},{16,25,651},{11,30,1526},{13,25,459},{21,31,590},{20,31,14},{21,27,51},{20,27,91},{29,13,1514},{16,30,425},{17,27,2},{11,25,434},{31,20,1514},{11,25,434},{19,31,458},{19,31,458},{19,31,458}, +{19,26,433},{17,31,357},{17,27,2},{17,27,2},{17,23,42},{12,27,339},{13,24,21},{20,31,10},{20,31,10},{20,31,10},{20,25,13},{31,4,338},{17,27,1},{17,27,1},{13,24,17},{30,18,338},{13,24,17},{31,14,421},{20,31,5},{22,27,1},{17,27,1},{31,14,421},{30,23,421},{17,27,1},{0,25,433},{30,23,421},{0,25,433},{19,0,433},{19,0,433},{19,0,433},{19,0,433},{17,27,2}, +{17,27,2},{17,27,2},{17,22,2},{13,24,5},{13,24,5},{21,31,1650},{20,31,530},{20,28,670},{20,28,494},{20,31,2030},{18,30,459},{18,28,3},{17,26,651},{12,31,1530},{14,26,459},{23,31,650},{21,31,29},{22,28,50},{21,28,90},{31,12,1514},{17,31,425},{18,28,2},{12,26,434},{30,22,1514},{12,26,434},{20,31,494},{20,31,494},{20,31,494},{20,27,446},{18,31,411},{18,28,3},{18,28,3}, +{18,24,42},{13,28,339},{14,25,21},{21,31,13},{21,31,13},{21,31,13},{21,26,13},{31,7,338},{18,28,2},{18,28,2},{16,24,16},{31,19,338},{16,24,16},{31,17,421},{22,31,10},{23,28,1},{18,28,1},{31,17,421},{31,24,421},{18,28,1},{0,26,433},{31,24,421},{0,26,433},{20,0,445},{20,0,445},{20,0,445},{20,0,445},{18,28,2},{18,28,2},{18,28,2},{18,23,2},{14,25,5}, +{14,25,5},{22,31,1902},{21,31,723},{21,30,678},{21,29,470},{21,31,2235},{19,31,461},{19,29,5},{18,27,653},{14,31,1587},{15,27,461},{24,31,734},{23,31,65},{23,29,53},{22,29,81},{31,15,1517},{19,31,461},{19,29,5},{14,27,446},{31,23,1517},{14,27,446},{21,31,554},{21,31,554},{21,31,554},{21,28,433},{20,31,437},{19,29,4},{19,29,4},{19,25,41},{14,29,340},{16,26,19},{23,31,16}, +{23,31,16},{23,31,16},{23,27,16},{28,16,338},{19,29,4},{19,29,4},{16,26,10},{24,24,338},{16,26,10},{31,20,421},{23,31,49},{24,29,1},{19,29,1},{31,20,421},{30,26,421},{19,29,1},{0,27,445},{30,26,421},{0,27,445},{21,0,433},{21,0,433},{21,0,433},{21,0,433},{19,30,1},{19,30,1},{19,30,1},{19,24,1},{16,26,10},{16,26,10},{23,31,2074},{23,31,930},{22,31,678}, +{22,30,470},{23,31,2382},{20,31,570},{20,30,3},{19,28,666},{16,31,1703},{16,28,459},{25,31,854},{24,31,173},{24,30,51},{23,30,81},{28,24,1514},{21,31,554},{20,30,2},{14,28,434},{24,28,1514},{14,28,434},{22,31,629},{22,31,629},{22,31,629},{22,29,433},{21,31,491},{20,30,2},{20,30,2},{20,26,42},{15,30,340},{16,27,14},{24,31,29},{24,31,29},{24,31,29},{23,28,20},{29,17,338}, +{20,30,1},{20,30,1},{16,27,10},{27,24,338},{16,27,10},{31,23,421},{25,31,109},{25,30,1},{20,30,1},{31,23,421},{31,27,421},{20,30,1},{0,28,433},{31,27,421},{0,28,433},{22,0,433},{22,0,433},{22,0,433},{22,0,433},{20,30,2},{20,30,2},{20,30,2},{20,25,2},{16,27,5},{16,27,5},{24,31,2229},{24,31,1146},{23,31,689},{23,31,469},{24,31,2476},{22,31,731},{21,31,2}, +{20,29,618},{18,31,1805},{17,29,426},{26,31,953},{25,31,339},{25,31,50},{24,30,82},{29,25,1459},{23,31,620},{21,31,1},{15,29,401},{27,28,1459},{15,29,401},{23,31,689},{23,31,689},{23,31,689},{23,30,433},{22,31,581},{21,31,2},{21,31,2},{21,27,42},{16,31,339},{17,28,21},{25,31,50},{25,31,50},{25,31,50},{24,29,13},{31,16,338},{21,31,1},{21,31,1},{17,28,17},{30,24,338}, +{17,28,17},{31,26,392},{27,31,157},{26,31,0},{21,31,0},{31,26,392},{30,29,392},{21,31,0},{0,29,400},{30,29,392},{0,29,400},{23,0,433},{23,0,433},{23,0,433},{23,0,433},{21,31,2},{21,31,2},{21,31,2},{21,26,2},{17,28,5},{17,28,5},{25,31,1943},{24,31,1130},{24,31,769},{24,31,446},{25,31,2103},{23,31,573},{22,31,42},{22,29,373},{20,31,1481},{18,30,234},{27,31,657}, +{26,31,285},{26,31,89},{25,31,18},{31,23,1064},{24,31,426},{23,31,8},{16,30,209},{31,27,1064},{16,30,209},{24,31,769},{24,31,769},{24,31,769},{24,31,446},{23,31,661},{22,31,42},{22,31,42},{22,28,42},{18,31,365},{18,29,21},{26,31,89},{26,31,89},{26,31,89},{25,30,13},{31,19,338},{23,31,8},{23,31,8},{20,28,16},{31,25,338},{20,28,16},{31,27,202},{28,31,80},{27,31,4}, +{24,31,1},{31,27,202},{31,29,202},{24,31,1},{0,30,208},{31,29,202},{0,30,208},{24,0,445},{24,0,445},{24,0,445},{24,0,445},{22,31,17},{22,31,17},{22,31,17},{22,27,2},{18,29,5},{18,29,5},{27,31,1710},{26,31,1126},{25,31,917},{25,31,469},{26,31,1779},{24,31,507},{24,31,146},{23,30,154},{22,31,1221},{20,30,83},{28,31,450},{27,31,258},{27,31,137},{27,31,16},{29,29,722}, +{26,31,286},{25,31,52},{20,30,74},{31,28,722},{20,30,74},{25,31,917},{25,31,917},{25,31,917},{25,31,469},{25,31,789},{24,31,146},{24,31,146},{23,29,41},{20,31,446},{20,30,19},{27,31,137},{27,31,137},{27,31,137},{27,31,16},{28,28,338},{25,31,52},{25,31,52},{20,30,10},{28,28,338},{20,30,10},{31,29,61},{30,31,34},{29,31,0},{27,31,0},{31,29,61},{31,30,61},{27,31,0}, +{0,30,73},{31,30,61},{0,30,73},{25,0,433},{25,0,433},{25,0,433},{25,0,433},{23,31,49},{23,31,49},{23,31,49},{23,28,1},{20,30,10},{20,30,10},{27,31,1486},{27,31,1123},{27,31,1002},{26,31,554},{27,31,1519},{25,31,582},{25,31,293},{24,30,106},{23,31,1090},{20,31,14},{29,31,354},{28,31,258},{28,31,194},{28,31,50},{31,27,509},{27,31,234},{27,31,113},{20,31,10},{31,29,509}, +{20,31,10},{27,31,1002},{27,31,1002},{27,31,1002},{26,31,554},{26,31,915},{25,31,293},{25,31,293},{24,30,42},{22,31,564},{20,31,14},{28,31,194},{28,31,194},{28,31,194},{28,31,50},{29,29,338},{27,31,113},{27,31,113},{20,31,10},{31,28,338},{20,31,10},{31,30,9},{31,31,9},{30,31,9},{30,31,0},{31,30,9},{30,31,9},{30,31,0},{0,31,9},{30,31,9},{0,31,9},{26,0,433}, +{26,0,433},{26,0,433},{26,0,433},{24,31,82},{24,31,82},{24,31,82},{24,29,2},{20,31,5},{20,31,5},{28,31,1197},{28,31,1005},{27,31,917},{27,31,554},{28,31,1213},{26,31,522},{26,31,326},{25,31,17},{24,31,870},{22,31,16},{30,31,241},{29,31,182},{29,31,146},{29,31,61},{31,28,297},{28,31,153},{28,31,89},{23,31,1},{30,30,297},{23,31,1},{27,31,917},{27,31,917},{27,31,917}, +{27,31,554},{27,31,774},{26,31,326},{26,31,326},{25,31,17},{24,31,509},{22,31,16},{29,31,146},{29,31,146},{29,31,146},{29,31,61},{31,27,221},{28,31,89},{28,31,89},{23,31,1},{31,29,221},{23,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{27,0,433},{27,0,433},{27,0,433},{27,0,433},{26,31,130}, +{26,31,130},{26,31,130},{25,30,2},{22,31,16},{22,31,16},{29,31,927},{28,31,765},{28,31,701},{28,31,509},{28,31,845},{27,31,404},{27,31,283},{26,31,2},{26,31,589},{24,31,52},{30,31,97},{30,31,70},{30,31,61},{30,31,34},{31,30,118},{30,31,67},{29,31,40},{26,31,1},{30,31,118},{26,31,1},{28,31,701},{28,31,701},{28,31,701},{28,31,509},{28,31,589},{27,31,283},{27,31,283}, +{26,31,2},{25,31,386},{24,31,52},{30,31,61},{30,31,61},{30,31,61},{30,31,34},{31,29,85},{29,31,40},{29,31,40},{26,31,1},{31,30,85},{26,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{28,0,445},{28,0,445},{28,0,445},{28,0,445},{27,31,162},{27,31,162},{27,31,162},{26,31,2},{24,31,52}, +{24,31,52},{0,14,884},{0,10,117},{0,7,10},{0,6,317},{0,10,1899},{0,6,1236},{0,6,573},{0,4,1438},{0,4,2065},{0,4,1559},{0,14,884},{0,10,117},{0,7,10},{0,6,317},{5,0,1899},{0,6,1236},{0,6,573},{0,4,1438},{10,0,1899},{0,4,1438},{0,7,1},{0,7,1},{0,7,1},{0,3,4},{0,3,164},{0,3,68},{0,3,68},{0,2,104},{0,2,189},{0,1,129},{0,7,1}, +{0,7,1},{0,7,1},{0,3,4},{2,0,164},{0,3,68},{0,3,68},{0,2,104},{3,0,164},{0,2,104},{7,0,884},{0,10,117},{0,7,10},{0,6,317},{7,0,884},{14,0,884},{0,6,317},{0,5,890},{14,0,884},{0,5,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,17,884},{0,12,53},{0,8,20}, +{0,7,265},{0,11,2360},{0,8,1384},{0,7,626},{0,5,1683},{0,5,2580},{0,5,1852},{0,17,884},{0,12,53},{0,8,20},{0,7,265},{6,0,2356},{0,8,1384},{0,7,626},{0,5,1683},{10,1,2356},{0,5,1683},{0,10,1},{0,10,1},{0,10,1},{0,5,1},{0,5,338},{0,4,137},{0,4,137},{0,2,200},{0,2,381},{0,2,225},{0,10,1},{0,10,1},{0,10,1},{0,5,1},{2,1,338}, +{0,4,137},{0,4,137},{0,2,200},{5,0,338},{0,2,200},{8,1,884},{0,12,53},{1,8,5},{0,7,265},{8,1,884},{17,0,884},{0,7,265},{0,6,890},{17,0,884},{0,6,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,20,882},{0,14,16},{0,10,85},{0,8,200},{0,14,2904},{0,9,1530},{0,8,684}, +{0,6,1978},{0,6,3220},{0,5,2172},{0,20,882},{0,14,16},{1,9,84},{0,8,200},{7,0,2904},{0,9,1530},{0,8,684},{0,6,1978},{14,0,2904},{0,6,1978},{0,12,1},{0,12,1},{0,12,1},{0,6,4},{0,6,580},{0,5,218},{0,5,218},{0,3,356},{0,3,644},{0,3,420},{0,12,1},{0,12,1},{0,12,1},{0,6,4},{3,0,580},{0,5,218},{0,5,218},{0,3,356},{6,0,580}, +{0,3,356},{8,4,882},{0,14,16},{2,9,5},{0,8,200},{8,4,882},{20,0,882},{0,8,200},{0,7,890},{20,0,882},{0,7,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,23,918},{0,15,41},{1,11,153},{0,10,184},{0,16,3048},{0,11,1476},{0,9,473},{0,6,1950},{0,7,3517},{0,6,2206},{1,21,886}, +{1,15,20},{1,11,89},{0,10,184},{8,0,3048},{0,11,1476},{0,9,473},{0,6,1950},{16,0,3048},{0,6,1950},{0,15,37},{0,15,37},{0,15,37},{0,8,40},{0,9,648},{0,7,185},{0,7,185},{0,4,337},{0,4,777},{0,4,458},{1,13,5},{1,13,5},{1,13,5},{1,7,8},{4,1,648},{0,7,185},{0,7,185},{0,4,337},{9,0,648},{0,4,337},{9,5,882},{0,15,5},{3,10,5}, +{0,10,148},{9,5,882},{23,0,882},{0,10,148},{0,8,900},{23,0,882},{0,8,900},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,2,1},{0,2,1},{0,2,1},{0,1,1},{0,1,5},{0,1,5},{1,24,997},{1,17,123},{1,12,318},{1,11,243},{0,19,3051},{0,12,1278},{0,10,274},{0,8,1795},{0,9,3672},{0,7,2222},{2,22,885},{2,16,10},{2,12,101},{1,11,179},{10,0,3051}, +{0,12,1278},{0,10,274},{0,8,1795},{19,0,3051},{0,8,1795},{1,17,114},{1,17,114},{1,17,114},{1,9,114},{0,12,648},{0,9,85},{0,9,85},{0,5,244},{0,5,889},{0,5,413},{2,15,1},{2,15,1},{2,15,1},{2,8,5},{4,4,648},{0,9,85},{0,9,85},{0,5,244},{12,0,648},{0,5,244},{13,0,884},{2,16,9},{4,11,10},{0,11,90},{13,0,884},{26,0,884},{0,11,90}, +{0,9,890},{26,0,884},{0,9,890},{1,0,113},{1,0,113},{1,0,113},{1,0,113},{0,6,1},{0,6,1},{0,6,1},{0,3,1},{0,2,50},{0,2,50},{1,27,1173},{1,18,314},{2,13,510},{1,12,374},{0,22,3051},{0,14,1139},{0,12,153},{0,9,1630},{0,10,3924},{0,8,2199},{3,23,885},{3,17,10},{3,13,101},{2,12,197},{11,0,3051},{0,14,1139},{0,12,153},{0,9,1630},{22,0,3051}, +{0,9,1630},{1,20,290},{1,20,290},{1,20,290},{1,10,293},{0,15,648},{0,10,41},{0,10,41},{0,6,181},{0,7,1027},{0,6,437},{3,16,2},{3,16,2},{3,16,2},{3,9,5},{5,5,648},{0,10,41},{0,10,41},{0,6,181},{15,0,648},{0,6,181},{14,1,884},{3,17,9},{5,12,5},{0,12,53},{14,1,884},{29,0,884},{0,12,53},{0,10,890},{29,0,884},{0,10,890},{1,0,289}, +{1,0,289},{1,0,289},{1,0,289},{0,8,1},{0,8,1},{0,8,1},{0,4,1},{0,3,113},{0,3,113},{2,28,1365},{2,19,506},{3,14,830},{2,13,566},{0,25,3051},{0,16,1051},{0,13,36},{0,10,1483},{0,12,4164},{0,9,2174},{4,24,886},{4,18,20},{4,14,89},{3,13,197},{12,1,3051},{0,16,1051},{0,13,36},{0,10,1483},{25,0,3051},{0,10,1483},{2,21,482},{2,21,482},{2,21,482}, +{2,11,485},{0,18,648},{0,12,5},{0,12,5},{0,7,149},{0,8,1182},{0,7,510},{4,16,5},{4,16,5},{4,16,5},{4,10,8},{9,0,648},{0,12,5},{0,12,5},{0,7,149},{18,0,648},{0,7,149},{16,0,882},{3,19,10},{6,13,5},{0,13,20},{16,0,882},{24,4,882},{0,13,20},{0,11,890},{24,4,882},{0,11,890},{2,0,481},{2,0,481},{2,0,481},{2,0,481},{0,11,1}, +{0,11,1},{0,11,1},{0,6,1},{0,5,185},{0,5,185},{2,31,1669},{3,20,818},{3,15,1161},{2,14,838},{0,28,3048},{0,17,949},{0,14,6},{0,11,1395},{0,13,4381},{0,10,2228},{5,25,886},{5,19,20},{5,15,89},{4,14,184},{12,4,3048},{0,17,949},{0,14,6},{0,11,1395},{28,0,3048},{0,11,1395},{2,24,786},{2,24,786},{2,24,786},{2,13,786},{0,21,648},{0,14,2},{0,14,2}, +{0,9,101},{0,9,1352},{0,8,590},{5,17,5},{5,17,5},{5,17,5},{5,11,8},{10,1,648},{0,14,2},{0,14,2},{0,9,101},{21,0,648},{0,9,101},{17,1,882},{4,19,5},{7,14,5},{0,14,5},{17,1,882},{27,4,882},{0,14,5},{0,12,900},{27,4,882},{0,12,900},{2,0,785},{2,0,785},{2,0,785},{2,0,785},{0,14,1},{0,14,1},{0,14,1},{0,7,1},{0,6,305}, +{0,6,305},{3,31,1814},{3,22,968},{4,16,1314},{3,15,945},{1,29,3055},{0,19,936},{1,15,17},{0,12,1314},{0,15,4321},{0,12,2007},{6,26,885},{6,20,10},{6,16,101},{5,15,179},{15,2,3051},{0,19,900},{1,15,13},{0,12,1278},{31,0,3051},{0,12,1278},{3,25,900},{3,25,900},{3,25,900},{3,14,900},{1,22,654},{1,15,8},{1,15,8},{0,10,76},{0,11,1296},{0,9,425},{6,19,1}, +{6,19,1},{6,19,1},{6,12,5},{12,0,648},{1,15,4},{1,15,4},{0,10,40},{24,0,648},{0,10,40},{19,0,884},{6,20,9},{8,15,10},{1,15,9},{19,0,884},{30,4,884},{1,15,9},{0,13,890},{30,4,884},{0,13,890},{3,0,900},{3,0,900},{3,0,900},{3,0,900},{1,16,5},{1,16,5},{1,16,5},{1,8,8},{0,7,269},{0,7,269},{5,31,1838},{4,23,948},{5,17,1314}, +{4,16,943},{2,30,3055},{1,20,936},{2,16,13},{1,13,1314},{0,16,4056},{0,13,1620},{7,27,885},{7,21,10},{7,17,101},{6,16,197},{17,0,3051},{0,21,891},{2,16,9},{0,13,1179},{30,2,3051},{0,13,1179},{4,26,891},{4,26,891},{4,26,891},{4,15,891},{2,23,654},{2,16,9},{2,16,9},{1,11,76},{0,13,1107},{0,10,273},{7,20,2},{7,20,2},{7,20,2},{7,13,5},{13,1,648}, +{3,15,5},{3,15,5},{0,11,20},{27,0,648},{0,11,20},{20,1,884},{7,21,9},{9,16,5},{2,16,5},{20,1,884},{31,5,884},{2,16,5},{0,14,890},{31,5,884},{0,14,890},{4,0,890},{4,0,890},{4,0,890},{4,0,890},{2,17,5},{2,17,5},{2,17,5},{2,9,8},{0,9,149},{0,9,149},{6,31,1868},{5,24,948},{6,18,1314},{5,17,943},{3,31,3055},{2,21,936},{3,17,13}, +{2,14,1314},{0,18,3825},{0,14,1354},{8,28,886},{8,22,20},{8,18,89},{7,17,197},{18,1,3051},{1,22,891},{3,17,9},{0,14,1098},{31,3,3051},{0,14,1098},{5,27,891},{5,27,891},{5,27,891},{5,16,891},{3,24,652},{3,17,9},{3,17,9},{2,12,86},{0,14,976},{0,12,126},{8,20,5},{8,20,5},{8,20,5},{8,14,8},{15,0,648},{4,16,5},{4,16,5},{0,12,5},{30,0,648}, +{0,12,5},{20,4,882},{7,23,10},{10,17,5},{3,17,5},{20,4,882},{28,8,882},{3,17,5},{0,15,890},{28,8,882},{0,15,890},{5,0,890},{5,0,890},{5,0,890},{5,0,890},{3,18,5},{3,18,5},{3,18,5},{3,10,8},{0,11,80},{0,11,80},{7,31,1908},{6,25,948},{7,19,1314},{6,18,943},{4,31,3084},{3,22,936},{4,18,15},{3,15,1314},{0,19,3640},{0,15,1175},{9,29,886}, +{9,23,20},{9,19,89},{8,18,184},{20,0,3048},{2,23,891},{4,18,6},{0,15,1054},{24,8,3048},{0,15,1054},{6,28,891},{6,28,891},{6,28,891},{6,17,891},{4,25,657},{4,18,11},{4,18,11},{3,13,86},{0,16,852},{0,13,27},{9,21,5},{9,21,5},{9,21,5},{9,15,8},{16,1,648},{4,18,2},{4,18,2},{0,13,2},{31,1,648},{0,13,2},{21,5,882},{8,23,5},{11,18,5}, +{4,18,5},{21,5,882},{31,8,882},{4,18,5},{0,16,900},{31,8,882},{0,16,900},{6,0,890},{6,0,890},{6,0,890},{6,0,890},{4,18,10},{4,18,10},{4,18,10},{4,11,10},{0,13,26},{0,13,26},{8,31,1998},{7,26,968},{8,20,1314},{7,19,945},{6,31,3160},{4,23,936},{5,19,17},{4,16,1314},{0,21,3420},{0,16,1028},{10,30,885},{10,24,10},{10,20,101},{9,19,179},{22,0,3051}, +{3,24,891},{5,19,13},{0,16,1003},{30,7,3051},{0,16,1003},{7,29,900},{7,29,900},{7,29,900},{7,18,900},{5,26,654},{5,19,8},{5,19,8},{4,14,76},{0,18,750},{1,14,24},{10,23,1},{10,23,1},{10,23,1},{10,16,5},{16,4,648},{5,19,4},{5,19,4},{2,14,5},{28,4,648},{2,14,5},{25,0,884},{10,24,9},{12,19,10},{5,19,9},{25,0,884},{30,10,884},{5,19,9}, +{0,17,890},{30,10,884},{0,17,890},{7,0,900},{7,0,900},{7,0,900},{7,0,900},{5,20,5},{5,20,5},{5,20,5},{5,12,8},{0,15,5},{0,15,5},{9,31,2124},{8,27,948},{9,21,1314},{8,20,943},{7,31,3196},{5,24,936},{6,20,13},{5,17,1314},{0,23,3307},{0,17,971},{11,31,885},{11,25,10},{11,21,101},{10,20,197},{23,0,3051},{4,25,891},{6,20,9},{0,17,970},{30,8,3051}, +{0,17,970},{8,30,891},{8,30,891},{8,30,891},{8,19,891},{6,27,654},{6,20,9},{6,20,9},{5,15,76},{0,19,691},{2,15,24},{11,24,2},{11,24,2},{11,24,2},{11,17,5},{17,5,648},{7,19,5},{7,19,5},{3,15,5},{31,4,648},{3,15,5},{26,1,884},{11,25,9},{13,20,5},{6,20,5},{26,1,884},{31,11,884},{6,20,5},{0,18,890},{31,11,884},{0,18,890},{8,0,890}, +{8,0,890},{8,0,890},{8,0,890},{6,21,5},{6,21,5},{6,21,5},{6,13,8},{1,16,5},{1,16,5},{10,31,2286},{9,28,948},{10,22,1314},{9,21,943},{8,31,3277},{6,25,936},{7,21,13},{6,18,1314},{0,24,3196},{0,19,948},{12,31,904},{12,26,20},{12,22,89},{11,21,197},{24,1,3051},{5,26,891},{7,21,9},{0,19,939},{31,9,3051},{0,19,939},{9,31,891},{9,31,891},{9,31,891}, +{9,20,891},{7,28,652},{7,21,9},{7,21,9},{6,16,86},{0,21,652},{2,16,18},{12,24,5},{12,24,5},{12,24,5},{12,18,8},{21,0,648},{8,20,5},{8,20,5},{3,16,2},{30,6,648},{3,16,2},{28,0,882},{11,27,10},{14,21,5},{7,21,5},{28,0,882},{24,16,882},{7,21,5},{0,19,890},{24,16,882},{0,19,890},{9,0,890},{9,0,890},{9,0,890},{9,0,890},{7,22,5}, +{7,22,5},{7,22,5},{7,14,8},{2,17,5},{2,17,5},{11,31,2414},{10,29,948},{11,23,1314},{10,22,943},{9,31,3412},{7,26,936},{8,22,15},{7,19,1314},{0,26,3115},{1,20,958},{13,31,958},{13,27,20},{13,23,89},{12,22,184},{24,4,3048},{6,27,891},{8,22,6},{0,20,925},{28,12,3048},{0,20,925},{10,31,894},{10,31,894},{10,31,894},{10,21,891},{8,29,657},{8,22,11},{8,22,11}, +{7,17,86},{1,22,652},{3,17,18},{13,25,5},{13,25,5},{13,25,5},{13,19,8},{22,1,648},{8,22,2},{8,22,2},{4,17,2},{31,7,648},{4,17,2},{29,1,882},{12,27,5},{15,22,5},{8,22,5},{29,1,882},{27,16,882},{8,22,5},{0,20,900},{27,16,882},{0,20,900},{10,0,890},{10,0,890},{10,0,890},{10,0,890},{8,22,10},{8,22,10},{8,22,10},{8,15,10},{3,18,5}, +{3,18,5},{13,31,2606},{11,30,968},{12,24,1314},{11,23,945},{11,31,3519},{8,27,936},{9,23,17},{8,20,1314},{0,28,3085},{2,21,942},{15,31,995},{14,28,10},{14,24,101},{13,23,179},{27,2,3051},{7,28,891},{9,23,13},{0,21,891},{31,12,3051},{0,21,891},{11,31,925},{11,31,925},{11,31,925},{11,22,900},{9,30,654},{9,23,8},{9,23,8},{8,18,76},{2,23,651},{5,18,24},{14,27,1}, +{14,27,1},{14,27,1},{14,20,5},{24,0,648},{9,23,4},{9,23,4},{6,18,5},{24,12,648},{6,18,5},{31,0,884},{14,28,9},{16,23,10},{9,23,9},{31,0,884},{30,16,884},{9,23,9},{0,21,890},{30,16,884},{0,21,890},{11,0,900},{11,0,900},{11,0,900},{11,0,900},{9,24,5},{9,24,5},{9,24,5},{9,16,8},{4,19,5},{4,19,5},{14,31,2804},{12,31,948},{13,25,1314}, +{12,24,943},{12,31,3652},{9,28,936},{10,24,13},{9,21,1314},{0,29,3052},{3,22,942},{16,31,1054},{15,29,10},{15,25,101},{14,24,197},{29,0,3051},{8,29,891},{10,24,9},{1,22,891},{30,14,3051},{1,22,891},{12,31,939},{12,31,939},{12,31,939},{12,23,891},{10,31,654},{10,24,9},{10,24,9},{9,19,76},{3,24,652},{6,19,24},{15,28,2},{15,28,2},{15,28,2},{15,21,5},{25,1,648}, +{11,23,5},{11,23,5},{7,19,5},{27,12,648},{7,19,5},{31,3,884},{15,29,9},{17,24,5},{10,24,5},{31,3,884},{31,17,884},{10,24,5},{0,22,890},{31,17,884},{0,22,890},{12,0,890},{12,0,890},{12,0,890},{12,0,890},{10,25,5},{10,25,5},{10,25,5},{10,17,8},{5,20,5},{5,20,5},{15,31,2956},{14,31,979},{14,26,1314},{13,25,943},{13,31,3841},{10,29,936},{11,25,13}, +{10,22,1314},{1,30,3052},{4,23,948},{17,31,1144},{16,30,20},{16,26,89},{15,25,197},{30,1,3051},{9,30,891},{11,25,9},{2,23,891},{31,15,3051},{2,23,891},{14,31,979},{14,31,979},{14,31,979},{13,24,891},{11,31,670},{11,25,9},{11,25,9},{10,20,86},{4,25,652},{6,20,18},{16,28,5},{16,28,5},{16,28,5},{16,22,8},{27,0,648},{12,24,5},{12,24,5},{7,20,2},{30,12,648}, +{7,20,2},{28,12,882},{15,31,10},{18,25,5},{11,25,5},{28,12,882},{28,20,882},{11,25,5},{0,23,890},{28,20,882},{0,23,890},{13,0,890},{13,0,890},{13,0,890},{13,0,890},{11,26,5},{11,26,5},{11,26,5},{11,18,8},{6,21,5},{6,21,5},{16,31,3182},{15,31,1028},{15,27,1314},{14,26,943},{15,31,4020},{11,30,936},{12,26,15},{11,23,1314},{2,31,3052},{5,24,958},{18,31,1270}, +{17,31,20},{17,27,89},{16,26,184},{28,8,3048},{10,31,891},{12,26,6},{2,24,901},{24,20,3048},{2,24,901},{15,31,1003},{15,31,1003},{15,31,1003},{14,25,891},{12,31,707},{12,26,11},{12,26,11},{11,21,86},{5,26,652},{7,21,18},{17,29,5},{17,29,5},{17,29,5},{17,23,8},{28,1,648},{12,26,2},{12,26,2},{8,21,2},{31,13,648},{8,21,2},{29,13,882},{16,31,5},{19,26,5}, +{12,26,5},{29,13,882},{31,20,882},{12,26,5},{0,24,900},{31,20,882},{0,24,900},{14,0,890},{14,0,890},{14,0,890},{14,0,890},{12,26,10},{12,26,10},{12,26,10},{12,19,10},{7,22,5},{7,22,5},{17,31,3508},{16,31,1175},{16,28,1314},{15,27,945},{16,31,4209},{12,31,936},{13,27,17},{12,24,1314},{4,31,3100},{6,25,942},{20,31,1368},{18,31,37},{18,28,101},{17,27,179},{31,6,3051}, +{12,31,900},{13,27,13},{4,25,891},{30,19,3051},{4,25,891},{16,31,1054},{16,31,1054},{16,31,1054},{15,26,900},{14,31,780},{13,27,8},{13,27,8},{12,22,76},{6,27,651},{9,22,24},{18,31,1},{18,31,1},{18,31,1},{18,24,5},{28,4,648},{13,27,4},{13,27,4},{10,22,5},{28,16,648},{10,22,5},{31,12,884},{18,31,36},{20,27,10},{13,27,9},{31,12,884},{30,22,884},{13,27,9}, +{0,25,890},{30,22,884},{0,25,890},{15,0,900},{15,0,900},{15,0,900},{15,0,900},{13,28,5},{13,28,5},{13,28,5},{13,20,8},{8,23,5},{8,23,5},{19,31,3790},{17,31,1412},{17,29,1314},{16,28,943},{17,31,4452},{14,31,954},{14,28,13},{13,25,1314},{7,31,3196},{7,26,942},{21,31,1494},{19,31,126},{19,29,101},{18,28,197},{31,8,3051},{14,31,950},{14,28,9},{5,26,891},{30,20,3051}, +{5,26,891},{17,31,1123},{17,31,1123},{17,31,1123},{16,27,891},{15,31,820},{14,28,9},{14,28,9},{13,23,76},{7,28,652},{10,23,24},{19,31,5},{19,31,5},{19,31,5},{19,25,5},{29,5,648},{15,27,5},{15,27,5},{11,23,5},{31,16,648},{11,23,5},{31,15,884},{20,31,80},{21,28,5},{14,28,5},{31,15,884},{31,23,884},{14,28,5},{0,26,890},{31,23,884},{0,26,890},{16,0,890}, +{16,0,890},{16,0,890},{16,0,890},{14,29,5},{14,29,5},{14,29,5},{14,21,8},{9,24,5},{9,24,5},{20,31,4072},{18,31,1694},{18,30,1314},{17,29,943},{19,31,4705},{15,31,1064},{15,29,13},{14,26,1314},{8,31,3355},{8,27,948},{22,31,1656},{20,31,276},{20,30,89},{19,29,197},{31,11,3051},{16,31,1054},{15,29,9},{6,27,891},{31,21,3051},{6,27,891},{18,31,1210},{18,31,1210},{18,31,1210}, +{17,28,891},{16,31,897},{15,29,9},{15,29,9},{14,24,86},{8,29,652},{10,24,18},{20,31,20},{20,31,20},{20,31,20},{20,26,8},{31,4,648},{16,28,5},{16,28,5},{11,24,2},{30,18,648},{11,24,2},{28,24,882},{22,31,157},{22,29,5},{15,29,5},{28,24,882},{24,28,882},{15,29,5},{0,27,890},{24,28,882},{0,27,890},{17,0,890},{17,0,890},{17,0,890},{17,0,890},{15,30,5}, +{15,30,5},{15,30,5},{15,22,8},{10,25,5},{10,25,5},{21,31,4390},{19,31,2007},{19,31,1314},{18,30,943},{20,31,4932},{16,31,1287},{16,30,15},{15,27,1314},{11,31,3547},{9,28,958},{23,31,1784},{22,31,465},{21,31,89},{20,30,184},{28,20,3048},{18,31,1188},{16,30,6},{6,28,901},{28,24,3048},{6,28,901},{19,31,1278},{19,31,1278},{19,31,1278},{18,29,891},{17,31,1011},{16,30,11},{16,30,11}, +{15,25,86},{9,30,652},{11,25,18},{21,31,53},{21,31,53},{21,31,53},{21,27,8},{31,7,648},{16,30,2},{16,30,2},{12,25,2},{31,19,648},{12,25,2},{29,25,882},{24,31,269},{23,30,5},{16,30,5},{29,25,882},{27,28,882},{16,30,5},{0,28,900},{27,28,882},{0,28,900},{18,0,890},{18,0,890},{18,0,890},{18,0,890},{16,30,10},{16,30,10},{16,30,10},{16,23,10},{11,26,5}, +{11,26,5},{22,31,4471},{20,31,2295},{20,31,1395},{19,31,936},{21,31,4906},{18,31,1414},{17,31,8},{16,28,1161},{13,31,3570},{11,28,818},{24,31,1769},{23,31,590},{23,31,106},{22,30,146},{29,21,2814},{19,31,1206},{17,31,4},{8,29,786},{31,24,2814},{8,29,786},{20,31,1395},{20,31,1395},{20,31,1395},{19,30,900},{19,31,1134},{17,31,8},{17,31,8},{16,26,76},{10,31,651},{13,26,24},{23,31,106}, +{23,31,106},{23,31,106},{22,28,5},{28,16,648},{17,31,4},{17,31,4},{14,26,5},{24,24,648},{14,26,5},{31,24,761},{26,31,317},{24,31,1},{17,31,0},{31,24,761},{30,28,761},{17,31,0},{0,29,785},{30,28,761},{0,29,785},{19,0,900},{19,0,900},{19,0,900},{19,0,900},{17,31,8},{17,31,8},{17,31,8},{17,24,8},{12,27,5},{12,27,5},{23,31,3955},{22,31,2260},{21,31,1530}, +{20,31,891},{22,31,4375},{19,31,1194},{18,31,54},{17,28,805},{15,31,3075},{12,29,498},{25,31,1417},{24,31,510},{24,31,149},{23,30,74},{31,19,2249},{21,31,937},{19,31,5},{11,29,482},{31,25,2249},{11,29,482},{21,31,1530},{21,31,1530},{21,31,1530},{20,31,891},{20,31,1251},{18,31,54},{18,31,54},{17,27,76},{12,31,691},{14,27,24},{24,31,149},{24,31,149},{24,31,149},{23,29,5},{29,17,648}, +{19,31,5},{19,31,5},{15,27,5},{27,24,648},{15,27,5},{29,29,481},{27,31,202},{25,31,4},{20,31,1},{29,29,481},{31,28,481},{20,31,1},{0,29,481},{31,28,481},{0,29,481},{20,0,890},{20,0,890},{20,0,890},{20,0,890},{18,31,29},{18,31,29},{18,31,29},{18,25,8},{13,28,5},{13,28,5},{24,31,3609},{23,31,2199},{22,31,1683},{21,31,915},{23,31,3827},{20,31,1071},{19,31,153}, +{18,29,485},{16,31,2690},{13,30,306},{26,31,1133},{25,31,489},{25,31,200},{24,31,20},{29,25,1769},{22,31,710},{21,31,41},{12,30,290},{27,28,1769},{12,30,290},{22,31,1683},{22,31,1683},{22,31,1683},{21,31,915},{21,31,1401},{19,31,153},{19,31,153},{18,28,86},{14,31,769},{14,28,18},{25,31,200},{25,31,200},{25,31,200},{24,30,8},{31,16,648},{21,31,41},{21,31,41},{15,28,2},{30,24,648}, +{15,28,2},{31,27,265},{28,31,113},{27,31,1},{23,31,1},{31,27,265},{31,29,265},{23,31,1},{0,30,289},{31,29,265},{0,30,289},{21,0,890},{21,0,890},{21,0,890},{21,0,890},{19,31,53},{19,31,53},{19,31,53},{19,26,8},{14,29,5},{14,29,5},{24,31,3305},{24,31,2222},{23,31,1795},{22,31,990},{24,31,3438},{22,31,1087},{21,31,306},{19,30,293},{18,31,2403},{15,30,118},{27,31,857}, +{26,31,465},{26,31,269},{25,31,8},{31,23,1374},{24,31,546},{23,31,98},{14,30,114},{31,27,1374},{14,30,114},{23,31,1795},{23,31,1795},{23,31,1795},{22,31,990},{22,31,1587},{21,31,306},{21,31,306},{19,29,86},{16,31,897},{15,29,18},{26,31,269},{26,31,269},{26,31,269},{25,31,8},{31,19,648},{23,31,98},{23,31,98},{16,29,2},{31,25,648},{16,29,2},{31,28,113},{29,31,52},{28,31,1}, +{26,31,1},{31,28,113},{30,30,113},{26,31,1},{0,30,113},{30,30,113},{0,30,113},{22,0,890},{22,0,890},{22,0,890},{22,0,890},{20,31,90},{20,31,90},{20,31,90},{20,27,10},{15,30,5},{15,30,5},{25,31,3092},{25,31,2292},{24,31,1978},{24,31,1123},{25,31,3124},{23,31,1068},{22,31,525},{20,30,140},{20,31,2196},{16,31,41},{28,31,680},{27,31,458},{27,31,337},{26,31,65},{29,29,1032}, +{26,31,456},{24,31,185},{16,31,37},{31,28,1032},{16,31,37},{24,31,1978},{24,31,1978},{24,31,1978},{24,31,1123},{24,31,1769},{22,31,525},{22,31,525},{20,30,76},{18,31,1080},{17,30,24},{27,31,337},{27,31,337},{27,31,337},{26,31,65},{28,28,648},{24,31,185},{24,31,185},{18,30,5},{28,28,648},{18,30,5},{31,30,18},{30,31,9},{30,31,0},{29,31,0},{31,30,18},{30,31,18},{29,31,0}, +{0,31,36},{30,31,18},{0,31,36},{23,0,900},{23,0,900},{23,0,900},{23,0,900},{22,31,164},{22,31,164},{22,31,164},{21,28,8},{16,31,5},{16,31,5},{27,31,2818},{26,31,2254},{25,31,2043},{25,31,1243},{26,31,2829},{24,31,1099},{23,31,684},{21,31,72},{22,31,2007},{18,31,20},{29,31,566},{28,31,420},{28,31,356},{27,31,122},{31,27,771},{27,31,386},{26,31,232},{19,31,1},{31,29,771}, +{19,31,1},{25,31,2043},{25,31,2043},{25,31,2043},{25,31,1243},{25,31,1819},{23,31,684},{23,31,684},{21,31,72},{20,31,1172},{18,31,20},{28,31,356},{28,31,356},{28,31,356},{27,31,122},{31,25,578},{26,31,232},{26,31,232},{19,31,1},{27,30,578},{19,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{24,0,890}, +{24,0,890},{24,0,890},{24,0,890},{23,31,200},{23,31,200},{23,31,200},{22,29,8},{18,31,20},{18,31,20},{27,31,2242},{27,31,1879},{26,31,1738},{26,31,1150},{27,31,2209},{24,31,987},{24,31,626},{23,31,20},{23,31,1560},{19,31,53},{29,31,342},{29,31,257},{29,31,221},{28,31,68},{31,28,452},{28,31,228},{27,31,137},{22,31,1},{30,30,452},{22,31,1},{26,31,1738},{26,31,1738},{26,31,1738}, +{26,31,1150},{25,31,1499},{24,31,626},{24,31,626},{23,31,20},{22,31,950},{19,31,53},{29,31,221},{29,31,221},{29,31,221},{28,31,68},{31,26,340},{27,31,137},{27,31,137},{22,31,1},{30,29,340},{22,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{25,0,890},{25,0,890},{25,0,890},{25,0,890},{24,31,265}, +{24,31,265},{24,31,265},{23,30,8},{19,31,53},{19,31,53},{28,31,1844},{27,31,1559},{27,31,1438},{27,31,1075},{27,31,1713},{26,31,853},{25,31,635},{24,31,10},{24,31,1207},{21,31,125},{30,31,172},{30,31,145},{29,31,125},{29,31,40},{31,29,216},{29,31,121},{28,31,68},{24,31,1},{31,30,216},{24,31,1},{27,31,1438},{27,31,1438},{27,31,1438},{27,31,1075},{27,31,1229},{25,31,635},{25,31,635}, +{24,31,10},{23,31,756},{21,31,125},{29,31,125},{29,31,125},{29,31,125},{29,31,40},{31,28,164},{28,31,68},{28,31,68},{24,31,1},{30,30,164},{24,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{26,0,890},{26,0,890},{26,0,890},{26,0,890},{25,31,346},{25,31,346},{25,31,346},{24,31,10},{21,31,125}, +{21,31,125},{0,19,1568},{0,13,202},{0,10,13},{0,8,596},{0,13,3371},{0,9,2162},{0,8,1080},{0,5,2539},{0,6,3648},{0,5,2708},{0,19,1568},{0,13,202},{0,10,13},{0,8,596},{6,1,3371},{0,9,2162},{0,8,1080},{0,5,2539},{13,0,3371},{0,5,2539},{0,9,0},{0,9,0},{0,9,0},{0,4,4},{0,4,290},{0,4,125},{0,4,125},{0,2,164},{0,2,321},{0,2,189},{0,9,0}, +{0,9,0},{0,9,0},{0,4,4},{2,1,290},{0,4,125},{0,4,125},{0,2,164},{4,0,290},{0,2,164},{9,1,1568},{0,13,202},{0,10,13},{0,8,596},{9,1,1568},{19,0,1568},{0,8,596},{0,6,1586},{19,0,1568},{0,6,1586},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,22,1568},{0,15,117},{0,11,8}, +{0,9,485},{0,15,3971},{0,10,2369},{0,9,1061},{0,6,2834},{0,7,4341},{0,6,3090},{0,22,1568},{0,15,117},{0,11,8},{0,9,485},{7,1,3968},{0,10,2369},{0,9,1061},{0,6,2834},{11,2,3968},{0,6,2834},{0,12,1},{0,12,1},{0,12,1},{0,6,0},{0,6,512},{0,5,194},{0,5,194},{0,3,320},{0,3,576},{0,2,381},{0,12,1},{0,12,1},{0,12,1},{0,6,0},{3,0,512}, +{0,5,194},{0,5,194},{0,3,320},{6,0,512},{0,3,320},{11,0,1568},{0,15,117},{0,11,8},{0,9,485},{11,0,1568},{22,0,1568},{0,9,485},{0,7,1586},{22,0,1568},{0,7,1586},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,25,1568},{0,17,45},{0,12,58},{0,10,392},{0,17,4652},{0,11,2596},{0,10,1121}, +{0,7,3254},{0,8,5140},{0,6,3570},{0,25,1568},{0,17,45},{0,12,58},{0,10,392},{8,1,4652},{0,11,2596},{0,10,1121},{0,7,3254},{17,0,4652},{0,7,3254},{0,15,1},{0,15,1},{0,15,1},{0,7,4},{0,7,802},{0,6,320},{0,6,320},{0,3,512},{0,3,896},{0,3,576},{0,15,1},{0,15,1},{0,15,1},{0,7,4},{3,2,802},{0,6,320},{0,6,320},{0,3,512},{7,0,802}, +{0,3,512},{12,1,1568},{0,17,45},{1,12,13},{0,10,392},{12,1,1568},{25,0,1568},{0,10,392},{0,8,1576},{25,0,1568},{0,8,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,28,1570},{0,19,16},{0,13,178},{0,11,340},{0,19,5424},{0,13,2843},{0,11,1240},{0,8,3704},{0,9,6003},{0,7,4095},{0,28,1570}, +{0,19,16},{1,13,122},{0,11,340},{7,5,5419},{0,13,2843},{0,11,1240},{0,8,3704},{15,2,5419},{0,8,3704},{0,18,1},{0,18,1},{0,18,1},{0,9,1},{0,9,1152},{0,7,461},{0,7,461},{0,4,709},{0,4,1281},{0,4,830},{0,18,1},{0,18,1},{0,18,1},{0,9,1},{4,1,1152},{0,7,461},{0,7,461},{0,4,709},{9,0,1152},{0,4,709},{14,0,1568},{0,19,16},{2,13,13}, +{0,11,340},{14,0,1568},{26,1,1568},{0,11,340},{0,9,1576},{26,1,1568},{0,9,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,29,1633},{1,20,75},{1,14,265},{0,13,313},{0,22,5419},{0,14,2571},{0,12,853},{0,9,3410},{0,10,6244},{0,9,3986},{1,29,1569},{1,20,11},{2,14,117},{0,13,313},{11,0,5419}, +{0,14,2571},{0,12,853},{0,9,3410},{22,0,5419},{0,9,3410},{1,19,65},{1,19,65},{1,19,65},{1,10,65},{0,12,1152},{0,9,289},{0,9,289},{0,5,580},{0,5,1393},{0,5,749},{1,19,1},{1,19,1},{1,19,1},{1,10,1},{4,4,1152},{0,9,289},{0,9,289},{0,5,580},{12,0,1152},{0,5,580},{13,5,1568},{0,21,4},{3,14,13},{0,13,232},{13,5,1568},{31,0,1568},{0,13,232}, +{0,10,1586},{31,0,1568},{0,10,1586},{1,0,65},{1,0,65},{1,0,65},{1,0,65},{0,3,1},{0,3,1},{0,3,1},{0,2,1},{0,1,20},{0,1,20},{1,31,1731},{1,22,149},{2,15,457},{1,14,377},{0,25,5419},{0,16,2347},{0,13,556},{0,10,3179},{0,11,6495},{0,9,3890},{2,30,1569},{2,21,11},{3,15,117},{1,14,313},{12,1,5419},{0,16,2347},{0,13,556},{0,10,3179},{25,0,5419}, +{0,10,3179},{1,22,145},{1,22,145},{1,22,145},{1,11,154},{0,15,1152},{0,11,194},{0,11,194},{0,6,481},{0,7,1531},{0,6,737},{2,20,1},{2,20,1},{2,20,1},{2,11,1},{5,5,1152},{0,11,194},{0,11,194},{0,6,481},{15,0,1152},{0,6,481},{17,0,1568},{1,22,4},{4,15,8},{0,14,157},{17,0,1568},{30,2,1568},{0,14,157},{0,11,1586},{30,2,1568},{0,11,1586},{1,0,145}, +{1,0,145},{1,0,145},{1,0,145},{0,6,1},{0,6,1},{0,6,1},{0,3,1},{0,3,65},{0,3,65},{2,31,1977},{2,23,341},{2,16,707},{1,15,510},{0,28,5424},{0,17,2137},{0,15,373},{0,11,3035},{0,13,6709},{0,10,3860},{3,31,1569},{3,22,11},{4,16,122},{2,15,313},{14,0,5419},{0,17,2137},{0,15,373},{0,11,3035},{26,1,5419},{0,11,3035},{2,23,337},{2,23,337},{2,23,337}, +{2,12,341},{0,18,1152},{0,13,104},{0,13,104},{0,8,410},{0,8,1686},{0,7,786},{3,21,1},{3,21,1},{3,21,1},{3,12,2},{9,0,1152},{0,13,104},{0,13,104},{0,8,410},{18,0,1152},{0,8,410},{18,1,1568},{2,23,4},{5,16,13},{0,15,117},{18,1,1568},{31,3,1568},{0,15,117},{0,12,1576},{31,3,1568},{0,12,1576},{2,0,337},{2,0,337},{2,0,337},{2,0,337},{0,9,1}, +{0,9,1},{0,9,1},{0,5,4},{0,4,130},{0,4,130},{3,31,2353},{2,24,570},{3,17,1027},{2,16,714},{0,31,5424},{0,19,1979},{0,16,195},{0,12,2857},{0,14,7039},{0,11,3919},{4,31,1576},{4,23,16},{5,17,122},{3,16,331},{15,1,5419},{0,19,1979},{0,16,195},{0,12,2857},{27,2,5419},{0,12,2857},{2,26,546},{2,26,546},{2,26,546},{2,14,546},{0,21,1152},{0,14,50},{0,14,50}, +{0,9,305},{0,9,1856},{0,8,830},{4,22,1},{4,22,1},{4,22,1},{4,13,1},{10,1,1152},{0,14,50},{0,14,50},{0,9,305},{21,0,1152},{0,9,305},{19,2,1568},{3,24,10},{6,17,13},{0,16,74},{19,2,1568},{30,5,1568},{0,16,74},{0,13,1576},{30,5,1568},{0,13,1576},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,12,0},{0,12,0},{0,12,0},{0,6,1},{0,5,205}, +{0,5,205},{4,31,2980},{3,26,925},{3,19,1484},{2,17,1032},{1,31,5504},{0,21,1811},{0,17,61},{0,13,2651},{0,16,7420},{0,13,3876},{6,31,1619},{5,24,11},{6,18,117},{4,17,313},{17,0,5419},{0,21,1811},{0,17,61},{0,13,2651},{30,2,5419},{0,13,2651},{3,27,900},{3,27,900},{3,27,900},{3,15,900},{0,24,1152},{0,16,8},{0,16,8},{0,10,208},{0,11,2124},{0,9,881},{5,23,1}, +{5,23,1},{5,23,1},{5,14,1},{12,0,1152},{0,16,8},{0,16,8},{0,10,208},{24,0,1152},{0,10,208},{21,1,1568},{4,25,4},{7,18,13},{0,17,45},{21,1,1568},{27,8,1568},{0,17,45},{0,14,1586},{27,8,1568},{0,14,1586},{3,0,900},{3,0,900},{3,0,900},{3,0,900},{0,15,1},{0,15,1},{0,15,1},{0,8,4},{0,6,356},{0,6,356},{4,31,3668},{3,27,1320},{4,20,1940}, +{3,18,1352},{2,31,5771},{0,23,1737},{0,18,37},{0,14,2486},{0,17,7711},{0,14,3930},{7,31,1635},{6,25,11},{7,19,117},{5,18,313},{18,1,5419},{0,23,1737},{0,18,37},{0,14,2486},{31,3,5419},{0,14,2486},{3,30,1252},{3,30,1252},{3,30,1252},{3,16,1256},{0,27,1152},{0,18,1},{0,18,1},{0,11,164},{0,12,2369},{0,10,1001},{6,24,1},{6,24,1},{6,24,1},{6,15,1},{13,1,1152}, +{0,18,1},{0,18,1},{0,11,164},{27,0,1152},{0,11,164},{23,0,1568},{5,26,4},{8,19,8},{0,18,36},{23,0,1568},{30,8,1568},{0,18,36},{0,15,1586},{30,8,1568},{0,15,1586},{3,0,1252},{3,0,1252},{3,0,1252},{3,0,1252},{0,18,1},{0,18,1},{0,18,1},{0,9,1},{0,7,505},{0,7,505},{5,31,4346},{4,28,1644},{5,21,2372},{4,19,1703},{3,31,6079},{0,24,1644},{0,20,38}, +{0,15,2390},{0,18,7969},{0,15,3907},{8,31,1682},{7,26,11},{8,20,122},{6,19,313},{19,2,5419},{0,24,1640},{0,20,34},{0,15,2386},{30,5,5419},{0,15,2386},{4,31,1587},{4,31,1587},{4,31,1587},{4,17,1590},{0,30,1156},{0,20,29},{0,20,29},{0,12,117},{0,13,2483},{0,11,1044},{7,25,1},{7,25,1},{7,25,1},{7,16,2},{15,0,1152},{1,19,1},{1,19,1},{0,12,113},{30,0,1152}, +{0,12,113},{24,1,1568},{6,27,4},{9,20,13},{0,20,25},{24,1,1568},{31,9,1568},{0,20,25},{0,16,1576},{31,9,1568},{0,16,1576},{4,0,1586},{4,0,1586},{4,0,1586},{4,0,1586},{0,21,5},{0,21,5},{0,21,5},{0,11,8},{0,9,565},{0,9,565},{7,31,4580},{5,29,1644},{6,22,2372},{4,20,1692},{4,31,6228},{1,25,1644},{1,21,38},{1,16,2348},{0,20,7577},{0,16,3408},{9,31,1760}, +{8,27,16},{9,21,122},{7,20,331},{19,5,5419},{0,26,1593},{2,20,27},{0,16,2252},{31,6,5419},{0,16,2252},{5,31,1590},{5,31,1590},{5,31,1590},{5,18,1590},{1,31,1156},{1,21,29},{1,21,29},{1,13,117},{0,15,2241},{0,13,699},{8,26,1},{8,26,1},{8,26,1},{8,17,1},{16,1,1152},{2,20,2},{2,20,2},{0,13,74},{31,1,1152},{0,13,74},{26,0,1568},{7,28,10},{10,21,13}, +{0,21,10},{26,0,1568},{30,11,1568},{0,21,10},{0,17,1576},{30,11,1568},{0,17,1576},{5,0,1586},{5,0,1586},{5,0,1586},{5,0,1586},{1,22,5},{1,22,5},{1,22,5},{1,12,8},{0,10,433},{0,10,433},{8,31,4826},{6,30,1644},{7,23,2352},{6,21,1676},{5,31,6463},{2,26,1644},{2,22,38},{2,17,2348},{0,22,7196},{0,17,2863},{11,31,1865},{9,28,11},{10,22,117},{8,21,313},{23,0,5419}, +{1,27,1586},{2,22,29},{0,18,2115},{30,8,5419},{0,18,2115},{6,31,1612},{6,31,1612},{6,31,1612},{6,19,1585},{3,30,1179},{3,21,29},{3,21,29},{2,14,122},{0,17,1953},{0,14,426},{9,27,1},{9,27,1},{9,27,1},{9,18,1},{16,4,1152},{3,21,4},{3,21,4},{0,15,49},{28,4,1152},{0,15,49},{25,5,1568},{8,29,4},{11,22,13},{1,22,4},{25,5,1568},{31,12,1568},{1,22,4}, +{0,18,1586},{31,12,1568},{0,18,1586},{6,0,1576},{6,0,1576},{6,0,1576},{6,0,1576},{2,24,10},{2,24,10},{2,24,10},{2,13,10},{0,13,272},{0,13,272},{9,31,5108},{7,31,1644},{8,24,2372},{7,22,1676},{7,31,6660},{3,27,1644},{3,23,38},{3,18,2348},{0,23,6891},{0,18,2519},{12,31,1952},{10,29,11},{11,23,117},{9,22,313},{24,1,5419},{2,28,1584},{3,23,29},{0,19,2027},{31,9,5419}, +{0,19,2027},{7,31,1640},{7,31,1640},{7,31,1640},{7,20,1580},{4,31,1188},{3,23,34},{3,23,34},{3,15,122},{0,19,1795},{0,15,261},{10,28,1},{10,28,1},{10,28,1},{10,19,1},{17,5,1152},{4,22,1},{4,22,1},{0,16,26},{31,4,1152},{0,16,26},{29,0,1568},{9,30,4},{12,23,8},{2,23,4},{29,0,1568},{30,14,1568},{2,23,4},{0,19,1586},{30,14,1568},{0,19,1586},{7,0,1576}, +{7,0,1576},{7,0,1576},{7,0,1576},{3,24,10},{3,24,10},{3,24,10},{3,14,10},{0,14,170},{0,14,170},{10,31,5426},{8,31,1695},{9,25,2372},{8,23,1703},{8,31,6861},{4,28,1644},{4,24,38},{3,19,2372},{0,25,6573},{0,19,2268},{13,31,2066},{11,30,11},{12,24,122},{10,23,313},{26,0,5419},{3,29,1584},{4,24,34},{0,20,1937},{30,11,5419},{0,20,1937},{8,31,1686},{8,31,1686},{8,31,1686}, +{8,21,1590},{5,31,1206},{4,24,29},{4,24,29},{4,16,117},{0,20,1602},{0,17,126},{11,29,1},{11,29,1},{11,29,1},{11,20,2},{21,0,1152},{5,23,1},{5,23,1},{0,17,5},{30,6,1152},{0,17,5},{30,1,1568},{10,31,4},{13,24,13},{3,24,10},{30,1,1568},{31,15,1568},{3,24,10},{0,20,1576},{31,15,1568},{0,20,1576},{8,0,1586},{8,0,1586},{8,0,1586},{8,0,1586},{4,25,5}, +{4,25,5},{4,25,5},{4,15,8},{0,16,90},{0,16,90},{11,31,5658},{9,31,1836},{10,26,2372},{8,24,1692},{9,31,7116},{5,29,1644},{5,25,38},{5,20,2348},{0,26,6379},{0,21,2028},{14,31,2216},{12,31,16},{13,25,122},{11,24,331},{27,1,5419},{2,31,1584},{6,24,27},{0,21,1832},{27,14,5419},{0,21,1832},{9,31,1755},{9,31,1755},{9,31,1755},{9,22,1590},{6,31,1260},{5,25,29},{5,25,29}, +{5,17,117},{0,22,1459},{0,18,38},{12,30,1},{12,30,1},{12,30,1},{12,21,1},{22,1,1152},{6,24,2},{6,24,2},{0,18,2},{31,7,1152},{0,18,2},{31,2,1568},{11,31,13},{14,25,13},{4,25,10},{31,2,1568},{30,17,1568},{4,25,10},{0,21,1576},{30,17,1568},{0,21,1576},{9,0,1586},{9,0,1586},{9,0,1586},{9,0,1586},{5,26,5},{5,26,5},{5,26,5},{5,16,8},{0,18,37}, +{0,18,37},{12,31,6036},{11,31,2033},{11,27,2352},{10,25,1676},{11,31,7423},{6,30,1644},{6,26,38},{6,21,2348},{0,28,6109},{0,22,1794},{15,31,2371},{13,31,50},{14,26,117},{12,25,313},{29,0,5419},{5,31,1586},{6,26,29},{0,22,1730},{30,14,5419},{0,22,1730},{10,31,1865},{10,31,1865},{10,31,1865},{10,23,1585},{7,31,1339},{7,25,29},{7,25,29},{6,18,122},{0,23,1345},{0,19,16},{13,31,1}, +{13,31,1},{13,31,1},{13,22,1},{24,0,1152},{7,25,4},{7,25,4},{2,19,1},{24,12,1152},{2,19,1},{29,9,1568},{14,31,41},{15,26,13},{5,26,4},{29,9,1568},{27,20,1568},{5,26,4},{0,22,1586},{27,20,1568},{0,22,1586},{10,0,1576},{10,0,1576},{10,0,1576},{10,0,1576},{6,28,10},{6,28,10},{6,28,10},{6,17,10},{0,20,13},{0,20,13},{13,31,6450},{12,31,2268},{12,28,2372}, +{11,26,1676},{12,31,7676},{7,31,1644},{7,27,38},{7,22,2348},{0,30,5924},{0,23,1695},{17,31,2536},{15,31,139},{15,27,117},{13,26,313},{30,1,5419},{7,31,1635},{7,27,29},{0,23,1686},{31,15,5419},{0,23,1686},{11,31,1937},{11,31,1937},{11,31,1937},{11,24,1580},{9,31,1420},{7,27,34},{7,27,34},{7,19,122},{0,25,1234},{1,20,17},{14,31,10},{14,31,10},{14,31,10},{14,23,1},{25,1,1152}, +{8,26,1},{8,26,1},{2,20,2},{27,12,1152},{2,20,2},{31,8,1568},{15,31,90},{16,27,8},{6,27,4},{31,8,1568},{30,20,1568},{6,27,4},{0,23,1586},{30,20,1568},{0,23,1586},{11,0,1576},{11,0,1576},{11,0,1576},{11,0,1576},{7,28,10},{7,28,10},{7,28,10},{7,18,10},{0,21,10},{0,21,10},{15,31,6772},{13,31,2595},{13,29,2372},{12,27,1703},{13,31,7985},{8,31,1725},{8,28,38}, +{7,23,2372},{0,31,5773},{0,24,1644},{18,31,2722},{16,31,261},{16,28,122},{14,27,313},{31,2,5419},{8,31,1721},{8,28,34},{0,24,1640},{30,17,5419},{0,24,1640},{12,31,2027},{12,31,2027},{12,31,2027},{12,25,1590},{10,31,1510},{8,28,29},{8,28,29},{8,20,117},{0,27,1188},{2,21,17},{15,31,26},{15,31,26},{15,31,26},{15,24,2},{27,0,1152},{9,27,1},{9,27,1},{3,21,2},{30,12,1152}, +{3,21,2},{31,11,1568},{17,31,180},{17,28,13},{7,28,10},{31,11,1568},{31,21,1568},{7,28,10},{0,24,1576},{31,21,1568},{0,24,1576},{12,0,1586},{12,0,1586},{12,0,1586},{12,0,1586},{8,29,5},{8,29,5},{8,29,5},{8,19,8},{1,22,10},{1,22,10},{16,31,7154},{14,31,2955},{14,30,2372},{12,28,1692},{14,31,8348},{10,31,1895},{9,29,38},{9,24,2348},{1,31,5956},{1,25,1644},{19,31,2866}, +{17,31,468},{17,29,122},{15,28,331},{31,5,5419},{10,31,1859},{10,28,27},{0,25,1601},{31,18,5419},{0,25,1601},{13,31,2162},{13,31,2162},{13,31,2162},{13,26,1590},{11,31,1590},{9,29,29},{9,29,29},{9,21,117},{0,28,1161},{3,22,17},{16,31,49},{16,31,49},{16,31,49},{16,25,1},{28,1,1152},{10,28,2},{10,28,2},{4,22,2},{31,13,1152},{4,22,2},{31,14,1568},{19,31,277},{18,29,13}, +{8,29,10},{31,14,1568},{30,23,1568},{8,29,10},{0,25,1576},{30,23,1568},{0,25,1576},{13,0,1586},{13,0,1586},{13,0,1586},{13,0,1586},{9,30,5},{9,30,5},{9,30,5},{9,20,8},{2,23,10},{2,23,10},{17,31,7636},{15,31,3408},{15,31,2352},{14,29,1676},{16,31,8673},{11,31,2187},{10,30,38},{10,25,2348},{3,31,6235},{2,26,1644},{20,31,3112},{19,31,754},{18,30,117},{16,29,313},{31,8,5419}, +{12,31,2060},{10,30,29},{0,26,1587},{30,20,5419},{0,26,1587},{15,31,2252},{15,31,2252},{15,31,2252},{14,27,1585},{12,31,1740},{11,29,29},{11,29,29},{10,22,122},{0,30,1163},{4,23,16},{18,31,85},{18,31,85},{18,31,85},{17,26,1},{28,4,1152},{11,29,4},{11,29,4},{6,23,1},{28,16,1152},{6,23,1},{29,21,1568},{20,31,436},{19,30,13},{9,30,4},{29,21,1568},{31,24,1568},{9,30,4}, +{0,26,1586},{31,24,1568},{0,26,1586},{14,0,1576},{14,0,1576},{14,0,1576},{14,0,1576},{10,31,13},{10,31,13},{10,31,13},{10,21,10},{3,24,10},{3,24,10},{18,31,8122},{16,31,3907},{16,31,2390},{15,30,1676},{17,31,9036},{12,31,2576},{11,31,38},{11,26,2348},{6,31,6555},{3,27,1644},{22,31,3392},{20,31,1044},{19,31,117},{17,30,313},{31,11,5419},{15,31,2284},{11,31,29},{0,27,1587},{31,21,5419}, +{0,27,1587},{16,31,2386},{16,31,2386},{16,31,2386},{15,28,1580},{14,31,1924},{11,31,34},{11,31,34},{11,23,122},{1,31,1163},{5,24,17},{19,31,113},{19,31,113},{19,31,113},{18,27,1},{29,5,1152},{12,30,1},{12,30,1},{6,24,2},{31,16,1152},{6,24,2},{31,20,1568},{22,31,593},{20,31,8},{10,31,4},{31,20,1568},{30,26,1568},{10,31,4},{0,27,1586},{30,26,1568},{0,27,1586},{15,0,1576}, +{15,0,1576},{15,0,1576},{15,0,1576},{11,31,25},{11,31,25},{11,31,25},{11,22,10},{4,25,10},{4,25,10},{19,31,7638},{17,31,4060},{17,31,2539},{16,30,1659},{18,31,8553},{14,31,2430},{13,31,37},{11,27,1940},{7,31,6120},{4,28,1320},{23,31,2996},{20,31,1064},{20,31,164},{19,30,186},{29,17,4803},{16,31,2018},{13,31,1},{1,28,1253},{27,24,4803},{1,28,1253},{17,31,2539},{17,31,2539},{17,31,2539}, +{16,29,1590},{15,31,2028},{13,31,37},{13,31,37},{12,24,117},{3,31,1170},{6,25,17},{20,31,164},{20,31,164},{20,31,164},{19,28,2},{31,4,1152},{13,31,1},{13,31,1},{7,25,2},{30,18,1152},{7,25,2},{31,22,1250},{24,31,505},{22,31,0},{13,31,0},{31,22,1250},{30,27,1250},{13,31,0},{0,28,1252},{30,27,1250},{0,28,1252},{16,0,1586},{16,0,1586},{16,0,1586},{16,0,1586},{13,31,37}, +{13,31,37},{13,31,37},{12,23,8},{5,26,10},{5,26,10},{20,31,7060},{19,31,3955},{18,31,2710},{17,31,1595},{19,31,7717},{15,31,2140},{14,31,77},{13,28,1480},{8,31,5539},{6,28,925},{23,31,2516},{22,31,945},{21,31,233},{20,30,100},{31,15,4056},{18,31,1656},{15,31,8},{4,28,900},{31,23,4056},{4,28,900},{18,31,2710},{18,31,2710},{18,31,2710},{17,30,1590},{16,31,2193},{14,31,77},{14,31,77}, +{13,25,117},{5,31,1233},{7,26,17},{21,31,233},{21,31,233},{21,31,233},{20,29,1},{31,7,1152},{15,31,8},{15,31,8},{8,26,2},{31,19,1152},{8,26,2},{31,23,884},{25,31,370},{23,31,4},{16,31,1},{31,23,884},{31,27,884},{16,31,1},{0,28,900},{31,27,884},{0,28,900},{17,0,1586},{17,0,1586},{17,0,1586},{17,0,1586},{14,31,52},{14,31,52},{14,31,52},{13,24,8},{6,27,10}, +{6,27,10},{21,31,6535},{20,31,3919},{19,31,2857},{18,31,1585},{20,31,6979},{16,31,1942},{15,31,195},{14,28,990},{11,31,4914},{7,29,562},{24,31,2045},{23,31,830},{22,31,338},{21,31,26},{29,21,3318},{19,31,1314},{17,31,52},{5,29,546},{31,24,3318},{5,29,546},{19,31,2857},{19,31,2857},{19,31,2857},{18,31,1585},{17,31,2436},{15,31,195},{15,31,195},{14,26,122},{7,31,1339},{8,27,16},{22,31,338}, +{22,31,338},{22,31,338},{21,30,1},{28,16,1152},{17,31,52},{17,31,52},{10,27,1},{24,24,1152},{10,27,1},{31,25,545},{26,31,221},{25,31,0},{19,31,0},{31,25,545},{31,28,545},{19,31,0},{0,29,545},{31,28,545},{0,29,545},{18,0,1576},{18,0,1576},{18,0,1576},{18,0,1576},{15,31,74},{15,31,74},{15,31,74},{14,25,10},{7,28,10},{7,28,10},{22,31,6151},{20,31,3935},{20,31,3035}, +{19,31,1640},{21,31,6458},{18,31,1902},{16,31,373},{15,29,670},{12,31,4499},{8,29,347},{25,31,1729},{24,31,786},{23,31,410},{22,31,1},{31,19,2753},{20,31,1094},{19,31,113},{8,29,338},{31,25,2753},{8,29,338},{20,31,3035},{20,31,3035},{20,31,3035},{19,31,1640},{19,31,2630},{16,31,373},{16,31,373},{15,27,122},{10,31,1483},{9,28,17},{23,31,410},{23,31,410},{23,31,410},{22,31,1},{29,17,1152}, +{19,31,113},{19,31,113},{10,28,2},{27,24,1152},{10,28,2},{31,26,317},{27,31,130},{26,31,9},{22,31,0},{31,26,317},{30,29,317},{22,31,0},{0,29,337},{30,29,317},{0,29,337},{19,0,1576},{19,0,1576},{19,0,1576},{19,0,1576},{16,31,117},{16,31,117},{16,31,117},{15,26,10},{8,29,10},{8,29,10},{23,31,5691},{22,31,4004},{21,31,3254},{20,31,1755},{22,31,6023},{19,31,1830},{18,31,606}, +{16,29,430},{14,31,4162},{9,30,155},{26,31,1481},{25,31,801},{24,31,505},{23,31,26},{29,25,2273},{22,31,914},{20,31,194},{9,30,146},{27,28,2273},{9,30,146},{21,31,3254},{21,31,3254},{21,31,3254},{20,31,1755},{20,31,2835},{18,31,606},{18,31,606},{16,28,117},{11,31,1665},{10,29,17},{24,31,505},{24,31,505},{24,31,505},{23,31,26},{31,16,1152},{20,31,194},{20,31,194},{11,29,2},{30,24,1152}, +{11,29,2},{31,28,145},{28,31,65},{28,31,1},{25,31,0},{31,28,145},{30,30,145},{25,31,0},{0,30,145},{30,30,145},{0,30,145},{20,0,1586},{20,0,1586},{20,0,1586},{20,0,1586},{17,31,180},{17,31,180},{17,31,180},{16,27,8},{9,30,10},{9,30,10},{24,31,5421},{23,31,3999},{22,31,3491},{21,31,1947},{23,31,5539},{20,31,1879},{19,31,853},{17,30,238},{16,31,3922},{11,30,81},{27,31,1229}, +{26,31,813},{26,31,617},{24,31,100},{31,23,1878},{23,31,822},{22,31,305},{12,30,66},{31,27,1878},{12,30,66},{22,31,3491},{22,31,3491},{22,31,3491},{21,31,1947},{21,31,3081},{19,31,853},{19,31,853},{17,29,117},{14,31,1905},{11,30,17},{26,31,617},{26,31,617},{26,31,617},{24,31,100},{31,19,1152},{22,31,305},{22,31,305},{12,30,2},{31,25,1152},{12,30,2},{31,29,45},{30,31,18},{29,31,4}, +{28,31,1},{31,29,45},{31,30,45},{28,31,1},{0,30,65},{31,30,45},{0,30,65},{21,0,1586},{21,0,1586},{21,0,1586},{21,0,1586},{18,31,261},{18,31,261},{18,31,261},{17,28,8},{10,31,10},{10,31,10},{24,31,5178},{24,31,4095},{23,31,3704},{22,31,2201},{24,31,5197},{21,31,2101},{20,31,1240},{18,31,153},{18,31,3760},{12,31,16},{28,31,1088},{27,31,830},{27,31,709},{26,31,245},{29,29,1536}, +{26,31,792},{24,31,461},{14,31,1},{31,28,1536},{14,31,1},{23,31,3704},{23,31,3704},{23,31,3704},{22,31,2201},{23,31,3396},{20,31,1240},{20,31,1240},{18,30,122},{15,31,2208},{12,31,16},{27,31,709},{27,31,709},{27,31,709},{26,31,245},{28,28,1152},{24,31,461},{24,31,461},{14,31,1},{28,28,1152},{14,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0}, +{0,31,0},{31,31,0},{0,31,0},{22,0,1576},{22,0,1576},{22,0,1576},{22,0,1576},{20,31,340},{20,31,340},{20,31,340},{18,29,10},{12,31,16},{12,31,16},{25,31,4468},{24,31,3615},{24,31,3254},{23,31,2060},{24,31,4413},{22,31,1834},{21,31,1205},{19,31,58},{19,31,3127},{14,31,53},{28,31,768},{28,31,576},{28,31,512},{27,31,170},{31,26,1068},{26,31,536},{25,31,338},{16,31,1},{30,29,1068}, +{16,31,1},{24,31,3254},{24,31,3254},{24,31,3254},{23,31,2060},{23,31,2852},{21,31,1205},{21,31,1205},{19,31,58},{16,31,1878},{14,31,53},{28,31,512},{28,31,512},{28,31,512},{27,31,170},{31,24,802},{25,31,338},{25,31,338},{16,31,1},{30,28,802},{16,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{23,0,1576}, +{23,0,1576},{23,0,1576},{23,0,1576},{21,31,421},{21,31,421},{21,31,421},{19,30,10},{14,31,53},{14,31,53},{26,31,3858},{25,31,3188},{25,31,2899},{24,31,1947},{25,31,3700},{23,31,1596},{23,31,1112},{20,31,8},{20,31,2588},{16,31,117},{29,31,498},{28,31,384},{28,31,320},{27,31,122},{31,27,683},{27,31,342},{26,31,212},{19,31,1},{31,29,683},{19,31,1},{25,31,2899},{25,31,2899},{25,31,2899}, +{24,31,1947},{24,31,2441},{23,31,1112},{23,31,1112},{20,31,8},{18,31,1568},{16,31,117},{28,31,320},{28,31,320},{28,31,320},{27,31,122},{29,29,512},{26,31,212},{26,31,212},{19,31,1},{31,28,512},{19,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{24,0,1586},{24,0,1586},{24,0,1586},{24,0,1586},{22,31,520}, +{22,31,520},{22,31,520},{20,31,8},{16,31,117},{16,31,117},{27,31,3258},{26,31,2790},{26,31,2594},{25,31,1875},{26,31,3105},{24,31,1447},{23,31,1080},{21,31,20},{22,31,2151},{18,31,208},{29,31,306},{29,31,221},{29,31,185},{28,31,64},{31,28,384},{28,31,192},{27,31,125},{22,31,1},{30,30,384},{22,31,1},{26,31,2594},{26,31,2594},{26,31,2594},{25,31,1875},{25,31,2131},{23,31,1080},{23,31,1080}, +{21,31,20},{20,31,1336},{18,31,208},{29,31,185},{29,31,185},{29,31,185},{28,31,64},{31,27,290},{27,31,125},{27,31,125},{22,31,1},{31,29,290},{22,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{25,0,1586},{25,0,1586},{25,0,1586},{25,0,1586},{23,31,596},{23,31,596},{23,31,596},{21,31,20},{18,31,208}, +{18,31,208},{0,25,2669},{0,18,320},{0,13,5},{0,11,985},{0,17,5885},{0,11,3745},{0,10,1746},{0,7,4421},{0,8,6385},{0,7,4782},{0,25,2669},{0,18,320},{0,13,5},{0,11,985},{8,1,5885},{0,11,3745},{0,10,1746},{0,7,4421},{17,0,5885},{0,7,4421},{0,12,0},{0,12,0},{0,12,0},{0,6,1},{0,6,545},{0,5,205},{0,5,205},{0,3,337},{0,3,609},{0,3,401},{0,12,0}, +{0,12,0},{0,12,0},{0,6,1},{3,0,545},{0,5,205},{0,5,205},{0,3,337},{6,0,545},{0,3,337},{13,0,2669},{0,18,320},{0,13,5},{0,11,985},{13,0,2669},{25,0,2669},{0,11,985},{0,8,2689},{25,0,2669},{0,8,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,28,2665},{0,20,212},{0,14,10}, +{0,12,850},{0,19,6669},{0,13,3974},{0,11,1837},{0,8,4865},{0,9,7266},{0,7,5310},{0,28,2665},{0,20,212},{0,14,10},{0,12,850},{9,1,6669},{0,13,3974},{0,11,1837},{0,8,4865},{19,0,6669},{0,8,4865},{0,15,0},{0,15,0},{0,15,0},{0,7,9},{0,7,845},{0,6,337},{0,6,337},{0,3,545},{0,3,945},{0,3,609},{0,15,0},{0,15,0},{0,15,0},{0,7,9},{3,2,841}, +{0,6,337},{0,6,337},{0,3,545},{6,1,841},{0,3,545},{12,4,2665},{0,20,212},{1,14,5},{0,12,850},{12,4,2665},{28,0,2665},{0,12,850},{0,9,2689},{28,0,2665},{0,9,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,31,2665},{0,21,113},{0,15,65},{0,13,709},{0,21,7538},{0,14,4289},{0,12,1907}, +{0,9,5330},{0,10,8294},{0,8,5845},{0,31,2665},{0,21,113},{0,15,65},{0,13,709},{10,1,7538},{0,14,4289},{0,12,1907},{0,9,5330},{21,0,7538},{0,9,5330},{0,18,0},{0,18,0},{0,18,0},{0,9,0},{0,9,1201},{0,7,482},{0,7,482},{0,4,740},{0,4,1334},{0,4,861},{0,18,0},{0,18,0},{0,18,0},{0,9,0},{4,1,1201},{0,7,482},{0,7,482},{0,4,740},{9,0,1201}, +{0,4,740},{13,5,2665},{0,21,113},{2,15,5},{0,13,709},{13,5,2665},{31,0,2665},{0,13,709},{0,10,2689},{31,0,2665},{0,10,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,31,2809},{0,23,52},{0,16,173},{0,14,586},{0,23,8494},{0,15,4610},{0,13,1950},{0,9,5826},{0,11,9409},{0,9,6402},{1,31,2753}, +{0,23,52},{1,16,132},{0,14,586},{11,1,8493},{0,15,4610},{0,13,1950},{0,9,5826},{19,2,8493},{0,9,5826},{0,21,0},{0,21,0},{0,21,0},{0,10,9},{0,10,1629},{0,9,640},{0,9,640},{0,5,985},{0,5,1798},{0,5,1154},{0,21,0},{0,21,0},{0,21,0},{0,10,9},{3,5,1625},{0,9,640},{0,9,640},{0,5,985},{7,2,1625},{0,5,985},{17,0,2665},{0,23,52},{2,16,13}, +{0,14,586},{17,0,2665},{30,2,2665},{0,14,586},{0,11,2689},{30,2,2665},{0,11,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,31,3105},{0,25,8},{1,17,325},{0,15,512},{0,25,9669},{0,17,4961},{0,14,2120},{0,10,6421},{0,12,10774},{0,10,7150},{2,31,3033},{0,25,8},{1,17,261},{0,15,512},{12,1,9669}, +{0,17,4961},{0,14,2120},{0,10,6421},{25,0,9669},{0,10,6421},{0,24,0},{0,24,0},{0,24,0},{0,12,0},{0,12,2178},{0,9,865},{0,9,865},{0,6,1313},{0,5,2419},{0,5,1523},{0,24,0},{0,24,0},{0,24,0},{0,12,0},{4,4,2178},{0,9,865},{0,9,865},{0,6,1313},{12,0,2178},{0,6,1313},{19,0,2669},{0,25,8},{4,17,5},{0,15,512},{19,0,2669},{31,3,2669},{0,15,512}, +{0,12,2689},{31,3,2669},{0,12,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,31,3465},{0,27,65},{1,19,434},{0,17,474},{0,28,9670},{0,18,4658},{0,16,1717},{0,11,6209},{0,13,10979},{0,11,7109},{3,31,3101},{1,26,8},{2,18,261},{0,17,474},{14,0,9669},{0,18,4658},{0,16,1717},{0,11,6209},{26,1,9669}, +{0,11,6209},{1,25,64},{1,25,64},{1,25,64},{1,13,64},{0,15,2178},{0,11,680},{0,11,680},{0,7,1189},{0,7,2557},{0,6,1457},{1,25,0},{1,25,0},{1,25,0},{1,13,0},{5,5,2178},{0,11,680},{0,11,680},{0,7,1189},{15,0,2178},{0,7,1189},{20,0,2665},{0,27,1},{5,18,5},{0,17,410},{20,0,2665},{24,8,2665},{0,17,410},{0,13,2689},{24,8,2665},{0,13,2689},{0,0,64}, +{0,0,64},{0,0,64},{0,0,64},{0,3,0},{0,3,0},{0,3,0},{0,2,4},{0,1,13},{0,1,13},{3,31,3917},{1,28,129},{2,20,645},{1,18,538},{0,31,9670},{0,20,4330},{0,17,1246},{0,12,5925},{0,14,11321},{0,12,7014},{4,31,3218},{2,27,8},{3,19,261},{1,18,474},{15,1,9669},{0,20,4330},{0,17,1246},{0,12,5925},{27,2,9669},{0,12,5925},{1,28,128},{1,28,128},{1,28,128}, +{1,15,132},{0,18,2178},{0,13,482},{0,13,482},{0,8,1040},{0,8,2712},{0,7,1470},{2,26,0},{2,26,0},{2,26,0},{2,14,0},{9,0,2178},{0,13,482},{0,13,482},{0,8,1040},{18,0,2178},{0,8,1040},{21,1,2665},{1,28,1},{6,19,5},{0,18,305},{21,1,2665},{27,8,2665},{0,18,305},{0,14,2689},{27,8,2665},{0,14,2689},{1,0,128},{1,0,128},{1,0,128},{1,0,128},{0,6,0}, +{0,6,0},{0,6,0},{0,3,0},{0,2,61},{0,2,61},{3,31,4541},{2,29,321},{2,21,904},{1,19,625},{1,31,9749},{0,21,4018},{0,18,914},{0,14,5633},{0,16,11661},{0,13,6859},{5,31,3374},{3,28,10},{4,20,254},{2,19,474},{17,0,9670},{0,21,4018},{0,18,914},{0,14,5633},{30,2,9670},{0,14,5633},{2,29,320},{2,29,320},{2,29,320},{1,16,320},{0,21,2178},{0,15,353},{0,15,353}, +{0,9,881},{0,9,2882},{0,9,1457},{3,27,0},{3,27,0},{3,27,0},{3,15,0},{10,1,2178},{0,15,353},{0,15,353},{0,9,881},{21,0,2178},{0,9,881},{23,0,2665},{2,29,1},{6,20,13},{0,19,245},{23,0,2665},{30,8,2665},{0,19,245},{0,15,2689},{30,8,2665},{0,15,2689},{1,0,320},{1,0,320},{1,0,320},{1,0,320},{0,9,0},{0,9,0},{0,9,0},{0,4,4},{0,4,125}, +{0,4,125},{4,31,5378},{2,31,570},{3,22,1267},{2,20,850},{2,31,10045},{0,23,3745},{0,19,642},{0,14,5354},{0,17,11993},{0,14,6798},{7,31,3553},{4,29,8},{5,21,261},{3,20,491},{18,1,9669},{0,23,3745},{0,19,642},{0,14,5354},{31,3,9669},{0,14,5354},{2,31,561},{2,31,561},{2,31,561},{2,17,546},{0,24,2178},{0,17,205},{0,17,205},{0,10,730},{0,11,3150},{0,9,1457},{4,28,0}, +{4,28,0},{4,28,0},{4,16,0},{12,0,2178},{0,17,205},{0,17,205},{0,10,730},{24,0,2178},{0,10,730},{25,0,2669},{3,30,1},{8,21,5},{0,20,170},{25,0,2669},{31,9,2669},{0,20,170},{0,16,2689},{31,9,2669},{0,16,2689},{2,0,545},{2,0,545},{2,0,545},{2,0,545},{0,12,0},{0,12,0},{0,12,0},{0,6,1},{0,5,205},{0,5,205},{5,31,6330},{3,31,905},{4,23,1718}, +{2,21,1099},{3,31,10453},{0,25,3478},{0,21,369},{0,16,5138},{0,18,12455},{0,15,6867},{8,31,3710},{5,30,8},{6,22,261},{4,21,474},{19,2,9669},{0,25,3478},{0,21,369},{0,16,5138},{30,5,9669},{0,16,5138},{3,31,901},{3,31,901},{3,31,901},{3,18,866},{0,27,2178},{0,19,130},{0,19,130},{0,11,650},{0,12,3395},{0,10,1523},{5,29,0},{5,29,0},{5,29,0},{5,17,0},{13,1,2178}, +{0,19,130},{0,19,130},{0,11,650},{27,0,2178},{0,11,650},{24,4,2665},{4,31,1},{9,22,5},{0,21,113},{24,4,2665},{28,12,2665},{0,21,113},{0,17,2689},{28,12,2665},{0,17,2689},{3,0,865},{3,0,865},{3,0,865},{3,0,865},{0,15,0},{0,15,0},{0,15,0},{0,7,9},{0,6,337},{0,6,337},{6,31,7446},{4,31,1458},{4,24,2174},{3,22,1419},{3,31,11045},{0,27,3314},{0,22,195}, +{0,17,4865},{0,20,12855},{0,16,6882},{9,31,3902},{6,31,8},{7,23,261},{5,22,474},{19,5,9669},{0,27,3314},{0,22,195},{0,17,4865},{31,6,9669},{0,17,4865},{3,31,1397},{3,31,1397},{3,31,1397},{3,19,1210},{0,30,2178},{0,20,61},{0,20,61},{0,12,545},{0,13,3645},{0,12,1634},{6,30,0},{6,30,0},{6,30,0},{6,18,0},{15,0,2178},{0,20,61},{0,20,61},{0,12,545},{30,0,2178}, +{0,12,545},{25,5,2665},{6,31,8},{10,23,5},{0,22,74},{25,5,2665},{31,12,2665},{0,22,74},{0,18,2689},{31,12,2665},{0,18,2689},{3,0,1201},{3,0,1201},{3,0,1201},{3,0,1201},{0,18,0},{0,18,0},{0,18,0},{0,9,0},{0,7,482},{0,7,482},{7,31,8578},{4,31,2146},{5,25,2766},{3,23,1835},{4,31,11766},{0,28,3125},{0,23,94},{0,18,4610},{0,21,13238},{0,17,6837},{10,31,4130}, +{7,31,49},{8,24,254},{6,23,474},{23,0,9670},{0,28,3125},{0,23,94},{0,18,4610},{30,8,9670},{0,18,4610},{4,31,1921},{4,31,1921},{4,31,1921},{3,21,1665},{0,31,2228},{0,22,18},{0,22,18},{0,14,425},{0,15,3987},{0,13,1677},{7,31,0},{7,31,0},{7,31,0},{7,19,0},{16,1,2178},{0,22,18},{0,22,18},{0,14,425},{31,1,2178},{0,14,425},{29,0,2665},{7,31,49},{10,24,13}, +{0,23,58},{29,0,2665},{30,14,2665},{0,23,58},{0,19,2689},{30,14,2665},{0,19,2689},{3,0,1665},{3,0,1665},{3,0,1665},{3,0,1665},{0,21,0},{0,21,0},{0,21,0},{0,10,9},{0,9,640},{0,9,640},{7,31,10135},{5,31,3190},{5,26,3543},{4,24,2348},{5,31,12846},{0,30,2961},{0,25,30},{0,19,4421},{0,23,13846},{0,18,6930},{11,31,4345},{8,31,178},{9,25,261},{7,24,491},{24,1,9669}, +{0,30,2961},{0,25,30},{0,19,4421},{31,9,9669},{0,19,4421},{5,31,2706},{5,31,2706},{5,31,2706},{4,22,2179},{1,31,2404},{0,24,0},{0,24,0},{0,15,337},{0,16,4356},{0,14,1833},{8,31,9},{8,31,9},{8,31,9},{8,20,0},{16,4,2178},{0,24,0},{0,24,0},{0,15,337},{28,4,2178},{0,15,337},{31,0,2669},{10,31,113},{12,25,5},{0,25,26},{31,0,2669},{31,15,2669},{0,25,26}, +{0,20,2689},{31,15,2669},{0,20,2689},{4,0,2178},{4,0,2178},{4,0,2178},{4,0,2178},{0,24,0},{0,24,0},{0,24,0},{0,12,0},{0,9,865},{0,9,865},{8,31,11466},{6,31,4187},{6,27,4166},{4,25,2818},{6,31,13898},{0,31,2871},{0,26,15},{0,20,4226},{0,24,14214},{0,19,7006},{12,31,4590},{10,31,321},{10,26,261},{8,25,474},{26,0,9669},{0,31,2870},{0,26,14},{0,20,4225},{30,11,9669}, +{0,20,4225},{6,31,3458},{6,31,3458},{6,31,3458},{5,23,2690},{2,31,2691},{0,26,14},{0,26,14},{0,16,261},{0,17,4595},{0,15,1953},{9,31,36},{9,31,36},{9,31,36},{9,21,0},{17,5,2178},{1,25,0},{1,25,0},{0,16,260},{31,4,2178},{0,16,260},{28,8,2665},{11,31,194},{13,26,5},{0,26,5},{28,8,2665},{24,20,2665},{0,26,5},{0,21,2689},{24,20,2665},{0,21,2689},{5,0,2689}, +{5,0,2689},{5,0,2689},{5,0,2689},{0,27,1},{0,27,1},{0,27,1},{0,14,5},{0,11,1037},{0,11,1037},{9,31,12054},{7,31,4578},{7,28,4118},{5,26,2818},{7,31,14214},{1,31,3042},{1,27,15},{0,21,4099},{0,25,13683},{0,21,6322},{14,31,4858},{11,31,514},{11,27,261},{9,26,474},{27,1,9669},{2,31,3014},{1,27,14},{0,21,4018},{27,14,9669},{0,21,4018},{7,31,3554},{7,31,3554},{7,31,3554}, +{6,24,2689},{3,31,2795},{1,27,14},{1,27,14},{1,17,261},{0,19,4269},{0,16,1517},{11,31,73},{11,31,73},{11,31,73},{10,22,0},{21,0,2178},{2,26,0},{2,26,0},{0,17,185},{30,6,2178},{0,17,185},{29,9,2665},{13,31,320},{14,27,5},{0,27,1},{29,9,2665},{27,20,2665},{0,27,1},{0,22,2689},{27,20,2665},{0,22,2689},{6,0,2689},{6,0,2689},{6,0,2689},{6,0,2689},{1,28,1}, +{1,28,1},{1,28,1},{1,15,5},{0,13,797},{0,13,797},{11,31,12506},{8,31,5075},{8,29,4166},{6,27,2818},{8,31,14651},{3,31,3255},{2,28,23},{1,22,4099},{0,27,13238},{0,21,5650},{15,31,5054},{12,31,782},{12,28,254},{10,27,474},{29,0,9670},{3,31,3206},{2,28,22},{0,22,3829},{30,14,9670},{0,22,3829},{8,31,3706},{8,31,3706},{8,31,3706},{7,25,2689},{4,31,2946},{2,28,19},{2,28,19}, +{2,18,261},{0,21,3906},{0,17,1106},{12,31,106},{12,31,106},{12,31,106},{11,23,0},{22,1,2178},{3,27,0},{3,27,0},{0,18,128},{31,7,2178},{0,18,128},{31,8,2665},{15,31,445},{14,28,13},{1,28,4},{31,8,2665},{30,20,2665},{1,28,4},{0,23,2689},{30,20,2665},{0,23,2689},{7,0,2689},{7,0,2689},{7,0,2689},{7,0,2689},{2,29,1},{2,29,1},{2,29,1},{2,15,10},{0,14,637}, +{0,14,637},{12,31,13094},{10,31,5782},{9,30,4166},{7,28,2838},{10,31,15213},{4,31,3618},{3,29,25},{2,23,4101},{0,29,12686},{0,23,5075},{16,31,5378},{14,31,1172},{13,29,261},{11,28,491},{30,1,9669},{6,31,3469},{3,29,21},{0,23,3706},{31,15,9669},{0,23,3706},{9,31,3890},{9,31,3890},{9,31,3890},{8,26,2690},{6,31,3157},{3,29,24},{3,29,24},{3,19,254},{0,23,3619},{0,19,782},{13,31,145}, +{13,31,145},{13,31,145},{12,24,0},{24,0,2178},{4,28,0},{4,28,0},{0,19,106},{24,12,2178},{0,19,106},{31,11,2669},{16,31,640},{16,29,5},{2,29,2},{31,11,2669},{31,21,2669},{2,29,2},{0,24,2689},{31,21,2669},{0,24,2689},{8,0,2689},{8,0,2689},{8,0,2689},{8,0,2689},{3,30,5},{3,30,5},{3,30,5},{3,17,8},{0,17,436},{0,17,436},{13,31,13718},{11,31,6325},{10,31,4166}, +{8,29,2818},{11,31,15565},{6,31,4094},{4,30,15},{3,24,4118},{0,31,12355},{0,24,4578},{17,31,5738},{15,31,1517},{14,30,261},{12,29,474},{31,2,9669},{7,31,3761},{4,30,14},{0,24,3554},{30,17,9669},{0,24,3554},{10,31,4085},{10,31,4085},{10,31,4085},{9,27,2690},{7,31,3285},{4,30,14},{4,30,14},{4,20,261},{0,24,3330},{0,20,514},{14,31,208},{14,31,208},{14,31,208},{13,25,0},{25,1,2178}, +{5,29,0},{5,29,0},{0,21,64},{27,12,2178},{0,21,64},{28,20,2665},{18,31,829},{17,30,5},{3,30,2},{28,20,2665},{28,24,2665},{3,30,2},{0,25,2689},{28,24,2665},{0,25,2689},{9,0,2689},{9,0,2689},{9,0,2689},{9,0,2689},{4,31,1},{4,31,1},{4,31,1},{4,18,5},{0,18,306},{0,18,306},{14,31,14378},{12,31,7006},{11,31,4226},{9,30,2818},{12,31,16054},{7,31,4578},{5,31,15}, +{4,25,4099},{0,31,12051},{0,25,4089},{19,31,5970},{16,31,1953},{15,31,261},{13,30,474},{31,5,9669},{10,31,4081},{5,31,14},{0,25,3413},{31,18,9669},{0,25,3413},{11,31,4225},{11,31,4225},{11,31,4225},{10,28,2689},{8,31,3476},{5,31,14},{5,31,14},{5,21,261},{0,26,3091},{0,21,289},{15,31,260},{15,31,260},{15,31,260},{14,26,0},{27,0,2178},{6,30,0},{6,30,0},{0,22,25},{30,12,2178}, +{0,22,25},{29,21,2665},{20,31,1037},{18,31,5},{4,31,1},{29,21,2665},{31,24,2665},{4,31,1},{0,26,2689},{31,24,2665},{0,26,2689},{10,0,2689},{10,0,2689},{10,0,2689},{10,0,2689},{5,31,10},{5,31,10},{5,31,10},{5,19,5},{0,20,194},{0,20,194},{15,31,13557},{13,31,7094},{12,31,4421},{10,31,2769},{13,31,15228},{8,31,4270},{6,31,46},{5,26,3476},{0,31,11020},{0,26,3108},{20,31,5400}, +{17,31,1931},{16,31,337},{15,30,320},{31,7,8712},{11,31,3630},{7,31,0},{0,26,2667},{31,19,8712},{0,26,2667},{12,31,4421},{12,31,4421},{12,31,4421},{11,29,2689},{9,31,3722},{6,31,46},{6,31,46},{6,22,261},{0,27,2882},{0,22,173},{16,31,337},{16,31,337},{16,31,337},{15,27,0},{28,1,2178},{7,31,0},{7,31,0},{0,23,9},{31,13,2178},{0,23,9},{31,19,2178},{22,31,881},{19,31,0}, +{7,31,0},{31,19,2178},{31,25,2178},{7,31,0},{0,27,2178},{31,25,2178},{0,27,2178},{11,0,2689},{11,0,2689},{11,0,2689},{11,0,2689},{6,31,37},{6,31,37},{6,31,37},{6,19,10},{0,22,109},{0,22,109},{16,31,12678},{14,31,7003},{13,31,4693},{12,31,2714},{15,31,14026},{10,31,3943},{8,31,94},{6,26,2766},{2,31,10074},{0,27,2146},{20,31,4698},{19,31,1746},{17,31,464},{16,30,164},{29,13,7578}, +{12,31,3090},{9,31,20},{0,27,1921},{31,20,7578},{0,27,1921},{13,31,4693},{13,31,4693},{13,31,4693},{12,30,2690},{11,31,3939},{8,31,94},{8,31,94},{7,23,254},{0,29,2650},{0,24,49},{17,31,464},{17,31,464},{17,31,464},{16,28,0},{28,4,2178},{9,31,20},{9,31,20},{0,24,0},{28,16,2178},{0,24,0},{31,21,1625},{23,31,653},{21,31,4},{10,31,1},{31,21,1625},{31,26,1625},{10,31,1}, +{0,27,1665},{31,26,1625},{0,27,1665},{12,0,2689},{12,0,2689},{12,0,2689},{12,0,2689},{8,31,58},{8,31,58},{8,31,58},{7,21,8},{0,24,49},{0,24,49},{17,31,12042},{15,31,6882},{15,31,4946},{13,31,2690},{16,31,13127},{11,31,3615},{9,31,229},{7,27,2174},{3,31,9313},{0,27,1458},{21,31,4150},{19,31,1634},{19,31,545},{17,30,89},{31,11,6661},{14,31,2654},{11,31,61},{0,28,1397},{31,21,6661}, +{0,28,1397},{15,31,4946},{15,31,4946},{15,31,4946},{13,31,2690},{12,31,4170},{9,31,229},{9,31,229},{8,24,261},{0,31,2520},{0,25,10},{19,31,545},{19,31,545},{19,31,545},{17,29,0},{29,5,2178},{11,31,61},{11,31,61},{1,25,0},{31,16,2178},{1,25,0},{31,22,1201},{24,31,482},{22,31,1},{13,31,1},{31,22,1201},{30,27,1201},{13,31,1},{0,28,1201},{30,27,1201},{0,28,1201},{13,0,2689}, +{13,0,2689},{13,0,2689},{13,0,2689},{9,31,85},{9,31,85},{9,31,85},{8,22,5},{0,25,10},{0,25,10},{18,31,11474},{16,31,6867},{15,31,5138},{14,31,2725},{16,31,12279},{12,31,3410},{10,31,419},{8,27,1718},{4,31,8678},{0,28,905},{23,31,3626},{20,31,1550},{20,31,650},{18,31,25},{29,17,5829},{15,31,2306},{12,31,130},{0,28,901},{27,24,5829},{0,28,901},{15,31,5138},{15,31,5138},{15,31,5138}, +{14,31,2725},{13,31,4452},{10,31,419},{10,31,419},{9,25,261},{0,31,2520},{1,26,10},{20,31,650},{20,31,650},{20,31,650},{18,30,0},{31,4,2178},{12,31,130},{12,31,130},{2,26,0},{30,18,2178},{2,26,0},{31,23,845},{25,31,353},{23,31,9},{16,31,0},{31,23,845},{31,27,845},{16,31,0},{0,28,865},{31,27,845},{0,28,865},{14,0,2689},{14,0,2689},{14,0,2689},{14,0,2689},{10,31,130}, +{10,31,130},{10,31,130},{9,23,5},{0,27,1},{0,27,1},{19,31,10774},{17,31,6962},{16,31,5378},{15,31,2810},{17,31,11598},{12,31,3346},{12,31,642},{9,28,1222},{6,31,8113},{0,29,570},{23,31,3146},{22,31,1539},{21,31,773},{19,31,0},{31,15,5082},{16,31,2034},{14,31,221},{0,29,554},{31,23,5082},{0,29,554},{16,31,5378},{16,31,5378},{16,31,5378},{15,31,2810},{15,31,4746},{12,31,642},{12,31,642}, +{10,26,261},{2,31,2714},{2,27,10},{21,31,773},{21,31,773},{21,31,773},{19,31,0},{31,7,2178},{14,31,221},{14,31,221},{3,27,0},{31,19,2178},{3,27,0},{31,25,545},{26,31,221},{25,31,0},{19,31,0},{31,25,545},{31,28,545},{19,31,0},{0,29,545},{31,28,545},{0,29,545},{15,0,2689},{15,0,2689},{15,0,2689},{15,0,2689},{11,31,170},{11,31,170},{11,31,170},{10,23,10},{1,28,1}, +{1,28,1},{20,31,10225},{18,31,7025},{18,31,5729},{16,31,2978},{19,31,10792},{14,31,3283},{13,31,982},{10,29,861},{8,31,7588},{2,29,325},{24,31,2729},{23,31,1460},{22,31,932},{20,31,36},{29,21,4344},{19,31,1746},{16,31,353},{2,29,321},{31,24,4344},{2,29,321},{18,31,5729},{18,31,5729},{18,31,5729},{16,31,2978},{16,31,5028},{13,31,982},{13,31,982},{11,27,254},{4,31,2981},{3,28,10},{22,31,932}, +{22,31,932},{22,31,932},{20,31,36},{28,16,2178},{16,31,353},{16,31,353},{4,28,0},{24,24,2178},{4,28,0},{31,27,290},{27,31,125},{27,31,4},{22,31,1},{31,27,290},{31,29,290},{22,31,1},{0,29,320},{31,29,290},{0,29,320},{16,0,2689},{16,0,2689},{16,0,2689},{16,0,2689},{12,31,245},{12,31,245},{12,31,245},{11,25,8},{2,29,5},{2,29,5},{20,31,9825},{19,31,7014},{19,31,5925}, +{17,31,3218},{20,31,10245},{15,31,3285},{14,31,1330},{11,29,612},{10,31,7225},{3,30,133},{25,31,2467},{24,31,1470},{23,31,1040},{21,31,144},{31,19,3779},{20,31,1580},{18,31,500},{3,30,129},{31,25,3779},{3,30,129},{19,31,5925},{19,31,5925},{19,31,5925},{17,31,3218},{17,31,5346},{14,31,1330},{14,31,1330},{12,28,261},{6,31,3267},{4,29,10},{23,31,1040},{23,31,1040},{23,31,1040},{21,31,144},{29,17,2178}, +{18,31,500},{18,31,500},{5,29,0},{27,24,2178},{5,29,0},{31,28,128},{29,31,61},{28,31,0},{25,31,1},{31,28,128},{30,30,128},{25,31,1},{0,30,128},{30,30,128},{0,30,128},{17,0,2689},{17,0,2689},{17,0,2689},{17,0,2689},{13,31,338},{13,31,338},{13,31,338},{12,26,5},{3,30,5},{3,30,5},{21,31,9523},{20,31,7109},{20,31,6209},{18,31,3473},{20,31,9749},{16,31,3410},{15,31,1717}, +{12,30,401},{11,31,6964},{4,31,65},{26,31,2273},{25,31,1539},{24,31,1189},{23,31,260},{29,25,3299},{22,31,1490},{20,31,680},{6,30,64},{27,28,3299},{6,30,64},{20,31,6209},{20,31,6209},{20,31,6209},{18,31,3473},{18,31,5700},{15,31,1717},{15,31,1717},{13,29,261},{8,31,3587},{5,30,10},{24,31,1189},{24,31,1189},{24,31,1189},{23,31,260},{31,16,2178},{20,31,680},{20,31,680},{6,30,0},{30,24,2178}, +{6,30,0},{31,30,34},{30,31,13},{30,31,4},{28,31,0},{31,30,34},{30,31,34},{28,31,0},{0,30,64},{30,31,34},{0,30,64},{18,0,2689},{18,0,2689},{18,0,2689},{18,0,2689},{15,31,421},{15,31,421},{15,31,421},{13,27,5},{4,31,1},{4,31,1},{23,31,9201},{21,31,7314},{21,31,6530},{19,31,3778},{21,31,9420},{18,31,3652},{16,31,2193},{14,30,325},{14,31,6804},{6,31,10},{27,31,2057}, +{26,31,1605},{25,31,1378},{24,31,442},{31,23,2904},{23,31,1452},{22,31,881},{7,31,0},{31,27,2904},{7,31,0},{21,31,6530},{21,31,6530},{21,31,6530},{19,31,3778},{19,31,5956},{16,31,2193},{16,31,2193},{14,30,261},{10,31,3957},{6,31,10},{25,31,1378},{25,31,1378},{25,31,1378},{24,31,442},{31,19,2178},{22,31,881},{22,31,881},{7,31,0},{31,25,2178},{7,31,0},{31,31,0},{31,31,0},{31,31,0}, +{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{19,0,2689},{19,0,2689},{19,0,2689},{19,0,2689},{16,31,512},{16,31,512},{16,31,512},{14,27,10},{6,31,10},{6,31,10},{23,31,8049},{22,31,6550},{22,31,5925},{20,31,3589},{23,31,8137},{19,31,3220},{18,31,2050},{15,31,173},{15,31,5805},{8,31,52},{27,31,1544},{27,31,1181},{26,31,1040},{25,31,353},{31,24,2166}, +{24,31,1083},{23,31,653},{10,31,1},{30,28,2166},{10,31,1},{22,31,5925},{22,31,5925},{22,31,5925},{20,31,3589},{20,31,5209},{18,31,2050},{18,31,2050},{15,30,117},{12,31,3405},{8,31,52},{26,31,1040},{26,31,1040},{26,31,1040},{25,31,353},{31,21,1625},{23,31,653},{23,31,653},{10,31,1},{31,26,1625},{10,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0}, +{0,31,0},{31,31,0},{0,31,0},{20,0,2689},{20,0,2689},{20,0,2689},{20,0,2689},{17,31,625},{17,31,625},{17,31,625},{15,29,8},{8,31,52},{8,31,52},{24,31,7177},{23,31,5845},{23,31,5361},{21,31,3473},{23,31,7033},{20,31,2945},{19,31,1907},{16,31,65},{16,31,5026},{10,31,117},{28,31,1137},{27,31,861},{27,31,740},{26,31,260},{29,29,1601},{26,31,833},{24,31,482},{13,31,1},{31,28,1601}, +{13,31,1},{23,31,5361},{23,31,5361},{23,31,5361},{21,31,3473},{21,31,4661},{19,31,1907},{19,31,1907},{16,31,65},{14,31,2997},{10,31,117},{27,31,740},{27,31,740},{27,31,740},{26,31,260},{31,22,1201},{24,31,482},{24,31,482},{13,31,1},{30,27,1201},{13,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{21,0,2689}, +{21,0,2689},{21,0,2689},{21,0,2689},{18,31,754},{18,31,754},{18,31,754},{16,30,5},{10,31,117},{10,31,117},{24,31,6393},{24,31,5310},{23,31,4865},{22,31,3314},{24,31,6146},{20,31,2737},{20,31,1837},{17,31,5},{18,31,4381},{11,31,212},{28,31,801},{28,31,609},{28,31,545},{27,31,185},{31,26,1121},{26,31,561},{25,31,353},{16,31,0},{30,29,1121},{16,31,0},{23,31,4865},{23,31,4865},{23,31,4865}, +{22,31,3314},{22,31,4181},{20,31,1837},{20,31,1837},{17,31,5},{15,31,2621},{11,31,212},{28,31,545},{28,31,545},{28,31,545},{27,31,185},{31,23,845},{25,31,353},{25,31,353},{16,31,0},{31,27,845},{16,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{22,0,2689},{22,0,2689},{22,0,2689},{22,0,2689},{19,31,850}, +{19,31,850},{19,31,850},{17,31,5},{11,31,212},{11,31,212},{25,31,5683},{24,31,4782},{24,31,4421},{23,31,3173},{24,31,5314},{22,31,2563},{21,31,1844},{18,31,10},{18,31,3757},{13,31,338},{29,31,531},{28,31,401},{28,31,337},{27,31,121},{31,27,726},{27,31,363},{26,31,221},{19,31,0},{31,29,726},{19,31,0},{24,31,4421},{24,31,4421},{24,31,4421},{23,31,3173},{23,31,3657},{21,31,1844},{21,31,1844}, +{18,31,10},{16,31,2321},{13,31,338},{28,31,337},{28,31,337},{28,31,337},{27,31,121},{31,25,545},{26,31,221},{26,31,221},{19,31,0},{31,28,545},{19,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{23,0,2689},{23,0,2689},{23,0,2689},{23,0,2689},{20,31,985},{20,31,985},{20,31,985},{18,31,10},{13,31,338}, +{13,31,338},{2,31,10560},{0,30,1586},{0,22,173},{0,18,3826},{0,28,18065},{0,19,12194},{0,17,6081},{0,11,14098},{0,13,19386},{0,11,14998},{3,31,10216},{0,30,1586},{0,22,173},{0,18,3826},{12,4,18065},{0,19,12194},{0,17,6081},{0,11,14098},{28,0,18065},{0,11,14098},{0,17,1},{0,17,1},{0,17,1},{0,9,4},{0,9,1105},{0,7,442},{0,7,442},{0,4,680},{0,4,1230},{0,4,801},{0,17,1}, +{0,17,1},{0,17,1},{0,9,4},{4,1,1105},{0,7,442},{0,7,442},{0,4,680},{9,0,1105},{0,4,680},{21,0,9248},{0,30,1586},{0,22,173},{0,18,3826},{21,0,9248},{30,6,9248},{0,18,3826},{0,14,9248},{30,6,9248},{0,14,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,31,11328},{0,31,1341},{0,23,68}, +{0,19,3626},{0,30,19334},{0,20,12611},{0,18,6099},{0,12,14756},{0,14,20886},{0,12,15845},{3,31,10792},{0,31,1341},{0,23,68},{0,19,3626},{15,0,19334},{0,20,12611},{0,18,6099},{0,12,14756},{30,0,19334},{0,12,14756},{0,20,0},{0,20,0},{0,20,0},{0,10,1},{0,10,1513},{0,8,605},{0,8,605},{0,5,925},{0,5,1682},{0,4,1089},{0,20,0},{0,20,0},{0,20,0},{0,10,1},{5,0,1513}, +{0,8,605},{0,8,605},{0,5,925},{10,0,1513},{0,5,925},{22,1,9248},{0,31,1341},{0,23,68},{0,19,3626},{22,1,9248},{31,7,9248},{0,19,3626},{0,15,9248},{31,7,9248},{0,15,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,31,12200},{0,31,1325},{0,24,10},{0,20,3365},{0,31,20705},{0,21,13009},{0,18,6227}, +{0,13,15441},{0,15,22455},{0,13,16666},{4,31,11489},{0,31,1325},{0,24,10},{0,20,3365},{15,2,20689},{0,21,13009},{0,18,6227},{0,13,15441},{30,1,20689},{0,13,15441},{0,23,0},{0,23,0},{0,23,0},{0,11,9},{0,11,1989},{0,9,772},{0,9,772},{0,5,1213},{0,5,2194},{0,5,1382},{0,23,0},{0,23,0},{0,23,0},{0,11,9},{6,0,1985},{0,9,772},{0,9,772},{0,5,1213},{10,1,1985}, +{0,5,1213},{23,2,9248},{0,31,1325},{0,24,10},{0,20,3365},{23,2,9248},{30,9,9248},{0,20,3365},{0,16,9250},{30,9,9248},{0,16,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,31,13288},{0,31,1565},{0,25,10},{0,22,3077},{1,31,22214},{0,23,13555},{0,20,6310},{0,14,16176},{0,16,24130},{0,13,17562},{4,31,12385}, +{0,31,1565},{0,25,10},{0,22,3077},{17,0,22129},{0,23,13555},{0,20,6310},{0,14,16176},{30,2,22129},{0,14,16176},{0,26,0},{0,26,0},{0,26,0},{0,13,0},{0,13,2521},{0,10,1018},{0,10,1018},{0,6,1508},{0,6,2801},{0,6,1764},{0,26,0},{0,26,0},{0,26,0},{0,13,0},{6,1,2521},{0,10,1018},{0,10,1018},{0,6,1508},{13,0,2521},{0,6,1508},{23,5,9248},{0,31,1565},{0,25,10}, +{0,22,3077},{23,5,9248},{31,10,9248},{0,22,3077},{0,17,9250},{31,10,9248},{0,17,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,31,14788},{0,31,2141},{0,27,72},{0,22,2825},{1,31,24140},{0,25,14114},{0,21,6323},{0,14,17202},{0,17,26063},{0,14,18646},{5,31,13521},{1,31,2100},{0,27,72},{0,22,2825},{16,4,23851}, +{0,25,14114},{0,21,6323},{0,14,17202},{28,4,23851},{0,14,17202},{0,29,1},{0,29,1},{0,29,1},{0,15,4},{0,15,3202},{0,12,1285},{0,12,1285},{0,7,1973},{0,7,3569},{0,6,2241},{0,29,1},{0,29,1},{0,29,1},{0,15,4},{7,1,3200},{0,12,1285},{0,12,1285},{0,7,1973},{11,2,3200},{0,7,1973},{27,0,9248},{3,31,1885},{2,26,8},{0,22,2825},{27,0,9248},{30,12,9248},{0,22,2825}, +{0,18,9248},{30,12,9248},{0,18,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,31,16228},{1,31,2836},{0,28,170},{0,24,2612},{2,31,25971},{0,25,14594},{0,22,6473},{0,16,18144},{0,17,27951},{0,14,19830},{7,31,14675},{2,31,2706},{1,27,149},{0,24,2612},{19,0,25472},{0,25,14594},{0,22,6473},{0,16,18144},{30,4,25472}, +{0,16,18144},{0,31,9},{0,31,9},{0,31,9},{0,16,0},{0,16,3872},{0,13,1514},{0,13,1514},{0,7,2405},{0,7,4305},{0,7,2766},{0,31,9},{0,31,9},{0,31,9},{0,16,0},{8,0,3872},{0,13,1514},{0,13,1514},{0,7,2405},{16,0,3872},{0,7,2405},{28,1,9248},{4,31,2210},{3,27,8},{0,24,2612},{28,1,9248},{31,13,9248},{0,24,2612},{0,19,9248},{31,13,9248},{0,19,9248},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{4,31,17796},{2,31,3702},{1,29,270},{0,25,2361},{3,31,27563},{0,27,14944},{0,23,6470},{0,17,18681},{0,19,29556},{0,16,20628},{7,31,15635},{3,31,3425},{1,29,206},{0,25,2361},{20,0,26744},{0,27,14944},{0,23,6470},{0,17,18681},{24,8,26744},{0,17,18681},{0,31,125},{0,31,125},{0,31,125}, +{0,18,8},{0,18,4418},{0,14,1696},{0,14,1696},{0,8,2664},{0,8,4952},{0,8,3148},{1,31,72},{1,31,72},{1,31,72},{0,18,8},{9,0,4418},{0,14,1696},{0,14,1696},{0,8,2664},{18,0,4418},{0,8,2664},{30,0,9248},{6,31,2557},{3,28,10},{0,25,2357},{30,0,9248},{30,15,9248},{0,25,2357},{0,20,9250},{30,15,9248},{0,20,9250},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,0}, +{0,1,0},{0,1,0},{0,0,4},{0,0,4},{0,0,4},{5,31,19090},{2,31,4598},{1,30,406},{0,26,2220},{3,31,28187},{0,29,14347},{0,25,5609},{0,18,18144},{0,20,29961},{0,17,20301},{8,31,16082},{4,31,4019},{2,30,206},{0,26,2220},{21,1,26744},{0,29,14347},{0,25,5609},{0,18,18144},{27,8,26744},{0,18,18144},{1,31,264},{1,31,264},{1,31,264},{1,19,72},{0,21,4418},{0,16,1412},{0,16,1412}, +{0,10,2420},{0,9,5122},{0,9,2997},{2,31,117},{2,31,117},{2,31,117},{1,19,8},{10,1,4418},{0,16,1412},{0,16,1412},{0,10,2420},{21,0,4418},{0,10,2420},{31,1,9248},{8,31,2929},{4,29,10},{0,26,2120},{31,1,9248},{27,18,9248},{0,26,2120},{0,21,9250},{27,18,9248},{0,21,9250},{1,0,68},{1,0,68},{1,0,68},{1,0,68},{0,4,1},{0,4,1},{0,4,1},{0,2,0},{0,2,25}, +{0,2,25},{7,31,20669},{3,31,5786},{2,31,625},{1,27,2283},{4,31,29033},{0,30,13795},{0,26,4770},{0,18,17667},{0,21,30425},{0,18,20068},{9,31,16691},{5,31,4841},{3,31,205},{1,27,2219},{23,0,26747},{0,30,13795},{0,26,4770},{0,18,17667},{30,8,26747},{0,18,17667},{2,31,589},{2,31,589},{2,31,589},{1,20,186},{0,24,4418},{0,18,1125},{0,18,1125},{0,10,2186},{0,11,5390},{0,10,2915},{3,31,169}, +{3,31,169},{3,31,169},{2,20,13},{12,0,4418},{0,18,1125},{0,18,1125},{0,10,2186},{24,0,4418},{0,10,2186},{31,4,9248},{10,31,3380},{6,30,8},{0,27,1954},{31,4,9248},{30,18,9248},{0,27,1954},{0,22,9248},{30,18,9248},{0,22,9248},{1,0,185},{1,0,185},{1,0,185},{1,0,185},{0,7,0},{0,7,0},{0,7,0},{0,3,9},{0,3,73},{0,3,73},{7,31,21577},{4,31,6797},{3,31,985}, +{1,28,2226},{5,31,29436},{0,31,12990},{0,27,4027},{0,20,16925},{0,23,30436},{0,18,19620},{11,31,16645},{7,31,5260},{4,31,232},{2,28,2141},{24,1,26259},{0,31,12990},{0,27,4027},{0,20,16925},{31,9,26259},{0,20,16925},{3,31,985},{3,31,985},{3,31,985},{2,21,378},{0,27,4418},{0,20,905},{0,20,905},{0,12,2005},{0,12,5635},{0,11,2950},{4,31,232},{4,31,232},{4,31,232},{3,21,13},{13,1,4418}, +{0,20,905},{0,20,905},{0,12,2005},{27,0,4418},{0,12,2005},{31,7,8980},{11,31,3601},{7,31,4},{0,28,1665},{31,7,8980},{31,19,8980},{0,28,1665},{0,23,8980},{31,19,8980},{0,23,8980},{2,0,377},{2,0,377},{2,0,377},{2,0,377},{0,10,0},{0,10,0},{0,10,0},{0,5,0},{0,4,146},{0,4,146},{7,31,21193},{4,31,7053},{3,31,1481},{2,28,2093},{6,31,28313},{0,31,11406},{0,28,2965}, +{0,20,15021},{0,23,28900},{0,19,17995},{11,31,15381},{7,31,4876},{5,31,325},{3,28,1786},{25,1,24371},{0,31,11406},{0,28,2965},{0,20,15021},{27,12,24371},{0,20,15021},{3,31,1481},{3,31,1481},{3,31,1481},{2,23,621},{0,30,4418},{0,21,680},{0,21,680},{0,13,1780},{0,13,5885},{0,12,2950},{5,31,325},{5,31,325},{5,31,325},{4,22,8},{15,0,4418},{0,21,680},{0,21,680},{0,13,1780},{30,0,4418}, +{0,13,1780},{31,8,7938},{12,31,3188},{8,31,0},{0,29,1156},{31,8,7938},{30,20,7938},{0,29,1156},{0,23,7956},{30,20,7938},{0,23,7956},{2,0,617},{2,0,617},{2,0,617},{2,0,617},{0,13,0},{0,13,0},{0,13,0},{0,6,9},{0,5,233},{0,5,233},{8,31,20825},{5,31,7494},{4,31,2089},{2,29,1970},{7,31,27269},{0,31,10078},{0,28,2021},{0,21,13204},{0,25,27384},{0,20,16398},{12,31,14148}, +{8,31,4562},{7,31,392},{4,29,1445},{26,1,22568},{0,31,10078},{0,28,2021},{0,21,13204},{31,11,22568},{0,21,13204},{4,31,2089},{4,31,2089},{4,31,2089},{3,23,946},{0,31,4468},{0,23,521},{0,23,521},{0,14,1573},{0,15,6227},{0,13,2909},{7,31,392},{7,31,392},{7,31,392},{5,23,8},{16,1,4418},{0,23,521},{0,23,521},{0,14,1573},{31,1,4418},{0,14,1573},{31,10,6964},{14,31,2785},{10,31,4}, +{0,29,740},{31,10,6964},{31,20,6964},{0,29,740},{0,24,6970},{31,20,6964},{0,24,6970},{3,0,937},{3,0,937},{3,0,937},{3,0,937},{0,16,1},{0,16,1},{0,16,1},{0,8,1},{0,6,377},{0,6,377},{8,31,20717},{6,31,8012},{5,31,2958},{3,29,2057},{7,31,26243},{0,31,8890},{0,29,1154},{0,22,11325},{0,25,25854},{0,21,14671},{13,31,12926},{10,31,4313},{8,31,485},{5,29,1106},{25,5,20642}, +{0,31,8890},{0,29,1154},{0,22,11325},{31,12,20642},{0,22,11325},{5,31,2958},{5,31,2958},{5,31,2958},{3,25,1361},{1,31,4644},{0,25,337},{0,25,337},{0,15,1429},{0,16,6596},{0,14,2981},{8,31,485},{8,31,485},{8,31,485},{6,24,13},{16,4,4418},{0,25,337},{0,25,337},{0,15,1429},{28,4,4418},{0,15,1429},{31,11,5941},{15,31,2377},{11,31,1},{0,30,388},{31,11,5941},{31,21,5941},{0,30,388}, +{0,24,5953},{31,21,5941},{0,24,5953},{3,0,1360},{3,0,1360},{3,0,1360},{3,0,1360},{0,19,0},{0,19,0},{0,19,0},{0,10,4},{0,8,548},{0,8,548},{9,31,20713},{7,31,8575},{5,31,3806},{3,30,2260},{7,31,25603},{0,31,8106},{0,29,642},{0,22,9805},{0,26,24678},{0,21,13359},{15,31,11882},{11,31,4006},{9,31,596},{6,29,818},{28,1,19021},{2,31,8066},{0,29,642},{0,22,9805},{31,13,19021}, +{0,22,9805},{5,31,3806},{5,31,3806},{5,31,3806},{4,26,1819},{2,31,4962},{0,27,232},{0,27,232},{0,16,1268},{0,17,6926},{0,15,3126},{9,31,596},{9,31,596},{9,31,596},{7,25,13},{17,5,4418},{0,27,232},{0,27,232},{0,16,1268},{31,4,4418},{0,16,1268},{31,13,5101},{16,31,2042},{13,31,4},{0,30,164},{31,13,5101},{31,22,5101},{0,30,164},{0,25,5105},{31,22,5101},{0,25,5105},{4,0,1818}, +{4,0,1818},{4,0,1818},{4,0,1818},{0,22,0},{0,22,0},{0,22,0},{0,11,0},{0,9,697},{0,9,697},{10,31,20905},{7,31,9247},{6,31,4787},{4,30,2547},{8,31,25042},{1,31,7537},{0,30,264},{0,23,8449},{0,27,23521},{0,22,12141},{15,31,10794},{12,31,3786},{10,31,725},{8,29,621},{29,1,17485},{3,31,7274},{0,30,264},{0,23,8449},{27,16,17485},{0,23,8449},{6,31,4787},{6,31,4787},{6,31,4787}, +{4,27,2323},{3,31,5386},{0,29,130},{0,29,130},{0,18,1096},{0,19,7364},{0,17,3225},{10,31,725},{10,31,725},{10,31,725},{8,26,8},{21,0,4418},{0,29,130},{0,29,130},{0,18,1096},{30,6,4418},{0,18,1096},{31,14,4325},{18,31,1737},{14,31,1},{0,31,64},{31,14,4325},{30,23,4325},{0,31,64},{0,25,4337},{30,23,4325},{0,25,4337},{4,0,2314},{4,0,2314},{4,0,2314},{4,0,2314},{0,25,0}, +{0,25,0},{0,25,0},{0,12,4},{0,10,925},{0,10,925},{11,31,21021},{8,31,10106},{7,31,5819},{4,30,3027},{8,31,24722},{2,31,7042},{0,31,81},{0,24,7169},{0,29,22467},{0,22,11133},{16,31,9869},{12,31,3594},{11,31,821},{8,30,420},{30,1,16034},{4,31,6558},{0,31,81},{0,24,7169},{31,15,16034},{0,24,7169},{7,31,5819},{7,31,5819},{7,31,5819},{5,28,2915},{3,31,5962},{0,30,72},{0,30,72}, +{0,18,968},{0,20,7781},{0,17,3305},{11,31,821},{11,31,821},{11,31,821},{9,27,8},{22,1,4418},{0,30,72},{0,30,72},{0,18,968},{31,7,4418},{0,18,968},{31,15,3617},{19,31,1450},{15,31,9},{0,31,0},{31,15,3617},{31,23,3617},{0,31,0},{0,26,3617},{31,23,3617},{0,26,3617},{5,0,2906},{5,0,2906},{5,0,2906},{5,0,2906},{0,28,1},{0,28,1},{0,28,1},{0,14,0},{0,11,1156}, +{0,11,1156},{11,31,21381},{8,31,11186},{7,31,7169},{5,31,3633},{9,31,24543},{3,31,6762},{0,31,81},{0,24,5819},{0,29,21333},{0,23,10106},{17,31,8955},{14,31,3433},{12,31,980},{10,30,242},{29,5,14504},{6,31,5834},{1,31,74},{0,24,5819},{31,16,14504},{0,24,5819},{7,31,7169},{7,31,7169},{7,31,7169},{5,30,3618},{4,31,6757},{0,31,81},{0,31,81},{0,20,821},{0,21,8245},{0,18,3531},{12,31,980}, +{12,31,980},{12,31,980},{10,28,13},{24,0,4418},{1,31,74},{1,31,74},{0,20,821},{24,12,4418},{0,20,821},{29,21,2888},{20,31,1156},{17,31,1},{3,31,1},{29,21,2888},{31,24,2888},{3,31,1},{0,26,2906},{31,24,2888},{0,26,2906},{5,0,3617},{5,0,3617},{5,0,3617},{5,0,3617},{0,31,0},{0,31,0},{0,31,0},{0,15,9},{0,13,1421},{0,13,1421},{12,31,21949},{9,31,12367},{8,31,8449}, +{6,31,4338},{10,31,24600},{3,31,6650},{1,31,298},{0,25,4698},{0,30,20575},{0,24,9247},{17,31,8219},{15,31,3236},{13,31,1157},{11,30,122},{31,3,13235},{7,31,5260},{3,31,145},{0,25,4698},{31,17,13235},{0,25,4698},{8,31,8449},{8,31,8449},{8,31,8449},{6,31,4338},{5,31,7667},{1,31,298},{1,31,298},{0,21,680},{0,23,8779},{0,19,3786},{13,31,1157},{13,31,1157},{13,31,1157},{11,29,13},{25,1,4418}, +{3,31,145},{3,31,145},{0,21,680},{27,12,4418},{0,21,680},{31,19,2314},{22,31,949},{19,31,4},{6,31,1},{31,19,2314},{31,25,2314},{6,31,1},{0,27,2314},{31,25,2314},{0,27,2314},{6,0,4337},{6,0,4337},{6,0,4337},{6,0,4337},{0,31,64},{0,31,64},{0,31,64},{0,17,0},{0,13,1709},{0,13,1709},{12,31,22557},{10,31,13585},{9,31,9926},{6,31,5186},{11,31,24636},{3,31,6794},{2,31,692}, +{0,26,3723},{0,31,19836},{0,25,8442},{19,31,7417},{16,31,3126},{15,31,1268},{12,31,68},{29,9,12051},{8,31,4762},{4,31,232},{0,26,3723},{27,20,12051},{0,26,3723},{9,31,9926},{9,31,9926},{9,31,9926},{6,31,5186},{5,31,8691},{2,31,692},{2,31,692},{0,22,557},{0,25,9284},{0,21,3929},{15,31,1268},{15,31,1268},{15,31,1268},{12,30,8},{27,0,4418},{4,31,232},{4,31,232},{0,22,557},{30,12,4418}, +{0,22,557},{31,20,1800},{22,31,725},{20,31,0},{9,31,1},{31,20,1800},{30,26,1800},{9,31,1},{0,27,1818},{30,26,1800},{0,27,1818},{6,0,5105},{6,0,5105},{6,0,5105},{6,0,5105},{1,31,185},{1,31,185},{1,31,185},{0,18,9},{0,15,2042},{0,15,2042},{12,31,23421},{11,31,14850},{9,31,11462},{7,31,6149},{11,31,24860},{4,31,7053},{2,31,1236},{0,26,2891},{0,31,19260},{0,25,7818},{19,31,6761}, +{17,31,3107},{16,31,1429},{13,31,8},{31,7,10952},{10,31,4300},{6,31,353},{0,26,2891},{31,19,10952},{0,26,2891},{9,31,11462},{9,31,11462},{9,31,11462},{7,31,6149},{7,31,9845},{2,31,1236},{2,31,1236},{0,23,485},{0,25,9764},{0,21,4185},{16,31,1429},{16,31,1429},{16,31,1429},{13,31,8},{28,1,4418},{6,31,353},{6,31,353},{0,23,485},{31,13,4418},{0,23,485},{31,22,1354},{23,31,548},{22,31,4}, +{12,31,0},{31,22,1354},{30,27,1354},{12,31,0},{0,28,1360},{30,27,1354},{0,28,1360},{7,0,5953},{7,0,5953},{7,0,5953},{7,0,5953},{1,31,425},{1,31,425},{1,31,425},{0,20,1},{0,17,2372},{0,17,2372},{13,31,24507},{11,31,16398},{10,31,13349},{8,31,7460},{11,31,25418},{4,31,7647},{3,31,2021},{0,27,2089},{0,31,18918},{0,26,7302},{20,31,6098},{18,31,3037},{17,31,1640},{14,31,25},{29,13,9818}, +{12,31,3874},{8,31,521},{0,27,2089},{31,20,9818},{0,27,2089},{10,31,13349},{10,31,13349},{10,31,13349},{8,31,7460},{7,31,11195},{3,31,2021},{3,31,2021},{0,24,392},{0,27,10472},{0,23,4562},{17,31,1640},{17,31,1640},{17,31,1640},{14,31,25},{28,4,4418},{8,31,521},{8,31,521},{0,24,392},{28,16,4418},{0,24,392},{31,23,925},{24,31,386},{23,31,1},{15,31,1},{31,23,925},{31,27,925},{15,31,1}, +{0,28,937},{31,27,925},{0,28,937},{7,0,6970},{7,0,6970},{7,0,6970},{7,0,6970},{2,31,785},{2,31,785},{2,31,785},{0,22,4},{0,17,2741},{0,17,2741},{14,31,25663},{12,31,17995},{11,31,15021},{8,31,8740},{12,31,26003},{6,31,8399},{3,31,2965},{0,28,1481},{0,31,18886},{0,26,7014},{21,31,5634},{19,31,2950},{18,31,1853},{16,31,72},{31,11,8901},{14,31,3578},{10,31,698},{0,28,1481},{31,21,8901}, +{0,28,1481},{11,31,15021},{11,31,15021},{11,31,15021},{8,31,8740},{8,31,12646},{3,31,2965},{3,31,2965},{0,26,292},{0,29,11051},{0,24,4876},{18,31,1853},{18,31,1853},{18,31,1853},{16,31,72},{29,5,4418},{10,31,698},{10,31,698},{0,26,292},{31,16,4418},{0,26,292},{31,25,613},{26,31,245},{25,31,4},{18,31,1},{31,25,613},{27,30,613},{18,31,1},{0,29,617},{27,30,613},{0,29,617},{8,0,7956}, +{8,0,7956},{8,0,7956},{8,0,7956},{3,31,1201},{3,31,1201},{3,31,1201},{0,23,0},{0,18,3185},{0,18,3185},{15,31,26715},{12,31,19659},{11,31,16925},{9,31,10232},{12,31,26835},{6,31,9215},{4,31,4027},{0,28,985},{0,31,19110},{0,27,6797},{22,31,5238},{20,31,2950},{19,31,2005},{17,31,180},{29,17,8069},{15,31,3314},{11,31,905},{0,28,985},{27,24,8069},{0,28,985},{11,31,16925},{11,31,16925},{11,31,16925}, +{9,31,10232},{8,31,14182},{4,31,4027},{4,31,4027},{0,27,232},{0,29,11627},{0,25,5117},{19,31,2005},{19,31,2005},{19,31,2005},{17,31,180},{31,4,4418},{11,31,905},{11,31,905},{0,27,232},{30,18,4418},{0,27,232},{31,26,365},{27,31,146},{26,31,1},{21,31,1},{31,26,365},{30,29,365},{21,31,1},{0,29,377},{30,29,365},{0,29,377},{8,0,8980},{8,0,8980},{8,0,8980},{8,0,8980},{3,31,1665}, +{3,31,1665},{3,31,1665},{0,24,4},{0,20,3601},{0,20,3601},{15,31,26555},{13,31,20326},{12,31,17723},{10,31,10897},{13,31,26598},{7,31,9527},{5,31,4934},{0,29,590},{0,31,18606},{0,28,5786},{23,31,4770},{21,31,3041},{20,31,2210},{18,31,325},{31,15,7322},{16,31,3126},{14,31,1145},{0,29,554},{31,23,7322},{0,29,554},{12,31,17723},{12,31,17723},{12,31,17723},{10,31,10897},{9,31,15092},{5,31,4934},{5,31,4934}, +{0,28,205},{0,31,11381},{0,26,4709},{20,31,2210},{20,31,2210},{20,31,2210},{18,31,325},{31,7,4418},{14,31,1145},{14,31,1145},{0,28,169},{31,19,4418},{0,28,169},{31,27,185},{28,31,73},{27,31,9},{24,31,0},{31,27,185},{31,29,185},{24,31,0},{0,30,185},{31,29,185},{0,30,185},{9,0,9248},{9,0,9248},{9,0,9248},{9,0,9248},{4,31,1954},{4,31,1954},{4,31,1954},{1,25,8},{0,21,3330}, +{0,21,3330},{16,31,25958},{15,31,20468},{13,31,18321},{11,31,11371},{15,31,25748},{8,31,9863},{7,31,5684},{1,30,373},{0,31,18111},{0,29,4452},{24,31,4437},{23,31,3084},{22,31,2500},{19,31,554},{29,21,6584},{18,31,2996},{15,31,1412},{0,30,237},{31,24,6584},{0,30,237},{13,31,18321},{13,31,18321},{13,31,18321},{11,31,11371},{11,31,15661},{7,31,5684},{7,31,5684},{1,29,206},{0,31,10886},{0,27,4019},{22,31,2500}, +{22,31,2500},{22,31,2500},{19,31,554},{28,16,4418},{15,31,1412},{15,31,1412},{0,29,100},{24,24,4418},{0,29,100},{31,29,52},{30,31,25},{29,31,1},{27,31,1},{31,29,52},{31,30,52},{27,31,1},{0,30,68},{31,30,52},{0,30,68},{10,0,9250},{10,0,9250},{10,0,9250},{10,0,9250},{5,31,2197},{5,31,2197},{5,31,2197},{2,27,5},{0,23,2929},{0,23,2929},{17,31,25604},{15,31,20628},{15,31,18692}, +{12,31,11876},{16,31,25201},{10,31,10381},{8,31,6470},{2,30,270},{2,31,17924},{0,29,3588},{25,31,4259},{23,31,3148},{23,31,2664},{20,31,820},{31,19,6019},{19,31,2950},{16,31,1717},{0,30,125},{31,25,6019},{0,30,125},{15,31,18692},{15,31,18692},{15,31,18692},{12,31,11876},{12,31,16244},{8,31,6470},{8,31,6470},{2,30,206},{0,31,10854},{0,29,3332},{23,31,2664},{23,31,2664},{23,31,2664},{20,31,820},{29,17,4418}, +{16,31,1717},{16,31,1717},{0,30,61},{27,24,4418},{0,30,61},{31,31,4},{31,31,4},{31,31,4},{30,31,1},{31,31,4},{31,31,4},{30,31,1},{0,31,4},{31,31,4},{0,31,4},{11,0,9250},{11,0,9250},{11,0,9250},{11,0,9250},{6,31,2440},{6,31,2440},{6,31,2440},{3,27,10},{0,25,2509},{0,25,2509},{18,31,24418},{16,31,19831},{15,31,18144},{13,31,11876},{16,31,23685},{11,31,10015},{8,31,6638}, +{3,31,170},{3,31,16879},{0,30,2738},{25,31,3699},{24,31,2766},{24,31,2405},{21,31,820},{31,20,5164},{20,31,2584},{18,31,1552},{0,31,9},{30,26,5164},{0,31,9},{15,31,18144},{15,31,18144},{15,31,18144},{13,31,11876},{12,31,15696},{8,31,6638},{8,31,6638},{4,30,132},{0,31,10150},{0,29,2624},{24,31,2405},{24,31,2405},{24,31,2405},{21,31,820},{31,15,3872},{18,31,1552},{18,31,1552},{0,31,9},{31,23,3872}, +{0,31,9},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{12,0,9248},{12,0,9248},{12,0,9248},{12,0,9248},{7,31,2612},{7,31,2612},{7,31,2612},{4,28,8},{0,27,2210},{0,27,2210},{19,31,22762},{17,31,18876},{16,31,17222},{14,31,11585},{17,31,22068},{11,31,9551},{10,31,6509},{5,31,68},{4,31,15612},{0,30,2098},{26,31,3089}, +{24,31,2334},{24,31,1973},{22,31,661},{29,25,4267},{22,31,2150},{19,31,1285},{2,31,0},{27,28,4267},{2,31,0},{16,31,17222},{16,31,17222},{16,31,17222},{14,31,11585},{13,31,14786},{10,31,6509},{10,31,6509},{5,31,68},{0,31,9366},{0,30,2034},{24,31,1973},{24,31,1973},{24,31,1973},{22,31,661},{31,16,3202},{19,31,1285},{19,31,1285},{2,31,0},{30,24,3202},{2,31,0},{31,31,0},{31,31,0},{31,31,0}, +{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{13,0,9248},{13,0,9248},{13,0,9248},{13,0,9248},{8,31,2845},{8,31,2845},{8,31,2845},{5,29,8},{0,29,1856},{0,29,1856},{19,31,21160},{18,31,17776},{17,31,16329},{15,31,11282},{17,31,20358},{12,31,9098},{11,31,6310},{6,31,5},{6,31,14287},{0,31,1565},{27,31,2412},{25,31,1862},{25,31,1573},{23,31,509},{28,28,3361}, +{22,31,1691},{20,31,1021},{5,31,1},{28,28,3361},{5,31,1},{17,31,16329},{17,31,16329},{17,31,16329},{15,31,11282},{15,31,13658},{11,31,6310},{11,31,6310},{6,31,5},{2,31,8690},{0,31,1565},{25,31,1573},{25,31,1573},{25,31,1573},{23,31,509},{31,18,2521},{20,31,1021},{20,31,1021},{5,31,1},{30,25,2521},{5,31,1},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0}, +{0,31,0},{31,31,0},{0,31,0},{14,0,9250},{14,0,9250},{14,0,9250},{14,0,9250},{9,31,3176},{9,31,3176},{9,31,3176},{6,31,5},{0,30,1556},{0,30,1556},{20,31,19810},{19,31,16741},{18,31,15584},{16,31,11057},{19,31,18721},{14,31,8860},{12,31,6234},{7,31,10},{7,31,13210},{0,31,1325},{27,31,1868},{26,31,1464},{26,31,1268},{24,31,397},{31,23,2649},{23,31,1329},{22,31,794},{8,31,0},{31,27,2649}, +{8,31,0},{18,31,15584},{18,31,15584},{18,31,15584},{16,31,11057},{15,31,12858},{12,31,6234},{12,31,6234},{7,31,10},{3,31,8150},{0,31,1325},{26,31,1268},{26,31,1268},{26,31,1268},{24,31,397},{31,19,1989},{22,31,794},{22,31,794},{8,31,0},{31,25,1989},{8,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{15,0,9250}, +{15,0,9250},{15,0,9250},{15,0,9250},{11,31,3365},{11,31,3365},{11,31,3365},{7,31,10},{0,31,1325},{0,31,1325},{20,31,18626},{19,31,15845},{19,31,14756},{17,31,10897},{19,31,17297},{15,31,8442},{13,31,6285},{8,31,68},{8,31,12227},{0,31,1341},{27,31,1452},{27,31,1089},{27,31,968},{25,31,325},{31,24,2018},{24,31,1011},{23,31,605},{11,31,0},{30,28,2018},{11,31,0},{19,31,14756},{19,31,14756},{19,31,14756}, +{17,31,10897},{16,31,12077},{13,31,6285},{13,31,6285},{8,31,68},{4,31,7686},{0,31,1341},{27,31,968},{27,31,968},{27,31,968},{25,31,325},{31,21,1513},{23,31,605},{23,31,605},{11,31,0},{31,26,1513},{11,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{16,0,9248},{16,0,9248},{16,0,9248},{16,0,9248},{12,31,3626}, +{12,31,3626},{12,31,3626},{8,31,68},{0,31,1341},{0,31,1341},{21,31,17476},{20,31,14998},{20,31,14098},{18,31,10672},{20,31,16018},{15,31,8154},{15,31,6218},{9,31,200},{10,31,11338},{0,31,1613},{28,31,1041},{27,31,801},{27,31,680},{26,31,232},{29,29,1473},{26,31,753},{24,31,442},{14,31,0},{31,28,1473},{14,31,0},{20,31,14098},{20,31,14098},{20,31,14098},{18,31,10672},{17,31,11453},{15,31,6218},{15,31,6218}, +{9,31,200},{6,31,7270},{0,31,1613},{27,31,680},{27,31,680},{27,31,680},{26,31,232},{28,28,1105},{24,31,442},{24,31,442},{14,31,0},{28,28,1105},{14,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{31,31,0},{0,31,0},{31,31,0},{0,31,0},{17,0,9248},{17,0,9248},{17,0,9248},{17,0,9248},{13,31,3929},{13,31,3929},{13,31,3929},{9,31,200},{0,31,1613}, +{0,31,1613}, diff --git a/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc b/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc new file mode 100644 index 0000000..fad45fe --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder_tables_dxt1_6.inc @@ -0,0 +1,494 @@ +// Copyright (C) 2017-2019 Binomial LLC. All Rights Reserved. +// +// 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. +{0,4,18},{0,3,4},{0,2,0},{0,2,9},{0,3,36},{0,2,22},{0,2,13},{0,1,24},{0,1,41},{0,1,25},{0,4,18},{0,3,4},{0,2,0},{0,2,9},{1,1,36},{0,2,22},{0,2,13},{0,1,24},{3,0,36},{0,1,24},{0,2,0},{0,2,0},{0,2,0},{0,1,0},{0,1,2},{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{0,2,0}, +{0,2,0},{0,2,0},{0,1,0},{0,1,2},{0,1,1},{0,1,1},{0,0,4},{1,0,2},{0,0,4},{2,0,18},{0,3,4},{0,2,0},{0,2,9},{2,0,18},{4,0,18},{0,2,9},{0,1,20},{4,0,18},{0,1,20},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,8,38},{1,6,21},{1,4,24}, +{1,4,24},{0,8,52},{0,5,18},{0,4,1},{0,3,24},{0,4,77},{0,3,40},{2,6,22},{1,6,5},{2,4,4},{1,4,8},{4,0,52},{0,5,18},{0,4,1},{0,3,24},{8,0,52},{0,3,24},{1,6,20},{1,6,20},{1,6,20},{1,3,21},{0,6,8},{0,4,1},{0,4,1},{0,2,5},{0,3,24},{0,2,9},{2,4,4},{2,4,4},{2,4,4},{2,3,4},{3,0,8}, +{1,3,1},{1,3,1},{1,2,4},{6,0,8},{1,2,4},{5,0,18},{1,6,1},{2,4,0},{0,4,0},{5,0,18},{10,0,18},{0,4,0},{0,3,20},{10,0,18},{0,3,20},{1,0,20},{1,0,20},{1,0,20},{1,0,20},{0,5,0},{0,5,0},{0,5,0},{0,2,1},{0,2,5},{0,2,5},{3,10,38},{3,8,21},{3,6,24},{3,6,24},{2,10,52},{2,7,18},{2,6,1}, +{2,5,24},{0,7,53},{1,5,21},{4,8,22},{3,8,5},{4,6,4},{3,6,8},{7,0,52},{2,7,18},{2,6,1},{1,5,20},{14,0,52},{1,5,20},{3,8,20},{3,8,20},{3,8,20},{3,5,21},{2,8,8},{2,6,1},{2,6,1},{2,4,5},{0,6,8},{1,5,5},{4,6,4},{4,6,4},{4,6,4},{4,5,4},{6,0,8},{3,5,1},{3,5,1},{3,4,4},{12,0,8}, +{3,4,4},{8,0,18},{3,8,1},{4,6,0},{2,6,0},{8,0,18},{16,0,18},{2,6,0},{0,5,20},{16,0,18},{0,5,20},{3,0,20},{3,0,20},{3,0,20},{3,0,20},{2,7,0},{2,7,0},{2,7,0},{2,4,1},{1,5,1},{1,5,1},{5,12,38},{5,10,21},{5,8,24},{5,8,24},{4,12,52},{4,9,18},{4,8,1},{4,7,24},{2,9,53},{3,7,21},{6,10,22}, +{5,10,5},{6,8,4},{5,8,8},{2,16,51},{4,9,18},{4,8,1},{3,7,20},{20,0,51},{3,7,20},{5,10,20},{5,10,20},{5,10,20},{5,7,21},{4,10,8},{4,8,1},{4,8,1},{4,6,5},{2,8,8},{3,7,5},{6,8,4},{6,8,4},{6,8,4},{6,7,4},{9,0,8},{5,7,1},{5,7,1},{5,6,4},{18,0,8},{5,6,4},{11,0,18},{5,10,1},{6,8,0}, +{4,8,0},{11,0,18},{22,0,18},{4,8,0},{0,7,20},{22,0,18},{0,7,20},{5,0,20},{5,0,20},{5,0,20},{5,0,20},{4,9,0},{4,9,0},{4,9,0},{4,6,1},{3,7,1},{3,7,1},{7,15,36},{7,12,19},{7,10,28},{7,10,20},{6,15,52},{6,11,22},{6,10,7},{6,9,28},{3,12,52},{5,9,27},{8,13,19},{8,11,3},{8,10,3},{8,10,6},{13,1,51}, +{6,11,21},{7,10,3},{5,9,27},{27,0,51},{5,9,27},{7,12,19},{7,12,19},{7,12,19},{7,10,19},{6,13,9},{6,10,6},{6,10,6},{6,9,3},{5,10,9},{5,9,2},{8,10,2},{8,10,2},{8,10,2},{8,9,2},{12,1,8},{7,10,2},{7,10,2},{5,9,2},{25,0,8},{5,9,2},{14,1,18},{7,12,1},{8,10,2},{6,10,2},{14,1,18},{15,7,18},{6,10,2}, +{0,9,26},{15,7,18},{0,9,26},{7,0,18},{7,0,18},{7,0,18},{7,0,18},{6,11,2},{6,11,2},{6,11,2},{6,9,2},{5,9,1},{5,9,1},{9,16,38},{9,14,19},{9,12,28},{9,12,20},{8,17,52},{8,13,22},{8,12,7},{8,11,28},{5,14,52},{7,11,27},{10,15,19},{10,13,3},{10,12,3},{10,12,6},{16,1,51},{8,13,21},{9,12,3},{7,11,27},{33,0,51}, +{7,11,27},{9,14,19},{9,14,19},{9,14,19},{9,12,19},{8,15,9},{8,12,6},{8,12,6},{8,11,3},{7,12,9},{7,11,2},{10,12,2},{10,12,2},{10,12,2},{10,11,2},{15,1,8},{9,12,2},{9,12,2},{7,11,2},{31,0,8},{7,11,2},{17,0,18},{9,14,1},{10,12,2},{8,12,2},{17,0,18},{34,0,18},{8,12,2},{0,11,26},{34,0,18},{0,11,26},{9,0,18}, +{9,0,18},{9,0,18},{9,0,18},{8,13,2},{8,13,2},{8,13,2},{8,11,2},{7,11,1},{7,11,1},{11,18,38},{11,16,19},{11,14,28},{11,14,20},{10,19,52},{10,15,22},{10,14,7},{10,13,28},{7,16,52},{9,13,27},{12,16,21},{12,15,3},{12,14,3},{12,14,6},{19,1,51},{10,15,21},{11,14,3},{9,13,27},{39,0,51},{9,13,27},{11,16,18},{11,16,18},{11,16,18}, +{11,14,19},{10,17,9},{10,14,6},{10,14,6},{10,13,3},{9,14,9},{9,13,2},{12,14,2},{12,14,2},{12,14,2},{12,13,2},{15,7,8},{11,14,2},{11,14,2},{9,13,2},{31,3,8},{9,13,2},{20,0,18},{11,16,1},{12,14,2},{10,14,2},{20,0,18},{40,0,18},{10,14,2},{0,13,26},{40,0,18},{0,13,26},{11,0,18},{11,0,18},{11,0,18},{11,0,18},{10,15,2}, +{10,15,2},{10,15,2},{10,13,2},{9,13,1},{9,13,1},{13,20,38},{13,18,19},{13,16,27},{13,16,19},{12,21,52},{12,17,19},{12,16,5},{12,15,28},{10,17,52},{11,15,27},{14,18,21},{14,17,3},{14,16,1},{13,16,10},{22,1,51},{12,17,18},{13,16,2},{11,15,27},{45,0,51},{11,15,27},{13,18,18},{13,18,18},{13,18,18},{13,16,19},{12,19,9},{12,16,5},{12,16,5}, +{12,15,3},{10,16,11},{11,15,2},{14,16,1},{14,16,1},{14,16,1},{14,15,2},{15,13,8},{13,16,2},{13,16,2},{11,15,2},{31,6,8},{11,15,2},{23,0,18},{13,18,1},{14,16,0},{12,16,0},{23,0,18},{46,0,18},{12,16,0},{0,15,26},{46,0,18},{0,15,26},{13,0,18},{13,0,18},{13,0,18},{13,0,18},{12,17,1},{12,17,1},{12,17,1},{12,15,2},{11,15,1}, +{11,15,1},{15,23,38},{15,20,21},{15,18,37},{15,18,21},{15,22,55},{15,19,23},{15,18,5},{14,17,30},{13,19,56},{13,17,28},{16,21,19},{16,19,3},{16,18,3},{16,18,6},{17,17,51},{15,19,19},{15,18,1},{14,17,26},{51,0,51},{14,17,26},{15,21,20},{15,21,20},{15,21,20},{15,18,20},{15,19,14},{15,18,4},{15,18,4},{14,17,5},{13,18,9},{13,17,3},{16,18,2}, +{16,18,2},{16,18,2},{16,17,2},{24,1,8},{15,18,0},{15,18,0},{14,17,1},{49,0,8},{14,17,1},{26,1,18},{15,20,1},{16,18,2},{15,18,1},{26,1,18},{53,0,18},{15,18,1},{0,17,26},{53,0,18},{0,17,26},{15,0,20},{15,0,20},{15,0,20},{15,0,20},{15,18,4},{15,18,4},{15,18,4},{14,17,4},{13,17,2},{13,17,2},{17,25,36},{17,22,19},{17,20,28}, +{17,20,20},{16,25,52},{16,21,22},{16,20,7},{16,19,28},{15,21,56},{15,19,28},{18,23,19},{18,21,3},{18,20,3},{18,20,6},{20,17,51},{16,21,21},{17,20,3},{14,20,26},{57,0,51},{14,20,26},{17,22,19},{17,22,19},{17,22,19},{17,20,19},{16,23,9},{16,20,6},{16,20,6},{16,19,3},{15,20,9},{15,19,3},{18,20,2},{18,20,2},{18,20,2},{18,19,2},{27,1,8}, +{17,20,2},{17,20,2},{15,19,2},{55,0,8},{15,19,2},{29,1,18},{17,22,1},{18,20,2},{16,20,2},{29,1,18},{59,0,18},{16,20,2},{0,19,26},{59,0,18},{0,19,26},{17,0,18},{17,0,18},{17,0,18},{17,0,18},{16,21,2},{16,21,2},{16,21,2},{16,19,2},{15,19,2},{15,19,2},{19,27,36},{19,24,19},{19,22,28},{19,22,20},{18,27,52},{18,23,22},{18,22,7}, +{18,21,28},{15,24,56},{17,21,27},{20,25,19},{20,23,3},{20,22,3},{20,22,6},{23,17,51},{18,23,21},{19,22,3},{17,21,27},{63,0,51},{17,21,27},{19,24,19},{19,24,19},{19,24,19},{19,22,19},{18,25,9},{18,22,6},{18,22,6},{18,21,3},{17,22,9},{17,21,2},{20,22,2},{20,22,2},{20,22,2},{20,21,2},{30,1,8},{19,22,2},{19,22,2},{17,21,2},{61,0,8}, +{17,21,2},{31,3,18},{19,24,1},{20,22,2},{18,22,2},{31,3,18},{63,1,18},{18,22,2},{0,21,26},{63,1,18},{0,21,26},{19,0,18},{19,0,18},{19,0,18},{19,0,18},{18,23,2},{18,23,2},{18,23,2},{18,21,2},{17,21,1},{17,21,1},{21,29,36},{21,26,19},{21,24,28},{21,24,20},{20,29,52},{20,25,22},{20,24,7},{20,23,28},{17,26,52},{19,23,27},{22,27,19}, +{22,25,3},{22,24,3},{22,24,6},{34,1,51},{20,25,21},{21,24,3},{19,23,27},{63,3,51},{19,23,27},{21,26,19},{21,26,19},{21,26,19},{21,24,19},{20,27,9},{20,24,6},{20,24,6},{20,23,3},{19,24,9},{19,23,2},{22,24,2},{22,24,2},{22,24,2},{22,23,2},{33,1,8},{21,24,2},{21,24,2},{19,23,2},{63,2,8},{19,23,2},{31,9,18},{21,26,1},{22,24,2}, +{20,24,2},{31,9,18},{63,4,18},{20,24,2},{0,23,26},{63,4,18},{0,23,26},{21,0,18},{21,0,18},{21,0,18},{21,0,18},{20,25,2},{20,25,2},{20,25,2},{20,23,2},{19,23,1},{19,23,1},{23,31,40},{23,29,24},{23,27,33},{23,26,24},{23,30,55},{22,28,24},{23,26,8},{22,26,28},{20,28,51},{21,26,21},{24,29,20},{24,28,1},{24,27,4},{24,26,5},{38,0,51}, +{22,28,20},{23,26,4},{20,26,20},{62,7,51},{20,26,20},{23,29,20},{23,29,20},{23,29,20},{23,26,20},{23,28,12},{23,26,4},{23,26,4},{22,25,4},{20,27,9},{22,25,4},{24,27,0},{24,27,0},{24,27,0},{24,26,1},{31,12,8},{23,26,0},{23,26,0},{22,25,0},{62,6,8},{22,25,0},{38,1,18},{24,28,1},{24,27,4},{23,26,4},{38,1,18},{45,16,18},{23,26,4}, +{0,26,20},{45,16,18},{0,26,20},{23,0,20},{23,0,20},{23,0,20},{23,0,20},{23,26,4},{23,26,4},{23,26,4},{22,25,4},{21,26,1},{21,26,1},{25,33,38},{25,31,24},{25,29,33},{25,28,24},{25,32,55},{24,30,24},{25,28,8},{24,28,28},{22,30,51},{23,28,21},{26,31,20},{26,30,1},{26,29,4},{26,28,5},{41,0,51},{24,30,20},{25,28,4},{22,28,20},{62,10,51}, +{22,28,20},{25,31,20},{25,31,20},{25,31,20},{25,28,20},{25,30,12},{25,28,4},{25,28,4},{24,27,4},{22,29,9},{24,27,4},{26,29,0},{26,29,0},{26,29,0},{26,28,1},{31,18,8},{25,28,0},{25,28,0},{24,27,0},{62,9,8},{24,27,0},{41,1,18},{26,30,1},{26,29,4},{25,28,4},{41,1,18},{51,16,18},{25,28,4},{0,28,20},{51,16,18},{0,28,20},{25,0,20}, +{25,0,20},{25,0,20},{25,0,20},{25,28,4},{25,28,4},{25,28,4},{24,27,4},{23,28,1},{23,28,1},{27,35,38},{27,32,21},{27,31,33},{27,30,24},{27,34,55},{26,32,24},{27,30,8},{26,30,28},{25,31,56},{25,30,21},{28,33,18},{28,32,2},{28,31,4},{28,30,5},{44,0,51},{26,32,20},{27,30,4},{24,30,20},{62,13,51},{24,30,20},{27,33,20},{27,33,20},{27,33,20}, +{27,30,20},{27,31,14},{27,30,4},{27,30,4},{26,29,4},{24,31,9},{26,29,4},{28,31,0},{28,31,0},{28,31,0},{28,30,1},{34,17,8},{27,30,0},{27,30,0},{26,29,0},{62,12,8},{26,29,0},{44,1,18},{27,32,1},{28,31,4},{27,30,4},{44,1,18},{57,16,18},{27,30,4},{0,30,20},{57,16,18},{0,30,20},{27,0,20},{27,0,20},{27,0,20},{27,0,20},{27,30,4}, +{27,30,4},{27,30,4},{26,29,4},{25,30,1},{25,30,1},{29,37,38},{29,34,21},{29,32,37},{29,32,21},{29,36,55},{29,33,23},{29,32,5},{28,32,39},{27,33,56},{26,32,30},{30,35,18},{30,34,2},{30,32,2},{30,32,5},{47,0,51},{29,33,19},{29,32,1},{26,32,26},{46,24,51},{26,32,26},{29,35,20},{29,35,20},{29,35,20},{29,32,20},{29,33,14},{29,32,4},{29,32,4}, +{28,31,4},{27,32,9},{28,31,4},{30,33,0},{30,33,0},{30,33,0},{30,31,4},{37,17,8},{29,32,0},{29,32,0},{28,31,0},{62,15,8},{28,31,0},{47,1,18},{29,34,1},{30,32,2},{29,32,1},{47,1,18},{63,16,18},{29,32,1},{0,32,26},{63,16,18},{0,32,26},{29,0,20},{29,0,20},{29,0,20},{29,0,20},{29,32,4},{29,32,4},{29,32,4},{28,31,4},{28,31,4}, +{28,31,4},{31,40,44},{31,37,28},{32,35,40},{31,34,31},{31,38,53},{31,35,21},{31,34,7},{31,34,30},{28,36,51},{29,34,21},{32,37,20},{32,36,1},{32,35,4},{32,34,5},{50,0,51},{30,36,19},{31,34,6},{28,34,21},{62,19,51},{28,34,21},{31,38,26},{31,38,26},{31,38,26},{31,34,27},{31,36,9},{31,34,3},{31,34,3},{31,33,2},{29,34,10},{30,33,2},{32,35,0}, +{32,35,0},{32,35,0},{32,34,1},{49,0,8},{31,34,2},{31,34,2},{30,33,1},{62,18,8},{30,33,1},{47,8,18},{32,36,1},{32,35,4},{31,34,5},{47,8,18},{62,20,18},{31,34,5},{0,34,20},{62,20,18},{0,34,20},{31,0,26},{31,0,26},{31,0,26},{31,0,26},{31,35,1},{31,35,1},{31,35,1},{31,33,2},{29,34,1},{29,34,1},{33,41,40},{33,39,24},{33,37,33}, +{33,36,24},{33,40,55},{32,38,24},{33,36,8},{32,36,28},{30,38,51},{31,36,21},{34,39,20},{34,38,1},{34,37,4},{34,36,5},{53,0,51},{32,38,20},{33,36,4},{30,36,21},{62,22,51},{30,36,21},{33,39,20},{33,39,20},{33,39,20},{33,36,20},{33,38,12},{33,36,4},{33,36,4},{32,35,4},{31,36,10},{32,35,4},{34,37,0},{34,37,0},{34,37,0},{34,36,1},{52,0,8}, +{33,36,0},{33,36,0},{32,35,0},{62,21,8},{32,35,0},{47,14,18},{34,38,1},{34,37,4},{33,36,4},{47,14,18},{62,23,18},{33,36,4},{0,36,20},{62,23,18},{0,36,20},{33,0,20},{33,0,20},{33,0,20},{33,0,20},{33,36,4},{33,36,4},{33,36,4},{32,35,4},{31,36,1},{31,36,1},{35,43,40},{35,41,24},{35,39,33},{35,38,24},{35,42,55},{34,40,24},{35,38,8}, +{34,38,28},{32,40,51},{33,38,21},{36,41,20},{36,40,1},{36,39,4},{36,38,5},{56,0,51},{34,40,20},{35,38,4},{32,38,20},{62,25,51},{32,38,20},{35,41,20},{35,41,20},{35,41,20},{35,38,20},{35,40,12},{35,38,4},{35,38,4},{34,37,4},{32,39,9},{34,37,4},{36,39,0},{36,39,0},{36,39,0},{36,38,1},{55,0,8},{35,38,0},{35,38,0},{34,37,0},{62,24,8}, +{34,37,0},{48,17,18},{36,40,1},{36,39,4},{35,38,4},{48,17,18},{62,26,18},{35,38,4},{0,38,20},{62,26,18},{0,38,20},{35,0,20},{35,0,20},{35,0,20},{35,0,20},{35,38,4},{35,38,4},{35,38,4},{34,37,4},{33,38,1},{33,38,1},{37,45,40},{37,43,24},{37,41,33},{37,40,24},{37,44,55},{36,42,24},{37,40,8},{36,40,28},{34,42,51},{35,40,21},{38,43,20}, +{38,42,1},{38,41,4},{38,40,5},{59,0,51},{36,42,20},{37,40,4},{34,40,20},{62,28,51},{34,40,20},{37,43,20},{37,43,20},{37,43,20},{37,40,20},{37,42,12},{37,40,4},{37,40,4},{36,39,4},{34,41,9},{36,39,4},{38,41,0},{38,41,0},{38,41,0},{38,40,1},{58,0,8},{37,40,0},{37,40,0},{36,39,0},{62,27,8},{36,39,0},{51,17,18},{38,42,1},{38,41,4}, +{37,40,4},{51,17,18},{62,29,18},{37,40,4},{0,40,20},{62,29,18},{0,40,20},{37,0,20},{37,0,20},{37,0,20},{37,0,20},{37,40,4},{37,40,4},{37,40,4},{36,39,4},{35,40,1},{35,40,1},{40,46,44},{40,44,27},{40,43,28},{39,43,28},{39,47,52},{39,44,22},{39,43,3},{38,42,28},{36,44,53},{37,42,19},{40,46,19},{40,44,2},{40,43,3},{40,42,10},{62,1,51}, +{38,44,19},{39,43,2},{37,42,18},{63,31,51},{37,42,18},{40,44,26},{40,44,26},{40,44,26},{40,42,26},{39,44,11},{39,43,2},{39,43,2},{39,41,2},{37,43,11},{38,41,3},{40,44,1},{40,44,1},{40,44,1},{40,42,1},{53,16,8},{40,42,1},{40,42,1},{39,41,1},{63,30,8},{39,41,1},{63,0,18},{40,44,1},{40,43,2},{38,43,1},{63,0,18},{62,32,18},{38,43,1}, +{0,42,18},{62,32,18},{0,42,18},{39,0,26},{39,0,26},{39,0,26},{39,0,26},{39,43,1},{39,43,1},{39,43,1},{39,41,1},{37,42,1},{37,42,1},{42,48,44},{42,46,27},{42,45,28},{41,45,28},{41,48,53},{41,46,22},{41,45,3},{40,44,28},{38,46,53},{39,44,19},{42,48,19},{42,46,2},{42,45,3},{42,44,10},{63,5,51},{40,46,19},{41,45,2},{39,44,18},{47,42,51}, +{39,44,18},{42,46,26},{42,46,26},{42,46,26},{42,44,26},{41,46,11},{41,45,2},{41,45,2},{41,43,2},{39,45,11},{40,43,3},{42,46,1},{42,46,1},{42,46,1},{42,44,1},{56,16,8},{42,44,1},{42,44,1},{41,43,1},{62,33,8},{41,43,1},{63,6,18},{42,46,1},{42,45,2},{40,45,1},{63,6,18},{62,35,18},{40,45,1},{0,44,18},{62,35,18},{0,44,18},{41,0,26}, +{41,0,26},{41,0,26},{41,0,26},{41,45,1},{41,45,1},{41,45,1},{41,43,1},{39,44,1},{39,44,1},{44,50,44},{44,48,26},{44,47,28},{43,47,28},{43,50,53},{43,47,27},{43,47,3},{42,46,28},{40,48,51},{41,46,19},{44,50,19},{44,48,1},{44,47,3},{44,46,10},{63,11,51},{42,48,19},{43,47,2},{41,46,18},{47,45,51},{41,46,18},{44,48,26},{44,48,26},{44,48,26}, +{44,46,26},{43,48,9},{43,47,2},{43,47,2},{43,45,2},{41,47,11},{42,45,3},{44,48,1},{44,48,1},{44,48,1},{44,46,1},{59,16,8},{44,46,1},{44,46,1},{43,45,1},{62,36,8},{43,45,1},{63,12,18},{44,48,0},{44,47,2},{42,47,1},{63,12,18},{62,38,18},{42,47,1},{0,46,18},{62,38,18},{0,46,18},{43,0,26},{43,0,26},{43,0,26},{43,0,26},{43,47,1}, +{43,47,1},{43,47,1},{43,45,1},{41,46,1},{41,46,1},{46,52,44},{46,50,26},{46,49,31},{45,48,31},{45,52,53},{45,49,21},{45,48,7},{45,48,30},{42,50,51},{43,48,21},{46,52,19},{46,50,1},{46,49,6},{46,48,6},{55,32,51},{44,50,19},{45,48,6},{42,48,21},{46,48,51},{42,48,21},{46,50,26},{46,50,26},{46,50,26},{45,48,27},{45,50,9},{45,48,3},{45,48,3}, +{45,47,2},{43,48,10},{44,47,3},{46,50,1},{46,50,1},{46,50,1},{46,48,2},{62,16,8},{45,48,2},{45,48,2},{45,47,1},{62,39,8},{45,47,1},{63,18,18},{46,50,0},{47,48,4},{45,48,5},{63,18,18},{62,41,18},{45,48,5},{0,48,20},{62,41,18},{0,48,20},{45,0,26},{45,0,26},{45,0,26},{45,0,26},{45,49,1},{45,49,1},{45,49,1},{45,47,1},{43,48,1}, +{43,48,1},{48,54,44},{48,52,27},{48,51,28},{48,50,35},{47,55,51},{47,52,21},{47,51,3},{47,50,22},{45,52,52},{45,50,19},{48,54,19},{48,52,2},{48,51,3},{48,50,10},{63,23,51},{47,52,21},{47,51,3},{45,50,18},{63,43,51},{45,50,18},{48,52,26},{48,52,26},{48,52,26},{48,50,26},{47,53,8},{47,51,2},{47,51,2},{47,49,1},{45,51,8},{46,49,5},{48,52,1}, +{48,52,1},{48,52,1},{48,50,1},{63,21,8},{48,50,1},{48,50,1},{47,49,1},{63,42,8},{47,49,1},{63,25,18},{48,52,1},{48,51,2},{46,51,1},{63,25,18},{63,44,18},{46,51,1},{0,50,18},{63,44,18},{0,50,18},{48,0,26},{48,0,26},{48,0,26},{48,0,26},{47,51,1},{47,51,1},{47,51,1},{47,49,0},{45,50,1},{45,50,1},{50,56,44},{50,54,27},{50,53,28}, +{49,53,28},{49,57,52},{49,54,22},{49,53,3},{48,52,28},{47,54,52},{47,52,19},{50,56,19},{50,54,2},{50,53,3},{50,52,10},{63,29,51},{48,54,19},{49,53,2},{47,52,18},{63,46,51},{47,52,18},{50,54,26},{50,54,26},{50,54,26},{50,52,26},{49,54,11},{49,53,2},{49,53,2},{49,51,2},{47,53,8},{48,51,3},{50,54,1},{50,54,1},{50,54,1},{50,52,1},{63,27,8}, +{50,52,1},{50,52,1},{49,51,1},{63,45,8},{49,51,1},{63,31,18},{50,54,1},{50,53,2},{48,53,1},{63,31,18},{63,47,18},{48,53,1},{0,52,18},{63,47,18},{0,52,18},{49,0,26},{49,0,26},{49,0,26},{49,0,26},{49,53,1},{49,53,1},{49,53,1},{49,51,1},{47,52,1},{47,52,1},{52,58,44},{52,56,27},{52,55,28},{51,55,28},{51,59,52},{51,56,22},{51,55,3}, +{50,54,28},{48,56,53},{49,54,19},{52,58,19},{52,56,2},{52,55,3},{52,54,10},{63,35,51},{50,56,19},{51,55,2},{49,54,18},{63,49,51},{49,54,18},{52,56,26},{52,56,26},{52,56,26},{52,54,26},{51,56,11},{51,55,2},{51,55,2},{51,53,2},{49,55,11},{50,53,3},{52,56,1},{52,56,1},{52,56,1},{52,54,1},{63,33,8},{52,54,1},{52,54,1},{51,53,1},{47,56,8}, +{51,53,1},{57,48,18},{52,56,1},{52,55,2},{50,55,1},{57,48,18},{62,50,18},{50,55,1},{0,54,18},{62,50,18},{0,54,18},{51,0,26},{51,0,26},{51,0,26},{51,0,26},{51,55,1},{51,55,1},{51,55,1},{51,53,1},{49,54,1},{49,54,1},{54,60,44},{54,58,27},{54,57,28},{53,57,28},{53,61,52},{53,58,22},{53,57,3},{52,56,28},{50,58,53},{51,56,19},{54,60,19}, +{54,58,2},{54,57,3},{54,56,10},{63,41,51},{52,58,19},{53,57,2},{51,56,18},{63,52,51},{51,56,18},{54,58,26},{54,58,26},{54,58,26},{54,56,26},{53,58,11},{53,57,2},{53,57,2},{53,55,2},{51,57,11},{52,55,3},{54,58,1},{54,58,1},{54,58,1},{54,56,1},{63,39,8},{54,56,1},{54,56,1},{53,55,1},{47,59,8},{53,55,1},{60,48,18},{54,58,1},{54,57,2}, +{52,57,1},{60,48,18},{62,53,18},{52,57,1},{0,56,18},{62,53,18},{0,56,18},{53,0,26},{53,0,26},{53,0,26},{53,0,26},{53,57,1},{53,57,1},{53,57,1},{53,55,1},{51,56,1},{51,56,1},{56,63,38},{56,61,21},{56,59,24},{56,59,24},{55,63,52},{55,60,18},{55,59,1},{55,58,24},{53,60,53},{54,58,21},{57,61,22},{56,61,5},{57,59,4},{56,59,8},{63,47,52}, +{55,60,18},{55,59,1},{54,58,20},{63,55,52},{54,58,20},{56,61,20},{56,61,20},{56,61,20},{56,58,21},{55,61,8},{55,59,1},{55,59,1},{55,57,5},{53,59,8},{54,58,5},{57,59,4},{57,59,4},{57,59,4},{57,58,4},{61,49,8},{56,58,1},{56,58,1},{56,57,4},{63,54,8},{56,57,4},{63,49,18},{56,61,1},{57,59,0},{55,59,0},{63,49,18},{63,56,18},{55,59,0}, +{0,58,20},{63,56,18},{0,58,20},{56,0,20},{56,0,20},{56,0,20},{56,0,20},{55,60,0},{55,60,0},{55,60,0},{55,57,1},{54,58,1},{54,58,1},{58,63,56},{58,63,21},{58,61,24},{58,61,24},{58,63,68},{57,62,18},{57,61,1},{57,60,24},{55,62,53},{56,60,21},{59,63,22},{58,63,5},{59,61,4},{58,61,8},{63,53,52},{57,62,18},{57,61,1},{56,60,20},{63,58,52}, +{56,60,20},{58,63,20},{58,63,20},{58,63,20},{58,60,21},{57,63,8},{57,61,1},{57,61,1},{57,59,5},{55,61,8},{56,60,5},{59,61,4},{59,61,4},{59,61,4},{59,60,4},{63,51,8},{58,60,1},{58,60,1},{58,59,4},{63,57,8},{58,59,4},{63,55,18},{58,63,1},{59,61,0},{57,61,0},{63,55,18},{63,59,18},{57,61,0},{0,60,20},{63,59,18},{0,60,20},{58,0,20}, +{58,0,20},{58,0,20},{58,0,20},{57,62,0},{57,62,0},{57,62,0},{57,59,1},{56,60,1},{56,60,1},{60,63,88},{60,63,40},{60,63,24},{60,63,24},{60,63,88},{59,63,37},{59,63,1},{59,62,24},{58,63,63},{58,62,21},{61,63,40},{61,63,13},{61,63,4},{60,63,8},{63,59,52},{60,63,24},{59,63,1},{58,62,20},{63,61,52},{58,62,20},{60,63,24},{60,63,24},{60,63,24}, +{60,62,21},{60,63,24},{59,63,1},{59,63,1},{59,61,5},{57,63,8},{58,62,5},{61,63,4},{61,63,4},{61,63,4},{61,62,4},{63,57,8},{60,62,1},{60,62,1},{60,61,4},{63,60,8},{60,61,4},{63,61,18},{61,63,9},{61,63,0},{59,63,0},{63,61,18},{63,62,18},{59,63,0},{0,62,20},{63,62,18},{0,62,20},{60,0,20},{60,0,20},{60,0,20},{60,0,20},{59,63,1}, +{59,63,1},{59,63,1},{59,61,1},{58,62,1},{58,62,1},{62,63,38},{62,63,33},{62,63,29},{62,63,24},{62,63,35},{62,63,25},{62,63,21},{61,63,1},{61,63,23},{60,63,4},{63,63,4},{63,63,4},{63,63,4},{63,63,4},{63,63,4},{63,63,4},{63,63,4},{62,63,0},{63,63,4},{62,63,0},{62,63,29},{62,63,29},{62,63,29},{62,63,24},{62,63,26},{62,63,21},{62,63,21}, +{61,63,1},{61,63,14},{60,63,4},{63,63,4},{63,63,4},{63,63,4},{63,63,4},{63,62,4},{63,63,4},{63,63,4},{62,63,0},{62,63,4},{62,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{62,0,20},{62,0,20},{62,0,20},{62,0,20},{61,63,16},{61,63,16},{61,63,16},{61,63,1},{60,63,4}, +{60,63,4},{0,8,74},{0,6,10},{0,4,1},{0,4,26},{0,6,154},{0,4,99},{0,3,50},{0,2,115},{0,3,170},{0,2,119},{0,8,74},{0,6,10},{0,4,1},{0,4,26},{3,0,154},{0,4,99},{0,3,50},{0,2,115},{6,0,154},{0,2,115},{0,4,0},{0,4,0},{0,4,0},{0,2,0},{0,2,13},{0,2,4},{0,2,4},{0,1,5},{0,1,14},{0,1,6},{0,4,0}, +{0,4,0},{0,4,0},{0,2,0},{1,0,13},{0,2,4},{0,2,4},{0,1,5},{2,0,13},{0,1,5},{4,0,74},{0,6,10},{0,4,1},{0,4,26},{4,0,74},{8,0,74},{0,4,26},{0,3,74},{8,0,74},{0,3,74},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,14,83},{0,10,10},{1,6,27}, +{0,6,19},{0,11,243},{0,7,110},{0,5,34},{0,4,139},{0,5,280},{0,4,164},{1,12,75},{1,9,2},{1,6,11},{1,6,18},{5,1,243},{0,7,110},{0,5,34},{0,4,139},{11,0,243},{0,4,139},{0,10,9},{0,10,9},{0,10,9},{0,5,9},{0,6,50},{0,5,9},{0,5,9},{0,3,26},{0,3,66},{0,2,33},{1,8,1},{1,8,1},{1,8,1},{1,4,2},{3,0,50}, +{0,5,9},{0,5,9},{0,3,26},{6,0,50},{0,3,26},{7,0,74},{1,9,1},{2,6,1},{0,6,10},{7,0,74},{14,0,74},{0,6,10},{0,5,74},{14,0,74},{0,5,74},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,2,1},{0,2,1},{0,2,1},{0,1,1},{0,1,2},{0,1,2},{1,18,137},{1,12,74},{2,9,98},{1,8,67},{0,16,244},{0,10,78},{0,8,2}, +{0,6,115},{0,8,344},{0,6,179},{3,14,75},{3,11,2},{3,8,11},{3,8,18},{8,1,243},{0,10,78},{0,8,2},{0,6,115},{15,1,243},{0,6,115},{1,14,65},{1,14,65},{1,14,65},{1,7,66},{0,12,50},{0,8,1},{0,8,1},{0,5,5},{0,5,104},{0,5,41},{3,10,1},{3,10,1},{3,10,1},{3,6,2},{6,0,50},{0,8,1},{0,8,1},{0,5,5},{12,0,50}, +{0,5,5},{2,16,72},{3,11,1},{4,8,1},{0,8,1},{2,16,72},{20,0,72},{0,8,1},{0,7,74},{20,0,72},{0,7,74},{1,0,65},{1,0,65},{1,0,65},{1,0,65},{0,8,1},{0,8,1},{0,8,1},{0,4,1},{0,3,25},{0,3,25},{3,20,146},{3,14,83},{4,11,115},{3,10,76},{2,18,245},{2,12,79},{2,10,3},{1,8,108},{0,11,293},{0,8,103},{5,16,73}, +{5,13,2},{5,10,11},{5,10,18},{11,1,243},{1,13,75},{2,10,2},{0,8,94},{15,4,243},{0,8,94},{3,16,74},{3,16,74},{3,16,74},{3,9,75},{2,14,51},{2,10,2},{2,10,2},{2,7,6},{0,9,75},{0,7,6},{5,12,1},{5,12,1},{5,12,1},{5,8,2},{9,0,50},{2,10,1},{2,10,1},{0,7,2},{18,0,50},{0,7,2},{5,16,72},{5,13,1},{6,10,1}, +{2,10,1},{5,16,72},{26,0,72},{2,10,1},{0,9,74},{26,0,72},{0,9,74},{3,0,74},{3,0,74},{3,0,74},{3,0,74},{2,10,2},{2,10,2},{2,10,2},{2,6,2},{0,7,5},{0,7,5},{6,21,152},{6,16,82},{6,13,109},{5,12,84},{4,21,243},{4,15,78},{4,13,8},{4,11,108},{0,14,255},{0,11,77},{7,19,72},{7,15,1},{7,13,8},{7,12,13},{6,17,243}, +{3,15,72},{5,12,5},{0,11,73},{29,0,243},{0,11,73},{6,16,81},{6,16,81},{6,16,81},{5,12,80},{4,17,50},{4,13,4},{4,13,4},{4,9,5},{0,12,52},{1,10,4},{7,15,0},{7,15,0},{7,15,0},{7,11,0},{12,1,50},{5,12,1},{5,12,1},{3,9,4},{25,0,50},{3,9,4},{16,1,72},{7,15,1},{8,13,4},{5,12,4},{16,1,72},{33,0,72},{5,12,4}, +{0,11,72},{33,0,72},{0,11,72},{5,0,80},{5,0,80},{5,0,80},{5,0,80},{4,13,0},{4,13,0},{4,13,0},{4,9,1},{1,10,0},{1,10,0},{8,23,152},{8,18,82},{8,15,109},{7,14,84},{6,23,243},{6,16,75},{6,15,8},{6,13,108},{1,17,244},{2,13,77},{9,21,72},{9,17,1},{9,15,8},{9,14,13},{17,1,243},{5,17,72},{7,14,5},{1,13,72},{35,0,243}, +{1,13,72},{8,18,81},{8,18,81},{8,18,81},{7,14,80},{6,19,50},{6,15,4},{6,15,4},{6,11,5},{2,14,52},{3,12,4},{9,16,1},{9,16,1},{9,16,1},{9,13,0},{15,1,50},{7,14,1},{7,14,1},{5,11,4},{31,0,50},{5,11,4},{19,1,72},{9,17,1},{10,15,4},{7,14,4},{19,1,72},{39,0,72},{7,14,4},{0,13,72},{39,0,72},{0,13,72},{7,0,80}, +{7,0,80},{7,0,80},{7,0,80},{6,15,0},{6,15,0},{6,15,0},{6,11,1},{3,12,0},{3,12,0},{10,25,152},{10,20,82},{10,17,114},{9,16,82},{8,25,243},{8,18,75},{8,16,2},{8,15,108},{3,19,244},{4,15,77},{11,23,72},{11,19,1},{11,16,10},{11,16,17},{20,1,243},{7,19,72},{8,16,2},{3,15,72},{41,0,243},{3,15,72},{10,20,81},{10,20,81},{10,20,81}, +{10,15,81},{8,21,50},{8,16,1},{8,16,1},{8,13,5},{4,16,52},{5,14,4},{11,18,1},{11,18,1},{11,18,1},{11,15,0},{15,7,50},{8,16,1},{8,16,1},{7,13,4},{31,3,50},{7,13,4},{22,1,72},{11,19,1},{12,16,2},{8,16,1},{22,1,72},{45,0,72},{8,16,1},{0,15,72},{45,0,72},{0,15,72},{9,0,80},{9,0,80},{9,0,80},{9,0,80},{8,17,0}, +{8,17,0},{8,17,0},{8,13,1},{5,14,0},{5,14,0},{12,27,152},{12,22,82},{12,19,114},{11,18,82},{10,27,243},{10,20,75},{10,18,2},{10,16,106},{5,21,244},{6,17,79},{13,25,72},{13,21,1},{13,18,10},{13,18,17},{23,1,243},{9,21,72},{10,18,2},{5,17,74},{47,0,243},{5,17,74},{12,22,81},{12,22,81},{12,22,81},{12,17,80},{10,23,50},{10,18,1},{10,18,1}, +{10,15,5},{6,18,52},{8,15,9},{13,20,1},{13,20,1},{13,20,1},{13,17,1},{15,13,50},{10,18,1},{10,18,1},{9,15,4},{31,6,50},{9,15,4},{25,1,72},{13,21,1},{14,18,2},{10,18,1},{25,1,72},{47,2,72},{10,18,1},{0,17,74},{47,2,72},{0,17,74},{11,0,80},{11,0,80},{11,0,80},{11,0,80},{10,19,0},{10,19,0},{10,19,0},{10,15,1},{7,16,0}, +{7,16,0},{14,30,146},{14,24,78},{14,21,114},{14,20,79},{12,30,244},{12,23,79},{12,21,7},{12,19,109},{7,23,244},{9,19,76},{15,28,73},{15,23,2},{15,21,14},{15,20,14},{27,0,243},{11,23,75},{13,20,4},{7,19,73},{46,4,243},{7,19,73},{14,25,74},{14,25,74},{14,25,74},{14,19,75},{12,25,53},{12,21,3},{12,21,3},{12,17,6},{8,21,52},{9,18,6},{15,23,1}, +{15,23,1},{15,23,1},{15,19,1},{24,1,50},{13,20,0},{13,20,0},{11,17,5},{49,0,50},{11,17,5},{20,17,72},{15,23,1},{16,21,4},{13,20,4},{20,17,72},{57,0,72},{13,20,4},{0,19,72},{57,0,72},{0,19,72},{14,0,74},{14,0,74},{14,0,74},{14,0,74},{12,22,1},{12,22,1},{12,22,1},{12,17,2},{9,18,2},{9,18,2},{16,31,152},{16,26,81},{16,23,109}, +{16,22,88},{14,32,244},{14,25,79},{14,23,7},{14,21,109},{9,25,244},{11,21,76},{17,29,72},{17,25,1},{17,23,8},{17,22,13},{30,0,243},{13,25,75},{15,22,4},{9,21,73},{46,7,243},{9,21,73},{16,27,80},{16,27,80},{16,27,80},{16,21,81},{14,27,53},{14,23,3},{14,23,3},{14,19,6},{10,23,52},{11,20,6},{17,25,0},{17,25,0},{17,25,0},{17,21,0},{27,1,50}, +{15,22,0},{15,22,0},{13,19,5},{55,0,50},{13,19,5},{23,17,72},{17,25,1},{18,23,4},{15,22,4},{23,17,72},{63,0,72},{15,22,4},{0,21,72},{63,0,72},{0,21,72},{16,0,80},{16,0,80},{16,0,80},{16,0,80},{14,24,1},{14,24,1},{14,24,1},{14,19,2},{11,20,2},{11,20,2},{18,33,152},{18,28,81},{18,25,109},{17,24,84},{16,33,243},{16,27,78},{16,25,8}, +{16,23,108},{11,27,244},{13,23,76},{19,31,72},{19,27,1},{19,25,8},{19,24,13},{32,1,243},{15,27,75},{17,24,5},{11,23,73},{46,10,243},{11,23,73},{18,29,80},{18,29,80},{18,29,80},{17,24,80},{16,29,50},{16,25,4},{16,25,4},{16,21,5},{12,25,52},{13,22,6},{19,27,0},{19,27,0},{19,27,0},{19,23,0},{30,1,50},{17,24,1},{17,24,1},{15,21,5},{61,0,50}, +{15,21,5},{34,1,72},{19,27,1},{20,25,4},{17,24,4},{34,1,72},{63,3,72},{17,24,4},{0,23,72},{63,3,72},{0,23,72},{17,0,80},{17,0,80},{17,0,80},{17,0,80},{16,25,0},{16,25,0},{16,25,0},{16,21,1},{13,22,2},{13,22,2},{20,35,152},{20,30,81},{20,27,109},{19,26,84},{18,35,243},{18,29,78},{18,27,8},{18,25,108},{13,29,244},{15,25,76},{21,33,72}, +{21,29,1},{21,27,8},{21,26,13},{35,1,243},{17,29,72},{19,26,5},{13,25,73},{46,13,243},{13,25,73},{20,31,80},{20,31,80},{20,31,80},{19,26,80},{18,31,50},{18,27,4},{18,27,4},{18,23,5},{14,27,52},{15,24,6},{21,29,0},{21,29,0},{21,29,0},{21,25,0},{33,1,50},{19,26,1},{19,26,1},{17,23,4},{63,2,50},{17,23,4},{37,1,72},{21,29,1},{22,27,4}, +{19,26,4},{37,1,72},{63,6,72},{19,26,4},{0,25,72},{63,6,72},{0,25,72},{19,0,80},{19,0,80},{19,0,80},{19,0,80},{18,27,0},{18,27,0},{18,27,0},{18,23,1},{15,24,2},{15,24,2},{22,38,146},{22,32,78},{22,29,111},{22,28,84},{20,38,244},{20,31,74},{20,29,4},{20,27,100},{14,32,247},{17,27,75},{23,36,73},{23,32,3},{23,29,11},{23,28,14},{39,0,243}, +{20,31,73},{20,29,3},{16,27,74},{62,8,243},{16,27,74},{22,33,74},{22,33,74},{22,33,74},{22,28,75},{20,33,53},{20,29,3},{20,29,3},{20,25,10},{16,29,50},{18,26,2},{23,31,2},{23,31,2},{23,31,2},{23,27,2},{31,12,50},{21,28,1},{21,28,1},{18,26,1},{62,6,50},{18,26,1},{41,0,72},{23,32,2},{24,29,2},{19,29,2},{41,0,72},{62,10,72},{19,29,2}, +{0,27,74},{62,10,72},{0,27,74},{22,0,74},{22,0,74},{22,0,74},{22,0,74},{20,30,1},{20,30,1},{20,30,1},{20,25,1},{18,26,1},{18,26,1},{24,40,146},{24,34,78},{24,31,111},{24,30,84},{22,40,244},{22,33,79},{22,31,4},{22,29,100},{17,33,244},{19,29,75},{25,38,73},{25,33,2},{25,31,11},{25,30,14},{42,0,243},{21,33,75},{22,31,3},{18,29,74},{62,11,243}, +{18,29,74},{24,35,74},{24,35,74},{24,35,74},{24,30,75},{22,35,53},{22,31,3},{22,31,3},{22,27,10},{18,31,50},{20,28,2},{25,33,1},{25,33,1},{25,33,1},{25,29,2},{31,18,50},{23,30,1},{23,30,1},{20,28,1},{62,9,50},{20,28,1},{44,0,72},{25,33,1},{26,31,2},{21,31,2},{44,0,72},{62,13,72},{21,31,2},{0,29,74},{62,13,72},{0,29,74},{24,0,74}, +{24,0,74},{24,0,74},{24,0,74},{22,32,1},{22,32,1},{22,32,1},{22,27,1},{20,28,1},{20,28,1},{26,42,146},{26,36,78},{26,33,114},{26,32,79},{24,42,244},{24,35,79},{24,33,7},{24,31,100},{19,35,244},{21,31,75},{27,40,73},{27,35,2},{28,33,13},{27,32,14},{45,0,243},{23,35,75},{25,32,4},{20,31,74},{62,14,243},{20,31,74},{26,37,74},{26,37,74},{26,37,74}, +{26,32,75},{24,37,53},{24,33,3},{24,33,3},{24,29,10},{20,33,52},{22,30,2},{27,35,1},{27,35,1},{27,35,1},{27,31,2},{34,17,50},{25,32,0},{25,32,0},{22,30,1},{62,12,50},{22,30,1},{47,0,72},{27,35,1},{28,33,4},{25,32,4},{47,0,72},{46,24,72},{25,32,4},{0,31,74},{46,24,72},{0,31,74},{26,0,74},{26,0,74},{26,0,74},{26,0,74},{24,34,1}, +{24,34,1},{24,34,1},{24,29,1},{22,30,1},{22,30,1},{28,44,146},{28,38,78},{28,35,114},{28,34,79},{26,44,244},{26,37,79},{26,35,7},{26,33,109},{21,37,244},{23,33,76},{29,42,73},{29,37,2},{30,35,13},{29,34,14},{47,2,243},{25,37,75},{27,34,4},{21,33,73},{62,17,243},{21,33,73},{28,39,74},{28,39,74},{28,39,74},{28,33,75},{26,39,53},{26,35,3},{26,35,3}, +{26,31,10},{22,35,52},{23,32,6},{29,37,1},{29,37,1},{29,37,1},{29,33,1},{37,17,50},{27,34,0},{27,34,0},{23,32,5},{62,15,50},{23,32,5},{49,1,72},{29,37,1},{30,35,4},{27,34,4},{49,1,72},{46,27,72},{27,34,4},{0,33,72},{46,27,72},{0,33,72},{28,0,74},{28,0,74},{28,0,74},{28,0,74},{26,36,1},{26,36,1},{26,36,1},{26,31,1},{23,32,2}, +{23,32,2},{30,46,146},{30,41,77},{31,37,121},{30,36,81},{29,45,247},{28,39,77},{28,37,9},{28,35,103},{24,39,248},{25,35,76},{31,44,78},{31,40,4},{32,37,11},{31,36,17},{51,0,243},{28,39,73},{28,37,5},{24,35,74},{47,28,243},{24,35,74},{30,42,72},{30,42,72},{30,42,72},{30,36,72},{29,40,54},{29,36,6},{29,36,6},{28,34,9},{24,37,51},{26,34,2},{31,40,4}, +{31,40,4},{31,40,4},{31,35,5},{49,0,50},{29,36,2},{29,36,2},{26,34,1},{62,18,50},{26,34,1},{53,0,72},{31,40,0},{32,37,2},{28,37,1},{53,0,72},{62,22,72},{28,37,1},{0,35,74},{62,22,72},{0,35,74},{30,0,72},{30,0,72},{30,0,72},{30,0,72},{29,36,5},{29,36,5},{29,36,5},{28,33,4},{26,34,1},{26,34,1},{32,48,146},{32,42,79},{32,39,111}, +{32,38,84},{31,47,247},{30,41,77},{30,39,9},{30,37,103},{26,41,248},{27,37,76},{33,46,73},{33,42,3},{33,39,11},{33,38,14},{54,0,243},{30,41,73},{30,39,5},{26,37,74},{47,31,243},{26,37,74},{32,43,75},{32,43,75},{32,43,75},{32,38,75},{31,42,54},{31,38,6},{31,38,6},{30,36,9},{26,39,51},{28,36,2},{33,41,2},{33,41,2},{33,41,2},{33,37,2},{52,0,50}, +{31,38,2},{31,38,2},{28,36,1},{62,21,50},{28,36,1},{56,0,72},{33,42,2},{34,39,2},{30,39,1},{56,0,72},{62,25,72},{30,39,1},{0,37,74},{62,25,72},{0,37,74},{32,0,74},{32,0,74},{32,0,74},{32,0,74},{31,38,5},{31,38,5},{31,38,5},{30,35,4},{28,36,1},{28,36,1},{34,50,146},{34,44,79},{34,41,111},{34,40,84},{32,50,244},{32,43,74},{32,41,4}, +{32,39,100},{28,43,248},{29,39,76},{35,48,73},{35,44,3},{35,41,11},{35,40,14},{57,0,243},{32,43,73},{32,41,3},{28,39,74},{50,32,243},{28,39,74},{34,45,75},{34,45,75},{34,45,75},{34,40,75},{32,46,51},{32,41,3},{32,41,3},{32,37,10},{28,41,51},{30,38,2},{35,43,2},{35,43,2},{35,43,2},{35,39,2},{55,0,50},{33,40,1},{33,40,1},{30,38,1},{62,24,50}, +{30,38,1},{59,0,72},{35,44,2},{36,41,2},{31,41,2},{59,0,72},{62,28,72},{31,41,2},{0,39,74},{62,28,72},{0,39,74},{34,0,74},{34,0,74},{34,0,74},{34,0,74},{32,42,1},{32,42,1},{32,42,1},{32,37,1},{30,38,1},{30,38,1},{36,52,146},{36,46,79},{36,43,111},{36,42,84},{34,52,244},{34,45,74},{34,43,4},{34,41,100},{30,45,248},{31,41,76},{37,50,73}, +{37,46,3},{37,43,11},{37,42,14},{60,0,243},{34,45,73},{34,43,3},{30,41,74},{56,32,243},{30,41,74},{36,47,75},{36,47,75},{36,47,75},{36,42,75},{34,47,53},{34,43,3},{34,43,3},{34,39,10},{30,43,51},{32,40,2},{37,45,2},{37,45,2},{37,45,2},{37,41,2},{58,0,50},{35,42,1},{35,42,1},{32,40,1},{62,27,50},{32,40,1},{62,0,72},{37,46,2},{38,43,2}, +{33,43,2},{62,0,72},{62,31,72},{33,43,2},{0,41,74},{62,31,72},{0,41,74},{36,0,74},{36,0,74},{36,0,74},{36,0,74},{34,44,1},{34,44,1},{34,44,1},{34,39,1},{32,40,1},{32,40,1},{38,54,146},{38,49,77},{39,45,120},{38,45,76},{37,53,247},{36,47,78},{37,45,5},{36,43,100},{31,48,243},{33,43,81},{40,50,78},{39,48,4},{40,45,8},{39,45,20},{63,1,243}, +{36,47,74},{37,45,1},{33,43,80},{63,32,243},{33,43,80},{38,50,72},{38,50,72},{38,50,72},{38,44,72},{37,48,54},{37,45,5},{37,45,5},{36,42,8},{32,45,53},{34,42,1},{40,46,4},{40,46,4},{40,46,4},{40,43,4},{53,16,50},{37,45,1},{37,45,1},{35,42,0},{63,30,50},{35,42,0},{63,5,72},{39,48,0},{41,45,1},{36,45,0},{63,5,72},{47,42,72},{36,45,0}, +{0,43,80},{47,42,72},{0,43,80},{38,0,72},{38,0,72},{38,0,72},{38,0,72},{37,45,4},{37,45,4},{37,45,4},{37,41,4},{34,42,1},{34,42,1},{40,56,146},{40,51,77},{41,47,120},{40,47,76},{39,55,247},{38,49,77},{39,47,5},{38,45,100},{34,49,248},{35,45,81},{42,52,78},{41,50,4},{42,47,8},{41,47,20},{63,7,243},{38,49,73},{39,47,1},{35,45,80},{63,35,243}, +{35,45,80},{40,52,72},{40,52,72},{40,52,72},{40,46,72},{39,50,54},{39,47,5},{39,47,5},{38,44,8},{34,47,53},{36,44,1},{42,48,4},{42,48,4},{42,48,4},{42,45,4},{56,16,50},{39,47,1},{39,47,1},{37,44,0},{62,33,50},{37,44,0},{63,11,72},{41,50,0},{43,47,1},{38,47,0},{63,11,72},{47,45,72},{38,47,0},{0,45,80},{47,45,72},{0,45,80},{40,0,72}, +{40,0,72},{40,0,72},{40,0,72},{39,47,4},{39,47,4},{39,47,4},{39,43,4},{36,44,1},{36,44,1},{42,58,146},{42,53,77},{43,49,121},{42,48,81},{41,57,247},{40,51,77},{40,49,9},{40,47,100},{36,51,248},{37,47,81},{44,54,78},{43,52,4},{44,49,6},{43,48,17},{63,13,243},{40,51,73},{40,49,5},{37,47,80},{63,38,243},{37,47,80},{42,54,72},{42,54,72},{42,54,72}, +{42,48,72},{41,52,54},{41,48,6},{41,48,6},{40,46,8},{36,49,51},{38,46,1},{44,50,4},{44,50,4},{44,50,4},{44,47,4},{59,16,50},{41,48,2},{41,48,2},{39,46,0},{62,36,50},{39,46,0},{55,32,72},{43,52,0},{44,49,2},{40,49,1},{55,32,72},{46,48,72},{40,49,1},{0,47,80},{46,48,72},{0,47,80},{42,0,72},{42,0,72},{42,0,72},{42,0,72},{41,48,5}, +{41,48,5},{41,48,5},{41,45,4},{38,46,1},{38,46,1},{44,60,146},{44,55,77},{45,51,121},{44,50,81},{43,59,247},{42,53,77},{42,51,9},{42,49,103},{38,53,248},{39,49,76},{46,56,78},{45,54,4},{46,51,6},{45,50,17},{63,19,243},{42,53,73},{42,51,5},{38,49,74},{63,41,243},{38,49,74},{44,56,72},{44,56,72},{44,56,72},{44,50,72},{43,54,54},{43,50,6},{43,50,6}, +{42,48,9},{38,51,51},{40,48,2},{46,52,4},{46,52,4},{46,52,4},{46,49,4},{62,16,50},{43,50,2},{43,50,2},{40,48,1},{62,39,50},{40,48,1},{58,32,72},{45,54,0},{46,51,2},{42,51,1},{58,32,72},{52,48,72},{42,51,1},{0,49,74},{52,48,72},{0,49,74},{44,0,72},{44,0,72},{44,0,72},{44,0,72},{43,50,5},{43,50,5},{43,50,5},{43,47,4},{40,48,1}, +{40,48,1},{46,63,146},{46,57,79},{47,53,115},{46,53,78},{45,61,245},{45,55,77},{45,53,2},{44,51,105},{39,56,243},{42,51,82},{48,59,76},{48,55,9},{48,53,8},{47,53,18},{59,33,243},{44,55,74},{45,53,1},{41,51,80},{55,48,243},{41,51,80},{46,59,74},{46,59,74},{46,59,74},{46,52,75},{45,57,51},{45,53,2},{45,53,2},{44,50,10},{41,53,51},{42,50,1},{48,54,4}, +{48,54,4},{48,54,4},{48,51,4},{63,21,50},{45,53,1},{45,53,1},{43,50,0},{63,42,50},{43,50,0},{63,29,72},{47,56,2},{49,53,1},{44,53,1},{63,29,72},{63,46,72},{44,53,1},{0,51,80},{63,46,72},{0,51,80},{46,0,74},{46,0,74},{46,0,74},{46,0,74},{45,53,1},{45,53,1},{45,53,1},{45,49,1},{42,50,1},{42,50,1},{48,63,152},{48,59,77},{49,55,120}, +{48,55,76},{47,63,245},{47,57,77},{47,55,2},{46,53,105},{41,58,243},{44,53,82},{50,61,76},{49,58,4},{50,55,8},{49,55,20},{62,33,243},{46,57,74},{47,55,1},{43,53,80},{61,48,243},{43,53,80},{48,60,72},{48,60,72},{48,60,72},{48,54,72},{47,59,51},{47,55,2},{47,55,2},{46,52,10},{43,55,51},{44,52,1},{50,56,4},{50,56,4},{50,56,4},{50,53,4},{63,27,50}, +{47,55,1},{47,55,1},{45,52,0},{63,45,50},{45,52,0},{63,35,72},{49,58,0},{51,55,1},{46,55,1},{63,35,72},{63,49,72},{46,55,1},{0,53,80},{63,49,72},{0,53,80},{48,0,72},{48,0,72},{48,0,72},{48,0,72},{47,55,1},{47,55,1},{47,55,1},{47,51,1},{44,52,1},{44,52,1},{51,63,184},{50,61,77},{51,57,120},{50,57,76},{49,63,268},{48,59,78},{49,57,5}, +{48,55,100},{43,60,243},{46,55,82},{52,63,76},{51,60,4},{52,57,8},{51,57,20},{63,37,243},{48,59,74},{49,57,1},{45,55,80},{63,50,243},{45,55,80},{50,62,72},{50,62,72},{50,62,72},{50,56,72},{49,60,56},{49,57,5},{49,57,5},{48,54,8},{45,57,51},{46,54,1},{52,58,4},{52,58,4},{52,58,4},{52,55,4},{63,33,50},{49,57,1},{49,57,1},{47,54,0},{47,56,50}, +{47,54,0},{63,41,72},{51,60,0},{53,57,1},{48,57,0},{63,41,72},{63,52,72},{48,57,0},{0,55,80},{63,52,72},{0,55,80},{50,0,72},{50,0,72},{50,0,72},{50,0,72},{49,57,4},{49,57,4},{49,57,4},{49,53,4},{46,54,1},{46,54,1},{53,63,226},{52,63,77},{53,59,120},{52,59,76},{52,63,300},{50,61,78},{51,59,5},{50,57,100},{45,62,243},{47,57,84},{54,63,84}, +{53,62,4},{54,59,8},{53,59,20},{63,43,243},{49,62,73},{51,59,1},{47,57,80},{63,53,243},{47,57,80},{52,63,76},{52,63,76},{52,63,76},{52,58,72},{51,62,56},{51,59,5},{51,59,5},{50,56,8},{47,59,51},{48,56,1},{54,60,4},{54,60,4},{54,60,4},{54,57,4},{63,39,50},{51,59,1},{51,59,1},{49,56,0},{47,59,50},{49,56,0},{63,47,72},{53,62,0},{55,59,1}, +{50,59,0},{63,47,72},{63,55,72},{50,59,0},{0,57,80},{63,55,72},{0,57,80},{52,0,72},{52,0,72},{52,0,72},{52,0,72},{51,59,4},{51,59,4},{51,59,4},{51,55,4},{48,56,1},{48,56,1},{56,63,314},{55,63,115},{55,62,115},{54,61,76},{54,63,364},{53,63,79},{53,61,3},{52,59,108},{48,63,252},{49,60,79},{57,63,115},{56,63,10},{56,61,11},{56,61,18},{63,50,243}, +{53,63,78},{53,61,2},{47,60,75},{62,57,243},{47,60,75},{54,63,99},{54,63,99},{54,63,99},{54,60,75},{53,63,69},{53,61,2},{53,61,2},{53,58,6},{49,61,51},{50,58,6},{56,63,1},{56,63,1},{56,63,1},{56,59,2},{61,49,50},{53,61,1},{53,61,1},{51,58,2},{63,54,50},{51,58,2},{63,53,74},{56,63,9},{57,61,1},{53,61,1},{63,53,74},{63,58,74},{53,61,1}, +{0,60,74},{63,58,74},{0,60,74},{54,0,74},{54,0,74},{54,0,74},{54,0,74},{53,61,2},{53,61,2},{53,61,2},{53,57,2},{50,59,2},{50,59,2},{57,63,371},{57,63,179},{57,63,115},{56,63,75},{57,63,387},{55,63,123},{55,63,2},{54,61,91},{52,63,286},{51,62,70},{59,63,146},{58,63,59},{58,63,10},{58,63,17},{63,55,221},{57,63,98},{55,63,1},{49,62,66},{63,59,221}, +{49,62,66},{57,63,115},{57,63,115},{57,63,115},{56,62,75},{56,63,93},{55,63,2},{55,63,2},{55,60,6},{51,63,51},{52,60,6},{58,63,10},{58,63,10},{58,63,10},{58,61,2},{63,51,50},{55,63,1},{55,63,1},{53,60,2},{63,57,50},{53,60,2},{63,59,61},{60,63,25},{59,63,0},{55,63,0},{63,59,61},{63,61,61},{55,63,0},{0,62,65},{63,61,61},{0,62,65},{56,0,74}, +{56,0,74},{56,0,74},{56,0,74},{55,63,2},{55,63,2},{55,63,2},{55,59,2},{52,61,2},{52,61,2},{60,63,259},{59,63,190},{59,63,154},{58,63,90},{59,63,270},{58,63,91},{57,63,35},{57,62,22},{56,63,194},{54,63,11},{61,63,70},{60,63,42},{60,63,26},{60,63,2},{63,59,94},{60,63,42},{59,63,13},{53,63,10},{63,61,94},{53,63,10},{59,63,154},{59,63,154},{59,63,154}, +{58,63,90},{58,63,147},{57,63,35},{57,63,35},{57,62,6},{55,63,77},{54,62,6},{60,63,26},{60,63,26},{60,63,26},{60,63,2},{63,57,50},{59,63,13},{59,63,13},{55,62,2},{63,60,50},{55,62,2},{63,62,5},{62,63,4},{62,63,0},{61,63,0},{63,62,5},{62,63,5},{61,63,0},{0,63,9},{62,63,5},{0,63,9},{58,0,74},{58,0,74},{58,0,74},{58,0,74},{57,63,10}, +{57,63,10},{57,63,10},{57,61,2},{54,63,2},{54,63,2},{61,63,162},{61,63,135},{61,63,126},{60,63,90},{61,63,154},{60,63,66},{60,63,50},{59,63,2},{59,63,109},{57,63,10},{62,63,19},{62,63,14},{62,63,10},{62,63,5},{63,62,17},{62,63,12},{62,63,8},{59,63,1},{62,63,17},{59,63,1},{61,63,126},{61,63,126},{61,63,126},{60,63,90},{60,63,98},{60,63,50},{60,63,50}, +{59,63,2},{58,63,62},{57,63,10},{62,63,10},{62,63,10},{62,63,10},{62,63,5},{63,61,13},{62,63,8},{62,63,8},{59,63,1},{63,62,13},{59,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{60,0,74},{60,0,74},{60,0,74},{60,0,74},{60,63,34},{60,63,34},{60,63,34},{59,63,2},{57,63,10}, +{57,63,10},{0,14,202},{0,10,25},{0,7,1},{0,6,74},{0,10,441},{0,6,282},{0,5,133},{0,4,318},{0,5,477},{0,4,343},{0,14,202},{0,10,25},{0,7,1},{0,6,74},{5,0,441},{0,6,282},{0,5,133},{0,4,318},{10,0,441},{0,4,318},{0,7,0},{0,7,0},{0,7,0},{0,3,1},{0,3,41},{0,3,17},{0,3,17},{0,2,26},{0,2,45},{0,1,30},{0,7,0}, +{0,7,0},{0,7,0},{0,3,1},{2,0,41},{0,3,17},{0,3,17},{0,2,26},{3,0,41},{0,2,26},{7,0,202},{0,10,25},{0,7,1},{0,6,74},{7,0,202},{14,0,202},{0,6,74},{0,5,202},{14,0,202},{0,5,202},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,20,200},{0,14,1},{0,10,25}, +{0,8,41},{0,14,686},{0,9,362},{0,8,141},{0,5,467},{0,6,762},{0,5,503},{0,20,200},{0,14,1},{0,10,25},{0,8,41},{7,0,686},{0,9,362},{0,8,141},{0,5,467},{14,0,686},{0,5,467},{0,13,0},{0,13,0},{0,13,0},{0,6,1},{0,6,145},{0,5,52},{0,5,52},{0,3,89},{0,3,161},{0,3,105},{0,13,0},{0,13,0},{0,13,0},{0,6,1},{3,0,145}, +{0,5,52},{0,5,52},{0,3,89},{6,0,145},{0,3,89},{2,16,200},{0,14,1},{2,9,1},{0,8,41},{2,16,200},{20,0,200},{0,8,41},{0,7,202},{20,0,200},{0,7,202},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,24,225},{1,16,27},{1,12,83},{1,11,51},{0,19,724},{0,12,299},{0,10,62}, +{0,8,414},{0,9,875},{0,7,500},{2,22,201},{2,16,6},{2,12,26},{1,11,35},{10,0,723},{0,12,299},{0,10,62},{0,8,414},{14,3,723},{0,8,414},{1,17,25},{1,17,25},{1,17,25},{1,9,25},{0,12,162},{0,8,25},{0,8,25},{0,5,61},{0,5,216},{0,5,97},{2,15,1},{2,15,1},{2,15,1},{2,8,2},{6,0,162},{0,8,25},{0,8,25},{0,5,61},{12,0,162}, +{0,5,61},{5,16,200},{1,16,2},{4,11,1},{0,11,17},{5,16,200},{26,0,200},{0,11,17},{0,9,202},{26,0,200},{0,9,202},{1,0,25},{1,0,25},{1,0,25},{1,0,25},{0,5,1},{0,5,1},{0,5,1},{0,3,1},{0,2,8},{0,2,8},{2,28,313},{2,19,118},{2,14,203},{2,13,130},{0,25,724},{0,16,236},{0,13,6},{0,10,339},{0,11,984},{0,10,508},{4,24,201}, +{4,17,5},{4,14,26},{3,13,35},{13,0,723},{0,16,236},{0,13,6},{0,10,339},{14,6,723},{0,10,339},{2,21,113},{2,21,113},{2,21,113},{2,11,114},{0,18,162},{0,12,2},{0,12,2},{0,7,34},{0,8,280},{0,7,115},{4,17,1},{4,17,1},{4,17,1},{4,10,2},{9,0,162},{0,12,2},{0,12,2},{0,7,34},{18,0,162},{0,7,34},{16,0,200},{3,18,2},{6,13,1}, +{0,13,2},{16,0,200},{32,0,200},{0,13,2},{0,11,202},{32,0,200},{0,11,202},{2,0,113},{2,0,113},{2,0,113},{2,0,113},{0,11,1},{0,11,1},{0,11,1},{0,6,1},{0,5,40},{0,5,40},{4,31,408},{4,22,216},{4,16,317},{3,15,216},{1,30,723},{1,19,216},{1,15,9},{0,12,312},{0,15,1000},{0,12,440},{6,27,200},{6,20,1},{7,16,29},{5,15,36},{16,0,723}, +{0,19,203},{2,15,5},{0,12,296},{32,0,723},{0,12,296},{4,23,209},{4,23,209},{4,23,209},{4,14,208},{1,23,162},{1,16,4},{1,16,4},{1,10,20},{0,11,294},{0,10,89},{6,19,1},{6,19,1},{6,19,1},{6,13,0},{12,1,162},{2,15,1},{2,15,1},{0,10,8},{25,0,162},{0,10,8},{19,1,200},{6,20,1},{8,15,5},{2,15,4},{19,1,200},{39,0,200},{2,15,4}, +{0,13,200},{39,0,200},{0,13,200},{3,0,208},{3,0,208},{3,0,208},{3,0,208},{1,16,0},{1,16,0},{1,16,0},{1,9,1},{0,8,45},{0,8,45},{6,33,408},{6,24,216},{6,18,317},{5,17,213},{3,32,723},{3,21,216},{3,17,2},{2,14,312},{0,18,888},{0,14,293},{8,29,200},{8,22,1},{9,17,26},{8,17,37},{19,0,723},{1,22,200},{3,17,2},{0,14,257},{38,0,723}, +{0,14,257},{6,25,209},{6,25,209},{6,25,209},{5,16,208},{3,25,162},{3,17,1},{3,17,1},{3,12,20},{0,15,228},{0,12,20},{8,21,1},{8,21,1},{8,21,1},{8,15,0},{15,1,162},{3,17,1},{3,17,1},{0,12,4},{31,0,162},{0,12,4},{22,1,200},{8,22,1},{10,17,2},{3,17,1},{22,1,200},{45,0,200},{3,17,1},{0,15,200},{45,0,200},{0,15,200},{5,0,208}, +{5,0,208},{5,0,208},{5,0,208},{3,18,0},{3,18,0},{3,18,0},{3,11,1},{0,11,13},{0,11,13},{8,35,408},{8,26,216},{8,20,317},{7,19,213},{5,34,723},{5,23,216},{5,19,2},{4,16,298},{0,22,804},{0,16,228},{10,31,200},{10,24,1},{11,19,26},{10,19,37},{22,0,723},{3,24,200},{5,19,2},{0,16,227},{44,0,723},{0,16,227},{8,27,209},{8,27,209},{8,27,209}, +{7,18,208},{5,27,162},{5,19,1},{5,19,1},{5,14,20},{0,18,180},{0,15,4},{10,23,1},{10,23,1},{10,23,1},{10,17,1},{15,7,162},{5,19,1},{5,19,1},{2,14,4},{31,3,162},{2,14,4},{25,1,200},{10,24,1},{12,19,2},{5,19,1},{25,1,200},{47,2,200},{5,19,1},{0,17,202},{47,2,200},{0,17,202},{7,0,208},{7,0,208},{7,0,208},{7,0,208},{5,20,0}, +{5,20,0},{5,20,0},{5,13,1},{0,15,0},{0,15,0},{10,37,408},{10,28,216},{10,22,317},{9,21,213},{7,36,723},{7,25,216},{7,21,2},{6,18,298},{0,25,748},{1,19,218},{12,33,200},{12,26,1},{13,21,26},{12,21,37},{25,0,723},{5,26,200},{7,21,2},{0,19,211},{50,0,723},{0,19,211},{10,29,209},{10,29,209},{10,29,209},{9,20,208},{7,29,162},{7,21,1},{7,21,1}, +{7,16,17},{0,21,164},{3,16,3},{12,25,1},{12,25,1},{12,25,1},{12,19,1},{15,13,162},{7,21,1},{7,21,1},{4,16,1},{31,6,162},{4,16,1},{28,1,200},{12,26,1},{14,21,2},{7,21,1},{28,1,200},{47,5,200},{7,21,1},{0,19,202},{47,5,200},{0,19,202},{9,0,208},{9,0,208},{9,0,208},{9,0,208},{7,22,0},{7,22,0},{7,22,0},{7,15,1},{2,17,0}, +{2,17,0},{12,39,404},{12,30,212},{13,24,318},{12,23,215},{9,39,724},{9,27,212},{9,24,7},{8,20,306},{0,28,724},{3,21,210},{14,35,203},{14,28,2},{15,24,22},{14,23,30},{28,1,723},{7,28,203},{10,23,4},{0,21,201},{47,5,723},{0,21,201},{12,32,202},{12,32,202},{12,32,202},{12,22,202},{9,31,165},{9,24,3},{9,24,3},{9,18,14},{2,24,164},{4,19,6},{14,28,1}, +{14,28,1},{14,28,1},{14,21,1},{24,1,162},{10,23,0},{10,23,0},{6,18,5},{49,0,162},{6,18,5},{23,17,200},{14,28,1},{16,24,4},{10,23,4},{23,17,200},{63,0,200},{10,23,4},{0,21,200},{63,0,200},{0,21,200},{12,0,202},{12,0,202},{12,0,202},{12,0,202},{9,25,1},{9,25,1},{9,25,1},{9,17,2},{4,19,2},{4,19,2},{14,41,404},{14,32,215},{15,26,318}, +{14,25,215},{11,41,724},{11,29,212},{11,26,7},{10,22,306},{2,30,724},{5,23,210},{16,37,200},{16,30,1},{17,26,24},{16,25,40},{31,1,723},{9,30,203},{12,25,4},{2,23,201},{47,8,723},{2,23,201},{14,34,202},{14,34,202},{14,34,202},{14,24,202},{11,33,163},{11,26,3},{11,26,3},{11,20,14},{4,26,164},{6,21,6},{16,30,0},{16,30,0},{16,30,0},{16,23,0},{27,1,162}, +{12,25,0},{12,25,0},{8,20,5},{55,0,162},{8,20,5},{34,1,200},{16,30,1},{18,26,4},{12,25,4},{34,1,200},{63,3,200},{12,25,4},{0,23,200},{63,3,200},{0,23,200},{14,0,202},{14,0,202},{14,0,202},{14,0,202},{11,27,1},{11,27,1},{11,27,1},{11,19,2},{6,21,2},{6,21,2},{16,43,408},{16,34,216},{16,28,312},{16,27,221},{13,43,724},{13,31,212},{13,28,7}, +{12,24,306},{4,32,724},{7,25,210},{18,39,200},{18,32,1},{19,28,24},{17,27,36},{34,0,723},{11,32,201},{14,27,4},{4,25,201},{47,11,723},{4,25,201},{16,35,209},{16,35,209},{16,35,209},{16,26,208},{13,35,163},{13,28,3},{13,28,3},{13,22,14},{6,28,164},{8,23,6},{18,31,1},{18,31,1},{18,31,1},{18,25,0},{30,1,162},{14,27,0},{14,27,0},{10,22,5},{61,0,162}, +{10,22,5},{37,1,200},{18,32,1},{20,28,4},{14,27,4},{37,1,200},{63,6,200},{14,27,4},{0,25,200},{63,6,200},{0,25,200},{16,0,208},{16,0,208},{16,0,208},{16,0,208},{13,29,1},{13,29,1},{13,29,1},{13,21,2},{8,23,2},{8,23,2},{18,45,408},{18,36,216},{18,30,312},{17,29,216},{15,45,724},{15,33,210},{15,30,7},{14,26,306},{6,34,724},{9,27,210},{20,41,200}, +{20,34,1},{21,30,24},{19,29,36},{37,0,723},{13,34,201},{16,29,5},{6,27,201},{47,14,723},{6,27,201},{18,37,209},{18,37,209},{18,37,209},{18,28,208},{15,37,163},{15,30,3},{15,30,3},{15,24,14},{8,30,164},{10,25,6},{20,33,1},{20,33,1},{20,33,1},{20,27,0},{33,1,162},{16,29,1},{16,29,1},{12,24,5},{63,2,162},{12,24,5},{40,1,200},{20,34,1},{22,30,4}, +{16,29,4},{40,1,200},{63,9,200},{16,29,4},{0,27,200},{63,9,200},{0,27,200},{17,0,208},{17,0,208},{17,0,208},{17,0,208},{15,31,1},{15,31,1},{15,31,1},{15,23,2},{10,25,2},{10,25,2},{20,47,404},{20,38,212},{21,32,318},{20,31,215},{17,47,724},{17,35,212},{17,32,7},{16,29,308},{8,36,724},{11,29,210},{22,44,201},{22,36,2},{23,32,22},{22,31,35},{40,1,723}, +{15,36,206},{17,32,6},{9,29,202},{63,9,723},{9,29,202},{20,40,202},{20,40,202},{20,40,202},{20,30,203},{17,39,165},{17,32,3},{17,32,3},{17,26,19},{10,32,164},{13,27,2},{22,36,1},{22,36,1},{22,36,1},{22,29,2},{31,12,162},{18,31,1},{18,31,1},{13,27,1},{62,6,162},{13,27,1},{44,0,200},{22,36,1},{24,32,4},{16,32,4},{44,0,200},{62,13,200},{16,32,4}, +{0,29,202},{62,13,200},{0,29,202},{20,0,202},{20,0,202},{20,0,202},{20,0,202},{17,33,1},{17,33,1},{17,33,1},{17,25,1},{13,27,1},{13,27,1},{22,49,404},{22,40,212},{23,34,318},{22,33,215},{19,49,724},{19,37,212},{19,34,7},{18,31,308},{10,38,724},{13,31,210},{24,46,201},{24,38,2},{25,34,22},{24,33,30},{43,1,723},{17,38,203},{20,33,4},{11,31,202},{63,12,723}, +{11,31,202},{22,42,202},{22,42,202},{22,42,202},{22,32,202},{19,41,165},{19,34,3},{19,34,3},{19,28,19},{12,34,164},{15,29,2},{24,38,1},{24,38,1},{24,38,1},{24,31,2},{31,18,162},{20,33,0},{20,33,0},{15,29,1},{62,9,162},{15,29,1},{47,0,200},{24,38,1},{26,34,4},{20,33,4},{47,0,200},{46,24,200},{20,33,4},{0,31,202},{46,24,200},{0,31,202},{22,0,202}, +{22,0,202},{22,0,202},{22,0,202},{19,35,1},{19,35,1},{19,35,1},{19,27,1},{15,29,1},{15,29,1},{24,51,404},{24,42,212},{25,36,318},{24,35,215},{21,51,724},{21,39,212},{21,36,7},{20,32,306},{12,40,724},{15,33,213},{26,47,203},{26,40,2},{27,36,22},{26,35,30},{46,1,723},{19,40,203},{22,35,4},{13,33,200},{63,15,723},{13,33,200},{24,44,202},{24,44,202},{24,44,202}, +{24,34,202},{21,43,165},{21,36,3},{21,36,3},{21,30,19},{14,36,164},{17,31,2},{26,40,1},{26,40,1},{26,40,1},{26,33,1},{34,17,162},{22,35,0},{22,35,0},{17,31,1},{62,12,162},{17,31,1},{49,1,200},{26,40,1},{28,36,4},{22,35,4},{49,1,200},{46,27,200},{22,35,4},{0,33,200},{46,27,200},{0,33,200},{24,0,202},{24,0,202},{24,0,202},{24,0,202},{21,37,1}, +{21,37,1},{21,37,1},{21,29,1},{17,31,1},{17,31,1},{26,53,404},{26,44,212},{27,38,318},{26,37,215},{23,53,724},{23,41,212},{23,38,7},{22,34,306},{14,42,724},{17,35,210},{28,49,203},{28,42,2},{29,38,22},{28,37,30},{47,5,723},{21,42,203},{24,37,4},{15,35,200},{63,18,723},{15,35,200},{26,46,202},{26,46,202},{26,46,202},{26,36,202},{23,45,165},{23,38,3},{23,38,3}, +{23,32,14},{16,38,164},{18,33,6},{28,42,1},{28,42,1},{28,42,1},{28,35,1},{37,17,162},{24,37,0},{24,37,0},{20,32,5},{62,15,162},{20,32,5},{52,1,200},{28,42,1},{30,38,4},{24,37,4},{52,1,200},{46,30,200},{24,37,4},{0,35,200},{46,30,200},{0,35,200},{26,0,202},{26,0,202},{26,0,202},{26,0,202},{23,39,1},{23,39,1},{23,39,1},{23,31,1},{18,33,2}, +{18,33,2},{28,56,400},{28,46,216},{29,40,314},{28,39,213},{26,53,728},{25,44,215},{25,40,9},{25,37,306},{17,44,728},{19,37,210},{31,50,204},{30,45,4},{31,40,21},{30,39,29},{52,1,723},{24,44,201},{25,40,5},{17,37,202},{46,30,723},{17,37,202},{28,49,200},{28,49,200},{28,49,200},{28,38,201},{26,46,166},{26,39,6},{26,39,6},{25,34,17},{18,40,163},{21,35,2},{31,43,4}, +{31,43,4},{31,43,4},{31,37,4},{49,0,162},{26,39,2},{26,39,2},{21,35,1},{62,18,162},{21,35,1},{56,0,200},{30,45,0},{32,40,2},{25,40,1},{56,0,200},{62,25,200},{25,40,1},{0,37,202},{62,25,200},{0,37,202},{28,0,200},{28,0,200},{28,0,200},{28,0,200},{26,39,5},{26,39,5},{26,39,5},{25,33,4},{21,35,1},{21,35,1},{30,58,400},{30,48,217},{31,42,314}, +{30,41,213},{28,55,728},{27,46,215},{27,42,9},{27,39,306},{19,46,728},{21,39,210},{32,54,201},{32,47,3},{33,42,19},{32,41,35},{55,1,723},{26,46,201},{27,42,5},{19,39,202},{47,32,723},{19,39,202},{30,51,200},{30,51,200},{30,51,200},{30,40,201},{28,48,166},{28,41,6},{28,41,6},{27,36,17},{20,42,163},{23,37,2},{32,46,2},{32,46,2},{32,46,2},{32,39,2},{52,0,162}, +{28,41,2},{28,41,2},{23,37,1},{62,21,162},{23,37,1},{59,0,200},{32,47,2},{34,42,2},{27,42,1},{59,0,200},{62,28,200},{27,42,1},{0,39,202},{62,28,200},{0,39,202},{30,0,200},{30,0,200},{30,0,200},{30,0,200},{28,41,5},{28,41,5},{28,41,5},{27,35,4},{23,37,1},{23,37,1},{32,60,402},{32,50,212},{32,44,324},{32,43,215},{30,57,728},{29,47,216},{29,44,9}, +{29,41,306},{20,48,724},{23,41,210},{34,56,201},{34,48,2},{35,44,19},{34,43,35},{58,1,723},{28,48,201},{29,44,5},{21,41,202},{53,32,723},{21,41,202},{32,52,202},{32,52,202},{32,52,202},{32,42,203},{30,50,166},{30,43,6},{30,43,6},{29,38,17},{22,44,163},{25,39,2},{34,48,1},{34,48,1},{34,48,1},{34,41,2},{55,0,162},{30,43,2},{30,43,2},{25,39,1},{62,24,162}, +{25,39,1},{62,0,200},{34,48,1},{36,44,2},{29,44,1},{62,0,200},{62,31,200},{29,44,1},{0,41,202},{62,31,200},{0,41,202},{32,0,202},{32,0,202},{32,0,202},{32,0,202},{30,43,5},{30,43,5},{30,43,5},{29,37,4},{25,39,1},{25,39,1},{34,62,402},{34,52,212},{34,46,324},{34,45,215},{31,61,728},{31,49,210},{31,46,9},{31,43,306},{22,50,724},{25,43,210},{36,58,201}, +{36,50,2},{37,46,19},{36,45,35},{61,1,723},{30,50,201},{31,46,5},{23,43,202},{59,32,723},{23,43,202},{34,54,202},{34,54,202},{34,54,202},{34,44,203},{31,54,166},{31,46,8},{31,46,8},{31,40,17},{24,46,163},{27,41,2},{36,50,1},{36,50,1},{36,50,1},{36,43,2},{58,0,162},{32,45,1},{32,45,1},{27,41,1},{62,27,162},{27,41,1},{63,4,200},{36,50,1},{38,46,2}, +{31,46,1},{63,4,200},{62,34,200},{31,46,1},{0,43,202},{62,34,200},{0,43,202},{34,0,202},{34,0,202},{34,0,202},{34,0,202},{31,47,5},{31,47,5},{31,47,5},{31,39,4},{27,41,1},{27,41,1},{36,63,408},{36,54,216},{37,48,314},{36,47,217},{34,62,727},{33,52,215},{33,48,9},{32,45,308},{24,53,723},{28,45,217},{39,58,206},{38,53,4},{39,48,21},{38,47,36},{63,4,723}, +{32,52,201},{33,48,5},{26,45,208},{62,34,723},{26,45,208},{36,57,200},{36,57,200},{36,57,200},{36,47,201},{34,54,166},{33,48,8},{33,48,8},{33,43,20},{26,48,163},{29,43,1},{39,51,4},{39,51,4},{39,51,4},{39,45,4},{53,16,162},{35,47,4},{35,47,4},{30,43,0},{63,30,162},{30,43,0},{63,11,200},{38,53,0},{40,48,2},{33,48,1},{63,11,200},{47,45,200},{33,48,1}, +{0,45,208},{47,45,200},{0,45,208},{36,0,200},{36,0,200},{36,0,200},{36,0,200},{34,47,5},{34,47,5},{34,47,5},{34,41,4},{29,43,1},{29,43,1},{39,63,440},{38,56,216},{39,50,314},{38,49,213},{36,63,728},{35,54,215},{35,50,9},{34,47,308},{26,55,723},{30,47,217},{41,60,206},{40,55,4},{41,50,21},{40,49,29},{63,10,723},{34,54,201},{35,50,5},{28,47,208},{62,37,723}, +{28,47,208},{38,59,200},{38,59,200},{38,59,200},{38,48,201},{36,56,166},{36,49,6},{36,49,6},{35,45,20},{28,50,163},{31,45,1},{41,53,4},{41,53,4},{41,53,4},{41,47,4},{56,16,162},{36,49,2},{36,49,2},{32,45,0},{62,33,162},{32,45,0},{55,32,200},{40,55,0},{42,50,2},{35,50,1},{55,32,200},{46,48,200},{35,50,1},{0,47,208},{46,48,200},{0,47,208},{38,0,200}, +{38,0,200},{38,0,200},{38,0,200},{36,49,5},{36,49,5},{36,49,5},{36,43,4},{31,45,1},{31,45,1},{41,63,482},{40,58,216},{41,52,314},{40,51,213},{39,63,760},{37,56,215},{37,52,9},{37,49,306},{28,57,723},{31,49,215},{43,62,206},{42,57,4},{43,52,21},{42,51,29},{63,16,723},{36,56,201},{37,52,5},{29,49,203},{62,40,723},{29,49,203},{40,61,200},{40,61,200},{40,61,200}, +{40,50,201},{38,58,166},{38,51,6},{38,51,6},{37,47,20},{30,52,163},{33,47,1},{43,55,4},{43,55,4},{43,55,4},{43,49,4},{59,16,162},{38,51,2},{38,51,2},{34,47,0},{62,36,162},{34,47,0},{58,32,200},{42,57,0},{44,52,2},{37,52,1},{58,32,200},{52,48,200},{37,52,1},{0,49,202},{52,48,200},{0,49,202},{40,0,200},{40,0,200},{40,0,200},{40,0,200},{38,51,5}, +{38,51,5},{38,51,5},{38,45,4},{33,47,1},{33,47,1},{43,63,530},{42,60,216},{43,54,314},{42,53,213},{41,63,799},{39,58,215},{39,54,9},{39,51,306},{30,59,723},{33,51,210},{45,63,212},{44,59,4},{45,54,21},{44,53,29},{63,22,723},{38,58,201},{39,54,5},{31,51,203},{62,43,723},{31,51,203},{42,63,200},{42,63,200},{42,63,200},{42,52,201},{40,60,166},{40,53,6},{40,53,6}, +{39,48,17},{32,54,163},{35,49,2},{45,57,4},{45,57,4},{45,57,4},{45,51,4},{62,16,162},{40,53,2},{40,53,2},{35,49,1},{62,39,162},{35,49,1},{61,32,200},{44,59,0},{46,54,2},{39,54,1},{61,32,200},{58,48,200},{39,54,1},{0,51,202},{58,48,200},{0,51,202},{42,0,200},{42,0,200},{42,0,200},{42,0,200},{40,53,5},{40,53,5},{40,53,5},{40,47,4},{35,49,1}, +{35,49,1},{46,63,626},{44,63,222},{45,57,315},{44,56,211},{44,63,869},{41,60,213},{42,56,2},{41,53,298},{32,61,723},{36,53,217},{48,63,244},{47,60,5},{47,56,26},{46,55,34},{61,32,723},{40,60,202},{42,56,1},{34,53,208},{58,48,723},{34,53,208},{44,63,218},{44,63,218},{44,63,218},{44,55,203},{42,63,163},{42,56,2},{42,56,2},{41,51,25},{35,56,163},{37,51,1},{47,60,1}, +{47,60,1},{47,60,1},{47,53,2},{63,21,162},{42,56,1},{42,56,1},{38,51,0},{63,42,162},{38,51,0},{63,35,200},{46,61,2},{49,56,1},{41,56,1},{63,35,200},{63,49,200},{41,56,1},{0,53,208},{63,49,200},{0,53,208},{44,0,202},{44,0,202},{44,0,202},{44,0,202},{42,56,1},{42,56,1},{42,56,1},{42,49,1},{37,51,1},{37,51,1},{48,63,728},{47,63,238},{47,59,315}, +{46,58,211},{46,63,937},{43,62,213},{44,58,2},{43,55,298},{34,63,723},{38,55,217},{50,63,286},{48,63,4},{49,58,20},{48,57,36},{63,34,723},{42,62,202},{44,58,1},{36,55,208},{62,49,723},{36,55,208},{47,63,234},{47,63,234},{47,63,234},{46,57,203},{44,63,181},{44,58,2},{44,58,2},{43,53,25},{37,58,163},{39,53,1},{49,61,4},{49,61,4},{49,61,4},{49,55,4},{63,27,162}, +{44,58,1},{44,58,1},{40,53,0},{63,45,162},{40,53,0},{63,41,200},{48,63,0},{51,58,1},{43,58,1},{63,41,200},{63,52,200},{43,58,1},{0,55,208},{63,52,200},{0,55,208},{46,0,202},{46,0,202},{46,0,202},{46,0,202},{44,58,1},{44,58,1},{44,58,1},{44,51,1},{39,53,1},{39,53,1},{50,63,866},{49,63,317},{49,61,312},{48,60,216},{48,63,1048},{46,63,219},{46,60,2}, +{45,57,298},{38,63,748},{40,57,217},{53,63,350},{51,63,20},{51,60,20},{50,59,36},{63,40,723},{46,63,218},{46,60,1},{38,57,208},{62,52,723},{38,57,208},{48,63,264},{48,63,264},{48,63,264},{48,59,201},{47,63,205},{46,60,2},{46,60,2},{45,55,25},{39,60,163},{41,55,1},{51,63,4},{51,63,4},{51,63,4},{51,57,4},{63,33,162},{46,60,1},{46,60,1},{42,55,0},{47,56,162}, +{42,55,0},{63,47,200},{52,63,13},{53,60,1},{45,60,1},{63,47,200},{63,55,200},{45,60,1},{0,57,208},{63,55,200},{0,57,208},{48,0,200},{48,0,200},{48,0,200},{48,0,200},{46,60,1},{46,60,1},{46,60,1},{46,53,1},{41,55,1},{41,55,1},{53,63,1026},{51,63,440},{51,63,312},{50,62,216},{51,63,1144},{48,63,280},{48,62,5},{47,59,298},{43,63,827},{42,59,217},{55,63,428}, +{54,63,100},{53,62,20},{52,61,36},{63,46,723},{49,63,266},{48,62,1},{40,59,208},{62,55,723},{40,59,208},{51,63,296},{51,63,296},{51,63,296},{50,61,201},{49,63,248},{48,62,5},{48,62,5},{47,57,25},{41,62,163},{43,57,1},{53,63,13},{53,63,13},{53,63,13},{53,59,4},{63,39,162},{48,62,1},{48,62,1},{44,57,0},{47,59,162},{44,57,0},{63,53,200},{55,63,53},{55,62,1}, +{47,62,1},{63,53,200},{63,58,200},{47,62,1},{0,59,208},{63,58,200},{0,59,208},{50,0,200},{50,0,200},{50,0,200},{50,0,200},{48,62,4},{48,62,4},{48,62,4},{48,55,4},{43,57,1},{43,57,1},{54,63,955},{54,63,523},{53,63,362},{52,63,202},{54,63,1027},{51,63,283},{50,63,14},{49,60,198},{47,63,735},{44,61,118},{57,63,338},{56,63,141},{56,63,41},{55,63,17},{63,51,546}, +{53,63,233},{51,63,2},{43,61,113},{63,57,546},{43,61,113},{53,63,362},{53,63,362},{53,63,362},{52,63,202},{51,63,315},{50,63,14},{50,63,14},{49,59,19},{44,63,171},{46,59,3},{56,63,41},{56,63,41},{56,63,41},{55,61,2},{61,49,162},{51,63,2},{51,63,2},{47,59,1},{63,54,162},{47,59,1},{63,57,113},{58,63,50},{57,63,1},{52,63,0},{63,57,113},{63,60,113},{52,63,0}, +{0,61,113},{63,60,113},{0,61,113},{52,0,202},{52,0,202},{52,0,202},{52,0,202},{50,63,5},{50,63,5},{50,63,5},{50,57,2},{45,60,0},{45,60,0},{57,63,779},{56,63,542},{56,63,442},{54,63,227},{56,63,830},{54,63,251},{53,63,78},{51,62,70},{51,63,587},{47,62,25},{59,63,218},{58,63,123},{58,63,74},{57,63,2},{63,55,333},{56,63,145},{55,63,25},{47,62,25},{63,59,333}, +{47,62,25},{56,63,442},{56,63,442},{56,63,442},{54,63,227},{54,63,371},{53,63,78},{53,63,78},{51,61,19},{48,63,219},{47,61,6},{58,63,74},{58,63,74},{58,63,74},{57,63,2},{63,51,162},{55,63,25},{55,63,25},{48,61,2},{63,57,162},{48,61,2},{63,60,25},{61,63,10},{60,63,1},{58,63,0},{63,60,25},{62,62,25},{58,63,0},{0,62,25},{62,62,25},{0,62,25},{54,0,202}, +{54,0,202},{54,0,202},{54,0,202},{52,63,26},{52,63,26},{52,63,26},{52,59,2},{47,62,0},{47,62,0},{59,63,684},{57,63,538},{57,63,474},{57,63,282},{57,63,682},{56,63,285},{55,63,171},{53,63,18},{54,63,482},{49,63,5},{60,63,153},{60,63,105},{60,63,89},{59,63,37},{63,59,193},{58,63,107},{58,63,58},{50,63,1},{63,61,193},{50,63,1},{57,63,474},{57,63,474},{57,63,474}, +{57,63,282},{57,63,426},{55,63,171},{55,63,171},{53,63,18},{52,63,278},{49,63,5},{60,63,89},{60,63,89},{60,63,89},{59,63,37},{63,57,145},{58,63,58},{58,63,58},{50,63,1},{63,60,145},{50,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{56,0,202},{56,0,202},{56,0,202},{56,0,202},{54,63,50}, +{54,63,50},{54,63,50},{54,61,2},{49,63,5},{49,63,5},{60,63,426},{59,63,375},{59,63,339},{58,63,251},{59,63,415},{57,63,202},{57,63,138},{56,63,2},{55,63,295},{53,63,29},{62,63,43},{62,63,38},{62,63,34},{61,63,10},{63,61,54},{61,63,27},{60,63,17},{56,63,1},{63,62,54},{56,63,1},{59,63,339},{59,63,339},{59,63,339},{58,63,251},{59,63,294},{57,63,138},{57,63,138}, +{56,63,2},{55,63,174},{53,63,29},{62,63,34},{62,63,34},{62,63,34},{61,63,10},{63,60,41},{60,63,17},{60,63,17},{56,63,1},{62,62,41},{56,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{58,0,202},{58,0,202},{58,0,202},{58,0,202},{57,63,74},{57,63,74},{57,63,74},{56,63,2},{53,63,29}, +{53,63,29},{0,20,421},{0,14,50},{0,10,4},{0,9,157},{0,14,925},{0,9,589},{0,8,264},{0,6,701},{0,6,1005},{0,5,738},{0,20,421},{0,14,50},{0,10,4},{0,9,157},{7,0,925},{0,9,589},{0,8,264},{0,6,701},{14,0,925},{0,6,701},{0,10,0},{0,10,0},{0,10,0},{0,5,0},{0,5,85},{0,4,34},{0,4,34},{0,2,50},{0,2,93},{0,2,54},{0,10,0}, +{0,10,0},{0,10,0},{0,5,0},{2,1,85},{0,4,34},{0,4,34},{0,2,50},{5,0,85},{0,2,50},{10,1,421},{0,14,50},{0,10,4},{0,9,157},{10,1,421},{20,0,421},{0,9,157},{0,7,421},{20,0,421},{0,7,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,26,421},{0,18,13},{0,13,20}, +{0,11,100},{0,18,1261},{0,11,701},{0,10,294},{0,7,857},{0,8,1382},{0,7,938},{0,26,421},{0,18,13},{0,13,20},{0,11,100},{9,0,1261},{0,11,701},{0,10,294},{0,7,857},{18,0,1261},{0,7,857},{0,16,0},{0,16,0},{0,16,0},{0,8,0},{0,8,221},{0,6,89},{0,6,89},{0,4,125},{0,4,246},{0,4,150},{0,16,0},{0,16,0},{0,16,0},{0,8,0},{4,0,221}, +{0,6,89},{0,6,89},{0,4,125},{8,0,221},{0,4,125},{13,1,421},{0,18,13},{2,12,4},{0,11,100},{13,1,421},{26,0,421},{0,11,100},{0,9,421},{26,0,421},{0,9,421},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,32,430},{0,22,10},{1,15,70},{0,13,70},{0,22,1517},{0,14,730},{0,13,257}, +{0,9,974},{0,11,1713},{0,8,1109},{1,30,422},{1,21,5},{2,15,45},{0,13,70},{11,1,1514},{0,14,730},{0,13,257},{0,9,974},{15,4,1514},{0,9,974},{0,22,9},{0,22,9},{0,22,9},{0,11,9},{0,12,338},{0,9,106},{0,9,106},{0,5,181},{0,5,392},{0,5,217},{1,20,1},{1,20,1},{1,20,1},{1,10,2},{6,0,338},{0,9,106},{0,9,106},{0,5,181},{12,0,338}, +{0,5,181},{16,0,421},{0,22,1},{4,14,4},{0,13,61},{16,0,421},{32,0,421},{0,13,61},{0,11,421},{32,0,421},{0,11,421},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,2,1},{0,2,1},{0,2,1},{0,1,1},{0,1,2},{0,1,2},{1,36,486},{1,24,69},{2,17,163},{1,16,115},{0,28,1517},{0,18,614},{0,15,126},{0,11,857},{0,14,1841},{0,11,1053},{3,32,422}, +{3,23,5},{3,17,46},{2,15,70},{14,1,1514},{0,18,614},{0,15,126},{0,11,857},{15,7,1514},{0,11,857},{1,26,65},{1,26,65},{1,26,65},{1,13,66},{0,18,338},{0,13,45},{0,13,45},{0,8,125},{0,8,456},{0,7,211},{3,22,1},{3,22,1},{3,22,1},{3,12,2},{9,0,338},{0,13,45},{0,13,45},{0,8,125},{18,0,338},{0,8,125},{19,0,421},{2,24,1},{6,16,1}, +{0,16,37},{19,0,421},{38,0,421},{0,16,37},{0,13,421},{38,0,421},{0,13,421},{1,0,65},{1,0,65},{1,0,65},{1,0,65},{0,8,1},{0,8,1},{0,8,1},{0,4,1},{0,3,25},{0,3,25},{3,39,629},{3,27,213},{3,20,365},{2,18,237},{0,35,1514},{0,22,506},{0,18,24},{0,14,750},{0,16,2003},{0,13,1050},{5,35,421},{5,25,2},{6,19,45},{5,17,72},{17,1,1514}, +{0,22,506},{0,18,24},{0,14,750},{35,0,1514},{0,14,750},{3,28,209},{3,28,209},{3,28,209},{2,16,208},{0,25,338},{0,17,9},{0,17,9},{0,10,72},{0,11,566},{0,10,241},{5,24,1},{5,24,1},{5,24,1},{5,15,0},{12,1,338},{0,17,9},{0,17,9},{0,10,72},{25,0,338},{0,10,72},{22,1,421},{4,26,1},{8,18,5},{0,18,8},{22,1,421},{45,0,421},{0,18,8}, +{0,15,421},{45,0,421},{0,15,421},{2,0,208},{2,0,208},{2,0,208},{2,0,208},{0,15,0},{0,15,0},{0,15,0},{0,8,1},{0,6,80},{0,6,80},{4,43,821},{4,30,418},{5,22,621},{3,20,420},{0,41,1514},{0,25,450},{0,20,5},{0,16,670},{0,19,2187},{0,15,1109},{7,37,421},{7,27,2},{8,21,45},{7,19,72},{20,1,1514},{0,25,450},{0,20,5},{0,16,670},{41,0,1514}, +{0,16,670},{4,32,400},{4,32,400},{4,32,400},{4,18,400},{0,31,338},{0,20,1},{0,20,1},{0,13,40},{0,14,694},{0,11,297},{7,26,1},{7,26,1},{7,26,1},{7,17,1},{15,1,338},{0,20,1},{0,20,1},{0,13,40},{31,0,338},{0,13,40},{25,1,421},{6,28,1},{10,20,5},{0,20,4},{25,1,421},{51,0,421},{0,20,4},{0,17,421},{51,0,421},{0,17,421},{3,0,400}, +{3,0,400},{3,0,400},{3,0,400},{0,21,0},{0,21,0},{0,21,0},{0,11,1},{0,8,149},{0,8,149},{5,47,846},{6,32,451},{6,23,662},{5,22,445},{2,43,1515},{1,28,446},{2,22,6},{0,18,638},{0,22,2046},{0,18,878},{9,39,421},{9,29,2},{10,23,45},{9,21,72},{23,1,1514},{0,28,426},{2,22,5},{0,18,589},{47,0,1514},{0,18,589},{5,36,425},{5,36,425},{5,36,425}, +{5,21,426},{2,32,341},{2,22,2},{2,22,2},{1,15,38},{0,16,606},{0,14,158},{9,28,1},{9,28,1},{9,28,1},{9,19,1},{15,7,338},{2,22,1},{2,22,1},{0,15,20},{31,3,338},{0,15,20},{28,1,421},{8,30,1},{12,22,5},{2,22,4},{28,1,421},{57,0,421},{2,22,4},{0,19,421},{57,0,421},{0,19,421},{5,0,425},{5,0,425},{5,0,425},{5,0,425},{2,23,1}, +{2,23,1},{2,23,1},{2,13,2},{0,12,97},{0,12,97},{7,49,846},{8,33,450},{8,25,662},{7,24,445},{4,45,1515},{3,30,446},{4,24,6},{2,20,638},{0,25,1886},{0,19,682},{11,41,421},{11,31,2},{12,25,45},{11,23,72},{26,1,1514},{1,31,421},{4,24,5},{0,20,545},{53,0,1514},{0,20,545},{7,38,425},{7,38,425},{7,38,425},{7,23,426},{4,34,341},{4,24,2},{4,24,2}, +{4,16,42},{0,20,500},{0,16,62},{11,30,1},{11,30,1},{11,30,1},{11,21,1},{15,13,338},{4,24,1},{4,24,1},{0,17,5},{31,6,338},{0,17,5},{31,1,421},{10,32,1},{14,24,5},{4,24,4},{31,1,421},{63,0,421},{4,24,4},{0,21,421},{63,0,421},{0,21,421},{7,0,425},{7,0,425},{7,0,425},{7,0,425},{4,25,1},{4,25,1},{4,25,1},{4,15,2},{0,16,37}, +{0,16,37},{10,49,846},{10,36,445},{11,28,650},{10,26,450},{6,47,1517},{5,32,446},{6,27,3},{4,22,646},{0,29,1751},{0,22,522},{13,44,422},{13,34,3},{14,27,46},{13,26,74},{30,0,1514},{3,33,422},{6,27,3},{0,22,497},{46,7,1514},{0,22,497},{10,39,425},{10,39,425},{10,39,425},{10,24,426},{6,37,338},{6,27,2},{6,27,2},{6,19,40},{0,24,410},{0,19,9},{13,33,1}, +{13,33,1},{13,33,1},{13,23,1},{24,1,338},{7,26,0},{7,26,0},{1,19,5},{49,0,338},{1,19,5},{35,0,421},{12,34,1},{16,27,1},{5,27,1},{35,0,421},{63,3,421},{5,27,1},{0,23,421},{63,3,421},{0,23,421},{10,0,425},{10,0,425},{10,0,425},{10,0,425},{6,28,0},{6,28,0},{6,28,0},{6,17,1},{0,19,5},{0,19,5},{12,51,846},{12,38,445},{13,30,650}, +{12,28,450},{8,49,1517},{7,34,446},{8,29,3},{6,24,646},{0,32,1647},{0,25,458},{15,46,422},{15,36,3},{16,29,42},{15,28,74},{32,1,1514},{5,35,422},{8,29,3},{0,25,457},{46,10,1514},{0,25,457},{12,41,425},{12,41,425},{12,41,425},{12,26,426},{8,39,338},{8,29,2},{8,29,2},{8,21,40},{0,27,362},{1,22,5},{15,35,1},{15,35,1},{15,35,1},{15,25,1},{27,1,338}, +{9,28,0},{9,28,0},{3,21,5},{55,0,338},{3,21,5},{38,0,421},{14,36,1},{18,29,1},{7,29,1},{38,0,421},{63,6,421},{7,29,1},{0,25,421},{63,6,421},{0,25,421},{12,0,425},{12,0,425},{12,0,425},{12,0,425},{8,30,0},{8,30,0},{8,30,0},{8,19,1},{1,22,1},{1,22,1},{14,53,846},{14,40,445},{15,32,661},{14,30,450},{10,51,1517},{9,36,446},{10,31,3}, +{8,26,646},{0,35,1575},{0,27,446},{17,47,421},{17,37,2},{18,31,42},{17,30,73},{35,1,1514},{7,37,422},{10,31,3},{0,27,430},{46,13,1514},{0,27,430},{14,43,425},{14,43,425},{14,43,425},{14,28,426},{10,41,338},{10,31,2},{10,31,2},{10,23,40},{0,31,341},{3,24,5},{17,36,1},{17,36,1},{17,36,1},{17,27,0},{30,1,338},{11,30,0},{11,30,0},{5,23,5},{61,0,338}, +{5,23,5},{41,0,421},{16,38,1},{20,31,1},{9,31,1},{41,0,421},{63,9,421},{9,31,1},{0,27,421},{63,9,421},{0,27,421},{14,0,425},{14,0,425},{14,0,425},{14,0,425},{10,31,1},{10,31,1},{10,31,1},{10,21,1},{3,24,1},{3,24,1},{16,55,854},{16,42,451},{16,33,662},{15,32,446},{12,53,1517},{11,38,446},{12,32,9},{10,28,646},{0,39,1533},{2,29,446},{19,49,421}, +{19,39,2},{20,33,45},{18,31,81},{38,1,1514},{9,39,422},{13,32,6},{0,29,422},{45,16,1514},{0,29,422},{15,47,433},{15,47,433},{15,47,433},{15,31,433},{12,43,338},{12,32,5},{12,32,5},{12,25,40},{1,33,339},{5,26,5},{19,38,1},{19,38,1},{19,38,1},{19,29,0},{33,1,338},{13,32,2},{13,32,2},{7,25,5},{63,2,338},{7,25,5},{44,0,421},{18,40,1},{22,32,5}, +{12,32,5},{44,0,421},{63,12,421},{12,32,5},{0,29,421},{63,12,421},{0,29,421},{15,0,433},{15,0,433},{15,0,433},{15,0,433},{12,33,1},{12,33,1},{12,33,1},{12,23,1},{5,26,1},{5,26,1},{18,58,846},{18,44,445},{19,36,650},{18,34,450},{14,56,1515},{14,40,447},{14,35,7},{13,31,646},{0,42,1515},{5,31,445},{21,52,422},{21,42,2},{22,35,46},{21,34,74},{42,0,1514}, +{12,41,422},{14,35,6},{2,31,425},{62,11,1514},{2,31,425},{18,47,425},{18,47,425},{18,47,425},{18,32,426},{14,46,339},{14,35,6},{14,35,6},{14,27,35},{4,35,341},{8,28,5},{21,41,1},{21,41,1},{21,41,1},{21,31,2},{31,12,338},{15,34,0},{15,34,0},{8,28,1},{62,6,338},{8,28,1},{47,0,421},{21,42,1},{24,35,1},{13,35,1},{47,0,421},{62,16,421},{13,35,1}, +{0,31,425},{62,16,421},{0,31,425},{18,0,425},{18,0,425},{18,0,425},{18,0,425},{14,36,1},{14,36,1},{14,36,1},{14,25,1},{7,29,1},{7,29,1},{20,60,846},{20,46,445},{21,38,650},{20,36,450},{16,58,1514},{16,41,449},{16,37,3},{15,32,630},{2,44,1515},{7,33,441},{23,54,422},{23,44,2},{24,37,46},{23,36,74},{45,0,1514},{14,43,422},{16,37,3},{4,33,421},{62,14,1514}, +{4,33,421},{20,49,425},{20,49,425},{20,49,425},{20,34,426},{16,47,340},{16,37,2},{16,37,2},{16,29,34},{6,37,341},{10,30,5},{23,43,1},{23,43,1},{23,43,1},{23,33,1},{31,18,338},{17,36,0},{17,36,0},{10,30,1},{62,9,338},{10,30,1},{50,0,421},{23,44,1},{26,37,1},{15,37,1},{50,0,421},{62,19,421},{15,37,1},{0,33,421},{62,19,421},{0,33,421},{20,0,425}, +{20,0,425},{20,0,425},{20,0,425},{16,38,0},{16,38,0},{16,38,0},{16,27,0},{9,31,1},{9,31,1},{22,62,846},{22,48,445},{23,40,650},{22,38,450},{18,60,1514},{18,43,449},{18,39,3},{16,34,646},{4,46,1515},{9,35,441},{25,56,422},{25,46,2},{26,39,46},{25,38,74},{47,2,1514},{16,45,425},{18,39,3},{6,35,421},{62,17,1514},{6,35,421},{22,51,425},{22,51,425},{22,51,425}, +{22,36,426},{18,49,338},{18,39,2},{18,39,2},{18,31,34},{8,39,341},{11,32,6},{25,45,1},{25,45,1},{25,45,1},{25,35,1},{34,17,338},{19,38,0},{19,38,0},{12,32,4},{62,12,338},{12,32,4},{53,0,421},{25,46,1},{28,39,1},{17,39,1},{53,0,421},{62,22,421},{17,39,1},{0,35,421},{62,22,421},{0,35,421},{22,0,425},{22,0,425},{22,0,425},{22,0,425},{18,40,0}, +{18,40,0},{18,40,0},{18,29,0},{11,32,2},{11,32,2},{24,63,850},{24,50,445},{25,42,650},{24,40,450},{20,62,1514},{20,45,449},{20,41,3},{18,36,646},{6,48,1517},{11,37,441},{27,58,422},{27,48,3},{28,41,46},{27,40,74},{47,8,1514},{18,47,425},{20,41,3},{8,37,421},{62,20,1514},{8,37,421},{24,53,425},{24,53,425},{24,53,425},{24,38,426},{20,51,338},{20,41,2},{20,41,2}, +{20,33,40},{10,41,341},{13,34,6},{27,47,1},{27,47,1},{27,47,1},{27,37,1},{37,17,338},{21,40,0},{21,40,0},{14,34,4},{62,15,338},{14,34,4},{56,0,421},{26,48,1},{30,41,1},{19,41,1},{56,0,421},{62,25,421},{19,41,1},{0,37,421},{62,25,421},{0,37,421},{24,0,425},{24,0,425},{24,0,425},{24,0,425},{20,42,0},{20,42,0},{20,42,0},{20,31,0},{13,34,2}, +{13,34,2},{26,63,882},{26,52,447},{27,44,646},{26,42,446},{23,62,1526},{22,48,447},{22,43,5},{21,39,646},{8,50,1515},{13,39,443},{30,58,425},{29,50,4},{30,44,45},{29,42,69},{54,0,1514},{20,49,422},{22,43,4},{10,39,426},{47,31,1514},{10,39,426},{26,56,421},{26,56,421},{26,56,421},{26,41,421},{22,54,339},{22,43,5},{22,43,5},{22,35,35},{12,43,338},{16,36,5},{30,48,4}, +{30,48,4},{30,48,4},{30,39,4},{49,0,338},{23,42,2},{23,42,2},{16,36,1},{62,18,338},{16,36,1},{59,0,421},{29,50,0},{32,43,1},{22,43,0},{59,0,421},{62,28,421},{22,43,0},{0,39,425},{62,28,421},{0,39,425},{26,0,421},{26,0,421},{26,0,421},{26,0,421},{22,44,2},{22,44,2},{22,44,2},{22,33,1},{15,37,1},{15,37,1},{29,63,922},{28,54,447},{29,46,646}, +{28,44,446},{25,63,1535},{24,50,447},{24,45,5},{23,41,646},{10,52,1515},{15,41,443},{31,62,425},{31,52,4},{32,45,45},{31,44,69},{57,0,1514},{22,51,422},{24,45,4},{12,41,426},{50,32,1514},{12,41,426},{28,58,421},{28,58,421},{28,58,421},{28,43,421},{24,56,339},{24,45,5},{24,45,5},{24,37,35},{14,45,338},{18,38,5},{31,52,4},{31,52,4},{31,52,4},{31,41,5},{52,0,338}, +{25,44,2},{25,44,2},{18,38,1},{62,21,338},{18,38,1},{62,0,421},{31,52,0},{34,45,1},{24,45,0},{62,0,421},{62,31,421},{24,45,0},{0,41,425},{62,31,421},{0,41,425},{28,0,421},{28,0,421},{28,0,421},{28,0,421},{24,46,2},{24,46,2},{24,46,2},{24,35,1},{17,39,1},{17,39,1},{31,63,994},{30,56,447},{31,48,655},{30,46,446},{28,63,1575},{26,52,447},{26,47,5}, +{25,43,646},{12,54,1515},{17,43,445},{33,63,426},{33,54,2},{34,47,45},{33,46,66},{60,0,1514},{24,53,422},{26,47,4},{14,43,426},{56,32,1514},{14,43,426},{30,60,421},{30,60,421},{30,60,421},{30,45,421},{26,58,339},{26,47,5},{26,47,5},{26,39,35},{16,47,338},{20,40,5},{33,53,1},{33,53,1},{33,53,1},{33,43,2},{55,0,338},{27,46,2},{27,46,2},{20,40,1},{62,24,338}, +{20,40,1},{63,4,421},{33,54,1},{36,47,1},{26,47,0},{63,4,421},{62,34,421},{26,47,0},{0,43,425},{62,34,421},{0,43,425},{30,0,421},{30,0,421},{30,0,421},{30,0,421},{26,48,1},{26,48,1},{26,48,1},{26,37,1},{19,41,1},{19,41,1},{33,63,1082},{32,58,445},{33,50,650},{32,48,450},{30,63,1638},{28,54,447},{28,49,7},{27,45,646},{14,56,1515},{19,45,445},{36,63,434}, +{35,56,2},{36,49,46},{35,48,74},{63,0,1514},{26,55,422},{28,49,6},{16,45,425},{62,32,1514},{16,45,425},{32,61,425},{32,61,425},{32,61,425},{32,47,426},{28,60,339},{28,49,6},{28,49,6},{28,41,35},{18,49,341},{22,42,5},{35,55,1},{35,55,1},{35,55,1},{35,45,2},{58,0,338},{29,48,0},{29,48,0},{22,42,1},{62,27,338},{22,42,1},{63,10,421},{35,56,1},{38,49,1}, +{27,49,1},{63,10,421},{62,37,421},{27,49,1},{0,45,425},{62,37,421},{0,45,425},{32,0,425},{32,0,425},{32,0,425},{32,0,425},{28,50,1},{28,50,1},{28,50,1},{28,39,1},{21,43,1},{21,43,1},{36,63,1206},{34,61,446},{35,52,646},{34,50,446},{33,63,1710},{30,56,445},{31,51,5},{29,47,638},{17,58,1515},{22,47,450},{39,63,469},{37,58,5},{38,52,45},{37,50,69},{63,7,1514}, +{27,58,422},{31,51,1},{19,47,433},{63,35,1514},{19,47,433},{34,63,422},{34,63,422},{34,63,422},{34,49,421},{31,61,342},{31,51,5},{31,51,5},{30,43,36},{20,51,338},{24,44,2},{38,56,4},{38,56,4},{38,56,4},{38,47,4},{53,16,338},{31,51,1},{31,51,1},{25,44,0},{63,30,338},{25,44,0},{63,17,421},{37,58,1},{40,51,1},{30,51,0},{63,17,421},{63,40,421},{30,51,0}, +{0,47,433},{63,40,421},{0,47,433},{34,0,421},{34,0,421},{34,0,421},{34,0,421},{31,51,4},{31,51,4},{31,51,4},{31,41,4},{23,45,1},{23,45,1},{38,63,1350},{36,63,446},{37,54,646},{36,52,446},{36,63,1814},{32,58,447},{32,53,5},{31,48,638},{19,60,1515},{23,49,443},{41,63,517},{39,60,5},{40,54,45},{39,52,69},{63,13,1514},{29,60,422},{32,53,4},{20,49,426},{63,38,1514}, +{20,49,426},{36,63,437},{36,63,437},{36,63,437},{36,51,421},{33,62,347},{32,53,5},{32,53,5},{32,45,33},{22,53,338},{26,46,2},{40,58,4},{40,58,4},{40,58,4},{40,49,4},{56,16,338},{33,52,2},{33,52,2},{27,46,0},{62,33,338},{27,46,0},{63,23,421},{39,60,1},{42,53,1},{32,53,0},{63,23,421},{63,43,421},{32,53,0},{0,49,425},{63,43,421},{0,49,425},{36,0,421}, +{36,0,421},{36,0,421},{36,0,421},{32,54,2},{32,54,2},{32,54,2},{32,43,2},{25,47,1},{25,47,1},{40,63,1466},{38,63,474},{39,56,646},{38,54,446},{38,63,1931},{34,60,447},{34,55,5},{33,51,646},{21,62,1515},{25,51,443},{43,63,569},{41,62,5},{42,56,45},{41,54,69},{63,19,1514},{32,61,422},{34,55,4},{22,51,426},{63,41,1514},{22,51,426},{38,63,470},{38,63,470},{38,63,470}, +{38,53,421},{35,63,355},{34,55,5},{34,55,5},{34,47,33},{24,55,338},{28,48,3},{42,60,4},{42,60,4},{42,60,4},{42,51,4},{59,16,338},{35,54,2},{35,54,2},{28,48,2},{62,36,338},{28,48,2},{63,29,421},{41,62,1},{44,55,1},{34,55,0},{63,29,421},{63,46,421},{34,55,0},{0,51,425},{63,46,421},{0,51,425},{38,0,421},{38,0,421},{38,0,421},{38,0,421},{34,56,2}, +{34,56,2},{34,56,2},{34,45,2},{27,49,1},{27,49,1},{43,63,1634},{41,63,546},{41,58,646},{40,56,446},{40,63,2039},{36,62,447},{36,57,5},{35,53,646},{24,63,1521},{27,53,443},{46,63,633},{44,63,9},{44,58,45},{43,56,69},{63,25,1514},{34,63,422},{36,57,4},{24,53,426},{63,44,1514},{24,53,426},{40,63,502},{40,63,502},{40,63,502},{40,55,421},{37,63,379},{36,57,5},{36,57,5}, +{36,49,35},{26,57,338},{30,50,3},{44,62,4},{44,62,4},{44,62,4},{44,53,4},{62,16,338},{37,56,2},{37,56,2},{30,50,2},{62,39,338},{30,50,2},{63,34,421},{44,63,5},{46,57,1},{36,57,0},{63,34,421},{62,49,421},{36,57,0},{0,53,425},{62,49,421},{0,53,425},{40,0,421},{40,0,421},{40,0,421},{40,0,421},{36,58,2},{36,58,2},{36,58,2},{36,47,2},{29,51,1}, +{29,51,1},{45,63,1866},{43,63,689},{43,60,650},{42,59,447},{43,63,2201},{38,63,469},{39,59,6},{37,55,638},{29,63,1590},{30,55,450},{48,63,741},{46,63,69},{46,60,46},{45,58,70},{62,33,1514},{38,63,465},{39,59,2},{25,56,425},{61,48,1514},{25,56,425},{43,63,545},{43,63,545},{43,63,545},{42,57,422},{40,63,424},{39,59,5},{39,59,5},{38,51,36},{29,59,339},{32,52,2},{46,63,5}, +{46,63,5},{46,63,5},{46,55,2},{63,21,338},{39,59,1},{39,59,1},{33,52,0},{63,42,338},{33,52,0},{63,41,421},{48,63,41},{49,59,2},{38,59,2},{63,41,421},{63,52,421},{38,59,2},{0,56,425},{63,52,421},{0,56,425},{42,0,421},{42,0,421},{42,0,421},{42,0,421},{39,59,4},{39,59,4},{39,59,4},{39,49,4},{31,53,1},{31,53,1},{48,63,2070},{46,63,889},{45,62,650}, +{44,61,447},{46,63,2361},{41,63,573},{41,61,6},{39,57,638},{32,63,1710},{32,57,450},{51,63,837},{49,63,184},{48,62,49},{47,60,70},{63,37,1514},{43,63,545},{41,61,2},{27,58,425},{63,50,1514},{27,58,425},{45,63,614},{45,63,614},{45,63,614},{44,59,422},{43,63,488},{41,61,5},{41,61,5},{40,53,36},{31,61,339},{34,54,2},{48,63,20},{48,63,20},{48,63,20},{48,57,4},{63,27,338}, +{41,61,1},{41,61,1},{35,54,0},{63,45,338},{35,54,0},{63,47,421},{51,63,97},{51,61,2},{40,61,2},{63,47,421},{63,55,421},{40,61,2},{0,58,425},{63,55,421},{0,58,425},{44,0,421},{44,0,421},{44,0,421},{44,0,421},{41,61,4},{41,61,4},{41,61,4},{41,51,4},{33,55,1},{33,55,1},{50,63,2239},{48,63,1109},{47,63,701},{46,62,441},{48,63,2469},{44,63,720},{43,63,5}, +{41,59,605},{37,63,1804},{34,59,417},{54,63,916},{51,63,308},{51,63,52},{49,62,56},{63,43,1459},{46,63,618},{43,63,1},{31,59,400},{63,53,1459},{31,59,400},{47,63,701},{47,63,701},{47,63,701},{46,61,422},{45,63,566},{43,63,5},{43,63,5},{42,55,36},{32,63,341},{36,56,2},{51,63,52},{51,63,52},{51,63,52},{50,59,4},{63,33,338},{43,63,1},{43,63,1},{37,56,0},{47,56,338}, +{37,56,0},{63,53,392},{55,63,157},{53,63,1},{42,63,1},{63,53,392},{63,58,392},{42,63,1},{0,59,400},{63,58,392},{0,59,400},{46,0,421},{46,0,421},{46,0,421},{46,0,421},{43,63,4},{43,63,4},{43,63,4},{43,53,4},{35,57,1},{35,57,1},{51,63,1901},{50,63,1114},{49,63,785},{48,63,421},{51,63,2093},{46,63,574},{45,63,38},{44,60,356},{40,63,1476},{36,60,213},{55,63,684}, +{54,63,260},{53,63,85},{51,63,20},{63,47,1064},{49,63,426},{47,63,8},{35,60,208},{63,55,1064},{35,60,208},{49,63,785},{49,63,785},{49,63,785},{48,63,421},{48,63,661},{45,63,38},{45,63,38},{44,57,36},{37,63,371},{38,58,2},{53,63,85},{53,63,85},{53,63,85},{52,61,4},{63,39,338},{47,63,8},{47,63,8},{39,58,0},{47,59,338},{39,58,0},{63,56,200},{57,63,80},{56,63,1}, +{48,63,0},{63,56,200},{62,60,200},{48,63,0},{0,60,208},{62,60,200},{0,60,208},{48,0,421},{48,0,421},{48,0,421},{48,0,421},{45,63,13},{45,63,13},{45,63,13},{45,55,4},{37,59,1},{37,59,1},{54,63,1646},{52,63,1119},{51,63,886},{50,63,470},{53,63,1761},{48,63,526},{48,63,126},{46,61,146},{44,63,1218},{39,62,69},{57,63,450},{56,63,245},{56,63,145},{54,63,2},{63,51,722}, +{52,63,290},{51,63,50},{38,62,65},{63,57,722},{38,62,65},{51,63,886},{51,63,886},{51,63,886},{50,63,470},{50,63,776},{48,63,126},{48,63,126},{47,59,42},{41,63,446},{40,60,5},{56,63,145},{56,63,145},{56,63,145},{54,63,2},{61,49,338},{51,63,50},{51,63,50},{42,60,1},{63,54,338},{42,60,1},{63,59,61},{60,63,25},{59,63,0},{55,63,0},{63,59,61},{63,61,61},{55,63,0}, +{0,62,65},{63,61,61},{0,62,65},{50,0,421},{50,0,421},{50,0,421},{50,0,421},{48,63,45},{48,63,45},{48,63,45},{47,57,2},{40,61,1},{40,61,1},{56,63,1518},{54,63,1118},{54,63,974},{52,63,565},{54,63,1526},{51,63,534},{51,63,278},{48,62,57},{47,63,1090},{42,63,10},{59,63,354},{58,63,251},{57,63,194},{56,63,50},{63,55,509},{55,63,234},{54,63,106},{42,63,9},{63,59,509}, +{42,63,9},{54,63,974},{54,63,974},{54,63,974},{52,63,565},{53,63,904},{51,63,278},{51,63,278},{48,61,38},{44,63,574},{42,62,5},{57,63,194},{57,63,194},{57,63,194},{56,63,50},{63,51,338},{54,63,106},{54,63,106},{44,62,1},{63,57,338},{44,62,1},{63,62,5},{62,63,4},{62,63,0},{61,63,0},{63,62,5},{62,63,5},{61,63,0},{0,63,9},{62,63,5},{0,63,9},{52,0,421}, +{52,0,421},{52,0,421},{52,0,421},{50,63,72},{50,63,72},{50,63,72},{49,59,5},{42,63,1},{42,63,1},{57,63,1197},{56,63,994},{56,63,894},{54,63,565},{56,63,1210},{54,63,493},{53,63,332},{50,63,13},{51,63,861},{45,63,17},{60,63,209},{60,63,161},{60,63,145},{58,63,50},{63,58,294},{58,63,147},{57,63,89},{47,63,1},{62,61,294},{47,63,1},{56,63,894},{56,63,894},{56,63,894}, +{54,63,565},{54,63,781},{53,63,332},{53,63,332},{50,63,13},{48,63,501},{45,63,17},{60,63,145},{60,63,145},{60,63,145},{58,63,50},{63,55,221},{57,63,89},{57,63,89},{47,63,1},{63,59,221},{47,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{54,0,421},{54,0,421},{54,0,421},{54,0,421},{52,63,117}, +{52,63,117},{52,63,117},{51,61,5},{45,63,17},{45,63,17},{58,63,925},{57,63,765},{57,63,701},{57,63,509},{57,63,845},{55,63,423},{54,63,301},{53,63,5},{52,63,598},{49,63,52},{61,63,97},{61,63,70},{61,63,61},{60,63,17},{63,60,113},{60,63,57},{59,63,40},{53,63,1},{62,62,113},{53,63,1},{57,63,701},{57,63,701},{57,63,701},{57,63,509},{57,63,589},{54,63,301},{54,63,301}, +{53,63,5},{51,63,365},{49,63,52},{61,63,61},{61,63,61},{61,63,61},{60,63,17},{63,58,85},{59,63,40},{59,63,40},{53,63,1},{62,61,85},{53,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{56,0,421},{56,0,421},{56,0,421},{56,0,421},{54,63,157},{54,63,157},{54,63,157},{53,63,5},{49,63,52}, +{49,63,52},{0,29,882},{0,21,116},{0,15,4},{0,13,320},{0,19,1899},{0,14,1214},{0,11,573},{0,8,1421},{0,9,2052},{0,8,1521},{0,29,882},{0,21,116},{0,15,4},{0,13,320},{10,0,1896},{0,14,1214},{0,11,573},{0,8,1421},{14,3,1896},{0,8,1421},{0,14,0},{0,14,0},{0,14,0},{0,7,0},{0,7,162},{0,5,61},{0,5,61},{0,3,100},{0,3,180},{0,3,116},{0,14,0}, +{0,14,0},{0,14,0},{0,7,0},{3,1,162},{0,5,61},{0,5,61},{0,3,100},{7,0,162},{0,3,100},{6,17,882},{0,21,116},{0,15,4},{0,13,320},{6,17,882},{29,0,882},{0,13,320},{0,10,884},{29,0,882},{0,10,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,35,882},{0,25,50},{0,17,10}, +{0,15,260},{0,23,2355},{0,16,1355},{0,14,589},{0,10,1656},{0,11,2567},{0,10,1825},{0,35,882},{0,25,50},{0,17,10},{0,15,260},{3,17,2355},{0,16,1355},{0,14,589},{0,10,1656},{23,0,2355},{0,10,1656},{0,19,1},{0,19,1},{0,19,1},{0,10,0},{0,10,338},{0,8,125},{0,8,125},{0,4,200},{0,5,374},{0,4,225},{0,19,1},{0,19,1},{0,19,1},{0,10,0},{5,0,338}, +{0,8,125},{0,8,125},{0,4,200},{10,0,338},{0,4,200},{17,1,882},{0,25,50},{1,17,2},{0,15,260},{17,1,882},{35,0,882},{0,15,260},{0,12,884},{35,0,882},{0,12,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,41,882},{0,28,10},{1,19,69},{0,17,193},{0,28,2899},{0,19,1539},{0,16,643}, +{0,11,1965},{0,13,3209},{0,11,2161},{0,41,882},{0,28,10},{1,19,53},{0,17,193},{14,0,2899},{0,19,1539},{0,16,643},{0,11,1965},{28,0,2899},{0,11,1965},{0,25,1},{0,25,1},{0,25,1},{0,13,0},{0,13,578},{0,11,221},{0,11,221},{0,6,356},{0,6,644},{0,5,401},{0,25,1},{0,25,1},{0,25,1},{0,13,0},{6,1,578},{0,11,221},{0,11,221},{0,6,356},{13,0,578}, +{0,6,356},{20,1,882},{0,28,10},{3,19,2},{0,17,193},{20,1,882},{41,0,882},{0,17,193},{0,14,884},{41,0,882},{0,14,884},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,45,902},{1,31,24},{1,21,142},{0,19,166},{0,33,3048},{0,22,1443},{0,18,481},{0,13,1908},{0,16,3492},{0,13,2197},{2,43,886}, +{1,31,8},{3,21,73},{1,19,153},{16,1,3048},{0,22,1443},{0,18,481},{0,13,1908},{33,0,3048},{0,13,1908},{1,29,21},{1,29,21},{1,29,21},{1,15,21},{0,18,648},{0,14,169},{0,14,169},{0,8,325},{0,8,766},{0,7,421},{2,27,5},{2,27,5},{2,27,5},{2,15,4},{9,0,648},{0,14,169},{0,14,169},{0,8,325},{18,0,648},{0,8,325},{23,1,882},{0,31,2},{5,21,2}, +{0,19,130},{23,1,882},{47,0,882},{0,19,130},{0,16,890},{47,0,882},{0,16,890},{1,0,20},{1,0,20},{1,0,20},{1,0,20},{0,5,0},{0,5,0},{0,5,0},{0,2,1},{0,2,5},{0,2,5},{2,49,997},{2,34,114},{3,24,290},{1,22,234},{0,39,3051},{0,25,1256},{0,21,258},{0,16,1764},{0,19,3685},{0,15,2195},{4,46,883},{3,33,10},{5,23,74},{3,21,154},{15,10,3048}, +{0,25,1256},{0,21,258},{0,16,1764},{30,5,3048},{0,16,1764},{2,34,113},{2,34,113},{2,34,113},{2,18,113},{0,25,648},{0,17,89},{0,17,89},{0,10,242},{0,11,876},{0,10,411},{4,30,1},{4,30,1},{4,30,1},{4,17,1},{12,1,648},{0,17,89},{0,17,89},{0,10,242},{25,0,648},{0,10,242},{27,0,882},{3,33,1},{8,23,1},{0,22,80},{27,0,882},{46,4,882},{0,22,80}, +{0,18,884},{46,4,882},{0,18,884},{2,0,113},{2,0,113},{2,0,113},{2,0,113},{0,11,1},{0,11,1},{0,11,1},{0,6,1},{0,5,40},{0,5,40},{3,53,1149},{3,36,274},{4,27,513},{3,24,362},{0,45,3051},{0,28,1128},{0,24,122},{0,18,1605},{0,22,3901},{0,16,2173},{6,47,885},{5,35,10},{7,25,74},{5,23,154},{15,16,3048},{0,28,1128},{0,24,122},{0,18,1605},{30,8,3048}, +{0,18,1605},{3,38,265},{3,38,265},{3,38,265},{3,20,266},{0,31,648},{0,21,34},{0,21,34},{0,13,170},{0,14,1004},{0,11,457},{6,32,1},{6,32,1},{6,32,1},{6,19,1},{15,1,648},{0,21,34},{0,21,34},{0,13,170},{31,0,648},{0,13,170},{30,0,882},{5,35,1},{10,25,1},{0,24,41},{30,0,882},{46,7,882},{0,24,41},{0,20,884},{46,7,882},{0,20,884},{3,0,265}, +{3,0,265},{3,0,265},{3,0,265},{0,17,0},{0,17,0},{0,17,0},{0,9,1},{0,8,104},{0,8,104},{4,57,1365},{4,39,498},{5,28,793},{4,26,561},{0,51,3048},{0,31,1032},{0,26,41},{0,20,1509},{0,24,4147},{0,19,2149},{8,49,885},{7,37,10},{9,27,74},{7,25,154},{17,17,3048},{0,31,1032},{0,26,41},{0,20,1509},{51,0,3048},{0,20,1509},{4,42,481},{4,42,481},{4,42,481}, +{4,23,481},{0,36,650},{0,25,4},{0,25,4},{0,15,130},{0,16,1161},{0,14,481},{8,34,1},{8,34,1},{8,34,1},{8,21,1},{15,7,648},{0,25,4},{0,25,4},{0,15,130},{31,3,648},{0,15,130},{32,1,882},{7,37,1},{12,27,1},{0,26,25},{32,1,882},{46,10,882},{0,26,25},{0,22,884},{46,10,882},{0,22,884},{4,0,481},{4,0,481},{4,0,481},{4,0,481},{0,23,0}, +{0,23,0},{0,23,0},{0,12,1},{0,9,193},{0,9,193},{5,61,1645},{5,42,795},{7,30,1177},{4,28,826},{0,57,3048},{0,35,954},{0,29,9},{0,22,1380},{0,27,4419},{0,21,2197},{10,51,885},{9,39,10},{11,29,74},{9,27,154},{20,17,3048},{0,35,954},{0,29,9},{0,22,1380},{57,0,3048},{0,22,1380},{5,46,761},{5,46,761},{5,46,761},{5,25,762},{0,42,650},{0,28,4},{0,28,4}, +{0,17,85},{0,19,1345},{0,16,557},{10,36,1},{10,36,1},{10,36,1},{10,23,1},{15,13,648},{1,27,1},{1,27,1},{0,17,85},{31,6,648},{0,17,85},{35,1,882},{9,39,1},{14,29,1},{0,29,9},{35,1,882},{46,13,882},{0,29,9},{0,24,884},{46,13,882},{0,24,884},{5,0,761},{5,0,761},{5,0,761},{5,0,761},{0,29,0},{0,29,0},{0,29,0},{0,15,1},{0,11,296}, +{0,11,296},{7,63,1774},{7,44,924},{8,33,1320},{6,30,941},{2,60,3052},{1,38,924},{2,31,10},{0,24,1302},{0,31,4300},{0,24,1942},{12,54,882},{12,40,8},{13,32,68},{11,29,161},{32,0,3048},{0,39,898},{2,31,6},{0,24,1266},{62,1,3048},{0,24,1266},{7,48,885},{7,48,885},{7,48,885},{7,28,884},{2,45,652},{2,31,9},{2,31,9},{1,20,62},{0,22,1275},{0,19,419},{12,39,0}, +{12,39,0},{12,39,0},{12,25,1},{24,1,648},{3,30,0},{3,30,0},{0,20,45},{49,0,648},{0,20,45},{39,0,882},{11,41,1},{16,31,2},{1,31,1},{39,0,882},{62,8,882},{1,31,1},{0,26,882},{62,8,882},{0,26,882},{7,0,884},{7,0,884},{7,0,884},{7,0,884},{2,32,4},{2,32,4},{2,32,4},{2,17,4},{0,16,250},{0,16,250},{9,63,1798},{9,46,924},{10,35,1320}, +{9,32,936},{4,62,3052},{3,40,924},{4,33,9},{2,26,1302},{0,33,4023},{0,26,1647},{14,56,882},{14,42,8},{15,34,68},{13,31,161},{35,0,3048},{0,42,882},{4,33,5},{0,27,1170},{62,4,3048},{0,27,1170},{9,50,885},{9,50,885},{9,50,885},{9,30,884},{4,47,652},{4,32,8},{4,32,8},{3,22,62},{0,25,1107},{0,22,243},{14,41,0},{14,41,0},{14,41,0},{14,27,1},{27,1,648}, +{5,32,1},{5,32,1},{0,22,18},{55,0,648},{0,22,18},{42,0,882},{13,43,1},{18,33,1},{2,33,0},{42,0,882},{62,11,882},{2,33,0},{0,28,882},{62,11,882},{0,28,882},{9,0,884},{9,0,884},{9,0,884},{9,0,884},{4,34,4},{4,34,4},{4,34,4},{4,19,4},{0,19,146},{0,19,146},{12,63,1846},{11,48,924},{12,37,1320},{11,34,936},{6,63,3055},{5,42,924},{6,35,9}, +{4,28,1302},{0,36,3799},{0,28,1356},{16,58,883},{16,44,9},{17,35,74},{15,33,161},{38,0,3048},{2,44,882},{6,35,5},{0,29,1110},{62,7,3048},{0,29,1110},{11,52,885},{11,52,885},{11,52,885},{11,32,885},{6,49,652},{6,34,8},{6,34,8},{5,24,62},{0,29,969},{0,24,109},{16,42,1},{16,42,1},{16,42,1},{16,29,2},{30,1,648},{7,34,1},{7,34,1},{0,24,9},{61,0,648}, +{0,24,9},{45,0,882},{15,45,1},{20,35,1},{4,35,0},{45,0,882},{62,14,882},{4,35,0},{0,30,882},{62,14,882},{0,30,882},{11,0,884},{11,0,884},{11,0,884},{11,0,884},{6,36,4},{6,36,4},{6,36,4},{6,21,4},{0,22,74},{0,22,74},{14,63,1912},{13,50,924},{14,39,1320},{13,36,936},{9,63,3087},{7,44,924},{8,37,9},{6,30,1302},{0,39,3607},{0,31,1156},{18,60,883}, +{18,46,9},{19,37,74},{17,35,154},{41,0,3048},{4,46,882},{8,37,5},{0,31,1035},{62,10,3048},{0,31,1035},{13,54,885},{13,54,885},{13,54,885},{13,34,885},{8,51,652},{8,36,8},{8,36,8},{7,26,62},{0,33,846},{0,27,37},{18,44,1},{18,44,1},{18,44,1},{18,31,2},{33,1,648},{9,36,1},{9,36,1},{0,27,1},{63,2,648},{0,27,1},{47,2,882},{16,48,1},{22,37,1}, +{6,37,0},{47,2,882},{62,17,882},{6,37,0},{0,32,884},{62,17,882},{0,32,884},{13,0,884},{13,0,884},{13,0,884},{13,0,884},{8,38,4},{8,38,4},{8,38,4},{8,23,4},{0,26,29},{0,26,29},{16,63,2014},{15,52,932},{16,40,1341},{15,38,932},{12,63,3141},{9,46,924},{10,39,7},{9,32,1308},{0,43,3436},{0,33,1003},{20,62,884},{20,48,8},{21,40,74},{19,37,161},{36,16,3048}, +{6,48,882},{10,39,6},{0,33,978},{63,13,3048},{0,33,978},{15,57,882},{15,57,882},{15,57,882},{15,36,882},{10,54,649},{10,39,6},{10,39,6},{9,28,61},{0,36,737},{1,29,8},{20,47,0},{20,47,0},{20,47,0},{20,33,1},{31,12,648},{11,38,1},{11,38,1},{2,29,1},{62,6,648},{2,29,1},{51,0,882},{19,49,1},{24,39,1},{9,39,1},{51,0,882},{47,28,882},{9,39,1}, +{0,34,882},{47,28,882},{0,34,882},{15,0,882},{15,0,882},{15,0,882},{15,0,882},{10,40,2},{10,40,2},{10,40,2},{10,25,2},{0,30,2},{0,30,2},{19,63,2126},{17,54,924},{18,42,1341},{16,40,941},{14,63,3204},{11,48,924},{12,41,7},{11,34,1308},{0,46,3300},{0,35,939},{22,63,890},{22,50,8},{23,42,74},{21,39,161},{39,16,3048},{8,50,882},{12,41,6},{0,35,939},{62,16,3048}, +{0,35,939},{17,59,884},{17,59,884},{17,59,884},{17,38,884},{12,56,649},{12,41,6},{12,41,6},{11,30,61},{0,39,681},{3,31,8},{22,49,0},{22,49,0},{22,49,0},{22,35,1},{31,18,648},{13,40,1},{13,40,1},{4,31,1},{62,9,648},{4,31,1},{54,0,882},{21,51,1},{26,41,1},{11,41,1},{54,0,882},{47,31,882},{11,41,1},{0,36,882},{47,31,882},{0,36,882},{17,0,884}, +{17,0,884},{17,0,884},{17,0,884},{12,42,2},{12,42,2},{12,42,2},{12,27,2},{2,32,1},{2,32,1},{20,63,2264},{19,56,924},{20,44,1341},{18,42,941},{17,63,3292},{13,50,924},{14,43,7},{13,36,1308},{0,50,3192},{0,38,923},{25,63,906},{24,52,8},{25,44,74},{23,41,161},{50,0,3048},{10,52,882},{14,43,6},{0,38,907},{62,19,3048},{0,38,907},{19,61,884},{19,61,884},{19,61,884}, +{19,40,884},{14,58,649},{14,43,6},{14,43,6},{13,32,67},{0,42,657},{4,33,10},{24,51,0},{24,51,0},{24,51,0},{24,37,1},{34,17,648},{15,42,1},{15,42,1},{6,33,1},{62,12,648},{6,33,1},{57,0,882},{23,53,1},{28,43,1},{13,43,1},{57,0,882},{50,32,882},{13,43,1},{0,38,882},{50,32,882},{0,38,882},{19,0,884},{19,0,884},{19,0,884},{19,0,884},{14,44,2}, +{14,44,2},{14,44,2},{14,29,2},{4,34,1},{4,34,1},{23,63,2376},{21,58,924},{22,46,1341},{20,44,941},{19,63,3391},{15,52,924},{16,45,10},{15,38,1308},{0,53,3112},{2,40,923},{27,63,948},{26,54,8},{27,46,74},{25,43,161},{53,0,3048},{12,54,882},{16,45,6},{0,40,891},{62,22,3048},{0,40,891},{21,63,884},{21,63,884},{21,63,884},{21,42,884},{16,59,652},{16,45,9},{16,45,9}, +{15,34,67},{1,45,650},{6,35,10},{26,53,0},{26,53,0},{26,53,0},{26,39,1},{37,17,648},{17,44,0},{17,44,0},{8,35,1},{62,15,648},{8,35,1},{60,0,882},{25,55,1},{30,45,1},{15,45,1},{60,0,882},{56,32,882},{15,45,1},{0,40,882},{56,32,882},{0,40,882},{21,0,884},{21,0,884},{21,0,884},{21,0,884},{16,46,4},{16,46,4},{16,46,4},{16,31,4},{6,36,1}, +{6,36,1},{26,63,2564},{23,61,927},{24,49,1324},{23,47,935},{22,63,3529},{17,54,924},{18,47,10},{17,41,1302},{0,56,3060},{5,42,924},{30,63,1003},{28,57,6},{29,48,67},{28,46,158},{56,1,3048},{15,56,883},{19,47,8},{1,42,884},{63,25,3048},{1,42,884},{23,63,891},{23,63,891},{23,63,891},{23,44,883},{18,62,649},{18,47,6},{18,47,6},{17,36,61},{4,47,652},{9,37,8},{28,55,2}, +{28,55,2},{28,55,2},{28,42,2},{49,0,648},{19,46,2},{19,46,2},{11,37,0},{62,18,648},{11,37,0},{63,1,882},{27,58,2},{32,47,4},{17,47,5},{63,1,882},{63,32,882},{17,47,5},{0,42,884},{63,32,882},{0,42,884},{23,0,882},{23,0,882},{23,0,882},{23,0,882},{18,48,2},{18,48,2},{18,48,2},{18,33,2},{8,38,1},{8,38,1},{28,63,2774},{25,63,927},{26,51,1324}, +{25,48,932},{25,63,3681},{19,56,924},{20,49,7},{19,43,1302},{0,59,3052},{7,44,924},{32,63,1074},{30,59,6},{31,50,67},{30,48,170},{59,1,3048},{16,58,885},{20,49,6},{3,44,884},{63,28,3048},{3,44,884},{25,63,918},{25,63,918},{25,63,918},{25,46,883},{20,63,651},{20,49,6},{20,49,6},{19,38,61},{5,49,651},{11,39,8},{30,57,2},{30,57,2},{30,57,2},{30,44,2},{52,0,648}, +{21,48,1},{21,48,1},{13,39,0},{62,21,648},{13,39,0},{63,7,882},{29,60,2},{34,49,1},{19,49,1},{63,7,882},{63,35,882},{19,49,1},{0,44,884},{63,35,882},{0,44,884},{25,0,882},{25,0,882},{25,0,882},{25,0,882},{20,50,2},{20,50,2},{20,50,2},{20,35,2},{10,40,1},{10,40,1},{31,63,2998},{28,63,951},{28,53,1324},{27,50,932},{26,63,3844},{21,58,924},{22,51,7}, +{21,45,1302},{2,61,3052},{9,46,924},{34,63,1146},{32,61,9},{33,52,74},{32,50,169},{62,1,3048},{18,60,885},{22,51,6},{5,46,884},{63,31,3048},{5,46,884},{28,63,950},{28,63,950},{28,63,950},{27,48,882},{23,63,675},{22,51,6},{22,51,6},{21,40,61},{7,51,651},{13,41,8},{32,59,0},{32,59,0},{32,59,0},{32,46,1},{55,0,648},{23,50,1},{23,50,1},{15,41,0},{62,24,648}, +{15,41,0},{63,13,882},{31,62,2},{36,51,1},{21,51,1},{63,13,882},{63,38,882},{21,51,1},{0,46,884},{63,38,882},{0,46,884},{27,0,882},{27,0,882},{27,0,882},{27,0,882},{22,52,2},{22,52,2},{22,52,2},{22,37,2},{12,42,1},{12,42,1},{33,63,3224},{30,63,1031},{30,55,1324},{29,52,932},{29,63,3996},{23,60,924},{24,53,7},{23,47,1302},{4,63,3052},{11,48,922},{37,63,1226}, +{34,63,9},{35,54,74},{33,51,161},{63,5,3048},{20,62,885},{24,53,6},{6,48,882},{47,42,3048},{6,48,882},{30,63,995},{30,63,995},{30,63,995},{29,50,882},{25,63,705},{24,53,6},{24,53,6},{23,42,61},{9,53,651},{15,43,8},{34,61,0},{34,61,0},{34,61,0},{34,47,4},{58,0,648},{25,52,1},{25,52,1},{16,43,1},{62,27,648},{16,43,1},{63,19,882},{33,63,4},{38,53,1}, +{23,53,1},{63,19,882},{63,41,882},{23,53,1},{0,48,882},{63,41,882},{0,48,882},{29,0,882},{29,0,882},{29,0,882},{29,0,882},{24,54,2},{24,54,2},{24,54,2},{24,39,2},{14,44,1},{14,44,1},{34,63,3510},{32,63,1202},{33,57,1335},{31,54,936},{33,63,4252},{25,63,925},{26,55,13},{25,49,1309},{9,63,3091},{13,50,918},{40,63,1349},{37,63,38},{37,56,77},{36,54,158},{60,17,3048}, +{24,63,894},{27,55,8},{9,50,884},{63,37,3048},{9,50,884},{32,63,1058},{32,63,1058},{32,63,1058},{31,52,885},{28,63,762},{26,55,9},{26,55,9},{26,44,61},{11,56,650},{17,45,11},{36,63,2},{36,63,2},{36,63,2},{36,50,2},{53,16,648},{28,54,1},{28,54,1},{19,45,1},{63,30,648},{19,45,1},{59,33,882},{37,63,29},{40,56,4},{26,55,4},{59,33,882},{55,48,882},{26,55,4}, +{0,50,884},{55,48,882},{0,50,884},{31,0,884},{31,0,884},{31,0,884},{31,0,884},{26,57,0},{26,57,0},{26,57,0},{26,42,1},{16,47,2},{16,47,2},{37,63,3734},{34,63,1399},{35,59,1335},{33,57,935},{34,63,4441},{28,63,957},{28,57,13},{27,51,1309},{13,63,3192},{15,52,918},{43,63,1485},{39,63,131},{39,58,77},{38,56,158},{63,17,3048},{28,63,957},{29,57,8},{11,52,884},{63,40,3048}, +{11,52,884},{34,63,1110},{34,63,1110},{34,63,1110},{33,54,883},{30,63,840},{28,57,9},{28,57,9},{28,46,61},{13,58,650},{19,47,11},{39,63,10},{39,63,10},{39,63,10},{38,52,2},{56,16,648},{30,56,1},{30,56,1},{21,47,1},{62,33,648},{21,47,1},{62,33,882},{41,63,80},{42,58,4},{28,57,4},{62,33,882},{61,48,882},{28,57,4},{0,52,884},{61,48,882},{0,52,884},{33,0,882}, +{33,0,882},{33,0,882},{33,0,882},{28,59,0},{28,59,0},{28,59,0},{28,44,1},{18,48,1},{18,48,1},{40,63,4022},{37,63,1647},{37,61,1335},{35,59,935},{37,63,4657},{31,63,1085},{30,59,13},{29,53,1309},{18,63,3339},{17,54,924},{45,63,1635},{42,63,275},{41,60,77},{40,58,158},{63,23,3048},{32,63,1044},{31,59,8},{13,54,884},{63,43,3048},{13,54,884},{36,63,1203},{36,63,1203},{36,63,1203}, +{35,56,883},{33,63,915},{30,59,9},{30,59,9},{30,48,65},{15,60,650},{21,49,8},{41,63,25},{41,63,25},{41,63,25},{40,54,2},{59,16,648},{32,57,4},{32,57,4},{23,49,0},{62,36,648},{23,49,0},{63,37,882},{44,63,160},{44,60,4},{30,59,4},{63,37,882},{63,50,882},{30,59,4},{0,54,884},{63,50,882},{0,54,884},{35,0,882},{35,0,882},{35,0,882},{35,0,882},{30,61,0}, +{30,61,0},{30,61,0},{30,46,1},{20,50,1},{20,50,1},{42,63,4364},{40,63,1991},{39,63,1335},{37,61,935},{40,63,4905},{34,63,1287},{32,61,10},{31,55,1309},{21,63,3555},{19,56,924},{48,63,1796},{44,63,465},{43,62,77},{42,60,158},{63,29,3048},{35,63,1188},{33,61,8},{15,56,884},{63,46,3048},{15,56,884},{39,63,1299},{39,63,1299},{39,63,1299},{37,58,883},{34,63,1017},{32,61,6},{32,61,6}, +{32,50,66},{17,62,650},{23,51,8},{43,63,45},{43,63,45},{43,63,45},{42,56,2},{62,16,648},{33,60,2},{33,60,2},{25,51,0},{62,39,648},{25,51,0},{63,43,882},{48,63,260},{46,62,4},{30,62,4},{63,43,882},{63,53,882},{30,62,4},{0,56,884},{63,53,882},{0,56,884},{37,0,882},{37,0,882},{37,0,882},{37,0,882},{32,63,1},{32,63,1},{32,63,1},{32,47,2},{22,52,1}, +{22,52,1},{45,63,4441},{43,63,2286},{41,63,1421},{39,62,916},{43,63,4878},{37,63,1410},{34,63,9},{33,57,1141},{26,63,3535},{21,58,795},{50,63,1770},{47,63,609},{46,63,85},{44,62,120},{63,35,2814},{40,63,1194},{35,63,2},{17,58,762},{63,49,2814},{17,58,762},{41,63,1421},{41,63,1421},{41,63,1421},{39,61,885},{37,63,1130},{34,63,9},{34,63,9},{34,52,61},{20,63,651},{25,53,11},{46,63,85}, +{46,63,85},{46,63,85},{44,58,4},{63,21,648},{36,62,1},{36,62,1},{27,53,2},{63,42,648},{27,53,2},{63,48,761},{51,63,305},{48,63,1},{34,63,0},{63,48,761},{62,56,761},{34,63,0},{0,58,761},{62,56,761},{0,58,761},{39,0,884},{39,0,884},{39,0,884},{39,0,884},{34,63,9},{34,63,9},{34,63,9},{34,50,1},{24,55,2},{24,55,2},{46,63,3945},{43,63,2238},{43,63,1509}, +{41,63,885},{45,63,4345},{38,63,1230},{37,63,41},{34,58,781},{30,63,3066},{24,59,494},{51,63,1386},{48,63,530},{48,63,130},{46,62,45},{63,39,2249},{43,63,914},{39,63,8},{21,59,482},{47,59,2249},{21,59,482},{43,63,1509},{43,63,1509},{43,63,1509},{41,63,885},{40,63,1242},{37,63,41},{37,63,41},{36,54,61},{24,63,689},{27,55,11},{48,63,130},{48,63,130},{48,63,130},{46,60,4},{63,27,648}, +{39,63,8},{39,63,8},{29,55,2},{63,45,648},{29,55,2},{63,51,481},{54,63,193},{51,63,1},{40,63,0},{63,51,481},{63,57,481},{40,63,0},{0,59,481},{63,57,481},{0,59,481},{41,0,884},{41,0,884},{41,0,884},{41,0,884},{37,63,25},{37,63,25},{37,63,25},{36,52,1},{26,57,2},{26,57,2},{48,63,3571},{46,63,2182},{46,63,1653},{43,63,900},{46,63,3838},{41,63,1094},{40,63,137}, +{37,59,490},{32,63,2703},{27,60,270},{53,63,1106},{51,63,458},{50,63,193},{48,63,10},{63,43,1769},{46,63,698},{42,63,40},{25,60,266},{63,53,1769},{25,60,266},{46,63,1653},{46,63,1653},{46,63,1653},{43,63,900},{43,63,1386},{40,63,137},{40,63,137},{38,56,61},{29,63,779},{29,57,11},{50,63,193},{50,63,193},{50,63,193},{48,62,1},{63,33,648},{42,63,40},{42,63,40},{31,57,2},{47,56,648}, +{31,57,2},{63,54,265},{57,63,113},{54,63,1},{46,63,0},{63,54,265},{62,59,265},{46,63,0},{0,60,265},{62,59,265},{0,60,265},{43,0,884},{43,0,884},{43,0,884},{43,0,884},{39,63,52},{39,63,52},{39,63,52},{38,54,1},{28,59,2},{28,59,2},{50,63,3307},{48,63,2195},{48,63,1795},{46,63,964},{48,63,3435},{43,63,1026},{42,63,296},{39,60,269},{37,63,2410},{30,61,115},{54,63,882}, +{54,63,450},{53,63,265},{50,63,10},{63,47,1374},{48,63,546},{46,63,89},{29,61,114},{63,55,1374},{29,61,114},{48,63,1795},{48,63,1795},{48,63,1795},{46,63,964},{45,63,1560},{42,63,296},{42,63,296},{40,58,61},{32,63,891},{31,59,11},{53,63,265},{53,63,265},{53,63,265},{50,63,10},{63,39,648},{46,63,89},{46,63,89},{33,59,1},{47,59,648},{33,59,1},{63,57,113},{58,63,50},{57,63,1}, +{52,63,0},{63,57,113},{63,60,113},{52,63,0},{0,61,113},{63,60,113},{0,61,113},{45,0,884},{45,0,884},{45,0,884},{45,0,884},{41,63,97},{41,63,97},{41,63,97},{40,56,1},{30,61,2},{30,61,2},{51,63,3032},{51,63,2264},{50,63,1965},{48,63,1096},{51,63,3096},{46,63,1059},{46,63,530},{41,62,126},{40,63,2191},{33,62,25},{57,63,680},{56,63,465},{55,63,356},{53,63,68},{63,51,1032}, +{52,63,450},{49,63,185},{34,62,20},{63,57,1032},{34,62,20},{50,63,1965},{50,63,1965},{50,63,1965},{48,63,1096},{48,63,1736},{46,63,530},{46,63,530},{42,60,62},{37,63,1086},{33,62,9},{55,63,356},{55,63,356},{55,63,356},{53,63,68},{61,49,648},{49,63,185},{49,63,185},{36,61,4},{63,54,648},{36,61,4},{63,61,18},{61,63,9},{61,63,0},{59,63,0},{63,61,18},{63,62,18},{59,63,0}, +{0,62,20},{63,62,18},{0,62,20},{47,0,890},{47,0,890},{47,0,890},{47,0,890},{44,63,149},{44,63,149},{44,63,149},{42,58,1},{32,63,0},{32,63,0},{54,63,2756},{52,63,2249},{51,63,2004},{50,63,1224},{53,63,2803},{48,63,1092},{48,63,692},{44,62,58},{43,63,1991},{35,63,16},{59,63,566},{57,63,420},{57,63,356},{55,63,125},{63,55,771},{55,63,386},{52,63,241},{38,63,0},{63,59,771}, +{38,63,0},{51,63,2004},{51,63,2004},{51,63,2004},{50,63,1224},{50,63,1802},{48,63,692},{48,63,692},{44,62,42},{40,63,1166},{35,63,16},{57,63,356},{57,63,356},{57,63,356},{55,63,125},{63,50,580},{52,63,241},{52,63,241},{38,63,0},{62,57,580},{38,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{49,0,884}, +{49,0,884},{49,0,884},{49,0,884},{46,63,193},{46,63,193},{46,63,193},{44,60,1},{35,63,16},{35,63,16},{54,63,2276},{54,63,1844},{54,63,1700},{52,63,1125},{54,63,2180},{51,63,948},{49,63,649},{46,63,10},{46,63,1551},{39,63,58},{60,63,324},{59,63,257},{59,63,221},{57,63,68},{63,57,452},{57,63,228},{55,63,137},{44,63,0},{63,60,452},{44,63,0},{54,63,1700},{54,63,1700},{54,63,1700}, +{52,63,1125},{51,63,1460},{49,63,649},{49,63,649},{46,63,10},{43,63,926},{39,63,58},{59,63,221},{59,63,221},{59,63,221},{57,63,68},{63,53,340},{55,63,137},{55,63,137},{44,63,0},{63,58,340},{44,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{51,0,884},{51,0,884},{51,0,884},{51,0,884},{48,63,260}, +{48,63,260},{48,63,260},{46,62,1},{39,63,58},{39,63,58},{57,63,1844},{55,63,1585},{55,63,1464},{54,63,1044},{56,63,1747},{52,63,850},{51,63,596},{48,63,4},{48,63,1204},{43,63,117},{60,63,164},{60,63,116},{60,63,100},{59,63,40},{63,59,216},{58,63,114},{58,63,65},{50,63,0},{63,61,216},{50,63,0},{55,63,1464},{55,63,1464},{55,63,1464},{54,63,1044},{54,63,1188},{51,63,596},{51,63,596}, +{48,63,4},{46,63,750},{43,63,117},{60,63,100},{60,63,100},{60,63,100},{59,63,40},{63,56,164},{58,63,65},{58,63,65},{50,63,0},{62,60,164},{50,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{53,0,884},{53,0,884},{53,0,884},{53,0,884},{51,63,340},{51,63,340},{51,63,340},{48,63,4},{43,63,117}, +{43,63,117},{0,39,1568},{0,28,194},{0,19,10},{0,16,586},{0,26,3371},{0,17,2169},{0,16,1027},{0,10,2532},{0,12,3648},{0,10,2701},{0,39,1568},{0,28,194},{0,19,10},{0,16,586},{5,16,3371},{0,17,2169},{0,16,1027},{0,10,2532},{26,0,3371},{0,10,2532},{0,18,0},{0,18,0},{0,18,0},{0,9,0},{0,9,288},{0,8,109},{0,8,109},{0,4,164},{0,4,321},{0,4,189},{0,18,0}, +{0,18,0},{0,18,0},{0,9,0},{4,1,288},{0,8,109},{0,8,109},{0,4,164},{9,0,288},{0,4,164},{19,1,1568},{0,28,194},{0,19,10},{0,16,586},{19,1,1568},{39,0,1568},{0,16,586},{0,13,1568},{39,0,1568},{0,13,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,45,1568},{0,31,106},{0,22,10}, +{0,18,481},{0,30,3968},{0,19,2355},{0,18,1057},{0,13,2852},{0,14,4319},{0,11,3117},{0,45,1568},{0,31,106},{0,22,10},{0,18,481},{15,0,3968},{0,19,2355},{0,18,1057},{0,13,2852},{30,0,3968},{0,13,2852},{0,24,0},{0,24,0},{0,24,0},{0,12,0},{0,12,512},{0,10,205},{0,10,205},{0,5,313},{0,5,566},{0,5,349},{0,24,0},{0,24,0},{0,24,0},{0,12,0},{6,0,512}, +{0,10,205},{0,10,205},{0,5,313},{12,0,512},{0,5,313},{22,1,1568},{0,31,106},{1,22,1},{0,18,481},{22,1,1568},{45,0,1568},{0,18,481},{0,15,1568},{45,0,1568},{0,15,1568},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,50,1570},{0,34,52},{1,24,58},{0,21,377},{0,34,4652},{0,22,2571},{0,19,1107}, +{0,14,3225},{0,16,5108},{0,13,3525},{0,50,1570},{0,34,52},{1,24,42},{0,21,377},{15,4,4651},{0,22,2571},{0,19,1107},{0,14,3225},{30,2,4651},{0,14,3225},{0,30,0},{0,30,0},{0,30,0},{0,15,0},{0,15,800},{0,11,317},{0,11,317},{0,7,468},{0,7,889},{0,7,549},{0,30,0},{0,30,0},{0,30,0},{0,15,0},{7,1,800},{0,11,317},{0,11,317},{0,7,468},{15,0,800}, +{0,7,468},{25,1,1568},{0,34,52},{3,24,1},{0,21,377},{25,1,1568},{47,2,1568},{0,21,377},{0,17,1570},{47,2,1568},{0,17,1570},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,56,1570},{0,38,13},{1,27,138},{0,24,305},{0,38,5419},{0,25,2819},{0,22,1187},{0,16,3659},{0,17,6013},{0,14,4061},{0,56,1570}, +{0,38,13},{1,27,122},{0,24,305},{19,0,5419},{0,25,2819},{0,22,1187},{0,16,3659},{38,0,5419},{0,16,3659},{0,36,0},{0,36,0},{0,36,0},{0,18,0},{0,18,1152},{0,14,445},{0,14,445},{0,8,697},{0,8,1270},{0,8,797},{0,36,0},{0,36,0},{0,36,0},{0,18,0},{9,0,1152},{0,14,445},{0,14,445},{0,8,697},{18,0,1152},{0,8,697},{28,1,1568},{0,38,13},{5,26,1}, +{0,24,305},{28,1,1568},{47,5,1568},{0,24,305},{0,19,1570},{47,5,1568},{0,19,1570},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,61,1609},{1,41,43},{2,29,250},{1,26,301},{0,45,5419},{0,28,2552},{0,25,820},{0,18,3377},{0,21,6243},{0,18,3953},{2,59,1569},{2,41,10},{3,29,125},{1,26,285},{22,1,5419}, +{0,28,2552},{0,25,820},{0,18,3377},{45,0,5419},{0,18,3377},{1,40,42},{1,40,42},{1,40,42},{1,21,42},{0,25,1152},{0,19,292},{0,19,292},{0,11,569},{0,11,1380},{0,10,747},{2,38,2},{2,38,2},{2,38,2},{2,20,2},{12,1,1152},{0,19,292},{0,19,292},{0,11,569},{25,0,1152},{0,11,569},{23,17,1568},{0,42,1},{7,28,1},{0,26,233},{23,17,1568},{63,0,1568},{0,26,233}, +{0,21,1568},{63,0,1568},{0,21,1568},{1,0,41},{1,0,41},{1,0,41},{1,0,41},{0,7,0},{0,7,0},{0,7,0},{0,3,1},{0,3,17},{0,3,17},{2,63,1731},{2,44,146},{3,31,441},{1,28,370},{0,50,5420},{0,33,2329},{0,27,554},{0,21,3217},{0,23,6476},{0,19,3861},{4,61,1569},{4,43,10},{5,31,125},{3,28,285},{25,1,5419},{0,33,2329},{0,27,554},{0,21,3217},{47,2,5419}, +{0,21,3217},{2,44,146},{2,44,146},{2,44,146},{2,23,146},{0,31,1152},{0,22,180},{0,22,180},{0,13,458},{0,14,1508},{0,13,747},{4,40,2},{4,40,2},{4,40,2},{4,22,2},{15,1,1152},{0,22,180},{0,22,180},{0,13,458},{31,0,1152},{0,13,458},{34,1,1568},{2,44,1},{9,30,1},{0,28,164},{34,1,1568},{63,3,1568},{0,28,164},{0,23,1568},{63,3,1568},{0,23,1568},{2,0,145}, +{2,0,145},{2,0,145},{2,0,145},{0,13,0},{0,13,0},{0,13,0},{0,6,1},{0,5,52},{0,5,52},{4,63,1977},{3,47,318},{5,33,675},{3,30,498},{0,56,5420},{0,36,2129},{0,30,338},{0,22,3012},{0,25,6733},{0,21,3825},{6,63,1569},{6,45,10},{8,33,123},{5,30,285},{28,1,5419},{0,36,2129},{0,30,338},{0,22,3012},{47,5,5419},{0,22,3012},{3,48,313},{3,48,313},{3,48,313}, +{3,26,314},{0,36,1154},{0,25,100},{0,25,100},{0,16,388},{0,16,1665},{0,14,757},{6,42,2},{6,42,2},{6,42,2},{6,24,2},{15,7,1152},{0,25,100},{0,25,100},{0,16,388},{31,3,1152},{0,16,388},{37,1,1568},{4,46,1},{11,32,2},{0,30,113},{37,1,1568},{63,6,1568},{0,30,113},{0,25,1568},{63,6,1568},{0,25,1568},{3,0,313},{3,0,313},{3,0,313},{3,0,313},{0,19,0}, +{0,19,0},{0,19,0},{0,9,1},{0,8,116},{0,8,116},{6,63,2353},{4,49,562},{6,35,1006},{3,32,715},{0,62,5420},{0,39,1961},{0,32,174},{0,24,2817},{0,28,7013},{0,24,3841},{9,63,1577},{8,47,10},{10,35,123},{7,31,290},{31,1,5419},{0,39,1961},{0,32,174},{0,24,2817},{47,8,5419},{0,24,2817},{4,52,545},{4,52,545},{4,52,545},{4,28,546},{0,42,1154},{0,29,45},{0,29,45}, +{0,18,289},{0,19,1849},{0,16,797},{8,44,2},{8,44,2},{8,44,2},{8,26,2},{15,13,1152},{0,29,45},{0,29,45},{0,18,289},{31,6,1152},{0,18,289},{40,1,1568},{6,48,1},{13,34,2},{0,33,73},{40,1,1568},{63,9,1568},{0,33,73},{0,27,1568},{63,9,1568},{0,27,1568},{4,0,545},{4,0,545},{4,0,545},{4,0,545},{0,25,0},{0,25,0},{0,25,0},{0,12,1},{0,11,212}, +{0,11,212},{8,63,2980},{6,52,920},{7,38,1444},{5,34,1012},{2,63,5504},{0,42,1814},{0,35,57},{0,27,2630},{0,31,7380},{0,25,3860},{11,63,1604},{10,49,13},{12,37,116},{10,33,292},{34,1,5419},{0,42,1814},{0,35,57},{0,27,2630},{63,3,5419},{0,27,2630},{5,57,884},{5,57,884},{5,57,884},{5,31,884},{0,49,1152},{0,33,5},{0,33,5},{0,21,221},{0,22,2091},{0,19,875},{11,45,4}, +{11,45,4},{11,45,4},{11,28,4},{24,1,1152},{0,33,5},{0,33,5},{0,21,221},{49,0,1152},{0,21,221},{44,0,1568},{8,50,1},{15,36,4},{0,35,32},{44,0,1568},{62,13,1568},{0,35,32},{0,29,1570},{62,13,1568},{0,29,1570},{5,0,884},{5,0,884},{5,0,884},{5,0,884},{0,31,1},{0,31,1},{0,31,1},{0,16,1},{0,14,349},{0,14,349},{9,63,3638},{7,55,1309},{8,39,1940}, +{6,36,1365},{3,63,5739},{0,45,1718},{0,38,17},{0,29,2514},{0,34,7760},{0,28,3900},{14,63,1636},{12,51,13},{14,39,116},{12,35,292},{37,1,5419},{0,45,1718},{0,38,17},{0,29,2514},{63,6,5419},{0,29,2514},{6,61,1252},{6,61,1252},{6,61,1252},{6,33,1253},{0,55,1152},{0,37,4},{0,37,4},{0,22,162},{0,25,2339},{0,21,989},{13,47,4},{13,47,4},{13,47,4},{13,30,4},{27,1,1152}, +{1,36,1},{1,36,1},{0,22,162},{55,0,1152},{0,22,162},{47,0,1568},{10,52,1},{17,38,1},{0,38,16},{47,0,1568},{46,24,1568},{0,38,16},{0,31,1570},{46,24,1568},{0,31,1570},{6,0,1252},{6,0,1252},{6,0,1252},{6,0,1252},{0,37,0},{0,37,0},{0,37,0},{0,19,1},{0,16,490},{0,16,490},{11,63,4328},{8,57,1644},{10,41,2360},{7,39,1656},{6,63,6079},{0,49,1644},{1,40,17}, +{0,31,2359},{0,36,7943},{0,30,3834},{16,63,1689},{14,53,13},{16,41,129},{14,37,292},{40,1,5419},{0,49,1640},{1,40,13},{0,31,2355},{63,9,5419},{0,31,2355},{8,63,1576},{8,63,1576},{8,63,1576},{7,36,1576},{1,59,1156},{1,39,13},{1,39,13},{0,25,110},{0,28,2475},{0,24,1017},{15,49,4},{15,49,4},{15,49,4},{15,32,4},{30,1,1152},{3,38,1},{3,38,1},{0,25,106},{61,0,1152}, +{0,25,106},{49,1,1568},{12,54,1},{19,40,1},{0,40,4},{49,1,1568},{46,27,1568},{0,40,4},{0,33,1568},{46,27,1568},{0,33,1568},{7,0,1576},{7,0,1576},{7,0,1576},{7,0,1576},{1,41,4},{1,41,4},{1,41,4},{1,21,4},{0,19,578},{0,19,578},{14,63,4584},{10,59,1644},{12,43,2360},{9,41,1656},{8,63,6244},{2,51,1644},{3,42,17},{1,33,2308},{0,42,7575},{0,32,3345},{19,63,1761}, +{16,55,10},{17,43,125},{16,40,290},{43,1,5419},{0,52,1592},{3,42,13},{0,33,2225},{63,12,5419},{0,33,2225},{10,63,1585},{10,63,1585},{10,63,1585},{9,38,1576},{3,61,1156},{3,41,13},{3,41,13},{2,27,110},{0,31,2211},{0,25,699},{16,52,2},{16,52,2},{16,52,2},{16,34,2},{33,1,1152},{5,40,1},{5,40,1},{0,27,61},{63,2,1152},{0,27,61},{52,1,1568},{14,56,1},{21,42,1}, +{1,42,0},{52,1,1568},{46,30,1568},{1,42,0},{0,35,1568},{46,30,1568},{0,35,1568},{9,0,1576},{9,0,1576},{9,0,1576},{9,0,1576},{3,43,4},{3,43,4},{3,43,4},{3,23,4},{0,22,410},{0,22,410},{15,63,4826},{12,62,1650},{14,46,2355},{11,43,1660},{11,63,6452},{4,54,1641},{5,44,15},{3,35,2308},{0,45,7165},{0,35,2875},{22,63,1862},{18,57,9},{20,45,126},{18,42,281},{47,0,5419}, +{0,56,1568},{6,44,10},{0,35,2091},{46,24,5419},{0,35,2091},{12,63,1606},{12,63,1606},{12,63,1606},{12,40,1571},{5,63,1155},{5,44,14},{5,44,14},{4,29,109},{0,33,1977},{0,28,424},{19,53,4},{19,53,4},{19,53,4},{19,36,4},{31,12,1152},{7,42,1},{7,42,1},{0,30,29},{62,6,1152},{0,30,29},{56,0,1568},{17,58,1},{24,44,2},{3,44,2},{56,0,1568},{62,25,1568},{3,44,2}, +{0,37,1570},{62,25,1568},{0,37,1570},{12,0,1570},{12,0,1570},{12,0,1570},{12,0,1570},{5,46,1},{5,46,1},{5,46,1},{5,25,2},{0,25,260},{0,25,260},{17,63,5096},{14,63,1652},{15,48,2358},{13,45,1660},{14,63,6668},{6,56,1641},{7,46,15},{5,37,2308},{0,47,6891},{0,36,2543},{23,63,1956},{20,59,9},{22,47,126},{20,44,281},{49,1,5419},{2,58,1568},{8,46,10},{0,38,1979},{46,27,5419}, +{0,38,1979},{14,63,1651},{14,63,1651},{14,63,1651},{14,42,1571},{8,63,1179},{7,46,14},{7,46,14},{6,31,109},{0,38,1778},{0,31,232},{21,55,4},{21,55,4},{21,55,4},{21,38,4},{31,18,1152},{9,44,1},{9,44,1},{0,32,10},{62,9,1152},{0,32,10},{59,0,1568},{19,60,1},{26,46,2},{5,46,2},{59,0,1568},{62,28,1568},{5,46,2},{0,39,1570},{62,28,1568},{0,39,1570},{14,0,1570}, +{14,0,1570},{14,0,1570},{14,0,1570},{7,48,1},{7,48,1},{7,48,1},{7,27,2},{0,28,164},{0,28,164},{20,63,5352},{17,63,1708},{18,49,2360},{15,47,1660},{15,63,6877},{8,58,1641},{9,48,14},{7,39,2308},{0,50,6576},{0,39,2215},{26,63,2052},{22,61,9},{24,49,116},{22,46,281},{52,1,5419},{4,60,1568},{9,48,13},{0,40,1907},{46,30,5419},{0,40,1907},{16,63,1697},{16,63,1697},{16,63,1697}, +{16,44,1577},{10,63,1209},{9,48,14},{9,48,14},{8,33,115},{0,42,1601},{0,33,110},{23,57,4},{23,57,4},{23,57,4},{23,40,4},{34,17,1152},{11,46,1},{11,46,1},{0,34,2},{62,12,1152},{0,34,2},{62,0,1568},{21,62,1},{28,48,1},{7,48,0},{62,0,1568},{62,31,1568},{7,48,0},{0,41,1570},{62,31,1568},{0,41,1570},{16,0,1576},{16,0,1576},{16,0,1576},{16,0,1576},{9,50,1}, +{9,50,1},{9,50,1},{9,29,2},{0,33,85},{0,33,85},{23,63,5672},{19,63,1825},{20,51,2360},{17,49,1656},{19,63,7135},{10,60,1641},{11,50,14},{9,41,2308},{0,53,6336},{0,42,1983},{29,63,2180},{24,63,9},{26,51,116},{24,48,293},{55,1,5419},{6,62,1568},{11,50,13},{0,42,1814},{47,32,5419},{0,42,1814},{19,63,1761},{19,63,1761},{19,63,1761},{17,46,1576},{12,63,1249},{11,50,14},{11,50,14}, +{10,35,115},{0,45,1449},{0,36,30},{25,59,4},{25,59,4},{25,59,4},{25,42,4},{37,17,1152},{13,48,0},{13,48,0},{1,36,2},{62,15,1152},{1,36,2},{63,4,1568},{23,63,4},{30,50,1},{9,50,0},{63,4,1568},{62,34,1568},{9,50,0},{0,43,1570},{62,34,1568},{0,43,1570},{17,0,1576},{17,0,1576},{17,0,1576},{17,0,1576},{11,52,1},{11,52,1},{11,52,1},{11,31,2},{0,36,29}, +{0,36,29},{25,63,6066},{21,63,2039},{22,54,2355},{19,51,1660},{20,63,7420},{12,62,1635},{13,52,14},{11,43,2316},{0,57,6109},{0,44,1789},{31,63,2369},{27,63,38},{28,53,115},{26,50,286},{59,0,5419},{9,63,1577},{14,52,11},{0,44,1740},{62,28,5419},{0,44,1740},{21,63,1843},{21,63,1843},{21,63,1843},{20,48,1571},{15,63,1314},{13,52,13},{13,52,13},{12,37,116},{0,48,1329},{0,39,13},{27,62,1}, +{27,62,1},{27,62,1},{27,44,2},{49,0,1152},{15,50,2},{15,50,2},{4,38,4},{62,18,1152},{4,38,4},{63,11,1568},{27,63,37},{32,52,2},{12,52,1},{63,11,1568},{47,45,1568},{12,52,1},{0,45,1576},{47,45,1568},{0,45,1576},{20,0,1570},{20,0,1570},{20,0,1570},{20,0,1570},{13,54,1},{13,54,1},{13,54,1},{13,34,1},{0,40,4},{0,40,4},{28,63,6434},{23,63,2268},{24,56,2355}, +{21,53,1660},{23,63,7668},{14,63,1652},{15,54,14},{13,45,2316},{0,61,5924},{0,47,1685},{34,63,2502},{29,63,123},{30,55,115},{28,52,286},{62,0,5419},{13,63,1627},{16,54,10},{0,47,1676},{62,31,5419},{0,47,1676},{23,63,1907},{23,63,1907},{23,63,1907},{22,50,1571},{17,63,1395},{15,54,13},{15,54,13},{14,39,116},{0,51,1241},{2,41,13},{29,63,2},{29,63,2},{29,63,2},{29,46,2},{52,0,1152}, +{17,52,1},{17,52,1},{6,40,4},{62,21,1152},{6,40,4},{55,32,1568},{31,63,97},{34,54,2},{14,54,1},{55,32,1568},{46,48,1568},{14,54,1},{0,47,1576},{46,48,1568},{0,47,1576},{22,0,1570},{22,0,1570},{22,0,1570},{22,0,1570},{15,56,1},{15,56,1},{15,56,1},{15,36,1},{1,43,1},{1,43,1},{29,63,6756},{26,63,2548},{26,58,2355},{23,55,1660},{26,63,7948},{17,63,1716},{17,56,15}, +{15,47,2316},{0,63,5773},{0,49,1638},{37,63,2694},{32,63,262},{32,57,126},{30,54,286},{63,4,5419},{17,63,1715},{18,56,10},{0,49,1634},{62,34,5419},{0,49,1634},{25,63,2018},{25,63,2018},{25,63,2018},{24,52,1571},{20,63,1483},{17,56,14},{17,56,14},{16,41,109},{0,54,1185},{4,43,13},{31,63,17},{31,63,17},{31,63,17},{31,48,2},{55,0,1152},{19,54,1},{19,54,1},{8,42,4},{62,24,1152}, +{8,42,4},{58,32,1568},{34,63,169},{36,56,2},{15,56,2},{58,32,1568},{52,48,1568},{15,56,2},{0,49,1570},{52,48,1568},{0,49,1570},{24,0,1570},{24,0,1570},{24,0,1570},{24,0,1570},{17,58,1},{17,58,1},{17,58,1},{17,37,2},{3,45,1},{3,45,1},{31,63,7218},{29,63,2924},{28,60,2355},{25,57,1660},{29,63,8260},{20,63,1884},{19,58,15},{17,49,2308},{3,63,5933},{2,51,1638},{39,63,2892}, +{34,63,445},{34,59,126},{32,56,281},{63,10,5419},{21,63,1849},{20,58,10},{0,51,1606},{62,37,5419},{0,51,1606},{28,63,2130},{28,63,2130},{28,63,2130},{26,54,1571},{23,63,1603},{19,58,14},{19,58,14},{18,43,109},{0,58,1156},{6,45,13},{33,63,40},{33,63,40},{33,63,40},{33,50,4},{58,0,1152},{21,56,1},{21,56,1},{10,44,4},{62,27,1152},{10,44,4},{61,32,1568},{38,63,274},{38,58,2}, +{17,58,2},{61,32,1568},{58,48,1568},{17,58,2},{0,51,1570},{58,48,1568},{0,51,1570},{26,0,1570},{26,0,1570},{26,0,1570},{26,0,1570},{19,60,1},{19,60,1},{19,60,1},{19,39,2},{5,47,1},{5,47,1},{34,63,7586},{31,63,3453},{30,62,2357},{28,59,1668},{31,63,8699},{23,63,2180},{21,60,21},{19,51,2316},{7,63,6224},{4,53,1634},{42,63,3131},{37,63,722},{36,62,125},{34,58,278},{55,32,5419}, +{26,63,2052},{22,60,9},{0,53,1580},{46,48,5419},{0,53,1580},{30,63,2272},{30,63,2272},{30,63,2272},{28,56,1568},{25,63,1746},{21,60,17},{21,60,17},{21,45,113},{1,61,1154},{9,47,14},{36,63,74},{36,63,74},{36,63,74},{35,52,2},{53,16,1152},{23,59,1},{23,59,1},{11,47,1},{63,30,1152},{11,47,1},{63,35,1568},{43,63,433},{40,60,4},{20,60,4},{63,35,1568},{63,49,1568},{20,60,4}, +{0,53,1576},{63,49,1568},{0,53,1576},{28,0,1568},{28,0,1568},{28,0,1568},{28,0,1568},{21,63,0},{21,63,0},{21,63,0},{21,42,0},{7,49,1},{7,49,1},{37,63,8018},{34,63,3915},{32,63,2410},{30,61,1668},{34,63,8985},{26,63,2548},{23,62,21},{21,53,2316},{12,63,6555},{6,55,1634},{43,63,3345},{40,63,1026},{38,63,129},{36,60,278},{58,32,5419},{30,63,2274},{24,62,9},{0,55,1577},{52,48,5419}, +{0,55,1577},{32,63,2406},{32,63,2406},{32,63,2406},{30,58,1568},{28,63,1890},{23,62,17},{23,62,17},{23,47,113},{3,63,1154},{11,49,12},{38,63,125},{38,63,125},{38,63,125},{37,54,2},{56,16,1152},{25,61,1},{25,61,1},{14,48,5},{62,33,1152},{14,48,5},{63,41,1568},{46,63,585},{42,62,4},{22,62,4},{63,41,1568},{63,52,1568},{22,62,4},{0,55,1576},{63,52,1568},{0,55,1576},{30,0,1568}, +{30,0,1568},{30,0,1568},{30,0,1568},{23,63,4},{23,63,4},{23,63,4},{23,44,0},{9,51,1},{9,51,1},{39,63,7700},{35,63,4026},{34,63,2514},{32,62,1611},{37,63,8485},{29,63,2424},{26,63,20},{23,55,1896},{15,63,6115},{9,56,1308},{46,63,2973},{43,63,1034},{40,63,169},{37,61,194},{63,27,4803},{32,63,2024},{27,63,1},{2,57,1253},{63,45,4803},{2,57,1253},{34,63,2514},{34,63,2514},{34,63,2514}, +{32,60,1570},{29,63,2056},{26,63,20},{26,63,20},{24,49,116},{7,63,1164},{13,51,12},{40,63,169},{40,63,169},{40,63,169},{39,56,2},{59,16,1152},{27,63,1},{27,63,1},{16,50,4},{62,36,1152},{16,50,4},{63,45,1250},{48,63,500},{45,63,1},{26,63,0},{63,45,1250},{47,62,1250},{26,63,0},{0,57,1252},{47,62,1250},{0,57,1252},{32,0,1570},{32,0,1570},{32,0,1570},{32,0,1570},{26,63,20}, +{26,63,20},{26,63,20},{25,46,0},{11,53,1},{11,53,1},{40,63,7062},{37,63,3915},{37,63,2690},{34,63,1579},{37,63,7765},{30,63,2178},{28,63,77},{26,56,1437},{18,63,5499},{11,57,918},{48,63,2504},{44,63,945},{43,63,225},{40,62,89},{63,31,4056},{35,63,1656},{30,63,9},{6,58,885},{63,47,4056},{6,58,885},{37,63,2690},{37,63,2690},{37,63,2690},{34,62,1570},{33,63,2227},{28,63,77},{28,63,77}, +{26,51,116},{11,63,1227},{15,53,12},{43,63,225},{43,63,225},{43,63,225},{41,58,2},{62,16,1152},{30,63,9},{30,63,9},{18,52,4},{62,39,1152},{18,52,4},{63,47,884},{51,63,356},{47,63,4},{32,63,0},{63,47,884},{63,55,884},{32,63,0},{0,58,884},{63,55,884},{0,58,884},{34,0,1570},{34,0,1570},{34,0,1570},{34,0,1570},{28,63,41},{28,63,41},{28,63,41},{27,48,1},{13,55,1}, +{13,55,1},{43,63,6493},{40,63,3882},{39,63,2880},{36,63,1584},{40,63,6982},{34,63,1966},{31,63,206},{28,57,971},{23,63,4927},{14,59,562},{50,63,2070},{46,63,842},{46,63,313},{43,62,25},{63,35,3318},{38,63,1326},{34,63,45},{11,59,545},{63,49,3318},{11,59,545},{39,63,2880},{39,63,2880},{39,63,2880},{36,63,1584},{34,63,2434},{31,63,206},{31,63,206},{29,53,114},{15,63,1329},{17,55,14},{46,63,313}, +{46,63,313},{46,63,313},{43,61,0},{63,21,1152},{34,63,45},{34,63,45},{19,55,1},{63,42,1152},{19,55,1},{63,51,545},{54,63,225},{51,63,1},{39,63,0},{63,51,545},{63,57,545},{39,63,0},{0,59,545},{63,57,545},{0,59,545},{36,0,1568},{36,0,1568},{36,0,1568},{36,0,1568},{31,63,85},{31,63,85},{31,63,85},{29,50,1},{15,57,1},{15,57,1},{45,63,6113},{43,63,3938},{40,63,3065}, +{38,63,1649},{43,63,6422},{35,63,1878},{34,63,365},{30,59,651},{26,63,4495},{16,60,318},{51,63,1698},{48,63,794},{48,63,394},{45,63,0},{63,39,2753},{41,63,1094},{38,63,106},{15,60,313},{47,59,2753},{15,60,313},{40,63,3065},{40,63,3065},{40,63,3065},{38,63,1649},{37,63,2610},{34,63,365},{34,63,365},{31,55,114},{20,63,1483},{19,57,14},{48,63,394},{48,63,394},{48,63,394},{45,63,0},{63,27,1152}, +{38,63,106},{38,63,106},{21,57,1},{63,45,1152},{21,57,1},{63,54,313},{55,63,130},{54,63,1},{45,63,0},{63,54,313},{62,59,313},{45,63,0},{0,60,313},{62,59,313},{0,60,313},{38,0,1568},{38,0,1568},{38,0,1568},{38,0,1568},{33,63,128},{33,63,128},{33,63,128},{31,52,1},{17,59,1},{17,59,1},{46,63,5677},{43,63,3954},{43,63,3225},{40,63,1764},{45,63,5985},{37,63,1830},{37,63,605}, +{32,60,410},{29,63,4159},{19,61,146},{53,63,1454},{51,63,770},{50,63,493},{47,63,25},{63,43,2273},{44,63,926},{41,63,194},{19,61,145},{63,53,2273},{19,61,145},{43,63,3225},{43,63,3225},{43,63,3225},{40,63,1764},{40,63,2818},{37,63,605},{37,63,605},{33,57,113},{23,63,1659},{21,59,14},{50,63,493},{50,63,493},{50,63,493},{47,63,25},{63,33,1152},{41,63,194},{41,63,194},{23,59,1},{47,56,1152}, +{23,59,1},{63,57,145},{58,63,58},{57,63,1},{50,63,1},{63,57,145},{63,60,145},{50,63,1},{0,61,145},{63,60,145},{0,61,145},{40,0,1568},{40,0,1568},{40,0,1568},{40,0,1568},{34,63,185},{34,63,185},{34,63,185},{33,54,0},{19,61,1},{19,61,1},{48,63,5379},{46,63,3978},{46,63,3449},{43,63,1924},{46,63,5542},{40,63,1870},{38,63,890},{34,61,225},{32,63,3919},{22,62,43},{54,63,1242}, +{53,63,809},{51,63,610},{49,63,101},{63,47,1878},{48,63,810},{44,63,314},{23,62,41},{63,55,1878},{23,62,41},{46,63,3449},{46,63,3449},{46,63,3449},{43,63,1924},{43,63,3058},{38,63,890},{38,63,890},{35,59,113},{27,63,1889},{23,61,14},{51,63,610},{51,63,610},{51,63,610},{49,63,101},{63,39,1152},{44,63,314},{44,63,314},{25,61,1},{47,59,1152},{25,61,1},{63,60,41},{60,63,17},{60,63,1}, +{56,63,1},{63,60,41},{62,62,41},{56,63,1},{0,62,41},{62,62,41},{0,62,41},{42,0,1568},{42,0,1568},{42,0,1568},{42,0,1568},{37,63,233},{37,63,233},{37,63,233},{35,56,0},{21,63,1},{21,63,1},{50,63,5170},{48,63,4080},{48,63,3680},{46,63,2195},{48,63,5200},{43,63,2023},{41,63,1269},{37,62,133},{35,63,3772},{25,63,17},{57,63,1088},{55,63,861},{54,63,720},{52,63,241},{63,51,1536}, +{51,63,768},{49,63,461},{28,63,0},{63,57,1536},{28,63,0},{48,63,3680},{48,63,3680},{48,63,3680},{46,63,2195},{46,63,3345},{41,63,1269},{41,63,1269},{37,61,114},{32,63,2200},{25,63,17},{54,63,720},{54,63,720},{54,63,720},{52,63,241},{61,49,1152},{49,63,461},{49,63,461},{28,63,0},{63,54,1152},{28,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0}, +{0,63,0},{63,63,0},{0,63,0},{44,0,1570},{44,0,1570},{44,0,1570},{44,0,1570},{40,63,317},{40,63,317},{40,63,317},{37,58,2},{25,63,17},{25,63,17},{51,63,4416},{50,63,3629},{48,63,3296},{47,63,2070},{50,63,4411},{46,63,1823},{43,63,1150},{39,63,50},{38,63,3132},{29,63,52},{57,63,768},{57,63,576},{56,63,505},{54,63,160},{63,53,1068},{54,63,544},{51,63,320},{33,63,1},{63,58,1068}, +{33,63,1},{48,63,3296},{48,63,3296},{48,63,3296},{47,63,2070},{46,63,2881},{43,63,1150},{43,63,1150},{39,62,42},{34,63,1846},{29,63,52},{56,63,505},{56,63,505},{56,63,505},{54,63,160},{63,48,800},{51,63,320},{51,63,320},{33,63,1},{62,56,800},{33,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{46,0,1570}, +{46,0,1570},{46,0,1570},{46,0,1570},{42,63,410},{42,63,410},{42,63,410},{39,60,2},{29,63,52},{29,63,52},{53,63,3826},{51,63,3136},{51,63,2880},{49,63,1961},{51,63,3648},{46,63,1615},{46,63,1086},{41,63,5},{41,63,2588},{32,63,116},{59,63,498},{57,63,384},{57,63,320},{56,63,116},{63,55,683},{55,63,342},{54,63,208},{39,63,1},{63,59,683},{39,63,1},{51,63,2880},{51,63,2880},{51,63,2880}, +{49,63,1961},{48,63,2448},{46,63,1086},{46,63,1086},{41,63,5},{37,63,1558},{32,63,116},{57,63,320},{57,63,320},{57,63,320},{56,63,116},{63,51,512},{54,63,208},{54,63,208},{39,63,1},{63,57,512},{39,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{48,0,1568},{48,0,1568},{48,0,1568},{48,0,1568},{45,63,514}, +{45,63,514},{45,63,514},{41,62,2},{32,63,116},{32,63,116},{54,63,3232},{53,63,2781},{53,63,2585},{51,63,1856},{53,63,3067},{48,63,1456},{48,63,1056},{43,63,10},{44,63,2140},{35,63,212},{60,63,272},{59,63,221},{59,63,185},{57,63,64},{63,57,384},{57,63,192},{55,63,125},{45,63,1},{63,60,384},{45,63,1},{53,63,2585},{53,63,2585},{53,63,2585},{51,63,1856},{51,63,2112},{48,63,1056},{48,63,1056}, +{43,63,10},{40,63,1334},{35,63,212},{59,63,185},{59,63,185},{59,63,185},{57,63,64},{63,54,288},{55,63,125},{55,63,125},{45,63,1},{62,59,288},{45,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{50,0,1568},{50,0,1568},{50,0,1568},{50,0,1568},{46,63,605},{46,63,605},{46,63,605},{43,63,10},{35,63,212}, +{35,63,212},{0,51,2665},{0,36,306},{0,26,5},{0,22,965},{0,34,5885},{0,22,3726},{0,21,1754},{0,14,4398},{0,16,6359},{0,13,4722},{0,51,2665},{0,36,306},{0,26,5},{0,22,965},{17,0,5885},{0,22,3726},{0,21,1754},{0,14,4398},{34,0,5885},{0,14,4398},{0,25,0},{0,25,0},{0,25,0},{0,12,1},{0,12,545},{0,11,212},{0,11,212},{0,6,337},{0,5,605},{0,5,374},{0,25,0}, +{0,25,0},{0,25,0},{0,12,1},{6,0,545},{0,11,212},{0,11,212},{0,6,337},{12,0,545},{0,6,337},{26,0,2665},{0,36,306},{0,26,5},{0,22,965},{26,0,2665},{51,0,2665},{0,22,965},{0,17,2665},{51,0,2665},{0,17,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,57,2665},{0,39,202},{0,29,13}, +{0,24,818},{0,39,6669},{0,25,3974},{0,22,1790},{0,16,4826},{0,18,7285},{0,16,5267},{0,57,2665},{0,39,202},{0,29,13},{0,24,818},{19,1,6669},{0,25,3974},{0,22,1790},{0,16,4826},{39,0,6669},{0,16,4826},{0,31,0},{0,31,0},{0,31,0},{0,15,1},{0,15,841},{0,12,337},{0,12,337},{0,7,493},{0,7,934},{0,7,574},{0,31,0},{0,31,0},{0,31,0},{0,15,1},{8,0,841}, +{0,12,337},{0,12,337},{0,7,493},{15,0,841},{0,7,493},{29,0,2665},{0,39,202},{1,28,2},{0,24,818},{29,0,2665},{57,0,2665},{0,24,818},{0,19,2665},{57,0,2665},{0,19,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,63,2665},{0,44,116},{1,31,66},{0,27,698},{0,42,7541},{0,28,4254},{0,25,1854}, +{0,18,5281},{0,19,8271},{0,16,5795},{0,63,2665},{0,44,116},{1,31,50},{0,27,698},{15,13,7538},{0,28,4254},{0,25,1854},{0,18,5281},{31,6,7538},{0,18,5281},{0,36,1},{0,36,1},{0,36,1},{0,18,1},{0,18,1201},{0,14,468},{0,14,468},{0,8,730},{0,8,1325},{0,8,830},{0,36,1},{0,36,1},{0,36,1},{0,18,1},{9,0,1201},{0,14,468},{0,14,468},{0,8,730},{18,0,1201}, +{0,8,730},{32,0,2665},{0,44,116},{3,30,2},{0,27,698},{32,0,2665},{63,0,2665},{0,27,698},{0,21,2665},{63,0,2665},{0,21,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,63,2781},{0,47,52},{1,33,148},{0,29,610},{0,46,8493},{0,31,4566},{0,27,1962},{0,18,5809},{0,22,9367},{0,18,6385},{2,63,2753}, +{0,47,52},{2,33,129},{0,29,610},{23,0,8493},{0,31,4566},{0,27,1962},{0,18,5809},{46,0,8493},{0,18,5809},{0,42,1},{0,42,1},{0,42,1},{0,21,1},{0,21,1625},{0,16,637},{0,16,637},{0,10,965},{0,10,1806},{0,10,1134},{0,42,1},{0,42,1},{0,42,1},{0,21,1},{11,0,1625},{0,16,637},{0,16,637},{0,10,965},{21,0,1625},{0,10,965},{35,0,2665},{0,47,52},{5,32,1}, +{0,29,610},{35,0,2665},{63,3,2665},{0,29,610},{0,23,2665},{63,3,2665},{0,23,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,63,3105},{0,51,10},{1,35,297},{0,32,481},{0,51,9670},{0,33,4965},{0,30,2120},{0,21,6413},{0,24,10749},{0,19,7191},{3,63,2989},{0,51,10},{2,36,257},{0,32,481},{25,1,9669}, +{0,33,4965},{0,30,2120},{0,21,6413},{47,2,9669},{0,21,6413},{0,49,0},{0,49,0},{0,49,0},{0,25,1},{0,25,2178},{0,19,850},{0,19,850},{0,11,1325},{0,11,2406},{0,10,1521},{0,49,0},{0,49,0},{0,49,0},{0,25,1},{12,1,2178},{0,19,850},{0,19,850},{0,11,1325},{25,0,2178},{0,11,1325},{38,0,2665},{0,51,10},{8,34,2},{0,32,481},{38,0,2665},{62,7,2665},{0,32,481}, +{0,25,2669},{62,7,2665},{0,25,2669},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,63,3437},{1,54,33},{3,37,425},{1,33,457},{0,57,9670},{0,36,4629},{0,31,1654},{0,24,6165},{0,26,11014},{0,22,7031},{6,63,3101},{2,53,10},{4,38,257},{1,33,441},{28,1,9669},{0,36,4629},{0,31,1654},{0,24,6165},{47,5,9669}, +{0,24,6165},{1,53,32},{1,53,32},{1,53,32},{1,27,32},{0,31,2178},{0,22,666},{0,22,666},{0,13,1160},{0,14,2534},{0,13,1449},{2,51,0},{2,51,0},{2,51,0},{2,27,1},{15,1,2178},{0,22,666},{0,22,666},{0,13,1160},{31,0,2178},{0,13,1160},{41,0,2665},{1,54,1},{10,36,2},{0,33,394},{41,0,2665},{62,10,2665},{0,33,394},{0,27,2669},{62,10,2665},{0,27,2669},{1,0,32}, +{1,0,32},{1,0,32},{1,0,32},{0,6,0},{0,6,0},{0,6,0},{0,3,0},{0,2,13},{0,2,13},{6,63,3917},{2,57,129},{3,40,609},{1,36,497},{0,63,9670},{0,39,4325},{0,33,1274},{0,25,5878},{0,28,11299},{0,24,6917},{8,63,3233},{4,55,10},{6,40,257},{3,35,441},{31,1,9669},{0,39,4325},{0,33,1274},{0,25,5878},{47,8,9669},{0,25,5878},{2,57,128},{2,57,128},{2,57,128}, +{2,30,129},{0,36,2180},{0,28,490},{0,28,490},{0,16,1018},{0,16,2691},{0,14,1441},{4,53,0},{4,53,0},{4,53,0},{4,29,1},{15,7,2178},{0,28,490},{0,28,490},{0,16,1018},{31,3,2178},{0,16,1018},{44,0,2665},{3,56,1},{12,38,2},{0,36,306},{44,0,2665},{62,13,2665},{0,36,306},{0,29,2669},{62,13,2665},{0,29,2669},{2,0,128},{2,0,128},{2,0,128},{2,0,128},{0,12,0}, +{0,12,0},{0,12,0},{0,6,0},{0,5,45},{0,5,45},{6,63,4541},{3,59,297},{5,42,865},{3,38,625},{2,63,9749},{0,45,4021},{0,36,914},{0,27,5581},{0,31,11611},{0,27,6877},{11,63,3377},{6,57,10},{8,42,257},{5,37,441},{34,0,9669},{0,45,4021},{0,36,914},{0,27,5581},{47,11,9669},{0,27,5581},{3,61,288},{3,61,288},{3,61,288},{3,32,288},{0,42,2180},{0,31,338},{0,31,338}, +{0,18,865},{0,19,2875},{0,16,1427},{6,55,0},{6,55,0},{6,55,0},{6,31,1},{15,13,2178},{0,31,338},{0,31,338},{0,18,865},{31,6,2178},{0,18,865},{47,0,2665},{5,58,1},{14,40,2},{0,38,225},{47,0,2665},{62,16,2665},{0,38,225},{0,31,2669},{62,16,2665},{0,31,2669},{3,0,288},{3,0,288},{3,0,288},{3,0,288},{0,18,0},{0,18,0},{0,18,0},{0,9,0},{0,8,109}, +{0,8,109},{9,63,5374},{4,62,570},{6,44,1269},{4,40,841},{3,63,10021},{0,47,3745},{0,39,593},{0,30,5294},{0,36,12029},{0,28,6810},{14,63,3558},{8,59,9},{10,44,254},{7,39,446},{37,1,9669},{0,47,3745},{0,39,593},{0,30,5294},{63,6,9669},{0,30,5294},{4,63,561},{4,63,561},{4,63,561},{4,35,546},{0,49,2178},{0,34,218},{0,34,218},{0,21,725},{0,22,3117},{0,19,1433},{8,58,1}, +{8,58,1},{8,58,1},{8,33,2},{24,1,2178},{0,34,218},{0,34,218},{0,21,725},{49,0,2178},{0,21,725},{50,0,2665},{7,60,1},{16,42,5},{0,41,157},{50,0,2665},{62,19,2665},{0,41,157},{0,33,2669},{62,19,2665},{0,33,2669},{4,0,545},{4,0,545},{4,0,545},{4,0,545},{0,25,0},{0,25,0},{0,25,0},{0,12,1},{0,11,212},{0,11,212},{11,63,6350},{6,63,905},{7,47,1678}, +{4,42,1102},{6,63,10453},{0,50,3485},{0,42,361},{0,32,5054},{0,36,12429},{0,31,6794},{15,63,3710},{10,61,9},{12,46,254},{9,41,446},{40,1,9669},{0,50,3485},{0,42,361},{0,32,5054},{63,9,9669},{0,32,5054},{6,63,901},{6,63,901},{6,63,901},{5,37,842},{0,55,2178},{0,38,125},{0,38,125},{0,24,629},{0,25,3365},{0,22,1489},{10,60,1},{10,60,1},{10,60,1},{10,35,2},{27,1,2178}, +{0,38,125},{0,38,125},{0,24,629},{55,0,2178},{0,24,629},{53,0,2665},{9,62,1},{18,44,5},{0,43,117},{53,0,2665},{62,22,2665},{0,43,117},{0,35,2669},{62,22,2665},{0,35,2669},{5,0,841},{5,0,841},{5,0,841},{5,0,841},{0,31,0},{0,31,0},{0,31,0},{0,15,1},{0,12,337},{0,12,337},{12,63,7350},{7,63,1450},{9,48,2190},{6,44,1422},{6,63,11045},{0,53,3293},{0,45,193}, +{0,35,4870},{0,39,12829},{0,32,6807},{17,63,3905},{12,63,9},{14,48,267},{11,43,446},{43,1,9669},{0,53,3293},{0,45,193},{0,35,4870},{63,12,9669},{0,35,4870},{7,63,1369},{7,63,1369},{7,63,1369},{6,40,1202},{0,61,2178},{0,42,53},{0,42,53},{0,25,520},{0,28,3645},{0,24,1573},{12,62,1},{12,62,1},{12,62,1},{12,37,2},{30,1,2178},{0,42,53},{0,42,53},{0,25,520},{61,0,2178}, +{0,25,520},{56,0,2665},{12,63,8},{20,46,5},{0,45,72},{56,0,2665},{62,25,2665},{0,45,72},{0,37,2669},{62,25,2665},{0,37,2669},{6,0,1201},{6,0,1201},{6,0,1201},{6,0,1201},{0,36,1},{0,36,1},{0,36,1},{0,18,1},{0,14,468},{0,14,468},{14,63,8614},{9,63,2129},{9,51,2758},{6,47,1822},{9,63,11765},{0,57,3125},{0,47,81},{0,36,4629},{0,42,13261},{0,35,6855},{20,63,4081}, +{15,63,49},{16,50,257},{13,45,446},{46,1,9669},{0,57,3125},{0,47,81},{0,36,4629},{63,15,9669},{0,36,4629},{9,63,1933},{9,63,1933},{9,63,1933},{7,42,1626},{1,63,2212},{0,45,13},{0,45,13},{0,27,421},{0,31,3957},{0,25,1673},{14,63,2},{14,63,2},{14,63,2},{14,39,2},{33,1,2178},{0,45,13},{0,45,13},{0,27,421},{63,2,2178},{0,27,421},{59,0,2665},{15,63,40},{22,48,2}, +{0,47,45},{59,0,2665},{62,28,2665},{0,47,45},{0,39,2669},{62,28,2665},{0,39,2669},{7,0,1625},{7,0,1625},{7,0,1625},{7,0,1625},{0,42,1},{0,42,1},{0,42,1},{0,21,1},{0,16,637},{0,16,637},{15,63,10085},{11,63,3185},{11,53,3481},{8,49,2337},{11,63,12845},{0,62,2958},{0,50,14},{0,38,4381},{0,45,13802},{0,36,6942},{23,63,4318},{17,63,154},{18,52,254},{14,48,456},{49,1,9669}, +{0,62,2958},{0,50,14},{0,38,4381},{46,27,9669},{0,38,4381},{10,63,2717},{10,63,2717},{10,63,2717},{8,45,2180},{3,63,2394},{0,49,0},{0,49,0},{0,30,317},{0,33,4314},{0,28,1811},{17,63,10},{17,63,10},{17,63,10},{16,41,1},{31,12,2178},{0,49,0},{0,49,0},{0,30,317},{62,6,2178},{0,30,317},{62,1,2665},{20,63,113},{24,50,4},{0,50,13},{62,1,2665},{63,31,2665},{0,50,13}, +{0,42,2669},{63,31,2665},{0,42,2669},{8,0,2180},{8,0,2180},{8,0,2180},{8,0,2180},{0,49,0},{0,49,0},{0,49,0},{0,25,1},{0,19,850},{0,19,850},{17,63,11454},{12,63,4143},{12,55,4141},{9,51,2805},{12,63,13803},{0,63,2871},{1,52,18},{0,41,4182},{0,50,14186},{0,39,6911},{26,63,4550},{20,63,306},{20,54,254},{17,49,446},{52,1,9669},{0,63,2870},{1,52,9},{0,41,4181},{46,30,9669}, +{0,41,4181},{12,63,3414},{12,63,3414},{12,63,3414},{9,47,2673},{3,63,2691},{1,52,14},{1,52,14},{0,32,245},{0,36,4587},{0,31,1906},{19,63,25},{19,63,25},{19,63,25},{18,43,1},{31,18,2178},{2,51,0},{2,51,0},{0,32,244},{62,9,2178},{0,32,244},{63,5,2665},{23,63,193},{26,52,4},{0,52,4},{63,5,2665},{63,34,2665},{0,52,4},{0,44,2669},{63,34,2665},{0,44,2669},{9,0,2669}, +{9,0,2669},{9,0,2669},{9,0,2669},{0,55,1},{0,55,1},{0,55,1},{0,28,2},{0,22,1009},{0,22,1009},{20,63,11990},{15,63,4575},{14,57,4141},{11,53,2805},{15,63,14195},{3,63,3015},{3,54,18},{0,43,4122},{0,53,13674},{0,41,6249},{29,63,4814},{23,63,522},{22,56,254},{19,51,446},{55,1,9669},{3,63,3006},{3,54,9},{0,43,4041},{47,32,9669},{0,43,4041},{14,63,3561},{14,63,3561},{14,63,3561}, +{11,49,2670},{6,63,2795},{3,54,14},{3,54,14},{2,34,245},{0,39,4227},{0,33,1470},{21,63,58},{21,63,58},{21,63,58},{20,45,1},{34,17,2178},{4,53,0},{4,53,0},{0,35,180},{62,12,2178},{0,35,180},{63,11,2665},{26,63,305},{28,54,4},{2,54,4},{63,11,2665},{63,37,2665},{2,54,4},{0,46,2669},{63,37,2665},{0,46,2669},{11,0,2669},{11,0,2669},{11,0,2669},{11,0,2669},{2,57,1}, +{2,57,1},{2,57,1},{2,30,2},{0,25,801},{0,25,801},{22,63,12554},{17,63,5066},{16,59,4118},{13,55,2805},{17,63,14614},{6,63,3255},{5,56,18},{1,45,4078},{0,56,13194},{0,44,5633},{31,63,5090},{26,63,802},{24,58,254},{21,53,446},{58,1,9669},{7,63,3198},{5,56,9},{0,45,3846},{53,32,9669},{0,45,3846},{15,63,3710},{15,63,3710},{15,63,3710},{13,51,2670},{9,63,2931},{5,56,14},{5,56,14}, +{4,36,245},{0,42,3899},{0,36,1110},{23,63,90},{23,63,90},{23,63,90},{22,47,1},{37,17,2178},{6,55,0},{6,55,0},{0,37,136},{62,15,2178},{0,37,136},{63,17,2665},{30,63,442},{30,56,4},{4,56,4},{63,17,2665},{63,40,2665},{4,56,4},{0,47,2677},{63,40,2665},{0,47,2677},{13,0,2669},{13,0,2669},{13,0,2669},{13,0,2669},{4,59,1},{4,59,1},{4,59,1},{4,31,5},{0,28,625}, +{0,28,625},{23,63,13130},{20,63,5706},{18,61,4122},{15,57,2807},{20,63,15102},{9,63,3625},{7,59,15},{3,47,4086},{0,59,12686},{0,47,5027},{34,63,5386},{29,63,1169},{26,60,257},{23,56,446},{62,0,9669},{12,63,3469},{7,59,11},{0,47,3658},{62,31,9669},{0,47,3658},{17,63,3905},{17,63,3905},{17,63,3905},{16,53,2677},{12,63,3112},{7,58,9},{7,58,9},{6,38,246},{0,45,3576},{0,38,755},{26,63,136}, +{26,63,136},{26,63,136},{24,49,4},{49,0,2178},{8,57,2},{8,57,2},{0,39,85},{62,18,2178},{0,39,85},{63,23,2665},{34,63,628},{32,59,2},{4,59,2},{63,23,2665},{63,43,2665},{4,59,2},{0,50,2669},{63,43,2665},{0,50,2669},{15,0,2677},{15,0,2677},{15,0,2677},{15,0,2677},{7,60,4},{7,60,4},{7,60,4},{7,33,5},{0,33,424},{0,33,424},{26,63,13650},{23,63,6378},{20,63,4122}, +{17,59,2799},{23,63,15558},{12,63,4065},{9,61,15},{6,49,4074},{0,62,12278},{0,49,4534},{36,63,5698},{30,63,1556},{28,62,257},{25,58,446},{63,4,9669},{15,63,3749},{9,61,11},{0,49,3510},{62,34,9669},{0,49,3510},{20,63,4041},{20,63,4041},{20,63,4041},{17,56,2670},{15,63,3304},{9,60,9},{9,60,9},{8,40,246},{0,50,3317},{0,41,499},{29,63,200},{29,63,200},{29,63,200},{26,51,4},{52,0,2178}, +{10,59,2},{10,59,2},{0,42,45},{62,21,2178},{0,42,45},{63,29,2665},{37,63,820},{34,61,2},{6,61,2},{63,29,2665},{63,46,2665},{6,61,2},{0,52,2669},{63,46,2665},{0,52,2669},{17,0,2669},{17,0,2669},{17,0,2669},{17,0,2669},{9,62,4},{9,62,4},{9,62,4},{9,35,5},{0,36,296},{0,36,296},{29,63,14234},{23,63,7050},{23,63,4242},{19,61,2799},{26,63,16046},{15,63,4601},{11,63,15}, +{8,51,4074},{0,63,12051},{0,50,4110},{37,63,6002},{34,63,1989},{31,63,270},{27,60,446},{63,10,9669},{20,63,4081},{11,63,11},{0,52,3374},{62,37,9669},{0,52,3374},{23,63,4241},{23,63,4241},{23,63,4241},{19,58,2670},{17,63,3485},{11,62,9},{11,62,9},{10,42,246},{0,53,3069},{0,43,306},{31,63,269},{31,63,269},{31,63,269},{28,53,4},{55,0,2178},{12,61,2},{12,61,2},{0,44,18},{62,24,2178}, +{0,44,18},{63,35,2665},{41,63,1037},{36,63,2},{8,63,2},{63,35,2665},{63,49,2665},{8,63,2},{0,54,2669},{63,49,2665},{0,54,2669},{19,0,2669},{19,0,2669},{19,0,2669},{19,0,2669},{11,63,5},{11,63,5},{11,63,5},{11,37,5},{0,40,193},{0,40,193},{31,63,13639},{26,63,7005},{25,63,4454},{21,62,2721},{28,63,15204},{17,63,4285},{13,63,24},{9,52,3457},{0,63,11020},{0,52,3109},{40,63,5381}, +{34,63,1890},{33,63,346},{29,61,296},{62,16,8712},{23,63,3636},{14,63,2},{0,53,2676},{62,39,8712},{0,53,2676},{25,63,4454},{25,63,4454},{25,63,4454},{21,60,2670},{19,63,3707},{13,63,24},{13,63,24},{12,44,246},{0,56,2853},{0,45,153},{33,63,346},{33,63,346},{33,63,346},{30,55,4},{58,0,2178},{14,63,2},{14,63,2},{0,46,10},{62,27,2178},{0,46,10},{63,39,2178},{44,63,872},{39,63,1}, +{14,63,1},{63,39,2178},{47,59,2178},{14,63,1},{0,55,2180},{47,59,2178},{0,55,2180},{21,0,2669},{21,0,2669},{21,0,2669},{21,0,2669},{13,63,20},{13,63,20},{13,63,20},{13,39,5},{0,45,104},{0,45,104},{33,63,12766},{29,63,6930},{26,63,4694},{24,63,2685},{29,63,14014},{20,63,3898},{16,63,101},{13,53,2722},{3,63,10057},{0,54,2129},{43,63,4689},{37,63,1718},{36,63,452},{32,62,164},{63,19,7578}, +{26,63,3078},{18,63,17},{0,55,1905},{63,41,7578},{0,55,1905},{26,63,4694},{26,63,4694},{26,63,4694},{24,61,2670},{22,63,3960},{16,63,101},{16,63,101},{14,47,242},{0,59,2650},{0,48,49},{36,63,452},{36,63,452},{36,63,452},{33,57,4},{53,16,2178},{18,63,17},{18,63,17},{0,49,1},{63,30,2178},{0,49,1},{63,42,1625},{46,63,650},{42,63,0},{21,63,0},{63,42,1625},{62,53,1625},{21,63,0}, +{0,56,1625},{62,53,1625},{0,56,1625},{24,0,2669},{24,0,2669},{24,0,2669},{24,0,2669},{15,63,50},{15,63,50},{15,63,50},{15,42,2},{0,48,40},{0,48,40},{34,63,11970},{31,63,6969},{29,63,4878},{26,63,2670},{31,63,13161},{21,63,3638},{18,63,229},{15,55,2146},{6,63,9313},{0,56,1410},{43,63,4097},{40,63,1614},{37,63,541},{34,62,69},{58,32,6661},{29,63,2654},{21,63,65},{0,56,1346},{52,48,6661}, +{0,56,1346},{29,63,4878},{29,63,4878},{29,63,4878},{26,63,2670},{23,63,4206},{18,63,229},{18,63,229},{15,49,242},{0,62,2506},{0,51,9},{37,63,541},{37,63,541},{37,63,541},{35,59,4},{56,16,2178},{21,63,65},{21,63,65},{2,51,1},{62,33,2178},{2,51,1},{63,45,1201},{48,63,481},{45,63,0},{27,63,0},{63,45,1201},{63,54,1201},{27,63,0},{0,57,1201},{63,54,1201},{0,57,1201},{26,0,2669}, +{26,0,2669},{26,0,2669},{26,0,2669},{17,63,85},{17,63,85},{17,63,85},{16,44,4},{0,51,8},{0,51,8},{37,63,11370},{33,63,6958},{31,63,5145},{28,63,2718},{34,63,12263},{23,63,3410},{21,63,405},{17,56,1665},{9,63,8665},{0,57,905},{46,63,3585},{43,63,1574},{40,63,637},{36,63,20},{63,27,5829},{32,63,2294},{26,63,130},{0,57,901},{63,45,5829},{0,57,901},{31,63,5145},{31,63,5145},{31,63,5145}, +{28,63,2718},{26,63,4430},{21,63,405},{21,63,405},{18,50,246},{0,63,2520},{2,53,9},{40,63,637},{40,63,637},{40,63,637},{37,61,4},{59,16,2178},{26,63,130},{26,63,130},{4,53,1},{62,36,2178},{4,53,1},{63,48,841},{51,63,337},{48,63,1},{33,63,0},{63,48,841},{62,56,841},{33,63,0},{0,58,841},{62,56,841},{0,58,841},{28,0,2669},{28,0,2669},{28,0,2669},{28,0,2669},{20,63,117}, +{20,63,117},{20,63,117},{18,46,4},{1,54,1},{1,54,1},{37,63,10794},{34,63,6895},{34,63,5374},{30,63,2813},{36,63,11574},{26,63,3274},{23,63,622},{19,57,1222},{13,63,8106},{1,59,562},{48,63,3170},{43,63,1494},{43,63,765},{39,63,4},{63,31,5082},{34,63,1998},{29,63,218},{0,59,554},{63,47,5082},{0,59,554},{34,63,5374},{34,63,5374},{34,63,5374},{30,63,2813},{29,63,4686},{23,63,622},{23,63,622}, +{20,52,246},{4,63,2714},{4,55,9},{43,63,765},{43,63,765},{43,63,765},{39,63,4},{62,16,2178},{29,63,218},{29,63,218},{6,55,1},{62,39,2178},{6,55,1},{63,51,545},{54,63,225},{51,63,1},{39,63,0},{63,51,545},{63,57,545},{39,63,0},{0,59,545},{63,57,545},{0,59,545},{30,0,2669},{30,0,2669},{30,0,2669},{30,0,2669},{22,63,180},{22,63,180},{22,63,180},{21,47,5},{3,56,1}, +{3,56,1},{40,63,10197},{37,63,6930},{36,63,5678},{32,63,2993},{37,63,10780},{29,63,3229},{26,63,945},{21,59,853},{17,63,7593},{4,60,293},{48,63,2756},{46,63,1454},{45,63,914},{41,63,37},{63,35,4344},{38,63,1740},{32,63,360},{2,60,289},{63,49,4344},{2,60,289},{36,63,5678},{36,63,5678},{36,63,5678},{32,63,2993},{31,63,5067},{26,63,945},{26,63,945},{22,55,242},{9,63,2979},{6,57,10},{45,63,914}, +{45,63,914},{45,63,914},{41,63,37},{63,21,2178},{32,63,360},{32,63,360},{8,57,1},{63,42,2178},{8,57,1},{63,54,288},{55,63,125},{54,63,0},{45,63,1},{63,54,288},{62,59,288},{45,63,1},{0,60,288},{62,59,288},{0,60,288},{32,0,2669},{32,0,2669},{32,0,2669},{32,0,2669},{25,63,250},{25,63,250},{25,63,250},{23,50,2},{5,59,2},{5,59,2},{43,63,9837},{40,63,7042},{37,63,5945}, +{34,63,3198},{40,63,10204},{32,63,3344},{29,63,1289},{24,59,589},{20,63,7225},{7,61,130},{51,63,2436},{48,63,1460},{48,63,1060},{43,63,122},{63,39,3779},{41,63,1580},{37,63,505},{6,61,129},{47,59,3779},{6,61,129},{37,63,5945},{37,63,5945},{37,63,5945},{34,63,3198},{34,63,5304},{29,63,1289},{29,63,1289},{24,57,242},{13,63,3261},{8,59,10},{48,63,1060},{48,63,1060},{48,63,1060},{43,63,122},{63,27,2178}, +{37,63,505},{37,63,505},{10,59,1},{63,45,2178},{10,59,1},{63,57,128},{58,63,53},{57,63,0},{51,63,0},{63,57,128},{63,60,128},{51,63,0},{0,61,128},{63,60,128},{0,61,128},{34,0,2669},{34,0,2669},{34,0,2669},{34,0,2669},{27,63,337},{27,63,337},{27,63,337},{25,52,2},{7,61,2},{7,61,2},{43,63,9437},{40,63,7154},{40,63,6193},{37,63,3454},{42,63,9783},{34,63,3398},{32,63,1740}, +{26,61,397},{23,63,6953},{9,62,37},{53,63,2246},{51,63,1508},{50,63,1213},{46,63,250},{63,43,3299},{44,63,1484},{40,63,673},{10,62,33},{63,53,3299},{10,62,33},{40,63,6193},{40,63,6193},{40,63,6193},{37,63,3454},{37,63,5624},{32,63,1740},{32,63,1740},{26,59,242},{17,63,3589},{10,61,10},{50,63,1213},{50,63,1213},{50,63,1213},{46,63,250},{63,33,2178},{40,63,673},{40,63,673},{12,61,1},{47,56,2178}, +{12,61,1},{63,60,32},{61,63,13},{60,63,0},{57,63,0},{63,60,32},{62,62,32},{57,63,0},{0,62,32},{62,62,32},{0,62,32},{36,0,2669},{36,0,2669},{36,0,2669},{36,0,2669},{29,63,405},{29,63,405},{29,63,405},{27,54,2},{9,63,2},{9,63,2},{46,63,9141},{43,63,7234},{43,63,6505},{40,63,3806},{43,63,9340},{37,63,3622},{34,63,2149},{27,62,277},{27,63,6772},{12,63,10},{54,63,2052}, +{53,63,1601},{51,63,1348},{48,63,436},{63,47,2904},{47,63,1452},{44,63,872},{14,63,1},{63,55,2904},{14,63,1},{43,63,6505},{43,63,6505},{43,63,6505},{40,63,3806},{40,63,5976},{34,63,2149},{34,63,2149},{28,61,242},{21,63,3955},{12,63,10},{51,63,1348},{51,63,1348},{51,63,1348},{48,63,436},{63,39,2178},{44,63,872},{44,63,872},{14,63,1},{47,59,2178},{14,63,1},{63,63,0},{63,63,0},{63,63,0}, +{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{38,0,2669},{38,0,2669},{38,0,2669},{38,0,2669},{32,63,520},{32,63,520},{32,63,520},{29,56,2},{12,63,10},{12,63,10},{46,63,8097},{46,63,6510},{43,63,5893},{41,63,3605},{46,63,8074},{37,63,3244},{37,63,2019},{30,62,129},{30,63,5794},{16,63,58},{56,63,1563},{54,63,1161},{54,63,1017},{51,63,337},{63,49,2166}, +{49,63,1083},{46,63,650},{21,63,0},{63,56,2166},{21,63,0},{43,63,5893},{43,63,5893},{43,63,5893},{41,63,3605},{40,63,5238},{37,63,2019},{37,63,2019},{30,62,113},{24,63,3401},{16,63,58},{54,63,1017},{54,63,1017},{54,63,1017},{51,63,337},{63,42,1625},{46,63,650},{46,63,650},{21,63,0},{62,53,1625},{21,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0}, +{0,63,0},{63,63,0},{0,63,0},{40,0,2665},{40,0,2665},{40,0,2665},{40,0,2665},{34,63,610},{34,63,610},{34,63,610},{31,58,0},{16,63,58},{16,63,58},{48,63,7165},{46,63,5854},{46,63,5325},{43,63,3434},{46,63,7050},{40,63,2932},{37,63,1955},{32,62,57},{32,63,5021},{20,63,117},{57,63,1137},{54,63,889},{54,63,745},{52,63,250},{63,51,1601},{51,63,801},{48,63,481},{27,63,0},{63,57,1601}, +{27,63,0},{46,63,5325},{46,63,5325},{46,63,5325},{43,63,3434},{43,63,4622},{37,63,1955},{37,63,1955},{32,62,41},{27,63,2977},{20,63,117},{54,63,745},{54,63,745},{54,63,745},{52,63,250},{63,45,1201},{48,63,481},{48,63,481},{27,63,0},{63,54,1201},{27,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{42,0,2665}, +{42,0,2665},{42,0,2665},{42,0,2665},{37,63,730},{37,63,730},{37,63,730},{33,60,1},{20,63,117},{20,63,117},{50,63,6415},{48,63,5277},{48,63,4877},{45,63,3330},{48,63,6117},{43,63,2716},{40,63,1843},{35,63,10},{35,63,4341},{23,63,205},{57,63,801},{57,63,609},{56,63,530},{54,63,169},{63,53,1121},{52,63,571},{51,63,337},{33,63,0},{63,58,1121},{33,63,0},{48,63,4877},{48,63,4877},{48,63,4877}, +{45,63,3330},{45,63,4146},{40,63,1843},{40,63,1843},{35,63,10},{30,63,2617},{23,63,205},{56,63,530},{56,63,530},{56,63,530},{54,63,169},{63,48,841},{51,63,337},{51,63,337},{33,63,0},{62,56,841},{33,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{44,0,2665},{44,0,2665},{44,0,2665},{44,0,2665},{39,63,865}, +{39,63,865},{39,63,865},{35,62,1},{23,63,205},{23,63,205},{51,63,5637},{50,63,4826},{48,63,4445},{47,63,3189},{48,63,5365},{43,63,2524},{43,63,1795},{37,63,5},{37,63,3750},{27,63,320},{59,63,531},{57,63,401},{57,63,337},{55,63,122},{63,55,726},{55,63,363},{54,63,225},{39,63,0},{63,59,726},{39,63,0},{48,63,4445},{48,63,4445},{48,63,4445},{47,63,3189},{46,63,3654},{43,63,1795},{43,63,1795}, +{37,63,5},{32,63,2329},{27,63,320},{57,63,337},{57,63,337},{57,63,337},{55,63,122},{63,51,545},{54,63,225},{54,63,225},{39,63,0},{63,57,545},{39,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{46,0,2665},{46,0,2665},{46,0,2665},{46,0,2665},{40,63,1010},{40,63,1010},{40,63,1010},{37,63,5},{27,63,320}, +{27,63,320},{3,63,10504},{0,62,1552},{0,44,169},{0,38,3866},{0,57,18065},{0,39,12152},{0,35,6099},{0,24,13992},{0,26,19423},{0,22,14922},{6,63,10216},{0,62,1552},{0,44,169},{0,38,3866},{20,17,18065},{0,39,12152},{0,35,6099},{0,24,13992},{57,0,18065},{0,24,13992},{0,35,0},{0,35,0},{0,35,0},{0,17,1},{0,17,1105},{0,14,424},{0,14,424},{0,8,666},{0,8,1217},{0,7,766},{0,35,0}, +{0,35,0},{0,35,0},{0,17,1},{9,0,1105},{0,14,424},{0,14,424},{0,8,666},{17,0,1105},{0,8,666},{34,17,9248},{0,62,1552},{0,44,169},{0,38,3866},{34,17,9248},{62,12,9248},{0,38,3866},{0,28,9256},{62,12,9248},{0,28,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{5,63,11298},{0,63,1341},{0,47,65}, +{0,38,3578},{0,61,19334},{0,42,12584},{0,36,6093},{0,24,14696},{0,28,20850},{0,24,15720},{6,63,10792},{0,63,1341},{0,47,65},{0,38,3578},{30,1,19334},{0,42,12584},{0,36,6093},{0,24,14696},{61,0,19334},{0,24,14696},{0,41,0},{0,41,0},{0,41,0},{0,20,1},{0,20,1513},{0,16,585},{0,16,585},{0,10,901},{0,9,1681},{0,8,1070},{0,41,0},{0,41,0},{0,41,0},{0,20,1},{10,1,1513}, +{0,16,585},{0,16,585},{0,10,901},{20,0,1513},{0,10,901},{37,17,9248},{0,63,1341},{0,47,65},{0,38,3578},{37,17,9248},{62,15,9248},{0,38,3578},{0,30,9256},{62,15,9248},{0,30,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,63,12200},{0,63,1325},{0,49,9},{0,41,3298},{0,63,20705},{0,42,13032},{0,38,6147}, +{0,27,15400},{0,31,22426},{0,25,16626},{9,63,11512},{0,63,1325},{0,49,9},{0,41,3298},{31,3,20689},{0,42,13032},{0,38,6147},{0,27,15400},{63,1,20689},{0,27,15400},{0,47,0},{0,47,0},{0,47,0},{0,23,1},{0,23,1985},{0,19,769},{0,19,769},{0,11,1202},{0,11,2193},{0,10,1374},{0,47,0},{0,47,0},{0,47,0},{0,23,1},{12,0,1985},{0,19,769},{0,19,769},{0,11,1202},{23,0,1985}, +{0,11,1202},{48,1,9248},{0,63,1325},{0,49,9},{0,41,3298},{48,1,9248},{63,17,9248},{0,41,3298},{0,32,9250},{63,17,9248},{0,32,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,63,13288},{0,63,1565},{0,51,4},{0,44,3050},{2,63,22214},{0,45,13496},{0,41,6227},{0,28,16225},{0,31,24090},{0,27,17528},{9,63,12344}, +{0,63,1565},{0,51,4},{0,44,3050},{34,1,22129},{0,45,13496},{0,41,6227},{0,28,16225},{63,3,22129},{0,28,16225},{0,53,0},{0,53,0},{0,53,0},{0,26,1},{0,26,2521},{0,22,985},{0,22,985},{0,13,1517},{0,11,2801},{0,11,1766},{0,53,0},{0,53,0},{0,53,0},{0,26,1},{13,1,2521},{0,22,985},{0,22,985},{0,13,1517},{26,0,2521},{0,13,1517},{51,1,9248},{1,63,1552},{1,51,0}, +{0,44,3050},{51,1,9248},{63,20,9248},{0,44,3050},{0,34,9250},{63,20,9248},{0,34,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{6,63,14818},{1,63,2106},{0,54,58},{0,47,2792},{3,63,24091},{0,50,14075},{0,42,6341},{0,30,17106},{0,33,26067},{0,28,18692},{12,63,13474},{3,63,2077},{1,54,50},{0,47,2792},{31,12,23851}, +{0,50,14075},{0,42,6341},{0,30,17106},{62,6,23851},{0,30,17106},{0,59,1},{0,59,1},{0,59,1},{0,30,0},{0,30,3200},{0,25,1258},{0,25,1258},{0,13,1940},{0,14,3542},{0,13,2229},{0,59,1},{0,59,1},{0,59,1},{0,30,0},{15,0,3200},{0,25,1258},{0,25,1258},{0,13,1940},{30,0,3200},{0,13,1940},{55,0,9248},{6,63,1885},{3,53,2},{0,47,2792},{55,0,9248},{62,24,9248},{0,47,2792}, +{0,36,9256},{62,24,9248},{0,36,9256},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{9,63,16258},{3,63,2813},{1,56,141},{0,49,2561},{4,63,25971},{0,50,14619},{0,45,6453},{0,32,17996},{0,36,27923},{0,30,19698},{12,63,14594},{3,63,2669},{2,56,122},{0,49,2561},{38,1,25472},{0,50,14619},{0,45,6453},{0,32,17996},{45,16,25472}, +{0,32,17996},{0,63,9},{0,63,9},{0,63,9},{0,33,1},{0,33,3872},{0,25,1530},{0,25,1530},{0,16,2378},{0,14,4294},{0,14,2717},{0,63,9},{0,63,9},{0,63,9},{0,33,1},{16,1,3872},{0,25,1530},{0,25,1530},{0,16,2378},{33,0,3872},{0,16,2378},{58,0,9248},{9,63,2205},{5,55,2},{0,49,2561},{58,0,9248},{62,27,9248},{0,49,2561},{0,38,9256},{62,27,9248},{0,38,9256},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{9,63,17750},{3,63,3617},{1,58,254},{0,50,2366},{6,63,27563},{0,53,14891},{0,47,6385},{0,32,18616},{0,39,29523},{0,32,20465},{15,63,15654},{6,63,3425},{2,59,206},{0,50,2366},{41,0,26744},{0,53,14891},{0,47,6385},{0,32,18616},{62,10,26744},{0,32,18616},{1,63,101},{1,63,101},{1,63,101}, +{0,36,5},{0,36,4420},{0,28,1666},{0,28,1666},{0,16,2642},{0,16,4931},{0,16,3083},{2,63,72},{2,63,72},{2,63,72},{1,35,4},{15,7,4418},{0,28,1666},{0,28,1666},{0,16,2642},{31,3,4418},{0,16,2642},{61,0,9248},{13,63,2554},{7,57,2},{0,50,2362},{61,0,9248},{62,30,9248},{0,50,2362},{0,40,9256},{62,30,9248},{0,40,9256},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,2,0}, +{0,2,0},{0,2,0},{0,1,0},{0,1,1},{0,1,1},{12,63,19046},{4,63,4598},{3,60,382},{0,52,2237},{6,63,28187},{0,59,14347},{0,50,5579},{0,35,18104},{0,39,29955},{0,33,20313},{17,63,16091},{7,63,4046},{4,61,206},{0,52,2237},{44,0,26744},{0,59,14347},{0,50,5579},{0,35,18104},{62,13,26744},{0,35,18104},{2,63,264},{2,63,264},{2,63,264},{1,38,52},{0,42,4420},{0,33,1381},{0,33,1381}, +{0,18,2405},{0,19,5115},{0,18,2981},{4,63,117},{4,63,117},{4,63,117},{3,37,4},{15,13,4418},{0,33,1381},{0,33,1381},{0,18,2405},{31,6,4418},{0,18,2405},{63,2,9248},{17,63,2938},{9,59,2},{0,52,2137},{63,2,9248},{46,41,9248},{0,52,2137},{0,42,9256},{46,41,9248},{0,42,9256},{1,0,52},{1,0,52},{1,0,52},{1,0,52},{0,8,0},{0,8,0},{0,8,0},{0,4,0},{0,3,20}, +{0,3,20},{12,63,20585},{6,63,5786},{4,63,625},{1,56,2246},{9,63,29012},{0,62,13736},{0,53,4760},{0,38,17595},{0,45,30452},{0,36,20086},{20,63,16620},{9,63,4794},{6,63,205},{1,56,2230},{39,16,26744},{0,62,13736},{0,53,4760},{0,38,17595},{62,16,26744},{0,38,17595},{4,63,589},{4,63,589},{4,63,589},{2,41,185},{0,49,4418},{0,36,1097},{0,36,1097},{0,21,2153},{0,22,5357},{0,21,2937},{6,63,169}, +{6,63,169},{6,63,169},{5,39,2},{24,1,4418},{0,36,1097},{0,36,1097},{0,21,2153},{49,0,4418},{0,21,2153},{59,16,9248},{20,63,3380},{11,62,4},{0,55,1901},{59,16,9248},{62,36,9248},{0,55,1901},{0,45,9250},{62,36,9248},{0,45,9250},{2,0,185},{2,0,185},{2,0,185},{2,0,185},{0,14,1},{0,14,1},{0,14,1},{0,7,1},{0,5,72},{0,5,72},{15,63,21605},{9,63,6850},{5,63,978}, +{2,57,2226},{11,63,29435},{0,63,12990},{0,55,3962},{0,41,16835},{0,45,30392},{0,38,19516},{22,63,16694},{12,63,5218},{9,63,225},{4,56,2130},{49,1,26259},{0,63,12990},{0,55,3962},{0,41,16835},{46,27,26259},{0,41,16835},{5,63,978},{5,63,978},{5,63,978},{3,43,370},{0,55,4418},{0,39,881},{0,39,881},{0,24,1945},{0,25,5605},{0,22,2889},{9,63,225},{9,63,225},{9,63,225},{7,41,2},{27,1,4418}, +{0,39,881},{0,39,881},{0,24,1945},{55,0,4418},{0,24,1945},{63,14,8978},{23,63,3592},{14,63,1},{0,58,1625},{63,14,8978},{46,47,8978},{0,58,1625},{0,46,8986},{46,47,8978},{0,46,8986},{3,0,369},{3,0,369},{3,0,369},{3,0,369},{0,20,0},{0,20,0},{0,20,0},{0,10,1},{0,8,136},{0,8,136},{15,63,21141},{9,63,7026},{6,63,1481},{3,58,2034},{12,63,28216},{0,63,11406},{0,56,2868}, +{0,41,14915},{0,48,28876},{0,39,17854},{23,63,15352},{15,63,4866},{11,63,306},{6,58,1746},{52,0,24371},{0,63,11406},{0,56,2868},{0,41,14915},{62,21,24371},{0,41,14915},{6,63,1481},{6,63,1481},{6,63,1481},{4,46,617},{0,61,4418},{0,45,689},{0,45,689},{0,27,1769},{0,28,5885},{0,24,2889},{11,63,306},{11,63,306},{11,63,306},{9,43,2},{30,1,4418},{0,45,689},{0,45,689},{0,27,1769},{61,0,4418}, +{0,27,1769},{55,32,7938},{26,63,3176},{16,63,1},{0,58,1129},{55,32,7938},{46,48,7938},{0,58,1129},{0,47,7946},{46,48,7938},{0,47,7946},{4,0,617},{4,0,617},{4,0,617},{4,0,617},{0,26,0},{0,26,0},{0,26,0},{0,13,1},{0,11,232},{0,11,232},{17,63,20849},{9,63,7458},{8,63,2106},{4,59,1970},{12,63,27224},{0,63,10078},{0,58,1986},{0,42,13214},{0,50,27357},{0,41,16276},{26,63,14168}, +{17,63,4556},{14,63,394},{9,58,1410},{47,14,22568},{0,63,10078},{0,58,1986},{0,42,13214},{62,23,22568},{0,42,13214},{8,63,2106},{8,63,2106},{8,63,2106},{5,48,930},{1,63,4452},{0,47,521},{0,47,521},{0,28,1600},{0,31,6197},{0,27,2921},{14,63,394},{14,63,394},{14,63,394},{11,45,2},{33,1,4418},{0,47,521},{0,47,521},{0,28,1600},{63,2,4418},{0,28,1600},{56,33,6962},{29,63,2792},{19,63,1}, +{0,59,740},{56,33,6962},{49,48,6962},{0,59,740},{0,48,6964},{49,48,6962},{0,48,6964},{5,0,929},{5,0,929},{5,0,929},{5,0,929},{0,32,0},{0,32,0},{0,32,0},{0,16,0},{0,14,360},{0,14,360},{17,63,20651},{12,63,7922},{9,63,2921},{5,60,2052},{15,63,26270},{0,63,8890},{0,59,1154},{0,44,11309},{0,53,25875},{0,42,14658},{26,63,12890},{20,63,4254},{16,63,493},{10,59,1076},{56,0,20642}, +{0,63,8890},{0,59,1154},{0,44,11309},{62,25,20642},{0,44,11309},{9,63,2921},{9,63,2921},{9,63,2921},{6,51,1360},{3,63,4634},{0,50,346},{0,50,346},{0,31,1402},{0,33,6554},{0,28,2987},{16,63,493},{16,63,493},{16,63,493},{13,48,1},{31,12,4418},{0,50,346},{0,50,346},{0,31,1402},{62,6,4418},{0,31,1402},{63,23,5941},{30,63,2386},{23,63,1},{0,61,388},{63,23,5941},{63,43,5941},{0,61,388}, +{0,49,5945},{63,43,5941},{0,49,5945},{6,0,1360},{6,0,1360},{6,0,1360},{6,0,1360},{0,39,0},{0,39,0},{0,39,0},{0,19,1},{0,16,522},{0,16,522},{20,63,20683},{12,63,8578},{11,63,3792},{7,60,2241},{15,63,25566},{1,63,8090},{0,59,642},{0,45,9834},{0,53,24595},{0,44,13350},{29,63,11794},{20,63,4030},{17,63,610},{13,59,804},{58,0,19021},{3,63,8050},{0,59,642},{0,45,9834},{62,27,19021}, +{0,45,9834},{11,63,3792},{11,63,3792},{11,63,3792},{8,53,1808},{3,63,4954},{0,55,232},{0,55,232},{0,33,1241},{0,36,6922},{0,31,3051},{17,63,610},{17,63,610},{17,63,610},{15,50,1},{31,18,4418},{0,55,232},{0,55,232},{0,33,1241},{62,9,4418},{0,33,1241},{63,26,5101},{34,63,2050},{26,63,1},{0,61,164},{63,26,5101},{62,45,5101},{0,61,164},{0,50,5105},{62,45,5101},{0,50,5105},{7,0,1808}, +{7,0,1808},{7,0,1808},{7,0,1808},{0,45,0},{0,45,0},{0,45,0},{0,22,1},{0,19,706},{0,19,706},{20,63,20715},{15,63,9258},{12,63,4729},{8,61,2553},{17,63,25067},{3,63,7474},{0,61,264},{0,47,8373},{0,56,23451},{0,45,12138},{31,63,10854},{23,63,3766},{20,63,698},{16,60,594},{60,0,17485},{6,63,7274},{0,61,264},{0,47,8373},{56,32,17485},{0,47,8373},{12,63,4729},{12,63,4729},{12,63,4729}, +{8,56,2320},{6,63,5386},{0,59,130},{0,59,130},{0,35,1076},{0,39,7322},{0,33,3161},{20,63,698},{20,63,698},{20,63,698},{17,51,2},{34,17,4418},{0,59,130},{0,59,130},{0,35,1076},{62,12,4418},{0,35,1076},{63,29,4325},{35,63,1733},{29,63,1},{0,62,41},{63,29,4325},{63,46,4325},{0,62,41},{0,51,4329},{63,46,4325},{0,51,4329},{8,0,2320},{8,0,2320},{8,0,2320},{8,0,2320},{0,50,1}, +{0,50,1},{0,50,1},{0,25,1},{0,19,914},{0,19,914},{20,63,21003},{15,63,10106},{14,63,5840},{9,62,2993},{17,63,24683},{3,63,7010},{0,62,74},{0,49,7113},{0,56,22427},{0,47,11094},{33,63,9941},{26,63,3566},{23,63,818},{17,61,402},{62,0,16034},{9,63,6562},{0,62,74},{0,49,7113},{62,31,16034},{0,49,7113},{14,63,5840},{14,63,5840},{14,63,5840},{10,58,2896},{6,63,5962},{0,62,58},{0,62,58}, +{0,38,932},{0,42,7754},{0,35,3317},{23,63,818},{23,63,818},{23,63,818},{19,53,2},{37,17,4418},{0,62,58},{0,62,58},{0,38,932},{62,15,4418},{0,38,932},{63,32,3613},{38,63,1445},{32,63,1},{0,63,0},{63,32,3613},{61,48,3613},{0,63,0},{0,52,3617},{61,48,3613},{0,52,3617},{9,0,2896},{9,0,2896},{9,0,2896},{9,0,2896},{0,56,1},{0,56,1},{0,56,1},{0,28,1},{0,22,1130}, +{0,22,1130},{23,63,21401},{17,63,11165},{15,63,7141},{10,63,3641},{20,63,24533},{6,63,6762},{0,63,81},{0,49,5745},{0,59,21333},{0,47,9996},{34,63,8897},{29,63,3396},{26,63,976},{20,61,224},{56,16,14504},{12,63,5834},{1,63,68},{0,49,5745},{62,33,14504},{0,49,5745},{15,63,7141},{15,63,7141},{15,63,7141},{11,61,3617},{9,63,6772},{0,63,81},{0,63,81},{0,41,794},{0,45,8260},{0,38,3515},{26,63,976}, +{26,63,976},{26,63,976},{21,56,0},{49,0,4418},{1,63,68},{1,63,68},{0,41,794},{62,18,4418},{0,41,794},{63,35,2888},{41,63,1156},{35,63,0},{7,63,0},{63,35,2888},{63,49,2888},{7,63,0},{0,53,2896},{63,49,2888},{0,53,2896},{11,0,3617},{11,0,3617},{11,0,3617},{11,0,3617},{0,63,0},{0,63,0},{0,63,0},{0,32,1},{0,25,1413},{0,25,1413},{23,63,21913},{17,63,12317},{17,63,8473}, +{12,63,4330},{20,63,24437},{6,63,6650},{2,63,298},{0,52,4721},{0,62,20509},{0,49,9157},{37,63,8153},{29,63,3268},{28,63,1129},{23,61,128},{63,6,13235},{15,63,5258},{6,63,145},{0,52,4721},{62,35,13235},{0,52,4721},{17,63,8473},{17,63,8473},{17,63,8473},{12,63,4330},{9,63,7636},{2,63,298},{2,63,298},{0,42,689},{0,45,8740},{0,39,3689},{28,63,1129},{28,63,1129},{28,63,1129},{23,58,0},{52,0,4418}, +{6,63,145},{6,63,145},{0,42,689},{62,21,4418},{0,42,689},{63,38,2312},{43,63,925},{38,63,0},{13,63,0},{63,38,2312},{62,51,2312},{13,63,0},{0,54,2320},{62,51,2312},{0,54,2320},{12,0,4329},{12,0,4329},{12,0,4329},{12,0,4329},{1,63,52},{1,63,52},{1,63,52},{0,34,1},{0,28,1693},{0,28,1693},{26,63,22641},{20,63,13461},{17,63,9881},{13,63,5169},{20,63,24597},{6,63,6794},{3,63,649}, +{0,52,3713},{0,62,19773},{0,50,8413},{37,63,7401},{32,63,3181},{29,63,1280},{24,62,48},{63,11,12051},{18,63,4746},{9,63,233},{0,52,3713},{47,45,12051},{0,52,3713},{17,63,9881},{17,63,9881},{17,63,9881},{13,63,5169},{12,63,8644},{3,63,649},{3,63,649},{0,45,569},{0,50,9245},{0,42,3905},{29,63,1280},{29,63,1280},{29,63,1280},{25,60,0},{55,0,4418},{9,63,233},{9,63,233},{0,45,569},{62,24,4418}, +{0,45,569},{63,41,1800},{46,63,725},{41,63,0},{19,63,0},{63,41,1800},{63,52,1800},{19,63,0},{0,55,1808},{63,52,1800},{0,55,1808},{13,0,5105},{13,0,5105},{13,0,5105},{13,0,5105},{2,63,185},{2,63,185},{2,63,185},{0,37,1},{0,31,2005},{0,31,2005},{26,63,23345},{20,63,14805},{20,63,11441},{14,63,6170},{23,63,24893},{9,63,7066},{4,63,1236},{0,53,2900},{0,63,19260},{0,52,7861},{40,63,6753}, +{34,63,3038},{32,63,1465},{27,63,9},{62,16,10952},{21,63,4298},{12,63,353},{0,53,2900},{62,39,10952},{0,53,2900},{20,63,11441},{20,63,11441},{20,63,11441},{14,63,6170},{12,63,9764},{4,63,1236},{4,63,1236},{0,47,458},{0,50,9789},{0,45,4185},{32,63,1465},{32,63,1465},{32,63,1465},{27,62,0},{58,0,4418},{12,63,353},{12,63,353},{0,47,458},{62,27,4418},{0,47,458},{63,44,1352},{48,63,544},{44,63,0}, +{25,63,0},{63,44,1352},{62,54,1352},{25,63,0},{0,56,1360},{62,54,1352},{0,56,1360},{14,0,5945},{14,0,5945},{14,0,5945},{14,0,5945},{3,63,400},{3,63,400},{3,63,400},{0,40,1},{0,33,2336},{0,33,2336},{26,63,24443},{23,63,16415},{20,63,13259},{15,63,7448},{23,63,25379},{9,63,7606},{6,63,2021},{0,55,2045},{0,63,18918},{0,53,7275},{40,63,6141},{37,63,2978},{34,63,1625},{29,63,10},{63,19,9818}, +{24,63,3870},{17,63,530},{0,55,2045},{63,41,9818},{0,55,2045},{20,63,13259},{20,63,13259},{20,63,13259},{15,63,7448},{15,63,11218},{6,63,2021},{6,63,2021},{0,49,365},{0,53,10427},{0,45,4509},{34,63,1625},{34,63,1625},{34,63,1625},{29,63,10},{53,16,4418},{17,63,530},{17,63,530},{0,49,365},{63,30,4418},{0,49,365},{63,47,925},{51,63,377},{47,63,1},{31,63,1},{63,47,925},{63,55,925},{31,63,1}, +{0,58,929},{63,55,925},{0,58,929},{15,0,6964},{15,0,6964},{15,0,6964},{15,0,6964},{3,63,769},{3,63,769},{3,63,769},{0,44,0},{0,36,2745},{0,36,2745},{29,63,25483},{23,63,17983},{22,63,15066},{17,63,8739},{23,63,26083},{12,63,8302},{6,63,2965},{0,56,1458},{0,63,18886},{0,53,6955},{43,63,5581},{40,63,2986},{37,63,1801},{32,63,65},{58,32,8901},{27,63,3558},{20,63,698},{0,56,1458},{52,48,8901}, +{0,56,1458},{22,63,15066},{22,63,15066},{22,63,15066},{17,63,8739},{15,63,12626},{6,63,2965},{6,63,2965},{0,52,277},{0,56,11011},{0,49,4833},{37,63,1801},{37,63,1801},{37,63,1801},{32,63,65},{56,16,4418},{20,63,698},{20,63,698},{0,52,277},{62,33,4418},{0,52,277},{63,50,613},{52,63,250},{50,63,0},{37,63,0},{63,50,613},{62,57,613},{37,63,0},{0,59,617},{62,57,613},{0,59,617},{16,0,7946}, +{16,0,7946},{16,0,7946},{16,0,7946},{5,63,1184},{5,63,1184},{5,63,1184},{0,47,0},{0,36,3145},{0,36,3145},{29,63,26667},{26,63,19695},{23,63,16891},{18,63,10206},{26,63,26795},{12,63,9118},{9,63,4037},{0,58,933},{0,63,19110},{0,56,6699},{46,63,5181},{40,63,2970},{40,63,2009},{34,63,160},{63,27,8069},{30,63,3310},{23,63,898},{0,58,933},{63,45,8069},{0,58,933},{23,63,16891},{23,63,16891},{23,63,16891}, +{18,63,10206},{17,63,14179},{9,63,4037},{9,63,4037},{0,55,221},{0,59,11627},{0,50,5115},{40,63,2009},{40,63,2009},{40,63,2009},{34,63,160},{59,16,4418},{23,63,898},{23,63,898},{0,55,221},{62,36,4418},{0,55,221},{63,53,365},{55,63,146},{53,63,0},{43,63,0},{63,53,365},{63,58,365},{43,63,0},{0,60,369},{63,58,365},{0,60,369},{16,0,8986},{16,0,8986},{16,0,8986},{16,0,8986},{6,63,1665}, +{6,63,1665},{6,63,1665},{0,50,1},{0,39,3545},{0,39,3545},{31,63,26643},{26,63,20231},{26,63,17731},{20,63,10867},{26,63,26531},{15,63,9546},{12,63,4889},{0,59,590},{0,63,18606},{0,56,5707},{46,63,4781},{43,63,2978},{42,63,2228},{37,63,320},{63,31,7322},{32,63,3134},{27,63,1125},{0,59,554},{63,47,7322},{0,59,554},{26,63,17731},{26,63,17731},{26,63,17731},{20,63,10867},{20,63,15043},{12,63,4889},{12,63,4889}, +{1,56,185},{0,62,11315},{0,53,4667},{42,63,2228},{42,63,2228},{42,63,2228},{37,63,320},{62,16,4418},{27,63,1125},{27,63,1125},{0,56,162},{62,39,4418},{0,56,162},{63,56,181},{57,63,73},{56,63,0},{49,63,0},{63,56,181},{62,60,181},{49,63,0},{0,61,185},{62,60,181},{0,61,185},{18,0,9250},{18,0,9250},{18,0,9250},{18,0,9250},{8,63,1972},{8,63,1972},{8,63,1972},{1,52,4},{0,42,3341}, +{0,42,3341},{34,63,26006},{29,63,20400},{28,63,18273},{23,63,11384},{29,63,25736},{17,63,9864},{12,63,5726},{2,60,366},{0,63,18111},{0,59,4452},{48,63,4436},{46,63,3050},{43,63,2465},{40,63,562},{63,35,6584},{37,63,3006},{30,63,1421},{0,61,237},{63,49,6584},{0,61,237},{28,63,18273},{28,63,18273},{28,63,18273},{23,63,11384},{23,63,15704},{12,63,5726},{12,63,5726},{3,59,189},{0,63,10886},{0,56,3924},{43,63,2465}, +{43,63,2465},{43,63,2465},{40,63,562},{63,21,4418},{30,63,1421},{30,63,1421},{0,59,100},{63,42,4418},{0,59,100},{63,59,52},{60,63,20},{59,63,1},{56,63,0},{63,59,52},{63,61,52},{56,63,0},{0,62,52},{63,61,52},{0,62,52},{20,0,9256},{20,0,9256},{20,0,9256},{20,0,9256},{9,63,2205},{9,63,2205},{9,63,2205},{4,54,1},{0,45,2925},{0,45,2925},{34,63,25526},{31,63,20721},{29,63,18700}, +{24,63,11921},{31,63,25279},{20,63,10264},{15,63,6494},{4,62,238},{4,63,17924},{0,59,3588},{51,63,4228},{48,63,3140},{46,63,2665},{41,63,833},{63,39,6019},{40,63,2958},{34,63,1693},{0,62,84},{47,59,6019},{0,62,84},{29,63,18700},{29,63,18700},{29,63,18700},{24,63,11921},{23,63,16280},{15,63,6494},{15,63,6494},{5,61,189},{0,63,10854},{0,59,3332},{46,63,2665},{46,63,2665},{46,63,2665},{41,63,833},{63,27,4418}, +{34,63,1693},{34,63,1693},{0,61,61},{63,45,4418},{0,61,61},{63,62,4},{63,63,4},{62,63,1},{62,63,0},{63,62,4},{62,63,4},{62,63,0},{0,63,4},{62,63,4},{0,63,4},{22,0,9256},{22,0,9256},{22,0,9256},{22,0,9256},{12,63,2389},{12,63,2389},{12,63,2389},{6,56,1},{0,50,2512},{0,50,2512},{37,63,24250},{34,63,19895},{31,63,18169},{26,63,11820},{34,63,23717},{20,63,10012},{17,63,6584}, +{7,62,122},{6,63,16879},{0,62,2736},{51,63,3648},{48,63,2784},{48,63,2384},{43,63,778},{63,42,5163},{41,63,2584},{37,63,1549},{0,63,9},{46,61,5163},{0,63,9},{31,63,18169},{31,63,18169},{31,63,18169},{26,63,11820},{26,63,15620},{17,63,6584},{17,63,6584},{7,62,106},{0,63,10150},{0,59,2624},{48,63,2384},{48,63,2384},{48,63,2384},{43,63,778},{63,31,3872},{37,63,1549},{37,63,1549},{0,63,9},{63,47,3872}, +{0,63,9},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{24,0,9256},{24,0,9256},{24,0,9256},{24,0,9256},{15,63,2605},{15,63,2605},{15,63,2605},{8,58,1},{0,53,2176},{0,53,2176},{37,63,22746},{34,63,18775},{34,63,17254},{29,63,11564},{34,63,21973},{23,63,9532},{20,63,6424},{9,62,57},{9,63,15607},{0,62,2032},{53,63,3058}, +{51,63,2304},{48,63,2000},{46,63,650},{63,43,4267},{43,63,2134},{40,63,1285},{4,63,0},{63,53,4267},{4,63,0},{34,63,17254},{34,63,17254},{34,63,17254},{29,63,11564},{29,63,14692},{20,63,6424},{20,63,6424},{9,62,41},{0,63,9366},{0,62,2016},{48,63,2000},{48,63,2000},{48,63,2000},{46,63,650},{55,49,3200},{40,63,1285},{40,63,1285},{4,63,0},{63,48,3200},{4,63,0},{63,63,0},{63,63,0},{63,63,0}, +{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{26,0,9256},{26,0,9256},{26,0,9256},{26,0,9256},{17,63,2836},{17,63,2836},{17,63,2836},{10,60,1},{0,59,1856},{0,59,1856},{40,63,21168},{37,63,17685},{34,63,16300},{30,63,11323},{37,63,20205},{26,63,9090},{23,63,6310},{12,63,4},{12,63,14287},{0,62,1546},{54,63,2377},{51,63,1809},{51,63,1553},{47,63,520},{61,49,3361}, +{46,63,1683},{43,63,1018},{11,63,0},{63,54,3361},{11,63,0},{34,63,16300},{34,63,16300},{34,63,16300},{30,63,11323},{29,63,13666},{23,63,6310},{23,63,6310},{12,63,4},{3,63,8686},{0,62,1530},{51,63,1553},{51,63,1553},{51,63,1553},{47,63,520},{63,37,2521},{43,63,1018},{43,63,1018},{11,63,0},{62,50,2521},{11,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0}, +{0,63,0},{63,63,0},{0,63,0},{29,0,9250},{29,0,9250},{29,0,9250},{29,0,9250},{20,63,3114},{20,63,3114},{20,63,3114},{12,62,1},{0,62,1514},{0,62,1514},{40,63,19824},{37,63,16725},{37,63,15500},{32,63,11084},{37,63,18685},{26,63,8770},{26,63,6270},{14,63,16},{15,63,13215},{0,63,1325},{54,63,1881},{54,63,1449},{51,63,1249},{48,63,409},{63,47,2649},{47,63,1329},{44,63,797},{16,63,1},{63,55,2649}, +{16,63,1},{37,63,15500},{37,63,15500},{37,63,15500},{32,63,11084},{31,63,12906},{26,63,6270},{26,63,6270},{14,63,16},{6,63,8150},{0,63,1325},{51,63,1249},{51,63,1249},{51,63,1249},{48,63,409},{63,40,1985},{44,63,797},{44,63,797},{16,63,1},{63,51,1985},{16,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{31,0,9250}, +{31,0,9250},{31,0,9250},{31,0,9250},{22,63,3393},{22,63,3393},{22,63,3393},{14,63,16},{0,63,1325},{0,63,1325},{43,63,18608},{40,63,15853},{37,63,14796},{34,63,10841},{40,63,17341},{29,63,8410},{26,63,6206},{17,63,74},{17,63,12226},{0,63,1341},{56,63,1451},{54,63,1081},{54,63,937},{51,63,305},{63,50,2017},{49,63,1011},{47,63,605},{22,63,1},{62,57,2017},{22,63,1},{37,63,14796},{37,63,14796},{37,63,14796}, +{34,63,10841},{34,63,12089},{26,63,6206},{26,63,6206},{17,63,74},{9,63,7678},{0,63,1341},{54,63,937},{54,63,937},{54,63,937},{51,63,305},{63,43,1513},{47,63,605},{47,63,605},{22,63,1},{62,53,1513},{22,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{32,0,9256},{32,0,9256},{32,0,9256},{32,0,9256},{23,63,3650}, +{23,63,3650},{23,63,3650},{17,63,74},{0,63,1341},{0,63,1341},{43,63,17392},{40,63,15021},{40,63,14060},{37,63,10673},{40,63,16013},{32,63,8261},{29,63,6166},{19,63,194},{20,63,11338},{1,63,1594},{57,63,1041},{56,63,822},{54,63,697},{52,63,234},{63,51,1473},{51,63,737},{49,63,442},{28,63,1},{63,57,1473},{28,63,1},{40,63,14060},{40,63,14060},{40,63,14060},{37,63,10673},{34,63,11401},{29,63,6166},{29,63,6166}, +{19,63,194},{12,63,7270},{1,63,1594},{54,63,697},{54,63,697},{54,63,697},{52,63,234},{63,46,1105},{49,63,442},{49,63,442},{28,63,1},{63,54,1105},{28,63,1},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{63,63,0},{0,63,0},{63,63,0},{0,63,0},{34,0,9256},{34,0,9256},{34,0,9256},{34,0,9256},{26,63,3898},{26,63,3898},{26,63,3898},{19,63,194},{1,63,1594}, +{1,63,1594}, diff --git a/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc b/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc new file mode 100644 index 0000000..fbaf988 --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_45.inc @@ -0,0 +1,481 @@ +{0,2,20},{0,1,10},{0,1,1},{0,1,9},{0,1,35},{0,1,27},{0,1,18},{0,1,61},{0,1,52},{0,0,68},{0,2,20},{0,1,10},{0,1,1},{0,1,9},{0,1,35},{0,1,27},{0,1,18},{0,1,61},{0,1,43},{0,1,61},{0,1,1},{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,1}, +{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,2,20},{0,1,10},{0,1,1},{0,1,9},{0,2,20},{0,1,18},{0,1,9},{0,1,36},{0,1,18},{0,1,36},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,4,56},{0,3,38},{0,2,52}, +{0,2,36},{0,4,56},{0,3,35},{0,2,0},{0,2,52},{0,2,88},{0,1,78},{0,4,56},{0,3,38},{0,2,52},{0,2,36},{1,0,52},{0,3,35},{0,2,0},{0,2,52},{1,1,51},{0,2,52},{0,3,37},{0,3,37},{0,3,37},{0,2,36},{0,3,10},{0,2,0},{0,2,0},{0,1,5},{0,1,35},{0,1,14},{0,3,37},{0,3,37},{0,3,37},{0,2,36},{0,3,10}, +{0,2,0},{0,2,0},{0,1,5},{1,0,16},{0,1,5},{1,1,18},{0,3,2},{0,2,16},{0,2,0},{1,1,18},{2,0,20},{0,2,0},{0,2,36},{2,0,20},{0,2,36},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,2,0},{0,2,0},{0,2,0},{0,1,1},{0,1,10},{0,1,10},{1,4,88},{1,3,78},{1,3,69},{1,3,77},{1,3,115},{0,4,88},{0,3,98}, +{0,3,101},{0,4,72},{0,3,38},{1,4,24},{1,3,14},{1,3,5},{1,3,13},{1,3,51},{0,4,24},{0,3,34},{0,3,37},{3,0,52},{0,3,37},{1,3,69},{1,3,69},{1,3,69},{1,2,72},{1,2,72},{1,2,72},{1,2,72},{1,2,72},{0,3,11},{0,2,24},{1,3,5},{1,3,5},{1,3,5},{1,2,8},{1,2,8},{1,2,8},{1,2,8},{1,2,8},{1,2,8}, +{1,2,8},{0,7,18},{1,3,10},{1,3,1},{0,3,9},{0,7,18},{1,3,18},{0,3,9},{0,3,36},{1,3,18},{0,3,36},{1,0,68},{1,0,68},{1,0,68},{1,0,68},{1,1,65},{1,1,65},{1,1,65},{0,3,65},{0,3,2},{0,3,2},{1,6,56},{1,5,38},{1,4,53},{1,4,37},{1,6,56},{1,5,35},{1,4,1},{1,4,66},{0,5,60},{0,4,70},{1,6,56}, +{1,5,38},{1,4,53},{1,4,37},{0,9,51},{1,5,35},{1,4,1},{0,4,54},{2,3,51},{0,4,54},{1,5,37},{1,5,37},{1,5,37},{1,4,36},{1,5,10},{1,4,0},{1,4,0},{1,3,5},{0,5,11},{1,3,14},{1,5,37},{1,5,37},{1,5,37},{1,4,36},{0,8,8},{1,4,0},{1,4,0},{1,3,5},{4,0,8},{1,3,5},{2,3,18},{1,5,2},{1,4,17}, +{1,4,1},{2,3,18},{4,1,18},{1,4,1},{0,4,50},{4,1,18},{0,4,50},{1,0,36},{1,0,36},{1,0,36},{1,0,36},{1,4,0},{1,4,0},{1,4,0},{1,3,1},{1,3,10},{1,3,10},{2,6,88},{2,5,78},{2,5,69},{2,5,77},{2,5,115},{2,5,107},{2,5,98},{1,5,117},{1,6,60},{1,5,36},{2,6,24},{2,5,14},{2,5,5},{2,5,13},{3,2,51}, +{1,6,35},{2,5,34},{1,5,36},{1,6,51},{1,5,36},{2,5,69},{2,5,69},{2,5,69},{2,4,72},{2,4,72},{2,4,72},{2,4,72},{2,4,72},{1,5,16},{1,5,36},{2,5,5},{2,5,5},{2,5,5},{2,4,8},{3,1,8},{2,4,8},{2,4,8},{2,4,8},{3,3,8},{2,4,8},{3,3,20},{2,5,10},{2,5,1},{2,5,9},{3,3,20},{2,5,18},{2,5,9}, +{0,5,36},{2,5,18},{0,5,36},{2,0,68},{2,0,68},{2,0,68},{2,0,68},{2,3,68},{2,3,68},{2,3,68},{2,4,68},{1,5,0},{1,5,0},{2,8,56},{2,7,38},{2,6,52},{2,6,36},{2,8,56},{2,7,35},{2,6,0},{2,6,52},{1,7,76},{1,6,70},{2,8,56},{2,7,38},{2,6,52},{2,6,36},{4,1,51},{2,7,35},{2,6,0},{1,6,45},{3,5,51}, +{1,6,45},{2,7,37},{2,7,37},{2,7,37},{2,6,36},{2,7,10},{2,6,0},{2,6,0},{2,5,5},{1,7,12},{2,5,14},{2,7,37},{2,7,37},{2,7,37},{2,6,36},{4,0,8},{2,6,0},{2,6,0},{2,5,5},{1,7,8},{2,5,5},{3,5,18},{2,7,2},{2,6,16},{2,6,0},{3,5,18},{0,9,18},{2,6,0},{0,6,36},{0,9,18},{0,6,36},{2,0,36}, +{2,0,36},{2,0,36},{2,0,36},{2,6,0},{2,6,0},{2,6,0},{2,5,1},{1,7,8},{1,7,8},{3,8,88},{3,7,78},{3,7,69},{3,7,77},{3,7,115},{2,8,88},{2,7,98},{2,7,101},{1,9,67},{2,7,38},{3,8,24},{3,7,14},{3,7,5},{3,7,13},{3,7,51},{2,8,24},{2,7,34},{2,7,37},{8,0,51},{2,7,37},{3,7,69},{3,7,69},{3,7,69}, +{3,6,72},{3,6,72},{3,6,72},{3,6,72},{3,6,72},{2,7,11},{2,6,24},{3,7,5},{3,7,5},{3,7,5},{3,6,8},{3,6,8},{3,6,8},{3,6,8},{3,6,8},{3,6,8},{3,6,8},{5,1,18},{3,7,10},{3,7,1},{2,7,9},{5,1,18},{3,7,18},{2,7,9},{0,7,36},{3,7,18},{0,7,36},{3,0,68},{3,0,68},{3,0,68},{3,0,68},{3,5,65}, +{3,5,65},{3,5,65},{2,7,65},{2,7,2},{2,7,2},{3,10,56},{3,9,38},{3,8,53},{3,8,37},{3,10,56},{3,9,35},{3,8,1},{3,8,66},{2,9,60},{2,8,70},{3,10,56},{3,9,38},{3,8,53},{3,8,37},{5,3,51},{3,9,35},{3,8,1},{2,8,54},{4,7,51},{2,8,54},{3,9,37},{3,9,37},{3,9,37},{3,8,36},{3,9,10},{3,8,0},{3,8,0}, +{3,7,5},{2,9,11},{3,7,14},{3,9,37},{3,9,37},{3,9,37},{3,8,36},{5,2,8},{3,8,0},{3,8,0},{3,7,5},{8,1,8},{3,7,5},{4,7,18},{3,9,2},{3,8,17},{3,8,1},{4,7,18},{8,2,18},{3,8,1},{0,8,50},{8,2,18},{0,8,50},{3,0,36},{3,0,36},{3,0,36},{3,0,36},{3,8,0},{3,8,0},{3,8,0},{3,7,1},{3,7,10}, +{3,7,10},{4,10,88},{4,9,78},{4,9,69},{4,9,77},{4,9,115},{4,9,107},{4,9,98},{3,9,117},{3,10,60},{3,9,36},{4,10,24},{4,9,14},{4,9,5},{4,9,13},{5,6,51},{3,10,35},{4,9,34},{3,9,36},{10,1,51},{3,9,36},{4,9,69},{4,9,69},{4,9,69},{4,8,72},{4,8,72},{4,8,72},{4,8,72},{4,8,72},{3,9,16},{3,9,36},{4,9,5}, +{4,9,5},{4,9,5},{4,8,8},{5,5,8},{4,8,8},{4,8,8},{4,8,8},{5,7,8},{4,8,8},{7,0,18},{4,9,10},{4,9,1},{4,9,9},{7,0,18},{4,9,18},{4,9,9},{0,9,36},{4,9,18},{0,9,36},{4,0,68},{4,0,68},{4,0,68},{4,0,68},{4,7,68},{4,7,68},{4,7,68},{4,8,68},{3,9,0},{3,9,0},{4,12,56},{4,11,38},{4,10,52}, +{4,10,36},{4,12,56},{4,11,35},{4,10,0},{4,10,52},{3,11,76},{3,10,70},{4,12,56},{4,11,38},{4,10,52},{4,10,36},{7,2,51},{4,11,35},{4,10,0},{3,10,45},{12,0,51},{3,10,45},{4,11,37},{4,11,37},{4,11,37},{4,10,36},{4,11,10},{4,10,0},{4,10,0},{4,9,5},{3,11,12},{4,9,14},{4,11,37},{4,11,37},{4,11,37},{4,10,36},{7,1,8}, +{4,10,0},{4,10,0},{4,9,5},{10,2,8},{4,9,5},{5,9,18},{4,11,2},{4,10,16},{4,10,0},{5,9,18},{10,3,18},{4,10,0},{0,10,36},{10,3,18},{0,10,36},{4,0,36},{4,0,36},{4,0,36},{4,0,36},{4,10,0},{4,10,0},{4,10,0},{4,9,1},{3,11,8},{3,11,8},{5,12,88},{5,11,78},{5,11,69},{5,11,77},{5,11,115},{4,12,88},{4,11,98}, +{4,11,101},{3,13,67},{4,11,38},{5,12,24},{5,11,14},{5,11,5},{5,11,13},{5,11,51},{4,12,24},{4,11,34},{4,11,37},{11,3,51},{4,11,37},{5,11,69},{5,11,69},{5,11,69},{5,10,72},{5,10,72},{5,10,72},{5,10,72},{5,10,72},{4,11,11},{4,10,24},{5,11,5},{5,11,5},{5,11,5},{5,10,8},{5,10,8},{5,10,8},{5,10,8},{5,10,8},{12,1,8}, +{5,10,8},{8,0,18},{5,11,10},{5,11,1},{4,11,9},{8,0,18},{12,2,18},{4,11,9},{0,11,36},{12,2,18},{0,11,36},{5,0,68},{5,0,68},{5,0,68},{5,0,68},{5,9,65},{5,9,65},{5,9,65},{4,11,65},{4,11,2},{4,11,2},{5,14,56},{5,13,38},{5,12,53},{5,12,37},{5,14,56},{5,13,35},{5,12,1},{5,12,66},{4,13,60},{4,12,70},{5,14,56}, +{5,13,38},{5,12,53},{5,12,37},{8,2,51},{5,13,35},{5,12,1},{4,12,54},{13,2,51},{4,12,54},{5,13,37},{5,13,37},{5,13,37},{5,12,36},{5,13,10},{5,12,0},{5,12,0},{5,11,5},{4,13,11},{5,11,14},{5,13,37},{5,13,37},{5,13,37},{5,12,36},{8,1,8},{5,12,0},{5,12,0},{5,11,5},{10,5,8},{5,11,5},{6,11,18},{5,13,2},{5,12,17}, +{5,12,1},{6,11,18},{15,0,18},{5,12,1},{0,12,50},{15,0,18},{0,12,50},{5,0,36},{5,0,36},{5,0,36},{5,0,36},{5,12,0},{5,12,0},{5,12,0},{5,11,1},{5,11,10},{5,11,10},{6,14,88},{6,13,78},{6,13,69},{6,13,77},{6,13,115},{6,13,107},{6,13,98},{5,13,117},{5,14,60},{5,13,36},{6,14,24},{6,13,14},{6,13,5},{6,13,13},{8,5,51}, +{5,14,35},{6,13,34},{5,13,36},{12,5,51},{5,13,36},{6,13,69},{6,13,69},{6,13,69},{6,12,72},{6,12,72},{6,12,72},{6,12,72},{6,12,72},{5,13,16},{5,13,36},{6,13,5},{6,13,5},{6,13,5},{6,12,8},{8,4,8},{6,12,8},{6,12,8},{6,12,8},{14,2,8},{6,12,8},{3,24,18},{6,13,10},{6,13,1},{6,13,9},{3,24,18},{14,3,18},{6,13,9}, +{0,13,36},{14,3,18},{0,13,36},{6,0,68},{6,0,68},{6,0,68},{6,0,68},{6,11,68},{6,11,68},{6,11,68},{6,12,68},{5,13,0},{5,13,0},{6,16,56},{6,15,38},{6,14,52},{6,14,36},{6,16,56},{6,15,35},{6,14,0},{6,14,52},{5,15,76},{5,14,70},{6,16,56},{6,15,38},{6,14,52},{6,14,36},{3,26,51},{6,15,35},{6,14,0},{5,14,45},{15,3,51}, +{5,14,45},{6,15,37},{6,15,37},{6,15,37},{6,14,36},{6,15,10},{6,14,0},{6,14,0},{6,13,5},{5,15,12},{6,13,14},{6,15,37},{6,15,37},{6,15,37},{6,14,36},{3,25,8},{6,14,0},{6,14,0},{6,13,5},{12,6,8},{6,13,5},{9,5,18},{6,15,2},{6,14,16},{6,14,0},{9,5,18},{12,7,18},{6,14,0},{0,14,36},{12,7,18},{0,14,36},{6,0,36}, +{6,0,36},{6,0,36},{6,0,36},{6,14,0},{6,14,0},{6,14,0},{6,13,1},{5,15,8},{5,15,8},{7,16,88},{7,15,78},{7,15,69},{7,15,77},{7,15,115},{6,16,88},{6,15,98},{6,15,101},{5,17,67},{6,15,38},{7,16,24},{7,15,14},{7,15,5},{7,15,13},{11,0,51},{6,16,24},{6,15,34},{6,15,37},{13,7,51},{6,15,37},{7,15,69},{7,15,69},{7,15,69}, +{7,14,72},{7,14,72},{7,14,72},{7,14,72},{7,14,72},{6,15,11},{6,14,24},{7,15,5},{7,15,5},{7,15,5},{7,14,8},{9,6,8},{7,14,8},{7,14,8},{7,14,8},{14,5,8},{7,14,8},{10,4,18},{7,15,10},{7,15,1},{6,15,9},{10,4,18},{14,6,18},{6,15,9},{0,15,36},{14,6,18},{0,15,36},{7,0,68},{7,0,68},{7,0,68},{7,0,68},{7,13,65}, +{7,13,65},{7,13,65},{6,15,65},{6,15,2},{6,15,2},{7,18,56},{7,17,38},{7,16,53},{7,16,37},{7,18,56},{7,17,35},{7,16,1},{7,16,66},{6,17,60},{6,16,70},{7,18,56},{7,17,38},{7,16,53},{7,16,37},{10,6,51},{7,17,35},{7,16,1},{6,16,54},{15,6,51},{6,16,54},{7,17,37},{7,17,37},{7,17,37},{7,16,36},{7,17,10},{7,16,0},{7,16,0}, +{7,15,5},{6,17,11},{7,15,14},{7,17,37},{7,17,37},{7,17,37},{7,16,36},{10,5,8},{7,16,0},{7,16,0},{7,15,5},{12,9,8},{7,15,5},{12,0,18},{7,17,2},{7,16,17},{7,16,1},{12,0,18},{12,10,18},{7,16,1},{0,16,50},{12,10,18},{0,16,50},{7,0,36},{7,0,36},{7,0,36},{7,0,36},{7,16,0},{7,16,0},{7,16,0},{7,15,1},{7,15,10}, +{7,15,10},{7,21,326},{7,19,322},{8,17,392},{7,17,322},{7,21,137},{7,18,116},{7,17,133},{7,17,117},{7,18,60},{7,17,36},{8,16,118},{8,16,134},{8,17,136},{8,17,136},{10,9,51},{7,18,35},{7,17,52},{7,17,36},{14,9,51},{7,17,36},{7,20,307},{7,20,307},{7,20,307},{7,18,307},{7,20,91},{7,18,91},{7,18,91},{7,16,110},{7,17,16},{7,17,36},{8,15,101}, +{8,15,101},{8,15,101},{8,16,101},{10,8,8},{7,18,10},{7,18,10},{7,16,29},{11,12,8},{7,16,29},{12,3,18},{7,19,16},{8,17,36},{7,17,16},{12,3,18},{11,13,18},{7,17,16},{0,17,36},{11,13,18},{0,17,36},{7,0,306},{7,0,306},{7,0,306},{7,0,306},{7,19,81},{7,19,81},{7,19,81},{7,17,81},{7,17,0},{7,17,0},{8,19,88},{8,18,78},{8,18,69}, +{8,18,77},{8,18,115},{8,18,107},{8,18,98},{8,17,136},{7,19,76},{7,18,70},{8,19,24},{8,18,14},{8,18,5},{8,18,13},{9,15,51},{8,18,43},{8,18,34},{7,18,45},{5,22,51},{7,18,45},{8,18,69},{8,18,69},{8,18,69},{8,17,72},{8,17,72},{8,17,72},{8,17,72},{8,17,72},{7,19,12},{7,18,70},{8,18,5},{8,18,5},{8,18,5},{8,17,8},{9,14,8}, +{8,17,8},{8,17,8},{8,17,8},{14,10,8},{8,17,8},{11,9,18},{8,18,10},{8,18,1},{8,18,9},{11,9,18},{14,11,18},{8,18,9},{0,18,36},{14,11,18},{0,18,36},{8,0,68},{8,0,68},{8,0,68},{8,0,68},{8,16,65},{8,16,65},{8,16,65},{8,17,68},{7,19,8},{7,19,8},{8,21,56},{8,20,38},{8,19,52},{8,19,36},{8,21,56},{8,20,35},{8,19,0}, +{8,19,52},{7,21,67},{8,18,78},{8,21,56},{8,20,38},{8,19,52},{8,19,36},{13,4,51},{8,20,35},{8,19,0},{8,19,52},{15,11,51},{8,19,52},{8,20,37},{8,20,37},{8,20,37},{8,19,36},{8,20,10},{8,19,0},{8,19,0},{8,18,5},{8,18,35},{8,18,14},{8,20,37},{8,20,37},{8,20,37},{8,19,36},{11,10,8},{8,19,0},{8,19,0},{8,18,5},{5,23,8}, +{8,18,5},{12,8,18},{8,20,2},{8,19,16},{8,19,0},{12,8,18},{11,16,18},{8,19,0},{0,19,36},{11,16,18},{0,19,36},{8,0,36},{8,0,36},{8,0,36},{8,0,36},{8,19,0},{8,19,0},{8,19,0},{8,18,1},{8,18,10},{8,18,10},{9,21,88},{9,20,78},{9,20,70},{9,20,78},{9,20,115},{8,21,88},{8,20,99},{8,20,115},{8,21,72},{8,20,52},{9,21,24}, +{9,20,14},{9,20,6},{9,20,14},{15,0,51},{8,21,24},{8,20,35},{8,20,51},{12,16,51},{8,20,51},{9,20,69},{9,20,69},{9,20,69},{9,19,72},{9,19,72},{9,19,72},{9,19,72},{9,19,72},{8,20,11},{8,19,24},{9,20,5},{9,20,5},{9,20,5},{9,19,8},{12,9,8},{9,19,8},{9,19,8},{9,19,8},{14,13,8},{9,19,8},{14,4,18},{9,20,10},{9,20,2}, +{8,20,10},{14,4,18},{14,14,18},{8,20,10},{0,20,50},{14,14,18},{0,20,50},{9,0,68},{9,0,68},{9,0,68},{9,0,68},{9,18,65},{9,18,65},{9,18,65},{8,20,65},{8,20,2},{8,20,2},{9,24,70},{9,22,58},{9,21,75},{9,21,51},{9,23,52},{9,22,25},{9,21,3},{9,21,46},{8,23,68},{8,21,70},{9,24,69},{9,22,57},{9,21,74},{9,21,50},{15,3,51}, +{9,22,24},{9,21,2},{8,21,45},{11,19,51},{8,21,45},{9,23,51},{9,23,51},{9,23,51},{9,21,51},{9,22,9},{9,21,3},{9,21,3},{9,20,9},{8,22,12},{9,20,12},{9,23,50},{9,23,50},{9,23,50},{9,21,50},{15,2,8},{9,21,2},{9,21,2},{9,20,8},{13,16,8},{9,20,8},{14,7,18},{9,22,8},{9,21,25},{9,21,1},{14,7,18},{13,17,18},{9,21,1}, +{0,21,36},{13,17,18},{0,21,36},{9,0,50},{9,0,50},{9,0,50},{9,0,50},{9,21,2},{9,21,2},{9,21,2},{9,20,5},{9,20,8},{9,20,8},{10,23,88},{10,22,78},{10,22,69},{10,22,77},{10,22,115},{10,22,107},{10,22,98},{9,22,117},{9,23,60},{9,22,36},{10,23,24},{10,22,14},{10,22,5},{10,22,13},{11,19,51},{9,23,35},{10,22,34},{9,22,36},{9,23,51}, +{9,22,36},{10,22,69},{10,22,69},{10,22,69},{10,21,72},{10,21,72},{10,21,72},{10,21,72},{10,21,72},{9,22,16},{9,22,36},{10,22,5},{10,22,5},{10,22,5},{10,21,8},{11,18,8},{10,21,8},{10,21,8},{10,21,8},{10,21,8},{10,21,8},{13,13,18},{10,22,10},{10,22,1},{10,22,9},{13,13,18},{15,16,18},{10,22,9},{0,22,36},{15,16,18},{0,22,36},{10,0,68}, +{10,0,68},{10,0,68},{10,0,68},{10,20,65},{10,20,65},{10,20,65},{10,21,68},{9,22,0},{9,22,0},{10,25,56},{10,24,38},{10,23,52},{10,23,36},{10,25,56},{10,24,35},{10,23,0},{10,23,52},{9,24,63},{9,23,70},{10,25,56},{10,24,38},{10,23,52},{10,23,36},{15,8,51},{10,24,35},{10,23,0},{9,23,45},{11,22,51},{9,23,45},{10,24,37},{10,24,37},{10,24,37}, +{10,23,36},{10,24,10},{10,23,0},{10,23,0},{10,22,5},{9,24,14},{10,22,14},{10,24,37},{10,24,37},{10,24,37},{10,23,36},{13,14,8},{10,23,0},{10,23,0},{10,22,5},{8,25,8},{10,22,5},{14,12,18},{10,24,2},{10,23,16},{10,23,0},{14,12,18},{13,20,18},{10,23,0},{0,23,36},{13,20,18},{0,23,36},{10,0,36},{10,0,36},{10,0,36},{10,0,36},{10,23,0}, +{10,23,0},{10,23,0},{10,22,1},{10,22,10},{10,22,10},{11,25,88},{11,24,78},{11,24,70},{11,24,78},{11,24,115},{10,25,88},{10,24,99},{10,24,115},{9,26,67},{10,24,52},{11,25,24},{11,24,14},{11,24,6},{11,24,14},{14,14,51},{10,25,24},{10,24,35},{10,24,51},{14,20,51},{10,24,51},{11,24,69},{11,24,69},{11,24,69},{11,23,72},{11,23,72},{11,23,72},{11,23,72}, +{11,23,72},{10,24,11},{10,23,24},{11,24,5},{11,24,5},{11,24,5},{11,23,8},{14,13,8},{11,23,8},{11,23,8},{11,23,8},{11,23,8},{11,23,8},{13,18,18},{11,24,10},{11,24,2},{10,24,10},{13,18,18},{11,24,18},{10,24,10},{0,24,50},{11,24,18},{0,24,50},{11,0,68},{11,0,68},{11,0,68},{11,0,68},{11,22,65},{11,22,65},{11,22,65},{10,24,65},{10,24,2}, +{10,24,2},{11,28,70},{11,26,58},{11,25,75},{11,25,51},{11,27,52},{11,26,25},{11,25,3},{11,25,46},{10,27,68},{10,25,70},{11,28,69},{11,26,57},{11,25,74},{11,25,50},{14,17,51},{11,26,24},{11,25,2},{10,25,45},{13,23,51},{10,25,45},{11,27,51},{11,27,51},{11,27,51},{11,25,51},{11,26,9},{11,25,3},{11,25,3},{11,24,9},{10,26,12},{11,24,12},{11,27,50}, +{11,27,50},{11,27,50},{11,25,50},{14,16,8},{11,25,2},{11,25,2},{11,24,8},{15,20,8},{11,24,8},{13,21,18},{11,26,8},{11,25,25},{11,25,1},{13,21,18},{15,21,18},{11,25,1},{0,25,36},{15,21,18},{0,25,36},{11,0,50},{11,0,50},{11,0,50},{11,0,50},{11,25,2},{11,25,2},{11,25,2},{11,24,5},{11,24,8},{11,24,8},{12,27,88},{12,26,78},{12,26,69}, +{12,26,77},{12,26,115},{12,26,107},{12,26,98},{11,26,117},{11,27,60},{11,26,36},{12,27,24},{12,26,14},{12,26,5},{12,26,13},{13,23,51},{11,27,35},{12,26,34},{11,26,36},{11,27,51},{11,26,36},{12,26,69},{12,26,69},{12,26,69},{12,25,72},{12,25,72},{12,25,72},{12,25,72},{12,25,72},{11,26,16},{11,26,36},{12,26,5},{12,26,5},{12,26,5},{12,25,8},{13,22,8}, +{12,25,8},{12,25,8},{12,25,8},{12,25,8},{12,25,8},{15,17,18},{12,26,10},{12,26,1},{12,26,9},{15,17,18},{12,26,18},{12,26,9},{0,26,36},{12,26,18},{0,26,36},{12,0,68},{12,0,68},{12,0,68},{12,0,68},{12,24,65},{12,24,65},{12,24,65},{12,25,68},{11,26,0},{11,26,0},{12,29,56},{12,28,38},{12,27,52},{12,27,36},{12,29,56},{12,28,35},{12,27,0}, +{12,27,52},{11,28,63},{11,27,70},{12,29,56},{12,28,38},{12,27,52},{12,27,36},{15,19,51},{12,28,35},{12,27,0},{11,27,45},{13,26,51},{11,27,45},{12,28,37},{12,28,37},{12,28,37},{12,27,36},{12,28,10},{12,27,0},{12,27,0},{12,26,5},{11,28,14},{12,26,14},{12,28,37},{12,28,37},{12,28,37},{12,27,36},{15,18,8},{12,27,0},{12,27,0},{12,26,5},{10,29,8}, +{12,26,5},{13,26,18},{12,28,2},{12,27,16},{12,27,0},{13,26,18},{15,24,18},{12,27,0},{0,27,36},{15,24,18},{0,27,36},{12,0,36},{12,0,36},{12,0,36},{12,0,36},{12,27,0},{12,27,0},{12,27,0},{12,26,1},{12,26,10},{12,26,10},{13,29,88},{13,28,78},{13,28,70},{13,28,78},{13,28,115},{12,29,88},{12,28,99},{12,28,115},{11,30,67},{12,28,52},{13,29,24}, +{13,28,14},{13,28,6},{13,28,14},{13,28,51},{12,29,24},{12,28,35},{12,28,51},{11,30,51},{12,28,51},{13,28,69},{13,28,69},{13,28,69},{13,27,72},{13,27,72},{13,27,72},{13,27,72},{13,27,72},{12,28,11},{12,27,24},{13,28,5},{13,28,5},{13,28,5},{13,27,8},{13,27,8},{13,27,8},{13,27,8},{13,27,8},{13,27,8},{13,27,8},{15,22,18},{13,28,10},{13,28,2}, +{12,28,10},{15,22,18},{13,28,18},{12,28,10},{0,28,50},{13,28,18},{0,28,50},{13,0,68},{13,0,68},{13,0,68},{13,0,68},{13,26,65},{13,26,65},{13,26,65},{12,28,65},{12,28,2},{12,28,2},{13,31,76},{13,30,58},{13,29,75},{13,29,51},{13,31,52},{13,30,25},{13,29,3},{13,29,46},{12,31,68},{12,29,70},{13,31,75},{13,30,57},{13,29,74},{13,29,50},{13,31,51}, +{13,30,24},{13,29,2},{12,29,45},{15,27,51},{12,29,45},{13,31,51},{13,31,51},{13,31,51},{13,29,51},{13,30,9},{13,29,3},{13,29,3},{13,28,9},{12,30,12},{13,28,12},{13,31,50},{13,31,50},{13,31,50},{13,29,50},{13,30,8},{13,29,2},{13,29,2},{13,28,8},{12,30,8},{13,28,8},{15,25,18},{13,30,8},{13,29,25},{13,29,1},{15,25,18},{12,31,18},{13,29,1}, +{0,29,36},{12,31,18},{0,29,36},{13,0,50},{13,0,50},{13,0,50},{13,0,50},{13,29,2},{13,29,2},{13,29,2},{13,28,5},{13,28,8},{13,28,8},{14,31,88},{14,30,78},{14,30,69},{14,30,77},{14,30,115},{14,30,107},{14,30,98},{13,30,117},{13,31,60},{13,30,36},{14,31,24},{14,30,14},{14,30,5},{14,30,13},{15,27,51},{13,31,35},{14,30,34},{13,30,36},{13,31,51}, +{13,30,36},{14,30,69},{14,30,69},{14,30,69},{14,29,72},{14,29,72},{14,29,72},{14,29,72},{14,29,72},{13,30,16},{13,30,36},{14,30,5},{14,30,5},{14,30,5},{14,29,8},{15,26,8},{14,29,8},{14,29,8},{14,29,8},{14,29,8},{14,29,8},{14,31,20},{14,30,10},{14,30,1},{14,30,9},{14,31,20},{14,30,18},{14,30,9},{0,30,36},{14,30,18},{0,30,36},{14,0,68}, +{14,0,68},{14,0,68},{14,0,68},{14,28,65},{14,28,65},{14,28,65},{14,29,68},{13,30,0},{13,30,0},{14,31,152},{14,31,88},{14,31,52},{14,31,36},{14,31,116},{14,31,36},{14,31,0},{14,31,52},{14,31,88},{13,31,70},{15,30,118},{14,31,88},{14,31,52},{14,31,36},{15,29,52},{14,31,36},{14,31,0},{13,31,45},{15,30,51},{13,31,45},{14,31,52},{14,31,52},{14,31,52}, +{14,31,36},{14,31,16},{14,31,0},{14,31,0},{14,30,5},{14,30,35},{14,30,14},{14,31,52},{14,31,52},{14,31,52},{14,31,36},{15,28,10},{14,31,0},{14,31,0},{14,30,5},{15,29,16},{14,30,5},{15,30,18},{15,30,34},{14,31,16},{14,31,0},{15,30,18},{15,30,26},{14,31,0},{0,31,36},{15,30,26},{0,31,36},{14,0,36},{14,0,36},{14,0,36},{14,0,36},{14,31,0}, +{14,31,0},{14,31,0},{14,30,1},{14,30,10},{14,30,10},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{14,31,20},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68},{15,31,68}, +{15,31,68},{14,31,56},{14,31,20},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{15,0,68},{15,0,68},{15,0,68},{15,0,68},{15,30,65},{15,30,65},{15,30,65},{15,31,68},{14,31,20}, +{14,31,20},{0,4,74},{0,3,20},{0,2,2},{0,2,26},{0,2,158},{0,2,110},{0,2,62},{0,1,115},{0,1,178},{0,1,124},{0,4,74},{0,3,20},{0,2,2},{0,2,26},{0,2,158},{0,2,110},{0,2,62},{0,1,115},{1,0,158},{0,1,115},{0,2,1},{0,2,1},{0,2,1},{0,1,0},{0,1,13},{0,1,9},{0,1,9},{0,0,25},{0,0,25},{0,0,25},{0,2,1}, +{0,2,1},{0,2,1},{0,1,0},{0,1,13},{0,1,9},{0,1,9},{0,0,25},{0,0,25},{0,0,25},{1,0,74},{0,3,20},{0,2,2},{0,2,26},{1,0,74},{1,1,72},{0,2,26},{0,1,90},{1,1,72},{0,1,90},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,6,83},{0,5,13},{0,3,26}, +{0,3,14},{0,5,248},{0,3,140},{0,3,41},{0,2,139},{0,2,319},{0,2,175},{0,6,83},{0,5,13},{0,3,26},{0,3,14},{1,1,244},{0,3,140},{0,3,41},{0,2,139},{0,3,248},{0,2,139},{0,4,10},{0,4,10},{0,4,10},{0,3,13},{0,3,52},{0,2,18},{0,2,18},{0,1,29},{0,1,77},{0,1,38},{0,4,10},{0,4,10},{0,4,10},{0,3,13},{0,3,52}, +{0,2,18},{0,2,18},{0,1,29},{1,0,58},{0,1,29},{1,3,72},{0,5,4},{0,3,17},{0,3,5},{1,3,72},{3,0,74},{0,3,5},{0,2,90},{3,0,74},{0,2,90},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,1,0},{0,1,0},{0,1,0},{0,1,4},{0,0,9},{0,0,9},{0,9,193},{0,7,125},{0,4,202},{0,4,122},{0,7,244},{0,5,96},{0,4,2}, +{0,3,106},{0,4,395},{0,3,187},{1,6,99},{1,5,45},{1,4,26},{1,4,50},{1,4,243},{0,5,96},{0,4,2},{0,3,106},{2,2,243},{0,3,106},{0,7,121},{0,7,121},{0,7,121},{0,4,122},{0,5,52},{0,4,2},{0,4,2},{0,3,25},{0,3,133},{0,2,62},{1,4,26},{1,4,26},{1,4,26},{1,3,25},{1,2,50},{0,4,2},{0,4,2},{0,3,25},{1,2,50}, +{0,3,25},{0,9,72},{0,7,4},{1,4,1},{0,4,1},{0,9,72},{2,3,72},{0,4,1},{0,3,90},{2,3,72},{0,3,90},{0,0,121},{0,0,121},{0,0,121},{0,0,121},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,2,37},{0,2,37},{1,8,164},{1,7,94},{1,5,106},{1,5,94},{0,10,292},{0,7,125},{0,5,81},{0,4,130},{0,6,364},{0,4,106},{1,8,83}, +{1,7,13},{1,5,25},{1,5,13},{3,0,243},{0,7,76},{0,5,32},{0,4,81},{5,0,243},{0,4,81},{1,6,91},{1,6,91},{1,6,91},{1,5,94},{0,8,99},{0,6,51},{0,6,51},{0,4,66},{0,4,107},{0,4,42},{1,6,10},{1,6,10},{1,6,10},{1,5,13},{0,8,50},{0,6,2},{0,6,2},{0,4,17},{4,0,50},{0,4,17},{3,2,74},{1,7,4},{1,5,16}, +{1,5,4},{3,2,74},{5,1,72},{1,5,4},{0,4,80},{5,1,72},{0,4,80},{1,0,90},{1,0,90},{1,0,90},{1,0,90},{0,6,50},{0,6,50},{0,6,50},{0,4,50},{0,3,20},{0,3,20},{1,11,218},{1,9,149},{1,7,242},{1,6,149},{1,10,248},{1,7,99},{1,6,5},{1,5,99},{0,7,308},{0,5,100},{2,8,99},{2,7,45},{2,6,27},{2,6,51},{3,3,243}, +{0,9,81},{1,6,5},{0,5,99},{4,3,243},{0,5,99},{1,9,145},{1,9,145},{1,9,145},{1,6,148},{1,8,52},{1,6,4},{1,6,4},{1,5,18},{0,6,72},{0,5,19},{2,6,26},{2,6,26},{2,6,26},{2,5,25},{3,1,50},{1,6,4},{1,6,4},{0,5,18},{3,3,50},{0,5,18},{4,1,72},{1,9,5},{2,6,2},{1,6,5},{4,1,72},{3,5,72},{1,6,5}, +{0,5,90},{3,5,72},{0,5,90},{1,0,144},{1,0,144},{1,0,144},{1,0,144},{1,6,0},{1,6,0},{1,6,0},{1,4,4},{0,6,8},{0,6,8},{2,10,164},{2,9,94},{2,7,107},{2,7,95},{1,12,307},{1,9,137},{1,7,115},{1,6,154},{0,9,253},{1,6,106},{2,10,83},{2,9,13},{2,7,26},{2,7,14},{4,2,243},{1,9,73},{2,7,41},{1,6,90},{6,2,243}, +{1,6,90},{2,8,91},{2,8,91},{2,8,91},{2,7,94},{1,10,116},{1,8,69},{1,8,69},{1,6,73},{0,8,50},{1,6,25},{2,8,10},{2,8,10},{2,8,10},{2,7,13},{4,0,50},{1,8,5},{1,8,5},{1,6,9},{1,7,50},{1,6,9},{3,7,72},{2,9,4},{2,7,17},{2,7,5},{3,7,72},{8,0,72},{2,7,5},{0,6,90},{8,0,72},{0,6,90},{2,0,90}, +{2,0,90},{2,0,90},{2,0,90},{1,9,65},{1,9,65},{1,9,65},{1,6,64},{0,7,10},{0,7,10},{2,13,194},{2,11,126},{2,8,203},{2,8,123},{2,11,245},{2,9,97},{2,8,3},{2,7,107},{0,11,249},{1,7,100},{3,10,99},{3,9,45},{3,8,26},{3,8,50},{3,8,243},{1,11,81},{2,8,2},{1,7,99},{4,6,243},{1,7,99},{2,11,122},{2,11,122},{2,11,122}, +{2,8,123},{2,9,53},{2,8,3},{2,8,3},{2,7,26},{1,8,62},{1,7,19},{3,8,26},{3,8,26},{3,8,26},{3,7,25},{3,6,50},{2,8,2},{2,8,2},{1,7,18},{3,6,50},{1,7,18},{5,3,72},{2,11,4},{3,8,1},{2,8,1},{5,3,72},{4,7,72},{2,8,1},{0,7,90},{4,7,72},{0,7,90},{2,0,122},{2,0,122},{2,0,122},{2,0,122},{2,8,2}, +{2,8,2},{2,8,2},{2,6,2},{1,7,10},{1,7,10},{3,12,164},{3,11,94},{3,9,106},{3,9,94},{2,14,292},{2,11,125},{2,9,81},{2,8,130},{1,11,253},{2,8,106},{3,12,83},{3,11,13},{3,9,25},{3,9,13},{5,4,243},{2,11,76},{2,9,32},{2,8,81},{9,1,243},{2,8,81},{3,10,91},{3,10,91},{3,10,91},{3,9,94},{2,12,99},{2,10,51},{2,10,51}, +{2,8,66},{1,10,50},{2,8,42},{3,10,10},{3,10,10},{3,10,10},{3,9,13},{5,2,50},{2,10,2},{2,10,2},{2,8,17},{8,1,50},{2,8,17},{1,19,72},{3,11,4},{3,9,16},{3,9,4},{1,19,72},{9,2,72},{3,9,4},{0,8,80},{9,2,72},{0,8,80},{3,0,90},{3,0,90},{3,0,90},{3,0,90},{2,10,50},{2,10,50},{2,10,50},{2,8,50},{1,9,9}, +{1,9,9},{3,15,218},{3,13,149},{3,11,242},{3,10,149},{3,14,248},{3,11,99},{3,10,5},{3,9,99},{1,13,244},{2,9,100},{4,12,99},{4,11,45},{4,10,27},{4,10,51},{5,7,243},{2,13,81},{3,10,5},{2,9,99},{6,7,243},{2,9,99},{3,13,145},{3,13,145},{3,13,145},{3,10,148},{3,12,52},{3,10,4},{3,10,4},{3,9,18},{1,12,56},{2,9,19},{4,10,26}, +{4,10,26},{4,10,26},{4,9,25},{5,5,50},{3,10,4},{3,10,4},{2,9,18},{5,7,50},{2,9,18},{7,2,72},{3,13,5},{4,10,2},{3,10,5},{7,2,72},{12,0,72},{3,10,5},{0,9,90},{12,0,72},{0,9,90},{3,0,144},{3,0,144},{3,0,144},{3,0,144},{3,10,0},{3,10,0},{3,10,0},{3,8,4},{2,10,8},{2,10,8},{4,14,164},{4,13,94},{4,11,107}, +{4,11,95},{3,16,307},{3,13,137},{3,11,115},{3,10,154},{2,13,253},{3,10,106},{4,14,83},{4,13,13},{4,11,26},{4,11,14},{7,3,243},{3,13,73},{4,11,41},{3,10,90},{11,2,243},{3,10,90},{4,12,91},{4,12,91},{4,12,91},{4,11,94},{3,14,116},{3,12,69},{3,12,69},{3,10,73},{2,12,50},{3,10,25},{4,12,10},{4,12,10},{4,12,10},{4,11,13},{7,1,50}, +{3,12,5},{3,12,5},{3,10,9},{10,2,50},{3,10,9},{5,11,72},{4,13,4},{4,11,17},{4,11,5},{5,11,72},{11,3,72},{4,11,5},{0,10,90},{11,3,72},{0,10,90},{4,0,90},{4,0,90},{4,0,90},{4,0,90},{3,13,65},{3,13,65},{3,13,65},{3,10,64},{2,11,10},{2,11,10},{4,17,194},{4,15,126},{4,12,203},{4,12,123},{4,15,245},{4,13,97},{4,12,3}, +{4,11,107},{2,15,249},{3,11,100},{5,14,99},{5,13,45},{5,12,26},{5,12,50},{5,12,243},{3,15,81},{4,12,2},{3,11,99},{13,1,243},{3,11,99},{4,15,122},{4,15,122},{4,15,122},{4,12,123},{4,13,53},{4,12,3},{4,12,3},{4,11,26},{3,12,62},{3,11,19},{5,12,26},{5,12,26},{5,12,26},{5,11,25},{5,10,50},{4,12,2},{4,12,2},{3,11,18},{12,1,50}, +{3,11,18},{8,2,72},{4,15,4},{5,12,1},{4,12,1},{8,2,72},{13,2,72},{4,12,1},{0,11,90},{13,2,72},{0,11,90},{4,0,122},{4,0,122},{4,0,122},{4,0,122},{4,12,2},{4,12,2},{4,12,2},{4,10,2},{3,11,10},{3,11,10},{5,16,164},{5,15,94},{5,13,106},{5,13,94},{4,18,292},{4,15,125},{4,13,81},{4,12,130},{3,15,253},{4,12,106},{5,16,83}, +{5,15,13},{5,13,25},{5,13,13},{8,3,243},{4,15,76},{4,13,32},{4,12,81},{11,5,243},{4,12,81},{5,14,91},{5,14,91},{5,14,91},{5,13,94},{4,16,99},{4,14,51},{4,14,51},{4,12,66},{3,14,50},{4,12,42},{5,14,10},{5,14,10},{5,14,10},{5,13,13},{8,1,50},{4,14,2},{4,14,2},{4,12,17},{10,5,50},{4,12,17},{3,23,72},{5,15,4},{5,13,16}, +{5,13,4},{3,23,72},{11,6,72},{5,13,4},{0,12,80},{11,6,72},{0,12,80},{5,0,90},{5,0,90},{5,0,90},{5,0,90},{4,14,50},{4,14,50},{4,14,50},{4,12,50},{3,13,9},{3,13,9},{5,19,218},{5,17,149},{5,15,242},{5,14,149},{5,18,248},{5,15,99},{5,14,5},{5,13,99},{3,17,244},{4,13,100},{6,16,99},{6,15,45},{6,14,27},{6,14,51},{8,6,243}, +{4,17,81},{5,14,5},{4,13,99},{15,2,243},{4,13,99},{5,17,145},{5,17,145},{5,17,145},{5,14,148},{5,16,52},{5,14,4},{5,14,4},{5,13,18},{3,16,56},{4,13,19},{6,14,26},{6,14,26},{6,14,26},{6,13,25},{8,4,50},{5,14,4},{5,14,4},{4,13,18},{14,2,50},{4,13,18},{3,26,72},{5,17,5},{6,14,2},{5,14,5},{3,26,72},{15,3,72},{5,14,5}, +{0,13,90},{15,3,72},{0,13,90},{5,0,144},{5,0,144},{5,0,144},{5,0,144},{5,14,0},{5,14,0},{5,14,0},{5,12,4},{4,14,8},{4,14,8},{6,18,164},{6,17,94},{6,15,107},{6,15,95},{5,20,307},{5,17,137},{5,15,115},{5,14,154},{4,17,253},{5,14,106},{6,18,83},{6,17,13},{6,15,26},{6,15,14},{5,20,243},{5,17,73},{6,15,41},{5,14,90},{13,6,243}, +{5,14,90},{6,16,91},{6,16,91},{6,16,91},{6,15,94},{5,18,116},{5,16,69},{5,16,69},{5,14,73},{4,16,50},{5,14,25},{6,16,10},{6,16,10},{6,16,10},{6,15,13},{3,25,50},{5,16,5},{5,16,5},{5,14,9},{12,6,50},{5,14,9},{11,0,72},{6,17,4},{6,15,17},{6,15,5},{11,0,72},{13,7,72},{6,15,5},{0,14,90},{13,7,72},{0,14,90},{6,0,90}, +{6,0,90},{6,0,90},{6,0,90},{5,17,65},{5,17,65},{5,17,65},{5,14,64},{4,15,10},{4,15,10},{6,21,194},{6,19,126},{6,16,203},{6,16,123},{6,19,245},{6,17,97},{6,16,3},{6,15,107},{4,19,249},{5,15,100},{7,18,99},{7,17,45},{7,16,26},{7,16,50},{11,1,243},{5,19,81},{6,16,2},{5,15,99},{15,5,243},{5,15,99},{6,19,122},{6,19,122},{6,19,122}, +{6,16,123},{6,17,53},{6,16,3},{6,16,3},{6,15,26},{5,16,62},{5,15,19},{7,16,26},{7,16,26},{7,16,26},{7,15,25},{9,6,50},{6,16,2},{6,16,2},{5,15,18},{14,5,50},{5,15,18},{10,6,72},{6,19,4},{7,16,1},{6,16,1},{10,6,72},{15,6,72},{6,16,1},{0,15,90},{15,6,72},{0,15,90},{6,0,122},{6,0,122},{6,0,122},{6,0,122},{6,16,2}, +{6,16,2},{6,16,2},{6,14,2},{5,15,10},{5,15,10},{7,20,164},{7,19,94},{7,17,106},{7,17,94},{6,22,292},{6,19,125},{6,17,81},{6,16,130},{5,19,253},{6,16,106},{7,20,83},{7,19,13},{7,17,25},{7,17,13},{10,7,243},{6,19,76},{6,17,32},{6,16,81},{13,9,243},{6,16,81},{7,18,91},{7,18,91},{7,18,91},{7,17,94},{6,20,99},{6,18,51},{6,18,51}, +{6,16,66},{5,18,50},{6,16,42},{7,18,10},{7,18,10},{7,18,10},{7,17,13},{10,5,50},{6,18,2},{6,18,2},{6,16,17},{12,9,50},{6,16,17},{12,2,72},{7,19,4},{7,17,16},{7,17,4},{12,2,72},{13,10,72},{7,17,4},{0,16,80},{13,10,72},{0,16,80},{7,0,90},{7,0,90},{7,0,90},{7,0,90},{6,18,50},{6,18,50},{6,18,50},{6,16,50},{5,17,9}, +{5,17,9},{7,23,218},{7,21,149},{7,19,242},{7,18,149},{7,22,248},{7,19,99},{7,18,5},{7,17,99},{5,21,244},{6,17,100},{7,23,218},{7,21,149},{8,18,206},{7,18,149},{13,0,243},{6,21,81},{7,18,5},{6,17,99},{5,21,243},{6,17,99},{7,21,145},{7,21,145},{7,21,145},{7,18,148},{7,20,52},{7,18,4},{7,18,4},{7,17,18},{5,20,56},{6,17,19},{7,21,145}, +{7,21,145},{7,21,145},{7,18,148},{10,8,50},{7,18,4},{7,18,4},{6,17,18},{11,12,50},{6,17,18},{9,15,72},{7,21,5},{8,18,37},{7,18,5},{9,15,72},{5,22,72},{7,18,5},{0,17,90},{5,22,72},{0,17,90},{7,0,144},{7,0,144},{7,0,144},{7,0,144},{7,18,0},{7,18,0},{7,18,0},{7,16,4},{6,18,8},{6,18,8},{8,21,388},{8,20,334},{8,19,316}, +{8,19,340},{7,24,307},{7,21,137},{7,19,115},{7,18,154},{6,21,253},{7,18,106},{8,21,99},{8,20,45},{8,19,27},{8,19,51},{8,19,243},{7,21,73},{7,19,51},{7,18,90},{15,10,243},{7,18,90},{8,19,315},{8,19,315},{8,19,315},{8,18,314},{7,22,116},{7,20,69},{7,20,69},{7,18,73},{6,20,50},{7,18,25},{8,19,26},{8,19,26},{8,19,26},{8,18,25},{9,14,50}, +{7,20,5},{7,20,5},{7,18,9},{14,10,50},{7,18,9},{13,4,72},{8,20,20},{8,19,2},{7,19,26},{13,4,72},{15,11,72},{7,19,26},{0,18,90},{15,11,72},{0,18,90},{8,0,314},{8,0,314},{8,0,314},{8,0,314},{7,21,65},{7,21,65},{7,21,65},{7,18,64},{6,19,10},{6,19,10},{8,23,164},{8,22,94},{8,20,106},{8,20,94},{8,22,329},{8,20,221},{8,20,121}, +{8,19,220},{6,23,249},{7,19,100},{8,23,83},{8,22,13},{8,20,25},{8,20,13},{13,5,243},{7,23,81},{8,20,40},{7,19,99},{12,15,243},{7,19,99},{8,21,91},{8,21,91},{8,21,91},{8,20,94},{8,20,133},{8,19,99},{8,19,99},{8,18,110},{7,20,62},{7,19,19},{8,21,10},{8,21,10},{8,21,10},{8,20,13},{11,10,50},{8,19,18},{8,19,18},{7,19,18},{5,23,50}, +{7,19,18},{15,0,72},{8,22,4},{8,20,16},{8,20,4},{15,0,72},{12,16,72},{8,20,4},{0,19,90},{12,16,72},{0,19,90},{8,0,90},{8,0,90},{8,0,90},{8,0,90},{8,18,81},{8,18,81},{8,18,81},{8,18,85},{7,19,10},{7,19,10},{8,26,194},{8,24,131},{8,21,203},{8,21,123},{8,24,245},{8,22,97},{8,21,3},{8,20,97},{7,23,253},{7,20,141},{9,23,99}, +{9,22,45},{9,21,26},{9,21,50},{15,1,243},{8,22,96},{8,21,2},{8,20,96},{15,13,243},{8,20,96},{8,24,122},{8,24,122},{8,24,122},{8,21,123},{8,22,53},{8,21,3},{8,21,3},{8,19,27},{7,22,50},{8,19,75},{9,21,26},{9,21,26},{9,21,26},{9,20,25},{12,9,50},{8,21,2},{8,21,2},{8,19,26},{14,13,50},{8,19,26},{14,6,72},{8,24,9},{9,21,1}, +{8,21,1},{14,6,72},{15,14,72},{8,21,1},{0,20,80},{15,14,72},{0,20,80},{8,0,122},{8,0,122},{8,0,122},{8,0,122},{8,21,2},{8,21,2},{8,21,2},{8,19,2},{7,21,9},{7,21,9},{9,26,154},{9,24,81},{9,22,106},{9,22,82},{9,24,307},{8,24,137},{9,22,91},{8,21,154},{7,25,244},{8,21,106},{9,26,90},{9,24,17},{9,22,42},{9,22,18},{15,4,243}, +{8,24,73},{9,22,27},{8,21,90},{9,22,243},{8,21,90},{9,24,81},{9,24,81},{9,24,81},{9,22,81},{9,22,114},{8,23,68},{8,23,68},{8,21,73},{7,24,56},{8,21,25},{9,24,17},{9,24,17},{9,24,17},{9,22,17},{15,2,50},{8,23,4},{8,23,4},{8,21,9},{13,16,50},{8,21,9},{11,19,72},{9,24,1},{9,22,26},{9,22,2},{11,19,72},{9,23,72},{9,22,2}, +{0,21,90},{9,23,72},{0,21,90},{9,0,80},{9,0,80},{9,0,80},{9,0,80},{9,20,65},{9,20,65},{9,20,65},{8,21,64},{8,21,16},{8,21,16},{9,28,216},{9,26,149},{9,23,245},{9,23,149},{9,27,248},{9,24,89},{9,23,5},{9,22,99},{7,27,260},{8,22,100},{10,25,99},{10,24,45},{10,23,27},{10,23,51},{10,23,243},{8,26,81},{9,23,5},{8,22,99},{11,21,243}, +{8,22,99},{9,26,145},{9,26,145},{9,26,145},{9,23,148},{9,25,52},{9,23,4},{9,23,4},{9,22,18},{8,23,72},{8,22,19},{10,23,26},{10,23,26},{10,23,26},{10,22,25},{11,18,50},{9,23,4},{9,23,4},{8,22,18},{10,21,50},{8,22,18},{15,8,72},{9,26,5},{10,23,2},{9,23,5},{15,8,72},{11,22,72},{9,23,5},{0,22,90},{11,22,72},{0,22,90},{9,0,144}, +{9,0,144},{9,0,144},{9,0,144},{9,23,0},{9,23,0},{9,23,0},{9,21,4},{8,23,8},{8,23,8},{10,27,164},{10,26,94},{10,24,106},{10,24,94},{9,29,307},{9,26,137},{9,24,105},{9,23,154},{8,26,253},{9,23,106},{10,27,83},{10,26,13},{10,24,25},{10,24,13},{15,9,243},{9,26,73},{10,24,40},{9,23,90},{14,19,243},{9,23,90},{10,25,91},{10,25,91},{10,25,91}, +{10,24,94},{9,27,116},{9,25,69},{9,25,69},{9,23,73},{8,25,50},{9,23,25},{10,25,10},{10,25,10},{10,25,10},{10,24,13},{13,14,50},{9,25,5},{9,25,5},{9,23,9},{8,25,50},{9,23,9},{14,14,72},{10,26,4},{10,24,16},{10,24,4},{14,14,72},{14,20,72},{10,24,4},{0,23,90},{14,20,72},{0,23,90},{10,0,90},{10,0,90},{10,0,90},{10,0,90},{9,26,65}, +{9,26,65},{9,26,65},{9,23,64},{8,24,9},{8,24,9},{10,30,194},{10,28,131},{10,25,203},{10,25,123},{10,28,245},{10,26,97},{10,25,3},{10,24,97},{8,28,252},{9,24,85},{11,27,99},{11,26,45},{11,25,26},{11,25,50},{14,15,243},{9,28,80},{10,25,2},{9,24,84},{12,23,243},{9,24,84},{10,28,122},{10,28,122},{10,28,122},{10,25,123},{10,26,53},{10,25,3},{10,25,3}, +{10,23,27},{9,25,62},{9,24,21},{11,25,26},{11,25,26},{11,25,26},{11,24,25},{14,13,50},{10,25,2},{10,25,2},{9,24,20},{11,23,50},{9,24,20},{13,20,72},{10,28,9},{11,25,1},{10,25,1},{13,20,72},{13,23,74},{10,25,1},{0,24,80},{13,23,74},{0,24,80},{10,0,122},{10,0,122},{10,0,122},{10,0,122},{10,25,2},{10,25,2},{10,25,2},{10,23,2},{9,24,5}, +{9,24,5},{11,30,154},{11,28,81},{11,26,106},{11,26,82},{11,28,307},{10,28,137},{11,26,91},{10,25,154},{9,28,260},{10,25,106},{11,30,90},{11,28,17},{11,26,42},{11,26,18},{14,18,243},{10,28,73},{11,26,27},{10,25,90},{11,26,243},{10,25,90},{11,28,81},{11,28,81},{11,28,81},{11,26,81},{11,26,114},{10,27,68},{10,27,68},{10,25,73},{9,27,53},{10,25,25},{11,28,17}, +{11,28,17},{11,28,17},{11,26,17},{14,16,50},{10,27,4},{10,27,4},{10,25,9},{15,20,50},{10,25,9},{13,23,72},{11,28,1},{11,26,26},{11,26,2},{13,23,72},{11,27,72},{11,26,2},{0,25,90},{11,27,72},{0,25,90},{11,0,80},{11,0,80},{11,0,80},{11,0,80},{11,24,65},{11,24,65},{11,24,65},{10,25,64},{10,25,16},{10,25,16},{11,31,248},{11,30,149},{11,27,245}, +{11,27,149},{11,31,248},{11,28,89},{11,27,5},{11,26,99},{9,30,244},{10,26,100},{12,29,99},{12,28,45},{12,27,27},{12,27,51},{12,27,243},{10,30,81},{11,27,5},{10,26,99},{13,25,243},{10,26,99},{11,30,145},{11,30,145},{11,30,145},{11,27,148},{11,29,52},{11,27,4},{11,27,4},{11,26,18},{9,29,56},{10,26,19},{12,27,26},{12,27,26},{12,27,26},{12,26,25},{13,22,50}, +{11,27,4},{11,27,4},{10,26,18},{12,25,50},{10,26,18},{15,19,72},{11,30,5},{12,27,2},{11,27,5},{15,19,72},{13,26,72},{11,27,5},{0,26,90},{13,26,72},{0,26,90},{11,0,144},{11,0,144},{11,0,144},{11,0,144},{11,27,0},{11,27,0},{11,27,0},{11,25,4},{10,27,8},{10,27,8},{12,31,164},{12,30,94},{12,28,106},{12,28,94},{12,30,329},{11,30,137},{11,28,105}, +{11,27,154},{10,30,253},{11,27,106},{12,31,83},{12,30,13},{12,28,25},{12,28,13},{14,23,243},{11,30,73},{12,28,40},{11,27,90},{11,29,243},{11,27,90},{12,29,91},{12,29,91},{12,29,91},{12,28,94},{11,31,116},{11,29,69},{11,29,69},{11,27,73},{10,29,50},{11,27,25},{12,29,10},{12,29,10},{12,29,10},{12,28,13},{15,18,50},{11,29,5},{11,29,5},{11,27,9},{10,29,50}, +{11,27,9},{13,28,72},{12,30,4},{12,28,16},{12,28,4},{13,28,72},{11,30,72},{12,28,4},{0,27,90},{11,30,72},{0,27,90},{12,0,90},{12,0,90},{12,0,90},{12,0,90},{11,30,65},{11,30,65},{11,30,65},{11,27,64},{10,28,9},{10,28,9},{12,31,356},{12,31,140},{12,29,203},{12,29,123},{12,31,284},{12,30,97},{12,29,3},{12,28,97},{10,31,287},{11,28,85},{13,31,99}, +{13,30,45},{13,29,26},{13,29,50},{13,29,243},{12,30,96},{12,29,2},{11,28,84},{14,27,243},{11,28,84},{12,31,131},{12,31,131},{12,31,131},{12,29,123},{12,30,53},{12,29,3},{12,29,3},{12,27,27},{11,29,62},{11,28,21},{13,29,26},{13,29,26},{13,29,26},{13,28,25},{13,27,50},{12,29,2},{12,29,2},{11,28,20},{13,27,50},{11,28,20},{15,24,72},{12,31,18},{13,29,1}, +{12,29,1},{15,24,72},{15,27,74},{12,29,1},{0,28,80},{15,27,74},{0,28,80},{12,0,122},{12,0,122},{12,0,122},{12,0,122},{12,29,2},{12,29,2},{12,29,2},{12,27,2},{11,28,5},{11,28,5},{13,31,280},{13,31,120},{13,30,106},{13,30,82},{13,31,328},{13,31,200},{13,30,91},{12,29,154},{12,31,344},{12,29,106},{13,31,216},{13,31,56},{13,30,42},{13,30,18},{15,25,244}, +{13,31,136},{13,30,27},{12,29,90},{13,30,243},{12,29,90},{13,31,84},{13,31,84},{13,31,84},{13,30,81},{13,30,114},{12,31,68},{12,31,68},{12,29,73},{11,31,53},{12,29,25},{13,31,20},{13,31,20},{13,31,20},{13,30,17},{13,30,50},{12,31,4},{12,31,4},{12,29,9},{12,30,50},{12,29,9},{15,27,72},{13,31,40},{13,30,26},{13,30,2},{15,27,72},{13,31,72},{13,30,2}, +{0,29,90},{13,31,72},{0,29,90},{13,0,80},{13,0,80},{13,0,80},{13,0,80},{13,28,65},{13,28,65},{13,28,65},{12,29,64},{12,29,16},{12,29,16},{14,31,415},{14,31,351},{13,31,244},{13,31,148},{14,31,511},{13,31,173},{13,31,4},{13,30,82},{13,31,381},{12,30,83},{14,31,126},{14,31,62},{14,31,26},{14,31,50},{14,31,222},{13,31,173},{13,31,4},{12,30,82},{14,30,221}, +{12,30,82},{13,31,244},{13,31,244},{13,31,244},{13,31,148},{13,31,100},{13,31,4},{13,31,4},{13,30,18},{12,31,72},{12,30,19},{14,31,26},{14,31,26},{14,31,26},{14,30,25},{15,26,50},{13,31,4},{13,31,4},{12,30,18},{14,29,50},{12,30,18},{15,29,61},{14,31,37},{14,31,1},{13,31,4},{15,29,61},{15,30,61},{13,31,4},{0,30,73},{15,30,61},{0,30,73},{13,0,144}, +{13,0,144},{13,0,144},{13,0,144},{13,31,0},{13,31,0},{13,31,0},{13,29,4},{12,31,8},{12,31,8},{14,31,239},{14,31,175},{14,31,139},{14,31,99},{14,31,239},{14,31,135},{14,31,99},{13,31,73},{13,31,285},{13,31,25},{14,31,158},{14,31,94},{14,31,58},{14,31,18},{15,29,94},{14,31,54},{14,31,18},{13,31,9},{15,30,93},{13,31,9},{14,31,139},{14,31,139},{14,31,139}, +{14,31,99},{14,31,139},{14,31,99},{14,31,99},{13,31,73},{13,31,116},{13,31,25},{14,31,58},{14,31,58},{14,31,58},{14,31,18},{15,28,52},{14,31,18},{14,31,18},{13,31,9},{15,29,58},{13,31,9},{15,30,9},{15,31,9},{15,31,9},{14,31,9},{15,30,9},{15,31,9},{14,31,9},{0,31,9},{15,31,9},{0,31,9},{14,0,90},{14,0,90},{14,0,90},{14,0,90},{14,30,81}, +{14,30,81},{14,30,81},{13,31,64},{13,31,16},{13,31,16},{15,31,314},{14,31,258},{14,31,222},{14,31,158},{14,31,226},{14,31,98},{14,31,62},{14,31,2},{14,31,122},{14,31,50},{15,31,25},{15,31,25},{15,31,25},{15,31,25},{15,30,22},{15,31,25},{15,31,25},{14,31,1},{15,31,25},{14,31,1},{14,31,222},{14,31,222},{14,31,222},{14,31,158},{14,31,126},{14,31,62},{14,31,62}, +{14,31,2},{14,31,86},{14,31,50},{15,31,25},{15,31,25},{15,31,25},{15,31,25},{15,30,13},{15,31,25},{15,31,25},{14,31,1},{15,30,25},{14,31,1},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{14,0,122},{14,0,122},{14,0,122},{14,0,122},{14,31,26},{14,31,26},{14,31,26},{14,31,2},{14,31,50}, +{14,31,50},{0,6,202},{0,5,52},{0,3,25},{0,3,61},{0,4,442},{0,3,313},{0,3,142},{0,2,318},{0,2,498},{0,2,354},{0,6,202},{0,5,52},{0,3,25},{0,3,61},{1,1,441},{0,3,313},{0,3,142},{0,2,318},{2,0,442},{0,2,318},{0,3,0},{0,3,0},{0,3,0},{0,2,1},{0,1,45},{0,1,25},{0,1,25},{0,1,26},{0,1,50},{0,1,35},{0,3,0}, +{0,3,0},{0,3,0},{0,2,1},{0,1,45},{0,1,25},{0,1,25},{0,1,26},{0,1,41},{0,1,26},{1,3,200},{0,5,52},{0,3,25},{0,3,61},{1,3,200},{3,0,202},{0,3,61},{0,2,218},{3,0,202},{0,2,218},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,9,200},{0,7,20},{0,5,20}, +{0,4,25},{0,6,686},{0,5,433},{0,4,169},{0,3,443},{0,3,794},{0,3,524},{0,9,200},{0,7,20},{0,5,20},{0,4,25},{0,6,686},{0,5,433},{0,4,169},{0,3,443},{3,0,686},{0,3,443},{0,6,1},{0,6,1},{0,6,1},{0,3,4},{0,3,145},{0,2,85},{0,2,85},{0,2,101},{0,1,178},{0,1,115},{0,6,1},{0,6,1},{0,6,1},{0,3,4},{0,3,145}, +{0,2,85},{0,2,85},{0,2,101},{0,2,149},{0,2,101},{0,9,200},{0,7,20},{0,5,20},{0,4,25},{0,9,200},{2,3,200},{0,4,25},{0,3,218},{2,3,200},{0,3,218},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,11,257},{0,9,54},{0,6,114},{0,5,65},{0,9,728},{0,6,371},{0,5,80}, +{0,4,377},{0,5,949},{0,4,521},{0,11,257},{0,9,54},{1,5,97},{0,5,65},{2,2,723},{0,6,371},{0,5,80},{0,4,377},{1,4,723},{0,4,377},{0,8,50},{0,8,50},{0,8,50},{0,5,49},{0,5,164},{0,4,50},{0,4,50},{0,3,65},{0,3,245},{0,2,126},{0,8,50},{0,8,50},{0,8,50},{0,5,49},{1,2,162},{0,4,50},{0,4,50},{0,3,65},{1,2,162}, +{0,3,65},{3,2,202},{0,9,5},{1,5,16},{0,5,16},{3,2,202},{5,1,200},{0,5,16},{0,4,208},{5,1,200},{0,4,208},{0,0,49},{0,0,49},{0,0,49},{0,0,49},{0,2,1},{0,2,1},{0,2,1},{0,1,4},{0,1,13},{0,1,13},{0,14,425},{0,11,234},{1,7,277},{0,7,245},{0,11,724},{0,8,289},{0,6,34},{0,5,308},{0,6,1087},{0,5,533},{1,11,201}, +{1,9,18},{1,7,21},{1,6,26},{1,8,723},{0,8,289},{0,6,34},{0,5,308},{4,2,723},{0,5,308},{0,11,225},{0,11,225},{0,11,225},{0,7,229},{0,8,162},{0,6,18},{0,6,18},{0,4,25},{0,4,338},{0,3,162},{1,8,2},{1,8,2},{1,8,2},{1,5,5},{0,8,162},{0,6,18},{0,6,18},{0,4,25},{4,0,162},{0,4,25},{3,4,200},{0,11,9},{1,7,20}, +{0,7,20},{3,4,200},{7,0,200},{0,7,20},{0,5,208},{7,0,200},{0,5,208},{0,0,225},{0,0,225},{0,0,225},{0,0,225},{0,5,0},{0,5,0},{0,5,0},{0,3,0},{0,2,61},{0,2,61},{1,14,410},{1,11,209},{1,8,288},{1,7,234},{0,14,739},{0,10,254},{0,8,33},{0,6,270},{0,8,1131},{0,6,450},{1,14,266},{1,11,65},{2,7,106},{1,7,90},{3,4,723}, +{0,10,238},{0,8,17},{0,6,254},{7,0,723},{0,6,254},{1,11,209},{1,11,209},{1,11,209},{1,7,209},{0,11,178},{0,8,17},{0,8,17},{0,5,18},{0,6,376},{0,5,123},{1,11,65},{1,11,65},{1,11,65},{1,7,65},{3,1,162},{0,8,1},{0,8,1},{0,5,2},{3,3,162},{0,5,2},{3,7,200},{1,11,1},{2,7,25},{0,8,17},{3,7,200},{8,0,200},{0,8,17}, +{0,6,218},{8,0,200},{0,6,218},{1,0,208},{1,0,208},{1,0,208},{1,0,208},{0,8,16},{0,8,16},{0,8,16},{0,5,17},{0,4,80},{0,4,80},{1,16,474},{1,13,276},{1,9,457},{1,9,292},{1,13,740},{1,10,298},{1,8,45},{1,7,315},{0,9,1013},{0,7,308},{2,13,201},{2,11,21},{2,9,21},{2,8,26},{5,0,723},{0,12,227},{1,8,29},{0,7,227},{5,4,723}, +{0,7,227},{1,13,272},{1,13,272},{1,13,272},{1,9,276},{1,10,180},{1,8,29},{1,8,29},{1,6,33},{0,8,306},{0,6,41},{2,10,2},{2,10,2},{2,10,2},{2,7,5},{4,0,162},{0,10,5},{0,10,5},{0,6,5},{1,7,162},{0,6,5},{5,3,200},{1,13,4},{2,9,20},{1,9,20},{5,3,200},{4,7,200},{1,9,20},{0,7,218},{4,7,200},{0,7,218},{1,0,272}, +{1,0,272},{1,0,272},{1,0,272},{1,7,17},{1,7,17},{1,7,17},{1,5,17},{0,6,40},{0,6,40},{2,15,426},{2,13,223},{2,10,283},{2,9,234},{1,16,739},{1,12,267},{1,10,33},{1,8,273},{0,11,913},{0,8,225},{2,15,257},{2,13,54},{3,9,97},{2,9,65},{4,6,723},{0,13,208},{1,10,17},{0,8,209},{3,8,723},{0,8,209},{2,12,219},{2,12,219},{2,12,219}, +{2,9,218},{1,13,180},{1,10,17},{1,10,17},{1,7,18},{0,9,229},{0,7,27},{2,12,50},{2,12,50},{2,12,50},{2,9,49},{3,6,162},{1,10,1},{1,10,1},{1,7,2},{3,6,162},{1,7,2},{1,19,200},{2,13,5},{3,9,16},{2,9,16},{1,19,200},{9,2,200},{2,9,16},{0,8,208},{9,2,200},{0,8,208},{2,0,218},{2,0,218},{2,0,218},{2,0,218},{1,10,16}, +{1,10,16},{1,10,16},{1,7,17},{0,8,17},{0,8,17},{2,18,450},{2,15,259},{2,11,410},{2,11,270},{2,15,749},{2,12,314},{2,10,59},{2,9,333},{0,13,868},{0,9,213},{3,15,201},{3,13,18},{3,11,21},{3,10,26},{6,2,723},{0,15,204},{2,10,34},{0,9,212},{8,3,723},{0,9,212},{2,15,250},{2,15,250},{2,15,250},{2,11,254},{2,12,187},{2,10,43},{2,10,43}, +{2,8,50},{0,11,189},{1,8,37},{3,12,2},{3,12,2},{3,12,2},{3,9,5},{5,2,162},{1,12,2},{1,12,2},{1,8,1},{8,1,162},{1,8,1},{5,8,200},{2,15,9},{3,11,20},{2,11,20},{5,8,200},{4,10,200},{2,11,20},{0,9,208},{4,10,200},{0,9,208},{2,0,250},{2,0,250},{2,0,250},{2,0,250},{2,9,25},{2,9,25},{2,9,25},{2,7,25},{0,9,5}, +{0,9,5},{3,18,410},{3,15,209},{3,12,288},{3,11,234},{2,18,739},{2,14,254},{2,12,33},{2,10,270},{0,15,804},{1,10,227},{3,18,266},{3,15,65},{4,11,106},{3,11,90},{5,8,723},{1,15,219},{2,12,17},{1,10,218},{4,10,723},{1,10,218},{3,15,209},{3,15,209},{3,15,209},{3,11,209},{2,15,178},{2,12,17},{2,12,17},{2,9,18},{0,13,171},{1,9,26},{3,15,65}, +{3,15,65},{3,15,65},{3,11,65},{5,5,162},{2,12,1},{2,12,1},{2,9,2},{5,7,162},{2,9,2},{5,11,200},{3,15,1},{4,11,25},{2,12,17},{5,11,200},{11,3,200},{2,12,17},{0,10,218},{11,3,200},{0,10,218},{3,0,208},{3,0,208},{3,0,208},{3,0,208},{2,12,16},{2,12,16},{2,12,16},{2,9,17},{1,10,9},{1,10,9},{3,20,474},{3,17,276},{3,13,457}, +{3,13,292},{3,17,740},{3,14,298},{3,12,45},{3,11,315},{0,16,747},{1,11,231},{4,17,201},{4,15,21},{4,13,21},{4,12,26},{7,4,723},{1,17,209},{3,12,29},{1,11,227},{9,5,723},{1,11,227},{3,17,272},{3,17,272},{3,17,272},{3,13,276},{3,14,180},{3,12,29},{3,12,29},{3,10,33},{0,15,171},{2,10,41},{4,14,2},{4,14,2},{4,14,2},{4,11,5},{7,1,162}, +{2,14,5},{2,14,5},{2,10,5},{10,2,162},{2,10,5},{8,2,200},{3,17,4},{4,13,20},{3,13,20},{8,2,200},{13,2,200},{3,13,20},{0,11,218},{13,2,200},{0,11,218},{3,0,272},{3,0,272},{3,0,272},{3,0,272},{3,11,17},{3,11,17},{3,11,17},{3,9,17},{1,12,8},{1,12,8},{4,19,426},{4,17,223},{4,14,283},{4,13,234},{3,20,739},{3,16,267},{3,14,33}, +{3,12,273},{0,18,727},{2,12,225},{4,19,257},{4,17,54},{5,13,97},{4,13,65},{6,10,723},{2,17,208},{3,14,17},{2,12,209},{12,3,723},{2,12,209},{4,16,219},{4,16,219},{4,16,219},{4,13,218},{3,17,180},{3,14,17},{3,14,17},{3,11,18},{1,15,171},{2,11,27},{4,16,50},{4,16,50},{4,16,50},{4,13,49},{5,10,162},{3,14,1},{3,14,1},{3,11,2},{12,1,162}, +{3,11,2},{3,23,200},{4,17,5},{5,13,16},{4,13,16},{3,23,200},{11,6,200},{4,13,16},{0,12,208},{11,6,200},{0,12,208},{4,0,218},{4,0,218},{4,0,218},{4,0,218},{3,14,16},{3,14,16},{3,14,16},{3,11,17},{1,13,10},{1,13,10},{4,22,450},{4,19,259},{4,15,410},{4,15,270},{4,19,749},{4,16,314},{4,14,59},{4,13,333},{1,18,747},{2,13,213},{5,19,201}, +{5,17,18},{5,15,21},{5,14,26},{9,1,723},{2,19,204},{4,14,34},{2,13,212},{15,1,723},{2,13,212},{4,19,250},{4,19,250},{4,19,250},{4,15,254},{4,16,187},{4,14,43},{4,14,43},{4,12,50},{1,16,174},{3,12,37},{5,16,2},{5,16,2},{5,16,2},{5,13,5},{8,1,162},{3,16,2},{3,16,2},{3,12,1},{10,5,162},{3,12,1},{9,4,200},{4,19,9},{5,15,20}, +{4,15,20},{9,4,200},{9,10,200},{4,15,20},{0,13,208},{9,10,200},{0,13,208},{4,0,250},{4,0,250},{4,0,250},{4,0,250},{4,13,25},{4,13,25},{4,13,25},{4,11,25},{2,13,5},{2,13,5},{5,22,410},{5,19,209},{5,16,288},{5,15,234},{4,22,739},{4,18,254},{4,16,33},{4,14,270},{1,20,724},{3,14,227},{5,22,266},{5,19,65},{6,15,106},{5,15,90},{9,4,723}, +{3,19,219},{4,16,17},{3,14,218},{9,10,723},{3,14,218},{5,19,209},{5,19,209},{5,19,209},{5,15,209},{4,19,178},{4,16,17},{4,16,17},{4,13,18},{2,17,171},{3,13,26},{5,19,65},{5,19,65},{5,19,65},{5,15,65},{8,4,162},{4,16,1},{4,16,1},{4,13,2},{14,2,162},{4,13,2},{11,0,200},{5,19,1},{6,15,25},{4,16,17},{11,0,200},{13,7,200},{4,16,17}, +{0,14,218},{13,7,200},{0,14,218},{5,0,208},{5,0,208},{5,0,208},{5,0,208},{4,16,16},{4,16,16},{4,16,16},{4,13,17},{3,14,9},{3,14,9},{5,24,474},{5,21,276},{5,17,457},{5,17,292},{5,21,740},{5,18,298},{5,16,45},{5,15,315},{1,22,740},{3,15,231},{6,21,201},{6,19,21},{6,17,21},{6,16,26},{10,3,723},{3,21,209},{5,16,29},{3,15,227},{11,9,723}, +{3,15,227},{5,21,272},{5,21,272},{5,21,272},{5,17,276},{5,18,180},{5,16,29},{5,16,29},{5,14,33},{2,19,171},{4,14,41},{6,18,2},{6,18,2},{6,18,2},{6,15,5},{3,25,162},{4,18,5},{4,18,5},{4,14,5},{12,6,162},{4,14,5},{10,6,200},{5,21,4},{6,17,20},{5,17,20},{10,6,200},{15,6,200},{5,17,20},{0,15,218},{15,6,200},{0,15,218},{5,0,272}, +{5,0,272},{5,0,272},{5,0,272},{5,15,17},{5,15,17},{5,15,17},{5,13,17},{3,16,8},{3,16,8},{6,23,426},{6,21,223},{6,18,283},{6,17,234},{5,24,739},{5,20,267},{5,18,33},{5,16,273},{2,22,727},{4,16,225},{6,23,257},{6,21,54},{7,17,97},{6,17,65},{9,9,723},{4,21,208},{5,18,17},{4,16,209},{14,7,723},{4,16,209},{6,20,219},{6,20,219},{6,20,219}, +{6,17,218},{5,21,180},{5,18,17},{5,18,17},{5,15,18},{3,19,171},{4,15,27},{6,20,50},{6,20,50},{6,20,50},{6,17,49},{9,6,162},{5,18,1},{5,18,1},{5,15,2},{14,5,162},{5,15,2},{12,2,200},{6,21,5},{7,17,16},{6,17,16},{12,2,200},{13,10,200},{6,17,16},{0,16,208},{13,10,200},{0,16,208},{6,0,218},{6,0,218},{6,0,218},{6,0,218},{5,18,16}, +{5,18,16},{5,18,16},{5,15,17},{3,17,10},{3,17,10},{6,26,450},{6,23,259},{6,19,410},{6,19,270},{6,23,749},{6,20,314},{6,18,59},{6,17,333},{3,22,747},{4,17,213},{7,23,201},{7,21,18},{7,19,21},{7,18,26},{11,5,723},{4,23,204},{6,18,34},{4,17,212},{12,11,723},{4,17,212},{6,23,250},{6,23,250},{6,23,250},{6,19,254},{6,20,187},{6,18,43},{6,18,43}, +{6,16,50},{3,20,174},{5,16,37},{7,20,2},{7,20,2},{7,20,2},{7,17,5},{10,5,162},{5,20,2},{5,20,2},{5,16,1},{12,9,162},{5,16,1},{11,8,200},{6,23,9},{7,19,20},{6,19,20},{11,8,200},{11,14,200},{6,19,20},{0,17,208},{11,14,200},{0,17,208},{6,0,250},{6,0,250},{6,0,250},{6,0,250},{6,17,25},{6,17,25},{6,17,25},{6,15,25},{4,17,5}, +{4,17,5},{7,26,410},{7,23,209},{7,20,288},{7,19,234},{6,26,739},{6,22,254},{6,20,33},{6,18,270},{3,24,724},{5,18,227},{7,26,266},{7,23,65},{7,20,144},{7,19,90},{11,8,723},{5,23,219},{6,20,17},{5,18,218},{11,14,723},{5,18,218},{7,23,209},{7,23,209},{7,23,209},{7,19,209},{6,23,178},{6,20,17},{6,20,17},{6,17,18},{4,21,171},{5,17,26},{7,23,65}, +{7,23,65},{7,23,65},{7,19,65},{10,8,162},{6,20,1},{6,20,1},{6,17,2},{11,12,162},{6,17,2},{13,4,200},{7,23,1},{8,19,50},{6,20,17},{13,4,200},{15,11,200},{6,20,17},{0,18,218},{15,11,200},{0,18,218},{7,0,208},{7,0,208},{7,0,208},{7,0,208},{6,20,16},{6,20,16},{6,20,16},{6,17,17},{5,18,9},{5,18,9},{7,28,474},{7,25,276},{7,21,457}, +{7,21,292},{7,25,740},{7,22,298},{7,20,45},{7,19,315},{3,26,740},{5,19,231},{8,23,283},{8,22,133},{8,20,97},{8,20,133},{12,7,723},{5,25,209},{7,20,29},{5,19,227},{13,13,723},{5,19,227},{7,25,272},{7,25,272},{7,25,272},{7,21,276},{7,22,180},{7,20,29},{7,20,29},{7,18,33},{4,23,171},{6,18,41},{8,20,81},{8,20,81},{8,20,81},{8,19,82},{9,14,162}, +{6,22,5},{6,22,5},{6,18,5},{14,10,162},{6,18,5},{15,0,200},{7,25,4},{8,20,16},{7,21,20},{15,0,200},{12,16,200},{7,21,20},{0,19,218},{12,16,200},{0,19,218},{7,0,272},{7,0,272},{7,0,272},{7,0,272},{7,19,17},{7,19,17},{7,19,17},{7,17,17},{5,20,8},{5,20,8},{8,26,642},{8,24,459},{8,22,462},{8,21,467},{7,28,739},{7,24,267},{7,22,33}, +{7,20,273},{4,26,727},{6,20,225},{8,26,201},{8,24,18},{8,22,21},{8,21,26},{14,3,723},{6,25,208},{7,22,17},{6,20,209},{11,17,723},{6,20,209},{8,23,443},{8,23,443},{8,23,443},{8,20,446},{7,25,180},{7,22,17},{7,22,17},{7,19,18},{5,23,171},{6,19,27},{8,23,2},{8,23,2},{8,23,2},{8,20,5},{11,10,162},{7,22,1},{7,22,1},{7,19,2},{5,23,162}, +{7,19,2},{14,6,200},{8,24,17},{8,22,20},{7,22,17},{14,6,200},{15,14,200},{7,22,17},{0,20,208},{15,14,200},{0,20,208},{8,0,442},{8,0,442},{8,0,442},{8,0,442},{7,22,16},{7,22,16},{7,22,16},{7,19,17},{5,21,10},{5,21,10},{8,28,420},{8,26,223},{8,23,283},{8,22,234},{7,31,872},{7,26,371},{7,23,201},{7,21,368},{5,26,747},{6,21,213},{8,28,251}, +{8,26,54},{9,22,97},{8,22,65},{13,9,723},{6,27,204},{7,23,57},{6,21,212},{14,15,723},{6,21,212},{8,25,219},{8,25,219},{8,25,219},{8,22,218},{7,27,308},{7,24,146},{7,24,146},{7,20,145},{5,24,174},{7,20,37},{8,25,50},{8,25,50},{8,25,50},{8,22,49},{12,9,162},{7,24,2},{7,24,2},{7,20,1},{14,13,162},{7,20,1},{13,12,200},{8,26,5},{9,22,16}, +{8,22,16},{13,12,200},{13,18,200},{8,22,16},{0,21,208},{13,18,200},{0,21,208},{8,0,218},{8,0,218},{8,0,218},{8,0,218},{7,24,145},{7,24,145},{7,24,145},{7,20,145},{6,21,5},{6,21,5},{8,31,474},{8,28,276},{9,24,425},{8,24,292},{8,28,740},{8,25,298},{8,23,61},{8,22,315},{5,28,724},{7,22,227},{9,28,200},{9,26,13},{9,24,25},{9,23,29},{13,12,723}, +{7,27,219},{8,23,45},{7,22,218},{13,18,723},{7,22,218},{8,28,272},{8,28,272},{8,28,272},{8,24,276},{8,25,180},{8,23,36},{8,23,36},{8,21,33},{6,25,171},{7,21,26},{9,25,0},{9,25,0},{9,25,0},{9,23,4},{15,2,162},{8,23,20},{8,23,20},{8,21,17},{13,16,162},{8,21,17},{15,8,200},{8,28,4},{9,24,25},{8,24,20},{15,8,200},{11,22,200},{8,24,20}, +{0,22,218},{11,22,200},{0,22,218},{8,0,272},{8,0,272},{8,0,272},{8,0,272},{8,22,17},{8,22,17},{8,22,17},{8,20,17},{7,22,9},{7,22,9},{9,31,410},{9,28,212},{9,25,288},{9,24,224},{8,31,739},{8,27,254},{8,25,33},{8,23,270},{5,30,740},{7,23,231},{9,31,266},{9,28,68},{10,24,97},{9,24,80},{14,11,723},{7,29,209},{8,25,17},{7,23,227},{15,17,723}, +{7,23,227},{9,27,212},{9,27,212},{9,27,212},{9,24,208},{8,28,180},{8,25,17},{8,25,17},{8,22,18},{6,27,171},{7,23,62},{9,27,68},{9,27,68},{9,27,68},{9,24,64},{11,18,162},{8,25,1},{8,25,1},{8,22,2},{10,21,162},{8,22,2},{14,14,200},{9,28,4},{10,24,16},{9,24,16},{14,14,200},{14,20,200},{9,24,16},{0,23,218},{14,20,200},{0,23,218},{9,0,208}, +{9,0,208},{9,0,208},{9,0,208},{8,25,16},{8,25,16},{8,25,16},{8,22,17},{7,24,8},{7,24,8},{9,31,570},{9,30,276},{9,26,457},{9,26,292},{9,30,740},{9,27,298},{9,25,45},{9,24,324},{6,30,727},{7,24,280},{10,30,201},{10,28,18},{10,26,21},{10,25,26},{13,17,723},{8,29,227},{9,25,29},{8,24,224},{13,21,723},{8,24,224},{9,30,272},{9,30,272},{9,30,272}, +{9,26,276},{9,27,180},{9,25,29},{9,25,29},{9,23,33},{7,27,171},{8,23,41},{10,27,2},{10,27,2},{10,27,2},{10,24,5},{13,14,162},{8,27,5},{8,27,5},{8,23,5},{8,25,162},{8,23,5},{13,20,200},{9,30,4},{10,26,20},{9,26,20},{13,20,200},{13,23,202},{9,26,20},{0,24,208},{13,23,202},{0,24,208},{9,0,272},{9,0,272},{9,0,272},{9,0,272},{9,24,17}, +{9,24,17},{9,24,17},{9,22,17},{7,25,10},{7,25,10},{10,31,468},{10,30,223},{10,27,283},{10,26,234},{9,31,835},{9,29,267},{9,27,33},{9,25,273},{7,30,747},{8,25,225},{11,29,283},{10,30,54},{11,26,97},{10,26,65},{15,13,723},{8,30,208},{9,27,17},{8,25,209},{11,25,723},{8,25,209},{10,29,219},{10,29,219},{10,29,219},{10,26,218},{9,30,180},{9,27,17},{9,27,17}, +{9,24,20},{7,28,174},{8,24,17},{10,29,50},{10,29,50},{10,29,50},{10,26,49},{14,13,162},{9,27,1},{9,27,1},{9,24,4},{11,23,162},{9,24,4},{15,16,200},{10,30,5},{11,26,16},{10,26,16},{15,16,200},{15,22,200},{10,26,16},{0,25,208},{15,22,200},{0,25,208},{10,0,218},{10,0,218},{10,0,218},{10,0,218},{9,27,16},{9,27,16},{9,27,16},{9,24,20},{8,24,17}, +{8,24,17},{11,31,632},{10,31,297},{11,28,425},{10,28,292},{10,31,804},{10,29,298},{10,27,61},{10,26,315},{7,31,823},{8,26,231},{11,31,232},{11,30,13},{11,28,25},{11,27,29},{15,16,723},{9,31,216},{10,27,45},{8,26,227},{15,22,723},{8,26,227},{10,31,288},{10,31,288},{10,31,288},{10,28,276},{10,29,180},{10,27,36},{10,27,36},{10,25,33},{7,30,189},{9,25,30},{11,29,0}, +{11,29,0},{11,29,0},{11,27,4},{14,16,162},{9,29,4},{9,29,4},{9,25,5},{15,20,162},{9,25,5},{15,19,200},{11,30,13},{11,28,25},{10,28,20},{15,19,200},{13,26,200},{10,28,20},{0,26,218},{13,26,200},{0,26,218},{10,0,272},{10,0,272},{10,0,272},{10,0,272},{10,26,17},{10,26,17},{10,26,17},{10,24,17},{8,27,5},{8,27,5},{11,31,696},{11,31,237},{11,29,288}, +{11,28,224},{11,31,888},{10,31,254},{10,29,33},{10,27,270},{8,31,824},{9,27,227},{12,31,283},{11,31,93},{12,28,97},{11,28,80},{13,25,723},{10,31,238},{10,29,17},{9,27,218},{12,27,723},{9,27,218},{11,31,212},{11,31,212},{11,31,212},{11,28,208},{10,31,196},{10,29,17},{10,29,17},{10,26,18},{8,30,171},{9,26,26},{11,31,68},{11,31,68},{11,31,68},{11,28,64},{13,22,162}, +{10,29,1},{10,29,1},{10,26,2},{12,25,162},{10,26,2},{13,28,200},{11,31,29},{12,28,16},{11,28,16},{13,28,200},{11,30,200},{11,28,16},{0,27,218},{11,30,200},{0,27,218},{11,0,208},{11,0,208},{11,0,208},{11,0,208},{10,29,16},{10,29,16},{10,29,16},{10,26,17},{9,27,9},{9,27,9},{12,31,804},{12,31,492},{11,30,457},{11,30,292},{11,31,1080},{11,31,298},{11,29,45}, +{11,28,324},{9,31,920},{9,28,218},{12,31,363},{12,31,51},{12,30,21},{12,29,26},{15,21,723},{11,31,282},{11,29,29},{9,28,217},{15,25,723},{9,28,217},{11,31,372},{11,31,372},{11,31,372},{11,30,276},{11,31,180},{11,29,29},{11,29,29},{11,27,33},{8,31,184},{10,27,41},{12,31,2},{12,31,2},{12,31,2},{12,28,5},{15,18,162},{10,31,5},{10,31,5},{10,27,5},{10,29,162}, +{10,27,5},{15,24,200},{12,31,50},{12,30,20},{11,30,20},{15,24,200},{15,27,202},{11,30,20},{0,28,208},{15,27,202},{0,28,208},{11,0,272},{11,0,272},{11,0,272},{11,0,272},{11,28,17},{11,28,17},{11,28,17},{11,26,17},{9,29,8},{9,29,8},{12,31,996},{12,31,492},{12,31,283},{12,30,234},{12,31,1068},{11,31,458},{11,31,33},{11,29,273},{10,31,999},{10,29,225},{13,31,379}, +{13,31,171},{13,30,97},{12,30,65},{14,27,723},{12,31,371},{11,31,17},{10,29,209},{13,29,723},{10,29,209},{12,31,267},{12,31,267},{12,31,267},{12,30,218},{12,30,333},{11,31,17},{11,31,17},{11,28,20},{9,31,212},{10,28,17},{13,30,81},{13,30,81},{13,30,81},{12,30,49},{13,27,162},{11,31,1},{11,31,1},{11,28,4},{13,27,162},{11,28,4},{15,27,202},{13,31,90},{13,30,16}, +{12,30,16},{15,27,202},{15,28,202},{12,30,16},{0,29,208},{15,28,202},{0,29,208},{12,0,218},{12,0,218},{12,0,218},{12,0,218},{11,31,16},{11,31,16},{11,31,16},{11,28,20},{9,30,10},{9,30,10},{13,31,877},{13,31,605},{13,31,436},{12,31,288},{13,31,1021},{12,31,397},{12,31,36},{12,30,210},{11,31,910},{10,30,126},{14,31,414},{13,31,205},{13,31,36},{13,31,4},{15,26,546}, +{13,31,317},{12,31,20},{10,30,122},{14,29,546},{10,30,122},{13,31,436},{13,31,436},{13,31,436},{12,31,288},{12,31,276},{12,31,36},{12,31,36},{12,29,33},{10,31,261},{11,29,30},{13,31,36},{13,31,36},{13,31,36},{13,31,4},{13,30,162},{12,31,20},{12,31,20},{11,29,5},{12,30,162},{11,29,5},{15,28,117},{14,31,61},{14,31,25},{13,31,4},{15,28,117},{14,31,117},{13,31,4}, +{0,30,113},{14,31,117},{0,30,113},{12,0,272},{12,0,272},{12,0,272},{12,0,272},{12,30,17},{12,30,17},{12,30,17},{12,28,17},{10,31,5},{10,31,5},{13,31,845},{13,31,573},{13,31,404},{13,31,244},{13,31,797},{13,31,365},{12,31,196},{12,30,82},{12,31,737},{11,31,58},{14,31,190},{14,31,126},{14,31,90},{14,31,82},{14,31,334},{13,31,221},{13,31,52},{11,31,49},{14,30,333}, +{11,31,49},{13,31,404},{13,31,404},{13,31,404},{13,31,244},{13,31,356},{12,31,196},{12,31,196},{12,30,18},{11,31,333},{11,30,26},{14,31,90},{14,31,90},{14,31,90},{14,31,82},{15,26,162},{13,31,52},{13,31,52},{12,30,2},{14,29,162},{12,30,2},{15,30,25},{15,30,41},{14,31,9},{14,31,1},{15,30,25},{15,30,29},{14,31,1},{0,31,49},{15,30,29},{0,31,49},{13,0,208}, +{13,0,208},{13,0,208},{13,0,208},{12,31,52},{12,31,52},{12,31,52},{12,30,17},{11,31,9},{11,31,9},{14,31,642},{14,31,578},{14,31,542},{13,31,441},{14,31,690},{13,31,370},{13,31,201},{13,31,32},{13,31,610},{12,31,40},{14,31,201},{14,31,137},{14,31,101},{14,31,37},{15,29,193},{14,31,121},{14,31,85},{12,31,4},{14,31,193},{12,31,4},{14,31,542},{14,31,542},{14,31,542}, +{13,31,441},{13,31,473},{13,31,201},{13,31,201},{13,31,32},{12,31,401},{12,31,40},{14,31,101},{14,31,101},{14,31,101},{14,31,37},{15,28,145},{14,31,85},{14,31,85},{12,31,4},{15,29,149},{12,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{13,0,272},{13,0,272},{13,0,272},{13,0,272},{13,31,32}, +{13,31,32},{13,31,32},{13,30,17},{12,31,40},{12,31,40},{14,31,418},{14,31,354},{14,31,318},{14,31,254},{14,31,370},{14,31,242},{14,31,206},{13,31,32},{13,31,418},{13,31,80},{15,31,81},{15,31,81},{15,31,81},{15,31,81},{15,30,54},{14,31,73},{14,31,37},{14,31,9},{15,30,66},{14,31,9},{14,31,318},{14,31,318},{14,31,318},{14,31,254},{14,31,270},{14,31,206},{14,31,206}, +{13,31,32},{13,31,249},{13,31,80},{15,31,81},{15,31,81},{15,31,81},{15,31,81},{15,29,45},{14,31,37},{14,31,37},{14,31,9},{15,30,41},{14,31,9},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{14,0,218},{14,0,218},{14,0,218},{14,0,218},{13,31,160},{13,31,160},{13,31,160},{13,31,32},{13,31,80}, +{13,31,80},{0,9,421},{0,7,113},{0,5,5},{0,4,130},{0,6,925},{0,5,658},{0,4,274},{0,3,670},{0,3,1039},{0,3,751},{0,9,421},{0,7,113},{0,5,5},{0,4,130},{0,6,925},{0,5,658},{0,4,274},{0,3,670},{3,0,925},{0,3,670},{0,4,1},{0,4,1},{0,4,1},{0,3,4},{0,2,85},{0,2,45},{0,2,45},{0,1,50},{0,1,98},{0,1,59},{0,4,1}, +{0,4,1},{0,4,1},{0,3,4},{0,2,85},{0,2,45},{0,2,45},{0,1,50},{1,0,85},{0,1,50},{1,6,421},{0,7,113},{0,5,5},{0,4,130},{1,6,421},{3,2,421},{0,4,130},{0,3,445},{3,2,421},{0,3,445},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,12,425},{0,9,52},{0,6,10}, +{0,6,82},{0,8,1261},{0,6,805},{0,5,322},{0,4,833},{0,4,1445},{0,4,977},{0,12,425},{0,9,52},{0,6,10},{0,6,82},{0,8,1261},{0,6,805},{0,5,322},{0,4,833},{4,0,1261},{0,4,833},{0,7,0},{0,7,0},{0,7,0},{0,4,1},{0,3,225},{0,3,117},{0,3,117},{0,2,125},{0,2,257},{0,2,161},{0,7,0},{0,7,0},{0,7,0},{0,4,1},{1,0,221}, +{0,3,117},{0,3,117},{0,2,125},{1,1,221},{0,2,125},{3,2,421},{0,9,52},{0,6,10},{0,6,82},{3,2,421},{5,1,421},{0,6,82},{0,4,433},{5,1,421},{0,4,433},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,14,430},{0,11,29},{0,7,74},{0,7,46},{0,10,1514},{0,8,874},{0,6,307}, +{0,5,917},{0,5,1814},{0,4,1074},{0,14,430},{0,11,29},{0,7,74},{0,7,46},{3,0,1514},{0,8,874},{0,6,307},{0,5,917},{5,0,1514},{0,5,917},{0,10,10},{0,10,10},{0,10,10},{0,6,10},{0,5,340},{0,5,160},{0,5,160},{0,3,169},{0,3,421},{0,3,250},{0,10,10},{0,10,10},{0,10,10},{0,6,10},{1,2,338},{0,5,160},{0,5,160},{0,3,169},{1,2,338}, +{0,3,169},{4,1,421},{0,11,20},{1,7,5},{0,7,37},{4,1,421},{7,0,421},{0,7,37},{0,5,433},{7,0,421},{0,5,433},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,1,0},{0,1,0},{0,1,0},{0,1,4},{0,0,9},{0,0,9},{0,17,542},{0,13,130},{0,9,285},{0,8,137},{0,12,1517},{0,9,737},{0,7,185},{0,6,794},{0,7,1982},{0,5,1062},{1,13,450}, +{1,11,77},{1,8,34},{1,7,122},{3,3,1517},{0,9,737},{0,7,185},{0,6,794},{2,5,1514},{0,6,794},{0,12,121},{0,12,121},{0,12,121},{0,7,125},{0,8,338},{0,6,98},{0,6,98},{0,4,97},{0,4,514},{0,4,241},{1,9,25},{1,9,25},{1,9,25},{1,6,26},{0,8,338},{0,6,98},{0,6,98},{0,4,97},{4,0,338},{0,4,97},{5,0,421},{0,13,9},{1,8,9}, +{0,8,16},{5,0,421},{8,0,421},{0,8,16},{0,6,433},{8,0,421},{0,6,433},{0,0,121},{0,0,121},{0,0,121},{0,0,121},{0,4,1},{0,4,1},{0,4,1},{0,2,1},{0,2,37},{0,2,37},{1,16,697},{1,13,297},{1,9,354},{1,9,309},{0,15,1517},{0,11,630},{0,9,50},{0,7,670},{0,8,2198},{0,6,1109},{1,16,441},{1,13,41},{1,9,98},{1,9,53},{4,2,1514}, +{0,11,630},{0,9,50},{0,7,670},{6,2,1514},{0,7,670},{1,12,273},{1,12,273},{1,12,273},{1,8,273},{0,11,338},{0,8,41},{0,8,41},{0,5,50},{0,6,680},{0,5,275},{1,12,17},{1,12,17},{1,12,17},{1,8,17},{3,1,338},{0,8,41},{0,8,41},{0,5,50},{3,3,338},{0,5,50},{6,0,421},{0,15,1},{2,9,5},{0,9,1},{6,0,421},{5,6,421},{0,9,1}, +{0,7,445},{5,6,421},{0,7,445},{1,0,272},{1,0,272},{1,0,272},{1,0,272},{0,7,1},{0,7,1},{0,7,1},{0,4,0},{0,3,106},{0,3,106},{1,19,821},{1,15,405},{1,11,570},{1,10,410},{0,18,1514},{0,13,577},{0,10,14},{0,8,602},{0,10,2462},{0,7,1175},{2,16,450},{2,13,77},{2,10,35},{2,10,107},{3,8,1514},{0,13,577},{0,10,14},{0,8,602},{4,6,1514}, +{0,8,602},{1,14,401},{1,14,401},{1,14,401},{1,9,404},{0,13,340},{0,10,13},{0,10,13},{0,6,29},{0,7,851},{0,6,353},{2,11,25},{2,11,25},{2,11,25},{2,8,26},{4,0,338},{0,10,13},{0,10,13},{0,6,29},{1,7,338},{0,6,29},{5,6,421},{1,15,5},{2,10,10},{0,10,10},{5,6,421},{10,1,421},{0,10,10},{0,8,433},{10,1,421},{0,8,433},{1,0,400}, +{1,0,400},{1,0,400},{1,0,400},{0,9,1},{0,9,1},{0,9,1},{0,6,4},{0,4,208},{0,4,208},{1,22,902},{1,17,485},{2,11,750},{1,11,482},{0,21,1566},{0,15,570},{0,11,95},{0,9,582},{0,11,2337},{0,9,933},{2,18,430},{2,15,29},{2,11,74},{2,11,46},{5,4,1514},{0,15,521},{0,11,46},{0,9,533},{9,1,1514},{0,9,533},{1,17,481},{1,17,481},{1,17,481}, +{1,11,481},{0,16,387},{0,12,51},{0,12,51},{0,7,75},{0,8,755},{0,7,222},{2,14,10},{2,14,10},{2,14,10},{2,10,10},{3,6,338},{0,12,2},{0,12,2},{0,7,26},{3,6,338},{0,7,26},{7,2,421},{1,17,4},{3,11,5},{1,11,1},{7,2,421},{12,0,421},{1,11,1},{0,9,433},{12,0,421},{0,9,433},{1,0,481},{1,0,481},{1,0,481},{1,0,481},{0,12,50}, +{0,12,50},{0,12,50},{0,7,50},{0,6,157},{0,6,157},{2,21,866},{2,17,454},{2,13,609},{2,12,461},{1,20,1515},{1,15,578},{1,12,19},{1,10,603},{0,13,2214},{0,10,707},{3,17,450},{3,15,77},{3,12,34},{3,11,122},{7,0,1514},{0,16,458},{1,12,18},{0,10,482},{4,9,1514},{0,10,482},{2,16,445},{2,16,445},{2,16,445},{2,11,449},{1,15,341},{1,12,19},{1,12,19}, +{1,8,26},{0,10,635},{0,8,106},{3,13,25},{3,13,25},{3,13,25},{3,10,26},{5,2,338},{0,14,2},{0,14,2},{0,9,20},{8,1,338},{0,9,20},{7,4,421},{2,17,9},{3,12,9},{1,12,9},{7,4,421},{11,3,421},{1,12,9},{0,10,433},{11,3,421},{0,10,433},{2,0,445},{2,0,445},{2,0,445},{2,0,445},{1,11,2},{1,11,2},{1,11,2},{1,7,10},{0,8,90}, +{0,8,90},{2,24,902},{2,19,482},{3,13,723},{2,13,482},{1,23,1578},{1,17,566},{1,14,117},{1,11,590},{0,15,2046},{0,11,535},{3,20,441},{3,17,41},{3,13,98},{3,13,53},{7,3,1514},{0,18,429},{2,13,50},{0,11,454},{11,2,1514},{0,11,454},{2,19,481},{2,19,481},{2,19,481},{2,13,481},{1,18,404},{1,14,68},{1,14,68},{1,10,89},{0,12,557},{0,10,49},{3,16,17}, +{3,16,17},{3,16,17},{3,12,17},{5,5,338},{1,14,4},{1,14,4},{0,10,13},{5,7,338},{0,10,13},{8,2,421},{2,19,1},{4,13,5},{2,13,1},{8,2,421},{14,1,421},{2,13,1},{0,11,445},{14,1,421},{0,11,445},{2,0,481},{2,0,481},{2,0,481},{2,0,481},{1,14,64},{1,14,64},{1,14,64},{1,9,65},{0,10,40},{0,10,40},{3,23,854},{3,19,438},{3,15,603}, +{3,14,443},{2,22,1515},{2,17,578},{2,14,15},{2,12,603},{0,16,1911},{0,12,458},{4,20,450},{4,17,77},{4,14,35},{4,14,107},{5,12,1514},{0,20,425},{2,14,14},{0,12,433},{13,1,1514},{0,12,433},{3,18,434},{3,18,434},{3,18,434},{3,13,437},{2,17,341},{2,14,14},{2,14,14},{2,10,30},{0,14,477},{0,11,35},{4,15,25},{4,15,25},{4,15,25},{4,12,26},{7,1,338}, +{1,16,5},{1,16,5},{1,11,10},{10,2,338},{1,11,10},{8,5,421},{3,19,5},{4,14,10},{2,14,10},{8,5,421},{12,5,421},{2,14,10},{0,12,433},{12,5,421},{0,12,433},{3,0,433},{3,0,433},{3,0,433},{3,0,433},{2,13,2},{2,13,2},{2,13,2},{2,10,5},{0,12,25},{0,12,25},{3,26,902},{3,21,485},{4,15,750},{3,15,482},{2,25,1566},{2,19,570},{2,15,95}, +{2,13,582},{0,18,1787},{0,13,442},{4,22,430},{4,19,29},{4,15,74},{4,15,46},{8,3,1514},{1,20,425},{2,15,46},{0,13,442},{11,5,1514},{0,13,442},{3,21,481},{3,21,481},{3,21,481},{3,15,481},{2,20,387},{2,16,51},{2,16,51},{2,11,75},{0,16,419},{1,12,69},{4,18,10},{4,18,10},{4,18,10},{4,14,10},{5,10,338},{2,16,2},{2,16,2},{1,12,20},{12,1,338}, +{1,12,20},{9,4,421},{3,21,4},{5,15,5},{3,15,1},{9,4,421},{15,3,421},{3,15,1},{0,13,433},{15,3,421},{0,13,433},{3,0,481},{3,0,481},{3,0,481},{3,0,481},{2,16,50},{2,16,50},{2,16,50},{2,11,50},{0,13,9},{0,13,9},{4,25,866},{4,21,454},{4,17,609},{4,16,461},{3,24,1515},{3,19,578},{3,16,19},{3,14,603},{0,20,1686},{1,14,458},{5,21,450}, +{5,19,77},{5,16,34},{5,15,122},{3,24,1514},{1,22,425},{3,16,18},{1,14,433},{14,3,1514},{1,14,433},{4,20,445},{4,20,445},{4,20,445},{4,15,449},{3,19,341},{3,16,19},{3,16,19},{3,12,26},{0,17,372},{1,13,45},{5,17,25},{5,17,25},{5,17,25},{5,14,26},{8,1,338},{2,18,2},{2,18,2},{2,13,20},{10,5,338},{2,13,20},{11,0,421},{4,21,9},{5,16,9}, +{3,16,9},{11,0,421},{13,7,421},{3,16,9},{0,14,433},{13,7,421},{0,14,433},{4,0,445},{4,0,445},{4,0,445},{4,0,445},{3,15,2},{3,15,2},{3,15,2},{3,11,10},{0,15,5},{0,15,5},{4,28,902},{4,23,482},{5,17,723},{4,17,482},{3,27,1578},{3,21,566},{3,18,117},{3,15,590},{0,22,1614},{1,15,462},{5,24,441},{5,21,41},{5,17,98},{5,17,53},{5,20,1514}, +{2,22,429},{4,17,50},{2,15,454},{13,6,1514},{2,15,454},{4,23,481},{4,23,481},{4,23,481},{4,17,481},{3,22,404},{3,18,68},{3,18,68},{3,14,89},{0,19,347},{2,14,49},{5,20,17},{5,20,17},{5,20,17},{5,16,17},{8,4,338},{3,18,4},{3,18,4},{2,14,13},{14,2,338},{2,14,13},{11,3,421},{4,23,1},{6,17,5},{4,17,1},{11,3,421},{15,6,421},{4,17,1}, +{0,15,445},{15,6,421},{0,15,445},{4,0,481},{4,0,481},{4,0,481},{4,0,481},{3,18,64},{3,18,64},{3,18,64},{3,13,65},{1,16,8},{1,16,8},{5,27,854},{5,23,438},{5,19,603},{5,18,443},{4,26,1515},{4,21,578},{4,18,15},{4,16,603},{0,23,1566},{2,16,458},{6,24,450},{6,21,77},{6,18,35},{6,18,107},{11,1,1514},{2,24,425},{4,18,14},{2,16,433},{15,5,1514}, +{2,16,433},{5,22,434},{5,22,434},{5,22,434},{5,17,437},{4,21,341},{4,18,14},{4,18,14},{4,14,30},{0,21,341},{2,15,35},{6,19,25},{6,19,25},{6,19,25},{6,16,26},{3,25,338},{3,20,5},{3,20,5},{3,15,10},{12,6,338},{3,15,10},{12,2,421},{5,23,5},{6,18,10},{4,18,10},{12,2,421},{14,9,421},{4,18,10},{0,16,433},{14,9,421},{0,16,433},{5,0,433}, +{5,0,433},{5,0,433},{5,0,433},{4,17,2},{4,17,2},{4,17,2},{4,14,5},{1,17,10},{1,17,10},{5,30,902},{5,25,485},{6,19,750},{5,19,482},{4,29,1566},{4,23,570},{4,19,95},{4,17,582},{0,25,1533},{2,17,442},{6,26,430},{6,23,29},{6,19,74},{6,19,46},{10,7,1514},{3,24,425},{4,19,46},{2,17,442},{13,9,1514},{2,17,442},{5,25,481},{5,25,481},{5,25,481}, +{5,19,481},{4,24,387},{4,20,51},{4,20,51},{4,15,75},{1,21,341},{3,16,69},{6,22,10},{6,22,10},{6,22,10},{6,18,10},{9,6,338},{4,20,2},{4,20,2},{3,16,20},{14,5,338},{3,16,20},{11,8,421},{5,25,4},{7,19,5},{5,19,1},{11,8,421},{11,14,421},{5,19,1},{0,17,433},{11,14,421},{0,17,433},{5,0,481},{5,0,481},{5,0,481},{5,0,481},{4,20,50}, +{4,20,50},{4,20,50},{4,15,50},{2,17,9},{2,17,9},{6,29,866},{6,25,454},{6,21,609},{6,20,461},{5,28,1515},{5,23,578},{5,20,19},{5,18,603},{0,27,1521},{3,18,458},{7,25,450},{7,23,77},{7,20,34},{7,19,122},{12,3,1514},{3,26,425},{5,20,18},{3,18,433},{11,13,1514},{3,18,433},{6,24,445},{6,24,445},{6,24,445},{6,19,449},{5,23,341},{5,20,19},{5,20,19}, +{5,16,26},{1,23,341},{3,17,45},{7,21,25},{7,21,25},{7,21,25},{7,18,26},{10,5,338},{4,22,2},{4,22,2},{4,17,20},{12,9,338},{4,17,20},{13,4,421},{6,25,9},{7,20,9},{5,20,9},{13,4,421},{15,11,421},{5,20,9},{0,18,433},{15,11,421},{0,18,433},{6,0,445},{6,0,445},{6,0,445},{6,0,445},{5,19,2},{5,19,2},{5,19,2},{5,15,10},{2,19,5}, +{2,19,5},{6,31,914},{6,27,482},{7,21,723},{6,21,482},{5,31,1578},{5,25,566},{5,22,117},{5,19,590},{1,27,1535},{3,19,462},{7,28,441},{7,25,41},{7,21,98},{7,21,53},{8,19,1514},{4,26,429},{6,21,50},{4,19,454},{15,10,1514},{4,19,454},{6,27,481},{6,27,481},{6,27,481},{6,21,481},{5,26,404},{5,22,68},{5,22,68},{5,18,89},{2,23,347},{4,18,49},{7,24,17}, +{7,24,17},{7,24,17},{7,20,17},{10,8,338},{5,22,4},{5,22,4},{4,18,13},{11,12,338},{4,18,13},{15,0,421},{6,27,1},{8,21,50},{6,21,1},{15,0,421},{13,15,421},{6,21,1},{0,19,445},{13,15,421},{0,19,445},{6,0,481},{6,0,481},{6,0,481},{6,0,481},{5,22,64},{5,22,64},{5,22,64},{5,17,65},{3,20,8},{3,20,8},{7,31,854},{7,27,438},{7,23,603}, +{7,22,443},{6,30,1515},{6,25,578},{6,22,15},{6,20,603},{1,29,1518},{4,20,458},{7,31,565},{7,27,149},{8,22,174},{7,22,154},{13,5,1514},{4,28,425},{6,22,14},{4,20,433},{12,15,1514},{4,20,433},{7,26,434},{7,26,434},{7,26,434},{7,21,437},{6,25,341},{6,22,14},{6,22,14},{6,18,30},{2,25,341},{4,19,35},{7,26,145},{7,26,145},{7,26,145},{7,21,148},{9,14,338}, +{5,24,5},{5,24,5},{5,19,10},{14,10,338},{5,19,10},{15,3,421},{7,27,5},{8,22,5},{6,22,10},{15,3,421},{15,14,421},{6,22,10},{0,20,433},{15,14,421},{0,20,433},{7,0,433},{7,0,433},{7,0,433},{7,0,433},{6,21,2},{6,21,2},{6,21,2},{6,18,5},{3,21,10},{3,21,10},{7,31,1046},{7,29,485},{7,24,770},{7,23,482},{7,29,1598},{6,27,570},{6,23,95}, +{6,21,582},{2,29,1533},{4,21,442},{8,28,450},{8,26,77},{8,23,35},{8,23,107},{15,1,1514},{5,28,425},{6,23,46},{4,21,442},{15,13,1514},{4,21,442},{7,29,481},{7,29,481},{7,29,481},{7,23,481},{6,28,387},{6,24,51},{6,24,51},{6,19,75},{3,25,341},{5,20,69},{8,24,25},{8,24,25},{8,24,25},{8,21,26},{11,10,338},{6,24,2},{6,24,2},{5,20,20},{5,23,338}, +{5,20,20},{13,12,421},{7,29,4},{8,23,10},{7,23,1},{13,12,421},{13,18,421},{7,23,1},{0,21,433},{13,18,421},{0,21,433},{7,0,481},{7,0,481},{7,0,481},{7,0,481},{6,24,50},{6,24,50},{6,24,50},{6,19,50},{4,21,9},{4,21,9},{8,31,1106},{8,28,714},{8,24,749},{8,24,734},{7,31,1542},{7,27,578},{7,24,19},{7,22,603},{2,31,1521},{5,22,458},{8,31,430}, +{8,28,38},{8,24,73},{8,24,58},{14,7,1514},{5,30,425},{7,24,18},{5,22,433},{13,17,1514},{5,22,433},{8,27,686},{8,27,686},{8,27,686},{8,23,686},{7,27,341},{7,24,19},{7,24,19},{7,20,26},{3,27,341},{5,21,45},{8,27,10},{8,27,10},{8,27,10},{8,23,10},{12,9,338},{6,26,2},{6,26,2},{6,21,20},{14,13,338},{6,21,20},{15,8,421},{7,31,20},{9,24,4}, +{7,24,9},{15,8,421},{15,17,421},{7,24,9},{0,22,433},{15,17,421},{0,22,433},{8,0,685},{8,0,685},{8,0,685},{8,0,685},{7,23,2},{7,23,2},{7,23,2},{7,19,10},{4,23,5},{4,23,5},{8,31,1034},{8,30,438},{8,26,603},{8,25,443},{8,30,1806},{7,29,566},{7,26,117},{7,23,590},{3,31,1535},{5,23,462},{9,31,437},{9,28,77},{9,25,33},{9,25,98},{10,23,1514}, +{6,30,429},{7,26,53},{6,23,454},{11,21,1514},{6,23,454},{8,29,434},{8,29,434},{8,29,434},{8,24,437},{7,30,404},{7,26,68},{7,26,68},{7,22,89},{4,27,347},{6,22,49},{9,26,17},{9,26,17},{9,26,17},{9,23,20},{15,2,338},{7,26,4},{7,26,4},{6,22,13},{13,16,338},{6,22,13},{15,11,421},{8,30,5},{9,25,17},{8,25,10},{15,11,421},{15,19,421},{8,25,10}, +{0,23,445},{15,19,421},{0,23,445},{8,0,433},{8,0,433},{8,0,433},{8,0,433},{7,26,64},{7,26,64},{7,26,64},{7,21,65},{5,24,8},{5,24,8},{9,31,1174},{8,31,506},{9,26,723},{8,26,482},{8,31,1643},{7,30,717},{8,26,131},{7,24,725},{4,31,1566},{6,24,458},{9,31,549},{9,30,41},{9,26,98},{9,26,53},{15,9,1514},{7,30,461},{8,26,50},{6,24,433},{14,19,1514}, +{6,24,433},{8,31,490},{8,31,490},{8,31,490},{8,26,481},{8,28,421},{8,25,122},{8,25,122},{8,22,131},{4,29,341},{6,23,35},{9,29,17},{9,29,17},{9,29,17},{9,25,17},{11,18,338},{7,28,5},{7,28,5},{7,23,10},{10,21,338},{7,23,10},{14,17,421},{9,30,25},{10,26,5},{8,26,1},{14,17,421},{13,23,421},{8,26,1},{0,24,433},{13,23,421},{0,24,433},{8,0,481}, +{8,0,481},{8,0,481},{8,0,481},{8,24,82},{8,24,82},{8,24,82},{8,21,81},{5,25,10},{5,25,10},{9,31,1334},{9,31,470},{9,28,597},{9,27,443},{9,31,1815},{8,30,578},{8,27,15},{8,25,603},{5,31,1638},{6,25,442},{10,31,506},{10,30,77},{10,27,35},{10,27,107},{14,15,1514},{7,31,506},{8,27,14},{6,25,442},{12,23,1514},{6,25,442},{9,31,434},{9,31,434},{9,31,434}, +{9,26,437},{8,30,341},{8,27,14},{8,27,14},{8,23,30},{5,29,341},{7,24,69},{10,28,25},{10,28,25},{10,28,25},{10,25,26},{13,14,338},{8,27,13},{8,27,13},{7,24,20},{8,25,338},{7,24,20},{15,16,421},{9,31,37},{10,27,10},{8,27,10},{15,16,421},{15,22,421},{8,27,10},{0,25,433},{15,22,421},{0,25,433},{9,0,433},{9,0,433},{9,0,433},{9,0,433},{8,26,2}, +{8,26,2},{8,26,2},{8,23,5},{6,25,9},{6,25,9},{10,31,1470},{10,31,735},{10,28,749},{9,28,481},{9,31,1895},{8,31,579},{8,28,89},{8,26,582},{6,31,1761},{7,26,458},{11,31,614},{10,31,59},{10,28,73},{10,28,58},{13,21,1514},{8,31,530},{8,28,40},{7,26,433},{15,21,1514},{7,26,433},{9,31,562},{9,31,562},{9,31,562},{9,28,481},{9,30,421},{8,29,51},{8,29,51}, +{8,24,65},{5,31,341},{7,25,45},{10,31,10},{10,31,10},{10,31,10},{10,27,10},{14,13,338},{8,29,2},{8,29,2},{8,24,16},{11,23,338},{8,24,16},{15,19,421},{10,31,50},{11,28,4},{9,28,0},{15,19,421},{13,26,421},{9,28,0},{0,26,433},{13,26,421},{0,26,433},{9,0,481},{9,0,481},{9,0,481},{9,0,481},{8,29,50},{8,29,50},{8,29,50},{8,24,49},{6,27,5}, +{6,27,5},{11,31,1838},{10,31,753},{10,30,603},{10,29,443},{10,31,2046},{9,31,629},{9,29,21},{9,27,589},{7,31,1935},{7,27,462},{11,31,749},{11,31,120},{11,29,33},{11,29,98},{12,27,1514},{9,31,629},{9,29,21},{7,27,461},{13,25,1514},{7,27,461},{10,31,497},{10,31,497},{10,31,497},{10,28,437},{9,31,388},{9,29,20},{9,29,20},{9,25,29},{6,31,347},{8,25,105},{11,30,17}, +{11,30,17},{11,30,17},{11,27,20},{14,16,338},{8,31,4},{8,31,4},{8,26,10},{15,20,338},{8,26,10},{14,25,421},{11,31,104},{11,29,17},{10,29,10},{14,25,421},{12,29,421},{10,29,10},{0,27,445},{12,29,421},{0,27,445},{10,0,433},{10,0,433},{10,0,433},{10,0,433},{9,28,1},{9,28,1},{9,28,1},{9,25,4},{7,28,8},{7,28,8},{11,31,1902},{11,31,1001},{11,30,723}, +{10,30,482},{11,31,2286},{10,31,782},{9,31,117},{9,28,578},{8,31,2118},{7,29,491},{12,31,770},{12,31,338},{11,30,98},{11,30,53},{14,23,1514},{10,31,701},{10,30,50},{8,28,442},{11,29,1514},{8,28,442},{11,31,677},{11,31,677},{11,31,677},{10,30,481},{10,31,437},{9,31,68},{9,31,68},{9,27,89},{7,31,379},{8,27,49},{11,31,52},{11,31,52},{11,31,52},{11,29,17},{13,22,338}, +{9,31,4},{9,31,4},{8,27,13},{12,25,338},{8,27,13},{15,24,421},{12,31,169},{12,30,5},{10,30,1},{15,24,421},{15,27,421},{10,30,1},{0,28,433},{15,27,421},{0,28,433},{10,0,481},{10,0,481},{10,0,481},{10,0,481},{9,31,64},{9,31,64},{9,31,64},{9,26,65},{7,29,10},{7,29,10},{12,31,2151},{11,31,1254},{11,31,629},{11,31,442},{11,31,2393},{10,31,975},{10,31,14}, +{10,29,570},{9,31,2241},{8,29,425},{13,31,931},{12,31,395},{12,31,34},{12,30,105},{13,29,1459},{11,31,778},{10,31,13},{8,29,400},{14,27,1459},{8,29,400},{11,31,629},{11,31,629},{11,31,629},{11,30,437},{10,31,581},{10,31,14},{10,31,14},{10,27,30},{8,31,477},{8,28,45},{12,31,34},{12,31,34},{12,31,34},{12,29,26},{15,18,338},{10,31,13},{10,31,13},{9,28,17},{10,29,338}, +{9,28,17},{15,27,394},{13,31,218},{12,31,9},{10,31,9},{15,27,394},{15,28,394},{10,31,9},{0,29,400},{15,28,394},{0,29,400},{11,0,433},{11,0,433},{11,0,433},{11,0,433},{10,30,2},{10,30,2},{10,30,2},{10,27,5},{8,29,25},{8,29,25},{12,31,1767},{12,31,1167},{12,31,806},{11,31,506},{12,31,1983},{11,31,747},{11,31,122},{10,29,346},{10,31,1836},{8,30,217},{13,31,611}, +{13,31,339},{12,31,130},{12,31,10},{15,24,1064},{12,31,587},{11,31,41},{8,30,217},{15,27,1067},{8,30,217},{12,31,806},{12,31,806},{12,31,806},{11,31,506},{11,31,581},{11,31,122},{11,31,122},{10,28,65},{9,31,557},{9,29,69},{12,31,130},{12,31,130},{12,31,130},{12,31,10},{13,27,338},{11,31,41},{11,31,41},{10,28,16},{13,27,338},{10,28,16},{14,31,200},{14,31,136},{13,31,1}, +{12,31,1},{14,31,200},{15,29,200},{12,31,1},{0,30,208},{15,29,200},{0,30,208},{11,0,481},{11,0,481},{11,0,481},{11,0,481},{11,30,82},{11,30,82},{11,30,82},{10,28,49},{8,30,9},{8,30,9},{13,31,1646},{12,31,1194},{12,31,833},{12,31,497},{12,31,1686},{12,31,750},{11,31,221},{11,30,122},{11,31,1541},{9,30,110},{14,31,542},{13,31,285},{13,31,116},{13,31,20},{15,26,722}, +{13,31,429},{12,31,100},{10,30,74},{14,29,722},{10,30,74},{12,31,833},{12,31,833},{12,31,833},{12,31,497},{12,31,725},{11,31,221},{11,31,221},{11,29,29},{10,31,632},{9,30,46},{13,31,116},{13,31,116},{13,31,116},{13,31,20},{13,30,338},{12,31,100},{12,31,100},{10,30,10},{12,30,338},{10,30,10},{15,29,61},{14,31,37},{14,31,1},{13,31,4},{15,29,61},{15,30,61},{13,31,4}, +{0,30,73},{15,30,61},{0,30,73},{12,0,433},{12,0,433},{12,0,433},{12,0,433},{11,31,25},{11,31,25},{11,31,25},{11,29,4},{9,31,17},{9,31,17},{13,31,1406},{13,31,1134},{13,31,965},{12,31,737},{13,31,1454},{12,31,702},{12,31,341},{11,31,89},{11,31,1381},{10,31,49},{14,31,318},{14,31,254},{14,31,218},{13,31,116},{14,31,510},{13,31,333},{13,31,164},{10,31,13},{14,30,509}, +{10,31,13},{13,31,965},{13,31,965},{13,31,965},{12,31,737},{12,31,869},{12,31,341},{12,31,341},{11,31,89},{11,31,756},{10,31,49},{14,31,218},{14,31,218},{14,31,218},{13,31,116},{15,26,338},{13,31,164},{13,31,164},{10,31,13},{14,29,338},{10,31,13},{15,30,9},{15,31,9},{15,31,9},{14,31,9},{15,30,9},{15,31,9},{14,31,9},{0,31,9},{15,31,9},{0,31,9},{12,0,481}, +{12,0,481},{12,0,481},{12,0,481},{12,31,85},{12,31,85},{12,31,85},{11,30,65},{10,31,40},{10,31,40},{13,31,1315},{13,31,1043},{13,31,874},{13,31,602},{13,31,1171},{13,31,627},{13,31,458},{12,31,5},{12,31,1087},{11,31,80},{14,31,225},{14,31,161},{14,31,125},{14,31,61},{15,29,297},{14,31,193},{14,31,157},{12,31,4},{14,31,297},{12,31,4},{13,31,874},{13,31,874},{13,31,874}, +{13,31,602},{13,31,730},{13,31,458},{13,31,458},{12,31,5},{11,31,705},{11,31,80},{14,31,125},{14,31,125},{14,31,125},{14,31,61},{14,31,221},{14,31,157},{14,31,157},{12,31,4},{15,29,221},{12,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{13,0,433},{13,0,433},{13,0,433},{13,0,433},{12,31,101}, +{12,31,101},{12,31,101},{12,31,5},{11,31,80},{11,31,80},{14,31,885},{14,31,821},{14,31,785},{13,31,650},{14,31,885},{13,31,483},{13,31,314},{13,31,81},{13,31,779},{11,31,144},{15,31,169},{14,31,145},{14,31,109},{14,31,45},{15,30,118},{14,31,81},{14,31,45},{13,31,0},{15,30,114},{13,31,0},{14,31,785},{14,31,785},{14,31,785},{13,31,650},{13,31,586},{13,31,314},{13,31,314}, +{13,31,81},{12,31,518},{11,31,144},{14,31,109},{14,31,109},{14,31,109},{14,31,45},{15,29,85},{14,31,45},{14,31,45},{13,31,0},{14,31,85},{13,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{13,0,481},{13,0,481},{13,0,481},{13,0,481},{13,31,145},{13,31,145},{13,31,145},{13,31,81},{11,31,144}, +{11,31,144},{0,13,884},{0,10,225},{0,7,18},{0,6,265},{0,9,1899},{0,7,1355},{0,6,589},{0,4,1354},{0,5,2124},{0,4,1498},{0,13,884},{0,10,225},{0,7,18},{0,6,265},{2,2,1896},{0,7,1355},{0,6,589},{0,4,1354},{1,4,1896},{0,4,1354},{0,6,0},{0,6,0},{0,6,0},{0,4,4},{0,3,162},{0,3,90},{0,3,90},{0,2,104},{0,2,200},{0,1,134},{0,6,0}, +{0,6,0},{0,6,0},{0,4,4},{0,3,162},{0,3,90},{0,3,90},{0,2,104},{0,2,164},{0,2,104},{3,3,882},{0,10,225},{0,7,18},{0,6,265},{3,3,882},{4,3,882},{0,6,265},{0,5,890},{4,3,882},{0,5,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,15,884},{0,12,170},{0,8,8}, +{0,7,202},{0,10,2360},{0,8,1530},{0,7,643},{0,5,1579},{0,6,2684},{0,5,1804},{0,15,884},{0,12,170},{0,8,8},{0,7,202},{1,7,2355},{0,8,1530},{0,7,643},{0,5,1579},{1,5,2355},{0,5,1579},{0,9,1},{0,9,1},{0,9,1},{0,5,1},{0,4,340},{0,4,180},{0,4,180},{0,2,200},{0,2,392},{0,2,236},{0,9,1},{0,9,1},{0,9,1},{0,5,1},{1,1,338}, +{0,4,180},{0,4,180},{0,2,200},{2,0,340},{0,2,200},{4,2,882},{0,12,170},{0,8,8},{0,7,202},{4,2,882},{6,2,882},{0,7,202},{0,6,890},{6,2,882},{0,6,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,18,882},{0,14,106},{0,10,52},{0,9,148},{0,12,2899},{0,9,1773},{0,8,725}, +{0,6,1854},{0,7,3348},{0,5,2124},{0,18,882},{0,14,106},{0,10,52},{0,9,148},{1,9,2899},{0,9,1773},{0,8,725},{0,6,1854},{6,0,2899},{0,6,1854},{0,11,1},{0,11,1},{0,11,1},{0,7,1},{0,6,580},{0,5,306},{0,5,306},{0,3,325},{0,3,667},{0,3,406},{0,11,1},{0,11,1},{0,11,1},{0,7,1},{1,2,580},{0,5,306},{0,5,306},{0,3,325},{2,1,578}, +{0,3,325},{3,8,882},{0,14,106},{1,9,13},{0,9,148},{3,8,882},{4,6,882},{0,9,148},{0,7,890},{4,6,882},{0,7,890},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,21,920},{0,16,89},{0,11,153},{0,10,121},{0,14,3051},{0,11,1709},{0,9,557},{0,7,1795},{0,8,3651},{0,6,2174},{0,21,920}, +{0,16,89},{1,10,108},{0,10,121},{4,1,3048},{0,11,1709},{0,9,557},{0,7,1795},{3,5,3048},{0,7,1795},{0,14,37},{0,14,37},{0,14,37},{0,8,37},{0,8,648},{0,7,274},{0,7,274},{0,4,277},{0,4,824},{0,4,421},{0,14,37},{0,14,37},{0,14,37},{0,8,37},{0,8,648},{0,7,274},{0,7,274},{0,4,277},{4,0,648},{0,4,277},{5,4,882},{0,16,53},{1,10,8}, +{0,10,85},{5,4,882},{9,1,882},{0,10,85},{0,8,900},{9,1,882},{0,8,900},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,2,0},{0,2,0},{0,2,0},{0,1,1},{0,1,10},{0,1,10},{0,23,1115},{0,18,242},{1,12,309},{0,11,259},{0,17,3051},{0,13,1579},{0,10,346},{0,8,1630},{0,9,3924},{0,7,2173},{1,20,885},{1,16,90},{1,12,53},{1,11,131},{4,4,3048}, +{0,13,1579},{0,10,346},{0,8,1630},{7,2,3048},{0,8,1630},{0,17,226},{0,17,226},{0,17,226},{0,10,225},{0,11,648},{0,9,169},{0,9,169},{0,5,200},{0,6,990},{0,5,425},{1,13,2},{1,13,2},{1,13,2},{1,9,2},{3,1,648},{0,9,169},{0,9,169},{0,5,200},{3,3,648},{0,5,200},{5,7,882},{0,18,17},{2,11,18},{0,11,34},{5,7,882},{6,7,882},{0,11,34}, +{0,9,890},{6,7,882},{0,9,890},{0,0,225},{0,0,225},{0,0,225},{0,0,225},{0,5,0},{0,5,0},{0,5,0},{0,3,0},{0,2,61},{0,2,61},{1,23,1187},{1,18,350},{1,13,422},{1,12,373},{0,20,3048},{0,15,1443},{0,12,204},{0,9,1483},{0,11,4212},{0,8,2174},{1,23,931},{1,18,94},{2,12,108},{1,12,117},{6,0,3048},{0,15,1443},{0,12,204},{0,9,1483},{5,6,3048}, +{0,9,1483},{1,16,305},{1,16,305},{1,16,305},{1,10,309},{0,13,650},{0,11,109},{0,11,109},{0,7,148},{0,7,1161},{0,6,473},{1,16,49},{1,16,49},{1,16,49},{1,10,53},{4,0,648},{0,11,109},{0,11,109},{0,7,148},{1,7,648},{0,7,148},{7,3,882},{0,20,8},{2,12,8},{0,12,8},{7,3,882},{11,2,882},{0,12,8},{0,10,890},{11,2,882},{0,10,890},{1,0,305}, +{1,0,305},{1,0,305},{1,0,305},{0,8,1},{0,8,1},{0,8,1},{0,5,4},{0,3,145},{0,3,145},{1,25,1365},{1,20,497},{1,14,713},{1,13,510},{0,23,3051},{0,16,1278},{0,13,86},{0,10,1354},{0,12,4609},{0,9,2228},{2,22,886},{2,18,110},{2,14,56},{2,13,152},{5,6,3048},{0,16,1278},{0,13,86},{0,10,1354},{10,1,3048},{0,10,1354},{1,19,482},{1,19,482},{1,19,482}, +{1,12,481},{0,16,648},{0,12,72},{0,12,72},{0,8,101},{0,8,1352},{0,7,557},{2,15,5},{2,15,5},{2,15,5},{2,11,5},{3,6,648},{0,12,72},{0,12,72},{0,8,101},{3,6,648},{0,8,101},{5,12,882},{0,21,10},{3,13,13},{0,13,5},{5,12,882},{13,1,882},{0,13,5},{0,11,890},{13,1,882},{0,11,890},{1,0,481},{1,0,481},{1,0,481},{1,0,481},{0,10,1}, +{0,10,1},{0,10,1},{0,6,1},{0,5,261},{0,5,261},{1,28,1667},{1,22,793},{1,15,1182},{1,14,793},{0,25,3048},{0,18,1170},{0,14,36},{0,11,1243},{0,14,5005},{0,10,2318},{2,25,920},{2,20,89},{3,14,108},{2,14,121},{7,2,3048},{0,18,1170},{0,14,36},{0,11,1243},{12,0,3048},{0,11,1243},{1,21,786},{1,21,786},{1,21,786},{1,14,789},{0,19,650},{0,14,32},{0,14,32}, +{0,9,50},{0,9,1619},{0,8,661},{2,18,37},{2,18,37},{2,18,37},{2,12,37},{5,2,648},{0,14,32},{0,14,32},{0,9,50},{8,1,648},{0,9,50},{8,3,882},{1,22,8},{3,14,8},{1,14,8},{8,3,882},{11,5,882},{1,14,8},{0,12,900},{11,5,882},{0,12,900},{1,0,785},{1,0,785},{1,0,785},{1,0,785},{0,13,1},{0,13,1},{0,13,1},{0,8,4},{0,6,405}, +{0,6,405},{2,27,1844},{2,22,971},{2,16,1186},{2,15,988},{0,28,3084},{0,20,1095},{0,16,77},{0,12,1159},{0,16,4945},{0,12,2084},{3,24,885},{3,20,90},{3,16,53},{3,15,131},{6,8,3048},{0,20,1059},{0,16,41},{0,12,1123},{4,12,3048},{0,12,1123},{2,21,955},{2,21,955},{2,21,955},{2,14,954},{0,22,686},{0,16,41},{0,16,41},{0,10,49},{0,11,1577},{0,9,545},{3,17,2}, +{3,17,2},{3,17,2},{3,13,2},{5,5,648},{0,16,5},{0,16,5},{0,10,13},{5,7,648},{0,10,13},{8,6,882},{1,24,9},{4,15,18},{1,15,13},{8,6,882},{15,2,882},{1,15,13},{0,13,890},{15,2,882},{0,13,890},{2,0,954},{2,0,954},{2,0,954},{2,0,954},{0,16,37},{0,16,37},{0,16,37},{0,9,40},{0,8,373},{0,8,373},{2,30,1772},{2,24,898},{2,17,1287}, +{2,16,898},{1,27,3055},{1,20,1143},{1,16,33},{1,13,1214},{0,17,4639},{0,13,1730},{3,27,931},{3,22,94},{4,16,108},{3,16,117},{5,14,3048},{0,21,996},{1,16,29},{0,13,1054},{14,1,3048},{0,13,1054},{2,23,891},{2,23,891},{2,23,891},{2,16,894},{1,21,652},{1,16,29},{1,16,29},{1,11,44},{0,13,1452},{0,11,365},{3,20,49},{3,20,49},{3,20,49},{3,14,53},{7,1,648}, +{0,18,1},{0,18,1},{0,11,4},{10,2,648},{0,11,4},{5,20,882},{2,24,8},{4,16,8},{2,16,8},{5,20,882},{13,6,882},{2,16,8},{0,14,890},{13,6,882},{0,14,890},{2,0,890},{2,0,890},{2,0,890},{2,0,890},{1,15,4},{1,15,4},{1,15,4},{1,10,5},{0,9,269},{0,9,269},{3,29,1838},{3,24,970},{3,18,1186},{3,17,983},{1,30,3084},{1,22,1095},{1,18,77}, +{1,14,1159},{0,19,4419},{0,14,1444},{4,26,886},{4,22,110},{4,18,56},{4,17,152},{8,5,3048},{0,23,936},{1,18,41},{0,14,1003},{12,5,3048},{0,14,1003},{3,23,955},{3,23,955},{3,23,955},{3,16,954},{1,23,692},{1,18,41},{1,18,41},{1,12,46},{0,15,1296},{0,12,235},{4,19,5},{4,19,5},{4,19,5},{4,15,5},{5,10,648},{1,18,5},{1,18,5},{0,12,10},{12,1,648}, +{0,12,10},{11,1,882},{2,25,10},{5,17,13},{2,17,5},{11,1,882},{15,5,882},{2,17,5},{0,15,890},{15,5,882},{0,15,890},{3,0,954},{3,0,954},{3,0,954},{3,0,954},{1,18,37},{1,18,37},{1,18,37},{1,11,40},{0,11,185},{0,11,185},{3,31,1790},{3,26,898},{3,19,1287},{3,18,898},{2,29,3057},{2,22,1179},{2,18,45},{1,15,1250},{0,20,4156},{0,15,1226},{4,29,920}, +{4,24,89},{5,18,108},{4,18,121},{3,26,3048},{0,25,909},{2,18,36},{0,15,970},{15,3,3048},{0,15,970},{3,25,891},{3,25,891},{3,25,891},{3,18,894},{2,23,659},{2,18,41},{2,18,41},{2,13,59},{0,16,1137},{0,13,137},{4,22,37},{4,22,37},{4,22,37},{4,16,37},{8,1,648},{1,20,2},{1,20,2},{1,13,1},{10,5,648},{1,13,1},{10,7,882},{3,26,8},{5,18,8}, +{3,18,8},{10,7,882},{13,9,882},{3,18,8},{0,16,900},{13,9,882},{0,16,900},{3,0,890},{3,0,890},{3,0,890},{3,0,890},{2,17,10},{2,17,10},{2,17,10},{2,12,13},{0,13,136},{0,13,136},{4,31,1844},{4,26,971},{4,20,1186},{4,19,988},{2,31,3111},{2,24,1095},{2,20,77},{2,16,1159},{0,22,3940},{0,16,1055},{5,28,885},{5,24,90},{5,20,53},{5,19,131},{5,22,3048}, +{0,27,886},{2,20,41},{0,17,926},{8,13,3048},{0,17,926},{4,25,955},{4,25,955},{4,25,955},{4,18,954},{2,26,686},{2,20,41},{2,20,41},{2,14,49},{0,18,1002},{0,15,110},{5,21,2},{5,21,2},{5,21,2},{5,17,2},{8,4,648},{2,20,5},{2,20,5},{2,14,13},{14,2,648},{2,14,13},{13,0,882},{3,28,9},{6,19,18},{3,19,13},{13,0,882},{5,21,882},{3,19,13}, +{0,17,890},{5,21,882},{0,17,890},{4,0,954},{4,0,954},{4,0,954},{4,0,954},{2,20,37},{2,20,37},{2,20,37},{2,13,40},{0,15,74},{0,15,74},{4,31,1972},{4,28,898},{4,21,1287},{4,20,898},{3,31,3055},{3,24,1143},{3,20,33},{3,17,1214},{0,23,3820},{0,18,963},{5,31,931},{5,26,94},{6,20,108},{5,20,117},{11,3,3048},{0,28,899},{3,20,29},{0,18,899},{11,11,3048}, +{0,18,899},{4,27,891},{4,27,891},{4,27,891},{4,20,894},{3,25,652},{3,20,29},{3,20,29},{3,15,44},{0,20,876},{0,16,102},{5,24,49},{5,24,49},{5,24,49},{5,18,53},{3,25,648},{2,22,1},{2,22,1},{2,15,4},{12,6,648},{2,15,4},{8,19,882},{4,28,8},{6,20,8},{4,20,8},{8,19,882},{15,10,882},{4,20,8},{0,18,890},{15,10,882},{0,18,890},{4,0,890}, +{4,0,890},{4,0,890},{4,0,890},{3,19,4},{3,19,4},{3,19,4},{3,14,5},{0,17,29},{0,17,29},{5,31,1964},{5,28,970},{5,22,1186},{5,21,983},{4,31,3172},{3,26,1095},{3,22,77},{3,18,1159},{0,25,3679},{0,19,899},{6,30,886},{6,26,110},{6,22,56},{6,21,152},{10,9,3048},{1,29,888},{3,22,41},{0,19,890},{14,9,3048},{0,19,890},{5,27,955},{5,27,955},{5,27,955}, +{5,20,954},{3,27,692},{3,22,41},{3,22,41},{3,16,46},{0,22,800},{1,16,98},{6,23,5},{6,23,5},{6,23,5},{6,19,5},{9,6,648},{3,22,5},{3,22,5},{2,16,10},{14,5,648},{2,16,10},{13,5,882},{4,29,10},{7,21,13},{4,21,5},{13,5,882},{12,15,882},{4,21,5},{0,19,890},{12,15,882},{0,19,890},{5,0,954},{5,0,954},{5,0,954},{5,0,954},{3,22,37}, +{3,22,37},{3,22,37},{3,15,40},{0,19,9},{0,19,9},{6,31,2264},{5,30,898},{5,23,1287},{5,22,898},{4,31,3204},{4,26,1179},{4,22,45},{3,19,1250},{0,27,3523},{0,20,908},{6,31,968},{6,28,89},{7,22,108},{6,22,121},{9,15,3048},{1,30,899},{4,22,36},{0,20,904},{5,22,3048},{0,20,904},{5,29,891},{5,29,891},{5,29,891},{5,22,894},{4,27,659},{4,22,41},{4,22,41}, +{4,17,59},{0,23,747},{1,18,102},{6,26,37},{6,26,37},{6,26,37},{6,20,37},{10,5,648},{3,24,2},{3,24,2},{3,17,1},{12,9,648},{3,17,1},{15,1,882},{5,30,8},{7,22,8},{5,22,8},{15,1,882},{15,13,882},{5,22,8},{0,20,900},{15,13,882},{0,20,900},{5,0,890},{5,0,890},{5,0,890},{5,0,890},{4,21,10},{4,21,10},{4,21,10},{4,16,13},{0,20,8}, +{0,20,8},{6,31,2228},{6,30,971},{6,24,1186},{6,23,988},{5,31,3256},{4,28,1095},{4,24,77},{4,20,1159},{0,29,3364},{1,21,894},{7,31,915},{7,28,90},{7,24,53},{7,23,131},{14,1,3048},{2,31,886},{4,24,41},{1,21,890},{10,17,3048},{1,21,890},{6,29,955},{6,29,955},{6,29,955},{6,22,954},{4,30,686},{4,24,41},{4,24,41},{4,18,49},{0,25,705},{2,19,110},{7,25,2}, +{7,25,2},{7,25,2},{7,21,2},{10,8,648},{4,24,5},{4,24,5},{4,18,13},{11,12,648},{4,18,13},{15,4,882},{6,30,17},{7,24,52},{5,23,13},{15,4,882},{9,22,882},{5,23,13},{0,21,890},{9,22,882},{0,21,890},{6,0,954},{6,0,954},{6,0,954},{6,0,954},{4,24,37},{4,24,37},{4,24,37},{4,17,40},{1,21,4},{1,21,4},{7,31,2444},{6,31,907},{6,25,1287}, +{6,24,898},{6,31,3436},{5,28,1143},{5,24,33},{5,21,1214},{0,31,3276},{1,22,908},{8,30,1208},{7,30,94},{7,25,166},{7,24,117},{13,7,3048},{3,31,906},{5,24,29},{1,22,899},{13,15,3048},{1,22,899},{6,31,891},{6,31,891},{6,31,891},{6,24,894},{5,29,652},{5,24,29},{5,24,29},{5,19,44},{0,27,665},{2,20,102},{7,28,49},{7,28,49},{7,28,49},{7,22,53},{9,14,648}, +{4,26,1},{4,26,1},{4,19,4},{14,10,648},{4,19,4},{10,23,882},{6,31,17},{8,24,13},{6,24,8},{10,23,882},{11,21,882},{6,24,8},{0,22,890},{11,21,882},{0,22,890},{6,0,890},{6,0,890},{6,0,890},{6,0,890},{5,23,4},{5,23,4},{5,23,4},{5,18,5},{1,23,4},{1,23,4},{7,31,2636},{7,31,991},{7,26,1186},{7,25,983},{6,31,3532},{5,30,1095},{5,26,77}, +{5,22,1159},{0,31,3340},{2,23,899},{8,31,1014},{7,31,262},{8,25,108},{7,25,254},{15,3,3048},{4,31,936},{5,26,41},{2,23,890},{11,19,3048},{2,23,890},{7,31,955},{7,31,955},{7,31,955},{7,24,954},{5,31,692},{5,26,41},{5,26,41},{5,20,46},{0,29,651},{3,20,98},{8,26,101},{8,26,101},{8,26,101},{8,22,101},{11,10,648},{5,26,5},{5,26,5},{4,20,10},{5,23,648}, +{4,20,10},{15,9,882},{7,31,37},{8,25,8},{6,25,5},{15,9,882},{14,19,882},{6,25,5},{0,23,890},{14,19,882},{0,23,890},{7,0,954},{7,0,954},{7,0,954},{7,0,954},{5,26,37},{5,26,37},{5,26,37},{5,19,40},{2,23,9},{2,23,9},{8,31,3110},{7,31,1135},{7,27,1287},{7,26,898},{7,31,3652},{6,30,1179},{6,26,45},{5,23,1250},{1,31,3492},{2,24,908},{8,31,1174}, +{8,31,110},{8,27,56},{8,26,152},{11,19,3048},{5,31,996},{6,26,36},{2,24,904},{9,23,3048},{2,24,904},{7,31,939},{7,31,939},{7,31,939},{7,26,894},{6,31,659},{6,26,41},{6,26,41},{6,21,59},{1,29,659},{3,22,102},{8,28,4},{8,28,4},{8,28,4},{8,24,8},{12,9,648},{5,28,2},{5,28,2},{5,21,1},{14,13,648},{5,21,1},{14,15,882},{8,31,106},{9,26,13}, +{7,26,8},{14,15,882},{12,23,882},{7,26,8},{0,24,900},{12,23,882},{0,24,900},{7,0,890},{7,0,890},{7,0,890},{7,0,890},{6,25,10},{6,25,10},{6,25,10},{6,20,13},{2,24,8},{2,24,8},{8,31,3038},{8,31,1470},{8,28,1391},{7,27,1137},{7,31,4120},{6,31,1146},{6,28,77},{6,24,1159},{3,31,3681},{3,25,894},{9,31,1205},{8,31,245},{9,27,99},{8,27,122},{10,25,3048}, +{6,31,1110},{6,28,41},{3,25,890},{12,21,3048},{3,25,890},{8,31,1274},{8,31,1274},{8,31,1274},{7,27,1128},{7,30,750},{6,28,41},{6,28,41},{6,22,49},{1,31,648},{4,23,110},{8,31,49},{8,31,49},{8,31,49},{8,25,53},{15,2,648},{6,28,5},{6,28,5},{6,22,13},{13,16,648},{6,22,13},{14,18,882},{9,31,164},{9,27,18},{7,27,13},{14,18,882},{11,26,882},{7,27,13}, +{0,25,890},{11,26,882},{0,25,890},{7,0,1124},{7,0,1124},{7,0,1124},{7,0,1124},{6,28,37},{6,28,37},{6,28,37},{6,21,40},{3,25,4},{3,25,4},{9,31,3454},{8,31,1502},{8,29,1186},{8,28,983},{8,31,4077},{7,31,1230},{7,28,33},{7,25,1214},{4,31,3820},{3,26,908},{10,31,1368},{9,31,261},{9,29,53},{9,28,126},{15,11,3048},{7,31,1226},{7,28,29},{3,26,899},{15,19,3048}, +{3,26,899},{8,31,1018},{8,31,1018},{8,31,1018},{8,27,954},{7,31,724},{7,28,29},{7,28,29},{7,23,44},{2,31,665},{4,24,102},{9,30,2},{9,30,2},{9,30,2},{9,26,2},{11,18,648},{6,30,1},{6,30,1},{6,23,4},{10,21,648},{6,23,4},{12,27,882},{10,31,225},{10,28,13},{7,28,20},{12,27,882},{13,25,882},{7,28,20},{0,26,890},{13,25,882},{0,26,890},{8,0,954}, +{8,0,954},{8,0,954},{8,0,954},{7,27,4},{7,27,4},{7,27,4},{7,22,5},{3,27,4},{3,27,4},{9,31,3614},{9,31,1886},{8,30,1287},{8,29,898},{8,31,4381},{7,31,1582},{7,30,77},{7,26,1159},{5,31,4036},{4,27,899},{10,31,1560},{10,31,405},{10,29,108},{9,29,117},{14,17,3048},{8,31,1444},{7,30,41},{4,27,890},{13,23,3048},{4,27,890},{8,31,1146},{8,31,1146},{8,31,1146}, +{8,29,894},{8,30,1011},{7,30,41},{7,30,41},{7,24,46},{3,31,705},{5,24,98},{9,31,85},{9,31,85},{9,31,85},{9,27,53},{13,14,648},{7,30,5},{7,30,5},{6,24,10},{8,25,648},{6,24,10},{14,23,882},{10,31,305},{10,29,8},{8,29,8},{14,23,882},{11,29,882},{8,29,8},{0,27,890},{11,29,882},{0,27,890},{8,0,890},{8,0,890},{8,0,890},{8,0,890},{7,30,37}, +{7,30,37},{7,30,37},{7,23,40},{4,27,9},{4,27,9},{10,31,4072},{9,31,2174},{9,31,1186},{9,30,983},{9,31,4545},{8,31,1725},{8,30,207},{7,27,1250},{6,31,4339},{4,28,908},{11,31,1656},{10,31,645},{10,31,56},{10,30,152},{13,23,3048},{8,31,1604},{7,31,77},{4,28,904},{11,27,3048},{4,28,904},{9,31,1150},{9,31,1150},{9,31,1150},{9,29,954},{8,31,841},{8,29,193},{8,29,193}, +{7,25,197},{4,31,747},{5,26,102},{10,31,20},{10,31,20},{10,31,20},{10,28,8},{14,13,648},{7,31,41},{7,31,41},{7,25,1},{11,23,648},{7,25,1},{13,29,882},{11,31,397},{11,30,13},{8,30,5},{13,29,882},{14,27,882},{8,30,5},{0,28,900},{14,27,882},{0,28,900},{9,0,954},{9,0,954},{9,0,954},{9,0,954},{8,27,122},{8,27,122},{8,27,122},{8,23,122},{4,28,8}, +{4,28,8},{10,31,4147},{10,31,2404},{9,31,1429},{9,31,901},{10,31,4627},{9,31,1938},{8,31,38},{8,28,1061},{7,31,4330},{5,29,789},{12,31,1701},{11,31,715},{11,31,90},{10,31,113},{15,19,2814},{10,31,1554},{8,31,34},{5,29,785},{13,26,2814},{5,29,785},{9,31,1429},{9,31,1429},{9,31,1429},{9,31,901},{9,31,1022},{8,31,38},{8,31,38},{8,26,44},{5,31,840},{6,27,110},{11,31,90}, +{11,31,90},{11,31,90},{10,29,53},{14,16,648},{8,31,34},{8,31,34},{7,26,20},{15,20,648},{7,26,20},{15,25,761},{12,31,425},{11,31,9},{9,31,1},{15,25,761},{12,31,761},{9,31,1},{0,29,785},{12,31,761},{0,29,785},{9,0,900},{9,0,900},{9,0,900},{9,0,900},{8,30,4},{8,30,4},{8,30,4},{8,25,5},{5,29,4},{5,29,4},{11,31,3735},{10,31,2356},{10,31,1395}, +{10,31,954},{10,31,4099},{9,31,1618},{9,31,174},{8,29,686},{7,31,3930},{6,29,510},{12,31,1285},{12,31,685},{11,31,122},{11,31,37},{13,27,2249},{10,31,1186},{9,31,74},{6,29,485},{13,27,2249},{6,29,485},{10,31,1395},{10,31,1395},{10,31,1395},{10,31,954},{9,31,1086},{9,31,174},{9,31,174},{8,27,49},{6,31,969},{6,28,102},{11,31,122},{11,31,122},{11,31,122},{11,30,2},{13,22,648}, +{9,31,74},{9,31,74},{8,27,13},{12,25,648},{8,27,13},{15,26,481},{13,31,269},{12,31,0},{10,31,0},{15,26,481},{15,28,481},{10,31,0},{0,29,481},{15,28,481},{0,29,481},{10,0,954},{10,0,954},{10,0,954},{10,0,954},{8,31,61},{8,31,61},{8,31,61},{8,26,40},{5,31,4},{5,31,4},{11,31,3399},{11,31,2260},{11,31,1635},{10,31,954},{11,31,3639},{10,31,1435},{9,31,238}, +{9,29,430},{8,31,3443},{6,30,314},{13,31,1121},{12,31,525},{12,31,164},{11,31,53},{13,29,1769},{11,31,918},{10,31,113},{7,30,290},{14,27,1769},{7,30,290},{11,31,1635},{11,31,1635},{11,31,1635},{10,31,954},{10,31,1251},{9,31,238},{9,31,238},{9,28,41},{7,31,1105},{7,28,98},{12,31,164},{12,31,164},{12,31,164},{11,31,53},{15,18,648},{10,31,113},{10,31,113},{8,28,1},{10,29,648}, +{8,28,1},{15,27,269},{13,31,173},{13,31,4},{11,31,4},{15,27,269},{14,30,265},{11,31,4},{0,30,289},{14,30,265},{0,30,289},{10,0,890},{10,0,890},{10,0,890},{10,0,890},{9,31,13},{9,31,13},{9,31,13},{9,27,5},{6,31,9},{6,31,9},{12,31,3157},{11,31,2308},{11,31,1683},{11,31,1054},{11,31,3303},{10,31,1339},{10,31,378},{9,30,213},{9,31,3103},{7,30,166},{13,31,801}, +{13,31,529},{12,31,260},{12,31,20},{15,24,1374},{12,31,777},{11,31,181},{8,30,117},{15,27,1377},{8,30,117},{11,31,1683},{11,31,1683},{11,31,1683},{11,31,1054},{10,31,1491},{10,31,378},{10,31,378},{9,29,46},{8,31,1331},{7,30,102},{12,31,260},{12,31,260},{12,31,260},{12,31,20},{13,27,648},{11,31,181},{11,31,181},{8,29,10},{13,27,648},{8,29,10},{15,28,117},{14,31,61},{14,31,25}, +{13,31,4},{15,28,117},{14,31,117},{13,31,4},{0,30,113},{14,31,117},{0,30,113},{11,0,954},{11,0,954},{11,0,954},{11,0,954},{10,31,122},{10,31,122},{10,31,122},{9,28,40},{7,31,29},{7,31,29},{12,31,2860},{12,31,2260},{12,31,1899},{11,31,1261},{12,31,2932},{11,31,1310},{11,31,685},{10,30,108},{10,31,2731},{7,31,173},{13,31,747},{13,31,475},{13,31,306},{13,31,130},{15,26,1032}, +{12,31,651},{12,31,290},{8,31,40},{14,29,1032},{8,31,40},{12,31,1899},{12,31,1899},{12,31,1899},{11,31,1261},{11,31,1620},{11,31,685},{11,31,685},{10,30,44},{9,31,1524},{8,30,134},{13,31,306},{13,31,306},{13,31,306},{13,31,130},{13,30,648},{12,31,290},{12,31,290},{9,30,5},{12,30,648},{9,30,5},{15,30,18},{15,30,34},{14,31,16},{14,31,0},{15,30,18},{15,30,26},{14,31,0}, +{0,31,36},{15,30,26},{0,31,36},{11,0,900},{11,0,900},{11,0,900},{11,0,900},{10,31,104},{10,31,104},{10,31,104},{10,29,5},{8,30,130},{8,30,130},{13,31,2732},{12,31,2276},{12,31,1915},{12,31,1315},{12,31,2660},{11,31,1414},{11,31,789},{10,31,45},{11,31,2487},{8,31,116},{14,31,524},{14,31,460},{14,31,424},{13,31,170},{14,31,776},{13,31,507},{13,31,338},{10,31,9},{14,30,771}, +{10,31,9},{12,31,1915},{12,31,1915},{12,31,1915},{12,31,1315},{12,31,1699},{11,31,789},{11,31,789},{10,31,45},{10,31,1546},{8,31,116},{14,31,424},{14,31,424},{14,31,424},{13,31,170},{15,26,580},{13,31,338},{13,31,338},{10,31,9},{14,29,580},{10,31,9},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{12,0,954}, +{12,0,954},{12,0,954},{12,0,954},{11,31,164},{11,31,164},{11,31,164},{10,30,40},{8,31,116},{8,31,116},{13,31,2156},{13,31,1884},{13,31,1715},{12,31,1251},{13,31,2132},{12,31,1108},{12,31,747},{11,31,5},{11,31,1927},{9,31,180},{14,31,300},{14,31,236},{14,31,200},{14,31,136},{15,28,451},{14,31,328},{13,31,194},{11,31,1},{15,29,456},{11,31,1},{13,31,1715},{13,31,1715},{13,31,1715}, +{12,31,1251},{12,31,1347},{12,31,747},{12,31,747},{11,31,5},{10,31,1242},{9,31,180},{14,31,200},{14,31,200},{14,31,200},{14,31,136},{15,27,338},{13,31,194},{13,31,194},{11,31,1},{13,31,338},{11,31,1},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{12,0,890},{12,0,890},{12,0,890},{12,0,890},{11,31,260}, +{11,31,260},{11,31,260},{11,31,5},{9,31,180},{9,31,180},{13,31,1836},{13,31,1564},{13,31,1395},{13,31,1123},{13,31,1620},{12,31,1012},{12,31,651},{11,31,85},{12,31,1564},{10,31,233},{14,31,204},{14,31,140},{14,31,104},{14,31,40},{15,29,216},{14,31,136},{14,31,100},{12,31,1},{14,31,216},{12,31,1},{13,31,1395},{13,31,1395},{13,31,1395},{13,31,1123},{13,31,1179},{12,31,651},{12,31,651}, +{11,31,85},{11,31,998},{10,31,233},{14,31,104},{14,31,104},{14,31,104},{14,31,40},{15,28,162},{14,31,100},{14,31,100},{12,31,1},{15,29,164},{12,31,1},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{13,0,954},{13,0,954},{13,0,954},{13,0,954},{12,31,290},{12,31,290},{12,31,290},{11,31,85},{10,31,233}, +{10,31,233},{0,17,1568},{0,14,442},{0,10,40},{0,8,485},{0,11,3379},{0,9,2369},{0,8,1061},{0,5,2435},{0,6,3760},{0,5,2660},{0,17,1568},{0,14,442},{0,10,40},{0,8,485},{1,8,3372},{0,9,2369},{0,8,1061},{0,5,2435},{5,1,3371},{0,5,2435},{0,8,0},{0,8,0},{0,8,0},{0,5,1},{0,4,288},{0,4,160},{0,4,160},{0,2,164},{0,2,332},{0,2,200},{0,8,0}, +{0,8,0},{0,8,0},{0,5,1},{0,4,288},{0,4,160},{0,4,160},{0,2,164},{2,0,288},{0,2,164},{3,7,1568},{0,14,442},{0,10,40},{0,8,485},{3,7,1568},{8,0,1568},{0,8,485},{0,6,1586},{8,0,1568},{0,6,1586},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,20,1570},{0,16,325},{0,11,5}, +{0,9,392},{0,13,3968},{0,10,2630},{0,9,1121},{0,6,2710},{0,7,4484},{0,6,3034},{0,20,1570},{0,16,325},{0,11,5},{0,9,392},{1,10,3968},{0,10,2630},{0,9,1121},{0,6,2710},{5,2,3968},{0,6,2710},{0,11,1},{0,11,1},{0,11,1},{0,6,4},{0,5,514},{0,5,274},{0,5,274},{0,3,289},{0,3,595},{0,3,370},{0,11,1},{0,11,1},{0,11,1},{0,6,4},{1,2,512}, +{0,5,274},{0,5,274},{0,3,289},{1,2,512},{0,3,289},{5,3,1568},{0,16,325},{0,11,5},{0,9,392},{5,3,1568},{4,7,1568},{0,9,392},{0,7,1586},{4,7,1568},{0,7,1586},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,22,1570},{0,17,225},{0,12,18},{0,11,292},{0,15,4652},{0,11,2945},{0,10,1217}, +{0,7,3035},{0,8,5283},{0,7,3476},{0,22,1570},{0,17,225},{0,12,18},{0,11,292},{2,8,4651},{0,11,2945},{0,10,1217},{0,7,3035},{5,3,4651},{0,7,3035},{0,13,0},{0,13,0},{0,13,0},{0,8,1},{0,7,802},{0,6,424},{0,6,424},{0,4,449},{0,3,931},{0,3,562},{0,13,0},{0,13,0},{0,13,0},{0,8,1},{2,0,800},{0,6,424},{0,6,424},{0,4,449},{0,4,800}, +{0,4,449},{1,19,1568},{0,17,225},{0,12,18},{0,11,292},{1,19,1568},{9,2,1568},{0,11,292},{0,8,1576},{9,2,1568},{0,8,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,25,1570},{0,19,149},{0,13,73},{0,12,194},{0,17,5424},{0,13,3368},{0,11,1349},{0,8,3449},{0,9,6213},{0,7,3956},{0,25,1570}, +{0,19,149},{0,13,73},{0,12,194},{5,0,5419},{0,13,3368},{0,11,1349},{0,8,3449},{5,4,5419},{0,8,3449},{0,16,1},{0,16,1},{0,16,1},{0,9,4},{0,8,1152},{0,7,610},{0,7,610},{0,4,625},{0,4,1328},{0,4,769},{0,16,1},{0,16,1},{0,16,1},{0,9,4},{0,8,1152},{0,7,610},{0,7,610},{0,4,625},{4,0,1152},{0,4,625},{5,8,1568},{0,19,149},{1,13,13}, +{0,12,194},{5,8,1568},{4,10,1568},{0,12,194},{0,9,1576},{4,10,1568},{0,9,1576},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,28,1651},{0,21,155},{0,14,281},{0,13,198},{0,20,5424},{0,15,3099},{0,12,996},{0,9,3179},{0,10,6544},{0,8,3890},{1,24,1619},{0,21,155},{1,14,69},{0,13,198},{5,3,5419}, +{0,15,3099},{0,12,996},{0,9,3179},{4,7,5419},{0,9,3179},{0,19,82},{0,19,82},{0,19,82},{0,11,82},{0,11,1152},{0,9,445},{0,9,445},{0,6,505},{0,6,1494},{0,5,737},{1,15,50},{1,15,50},{1,15,50},{1,10,49},{3,1,1152},{0,9,445},{0,9,445},{0,6,505},{3,3,1152},{0,6,505},{5,11,1568},{0,21,74},{1,14,20},{0,13,117},{5,11,1568},{11,3,1568},{0,13,117}, +{0,10,1586},{11,3,1568},{0,10,1586},{0,0,81},{0,0,81},{0,0,81},{0,0,81},{0,3,0},{0,3,0},{0,3,0},{0,2,1},{0,1,25},{0,1,25},{1,27,1825},{0,23,323},{1,15,342},{0,14,361},{0,22,5420},{0,16,2834},{0,13,726},{0,10,2966},{0,11,6916},{0,9,3860},{1,27,1569},{1,21,131},{1,15,86},{1,14,181},{1,19,5419},{0,16,2834},{0,13,726},{0,10,2966},{9,2,5419}, +{0,10,2966},{1,18,257},{1,18,257},{1,18,257},{1,12,261},{0,13,1154},{0,11,337},{0,11,337},{0,7,388},{0,7,1665},{0,6,749},{1,18,1},{1,18,1},{1,18,1},{1,12,5},{4,0,1152},{0,11,337},{0,11,337},{0,7,388},{1,7,1152},{0,7,388},{8,2,1568},{0,23,34},{2,15,5},{0,14,72},{8,2,1568},{13,2,1568},{0,14,72},{0,11,1586},{13,2,1568},{0,11,1586},{1,0,257}, +{1,0,257},{1,0,257},{1,0,257},{0,6,1},{0,6,1},{0,6,1},{0,3,4},{0,2,85},{0,2,85},{1,30,1907},{1,23,411},{1,16,542},{1,15,454},{0,25,5424},{0,18,2630},{0,15,486},{0,11,2771},{0,13,7299},{0,11,3860},{2,26,1634},{1,23,155},{2,16,82},{1,15,198},{5,8,5419},{0,18,2630},{0,15,486},{0,11,2771},{4,10,5419},{0,11,2771},{1,21,338},{1,21,338},{1,21,338}, +{1,13,338},{0,16,1152},{0,13,274},{0,13,274},{0,8,305},{0,8,1856},{0,7,797},{2,17,64},{2,17,64},{2,17,64},{2,12,65},{3,6,1152},{0,13,274},{0,13,274},{0,8,305},{3,6,1152},{0,8,305},{3,23,1568},{0,25,17},{2,16,18},{0,15,45},{3,23,1568},{11,6,1568},{0,15,45},{0,12,1576},{11,6,1568},{0,12,1576},{1,0,337},{1,0,337},{1,0,337},{1,0,337},{0,8,1}, +{0,8,1},{0,8,1},{0,5,0},{0,4,169},{0,4,169},{1,31,2145},{1,25,590},{1,17,915},{1,16,619},{0,27,5420},{0,20,2424},{0,16,282},{0,12,2552},{0,15,7711},{0,11,3908},{2,29,1570},{2,23,149},{2,17,73},{2,16,194},{7,4,5419},{0,20,2424},{0,16,282},{0,12,2552},{9,5,5419},{0,12,2552},{1,23,546},{1,23,546},{1,23,546},{1,15,546},{0,19,1154},{0,15,194},{0,15,194}, +{0,9,218},{0,9,2123},{0,8,865},{2,20,1},{2,20,1},{2,20,1},{2,13,4},{5,2,1152},{0,15,194},{0,15,194},{0,9,218},{8,1,1152},{0,9,218},{9,4,1568},{0,27,5},{3,17,13},{0,16,26},{9,4,1568},{9,10,1568},{0,16,26},{0,13,1576},{9,10,1568},{0,13,1576},{1,0,545},{1,0,545},{1,0,545},{1,0,545},{0,11,0},{0,11,0},{0,11,0},{0,7,4},{0,5,289}, +{0,5,289},{2,31,2746},{1,27,945},{2,18,1370},{1,17,977},{0,30,5420},{0,22,2243},{0,17,145},{0,13,2386},{0,16,8161},{0,13,3986},{3,28,1619},{2,25,155},{3,18,69},{2,17,198},{8,2,5419},{0,22,2243},{0,17,145},{0,13,2386},{13,2,5419},{0,13,2386},{1,26,932},{1,26,932},{1,26,932},{1,16,936},{0,22,1154},{0,17,109},{0,17,109},{0,10,145},{0,11,2441},{0,9,1001},{3,19,50}, +{3,19,50},{3,19,50},{3,14,49},{5,5,1152},{0,17,109},{0,17,109},{0,10,145},{5,7,1152},{0,10,145},{11,0,1568},{0,29,10},{3,18,20},{0,18,8},{11,0,1568},{13,7,1568},{0,18,8},{0,14,1586},{13,7,1568},{0,14,1586},{1,0,932},{1,0,932},{1,0,932},{1,0,932},{0,14,1},{0,14,1},{0,14,1},{0,8,1},{0,6,468},{0,6,468},{2,31,3146},{2,27,1412},{2,19,1743}, +{1,19,1441},{0,31,5515},{0,23,2096},{0,19,69},{0,14,2251},{0,18,8669},{0,14,4100},{3,31,1569},{3,25,131},{3,19,86},{3,18,181},{3,23,5419},{0,23,2096},{0,19,69},{0,14,2251},{11,6,5419},{0,14,2251},{2,25,1379},{2,25,1379},{2,25,1379},{2,17,1379},{0,24,1152},{0,18,61},{0,18,61},{0,11,100},{0,12,2859},{0,10,1157},{3,22,1},{3,22,1},{3,22,1},{3,16,5},{7,1,1152}, +{0,18,61},{0,18,61},{0,11,100},{10,2,1152},{0,11,100},{10,6,1568},{1,29,2},{4,19,5},{0,19,5},{10,6,1568},{15,6,1568},{0,19,5},{0,15,1586},{15,6,1568},{0,15,1586},{2,0,1378},{2,0,1378},{2,0,1378},{2,0,1378},{0,16,1},{0,16,1},{0,16,1},{0,10,1},{0,8,657},{0,8,657},{2,31,3802},{2,29,1603},{2,21,2148},{2,19,1631},{1,31,5655},{0,25,2005},{0,20,31}, +{0,15,2138},{0,19,8963},{0,15,4070},{4,30,1634},{3,27,155},{4,20,82},{3,19,198},{9,4,5419},{0,25,2001},{0,20,27},{0,15,2134},{9,10,5419},{0,15,2134},{2,28,1587},{2,28,1587},{2,28,1587},{2,18,1590},{0,27,1158},{0,20,22},{0,20,22},{0,12,62},{0,14,3075},{0,11,1221},{4,21,64},{4,21,64},{4,21,64},{4,16,65},{5,10,1152},{0,20,18},{0,20,18},{0,12,58},{12,1,1152}, +{0,12,58},{12,2,1568},{1,31,10},{4,20,18},{0,20,18},{12,2,1568},{13,10,1568},{0,20,18},{0,16,1576},{13,10,1568},{0,16,1576},{2,0,1586},{2,0,1586},{2,0,1586},{2,0,1586},{0,19,4},{0,19,4},{0,19,4},{0,11,8},{0,9,769},{0,9,769},{3,31,3890},{2,31,1623},{3,21,2180},{2,20,1644},{1,31,5863},{0,27,1989},{1,21,109},{0,17,2117},{0,21,8560},{0,16,3545},{4,31,1640}, +{4,27,149},{4,21,73},{4,20,194},{10,3,5419},{0,27,1889},{0,21,49},{0,17,2017},{11,9,5419},{0,17,2017},{2,30,1619},{2,30,1619},{2,30,1619},{2,20,1619},{1,26,1188},{1,20,86},{1,20,86},{1,13,121},{0,16,2801},{0,13,949},{4,24,1},{4,24,1},{4,24,1},{4,17,4},{8,1,1152},{0,22,2},{0,22,2},{0,14,26},{10,5,1152},{0,14,26},{11,8,1568},{2,31,5},{5,21,13}, +{1,21,9},{11,8,1568},{11,14,1568},{1,21,9},{0,17,1576},{11,14,1568},{0,17,1576},{2,0,1618},{2,0,1618},{2,0,1618},{2,0,1618},{1,18,37},{1,18,37},{1,18,37},{1,12,37},{0,10,625},{0,10,625},{4,31,4308},{3,31,1589},{3,23,2160},{3,21,1621},{2,31,5895},{1,27,1999},{1,22,33},{1,18,2124},{0,23,8196},{0,17,3043},{5,31,1667},{4,29,155},{5,22,69},{4,21,198},{10,6,5419}, +{0,29,1772},{1,22,24},{0,18,1875},{15,6,5419},{0,18,1875},{3,30,1576},{3,30,1576},{3,30,1576},{3,20,1580},{1,29,1161},{1,22,29},{1,22,29},{1,15,58},{0,17,2529},{0,14,656},{5,23,50},{5,23,50},{5,23,50},{5,18,49},{8,4,1152},{0,24,1},{0,24,1},{0,15,1},{14,2,1152},{0,15,1},{13,4,1568},{3,31,13},{5,22,20},{2,22,8},{13,4,1568},{15,11,1568},{2,22,8}, +{0,18,1586},{15,11,1568},{0,18,1586},{3,0,1576},{3,0,1576},{3,0,1576},{3,0,1576},{1,21,10},{1,21,10},{1,21,10},{1,14,13},{0,12,520},{0,12,520},{4,31,4436},{3,31,1765},{4,23,2175},{3,23,1669},{3,31,6079},{1,29,1977},{2,23,105},{1,19,2107},{0,24,7969},{0,18,2675},{6,31,1832},{5,29,131},{5,23,86},{5,22,181},{12,2,5419},{0,30,1699},{1,23,62},{0,19,1782},{13,10,5419}, +{0,19,1782},{3,31,1665},{3,31,1665},{3,31,1665},{3,22,1640},{2,28,1188},{2,22,97},{2,22,97},{2,15,136},{0,19,2313},{0,15,474},{5,26,1},{5,26,1},{5,26,1},{5,20,5},{3,25,1152},{1,24,5},{1,24,5},{0,16,2},{12,6,1152},{0,16,2},{15,0,1568},{4,31,34},{6,23,5},{2,23,5},{15,0,1568},{12,16,1568},{2,23,5},{0,19,1586},{12,16,1568},{0,19,1586},{3,0,1640}, +{3,0,1640},{3,0,1640},{3,0,1640},{2,20,37},{2,20,37},{2,20,37},{2,14,37},{0,14,400},{0,14,400},{5,31,4740},{4,31,1716},{4,25,2148},{4,23,1631},{3,31,6351},{2,29,2005},{2,24,31},{2,19,2138},{0,26,7669},{0,19,2375},{6,31,1832},{5,31,155},{6,24,82},{5,23,198},{11,8,5419},{0,31,1712},{2,24,27},{0,20,1720},{11,14,5419},{0,20,1720},{4,31,1595},{4,31,1595},{4,31,1595}, +{4,22,1590},{2,31,1158},{2,24,22},{2,24,22},{2,16,62},{0,21,2091},{0,17,306},{6,25,64},{6,25,64},{6,25,64},{6,20,65},{9,6,1152},{1,26,1},{1,26,1},{1,17,5},{14,5,1152},{1,17,5},{14,6,1568},{5,31,74},{6,24,18},{2,24,18},{14,6,1568},{15,14,1568},{2,24,18},{0,20,1576},{15,14,1568},{0,20,1576},{4,0,1586},{4,0,1586},{4,0,1586},{4,0,1586},{2,23,4}, +{2,23,4},{2,23,4},{2,15,8},{0,16,277},{0,16,277},{5,31,5060},{5,31,1980},{5,25,2180},{4,24,1644},{4,31,6508},{2,31,1989},{3,25,109},{2,21,2117},{0,28,7364},{0,21,2098},{7,31,1952},{6,31,149},{6,25,73},{6,24,194},{12,7,5419},{1,31,1804},{2,25,49},{0,21,1657},{13,13,5419},{0,21,1657},{4,31,1739},{4,31,1739},{4,31,1739},{4,24,1619},{3,30,1188},{3,24,86},{3,24,86}, +{3,17,121},{0,22,1928},{0,18,194},{6,28,1},{6,28,1},{6,28,1},{6,21,4},{10,5,1152},{2,26,2},{2,26,2},{1,18,2},{12,9,1152},{1,18,2},{13,12,1568},{6,31,149},{7,25,13},{3,25,9},{13,12,1568},{13,18,1568},{3,25,9},{0,21,1576},{13,18,1568},{0,21,1576},{4,0,1618},{4,0,1618},{4,0,1618},{4,0,1618},{3,22,37},{3,22,37},{3,22,37},{3,16,37},{0,18,193}, +{0,18,193},{6,31,5316},{5,31,2160},{5,27,2160},{5,25,1621},{5,31,6800},{3,31,1999},{3,26,33},{3,22,2124},{0,29,7068},{0,22,1836},{7,31,2195},{7,31,270},{7,26,69},{6,25,198},{15,0,5419},{2,31,1970},{3,26,24},{0,22,1611},{12,16,5419},{0,22,1611},{5,31,1676},{5,31,1676},{5,31,1676},{5,24,1580},{3,31,1233},{3,26,29},{3,26,29},{3,19,58},{0,24,1798},{0,19,157},{7,27,50}, +{7,27,50},{7,27,50},{7,22,49},{10,8,1152},{2,28,1},{2,28,1},{2,19,1},{11,12,1152},{2,19,1},{15,8,1568},{7,31,221},{7,26,20},{4,26,8},{15,8,1568},{11,22,1568},{4,26,8},{0,22,1586},{11,22,1568},{0,22,1586},{5,0,1576},{5,0,1576},{5,0,1576},{5,0,1576},{3,25,10},{3,25,10},{3,25,10},{3,18,13},{0,20,106},{0,20,106},{6,31,5828},{6,31,2435},{6,27,2175}, +{5,27,1669},{5,31,7184},{4,31,2132},{4,27,105},{3,23,2107},{0,31,6820},{0,23,1690},{8,31,2306},{7,31,334},{7,27,86},{7,26,181},{14,6,5419},{4,31,2096},{3,27,62},{0,23,1590},{15,14,5419},{0,23,1590},{6,31,1859},{6,31,1859},{6,31,1859},{5,26,1640},{4,31,1220},{4,26,97},{4,26,97},{4,19,136},{0,26,1650},{0,21,161},{7,30,1},{7,30,1},{7,30,1},{7,24,5},{9,14,1152}, +{3,28,5},{3,28,5},{2,20,2},{14,10,1152},{2,20,2},{14,14,1568},{7,31,333},{8,27,40},{4,27,5},{14,14,1568},{14,20,1568},{4,27,5},{0,23,1586},{14,20,1568},{0,23,1586},{5,0,1640},{5,0,1640},{5,0,1640},{5,0,1640},{4,24,37},{4,24,37},{4,24,37},{4,18,37},{0,22,58},{0,22,58},{7,31,6036},{6,31,2835},{6,29,2148},{6,27,1631},{6,31,7316},{4,31,2228},{4,28,31}, +{4,23,2138},{0,31,6884},{0,24,1613},{8,31,2402},{8,31,666},{8,28,269},{7,27,198},{13,12,5419},{4,31,2224},{4,28,27},{0,24,1577},{13,18,5419},{0,24,1577},{6,31,1811},{6,31,1811},{6,31,1811},{6,26,1590},{5,31,1356},{4,28,22},{4,28,22},{4,20,62},{0,28,1508},{1,21,137},{7,31,106},{7,31,106},{7,31,106},{7,25,82},{11,10,1152},{3,30,1},{3,30,1},{3,21,5},{5,23,1152}, +{3,21,5},{13,20,1568},{8,31,410},{8,28,13},{4,28,18},{13,20,1568},{13,23,1570},{4,28,18},{0,24,1576},{13,23,1570},{0,24,1576},{6,0,1586},{6,0,1586},{6,0,1586},{6,0,1586},{4,27,4},{4,27,4},{4,27,4},{4,19,8},{0,24,37},{0,24,37},{7,31,6740},{7,31,3135},{7,29,2180},{6,28,1644},{7,31,7676},{5,31,2448},{5,29,109},{4,25,2117},{1,31,7196},{0,25,1593},{9,31,2594}, +{8,31,698},{8,29,82},{8,28,345},{14,11,5419},{5,31,2412},{4,29,49},{1,25,1580},{15,17,5419},{1,25,1580},{7,31,1979},{7,31,1979},{7,31,1979},{6,28,1619},{5,31,1388},{5,28,86},{5,28,86},{5,21,121},{0,30,1416},{1,23,161},{8,30,64},{8,30,64},{8,30,64},{8,25,65},{12,9,1152},{4,30,2},{4,30,2},{3,22,2},{14,13,1152},{3,22,2},{15,16,1568},{9,31,530},{8,29,18}, +{5,29,9},{15,16,1568},{15,22,1568},{5,29,9},{0,25,1576},{15,22,1568},{0,25,1576},{6,0,1618},{6,0,1618},{6,0,1618},{6,0,1618},{5,26,37},{5,26,37},{5,26,37},{5,20,37},{0,25,17},{0,25,17},{8,31,6906},{7,31,3909},{7,31,2160},{7,29,1621},{7,31,8144},{6,31,2902},{5,30,33},{5,26,2124},{2,31,7661},{1,26,1615},{9,31,2945},{9,31,1025},{8,30,86},{8,29,181},{14,14,5419}, +{7,31,2694},{5,30,24},{1,26,1590},{14,20,5419},{1,26,1590},{7,31,2060},{7,31,2060},{7,31,2060},{7,28,1580},{6,31,1476},{5,30,29},{5,30,29},{5,23,58},{0,31,1324},{2,23,157},{8,31,37},{8,31,37},{8,31,37},{8,27,5},{15,2,1152},{5,30,20},{5,30,20},{4,23,1},{13,16,1152},{4,23,1},{15,19,1568},{10,31,637},{9,30,5},{6,30,8},{15,19,1568},{13,26,1568},{6,30,8}, +{0,26,1586},{13,26,1568},{0,26,1586},{7,0,1576},{7,0,1576},{7,0,1576},{7,0,1576},{5,29,10},{5,29,10},{5,29,10},{5,22,13},{0,28,10},{0,28,10},{8,31,7386},{8,31,4250},{8,31,2490},{7,31,1669},{8,31,8461},{6,31,3350},{6,31,105},{5,27,2107},{4,31,8004},{1,27,1611},{10,31,3112},{9,31,1361},{9,31,69},{8,30,198},{13,20,5419},{7,31,2950},{5,31,62},{2,27,1590},{11,25,5420}, +{2,27,1590},{8,31,2486},{8,31,2486},{8,31,2486},{7,30,1640},{6,31,1700},{6,30,97},{6,30,97},{6,23,136},{1,31,1424},{2,25,161},{9,31,65},{9,31,65},{9,31,65},{9,27,49},{11,18,1152},{5,31,58},{5,31,58},{4,24,2},{10,21,1152},{4,24,2},{13,28,1568},{11,31,785},{9,31,20},{6,31,5},{13,28,1568},{11,30,1568},{6,31,5},{0,27,1586},{11,30,1568},{0,27,1586},{7,0,1640}, +{7,0,1640},{7,0,1640},{7,0,1640},{6,28,37},{6,28,37},{6,28,37},{6,22,37},{1,28,10},{1,28,10},{9,31,7014},{8,31,4230},{8,31,2294},{8,31,1846},{8,31,7865},{7,31,3114},{6,31,85},{6,27,1706},{4,31,7436},{2,28,1289},{11,31,2852},{10,31,1221},{9,31,145},{9,30,114},{13,22,4803},{8,31,2648},{6,31,81},{2,28,1253},{12,25,4803},{2,28,1253},{8,31,2294},{8,31,2294},{8,31,2294}, +{8,30,1811},{7,31,1740},{6,31,85},{6,31,85},{6,24,62},{2,31,1577},{3,25,137},{9,31,145},{9,31,145},{9,31,145},{9,29,5},{13,14,1152},{6,31,81},{6,31,81},{5,25,5},{8,25,1152},{5,25,5},{15,23,1250},{11,31,689},{10,31,4},{7,31,9},{15,23,1250},{11,31,1250},{7,31,9},{0,28,1252},{11,31,1250},{0,28,1252},{8,0,1810},{8,0,1810},{8,0,1810},{8,0,1810},{6,31,4}, +{6,31,4},{6,31,4},{6,23,8},{1,29,8},{1,29,8},{9,31,6534},{9,31,4134},{8,31,2486},{8,31,1590},{9,31,7237},{7,31,2970},{7,31,161},{6,28,1256},{5,31,6748},{2,29,949},{11,31,2340},{10,31,1125},{10,31,164},{9,31,97},{15,17,4056},{9,31,2244},{7,31,125},{3,28,909},{12,26,4056},{3,28,909},{8,31,2486},{8,31,2486},{8,31,2486},{8,31,1590},{7,31,2156},{7,31,161},{7,31,161}, +{7,25,121},{3,31,1729},{3,27,161},{10,31,164},{10,31,164},{10,31,164},{10,29,65},{14,13,1152},{7,31,125},{7,31,125},{5,26,2},{11,23,1152},{5,26,2},{13,31,882},{12,31,482},{11,31,0},{8,31,4},{13,31,882},{15,27,882},{8,31,4},{0,28,900},{15,27,882},{0,28,900},{8,0,1586},{8,0,1586},{8,0,1586},{8,0,1586},{7,30,37},{7,30,37},{7,30,37},{7,24,37},{1,31,16}, +{1,31,16},{10,31,6091},{9,31,4053},{9,31,2609},{8,31,1761},{9,31,6490},{8,31,2622},{7,31,458},{7,28,835},{6,31,6162},{3,29,598},{12,31,1989},{11,31,931},{11,31,306},{10,31,5},{15,19,3318},{10,31,1806},{8,31,202},{4,29,545},{13,26,3318},{4,29,545},{9,31,2609},{9,31,2609},{9,31,2609},{8,31,1761},{8,31,2086},{7,31,458},{7,31,458},{7,27,58},{4,31,1868},{4,27,157},{11,31,306}, +{11,31,306},{11,31,306},{10,31,5},{14,16,1152},{8,31,202},{8,31,202},{6,27,1},{15,20,1152},{6,27,1},{15,26,545},{13,31,313},{12,31,4},{10,31,4},{15,26,545},{14,29,545},{10,31,4},{0,29,545},{14,29,545},{0,29,545},{8,0,1640},{8,0,1640},{8,0,1640},{8,0,1640},{7,31,58},{7,31,58},{7,31,58},{7,26,13},{2,31,13},{2,31,13},{10,31,5723},{10,31,3980},{9,31,2945}, +{9,31,1745},{10,31,6083},{8,31,2494},{8,31,558},{7,29,558},{7,31,5674},{4,30,411},{12,31,1573},{11,31,963},{11,31,338},{11,31,49},{13,27,2753},{10,31,1438},{9,31,290},{5,29,341},{13,27,2753},{5,29,341},{9,31,2945},{9,31,2945},{9,31,2945},{9,31,1745},{9,31,2390},{8,31,558},{8,31,558},{7,28,147},{5,31,2064},{4,29,161},{11,31,338},{11,31,338},{11,31,338},{11,31,49},{13,22,1152}, +{9,31,290},{9,31,290},{6,28,2},{12,25,1152},{6,28,2},{15,27,313},{13,31,185},{13,31,16},{11,31,0},{15,27,313},{13,31,313},{11,31,0},{0,29,337},{13,31,313},{0,29,337},{9,0,1576},{9,0,1576},{9,0,1576},{9,0,1576},{8,31,197},{8,31,197},{8,31,197},{7,27,122},{3,31,25},{3,31,25},{11,31,5415},{10,31,3996},{10,31,3035},{10,31,2006},{10,31,5619},{9,31,2378},{8,31,814}, +{8,29,414},{7,31,5338},{5,30,251},{12,31,1413},{12,31,813},{12,31,452},{11,31,65},{13,29,2273},{11,31,1218},{10,31,365},{6,30,146},{14,27,2273},{6,30,146},{10,31,3035},{10,31,3035},{10,31,3035},{10,31,2006},{9,31,2518},{8,31,814},{8,31,814},{8,28,121},{6,31,2329},{5,29,137},{12,31,452},{12,31,452},{12,31,452},{11,31,65},{15,18,1152},{10,31,365},{10,31,365},{7,29,5},{10,29,1152}, +{7,29,5},{15,28,145},{14,31,85},{13,31,16},{12,31,4},{15,28,145},{15,29,149},{12,31,4},{0,30,145},{15,29,149},{0,30,145},{9,0,1640},{9,0,1640},{9,0,1640},{9,0,1640},{8,31,85},{8,31,85},{8,31,85},{8,27,37},{4,31,40},{4,31,40},{11,31,5143},{11,31,4004},{11,31,3379},{10,31,2070},{11,31,5287},{10,31,2431},{9,31,1062},{8,30,133},{8,31,5011},{5,31,161},{13,31,1161}, +{13,31,889},{12,31,548},{12,31,164},{15,24,1878},{11,31,1106},{11,31,481},{7,30,66},{15,27,1881},{7,30,66},{11,31,3379},{11,31,3379},{11,31,3379},{10,31,2070},{10,31,2835},{9,31,1062},{9,31,1062},{8,29,62},{7,31,2577},{5,31,161},{12,31,548},{12,31,548},{12,31,548},{12,31,164},{13,27,1152},{11,31,481},{11,31,481},{7,30,2},{13,27,1152},{7,30,2},{15,29,45},{14,31,37},{14,31,1}, +{14,31,9},{15,29,45},{15,30,41},{14,31,9},{0,30,65},{15,30,41},{0,30,65},{10,0,1586},{10,0,1586},{10,0,1586},{10,0,1586},{9,31,221},{9,31,221},{9,31,221},{8,28,8},{5,31,80},{5,31,80},{12,31,4948},{11,31,4157},{11,31,3532},{11,31,2393},{11,31,5008},{10,31,2422},{10,31,1461},{9,31,125},{9,31,4752},{6,31,157},{13,31,1107},{13,31,835},{13,31,666},{12,31,362},{15,26,1536}, +{12,31,1011},{12,31,650},{8,31,16},{14,29,1536},{8,31,16},{11,31,3532},{11,31,3532},{11,31,3532},{11,31,2393},{10,31,3204},{10,31,1461},{10,31,1461},{9,30,114},{8,31,2976},{6,31,157},{13,31,666},{13,31,666},{13,31,666},{12,31,362},{13,30,1152},{12,31,650},{12,31,650},{8,31,16},{12,30,1152},{8,31,16},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0}, +{0,31,0},{15,31,0},{0,31,0},{10,0,1640},{10,0,1640},{10,0,1640},{10,0,1640},{9,31,221},{9,31,221},{9,31,221},{9,29,25},{6,31,157},{6,31,157},{12,31,4212},{12,31,3612},{12,31,3251},{11,31,2201},{12,31,4212},{11,31,2154},{10,31,1301},{9,31,13},{10,31,3939},{7,31,233},{14,31,776},{13,31,659},{13,31,490},{13,31,218},{15,27,1067},{13,31,699},{12,31,442},{9,31,4},{13,31,1067}, +{9,31,4},{12,31,3251},{12,31,3251},{12,31,3251},{11,31,2201},{11,31,2668},{10,31,1301},{10,31,1301},{9,31,13},{8,31,2528},{7,31,233},{13,31,490},{13,31,490},{13,31,490},{13,31,218},{15,25,802},{12,31,442},{12,31,442},{9,31,4},{15,27,802},{9,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{11,0,1576}, +{11,0,1576},{11,0,1576},{11,0,1576},{10,31,340},{10,31,340},{10,31,340},{9,31,13},{7,31,233},{7,31,233},{12,31,3732},{12,31,3132},{12,31,2771},{12,31,2171},{12,31,3444},{11,31,1834},{11,31,1209},{10,31,37},{10,31,3219},{8,31,400},{14,31,456},{14,31,392},{14,31,356},{13,31,170},{14,31,684},{13,31,459},{13,31,290},{10,31,1},{14,30,683},{10,31,1},{12,31,2771},{12,31,2771},{12,31,2771}, +{12,31,2171},{11,31,2348},{11,31,1209},{11,31,1209},{10,31,37},{9,31,2156},{8,31,400},{14,31,356},{14,31,356},{14,31,356},{13,31,170},{15,26,512},{13,31,290},{13,31,290},{10,31,1},{14,29,512},{10,31,1},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{11,0,1640},{11,0,1640},{11,0,1640},{11,0,1640},{10,31,436}, +{10,31,436},{10,31,436},{10,31,37},{8,31,400},{8,31,400},{13,31,3172},{13,31,2900},{12,31,2547},{12,31,1947},{12,31,2932},{12,31,1732},{11,31,1145},{10,31,53},{11,31,2695},{8,31,464},{14,31,264},{14,31,200},{14,31,164},{14,31,100},{15,28,387},{14,31,268},{13,31,178},{11,31,1},{15,29,396},{11,31,1},{12,31,2547},{12,31,2547},{12,31,2547},{12,31,1947},{12,31,1971},{11,31,1145},{11,31,1145}, +{10,31,53},{10,31,1794},{8,31,464},{14,31,164},{14,31,164},{14,31,164},{14,31,100},{15,27,290},{13,31,178},{13,31,178},{11,31,1},{14,30,290},{11,31,1},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{12,0,1586},{12,0,1586},{12,0,1586},{12,0,1586},{11,31,520},{11,31,520},{11,31,520},{10,31,53},{8,31,464}, +{8,31,464},{0,23,2665},{0,18,680},{0,13,50},{0,11,785},{0,15,5885},{0,11,4118},{0,10,1800},{0,7,4202},{0,8,6546},{0,7,4643},{0,23,2665},{0,18,680},{0,13,50},{0,11,785},{3,5,5885},{0,11,4118},{0,10,1800},{0,7,4202},{0,9,5885},{0,7,4202},{0,11,0},{0,11,0},{0,11,0},{0,7,4},{0,5,549},{0,5,289},{0,5,289},{0,3,306},{0,3,630},{0,3,387},{0,11,0}, +{0,11,0},{0,11,0},{0,7,4},{1,2,545},{0,5,289},{0,5,289},{0,3,306},{2,1,545},{0,3,306},{6,3,2665},{0,18,680},{0,13,50},{0,11,785},{6,3,2665},{11,0,2665},{0,11,785},{0,8,2689},{11,0,2665},{0,8,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,25,2665},{0,20,521},{0,14,5}, +{0,12,625},{0,17,6669},{0,13,4529},{0,11,1890},{0,8,4610},{0,9,7494},{0,7,5171},{0,25,2665},{0,20,521},{0,14,5},{0,12,625},{3,7,6669},{0,13,4529},{0,11,1890},{0,8,4610},{8,0,6669},{0,8,4610},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{0,7,841},{0,6,445},{0,6,445},{0,4,464},{0,3,982},{0,3,595},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{2,0,841}, +{0,6,445},{0,6,445},{0,4,464},{1,3,841},{0,4,464},{7,2,2665},{0,20,521},{0,14,5},{0,12,625},{7,2,2665},{12,0,2665},{0,12,625},{0,9,2689},{12,0,2665},{0,9,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,28,2665},{0,22,405},{0,15,10},{0,13,514},{0,19,7541},{0,14,4934},{0,12,2042}, +{0,9,5045},{0,10,8546},{0,8,5682},{0,28,2665},{0,22,405},{0,15,10},{0,13,514},{5,2,7538},{0,14,4934},{0,12,2042},{0,9,5045},{8,1,7538},{0,9,5045},{0,16,0},{0,16,0},{0,16,0},{0,10,4},{0,8,1201},{0,7,637},{0,7,637},{0,4,656},{0,4,1385},{0,4,800},{0,16,0},{0,16,0},{0,16,0},{0,10,4},{1,5,1201},{0,7,637},{0,7,637},{0,4,656},{4,0,1201}, +{0,4,656},{6,8,2665},{0,22,405},{0,15,10},{0,13,514},{6,8,2665},{11,3,2665},{0,13,514},{0,10,2689},{11,3,2665},{0,10,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,30,2669},{0,23,313},{0,16,68},{0,15,410},{0,20,8498},{0,16,5330},{0,13,2210},{0,10,5530},{0,11,9702},{0,9,6270},{0,30,2669}, +{0,23,313},{0,16,68},{0,15,410},{4,7,8493},{0,16,5330},{0,13,2210},{0,10,5530},{8,2,8493},{0,10,5530},{0,19,1},{0,19,1},{0,19,1},{0,11,1},{0,9,1629},{0,8,832},{0,8,832},{0,5,881},{0,5,1874},{0,5,1106},{0,19,1},{0,19,1},{0,19,1},{0,11,1},{2,3,1625},{0,8,832},{0,8,832},{0,5,881},{4,1,1625},{0,5,881},{8,2,2665},{0,23,313},{1,16,8}, +{0,15,410},{8,2,2665},{14,1,2665},{0,15,410},{0,11,2689},{14,1,2665},{0,11,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,31,2777},{0,26,232},{0,17,197},{0,16,305},{0,22,9674},{0,17,5849},{0,14,2450},{0,10,6106},{0,12,11199},{0,10,7006},{0,31,2777},{0,26,232},{0,17,197},{0,16,305},{1,19,9669}, +{0,17,5849},{0,14,2450},{0,10,6106},{9,2,9669},{0,10,6106},{0,22,1},{0,22,1},{0,22,1},{0,13,0},{0,11,2178},{0,10,1125},{0,10,1125},{0,6,1189},{0,6,2520},{0,5,1475},{0,22,1},{0,22,1},{0,22,1},{0,13,0},{3,1,2178},{0,10,1125},{0,10,1125},{0,6,1189},{3,3,2178},{0,6,1189},{9,2,2665},{0,26,232},{1,17,17},{0,16,305},{9,2,2665},{13,4,2665},{0,16,305}, +{0,12,2689},{13,4,2665},{0,12,2689},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{1,31,3045},{0,28,217},{0,19,401},{0,17,282},{0,25,9670},{0,19,5529},{0,16,1970},{0,12,5738},{0,13,11589},{0,11,6898},{1,31,2789},{0,28,217},{1,18,146},{0,17,282},{5,8,9669},{0,19,5529},{0,16,1970},{0,12,5738},{4,10,9669}, +{0,12,5738},{0,24,64},{0,24,64},{0,24,64},{0,15,68},{0,13,2180},{0,11,949},{0,11,949},{0,7,1018},{0,7,2691},{0,6,1433},{1,21,64},{1,21,64},{1,21,64},{1,13,68},{4,0,2178},{0,11,949},{0,11,949},{0,7,1018},{1,7,2178},{0,7,1018},{10,1,2665},{0,28,153},{2,18,5},{0,17,218},{10,1,2665},{15,3,2665},{0,17,218},{0,13,2689},{15,3,2665},{0,13,2689},{0,0,64}, +{0,0,64},{0,0,64},{0,0,64},{0,3,1},{0,3,1},{0,3,1},{0,2,4},{0,1,18},{0,1,18},{1,31,3285},{0,29,341},{1,19,453},{0,18,405},{0,27,9674},{0,20,5170},{0,17,1546},{0,13,5429},{0,15,11993},{0,12,6819},{2,31,2966},{1,28,221},{1,19,197},{1,18,305},{7,4,9669},{0,20,5170},{0,17,1546},{0,13,5429},{9,5,9669},{0,13,5429},{0,27,257},{0,27,257},{0,27,257}, +{1,15,256},{0,16,2178},{0,13,832},{0,13,832},{0,8,881},{0,8,2882},{0,7,1427},{1,23,4},{1,23,4},{1,23,4},{1,15,0},{3,6,2178},{0,13,832},{0,13,832},{0,8,881},{3,6,2178},{0,8,881},{11,0,2665},{0,29,85},{2,19,10},{0,18,149},{11,0,2665},{13,7,2665},{0,18,149},{0,14,2689},{13,7,2665},{0,14,2689},{0,0,256},{0,0,256},{0,0,256},{0,0,256},{0,5,1}, +{0,5,1},{0,5,1},{0,3,1},{0,2,72},{0,2,72},{1,31,3909},{1,29,465},{1,21,676},{1,19,538},{0,30,9669},{0,22,4878},{0,18,1190},{0,14,5138},{0,16,12390},{0,13,6789},{2,31,2966},{1,29,209},{2,20,149},{1,19,282},{6,10,9669},{0,22,4878},{0,18,1190},{0,14,5138},{12,3,9669},{0,14,5138},{1,26,320},{1,26,320},{1,26,320},{1,16,324},{0,19,2180},{0,15,680},{0,15,680}, +{0,9,740},{0,9,3149},{0,8,1441},{1,26,64},{1,26,64},{1,26,64},{1,16,68},{5,2,2178},{0,15,680},{0,15,680},{0,9,740},{8,1,2178},{0,9,740},{11,3,2665},{0,31,41},{3,20,8},{0,19,98},{11,3,2665},{15,6,2665},{0,19,98},{0,15,2689},{15,6,2665},{0,15,2689},{1,0,320},{1,0,320},{1,0,320},{1,0,320},{0,8,0},{0,8,0},{0,8,0},{0,5,1},{0,4,160}, +{0,4,160},{2,31,4514},{1,31,630},{1,22,1110},{1,20,694},{0,31,9789},{0,23,4646},{0,20,849},{0,15,4826},{0,18,12955},{0,14,6798},{3,31,3101},{2,30,232},{2,21,197},{2,20,305},{3,23,9669},{0,23,4646},{0,20,849},{0,15,4826},{11,6,9669},{0,15,4826},{1,29,545},{1,29,545},{1,29,545},{1,18,546},{0,22,2180},{0,17,505},{0,17,505},{0,11,610},{0,11,3467},{0,10,1513},{2,26,1}, +{2,26,1},{2,26,1},{2,17,0},{5,5,2178},{0,17,505},{0,17,505},{0,11,610},{5,7,2178},{0,11,610},{11,6,2665},{1,31,85},{3,21,17},{0,20,65},{11,6,2665},{15,8,2665},{0,20,65},{0,16,2689},{15,8,2665},{0,16,2689},{1,0,545},{1,0,545},{1,0,545},{1,0,545},{0,11,0},{0,11,0},{0,11,0},{0,7,4},{0,5,289},{0,5,289},{2,31,5330},{1,31,1110},{2,23,1490}, +{1,21,979},{1,31,9981},{0,26,4406},{0,21,579},{0,16,4610},{0,19,13489},{0,15,6846},{3,31,3341},{2,31,226},{3,22,146},{2,21,282},{9,4,9669},{0,26,4406},{0,21,579},{0,16,4610},{9,10,9669},{0,16,4610},{1,31,885},{1,31,885},{1,31,885},{1,20,885},{0,24,2178},{0,19,389},{0,19,389},{0,12,464},{0,12,3885},{0,11,1603},{3,25,64},{3,25,64},{3,25,64},{3,17,68},{7,1,2178}, +{0,19,389},{0,19,389},{0,12,464},{10,2,2178},{0,12,464},{13,2,2665},{2,31,162},{4,22,5},{0,22,37},{13,2,2665},{12,13,2665},{0,22,37},{0,17,2689},{12,13,2665},{0,17,2689},{1,0,881},{1,0,881},{1,0,881},{1,0,881},{0,13,1},{0,13,1},{0,13,1},{0,8,0},{0,6,445},{0,6,445},{3,31,6366},{2,31,1635},{2,24,1886},{1,22,1410},{1,31,10381},{0,28,4146},{0,22,377}, +{0,17,4373},{0,20,14006},{0,16,6915},{4,31,3434},{3,31,242},{3,23,197},{3,22,305},{10,3,9669},{0,28,4146},{0,22,377},{0,17,4373},{11,9,9669},{0,17,4373},{2,31,1346},{2,31,1346},{2,31,1346},{2,20,1345},{0,27,2180},{0,21,274},{0,21,274},{0,13,353},{0,14,4269},{0,11,1763},{3,27,4},{3,27,4},{3,27,4},{3,19,0},{5,10,2178},{0,21,274},{0,21,274},{0,13,353},{12,1,2178}, +{0,13,353},{14,1,2665},{3,31,242},{4,23,10},{0,23,10},{14,1,2665},{15,11,2665},{0,23,10},{0,18,2689},{15,11,2665},{0,18,2689},{1,0,1345},{1,0,1345},{1,0,1345},{1,0,1345},{0,16,0},{0,16,0},{0,16,0},{0,10,4},{0,7,637},{0,7,637},{3,31,7374},{2,31,2339},{2,25,2441},{2,23,1763},{2,31,11019},{0,29,3909},{0,23,243},{0,18,4154},{0,22,14614},{0,17,7029},{5,31,3654}, +{4,31,394},{4,24,149},{3,23,282},{9,9,9669},{0,29,3909},{0,23,243},{0,18,4154},{14,7,9669},{0,18,4154},{2,31,1714},{2,31,1714},{2,31,1714},{2,22,1669},{0,29,2180},{0,23,194},{0,23,194},{0,14,260},{0,15,4686},{0,13,1937},{3,30,64},{3,30,64},{3,30,64},{3,20,68},{8,1,2178},{0,23,194},{0,23,194},{0,14,260},{10,5,2178},{0,14,260},{15,0,2665},{4,31,313},{5,24,8}, +{0,24,4},{15,0,2665},{13,15,2665},{0,24,4},{0,19,2689},{13,15,2665},{0,19,2689},{2,0,1665},{2,0,1665},{2,0,1665},{2,0,1665},{0,19,1},{0,19,1},{0,19,1},{0,11,1},{0,8,832},{0,8,832},{3,31,8967},{3,31,3510},{3,26,3255},{2,24,2243},{2,31,11766},{0,31,3686},{0,25,138},{0,19,3938},{0,23,15369},{0,18,7206},{5,31,3933},{4,31,457},{4,25,197},{4,24,305},{12,2,9669}, +{0,31,3686},{0,25,138},{0,19,3938},{13,10,9669},{0,19,3938},{2,31,2434},{2,31,2434},{2,31,2434},{2,23,2182},{0,31,2210},{0,25,137},{0,25,137},{0,15,181},{0,16,5157},{0,14,2163},{4,30,1},{4,30,1},{4,30,1},{4,21,0},{8,4,2178},{0,25,137},{0,25,137},{0,15,181},{14,2,2178},{0,15,181},{15,3,2665},{5,31,421},{5,25,17},{1,25,5},{15,3,2665},{12,18,2665},{1,25,5}, +{0,20,2689},{12,18,2665},{0,20,2689},{2,0,2178},{2,0,2178},{2,0,2178},{2,0,2178},{0,22,1},{0,22,1},{0,22,1},{0,13,0},{0,10,1125},{0,10,1125},{4,31,10234},{3,31,4421},{3,27,3739},{2,26,2742},{2,31,12773},{0,31,3719},{0,26,87},{0,20,3771},{0,25,16061},{0,19,7283},{6,31,4050},{5,31,629},{5,26,146},{4,25,282},{11,8,9669},{0,31,3718},{0,26,86},{0,20,3770},{11,14,9669}, +{0,20,3770},{3,31,3125},{3,31,3125},{3,31,3125},{2,25,2706},{1,31,2411},{0,26,86},{0,26,86},{0,16,129},{0,18,5544},{0,15,2318},{5,29,64},{5,29,64},{5,29,64},{5,21,68},{3,25,2178},{0,26,85},{0,26,85},{0,16,128},{12,6,2178},{0,16,128},{15,6,2665},{5,31,565},{6,26,5},{1,26,2},{15,6,2665},{14,17,2665},{1,26,2},{0,21,2689},{14,17,2665},{0,21,2689},{2,0,2705}, +{2,0,2705},{2,0,2705},{2,0,2705},{0,24,1},{0,24,1},{0,24,1},{0,15,5},{0,11,1348},{0,11,1348},{4,31,10874},{4,31,5018},{3,28,3750},{3,26,2754},{3,31,13045},{1,31,4003},{0,27,183},{0,21,3686},{0,27,15601},{0,20,6570},{7,31,4366},{5,31,965},{5,27,197},{5,26,305},{12,7,9669},{1,31,3954},{0,27,102},{0,21,3605},{13,13,9669},{0,21,3605},{3,31,3173},{3,31,3173},{3,31,3173}, +{3,25,2690},{1,31,2427},{0,28,113},{0,28,113},{0,17,170},{0,20,5170},{0,16,1856},{5,31,4},{5,31,4},{5,31,4},{5,23,0},{9,6,2178},{0,28,32},{0,28,32},{0,17,89},{14,5,2178},{0,17,89},{15,8,2665},{6,31,706},{6,27,10},{2,27,10},{15,8,2665},{12,21,2665},{2,27,10},{0,22,2689},{12,21,2665},{0,22,2689},{3,0,2689},{3,0,2689},{3,0,2689},{3,0,2689},{1,23,53}, +{1,23,53},{1,23,53},{1,15,49},{0,13,1217},{0,13,1217},{5,31,11278},{4,31,5402},{4,29,3753},{3,28,2745},{4,31,13566},{1,31,4403},{1,28,77},{0,22,3747},{0,28,15046},{0,21,5958},{7,31,4590},{6,31,1171},{6,28,149},{5,27,282},{14,3,9669},{2,31,4265},{1,28,76},{0,22,3458},{11,17,9669},{0,22,3458},{4,31,3377},{4,31,3377},{4,31,3377},{3,27,2706},{2,31,2532},{1,28,73},{1,28,73}, +{1,18,129},{0,21,4837},{0,17,1490},{6,31,82},{6,31,82},{6,31,82},{5,24,68},{10,5,2178},{0,30,8},{0,30,8},{0,19,49},{12,9,2178},{0,19,49},{15,11,2665},{7,31,850},{7,28,8},{2,28,4},{15,11,2665},{15,19,2665},{2,28,4},{0,23,2689},{15,19,2665},{0,23,2689},{3,0,2705},{3,0,2705},{3,0,2705},{3,0,2705},{1,26,1},{1,26,1},{1,26,1},{1,16,5},{0,14,1037}, +{0,14,1037},{6,31,11954},{5,31,6090},{4,30,3794},{4,28,2754},{5,31,14170},{2,31,4863},{2,29,187},{1,24,3689},{0,30,14558},{0,23,5274},{8,31,5030},{7,31,1556},{6,29,197},{6,28,305},{14,6,9669},{3,31,4594},{1,29,101},{0,24,3265},{15,14,9669},{0,24,3265},{4,31,3530},{4,31,3530},{4,31,3530},{4,27,2693},{2,31,2739},{1,30,134},{1,30,134},{1,19,197},{0,23,4506},{0,19,1109},{6,31,64}, +{6,31,64},{6,31,64},{6,25,0},{10,8,2178},{1,30,34},{1,30,34},{0,20,16},{11,12,2178},{0,20,16},{15,14,2665},{8,31,1053},{7,29,17},{3,29,5},{15,14,2665},{14,22,2665},{3,29,5},{0,24,2689},{14,22,2665},{0,24,2689},{4,0,2689},{4,0,2689},{4,0,2689},{4,0,2689},{2,26,50},{2,26,50},{2,26,50},{2,17,49},{0,16,818},{0,16,818},{6,31,12466},{5,31,6794},{5,31,3739}, +{4,30,2742},{5,31,14554},{3,31,5363},{2,30,87},{1,24,3737},{0,31,14190},{0,24,4785},{8,31,5158},{7,31,2036},{7,30,146},{6,29,282},{13,12,9669},{4,31,4806},{2,30,86},{0,25,3130},{13,18,9669},{0,25,3130},{5,31,3658},{5,31,3658},{5,31,3658},{4,29,2706},{3,31,2795},{2,30,86},{2,30,86},{2,20,129},{0,25,4315},{0,20,809},{7,31,100},{7,31,100},{7,31,100},{7,25,68},{9,14,2178}, +{1,31,68},{1,31,68},{0,21,1},{14,10,2178},{0,21,1},{13,23,2665},{9,31,1241},{8,30,50},{3,30,2},{13,23,2665},{11,27,2665},{3,30,2},{0,25,2689},{11,27,2665},{0,25,2689},{4,0,2705},{4,0,2705},{4,0,2705},{4,0,2705},{2,28,1},{2,28,1},{2,28,1},{2,19,5},{0,18,666},{0,18,666},{7,31,13094},{6,31,7445},{5,31,3915},{5,30,2754},{6,31,14998},{4,31,5926},{2,31,183}, +{2,25,3686},{0,31,14254},{0,25,4323},{9,31,5546},{8,31,2478},{7,31,197},{7,30,305},{14,11,9669},{5,31,5138},{2,31,102},{0,26,3013},{15,17,9669},{0,26,3013},{5,31,3914},{5,31,3914},{5,31,3914},{5,29,2690},{4,31,3042},{2,31,182},{2,31,182},{2,21,170},{0,27,4059},{0,21,597},{7,31,196},{7,31,196},{7,31,196},{7,27,0},{11,10,2178},{2,31,101},{2,31,101},{0,22,4},{5,23,2178}, +{0,22,4},{15,19,2665},{10,31,1384},{8,31,5},{4,31,10},{15,19,2665},{14,25,2665},{4,31,10},{0,26,2689},{14,25,2665},{0,26,2689},{5,0,2689},{5,0,2689},{5,0,2689},{5,0,2689},{3,27,53},{3,27,53},{3,27,53},{3,19,49},{0,20,505},{0,20,505},{7,31,12517},{6,31,7482},{6,31,4001},{5,31,2706},{6,31,14185},{4,31,5491},{3,31,154},{2,26,3124},{0,31,13437},{0,26,3306},{9,31,4949}, +{8,31,2261},{8,31,325},{7,30,192},{14,13,8712},{6,31,4686},{3,31,153},{0,27,2403},{11,23,8712},{0,27,2403},{6,31,4001},{6,31,4001},{6,31,4001},{5,31,2706},{4,31,3234},{3,31,154},{3,31,154},{3,22,129},{0,28,3762},{0,23,425},{8,31,325},{8,31,325},{8,31,325},{7,28,68},{12,9,2178},{3,31,153},{3,31,153},{1,23,1},{14,13,2178},{1,23,1},{13,27,2178},{10,31,1157},{9,31,16}, +{5,31,1},{13,27,2178},{13,27,2178},{5,31,1},{0,27,2178},{13,27,2178},{0,27,2178},{5,0,2705},{5,0,2705},{5,0,2705},{5,0,2705},{3,30,1},{3,30,1},{3,30,1},{3,20,5},{0,22,389},{0,22,389},{8,31,12034},{7,31,7195},{6,31,4370},{6,31,2693},{7,31,13066},{5,31,5014},{4,31,261},{3,27,2390},{1,31,12394},{0,27,2277},{10,31,4410},{9,31,2045},{8,31,289},{8,30,192},{14,15,7578}, +{7,31,4050},{4,31,212},{0,27,1701},{12,23,7578},{0,27,1701},{6,31,4370},{6,31,4370},{6,31,4370},{6,31,2693},{5,31,3429},{4,31,261},{4,31,261},{3,23,197},{0,30,3509},{0,24,306},{8,31,289},{8,31,289},{8,31,289},{8,28,68},{15,2,2178},{4,31,212},{4,31,212},{1,24,9},{13,16,2178},{1,24,9},{15,22,1625},{11,31,850},{9,31,25},{6,31,4},{15,22,1625},{13,28,1625},{6,31,4}, +{0,27,1665},{13,28,1625},{0,27,1665},{6,0,2689},{6,0,2689},{6,0,2689},{6,0,2689},{4,30,50},{4,30,50},{4,30,50},{4,21,49},{0,24,306},{0,24,306},{8,31,11042},{7,31,7259},{7,31,4450},{6,31,2805},{7,31,12298},{5,31,4742},{4,31,501},{4,27,1875},{2,31,11643},{0,28,1578},{10,31,3802},{9,31,1869},{9,31,425},{8,31,25},{13,20,6661},{7,31,3554},{5,31,292},{0,28,1217},{13,23,6662}, +{0,28,1217},{7,31,4450},{7,31,4450},{7,31,4450},{6,31,2805},{6,31,3714},{4,31,501},{4,31,501},{4,24,129},{0,31,3354},{0,25,244},{9,31,425},{9,31,425},{9,31,425},{8,30,0},{11,18,2178},{5,31,292},{5,31,292},{2,25,1},{10,21,2178},{2,25,1},{15,23,1201},{11,31,674},{10,31,9},{7,31,16},{15,23,1201},{12,30,1201},{7,31,16},{0,28,1201},{12,30,1201},{0,28,1201},{6,0,2705}, +{6,0,2705},{6,0,2705},{6,0,2705},{4,31,17},{4,31,17},{4,31,17},{4,23,5},{0,26,218},{0,26,218},{8,31,10434},{8,31,7186},{7,31,4898},{7,31,2833},{8,31,11595},{6,31,4462},{5,31,629},{4,28,1387},{3,31,10895},{0,28,1002},{11,31,3446},{10,31,1707},{9,31,505},{8,31,73},{13,22,5829},{8,31,3170},{6,31,405},{1,28,869},{12,25,5829},{1,28,869},{7,31,4898},{7,31,4898},{7,31,4898}, +{7,31,2833},{6,31,3906},{5,31,629},{5,31,629},{4,25,170},{0,31,3546},{0,27,228},{9,31,505},{9,31,505},{9,31,505},{9,30,68},{13,14,2178},{6,31,405},{6,31,405},{2,26,4},{8,25,2178},{2,26,4},{13,31,841},{12,31,461},{11,31,1},{8,31,9},{13,31,841},{15,27,841},{8,31,9},{0,28,865},{15,27,841},{0,28,865},{7,0,2689},{7,0,2689},{7,0,2689},{7,0,2689},{5,31,53}, +{5,31,53},{5,31,53},{5,23,49},{0,28,137},{0,28,137},{9,31,10014},{8,31,6962},{8,31,5026},{7,31,3105},{8,31,10683},{7,31,4354},{6,31,933},{5,28,1019},{4,31,10078},{0,29,630},{11,31,2934},{10,31,1611},{10,31,650},{9,31,25},{15,17,5082},{8,31,2786},{7,31,521},{1,29,546},{12,26,5082},{1,29,546},{8,31,5026},{8,31,5026},{8,31,5026},{7,31,3105},{7,31,4170},{6,31,933},{6,31,933}, +{5,26,129},{1,31,3814},{0,28,234},{10,31,650},{10,31,650},{10,31,650},{9,31,25},{14,13,2178},{7,31,521},{7,31,521},{3,27,1},{11,23,2178},{3,27,1},{15,26,545},{13,31,313},{12,31,4},{10,31,4},{15,26,545},{14,29,545},{10,31,4},{0,29,545},{14,29,545},{0,29,545},{7,0,2705},{7,0,2705},{7,0,2705},{7,0,2705},{5,31,101},{5,31,101},{5,31,101},{5,24,5},{0,29,85}, +{0,29,85},{9,31,9465},{9,31,7065},{8,31,5233},{8,31,3329},{8,31,10116},{7,31,4183},{6,31,1338},{5,29,645},{5,31,9447},{0,30,441},{11,31,2664},{11,31,1525},{10,31,848},{10,31,113},{15,19,4344},{9,31,2424},{8,31,724},{2,30,321},{13,26,4344},{2,30,321},{8,31,5233},{8,31,5233},{8,31,5233},{8,31,3329},{7,31,4629},{6,31,1338},{6,31,1338},{5,27,197},{2,31,4212},{1,29,213},{10,31,848}, +{10,31,848},{10,31,848},{10,31,113},{14,16,2178},{8,31,724},{8,31,724},{3,28,9},{15,20,2178},{3,28,9},{15,27,290},{13,31,178},{13,31,9},{11,31,1},{15,27,290},{14,30,290},{11,31,1},{0,29,320},{14,30,290},{0,29,320},{8,0,2929},{8,0,2929},{8,0,2929},{8,0,2929},{6,31,113},{6,31,113},{6,31,113},{6,25,49},{0,31,45},{0,31,45},{10,31,9329},{9,31,6985},{9,31,5541}, +{8,31,3473},{9,31,9496},{8,31,4420},{7,31,1630},{6,29,426},{5,31,9031},{1,30,301},{12,31,2275},{11,31,1557},{11,31,932},{10,31,225},{13,27,3779},{10,31,2086},{8,31,884},{3,30,129},{13,27,3779},{3,30,129},{9,31,5541},{9,31,5541},{9,31,5541},{8,31,3473},{8,31,4836},{7,31,1630},{7,31,1630},{6,28,129},{4,31,4442},{1,30,237},{11,31,932},{11,31,932},{11,31,932},{10,31,225},{13,22,2178}, +{8,31,884},{8,31,884},{4,29,1},{12,25,2178},{4,29,1},{15,28,130},{14,31,72},{13,31,25},{12,31,9},{15,28,130},{15,29,136},{12,31,9},{0,30,128},{15,29,136},{0,30,128},{8,0,2689},{8,0,2689},{8,0,2689},{8,0,2689},{6,31,257},{6,31,257},{6,31,257},{6,27,5},{1,31,89},{1,31,89},{10,31,8929},{10,31,7186},{9,31,5845},{9,31,3829},{9,31,9208},{8,31,4260},{7,31,2270}, +{6,30,245},{6,31,8708},{2,31,228},{12,31,2115},{12,31,1515},{12,31,1154},{11,31,353},{13,29,3299},{11,31,1938},{10,31,1013},{4,30,68},{14,27,3299},{4,30,68},{9,31,5845},{9,31,5845},{9,31,5845},{9,31,3829},{8,31,5124},{7,31,2270},{7,31,2270},{6,29,170},{4,31,4762},{2,31,228},{12,31,1154},{12,31,1154},{12,31,1154},{11,31,353},{15,18,2178},{10,31,1013},{10,31,1013},{4,30,4},{10,29,2178}, +{4,30,4},{15,30,34},{14,31,40},{14,31,4},{14,31,4},{15,30,34},{15,30,34},{14,31,4},{0,30,64},{15,30,34},{0,30,64},{8,0,2705},{8,0,2705},{8,0,2705},{8,0,2705},{7,31,245},{7,31,245},{7,31,245},{7,27,49},{2,31,164},{2,31,164},{11,31,8857},{10,31,7170},{10,31,6209},{9,31,4133},{10,31,8853},{8,31,4484},{8,31,2548},{7,31,170},{7,31,8388},{3,31,244},{13,31,1971}, +{12,31,1611},{12,31,1250},{11,31,625},{15,24,2904},{11,31,1826},{10,31,1157},{5,31,1},{15,27,2907},{5,31,1},{10,31,6209},{10,31,6209},{10,31,6209},{9,31,4133},{9,31,5460},{8,31,2548},{8,31,2548},{7,30,129},{5,31,5126},{3,31,244},{12,31,1250},{12,31,1250},{12,31,1250},{11,31,625},{13,27,2178},{10,31,1157},{10,31,1157},{5,31,1},{13,27,2178},{5,31,1},{15,31,0},{15,31,0},{15,31,0}, +{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{9,0,2689},{9,0,2689},{9,0,2689},{9,0,2689},{7,31,485},{7,31,485},{7,31,485},{7,28,5},{3,31,244},{3,31,244},{11,31,7705},{11,31,6566},{10,31,5633},{10,31,3890},{10,31,7737},{9,31,3874},{8,31,2386},{7,31,116},{7,31,7398},{4,31,317},{13,31,1458},{13,31,1186},{13,31,1017},{12,31,425},{15,25,2166}, +{12,31,1398},{11,31,850},{6,31,4},{12,31,2166},{6,31,4},{10,31,5633},{10,31,5633},{10,31,5633},{10,31,3890},{9,31,4830},{8,31,2386},{8,31,2386},{7,31,116},{6,31,4509},{4,31,317},{13,31,1017},{13,31,1017},{13,31,1017},{12,31,425},{15,22,1625},{11,31,850},{11,31,850},{6,31,4},{13,28,1625},{6,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0}, +{0,31,0},{15,31,0},{0,31,0},{9,0,2725},{9,0,2725},{9,0,2725},{9,0,2725},{8,31,450},{8,31,450},{8,31,450},{7,30,101},{4,31,317},{4,31,317},{11,31,6953},{11,31,5814},{11,31,5189},{10,31,3650},{11,31,6713},{10,31,3531},{9,31,2142},{8,31,74},{8,31,6397},{5,31,425},{13,31,1138},{13,31,866},{13,31,697},{12,31,361},{15,26,1601},{12,31,1046},{11,31,674},{7,31,16},{14,29,1601}, +{7,31,16},{11,31,5189},{11,31,5189},{11,31,5189},{10,31,3650},{10,31,4313},{9,31,2142},{9,31,2142},{8,31,74},{7,31,3981},{5,31,425},{13,31,697},{13,31,697},{13,31,697},{12,31,361},{15,23,1201},{11,31,674},{11,31,674},{7,31,16},{12,30,1201},{7,31,16},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{10,0,2689}, +{10,0,2689},{10,0,2689},{10,0,2689},{8,31,578},{8,31,578},{8,31,578},{8,30,49},{5,31,425},{5,31,425},{12,31,6211},{11,31,5318},{11,31,4693},{11,31,3554},{11,31,5833},{10,31,3067},{10,31,2106},{8,31,10},{9,31,5601},{6,31,580},{14,31,825},{13,31,674},{13,31,505},{13,31,233},{15,27,1122},{13,31,738},{12,31,461},{8,31,9},{13,31,1122},{8,31,9},{11,31,4693},{11,31,4693},{11,31,4693}, +{11,31,3554},{10,31,3849},{10,31,2106},{10,31,2106},{8,31,10},{7,31,3629},{6,31,580},{13,31,505},{13,31,505},{13,31,505},{13,31,233},{13,31,841},{12,31,461},{12,31,461},{8,31,9},{15,27,841},{8,31,9},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{10,0,2705},{10,0,2705},{10,0,2705},{10,0,2705},{9,31,666}, +{9,31,666},{9,31,666},{8,31,10},{6,31,580},{6,31,580},{12,31,5427},{12,31,4827},{11,31,4453},{11,31,3314},{12,31,5175},{10,31,2859},{10,31,1898},{9,31,74},{10,31,4842},{7,31,724},{14,31,489},{14,31,425},{14,31,389},{13,31,169},{14,31,729},{13,31,482},{13,31,313},{10,31,4},{14,30,726},{10,31,4},{11,31,4453},{11,31,4453},{11,31,4453},{11,31,3314},{11,31,3445},{10,31,1898},{10,31,1898}, +{9,31,74},{8,31,3213},{7,31,724},{14,31,389},{14,31,389},{14,31,389},{13,31,169},{15,26,545},{13,31,313},{13,31,313},{10,31,4},{14,29,545},{10,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{11,0,2689},{11,0,2689},{11,0,2689},{11,0,2689},{9,31,890},{9,31,890},{9,31,890},{9,31,74},{7,31,724}, +{7,31,724},{2,31,33740},{0,31,5184},{0,22,420},{0,21,4221},{1,31,46089},{0,29,24105},{0,21,8317},{0,18,24790},{0,21,63990},{0,16,38959},{1,31,9704},{0,30,2866},{0,21,389},{0,19,3229},{7,2,18065},{0,20,13257},{0,17,6153},{0,12,13481},{12,0,18065},{0,12,13481},{0,15,1},{0,15,1},{0,15,1},{0,9,1},{0,8,1105},{0,7,585},{0,7,585},{0,4,596},{0,4,1273},{0,4,740},{0,15,1}, +{0,15,1},{0,15,1},{0,9,1},{2,1,1105},{0,7,585},{0,7,585},{0,4,596},{4,0,1105},{0,4,596},{9,6,9248},{0,30,2866},{0,21,389},{0,19,3229},{9,6,9248},{14,5,9248},{0,19,3229},{0,14,9248},{14,5,9248},{0,14,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,31,38380},{0,31,6720},{0,23,245}, +{0,22,3864},{2,31,50747},{0,31,24961},{0,22,8353},{0,19,25735},{0,22,65535},{0,17,41319},{1,31,10152},{0,31,2624},{0,23,229},{0,20,2980},{5,10,19334},{0,20,13769},{0,18,6243},{0,13,14116},{12,1,19334},{0,13,14116},{0,18,0},{0,18,0},{0,18,0},{0,11,1},{0,9,1513},{0,8,772},{0,8,772},{0,5,821},{0,5,1750},{0,4,1028},{0,18,0},{0,18,0},{0,18,0},{0,11,1},{1,6,1513}, +{0,8,772},{0,8,772},{0,5,821},{3,2,1513},{0,5,821},{10,5,9248},{0,31,2624},{0,23,229},{0,20,2980},{10,5,9248},{12,9,9248},{0,20,2980},{0,15,9248},{12,9,9248},{0,15,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,31,43788},{0,31,9024},{0,24,126},{0,23,3525},{2,31,56155},{0,31,26241},{0,23,8425}, +{0,20,26793},{0,23,65535},{0,18,43819},{2,31,10787},{0,31,2624},{0,24,122},{0,21,2701},{8,0,20689},{0,22,14385},{0,19,6369},{0,13,14756},{12,2,20689},{0,13,14756},{0,21,1},{0,21,1},{0,21,1},{0,12,4},{0,10,1989},{0,9,1018},{0,9,1018},{0,6,1096},{0,5,2294},{0,5,1334},{0,21,1},{0,21,1},{0,21,1},{0,12,4},{1,7,1985},{0,9,1018},{0,9,1018},{0,6,1096},{1,5,1985}, +{0,6,1096},{12,1,9248},{0,31,2624},{0,24,122},{0,21,2701},{12,1,9248},{15,7,9248},{0,21,2701},{0,16,9250},{15,7,9248},{0,16,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{2,31,49964},{1,31,11512},{0,25,41},{0,24,3109},{2,31,62331},{0,31,28289},{0,24,8585},{0,21,27848},{0,23,65535},{0,19,46459},{2,31,11395}, +{0,31,2880},{0,25,37},{0,22,2440},{8,2,22129},{0,23,15030},{0,20,6509},{0,14,15441},{13,2,22129},{0,14,15441},{0,23,1},{0,23,1},{0,23,1},{0,14,0},{0,12,2525},{0,10,1300},{0,10,1300},{0,6,1384},{0,6,2905},{0,6,1708},{0,23,1},{0,23,1},{0,23,1},{0,14,0},{3,2,2521},{0,10,1300},{0,10,1300},{0,6,1384},{5,1,2521},{0,6,1384},{11,7,9248},{0,31,2880},{0,25,37}, +{0,22,2440},{11,7,9248},{13,11,9248},{0,22,2440},{0,17,9250},{13,11,9248},{0,17,9250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,31,57022},{1,31,15166},{0,26,20},{0,25,2804},{2,31,65535},{0,31,31511},{0,25,8733},{0,22,29095},{0,26,65535},{0,20,49444},{2,31,12385},{0,31,3474},{0,26,4},{0,23,2173},{8,4,23851}, +{0,23,15948},{0,21,6729},{0,15,16274},{14,2,23851},{0,15,16274},{0,26,0},{0,26,0},{0,26,0},{0,16,4},{0,13,3200},{0,11,1665},{0,11,1665},{0,7,1754},{0,7,3691},{0,6,2185},{0,26,0},{0,26,0},{0,26,0},{0,16,4},{1,10,3200},{0,11,1665},{0,11,1665},{0,7,1754},{5,2,3200},{0,7,1754},{11,10,9248},{1,31,3226},{0,26,4},{0,23,2173},{11,10,9248},{5,23,9248},{0,23,2173}, +{0,18,9248},{5,23,9248},{0,18,9248},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,31,63870},{1,31,19230},{0,27,45},{0,27,2520},{3,31,65535},{0,31,35191},{0,26,8925},{0,23,30250},{0,28,65535},{0,21,52374},{3,31,13449},{1,31,4026},{0,27,29},{0,24,1901},{3,24,25472},{0,26,16706},{0,22,6963},{0,16,17124},{14,3,25472}, +{0,16,17124},{0,29,1},{0,29,1},{0,29,1},{0,17,1},{0,14,3874},{0,13,2084},{0,13,2084},{0,8,2165},{0,8,4466},{0,7,2627},{0,29,1},{0,29,1},{0,29,1},{0,17,1},{4,1,3872},{0,13,2084},{0,13,2084},{0,8,2165},{3,5,3872},{0,8,2165},{12,9,9248},{2,31,3593},{0,27,29},{0,24,1901},{12,9,9248},{14,13,9248},{0,24,1901},{0,19,9248},{14,13,9248},{0,19,9248},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{3,31,65535},{1,31,24002},{0,28,109},{0,27,2268},{3,31,65535},{1,31,39095},{0,27,8825},{0,24,30825},{0,28,65535},{0,22,54996},{3,31,14345},{1,31,4766},{0,29,102},{0,26,1697},{3,26,26744},{0,28,17104},{0,23,6957},{0,17,17625},{15,3,26744},{0,17,17625},{0,31,5},{0,31,5},{0,31,5}, +{0,19,5},{0,16,4418},{0,14,2306},{0,14,2306},{0,9,2420},{0,8,5122},{0,8,2997},{0,31,5},{0,31,5},{0,31,5},{0,19,5},{3,6,4418},{0,14,2306},{0,14,2306},{0,9,2420},{3,6,4418},{0,9,2420},{14,5,9248},{4,31,3904},{1,28,1},{0,26,1693},{14,5,9248},{12,17,9248},{0,26,1693},{0,20,9250},{12,17,9248},{0,20,9250},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,1,1}, +{0,1,1},{0,1,1},{0,0,4},{0,0,4},{0,0,4},{3,31,65535},{1,31,29442},{0,29,330},{0,28,2105},{3,31,65535},{1,31,42151},{0,28,7781},{0,25,30108},{0,29,65535},{0,22,56388},{4,31,14976},{2,31,5434},{1,29,62},{0,27,1580},{11,0,26744},{0,29,16547},{0,24,6221},{0,18,17124},{13,7,26744},{0,18,17124},{0,31,181},{0,31,181},{0,31,181},{0,20,101},{0,19,4420},{0,16,2005},{0,16,2005}, +{0,10,2165},{0,9,5389},{0,9,2925},{1,31,37},{1,31,37},{1,31,37},{1,19,37},{5,2,4418},{0,16,2005},{0,16,2005},{0,10,2165},{8,1,4418},{0,10,2165},{13,11,9248},{4,31,4160},{1,29,26},{0,27,1480},{13,11,9248},{15,15,9248},{0,27,1480},{0,21,9250},{15,15,9248},{0,21,9250},{0,0,100},{0,0,100},{0,0,100},{0,0,100},{0,3,1},{0,3,1},{0,3,1},{0,2,0},{0,1,34}, +{0,1,34},{4,31,65535},{2,31,36070},{0,30,822},{0,30,2062},{3,31,65535},{1,31,46660},{0,29,6696},{0,26,29322},{0,31,65535},{0,23,58077},{4,31,15507},{3,31,6253},{1,31,109},{0,28,1646},{11,3,26744},{0,31,15992},{0,26,5346},{0,19,16582},{11,11,26744},{0,19,16582},{1,31,329},{1,31,329},{1,31,329},{1,21,266},{0,22,4420},{0,18,1737},{0,18,1737},{0,11,1898},{0,11,5707},{0,10,2885},{1,31,73}, +{1,31,73},{1,31,73},{1,21,10},{5,5,4418},{0,18,1737},{0,18,1737},{0,11,1898},{5,7,4418},{0,11,1898},{13,14,9248},{5,31,4570},{2,30,4},{0,28,1285},{13,14,9248},{8,25,9248},{0,28,1285},{0,22,9248},{8,25,9248},{0,22,9248},{1,0,265},{1,0,265},{1,0,265},{1,0,265},{0,6,1},{0,6,1},{0,6,1},{0,4,1},{0,3,97},{0,3,97},{4,31,65535},{2,31,40786},{0,31,1405}, +{0,30,2138},{4,31,65535},{1,31,49800},{0,30,5634},{0,27,27967},{0,31,65535},{0,24,58770},{5,31,15531},{3,31,6593},{2,31,61},{1,29,1533},{12,2,26259},{0,31,15284},{0,27,4514},{0,20,15812},{13,10,26259},{0,20,15812},{1,31,633},{1,31,633},{1,31,633},{1,22,381},{0,24,4418},{0,20,1480},{0,20,1480},{0,12,1640},{0,12,6125},{0,11,2891},{2,31,61},{2,31,61},{2,31,61},{2,21,37},{7,1,4418}, +{0,20,1480},{0,20,1480},{0,12,1640},{10,2,4418},{0,12,1640},{13,16,8978},{6,31,4777},{2,31,25},{0,29,1040},{13,16,8978},{15,18,8978},{0,29,1040},{0,23,8980},{15,18,8978},{0,23,8980},{1,0,377},{1,0,377},{1,0,377},{1,0,377},{0,9,0},{0,9,0},{0,9,0},{0,5,4},{0,4,193},{0,4,193},{4,31,65535},{2,31,40898},{1,31,2217},{0,31,2125},{4,31,65535},{1,31,47976},{0,30,4194}, +{0,27,24703},{0,31,65535},{0,24,56130},{5,31,14379},{4,31,6051},{2,31,173},{2,29,1284},{9,14,24371},{0,31,13716},{0,28,3402},{0,21,13989},{14,10,24371},{0,21,13989},{1,31,1193},{1,31,1193},{1,31,1193},{1,24,617},{0,27,4420},{0,22,1280},{0,22,1280},{0,13,1445},{0,14,6509},{0,12,2945},{2,31,173},{2,31,173},{2,31,173},{2,23,5},{5,10,4418},{0,22,1280},{0,22,1280},{0,13,1445},{12,1,4418}, +{0,13,1445},{14,14,7938},{7,31,4253},{3,31,9},{0,29,656},{14,14,7938},{14,20,7938},{0,29,656},{0,23,7956},{14,20,7938},{0,23,7956},{1,0,617},{1,0,617},{1,0,617},{1,0,617},{0,11,4},{0,11,4},{0,11,4},{0,7,0},{0,5,325},{0,5,325},{4,31,65535},{2,31,41266},{1,31,3033},{0,31,2333},{4,31,65535},{1,31,46408},{0,30,3010},{0,27,21695},{0,31,65535},{0,25,53636},{6,31,13140}, +{4,31,5571},{3,31,157},{2,29,932},{11,9,22568},{0,31,12404},{0,28,2474},{0,21,12245},{14,11,22568},{0,21,12245},{2,31,1630},{2,31,1630},{2,31,1630},{1,26,989},{0,29,4420},{0,23,1090},{0,23,1090},{0,14,1268},{0,15,6926},{0,13,3029},{3,31,157},{3,31,157},{3,31,157},{3,23,37},{8,1,4418},{0,23,1090},{0,23,1090},{0,14,1268},{10,5,4418},{0,14,1268},{15,12,6962},{7,31,3709},{4,31,1}, +{0,30,353},{15,12,6962},{13,22,6962},{0,30,353},{0,24,6970},{13,22,6962},{0,24,6970},{1,0,985},{1,0,985},{1,0,985},{1,0,985},{0,14,0},{0,14,0},{0,14,0},{0,8,4},{0,6,493},{0,6,493},{4,31,65535},{2,31,41986},{1,31,4257},{0,31,2873},{4,31,65535},{1,31,44950},{0,30,1984},{0,28,18569},{0,31,65535},{0,25,51026},{6,31,11934},{5,31,5125},{4,31,296},{3,29,706},{13,4,20642}, +{0,31,11234},{0,29,1634},{0,22,10422},{15,11,20642},{0,22,10422},{2,31,2350},{2,31,2350},{2,31,2350},{2,26,1450},{0,31,4450},{0,25,949},{0,25,949},{0,16,1096},{0,16,7397},{0,14,3171},{4,31,296},{4,31,296},{4,31,296},{3,25,10},{8,4,4418},{0,25,949},{0,25,949},{0,16,1096},{14,2,4418},{0,16,1096},{14,17,5941},{7,31,3250},{5,31,0},{0,30,128},{14,17,5941},{13,23,5941},{0,30,128}, +{0,24,5953},{13,23,5941},{0,24,5953},{2,0,1450},{2,0,1450},{2,0,1450},{2,0,1450},{0,17,0},{0,17,0},{0,17,0},{0,10,1},{0,8,697},{0,8,697},{4,31,65535},{2,31,42898},{1,31,5617},{1,31,3337},{4,31,65535},{1,31,43926},{0,31,1250},{0,28,15865},{0,31,65535},{0,25,48978},{7,31,10938},{5,31,4773},{4,31,360},{3,30,509},{12,9,19021},{1,31,10246},{0,30,1088},{0,23,8945},{14,13,19021}, +{0,23,8945},{2,31,3262},{2,31,3262},{2,31,3262},{2,28,1822},{1,31,4682},{0,28,776},{0,28,776},{0,17,925},{0,18,7893},{0,15,3333},{4,31,360},{4,31,360},{4,31,360},{4,25,37},{3,25,4418},{0,28,776},{0,28,776},{0,17,925},{12,6,4418},{0,17,925},{15,15,5101},{8,31,2777},{6,31,9},{0,31,25},{15,15,5101},{11,26,5101},{0,31,25},{0,25,5105},{11,26,5101},{0,25,5105},{2,0,1818}, +{2,0,1818},{2,0,1818},{2,0,1818},{0,20,1},{0,20,1},{0,20,1},{0,12,1},{0,9,925},{0,9,925},{4,31,65535},{2,31,44066},{1,31,7233},{1,31,3993},{4,31,65535},{2,31,43110},{0,31,738},{0,28,13417},{0,31,65535},{0,25,47186},{7,31,9978},{6,31,4467},{5,31,452},{4,30,357},{15,1,17485},{2,31,9441},{0,30,704},{0,24,7570},{15,13,17485},{0,24,7570},{3,31,4058},{3,31,4058},{3,31,4058}, +{2,29,2315},{1,31,4874},{0,29,610},{0,29,610},{0,18,772},{0,20,8427},{0,16,3497},{5,31,452},{5,31,452},{5,31,452},{4,27,5},{9,6,4418},{0,29,610},{0,29,610},{0,18,772},{14,5,4418},{0,18,772},{15,16,4325},{8,31,2377},{6,31,25},{0,31,9},{15,16,4325},{15,22,4325},{0,31,9},{0,25,4337},{15,22,4325},{0,25,4337},{2,0,2314},{2,0,2314},{2,0,2314},{2,0,2314},{0,22,1}, +{0,22,1},{0,22,1},{0,13,4},{0,10,1189},{0,10,1189},{5,31,65535},{3,31,45090},{1,31,9105},{1,31,4905},{4,31,65535},{2,31,42326},{0,31,482},{0,28,11225},{0,31,65535},{0,26,45590},{7,31,9274},{6,31,4179},{5,31,612},{4,30,245},{14,6,16034},{3,31,8633},{0,31,482},{0,24,6242},{15,14,16034},{0,24,6242},{3,31,5066},{3,31,5066},{3,31,5066},{2,31,2939},{1,31,5322},{0,31,482},{0,31,482}, +{0,19,637},{0,20,8939},{0,17,3725},{5,31,612},{5,31,612},{5,31,612},{5,27,37},{10,5,4418},{0,31,482},{0,31,482},{0,19,637},{12,9,4418},{0,19,637},{13,24,3613},{9,31,1973},{7,31,9},{2,31,1},{13,24,3613},{15,23,3613},{2,31,1},{0,26,3617},{15,23,3613},{0,26,3617},{2,0,2938},{2,0,2938},{2,0,2938},{2,0,2938},{0,25,1},{0,25,1},{0,25,1},{0,15,0},{0,11,1489}, +{0,11,1489},{5,31,65535},{3,31,46530},{1,31,11517},{1,31,6237},{4,31,65535},{2,31,41750},{0,31,500},{0,29,8976},{0,31,65535},{0,26,43934},{8,31,8225},{7,31,3853},{6,31,680},{5,30,109},{11,18,14504},{4,31,7667},{0,31,500},{0,25,4979},{10,21,14504},{0,25,4979},{3,31,6506},{3,31,6506},{3,31,6506},{3,31,3701},{2,31,6019},{0,31,500},{0,31,500},{0,20,520},{0,22,9629},{0,18,4035},{6,31,680}, +{6,31,680},{6,31,680},{5,29,10},{10,8,4418},{0,31,500},{0,31,500},{0,20,520},{11,12,4418},{0,20,520},{15,19,2888},{10,31,1537},{8,31,16},{3,31,4},{15,19,2888},{13,26,2888},{3,31,4},{0,26,2906},{13,26,2888},{0,26,2906},{3,0,3697},{3,0,3697},{3,0,3697},{3,0,3697},{0,28,1},{0,28,1},{0,28,1},{0,17,4},{0,11,1930},{0,11,1930},{5,31,65535},{3,31,48082},{1,31,13933}, +{1,31,7693},{4,31,65535},{2,31,41510},{0,31,788},{0,29,7120},{0,31,65535},{0,26,42734},{8,31,7409},{7,31,3693},{7,31,884},{6,30,116},{13,13,13235},{4,31,6899},{1,31,628},{0,25,3987},{15,16,13235},{0,25,3987},{4,31,7686},{4,31,7686},{4,31,7686},{3,31,4437},{2,31,6659},{0,31,788},{0,31,788},{0,21,421},{0,23,10286},{0,20,4305},{7,31,884},{7,31,884},{7,31,884},{6,29,37},{9,14,4418}, +{1,31,628},{1,31,628},{0,21,421},{14,10,4418},{0,21,421},{15,20,2312},{10,31,1217},{8,31,16},{4,31,9},{15,20,2312},{12,28,2312},{4,31,9},{0,27,2314},{12,28,2312},{0,27,2314},{3,0,4337},{3,0,4337},{3,0,4337},{3,0,4337},{0,30,1},{0,30,1},{0,30,1},{0,18,1},{0,13,2329},{0,13,2329},{5,31,65535},{3,31,49890},{2,31,16310},{1,31,9405},{4,31,65535},{2,31,41526},{0,31,1332}, +{0,29,5520},{0,31,65535},{0,26,41790},{8,31,6849},{8,31,3601},{7,31,980},{6,31,5},{15,8,12051},{5,31,6275},{2,31,801},{0,26,3066},{11,22,12051},{0,26,3066},{4,31,9062},{4,31,9062},{4,31,9062},{3,31,5429},{2,31,7555},{1,31,1172},{1,31,1172},{0,23,325},{0,23,11118},{0,20,4625},{7,31,980},{7,31,980},{7,31,980},{6,31,5},{11,10,4418},{2,31,801},{2,31,801},{0,23,325},{5,23,4418}, +{0,23,325},{13,28,1800},{11,31,949},{9,31,4},{6,31,1},{13,28,1800},{11,30,1800},{6,31,1},{0,27,1818},{11,30,1800},{0,27,1818},{3,0,5105},{3,0,5105},{3,0,5105},{3,0,5105},{0,31,36},{0,31,36},{0,31,36},{0,20,4},{0,15,2741},{0,15,2741},{5,31,65535},{3,31,51954},{2,31,18790},{1,31,11373},{5,31,65535},{2,31,41798},{0,31,2132},{0,29,4176},{0,31,65535},{0,27,41092},{9,31,6153}, +{8,31,3297},{7,31,1332},{7,31,37},{14,13,10952},{5,31,5763},{3,31,965},{0,27,2291},{11,23,10952},{0,27,2291},{4,31,10694},{4,31,10694},{4,31,10694},{4,31,6566},{3,31,8619},{1,31,1716},{1,31,1716},{0,24,221},{0,26,11876},{0,22,4989},{7,31,1332},{7,31,1332},{7,31,1332},{7,31,37},{12,9,4418},{3,31,965},{3,31,965},{0,24,221},{14,13,4418},{0,24,221},{14,26,1352},{11,31,725},{10,31,0}, +{7,31,1},{14,26,1352},{15,26,1352},{7,31,1},{0,28,1360},{15,26,1352},{0,28,1360},{3,0,6001},{3,0,6001},{3,0,6001},{3,0,6001},{0,31,196},{0,31,196},{0,31,196},{0,21,1},{0,16,3130},{0,16,3130},{5,31,65535},{3,31,54582},{2,31,21886},{1,31,13893},{5,31,65535},{2,31,42410},{0,31,3338},{0,30,2841},{0,31,65535},{0,27,40390},{9,31,5649},{9,31,3249},{8,31,1325},{7,31,109},{14,15,9818}, +{6,31,5258},{4,31,1108},{0,27,1589},{12,23,9818},{0,27,1589},{5,31,12376},{5,31,12376},{5,31,12376},{4,31,7844},{3,31,9861},{1,31,2634},{1,31,2634},{0,25,136},{0,28,12696},{0,23,5429},{8,31,1325},{8,31,1325},{8,31,1325},{7,31,109},{15,2,4418},{4,31,1108},{4,31,1108},{0,25,136},{13,16,4418},{0,25,136},{15,24,925},{12,31,505},{11,31,1},{8,31,1},{15,24,925},{15,27,925},{8,31,1}, +{0,28,937},{15,27,925},{0,28,937},{4,0,7060},{4,0,7060},{4,0,7060},{4,0,7060},{1,31,425},{1,31,425},{1,31,425},{0,23,0},{0,17,3665},{0,17,3665},{5,31,65535},{3,31,57190},{2,31,24910},{1,31,16405},{5,31,65535},{2,31,43226},{0,31,4682},{0,30,1833},{0,31,65535},{0,27,40038},{10,31,5202},{9,31,3073},{8,31,1565},{8,31,277},{13,20,8901},{7,31,4814},{5,31,1300},{0,28,1021},{13,23,8902}, +{0,28,1021},{5,31,14136},{5,31,14136},{5,31,14136},{4,31,9252},{3,31,11237},{2,31,3590},{2,31,3590},{0,26,85},{0,29,13491},{0,23,5925},{8,31,1565},{8,31,1565},{8,31,1565},{8,31,277},{11,18,4418},{5,31,1300},{5,31,1300},{0,26,85},{10,21,4418},{0,26,85},{15,25,617},{13,31,365},{12,31,16},{9,31,9},{15,25,617},{13,30,613},{9,31,9},{0,29,617},{13,30,613},{0,29,617},{4,0,7956}, +{4,0,7956},{4,0,7956},{4,0,7956},{1,31,697},{1,31,697},{1,31,697},{0,25,4},{0,18,4181},{0,18,4181},{5,31,65535},{3,31,60054},{2,31,28190},{2,31,18895},{5,31,65535},{2,31,44298},{1,31,6090},{0,30,1081},{0,31,65535},{0,27,39942},{10,31,4850},{10,31,3107},{9,31,1709},{8,31,325},{13,22,8069},{7,31,4574},{6,31,1553},{0,29,602},{12,25,8069},{0,29,602},{6,31,16067},{6,31,16067},{6,31,16067}, +{5,31,10872},{4,31,12824},{2,31,4662},{2,31,4662},{0,27,52},{0,30,14340},{0,25,6449},{9,31,1709},{9,31,1709},{9,31,1709},{8,31,325},{13,14,4418},{6,31,1553},{6,31,1553},{0,27,52},{8,25,4418},{0,27,52},{15,27,365},{13,31,205},{12,31,16},{11,31,4},{15,27,365},{13,31,365},{11,31,4},{0,29,377},{13,31,365},{0,29,377},{4,0,8980},{4,0,8980},{4,0,8980},{4,0,8980},{1,31,1097}, +{1,31,1097},{1,31,1097},{0,26,1},{0,20,4682},{0,20,4682},{6,31,65535},{4,31,58981},{2,31,29926},{2,31,19751},{5,31,65535},{3,31,43402},{1,31,6910},{0,30,765},{0,31,65535},{0,28,34909},{11,31,4502},{10,31,3011},{9,31,2045},{9,31,557},{15,17,7322},{8,31,4242},{7,31,1781},{0,29,314},{12,26,7322},{0,29,314},{6,31,16739},{6,31,16739},{6,31,16739},{5,31,11492},{4,31,13636},{3,31,5586},{3,31,5586}, +{0,28,65},{0,31,14139},{0,26,6041},{9,31,2045},{9,31,2045},{9,31,2045},{9,31,557},{14,13,4418},{7,31,1781},{7,31,1781},{0,28,29},{11,23,4418},{0,28,29},{15,28,181},{14,31,117},{13,31,4},{12,31,0},{15,28,181},{15,29,181},{12,31,0},{0,30,185},{15,29,181},{0,30,185},{4,0,9376},{4,0,9376},{4,0,9376},{4,0,9376},{2,31,1405},{2,31,1405},{2,31,1405},{0,28,40},{0,21,4520}, +{0,21,4520},{6,31,65535},{4,31,57316},{3,31,30345},{3,31,20808},{6,31,65535},{3,31,41449},{2,31,8321},{1,31,301},{0,31,65535},{0,28,28330},{11,31,4232},{11,31,3093},{10,31,2248},{9,31,809},{15,19,6584},{9,31,3992},{7,31,2105},{0,30,77},{13,26,6584},{0,30,77},{7,31,17380},{7,31,17380},{7,31,17380},{6,31,12161},{5,31,14315},{3,31,6405},{3,31,6405},{1,29,53},{0,31,13860},{0,28,5286},{10,31,2248}, +{10,31,2248},{10,31,2248},{9,31,809},{14,16,4418},{7,31,2105},{7,31,2105},{0,30,13},{15,20,4418},{0,30,13},{15,29,52},{14,31,36},{14,31,0},{13,31,9},{15,29,52},{15,30,50},{13,31,9},{0,30,68},{15,30,50},{0,30,68},{5,0,9250},{5,0,9250},{5,0,9250},{5,0,9250},{2,31,1549},{2,31,1549},{2,31,1549},{1,28,2},{0,23,4114},{0,23,4114},{6,31,65535},{5,31,55908},{4,31,31583}, +{3,31,21256},{6,31,65535},{4,31,39740},{2,31,9073},{1,31,285},{0,31,65535},{0,29,23356},{12,31,4011},{11,31,3125},{11,31,2500},{10,31,1037},{13,27,6019},{10,31,3738},{8,31,2340},{0,31,4},{13,27,6019},{0,31,4},{7,31,17796},{7,31,17796},{7,31,17796},{6,31,12625},{6,31,14996},{4,31,7139},{4,31,7139},{1,30,86},{0,31,14020},{0,29,4652},{11,31,2500},{11,31,2500},{11,31,2500},{10,31,1037},{13,22,4418}, +{8,31,2340},{8,31,2340},{0,31,4},{12,25,4418},{0,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{15,31,4},{0,31,4},{15,31,4},{0,31,4},{6,0,9376},{6,0,9376},{6,0,9376},{6,0,9376},{3,31,1765},{3,31,1765},{3,31,1765},{1,30,50},{0,25,3877},{0,25,3877},{7,31,65535},{5,31,53236},{4,31,30487},{4,31,21367},{6,31,65535},{4,31,37332},{3,31,9385}, +{2,31,36},{0,31,65535},{0,29,18680},{12,31,3443},{12,31,2843},{11,31,2248},{10,31,997},{14,25,5163},{10,31,3218},{9,31,2120},{1,31,4},{12,29,5163},{1,31,4},{7,31,17504},{7,31,17504},{7,31,17504},{7,31,12569},{6,31,14328},{4,31,7227},{4,31,7227},{2,31,20},{0,31,13376},{0,29,3944},{11,31,2248},{11,31,2248},{11,31,2248},{10,31,997},{15,17,3872},{9,31,2120},{9,31,2120},{1,31,4},{12,26,3872}, +{1,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{6,0,9248},{6,0,9248},{6,0,9248},{6,0,9248},{3,31,2005},{3,31,2005},{3,31,2005},{2,30,5},{0,27,3545},{0,27,3545},{7,31,65535},{6,31,50785},{4,31,29687},{4,31,20567},{7,31,65535},{4,31,35412},{3,31,8985},{2,31,196},{1,31,65535},{0,29,14712},{12,31,2883}, +{12,31,2283},{12,31,1922},{11,31,821},{13,29,4267},{11,31,2694},{10,31,1745},{3,31,4},{14,27,4267},{3,31,4},{8,31,16610},{8,31,16610},{8,31,16610},{7,31,12185},{6,31,13528},{5,31,6915},{5,31,6915},{2,31,52},{1,31,12556},{0,30,3314},{12,31,1922},{12,31,1922},{12,31,1922},{11,31,821},{12,28,3200},{10,31,1745},{10,31,1745},{3,31,4},{11,28,3200},{3,31,4},{15,31,0},{15,31,0},{15,31,0}, +{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{6,0,9376},{6,0,9376},{6,0,9376},{6,0,9376},{4,31,2250},{4,31,2250},{4,31,2250},{2,31,52},{0,28,3170},{0,28,3170},{7,31,65535},{6,31,47239},{5,31,28065},{5,31,20409},{7,31,65535},{5,31,32574},{4,31,8965},{3,31,54},{1,31,65206},{0,30,10964},{13,31,2326},{12,31,1806},{12,31,1445},{11,31,650},{13,30,3361}, +{11,31,2091},{10,31,1322},{4,31,0},{12,30,3361},{4,31,0},{8,31,15584},{8,31,15584},{8,31,15584},{7,31,12059},{7,31,12522},{6,31,6811},{6,31,6811},{3,31,50},{1,31,11710},{0,31,2834},{12,31,1445},{12,31,1445},{12,31,1445},{11,31,650},{14,23,2521},{10,31,1322},{10,31,1322},{4,31,0},{15,24,2521},{4,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0}, +{0,31,0},{15,31,0},{0,31,0},{7,0,9250},{7,0,9250},{7,0,9250},{7,0,9250},{5,31,2600},{5,31,2600},{5,31,2600},{3,31,50},{0,31,2834},{0,31,2834},{8,31,65535},{6,31,44903},{5,31,27361},{5,31,19705},{7,31,64494},{5,31,30846},{4,31,8677},{3,31,470},{2,31,60777},{0,30,8308},{13,31,1782},{13,31,1510},{12,31,1157},{12,31,557},{13,31,2646},{11,31,1691},{11,31,1066},{5,31,4},{15,27,2646}, +{5,31,4},{8,31,14944},{8,31,14944},{8,31,14944},{8,31,11696},{7,31,11850},{6,31,6555},{6,31,6555},{4,31,164},{2,31,11097},{0,31,2610},{12,31,1157},{12,31,1157},{12,31,1157},{12,31,557},{15,21,1985},{11,31,1066},{11,31,1066},{5,31,4},{15,25,1985},{5,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{7,0,9410}, +{7,0,9410},{7,0,9410},{7,0,9410},{5,31,2792},{5,31,2792},{5,31,2792},{4,31,164},{0,31,2610},{0,31,2610},{8,31,63584},{7,31,42019},{6,31,25930},{5,31,19769},{8,31,60273},{6,31,28860},{5,31,8761},{4,31,276},{3,31,56253},{0,30,6420},{13,31,1366},{13,31,1094},{13,31,925},{12,31,397},{15,25,2018},{12,31,1298},{11,31,794},{7,31,4},{13,30,2017},{7,31,4},{9,31,14244},{9,31,14244},{9,31,14244}, +{8,31,11312},{8,31,11249},{7,31,6499},{7,31,6499},{4,31,260},{3,31,10457},{0,31,2642},{13,31,925},{13,31,925},{13,31,925},{12,31,397},{15,22,1513},{11,31,794},{11,31,794},{7,31,4},{14,27,1513},{7,31,4},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{8,0,9376},{8,0,9376},{8,0,9376},{8,0,9376},{6,31,3074}, +{6,31,3074},{6,31,3074},{4,31,260},{0,31,2642},{0,31,2642},{8,31,58848},{7,31,39683},{6,31,25130},{6,31,19007},{8,31,54849},{6,31,27132},{5,31,8569},{4,31,756},{4,31,51302},{0,31,5046},{13,31,1078},{13,31,806},{13,31,637},{12,31,365},{15,26,1473},{12,31,978},{12,31,617},{8,31,9},{14,29,1473},{8,31,9},{9,31,13604},{9,31,13604},{9,31,13604},{8,31,11184},{8,31,10433},{7,31,6339},{7,31,6339}, +{5,31,424},{4,31,9713},{0,31,2930},{13,31,637},{13,31,637},{13,31,637},{12,31,365},{14,27,1105},{12,31,617},{12,31,617},{8,31,9},{13,29,1105},{8,31,9},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{15,31,0},{0,31,0},{15,31,0},{0,31,0},{8,0,9248},{8,0,9248},{8,0,9248},{8,0,9248},{6,31,3330},{6,31,3330},{6,31,3330},{5,31,424},{0,31,2930}, +{0,31,2930}, diff --git a/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_alpha_33.inc b/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_alpha_33.inc new file mode 100644 index 0000000..3b9d702 --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder_tables_pvrtc2_alpha_33.inc @@ -0,0 +1,481 @@ +{0,0,20},{0,0,20},{0,0,97},{0,0,145},{0,0,56},{0,0,104},{0,0,181},{0,0,406},{0,0,204},{0,0,442},{0,0,20},{0,0,20},{0,0,97},{0,0,145},{0,0,56},{0,0,104},{0,0,181},{0,0,406},{0,0,168},{0,0,406},{0,0,16},{0,0,16},{0,0,16},{0,0,64},{0,0,52},{0,0,100},{0,0,100},{0,0,325},{0,0,200},{0,0,361},{0,0,16}, +{0,0,16},{0,0,16},{0,0,64},{0,0,52},{0,0,100},{0,0,100},{0,0,325},{0,0,164},{0,0,325},{0,0,20},{0,0,20},{0,0,97},{0,0,145},{0,0,20},{0,0,68},{0,0,145},{0,0,306},{0,0,68},{0,0,306},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,1,126},{0,0,88},{0,0,53}, +{0,0,37},{0,0,116},{0,0,36},{0,0,1},{0,0,66},{0,0,88},{0,0,102},{0,1,126},{0,0,88},{0,0,53},{0,0,37},{0,0,116},{0,0,36},{0,0,1},{0,0,66},{0,0,52},{0,0,66},{0,0,52},{0,0,52},{0,0,52},{0,0,36},{0,0,16},{0,0,0},{0,0,0},{0,0,65},{0,0,52},{0,0,101},{0,0,52},{0,0,52},{0,0,52},{0,0,36},{0,0,16}, +{0,0,0},{0,0,0},{0,0,65},{0,0,16},{0,0,65},{0,1,90},{0,0,52},{0,0,17},{0,0,1},{0,1,90},{0,0,36},{0,0,1},{0,0,50},{0,0,36},{0,0,50},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,0,0},{0,0,0},{0,0,0},{0,0,16},{0,0,52},{0,0,52},{0,1,286},{0,1,310},{0,0,453},{0,0,373},{0,1,115},{0,1,307},{0,0,241}, +{0,0,130},{0,0,280},{0,0,70},{0,1,222},{0,1,246},{0,0,389},{0,0,309},{0,1,51},{1,0,195},{0,0,177},{0,0,66},{1,0,107},{0,0,66},{0,1,261},{0,1,261},{0,1,261},{0,0,324},{0,1,90},{0,0,192},{0,0,192},{0,0,81},{0,0,84},{0,0,21},{0,1,197},{0,1,197},{0,1,197},{0,0,260},{0,1,26},{0,0,128},{0,0,128},{0,0,17},{0,0,80}, +{0,0,17},{0,1,26},{0,1,50},{1,0,130},{1,0,74},{0,1,26},{1,0,26},{1,0,74},{0,0,50},{1,0,26},{0,0,50},{0,0,260},{0,0,260},{0,0,260},{0,0,260},{0,1,89},{0,1,89},{0,1,89},{0,0,80},{0,0,20},{0,0,20},{1,0,494},{1,0,550},{1,0,694},{1,0,702},{0,2,363},{0,1,291},{1,0,583},{1,0,631},{0,1,116},{1,0,428},{1,0,170}, +{1,0,226},{1,0,370},{1,0,378},{1,0,51},{0,1,35},{1,0,259},{1,0,307},{1,0,91},{1,0,307},{1,0,469},{1,0,469},{1,0,469},{1,0,477},{0,1,314},{0,1,290},{0,1,290},{1,0,406},{0,1,115},{1,0,203},{1,0,145},{1,0,145},{1,0,145},{1,0,153},{1,0,26},{1,0,34},{1,0,34},{1,0,82},{1,0,10},{1,0,82},{1,0,26},{0,1,50},{1,0,226}, +{1,0,234},{1,0,26},{0,1,26},{1,0,234},{0,0,306},{0,1,26},{0,0,306},{1,0,468},{1,0,468},{1,0,468},{1,0,468},{0,1,265},{0,1,265},{0,1,265},{1,0,325},{0,1,90},{0,1,90},{1,1,116},{1,1,124},{1,1,215},{1,1,271},{1,1,188},{1,1,252},{1,1,343},{1,1,606},{0,1,152},{0,1,392},{1,1,35},{1,1,43},{1,1,134},{1,1,190},{1,1,107}, +{1,1,171},{0,1,260},{0,1,356},{2,0,51},{0,1,356},{1,1,115},{1,1,115},{1,1,115},{1,1,171},{1,0,161},{1,0,241},{1,0,241},{1,0,469},{0,1,52},{0,1,292},{1,1,34},{1,1,34},{1,1,34},{1,1,90},{0,2,16},{1,0,160},{1,0,160},{0,1,256},{0,1,16},{0,1,256},{1,1,26},{1,1,34},{1,1,125},{0,1,116},{1,1,26},{2,0,26},{0,1,116}, +{0,1,356},{2,0,26},{0,1,356},{1,0,90},{1,0,90},{1,0,90},{1,0,90},{1,0,97},{1,0,97},{1,0,97},{1,0,145},{0,1,36},{0,1,36},{1,1,116},{1,1,60},{1,1,39},{1,1,31},{1,1,92},{1,1,28},{1,1,7},{1,1,94},{1,1,100},{1,1,142},{1,1,115},{1,1,59},{1,1,38},{1,1,30},{0,3,51},{1,1,27},{1,1,6},{1,1,93},{1,1,51}, +{1,1,93},{1,1,35},{1,1,35},{1,1,35},{1,1,27},{1,1,11},{1,1,3},{1,1,3},{1,1,90},{1,1,75},{1,1,138},{1,1,34},{1,1,34},{1,1,34},{1,1,26},{1,1,10},{1,1,2},{1,1,2},{1,1,89},{1,1,26},{1,1,89},{2,0,26},{1,1,34},{1,1,13},{1,1,5},{2,0,26},{3,0,26},{1,1,5},{0,1,68},{3,0,26},{0,1,68},{1,0,26}, +{1,0,26},{1,0,26},{1,0,26},{1,1,2},{1,1,2},{1,1,2},{1,1,26},{1,1,74},{1,1,74},{1,2,238},{1,2,286},{1,1,375},{1,1,303},{1,2,105},{1,1,316},{1,1,183},{1,1,94},{0,2,156},{1,1,46},{1,2,189},{1,2,237},{1,1,326},{1,1,254},{1,2,56},{2,1,232},{1,1,134},{1,1,45},{0,2,56},{1,1,45},{1,2,222},{1,2,222},{1,2,222}, +{1,1,267},{1,2,89},{1,1,147},{1,1,147},{1,1,58},{1,1,59},{1,1,10},{1,2,173},{1,2,173},{1,2,173},{1,1,218},{2,0,10},{1,1,98},{1,1,98},{1,1,9},{3,0,10},{1,1,9},{1,2,20},{1,2,68},{2,1,136},{2,1,72},{1,2,20},{0,2,20},{2,1,72},{0,1,36},{0,2,20},{0,1,36},{1,0,218},{1,0,218},{1,0,218},{1,0,218},{1,2,85}, +{1,2,85},{1,2,85},{1,1,58},{1,1,10},{1,1,10},{2,1,550},{2,1,598},{2,1,730},{2,1,730},{1,3,361},{1,2,265},{2,1,597},{1,1,606},{1,2,152},{2,1,408},{2,1,189},{2,1,237},{2,1,369},{2,1,369},{2,1,56},{1,2,40},{2,1,236},{2,1,264},{4,0,56},{2,1,264},{2,1,534},{2,1,534},{2,1,534},{2,1,534},{1,2,265},{1,2,265},{1,2,265}, +{1,1,410},{2,1,152},{2,1,212},{2,1,173},{2,1,173},{2,1,173},{2,1,173},{0,4,8},{2,1,40},{2,1,40},{2,1,68},{2,1,8},{2,1,68},{2,1,20},{1,2,36},{2,1,200},{2,1,200},{2,1,20},{4,0,20},{2,1,200},{0,1,260},{4,0,20},{0,1,260},{2,0,530},{2,0,530},{2,0,530},{2,0,530},{1,2,229},{1,2,229},{1,2,229},{1,2,325},{1,2,116}, +{1,2,116},{2,2,152},{2,2,168},{2,2,273},{2,2,337},{2,2,236},{2,2,316},{2,2,421},{2,2,706},{1,2,116},{1,2,436},{2,2,52},{2,2,68},{2,2,173},{2,2,237},{3,0,56},{1,2,211},{1,2,251},{1,2,411},{3,1,56},{1,2,411},{2,2,152},{2,2,152},{2,2,152},{2,2,216},{2,1,158},{2,1,230},{2,1,230},{2,1,438},{1,2,35},{1,2,315},{2,2,52}, +{2,2,52},{2,2,52},{2,2,116},{1,3,10},{2,1,130},{2,1,130},{1,2,290},{1,2,10},{1,2,290},{3,0,20},{2,2,52},{2,2,157},{1,2,130},{3,0,20},{3,1,20},{1,2,130},{0,2,410},{3,1,20},{0,2,410},{2,0,116},{2,0,116},{2,0,116},{2,0,116},{2,1,109},{2,1,109},{2,1,109},{2,1,149},{1,2,26},{1,2,26},{2,2,88},{2,2,40},{2,2,33}, +{2,2,33},{2,2,76},{2,2,28},{2,2,21},{2,2,130},{2,2,120},{2,2,190},{2,2,84},{2,2,36},{2,2,29},{2,2,29},{1,4,56},{2,2,24},{2,2,17},{2,2,126},{2,2,56},{2,2,126},{2,2,24},{2,2,24},{2,2,24},{2,2,24},{2,2,12},{2,2,12},{2,2,12},{2,2,121},{2,2,104},{2,2,181},{2,2,20},{2,2,20},{2,2,20},{2,2,20},{2,2,8}, +{2,2,8},{2,2,8},{2,2,117},{5,0,8},{2,2,117},{1,4,20},{2,2,20},{2,2,13},{2,2,13},{1,4,20},{2,2,20},{2,2,13},{0,2,90},{2,2,20},{0,2,90},{2,0,20},{2,0,20},{2,0,20},{2,0,20},{2,2,8},{2,2,8},{2,2,8},{2,2,40},{2,2,100},{2,2,100},{2,3,198},{2,3,270},{2,2,305},{2,2,241},{2,3,103},{2,2,252},{2,2,133}, +{2,2,66},{1,3,148},{2,2,30},{2,3,162},{2,3,234},{2,2,269},{2,2,205},{2,3,67},{2,2,216},{2,2,97},{2,2,30},{6,0,67},{2,2,30},{2,3,189},{2,3,189},{2,3,189},{2,2,216},{2,3,94},{2,2,108},{2,2,108},{2,2,41},{2,2,40},{2,2,5},{2,3,153},{2,3,153},{2,3,153},{2,2,180},{3,1,8},{2,2,72},{2,2,72},{2,2,5},{4,1,8}, +{2,2,5},{2,3,18},{2,3,90},{2,2,125},{2,2,61},{2,3,18},{6,0,18},{2,2,61},{0,2,26},{6,0,18},{0,2,26},{2,0,180},{2,0,180},{2,0,180},{2,0,180},{2,2,72},{2,2,72},{2,2,72},{2,2,40},{2,2,4},{2,2,4},{3,2,614},{2,3,622},{3,2,774},{3,2,766},{2,3,343},{2,3,247},{3,2,619},{2,2,514},{2,3,196},{2,2,382},{3,2,214}, +{3,2,254},{3,2,374},{3,2,366},{4,0,59},{2,3,51},{3,2,219},{3,2,227},{3,2,59},{3,2,227},{3,2,605},{3,2,605},{3,2,605},{3,2,597},{2,3,222},{2,3,246},{2,3,246},{2,2,345},{3,2,179},{2,2,213},{3,2,205},{3,2,205},{3,2,205},{3,2,197},{4,0,10},{3,2,50},{3,2,50},{3,2,58},{3,2,10},{3,2,58},{3,2,18},{2,3,26},{3,2,178}, +{3,2,170},{3,2,18},{5,1,18},{3,2,170},{0,2,218},{5,1,18},{0,2,218},{2,0,596},{2,0,596},{2,0,596},{2,0,596},{2,3,197},{2,3,197},{2,3,197},{2,2,296},{2,3,146},{2,3,146},{3,3,196},{3,3,220},{3,3,339},{3,3,411},{3,3,292},{3,3,388},{3,3,507},{3,3,814},{2,3,88},{2,3,488},{3,3,75},{3,3,99},{3,3,218},{3,3,290},{4,1,67}, +{2,3,168},{2,3,248},{2,3,472},{4,2,67},{2,3,472},{3,2,182},{3,2,182},{3,2,182},{3,2,246},{3,2,161},{3,2,225},{3,2,225},{3,2,413},{2,3,24},{3,2,308},{3,2,61},{3,2,61},{3,2,61},{3,2,125},{2,4,8},{3,2,104},{3,2,104},{3,2,292},{7,0,8},{3,2,292},{4,1,18},{3,3,74},{3,3,193},{2,3,148},{4,1,18},{4,2,18},{2,3,148}, +{0,3,468},{4,2,18},{0,3,468},{3,0,146},{3,0,146},{3,0,146},{3,0,146},{3,2,125},{3,2,125},{3,2,125},{3,2,157},{2,3,20},{2,3,20},{3,3,68},{3,3,28},{3,3,35},{3,3,43},{3,3,68},{3,3,36},{3,3,43},{3,3,174},{3,3,148},{3,3,246},{3,3,59},{3,3,19},{3,3,26},{3,3,34},{3,3,59},{3,3,27},{3,3,34},{2,3,152},{6,1,59}, +{2,3,152},{3,3,19},{3,3,19},{3,3,19},{3,3,27},{3,3,19},{3,3,27},{3,3,27},{3,3,158},{3,3,139},{3,3,230},{3,3,10},{3,3,10},{3,3,10},{3,3,18},{3,3,10},{3,3,18},{3,3,18},{2,3,136},{6,1,10},{2,3,136},{5,0,18},{3,3,10},{3,3,17},{3,3,25},{5,0,18},{3,3,18},{3,3,25},{0,3,116},{3,3,18},{0,3,116},{3,0,18}, +{3,0,18},{3,0,18},{3,0,18},{3,3,18},{3,3,18},{3,3,18},{3,3,58},{3,3,130},{3,3,130},{3,4,166},{3,4,262},{3,3,243},{3,3,187},{3,4,109},{3,3,196},{3,3,91},{3,3,46},{3,3,148},{3,3,22},{3,4,141},{3,4,237},{3,3,218},{3,3,162},{4,2,59},{3,3,171},{3,3,66},{3,3,21},{5,2,59},{3,3,21},{3,4,162},{3,4,162},{3,4,162}, +{3,3,171},{3,4,105},{3,3,75},{3,3,75},{3,3,30},{3,3,27},{3,3,6},{3,4,137},{3,4,137},{3,4,137},{3,3,146},{4,2,10},{3,3,50},{3,3,50},{3,3,5},{5,2,10},{3,3,5},{3,4,20},{3,4,116},{3,3,97},{3,3,41},{3,4,20},{7,1,20},{3,3,41},{0,3,20},{7,1,20},{0,3,20},{3,0,146},{3,0,146},{3,0,146},{3,0,146},{3,3,50}, +{3,3,50},{3,3,50},{3,3,26},{3,3,2},{3,3,2},{3,5,598},{3,4,550},{4,3,826},{4,3,810},{3,4,285},{3,4,237},{4,3,649},{3,3,430},{4,3,248},{3,3,310},{4,3,245},{4,3,277},{4,3,385},{4,3,369},{5,1,52},{3,4,68},{4,3,208},{4,3,196},{4,3,52},{4,3,196},{3,4,546},{3,4,546},{3,4,546},{3,4,594},{3,4,185},{3,4,233},{3,4,233}, +{3,3,286},{4,3,212},{3,3,166},{4,3,241},{4,3,241},{4,3,241},{4,3,225},{5,1,16},{4,3,64},{4,3,64},{4,3,52},{7,1,16},{4,3,52},{4,3,20},{3,4,20},{4,3,160},{4,3,144},{4,3,20},{6,2,20},{4,3,144},{0,3,180},{6,2,20},{0,3,180},{3,0,530},{3,0,530},{3,0,530},{3,0,530},{3,4,169},{3,4,169},{3,4,169},{3,3,250},{3,3,130}, +{3,3,130},{4,4,248},{4,4,280},{4,4,413},{4,4,493},{4,3,291},{4,3,451},{4,4,601},{4,3,835},{3,4,68},{3,4,548},{4,4,104},{4,4,136},{4,4,269},{4,4,349},{6,0,59},{3,4,131},{3,4,251},{3,4,539},{3,4,59},{3,4,539},{4,3,205},{4,3,205},{4,3,205},{4,3,261},{4,3,170},{4,3,226},{4,3,226},{4,3,394},{3,4,19},{4,3,275},{4,3,61}, +{4,3,61},{4,3,61},{4,3,117},{6,0,10},{4,3,82},{4,3,82},{4,3,250},{3,4,10},{4,3,250},{5,2,20},{4,4,100},{4,4,233},{3,4,170},{5,2,20},{5,3,20},{3,4,170},{0,4,530},{5,3,20},{0,4,530},{4,0,180},{4,0,180},{4,0,180},{4,0,180},{4,3,145},{4,3,145},{4,3,145},{4,3,169},{3,4,18},{3,4,18},{4,4,56},{4,4,24},{4,4,45}, +{4,4,61},{4,4,68},{4,4,52},{4,4,73},{4,4,226},{4,4,184},{3,4,292},{4,4,40},{4,4,8},{4,4,29},{4,4,45},{4,4,52},{4,4,36},{4,4,57},{3,4,171},{7,2,52},{3,4,171},{4,4,20},{4,4,20},{4,4,20},{4,4,36},{4,4,32},{4,4,48},{4,4,48},{4,4,201},{4,4,180},{3,4,267},{4,4,4},{4,4,4},{4,4,4},{4,4,20},{5,2,16}, +{4,4,32},{4,4,32},{3,4,146},{7,2,16},{3,4,146},{6,1,20},{4,4,4},{4,4,25},{4,4,41},{6,1,20},{4,4,20},{4,4,41},{0,4,146},{4,4,20},{0,4,146},{4,0,20},{4,0,20},{4,0,20},{4,0,20},{4,4,32},{4,4,32},{4,4,32},{4,4,80},{3,4,146},{3,4,146},{4,5,142},{4,5,262},{4,4,189},{4,4,141},{4,5,123},{4,4,148},{4,4,57}, +{4,4,34},{4,4,120},{4,4,22},{4,5,126},{4,5,246},{4,4,173},{4,4,125},{5,3,52},{4,4,132},{4,4,41},{4,4,18},{6,3,52},{4,4,18},{4,5,141},{4,5,141},{4,5,141},{4,4,132},{4,4,96},{4,4,48},{4,4,48},{4,4,25},{4,4,20},{4,4,13},{4,5,125},{4,5,125},{4,5,125},{4,4,116},{6,1,16},{4,4,32},{4,4,32},{4,4,9},{6,3,16}, +{4,4,9},{7,0,26},{4,5,146},{4,4,73},{4,4,25},{7,0,26},{3,5,26},{4,4,25},{0,4,18},{3,5,26},{0,4,18},{4,0,116},{4,0,116},{4,0,116},{4,0,116},{4,4,32},{4,4,32},{4,4,32},{4,4,16},{4,4,4},{4,4,4},{4,5,558},{4,5,486},{4,4,845},{4,4,733},{4,5,235},{4,5,235},{4,4,553},{4,4,354},{5,4,276},{4,4,246},{5,4,282}, +{5,4,306},{5,4,402},{5,4,378},{6,2,51},{4,5,91},{5,4,203},{5,4,171},{5,4,51},{5,4,171},{4,5,477},{4,5,477},{4,5,477},{4,5,549},{4,5,154},{4,5,226},{4,5,226},{4,4,233},{3,5,235},{4,4,125},{5,4,281},{5,4,281},{5,4,281},{5,4,257},{7,0,10},{5,4,82},{5,4,82},{5,4,50},{3,5,10},{5,4,50},{6,2,26},{4,5,18},{5,4,146}, +{5,4,122},{6,2,26},{7,3,26},{5,4,122},{0,4,146},{7,3,26},{0,4,146},{4,0,468},{4,0,468},{4,0,468},{4,0,468},{4,5,145},{4,5,145},{4,5,145},{4,4,208},{4,4,100},{4,4,100},{5,5,308},{5,5,348},{5,5,495},{5,5,583},{5,4,285},{5,4,429},{5,4,633},{5,4,781},{4,5,56},{4,5,616},{5,5,139},{5,5,179},{5,5,326},{5,5,414},{7,1,52}, +{4,5,100},{4,5,260},{5,4,612},{4,5,52},{5,4,612},{5,4,234},{5,4,234},{5,4,234},{5,4,282},{5,4,185},{5,4,233},{5,4,233},{5,4,381},{4,5,20},{5,4,248},{5,4,65},{5,4,65},{5,4,65},{5,4,113},{7,1,16},{5,4,64},{5,4,64},{5,4,212},{7,3,16},{5,4,212},{6,3,26},{5,5,130},{5,5,277},{4,5,196},{6,3,26},{6,4,26},{4,5,196}, +{0,4,596},{6,4,26},{0,4,596},{5,0,218},{5,0,218},{5,0,218},{5,0,218},{5,4,169},{5,4,169},{5,4,169},{5,4,185},{4,5,20},{4,5,20},{5,5,52},{5,5,28},{5,5,63},{5,5,87},{5,5,76},{5,5,76},{5,5,111},{5,5,286},{5,5,228},{4,5,296},{5,5,27},{5,5,3},{5,5,38},{5,5,62},{5,5,51},{5,5,51},{5,5,86},{4,5,196},{3,6,51}, +{4,5,196},{5,5,27},{5,5,27},{5,5,27},{5,5,51},{5,5,51},{5,5,75},{5,5,75},{5,5,250},{4,5,180},{4,5,260},{5,5,2},{5,5,2},{5,5,2},{5,5,26},{6,3,10},{5,5,50},{5,5,50},{4,5,160},{6,4,10},{4,5,160},{7,2,26},{5,5,2},{5,5,37},{5,5,61},{7,2,26},{5,5,26},{5,5,61},{0,5,180},{5,5,26},{0,5,180},{5,0,26}, +{5,0,26},{5,0,26},{5,0,26},{5,5,50},{5,5,50},{5,5,50},{5,5,106},{4,5,116},{4,5,116},{5,6,126},{5,5,220},{5,5,143},{5,5,103},{5,6,145},{5,5,108},{5,5,31},{5,5,30},{5,5,100},{5,5,30},{5,6,117},{5,5,211},{5,5,134},{5,5,94},{6,4,51},{5,5,99},{5,5,22},{5,5,21},{7,4,51},{5,5,21},{5,6,126},{5,6,126},{5,6,126}, +{5,5,99},{5,5,67},{5,5,27},{5,5,27},{5,5,26},{5,5,19},{5,5,26},{5,6,117},{5,6,117},{5,6,117},{5,5,90},{7,2,10},{5,5,18},{5,5,18},{5,5,17},{5,5,10},{5,5,17},{6,4,26},{5,5,130},{5,5,53},{5,5,13},{6,4,26},{7,4,26},{5,5,13},{0,5,20},{7,4,26},{0,5,20},{5,0,90},{5,0,90},{5,0,90},{5,0,90},{5,5,18}, +{5,5,18},{5,5,18},{5,5,10},{5,5,10},{5,5,10},{5,6,478},{5,6,430},{5,5,735},{5,5,631},{5,6,193},{5,6,241},{5,5,463},{5,5,286},{4,6,268},{5,5,190},{6,5,325},{5,6,309},{6,5,425},{6,5,393},{7,3,56},{6,5,120},{6,5,204},{6,5,152},{6,5,56},{6,5,152},{5,6,414},{5,6,414},{5,6,414},{5,6,510},{5,6,129},{5,6,225},{5,6,225}, +{5,5,186},{5,5,195},{5,5,90},{5,6,293},{5,6,293},{5,6,293},{6,5,293},{5,6,8},{6,5,104},{6,5,104},{6,5,52},{4,6,8},{6,5,52},{7,3,20},{5,6,20},{6,5,136},{6,5,104},{7,3,20},{6,5,20},{6,5,104},{0,5,116},{6,5,20},{0,5,116},{5,0,410},{5,0,410},{5,0,410},{5,0,410},{5,6,125},{5,6,125},{5,6,125},{5,5,170},{5,5,74}, +{5,5,74},{6,5,350},{6,6,424},{6,6,585},{6,5,670},{6,5,287},{6,5,415},{6,5,607},{6,5,735},{5,6,52},{6,5,588},{6,5,154},{6,6,228},{6,6,389},{6,5,474},{5,7,51},{5,6,75},{5,6,275},{6,5,539},{5,6,51},{6,5,539},{6,5,269},{6,5,269},{6,5,269},{6,5,309},{6,5,206},{6,5,246},{6,5,246},{6,5,374},{5,6,27},{6,5,227},{6,5,73}, +{6,5,73},{6,5,73},{6,5,113},{6,5,10},{6,5,50},{6,5,50},{6,5,178},{3,7,10},{6,5,178},{5,7,26},{5,6,146},{6,6,325},{5,6,226},{5,7,26},{5,6,26},{5,6,226},{0,5,530},{5,6,26},{0,5,530},{6,0,260},{6,0,260},{6,0,260},{6,0,260},{6,5,197},{6,5,197},{6,5,197},{6,5,205},{5,6,26},{5,6,26},{6,6,56},{6,6,40},{6,6,89}, +{6,6,121},{6,6,92},{6,6,108},{6,6,157},{6,6,354},{6,6,280},{5,6,308},{6,6,20},{6,6,4},{6,6,53},{6,6,85},{6,6,56},{6,6,72},{6,6,121},{5,6,227},{4,7,56},{5,6,227},{6,6,40},{6,6,40},{6,6,40},{6,6,72},{6,6,76},{6,6,108},{6,6,108},{6,6,305},{5,6,139},{5,6,259},{6,6,4},{6,6,4},{6,6,4},{6,6,36},{7,4,8}, +{6,6,72},{6,6,72},{5,6,178},{7,5,8},{5,6,178},{6,6,20},{6,6,4},{6,6,53},{6,6,85},{6,6,20},{4,7,20},{6,6,85},{0,6,218},{4,7,20},{0,6,218},{6,0,36},{6,0,36},{6,0,36},{6,0,36},{6,6,72},{6,6,72},{6,6,72},{6,6,136},{5,6,90},{5,6,90},{6,7,118},{6,6,168},{6,6,105},{6,6,73},{6,7,175},{6,6,76},{6,6,13}, +{6,6,34},{6,6,88},{6,6,46},{6,7,114},{6,6,164},{6,6,101},{6,6,69},{7,5,56},{6,6,72},{6,6,9},{6,6,30},{6,6,72},{6,6,30},{6,6,104},{6,6,104},{6,6,104},{6,6,72},{6,6,44},{6,6,12},{6,6,12},{6,6,33},{6,6,24},{6,6,45},{6,6,100},{6,6,100},{6,6,100},{6,6,68},{7,5,40},{6,6,8},{6,6,8},{6,6,29},{6,6,8}, +{6,6,29},{7,5,20},{6,6,100},{6,6,37},{6,6,5},{7,5,20},{5,7,50},{6,6,5},{0,6,26},{5,7,50},{0,6,26},{6,0,68},{6,0,68},{6,0,68},{6,0,68},{6,6,8},{6,6,8},{6,6,8},{6,6,8},{6,6,20},{6,6,20},{6,7,406},{6,7,382},{6,6,633},{6,6,537},{6,7,159},{6,7,255},{6,6,381},{6,6,226},{5,7,228},{6,6,142},{6,7,306}, +{6,7,282},{7,6,454},{7,6,414},{6,7,59},{7,6,139},{7,6,211},{6,6,126},{5,7,59},{6,6,126},{6,7,357},{6,7,357},{6,7,357},{6,6,456},{6,7,110},{6,7,230},{6,7,230},{6,6,145},{6,6,152},{6,6,61},{6,7,257},{6,7,257},{6,7,257},{7,6,333},{6,7,10},{7,6,130},{7,6,130},{6,6,45},{5,7,10},{6,6,45},{7,6,50},{6,7,26},{7,6,130}, +{7,6,90},{7,6,50},{7,6,18},{7,6,90},{0,6,90},{7,6,18},{0,6,90},{6,0,356},{6,0,356},{6,0,356},{6,0,356},{6,7,109},{6,7,109},{6,7,109},{6,6,136},{6,6,52},{6,6,52},{7,6,374},{7,6,454},{7,6,634},{7,6,666},{7,6,297},{7,6,409},{7,6,589},{7,6,697},{6,7,56},{7,6,536},{7,6,149},{7,6,229},{7,6,409},{7,6,441},{7,6,72}, +{6,7,56},{6,7,296},{7,6,472},{6,7,56},{7,6,472},{7,6,310},{7,6,310},{7,6,310},{7,6,342},{7,6,233},{7,6,265},{7,6,265},{7,6,373},{6,7,40},{7,6,212},{7,6,85},{7,6,85},{7,6,85},{7,6,117},{7,6,8},{7,6,40},{7,6,40},{7,6,148},{7,6,40},{7,6,148},{7,6,68},{6,7,116},{7,6,328},{6,7,260},{7,6,68},{6,7,20},{6,7,260}, +{0,6,468},{6,7,20},{0,6,468},{7,0,306},{7,0,306},{7,0,306},{7,0,306},{7,6,229},{7,6,229},{7,6,229},{7,6,229},{6,7,36},{6,7,36},{7,7,68},{7,7,60},{7,7,123},{7,7,163},{7,7,116},{7,7,148},{7,7,211},{7,7,430},{6,7,248},{6,7,328},{7,7,19},{7,7,11},{7,7,74},{7,7,114},{7,7,67},{7,7,99},{7,7,162},{6,7,264},{7,7,171}, +{6,7,264},{7,7,59},{7,7,59},{7,7,59},{7,7,99},{7,7,107},{7,7,147},{7,7,147},{7,7,366},{6,7,104},{6,7,264},{7,7,10},{7,7,10},{7,7,10},{7,7,50},{7,7,58},{7,7,98},{7,7,98},{6,7,200},{6,7,40},{6,7,200},{7,7,18},{7,7,10},{7,7,73},{6,7,100},{7,7,18},{7,7,50},{6,7,100},{0,7,260},{7,7,50},{0,7,260},{7,0,50}, +{7,0,50},{7,0,50},{7,0,50},{7,6,85},{7,6,85},{7,6,85},{7,6,149},{6,7,68},{6,7,68},{7,7,196},{7,7,124},{7,7,75},{7,7,51},{7,7,148},{7,7,52},{7,7,3},{7,7,46},{7,7,84},{7,7,70},{7,7,195},{7,7,123},{7,7,74},{7,7,50},{7,7,147},{7,7,51},{7,7,2},{7,7,45},{7,7,59},{7,7,45},{7,7,75},{7,7,75},{7,7,75}, +{7,7,51},{7,7,27},{7,7,3},{7,7,3},{7,7,46},{7,7,35},{7,7,70},{7,7,74},{7,7,74},{7,7,74},{7,7,50},{7,7,26},{7,7,2},{7,7,2},{7,7,45},{7,7,10},{7,7,45},{7,7,146},{7,7,74},{7,7,25},{7,7,1},{7,7,146},{7,7,50},{7,7,1},{0,7,36},{7,7,50},{0,7,36},{7,0,50},{7,0,50},{7,0,50},{7,0,50},{7,7,2}, +{7,7,2},{7,7,2},{7,7,10},{7,7,34},{7,7,34},{7,7,548},{7,7,476},{7,7,427},{7,7,355},{7,7,404},{7,7,260},{7,7,211},{7,7,106},{7,7,132},{7,7,34},{7,7,467},{7,7,395},{7,7,346},{7,7,274},{7,7,323},{7,7,179},{7,7,130},{7,7,25},{7,7,123},{7,7,25},{7,7,427},{7,7,427},{7,7,427},{7,7,355},{7,7,283},{7,7,211},{7,7,211}, +{7,7,106},{7,7,83},{7,7,34},{7,7,346},{7,7,346},{7,7,346},{7,7,274},{7,7,202},{7,7,130},{7,7,130},{7,7,25},{7,7,74},{7,7,25},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{7,0,306},{7,0,306},{7,0,306},{7,0,306},{7,7,162},{7,7,162},{7,7,162},{7,7,106},{7,7,34}, +{7,7,34},{0,0,122},{0,0,50},{0,0,1},{0,0,25},{0,0,158},{0,0,110},{0,0,61},{0,0,244},{0,0,210},{0,0,280},{0,0,122},{0,0,50},{0,0,1},{0,0,25},{0,0,158},{0,0,110},{0,0,61},{0,0,244},{0,0,174},{0,0,244},{0,0,1},{0,0,1},{0,0,1},{0,0,25},{0,0,37},{0,0,61},{0,0,61},{0,0,244},{0,0,161},{0,0,280},{0,0,1}, +{0,0,1},{0,0,1},{0,0,25},{0,0,37},{0,0,61},{0,0,61},{0,0,244},{0,0,125},{0,0,244},{0,0,122},{0,0,50},{0,0,1},{0,0,25},{0,0,122},{0,0,74},{0,0,25},{0,0,144},{0,0,74},{0,0,144},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,1,81},{0,1,81},{0,0,122}, +{0,0,82},{0,1,328},{0,0,243},{0,0,82},{0,0,129},{0,0,319},{0,0,165},{0,1,81},{0,1,81},{0,0,122},{0,0,82},{0,1,328},{0,0,243},{0,0,82},{0,0,129},{0,0,283},{0,0,129},{0,1,45},{0,1,45},{0,1,45},{0,0,18},{0,0,58},{0,0,18},{0,0,18},{0,0,65},{0,0,94},{0,0,101},{0,1,45},{0,1,45},{0,1,45},{0,0,18},{0,0,58}, +{0,0,18},{0,0,18},{0,0,65},{0,0,58},{0,0,65},{0,1,72},{0,1,72},{0,0,113},{0,0,73},{0,1,72},{1,0,104},{0,0,73},{0,0,80},{1,0,104},{0,0,80},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,49},{0,0,85},{0,0,85},{0,2,225},{0,1,129},{0,1,449},{0,0,498},{0,1,264},{0,1,168},{0,0,402}, +{0,0,273},{0,0,687},{0,0,309},{0,2,225},{0,1,129},{0,1,449},{0,0,498},{0,1,264},{0,1,168},{0,0,402},{0,0,273},{1,0,248},{0,0,273},{0,1,125},{0,1,125},{0,1,125},{0,1,221},{0,1,68},{0,0,146},{0,0,146},{0,0,17},{0,0,158},{0,0,53},{0,1,125},{0,1,125},{0,1,125},{0,1,221},{0,1,68},{0,0,146},{0,0,146},{0,0,17},{0,0,122}, +{0,0,17},{1,0,72},{0,1,8},{1,0,292},{1,0,260},{1,0,72},{1,0,104},{1,0,260},{0,0,272},{1,0,104},{0,0,272},{0,0,121},{0,0,121},{0,0,121},{0,0,121},{0,0,25},{0,0,25},{0,0,25},{0,0,1},{0,0,37},{0,0,37},{0,2,514},{0,2,558},{0,1,610},{0,1,514},{0,2,297},{0,1,153},{0,1,153},{0,1,777},{0,1,392},{0,0,802},{1,1,347}, +{1,1,355},{1,1,446},{0,1,465},{0,2,248},{0,1,104},{0,1,104},{0,1,728},{0,1,248},{0,1,728},{0,2,414},{0,2,414},{0,2,414},{0,1,414},{0,1,149},{0,1,53},{0,1,53},{0,0,274},{0,1,292},{0,0,226},{1,0,229},{1,0,229},{1,0,229},{1,0,261},{1,0,68},{0,1,4},{0,1,4},{1,0,160},{1,0,52},{1,0,160},{0,2,104},{1,1,130},{0,1,200}, +{0,1,104},{0,2,104},{2,0,74},{0,1,104},{0,1,584},{2,0,74},{0,1,584},{0,0,410},{0,0,410},{0,0,410},{0,0,410},{0,1,49},{0,1,49},{0,1,49},{0,0,130},{0,0,82},{0,0,82},{1,1,464},{1,1,400},{1,1,365},{1,1,397},{1,1,572},{0,2,499},{0,1,387},{0,1,435},{0,1,428},{0,1,188},{1,1,140},{1,1,76},{1,1,41},{1,1,73},{1,1,248}, +{1,1,216},{0,1,131},{0,1,179},{2,0,264},{0,1,179},{1,1,364},{1,1,364},{1,1,364},{1,1,396},{0,2,314},{0,1,386},{0,1,386},{0,1,434},{0,1,67},{0,1,187},{1,1,40},{1,1,40},{1,1,40},{1,1,72},{0,2,58},{0,1,130},{0,1,130},{0,1,178},{0,1,58},{0,1,178},{0,3,72},{1,1,40},{1,1,5},{1,1,37},{0,3,72},{1,1,72},{1,1,37}, +{0,1,170},{1,1,72},{0,1,170},{1,0,360},{1,0,360},{1,0,360},{1,0,360},{0,2,265},{0,2,265},{0,2,265},{0,1,265},{0,1,18},{0,1,18},{1,2,178},{1,2,202},{1,1,189},{1,1,157},{1,2,463},{1,1,316},{1,1,169},{1,1,238},{0,2,412},{0,1,124},{1,2,78},{1,2,102},{1,1,89},{1,1,57},{2,0,248},{0,2,99},{1,1,69},{0,1,99},{3,0,248}, +{0,1,99},{1,1,140},{1,1,140},{1,1,140},{1,1,108},{1,1,152},{1,1,120},{1,1,120},{1,1,189},{0,1,275},{0,1,75},{1,1,40},{1,1,40},{1,1,40},{1,1,8},{1,1,52},{1,1,20},{1,1,20},{0,1,50},{1,1,68},{0,1,50},{1,2,74},{1,2,98},{1,1,85},{1,1,53},{1,2,74},{0,2,74},{1,1,53},{0,1,74},{0,2,74},{0,1,74},{1,0,104}, +{1,0,104},{1,0,104},{1,0,104},{1,1,116},{1,1,116},{1,1,116},{1,1,164},{0,1,50},{0,1,50},{1,3,226},{1,2,106},{1,2,466},{1,1,429},{1,2,255},{1,2,207},{1,1,345},{1,1,238},{0,2,252},{1,1,298},{1,3,222},{1,2,102},{1,2,462},{1,1,425},{1,2,251},{1,2,203},{1,1,341},{1,1,234},{0,2,251},{1,1,234},{1,2,105},{1,2,105},{1,2,105}, +{1,1,204},{1,2,86},{1,1,120},{1,1,120},{1,1,13},{0,2,83},{1,1,73},{1,2,101},{1,2,101},{1,2,101},{1,1,200},{2,0,52},{1,1,116},{1,1,116},{1,1,9},{3,0,52},{1,1,9},{2,1,74},{1,2,2},{2,1,274},{2,1,234},{2,1,74},{4,0,74},{2,1,234},{0,1,234},{4,0,74},{0,1,234},{1,0,104},{1,0,104},{1,0,104},{1,0,104},{1,1,20}, +{1,1,20},{1,1,20},{1,1,4},{1,1,64},{1,1,64},{1,3,450},{1,2,522},{1,2,562},{1,2,490},{1,3,295},{1,2,127},{1,2,167},{1,1,750},{1,2,428},{1,1,714},{2,2,400},{2,2,416},{2,2,521},{1,2,454},{2,1,251},{1,2,91},{1,2,131},{0,2,651},{4,0,251},{0,2,651},{1,3,369},{1,3,369},{1,3,369},{1,2,369},{1,2,118},{1,2,46},{1,2,46}, +{1,1,221},{0,2,163},{1,1,185},{2,1,257},{2,1,257},{2,1,257},{2,1,281},{0,4,50},{1,2,10},{1,2,10},{2,1,146},{2,1,50},{2,1,146},{3,0,80},{2,2,160},{1,2,202},{1,2,130},{3,0,80},{3,1,80},{1,2,130},{0,1,650},{3,1,80},{0,1,650},{1,0,360},{1,0,360},{1,0,360},{1,0,360},{1,2,37},{1,2,37},{1,2,37},{1,1,100},{1,1,64}, +{1,1,64},{2,2,500},{2,2,444},{2,2,423},{2,2,463},{1,4,588},{1,3,513},{1,2,329},{1,2,441},{0,3,284},{1,2,232},{2,2,139},{2,2,83},{2,2,62},{2,2,102},{3,0,251},{2,2,243},{1,2,104},{1,2,216},{3,1,251},{1,2,216},{2,2,419},{2,2,419},{2,2,419},{2,2,459},{1,3,277},{1,2,325},{1,2,325},{1,2,437},{1,2,68},{1,2,228},{2,2,58}, +{2,2,58},{2,2,58},{2,2,98},{1,3,52},{1,2,100},{1,2,100},{1,2,212},{1,2,52},{1,2,212},{1,4,74},{2,2,34},{2,2,13},{1,2,40},{1,4,74},{2,2,74},{1,2,40},{0,2,200},{2,2,74},{0,2,200},{2,0,410},{2,0,410},{2,0,410},{2,0,410},{1,3,241},{1,3,241},{1,3,241},{1,2,241},{1,2,32},{1,2,32},{2,3,202},{2,3,250},{2,2,183}, +{2,2,159},{2,2,460},{2,2,316},{2,2,183},{2,2,274},{1,3,468},{1,2,104},{2,3,81},{2,3,129},{2,2,62},{2,2,38},{1,4,251},{1,3,96},{2,2,62},{1,2,88},{2,2,251},{1,2,88},{2,2,147},{2,2,147},{2,2,147},{2,2,123},{2,2,171},{2,2,147},{2,2,147},{2,2,238},{0,3,219},{1,2,68},{2,2,26},{2,2,26},{2,2,26},{2,2,2},{2,2,50}, +{2,2,26},{2,2,26},{1,2,52},{5,0,50},{1,2,52},{2,3,80},{2,3,128},{2,2,61},{2,2,37},{2,3,80},{6,0,80},{2,2,37},{0,2,72},{6,0,80},{0,2,72},{2,0,122},{2,0,122},{2,0,122},{2,0,122},{2,2,146},{2,2,146},{2,2,146},{2,2,202},{1,2,32},{1,2,32},{2,3,234},{2,3,90},{2,2,455},{2,2,367},{2,3,253},{2,3,253},{2,2,295}, +{2,2,210},{1,3,244},{2,2,282},{2,3,225},{2,3,81},{2,2,446},{2,2,358},{2,3,244},{2,3,244},{2,2,286},{2,2,201},{6,0,244},{2,2,201},{2,3,90},{2,3,90},{2,3,90},{2,2,171},{2,3,109},{2,2,99},{2,2,99},{2,2,14},{1,3,100},{2,2,86},{2,3,81},{2,3,81},{2,3,81},{2,2,162},{3,1,50},{2,2,90},{2,2,90},{2,2,5},{4,1,50}, +{2,2,5},{4,0,80},{2,3,0},{3,2,260},{3,2,212},{4,0,80},{5,1,80},{3,2,212},{0,2,200},{5,1,80},{0,2,200},{2,0,90},{2,0,90},{2,0,90},{2,0,90},{2,2,18},{2,2,18},{2,2,18},{2,2,10},{2,2,82},{2,2,82},{2,4,394},{2,3,442},{2,3,522},{2,3,474},{2,4,301},{2,3,109},{2,3,189},{2,2,658},{2,3,472},{2,2,634},{2,4,369}, +{2,3,417},{2,3,497},{2,3,449},{3,2,244},{2,3,84},{2,3,164},{3,2,620},{5,1,244},{3,2,620},{2,4,330},{2,4,330},{2,4,330},{2,3,330},{2,3,93},{2,3,45},{2,3,45},{2,2,174},{1,3,132},{2,2,150},{3,2,289},{3,2,289},{3,2,289},{3,2,305},{4,0,52},{2,3,20},{2,3,20},{3,2,136},{3,2,52},{3,2,136},{2,4,80},{2,3,128},{2,3,208}, +{2,3,160},{2,4,80},{7,0,80},{2,3,160},{0,2,584},{7,0,80},{0,2,584},{2,0,314},{2,0,314},{2,0,314},{2,0,314},{2,3,29},{2,3,29},{2,3,29},{2,2,74},{2,2,50},{2,2,50},{3,3,544},{3,3,496},{3,3,489},{3,3,537},{2,4,535},{2,4,535},{2,3,279},{2,3,455},{1,4,292},{2,3,284},{3,3,144},{3,3,96},{3,3,89},{3,3,137},{4,1,244}, +{3,3,276},{2,3,83},{2,3,259},{4,2,244},{2,3,259},{3,3,480},{3,3,480},{3,3,480},{3,3,528},{2,4,246},{2,3,270},{2,3,270},{2,3,446},{2,3,75},{2,3,275},{3,3,80},{3,3,80},{3,3,80},{3,3,128},{2,4,50},{2,3,74},{2,3,74},{2,3,250},{7,0,50},{2,3,250},{5,0,80},{3,3,32},{3,3,25},{2,3,34},{5,0,80},{6,1,80},{2,3,34}, +{0,3,234},{6,1,80},{0,3,234},{3,0,464},{3,0,464},{3,0,464},{3,0,464},{2,4,221},{2,4,221},{2,4,221},{2,3,221},{2,3,50},{2,3,50},{3,4,234},{3,3,304},{3,3,185},{3,3,169},{3,3,452},{3,3,324},{3,3,205},{3,3,318},{1,4,452},{2,3,92},{3,4,90},{3,3,160},{3,3,41},{3,3,25},{5,0,244},{2,4,99},{3,3,61},{2,3,83},{3,3,244}, +{2,3,83},{3,3,160},{3,3,160},{3,3,160},{3,3,144},{3,3,196},{3,3,180},{3,3,180},{3,3,293},{2,3,187},{2,3,67},{3,3,16},{3,3,16},{3,3,16},{3,3,0},{3,3,52},{3,3,36},{3,3,36},{2,3,58},{6,1,52},{2,3,58},{4,2,80},{3,3,160},{3,3,41},{3,3,25},{4,2,80},{5,2,80},{3,3,25},{0,3,74},{5,2,80},{0,3,74},{3,0,144}, +{3,0,144},{3,0,144},{3,0,144},{3,3,180},{3,3,180},{3,3,180},{3,3,244},{2,3,18},{2,3,18},{3,4,202},{3,4,82},{3,3,393},{3,3,313},{3,4,259},{3,4,307},{3,3,253},{3,3,190},{2,4,244},{3,3,274},{3,4,186},{3,4,66},{3,3,377},{3,3,297},{3,4,243},{2,4,243},{3,3,237},{3,3,174},{7,1,243},{3,3,174},{3,4,81},{3,4,81},{3,4,81}, +{3,3,144},{3,4,138},{3,3,84},{3,3,84},{3,3,21},{2,4,123},{3,3,105},{3,4,65},{3,4,65},{3,4,65},{3,3,128},{4,2,52},{3,3,68},{3,3,68},{3,3,5},{5,2,52},{3,3,5},{5,1,74},{3,4,2},{4,3,250},{4,3,194},{5,1,74},{4,3,74},{4,3,194},{0,3,170},{4,3,74},{0,3,170},{3,0,80},{3,0,80},{3,0,80},{3,0,80},{3,3,20}, +{3,3,20},{3,3,20},{3,3,20},{3,3,104},{3,3,104},{3,5,346},{3,4,370},{3,4,490},{3,4,466},{3,5,315},{3,4,99},{3,4,219},{3,3,574},{2,4,468},{3,3,562},{3,5,330},{3,4,354},{3,4,474},{3,4,450},{4,3,243},{3,4,83},{3,4,203},{3,3,558},{6,2,243},{3,3,558},{3,5,297},{3,5,297},{3,5,297},{3,4,297},{3,4,74},{3,4,50},{3,4,50}, +{3,3,133},{2,4,107},{3,3,121},{3,5,281},{3,5,281},{3,5,281},{3,4,281},{5,1,58},{3,4,34},{3,4,34},{3,3,117},{7,1,58},{3,3,117},{6,0,74},{3,4,98},{3,4,218},{3,4,194},{6,0,74},{3,4,74},{3,4,194},{0,3,522},{3,4,74},{0,3,522},{3,0,272},{3,0,272},{3,0,272},{3,0,272},{3,4,25},{3,4,25},{3,4,25},{3,3,52},{3,3,40}, +{3,3,40},{4,4,596},{4,4,556},{4,4,563},{4,4,619},{3,5,477},{3,4,477},{3,4,237},{3,4,477},{2,5,308},{3,4,344},{4,4,155},{4,4,115},{4,4,122},{4,4,178},{5,2,243},{2,5,299},{3,4,68},{2,4,308},{5,3,243},{2,4,308},{4,4,547},{4,4,547},{4,4,547},{4,4,603},{3,5,221},{3,4,221},{3,4,221},{3,4,461},{3,4,88},{3,4,328},{4,4,106}, +{4,4,106},{4,4,106},{4,4,162},{6,0,52},{3,4,52},{3,4,52},{2,4,292},{3,4,52},{2,4,292},{4,4,74},{4,4,34},{4,4,41},{3,4,32},{4,4,74},{7,2,74},{3,4,32},{0,4,272},{7,2,74},{0,4,272},{4,0,522},{4,0,522},{4,0,522},{4,0,522},{3,4,205},{3,4,205},{3,4,205},{3,4,205},{3,4,72},{3,4,72},{4,5,274},{4,4,300},{4,4,195}, +{4,4,187},{4,4,452},{4,4,340},{4,4,235},{4,4,370},{2,5,404},{3,4,88},{4,5,105},{4,4,131},{4,4,26},{4,4,18},{6,1,243},{3,5,108},{4,4,66},{3,4,84},{4,4,243},{3,4,84},{4,4,179},{4,4,179},{4,4,179},{4,4,171},{4,4,227},{4,4,219},{4,4,219},{4,4,354},{3,4,152},{3,4,72},{4,4,10},{4,4,10},{4,4,10},{4,4,2},{5,2,58}, +{4,4,50},{4,4,50},{3,4,68},{7,2,58},{3,4,68},{5,3,74},{4,4,130},{4,4,25},{4,4,17},{5,3,74},{6,3,74},{4,4,17},{0,4,80},{6,3,74},{0,4,80},{4,0,170},{4,0,170},{4,0,170},{4,0,170},{4,3,205},{4,3,205},{4,3,205},{4,3,269},{3,4,8},{3,4,8},{4,5,178},{4,5,82},{4,4,339},{4,4,267},{4,5,273},{4,5,369},{4,4,219}, +{4,4,178},{3,5,252},{4,4,274},{4,5,153},{4,5,57},{4,4,314},{4,4,242},{7,0,248},{3,5,204},{4,4,194},{4,4,153},{3,5,248},{4,4,153},{4,5,78},{4,5,78},{4,5,78},{4,4,123},{4,4,147},{4,4,75},{4,4,75},{4,4,34},{3,5,152},{4,4,130},{4,5,53},{4,5,53},{4,5,53},{4,4,98},{6,1,58},{4,4,50},{4,4,50},{4,4,9},{6,3,58}, +{4,4,9},{6,2,72},{4,5,8},{5,4,244},{5,4,180},{6,2,72},{5,4,72},{5,4,180},{0,4,144},{5,4,72},{0,4,144},{4,0,74},{4,0,74},{4,0,74},{4,0,74},{4,4,26},{4,4,26},{4,4,26},{4,4,34},{4,4,130},{4,4,130},{4,6,306},{4,5,306},{4,5,466},{4,5,466},{4,6,337},{4,5,97},{4,5,257},{4,4,498},{3,5,412},{4,4,498},{4,6,297}, +{4,5,297},{4,5,457},{4,5,457},{5,4,248},{4,5,88},{4,5,248},{4,4,489},{7,3,248},{4,4,489},{4,5,270},{4,5,270},{4,5,270},{4,5,270},{4,5,61},{4,5,61},{4,5,61},{4,4,98},{3,5,88},{4,4,98},{4,5,261},{4,5,261},{4,5,261},{4,5,261},{7,0,52},{4,5,52},{4,5,52},{4,4,89},{3,5,52},{4,4,89},{7,1,72},{4,5,72},{4,5,232}, +{3,5,232},{7,1,72},{4,5,72},{3,5,232},{0,4,464},{4,5,72},{0,4,464},{4,0,234},{4,0,234},{4,0,234},{4,0,234},{4,5,25},{4,5,25},{4,5,25},{4,4,34},{4,4,34},{4,4,34},{5,5,656},{5,5,624},{5,5,645},{5,5,709},{4,6,427},{4,5,403},{4,5,203},{4,5,507},{4,5,332},{4,5,412},{5,5,172},{5,5,140},{5,5,161},{5,5,225},{6,3,248}, +{4,5,259},{4,5,59},{3,5,339},{6,4,248},{3,5,339},{5,5,620},{5,5,620},{5,5,620},{5,5,684},{4,6,202},{4,5,178},{4,5,178},{4,5,482},{4,5,107},{4,5,387},{5,5,136},{5,5,136},{5,5,136},{5,5,200},{7,1,58},{4,5,34},{4,5,34},{5,4,290},{7,3,58},{5,4,290},{5,5,72},{5,5,40},{5,5,61},{4,5,34},{5,5,72},{3,6,72},{4,5,34}, +{0,5,314},{3,6,72},{0,5,314},{5,0,584},{5,0,584},{5,0,584},{5,0,584},{4,5,169},{4,5,169},{4,5,169},{4,5,193},{4,5,98},{4,5,98},{5,6,322},{5,5,304},{5,5,213},{5,5,213},{5,5,460},{5,5,364},{5,5,273},{5,5,430},{3,6,364},{4,5,92},{5,6,126},{5,5,108},{5,5,17},{5,5,17},{7,2,248},{4,6,123},{5,5,77},{4,5,91},{5,5,248}, +{4,5,91},{5,5,204},{5,5,204},{5,5,204},{5,5,204},{5,5,264},{5,5,264},{5,5,264},{5,5,421},{4,5,123},{4,5,83},{5,5,8},{5,5,8},{5,5,8},{5,5,8},{6,3,52},{5,5,68},{5,5,68},{4,5,82},{6,4,52},{4,5,82},{6,4,72},{5,5,104},{5,5,13},{5,5,13},{6,4,72},{7,4,72},{5,5,13},{0,5,90},{7,4,72},{0,5,90},{5,0,200}, +{5,0,200},{5,0,200},{5,0,200},{5,4,221},{5,4,221},{5,4,221},{5,4,277},{4,5,2},{4,5,2},{5,6,162},{5,6,90},{5,5,293},{5,5,229},{5,6,295},{5,5,396},{5,5,193},{5,5,174},{4,6,268},{5,5,282},{5,6,126},{5,6,54},{5,5,257},{5,5,193},{5,6,259},{4,6,171},{5,5,157},{5,5,138},{4,6,259},{5,5,138},{5,6,81},{5,6,81},{5,6,81}, +{5,5,108},{5,5,136},{5,5,72},{5,5,72},{5,5,53},{4,6,187},{5,5,161},{5,6,45},{5,6,45},{5,6,45},{5,5,72},{7,2,52},{5,5,36},{5,5,36},{5,5,17},{5,5,52},{5,5,17},{7,3,74},{5,6,18},{5,5,221},{5,5,157},{7,3,74},{6,5,74},{5,5,157},{0,5,122},{6,5,74},{0,5,122},{5,0,72},{5,0,72},{5,0,72},{5,0,72},{5,5,36}, +{5,5,36},{5,5,36},{5,5,52},{5,5,160},{5,5,160},{5,7,274},{5,6,250},{5,6,450},{5,6,474},{5,6,343},{5,6,103},{5,6,303},{5,5,430},{4,6,364},{5,5,442},{5,7,270},{5,6,246},{5,6,446},{5,6,470},{7,3,251},{5,6,99},{5,6,299},{5,5,426},{6,5,251},{5,5,426},{5,6,225},{5,6,225},{5,6,225},{5,6,249},{5,6,54},{5,6,78},{5,6,78}, +{5,5,69},{4,6,75},{5,5,81},{5,6,221},{5,6,221},{5,6,221},{5,6,245},{5,6,50},{5,6,74},{5,6,74},{5,5,65},{4,6,50},{5,5,65},{5,7,74},{5,6,50},{5,6,250},{4,6,250},{5,7,74},{5,6,74},{4,6,250},{0,5,410},{5,6,74},{0,5,410},{5,0,200},{5,0,200},{5,0,200},{5,0,200},{5,6,29},{5,6,29},{5,6,29},{5,5,20},{5,5,32}, +{5,5,32},{6,6,724},{6,6,700},{6,6,735},{5,6,690},{5,7,385},{5,6,337},{5,6,177},{5,6,545},{5,6,328},{5,6,488},{6,6,195},{6,6,171},{6,6,206},{6,6,278},{7,4,259},{5,6,216},{5,6,56},{4,6,376},{7,5,259},{4,6,376},{5,7,654},{5,7,654},{5,7,654},{5,6,654},{5,7,189},{5,6,141},{5,6,141},{5,6,509},{5,6,132},{5,5,450},{6,5,157}, +{6,5,157},{6,5,157},{6,5,221},{6,5,52},{5,6,20},{5,6,20},{6,5,256},{3,7,52},{6,5,256},{6,6,74},{6,6,50},{6,6,85},{5,6,40},{6,6,74},{4,7,74},{5,6,40},{0,6,360},{4,7,74},{0,6,360},{5,0,650},{5,0,650},{5,0,650},{5,0,650},{5,6,137},{5,6,137},{5,6,137},{5,6,185},{5,6,128},{5,6,128},{6,7,378},{6,6,316},{6,6,239}, +{6,6,247},{6,6,476},{6,6,396},{6,6,319},{5,6,465},{4,7,332},{5,6,104},{6,7,153},{6,6,91},{6,6,14},{6,6,22},{6,6,251},{5,7,144},{6,6,94},{5,6,104},{4,7,251},{5,6,104},{6,6,235},{6,6,235},{6,6,235},{6,6,243},{6,6,307},{6,6,315},{6,6,315},{5,6,461},{5,6,100},{5,6,100},{6,6,10},{6,6,10},{6,6,10},{6,6,18},{7,4,50}, +{6,6,90},{6,6,90},{5,6,100},{7,5,50},{5,6,100},{7,5,74},{6,6,82},{6,6,5},{6,6,13},{7,5,74},{6,6,90},{6,6,13},{0,6,104},{6,6,90},{0,6,104},{6,0,234},{6,0,234},{6,0,234},{6,0,234},{6,5,241},{6,5,241},{6,5,241},{6,5,289},{5,6,0},{5,6,0},{6,7,154},{6,7,106},{6,6,255},{6,6,199},{6,7,325},{6,6,364},{6,6,175}, +{6,6,178},{5,7,292},{5,6,232},{6,7,105},{6,7,57},{6,6,206},{6,6,150},{7,5,251},{5,7,144},{6,6,126},{6,6,129},{5,7,276},{6,6,129},{6,7,90},{6,7,90},{6,7,90},{6,6,99},{6,6,131},{6,6,75},{6,6,75},{6,6,78},{6,6,219},{5,6,132},{6,7,41},{6,7,41},{6,7,41},{6,6,50},{7,5,82},{6,6,26},{6,6,26},{6,6,29},{6,6,50}, +{6,6,29},{6,7,80},{6,7,32},{6,6,181},{6,6,125},{6,7,80},{7,6,80},{6,6,125},{0,6,104},{7,6,80},{0,6,104},{6,0,74},{6,0,74},{6,0,74},{6,0,74},{6,6,50},{6,6,50},{6,6,50},{6,6,74},{5,6,128},{5,6,128},{6,7,442},{6,7,202},{6,7,442},{6,7,490},{6,7,309},{6,7,117},{6,7,357},{6,6,370},{5,7,324},{6,6,394},{6,7,441}, +{6,7,201},{6,7,441},{6,7,489},{7,6,276},{6,7,116},{6,7,356},{6,6,369},{7,6,244},{6,6,369},{6,7,186},{6,7,186},{6,7,186},{6,7,234},{6,7,53},{6,7,101},{6,7,101},{6,6,46},{5,7,68},{6,6,70},{6,7,185},{6,7,185},{6,7,185},{6,7,233},{6,7,52},{6,7,100},{6,7,100},{6,6,45},{5,7,52},{6,6,45},{7,6,80},{6,7,32},{6,7,272}, +{5,7,272},{7,6,80},{6,7,80},{5,7,272},{0,6,360},{6,7,80},{0,6,360},{6,0,170},{6,0,170},{6,0,170},{6,0,170},{6,7,37},{6,7,37},{6,7,37},{6,6,10},{6,6,34},{6,6,34},{7,7,800},{7,7,784},{6,7,802},{6,7,634},{6,7,903},{6,7,279},{6,7,159},{6,7,591},{6,7,332},{6,7,572},{7,7,224},{7,7,208},{7,7,257},{7,7,337},{7,6,339}, +{6,7,179},{6,7,59},{5,7,419},{6,7,251},{5,7,419},{7,6,745},{7,6,745},{7,6,745},{6,7,585},{6,7,278},{6,7,110},{6,7,110},{6,6,469},{6,7,163},{6,6,385},{7,6,169},{7,6,169},{7,6,169},{7,6,225},{7,6,50},{6,7,10},{6,7,10},{7,6,226},{7,6,82},{7,6,226},{7,7,80},{7,7,64},{7,7,113},{6,7,50},{7,7,80},{7,7,144},{6,7,50}, +{0,7,410},{7,7,144},{0,7,410},{6,0,584},{6,0,584},{6,0,584},{6,0,584},{6,7,109},{6,7,109},{6,7,109},{6,7,181},{6,6,160},{6,6,160},{7,7,393},{7,7,321},{7,7,272},{7,7,288},{7,7,477},{7,7,421},{7,7,372},{6,7,446},{6,7,483},{6,7,123},{7,7,137},{7,7,65},{7,7,16},{7,7,32},{7,7,221},{7,7,165},{7,7,116},{6,7,122},{7,7,261}, +{6,7,122},{7,7,272},{7,7,272},{7,7,272},{7,7,288},{7,7,356},{7,7,372},{7,7,372},{6,7,446},{6,7,83},{6,7,123},{7,7,16},{7,7,16},{7,7,16},{7,7,32},{7,7,100},{7,7,116},{7,7,116},{6,7,122},{6,7,82},{6,7,122},{7,7,121},{7,7,49},{7,7,0},{7,7,16},{7,7,121},{7,7,65},{7,7,16},{0,7,121},{7,7,65},{0,7,121},{7,0,272}, +{7,0,272},{7,0,272},{7,0,272},{7,6,265},{7,6,265},{7,6,265},{7,6,305},{6,7,2},{6,7,2},{7,7,265},{7,7,193},{7,7,144},{7,7,96},{7,7,253},{7,7,133},{7,7,84},{7,7,109},{7,7,297},{6,7,107},{7,7,201},{7,7,129},{7,7,80},{7,7,32},{7,7,189},{7,7,69},{7,7,20},{7,7,45},{7,7,101},{7,7,45},{7,7,144},{7,7,144},{7,7,144}, +{7,7,96},{7,7,132},{7,7,84},{7,7,84},{7,7,109},{7,7,248},{6,7,107},{7,7,80},{7,7,80},{7,7,80},{7,7,32},{7,7,68},{7,7,20},{7,7,20},{7,7,45},{7,7,52},{7,7,45},{7,7,185},{7,7,113},{7,7,64},{7,7,16},{7,7,185},{7,7,65},{7,7,16},{0,7,9},{7,7,65},{0,7,9},{7,0,80},{7,0,80},{7,0,80},{7,0,80},{7,7,68}, +{7,7,68},{7,7,68},{7,7,100},{6,7,98},{6,7,98},{7,7,386},{7,7,314},{7,7,265},{7,7,193},{7,7,278},{7,7,134},{7,7,85},{7,7,4},{7,7,138},{7,7,40},{7,7,386},{7,7,314},{7,7,265},{7,7,193},{7,7,278},{7,7,134},{7,7,85},{7,7,4},{7,7,102},{7,7,4},{7,7,265},{7,7,265},{7,7,265},{7,7,193},{7,7,157},{7,7,85},{7,7,85}, +{7,7,4},{7,7,89},{7,7,40},{7,7,265},{7,7,265},{7,7,265},{7,7,193},{7,7,157},{7,7,85},{7,7,85},{7,7,4},{7,7,53},{7,7,4},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{7,0,144},{7,0,144},{7,0,144},{7,0,144},{7,7,36},{7,7,36},{7,7,36},{7,7,4},{7,7,40}, +{7,7,40},{0,1,200},{0,1,104},{0,0,153},{0,0,145},{0,1,561},{0,0,398},{0,0,181},{0,0,308},{0,0,498},{0,0,344},{0,1,200},{0,1,104},{0,0,153},{0,0,145},{0,1,561},{0,0,398},{0,0,181},{0,0,308},{0,0,462},{0,0,308},{0,0,9},{0,0,9},{0,0,9},{0,0,1},{0,0,45},{0,0,37},{0,0,37},{0,0,164},{0,0,137},{0,0,200},{0,0,9}, +{0,0,9},{0,0,9},{0,0,1},{0,0,45},{0,0,37},{0,0,37},{0,0,164},{0,0,101},{0,0,164},{0,1,200},{0,1,104},{0,0,153},{0,0,145},{0,1,200},{1,0,232},{0,0,145},{0,0,208},{1,0,232},{0,0,208},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,2,232},{0,1,40},{0,1,200}, +{0,1,392},{0,1,689},{0,1,593},{0,0,485},{0,0,500},{0,0,914},{0,0,536},{0,2,232},{0,1,40},{0,1,200},{0,1,392},{0,1,689},{0,1,593},{0,0,485},{0,0,500},{1,0,761},{0,0,500},{0,1,4},{0,1,4},{0,1,4},{0,0,49},{0,0,157},{0,0,85},{0,0,85},{0,0,100},{0,0,185},{0,0,136},{0,1,4},{0,1,4},{0,1,4},{0,0,49},{0,0,157}, +{0,0,85},{0,0,85},{0,0,100},{0,0,149},{0,0,100},{1,0,200},{0,1,40},{0,1,200},{0,1,392},{1,0,200},{1,0,232},{0,1,392},{0,0,400},{1,0,232},{0,0,400},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,2,281},{0,2,149},{0,1,121},{0,1,121},{0,2,808},{0,1,376},{0,1,216}, +{0,0,857},{0,1,1169},{0,0,893},{0,2,281},{0,2,149},{0,1,121},{0,1,121},{1,0,728},{0,1,376},{0,1,216},{0,0,857},{1,0,744},{0,0,857},{0,1,85},{0,1,85},{0,1,85},{0,1,85},{0,1,180},{0,1,180},{0,1,180},{0,0,73},{0,0,270},{0,0,109},{0,1,85},{0,1,85},{0,1,85},{0,1,85},{0,1,180},{0,1,180},{0,1,180},{0,0,73},{0,0,234}, +{0,0,73},{0,2,232},{0,2,100},{0,1,72},{0,1,72},{0,2,232},{2,0,202},{0,1,72},{0,1,712},{2,0,202},{0,1,712},{0,0,49},{0,0,49},{0,0,49},{0,0,49},{0,0,1},{0,0,1},{0,0,1},{0,0,9},{0,0,45},{0,0,45},{0,3,427},{0,2,229},{0,1,425},{0,1,233},{0,2,744},{0,1,504},{0,1,24},{0,1,584},{0,1,1105},{0,1,945},{0,3,427}, +{0,2,229},{1,1,414},{0,1,233},{0,2,744},{0,1,504},{0,1,24},{0,1,584},{2,0,739},{0,1,584},{0,2,229},{0,2,229},{0,2,229},{0,1,229},{0,1,212},{0,1,20},{0,1,20},{0,0,281},{0,0,590},{0,0,317},{0,2,229},{0,2,229},{0,2,229},{0,1,229},{1,0,180},{0,1,20},{0,1,20},{0,0,281},{1,0,164},{0,0,281},{0,3,202},{0,2,4},{1,1,53}, +{0,1,8},{0,3,202},{1,1,202},{0,1,8},{0,1,328},{1,1,202},{0,1,328},{0,0,225},{0,0,225},{0,0,225},{0,0,225},{0,1,16},{0,1,16},{0,1,16},{0,0,25},{0,0,61},{0,0,61},{0,4,842},{0,3,740},{1,1,1125},{0,1,834},{0,3,744},{0,2,267},{0,1,283},{0,1,267},{0,1,1356},{0,1,476},{1,2,302},{1,2,230},{1,1,225},{1,1,225},{0,3,728}, +{0,2,251},{0,1,267},{0,1,251},{1,1,728},{0,1,251},{0,3,596},{0,3,596},{0,3,596},{0,1,713},{0,2,186},{0,1,162},{0,1,162},{0,1,146},{0,1,395},{0,1,355},{1,1,104},{1,1,104},{1,1,104},{1,1,104},{0,2,170},{0,1,146},{0,1,146},{0,1,130},{0,1,170},{0,1,130},{1,2,202},{1,2,130},{1,1,125},{1,1,125},{1,2,202},{0,2,202},{1,1,125}, +{0,1,202},{0,2,202},{0,1,202},{0,0,592},{0,0,592},{0,0,592},{0,0,592},{0,1,41},{0,1,41},{0,1,41},{0,1,65},{0,0,200},{0,0,200},{1,3,738},{1,2,522},{1,2,722},{1,1,885},{0,4,987},{0,2,443},{0,2,379},{0,1,507},{0,2,1100},{0,1,412},{1,3,254},{1,2,38},{1,2,238},{1,1,401},{1,2,739},{0,2,299},{0,2,235},{0,1,363},{0,2,739}, +{0,1,363},{1,2,497},{1,2,497},{1,2,497},{1,1,524},{0,3,324},{0,2,154},{0,2,154},{0,1,146},{0,1,411},{0,1,51},{1,2,13},{1,2,13},{1,2,13},{1,1,40},{1,1,164},{0,2,10},{0,2,10},{0,1,2},{1,1,180},{0,1,2},{2,1,202},{1,2,34},{1,2,234},{0,2,234},{2,1,202},{4,0,202},{0,2,234},{0,1,362},{4,0,202},{0,1,362},{1,0,488}, +{1,0,488},{1,0,488},{1,0,488},{0,2,145},{0,2,145},{0,2,145},{0,1,145},{0,1,50},{0,1,50},{1,3,450},{1,3,362},{1,2,306},{1,2,330},{1,2,1015},{1,2,583},{1,2,463},{1,1,990},{0,2,940},{0,1,860},{1,3,254},{1,3,166},{1,2,110},{1,2,134},{0,4,731},{0,3,288},{0,2,155},{1,1,794},{2,1,731},{1,1,794},{1,2,257},{1,2,257},{1,2,257}, +{1,2,281},{1,2,390},{1,1,392},{1,1,392},{1,1,261},{0,2,315},{0,1,131},{1,2,61},{1,2,61},{1,2,61},{1,2,85},{2,0,164},{0,2,106},{0,2,106},{1,1,65},{3,0,164},{1,1,65},{3,0,208},{1,3,130},{1,2,74},{0,2,74},{3,0,208},{3,1,208},{0,2,74},{0,1,778},{3,1,208},{0,1,778},{1,0,232},{1,0,232},{1,0,232},{1,0,232},{1,1,196}, +{1,1,196},{1,1,196},{1,1,212},{0,1,82},{0,1,82},{1,4,440},{1,3,234},{1,2,402},{1,2,234},{1,3,767},{1,2,503},{1,2,63},{1,2,687},{0,3,1140},{0,2,396},{1,4,404},{1,3,198},{1,2,366},{1,2,198},{1,3,731},{0,3,224},{1,2,27},{0,2,387},{1,2,731},{0,2,387},{1,3,233},{1,3,233},{1,3,233},{1,2,233},{1,2,230},{1,2,62},{1,2,62}, +{1,1,277},{0,2,203},{1,1,385},{1,3,197},{1,3,197},{1,3,197},{1,2,197},{0,4,162},{1,2,26},{1,2,26},{1,1,241},{2,1,162},{1,1,241},{2,2,208},{1,3,2},{2,2,65},{1,2,2},{2,2,208},{5,0,208},{1,2,2},{0,2,362},{5,0,208},{0,2,362},{1,0,232},{1,0,232},{1,0,232},{1,0,232},{1,2,61},{1,2,61},{1,2,61},{1,1,52},{0,2,34}, +{0,2,34},{1,5,810},{1,3,702},{1,2,1122},{1,2,738},{1,4,748},{1,3,281},{1,2,225},{1,2,273},{0,3,780},{0,2,252},{2,3,329},{2,3,281},{2,2,222},{2,2,230},{2,2,731},{1,3,272},{1,2,216},{0,2,216},{5,0,731},{0,2,216},{1,4,547},{1,4,547},{1,4,547},{1,2,638},{1,3,173},{1,2,125},{1,2,125},{1,2,173},{0,3,339},{0,2,152},{2,2,122}, +{2,2,122},{2,2,122},{2,2,130},{1,3,164},{1,2,116},{1,2,116},{0,2,116},{1,2,164},{0,2,116},{2,3,208},{2,3,160},{2,2,101},{2,2,109},{2,3,208},{6,0,208},{2,2,109},{0,2,200},{6,0,208},{0,2,200},{1,0,538},{1,0,538},{1,0,538},{1,0,538},{1,2,25},{1,2,25},{1,2,25},{1,2,73},{0,2,52},{0,2,52},{2,3,810},{2,3,570},{2,3,810}, +{2,2,887},{1,4,940},{1,3,393},{1,3,393},{1,2,449},{0,3,1004},{1,2,392},{2,3,281},{2,3,41},{2,3,281},{2,2,358},{3,1,731},{1,3,272},{1,3,272},{1,2,328},{4,1,731},{1,2,328},{2,3,554},{2,3,554},{2,3,554},{2,2,563},{1,4,315},{1,3,137},{1,3,137},{1,2,125},{0,3,163},{1,2,68},{2,3,25},{2,3,25},{2,3,25},{2,2,34},{2,2,162}, +{1,3,16},{1,3,16},{1,2,4},{5,0,162},{1,2,4},{4,0,208},{2,3,32},{2,3,272},{1,3,272},{4,0,208},{5,1,208},{1,3,272},{0,2,328},{5,1,208},{0,2,328},{2,0,538},{2,0,538},{2,0,538},{2,0,538},{1,3,121},{1,3,121},{1,3,121},{1,2,121},{1,2,64},{1,2,64},{2,4,458},{2,3,410},{2,3,330},{2,3,378},{2,3,1013},{2,3,629},{1,3,505}, +{2,2,962},{0,4,772},{1,2,776},{2,4,233},{2,3,185},{2,3,105},{2,3,153},{4,0,724},{1,4,323},{1,3,144},{2,2,737},{3,2,724},{2,2,737},{2,3,266},{2,3,266},{2,3,266},{2,3,314},{2,3,437},{2,2,395},{2,2,395},{2,2,286},{1,3,356},{1,2,100},{2,3,41},{2,3,41},{2,3,41},{2,3,89},{3,1,162},{1,3,80},{1,3,80},{2,2,61},{4,1,162}, +{2,2,61},{2,4,208},{2,3,160},{2,3,80},{1,3,80},{2,4,208},{7,0,208},{1,3,80},{0,2,712},{7,0,208},{0,2,712},{2,0,250},{2,0,250},{2,0,250},{2,0,250},{2,2,226},{2,2,226},{2,2,226},{2,2,250},{1,2,64},{1,2,64},{2,5,436},{2,4,222},{2,3,362},{2,3,218},{2,4,773},{2,3,485},{2,3,85},{2,3,773},{0,4,804},{1,3,452},{2,5,387}, +{2,4,173},{2,3,313},{2,3,169},{2,4,724},{1,4,211},{2,3,36},{1,3,436},{7,0,724},{1,3,436},{2,4,218},{2,4,218},{2,4,218},{2,3,218},{2,3,229},{2,3,85},{2,3,85},{2,2,254},{1,3,196},{2,2,374},{2,4,169},{2,4,169},{2,4,169},{2,3,169},{4,0,164},{2,3,36},{2,3,36},{2,2,205},{3,2,164},{2,2,205},{3,3,202},{2,4,4},{3,3,81}, +{2,3,0},{3,3,202},{6,1,202},{2,3,0},{0,3,400},{6,1,202},{0,3,400},{2,0,218},{2,0,218},{2,0,218},{2,0,218},{2,3,85},{2,3,85},{2,3,85},{2,2,58},{1,3,52},{1,3,52},{2,5,760},{2,4,618},{2,3,1010},{2,3,650},{2,5,760},{2,4,303},{2,3,175},{2,3,287},{1,4,788},{1,3,236},{3,4,362},{3,4,338},{3,3,225},{3,3,241},{3,3,724}, +{2,4,299},{2,3,171},{1,3,211},{6,1,724},{1,3,211},{2,5,504},{2,5,504},{2,5,504},{2,3,569},{2,4,166},{2,3,94},{2,3,94},{2,3,206},{0,4,363},{1,3,155},{3,3,144},{3,3,144},{3,3,144},{3,3,160},{2,4,162},{2,3,90},{2,3,90},{1,3,130},{7,0,162},{1,3,130},{4,2,208},{2,4,130},{3,3,81},{3,3,97},{4,2,208},{5,2,208},{3,3,97}, +{0,3,202},{5,2,208},{0,3,202},{2,0,488},{2,0,488},{2,0,488},{2,0,488},{2,3,13},{2,3,13},{2,3,13},{2,3,85},{1,3,34},{1,3,34},{3,4,842},{3,4,626},{3,4,906},{3,3,897},{2,5,888},{2,4,351},{2,4,415},{2,3,399},{0,5,788},{2,3,380},{3,4,266},{3,4,50},{3,4,330},{3,3,321},{4,2,724},{2,4,251},{2,4,315},{2,3,299},{5,2,724}, +{2,3,299},{3,4,617},{3,4,617},{3,4,617},{3,3,608},{2,5,312},{2,4,126},{2,4,126},{2,3,110},{1,4,164},{2,3,91},{3,4,41},{3,4,41},{3,4,41},{3,3,32},{3,3,164},{2,4,26},{2,4,26},{2,3,10},{6,1,164},{2,3,10},{5,1,202},{3,4,34},{3,4,314},{3,3,305},{5,1,202},{4,3,202},{3,3,305},{0,3,298},{4,3,202},{0,3,298},{3,0,592}, +{3,0,592},{3,0,592},{3,0,592},{2,4,101},{2,4,101},{2,4,101},{2,3,101},{2,3,82},{2,3,82},{3,5,474},{3,4,402},{3,4,362},{3,4,434},{3,4,1019},{3,4,683},{2,4,463},{3,3,942},{1,5,804},{2,3,700},{3,5,218},{3,4,146},{3,4,106},{3,4,178},{5,1,723},{2,5,364},{2,4,139},{3,3,686},{4,3,723},{3,3,686},{3,4,281},{3,4,281},{3,4,281}, +{3,4,353},{3,4,490},{2,4,382},{2,4,382},{3,3,317},{1,4,324},{2,3,75},{3,4,25},{3,4,25},{3,4,25},{3,4,97},{4,2,164},{2,4,58},{2,4,58},{3,3,61},{5,2,164},{3,3,61},{6,0,202},{3,4,130},{3,4,90},{2,4,90},{6,0,202},{3,4,202},{2,4,90},{0,3,650},{3,4,202},{0,3,650},{3,0,272},{3,0,272},{3,0,272},{3,0,272},{3,3,260}, +{3,3,260},{3,3,260},{3,3,292},{2,3,50},{2,3,50},{3,6,440},{3,5,218},{3,4,330},{3,4,210},{3,5,787},{3,4,475},{3,4,115},{3,4,867},{1,5,772},{2,4,516},{3,6,376},{3,5,154},{3,4,266},{3,4,146},{6,0,723},{2,5,204},{3,4,51},{1,4,478},{3,4,723},{1,4,478},{3,5,209},{3,5,209},{3,5,209},{3,4,209},{3,4,234},{3,4,114},{3,4,114}, +{3,3,237},{2,4,195},{3,3,369},{3,5,145},{3,5,145},{3,5,145},{3,4,145},{5,1,170},{3,4,50},{3,4,50},{3,3,173},{7,1,170},{3,3,173},{4,4,200},{3,5,10},{4,4,101},{3,4,2},{4,4,200},{7,2,200},{3,4,2},{0,4,442},{7,2,200},{0,4,442},{3,0,208},{3,0,208},{3,0,208},{3,0,208},{3,3,100},{3,3,100},{3,3,100},{3,3,68},{2,4,74}, +{2,4,74},{3,6,692},{3,5,542},{3,4,906},{3,4,570},{3,6,780},{3,5,333},{3,4,133},{3,4,309},{2,5,804},{2,4,228},{4,5,401},{4,4,395},{4,4,234},{4,4,258},{4,4,723},{3,5,332},{3,4,132},{2,4,212},{7,2,723},{2,4,212},{3,6,467},{3,6,467},{3,6,467},{3,4,506},{3,5,165},{3,4,69},{3,4,69},{3,4,245},{1,5,324},{2,4,164},{4,4,170}, +{4,4,170},{4,4,170},{4,4,194},{6,0,164},{3,4,68},{3,4,68},{2,4,148},{3,4,164},{2,4,148},{5,3,202},{3,5,100},{4,4,65},{4,4,89},{5,3,202},{6,3,202},{4,4,89},{0,4,208},{6,3,202},{0,4,208},{3,0,442},{3,0,442},{3,0,442},{3,0,442},{3,4,5},{3,4,5},{3,4,5},{3,4,101},{2,4,20},{2,4,20},{4,5,882},{4,5,690},{4,4,955}, +{4,4,915},{3,6,844},{3,5,317},{3,5,445},{3,4,357},{1,6,772},{3,4,376},{4,5,257},{4,5,65},{4,4,330},{4,4,290},{5,3,723},{3,5,236},{3,5,364},{3,4,276},{6,3,723},{3,4,276},{4,5,686},{4,5,686},{4,5,686},{4,4,659},{3,6,315},{3,5,121},{3,5,121},{3,4,101},{2,5,171},{3,4,120},{4,5,61},{4,5,61},{4,5,61},{4,4,34},{5,2,170}, +{3,5,40},{3,5,40},{3,4,20},{7,2,170},{3,4,20},{6,2,200},{4,5,40},{4,4,305},{4,4,265},{6,2,200},{5,4,200},{4,4,265},{0,4,272},{5,4,200},{0,4,272},{4,0,650},{4,0,650},{4,0,650},{4,0,650},{3,5,85},{3,5,85},{3,5,85},{3,4,85},{3,4,104},{3,4,104},{4,6,498},{4,5,402},{4,5,402},{4,5,498},{3,7,1017},{3,6,700},{3,5,429}, +{3,4,917},{2,6,844},{3,4,632},{4,6,209},{4,5,113},{4,5,113},{4,5,209},{6,2,728},{3,6,411},{3,5,140},{3,4,628},{5,4,728},{3,4,628},{4,5,302},{4,5,302},{4,5,302},{4,5,398},{3,6,459},{3,5,329},{3,5,329},{3,4,341},{2,5,283},{3,4,56},{4,5,13},{4,5,13},{4,5,13},{4,5,109},{6,1,170},{3,5,40},{3,5,40},{3,4,52},{6,3,170}, +{3,4,52},{7,1,200},{4,5,104},{4,5,104},{3,5,104},{7,1,200},{4,5,200},{3,5,104},{0,4,592},{4,5,200},{0,4,592},{4,0,298},{4,0,298},{4,0,298},{4,0,298},{4,4,298},{4,4,298},{4,4,298},{3,4,325},{3,4,40},{3,4,40},{4,7,452},{4,6,222},{4,5,306},{4,5,210},{4,6,809},{4,5,473},{4,5,153},{4,5,969},{2,6,748},{3,5,588},{4,7,371}, +{4,6,141},{4,5,225},{4,5,129},{7,1,728},{3,6,203},{4,5,72},{2,5,513},{4,5,728},{2,5,513},{4,6,206},{4,6,206},{4,6,206},{4,5,206},{4,5,245},{4,5,149},{4,5,149},{4,4,226},{3,5,200},{4,4,370},{4,6,125},{4,6,125},{4,6,125},{4,5,125},{7,0,164},{4,5,68},{4,5,68},{4,4,145},{3,5,164},{4,4,145},{5,5,202},{4,6,20},{4,5,104}, +{4,5,8},{5,5,202},{3,6,202},{4,5,8},{0,5,488},{3,6,202},{0,5,488},{4,0,202},{4,0,202},{4,0,202},{4,0,202},{4,4,106},{4,4,106},{4,4,106},{4,4,82},{3,5,100},{3,5,100},{4,7,632},{4,6,474},{4,5,810},{4,5,498},{4,7,808},{4,6,371},{4,5,99},{4,5,339},{3,6,828},{3,5,228},{5,6,446},{5,5,396},{5,5,249},{5,5,281},{5,5,728}, +{4,6,371},{4,5,99},{3,5,219},{3,6,728},{3,5,219},{4,7,436},{4,7,436},{4,7,436},{4,5,449},{4,6,170},{4,5,50},{4,5,50},{4,5,290},{2,6,291},{3,5,179},{5,5,200},{5,5,200},{5,5,200},{5,5,232},{7,1,170},{4,5,50},{4,5,50},{3,5,170},{7,3,170},{3,5,170},{6,4,200},{4,6,74},{5,5,53},{5,5,85},{6,4,200},{7,4,200},{5,5,85}, +{0,5,218},{7,4,200},{0,5,218},{4,0,400},{4,0,400},{4,0,400},{4,0,400},{4,5,1},{4,5,1},{4,5,1},{4,4,100},{3,5,10},{3,5,10},{5,6,930},{5,6,762},{5,5,973},{5,5,941},{4,7,808},{4,6,291},{4,6,483},{4,5,323},{2,7,764},{4,5,380},{5,6,254},{5,6,86},{5,5,297},{5,5,265},{6,4,728},{4,6,227},{5,5,373},{4,5,259},{7,4,728}, +{4,5,259},{5,5,748},{5,5,748},{5,5,748},{5,5,716},{4,6,298},{4,6,122},{4,6,122},{4,5,98},{3,6,184},{4,5,155},{5,5,72},{5,5,72},{5,5,72},{5,5,40},{6,3,164},{4,6,58},{4,6,58},{4,5,34},{6,4,164},{4,5,34},{7,3,202},{5,6,50},{5,5,261},{5,5,229},{7,3,202},{6,5,202},{5,5,229},{0,5,250},{6,5,202},{0,5,250},{5,0,712}, +{5,0,712},{5,0,712},{5,0,712},{4,6,73},{4,6,73},{4,6,73},{4,5,73},{4,5,130},{4,5,130},{5,7,530},{5,6,410},{5,6,450},{5,6,570},{5,6,1055},{4,7,720},{4,6,403},{4,5,819},{3,7,892},{4,5,572},{5,7,206},{5,6,86},{5,6,126},{5,6,246},{5,6,731},{3,7,387},{4,6,147},{4,5,563},{4,6,731},{4,5,563},{5,6,329},{5,6,329},{5,6,329}, +{5,5,428},{4,7,420},{4,6,282},{4,6,282},{4,5,290},{3,6,248},{4,5,43},{5,6,5},{5,6,5},{5,6,5},{5,5,104},{7,2,164},{4,6,26},{4,6,26},{4,5,34},{5,5,164},{4,5,34},{5,7,202},{5,6,82},{5,6,122},{4,6,122},{5,7,202},{5,6,202},{4,6,122},{0,5,538},{5,6,202},{0,5,538},{5,0,328},{5,0,328},{5,0,328},{5,0,328},{4,6,281}, +{4,6,281},{4,6,281},{4,5,281},{4,5,34},{4,5,34},{5,7,498},{5,7,234},{5,6,290},{5,6,218},{5,7,839},{5,6,479},{5,6,199},{5,6,1079},{3,7,732},{4,6,668},{5,7,398},{5,7,134},{5,6,190},{5,6,118},{6,5,731},{4,7,208},{5,6,99},{3,6,554},{3,7,731},{3,6,554},{5,7,209},{5,7,209},{5,7,209},{5,6,209},{5,6,262},{5,6,190},{5,6,190}, +{5,5,221},{4,6,211},{4,5,315},{5,7,109},{5,7,109},{5,7,109},{5,6,109},{5,6,162},{5,6,90},{5,6,90},{5,5,121},{4,6,162},{5,5,121},{7,4,208},{5,7,34},{5,6,90},{5,6,18},{7,4,208},{7,5,208},{5,6,18},{0,6,538},{7,5,208},{0,6,538},{5,0,200},{5,0,200},{5,0,200},{5,0,200},{5,5,116},{5,5,116},{5,5,116},{5,5,100},{4,6,130}, +{4,6,130},{5,7,1074},{5,7,414},{5,6,722},{5,6,434},{5,7,857},{5,7,417},{5,6,73},{5,6,377},{4,7,860},{4,6,236},{6,7,497},{6,6,403},{6,6,270},{6,6,310},{7,4,731},{4,7,379},{5,6,72},{4,6,232},{7,5,731},{4,6,232},{5,7,398},{5,7,398},{5,7,398},{5,6,398},{5,7,181},{5,6,37},{5,6,37},{5,6,341},{3,7,264},{4,6,200},{6,6,234}, +{6,6,234},{6,6,234},{6,6,274},{6,5,164},{5,6,36},{5,6,36},{4,6,196},{3,7,164},{4,6,196},{7,5,202},{5,7,52},{6,6,45},{5,6,72},{7,5,202},{6,6,218},{5,6,72},{0,6,232},{6,6,218},{0,6,232},{5,0,362},{5,0,362},{5,0,362},{5,0,362},{5,6,1},{5,6,1},{5,6,1},{5,5,82},{4,6,4},{4,6,4},{6,7,986},{6,7,842},{6,6,999}, +{6,6,975},{5,7,1417},{5,7,273},{5,6,505},{5,6,297},{4,7,828},{5,6,392},{6,7,257},{6,7,113},{6,6,270},{6,6,246},{7,5,739},{5,7,224},{6,6,366},{5,6,248},{6,6,731},{5,6,248},{6,6,803},{6,6,803},{6,6,803},{6,6,779},{5,7,261},{5,7,129},{5,7,129},{5,6,101},{4,7,203},{5,6,196},{6,6,74},{6,6,74},{6,6,74},{6,6,50},{7,4,162}, +{5,7,80},{5,7,80},{5,6,52},{7,5,162},{5,6,52},{6,7,208},{6,7,64},{6,6,221},{6,6,197},{6,7,208},{7,6,208},{6,6,197},{0,6,232},{7,6,208},{0,6,232},{5,0,778},{5,0,778},{5,0,778},{5,0,778},{5,7,65},{5,7,65},{5,7,65},{5,6,65},{5,6,160},{5,6,160},{6,7,762},{6,7,426},{6,7,506},{6,7,650},{6,7,1085},{5,7,641},{5,7,385}, +{5,6,729},{5,7,980},{5,6,520},{6,7,401},{6,7,65},{6,7,145},{6,7,289},{6,7,724},{5,7,416},{5,7,160},{5,6,504},{5,7,724},{5,6,504},{6,7,362},{6,7,362},{6,7,362},{6,6,443},{6,6,555},{5,7,241},{5,7,241},{5,6,245},{4,7,219},{5,6,36},{6,7,1},{6,7,1},{6,7,1},{6,6,82},{7,5,194},{5,7,16},{5,7,16},{5,6,20},{6,6,162}, +{5,6,20},{7,6,208},{6,7,64},{6,7,144},{5,7,144},{7,6,208},{6,7,208},{5,7,144},{0,6,488},{6,7,208},{0,6,488},{6,0,362},{6,0,362},{6,0,362},{6,0,362},{5,7,241},{5,7,241},{5,7,241},{5,6,241},{5,6,32},{5,6,32},{6,7,1050},{6,7,522},{6,7,282},{6,7,234},{6,7,1069},{6,7,493},{6,7,253},{6,6,1122},{5,7,1012},{5,7,756},{7,7,843}, +{6,7,401},{6,7,161},{6,7,113},{7,6,724},{6,7,372},{6,7,132},{4,7,601},{6,7,756},{4,7,601},{6,7,266},{6,7,266},{6,7,266},{6,7,218},{6,7,285},{6,7,237},{6,7,237},{6,6,222},{5,7,228},{5,6,260},{6,7,145},{6,7,145},{6,7,145},{6,7,97},{6,7,164},{6,7,116},{6,7,116},{6,6,101},{5,7,164},{6,6,101},{7,7,218},{7,7,178},{6,7,80}, +{6,7,32},{7,7,218},{6,7,272},{6,7,32},{0,7,592},{6,7,272},{0,7,592},{6,0,202},{6,0,202},{6,0,202},{6,0,202},{6,6,130},{6,6,130},{6,6,130},{6,6,122},{5,6,160},{5,6,160},{6,7,1641},{6,7,1017},{6,7,617},{6,7,353},{6,7,1318},{6,7,430},{6,7,30},{6,7,398},{6,7,1035},{5,7,227},{7,7,393},{7,7,321},{7,7,272},{7,7,320},{7,7,621}, +{6,7,426},{6,7,26},{5,7,226},{6,7,594},{5,7,226},{6,7,617},{6,7,617},{6,7,617},{6,7,353},{6,7,294},{6,7,30},{6,7,30},{6,7,398},{5,7,291},{5,7,227},{7,7,272},{7,7,272},{7,7,272},{7,7,320},{7,6,162},{6,7,26},{6,7,26},{5,7,226},{7,6,194},{5,7,226},{7,7,137},{7,7,65},{7,7,16},{6,7,25},{7,7,137},{7,7,113},{6,7,25}, +{0,7,225},{7,7,113},{0,7,225},{6,0,328},{6,0,328},{6,0,328},{6,0,328},{6,7,5},{6,7,5},{6,7,5},{6,6,68},{5,7,2},{5,7,2},{7,7,985},{7,7,913},{7,7,864},{7,7,848},{7,7,1117},{6,7,654},{6,7,254},{6,7,110},{6,7,763},{5,7,179},{7,7,201},{7,7,129},{7,7,80},{7,7,64},{7,7,333},{7,7,245},{7,7,196},{6,7,74},{7,7,373}, +{6,7,74},{7,7,864},{7,7,864},{7,7,864},{7,7,848},{6,7,710},{6,7,254},{6,7,254},{6,7,110},{6,7,363},{5,7,179},{7,7,80},{7,7,80},{7,7,80},{7,7,64},{7,7,212},{7,7,196},{7,7,196},{6,7,74},{6,7,194},{6,7,74},{7,7,137},{7,7,65},{7,7,16},{7,7,0},{7,7,137},{7,7,49},{7,7,0},{0,7,49},{7,7,49},{0,7,49},{6,0,712}, +{6,0,712},{6,0,712},{6,0,712},{6,7,85},{6,7,85},{6,7,85},{6,7,61},{5,7,130},{5,7,130},{7,7,642},{7,7,570},{7,7,521},{7,7,449},{7,7,678},{7,7,534},{7,7,485},{6,7,205},{6,7,834},{6,7,34},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,278},{7,7,134},{7,7,85},{6,7,9},{7,7,198},{6,7,9},{7,7,521},{7,7,521},{7,7,521}, +{7,7,449},{7,7,557},{7,7,485},{7,7,485},{6,7,205},{6,7,434},{6,7,34},{7,7,121},{7,7,121},{7,7,121},{7,7,49},{7,7,157},{7,7,85},{7,7,85},{6,7,9},{7,7,149},{6,7,9},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{7,0,400},{7,0,400},{7,0,400},{7,0,400},{6,7,421}, +{6,7,421},{6,7,421},{6,7,205},{6,7,34},{6,7,34},{7,7,450},{7,7,378},{7,7,329},{7,7,257},{7,7,390},{7,7,246},{7,7,197},{7,7,148},{7,7,426},{6,7,130},{7,7,306},{7,7,234},{7,7,185},{7,7,113},{7,7,246},{7,7,102},{7,7,53},{7,7,4},{7,7,102},{7,7,4},{7,7,329},{7,7,329},{7,7,329},{7,7,257},{7,7,269},{7,7,197},{7,7,197}, +{7,7,148},{7,7,377},{6,7,130},{7,7,185},{7,7,185},{7,7,185},{7,7,113},{7,7,125},{7,7,53},{7,7,53},{7,7,4},{7,7,53},{7,7,4},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{7,0,208},{7,0,208},{7,0,208},{7,0,208},{7,7,148},{7,7,148},{7,7,148},{7,7,148},{6,7,130}, +{6,7,130},{0,2,445},{0,1,157},{0,1,117},{0,1,405},{0,1,926},{0,1,806},{0,0,670},{0,0,741},{0,0,1169},{0,0,777},{0,2,445},{0,1,157},{0,1,117},{0,1,405},{0,1,926},{0,1,806},{0,0,670},{0,0,741},{1,0,990},{0,0,741},{0,1,36},{0,1,36},{0,1,36},{0,0,9},{0,0,85},{0,0,45},{0,0,45},{0,0,116},{0,0,145},{0,0,152},{0,1,36}, +{0,1,36},{0,1,36},{0,0,9},{0,0,85},{0,0,45},{0,0,45},{0,0,116},{0,0,109},{0,0,116},{1,0,421},{0,1,157},{0,1,117},{0,1,405},{1,0,421},{0,1,445},{0,1,405},{0,0,641},{0,1,445},{0,0,641},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,2,461},{0,2,109},{0,1,5}, +{0,1,101},{0,1,1326},{0,1,822},{0,1,462},{0,0,1205},{0,1,1783},{0,0,1241},{0,2,461},{0,2,109},{0,1,5},{0,1,101},{1,0,1294},{0,1,822},{0,1,462},{0,0,1205},{1,0,1262},{0,0,1205},{0,1,4},{0,1,4},{0,1,4},{0,1,100},{0,0,261},{0,0,157},{0,0,157},{0,0,116},{0,0,257},{0,0,152},{0,1,4},{0,1,4},{0,1,4},{0,1,100},{0,0,261}, +{0,0,157},{0,0,157},{0,0,116},{0,0,221},{0,0,116},{1,1,461},{0,2,109},{0,1,5},{0,1,101},{1,1,461},{2,0,421},{0,1,101},{0,1,901},{2,0,421},{0,1,901},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,3,430},{0,2,38},{0,1,158},{0,1,62},{0,2,1517},{0,1,989},{0,1,309}, +{0,1,1317},{0,1,1878},{0,1,1678},{0,3,430},{0,2,38},{0,1,158},{0,1,62},{0,2,1517},{0,1,989},{0,1,309},{0,1,1317},{0,1,1517},{0,1,1317},{0,2,13},{0,2,13},{0,2,13},{0,1,13},{0,1,356},{0,1,260},{0,1,260},{0,0,193},{0,0,446},{0,0,229},{0,2,13},{0,2,13},{0,2,13},{0,1,13},{0,1,356},{0,1,260},{0,1,260},{0,0,193},{0,0,410}, +{0,0,193},{0,3,421},{0,2,29},{0,1,149},{0,1,53},{0,3,421},{1,1,421},{0,1,53},{0,1,533},{1,1,421},{0,1,533},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,9},{0,0,49},{0,0,85},{0,0,85},{0,4,602},{0,3,234},{0,2,518},{0,1,382},{0,3,1622},{0,2,825},{0,1,325},{0,1,821},{0,1,2022},{0,1,1182},{0,4,602}, +{0,3,234},{0,2,518},{0,1,382},{1,1,1526},{0,2,825},{0,1,325},{0,1,821},{2,0,1526},{0,1,821},{0,2,157},{0,2,157},{0,2,157},{0,1,157},{0,1,388},{0,1,100},{0,1,100},{0,0,401},{0,0,766},{0,0,437},{0,2,157},{0,2,157},{0,2,157},{0,1,157},{1,0,356},{0,1,100},{0,1,100},{0,0,401},{1,0,340},{0,0,401},{1,2,425},{0,3,113},{1,1,234}, +{0,1,261},{1,2,425},{0,2,425},{0,1,261},{0,1,421},{0,2,425},{0,1,421},{0,0,121},{0,0,121},{0,0,121},{0,0,121},{0,0,25},{0,0,25},{0,0,25},{0,0,1},{0,0,37},{0,0,37},{0,4,845},{0,3,405},{0,2,725},{0,2,549},{0,3,1541},{0,2,654},{0,2,270},{0,1,722},{0,2,2583},{0,1,1083},{1,3,657},{1,2,345},{1,2,345},{0,2,549},{2,0,1517}, +{0,2,654},{0,2,270},{0,1,722},{3,0,1517},{0,1,722},{0,3,404},{0,3,404},{0,3,404},{0,2,449},{0,2,346},{0,2,170},{0,2,170},{0,1,146},{0,1,707},{0,1,507},{1,1,232},{1,1,232},{1,1,232},{1,1,200},{0,2,346},{0,2,170},{0,2,170},{0,1,146},{0,1,346},{0,1,146},{2,1,421},{0,3,5},{1,2,149},{0,2,149},{2,1,421},{4,0,421},{0,2,149}, +{0,1,601},{4,0,421},{0,1,601},{0,0,400},{0,0,400},{0,0,400},{0,0,400},{0,1,1},{0,1,1},{0,1,1},{0,0,100},{0,0,136},{0,0,136},{0,5,1209},{0,4,937},{1,2,1197},{0,2,789},{0,4,1526},{0,3,737},{0,2,14},{0,1,1042},{0,2,2487},{0,1,1403},{1,3,481},{1,3,173},{1,2,41},{1,2,161},{1,2,1526},{0,3,737},{0,2,14},{0,1,1042},{2,1,1526}, +{0,1,1042},{0,4,793},{0,4,793},{0,4,793},{0,2,785},{0,3,356},{0,2,10},{0,2,10},{0,1,18},{0,1,899},{0,1,379},{1,2,37},{1,2,37},{1,2,37},{1,1,136},{1,1,340},{0,2,10},{0,2,10},{0,1,18},{1,1,356},{0,1,18},{3,0,425},{1,3,137},{1,2,5},{0,2,5},{3,0,425},{3,1,425},{0,2,5},{0,2,965},{3,1,425},{0,2,965},{0,0,784}, +{0,0,784},{0,0,784},{0,0,784},{0,2,9},{0,2,9},{0,2,9},{0,1,9},{0,0,360},{0,0,360},{1,4,1158},{1,3,758},{1,2,850},{1,2,778},{0,4,1671},{0,3,546},{0,2,191},{0,2,903},{0,2,2390},{0,2,1430},{1,4,429},{1,3,29},{1,2,121},{1,2,49},{2,1,1526},{0,3,497},{0,2,142},{0,2,854},{4,0,1526},{0,2,854},{1,3,742},{1,3,742},{1,3,742}, +{1,2,742},{0,3,437},{0,2,155},{0,2,155},{0,1,195},{0,2,946},{0,1,290},{1,3,13},{1,3,13},{1,3,13},{1,2,13},{2,0,340},{0,2,106},{0,2,106},{0,1,146},{3,0,340},{0,1,146},{1,4,425},{1,3,25},{1,2,117},{1,2,45},{1,4,425},{2,2,425},{1,2,45},{0,2,565},{2,2,425},{0,2,565},{1,0,733},{1,0,733},{1,0,733},{1,0,733},{0,2,74}, +{0,2,74},{0,2,74},{0,1,74},{0,1,169},{0,1,169},{1,4,966},{1,4,606},{1,3,886},{1,2,682},{0,5,1742},{0,3,866},{0,3,641},{0,2,727},{0,3,2382},{0,2,758},{1,4,605},{1,4,245},{1,3,525},{1,2,321},{3,0,1517},{0,3,641},{1,2,302},{0,2,502},{3,1,1517},{0,2,502},{1,3,486},{1,3,486},{1,3,486},{1,2,486},{0,4,563},{0,3,241},{0,3,241}, +{0,2,531},{0,2,626},{0,1,546},{1,3,125},{1,3,125},{1,3,125},{1,2,125},{0,4,338},{0,3,16},{0,3,16},{0,2,306},{2,1,338},{0,2,306},{3,1,433},{1,4,145},{2,2,212},{1,2,221},{3,1,433},{6,0,433},{1,2,221},{0,2,421},{6,0,433},{0,2,421},{1,0,461},{1,0,461},{1,0,461},{1,0,461},{0,3,225},{0,3,225},{0,3,225},{0,2,306},{0,1,185}, +{0,1,185},{1,5,894},{1,4,462},{1,3,778},{1,3,646},{1,4,1626},{1,3,749},{1,3,429},{1,2,809},{0,3,2022},{0,2,614},{2,4,706},{1,4,362},{2,3,410},{1,3,546},{3,1,1526},{0,4,441},{0,3,227},{0,2,565},{4,1,1526},{0,2,565},{1,4,462},{1,4,462},{1,4,462},{1,3,525},{1,3,440},{1,2,296},{1,2,296},{1,2,280},{0,2,725},{0,2,85},{2,2,250}, +{2,2,250},{2,2,250},{2,2,226},{1,3,340},{0,3,106},{0,3,106},{0,2,36},{1,2,340},{0,2,36},{3,2,425},{1,4,1},{2,3,185},{0,3,146},{3,2,425},{5,1,425},{0,3,146},{0,2,565},{5,1,425},{0,2,565},{1,0,461},{1,0,461},{1,0,461},{1,0,461},{1,2,100},{1,2,100},{1,2,100},{1,1,181},{0,2,49},{0,2,49},{1,6,1166},{1,4,878},{1,3,1226}, +{1,3,742},{1,5,1545},{1,4,798},{1,3,29},{1,2,985},{0,3,2246},{0,2,1030},{2,4,482},{2,4,218},{2,3,58},{2,3,202},{2,3,1517},{0,4,521},{1,3,25},{1,2,981},{6,0,1517},{1,2,981},{1,5,749},{1,5,749},{1,5,749},{1,3,733},{1,4,374},{1,3,20},{1,3,20},{1,2,24},{0,3,482},{0,2,69},{2,3,49},{2,3,49},{2,3,49},{2,2,130},{2,2,338}, +{1,3,16},{1,3,16},{1,2,20},{5,0,338},{1,2,20},{4,1,433},{1,4,145},{2,3,9},{1,3,9},{4,1,433},{7,0,433},{1,3,9},{0,2,965},{7,0,433},{0,2,965},{1,0,733},{1,0,733},{1,0,733},{1,0,733},{1,3,20},{1,3,20},{1,3,20},{1,2,20},{0,2,65},{0,2,65},{2,5,1218},{2,4,810},{2,3,874},{2,3,826},{1,5,1625},{1,4,542},{1,3,141}, +{1,3,961},{0,4,1806},{0,3,642},{2,5,434},{2,4,26},{2,3,90},{2,3,42},{3,2,1517},{1,4,506},{1,3,105},{0,3,626},{5,1,1517},{0,3,626},{2,4,801},{2,4,801},{2,4,801},{2,3,801},{1,4,406},{1,3,116},{1,3,116},{1,2,152},{0,3,482},{1,2,285},{2,4,17},{2,4,17},{2,4,17},{2,3,17},{3,1,338},{1,3,80},{1,3,80},{1,2,116},{4,1,338}, +{1,2,116},{3,3,425},{2,4,25},{2,3,89},{2,3,41},{3,3,425},{6,1,425},{2,3,41},{0,3,601},{6,1,425},{0,3,601},{2,0,785},{2,0,785},{2,0,785},{2,0,785},{1,3,52},{1,3,52},{1,3,52},{1,2,52},{0,3,41},{0,3,41},{2,5,962},{2,4,618},{2,3,906},{2,3,666},{1,6,1710},{1,4,798},{1,4,663},{1,3,721},{0,4,1838},{0,3,450},{2,5,562}, +{2,4,218},{2,3,506},{2,3,266},{4,1,1514},{0,5,474},{2,3,285},{0,3,434},{4,2,1514},{0,3,434},{2,4,497},{2,4,497},{2,4,497},{2,3,497},{1,5,536},{1,4,222},{1,4,222},{1,3,552},{0,4,469},{0,3,281},{2,4,97},{2,4,97},{2,4,97},{2,3,97},{4,0,340},{1,4,26},{1,4,26},{0,3,265},{3,2,340},{0,3,265},{4,2,425},{2,4,137},{3,3,194}, +{2,3,185},{4,2,425},{5,2,425},{2,3,185},{0,3,425},{5,2,425},{0,3,425},{2,0,481},{2,0,481},{2,0,481},{2,0,481},{1,4,197},{1,4,197},{1,4,197},{1,3,296},{0,3,25},{0,3,25},{2,6,870},{2,5,446},{2,4,758},{2,4,670},{2,5,1638},{2,4,771},{2,4,515},{2,3,823},{0,5,1710},{1,3,598},{3,4,737},{2,5,325},{3,4,481},{2,4,549},{5,0,1517}, +{1,5,458},{1,4,224},{1,3,534},{3,3,1517},{1,3,534},{2,5,445},{2,5,445},{2,5,445},{2,4,526},{2,4,459},{2,3,291},{2,3,291},{2,3,339},{0,4,370},{1,3,114},{3,3,272},{3,3,272},{3,3,272},{3,3,256},{2,4,338},{1,4,80},{1,4,80},{1,3,50},{7,0,338},{1,3,50},{5,1,425},{2,5,1},{3,4,225},{1,4,160},{5,1,425},{4,3,425},{1,4,160}, +{0,3,533},{4,3,425},{0,3,533},{2,0,445},{2,0,445},{2,0,445},{2,0,445},{2,3,122},{2,3,122},{2,3,122},{2,2,185},{1,3,65},{1,3,65},{2,7,1130},{2,5,798},{2,4,1142},{2,4,702},{2,6,1571},{2,4,819},{2,4,51},{2,3,935},{0,5,1614},{1,3,950},{3,5,489},{3,5,269},{3,4,81},{3,4,249},{3,4,1514},{1,5,490},{2,4,42},{2,3,926},{7,1,1514}, +{2,3,926},{2,6,710},{2,6,710},{2,6,710},{2,4,686},{2,5,397},{2,4,35},{2,4,35},{2,3,35},{1,4,509},{1,3,50},{3,4,65},{3,4,65},{3,4,65},{3,3,128},{3,3,340},{2,4,26},{2,4,26},{2,3,26},{6,1,340},{2,3,26},{6,0,425},{2,5,113},{3,4,17},{2,4,17},{6,0,425},{3,4,425},{2,4,17},{0,3,901},{3,4,425},{0,3,901},{2,0,685}, +{2,0,685},{2,0,685},{2,0,685},{2,4,34},{2,4,34},{2,4,34},{2,3,34},{1,3,49},{1,3,49},{3,6,1286},{3,5,870},{3,4,906},{3,4,882},{2,6,1587},{2,5,546},{2,4,99},{2,4,1027},{1,5,1838},{1,4,702},{3,6,445},{3,5,29},{3,4,65},{3,4,41},{4,3,1514},{2,5,521},{2,4,74},{1,4,677},{6,2,1514},{1,4,677},{3,5,866},{3,5,866},{3,5,866}, +{3,4,866},{2,5,381},{2,4,83},{2,4,83},{2,3,115},{0,5,349},{2,3,286},{3,5,25},{3,5,25},{3,5,25},{3,4,25},{4,2,340},{2,4,58},{2,4,58},{2,3,90},{5,2,340},{2,3,90},{4,4,421},{3,5,29},{3,4,65},{3,4,41},{4,4,421},{7,2,421},{3,4,41},{0,4,641},{7,2,421},{0,4,641},{3,0,841},{3,0,841},{3,0,841},{3,0,841},{2,4,34}, +{2,4,34},{2,4,34},{2,3,34},{1,4,61},{1,4,61},{3,6,966},{3,5,614},{3,4,874},{3,4,658},{2,7,1686},{2,5,738},{2,4,659},{2,4,723},{0,6,1518},{1,4,446},{3,6,525},{3,5,173},{3,4,433},{3,4,217},{5,2,1517},{1,6,457},{3,4,274},{1,4,437},{5,3,1517},{1,4,437},{3,5,514},{3,5,514},{3,5,514},{3,4,514},{2,6,515},{2,5,209},{2,5,209}, +{2,3,579},{1,5,510},{1,4,302},{3,5,73},{3,5,73},{3,5,73},{3,4,73},{5,1,346},{2,5,40},{2,5,40},{3,3,293},{7,1,346},{3,3,293},{5,3,421},{3,5,109},{4,4,180},{3,4,153},{5,3,421},{6,3,421},{3,4,153},{0,4,433},{6,3,421},{0,4,433},{3,0,505},{3,0,505},{3,0,505},{3,0,505},{2,5,173},{2,5,173},{2,5,173},{2,3,290},{1,4,13}, +{1,4,13},{3,7,854},{3,6,438},{3,5,746},{3,5,702},{3,6,1658},{3,5,801},{3,5,609},{3,4,845},{1,6,1758},{2,4,590},{3,7,710},{3,6,294},{4,5,558},{3,5,558},{6,1,1514},{2,6,481},{2,5,227},{2,4,509},{4,4,1514},{2,4,509},{3,6,434},{3,6,434},{3,6,434},{3,5,533},{3,5,484},{3,4,292},{3,4,292},{3,4,404},{1,5,357},{2,4,149},{3,6,290}, +{3,6,290},{3,6,290},{4,4,290},{6,0,340},{2,5,58},{2,5,58},{2,4,68},{3,4,340},{2,4,68},{6,2,421},{3,6,5},{4,5,269},{2,5,178},{6,2,421},{5,4,421},{2,5,178},{0,4,505},{5,4,421},{0,4,505},{3,0,433},{3,0,433},{3,0,433},{3,0,433},{3,4,148},{3,4,148},{3,4,148},{3,3,193},{2,4,85},{2,4,85},{3,7,1206},{3,6,726},{3,5,1066}, +{3,5,670},{3,7,1605},{3,5,785},{3,5,81},{3,4,893},{1,6,1598},{2,4,878},{4,6,502},{4,5,310},{4,5,110},{4,5,302},{7,0,1517},{2,6,465},{3,5,65},{2,4,877},{3,5,1517},{2,4,877},{3,7,677},{3,7,677},{3,7,677},{3,5,645},{3,6,426},{3,5,56},{3,5,56},{3,4,52},{2,5,542},{2,4,37},{4,5,85},{4,5,85},{4,5,85},{4,4,130},{5,2,346}, +{3,5,40},{3,5,40},{2,4,36},{7,2,346},{2,4,36},{7,1,421},{3,6,85},{4,5,29},{3,5,29},{7,1,421},{4,5,421},{3,5,29},{0,4,841},{4,5,421},{0,4,841},{3,0,641},{3,0,641},{3,0,641},{3,0,641},{3,4,52},{3,4,52},{3,4,52},{3,4,52},{2,4,37},{2,4,37},{4,7,1362},{4,6,938},{4,5,946},{4,5,946},{3,7,1557},{3,6,558},{3,5,65}, +{3,5,1101},{0,7,1662},{2,5,770},{4,7,462},{4,6,38},{4,5,46},{4,5,46},{5,4,1517},{3,6,542},{3,5,49},{1,5,721},{7,3,1517},{1,5,721},{4,5,937},{4,5,937},{4,5,937},{4,5,937},{3,6,362},{3,5,56},{3,5,56},{3,4,84},{1,6,350},{3,4,293},{4,5,37},{4,5,37},{4,5,37},{4,5,37},{6,1,346},{3,5,40},{3,5,40},{3,4,68},{6,3,346}, +{3,4,68},{5,5,421},{4,6,37},{4,5,45},{3,5,45},{5,5,421},{3,6,421},{3,5,45},{0,5,685},{3,6,421},{0,5,685},{4,0,901},{4,0,901},{4,0,901},{4,0,901},{3,5,20},{3,5,20},{3,5,20},{3,4,20},{2,5,85},{2,5,85},{4,7,978},{4,6,618},{4,5,850},{4,5,658},{3,7,2021},{3,6,686},{3,5,561},{3,5,733},{1,7,1530},{2,5,450},{4,7,494}, +{4,6,134},{4,5,366},{4,5,174},{6,3,1526},{2,7,446},{4,5,269},{2,5,446},{6,4,1526},{2,5,446},{4,6,537},{4,6,537},{4,6,537},{4,5,537},{3,7,500},{3,6,202},{3,6,202},{3,4,500},{1,6,510},{2,5,329},{4,6,53},{4,6,53},{4,6,53},{4,5,53},{7,0,340},{3,6,58},{3,6,58},{4,4,265},{3,5,340},{4,4,265},{6,4,421},{4,6,85},{5,5,170}, +{4,5,125},{6,4,421},{7,4,421},{4,5,125},{0,5,445},{7,4,421},{0,5,445},{4,0,533},{4,0,533},{4,0,533},{4,0,533},{3,6,153},{3,6,153},{3,6,153},{3,4,244},{2,5,5},{2,5,5},{4,7,1158},{4,7,438},{4,6,742},{4,6,742},{4,7,1686},{4,6,839},{3,6,677},{4,5,875},{1,7,1710},{3,5,590},{5,6,769},{4,7,269},{4,6,573},{4,6,573},{7,2,1517}, +{3,7,510},{3,6,236},{3,5,490},{5,5,1517},{3,5,490},{4,7,429},{4,7,429},{4,7,429},{4,5,546},{4,6,515},{4,5,299},{4,5,299},{4,5,475},{2,6,350},{3,5,190},{4,7,260},{4,7,260},{4,7,260},{5,5,328},{7,1,346},{3,6,40},{3,6,40},{3,5,90},{7,3,346},{3,5,90},{7,3,421},{4,7,13},{4,6,317},{3,6,200},{7,3,421},{6,5,421},{3,6,200}, +{0,5,481},{6,5,421},{0,5,481},{4,0,425},{4,0,425},{4,0,425},{4,0,425},{4,5,178},{4,5,178},{4,5,178},{4,4,205},{3,5,109},{3,5,109},{4,7,1862},{4,7,662},{4,6,998},{4,6,646},{4,7,1686},{4,6,759},{4,6,119},{4,5,859},{2,7,1590},{3,5,814},{5,7,521},{5,6,305},{5,6,145},{5,6,361},{5,6,1526},{3,7,446},{4,6,94},{3,5,810},{4,6,1526}, +{3,5,810},{4,7,637},{4,7,637},{4,7,637},{4,6,610},{4,6,435},{4,6,83},{4,6,83},{4,5,75},{1,7,565},{3,5,30},{5,6,109},{5,6,109},{5,6,109},{5,5,136},{6,3,340},{4,6,58},{4,6,58},{3,5,26},{6,4,340},{3,5,26},{5,7,421},{4,7,61},{5,6,45},{4,6,45},{5,7,421},{5,6,421},{4,6,45},{0,5,785},{5,6,421},{0,5,785},{4,0,601}, +{4,0,601},{4,0,601},{4,0,601},{4,5,50},{4,5,50},{4,5,50},{4,5,74},{3,5,29},{3,5,29},{5,7,1498},{5,7,1014},{5,6,994},{5,6,1018},{4,7,2198},{4,7,578},{4,6,39},{4,6,1183},{2,7,1878},{3,6,846},{5,7,537},{5,7,53},{5,6,33},{5,6,57},{7,3,1526},{4,7,569},{4,6,30},{2,6,758},{6,5,1526},{2,6,758},{5,6,990},{5,6,990},{5,6,990}, +{5,6,1014},{4,7,349},{4,6,35},{4,6,35},{4,5,59},{2,7,357},{3,5,254},{5,6,29},{5,6,29},{5,6,29},{5,6,53},{7,2,340},{4,6,26},{4,6,26},{4,5,50},{5,5,340},{4,5,50},{6,6,425},{5,7,49},{5,6,29},{4,6,29},{6,6,425},{4,7,425},{4,6,29},{0,6,733},{4,7,425},{0,6,733},{5,0,965},{5,0,965},{5,0,965},{5,0,965},{4,6,10}, +{4,6,10},{4,6,10},{4,5,10},{3,6,113},{3,6,113},{5,7,1466},{5,7,630},{5,6,834},{5,6,666},{5,7,2055},{4,7,642},{4,6,471},{4,6,751},{3,7,1766},{3,6,462},{5,7,937},{5,7,101},{5,6,305},{5,6,137},{5,7,1526},{4,7,521},{5,6,270},{3,6,461},{5,6,1526},{3,6,461},{5,7,566},{5,7,566},{5,7,566},{5,6,566},{4,7,621},{4,7,201},{4,7,201}, +{4,5,427},{2,7,469},{3,6,362},{5,7,37},{5,7,37},{5,7,37},{5,6,37},{5,6,338},{4,7,80},{4,7,80},{5,5,241},{4,6,338},{5,5,241},{7,5,425},{5,7,65},{6,6,164},{5,6,101},{7,5,425},{6,6,433},{5,6,101},{0,6,461},{6,6,433},{0,6,461},{5,0,565},{5,0,565},{5,0,565},{5,0,565},{4,7,137},{4,7,137},{4,7,137},{4,5,202},{3,6,1}, +{3,6,1},{5,7,2042},{5,7,810},{5,7,746},{5,7,790},{5,7,2073},{5,7,885},{4,7,651},{4,6,877},{4,7,2102},{4,6,598},{6,7,794},{6,7,530},{5,7,550},{5,7,594},{6,6,1526},{5,7,689},{4,7,251},{4,6,477},{6,6,1526},{4,6,477},{5,7,521},{5,7,521},{5,7,521},{5,6,521},{5,7,552},{5,6,312},{5,6,312},{4,6,516},{3,7,349},{4,6,237},{5,7,325}, +{5,7,325},{5,7,325},{5,6,325},{6,5,340},{4,7,26},{4,7,26},{4,6,116},{3,7,340},{4,6,116},{6,7,433},{6,7,169},{5,7,325},{4,7,226},{6,7,433},{7,6,425},{4,7,226},{0,6,461},{7,6,425},{0,6,461},{5,0,421},{5,0,421},{5,0,421},{5,0,421},{5,6,212},{5,6,212},{5,6,212},{5,5,221},{4,6,137},{4,6,137},{6,7,2362},{5,7,1514},{5,7,938}, +{5,7,630},{5,7,2633},{5,7,741},{5,7,165},{5,6,833},{4,7,2070},{4,6,758},{6,7,762},{6,7,306},{6,7,186},{6,7,426},{7,5,1526},{5,7,705},{5,7,129},{4,6,749},{5,7,1541},{4,6,749},{5,7,889},{5,7,889},{5,7,889},{5,7,581},{5,7,424},{5,7,116},{5,7,116},{5,6,104},{3,7,525},{4,6,29},{6,7,137},{6,7,137},{6,7,137},{6,6,146},{7,4,338}, +{5,7,80},{5,7,80},{4,6,20},{7,5,338},{4,6,20},{7,6,433},{6,7,185},{6,7,65},{5,7,65},{7,6,433},{6,7,425},{5,7,65},{0,6,733},{6,7,425},{0,6,733},{5,0,565},{5,0,565},{5,0,565},{5,0,565},{5,6,52},{5,6,52},{5,6,52},{5,6,100},{4,6,25},{4,6,25},{6,7,2073},{6,7,1449},{6,7,1049},{5,7,981},{6,7,2548},{5,7,1044},{5,7,20}, +{5,6,1196},{5,7,2365},{4,7,929},{6,7,1049},{6,7,425},{6,7,25},{6,7,73},{7,6,1492},{6,7,948},{5,7,16},{3,7,800},{7,6,1460},{3,7,800},{6,7,1049},{6,7,1049},{6,7,1049},{5,7,981},{5,7,680},{5,7,20},{5,7,20},{5,6,40},{4,7,434},{4,6,205},{6,7,25},{6,7,25},{6,7,25},{6,7,73},{7,5,370},{5,7,16},{5,7,16},{5,6,36},{6,6,338}, +{5,6,36},{7,7,410},{7,7,338},{6,7,16},{5,7,16},{7,7,410},{6,7,464},{5,7,16},{0,7,784},{6,7,464},{0,7,784},{5,0,965},{5,0,965},{5,0,965},{5,0,965},{5,7,4},{5,7,4},{5,7,4},{5,6,4},{4,7,145},{4,7,145},{6,7,1769},{6,7,1145},{6,7,745},{6,7,601},{6,7,1940},{6,7,1172},{5,7,308},{5,7,696},{5,7,1805},{4,7,401},{7,7,1043}, +{6,7,569},{6,7,169},{6,7,25},{7,6,1076},{6,7,596},{6,7,196},{4,7,401},{6,7,1076},{4,7,401},{6,7,745},{6,7,745},{6,7,745},{6,7,601},{6,7,916},{5,7,308},{5,7,308},{5,6,360},{4,7,626},{5,6,341},{6,7,169},{6,7,169},{6,7,169},{6,7,25},{6,7,340},{6,7,196},{6,7,196},{6,6,221},{5,7,340},{6,6,221},{7,7,202},{7,7,130},{7,7,81}, +{6,7,0},{7,7,202},{7,7,218},{6,7,0},{0,7,400},{7,7,218},{0,7,400},{6,0,601},{6,0,601},{6,0,601},{6,0,601},{5,7,164},{5,7,164},{5,7,164},{5,6,164},{4,7,1},{4,7,1},{6,7,1886},{6,7,1262},{6,7,862},{6,7,502},{6,7,1715},{6,7,731},{6,7,331},{5,7,507},{5,7,1634},{4,7,266},{7,7,521},{7,7,449},{7,7,400},{6,7,277},{7,7,797}, +{6,7,506},{6,7,106},{5,7,146},{6,7,770},{5,7,146},{6,7,862},{6,7,862},{6,7,862},{6,7,502},{6,7,691},{6,7,331},{6,7,331},{5,7,507},{5,7,610},{4,7,266},{7,7,400},{7,7,400},{7,7,400},{6,7,277},{7,6,338},{6,7,106},{6,7,106},{5,7,146},{7,6,370},{5,7,146},{7,7,121},{7,7,49},{7,7,0},{7,7,16},{7,7,121},{7,7,65},{7,7,16}, +{0,7,121},{7,7,65},{0,7,121},{6,0,421},{6,0,421},{6,0,421},{6,0,421},{6,7,250},{6,7,250},{6,7,250},{6,6,241},{4,7,145},{4,7,145},{7,7,2010},{6,7,1774},{6,7,1374},{6,7,822},{6,7,1923},{6,7,747},{6,7,347},{6,7,139},{6,7,1446},{5,7,34},{7,7,329},{7,7,257},{7,7,208},{7,7,160},{7,7,509},{7,7,389},{6,7,298},{5,7,18},{7,7,549}, +{5,7,18},{6,7,1374},{6,7,1374},{6,7,1374},{6,7,822},{6,7,899},{6,7,347},{6,7,347},{6,7,139},{5,7,866},{5,7,34},{7,7,208},{7,7,208},{7,7,208},{7,7,160},{7,7,388},{6,7,298},{6,7,298},{5,7,18},{6,7,370},{5,7,18},{7,7,185},{7,7,113},{7,7,64},{7,7,16},{7,7,185},{7,7,65},{7,7,16},{0,7,9},{7,7,65},{0,7,9},{6,0,533}, +{6,0,533},{6,0,533},{6,0,533},{6,7,58},{6,7,58},{6,7,58},{6,7,130},{5,7,25},{5,7,25},{7,7,1347},{7,7,1275},{7,7,1226},{7,7,1154},{7,7,1431},{6,7,922},{6,7,522},{6,7,2},{6,7,1125},{5,7,137},{7,7,258},{7,7,186},{7,7,137},{7,7,65},{7,7,342},{7,7,198},{7,7,149},{6,7,1},{7,7,294},{6,7,1},{7,7,1226},{7,7,1226},{7,7,1226}, +{7,7,1154},{6,7,1146},{6,7,522},{6,7,522},{6,7,2},{6,7,725},{5,7,137},{7,7,137},{7,7,137},{7,7,137},{7,7,65},{7,7,221},{7,7,149},{7,7,149},{6,7,1},{7,7,245},{6,7,1},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{6,0,901},{6,0,901},{6,0,901},{6,0,901},{6,7,122}, +{6,7,122},{6,7,122},{6,7,2},{5,7,137},{5,7,137},{7,7,883},{7,7,811},{7,7,762},{7,7,690},{7,7,871},{7,7,727},{7,7,678},{6,7,130},{6,7,949},{6,7,149},{7,7,258},{7,7,186},{7,7,137},{7,7,65},{7,7,246},{7,7,102},{7,7,53},{7,7,36},{7,7,134},{7,7,36},{7,7,762},{7,7,762},{7,7,762},{7,7,690},{7,7,750},{7,7,678},{7,7,678}, +{6,7,130},{6,7,549},{6,7,149},{7,7,137},{7,7,137},{7,7,137},{7,7,65},{7,7,125},{7,7,53},{7,7,53},{7,7,36},{7,7,85},{7,7,36},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{7,0,641},{7,0,641},{7,0,641},{7,0,641},{6,7,442},{6,7,442},{6,7,442},{6,7,130},{6,7,149}, +{6,7,149},{0,3,932},{0,2,218},{0,1,82},{0,1,250},{0,2,1971},{0,1,1371},{0,1,611},{0,0,1950},{0,1,2332},{0,0,1986},{0,3,932},{0,2,218},{0,1,82},{0,1,250},{1,0,1899},{0,1,1371},{0,1,611},{0,0,1950},{1,0,1923},{0,0,1950},{0,1,1},{0,1,1},{0,1,1},{0,0,64},{0,0,180},{0,0,100},{0,0,100},{0,0,101},{0,0,200},{0,0,137},{0,1,1}, +{0,1,1},{0,1,1},{0,0,64},{0,0,180},{0,0,100},{0,0,100},{0,0,101},{0,0,164},{0,0,101},{1,1,884},{0,2,218},{0,1,82},{0,1,250},{1,1,884},{2,0,900},{0,1,250},{0,1,1170},{2,0,900},{0,1,1170},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,3,900},{0,2,250},{0,2,314}, +{0,1,314},{0,2,2355},{0,1,1755},{0,1,675},{0,1,1875},{0,1,2716},{0,1,2236},{0,3,900},{0,2,250},{0,2,314},{0,1,314},{0,2,2355},{0,1,1755},{0,1,675},{0,1,1875},{0,1,2355},{0,1,1875},{0,2,25},{0,2,25},{0,2,25},{0,1,25},{0,1,410},{0,0,292},{0,0,292},{0,0,181},{0,0,392},{0,0,217},{0,2,25},{0,2,25},{0,2,25},{0,1,25},{0,1,410}, +{0,0,292},{0,0,292},{0,0,181},{0,0,356},{0,0,181},{2,0,884},{0,2,250},{0,2,314},{0,1,314},{2,0,884},{3,0,884},{0,1,314},{0,1,914},{3,0,884},{0,1,914},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,4,890},{0,3,104},{0,2,90},{0,2,442},{0,2,2995},{0,2,1851},{0,1,995}, +{0,1,1875},{0,1,3356},{0,1,2236},{0,4,890},{0,3,104},{0,2,90},{0,2,442},{1,1,2932},{0,2,1851},{0,1,995},{0,1,1875},{2,0,2900},{0,1,1875},{0,2,9},{0,2,9},{0,2,9},{0,1,9},{0,1,586},{0,1,370},{0,1,370},{0,0,389},{0,0,712},{0,0,425},{0,2,9},{0,2,9},{0,2,9},{0,1,9},{0,1,586},{0,1,370},{0,1,370},{0,0,389},{1,0,650}, +{0,0,389},{1,2,890},{0,3,104},{0,2,90},{0,2,442},{1,2,890},{2,1,890},{0,2,442},{0,1,914},{2,1,890},{0,1,914},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,4,990},{0,3,140},{0,2,158},{0,2,158},{0,3,3048},{0,2,1707},{0,2,747},{0,1,1795},{0,1,3916},{0,1,2156},{0,4,990}, +{0,3,140},{0,2,158},{0,2,158},{0,3,3048},{0,2,1707},{0,2,747},{0,1,1795},{1,1,3048},{0,1,1795},{0,3,40},{0,3,40},{0,3,40},{0,1,157},{0,1,698},{0,1,290},{0,1,290},{0,0,641},{0,0,1076},{0,0,677},{0,3,40},{0,3,40},{0,3,40},{0,1,157},{1,0,666},{0,1,290},{0,1,290},{0,0,641},{1,0,650},{0,0,641},{2,1,890},{0,3,104},{0,2,122}, +{0,2,122},{2,1,890},{4,0,890},{0,2,122},{0,1,1170},{4,0,890},{0,1,1170},{0,0,36},{0,0,36},{0,0,36},{0,0,36},{0,0,0},{0,0,0},{0,0,0},{0,0,16},{0,0,52},{0,0,52},{0,5,1115},{0,4,265},{0,2,689},{0,2,293},{0,4,3096},{0,3,1731},{0,2,324},{0,1,2020},{0,2,4009},{0,1,2381},{0,5,1115},{0,4,265},{1,2,429},{0,2,293},{1,2,3048}, +{0,3,1731},{0,2,324},{0,1,2020},{0,2,3048},{0,1,2020},{0,4,261},{0,4,261},{0,4,261},{0,2,229},{0,2,656},{0,2,260},{0,2,260},{0,1,256},{0,1,1017},{0,1,617},{0,4,261},{0,4,261},{0,4,261},{0,2,229},{0,2,656},{0,2,260},{0,2,260},{0,1,256},{0,1,656},{0,1,256},{3,0,890},{0,4,40},{1,2,68},{0,2,68},{3,0,890},{5,0,890},{0,2,68}, +{0,2,1220},{5,0,890},{0,2,1220},{0,0,225},{0,0,225},{0,0,225},{0,0,225},{0,1,16},{0,1,16},{0,1,16},{0,0,25},{0,0,61},{0,0,61},{0,6,1419},{0,4,569},{0,3,1078},{0,2,821},{0,4,3096},{0,3,1395},{0,2,356},{0,2,1832},{0,2,4201},{0,2,2793},{1,4,1011},{1,3,353},{1,2,413},{1,2,413},{2,1,3048},{0,3,1395},{0,2,356},{0,2,1832},{4,0,3048}, +{0,2,1832},{0,4,533},{0,4,533},{0,4,533},{0,2,565},{0,3,666},{0,2,100},{0,2,100},{0,1,128},{0,1,1209},{0,1,489},{1,2,157},{1,2,157},{1,2,157},{1,2,157},{1,1,650},{0,2,100},{0,2,100},{0,1,128},{1,1,666},{0,1,128},{3,1,890},{0,4,40},{1,2,292},{0,2,292},{3,1,890},{4,1,890},{0,2,292},{0,2,932},{4,1,890},{0,2,932},{0,0,529}, +{0,0,529},{0,0,529},{0,0,529},{0,1,16},{0,1,16},{0,1,16},{0,1,64},{0,0,205},{0,0,205},{0,6,1915},{0,5,1019},{1,3,1269},{0,3,1110},{0,5,3051},{0,3,1443},{0,3,318},{0,2,1384},{0,2,4777},{0,2,2345},{1,5,909},{1,4,131},{1,3,113},{1,3,509},{3,0,3051},{0,3,1443},{0,3,318},{0,2,1384},{3,1,3051},{0,2,1384},{0,5,970},{0,5,970},{0,5,970}, +{0,3,1010},{0,3,698},{0,2,196},{0,2,196},{0,1,256},{0,2,1641},{0,1,617},{1,3,13},{1,3,13},{1,3,13},{1,2,13},{2,0,650},{0,2,196},{0,2,196},{0,1,256},{3,0,650},{0,1,256},{2,3,884},{0,5,58},{1,3,104},{0,3,149},{2,3,884},{6,0,884},{0,3,149},{0,2,900},{6,0,884},{0,2,900},{0,0,961},{0,0,961},{0,0,961},{0,0,961},{0,2,0}, +{0,2,0},{0,2,0},{0,1,0},{0,1,361},{0,1,361},{1,5,2113},{1,4,1271},{1,3,1285},{1,3,1329},{0,6,3123},{0,4,1208},{0,3,30},{0,2,1320},{0,3,5011},{0,2,2281},{1,5,957},{1,4,115},{1,3,129},{1,3,173},{1,4,3051},{0,4,1208},{0,3,30},{0,2,1320},{2,2,3051},{0,2,1320},{1,4,1190},{1,4,1190},{1,4,1190},{1,2,1281},{0,4,648},{0,3,26},{0,3,26}, +{0,2,296},{0,2,1641},{0,1,1001},{1,4,34},{1,4,34},{1,4,34},{1,2,125},{0,4,648},{0,3,26},{0,3,26},{0,2,296},{2,1,648},{0,2,296},{3,2,884},{0,5,26},{1,3,104},{0,3,5},{3,2,884},{5,1,884},{0,3,5},{0,2,1124},{5,1,884},{0,2,1124},{1,0,1181},{1,0,1181},{1,0,1181},{1,0,1181},{0,3,25},{0,3,25},{0,3,25},{0,1,64},{0,1,425}, +{0,1,425},{1,6,1864},{1,5,1038},{1,3,1390},{1,3,1038},{0,6,3132},{0,4,1199},{0,3,201},{0,2,1743},{0,3,4924},{0,2,2332},{1,6,1080},{1,5,254},{2,3,458},{1,3,254},{2,3,3051},{0,4,1163},{0,3,165},{0,2,1707},{6,0,3051},{0,2,1707},{1,4,1016},{1,4,1016},{1,4,1016},{1,3,989},{0,5,716},{0,3,152},{0,3,152},{0,2,62},{0,2,1611},{0,2,651},{1,4,232}, +{1,4,232},{1,4,232},{1,3,205},{1,3,650},{0,3,116},{0,3,116},{0,2,26},{1,2,650},{0,2,26},{4,1,884},{1,5,58},{2,3,58},{1,3,58},{4,1,884},{4,2,884},{1,3,58},{0,3,1274},{4,2,884},{0,3,1274},{1,0,980},{1,0,980},{1,0,980},{1,0,980},{0,3,52},{0,3,52},{0,3,52},{0,2,61},{0,1,458},{0,1,458},{1,7,1784},{1,5,910},{1,4,1441}, +{1,3,1134},{0,7,3247},{0,5,1292},{0,4,567},{0,3,1474},{0,4,4900},{0,3,2178},{2,5,1028},{2,4,362},{2,3,394},{2,3,418},{3,2,3051},{0,5,1096},{1,3,331},{0,3,1278},{5,1,3051},{0,3,1278},{1,5,885},{1,5,885},{1,5,885},{1,3,909},{0,5,876},{0,4,206},{0,4,206},{0,2,254},{0,3,1548},{0,2,347},{2,3,169},{2,3,169},{2,3,169},{2,3,193},{2,2,648}, +{0,4,10},{0,4,10},{0,2,58},{5,0,648},{0,2,58},{5,0,884},{1,5,26},{2,3,250},{1,3,250},{5,0,884},{3,3,884},{1,3,250},{0,3,954},{3,3,884},{0,3,954},{1,0,884},{1,0,884},{1,0,884},{1,0,884},{0,4,197},{0,4,197},{0,4,197},{0,2,205},{0,2,298},{0,2,298},{1,7,1976},{1,6,1124},{1,4,1649},{1,4,1229},{1,6,3204},{0,5,1452},{1,4,525}, +{0,3,1474},{0,4,4420},{0,3,1474},{2,6,930},{2,5,160},{2,4,138},{2,3,546},{4,1,3060},{0,5,968},{0,4,195},{0,3,990},{4,2,3060},{0,3,990},{1,6,1060},{1,6,1060},{1,6,1060},{1,4,1108},{1,4,824},{1,3,314},{1,3,314},{1,2,370},{0,3,1260},{0,2,427},{2,4,17},{2,4,17},{2,4,17},{2,3,17},{3,1,648},{0,4,74},{0,4,74},{1,2,226},{4,1,648}, +{1,2,226},{3,4,882},{1,6,80},{2,4,122},{0,4,146},{3,4,882},{7,1,882},{0,4,146},{0,3,890},{7,1,882},{0,3,890},{1,0,1044},{1,0,1044},{1,0,1044},{1,0,1044},{1,3,145},{1,3,145},{1,3,145},{1,2,145},{0,2,202},{0,2,202},{2,6,2374},{1,6,1476},{2,4,1550},{1,4,1469},{1,6,3172},{1,5,1259},{1,4,61},{1,3,1323},{0,4,4452},{0,3,1282},{2,6,930}, +{2,5,96},{2,4,106},{2,4,194},{5,0,3060},{0,6,1144},{1,4,45},{0,3,1086},{6,1,3060},{0,3,1086},{2,5,1476},{2,5,1476},{2,5,1476},{1,4,1460},{1,5,666},{1,4,52},{1,4,52},{1,3,362},{0,3,1356},{0,3,321},{2,5,32},{2,5,32},{2,5,32},{2,3,97},{4,0,650},{1,4,36},{1,4,36},{0,3,125},{3,2,650},{0,3,125},{4,3,882},{1,6,16},{2,4,90}, +{1,4,9},{4,3,882},{6,2,882},{1,4,9},{0,3,1082},{6,2,882},{0,3,1082},{1,0,1460},{1,0,1460},{1,0,1460},{1,0,1460},{1,4,52},{1,4,52},{1,4,52},{1,2,65},{0,3,200},{0,3,200},{2,7,1892},{2,6,1090},{2,4,1370},{2,4,1062},{1,7,3100},{1,5,1169},{1,4,151},{1,3,1665},{0,5,4036},{0,3,1678},{2,7,1051},{2,6,249},{3,4,493},{2,4,221},{3,4,3060}, +{0,6,883},{1,4,126},{0,4,1528},{7,1,3060},{0,4,1528},{2,5,1035},{2,5,1035},{2,5,1035},{2,4,1026},{1,6,723},{1,4,115},{1,4,115},{1,3,65},{0,4,1004},{0,3,78},{2,5,194},{2,5,194},{2,5,194},{2,4,185},{2,4,648},{1,4,90},{1,4,90},{1,3,40},{7,0,648},{1,3,40},{5,2,882},{2,6,80},{3,4,52},{2,4,52},{5,2,882},{5,3,882},{2,4,52}, +{0,4,1332},{5,3,882},{0,4,1332},{2,0,1010},{2,0,1010},{2,0,1010},{2,0,1010},{1,4,34},{1,4,34},{1,4,34},{1,3,61},{0,3,74},{0,3,74},{2,7,1892},{2,6,898},{2,5,1451},{2,4,1094},{2,6,3501},{1,6,1308},{1,5,589},{1,4,1510},{0,5,3940},{0,4,1116},{3,6,1051},{3,5,377},{3,4,381},{3,4,429},{5,1,3060},{0,6,1059},{2,4,312},{0,4,1016},{6,2,3060}, +{0,4,1016},{2,6,882},{2,6,882},{2,6,882},{2,4,898},{1,6,835},{1,5,189},{1,5,189},{1,3,209},{0,4,1036},{0,3,270},{3,4,185},{3,4,185},{3,4,185},{3,4,233},{3,3,650},{1,5,20},{1,5,20},{1,3,40},{6,1,650},{1,3,40},{6,1,882},{2,6,16},{3,4,212},{2,4,212},{6,1,882},{4,4,882},{2,4,212},{0,4,980},{4,4,882},{0,4,980},{2,0,882}, +{2,0,882},{2,0,882},{2,0,882},{1,5,173},{1,5,173},{1,5,173},{1,3,173},{0,4,136},{0,4,136},{2,7,2404},{2,7,1116},{2,5,1595},{2,5,1235},{2,7,3244},{1,6,1404},{2,5,619},{1,4,1446},{0,6,3804},{0,4,892},{3,7,957},{3,6,195},{3,5,169},{3,4,509},{6,0,3060},{0,7,936},{1,5,196},{0,4,888},{3,4,3060},{0,4,888},{2,7,1035},{2,7,1035},{2,7,1035}, +{2,5,1091},{2,5,835},{2,4,317},{2,4,317},{2,3,369},{0,5,875},{1,3,396},{3,5,25},{3,5,25},{3,5,25},{3,4,25},{4,2,650},{1,5,52},{1,5,52},{2,3,200},{5,2,650},{2,3,200},{7,0,884},{2,7,106},{3,5,144},{1,5,160},{7,0,884},{3,5,884},{1,5,160},{0,4,884},{3,5,884},{0,4,884},{2,0,1010},{2,0,1010},{2,0,1010},{2,0,1010},{2,4,173}, +{2,4,173},{2,4,173},{2,3,173},{0,4,8},{0,4,8},{3,7,2430},{2,7,1404},{3,5,1610},{2,5,1411},{2,7,3148},{2,6,1309},{2,5,91},{2,4,1325},{0,6,3484},{0,4,1180},{3,7,909},{3,6,83},{3,5,89},{3,5,221},{4,4,3051},{0,7,1000},{2,5,66},{1,4,1053},{7,2,3051},{1,4,1053},{2,7,1403},{2,7,1403},{2,7,1403},{2,5,1395},{2,6,681},{2,5,75},{2,5,75}, +{2,4,425},{0,5,795},{0,4,280},{3,6,34},{3,6,34},{3,6,34},{3,4,73},{5,1,656},{2,5,50},{2,5,50},{1,4,153},{7,1,656},{1,4,153},{5,4,884},{2,7,10},{3,5,80},{2,5,17},{5,4,884},{7,3,884},{2,5,17},{0,4,1044},{7,3,884},{0,4,1044},{2,0,1394},{2,0,1394},{2,0,1394},{2,0,1394},{2,4,61},{2,4,61},{2,4,61},{2,3,61},{0,4,136}, +{0,4,136},{3,7,2214},{3,7,1150},{3,5,1358},{3,5,1094},{2,7,3652},{2,6,1147},{2,5,109},{2,4,1595},{0,7,3724},{0,5,1402},{3,7,1314},{3,7,250},{3,5,458},{3,5,194},{5,3,3060},{1,7,888},{2,5,93},{0,5,1398},{6,3,3060},{0,5,1398},{3,6,1060},{3,6,1060},{3,6,1060},{3,5,1069},{2,7,736},{2,5,84},{2,5,84},{2,4,74},{0,6,820},{1,4,81},{3,6,160}, +{3,6,160},{3,6,160},{3,5,169},{6,0,650},{2,5,68},{2,5,68},{1,4,45},{3,4,650},{1,4,45},{6,3,884},{3,7,106},{4,5,50},{3,5,50},{6,3,884},{6,4,884},{3,5,50},{0,5,1394},{6,4,884},{0,5,1394},{3,0,1044},{3,0,1044},{3,0,1044},{3,0,1044},{2,5,20},{2,5,20},{2,5,20},{2,4,65},{0,5,8},{0,5,8},{3,7,2566},{3,7,894},{3,6,1469}, +{3,5,1062},{3,7,3535},{2,7,1332},{2,6,619},{2,5,1554},{0,7,3276},{0,5,1146},{4,7,1080},{4,6,398},{4,5,374},{4,5,446},{6,2,3051},{1,7,1016},{3,5,299},{0,5,1046},{5,4,3051},{0,5,1046},{3,7,885},{3,7,885},{3,7,885},{3,5,893},{2,7,800},{2,6,178},{2,6,178},{2,4,170},{0,6,660},{1,4,225},{4,5,205},{4,5,205},{4,5,205},{4,5,277},{5,2,656}, +{2,6,34},{2,6,34},{2,4,26},{7,2,656},{2,4,26},{7,2,884},{3,7,10},{4,5,178},{3,5,178},{7,2,884},{5,5,884},{3,5,178},{0,5,1010},{5,5,884},{0,5,1010},{3,0,884},{3,0,884},{3,0,884},{3,0,884},{2,6,153},{2,6,153},{2,6,153},{2,4,145},{0,5,136},{0,5,136},{4,7,3320},{3,7,1150},{3,6,1549},{3,6,1249},{3,7,3487},{2,7,1364},{2,6,603}, +{2,5,1426},{0,7,3340},{1,5,892},{4,7,1016},{4,7,236},{4,6,206},{4,5,478},{7,1,3051},{2,7,964},{2,6,203},{1,5,883},{4,5,3051},{1,5,883},{3,7,1029},{3,7,1029},{3,7,1029},{3,6,1080},{3,6,852},{3,5,326},{3,5,326},{3,4,374},{0,6,884},{2,4,371},{4,6,37},{4,6,37},{4,6,37},{4,5,37},{6,1,656},{2,6,34},{2,6,34},{3,4,178},{6,3,656}, +{3,4,178},{5,6,890},{3,7,170},{4,6,170},{2,6,178},{5,6,890},{4,6,890},{2,6,178},{0,5,882},{4,6,890},{0,5,882},{3,0,980},{3,0,980},{3,0,980},{3,0,980},{3,5,205},{3,5,205},{3,5,205},{3,4,205},{1,5,10},{1,5,10},{4,7,2936},{4,7,1676},{4,6,1678},{3,6,1361},{3,7,3951},{3,7,1367},{3,6,129},{3,5,1335},{1,7,3496},{1,5,1116},{4,7,1336}, +{4,7,76},{4,6,78},{4,6,254},{5,5,3048},{2,7,1124},{3,6,93},{2,5,1026},{3,6,3048},{2,5,1026},{3,7,1557},{3,7,1557},{3,7,1557},{3,6,1336},{3,7,702},{3,6,104},{3,6,104},{3,5,494},{0,7,667},{1,5,275},{4,7,40},{4,7,40},{4,7,40},{4,5,53},{7,0,650},{3,6,68},{3,6,68},{2,5,185},{3,5,650},{2,5,185},{7,3,890},{4,7,72},{4,6,74}, +{3,6,29},{7,3,890},{6,5,890},{3,6,29},{0,5,1010},{6,5,890},{0,5,1010},{3,0,1332},{3,0,1332},{3,0,1332},{3,0,1332},{3,5,61},{3,5,61},{3,5,61},{3,4,61},{1,5,106},{1,5,106},{4,7,3116},{4,7,1316},{4,6,1354},{4,6,1134},{4,7,4084},{3,7,1133},{3,6,75},{3,5,1533},{1,7,3676},{1,6,1470},{5,7,1429},{4,7,355},{4,6,393},{4,6,173},{6,4,3051}, +{3,7,1124},{3,6,66},{1,6,1469},{7,4,3051},{1,6,1469},{4,7,1091},{4,7,1091},{4,7,1091},{4,6,1118},{3,7,729},{3,6,59},{3,6,59},{3,5,89},{0,7,820},{2,5,90},{4,7,130},{4,7,130},{4,7,130},{4,6,157},{7,1,656},{3,6,50},{3,6,50},{2,5,41},{7,3,656},{2,5,41},{7,4,890},{4,7,234},{5,6,52},{4,6,52},{7,4,890},{7,5,890},{4,6,52}, +{0,5,1460},{7,5,890},{0,5,1460},{4,0,1082},{4,0,1082},{4,0,1082},{4,0,1082},{3,6,10},{3,6,10},{3,6,10},{3,5,73},{1,6,10},{1,6,10},{4,7,3820},{4,7,1540},{4,7,1495},{4,6,1038},{4,7,4084},{3,7,1469},{3,6,571},{3,6,1606},{2,7,3916},{1,6,1150},{5,7,1349},{5,7,425},{5,6,373},{5,6,469},{7,3,3048},{3,7,1348},{4,6,292},{1,6,1069},{6,5,3048}, +{1,6,1069},{4,7,1011},{4,7,1011},{4,7,1011},{4,6,894},{3,7,1161},{3,7,173},{3,7,173},{3,5,137},{1,7,659},{2,5,186},{5,6,229},{5,6,229},{5,6,229},{5,6,325},{6,3,650},{3,7,52},{3,7,52},{3,5,16},{6,4,650},{3,5,16},{6,6,890},{5,7,200},{5,6,148},{4,6,148},{6,6,890},{6,6,890},{4,6,148},{0,6,1044},{6,6,890},{0,6,1044},{4,0,890}, +{4,0,890},{4,0,890},{4,0,890},{3,7,137},{3,7,137},{3,7,137},{3,5,121},{1,6,106},{1,6,106},{5,7,4054},{4,7,2276},{4,7,1511},{4,7,1271},{4,7,4596},{4,7,1596},{3,7,577},{3,6,1414},{2,7,4204},{2,6,900},{5,7,1653},{5,7,377},{5,7,249},{5,6,453},{5,7,3048},{4,7,1371},{3,7,216},{2,6,884},{5,6,3048},{2,6,884},{4,7,1315},{4,7,1315},{4,7,1315}, +{4,6,1054},{4,7,875},{4,6,341},{4,6,341},{4,5,385},{1,7,835},{3,5,352},{5,7,53},{5,7,53},{5,7,53},{5,6,53},{7,2,650},{3,7,20},{3,7,20},{4,5,160},{5,5,650},{4,5,160},{7,5,890},{5,7,328},{5,7,200},{3,7,200},{7,5,890},{5,7,900},{3,7,200},{0,6,884},{5,7,900},{0,6,884},{4,0,954},{4,0,954},{4,0,954},{4,0,954},{4,6,241}, +{4,6,241},{4,6,241},{4,5,241},{2,6,16},{2,6,16},{5,7,4022},{5,7,2394},{5,7,1754},{4,7,1319},{5,7,4921},{4,7,1660},{4,7,175},{4,6,1353},{3,7,4380},{2,6,1060},{6,7,2021},{5,7,713},{5,7,73},{5,7,293},{6,6,3051},{4,7,1611},{4,7,126},{3,6,1005},{4,7,3051},{3,6,1005},{5,7,1718},{5,7,1718},{5,7,1718},{4,7,1283},{4,7,859},{4,7,139},{4,7,139}, +{4,5,465},{2,7,779},{2,6,276},{5,7,37},{5,7,37},{5,7,37},{5,6,37},{5,6,648},{4,7,90},{4,7,90},{3,6,221},{4,6,648},{3,6,221},{7,6,900},{6,7,452},{5,7,72},{4,7,45},{7,6,900},{7,6,884},{4,7,45},{0,6,980},{7,6,884},{0,6,980},{4,0,1274},{4,0,1274},{4,0,1274},{4,0,1274},{4,6,65},{4,6,65},{4,6,65},{4,5,65},{2,6,80}, +{2,6,80},{5,7,4265},{5,7,2373},{5,7,1349},{5,7,1173},{5,7,4606},{4,7,2065},{4,7,40},{4,6,1266},{3,7,4455},{3,6,1261},{6,7,1649},{6,7,1025},{5,7,325},{5,7,149},{7,5,2817},{5,7,1514},{4,7,36},{3,6,1197},{6,6,2841},{3,6,1197},{5,7,1349},{5,7,1349},{5,7,1349},{5,7,1173},{4,7,1300},{4,7,40},{4,7,40},{4,6,110},{2,7,1040},{3,6,105},{5,7,325}, +{5,7,325},{5,7,325},{5,7,149},{6,5,650},{4,7,36},{4,7,36},{3,6,41},{3,7,650},{3,6,41},{7,6,801},{6,7,449},{6,7,49},{4,7,36},{7,6,801},{6,7,761},{4,7,36},{0,6,1181},{6,7,761},{0,6,1181},{5,0,1124},{5,0,1124},{5,0,1124},{5,0,1124},{4,7,4},{4,7,4},{4,7,4},{4,6,85},{2,7,16},{2,7,16},{5,7,4345},{5,7,2453},{5,7,1429}, +{5,7,901},{5,7,4190},{5,7,1770},{4,7,360},{4,6,1266},{4,7,3861},{2,7,1041},{6,7,1281},{6,7,657},{6,7,257},{5,7,325},{6,7,2250},{5,7,1194},{5,7,170},{2,7,977},{5,7,2250},{2,7,977},{5,7,1429},{5,7,1429},{5,7,1429},{5,7,901},{5,7,1274},{4,7,360},{4,7,360},{4,6,110},{3,7,979},{3,6,153},{6,7,257},{6,7,257},{6,7,257},{5,7,325},{7,4,648}, +{5,7,170},{5,7,170},{4,6,10},{7,5,648},{4,6,10},{7,7,521},{6,7,401},{6,7,1},{5,7,1},{7,7,521},{6,7,521},{5,7,1},{0,7,961},{6,7,521},{0,7,961},{5,0,900},{5,0,900},{5,0,900},{5,0,900},{4,7,164},{4,7,164},{4,7,164},{4,6,101},{2,7,80},{2,7,80},{6,7,3669},{5,7,2917},{5,7,1893},{5,7,1013},{5,7,4158},{5,7,1386},{5,7,362}, +{4,7,1049},{4,7,3381},{3,7,555},{6,7,1169},{6,7,545},{6,7,145},{6,7,73},{7,6,1802},{5,7,1130},{5,7,106},{3,7,530},{7,6,1770},{3,7,530},{5,7,1893},{5,7,1893},{5,7,1893},{5,7,1013},{5,7,1242},{5,7,362},{5,7,362},{5,6,402},{3,7,1251},{4,6,339},{6,7,145},{6,7,145},{6,7,145},{6,7,73},{7,5,680},{5,7,106},{5,7,106},{5,6,146},{6,6,648}, +{5,6,146},{7,7,265},{7,7,193},{6,7,81},{6,7,9},{7,7,265},{7,7,305},{6,7,9},{0,7,529},{7,7,305},{0,7,529},{5,0,932},{5,0,932},{5,0,932},{5,0,932},{5,7,281},{5,7,281},{5,7,281},{5,6,281},{3,7,26},{3,7,26},{6,7,3077},{6,7,2453},{6,7,2053},{5,7,1509},{6,7,3438},{5,7,1386},{5,7,362},{5,7,650},{5,7,3195},{3,7,283},{7,7,1293}, +{6,7,689},{6,7,289},{6,7,25},{7,6,1386},{6,7,786},{5,7,298},{4,7,261},{6,7,1386},{4,7,261},{6,7,2053},{6,7,2053},{6,7,2053},{5,7,1509},{5,7,1594},{5,7,362},{5,7,362},{5,6,434},{4,7,1260},{3,7,283},{6,7,289},{6,7,289},{6,7,289},{6,7,25},{6,7,650},{5,7,298},{5,7,298},{4,7,261},{5,7,650},{4,7,261},{7,7,137},{7,7,65},{7,7,16}, +{6,7,25},{7,7,137},{7,7,113},{6,7,25},{0,7,225},{7,7,113},{0,7,225},{5,0,1220},{5,0,1220},{5,0,1220},{5,0,1220},{5,7,73},{5,7,73},{5,7,73},{5,6,73},{3,7,58},{3,7,58},{6,7,2870},{6,7,2246},{6,7,1846},{6,7,1366},{6,7,2889},{6,7,1785},{5,7,821},{5,7,137},{5,7,2700},{4,7,126},{7,7,771},{7,7,699},{7,7,650},{6,7,277},{7,7,1107}, +{6,7,696},{6,7,296},{4,7,45},{6,7,1080},{4,7,45},{6,7,1846},{6,7,1846},{6,7,1846},{6,7,1366},{6,7,1865},{5,7,821},{5,7,821},{5,7,137},{4,7,1611},{4,7,126},{7,7,650},{7,7,650},{7,7,650},{6,7,277},{7,6,648},{6,7,296},{6,7,296},{4,7,45},{7,6,680},{4,7,45},{7,7,146},{7,7,74},{7,7,25},{7,7,1},{7,7,146},{7,7,50},{7,7,1}, +{0,7,36},{7,7,50},{0,7,36},{6,0,1170},{6,0,1170},{6,0,1170},{6,0,1170},{5,7,145},{5,7,145},{5,7,145},{5,7,101},{4,7,90},{4,7,90},{6,7,2962},{6,7,2338},{6,7,1938},{6,7,1314},{6,7,2677},{6,7,1429},{6,7,1029},{5,7,85},{5,7,2536},{4,7,122},{7,7,531},{7,7,459},{7,7,410},{7,7,338},{7,7,771},{7,7,627},{6,7,404},{5,7,4},{7,7,827}, +{5,7,4},{6,7,1938},{6,7,1938},{6,7,1938},{6,7,1314},{6,7,1653},{6,7,1029},{6,7,1029},{5,7,85},{5,7,1512},{4,7,122},{7,7,410},{7,7,410},{7,7,410},{7,7,338},{7,7,650},{6,7,404},{6,7,404},{5,7,4},{6,7,596},{5,7,4},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{6,0,914}, +{6,0,914},{6,0,914},{6,0,914},{5,7,481},{5,7,481},{5,7,481},{5,7,85},{4,7,122},{4,7,122},{7,7,2924},{6,7,2338},{6,7,1938},{6,7,1314},{6,7,2373},{6,7,1125},{6,7,725},{5,7,325},{6,7,2132},{5,7,232},{7,7,323},{7,7,251},{7,7,202},{7,7,130},{7,7,467},{7,7,323},{7,7,274},{5,7,36},{7,7,459},{5,7,36},{6,7,1938},{6,7,1938},{6,7,1938}, +{6,7,1314},{6,7,1349},{6,7,725},{6,7,725},{5,7,325},{5,7,1256},{5,7,232},{7,7,202},{7,7,202},{7,7,202},{7,7,130},{7,7,346},{7,7,274},{7,7,274},{5,7,36},{7,7,410},{5,7,36},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{6,0,914},{6,0,914},{6,0,914},{6,0,914},{6,7,325}, +{6,7,325},{6,7,325},{5,7,325},{5,7,232},{5,7,232},{7,7,2092},{7,7,2020},{7,7,1971},{6,7,1570},{7,7,2140},{6,7,1077},{6,7,677},{6,7,85},{6,7,1588},{5,7,232},{7,7,243},{7,7,171},{7,7,122},{7,7,50},{7,7,291},{7,7,147},{7,7,98},{6,7,4},{7,7,219},{6,7,4},{7,7,1971},{7,7,1971},{7,7,1971},{6,7,1570},{6,7,1301},{6,7,677},{6,7,677}, +{6,7,85},{6,7,1188},{5,7,232},{7,7,122},{7,7,122},{7,7,122},{7,7,50},{7,7,170},{7,7,98},{7,7,98},{6,7,4},{7,7,170},{6,7,4},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{6,0,1170},{6,0,1170},{6,0,1170},{6,0,1170},{6,7,277},{6,7,277},{6,7,277},{6,7,85},{5,7,232}, +{5,7,232},{0,4,1618},{0,3,436},{0,2,74},{0,2,866},{0,2,3411},{0,2,2531},{0,1,1251},{0,1,2531},{0,1,3772},{0,1,2892},{0,4,1618},{0,3,436},{0,2,74},{0,2,866},{0,2,3411},{0,2,2531},{0,1,1251},{0,1,2531},{2,0,3376},{0,1,2531},{0,1,25},{0,1,25},{0,1,25},{0,1,49},{0,0,360},{0,0,232},{0,0,232},{0,0,149},{0,0,332},{0,0,185},{0,1,25}, +{0,1,25},{0,1,25},{0,1,49},{0,0,360},{0,0,232},{0,0,232},{0,0,149},{0,0,296},{0,0,149},{1,2,1570},{0,3,436},{0,2,74},{0,2,866},{1,2,1570},{0,2,1570},{0,2,866},{0,1,1570},{0,2,1570},{0,1,1570},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,4,1586},{0,3,340},{0,2,10}, +{0,2,450},{0,3,4016},{0,2,2627},{0,2,1411},{0,1,2691},{0,1,4572},{0,1,3052},{0,4,1586},{0,3,340},{0,2,10},{0,2,450},{1,1,3968},{0,2,2627},{0,2,1411},{0,1,2691},{2,0,4016},{0,1,2691},{0,2,1},{0,2,1},{0,2,1},{0,1,1},{0,1,530},{0,1,362},{0,1,362},{0,0,325},{0,0,620},{0,0,361},{0,2,1},{0,2,1},{0,2,1},{0,1,1},{0,1,530}, +{0,1,362},{0,1,362},{0,0,325},{0,0,584},{0,0,325},{2,1,1570},{0,3,340},{0,2,10},{0,2,450},{2,1,1570},{4,0,1570},{0,2,450},{0,1,1730},{4,0,1570},{0,1,1730},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,5,1576},{0,4,290},{0,2,202},{0,2,290},{0,3,4656},{0,2,2979},{0,2,1251}, +{0,1,3107},{0,1,5628},{0,1,3468},{0,5,1576},{0,4,290},{0,2,202},{0,2,290},{0,3,4656},{0,2,2979},{0,2,1251},{0,1,3107},{1,1,4656},{0,1,3107},{0,3,16},{0,3,16},{0,3,16},{0,1,81},{0,1,802},{0,1,442},{0,1,442},{0,0,629},{0,0,1036},{0,0,665},{0,3,16},{0,3,16},{0,3,16},{0,1,81},{0,1,802},{0,1,442},{0,1,442},{0,0,629},{1,0,818}, +{0,0,629},{3,0,1576},{0,4,290},{0,2,202},{0,2,290},{3,0,1576},{3,1,1576},{0,2,290},{0,1,2146},{3,1,1576},{0,1,2146},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,5,1640},{0,4,162},{0,3,241},{0,2,386},{0,4,5539},{0,3,3512},{0,2,1347},{0,1,3779},{0,2,6396},{0,1,4140},{0,5,1640}, +{0,4,162},{0,3,241},{0,2,386},{1,2,5435},{0,3,3512},{0,2,1347},{0,1,3779},{0,2,5435},{0,1,3779},{0,3,16},{0,3,16},{0,3,16},{0,2,25},{0,1,1202},{0,1,650},{0,1,650},{0,1,970},{0,0,1580},{0,0,1097},{0,3,16},{0,3,16},{0,3,16},{0,2,25},{1,0,1170},{0,1,650},{0,1,650},{0,1,970},{1,0,1154},{0,1,970},{2,2,1576},{0,4,162},{0,3,241}, +{0,2,386},{2,2,1576},{5,0,1576},{0,2,386},{0,2,1730},{5,0,1576},{0,2,1730},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,6,1667},{0,5,259},{0,3,286},{0,3,406},{0,4,5440},{0,3,3035},{0,2,1284},{0,2,3504},{0,2,6513},{0,2,4465},{0,6,1667},{0,5,259},{0,3,286},{0,3,406},{2,1,5424}, +{0,3,3035},{0,2,1284},{0,2,3504},{4,0,5424},{0,2,3504},{0,4,81},{0,4,81},{0,4,81},{0,2,97},{0,2,1160},{0,2,500},{0,2,500},{0,1,520},{0,1,1521},{0,1,881},{0,4,81},{0,4,81},{0,4,81},{0,2,97},{0,2,1160},{0,2,500},{0,2,500},{0,1,520},{0,1,1160},{0,1,520},{2,3,1576},{0,5,178},{1,3,100},{0,3,325},{2,3,1576},{6,0,1576},{0,3,325}, +{0,2,1568},{6,0,1576},{0,2,1568},{0,0,81},{0,0,81},{0,0,81},{0,0,81},{0,0,9},{0,0,9},{0,0,9},{0,0,1},{0,0,37},{0,0,37},{0,7,1865},{0,5,339},{0,3,734},{0,3,374},{0,5,5435},{0,3,3019},{0,3,814},{0,2,2992},{0,2,7025},{0,2,3953},{1,5,1865},{0,5,339},{1,3,293},{0,3,374},{3,0,5435},{0,3,3019},{0,3,814},{0,2,2992},{3,1,5435}, +{0,2,2992},{0,5,314},{0,5,314},{0,5,314},{0,3,370},{0,3,1170},{0,2,340},{0,2,340},{0,1,392},{0,1,1713},{0,1,753},{1,3,289},{1,3,289},{1,3,289},{1,2,289},{1,1,1154},{0,2,340},{0,2,340},{0,1,392},{1,1,1170},{0,1,392},{4,0,1576},{0,5,50},{1,3,4},{0,3,85},{4,0,1576},{5,1,1576},{0,3,85},{0,2,1696},{5,1,1576},{0,2,1696},{0,0,289}, +{0,0,289},{0,0,289},{0,0,289},{0,1,4},{0,1,4},{0,1,4},{0,0,49},{0,0,85},{0,0,85},{0,7,2265},{0,6,787},{1,3,1401},{0,3,726},{0,5,5515},{0,4,2664},{0,3,462},{0,2,2864},{0,3,7363},{0,2,3825},{1,6,1667},{1,5,405},{1,3,245},{1,3,377},{2,2,5427},{0,4,2664},{0,3,462},{0,2,2864},{5,0,5427},{0,2,2864},{0,5,634},{0,5,634},{0,5,634}, +{0,3,626},{0,3,1202},{0,3,362},{0,3,362},{0,1,520},{0,2,2145},{0,1,881},{1,4,106},{1,4,106},{1,4,106},{1,2,145},{2,0,1154},{0,3,362},{0,3,362},{0,1,520},{3,0,1154},{0,1,520},{2,4,1576},{0,6,162},{1,3,164},{0,3,101},{2,4,1576},{7,0,1576},{0,3,101},{0,2,2080},{7,0,1576},{0,2,2080},{0,0,625},{0,0,625},{0,0,625},{0,0,625},{0,1,36}, +{0,1,36},{0,1,36},{0,1,36},{0,0,261},{0,0,261},{1,6,2775},{0,6,1091},{1,4,1422},{0,3,1462},{0,6,5427},{0,4,2536},{0,3,494},{0,2,3120},{0,3,7635},{0,2,4081},{1,6,1619},{1,5,165},{1,4,266},{1,3,361},{3,1,5427},{0,4,2536},{0,3,494},{0,2,3120},{4,1,5427},{0,2,3120},{0,6,1090},{0,6,1090},{0,6,1090},{0,3,1138},{0,4,1152},{0,3,170},{0,3,170}, +{0,2,416},{0,2,2145},{0,1,1265},{1,4,10},{1,4,10},{1,4,10},{1,3,37},{0,4,1152},{0,3,170},{0,3,170},{0,2,416},{2,1,1152},{0,2,416},{3,3,1570},{0,6,2},{1,4,265},{1,3,360},{3,3,1570},{6,1,1570},{1,3,360},{0,3,1768},{6,1,1570},{0,3,1768},{0,0,1089},{0,0,1089},{0,0,1089},{0,0,1089},{0,2,4},{0,2,4},{0,2,4},{0,1,4},{0,1,365}, +{0,1,365},{1,7,2796},{1,6,1432},{1,4,1413},{1,4,1593},{0,7,5435},{0,5,2360},{0,4,299},{0,3,2594},{0,3,8400},{0,3,4530},{1,7,1640},{1,6,276},{1,4,257},{1,4,437},{4,0,5427},{0,5,2360},{0,4,299},{0,3,2594},{3,2,5427},{0,3,2594},{1,5,1221},{1,5,1221},{1,5,1221},{1,3,1229},{0,5,1184},{0,4,250},{0,4,250},{0,2,146},{0,2,2451},{0,2,1107},{1,5,65}, +{1,5,65},{1,5,65},{1,3,73},{1,3,1154},{0,4,250},{0,4,250},{0,2,146},{1,2,1154},{0,2,146},{4,2,1576},{0,6,128},{2,4,130},{0,4,74},{4,2,1576},{5,2,1576},{0,4,74},{0,3,1570},{5,2,1576},{0,3,1570},{1,0,1220},{1,0,1220},{1,0,1220},{1,0,1220},{0,3,4},{0,3,4},{0,3,4},{0,1,121},{0,1,482},{0,1,482},{1,7,3180},{1,6,1464},{1,4,1813}, +{1,4,1513},{0,7,5515},{0,5,2168},{0,4,59},{0,3,2242},{0,4,8764},{0,3,4178},{2,6,1894},{1,6,308},{2,4,326},{1,4,357},{2,4,5427},{0,5,2168},{0,4,59},{0,3,2242},{7,0,5427},{0,3,2242},{1,6,1448},{1,6,1448},{1,6,1448},{1,4,1512},{0,5,1184},{0,4,58},{0,4,58},{0,2,178},{0,2,2995},{0,2,1139},{1,6,292},{1,6,292},{1,6,292},{2,3,325},{2,2,1152}, +{0,4,58},{0,4,58},{0,2,178},{5,0,1152},{0,2,178},{5,1,1570},{0,7,34},{2,4,2},{0,4,10},{5,1,1570},{4,3,1570},{0,4,10},{0,3,1666},{4,3,1570},{0,3,1666},{1,0,1412},{1,0,1412},{1,0,1412},{1,0,1412},{0,3,36},{0,3,36},{0,3,36},{0,2,9},{0,1,722},{0,1,722},{1,7,3816},{1,6,1748},{1,5,2450},{1,4,1685},{0,7,5983},{0,6,2180},{0,4,207}, +{0,3,2278},{0,4,9004},{0,3,4038},{2,7,1700},{2,6,462},{2,4,230},{2,4,406},{3,3,5420},{0,6,2176},{0,4,203},{0,3,2274},{6,1,5420},{0,3,2274},{1,6,1604},{1,6,1604},{1,6,1604},{1,4,1604},{0,6,1156},{0,4,126},{0,4,126},{0,3,429},{0,3,3044},{0,2,1307},{2,5,136},{2,5,136},{2,5,136},{2,3,149},{3,1,1152},{0,4,122},{0,4,122},{0,3,425},{4,1,1152}, +{0,3,425},{6,0,1570},{0,7,130},{2,4,130},{1,4,85},{6,0,1570},{3,4,1570},{1,4,85},{0,3,2018},{3,4,1570},{0,3,2018},{1,0,1600},{1,0,1600},{1,0,1600},{1,0,1600},{0,4,5},{0,4,5},{0,4,5},{0,2,29},{0,2,866},{0,2,866},{1,7,4520},{1,7,1608},{1,5,2418},{1,4,1925},{1,7,5996},{0,6,1956},{0,5,409},{0,4,2751},{0,5,9020},{0,3,3846},{2,7,1604}, +{2,6,174},{2,5,297},{2,4,342},{4,2,5420},{0,6,1856},{0,5,309},{0,4,2651},{5,2,5420},{0,4,2651},{1,7,1604},{1,7,1604},{1,7,1604},{1,4,1636},{0,7,1302},{0,5,120},{0,5,120},{0,3,189},{0,3,2820},{0,3,1245},{2,5,8},{2,5,8},{2,5,8},{2,4,53},{4,0,1154},{0,5,20},{0,5,20},{0,3,89},{3,2,1154},{0,3,89},{4,4,1568},{1,7,8},{2,5,293}, +{0,5,293},{4,4,1568},{7,2,1568},{0,5,293},{0,4,1810},{7,2,1568},{0,4,1810},{1,0,1600},{1,0,1600},{1,0,1600},{1,0,1600},{0,5,116},{0,5,116},{0,5,116},{0,3,164},{0,2,610},{0,2,610},{2,7,4356},{1,7,2004},{2,5,2635},{1,5,2006},{1,7,5924},{0,6,2316},{0,5,499},{0,4,2337},{0,5,8300},{0,4,3420},{2,7,1955},{2,7,299},{2,5,234},{2,5,474},{5,1,5420}, +{0,6,1955},{0,5,138},{0,4,1976},{4,3,5420},{0,4,1976},{1,7,1955},{1,7,1955},{1,7,1955},{1,5,1942},{1,6,1427},{0,5,435},{0,5,435},{0,3,378},{0,4,2628},{0,3,642},{2,6,53},{2,6,53},{2,6,53},{2,4,53},{2,4,1152},{0,5,74},{0,5,74},{0,3,17},{7,0,1152},{0,3,17},{5,3,1570},{1,7,98},{3,5,164},{1,5,100},{5,3,1570},{6,3,1570},{1,5,100}, +{0,4,1576},{6,3,1570},{0,4,1576},{1,0,1906},{1,0,1906},{1,0,1906},{1,0,1906},{1,4,234},{1,4,234},{1,4,234},{1,2,325},{0,3,626},{0,3,626},{2,7,4356},{2,7,1964},{2,5,2267},{2,5,2027},{1,7,6404},{1,6,2220},{1,5,117},{1,4,2314},{0,5,8204},{0,4,2684},{3,7,1929},{2,7,283},{3,5,365},{2,5,346},{6,0,5420},{0,7,1712},{1,5,68},{0,4,1784},{3,4,5420}, +{0,4,1784},{2,6,1942},{2,6,1942},{2,6,1942},{2,4,2006},{1,6,1219},{1,5,117},{1,5,117},{1,3,209},{0,4,2340},{0,3,514},{2,6,261},{2,6,261},{2,6,261},{2,4,325},{3,3,1154},{0,6,50},{0,6,50},{1,3,160},{6,1,1154},{1,3,160},{6,2,1568},{2,7,58},{3,5,4},{1,5,4},{6,2,1568},{5,4,1568},{1,5,4},{0,4,1640},{5,4,1568},{0,4,1640},{2,0,1906}, +{2,0,1906},{2,0,1906},{2,0,1906},{1,4,74},{1,4,74},{1,4,74},{1,3,65},{0,3,370},{0,3,370},{2,7,4868},{2,7,1740},{2,5,2411},{2,5,1691},{2,7,6548},{1,7,2244},{1,5,165},{1,4,2250},{0,6,7668},{0,4,2460},{3,7,1817},{3,7,525},{3,5,221},{3,5,441},{4,4,5419},{0,7,1712},{1,5,164},{0,4,1976},{7,2,5419},{0,4,1976},{2,7,1619},{2,7,1619},{2,7,1619}, +{2,5,1627},{1,7,1155},{1,5,101},{1,5,101},{1,3,417},{0,5,2379},{0,4,696},{3,5,157},{3,5,157},{3,5,157},{3,4,157},{4,2,1154},{0,6,82},{0,6,82},{0,4,212},{5,2,1154},{0,4,212},{7,1,1568},{2,7,122},{3,5,100},{2,5,73},{7,1,1568},{4,5,1568},{2,5,73},{0,4,1960},{4,5,1568},{0,4,1960},{2,0,1618},{2,0,1618},{2,0,1618},{2,0,1618},{1,5,1}, +{1,5,1},{1,5,1},{1,3,17},{0,3,370},{0,3,370},{3,7,5570},{2,7,2028},{2,6,2394},{2,5,1867},{2,7,6452},{1,7,1956},{1,6,439},{1,4,2698},{0,6,7348},{0,4,2748},{3,7,2089},{3,7,189},{3,6,334},{3,5,329},{5,3,5419},{1,7,1875},{1,6,358},{0,5,2145},{6,3,5419},{0,5,2145},{2,7,1667},{2,7,1667},{2,7,1667},{2,5,1611},{1,7,1331},{1,6,115},{1,6,115}, +{1,4,198},{0,5,1979},{0,4,248},{3,6,10},{3,6,10},{3,6,10},{3,5,73},{5,1,1160},{1,6,34},{1,6,34},{0,4,52},{7,1,1160},{0,4,52},{5,5,1570},{3,7,180},{4,5,320},{2,5,281},{5,5,1570},{3,6,1570},{2,5,281},{0,5,1856},{3,6,1570},{0,5,1856},{2,0,1586},{2,0,1586},{2,0,1586},{2,0,1586},{1,6,106},{1,6,106},{1,6,106},{1,4,162},{0,4,212}, +{0,4,212},{3,7,5354},{3,7,2770},{3,6,2717},{2,6,1986},{2,7,6956},{1,7,2244},{1,6,457},{1,5,2351},{0,7,7268},{0,5,1974},{4,7,2384},{3,7,270},{3,6,217},{3,6,517},{6,2,5419},{1,7,1920},{1,6,133},{0,5,1650},{5,4,5419},{0,5,1650},{2,7,2180},{2,7,2180},{2,7,2180},{2,6,1905},{2,7,1480},{1,6,376},{1,6,376},{1,4,333},{0,5,1988},{0,4,203},{3,7,45}, +{3,7,45},{3,7,45},{3,5,37},{6,0,1154},{1,6,52},{1,6,52},{1,4,9},{3,4,1154},{1,4,9},{6,4,1568},{3,7,234},{3,6,181},{1,6,117},{6,4,1568},{7,4,1568},{1,6,117},{0,5,1586},{7,4,1568},{0,5,1586},{2,0,1856},{2,0,1856},{2,0,1856},{2,0,1856},{2,5,272},{2,5,272},{2,5,272},{1,4,324},{0,4,194},{0,4,194},{3,7,5706},{3,7,2514},{3,6,2285}, +{3,6,2105},{3,7,7359},{2,7,2244},{2,6,147},{2,5,2358},{0,7,6820},{0,5,1718},{4,7,2256},{3,7,750},{4,6,410},{3,6,341},{7,1,5419},{2,7,2180},{2,6,83},{0,5,1618},{4,5,5419},{0,5,1618},{3,7,1985},{3,7,1985},{3,7,1985},{3,5,2041},{2,7,1224},{2,6,146},{2,6,146},{2,4,210},{0,6,1644},{1,4,509},{3,7,221},{3,7,221},{3,7,221},{3,5,277},{5,2,1160}, +{1,7,64},{1,7,64},{2,4,146},{7,2,1160},{2,4,146},{7,3,1570},{4,7,356},{4,6,10},{2,6,2},{7,3,1570},{6,5,1570},{2,6,2},{0,5,1618},{6,5,1570},{0,5,1618},{3,0,1960},{3,0,1960},{3,0,1960},{3,0,1960},{2,5,80},{2,5,80},{2,5,80},{2,4,89},{0,5,100},{0,5,100},{3,7,6570},{3,7,2770},{3,6,2365},{3,6,1705},{3,7,7311},{2,7,2276},{2,6,131}, +{2,5,2230},{0,7,6884},{0,5,1974},{4,7,2512},{4,7,532},{4,6,218},{4,6,482},{5,5,5424},{2,7,2276},{2,6,131},{1,5,1931},{3,6,5424},{1,5,1931},{3,7,1809},{3,7,1809},{3,7,1809},{3,6,1656},{2,7,1352},{2,6,82},{2,6,82},{2,4,370},{0,6,1548},{0,5,293},{4,6,169},{4,6,169},{4,6,169},{4,5,169},{6,1,1160},{1,7,64},{1,7,64},{1,5,250},{6,3,1160}, +{1,5,250},{5,7,1570},{4,7,388},{4,6,74},{3,6,65},{5,7,1570},{5,6,1570},{3,6,65},{0,5,1906},{5,6,1570},{0,5,1906},{3,0,1640},{3,0,1640},{3,0,1640},{3,0,1640},{2,6,1},{2,6,1},{2,6,1},{2,4,9},{0,5,68},{0,5,68},{4,7,6752},{3,7,3538},{3,7,2378},{3,6,1817},{3,7,7775},{2,7,2820},{2,7,477},{2,5,2614},{1,7,7360},{0,6,1978},{5,7,3110}, +{4,7,692},{4,7,377},{4,6,322},{6,4,5424},{3,7,2539},{2,7,413},{0,6,1942},{7,4,5424},{0,6,1942},{3,7,2017},{3,7,2017},{3,7,2017},{3,6,1592},{3,7,1846},{2,7,116},{2,7,116},{2,5,213},{0,7,1531},{1,5,283},{4,7,16},{4,7,16},{4,7,16},{4,6,97},{7,0,1154},{2,7,52},{2,7,52},{1,5,58},{3,5,1154},{1,5,58},{7,4,1576},{5,7,610},{5,6,306}, +{3,6,241},{7,4,1576},{7,5,1576},{3,6,241},{0,6,1906},{7,5,1576},{0,6,1906},{3,0,1576},{3,0,1576},{3,0,1576},{3,0,1576},{2,7,100},{2,7,100},{2,7,100},{2,5,164},{0,6,72},{0,6,72},{4,7,6932},{4,7,3932},{4,7,2807},{3,7,1974},{4,7,8428},{3,7,2981},{2,7,423},{2,6,2373},{1,7,7540},{0,6,1618},{5,7,2921},{4,7,1331},{4,7,206},{4,7,566},{7,3,5424}, +{3,7,2692},{2,7,134},{0,6,1609},{6,5,5424},{0,6,1609},{4,7,2707},{4,7,2707},{4,7,2707},{3,7,1874},{3,7,1513},{2,7,323},{2,7,323},{2,5,294},{0,7,1324},{1,5,184},{4,7,106},{4,7,106},{4,7,106},{4,6,25},{7,1,1160},{2,7,34},{2,7,34},{2,5,5},{7,3,1160},{2,5,5},{7,5,1570},{5,7,628},{4,7,181},{2,7,125},{7,5,1570},{6,6,1586},{2,7,125}, +{0,6,1600},{6,6,1586},{0,6,1600},{3,0,1810},{3,0,1810},{3,0,1810},{3,0,1810},{2,7,298},{2,7,298},{2,7,298},{2,5,290},{0,6,18},{0,6,18},{4,7,7636},{4,7,4156},{4,7,2311},{4,7,2191},{4,7,8428},{3,7,3317},{3,7,185},{3,6,2410},{2,7,8180},{1,6,1722},{5,7,3161},{5,7,1357},{5,7,461},{4,7,342},{5,7,5424},{4,7,2979},{3,7,104},{1,6,1601},{5,6,5424}, +{1,6,1601},{4,7,2307},{4,7,2307},{4,7,2307},{4,6,2082},{3,7,1625},{3,7,181},{3,7,181},{3,5,217},{0,7,1548},{1,5,504},{5,7,457},{5,7,457},{5,7,457},{4,6,233},{6,3,1154},{3,7,100},{3,7,100},{3,5,136},{6,4,1154},{3,5,136},{6,7,1576},{5,7,916},{5,7,20},{3,7,4},{6,7,1576},{7,6,1576},{3,7,4},{0,6,1600},{7,6,1576},{0,6,1600},{4,0,2018}, +{4,0,2018},{4,0,2018},{4,0,2018},{3,6,90},{3,6,90},{3,6,90},{3,5,117},{0,7,104},{0,7,104},{5,7,7862},{4,7,4316},{4,7,2291},{4,7,1691},{4,7,8004},{3,7,3433},{3,7,69},{3,6,1774},{2,7,7580},{1,6,1470},{5,7,3101},{5,7,1209},{5,7,185},{4,7,466},{7,4,4803},{4,7,2579},{3,7,68},{2,6,1448},{7,5,4803},{2,6,1448},{4,7,2291},{4,7,2291},{4,7,2291}, +{4,7,1691},{3,7,2121},{3,7,69},{3,7,69},{3,5,329},{1,7,1539},{1,6,314},{5,7,185},{5,7,185},{5,7,185},{5,6,185},{7,2,1154},{3,7,68},{3,7,68},{2,6,292},{5,5,1154},{2,6,292},{7,6,1252},{6,7,724},{5,7,16},{4,7,25},{7,6,1252},{7,6,1268},{4,7,25},{0,6,1412},{7,6,1268},{0,6,1412},{4,0,1666},{4,0,1666},{4,0,1666},{4,0,1666},{3,7,5}, +{3,7,5},{3,7,5},{3,5,5},{0,7,40},{0,7,40},{5,7,6806},{4,7,4684},{4,7,2659},{4,7,1579},{4,7,7668},{4,7,2988},{3,7,341},{3,6,1390},{2,7,7084},{1,6,1470},{6,7,2645},{5,7,1193},{5,7,169},{5,7,125},{6,6,4059},{4,7,2259},{4,7,234},{2,6,1224},{4,7,4059},{2,6,1224},{4,7,2659},{4,7,2659},{4,7,2659},{4,7,1579},{4,7,2043},{3,7,341},{3,7,341}, +{3,6,234},{1,7,1779},{1,6,314},{5,7,169},{5,7,169},{5,7,169},{5,7,125},{5,6,1152},{4,7,234},{4,7,234},{2,6,68},{4,6,1152},{2,6,68},{7,6,900},{6,7,500},{6,7,100},{4,7,9},{7,6,900},{6,7,884},{4,7,9},{0,6,1220},{6,7,884},{0,6,1220},{4,0,1570},{4,0,1570},{4,0,1570},{4,0,1570},{3,7,85},{3,7,85},{3,7,85},{3,5,149},{1,7,98}, +{1,7,98},{5,7,6077},{5,7,4185},{5,7,3161},{4,7,1912},{5,7,6790},{4,7,2529},{4,7,504},{3,6,1417},{3,7,6199},{1,7,1097},{6,7,1925},{6,7,1301},{5,7,457},{5,7,17},{7,5,3321},{5,7,1754},{4,7,180},{1,7,1093},{6,6,3345},{1,7,1093},{5,7,3161},{5,7,3161},{5,7,3161},{4,7,1912},{4,7,2124},{4,7,504},{4,7,504},{3,6,261},{2,7,1944},{2,6,171},{5,7,457}, +{5,7,457},{5,7,457},{5,7,17},{6,5,1154},{4,7,180},{4,7,180},{3,6,5},{3,7,1154},{3,6,5},{7,7,605},{6,7,401},{6,7,1},{5,7,1},{7,7,605},{6,7,569},{5,7,1},{0,7,1089},{6,7,569},{0,7,1089},{4,0,1768},{4,0,1768},{4,0,1768},{4,0,1768},{4,7,360},{4,7,360},{4,7,360},{3,6,260},{1,7,8},{1,7,8},{5,7,5837},{5,7,3945},{5,7,2921}, +{5,7,2129},{5,7,6054},{4,7,2529},{4,7,504},{4,6,1386},{3,7,5767},{2,7,773},{6,7,1557},{6,7,933},{6,7,533},{5,7,193},{6,7,2754},{5,7,1434},{4,7,404},{2,7,629},{5,7,2754},{2,7,629},{5,7,2921},{5,7,2921},{5,7,2921},{5,7,2129},{4,7,2604},{4,7,504},{4,7,504},{4,6,230},{2,7,2264},{2,6,443},{6,7,533},{6,7,533},{6,7,533},{5,7,193},{7,4,1152}, +{4,7,404},{4,7,404},{3,6,117},{7,5,1152},{3,6,117},{7,7,317},{7,7,245},{6,7,49},{6,7,25},{7,7,317},{7,7,373},{6,7,25},{0,7,625},{7,7,373},{0,7,625},{5,0,2080},{5,0,2080},{5,0,2080},{5,0,2080},{4,7,104},{4,7,104},{4,7,104},{4,6,149},{2,7,148},{2,7,148},{5,7,5981},{5,7,4089},{5,7,3065},{5,7,1921},{5,7,5702},{5,7,2666},{4,7,888}, +{4,7,693},{4,7,5325},{2,7,341},{6,7,1445},{6,7,821},{6,7,421},{6,7,205},{7,6,2306},{5,7,1370},{5,7,346},{2,7,325},{7,6,2274},{2,7,325},{5,7,3065},{5,7,3065},{5,7,3065},{5,7,1921},{5,7,2786},{4,7,888},{4,7,888},{4,6,294},{3,7,2355},{2,7,341},{6,7,421},{6,7,421},{6,7,421},{6,7,205},{7,5,1184},{5,7,346},{5,7,346},{4,6,290},{6,6,1152}, +{4,6,290},{7,7,157},{7,7,85},{7,7,36},{6,7,9},{7,7,157},{7,7,149},{6,7,9},{0,7,289},{7,7,149},{0,7,289},{5,0,1696},{5,0,1696},{5,0,1696},{5,0,1696},{4,7,104},{4,7,104},{4,7,104},{4,6,5},{2,7,52},{2,7,52},{6,7,5433},{5,7,4617},{5,7,3593},{5,7,2097},{5,7,5734},{5,7,2346},{5,7,1322},{4,7,261},{4,7,4909},{2,7,293},{6,7,1589}, +{6,7,965},{6,7,565},{6,7,157},{7,6,1890},{6,7,1146},{5,7,538},{3,7,82},{6,7,1890},{3,7,82},{5,7,3593},{5,7,3593},{5,7,3593},{5,7,2097},{5,7,2818},{5,7,1322},{5,7,1322},{4,7,261},{3,7,2691},{2,7,293},{6,7,565},{6,7,565},{6,7,565},{6,7,157},{6,7,1154},{5,7,538},{5,7,538},{3,7,82},{5,7,1154},{3,7,82},{7,7,125},{7,7,53},{7,7,4}, +{7,7,4},{7,7,125},{7,7,53},{7,7,4},{0,7,81},{7,7,53},{0,7,81},{5,0,1568},{5,0,1568},{5,0,1568},{5,0,1568},{4,7,360},{4,7,360},{4,7,360},{4,6,117},{2,7,212},{2,7,212},{6,7,4866},{6,7,4242},{6,7,3842},{5,7,2754},{6,7,5113},{5,7,2445},{5,7,1421},{4,7,234},{5,7,4804},{3,7,164},{7,7,1203},{7,7,1131},{6,7,1033},{6,7,409},{7,7,1611}, +{6,7,1056},{6,7,656},{4,7,9},{6,7,1584},{4,7,9},{6,7,3842},{6,7,3842},{6,7,3842},{5,7,2754},{5,7,3313},{5,7,1421},{5,7,1421},{4,7,234},{4,7,2875},{3,7,164},{6,7,1033},{6,7,1033},{6,7,1033},{6,7,409},{7,6,1152},{6,7,656},{6,7,656},{4,7,9},{7,6,1184},{4,7,9},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49}, +{0,7,0},{7,7,98},{0,7,0},{5,0,1730},{5,0,1730},{5,0,1730},{5,0,1730},{5,7,397},{5,7,397},{5,7,397},{4,7,234},{3,7,164},{3,7,164},{6,7,4194},{6,7,3570},{6,7,3170},{6,7,2546},{6,7,4137},{5,7,2365},{5,7,1341},{5,7,185},{5,7,3876},{3,7,324},{7,7,771},{7,7,699},{7,7,650},{6,7,521},{7,7,1083},{6,7,864},{6,7,464},{4,7,25},{7,7,1187}, +{4,7,25},{6,7,3170},{6,7,3170},{6,7,3170},{6,7,2546},{6,7,3113},{5,7,1341},{5,7,1341},{5,7,185},{4,7,2491},{3,7,324},{7,7,650},{7,7,650},{7,7,650},{6,7,521},{7,6,832},{6,7,464},{6,7,464},{4,7,25},{6,7,800},{4,7,25},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{5,0,2146}, +{5,0,2146},{5,0,2146},{5,0,2146},{5,7,317},{5,7,317},{5,7,317},{5,7,185},{3,7,324},{3,7,324},{6,7,3778},{6,7,3154},{6,7,2754},{6,7,2130},{6,7,3417},{6,7,2169},{5,7,1517},{5,7,9},{5,7,3204},{4,7,338},{7,7,467},{7,7,395},{7,7,346},{7,7,274},{7,7,683},{7,7,539},{6,7,400},{5,7,0},{7,7,723},{5,7,0},{6,7,2754},{6,7,2754},{6,7,2754}, +{6,7,2130},{6,7,2393},{5,7,1517},{5,7,1517},{5,7,9},{5,7,2180},{4,7,338},{7,7,346},{7,7,346},{7,7,346},{7,7,274},{7,7,562},{6,7,400},{6,7,400},{5,7,0},{6,7,544},{5,7,0},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{6,0,1730},{6,0,1730},{6,0,1730},{6,0,1730},{5,7,493}, +{5,7,493},{5,7,493},{5,7,9},{4,7,338},{4,7,338},{6,7,3618},{6,7,2994},{6,7,2594},{6,7,1970},{6,7,2953},{6,7,1705},{6,7,1305},{5,7,89},{5,7,2788},{4,7,466},{7,7,291},{7,7,219},{7,7,170},{7,7,98},{7,7,411},{7,7,267},{7,7,218},{6,7,16},{7,7,387},{6,7,16},{6,7,2594},{6,7,2594},{6,7,2594},{6,7,1970},{6,7,1929},{6,7,1305},{6,7,1305}, +{5,7,89},{5,7,1764},{4,7,466},{7,7,170},{7,7,170},{7,7,170},{7,7,98},{7,7,290},{7,7,218},{7,7,218},{6,7,16},{7,7,338},{6,7,16},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{6,0,1570},{6,0,1570},{6,0,1570},{6,0,1570},{6,7,905},{6,7,905},{6,7,905},{5,7,89},{4,7,466}, +{4,7,466},{0,5,2665},{0,4,697},{0,3,290},{0,2,841},{0,3,5901},{0,2,4170},{0,2,1802},{0,1,4310},{0,1,6951},{0,1,4671},{0,5,2665},{0,4,697},{0,3,290},{0,2,841},{2,0,5893},{0,2,4170},{0,2,1802},{0,1,4310},{3,0,5893},{0,1,4310},{0,2,4},{0,2,4},{0,2,4},{0,1,4},{0,1,557},{0,1,365},{0,1,365},{0,0,356},{0,0,665},{0,0,392},{0,2,4}, +{0,2,4},{0,2,4},{0,1,4},{0,1,557},{0,1,365},{0,1,365},{0,0,356},{0,0,629},{0,0,356},{3,0,2665},{0,4,697},{0,3,290},{0,2,841},{3,0,2665},{3,1,2665},{0,2,841},{0,2,3145},{3,1,2665},{0,2,3145},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,6,2705},{0,4,617},{0,3,34}, +{0,2,985},{0,4,6754},{0,3,4625},{0,2,1946},{0,1,5030},{0,2,7635},{0,1,5391},{0,6,2705},{0,4,617},{0,3,34},{0,2,985},{1,2,6674},{0,3,4625},{0,2,1946},{0,1,5030},{0,2,6674},{0,1,5030},{0,3,9},{0,3,9},{0,3,9},{0,1,100},{0,1,845},{0,1,461},{0,1,461},{0,0,676},{0,0,1097},{0,0,712},{0,3,9},{0,3,9},{0,3,9},{0,1,100},{0,1,845}, +{0,1,461},{0,1,461},{0,0,676},{1,0,853},{0,0,676},{1,4,2665},{0,4,617},{0,3,34},{0,2,985},{1,4,2665},{2,2,2665},{0,2,985},{0,2,2777},{2,2,2665},{0,2,2777},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,6,2689},{0,5,477},{0,3,34},{0,3,634},{0,4,7538},{0,3,4865},{0,2,2346}, +{0,2,5474},{0,2,8547},{0,1,6367},{0,6,2689},{0,5,477},{0,3,34},{0,3,634},{0,4,7538},{0,3,4865},{0,2,2346},{0,2,5474},{2,1,7538},{0,2,5474},{0,3,25},{0,3,25},{0,3,25},{0,2,16},{0,1,1261},{0,1,685},{0,1,685},{0,1,965},{0,1,1646},{0,0,1160},{0,3,25},{0,3,25},{0,3,25},{0,2,16},{1,0,1213},{0,1,685},{0,1,685},{0,1,965},{1,0,1205}, +{0,1,965},{2,3,2669},{0,5,477},{0,3,34},{0,3,634},{2,3,2669},{6,0,2669},{0,3,634},{0,2,2665},{6,0,2669},{0,2,2665},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,7,2669},{0,5,365},{0,3,290},{0,3,410},{0,4,8578},{0,3,5361},{0,3,2346},{0,2,5618},{0,2,9715},{0,2,6579},{0,7,2669}, +{0,5,365},{0,3,290},{0,3,410},{2,1,8498},{0,3,5361},{0,3,2346},{0,2,5618},{4,0,8498},{0,2,5618},{0,4,0},{0,4,0},{0,4,0},{0,2,16},{0,2,1637},{0,2,977},{0,2,977},{0,1,997},{0,1,1998},{0,1,1358},{0,4,0},{0,4,0},{0,4,0},{0,2,16},{1,0,1629},{0,2,977},{0,2,977},{0,1,997},{0,1,1637},{0,1,997},{3,2,2669},{0,5,365},{1,3,185}, +{0,3,410},{3,2,2669},{5,1,2669},{0,3,410},{0,2,2809},{5,1,2669},{0,2,2809},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,7,2777},{0,6,257},{0,4,277},{0,3,464},{0,5,9677},{0,4,6026},{0,3,2400},{0,2,6086},{0,2,11335},{0,2,7047},{0,7,2777},{0,6,257},{0,4,277},{0,3,464},{3,0,9677}, +{0,4,6026},{0,3,2400},{0,2,6086},{3,1,9677},{0,2,6086},{0,5,16},{0,5,16},{0,5,16},{0,3,64},{0,2,2186},{0,2,1130},{0,2,1130},{0,1,1186},{0,1,2547},{0,1,1547},{0,5,16},{0,5,16},{0,5,16},{0,3,64},{0,2,2186},{0,2,1130},{0,2,1130},{0,1,1186},{0,1,2186},{0,1,1186},{4,1,2669},{0,6,257},{0,4,277},{0,3,464},{4,1,2669},{4,2,2669},{0,3,464}, +{0,3,3209},{4,2,2669},{0,3,3209},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{0,7,3209},{0,6,209},{0,4,389},{0,4,541},{0,6,9765},{0,4,5546},{0,3,2080},{0,2,5990},{0,3,11621},{0,2,6951},{0,7,3209},{0,6,209},{0,4,389},{0,4,541},{1,4,9677},{0,4,5546},{0,3,2080},{0,2,5990},{2,2,9677}, +{0,2,5990},{0,5,80},{0,5,80},{0,5,80},{0,3,64},{0,3,2196},{0,2,970},{0,2,970},{0,1,1058},{0,1,2739},{0,1,1419},{0,5,80},{0,5,80},{0,5,80},{0,3,64},{1,1,2180},{0,2,970},{0,2,970},{0,1,1058},{1,1,2196},{0,1,1058},{5,0,2669},{0,6,145},{1,4,52},{0,4,477},{5,0,2669},{3,3,2669},{0,4,477},{0,3,2809},{3,3,2669},{0,3,2809},{0,0,64}, +{0,0,64},{0,0,64},{0,0,64},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,40},{0,0,40},{0,7,4025},{0,7,441},{0,4,885},{0,4,429},{0,6,9685},{0,4,5450},{0,4,1854},{0,3,6029},{0,3,11925},{0,2,7239},{1,7,3001},{0,7,441},{1,4,344},{0,4,429},{3,1,9685},{0,4,5450},{0,4,1854},{0,3,6029},{4,1,9685},{0,3,6029},{0,6,256},{0,6,256},{0,6,256}, +{0,3,320},{0,3,2228},{0,3,848},{0,3,848},{0,1,1186},{0,2,3171},{0,1,1547},{0,6,256},{0,6,256},{0,6,256},{0,3,320},{2,0,2180},{0,3,848},{0,3,848},{0,1,1186},{3,0,2180},{0,1,1186},{4,2,2677},{0,7,185},{1,4,20},{0,4,173},{4,2,2677},{7,1,2677},{0,4,173},{0,3,2665},{7,1,2677},{0,3,2665},{0,0,256},{0,0,256},{0,0,256},{0,0,256},{0,1,9}, +{0,1,9},{0,1,9},{0,0,36},{0,0,72},{0,0,72},{1,7,4141},{0,7,617},{1,4,1500},{0,4,701},{0,7,9690},{0,5,5001},{0,4,1214},{0,3,5277},{0,3,12613},{0,3,7213},{1,7,2985},{1,6,465},{1,4,344},{1,4,524},{4,0,9674},{0,5,5001},{0,4,1214},{0,3,5277},{3,2,9674},{0,3,5277},{0,7,601},{0,7,601},{0,7,601},{0,4,601},{0,4,2178},{0,3,656},{0,3,656}, +{0,2,866},{0,2,3171},{0,2,1827},{1,5,101},{1,5,101},{1,5,101},{1,3,109},{0,4,2178},{0,3,656},{0,3,656},{0,2,866},{2,1,2178},{0,2,866},{5,1,2669},{0,7,41},{2,4,181},{0,4,125},{5,1,2669},{4,3,2669},{0,4,125},{0,3,2777},{4,3,2669},{0,3,2777},{0,0,576},{0,0,576},{0,0,576},{0,0,576},{0,1,25},{0,1,25},{0,1,25},{0,1,49},{0,0,232}, +{0,0,232},{1,7,4582},{0,7,1274},{1,5,1446},{0,4,1466},{0,7,9789},{0,5,4794},{0,4,953},{0,3,4890},{0,4,13038},{0,3,6826},{1,7,3426},{1,7,290},{1,5,290},{1,4,443},{2,4,9685},{0,5,4794},{0,4,953},{0,3,4890},{7,0,9685},{0,3,4890},{0,7,1105},{0,7,1105},{0,7,1105},{0,4,1105},{0,5,2210},{0,4,592},{0,4,592},{0,2,596},{0,2,3477},{0,2,1557},{1,6,26}, +{1,6,26},{1,6,26},{1,4,82},{1,3,2180},{0,4,592},{0,4,592},{0,2,596},{1,2,2180},{0,2,596},{6,0,2677},{0,7,185},{1,5,289},{0,4,377},{6,0,2677},{5,3,2677},{0,4,377},{0,3,3209},{5,3,2677},{0,3,3209},{0,0,1089},{0,0,1089},{0,0,1089},{0,0,1089},{0,2,4},{0,2,4},{0,2,4},{0,1,4},{0,1,365},{0,1,365},{1,7,5382},{1,7,1350},{1,5,1510}, +{1,5,1738},{0,7,10285},{0,6,4406},{0,5,971},{0,3,4954},{0,4,13534},{0,3,6890},{2,7,3454},{1,7,194},{1,5,354},{1,5,582},{3,3,9674},{0,6,4406},{0,5,971},{0,3,4954},{6,1,9674},{0,3,4954},{1,6,1214},{1,6,1214},{1,6,1214},{1,4,1206},{0,5,2210},{0,4,400},{0,4,400},{0,2,628},{0,2,4021},{0,2,1589},{1,6,58},{1,6,58},{1,6,58},{1,4,50},{2,2,2178}, +{0,4,400},{0,4,400},{0,2,628},{5,0,2178},{0,2,628},{4,4,2669},{1,7,145},{2,5,74},{0,5,130},{4,4,2669},{7,2,2669},{0,5,130},{0,4,2845},{7,2,2669},{0,4,2845},{1,0,1205},{1,0,1205},{1,0,1205},{1,0,1205},{0,3,9},{0,3,9},{0,3,9},{0,1,100},{0,1,461},{0,1,461},{1,7,6566},{1,7,1638},{1,5,1958},{1,5,1578},{1,7,10830},{0,6,4118},{0,5,443}, +{0,4,4785},{0,4,14414},{0,3,7338},{2,7,3390},{1,7,482},{2,5,371},{1,5,422},{4,2,9674},{0,6,4118},{0,5,443},{0,4,4785},{5,2,9674},{0,4,4785},{1,7,1382},{1,7,1382},{1,7,1382},{1,4,1430},{0,6,2178},{0,5,442},{0,5,442},{0,3,641},{0,3,4242},{0,2,1877},{1,7,226},{1,7,226},{1,7,226},{1,4,274},{3,1,2178},{0,5,442},{0,5,442},{0,3,641},{4,1,2178}, +{0,3,641},{5,3,2669},{1,7,257},{2,5,10},{0,5,2},{5,3,2669},{6,3,2669},{0,5,2},{0,4,2669},{6,3,2669},{0,4,2669},{1,0,1381},{1,0,1381},{1,0,1381},{1,0,1381},{0,3,25},{0,3,25},{0,3,25},{0,2,16},{0,1,685},{0,1,685},{1,7,8134},{1,7,2310},{1,6,2671},{1,5,1802},{1,7,11086},{0,7,4109},{0,5,299},{0,4,4193},{0,5,14830},{0,4,7442},{2,7,3710}, +{2,7,490},{2,5,323},{2,5,563},{5,1,9669},{0,7,4109},{0,5,299},{0,4,4193},{4,3,9669},{0,4,4193},{1,7,1734},{1,7,1734},{1,7,1734},{1,5,1721},{0,7,2228},{0,5,218},{0,5,218},{0,3,305},{0,3,4626},{0,3,2241},{2,6,125},{2,6,125},{2,6,125},{2,4,125},{4,0,2180},{0,5,218},{0,5,218},{0,3,305},{3,2,2180},{0,3,305},{6,2,2665},{2,7,369},{3,5,181}, +{1,5,117},{6,2,2665},{5,4,2665},{1,5,117},{0,4,2749},{5,4,2665},{0,4,2749},{1,0,1685},{1,0,1685},{1,0,1685},{1,0,1685},{0,4,0},{0,4,0},{0,4,0},{0,2,16},{0,2,977},{0,2,977},{2,7,9153},{1,7,3525},{1,6,3220},{1,5,2513},{1,7,11833},{0,7,3686},{0,6,548},{0,4,3986},{0,5,15577},{0,4,7235},{3,7,4141},{2,7,481},{2,6,309},{2,5,428},{6,0,9674}, +{0,7,3686},{0,6,548},{0,4,3986},{3,4,9674},{0,4,3986},{1,7,2436},{1,7,2436},{1,7,2436},{1,5,2189},{0,7,2210},{0,5,272},{0,5,272},{0,3,233},{0,3,5364},{0,3,2169},{2,7,40},{2,7,40},{2,7,40},{2,5,104},{2,4,2178},{0,5,272},{0,5,272},{0,3,233},{7,0,2178},{0,3,233},{7,1,2669},{2,7,477},{2,6,305},{0,6,292},{7,1,2669},{4,5,2669},{0,6,292}, +{0,4,3145},{4,5,2669},{0,4,3145},{1,0,2180},{1,0,2180},{1,0,2180},{1,0,2180},{0,5,16},{0,5,16},{0,5,16},{0,3,64},{0,2,1130},{0,2,1130},{2,7,10154},{1,7,4946},{1,6,4049},{1,6,2853},{1,7,12838},{0,7,3719},{0,6,133},{0,4,4211},{0,6,16286},{0,4,7346},{3,7,4061},{2,7,881},{2,6,325},{2,6,629},{4,4,9669},{0,7,3718},{0,6,132},{0,4,4210},{7,2,9669}, +{0,4,4210},{1,7,3265},{1,7,3265},{1,7,3265},{1,6,2789},{0,7,2467},{0,6,69},{0,6,69},{0,3,442},{0,4,5602},{0,3,2290},{2,7,40},{2,7,40},{2,7,40},{2,5,40},{3,3,2180},{0,6,68},{0,6,68},{0,3,441},{6,1,2180},{0,3,441},{5,5,2665},{3,7,617},{3,6,100},{0,6,68},{5,5,2665},{3,6,2665},{0,6,68},{0,5,2885},{3,6,2665},{0,5,2885},{1,0,2689}, +{1,0,2689},{1,0,2689},{1,0,2689},{0,5,17},{0,5,17},{0,5,17},{0,3,1},{0,2,1341},{0,2,1341},{2,7,10666},{2,7,5146},{2,6,4206},{1,6,2933},{2,7,13606},{0,7,4215},{0,6,181},{0,5,3914},{0,6,15454},{0,4,7122},{3,7,4365},{3,7,1097},{3,6,404},{2,6,421},{5,3,9669},{1,7,4133},{0,6,100},{0,5,3833},{6,3,9669},{0,5,3833},{2,7,3777},{2,7,3777},{2,7,3777}, +{1,6,2933},{1,7,2805},{0,6,181},{0,6,181},{0,4,275},{0,4,5282},{0,3,2130},{2,7,296},{2,7,296},{2,7,296},{2,5,232},{4,2,2180},{0,6,100},{0,6,100},{0,4,194},{5,2,2180},{0,4,194},{6,4,2665},{3,7,697},{3,6,4},{1,6,4},{6,4,2665},{7,4,2665},{1,6,4},{0,5,2677},{7,4,2665},{0,5,2677},{1,0,2929},{1,0,2929},{1,0,2929},{1,0,2929},{0,6,81}, +{0,6,81},{0,6,81},{0,3,145},{0,3,1289},{0,3,1289},{2,7,11690},{2,7,5434},{2,7,4085},{2,6,3198},{2,7,13510},{1,7,4470},{1,6,585},{0,5,3690},{0,6,15134},{0,5,6210},{3,7,5053},{3,7,1177},{3,6,308},{2,6,597},{6,2,9670},{1,7,4181},{1,6,296},{0,5,3401},{5,4,9670},{0,5,3401},{2,7,3409},{2,7,3409},{2,7,3409},{2,6,3134},{1,7,2565},{0,7,323},{0,7,323}, +{0,4,323},{0,5,5085},{0,4,1634},{3,7,153},{3,7,153},{3,7,153},{3,5,145},{5,1,2186},{0,7,34},{0,7,34},{0,4,34},{7,1,2186},{0,4,34},{7,3,2665},{4,7,937},{3,6,164},{1,6,100},{7,3,2665},{6,5,2665},{1,6,100},{0,5,2725},{6,5,2665},{0,5,2725},{2,0,3085},{2,0,3085},{2,0,3085},{2,0,3085},{1,5,290},{1,5,290},{1,5,290},{1,3,298},{0,3,985}, +{0,3,985},{3,7,12062},{2,7,6370},{2,7,3743},{2,6,3018},{2,7,14014},{1,7,4758},{1,6,603},{1,5,4049},{0,7,14638},{0,5,5310},{4,7,4958},{3,7,1726},{3,7,334},{3,6,419},{7,1,9669},{1,7,4694},{0,7,341},{0,5,3374},{4,5,9669},{0,5,3374},{2,7,3454},{2,7,3454},{2,7,3454},{2,6,2729},{1,7,2754},{1,6,314},{1,6,314},{1,4,289},{0,5,4626},{0,4,1121},{3,7,45}, +{3,7,45},{3,7,45},{3,5,109},{6,0,2180},{0,7,52},{0,7,52},{0,4,160},{3,4,2180},{0,4,160},{5,7,2665},{4,7,1009},{4,6,293},{2,6,293},{5,7,2665},{5,6,2665},{2,6,293},{0,5,3085},{5,6,2665},{0,5,3085},{2,0,2725},{2,0,2725},{2,0,2725},{2,0,2725},{1,6,89},{1,6,89},{1,6,89},{1,4,145},{0,3,949},{0,3,949},{3,7,12414},{3,7,7246},{2,7,3983}, +{2,7,2879},{2,7,15006},{1,7,5558},{1,7,163},{1,5,4161},{0,7,14190},{0,5,5054},{4,7,5246},{4,7,2186},{3,7,302},{3,6,659},{5,5,9670},{2,7,4926},{1,7,163},{0,5,3758},{3,6,9670},{0,5,3758},{2,7,3902},{2,7,3902},{2,7,3902},{2,6,2777},{1,7,3330},{1,7,82},{1,7,82},{1,4,401},{0,6,4490},{0,4,1073},{3,7,221},{3,7,221},{3,7,221},{3,6,34},{5,2,2186}, +{1,7,82},{1,7,82},{0,5,277},{7,2,2186},{0,5,277},{6,6,2665},{5,7,1313},{4,7,130},{1,7,82},{6,6,2665},{4,7,2665},{1,7,82},{0,6,2929},{4,7,2665},{0,6,2929},{2,0,2677},{2,0,2677},{2,0,2677},{2,0,2677},{1,6,9},{1,6,9},{1,6,9},{1,4,1},{0,4,673},{0,4,673},{3,7,13278},{3,7,7502},{3,7,4254},{2,7,2895},{3,7,15045},{2,7,6114},{1,7,147}, +{1,6,3978},{0,7,14254},{0,6,4818},{4,7,5918},{4,7,2378},{4,7,443},{3,7,426},{6,4,9670},{2,7,5438},{1,7,83},{0,6,3218},{7,4,9670},{0,6,3218},{3,7,4253},{3,7,4253},{3,7,4253},{2,7,2894},{2,7,3054},{1,7,146},{1,7,146},{1,5,296},{0,6,3978},{0,5,821},{4,7,442},{4,7,442},{4,7,442},{3,6,194},{6,1,2186},{1,7,82},{1,7,82},{0,5,37},{6,3,2186}, +{0,5,37},{7,5,2665},{5,7,1361},{4,7,2},{2,7,10},{7,5,2665},{6,6,2689},{2,7,10},{0,6,2689},{6,6,2689},{0,6,2689},{2,0,2885},{2,0,2885},{2,0,2885},{2,0,2885},{1,7,65},{1,7,65},{1,7,65},{1,4,113},{0,4,625},{0,4,625},{3,7,13261},{3,7,7409},{3,7,4045},{3,7,3209},{3,7,14116},{2,7,5615},{2,7,574},{1,6,3165},{0,7,13437},{0,6,3429},{5,7,5269}, +{4,7,2275},{4,7,250},{3,7,505},{5,6,8712},{3,7,4724},{2,7,250},{0,6,2405},{4,6,8712},{0,6,2405},{3,7,4045},{3,7,4045},{3,7,4045},{3,7,3209},{2,7,3150},{2,7,574},{2,7,574},{1,5,296},{0,6,3850},{0,5,453},{4,7,250},{4,7,250},{4,7,250},{4,6,169},{7,0,2180},{2,7,250},{2,7,250},{1,5,40},{3,5,2180},{1,5,40},{6,7,2180},{5,7,1168},{4,7,81}, +{2,7,25},{6,7,2180},{5,7,2180},{2,7,25},{0,6,2180},{5,7,2180},{0,6,2180},{3,0,3145},{3,0,3145},{3,0,3145},{3,0,3145},{1,7,305},{1,7,305},{1,7,305},{1,5,292},{0,5,449},{0,5,449},{4,7,11894},{3,7,7634},{3,7,4270},{3,7,2750},{3,7,13315},{2,7,5354},{2,7,313},{1,6,2634},{1,7,12414},{0,6,2250},{5,7,4369},{4,7,2365},{4,7,340},{4,7,160},{7,3,7590}, +{3,7,4094},{2,7,232},{0,6,1721},{6,5,7590},{0,6,1721},{3,7,4270},{3,7,4270},{3,7,4270},{3,7,2750},{2,7,3717},{2,7,313},{2,7,313},{2,5,302},{0,7,3546},{0,5,498},{4,7,340},{4,7,340},{4,7,340},{4,6,97},{7,1,2186},{2,7,232},{2,7,232},{1,5,130},{7,3,2186},{1,5,130},{6,7,1649},{6,7,1025},{5,7,9},{3,7,1},{6,7,1649},{7,6,1625},{3,7,1}, +{0,6,1685},{7,6,1625},{0,6,1685},{3,0,2749},{3,0,2749},{3,0,2749},{3,0,2749},{2,7,117},{2,7,117},{2,7,117},{2,5,181},{0,5,377},{0,5,377},{4,7,11078},{4,7,7478},{3,7,4878},{3,7,2750},{4,7,12662},{3,7,5031},{2,7,489},{2,6,1911},{1,7,11470},{0,6,1610},{5,7,3841},{5,7,1949},{4,7,692},{4,7,32},{5,7,6662},{4,7,3641},{3,7,442},{0,6,1385},{5,6,6662}, +{0,6,1385},{3,7,4878},{3,7,4878},{3,7,4878},{3,7,2750},{3,7,3795},{2,7,489},{2,7,489},{2,5,366},{0,7,3354},{0,6,454},{4,7,692},{4,7,692},{4,7,692},{4,7,32},{6,3,2180},{3,7,442},{3,7,442},{0,6,229},{6,4,2180},{0,6,229},{7,6,1201},{6,7,689},{5,7,25},{4,7,16},{7,6,1201},{7,6,1225},{4,7,16},{0,6,1381},{7,6,1225},{0,6,1381},{3,0,2669}, +{3,0,2669},{3,0,2669},{3,0,2669},{2,7,5},{2,7,5},{2,7,5},{2,5,5},{0,6,229},{0,6,229},{4,7,10646},{4,7,7046},{4,7,5021},{3,7,3134},{4,7,11526},{3,7,4503},{2,7,1049},{2,6,1479},{1,7,10910},{0,6,1354},{5,7,3569},{5,7,1677},{5,7,653},{4,7,160},{7,4,5829},{4,7,3065},{3,7,410},{1,6,1209},{7,5,5829},{1,6,1209},{4,7,5021},{4,7,5021},{4,7,5021}, +{3,7,3134},{3,7,3875},{2,7,1049},{2,7,1049},{2,6,323},{0,7,3546},{0,6,198},{5,7,653},{5,7,653},{5,7,653},{4,7,160},{7,2,2180},{3,7,410},{3,7,410},{1,6,53},{5,5,2180},{1,6,53},{7,6,865},{6,7,481},{6,7,81},{4,7,16},{7,6,865},{6,7,841},{4,7,16},{0,6,1205},{6,7,841},{0,6,1205},{3,0,2845},{3,0,2845},{3,0,2845},{3,0,2845},{2,7,149}, +{2,7,149},{2,7,149},{2,5,85},{0,6,149},{0,6,149},{4,7,10598},{4,7,6998},{4,7,4973},{4,7,3353},{4,7,10774},{3,7,4359},{3,7,995},{2,6,1431},{2,7,10294},{0,7,1242},{6,7,3329},{5,7,1661},{5,7,637},{5,7,197},{6,6,5085},{4,7,2745},{3,7,634},{0,7,1098},{4,7,5085},{0,7,1098},{4,7,4973},{4,7,4973},{4,7,4973},{4,7,3353},{3,7,4339},{3,7,995},{3,7,995}, +{2,6,275},{1,7,3845},{0,6,326},{5,7,637},{5,7,637},{5,7,637},{5,7,197},{5,6,2178},{3,7,634},{3,7,634},{1,6,37},{4,6,2178},{1,6,37},{7,7,605},{6,7,401},{6,7,1},{5,7,1},{7,7,605},{6,7,569},{5,7,1},{0,7,1089},{6,7,569},{0,7,1089},{4,0,3209},{4,0,3209},{4,0,3209},{4,0,3209},{3,7,370},{3,7,370},{3,7,370},{2,6,274},{0,7,153}, +{0,7,153},{5,7,9925},{4,7,7403},{4,7,5378},{4,7,3218},{4,7,10387},{4,7,4627},{3,7,1292},{3,6,1477},{2,7,9727},{0,7,621},{6,7,2609},{5,7,1949},{5,7,925},{5,7,89},{7,5,4347},{5,7,2384},{4,7,666},{0,7,612},{6,6,4371},{0,7,612},{4,7,5378},{4,7,5378},{4,7,5378},{4,7,3218},{4,7,4762},{3,7,1292},{3,7,1292},{3,6,321},{1,7,4106},{1,6,469},{5,7,925}, +{5,7,925},{5,7,925},{5,7,89},{6,5,2180},{4,7,666},{4,7,666},{2,6,104},{3,7,2180},{2,6,104},{7,7,290},{7,7,218},{6,7,64},{6,7,16},{7,7,290},{7,7,338},{6,7,16},{0,7,576},{7,7,338},{0,7,576},{4,0,2777},{4,0,2777},{4,0,2777},{4,0,2777},{3,7,136},{3,7,136},{3,7,136},{3,5,200},{0,7,45},{0,7,45},{5,7,9269},{5,7,7377},{4,7,6146}, +{4,7,3506},{5,7,10044},{4,7,4211},{3,7,1964},{3,7,836},{3,7,9185},{0,7,477},{6,7,2241},{6,7,1617},{6,7,1217},{5,7,265},{6,7,3780},{5,7,2064},{4,7,890},{1,7,257},{5,7,3780},{1,7,257},{4,7,6146},{4,7,6146},{4,7,6146},{4,7,3506},{4,7,4826},{3,7,1964},{3,7,1964},{3,6,337},{2,7,4590},{0,7,477},{6,7,1217},{6,7,1217},{6,7,1217},{5,7,265},{7,4,2178}, +{4,7,890},{4,7,890},{1,7,257},{7,5,2178},{1,7,257},{7,7,146},{7,7,74},{7,7,25},{6,7,16},{7,7,146},{7,7,130},{6,7,16},{0,7,256},{7,7,130},{0,7,256},{4,0,2665},{4,0,2665},{4,0,2665},{4,0,2665},{3,7,200},{3,7,200},{3,7,200},{3,6,13},{0,7,221},{0,7,221},{5,7,8997},{5,7,7105},{5,7,6081},{4,7,4178},{5,7,9276},{4,7,4179},{4,7,2154}, +{3,7,356},{3,7,8721},{1,7,209},{6,7,2129},{6,7,1505},{6,7,1105},{6,7,673},{7,6,3332},{5,7,2000},{5,7,976},{2,7,73},{7,6,3300},{2,7,73},{5,7,6081},{5,7,6081},{5,7,6081},{4,7,4178},{4,7,5274},{4,7,2154},{4,7,2154},{3,7,356},{2,7,4878},{1,7,209},{6,7,1105},{6,7,1105},{6,7,1105},{6,7,673},{7,5,2210},{5,7,976},{5,7,976},{2,7,73},{6,6,2178}, +{2,7,73},{7,7,130},{7,7,58},{7,7,9},{7,7,1},{7,7,130},{7,7,50},{7,7,1},{0,7,64},{7,7,50},{0,7,64},{4,0,2809},{4,0,2809},{4,0,2809},{4,0,2809},{3,7,520},{3,7,520},{3,7,520},{3,6,61},{1,7,145},{1,7,145},{5,7,9109},{5,7,7217},{5,7,6193},{5,7,4301},{5,7,8892},{4,7,4531},{4,7,2506},{3,7,260},{4,7,8587},{1,7,289},{6,7,2273}, +{6,7,1649},{6,7,1249},{6,7,625},{7,6,2916},{6,7,1956},{5,7,1168},{2,7,25},{6,7,2916},{2,7,25},{5,7,6193},{5,7,6193},{5,7,6193},{5,7,4301},{5,7,5976},{4,7,2506},{4,7,2506},{3,7,260},{3,7,5277},{1,7,289},{6,7,1249},{6,7,1249},{6,7,1249},{6,7,625},{6,7,2180},{5,7,1168},{5,7,1168},{2,7,25},{5,7,2180},{2,7,25},{7,7,242},{7,7,170},{7,7,121}, +{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{4,0,3209},{4,0,3209},{4,0,3209},{4,0,3209},{4,7,481},{4,7,481},{4,7,481},{3,7,260},{1,7,289},{1,7,289},{6,7,8325},{5,7,6749},{5,7,5725},{5,7,3833},{5,7,7866},{5,7,4082},{4,7,2470},{4,7,265},{4,7,7219},{2,7,365},{7,7,1842},{6,7,1460},{6,7,1060},{6,7,436},{7,6,2241}, +{6,7,1425},{6,7,1025},{3,7,1},{6,7,2169},{3,7,1},{5,7,5725},{5,7,5725},{5,7,5725},{5,7,3833},{5,7,4950},{4,7,2470},{4,7,2470},{4,7,265},{3,7,4521},{2,7,365},{6,7,1060},{6,7,1060},{6,7,1060},{6,7,436},{6,7,1649},{6,7,1025},{6,7,1025},{3,7,1},{7,6,1625},{3,7,1},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49}, +{0,7,0},{7,7,98},{0,7,0},{5,0,2809},{5,0,2809},{5,0,2809},{5,0,2809},{4,7,445},{4,7,445},{4,7,445},{4,6,202},{2,7,365},{2,7,365},{6,7,7093},{6,7,6469},{5,7,5581},{5,7,3689},{5,7,7226},{5,7,3442},{5,7,2418},{4,7,25},{4,7,6275},{2,7,509},{7,7,1266},{7,7,1194},{6,7,1028},{6,7,404},{7,7,1686},{6,7,1089},{6,7,689},{4,7,16},{6,7,1641}, +{4,7,16},{5,7,5581},{5,7,5581},{5,7,5581},{5,7,3689},{5,7,4310},{5,7,2418},{5,7,2418},{4,7,25},{3,7,4121},{2,7,509},{6,7,1028},{6,7,1028},{6,7,1028},{6,7,404},{7,6,1201},{6,7,689},{6,7,689},{4,7,16},{7,6,1225},{4,7,16},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{5,0,2665}, +{5,0,2665},{5,0,2665},{5,0,2665},{4,7,685},{4,7,685},{4,7,685},{4,7,25},{2,7,509},{2,7,509},{6,7,6117},{6,7,5493},{6,7,5093},{5,7,3801},{6,7,6098},{5,7,3058},{5,7,2034},{4,7,41},{4,7,5587},{3,7,613},{7,7,818},{7,7,746},{7,7,697},{6,7,500},{7,7,1142},{6,7,881},{6,7,481},{4,7,16},{6,7,1241},{4,7,16},{6,7,5093},{6,7,5093},{6,7,5093}, +{5,7,3801},{5,7,3926},{5,7,2034},{5,7,2034},{4,7,41},{4,7,3562},{3,7,613},{7,7,697},{7,7,697},{7,7,697},{6,7,500},{7,6,865},{6,7,481},{6,7,481},{4,7,16},{6,7,841},{4,7,16},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{5,0,2777},{5,0,2777},{5,0,2777},{5,0,2777},{5,7,1010}, +{5,7,1010},{5,7,1010},{4,7,41},{3,7,613},{3,7,613},{6,7,5397},{6,7,4773},{6,7,4373},{6,7,3749},{6,7,5074},{5,7,2930},{5,7,1906},{4,7,313},{5,7,4753},{3,7,725},{7,7,498},{7,7,426},{7,7,377},{7,7,305},{7,7,726},{7,7,582},{6,7,401},{5,7,1},{7,7,774},{5,7,1},{6,7,4373},{6,7,4373},{6,7,4373},{6,7,3749},{5,7,3798},{5,7,1906},{5,7,1906}, +{4,7,313},{4,7,3130},{3,7,725},{7,7,377},{7,7,377},{7,7,377},{7,7,305},{7,7,605},{6,7,401},{6,7,401},{5,7,1},{6,7,569},{5,7,1},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{5,0,3145},{5,0,3145},{5,0,3145},{5,0,3145},{5,7,882},{5,7,882},{5,7,882},{4,7,313},{3,7,725}, +{3,7,725},{1,7,34142},{0,7,5184},{0,5,609},{0,5,4841},{1,7,46442},{0,7,24449},{0,5,9741},{0,4,24761},{0,5,65162},{0,3,40820},{0,7,10048},{0,7,2880},{0,5,545},{0,4,3204},{1,4,18070},{0,4,13297},{0,4,6453},{0,2,13857},{2,2,18070},{0,2,13857},{0,3,9},{0,3,9},{0,3,9},{0,2,36},{0,1,1145},{0,1,617},{0,1,617},{0,1,977},{0,0,1505},{0,0,1036},{0,3,9}, +{0,3,9},{0,3,9},{0,2,36},{1,0,1129},{0,1,617},{0,1,617},{0,1,977},{1,0,1105},{0,1,977},{4,2,9250},{0,7,2880},{0,5,545},{0,4,3204},{4,2,9250},{5,2,9250},{0,4,3204},{0,3,9280},{5,2,9250},{0,3,9280},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{1,7,38782},{0,7,6720},{0,5,305}, +{0,5,3801},{1,7,51082},{0,7,24961},{0,5,8701},{0,4,25849},{0,5,65535},{0,4,42094},{1,7,10502},{0,7,2624},{0,5,241},{0,4,3044},{3,1,19334},{0,4,14065},{0,4,6293},{0,3,14756},{4,1,19334},{0,3,14756},{0,4,4},{0,4,4},{0,4,4},{0,2,4},{0,2,1537},{0,1,937},{0,1,937},{0,1,977},{0,1,1898},{0,1,1338},{0,4,4},{0,4,4},{0,4,4},{0,2,4},{1,0,1513}, +{0,1,937},{0,1,937},{0,1,977},{0,1,1537},{0,1,977},{5,1,9256},{0,7,2624},{0,5,241},{0,4,3044},{5,1,9256},{7,1,9256},{0,4,3044},{0,3,9280},{7,1,9256},{0,3,9280},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{1,7,44190},{0,7,9024},{0,5,769},{0,5,3529},{1,7,56490},{0,7,26241},{0,5,8429}, +{0,4,27705},{0,5,65535},{0,4,43950},{1,7,10854},{0,7,2624},{0,5,193},{0,5,2953},{2,3,20689},{0,5,14598},{0,4,6389},{0,3,15012},{6,0,20689},{0,3,15012},{0,4,36},{0,4,36},{0,4,36},{0,2,100},{0,2,1985},{0,2,1061},{0,2,1061},{0,1,1105},{0,1,2346},{0,1,1466},{0,4,36},{0,4,36},{0,4,36},{0,2,100},{0,2,1985},{0,2,1061},{0,2,1061},{0,1,1105},{0,1,1985}, +{0,1,1105},{6,0,9256},{0,7,2624},{0,5,193},{0,5,2953},{6,0,9256},{6,2,9256},{0,5,2953},{0,3,9536},{6,2,9256},{0,3,9536},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{1,7,50366},{0,7,12096},{0,6,1101},{0,5,4025},{1,7,62666},{0,7,28289},{0,5,8925},{0,5,28912},{0,6,65535},{0,4,46574},{1,7,11462}, +{0,7,2880},{0,6,317},{0,5,2425},{4,0,22137},{0,5,15206},{0,4,6741},{0,3,15524},{3,2,22137},{0,3,15524},{0,5,1},{0,5,1},{0,5,1},{0,3,9},{0,2,2561},{0,2,1285},{0,2,1285},{0,1,1361},{0,1,2922},{0,1,1722},{0,5,1},{0,5,1},{0,5,1},{0,3,9},{1,1,2561},{0,2,1285},{0,2,1285},{0,1,1361},{2,0,2521},{0,1,1361},{5,2,9250},{0,7,2880},{0,6,317}, +{0,5,2425},{5,2,9250},{5,3,9250},{0,5,2425},{0,4,9640},{5,3,9250},{0,4,9640},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{1,7,58232},{0,7,16470},{0,6,129},{0,6,3489},{1,7,65535},{0,7,31511},{0,6,10213},{0,5,29110},{0,6,65535},{0,4,50444},{1,7,12452},{0,7,3474},{0,6,29},{0,5,2137},{2,4,23851}, +{0,6,16172},{0,5,7037},{0,3,16406},{7,0,23851},{0,3,16406},{0,6,4},{0,6,4},{0,6,4},{0,3,36},{0,3,3232},{0,2,1690},{0,2,1690},{0,1,1802},{0,1,3723},{0,1,2163},{0,6,4},{0,6,4},{0,6,4},{0,3,36},{1,1,3200},{0,2,1690},{0,2,1690},{0,1,1802},{2,0,3232},{0,1,1802},{6,1,9256},{1,7,3232},{0,6,29},{0,5,2137},{6,1,9256},{6,3,9256},{0,5,2137}, +{0,4,9298},{6,3,9256},{0,4,9298},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{1,7,65535},{0,7,21174},{0,6,81},{0,6,2545},{1,7,65535},{0,7,35191},{0,6,9269},{0,5,30102},{0,6,65535},{0,5,54602},{1,7,13604},{0,7,4274},{0,6,45},{0,5,2153},{4,1,25472},{0,6,16620},{0,5,7053},{0,3,17462},{4,2,25472}, +{0,3,17462},{0,6,36},{0,6,36},{0,6,36},{0,4,49},{0,3,3872},{0,3,2132},{0,3,2132},{0,1,2330},{0,1,4571},{0,1,2691},{0,6,36},{0,6,36},{0,6,36},{0,4,49},{0,3,3872},{0,3,2132},{0,3,2132},{0,1,2330},{1,1,3872},{0,1,2330},{7,0,9250},{1,7,3488},{0,6,45},{0,5,2153},{7,0,9250},{3,5,9250},{0,5,2153},{0,4,9266},{3,5,9250},{0,4,9266},{0,0,0}, +{0,0,0},{0,0,0},{0,0,0},{0,0,36},{0,0,36},{0,0,36},{0,0,100},{0,0,136},{0,0,136},{2,7,65535},{1,7,25204},{0,6,805},{0,6,2373},{1,7,65535},{0,7,39263},{0,6,8769},{0,5,31402},{0,6,65535},{0,5,55902},{1,7,14880},{1,7,5024},{0,6,321},{0,6,1889},{5,0,26756},{0,6,17000},{0,5,7049},{0,4,18139},{6,1,26756},{0,4,18139},{0,7,5},{0,7,5},{0,7,5}, +{0,4,5},{0,3,4468},{0,3,2248},{0,3,2248},{0,2,2722},{0,2,5411},{0,1,3227},{0,7,5},{0,7,5},{0,7,5},{0,4,5},{2,0,4420},{0,3,2248},{0,3,2248},{0,2,2722},{3,0,4420},{0,2,2722},{5,4,9250},{1,7,4000},{1,6,185},{0,6,1885},{5,4,9250},{7,3,9250},{0,6,1885},{0,4,9490},{7,3,9250},{0,4,9490},{0,0,4},{0,0,4},{0,0,4},{0,0,4},{0,0,16}, +{0,0,16},{0,0,16},{0,0,64},{0,0,100},{0,0,100},{2,7,65535},{1,7,29620},{0,7,1306},{0,6,3061},{2,7,65535},{0,7,43055},{0,6,8145},{0,6,31878},{0,7,65535},{0,5,56670},{2,7,14924},{1,7,5344},{0,7,406},{0,6,1617},{4,2,26756},{0,6,16744},{0,5,6553},{0,4,17195},{5,2,26756},{0,4,17195},{0,7,181},{0,7,181},{0,7,181},{0,4,181},{0,4,4418},{0,3,2056},{0,3,2056}, +{0,2,2210},{0,2,5411},{0,2,3171},{0,7,181},{0,7,181},{0,7,181},{0,4,181},{0,4,4418},{0,3,2056},{0,3,2056},{0,2,2210},{2,1,4418},{0,2,2210},{6,3,9248},{2,7,4292},{0,7,306},{0,6,1517},{6,3,9248},{6,4,9248},{0,6,1517},{0,5,9698},{6,4,9248},{0,5,9698},{0,0,100},{0,0,100},{0,0,100},{0,0,100},{0,0,16},{0,0,16},{0,0,16},{0,0,0},{0,0,36}, +{0,0,36},{2,7,65535},{1,7,35659},{0,7,865},{0,7,2657},{2,7,65535},{1,7,48315},{0,7,8072},{0,6,29745},{0,7,65535},{0,5,58605},{2,7,15347},{1,7,6163},{1,7,270},{0,6,1770},{5,1,26756},{0,7,15992},{0,6,5378},{0,4,16592},{6,2,26756},{0,4,16592},{0,7,685},{0,7,685},{0,7,685},{0,5,370},{0,5,4450},{0,4,1768},{0,4,1768},{0,2,1940},{0,2,5717},{0,2,2901},{1,7,234}, +{1,7,234},{1,7,234},{1,4,250},{1,3,4420},{0,4,1768},{0,4,1768},{0,2,1940},{1,2,4420},{0,2,1940},{7,2,9250},{3,7,4820},{1,7,45},{0,6,1409},{7,2,9250},{5,5,9250},{0,6,1409},{0,5,9320},{5,5,9250},{0,5,9320},{0,0,361},{0,0,361},{0,0,361},{0,0,361},{0,1,0},{0,1,0},{0,1,0},{0,0,81},{0,0,117},{0,0,117},{2,7,65535},{1,7,40299},{0,7,1405}, +{0,7,2173},{2,7,65535},{1,7,50747},{0,7,6068},{0,6,28101},{0,7,65535},{0,5,59897},{2,7,15659},{1,7,6963},{1,7,74},{1,6,2046},{6,0,26264},{0,7,15284},{0,6,4470},{0,4,16052},{3,4,26264},{0,4,16052},{1,7,1230},{1,7,1230},{1,7,1230},{0,5,754},{0,5,4450},{0,4,1576},{0,4,1576},{0,2,1972},{0,2,6261},{0,2,2933},{1,7,74},{1,7,74},{1,7,74},{1,5,113},{2,2,4418}, +{0,4,1576},{0,4,1576},{0,2,1972},{5,0,4418},{0,2,1972},{5,6,8980},{3,7,4808},{1,7,25},{0,7,1444},{5,6,8980},{4,6,8980},{0,7,1444},{0,5,8980},{4,6,8980},{0,5,8980},{0,0,729},{0,0,729},{0,0,729},{0,0,729},{0,2,16},{0,2,16},{0,2,16},{0,1,16},{0,0,325},{0,0,325},{2,7,65535},{1,7,40395},{0,7,2381},{0,7,2125},{2,7,65535},{1,7,48635},{0,7,4500}, +{0,6,24853},{0,7,65535},{0,5,57545},{3,7,14605},{2,7,6211},{1,7,170},{1,6,1598},{5,2,24379},{0,7,13716},{0,6,3446},{0,5,14549},{5,3,24379},{0,5,14549},{1,7,1326},{1,7,1326},{1,7,1326},{1,5,1157},{0,6,4418},{0,5,1394},{0,5,1394},{0,3,1621},{0,3,6482},{0,2,3221},{1,7,170},{1,7,170},{1,7,170},{1,5,1},{3,1,4418},{0,5,1394},{0,5,1394},{0,3,1621},{4,1,4418}, +{0,3,1621},{7,3,7940},{3,7,4264},{2,7,81},{0,7,900},{7,3,7940},{6,5,7940},{0,7,900},{0,5,7988},{6,5,7940},{0,5,7988},{1,0,1157},{1,0,1157},{1,0,1157},{1,0,1157},{0,2,16},{0,2,16},{0,2,16},{0,1,16},{0,1,377},{0,1,377},{2,7,65535},{1,7,40747},{0,7,3613},{0,7,2333},{2,7,65535},{1,7,46779},{0,7,3188},{0,6,21861},{0,7,65535},{0,5,55449},{3,7,13181}, +{2,7,5667},{1,7,522},{1,7,1306},{6,1,22571},{0,7,12404},{0,6,2678},{0,5,12453},{4,4,22571},{0,5,12453},{1,7,1678},{1,7,1678},{1,7,1678},{1,5,1301},{0,7,4468},{0,5,1170},{0,5,1170},{0,3,1285},{0,3,6866},{0,3,3221},{1,7,522},{1,7,522},{1,7,522},{1,5,145},{4,0,4420},{0,5,1170},{0,5,1170},{0,3,1285},{3,2,4420},{0,3,1285},{6,5,6964},{3,7,3848},{2,7,1}, +{0,7,484},{6,5,6964},{3,7,6964},{0,7,484},{0,5,7124},{3,7,6964},{0,5,7124},{1,0,1237},{1,0,1237},{1,0,1237},{1,0,1237},{0,3,1},{0,3,1},{0,3,1},{0,2,100},{0,1,505},{0,1,505},{2,7,65535},{1,7,41449},{0,7,5305},{0,7,2873},{2,7,65535},{1,7,44997},{0,7,2018},{0,6,18801},{0,7,65535},{0,6,52421},{3,7,11885},{2,7,5361},{2,7,320},{1,7,1000},{5,3,20645}, +{0,7,11234},{0,7,2018},{0,5,10401},{6,3,20645},{0,5,10401},{1,7,2380},{1,7,2380},{1,7,2380},{1,6,1496},{0,7,4450},{0,6,964},{0,6,964},{0,3,1213},{0,3,7604},{0,3,3149},{2,7,320},{2,7,320},{2,7,320},{2,5,272},{2,4,4418},{0,6,964},{0,6,964},{0,3,1213},{7,0,4418},{0,3,1213},{5,7,5941},{4,7,3181},{2,7,64},{0,7,169},{5,7,5941},{5,6,5941},{0,7,169}, +{0,5,6305},{5,6,5941},{0,5,6305},{1,0,1480},{1,0,1480},{1,0,1480},{1,0,1480},{0,4,25},{0,4,25},{0,4,25},{0,2,1},{0,1,802},{0,1,802},{2,7,65535},{1,7,42345},{0,7,7081},{0,7,3625},{2,7,65535},{1,7,43685},{0,7,1250},{0,6,16353},{0,7,65535},{0,6,49973},{3,7,11005},{3,7,5153},{2,7,320},{2,7,964},{7,0,19026},{1,7,10349},{0,7,1250},{0,5,8849},{3,5,19026}, +{0,5,8849},{1,7,3276},{1,7,3276},{1,7,3276},{1,6,1848},{0,7,4706},{0,6,740},{0,6,740},{0,4,1226},{0,4,7955},{0,3,3357},{2,7,320},{2,7,320},{2,7,320},{2,6,145},{3,3,4420},{0,6,740},{0,6,740},{0,4,1226},{6,1,4420},{0,4,1226},{7,4,5105},{4,7,2701},{3,7,25},{0,7,25},{7,4,5105},{7,5,5105},{0,7,25},{0,6,5645},{7,5,5105},{0,6,5645},{1,0,1832}, +{1,0,1832},{1,0,1832},{1,0,1832},{0,4,9},{0,4,9},{0,4,9},{0,2,49},{0,2,1010},{0,2,1010},{2,7,65535},{1,7,43497},{1,7,9052},{0,7,4633},{2,7,65535},{1,7,42629},{0,7,738},{0,6,14161},{0,7,65535},{0,6,47781},{3,7,10381},{3,7,4529},{2,7,576},{2,7,484},{5,4,17490},{1,7,9293},{0,7,738},{0,5,7553},{7,3,17490},{0,5,7553},{1,7,4428},{1,7,4428},{1,7,4428}, +{1,7,2412},{0,7,5218},{0,7,738},{0,7,738},{0,4,810},{0,4,8467},{0,3,3821},{2,7,576},{2,7,576},{2,7,576},{2,6,1},{4,2,4420},{0,7,738},{0,7,738},{0,4,810},{5,2,4420},{0,4,810},{6,6,4329},{4,7,2349},{3,7,9},{0,7,9},{6,6,4329},{4,7,4329},{0,7,9},{0,6,4637},{4,7,4329},{0,6,4637},{1,0,2312},{1,0,2312},{1,0,2312},{1,0,2312},{0,5,4}, +{0,5,4},{0,5,4},{0,3,36},{0,2,1186},{0,2,1186},{2,7,65535},{1,7,44905},{1,7,10460},{0,7,5897},{2,7,65535},{1,7,41829},{0,7,482},{0,6,12225},{0,7,65535},{0,6,45845},{4,7,9325},{3,7,4161},{3,7,797},{2,7,260},{7,1,16034},{1,7,8493},{0,7,482},{0,5,6513},{4,5,16034},{0,5,6513},{2,7,5712},{2,7,5712},{2,7,5712},{1,7,2924},{1,7,5672},{0,7,482},{0,7,482}, +{0,4,650},{0,4,9235},{0,4,3899},{3,7,797},{3,7,797},{3,7,797},{2,6,113},{5,1,4426},{0,7,482},{0,7,482},{0,4,650},{7,1,4426},{0,4,650},{6,6,3625},{5,7,1985},{4,7,100},{1,7,4},{6,6,3625},{6,6,3617},{1,7,4},{0,6,3757},{6,6,3617},{0,6,3757},{1,0,2920},{1,0,2920},{1,0,2920},{1,0,2920},{0,5,36},{0,5,36},{0,5,36},{0,3,4},{0,2,1490}, +{0,2,1490},{2,7,65535},{1,7,46795},{1,7,12350},{0,7,7625},{2,7,65535},{1,7,41235},{0,7,500},{0,6,10353},{0,7,65535},{0,6,43973},{4,7,8227},{3,7,4053},{3,7,689},{2,7,314},{6,3,14507},{2,7,7875},{0,7,500},{0,5,5649},{6,4,14507},{0,5,5649},{2,7,6594},{2,7,6594},{2,7,6594},{1,7,3806},{1,7,6086},{0,7,500},{0,7,500},{0,4,776},{0,5,9830},{0,4,4025},{3,7,689}, +{3,7,689},{3,7,689},{3,6,298},{6,0,4420},{0,7,500},{0,7,500},{0,4,776},{3,4,4420},{0,4,776},{7,5,2890},{5,7,1508},{4,7,1},{2,7,25},{7,5,2890},{6,6,2906},{2,7,25},{0,6,2920},{6,6,2906},{0,6,2920},{1,0,3757},{1,0,3757},{1,0,3757},{1,0,3757},{0,6,9},{0,6,9},{0,6,9},{0,4,100},{0,2,1985},{0,2,1985},{2,7,65535},{1,7,48747},{1,7,14302}, +{0,7,9433},{2,7,65535},{1,7,40979},{0,7,788},{0,6,8961},{0,7,65535},{0,6,42581},{4,7,7523},{4,7,3923},{3,7,865},{3,7,181},{7,2,13243},{2,7,7075},{1,7,754},{0,6,4337},{5,5,13243},{0,6,4337},{2,7,7650},{2,7,7650},{2,7,7650},{1,7,4862},{1,7,6726},{0,7,788},{0,7,788},{0,5,529},{0,5,10470},{0,4,4409},{3,7,865},{3,7,865},{3,7,865},{3,7,181},{5,2,4426}, +{1,7,754},{1,7,754},{0,5,529},{7,2,4426},{0,5,529},{6,7,2320},{5,7,1220},{4,7,49},{2,7,9},{6,7,2320},{5,7,2320},{2,7,9},{0,6,2312},{5,7,2320},{0,6,2312},{1,0,4637},{1,0,4637},{1,0,4637},{1,0,4637},{0,7,4},{0,7,4},{0,7,4},{0,4,4},{0,3,2297},{0,3,2297},{2,7,65535},{1,7,50955},{1,7,16510},{1,7,10798},{2,7,65535},{1,7,40979},{0,7,1332}, +{0,7,6964},{0,7,65535},{0,6,41445},{4,7,7075},{4,7,3475},{3,7,1297},{3,7,5},{6,4,12051},{2,7,6531},{1,7,754},{0,6,3201},{7,4,12051},{0,6,3201},{2,7,8962},{2,7,8962},{2,7,8962},{2,7,5834},{1,7,7622},{0,7,1332},{0,7,1332},{0,5,289},{0,6,11342},{0,4,5049},{3,7,1297},{3,7,1297},{3,7,1297},{3,7,5},{6,1,4426},{1,7,754},{1,7,754},{0,5,289},{6,3,4426}, +{0,5,289},{6,7,1808},{5,7,1060},{5,7,36},{3,7,4},{6,7,1808},{7,6,1808},{3,7,4},{0,6,1832},{7,6,1808},{0,6,1832},{1,0,5645},{1,0,5645},{1,0,5645},{1,0,5645},{0,7,36},{0,7,36},{0,7,36},{0,4,36},{0,3,2665},{0,3,2665},{2,7,65535},{1,7,53419},{1,7,18974},{1,7,12366},{2,7,65535},{1,7,41235},{0,7,2132},{0,7,5204},{0,7,65535},{0,6,40565},{5,7,6641}, +{4,7,3283},{4,7,1258},{3,7,85},{5,6,10952},{3,7,5900},{1,7,1010},{0,6,2321},{4,6,10952},{0,6,2321},{2,7,10530},{2,7,10530},{2,7,10530},{2,7,6666},{1,7,8774},{0,7,2132},{0,7,2132},{0,5,305},{0,6,11790},{0,5,5205},{4,7,1258},{4,7,1258},{4,7,1258},{3,7,85},{7,0,4420},{1,7,1010},{1,7,1010},{0,5,305},{3,5,4420},{0,5,305},{7,6,1360},{6,7,800},{5,7,4}, +{3,7,36},{7,6,1360},{7,6,1360},{3,7,36},{0,6,1480},{7,6,1360},{0,6,1480},{2,0,6305},{2,0,6305},{2,0,6305},{2,0,6305},{0,7,196},{0,7,196},{0,7,196},{0,5,49},{0,3,3161},{0,3,3161},{2,7,65535},{2,7,56301},{1,7,22052},{1,7,14436},{2,7,65535},{1,7,41829},{0,7,3338},{0,7,3530},{0,7,65535},{0,6,39881},{5,7,5741},{4,7,3373},{4,7,1348},{4,7,328},{7,3,9830}, +{3,7,5270},{2,7,1184},{0,6,1637},{6,5,9830},{0,6,1637},{2,7,12600},{2,7,12600},{2,7,12600},{2,7,7908},{1,7,10376},{1,7,2760},{1,7,2760},{0,6,481},{0,6,12600},{0,5,5529},{4,7,1348},{4,7,1348},{4,7,1348},{4,7,328},{7,1,4426},{2,7,1184},{2,7,1184},{0,6,481},{7,3,4426},{0,6,481},{7,6,937},{6,7,521},{5,7,121},{4,7,4},{7,6,937},{6,7,929},{4,7,4}, +{0,6,1237},{6,7,929},{0,6,1237},{2,0,7124},{2,0,7124},{2,0,7124},{2,0,7124},{0,7,529},{0,7,529},{0,7,529},{0,5,4},{0,4,3778},{0,4,3778},{2,7,65535},{2,7,58413},{1,7,25060},{1,7,16548},{2,7,65535},{1,7,42629},{0,7,4682},{0,7,2314},{0,7,65535},{0,6,39545},{5,7,5213},{5,7,3321},{4,7,1700},{4,7,200},{5,7,8902},{3,7,4982},{2,7,1440},{0,6,1301},{5,6,8902}, +{0,6,1301},{3,7,14701},{3,7,14701},{3,7,14701},{2,7,9284},{2,7,11492},{1,7,3560},{1,7,3560},{0,6,145},{0,6,13592},{0,5,6089},{4,7,1700},{4,7,1700},{4,7,1700},{4,7,200},{6,3,4420},{2,7,1440},{2,7,1440},{0,6,145},{6,4,4420},{0,6,145},{7,6,697},{6,7,409},{6,7,9},{5,7,9},{7,6,697},{6,7,625},{5,7,9},{0,6,1157},{6,7,625},{0,6,1157},{2,0,7988}, +{2,0,7988},{2,0,7988},{2,0,7988},{0,7,961},{0,7,961},{0,7,961},{0,5,100},{0,4,4210},{0,4,4210},{3,7,65535},{2,7,60781},{1,7,28324},{1,7,18916},{2,7,65535},{1,7,43685},{0,7,6282},{0,7,1354},{0,7,65535},{0,6,39465},{5,7,4941},{5,7,3049},{5,7,2025},{4,7,328},{7,4,8069},{4,7,4465},{3,7,1586},{0,6,1221},{7,5,8069},{0,6,1221},{3,7,16189},{3,7,16189},{3,7,16189}, +{2,7,10916},{2,7,12740},{1,7,4616},{1,7,4616},{0,6,65},{0,7,14411},{0,6,6789},{5,7,2025},{5,7,2025},{5,7,2025},{4,7,328},{7,2,4420},{3,7,1586},{3,7,1586},{0,6,65},{5,5,4420},{0,6,65},{7,7,377},{7,7,305},{6,7,25},{5,7,25},{7,7,377},{6,7,449},{5,7,25},{0,7,729},{6,7,449},{0,7,729},{2,0,8980},{2,0,8980},{2,0,8980},{2,0,8980},{1,7,1480}, +{1,7,1480},{1,7,1480},{0,6,16},{0,4,4770},{0,4,4770},{3,7,65535},{2,7,59505},{1,7,29984},{1,7,19680},{2,7,65535},{1,7,43137},{0,7,8318},{0,7,830},{0,7,65535},{0,6,34901},{5,7,4925},{5,7,3033},{5,7,2009},{4,7,712},{6,6,7325},{4,7,4145},{3,7,1810},{0,7,650},{4,7,7325},{0,7,650},{3,7,16745},{3,7,16745},{3,7,16745},{2,7,12024},{2,7,13464},{1,7,5556},{1,7,5556}, +{0,6,277},{0,7,14139},{0,6,6017},{5,7,2009},{5,7,2009},{5,7,2009},{4,7,712},{5,6,4418},{3,7,1810},{3,7,1810},{0,6,241},{4,6,4418},{0,6,241},{7,7,185},{7,7,113},{7,7,64},{6,7,1},{7,7,185},{7,7,193},{6,7,1},{0,7,361},{7,7,193},{0,7,361},{2,0,9320},{2,0,9320},{2,0,9320},{2,0,9320},{1,7,1460},{1,7,1460},{1,7,1460},{0,6,52},{0,5,4772}, +{0,5,4772},{3,7,65535},{2,7,57588},{1,7,32135},{1,7,20823},{3,7,65535},{1,7,42804},{1,7,8359},{0,7,1289},{0,7,65535},{0,6,28970},{6,7,4317},{5,7,3321},{5,7,2297},{5,7,845},{7,5,6587},{5,7,4008},{4,7,2066},{0,7,164},{6,6,6611},{0,7,164},{3,7,17366},{3,7,17366},{3,7,17366},{3,7,12274},{2,7,14427},{2,7,6699},{2,7,6699},{0,7,389},{0,7,13860},{0,6,5234},{5,7,2297}, +{5,7,2297},{5,7,2297},{5,7,845},{6,5,4420},{4,7,2066},{4,7,2066},{0,7,164},{3,7,4420},{0,7,164},{7,7,122},{7,7,50},{7,7,1},{7,7,9},{7,7,122},{7,7,58},{7,7,9},{0,7,100},{7,7,58},{0,7,100},{2,0,9698},{2,0,9698},{2,0,9698},{2,0,9698},{1,7,1586},{1,7,1586},{1,7,1586},{0,7,289},{0,5,4250},{0,5,4250},{3,7,65535},{2,7,56836},{2,7,31631}, +{1,7,22791},{3,7,65535},{2,7,40532},{1,7,9015},{1,7,778},{0,7,65535},{0,6,24650},{6,7,3949},{6,7,3325},{5,7,2825},{5,7,1021},{6,7,6020},{5,7,3688},{4,7,2290},{0,7,4},{5,7,6020},{0,7,4},{3,7,18326},{3,7,18326},{3,7,18326},{3,7,12626},{3,7,15077},{2,7,7227},{2,7,7227},{1,7,294},{0,7,14020},{0,6,4946},{5,7,2825},{5,7,2825},{5,7,2825},{5,7,1021},{7,4,4418}, +{4,7,2290},{4,7,2290},{0,7,4},{7,5,4418},{0,7,4},{7,7,202},{7,7,130},{7,7,81},{7,7,25},{7,7,202},{7,7,74},{7,7,25},{0,7,4},{7,7,74},{0,7,4},{3,0,9490},{3,0,9490},{3,0,9490},{3,0,9490},{1,7,1970},{1,7,1970},{1,7,1970},{1,6,202},{0,6,3922},{0,6,3922},{3,7,65535},{3,7,55466},{2,7,30335},{2,7,21687},{3,7,65535},{2,7,37932},{1,7,9535}, +{1,7,70},{0,7,65535},{0,7,20544},{6,7,3417},{6,7,2793},{6,7,2393},{5,7,1033},{6,7,5184},{5,7,3204},{5,7,2180},{1,7,25},{7,6,5168},{1,7,25},{4,7,17611},{4,7,17611},{4,7,17611},{3,7,12630},{3,7,14321},{2,7,7251},{2,7,7251},{1,7,34},{0,7,13376},{0,7,4160},{6,7,2393},{6,7,2393},{6,7,2393},{5,7,1033},{6,6,3874},{5,7,2180},{5,7,2180},{1,7,25},{4,7,3874}, +{1,7,25},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{3,0,9266},{3,0,9266},{3,0,9266},{3,0,9266},{2,7,2210},{2,7,2210},{2,7,2210},{1,7,34},{0,6,3442},{0,6,3442},{3,7,65535},{3,7,51210},{2,7,29343},{2,7,20695},{3,7,65535},{2,7,35820},{1,7,10495},{1,7,134},{1,7,65535},{0,7,15936},{6,7,2889}, +{6,7,2265},{6,7,1865},{5,7,1049},{7,6,4288},{5,7,2724},{5,7,1700},{1,7,9},{7,6,4272},{1,7,9},{4,7,16555},{4,7,16555},{4,7,16555},{3,7,12662},{3,7,13441},{2,7,7251},{2,7,7251},{1,7,34},{0,7,12608},{0,7,3392},{6,7,1865},{6,7,1865},{6,7,1865},{5,7,1049},{7,5,3218},{5,7,1700},{5,7,1700},{1,7,9},{6,6,3202},{1,7,9},{7,7,242},{7,7,170},{7,7,121}, +{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{3,0,9298},{3,0,9298},{3,0,9298},{3,0,9298},{2,7,2210},{2,7,2210},{2,7,2210},{1,7,34},{0,6,3218},{0,6,3218},{4,7,65535},{3,7,47340},{2,7,29145},{2,7,20497},{3,7,65535},{2,7,34362},{2,7,9157},{1,7,1124},{1,7,64598},{0,7,11670},{6,7,2448},{6,7,1824},{6,7,1424},{6,7,800},{7,6,3361}, +{6,7,2321},{5,7,1313},{2,7,0},{6,7,3401},{2,7,0},{4,7,15673},{4,7,15673},{4,7,15673},{4,7,12073},{3,7,12757},{3,7,6905},{3,7,6905},{1,7,340},{1,7,11657},{0,7,2834},{6,7,1424},{6,7,1424},{6,7,1424},{6,7,800},{7,5,2525},{5,7,1313},{5,7,1313},{2,7,0},{5,7,2545},{2,7,0},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49}, +{0,7,0},{7,7,98},{0,7,0},{3,0,9640},{3,0,9640},{3,0,9640},{3,0,9640},{2,7,2516},{2,7,2516},{2,7,2516},{1,7,340},{0,7,2834},{0,7,2834},{4,7,65535},{3,7,44716},{3,7,27896},{2,7,21137},{4,7,65535},{3,7,31853},{2,7,8677},{2,7,784},{1,7,59734},{0,7,8694},{6,7,2192},{6,7,1568},{6,7,1168},{6,7,544},{7,6,2673},{6,7,1761},{5,7,1105},{3,7,25},{6,7,2649}, +{3,7,25},{4,7,15161},{4,7,15161},{4,7,15161},{4,7,11561},{4,7,12169},{3,7,6569},{3,7,6569},{2,7,208},{1,7,10889},{0,7,2610},{6,7,1168},{6,7,1168},{6,7,1168},{6,7,544},{6,7,1985},{5,7,1105},{5,7,1105},{3,7,25},{5,7,1985},{3,7,25},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{4,0,9536}, +{4,0,9536},{4,0,9536},{4,0,9536},{2,7,3060},{2,7,3060},{2,7,3060},{2,7,208},{0,7,2610},{0,7,2610},{4,7,63766},{3,7,42860},{3,7,26040},{3,7,20188},{4,7,60070},{3,7,29085},{2,7,8965},{2,7,336},{1,7,55638},{0,7,6486},{7,7,1686},{6,7,1440},{6,7,1040},{6,7,416},{7,6,2113},{6,7,1329},{6,7,929},{3,7,9},{6,7,2025},{3,7,9},{4,7,14905},{4,7,14905},{4,7,14905}, +{4,7,11305},{4,7,11209},{3,7,6489},{3,7,6489},{2,7,272},{1,7,10377},{0,7,2642},{6,7,1040},{6,7,1040},{6,7,1040},{6,7,416},{7,6,1537},{6,7,929},{6,7,929},{3,7,9},{7,6,1513},{3,7,9},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{4,0,9280},{4,0,9280},{4,0,9280},{4,0,9280},{3,7,3125}, +{3,7,3125},{3,7,3125},{2,7,272},{0,7,2642},{0,7,2642},{4,7,59414},{4,7,41414},{3,7,24952},{3,7,19100},{4,7,55014},{3,7,27085},{2,7,10021},{2,7,656},{1,7,52310},{0,7,5046},{7,7,1142},{7,7,1070},{7,7,1021},{6,7,416},{7,7,1538},{6,7,1025},{6,7,625},{4,7,4},{6,7,1529},{4,7,4},{5,7,13964},{5,7,13964},{5,7,13964},{4,7,11305},{4,7,10505},{3,7,6665},{3,7,6665}, +{2,7,592},{2,7,9973},{0,7,2930},{7,7,1021},{7,7,1021},{7,7,1021},{6,7,416},{7,6,1105},{6,7,625},{6,7,625},{4,7,4},{6,7,1129},{4,7,4},{7,7,242},{7,7,170},{7,7,121},{7,7,49},{7,7,242},{7,7,98},{7,7,49},{0,7,0},{7,7,98},{0,7,0},{4,0,9280},{4,0,9280},{4,0,9280},{4,0,9280},{3,7,3301},{3,7,3301},{3,7,3301},{2,7,592},{0,7,2930}, +{0,7,2930}, diff --git a/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h b/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h new file mode 100644 index 0000000..f91314f --- /dev/null +++ b/ktx/external/basisu/transcoder/basisu_transcoder_uastc.h @@ -0,0 +1,293 @@ +// basisu_transcoder_uastc.h +#pragma once +#include "basisu_transcoder_internal.h" + +namespace basist +{ + struct color_quad_u8 + { + uint8_t m_c[4]; + }; + + const uint32_t TOTAL_UASTC_MODES = 19; + const uint32_t UASTC_MODE_INDEX_SOLID_COLOR = 8; + + const uint32_t TOTAL_ASTC_BC7_COMMON_PARTITIONS2 = 30; + const uint32_t TOTAL_ASTC_BC7_COMMON_PARTITIONS3 = 11; + const uint32_t TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS = 19; + + extern const uint8_t g_uastc_mode_weight_bits[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_weight_ranges[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_endpoint_ranges[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_subsets[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_planes[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_comps[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_has_etc1_bias[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_has_bc1_hint0[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_has_bc1_hint1[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_has_alpha[TOTAL_UASTC_MODES]; + extern const uint8_t g_uastc_mode_is_la[TOTAL_UASTC_MODES]; + + struct astc_bc7_common_partition2_desc + { + uint8_t m_bc7; + uint16_t m_astc; + bool m_invert; + }; + + extern const astc_bc7_common_partition2_desc g_astc_bc7_common_partitions2[TOTAL_ASTC_BC7_COMMON_PARTITIONS2]; + + struct bc73_astc2_common_partition_desc + { + uint8_t m_bc73; + uint16_t m_astc2; + uint8_t k; // 0-5 - how to modify the BC7 3-subset pattern to match the ASTC pattern (LSB=invert) + }; + + extern const bc73_astc2_common_partition_desc g_bc7_3_astc2_common_partitions[TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS]; + + struct astc_bc7_common_partition3_desc + { + uint8_t m_bc7; + uint16_t m_astc; + uint8_t m_astc_to_bc7_perm; // converts ASTC to BC7 partition using g_astc_bc7_partition_index_perm_tables[][] + }; + + extern const astc_bc7_common_partition3_desc g_astc_bc7_common_partitions3[TOTAL_ASTC_BC7_COMMON_PARTITIONS3]; + + extern const uint8_t g_astc_bc7_patterns2[TOTAL_ASTC_BC7_COMMON_PARTITIONS2][16]; + extern const uint8_t g_astc_bc7_patterns3[TOTAL_ASTC_BC7_COMMON_PARTITIONS3][16]; + extern const uint8_t g_bc7_3_astc2_patterns2[TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS][16]; + + extern const uint8_t g_astc_bc7_pattern2_anchors[TOTAL_ASTC_BC7_COMMON_PARTITIONS2][3]; + extern const uint8_t g_astc_bc7_pattern3_anchors[TOTAL_ASTC_BC7_COMMON_PARTITIONS3][3]; + extern const uint8_t g_bc7_3_astc2_patterns2_anchors[TOTAL_BC7_3_ASTC2_COMMON_PARTITIONS][3]; + + extern const uint32_t g_uastc_mode_huff_codes[TOTAL_UASTC_MODES + 1][2]; + + extern const uint8_t g_astc_to_bc7_partition_index_perm_tables[6][3]; + extern const uint8_t g_bc7_to_astc_partition_index_perm_tables[6][3]; // inverse of g_astc_to_bc7_partition_index_perm_tables + + extern const uint8_t* s_uastc_to_bc1_weights[6]; + + uint32_t bc7_convert_partition_index_3_to_2(uint32_t p, uint32_t k); + + inline uint32_t astc_interpolate(uint32_t l, uint32_t h, uint32_t w, bool srgb) + { + if (srgb) + { + l = (l << 8) | 0x80; + h = (h << 8) | 0x80; + } + else + { + l = (l << 8) | l; + h = (h << 8) | h; + } + + uint32_t k = (l * (64 - w) + h * w + 32) >> 6; + + return k >> 8; + } + + struct astc_block_desc + { + int m_weight_range; // weight BISE range + + int m_subsets; // number of ASTC partitions + int m_partition_seed; // partition pattern seed + int m_cem; // color endpoint mode used by all subsets + + int m_ccs; // color component selector (dual plane only) + bool m_dual_plane; // true if dual plane + + // Weight and endpoint BISE values. + // Note these values are NOT linear, they must be BISE encoded. See Table 97 and Table 107. + uint8_t m_endpoints[18]; // endpoint values, in RR GG BB etc. order + uint8_t m_weights[64]; // weight index values, raster order, in P0 P1, P0 P1, etc. or P0, P0, P0, P0, etc. order + }; + + const uint32_t BC7ENC_TOTAL_ASTC_RANGES = 21; + + // See tables 81, 93, 18.13.Endpoint Unquantization + const uint32_t TOTAL_ASTC_RANGES = 21; + extern const int g_astc_bise_range_table[TOTAL_ASTC_RANGES][3]; + + struct astc_quant_bin + { + uint8_t m_unquant; // unquantized value + uint8_t m_index; // sorted index + }; + + extern astc_quant_bin g_astc_unquant[BC7ENC_TOTAL_ASTC_RANGES][256]; // [ASTC encoded endpoint index] + + int astc_get_levels(int range); + bool astc_is_valid_endpoint_range(uint32_t range); + uint32_t unquant_astc_endpoint(uint32_t packed_bits, uint32_t packed_trits, uint32_t packed_quints, uint32_t range); + uint32_t unquant_astc_endpoint_val(uint32_t packed_val, uint32_t range); + + const uint8_t* get_anchor_indices(uint32_t subsets, uint32_t mode, uint32_t common_pattern, const uint8_t*& pPartition_pattern); + + // BC7 + const uint32_t BC7ENC_BLOCK_SIZE = 16; + + struct bc7_block + { + uint64_t m_qwords[2]; + }; + + struct bc7_optimization_results + { + uint32_t m_mode; + uint32_t m_partition; + uint8_t m_selectors[16]; + uint8_t m_alpha_selectors[16]; + color_quad_u8 m_low[3]; + color_quad_u8 m_high[3]; + uint32_t m_pbits[3][2]; + uint32_t m_index_selector; + uint32_t m_rotation; + }; + + extern const uint32_t g_bc7_weights1[2]; + extern const uint32_t g_bc7_weights2[4]; + extern const uint32_t g_bc7_weights3[8]; + extern const uint32_t g_bc7_weights4[16]; + extern const uint32_t g_astc_weights4[16]; + extern const uint32_t g_astc_weights5[32]; + extern const uint32_t g_astc_weights_3levels[3]; + extern const uint8_t g_bc7_partition1[16]; + extern const uint8_t g_bc7_partition2[64 * 16]; + extern const uint8_t g_bc7_partition3[64 * 16]; + extern const uint8_t g_bc7_table_anchor_index_second_subset[64]; + extern const uint8_t g_bc7_table_anchor_index_third_subset_1[64]; + extern const uint8_t g_bc7_table_anchor_index_third_subset_2[64]; + extern const uint8_t g_bc7_num_subsets[8]; + extern const uint8_t g_bc7_partition_bits[8]; + extern const uint8_t g_bc7_color_index_bitcount[8]; + extern const uint8_t g_bc7_mode_has_p_bits[8]; + extern const uint8_t g_bc7_mode_has_shared_p_bits[8]; + extern const uint8_t g_bc7_color_precision_table[8]; + extern const int8_t g_bc7_alpha_precision_table[8]; + extern const uint8_t g_bc7_alpha_index_bitcount[8]; + + inline bool get_bc7_mode_has_seperate_alpha_selectors(int mode) { return (mode == 4) || (mode == 5); } + inline int get_bc7_color_index_size(int mode, int index_selection_bit) { return g_bc7_color_index_bitcount[mode] + index_selection_bit; } + inline int get_bc7_alpha_index_size(int mode, int index_selection_bit) { return g_bc7_alpha_index_bitcount[mode] - index_selection_bit; } + + struct endpoint_err + { + uint16_t m_error; uint8_t m_lo; uint8_t m_hi; + }; + + extern endpoint_err g_bc7_mode_6_optimal_endpoints[256][2]; // [c][pbit] + const uint32_t BC7ENC_MODE_6_OPTIMAL_INDEX = 5; + + extern endpoint_err g_bc7_mode_5_optimal_endpoints[256]; // [c] + const uint32_t BC7ENC_MODE_5_OPTIMAL_INDEX = 1; + + // Packs a BC7 block from a high-level description. Handles all BC7 modes. + void encode_bc7_block(void* pBlock, const bc7_optimization_results* pResults); + + // Packs an ASTC block + // Constraints: Always 4x4, all subset CEM's must be equal, only tested with LDR CEM's. + bool pack_astc_block(uint32_t* pDst, const astc_block_desc* pBlock, uint32_t mode); + + void pack_astc_solid_block(void* pDst_block, const color32& color); + +#ifdef _DEBUG + int astc_compute_texel_partition(int seed, int x, int y, int z, int partitioncount, bool small_block); +#endif + + struct uastc_block + { + union + { + uint8_t m_bytes[16]; + uint32_t m_dwords[4]; + }; + }; + + struct unpacked_uastc_block + { + astc_block_desc m_astc; + + uint32_t m_mode; + uint32_t m_common_pattern; + + color32 m_solid_color; + + bool m_bc1_hint0; + bool m_bc1_hint1; + + bool m_etc1_flip; + bool m_etc1_diff; + uint32_t m_etc1_inten0; + uint32_t m_etc1_inten1; + + uint32_t m_etc1_bias; + + uint32_t m_etc2_hints; + + uint32_t m_etc1_selector; + uint32_t m_etc1_r, m_etc1_g, m_etc1_b; + }; + + color32 apply_etc1_bias(const color32 &block_color, uint32_t bias, uint32_t limit, uint32_t subblock); + + struct decoder_etc_block; + struct eac_block; + + bool unpack_uastc(uint32_t mode, uint32_t common_pattern, const color32& solid_color, const astc_block_desc& astc, color32* pPixels, bool srgb); + bool unpack_uastc(const unpacked_uastc_block& unpacked_blk, color32* pPixels, bool srgb); + + bool unpack_uastc(const uastc_block& blk, color32* pPixels, bool srgb); + bool unpack_uastc(const uastc_block& blk, unpacked_uastc_block& unpacked, bool undo_blue_contract, bool read_hints = true); + + bool transcode_uastc_to_astc(const uastc_block& src_blk, void* pDst); + + bool transcode_uastc_to_bc7(const unpacked_uastc_block& unpacked_src_blk, bc7_optimization_results& dst_blk); + bool transcode_uastc_to_bc7(const uastc_block& src_blk, bc7_optimization_results& dst_blk); + bool transcode_uastc_to_bc7(const uastc_block& src_blk, void* pDst); + + void transcode_uastc_to_etc1(unpacked_uastc_block& unpacked_src_blk, color32 block_pixels[4][4], void* pDst); + bool transcode_uastc_to_etc1(const uastc_block& src_blk, void* pDst); + bool transcode_uastc_to_etc1(const uastc_block& src_blk, void* pDst, uint32_t channel); + + void transcode_uastc_to_etc2_eac_a8(unpacked_uastc_block& unpacked_src_blk, color32 block_pixels[4][4], void* pDst); + bool transcode_uastc_to_etc2_rgba(const uastc_block& src_blk, void* pDst); + + // Packs 16 scalar values to BC4. Same PSNR as stb_dxt's BC4 encoder, around 13% faster. + void encode_bc4(void* pDst, const uint8_t* pPixels, uint32_t stride); + + void encode_bc1_solid_block(void* pDst, uint32_t fr, uint32_t fg, uint32_t fb); + + enum + { + cEncodeBC1HighQuality = 1, + cEncodeBC1HigherQuality = 2, + cEncodeBC1UseSelectors = 4, + }; + void encode_bc1(void* pDst, const uint8_t* pPixels, uint32_t flags); + + // Alternate PCA-free encoder, around 15% faster, same (or slightly higher) avg. PSNR + void encode_bc1_alt(void* pDst, const uint8_t* pPixels, uint32_t flags); + + void transcode_uastc_to_bc1_hint0(const unpacked_uastc_block& unpacked_src_blk, void* pDst); + void transcode_uastc_to_bc1_hint1(const unpacked_uastc_block& unpacked_src_blk, const color32 block_pixels[4][4], void* pDst, bool high_quality); + + bool transcode_uastc_to_bc1(const uastc_block& src_blk, void* pDst, bool high_quality); + bool transcode_uastc_to_bc3(const uastc_block& src_blk, void* pDst, bool high_quality); + bool transcode_uastc_to_bc4(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0); + bool transcode_uastc_to_bc5(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0, uint32_t chan1); + + bool transcode_uastc_to_etc2_eac_r11(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0); + bool transcode_uastc_to_etc2_eac_rg11(const uastc_block& src_blk, void* pDst, bool high_quality, uint32_t chan0, uint32_t chan1); + + bool transcode_uastc_to_pvrtc1_4_rgb(const uastc_block* pSrc_blocks, void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, bool high_quality, bool from_alpha); + bool transcode_uastc_to_pvrtc1_4_rgba(const uastc_block* pSrc_blocks, void* pDst_blocks, uint32_t num_blocks_x, uint32_t num_blocks_y, bool high_quality); + + // uastc_init() MUST be called before using this module. + void uastc_init(); + +} // namespace basist diff --git a/ktx/external/basisu/webgl/README.md b/ktx/external/basisu/webgl/README.md new file mode 100644 index 0000000..79b6cb9 --- /dev/null +++ b/ktx/external/basisu/webgl/README.md @@ -0,0 +1,61 @@ +# WebGL Examples + +Requires WebAssembly and WebGL support. + +## Texture + +[Live demo: `texture/index.html`](https://basis-universal-webgl.now.sh/texture/) + +(Note the Live texture demo hasn't been updated to the latest release yet.) + +Renders a single texture, using the transcoder (compiled to WASM with emscripten) to generate one of the following compressed texture formats: + +* ASTC +* BC1 (no alpha) +* BC3 +* ETC1 (no alpha) +* PVRTC + +On browsers that don't support any compressed texture format, there's a low-quality fallback code path for opaque textures. Note that the fallback path only converts to 16-bit RGB images at the moment, so the quality isn't as good as it should be. + +![Screenshot showing a basis texture rendered as a 2D image in a webpage.](texture/preview.png) + +## glTF 3D Model + +[Live demo: `gltf/index.html`](https://basis-universal-webgl.now.sh/gltf/) + +Renders a glTF 3D model with `.basis` texture files, transcoded into one of the following compressed texture formats: + +* ASTC + * Tested in Chrome on Android, Pixel 3 XL. +* DTX (BC1/BC3) + * Tested in Chrome (Linux and macOS) and Firefox (macOS). +* ETC1 + * Tested in Chrome on Android, Pixel 3 XL. +* PVRTC + * Tested in Chrome and Safari on iOS iPhone 6 Plus. + +The glTF model in this demo uses a hypothetical `GOOGLE_texture_basis` extension. That extension is defined for the sake of example only - the glTF format will officially embed Basis files within a KTX2 wrapper, through a new +extension that is [currently in development](https://github.com/KhronosGroup/glTF/pull/1612). + +![Screenshot showing a basis texture rendered as the base color texture for a 3D model in a webpage.](gltf/preview.png) + +## Compressor (encode_test) + +This demo shows how to use the compressor from JavaScript. To use it, select a .PNG file then hit the "Encode!" button. The compressor will dynamically generate a .basis file in memory which will then be immediately transcoded and displayed. Hit the "Download!" button to locally download the generated .basis file. + +To view the compressor's textual debug output, open your browser's developer debug console (under Developer Tools in Chrome) and enable the Debug checkbox before hitting the "Encode!" button. Multithreading is not currently supported when the compressor is compiled to WebAssembly, so compression will be slower than using the stand-alone command line tool. + +![Screenshot showing the encode_test demo](encode_test/preview.png) + +## Testing locally + +See [how to run things locally](https://threejs.org/docs/#manual/en/introduction/How-to-run-things-locally), or (with [Node.js](https://nodejs.org/en/) installed), run: + +``` +npx serve +``` + +The console will display a `localhost` URL for local testing, and (on supported WiFi networks and devices) may also display an IP address accessible by other devices on the same network. Note that mobile devices must support WebAssembly to run this demo. Learn more about [remote debugging your android devices](https://developers.google.com/web/tools/chrome-devtools/remote-debugging/). + +Alternately, use [Web Server for Chrome](https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb), browse to your local "webgl" directory, and then select 127.0.0.1:8887 under "Web Server URL(s). diff --git a/ktx/external/basisu/webgl/encode_test/assets/kodim03.png b/ktx/external/basisu/webgl/encode_test/assets/kodim03.png new file mode 100644 index 0000000..639a417 Binary files /dev/null and b/ktx/external/basisu/webgl/encode_test/assets/kodim03.png differ diff --git a/ktx/external/basisu/webgl/encode_test/assets/kodim18.png b/ktx/external/basisu/webgl/encode_test/assets/kodim18.png new file mode 100644 index 0000000..187fec2 Binary files /dev/null and b/ktx/external/basisu/webgl/encode_test/assets/kodim18.png differ diff --git a/ktx/external/basisu/webgl/encode_test/assets/kodim18_64x64.png b/ktx/external/basisu/webgl/encode_test/assets/kodim18_64x64.png new file mode 100644 index 0000000..1166093 Binary files /dev/null and b/ktx/external/basisu/webgl/encode_test/assets/kodim18_64x64.png differ diff --git a/ktx/external/basisu/webgl/encode_test/assets/kodim26_uastc_1024.basis b/ktx/external/basisu/webgl/encode_test/assets/kodim26_uastc_1024.basis new file mode 100644 index 0000000..671d188 Binary files /dev/null and b/ktx/external/basisu/webgl/encode_test/assets/kodim26_uastc_1024.basis differ diff --git a/ktx/external/basisu/webgl/encode_test/dxt-to-rgb565.js b/ktx/external/basisu/webgl/encode_test/dxt-to-rgb565.js new file mode 100644 index 0000000..8e35be4 --- /dev/null +++ b/ktx/external/basisu/webgl/encode_test/dxt-to-rgb565.js @@ -0,0 +1,128 @@ +/** + * Transcodes DXT into RGB565. + * This is an optimized version of dxtToRgb565Unoptimized() below. + * Optimizations: + * 1. Use integer math to compute c2 and c3 instead of floating point + * math. Specifically: + * c2 = 5/8 * c0 + 3/8 * c1 + * c3 = 3/8 * c0 + 5/8 * c1 + * This is about a 40% performance improvement. It also appears to + * match what hardware DXT decoders do, as the colors produced + * by this integer math match what hardware produces, while the + * floating point in dxtToRgb565Unoptimized() produce slightly + * different colors (for one GPU this was tested on). + * 2. Unroll the inner loop. Another ~10% improvement. + * 3. Compute r0, g0, b0, r1, g1, b1 only once instead of twice. + * Another 10% improvement. + * 4. Use a Uint16Array instead of a Uint8Array. Another 10% improvement. + * @param {Uint16Array} src The src DXT bits as a Uint16Array. + * @param {number} srcByteOffset + * @param {number} width + * @param {number} height + * @return {Uint16Array} dst + */ +function dxtToRgb565(src, src16Offset, width, height) { + var c = new Uint16Array(4); + var dst = new Uint16Array(width * height); + var nWords = (width * height) / 4; + var m = 0; + var dstI = 0; + var i = 0; + var r0 = 0, g0 = 0, b0 = 0, r1 = 0, g1 = 0, b1 = 0; + + var blockWidth = width / 4; + var blockHeight = height / 4; + for (var blockY = 0; blockY < blockHeight; blockY++) { + for (var blockX = 0; blockX < blockWidth; blockX++) { + i = src16Offset + 4 * (blockY * blockWidth + blockX); + c[0] = src[i]; + c[1] = src[i + 1]; + + r0 = c[0] & 0x1f; + g0 = c[0] & 0x7e0; + b0 = c[0] & 0xf800; + r1 = c[1] & 0x1f; + g1 = c[1] & 0x7e0; + b1 = c[1] & 0xf800; + // Interpolate between c0 and c1 to get c2 and c3. + // Note that we approximate 1/3 as 3/8 and 2/3 as 5/8 for + // speed. This also appears to be what the hardware DXT + // decoder in many GPUs does :) + + // rg FIXME: This is most likely leading to wrong results vs. a GPU + + c[2] = ((5 * r0 + 3 * r1) >> 3) + | (((5 * g0 + 3 * g1) >> 3) & 0x7e0) + | (((5 * b0 + 3 * b1) >> 3) & 0xf800); + c[3] = ((5 * r1 + 3 * r0) >> 3) + | (((5 * g1 + 3 * g0) >> 3) & 0x7e0) + | (((5 * b1 + 3 * b0) >> 3) & 0xf800); + m = src[i + 2]; + dstI = (blockY * 4) * width + blockX * 4; + dst[dstI] = c[m & 0x3]; + dst[dstI + 1] = c[(m >> 2) & 0x3]; + dst[dstI + 2] = c[(m >> 4) & 0x3]; + dst[dstI + 3] = c[(m >> 6) & 0x3]; + dstI += width; + dst[dstI] = c[(m >> 8) & 0x3]; + dst[dstI + 1] = c[(m >> 10) & 0x3]; + dst[dstI + 2] = c[(m >> 12) & 0x3]; + dst[dstI + 3] = c[(m >> 14)]; + m = src[i + 3]; + dstI += width; + dst[dstI] = c[m & 0x3]; + dst[dstI + 1] = c[(m >> 2) & 0x3]; + dst[dstI + 2] = c[(m >> 4) & 0x3]; + dst[dstI + 3] = c[(m >> 6) & 0x3]; + dstI += width; + dst[dstI] = c[(m >> 8) & 0x3]; + dst[dstI + 1] = c[(m >> 10) & 0x3]; + dst[dstI + 2] = c[(m >> 12) & 0x3]; + dst[dstI + 3] = c[(m >> 14)]; + } + } + return dst; +} + + +/** + * An unoptimized version of dxtToRgb565. Also, the floating + * point math used to compute the colors actually results in + * slightly different colors compared to hardware DXT decoders. + * @param {Uint8Array} src + * @param {number} srcByteOffset + * @param {number} width + * @param {number} height + * @return {Uint16Array} dst + */ +function dxtToRgb565Unoptimized(src, srcByteOffset, width, height) { + var c = new Uint16Array(4); + var dst = new Uint16Array(width * height); + var nWords = (width * height) / 4; + + var blockWidth = width / 4; + var blockHeight = height / 4; + for (var blockY = 0; blockY < blockHeight; blockY++) { + for (var blockX = 0; blockX < blockWidth; blockX++) { + var i = srcByteOffset + 8 * (blockY * blockWidth + blockX); + c[0] = src[i] | (src[i + 1] << 8); + c[1] = src[i + 2] | (src[i + 3] << 8); + c[2] = (2 * (c[0] & 0x1f) + 1 * (c[1] & 0x1f)) / 3 + | (((2 * (c[0] & 0x7e0) + 1 * (c[1] & 0x7e0)) / 3) & 0x7e0) + | (((2 * (c[0] & 0xf800) + 1 * (c[1] & 0xf800)) / 3) & 0xf800); + c[3] = (2 * (c[1] & 0x1f) + 1 * (c[0] & 0x1f)) / 3 + | (((2 * (c[1] & 0x7e0) + 1 * (c[0] & 0x7e0)) / 3) & 0x7e0) + | (((2 * (c[1] & 0xf800) + 1 * (c[0] & 0xf800)) / 3) & 0xf800); + for (var row = 0; row < 4; row++) { + var m = src[i + 4 + row]; + var dstI = (blockY * 4 + row) * width + blockX * 4; + dst[dstI++] = c[m & 0x3]; + dst[dstI++] = c[(m >> 2) & 0x3]; + dst[dstI++] = c[(m >> 4) & 0x3]; + dst[dstI++] = c[(m >> 6) & 0x3]; + } + } + } + return dst; +} + diff --git a/ktx/external/basisu/webgl/encode_test/index.html b/ktx/external/basisu/webgl/encode_test/index.html new file mode 100644 index 0000000..ad74da1 --- /dev/null +++ b/ktx/external/basisu/webgl/encode_test/index.html @@ -0,0 +1,595 @@ + + + + + + + + +
            +
            + Basis Universal compressed texture transcoding and encoding test +
            + +
            This demo uses the Basis C++ transcoder (compiled to Javascript using Emscripten) to transcode a .basis file to FORMAT +
            Thanks to Evan Parker for providing webgl-texture-utils and this test bed. +
            +
            + .basis file: + + +
            + +
            + .png file: + + +
            + +
            + Debug: + +
            + Compute Stats: + +
            + sRGB: + +
            + Mipmaps: + +
            + UASTC: + + + +
            + + ETC1S Quality: + + +
            + +
            + + + + +
            + + +
            +

            +
            + + + diff --git a/ktx/external/basisu/webgl/encode_test/preview.png b/ktx/external/basisu/webgl/encode_test/preview.png new file mode 100644 index 0000000..99c399d Binary files /dev/null and b/ktx/external/basisu/webgl/encode_test/preview.png differ diff --git a/ktx/external/basisu/webgl/encode_test/renderer.js b/ktx/external/basisu/webgl/encode_test/renderer.js new file mode 100644 index 0000000..26f1a65 --- /dev/null +++ b/ktx/external/basisu/webgl/encode_test/renderer.js @@ -0,0 +1,246 @@ +/** + * Constructs a renderer object. + * @param {WebGLRenderingContext} gl The GL context. + * @constructor + */ +var Renderer = function(gl) { + /** + * The GL context. + * @type {WebGLRenderingContext} + * @private + */ + this.gl_ = gl; + + /** + * The WebGLProgram. + * @type {WebGLProgram} + * @private + */ + this.program_ = gl.createProgram(); + + /** + * @type {WebGLShader} + * @private + */ + this.vertexShader_ = this.compileShader_( + Renderer.vertexShaderSource_, gl.VERTEX_SHADER); + + /** + * @type {WebGLShader} + * @private + */ + this.fragmentShader_ = this.compileShader_( + Renderer.fragmentShaderSource_, gl.FRAGMENT_SHADER); + + /** + * Cached uniform locations. + * @type {Object.} + * @private + */ + this.uniformLocations_ = {}; + + /** + * Cached attribute locations. + * @type {Object.} + * @private + */ + this.attribLocations_ = {}; + + /** + * A vertex buffer containing a single quad with xy coordinates from [-1,-1] + * to [1,1] and uv coordinates from [0,0] to [1,1]. + * @private + */ + this.quadVertexBuffer_ = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVertexBuffer_); + var vertices = new Float32Array( + [-1.0, -1.0, 0.0, 1.0, + +1.0, -1.0, 1.0, 1.0, + -1.0, +1.0, 0.0, 0.0, + 1.0, +1.0, 1.0, 0.0]); + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); + + + // init shaders + + gl.attachShader(this.program_, this.vertexShader_); + gl.attachShader(this.program_, this.fragmentShader_); + gl.bindAttribLocation(this.program_, 0, 'vert'); + gl.linkProgram(this.program_); + gl.useProgram(this.program_); + gl.enableVertexAttribArray(0); + + gl.enable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); + + var count = gl.getProgramParameter(this.program_, gl.ACTIVE_UNIFORMS); + for (var i = 0; i < /** @type {number} */(count); i++) { + var info = gl.getActiveUniform(this.program_, i); + var result = gl.getUniformLocation(this.program_, info.name); + this.uniformLocations_[info.name] = result; + } + + count = gl.getProgramParameter(this.program_, gl.ACTIVE_ATTRIBUTES); + for (var i = 0; i < /** @type {number} */(count); i++) { + var info = gl.getActiveAttrib(this.program_, i); + var result = gl.getAttribLocation(this.program_, info.name); + this.attribLocations_[info.name] = result; + } +}; + + +Renderer.prototype.finishInit = function() { + this.draw(); +}; + + +Renderer.prototype.createDxtTexture = function(dxtData, width, height, format) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.compressedTexImage2D( + gl.TEXTURE_2D, + 0, + format, + width, + height, + 0, + dxtData); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + //gl.generateMipmap(gl.TEXTURE_2D) + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; + +Renderer.prototype.createCompressedTexture = function(data, width, height, format) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.compressedTexImage2D( + gl.TEXTURE_2D, + 0, + format, + width, + height, + 0, + data); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + //gl.generateMipmap(gl.TEXTURE_2D) + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; + + +Renderer.prototype.createRgb565Texture = function(rgb565Data, width, height) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGB, + width, + height, + 0, + gl.RGB, + gl.UNSIGNED_SHORT_5_6_5, + rgb565Data); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + //gl.generateMipmap(gl.TEXTURE_2D) + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; + + +Renderer.prototype.drawTexture = function(texture, width, height, mode) { + var gl = this.gl_; + // draw scene + gl.clearColor(0, 0, 0, 1); + gl.clearDepth(1.0); + gl.viewport(0, 0, width, height); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT); + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.uniform1i(this.uniformLocations_.texSampler, 0); + + var x = 0.0; + var y = 0.0; + if (mode == 1) + x = 1.0; + else if (mode == 2) + y = 1.0; + + gl.uniform4f(this.uniformLocations_.control, x, y, 0.0, 0.0); + + gl.enableVertexAttribArray(this.attribLocations_.vert); + gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVertexBuffer_); + gl.vertexAttribPointer(this.attribLocations_.vert, 4, gl.FLOAT, + false, 0, 0); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); +}; + + +/** + * Compiles a GLSL shader and returns a WebGLShader. + * @param {string} shaderSource The shader source code string. + * @param {number} type Either VERTEX_SHADER or FRAGMENT_SHADER. + * @return {WebGLShader} The new WebGLShader. + * @private + */ +Renderer.prototype.compileShader_ = function(shaderSource, type) { + var gl = this.gl_; + var shader = gl.createShader(type); + gl.shaderSource(shader, shaderSource); + gl.compileShader(shader); + return shader; +}; + + +/** + * @type {string} + * @private + */ +Renderer.vertexShaderSource_ = [ + 'attribute vec4 vert;', + 'varying vec2 v_texCoord;', + 'void main() {', + ' gl_Position = vec4(vert.xy, 0.0, 1.0);', + ' v_texCoord = vert.zw;', + '}' + ].join('\n'); + + +/** + * @type {string} + * @private ' gl_FragColor = texture2D(texSampler, v_texCoord);', + */ +Renderer.fragmentShaderSource_ = [ + 'precision highp float;', + 'uniform sampler2D texSampler;', + 'uniform vec4 control;', + 'varying vec2 v_texCoord;', + 'void main() {', + ' vec4 c;', + ' c = texture2D(texSampler, v_texCoord);', + ' if (control.x > 0.0)', + ' {', + ' c.w = 1.0;', + ' }', + ' else if (control.y > 0.0)', + ' {', + ' c.rgb = c.aaa; c.w = 1.0;', + ' }', + ' gl_FragColor = c;', + '}' + ].join('\n'); + diff --git a/ktx/external/basisu/webgl/encoder/.gitignore b/ktx/external/basisu/webgl/encoder/.gitignore new file mode 100644 index 0000000..1ab0538 --- /dev/null +++ b/ktx/external/basisu/webgl/encoder/.gitignore @@ -0,0 +1,4 @@ +build/* +!build/basis_loader.js +!build/basis_encoder.js +!build/basis_encoder.wasm diff --git a/ktx/external/basisu/webgl/encoder/CMakeLists.txt b/ktx/external/basisu/webgl/encoder/CMakeLists.txt new file mode 100644 index 0000000..588d91b --- /dev/null +++ b/ktx/external/basisu/webgl/encoder/CMakeLists.txt @@ -0,0 +1,69 @@ +cmake_minimum_required(VERSION 3.0) + +project(basisu_encoder_js) + +# The encoder always supports generating KTX2 files, but Zstandard support is optional. If it's disabled, KTX2 UASTC files will always be uncompressed. +# If you know you'll never be encoding UASTC+Zstd KTX2 files you can set KTX2_ZSTANDARD to 0 to reduce the size of the compiled encoder. +option(KTX2_ZSTANDARD "KTX2_ZSTANDARD" TRUE) + +message("KTX2_ZSTANDARD=${KTX2_ZSTANDARD}") + +if (EMSCRIPTEN) + set(CMAKE_CXX_STANDARD 11) + + set(SRC_LIST + ../transcoder/basis_wrappers.cpp + ../../transcoder/basisu_transcoder.cpp + ../../encoder/basisu_backend.cpp + ../../encoder/basisu_basis_file.cpp + ../../encoder/basisu_comp.cpp + ../../encoder/basisu_enc.cpp + ../../encoder/basisu_etc.cpp + ../../encoder/basisu_frontend.cpp + ../../encoder/basisu_gpu_texture.cpp + ../../encoder/basisu_pvrtc1_4.cpp + ../../encoder/basisu_resampler.cpp + ../../encoder/basisu_resample_filters.cpp + ../../encoder/basisu_ssim.cpp + ../../encoder/basisu_uastc_enc.cpp + ../../encoder/basisu_bc7enc.cpp + ../../encoder/basisu_kernels_sse.cpp + ../../encoder/basisu_opencl.cpp + ../../encoder/pvpngreader.cpp + ../../encoder/jpgd.cpp + ) + + if (KTX2_ZSTANDARD) + set(SRC_LIST ${SRC_LIST} + ../../zstd/zstd.c + ) + set(ZSTD_DEFINITION BASISD_SUPPORT_KTX2_ZSTD=1) + else() + set(ZSTD_DEFINITION BASISD_SUPPORT_KTX2_ZSTD=0) + endif() + + add_executable(basis_encoder.js ${SRC_LIST}) + + #target_compile_definitions(basis_encoder.js PRIVATE NDEBUG BASISD_SUPPORT_UASTC=1 BASISD_SUPPORT_BC7=1 BASISD_SUPPORT_ATC=0 BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY=0 BASISD_SUPPORT_PVRTC2=0 BASISD_SUPPORT_FXT1=0 BASISD_SUPPORT_ETC2_EAC_RG11=0 BASISU_SUPPORT_ENCODING=1 BASISU_SUPPORT_SSE=0 ${ZSTD_DEFINITION} ) + #target_compile_options(basis_encoder.js PRIVATE -fno-strict-aliasing -O3) + + #target_compile_definitions(basis_encoder.js PRIVATE DEBUG BASISD_SUPPORT_UASTC=1 BASISD_SUPPORT_BC7=1 BASISD_SUPPORT_ATC=0 BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY=0 BASISD_SUPPORT_PVRTC2=0 BASISD_SUPPORT_FXT1=0 BASISD_SUPPORT_ETC2_EAC_RG11=0 BASISU_SUPPORT_ENCODING=1 BASISU_SUPPORT_SSE=0 ${ZSTD_DEFINITION} ) + #target_compile_options(basis_encoder.js PRIVATE -fno-strict-aliasing -g -O1 -fsanitize=undefined -fsanitize=address) + + target_compile_definitions(basis_encoder.js PRIVATE NDEBUG BASISD_SUPPORT_UASTC=1 BASISD_SUPPORT_BC7=1 BASISD_SUPPORT_ATC=0 BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY=0 BASISD_SUPPORT_PVRTC2=0 BASISD_SUPPORT_FXT1=0 BASISD_SUPPORT_ETC2_EAC_RG11=0 BASISU_SUPPORT_ENCODING=1 BASISU_SUPPORT_SSE=0 ${ZSTD_DEFINITION} ) + + target_compile_options(basis_encoder.js PRIVATE -fno-strict-aliasing -O3) + + target_include_directories(basis_encoder.js PRIVATE ../../transcoder) + + set_target_properties(basis_encoder.js PROPERTIES + OUTPUT_NAME "basis_encoder" + SUFFIX ".js" + + #LINK_FLAGS "--bind -s ALLOW_MEMORY_GROWTH=1 -O3 -s ASSERTIONS=0 -s MALLOC=emmalloc -s MODULARIZE=1 -s EXPORT_NAME=BASIS ") + + #LINK_FLAGS "--bind -s INITIAL_MEMORY=299958272 -g -s DEMANGLE_SUPPORT=1 -s ALLOW_MEMORY_GROWTH=1 -O1 -s ASSERTIONS=1 -s MALLOC=emmalloc -s MODULARIZE=1 -s EXPORT_NAME=BASIS -fsanitize=undefined -fsanitize=address") + + # TODO: 300MB is really large - probably not necessary? + LINK_FLAGS "--bind -s ALLOW_MEMORY_GROWTH=1 -O3 -s ASSERTIONS=0 -s INITIAL_MEMORY=299958272 -s MALLOC=emmalloc -s MODULARIZE=1 -s EXPORT_NAME=BASIS") +endif() diff --git a/ktx/external/basisu/webgl/encoder/README.md b/ktx/external/basisu/webgl/encoder/README.md new file mode 100644 index 0000000..2055d02 --- /dev/null +++ b/ktx/external/basisu/webgl/encoder/README.md @@ -0,0 +1,7 @@ +Prebuilt versions of `basis_encoder.js` and `basis_encoder.wasm` are included in the `build/` folder, and are sufficient for local demos. Note the encoder also includes the transcoder. To build the encoder yourself, first install emscripten ([tutorial](https://webassembly.org/getting-started/developers-guide/)) and cmake ([download](https://cmake.org/download/)). Then run: + +```shell +cd webgl/encoder/build/ +emcmake cmake ../ +make +``` diff --git a/ktx/external/basisu/webgl/gltf/BasisTextureLoader.js b/ktx/external/basisu/webgl/gltf/BasisTextureLoader.js new file mode 100644 index 0000000..627bdf3 --- /dev/null +++ b/ktx/external/basisu/webgl/gltf/BasisTextureLoader.js @@ -0,0 +1,518 @@ +/** + * @author Don McCurdy / https://www.donmccurdy.com + * @author Austin Eng / https://github.com/austinEng + * @author Shrek Shao / https://github.com/shrekshao + */ + +/** + * Loader for Basis Universal GPU Texture Codec. + * + * Basis Universal is a "supercompressed" GPU texture and texture video + * compression system that outputs a highly compressed intermediate file format + * (.basis) that can be quickly transcoded to a wide variety of GPU texture + * compression formats. + * + * This loader parallelizes the transcoding process across a configurable number + * of web workers, before transferring the transcoded compressed texture back + * to the main thread. + */ +THREE.BasisTextureLoader = function ( manager ) { + + THREE.Loader.call( this, manager ); + + this.transcoderPath = ''; + this.transcoderBinary = null; + this.transcoderPending = null; + + this.workerLimit = 4; + this.workerPool = []; + this.workerNextTaskID = 1; + this.workerSourceURL = ''; + this.workerConfig = { + format: null, + astcSupported: false, + etcSupported: false, + dxtSupported: false, + pvrtcSupported: false, + }; + +}; + +THREE.BasisTextureLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype ), { + + constructor: THREE.BasisTextureLoader, + + setTranscoderPath: function ( path ) { + + this.transcoderPath = path; + + return this; + + }, + + setWorkerLimit: function ( workerLimit ) { + + this.workerLimit = workerLimit; + + return this; + + }, + + detectSupport: function ( renderer ) { + + var config = this.workerConfig; + + config.bc7Supported = !! renderer.extensions.get( 'EXT_texture_compression_bptc' ); + config.astcSupported = !! renderer.extensions.get( 'WEBGL_compressed_texture_astc' ); + config.etcSupported = !! renderer.extensions.get( 'WEBGL_compressed_texture_etc1' ); + config.dxtSupported = !! renderer.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + config.pvrtcSupported = !! renderer.extensions.get( 'WEBGL_compressed_texture_pvrtc' ) + || !! renderer.extensions.get( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + + if ( config.astcSupported ) { + + config.format = THREE.BasisTextureLoader.BASIS_FORMAT.cTFASTC_4x4; + + } else if ( config.bc7Supported ) { + + config.format = THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC7_M6_OPAQUE_ONLY; + + } else if ( config.dxtSupported ) { + + config.format = THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC3; + + } else if ( config.etcSupported ) { + + config.format = THREE.BasisTextureLoader.BASIS_FORMAT.cTFETC1; + + } else if ( config.pvrtcSupported ) { + + config.format = this.useAlpha ? THREE.BasisTextureLoader.BASIS_FORMAT.cTFPVRTC1_4_RGBA : THREE.BasisTextureLoader.BASIS_FORMAT.cTFPVRTC1_4_RGB; + + } else { + + throw new Error( 'THREE.BasisTextureLoader: No suitable compressed texture format found.' ); + + } + + return this; + + }, + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new THREE.FileLoader( this.manager ); + + loader.setResponseType( 'arraybuffer' ); + + loader.load( url, ( buffer ) => { + + this._createTexture( buffer ) + .then( onLoad ) + .catch( onError ); + + }, onProgress, onError ); + + }, + + /** + * @param {ArrayBuffer} buffer + * @return {Promise} + */ + _createTexture: function ( buffer ) { + + var worker; + var taskID; + + var taskCost = buffer.byteLength; + + var texturePending = this._allocateWorker( taskCost ) + .then( ( _worker ) => { + + worker = _worker; + taskID = this.workerNextTaskID ++; + + return new Promise( ( resolve, reject ) => { + + worker._callbacks[ taskID ] = { resolve, reject }; + + worker.postMessage( { type: 'transcode', id: taskID, buffer }, [ buffer ] ); + + } ); + + } ) + .then( ( message ) => { + + var config = this.workerConfig; + + var { width, height, mipmaps, format } = message; + + var texture; + + switch ( format ) { + + case THREE.BasisTextureLoader.BASIS_FORMAT.cTFASTC_4x4: + texture = new THREE.CompressedTexture( mipmaps, width, height, THREE.RGBA_ASTC_4x4_Format ); + break; + case THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC7_M6_OPAQUE_ONLY: + texture = new THREE.CompressedTexture( mipmaps, width, height, THREE.BasisTextureLoader.COMPRESSED_RGBA_BPTC_UNORM ); + break; + case THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC1: + case THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC3: + texture = new THREE.CompressedTexture( mipmaps, width, height, THREE.BasisTextureLoader.DXT_FORMAT_MAP[ config.format ], THREE.UnsignedByteType ); + break; + case THREE.BasisTextureLoader.BASIS_FORMAT.cTFETC1: + texture = new THREE.CompressedTexture( mipmaps, width, height, THREE.RGB_ETC1_Format ); + break; + case THREE.BasisTextureLoader.BASIS_FORMAT.cTFPVRTC1_4_RGB: + texture = new THREE.CompressedTexture( mipmaps, width, height, THREE.RGB_PVRTC_4BPPV1_Format ); + break; + case THREE.BasisTextureLoader.BASIS_FORMAT.cTFPVRTC1_4_RGBA: + texture = new THREE.CompressedTexture( mipmaps, width, height, THREE.RGBA_PVRTC_4BPPV1_Format ); + break; + default: + throw new Error( 'THREE.BasisTextureLoader: No supported format available.' ); + + } + + texture.minFilter = mipmaps.length === 1 ? THREE.LinearFilter : THREE.LinearMipmapLinearFilter; + texture.magFilter = THREE.LinearFilter; + texture.generateMipmaps = false; + texture.needsUpdate = true; + + return texture; + + } ); + + texturePending + .finally( () => { + + if ( worker && taskID ) { + + worker._taskLoad -= taskCost; + delete worker._callbacks[ taskID ]; + + } + + } ); + + return texturePending; + + }, + + _initTranscoder: function () { + + if ( ! this.transcoderPending ) { + + // Load transcoder wrapper. + var jsLoader = new THREE.FileLoader( this.manager ); + jsLoader.setPath( this.transcoderPath ); + var jsContent = new Promise( ( resolve, reject ) => { + + jsLoader.load( 'basis_transcoder.js', resolve, undefined, reject ); + + } ); + + // Load transcoder WASM binary. + var binaryLoader = new THREE.FileLoader( this.manager ); + binaryLoader.setPath( this.transcoderPath ); + binaryLoader.setResponseType( 'arraybuffer' ); + var binaryContent = new Promise( ( resolve, reject ) => { + + binaryLoader.load( 'basis_transcoder.wasm', resolve, undefined, reject ); + + } ); + + this.transcoderPending = Promise.all( [ jsContent, binaryContent ] ) + .then( ( [ jsContent, binaryContent ] ) => { + + var fn = THREE.BasisTextureLoader.BasisWorker.toString(); + + var body = [ + '/* basis_transcoder.js */', + jsContent, + '/* worker */', + fn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) ) + ].join( '\n' ); + + this.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) ); + this.transcoderBinary = binaryContent; + + } ); + + } + + return this.transcoderPending; + + }, + + _allocateWorker: function ( taskCost ) { + + return this._initTranscoder().then( () => { + + if ( this.workerPool.length < this.workerLimit ) { + + var worker = new Worker( this.workerSourceURL ); + + worker._callbacks = {}; + worker._taskLoad = 0; + + worker.postMessage( { + type: 'init', + config: this.workerConfig, + transcoderBinary: this.transcoderBinary, + } ); + + worker.onmessage = function ( e ) { + + var message = e.data; + + switch ( message.type ) { + + case 'transcode': + worker._callbacks[ message.id ].resolve( message ); + break; + + case 'error': + worker._callbacks[ message.id ].reject( message ); + break; + + default: + console.error( 'THREE.BasisTextureLoader: Unexpected message, "' + message.type + '"' ); + + } + + }; + + this.workerPool.push( worker ); + + } else { + + this.workerPool.sort( function ( a, b ) { + + return a._taskLoad > b._taskLoad ? - 1 : 1; + + } ); + + } + + var worker = this.workerPool[ this.workerPool.length - 1 ]; + + worker._taskLoad += taskCost; + + return worker; + + } ); + + }, + + dispose: function () { + + for ( var i = 0; i < this.workerPool.length; i ++ ) { + + this.workerPool[ i ].terminate(); + + } + + this.workerPool.length = 0; + + return this; + + } + +} ); + +/* CONSTANTS */ + +THREE.BasisTextureLoader.BASIS_FORMAT = { + cTFETC1: 0, + cTFETC2: 1, + cTFBC1: 2, + cTFBC3: 3, + cTFBC4: 4, + cTFBC5: 5, + cTFBC7_M6_OPAQUE_ONLY: 6, + cTFBC7_M5: 7, + cTFPVRTC1_4_RGB: 8, + cTFPVRTC1_4_RGBA: 9, + cTFASTC_4x4: 10, + cTFATC_RGB: 11, + cTFATC_RGBA_INTERPOLATED_ALPHA: 12, + cTFRGBA32: 13, + cTFRGB565: 14, + cTFBGR565: 15, + cTFRGBA4444: 16, +}; + +// DXT formats, from: +// http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/ +THREE.BasisTextureLoader.DXT_FORMAT = { + COMPRESSED_RGB_S3TC_DXT1_EXT: 0x83F0, + COMPRESSED_RGBA_S3TC_DXT1_EXT: 0x83F1, + COMPRESSED_RGBA_S3TC_DXT3_EXT: 0x83F2, + COMPRESSED_RGBA_S3TC_DXT5_EXT: 0x83F3, +}; +THREE.BasisTextureLoader.DXT_FORMAT_MAP = {}; +THREE.BasisTextureLoader.DXT_FORMAT_MAP[ THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC1 ] = + THREE.BasisTextureLoader.DXT_FORMAT.COMPRESSED_RGB_S3TC_DXT1_EXT; +THREE.BasisTextureLoader.DXT_FORMAT_MAP[ THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC3 ] = + THREE.BasisTextureLoader.DXT_FORMAT.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + // ASTC formats, from: +// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/ +THREE.BasisTextureLoader.COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0; + +// BC7/BPTC format, from: +// https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_bptc/ +THREE.BasisTextureLoader.COMPRESSED_RGBA_BPTC_UNORM = 0x8E8C; + +/* WEB WORKER */ + +THREE.BasisTextureLoader.BasisWorker = function () { + + var config; + var transcoderPending; + var _BasisFile; + + onmessage = function ( e ) { + + var message = e.data; + + switch ( message.type ) { + + case 'init': + config = message.config; + init( message.transcoderBinary ); + break; + + case 'transcode': + transcoderPending.then( () => { + + try { + + var { width, height, hasAlpha, mipmaps, format } = transcode( message.buffer ); + + var buffers = []; + + for ( var i = 0; i < mipmaps.length; ++ i ) { + + buffers.push( mipmaps[ i ].data.buffer ); + + } + + self.postMessage( { type: 'transcode', id: message.id, width, height, hasAlpha, mipmaps, format }, buffers ); + + } catch ( error ) { + + console.error( error ); + + self.postMessage( { type: 'error', id: message.id, error: error.message } ); + + } + + } ); + break; + + } + + }; + + function init( wasmBinary ) { + + var BasisModule; + transcoderPending = new Promise( ( resolve ) => { + + BasisModule = { wasmBinary, onRuntimeInitialized: resolve }; + BASIS( BasisModule ); + + } ).then( () => { + + var { BasisFile, initializeBasis } = BasisModule; + + _BasisFile = BasisFile; + + initializeBasis(); + + } ); + + } + + function transcode( buffer ) { + + var basisFile = new _BasisFile( new Uint8Array( buffer ) ); + + var width = basisFile.getImageWidth( 0, 0 ); + var height = basisFile.getImageHeight( 0, 0 ); + var levels = basisFile.getNumLevels( 0 ); + var hasAlpha = basisFile.getHasAlpha(); + + function cleanup() { + + basisFile.close(); + basisFile.delete(); + + } + + if ( ! hasAlpha ) { + + switch ( config.format ) { + + case 9: // Hardcoded: THREE.BasisTextureLoader.BASIS_FORMAT.cTFPVRTC1_4_RGBA + config.format = 8; // Hardcoded: THREE.BasisTextureLoader.BASIS_FORMAT.cTFPVRTC1_4_RGB; + break; + default: + break; + + } + + } + + if ( ! width || ! height || ! levels ) { + + cleanup(); + throw new Error( 'THREE.BasisTextureLoader: Invalid .basis file' ); + + } + + if ( ! basisFile.startTranscoding() ) { + + cleanup(); + throw new Error( 'THREE.BasisTextureLoader: .startTranscoding failed' ); + + } + + var mipmaps = []; + + for ( var mip = 0; mip < levels; mip ++ ) { + + var mipWidth = basisFile.getImageWidth( 0, mip ); + var mipHeight = basisFile.getImageHeight( 0, mip ); + var dst = new Uint8Array( basisFile.getImageTranscodedSizeInBytes( 0, mip, config.format ) ); + + var status = basisFile.transcodeImage( + dst, + 0, + mip, + config.format, + 0, + hasAlpha + ); + + if ( ! status ) { + + cleanup(); + throw new Error( 'THREE.BasisTextureLoader: .transcodeImage failed.' ); + + } + + mipmaps.push( { data: dst, width: mipWidth, height: mipHeight } ); + + } + + cleanup(); + + return { width, height, hasAlpha, mipmaps, format: config.format }; + + } + +}; diff --git a/ktx/external/basisu/webgl/gltf/GLTFLoader.js b/ktx/external/basisu/webgl/gltf/GLTFLoader.js new file mode 100644 index 0000000..78c0687 --- /dev/null +++ b/ktx/external/basisu/webgl/gltf/GLTFLoader.js @@ -0,0 +1,3205 @@ +/** + * @author Rich Tibbett / https://github.com/richtr + * @author mrdoob / http://mrdoob.com/ + * @author Tony Parisi / http://www.tonyparisi.com/ + * @author Takahiro / https://github.com/takahirox + * @author Don McCurdy / https://www.donmccurdy.com + */ + +THREE.GLTFLoader = ( function () { + + function GLTFLoader( manager ) { + + THREE.Loader.call( this, manager ); + + this.dracoLoader = null; + this.ddsLoader = null; + + } + + GLTFLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype ), { + + constructor: GLTFLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var resourcePath; + + if ( this.resourcePath !== '' ) { + + resourcePath = this.resourcePath; + + } else if ( this.path !== '' ) { + + resourcePath = this.path; + + } else { + + resourcePath = THREE.LoaderUtils.extractUrlBase( url ); + + } + + // Tells the LoadingManager to track an extra item, which resolves after + // the model is fully loaded. This means the count of items loaded will + // be incorrect, but ensures manager.onLoad() does not fire early. + scope.manager.itemStart( url ); + + var _onError = function ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + }; + + var loader = new THREE.FileLoader( scope.manager ); + + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + if ( scope.crossOrigin === 'use-credentials' ) { + + loader.setWithCredentials( true ); + + } + + loader.load( url, function ( data ) { + + try { + + scope.parse( data, resourcePath, function ( gltf ) { + + onLoad( gltf ); + + scope.manager.itemEnd( url ); + + }, _onError ); + + } catch ( e ) { + + _onError( e ); + + } + + }, onProgress, _onError ); + + }, + + setDRACOLoader: function ( dracoLoader ) { + + this.dracoLoader = dracoLoader; + return this; + + }, + + setDDSLoader: function ( ddsLoader ) { + + this.ddsLoader = ddsLoader; + return this; + + }, + + parse: function ( data, path, onLoad, onError ) { + + var content; + var extensions = {}; + + if ( typeof data === 'string' ) { + + content = data; + + } else { + + var magic = THREE.LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) ); + + if ( magic === BINARY_EXTENSION_HEADER_MAGIC ) { + + try { + + extensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data ); + + } catch ( error ) { + + if ( onError ) onError( error ); + return; + + } + + content = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content; + + } else { + + content = THREE.LoaderUtils.decodeText( new Uint8Array( data ) ); + + } + + } + + var json = JSON.parse( content ); + + if ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) { + + if ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) ); + return; + + } + + if ( json.extensionsUsed ) { + + for ( var i = 0; i < json.extensionsUsed.length; ++ i ) { + + var extensionName = json.extensionsUsed[ i ]; + var extensionsRequired = json.extensionsRequired || []; + + switch ( extensionName ) { + + case EXTENSIONS.KHR_LIGHTS_PUNCTUAL: + extensions[ extensionName ] = new GLTFLightsExtension( json ); + break; + + case EXTENSIONS.KHR_MATERIALS_UNLIT: + extensions[ extensionName ] = new GLTFMaterialsUnlitExtension(); + break; + + case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: + extensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension(); + break; + + case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: + extensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader ); + break; + + case EXTENSIONS.MSFT_TEXTURE_DDS: + extensions[ extensionName ] = new GLTFTextureDDSExtension( this.ddsLoader ); + break; + + case EXTENSIONS.GOOGLE_TEXTURE_BASIS: + extensions[ EXTENSIONS.GOOGLE_TEXTURE_BASIS ] = new GLTFTextureBasisExtension(); + break; + + case EXTENSIONS.KHR_TEXTURE_TRANSFORM: + extensions[ extensionName ] = new GLTFTextureTransformExtension(); + break; + + case EXTENSIONS.KHR_MESH_QUANTIZATION: + extensions[ extensionName ] = new GLTFMeshQuantizationExtension(); + break; + + default: + + if ( extensionsRequired.indexOf( extensionName ) >= 0 ) { + + console.warn( 'THREE.GLTFLoader: Unknown extension "' + extensionName + '".' ); + + } + + } + + } + + } + + var parser = new GLTFParser( json, extensions, { + + path: path || this.resourcePath || '', + crossOrigin: this.crossOrigin, + manager: this.manager + + } ); + + parser.parse( onLoad, onError ); + + } + + } ); + + /* GLTFREGISTRY */ + + function GLTFRegistry() { + + var objects = {}; + + return { + + get: function ( key ) { + + return objects[ key ]; + + }, + + add: function ( key, object ) { + + objects[ key ] = object; + + }, + + remove: function ( key ) { + + delete objects[ key ]; + + }, + + removeAll: function () { + + objects = {}; + + } + + }; + + } + + /*********************************/ + /********** EXTENSIONS ***********/ + /*********************************/ + + var EXTENSIONS = { + KHR_BINARY_GLTF: 'KHR_binary_glTF', + KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression', + KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual', + KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness', + KHR_MATERIALS_UNLIT: 'KHR_materials_unlit', + KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform', + KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization', + MSFT_TEXTURE_DDS: 'MSFT_texture_dds', + GOOGLE_TEXTURE_BASIS: 'GOOGLE_texture_basis' + }; + + /** + * DDS Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/MSFT_texture_dds + * + */ + function GLTFTextureDDSExtension( ddsLoader ) { + + if ( ! ddsLoader ) { + + throw new Error( 'THREE.GLTFLoader: Attempting to load .dds texture without importing THREE.DDSLoader' ); + + } + + this.name = EXTENSIONS.MSFT_TEXTURE_DDS; + this.ddsLoader = ddsLoader; + + } + + /** + * Basis Texture Extension + * + */ + function GLTFTextureBasisExtension() { + + this.name = EXTENSIONS.GOOGLE_TEXTURE_BASIS; + + } + + /** + * Punctual Lights Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual + */ + function GLTFLightsExtension( json ) { + + this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; + + var extension = ( json.extensions && json.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ] ) || {}; + this.lightDefs = extension.lights || []; + + } + + GLTFLightsExtension.prototype.loadLight = function ( lightIndex ) { + + var lightDef = this.lightDefs[ lightIndex ]; + var lightNode; + + var color = new THREE.Color( 0xffffff ); + if ( lightDef.color !== undefined ) color.fromArray( lightDef.color ); + + var range = lightDef.range !== undefined ? lightDef.range : 0; + + switch ( lightDef.type ) { + + case 'directional': + lightNode = new THREE.DirectionalLight( color ); + lightNode.target.position.set( 0, 0, - 1 ); + lightNode.add( lightNode.target ); + break; + + case 'point': + lightNode = new THREE.PointLight( color ); + lightNode.distance = range; + break; + + case 'spot': + lightNode = new THREE.SpotLight( color ); + lightNode.distance = range; + // Handle spotlight properties. + lightDef.spot = lightDef.spot || {}; + lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0; + lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0; + lightNode.angle = lightDef.spot.outerConeAngle; + lightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle; + lightNode.target.position.set( 0, 0, - 1 ); + lightNode.add( lightNode.target ); + break; + + default: + throw new Error( 'THREE.GLTFLoader: Unexpected light type, "' + lightDef.type + '".' ); + + } + + // Some lights (e.g. spot) default to a position other than the origin. Reset the position + // here, because node-level parsing will only override position if explicitly specified. + lightNode.position.set( 0, 0, 0 ); + + lightNode.decay = 2; + + if ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity; + + lightNode.name = lightDef.name || ( 'light_' + lightIndex ); + + return Promise.resolve( lightNode ); + + }; + + /** + * Unlit Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit + */ + function GLTFMaterialsUnlitExtension() { + + this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; + + } + + GLTFMaterialsUnlitExtension.prototype.getMaterialType = function () { + + return THREE.MeshBasicMaterial; + + }; + + GLTFMaterialsUnlitExtension.prototype.extendParams = function ( materialParams, materialDef, parser ) { + + var pending = []; + + materialParams.color = new THREE.Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + var metallicRoughness = materialDef.pbrMetallicRoughness; + + if ( metallicRoughness ) { + + if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { + + var array = metallicRoughness.baseColorFactor; + + materialParams.color.fromArray( array ); + materialParams.opacity = array[ 3 ]; + + } + + if ( metallicRoughness.baseColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) ); + + } + + } + + return Promise.all( pending ); + + }; + + /* BINARY EXTENSION */ + var BINARY_EXTENSION_HEADER_MAGIC = 'glTF'; + var BINARY_EXTENSION_HEADER_LENGTH = 12; + var BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 }; + + function GLTFBinaryExtension( data ) { + + this.name = EXTENSIONS.KHR_BINARY_GLTF; + this.content = null; + this.body = null; + + var headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH ); + + this.header = { + magic: THREE.LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ), + version: headerView.getUint32( 4, true ), + length: headerView.getUint32( 8, true ) + }; + + if ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) { + + throw new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' ); + + } else if ( this.header.version < 2.0 ) { + + throw new Error( 'THREE.GLTFLoader: Legacy binary file detected.' ); + + } + + var chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH ); + var chunkIndex = 0; + + while ( chunkIndex < chunkView.byteLength ) { + + var chunkLength = chunkView.getUint32( chunkIndex, true ); + chunkIndex += 4; + + var chunkType = chunkView.getUint32( chunkIndex, true ); + chunkIndex += 4; + + if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) { + + var contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength ); + this.content = THREE.LoaderUtils.decodeText( contentArray ); + + } else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) { + + var byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; + this.body = data.slice( byteOffset, byteOffset + chunkLength ); + + } + + // Clients must ignore chunks with unknown types. + + chunkIndex += chunkLength; + + } + + if ( this.content === null ) { + + throw new Error( 'THREE.GLTFLoader: JSON content not found.' ); + + } + + } + + /** + * DRACO Mesh Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression + */ + function GLTFDracoMeshCompressionExtension( json, dracoLoader ) { + + if ( ! dracoLoader ) { + + throw new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' ); + + } + + this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; + this.json = json; + this.dracoLoader = dracoLoader; + this.dracoLoader.preload(); + + } + + GLTFDracoMeshCompressionExtension.prototype.decodePrimitive = function ( primitive, parser ) { + + var json = this.json; + var dracoLoader = this.dracoLoader; + var bufferViewIndex = primitive.extensions[ this.name ].bufferView; + var gltfAttributeMap = primitive.extensions[ this.name ].attributes; + var threeAttributeMap = {}; + var attributeNormalizedMap = {}; + var attributeTypeMap = {}; + + for ( var attributeName in gltfAttributeMap ) { + + var threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); + + threeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ]; + + } + + for ( attributeName in primitive.attributes ) { + + var threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); + + if ( gltfAttributeMap[ attributeName ] !== undefined ) { + + var accessorDef = json.accessors[ primitive.attributes[ attributeName ] ]; + var componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + + attributeTypeMap[ threeAttributeName ] = componentType; + attributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true; + + } + + } + + return parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) { + + return new Promise( function ( resolve ) { + + dracoLoader.decodeDracoFile( bufferView, function ( geometry ) { + + for ( var attributeName in geometry.attributes ) { + + var attribute = geometry.attributes[ attributeName ]; + var normalized = attributeNormalizedMap[ attributeName ]; + + if ( normalized !== undefined ) attribute.normalized = normalized; + + } + + resolve( geometry ); + + }, threeAttributeMap, attributeTypeMap ); + + } ); + + } ); + + }; + + /** + * Texture Transform Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform + */ + function GLTFTextureTransformExtension() { + + this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM; + + } + + GLTFTextureTransformExtension.prototype.extendTexture = function ( texture, transform ) { + + texture = texture.clone(); + + if ( transform.offset !== undefined ) { + + texture.offset.fromArray( transform.offset ); + + } + + if ( transform.rotation !== undefined ) { + + texture.rotation = transform.rotation; + + } + + if ( transform.scale !== undefined ) { + + texture.repeat.fromArray( transform.scale ); + + } + + if ( transform.texCoord !== undefined ) { + + console.warn( 'THREE.GLTFLoader: Custom UV sets in "' + this.name + '" extension not yet supported.' ); + + } + + texture.needsUpdate = true; + + return texture; + + }; + + /** + * Specular-Glossiness Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness + */ + + /** + * A sub class of THREE.StandardMaterial with some of the functionality + * changed via the `onBeforeCompile` callback + * @pailhead + */ + + function GLTFMeshStandardSGMaterial( params ) { + + THREE.MeshStandardMaterial.call( this ); + + this.isGLTFSpecularGlossinessMaterial = true; + + //various chunks that need replacing + var specularMapParsFragmentChunk = [ + '#ifdef USE_SPECULARMAP', + ' uniform sampler2D specularMap;', + '#endif' + ].join( '\n' ); + + var glossinessMapParsFragmentChunk = [ + '#ifdef USE_GLOSSINESSMAP', + ' uniform sampler2D glossinessMap;', + '#endif' + ].join( '\n' ); + + var specularMapFragmentChunk = [ + 'vec3 specularFactor = specular;', + '#ifdef USE_SPECULARMAP', + ' vec4 texelSpecular = texture2D( specularMap, vUv );', + ' texelSpecular = sRGBToLinear( texelSpecular );', + ' // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', + ' specularFactor *= texelSpecular.rgb;', + '#endif' + ].join( '\n' ); + + var glossinessMapFragmentChunk = [ + 'float glossinessFactor = glossiness;', + '#ifdef USE_GLOSSINESSMAP', + ' vec4 texelGlossiness = texture2D( glossinessMap, vUv );', + ' // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', + ' glossinessFactor *= texelGlossiness.a;', + '#endif' + ].join( '\n' ); + + var lightPhysicalFragmentChunk = [ + 'PhysicalMaterial material;', + 'material.diffuseColor = diffuseColor.rgb;', + 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );', + 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );', + 'material.specularRoughness = max( 1.0 - glossinessFactor, 0.0525 );// 0.0525 corresponds to the base mip of a 256 cubemap.', + 'material.specularRoughness += geometryRoughness;', + 'material.specularRoughness = min( material.specularRoughness, 1.0 );', + 'material.specularColor = specularFactor.rgb;', + ].join( '\n' ); + + var uniforms = { + specular: { value: new THREE.Color().setHex( 0xffffff ) }, + glossiness: { value: 1 }, + specularMap: { value: null }, + glossinessMap: { value: null } + }; + + this._extraUniforms = uniforms; + + // please see #14031 or #13198 for an alternate approach + this.onBeforeCompile = function ( shader ) { + + for ( var uniformName in uniforms ) { + + shader.uniforms[ uniformName ] = uniforms[ uniformName ]; + + } + + shader.fragmentShader = shader.fragmentShader.replace( 'uniform float roughness;', 'uniform vec3 specular;' ); + shader.fragmentShader = shader.fragmentShader.replace( 'uniform float metalness;', 'uniform float glossiness;' ); + shader.fragmentShader = shader.fragmentShader.replace( '#include ', specularMapParsFragmentChunk ); + shader.fragmentShader = shader.fragmentShader.replace( '#include ', glossinessMapParsFragmentChunk ); + shader.fragmentShader = shader.fragmentShader.replace( '#include ', specularMapFragmentChunk ); + shader.fragmentShader = shader.fragmentShader.replace( '#include ', glossinessMapFragmentChunk ); + shader.fragmentShader = shader.fragmentShader.replace( '#include ', lightPhysicalFragmentChunk ); + + }; + + /*eslint-disable*/ + Object.defineProperties( + this, + { + specular: { + get: function () { return uniforms.specular.value; }, + set: function ( v ) { uniforms.specular.value = v; } + }, + specularMap: { + get: function () { return uniforms.specularMap.value; }, + set: function ( v ) { uniforms.specularMap.value = v; } + }, + glossiness: { + get: function () { return uniforms.glossiness.value; }, + set: function ( v ) { uniforms.glossiness.value = v; } + }, + glossinessMap: { + get: function () { return uniforms.glossinessMap.value; }, + set: function ( v ) { + + uniforms.glossinessMap.value = v; + //how about something like this - @pailhead + if ( v ) { + + this.defines.USE_GLOSSINESSMAP = ''; + // set USE_ROUGHNESSMAP to enable vUv + this.defines.USE_ROUGHNESSMAP = ''; + + } else { + + delete this.defines.USE_ROUGHNESSMAP; + delete this.defines.USE_GLOSSINESSMAP; + + } + + } + } + } + ); + + /*eslint-enable*/ + delete this.metalness; + delete this.roughness; + delete this.metalnessMap; + delete this.roughnessMap; + + this.setValues( params ); + + } + + GLTFMeshStandardSGMaterial.prototype = Object.create( THREE.MeshStandardMaterial.prototype ); + GLTFMeshStandardSGMaterial.prototype.constructor = GLTFMeshStandardSGMaterial; + + GLTFMeshStandardSGMaterial.prototype.copy = function ( source ) { + + THREE.MeshStandardMaterial.prototype.copy.call( this, source ); + this.specularMap = source.specularMap; + this.specular.copy( source.specular ); + this.glossinessMap = source.glossinessMap; + this.glossiness = source.glossiness; + delete this.metalness; + delete this.roughness; + delete this.metalnessMap; + delete this.roughnessMap; + return this; + + }; + + function GLTFMaterialsPbrSpecularGlossinessExtension() { + + return { + + name: EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS, + + specularGlossinessParams: [ + 'color', + 'map', + 'lightMap', + 'lightMapIntensity', + 'aoMap', + 'aoMapIntensity', + 'emissive', + 'emissiveIntensity', + 'emissiveMap', + 'bumpMap', + 'bumpScale', + 'normalMap', + 'normalMapType', + 'displacementMap', + 'displacementScale', + 'displacementBias', + 'specularMap', + 'specular', + 'glossinessMap', + 'glossiness', + 'alphaMap', + 'envMap', + 'envMapIntensity', + 'refractionRatio', + ], + + getMaterialType: function () { + + return GLTFMeshStandardSGMaterial; + + }, + + extendParams: function ( materialParams, materialDef, parser ) { + + var pbrSpecularGlossiness = materialDef.extensions[ this.name ]; + + materialParams.color = new THREE.Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + var pending = []; + + if ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) { + + var array = pbrSpecularGlossiness.diffuseFactor; + + materialParams.color.fromArray( array ); + materialParams.opacity = array[ 3 ]; + + } + + if ( pbrSpecularGlossiness.diffuseTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture ) ); + + } + + materialParams.emissive = new THREE.Color( 0.0, 0.0, 0.0 ); + materialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0; + materialParams.specular = new THREE.Color( 1.0, 1.0, 1.0 ); + + if ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) { + + materialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor ); + + } + + if ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) { + + var specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture; + pending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) ); + pending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef ) ); + + } + + return Promise.all( pending ); + + }, + + createMaterial: function ( materialParams ) { + + var material = new GLTFMeshStandardSGMaterial( materialParams ); + material.fog = true; + + material.color = materialParams.color; + + material.map = materialParams.map === undefined ? null : materialParams.map; + + material.lightMap = null; + material.lightMapIntensity = 1.0; + + material.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap; + material.aoMapIntensity = 1.0; + + material.emissive = materialParams.emissive; + material.emissiveIntensity = 1.0; + material.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap; + + material.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap; + material.bumpScale = 1; + + material.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap; + material.normalMapType = THREE.TangentSpaceNormalMap; + + if ( materialParams.normalScale ) material.normalScale = materialParams.normalScale; + + material.displacementMap = null; + material.displacementScale = 1; + material.displacementBias = 0; + + material.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap; + material.specular = materialParams.specular; + + material.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap; + material.glossiness = materialParams.glossiness; + + material.alphaMap = null; + + material.envMap = materialParams.envMap === undefined ? null : materialParams.envMap; + material.envMapIntensity = 1.0; + + material.refractionRatio = 0.98; + + return material; + + }, + + }; + + } + + /** + * Mesh Quantization Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization + */ + function GLTFMeshQuantizationExtension() { + + this.name = EXTENSIONS.KHR_MESH_QUANTIZATION; + + } + + /*********************************/ + /********** INTERPOLATION ********/ + /*********************************/ + + // Spline Interpolation + // Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation + function GLTFCubicSplineInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + THREE.Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + GLTFCubicSplineInterpolant.prototype = Object.create( THREE.Interpolant.prototype ); + GLTFCubicSplineInterpolant.prototype.constructor = GLTFCubicSplineInterpolant; + + GLTFCubicSplineInterpolant.prototype.copySampleValue_ = function ( index ) { + + // Copies a sample value to the result buffer. See description of glTF + // CUBICSPLINE values layout in interpolate_() function below. + + var result = this.resultBuffer, + values = this.sampleValues, + valueSize = this.valueSize, + offset = index * valueSize * 3 + valueSize; + + for ( var i = 0; i !== valueSize; i ++ ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }; + + GLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; + + GLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; + + GLTFCubicSplineInterpolant.prototype.interpolate_ = function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer; + var values = this.sampleValues; + var stride = this.valueSize; + + var stride2 = stride * 2; + var stride3 = stride * 3; + + var td = t1 - t0; + + var p = ( t - t0 ) / td; + var pp = p * p; + var ppp = pp * p; + + var offset1 = i1 * stride3; + var offset0 = offset1 - stride3; + + var s2 = - 2 * ppp + 3 * pp; + var s3 = ppp - pp; + var s0 = 1 - s2; + var s1 = s3 - pp + p; + + // Layout of keyframe output values for CUBICSPLINE animations: + // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] + for ( var i = 0; i !== stride; i ++ ) { + + var p0 = values[ offset0 + i + stride ]; // splineVertex_k + var m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k) + var p1 = values[ offset1 + i + stride ]; // splineVertex_k+1 + var m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k) + + result[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; + + } + + return result; + + }; + + /*********************************/ + /********** INTERNALS ************/ + /*********************************/ + + /* CONSTANTS */ + + var WEBGL_CONSTANTS = { + FLOAT: 5126, + //FLOAT_MAT2: 35674, + FLOAT_MAT3: 35675, + FLOAT_MAT4: 35676, + FLOAT_VEC2: 35664, + FLOAT_VEC3: 35665, + FLOAT_VEC4: 35666, + LINEAR: 9729, + REPEAT: 10497, + SAMPLER_2D: 35678, + POINTS: 0, + LINES: 1, + LINE_LOOP: 2, + LINE_STRIP: 3, + TRIANGLES: 4, + TRIANGLE_STRIP: 5, + TRIANGLE_FAN: 6, + UNSIGNED_BYTE: 5121, + UNSIGNED_SHORT: 5123 + }; + + var WEBGL_COMPONENT_TYPES = { + 5120: Int8Array, + 5121: Uint8Array, + 5122: Int16Array, + 5123: Uint16Array, + 5125: Uint32Array, + 5126: Float32Array + }; + + var WEBGL_FILTERS = { + 9728: THREE.NearestFilter, + 9729: THREE.LinearFilter, + 9984: THREE.NearestMipmapNearestFilter, + 9985: THREE.LinearMipmapNearestFilter, + 9986: THREE.NearestMipmapLinearFilter, + 9987: THREE.LinearMipmapLinearFilter + }; + + var WEBGL_WRAPPINGS = { + 33071: THREE.ClampToEdgeWrapping, + 33648: THREE.MirroredRepeatWrapping, + 10497: THREE.RepeatWrapping + }; + + var WEBGL_TYPE_SIZES = { + 'SCALAR': 1, + 'VEC2': 2, + 'VEC3': 3, + 'VEC4': 4, + 'MAT2': 4, + 'MAT3': 9, + 'MAT4': 16 + }; + + var ATTRIBUTES = { + POSITION: 'position', + NORMAL: 'normal', + TANGENT: 'tangent', + TEXCOORD_0: 'uv', + TEXCOORD_1: 'uv2', + COLOR_0: 'color', + WEIGHTS_0: 'skinWeight', + JOINTS_0: 'skinIndex', + }; + + var PATH_PROPERTIES = { + scale: 'scale', + translation: 'position', + rotation: 'quaternion', + weights: 'morphTargetInfluences' + }; + + var INTERPOLATION = { + CUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each + // keyframe track will be initialized with a default interpolation type, then modified. + LINEAR: THREE.InterpolateLinear, + STEP: THREE.InterpolateDiscrete + }; + + var ALPHA_MODES = { + OPAQUE: 'OPAQUE', + MASK: 'MASK', + BLEND: 'BLEND' + }; + + var MIME_TYPE_FORMATS = { + 'image/png': THREE.RGBAFormat, + 'image/jpeg': THREE.RGBFormat + }; + + /* UTILITY FUNCTIONS */ + + function resolveURL( url, path ) { + + // Invalid URL + if ( typeof url !== 'string' || url === '' ) return ''; + + // Host Relative URL + if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) { + + path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' ); + + } + + // Absolute URL http://,https://,// + if ( /^(https?:)?\/\//i.test( url ) ) return url; + + // Data URI + if ( /^data:.*,.*$/i.test( url ) ) return url; + + // Blob URL + if ( /^blob:.*$/i.test( url ) ) return url; + + // Relative URL + return path + url; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material + */ + function createDefaultMaterial( cache ) { + + if ( cache[ 'DefaultMaterial' ] === undefined ) { + + cache[ 'DefaultMaterial' ] = new THREE.MeshStandardMaterial( { + color: 0xFFFFFF, + emissive: 0x000000, + metalness: 1, + roughness: 1, + transparent: false, + depthTest: true, + side: THREE.FrontSide + } ); + + } + + return cache[ 'DefaultMaterial' ]; + + } + + function addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) { + + // Add unknown glTF extensions to an object's userData. + + for ( var name in objectDef.extensions ) { + + if ( knownExtensions[ name ] === undefined ) { + + object.userData.gltfExtensions = object.userData.gltfExtensions || {}; + object.userData.gltfExtensions[ name ] = objectDef.extensions[ name ]; + + } + + } + + } + + /** + * @param {THREE.Object3D|THREE.Material|THREE.BufferGeometry} object + * @param {GLTF.definition} gltfDef + */ + function assignExtrasToUserData( object, gltfDef ) { + + if ( gltfDef.extras !== undefined ) { + + if ( typeof gltfDef.extras === 'object' ) { + + Object.assign( object.userData, gltfDef.extras ); + + } else { + + console.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras ); + + } + + } + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets + * + * @param {THREE.BufferGeometry} geometry + * @param {Array} targets + * @param {GLTFParser} parser + * @return {Promise} + */ + function addMorphTargets( geometry, targets, parser ) { + + var hasMorphPosition = false; + var hasMorphNormal = false; + + for ( var i = 0, il = targets.length; i < il; i ++ ) { + + var target = targets[ i ]; + + if ( target.POSITION !== undefined ) hasMorphPosition = true; + if ( target.NORMAL !== undefined ) hasMorphNormal = true; + + if ( hasMorphPosition && hasMorphNormal ) break; + + } + + if ( ! hasMorphPosition && ! hasMorphNormal ) return Promise.resolve( geometry ); + + var pendingPositionAccessors = []; + var pendingNormalAccessors = []; + + for ( var i = 0, il = targets.length; i < il; i ++ ) { + + var target = targets[ i ]; + + if ( hasMorphPosition ) { + + var pendingAccessor = target.POSITION !== undefined + ? parser.getDependency( 'accessor', target.POSITION ) + : geometry.attributes.position; + + pendingPositionAccessors.push( pendingAccessor ); + + } + + if ( hasMorphNormal ) { + + var pendingAccessor = target.NORMAL !== undefined + ? parser.getDependency( 'accessor', target.NORMAL ) + : geometry.attributes.normal; + + pendingNormalAccessors.push( pendingAccessor ); + + } + + } + + return Promise.all( [ + Promise.all( pendingPositionAccessors ), + Promise.all( pendingNormalAccessors ) + ] ).then( function ( accessors ) { + + var morphPositions = accessors[ 0 ]; + var morphNormals = accessors[ 1 ]; + + if ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions; + if ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals; + geometry.morphTargetsRelative = true; + + return geometry; + + } ); + + } + + /** + * @param {THREE.Mesh} mesh + * @param {GLTF.Mesh} meshDef + */ + function updateMorphTargets( mesh, meshDef ) { + + mesh.updateMorphTargets(); + + if ( meshDef.weights !== undefined ) { + + for ( var i = 0, il = meshDef.weights.length; i < il; i ++ ) { + + mesh.morphTargetInfluences[ i ] = meshDef.weights[ i ]; + + } + + } + + // .extras has user-defined data, so check that .extras.targetNames is an array. + if ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) { + + var targetNames = meshDef.extras.targetNames; + + if ( mesh.morphTargetInfluences.length === targetNames.length ) { + + mesh.morphTargetDictionary = {}; + + for ( var i = 0, il = targetNames.length; i < il; i ++ ) { + + mesh.morphTargetDictionary[ targetNames[ i ] ] = i; + + } + + } else { + + console.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' ); + + } + + } + + } + + function createPrimitiveKey( primitiveDef ) { + + var dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]; + var geometryKey; + + if ( dracoExtension ) { + + geometryKey = 'draco:' + dracoExtension.bufferView + + ':' + dracoExtension.indices + + ':' + createAttributesKey( dracoExtension.attributes ); + + } else { + + geometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode; + + } + + return geometryKey; + + } + + function createAttributesKey( attributes ) { + + var attributesKey = ''; + + var keys = Object.keys( attributes ).sort(); + + for ( var i = 0, il = keys.length; i < il; i ++ ) { + + attributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';'; + + } + + return attributesKey; + + } + + /* GLTF PARSER */ + + function GLTFParser( json, extensions, options ) { + + this.json = json || {}; + this.extensions = extensions || {}; + this.options = options || {}; + + // loader object cache + this.cache = new GLTFRegistry(); + + // BufferGeometry caching + this.primitiveCache = {}; + + this.textureLoader = new THREE.TextureLoader( this.options.manager ); + this.textureLoader.setCrossOrigin( this.options.crossOrigin ); + + this.fileLoader = new THREE.FileLoader( this.options.manager ); + this.fileLoader.setResponseType( 'arraybuffer' ); + + if ( this.options.crossOrigin === 'use-credentials' ) { + + this.fileLoader.setWithCredentials( true ); + + } + + } + + GLTFParser.prototype.parse = function ( onLoad, onError ) { + + var parser = this; + var json = this.json; + var extensions = this.extensions; + + // Clear the loader cache + this.cache.removeAll(); + + // Mark the special nodes/meshes in json for efficient parse + this.markDefs(); + + Promise.all( [ + + this.getDependencies( 'scene' ), + this.getDependencies( 'animation' ), + this.getDependencies( 'camera' ), + + ] ).then( function ( dependencies ) { + + var result = { + scene: dependencies[ 0 ][ json.scene || 0 ], + scenes: dependencies[ 0 ], + animations: dependencies[ 1 ], + cameras: dependencies[ 2 ], + asset: json.asset, + parser: parser, + userData: {} + }; + + addUnknownExtensionsToUserData( extensions, result, json ); + + assignExtrasToUserData( result, json ); + + onLoad( result ); + + } ).catch( onError ); + + }; + + /** + * Marks the special nodes/meshes in json for efficient parse. + */ + GLTFParser.prototype.markDefs = function () { + + var nodeDefs = this.json.nodes || []; + var skinDefs = this.json.skins || []; + var meshDefs = this.json.meshes || []; + + var meshReferences = {}; + var meshUses = {}; + + // Nothing in the node definition indicates whether it is a Bone or an + // Object3D. Use the skins' joint references to mark bones. + for ( var skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) { + + var joints = skinDefs[ skinIndex ].joints; + + for ( var i = 0, il = joints.length; i < il; i ++ ) { + + nodeDefs[ joints[ i ] ].isBone = true; + + } + + } + + // Meshes can (and should) be reused by multiple nodes in a glTF asset. To + // avoid having more than one THREE.Mesh with the same name, count + // references and rename instances below. + // + // Example: CesiumMilkTruck sample model reuses "Wheel" meshes. + for ( var nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { + + var nodeDef = nodeDefs[ nodeIndex ]; + + if ( nodeDef.mesh !== undefined ) { + + if ( meshReferences[ nodeDef.mesh ] === undefined ) { + + meshReferences[ nodeDef.mesh ] = meshUses[ nodeDef.mesh ] = 0; + + } + + meshReferences[ nodeDef.mesh ] ++; + + // Nothing in the mesh definition indicates whether it is + // a SkinnedMesh or Mesh. Use the node's mesh reference + // to mark SkinnedMesh if node has skin. + if ( nodeDef.skin !== undefined ) { + + meshDefs[ nodeDef.mesh ].isSkinnedMesh = true; + + } + + } + + } + + this.json.meshReferences = meshReferences; + this.json.meshUses = meshUses; + + }; + + /** + * Requests the specified dependency asynchronously, with caching. + * @param {string} type + * @param {number} index + * @return {Promise} + */ + GLTFParser.prototype.getDependency = function ( type, index ) { + + var cacheKey = type + ':' + index; + var dependency = this.cache.get( cacheKey ); + + if ( ! dependency ) { + + switch ( type ) { + + case 'scene': + dependency = this.loadScene( index ); + break; + + case 'node': + dependency = this.loadNode( index ); + break; + + case 'mesh': + dependency = this.loadMesh( index ); + break; + + case 'accessor': + dependency = this.loadAccessor( index ); + break; + + case 'bufferView': + dependency = this.loadBufferView( index ); + break; + + case 'buffer': + dependency = this.loadBuffer( index ); + break; + + case 'material': + dependency = this.loadMaterial( index ); + break; + + case 'texture': + dependency = this.loadTexture( index ); + break; + + case 'skin': + dependency = this.loadSkin( index ); + break; + + case 'animation': + dependency = this.loadAnimation( index ); + break; + + case 'camera': + dependency = this.loadCamera( index ); + break; + + case 'light': + dependency = this.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].loadLight( index ); + break; + + default: + throw new Error( 'Unknown type: ' + type ); + + } + + this.cache.add( cacheKey, dependency ); + + } + + return dependency; + + }; + + /** + * Requests all dependencies of the specified type asynchronously, with caching. + * @param {string} type + * @return {Promise>} + */ + GLTFParser.prototype.getDependencies = function ( type ) { + + var dependencies = this.cache.get( type ); + + if ( ! dependencies ) { + + var parser = this; + var defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || []; + + dependencies = Promise.all( defs.map( function ( def, index ) { + + return parser.getDependency( type, index ); + + } ) ); + + this.cache.add( type, dependencies ); + + } + + return dependencies; + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferIndex + * @return {Promise} + */ + GLTFParser.prototype.loadBuffer = function ( bufferIndex ) { + + var bufferDef = this.json.buffers[ bufferIndex ]; + var loader = this.fileLoader; + + if ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) { + + throw new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' ); + + } + + // If present, GLB container is required to be the first buffer. + if ( bufferDef.uri === undefined && bufferIndex === 0 ) { + + return Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body ); + + } + + var options = this.options; + + return new Promise( function ( resolve, reject ) { + + loader.load( resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () { + + reject( new Error( 'THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".' ) ); + + } ); + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferViewIndex + * @return {Promise} + */ + GLTFParser.prototype.loadBufferView = function ( bufferViewIndex ) { + + var bufferViewDef = this.json.bufferViews[ bufferViewIndex ]; + + return this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) { + + var byteLength = bufferViewDef.byteLength || 0; + var byteOffset = bufferViewDef.byteOffset || 0; + return buffer.slice( byteOffset, byteOffset + byteLength ); + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors + * @param {number} accessorIndex + * @return {Promise} + */ + GLTFParser.prototype.loadAccessor = function ( accessorIndex ) { + + var parser = this; + var json = this.json; + + var accessorDef = this.json.accessors[ accessorIndex ]; + + if ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) { + + // Ignore empty accessors, which may be used to declare runtime + // information about attributes coming from another source (e.g. Draco + // compression extension). + return Promise.resolve( null ); + + } + + var pendingBufferViews = []; + + if ( accessorDef.bufferView !== undefined ) { + + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) ); + + } else { + + pendingBufferViews.push( null ); + + } + + if ( accessorDef.sparse !== undefined ) { + + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) ); + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) ); + + } + + return Promise.all( pendingBufferViews ).then( function ( bufferViews ) { + + var bufferView = bufferViews[ 0 ]; + + var itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ]; + var TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + + // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12. + var elementBytes = TypedArray.BYTES_PER_ELEMENT; + var itemBytes = elementBytes * itemSize; + var byteOffset = accessorDef.byteOffset || 0; + var byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined; + var normalized = accessorDef.normalized === true; + var array, bufferAttribute; + + // The buffer is not interleaved if the stride is the item size in bytes. + if ( byteStride && byteStride !== itemBytes ) { + + // Each "slice" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer + // This makes sure that IBA.count reflects accessor.count properly + var ibSlice = Math.floor( byteOffset / byteStride ); + var ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count; + var ib = parser.cache.get( ibCacheKey ); + + if ( ! ib ) { + + array = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes ); + + // Integer parameters to IB/IBA are in array elements, not bytes. + ib = new THREE.InterleavedBuffer( array, byteStride / elementBytes ); + + parser.cache.add( ibCacheKey, ib ); + + } + + bufferAttribute = new THREE.InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized ); + + } else { + + if ( bufferView === null ) { + + array = new TypedArray( accessorDef.count * itemSize ); + + } else { + + array = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize ); + + } + + bufferAttribute = new THREE.BufferAttribute( array, itemSize, normalized ); + + } + + // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors + if ( accessorDef.sparse !== undefined ) { + + var itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; + var TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ]; + + var byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; + var byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; + + var sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices ); + var sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize ); + + if ( bufferView !== null ) { + + // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes. + bufferAttribute = new THREE.BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized ); + + } + + for ( var i = 0, il = sparseIndices.length; i < il; i ++ ) { + + var index = sparseIndices[ i ]; + + bufferAttribute.setX( index, sparseValues[ i * itemSize ] ); + if ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] ); + if ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] ); + if ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] ); + if ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' ); + + } + + } + + return bufferAttribute; + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures + * @param {number} textureIndex + * @return {Promise} + */ + GLTFParser.prototype.loadTexture = function ( textureIndex ) { + + var parser = this; + var json = this.json; + var options = this.options; + var textureLoader = this.textureLoader; + + var URL = window.URL || window.webkitURL; + + var textureDef = json.textures[ textureIndex ]; + + var textureExtensions = textureDef.extensions || {}; + + var source; + + if ( textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ] ) { + + source = json.images[ textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].source ]; + } else if ( textureExtensions[ EXTENSIONS.GOOGLE_TEXTURE_BASIS ] ) { + + source = json.images[ textureExtensions[ EXTENSIONS.GOOGLE_TEXTURE_BASIS ].source ]; + + } else { + + source = json.images[ textureDef.source ]; + + } + + var sourceURI = source.uri; + var isObjectURL = false; + + if ( source.bufferView !== undefined ) { + + // Load binary image data from bufferView, if provided. + + sourceURI = parser.getDependency( 'bufferView', source.bufferView ).then( function ( bufferView ) { + + isObjectURL = true; + var blob = new Blob( [ bufferView ], { type: source.mimeType } ); + sourceURI = URL.createObjectURL( blob ); + return sourceURI; + + } ); + + } + + return Promise.resolve( sourceURI ).then( function ( sourceURI ) { + + // Load Texture resource. + + var loader = options.manager.getHandler( sourceURI ); + + if ( ! loader ) { + + loader = textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ] + ? parser.extensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].ddsLoader + : textureLoader; + + } + + return new Promise( function ( resolve, reject ) { + + loader.load( resolveURL( sourceURI, options.path ), resolve, undefined, reject ); + + } ); + + } ).then( function ( texture ) { + + // Clean up resources and configure Texture. + + if ( isObjectURL === true ) { + + URL.revokeObjectURL( sourceURI ); + + } + + texture.flipY = false; + + if ( textureDef.name ) texture.name = textureDef.name; + + // Ignore unknown mime types, like DDS files. + if ( source.mimeType in MIME_TYPE_FORMATS ) { + + texture.format = MIME_TYPE_FORMATS[ source.mimeType ]; + + } + + var samplers = json.samplers || {}; + var sampler = samplers[ textureDef.sampler ] || {}; + + texture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || THREE.LinearFilter; + texture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || THREE.LinearMipmapLinearFilter; + texture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || THREE.RepeatWrapping; + texture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || THREE.RepeatWrapping; + + return texture; + + } ); + + }; + + /** + * Asynchronously assigns a texture to the given material parameters. + * @param {Object} materialParams + * @param {string} mapName + * @param {Object} mapDef + * @return {Promise} + */ + GLTFParser.prototype.assignTexture = function ( materialParams, mapName, mapDef ) { + + var parser = this; + + return this.getDependency( 'texture', mapDef.index ).then( function ( texture ) { + + if ( ! texture.isCompressedTexture ) { + + switch ( mapName ) { + + case 'aoMap': + case 'emissiveMap': + case 'metalnessMap': + case 'normalMap': + case 'roughnessMap': + texture.format = THREE.RGBFormat; + break; + + } + + } + + // Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured + // However, we will copy UV set 0 to UV set 1 on demand for aoMap + if ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) { + + console.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' ); + + } + + if ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) { + + var transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined; + + if ( transform ) { + + texture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform ); + + } + + } + + materialParams[ mapName ] = texture; + + } ); + + }; + + /** + * Assigns final material to a Mesh, Line, or Points instance. The instance + * already has a material (generated from the glTF material options alone) + * but reuse of the same glTF material may require multiple threejs materials + * to accomodate different primitive types, defines, etc. New materials will + * be created if necessary, and reused from a cache. + * @param {THREE.Object3D} mesh Mesh, Line, or Points instance. + */ + GLTFParser.prototype.assignFinalMaterial = function ( mesh ) { + + var geometry = mesh.geometry; + var material = mesh.material; + + var useVertexTangents = geometry.attributes.tangent !== undefined; + var useVertexColors = geometry.attributes.color !== undefined; + var useFlatShading = geometry.attributes.normal === undefined; + var useSkinning = mesh.isSkinnedMesh === true; + var useMorphTargets = Object.keys( geometry.morphAttributes ).length > 0; + var useMorphNormals = useMorphTargets && geometry.morphAttributes.normal !== undefined; + + if ( mesh.isPoints ) { + + var cacheKey = 'PointsMaterial:' + material.uuid; + + var pointsMaterial = this.cache.get( cacheKey ); + + if ( ! pointsMaterial ) { + + pointsMaterial = new THREE.PointsMaterial(); + THREE.Material.prototype.copy.call( pointsMaterial, material ); + pointsMaterial.color.copy( material.color ); + pointsMaterial.map = material.map; + pointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px + + this.cache.add( cacheKey, pointsMaterial ); + + } + + material = pointsMaterial; + + } else if ( mesh.isLine ) { + + var cacheKey = 'LineBasicMaterial:' + material.uuid; + + var lineMaterial = this.cache.get( cacheKey ); + + if ( ! lineMaterial ) { + + lineMaterial = new THREE.LineBasicMaterial(); + THREE.Material.prototype.copy.call( lineMaterial, material ); + lineMaterial.color.copy( material.color ); + + this.cache.add( cacheKey, lineMaterial ); + + } + + material = lineMaterial; + + } + + // Clone the material if it will be modified + if ( useVertexTangents || useVertexColors || useFlatShading || useSkinning || useMorphTargets ) { + + var cacheKey = 'ClonedMaterial:' + material.uuid + ':'; + + if ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:'; + if ( useSkinning ) cacheKey += 'skinning:'; + if ( useVertexTangents ) cacheKey += 'vertex-tangents:'; + if ( useVertexColors ) cacheKey += 'vertex-colors:'; + if ( useFlatShading ) cacheKey += 'flat-shading:'; + if ( useMorphTargets ) cacheKey += 'morph-targets:'; + if ( useMorphNormals ) cacheKey += 'morph-normals:'; + + var cachedMaterial = this.cache.get( cacheKey ); + + if ( ! cachedMaterial ) { + + cachedMaterial = material.clone(); + + if ( useSkinning ) cachedMaterial.skinning = true; + if ( useVertexTangents ) cachedMaterial.vertexTangents = true; + if ( useVertexColors ) cachedMaterial.vertexColors = true; + if ( useFlatShading ) cachedMaterial.flatShading = true; + if ( useMorphTargets ) cachedMaterial.morphTargets = true; + if ( useMorphNormals ) cachedMaterial.morphNormals = true; + + this.cache.add( cacheKey, cachedMaterial ); + + } + + material = cachedMaterial; + + } + + // workarounds for mesh and geometry + + if ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) { + + geometry.setAttribute( 'uv2', new THREE.BufferAttribute( geometry.attributes.uv.array, 2 ) ); + + } + + // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 + if ( material.normalScale && ! useVertexTangents ) { + + material.normalScale.y = - material.normalScale.y; + + } + + mesh.material = material; + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials + * @param {number} materialIndex + * @return {Promise} + */ + GLTFParser.prototype.loadMaterial = function ( materialIndex ) { + + var parser = this; + var json = this.json; + var extensions = this.extensions; + var materialDef = json.materials[ materialIndex ]; + + var materialType; + var materialParams = {}; + var materialExtensions = materialDef.extensions || {}; + + var pending = []; + + if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) { + + var sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ]; + materialType = sgExtension.getMaterialType(); + pending.push( sgExtension.extendParams( materialParams, materialDef, parser ) ); + + } else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) { + + var kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ]; + materialType = kmuExtension.getMaterialType(); + pending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) ); + + } else { + + // Specification: + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material + + materialType = THREE.MeshStandardMaterial; + + var metallicRoughness = materialDef.pbrMetallicRoughness || {}; + + materialParams.color = new THREE.Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { + + var array = metallicRoughness.baseColorFactor; + + materialParams.color.fromArray( array ); + materialParams.opacity = array[ 3 ]; + + } + + if ( metallicRoughness.baseColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) ); + + } + + materialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0; + materialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0; + + if ( metallicRoughness.metallicRoughnessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) ); + pending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) ); + + } + + } + + if ( materialDef.doubleSided === true ) { + + materialParams.side = THREE.DoubleSide; + + } + + var alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; + + if ( alphaMode === ALPHA_MODES.BLEND ) { + + materialParams.transparent = true; + + // See: https://github.com/mrdoob/three.js/issues/17706 + materialParams.depthWrite = false; + + } else { + + materialParams.transparent = false; + + if ( alphaMode === ALPHA_MODES.MASK ) { + + materialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5; + + } + + } + + if ( materialDef.normalTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) ); + + materialParams.normalScale = new THREE.Vector2( 1, 1 ); + + if ( materialDef.normalTexture.scale !== undefined ) { + + materialParams.normalScale.set( materialDef.normalTexture.scale, materialDef.normalTexture.scale ); + + } + + } + + if ( materialDef.occlusionTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) ); + + if ( materialDef.occlusionTexture.strength !== undefined ) { + + materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; + + } + + } + + if ( materialDef.emissiveFactor !== undefined && materialType !== THREE.MeshBasicMaterial ) { + + materialParams.emissive = new THREE.Color().fromArray( materialDef.emissiveFactor ); + + } + + if ( materialDef.emissiveTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture ) ); + + } + + return Promise.all( pending ).then( function () { + + var material; + + if ( materialType === GLTFMeshStandardSGMaterial ) { + + material = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams ); + + } else { + + material = new materialType( materialParams ); + + } + + if ( materialDef.name ) material.name = materialDef.name; + + // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding. + if ( material.map ) material.map.encoding = THREE.sRGBEncoding; + if ( material.emissiveMap ) material.emissiveMap.encoding = THREE.sRGBEncoding; + + assignExtrasToUserData( material, materialDef ); + + if ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef ); + + return material; + + } ); + + }; + + /** + * @param {THREE.BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + */ + function computeBounds( geometry, primitiveDef, parser ) { + + var attributes = primitiveDef.attributes; + + var box = new THREE.Box3(); + + if ( attributes.POSITION !== undefined ) { + + var accessor = parser.json.accessors[ attributes.POSITION ]; + + var min = accessor.min; + var max = accessor.max; + + // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. + + if ( min !== undefined && max !== undefined ) { + + box.set( + new THREE.Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ), + new THREE.Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) ); + + } else { + + console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); + + return; + + } + + } else { + + return; + + } + + var targets = primitiveDef.targets; + + if ( targets !== undefined ) { + + var vector = new THREE.Vector3(); + + for ( var i = 0, il = targets.length; i < il; i ++ ) { + + var target = targets[ i ]; + + if ( target.POSITION !== undefined ) { + + var accessor = parser.json.accessors[ target.POSITION ]; + var min = accessor.min; + var max = accessor.max; + + // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. + + if ( min !== undefined && max !== undefined ) { + + // we need to get max of absolute components because target weight is [-1,1] + vector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) ); + vector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) ); + vector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) ); + + box.expandByVector( vector ); + + } else { + + console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); + + } + + } + + } + + } + + geometry.boundingBox = box; + + var sphere = new THREE.Sphere(); + + box.getCenter( sphere.center ); + sphere.radius = box.min.distanceTo( box.max ) / 2; + + geometry.boundingSphere = sphere; + + } + + /** + * @param {THREE.BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + * @return {Promise} + */ + function addPrimitiveAttributes( geometry, primitiveDef, parser ) { + + var attributes = primitiveDef.attributes; + + var pending = []; + + function assignAttributeAccessor( accessorIndex, attributeName ) { + + return parser.getDependency( 'accessor', accessorIndex ) + .then( function ( accessor ) { + + geometry.setAttribute( attributeName, accessor ); + + } ); + + } + + for ( var gltfAttributeName in attributes ) { + + var threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase(); + + // Skip attributes already provided by e.g. Draco extension. + if ( threeAttributeName in geometry.attributes ) continue; + + pending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) ); + + } + + if ( primitiveDef.indices !== undefined && ! geometry.index ) { + + var accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) { + + geometry.setIndex( accessor ); + + } ); + + pending.push( accessor ); + + } + + assignExtrasToUserData( geometry, primitiveDef ); + + computeBounds( geometry, primitiveDef, parser ); + + return Promise.all( pending ).then( function () { + + return primitiveDef.targets !== undefined + ? addMorphTargets( geometry, primitiveDef.targets, parser ) + : geometry; + + } ); + + } + + /** + * @param {THREE.BufferGeometry} geometry + * @param {Number} drawMode + * @return {THREE.BufferGeometry} + */ + function toTrianglesDrawMode( geometry, drawMode ) { + + var index = geometry.getIndex(); + + // generate index if not present + + if ( index === null ) { + + var indices = []; + + var position = geometry.getAttribute( 'position' ); + + if ( position !== undefined ) { + + for ( var i = 0; i < position.count; i ++ ) { + + indices.push( i ); + + } + + geometry.setIndex( indices ); + index = geometry.getIndex(); + + } else { + + console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' ); + return geometry; + + } + + } + + // + + var numberOfTriangles = index.count - 2; + var newIndices = []; + + if ( drawMode === THREE.TriangleFanDrawMode ) { + + // gl.TRIANGLE_FAN + + for ( var i = 1; i <= numberOfTriangles; i ++ ) { + + newIndices.push( index.getX( 0 ) ); + newIndices.push( index.getX( i ) ); + newIndices.push( index.getX( i + 1 ) ); + + } + + } else { + + // gl.TRIANGLE_STRIP + + for ( var i = 0; i < numberOfTriangles; i ++ ) { + + if ( i % 2 === 0 ) { + + newIndices.push( index.getX( i ) ); + newIndices.push( index.getX( i + 1 ) ); + newIndices.push( index.getX( i + 2 ) ); + + + } else { + + newIndices.push( index.getX( i + 2 ) ); + newIndices.push( index.getX( i + 1 ) ); + newIndices.push( index.getX( i ) ); + + } + + } + + } + + if ( ( newIndices.length / 3 ) !== numberOfTriangles ) { + + console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' ); + + } + + // build final geometry + + var newGeometry = geometry.clone(); + newGeometry.setIndex( newIndices ); + + return newGeometry; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry + * + * Creates BufferGeometries from primitives. + * + * @param {Array} primitives + * @return {Promise>} + */ + GLTFParser.prototype.loadGeometries = function ( primitives ) { + + var parser = this; + var extensions = this.extensions; + var cache = this.primitiveCache; + + function createDracoPrimitive( primitive ) { + + return extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] + .decodePrimitive( primitive, parser ) + .then( function ( geometry ) { + + return addPrimitiveAttributes( geometry, primitive, parser ); + + } ); + + } + + var pending = []; + + for ( var i = 0, il = primitives.length; i < il; i ++ ) { + + var primitive = primitives[ i ]; + var cacheKey = createPrimitiveKey( primitive ); + + // See if we've already created this geometry + var cached = cache[ cacheKey ]; + + if ( cached ) { + + // Use the cached geometry if it exists + pending.push( cached.promise ); + + } else { + + var geometryPromise; + + if ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) { + + // Use DRACO geometry if available + geometryPromise = createDracoPrimitive( primitive ); + + } else { + + // Otherwise create a new geometry + geometryPromise = addPrimitiveAttributes( new THREE.BufferGeometry(), primitive, parser ); + + } + + // Cache this geometry + cache[ cacheKey ] = { primitive: primitive, promise: geometryPromise }; + + pending.push( geometryPromise ); + + } + + } + + return Promise.all( pending ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes + * @param {number} meshIndex + * @return {Promise} + */ + GLTFParser.prototype.loadMesh = function ( meshIndex ) { + + var parser = this; + var json = this.json; + + var meshDef = json.meshes[ meshIndex ]; + var primitives = meshDef.primitives; + + var pending = []; + + for ( var i = 0, il = primitives.length; i < il; i ++ ) { + + var material = primitives[ i ].material === undefined + ? createDefaultMaterial( this.cache ) + : this.getDependency( 'material', primitives[ i ].material ); + + pending.push( material ); + + } + + pending.push( parser.loadGeometries( primitives ) ); + + return Promise.all( pending ).then( function ( results ) { + + var materials = results.slice( 0, results.length - 1 ); + var geometries = results[ results.length - 1 ]; + + var meshes = []; + + for ( var i = 0, il = geometries.length; i < il; i ++ ) { + + var geometry = geometries[ i ]; + var primitive = primitives[ i ]; + + // 1. create Mesh + + var mesh; + + var material = materials[ i ]; + + if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES || + primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || + primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || + primitive.mode === undefined ) { + + // .isSkinnedMesh isn't in glTF spec. See .markDefs() + mesh = meshDef.isSkinnedMesh === true + ? new THREE.SkinnedMesh( geometry, material ) + : new THREE.Mesh( geometry, material ); + + if ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) { + + // we normalize floating point skin weight array to fix malformed assets (see #15319) + // it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs + mesh.normalizeSkinWeights(); + + } + + if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) { + + mesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleStripDrawMode ); + + } else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) { + + mesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleFanDrawMode ); + + } + + } else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) { + + mesh = new THREE.LineSegments( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) { + + mesh = new THREE.Line( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) { + + mesh = new THREE.LineLoop( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) { + + mesh = new THREE.Points( geometry, material ); + + } else { + + throw new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode ); + + } + + if ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) { + + updateMorphTargets( mesh, meshDef ); + + } + + mesh.name = meshDef.name || ( 'mesh_' + meshIndex ); + + if ( geometries.length > 1 ) mesh.name += '_' + i; + + assignExtrasToUserData( mesh, meshDef ); + + parser.assignFinalMaterial( mesh ); + + meshes.push( mesh ); + + } + + if ( meshes.length === 1 ) { + + return meshes[ 0 ]; + + } + + var group = new THREE.Group(); + + for ( var i = 0, il = meshes.length; i < il; i ++ ) { + + group.add( meshes[ i ] ); + + } + + return group; + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras + * @param {number} cameraIndex + * @return {Promise} + */ + GLTFParser.prototype.loadCamera = function ( cameraIndex ) { + + var camera; + var cameraDef = this.json.cameras[ cameraIndex ]; + var params = cameraDef[ cameraDef.type ]; + + if ( ! params ) { + + console.warn( 'THREE.GLTFLoader: Missing camera parameters.' ); + return; + + } + + if ( cameraDef.type === 'perspective' ) { + + camera = new THREE.PerspectiveCamera( THREE.MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 ); + + } else if ( cameraDef.type === 'orthographic' ) { + + camera = new THREE.OrthographicCamera( params.xmag / - 2, params.xmag / 2, params.ymag / 2, params.ymag / - 2, params.znear, params.zfar ); + + } + + if ( cameraDef.name ) camera.name = cameraDef.name; + + assignExtrasToUserData( camera, cameraDef ); + + return Promise.resolve( camera ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins + * @param {number} skinIndex + * @return {Promise} + */ + GLTFParser.prototype.loadSkin = function ( skinIndex ) { + + var skinDef = this.json.skins[ skinIndex ]; + + var skinEntry = { joints: skinDef.joints }; + + if ( skinDef.inverseBindMatrices === undefined ) { + + return Promise.resolve( skinEntry ); + + } + + return this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) { + + skinEntry.inverseBindMatrices = accessor; + + return skinEntry; + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations + * @param {number} animationIndex + * @return {Promise} + */ + GLTFParser.prototype.loadAnimation = function ( animationIndex ) { + + var json = this.json; + + var animationDef = json.animations[ animationIndex ]; + + var pendingNodes = []; + var pendingInputAccessors = []; + var pendingOutputAccessors = []; + var pendingSamplers = []; + var pendingTargets = []; + + for ( var i = 0, il = animationDef.channels.length; i < il; i ++ ) { + + var channel = animationDef.channels[ i ]; + var sampler = animationDef.samplers[ channel.sampler ]; + var target = channel.target; + var name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated. + var input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input; + var output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output; + + pendingNodes.push( this.getDependency( 'node', name ) ); + pendingInputAccessors.push( this.getDependency( 'accessor', input ) ); + pendingOutputAccessors.push( this.getDependency( 'accessor', output ) ); + pendingSamplers.push( sampler ); + pendingTargets.push( target ); + + } + + return Promise.all( [ + + Promise.all( pendingNodes ), + Promise.all( pendingInputAccessors ), + Promise.all( pendingOutputAccessors ), + Promise.all( pendingSamplers ), + Promise.all( pendingTargets ) + + ] ).then( function ( dependencies ) { + + var nodes = dependencies[ 0 ]; + var inputAccessors = dependencies[ 1 ]; + var outputAccessors = dependencies[ 2 ]; + var samplers = dependencies[ 3 ]; + var targets = dependencies[ 4 ]; + + var tracks = []; + + for ( var i = 0, il = nodes.length; i < il; i ++ ) { + + var node = nodes[ i ]; + var inputAccessor = inputAccessors[ i ]; + var outputAccessor = outputAccessors[ i ]; + var sampler = samplers[ i ]; + var target = targets[ i ]; + + if ( node === undefined ) continue; + + node.updateMatrix(); + node.matrixAutoUpdate = true; + + var TypedKeyframeTrack; + + switch ( PATH_PROPERTIES[ target.path ] ) { + + case PATH_PROPERTIES.weights: + + TypedKeyframeTrack = THREE.NumberKeyframeTrack; + break; + + case PATH_PROPERTIES.rotation: + + TypedKeyframeTrack = THREE.QuaternionKeyframeTrack; + break; + + case PATH_PROPERTIES.position: + case PATH_PROPERTIES.scale: + default: + + TypedKeyframeTrack = THREE.VectorKeyframeTrack; + break; + + } + + var targetName = node.name ? node.name : node.uuid; + + var interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : THREE.InterpolateLinear; + + var targetNames = []; + + if ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) { + + // Node may be a THREE.Group (glTF mesh with several primitives) or a THREE.Mesh. + node.traverse( function ( object ) { + + if ( object.isMesh === true && object.morphTargetInfluences ) { + + targetNames.push( object.name ? object.name : object.uuid ); + + } + + } ); + + } else { + + targetNames.push( targetName ); + + } + + var outputArray = outputAccessor.array; + + if ( outputAccessor.normalized ) { + + var scale; + + if ( outputArray.constructor === Int8Array ) { + + scale = 1 / 127; + + } else if ( outputArray.constructor === Uint8Array ) { + + scale = 1 / 255; + + } else if ( outputArray.constructor == Int16Array ) { + + scale = 1 / 32767; + + } else if ( outputArray.constructor === Uint16Array ) { + + scale = 1 / 65535; + + } else { + + throw new Error( 'THREE.GLTFLoader: Unsupported output accessor component type.' ); + + } + + var scaled = new Float32Array( outputArray.length ); + + for ( var j = 0, jl = outputArray.length; j < jl; j ++ ) { + + scaled[ j ] = outputArray[ j ] * scale; + + } + + outputArray = scaled; + + } + + for ( var j = 0, jl = targetNames.length; j < jl; j ++ ) { + + var track = new TypedKeyframeTrack( + targetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ], + inputAccessor.array, + outputArray, + interpolation + ); + + // Override interpolation with custom factory method. + if ( sampler.interpolation === 'CUBICSPLINE' ) { + + track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) { + + // A CUBICSPLINE keyframe in glTF has three output values for each input value, + // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize() + // must be divided by three to get the interpolant's sampleSize argument. + + return new GLTFCubicSplineInterpolant( this.times, this.values, this.getValueSize() / 3, result ); + + }; + + // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants. + track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; + + } + + tracks.push( track ); + + } + + } + + var name = animationDef.name ? animationDef.name : 'animation_' + animationIndex; + + return new THREE.AnimationClip( name, undefined, tracks ); + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy + * @param {number} nodeIndex + * @return {Promise} + */ + GLTFParser.prototype.loadNode = function ( nodeIndex ) { + + var json = this.json; + var extensions = this.extensions; + var parser = this; + + var meshReferences = json.meshReferences; + var meshUses = json.meshUses; + + var nodeDef = json.nodes[ nodeIndex ]; + + return ( function () { + + var pending = []; + + if ( nodeDef.mesh !== undefined ) { + + pending.push( parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) { + + var node; + + if ( meshReferences[ nodeDef.mesh ] > 1 ) { + + var instanceNum = meshUses[ nodeDef.mesh ] ++; + + node = mesh.clone(); + node.name += '_instance_' + instanceNum; + + } else { + + node = mesh; + + } + + // if weights are provided on the node, override weights on the mesh. + if ( nodeDef.weights !== undefined ) { + + node.traverse( function ( o ) { + + if ( ! o.isMesh ) return; + + for ( var i = 0, il = nodeDef.weights.length; i < il; i ++ ) { + + o.morphTargetInfluences[ i ] = nodeDef.weights[ i ]; + + } + + } ); + + } + + return node; + + } ) ); + + } + + if ( nodeDef.camera !== undefined ) { + + pending.push( parser.getDependency( 'camera', nodeDef.camera ) ); + + } + + if ( nodeDef.extensions + && nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ] + && nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light !== undefined ) { + + pending.push( parser.getDependency( 'light', nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light ) ); + + } + + return Promise.all( pending ); + + }() ).then( function ( objects ) { + + var node; + + // .isBone isn't in glTF spec. See .markDefs + if ( nodeDef.isBone === true ) { + + node = new THREE.Bone(); + + } else if ( objects.length > 1 ) { + + node = new THREE.Group(); + + } else if ( objects.length === 1 ) { + + node = objects[ 0 ]; + + } else { + + node = new THREE.Object3D(); + + } + + if ( node !== objects[ 0 ] ) { + + for ( var i = 0, il = objects.length; i < il; i ++ ) { + + node.add( objects[ i ] ); + + } + + } + + if ( nodeDef.name ) { + + node.userData.name = nodeDef.name; + node.name = THREE.PropertyBinding.sanitizeNodeName( nodeDef.name ); + + } + + assignExtrasToUserData( node, nodeDef ); + + if ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef ); + + if ( nodeDef.matrix !== undefined ) { + + var matrix = new THREE.Matrix4(); + matrix.fromArray( nodeDef.matrix ); + node.applyMatrix4( matrix ); + + } else { + + if ( nodeDef.translation !== undefined ) { + + node.position.fromArray( nodeDef.translation ); + + } + + if ( nodeDef.rotation !== undefined ) { + + node.quaternion.fromArray( nodeDef.rotation ); + + } + + if ( nodeDef.scale !== undefined ) { + + node.scale.fromArray( nodeDef.scale ); + + } + + } + + return node; + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes + * @param {number} sceneIndex + * @return {Promise} + */ + GLTFParser.prototype.loadScene = function () { + + // scene node hierachy builder + + function buildNodeHierachy( nodeId, parentObject, json, parser ) { + + var nodeDef = json.nodes[ nodeId ]; + + return parser.getDependency( 'node', nodeId ).then( function ( node ) { + + if ( nodeDef.skin === undefined ) return node; + + // build skeleton here as well + + var skinEntry; + + return parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) { + + skinEntry = skin; + + var pendingJoints = []; + + for ( var i = 0, il = skinEntry.joints.length; i < il; i ++ ) { + + pendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) ); + + } + + return Promise.all( pendingJoints ); + + } ).then( function ( jointNodes ) { + + node.traverse( function ( mesh ) { + + if ( ! mesh.isMesh ) return; + + var bones = []; + var boneInverses = []; + + for ( var j = 0, jl = jointNodes.length; j < jl; j ++ ) { + + var jointNode = jointNodes[ j ]; + + if ( jointNode ) { + + bones.push( jointNode ); + + var mat = new THREE.Matrix4(); + + if ( skinEntry.inverseBindMatrices !== undefined ) { + + mat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 ); + + } + + boneInverses.push( mat ); + + } else { + + console.warn( 'THREE.GLTFLoader: Joint "%s" could not be found.', skinEntry.joints[ j ] ); + + } + + } + + mesh.bind( new THREE.Skeleton( bones, boneInverses ), mesh.matrixWorld ); + + } ); + + return node; + + } ); + + } ).then( function ( node ) { + + // build node hierachy + + parentObject.add( node ); + + var pending = []; + + if ( nodeDef.children ) { + + var children = nodeDef.children; + + for ( var i = 0, il = children.length; i < il; i ++ ) { + + var child = children[ i ]; + pending.push( buildNodeHierachy( child, node, json, parser ) ); + + } + + } + + return Promise.all( pending ); + + } ); + + } + + return function loadScene( sceneIndex ) { + + var json = this.json; + var extensions = this.extensions; + var sceneDef = this.json.scenes[ sceneIndex ]; + var parser = this; + + // Loader returns Group, not Scene. + // See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172 + var scene = new THREE.Group(); + if ( sceneDef.name ) scene.name = sceneDef.name; + + assignExtrasToUserData( scene, sceneDef ); + + if ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef ); + + var nodeIds = sceneDef.nodes || []; + + var pending = []; + + for ( var i = 0, il = nodeIds.length; i < il; i ++ ) { + + pending.push( buildNodeHierachy( nodeIds[ i ], scene, json, parser ) ); + + } + + return Promise.all( pending ).then( function () { + + return scene; + + } ); + + }; + + }(); + + return GLTFLoader; + +} )(); diff --git a/ktx/external/basisu/webgl/gltf/README.md b/ktx/external/basisu/webgl/gltf/README.md new file mode 100644 index 0000000..f360120 --- /dev/null +++ b/ktx/external/basisu/webgl/gltf/README.md @@ -0,0 +1,8 @@ +## Credits + +* Contributors: + * [Don McCurdy](https://www.donmccurdy.com) + * [Austin Eng](https://github.com/austinEng) + * [Shrek Shao](https://github.com/shrekshao) +* Made with [three.js](https://threejs.org/). +* Thanks to [AGI](http://agi.com/) for providing the glTF model. diff --git a/ktx/external/basisu/webgl/gltf/assets/AgiHqSmall.gltf b/ktx/external/basisu/webgl/gltf/assets/AgiHqSmall.gltf new file mode 100644 index 0000000..5a47ab5 --- /dev/null +++ b/ktx/external/basisu/webgl/gltf/assets/AgiHqSmall.gltf @@ -0,0 +1,254 @@ +{ + "accessors": [ + { + "byteOffset": 0, + "componentType": 5126, + "type": "VEC3", + "count": 55381, + "min": [ + -527.3590087890625, + -104.39354705810547, + -495.3590087890625 + ], + "max": [ + 599.3590087890625, + -33.72303009033203, + 561.3590087890625 + ], + "bufferView": 0, + "name": "mesh-0-0_Accessor_POSITION" + }, + { + "byteOffset": 0, + "componentType": 5126, + "type": "VEC2", + "count": 55381, + "min": [ + 0.0000017028407910402166, + 0.00000289904824057885 + ], + "max": [ + 0.9993386268615723, + 0.9999556541442871 + ], + "bufferView": 1, + "name": "mesh-0-0_Accessor_TEXCOORD_0" + }, + { + "byteOffset": 0, + "componentType": 5123, + "type": "SCALAR", + "count": 151158, + "bufferView": 4, + "name": "mesh-0-0_Accessor_indices" + }, + { + "byteOffset": 0, + "componentType": 5126, + "type": "VEC3", + "count": 30806, + "min": [ + -527.3590087890625, + -105.48443603515625, + -495.3590087890625 + ], + "max": [ + 599.3590087890625, + -26.287290573120117, + 561.3590087890625 + ], + "bufferView": 2, + "name": "mesh-1-0_Accessor_POSITION" + }, + { + "byteOffset": 0, + "componentType": 5126, + "type": "VEC2", + "count": 30806, + "min": [ + 0.00000964943137660157, + 0.000003775880941248033 + ], + "max": [ + 0.9999449253082275, + 0.9999914169311523 + ], + "bufferView": 3, + "name": "mesh-1-0_Accessor_TEXCOORD_0" + }, + { + "byteOffset": 302316, + "componentType": 5123, + "type": "SCALAR", + "count": 58476, + "bufferView": 4, + "name": "mesh-1-0_Accessor_indices" + } + ], + "asset": { + "generator": "obj2gltf", + "version": "2.0" + }, + "buffers": [ + { + "name": "mesh-0-0_Buffer_POSITION", + "byteLength": 2143008, + "uri": "mesh-0-0_Buffer_POSITION.bin" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 664572, + "byteOffset": 0, + "target": 34962, + "name": "bufferView_0", + "byteStride": 12 + }, + { + "buffer": 0, + "byteLength": 443048, + "byteOffset": 664572, + "target": 34962, + "name": "bufferView_0", + "byteStride": 8 + }, + { + "buffer": 0, + "byteLength": 369672, + "byteOffset": 1107620, + "target": 34962, + "name": "bufferView_0", + "byteStride": 12 + }, + { + "buffer": 0, + "byteLength": 246448, + "byteOffset": 1477292, + "target": 34962, + "name": "bufferView_0", + "byteStride": 8 + }, + { + "buffer": 0, + "byteLength": 419268, + "byteOffset": 1723740, + "target": 34963, + "name": "bufferView_1" + } + ], + "materials": [ + { + "name": "Texture", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0, + "texCoord": 0 + }, + "metallicFactor": 0, + "roughnessFactor": 1, + "baseColorFactor": [ + 1, + 1, + 1, + 1 + ] + }, + "emissiveTexture": { + "index": 0, + "texCoord": 0 + }, + "alphaMode": "OPAQUE", + "doubleSided": false, + "emissiveFactor": [ + 0, + 0, + 0 + ] + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0, + "TEXCOORD_0": 1 + }, + "indices": 2, + "material": 0, + "mode": 4 + } + ], + "name": "mesh-split_1" + }, + { + "primitives": [ + { + "attributes": { + "POSITION": 3, + "TEXCOORD_0": 4 + }, + "indices": 5, + "material": 0, + "mode": 4 + } + ], + "name": "mesh-split_2" + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "name": "rootNode_0", + "mesh": 0 + }, + { + "mesh": 1 + } + ], + "samplers": [ + { + "magFilter": 9729, + "minFilter": 9729, + "wrapS": 33071, + "wrapT": 33071, + "name": "sampler_0" + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ], + "name": "scene" + } + ], + "textures": [ + { + "sampler": 0, + "name": "textureAtlas", + "extensions": { + "GOOGLE_texture_basis": { + "source": 0 + } + } + } + ], + "images": [ + { + "name": "textureAtlasImage", + "mimeType": "image/basis", + "uri": "textureAtlasImage.basis" + } + ], + "extensionsUsed": [ + "GOOGLE_texture_basis" + ], + "extensionsRequired": [ + "GOOGLE_texture_basis" + ] +} diff --git a/ktx/external/basisu/webgl/gltf/assets/kodim26_uastc.basis b/ktx/external/basisu/webgl/gltf/assets/kodim26_uastc.basis new file mode 100644 index 0000000..69ad796 Binary files /dev/null and b/ktx/external/basisu/webgl/gltf/assets/kodim26_uastc.basis differ diff --git a/ktx/external/basisu/webgl/gltf/assets/mesh-0-0_Buffer_POSITION.bin b/ktx/external/basisu/webgl/gltf/assets/mesh-0-0_Buffer_POSITION.bin new file mode 100644 index 0000000..8c4bddc Binary files /dev/null and b/ktx/external/basisu/webgl/gltf/assets/mesh-0-0_Buffer_POSITION.bin differ diff --git a/ktx/external/basisu/webgl/gltf/assets/textureAtlasImage.basis b/ktx/external/basisu/webgl/gltf/assets/textureAtlasImage.basis new file mode 100644 index 0000000..2c09559 Binary files /dev/null and b/ktx/external/basisu/webgl/gltf/assets/textureAtlasImage.basis differ diff --git a/ktx/external/basisu/webgl/gltf/index.html b/ktx/external/basisu/webgl/gltf/index.html new file mode 100644 index 0000000..4525c21 --- /dev/null +++ b/ktx/external/basisu/webgl/gltf/index.html @@ -0,0 +1,131 @@ + + + + + + + + + + + + +
            + Basis Texture Transcoder glTF Demo +
            + +
            + + + + + diff --git a/ktx/external/basisu/webgl/gltf/preview.png b/ktx/external/basisu/webgl/gltf/preview.png new file mode 100644 index 0000000..ced1794 Binary files /dev/null and b/ktx/external/basisu/webgl/gltf/preview.png differ diff --git a/ktx/external/basisu/webgl/gltf/three.min.js b/ktx/external/basisu/webgl/gltf/three.min.js new file mode 100644 index 0000000..3e56587 --- /dev/null +++ b/ktx/external/basisu/webgl/gltf/three.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).THREE={})}(this,function(e){"use strict";void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52)),void 0===Number.isInteger&&(Number.isInteger=function(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e}),void 0===Math.sign&&(Math.sign=function(e){return e<0?-1:e>0?1:+e}),"name"in Function.prototype==!1&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}}),void 0===Object.assign&&(Object.assign=function(e){if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),n=1;n>8&255]+Vt[e>>16&255]+Vt[e>>24&255]+"-"+Vt[255&t]+Vt[t>>8&255]+"-"+Vt[t>>16&15|64]+Vt[t>>24&255]+"-"+Vt[63&n|128]+Vt[n>>8&255]+"-"+Vt[n>>16&255]+Vt[n>>24&255]+Vt[255&i]+Vt[i>>8&255]+Vt[i>>16&255]+Vt[i>>24&255]).toUpperCase()},clamp:function(e,t,n){return Math.max(t,Math.min(n,e))},euclideanModulo:function(e,t){return(e%t+t)%t},mapLinear:function(e,t,n,i,r){return i+(e-t)*(r-i)/(n-t)},lerp:function(e,t,n){return(1-n)*e+n*t},smoothstep:function(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t))*e*(3-2*e)},smootherstep:function(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t))*e*e*(e*(6*e-15)+10)},randInt:function(e,t){return e+Math.floor(Math.random()*(t-e+1))},randFloat:function(e,t){return e+Math.random()*(t-e)},randFloatSpread:function(e){return e*(.5-Math.random())},degToRad:function(e){return e*Wt.DEG2RAD},radToDeg:function(e){return e*Wt.RAD2DEG},isPowerOfTwo:function(e){return 0==(e&e-1)&&0!==e},ceilPowerOfTwo:function(e){return Math.pow(2,Math.ceil(Math.log(e)/Math.LN2))},floorPowerOfTwo:function(e){return Math.pow(2,Math.floor(Math.log(e)/Math.LN2))},setQuaternionFromProperEuler:function(e,t,n,i,r){var a=Math.cos,o=Math.sin,s=a(n/2),c=o(n/2),l=a((t+i)/2),h=o((t+i)/2),u=a((t-i)/2),p=o((t-i)/2),d=a((i-t)/2),f=o((i-t)/2);"XYX"===r?e.set(s*h,c*u,c*p,s*l):"YZY"===r?e.set(c*p,s*h,c*u,s*l):"ZXZ"===r?e.set(c*u,c*p,s*h,s*l):"XZX"===r?e.set(s*h,c*f,c*d,s*l):"YXY"===r?e.set(c*d,s*h,c*f,s*l):"ZYZ"===r?e.set(c*f,c*d,s*h,s*l):console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order.")}};function qt(e,t){this.x=e||0,this.y=t||0}function Xt(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}Object.defineProperties(qt.prototype,{width:{get:function(){return this.x},set:function(e){this.x=e}},height:{get:function(){return this.y},set:function(e){this.y=e}}}),Object.assign(qt.prototype,{isVector2:!0,set:function(e,t){return this.x=e,this.y=t,this},setScalar:function(e){return this.x=e,this.y=e,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(e){return this.x=e.x,this.y=e.y,this},add:function(e,t){return void 0!==t?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this)},addScalar:function(e){return this.x+=e,this.y+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this},addScaledVector:function(e,t){return this.x+=e.x*t,this.y+=e.y*t,this},sub:function(e,t){return void 0!==t?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this)},subScalar:function(e){return this.x-=e,this.y-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this},multiply:function(e){return this.x*=e.x,this.y*=e.y,this},multiplyScalar:function(e){return this.x*=e,this.y*=e,this},divide:function(e){return this.x/=e.x,this.y/=e.y,this},divideScalar:function(e){return this.multiplyScalar(1/e)},applyMatrix3:function(e){var t=this.x,n=this.y,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6],this.y=i[1]*t+i[4]*n+i[7],this},min:function(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this},max:function(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this},clamp:function(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this},clampScalar:function(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this},clampLength:function(e,t){var n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(e,Math.min(t,n)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this},negate:function(){return this.x=-this.x,this.y=-this.y,this},dot:function(e){return this.x*e.x+this.y*e.y},cross:function(e){return this.x*e.y-this.y*e.x},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){return Math.atan2(-this.y,-this.x)+Math.PI},distanceTo:function(e){return Math.sqrt(this.distanceToSquared(e))},distanceToSquared:function(e){var t=this.x-e.x,n=this.y-e.y;return t*t+n*n},manhattanDistanceTo:function(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)},setLength:function(e){return this.normalize().multiplyScalar(e)},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this},lerpVectors:function(e,t,n){return this.subVectors(t,e).multiplyScalar(n).add(e)},equals:function(e){return e.x===this.x&&e.y===this.y},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e},fromBufferAttribute:function(e,t,n){return void 0!==n&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this},rotateAround:function(e,t){var n=Math.cos(t),i=Math.sin(t),r=this.x-e.x,a=this.y-e.y;return this.x=r*n-a*i+e.x,this.y=r*i+a*n+e.y,this}}),Object.assign(Xt.prototype,{isMatrix3:!0,set:function(e,t,n,i,r,a,o,s,c){var l=this.elements;return l[0]=e,l[1]=i,l[2]=o,l[3]=t,l[4]=r,l[5]=s,l[6]=n,l[7]=a,l[8]=c,this},identity:function(){return this.set(1,0,0,0,1,0,0,0,1),this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(e){var t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this},extractBasis:function(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this},setFromMatrix4:function(e){var t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this},multiply:function(e){return this.multiplyMatrices(this,e)},premultiply:function(e){return this.multiplyMatrices(e,this)},multiplyMatrices:function(e,t){var n=e.elements,i=t.elements,r=this.elements,a=n[0],o=n[3],s=n[6],c=n[1],l=n[4],h=n[7],u=n[2],p=n[5],d=n[8],f=i[0],m=i[3],g=i[6],v=i[1],y=i[4],x=i[7],b=i[2],_=i[5],w=i[8];return r[0]=a*f+o*v+s*b,r[3]=a*m+o*y+s*_,r[6]=a*g+o*x+s*w,r[1]=c*f+l*v+h*b,r[4]=c*m+l*y+h*_,r[7]=c*g+l*x+h*w,r[2]=u*f+p*v+d*b,r[5]=u*m+p*y+d*_,r[8]=u*g+p*x+d*w,this},multiplyScalar:function(e){var t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this},determinant:function(){var e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8];return t*a*l-t*o*c-n*r*l+n*o*s+i*r*c-i*a*s},getInverse:function(e,t){e&&e.isMatrix4&&console.error("THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.");var n=e.elements,i=this.elements,r=n[0],a=n[1],o=n[2],s=n[3],c=n[4],l=n[5],h=n[6],u=n[7],p=n[8],d=p*c-l*u,f=l*h-p*s,m=u*s-c*h,g=r*d+a*f+o*m;if(0===g){var v="THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0";if(!0===t)throw new Error(v);return console.warn(v),this.identity()}var y=1/g;return i[0]=d*y,i[1]=(o*u-p*a)*y,i[2]=(l*a-o*c)*y,i[3]=f*y,i[4]=(p*r-o*h)*y,i[5]=(o*s-l*r)*y,i[6]=m*y,i[7]=(a*h-u*r)*y,i[8]=(c*r-a*s)*y,this},transpose:function(){var e,t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this},getNormalMatrix:function(e){return this.setFromMatrix4(e).getInverse(this).transpose()},transposeIntoArray:function(e){var t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this},setUvTransform:function(e,t,n,i,r,a,o){var s=Math.cos(r),c=Math.sin(r);this.set(n*s,n*c,-n*(s*a+c*o)+a+e,-i*c,i*s,-i*(-c*a+s*o)+o+t,0,0,1)},scale:function(e,t){var n=this.elements;return n[0]*=e,n[3]*=e,n[6]*=e,n[1]*=t,n[4]*=t,n[7]*=t,this},rotate:function(e){var t=Math.cos(e),n=Math.sin(e),i=this.elements,r=i[0],a=i[3],o=i[6],s=i[1],c=i[4],l=i[7];return i[0]=t*r+n*s,i[3]=t*a+n*c,i[6]=t*o+n*l,i[1]=-n*r+t*s,i[4]=-n*a+t*c,i[7]=-n*o+t*l,this},translate:function(e,t){var n=this.elements;return n[0]+=e*n[2],n[3]+=e*n[5],n[6]+=e*n[8],n[1]+=t*n[2],n[4]+=t*n[5],n[7]+=t*n[8],this},equals:function(e){for(var t=this.elements,n=e.elements,i=0;i<9;i++)if(t[i]!==n[i])return!1;return!0},fromArray:function(e,t){void 0===t&&(t=0);for(var n=0;n<9;n++)this.elements[n]=e[n+t];return this},toArray:function(e,t){void 0===e&&(e=[]),void 0===t&&(t=0);var n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}});var Yt={getDataURL:function(e){var t;if("undefined"==typeof HTMLCanvasElement)return e.src;if(e instanceof HTMLCanvasElement)t=e;else{void 0===jt&&(jt=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),jt.width=e.width,jt.height=e.height;var n=jt.getContext("2d");e instanceof ImageData?n.putImageData(e,0,0):n.drawImage(e,0,0,e.width,e.height),t=jt}return t.width>2048||t.height>2048?t.toDataURL("image/jpeg",.6):t.toDataURL("image/png")}},Zt=0;function Jt(e,t,n,i,r,a,o,s,c,l){Object.defineProperty(this,"id",{value:Zt++}),this.uuid=Wt.generateUUID(),this.name="",this.image=void 0!==e?e:Jt.DEFAULT_IMAGE,this.mipmaps=[],this.mapping=void 0!==t?t:Jt.DEFAULT_MAPPING,this.wrapS=void 0!==n?n:ie,this.wrapT=void 0!==i?i:ie,this.magFilter=void 0!==r?r:ce,this.minFilter=void 0!==a?a:he,this.anisotropy=void 0!==c?c:1,this.format=void 0!==o?o:Te,this.internalFormat=null,this.type=void 0!==s?s:ue,this.offset=new qt(0,0),this.repeat=new qt(1,1),this.center=new qt(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new Xt,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=void 0!==l?l:Tt,this.version=0,this.onUpdate=null}function Qt(e,t,n,i){this.x=e||0,this.y=t||0,this.z=n||0,this.w=void 0!==i?i:1}function Kt(e,t,n){this.width=e,this.height=t,this.scissor=new Qt(0,0,e,t),this.scissorTest=!1,this.viewport=new Qt(0,0,e,t),n=n||{},this.texture=new Jt(void 0,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.encoding),this.texture.image={},this.texture.image.width=e,this.texture.image.height=t,this.texture.generateMipmaps=void 0!==n.generateMipmaps&&n.generateMipmaps,this.texture.minFilter=void 0!==n.minFilter?n.minFilter:ce,this.depthBuffer=void 0===n.depthBuffer||n.depthBuffer,this.stencilBuffer=void 0===n.stencilBuffer||n.stencilBuffer,this.depthTexture=void 0!==n.depthTexture?n.depthTexture:null}function $t(e,t,n){Kt.call(this,e,t,n),this.samples=4}function en(e,t,n,i){this._x=e||0,this._y=t||0,this._z=n||0,this._w=void 0!==i?i:1}Jt.DEFAULT_IMAGE=void 0,Jt.DEFAULT_MAPPING=300,Jt.prototype=Object.assign(Object.create(Ht.prototype),{constructor:Jt,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.name=e.name,this.image=e.image,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.encoding=e.encoding,this},toJSON:function(e){var t=void 0===e||"string"==typeof e;if(!t&&void 0!==e.textures[this.uuid])return e.textures[this.uuid];var n={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){var i=this.image;if(void 0===i.uuid&&(i.uuid=Wt.generateUUID()),!t&&void 0===e.images[i.uuid]){var r;if(Array.isArray(i)){r=[];for(var a=0,o=i.length;a1)switch(this.wrapS){case ne:e.x=e.x-Math.floor(e.x);break;case ie:e.x=e.x<0?0:1;break;case re:1===Math.abs(Math.floor(e.x)%2)?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x)}if(e.y<0||e.y>1)switch(this.wrapT){case ne:e.y=e.y-Math.floor(e.y);break;case ie:e.y=e.y<0?0:1;break;case re:1===Math.abs(Math.floor(e.y)%2)?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y)}return this.flipY&&(e.y=1-e.y),e}}),Object.defineProperty(Jt.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Object.defineProperties(Qt.prototype,{width:{get:function(){return this.z},set:function(e){this.z=e}},height:{get:function(){return this.w},set:function(e){this.w=e}}}),Object.assign(Qt.prototype,{isVector4:!0,set:function(e,t,n,i){return this.x=e,this.y=t,this.z=n,this.w=i,this},setScalar:function(e){return this.x=e,this.y=e,this.z=e,this.w=e,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setZ:function(e){return this.z=e,this},setW:function(e){return this.w=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=void 0!==e.w?e.w:1,this},add:function(e,t){return void 0!==t?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this)},addScalar:function(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this},addScaledVector:function(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this},sub:function(e,t){return void 0!==t?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this)},subScalar:function(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this},multiplyScalar:function(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this},applyMatrix4:function(e){var t=this.x,n=this.y,i=this.z,r=this.w,a=e.elements;return this.x=a[0]*t+a[4]*n+a[8]*i+a[12]*r,this.y=a[1]*t+a[5]*n+a[9]*i+a[13]*r,this.z=a[2]*t+a[6]*n+a[10]*i+a[14]*r,this.w=a[3]*t+a[7]*n+a[11]*i+a[15]*r,this},divideScalar:function(e){return this.multiplyScalar(1/e)},setAxisAngleFromQuaternion:function(e){this.w=2*Math.acos(e.w);var t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this},setAxisAngleFromRotationMatrix:function(e){var t,n,i,r,a=e.elements,o=a[0],s=a[4],c=a[8],l=a[1],h=a[5],u=a[9],p=a[2],d=a[6],f=a[10];if(Math.abs(s-l)<.01&&Math.abs(c-p)<.01&&Math.abs(u-d)<.01){if(Math.abs(s+l)<.1&&Math.abs(c+p)<.1&&Math.abs(u+d)<.1&&Math.abs(o+h+f-3)<.1)return this.set(1,0,0,0),this;t=Math.PI;var m=(o+1)/2,g=(h+1)/2,v=(f+1)/2,y=(s+l)/4,x=(c+p)/4,b=(u+d)/4;return m>g&&m>v?m<.01?(n=0,i=.707106781,r=.707106781):(i=y/(n=Math.sqrt(m)),r=x/n):g>v?g<.01?(n=.707106781,i=0,r=.707106781):(n=y/(i=Math.sqrt(g)),r=b/i):v<.01?(n=.707106781,i=.707106781,r=0):(n=x/(r=Math.sqrt(v)),i=b/r),this.set(n,i,r,t),this}var _=Math.sqrt((d-u)*(d-u)+(c-p)*(c-p)+(l-s)*(l-s));return Math.abs(_)<.001&&(_=1),this.x=(d-u)/_,this.y=(c-p)/_,this.z=(l-s)/_,this.w=Math.acos((o+h+f-1)/2),this},min:function(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this},max:function(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this},clamp:function(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this.w=Math.max(e.w,Math.min(t.w,this.w)),this},clampScalar:function(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this.w=Math.max(e,Math.min(t,this.w)),this},clampLength:function(e,t){var n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(e,Math.min(t,n)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this},dot:function(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(e){return this.normalize().multiplyScalar(e)},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this},lerpVectors:function(e,t,n){return this.subVectors(t,e).multiplyScalar(n).add(e)},equals:function(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e},fromBufferAttribute:function(e,t,n){return void 0!==n&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}}),Kt.prototype=Object.assign(Object.create(Ht.prototype),{constructor:Kt,isWebGLRenderTarget:!0,setSize:function(e,t){this.width===e&&this.height===t||(this.width=e,this.height=t,this.texture.image.width=e,this.texture.image.height=t,this.dispose()),this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.width=e.width,this.height=e.height,this.viewport.copy(e.viewport),this.texture=e.texture.clone(),this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,this.depthTexture=e.depthTexture,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),$t.prototype=Object.assign(Object.create(Kt.prototype),{constructor:$t,isWebGLMultisampleRenderTarget:!0,copy:function(e){return Kt.prototype.copy.call(this,e),this.samples=e.samples,this}}),Object.assign(en,{slerp:function(e,t,n,i){return n.copy(e).slerp(t,i)},slerpFlat:function(e,t,n,i,r,a,o){var s=n[i+0],c=n[i+1],l=n[i+2],h=n[i+3],u=r[a+0],p=r[a+1],d=r[a+2],f=r[a+3];if(h!==f||s!==u||c!==p||l!==d){var m=1-o,g=s*u+c*p+l*d+h*f,v=g>=0?1:-1,y=1-g*g;if(y>Number.EPSILON){var x=Math.sqrt(y),b=Math.atan2(x,g*v);m=Math.sin(m*b)/x,o=Math.sin(o*b)/x}var _=o*v;if(s=s*m+u*_,c=c*m+p*_,l=l*m+d*_,h=h*m+f*_,m===1-o){var w=1/Math.sqrt(s*s+c*c+l*l+h*h);s*=w,c*=w,l*=w,h*=w}}e[t]=s,e[t+1]=c,e[t+2]=l,e[t+3]=h}}),Object.defineProperties(en.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._onChangeCallback()}},y:{get:function(){return this._y},set:function(e){this._y=e,this._onChangeCallback()}},z:{get:function(){return this._z},set:function(e){this._z=e,this._onChangeCallback()}},w:{get:function(){return this._w},set:function(e){this._w=e,this._onChangeCallback()}}}),Object.assign(en.prototype,{isQuaternion:!0,set:function(e,t,n,i){return this._x=e,this._y=t,this._z=n,this._w=i,this._onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this},setFromEuler:function(e,t){if(!e||!e.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var n=e._x,i=e._y,r=e._z,a=e.order,o=Math.cos,s=Math.sin,c=o(n/2),l=o(i/2),h=o(r/2),u=s(n/2),p=s(i/2),d=s(r/2);return"XYZ"===a?(this._x=u*l*h+c*p*d,this._y=c*p*h-u*l*d,this._z=c*l*d+u*p*h,this._w=c*l*h-u*p*d):"YXZ"===a?(this._x=u*l*h+c*p*d,this._y=c*p*h-u*l*d,this._z=c*l*d-u*p*h,this._w=c*l*h+u*p*d):"ZXY"===a?(this._x=u*l*h-c*p*d,this._y=c*p*h+u*l*d,this._z=c*l*d+u*p*h,this._w=c*l*h-u*p*d):"ZYX"===a?(this._x=u*l*h-c*p*d,this._y=c*p*h+u*l*d,this._z=c*l*d-u*p*h,this._w=c*l*h+u*p*d):"YZX"===a?(this._x=u*l*h+c*p*d,this._y=c*p*h+u*l*d,this._z=c*l*d-u*p*h,this._w=c*l*h-u*p*d):"XZY"===a&&(this._x=u*l*h-c*p*d,this._y=c*p*h-u*l*d,this._z=c*l*d+u*p*h,this._w=c*l*h+u*p*d),!1!==t&&this._onChangeCallback(),this},setFromAxisAngle:function(e,t){var n=t/2,i=Math.sin(n);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(n),this._onChangeCallback(),this},setFromRotationMatrix:function(e){var t,n=e.elements,i=n[0],r=n[4],a=n[8],o=n[1],s=n[5],c=n[9],l=n[2],h=n[6],u=n[10],p=i+s+u;return p>0?(t=.5/Math.sqrt(p+1),this._w=.25/t,this._x=(h-c)*t,this._y=(a-l)*t,this._z=(o-r)*t):i>s&&i>u?(t=2*Math.sqrt(1+i-s-u),this._w=(h-c)/t,this._x=.25*t,this._y=(r+o)/t,this._z=(a+l)/t):s>u?(t=2*Math.sqrt(1+s-i-u),this._w=(a-l)/t,this._x=(r+o)/t,this._y=.25*t,this._z=(c+h)/t):(t=2*Math.sqrt(1+u-i-s),this._w=(o-r)/t,this._x=(a+l)/t,this._y=(c+h)/t,this._z=.25*t),this._onChangeCallback(),this},setFromUnitVectors:function(e,t){var n=e.dot(t)+1;return n<1e-6?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()},angleTo:function(e){return 2*Math.acos(Math.abs(Wt.clamp(this.dot(e),-1,1)))},rotateTowards:function(e,t){var n=this.angleTo(e);if(0===n)return this;var i=Math.min(1,t/n);return this.slerp(e,i),this},inverse:function(){return this.conjugate()},conjugate:function(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this},dot:function(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var e=this.length();return 0===e?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this},multiply:function(e,t){return void 0!==t?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(e,t)):this.multiplyQuaternions(this,e)},premultiply:function(e){return this.multiplyQuaternions(e,this)},multiplyQuaternions:function(e,t){var n=e._x,i=e._y,r=e._z,a=e._w,o=t._x,s=t._y,c=t._z,l=t._w;return this._x=n*l+a*o+i*c-r*s,this._y=i*l+a*s+r*o-n*c,this._z=r*l+a*c+n*s-i*o,this._w=a*l-n*o-i*s-r*c,this._onChangeCallback(),this},slerp:function(e,t){if(0===t)return this;if(1===t)return this.copy(e);var n=this._x,i=this._y,r=this._z,a=this._w,o=a*e._w+n*e._x+i*e._y+r*e._z;if(o<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,o=-o):this.copy(e),o>=1)return this._w=a,this._x=n,this._y=i,this._z=r,this;var s=1-o*o;if(s<=Number.EPSILON){var c=1-t;return this._w=c*a+t*this._w,this._x=c*n+t*this._x,this._y=c*i+t*this._y,this._z=c*r+t*this._z,this.normalize(),this._onChangeCallback(),this}var l=Math.sqrt(s),h=Math.atan2(l,o),u=Math.sin((1-t)*h)/l,p=Math.sin(t*h)/l;return this._w=a*u+this._w*p,this._x=n*u+this._x*p,this._y=i*u+this._y*p,this._z=r*u+this._z*p,this._onChangeCallback(),this},equals:function(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w},fromArray:function(e,t){return void 0===t&&(t=0),this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e},_onChange:function(e){return this._onChangeCallback=e,this},_onChangeCallback:function(){}});var tn=new rn,nn=new en;function rn(e,t,n){this.x=e||0,this.y=t||0,this.z=n||0}Object.assign(rn.prototype,{isVector3:!0,set:function(e,t,n){return this.x=e,this.y=t,this.z=n,this},setScalar:function(e){return this.x=e,this.y=e,this.z=e,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setZ:function(e){return this.z=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(e){return this.x=e.x,this.y=e.y,this.z=e.z,this},add:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this)},addScalar:function(e){return this.x+=e,this.y+=e,this.z+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this},addScaledVector:function(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this},sub:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this)},subScalar:function(e){return this.x-=e,this.y-=e,this.z-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this},multiply:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(e,t)):(this.x*=e.x,this.y*=e.y,this.z*=e.z,this)},multiplyScalar:function(e){return this.x*=e,this.y*=e,this.z*=e,this},multiplyVectors:function(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this},applyEuler:function(e){return e&&e.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(nn.setFromEuler(e))},applyAxisAngle:function(e,t){return this.applyQuaternion(nn.setFromAxisAngle(e,t))},applyMatrix3:function(e){var t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6]*i,this.y=r[1]*t+r[4]*n+r[7]*i,this.z=r[2]*t+r[5]*n+r[8]*i,this},applyNormalMatrix:function(e){return this.applyMatrix3(e).normalize()},applyMatrix4:function(e){var t=this.x,n=this.y,i=this.z,r=e.elements,a=1/(r[3]*t+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*t+r[4]*n+r[8]*i+r[12])*a,this.y=(r[1]*t+r[5]*n+r[9]*i+r[13])*a,this.z=(r[2]*t+r[6]*n+r[10]*i+r[14])*a,this},applyQuaternion:function(e){var t=this.x,n=this.y,i=this.z,r=e.x,a=e.y,o=e.z,s=e.w,c=s*t+a*i-o*n,l=s*n+o*t-r*i,h=s*i+r*n-a*t,u=-r*t-a*n-o*i;return this.x=c*s+u*-r+l*-o-h*-a,this.y=l*s+u*-a+h*-r-c*-o,this.z=h*s+u*-o+c*-a-l*-r,this},project:function(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)},unproject:function(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)},transformDirection:function(e){var t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[4]*n+r[8]*i,this.y=r[1]*t+r[5]*n+r[9]*i,this.z=r[2]*t+r[6]*n+r[10]*i,this.normalize()},divide:function(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this},divideScalar:function(e){return this.multiplyScalar(1/e)},min:function(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this},max:function(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this},clamp:function(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this},clampScalar:function(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this},clampLength:function(e,t){var n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(e,Math.min(t,n)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},dot:function(e){return this.x*e.x+this.y*e.y+this.z*e.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(e){return this.normalize().multiplyScalar(e)},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this},lerpVectors:function(e,t,n){return this.subVectors(t,e).multiplyScalar(n).add(e)},cross:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(e,t)):this.crossVectors(this,e)},crossVectors:function(e,t){var n=e.x,i=e.y,r=e.z,a=t.x,o=t.y,s=t.z;return this.x=i*s-r*o,this.y=r*a-n*s,this.z=n*o-i*a,this},projectOnVector:function(e){var t=e.lengthSq();if(0===t)return this.set(0,0,0);var n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)},projectOnPlane:function(e){return tn.copy(this).projectOnVector(e),this.sub(tn)},reflect:function(e){return this.sub(tn.copy(e).multiplyScalar(2*this.dot(e)))},angleTo:function(e){var t=Math.sqrt(this.lengthSq()*e.lengthSq());if(0===t)return Math.PI/2;var n=this.dot(e)/t;return Math.acos(Wt.clamp(n,-1,1))},distanceTo:function(e){return Math.sqrt(this.distanceToSquared(e))},distanceToSquared:function(e){var t=this.x-e.x,n=this.y-e.y,i=this.z-e.z;return t*t+n*n+i*i},manhattanDistanceTo:function(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)},setFromSpherical:function(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)},setFromSphericalCoords:function(e,t,n){var i=Math.sin(t)*e;return this.x=i*Math.sin(n),this.y=Math.cos(t)*e,this.z=i*Math.cos(n),this},setFromCylindrical:function(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)},setFromCylindricalCoords:function(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this},setFromMatrixPosition:function(e){var t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this},setFromMatrixScale:function(e){var t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=i,this},setFromMatrixColumn:function(e,t){return this.fromArray(e.elements,4*t)},setFromMatrix3Column:function(e,t){return this.fromArray(e.elements,3*t)},equals:function(e){return e.x===this.x&&e.y===this.y&&e.z===this.z},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this.z=e[t+2],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e},fromBufferAttribute:function(e,t,n){return void 0!==n&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}});var an=new rn,on=new pn,sn=new rn(0,0,0),cn=new rn(1,1,1),ln=new rn,hn=new rn,un=new rn;function pn(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}Object.assign(pn.prototype,{isMatrix4:!0,set:function(e,t,n,i,r,a,o,s,c,l,h,u,p,d,f,m){var g=this.elements;return g[0]=e,g[4]=t,g[8]=n,g[12]=i,g[1]=r,g[5]=a,g[9]=o,g[13]=s,g[2]=c,g[6]=l,g[10]=h,g[14]=u,g[3]=p,g[7]=d,g[11]=f,g[15]=m,this},identity:function(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this},clone:function(){return(new pn).fromArray(this.elements)},copy:function(e){var t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],this},copyPosition:function(e){var t=this.elements,n=e.elements;return t[12]=n[12],t[13]=n[13],t[14]=n[14],this},extractBasis:function(e,t,n){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this},makeBasis:function(e,t,n){return this.set(e.x,t.x,n.x,0,e.y,t.y,n.y,0,e.z,t.z,n.z,0,0,0,0,1),this},extractRotation:function(e){var t=this.elements,n=e.elements,i=1/an.setFromMatrixColumn(e,0).length(),r=1/an.setFromMatrixColumn(e,1).length(),a=1/an.setFromMatrixColumn(e,2).length();return t[0]=n[0]*i,t[1]=n[1]*i,t[2]=n[2]*i,t[3]=0,t[4]=n[4]*r,t[5]=n[5]*r,t[6]=n[6]*r,t[7]=0,t[8]=n[8]*a,t[9]=n[9]*a,t[10]=n[10]*a,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this},makeRotationFromEuler:function(e){e&&e.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var t=this.elements,n=e.x,i=e.y,r=e.z,a=Math.cos(n),o=Math.sin(n),s=Math.cos(i),c=Math.sin(i),l=Math.cos(r),h=Math.sin(r);if("XYZ"===e.order){var u=a*l,p=a*h,d=o*l,f=o*h;t[0]=s*l,t[4]=-s*h,t[8]=c,t[1]=p+d*c,t[5]=u-f*c,t[9]=-o*s,t[2]=f-u*c,t[6]=d+p*c,t[10]=a*s}else if("YXZ"===e.order){var m=s*l,g=s*h,v=c*l,y=c*h;t[0]=m+y*o,t[4]=v*o-g,t[8]=a*c,t[1]=a*h,t[5]=a*l,t[9]=-o,t[2]=g*o-v,t[6]=y+m*o,t[10]=a*s}else if("ZXY"===e.order){m=s*l,g=s*h,v=c*l,y=c*h;t[0]=m-y*o,t[4]=-a*h,t[8]=v+g*o,t[1]=g+v*o,t[5]=a*l,t[9]=y-m*o,t[2]=-a*c,t[6]=o,t[10]=a*s}else if("ZYX"===e.order){u=a*l,p=a*h,d=o*l,f=o*h;t[0]=s*l,t[4]=d*c-p,t[8]=u*c+f,t[1]=s*h,t[5]=f*c+u,t[9]=p*c-d,t[2]=-c,t[6]=o*s,t[10]=a*s}else if("YZX"===e.order){var x=a*s,b=a*c,_=o*s,w=o*c;t[0]=s*l,t[4]=w-x*h,t[8]=_*h+b,t[1]=h,t[5]=a*l,t[9]=-o*l,t[2]=-c*l,t[6]=b*h+_,t[10]=x-w*h}else if("XZY"===e.order){x=a*s,b=a*c,_=o*s,w=o*c;t[0]=s*l,t[4]=-h,t[8]=c*l,t[1]=x*h+w,t[5]=a*l,t[9]=b*h-_,t[2]=_*h-b,t[6]=o*l,t[10]=w*h+x}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this},makeRotationFromQuaternion:function(e){return this.compose(sn,e,cn)},lookAt:function(e,t,n){var i=this.elements;return un.subVectors(e,t),0===un.lengthSq()&&(un.z=1),un.normalize(),ln.crossVectors(n,un),0===ln.lengthSq()&&(1===Math.abs(n.z)?un.x+=1e-4:un.z+=1e-4,un.normalize(),ln.crossVectors(n,un)),ln.normalize(),hn.crossVectors(un,ln),i[0]=ln.x,i[4]=hn.x,i[8]=un.x,i[1]=ln.y,i[5]=hn.y,i[9]=un.y,i[2]=ln.z,i[6]=hn.z,i[10]=un.z,this},multiply:function(e,t){return void 0!==t?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(e,t)):this.multiplyMatrices(this,e)},premultiply:function(e){return this.multiplyMatrices(e,this)},multiplyMatrices:function(e,t){var n=e.elements,i=t.elements,r=this.elements,a=n[0],o=n[4],s=n[8],c=n[12],l=n[1],h=n[5],u=n[9],p=n[13],d=n[2],f=n[6],m=n[10],g=n[14],v=n[3],y=n[7],x=n[11],b=n[15],_=i[0],w=i[4],M=i[8],S=i[12],T=i[1],E=i[5],A=i[9],L=i[13],R=i[2],P=i[6],C=i[10],O=i[14],D=i[3],I=i[7],N=i[11],B=i[15];return r[0]=a*_+o*T+s*R+c*D,r[4]=a*w+o*E+s*P+c*I,r[8]=a*M+o*A+s*C+c*N,r[12]=a*S+o*L+s*O+c*B,r[1]=l*_+h*T+u*R+p*D,r[5]=l*w+h*E+u*P+p*I,r[9]=l*M+h*A+u*C+p*N,r[13]=l*S+h*L+u*O+p*B,r[2]=d*_+f*T+m*R+g*D,r[6]=d*w+f*E+m*P+g*I,r[10]=d*M+f*A+m*C+g*N,r[14]=d*S+f*L+m*O+g*B,r[3]=v*_+y*T+x*R+b*D,r[7]=v*w+y*E+x*P+b*I,r[11]=v*M+y*A+x*C+b*N,r[15]=v*S+y*L+x*O+b*B,this},multiplyScalar:function(e){var t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this},determinant:function(){var e=this.elements,t=e[0],n=e[4],i=e[8],r=e[12],a=e[1],o=e[5],s=e[9],c=e[13],l=e[2],h=e[6],u=e[10],p=e[14];return e[3]*(+r*s*h-i*c*h-r*o*u+n*c*u+i*o*p-n*s*p)+e[7]*(+t*s*p-t*c*u+r*a*u-i*a*p+i*c*l-r*s*l)+e[11]*(+t*c*h-t*o*p-r*a*h+n*a*p+r*o*l-n*c*l)+e[15]*(-i*o*l-t*s*h+t*o*u+i*a*h-n*a*u+n*s*l)},transpose:function(){var e,t=this.elements;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this},setPosition:function(e,t,n){var i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=t,i[14]=n),this},getInverse:function(e,t){var n=this.elements,i=e.elements,r=i[0],a=i[1],o=i[2],s=i[3],c=i[4],l=i[5],h=i[6],u=i[7],p=i[8],d=i[9],f=i[10],m=i[11],g=i[12],v=i[13],y=i[14],x=i[15],b=d*y*u-v*f*u+v*h*m-l*y*m-d*h*x+l*f*x,_=g*f*u-p*y*u-g*h*m+c*y*m+p*h*x-c*f*x,w=p*v*u-g*d*u+g*l*m-c*v*m-p*l*x+c*d*x,M=g*d*h-p*v*h-g*l*f+c*v*f+p*l*y-c*d*y,S=r*b+a*_+o*w+s*M;if(0===S){var T="THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0";if(!0===t)throw new Error(T);return console.warn(T),this.identity()}var E=1/S;return n[0]=b*E,n[1]=(v*f*s-d*y*s-v*o*m+a*y*m+d*o*x-a*f*x)*E,n[2]=(l*y*s-v*h*s+v*o*u-a*y*u-l*o*x+a*h*x)*E,n[3]=(d*h*s-l*f*s-d*o*u+a*f*u+l*o*m-a*h*m)*E,n[4]=_*E,n[5]=(p*y*s-g*f*s+g*o*m-r*y*m-p*o*x+r*f*x)*E,n[6]=(g*h*s-c*y*s-g*o*u+r*y*u+c*o*x-r*h*x)*E,n[7]=(c*f*s-p*h*s+p*o*u-r*f*u-c*o*m+r*h*m)*E,n[8]=w*E,n[9]=(g*d*s-p*v*s-g*a*m+r*v*m+p*a*x-r*d*x)*E,n[10]=(c*v*s-g*l*s+g*a*u-r*v*u-c*a*x+r*l*x)*E,n[11]=(p*l*s-c*d*s-p*a*u+r*d*u+c*a*m-r*l*m)*E,n[12]=M*E,n[13]=(p*v*o-g*d*o+g*a*f-r*v*f-p*a*y+r*d*y)*E,n[14]=(g*l*o-c*v*o-g*a*h+r*v*h+c*a*y-r*l*y)*E,n[15]=(c*d*o-p*l*o+p*a*h-r*d*h-c*a*f+r*l*f)*E,this},scale:function(e){var t=this.elements,n=e.x,i=e.y,r=e.z;return t[0]*=n,t[4]*=i,t[8]*=r,t[1]*=n,t[5]*=i,t[9]*=r,t[2]*=n,t[6]*=i,t[10]*=r,t[3]*=n,t[7]*=i,t[11]*=r,this},getMaxScaleOnAxis:function(){var e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],n=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,n,i))},makeTranslation:function(e,t,n){return this.set(1,0,0,e,0,1,0,t,0,0,1,n,0,0,0,1),this},makeRotationX:function(e){var t=Math.cos(e),n=Math.sin(e);return this.set(1,0,0,0,0,t,-n,0,0,n,t,0,0,0,0,1),this},makeRotationY:function(e){var t=Math.cos(e),n=Math.sin(e);return this.set(t,0,n,0,0,1,0,0,-n,0,t,0,0,0,0,1),this},makeRotationZ:function(e){var t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,0,n,t,0,0,0,0,1,0,0,0,0,1),this},makeRotationAxis:function(e,t){var n=Math.cos(t),i=Math.sin(t),r=1-n,a=e.x,o=e.y,s=e.z,c=r*a,l=r*o;return this.set(c*a+n,c*o-i*s,c*s+i*o,0,c*o+i*s,l*o+n,l*s-i*a,0,c*s-i*o,l*s+i*a,r*s*s+n,0,0,0,0,1),this},makeScale:function(e,t,n){return this.set(e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1),this},makeShear:function(e,t,n){return this.set(1,t,n,0,e,1,n,0,e,t,1,0,0,0,0,1),this},compose:function(e,t,n){var i=this.elements,r=t._x,a=t._y,o=t._z,s=t._w,c=r+r,l=a+a,h=o+o,u=r*c,p=r*l,d=r*h,f=a*l,m=a*h,g=o*h,v=s*c,y=s*l,x=s*h,b=n.x,_=n.y,w=n.z;return i[0]=(1-(f+g))*b,i[1]=(p+x)*b,i[2]=(d-y)*b,i[3]=0,i[4]=(p-x)*_,i[5]=(1-(u+g))*_,i[6]=(m+v)*_,i[7]=0,i[8]=(d+y)*w,i[9]=(m-v)*w,i[10]=(1-(u+f))*w,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this},decompose:function(e,t,n){var i=this.elements,r=an.set(i[0],i[1],i[2]).length(),a=an.set(i[4],i[5],i[6]).length(),o=an.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),e.x=i[12],e.y=i[13],e.z=i[14],on.copy(this);var s=1/r,c=1/a,l=1/o;return on.elements[0]*=s,on.elements[1]*=s,on.elements[2]*=s,on.elements[4]*=c,on.elements[5]*=c,on.elements[6]*=c,on.elements[8]*=l,on.elements[9]*=l,on.elements[10]*=l,t.setFromRotationMatrix(on),n.x=r,n.y=a,n.z=o,this},makePerspective:function(e,t,n,i,r,a){void 0===a&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var o=this.elements,s=2*r/(t-e),c=2*r/(n-i),l=(t+e)/(t-e),h=(n+i)/(n-i),u=-(a+r)/(a-r),p=-2*a*r/(a-r);return o[0]=s,o[4]=0,o[8]=l,o[12]=0,o[1]=0,o[5]=c,o[9]=h,o[13]=0,o[2]=0,o[6]=0,o[10]=u,o[14]=p,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this},makeOrthographic:function(e,t,n,i,r,a){var o=this.elements,s=1/(t-e),c=1/(n-i),l=1/(a-r),h=(t+e)*s,u=(n+i)*c,p=(a+r)*l;return o[0]=2*s,o[4]=0,o[8]=0,o[12]=-h,o[1]=0,o[5]=2*c,o[9]=0,o[13]=-u,o[2]=0,o[6]=0,o[10]=-2*l,o[14]=-p,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this},equals:function(e){for(var t=this.elements,n=e.elements,i=0;i<16;i++)if(t[i]!==n[i])return!1;return!0},fromArray:function(e,t){void 0===t&&(t=0);for(var n=0;n<16;n++)this.elements[n]=e[n+t];return this},toArray:function(e,t){void 0===e&&(e=[]),void 0===t&&(t=0);var n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e[t+9]=n[9],e[t+10]=n[10],e[t+11]=n[11],e[t+12]=n[12],e[t+13]=n[13],e[t+14]=n[14],e[t+15]=n[15],e}});var dn=new pn,fn=new en;function mn(e,t,n,i){this._x=e||0,this._y=t||0,this._z=n||0,this._order=i||mn.DefaultOrder}function gn(){this.mask=1}mn.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"],mn.DefaultOrder="XYZ",Object.defineProperties(mn.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._onChangeCallback()}},y:{get:function(){return this._y},set:function(e){this._y=e,this._onChangeCallback()}},z:{get:function(){return this._z},set:function(e){this._z=e,this._onChangeCallback()}},order:{get:function(){return this._order},set:function(e){this._order=e,this._onChangeCallback()}}}),Object.assign(mn.prototype,{isEuler:!0,set:function(e,t,n,i){return this._x=e,this._y=t,this._z=n,this._order=i||this._order,this._onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this},setFromRotationMatrix:function(e,t,n){var i=Wt.clamp,r=e.elements,a=r[0],o=r[4],s=r[8],c=r[1],l=r[5],h=r[9],u=r[2],p=r[6],d=r[10];return"XYZ"===(t=t||this._order)?(this._y=Math.asin(i(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(-h,d),this._z=Math.atan2(-o,a)):(this._x=Math.atan2(p,l),this._z=0)):"YXZ"===t?(this._x=Math.asin(-i(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(s,d),this._z=Math.atan2(c,l)):(this._y=Math.atan2(-u,a),this._z=0)):"ZXY"===t?(this._x=Math.asin(i(p,-1,1)),Math.abs(p)<.9999999?(this._y=Math.atan2(-u,d),this._z=Math.atan2(-o,l)):(this._y=0,this._z=Math.atan2(c,a))):"ZYX"===t?(this._y=Math.asin(-i(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(p,d),this._z=Math.atan2(c,a)):(this._x=0,this._z=Math.atan2(-o,l))):"YZX"===t?(this._z=Math.asin(i(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(-h,l),this._y=Math.atan2(-u,a)):(this._x=0,this._y=Math.atan2(s,d))):"XZY"===t?(this._z=Math.asin(-i(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(p,l),this._y=Math.atan2(s,a)):(this._x=Math.atan2(-h,d),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+t),this._order=t,!1!==n&&this._onChangeCallback(),this},setFromQuaternion:function(e,t,n){return dn.makeRotationFromQuaternion(e),this.setFromRotationMatrix(dn,t,n)},setFromVector3:function(e,t){return this.set(e.x,e.y,e.z,t||this._order)},reorder:function(e){return fn.setFromEuler(this),this.setFromQuaternion(fn,e)},equals:function(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order},fromArray:function(e){return this._x=e[0],this._y=e[1],this._z=e[2],void 0!==e[3]&&(this._order=e[3]),this._onChangeCallback(),this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e},toVector3:function(e){return e?e.set(this._x,this._y,this._z):new rn(this._x,this._y,this._z)},_onChange:function(e){return this._onChangeCallback=e,this},_onChangeCallback:function(){}}),Object.assign(gn.prototype,{set:function(e){this.mask=1<1){for(var t=0;t1){for(var t=0;t0){i.children=[];for(s=0;s0&&(n.geometries=u),p.length>0&&(n.materials=p),d.length>0&&(n.textures=d),f.length>0&&(n.images=f),o.length>0&&(n.shapes=o)}return n.object=i,n;function m(e){var t=[];for(var n in e){var i=e[n];delete i.metadata,t.push(i)}return t}},clone:function(e){return(new this.constructor).copy(this,e)},copy:function(e,t){if(void 0===t&&(t=!0),this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),!0===t)for(var n=0;ns)return!1}return!0}Object.assign(Wn.prototype,{isBox3:!0,set:function(e,t){return this.min.copy(e),this.max.copy(t),this},setFromArray:function(e){for(var t=1/0,n=1/0,i=1/0,r=-1/0,a=-1/0,o=-1/0,s=0,c=e.length;sr&&(r=l),h>a&&(a=h),u>o&&(o=u)}return this.min.set(t,n,i),this.max.set(r,a,o),this},setFromBufferAttribute:function(e){for(var t=1/0,n=1/0,i=1/0,r=-1/0,a=-1/0,o=-1/0,s=0,c=e.count;sr&&(r=l),h>a&&(a=h),u>o&&(o=u)}return this.min.set(t,n,i),this.max.set(r,a,o),this},setFromPoints:function(e){this.makeEmpty();for(var t=0,n=e.length;tthis.max.x||e.ythis.max.y||e.zthis.max.z)},containsBox:function(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z},getParameter:function(e,t){return void 0===t&&(console.warn("THREE.Box3: .getParameter() target is now required"),t=new rn),t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(e){return!(e.max.xthis.max.x||e.max.ythis.max.y||e.max.zthis.max.z)},intersectsSphere:function(e){return this.clampPoint(e.center,Dn),Dn.distanceToSquared(e.center)<=e.radius*e.radius},intersectsPlane:function(e){var t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant},intersectsTriangle:function(e){if(this.isEmpty())return!1;this.getCenter(Hn),Vn.subVectors(this.max,Hn),Nn.subVectors(e.a,Hn),Bn.subVectors(e.b,Hn),zn.subVectors(e.c,Hn),Fn.subVectors(Bn,Nn),Un.subVectors(zn,Bn),Gn.subVectors(Nn,zn);var t=[0,-Fn.z,Fn.y,0,-Un.z,Un.y,0,-Gn.z,Gn.y,Fn.z,0,-Fn.x,Un.z,0,-Un.x,Gn.z,0,-Gn.x,-Fn.y,Fn.x,0,-Un.y,Un.x,0,-Gn.y,Gn.x,0];return!!qn(t,Nn,Bn,zn,Vn)&&(!!qn(t=[1,0,0,0,1,0,0,0,1],Nn,Bn,zn,Vn)&&(kn.crossVectors(Fn,Un),qn(t=[kn.x,kn.y,kn.z],Nn,Bn,zn,Vn)))},clampPoint:function(e,t){return void 0===t&&(console.warn("THREE.Box3: .clampPoint() target is now required"),t=new rn),t.copy(e).clamp(this.min,this.max)},distanceToPoint:function(e){return Dn.copy(e).clamp(this.min,this.max).sub(e).length()},getBoundingSphere:function(e){return void 0===e&&console.error("THREE.Box3: .getBoundingSphere() target is now required"),this.getCenter(e.center),e.radius=.5*this.getSize(Dn).length(),e},intersect:function(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this},union:function(e){return this.min.min(e.min),this.max.max(e.max),this},applyMatrix4:function(e){return this.isEmpty()?this:(On[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),On[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),On[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),On[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),On[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),On[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),On[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),On[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(On),this)},translate:function(e){return this.min.add(e),this.max.add(e),this},equals:function(e){return e.min.equals(this.min)&&e.max.equals(this.max)}});var Xn=new Wn;function Yn(e,t){this.center=void 0!==e?e:new rn,this.radius=void 0!==t?t:0}Object.assign(Yn.prototype,{set:function(e,t){return this.center.copy(e),this.radius=t,this},setFromPoints:function(e,t){var n=this.center;void 0!==t?n.copy(t):Xn.setFromPoints(e).getCenter(n);for(var i=0,r=0,a=e.length;rthis.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t},getBoundingBox:function(e){return void 0===e&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),e=new Wn),e.set(this.center,this.center),e.expandByScalar(this.radius),e},applyMatrix4:function(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this},translate:function(e){return this.center.add(e),this},equals:function(e){return e.center.equals(this.center)&&e.radius===this.radius}});var Zn=new rn,Jn=new rn,Qn=new rn,Kn=new rn,$n=new rn,ei=new rn,ti=new rn;function ni(e,t){this.origin=void 0!==e?e:new rn,this.direction=void 0!==t?t:new rn(0,0,-1)}Object.assign(ni.prototype,{set:function(e,t){return this.origin.copy(e),this.direction.copy(t),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this},at:function(e,t){return void 0===t&&(console.warn("THREE.Ray: .at() target is now required"),t=new rn),t.copy(this.direction).multiplyScalar(e).add(this.origin)},lookAt:function(e){return this.direction.copy(e).sub(this.origin).normalize(),this},recast:function(e){return this.origin.copy(this.at(e,Zn)),this},closestPointToPoint:function(e,t){void 0===t&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),t=new rn),t.subVectors(e,this.origin);var n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.direction).multiplyScalar(n).add(this.origin)},distanceToPoint:function(e){return Math.sqrt(this.distanceSqToPoint(e))},distanceSqToPoint:function(e){var t=Zn.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(Zn.copy(this.direction).multiplyScalar(t).add(this.origin),Zn.distanceToSquared(e))},distanceSqToSegment:function(e,t,n,i){Jn.copy(e).add(t).multiplyScalar(.5),Qn.copy(t).sub(e).normalize(),Kn.copy(this.origin).sub(Jn);var r,a,o,s,c=.5*e.distanceTo(t),l=-this.direction.dot(Qn),h=Kn.dot(this.direction),u=-Kn.dot(Qn),p=Kn.lengthSq(),d=Math.abs(1-l*l);if(d>0)if(a=l*h-u,s=c*d,(r=l*u-h)>=0)if(a>=-s)if(a<=s){var f=1/d;o=(r*=f)*(r+l*(a*=f)+2*h)+a*(l*r+a+2*u)+p}else a=c,o=-(r=Math.max(0,-(l*a+h)))*r+a*(a+2*u)+p;else a=-c,o=-(r=Math.max(0,-(l*a+h)))*r+a*(a+2*u)+p;else a<=-s?o=-(r=Math.max(0,-(-l*c+h)))*r+(a=r>0?-c:Math.min(Math.max(-c,-u),c))*(a+2*u)+p:a<=s?(r=0,o=(a=Math.min(Math.max(-c,-u),c))*(a+2*u)+p):o=-(r=Math.max(0,-(l*c+h)))*r+(a=r>0?c:Math.min(Math.max(-c,-u),c))*(a+2*u)+p;else a=l>0?-c:c,o=-(r=Math.max(0,-(l*a+h)))*r+a*(a+2*u)+p;return n&&n.copy(this.direction).multiplyScalar(r).add(this.origin),i&&i.copy(Qn).multiplyScalar(a).add(Jn),o},intersectSphere:function(e,t){Zn.subVectors(e.center,this.origin);var n=Zn.dot(this.direction),i=Zn.dot(Zn)-n*n,r=e.radius*e.radius;if(i>r)return null;var a=Math.sqrt(r-i),o=n-a,s=n+a;return o<0&&s<0?null:o<0?this.at(s,t):this.at(o,t)},intersectsSphere:function(e){return this.distanceSqToPoint(e.center)<=e.radius*e.radius},distanceToPlane:function(e){var t=e.normal.dot(this.direction);if(0===t)return 0===e.distanceToPoint(this.origin)?0:null;var n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null},intersectPlane:function(e,t){var n=this.distanceToPlane(e);return null===n?null:this.at(n,t)},intersectsPlane:function(e){var t=e.distanceToPoint(this.origin);return 0===t||e.normal.dot(this.direction)*t<0},intersectBox:function(e,t){var n,i,r,a,o,s,c=1/this.direction.x,l=1/this.direction.y,h=1/this.direction.z,u=this.origin;return c>=0?(n=(e.min.x-u.x)*c,i=(e.max.x-u.x)*c):(n=(e.max.x-u.x)*c,i=(e.min.x-u.x)*c),l>=0?(r=(e.min.y-u.y)*l,a=(e.max.y-u.y)*l):(r=(e.max.y-u.y)*l,a=(e.min.y-u.y)*l),n>a||r>i?null:((r>n||n!=n)&&(n=r),(a=0?(o=(e.min.z-u.z)*h,s=(e.max.z-u.z)*h):(o=(e.max.z-u.z)*h,s=(e.min.z-u.z)*h),n>s||o>i?null:((o>n||n!=n)&&(n=o),(s=0?n:i,t)))},intersectsBox:function(e){return null!==this.intersectBox(e,Zn)},intersectTriangle:function(e,t,n,i,r){$n.subVectors(t,e),ei.subVectors(n,e),ti.crossVectors($n,ei);var a,o=this.direction.dot(ti);if(o>0){if(i)return null;a=1}else{if(!(o<0))return null;a=-1,o=-o}Kn.subVectors(this.origin,e);var s=a*this.direction.dot(ei.crossVectors(Kn,ei));if(s<0)return null;var c=a*this.direction.dot($n.cross(Kn));if(c<0)return null;if(s+c>o)return null;var l=-a*Kn.dot(ti);return l<0?null:this.at(l/o,r)},applyMatrix4:function(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this},equals:function(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}});var ii=new rn,ri=new rn,ai=new Xt;function oi(e,t){this.normal=void 0!==e?e:new rn(1,0,0),this.constant=void 0!==t?t:0}Object.assign(oi.prototype,{isPlane:!0,set:function(e,t){return this.normal.copy(e),this.constant=t,this},setComponents:function(e,t,n,i){return this.normal.set(e,t,n),this.constant=i,this},setFromNormalAndCoplanarPoint:function(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this},setFromCoplanarPoints:function(e,t,n){var i=ii.subVectors(n,t).cross(ri.subVectors(e,t)).normalize();return this.setFromNormalAndCoplanarPoint(i,e),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.normal.copy(e.normal),this.constant=e.constant,this},normalize:function(){var e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this},negate:function(){return this.constant*=-1,this.normal.negate(),this},distanceToPoint:function(e){return this.normal.dot(e)+this.constant},distanceToSphere:function(e){return this.distanceToPoint(e.center)-e.radius},projectPoint:function(e,t){return void 0===t&&(console.warn("THREE.Plane: .projectPoint() target is now required"),t=new rn),t.copy(this.normal).multiplyScalar(-this.distanceToPoint(e)).add(e)},intersectLine:function(e,t){void 0===t&&(console.warn("THREE.Plane: .intersectLine() target is now required"),t=new rn);var n=e.delta(ii),i=this.normal.dot(n);if(0===i)return 0===this.distanceToPoint(e.start)?t.copy(e.start):void 0;var r=-(e.start.dot(this.normal)+this.constant)/i;return r<0||r>1?void 0:t.copy(n).multiplyScalar(r).add(e.start)},intersectsLine:function(e){var t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0},intersectsBox:function(e){return e.intersectsPlane(this)},intersectsSphere:function(e){return e.intersectsPlane(this)},coplanarPoint:function(e){return void 0===e&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),e=new rn),e.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(e,t){var n=t||ai.getNormalMatrix(e),i=this.coplanarPoint(ii).applyMatrix4(e),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this},translate:function(e){return this.constant-=e.dot(this.normal),this},equals:function(e){return e.normal.equals(this.normal)&&e.constant===this.constant}});var si=new rn,ci=new rn,li=new rn,hi=new rn,ui=new rn,pi=new rn,di=new rn,fi=new rn,mi=new rn,gi=new rn;function vi(e,t,n){this.a=void 0!==e?e:new rn,this.b=void 0!==t?t:new rn,this.c=void 0!==n?n:new rn}Object.assign(vi,{getNormal:function(e,t,n,i){void 0===i&&(console.warn("THREE.Triangle: .getNormal() target is now required"),i=new rn),i.subVectors(n,t),si.subVectors(e,t),i.cross(si);var r=i.lengthSq();return r>0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)},getBarycoord:function(e,t,n,i,r){si.subVectors(i,t),ci.subVectors(n,t),li.subVectors(e,t);var a=si.dot(si),o=si.dot(ci),s=si.dot(li),c=ci.dot(ci),l=ci.dot(li),h=a*c-o*o;if(void 0===r&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),r=new rn),0===h)return r.set(-2,-1,-1);var u=1/h,p=(c*s-o*l)*u,d=(a*l-o*s)*u;return r.set(1-p-d,d,p)},containsPoint:function(e,t,n,i){return vi.getBarycoord(e,t,n,i,hi),hi.x>=0&&hi.y>=0&&hi.x+hi.y<=1},getUV:function(e,t,n,i,r,a,o,s){return this.getBarycoord(e,t,n,i,hi),s.set(0,0),s.addScaledVector(r,hi.x),s.addScaledVector(a,hi.y),s.addScaledVector(o,hi.z),s},isFrontFacing:function(e,t,n,i){return si.subVectors(n,t),ci.subVectors(e,t),si.cross(ci).dot(i)<0}}),Object.assign(vi.prototype,{set:function(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this},setFromPointsAndIndices:function(e,t,n,i){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[i]),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this},getArea:function(){return si.subVectors(this.c,this.b),ci.subVectors(this.a,this.b),.5*si.cross(ci).length()},getMidpoint:function(e){return void 0===e&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),e=new rn),e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},getNormal:function(e){return vi.getNormal(this.a,this.b,this.c,e)},getPlane:function(e){return void 0===e&&(console.warn("THREE.Triangle: .getPlane() target is now required"),e=new oi),e.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(e,t){return vi.getBarycoord(e,this.a,this.b,this.c,t)},getUV:function(e,t,n,i,r){return vi.getUV(e,this.a,this.b,this.c,t,n,i,r)},containsPoint:function(e){return vi.containsPoint(e,this.a,this.b,this.c)},isFrontFacing:function(e){return vi.isFrontFacing(this.a,this.b,this.c,e)},intersectsBox:function(e){return e.intersectsTriangle(this)},closestPointToPoint:function(e,t){void 0===t&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),t=new rn);var n,i,r=this.a,a=this.b,o=this.c;ui.subVectors(a,r),pi.subVectors(o,r),fi.subVectors(e,r);var s=ui.dot(fi),c=pi.dot(fi);if(s<=0&&c<=0)return t.copy(r);mi.subVectors(e,a);var l=ui.dot(mi),h=pi.dot(mi);if(l>=0&&h<=l)return t.copy(a);var u=s*h-l*c;if(u<=0&&s>=0&&l<=0)return n=s/(s-l),t.copy(r).addScaledVector(ui,n);gi.subVectors(e,o);var p=ui.dot(gi),d=pi.dot(gi);if(d>=0&&p<=d)return t.copy(o);var f=p*c-s*d;if(f<=0&&c>=0&&d<=0)return i=c/(c-d),t.copy(r).addScaledVector(pi,i);var m=l*d-p*h;if(m<=0&&h-l>=0&&p-d>=0)return di.subVectors(o,a),i=(h-l)/(h-l+(p-d)),t.copy(a).addScaledVector(di,i);var g=1/(m+f+u);return n=f*g,i=u*g,t.copy(r).addScaledVector(ui,n).addScaledVector(pi,i)},equals:function(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}});var yi={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},xi={h:0,s:0,l:0},bi={h:0,s:0,l:0};function _i(e,t,n){return void 0===t&&void 0===n?this.set(e):this.setRGB(e,t,n)}function wi(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+6*(t-e)*(2/3-n):e}function Mi(e){return e<.04045?.0773993808*e:Math.pow(.9478672986*e+.0521327014,2.4)}function Si(e){return e<.0031308?12.92*e:1.055*Math.pow(e,.41666)-.055}function Ti(e,t,n,i,r,a){this.a=e,this.b=t,this.c=n,this.normal=i&&i.isVector3?i:new rn,this.vertexNormals=Array.isArray(i)?i:[],this.color=r&&r.isColor?r:new _i,this.vertexColors=Array.isArray(r)?r:[],this.materialIndex=void 0!==a?a:0}Object.assign(_i.prototype,{isColor:!0,r:1,g:1,b:1,set:function(e){return e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e),this},setScalar:function(e){return this.r=e,this.g=e,this.b=e,this},setHex:function(e){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(255&e)/255,this},setRGB:function(e,t,n){return this.r=e,this.g=t,this.b=n,this},setHSL:function(e,t,n){if(e=Wt.euclideanModulo(e,1),t=Wt.clamp(t,0,1),n=Wt.clamp(n,0,1),0===t)this.r=this.g=this.b=n;else{var i=n<=.5?n*(1+t):n+t-n*t,r=2*n-i;this.r=wi(r,i,e+1/3),this.g=wi(r,i,e),this.b=wi(r,i,e-1/3)}return this},setStyle:function(e){function t(t){void 0!==t&&parseFloat(t)<1&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}var n;if(n=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(e)){var i,r=n[1],a=n[2];switch(r){case"rgb":case"rgba":if(i=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(a))return this.r=Math.min(255,parseInt(i[1],10))/255,this.g=Math.min(255,parseInt(i[2],10))/255,this.b=Math.min(255,parseInt(i[3],10))/255,t(i[5]),this;if(i=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(a))return this.r=Math.min(100,parseInt(i[1],10))/100,this.g=Math.min(100,parseInt(i[2],10))/100,this.b=Math.min(100,parseInt(i[3],10))/100,t(i[5]),this;break;case"hsl":case"hsla":if(i=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(a)){var o=parseFloat(i[1])/360,s=parseInt(i[2],10)/100,c=parseInt(i[3],10)/100;return t(i[5]),this.setHSL(o,s,c)}}}else if(n=/^\#([A-Fa-f0-9]+)$/.exec(e)){var l=n[1],h=l.length;if(3===h)return this.r=parseInt(l.charAt(0)+l.charAt(0),16)/255,this.g=parseInt(l.charAt(1)+l.charAt(1),16)/255,this.b=parseInt(l.charAt(2)+l.charAt(2),16)/255,this;if(6===h)return this.r=parseInt(l.charAt(0)+l.charAt(1),16)/255,this.g=parseInt(l.charAt(2)+l.charAt(3),16)/255,this.b=parseInt(l.charAt(4)+l.charAt(5),16)/255,this}return e&&e.length>0?this.setColorName(e):this},setColorName:function(e){var t=yi[e];return void 0!==t?this.setHex(t):console.warn("THREE.Color: Unknown color "+e),this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(e){return this.r=e.r,this.g=e.g,this.b=e.b,this},copyGammaToLinear:function(e,t){return void 0===t&&(t=2),this.r=Math.pow(e.r,t),this.g=Math.pow(e.g,t),this.b=Math.pow(e.b,t),this},copyLinearToGamma:function(e,t){void 0===t&&(t=2);var n=t>0?1/t:1;return this.r=Math.pow(e.r,n),this.g=Math.pow(e.g,n),this.b=Math.pow(e.b,n),this},convertGammaToLinear:function(e){return this.copyGammaToLinear(this,e),this},convertLinearToGamma:function(e){return this.copyLinearToGamma(this,e),this},copySRGBToLinear:function(e){return this.r=Mi(e.r),this.g=Mi(e.g),this.b=Mi(e.b),this},copyLinearToSRGB:function(e){return this.r=Si(e.r),this.g=Si(e.g),this.b=Si(e.b),this},convertSRGBToLinear:function(){return this.copySRGBToLinear(this),this},convertLinearToSRGB:function(){return this.copyLinearToSRGB(this),this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(e){void 0===e&&(console.warn("THREE.Color: .getHSL() target is now required"),e={h:0,s:0,l:0});var t,n,i=this.r,r=this.g,a=this.b,o=Math.max(i,r,a),s=Math.min(i,r,a),c=(s+o)/2;if(s===o)t=0,n=0;else{var l=o-s;switch(n=c<=.5?l/(o+s):l/(2-o-s),o){case i:t=(r-a)/l+(r0&&(n.alphaTest=this.alphaTest),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(n.wireframe=this.wireframe),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),!0===this.morphTargets&&(n.morphTargets=!0),!0===this.morphNormals&&(n.morphNormals=!0),!0===this.skinning&&(n.skinning=!0),!1===this.visible&&(n.visible=!1),!1===this.toneMapped&&(n.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),t){var r=i(e.textures),a=i(e.images);r.length>0&&(n.textures=r),a.length>0&&(n.images=a)}return n},clone:function(){return(new this.constructor).copy(this)},copy:function(e){this.name=e.name,this.fog=e.fog,this.blending=e.blending,this.side=e.side,this.flatShading=e.flatShading,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;var t=e.clippingPlanes,n=null;if(null!==t){var i=t.length;n=new Array(i);for(var r=0;r!==i;++r)n[r]=t[r].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.premultipliedAlpha=e.premultipliedAlpha,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),Object.defineProperty(Ai.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Li.prototype=Object.create(Ai.prototype),Li.prototype.constructor=Li,Li.prototype.isMeshBasicMaterial=!0,Li.prototype.copy=function(e){return Ai.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this};var Ri=new rn;function Pi(e,t,n){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=e,this.itemSize=t,this.count=void 0!==e?e.length/t:0,this.normalized=!0===n,this.usage=Ut,this.updateRange={offset:0,count:-1},this.version=0}function Ci(e,t,n){Pi.call(this,new Int8Array(e),t,n)}function Oi(e,t,n){Pi.call(this,new Uint8Array(e),t,n)}function Di(e,t,n){Pi.call(this,new Uint8ClampedArray(e),t,n)}function Ii(e,t,n){Pi.call(this,new Int16Array(e),t,n)}function Ni(e,t,n){Pi.call(this,new Uint16Array(e),t,n)}function Bi(e,t,n){Pi.call(this,new Int32Array(e),t,n)}function zi(e,t,n){Pi.call(this,new Uint32Array(e),t,n)}function Fi(e,t,n){Pi.call(this,new Float32Array(e),t,n)}function Ui(e,t,n){Pi.call(this,new Float64Array(e),t,n)}function Gi(){this.vertices=[],this.normals=[],this.colors=[],this.uvs=[],this.uvs2=[],this.groups=[],this.morphTargets={},this.skinWeights=[],this.skinIndices=[],this.boundingBox=null,this.boundingSphere=null,this.verticesNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.uvsNeedUpdate=!1,this.groupsNeedUpdate=!1}function Hi(e){if(0===e.length)return-1/0;for(var t=e[0],n=1,i=e.length;nt&&(t=e[n]);return t}Object.defineProperty(Pi.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Object.assign(Pi.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},setUsage:function(e){return this.usage=e,this},copy:function(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this},copyAt:function(e,t,n){e*=this.itemSize,n*=t.itemSize;for(var i=0,r=this.itemSize;i0,o=r[1]&&r[1].length>0,s=e.morphTargets,c=s.length;if(c>0){t=[];for(var l=0;l0){h=[];for(l=0;l0&&0===n.length&&console.error("THREE.DirectGeometry: Faceless geometries are not supported.");for(l=0;l65535?zi:Ni)(e,1):this.index=e},getAttribute:function(e){return this.attributes[e]},setAttribute:function(e,t){return this.attributes[e]=t,this},deleteAttribute:function(e){return delete this.attributes[e],this},addGroup:function(e,t,n){this.groups.push({start:e,count:t,materialIndex:void 0!==n?n:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(e,t){this.drawRange.start=e,this.drawRange.count=t},applyMatrix4:function(e){var t=this.attributes.position;void 0!==t&&(t.applyMatrix4(e),t.needsUpdate=!0);var n=this.attributes.normal;if(void 0!==n){var i=(new Xt).getNormalMatrix(e);n.applyNormalMatrix(i),n.needsUpdate=!0}var r=this.attributes.tangent;return void 0!==r&&(r.transformDirection(e),r.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this},rotateX:function(e){return ki.makeRotationX(e),this.applyMatrix4(ki),this},rotateY:function(e){return ki.makeRotationY(e),this.applyMatrix4(ki),this},rotateZ:function(e){return ki.makeRotationZ(e),this.applyMatrix4(ki),this},translate:function(e,t,n){return ki.makeTranslation(e,t,n),this.applyMatrix4(ki),this},scale:function(e,t,n){return ki.makeScale(e,t,n),this.applyMatrix4(ki),this},lookAt:function(e){return ji.lookAt(e),ji.updateMatrix(),this.applyMatrix4(ji.matrix),this},center:function(){return this.computeBoundingBox(),this.boundingBox.getCenter(Wi).negate(),this.translate(Wi.x,Wi.y,Wi.z),this},setFromObject:function(e){var t=e.geometry;if(e.isPoints||e.isLine){var n=new Fi(3*t.vertices.length,3),i=new Fi(3*t.colors.length,3);if(this.setAttribute("position",n.copyVector3sArray(t.vertices)),this.setAttribute("color",i.copyColorsArray(t.colors)),t.lineDistances&&t.lineDistances.length===t.vertices.length){var r=new Fi(t.lineDistances.length,1);this.setAttribute("lineDistance",r.copyArray(t.lineDistances))}null!==t.boundingSphere&&(this.boundingSphere=t.boundingSphere.clone()),null!==t.boundingBox&&(this.boundingBox=t.boundingBox.clone())}else e.isMesh&&t&&t.isGeometry&&this.fromGeometry(t);return this},setFromPoints:function(e){for(var t=[],n=0,i=e.length;n0){var n=new Float32Array(3*e.normals.length);this.setAttribute("normal",new Pi(n,3).copyVector3sArray(e.normals))}if(e.colors.length>0){var i=new Float32Array(3*e.colors.length);this.setAttribute("color",new Pi(i,3).copyColorsArray(e.colors))}if(e.uvs.length>0){var r=new Float32Array(2*e.uvs.length);this.setAttribute("uv",new Pi(r,2).copyVector2sArray(e.uvs))}if(e.uvs2.length>0){var a=new Float32Array(2*e.uvs2.length);this.setAttribute("uv2",new Pi(a,2).copyVector2sArray(e.uvs2))}for(var o in this.groups=e.groups,e.morphTargets){for(var s=[],c=e.morphTargets[o],l=0,h=c.length;l0){var d=new Fi(4*e.skinIndices.length,4);this.setAttribute("skinIndex",d.copyVector4sArray(e.skinIndices))}if(e.skinWeights.length>0){var f=new Fi(4*e.skinWeights.length,4);this.setAttribute("skinWeight",f.copyVector4sArray(e.skinWeights))}return null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone()),this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Wn);var e=this.attributes.position,t=this.morphAttributes.position;if(void 0!==e){if(this.boundingBox.setFromBufferAttribute(e),t)for(var n=0,i=t.length;n0&&(e.userData=this.userData),void 0!==this.parameters){var t=this.parameters;for(var n in t)void 0!==t[n]&&(e[n]=t[n]);return e}e.data={attributes:{}};var i=this.index;null!==i&&(e.data.index={type:i.array.constructor.name,array:Array.prototype.slice.call(i.array)});var r=this.attributes;for(var n in r){var a=(p=r[n]).toJSON();""!==p.name&&(a.name=p.name),e.data.attributes[n]=a}var o={},s=!1;for(var n in this.morphAttributes){for(var c=this.morphAttributes[n],l=[],h=0,u=c.length;h0&&(o[n]=l,s=!0)}s&&(e.data.morphAttributes=o,e.data.morphTargetsRelative=this.morphTargetsRelative);var d=this.groups;d.length>0&&(e.data.groups=JSON.parse(JSON.stringify(d)));var f=this.boundingSphere;return null!==f&&(e.data.boundingSphere={center:f.center.toArray(),radius:f.radius}),e},clone:function(){return(new Zi).copy(this)},copy:function(e){var t,n,i;this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.name=e.name;var r=e.index;null!==r&&this.setIndex(r.clone());var a=e.attributes;for(t in a){var o=a[t];this.setAttribute(t,o.clone())}var s=e.morphAttributes;for(t in s){var c=[],l=s[t];for(n=0,i=l.length;nn.far?null:{distance:h,point:pr.clone(),object:e}}function mr(e,t,n,i,r,a,o,s,c,l,h,u){$i.fromBufferAttribute(r,l),er.fromBufferAttribute(r,h),tr.fromBufferAttribute(r,u);var p=e.morphTargetInfluences;if(t.morphTargets&&a&&p){ar.set(0,0,0),or.set(0,0,0),sr.set(0,0,0);for(var d=0,f=a.length;d0){var o=r[a[0]];if(void 0!==o)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},e=0,t=o.length;e0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}},raycast:function(e,t){var n,i=this.geometry,r=this.material,a=this.matrixWorld;if(void 0!==r&&(null===i.boundingSphere&&i.computeBoundingSphere(),Ki.copy(i.boundingSphere),Ki.applyMatrix4(a),!1!==e.ray.intersectsSphere(Ki)&&(Ji.getInverse(a),Qi.copy(e.ray).applyMatrix4(Ji),null===i.boundingBox||!1!==Qi.intersectsBox(i.boundingBox))))if(i.isBufferGeometry){var o,s,c,l,h,u,p,d,f,m=i.index,g=i.attributes.position,v=i.morphAttributes.position,y=i.morphTargetsRelative,x=i.attributes.uv,b=i.attributes.uv2,_=i.groups,w=i.drawRange;if(null!==m)if(Array.isArray(r))for(l=0,u=_.length;l0&&(E=P);for(var C=0,O=R.length;C0)for(l=0;l0&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var e,t,n;for(this.computeFaceNormals(),e=0,t=this.faces.length;e0&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var e,t,n,i,r;for(n=0,i=this.faces.length;n=0;n--){var f=p[n];for(this.faces.splice(f,1),o=0,s=this.faceVertexUvs.length;o0,g=d.vertexNormals.length>0,v=1!==d.color.r||1!==d.color.g||1!==d.color.b,y=d.vertexColors.length>0,x=0;if(x=M(x,0,0),x=M(x,1,!0),x=M(x,2,!1),x=M(x,3,f),x=M(x,4,m),x=M(x,5,g),x=M(x,6,v),x=M(x,7,y),o.push(x),o.push(d.a,d.b,d.c),o.push(d.materialIndex),f){var b=this.faceVertexUvs[0][r];o.push(E(b[0]),E(b[1]),E(b[2]))}if(m&&o.push(S(d.normal)),g){var _=d.vertexNormals;o.push(S(_[0]),S(_[1]),S(_[2]))}if(v&&o.push(T(d.color)),y){var w=d.vertexColors;o.push(T(w[0]),T(w[1]),T(w[2]))}}function M(e,t,n){return n?e|1<0&&(e.data.colors=l),u.length>0&&(e.data.uvs=[u]),e.data.faces=o,e},clone:function(){return(new br).copy(this)},copy:function(e){var t,n,i,r,a,o;this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingBox=null,this.boundingSphere=null,this.name=e.name;var s=e.vertices;for(t=0,n=s.length;t0?1:-1,h.push(R.x,R.y,R.z),u.push(y/m),u.push(1-x/g),A+=1}}for(x=0;x0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader;var r={};for(var a in this.extensions)!0===this.extensions[a]&&(r[a]=!0);return Object.keys(r).length>0&&(t.extensions=r),t},Rr.prototype=Object.assign(Object.create(Pn.prototype),{constructor:Rr,isCamera:!0,copy:function(e,t){return Pn.prototype.copy.call(this,e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this},getWorldDirection:function(e){void 0===e&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),e=new rn),this.updateMatrixWorld(!0);var t=this.matrixWorld.elements;return e.set(-t[8],-t[9],-t[10]).normalize()},updateMatrixWorld:function(e){Pn.prototype.updateMatrixWorld.call(this,e),this.matrixWorldInverse.getInverse(this.matrixWorld)},updateWorldMatrix:function(e,t){Pn.prototype.updateWorldMatrix.call(this,e,t),this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}}),Pr.prototype=Object.assign(Object.create(Rr.prototype),{constructor:Pr,isPerspectiveCamera:!0,copy:function(e,t){return Rr.prototype.copy.call(this,e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=null===e.view?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this},setFocalLength:function(e){var t=.5*this.getFilmHeight()/e;this.fov=2*Wt.RAD2DEG*Math.atan(t),this.updateProjectionMatrix()},getFocalLength:function(){var e=Math.tan(.5*Wt.DEG2RAD*this.fov);return.5*this.getFilmHeight()/e},getEffectiveFOV:function(){return 2*Wt.RAD2DEG*Math.atan(Math.tan(.5*Wt.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(e,t,n,i,r,a){this.aspect=e/t,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=a,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){var e=this.near,t=e*Math.tan(.5*Wt.DEG2RAD*this.fov)/this.zoom,n=2*t,i=this.aspect*n,r=-.5*i,a=this.view;if(null!==this.view&&this.view.enabled){var o=a.fullWidth,s=a.fullHeight;r+=a.offsetX*i/o,t-=a.offsetY*n/s,i*=a.width/o,n*=a.height/s}var c=this.filmOffset;0!==c&&(r+=e*c/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,t,t-n,e,this.far),this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(e){var t=Pn.prototype.toJSON.call(this,e);return t.object.fov=this.fov,t.object.zoom=this.zoom,t.object.near=this.near,t.object.far=this.far,t.object.focus=this.focus,t.object.aspect=this.aspect,null!==this.view&&(t.object.view=Object.assign({},this.view)),t.object.filmGauge=this.filmGauge,t.object.filmOffset=this.filmOffset,t}});var Cr=90,Or=1;function Dr(e,t,n,i){Pn.call(this),this.type="CubeCamera";var r=new Pr(Cr,Or,e,t);r.up.set(0,-1,0),r.lookAt(new rn(1,0,0)),this.add(r);var a=new Pr(Cr,Or,e,t);a.up.set(0,-1,0),a.lookAt(new rn(-1,0,0)),this.add(a);var o=new Pr(Cr,Or,e,t);o.up.set(0,0,1),o.lookAt(new rn(0,1,0)),this.add(o);var s=new Pr(Cr,Or,e,t);s.up.set(0,0,-1),s.lookAt(new rn(0,-1,0)),this.add(s);var c=new Pr(Cr,Or,e,t);c.up.set(0,-1,0),c.lookAt(new rn(0,0,1)),this.add(c);var l=new Pr(Cr,Or,e,t);l.up.set(0,-1,0),l.lookAt(new rn(0,0,-1)),this.add(l),i=i||{format:Se,magFilter:ce,minFilter:ce},this.renderTarget=new Ir(n,i),this.renderTarget.texture.name="CubeCamera",this.update=function(e,t){null===this.parent&&this.updateMatrixWorld();var n=e.getRenderTarget(),i=this.renderTarget,h=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,e.setRenderTarget(i,0),e.render(t,r),e.setRenderTarget(i,1),e.render(t,a),e.setRenderTarget(i,2),e.render(t,o),e.setRenderTarget(i,3),e.render(t,s),e.setRenderTarget(i,4),e.render(t,c),i.texture.generateMipmaps=h,e.setRenderTarget(i,5),e.render(t,l),e.setRenderTarget(n)},this.clear=function(e,t,n,i){for(var r=e.getRenderTarget(),a=this.renderTarget,o=0;o<6;o++)e.setRenderTarget(a,o),e.clear(t,n,i);e.setRenderTarget(r)}}function Ir(e,t,n){Number.isInteger(t)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),t=n),Kt.call(this,e,e,t)}function Nr(e,t,n,i,r,a,o,s,c,l,h,u){Jt.call(this,null,a,o,s,c,l,i,r,h,u),this.image={data:e||null,width:t||1,height:n||1},this.magFilter=void 0!==c?c:ae,this.minFilter=void 0!==l?l:ae,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}Dr.prototype=Object.create(Pn.prototype),Dr.prototype.constructor=Dr,Ir.prototype=Object.create(Kt.prototype),Ir.prototype.constructor=Ir,Ir.prototype.isWebGLCubeRenderTarget=!0,Ir.prototype.fromEquirectangularTexture=function(e,t){this.texture.type=t.type,this.texture.format=t.format,this.texture.encoding=t.encoding;var n=new Cn,i={uniforms:{tEquirect:{value:null}},vertexShader:["varying vec3 vWorldDirection;","vec3 transformDirection( in vec3 dir, in mat4 matrix ) {","\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );","}","void main() {","\tvWorldDirection = transformDirection( position, modelMatrix );","\t#include ","\t#include ","}"].join("\n"),fragmentShader:["uniform sampler2D tEquirect;","varying vec3 vWorldDirection;","#define RECIPROCAL_PI 0.31830988618","#define RECIPROCAL_PI2 0.15915494","void main() {","\tvec3 direction = normalize( vWorldDirection );","\tvec2 sampleUV;","\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;","\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;","\tgl_FragColor = texture2D( tEquirect, sampleUV );","}"].join("\n")},r=new Lr({type:"CubemapFromEquirect",uniforms:Mr(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:c,blending:h});r.uniforms.tEquirect.value=t;var a=new dr(new wr(5,5,5),r);n.add(a);var o=new Dr(1,10,1);return o.renderTarget=this,o.renderTarget.texture.name="CubeCameraTexture",o.update(e,n),a.geometry.dispose(),a.material.dispose(),this},Nr.prototype=Object.create(Jt.prototype),Nr.prototype.constructor=Nr,Nr.prototype.isDataTexture=!0;var Br=new Yn,zr=new rn;function Fr(e,t,n,i,r,a){this.planes=[void 0!==e?e:new oi,void 0!==t?t:new oi,void 0!==n?n:new oi,void 0!==i?i:new oi,void 0!==r?r:new oi,void 0!==a?a:new oi]}Object.assign(Fr.prototype,{set:function(e,t,n,i,r,a){var o=this.planes;return o[0].copy(e),o[1].copy(t),o[2].copy(n),o[3].copy(i),o[4].copy(r),o[5].copy(a),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){for(var t=this.planes,n=0;n<6;n++)t[n].copy(e.planes[n]);return this},setFromProjectionMatrix:function(e){var t=this.planes,n=e.elements,i=n[0],r=n[1],a=n[2],o=n[3],s=n[4],c=n[5],l=n[6],h=n[7],u=n[8],p=n[9],d=n[10],f=n[11],m=n[12],g=n[13],v=n[14],y=n[15];return t[0].setComponents(o-i,h-s,f-u,y-m).normalize(),t[1].setComponents(o+i,h+s,f+u,y+m).normalize(),t[2].setComponents(o+r,h+c,f+p,y+g).normalize(),t[3].setComponents(o-r,h-c,f-p,y-g).normalize(),t[4].setComponents(o-a,h-l,f-d,y-v).normalize(),t[5].setComponents(o+a,h+l,f+d,y+v).normalize(),this},intersectsObject:function(e){var t=e.geometry;return null===t.boundingSphere&&t.computeBoundingSphere(),Br.copy(t.boundingSphere).applyMatrix4(e.matrixWorld),this.intersectsSphere(Br)},intersectsSprite:function(e){return Br.center.set(0,0,0),Br.radius=.7071067811865476,Br.applyMatrix4(e.matrixWorld),this.intersectsSphere(Br)},intersectsSphere:function(e){for(var t=this.planes,n=e.center,i=-e.radius,r=0;r<6;r++){if(t[r].distanceToPoint(n)0?e.max.x:e.min.x,zr.y=i.normal.y>0?e.max.y:e.min.y,zr.z=i.normal.z>0?e.max.z:e.min.z,i.distanceToPoint(zr)<0)return!1}return!0},containsPoint:function(e){for(var t=this.planes,n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}});var Ur={common:{diffuse:{value:new _i(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new Xt},uv2Transform:{value:new Xt},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new qt(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new _i(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new _i(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new Xt}},sprite:{diffuse:{value:new _i(15658734)},opacity:{value:1},center:{value:new qt(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new Xt}}};function Gr(){var e=null,t=!1,n=null;function i(r,a){!1!==t&&(n(r,a),e.requestAnimationFrame(i))}return{start:function(){!0!==t&&null!==n&&(e.requestAnimationFrame(i),t=!0)},stop:function(){t=!1},setAnimationLoop:function(e){n=e},setContext:function(t){e=t}}}function Hr(e,t){var n=t.isWebGL2,i=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),i.get(e)},remove:function(t){t.isInterleavedBufferAttribute&&(t=t.data);var n=i.get(t);n&&(e.deleteBuffer(n.buffer),i.delete(t))},update:function(t,r){t.isInterleavedBufferAttribute&&(t=t.data);var a=i.get(t);void 0===a?i.set(t,function(t,n){var i=t.array,r=t.usage,a=e.createBuffer();e.bindBuffer(n,a),e.bufferData(n,i,r),t.onUploadCallback();var o=5126;return i instanceof Float32Array?o=5126:i instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):i instanceof Uint16Array?o=5123:i instanceof Int16Array?o=5122:i instanceof Uint32Array?o=5125:i instanceof Int32Array?o=5124:i instanceof Int8Array?o=5120:i instanceof Uint8Array&&(o=5121),{buffer:a,type:o,bytesPerElement:i.BYTES_PER_ELEMENT,version:t.version}}(t,r)):a.version 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( STANDARD ) && ! defined( PHONG ) && ! defined( MATCAP ) && ! defined( TOON )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( STANDARD ) && ! defined( PHONG ) && ! defined( MATCAP ) && ! defined( TOON )\n\tvarying vec3 vViewPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( STANDARD ) && ! defined( PHONG ) && ! defined( MATCAP ) && ! defined( TOON )\n\tvViewPosition = - mvPosition.xyz;\n#endif",color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n return m[ 2 ][ 3 ] == - 1.0;\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_maxMipLevel 8.0\n#define cubeUV_minMipLevel 4.0\n#define cubeUV_maxTileSize 256.0\n#define cubeUV_minTileSize 16.0\nfloat getFace(vec3 direction) {\n vec3 absDirection = abs(direction);\n float face = -1.0;\n if (absDirection.x > absDirection.z) {\n if (absDirection.x > absDirection.y)\n face = direction.x > 0.0 ? 0.0 : 3.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n } else {\n if (absDirection.z > absDirection.y)\n face = direction.z > 0.0 ? 2.0 : 5.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n }\n return face;\n}\nvec2 getUV(vec3 direction, float face) {\n vec2 uv;\n if (face == 0.0) {\n uv = vec2(-direction.z, direction.y) / abs(direction.x);\n } else if (face == 1.0) {\n uv = vec2(direction.x, -direction.z) / abs(direction.y);\n } else if (face == 2.0) {\n uv = direction.xy / abs(direction.z);\n } else if (face == 3.0) {\n uv = vec2(direction.z, direction.y) / abs(direction.x);\n } else if (face == 4.0) {\n uv = direction.xz / abs(direction.y);\n } else {\n uv = vec2(-direction.x, direction.y) / abs(direction.z);\n }\n return 0.5 * (uv + 1.0);\n}\nvec3 bilinearCubeUV(sampler2D envMap, vec3 direction, float mipInt) {\n float face = getFace(direction);\n float filterInt = max(cubeUV_minMipLevel - mipInt, 0.0);\n mipInt = max(mipInt, cubeUV_minMipLevel);\n float faceSize = exp2(mipInt);\n float texelSize = 1.0 / (3.0 * cubeUV_maxTileSize);\n vec2 uv = getUV(direction, face) * (faceSize - 1.0);\n vec2 f = fract(uv);\n uv += 0.5 - f;\n if (face > 2.0) {\n uv.y += faceSize;\n face -= 3.0;\n }\n uv.x += face * faceSize;\n if(mipInt < cubeUV_maxMipLevel){\n uv.y += 2.0 * cubeUV_maxTileSize;\n }\n uv.y += filterInt * 2.0 * cubeUV_minTileSize;\n uv.x += 3.0 * max(0.0, cubeUV_maxTileSize - 2.0 * faceSize);\n uv *= texelSize;\n vec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n uv.x += texelSize;\n vec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n uv.y += texelSize;\n vec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n uv.x -= texelSize;\n vec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n vec3 tm = mix(tl, tr, f.x);\n vec3 bm = mix(bl, br, f.x);\n return mix(tm, bm, f.y);\n}\n#define r0 1.0\n#define v0 0.339\n#define m0 -2.0\n#define r1 0.8\n#define v1 0.276\n#define m1 -1.0\n#define r4 0.4\n#define v4 0.046\n#define m4 2.0\n#define r5 0.305\n#define v5 0.016\n#define m5 3.0\n#define r6 0.21\n#define v6 0.0038\n#define m6 4.0\nfloat roughnessToMip(float roughness) {\n float mip = 0.0;\n if (roughness >= r1) {\n mip = (r0 - roughness) * (m1 - m0) / (r0 - r1) + m0;\n } else if (roughness >= r4) {\n mip = (r1 - roughness) * (m4 - m1) / (r1 - r4) + m1;\n } else if (roughness >= r5) {\n mip = (r4 - roughness) * (m5 - m4) / (r4 - r5) + m4;\n } else if (roughness >= r6) {\n mip = (r5 - roughness) * (m6 - m5) / (r5 - r6) + m5;\n } else {\n mip = -2.0 * log2(1.16 * roughness); }\n return mip;\n}\nvec4 textureCubeUV(sampler2D envMap, vec3 sampleDir, float roughness) {\n float mip = clamp(roughnessToMip(roughness), m0, cubeUV_maxMipLevel);\n float mipF = fract(mip);\n float mipInt = floor(mip);\n vec3 color0 = bilinearCubeUV(envMap, sampleDir, mipInt);\n if (mipF == 0.0) {\n return vec4(color0, 1.0);\n } else {\n vec3 color1 = bilinearCubeUV(envMap, sampleDir, mipInt + 1.0);\n return vec4(mix(color0, color1, mipF), 1.0);\n }\n}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\t\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t vec3 reflectVec = reflect( -viewDir, normal );\n\t\t reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t vec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) { \n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = saturate( clearcoat );\tmaterial.clearcoatRoughness = max( clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",normal_fragment_begin:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tmat3 tsn = mat3( S, T, N );\n\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\n\t#endif\n#endif",clearcoat_normalmap_pars_fragment:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( ( color * ( 2.51 * color + 0.03 ) ) / ( color * ( 2.43 * color + 0.59 ) + 0.14 ) );\n}",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSPARENCY\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSPARENCY\n\tuniform float transparency;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSPARENCY\n\t\tdiffuseColor.a *= saturate( 1. - transparency + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}"},Wr={basic:{uniforms:Sr([Ur.common,Ur.specularmap,Ur.envmap,Ur.aomap,Ur.lightmap,Ur.fog]),vertexShader:jr.meshbasic_vert,fragmentShader:jr.meshbasic_frag},lambert:{uniforms:Sr([Ur.common,Ur.specularmap,Ur.envmap,Ur.aomap,Ur.lightmap,Ur.emissivemap,Ur.fog,Ur.lights,{emissive:{value:new _i(0)}}]),vertexShader:jr.meshlambert_vert,fragmentShader:jr.meshlambert_frag},phong:{uniforms:Sr([Ur.common,Ur.specularmap,Ur.envmap,Ur.aomap,Ur.lightmap,Ur.emissivemap,Ur.bumpmap,Ur.normalmap,Ur.displacementmap,Ur.fog,Ur.lights,{emissive:{value:new _i(0)},specular:{value:new _i(1118481)},shininess:{value:30}}]),vertexShader:jr.meshphong_vert,fragmentShader:jr.meshphong_frag},standard:{uniforms:Sr([Ur.common,Ur.envmap,Ur.aomap,Ur.lightmap,Ur.emissivemap,Ur.bumpmap,Ur.normalmap,Ur.displacementmap,Ur.roughnessmap,Ur.metalnessmap,Ur.fog,Ur.lights,{emissive:{value:new _i(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:jr.meshphysical_vert,fragmentShader:jr.meshphysical_frag},toon:{uniforms:Sr([Ur.common,Ur.specularmap,Ur.aomap,Ur.lightmap,Ur.emissivemap,Ur.bumpmap,Ur.normalmap,Ur.displacementmap,Ur.gradientmap,Ur.fog,Ur.lights,{emissive:{value:new _i(0)},specular:{value:new _i(1118481)},shininess:{value:30}}]),vertexShader:jr.meshtoon_vert,fragmentShader:jr.meshtoon_frag},matcap:{uniforms:Sr([Ur.common,Ur.bumpmap,Ur.normalmap,Ur.displacementmap,Ur.fog,{matcap:{value:null}}]),vertexShader:jr.meshmatcap_vert,fragmentShader:jr.meshmatcap_frag},points:{uniforms:Sr([Ur.points,Ur.fog]),vertexShader:jr.points_vert,fragmentShader:jr.points_frag},dashed:{uniforms:Sr([Ur.common,Ur.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:jr.linedashed_vert,fragmentShader:jr.linedashed_frag},depth:{uniforms:Sr([Ur.common,Ur.displacementmap]),vertexShader:jr.depth_vert,fragmentShader:jr.depth_frag},normal:{uniforms:Sr([Ur.common,Ur.bumpmap,Ur.normalmap,Ur.displacementmap,{opacity:{value:1}}]),vertexShader:jr.normal_vert,fragmentShader:jr.normal_frag},sprite:{uniforms:Sr([Ur.sprite,Ur.fog]),vertexShader:jr.sprite_vert,fragmentShader:jr.sprite_frag},background:{uniforms:{uvTransform:{value:new Xt},t2D:{value:null}},vertexShader:jr.background_vert,fragmentShader:jr.background_frag},cube:{uniforms:Sr([Ur.envmap,{opacity:{value:1}}]),vertexShader:jr.cube_vert,fragmentShader:jr.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:jr.equirect_vert,fragmentShader:jr.equirect_frag},distanceRGBA:{uniforms:Sr([Ur.common,Ur.displacementmap,{referencePosition:{value:new rn},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:jr.distanceRGBA_vert,fragmentShader:jr.distanceRGBA_frag},shadow:{uniforms:Sr([Ur.lights,Ur.fog,{color:{value:new _i(0)},opacity:{value:1}}]),vertexShader:jr.shadow_vert,fragmentShader:jr.shadow_frag}};function qr(e,t,n,i){var r,a,o=new _i(0),l=0,h=null,u=0,p=null;function d(e,n){t.buffers.color.setClear(e.r,e.g,e.b,n,i)}return{getClearColor:function(){return o},setClearColor:function(e,t){o.set(e),d(o,l=void 0!==t?t:1)},getClearAlpha:function(){return l},setClearAlpha:function(e){d(o,l=e)},render:function(t,i,f,m){var g=i.background,v=e.xr,y=v.getSession&&v.getSession();if(y&&"additive"===y.environmentBlendMode&&(g=null),null===g?d(o,l):g&&g.isColor&&(d(g,1),m=!0),(e.autoClear||m)&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),g&&(g.isCubeTexture||g.isWebGLCubeRenderTarget||g.mapping===ee)){void 0===a&&((a=new dr(new wr(1,1,1),new Lr({type:"BackgroundCubeMaterial",uniforms:Mr(Wr.cube.uniforms),vertexShader:Wr.cube.vertexShader,fragmentShader:Wr.cube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1}))).geometry.deleteAttribute("normal"),a.geometry.deleteAttribute("uv"),a.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(a.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),n.update(a));var x=g.isWebGLCubeRenderTarget?g.texture:g;a.material.uniforms.envMap.value=x,a.material.uniforms.flipEnvMap.value=x.isCubeTexture?-1:1,h===g&&u===x.version&&p===e.toneMapping||(a.material.needsUpdate=!0,h=g,u=x.version,p=e.toneMapping),t.unshift(a,a.geometry,a.material,0,0,null)}else g&&g.isTexture&&(void 0===r&&((r=new dr(new kr(2,2),new Lr({type:"BackgroundMaterial",uniforms:Mr(Wr.background.uniforms),vertexShader:Wr.background.vertexShader,fragmentShader:Wr.background.fragmentShader,side:s,depthTest:!1,depthWrite:!1,fog:!1}))).geometry.deleteAttribute("normal"),Object.defineProperty(r.material,"map",{get:function(){return this.uniforms.t2D.value}}),n.update(r)),r.material.uniforms.t2D.value=g,!0===g.matrixAutoUpdate&&g.updateMatrix(),r.material.uniforms.uvTransform.value.copy(g.matrix),h===g&&u===g.version&&p===e.toneMapping||(r.material.needsUpdate=!0,h=g,u=g.version,p=e.toneMapping),t.unshift(r,r.geometry,r.material,0,0,null))}}}function Xr(e,t,n,i){var r,a=i.isWebGL2;this.setMode=function(e){r=e},this.render=function(t,i){e.drawArrays(r,t,i),n.update(i,r)},this.renderInstances=function(i,o,s,c){if(0!==c){var l,h;if(a)l=e,h="drawArraysInstanced";else if(h="drawArraysInstancedANGLE",null===(l=t.get("ANGLE_instanced_arrays")))return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");l[h](r,o,s,c),n.update(s,r,c)}}}function Yr(e,t,n){var i;function r(t){if("highp"===t){if(e.getShaderPrecisionFormat(35633,36338).precision>0&&e.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(35633,36337).precision>0&&e.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}var a="undefined"!=typeof WebGL2RenderingContext&&e instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&e instanceof WebGL2ComputeRenderingContext,o=void 0!==n.precision?n.precision:"highp",s=r(o);s!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);var c=!0===n.logarithmicDepthBuffer,l=e.getParameter(34930),h=e.getParameter(35660),u=e.getParameter(3379),p=e.getParameter(34076),d=e.getParameter(34921),f=e.getParameter(36347),m=e.getParameter(36348),g=e.getParameter(36349),v=h>0,y=a||!!t.get("OES_texture_float");return{isWebGL2:a,getMaxAnisotropy:function(){if(void 0!==i)return i;var n=t.get("EXT_texture_filter_anisotropic");return i=null!==n?e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:r,precision:o,logarithmicDepthBuffer:c,maxTextures:l,maxVertexTextures:h,maxTextureSize:u,maxCubemapSize:p,maxAttributes:d,maxVertexUniforms:f,maxVaryings:m,maxFragmentUniforms:g,vertexTextures:v,floatFragmentTextures:y,floatVertexTextures:v&&y,maxSamples:a?e.getParameter(36183):0}}function Zr(){var e=this,t=null,n=0,i=!1,r=!1,a=new oi,o=new Xt,s={value:null,needsUpdate:!1};function c(){s.value!==t&&(s.value=t,s.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function l(t,n,i,r){var c=null!==t?t.length:0,l=null;if(0!==c){if(l=s.value,!0!==r||null===l){var h=i+4*c,u=n.matrixWorldInverse;o.getNormalMatrix(u),(null===l||l.length65535?zi:Ni)(n,1);d.version=o,t.update(d,34963);var f=r.get(e);f&&t.remove(f),r.set(e,d)}return{get:function(e,t){var r=i.get(t);return r||(t.addEventListener("dispose",a),t.isBufferGeometry?r=t:t.isGeometry&&(void 0===t._bufferGeometry&&(t._bufferGeometry=(new Zi).setFromObject(e)),r=t._bufferGeometry),i.set(t,r),n.memory.geometries++,r)},update:function(e){var n=e.index,i=e.attributes;for(var r in null!==n&&t.update(n,34963),i)t.update(i[r],34962);var a=e.morphAttributes;for(var r in a)for(var o=a[r],s=0,c=o.length;s0)return e;var r=t*n,a=ha[r];if(void 0===a&&(a=new Float32Array(r),ha[r]=a),0!==t){i.toArray(a,0);for(var o=1,s=0;o!==t;++o)s+=n,e[o].toArray(a,s)}return a}function ga(e,t){if(e.length!==t.length)return!1;for(var n=0,i=e.length;n/gm;function uo(e){return e.replace(ho,po)}function po(e,t){var n=jr[t];if(void 0===n)throw new Error("Can not resolve #include <"+t+">");return uo(n)}var fo=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;function mo(e){return e.replace(fo,go)}function go(e,t,n,i){for(var r="",a=parseInt(t);a0?e.gammaFactor:1,b=n.isWebGL2?"":function(e){return[e.extensionDerivatives||e.envMapCubeUV||e.bumpMap||e.tangentSpaceNormalMap||e.clearcoatNormalMap||e.flatShading||"physical"===e.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(e.extensionFragDepth||e.logarithmicDepthBuffer)&&e.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",e.extensionDrawBuffers&&e.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(e.extensionShaderTextureLOD||e.envMap)&&e.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(so).join("\n")}(n),_=function(e){var t=[];for(var n in e){var i=e[n];!1!==i&&t.push("#define "+n+" "+i)}return t.join("\n")}(p),w=u.createProgram();if(n.isRawShaderMaterial?((i=[_].filter(so).join("\n")).length>0&&(i+="\n"),(s=[b,_].filter(so).join("\n")).length>0&&(s+="\n")):(i=[vo(n),"#define SHADER_NAME "+n.shaderName,_,n.instancing?"#define USE_INSTANCING":"",n.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+x,"#define MAX_BONES "+n.maxBones,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+v:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.displacementMap&&n.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.useVertexTexture?"#define BONE_TEXTURE":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+m:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(so).join("\n"),s=[b,vo(n),"#define SHADER_NAME "+n.shaderName,_,n.alphaTest?"#define ALPHATEST "+n.alphaTest+(n.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+x,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+g:"",n.envMap?"#define "+v:"",n.envMap?"#define "+y:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.sheen?"#define USE_SHEEN":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+m:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(n.extensionShaderTextureLOD||n.envMap)&&n.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==k?"#define TONE_MAPPING":"",n.toneMapping!==k?jr.tonemapping_pars_fragment:"",n.toneMapping!==k?oo("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.outputEncoding||n.mapEncoding||n.matcapEncoding||n.envMapEncoding||n.emissiveMapEncoding||n.lightMapEncoding?jr.encodings_pars_fragment:"",n.mapEncoding?ao("mapTexelToLinear",n.mapEncoding):"",n.matcapEncoding?ao("matcapTexelToLinear",n.matcapEncoding):"",n.envMapEncoding?ao("envMapTexelToLinear",n.envMapEncoding):"",n.emissiveMapEncoding?ao("emissiveMapTexelToLinear",n.emissiveMapEncoding):"",n.lightMapEncoding?ao("lightMapTexelToLinear",n.lightMapEncoding):"",n.outputEncoding?(c="linearToOutputTexel",l=n.outputEncoding,h=io(l),"vec4 "+c+"( vec4 value ) { return LinearTo"+h[0]+h[1]+"; }"):"",n.depthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(so).join("\n")),d=lo(d=co(d=uo(d),n),n),f=lo(f=co(f=uo(f),n),n),d=mo(d),f=mo(f),n.isWebGL2&&!n.isRawShaderMaterial){var M=!1,S=/^\s*#version\s+300\s+es\s*\n/;n.isShaderMaterial&&null!==d.match(S)&&null!==f.match(S)&&(M=!0,d=d.replace(S,""),f=f.replace(S,"")),i=["#version 300 es\n","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+i,s=["#version 300 es\n","#define varying in",M?"":"out highp vec4 pc_fragColor;",M?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+s}var T,E,A=s+f,L=to(u,35633,i+d),R=to(u,35632,A);if(u.attachShader(w,L),u.attachShader(w,R),void 0!==n.index0AttributeName?u.bindAttribLocation(w,0,n.index0AttributeName):!0===n.morphTargets&&u.bindAttribLocation(w,0,"position"),u.linkProgram(w),e.debug.checkShaderErrors){var P=u.getProgramInfoLog(w).trim(),C=u.getShaderInfoLog(L).trim(),O=u.getShaderInfoLog(R).trim(),D=!0,I=!0;if(!1===u.getProgramParameter(w,35714)){D=!1;var N=ro(u,L,"vertex"),B=ro(u,R,"fragment");console.error("THREE.WebGLProgram: shader error: ",u.getError(),"35715",u.getProgramParameter(w,35715),"gl.getProgramInfoLog",P,N,B)}else""!==P?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",P):""!==C&&""!==O||(I=!1);I&&(this.diagnostics={runnable:D,programLog:P,vertexShader:{log:C,prefix:i},fragmentShader:{log:O,prefix:s}})}return u.detachShader(w,L),u.detachShader(w,R),u.deleteShader(L),u.deleteShader(R),this.getUniforms=function(){return void 0===T&&(T=new eo(u,w)),T},this.getAttributes=function(){return void 0===E&&(E=function(e,t){for(var n={},i=e.getProgramParameter(t,35721),r=0;r0,maxBones:S,useVertexTexture:o,morphTargets:i.morphTargets,morphNormals:i.morphNormals,maxMorphTargets:e.maxMorphTargets,maxMorphNormals:e.maxMorphNormals,numDirLights:d.directional.length,numPointLights:d.point.length,numSpotLights:d.spot.length,numRectAreaLights:d.rectArea.length,numHemiLights:d.hemi.length,numDirLightShadows:d.directionalShadowMap.length,numPointLightShadows:d.pointShadowMap.length,numSpotLightShadows:d.spotShadowMap.length,numClippingPlanes:v,numClipIntersection:y,dithering:i.dithering,shadowMapEnabled:e.shadowMap.enabled&&m.length>0,shadowMapType:e.shadowMap.type,toneMapping:i.toneMapped?e.toneMapping:k,physicallyCorrectLights:e.physicallyCorrectLights,premultipliedAlpha:i.premultipliedAlpha,alphaTest:i.alphaTest,doubleSided:i.side===l,flipSided:i.side===c,depthPacking:void 0!==i.depthPacking&&i.depthPacking,index0AttributeName:i.index0AttributeName,extensionDerivatives:i.extensions&&i.extensions.derivatives,extensionFragDepth:i.extensions&&i.extensions.fragDepth,extensionDrawbuffers:i.extensions&&i.extensions.drawBuffers,extensionShaderTextureLOD:i.extensions&&i.extensions.shaderTextureLOD,rendererExtensionFragDepth:r||null!==t.get("EXT_frag_depth"),rendererExtensionDrawBuffers:r||null!==t.get("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:r||null!==t.get("EXT_shader_texture_lod"),onBeforeCompile:i.onBeforeCompile}},this.getProgramCacheKey=function(t){var n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.fragmentShader),n.push(t.vertexShader)),void 0!==t.defines)for(var i in t.defines)n.push(i),n.push(t.defines[i]);if(void 0===t.isRawShaderMaterial){for(var r=0;r1&&n.sort(e||_o),i.length>1&&i.sort(t||wo)}}}function So(){var e=new WeakMap;function t(n){var i=n.target;i.removeEventListener("dispose",t),e.delete(i)}return{get:function(n,i){var r,a=e.get(n);return void 0===a?(r=new Mo,e.set(n,new WeakMap),e.get(n).set(i,r),n.addEventListener("dispose",t)):void 0===(r=a.get(i))&&(r=new Mo,a.set(i,r)),r},dispose:function(){e=new WeakMap}}}function To(){var e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];var n;switch(t.type){case"DirectionalLight":n={direction:new rn,color:new _i};break;case"SpotLight":n={position:new rn,direction:new rn,color:new _i,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new rn,color:new _i,distance:0,decay:0};break;case"HemisphereLight":n={direction:new rn,skyColor:new _i,groundColor:new _i};break;case"RectAreaLight":n={color:new _i,position:new rn,halfWidth:new rn,halfHeight:new rn}}return e[t.id]=n,n}}}var Eo=0;function Ao(e,t){return(t.castShadow?1:0)-(e.castShadow?1:0)}function Lo(){for(var e,t=new To,n=(e={},{get:function(t){if(void 0!==e[t.id])return e[t.id];var n;switch(t.type){case"DirectionalLight":case"SpotLight":n={shadowBias:0,shadowRadius:1,shadowMapSize:new qt};break;case"PointLight":n={shadowBias:0,shadowRadius:1,shadowMapSize:new qt,shadowCameraNear:1,shadowCameraFar:1e3}}return e[t.id]=n,n}}),i={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},r=0;r<9;r++)i.probe.push(new rn);var a=new rn,o=new pn,s=new pn;return{setup:function(e,r,c){for(var l=0,h=0,u=0,p=0;p<9;p++)i.probe[p].set(0,0,0);var d=0,f=0,m=0,g=0,v=0,y=0,x=0,b=0,_=c.matrixWorldInverse;e.sort(Ao),p=0;for(var w=e.length;p0:!0===c.isGeometry&&(p=c.morphTargets&&c.morphTargets.length>0));var d=!1;!0===t.isSkinnedMesh&&(!0===n.skinning?d=!0:console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",t)),l=h(p,d,!0===t.isInstancedMesh)}else l=u;if(e.localClippingEnabled&&!0===n.clipShadows&&0!==n.clippingPlanes.length){var f=l.uuid,v=n.uuid,y=m[f];void 0===y&&(y={},m[f]=y);var x=y[v];void 0===x&&(x=l.clone(),y[v]=x),l=x}return l.visible=n.visible,l.wireframe=n.wireframe,l.side=s===o?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:g[n.side],l.clipShadows=n.clipShadows,l.clippingPlanes=n.clippingPlanes,l.clipIntersection=n.clipIntersection,l.wireframeLinewidth=n.wireframeLinewidth,l.linewidth=n.linewidth,!0===i.isPointLight&&!0===l.isMeshDistanceMaterial&&(l.referencePosition.setFromMatrixPosition(i.matrixWorld),l.nearDistance=r,l.farDistance=a),l}function E(n,r,a,s,c){if(!1!==n.visible){if(n.layers.test(r.layers)&&(n.isMesh||n.isLine||n.isPoints)&&(n.castShadow||n.receiveShadow&&c===o)&&(!n.frustumCulled||i.intersectsObject(n))){n.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,n.matrixWorld);var l=t.update(n),h=n.material;if(Array.isArray(h))for(var u=l.groups,p=0,d=u.length;pn||a.y>n)&&(console.warn("THREE.WebGLShadowMap:",v,"has shadow exceeding max texture size, reducing"),a.x>n&&(u.x=Math.floor(n/x.x),a.x=u.x*x.x,y.mapSize.x=u.x),a.y>n&&(u.y=Math.floor(n/x.y),a.y=u.y*x.y,y.mapSize.y=u.y)),null===y.map&&!y.isPointLightShadow&&this.type===o){var b={minFilter:ce,magFilter:ce,format:Te};y.map=new Kt(a.x,a.y,b),y.map.texture.name=v.name+".shadowMap",y.mapPass=new Kt(a.x,a.y,b),y.camera.updateProjectionMatrix()}if(null===y.map){b={minFilter:ae,magFilter:ae,format:Te};y.map=new Kt(a.x,a.y,b),y.map.texture.name=v.name+".shadowMap",y.camera.updateProjectionMatrix()}e.setRenderTarget(y.map),e.clear();for(var M=y.getViewportCount(),S=0;S=1):-1!==ue.indexOf("OpenGL ES")&&(he=parseFloat(/^OpenGL\ ES\ ([0-9])/.exec(ue)[1]),le=he>=2);var pe=null,de={},fe=new Qt,me=new Qt;function ge(t,n,i){var r=new Uint8Array(4),a=e.createTexture();e.bindTexture(t,a),e.texParameteri(t,10241,9728),e.texParameteri(t,10240,9728);for(var o=0;oi||e.height>i)&&(r=i/Math.max(e.width,e.height)),r<1||!0===t){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap){var a=t?Wt.floorPowerOfTwo:Math.floor,o=a(r*e.width),c=a(r*e.height);void 0===s&&(s=m(o,c));var l=n?m(o,c):s;return l.width=o,l.height=c,l.getContext("2d").drawImage(e,0,0,o,c),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+e.width+"x"+e.height+") to ("+o+"x"+c+")."),l}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+e.width+"x"+e.height+")."),e}return e}function v(e){return Wt.isPowerOfTwo(e.width)&&Wt.isPowerOfTwo(e.height)}function y(e,t){return e.generateMipmaps&&t&&e.minFilter!==ae&&e.minFilter!==ce}function x(t,n,r,a){e.generateMipmap(t),i.get(n).__maxMipLevel=Math.log(Math.max(r,a))*Math.LOG2E}function b(n,i,r){if(!1===c)return i;if(null!==n){if(void 0!==e[n])return e[n];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+n+"'")}var a=i;return 6403===i&&(5126===r&&(a=33326),5131===r&&(a=33325),5121===r&&(a=33321)),6407===i&&(5126===r&&(a=34837),5131===r&&(a=34843),5121===r&&(a=32849)),6408===i&&(5126===r&&(a=34836),5131===r&&(a=34842),5121===r&&(a=32856)),33325===a||33326===a||34842===a||34836===a?t.get("EXT_color_buffer_float"):34843!==a&&34837!==a||console.warn("THREE.WebGLRenderer: Floating point textures with RGB format not supported. Please use RGBA instead."),a}function _(e){return e===ae||e===oe||e===se?9728:9729}function w(t){var n=t.target;n.removeEventListener("dispose",w),function(t){var n=i.get(t);if(void 0===n.__webglInit)return;e.deleteTexture(n.__webglTexture),i.remove(t)}(n),n.isVideoTexture&&d.delete(n),o.memory.textures--}function M(t){var n=t.target;n.removeEventListener("dispose",M),function(t){var n=i.get(t),r=i.get(t.texture);if(!t)return;void 0!==r.__webglTexture&&e.deleteTexture(r.__webglTexture);t.depthTexture&&t.depthTexture.dispose();if(t.isWebGLCubeRenderTarget)for(var a=0;a<6;a++)e.deleteFramebuffer(n.__webglFramebuffer[a]),n.__webglDepthbuffer&&e.deleteRenderbuffer(n.__webglDepthbuffer[a]);else e.deleteFramebuffer(n.__webglFramebuffer),n.__webglDepthbuffer&&e.deleteRenderbuffer(n.__webglDepthbuffer);i.remove(t.texture),i.remove(t)}(n),o.memory.textures--}var S=0;function T(e,t){var r=i.get(e);if(e.isVideoTexture&&function(e){var t=o.render.frame;d.get(e)!==t&&(d.set(e,t),e.update())}(e),e.version>0&&r.__version!==e.version){var a=e.image;if(void 0===a)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==a.complete)return void O(r,e,t);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}n.activeTexture(33984+t),n.bindTexture(3553,r.__webglTexture)}function E(t,r){if(6===t.image.length){var o=i.get(t);if(t.version>0&&o.__version!==t.version){C(o,t),n.activeTexture(33984+r),n.bindTexture(34067,o.__webglTexture),e.pixelStorei(37440,t.flipY);for(var s=t&&(t.isCompressedTexture||t.image[0].isCompressedTexture),l=t.image[0]&&t.image[0].isDataTexture,u=[],p=0;p<6;p++)u[p]=s||l?l?t.image[p].image:t.image[p]:g(t.image[p],!1,!0,h);var d,f=u[0],m=v(f)||c,_=a.convert(t.format),w=a.convert(t.type),M=b(t.internalFormat,_,w);if(P(34067,t,m),s){for(p=0;p<6;p++){d=u[p].mipmaps;for(var S=0;S1||i.get(a).__currentAnisotropy)&&(e.texParameterf(n,s.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(a.anisotropy,r.getMaxAnisotropy())),i.get(a).__currentAnisotropy=a.anisotropy)}}function C(t,n){void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",w),t.__webglTexture=e.createTexture(),o.memory.textures++)}function O(t,i,r){var o=3553;i.isDataTexture2DArray&&(o=35866),i.isDataTexture3D&&(o=32879),C(t,i),n.activeTexture(33984+r),n.bindTexture(o,t.__webglTexture),e.pixelStorei(37440,i.flipY),e.pixelStorei(37441,i.premultiplyAlpha),e.pixelStorei(3317,i.unpackAlignment);var s=function(e){return!c&&(e.wrapS!==ie||e.wrapT!==ie||e.minFilter!==ae&&e.minFilter!==ce)}(i)&&!1===v(i.image),l=g(i.image,s,!1,u),h=v(l)||c,p=a.convert(i.format),d=a.convert(i.type),f=b(i.internalFormat,p,d);P(o,i,h);var m,_=i.mipmaps;if(i.isDepthTexture){if(f=6402,i.type===ve){if(!1===c)throw new Error("Float Depth Texture only supported in WebGL2.0");f=36012}else c&&(f=33189);i.format===Re&&6402===f&&i.type!==fe&&i.type!==ge&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),i.type=fe,d=a.convert(i.type)),i.format===Pe&&(f=34041,i.type!==we&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),i.type=we,d=a.convert(i.type))),n.texImage2D(3553,0,f,l.width,l.height,0,p,d,null)}else if(i.isDataTexture)if(_.length>0&&h){for(var w=0,M=_.length;w0&&h){for(w=0,M=_.length;w=l&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+l),S+=1,e},this.resetTextureUnits=function(){S=0},this.setTexture2D=T,this.setTexture2DArray=function(e,t){var r=i.get(e);e.version>0&&r.__version!==e.version?O(r,e,t):(n.activeTexture(33984+t),n.bindTexture(35866,r.__webglTexture))},this.setTexture3D=function(e,t){var r=i.get(e);e.version>0&&r.__version!==e.version?O(r,e,t):(n.activeTexture(33984+t),n.bindTexture(32879,r.__webglTexture))},this.setTextureCube=E,this.setTextureCubeDynamic=A,this.setupRenderTarget=function(t){var r=i.get(t),s=i.get(t.texture);t.addEventListener("dispose",M),s.__webglTexture=e.createTexture(),o.memory.textures++;var l=!0===t.isWebGLCubeRenderTarget,h=!0===t.isWebGLMultisampleRenderTarget,u=v(t)||c;if(l){r.__webglFramebuffer=[];for(var p=0;p<6;p++)r.__webglFramebuffer[p]=e.createFramebuffer()}else if(r.__webglFramebuffer=e.createFramebuffer(),h)if(c){r.__webglMultisampledFramebuffer=e.createFramebuffer(),r.__webglColorRenderbuffer=e.createRenderbuffer(),e.bindRenderbuffer(36161,r.__webglColorRenderbuffer);var d=a.convert(t.texture.format),f=a.convert(t.texture.type),m=b(t.texture.internalFormat,d,f),g=B(t);e.renderbufferStorageMultisample(36161,g,m,t.width,t.height),e.bindFramebuffer(36160,r.__webglMultisampledFramebuffer),e.framebufferRenderbuffer(36160,36064,36161,r.__webglColorRenderbuffer),e.bindRenderbuffer(36161,null),t.depthBuffer&&(r.__webglDepthRenderbuffer=e.createRenderbuffer(),I(r.__webglDepthRenderbuffer,t,!0)),e.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");if(l){for(n.bindTexture(34067,s.__webglTexture),P(34067,t.texture,u),p=0;p<6;p++)D(r.__webglFramebuffer[p],t,36064,34069+p);y(t.texture,u)&&x(34067,t.texture,t.width,t.height),n.bindTexture(34067,null)}else n.bindTexture(3553,s.__webglTexture),P(3553,t.texture,u),D(r.__webglFramebuffer,t,36064,3553),y(t.texture,u)&&x(3553,t.texture,t.width,t.height),n.bindTexture(3553,null);t.depthBuffer&&N(t)},this.updateRenderTargetMipmap=function(e){var t=e.texture;if(y(t,v(e)||c)){var r=e.isWebGLCubeRenderTarget?34067:3553,a=i.get(t).__webglTexture;n.bindTexture(r,a),x(r,t,e.width,e.height),n.bindTexture(r,null)}},this.updateMultisampleRenderTarget=function(t){if(t.isWebGLMultisampleRenderTarget)if(c){var n=i.get(t);e.bindFramebuffer(36008,n.__webglMultisampledFramebuffer),e.bindFramebuffer(36009,n.__webglFramebuffer);var r=t.width,a=t.height,o=16384;t.depthBuffer&&(o|=256),t.stencilBuffer&&(o|=1024),e.blitFramebuffer(0,0,r,a,0,0,r,a,o,9728)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")},this.safeSetTexture2D=function(e,t){e&&e.isWebGLRenderTarget&&(!1===z&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),z=!0),e=e.texture),T(e,t)},this.safeSetTextureCube=function(e,t){e&&e.isWebGLCubeRenderTarget&&(!1===F&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),F=!0),e=e.texture),e&&e.isCubeTexture||Array.isArray(e.image)&&6===e.image.length?E(e,t):A(e,t)}}function Fo(e,t,n){var i=n.isWebGL2;return{convert:function(e){var n;if(e===ue)return 5121;if(e===xe)return 32819;if(e===be)return 32820;if(e===_e)return 33635;if(e===pe)return 5120;if(e===de)return 5122;if(e===fe)return 5123;if(e===me)return 5124;if(e===ge)return 5125;if(e===ve)return 5126;if(e===ye)return i?5131:null!==(n=t.get("OES_texture_half_float"))?n.HALF_FLOAT_OES:null;if(e===Me)return 6406;if(e===Se)return 6407;if(e===Te)return 6408;if(e===Ee)return 6409;if(e===Ae)return 6410;if(e===Re)return 6402;if(e===Pe)return 34041;if(e===Ce)return 6403;if(e===Oe)return 36244;if(e===De)return 33319;if(e===Ie)return 33320;if(e===Ne)return 36248;if(e===Be)return 36249;if(e===ze||e===Fe||e===Ue||e===Ge){if(null===(n=t.get("WEBGL_compressed_texture_s3tc")))return null;if(e===ze)return n.COMPRESSED_RGB_S3TC_DXT1_EXT;if(e===Fe)return n.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(e===Ue)return n.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(e===Ge)return n.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(e===He)return null!==(n=t.get("EXT_texture_compression_bptc"))?n.COMPRESSED_RGBA_BPTC_UNORM_EXT:null;if(e===Ve||e===ke||e===je||e===We){if(null===(n=t.get("WEBGL_compressed_texture_pvrtc")))return null;if(e===Ve)return n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(e===ke)return n.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(e===je)return n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(e===We)return n.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(e===qe)return null!==(n=t.get("WEBGL_compressed_texture_etc1"))?n.COMPRESSED_RGB_ETC1_WEBGL:null;if((e===Xe||e===Ye)&&null!==(n=t.get("WEBGL_compressed_texture_etc"))){if(e===Xe)return n.COMPRESSED_RGB8_ETC2;if(e===Ye)return n.COMPRESSED_RGBA8_ETC2_EAC}return e===Ze||e===Je||e===Qe||e===Ke||e===$e||e===et||e===tt||e===nt||e===it||e===rt||e===at||e===ot||e===st||e===ct||e===lt||e===ht||e===ut||e===pt||e===dt||e===ft||e===mt||e===gt||e===vt||e===yt||e===xt||e===bt||e===_t||e===wt?null!==(n=t.get("WEBGL_compressed_texture_astc"))?e:null:e===we?i?34042:null!==(n=t.get("WEBGL_depth_texture"))?n.UNSIGNED_INT_24_8_WEBGL:null:void 0}}}function Uo(e){Pr.call(this),this.cameras=e||[]}function Go(){Pn.call(this),this.type="Group"}function Ho(e,t){var n=this,i=null,r=1,a=null,o="local-floor",s=null,c=[],l=new Map,h=new Pr;h.layers.enable(1),h.viewport=new Qt;var u=new Pr;u.layers.enable(2),u.viewport=new Qt;var p=new Uo([h,u]);p.layers.enable(1),p.layers.enable(2);var d=null,f=null;function m(e){var t=l.get(e.inputSource);t&&(t.targetRay&&t.targetRay.dispatchEvent({type:e.type}),t.grip&&t.grip.dispatchEvent({type:e.type}))}function g(){l.forEach(function(e,t){e.targetRay&&(e.targetRay.dispatchEvent({type:"disconnected",data:t}),e.targetRay.visible=!1),e.grip&&(e.grip.dispatchEvent({type:"disconnected",data:t}),e.grip.visible=!1)}),l.clear(),e.setFramebuffer(null),e.setRenderTarget(e.getRenderTarget()),M.stop(),n.isPresenting=!1,n.dispatchEvent({type:"sessionend"})}function v(e){a=e,M.setContext(i),M.start(),n.isPresenting=!0,n.dispatchEvent({type:"sessionstart"})}function y(e){for(var t=i.inputSources,n=0;n=0){var l=r[s];if(void 0!==l){var h=l.normalized,u=l.itemSize,p=_.get(l);if(void 0===p)continue;var d=p.buffer,y=p.type,x=p.bytesPerElement;if(l.isInterleavedBufferAttribute){var b=l.data,w=b.stride,M=l.offset;b&&b.isInstancedInterleavedBuffer?(v.enableAttributeAndDivisor(c,b.meshPerAttribute),void 0===t.maxInstancedCount&&(t.maxInstancedCount=b.meshPerAttribute*b.count)):v.enableAttribute(c),f.bindBuffer(34962,d),f.vertexAttribPointer(c,u,y,h,w*x,M*x)}else l.isInstancedBufferAttribute?(v.enableAttributeAndDivisor(c,l.meshPerAttribute),void 0===t.maxInstancedCount&&(t.maxInstancedCount=l.meshPerAttribute*l.count)):v.enableAttribute(c),f.bindBuffer(34962,d),f.vertexAttribPointer(c,u,y,h,0,0)}else if("instanceMatrix"===s){var p=_.get(e.instanceMatrix);if(void 0===p)continue;var d=p.buffer,y=p.type;v.enableAttributeAndDivisor(c+0,1),v.enableAttributeAndDivisor(c+1,1),v.enableAttributeAndDivisor(c+2,1),v.enableAttributeAndDivisor(c+3,1),f.bindBuffer(34962,d),f.vertexAttribPointer(c+0,4,y,!1,64,0),f.vertexAttribPointer(c+1,4,y,!1,64,16),f.vertexAttribPointer(c+2,4,y,!1,64,32),f.vertexAttribPointer(c+3,4,y,!1,64,48)}else if(void 0!==o){var S=o[s];if(void 0!==S)switch(S.length){case 2:f.vertexAttrib2fv(c,S);break;case 3:f.vertexAttrib3fv(c,S);break;case 4:f.vertexAttrib4fv(c,S);break;default:f.vertexAttrib1fv(c,S)}}}}v.disableUnusedAttributes()}(r,n,i,s),null!==l&&f.bindBuffer(34963,u.buffer));var y=null!==l?l.count:h.count,x=n.drawRange.start*p,b=n.drawRange.count*p,M=null!==a?a.start*p:0,S=null!==a?a.count*p:1/0,T=Math.max(x,M),E=Math.min(y,x+b,M+S)-1,A=Math.max(0,E-T+1);if(0!==A){if(r.isMesh)!0===i.wireframe?(v.setLineWidth(i.wireframeLinewidth*se()),d.setMode(1)):d.setMode(4);else if(r.isLine){var C=i.linewidth;void 0===C&&(C=1),v.setLineWidth(C*se()),r.isLineSegments?d.setMode(1):r.isLineLoop?d.setMode(2):d.setMode(3)}else r.isPoints?d.setMode(0):r.isSprite&&d.setMode(4);r.isInstancedMesh?d.renderInstances(n,T,A,r.count):n.isInstancedBufferGeometry?d.renderInstances(n,T,A,n.maxInstancedCount):d.render(T,A)}},this.compile=function(e,t){(d=E.get(e,t)).init(),e.traverse(function(e){e.isLight&&(d.pushLight(e),e.castShadow&&d.pushShadow(e))}),d.setupLights(t);var n={};e.traverse(function(t){if(t.material)if(Array.isArray(t.material))for(var i=0;i=0&&e.numSupportedMorphTargets++}if(e.morphNormals){e.numSupportedMorphNormals=0;for(p=0;p=0&&e.numSupportedMorphNormals++}var f=i.uniforms;(e.isShaderMaterial||e.isRawShaderMaterial)&&!0!==e.clipping||(i.numClippingPlanes=ne.numPlanes,i.numIntersection=ne.numIntersection,f.clippingPlanes=ne.uniform),i.fog=t.fog,i.needsLights=function(e){return e.isMeshLambertMaterial||e.isMeshToonMaterial||e.isMeshPhongMaterial||e.isMeshStandardMaterial||e.isShadowMaterial||e.isShaderMaterial&&!0===e.lights}(e),i.lightsStateVersion=o,i.needsLights&&(f.ambientLightColor.value=r.state.ambient,f.lightProbe.value=r.state.probe,f.directionalLights.value=r.state.directional,f.directionalLightShadows.value=r.state.directionalShadow,f.spotLights.value=r.state.spot,f.spotLightShadows.value=r.state.spotShadow,f.rectAreaLights.value=r.state.rectArea,f.pointLights.value=r.state.point,f.pointLightShadows.value=r.state.pointShadow,f.hemisphereLights.value=r.state.hemi,f.directionalShadowMap.value=r.state.directionalShadowMap,f.directionalShadowMatrix.value=r.state.directionalShadowMatrix,f.spotShadowMap.value=r.state.spotShadowMap,f.spotShadowMatrix.value=r.state.spotShadowMatrix,f.pointShadowMap.value=r.state.pointShadowMap,f.pointShadowMatrix.value=r.state.pointShadowMatrix);var m=i.program.getUniforms(),g=eo.seqWithValue(m.seq,f);i.uniformsList=g}function Ee(e,t,n,i){b.resetTextureUnits();var r=t.fog,a=n.isMeshStandardMaterial?t.environment:null,o=x.get(n),s=d.state.lights;if(ie&&(re||e!==H)){var l=e===H&&n.id===U;ne.setState(n.clippingPlanes,n.clipIntersection,n.clipShadows,e,o,l)}n.version===o.__version?void 0===o.program?Se(n,t,i):n.fog&&o.fog!==r?Se(n,t,i):o.environment!==a?Se(n,t,i):o.needsLights&&o.lightsStateVersion!==s.state.version?Se(n,t,i):void 0===o.numClippingPlanes||o.numClippingPlanes===ne.numPlanes&&o.numIntersection===ne.numIntersection?o.outputEncoding!==O.outputEncoding&&Se(n,t,i):Se(n,t,i):(Se(n,t,i),o.__version=n.version);var h,u,p=!1,m=!1,y=!1,_=o.program,w=_.getUniforms(),M=o.uniforms;if(v.useProgram(_.program)&&(p=!0,m=!0,y=!0),n.id!==U&&(U=n.id,m=!0),p||H!==e){if(w.setValue(f,"projectionMatrix",e.projectionMatrix),g.logarithmicDepthBuffer&&w.setValue(f,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),H!==e&&(H=e,m=!0,y=!0),n.isShaderMaterial||n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshStandardMaterial||n.envMap){var S=w.map.cameraPosition;void 0!==S&&S.setValue(f,oe.setFromMatrixPosition(e.matrixWorld))}(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial)&&w.setValue(f,"isOrthographic",!0===e.isOrthographicCamera),(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial||n.skinning)&&w.setValue(f,"viewMatrix",e.matrixWorldInverse)}if(n.skinning){w.setOptional(f,i,"bindMatrix"),w.setOptional(f,i,"bindMatrixInverse");var T=i.skeleton;if(T){var E=T.bones;if(g.floatVertexTextures){if(void 0===T.boneTexture){var A=Math.sqrt(4*E.length);A=Wt.ceilPowerOfTwo(A),A=Math.max(A,4);var L=new Float32Array(A*A*4);L.set(T.boneMatrices);var R=new Nr(L,A,A,Te,ve);T.boneMatrices=L,T.boneTexture=R,T.boneTextureSize=A}w.setValue(f,"boneTexture",T.boneTexture,b),w.setValue(f,"boneTextureSize",T.boneTextureSize)}else w.setOptional(f,T,"boneMatrices")}}return(m||o.receiveShadow!==i.receiveShadow)&&(o.receiveShadow=i.receiveShadow,w.setValue(f,"receiveShadow",i.receiveShadow)),m&&(w.setValue(f,"toneMappingExposure",O.toneMappingExposure),w.setValue(f,"toneMappingWhitePoint",O.toneMappingWhitePoint),o.needsLights&&(u=y,(h=M).ambientLightColor.needsUpdate=u,h.lightProbe.needsUpdate=u,h.directionalLights.needsUpdate=u,h.directionalLightShadows.needsUpdate=u,h.pointLights.needsUpdate=u,h.pointLightShadows.needsUpdate=u,h.spotLights.needsUpdate=u,h.spotLightShadows.needsUpdate=u,h.rectAreaLights.needsUpdate=u,h.hemisphereLights.needsUpdate=u),r&&n.fog&&function(e,t){e.fogColor.value.copy(t.color),t.isFog?(e.fogNear.value=t.near,e.fogFar.value=t.far):t.isFogExp2&&(e.fogDensity.value=t.density)}(M,r),n.isMeshBasicMaterial?Ae(M,n):n.isMeshLambertMaterial?(Ae(M,n),function(e,t){t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap)}(M,n)):n.isMeshToonMaterial?(Ae(M,n),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4),t.gradientMap&&(e.gradientMap.value=t.gradientMap);t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap);t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,t.side===c&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),t.side===c&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(M,n)):n.isMeshPhongMaterial?(Ae(M,n),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4),t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap);t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,t.side===c&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),t.side===c&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(M,n)):n.isMeshStandardMaterial?(Ae(M,n,a),n.isMeshPhysicalMaterial?function(e,t,n){Le(e,t,n),e.reflectivity.value=t.reflectivity,e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.sheen&&e.sheen.value.copy(t.sheen);t.clearcoatNormalMap&&(e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),e.clearcoatNormalMap.value=t.clearcoatNormalMap,t.side===c&&e.clearcoatNormalScale.value.negate());e.transparency.value=t.transparency}(M,n,a):Le(M,n,a)):n.isMeshMatcapMaterial?(Ae(M,n),function(e,t){t.matcap&&(e.matcap.value=t.matcap);t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,t.side===c&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),t.side===c&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(M,n)):n.isMeshDepthMaterial?(Ae(M,n),function(e,t){t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(M,n)):n.isMeshDistanceMaterial?(Ae(M,n),function(e,t){t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias);e.referencePosition.value.copy(t.referencePosition),e.nearDistance.value=t.nearDistance,e.farDistance.value=t.farDistance}(M,n)):n.isMeshNormalMaterial?(Ae(M,n),function(e,t){t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,t.side===c&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),t.side===c&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(M,n)):n.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity}(M,n),n.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(M,n)):n.isPointsMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*Z,e.scale.value=.5*Y,t.map&&(e.map.value=t.map);t.alphaMap&&(e.alphaMap.value=t.alphaMap);var n;t.map?n=t.map:t.alphaMap&&(n=t.alphaMap);void 0!==n&&(!0===n.matrixAutoUpdate&&n.updateMatrix(),e.uvTransform.value.copy(n.matrix))}(M,n):n.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map);t.alphaMap&&(e.alphaMap.value=t.alphaMap);var n;t.map?n=t.map:t.alphaMap&&(n=t.alphaMap);void 0!==n&&(!0===n.matrixAutoUpdate&&n.updateMatrix(),e.uvTransform.value.copy(n.matrix))}(M,n):n.isShadowMaterial&&(M.color.value.copy(n.color),M.opacity.value=n.opacity),void 0!==M.ltc_1&&(M.ltc_1.value=Ur.LTC_1),void 0!==M.ltc_2&&(M.ltc_2.value=Ur.LTC_2),eo.upload(f,o.uniformsList,M,b),n.isShaderMaterial&&(n.uniformsNeedUpdate=!1)),n.isShaderMaterial&&!0===n.uniformsNeedUpdate&&(eo.upload(f,o.uniformsList,M,b),n.uniformsNeedUpdate=!1),n.isSpriteMaterial&&w.setValue(f,"center",i.center),w.setValue(f,"modelViewMatrix",i.modelViewMatrix),w.setValue(f,"normalMatrix",i.normalMatrix),w.setValue(f,"modelMatrix",i.matrixWorld),_}function Ae(e,t,n){e.opacity.value=t.opacity,t.color&&e.diffuse.value.copy(t.color),t.emissive&&e.emissive.value.copy(t.emissive).multiplyScalar(t.emissiveIntensity),t.map&&(e.map.value=t.map),t.alphaMap&&(e.alphaMap.value=t.alphaMap),t.specularMap&&(e.specularMap.value=t.specularMap);var i,r,a=t.envMap||n;a&&(e.envMap.value=a,e.flipEnvMap.value=a.isCubeTexture?-1:1,e.reflectivity.value=t.reflectivity,e.refractionRatio.value=t.refractionRatio,e.maxMipLevel.value=x.get(a).__maxMipLevel),t.lightMap&&(e.lightMap.value=t.lightMap,e.lightMapIntensity.value=t.lightMapIntensity),t.aoMap&&(e.aoMap.value=t.aoMap,e.aoMapIntensity.value=t.aoMapIntensity),t.map?i=t.map:t.specularMap?i=t.specularMap:t.displacementMap?i=t.displacementMap:t.normalMap?i=t.normalMap:t.bumpMap?i=t.bumpMap:t.roughnessMap?i=t.roughnessMap:t.metalnessMap?i=t.metalnessMap:t.alphaMap?i=t.alphaMap:t.emissiveMap&&(i=t.emissiveMap),void 0!==i&&(i.isWebGLRenderTarget&&(i=i.texture),!0===i.matrixAutoUpdate&&i.updateMatrix(),e.uvTransform.value.copy(i.matrix)),t.aoMap?r=t.aoMap:t.lightMap&&(r=t.lightMap),void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),!0===r.matrixAutoUpdate&&r.updateMatrix(),e.uv2Transform.value.copy(r.matrix))}function Le(e,t,n){e.roughness.value=t.roughness,e.metalness.value=t.metalness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap),t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap),t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap),t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,t.side===c&&(e.bumpScale.value*=-1)),t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),t.side===c&&e.normalScale.value.negate()),t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias),(t.envMap||n)&&(e.envMapIntensity.value=t.envMapIntensity)}_e.setAnimationLoop(function(e){he.isPresenting||be&&be(e)}),"undefined"!=typeof window&&_e.setContext(window),this.setAnimationLoop=function(e){be=e,he.setAnimationLoop(e),_e.start()},this.render=function(e,t){var n,i;if(void 0!==arguments[2]&&(console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead."),n=arguments[2]),void 0!==arguments[3]&&(console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead."),i=arguments[3]),t&&t.isCamera){if(!D){G.geometry=null,G.program=null,G.wireframe=!1,U=-1,H=null,!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld(),he.enabled&&he.isPresenting&&(t=he.getCamera(t)),(d=E.get(e,t)).init(),e.onBeforeRender(O,e,t,n||z),ae.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),te.setFromProjectionMatrix(ae),re=this.localClippingEnabled,ie=ne.init(this.clippingPlanes,re,t),(p=T.get(e,t)).init(),function e(t,n,i,r){if(!1===t.visible)return;var a=t.layers.test(n.layers);if(a)if(t.isGroup)i=t.renderOrder;else if(t.isLOD)!0===t.autoUpdate&&t.update(n);else if(t.isLight)d.pushLight(t),t.castShadow&&d.pushShadow(t);else if(t.isSprite){if(!t.frustumCulled||te.intersectsSprite(t)){r&&oe.setFromMatrixPosition(t.matrixWorld).applyMatrix4(ae);var o=M.update(t),s=t.material;s.visible&&p.push(t,o,s,i,oe.z,null)}}else if(t.isImmediateRenderObject)r&&oe.setFromMatrixPosition(t.matrixWorld).applyMatrix4(ae),p.push(t,null,t.material,i,oe.z,null);else if((t.isMesh||t.isLine||t.isPoints)&&(t.isSkinnedMesh&&t.skeleton.frame!==y.render.frame&&(t.skeleton.update(),t.skeleton.frame=y.render.frame),!t.frustumCulled||te.intersectsObject(t))){r&&oe.setFromMatrixPosition(t.matrixWorld).applyMatrix4(ae);var o=M.update(t),s=t.material;if(Array.isArray(s))for(var c=o.groups,l=0,h=c.length;l=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&f.readPixels(t,n,i,r,C.convert(h),C.convert(u),a):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{c&&f.bindFramebuffer(36160,F)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")},this.copyFramebufferToTexture=function(e,t,n){void 0===n&&(n=0);var i=Math.pow(2,-n),r=Math.floor(t.image.width*i),a=Math.floor(t.image.height*i),o=C.convert(t.format);b.setTexture2D(t,0),f.copyTexImage2D(3553,n,o,e.x,e.y,r,a,0),v.unbindTexture()},this.copyTextureToTexture=function(e,t,n,i){var r=t.image.width,a=t.image.height,o=C.convert(n.format),s=C.convert(n.type);b.setTexture2D(n,0),t.isDataTexture?f.texSubImage2D(3553,i||0,e.x,e.y,r,a,o,s,t.image.data):f.texSubImage2D(3553,i||0,e.x,e.y,o,s,t.image),v.unbindTexture()},this.initTexture=function(e){b.setTexture2D(e,0),v.unbindTexture()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function ko(e,t){this.name="",this.color=new _i(e),this.density=void 0!==t?t:25e-5}function jo(e,t,n){this.name="",this.color=new _i(e),this.near=void 0!==t?t:1,this.far=void 0!==n?n:1e3}function Wo(e,t){this.array=e,this.stride=t,this.count=void 0!==e?e.length/t:0,this.usage=Ut,this.updateRange={offset:0,count:-1},this.version=0}Uo.prototype=Object.assign(Object.create(Pr.prototype),{constructor:Uo,isArrayCamera:!0}),Go.prototype=Object.assign(Object.create(Pn.prototype),{constructor:Go,isGroup:!0}),Object.assign(Ho.prototype,Ht.prototype),Object.assign(ko.prototype,{isFogExp2:!0,clone:function(){return new ko(this.color,this.density)},toJSON:function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}),Object.assign(jo.prototype,{isFog:!0,clone:function(){return new jo(this.color,this.near,this.far)},toJSON:function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}),Object.defineProperty(Wo.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Object.assign(Wo.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setUsage:function(e){return this.usage=e,this},copy:function(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.usage=e.usage,this},copyAt:function(e,t,n){e*=this.stride,n*=t.stride;for(var i=0,r=this.stride;ie.far||t.push({distance:s,point:Jo.clone(),uv:vi.getUV(Jo,ns,is,rs,as,os,ss,new qt),face:null,object:this})}},clone:function(){return new this.constructor(this.material).copy(this)},copy:function(e){return Pn.prototype.copy.call(this,e),void 0!==e.center&&this.center.copy(e.center),this}});var hs=new rn,us=new rn;function ps(){Pn.call(this),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}function ds(e,t){e&&e.isGeometry&&console.error("THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead."),dr.call(this,e,t),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new pn,this.bindMatrixInverse=new pn}ps.prototype=Object.assign(Object.create(Pn.prototype),{constructor:ps,isLOD:!0,copy:function(e){Pn.prototype.copy.call(this,e,!1);for(var t=e.levels,n=0,i=t.length;n0){for(var n=1,i=t.length;n0){hs.setFromMatrixPosition(this.matrixWorld);var n=e.ray.origin.distanceTo(hs);this.getObjectForDistance(n).raycast(e,t)}},update:function(e){var t=this.levels;if(t.length>1){hs.setFromMatrixPosition(e.matrixWorld),us.setFromMatrixPosition(this.matrixWorld);var n=hs.distanceTo(us)/e.zoom;t[0].object.visible=!0;for(var i=1,r=t.length;i=t[i].distance;i++)t[i-1].object.visible=!1,t[i].object.visible=!0;for(this._currentLevel=i-1;i0&&(bs[0].instanceId=r,bs[0].object=this,t.push(bs[0]),bs.length=0)},setMatrixAt:function(e,t){t.toArray(this.instanceMatrix.array,16*e)},updateMorphTargets:function(){}}),Ms.prototype=Object.create(Ai.prototype),Ms.prototype.constructor=Ms,Ms.prototype.isLineBasicMaterial=!0,Ms.prototype.copy=function(e){return Ai.prototype.copy.call(this,e),this.color.copy(e.color),this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this};var Ss=new rn,Ts=new rn,Es=new pn,As=new ni,Ls=new Yn;function Rs(e,t,n){1===n&&console.error("THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead."),Pn.call(this),this.type="Line",this.geometry=void 0!==e?e:new Zi,this.material=void 0!==t?t:new Ms}Rs.prototype=Object.assign(Object.create(Pn.prototype),{constructor:Rs,isLine:!0,computeLineDistances:function(){var e=this.geometry;if(e.isBufferGeometry)if(null===e.index){for(var t=e.attributes.position,n=[0],i=1,r=t.count;io))h.applyMatrix4(this.matrixWorld),(_=e.ray.origin.distanceTo(h))e.far||t.push({distance:_,point:l.clone().applyMatrix4(this.matrixWorld),index:m,face:null,faceIndex:null,object:this})}else for(m=0,g=d.length/3-1;mo))h.applyMatrix4(this.matrixWorld),(_=e.ray.origin.distanceTo(h))e.far||t.push({distance:_,point:l.clone().applyMatrix4(this.matrixWorld),index:m,face:null,faceIndex:null,object:this})}}else if(n.isGeometry){var x=n.vertices,b=x.length;for(m=0;mo))h.applyMatrix4(this.matrixWorld),(_=e.ray.origin.distanceTo(h))e.far||t.push({distance:_,point:l.clone().applyMatrix4(this.matrixWorld),index:m,face:null,faceIndex:null,object:this})}}}},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}});var Ps=new rn,Cs=new rn;function Os(e,t){Rs.call(this,e,t),this.type="LineSegments"}function Ds(e,t){Rs.call(this,e,t),this.type="LineLoop"}function Is(e){Ai.call(this),this.type="PointsMaterial",this.color=new _i(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.morphTargets=!1,this.setValues(e)}Os.prototype=Object.assign(Object.create(Rs.prototype),{constructor:Os,isLineSegments:!0,computeLineDistances:function(){var e=this.geometry;if(e.isBufferGeometry)if(null===e.index){for(var t=e.attributes.position,n=[],i=0,r=t.count;ir.far)return;a.push({distance:l,distanceToRay:Math.sqrt(s),point:c,index:t,face:null,object:o})}}function Hs(e,t,n,i,r,a,o,s,c){Jt.call(this,e,t,n,i,r,a,o,s,c),this.format=void 0!==o?o:Se,this.minFilter=void 0!==a?a:ce,this.magFilter=void 0!==r?r:ce,this.generateMipmaps=!1}function Vs(e,t,n,i,r,a,o,s,c,l,h,u){Jt.call(this,null,a,o,s,c,l,i,r,h,u),this.image={width:t,height:n},this.mipmaps=e,this.flipY=!1,this.generateMipmaps=!1}function ks(e,t,n,i,r,a,o,s,c){Jt.call(this,e,t,n,i,r,a,o,s,c),this.needsUpdate=!0}function js(e,t,n,i,r,a,o,s,c,l){if((l=void 0!==l?l:Re)!==Re&&l!==Pe)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===n&&l===Re&&(n=fe),void 0===n&&l===Pe&&(n=we),Jt.call(this,null,i,r,a,o,s,l,n,c),this.image={width:e,height:t},this.magFilter=void 0!==o?o:ae,this.minFilter=void 0!==s?s:ae,this.flipY=!1,this.generateMipmaps=!1}function Ws(e){Zi.call(this),this.type="WireframeGeometry";var t,n,i,r,a,o,s,c,l,h,u=[],p=[0,0],d={},f=["a","b","c"];if(e&&e.isGeometry){var m=e.faces;for(t=0,i=m.length;t=0?(e(g-1e-5,m,u),p.subVectors(h,u)):(e(g+1e-5,m,u),p.subVectors(u,h)),m-1e-5>=0?(e(g,m-1e-5,u),d.subVectors(h,u)):(e(g,m+1e-5,u),d.subVectors(u,h)),l.crossVectors(p,d).normalize(),s.push(l.x,l.y,l.z),c.push(g,m)}}for(i=0;i.9&&o<.1&&(t<.2&&(a[e+0]+=1),n<.2&&(a[e+2]+=1),i<.2&&(a[e+4]+=1))}}()}(),this.setAttribute("position",new Fi(r,3)),this.setAttribute("normal",new Fi(r.slice(),3)),this.setAttribute("uv",new Fi(a,2)),0===i?this.computeVertexNormals():this.normalizeNormals()}function Js(e,t){br.call(this),this.type="TetrahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new Qs(e,t)),this.mergeVertices()}function Qs(e,t){Zs.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],e,t),this.type="TetrahedronBufferGeometry",this.parameters={radius:e,detail:t}}function Ks(e,t){br.call(this),this.type="OctahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new $s(e,t)),this.mergeVertices()}function $s(e,t){Zs.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],e,t),this.type="OctahedronBufferGeometry",this.parameters={radius:e,detail:t}}function ec(e,t){br.call(this),this.type="IcosahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new tc(e,t)),this.mergeVertices()}function tc(e,t){var n=(1+Math.sqrt(5))/2,i=[-1,n,0,1,n,0,-1,-n,0,1,-n,0,0,-1,n,0,1,n,0,-1,-n,0,1,-n,n,0,-1,n,0,1,-n,0,-1,-n,0,1];Zs.call(this,i,[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],e,t),this.type="IcosahedronBufferGeometry",this.parameters={radius:e,detail:t}}function nc(e,t){br.call(this),this.type="DodecahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new ic(e,t)),this.mergeVertices()}function ic(e,t){var n=(1+Math.sqrt(5))/2,i=1/n,r=[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-i,-n,0,-i,n,0,i,-n,0,i,n,-i,-n,0,-i,n,0,i,-n,0,i,n,0,-n,0,-i,n,0,-i,-n,0,i,n,0,i];Zs.call(this,r,[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],e,t),this.type="DodecahedronBufferGeometry",this.parameters={radius:e,detail:t}}function rc(e,t,n,i,r,a){br.call(this),this.type="TubeGeometry",this.parameters={path:e,tubularSegments:t,radius:n,radialSegments:i,closed:r},void 0!==a&&console.warn("THREE.TubeGeometry: taper has been removed.");var o=new ac(e,t,n,i,r);this.tangents=o.tangents,this.normals=o.normals,this.binormals=o.binormals,this.fromBufferGeometry(o),this.mergeVertices()}function ac(e,t,n,i,r){Zi.call(this),this.type="TubeBufferGeometry",this.parameters={path:e,tubularSegments:t,radius:n,radialSegments:i,closed:r},t=t||64,n=n||1,i=i||8,r=r||!1;var a=e.computeFrenetFrames(t,r);this.tangents=a.tangents,this.normals=a.normals,this.binormals=a.binormals;var o,s,c=new rn,l=new rn,h=new qt,u=new rn,p=[],d=[],f=[],m=[];function g(r){u=e.getPointAt(r/t,u);var o=a.normals[r],h=a.binormals[r];for(s=0;s<=i;s++){var f=s/i*Math.PI*2,m=Math.sin(f),g=-Math.cos(f);l.x=g*o.x+m*h.x,l.y=g*o.y+m*h.y,l.z=g*o.z+m*h.z,l.normalize(),d.push(l.x,l.y,l.z),c.x=u.x+n*l.x,c.y=u.y+n*l.y,c.z=u.z+n*l.z,p.push(c.x,c.y,c.z)}}!function(){for(o=0;o0){var o=r[a[0]];if(void 0!==o)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},e=0,t=o.length;e0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),Hs.prototype=Object.assign(Object.create(Jt.prototype),{constructor:Hs,isVideoTexture:!0,update:function(){var e=this.image;e.readyState>=e.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}),Vs.prototype=Object.create(Jt.prototype),Vs.prototype.constructor=Vs,Vs.prototype.isCompressedTexture=!0,ks.prototype=Object.create(Jt.prototype),ks.prototype.constructor=ks,ks.prototype.isCanvasTexture=!0,js.prototype=Object.create(Jt.prototype),js.prototype.constructor=js,js.prototype.isDepthTexture=!0,Ws.prototype=Object.create(Zi.prototype),Ws.prototype.constructor=Ws,qs.prototype=Object.create(br.prototype),qs.prototype.constructor=qs,Xs.prototype=Object.create(Zi.prototype),Xs.prototype.constructor=Xs,Ys.prototype=Object.create(br.prototype),Ys.prototype.constructor=Ys,Zs.prototype=Object.create(Zi.prototype),Zs.prototype.constructor=Zs,Js.prototype=Object.create(br.prototype),Js.prototype.constructor=Js,Qs.prototype=Object.create(Zs.prototype),Qs.prototype.constructor=Qs,Ks.prototype=Object.create(br.prototype),Ks.prototype.constructor=Ks,$s.prototype=Object.create(Zs.prototype),$s.prototype.constructor=$s,ec.prototype=Object.create(br.prototype),ec.prototype.constructor=ec,tc.prototype=Object.create(Zs.prototype),tc.prototype.constructor=tc,nc.prototype=Object.create(br.prototype),nc.prototype.constructor=nc,ic.prototype=Object.create(Zs.prototype),ic.prototype.constructor=ic,rc.prototype=Object.create(br.prototype),rc.prototype.constructor=rc,ac.prototype=Object.create(Zi.prototype),ac.prototype.constructor=ac,ac.prototype.toJSON=function(){var e=Zi.prototype.toJSON.call(this);return e.path=this.parameters.path.toJSON(),e},oc.prototype=Object.create(br.prototype),oc.prototype.constructor=oc,sc.prototype=Object.create(Zi.prototype),sc.prototype.constructor=sc,cc.prototype=Object.create(br.prototype),cc.prototype.constructor=cc,lc.prototype=Object.create(Zi.prototype),lc.prototype.constructor=lc;var hc=function(e,t,n){n=n||2;var i,r,a,o,s,c,l,h=t&&t.length,u=h?t[0]*n:e.length,p=uc(e,0,u,n,!0),d=[];if(!p||p.next===p.prev)return d;if(h&&(p=function(e,t,n,i){var r,a,o,s,c,l=[];for(r=0,a=t.length;r80*n){i=a=e[0],r=o=e[1];for(var f=n;fa&&(a=s),c>o&&(o=c);l=0!==(l=Math.max(a-i,o-r))?1/l:0}return dc(p,d,n,i,r,l),d};function uc(e,t,n,i,r){var a,o;if(r===function(e,t,n,i){for(var r=0,a=t,o=n-i;a0)for(a=t;a=t;a-=i)o=Rc(a,e[a],e[a+1],o);return o&&Tc(o,o.next)&&(Pc(o),o=o.next),o}function pc(e,t){if(!e)return e;t||(t=e);var n,i=e;do{if(n=!1,i.steiner||!Tc(i,i.next)&&0!==Sc(i.prev,i,i.next))i=i.next;else{if(Pc(i),(i=t=i.prev)===i.next)break;n=!0}}while(n||i!==t);return t}function dc(e,t,n,i,r,a,o){if(e){!o&&a&&function(e,t,n,i){var r=e;do{null===r.z&&(r.z=bc(r.x,r.y,t,n,i)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==e);r.prevZ.nextZ=null,r.prevZ=null,function(e){var t,n,i,r,a,o,s,c,l=1;do{for(n=e,e=null,a=null,o=0;n;){for(o++,i=n,s=0,t=0;t0||c>0&&i;)0!==s&&(0===c||!i||n.z<=i.z)?(r=n,n=n.nextZ,s--):(r=i,i=i.nextZ,c--),a?a.nextZ=r:e=r,r.prevZ=a,a=r;n=i}a.nextZ=null,l*=2}while(o>1)}(r)}(e,i,r,a);for(var s,c,l=e;e.prev!==e.next;)if(s=e.prev,c=e.next,a?mc(e,i,r,a):fc(e))t.push(s.i/n),t.push(e.i/n),t.push(c.i/n),Pc(e),e=c.next,l=c.next;else if((e=c)===l){o?1===o?dc(e=gc(e,t,n),t,n,i,r,a,2):2===o&&vc(e,t,n,i,r,a):dc(pc(e),t,n,i,r,a,1);break}}}function fc(e){var t=e.prev,n=e,i=e.next;if(Sc(t,n,i)>=0)return!1;for(var r=e.next.next;r!==e.prev;){if(wc(t.x,t.y,n.x,n.y,i.x,i.y,r.x,r.y)&&Sc(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function mc(e,t,n,i){var r=e.prev,a=e,o=e.next;if(Sc(r,a,o)>=0)return!1;for(var s=r.xa.x?r.x>o.x?r.x:o.x:a.x>o.x?a.x:o.x,h=r.y>a.y?r.y>o.y?r.y:o.y:a.y>o.y?a.y:o.y,u=bc(s,c,t,n,i),p=bc(l,h,t,n,i),d=e.prevZ,f=e.nextZ;d&&d.z>=u&&f&&f.z<=p;){if(d!==e.prev&&d!==e.next&&wc(r.x,r.y,a.x,a.y,o.x,o.y,d.x,d.y)&&Sc(d.prev,d,d.next)>=0)return!1;if(d=d.prevZ,f!==e.prev&&f!==e.next&&wc(r.x,r.y,a.x,a.y,o.x,o.y,f.x,f.y)&&Sc(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(;d&&d.z>=u;){if(d!==e.prev&&d!==e.next&&wc(r.x,r.y,a.x,a.y,o.x,o.y,d.x,d.y)&&Sc(d.prev,d,d.next)>=0)return!1;d=d.prevZ}for(;f&&f.z<=p;){if(f!==e.prev&&f!==e.next&&wc(r.x,r.y,a.x,a.y,o.x,o.y,f.x,f.y)&&Sc(f.prev,f,f.next)>=0)return!1;f=f.nextZ}return!0}function gc(e,t,n){var i=e;do{var r=i.prev,a=i.next.next;!Tc(r,a)&&Ec(r,i,i.next,a)&&Ac(r,a)&&Ac(a,r)&&(t.push(r.i/n),t.push(i.i/n),t.push(a.i/n),Pc(i),Pc(i.next),i=e=a),i=i.next}while(i!==e);return i}function vc(e,t,n,i,r,a){var o=e;do{for(var s=o.next.next;s!==o.prev;){if(o.i!==s.i&&Mc(o,s)){var c=Lc(o,s);return o=pc(o,o.next),c=pc(c,c.next),dc(o,t,n,i,r,a),void dc(c,t,n,i,r,a)}s=s.next}o=o.next}while(o!==e)}function yc(e,t){return e.x-t.x}function xc(e,t){if(t=function(e,t){var n,i=t,r=e.x,a=e.y,o=-1/0;do{if(a<=i.y&&a>=i.next.y&&i.next.y!==i.y){var s=i.x+(a-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(s<=r&&s>o){if(o=s,s===r){if(a===i.y)return i;if(a===i.next.y)return i.next}n=i.x=i.x&&i.x>=h&&r!==i.x&&wc(an.x)&&Ac(i,e)&&(n=i,p=c),i=i.next;return n}(e,t)){var n=Lc(t,e);pc(n,n.next)}}function bc(e,t,n,i,r){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*r)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-i)*r)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function _c(e){var t=e,n=e;do{(t.x=0&&(e-o)*(i-s)-(n-o)*(t-s)>=0&&(n-o)*(a-s)-(r-o)*(i-s)>=0}function Mc(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){var n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&Ec(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}(e,t)&&Ac(e,t)&&Ac(t,e)&&function(e,t){var n=e,i=!1,r=(e.x+t.x)/2,a=(e.y+t.y)/2;do{n.y>a!=n.next.y>a&&n.next.y!==n.y&&r<(n.next.x-n.x)*(a-n.y)/(n.next.y-n.y)+n.x&&(i=!i),n=n.next}while(n!==e);return i}(e,t)}function Sc(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function Tc(e,t){return e.x===t.x&&e.y===t.y}function Ec(e,t,n,i){return!!(Tc(e,n)&&Tc(t,i)||Tc(e,i)&&Tc(n,t))||Sc(e,t,n)>0!=Sc(e,t,i)>0&&Sc(n,i,e)>0!=Sc(n,i,t)>0}function Ac(e,t){return Sc(e.prev,e,e.next)<0?Sc(e,t,e.next)>=0&&Sc(e,e.prev,t)>=0:Sc(e,t,e.prev)<0||Sc(e,e.next,t)<0}function Lc(e,t){var n=new Cc(e.i,e.x,e.y),i=new Cc(t.i,t.x,t.y),r=e.next,a=t.prev;return e.next=t,t.prev=e,n.next=r,r.prev=n,i.next=n,n.prev=i,a.next=i,i.prev=a,i}function Rc(e,t,n,i){var r=new Cc(e,t,n);return i?(r.next=i.next,r.prev=i,i.next.prev=r,i.next=r):(r.prev=r,r.next=r),r}function Pc(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Cc(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}var Oc={area:function(e){for(var t=e.length,n=0,i=t-1,r=0;r2&&e[t-1].equals(e[0])&&e.pop()}function Ic(e,t){for(var n=0;nNumber.EPSILON){var p=Math.sqrt(h),d=Math.sqrt(c*c+l*l),f=t.x-s/p,m=t.y+o/p,g=((n.x-l/d-f)*l-(n.y+c/d-m)*c)/(o*l-s*c),v=(i=f+o*g-e.x)*i+(r=m+s*g-e.y)*r;if(v<=2)return new qt(i,r);a=Math.sqrt(v/2)}else{var y=!1;o>Number.EPSILON?c>Number.EPSILON&&(y=!0):o<-Number.EPSILON?c<-Number.EPSILON&&(y=!0):Math.sign(s)===Math.sign(l)&&(y=!0),y?(i=-s,r=o,a=Math.sqrt(h)):(i=o,r=s,a=Math.sqrt(h/2))}return new qt(i/a,r/a)}for(var G=[],H=0,V=R.length,k=V-1,j=H+1;H=0;C--){for(D=C/d,I=h*Math.cos(D*Math.PI/2),O=u*Math.sin(D*Math.PI/2)+p,H=0,V=R.length;H=0;){n=H,(i=H-1)<0&&(i=e.length-1);var r=0,a=s+2*d;for(r=0;r0)&&f.push(w,M,T),(c!==n-1||l0&&v(!0),t>0&&v(!1)),this.setIndex(l),this.setAttribute("position",new Fi(h,3)),this.setAttribute("normal",new Fi(u,3)),this.setAttribute("uv",new Fi(p,2))}function $c(e,t,n,i,r,a,o){Qc.call(this,0,e,t,n,i,r,a,o),this.type="ConeGeometry",this.parameters={radius:e,height:t,radialSegments:n,heightSegments:i,openEnded:r,thetaStart:a,thetaLength:o}}function el(e,t,n,i,r,a,o){Kc.call(this,0,e,t,n,i,r,a,o),this.type="ConeBufferGeometry",this.parameters={radius:e,height:t,radialSegments:n,heightSegments:i,openEnded:r,thetaStart:a,thetaLength:o}}function tl(e,t,n,i){br.call(this),this.type="CircleGeometry",this.parameters={radius:e,segments:t,thetaStart:n,thetaLength:i},this.fromBufferGeometry(new nl(e,t,n,i)),this.mergeVertices()}function nl(e,t,n,i){Zi.call(this),this.type="CircleBufferGeometry",this.parameters={radius:e,segments:t,thetaStart:n,thetaLength:i},e=e||1,t=void 0!==t?Math.max(3,t):8,n=void 0!==n?n:0,i=void 0!==i?i:2*Math.PI;var r,a,o=[],s=[],c=[],l=[],h=new rn,u=new qt;for(s.push(0,0,0),c.push(0,0,1),l.push(.5,.5),a=0,r=3;a<=t;a++,r+=3){var p=n+a/t*i;h.x=e*Math.cos(p),h.y=e*Math.sin(p),s.push(h.x,h.y,h.z),c.push(0,0,1),u.x=(s[r]/e+1)/2,u.y=(s[r+1]/e+1)/2,l.push(u.x,u.y)}for(r=1;r<=t;r++)o.push(r,r+1,0);this.setIndex(o),this.setAttribute("position",new Fi(s,3)),this.setAttribute("normal",new Fi(c,3)),this.setAttribute("uv",new Fi(l,2))}Uc.prototype=Object.create(br.prototype),Uc.prototype.constructor=Uc,Gc.prototype=Object.create(Bc.prototype),Gc.prototype.constructor=Gc,Hc.prototype=Object.create(br.prototype),Hc.prototype.constructor=Hc,Vc.prototype=Object.create(Zi.prototype),Vc.prototype.constructor=Vc,kc.prototype=Object.create(br.prototype),kc.prototype.constructor=kc,jc.prototype=Object.create(Zi.prototype),jc.prototype.constructor=jc,Wc.prototype=Object.create(br.prototype),Wc.prototype.constructor=Wc,qc.prototype=Object.create(Zi.prototype),qc.prototype.constructor=qc,Xc.prototype=Object.create(br.prototype),Xc.prototype.constructor=Xc,Xc.prototype.toJSON=function(){var e=br.prototype.toJSON.call(this);return Zc(this.parameters.shapes,e)},Yc.prototype=Object.create(Zi.prototype),Yc.prototype.constructor=Yc,Yc.prototype.toJSON=function(){var e=Zi.prototype.toJSON.call(this);return Zc(this.parameters.shapes,e)},Jc.prototype=Object.create(Zi.prototype),Jc.prototype.constructor=Jc,Qc.prototype=Object.create(br.prototype),Qc.prototype.constructor=Qc,Kc.prototype=Object.create(Zi.prototype),Kc.prototype.constructor=Kc,$c.prototype=Object.create(Qc.prototype),$c.prototype.constructor=$c,el.prototype=Object.create(Kc.prototype),el.prototype.constructor=el,tl.prototype=Object.create(br.prototype),tl.prototype.constructor=tl,nl.prototype=Object.create(Zi.prototype),nl.prototype.constructor=nl;var il=Object.freeze({__proto__:null,WireframeGeometry:Ws,ParametricGeometry:qs,ParametricBufferGeometry:Xs,TetrahedronGeometry:Js,TetrahedronBufferGeometry:Qs,OctahedronGeometry:Ks,OctahedronBufferGeometry:$s,IcosahedronGeometry:ec,IcosahedronBufferGeometry:tc,DodecahedronGeometry:nc,DodecahedronBufferGeometry:ic,PolyhedronGeometry:Ys,PolyhedronBufferGeometry:Zs,TubeGeometry:rc,TubeBufferGeometry:ac,TorusKnotGeometry:oc,TorusKnotBufferGeometry:sc,TorusGeometry:cc,TorusBufferGeometry:lc,TextGeometry:Uc,TextBufferGeometry:Gc,SphereGeometry:Hc,SphereBufferGeometry:Vc,RingGeometry:kc,RingBufferGeometry:jc,PlaneGeometry:Vr,PlaneBufferGeometry:kr,LatheGeometry:Wc,LatheBufferGeometry:qc,ShapeGeometry:Xc,ShapeBufferGeometry:Yc,ExtrudeGeometry:Nc,ExtrudeBufferGeometry:Bc,EdgesGeometry:Jc,ConeGeometry:$c,ConeBufferGeometry:el,CylinderGeometry:Qc,CylinderBufferGeometry:Kc,CircleGeometry:tl,CircleBufferGeometry:nl,BoxGeometry:_r,BoxBufferGeometry:wr});function rl(e){Ai.call(this),this.type="ShadowMaterial",this.color=new _i(0),this.transparent=!0,this.setValues(e)}function al(e){Lr.call(this,e),this.type="RawShaderMaterial"}function ol(e){Ai.call(this),this.defines={STANDARD:""},this.type="MeshStandardMaterial",this.color=new _i(16777215),this.roughness=1,this.metalness=0,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new _i(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Nt,this.normalScale=new qt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.vertexTangents=!1,this.setValues(e)}function sl(e){ol.call(this),this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.reflectivity=.5,this.clearcoat=0,this.clearcoatRoughness=0,this.sheen=null,this.clearcoatNormalScale=new qt(1,1),this.clearcoatNormalMap=null,this.transparency=0,this.setValues(e)}function cl(e){Ai.call(this),this.type="MeshPhongMaterial",this.color=new _i(16777215),this.specular=new _i(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new _i(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Nt,this.normalScale=new qt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=G,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(e)}function ll(e){Ai.call(this),this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new _i(16777215),this.specular=new _i(1118481),this.shininess=30,this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new _i(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Nt,this.normalScale=new qt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(e)}function hl(e){Ai.call(this),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Nt,this.normalScale=new qt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(e)}function ul(e){Ai.call(this),this.type="MeshLambertMaterial",this.color=new _i(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new _i(0),this.emissiveIntensity=1,this.emissiveMap=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=G,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(e)}function pl(e){Ai.call(this),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new _i(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Nt,this.normalScale=new qt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(e)}function dl(e){Ms.call(this),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(e)}rl.prototype=Object.create(Ai.prototype),rl.prototype.constructor=rl,rl.prototype.isShadowMaterial=!0,rl.prototype.copy=function(e){return Ai.prototype.copy.call(this,e),this.color.copy(e.color),this},al.prototype=Object.create(Lr.prototype),al.prototype.constructor=al,al.prototype.isRawShaderMaterial=!0,ol.prototype=Object.create(Ai.prototype),ol.prototype.constructor=ol,ol.prototype.isMeshStandardMaterial=!0,ol.prototype.copy=function(e){return Ai.prototype.copy.call(this,e),this.defines={STANDARD:""},this.color.copy(e.color),this.roughness=e.roughness,this.metalness=e.metalness,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.roughnessMap=e.roughnessMap,this.metalnessMap=e.metalnessMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapIntensity=e.envMapIntensity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this.vertexTangents=e.vertexTangents,this},sl.prototype=Object.create(ol.prototype),sl.prototype.constructor=sl,sl.prototype.isMeshPhysicalMaterial=!0,sl.prototype.copy=function(e){return ol.prototype.copy.call(this,e),this.defines={STANDARD:"",PHYSICAL:""},this.reflectivity=e.reflectivity,this.clearcoat=e.clearcoat,this.clearcoatRoughness=e.clearcoatRoughness,e.sheen?this.sheen=(this.sheen||new _i).copy(e.sheen):this.sheen=null,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.transparency=e.transparency,this},cl.prototype=Object.create(Ai.prototype),cl.prototype.constructor=cl,cl.prototype.isMeshPhongMaterial=!0,cl.prototype.copy=function(e){return Ai.prototype.copy.call(this,e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},ll.prototype=Object.create(Ai.prototype),ll.prototype.constructor=ll,ll.prototype.isMeshToonMaterial=!0,ll.prototype.copy=function(e){return Ai.prototype.copy.call(this,e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.gradientMap=e.gradientMap,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},hl.prototype=Object.create(Ai.prototype),hl.prototype.constructor=hl,hl.prototype.isMeshNormalMaterial=!0,hl.prototype.copy=function(e){return Ai.prototype.copy.call(this,e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},ul.prototype=Object.create(Ai.prototype),ul.prototype.constructor=ul,ul.prototype.isMeshLambertMaterial=!0,ul.prototype.copy=function(e){return Ai.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},pl.prototype=Object.create(Ai.prototype),pl.prototype.constructor=pl,pl.prototype.isMeshMatcapMaterial=!0,pl.prototype.copy=function(e){return Ai.prototype.copy.call(this,e),this.defines={MATCAP:""},this.color.copy(e.color),this.matcap=e.matcap,this.map=e.map,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},dl.prototype=Object.create(Ms.prototype),dl.prototype.constructor=dl,dl.prototype.isLineDashedMaterial=!0,dl.prototype.copy=function(e){return Ms.prototype.copy.call(this,e),this.scale=e.scale,this.dashSize=e.dashSize,this.gapSize=e.gapSize,this};var fl=Object.freeze({__proto__:null,ShadowMaterial:rl,SpriteMaterial:Zo,RawShaderMaterial:al,ShaderMaterial:Lr,PointsMaterial:Is,MeshPhysicalMaterial:sl,MeshStandardMaterial:ol,MeshPhongMaterial:cl,MeshToonMaterial:ll,MeshNormalMaterial:hl,MeshLambertMaterial:ul,MeshDepthMaterial:Co,MeshDistanceMaterial:Oo,MeshBasicMaterial:Li,MeshMatcapMaterial:pl,LineDashedMaterial:dl,LineBasicMaterial:Ms,Material:Ai}),ml={arraySlice:function(e,t,n){return ml.isTypedArray(e)?new e.constructor(e.subarray(t,void 0!==n?n:e.length)):e.slice(t,n)},convertArray:function(e,t,n){return!e||!n&&e.constructor===t?e:"number"==typeof t.BYTES_PER_ELEMENT?new t(e):Array.prototype.slice.call(e)},isTypedArray:function(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)},getKeyframeOrder:function(e){for(var t=e.length,n=new Array(t),i=0;i!==t;++i)n[i]=i;return n.sort(function(t,n){return e[t]-e[n]}),n},sortedArray:function(e,t,n){for(var i=e.length,r=new e.constructor(i),a=0,o=0;o!==i;++a)for(var s=n[a]*t,c=0;c!==t;++c)r[o++]=e[s+c];return r},flattenJSON:function(e,t,n,i){for(var r=1,a=e[0];void 0!==a&&void 0===a[i];)a=e[r++];if(void 0!==a){var o=a[i];if(void 0!==o)if(Array.isArray(o))do{void 0!==(o=a[i])&&(t.push(a.time),n.push.apply(n,o)),a=e[r++]}while(void 0!==a);else if(void 0!==o.toArray)do{void 0!==(o=a[i])&&(t.push(a.time),o.toArray(n,n.length)),a=e[r++]}while(void 0!==a);else do{void 0!==(o=a[i])&&(t.push(a.time),n.push(o)),a=e[r++]}while(void 0!==a)}},subclip:function(e,t,n,i,r){r=r||30;var a=e.clone();a.name=t;for(var o=[],s=0;s=i)){h.push(c.times[p]);for(var f=0;fa.tracks[s].times[0]&&(m=a.tracks[s].times[0]);for(s=0;s=r)break e;var s=t[1];e=(r=t[--n-1]))break t}a=n,n=0}for(;n>>1;et;)--a;if(++a,0!==r||a!==i){r>=a&&(r=(a=Math.max(a,1))-1);var o=this.getValueSize();this.times=ml.arraySlice(n,r,a),this.values=ml.arraySlice(this.values,r*o,a*o)}return this},validate:function(){var e=!0,t=this.getValueSize();t-Math.floor(t)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),e=!1);var n=this.times,i=this.values,r=n.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),e=!1);for(var a=null,o=0;o!==r;o++){var s=n[o];if("number"==typeof s&&isNaN(s)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,o,s),e=!1;break}if(null!==a&&a>s){console.error("THREE.KeyframeTrack: Out of order keys.",this,o,s,a),e=!1;break}a=s}if(void 0!==i&&ml.isTypedArray(i)){o=0;for(var c=i.length;o!==c;++o){var l=i[o];if(isNaN(l)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,o,l),e=!1;break}}}return e},optimize:function(){for(var e=ml.arraySlice(this.times),t=ml.arraySlice(this.values),n=this.getValueSize(),i=2302===this.getInterpolation(),r=1,a=e.length-1,o=1;o0){e[r]=e[a];for(f=a*n,m=r*n,p=0;p!==n;++p)t[m+p]=t[f+p];++r}return r!==e.length?(this.times=ml.arraySlice(e,0,r),this.values=ml.arraySlice(t,0,r*n)):(this.times=e,this.values=t),this},clone:function(){var e=ml.arraySlice(this.times,0),t=ml.arraySlice(this.values,0),n=new(0,this.constructor)(this.name,e,t);return n.createInterpolant=this.createInterpolant,n}}),_l.prototype=Object.assign(Object.create(bl.prototype),{constructor:_l,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),wl.prototype=Object.assign(Object.create(bl.prototype),{constructor:wl,ValueTypeName:"color"}),Ml.prototype=Object.assign(Object.create(bl.prototype),{constructor:Ml,ValueTypeName:"number"}),Sl.prototype=Object.assign(Object.create(gl.prototype),{constructor:Sl,interpolate_:function(e,t,n,i){for(var r=this.resultBuffer,a=this.sampleValues,o=this.valueSize,s=e*o,c=(n-t)/(i-t),l=s+o;s!==l;s+=4)en.slerpFlat(r,0,a,s-o,a,s,c);return r}}),Tl.prototype=Object.assign(Object.create(bl.prototype),{constructor:Tl,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(e){return new Sl(this.times,this.values,this.getValueSize(),e)},InterpolantFactoryMethodSmooth:void 0}),El.prototype=Object.assign(Object.create(bl.prototype),{constructor:El,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),Al.prototype=Object.assign(Object.create(bl.prototype),{constructor:Al,ValueTypeName:"vector"}),Object.assign(Ll,{parse:function(e){for(var t=[],n=e.tracks,i=1/(e.fps||1),r=0,a=n.length;r!==a;++r)t.push(Rl(n[r]).scale(i));return new Ll(e.name,e.duration,t)},toJSON:function(e){for(var t=[],n=e.tracks,i={name:e.name,duration:e.duration,tracks:t,uuid:e.uuid},r=0,a=n.length;r!==a;++r)t.push(bl.toJSON(n[r]));return i},CreateFromMorphTargetSequence:function(e,t,n,i){for(var r=t.length,a=[],o=0;o1){var l=i[u=c[1]];l||(i[u]=l=[]),l.push(s)}}var h=[];for(var u in i)h.push(Ll.CreateFromMorphTargetSequence(u,i[u],t,n));return h},parseAnimation:function(e,t){if(!e)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;for(var n=function(e,t,n,i,r){if(0!==n.length){var a=[],o=[];ml.flattenJSON(n,a,o,i),0!==a.length&&r.push(new e(t,a,o))}},i=[],r=e.name||"default",a=e.length||-1,o=e.fps||30,s=e.hierarchy||[],c=0;c0||0===e.search(/^data\:image\/jpeg/);r.format=i?Se:Te,r.needsUpdate=!0,void 0!==t&&t(r)},n,i),r}}),Object.assign(Vl.prototype,{getPoint:function(){return console.warn("THREE.Curve: .getPoint() not implemented."),null},getPointAt:function(e,t){var n=this.getUtoTmapping(e);return this.getPoint(n,t)},getPoints:function(e){void 0===e&&(e=5);for(var t=[],n=0;n<=e;n++)t.push(this.getPoint(n/e));return t},getSpacedPoints:function(e){void 0===e&&(e=5);for(var t=[],n=0;n<=e;n++)t.push(this.getPointAt(n/e));return t},getLength:function(){var e=this.getLengths();return e[e.length-1]},getLengths:function(e){if(void 0===e&&(e=this.arcLengthDivisions),this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var t,n,i=[],r=this.getPoint(0),a=0;for(i.push(0),n=1;n<=e;n++)a+=(t=this.getPoint(n/e)).distanceTo(r),i.push(a),r=t;return this.cacheArcLengths=i,i},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()},getUtoTmapping:function(e,t){var n,i=this.getLengths(),r=0,a=i.length;n=t||e*i[a-1];for(var o,s=0,c=a-1;s<=c;)if((o=i[r=Math.floor(s+(c-s)/2)]-n)<0)s=r+1;else{if(!(o>0)){c=r;break}c=r-1}if(i[r=c]===n)return r/(a-1);var l=i[r];return(r+(n-l)/(i[r+1]-l))/(a-1)},getTangent:function(e){var t=e-1e-4,n=e+1e-4;t<0&&(t=0),n>1&&(n=1);var i=this.getPoint(t);return this.getPoint(n).clone().sub(i).normalize()},getTangentAt:function(e){var t=this.getUtoTmapping(e);return this.getTangent(t)},computeFrenetFrames:function(e,t){var n,i,r,a=new rn,o=[],s=[],c=[],l=new rn,h=new pn;for(n=0;n<=e;n++)i=n/e,o[n]=this.getTangentAt(i),o[n].normalize();s[0]=new rn,c[0]=new rn;var u=Number.MAX_VALUE,p=Math.abs(o[0].x),d=Math.abs(o[0].y),f=Math.abs(o[0].z);for(p<=u&&(u=p,a.set(1,0,0)),d<=u&&(u=d,a.set(0,1,0)),f<=u&&a.set(0,0,1),l.crossVectors(o[0],a).normalize(),s[0].crossVectors(o[0],l),c[0].crossVectors(o[0],s[0]),n=1;n<=e;n++)s[n]=s[n-1].clone(),c[n]=c[n-1].clone(),l.crossVectors(o[n-1],o[n]),l.length()>Number.EPSILON&&(l.normalize(),r=Math.acos(Wt.clamp(o[n-1].dot(o[n]),-1,1)),s[n].applyMatrix4(h.makeRotationAxis(l,r))),c[n].crossVectors(o[n],s[n]);if(!0===t)for(r=Math.acos(Wt.clamp(s[0].dot(s[e]),-1,1)),r/=e,o[0].dot(l.crossVectors(s[0],s[e]))>0&&(r=-r),n=1;n<=e;n++)s[n].applyMatrix4(h.makeRotationAxis(o[n],r*n)),c[n].crossVectors(o[n],s[n]);return{tangents:o,normals:s,binormals:c}},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.arcLengthDivisions=e.arcLengthDivisions,this},toJSON:function(){var e={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e},fromJSON:function(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}),kl.prototype=Object.create(Vl.prototype),kl.prototype.constructor=kl,kl.prototype.isEllipseCurve=!0,kl.prototype.getPoint=function(e,t){for(var n=t||new qt,i=2*Math.PI,r=this.aEndAngle-this.aStartAngle,a=Math.abs(r)i;)r-=i;r0?0:(Math.floor(Math.abs(h)/c)+1)*c:0===u&&h===c-1&&(h=c-2,u=1),this.closed||h>0?n=s[(h-1)%c]:(ql.subVectors(s[0],s[1]).add(s[0]),n=ql),i=s[h%c],r=s[(h+1)%c],this.closed||h+2i.length-2?i.length-1:a+1],h=i[a>i.length-3?i.length-1:a+2];return n.set(Ql(o,s.x,c.x,l.x,h.x),Ql(o,s.y,c.y,l.y,h.y)),n},oh.prototype.copy=function(e){Vl.prototype.copy.call(this,e),this.points=[];for(var t=0,n=e.points.length;t=t){var r=n[i]-t,a=this.curves[i],o=a.getLength(),s=0===o?0:1-r/o;return a.getPointAt(s)}i++}return null},getLength:function(){var e=this.getCurveLengths();return e[e.length-1]},updateArcLengths:function(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var e=[],t=0,n=0,i=this.curves.length;n1&&!n[n.length-1].equals(n[0])&&n.push(n[0]),n},copy:function(e){Vl.prototype.copy.call(this,e),this.curves=[];for(var t=0,n=e.curves.length;t0){var l=c.getPoint(0);l.equals(this.currentPoint)||this.lineTo(l.x,l.y)}this.curves.push(c);var h=c.getPoint(1);return this.currentPoint.copy(h),this},copy:function(e){return ch.prototype.copy.call(this,e),this.currentPoint.copy(e.currentPoint),this},toJSON:function(){var e=ch.prototype.toJSON.call(this);return e.currentPoint=this.currentPoint.toArray(),e},fromJSON:function(e){return ch.prototype.fromJSON.call(this,e),this.currentPoint.fromArray(e.currentPoint),this}}),hh.prototype=Object.assign(Object.create(lh.prototype),{constructor:hh,getPointsHoles:function(e){for(var t=[],n=0,i=this.holes.length;n0:i.vertexColors=e.vertexColors),void 0!==e.uniforms)for(var r in e.uniforms){var a=e.uniforms[r];switch(i.uniforms[r]={},a.type){case"t":i.uniforms[r].value=n(a.value);break;case"c":i.uniforms[r].value=(new _i).setHex(a.value);break;case"v2":i.uniforms[r].value=(new qt).fromArray(a.value);break;case"v3":i.uniforms[r].value=(new rn).fromArray(a.value);break;case"v4":i.uniforms[r].value=(new Qt).fromArray(a.value);break;case"m3":i.uniforms[r].value=(new Xt).fromArray(a.value);case"m4":i.uniforms[r].value=(new pn).fromArray(a.value);break;default:i.uniforms[r].value=a.value}}if(void 0!==e.defines&&(i.defines=e.defines),void 0!==e.vertexShader&&(i.vertexShader=e.vertexShader),void 0!==e.fragmentShader&&(i.fragmentShader=e.fragmentShader),void 0!==e.extensions)for(var o in e.extensions)i.extensions[o]=e.extensions[o];if(void 0!==e.shading&&(i.flatShading=1===e.shading),void 0!==e.size&&(i.size=e.size),void 0!==e.sizeAttenuation&&(i.sizeAttenuation=e.sizeAttenuation),void 0!==e.map&&(i.map=n(e.map)),void 0!==e.matcap&&(i.matcap=n(e.matcap)),void 0!==e.alphaMap&&(i.alphaMap=n(e.alphaMap)),void 0!==e.bumpMap&&(i.bumpMap=n(e.bumpMap)),void 0!==e.bumpScale&&(i.bumpScale=e.bumpScale),void 0!==e.normalMap&&(i.normalMap=n(e.normalMap)),void 0!==e.normalMapType&&(i.normalMapType=e.normalMapType),void 0!==e.normalScale){var s=e.normalScale;!1===Array.isArray(s)&&(s=[s,s]),i.normalScale=(new qt).fromArray(s)}return void 0!==e.displacementMap&&(i.displacementMap=n(e.displacementMap)),void 0!==e.displacementScale&&(i.displacementScale=e.displacementScale),void 0!==e.displacementBias&&(i.displacementBias=e.displacementBias),void 0!==e.roughnessMap&&(i.roughnessMap=n(e.roughnessMap)),void 0!==e.metalnessMap&&(i.metalnessMap=n(e.metalnessMap)),void 0!==e.emissiveMap&&(i.emissiveMap=n(e.emissiveMap)),void 0!==e.emissiveIntensity&&(i.emissiveIntensity=e.emissiveIntensity),void 0!==e.specularMap&&(i.specularMap=n(e.specularMap)),void 0!==e.envMap&&(i.envMap=n(e.envMap)),void 0!==e.envMapIntensity&&(i.envMapIntensity=e.envMapIntensity),void 0!==e.reflectivity&&(i.reflectivity=e.reflectivity),void 0!==e.refractionRatio&&(i.refractionRatio=e.refractionRatio),void 0!==e.lightMap&&(i.lightMap=n(e.lightMap)),void 0!==e.lightMapIntensity&&(i.lightMapIntensity=e.lightMapIntensity),void 0!==e.aoMap&&(i.aoMap=n(e.aoMap)),void 0!==e.aoMapIntensity&&(i.aoMapIntensity=e.aoMapIntensity),void 0!==e.gradientMap&&(i.gradientMap=n(e.gradientMap)),void 0!==e.clearcoatNormalMap&&(i.clearcoatNormalMap=n(e.clearcoatNormalMap)),void 0!==e.clearcoatNormalScale&&(i.clearcoatNormalScale=(new qt).fromArray(e.clearcoatNormalScale)),i},setTextures:function(e){return this.textures=e,this}});var Sh={decodeText:function(e){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(e);for(var t="",n=0,i=e.length;n0){var a=new Ul(new Cl(t));a.setCrossOrigin(this.crossOrigin);for(var o=0,s=e.length;o0?new ds(o,s):new dr(o,s);break;case"InstancedMesh":o=r(e.geometry),s=a(e.material);var c=e.count,l=e.instanceMatrix;(i=new ws(o,s,c)).instanceMatrix=new Pi(new Float32Array(l.array),16);break;case"LOD":i=new ps;break;case"Line":i=new Rs(r(e.geometry),a(e.material),e.mode);break;case"LineLoop":i=new Ds(r(e.geometry),a(e.material));break;case"LineSegments":i=new Os(r(e.geometry),a(e.material));break;case"PointCloud":case"Points":i=new Us(r(e.geometry),a(e.material));break;case"Sprite":i=new cs(a(e.material));break;case"Group":i=new Go;break;default:i=new Pn}if(i.uuid=e.uuid,void 0!==e.name&&(i.name=e.name),void 0!==e.matrix?(i.matrix.fromArray(e.matrix),void 0!==e.matrixAutoUpdate&&(i.matrixAutoUpdate=e.matrixAutoUpdate),i.matrixAutoUpdate&&i.matrix.decompose(i.position,i.quaternion,i.scale)):(void 0!==e.position&&i.position.fromArray(e.position),void 0!==e.rotation&&i.rotation.fromArray(e.rotation),void 0!==e.quaternion&&i.quaternion.fromArray(e.quaternion),void 0!==e.scale&&i.scale.fromArray(e.scale)),void 0!==e.castShadow&&(i.castShadow=e.castShadow),void 0!==e.receiveShadow&&(i.receiveShadow=e.receiveShadow),e.shadow&&(void 0!==e.shadow.bias&&(i.shadow.bias=e.shadow.bias),void 0!==e.shadow.radius&&(i.shadow.radius=e.shadow.radius),void 0!==e.shadow.mapSize&&i.shadow.mapSize.fromArray(e.shadow.mapSize),void 0!==e.shadow.camera&&(i.shadow.camera=this.parseObject(e.shadow.camera))),void 0!==e.visible&&(i.visible=e.visible),void 0!==e.frustumCulled&&(i.frustumCulled=e.frustumCulled),void 0!==e.renderOrder&&(i.renderOrder=e.renderOrder),void 0!==e.userData&&(i.userData=e.userData),void 0!==e.layers&&(i.layers.mask=e.layers),void 0!==e.children)for(var h=e.children,u=0;uNumber.EPSILON){if(l<0&&(o=t[a],c=-c,s=t[r],l=-l),e.ys.y)continue;if(e.y===o.y){if(e.x===o.x)return!0}else{var h=l*(e.x-o.x)-c*(e.y-o.y);if(0===h)return!0;if(h<0)continue;i=!i}}else{if(e.y!==o.y)continue;if(s.x<=e.x&&e.x<=o.x||o.x<=e.x&&e.x<=s.x)return!0}}return i}var r=Oc.isClockWise,a=this.subPaths;if(0===a.length)return[];if(!0===t)return n(a);var o,s,c,l=[];if(1===a.length)return s=a[0],(c=new hh).curves=s.curves,l.push(c),l;var h=!r(a[0].getPoints());h=e?!h:h;var u,p,d=[],f=[],m=[],g=0;f[g]=void 0,m[g]=[];for(var v=0,y=a.length;v1){for(var x=!1,b=[],_=0,w=f.length;_0&&(x||(m=d))}v=0;for(var L=f.length;v0){this.source.connect(this.filters[0]);for(var e=1,t=this.filters.length;e0){this.source.disconnect(this.filters[0]);for(var e=1,t=this.filters.length;e=.5)for(var a=0;a!==r;++a)e[t+a]=e[n+a]},_slerp:function(e,t,n,i){en.slerpFlat(e,t,e,t,e,n,i)},_lerp:function(e,t,n,i,r){for(var a=1-i,o=0;o!==r;++o){var s=t+o;e[s]=e[s]*a+e[n+o]*i}}});var cu=new RegExp("[\\[\\]\\.:\\/]","g"),lu="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",hu=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]"),uu=/(WCOD+)?/.source.replace("WCOD",lu),pu=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC","[^\\[\\]\\.:\\/]"),du=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),fu=new RegExp("^"+hu+uu+pu+du+"$"),mu=["material","materials","bones"];function gu(e,t,n){var i=n||vu.parseTrackName(t);this._targetGroup=e,this._bindings=e.subscribe_(t,i)}function vu(e,t,n){this.path=t,this.parsedPath=n||vu.parseTrackName(t),this.node=vu.findNode(e,this.parsedPath.nodeName)||e,this.rootNode=e}function yu(){this.uuid=Wt.generateUUID(),this._objects=Array.prototype.slice.call(arguments),this.nCachedObjects_=0;var e={};this._indicesByUUID=e;for(var t=0,n=arguments.length;t!==n;++t)e[arguments[t].uuid]=t;this._paths=[],this._parsedPaths=[],this._bindings=[],this._bindingsIndicesByPath={};var i=this;this.stats={objects:{get total(){return i._objects.length},get inUse(){return this.total-i.nCachedObjects_}},get bindingsPerObject(){return i._bindings.length}}}function xu(e,t,n){this._mixer=e,this._clip=t,this._localRoot=n||null;for(var i=t.tracks,r=i.length,a=new Array(r),o={endingStart:St,endingEnd:St},s=0;s!==r;++s){var c=i[s].createInterpolant(null);a[s]=c,c.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(r),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=Mt,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}function bu(e){this._root=e,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}function _u(e){"string"==typeof e&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),e=arguments[1]),this.value=e}function wu(e,t,n){Wo.call(this,e,t),this.meshPerAttribute=n||1}function Mu(e,t,n,i){this.ray=new ni(e,t),this.near=n||0,this.far=i||1/0,this.camera=null,this.layers=new gn,this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}},Object.defineProperties(this.params,{PointCloud:{get:function(){return console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."),this.Points}}})}function Su(e,t){return e.distance-t.distance}function Tu(e,t,n,i){if(e.layers.test(t.layers)&&e.raycast(t,n),!0===i)for(var r=e.children,a=0,o=r.length;a=t){var h=t++,u=e[h];n[u.uuid]=l,e[l]=u,n[c]=h,e[h]=s;for(var p=0,d=r;p!==d;++p){var f=i[p],m=f[h],g=f[l];f[l]=m,f[h]=g}}}this.nCachedObjects_=t},uncache:function(){for(var e=this._objects,t=e.length,n=this.nCachedObjects_,i=this._indicesByUUID,r=this._bindings,a=r.length,o=0,s=arguments.length;o!==s;++o){var c=arguments[o].uuid,l=i[c];if(void 0!==l)if(delete i[c],l0)for(var c=this._interpolants,l=this._propertyBindings,h=0,u=c.length;h!==u;++h)c[h].evaluate(o),l[h].accumulate(i,s)}else this._updateWeight(e)},_updateWeight:function(e){var t=0;if(this.enabled){t=this.weight;var n=this._weightInterpolant;if(null!==n){var i=n.evaluate(e)[0];t*=i,e>n.parameterPositions[1]&&(this.stopFading(),0===i&&(this.enabled=!1))}}return this._effectiveWeight=t,t},_updateTimeScale:function(e){var t=0;if(!this.paused){t=this.timeScale;var n=this._timeScaleInterpolant;if(null!==n)t*=n.evaluate(e)[0],e>n.parameterPositions[1]&&(this.stopWarping(),0===t?this.paused=!0:this.timeScale=t)}return this._effectiveTimeScale=t,t},_updateTime:function(e){var t=this.time+e,n=this._clip.duration,i=this.loop,r=this._loopCount,a=2202===i;if(0===e)return-1===r?t:a&&1==(1&r)?n-t:t;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));e:{if(t>=n)t=n;else{if(!(t<0)){this.time=t;break e}t=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=t,this._mixer.dispatchEvent({type:"finished",action:this,direction:e<0?-1:1})}}else{if(-1===r&&(e>=0?(r=0,this._setEndings(!0,0===this.repetitions,a)):this._setEndings(0===this.repetitions,!0,a)),t>=n||t<0){var o=Math.floor(t/n);t-=n*o,r+=Math.abs(o);var s=this.repetitions-r;if(s<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,t=e>0?n:0,this.time=t,this._mixer.dispatchEvent({type:"finished",action:this,direction:e>0?1:-1});else{if(1===s){var c=e<0;this._setEndings(c,!c,a)}else this._setEndings(!1,!1,a);this._loopCount=r,this.time=t,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:o})}}else this.time=t;if(a&&1==(1&r))return n-t}return t},_setEndings:function(e,t,n){var i=this._interpolantSettings;n?(i.endingStart=2401,i.endingEnd=2401):(i.endingStart=e?this.zeroSlopeAtStart?2401:St:2402,i.endingEnd=t?this.zeroSlopeAtEnd?2401:St:2402)},_scheduleFading:function(e,t,n){var i=this._mixer,r=i.time,a=this._weightInterpolant;null===a&&(a=i._lendControlInterpolant(),this._weightInterpolant=a);var o=a.parameterPositions,s=a.sampleValues;return o[0]=r,s[0]=t,o[1]=r+e,s[1]=n,this}}),bu.prototype=Object.assign(Object.create(Ht.prototype),{constructor:bu,_bindAction:function(e,t){var n=e._localRoot||this._root,i=e._clip.tracks,r=i.length,a=e._propertyBindings,o=e._interpolants,s=n.uuid,c=this._bindingsByRootAndName,l=c[s];void 0===l&&(l={},c[s]=l);for(var h=0;h!==r;++h){var u=i[h],p=u.name,d=l[p];if(void 0!==d)a[h]=d;else{if(void 0!==(d=a[h])){null===d._cacheIndex&&(++d.referenceCount,this._addInactiveBinding(d,s,p));continue}var f=t&&t._propertyBindings[h].binding.parsedPath;++(d=new su(vu.create(n,p,f),u.ValueTypeName,u.getValueSize())).referenceCount,this._addInactiveBinding(d,s,p),a[h]=d}o[h].resultBuffer=d.buffer}},_activateAction:function(e){if(!this._isActiveAction(e)){if(null===e._cacheIndex){var t=(e._localRoot||this._root).uuid,n=e._clip.uuid,i=this._actionsByClip[n];this._bindAction(e,i&&i.knownActions[0]),this._addInactiveAction(e,n,t)}for(var r=e._propertyBindings,a=0,o=r.length;a!==o;++a){var s=r[a];0==s.useCount++&&(this._lendBinding(s),s.saveOriginalState())}this._lendAction(e)}},_deactivateAction:function(e){if(this._isActiveAction(e)){for(var t=e._propertyBindings,n=0,i=t.length;n!==i;++n){var r=t[n];0==--r.useCount&&(r.restoreOriginalState(),this._takeBackBinding(r))}this._takeBackAction(e)}},_initMemoryManager:function(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;var e=this;this.stats={actions:{get total(){return e._actions.length},get inUse(){return e._nActiveActions}},bindings:{get total(){return e._bindings.length},get inUse(){return e._nActiveBindings}},controlInterpolants:{get total(){return e._controlInterpolants.length},get inUse(){return e._nActiveControlInterpolants}}}},_isActiveAction:function(e){var t=e._cacheIndex;return null!==t&&tthis.max.x||e.ythis.max.y)},containsBox:function(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y},getParameter:function(e,t){return void 0===t&&(console.warn("THREE.Box2: .getParameter() target is now required"),t=new qt),t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(e){return!(e.max.xthis.max.x||e.max.ythis.max.y)},clampPoint:function(e,t){return void 0===t&&(console.warn("THREE.Box2: .clampPoint() target is now required"),t=new qt),t.copy(e).clamp(this.min,this.max)},distanceToPoint:function(e){return Lu.copy(e).clamp(this.min,this.max).sub(e).length()},intersect:function(e){return this.min.max(e.min),this.max.min(e.max),this},union:function(e){return this.min.min(e.min),this.max.max(e.max),this},translate:function(e){return this.min.add(e),this.max.add(e),this},equals:function(e){return e.min.equals(this.min)&&e.max.equals(this.max)}});var Pu=new rn,Cu=new rn;function Ou(e,t){this.start=void 0!==e?e:new rn,this.end=void 0!==t?t:new rn}function Du(e){Pn.call(this),this.material=e,this.render=function(){}}Object.assign(Ou.prototype,{set:function(e,t){return this.start.copy(e),this.end.copy(t),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.start.copy(e.start),this.end.copy(e.end),this},getCenter:function(e){return void 0===e&&(console.warn("THREE.Line3: .getCenter() target is now required"),e=new rn),e.addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(e){return void 0===e&&(console.warn("THREE.Line3: .delta() target is now required"),e=new rn),e.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(e,t){return void 0===t&&(console.warn("THREE.Line3: .at() target is now required"),t=new rn),this.delta(t).multiplyScalar(e).add(this.start)},closestPointToPointParameter:function(e,t){Pu.subVectors(e,this.start),Cu.subVectors(this.end,this.start);var n=Cu.dot(Cu),i=Cu.dot(Pu)/n;return t&&(i=Wt.clamp(i,0,1)),i},closestPointToPoint:function(e,t,n){var i=this.closestPointToPointParameter(e,t);return void 0===n&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),n=new rn),this.delta(n).multiplyScalar(i).add(this.start)},applyMatrix4:function(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this},equals:function(e){return e.start.equals(this.start)&&e.end.equals(this.end)}}),Du.prototype=Object.create(Pn.prototype),Du.prototype.constructor=Du,Du.prototype.isImmediateRenderObject=!0;var Iu=new rn;function Nu(e,t){Pn.call(this),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.color=t;for(var n=new Zi,i=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1],r=0,a=1;r<32;r++,a++){var o=r/32*Math.PI*2,s=a/32*Math.PI*2;i.push(Math.cos(o),Math.sin(o),1,Math.cos(s),Math.sin(s),1)}n.setAttribute("position",new Fi(i,3));var c=new Ms({fog:!1});this.cone=new Os(n,c),this.add(this.cone),this.update()}Nu.prototype=Object.create(Pn.prototype),Nu.prototype.constructor=Nu,Nu.prototype.dispose=function(){this.cone.geometry.dispose(),this.cone.material.dispose()},Nu.prototype.update=function(){this.light.updateMatrixWorld();var e=this.light.distance?this.light.distance:1e3,t=e*Math.tan(this.light.angle);this.cone.scale.set(t,t,e),Iu.setFromMatrixPosition(this.light.target.matrixWorld),this.cone.lookAt(Iu),void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)};var Bu=new rn,zu=new pn,Fu=new pn;function Uu(e){for(var t=function e(t){var n=[];t&&t.isBone&&n.push(t);for(var i=0;i.99999)this.quaternion.set(0,0,0,1);else if(e.y<-.99999)this.quaternion.set(1,0,0,0);else{sp.set(e.z,0,-e.x).normalize();var t=Math.acos(e.y);this.quaternion.setFromAxisAngle(sp,t)}},cp.prototype.setLength=function(e,t,n){void 0===t&&(t=.2*e),void 0===n&&(n=.2*t),this.line.scale.set(1,Math.max(1e-4,e-t),1),this.line.updateMatrix(),this.cone.scale.set(n,t,n),this.cone.position.y=e,this.cone.updateMatrix()},cp.prototype.setColor=function(e){this.line.material.color.set(e),this.cone.material.color.set(e)},cp.prototype.copy=function(e){return Pn.prototype.copy.call(this,e,!1),this.line.copy(e.line),this.cone.copy(e.cone),this},cp.prototype.clone=function(){return(new this.constructor).copy(this)},lp.prototype=Object.create(Os.prototype),lp.prototype.constructor=lp;var hp=4,up=8,pp=Math.pow(2,up),dp=[.125,.215,.35,.446,.526,.582],fp=up-hp+1+dp.length,mp=20,gp={};gp[Tt]=0,gp[Et]=1,gp[Lt]=2,gp[Pt]=3,gp[Ct]=4,gp[Ot]=5,gp[At]=6;var vp,yp,xp,bp,_p=new yh,wp=(vp=mp,yp=new Float32Array(vp),xp=new rn(0,1,0),(bp=new al({defines:{n:vp},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:yp},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:xp},inputEncoding:{value:gp[Tt]},outputEncoding:{value:gp[Tt]}},vertexShader:"\nprecision mediump float;\nprecision mediump int;\nattribute vec3 position;\nattribute vec2 uv;\nattribute float faceIndex;\nvarying vec3 vOutputDirection;\nvec3 getDirection(vec2 uv, float face) {\n\tuv = 2.0 * uv - 1.0;\n\tvec3 direction = vec3(uv, 1.0);\n\tif (face == 0.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.z *= -1.0;\n\t} else if (face == 1.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.z *= -1.0;\n\t} else if (face == 3.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.x *= -1.0;\n\t} else if (face == 4.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.y *= -1.0;\n\t} else if (face == 5.0) {\n\t\tdirection.xz *= -1.0;\n\t}\n\treturn direction;\n}\nvoid main() {\n\tvOutputDirection = getDirection(uv, faceIndex);\n\tgl_Position = vec4( position, 1.0 );\n}\n\t",fragmentShader:"\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform int samples;\nuniform float weights[n];\nuniform bool latitudinal;\nuniform float dTheta;\nuniform float mipInt;\nuniform vec3 poleAxis;\n\n\nuniform int inputEncoding;\nuniform int outputEncoding;\n\n#include \n\nvec4 inputTexelToLinear(vec4 value){\n\tif(inputEncoding == 0){\n\t\treturn value;\n\t}else if(inputEncoding == 1){\n\t\treturn sRGBToLinear(value);\n\t}else if(inputEncoding == 2){\n\t\treturn RGBEToLinear(value);\n\t}else if(inputEncoding == 3){\n\t\treturn RGBMToLinear(value, 7.0);\n\t}else if(inputEncoding == 4){\n\t\treturn RGBMToLinear(value, 16.0);\n\t}else if(inputEncoding == 5){\n\t\treturn RGBDToLinear(value, 256.0);\n\t}else{\n\t\treturn GammaToLinear(value, 2.2);\n\t}\n}\n\nvec4 linearToOutputTexel(vec4 value){\n\tif(outputEncoding == 0){\n\t\treturn value;\n\t}else if(outputEncoding == 1){\n\t\treturn LinearTosRGB(value);\n\t}else if(outputEncoding == 2){\n\t\treturn LinearToRGBE(value);\n\t}else if(outputEncoding == 3){\n\t\treturn LinearToRGBM(value, 7.0);\n\t}else if(outputEncoding == 4){\n\t\treturn LinearToRGBM(value, 16.0);\n\t}else if(outputEncoding == 5){\n\t\treturn LinearToRGBD(value, 256.0);\n\t}else{\n\t\treturn LinearToGamma(value, 2.2);\n\t}\n}\n\nvec4 envMapTexelToLinear(vec4 color) {\n\treturn inputTexelToLinear(color);\n}\n\t\n\n#define ENVMAP_TYPE_CUBE_UV\n#include \n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tfor (int i = 0; i < n; i++) {\n\t\tif (i >= samples)\n\t\t\tbreak;\n\t\tfor (int dir = -1; dir < 2; dir += 2) {\n\t\t\tif (i == 0 && dir == 1)\n\t\t\t\tcontinue;\n\t\t\tvec3 axis = latitudinal ? poleAxis : cross(poleAxis, vOutputDirection);\n\t\t\tif (all(equal(axis, vec3(0.0))))\n\t\t\t\taxis = cross(vec3(0.0, 1.0, 0.0), vOutputDirection);\n\t\t\taxis = normalize(axis);\n\t\t\tfloat theta = dTheta * float(dir * i);\n\t\t\tfloat cosTheta = cos(theta);\n\t\t\t// Rodrigues' axis-angle rotation\n\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross(axis, vOutputDirection) * sin(theta)\n\t\t\t\t\t+ axis * dot(axis, vOutputDirection) * (1.0 - cosTheta);\n\t\t\tgl_FragColor.rgb +=\n\t\t\t\t\tweights[i] * bilinearCubeUV(envMap, sampleDirection, mipInt);\n\t\t}\n\t}\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t",blending:h,depthTest:!1,depthWrite:!1})).type="SphericalGaussianBlur",bp),Mp=null,Sp=null,Tp=function(){for(var e=[],t=[],n=[],i=up,r=0;rup-hp?o=dp[r-up+hp-1]:0==r&&(o=0),n.push(o);for(var s=1/(a-1),c=-s/2,l=1+s/2,h=[c,c,l,c,l,l,c,c,l,l,c,l],u=new Float32Array(108),p=new Float32Array(72),d=new Float32Array(36),f=0;f<6;f++){var m=f%3*2/3-1,g=f>2?0:-1,v=[m,g,0,m+2/3,g,0,m+2/3,g+1,0,m,g,0,m+2/3,g+1,0,m,g+1,0];u.set(v,18*f),p.set(h,12*f);var y=[f,f,f,f,f,f];d.set(y,6*f)}var x=new Zi;x.setAttribute("position",new Pi(u,3)),x.setAttribute("uv",new Pi(p,2)),x.setAttribute("faceIndex",new Pi(d,1)),e.push(x),i>hp&&i--}return{_lodPlanes:e,_sizeLods:t,_sigmas:n}}(),Ep=Tp._lodPlanes,Ap=Tp._sizeLods,Lp=Tp._sigmas,Rp=null,Pp=null,Cp=null,Op=(1+Math.sqrt(5))/2,Dp=1/Op,Ip=[new rn(1,1,1),new rn(-1,1,1),new rn(1,1,-1),new rn(-1,1,-1),new rn(0,Op,Dp),new rn(0,Op,-Dp),new rn(Dp,0,Op),new rn(-Dp,0,Op),new rn(Op,Dp,0),new rn(-Op,Dp,0)];function Np(e){Pp=e,Fp(wp)}function Bp(e){var t={magFilter:ae,minFilter:ae,generateMipmaps:!1,type:e?e.type:ue,format:e?e.format:Le,encoding:e?e.encoding:Lt,depthBuffer:!1,stencilBuffer:!1},n=Up(t);return n.depthBuffer=!e,Rp=Up(t),n}function zp(e){Rp.dispose(),Pp.setRenderTarget(Cp),e.scissorTest=!1,e.setSize(e.width,e.height)}function Fp(e){var t=new Cn;t.add(new dr(Ep[0],e)),Pp.compile(t,_p)}function Up(e){var t=new Kt(3*pp,3*pp,e);return t.texture.mapping=ee,t.texture.name="PMREM.cubeUv",t.scissorTest=!0,t}function Gp(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function Hp(e){var t=Pp.autoClear;Pp.autoClear=!1;for(var n=1;nmp&&console.warn("sigmaRadians, "+r+", is too large and will clip, as it requested "+p+" samples when the maximum is set to "+mp);for(var d=[],f=0,m=0;mup-hp?i-up+hp:0),3*y,2*y),Pp.setRenderTarget(t),Pp.render(s,_p)}function jp(){var e=new al({uniforms:{envMap:{value:null},texelSize:{value:new qt(1,1)},inputEncoding:{value:gp[Tt]},outputEncoding:{value:gp[Tt]}},vertexShader:"\nprecision mediump float;\nprecision mediump int;\nattribute vec3 position;\nattribute vec2 uv;\nattribute float faceIndex;\nvarying vec3 vOutputDirection;\nvec3 getDirection(vec2 uv, float face) {\n\tuv = 2.0 * uv - 1.0;\n\tvec3 direction = vec3(uv, 1.0);\n\tif (face == 0.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.z *= -1.0;\n\t} else if (face == 1.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.z *= -1.0;\n\t} else if (face == 3.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.x *= -1.0;\n\t} else if (face == 4.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.y *= -1.0;\n\t} else if (face == 5.0) {\n\t\tdirection.xz *= -1.0;\n\t}\n\treturn direction;\n}\nvoid main() {\n\tvOutputDirection = getDirection(uv, faceIndex);\n\tgl_Position = vec4( position, 1.0 );\n}\n\t",fragmentShader:"\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform vec2 texelSize;\n\n\nuniform int inputEncoding;\nuniform int outputEncoding;\n\n#include \n\nvec4 inputTexelToLinear(vec4 value){\n\tif(inputEncoding == 0){\n\t\treturn value;\n\t}else if(inputEncoding == 1){\n\t\treturn sRGBToLinear(value);\n\t}else if(inputEncoding == 2){\n\t\treturn RGBEToLinear(value);\n\t}else if(inputEncoding == 3){\n\t\treturn RGBMToLinear(value, 7.0);\n\t}else if(inputEncoding == 4){\n\t\treturn RGBMToLinear(value, 16.0);\n\t}else if(inputEncoding == 5){\n\t\treturn RGBDToLinear(value, 256.0);\n\t}else{\n\t\treturn GammaToLinear(value, 2.2);\n\t}\n}\n\nvec4 linearToOutputTexel(vec4 value){\n\tif(outputEncoding == 0){\n\t\treturn value;\n\t}else if(outputEncoding == 1){\n\t\treturn LinearTosRGB(value);\n\t}else if(outputEncoding == 2){\n\t\treturn LinearToRGBE(value);\n\t}else if(outputEncoding == 3){\n\t\treturn LinearToRGBM(value, 7.0);\n\t}else if(outputEncoding == 4){\n\t\treturn LinearToRGBM(value, 16.0);\n\t}else if(outputEncoding == 5){\n\t\treturn LinearToRGBD(value, 256.0);\n\t}else{\n\t\treturn LinearToGamma(value, 2.2);\n\t}\n}\n\nvec4 envMapTexelToLinear(vec4 color) {\n\treturn inputTexelToLinear(color);\n}\n\t\n\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tvec3 outputDirection = normalize(vOutputDirection);\n\tvec2 uv;\n\tuv.y = asin(clamp(outputDirection.y, -1.0, 1.0)) * RECIPROCAL_PI + 0.5;\n\tuv.x = atan(outputDirection.z, outputDirection.x) * RECIPROCAL_PI2 + 0.5;\n\tvec2 f = fract(uv / texelSize - 0.5);\n\tuv -= f * texelSize;\n\tvec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.x += texelSize.x;\n\tvec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.y += texelSize.y;\n\tvec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.x -= texelSize.x;\n\tvec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tvec3 tm = mix(tl, tr, f.x);\n\tvec3 bm = mix(bl, br, f.x);\n\tgl_FragColor.rgb = mix(tm, bm, f.y);\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t",blending:h,depthTest:!1,depthWrite:!1});return e.type="EquirectangularToCubeUV",e}function Wp(){var e=new al({uniforms:{envMap:{value:null},inputEncoding:{value:gp[Tt]},outputEncoding:{value:gp[Tt]}},vertexShader:"\nprecision mediump float;\nprecision mediump int;\nattribute vec3 position;\nattribute vec2 uv;\nattribute float faceIndex;\nvarying vec3 vOutputDirection;\nvec3 getDirection(vec2 uv, float face) {\n\tuv = 2.0 * uv - 1.0;\n\tvec3 direction = vec3(uv, 1.0);\n\tif (face == 0.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.z *= -1.0;\n\t} else if (face == 1.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.z *= -1.0;\n\t} else if (face == 3.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.x *= -1.0;\n\t} else if (face == 4.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.y *= -1.0;\n\t} else if (face == 5.0) {\n\t\tdirection.xz *= -1.0;\n\t}\n\treturn direction;\n}\nvoid main() {\n\tvOutputDirection = getDirection(uv, faceIndex);\n\tgl_Position = vec4( position, 1.0 );\n}\n\t",fragmentShader:"\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform samplerCube envMap;\n\n\nuniform int inputEncoding;\nuniform int outputEncoding;\n\n#include \n\nvec4 inputTexelToLinear(vec4 value){\n\tif(inputEncoding == 0){\n\t\treturn value;\n\t}else if(inputEncoding == 1){\n\t\treturn sRGBToLinear(value);\n\t}else if(inputEncoding == 2){\n\t\treturn RGBEToLinear(value);\n\t}else if(inputEncoding == 3){\n\t\treturn RGBMToLinear(value, 7.0);\n\t}else if(inputEncoding == 4){\n\t\treturn RGBMToLinear(value, 16.0);\n\t}else if(inputEncoding == 5){\n\t\treturn RGBDToLinear(value, 256.0);\n\t}else{\n\t\treturn GammaToLinear(value, 2.2);\n\t}\n}\n\nvec4 linearToOutputTexel(vec4 value){\n\tif(outputEncoding == 0){\n\t\treturn value;\n\t}else if(outputEncoding == 1){\n\t\treturn LinearTosRGB(value);\n\t}else if(outputEncoding == 2){\n\t\treturn LinearToRGBE(value);\n\t}else if(outputEncoding == 3){\n\t\treturn LinearToRGBM(value, 7.0);\n\t}else if(outputEncoding == 4){\n\t\treturn LinearToRGBM(value, 16.0);\n\t}else if(outputEncoding == 5){\n\t\treturn LinearToRGBD(value, 256.0);\n\t}else{\n\t\treturn LinearToGamma(value, 2.2);\n\t}\n}\n\nvec4 envMapTexelToLinear(vec4 color) {\n\treturn inputTexelToLinear(color);\n}\n\t\n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tgl_FragColor.rgb = envMapTexelToLinear(textureCube(envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ))).rgb;\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t",blending:h,depthTest:!1,depthWrite:!1});return e.type="CubemapToCubeUV",e}Np.prototype={constructor:Np,fromScene:function(e,t,n,i){void 0===t&&(t=0),void 0===n&&(n=.1),void 0===i&&(i=100),Cp=Pp.getRenderTarget();var r=Bp();return function(e,t,n,i){var r=new Pr(90,1,t,n),a=[1,1,1,1,-1,1],o=[1,1,-1,-1,-1,1],s=Pp.outputEncoding,c=Pp.toneMapping,l=Pp.toneMappingExposure,h=Pp.getClearColor(),u=Pp.getClearAlpha();Pp.toneMapping=j,Pp.toneMappingExposure=1,Pp.outputEncoding=Tt,e.scale.z*=-1;var p=e.background;if(p&&p.isColor){p.convertSRGBToLinear();var d=Math.max(p.r,p.g,p.b),f=Math.min(Math.max(Math.ceil(Math.log2(d)),-128),127);p=p.multiplyScalar(Math.pow(2,-f));var m=(f+128)/255;Pp.setClearColor(p,m),e.background=null}for(var g=0;g<6;g++){var v=g%3;0==v?(r.up.set(0,a[g],0),r.lookAt(o[g],0,0)):1==v?(r.up.set(0,0,a[g]),r.lookAt(0,o[g],0)):(r.up.set(0,a[g],0),r.lookAt(0,0,o[g])),Gp(i,v*pp,g>2?pp:0,pp,pp),Pp.setRenderTarget(i),Pp.render(e,r)}Pp.toneMapping=c,Pp.toneMappingExposure=l,Pp.outputEncoding=s,Pp.setClearColor(h,u),e.scale.z*=-1}(e,n,i,r),t>0&&Vp(r,0,0,t),Hp(r),zp(r),r},fromEquirectangular:function(e){return e.magFilter=ae,e.minFilter=ae,e.generateMipmaps=!1,this.fromCubemap(e)},fromCubemap:function(e){Cp=Pp.getRenderTarget();var t=Bp(e);return function(e,t){var n=new Cn;e.isCubeTexture?null==Sp&&(Sp=Wp()):null==Mp&&(Mp=jp());var i=e.isCubeTexture?Sp:Mp;n.add(new dr(Ep[0],i));var r=i.uniforms;r.envMap.value=e,e.isCubeTexture||r.texelSize.value.set(1/e.image.width,1/e.image.height);r.inputEncoding.value=gp[e.encoding],r.outputEncoding.value=gp[e.encoding],Gp(t,0,0,3*pp,2*pp),Pp.setRenderTarget(t),Pp.render(n,_p)}(e,t),Hp(t),zp(t),t},compileCubemapShader:function(){null==Sp&&Fp(Sp=Wp())},compileEquirectangularShader:function(){null==Mp&&Fp(Mp=jp())},dispose:function(){wp.dispose(),null!=Sp&&Sp.dispose(),null!=Mp&&Mp.dispose();for(var e=0;e + +

            Basis WebGL demos

            +

            + Example webpages using the transcoder (compiled to WASM) to render + Basis/KTX2 textures in WebGL. Both demos require WebAssembly and WebGL support. +

            + diff --git a/ktx/external/basisu/webgl/ktx2_encode_test/assets/kodim03.png b/ktx/external/basisu/webgl/ktx2_encode_test/assets/kodim03.png new file mode 100644 index 0000000..639a417 Binary files /dev/null and b/ktx/external/basisu/webgl/ktx2_encode_test/assets/kodim03.png differ diff --git a/ktx/external/basisu/webgl/ktx2_encode_test/assets/kodim18.png b/ktx/external/basisu/webgl/ktx2_encode_test/assets/kodim18.png new file mode 100644 index 0000000..187fec2 Binary files /dev/null and b/ktx/external/basisu/webgl/ktx2_encode_test/assets/kodim18.png differ diff --git a/ktx/external/basisu/webgl/ktx2_encode_test/assets/kodim18_64x64.png b/ktx/external/basisu/webgl/ktx2_encode_test/assets/kodim18_64x64.png new file mode 100644 index 0000000..1166093 Binary files /dev/null and b/ktx/external/basisu/webgl/ktx2_encode_test/assets/kodim18_64x64.png differ diff --git a/ktx/external/basisu/webgl/ktx2_encode_test/assets/kodim23.ktx2 b/ktx/external/basisu/webgl/ktx2_encode_test/assets/kodim23.ktx2 new file mode 100644 index 0000000..9a61319 Binary files /dev/null and b/ktx/external/basisu/webgl/ktx2_encode_test/assets/kodim23.ktx2 differ diff --git a/ktx/external/basisu/webgl/ktx2_encode_test/dxt-to-rgb565.js b/ktx/external/basisu/webgl/ktx2_encode_test/dxt-to-rgb565.js new file mode 100644 index 0000000..8e35be4 --- /dev/null +++ b/ktx/external/basisu/webgl/ktx2_encode_test/dxt-to-rgb565.js @@ -0,0 +1,128 @@ +/** + * Transcodes DXT into RGB565. + * This is an optimized version of dxtToRgb565Unoptimized() below. + * Optimizations: + * 1. Use integer math to compute c2 and c3 instead of floating point + * math. Specifically: + * c2 = 5/8 * c0 + 3/8 * c1 + * c3 = 3/8 * c0 + 5/8 * c1 + * This is about a 40% performance improvement. It also appears to + * match what hardware DXT decoders do, as the colors produced + * by this integer math match what hardware produces, while the + * floating point in dxtToRgb565Unoptimized() produce slightly + * different colors (for one GPU this was tested on). + * 2. Unroll the inner loop. Another ~10% improvement. + * 3. Compute r0, g0, b0, r1, g1, b1 only once instead of twice. + * Another 10% improvement. + * 4. Use a Uint16Array instead of a Uint8Array. Another 10% improvement. + * @param {Uint16Array} src The src DXT bits as a Uint16Array. + * @param {number} srcByteOffset + * @param {number} width + * @param {number} height + * @return {Uint16Array} dst + */ +function dxtToRgb565(src, src16Offset, width, height) { + var c = new Uint16Array(4); + var dst = new Uint16Array(width * height); + var nWords = (width * height) / 4; + var m = 0; + var dstI = 0; + var i = 0; + var r0 = 0, g0 = 0, b0 = 0, r1 = 0, g1 = 0, b1 = 0; + + var blockWidth = width / 4; + var blockHeight = height / 4; + for (var blockY = 0; blockY < blockHeight; blockY++) { + for (var blockX = 0; blockX < blockWidth; blockX++) { + i = src16Offset + 4 * (blockY * blockWidth + blockX); + c[0] = src[i]; + c[1] = src[i + 1]; + + r0 = c[0] & 0x1f; + g0 = c[0] & 0x7e0; + b0 = c[0] & 0xf800; + r1 = c[1] & 0x1f; + g1 = c[1] & 0x7e0; + b1 = c[1] & 0xf800; + // Interpolate between c0 and c1 to get c2 and c3. + // Note that we approximate 1/3 as 3/8 and 2/3 as 5/8 for + // speed. This also appears to be what the hardware DXT + // decoder in many GPUs does :) + + // rg FIXME: This is most likely leading to wrong results vs. a GPU + + c[2] = ((5 * r0 + 3 * r1) >> 3) + | (((5 * g0 + 3 * g1) >> 3) & 0x7e0) + | (((5 * b0 + 3 * b1) >> 3) & 0xf800); + c[3] = ((5 * r1 + 3 * r0) >> 3) + | (((5 * g1 + 3 * g0) >> 3) & 0x7e0) + | (((5 * b1 + 3 * b0) >> 3) & 0xf800); + m = src[i + 2]; + dstI = (blockY * 4) * width + blockX * 4; + dst[dstI] = c[m & 0x3]; + dst[dstI + 1] = c[(m >> 2) & 0x3]; + dst[dstI + 2] = c[(m >> 4) & 0x3]; + dst[dstI + 3] = c[(m >> 6) & 0x3]; + dstI += width; + dst[dstI] = c[(m >> 8) & 0x3]; + dst[dstI + 1] = c[(m >> 10) & 0x3]; + dst[dstI + 2] = c[(m >> 12) & 0x3]; + dst[dstI + 3] = c[(m >> 14)]; + m = src[i + 3]; + dstI += width; + dst[dstI] = c[m & 0x3]; + dst[dstI + 1] = c[(m >> 2) & 0x3]; + dst[dstI + 2] = c[(m >> 4) & 0x3]; + dst[dstI + 3] = c[(m >> 6) & 0x3]; + dstI += width; + dst[dstI] = c[(m >> 8) & 0x3]; + dst[dstI + 1] = c[(m >> 10) & 0x3]; + dst[dstI + 2] = c[(m >> 12) & 0x3]; + dst[dstI + 3] = c[(m >> 14)]; + } + } + return dst; +} + + +/** + * An unoptimized version of dxtToRgb565. Also, the floating + * point math used to compute the colors actually results in + * slightly different colors compared to hardware DXT decoders. + * @param {Uint8Array} src + * @param {number} srcByteOffset + * @param {number} width + * @param {number} height + * @return {Uint16Array} dst + */ +function dxtToRgb565Unoptimized(src, srcByteOffset, width, height) { + var c = new Uint16Array(4); + var dst = new Uint16Array(width * height); + var nWords = (width * height) / 4; + + var blockWidth = width / 4; + var blockHeight = height / 4; + for (var blockY = 0; blockY < blockHeight; blockY++) { + for (var blockX = 0; blockX < blockWidth; blockX++) { + var i = srcByteOffset + 8 * (blockY * blockWidth + blockX); + c[0] = src[i] | (src[i + 1] << 8); + c[1] = src[i + 2] | (src[i + 3] << 8); + c[2] = (2 * (c[0] & 0x1f) + 1 * (c[1] & 0x1f)) / 3 + | (((2 * (c[0] & 0x7e0) + 1 * (c[1] & 0x7e0)) / 3) & 0x7e0) + | (((2 * (c[0] & 0xf800) + 1 * (c[1] & 0xf800)) / 3) & 0xf800); + c[3] = (2 * (c[1] & 0x1f) + 1 * (c[0] & 0x1f)) / 3 + | (((2 * (c[1] & 0x7e0) + 1 * (c[0] & 0x7e0)) / 3) & 0x7e0) + | (((2 * (c[1] & 0xf800) + 1 * (c[0] & 0xf800)) / 3) & 0xf800); + for (var row = 0; row < 4; row++) { + var m = src[i + 4 + row]; + var dstI = (blockY * 4 + row) * width + blockX * 4; + dst[dstI++] = c[m & 0x3]; + dst[dstI++] = c[(m >> 2) & 0x3]; + dst[dstI++] = c[(m >> 4) & 0x3]; + dst[dstI++] = c[(m >> 6) & 0x3]; + } + } + } + return dst; +} + diff --git a/ktx/external/basisu/webgl/ktx2_encode_test/index.html b/ktx/external/basisu/webgl/ktx2_encode_test/index.html new file mode 100644 index 0000000..1835ae7 --- /dev/null +++ b/ktx/external/basisu/webgl/ktx2_encode_test/index.html @@ -0,0 +1,675 @@ + + + + + + + + +
            +
            + Basis Universal KTX2 encoding and transcoding test +
            + +
            This demo uses the Basis C++ transcoder (compiled to Javascript using Emscripten) to transcode a .ktx2 file to FORMAT +
            It also supports encoding .PNG files to .KTX2. +
            Thanks to Evan Parker for providing webgl-texture-utils and this test bed. +
            +
            + .ktx2 file: + + +
            + +
            + .png file: + + +
            + +
            + Debug: + +
            + Compute Stats: + +
            + sRGB: + +
            + Mipmaps: + +
            + UASTC: + + + +
            + + ETC1S Quality: + + +
            + +
            + + + + +
            + + +
            +

            +
            + + + diff --git a/ktx/external/basisu/webgl/ktx2_encode_test/preview.png b/ktx/external/basisu/webgl/ktx2_encode_test/preview.png new file mode 100644 index 0000000..99c399d Binary files /dev/null and b/ktx/external/basisu/webgl/ktx2_encode_test/preview.png differ diff --git a/ktx/external/basisu/webgl/ktx2_encode_test/renderer.js b/ktx/external/basisu/webgl/ktx2_encode_test/renderer.js new file mode 100644 index 0000000..26f1a65 --- /dev/null +++ b/ktx/external/basisu/webgl/ktx2_encode_test/renderer.js @@ -0,0 +1,246 @@ +/** + * Constructs a renderer object. + * @param {WebGLRenderingContext} gl The GL context. + * @constructor + */ +var Renderer = function(gl) { + /** + * The GL context. + * @type {WebGLRenderingContext} + * @private + */ + this.gl_ = gl; + + /** + * The WebGLProgram. + * @type {WebGLProgram} + * @private + */ + this.program_ = gl.createProgram(); + + /** + * @type {WebGLShader} + * @private + */ + this.vertexShader_ = this.compileShader_( + Renderer.vertexShaderSource_, gl.VERTEX_SHADER); + + /** + * @type {WebGLShader} + * @private + */ + this.fragmentShader_ = this.compileShader_( + Renderer.fragmentShaderSource_, gl.FRAGMENT_SHADER); + + /** + * Cached uniform locations. + * @type {Object.} + * @private + */ + this.uniformLocations_ = {}; + + /** + * Cached attribute locations. + * @type {Object.} + * @private + */ + this.attribLocations_ = {}; + + /** + * A vertex buffer containing a single quad with xy coordinates from [-1,-1] + * to [1,1] and uv coordinates from [0,0] to [1,1]. + * @private + */ + this.quadVertexBuffer_ = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVertexBuffer_); + var vertices = new Float32Array( + [-1.0, -1.0, 0.0, 1.0, + +1.0, -1.0, 1.0, 1.0, + -1.0, +1.0, 0.0, 0.0, + 1.0, +1.0, 1.0, 0.0]); + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); + + + // init shaders + + gl.attachShader(this.program_, this.vertexShader_); + gl.attachShader(this.program_, this.fragmentShader_); + gl.bindAttribLocation(this.program_, 0, 'vert'); + gl.linkProgram(this.program_); + gl.useProgram(this.program_); + gl.enableVertexAttribArray(0); + + gl.enable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); + + var count = gl.getProgramParameter(this.program_, gl.ACTIVE_UNIFORMS); + for (var i = 0; i < /** @type {number} */(count); i++) { + var info = gl.getActiveUniform(this.program_, i); + var result = gl.getUniformLocation(this.program_, info.name); + this.uniformLocations_[info.name] = result; + } + + count = gl.getProgramParameter(this.program_, gl.ACTIVE_ATTRIBUTES); + for (var i = 0; i < /** @type {number} */(count); i++) { + var info = gl.getActiveAttrib(this.program_, i); + var result = gl.getAttribLocation(this.program_, info.name); + this.attribLocations_[info.name] = result; + } +}; + + +Renderer.prototype.finishInit = function() { + this.draw(); +}; + + +Renderer.prototype.createDxtTexture = function(dxtData, width, height, format) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.compressedTexImage2D( + gl.TEXTURE_2D, + 0, + format, + width, + height, + 0, + dxtData); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + //gl.generateMipmap(gl.TEXTURE_2D) + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; + +Renderer.prototype.createCompressedTexture = function(data, width, height, format) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.compressedTexImage2D( + gl.TEXTURE_2D, + 0, + format, + width, + height, + 0, + data); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + //gl.generateMipmap(gl.TEXTURE_2D) + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; + + +Renderer.prototype.createRgb565Texture = function(rgb565Data, width, height) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGB, + width, + height, + 0, + gl.RGB, + gl.UNSIGNED_SHORT_5_6_5, + rgb565Data); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + //gl.generateMipmap(gl.TEXTURE_2D) + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; + + +Renderer.prototype.drawTexture = function(texture, width, height, mode) { + var gl = this.gl_; + // draw scene + gl.clearColor(0, 0, 0, 1); + gl.clearDepth(1.0); + gl.viewport(0, 0, width, height); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT); + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.uniform1i(this.uniformLocations_.texSampler, 0); + + var x = 0.0; + var y = 0.0; + if (mode == 1) + x = 1.0; + else if (mode == 2) + y = 1.0; + + gl.uniform4f(this.uniformLocations_.control, x, y, 0.0, 0.0); + + gl.enableVertexAttribArray(this.attribLocations_.vert); + gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVertexBuffer_); + gl.vertexAttribPointer(this.attribLocations_.vert, 4, gl.FLOAT, + false, 0, 0); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); +}; + + +/** + * Compiles a GLSL shader and returns a WebGLShader. + * @param {string} shaderSource The shader source code string. + * @param {number} type Either VERTEX_SHADER or FRAGMENT_SHADER. + * @return {WebGLShader} The new WebGLShader. + * @private + */ +Renderer.prototype.compileShader_ = function(shaderSource, type) { + var gl = this.gl_; + var shader = gl.createShader(type); + gl.shaderSource(shader, shaderSource); + gl.compileShader(shader); + return shader; +}; + + +/** + * @type {string} + * @private + */ +Renderer.vertexShaderSource_ = [ + 'attribute vec4 vert;', + 'varying vec2 v_texCoord;', + 'void main() {', + ' gl_Position = vec4(vert.xy, 0.0, 1.0);', + ' v_texCoord = vert.zw;', + '}' + ].join('\n'); + + +/** + * @type {string} + * @private ' gl_FragColor = texture2D(texSampler, v_texCoord);', + */ +Renderer.fragmentShaderSource_ = [ + 'precision highp float;', + 'uniform sampler2D texSampler;', + 'uniform vec4 control;', + 'varying vec2 v_texCoord;', + 'void main() {', + ' vec4 c;', + ' c = texture2D(texSampler, v_texCoord);', + ' if (control.x > 0.0)', + ' {', + ' c.w = 1.0;', + ' }', + ' else if (control.y > 0.0)', + ' {', + ' c.rgb = c.aaa; c.w = 1.0;', + ' }', + ' gl_FragColor = c;', + '}' + ].join('\n'); + diff --git a/ktx/external/basisu/webgl/texture/assets/alpha3.basis b/ktx/external/basisu/webgl/texture/assets/alpha3.basis new file mode 100644 index 0000000..794a15c Binary files /dev/null and b/ktx/external/basisu/webgl/texture/assets/alpha3.basis differ diff --git a/ktx/external/basisu/webgl/texture/assets/kodim01_mipmapped.basis b/ktx/external/basisu/webgl/texture/assets/kodim01_mipmapped.basis new file mode 100644 index 0000000..dfaf2b5 Binary files /dev/null and b/ktx/external/basisu/webgl/texture/assets/kodim01_mipmapped.basis differ diff --git a/ktx/external/basisu/webgl/texture/assets/kodim03.basis b/ktx/external/basisu/webgl/texture/assets/kodim03.basis new file mode 100644 index 0000000..e493163 Binary files /dev/null and b/ktx/external/basisu/webgl/texture/assets/kodim03.basis differ diff --git a/ktx/external/basisu/webgl/texture/assets/kodim03_uastc.basis b/ktx/external/basisu/webgl/texture/assets/kodim03_uastc.basis new file mode 100644 index 0000000..07469c0 Binary files /dev/null and b/ktx/external/basisu/webgl/texture/assets/kodim03_uastc.basis differ diff --git a/ktx/external/basisu/webgl/texture/assets/kodim18_uastc.basis b/ktx/external/basisu/webgl/texture/assets/kodim18_uastc.basis new file mode 100644 index 0000000..ca13590 Binary files /dev/null and b/ktx/external/basisu/webgl/texture/assets/kodim18_uastc.basis differ diff --git a/ktx/external/basisu/webgl/texture/assets/kodim20.basis b/ktx/external/basisu/webgl/texture/assets/kodim20.basis new file mode 100644 index 0000000..54f00bb Binary files /dev/null and b/ktx/external/basisu/webgl/texture/assets/kodim20.basis differ diff --git a/ktx/external/basisu/webgl/texture/assets/kodim20_1024x1024.basis b/ktx/external/basisu/webgl/texture/assets/kodim20_1024x1024.basis new file mode 100644 index 0000000..fd26bbb Binary files /dev/null and b/ktx/external/basisu/webgl/texture/assets/kodim20_1024x1024.basis differ diff --git a/ktx/external/basisu/webgl/texture/assets/kodim26_uastc_1024.basis b/ktx/external/basisu/webgl/texture/assets/kodim26_uastc_1024.basis new file mode 100644 index 0000000..671d188 Binary files /dev/null and b/ktx/external/basisu/webgl/texture/assets/kodim26_uastc_1024.basis differ diff --git a/ktx/external/basisu/webgl/texture/dxt-to-rgb565.js b/ktx/external/basisu/webgl/texture/dxt-to-rgb565.js new file mode 100644 index 0000000..8e35be4 --- /dev/null +++ b/ktx/external/basisu/webgl/texture/dxt-to-rgb565.js @@ -0,0 +1,128 @@ +/** + * Transcodes DXT into RGB565. + * This is an optimized version of dxtToRgb565Unoptimized() below. + * Optimizations: + * 1. Use integer math to compute c2 and c3 instead of floating point + * math. Specifically: + * c2 = 5/8 * c0 + 3/8 * c1 + * c3 = 3/8 * c0 + 5/8 * c1 + * This is about a 40% performance improvement. It also appears to + * match what hardware DXT decoders do, as the colors produced + * by this integer math match what hardware produces, while the + * floating point in dxtToRgb565Unoptimized() produce slightly + * different colors (for one GPU this was tested on). + * 2. Unroll the inner loop. Another ~10% improvement. + * 3. Compute r0, g0, b0, r1, g1, b1 only once instead of twice. + * Another 10% improvement. + * 4. Use a Uint16Array instead of a Uint8Array. Another 10% improvement. + * @param {Uint16Array} src The src DXT bits as a Uint16Array. + * @param {number} srcByteOffset + * @param {number} width + * @param {number} height + * @return {Uint16Array} dst + */ +function dxtToRgb565(src, src16Offset, width, height) { + var c = new Uint16Array(4); + var dst = new Uint16Array(width * height); + var nWords = (width * height) / 4; + var m = 0; + var dstI = 0; + var i = 0; + var r0 = 0, g0 = 0, b0 = 0, r1 = 0, g1 = 0, b1 = 0; + + var blockWidth = width / 4; + var blockHeight = height / 4; + for (var blockY = 0; blockY < blockHeight; blockY++) { + for (var blockX = 0; blockX < blockWidth; blockX++) { + i = src16Offset + 4 * (blockY * blockWidth + blockX); + c[0] = src[i]; + c[1] = src[i + 1]; + + r0 = c[0] & 0x1f; + g0 = c[0] & 0x7e0; + b0 = c[0] & 0xf800; + r1 = c[1] & 0x1f; + g1 = c[1] & 0x7e0; + b1 = c[1] & 0xf800; + // Interpolate between c0 and c1 to get c2 and c3. + // Note that we approximate 1/3 as 3/8 and 2/3 as 5/8 for + // speed. This also appears to be what the hardware DXT + // decoder in many GPUs does :) + + // rg FIXME: This is most likely leading to wrong results vs. a GPU + + c[2] = ((5 * r0 + 3 * r1) >> 3) + | (((5 * g0 + 3 * g1) >> 3) & 0x7e0) + | (((5 * b0 + 3 * b1) >> 3) & 0xf800); + c[3] = ((5 * r1 + 3 * r0) >> 3) + | (((5 * g1 + 3 * g0) >> 3) & 0x7e0) + | (((5 * b1 + 3 * b0) >> 3) & 0xf800); + m = src[i + 2]; + dstI = (blockY * 4) * width + blockX * 4; + dst[dstI] = c[m & 0x3]; + dst[dstI + 1] = c[(m >> 2) & 0x3]; + dst[dstI + 2] = c[(m >> 4) & 0x3]; + dst[dstI + 3] = c[(m >> 6) & 0x3]; + dstI += width; + dst[dstI] = c[(m >> 8) & 0x3]; + dst[dstI + 1] = c[(m >> 10) & 0x3]; + dst[dstI + 2] = c[(m >> 12) & 0x3]; + dst[dstI + 3] = c[(m >> 14)]; + m = src[i + 3]; + dstI += width; + dst[dstI] = c[m & 0x3]; + dst[dstI + 1] = c[(m >> 2) & 0x3]; + dst[dstI + 2] = c[(m >> 4) & 0x3]; + dst[dstI + 3] = c[(m >> 6) & 0x3]; + dstI += width; + dst[dstI] = c[(m >> 8) & 0x3]; + dst[dstI + 1] = c[(m >> 10) & 0x3]; + dst[dstI + 2] = c[(m >> 12) & 0x3]; + dst[dstI + 3] = c[(m >> 14)]; + } + } + return dst; +} + + +/** + * An unoptimized version of dxtToRgb565. Also, the floating + * point math used to compute the colors actually results in + * slightly different colors compared to hardware DXT decoders. + * @param {Uint8Array} src + * @param {number} srcByteOffset + * @param {number} width + * @param {number} height + * @return {Uint16Array} dst + */ +function dxtToRgb565Unoptimized(src, srcByteOffset, width, height) { + var c = new Uint16Array(4); + var dst = new Uint16Array(width * height); + var nWords = (width * height) / 4; + + var blockWidth = width / 4; + var blockHeight = height / 4; + for (var blockY = 0; blockY < blockHeight; blockY++) { + for (var blockX = 0; blockX < blockWidth; blockX++) { + var i = srcByteOffset + 8 * (blockY * blockWidth + blockX); + c[0] = src[i] | (src[i + 1] << 8); + c[1] = src[i + 2] | (src[i + 3] << 8); + c[2] = (2 * (c[0] & 0x1f) + 1 * (c[1] & 0x1f)) / 3 + | (((2 * (c[0] & 0x7e0) + 1 * (c[1] & 0x7e0)) / 3) & 0x7e0) + | (((2 * (c[0] & 0xf800) + 1 * (c[1] & 0xf800)) / 3) & 0xf800); + c[3] = (2 * (c[1] & 0x1f) + 1 * (c[0] & 0x1f)) / 3 + | (((2 * (c[1] & 0x7e0) + 1 * (c[0] & 0x7e0)) / 3) & 0x7e0) + | (((2 * (c[1] & 0xf800) + 1 * (c[0] & 0xf800)) / 3) & 0xf800); + for (var row = 0; row < 4; row++) { + var m = src[i + 4 + row]; + var dstI = (blockY * 4 + row) * width + blockX * 4; + dst[dstI++] = c[m & 0x3]; + dst[dstI++] = c[(m >> 2) & 0x3]; + dst[dstI++] = c[(m >> 4) & 0x3]; + dst[dstI++] = c[(m >> 6) & 0x3]; + } + } + } + return dst; +} + diff --git a/ktx/external/basisu/webgl/texture/index.html b/ktx/external/basisu/webgl/texture/index.html new file mode 100644 index 0000000..b346ece --- /dev/null +++ b/ktx/external/basisu/webgl/texture/index.html @@ -0,0 +1,596 @@ + + + + + + + + +
            +
            + .basis->Compressed texture transcoder test +
            + +
            This demo uses the Basis C++ transcoder (compiled to Javascript using Emscripten) to transcode a .basis file to FORMAT +
            Thanks to Evan Parker for providing webgl-texture-utils and this test bed. +
            +
            + .basis file: + + +
            +
            + + + + +
            +
            + Use Container Independent Transcoding API's: + + +
            + + +
            +

            +
            + + + diff --git a/ktx/external/basisu/webgl/texture/preview.png b/ktx/external/basisu/webgl/texture/preview.png new file mode 100644 index 0000000..f1c1a6b Binary files /dev/null and b/ktx/external/basisu/webgl/texture/preview.png differ diff --git a/ktx/external/basisu/webgl/texture/renderer.js b/ktx/external/basisu/webgl/texture/renderer.js new file mode 100644 index 0000000..26f1a65 --- /dev/null +++ b/ktx/external/basisu/webgl/texture/renderer.js @@ -0,0 +1,246 @@ +/** + * Constructs a renderer object. + * @param {WebGLRenderingContext} gl The GL context. + * @constructor + */ +var Renderer = function(gl) { + /** + * The GL context. + * @type {WebGLRenderingContext} + * @private + */ + this.gl_ = gl; + + /** + * The WebGLProgram. + * @type {WebGLProgram} + * @private + */ + this.program_ = gl.createProgram(); + + /** + * @type {WebGLShader} + * @private + */ + this.vertexShader_ = this.compileShader_( + Renderer.vertexShaderSource_, gl.VERTEX_SHADER); + + /** + * @type {WebGLShader} + * @private + */ + this.fragmentShader_ = this.compileShader_( + Renderer.fragmentShaderSource_, gl.FRAGMENT_SHADER); + + /** + * Cached uniform locations. + * @type {Object.} + * @private + */ + this.uniformLocations_ = {}; + + /** + * Cached attribute locations. + * @type {Object.} + * @private + */ + this.attribLocations_ = {}; + + /** + * A vertex buffer containing a single quad with xy coordinates from [-1,-1] + * to [1,1] and uv coordinates from [0,0] to [1,1]. + * @private + */ + this.quadVertexBuffer_ = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVertexBuffer_); + var vertices = new Float32Array( + [-1.0, -1.0, 0.0, 1.0, + +1.0, -1.0, 1.0, 1.0, + -1.0, +1.0, 0.0, 0.0, + 1.0, +1.0, 1.0, 0.0]); + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); + + + // init shaders + + gl.attachShader(this.program_, this.vertexShader_); + gl.attachShader(this.program_, this.fragmentShader_); + gl.bindAttribLocation(this.program_, 0, 'vert'); + gl.linkProgram(this.program_); + gl.useProgram(this.program_); + gl.enableVertexAttribArray(0); + + gl.enable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); + + var count = gl.getProgramParameter(this.program_, gl.ACTIVE_UNIFORMS); + for (var i = 0; i < /** @type {number} */(count); i++) { + var info = gl.getActiveUniform(this.program_, i); + var result = gl.getUniformLocation(this.program_, info.name); + this.uniformLocations_[info.name] = result; + } + + count = gl.getProgramParameter(this.program_, gl.ACTIVE_ATTRIBUTES); + for (var i = 0; i < /** @type {number} */(count); i++) { + var info = gl.getActiveAttrib(this.program_, i); + var result = gl.getAttribLocation(this.program_, info.name); + this.attribLocations_[info.name] = result; + } +}; + + +Renderer.prototype.finishInit = function() { + this.draw(); +}; + + +Renderer.prototype.createDxtTexture = function(dxtData, width, height, format) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.compressedTexImage2D( + gl.TEXTURE_2D, + 0, + format, + width, + height, + 0, + dxtData); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + //gl.generateMipmap(gl.TEXTURE_2D) + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; + +Renderer.prototype.createCompressedTexture = function(data, width, height, format) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.compressedTexImage2D( + gl.TEXTURE_2D, + 0, + format, + width, + height, + 0, + data); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + //gl.generateMipmap(gl.TEXTURE_2D) + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; + + +Renderer.prototype.createRgb565Texture = function(rgb565Data, width, height) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGB, + width, + height, + 0, + gl.RGB, + gl.UNSIGNED_SHORT_5_6_5, + rgb565Data); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + //gl.generateMipmap(gl.TEXTURE_2D) + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; + + +Renderer.prototype.drawTexture = function(texture, width, height, mode) { + var gl = this.gl_; + // draw scene + gl.clearColor(0, 0, 0, 1); + gl.clearDepth(1.0); + gl.viewport(0, 0, width, height); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT); + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.uniform1i(this.uniformLocations_.texSampler, 0); + + var x = 0.0; + var y = 0.0; + if (mode == 1) + x = 1.0; + else if (mode == 2) + y = 1.0; + + gl.uniform4f(this.uniformLocations_.control, x, y, 0.0, 0.0); + + gl.enableVertexAttribArray(this.attribLocations_.vert); + gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVertexBuffer_); + gl.vertexAttribPointer(this.attribLocations_.vert, 4, gl.FLOAT, + false, 0, 0); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); +}; + + +/** + * Compiles a GLSL shader and returns a WebGLShader. + * @param {string} shaderSource The shader source code string. + * @param {number} type Either VERTEX_SHADER or FRAGMENT_SHADER. + * @return {WebGLShader} The new WebGLShader. + * @private + */ +Renderer.prototype.compileShader_ = function(shaderSource, type) { + var gl = this.gl_; + var shader = gl.createShader(type); + gl.shaderSource(shader, shaderSource); + gl.compileShader(shader); + return shader; +}; + + +/** + * @type {string} + * @private + */ +Renderer.vertexShaderSource_ = [ + 'attribute vec4 vert;', + 'varying vec2 v_texCoord;', + 'void main() {', + ' gl_Position = vec4(vert.xy, 0.0, 1.0);', + ' v_texCoord = vert.zw;', + '}' + ].join('\n'); + + +/** + * @type {string} + * @private ' gl_FragColor = texture2D(texSampler, v_texCoord);', + */ +Renderer.fragmentShaderSource_ = [ + 'precision highp float;', + 'uniform sampler2D texSampler;', + 'uniform vec4 control;', + 'varying vec2 v_texCoord;', + 'void main() {', + ' vec4 c;', + ' c = texture2D(texSampler, v_texCoord);', + ' if (control.x > 0.0)', + ' {', + ' c.w = 1.0;', + ' }', + ' else if (control.y > 0.0)', + ' {', + ' c.rgb = c.aaa; c.w = 1.0;', + ' }', + ' gl_FragColor = c;', + '}' + ].join('\n'); + diff --git a/ktx/external/basisu/webgl/transcoder/.gitignore b/ktx/external/basisu/webgl/transcoder/.gitignore new file mode 100644 index 0000000..324ab6c --- /dev/null +++ b/ktx/external/basisu/webgl/transcoder/.gitignore @@ -0,0 +1,4 @@ +build/* +!build/basis_loader.js +!build/basis_transcoder.js +!build/basis_transcoder.wasm diff --git a/ktx/external/basisu/webgl/transcoder/CMakeLists.txt b/ktx/external/basisu/webgl/transcoder/CMakeLists.txt new file mode 100644 index 0000000..372653d --- /dev/null +++ b/ktx/external/basisu/webgl/transcoder/CMakeLists.txt @@ -0,0 +1,52 @@ +cmake_minimum_required(VERSION 3.0) + +project(basisu_transcoder_js) + +# KTX2 support (and Zstandard) in the transcoder is purely optional. Use "cmake -DKTX2=FALSE" to completely disable KTX2 support (which also disables Zstandard). +# If this is FALSE you'll only be able to transcode .basis files. +option(KTX2 "KTX2" TRUE) + +# If KTX2 is enabled, Zstandard is needed to support decompressing supercompressed UASTC files. +# If you know you'll never be transcoding KTX2 files using this feature you can set KTX2_ZSTANDARD to 0. +option(KTX2_ZSTANDARD "KTX2_ZSTANDARD" TRUE) + +message("KTX2=${KTX2}") +message("KTX2_ZSTANDARD=${KTX2_ZSTANDARD}") + +if (EMSCRIPTEN) + set(CMAKE_CXX_STANDARD 11) + + set(SRC_LIST + ../../transcoder/basisu_transcoder.cpp + basis_wrappers.cpp + ) + + if (KTX2) + set(KTX2_DEFINITION BASISD_SUPPORT_KTX2=1) + else() + set(KTX2_DEFINITION BASISD_SUPPORT_KTX2=0) + endif() + + if (KTX2_ZSTANDARD) + set(SRC_LIST ${SRC_LIST} + ../../zstd/zstddeclib.c + ) + set(ZSTD_DEFINITION BASISD_SUPPORT_KTX2_ZSTD=1) + else() + set(ZSTD_DEFINITION BASISD_SUPPORT_KTX2_ZSTD=0) + endif() + +# message("KTX2_DEFINITION=${KTX2_DEFINITION}) +# message("ZSTD_DEFINITION=${ZSTD_DEFINITION}) + + add_executable(basis_transcoder.js ${SRC_LIST}) + + target_compile_definitions(basis_transcoder.js PRIVATE NDEBUG BASISD_SUPPORT_UASTC=1 BASISD_SUPPORT_BC7=1 BASISD_SUPPORT_ATC=0 BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY=0 BASISD_SUPPORT_PVRTC2=0 BASISD_SUPPORT_FXT1=0 BASISD_SUPPORT_ETC2_EAC_RG11=0 BASISU_SUPPORT_ENCODING=0 ${KTX2_DEFINITION} ${ZSTD_DEFINITION} ) + target_compile_options(basis_transcoder.js PRIVATE -O3 -fno-strict-aliasing) + target_include_directories(basis_transcoder.js PRIVATE ../../transcoder) + + set_target_properties(basis_transcoder.js PROPERTIES + OUTPUT_NAME "basis_transcoder" + SUFFIX ".js" + LINK_FLAGS "--bind -s ALLOW_MEMORY_GROWTH=1 -O3 -s ASSERTIONS=0 -s MALLOC=emmalloc -s MODULARIZE=1 -s EXPORT_NAME=BASIS ") +endif() diff --git a/ktx/external/basisu/webgl/transcoder/README.md b/ktx/external/basisu/webgl/transcoder/README.md new file mode 100644 index 0000000..edb5c30 --- /dev/null +++ b/ktx/external/basisu/webgl/transcoder/README.md @@ -0,0 +1,7 @@ +Prebuilt versions of `basis_transcoder.js` and `basis_transcoder.wasm` are included in the `build/` folder, and are sufficient for local demos. To build the transcoder yourself, first install emscripten ([tutorial](https://webassembly.org/getting-started/developers-guide/)) and cmake ([download](https://cmake.org/download/)). Then run: + +```shell +cd webgl/transcoder/build/ +emcmake cmake ../ +make +``` diff --git a/ktx/external/basisu/webgl/transcoder/basis_wrappers.cpp b/ktx/external/basisu/webgl/transcoder/basis_wrappers.cpp new file mode 100644 index 0000000..739f092 --- /dev/null +++ b/ktx/external/basisu/webgl/transcoder/basis_wrappers.cpp @@ -0,0 +1,1961 @@ +// basis_wrappers.cpp - Wrappers to the C++ compressor and transcoder for WebAssembly/WebGL use. +// +// **Important**: +// Compile with -fno-strict-aliasing +// This code HAS NOT been tested with strict aliasing enabled. +// The "initializeBasis()" function MUST be called at least once before using either the compressor or transcoder. +// +// There are four main categories of wrappers in this module: +// 1. Transcoding, low-level .basis file information: See class basis_file. Only depends on transcoder/basisu_transcoder.cpp. +// getFileDesc(), getImageDesc(), getImageLevelDesc(): These functions return low-level information about where compressed data is located for each image in a .basis file. +// This is useful for when you want to extract the compressed data and embed it into your own file formats, for container independent transcoding. +// +// 2. Encoding (optional): See class basis_encoder. Encodes PNG or 32bpp images to .basis files in memory. Must compile with BASISU_SUPPORT_ENCODING=1. +// Requires basisu_transcoder.cpp as well as all the .cpp files in the "encoder" directory. Results in a larger WebAssembly executable. +// +// 3. Low level transcoding/container independent transcoding: See class lowlevel_etc1s_image_transcoder or function transcodeUASTCImage(). For +// transcoding raw compressed ETC1S/UASTC texture data from non-.basis files (say from KTX2) to GPU texture data. +// +// 4. Helpers, transcoder texture format information: See functions getBytesPerBlockOrPixel(), formatHasAlpha(), etc. + +// If BASISU_SUPPORT_ENCODING is 1, wrappers for the compressor will be included. Otherwise, only the wrappers for the transcoder will be compiled in. +#ifndef BASISU_SUPPORT_ENCODING +#define BASISU_SUPPORT_ENCODING 0 +#endif + +// Enable debug printf()'s in this module. +#ifndef BASISU_DEBUG_PRINTF +#define BASISU_DEBUG_PRINTF 0 +#endif + +#include "basisu_transcoder.h" +#include +#include + +#if BASISU_SUPPORT_ENCODING +#include "../../encoder/basisu_comp.h" +#include "../../encoder/basisu_resampler_filters.h" +#endif + +using namespace emscripten; +using namespace basist; +using namespace basisu; + +static bool g_basis_initialized_flag; + +void basis_init() +{ +#if BASISU_DEBUG_PRINTF + printf("basis_init()\n"); +#endif + + if (g_basis_initialized_flag) + return; + +#if BASISU_SUPPORT_ENCODING + basisu_encoder_init(); +#endif + + basisu_transcoder_init(); + + g_basis_initialized_flag = true; +} + +static void copy_from_jsbuffer(const emscripten::val& srcBuffer, basisu::vector& dstVec) +{ + unsigned int length = srcBuffer["length"].as(); + + dstVec.resize(length); + + emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; + emscripten::val memoryView = srcBuffer["constructor"].new_(memory, reinterpret_cast(dstVec.data()), length); + + // Copy the bytes from the Javascript buffer. + memoryView.call("set", srcBuffer); +} + +static bool copy_to_jsbuffer(const emscripten::val& dstBuffer, const basisu::vector& srcVec) +{ + if (srcVec.empty()) + { +#if BASISU_DEBUG_PRINTF + printf("copy_to_jsbuffer: Provided source buffer is empty\n"); +#endif + return false; + } + + // Make sure the provided buffer from Javascript is big enough. If not, bail. + int dstBufferLen = dstBuffer["byteLength"].as(); + + if (srcVec.size() > dstBufferLen) + { +#if BASISU_DEBUG_PRINTF + printf("copy_to_jsbuffer: Provided destination buffer is too small (wanted %u bytes, got %u bytes)!\n", (uint32_t)srcVec.size(), dstBufferLen); +#endif + assert(0); + return false; + } + + emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; + emscripten::val memoryView = emscripten::val::global("Uint8Array").new_(memory, reinterpret_cast(srcVec.data()), srcVec.size()); + + // Copy the bytes into the Javascript buffer. + dstBuffer.call("set", memoryView); + + return true; +} + +#define BASIS_MAGIC 0xDEADBEE1 +#define KTX2_MAGIC 0xDEADBEE2 + +struct basis_file_desc +{ + uint32_t m_version; + + uint32_t m_us_per_frame; + + uint32_t m_total_images; + + uint32_t m_userdata0; + uint32_t m_userdata1; + + // Type of texture (cETC1S or cUASTC4x4) + uint32_t m_tex_format; // basis_tex_format + + bool m_y_flipped; + bool m_has_alpha_slices; + + // ETC1S endpoint codebook + uint32_t m_num_endpoints; + uint32_t m_endpoint_palette_ofs; + uint32_t m_endpoint_palette_len; + + // ETC1S selector codebook + uint32_t m_num_selectors; + uint32_t m_selector_palette_ofs; + uint32_t m_selector_palette_len; + + // Huffman codelength tables + uint32_t m_tables_ofs; + uint32_t m_tables_len; +}; + +struct basis_image_desc +{ + uint32_t m_orig_width; + uint32_t m_orig_height; + uint32_t m_num_blocks_x; + uint32_t m_num_blocks_y; + uint32_t m_num_levels; + + // Will be true if the image has alpha (for UASTC this may vary per-image) + bool m_alpha_flag; + bool m_iframe_flag; +}; + +struct basis_image_level_desc +{ + // File offset/length of the compressed ETC1S or UASTC texture data. + uint32_t m_rgb_file_ofs; + uint32_t m_rgb_file_len; + + // Optional alpha data file offset/length - will be 0's for UASTC or opaque ETC1S files. + uint32_t m_alpha_file_ofs; + uint32_t m_alpha_file_len; +}; + +struct basis_file +{ + int m_magic = 0; + basisu_transcoder m_transcoder; + basisu::vector m_file; + + basis_file(const emscripten::val& jsBuffer) + : m_file([&]() { + size_t byteLength = jsBuffer["byteLength"].as(); + return basisu::vector(byteLength); + }()) + { + if (!g_basis_initialized_flag) + { +#if BASISU_DEBUG_PRINTF + printf("basis_file::basis_file: Must call basis_init() first!\n"); +#endif + assert(0); + return; + } + + unsigned int length = jsBuffer["length"].as(); + emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; + emscripten::val memoryView = jsBuffer["constructor"].new_(memory, reinterpret_cast(m_file.data()), length); + memoryView.call("set", jsBuffer); + + if (!m_transcoder.validate_header(m_file.data(), m_file.size())) + { +#if BASISU_DEBUG_PRINTF + printf("basis_file::basis_file: m_transcoder.validate_header() failed!\n"); +#endif + m_file.clear(); + } + + // Initialized after validation + m_magic = BASIS_MAGIC; + } + + void close() + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return; + + m_file.clear(); + } + + uint32_t getHasAlpha() + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; + + basisu_image_level_info li; + if (!m_transcoder.get_image_level_info(m_file.data(), m_file.size(), li, 0, 0)) + return 0; + + return li.m_alpha_flag; + } + + uint32_t getNumImages() + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; + + return m_transcoder.get_total_images(m_file.data(), m_file.size()); + } + + uint32_t getNumLevels(uint32_t image_index) + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; + + basisu_image_info ii; + if (!m_transcoder.get_image_info(m_file.data(), m_file.size(), ii, image_index)) + return 0; + + return ii.m_total_levels; + } + + uint32_t getImageWidth(uint32_t image_index, uint32_t level_index) + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; + + uint32_t orig_width, orig_height, total_blocks; + if (!m_transcoder.get_image_level_desc(m_file.data(), m_file.size(), image_index, level_index, orig_width, orig_height, total_blocks)) + return 0; + + return orig_width; + } + + uint32_t getImageHeight(uint32_t image_index, uint32_t level_index) + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; + + uint32_t orig_width, orig_height, total_blocks; + if (!m_transcoder.get_image_level_desc(m_file.data(), m_file.size(), image_index, level_index, orig_width, orig_height, total_blocks)) + return 0; + + return orig_height; + } + + basis_file_desc getFileDesc() + { + basis_file_desc result; + memset(&result, 0, sizeof(result)); + + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return result; + + basisu_file_info file_info; + + if (!m_transcoder.get_file_info(m_file.data(), m_file.size(), file_info)) + { + assert(0); + return result; + } + + result.m_version = file_info.m_version; + result.m_us_per_frame = file_info.m_us_per_frame; + result.m_total_images = file_info.m_total_images; + result.m_userdata0 = file_info.m_userdata0; + result.m_userdata1 = file_info.m_userdata1; + result.m_tex_format = static_cast(file_info.m_tex_format); + result.m_y_flipped = file_info.m_y_flipped; + result.m_has_alpha_slices = file_info.m_has_alpha_slices; + + result.m_num_endpoints = file_info.m_total_endpoints; + result.m_endpoint_palette_ofs = file_info.m_endpoint_codebook_ofs; + result.m_endpoint_palette_len = file_info.m_endpoint_codebook_size; + + result.m_num_selectors = file_info.m_total_selectors; + result.m_selector_palette_ofs = file_info.m_selector_codebook_ofs; + result.m_selector_palette_len = file_info.m_selector_codebook_size; + + result.m_tables_ofs = file_info.m_tables_ofs; + result.m_tables_len = file_info.m_tables_size; + + return result; + } + + basis_image_desc getImageDesc(uint32_t image_index) + { + basis_image_desc result; + memset(&result, 0, sizeof(result)); + + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return result; + + basisu_image_info image_info; + + // bool get_image_info(const void *pData, uint32_t data_size, basisu_image_info &image_info, uint32_t image_index) const; + if (!m_transcoder.get_image_info(m_file.data(), m_file.size(), image_info, image_index)) + { + assert(0); + return result; + } + + result.m_orig_width = image_info.m_orig_width; + result.m_orig_height = image_info.m_orig_height; + result.m_num_blocks_x = image_info.m_num_blocks_x; + result.m_num_blocks_y = image_info.m_num_blocks_y; + result.m_num_levels = image_info.m_total_levels; + result.m_alpha_flag = image_info.m_alpha_flag; + result.m_iframe_flag = image_info.m_iframe_flag; + + return result; + } + + basis_image_level_desc getImageLevelDesc(uint32_t image_index, uint32_t level_index) + { + basis_image_level_desc result; + memset(&result, 0, sizeof(result)); + + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return result; + + basisu_image_level_info image_info; + + if (!m_transcoder.get_image_level_info(m_file.data(), m_file.size(), image_info, image_index, level_index)) + { + assert(0); + return result; + } + + result.m_rgb_file_ofs = image_info.m_rgb_file_ofs; + result.m_rgb_file_len = image_info.m_rgb_file_len; + result.m_alpha_file_ofs = image_info.m_alpha_file_ofs; + result.m_alpha_file_len = image_info.m_alpha_file_len; + + return result; + } + + uint32_t getImageTranscodedSizeInBytes(uint32_t image_index, uint32_t level_index, uint32_t format) + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; + + if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) + return 0; + + uint32_t orig_width, orig_height, total_blocks; + if (!m_transcoder.get_image_level_desc(m_file.data(), m_file.size(), image_index, level_index, orig_width, orig_height, total_blocks)) + return 0; + + const transcoder_texture_format transcoder_format = static_cast(format); + + if (basis_transcoder_format_is_uncompressed(transcoder_format)) + { + // Uncompressed formats are just plain raster images. + const uint32_t bytes_per_pixel = basis_get_uncompressed_bytes_per_pixel(transcoder_format); + const uint32_t bytes_per_line = orig_width * bytes_per_pixel; + const uint32_t bytes_per_slice = bytes_per_line * orig_height; + return bytes_per_slice; + } + else + { + // Compressed formats are 2D arrays of blocks. + const uint32_t bytes_per_block = basis_get_bytes_per_block_or_pixel(transcoder_format); + + if (transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGB || transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) + { + // For PVRTC1, Basis only writes (or requires) total_blocks * bytes_per_block. But GL requires extra padding for very small textures: + // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt + const uint32_t width = (orig_width + 3) & ~3; + const uint32_t height = (orig_height + 3) & ~3; + const uint32_t size_in_bytes = (std::max(8U, width) * std::max(8U, height) * 4 + 7) / 8; + return size_in_bytes; + } + + return total_blocks * bytes_per_block; + } + } + + bool isUASTC() + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return false; + + return m_transcoder.get_tex_format(m_file.data(), m_file.size()) == basis_tex_format::cUASTC4x4; + } + + uint32_t startTranscoding() + { + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; + + return m_transcoder.start_transcoding(m_file.data(), m_file.size()); + } + + uint32_t transcodeImage(const emscripten::val& dst, uint32_t image_index, uint32_t level_index, uint32_t format, uint32_t unused, uint32_t get_alpha_for_opaque_formats) + { + (void)unused; + + assert(m_magic == BASIS_MAGIC); + if (m_magic != BASIS_MAGIC) + return 0; + + if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) + return 0; + + const transcoder_texture_format transcoder_format = static_cast(format); + + uint32_t orig_width, orig_height, total_blocks; + if (!m_transcoder.get_image_level_desc(m_file.data(), m_file.size(), image_index, level_index, orig_width, orig_height, total_blocks)) + return 0; + + basisu::vector dst_data; + + uint32_t flags = get_alpha_for_opaque_formats ? cDecodeFlagsTranscodeAlphaDataToOpaqueFormats : 0; + + uint32_t status; + + if (basis_transcoder_format_is_uncompressed(transcoder_format)) + { + const uint32_t bytes_per_pixel = basis_get_uncompressed_bytes_per_pixel(transcoder_format); + const uint32_t bytes_per_line = orig_width * bytes_per_pixel; + const uint32_t bytes_per_slice = bytes_per_line * orig_height; + + dst_data.resize(bytes_per_slice); + + status = m_transcoder.transcode_image_level( + m_file.data(), m_file.size(), image_index, level_index, + dst_data.data(), orig_width * orig_height, + transcoder_format, + flags, + orig_width, + nullptr, + orig_height); + } + else + { + uint32_t bytes_per_block = basis_get_bytes_per_block_or_pixel(transcoder_format); + + uint32_t required_size = total_blocks * bytes_per_block; + + if (transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGB || transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) + { + // For PVRTC1, Basis only writes (or requires) total_blocks * bytes_per_block. But GL requires extra padding for very small textures: + // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt + // The transcoder will clear the extra bytes followed the used blocks to 0. + const uint32_t width = (orig_width + 3) & ~3; + const uint32_t height = (orig_height + 3) & ~3; + required_size = (std::max(8U, width) * std::max(8U, height) * 4 + 7) / 8; + assert(required_size >= total_blocks * bytes_per_block); + } + + dst_data.resize(required_size); + + status = m_transcoder.transcode_image_level( + m_file.data(), m_file.size(), image_index, level_index, + dst_data.data(), dst_data.size() / bytes_per_block, + static_cast(format), + flags); + } + + emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; + emscripten::val memoryView = emscripten::val::global("Uint8Array").new_(memory, reinterpret_cast(dst_data.data()), dst_data.size()); + + dst.call("set", memoryView); + return status; + } +}; + +#if BASISD_SUPPORT_KTX2 +struct ktx2_header_js +{ + uint32_t m_vk_format; + uint32_t m_type_size; + uint32_t m_pixel_width; + uint32_t m_pixel_height; + uint32_t m_pixel_depth; + uint32_t m_layer_count; + uint32_t m_face_count; + uint32_t m_level_count; + uint32_t m_supercompression_scheme; + uint32_t m_dfd_byte_offset; + uint32_t m_dfd_byte_length; + uint32_t m_kvd_byte_offset; + uint32_t m_kvd_byte_length; + uint32_t m_sgd_byte_offset; + uint32_t m_sgd_byte_length; +}; + +struct ktx2_file +{ + int m_magic = 0; + basist::ktx2_transcoder m_transcoder; + basisu::vector m_file; + bool m_is_valid = false; + + ktx2_file(const emscripten::val& jsBuffer) + : m_file([&]() { + size_t byteLength = jsBuffer["byteLength"].as(); + return basisu::vector(byteLength); + }()) + { + if (!g_basis_initialized_flag) + { +#if BASISU_DEBUG_PRINTF + printf("basis_file::basis_file: Must call basis_init() first!\n"); +#endif + assert(0); + return; + } + + unsigned int length = jsBuffer["length"].as(); + emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; + emscripten::val memoryView = jsBuffer["constructor"].new_(memory, reinterpret_cast(m_file.data()), length); + memoryView.call("set", jsBuffer); + + if (!m_transcoder.init(m_file.data(), m_file.size())) + { +#if BASISU_DEBUG_PRINTF + printf("m_transcoder.init() failed!\n"); +#endif + assert(0); + + m_file.clear(); + } + + m_is_valid = true; + + // Initialized after validation + m_magic = KTX2_MAGIC; + } + + bool isValid() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return false; + + return m_is_valid; + } + + void close() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return; + + m_file.clear(); + m_transcoder.clear(); + } + + uint32_t getDFDSize() + { + return m_transcoder.get_dfd().size(); + } + + uint32_t getDFD(const emscripten::val& dst) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + const uint8_vec &dst_data = m_transcoder.get_dfd(); + + if (dst_data.size()) + return copy_to_jsbuffer(dst, dst_data); + + return 1; + } + + ktx2_header_js getHeader() + { + ktx2_header_js hdr; + memset(&hdr, 0, sizeof(hdr)); + + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return hdr; + + const basist::ktx2_header& h = m_transcoder.get_header(); + + hdr.m_vk_format = h.m_vk_format; + hdr.m_type_size = h.m_type_size; + hdr.m_pixel_width = h.m_pixel_width; + hdr.m_pixel_height = h.m_pixel_height; + hdr.m_pixel_depth = h.m_pixel_depth; + hdr.m_layer_count = h.m_layer_count; + hdr.m_face_count = h.m_face_count; + hdr.m_level_count = h.m_level_count; + hdr.m_supercompression_scheme = h.m_supercompression_scheme; + hdr.m_dfd_byte_offset = h.m_dfd_byte_offset; + hdr.m_dfd_byte_length = h.m_dfd_byte_length; + hdr.m_kvd_byte_offset = h.m_kvd_byte_offset; + hdr.m_kvd_byte_length = h.m_kvd_byte_length; + + // emscripten doesn't support binding uint64_t for some reason + assert(h.m_sgd_byte_offset <= UINT32_MAX); + assert(h.m_sgd_byte_length <= UINT32_MAX); + hdr.m_sgd_byte_offset = (uint32_t)h.m_sgd_byte_offset; + hdr.m_sgd_byte_length = (uint32_t)h.m_sgd_byte_length; + + return hdr; + } + + bool hasKey(std::string key_name) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return false; + + return m_transcoder.find_key(key_name) != nullptr; + } + + uint32_t getTotalKeys() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + return m_transcoder.get_key_values().size(); + } + + std::string getKey(uint32_t index) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return std::string(""); + + return std::string((const char*)m_transcoder.get_key_values()[index].m_key.data()); + } + + uint32_t getKeyValueSize(std::string key_name) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + const uint8_vec* p = m_transcoder.find_key(key_name); + return p ? p->size() : 0; + } + + uint32_t getKeyValue(std::string key_name, const emscripten::val& dst) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + const uint8_vec* p = m_transcoder.find_key(key_name); + if (!p) + return 0; + + if (p->size()) + return copy_to_jsbuffer(dst, *p); + + return 1; + } + + uint32_t getWidth() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_width(); + } + + uint32_t getHeight() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_height(); + } + + uint32_t getFaces() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_faces(); + } + + uint32_t getLayers() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_layers(); + } + + uint32_t getLevels() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_levels(); + } + + uint32_t getFormat() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return (uint32_t)m_transcoder.get_format(); + } + + bool isUASTC() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return false; + return m_transcoder.is_uastc(); + } + + bool isETC1S() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return false; + return m_transcoder.is_etc1s(); + } + + bool getHasAlpha() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return false; + return m_transcoder.get_has_alpha(); + } + + uint32_t getDFDColorModel() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_color_model(); + } + + uint32_t getDFDColorPrimaries() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_color_primaries(); + } + + uint32_t getDFDTransferFunc() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_transfer_func(); + } + + uint32_t getDFDFlags() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_flags(); + } + + uint32_t getDFDTotalSamples() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_total_samples(); + } + + uint32_t getDFDChannelID0() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_channel_id0(); + } + + uint32_t getDFDChannelID1() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.get_dfd_channel_id1(); + } + + // isVideo() will return true if there was a KTXanimData key, or if (after calling start_transcoding()) there were any P-frames on ETC1S files. + bool isVideo() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + return m_transcoder.is_video(); + } + + // startTranscoding() must be called before calling getETC1SImageDescImageFlags(). + uint32_t getETC1SImageDescImageFlags(uint32_t level_index, uint32_t layer_index, uint32_t face_index) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + return m_transcoder.get_etc1s_image_descs_image_flags(level_index, layer_index, face_index); + } + + ktx2_image_level_info getImageLevelInfo(uint32_t level_index, uint32_t layer_index, uint32_t face_index) + { + ktx2_image_level_info info; + memset(&info, 0, sizeof(info)); + + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return info; + + if (!m_transcoder.get_image_level_info(info, level_index, layer_index, face_index)) + { + assert(0); + return info; + } + + return info; + } + + uint32_t getImageTranscodedSizeInBytes(uint32_t level_index, uint32_t layer_index, uint32_t face_index, uint32_t format) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) + return 0; + + ktx2_image_level_info info; + if (!m_transcoder.get_image_level_info(info, level_index, layer_index, face_index)) + return 0; + + uint32_t orig_width = info.m_orig_width, orig_height = info.m_orig_height, total_blocks = info.m_total_blocks; + + const transcoder_texture_format transcoder_format = static_cast(format); + + if (basis_transcoder_format_is_uncompressed(transcoder_format)) + { + // Uncompressed formats are just plain raster images. + const uint32_t bytes_per_pixel = basis_get_uncompressed_bytes_per_pixel(transcoder_format); + const uint32_t bytes_per_line = orig_width * bytes_per_pixel; + const uint32_t bytes_per_slice = bytes_per_line * orig_height; + return bytes_per_slice; + } + else + { + // Compressed formats are 2D arrays of blocks. + const uint32_t bytes_per_block = basis_get_bytes_per_block_or_pixel(transcoder_format); + + if (transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGB || transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) + { + // For PVRTC1, Basis only writes (or requires) total_blocks * bytes_per_block. But GL requires extra padding for very small textures: + // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt + const uint32_t width = (orig_width + 3) & ~3; + const uint32_t height = (orig_height + 3) & ~3; + const uint32_t size_in_bytes = (std::max(8U, width) * std::max(8U, height) * 4 + 7) / 8; + return size_in_bytes; + } + + return total_blocks * bytes_per_block; + } + } + + // Must be called before transcodeImage() can be called. + // On ETC1S files this method decompresses the ETC1S global data, along with fetching the ETC1S image desc array, so it's not free to call. + uint32_t startTranscoding() + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + return m_transcoder.start_transcoding(); + } + + // get_alpha_for_opaque_formats defaults to false + // channel0/channel1 default to -1 + uint32_t transcodeImage(const emscripten::val& dst, uint32_t level_index, uint32_t layer_index, uint32_t face_index, uint32_t format, uint32_t get_alpha_for_opaque_formats, int channel0, int channel1) + { + assert(m_magic == KTX2_MAGIC); + if (m_magic != KTX2_MAGIC) + return 0; + + if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) + return 0; + + const transcoder_texture_format transcoder_format = static_cast(format); + + ktx2_image_level_info info; + if (!m_transcoder.get_image_level_info(info, level_index, layer_index, face_index)) + return 0; + + uint32_t orig_width = info.m_orig_width, orig_height = info.m_orig_height, total_blocks = info.m_total_blocks; + + basisu::vector dst_data; + + uint32_t flags = get_alpha_for_opaque_formats ? cDecodeFlagsTranscodeAlphaDataToOpaqueFormats : 0; + + uint32_t status; + + if (basis_transcoder_format_is_uncompressed(transcoder_format)) + { + const uint32_t bytes_per_pixel = basis_get_uncompressed_bytes_per_pixel(transcoder_format); + const uint32_t bytes_per_line = orig_width * bytes_per_pixel; + const uint32_t bytes_per_slice = bytes_per_line * orig_height; + + dst_data.resize(bytes_per_slice); + + status = m_transcoder.transcode_image_level( + level_index, layer_index, face_index, + dst_data.data(), orig_width * orig_height, + transcoder_format, + flags, + orig_width, + orig_height, + channel0, channel1, + nullptr); + } + else + { + uint32_t bytes_per_block = basis_get_bytes_per_block_or_pixel(transcoder_format); + + uint32_t required_size = total_blocks * bytes_per_block; + + if (transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGB || transcoder_format == transcoder_texture_format::cTFPVRTC1_4_RGBA) + { + // For PVRTC1, Basis only writes (or requires) total_blocks * bytes_per_block. But GL requires extra padding for very small textures: + // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt + // The transcoder will clear the extra bytes followed the used blocks to 0. + const uint32_t width = (orig_width + 3) & ~3; + const uint32_t height = (orig_height + 3) & ~3; + required_size = (std::max(8U, width) * std::max(8U, height) * 4 + 7) / 8; + assert(required_size >= total_blocks * bytes_per_block); + } + + dst_data.resize(required_size); + + status = m_transcoder.transcode_image_level( + level_index, layer_index, face_index, + dst_data.data(), dst_data.size() / bytes_per_block, + static_cast(format), + flags, + 0, + 0, + channel0, channel1, + nullptr); + } + + emscripten::val memory = emscripten::val::module_property("HEAP8")["buffer"]; + emscripten::val memoryView = emscripten::val::global("Uint8Array").new_(memory, reinterpret_cast(dst_data.data()), dst_data.size()); + + dst.call("set", memoryView); + return status; + } + +}; +#endif // BASISD_SUPPORT_KTX2 + +#if BASISU_SUPPORT_ENCODING +class basis_encoder +{ +public: + basis_compressor_params m_params; + + basis_encoder() + { + } + + bool set_slice_source_image(uint32_t slice_index, const emscripten::val& src_image_js_val, uint32_t src_image_width, uint32_t src_image_height, bool src_image_is_png) + { + // Resize the source_images array if necessary + if (slice_index >= m_params.m_source_images.size()) + m_params.m_source_images.resize(slice_index + 1); + + // First copy the src image buffer to the heap. + basisu::vector src_image_buf; + copy_from_jsbuffer(src_image_js_val, src_image_buf); + + // Now extract the source image. + image& src_img = m_params.m_source_images[slice_index]; + if (src_image_is_png) + { + // It's a PNG file, so try and parse it. + if (!load_png(src_image_buf.data(), src_image_buf.size(), src_img, nullptr)) + { +#if BASISU_DEBUG_PRINTF + printf("basis_encoder::set_slice_source_image: Failed parsing provided PNG file!\n"); +#endif + return false; + } + + src_image_width = src_img.get_width(); + src_image_height = src_img.get_height(); + } + else + { + // It's a raw image, so check the buffer's size. + if (src_image_buf.size() != src_image_width * src_image_height * sizeof(uint32_t)) + { +#if BASISU_DEBUG_PRINTF + printf("basis_encoder::set_slice_source_image: Provided source buffer has an invalid size!\n"); +#endif + return false; + } + + // Copy the raw image's data into our source image. + src_img.resize(src_image_width, src_image_height); + memcpy(src_img.get_ptr(), src_image_buf.data(), src_image_width * src_image_height * sizeof(uint32_t)); + } + + return true; + } + + uint32_t encode(const emscripten::val& dst_basis_file_js_val) + { + if (!g_basis_initialized_flag) + { +#if BASISU_DEBUG_PRINTF + printf("basis_encoder::encode: Must call basis_init() first!\n"); +#endif + assert(0); + return 0; + } + + // We don't use threading for now, but the compressor needs a job pool. + job_pool jpool(1); + + // Initialize the compression parameters structure. This is the same structure that the command line tool fills in. + basis_compressor_params ¶ms = m_params; + + params.m_pJob_pool = &jpool; + + // Disabling multithreading for now, which sucks. + params.m_multithreading = false; + + params.m_status_output = params.m_debug; + + params.m_read_source_images = false; + params.m_write_output_basis_files = false; + + basis_compressor comp; + + if (!comp.init(params)) + { +#if BASISU_DEBUG_PRINTF + printf("Failed initializing BasisU compressor! One or more provided parameters may be invalid.\n"); +#endif + return 0; + } + +#if BASISU_DEBUG_PRINTF + printf("Begin BasisU compression\n"); +#endif + + basis_compressor::error_code ec = comp.process(); + +#if BASISU_DEBUG_PRINTF + printf("BasisU compression done, status %u, %u bytes\n", (uint32_t)ec, (uint32_t)comp.get_output_basis_file().size()); +#endif + + if (ec != basis_compressor::cECSuccess) + { + // Something failed during compression. +#if BASISU_DEBUG_PRINTF + printf("BasisU compression failed with status %u!\n", (uint32_t)ec); +#endif + return 0; + } + + if (params.m_create_ktx2_file) + { + // Compression succeeded, so copy the .ktx2 file bytes to the caller's buffer. + if (!copy_to_jsbuffer(dst_basis_file_js_val, comp.get_output_ktx2_file())) + return 0; + + // Return the file size of the .basis file in bytes. + return (uint32_t)comp.get_output_ktx2_file().size(); + } + else + { + // Compression succeeded, so copy the .basis file bytes to the caller's buffer. + if (!copy_to_jsbuffer(dst_basis_file_js_val, comp.get_output_basis_file())) + return 0; + + // Return the file size of the .basis file in bytes. + return (uint32_t)comp.get_output_basis_file().size(); + } + } +}; +#endif + +class lowlevel_etc1s_image_transcoder : public basisu_lowlevel_etc1s_transcoder +{ + // Using our own transcoder state, for video support. + basisu_transcoder_state m_state; + +public: + lowlevel_etc1s_image_transcoder() + { + } + + bool decode_palettes(uint32_t num_endpoints, const emscripten::val& endpoint_data, uint32_t num_selectors, const emscripten::val& selector_data) + { + basisu::vector temp_endpoint_data, temp_selector_data; + copy_from_jsbuffer(endpoint_data, temp_endpoint_data); + copy_from_jsbuffer(selector_data, temp_selector_data); + +#if 0 + printf("decode_palettes: %u %u %u %u, %u %u\n", + num_endpoints, (uint32_t)temp_endpoint_data.size(), + num_selectors, (uint32_t)temp_selector_data.size(), + temp_endpoint_data[0], temp_selector_data[0]); +#endif + + if (!temp_endpoint_data.size() || !temp_selector_data.size()) + { +#if BASISU_DEBUG_PRINTF + printf("decode_tables: endpoint_data and/or selector_data is empty\n"); +#endif + assert(0); + return false; + } + + return basisu_lowlevel_etc1s_transcoder::decode_palettes(num_endpoints, &temp_endpoint_data[0], (uint32_t)temp_endpoint_data.size(), + num_selectors, &temp_selector_data[0], (uint32_t)temp_selector_data.size()); + } + + bool decode_tables(const emscripten::val& table_data) + { + basisu::vector temp_table_data; + copy_from_jsbuffer(table_data, temp_table_data); + + if (!temp_table_data.size()) + { +#if BASISU_DEBUG_PRINTF + printf("decode_tables: table_data is empty\n"); +#endif + assert(0); + return false; + } + + return basisu_lowlevel_etc1s_transcoder::decode_tables(&temp_table_data[0], (uint32_t)temp_table_data.size()); + } + + bool transcode_image( + uint32_t target_format, // see transcoder_texture_format + const emscripten::val& output_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + const emscripten::val& compressed_data, + uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, + uint32_t rgb_offset, uint32_t rgb_length, uint32_t alpha_offset, uint32_t alpha_length, + uint32_t decode_flags, // see cDecodeFlagsPVRTCDecodeToNextPow2 + bool basis_file_has_alpha_slices, + bool is_video, + uint32_t output_row_pitch_in_blocks_or_pixels, + uint32_t output_rows_in_pixels) + { + if (!g_basis_initialized_flag) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_etc1s_image: basis_init() must be called first\n"); +#endif + assert(0); + return false; + } + + // FIXME: Access the JavaScript buffer directly vs. copying it. + basisu::vector temp_comp_data; + copy_from_jsbuffer(compressed_data, temp_comp_data); + + if (!temp_comp_data.size()) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_etc1s_image: compressed_data is empty\n"); +#endif + assert(0); + return false; + } + + uint32_t output_blocks_len = output_blocks["byteLength"].as(); + if (!output_blocks_len) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_etc1s_image: output_blocks is empty\n"); +#endif + assert(0); + return false; + } + + basisu::vector temp_output_blocks(output_blocks_len); + + bool status = basisu_lowlevel_etc1s_transcoder::transcode_image( + (transcoder_texture_format)target_format, + &temp_output_blocks[0], output_blocks_buf_size_in_blocks_or_pixels, + &temp_comp_data[0], temp_comp_data.size(), + num_blocks_x, num_blocks_y, orig_width, orig_height, level_index, + rgb_offset, rgb_length, alpha_offset, alpha_length, + decode_flags, + basis_file_has_alpha_slices, + is_video, + output_row_pitch_in_blocks_or_pixels, + &m_state, + output_rows_in_pixels); + + if (!status) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_etc1s_image: basisu_lowlevel_etc1s_transcoder::transcode_image failed\n"); +#endif + assert(0); + return false; + } + + if (!copy_to_jsbuffer(output_blocks, temp_output_blocks)) + return false; + + return true; + } +}; + +bool transcode_uastc_image( + uint32_t target_format_int, // see transcoder_texture_format + const emscripten::val& output_blocks, uint32_t output_blocks_buf_size_in_blocks_or_pixels, + const emscripten::val& compressed_data, + uint32_t num_blocks_x, uint32_t num_blocks_y, uint32_t orig_width, uint32_t orig_height, uint32_t level_index, + uint32_t slice_offset, uint32_t slice_length, + uint32_t decode_flags, // see cDecodeFlagsPVRTCDecodeToNextPow2 + bool has_alpha, + bool is_video, + uint32_t output_row_pitch_in_blocks_or_pixels, + uint32_t output_rows_in_pixels, + int channel0, int channel1) +{ + transcoder_texture_format target_format = static_cast(target_format_int); + + if (!g_basis_initialized_flag) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_uastc_image: basis_init() must be called first\n"); +#endif + assert(0); + return false; + } + + // FIXME: Access the JavaScript buffer directly vs. copying it. + basisu::vector temp_comp_data; + copy_from_jsbuffer(compressed_data, temp_comp_data); + + if (!temp_comp_data.size()) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_uastc_image: compressed_data is empty\n"); +#endif + assert(0); + return false; + } + + uint32_t output_blocks_len = output_blocks["byteLength"].as(); + if (!output_blocks_len) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_uastc_image: output_blocks is empty\n"); +#endif + assert(0); + return false; + } + +#if 0 + printf("format: %u\n", (uint32_t)target_format); + printf("output_blocks size: %u buf size: %u\n", output_blocks_len, output_blocks_buf_size_in_blocks_or_pixels); + printf("compressed_data size: %u\n", compressed_data["byteLength"].as()); + printf("%u %u %u %u %u\n", num_blocks_x, num_blocks_y, orig_width, orig_height, level_index); + printf("%u %u\n", slice_offset, slice_length); + printf("%u\n", decode_flags); + printf("has_alpha: %u is_video: %u\n", has_alpha, is_video); +#endif + + basisu::vector temp_output_blocks(output_blocks_len); + + basisu_lowlevel_uastc_transcoder transcoder; + + bool status = transcoder.transcode_image( + (transcoder_texture_format)target_format, + &temp_output_blocks[0], output_blocks_buf_size_in_blocks_or_pixels, + &temp_comp_data[0], temp_comp_data.size(), + num_blocks_x, num_blocks_y, orig_width, orig_height, level_index, + slice_offset, slice_length, + decode_flags, + has_alpha, + is_video, + output_row_pitch_in_blocks_or_pixels, + nullptr, + output_rows_in_pixels, + channel0, channel1); + + if (!status) + { +#if BASISU_DEBUG_PRINTF + printf("transcode_uastc_image: basisu_lowlevel_uastc_transcoder::transcode_image failed\n"); +#endif + assert(0); + return false; + } + + if (!copy_to_jsbuffer(output_blocks, temp_output_blocks)) + return false; + + return true; +} + +uint32_t get_bytes_per_block_or_pixel(uint32_t transcoder_tex_fmt) +{ + return basis_get_bytes_per_block_or_pixel(static_cast(transcoder_tex_fmt)); +} + +bool format_has_alpha(uint32_t transcoder_tex_fmt) +{ + return basis_transcoder_format_has_alpha(static_cast(transcoder_tex_fmt)); +} + +bool format_is_uncompressed(uint32_t transcoder_tex_fmt) +{ + return basis_transcoder_format_is_uncompressed(static_cast(transcoder_tex_fmt)); +} + +bool is_format_supported(uint32_t transcoder_tex_fmt) +{ + return basis_is_format_supported(static_cast(transcoder_tex_fmt)); +} + +uint32_t get_format_block_width(uint32_t transcoder_tex_fmt) +{ + return basis_get_block_width(static_cast(transcoder_tex_fmt)); +} + +uint32_t get_format_block_height(uint32_t transcoder_tex_fmt) +{ + return basis_get_block_height(static_cast(transcoder_tex_fmt)); +} + +EMSCRIPTEN_BINDINGS(basis_codec) { + function("initializeBasis", &basis_init); + + // Expose BasisFileDesc structure + value_object("BasisFileDesc") + .field("version", &basis_file_desc::m_version) + .field("usPerFrame", &basis_file_desc::m_us_per_frame) + .field("totalImages", &basis_file_desc::m_total_images) + .field("userdata0", &basis_file_desc::m_userdata0) + .field("userdata1", &basis_file_desc::m_userdata1) + .field("texFormat", &basis_file_desc::m_tex_format) + .field("yFlipped", &basis_file_desc::m_y_flipped) + .field("hasAlphaSlices", &basis_file_desc::m_has_alpha_slices) + .field("numEndpoints", &basis_file_desc::m_num_endpoints) + .field("endpointPaletteOfs", &basis_file_desc::m_endpoint_palette_ofs) + .field("endpointPaletteLen", &basis_file_desc::m_endpoint_palette_len) + .field("numSelectors", &basis_file_desc::m_num_selectors) + .field("selectorPaletteOfs", &basis_file_desc::m_selector_palette_ofs) + .field("selectorPaletteLen", &basis_file_desc::m_selector_palette_len) + .field("tablesOfs", &basis_file_desc::m_tables_ofs) + .field("tablesLen", &basis_file_desc::m_tables_len) + ; + + // Expose BasisImageDesc structure + value_object("BasisImageDesc") + .field("origWidth", &basis_image_desc::m_orig_width) + .field("origHeight", &basis_image_desc::m_orig_height) + .field("numBlocksX", &basis_image_desc::m_num_blocks_x) + .field("numBlocksY", &basis_image_desc::m_num_blocks_y) + .field("numLevels", &basis_image_desc::m_num_levels) + .field("alphaFlag", &basis_image_desc::m_alpha_flag) + .field("iframeFlag", &basis_image_desc::m_iframe_flag) + ; + + // Expose BasisImageLevelDesc structure + value_object("BasisImageLevelDesc") + .field("rgbFileOfs", &basis_image_level_desc::m_rgb_file_ofs) + .field("rgbFileLen", &basis_image_level_desc::m_rgb_file_len) + .field("alphaFileOfs", &basis_image_level_desc::m_alpha_file_ofs) + .field("alphaFileLen", &basis_image_level_desc::m_alpha_file_len) + ; + + // Expose some key enums to JavaScript code. + + // enum class transcoder_texture_format + enum_("transcoder_texture_format") + .value("cTFETC1_RGB", transcoder_texture_format::cTFETC1_RGB) + .value("cTFETC2_RGBA", transcoder_texture_format::cTFETC2_RGBA) + .value("cTFBC1_RGB", transcoder_texture_format::cTFBC1_RGB) + .value("cTFBC3_RGBA", transcoder_texture_format::cTFBC3_RGBA) + .value("cTFBC4_R", transcoder_texture_format::cTFBC4_R) + .value("cTFBC5_RG", transcoder_texture_format::cTFBC5_RG) + .value("cTFBC7_RGBA", transcoder_texture_format::cTFBC7_RGBA) + .value("cTFPVRTC1_4_RGB", transcoder_texture_format::cTFPVRTC1_4_RGB) + .value("cTFPVRTC1_4_RGBA", transcoder_texture_format::cTFPVRTC1_4_RGBA) + .value("cTFASTC_4x4_RGBA", transcoder_texture_format::cTFASTC_4x4_RGBA) + .value("cTFATC_RGB", transcoder_texture_format::cTFATC_RGB) + .value("cTFATC_RGBA", transcoder_texture_format::cTFATC_RGBA) + .value("cTFFXT1_RGB", transcoder_texture_format::cTFFXT1_RGB) + .value("cTFPVRTC2_4_RGB", transcoder_texture_format::cTFPVRTC2_4_RGB) + .value("cTFPVRTC2_4_RGBA", transcoder_texture_format::cTFPVRTC2_4_RGBA) + .value("cTFETC2_EAC_R11", transcoder_texture_format::cTFETC2_EAC_R11) + .value("cTFETC2_EAC_RG11", transcoder_texture_format::cTFETC2_EAC_RG11) + .value("cTFRGBA32", transcoder_texture_format::cTFRGBA32) + .value("cTFRGB565", transcoder_texture_format::cTFRGB565) + .value("cTFBGR565", transcoder_texture_format::cTFBGR565) + .value("cTFRGBA4444", transcoder_texture_format::cTFRGBA4444) + .value("cTFTotalTextureFormats", transcoder_texture_format::cTFTotalTextureFormats) + ; + + // Expose some useful transcoder_texture_format helper functions + function("getBytesPerBlockOrPixel", &get_bytes_per_block_or_pixel); + function("formatHasAlpha", &format_has_alpha); + function("formatIsUncompressed", &format_is_uncompressed); + function("isFormatSupported", &is_format_supported); + function("getFormatBlockWidth", &get_format_block_width); + function("getFormatBlockHeight", &get_format_block_height); + + // Expose enum basis_texture_type + enum_("basis_texture_type") + .value("cBASISTexType2D", cBASISTexType2D) + .value("cBASISTexType2DArray", cBASISTexType2DArray) + .value("cBASISTexTypeCubemapArray", cBASISTexTypeCubemapArray) + .value("cBASISTexTypeVideoFrames", cBASISTexTypeVideoFrames) + .value("cBASISTexTypeVolume", cBASISTexTypeVolume) + ; + + // Expose enum basis_tex_format + enum_("basis_tex_format") + .value("cETC1S", basis_tex_format::cETC1S) + .value("cUASTC4x4", basis_tex_format::cUASTC4x4) + ; + + // .basis file transcoder object. If all you want to do is transcode already encoded .basis files, this is all you really need. + class_("BasisFile") + .constructor() + .function("close", optional_override([](basis_file& self) { + return self.close(); + })) + .function("getHasAlpha", optional_override([](basis_file& self) { + return self.getHasAlpha(); + })) + .function("isUASTC", optional_override([](basis_file& self) { + return self.isUASTC(); + })) + .function("getNumImages", optional_override([](basis_file& self) { + return self.getNumImages(); + })) + .function("getNumLevels", optional_override([](basis_file& self, uint32_t imageIndex) { + return self.getNumLevels(imageIndex); + })) + .function("getImageWidth", optional_override([](basis_file& self, uint32_t imageIndex, uint32_t levelIndex) { + return self.getImageWidth(imageIndex, levelIndex); + })) + .function("getImageHeight", optional_override([](basis_file& self, uint32_t imageIndex, uint32_t levelIndex) { + return self.getImageHeight(imageIndex, levelIndex); + })) + // format is enum class transcoder_texture_format + .function("getImageTranscodedSizeInBytes", optional_override([](basis_file& self, uint32_t imageIndex, uint32_t levelIndex, uint32_t format) { + return self.getImageTranscodedSizeInBytes(imageIndex, levelIndex, format); + })) + .function("startTranscoding", optional_override([](basis_file& self) { + return self.startTranscoding(); + })) + // format is enum class transcoder_texture_format + .function("transcodeImage", optional_override([](basis_file& self, const emscripten::val& dst, uint32_t imageIndex, uint32_t levelIndex, uint32_t format, uint32_t unused, uint32_t getAlphaForOpaqueFormats) { + return self.transcodeImage(dst, imageIndex, levelIndex, format, unused, getAlphaForOpaqueFormats); + })) + // Returns low-level information about the basis file. + .function("getFileDesc", optional_override([](basis_file& self) { + return self.getFileDesc(); + })) + // Returns low-level information about a specific image in a basis file. An image can contain 1 or more mipmap levels. + .function("getImageDesc", optional_override([](basis_file& self, uint32_t imageIndex) { + return self.getImageDesc(imageIndex); + })) + // Returns low-level information about a specific image mipmap level in a basis file. + .function("getImageLevelDesc", optional_override([](basis_file& self, uint32_t imageIndex, uint32_t levelIndex) { + return self.getImageLevelDesc(imageIndex, levelIndex); + })) + + ; + + // Low-level container independent transcoding of ETC1S and UASTC slice data. + // These functions allow the caller to transcode compressed ETC1S or UASTC texture data that is embedded within arbitrary data files, such as from KTX2. + enum_("basisu_decode_flags") + .value("cDecodeFlagsPVRTCDecodeToNextPow2", cDecodeFlagsPVRTCDecodeToNextPow2) + .value("cDecodeFlagsTranscodeAlphaDataToOpaqueFormats", cDecodeFlagsTranscodeAlphaDataToOpaqueFormats) + .value("cDecodeFlagsBC1ForbidThreeColorBlocks", cDecodeFlagsBC1ForbidThreeColorBlocks) + .value("cDecodeFlagsOutputHasAlphaIndices", cDecodeFlagsOutputHasAlphaIndices) + .value("cDecodeFlagsHighQuality", cDecodeFlagsHighQuality) + ; + + // The low-level ETC1S transcoder is a class because it has persistent state (such as the endpoint/selector codebooks and Huffman tables, and transcoder state for video) + class_("LowLevelETC1SImageTranscoder") + .constructor<>() + .function("decodePalettes", &lowlevel_etc1s_image_transcoder::decode_palettes) + .function("decodeTables", &lowlevel_etc1s_image_transcoder::decode_tables) + .function("transcodeImage", &lowlevel_etc1s_image_transcoder::transcode_image) + ; + + // The low-level UASTC transcoder is a single function. + function("transcodeUASTCImage", &transcode_uastc_image); + + function("transcoderSupportsKTX2", &basisu_transcoder_supports_ktx2); + function("transcoderSupportsKTX2Zstd", &basisu_transcoder_supports_ktx2_zstd); + +#if BASISD_SUPPORT_KTX2 + // KTX2 enums/constants + enum_("ktx2_supercompression") + .value("KTX2_SS_NONE", KTX2_SS_NONE) + .value("KTX2_SS_BASISLZ", KTX2_SS_BASISLZ) + .value("KTX2_SS_ZSTANDARD", KTX2_SS_ZSTANDARD) + ; + + constant("KTX2_VK_FORMAT_UNDEFINED", KTX2_VK_FORMAT_UNDEFINED); + constant("KTX2_KDF_DF_MODEL_UASTC", KTX2_KDF_DF_MODEL_UASTC); + constant("KTX2_KDF_DF_MODEL_ETC1S", KTX2_KDF_DF_MODEL_ETC1S); + constant("KTX2_IMAGE_IS_P_FRAME", KTX2_IMAGE_IS_P_FRAME); + constant("KTX2_UASTC_BLOCK_SIZE", KTX2_UASTC_BLOCK_SIZE); + constant("KTX2_MAX_SUPPORTED_LEVEL_COUNT", KTX2_MAX_SUPPORTED_LEVEL_COUNT); + + constant("KTX2_KHR_DF_TRANSFER_LINEAR", KTX2_KHR_DF_TRANSFER_LINEAR); + constant("KTX2_KHR_DF_TRANSFER_SRGB", KTX2_KHR_DF_TRANSFER_SRGB); + + enum_("ktx2_df_channel_id") + .value("KTX2_DF_CHANNEL_ETC1S_RGB", KTX2_DF_CHANNEL_ETC1S_RGB) + .value("KTX2_DF_CHANNEL_ETC1S_RRR", KTX2_DF_CHANNEL_ETC1S_RRR) + .value("KTX2_DF_CHANNEL_ETC1S_GGG", KTX2_DF_CHANNEL_ETC1S_GGG) + .value("KTX2_DF_CHANNEL_ETC1S_AAA", KTX2_DF_CHANNEL_ETC1S_AAA) + .value("KTX2_DF_CHANNEL_UASTC_DATA", KTX2_DF_CHANNEL_UASTC_DATA) + .value("KTX2_DF_CHANNEL_UASTC_RGB", KTX2_DF_CHANNEL_UASTC_RGB) + .value("KTX2_DF_CHANNEL_UASTC_RGBA", KTX2_DF_CHANNEL_UASTC_RGBA) + .value("KTX2_DF_CHANNEL_UASTC_RRR", KTX2_DF_CHANNEL_UASTC_RRR) + .value("KTX2_DF_CHANNEL_UASTC_RRRG", KTX2_DF_CHANNEL_UASTC_RRRG) + .value("KTX2_DF_CHANNEL_UASTC_RG", KTX2_DF_CHANNEL_UASTC_RG) + ; + + enum_("ktx2_df_color_primaries") + .value("KTX2_DF_PRIMARIES_UNSPECIFIED", KTX2_DF_PRIMARIES_UNSPECIFIED) + .value("KTX2_DF_PRIMARIES_BT709", KTX2_DF_PRIMARIES_BT709) + .value("KTX2_DF_PRIMARIES_SRGB", KTX2_DF_PRIMARIES_SRGB) + .value("KTX2_DF_PRIMARIES_BT601_EBU", KTX2_DF_PRIMARIES_BT601_EBU) + .value("KTX2_DF_PRIMARIES_BT601_SMPTE", KTX2_DF_PRIMARIES_BT601_SMPTE) + .value("KTX2_DF_PRIMARIES_BT2020", KTX2_DF_PRIMARIES_BT2020) + .value("KTX2_DF_PRIMARIES_CIEXYZ", KTX2_DF_PRIMARIES_CIEXYZ) + .value("KTX2_DF_PRIMARIES_ACES", KTX2_DF_PRIMARIES_ACES) + .value("KTX2_DF_PRIMARIES_ACESCC", KTX2_DF_PRIMARIES_ACESCC) + .value("KTX2_DF_PRIMARIES_NTSC1953", KTX2_DF_PRIMARIES_NTSC1953) + .value("KTX2_DF_PRIMARIES_PAL525", KTX2_DF_PRIMARIES_PAL525) + .value("KTX2_DF_PRIMARIES_DISPLAYP3", KTX2_DF_PRIMARIES_DISPLAYP3) + .value("KTX2_DF_PRIMARIES_ADOBERGB", KTX2_DF_PRIMARIES_ADOBERGB) + ; + + // Expose ktx2_image_level_info structure + value_object("KTX2ImageLevelInfo") + .field("levelIndex", &ktx2_image_level_info::m_level_index) + .field("layerIndex", &ktx2_image_level_info::m_layer_index) + .field("faceIndex", &ktx2_image_level_info::m_face_index) + .field("origWidth", &ktx2_image_level_info::m_orig_width) + .field("origHeight", &ktx2_image_level_info::m_orig_height) + .field("width", &ktx2_image_level_info::m_width) + .field("height", &ktx2_image_level_info::m_height) + .field("numBlocksX", &ktx2_image_level_info::m_num_blocks_x) + .field("numBlocksY", &ktx2_image_level_info::m_num_blocks_y) + .field("totalBlocks", &ktx2_image_level_info::m_total_blocks) + .field("alphaFlag", &ktx2_image_level_info::m_alpha_flag) + .field("iframeFlag", &ktx2_image_level_info::m_iframe_flag) + ; + + // Expose the ktx2_header_js structure + value_object("KTX2Header") + .field("vkFormat", &ktx2_header_js::m_vk_format) + .field("typeSize", &ktx2_header_js::m_type_size) + .field("pixelWidth", &ktx2_header_js::m_pixel_width) + .field("pixelHeight", &ktx2_header_js::m_pixel_height) + .field("pixelDepth", &ktx2_header_js::m_pixel_depth) + .field("layerCount", &ktx2_header_js::m_layer_count) + .field("faceCount", &ktx2_header_js::m_face_count) + .field("levelCount", &ktx2_header_js::m_level_count) + .field("supercompressionScheme", &ktx2_header_js::m_supercompression_scheme) + .field("dfdByteOffset", &ktx2_header_js::m_dfd_byte_offset) + .field("dfdByteLength", &ktx2_header_js::m_dfd_byte_length) + .field("kvdByteOffset", &ktx2_header_js::m_kvd_byte_offset) + .field("kvdByteLength", &ktx2_header_js::m_kvd_byte_length) + .field("sgdByteOffset", &ktx2_header_js::m_sgd_byte_offset) + .field("sgdByteLength", &ktx2_header_js::m_sgd_byte_length) + ; + + // KTX2 transcoder class + class_("KTX2File") + .constructor() + .function("isValid", &ktx2_file::isValid) + .function("close", &ktx2_file::close) + .function("getDFDSize", &ktx2_file::getDFDSize) + .function("getDFD", &ktx2_file::getDFD) + .function("getHeader", &ktx2_file::getHeader) + .function("hasKey", &ktx2_file::hasKey) + .function("getTotalKeys", &ktx2_file::getTotalKeys) + .function("getKey", &ktx2_file::getKey) + .function("getKeyValueSize", &ktx2_file::getKeyValueSize) + .function("getKeyValue", &ktx2_file::getKeyValue) + .function("getWidth", &ktx2_file::getWidth) + .function("getHeight", &ktx2_file::getHeight) + .function("getFaces", &ktx2_file::getFaces) + .function("getLayers", &ktx2_file::getLayers) + .function("getLevels", &ktx2_file::getLevels) + .function("getFormat", &ktx2_file::getFormat) + .function("isUASTC", &ktx2_file::isUASTC) + .function("isETC1S", &ktx2_file::isETC1S) + .function("getHasAlpha", &ktx2_file::getHasAlpha) + .function("getDFDColorModel", &ktx2_file::getDFDColorModel) + .function("getDFDColorPrimaries", &ktx2_file::getDFDColorPrimaries) + .function("getDFDTransferFunc", &ktx2_file::getDFDTransferFunc) + .function("getDFDFlags", &ktx2_file::getDFDFlags) + .function("getDFDTotalSamples", &ktx2_file::getDFDTotalSamples) + .function("getDFDChannelID0", &ktx2_file::getDFDChannelID0) + .function("getDFDChannelID1", &ktx2_file::getDFDChannelID1) + .function("isVideo", &ktx2_file::isVideo) + .function("getETC1SImageDescImageFlags", &ktx2_file::getETC1SImageDescImageFlags) + .function("getImageLevelInfo", &ktx2_file::getImageLevelInfo) + .function("getImageTranscodedSizeInBytes", &ktx2_file::getImageTranscodedSizeInBytes) + .function("startTranscoding", &ktx2_file::startTranscoding) + .function("transcodeImage", &ktx2_file::transcodeImage) + ; + +#endif // BASISD_SUPPORT_KTX2 + + // Optional encoding/compression support of .basis and .KTX2 files (the same class encodes/compresses to either format). + +#if BASISU_SUPPORT_ENCODING + + // Compressor Constants + + constant("BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION", BASISU_MAX_SUPPORTED_TEXTURE_DIMENSION); + constant("BASISU_DEFAULT_ENDPOINT_RDO_THRESH", BASISU_DEFAULT_ENDPOINT_RDO_THRESH); + constant("BASISU_DEFAULT_SELECTOR_RDO_THRESH", BASISU_DEFAULT_SELECTOR_RDO_THRESH); + constant("BASISU_DEFAULT_QUALITY", BASISU_DEFAULT_QUALITY); + constant("BASISU_DEFAULT_HYBRID_SEL_CB_QUALITY_THRESH", BASISU_DEFAULT_HYBRID_SEL_CB_QUALITY_THRESH); + constant("BASISU_MAX_IMAGE_DIMENSION", BASISU_MAX_IMAGE_DIMENSION); + constant("BASISU_QUALITY_MIN", BASISU_QUALITY_MIN); + constant("BASISU_QUALITY_MAX", BASISU_QUALITY_MAX); + constant("BASISU_MAX_ENDPOINT_CLUSTERS", BASISU_MAX_ENDPOINT_CLUSTERS); + constant("BASISU_MAX_SELECTOR_CLUSTERS", BASISU_MAX_SELECTOR_CLUSTERS); + constant("BASISU_MAX_SLICES", BASISU_MAX_SLICES); + constant("BASISU_RDO_UASTC_DICT_SIZE_DEFAULT", BASISU_RDO_UASTC_DICT_SIZE_DEFAULT); + constant("BASISU_RDO_UASTC_DICT_SIZE_MIN", BASISU_RDO_UASTC_DICT_SIZE_MIN); + constant("BASISU_RDO_UASTC_DICT_SIZE_MAX", BASISU_RDO_UASTC_DICT_SIZE_MAX); + constant("BASISU_MAX_RESAMPLER_FILTERS", g_num_resample_filters); + constant("BASISU_DEFAULT_COMPRESSION_LEVEL", BASISU_DEFAULT_COMPRESSION_LEVEL); + constant("BASISU_MAX_COMPRESSION_LEVEL", BASISU_MAX_COMPRESSION_LEVEL); + + constant("cPackUASTCLevelFastest", cPackUASTCLevelFastest); + constant("cPackUASTCLevelFaster", cPackUASTCLevelFaster); + constant("cPackUASTCLevelDefault", cPackUASTCLevelDefault); + constant("cPackUASTCLevelSlower", cPackUASTCLevelSlower); + constant("cPackUASTCLevelVerySlow", cPackUASTCLevelVerySlow); + constant("cPackUASTCLevelMask", cPackUASTCLevelMask); + constant("cPackUASTCFavorUASTCError", cPackUASTCFavorUASTCError); + constant("cPackUASTCFavorBC7Error", cPackUASTCFavorBC7Error); + constant("cPackUASTCETC1FasterHints", cPackUASTCETC1FasterHints); + constant("cPackUASTCETC1FastestHints", cPackUASTCETC1FastestHints); + constant("cPackUASTCETC1DisableFlipAndIndividual", cPackUASTCETC1DisableFlipAndIndividual); + + constant("UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO", UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO); + constant("UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH", UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH); + + // Compression/encoding object. + // You create this object, call the set() methods to fill in the parameters/source images/options, call encode(), and you get back a .basis or .KTX2 file. + // You can call .encode() multiple times, changing the parameters/options in between calls. + // By default this class encodes to .basis, but call setCreateKTX2File() with true to get .KTX2 files. + class_("BasisEncoder") + .constructor<>() + + // Compresses the provided source slice(s) to an output .basis file. + // At the minimum, you must provided at least 1 source slice by calling setSliceSourceImage() before calling this method. + .function("encode", optional_override([](basis_encoder& self, const emscripten::val& dst_basis_file_js_val) { + return self.encode(dst_basis_file_js_val); + })) + + // Sets the slice's source image, either from a PNG file or from a raw 32-bit RGBA raster image. + // If the input is a raster image, the buffer must be width*height*4 bytes in size. The raster image is stored in top down scanline order. + // The first texel is the top-left texel. The texel byte order in memory is R,G,B,A (R first at offset 0, A last at offset 3). + // slice_index is the slice to change. Valid range is [0,BASISU_MAX_SLICES-1]. + .function("setSliceSourceImage", optional_override([](basis_encoder& self, uint32_t slice_index, const emscripten::val& src_image_js_val, uint32_t width, uint32_t height, bool src_image_is_png) { + return self.set_slice_source_image(slice_index, src_image_js_val, width, height, src_image_is_png); + })) + + // If true, the encoder will output a UASTC texture, otherwise a ETC1S texture. + .function("setUASTC", optional_override([](basis_encoder& self, bool uastc_flag) { + self.m_params.m_uastc = uastc_flag; + })) + + // If true the source images will be Y flipped before compression. + .function("setYFlip", optional_override([](basis_encoder& self, bool y_flip_flag) { + self.m_params.m_y_flip = y_flip_flag; + })) + + // Enables debug output to stdout + .function("setDebug", optional_override([](basis_encoder& self, bool debug_flag) { + self.m_params.m_debug = debug_flag; + g_debug_printf = debug_flag; + })) + + // If true, the input is assumed to be in sRGB space. Be sure to set this correctly! (Examples: True on photos, albedo/spec maps, and false on normal maps.) + .function("setPerceptual", optional_override([](basis_encoder& self, bool perceptual_flag) { + self.m_params.m_perceptual = perceptual_flag; + })) + + // Check source images for active/used alpha channels + .function("setCheckForAlpha", optional_override([](basis_encoder& self, bool check_for_alpha_flag) { + self.m_params.m_check_for_alpha = check_for_alpha_flag; + })) + + // Fource output .basis file to have an alpha channel + .function("setForceAlpha", optional_override([](basis_encoder& self, bool force_alpha_flag) { + self.m_params.m_force_alpha = force_alpha_flag; + })) + + // Set source image component swizzle. + // r,g,b,a - valid range is [0,3] + .function("setSwizzle", optional_override([](basis_encoder& self, uint32_t r, uint32_t g, uint32_t b, uint32_t a) { + assert((r < 4) && (g < 4) && (b < 4) && (a < 4)); + self.m_params.m_swizzle[0] = (char)r; + self.m_params.m_swizzle[1] = (char)g; + self.m_params.m_swizzle[2] = (char)b; + self.m_params.m_swizzle[3] = (char)a; + })) + + // If true, the input is assumed to be a normal map, and all source texels will be renormalized before encoding. + .function("setRenormalize", optional_override([](basis_encoder& self, bool renormalize_flag) { + self.m_params.m_renormalize = renormalize_flag; + })) + + // Sets the max # of endpoint clusters for ETC1S mode. Use instead of setQualityLevel. + // Default is 512, range is [1,BASISU_MAX_ENDPOINT_CLUSTERS] + .function("setMaxEndpointClusters", optional_override([](basis_encoder& self, uint32_t max_endpoint_clusters) { + assert(max_endpoint_clusters <= BASISU_MAX_ENDPOINT_CLUSTERS); + self.m_params.m_max_endpoint_clusters = max_endpoint_clusters; + })) + + // Sets the max # of selectors clusters for ETC1S mode. Use instead of setQualityLevel. + // Default is 512, range is [1,BASISU_MAX_ENDPOINT_CLUSTERS] + .function("setMaxSelectorClusters", optional_override([](basis_encoder& self, uint32_t max_selector_clusters) { + assert(max_selector_clusters <= BASISU_MAX_SELECTOR_CLUSTERS); + self.m_params.m_max_selector_clusters = max_selector_clusters; + })) + + // Sets the ETC1S encoder's quality level, which controls the file size vs. quality tradeoff. + // Default is -1 (meaning unused - the compressor will use m_max_endpoint_clusters/m_max_selector_clusters instead to control the codebook sizes). + // Range is [1,BASISU_QUALITY_MAX] + .function("setQualityLevel", optional_override([](basis_encoder& self, int quality_level) { + assert(quality_level >= -1 && quality_level <= BASISU_QUALITY_MAX); + self.m_params.m_quality_level = quality_level; + })) + + // The compression_level parameter controls the encoder perf vs. file size tradeoff for ETC1S files. + // It does not directly control file size vs. quality - see quality_level(). + // Default is BASISU_DEFAULT_COMPRESSION_LEVEL, range is [0,BASISU_MAX_COMPRESSION_LEVEL] + .function("setCompressionLevel", optional_override([](basis_encoder& self, int comp_level) { + assert(comp_level >= 0 && comp_level <= BASISU_MAX_COMPRESSION_LEVEL); + self.m_params.m_compression_level = comp_level; + })) + + // setNormalMapMode is the same as the basisu.exe "-normal_map" option. It tunes several codec parameters so compression works better on normal maps. + .function("setNormalMap", optional_override([](basis_encoder& self) { + self.m_params.m_perceptual = false; + self.m_params.m_mip_srgb = false; + self.m_params.m_no_selector_rdo = true; + self.m_params.m_no_endpoint_rdo = true; + })) + + // Sets selector RDO threshold + // Default is BASISU_DEFAULT_SELECTOR_RDO_THRESH, range is [0,1e+10] + .function("setSelectorRDOThresh", optional_override([](basis_encoder& self, float selector_rdo_thresh) { + self.m_params.m_selector_rdo_thresh = selector_rdo_thresh; + })) + + // Sets endpoint RDO threshold + // Default is BASISU_DEFAULT_ENDPOINT_RDO_THRESH, range is [0,1e+10] + .function("setEndpointRDOThresh", optional_override([](basis_encoder& self, float endpoint_rdo_thresh) { + self.m_params.m_endpoint_rdo_thresh = endpoint_rdo_thresh; + })) + +#if BASISD_SUPPORT_KTX2 + // --- KTX2 related options + // + // Create .KTX2 files instead of .basis files. By default this is FALSE. + .function("setCreateKTX2File", optional_override([](basis_encoder& self, bool create_ktx2_file) { + self.m_params.m_create_ktx2_file = create_ktx2_file; + })) + + // KTX2: Use UASTC Zstandard supercompression. Defaults to disabled or KTX2_SS_NONE. + .function("setKTX2UASTCSupercompression", optional_override([](basis_encoder& self, bool use_zstandard) { + self.m_params.m_ktx2_uastc_supercompression = use_zstandard ? basist::KTX2_SS_ZSTANDARD : basist::KTX2_SS_NONE; + })) + + // KTX2: Use sRGB transfer func in the file's DFD. Default is FALSE. This should very probably match the "perceptual" setting. + .function("setKTX2SRGBTransferFunc", optional_override([](basis_encoder& self, bool srgb_transfer_func) { + self.m_params.m_ktx2_srgb_transfer_func = srgb_transfer_func; + })) + + // TODO: Expose KTX2 key value array, other options to JavaScript. See encoder/basisu_comp.h. +#endif + + // --- Mip-map options + + // If true mipmaps will be generated from the source images + .function("setMipGen", optional_override([](basis_encoder& self, bool mip_gen_flag) { + self.m_params.m_mip_gen = mip_gen_flag; + })) + + // Set mipmap filter's scale factor + // default is 1, range is [.000125, 4.0] + .function("setMipScale", optional_override([](basis_encoder& self, float mip_scale) { + self.m_params.m_mip_scale = mip_scale; + })) + + // Sets the mipmap filter to apply + // mip_filter must be < BASISU_MAX_RESAMPLER_FILTERS + // See the end of basisu_resample_filters.cpp: g_resample_filters[] + .function("setMipFilter", optional_override([](basis_encoder& self, uint32_t mip_filter) { + assert(mip_filter < g_num_resample_filters); + if (mip_filter < g_num_resample_filters) + self.m_params.m_mip_filter = g_resample_filters[mip_filter].name; + })) + + // If true mipmap filtering occurs in sRGB space - this generally should match the perceptual parameter. + .function("setMipSRGB", optional_override([](basis_encoder& self, bool mip_srgb_flag) { + self.m_params.m_mip_srgb = mip_srgb_flag; + })) + + // If true, the input is assumed to be a normal map, and the texels of each mipmap will be renormalized before encoding. + .function("setMipRenormalize", optional_override([](basis_encoder& self, bool mip_renormalize_flag) { + self.m_params.m_mip_renormalize = mip_renormalize_flag; + })) + + // If true the source texture will be sampled using wrap addressing during mipmap generation, otherwise clamp. + .function("setMipWrapping", optional_override([](basis_encoder& self, bool mip_wrapping_flag) { + self.m_params.m_mip_wrapping = mip_wrapping_flag; + })) + + // Sets the mipmap generator's smallest allowed dimension. + // default is 1, range is [1,16384] + .function("setMipSmallestDimension", optional_override([](basis_encoder& self, int mip_smallest_dimension) { + self.m_params.m_mip_smallest_dimension = mip_smallest_dimension; + })) + + // Sets the .basis texture type. + // cBASISTexTypeVideoFrames changes the encoder into video mode. + // tex_type is enum basis_texture_type + // default is cBASISTexType2D + .function("setTexType", optional_override([](basis_encoder& self, uint32_t tex_type) { + assert(tex_type < cBASISTexTypeTotal); + self.m_params.m_tex_type = (basist::basis_texture_type)tex_type; + })) + + .function("setUserData0", optional_override([](basis_encoder& self, uint32_t userdata0) { + self.m_params.m_userdata0 = userdata0; + })) + + .function("setUserData1", optional_override([](basis_encoder& self, uint32_t userdata1) { + self.m_params.m_userdata1 = userdata1; + })) + + // UASTC specific flags. + + // Sets the UASTC encoding performance vs. quality tradeoff, and other lesser used UASTC encoder flags. + // This is a combination of flags. See cPackUASTCLevelDefault, etc. + .function("setPackUASTCFlags", optional_override([](basis_encoder& self, uint32_t pack_uastc_flags) { + assert((pack_uastc_flags & cPackUASTCLevelMask) >= cPackUASTCLevelFastest); + assert((pack_uastc_flags & cPackUASTCLevelMask) <= cPackUASTCLevelVerySlow); + self.m_params.m_pack_uastc_flags = pack_uastc_flags; + })) + + // If true, the RDO post-processor will be applied to the encoded UASTC texture data. + .function("setRDOUASTC", optional_override([](basis_encoder& self, bool rdo_uastc) { + self.m_params.m_rdo_uastc = rdo_uastc; + })) + + // Default is 1.0 range is [0.001, 10.0] + .function("setRDOUASTCQualityScalar", optional_override([](basis_encoder& self, float rdo_quality) { + self.m_params.m_rdo_uastc_quality_scalar = rdo_quality; + })) + + // Default is BASISU_RDO_UASTC_DICT_SIZE_DEFAULT, range is [BASISU_RDO_UASTC_DICT_SIZE_MIN, BASISU_RDO_UASTC_DICT_SIZE_MAX] + .function("setRDOUASTCDictSize", optional_override([](basis_encoder& self, int dict_size) { + assert((dict_size >= BASISU_RDO_UASTC_DICT_SIZE_MIN) && (dict_size <= BASISU_RDO_UASTC_DICT_SIZE_MAX)); + self.m_params.m_rdo_uastc_dict_size = dict_size; + })) + + // Default is UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO, range is [01, 100.0] + .function("setRDOUASTCMaxAllowedRMSIncreaseRatio", optional_override([](basis_encoder& self, float rdo_uastc_max_allowed_rms_increase_ratio) { + self.m_params.m_rdo_uastc_max_allowed_rms_increase_ratio = rdo_uastc_max_allowed_rms_increase_ratio; + })) + + // Default is UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH, range is [.01f, 100.0f] + .function("setRDOUASTCSkipBlockRMSThresh", optional_override([](basis_encoder& self, float rdo_uastc_skip_block_rms_thresh) { + self.m_params.m_rdo_uastc_skip_block_rms_thresh = rdo_uastc_skip_block_rms_thresh; + })) + + // --- Low level options + + // Disables selector RDO + .function("setNoSelectorRDO", optional_override([](basis_encoder& self, bool no_selector_rdo_flag) { + self.m_params.m_no_selector_rdo = no_selector_rdo_flag; + })) + + // Disables endpoint RDO + .function("setNoEndpointRDO", optional_override([](basis_encoder& self, bool no_endpoint_rdo_flag) { + self.m_params.m_no_endpoint_rdo = no_endpoint_rdo_flag; + })) + + // Display output PSNR statistics + .function("setComputeStats", optional_override([](basis_encoder& self, bool compute_stats_flag) { + self.m_params.m_compute_stats = compute_stats_flag; + })) + + // Write output .PNG files for debugging + .function("setDebugImages", optional_override([](basis_encoder& self, bool debug_images_flag) { + self.m_params.m_debug_images = debug_images_flag; + })) + + ; +#endif // BASISU_SUPPORT_ENCODING + +} diff --git a/ktx/external/basisu/webgl_videotest/6.1.01.basis b/ktx/external/basisu/webgl_videotest/6.1.01.basis new file mode 100644 index 0000000..d3a06dc Binary files /dev/null and b/ktx/external/basisu/webgl_videotest/6.1.01.basis differ diff --git a/ktx/external/basisu/webgl_videotest/basis.js b/ktx/external/basisu/webgl_videotest/basis.js new file mode 100644 index 0000000..f89ea8e --- /dev/null +++ b/ktx/external/basisu/webgl_videotest/basis.js @@ -0,0 +1 @@ +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=Number(type.substr(1));assert(bits%8===0,"getNativeTypeSize invalid bits "+bits+", type "+type);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}function convertJsFunctionToWasm(func,sig){if(typeof WebAssembly.Function==="function"){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var wasmMemory;var wasmTable=new WebAssembly.Table({"initial":7,"maximum":7+0,"element":"anyfunc"});var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var WASM_PAGE_SIZE=65536;var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var STACK_BASE=5738768,DYNAMIC_BASE=5738768,DYNAMICTOP_PTR=495728;var INITIAL_INITIAL_MEMORY=Module["INITIAL_MEMORY"]||749993984;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,"maximum":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";out(what);err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";throw new WebAssembly.RuntimeError(what)}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="basis.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(){var info={"env":asmLibraryArg,"wasi_snapshot_preview1":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;__ATINIT__.push({func:function(){___wasm_call_ctors()}});function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function _abort(){abort()}function _emscripten_get_sbrk_ptr(){return 495728}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=num;return 0}function _roundf(d){d=+d;return d>=+0?+Math_floor(d+ +.5):+Math_ceil(d-+.5)}function _setTempRet0($i){setTempRet0($i|0)}var ASSERTIONS=false;var asmLibraryArg={"__assert_fail":___assert_fail,"abort":_abort,"emscripten_get_sbrk_ptr":_emscripten_get_sbrk_ptr,"emscripten_memcpy_big":_emscripten_memcpy_big,"emscripten_resize_heap":_emscripten_resize_heap,"fd_close":_fd_close,"fd_seek":_fd_seek,"fd_write":_fd_write,"memory":wasmMemory,"roundf":_roundf,"setTempRet0":_setTempRet0,"table":wasmTable};var asm=createWasm();Module["asm"]=asm;var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["__wasm_call_ctors"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["malloc"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["free"]).apply(null,arguments)};var _basis_set_debug_flags=Module["_basis_set_debug_flags"]=function(){return(_basis_set_debug_flags=Module["_basis_set_debug_flags"]=Module["asm"]["basis_set_debug_flags"]).apply(null,arguments)};var _basis_get_debug_flags=Module["_basis_get_debug_flags"]=function(){return(_basis_get_debug_flags=Module["_basis_get_debug_flags"]=Module["asm"]["basis_get_debug_flags"]).apply(null,arguments)};var _basis_init=Module["_basis_init"]=function(){return(_basis_init=Module["_basis_init"]=Module["asm"]["basis_init"]).apply(null,arguments)};var _basis_open=Module["_basis_open"]=function(){return(_basis_open=Module["_basis_open"]=Module["asm"]["basis_open"]).apply(null,arguments)};var _basis_close=Module["_basis_close"]=function(){return(_basis_close=Module["_basis_close"]=Module["asm"]["basis_close"]).apply(null,arguments)};var _basis_get_has_alpha=Module["_basis_get_has_alpha"]=function(){return(_basis_get_has_alpha=Module["_basis_get_has_alpha"]=Module["asm"]["basis_get_has_alpha"]).apply(null,arguments)};var _basis_get_num_images=Module["_basis_get_num_images"]=function(){return(_basis_get_num_images=Module["_basis_get_num_images"]=Module["asm"]["basis_get_num_images"]).apply(null,arguments)};var _basis_get_num_levels=Module["_basis_get_num_levels"]=function(){return(_basis_get_num_levels=Module["_basis_get_num_levels"]=Module["asm"]["basis_get_num_levels"]).apply(null,arguments)};var _basis_get_image_width=Module["_basis_get_image_width"]=function(){return(_basis_get_image_width=Module["_basis_get_image_width"]=Module["asm"]["basis_get_image_width"]).apply(null,arguments)};var _basis_get_image_height=Module["_basis_get_image_height"]=function(){return(_basis_get_image_height=Module["_basis_get_image_height"]=Module["asm"]["basis_get_image_height"]).apply(null,arguments)};var _basis_get_image_transcoded_size_in_bytes=Module["_basis_get_image_transcoded_size_in_bytes"]=function(){return(_basis_get_image_transcoded_size_in_bytes=Module["_basis_get_image_transcoded_size_in_bytes"]=Module["asm"]["basis_get_image_transcoded_size_in_bytes"]).apply(null,arguments)};var _basis_start_transcoding=Module["_basis_start_transcoding"]=function(){return(_basis_start_transcoding=Module["_basis_start_transcoding"]=Module["asm"]["basis_start_transcoding"]).apply(null,arguments)};var _basis_transcode_image=Module["_basis_transcode_image"]=function(){return(_basis_transcode_image=Module["_basis_transcode_image"]=Module["asm"]["basis_transcode_image"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["__errno_location"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["stackSave"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["stackAlloc"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["stackRestore"]).apply(null,arguments)};var __growWasmMemory=Module["__growWasmMemory"]=function(){return(__growWasmMemory=Module["__growWasmMemory"]=Module["asm"]["__growWasmMemory"]).apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return(dynCall_viii=Module["dynCall_viii"]=Module["asm"]["dynCall_viii"]).apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return(dynCall_ii=Module["dynCall_ii"]=Module["asm"]["dynCall_ii"]).apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return(dynCall_iiii=Module["dynCall_iiii"]=Module["asm"]["dynCall_iiii"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["dynCall_jiji"]).apply(null,arguments)};Module["asm"]=asm;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0)return;function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}noExitRuntime=true;run(); diff --git a/ktx/external/basisu/webgl_videotest/basis.js.mem b/ktx/external/basisu/webgl_videotest/basis.js.mem new file mode 100644 index 0000000..3843819 Binary files /dev/null and b/ktx/external/basisu/webgl_videotest/basis.js.mem differ diff --git a/ktx/external/basisu/webgl_videotest/basis.wasm b/ktx/external/basisu/webgl_videotest/basis.wasm new file mode 100644 index 0000000..616761b Binary files /dev/null and b/ktx/external/basisu/webgl_videotest/basis.wasm differ diff --git a/ktx/external/basisu/webgl_videotest/basis_wrappers.cpp b/ktx/external/basisu/webgl_videotest/basis_wrappers.cpp new file mode 100644 index 0000000..a758fe3 --- /dev/null +++ b/ktx/external/basisu/webgl_videotest/basis_wrappers.cpp @@ -0,0 +1,242 @@ +// basis_wrappers.cpp - Simple C-style wrappers to the C++ transcoder for WebGL use. +#include "basisu_transcoder.h" + +using namespace basist; + +typedef unsigned int uint; + +extern "C" +{ + void basis_init(); + + void *basis_open(void *src, uint src_size); + void basis_close(void *h); + + uint basis_get_has_alpha(void *h); + + uint basis_get_num_images(void *h); + uint basis_get_num_levels(void *h, uint image_index); + + uint basis_get_image_width(void *h, uint image_index, uint level_index); + uint basis_get_image_height(void *h, uint image_index, uint level_index); + + uint basis_get_image_transcoded_size_in_bytes(void *h, uint image_index, uint level_index, uint format); + + uint basis_start_transcoding(void *h); + uint basis_stop_transcoding(void *h); + + uint basis_transcode_image(void *h, void *dst, uint dst_size_in_bytes, + uint image_index, uint level_index, uint format, + uint unused, uint get_alpha_for_opaque_formats); + + void basis_set_debug_flags(uint f) { basist::set_debug_flags(f); } + uint basis_get_debug_flags() { return basist::get_debug_flags(); } +} + +void basis_init() +{ + basisu_transcoder_init(); +} + +#define MAGIC 0xDEADBEE1 + +struct basis_file +{ + int m_magic; + basisu_transcoder m_transcoder; + void *m_pFile; + uint m_file_size; + + basis_file() : + m_transcoder() + { + } +}; + +void *basis_open(void *src, uint src_size) +{ + if ((!src) || (!src_size)) + return nullptr; + + basis_file *f = new basis_file; + f->m_pFile = src; + f->m_file_size = src_size; + + if (!f->m_transcoder.validate_header(f->m_pFile, f->m_file_size)) + { + delete f; + return nullptr; + } + f->m_magic = MAGIC; + + return f; +} + +void basis_close(void *h) +{ + basis_file *f = static_cast(h); + if (!f) + return; + + assert(f->m_magic == MAGIC); + if (f->m_magic != MAGIC) + return; + + delete f; +} + +uint basis_get_has_alpha(void *h) +{ + basis_file *f = static_cast(h); + if (!f) + return 0; + + assert(f->m_magic == MAGIC); + if (f->m_magic != MAGIC) + return 0; + + basisu_image_level_info li; + + if (!f->m_transcoder.get_image_level_info(f->m_pFile, f->m_file_size, li, 0, 0)) + return 0; + + return li.m_alpha_flag; +} + +uint basis_get_num_images(void *h) +{ + basis_file *f = static_cast(h); + if (!f) + return 0; + + assert(f->m_magic == MAGIC); + if (f->m_magic != MAGIC) + return 0; + + return f->m_transcoder.get_total_images(f->m_pFile, f->m_file_size); +} + +uint basis_get_num_levels(void *h, uint image_index) +{ + basis_file *f = static_cast(h); + if (!f) + return 0; + + assert(f->m_magic == MAGIC); + if (f->m_magic != MAGIC) + return 0; + + basisu_image_info ii; + + if (!f->m_transcoder.get_image_info(f->m_pFile, f->m_file_size, ii, image_index)) + return 0; + + return ii.m_total_levels; +} + +uint basis_get_image_width(void *h, uint image_index, uint level_index) +{ + basis_file *f = static_cast(h); + if (!f) + return 0; + + assert(f->m_magic == MAGIC); + if (f->m_magic != MAGIC) + return 0; + + uint orig_width, orig_height, total_blocks; + if (!f->m_transcoder.get_image_level_desc(f->m_pFile, f->m_file_size, image_index, level_index, orig_width, orig_height, total_blocks)) + return 0; + + return orig_width; +} + +uint basis_get_image_height(void *h, uint image_index, uint level_index) +{ + basis_file *f = static_cast(h); + if (!f) + return 0; + + assert(f->m_magic == MAGIC); + if (f->m_magic != MAGIC) + return 0; + + uint orig_width, orig_height, total_blocks; + if (!f->m_transcoder.get_image_level_desc(f->m_pFile, f->m_file_size, image_index, level_index, orig_width, orig_height, total_blocks)) + return 0; + + return orig_height; +} + +uint basis_get_image_transcoded_size_in_bytes(void *h, uint image_index, uint level_index, uint format) +{ + basis_file *f = static_cast(h); + if (!f) + return 0; + + assert(f->m_magic == MAGIC); + if (f->m_magic != MAGIC) + return 0; + + if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) + return 0; + + uint orig_width, orig_height, total_blocks; + if (!f->m_transcoder.get_image_level_desc(f->m_pFile, f->m_file_size, image_index, level_index, orig_width, orig_height, total_blocks)) + return 0; + + uint bytes_per_block_or_pixel = basis_get_bytes_per_block_or_pixel((transcoder_texture_format)format); + if (basis_transcoder_format_is_uncompressed((transcoder_texture_format)format)) + return orig_width * orig_height * bytes_per_block_or_pixel; + + return total_blocks * bytes_per_block_or_pixel; +} + +uint basis_start_transcoding(void *h) +{ + basis_file *f = static_cast(h); + if (!f) + return 0; + + assert(f->m_magic == MAGIC); + if (f->m_magic != MAGIC) + return 0; + + return f->m_transcoder.start_transcoding(f->m_pFile, f->m_file_size); +} + +uint basis_stop_transcoding(void *h) +{ + basis_file *f = static_cast(h); + if (!f) + return 0; + + assert(f->m_magic == MAGIC); + if (f->m_magic != MAGIC) + return 0; + + return f->m_transcoder.stop_transcoding(); +} + +uint basis_transcode_image(void *h, void *dst, uint dst_size_in_bytes, + uint image_index, uint level_index, uint format, + uint unused, uint get_alpha_for_opaque_formats) +{ + basis_file *f = static_cast(h); + if (!f) + return 0; + + assert(f->m_magic == MAGIC); + if (f->m_magic != MAGIC) + return 0; + + if (format >= (int)transcoder_texture_format::cTFTotalTextureFormats) + return 0; + + uint bytes_per_block = basis_get_bytes_per_block_or_pixel((transcoder_texture_format)format); + + return f->m_transcoder.transcode_image_level(f->m_pFile, f->m_file_size, image_index, level_index, + dst, dst_size_in_bytes / bytes_per_block, + (basist::transcoder_texture_format)format, + (get_alpha_for_opaque_formats ? (uint32_t)cDecodeFlagsTranscodeAlphaDataToOpaqueFormats : 0)); +} diff --git a/ktx/external/basisu/webgl_videotest/build.bat b/ktx/external/basisu/webgl_videotest/build.bat new file mode 100644 index 0000000..8536816 --- /dev/null +++ b/ktx/external/basisu/webgl_videotest/build.bat @@ -0,0 +1,4 @@ +@REM -O0 -s ASSERTIONS=1 -s DEMANGLE_SUPPORT=1 +@REM -O2 -s ASSERTIONS=0 +emcc -s EXPORTED_FUNCTIONS="['allocate', '_malloc', '_free', '_basis_init','_basis_open','_basis_close','_basis_get_has_alpha','_basis_get_num_images','_basis_get_num_levels','_basis_get_image_width','_basis_get_image_height','_basis_get_image_transcoded_size_in_bytes','_basis_transcode_image','_basis_start_transcoding','_basis_stop_transcoding','_basis_get_debug_flags','_basis_set_debug_flags']" -o basis.js -DBASISD_ENABLE_DEBUG_FLAGS=1 ../transcoder/basisu_transcoder.cpp basis_wrappers.cpp -s TOTAL_MEMORY=749993984 -std=c++11 -O2 -s ASSERTIONS=0 -I ../transcoder -D BASISD_SUPPORT_KTX2=0 +rem emcc -s EXPORTED_FUNCTIONS="['allocate', '_malloc', '_free', '_basis_init','_basis_open','_basis_close','_basis_get_has_alpha','_basis_get_num_images','_basis_get_num_levels','_basis_get_image_width','_basis_get_image_height','_basis_get_image_transcoded_size_in_bytes','_basis_transcode_image','_basis_start_transcoding','_basis_stop_transcoding','_basis_get_debug_flags','_basis_set_debug_flags']" -o basis.js -DBASISD_ENABLE_DEBUG_FLAGS=1 ../transcoder/basisu_transcoder.cpp basis_wrappers.cpp -s TOTAL_MEMORY=499974144 -std=c++11 -O0 -s ASSERTIONS=0 -I ../transcoder -D BASISD_SUPPORT_KTX2=0 diff --git a/ktx/external/basisu/webgl_videotest/build.sh b/ktx/external/basisu/webgl_videotest/build.sh new file mode 100644 index 0000000..91e76d6 --- /dev/null +++ b/ktx/external/basisu/webgl_videotest/build.sh @@ -0,0 +1,3 @@ +# rg - I haven't tested this shell script yet (I use build.bat on Windows) +emcc -s EXPORTED_FUNCTIONS="['allocate', '_malloc', '_free', '_basis_init','_basis_open','_basis_close','_basis_get_has_alpha','_basis_get_num_images','_basis_get_num_levels','_basis_get_image_width','_basis_get_image_height','_basis_get_image_transcoded_size_in_bytes','_basis_transcode_image','_basis_start_transcoding','_basis_get_debug_flags','_basis_set_debug_flags']" -s TOTAL_MEMORY=749993984 -O2 -s ASSERTIONS=0 -I ../transcoder -o basis.js ../transcoder/basisu_transcoder.cpp basis_wrappers.cpp -D BASISD_SUPPORT_KTX2=0 -D BASISD_ENABLE_DEBUG_FLAGS=1 +# chmod -R a+rX . diff --git a/ktx/external/basisu/webgl_videotest/dxt-to-rgb565.js b/ktx/external/basisu/webgl_videotest/dxt-to-rgb565.js new file mode 100644 index 0000000..8e35be4 --- /dev/null +++ b/ktx/external/basisu/webgl_videotest/dxt-to-rgb565.js @@ -0,0 +1,128 @@ +/** + * Transcodes DXT into RGB565. + * This is an optimized version of dxtToRgb565Unoptimized() below. + * Optimizations: + * 1. Use integer math to compute c2 and c3 instead of floating point + * math. Specifically: + * c2 = 5/8 * c0 + 3/8 * c1 + * c3 = 3/8 * c0 + 5/8 * c1 + * This is about a 40% performance improvement. It also appears to + * match what hardware DXT decoders do, as the colors produced + * by this integer math match what hardware produces, while the + * floating point in dxtToRgb565Unoptimized() produce slightly + * different colors (for one GPU this was tested on). + * 2. Unroll the inner loop. Another ~10% improvement. + * 3. Compute r0, g0, b0, r1, g1, b1 only once instead of twice. + * Another 10% improvement. + * 4. Use a Uint16Array instead of a Uint8Array. Another 10% improvement. + * @param {Uint16Array} src The src DXT bits as a Uint16Array. + * @param {number} srcByteOffset + * @param {number} width + * @param {number} height + * @return {Uint16Array} dst + */ +function dxtToRgb565(src, src16Offset, width, height) { + var c = new Uint16Array(4); + var dst = new Uint16Array(width * height); + var nWords = (width * height) / 4; + var m = 0; + var dstI = 0; + var i = 0; + var r0 = 0, g0 = 0, b0 = 0, r1 = 0, g1 = 0, b1 = 0; + + var blockWidth = width / 4; + var blockHeight = height / 4; + for (var blockY = 0; blockY < blockHeight; blockY++) { + for (var blockX = 0; blockX < blockWidth; blockX++) { + i = src16Offset + 4 * (blockY * blockWidth + blockX); + c[0] = src[i]; + c[1] = src[i + 1]; + + r0 = c[0] & 0x1f; + g0 = c[0] & 0x7e0; + b0 = c[0] & 0xf800; + r1 = c[1] & 0x1f; + g1 = c[1] & 0x7e0; + b1 = c[1] & 0xf800; + // Interpolate between c0 and c1 to get c2 and c3. + // Note that we approximate 1/3 as 3/8 and 2/3 as 5/8 for + // speed. This also appears to be what the hardware DXT + // decoder in many GPUs does :) + + // rg FIXME: This is most likely leading to wrong results vs. a GPU + + c[2] = ((5 * r0 + 3 * r1) >> 3) + | (((5 * g0 + 3 * g1) >> 3) & 0x7e0) + | (((5 * b0 + 3 * b1) >> 3) & 0xf800); + c[3] = ((5 * r1 + 3 * r0) >> 3) + | (((5 * g1 + 3 * g0) >> 3) & 0x7e0) + | (((5 * b1 + 3 * b0) >> 3) & 0xf800); + m = src[i + 2]; + dstI = (blockY * 4) * width + blockX * 4; + dst[dstI] = c[m & 0x3]; + dst[dstI + 1] = c[(m >> 2) & 0x3]; + dst[dstI + 2] = c[(m >> 4) & 0x3]; + dst[dstI + 3] = c[(m >> 6) & 0x3]; + dstI += width; + dst[dstI] = c[(m >> 8) & 0x3]; + dst[dstI + 1] = c[(m >> 10) & 0x3]; + dst[dstI + 2] = c[(m >> 12) & 0x3]; + dst[dstI + 3] = c[(m >> 14)]; + m = src[i + 3]; + dstI += width; + dst[dstI] = c[m & 0x3]; + dst[dstI + 1] = c[(m >> 2) & 0x3]; + dst[dstI + 2] = c[(m >> 4) & 0x3]; + dst[dstI + 3] = c[(m >> 6) & 0x3]; + dstI += width; + dst[dstI] = c[(m >> 8) & 0x3]; + dst[dstI + 1] = c[(m >> 10) & 0x3]; + dst[dstI + 2] = c[(m >> 12) & 0x3]; + dst[dstI + 3] = c[(m >> 14)]; + } + } + return dst; +} + + +/** + * An unoptimized version of dxtToRgb565. Also, the floating + * point math used to compute the colors actually results in + * slightly different colors compared to hardware DXT decoders. + * @param {Uint8Array} src + * @param {number} srcByteOffset + * @param {number} width + * @param {number} height + * @return {Uint16Array} dst + */ +function dxtToRgb565Unoptimized(src, srcByteOffset, width, height) { + var c = new Uint16Array(4); + var dst = new Uint16Array(width * height); + var nWords = (width * height) / 4; + + var blockWidth = width / 4; + var blockHeight = height / 4; + for (var blockY = 0; blockY < blockHeight; blockY++) { + for (var blockX = 0; blockX < blockWidth; blockX++) { + var i = srcByteOffset + 8 * (blockY * blockWidth + blockX); + c[0] = src[i] | (src[i + 1] << 8); + c[1] = src[i + 2] | (src[i + 3] << 8); + c[2] = (2 * (c[0] & 0x1f) + 1 * (c[1] & 0x1f)) / 3 + | (((2 * (c[0] & 0x7e0) + 1 * (c[1] & 0x7e0)) / 3) & 0x7e0) + | (((2 * (c[0] & 0xf800) + 1 * (c[1] & 0xf800)) / 3) & 0xf800); + c[3] = (2 * (c[1] & 0x1f) + 1 * (c[0] & 0x1f)) / 3 + | (((2 * (c[1] & 0x7e0) + 1 * (c[0] & 0x7e0)) / 3) & 0x7e0) + | (((2 * (c[1] & 0xf800) + 1 * (c[0] & 0xf800)) / 3) & 0xf800); + for (var row = 0; row < 4; row++) { + var m = src[i + 4 + row]; + var dstI = (blockY * 4 + row) * width + blockX * 4; + dst[dstI++] = c[m & 0x3]; + dst[dstI++] = c[(m >> 2) & 0x3]; + dst[dstI++] = c[(m >> 4) & 0x3]; + dst[dstI++] = c[(m >> 6) & 0x3]; + } + } + } + return dst; +} + diff --git a/ktx/external/basisu/webgl_videotest/index.html b/ktx/external/basisu/webgl_videotest/index.html new file mode 100644 index 0000000..4962018 --- /dev/null +++ b/ktx/external/basisu/webgl_videotest/index.html @@ -0,0 +1,545 @@ + + + + + + + + +
            +
            + Basis Universal GPU Texture Video UASTC->BC7 Transcoding Test +
            + +
            +
            This demo uses the Basis C++ transcoder (compiled to Javascript using Emscripten) to transcode a .basis Universal Texture Video file directly to GPU texture data, with no intermediate recompression step. +
            .basis universal GPU texture files can be quickly transcoded directly to any other GPU texture format with little to no quality loss. +
            Thanks to Evan Parker for providing webgl-texture-utils and this test bed. +
            +
            +
            + .basis file: + + +
            +
            + + + +
            +
            + +
            +
            + + + +
            +
            + + + + + + +
            + + +
            +

            +
            + + diff --git a/ktx/external/basisu/webgl_videotest/kodim01.basis b/ktx/external/basisu/webgl_videotest/kodim01.basis new file mode 100644 index 0000000..25740bc Binary files /dev/null and b/ktx/external/basisu/webgl_videotest/kodim01.basis differ diff --git a/ktx/external/basisu/webgl_videotest/kodim20.basis b/ktx/external/basisu/webgl_videotest/kodim20.basis new file mode 100644 index 0000000..54f00bb Binary files /dev/null and b/ktx/external/basisu/webgl_videotest/kodim20.basis differ diff --git a/ktx/external/basisu/webgl_videotest/renderer.js b/ktx/external/basisu/webgl_videotest/renderer.js new file mode 100644 index 0000000..933ddf6 --- /dev/null +++ b/ktx/external/basisu/webgl_videotest/renderer.js @@ -0,0 +1,231 @@ +/** + * Constructs a renderer object. + * @param {WebGLRenderingContext} gl The GL context. + * @constructor + */ +var Renderer = function(gl) { + /** + * The GL context. + * @type {WebGLRenderingContext} + * @private + */ + this.gl_ = gl; + + /** + * The WebGLProgram. + * @type {WebGLProgram} + * @private + */ + this.program_ = gl.createProgram(); + + /** + * @type {WebGLShader} + * @private + */ + this.vertexShader_ = this.compileShader_( + Renderer.vertexShaderSource_, gl.VERTEX_SHADER); + + /** + * @type {WebGLShader} + * @private + */ + this.fragmentShader_ = this.compileShader_( + Renderer.fragmentShaderSource_, gl.FRAGMENT_SHADER); + + /** + * Cached uniform locations. + * @type {Object.} + * @private + */ + this.uniformLocations_ = {}; + + /** + * Cached attribute locations. + * @type {Object.} + * @private + */ + this.attribLocations_ = {}; + + /** + * A vertex buffer containing a single quad with xy coordinates from [-1,-1] + * to [1,1] and uv coordinates from [0,0] to [1,1]. + * @private + */ + this.quadVertexBuffer_ = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVertexBuffer_); + var vertices = new Float32Array( + [-1.0, -1.0, 0.0, 1.0, + +1.0, -1.0, 1.0, 1.0, + -1.0, +1.0, 0.0, 0.0, + 1.0, +1.0, 1.0, 0.0]); + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); + + + // init shaders + + gl.attachShader(this.program_, this.vertexShader_); + gl.attachShader(this.program_, this.fragmentShader_); + gl.bindAttribLocation(this.program_, 0, 'vert'); + gl.linkProgram(this.program_); + gl.useProgram(this.program_); + gl.enableVertexAttribArray(0); + + gl.enable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); + + var count = gl.getProgramParameter(this.program_, gl.ACTIVE_UNIFORMS); + for (var i = 0; i < /** @type {number} */(count); i++) { + var info = gl.getActiveUniform(this.program_, i); + var result = gl.getUniformLocation(this.program_, info.name); + this.uniformLocations_[info.name] = result; + } + + count = gl.getProgramParameter(this.program_, gl.ACTIVE_ATTRIBUTES); + for (var i = 0; i < /** @type {number} */(count); i++) { + var info = gl.getActiveAttrib(this.program_, i); + var result = gl.getAttribLocation(this.program_, info.name); + this.attribLocations_[info.name] = result; + } +}; + + +Renderer.prototype.finishInit = function() { + this.draw(); +}; + + +Renderer.prototype.createDxtTexture = function(dxtData, width, height, format) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.compressedTexImage2D( + gl.TEXTURE_2D, + 0, + format, + width, + height, + 0, + dxtData); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + //gl.generateMipmap(gl.TEXTURE_2D) + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; + +Renderer.prototype.destroyTexture = function(tex) +{ + var gl = this.gl_; + //gl.bindTexture(gl.TEXTURE_2D, 0); + gl.deleteTexture(tex); +} + +Renderer.prototype.createRgb565Texture = function(rgb565Data, width, height) { + var gl = this.gl_; + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGB, + width, + height, + 0, + gl.RGB, + gl.UNSIGNED_SHORT_5_6_5, + rgb565Data); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + //gl.generateMipmap(gl.TEXTURE_2D) + gl.bindTexture(gl.TEXTURE_2D, null); + return tex; +}; + + +Renderer.prototype.drawTexture = function(texture, width, height, mode) { + var gl = this.gl_; + // draw scene + gl.clearColor(0, 0, 0, 1); + gl.clearDepth(1.0); + gl.viewport(0, 0, width, height); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT); + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.uniform1i(this.uniformLocations_.texSampler, 0); + + var x = 0.0; + var y = 0.0; + if (mode == 1) + x = 1.0; + else if (mode == 2) + y = 1.0; + + gl.uniform4f(this.uniformLocations_.control, x, y, 0.0, 0.0); + + gl.enableVertexAttribArray(this.attribLocations_.vert); + gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVertexBuffer_); + gl.vertexAttribPointer(this.attribLocations_.vert, 4, gl.FLOAT, + false, 0, 0); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); +}; + + +/** + * Compiles a GLSL shader and returns a WebGLShader. + * @param {string} shaderSource The shader source code string. + * @param {number} type Either VERTEX_SHADER or FRAGMENT_SHADER. + * @return {WebGLShader} The new WebGLShader. + * @private + */ +Renderer.prototype.compileShader_ = function(shaderSource, type) { + var gl = this.gl_; + var shader = gl.createShader(type); + gl.shaderSource(shader, shaderSource); + gl.compileShader(shader); + return shader; +}; + + +/** + * @type {string} + * @private + */ +Renderer.vertexShaderSource_ = [ + 'attribute vec4 vert;', + 'varying vec2 v_texCoord;', + 'void main() {', + ' gl_Position = vec4(vert.xy, 0.0, 1.0);', + ' v_texCoord = vert.zw;', + '}' + ].join('\n'); + + +/** + * @type {string} + * @private ' gl_FragColor = texture2D(texSampler, v_texCoord);', + */ +Renderer.fragmentShaderSource_ = [ + 'precision highp float;', + 'uniform sampler2D texSampler;', + 'uniform vec4 control;', + 'varying vec2 v_texCoord;', + 'void main() {', + ' vec4 c;', + ' c = texture2D(texSampler, v_texCoord);', + ' if (control.x > 0.0)', + ' {', + ' c.w = 1.0;', + ' }', + ' else if (control.y > 0.0)', + ' {', + ' c.rgb = c.aaa; c.w = 1.0;', + ' }', + ' gl_FragColor = c;', + '}' + ].join('\n'); + diff --git a/ktx/external/basisu/zstd/LICENSE b/ktx/external/basisu/zstd/LICENSE new file mode 100644 index 0000000..a793a80 --- /dev/null +++ b/ktx/external/basisu/zstd/LICENSE @@ -0,0 +1,30 @@ +BSD License + +For Zstandard software + +Copyright (c) 2016-present, Facebook, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ktx/external/basisu/zstd/zstd.c b/ktx/external/basisu/zstd/zstd.c new file mode 100644 index 0000000..bacdf33 --- /dev/null +++ b/ktx/external/basisu/zstd/zstd.c @@ -0,0 +1,50079 @@ +/** + * \file zstd.c + * Single-file Zstandard library. + * + * Generate using: + * \code + * python combine.py -r ../../lib -x legacy/zstd_legacy.h -o zstd.c zstd-in.c + * \endcode + */ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ +/* + * Settings to bake for the single library file. + * + * Note: It's important that none of these affects 'zstd.h' (only the + * implementation files we're amalgamating). + * + * Note: MEM_MODULE stops xxhash redefining BYTE, U16, etc., which are also + * defined in mem.h (breaking C99 compatibility). + * + * Note: the undefs for xxHash allow Zstd's implementation to coincide with + * standalone xxHash usage (with global defines). + * + * Note: if you enable ZSTD_LEGACY_SUPPORT the combine.py script will need + * re-running without the "-x legacy/zstd_legacy.h" option (it excludes the + * legacy support at the source level). + * + * Note: multithreading is enabled for all platforms apart from Emscripten. + */ +#define DEBUGLEVEL 0 +#define MEM_MODULE +#undef XXH_NAMESPACE +#define XXH_NAMESPACE ZSTD_ +#undef XXH_PRIVATE_API +#define XXH_PRIVATE_API +#undef XXH_INLINE_ALL +#define XXH_INLINE_ALL +#define ZSTD_LEGACY_SUPPORT 0 +#ifndef __EMSCRIPTEN__ +#define ZSTD_MULTITHREAD +#endif +#define ZSTD_TRACE 0 +/* TODO: Can't amalgamate ASM function */ +#define ZSTD_DISABLE_ASM 1 + +/* Include zstd_deps.h first with all the options we need enabled. */ +#define ZSTD_DEPS_NEED_MALLOC +#define ZSTD_DEPS_NEED_MATH64 +/**** start inlining common/zstd_deps.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* This file provides common libc dependencies that zstd requires. + * The purpose is to allow replacing this file with a custom implementation + * to compile zstd without libc support. + */ + +/* Need: + * NULL + * INT_MAX + * UINT_MAX + * ZSTD_memcpy() + * ZSTD_memset() + * ZSTD_memmove() + */ +#ifndef ZSTD_DEPS_COMMON +#define ZSTD_DEPS_COMMON + +#include +#include +#include + +#if defined(__GNUC__) && __GNUC__ >= 4 +# define ZSTD_memcpy(d,s,l) __builtin_memcpy((d),(s),(l)) +# define ZSTD_memmove(d,s,l) __builtin_memmove((d),(s),(l)) +# define ZSTD_memset(p,v,l) __builtin_memset((p),(v),(l)) +#else +# define ZSTD_memcpy(d,s,l) memcpy((d),(s),(l)) +# define ZSTD_memmove(d,s,l) memmove((d),(s),(l)) +# define ZSTD_memset(p,v,l) memset((p),(v),(l)) +#endif + +#endif /* ZSTD_DEPS_COMMON */ + +/* Need: + * ZSTD_malloc() + * ZSTD_free() + * ZSTD_calloc() + */ +#ifdef ZSTD_DEPS_NEED_MALLOC +#ifndef ZSTD_DEPS_MALLOC +#define ZSTD_DEPS_MALLOC + +#include + +#define ZSTD_malloc(s) malloc(s) +#define ZSTD_calloc(n,s) calloc((n), (s)) +#define ZSTD_free(p) free((p)) + +#endif /* ZSTD_DEPS_MALLOC */ +#endif /* ZSTD_DEPS_NEED_MALLOC */ + +/* + * Provides 64-bit math support. + * Need: + * U64 ZSTD_div64(U64 dividend, U32 divisor) + */ +#ifdef ZSTD_DEPS_NEED_MATH64 +#ifndef ZSTD_DEPS_MATH64 +#define ZSTD_DEPS_MATH64 + +#define ZSTD_div64(dividend, divisor) ((dividend) / (divisor)) + +#endif /* ZSTD_DEPS_MATH64 */ +#endif /* ZSTD_DEPS_NEED_MATH64 */ + +/* Need: + * assert() + */ +#ifdef ZSTD_DEPS_NEED_ASSERT +#ifndef ZSTD_DEPS_ASSERT +#define ZSTD_DEPS_ASSERT + +#include + +#endif /* ZSTD_DEPS_ASSERT */ +#endif /* ZSTD_DEPS_NEED_ASSERT */ + +/* Need: + * ZSTD_DEBUG_PRINT() + */ +#ifdef ZSTD_DEPS_NEED_IO +#ifndef ZSTD_DEPS_IO +#define ZSTD_DEPS_IO + +#include +#define ZSTD_DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__) + +#endif /* ZSTD_DEPS_IO */ +#endif /* ZSTD_DEPS_NEED_IO */ + +/* Only requested when is known to be present. + * Need: + * intptr_t + */ +#ifdef ZSTD_DEPS_NEED_STDINT +#ifndef ZSTD_DEPS_STDINT +#define ZSTD_DEPS_STDINT + +#include + +#endif /* ZSTD_DEPS_STDINT */ +#endif /* ZSTD_DEPS_NEED_STDINT */ +/**** ended inlining common/zstd_deps.h ****/ + +/**** start inlining common/debug.c ****/ +/* ****************************************************************** + * debug + * Part of FSE library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + + +/* + * This module only hosts one global variable + * which can be used to dynamically influence the verbosity of traces, + * such as DEBUGLOG and RAWLOG + */ + +/**** start inlining debug.h ****/ +/* ****************************************************************** + * debug + * Part of FSE library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + + +/* + * The purpose of this header is to enable debug functions. + * They regroup assert(), DEBUGLOG() and RAWLOG() for run-time, + * and DEBUG_STATIC_ASSERT() for compile-time. + * + * By default, DEBUGLEVEL==0, which means run-time debug is disabled. + * + * Level 1 enables assert() only. + * Starting level 2, traces can be generated and pushed to stderr. + * The higher the level, the more verbose the traces. + * + * It's possible to dynamically adjust level using variable g_debug_level, + * which is only declared if DEBUGLEVEL>=2, + * and is a global variable, not multi-thread protected (use with care) + */ + +#ifndef DEBUG_H_12987983217 +#define DEBUG_H_12987983217 + +#if defined (__cplusplus) +extern "C" { +#endif + + +/* static assert is triggered at compile time, leaving no runtime artefact. + * static assert only works with compile-time constants. + * Also, this variant can only be used inside a function. */ +#define DEBUG_STATIC_ASSERT(c) (void)sizeof(char[(c) ? 1 : -1]) + + +/* DEBUGLEVEL is expected to be defined externally, + * typically through compiler command line. + * Value must be a number. */ +#ifndef DEBUGLEVEL +# define DEBUGLEVEL 0 +#endif + + +/* recommended values for DEBUGLEVEL : + * 0 : release mode, no debug, all run-time checks disabled + * 1 : enables assert() only, no display + * 2 : reserved, for currently active debug path + * 3 : events once per object lifetime (CCtx, CDict, etc.) + * 4 : events once per frame + * 5 : events once per block + * 6 : events once per sequence (verbose) + * 7+: events at every position (*very* verbose) + * + * It's generally inconvenient to output traces > 5. + * In which case, it's possible to selectively trigger high verbosity levels + * by modifying g_debug_level. + */ + +#if (DEBUGLEVEL>=1) +# define ZSTD_DEPS_NEED_ASSERT +/**** skipping file: zstd_deps.h ****/ +#else +# ifndef assert /* assert may be already defined, due to prior #include */ +# define assert(condition) ((void)0) /* disable assert (default) */ +# endif +#endif + +#if (DEBUGLEVEL>=2) +# define ZSTD_DEPS_NEED_IO +/**** skipping file: zstd_deps.h ****/ +extern int g_debuglevel; /* the variable is only declared, + it actually lives in debug.c, + and is shared by the whole process. + It's not thread-safe. + It's useful when enabling very verbose levels + on selective conditions (such as position in src) */ + +# define RAWLOG(l, ...) { \ + if (l<=g_debuglevel) { \ + ZSTD_DEBUG_PRINT(__VA_ARGS__); \ + } } +# define DEBUGLOG(l, ...) { \ + if (l<=g_debuglevel) { \ + ZSTD_DEBUG_PRINT(__FILE__ ": " __VA_ARGS__); \ + ZSTD_DEBUG_PRINT(" \n"); \ + } } +#else +# define RAWLOG(l, ...) {} /* disabled */ +# define DEBUGLOG(l, ...) {} /* disabled */ +#endif + + +#if defined (__cplusplus) +} +#endif + +#endif /* DEBUG_H_12987983217 */ +/**** ended inlining debug.h ****/ + +int g_debuglevel = DEBUGLEVEL; +/**** ended inlining common/debug.c ****/ +/**** start inlining common/entropy_common.c ****/ +/* ****************************************************************** + * Common functions of New Generation Entropy library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy + * - Public forum : https://groups.google.com/forum/#!forum/lz4c + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +/* ************************************* +* Dependencies +***************************************/ +/**** start inlining mem.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef MEM_H_MODULE +#define MEM_H_MODULE + +#if defined (__cplusplus) +extern "C" { +#endif + +/*-**************************************** +* Dependencies +******************************************/ +#include /* size_t, ptrdiff_t */ +/**** start inlining compiler.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_COMPILER_H +#define ZSTD_COMPILER_H + +/**** start inlining portability_macros.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_PORTABILITY_MACROS_H +#define ZSTD_PORTABILITY_MACROS_H + +/** + * This header file contains macro definitions to support portability. + * This header is shared between C and ASM code, so it MUST only + * contain macro definitions. It MUST not contain any C code. + * + * This header ONLY defines macros to detect platforms/feature support. + * + */ + + +/* compat. with non-clang compilers */ +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif + +/* compat. with non-clang compilers */ +#ifndef __has_builtin +# define __has_builtin(x) 0 +#endif + +/* compat. with non-clang compilers */ +#ifndef __has_feature +# define __has_feature(x) 0 +#endif + +/* detects whether we are being compiled under msan */ +#ifndef ZSTD_MEMORY_SANITIZER +# if __has_feature(memory_sanitizer) +# define ZSTD_MEMORY_SANITIZER 1 +# else +# define ZSTD_MEMORY_SANITIZER 0 +# endif +#endif + +/* detects whether we are being compiled under asan */ +#ifndef ZSTD_ADDRESS_SANITIZER +# if __has_feature(address_sanitizer) +# define ZSTD_ADDRESS_SANITIZER 1 +# elif defined(__SANITIZE_ADDRESS__) +# define ZSTD_ADDRESS_SANITIZER 1 +# else +# define ZSTD_ADDRESS_SANITIZER 0 +# endif +#endif + +/* detects whether we are being compiled under dfsan */ +#ifndef ZSTD_DATAFLOW_SANITIZER +# if __has_feature(dataflow_sanitizer) +# define ZSTD_DATAFLOW_SANITIZER 1 +# else +# define ZSTD_DATAFLOW_SANITIZER 0 +# endif +#endif + +/* Mark the internal assembly functions as hidden */ +#ifdef __ELF__ +# define ZSTD_HIDE_ASM_FUNCTION(func) .hidden func +#else +# define ZSTD_HIDE_ASM_FUNCTION(func) +#endif + +/* Enable runtime BMI2 dispatch based on the CPU. + * Enabled for clang & gcc >=4.8 on x86 when BMI2 isn't enabled by default. + */ +#ifndef DYNAMIC_BMI2 + #if ((defined(__clang__) && __has_attribute(__target__)) \ + || (defined(__GNUC__) \ + && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \ + && (defined(__x86_64__) || defined(_M_X64)) \ + && !defined(__BMI2__) + # define DYNAMIC_BMI2 1 + #else + # define DYNAMIC_BMI2 0 + #endif +#endif + +/** + * Only enable assembly for GNUC compatible compilers, + * because other platforms may not support GAS assembly syntax. + * + * Only enable assembly for Linux / MacOS, other platforms may + * work, but they haven't been tested. This could likely be + * extended to BSD systems. + * + * Disable assembly when MSAN is enabled, because MSAN requires + * 100% of code to be instrumented to work. + */ +#if defined(__GNUC__) +# if defined(__linux__) || defined(__linux) || defined(__APPLE__) +# if ZSTD_MEMORY_SANITIZER +# define ZSTD_ASM_SUPPORTED 0 +# elif ZSTD_DATAFLOW_SANITIZER +# define ZSTD_ASM_SUPPORTED 0 +# else +# define ZSTD_ASM_SUPPORTED 1 +# endif +# else +# define ZSTD_ASM_SUPPORTED 0 +# endif +#else +# define ZSTD_ASM_SUPPORTED 0 +#endif + +/** + * Determines whether we should enable assembly for x86-64 + * with BMI2. + * + * Enable if all of the following conditions hold: + * - ASM hasn't been explicitly disabled by defining ZSTD_DISABLE_ASM + * - Assembly is supported + * - We are compiling for x86-64 and either: + * - DYNAMIC_BMI2 is enabled + * - BMI2 is supported at compile time + */ +#if !defined(ZSTD_DISABLE_ASM) && \ + ZSTD_ASM_SUPPORTED && \ + defined(__x86_64__) && \ + (DYNAMIC_BMI2 || defined(__BMI2__)) +# define ZSTD_ENABLE_ASM_X86_64_BMI2 1 +#else +# define ZSTD_ENABLE_ASM_X86_64_BMI2 0 +#endif + +/* + * For x86 ELF targets, add .note.gnu.property section for Intel CET in + * assembly sources when CET is enabled. + * + * Additionally, any function that may be called indirectly must begin + * with ZSTD_CET_ENDBRANCH. + */ +#if defined(__ELF__) && (defined(__x86_64__) || defined(__i386__)) \ + && defined(__has_include) +# if __has_include() +# include +# define ZSTD_CET_ENDBRANCH _CET_ENDBR +# endif +#endif + +#ifndef ZSTD_CET_ENDBRANCH +# define ZSTD_CET_ENDBRANCH +#endif + +#endif /* ZSTD_PORTABILITY_MACROS_H */ +/**** ended inlining portability_macros.h ****/ + +/*-******************************************************* +* Compiler specifics +*********************************************************/ +/* force inlining */ + +#if !defined(ZSTD_NO_INLINE) +#if (defined(__GNUC__) && !defined(__STRICT_ANSI__)) || defined(__cplusplus) || defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ +# define INLINE_KEYWORD inline +#else +# define INLINE_KEYWORD +#endif + +#if defined(__GNUC__) || defined(__ICCARM__) +# define FORCE_INLINE_ATTR __attribute__((always_inline)) +#elif defined(_MSC_VER) +# define FORCE_INLINE_ATTR __forceinline +#else +# define FORCE_INLINE_ATTR +#endif + +#else + +#define INLINE_KEYWORD +#define FORCE_INLINE_ATTR + +#endif + +/** + On MSVC qsort requires that functions passed into it use the __cdecl calling conversion(CC). + This explicitly marks such functions as __cdecl so that the code will still compile + if a CC other than __cdecl has been made the default. +*/ +#if defined(_MSC_VER) +# define WIN_CDECL __cdecl +#else +# define WIN_CDECL +#endif + +/** + * FORCE_INLINE_TEMPLATE is used to define C "templates", which take constant + * parameters. They must be inlined for the compiler to eliminate the constant + * branches. + */ +#define FORCE_INLINE_TEMPLATE static INLINE_KEYWORD FORCE_INLINE_ATTR +/** + * HINT_INLINE is used to help the compiler generate better code. It is *not* + * used for "templates", so it can be tweaked based on the compilers + * performance. + * + * gcc-4.8 and gcc-4.9 have been shown to benefit from leaving off the + * always_inline attribute. + * + * clang up to 5.0.0 (trunk) benefit tremendously from the always_inline + * attribute. + */ +#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 8 && __GNUC__ < 5 +# define HINT_INLINE static INLINE_KEYWORD +#else +# define HINT_INLINE static INLINE_KEYWORD FORCE_INLINE_ATTR +#endif + +/* UNUSED_ATTR tells the compiler it is okay if the function is unused. */ +#if defined(__GNUC__) +# define UNUSED_ATTR __attribute__((unused)) +#else +# define UNUSED_ATTR +#endif + +/* force no inlining */ +#ifdef _MSC_VER +# define FORCE_NOINLINE static __declspec(noinline) +#else +# if defined(__GNUC__) || defined(__ICCARM__) +# define FORCE_NOINLINE static __attribute__((__noinline__)) +# else +# define FORCE_NOINLINE static +# endif +#endif + + +/* target attribute */ +#if defined(__GNUC__) || defined(__ICCARM__) +# define TARGET_ATTRIBUTE(target) __attribute__((__target__(target))) +#else +# define TARGET_ATTRIBUTE(target) +#endif + +/* Target attribute for BMI2 dynamic dispatch. + * Enable lzcnt, bmi, and bmi2. + * We test for bmi1 & bmi2. lzcnt is included in bmi1. + */ +#define BMI2_TARGET_ATTRIBUTE TARGET_ATTRIBUTE("lzcnt,bmi,bmi2") + +/* prefetch + * can be disabled, by declaring NO_PREFETCH build macro */ +#if defined(NO_PREFETCH) +# define PREFETCH_L1(ptr) (void)(ptr) /* disabled */ +# define PREFETCH_L2(ptr) (void)(ptr) /* disabled */ +#else +# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) /* _mm_prefetch() is not defined outside of x86/x64 */ +# include /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ +# define PREFETCH_L1(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) +# define PREFETCH_L2(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T1) +# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) ) +# define PREFETCH_L1(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */) +# define PREFETCH_L2(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 2 /* locality */) +# elif defined(__aarch64__) +# define PREFETCH_L1(ptr) __asm__ __volatile__("prfm pldl1keep, %0" ::"Q"(*(ptr))) +# define PREFETCH_L2(ptr) __asm__ __volatile__("prfm pldl2keep, %0" ::"Q"(*(ptr))) +# else +# define PREFETCH_L1(ptr) (void)(ptr) /* disabled */ +# define PREFETCH_L2(ptr) (void)(ptr) /* disabled */ +# endif +#endif /* NO_PREFETCH */ + +#define CACHELINE_SIZE 64 + +#define PREFETCH_AREA(p, s) { \ + const char* const _ptr = (const char*)(p); \ + size_t const _size = (size_t)(s); \ + size_t _pos; \ + for (_pos=0; _pos<_size; _pos+=CACHELINE_SIZE) { \ + PREFETCH_L2(_ptr + _pos); \ + } \ +} + +/* vectorization + * older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax, + * and some compilers, like Intel ICC and MCST LCC, do not support it at all. */ +#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) && !defined(__LCC__) +# if (__GNUC__ == 4 && __GNUC_MINOR__ > 3) || (__GNUC__ >= 5) +# define DONT_VECTORIZE __attribute__((optimize("no-tree-vectorize"))) +# else +# define DONT_VECTORIZE _Pragma("GCC optimize(\"no-tree-vectorize\")") +# endif +#else +# define DONT_VECTORIZE +#endif + +/* Tell the compiler that a branch is likely or unlikely. + * Only use these macros if it causes the compiler to generate better code. + * If you can remove a LIKELY/UNLIKELY annotation without speed changes in gcc + * and clang, please do. + */ +#if defined(__GNUC__) +#define LIKELY(x) (__builtin_expect((x), 1)) +#define UNLIKELY(x) (__builtin_expect((x), 0)) +#else +#define LIKELY(x) (x) +#define UNLIKELY(x) (x) +#endif + +#if __has_builtin(__builtin_unreachable) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))) +# define ZSTD_UNREACHABLE { assert(0), __builtin_unreachable(); } +#else +# define ZSTD_UNREACHABLE { assert(0); } +#endif + +/* disable warnings */ +#ifdef _MSC_VER /* Visual Studio */ +# include /* For Visual 2005 */ +# pragma warning(disable : 4100) /* disable: C4100: unreferenced formal parameter */ +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +# pragma warning(disable : 4204) /* disable: C4204: non-constant aggregate initializer */ +# pragma warning(disable : 4214) /* disable: C4214: non-int bitfields */ +# pragma warning(disable : 4324) /* disable: C4324: padded structure */ +#endif + +/*Like DYNAMIC_BMI2 but for compile time determination of BMI2 support*/ +#ifndef STATIC_BMI2 +# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) +# ifdef __AVX2__ //MSVC does not have a BMI2 specific flag, but every CPU that supports AVX2 also supports BMI2 +# define STATIC_BMI2 1 +# endif +# elif defined(__BMI2__) && defined(__x86_64__) && defined(__GNUC__) +# define STATIC_BMI2 1 +# endif +#endif + +#ifndef STATIC_BMI2 + #define STATIC_BMI2 0 +#endif + +/* compile time determination of SIMD support */ +#if !defined(ZSTD_NO_INTRINSICS) +# if defined(__SSE2__) || defined(_M_AMD64) || (defined (_M_IX86) && defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) +# define ZSTD_ARCH_X86_SSE2 +# endif +# if defined(__ARM_NEON) || defined(_M_ARM64) +# define ZSTD_ARCH_ARM_NEON +# endif +# +# if defined(ZSTD_ARCH_X86_SSE2) +# include +# elif defined(ZSTD_ARCH_ARM_NEON) +# include +# endif +#endif + +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute) +# define ZSTD_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define ZSTD_HAS_C_ATTRIBUTE(x) 0 +#endif + +/* Only use C++ attributes in C++. Some compilers report support for C++ + * attributes when compiling with C. + */ +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define ZSTD_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define ZSTD_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +/* Define ZSTD_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute. + * - C23: https://en.cppreference.com/w/c/language/attributes/fallthrough + * - CPP17: https://en.cppreference.com/w/cpp/language/attributes/fallthrough + * - Else: __attribute__((__fallthrough__)) + */ +#ifndef ZSTD_FALLTHROUGH +# if ZSTD_HAS_C_ATTRIBUTE(fallthrough) +# define ZSTD_FALLTHROUGH [[fallthrough]] +# elif ZSTD_HAS_CPP_ATTRIBUTE(fallthrough) +# define ZSTD_FALLTHROUGH [[fallthrough]] +# elif __has_attribute(__fallthrough__) +/* Leading semicolon is to satisfy gcc-11 with -pedantic. Without the semicolon + * gcc complains about: a label can only be part of a statement and a declaration is not a statement. + */ +# define ZSTD_FALLTHROUGH ; __attribute__((__fallthrough__)) +# else +# define ZSTD_FALLTHROUGH +# endif +#endif + +/*-************************************************************** +* Alignment check +*****************************************************************/ + +/* this test was initially positioned in mem.h, + * but this file is removed (or replaced) for linux kernel + * so it's now hosted in compiler.h, + * which remains valid for both user & kernel spaces. + */ + +#ifndef ZSTD_ALIGNOF +# if defined(__GNUC__) || defined(_MSC_VER) +/* covers gcc, clang & MSVC */ +/* note : this section must come first, before C11, + * due to a limitation in the kernel source generator */ +# define ZSTD_ALIGNOF(T) __alignof(T) + +# elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +/* C11 support */ +# include +# define ZSTD_ALIGNOF(T) alignof(T) + +# else +/* No known support for alignof() - imperfect backup */ +# define ZSTD_ALIGNOF(T) (sizeof(void*) < sizeof(T) ? sizeof(void*) : sizeof(T)) + +# endif +#endif /* ZSTD_ALIGNOF */ + +/*-************************************************************** +* Sanitizer +*****************************************************************/ + +/* Issue #3240 reports an ASAN failure on an llvm-mingw build. Out of an + * abundance of caution, disable our custom poisoning on mingw. */ +#ifdef __MINGW32__ +#ifndef ZSTD_ASAN_DONT_POISON_WORKSPACE +#define ZSTD_ASAN_DONT_POISON_WORKSPACE 1 +#endif +#ifndef ZSTD_MSAN_DONT_POISON_WORKSPACE +#define ZSTD_MSAN_DONT_POISON_WORKSPACE 1 +#endif +#endif + +#if ZSTD_MEMORY_SANITIZER && !defined(ZSTD_MSAN_DONT_POISON_WORKSPACE) +/* Not all platforms that support msan provide sanitizers/msan_interface.h. + * We therefore declare the functions we need ourselves, rather than trying to + * include the header file... */ +#include /* size_t */ +#define ZSTD_DEPS_NEED_STDINT +/**** skipping file: zstd_deps.h ****/ + +/* Make memory region fully initialized (without changing its contents). */ +void __msan_unpoison(const volatile void *a, size_t size); + +/* Make memory region fully uninitialized (without changing its contents). + This is a legacy interface that does not update origin information. Use + __msan_allocated_memory() instead. */ +void __msan_poison(const volatile void *a, size_t size); + +/* Returns the offset of the first (at least partially) poisoned byte in the + memory range, or -1 if the whole range is good. */ +intptr_t __msan_test_shadow(const volatile void *x, size_t size); + +/* Print shadow and origin for the memory range to stderr in a human-readable + format. */ +void __msan_print_shadow(const volatile void *x, size_t size); +#endif + +#if ZSTD_ADDRESS_SANITIZER && !defined(ZSTD_ASAN_DONT_POISON_WORKSPACE) +/* Not all platforms that support asan provide sanitizers/asan_interface.h. + * We therefore declare the functions we need ourselves, rather than trying to + * include the header file... */ +#include /* size_t */ + +/** + * Marks a memory region ([addr, addr+size)) as unaddressable. + * + * This memory must be previously allocated by your program. Instrumented + * code is forbidden from accessing addresses in this region until it is + * unpoisoned. This function is not guaranteed to poison the entire region - + * it could poison only a subregion of [addr, addr+size) due to ASan + * alignment restrictions. + * + * \note This function is not thread-safe because no two threads can poison or + * unpoison memory in the same memory region simultaneously. + * + * \param addr Start of memory region. + * \param size Size of memory region. */ +void __asan_poison_memory_region(void const volatile *addr, size_t size); + +/** + * Marks a memory region ([addr, addr+size)) as addressable. + * + * This memory must be previously allocated by your program. Accessing + * addresses in this region is allowed until this region is poisoned again. + * This function could unpoison a super-region of [addr, addr+size) due + * to ASan alignment restrictions. + * + * \note This function is not thread-safe because no two threads can + * poison or unpoison memory in the same memory region simultaneously. + * + * \param addr Start of memory region. + * \param size Size of memory region. */ +void __asan_unpoison_memory_region(void const volatile *addr, size_t size); +#endif + +#endif /* ZSTD_COMPILER_H */ +/**** ended inlining compiler.h ****/ +/**** skipping file: debug.h ****/ +/**** skipping file: zstd_deps.h ****/ + + +/*-**************************************** +* Compiler specifics +******************************************/ +#if defined(_MSC_VER) /* Visual Studio */ +# include /* _byteswap_ulong */ +# include /* _byteswap_* */ +#endif +#if defined(__GNUC__) +# define MEM_STATIC static __inline __attribute__((unused)) +#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# define MEM_STATIC static inline +#elif defined(_MSC_VER) +# define MEM_STATIC static __inline +#else +# define MEM_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */ +#endif + +/*-************************************************************** +* Basic Types +*****************************************************************/ +#if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# if defined(_AIX) +# include +# else +# include /* intptr_t */ +# endif + typedef uint8_t BYTE; + typedef uint8_t U8; + typedef int8_t S8; + typedef uint16_t U16; + typedef int16_t S16; + typedef uint32_t U32; + typedef int32_t S32; + typedef uint64_t U64; + typedef int64_t S64; +#else +# include +#if CHAR_BIT != 8 +# error "this implementation requires char to be exactly 8-bit type" +#endif + typedef unsigned char BYTE; + typedef unsigned char U8; + typedef signed char S8; +#if USHRT_MAX != 65535 +# error "this implementation requires short to be exactly 16-bit type" +#endif + typedef unsigned short U16; + typedef signed short S16; +#if UINT_MAX != 4294967295 +# error "this implementation requires int to be exactly 32-bit type" +#endif + typedef unsigned int U32; + typedef signed int S32; +/* note : there are no limits defined for long long type in C90. + * limits exist in C99, however, in such case, is preferred */ + typedef unsigned long long U64; + typedef signed long long S64; +#endif + + +/*-************************************************************** +* Memory I/O API +*****************************************************************/ +/*=== Static platform detection ===*/ +MEM_STATIC unsigned MEM_32bits(void); +MEM_STATIC unsigned MEM_64bits(void); +MEM_STATIC unsigned MEM_isLittleEndian(void); + +/*=== Native unaligned read/write ===*/ +MEM_STATIC U16 MEM_read16(const void* memPtr); +MEM_STATIC U32 MEM_read32(const void* memPtr); +MEM_STATIC U64 MEM_read64(const void* memPtr); +MEM_STATIC size_t MEM_readST(const void* memPtr); + +MEM_STATIC void MEM_write16(void* memPtr, U16 value); +MEM_STATIC void MEM_write32(void* memPtr, U32 value); +MEM_STATIC void MEM_write64(void* memPtr, U64 value); + +/*=== Little endian unaligned read/write ===*/ +MEM_STATIC U16 MEM_readLE16(const void* memPtr); +MEM_STATIC U32 MEM_readLE24(const void* memPtr); +MEM_STATIC U32 MEM_readLE32(const void* memPtr); +MEM_STATIC U64 MEM_readLE64(const void* memPtr); +MEM_STATIC size_t MEM_readLEST(const void* memPtr); + +MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val); +MEM_STATIC void MEM_writeLE24(void* memPtr, U32 val); +MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32); +MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64); +MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val); + +/*=== Big endian unaligned read/write ===*/ +MEM_STATIC U32 MEM_readBE32(const void* memPtr); +MEM_STATIC U64 MEM_readBE64(const void* memPtr); +MEM_STATIC size_t MEM_readBEST(const void* memPtr); + +MEM_STATIC void MEM_writeBE32(void* memPtr, U32 val32); +MEM_STATIC void MEM_writeBE64(void* memPtr, U64 val64); +MEM_STATIC void MEM_writeBEST(void* memPtr, size_t val); + +/*=== Byteswap ===*/ +MEM_STATIC U32 MEM_swap32(U32 in); +MEM_STATIC U64 MEM_swap64(U64 in); +MEM_STATIC size_t MEM_swapST(size_t in); + + +/*-************************************************************** +* Memory I/O Implementation +*****************************************************************/ +/* MEM_FORCE_MEMORY_ACCESS : For accessing unaligned memory: + * Method 0 : always use `memcpy()`. Safe and portable. + * Method 1 : Use compiler extension to set unaligned access. + * Method 2 : direct access. This method is portable but violate C standard. + * It can generate buggy code on targets depending on alignment. + * Default : method 1 if supported, else method 0 + */ +#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ +# ifdef __GNUC__ +# define MEM_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +MEM_STATIC unsigned MEM_32bits(void) { return sizeof(size_t)==4; } +MEM_STATIC unsigned MEM_64bits(void) { return sizeof(size_t)==8; } + +MEM_STATIC unsigned MEM_isLittleEndian(void) +{ +#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) + return 1; +#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) + return 0; +#elif defined(__clang__) && __LITTLE_ENDIAN__ + return 1; +#elif defined(__clang__) && __BIG_ENDIAN__ + return 0; +#elif defined(_MSC_VER) && (_M_AMD64 || _M_IX86) + return 1; +#elif defined(__DMC__) && defined(_M_IX86) + return 1; +#else + const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ + return one.c[0]; +#endif +} + +#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) + +/* violates C standard, by lying on structure alignment. +Only use if no other choice to achieve best performance on target platform */ +MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } +MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } +MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } +MEM_STATIC size_t MEM_readST(const void* memPtr) { return *(const size_t*) memPtr; } + +MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } +MEM_STATIC void MEM_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } +MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(U64*)memPtr = value; } + +#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) + +typedef __attribute__((aligned(1))) U16 unalign16; +typedef __attribute__((aligned(1))) U32 unalign32; +typedef __attribute__((aligned(1))) U64 unalign64; +typedef __attribute__((aligned(1))) size_t unalignArch; + +MEM_STATIC U16 MEM_read16(const void* ptr) { return *(const unalign16*)ptr; } +MEM_STATIC U32 MEM_read32(const void* ptr) { return *(const unalign32*)ptr; } +MEM_STATIC U64 MEM_read64(const void* ptr) { return *(const unalign64*)ptr; } +MEM_STATIC size_t MEM_readST(const void* ptr) { return *(const unalignArch*)ptr; } + +MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(unalign16*)memPtr = value; } +MEM_STATIC void MEM_write32(void* memPtr, U32 value) { *(unalign32*)memPtr = value; } +MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(unalign64*)memPtr = value; } + +#else + +/* default method, safe and standard. + can sometimes prove slower */ + +MEM_STATIC U16 MEM_read16(const void* memPtr) +{ + U16 val; ZSTD_memcpy(&val, memPtr, sizeof(val)); return val; +} + +MEM_STATIC U32 MEM_read32(const void* memPtr) +{ + U32 val; ZSTD_memcpy(&val, memPtr, sizeof(val)); return val; +} + +MEM_STATIC U64 MEM_read64(const void* memPtr) +{ + U64 val; ZSTD_memcpy(&val, memPtr, sizeof(val)); return val; +} + +MEM_STATIC size_t MEM_readST(const void* memPtr) +{ + size_t val; ZSTD_memcpy(&val, memPtr, sizeof(val)); return val; +} + +MEM_STATIC void MEM_write16(void* memPtr, U16 value) +{ + ZSTD_memcpy(memPtr, &value, sizeof(value)); +} + +MEM_STATIC void MEM_write32(void* memPtr, U32 value) +{ + ZSTD_memcpy(memPtr, &value, sizeof(value)); +} + +MEM_STATIC void MEM_write64(void* memPtr, U64 value) +{ + ZSTD_memcpy(memPtr, &value, sizeof(value)); +} + +#endif /* MEM_FORCE_MEMORY_ACCESS */ + +MEM_STATIC U32 MEM_swap32_fallback(U32 in) +{ + return ((in << 24) & 0xff000000 ) | + ((in << 8) & 0x00ff0000 ) | + ((in >> 8) & 0x0000ff00 ) | + ((in >> 24) & 0x000000ff ); +} + +MEM_STATIC U32 MEM_swap32(U32 in) +{ +#if defined(_MSC_VER) /* Visual Studio */ + return _byteswap_ulong(in); +#elif (defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)) \ + || (defined(__clang__) && __has_builtin(__builtin_bswap32)) + return __builtin_bswap32(in); +#else + return MEM_swap32_fallback(in); +#endif +} + +MEM_STATIC U64 MEM_swap64_fallback(U64 in) +{ + return ((in << 56) & 0xff00000000000000ULL) | + ((in << 40) & 0x00ff000000000000ULL) | + ((in << 24) & 0x0000ff0000000000ULL) | + ((in << 8) & 0x000000ff00000000ULL) | + ((in >> 8) & 0x00000000ff000000ULL) | + ((in >> 24) & 0x0000000000ff0000ULL) | + ((in >> 40) & 0x000000000000ff00ULL) | + ((in >> 56) & 0x00000000000000ffULL); +} + +MEM_STATIC U64 MEM_swap64(U64 in) +{ +#if defined(_MSC_VER) /* Visual Studio */ + return _byteswap_uint64(in); +#elif (defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)) \ + || (defined(__clang__) && __has_builtin(__builtin_bswap64)) + return __builtin_bswap64(in); +#else + return MEM_swap64_fallback(in); +#endif +} + +MEM_STATIC size_t MEM_swapST(size_t in) +{ + if (MEM_32bits()) + return (size_t)MEM_swap32((U32)in); + else + return (size_t)MEM_swap64((U64)in); +} + +/*=== Little endian r/w ===*/ + +MEM_STATIC U16 MEM_readLE16(const void* memPtr) +{ + if (MEM_isLittleEndian()) + return MEM_read16(memPtr); + else { + const BYTE* p = (const BYTE*)memPtr; + return (U16)(p[0] + (p[1]<<8)); + } +} + +MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val) +{ + if (MEM_isLittleEndian()) { + MEM_write16(memPtr, val); + } else { + BYTE* p = (BYTE*)memPtr; + p[0] = (BYTE)val; + p[1] = (BYTE)(val>>8); + } +} + +MEM_STATIC U32 MEM_readLE24(const void* memPtr) +{ + return (U32)MEM_readLE16(memPtr) + ((U32)(((const BYTE*)memPtr)[2]) << 16); +} + +MEM_STATIC void MEM_writeLE24(void* memPtr, U32 val) +{ + MEM_writeLE16(memPtr, (U16)val); + ((BYTE*)memPtr)[2] = (BYTE)(val>>16); +} + +MEM_STATIC U32 MEM_readLE32(const void* memPtr) +{ + if (MEM_isLittleEndian()) + return MEM_read32(memPtr); + else + return MEM_swap32(MEM_read32(memPtr)); +} + +MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32) +{ + if (MEM_isLittleEndian()) + MEM_write32(memPtr, val32); + else + MEM_write32(memPtr, MEM_swap32(val32)); +} + +MEM_STATIC U64 MEM_readLE64(const void* memPtr) +{ + if (MEM_isLittleEndian()) + return MEM_read64(memPtr); + else + return MEM_swap64(MEM_read64(memPtr)); +} + +MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64) +{ + if (MEM_isLittleEndian()) + MEM_write64(memPtr, val64); + else + MEM_write64(memPtr, MEM_swap64(val64)); +} + +MEM_STATIC size_t MEM_readLEST(const void* memPtr) +{ + if (MEM_32bits()) + return (size_t)MEM_readLE32(memPtr); + else + return (size_t)MEM_readLE64(memPtr); +} + +MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val) +{ + if (MEM_32bits()) + MEM_writeLE32(memPtr, (U32)val); + else + MEM_writeLE64(memPtr, (U64)val); +} + +/*=== Big endian r/w ===*/ + +MEM_STATIC U32 MEM_readBE32(const void* memPtr) +{ + if (MEM_isLittleEndian()) + return MEM_swap32(MEM_read32(memPtr)); + else + return MEM_read32(memPtr); +} + +MEM_STATIC void MEM_writeBE32(void* memPtr, U32 val32) +{ + if (MEM_isLittleEndian()) + MEM_write32(memPtr, MEM_swap32(val32)); + else + MEM_write32(memPtr, val32); +} + +MEM_STATIC U64 MEM_readBE64(const void* memPtr) +{ + if (MEM_isLittleEndian()) + return MEM_swap64(MEM_read64(memPtr)); + else + return MEM_read64(memPtr); +} + +MEM_STATIC void MEM_writeBE64(void* memPtr, U64 val64) +{ + if (MEM_isLittleEndian()) + MEM_write64(memPtr, MEM_swap64(val64)); + else + MEM_write64(memPtr, val64); +} + +MEM_STATIC size_t MEM_readBEST(const void* memPtr) +{ + if (MEM_32bits()) + return (size_t)MEM_readBE32(memPtr); + else + return (size_t)MEM_readBE64(memPtr); +} + +MEM_STATIC void MEM_writeBEST(void* memPtr, size_t val) +{ + if (MEM_32bits()) + MEM_writeBE32(memPtr, (U32)val); + else + MEM_writeBE64(memPtr, (U64)val); +} + +/* code only tested on 32 and 64 bits systems */ +MEM_STATIC void MEM_check(void) { DEBUG_STATIC_ASSERT((sizeof(size_t)==4) || (sizeof(size_t)==8)); } + + +#if defined (__cplusplus) +} +#endif + +#endif /* MEM_H_MODULE */ +/**** ended inlining mem.h ****/ +/**** start inlining error_private.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* Note : this module is expected to remain private, do not expose it */ + +#ifndef ERROR_H_MODULE +#define ERROR_H_MODULE + +#if defined (__cplusplus) +extern "C" { +#endif + + +/* **************************************** +* Dependencies +******************************************/ +/**** start inlining ../zstd_errors.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_ERRORS_H_398273423 +#define ZSTD_ERRORS_H_398273423 + +#if defined (__cplusplus) +extern "C" { +#endif + +/*===== dependency =====*/ +#include /* size_t */ + + +/* ===== ZSTDERRORLIB_API : control library symbols visibility ===== */ +#ifndef ZSTDERRORLIB_VISIBLE + /* Backwards compatibility with old macro name */ +# ifdef ZSTDERRORLIB_VISIBILITY +# define ZSTDERRORLIB_VISIBLE ZSTDERRORLIB_VISIBILITY +# elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDERRORLIB_VISIBLE __attribute__ ((visibility ("default"))) +# else +# define ZSTDERRORLIB_VISIBLE +# endif +#endif + +#ifndef ZSTDERRORLIB_HIDDEN +# if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDERRORLIB_HIDDEN __attribute__ ((visibility ("hidden"))) +# else +# define ZSTDERRORLIB_HIDDEN +# endif +#endif + +#if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDERRORLIB_API __declspec(dllexport) ZSTDERRORLIB_VISIBLE +#elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDERRORLIB_API __declspec(dllimport) ZSTDERRORLIB_VISIBLE /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define ZSTDERRORLIB_API ZSTDERRORLIB_VISIBLE +#endif + +/*-********************************************* + * Error codes list + *-********************************************* + * Error codes _values_ are pinned down since v1.3.1 only. + * Therefore, don't rely on values if you may link to any version < v1.3.1. + * + * Only values < 100 are considered stable. + * + * note 1 : this API shall be used with static linking only. + * dynamic linking is not yet officially supported. + * note 2 : Prefer relying on the enum than on its value whenever possible + * This is the only supported way to use the error list < v1.3.1 + * note 3 : ZSTD_isError() is always correct, whatever the library version. + **********************************************/ +typedef enum { + ZSTD_error_no_error = 0, + ZSTD_error_GENERIC = 1, + ZSTD_error_prefix_unknown = 10, + ZSTD_error_version_unsupported = 12, + ZSTD_error_frameParameter_unsupported = 14, + ZSTD_error_frameParameter_windowTooLarge = 16, + ZSTD_error_corruption_detected = 20, + ZSTD_error_checksum_wrong = 22, + ZSTD_error_literals_headerWrong = 24, + ZSTD_error_dictionary_corrupted = 30, + ZSTD_error_dictionary_wrong = 32, + ZSTD_error_dictionaryCreation_failed = 34, + ZSTD_error_parameter_unsupported = 40, + ZSTD_error_parameter_combination_unsupported = 41, + ZSTD_error_parameter_outOfBound = 42, + ZSTD_error_tableLog_tooLarge = 44, + ZSTD_error_maxSymbolValue_tooLarge = 46, + ZSTD_error_maxSymbolValue_tooSmall = 48, + ZSTD_error_stabilityCondition_notRespected = 50, + ZSTD_error_stage_wrong = 60, + ZSTD_error_init_missing = 62, + ZSTD_error_memory_allocation = 64, + ZSTD_error_workSpace_tooSmall= 66, + ZSTD_error_dstSize_tooSmall = 70, + ZSTD_error_srcSize_wrong = 72, + ZSTD_error_dstBuffer_null = 74, + ZSTD_error_noForwardProgress_destFull = 80, + ZSTD_error_noForwardProgress_inputEmpty = 82, + /* following error codes are __NOT STABLE__, they can be removed or changed in future versions */ + ZSTD_error_frameIndex_tooLarge = 100, + ZSTD_error_seekableIO = 102, + ZSTD_error_dstBuffer_wrong = 104, + ZSTD_error_srcBuffer_wrong = 105, + ZSTD_error_sequenceProducer_failed = 106, + ZSTD_error_externalSequences_invalid = 107, + ZSTD_error_maxCode = 120 /* never EVER use this value directly, it can change in future versions! Use ZSTD_isError() instead */ +} ZSTD_ErrorCode; + +/*! ZSTD_getErrorCode() : + convert a `size_t` function result into a `ZSTD_ErrorCode` enum type, + which can be used to compare with enum list published above */ +ZSTDERRORLIB_API ZSTD_ErrorCode ZSTD_getErrorCode(size_t functionResult); +ZSTDERRORLIB_API const char* ZSTD_getErrorString(ZSTD_ErrorCode code); /**< Same as ZSTD_getErrorName, but using a `ZSTD_ErrorCode` enum argument */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_ERRORS_H_398273423 */ +/**** ended inlining ../zstd_errors.h ****/ +/**** skipping file: compiler.h ****/ +/**** skipping file: debug.h ****/ +/**** skipping file: zstd_deps.h ****/ + + +/* **************************************** +* Compiler-specific +******************************************/ +#if defined(__GNUC__) +# define ERR_STATIC static __attribute__((unused)) +#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# define ERR_STATIC static inline +#elif defined(_MSC_VER) +# define ERR_STATIC static __inline +#else +# define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */ +#endif + + +/*-**************************************** +* Customization (error_public.h) +******************************************/ +typedef ZSTD_ErrorCode ERR_enum; +#define PREFIX(name) ZSTD_error_##name + + +/*-**************************************** +* Error codes handling +******************************************/ +#undef ERROR /* already defined on Visual Studio */ +#define ERROR(name) ZSTD_ERROR(name) +#define ZSTD_ERROR(name) ((size_t)-PREFIX(name)) + +ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); } + +ERR_STATIC ERR_enum ERR_getErrorCode(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); } + +/* check and forward error code */ +#define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return e +#define CHECK_F(f) { CHECK_V_F(_var_err__, f); } + + +/*-**************************************** +* Error Strings +******************************************/ + +const char* ERR_getErrorString(ERR_enum code); /* error_private.c */ + +ERR_STATIC const char* ERR_getErrorName(size_t code) +{ + return ERR_getErrorString(ERR_getErrorCode(code)); +} + +/** + * Ignore: this is an internal helper. + * + * This is a helper function to help force C99-correctness during compilation. + * Under strict compilation modes, variadic macro arguments can't be empty. + * However, variadic function arguments can be. Using a function therefore lets + * us statically check that at least one (string) argument was passed, + * independent of the compilation flags. + */ +static INLINE_KEYWORD UNUSED_ATTR +void _force_has_format_string(const char *format, ...) { + (void)format; +} + +/** + * Ignore: this is an internal helper. + * + * We want to force this function invocation to be syntactically correct, but + * we don't want to force runtime evaluation of its arguments. + */ +#define _FORCE_HAS_FORMAT_STRING(...) \ + if (0) { \ + _force_has_format_string(__VA_ARGS__); \ + } + +#define ERR_QUOTE(str) #str + +/** + * Return the specified error if the condition evaluates to true. + * + * In debug modes, prints additional information. + * In order to do that (particularly, printing the conditional that failed), + * this can't just wrap RETURN_ERROR(). + */ +#define RETURN_ERROR_IF(cond, err, ...) \ + if (cond) { \ + RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \ + __FILE__, __LINE__, ERR_QUOTE(cond), ERR_QUOTE(ERROR(err))); \ + _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ + RAWLOG(3, ": " __VA_ARGS__); \ + RAWLOG(3, "\n"); \ + return ERROR(err); \ + } + +/** + * Unconditionally return the specified error. + * + * In debug modes, prints additional information. + */ +#define RETURN_ERROR(err, ...) \ + do { \ + RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \ + __FILE__, __LINE__, ERR_QUOTE(ERROR(err))); \ + _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ + RAWLOG(3, ": " __VA_ARGS__); \ + RAWLOG(3, "\n"); \ + return ERROR(err); \ + } while(0); + +/** + * If the provided expression evaluates to an error code, returns that error code. + * + * In debug modes, prints additional information. + */ +#define FORWARD_IF_ERROR(err, ...) \ + do { \ + size_t const err_code = (err); \ + if (ERR_isError(err_code)) { \ + RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \ + __FILE__, __LINE__, ERR_QUOTE(err), ERR_getErrorName(err_code)); \ + _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ + RAWLOG(3, ": " __VA_ARGS__); \ + RAWLOG(3, "\n"); \ + return err_code; \ + } \ + } while(0); + +#if defined (__cplusplus) +} +#endif + +#endif /* ERROR_H_MODULE */ +/**** ended inlining error_private.h ****/ +#define FSE_STATIC_LINKING_ONLY /* FSE_MIN_TABLELOG */ +/**** start inlining fse.h ****/ +/* ****************************************************************** + * FSE : Finite State Entropy codec + * Public Prototypes declaration + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef FSE_H +#define FSE_H + + +/*-***************************************** +* Dependencies +******************************************/ +/**** skipping file: zstd_deps.h ****/ + + +/*-***************************************** +* FSE_PUBLIC_API : control library symbols visibility +******************************************/ +#if defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) && defined(__GNUC__) && (__GNUC__ >= 4) +# define FSE_PUBLIC_API __attribute__ ((visibility ("default"))) +#elif defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) /* Visual expected */ +# define FSE_PUBLIC_API __declspec(dllexport) +#elif defined(FSE_DLL_IMPORT) && (FSE_DLL_IMPORT==1) +# define FSE_PUBLIC_API __declspec(dllimport) /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define FSE_PUBLIC_API +#endif + +/*------ Version ------*/ +#define FSE_VERSION_MAJOR 0 +#define FSE_VERSION_MINOR 9 +#define FSE_VERSION_RELEASE 0 + +#define FSE_LIB_VERSION FSE_VERSION_MAJOR.FSE_VERSION_MINOR.FSE_VERSION_RELEASE +#define FSE_QUOTE(str) #str +#define FSE_EXPAND_AND_QUOTE(str) FSE_QUOTE(str) +#define FSE_VERSION_STRING FSE_EXPAND_AND_QUOTE(FSE_LIB_VERSION) + +#define FSE_VERSION_NUMBER (FSE_VERSION_MAJOR *100*100 + FSE_VERSION_MINOR *100 + FSE_VERSION_RELEASE) +FSE_PUBLIC_API unsigned FSE_versionNumber(void); /**< library version number; to be used when checking dll version */ + + +/*-***************************************** +* Tool functions +******************************************/ +FSE_PUBLIC_API size_t FSE_compressBound(size_t size); /* maximum compressed size */ + +/* Error Management */ +FSE_PUBLIC_API unsigned FSE_isError(size_t code); /* tells if a return value is an error code */ +FSE_PUBLIC_API const char* FSE_getErrorName(size_t code); /* provides error code string (useful for debugging) */ + + +/*-***************************************** +* FSE detailed API +******************************************/ +/*! +FSE_compress() does the following: +1. count symbol occurrence from source[] into table count[] (see hist.h) +2. normalize counters so that sum(count[]) == Power_of_2 (2^tableLog) +3. save normalized counters to memory buffer using writeNCount() +4. build encoding table 'CTable' from normalized counters +5. encode the data stream using encoding table 'CTable' + +FSE_decompress() does the following: +1. read normalized counters with readNCount() +2. build decoding table 'DTable' from normalized counters +3. decode the data stream using decoding table 'DTable' + +The following API allows targeting specific sub-functions for advanced tasks. +For example, it's possible to compress several blocks using the same 'CTable', +or to save and provide normalized distribution using external method. +*/ + +/* *** COMPRESSION *** */ + +/*! FSE_optimalTableLog(): + dynamically downsize 'tableLog' when conditions are met. + It saves CPU time, by using smaller tables, while preserving or even improving compression ratio. + @return : recommended tableLog (necessarily <= 'maxTableLog') */ +FSE_PUBLIC_API unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue); + +/*! FSE_normalizeCount(): + normalize counts so that sum(count[]) == Power_of_2 (2^tableLog) + 'normalizedCounter' is a table of short, of minimum size (maxSymbolValue+1). + useLowProbCount is a boolean parameter which trades off compressed size for + faster header decoding. When it is set to 1, the compressed data will be slightly + smaller. And when it is set to 0, FSE_readNCount() and FSE_buildDTable() will be + faster. If you are compressing a small amount of data (< 2 KB) then useLowProbCount=0 + is a good default, since header deserialization makes a big speed difference. + Otherwise, useLowProbCount=1 is a good default, since the speed difference is small. + @return : tableLog, + or an errorCode, which can be tested using FSE_isError() */ +FSE_PUBLIC_API size_t FSE_normalizeCount(short* normalizedCounter, unsigned tableLog, + const unsigned* count, size_t srcSize, unsigned maxSymbolValue, unsigned useLowProbCount); + +/*! FSE_NCountWriteBound(): + Provides the maximum possible size of an FSE normalized table, given 'maxSymbolValue' and 'tableLog'. + Typically useful for allocation purpose. */ +FSE_PUBLIC_API size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog); + +/*! FSE_writeNCount(): + Compactly save 'normalizedCounter' into 'buffer'. + @return : size of the compressed table, + or an errorCode, which can be tested using FSE_isError(). */ +FSE_PUBLIC_API size_t FSE_writeNCount (void* buffer, size_t bufferSize, + const short* normalizedCounter, + unsigned maxSymbolValue, unsigned tableLog); + +/*! Constructor and Destructor of FSE_CTable. + Note that FSE_CTable size depends on 'tableLog' and 'maxSymbolValue' */ +typedef unsigned FSE_CTable; /* don't allocate that. It's only meant to be more restrictive than void* */ + +/*! FSE_buildCTable(): + Builds `ct`, which must be already allocated, using FSE_createCTable(). + @return : 0, or an errorCode, which can be tested using FSE_isError() */ +FSE_PUBLIC_API size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog); + +/*! FSE_compress_usingCTable(): + Compress `src` using `ct` into `dst` which must be already allocated. + @return : size of compressed data (<= `dstCapacity`), + or 0 if compressed data could not fit into `dst`, + or an errorCode, which can be tested using FSE_isError() */ +FSE_PUBLIC_API size_t FSE_compress_usingCTable (void* dst, size_t dstCapacity, const void* src, size_t srcSize, const FSE_CTable* ct); + +/*! +Tutorial : +---------- +The first step is to count all symbols. FSE_count() does this job very fast. +Result will be saved into 'count', a table of unsigned int, which must be already allocated, and have 'maxSymbolValuePtr[0]+1' cells. +'src' is a table of bytes of size 'srcSize'. All values within 'src' MUST be <= maxSymbolValuePtr[0] +maxSymbolValuePtr[0] will be updated, with its real value (necessarily <= original value) +FSE_count() will return the number of occurrence of the most frequent symbol. +This can be used to know if there is a single symbol within 'src', and to quickly evaluate its compressibility. +If there is an error, the function will return an ErrorCode (which can be tested using FSE_isError()). + +The next step is to normalize the frequencies. +FSE_normalizeCount() will ensure that sum of frequencies is == 2 ^'tableLog'. +It also guarantees a minimum of 1 to any Symbol with frequency >= 1. +You can use 'tableLog'==0 to mean "use default tableLog value". +If you are unsure of which tableLog value to use, you can ask FSE_optimalTableLog(), +which will provide the optimal valid tableLog given sourceSize, maxSymbolValue, and a user-defined maximum (0 means "default"). + +The result of FSE_normalizeCount() will be saved into a table, +called 'normalizedCounter', which is a table of signed short. +'normalizedCounter' must be already allocated, and have at least 'maxSymbolValue+1' cells. +The return value is tableLog if everything proceeded as expected. +It is 0 if there is a single symbol within distribution. +If there is an error (ex: invalid tableLog value), the function will return an ErrorCode (which can be tested using FSE_isError()). + +'normalizedCounter' can be saved in a compact manner to a memory area using FSE_writeNCount(). +'buffer' must be already allocated. +For guaranteed success, buffer size must be at least FSE_headerBound(). +The result of the function is the number of bytes written into 'buffer'. +If there is an error, the function will return an ErrorCode (which can be tested using FSE_isError(); ex : buffer size too small). + +'normalizedCounter' can then be used to create the compression table 'CTable'. +The space required by 'CTable' must be already allocated, using FSE_createCTable(). +You can then use FSE_buildCTable() to fill 'CTable'. +If there is an error, both functions will return an ErrorCode (which can be tested using FSE_isError()). + +'CTable' can then be used to compress 'src', with FSE_compress_usingCTable(). +Similar to FSE_count(), the convention is that 'src' is assumed to be a table of char of size 'srcSize' +The function returns the size of compressed data (without header), necessarily <= `dstCapacity`. +If it returns '0', compressed data could not fit into 'dst'. +If there is an error, the function will return an ErrorCode (which can be tested using FSE_isError()). +*/ + + +/* *** DECOMPRESSION *** */ + +/*! FSE_readNCount(): + Read compactly saved 'normalizedCounter' from 'rBuffer'. + @return : size read from 'rBuffer', + or an errorCode, which can be tested using FSE_isError(). + maxSymbolValuePtr[0] and tableLogPtr[0] will also be updated with their respective values */ +FSE_PUBLIC_API size_t FSE_readNCount (short* normalizedCounter, + unsigned* maxSymbolValuePtr, unsigned* tableLogPtr, + const void* rBuffer, size_t rBuffSize); + +/*! FSE_readNCount_bmi2(): + * Same as FSE_readNCount() but pass bmi2=1 when your CPU supports BMI2 and 0 otherwise. + */ +FSE_PUBLIC_API size_t FSE_readNCount_bmi2(short* normalizedCounter, + unsigned* maxSymbolValuePtr, unsigned* tableLogPtr, + const void* rBuffer, size_t rBuffSize, int bmi2); + +typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be more restrictive than void* */ + +/*! +Tutorial : +---------- +(Note : these functions only decompress FSE-compressed blocks. + If block is uncompressed, use memcpy() instead + If block is a single repeated byte, use memset() instead ) + +The first step is to obtain the normalized frequencies of symbols. +This can be performed by FSE_readNCount() if it was saved using FSE_writeNCount(). +'normalizedCounter' must be already allocated, and have at least 'maxSymbolValuePtr[0]+1' cells of signed short. +In practice, that means it's necessary to know 'maxSymbolValue' beforehand, +or size the table to handle worst case situations (typically 256). +FSE_readNCount() will provide 'tableLog' and 'maxSymbolValue'. +The result of FSE_readNCount() is the number of bytes read from 'rBuffer'. +Note that 'rBufferSize' must be at least 4 bytes, even if useful information is less than that. +If there is an error, the function will return an error code, which can be tested using FSE_isError(). + +The next step is to build the decompression tables 'FSE_DTable' from 'normalizedCounter'. +This is performed by the function FSE_buildDTable(). +The space required by 'FSE_DTable' must be already allocated using FSE_createDTable(). +If there is an error, the function will return an error code, which can be tested using FSE_isError(). + +`FSE_DTable` can then be used to decompress `cSrc`, with FSE_decompress_usingDTable(). +`cSrcSize` must be strictly correct, otherwise decompression will fail. +FSE_decompress_usingDTable() result will tell how many bytes were regenerated (<=`dstCapacity`). +If there is an error, the function will return an error code, which can be tested using FSE_isError(). (ex: dst buffer too small) +*/ + +#endif /* FSE_H */ + +#if defined(FSE_STATIC_LINKING_ONLY) && !defined(FSE_H_FSE_STATIC_LINKING_ONLY) +#define FSE_H_FSE_STATIC_LINKING_ONLY + +/* *** Dependency *** */ +/**** start inlining bitstream.h ****/ +/* ****************************************************************** + * bitstream + * Part of FSE library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ +#ifndef BITSTREAM_H_MODULE +#define BITSTREAM_H_MODULE + +#if defined (__cplusplus) +extern "C" { +#endif +/* +* This API consists of small unitary functions, which must be inlined for best performance. +* Since link-time-optimization is not available for all compilers, +* these functions are defined into a .h to be included. +*/ + +/*-**************************************** +* Dependencies +******************************************/ +/**** skipping file: mem.h ****/ +/**** skipping file: compiler.h ****/ +/**** skipping file: debug.h ****/ +/**** skipping file: error_private.h ****/ +/**** start inlining bits.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_BITS_H +#define ZSTD_BITS_H + +/**** skipping file: mem.h ****/ + +MEM_STATIC unsigned ZSTD_countTrailingZeros32_fallback(U32 val) +{ + assert(val != 0); + { + static const U32 DeBruijnBytePos[32] = {0, 1, 28, 2, 29, 14, 24, 3, + 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, + 26, 12, 18, 6, 11, 5, 10, 9}; + return DeBruijnBytePos[((U32) ((val & -(S32) val) * 0x077CB531U)) >> 27]; + } +} + +MEM_STATIC unsigned ZSTD_countTrailingZeros32(U32 val) +{ + assert(val != 0); +# if defined(_MSC_VER) +# if STATIC_BMI2 == 1 + return (unsigned)_tzcnt_u32(val); +# else + if (val != 0) { + unsigned long r; + _BitScanForward(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)__builtin_ctz(val); +# else + return ZSTD_countTrailingZeros32_fallback(val); +# endif +} + +MEM_STATIC unsigned ZSTD_countLeadingZeros32_fallback(U32 val) { + assert(val != 0); + { + static const U32 DeBruijnClz[32] = {0, 9, 1, 10, 13, 21, 2, 29, + 11, 14, 16, 18, 22, 25, 3, 30, + 8, 12, 20, 28, 15, 17, 24, 7, + 19, 27, 23, 6, 26, 5, 4, 31}; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + return 31 - DeBruijnClz[(val * 0x07C4ACDDU) >> 27]; + } +} + +MEM_STATIC unsigned ZSTD_countLeadingZeros32(U32 val) +{ + assert(val != 0); +# if defined(_MSC_VER) +# if STATIC_BMI2 == 1 + return (unsigned)_lzcnt_u32(val); +# else + if (val != 0) { + unsigned long r; + _BitScanReverse(&r, val); + return (unsigned)(31 - r); + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)__builtin_clz(val); +# else + return ZSTD_countLeadingZeros32_fallback(val); +# endif +} + +MEM_STATIC unsigned ZSTD_countTrailingZeros64(U64 val) +{ + assert(val != 0); +# if defined(_MSC_VER) && defined(_WIN64) +# if STATIC_BMI2 == 1 + return (unsigned)_tzcnt_u64(val); +# else + if (val != 0) { + unsigned long r; + _BitScanForward64(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) && defined(__LP64__) + return (unsigned)__builtin_ctzll(val); +# else + { + U32 mostSignificantWord = (U32)(val >> 32); + U32 leastSignificantWord = (U32)val; + if (leastSignificantWord == 0) { + return 32 + ZSTD_countTrailingZeros32(mostSignificantWord); + } else { + return ZSTD_countTrailingZeros32(leastSignificantWord); + } + } +# endif +} + +MEM_STATIC unsigned ZSTD_countLeadingZeros64(U64 val) +{ + assert(val != 0); +# if defined(_MSC_VER) && defined(_WIN64) +# if STATIC_BMI2 == 1 + return (unsigned)_lzcnt_u64(val); +# else + if (val != 0) { + unsigned long r; + _BitScanReverse64(&r, val); + return (unsigned)(63 - r); + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)(__builtin_clzll(val)); +# else + { + U32 mostSignificantWord = (U32)(val >> 32); + U32 leastSignificantWord = (U32)val; + if (mostSignificantWord == 0) { + return 32 + ZSTD_countLeadingZeros32(leastSignificantWord); + } else { + return ZSTD_countLeadingZeros32(mostSignificantWord); + } + } +# endif +} + +MEM_STATIC unsigned ZSTD_NbCommonBytes(size_t val) +{ + if (MEM_isLittleEndian()) { + if (MEM_64bits()) { + return ZSTD_countTrailingZeros64((U64)val) >> 3; + } else { + return ZSTD_countTrailingZeros32((U32)val) >> 3; + } + } else { /* Big Endian CPU */ + if (MEM_64bits()) { + return ZSTD_countLeadingZeros64((U64)val) >> 3; + } else { + return ZSTD_countLeadingZeros32((U32)val) >> 3; + } + } +} + +MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */ +{ + assert(val != 0); + return 31 - ZSTD_countLeadingZeros32(val); +} + +/* ZSTD_rotateRight_*(): + * Rotates a bitfield to the right by "count" bits. + * https://en.wikipedia.org/w/index.php?title=Circular_shift&oldid=991635599#Implementing_circular_shifts + */ +MEM_STATIC +U64 ZSTD_rotateRight_U64(U64 const value, U32 count) { + assert(count < 64); + count &= 0x3F; /* for fickle pattern recognition */ + return (value >> count) | (U64)(value << ((0U - count) & 0x3F)); +} + +MEM_STATIC +U32 ZSTD_rotateRight_U32(U32 const value, U32 count) { + assert(count < 32); + count &= 0x1F; /* for fickle pattern recognition */ + return (value >> count) | (U32)(value << ((0U - count) & 0x1F)); +} + +MEM_STATIC +U16 ZSTD_rotateRight_U16(U16 const value, U32 count) { + assert(count < 16); + count &= 0x0F; /* for fickle pattern recognition */ + return (value >> count) | (U16)(value << ((0U - count) & 0x0F)); +} + +#endif /* ZSTD_BITS_H */ +/**** ended inlining bits.h ****/ + + +/*========================================= +* Target specific +=========================================*/ +#ifndef ZSTD_NO_INTRINSICS +# if (defined(__BMI__) || defined(__BMI2__)) && defined(__GNUC__) +# include /* support for bextr (experimental)/bzhi */ +# elif defined(__ICCARM__) +# include +# endif +#endif + +#define STREAM_ACCUMULATOR_MIN_32 25 +#define STREAM_ACCUMULATOR_MIN_64 57 +#define STREAM_ACCUMULATOR_MIN ((U32)(MEM_32bits() ? STREAM_ACCUMULATOR_MIN_32 : STREAM_ACCUMULATOR_MIN_64)) + + +/*-****************************************** +* bitStream encoding API (write forward) +********************************************/ +/* bitStream can mix input from multiple sources. + * A critical property of these streams is that they encode and decode in **reverse** direction. + * So the first bit sequence you add will be the last to be read, like a LIFO stack. + */ +typedef struct { + size_t bitContainer; + unsigned bitPos; + char* startPtr; + char* ptr; + char* endPtr; +} BIT_CStream_t; + +MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC, void* dstBuffer, size_t dstCapacity); +MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, size_t value, unsigned nbBits); +MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC); +MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC); + +/* Start with initCStream, providing the size of buffer to write into. +* bitStream will never write outside of this buffer. +* `dstCapacity` must be >= sizeof(bitD->bitContainer), otherwise @return will be an error code. +* +* bits are first added to a local register. +* Local register is size_t, hence 64-bits on 64-bits systems, or 32-bits on 32-bits systems. +* Writing data into memory is an explicit operation, performed by the flushBits function. +* Hence keep track how many bits are potentially stored into local register to avoid register overflow. +* After a flushBits, a maximum of 7 bits might still be stored into local register. +* +* Avoid storing elements of more than 24 bits if you want compatibility with 32-bits bitstream readers. +* +* Last operation is to close the bitStream. +* The function returns the final size of CStream in bytes. +* If data couldn't fit into `dstBuffer`, it will return a 0 ( == not storable) +*/ + + +/*-******************************************** +* bitStream decoding API (read backward) +**********************************************/ +typedef struct { + size_t bitContainer; + unsigned bitsConsumed; + const char* ptr; + const char* start; + const char* limitPtr; +} BIT_DStream_t; + +typedef enum { BIT_DStream_unfinished = 0, + BIT_DStream_endOfBuffer = 1, + BIT_DStream_completed = 2, + BIT_DStream_overflow = 3 } BIT_DStream_status; /* result of BIT_reloadDStream() */ + /* 1,2,4,8 would be better for bitmap combinations, but slows down performance a bit ... :( */ + +MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize); +MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits); +MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD); +MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD); + + +/* Start by invoking BIT_initDStream(). +* A chunk of the bitStream is then stored into a local register. +* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t). +* You can then retrieve bitFields stored into the local register, **in reverse order**. +* Local register is explicitly reloaded from memory by the BIT_reloadDStream() method. +* A reload guarantee a minimum of ((8*sizeof(bitD->bitContainer))-7) bits when its result is BIT_DStream_unfinished. +* Otherwise, it can be less than that, so proceed accordingly. +* Checking if DStream has reached its end can be performed with BIT_endOfDStream(). +*/ + + +/*-**************************************** +* unsafe API +******************************************/ +MEM_STATIC void BIT_addBitsFast(BIT_CStream_t* bitC, size_t value, unsigned nbBits); +/* faster, but works only if value is "clean", meaning all high bits above nbBits are 0 */ + +MEM_STATIC void BIT_flushBitsFast(BIT_CStream_t* bitC); +/* unsafe version; does not check buffer overflow */ + +MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits); +/* faster, but works only if nbBits >= 1 */ + +/*===== Local Constants =====*/ +static const unsigned BIT_mask[] = { + 0, 1, 3, 7, 0xF, 0x1F, + 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, + 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF, + 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, + 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF, 0x1FFFFFFF, + 0x3FFFFFFF, 0x7FFFFFFF}; /* up to 31 bits */ +#define BIT_MASK_SIZE (sizeof(BIT_mask) / sizeof(BIT_mask[0])) + +/*-************************************************************** +* bitStream encoding +****************************************************************/ +/*! BIT_initCStream() : + * `dstCapacity` must be > sizeof(size_t) + * @return : 0 if success, + * otherwise an error code (can be tested using ERR_isError()) */ +MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC, + void* startPtr, size_t dstCapacity) +{ + bitC->bitContainer = 0; + bitC->bitPos = 0; + bitC->startPtr = (char*)startPtr; + bitC->ptr = bitC->startPtr; + bitC->endPtr = bitC->startPtr + dstCapacity - sizeof(bitC->bitContainer); + if (dstCapacity <= sizeof(bitC->bitContainer)) return ERROR(dstSize_tooSmall); + return 0; +} + +MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits) +{ +#if defined(STATIC_BMI2) && STATIC_BMI2 == 1 && !defined(ZSTD_NO_INTRINSICS) + return _bzhi_u64(bitContainer, nbBits); +#else + assert(nbBits < BIT_MASK_SIZE); + return bitContainer & BIT_mask[nbBits]; +#endif +} + +/*! BIT_addBits() : + * can add up to 31 bits into `bitC`. + * Note : does not check for register overflow ! */ +MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, + size_t value, unsigned nbBits) +{ + DEBUG_STATIC_ASSERT(BIT_MASK_SIZE == 32); + assert(nbBits < BIT_MASK_SIZE); + assert(nbBits + bitC->bitPos < sizeof(bitC->bitContainer) * 8); + bitC->bitContainer |= BIT_getLowerBits(value, nbBits) << bitC->bitPos; + bitC->bitPos += nbBits; +} + +/*! BIT_addBitsFast() : + * works only if `value` is _clean_, + * meaning all high bits above nbBits are 0 */ +MEM_STATIC void BIT_addBitsFast(BIT_CStream_t* bitC, + size_t value, unsigned nbBits) +{ + assert((value>>nbBits) == 0); + assert(nbBits + bitC->bitPos < sizeof(bitC->bitContainer) * 8); + bitC->bitContainer |= value << bitC->bitPos; + bitC->bitPos += nbBits; +} + +/*! BIT_flushBitsFast() : + * assumption : bitContainer has not overflowed + * unsafe version; does not check buffer overflow */ +MEM_STATIC void BIT_flushBitsFast(BIT_CStream_t* bitC) +{ + size_t const nbBytes = bitC->bitPos >> 3; + assert(bitC->bitPos < sizeof(bitC->bitContainer) * 8); + assert(bitC->ptr <= bitC->endPtr); + MEM_writeLEST(bitC->ptr, bitC->bitContainer); + bitC->ptr += nbBytes; + bitC->bitPos &= 7; + bitC->bitContainer >>= nbBytes*8; +} + +/*! BIT_flushBits() : + * assumption : bitContainer has not overflowed + * safe version; check for buffer overflow, and prevents it. + * note : does not signal buffer overflow. + * overflow will be revealed later on using BIT_closeCStream() */ +MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC) +{ + size_t const nbBytes = bitC->bitPos >> 3; + assert(bitC->bitPos < sizeof(bitC->bitContainer) * 8); + assert(bitC->ptr <= bitC->endPtr); + MEM_writeLEST(bitC->ptr, bitC->bitContainer); + bitC->ptr += nbBytes; + if (bitC->ptr > bitC->endPtr) bitC->ptr = bitC->endPtr; + bitC->bitPos &= 7; + bitC->bitContainer >>= nbBytes*8; +} + +/*! BIT_closeCStream() : + * @return : size of CStream, in bytes, + * or 0 if it could not fit into dstBuffer */ +MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC) +{ + BIT_addBitsFast(bitC, 1, 1); /* endMark */ + BIT_flushBits(bitC); + if (bitC->ptr >= bitC->endPtr) return 0; /* overflow detected */ + return (bitC->ptr - bitC->startPtr) + (bitC->bitPos > 0); +} + + +/*-******************************************************** +* bitStream decoding +**********************************************************/ +/*! BIT_initDStream() : + * Initialize a BIT_DStream_t. + * `bitD` : a pointer to an already allocated BIT_DStream_t structure. + * `srcSize` must be the *exact* size of the bitStream, in bytes. + * @return : size of stream (== srcSize), or an errorCode if a problem is detected + */ +MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize) +{ + if (srcSize < 1) { ZSTD_memset(bitD, 0, sizeof(*bitD)); return ERROR(srcSize_wrong); } + + bitD->start = (const char*)srcBuffer; + bitD->limitPtr = bitD->start + sizeof(bitD->bitContainer); + + if (srcSize >= sizeof(bitD->bitContainer)) { /* normal case */ + bitD->ptr = (const char*)srcBuffer + srcSize - sizeof(bitD->bitContainer); + bitD->bitContainer = MEM_readLEST(bitD->ptr); + { BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1]; + bitD->bitsConsumed = lastByte ? 8 - ZSTD_highbit32(lastByte) : 0; /* ensures bitsConsumed is always set */ + if (lastByte == 0) return ERROR(GENERIC); /* endMark not present */ } + } else { + bitD->ptr = bitD->start; + bitD->bitContainer = *(const BYTE*)(bitD->start); + switch(srcSize) + { + case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16); + ZSTD_FALLTHROUGH; + + case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24); + ZSTD_FALLTHROUGH; + + case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32); + ZSTD_FALLTHROUGH; + + case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24; + ZSTD_FALLTHROUGH; + + case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16; + ZSTD_FALLTHROUGH; + + case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8; + ZSTD_FALLTHROUGH; + + default: break; + } + { BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1]; + bitD->bitsConsumed = lastByte ? 8 - ZSTD_highbit32(lastByte) : 0; + if (lastByte == 0) return ERROR(corruption_detected); /* endMark not present */ + } + bitD->bitsConsumed += (U32)(sizeof(bitD->bitContainer) - srcSize)*8; + } + + return srcSize; +} + +MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getUpperBits(size_t bitContainer, U32 const start) +{ + return bitContainer >> start; +} + +MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getMiddleBits(size_t bitContainer, U32 const start, U32 const nbBits) +{ + U32 const regMask = sizeof(bitContainer)*8 - 1; + /* if start > regMask, bitstream is corrupted, and result is undefined */ + assert(nbBits < BIT_MASK_SIZE); + /* x86 transform & ((1 << nbBits) - 1) to bzhi instruction, it is better + * than accessing memory. When bmi2 instruction is not present, we consider + * such cpus old (pre-Haswell, 2013) and their performance is not of that + * importance. + */ +#if defined(__x86_64__) || defined(_M_X86) + return (bitContainer >> (start & regMask)) & ((((U64)1) << nbBits) - 1); +#else + return (bitContainer >> (start & regMask)) & BIT_mask[nbBits]; +#endif +} + +/*! BIT_lookBits() : + * Provides next n bits from local register. + * local register is not modified. + * On 32-bits, maxNbBits==24. + * On 64-bits, maxNbBits==56. + * @return : value extracted */ +MEM_STATIC FORCE_INLINE_ATTR size_t BIT_lookBits(const BIT_DStream_t* bitD, U32 nbBits) +{ + /* arbitrate between double-shift and shift+mask */ +#if 1 + /* if bitD->bitsConsumed + nbBits > sizeof(bitD->bitContainer)*8, + * bitstream is likely corrupted, and result is undefined */ + return BIT_getMiddleBits(bitD->bitContainer, (sizeof(bitD->bitContainer)*8) - bitD->bitsConsumed - nbBits, nbBits); +#else + /* this code path is slower on my os-x laptop */ + U32 const regMask = sizeof(bitD->bitContainer)*8 - 1; + return ((bitD->bitContainer << (bitD->bitsConsumed & regMask)) >> 1) >> ((regMask-nbBits) & regMask); +#endif +} + +/*! BIT_lookBitsFast() : + * unsafe version; only works if nbBits >= 1 */ +MEM_STATIC size_t BIT_lookBitsFast(const BIT_DStream_t* bitD, U32 nbBits) +{ + U32 const regMask = sizeof(bitD->bitContainer)*8 - 1; + assert(nbBits >= 1); + return (bitD->bitContainer << (bitD->bitsConsumed & regMask)) >> (((regMask+1)-nbBits) & regMask); +} + +MEM_STATIC FORCE_INLINE_ATTR void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits) +{ + bitD->bitsConsumed += nbBits; +} + +/*! BIT_readBits() : + * Read (consume) next n bits from local register and update. + * Pay attention to not read more than nbBits contained into local register. + * @return : extracted value. */ +MEM_STATIC FORCE_INLINE_ATTR size_t BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits) +{ + size_t const value = BIT_lookBits(bitD, nbBits); + BIT_skipBits(bitD, nbBits); + return value; +} + +/*! BIT_readBitsFast() : + * unsafe version; only works if nbBits >= 1 */ +MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits) +{ + size_t const value = BIT_lookBitsFast(bitD, nbBits); + assert(nbBits >= 1); + BIT_skipBits(bitD, nbBits); + return value; +} + +/*! BIT_reloadDStreamFast() : + * Similar to BIT_reloadDStream(), but with two differences: + * 1. bitsConsumed <= sizeof(bitD->bitContainer)*8 must hold! + * 2. Returns BIT_DStream_overflow when bitD->ptr < bitD->limitPtr, at this + * point you must use BIT_reloadDStream() to reload. + */ +MEM_STATIC BIT_DStream_status BIT_reloadDStreamFast(BIT_DStream_t* bitD) +{ + if (UNLIKELY(bitD->ptr < bitD->limitPtr)) + return BIT_DStream_overflow; + assert(bitD->bitsConsumed <= sizeof(bitD->bitContainer)*8); + bitD->ptr -= bitD->bitsConsumed >> 3; + bitD->bitsConsumed &= 7; + bitD->bitContainer = MEM_readLEST(bitD->ptr); + return BIT_DStream_unfinished; +} + +/*! BIT_reloadDStream() : + * Refill `bitD` from buffer previously set in BIT_initDStream() . + * This function is safe, it guarantees it will not read beyond src buffer. + * @return : status of `BIT_DStream_t` internal register. + * when status == BIT_DStream_unfinished, internal register is filled with at least 25 or 57 bits */ +MEM_STATIC FORCE_INLINE_ATTR BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD) +{ + if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* overflow detected, like end of stream */ + return BIT_DStream_overflow; + + if (bitD->ptr >= bitD->limitPtr) { + return BIT_reloadDStreamFast(bitD); + } + if (bitD->ptr == bitD->start) { + if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return BIT_DStream_endOfBuffer; + return BIT_DStream_completed; + } + /* start < ptr < limitPtr */ + { U32 nbBytes = bitD->bitsConsumed >> 3; + BIT_DStream_status result = BIT_DStream_unfinished; + if (bitD->ptr - nbBytes < bitD->start) { + nbBytes = (U32)(bitD->ptr - bitD->start); /* ptr > start */ + result = BIT_DStream_endOfBuffer; + } + bitD->ptr -= nbBytes; + bitD->bitsConsumed -= nbBytes*8; + bitD->bitContainer = MEM_readLEST(bitD->ptr); /* reminder : srcSize > sizeof(bitD->bitContainer), otherwise bitD->ptr == bitD->start */ + return result; + } +} + +/*! BIT_endOfDStream() : + * @return : 1 if DStream has _exactly_ reached its end (all bits consumed). + */ +MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream) +{ + return ((DStream->ptr == DStream->start) && (DStream->bitsConsumed == sizeof(DStream->bitContainer)*8)); +} + +#if defined (__cplusplus) +} +#endif + +#endif /* BITSTREAM_H_MODULE */ +/**** ended inlining bitstream.h ****/ + + +/* ***************************************** +* Static allocation +*******************************************/ +/* FSE buffer bounds */ +#define FSE_NCOUNTBOUND 512 +#define FSE_BLOCKBOUND(size) ((size) + ((size)>>7) + 4 /* fse states */ + sizeof(size_t) /* bitContainer */) +#define FSE_COMPRESSBOUND(size) (FSE_NCOUNTBOUND + FSE_BLOCKBOUND(size)) /* Macro version, useful for static allocation */ + +/* It is possible to statically allocate FSE CTable/DTable as a table of FSE_CTable/FSE_DTable using below macros */ +#define FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) (1 + (1<<((maxTableLog)-1)) + (((maxSymbolValue)+1)*2)) +#define FSE_DTABLE_SIZE_U32(maxTableLog) (1 + (1<<(maxTableLog))) + +/* or use the size to malloc() space directly. Pay attention to alignment restrictions though */ +#define FSE_CTABLE_SIZE(maxTableLog, maxSymbolValue) (FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(FSE_CTable)) +#define FSE_DTABLE_SIZE(maxTableLog) (FSE_DTABLE_SIZE_U32(maxTableLog) * sizeof(FSE_DTable)) + + +/* ***************************************** + * FSE advanced API + ***************************************** */ + +unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus); +/**< same as FSE_optimalTableLog(), which used `minus==2` */ + +size_t FSE_buildCTable_rle (FSE_CTable* ct, unsigned char symbolValue); +/**< build a fake FSE_CTable, designed to compress always the same symbolValue */ + +/* FSE_buildCTable_wksp() : + * Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`). + * `wkspSize` must be >= `FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog)` of `unsigned`. + * See FSE_buildCTable_wksp() for breakdown of workspace usage. + */ +#define FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog) (((maxSymbolValue + 2) + (1ull << (tableLog)))/2 + sizeof(U64)/sizeof(U32) /* additional 8 bytes for potential table overwrite */) +#define FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) (sizeof(unsigned) * FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog)) +size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); + +#define FSE_BUILD_DTABLE_WKSP_SIZE(maxTableLog, maxSymbolValue) (sizeof(short) * (maxSymbolValue + 1) + (1ULL << maxTableLog) + 8) +#define FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) ((FSE_BUILD_DTABLE_WKSP_SIZE(maxTableLog, maxSymbolValue) + sizeof(unsigned) - 1) / sizeof(unsigned)) +FSE_PUBLIC_API size_t FSE_buildDTable_wksp(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); +/**< Same as FSE_buildDTable(), using an externally allocated `workspace` produced with `FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxSymbolValue)` */ + +#define FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) (FSE_DTABLE_SIZE_U32(maxTableLog) + 1 + FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) + (FSE_MAX_SYMBOL_VALUE + 1) / 2 + 1) +#define FSE_DECOMPRESS_WKSP_SIZE(maxTableLog, maxSymbolValue) (FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(unsigned)) +size_t FSE_decompress_wksp_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize, int bmi2); +/**< same as FSE_decompress(), using an externally allocated `workSpace` produced with `FSE_DECOMPRESS_WKSP_SIZE_U32(maxLog, maxSymbolValue)`. + * Set bmi2 to 1 if your CPU supports BMI2 or 0 if it doesn't */ + +typedef enum { + FSE_repeat_none, /**< Cannot use the previous table */ + FSE_repeat_check, /**< Can use the previous table but it must be checked */ + FSE_repeat_valid /**< Can use the previous table and it is assumed to be valid */ + } FSE_repeat; + +/* ***************************************** +* FSE symbol compression API +*******************************************/ +/*! + This API consists of small unitary functions, which highly benefit from being inlined. + Hence their body are included in next section. +*/ +typedef struct { + ptrdiff_t value; + const void* stateTable; + const void* symbolTT; + unsigned stateLog; +} FSE_CState_t; + +static void FSE_initCState(FSE_CState_t* CStatePtr, const FSE_CTable* ct); + +static void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* CStatePtr, unsigned symbol); + +static void FSE_flushCState(BIT_CStream_t* bitC, const FSE_CState_t* CStatePtr); + +/**< +These functions are inner components of FSE_compress_usingCTable(). +They allow the creation of custom streams, mixing multiple tables and bit sources. + +A key property to keep in mind is that encoding and decoding are done **in reverse direction**. +So the first symbol you will encode is the last you will decode, like a LIFO stack. + +You will need a few variables to track your CStream. They are : + +FSE_CTable ct; // Provided by FSE_buildCTable() +BIT_CStream_t bitStream; // bitStream tracking structure +FSE_CState_t state; // State tracking structure (can have several) + + +The first thing to do is to init bitStream and state. + size_t errorCode = BIT_initCStream(&bitStream, dstBuffer, maxDstSize); + FSE_initCState(&state, ct); + +Note that BIT_initCStream() can produce an error code, so its result should be tested, using FSE_isError(); +You can then encode your input data, byte after byte. +FSE_encodeSymbol() outputs a maximum of 'tableLog' bits at a time. +Remember decoding will be done in reverse direction. + FSE_encodeByte(&bitStream, &state, symbol); + +At any time, you can also add any bit sequence. +Note : maximum allowed nbBits is 25, for compatibility with 32-bits decoders + BIT_addBits(&bitStream, bitField, nbBits); + +The above methods don't commit data to memory, they just store it into local register, for speed. +Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t). +Writing data to memory is a manual operation, performed by the flushBits function. + BIT_flushBits(&bitStream); + +Your last FSE encoding operation shall be to flush your last state value(s). + FSE_flushState(&bitStream, &state); + +Finally, you must close the bitStream. +The function returns the size of CStream in bytes. +If data couldn't fit into dstBuffer, it will return a 0 ( == not compressible) +If there is an error, it returns an errorCode (which can be tested using FSE_isError()). + size_t size = BIT_closeCStream(&bitStream); +*/ + + +/* ***************************************** +* FSE symbol decompression API +*******************************************/ +typedef struct { + size_t state; + const void* table; /* precise table may vary, depending on U16 */ +} FSE_DState_t; + + +static void FSE_initDState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD, const FSE_DTable* dt); + +static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD); + +static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr); + +/**< +Let's now decompose FSE_decompress_usingDTable() into its unitary components. +You will decode FSE-encoded symbols from the bitStream, +and also any other bitFields you put in, **in reverse order**. + +You will need a few variables to track your bitStream. They are : + +BIT_DStream_t DStream; // Stream context +FSE_DState_t DState; // State context. Multiple ones are possible +FSE_DTable* DTablePtr; // Decoding table, provided by FSE_buildDTable() + +The first thing to do is to init the bitStream. + errorCode = BIT_initDStream(&DStream, srcBuffer, srcSize); + +You should then retrieve your initial state(s) +(in reverse flushing order if you have several ones) : + errorCode = FSE_initDState(&DState, &DStream, DTablePtr); + +You can then decode your data, symbol after symbol. +For information the maximum number of bits read by FSE_decodeSymbol() is 'tableLog'. +Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out). + unsigned char symbol = FSE_decodeSymbol(&DState, &DStream); + +You can retrieve any bitfield you eventually stored into the bitStream (in reverse order) +Note : maximum allowed nbBits is 25, for 32-bits compatibility + size_t bitField = BIT_readBits(&DStream, nbBits); + +All above operations only read from local register (which size depends on size_t). +Refueling the register from memory is manually performed by the reload method. + endSignal = FSE_reloadDStream(&DStream); + +BIT_reloadDStream() result tells if there is still some more data to read from DStream. +BIT_DStream_unfinished : there is still some data left into the DStream. +BIT_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled. +BIT_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed. +BIT_DStream_tooFar : Dstream went too far. Decompression result is corrupted. + +When reaching end of buffer (BIT_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop, +to properly detect the exact end of stream. +After each decoded symbol, check if DStream is fully consumed using this simple test : + BIT_reloadDStream(&DStream) >= BIT_DStream_completed + +When it's done, verify decompression is fully completed, by checking both DStream and the relevant states. +Checking if DStream has reached its end is performed by : + BIT_endOfDStream(&DStream); +Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible. + FSE_endOfDState(&DState); +*/ + + +/* ***************************************** +* FSE unsafe API +*******************************************/ +static unsigned char FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD); +/* faster, but works only if nbBits is always >= 1 (otherwise, result will be corrupted) */ + + +/* ***************************************** +* Implementation of inlined functions +*******************************************/ +typedef struct { + int deltaFindState; + U32 deltaNbBits; +} FSE_symbolCompressionTransform; /* total 8 bytes */ + +MEM_STATIC void FSE_initCState(FSE_CState_t* statePtr, const FSE_CTable* ct) +{ + const void* ptr = ct; + const U16* u16ptr = (const U16*) ptr; + const U32 tableLog = MEM_read16(ptr); + statePtr->value = (ptrdiff_t)1<stateTable = u16ptr+2; + statePtr->symbolTT = ct + 1 + (tableLog ? (1<<(tableLog-1)) : 1); + statePtr->stateLog = tableLog; +} + + +/*! FSE_initCState2() : +* Same as FSE_initCState(), but the first symbol to include (which will be the last to be read) +* uses the smallest state value possible, saving the cost of this symbol */ +MEM_STATIC void FSE_initCState2(FSE_CState_t* statePtr, const FSE_CTable* ct, U32 symbol) +{ + FSE_initCState(statePtr, ct); + { const FSE_symbolCompressionTransform symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol]; + const U16* stateTable = (const U16*)(statePtr->stateTable); + U32 nbBitsOut = (U32)((symbolTT.deltaNbBits + (1<<15)) >> 16); + statePtr->value = (nbBitsOut << 16) - symbolTT.deltaNbBits; + statePtr->value = stateTable[(statePtr->value >> nbBitsOut) + symbolTT.deltaFindState]; + } +} + +MEM_STATIC void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* statePtr, unsigned symbol) +{ + FSE_symbolCompressionTransform const symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol]; + const U16* const stateTable = (const U16*)(statePtr->stateTable); + U32 const nbBitsOut = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16); + BIT_addBits(bitC, statePtr->value, nbBitsOut); + statePtr->value = stateTable[ (statePtr->value >> nbBitsOut) + symbolTT.deltaFindState]; +} + +MEM_STATIC void FSE_flushCState(BIT_CStream_t* bitC, const FSE_CState_t* statePtr) +{ + BIT_addBits(bitC, statePtr->value, statePtr->stateLog); + BIT_flushBits(bitC); +} + + +/* FSE_getMaxNbBits() : + * Approximate maximum cost of a symbol, in bits. + * Fractional get rounded up (i.e. a symbol with a normalized frequency of 3 gives the same result as a frequency of 2) + * note 1 : assume symbolValue is valid (<= maxSymbolValue) + * note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */ +MEM_STATIC U32 FSE_getMaxNbBits(const void* symbolTTPtr, U32 symbolValue) +{ + const FSE_symbolCompressionTransform* symbolTT = (const FSE_symbolCompressionTransform*) symbolTTPtr; + return (symbolTT[symbolValue].deltaNbBits + ((1<<16)-1)) >> 16; +} + +/* FSE_bitCost() : + * Approximate symbol cost, as fractional value, using fixed-point format (accuracyLog fractional bits) + * note 1 : assume symbolValue is valid (<= maxSymbolValue) + * note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */ +MEM_STATIC U32 FSE_bitCost(const void* symbolTTPtr, U32 tableLog, U32 symbolValue, U32 accuracyLog) +{ + const FSE_symbolCompressionTransform* symbolTT = (const FSE_symbolCompressionTransform*) symbolTTPtr; + U32 const minNbBits = symbolTT[symbolValue].deltaNbBits >> 16; + U32 const threshold = (minNbBits+1) << 16; + assert(tableLog < 16); + assert(accuracyLog < 31-tableLog); /* ensure enough room for renormalization double shift */ + { U32 const tableSize = 1 << tableLog; + U32 const deltaFromThreshold = threshold - (symbolTT[symbolValue].deltaNbBits + tableSize); + U32 const normalizedDeltaFromThreshold = (deltaFromThreshold << accuracyLog) >> tableLog; /* linear interpolation (very approximate) */ + U32 const bitMultiplier = 1 << accuracyLog; + assert(symbolTT[symbolValue].deltaNbBits + tableSize <= threshold); + assert(normalizedDeltaFromThreshold <= bitMultiplier); + return (minNbBits+1)*bitMultiplier - normalizedDeltaFromThreshold; + } +} + + +/* ====== Decompression ====== */ + +typedef struct { + U16 tableLog; + U16 fastMode; +} FSE_DTableHeader; /* sizeof U32 */ + +typedef struct +{ + unsigned short newState; + unsigned char symbol; + unsigned char nbBits; +} FSE_decode_t; /* size == U32 */ + +MEM_STATIC void FSE_initDState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD, const FSE_DTable* dt) +{ + const void* ptr = dt; + const FSE_DTableHeader* const DTableH = (const FSE_DTableHeader*)ptr; + DStatePtr->state = BIT_readBits(bitD, DTableH->tableLog); + BIT_reloadDStream(bitD); + DStatePtr->table = dt + 1; +} + +MEM_STATIC BYTE FSE_peekSymbol(const FSE_DState_t* DStatePtr) +{ + FSE_decode_t const DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state]; + return DInfo.symbol; +} + +MEM_STATIC void FSE_updateState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD) +{ + FSE_decode_t const DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state]; + U32 const nbBits = DInfo.nbBits; + size_t const lowBits = BIT_readBits(bitD, nbBits); + DStatePtr->state = DInfo.newState + lowBits; +} + +MEM_STATIC BYTE FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD) +{ + FSE_decode_t const DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state]; + U32 const nbBits = DInfo.nbBits; + BYTE const symbol = DInfo.symbol; + size_t const lowBits = BIT_readBits(bitD, nbBits); + + DStatePtr->state = DInfo.newState + lowBits; + return symbol; +} + +/*! FSE_decodeSymbolFast() : + unsafe, only works if no symbol has a probability > 50% */ +MEM_STATIC BYTE FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD) +{ + FSE_decode_t const DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state]; + U32 const nbBits = DInfo.nbBits; + BYTE const symbol = DInfo.symbol; + size_t const lowBits = BIT_readBitsFast(bitD, nbBits); + + DStatePtr->state = DInfo.newState + lowBits; + return symbol; +} + +MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr) +{ + return DStatePtr->state == 0; +} + + + +#ifndef FSE_COMMONDEFS_ONLY + +/* ************************************************************** +* Tuning parameters +****************************************************************/ +/*!MEMORY_USAGE : +* Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.) +* Increasing memory usage improves compression ratio +* Reduced memory usage can improve speed, due to cache effect +* Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */ +#ifndef FSE_MAX_MEMORY_USAGE +# define FSE_MAX_MEMORY_USAGE 14 +#endif +#ifndef FSE_DEFAULT_MEMORY_USAGE +# define FSE_DEFAULT_MEMORY_USAGE 13 +#endif +#if (FSE_DEFAULT_MEMORY_USAGE > FSE_MAX_MEMORY_USAGE) +# error "FSE_DEFAULT_MEMORY_USAGE must be <= FSE_MAX_MEMORY_USAGE" +#endif + +/*!FSE_MAX_SYMBOL_VALUE : +* Maximum symbol value authorized. +* Required for proper stack allocation */ +#ifndef FSE_MAX_SYMBOL_VALUE +# define FSE_MAX_SYMBOL_VALUE 255 +#endif + +/* ************************************************************** +* template functions type & suffix +****************************************************************/ +#define FSE_FUNCTION_TYPE BYTE +#define FSE_FUNCTION_EXTENSION +#define FSE_DECODE_TYPE FSE_decode_t + + +#endif /* !FSE_COMMONDEFS_ONLY */ + + +/* *************************************************************** +* Constants +*****************************************************************/ +#define FSE_MAX_TABLELOG (FSE_MAX_MEMORY_USAGE-2) +#define FSE_MAX_TABLESIZE (1U< FSE_TABLELOG_ABSOLUTE_MAX +# error "FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX is not supported" +#endif + +#define FSE_TABLESTEP(tableSize) (((tableSize)>>1) + ((tableSize)>>3) + 3) + + +#endif /* FSE_STATIC_LINKING_ONLY */ + + +#if defined (__cplusplus) +} +#endif +/**** ended inlining fse.h ****/ +/**** start inlining huf.h ****/ +/* ****************************************************************** + * huff0 huffman codec, + * part of Finite State Entropy library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef HUF_H_298734234 +#define HUF_H_298734234 + +/* *** Dependencies *** */ +/**** skipping file: zstd_deps.h ****/ +/**** skipping file: mem.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: fse.h ****/ + + +/* *** Tool functions *** */ +#define HUF_BLOCKSIZE_MAX (128 * 1024) /**< maximum input size for a single block compressed with HUF_compress */ +size_t HUF_compressBound(size_t size); /**< maximum compressed size (worst case) */ + +/* Error Management */ +unsigned HUF_isError(size_t code); /**< tells if a return value is an error code */ +const char* HUF_getErrorName(size_t code); /**< provides error code string (useful for debugging) */ + + +#define HUF_WORKSPACE_SIZE ((8 << 10) + 512 /* sorting scratch space */) +#define HUF_WORKSPACE_SIZE_U64 (HUF_WORKSPACE_SIZE / sizeof(U64)) + +/* *** Constants *** */ +#define HUF_TABLELOG_MAX 12 /* max runtime value of tableLog (due to static allocation); can be modified up to HUF_TABLELOG_ABSOLUTEMAX */ +#define HUF_TABLELOG_DEFAULT 11 /* default tableLog value when none specified */ +#define HUF_SYMBOLVALUE_MAX 255 + +#define HUF_TABLELOG_ABSOLUTEMAX 12 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */ +#if (HUF_TABLELOG_MAX > HUF_TABLELOG_ABSOLUTEMAX) +# error "HUF_TABLELOG_MAX is too large !" +#endif + + +/* **************************************** +* Static allocation +******************************************/ +/* HUF buffer bounds */ +#define HUF_CTABLEBOUND 129 +#define HUF_BLOCKBOUND(size) (size + (size>>8) + 8) /* only true when incompressible is pre-filtered with fast heuristic */ +#define HUF_COMPRESSBOUND(size) (HUF_CTABLEBOUND + HUF_BLOCKBOUND(size)) /* Macro version, useful for static allocation */ + +/* static allocation of HUF's Compression Table */ +/* this is a private definition, just exposed for allocation and strict aliasing purpose. never EVER access its members directly */ +typedef size_t HUF_CElt; /* consider it an incomplete type */ +#define HUF_CTABLE_SIZE_ST(maxSymbolValue) ((maxSymbolValue)+2) /* Use tables of size_t, for proper alignment */ +#define HUF_CTABLE_SIZE(maxSymbolValue) (HUF_CTABLE_SIZE_ST(maxSymbolValue) * sizeof(size_t)) +#define HUF_CREATE_STATIC_CTABLE(name, maxSymbolValue) \ + HUF_CElt name[HUF_CTABLE_SIZE_ST(maxSymbolValue)] /* no final ; */ + +/* static allocation of HUF's DTable */ +typedef U32 HUF_DTable; +#define HUF_DTABLE_SIZE(maxTableLog) (1 + (1<<(maxTableLog))) +#define HUF_CREATE_STATIC_DTABLEX1(DTable, maxTableLog) \ + HUF_DTable DTable[HUF_DTABLE_SIZE((maxTableLog)-1)] = { ((U32)((maxTableLog)-1) * 0x01000001) } +#define HUF_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) \ + HUF_DTable DTable[HUF_DTABLE_SIZE(maxTableLog)] = { ((U32)(maxTableLog) * 0x01000001) } + + +/* **************************************** +* Advanced decompression functions +******************************************/ + +/** + * Huffman flags bitset. + * For all flags, 0 is the default value. + */ +typedef enum { + /** + * If compiled with DYNAMIC_BMI2: Set flag only if the CPU supports BMI2 at runtime. + * Otherwise: Ignored. + */ + HUF_flags_bmi2 = (1 << 0), + /** + * If set: Test possible table depths to find the one that produces the smallest header + encoded size. + * If unset: Use heuristic to find the table depth. + */ + HUF_flags_optimalDepth = (1 << 1), + /** + * If set: If the previous table can encode the input, always reuse the previous table. + * If unset: If the previous table can encode the input, reuse the previous table if it results in a smaller output. + */ + HUF_flags_preferRepeat = (1 << 2), + /** + * If set: Sample the input and check if the sample is uncompressible, if it is then don't attempt to compress. + * If unset: Always histogram the entire input. + */ + HUF_flags_suspectUncompressible = (1 << 3), + /** + * If set: Don't use assembly implementations + * If unset: Allow using assembly implementations + */ + HUF_flags_disableAsm = (1 << 4), + /** + * If set: Don't use the fast decoding loop, always use the fallback decoding loop. + * If unset: Use the fast decoding loop when possible. + */ + HUF_flags_disableFast = (1 << 5) +} HUF_flags_e; + + +/* **************************************** + * HUF detailed API + * ****************************************/ +#define HUF_OPTIMAL_DEPTH_THRESHOLD ZSTD_btultra + +/*! HUF_compress() does the following: + * 1. count symbol occurrence from source[] into table count[] using FSE_count() (exposed within "fse.h") + * 2. (optional) refine tableLog using HUF_optimalTableLog() + * 3. build Huffman table from count using HUF_buildCTable() + * 4. save Huffman table to memory buffer using HUF_writeCTable() + * 5. encode the data stream using HUF_compress4X_usingCTable() + * + * The following API allows targeting specific sub-functions for advanced tasks. + * For example, it's possible to compress several blocks using the same 'CTable', + * or to save and regenerate 'CTable' using external methods. + */ +unsigned HUF_minTableLog(unsigned symbolCardinality); +unsigned HUF_cardinality(const unsigned* count, unsigned maxSymbolValue); +unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, void* workSpace, + size_t wkspSize, HUF_CElt* table, const unsigned* count, int flags); /* table is used as scratch space for building and testing tables, not a return value */ +size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog, void* workspace, size_t workspaceSize); +size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int flags); +size_t HUF_estimateCompressedSize(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue); +int HUF_validateCTable(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue); + +typedef enum { + HUF_repeat_none, /**< Cannot use the previous table */ + HUF_repeat_check, /**< Can use the previous table but it must be checked. Note : The previous table must have been constructed by HUF_compress{1, 4}X_repeat */ + HUF_repeat_valid /**< Can use the previous table and it is assumed to be valid */ + } HUF_repeat; + +/** HUF_compress4X_repeat() : + * Same as HUF_compress4X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none. + * If it uses hufTable it does not modify hufTable or repeat. + * If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used. + * If preferRepeat then the old table will always be used if valid. + * If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */ +size_t HUF_compress4X_repeat(void* dst, size_t dstSize, + const void* src, size_t srcSize, + unsigned maxSymbolValue, unsigned tableLog, + void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */ + HUF_CElt* hufTable, HUF_repeat* repeat, int flags); + +/** HUF_buildCTable_wksp() : + * Same as HUF_buildCTable(), but using externally allocated scratch buffer. + * `workSpace` must be aligned on 4-bytes boundaries, and its size must be >= HUF_CTABLE_WORKSPACE_SIZE. + */ +#define HUF_CTABLE_WORKSPACE_SIZE_U32 ((4 * (HUF_SYMBOLVALUE_MAX + 1)) + 192) +#define HUF_CTABLE_WORKSPACE_SIZE (HUF_CTABLE_WORKSPACE_SIZE_U32 * sizeof(unsigned)) +size_t HUF_buildCTable_wksp (HUF_CElt* tree, + const unsigned* count, U32 maxSymbolValue, U32 maxNbBits, + void* workSpace, size_t wkspSize); + +/*! HUF_readStats() : + * Read compact Huffman tree, saved by HUF_writeCTable(). + * `huffWeight` is destination buffer. + * @return : size read from `src` , or an error Code . + * Note : Needed by HUF_readCTable() and HUF_readDTableXn() . */ +size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, + U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize); + +/*! HUF_readStats_wksp() : + * Same as HUF_readStats() but takes an external workspace which must be + * 4-byte aligned and its size must be >= HUF_READ_STATS_WORKSPACE_SIZE. + * If the CPU has BMI2 support, pass bmi2=1, otherwise pass bmi2=0. + */ +#define HUF_READ_STATS_WORKSPACE_SIZE_U32 FSE_DECOMPRESS_WKSP_SIZE_U32(6, HUF_TABLELOG_MAX-1) +#define HUF_READ_STATS_WORKSPACE_SIZE (HUF_READ_STATS_WORKSPACE_SIZE_U32 * sizeof(unsigned)) +size_t HUF_readStats_wksp(BYTE* huffWeight, size_t hwSize, + U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize, + void* workspace, size_t wkspSize, + int flags); + +/** HUF_readCTable() : + * Loading a CTable saved with HUF_writeCTable() */ +size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize, unsigned *hasZeroWeights); + +/** HUF_getNbBitsFromCTable() : + * Read nbBits from CTable symbolTable, for symbol `symbolValue` presumed <= HUF_SYMBOLVALUE_MAX + * Note 1 : is not inlined, as HUF_CElt definition is private */ +U32 HUF_getNbBitsFromCTable(const HUF_CElt* symbolTable, U32 symbolValue); + +/* + * HUF_decompress() does the following: + * 1. select the decompression algorithm (X1, X2) based on pre-computed heuristics + * 2. build Huffman table from save, using HUF_readDTableX?() + * 3. decode 1 or 4 segments in parallel using HUF_decompress?X?_usingDTable() + */ + +/** HUF_selectDecoder() : + * Tells which decoder is likely to decode faster, + * based on a set of pre-computed metrics. + * @return : 0==HUF_decompress4X1, 1==HUF_decompress4X2 . + * Assumption : 0 < dstSize <= 128 KB */ +U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize); + +/** + * The minimum workspace size for the `workSpace` used in + * HUF_readDTableX1_wksp() and HUF_readDTableX2_wksp(). + * + * The space used depends on HUF_TABLELOG_MAX, ranging from ~1500 bytes when + * HUF_TABLE_LOG_MAX=12 to ~1850 bytes when HUF_TABLE_LOG_MAX=15. + * Buffer overflow errors may potentially occur if code modifications result in + * a required workspace size greater than that specified in the following + * macro. + */ +#define HUF_DECOMPRESS_WORKSPACE_SIZE ((2 << 10) + (1 << 9)) +#define HUF_DECOMPRESS_WORKSPACE_SIZE_U32 (HUF_DECOMPRESS_WORKSPACE_SIZE / sizeof(U32)) + + +/* ====================== */ +/* single stream variants */ +/* ====================== */ + +size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int flags); +/** HUF_compress1X_repeat() : + * Same as HUF_compress1X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none. + * If it uses hufTable it does not modify hufTable or repeat. + * If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used. + * If preferRepeat then the old table will always be used if valid. + * If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */ +size_t HUF_compress1X_repeat(void* dst, size_t dstSize, + const void* src, size_t srcSize, + unsigned maxSymbolValue, unsigned tableLog, + void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */ + HUF_CElt* hufTable, HUF_repeat* repeat, int flags); + +size_t HUF_decompress1X_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags); +#ifndef HUF_FORCE_DECOMPRESS_X1 +size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags); /**< double-symbols decoder */ +#endif + +/* BMI2 variants. + * If the CPU has BMI2 support, pass bmi2=1, otherwise pass bmi2=0. + */ +size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int flags); +#ifndef HUF_FORCE_DECOMPRESS_X2 +size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags); +#endif +size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int flags); +size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags); +#ifndef HUF_FORCE_DECOMPRESS_X2 +size_t HUF_readDTableX1_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int flags); +#endif +#ifndef HUF_FORCE_DECOMPRESS_X1 +size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int flags); +#endif + +#endif /* HUF_H_298734234 */ + +#if defined (__cplusplus) +} +#endif +/**** ended inlining huf.h ****/ +/**** skipping file: bits.h ****/ + + +/*=== Version ===*/ +unsigned FSE_versionNumber(void) { return FSE_VERSION_NUMBER; } + + +/*=== Error Management ===*/ +unsigned FSE_isError(size_t code) { return ERR_isError(code); } +const char* FSE_getErrorName(size_t code) { return ERR_getErrorName(code); } + +unsigned HUF_isError(size_t code) { return ERR_isError(code); } +const char* HUF_getErrorName(size_t code) { return ERR_getErrorName(code); } + + +/*-************************************************************** +* FSE NCount encoding-decoding +****************************************************************/ +FORCE_INLINE_TEMPLATE +size_t FSE_readNCount_body(short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, + const void* headerBuffer, size_t hbSize) +{ + const BYTE* const istart = (const BYTE*) headerBuffer; + const BYTE* const iend = istart + hbSize; + const BYTE* ip = istart; + int nbBits; + int remaining; + int threshold; + U32 bitStream; + int bitCount; + unsigned charnum = 0; + unsigned const maxSV1 = *maxSVPtr + 1; + int previous0 = 0; + + if (hbSize < 8) { + /* This function only works when hbSize >= 8 */ + char buffer[8] = {0}; + ZSTD_memcpy(buffer, headerBuffer, hbSize); + { size_t const countSize = FSE_readNCount(normalizedCounter, maxSVPtr, tableLogPtr, + buffer, sizeof(buffer)); + if (FSE_isError(countSize)) return countSize; + if (countSize > hbSize) return ERROR(corruption_detected); + return countSize; + } } + assert(hbSize >= 8); + + /* init */ + ZSTD_memset(normalizedCounter, 0, (*maxSVPtr+1) * sizeof(normalizedCounter[0])); /* all symbols not present in NCount have a frequency of 0 */ + bitStream = MEM_readLE32(ip); + nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG; /* extract tableLog */ + if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return ERROR(tableLog_tooLarge); + bitStream >>= 4; + bitCount = 4; + *tableLogPtr = nbBits; + remaining = (1<> 1; + while (repeats >= 12) { + charnum += 3 * 12; + if (LIKELY(ip <= iend-7)) { + ip += 3; + } else { + bitCount -= (int)(8 * (iend - 7 - ip)); + bitCount &= 31; + ip = iend - 4; + } + bitStream = MEM_readLE32(ip) >> bitCount; + repeats = ZSTD_countTrailingZeros32(~bitStream | 0x80000000) >> 1; + } + charnum += 3 * repeats; + bitStream >>= 2 * repeats; + bitCount += 2 * repeats; + + /* Add the final repeat which isn't 0b11. */ + assert((bitStream & 3) < 3); + charnum += bitStream & 3; + bitCount += 2; + + /* This is an error, but break and return an error + * at the end, because returning out of a loop makes + * it harder for the compiler to optimize. + */ + if (charnum >= maxSV1) break; + + /* We don't need to set the normalized count to 0 + * because we already memset the whole buffer to 0. + */ + + if (LIKELY(ip <= iend-7) || (ip + (bitCount>>3) <= iend-4)) { + assert((bitCount >> 3) <= 3); /* For first condition to work */ + ip += bitCount>>3; + bitCount &= 7; + } else { + bitCount -= (int)(8 * (iend - 4 - ip)); + bitCount &= 31; + ip = iend - 4; + } + bitStream = MEM_readLE32(ip) >> bitCount; + } + { + int const max = (2*threshold-1) - remaining; + int count; + + if ((bitStream & (threshold-1)) < (U32)max) { + count = bitStream & (threshold-1); + bitCount += nbBits-1; + } else { + count = bitStream & (2*threshold-1); + if (count >= threshold) count -= max; + bitCount += nbBits; + } + + count--; /* extra accuracy */ + /* When it matters (small blocks), this is a + * predictable branch, because we don't use -1. + */ + if (count >= 0) { + remaining -= count; + } else { + assert(count == -1); + remaining += count; + } + normalizedCounter[charnum++] = (short)count; + previous0 = !count; + + assert(threshold > 1); + if (remaining < threshold) { + /* This branch can be folded into the + * threshold update condition because we + * know that threshold > 1. + */ + if (remaining <= 1) break; + nbBits = ZSTD_highbit32(remaining) + 1; + threshold = 1 << (nbBits - 1); + } + if (charnum >= maxSV1) break; + + if (LIKELY(ip <= iend-7) || (ip + (bitCount>>3) <= iend-4)) { + ip += bitCount>>3; + bitCount &= 7; + } else { + bitCount -= (int)(8 * (iend - 4 - ip)); + bitCount &= 31; + ip = iend - 4; + } + bitStream = MEM_readLE32(ip) >> bitCount; + } } + if (remaining != 1) return ERROR(corruption_detected); + /* Only possible when there are too many zeros. */ + if (charnum > maxSV1) return ERROR(maxSymbolValue_tooSmall); + if (bitCount > 32) return ERROR(corruption_detected); + *maxSVPtr = charnum-1; + + ip += (bitCount+7)>>3; + return ip-istart; +} + +/* Avoids the FORCE_INLINE of the _body() function. */ +static size_t FSE_readNCount_body_default( + short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, + const void* headerBuffer, size_t hbSize) +{ + return FSE_readNCount_body(normalizedCounter, maxSVPtr, tableLogPtr, headerBuffer, hbSize); +} + +#if DYNAMIC_BMI2 +BMI2_TARGET_ATTRIBUTE static size_t FSE_readNCount_body_bmi2( + short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, + const void* headerBuffer, size_t hbSize) +{ + return FSE_readNCount_body(normalizedCounter, maxSVPtr, tableLogPtr, headerBuffer, hbSize); +} +#endif + +size_t FSE_readNCount_bmi2( + short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, + const void* headerBuffer, size_t hbSize, int bmi2) +{ +#if DYNAMIC_BMI2 + if (bmi2) { + return FSE_readNCount_body_bmi2(normalizedCounter, maxSVPtr, tableLogPtr, headerBuffer, hbSize); + } +#endif + (void)bmi2; + return FSE_readNCount_body_default(normalizedCounter, maxSVPtr, tableLogPtr, headerBuffer, hbSize); +} + +size_t FSE_readNCount( + short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, + const void* headerBuffer, size_t hbSize) +{ + return FSE_readNCount_bmi2(normalizedCounter, maxSVPtr, tableLogPtr, headerBuffer, hbSize, /* bmi2 */ 0); +} + + +/*! HUF_readStats() : + Read compact Huffman tree, saved by HUF_writeCTable(). + `huffWeight` is destination buffer. + `rankStats` is assumed to be a table of at least HUF_TABLELOG_MAX U32. + @return : size read from `src` , or an error Code . + Note : Needed by HUF_readCTable() and HUF_readDTableX?() . +*/ +size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats, + U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize) +{ + U32 wksp[HUF_READ_STATS_WORKSPACE_SIZE_U32]; + return HUF_readStats_wksp(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, wksp, sizeof(wksp), /* flags */ 0); +} + +FORCE_INLINE_TEMPLATE size_t +HUF_readStats_body(BYTE* huffWeight, size_t hwSize, U32* rankStats, + U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize, + void* workSpace, size_t wkspSize, + int bmi2) +{ + U32 weightTotal; + const BYTE* ip = (const BYTE*) src; + size_t iSize; + size_t oSize; + + if (!srcSize) return ERROR(srcSize_wrong); + iSize = ip[0]; + /* ZSTD_memset(huffWeight, 0, hwSize); *//* is not necessary, even though some analyzer complain ... */ + + if (iSize >= 128) { /* special header */ + oSize = iSize - 127; + iSize = ((oSize+1)/2); + if (iSize+1 > srcSize) return ERROR(srcSize_wrong); + if (oSize >= hwSize) return ERROR(corruption_detected); + ip += 1; + { U32 n; + for (n=0; n> 4; + huffWeight[n+1] = ip[n/2] & 15; + } } } + else { /* header compressed with FSE (normal case) */ + if (iSize+1 > srcSize) return ERROR(srcSize_wrong); + /* max (hwSize-1) values decoded, as last one is implied */ + oSize = FSE_decompress_wksp_bmi2(huffWeight, hwSize-1, ip+1, iSize, 6, workSpace, wkspSize, bmi2); + if (FSE_isError(oSize)) return oSize; + } + + /* collect weight stats */ + ZSTD_memset(rankStats, 0, (HUF_TABLELOG_MAX + 1) * sizeof(U32)); + weightTotal = 0; + { U32 n; for (n=0; n HUF_TABLELOG_MAX) return ERROR(corruption_detected); + rankStats[huffWeight[n]]++; + weightTotal += (1 << huffWeight[n]) >> 1; + } } + if (weightTotal == 0) return ERROR(corruption_detected); + + /* get last non-null symbol weight (implied, total must be 2^n) */ + { U32 const tableLog = ZSTD_highbit32(weightTotal) + 1; + if (tableLog > HUF_TABLELOG_MAX) return ERROR(corruption_detected); + *tableLogPtr = tableLog; + /* determine last weight */ + { U32 const total = 1 << tableLog; + U32 const rest = total - weightTotal; + U32 const verif = 1 << ZSTD_highbit32(rest); + U32 const lastWeight = ZSTD_highbit32(rest) + 1; + if (verif != rest) return ERROR(corruption_detected); /* last value must be a clean power of 2 */ + huffWeight[oSize] = (BYTE)lastWeight; + rankStats[lastWeight]++; + } } + + /* check tree construction validity */ + if ((rankStats[1] < 2) || (rankStats[1] & 1)) return ERROR(corruption_detected); /* by construction : at least 2 elts of rank 1, must be even */ + + /* results */ + *nbSymbolsPtr = (U32)(oSize+1); + return iSize+1; +} + +/* Avoids the FORCE_INLINE of the _body() function. */ +static size_t HUF_readStats_body_default(BYTE* huffWeight, size_t hwSize, U32* rankStats, + U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize, + void* workSpace, size_t wkspSize) +{ + return HUF_readStats_body(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, workSpace, wkspSize, 0); +} + +#if DYNAMIC_BMI2 +static BMI2_TARGET_ATTRIBUTE size_t HUF_readStats_body_bmi2(BYTE* huffWeight, size_t hwSize, U32* rankStats, + U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize, + void* workSpace, size_t wkspSize) +{ + return HUF_readStats_body(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, workSpace, wkspSize, 1); +} +#endif + +size_t HUF_readStats_wksp(BYTE* huffWeight, size_t hwSize, U32* rankStats, + U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize, + void* workSpace, size_t wkspSize, + int flags) +{ +#if DYNAMIC_BMI2 + if (flags & HUF_flags_bmi2) { + return HUF_readStats_body_bmi2(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, workSpace, wkspSize); + } +#endif + (void)flags; + return HUF_readStats_body_default(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, workSpace, wkspSize); +} +/**** ended inlining common/entropy_common.c ****/ +/**** start inlining common/error_private.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* The purpose of this file is to have a single list of error strings embedded in binary */ + +/**** skipping file: error_private.h ****/ + +const char* ERR_getErrorString(ERR_enum code) +{ +#ifdef ZSTD_STRIP_ERROR_STRINGS + (void)code; + return "Error strings stripped"; +#else + static const char* const notErrorCode = "Unspecified error code"; + switch( code ) + { + case PREFIX(no_error): return "No error detected"; + case PREFIX(GENERIC): return "Error (generic)"; + case PREFIX(prefix_unknown): return "Unknown frame descriptor"; + case PREFIX(version_unsupported): return "Version not supported"; + case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter"; + case PREFIX(frameParameter_windowTooLarge): return "Frame requires too much memory for decoding"; + case PREFIX(corruption_detected): return "Data corruption detected"; + case PREFIX(checksum_wrong): return "Restored data doesn't match checksum"; + case PREFIX(literals_headerWrong): return "Header of Literals' block doesn't respect format specification"; + case PREFIX(parameter_unsupported): return "Unsupported parameter"; + case PREFIX(parameter_combination_unsupported): return "Unsupported combination of parameters"; + case PREFIX(parameter_outOfBound): return "Parameter is out of bound"; + case PREFIX(init_missing): return "Context should be init first"; + case PREFIX(memory_allocation): return "Allocation error : not enough memory"; + case PREFIX(workSpace_tooSmall): return "workSpace buffer is not large enough"; + case PREFIX(stage_wrong): return "Operation not authorized at current processing stage"; + case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory : unsupported"; + case PREFIX(maxSymbolValue_tooLarge): return "Unsupported max Symbol Value : too large"; + case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small"; + case PREFIX(stabilityCondition_notRespected): return "pledged buffer stability condition is not respected"; + case PREFIX(dictionary_corrupted): return "Dictionary is corrupted"; + case PREFIX(dictionary_wrong): return "Dictionary mismatch"; + case PREFIX(dictionaryCreation_failed): return "Cannot create Dictionary from provided samples"; + case PREFIX(dstSize_tooSmall): return "Destination buffer is too small"; + case PREFIX(srcSize_wrong): return "Src size is incorrect"; + case PREFIX(dstBuffer_null): return "Operation on NULL destination buffer"; + case PREFIX(noForwardProgress_destFull): return "Operation made no progress over multiple calls, due to output buffer being full"; + case PREFIX(noForwardProgress_inputEmpty): return "Operation made no progress over multiple calls, due to input being empty"; + /* following error codes are not stable and may be removed or changed in a future version */ + case PREFIX(frameIndex_tooLarge): return "Frame index is too large"; + case PREFIX(seekableIO): return "An I/O error occurred when reading/seeking"; + case PREFIX(dstBuffer_wrong): return "Destination buffer is wrong"; + case PREFIX(srcBuffer_wrong): return "Source buffer is wrong"; + case PREFIX(sequenceProducer_failed): return "Block-level external sequence producer returned an error code"; + case PREFIX(externalSequences_invalid): return "External sequences are not valid"; + case PREFIX(maxCode): + default: return notErrorCode; + } +#endif +} +/**** ended inlining common/error_private.c ****/ +/**** start inlining common/fse_decompress.c ****/ +/* ****************************************************************** + * FSE : Finite State Entropy decoder + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy + * - Public forum : https://groups.google.com/forum/#!forum/lz4c + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + + +/* ************************************************************** +* Includes +****************************************************************/ +/**** skipping file: debug.h ****/ +/**** skipping file: bitstream.h ****/ +/**** skipping file: compiler.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: fse.h ****/ +/**** skipping file: error_private.h ****/ +#define ZSTD_DEPS_NEED_MALLOC +/**** skipping file: zstd_deps.h ****/ +/**** skipping file: bits.h ****/ + + +/* ************************************************************** +* Error Management +****************************************************************/ +#define FSE_isError ERR_isError +#define FSE_STATIC_ASSERT(c) DEBUG_STATIC_ASSERT(c) /* use only *after* variable declarations */ + + +/* ************************************************************** +* Templates +****************************************************************/ +/* + designed to be included + for type-specific functions (template emulation in C) + Objective is to write these functions only once, for improved maintenance +*/ + +/* safety checks */ +#ifndef FSE_FUNCTION_EXTENSION +# error "FSE_FUNCTION_EXTENSION must be defined" +#endif +#ifndef FSE_FUNCTION_TYPE +# error "FSE_FUNCTION_TYPE must be defined" +#endif + +/* Function names */ +#define FSE_CAT(X,Y) X##Y +#define FSE_FUNCTION_NAME(X,Y) FSE_CAT(X,Y) +#define FSE_TYPE_NAME(X,Y) FSE_CAT(X,Y) + +static size_t FSE_buildDTable_internal(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize) +{ + void* const tdPtr = dt+1; /* because *dt is unsigned, 32-bits aligned on 32-bits */ + FSE_DECODE_TYPE* const tableDecode = (FSE_DECODE_TYPE*) (tdPtr); + U16* symbolNext = (U16*)workSpace; + BYTE* spread = (BYTE*)(symbolNext + maxSymbolValue + 1); + + U32 const maxSV1 = maxSymbolValue + 1; + U32 const tableSize = 1 << tableLog; + U32 highThreshold = tableSize-1; + + /* Sanity Checks */ + if (FSE_BUILD_DTABLE_WKSP_SIZE(tableLog, maxSymbolValue) > wkspSize) return ERROR(maxSymbolValue_tooLarge); + if (maxSymbolValue > FSE_MAX_SYMBOL_VALUE) return ERROR(maxSymbolValue_tooLarge); + if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge); + + /* Init, lay down lowprob symbols */ + { FSE_DTableHeader DTableH; + DTableH.tableLog = (U16)tableLog; + DTableH.fastMode = 1; + { S16 const largeLimit= (S16)(1 << (tableLog-1)); + U32 s; + for (s=0; s= largeLimit) DTableH.fastMode=0; + symbolNext[s] = normalizedCounter[s]; + } } } + ZSTD_memcpy(dt, &DTableH, sizeof(DTableH)); + } + + /* Spread symbols */ + if (highThreshold == tableSize - 1) { + size_t const tableMask = tableSize-1; + size_t const step = FSE_TABLESTEP(tableSize); + /* First lay down the symbols in order. + * We use a uint64_t to lay down 8 bytes at a time. This reduces branch + * misses since small blocks generally have small table logs, so nearly + * all symbols have counts <= 8. We ensure we have 8 bytes at the end of + * our buffer to handle the over-write. + */ + { + U64 const add = 0x0101010101010101ull; + size_t pos = 0; + U64 sv = 0; + U32 s; + for (s=0; s highThreshold) position = (position + step) & tableMask; /* lowprob area */ + } } + if (position!=0) return ERROR(GENERIC); /* position must reach all cells once, otherwise normalizedCounter is incorrect */ + } + + /* Build Decoding table */ + { U32 u; + for (u=0; u sizeof(bitD.bitContainer)*8) /* This test must be static */ + BIT_reloadDStream(&bitD); + + op[1] = FSE_GETSYMBOL(&state2); + + if (FSE_MAX_TABLELOG*4+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */ + { if (BIT_reloadDStream(&bitD) > BIT_DStream_unfinished) { op+=2; break; } } + + op[2] = FSE_GETSYMBOL(&state1); + + if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */ + BIT_reloadDStream(&bitD); + + op[3] = FSE_GETSYMBOL(&state2); + } + + /* tail */ + /* note : BIT_reloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly BIT_DStream_completed */ + while (1) { + if (op>(omax-2)) return ERROR(dstSize_tooSmall); + *op++ = FSE_GETSYMBOL(&state1); + if (BIT_reloadDStream(&bitD)==BIT_DStream_overflow) { + *op++ = FSE_GETSYMBOL(&state2); + break; + } + + if (op>(omax-2)) return ERROR(dstSize_tooSmall); + *op++ = FSE_GETSYMBOL(&state2); + if (BIT_reloadDStream(&bitD)==BIT_DStream_overflow) { + *op++ = FSE_GETSYMBOL(&state1); + break; + } } + + return op-ostart; +} + +typedef struct { + short ncount[FSE_MAX_SYMBOL_VALUE + 1]; + FSE_DTable dtable[1]; /* Dynamically sized */ +} FSE_DecompressWksp; + + +FORCE_INLINE_TEMPLATE size_t FSE_decompress_wksp_body( + void* dst, size_t dstCapacity, + const void* cSrc, size_t cSrcSize, + unsigned maxLog, void* workSpace, size_t wkspSize, + int bmi2) +{ + const BYTE* const istart = (const BYTE*)cSrc; + const BYTE* ip = istart; + unsigned tableLog; + unsigned maxSymbolValue = FSE_MAX_SYMBOL_VALUE; + FSE_DecompressWksp* const wksp = (FSE_DecompressWksp*)workSpace; + + DEBUG_STATIC_ASSERT((FSE_MAX_SYMBOL_VALUE + 1) % 2 == 0); + if (wkspSize < sizeof(*wksp)) return ERROR(GENERIC); + + /* normal FSE decoding mode */ + { + size_t const NCountLength = FSE_readNCount_bmi2(wksp->ncount, &maxSymbolValue, &tableLog, istart, cSrcSize, bmi2); + if (FSE_isError(NCountLength)) return NCountLength; + if (tableLog > maxLog) return ERROR(tableLog_tooLarge); + assert(NCountLength <= cSrcSize); + ip += NCountLength; + cSrcSize -= NCountLength; + } + + if (FSE_DECOMPRESS_WKSP_SIZE(tableLog, maxSymbolValue) > wkspSize) return ERROR(tableLog_tooLarge); + assert(sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog) <= wkspSize); + workSpace = (BYTE*)workSpace + sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog); + wkspSize -= sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog); + + CHECK_F( FSE_buildDTable_internal(wksp->dtable, wksp->ncount, maxSymbolValue, tableLog, workSpace, wkspSize) ); + + { + const void* ptr = wksp->dtable; + const FSE_DTableHeader* DTableH = (const FSE_DTableHeader*)ptr; + const U32 fastMode = DTableH->fastMode; + + /* select fast mode (static) */ + if (fastMode) return FSE_decompress_usingDTable_generic(dst, dstCapacity, ip, cSrcSize, wksp->dtable, 1); + return FSE_decompress_usingDTable_generic(dst, dstCapacity, ip, cSrcSize, wksp->dtable, 0); + } +} + +/* Avoids the FORCE_INLINE of the _body() function. */ +static size_t FSE_decompress_wksp_body_default(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize) +{ + return FSE_decompress_wksp_body(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize, 0); +} + +#if DYNAMIC_BMI2 +BMI2_TARGET_ATTRIBUTE static size_t FSE_decompress_wksp_body_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize) +{ + return FSE_decompress_wksp_body(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize, 1); +} +#endif + +size_t FSE_decompress_wksp_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize, int bmi2) +{ +#if DYNAMIC_BMI2 + if (bmi2) { + return FSE_decompress_wksp_body_bmi2(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize); + } +#endif + (void)bmi2; + return FSE_decompress_wksp_body_default(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize); +} + +#endif /* FSE_COMMONDEFS_ONLY */ +/**** ended inlining common/fse_decompress.c ****/ +/**** start inlining common/threading.c ****/ +/** + * Copyright (c) 2016 Tino Reichardt + * All rights reserved. + * + * You can contact the author at: + * - zstdmt source repository: https://github.com/mcmilk/zstdmt + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/** + * This file will hold wrapper for systems, which do not support pthreads + */ + +/**** start inlining threading.h ****/ +/** + * Copyright (c) 2016 Tino Reichardt + * All rights reserved. + * + * You can contact the author at: + * - zstdmt source repository: https://github.com/mcmilk/zstdmt + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef THREADING_H_938743 +#define THREADING_H_938743 + +/**** skipping file: debug.h ****/ + +#if defined (__cplusplus) +extern "C" { +#endif + +#if defined(ZSTD_MULTITHREAD) && defined(_WIN32) + +/** + * Windows minimalist Pthread Wrapper + */ +#ifdef WINVER +# undef WINVER +#endif +#define WINVER 0x0600 + +#ifdef _WIN32_WINNT +# undef _WIN32_WINNT +#endif +#define _WIN32_WINNT 0x0600 + +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif + +#undef ERROR /* reported already defined on VS 2015 (Rich Geldreich) */ +#include +#undef ERROR +#define ERROR(name) ZSTD_ERROR(name) + + +/* mutex */ +#define ZSTD_pthread_mutex_t CRITICAL_SECTION +#define ZSTD_pthread_mutex_init(a, b) ((void)(b), InitializeCriticalSection((a)), 0) +#define ZSTD_pthread_mutex_destroy(a) DeleteCriticalSection((a)) +#define ZSTD_pthread_mutex_lock(a) EnterCriticalSection((a)) +#define ZSTD_pthread_mutex_unlock(a) LeaveCriticalSection((a)) + +/* condition variable */ +#define ZSTD_pthread_cond_t CONDITION_VARIABLE +#define ZSTD_pthread_cond_init(a, b) ((void)(b), InitializeConditionVariable((a)), 0) +#define ZSTD_pthread_cond_destroy(a) ((void)(a)) +#define ZSTD_pthread_cond_wait(a, b) SleepConditionVariableCS((a), (b), INFINITE) +#define ZSTD_pthread_cond_signal(a) WakeConditionVariable((a)) +#define ZSTD_pthread_cond_broadcast(a) WakeAllConditionVariable((a)) + +/* ZSTD_pthread_create() and ZSTD_pthread_join() */ +typedef HANDLE ZSTD_pthread_t; + +int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused, + void* (*start_routine) (void*), void* arg); + +int ZSTD_pthread_join(ZSTD_pthread_t thread); + +/** + * add here more wrappers as required + */ + + +#elif defined(ZSTD_MULTITHREAD) /* posix assumed ; need a better detection method */ +/* === POSIX Systems === */ +# include + +#if DEBUGLEVEL < 1 + +#define ZSTD_pthread_mutex_t pthread_mutex_t +#define ZSTD_pthread_mutex_init(a, b) pthread_mutex_init((a), (b)) +#define ZSTD_pthread_mutex_destroy(a) pthread_mutex_destroy((a)) +#define ZSTD_pthread_mutex_lock(a) pthread_mutex_lock((a)) +#define ZSTD_pthread_mutex_unlock(a) pthread_mutex_unlock((a)) + +#define ZSTD_pthread_cond_t pthread_cond_t +#define ZSTD_pthread_cond_init(a, b) pthread_cond_init((a), (b)) +#define ZSTD_pthread_cond_destroy(a) pthread_cond_destroy((a)) +#define ZSTD_pthread_cond_wait(a, b) pthread_cond_wait((a), (b)) +#define ZSTD_pthread_cond_signal(a) pthread_cond_signal((a)) +#define ZSTD_pthread_cond_broadcast(a) pthread_cond_broadcast((a)) + +#define ZSTD_pthread_t pthread_t +#define ZSTD_pthread_create(a, b, c, d) pthread_create((a), (b), (c), (d)) +#define ZSTD_pthread_join(a) pthread_join((a),NULL) + +#else /* DEBUGLEVEL >= 1 */ + +/* Debug implementation of threading. + * In this implementation we use pointers for mutexes and condition variables. + * This way, if we forget to init/destroy them the program will crash or ASAN + * will report leaks. + */ + +#define ZSTD_pthread_mutex_t pthread_mutex_t* +int ZSTD_pthread_mutex_init(ZSTD_pthread_mutex_t* mutex, pthread_mutexattr_t const* attr); +int ZSTD_pthread_mutex_destroy(ZSTD_pthread_mutex_t* mutex); +#define ZSTD_pthread_mutex_lock(a) pthread_mutex_lock(*(a)) +#define ZSTD_pthread_mutex_unlock(a) pthread_mutex_unlock(*(a)) + +#define ZSTD_pthread_cond_t pthread_cond_t* +int ZSTD_pthread_cond_init(ZSTD_pthread_cond_t* cond, pthread_condattr_t const* attr); +int ZSTD_pthread_cond_destroy(ZSTD_pthread_cond_t* cond); +#define ZSTD_pthread_cond_wait(a, b) pthread_cond_wait(*(a), *(b)) +#define ZSTD_pthread_cond_signal(a) pthread_cond_signal(*(a)) +#define ZSTD_pthread_cond_broadcast(a) pthread_cond_broadcast(*(a)) + +#define ZSTD_pthread_t pthread_t +#define ZSTD_pthread_create(a, b, c, d) pthread_create((a), (b), (c), (d)) +#define ZSTD_pthread_join(a) pthread_join((a),NULL) + +#endif + +#else /* ZSTD_MULTITHREAD not defined */ +/* No multithreading support */ + +typedef int ZSTD_pthread_mutex_t; +#define ZSTD_pthread_mutex_init(a, b) ((void)(a), (void)(b), 0) +#define ZSTD_pthread_mutex_destroy(a) ((void)(a)) +#define ZSTD_pthread_mutex_lock(a) ((void)(a)) +#define ZSTD_pthread_mutex_unlock(a) ((void)(a)) + +typedef int ZSTD_pthread_cond_t; +#define ZSTD_pthread_cond_init(a, b) ((void)(a), (void)(b), 0) +#define ZSTD_pthread_cond_destroy(a) ((void)(a)) +#define ZSTD_pthread_cond_wait(a, b) ((void)(a), (void)(b)) +#define ZSTD_pthread_cond_signal(a) ((void)(a)) +#define ZSTD_pthread_cond_broadcast(a) ((void)(a)) + +/* do not use ZSTD_pthread_t */ + +#endif /* ZSTD_MULTITHREAD */ + +#if defined (__cplusplus) +} +#endif + +#endif /* THREADING_H_938743 */ +/**** ended inlining threading.h ****/ + +/* create fake symbol to avoid empty translation unit warning */ +int g_ZSTD_threading_useless_symbol; + +#if defined(ZSTD_MULTITHREAD) && defined(_WIN32) + +/** + * Windows minimalist Pthread Wrapper + */ + + +/* === Dependencies === */ +#include +#include + + +/* === Implementation === */ + +typedef struct { + void* (*start_routine)(void*); + void* arg; + int initialized; + ZSTD_pthread_cond_t initialized_cond; + ZSTD_pthread_mutex_t initialized_mutex; +} ZSTD_thread_params_t; + +static unsigned __stdcall worker(void *arg) +{ + void* (*start_routine)(void*); + void* thread_arg; + + /* Initialized thread_arg and start_routine and signal main thread that we don't need it + * to wait any longer. + */ + { + ZSTD_thread_params_t* thread_param = (ZSTD_thread_params_t*)arg; + thread_arg = thread_param->arg; + start_routine = thread_param->start_routine; + + /* Signal main thread that we are running and do not depend on its memory anymore */ + ZSTD_pthread_mutex_lock(&thread_param->initialized_mutex); + thread_param->initialized = 1; + ZSTD_pthread_cond_signal(&thread_param->initialized_cond); + ZSTD_pthread_mutex_unlock(&thread_param->initialized_mutex); + } + + start_routine(thread_arg); + + return 0; +} + +int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused, + void* (*start_routine) (void*), void* arg) +{ + ZSTD_thread_params_t thread_param; + (void)unused; + + thread_param.start_routine = start_routine; + thread_param.arg = arg; + thread_param.initialized = 0; + *thread = NULL; + + /* Setup thread initialization synchronization */ + if(ZSTD_pthread_cond_init(&thread_param.initialized_cond, NULL)) { + /* Should never happen on Windows */ + return -1; + } + if(ZSTD_pthread_mutex_init(&thread_param.initialized_mutex, NULL)) { + /* Should never happen on Windows */ + ZSTD_pthread_cond_destroy(&thread_param.initialized_cond); + return -1; + } + + /* Spawn thread */ + *thread = (HANDLE)_beginthreadex(NULL, 0, worker, &thread_param, 0, NULL); + if (!thread) { + ZSTD_pthread_mutex_destroy(&thread_param.initialized_mutex); + ZSTD_pthread_cond_destroy(&thread_param.initialized_cond); + return errno; + } + + /* Wait for thread to be initialized */ + ZSTD_pthread_mutex_lock(&thread_param.initialized_mutex); + while(!thread_param.initialized) { + ZSTD_pthread_cond_wait(&thread_param.initialized_cond, &thread_param.initialized_mutex); + } + ZSTD_pthread_mutex_unlock(&thread_param.initialized_mutex); + ZSTD_pthread_mutex_destroy(&thread_param.initialized_mutex); + ZSTD_pthread_cond_destroy(&thread_param.initialized_cond); + + return 0; +} + +int ZSTD_pthread_join(ZSTD_pthread_t thread) +{ + DWORD result; + + if (!thread) return 0; + + result = WaitForSingleObject(thread, INFINITE); + CloseHandle(thread); + + switch (result) { + case WAIT_OBJECT_0: + return 0; + case WAIT_ABANDONED: + return EINVAL; + default: + return GetLastError(); + } +} + +#endif /* ZSTD_MULTITHREAD */ + +#if defined(ZSTD_MULTITHREAD) && DEBUGLEVEL >= 1 && !defined(_WIN32) + +#define ZSTD_DEPS_NEED_MALLOC +/**** skipping file: zstd_deps.h ****/ + +int ZSTD_pthread_mutex_init(ZSTD_pthread_mutex_t* mutex, pthread_mutexattr_t const* attr) +{ + *mutex = (pthread_mutex_t*)ZSTD_malloc(sizeof(pthread_mutex_t)); + if (!*mutex) + return 1; + return pthread_mutex_init(*mutex, attr); +} + +int ZSTD_pthread_mutex_destroy(ZSTD_pthread_mutex_t* mutex) +{ + if (!*mutex) + return 0; + { + int const ret = pthread_mutex_destroy(*mutex); + ZSTD_free(*mutex); + return ret; + } +} + +int ZSTD_pthread_cond_init(ZSTD_pthread_cond_t* cond, pthread_condattr_t const* attr) +{ + *cond = (pthread_cond_t*)ZSTD_malloc(sizeof(pthread_cond_t)); + if (!*cond) + return 1; + return pthread_cond_init(*cond, attr); +} + +int ZSTD_pthread_cond_destroy(ZSTD_pthread_cond_t* cond) +{ + if (!*cond) + return 0; + { + int const ret = pthread_cond_destroy(*cond); + ZSTD_free(*cond); + return ret; + } +} + +#endif +/**** ended inlining common/threading.c ****/ +/**** start inlining common/pool.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + +/* ====== Dependencies ======= */ +/**** start inlining ../common/allocations.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* This file provides custom allocation primitives + */ + +#define ZSTD_DEPS_NEED_MALLOC +/**** skipping file: zstd_deps.h ****/ + +/**** skipping file: mem.h ****/ +#define ZSTD_STATIC_LINKING_ONLY +/**** start inlining ../zstd.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef ZSTD_H_235446 +#define ZSTD_H_235446 + +/* ====== Dependencies ======*/ +#include /* INT_MAX */ +#include /* size_t */ + + +/* ===== ZSTDLIB_API : control library symbols visibility ===== */ +#ifndef ZSTDLIB_VISIBLE + /* Backwards compatibility with old macro name */ +# ifdef ZSTDLIB_VISIBILITY +# define ZSTDLIB_VISIBLE ZSTDLIB_VISIBILITY +# elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDLIB_VISIBLE __attribute__ ((visibility ("default"))) +# else +# define ZSTDLIB_VISIBLE +# endif +#endif + +#ifndef ZSTDLIB_HIDDEN +# if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDLIB_HIDDEN __attribute__ ((visibility ("hidden"))) +# else +# define ZSTDLIB_HIDDEN +# endif +#endif + +#if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDLIB_API __declspec(dllexport) ZSTDLIB_VISIBLE +#elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDLIB_API __declspec(dllimport) ZSTDLIB_VISIBLE /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define ZSTDLIB_API ZSTDLIB_VISIBLE +#endif + +/* Deprecation warnings : + * Should these warnings be a problem, it is generally possible to disable them, + * typically with -Wno-deprecated-declarations for gcc or _CRT_SECURE_NO_WARNINGS in Visual. + * Otherwise, it's also possible to define ZSTD_DISABLE_DEPRECATE_WARNINGS. + */ +#ifdef ZSTD_DISABLE_DEPRECATE_WARNINGS +# define ZSTD_DEPRECATED(message) /* disable deprecation warnings */ +#else +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define ZSTD_DEPRECATED(message) [[deprecated(message)]] +# elif (defined(GNUC) && (GNUC > 4 || (GNUC == 4 && GNUC_MINOR >= 5))) || defined(__clang__) +# define ZSTD_DEPRECATED(message) __attribute__((deprecated(message))) +# elif defined(__GNUC__) && (__GNUC__ >= 3) +# define ZSTD_DEPRECATED(message) __attribute__((deprecated)) +# elif defined(_MSC_VER) +# define ZSTD_DEPRECATED(message) __declspec(deprecated(message)) +# else +# pragma message("WARNING: You need to implement ZSTD_DEPRECATED for this compiler") +# define ZSTD_DEPRECATED(message) +# endif +#endif /* ZSTD_DISABLE_DEPRECATE_WARNINGS */ + + +/******************************************************************************* + Introduction + + zstd, short for Zstandard, is a fast lossless compression algorithm, targeting + real-time compression scenarios at zlib-level and better compression ratios. + The zstd compression library provides in-memory compression and decompression + functions. + + The library supports regular compression levels from 1 up to ZSTD_maxCLevel(), + which is currently 22. Levels >= 20, labeled `--ultra`, should be used with + caution, as they require more memory. The library also offers negative + compression levels, which extend the range of speed vs. ratio preferences. + The lower the level, the faster the speed (at the cost of compression). + + Compression can be done in: + - a single step (described as Simple API) + - a single step, reusing a context (described as Explicit context) + - unbounded multiple steps (described as Streaming compression) + + The compression ratio achievable on small data can be highly improved using + a dictionary. Dictionary compression can be performed in: + - a single step (described as Simple dictionary API) + - a single step, reusing a dictionary (described as Bulk-processing + dictionary API) + + Advanced experimental functions can be accessed using + `#define ZSTD_STATIC_LINKING_ONLY` before including zstd.h. + + Advanced experimental APIs should never be used with a dynamically-linked + library. They are not "stable"; their definitions or signatures may change in + the future. Only static linking is allowed. +*******************************************************************************/ + +/*------ Version ------*/ +#define ZSTD_VERSION_MAJOR 1 +#define ZSTD_VERSION_MINOR 5 +#define ZSTD_VERSION_RELEASE 5 +#define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE) + +/*! ZSTD_versionNumber() : + * Return runtime library version, the value is (MAJOR*100*100 + MINOR*100 + RELEASE). */ +ZSTDLIB_API unsigned ZSTD_versionNumber(void); + +#define ZSTD_LIB_VERSION ZSTD_VERSION_MAJOR.ZSTD_VERSION_MINOR.ZSTD_VERSION_RELEASE +#define ZSTD_QUOTE(str) #str +#define ZSTD_EXPAND_AND_QUOTE(str) ZSTD_QUOTE(str) +#define ZSTD_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LIB_VERSION) + +/*! ZSTD_versionString() : + * Return runtime library version, like "1.4.5". Requires v1.3.0+. */ +ZSTDLIB_API const char* ZSTD_versionString(void); + +/* ************************************* + * Default constant + ***************************************/ +#ifndef ZSTD_CLEVEL_DEFAULT +# define ZSTD_CLEVEL_DEFAULT 3 +#endif + +/* ************************************* + * Constants + ***************************************/ + +/* All magic numbers are supposed read/written to/from files/memory using little-endian convention */ +#define ZSTD_MAGICNUMBER 0xFD2FB528 /* valid since v0.8.0 */ +#define ZSTD_MAGIC_DICTIONARY 0xEC30A437 /* valid since v0.7.0 */ +#define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50 /* all 16 values, from 0x184D2A50 to 0x184D2A5F, signal the beginning of a skippable frame */ +#define ZSTD_MAGIC_SKIPPABLE_MASK 0xFFFFFFF0 + +#define ZSTD_BLOCKSIZELOG_MAX 17 +#define ZSTD_BLOCKSIZE_MAX (1<= ZSTD_compressBound(srcSize)` guarantees that zstd will have + * enough space to successfully compress the data. + * @return : compressed size written into `dst` (<= `dstCapacity), + * or an error code if it fails (which can be tested using ZSTD_isError()). */ +ZSTDLIB_API size_t ZSTD_compress( void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + int compressionLevel); + +/*! ZSTD_decompress() : + * `compressedSize` : must be the _exact_ size of some number of compressed and/or skippable frames. + * `dstCapacity` is an upper bound of originalSize to regenerate. + * If user cannot imply a maximum upper bound, it's better to use streaming mode to decompress data. + * @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), + * or an errorCode if it fails (which can be tested using ZSTD_isError()). */ +ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity, + const void* src, size_t compressedSize); + +/*! ZSTD_getFrameContentSize() : requires v1.3.0+ + * `src` should point to the start of a ZSTD encoded frame. + * `srcSize` must be at least as large as the frame header. + * hint : any size >= `ZSTD_frameHeaderSize_max` is large enough. + * @return : - decompressed size of `src` frame content, if known + * - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined + * - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) + * note 1 : a 0 return value means the frame is valid but "empty". + * note 2 : decompressed size is an optional field, it may not be present, typically in streaming mode. + * When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. + * In which case, it's necessary to use streaming mode to decompress data. + * Optionally, application can rely on some implicit limit, + * as ZSTD_decompress() only needs an upper bound of decompressed size. + * (For example, data could be necessarily cut into blocks <= 16 KB). + * note 3 : decompressed size is always present when compression is completed using single-pass functions, + * such as ZSTD_compress(), ZSTD_compressCCtx() ZSTD_compress_usingDict() or ZSTD_compress_usingCDict(). + * note 4 : decompressed size can be very large (64-bits value), + * potentially larger than what local system can handle as a single memory segment. + * In which case, it's necessary to use streaming mode to decompress data. + * note 5 : If source is untrusted, decompressed size could be wrong or intentionally modified. + * Always ensure return value fits within application's authorized limits. + * Each application can set its own limits. + * note 6 : This function replaces ZSTD_getDecompressedSize() */ +#define ZSTD_CONTENTSIZE_UNKNOWN (0ULL - 1) +#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2) +ZSTDLIB_API unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize); + +/*! ZSTD_getDecompressedSize() : + * NOTE: This function is now obsolete, in favor of ZSTD_getFrameContentSize(). + * Both functions work the same way, but ZSTD_getDecompressedSize() blends + * "empty", "unknown" and "error" results to the same return value (0), + * while ZSTD_getFrameContentSize() gives them separate return values. + * @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise. */ +ZSTD_DEPRECATED("Replaced by ZSTD_getFrameContentSize") +ZSTDLIB_API +unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize); + +/*! ZSTD_findFrameCompressedSize() : Requires v1.4.0+ + * `src` should point to the start of a ZSTD frame or skippable frame. + * `srcSize` must be >= first frame size + * @return : the compressed size of the first frame starting at `src`, + * suitable to pass as `srcSize` to `ZSTD_decompress` or similar, + * or an error code if input is invalid */ +ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize); + + +/*====== Helper functions ======*/ +/* ZSTD_compressBound() : + * maximum compressed size in worst case single-pass scenario. + * When invoking `ZSTD_compress()` or any other one-pass compression function, + * it's recommended to provide @dstCapacity >= ZSTD_compressBound(srcSize) + * as it eliminates one potential failure scenario, + * aka not enough room in dst buffer to write the compressed frame. + * Note : ZSTD_compressBound() itself can fail, if @srcSize > ZSTD_MAX_INPUT_SIZE . + * In which case, ZSTD_compressBound() will return an error code + * which can be tested using ZSTD_isError(). + * + * ZSTD_COMPRESSBOUND() : + * same as ZSTD_compressBound(), but as a macro. + * It can be used to produce constants, which can be useful for static allocation, + * for example to size a static array on stack. + * Will produce constant value 0 if srcSize too large. + */ +#define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00LLU : 0xFF00FF00U) +#define ZSTD_COMPRESSBOUND(srcSize) (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0)) /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */ +ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */ +/* ZSTD_isError() : + * Most ZSTD_* functions returning a size_t value can be tested for error, + * using ZSTD_isError(). + * @return 1 if error, 0 otherwise + */ +ZSTDLIB_API unsigned ZSTD_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ +ZSTDLIB_API const char* ZSTD_getErrorName(size_t code); /*!< provides readable string from an error code */ +ZSTDLIB_API int ZSTD_minCLevel(void); /*!< minimum negative compression level allowed, requires v1.4.0+ */ +ZSTDLIB_API int ZSTD_maxCLevel(void); /*!< maximum compression level available */ +ZSTDLIB_API int ZSTD_defaultCLevel(void); /*!< default compression level, specified by ZSTD_CLEVEL_DEFAULT, requires v1.5.0+ */ + + +/*************************************** +* Explicit context +***************************************/ +/*= Compression context + * When compressing many times, + * it is recommended to allocate a context just once, + * and re-use it for each successive compression operation. + * This will make workload friendlier for system's memory. + * Note : re-using context is just a speed / resource optimization. + * It doesn't change the compression ratio, which remains identical. + * Note 2 : In multi-threaded environments, + * use one different context per thread for parallel execution. + */ +typedef struct ZSTD_CCtx_s ZSTD_CCtx; +ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void); +ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx); /* accept NULL pointer */ + +/*! ZSTD_compressCCtx() : + * Same as ZSTD_compress(), using an explicit ZSTD_CCtx. + * Important : in order to behave similarly to `ZSTD_compress()`, + * this function compresses at requested compression level, + * __ignoring any other parameter__ . + * If any advanced parameter was set using the advanced API, + * they will all be reset. Only `compressionLevel` remains. + */ +ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + int compressionLevel); + +/*= Decompression context + * When decompressing many times, + * it is recommended to allocate a context only once, + * and re-use it for each successive compression operation. + * This will make workload friendlier for system's memory. + * Use one context per thread for parallel execution. */ +typedef struct ZSTD_DCtx_s ZSTD_DCtx; +ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void); +ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); /* accept NULL pointer */ + +/*! ZSTD_decompressDCtx() : + * Same as ZSTD_decompress(), + * requires an allocated ZSTD_DCtx. + * Compatible with sticky parameters. + */ +ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize); + + +/********************************************* +* Advanced compression API (Requires v1.4.0+) +**********************************************/ + +/* API design : + * Parameters are pushed one by one into an existing context, + * using ZSTD_CCtx_set*() functions. + * Pushed parameters are sticky : they are valid for next compressed frame, and any subsequent frame. + * "sticky" parameters are applicable to `ZSTD_compress2()` and `ZSTD_compressStream*()` ! + * __They do not apply to "simple" one-shot variants such as ZSTD_compressCCtx()__ . + * + * It's possible to reset all parameters to "default" using ZSTD_CCtx_reset(). + * + * This API supersedes all other "advanced" API entry points in the experimental section. + * In the future, we expect to remove from experimental API entry points which are redundant with this API. + */ + + +/* Compression strategies, listed from fastest to strongest */ +typedef enum { ZSTD_fast=1, + ZSTD_dfast=2, + ZSTD_greedy=3, + ZSTD_lazy=4, + ZSTD_lazy2=5, + ZSTD_btlazy2=6, + ZSTD_btopt=7, + ZSTD_btultra=8, + ZSTD_btultra2=9 + /* note : new strategies _might_ be added in the future. + Only the order (from fast to strong) is guaranteed */ +} ZSTD_strategy; + +typedef enum { + + /* compression parameters + * Note: When compressing with a ZSTD_CDict these parameters are superseded + * by the parameters used to construct the ZSTD_CDict. + * See ZSTD_CCtx_refCDict() for more info (superseded-by-cdict). */ + ZSTD_c_compressionLevel=100, /* Set compression parameters according to pre-defined cLevel table. + * Note that exact compression parameters are dynamically determined, + * depending on both compression level and srcSize (when known). + * Default level is ZSTD_CLEVEL_DEFAULT==3. + * Special: value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT. + * Note 1 : it's possible to pass a negative compression level. + * Note 2 : setting a level does not automatically set all other compression parameters + * to default. Setting this will however eventually dynamically impact the compression + * parameters which have not been manually set. The manually set + * ones will 'stick'. */ + /* Advanced compression parameters : + * It's possible to pin down compression parameters to some specific values. + * In which case, these values are no longer dynamically selected by the compressor */ + ZSTD_c_windowLog=101, /* Maximum allowed back-reference distance, expressed as power of 2. + * This will set a memory budget for streaming decompression, + * with larger values requiring more memory + * and typically compressing more. + * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX. + * Special: value 0 means "use default windowLog". + * Note: Using a windowLog greater than ZSTD_WINDOWLOG_LIMIT_DEFAULT + * requires explicitly allowing such size at streaming decompression stage. */ + ZSTD_c_hashLog=102, /* Size of the initial probe table, as a power of 2. + * Resulting memory usage is (1 << (hashLog+2)). + * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX. + * Larger tables improve compression ratio of strategies <= dFast, + * and improve speed of strategies > dFast. + * Special: value 0 means "use default hashLog". */ + ZSTD_c_chainLog=103, /* Size of the multi-probe search table, as a power of 2. + * Resulting memory usage is (1 << (chainLog+2)). + * Must be clamped between ZSTD_CHAINLOG_MIN and ZSTD_CHAINLOG_MAX. + * Larger tables result in better and slower compression. + * This parameter is useless for "fast" strategy. + * It's still useful when using "dfast" strategy, + * in which case it defines a secondary probe table. + * Special: value 0 means "use default chainLog". */ + ZSTD_c_searchLog=104, /* Number of search attempts, as a power of 2. + * More attempts result in better and slower compression. + * This parameter is useless for "fast" and "dFast" strategies. + * Special: value 0 means "use default searchLog". */ + ZSTD_c_minMatch=105, /* Minimum size of searched matches. + * Note that Zstandard can still find matches of smaller size, + * it just tweaks its search algorithm to look for this size and larger. + * Larger values increase compression and decompression speed, but decrease ratio. + * Must be clamped between ZSTD_MINMATCH_MIN and ZSTD_MINMATCH_MAX. + * Note that currently, for all strategies < btopt, effective minimum is 4. + * , for all strategies > fast, effective maximum is 6. + * Special: value 0 means "use default minMatchLength". */ + ZSTD_c_targetLength=106, /* Impact of this field depends on strategy. + * For strategies btopt, btultra & btultra2: + * Length of Match considered "good enough" to stop search. + * Larger values make compression stronger, and slower. + * For strategy fast: + * Distance between match sampling. + * Larger values make compression faster, and weaker. + * Special: value 0 means "use default targetLength". */ + ZSTD_c_strategy=107, /* See ZSTD_strategy enum definition. + * The higher the value of selected strategy, the more complex it is, + * resulting in stronger and slower compression. + * Special: value 0 means "use default strategy". */ + /* LDM mode parameters */ + ZSTD_c_enableLongDistanceMatching=160, /* Enable long distance matching. + * This parameter is designed to improve compression ratio + * for large inputs, by finding large matches at long distance. + * It increases memory usage and window size. + * Note: enabling this parameter increases default ZSTD_c_windowLog to 128 MB + * except when expressly set to a different value. + * Note: will be enabled by default if ZSTD_c_windowLog >= 128 MB and + * compression strategy >= ZSTD_btopt (== compression level 16+) */ + ZSTD_c_ldmHashLog=161, /* Size of the table for long distance matching, as a power of 2. + * Larger values increase memory usage and compression ratio, + * but decrease compression speed. + * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX + * default: windowlog - 7. + * Special: value 0 means "automatically determine hashlog". */ + ZSTD_c_ldmMinMatch=162, /* Minimum match size for long distance matcher. + * Larger/too small values usually decrease compression ratio. + * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX. + * Special: value 0 means "use default value" (default: 64). */ + ZSTD_c_ldmBucketSizeLog=163, /* Log size of each bucket in the LDM hash table for collision resolution. + * Larger values improve collision resolution but decrease compression speed. + * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX. + * Special: value 0 means "use default value" (default: 3). */ + ZSTD_c_ldmHashRateLog=164, /* Frequency of inserting/looking up entries into the LDM hash table. + * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN). + * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage. + * Larger values improve compression speed. + * Deviating far from default value will likely result in a compression ratio decrease. + * Special: value 0 means "automatically determine hashRateLog". */ + + /* frame parameters */ + ZSTD_c_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1) + * Content size must be known at the beginning of compression. + * This is automatically the case when using ZSTD_compress2(), + * For streaming scenarios, content size must be provided with ZSTD_CCtx_setPledgedSrcSize() */ + ZSTD_c_checksumFlag=201, /* A 32-bits checksum of content is written at end of frame (default:0) */ + ZSTD_c_dictIDFlag=202, /* When applicable, dictionary's ID is written into frame header (default:1) */ + + /* multi-threading parameters */ + /* These parameters are only active if multi-threading is enabled (compiled with build macro ZSTD_MULTITHREAD). + * Otherwise, trying to set any other value than default (0) will be a no-op and return an error. + * In a situation where it's unknown if the linked library supports multi-threading or not, + * setting ZSTD_c_nbWorkers to any value >= 1 and consulting the return value provides a quick way to check this property. + */ + ZSTD_c_nbWorkers=400, /* Select how many threads will be spawned to compress in parallel. + * When nbWorkers >= 1, triggers asynchronous mode when invoking ZSTD_compressStream*() : + * ZSTD_compressStream*() consumes input and flush output if possible, but immediately gives back control to caller, + * while compression is performed in parallel, within worker thread(s). + * (note : a strong exception to this rule is when first invocation of ZSTD_compressStream2() sets ZSTD_e_end : + * in which case, ZSTD_compressStream2() delegates to ZSTD_compress2(), which is always a blocking call). + * More workers improve speed, but also increase memory usage. + * Default value is `0`, aka "single-threaded mode" : no worker is spawned, + * compression is performed inside Caller's thread, and all invocations are blocking */ + ZSTD_c_jobSize=401, /* Size of a compression job. This value is enforced only when nbWorkers >= 1. + * Each compression job is completed in parallel, so this value can indirectly impact the nb of active threads. + * 0 means default, which is dynamically determined based on compression parameters. + * Job size must be a minimum of overlap size, or ZSTDMT_JOBSIZE_MIN (= 512 KB), whichever is largest. + * The minimum size is automatically and transparently enforced. */ + ZSTD_c_overlapLog=402, /* Control the overlap size, as a fraction of window size. + * The overlap size is an amount of data reloaded from previous job at the beginning of a new job. + * It helps preserve compression ratio, while each job is compressed in parallel. + * This value is enforced only when nbWorkers >= 1. + * Larger values increase compression ratio, but decrease speed. + * Possible values range from 0 to 9 : + * - 0 means "default" : value will be determined by the library, depending on strategy + * - 1 means "no overlap" + * - 9 means "full overlap", using a full window size. + * Each intermediate rank increases/decreases load size by a factor 2 : + * 9: full window; 8: w/2; 7: w/4; 6: w/8; 5:w/16; 4: w/32; 3:w/64; 2:w/128; 1:no overlap; 0:default + * default value varies between 6 and 9, depending on strategy */ + + /* note : additional experimental parameters are also available + * within the experimental section of the API. + * At the time of this writing, they include : + * ZSTD_c_rsyncable + * ZSTD_c_format + * ZSTD_c_forceMaxWindow + * ZSTD_c_forceAttachDict + * ZSTD_c_literalCompressionMode + * ZSTD_c_targetCBlockSize + * ZSTD_c_srcSizeHint + * ZSTD_c_enableDedicatedDictSearch + * ZSTD_c_stableInBuffer + * ZSTD_c_stableOutBuffer + * ZSTD_c_blockDelimiters + * ZSTD_c_validateSequences + * ZSTD_c_useBlockSplitter + * ZSTD_c_useRowMatchFinder + * ZSTD_c_prefetchCDictTables + * ZSTD_c_enableSeqProducerFallback + * ZSTD_c_maxBlockSize + * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. + * note : never ever use experimentalParam? names directly; + * also, the enums values themselves are unstable and can still change. + */ + ZSTD_c_experimentalParam1=500, + ZSTD_c_experimentalParam2=10, + ZSTD_c_experimentalParam3=1000, + ZSTD_c_experimentalParam4=1001, + ZSTD_c_experimentalParam5=1002, + ZSTD_c_experimentalParam6=1003, + ZSTD_c_experimentalParam7=1004, + ZSTD_c_experimentalParam8=1005, + ZSTD_c_experimentalParam9=1006, + ZSTD_c_experimentalParam10=1007, + ZSTD_c_experimentalParam11=1008, + ZSTD_c_experimentalParam12=1009, + ZSTD_c_experimentalParam13=1010, + ZSTD_c_experimentalParam14=1011, + ZSTD_c_experimentalParam15=1012, + ZSTD_c_experimentalParam16=1013, + ZSTD_c_experimentalParam17=1014, + ZSTD_c_experimentalParam18=1015, + ZSTD_c_experimentalParam19=1016 +} ZSTD_cParameter; + +typedef struct { + size_t error; + int lowerBound; + int upperBound; +} ZSTD_bounds; + +/*! ZSTD_cParam_getBounds() : + * All parameters must belong to an interval with lower and upper bounds, + * otherwise they will either trigger an error or be automatically clamped. + * @return : a structure, ZSTD_bounds, which contains + * - an error status field, which must be tested using ZSTD_isError() + * - lower and upper bounds, both inclusive + */ +ZSTDLIB_API ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter cParam); + +/*! ZSTD_CCtx_setParameter() : + * Set one compression parameter, selected by enum ZSTD_cParameter. + * All parameters have valid bounds. Bounds can be queried using ZSTD_cParam_getBounds(). + * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). + * Setting a parameter is generally only possible during frame initialization (before starting compression). + * Exception : when using multi-threading mode (nbWorkers >= 1), + * the following parameters can be updated _during_ compression (within same frame): + * => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy. + * new parameters will be active for next job only (after a flush()). + * @return : an error code (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value); + +/*! ZSTD_CCtx_setPledgedSrcSize() : + * Total input data size to be compressed as a single frame. + * Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag. + * This value will also be controlled at end of frame, and trigger an error if not respected. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame. + * In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN. + * ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame. + * Note 2 : pledgedSrcSize is only valid once, for the next frame. + * It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN. + * Note 3 : Whenever all input data is provided and consumed in a single round, + * for example with ZSTD_compress2(), + * or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end), + * this value is automatically overridden by srcSize instead. + */ +ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize); + +typedef enum { + ZSTD_reset_session_only = 1, + ZSTD_reset_parameters = 2, + ZSTD_reset_session_and_parameters = 3 +} ZSTD_ResetDirective; + +/*! ZSTD_CCtx_reset() : + * There are 2 different things that can be reset, independently or jointly : + * - The session : will stop compressing current frame, and make CCtx ready to start a new one. + * Useful after an error, or to interrupt any ongoing compression. + * Any internal data not yet flushed is cancelled. + * Compression parameters and dictionary remain unchanged. + * They will be used to compress next frame. + * Resetting session never fails. + * - The parameters : changes all parameters back to "default". + * This also removes any reference to any dictionary or external sequence producer. + * Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing) + * otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError()) + * - Both : similar to resetting the session, followed by resetting parameters. + */ +ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset); + +/*! ZSTD_compress2() : + * Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API. + * ZSTD_compress2() always starts a new frame. + * Should cctx hold data from a previously unfinished frame, everything about it is forgotten. + * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() + * - The function is always blocking, returns when compression is completed. + * NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have + * enough space to successfully compress the data, though it is possible it fails for other reasons. + * @return : compressed size written into `dst` (<= `dstCapacity), + * or an error code if it fails (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_API size_t ZSTD_compress2( ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize); + + +/*********************************************** +* Advanced decompression API (Requires v1.4.0+) +************************************************/ + +/* The advanced API pushes parameters one by one into an existing DCtx context. + * Parameters are sticky, and remain valid for all following frames + * using the same DCtx context. + * It's possible to reset parameters to default values using ZSTD_DCtx_reset(). + * Note : This API is compatible with existing ZSTD_decompressDCtx() and ZSTD_decompressStream(). + * Therefore, no new decompression function is necessary. + */ + +typedef enum { + + ZSTD_d_windowLogMax=100, /* Select a size limit (in power of 2) beyond which + * the streaming API will refuse to allocate memory buffer + * in order to protect the host from unreasonable memory requirements. + * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode. + * By default, a decompression context accepts window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT). + * Special: value 0 means "use default maximum windowLog". */ + + /* note : additional experimental parameters are also available + * within the experimental section of the API. + * At the time of this writing, they include : + * ZSTD_d_format + * ZSTD_d_stableOutBuffer + * ZSTD_d_forceIgnoreChecksum + * ZSTD_d_refMultipleDDicts + * ZSTD_d_disableHuffmanAssembly + * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. + * note : never ever use experimentalParam? names directly + */ + ZSTD_d_experimentalParam1=1000, + ZSTD_d_experimentalParam2=1001, + ZSTD_d_experimentalParam3=1002, + ZSTD_d_experimentalParam4=1003, + ZSTD_d_experimentalParam5=1004 + +} ZSTD_dParameter; + +/*! ZSTD_dParam_getBounds() : + * All parameters must belong to an interval with lower and upper bounds, + * otherwise they will either trigger an error or be automatically clamped. + * @return : a structure, ZSTD_bounds, which contains + * - an error status field, which must be tested using ZSTD_isError() + * - both lower and upper bounds, inclusive + */ +ZSTDLIB_API ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam); + +/*! ZSTD_DCtx_setParameter() : + * Set one compression parameter, selected by enum ZSTD_dParameter. + * All parameters have valid bounds. Bounds can be queried using ZSTD_dParam_getBounds(). + * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). + * Setting a parameter is only possible during frame initialization (before starting decompression). + * @return : 0, or an error code (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_API size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int value); + +/*! ZSTD_DCtx_reset() : + * Return a DCtx to clean state. + * Session and parameters can be reset jointly or separately. + * Parameters can only be reset when no active frame is being decompressed. + * @return : 0, or an error code, which can be tested with ZSTD_isError() + */ +ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset); + + +/**************************** +* Streaming +****************************/ + +typedef struct ZSTD_inBuffer_s { + const void* src; /**< start of input buffer */ + size_t size; /**< size of input buffer */ + size_t pos; /**< position where reading stopped. Will be updated. Necessarily 0 <= pos <= size */ +} ZSTD_inBuffer; + +typedef struct ZSTD_outBuffer_s { + void* dst; /**< start of output buffer */ + size_t size; /**< size of output buffer */ + size_t pos; /**< position where writing stopped. Will be updated. Necessarily 0 <= pos <= size */ +} ZSTD_outBuffer; + + + +/*-*********************************************************************** +* Streaming compression - HowTo +* +* A ZSTD_CStream object is required to track streaming operation. +* Use ZSTD_createCStream() and ZSTD_freeCStream() to create/release resources. +* ZSTD_CStream objects can be reused multiple times on consecutive compression operations. +* It is recommended to re-use ZSTD_CStream since it will play nicer with system's memory, by re-using already allocated memory. +* +* For parallel execution, use one separate ZSTD_CStream per thread. +* +* note : since v1.3.0, ZSTD_CStream and ZSTD_CCtx are the same thing. +* +* Parameters are sticky : when starting a new compression on the same context, +* it will re-use the same sticky parameters as previous compression session. +* When in doubt, it's recommended to fully initialize the context before usage. +* Use ZSTD_CCtx_reset() to reset the context and ZSTD_CCtx_setParameter(), +* ZSTD_CCtx_setPledgedSrcSize(), or ZSTD_CCtx_loadDictionary() and friends to +* set more specific parameters, the pledged source size, or load a dictionary. +* +* Use ZSTD_compressStream2() with ZSTD_e_continue as many times as necessary to +* consume input stream. The function will automatically update both `pos` +* fields within `input` and `output`. +* Note that the function may not consume the entire input, for example, because +* the output buffer is already full, in which case `input.pos < input.size`. +* The caller must check if input has been entirely consumed. +* If not, the caller must make some room to receive more compressed data, +* and then present again remaining input data. +* note: ZSTD_e_continue is guaranteed to make some forward progress when called, +* but doesn't guarantee maximal forward progress. This is especially relevant +* when compressing with multiple threads. The call won't block if it can +* consume some input, but if it can't it will wait for some, but not all, +* output to be flushed. +* @return : provides a minimum amount of data remaining to be flushed from internal buffers +* or an error code, which can be tested using ZSTD_isError(). +* +* At any moment, it's possible to flush whatever data might remain stuck within internal buffer, +* using ZSTD_compressStream2() with ZSTD_e_flush. `output->pos` will be updated. +* Note that, if `output->size` is too small, a single invocation with ZSTD_e_flush might not be enough (return code > 0). +* In which case, make some room to receive more compressed data, and call again ZSTD_compressStream2() with ZSTD_e_flush. +* You must continue calling ZSTD_compressStream2() with ZSTD_e_flush until it returns 0, at which point you can change the +* operation. +* note: ZSTD_e_flush will flush as much output as possible, meaning when compressing with multiple threads, it will +* block until the flush is complete or the output buffer is full. +* @return : 0 if internal buffers are entirely flushed, +* >0 if some data still present within internal buffer (the value is minimal estimation of remaining size), +* or an error code, which can be tested using ZSTD_isError(). +* +* Calling ZSTD_compressStream2() with ZSTD_e_end instructs to finish a frame. +* It will perform a flush and write frame epilogue. +* The epilogue is required for decoders to consider a frame completed. +* flush operation is the same, and follows same rules as calling ZSTD_compressStream2() with ZSTD_e_flush. +* You must continue calling ZSTD_compressStream2() with ZSTD_e_end until it returns 0, at which point you are free to +* start a new frame. +* note: ZSTD_e_end will flush as much output as possible, meaning when compressing with multiple threads, it will +* block until the flush is complete or the output buffer is full. +* @return : 0 if frame fully completed and fully flushed, +* >0 if some data still present within internal buffer (the value is minimal estimation of remaining size), +* or an error code, which can be tested using ZSTD_isError(). +* +* *******************************************************************/ + +typedef ZSTD_CCtx ZSTD_CStream; /**< CCtx and CStream are now effectively same object (>= v1.3.0) */ + /* Continue to distinguish them for compatibility with older versions <= v1.2.0 */ +/*===== ZSTD_CStream management functions =====*/ +ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream(void); +ZSTDLIB_API size_t ZSTD_freeCStream(ZSTD_CStream* zcs); /* accept NULL pointer */ + +/*===== Streaming compression functions =====*/ +typedef enum { + ZSTD_e_continue=0, /* collect more data, encoder decides when to output compressed result, for optimal compression ratio */ + ZSTD_e_flush=1, /* flush any data provided so far, + * it creates (at least) one new block, that can be decoded immediately on reception; + * frame will continue: any future data can still reference previously compressed data, improving compression. + * note : multithreaded compression will block to flush as much output as possible. */ + ZSTD_e_end=2 /* flush any remaining data _and_ close current frame. + * note that frame is only closed after compressed data is fully flushed (return value == 0). + * After that point, any additional data starts a new frame. + * note : each frame is independent (does not reference any content from previous frame). + : note : multithreaded compression will block to flush as much output as possible. */ +} ZSTD_EndDirective; + +/*! ZSTD_compressStream2() : Requires v1.4.0+ + * Behaves about the same as ZSTD_compressStream, with additional control on end directive. + * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() + * - Compression parameters cannot be changed once compression is started (save a list of exceptions in multi-threading mode) + * - output->pos must be <= dstCapacity, input->pos must be <= srcSize + * - output->pos and input->pos will be updated. They are guaranteed to remain below their respective limit. + * - endOp must be a valid directive + * - When nbWorkers==0 (default), function is blocking : it completes its job before returning to caller. + * - When nbWorkers>=1, function is non-blocking : it copies a portion of input, distributes jobs to internal worker threads, flush to output whatever is available, + * and then immediately returns, just indicating that there is some data remaining to be flushed. + * The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte. + * - Exception : if the first call requests a ZSTD_e_end directive and provides enough dstCapacity, the function delegates to ZSTD_compress2() which is always blocking. + * - @return provides a minimum amount of data remaining to be flushed from internal buffers + * or an error code, which can be tested using ZSTD_isError(). + * if @return != 0, flush is not fully completed, there is still some data left within internal buffers. + * This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers. + * For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed. + * - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0), + * only ZSTD_e_end or ZSTD_e_flush operations are allowed. + * Before starting a new compression job, or changing compression parameters, + * it is required to fully flush internal buffers. + */ +ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, + ZSTD_outBuffer* output, + ZSTD_inBuffer* input, + ZSTD_EndDirective endOp); + + +/* These buffer sizes are softly recommended. + * They are not required : ZSTD_compressStream*() happily accepts any buffer size, for both input and output. + * Respecting the recommended size just makes it a bit easier for ZSTD_compressStream*(), + * reducing the amount of memory shuffling and buffering, resulting in minor performance savings. + * + * However, note that these recommendations are from the perspective of a C caller program. + * If the streaming interface is invoked from some other language, + * especially managed ones such as Java or Go, through a foreign function interface such as jni or cgo, + * a major performance rule is to reduce crossing such interface to an absolute minimum. + * It's not rare that performance ends being spent more into the interface, rather than compression itself. + * In which cases, prefer using large buffers, as large as practical, + * for both input and output, to reduce the nb of roundtrips. + */ +ZSTDLIB_API size_t ZSTD_CStreamInSize(void); /**< recommended size for input buffer */ +ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block. */ + + +/* ***************************************************************************** + * This following is a legacy streaming API, available since v1.0+ . + * It can be replaced by ZSTD_CCtx_reset() and ZSTD_compressStream2(). + * It is redundant, but remains fully supported. + ******************************************************************************/ + +/*! + * Equivalent to: + * + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) + * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * + * Note that ZSTD_initCStream() clears any previously set dictionary. Use the new API + * to compress with a dictionary. + */ +ZSTDLIB_API size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel); +/*! + * Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue). + * NOTE: The return value is different. ZSTD_compressStream() returns a hint for + * the next read size (if non-zero and not an error). ZSTD_compressStream2() + * returns the minimum nb of bytes left to flush (if non-zero and not an error). + */ +ZSTDLIB_API size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input); +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush). */ +ZSTDLIB_API size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end). */ +ZSTDLIB_API size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); + + +/*-*************************************************************************** +* Streaming decompression - HowTo +* +* A ZSTD_DStream object is required to track streaming operations. +* Use ZSTD_createDStream() and ZSTD_freeDStream() to create/release resources. +* ZSTD_DStream objects can be re-used multiple times. +* +* Use ZSTD_initDStream() to start a new decompression operation. +* @return : recommended first input size +* Alternatively, use advanced API to set specific properties. +* +* Use ZSTD_decompressStream() repetitively to consume your input. +* The function will update both `pos` fields. +* If `input.pos < input.size`, some input has not been consumed. +* It's up to the caller to present again remaining data. +* The function tries to flush all data decoded immediately, respecting output buffer size. +* If `output.pos < output.size`, decoder has flushed everything it could. +* But if `output.pos == output.size`, there might be some data left within internal buffers., +* In which case, call ZSTD_decompressStream() again to flush whatever remains in the buffer. +* Note : with no additional input provided, amount of data flushed is necessarily <= ZSTD_BLOCKSIZE_MAX. +* @return : 0 when a frame is completely decoded and fully flushed, +* or an error code, which can be tested using ZSTD_isError(), +* or any other value > 0, which means there is still some decoding or flushing to do to complete current frame : +* the return value is a suggested next input size (just a hint for better latency) +* that will never request more than the remaining frame size. +* *******************************************************************************/ + +typedef ZSTD_DCtx ZSTD_DStream; /**< DCtx and DStream are now effectively same object (>= v1.3.0) */ + /* For compatibility with versions <= v1.2.0, prefer differentiating them. */ +/*===== ZSTD_DStream management functions =====*/ +ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream(void); +ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer */ + +/*===== Streaming decompression functions =====*/ + +/*! ZSTD_initDStream() : + * Initialize/reset DStream state for new decompression operation. + * Call before new decompression operation using same DStream. + * + * Note : This function is redundant with the advanced API and equivalent to: + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * ZSTD_DCtx_refDDict(zds, NULL); + */ +ZSTDLIB_API size_t ZSTD_initDStream(ZSTD_DStream* zds); + +/*! ZSTD_decompressStream() : + * Streaming decompression function. + * Call repetitively to consume full input updating it as necessary. + * Function will update both input and output `pos` fields exposing current state via these fields: + * - `input.pos < input.size`, some input remaining and caller should provide remaining input + * on the next call. + * - `output.pos < output.size`, decoder finished and flushed all remaining buffers. + * - `output.pos == output.size`, potentially uncflushed data present in the internal buffers, + * call ZSTD_decompressStream() again to flush remaining data to output. + * Note : with no additional input, amount of data flushed <= ZSTD_BLOCKSIZE_MAX. + * + * @return : 0 when a frame is completely decoded and fully flushed, + * or an error code, which can be tested using ZSTD_isError(), + * or any other value > 0, which means there is some decoding or flushing to do to complete current frame. + */ +ZSTDLIB_API size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input); + +ZSTDLIB_API size_t ZSTD_DStreamInSize(void); /*!< recommended size for input buffer */ +ZSTDLIB_API size_t ZSTD_DStreamOutSize(void); /*!< recommended size for output buffer. Guarantee to successfully flush at least one complete block in all circumstances. */ + + +/************************** +* Simple dictionary API +***************************/ +/*! ZSTD_compress_usingDict() : + * Compression at an explicit compression level using a Dictionary. + * A dictionary can be any arbitrary data segment (also called a prefix), + * or a buffer with specified information (see zdict.h). + * Note : This function loads the dictionary, resulting in significant startup delay. + * It's intended for a dictionary used only once. + * Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used. */ +ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + int compressionLevel); + +/*! ZSTD_decompress_usingDict() : + * Decompression using a known Dictionary. + * Dictionary must be identical to the one used during compression. + * Note : This function loads the dictionary, resulting in significant startup delay. + * It's intended for a dictionary used only once. + * Note : When `dict == NULL || dictSize < 8` no dictionary is used. */ +ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize); + + +/*********************************** + * Bulk processing dictionary API + **********************************/ +typedef struct ZSTD_CDict_s ZSTD_CDict; + +/*! ZSTD_createCDict() : + * When compressing multiple messages or blocks using the same dictionary, + * it's recommended to digest the dictionary only once, since it's a costly operation. + * ZSTD_createCDict() will create a state from digesting a dictionary. + * The resulting state can be used for future compression operations with very limited startup cost. + * ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. + * @dictBuffer can be released after ZSTD_CDict creation, because its content is copied within CDict. + * Note 1 : Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate @dictBuffer content. + * Note 2 : A ZSTD_CDict can be created from an empty @dictBuffer, + * in which case the only thing that it transports is the @compressionLevel. + * This can be useful in a pipeline featuring ZSTD_compress_usingCDict() exclusively, + * expecting a ZSTD_CDict parameter with any data, including those without a known dictionary. */ +ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize, + int compressionLevel); + +/*! ZSTD_freeCDict() : + * Function frees memory allocated by ZSTD_createCDict(). + * If a NULL pointer is passed, no operation is performed. */ +ZSTDLIB_API size_t ZSTD_freeCDict(ZSTD_CDict* CDict); + +/*! ZSTD_compress_usingCDict() : + * Compression using a digested Dictionary. + * Recommended when same dictionary is used multiple times. + * Note : compression level is _decided at dictionary creation time_, + * and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) */ +ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_CDict* cdict); + + +typedef struct ZSTD_DDict_s ZSTD_DDict; + +/*! ZSTD_createDDict() : + * Create a digested dictionary, ready to start decompression operation without startup delay. + * dictBuffer can be released after DDict creation, as its content is copied inside DDict. */ +ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize); + +/*! ZSTD_freeDDict() : + * Function frees memory allocated with ZSTD_createDDict() + * If a NULL pointer is passed, no operation is performed. */ +ZSTDLIB_API size_t ZSTD_freeDDict(ZSTD_DDict* ddict); + +/*! ZSTD_decompress_usingDDict() : + * Decompression using a digested Dictionary. + * Recommended when same dictionary is used multiple times. */ +ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_DDict* ddict); + + +/******************************** + * Dictionary helper functions + *******************************/ + +/*! ZSTD_getDictID_fromDict() : Requires v1.4.0+ + * Provides the dictID stored within dictionary. + * if @return == 0, the dictionary is not conformant with Zstandard specification. + * It can still be loaded, but as a content-only dictionary. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize); + +/*! ZSTD_getDictID_fromCDict() : Requires v1.5.0+ + * Provides the dictID of the dictionary loaded into `cdict`. + * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromCDict(const ZSTD_CDict* cdict); + +/*! ZSTD_getDictID_fromDDict() : Requires v1.4.0+ + * Provides the dictID of the dictionary loaded into `ddict`. + * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict); + +/*! ZSTD_getDictID_fromFrame() : Requires v1.4.0+ + * Provides the dictID required to decompressed the frame stored within `src`. + * If @return == 0, the dictID could not be decoded. + * This could for one of the following reasons : + * - The frame does not require a dictionary to be decoded (most common case). + * - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information. + * Note : this use case also happens when using a non-conformant dictionary. + * - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`). + * - This is not a Zstandard frame. + * When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize); + + +/******************************************************************************* + * Advanced dictionary and prefix API (Requires v1.4.0+) + * + * This API allows dictionaries to be used with ZSTD_compress2(), + * ZSTD_compressStream2(), and ZSTD_decompressDCtx(). + * Dictionaries are sticky, they remain valid when same context is re-used, + * they only reset when the context is reset + * with ZSTD_reset_parameters or ZSTD_reset_session_and_parameters. + * In contrast, Prefixes are single-use. + ******************************************************************************/ + + +/*! ZSTD_CCtx_loadDictionary() : Requires v1.4.0+ + * Create an internal CDict from `dict` buffer. + * Decompression will have to use same dictionary. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary, + * meaning "return to no-dictionary mode". + * Note 1 : Dictionary is sticky, it will be used for all future compressed frames, + * until parameters are reset, a new dictionary is loaded, or the dictionary + * is explicitly invalidated by loading a NULL dictionary. + * Note 2 : Loading a dictionary involves building tables. + * It's also a CPU consuming operation, with non-negligible impact on latency. + * Tables are dependent on compression parameters, and for this reason, + * compression parameters can no longer be changed after loading a dictionary. + * Note 3 :`dict` content will be copied internally. + * Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead. + * In such a case, dictionary buffer must outlive its users. + * Note 4 : Use ZSTD_CCtx_loadDictionary_advanced() + * to precisely select how dictionary content must be interpreted. + * Note 5 : This method does not benefit from LDM (long distance mode). + * If you want to employ LDM on some large dictionary content, + * prefer employing ZSTD_CCtx_refPrefix() described below. + */ +ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); + +/*! ZSTD_CCtx_refCDict() : Requires v1.4.0+ + * Reference a prepared dictionary, to be used for all future compressed frames. + * Note that compression parameters are enforced from within CDict, + * and supersede any compression parameter previously set within CCtx. + * The parameters ignored are labelled as "superseded-by-cdict" in the ZSTD_cParameter enum docs. + * The ignored parameters will be used again if the CCtx is returned to no-dictionary mode. + * The dictionary will remain valid for future compressed frames using same CCtx. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special : Referencing a NULL CDict means "return to no-dictionary mode". + * Note 1 : Currently, only one dictionary can be managed. + * Referencing a new dictionary effectively "discards" any previous one. + * Note 2 : CDict is just referenced, its lifetime must outlive its usage within CCtx. */ +ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); + +/*! ZSTD_CCtx_refPrefix() : Requires v1.4.0+ + * Reference a prefix (single-usage dictionary) for next compressed frame. + * A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end). + * Decompression will need same prefix to properly regenerate data. + * Compressing with a prefix is similar in outcome as performing a diff and compressing it, + * but performs much faster, especially during decompression (compression speed is tunable with compression level). + * This method is compatible with LDM (long distance mode). + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary + * Note 1 : Prefix buffer is referenced. It **must** outlive compression. + * Its content must remain unmodified during compression. + * Note 2 : If the intention is to diff some large src data blob with some prior version of itself, + * ensure that the window size is large enough to contain the entire source. + * See ZSTD_c_windowLog. + * Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters. + * It's a CPU consuming operation, with non-negligible impact on latency. + * If there is a need to use the same prefix multiple times, consider loadDictionary instead. + * Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dct_rawContent). + * Use experimental ZSTD_CCtx_refPrefix_advanced() to alter dictionary interpretation. */ +ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, + const void* prefix, size_t prefixSize); + +/*! ZSTD_DCtx_loadDictionary() : Requires v1.4.0+ + * Create an internal DDict from dict buffer, to be used to decompress all future frames. + * The dictionary remains valid for all future frames, until explicitly invalidated, or + * a new dictionary is loaded. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary, + * meaning "return to no-dictionary mode". + * Note 1 : Loading a dictionary involves building tables, + * which has a non-negligible impact on CPU usage and latency. + * It's recommended to "load once, use many times", to amortize the cost + * Note 2 :`dict` content will be copied internally, so `dict` can be released after loading. + * Use ZSTD_DCtx_loadDictionary_byReference() to reference dictionary content instead. + * Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to take control of + * how dictionary content is loaded and interpreted. + */ +ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); + +/*! ZSTD_DCtx_refDDict() : Requires v1.4.0+ + * Reference a prepared dictionary, to be used to decompress next frames. + * The dictionary remains active for decompression of future frames using same DCtx. + * + * If called with ZSTD_d_refMultipleDDicts enabled, repeated calls of this function + * will store the DDict references in a table, and the DDict used for decompression + * will be determined at decompression time, as per the dict ID in the frame. + * The memory for the table is allocated on the first call to refDDict, and can be + * freed with ZSTD_freeDCtx(). + * + * If called with ZSTD_d_refMultipleDDicts disabled (the default), only one dictionary + * will be managed, and referencing a dictionary effectively "discards" any previous one. + * + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special: referencing a NULL DDict means "return to no-dictionary mode". + * Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx. + */ +ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); + +/*! ZSTD_DCtx_refPrefix() : Requires v1.4.0+ + * Reference a prefix (single-usage dictionary) to decompress next frame. + * This is the reverse operation of ZSTD_CCtx_refPrefix(), + * and must use the same prefix as the one used during compression. + * Prefix is **only used once**. Reference is discarded at end of frame. + * End of frame is reached when ZSTD_decompressStream() returns 0. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary + * Note 2 : Prefix buffer is referenced. It **must** outlive decompression. + * Prefix buffer must remain unmodified up to the end of frame, + * reached when ZSTD_decompressStream() returns 0. + * Note 3 : By default, the prefix is treated as raw content (ZSTD_dct_rawContent). + * Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode (Experimental section) + * Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost. + * A full dictionary is more costly, as it requires building tables. + */ +ZSTDLIB_API size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, + const void* prefix, size_t prefixSize); + +/* === Memory management === */ + +/*! ZSTD_sizeof_*() : Requires v1.4.0+ + * These functions give the _current_ memory usage of selected object. + * Note that object memory usage can evolve (increase or decrease) over time. */ +ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx); +ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx); +ZSTDLIB_API size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs); +ZSTDLIB_API size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds); +ZSTDLIB_API size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict); +ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); + +#endif /* ZSTD_H_235446 */ + + +/* ************************************************************************************** + * ADVANCED AND EXPERIMENTAL FUNCTIONS + **************************************************************************************** + * The definitions in the following section are considered experimental. + * They are provided for advanced scenarios. + * They should never be used with a dynamic library, as prototypes may change in the future. + * Use them only in association with static linking. + * ***************************************************************************************/ + +#if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY) +#define ZSTD_H_ZSTD_STATIC_LINKING_ONLY + +/* This can be overridden externally to hide static symbols. */ +#ifndef ZSTDLIB_STATIC_API +# if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDLIB_STATIC_API __declspec(dllexport) ZSTDLIB_VISIBLE +# elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDLIB_STATIC_API __declspec(dllimport) ZSTDLIB_VISIBLE +# else +# define ZSTDLIB_STATIC_API ZSTDLIB_VISIBLE +# endif +#endif + +/**************************************************************************************** + * experimental API (static linking only) + **************************************************************************************** + * The following symbols and constants + * are not planned to join "stable API" status in the near future. + * They can still change in future versions. + * Some of them are planned to remain in the static_only section indefinitely. + * Some of them might be removed in the future (especially when redundant with existing stable functions) + * ***************************************************************************************/ + +#define ZSTD_FRAMEHEADERSIZE_PREFIX(format) ((format) == ZSTD_f_zstd1 ? 5 : 1) /* minimum input size required to query frame header size */ +#define ZSTD_FRAMEHEADERSIZE_MIN(format) ((format) == ZSTD_f_zstd1 ? 6 : 2) +#define ZSTD_FRAMEHEADERSIZE_MAX 18 /* can be useful for static allocation */ +#define ZSTD_SKIPPABLEHEADERSIZE 8 + +/* compression parameter bounds */ +#define ZSTD_WINDOWLOG_MAX_32 30 +#define ZSTD_WINDOWLOG_MAX_64 31 +#define ZSTD_WINDOWLOG_MAX ((int)(sizeof(size_t) == 4 ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64)) +#define ZSTD_WINDOWLOG_MIN 10 +#define ZSTD_HASHLOG_MAX ((ZSTD_WINDOWLOG_MAX < 30) ? ZSTD_WINDOWLOG_MAX : 30) +#define ZSTD_HASHLOG_MIN 6 +#define ZSTD_CHAINLOG_MAX_32 29 +#define ZSTD_CHAINLOG_MAX_64 30 +#define ZSTD_CHAINLOG_MAX ((int)(sizeof(size_t) == 4 ? ZSTD_CHAINLOG_MAX_32 : ZSTD_CHAINLOG_MAX_64)) +#define ZSTD_CHAINLOG_MIN ZSTD_HASHLOG_MIN +#define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1) +#define ZSTD_SEARCHLOG_MIN 1 +#define ZSTD_MINMATCH_MAX 7 /* only for ZSTD_fast, other strategies are limited to 6 */ +#define ZSTD_MINMATCH_MIN 3 /* only for ZSTD_btopt+, faster strategies are limited to 4 */ +#define ZSTD_TARGETLENGTH_MAX ZSTD_BLOCKSIZE_MAX +#define ZSTD_TARGETLENGTH_MIN 0 /* note : comparing this constant to an unsigned results in a tautological test */ +#define ZSTD_STRATEGY_MIN ZSTD_fast +#define ZSTD_STRATEGY_MAX ZSTD_btultra2 +#define ZSTD_BLOCKSIZE_MAX_MIN (1 << 10) /* The minimum valid max blocksize. Maximum blocksizes smaller than this make compressBound() inaccurate. */ + + +#define ZSTD_OVERLAPLOG_MIN 0 +#define ZSTD_OVERLAPLOG_MAX 9 + +#define ZSTD_WINDOWLOG_LIMIT_DEFAULT 27 /* by default, the streaming decoder will refuse any frame + * requiring larger than (1< 0: + * If litLength != 0: + * rep == 1 --> offset == repeat_offset_1 + * rep == 2 --> offset == repeat_offset_2 + * rep == 3 --> offset == repeat_offset_3 + * If litLength == 0: + * rep == 1 --> offset == repeat_offset_2 + * rep == 2 --> offset == repeat_offset_3 + * rep == 3 --> offset == repeat_offset_1 - 1 + * + * Note: This field is optional. ZSTD_generateSequences() will calculate the value of + * 'rep', but repeat offsets do not necessarily need to be calculated from an external + * sequence provider's perspective. For example, ZSTD_compressSequences() does not + * use this 'rep' field at all (as of now). + */ +} ZSTD_Sequence; + +typedef struct { + unsigned windowLog; /**< largest match distance : larger == more compression, more memory needed during decompression */ + unsigned chainLog; /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */ + unsigned hashLog; /**< dispatch table : larger == faster, more memory */ + unsigned searchLog; /**< nb of searches : larger == more compression, slower */ + unsigned minMatch; /**< match length searched : larger == faster decompression, sometimes less compression */ + unsigned targetLength; /**< acceptable match size for optimal parser (only) : larger == more compression, slower */ + ZSTD_strategy strategy; /**< see ZSTD_strategy definition above */ +} ZSTD_compressionParameters; + +typedef struct { + int contentSizeFlag; /**< 1: content size will be in frame header (when known) */ + int checksumFlag; /**< 1: generate a 32-bits checksum using XXH64 algorithm at end of frame, for error detection */ + int noDictIDFlag; /**< 1: no dictID will be saved into frame header (dictID is only useful for dictionary compression) */ +} ZSTD_frameParameters; + +typedef struct { + ZSTD_compressionParameters cParams; + ZSTD_frameParameters fParams; +} ZSTD_parameters; + +typedef enum { + ZSTD_dct_auto = 0, /* dictionary is "full" when starting with ZSTD_MAGIC_DICTIONARY, otherwise it is "rawContent" */ + ZSTD_dct_rawContent = 1, /* ensures dictionary is always loaded as rawContent, even if it starts with ZSTD_MAGIC_DICTIONARY */ + ZSTD_dct_fullDict = 2 /* refuses to load a dictionary if it does not respect Zstandard's specification, starting with ZSTD_MAGIC_DICTIONARY */ +} ZSTD_dictContentType_e; + +typedef enum { + ZSTD_dlm_byCopy = 0, /**< Copy dictionary content internally */ + ZSTD_dlm_byRef = 1 /**< Reference dictionary content -- the dictionary buffer must outlive its users. */ +} ZSTD_dictLoadMethod_e; + +typedef enum { + ZSTD_f_zstd1 = 0, /* zstd frame format, specified in zstd_compression_format.md (default) */ + ZSTD_f_zstd1_magicless = 1 /* Variant of zstd frame format, without initial 4-bytes magic number. + * Useful to save 4 bytes per generated frame. + * Decoder cannot recognise automatically this format, requiring this instruction. */ +} ZSTD_format_e; + +typedef enum { + /* Note: this enum controls ZSTD_d_forceIgnoreChecksum */ + ZSTD_d_validateChecksum = 0, + ZSTD_d_ignoreChecksum = 1 +} ZSTD_forceIgnoreChecksum_e; + +typedef enum { + /* Note: this enum controls ZSTD_d_refMultipleDDicts */ + ZSTD_rmd_refSingleDDict = 0, + ZSTD_rmd_refMultipleDDicts = 1 +} ZSTD_refMultipleDDicts_e; + +typedef enum { + /* Note: this enum and the behavior it controls are effectively internal + * implementation details of the compressor. They are expected to continue + * to evolve and should be considered only in the context of extremely + * advanced performance tuning. + * + * Zstd currently supports the use of a CDict in three ways: + * + * - The contents of the CDict can be copied into the working context. This + * means that the compression can search both the dictionary and input + * while operating on a single set of internal tables. This makes + * the compression faster per-byte of input. However, the initial copy of + * the CDict's tables incurs a fixed cost at the beginning of the + * compression. For small compressions (< 8 KB), that copy can dominate + * the cost of the compression. + * + * - The CDict's tables can be used in-place. In this model, compression is + * slower per input byte, because the compressor has to search two sets of + * tables. However, this model incurs no start-up cost (as long as the + * working context's tables can be reused). For small inputs, this can be + * faster than copying the CDict's tables. + * + * - The CDict's tables are not used at all, and instead we use the working + * context alone to reload the dictionary and use params based on the source + * size. See ZSTD_compress_insertDictionary() and ZSTD_compress_usingDict(). + * This method is effective when the dictionary sizes are very small relative + * to the input size, and the input size is fairly large to begin with. + * + * Zstd has a simple internal heuristic that selects which strategy to use + * at the beginning of a compression. However, if experimentation shows that + * Zstd is making poor choices, it is possible to override that choice with + * this enum. + */ + ZSTD_dictDefaultAttach = 0, /* Use the default heuristic. */ + ZSTD_dictForceAttach = 1, /* Never copy the dictionary. */ + ZSTD_dictForceCopy = 2, /* Always copy the dictionary. */ + ZSTD_dictForceLoad = 3 /* Always reload the dictionary */ +} ZSTD_dictAttachPref_e; + +typedef enum { + ZSTD_lcm_auto = 0, /**< Automatically determine the compression mode based on the compression level. + * Negative compression levels will be uncompressed, and positive compression + * levels will be compressed. */ + ZSTD_lcm_huffman = 1, /**< Always attempt Huffman compression. Uncompressed literals will still be + * emitted if Huffman compression is not profitable. */ + ZSTD_lcm_uncompressed = 2 /**< Always emit uncompressed literals. */ +} ZSTD_literalCompressionMode_e; + +typedef enum { + /* Note: This enum controls features which are conditionally beneficial. Zstd typically will make a final + * decision on whether or not to enable the feature (ZSTD_ps_auto), but setting the switch to ZSTD_ps_enable + * or ZSTD_ps_disable allow for a force enable/disable the feature. + */ + ZSTD_ps_auto = 0, /* Let the library automatically determine whether the feature shall be enabled */ + ZSTD_ps_enable = 1, /* Force-enable the feature */ + ZSTD_ps_disable = 2 /* Do not use the feature */ +} ZSTD_paramSwitch_e; + +/*************************************** +* Frame header and size functions +***************************************/ + +/*! ZSTD_findDecompressedSize() : + * `src` should point to the start of a series of ZSTD encoded and/or skippable frames + * `srcSize` must be the _exact_ size of this series + * (i.e. there should be a frame boundary at `src + srcSize`) + * @return : - decompressed size of all data in all successive frames + * - if the decompressed size cannot be determined: ZSTD_CONTENTSIZE_UNKNOWN + * - if an error occurred: ZSTD_CONTENTSIZE_ERROR + * + * note 1 : decompressed size is an optional field, that may not be present, especially in streaming mode. + * When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. + * In which case, it's necessary to use streaming mode to decompress data. + * note 2 : decompressed size is always present when compression is done with ZSTD_compress() + * note 3 : decompressed size can be very large (64-bits value), + * potentially larger than what local system can handle as a single memory segment. + * In which case, it's necessary to use streaming mode to decompress data. + * note 4 : If source is untrusted, decompressed size could be wrong or intentionally modified. + * Always ensure result fits within application's authorized limits. + * Each application can set its own limits. + * note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to + * read each contained frame header. This is fast as most of the data is skipped, + * however it does mean that all frame data must be present and valid. */ +ZSTDLIB_STATIC_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize); + +/*! ZSTD_decompressBound() : + * `src` should point to the start of a series of ZSTD encoded and/or skippable frames + * `srcSize` must be the _exact_ size of this series + * (i.e. there should be a frame boundary at `src + srcSize`) + * @return : - upper-bound for the decompressed size of all data in all successive frames + * - if an error occurred: ZSTD_CONTENTSIZE_ERROR + * + * note 1 : an error can occur if `src` contains an invalid or incorrectly formatted frame. + * note 2 : the upper-bound is exact when the decompressed size field is available in every ZSTD encoded frame of `src`. + * in this case, `ZSTD_findDecompressedSize` and `ZSTD_decompressBound` return the same value. + * note 3 : when the decompressed size field isn't available, the upper-bound for that frame is calculated by: + * upper-bound = # blocks * min(128 KB, Window_Size) + */ +ZSTDLIB_STATIC_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize); + +/*! ZSTD_frameHeaderSize() : + * srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX. + * @return : size of the Frame Header, + * or an error code (if srcSize is too small) */ +ZSTDLIB_STATIC_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize); + +typedef enum { ZSTD_frame, ZSTD_skippableFrame } ZSTD_frameType_e; +typedef struct { + unsigned long long frameContentSize; /* if == ZSTD_CONTENTSIZE_UNKNOWN, it means this field is not available. 0 means "empty" */ + unsigned long long windowSize; /* can be very large, up to <= frameContentSize */ + unsigned blockSizeMax; + ZSTD_frameType_e frameType; /* if == ZSTD_skippableFrame, frameContentSize is the size of skippable content */ + unsigned headerSize; + unsigned dictID; + unsigned checksumFlag; + unsigned _reserved1; + unsigned _reserved2; +} ZSTD_frameHeader; + +/*! ZSTD_getFrameHeader() : + * decode Frame Header, or requires larger `srcSize`. + * @return : 0, `zfhPtr` is correctly filled, + * >0, `srcSize` is too small, value is wanted `srcSize` amount, + * or an error code, which can be tested using ZSTD_isError() */ +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */ +/*! ZSTD_getFrameHeader_advanced() : + * same as ZSTD_getFrameHeader(), + * with added capability to select a format (like ZSTD_f_zstd1_magicless) */ +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format); + +/*! ZSTD_decompressionMargin() : + * Zstd supports in-place decompression, where the input and output buffers overlap. + * In this case, the output buffer must be at least (Margin + Output_Size) bytes large, + * and the input buffer must be at the end of the output buffer. + * + * _______________________ Output Buffer ________________________ + * | | + * | ____ Input Buffer ____| + * | | | + * v v v + * |---------------------------------------|-----------|----------| + * ^ ^ ^ + * |___________________ Output_Size ___________________|_ Margin _| + * + * NOTE: See also ZSTD_DECOMPRESSION_MARGIN(). + * NOTE: This applies only to single-pass decompression through ZSTD_decompress() or + * ZSTD_decompressDCtx(). + * NOTE: This function supports multi-frame input. + * + * @param src The compressed frame(s) + * @param srcSize The size of the compressed frame(s) + * @returns The decompression margin or an error that can be checked with ZSTD_isError(). + */ +ZSTDLIB_STATIC_API size_t ZSTD_decompressionMargin(const void* src, size_t srcSize); + +/*! ZSTD_DECOMPRESS_MARGIN() : + * Similar to ZSTD_decompressionMargin(), but instead of computing the margin from + * the compressed frame, compute it from the original size and the blockSizeLog. + * See ZSTD_decompressionMargin() for details. + * + * WARNING: This macro does not support multi-frame input, the input must be a single + * zstd frame. If you need that support use the function, or implement it yourself. + * + * @param originalSize The original uncompressed size of the data. + * @param blockSize The block size == MIN(windowSize, ZSTD_BLOCKSIZE_MAX). + * Unless you explicitly set the windowLog smaller than + * ZSTD_BLOCKSIZELOG_MAX you can just use ZSTD_BLOCKSIZE_MAX. + */ +#define ZSTD_DECOMPRESSION_MARGIN(originalSize, blockSize) ((size_t)( \ + ZSTD_FRAMEHEADERSIZE_MAX /* Frame header */ + \ + 4 /* checksum */ + \ + ((originalSize) == 0 ? 0 : 3 * (((originalSize) + (blockSize) - 1) / blockSize)) /* 3 bytes per block */ + \ + (blockSize) /* One block of margin */ \ + )) + +typedef enum { + ZSTD_sf_noBlockDelimiters = 0, /* Representation of ZSTD_Sequence has no block delimiters, sequences only */ + ZSTD_sf_explicitBlockDelimiters = 1 /* Representation of ZSTD_Sequence contains explicit block delimiters */ +} ZSTD_sequenceFormat_e; + +/*! ZSTD_sequenceBound() : + * `srcSize` : size of the input buffer + * @return : upper-bound for the number of sequences that can be generated + * from a buffer of srcSize bytes + * + * note : returns number of sequences - to get bytes, multiply by sizeof(ZSTD_Sequence). + */ +ZSTDLIB_STATIC_API size_t ZSTD_sequenceBound(size_t srcSize); + +/*! ZSTD_generateSequences() : + * Generate sequences using ZSTD_compress2(), given a source buffer. + * + * Each block will end with a dummy sequence + * with offset == 0, matchLength == 0, and litLength == length of last literals. + * litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0) + * simply acts as a block delimiter. + * + * @zc can be used to insert custom compression params. + * This function invokes ZSTD_compress2(). + * + * The output of this function can be fed into ZSTD_compressSequences() with CCtx + * setting of ZSTD_c_blockDelimiters as ZSTD_sf_explicitBlockDelimiters + * @return : number of sequences generated + */ + +ZSTDLIB_STATIC_API size_t +ZSTD_generateSequences( ZSTD_CCtx* zc, + ZSTD_Sequence* outSeqs, size_t outSeqsSize, + const void* src, size_t srcSize); + +/*! ZSTD_mergeBlockDelimiters() : + * Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals + * by merging them into the literals of the next sequence. + * + * As such, the final generated result has no explicit representation of block boundaries, + * and the final last literals segment is not represented in the sequences. + * + * The output of this function can be fed into ZSTD_compressSequences() with CCtx + * setting of ZSTD_c_blockDelimiters as ZSTD_sf_noBlockDelimiters + * @return : number of sequences left after merging + */ +ZSTDLIB_STATIC_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize); + +/*! ZSTD_compressSequences() : + * Compress an array of ZSTD_Sequence, associated with @src buffer, into dst. + * @src contains the entire input (not just the literals). + * If @srcSize > sum(sequence.length), the remaining bytes are considered all literals + * If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.) + * The entire source is compressed into a single frame. + * + * The compression behavior changes based on cctx params. In particular: + * If ZSTD_c_blockDelimiters == ZSTD_sf_noBlockDelimiters, the array of ZSTD_Sequence is expected to contain + * no block delimiters (defined in ZSTD_Sequence). Block boundaries are roughly determined based on + * the block size derived from the cctx, and sequences may be split. This is the default setting. + * + * If ZSTD_c_blockDelimiters == ZSTD_sf_explicitBlockDelimiters, the array of ZSTD_Sequence is expected to contain + * block delimiters (defined in ZSTD_Sequence). Behavior is undefined if no block delimiters are provided. + * + * If ZSTD_c_validateSequences == 0, this function will blindly accept the sequences provided. Invalid sequences cause undefined + * behavior. If ZSTD_c_validateSequences == 1, then if sequence is invalid (see doc/zstd_compression_format.md for + * specifics regarding offset/matchlength requirements) then the function will bail out and return an error. + * + * In addition to the two adjustable experimental params, there are other important cctx params. + * - ZSTD_c_minMatch MUST be set as less than or equal to the smallest match generated by the match finder. It has a minimum value of ZSTD_MINMATCH_MIN. + * - ZSTD_c_compressionLevel accordingly adjusts the strength of the entropy coder, as it would in typical compression. + * - ZSTD_c_windowLog affects offset validation: this function will return an error at higher debug levels if a provided offset + * is larger than what the spec allows for a given window log and dictionary (if present). See: doc/zstd_compression_format.md + * + * Note: Repcodes are, as of now, always re-calculated within this function, so ZSTD_Sequence::rep is unused. + * Note 2: Once we integrate ability to ingest repcodes, the explicit block delims mode must respect those repcodes exactly, + * and cannot emit an RLE block that disagrees with the repcode history + * @return : final compressed size, or a ZSTD error code. + */ +ZSTDLIB_STATIC_API size_t +ZSTD_compressSequences( ZSTD_CCtx* cctx, void* dst, size_t dstSize, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, + const void* src, size_t srcSize); + + +/*! ZSTD_writeSkippableFrame() : + * Generates a zstd skippable frame containing data given by src, and writes it to dst buffer. + * + * Skippable frames begin with a 4-byte magic number. There are 16 possible choices of magic number, + * ranging from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15. + * As such, the parameter magicVariant controls the exact skippable frame magic number variant used, so + * the magic number used will be ZSTD_MAGIC_SKIPPABLE_START + magicVariant. + * + * Returns an error if destination buffer is not large enough, if the source size is not representable + * with a 4-byte unsigned int, or if the parameter magicVariant is greater than 15 (and therefore invalid). + * + * @return : number of bytes written or a ZSTD error. + */ +ZSTDLIB_STATIC_API size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity, + const void* src, size_t srcSize, unsigned magicVariant); + +/*! ZSTD_readSkippableFrame() : + * Retrieves a zstd skippable frame containing data given by src, and writes it to dst buffer. + * + * The parameter magicVariant will receive the magicVariant that was supplied when the frame was written, + * i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested + * in the magicVariant. + * + * Returns an error if destination buffer is not large enough, or if the frame is not skippable. + * + * @return : number of bytes written or a ZSTD error. + */ +ZSTDLIB_API size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity, unsigned* magicVariant, + const void* src, size_t srcSize); + +/*! ZSTD_isSkippableFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame. + */ +ZSTDLIB_API unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size); + + + +/*************************************** +* Memory management +***************************************/ + +/*! ZSTD_estimate*() : + * These functions make it possible to estimate memory usage + * of a future {D,C}Ctx, before its creation. + * + * ZSTD_estimateCCtxSize() will provide a memory budget large enough + * for any compression level up to selected one. + * Note : Unlike ZSTD_estimateCStreamSize*(), this estimate + * does not include space for a window buffer. + * Therefore, the estimation is only guaranteed for single-shot compressions, not streaming. + * The estimate will assume the input may be arbitrarily large, + * which is the worst case. + * + * When srcSize can be bound by a known and rather "small" value, + * this fact can be used to provide a tighter estimation + * because the CCtx compression context will need less memory. + * This tighter estimation can be provided by more advanced functions + * ZSTD_estimateCCtxSize_usingCParams(), which can be used in tandem with ZSTD_getCParams(), + * and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter(). + * Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits. + * + * Note : only single-threaded compression is supported. + * ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + * + * Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + * Size estimates assume that no external sequence producer is registered. + */ +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize(int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void); + +/*! ZSTD_estimateCStreamSize() : + * ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one. + * It will also consider src size to be arbitrarily "large", which is worst case. + * If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation. + * ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel. + * ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParams_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_c_nbWorkers is >= 1. + * Note : CStream size estimation is only correct for single-threaded compression. + * ZSTD_DStream memory budget depends on window Size. + * This information can be passed manually, using ZSTD_estimateDStreamSize, + * or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame(); + * Note : if streaming is init with function ZSTD_init?Stream_usingDict(), + * an internal ?Dict will be created, which additional size is not estimated here. + * In this case, get total size by adding ZSTD_estimate?DictSize + * Note 2 : only single-threaded compression is supported. + * ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + * Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + * Size estimates assume that no external sequence producer is registered. + */ +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize(int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize(size_t windowSize); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize); + +/*! ZSTD_estimate?DictSize() : + * ZSTD_estimateCDictSize() will bet that src size is relatively "small", and content is copied, like ZSTD_createCDict(). + * ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced(). + * Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller. + */ +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod); + +/*! ZSTD_initStatic*() : + * Initialize an object using a pre-allocated fixed-size buffer. + * workspace: The memory area to emplace the object into. + * Provided pointer *must be 8-bytes aligned*. + * Buffer must outlive object. + * workspaceSize: Use ZSTD_estimate*Size() to determine + * how large workspace must be to support target scenario. + * @return : pointer to object (same address as workspace, just different type), + * or NULL if error (size too small, incorrect alignment, etc.) + * Note : zstd will never resize nor malloc() when using a static buffer. + * If the object requires more memory than available, + * zstd will just error out (typically ZSTD_error_memory_allocation). + * Note 2 : there is no corresponding "free" function. + * Since workspace is allocated externally, it must be freed externally too. + * Note 3 : cParams : use ZSTD_getCParams() to convert a compression level + * into its associated cParams. + * Limitation 1 : currently not compatible with internal dictionary creation, triggered by + * ZSTD_CCtx_loadDictionary(), ZSTD_initCStream_usingDict() or ZSTD_initDStream_usingDict(). + * Limitation 2 : static cctx currently not compatible with multi-threading. + * Limitation 3 : static dctx is incompatible with legacy support. + */ +ZSTDLIB_STATIC_API ZSTD_CCtx* ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize); +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticCCtx() */ + +ZSTDLIB_STATIC_API ZSTD_DCtx* ZSTD_initStaticDCtx(void* workspace, size_t workspaceSize); +ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticDCtx() */ + +ZSTDLIB_STATIC_API const ZSTD_CDict* ZSTD_initStaticCDict( + void* workspace, size_t workspaceSize, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_compressionParameters cParams); + +ZSTDLIB_STATIC_API const ZSTD_DDict* ZSTD_initStaticDDict( + void* workspace, size_t workspaceSize, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType); + + +/*! Custom memory allocation : + * These prototypes make it possible to pass your own allocation/free functions. + * ZSTD_customMem is provided at creation time, using ZSTD_create*_advanced() variants listed below. + * All allocation/free operations will be completed using these custom variants instead of regular ones. + */ +typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size); +typedef void (*ZSTD_freeFunction) (void* opaque, void* address); +typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; void* opaque; } ZSTD_customMem; +static +#ifdef __GNUC__ +__attribute__((__unused__)) +#endif +ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */ + +ZSTDLIB_STATIC_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem); + +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_compressionParameters cParams, + ZSTD_customMem customMem); + +/*! Thread pool : + * These prototypes make it possible to share a thread pool among multiple compression contexts. + * This can limit resources for applications with multiple threads where each one uses + * a threaded compression mode (via ZSTD_c_nbWorkers parameter). + * ZSTD_createThreadPool creates a new thread pool with a given number of threads. + * Note that the lifetime of such pool must exist while being used. + * ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value + * to use an internal thread pool). + * ZSTD_freeThreadPool frees a thread pool, accepts NULL pointer. + */ +typedef struct POOL_ctx_s ZSTD_threadPool; +ZSTDLIB_STATIC_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads); +ZSTDLIB_STATIC_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool); /* accept NULL pointer */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool); + + +/* + * This API is temporary and is expected to change or disappear in the future! + */ +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced2( + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + const ZSTD_CCtx_params* cctxParams, + ZSTD_customMem customMem); + +ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_advanced( + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_customMem customMem); + + +/*************************************** +* Advanced compression functions +***************************************/ + +/*! ZSTD_createCDict_byReference() : + * Create a digested dictionary for compression + * Dictionary content is just referenced, not duplicated. + * As a consequence, `dictBuffer` **must** outlive CDict, + * and its content must remain unmodified throughout the lifetime of CDict. + * note: equivalent to ZSTD_createCDict_advanced(), with dictLoadMethod==ZSTD_dlm_byRef */ +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel); + +/*! ZSTD_getCParams() : + * @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize. + * `estimatedSrcSize` value is optional, select 0 if not known */ +ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); + +/*! ZSTD_getParams() : + * same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`. + * All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0 */ +ZSTDLIB_STATIC_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); + +/*! ZSTD_checkCParams() : + * Ensure param values remain within authorized range. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()) */ +ZSTDLIB_STATIC_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); + +/*! ZSTD_adjustCParams() : + * optimize params for a given `srcSize` and `dictSize`. + * `srcSize` can be unknown, in which case use ZSTD_CONTENTSIZE_UNKNOWN. + * `dictSize` must be `0` when there is no dictionary. + * cPar can be invalid : all parameters will be clamped within valid range in the @return struct. + * This function never fails (wide contract) */ +ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); + +/*! ZSTD_CCtx_setCParams() : + * Set all parameters provided within @p cparams into the working @p cctx. + * Note : if modifying parameters during compression (MT mode only), + * note that changes to the .windowLog parameter will be ignored. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()). + * On failure, no parameters are updated. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams); + +/*! ZSTD_CCtx_setFParams() : + * Set all parameters provided within @p fparams into the working @p cctx. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setFParams(ZSTD_CCtx* cctx, ZSTD_frameParameters fparams); + +/*! ZSTD_CCtx_setParams() : + * Set all parameters provided within @p params into the working @p cctx. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParams(ZSTD_CCtx* cctx, ZSTD_parameters params); + +/*! ZSTD_compress_advanced() : + * Note : this function is now DEPRECATED. + * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters. + * This prototype will generate compilation warnings. */ +ZSTD_DEPRECATED("use ZSTD_compress2") +ZSTDLIB_STATIC_API +size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + ZSTD_parameters params); + +/*! ZSTD_compress_usingCDict_advanced() : + * Note : this function is now DEPRECATED. + * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_loadDictionary() and other parameter setters. + * This prototype will generate compilation warnings. */ +ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary") +ZSTDLIB_STATIC_API +size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_CDict* cdict, + ZSTD_frameParameters fParams); + + +/*! ZSTD_CCtx_loadDictionary_byReference() : + * Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx. + * It saves some memory, but also requires that `dict` outlives its usage within `cctx` */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); + +/*! ZSTD_CCtx_loadDictionary_advanced() : + * Same as ZSTD_CCtx_loadDictionary(), but gives finer control over + * how to load the dictionary (by copy ? by reference ?) + * and how to interpret it (automatic ? force raw mode ? full mode only ?) */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); + +/*! ZSTD_CCtx_refPrefix_advanced() : + * Same as ZSTD_CCtx_refPrefix(), but gives finer control over + * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); + +/* === experimental parameters === */ +/* these parameters can be used with ZSTD_setParameter() + * they are not guaranteed to remain supported in the future */ + + /* Enables rsyncable mode, + * which makes compressed files more rsync friendly + * by adding periodic synchronization points to the compressed data. + * The target average block size is ZSTD_c_jobSize / 2. + * It's possible to modify the job size to increase or decrease + * the granularity of the synchronization point. + * Once the jobSize is smaller than the window size, + * it will result in compression ratio degradation. + * NOTE 1: rsyncable mode only works when multithreading is enabled. + * NOTE 2: rsyncable performs poorly in combination with long range mode, + * since it will decrease the effectiveness of synchronization points, + * though mileage may vary. + * NOTE 3: Rsyncable mode limits maximum compression speed to ~400 MB/s. + * If the selected compression level is already running significantly slower, + * the overall speed won't be significantly impacted. + */ + #define ZSTD_c_rsyncable ZSTD_c_experimentalParam1 + +/* Select a compression format. + * The value must be of type ZSTD_format_e. + * See ZSTD_format_e enum definition for details */ +#define ZSTD_c_format ZSTD_c_experimentalParam2 + +/* Force back-reference distances to remain < windowSize, + * even when referencing into Dictionary content (default:0) */ +#define ZSTD_c_forceMaxWindow ZSTD_c_experimentalParam3 + +/* Controls whether the contents of a CDict + * are used in place, or copied into the working context. + * Accepts values from the ZSTD_dictAttachPref_e enum. + * See the comments on that enum for an explanation of the feature. */ +#define ZSTD_c_forceAttachDict ZSTD_c_experimentalParam4 + +/* Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never compress literals. + * Set to ZSTD_ps_enable to always compress literals. (Note: uncompressed literals + * may still be emitted if huffman is not beneficial to use.) + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * literals compression based on the compression parameters - specifically, + * negative compression levels do not use literal compression. + */ +#define ZSTD_c_literalCompressionMode ZSTD_c_experimentalParam5 + +/* Tries to fit compressed block size to be around targetCBlockSize. + * No target when targetCBlockSize == 0. + * There is no guarantee on compressed block size (default:0) */ +#define ZSTD_c_targetCBlockSize ZSTD_c_experimentalParam6 + +/* User's best guess of source size. + * Hint is not valid when srcSizeHint == 0. + * There is no guarantee that hint is close to actual source size, + * but compression ratio may regress significantly if guess considerably underestimates */ +#define ZSTD_c_srcSizeHint ZSTD_c_experimentalParam7 + +/* Controls whether the new and experimental "dedicated dictionary search + * structure" can be used. This feature is still rough around the edges, be + * prepared for surprising behavior! + * + * How to use it: + * + * When using a CDict, whether to use this feature or not is controlled at + * CDict creation, and it must be set in a CCtxParams set passed into that + * construction (via ZSTD_createCDict_advanced2()). A compression will then + * use the feature or not based on how the CDict was constructed; the value of + * this param, set in the CCtx, will have no effect. + * + * However, when a dictionary buffer is passed into a CCtx, such as via + * ZSTD_CCtx_loadDictionary(), this param can be set on the CCtx to control + * whether the CDict that is created internally can use the feature or not. + * + * What it does: + * + * Normally, the internal data structures of the CDict are analogous to what + * would be stored in a CCtx after compressing the contents of a dictionary. + * To an approximation, a compression using a dictionary can then use those + * data structures to simply continue what is effectively a streaming + * compression where the simulated compression of the dictionary left off. + * Which is to say, the search structures in the CDict are normally the same + * format as in the CCtx. + * + * It is possible to do better, since the CDict is not like a CCtx: the search + * structures are written once during CDict creation, and then are only read + * after that, while the search structures in the CCtx are both read and + * written as the compression goes along. This means we can choose a search + * structure for the dictionary that is read-optimized. + * + * This feature enables the use of that different structure. + * + * Note that some of the members of the ZSTD_compressionParameters struct have + * different semantics and constraints in the dedicated search structure. It is + * highly recommended that you simply set a compression level in the CCtxParams + * you pass into the CDict creation call, and avoid messing with the cParams + * directly. + * + * Effects: + * + * This will only have any effect when the selected ZSTD_strategy + * implementation supports this feature. Currently, that's limited to + * ZSTD_greedy, ZSTD_lazy, and ZSTD_lazy2. + * + * Note that this means that the CDict tables can no longer be copied into the + * CCtx, so the dict attachment mode ZSTD_dictForceCopy will no longer be + * usable. The dictionary can only be attached or reloaded. + * + * In general, you should expect compression to be faster--sometimes very much + * so--and CDict creation to be slightly slower. Eventually, we will probably + * make this mode the default. + */ +#define ZSTD_c_enableDedicatedDictSearch ZSTD_c_experimentalParam8 + +/* ZSTD_c_stableInBuffer + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable. + * + * Tells the compressor that input data presented with ZSTD_inBuffer + * will ALWAYS be the same between calls. + * Technically, the @src pointer must never be changed, + * and the @pos field can only be updated by zstd. + * However, it's possible to increase the @size field, + * allowing scenarios where more data can be appended after compressions starts. + * These conditions are checked by the compressor, + * and compression will fail if they are not respected. + * Also, data in the ZSTD_inBuffer within the range [src, src + pos) + * MUST not be modified during compression or it will result in data corruption. + * + * When this flag is enabled zstd won't allocate an input window buffer, + * because the user guarantees it can reference the ZSTD_inBuffer until + * the frame is complete. But, it will still allocate an output buffer + * large enough to fit a block (see ZSTD_c_stableOutBuffer). This will also + * avoid the memcpy() from the input buffer to the input window buffer. + * + * NOTE: So long as the ZSTD_inBuffer always points to valid memory, using + * this flag is ALWAYS memory safe, and will never access out-of-bounds + * memory. However, compression WILL fail if conditions are not respected. + * + * WARNING: The data in the ZSTD_inBuffer in the range [src, src + pos) MUST + * not be modified during compression or it will result in data corruption. + * This is because zstd needs to reference data in the ZSTD_inBuffer to find + * matches. Normally zstd maintains its own window buffer for this purpose, + * but passing this flag tells zstd to rely on user provided buffer instead. + */ +#define ZSTD_c_stableInBuffer ZSTD_c_experimentalParam9 + +/* ZSTD_c_stableOutBuffer + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable. + * + * Tells he compressor that the ZSTD_outBuffer will not be resized between + * calls. Specifically: (out.size - out.pos) will never grow. This gives the + * compressor the freedom to say: If the compressed data doesn't fit in the + * output buffer then return ZSTD_error_dstSizeTooSmall. This allows us to + * always decompress directly into the output buffer, instead of decompressing + * into an internal buffer and copying to the output buffer. + * + * When this flag is enabled zstd won't allocate an output buffer, because + * it can write directly to the ZSTD_outBuffer. It will still allocate the + * input window buffer (see ZSTD_c_stableInBuffer). + * + * Zstd will check that (out.size - out.pos) never grows and return an error + * if it does. While not strictly necessary, this should prevent surprises. + */ +#define ZSTD_c_stableOutBuffer ZSTD_c_experimentalParam10 + +/* ZSTD_c_blockDelimiters + * Default is 0 == ZSTD_sf_noBlockDelimiters. + * + * For use with sequence compression API: ZSTD_compressSequences(). + * + * Designates whether or not the given array of ZSTD_Sequence contains block delimiters + * and last literals, which are defined as sequences with offset == 0 and matchLength == 0. + * See the definition of ZSTD_Sequence for more specifics. + */ +#define ZSTD_c_blockDelimiters ZSTD_c_experimentalParam11 + +/* ZSTD_c_validateSequences + * Default is 0 == disabled. Set to 1 to enable sequence validation. + * + * For use with sequence compression API: ZSTD_compressSequences(). + * Designates whether or not we validate sequences provided to ZSTD_compressSequences() + * during function execution. + * + * Without validation, providing a sequence that does not conform to the zstd spec will cause + * undefined behavior, and may produce a corrupted block. + * + * With validation enabled, if sequence is invalid (see doc/zstd_compression_format.md for + * specifics regarding offset/matchlength requirements) then the function will bail out and + * return an error. + * + */ +#define ZSTD_c_validateSequences ZSTD_c_experimentalParam12 + +/* ZSTD_c_useBlockSplitter + * Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never use block splitter. + * Set to ZSTD_ps_enable to always use block splitter. + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * block splitting based on the compression parameters. + */ +#define ZSTD_c_useBlockSplitter ZSTD_c_experimentalParam13 + +/* ZSTD_c_useRowMatchFinder + * Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never use row-based matchfinder. + * Set to ZSTD_ps_enable to force usage of row-based matchfinder. + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * the row-based matchfinder based on support for SIMD instructions and the window log. + * Note that this only pertains to compression strategies: greedy, lazy, and lazy2 + */ +#define ZSTD_c_useRowMatchFinder ZSTD_c_experimentalParam14 + +/* ZSTD_c_deterministicRefPrefix + * Default is 0 == disabled. Set to 1 to enable. + * + * Zstd produces different results for prefix compression when the prefix is + * directly adjacent to the data about to be compressed vs. when it isn't. + * This is because zstd detects that the two buffers are contiguous and it can + * use a more efficient match finding algorithm. However, this produces different + * results than when the two buffers are non-contiguous. This flag forces zstd + * to always load the prefix in non-contiguous mode, even if it happens to be + * adjacent to the data, to guarantee determinism. + * + * If you really care about determinism when using a dictionary or prefix, + * like when doing delta compression, you should select this option. It comes + * at a speed penalty of about ~2.5% if the dictionary and data happened to be + * contiguous, and is free if they weren't contiguous. We don't expect that + * intentionally making the dictionary and data contiguous will be worth the + * cost to memcpy() the data. + */ +#define ZSTD_c_deterministicRefPrefix ZSTD_c_experimentalParam15 + +/* ZSTD_c_prefetchCDictTables + * Controlled with ZSTD_paramSwitch_e enum. Default is ZSTD_ps_auto. + * + * In some situations, zstd uses CDict tables in-place rather than copying them + * into the working context. (See docs on ZSTD_dictAttachPref_e above for details). + * In such situations, compression speed is seriously impacted when CDict tables are + * "cold" (outside CPU cache). This parameter instructs zstd to prefetch CDict tables + * when they are used in-place. + * + * For sufficiently small inputs, the cost of the prefetch will outweigh the benefit. + * For sufficiently large inputs, zstd will by default memcpy() CDict tables + * into the working context, so there is no need to prefetch. This parameter is + * targeted at a middle range of input sizes, where a prefetch is cheap enough to be + * useful but memcpy() is too expensive. The exact range of input sizes where this + * makes sense is best determined by careful experimentation. + * + * Note: for this parameter, ZSTD_ps_auto is currently equivalent to ZSTD_ps_disable, + * but in the future zstd may conditionally enable this feature via an auto-detection + * heuristic for cold CDicts. + * Use ZSTD_ps_disable to opt out of prefetching under any circumstances. + */ +#define ZSTD_c_prefetchCDictTables ZSTD_c_experimentalParam16 + +/* ZSTD_c_enableSeqProducerFallback + * Allowed values are 0 (disable) and 1 (enable). The default setting is 0. + * + * Controls whether zstd will fall back to an internal sequence producer if an + * external sequence producer is registered and returns an error code. This fallback + * is block-by-block: the internal sequence producer will only be called for blocks + * where the external sequence producer returns an error code. Fallback parsing will + * follow any other cParam settings, such as compression level, the same as in a + * normal (fully-internal) compression operation. + * + * The user is strongly encouraged to read the full Block-Level Sequence Producer API + * documentation (below) before setting this parameter. */ +#define ZSTD_c_enableSeqProducerFallback ZSTD_c_experimentalParam17 + +/* ZSTD_c_maxBlockSize + * Allowed values are between 1KB and ZSTD_BLOCKSIZE_MAX (128KB). + * The default is ZSTD_BLOCKSIZE_MAX, and setting to 0 will set to the default. + * + * This parameter can be used to set an upper bound on the blocksize + * that overrides the default ZSTD_BLOCKSIZE_MAX. It cannot be used to set upper + * bounds greater than ZSTD_BLOCKSIZE_MAX or bounds lower than 1KB (will make + * compressBound() inaccurate). Only currently meant to be used for testing. + * + */ +#define ZSTD_c_maxBlockSize ZSTD_c_experimentalParam18 + +/* ZSTD_c_searchForExternalRepcodes + * This parameter affects how zstd parses external sequences, such as sequences + * provided through the compressSequences() API or from an external block-level + * sequence producer. + * + * If set to ZSTD_ps_enable, the library will check for repeated offsets in + * external sequences, even if those repcodes are not explicitly indicated in + * the "rep" field. Note that this is the only way to exploit repcode matches + * while using compressSequences() or an external sequence producer, since zstd + * currently ignores the "rep" field of external sequences. + * + * If set to ZSTD_ps_disable, the library will not exploit repeated offsets in + * external sequences, regardless of whether the "rep" field has been set. This + * reduces sequence compression overhead by about 25% while sacrificing some + * compression ratio. + * + * The default value is ZSTD_ps_auto, for which the library will enable/disable + * based on compression level. + * + * Note: for now, this param only has an effect if ZSTD_c_blockDelimiters is + * set to ZSTD_sf_explicitBlockDelimiters. That may change in the future. + */ +#define ZSTD_c_searchForExternalRepcodes ZSTD_c_experimentalParam19 + +/*! ZSTD_CCtx_getParameter() : + * Get the requested compression parameter value, selected by enum ZSTD_cParameter, + * and store it into int* value. + * @return : 0, or an error code (which can be tested with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value); + + +/*! ZSTD_CCtx_params : + * Quick howto : + * - ZSTD_createCCtxParams() : Create a ZSTD_CCtx_params structure + * - ZSTD_CCtxParams_setParameter() : Push parameters one by one into + * an existing ZSTD_CCtx_params structure. + * This is similar to + * ZSTD_CCtx_setParameter(). + * - ZSTD_CCtx_setParametersUsingCCtxParams() : Apply parameters to + * an existing CCtx. + * These parameters will be applied to + * all subsequent frames. + * - ZSTD_compressStream2() : Do compression using the CCtx. + * - ZSTD_freeCCtxParams() : Free the memory, accept NULL pointer. + * + * This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams() + * for static allocation of CCtx for single-threaded compression. + */ +ZSTDLIB_STATIC_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void); +ZSTDLIB_STATIC_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointer */ + +/*! ZSTD_CCtxParams_reset() : + * Reset params to default values. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params); + +/*! ZSTD_CCtxParams_init() : + * Initializes the compression parameters of cctxParams according to + * compression level. All other parameters are reset to their default values. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel); + +/*! ZSTD_CCtxParams_init_advanced() : + * Initializes the compression and frame parameters of cctxParams according to + * params. All other parameters are reset to their default values. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params); + +/*! ZSTD_CCtxParams_setParameter() : Requires v1.4.0+ + * Similar to ZSTD_CCtx_setParameter. + * Set one compression parameter, selected by enum ZSTD_cParameter. + * Parameters must be applied to a ZSTD_CCtx using + * ZSTD_CCtx_setParametersUsingCCtxParams(). + * @result : a code representing success or failure (which can be tested with + * ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value); + +/*! ZSTD_CCtxParams_getParameter() : + * Similar to ZSTD_CCtx_getParameter. + * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value); + +/*! ZSTD_CCtx_setParametersUsingCCtxParams() : + * Apply a set of ZSTD_CCtx_params to the compression context. + * This can be done even after compression is started, + * if nbWorkers==0, this will have no impact until a new compression is started. + * if nbWorkers>=1, new parameters will be picked up at next job, + * with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( + ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params); + +/*! ZSTD_compressStream2_simpleArgs() : + * Same as ZSTD_compressStream2(), + * but using only integral types as arguments. + * This variant might be helpful for binders from dynamic languages + * which have troubles handling structures containing memory pointers. + */ +ZSTDLIB_STATIC_API size_t ZSTD_compressStream2_simpleArgs ( + ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, size_t* dstPos, + const void* src, size_t srcSize, size_t* srcPos, + ZSTD_EndDirective endOp); + + +/*************************************** +* Advanced decompression functions +***************************************/ + +/*! ZSTD_isFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier. + * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. + * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. + * Note 3 : Skippable Frame Identifiers are considered valid. */ +ZSTDLIB_STATIC_API unsigned ZSTD_isFrame(const void* buffer, size_t size); + +/*! ZSTD_createDDict_byReference() : + * Create a digested dictionary, ready to start decompression operation without startup delay. + * Dictionary content is referenced, and therefore stays in dictBuffer. + * It is important that dictBuffer outlives DDict, + * it must remain read accessible throughout the lifetime of DDict */ +ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize); + +/*! ZSTD_DCtx_loadDictionary_byReference() : + * Same as ZSTD_DCtx_loadDictionary(), + * but references `dict` content instead of copying it into `dctx`. + * This saves memory if `dict` remains around., + * However, it's imperative that `dict` remains accessible (and unmodified) while being used, so it must outlive decompression. */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); + +/*! ZSTD_DCtx_loadDictionary_advanced() : + * Same as ZSTD_DCtx_loadDictionary(), + * but gives direct control over + * how to load the dictionary (by copy ? by reference ?) + * and how to interpret it (automatic ? force raw mode ? full mode only ?). */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); + +/*! ZSTD_DCtx_refPrefix_advanced() : + * Same as ZSTD_DCtx_refPrefix(), but gives finer control over + * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); + +/*! ZSTD_DCtx_setMaxWindowSize() : + * Refuses allocating internal buffers for frames requiring a window size larger than provided limit. + * This protects a decoder context from reserving too much memory for itself (potential attack scenario). + * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode. + * By default, a decompression context accepts all window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) + * @return : 0, or an error code (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize); + +/*! ZSTD_DCtx_getParameter() : + * Get the requested decompression parameter value, selected by enum ZSTD_dParameter, + * and store it into int* value. + * @return : 0, or an error code (which can be tested with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value); + +/* ZSTD_d_format + * experimental parameter, + * allowing selection between ZSTD_format_e input compression formats + */ +#define ZSTD_d_format ZSTD_d_experimentalParam1 +/* ZSTD_d_stableOutBuffer + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable. + * + * Tells the decompressor that the ZSTD_outBuffer will ALWAYS be the same + * between calls, except for the modifications that zstd makes to pos (the + * caller must not modify pos). This is checked by the decompressor, and + * decompression will fail if it ever changes. Therefore the ZSTD_outBuffer + * MUST be large enough to fit the entire decompressed frame. This will be + * checked when the frame content size is known. The data in the ZSTD_outBuffer + * in the range [dst, dst + pos) MUST not be modified during decompression + * or you will get data corruption. + * + * When this flag is enabled zstd won't allocate an output buffer, because + * it can write directly to the ZSTD_outBuffer, but it will still allocate + * an input buffer large enough to fit any compressed block. This will also + * avoid the memcpy() from the internal output buffer to the ZSTD_outBuffer. + * If you need to avoid the input buffer allocation use the buffer-less + * streaming API. + * + * NOTE: So long as the ZSTD_outBuffer always points to valid memory, using + * this flag is ALWAYS memory safe, and will never access out-of-bounds + * memory. However, decompression WILL fail if you violate the preconditions. + * + * WARNING: The data in the ZSTD_outBuffer in the range [dst, dst + pos) MUST + * not be modified during decompression or you will get data corruption. This + * is because zstd needs to reference data in the ZSTD_outBuffer to regenerate + * matches. Normally zstd maintains its own buffer for this purpose, but passing + * this flag tells zstd to use the user provided buffer. + */ +#define ZSTD_d_stableOutBuffer ZSTD_d_experimentalParam2 + +/* ZSTD_d_forceIgnoreChecksum + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable + * + * Tells the decompressor to skip checksum validation during decompression, regardless + * of whether checksumming was specified during compression. This offers some + * slight performance benefits, and may be useful for debugging. + * Param has values of type ZSTD_forceIgnoreChecksum_e + */ +#define ZSTD_d_forceIgnoreChecksum ZSTD_d_experimentalParam3 + +/* ZSTD_d_refMultipleDDicts + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable + * + * If enabled and dctx is allocated on the heap, then additional memory will be allocated + * to store references to multiple ZSTD_DDict. That is, multiple calls of ZSTD_refDDict() + * using a given ZSTD_DCtx, rather than overwriting the previous DDict reference, will instead + * store all references. At decompression time, the appropriate dictID is selected + * from the set of DDicts based on the dictID in the frame. + * + * Usage is simply calling ZSTD_refDDict() on multiple dict buffers. + * + * Param has values of byte ZSTD_refMultipleDDicts_e + * + * WARNING: Enabling this parameter and calling ZSTD_DCtx_refDDict(), will trigger memory + * allocation for the hash table. ZSTD_freeDCtx() also frees this memory. + * Memory is allocated as per ZSTD_DCtx::customMem. + * + * Although this function allocates memory for the table, the user is still responsible for + * memory management of the underlying ZSTD_DDict* themselves. + */ +#define ZSTD_d_refMultipleDDicts ZSTD_d_experimentalParam4 + +/* ZSTD_d_disableHuffmanAssembly + * Set to 1 to disable the Huffman assembly implementation. + * The default value is 0, which allows zstd to use the Huffman assembly + * implementation if available. + * + * This parameter can be used to disable Huffman assembly at runtime. + * If you want to disable it at compile time you can define the macro + * ZSTD_DISABLE_ASM. + */ +#define ZSTD_d_disableHuffmanAssembly ZSTD_d_experimentalParam5 + + +/*! ZSTD_DCtx_setFormat() : + * This function is REDUNDANT. Prefer ZSTD_DCtx_setParameter(). + * Instruct the decoder context about what kind of data to decode next. + * This instruction is mandatory to decode data without a fully-formed header, + * such ZSTD_f_zstd1_magicless for example. + * @return : 0, or an error code (which can be tested using ZSTD_isError()). */ +ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead") +ZSTDLIB_STATIC_API +size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); + +/*! ZSTD_decompressStream_simpleArgs() : + * Same as ZSTD_decompressStream(), + * but using only integral types as arguments. + * This can be helpful for binders from dynamic languages + * which have troubles handling structures containing memory pointers. + */ +ZSTDLIB_STATIC_API size_t ZSTD_decompressStream_simpleArgs ( + ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, size_t* dstPos, + const void* src, size_t srcSize, size_t* srcPos); + + +/******************************************************************** +* Advanced streaming functions +* Warning : most of these functions are now redundant with the Advanced API. +* Once Advanced API reaches "stable" status, +* redundant functions will be deprecated, and then at some point removed. +********************************************************************/ + +/*===== Advanced Streaming compression functions =====*/ + +/*! ZSTD_initCStream_srcSize() : + * This function is DEPRECATED, and equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) + * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * + * pledgedSrcSize must be correct. If it is not known at init time, use + * ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs, + * "0" also disables frame content size field. It may be enabled in the future. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, + int compressionLevel, + unsigned long long pledgedSrcSize); + +/*! ZSTD_initCStream_usingDict() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * ZSTD_CCtx_loadDictionary(zcs, dict, dictSize); + * + * Creates of an internal CDict (incompatible with static CCtx), except if + * dict == NULL or dictSize < 8, in which case no dict is used. + * Note: dict is loaded with ZSTD_dct_auto (treated as a full zstd dictionary if + * it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, + const void* dict, size_t dictSize, + int compressionLevel); + +/*! ZSTD_initCStream_advanced() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setParams(zcs, params); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * ZSTD_CCtx_loadDictionary(zcs, dict, dictSize); + * + * dict is loaded with ZSTD_dct_auto and ZSTD_dlm_byCopy. + * pledgedSrcSize must be correct. + * If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, + const void* dict, size_t dictSize, + ZSTD_parameters params, + unsigned long long pledgedSrcSize); + +/*! ZSTD_initCStream_usingCDict() : + * This function is DEPRECATED, and equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_refCDict(zcs, cdict); + * + * note : cdict will just be referenced, and must outlive compression session + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict); + +/*! ZSTD_initCStream_usingCDict_advanced() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setFParams(zcs, fParams); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * ZSTD_CCtx_refCDict(zcs, cdict); + * + * same as ZSTD_initCStream_usingCDict(), with control over frame parameters. + * pledgedSrcSize must be correct. If srcSize is not known at init time, use + * value ZSTD_CONTENTSIZE_UNKNOWN. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, + const ZSTD_CDict* cdict, + ZSTD_frameParameters fParams, + unsigned long long pledgedSrcSize); + +/*! ZSTD_resetCStream() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * Note: ZSTD_resetCStream() interprets pledgedSrcSize == 0 as ZSTD_CONTENTSIZE_UNKNOWN, but + * ZSTD_CCtx_setPledgedSrcSize() does not do the same, so ZSTD_CONTENTSIZE_UNKNOWN must be + * explicitly specified. + * + * start a new frame, using same parameters from previous frame. + * This is typically useful to skip dictionary loading stage, since it will re-use it in-place. + * Note that zcs must be init at least once before using ZSTD_resetCStream(). + * If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN. + * If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end. + * For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs, + * but it will change to mean "empty" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead. + * @return : 0, or an error code (which can be tested using ZSTD_isError()) + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); + + +typedef struct { + unsigned long long ingested; /* nb input bytes read and buffered */ + unsigned long long consumed; /* nb input bytes actually compressed */ + unsigned long long produced; /* nb of compressed bytes generated and buffered */ + unsigned long long flushed; /* nb of compressed bytes flushed : not provided; can be tracked from caller side */ + unsigned currentJobID; /* MT only : latest started job nb */ + unsigned nbActiveWorkers; /* MT only : nb of workers actively compressing at probe time */ +} ZSTD_frameProgression; + +/* ZSTD_getFrameProgression() : + * tells how much data has been ingested (read from input) + * consumed (input actually compressed) and produced (output) for current frame. + * Note : (ingested - consumed) is amount of input data buffered internally, not yet compressed. + * Aggregates progression inside active worker threads. + */ +ZSTDLIB_STATIC_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx); + +/*! ZSTD_toFlushNow() : + * Tell how many bytes are ready to be flushed immediately. + * Useful for multithreading scenarios (nbWorkers >= 1). + * Probe the oldest active job, defined as oldest job not yet entirely flushed, + * and check its output buffer. + * @return : amount of data stored in oldest job and ready to be flushed immediately. + * if @return == 0, it means either : + * + there is no active job (could be checked with ZSTD_frameProgression()), or + * + oldest job is still actively compressing data, + * but everything it has produced has also been flushed so far, + * therefore flush speed is limited by production speed of oldest job + * irrespective of the speed of concurrent (and newer) jobs. + */ +ZSTDLIB_STATIC_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx); + + +/*===== Advanced Streaming decompression functions =====*/ + +/*! + * This function is deprecated, and is equivalent to: + * + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * ZSTD_DCtx_loadDictionary(zds, dict, dictSize); + * + * note: no dictionary will be used if dict == NULL or dictSize < 8 + */ +ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_loadDictionary, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); + +/*! + * This function is deprecated, and is equivalent to: + * + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * ZSTD_DCtx_refDDict(zds, ddict); + * + * note : ddict is referenced, it must outlive decompression session + */ +ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_refDDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); + +/*! + * This function is deprecated, and is equivalent to: + * + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * + * re-use decompression parameters from previous init; saves dictionary loading + */ +ZSTD_DEPRECATED("use ZSTD_DCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); + + +/* ********************* BLOCK-LEVEL SEQUENCE PRODUCER API ********************* + * + * *** OVERVIEW *** + * The Block-Level Sequence Producer API allows users to provide their own custom + * sequence producer which libzstd invokes to process each block. The produced list + * of sequences (literals and matches) is then post-processed by libzstd to produce + * valid compressed blocks. + * + * This block-level offload API is a more granular complement of the existing + * frame-level offload API compressSequences() (introduced in v1.5.1). It offers + * an easier migration story for applications already integrated with libzstd: the + * user application continues to invoke the same compression functions + * ZSTD_compress2() or ZSTD_compressStream2() as usual, and transparently benefits + * from the specific advantages of the external sequence producer. For example, + * the sequence producer could be tuned to take advantage of known characteristics + * of the input, to offer better speed / ratio, or could leverage hardware + * acceleration not available within libzstd itself. + * + * See contrib/externalSequenceProducer for an example program employing the + * Block-Level Sequence Producer API. + * + * *** USAGE *** + * The user is responsible for implementing a function of type + * ZSTD_sequenceProducer_F. For each block, zstd will pass the following + * arguments to the user-provided function: + * + * - sequenceProducerState: a pointer to a user-managed state for the sequence + * producer. + * + * - outSeqs, outSeqsCapacity: an output buffer for the sequence producer. + * outSeqsCapacity is guaranteed >= ZSTD_sequenceBound(srcSize). The memory + * backing outSeqs is managed by the CCtx. + * + * - src, srcSize: an input buffer for the sequence producer to parse. + * srcSize is guaranteed to be <= ZSTD_BLOCKSIZE_MAX. + * + * - dict, dictSize: a history buffer, which may be empty, which the sequence + * producer may reference as it parses the src buffer. Currently, zstd will + * always pass dictSize == 0 into external sequence producers, but this will + * change in the future. + * + * - compressionLevel: a signed integer representing the zstd compression level + * set by the user for the current operation. The sequence producer may choose + * to use this information to change its compression strategy and speed/ratio + * tradeoff. Note: the compression level does not reflect zstd parameters set + * through the advanced API. + * + * - windowSize: a size_t representing the maximum allowed offset for external + * sequences. Note that sequence offsets are sometimes allowed to exceed the + * windowSize if a dictionary is present, see doc/zstd_compression_format.md + * for details. + * + * The user-provided function shall return a size_t representing the number of + * sequences written to outSeqs. This return value will be treated as an error + * code if it is greater than outSeqsCapacity. The return value must be non-zero + * if srcSize is non-zero. The ZSTD_SEQUENCE_PRODUCER_ERROR macro is provided + * for convenience, but any value greater than outSeqsCapacity will be treated as + * an error code. + * + * If the user-provided function does not return an error code, the sequences + * written to outSeqs must be a valid parse of the src buffer. Data corruption may + * occur if the parse is not valid. A parse is defined to be valid if the + * following conditions hold: + * - The sum of matchLengths and literalLengths must equal srcSize. + * - All sequences in the parse, except for the final sequence, must have + * matchLength >= ZSTD_MINMATCH_MIN. The final sequence must have + * matchLength >= ZSTD_MINMATCH_MIN or matchLength == 0. + * - All offsets must respect the windowSize parameter as specified in + * doc/zstd_compression_format.md. + * - If the final sequence has matchLength == 0, it must also have offset == 0. + * + * zstd will only validate these conditions (and fail compression if they do not + * hold) if the ZSTD_c_validateSequences cParam is enabled. Note that sequence + * validation has a performance cost. + * + * If the user-provided function returns an error, zstd will either fall back + * to an internal sequence producer or fail the compression operation. The user can + * choose between the two behaviors by setting the ZSTD_c_enableSeqProducerFallback + * cParam. Fallback compression will follow any other cParam settings, such as + * compression level, the same as in a normal compression operation. + * + * The user shall instruct zstd to use a particular ZSTD_sequenceProducer_F + * function by calling + * ZSTD_registerSequenceProducer(cctx, + * sequenceProducerState, + * sequenceProducer) + * This setting will persist until the next parameter reset of the CCtx. + * + * The sequenceProducerState must be initialized by the user before calling + * ZSTD_registerSequenceProducer(). The user is responsible for destroying the + * sequenceProducerState. + * + * *** LIMITATIONS *** + * This API is compatible with all zstd compression APIs which respect advanced parameters. + * However, there are three limitations: + * + * First, the ZSTD_c_enableLongDistanceMatching cParam is not currently supported. + * COMPRESSION WILL FAIL if it is enabled and the user tries to compress with a block-level + * external sequence producer. + * - Note that ZSTD_c_enableLongDistanceMatching is auto-enabled by default in some + * cases (see its documentation for details). Users must explicitly set + * ZSTD_c_enableLongDistanceMatching to ZSTD_ps_disable in such cases if an external + * sequence producer is registered. + * - As of this writing, ZSTD_c_enableLongDistanceMatching is disabled by default + * whenever ZSTD_c_windowLog < 128MB, but that's subject to change. Users should + * check the docs on ZSTD_c_enableLongDistanceMatching whenever the Block-Level Sequence + * Producer API is used in conjunction with advanced settings (like ZSTD_c_windowLog). + * + * Second, history buffers are not currently supported. Concretely, zstd will always pass + * dictSize == 0 to the external sequence producer (for now). This has two implications: + * - Dictionaries are not currently supported. Compression will *not* fail if the user + * references a dictionary, but the dictionary won't have any effect. + * - Stream history is not currently supported. All advanced compression APIs, including + * streaming APIs, work with external sequence producers, but each block is treated as + * an independent chunk without history from previous blocks. + * + * Third, multi-threading within a single compression is not currently supported. In other words, + * COMPRESSION WILL FAIL if ZSTD_c_nbWorkers > 0 and an external sequence producer is registered. + * Multi-threading across compressions is fine: simply create one CCtx per thread. + * + * Long-term, we plan to overcome all three limitations. There is no technical blocker to + * overcoming them. It is purely a question of engineering effort. + */ + +#define ZSTD_SEQUENCE_PRODUCER_ERROR ((size_t)(-1)) + +typedef size_t ZSTD_sequenceProducer_F ( + void* sequenceProducerState, + ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + int compressionLevel, + size_t windowSize +); + +/*! ZSTD_registerSequenceProducer() : + * Instruct zstd to use a block-level external sequence producer function. + * + * The sequenceProducerState must be initialized by the caller, and the caller is + * responsible for managing its lifetime. This parameter is sticky across + * compressions. It will remain set until the user explicitly resets compression + * parameters. + * + * Sequence producer registration is considered to be an "advanced parameter", + * part of the "advanced API". This means it will only have an effect on compression + * APIs which respect advanced parameters, such as compress2() and compressStream2(). + * Older compression APIs such as compressCCtx(), which predate the introduction of + * "advanced parameters", will ignore any external sequence producer setting. + * + * The sequence producer can be "cleared" by registering a NULL function pointer. This + * removes all limitations described above in the "LIMITATIONS" section of the API docs. + * + * The user is strongly encouraged to read the full API documentation (above) before + * calling this function. */ +ZSTDLIB_STATIC_API void +ZSTD_registerSequenceProducer( + ZSTD_CCtx* cctx, + void* sequenceProducerState, + ZSTD_sequenceProducer_F* sequenceProducer +); + + +/********************************************************************* +* Buffer-less and synchronous inner streaming functions (DEPRECATED) +* +* This API is deprecated, and will be removed in a future version. +* It allows streaming (de)compression with user allocated buffers. +* However, it is hard to use, and not as well tested as the rest of +* our API. +* +* Please use the normal streaming API instead: ZSTD_compressStream2, +* and ZSTD_decompressStream. +* If there is functionality that you need, but it doesn't provide, +* please open an issue on our GitHub. +********************************************************************* */ + +/** + Buffer-less streaming compression (synchronous mode) + + A ZSTD_CCtx object is required to track streaming operations. + Use ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource. + ZSTD_CCtx object can be re-used multiple times within successive compression operations. + + Start by initializing a context. + Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression. + + Then, consume your input using ZSTD_compressContinue(). + There are some important considerations to keep in mind when using this advanced function : + - ZSTD_compressContinue() has no internal buffer. It uses externally provided buffers only. + - Interface is synchronous : input is consumed entirely and produces 1+ compressed blocks. + - Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario. + Worst case evaluation is provided by ZSTD_compressBound(). + ZSTD_compressContinue() doesn't guarantee recover after a failed compression. + - ZSTD_compressContinue() presumes prior input ***is still accessible and unmodified*** (up to maximum distance size, see WindowLog). + It remembers all previous contiguous blocks, plus one separated memory segment (which can itself consists of multiple contiguous blocks) + - ZSTD_compressContinue() detects that prior input has been overwritten when `src` buffer overlaps. + In which case, it will "discard" the relevant memory section from its history. + + Finish a frame with ZSTD_compressEnd(), which will write the last block(s) and optional checksum. + It's possible to use srcSize==0, in which case, it will write a final empty block to end the frame. + Without last block mark, frames are considered unfinished (hence corrupted) by compliant decoders. + + `ZSTD_CCtx` object can be re-used (ZSTD_compressBegin()) to compress again. +*/ + +/*===== Buffer-less streaming compression functions =====*/ +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */ + +ZSTD_DEPRECATED("This function will likely be removed in a future release. It is misleading and has very limited utility.") +ZSTDLIB_STATIC_API +size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */ + +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + +/* The ZSTD_compressBegin_advanced() and ZSTD_compressBegin_usingCDict_advanced() are now DEPRECATED and will generate a compiler warning */ +ZSTD_DEPRECATED("use advanced API to access custom parameters") +ZSTDLIB_STATIC_API +size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize : If srcSize is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN */ +ZSTD_DEPRECATED("use advanced API to access custom parameters") +ZSTDLIB_STATIC_API +size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict, ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize); /* compression parameters are already set within cdict. pledgedSrcSize must be correct. If srcSize is not known, use macro ZSTD_CONTENTSIZE_UNKNOWN */ +/** + Buffer-less streaming decompression (synchronous mode) + + A ZSTD_DCtx object is required to track streaming operations. + Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it. + A ZSTD_DCtx object can be re-used multiple times. + + First typical operation is to retrieve frame parameters, using ZSTD_getFrameHeader(). + Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough. + Data fragment must be large enough to ensure successful decoding. + `ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough. + result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled. + >0 : `srcSize` is too small, please provide at least result bytes on next attempt. + errorCode, which can be tested using ZSTD_isError(). + + It fills a ZSTD_frameHeader structure with important information to correctly decode the frame, + such as the dictionary ID, content size, or maximum back-reference distance (`windowSize`). + Note that these values could be wrong, either because of data corruption, or because a 3rd party deliberately spoofs false information. + As a consequence, check that values remain within valid application range. + For example, do not allocate memory blindly, check that `windowSize` is within expectation. + Each application can set its own limits, depending on local restrictions. + For extended interoperability, it is recommended to support `windowSize` of at least 8 MB. + + ZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize` bytes. + ZSTD_decompressContinue() is very sensitive to contiguity, + if 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place, + or that previous contiguous segment is large enough to properly handle maximum back-reference distance. + There are multiple ways to guarantee this condition. + + The most memory efficient way is to use a round buffer of sufficient size. + Sufficient size is determined by invoking ZSTD_decodingBufferSize_min(), + which can return an error code if required value is too large for current system (in 32-bits mode). + In a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one, + up to the moment there is not enough room left in the buffer to guarantee decoding another full block, + which maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`. + At which point, decoding can resume from the beginning of the buffer. + Note that already decoded data stored in the buffer should be flushed before being overwritten. + + There are alternatives possible, for example using two or more buffers of size `windowSize` each, though they consume more memory. + + Finally, if you control the compression process, you can also ignore all buffer size rules, + as long as the encoder and decoder progress in "lock-step", + aka use exactly the same buffer sizes, break contiguity at the same place, etc. + + Once buffers are setup, start decompression, with ZSTD_decompressBegin(). + If decompression requires a dictionary, use ZSTD_decompressBegin_usingDict() or ZSTD_decompressBegin_usingDDict(). + + Then use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively. + ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue(). + ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail. + + result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity). + It can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item. + It can also be an error code, which can be tested with ZSTD_isError(). + + A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero. + Context can then be reset to start a new decompression. + + Note : it's possible to know if next input to present is a header or a block, using ZSTD_nextInputType(). + This information is not required to properly decode a frame. + + == Special case : skippable frames == + + Skippable frames allow integration of user-defined data into a flow of concatenated frames. + Skippable frames will be ignored (skipped) by decompressor. + The format of skippable frames is as follows : + a) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F + b) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits + c) Frame Content - any content (User Data) of length equal to Frame Size + For skippable frames ZSTD_getFrameHeader() returns zfhPtr->frameType==ZSTD_skippableFrame. + For skippable frames ZSTD_decompressContinue() always returns 0 : it only skips the content. +*/ + +/*===== Buffer-less streaming decompression functions =====*/ + +ZSTDLIB_STATIC_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */ + +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); + +ZSTDLIB_STATIC_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + +/* misc */ +ZSTD_DEPRECATED("This function will likely be removed in the next minor release. It is misleading and has very limited utility.") +ZSTDLIB_STATIC_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); +typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; +ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); + + + + +/* ========================================= */ +/** Block level API (DEPRECATED) */ +/* ========================================= */ + +/*! + + This API is deprecated in favor of the regular compression API. + You can get the frame header down to 2 bytes by setting: + - ZSTD_c_format = ZSTD_f_zstd1_magicless + - ZSTD_c_contentSizeFlag = 0 + - ZSTD_c_checksumFlag = 0 + - ZSTD_c_dictIDFlag = 0 + + This API is not as well tested as our normal API, so we recommend not using it. + We will be removing it in a future version. If the normal API doesn't provide + the functionality you need, please open a GitHub issue. + + Block functions produce and decode raw zstd blocks, without frame metadata. + Frame metadata cost is typically ~12 bytes, which can be non-negligible for very small blocks (< 100 bytes). + But users will have to take in charge needed metadata to regenerate data, such as compressed and content sizes. + + A few rules to respect : + - Compressing and decompressing require a context structure + + Use ZSTD_createCCtx() and ZSTD_createDCtx() + - It is necessary to init context before starting + + compression : any ZSTD_compressBegin*() variant, including with dictionary + + decompression : any ZSTD_decompressBegin*() variant, including with dictionary + - Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB + + If input is larger than a block size, it's necessary to split input data into multiple blocks + + For inputs larger than a single block, consider using regular ZSTD_compress() instead. + Frame metadata is not that costly, and quickly becomes negligible as source size grows larger than a block. + - When a block is considered not compressible enough, ZSTD_compressBlock() result will be 0 (zero) ! + ===> In which case, nothing is produced into `dst` ! + + User __must__ test for such outcome and deal directly with uncompressed data + + A block cannot be declared incompressible if ZSTD_compressBlock() return value was != 0. + Doing so would mess up with statistics history, leading to potential data corruption. + + ZSTD_decompressBlock() _doesn't accept uncompressed data as input_ !! + + In case of multiple successive blocks, should some of them be uncompressed, + decoder must be informed of their existence in order to follow proper history. + Use ZSTD_insertBlock() for such a case. +*/ + +/*===== Raw zstd block functions =====*/ +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_getBlockSize (const ZSTD_CCtx* cctx); +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */ + +#endif /* ZSTD_H_ZSTD_STATIC_LINKING_ONLY */ + +#if defined (__cplusplus) +} +#endif +/**** ended inlining ../zstd.h ****/ + +#ifndef ZSTD_ALLOCATIONS_H +#define ZSTD_ALLOCATIONS_H + +/* custom memory allocation functions */ + +MEM_STATIC void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem) +{ + if (customMem.customAlloc) + return customMem.customAlloc(customMem.opaque, size); + return ZSTD_malloc(size); +} + +MEM_STATIC void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem) +{ + if (customMem.customAlloc) { + /* calloc implemented as malloc+memset; + * not as efficient as calloc, but next best guess for custom malloc */ + void* const ptr = customMem.customAlloc(customMem.opaque, size); + ZSTD_memset(ptr, 0, size); + return ptr; + } + return ZSTD_calloc(1, size); +} + +MEM_STATIC void ZSTD_customFree(void* ptr, ZSTD_customMem customMem) +{ + if (ptr!=NULL) { + if (customMem.customFree) + customMem.customFree(customMem.opaque, ptr); + else + ZSTD_free(ptr); + } +} + +#endif /* ZSTD_ALLOCATIONS_H */ +/**** ended inlining ../common/allocations.h ****/ +/**** skipping file: zstd_deps.h ****/ +/**** skipping file: debug.h ****/ +/**** start inlining pool.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef POOL_H +#define POOL_H + +#if defined (__cplusplus) +extern "C" { +#endif + + +/**** skipping file: zstd_deps.h ****/ +#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_customMem */ +/**** skipping file: ../zstd.h ****/ + +typedef struct POOL_ctx_s POOL_ctx; + +/*! POOL_create() : + * Create a thread pool with at most `numThreads` threads. + * `numThreads` must be at least 1. + * The maximum number of queued jobs before blocking is `queueSize`. + * @return : POOL_ctx pointer on success, else NULL. +*/ +POOL_ctx* POOL_create(size_t numThreads, size_t queueSize); + +POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, + ZSTD_customMem customMem); + +/*! POOL_free() : + * Free a thread pool returned by POOL_create(). + */ +void POOL_free(POOL_ctx* ctx); + + +/*! POOL_joinJobs() : + * Waits for all queued jobs to finish executing. + */ +void POOL_joinJobs(POOL_ctx* ctx); + +/*! POOL_resize() : + * Expands or shrinks pool's number of threads. + * This is more efficient than releasing + creating a new context, + * since it tries to preserve and re-use existing threads. + * `numThreads` must be at least 1. + * @return : 0 when resize was successful, + * !0 (typically 1) if there is an error. + * note : only numThreads can be resized, queueSize remains unchanged. + */ +int POOL_resize(POOL_ctx* ctx, size_t numThreads); + +/*! POOL_sizeof() : + * @return threadpool memory usage + * note : compatible with NULL (returns 0 in this case) + */ +size_t POOL_sizeof(const POOL_ctx* ctx); + +/*! POOL_function : + * The function type that can be added to a thread pool. + */ +typedef void (*POOL_function)(void*); + +/*! POOL_add() : + * Add the job `function(opaque)` to the thread pool. `ctx` must be valid. + * Possibly blocks until there is room in the queue. + * Note : The function may be executed asynchronously, + * therefore, `opaque` must live until function has been completed. + */ +void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque); + + +/*! POOL_tryAdd() : + * Add the job `function(opaque)` to thread pool _if_ a queue slot is available. + * Returns immediately even if not (does not block). + * @return : 1 if successful, 0 if not. + */ +int POOL_tryAdd(POOL_ctx* ctx, POOL_function function, void* opaque); + + +#if defined (__cplusplus) +} +#endif + +#endif +/**** ended inlining pool.h ****/ + +/* ====== Compiler specifics ====== */ +#if defined(_MSC_VER) +# pragma warning(disable : 4204) /* disable: C4204: non-constant aggregate initializer */ +#endif + + +#ifdef ZSTD_MULTITHREAD + +/**** skipping file: threading.h ****/ + +/* A job is a function and an opaque argument */ +typedef struct POOL_job_s { + POOL_function function; + void *opaque; +} POOL_job; + +struct POOL_ctx_s { + ZSTD_customMem customMem; + /* Keep track of the threads */ + ZSTD_pthread_t* threads; + size_t threadCapacity; + size_t threadLimit; + + /* The queue is a circular buffer */ + POOL_job *queue; + size_t queueHead; + size_t queueTail; + size_t queueSize; + + /* The number of threads working on jobs */ + size_t numThreadsBusy; + /* Indicates if the queue is empty */ + int queueEmpty; + + /* The mutex protects the queue */ + ZSTD_pthread_mutex_t queueMutex; + /* Condition variable for pushers to wait on when the queue is full */ + ZSTD_pthread_cond_t queuePushCond; + /* Condition variables for poppers to wait on when the queue is empty */ + ZSTD_pthread_cond_t queuePopCond; + /* Indicates if the queue is shutting down */ + int shutdown; +}; + +/* POOL_thread() : + * Work thread for the thread pool. + * Waits for jobs and executes them. + * @returns : NULL on failure else non-null. + */ +static void* POOL_thread(void* opaque) { + POOL_ctx* const ctx = (POOL_ctx*)opaque; + if (!ctx) { return NULL; } + for (;;) { + /* Lock the mutex and wait for a non-empty queue or until shutdown */ + ZSTD_pthread_mutex_lock(&ctx->queueMutex); + + while ( ctx->queueEmpty + || (ctx->numThreadsBusy >= ctx->threadLimit) ) { + if (ctx->shutdown) { + /* even if !queueEmpty, (possible if numThreadsBusy >= threadLimit), + * a few threads will be shutdown while !queueEmpty, + * but enough threads will remain active to finish the queue */ + ZSTD_pthread_mutex_unlock(&ctx->queueMutex); + return opaque; + } + ZSTD_pthread_cond_wait(&ctx->queuePopCond, &ctx->queueMutex); + } + /* Pop a job off the queue */ + { POOL_job const job = ctx->queue[ctx->queueHead]; + ctx->queueHead = (ctx->queueHead + 1) % ctx->queueSize; + ctx->numThreadsBusy++; + ctx->queueEmpty = (ctx->queueHead == ctx->queueTail); + /* Unlock the mutex, signal a pusher, and run the job */ + ZSTD_pthread_cond_signal(&ctx->queuePushCond); + ZSTD_pthread_mutex_unlock(&ctx->queueMutex); + + job.function(job.opaque); + + /* If the intended queue size was 0, signal after finishing job */ + ZSTD_pthread_mutex_lock(&ctx->queueMutex); + ctx->numThreadsBusy--; + ZSTD_pthread_cond_signal(&ctx->queuePushCond); + ZSTD_pthread_mutex_unlock(&ctx->queueMutex); + } + } /* for (;;) */ + assert(0); /* Unreachable */ +} + +/* ZSTD_createThreadPool() : public access point */ +POOL_ctx* ZSTD_createThreadPool(size_t numThreads) { + return POOL_create (numThreads, 0); +} + +POOL_ctx* POOL_create(size_t numThreads, size_t queueSize) { + return POOL_create_advanced(numThreads, queueSize, ZSTD_defaultCMem); +} + +POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, + ZSTD_customMem customMem) +{ + POOL_ctx* ctx; + /* Check parameters */ + if (!numThreads) { return NULL; } + /* Allocate the context and zero initialize */ + ctx = (POOL_ctx*)ZSTD_customCalloc(sizeof(POOL_ctx), customMem); + if (!ctx) { return NULL; } + /* Initialize the job queue. + * It needs one extra space since one space is wasted to differentiate + * empty and full queues. + */ + ctx->queueSize = queueSize + 1; + ctx->queue = (POOL_job*)ZSTD_customCalloc(ctx->queueSize * sizeof(POOL_job), customMem); + ctx->queueHead = 0; + ctx->queueTail = 0; + ctx->numThreadsBusy = 0; + ctx->queueEmpty = 1; + { + int error = 0; + error |= ZSTD_pthread_mutex_init(&ctx->queueMutex, NULL); + error |= ZSTD_pthread_cond_init(&ctx->queuePushCond, NULL); + error |= ZSTD_pthread_cond_init(&ctx->queuePopCond, NULL); + if (error) { POOL_free(ctx); return NULL; } + } + ctx->shutdown = 0; + /* Allocate space for the thread handles */ + ctx->threads = (ZSTD_pthread_t*)ZSTD_customCalloc(numThreads * sizeof(ZSTD_pthread_t), customMem); + ctx->threadCapacity = 0; + ctx->customMem = customMem; + /* Check for errors */ + if (!ctx->threads || !ctx->queue) { POOL_free(ctx); return NULL; } + /* Initialize the threads */ + { size_t i; + for (i = 0; i < numThreads; ++i) { + if (ZSTD_pthread_create(&ctx->threads[i], NULL, &POOL_thread, ctx)) { + ctx->threadCapacity = i; + POOL_free(ctx); + return NULL; + } } + ctx->threadCapacity = numThreads; + ctx->threadLimit = numThreads; + } + return ctx; +} + +/*! POOL_join() : + Shutdown the queue, wake any sleeping threads, and join all of the threads. +*/ +static void POOL_join(POOL_ctx* ctx) { + /* Shut down the queue */ + ZSTD_pthread_mutex_lock(&ctx->queueMutex); + ctx->shutdown = 1; + ZSTD_pthread_mutex_unlock(&ctx->queueMutex); + /* Wake up sleeping threads */ + ZSTD_pthread_cond_broadcast(&ctx->queuePushCond); + ZSTD_pthread_cond_broadcast(&ctx->queuePopCond); + /* Join all of the threads */ + { size_t i; + for (i = 0; i < ctx->threadCapacity; ++i) { + ZSTD_pthread_join(ctx->threads[i]); /* note : could fail */ + } } +} + +void POOL_free(POOL_ctx *ctx) { + if (!ctx) { return; } + POOL_join(ctx); + ZSTD_pthread_mutex_destroy(&ctx->queueMutex); + ZSTD_pthread_cond_destroy(&ctx->queuePushCond); + ZSTD_pthread_cond_destroy(&ctx->queuePopCond); + ZSTD_customFree(ctx->queue, ctx->customMem); + ZSTD_customFree(ctx->threads, ctx->customMem); + ZSTD_customFree(ctx, ctx->customMem); +} + +/*! POOL_joinJobs() : + * Waits for all queued jobs to finish executing. + */ +void POOL_joinJobs(POOL_ctx* ctx) { + ZSTD_pthread_mutex_lock(&ctx->queueMutex); + while(!ctx->queueEmpty || ctx->numThreadsBusy > 0) { + ZSTD_pthread_cond_wait(&ctx->queuePushCond, &ctx->queueMutex); + } + ZSTD_pthread_mutex_unlock(&ctx->queueMutex); +} + +void ZSTD_freeThreadPool (ZSTD_threadPool* pool) { + POOL_free (pool); +} + +size_t POOL_sizeof(const POOL_ctx* ctx) { + if (ctx==NULL) return 0; /* supports sizeof NULL */ + return sizeof(*ctx) + + ctx->queueSize * sizeof(POOL_job) + + ctx->threadCapacity * sizeof(ZSTD_pthread_t); +} + + +/* @return : 0 on success, 1 on error */ +static int POOL_resize_internal(POOL_ctx* ctx, size_t numThreads) +{ + if (numThreads <= ctx->threadCapacity) { + if (!numThreads) return 1; + ctx->threadLimit = numThreads; + return 0; + } + /* numThreads > threadCapacity */ + { ZSTD_pthread_t* const threadPool = (ZSTD_pthread_t*)ZSTD_customCalloc(numThreads * sizeof(ZSTD_pthread_t), ctx->customMem); + if (!threadPool) return 1; + /* replace existing thread pool */ + ZSTD_memcpy(threadPool, ctx->threads, ctx->threadCapacity * sizeof(*threadPool)); + ZSTD_customFree(ctx->threads, ctx->customMem); + ctx->threads = threadPool; + /* Initialize additional threads */ + { size_t threadId; + for (threadId = ctx->threadCapacity; threadId < numThreads; ++threadId) { + if (ZSTD_pthread_create(&threadPool[threadId], NULL, &POOL_thread, ctx)) { + ctx->threadCapacity = threadId; + return 1; + } } + } } + /* successfully expanded */ + ctx->threadCapacity = numThreads; + ctx->threadLimit = numThreads; + return 0; +} + +/* @return : 0 on success, 1 on error */ +int POOL_resize(POOL_ctx* ctx, size_t numThreads) +{ + int result; + if (ctx==NULL) return 1; + ZSTD_pthread_mutex_lock(&ctx->queueMutex); + result = POOL_resize_internal(ctx, numThreads); + ZSTD_pthread_cond_broadcast(&ctx->queuePopCond); + ZSTD_pthread_mutex_unlock(&ctx->queueMutex); + return result; +} + +/** + * Returns 1 if the queue is full and 0 otherwise. + * + * When queueSize is 1 (pool was created with an intended queueSize of 0), + * then a queue is empty if there is a thread free _and_ no job is waiting. + */ +static int isQueueFull(POOL_ctx const* ctx) { + if (ctx->queueSize > 1) { + return ctx->queueHead == ((ctx->queueTail + 1) % ctx->queueSize); + } else { + return (ctx->numThreadsBusy == ctx->threadLimit) || + !ctx->queueEmpty; + } +} + + +static void +POOL_add_internal(POOL_ctx* ctx, POOL_function function, void *opaque) +{ + POOL_job job; + job.function = function; + job.opaque = opaque; + assert(ctx != NULL); + if (ctx->shutdown) return; + + ctx->queueEmpty = 0; + ctx->queue[ctx->queueTail] = job; + ctx->queueTail = (ctx->queueTail + 1) % ctx->queueSize; + ZSTD_pthread_cond_signal(&ctx->queuePopCond); +} + +void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque) +{ + assert(ctx != NULL); + ZSTD_pthread_mutex_lock(&ctx->queueMutex); + /* Wait until there is space in the queue for the new job */ + while (isQueueFull(ctx) && (!ctx->shutdown)) { + ZSTD_pthread_cond_wait(&ctx->queuePushCond, &ctx->queueMutex); + } + POOL_add_internal(ctx, function, opaque); + ZSTD_pthread_mutex_unlock(&ctx->queueMutex); +} + + +int POOL_tryAdd(POOL_ctx* ctx, POOL_function function, void* opaque) +{ + assert(ctx != NULL); + ZSTD_pthread_mutex_lock(&ctx->queueMutex); + if (isQueueFull(ctx)) { + ZSTD_pthread_mutex_unlock(&ctx->queueMutex); + return 0; + } + POOL_add_internal(ctx, function, opaque); + ZSTD_pthread_mutex_unlock(&ctx->queueMutex); + return 1; +} + + +#else /* ZSTD_MULTITHREAD not defined */ + +/* ========================== */ +/* No multi-threading support */ +/* ========================== */ + + +/* We don't need any data, but if it is empty, malloc() might return NULL. */ +struct POOL_ctx_s { + int dummy; +}; +static POOL_ctx g_poolCtx; + +POOL_ctx* POOL_create(size_t numThreads, size_t queueSize) { + return POOL_create_advanced(numThreads, queueSize, ZSTD_defaultCMem); +} + +POOL_ctx* +POOL_create_advanced(size_t numThreads, size_t queueSize, ZSTD_customMem customMem) +{ + (void)numThreads; + (void)queueSize; + (void)customMem; + return &g_poolCtx; +} + +void POOL_free(POOL_ctx* ctx) { + assert(!ctx || ctx == &g_poolCtx); + (void)ctx; +} + +void POOL_joinJobs(POOL_ctx* ctx){ + assert(!ctx || ctx == &g_poolCtx); + (void)ctx; +} + +int POOL_resize(POOL_ctx* ctx, size_t numThreads) { + (void)ctx; (void)numThreads; + return 0; +} + +void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque) { + (void)ctx; + function(opaque); +} + +int POOL_tryAdd(POOL_ctx* ctx, POOL_function function, void* opaque) { + (void)ctx; + function(opaque); + return 1; +} + +size_t POOL_sizeof(const POOL_ctx* ctx) { + if (ctx==NULL) return 0; /* supports sizeof NULL */ + assert(ctx == &g_poolCtx); + return sizeof(*ctx); +} + +#endif /* ZSTD_MULTITHREAD */ +/**** ended inlining common/pool.c ****/ +/**** start inlining common/zstd_common.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + + +/*-************************************* +* Dependencies +***************************************/ +#define ZSTD_DEPS_NEED_MALLOC +/**** skipping file: error_private.h ****/ +/**** start inlining zstd_internal.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_CCOMMON_H_MODULE +#define ZSTD_CCOMMON_H_MODULE + +/* this module contains definitions which must be identical + * across compression, decompression and dictBuilder. + * It also contains a few functions useful to at least 2 of them + * and which benefit from being inlined */ + +/*-************************************* +* Dependencies +***************************************/ +/**** skipping file: compiler.h ****/ +/**** start inlining cpu.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_COMMON_CPU_H +#define ZSTD_COMMON_CPU_H + +/** + * Implementation taken from folly/CpuId.h + * https://github.com/facebook/folly/blob/master/folly/CpuId.h + */ + +/**** skipping file: mem.h ****/ + +#ifdef _MSC_VER +#include +#endif + +typedef struct { + U32 f1c; + U32 f1d; + U32 f7b; + U32 f7c; +} ZSTD_cpuid_t; + +MEM_STATIC ZSTD_cpuid_t ZSTD_cpuid(void) { + U32 f1c = 0; + U32 f1d = 0; + U32 f7b = 0; + U32 f7c = 0; +#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) + int reg[4]; + __cpuid((int*)reg, 0); + { + int const n = reg[0]; + if (n >= 1) { + __cpuid((int*)reg, 1); + f1c = (U32)reg[2]; + f1d = (U32)reg[3]; + } + if (n >= 7) { + __cpuidex((int*)reg, 7, 0); + f7b = (U32)reg[1]; + f7c = (U32)reg[2]; + } + } +#elif defined(__i386__) && defined(__PIC__) && !defined(__clang__) && defined(__GNUC__) + /* The following block like the normal cpuid branch below, but gcc + * reserves ebx for use of its pic register so we must specially + * handle the save and restore to avoid clobbering the register + */ + U32 n; + __asm__( + "pushl %%ebx\n\t" + "cpuid\n\t" + "popl %%ebx\n\t" + : "=a"(n) + : "a"(0) + : "ecx", "edx"); + if (n >= 1) { + U32 f1a; + __asm__( + "pushl %%ebx\n\t" + "cpuid\n\t" + "popl %%ebx\n\t" + : "=a"(f1a), "=c"(f1c), "=d"(f1d) + : "a"(1)); + } + if (n >= 7) { + __asm__( + "pushl %%ebx\n\t" + "cpuid\n\t" + "movl %%ebx, %%eax\n\t" + "popl %%ebx" + : "=a"(f7b), "=c"(f7c) + : "a"(7), "c"(0) + : "edx"); + } +#elif defined(__x86_64__) || defined(_M_X64) || defined(__i386__) + U32 n; + __asm__("cpuid" : "=a"(n) : "a"(0) : "ebx", "ecx", "edx"); + if (n >= 1) { + U32 f1a; + __asm__("cpuid" : "=a"(f1a), "=c"(f1c), "=d"(f1d) : "a"(1) : "ebx"); + } + if (n >= 7) { + U32 f7a; + __asm__("cpuid" + : "=a"(f7a), "=b"(f7b), "=c"(f7c) + : "a"(7), "c"(0) + : "edx"); + } +#endif + { + ZSTD_cpuid_t cpuid; + cpuid.f1c = f1c; + cpuid.f1d = f1d; + cpuid.f7b = f7b; + cpuid.f7c = f7c; + return cpuid; + } +} + +#define X(name, r, bit) \ + MEM_STATIC int ZSTD_cpuid_##name(ZSTD_cpuid_t const cpuid) { \ + return ((cpuid.r) & (1U << bit)) != 0; \ + } + +/* cpuid(1): Processor Info and Feature Bits. */ +#define C(name, bit) X(name, f1c, bit) + C(sse3, 0) + C(pclmuldq, 1) + C(dtes64, 2) + C(monitor, 3) + C(dscpl, 4) + C(vmx, 5) + C(smx, 6) + C(eist, 7) + C(tm2, 8) + C(ssse3, 9) + C(cnxtid, 10) + C(fma, 12) + C(cx16, 13) + C(xtpr, 14) + C(pdcm, 15) + C(pcid, 17) + C(dca, 18) + C(sse41, 19) + C(sse42, 20) + C(x2apic, 21) + C(movbe, 22) + C(popcnt, 23) + C(tscdeadline, 24) + C(aes, 25) + C(xsave, 26) + C(osxsave, 27) + C(avx, 28) + C(f16c, 29) + C(rdrand, 30) +#undef C +#define D(name, bit) X(name, f1d, bit) + D(fpu, 0) + D(vme, 1) + D(de, 2) + D(pse, 3) + D(tsc, 4) + D(msr, 5) + D(pae, 6) + D(mce, 7) + D(cx8, 8) + D(apic, 9) + D(sep, 11) + D(mtrr, 12) + D(pge, 13) + D(mca, 14) + D(cmov, 15) + D(pat, 16) + D(pse36, 17) + D(psn, 18) + D(clfsh, 19) + D(ds, 21) + D(acpi, 22) + D(mmx, 23) + D(fxsr, 24) + D(sse, 25) + D(sse2, 26) + D(ss, 27) + D(htt, 28) + D(tm, 29) + D(pbe, 31) +#undef D + +/* cpuid(7): Extended Features. */ +#define B(name, bit) X(name, f7b, bit) + B(bmi1, 3) + B(hle, 4) + B(avx2, 5) + B(smep, 7) + B(bmi2, 8) + B(erms, 9) + B(invpcid, 10) + B(rtm, 11) + B(mpx, 14) + B(avx512f, 16) + B(avx512dq, 17) + B(rdseed, 18) + B(adx, 19) + B(smap, 20) + B(avx512ifma, 21) + B(pcommit, 22) + B(clflushopt, 23) + B(clwb, 24) + B(avx512pf, 26) + B(avx512er, 27) + B(avx512cd, 28) + B(sha, 29) + B(avx512bw, 30) + B(avx512vl, 31) +#undef B +#define C(name, bit) X(name, f7c, bit) + C(prefetchwt1, 0) + C(avx512vbmi, 1) +#undef C + +#undef X + +#endif /* ZSTD_COMMON_CPU_H */ +/**** ended inlining cpu.h ****/ +/**** skipping file: mem.h ****/ +/**** skipping file: debug.h ****/ +/**** skipping file: error_private.h ****/ +#define ZSTD_STATIC_LINKING_ONLY +/**** skipping file: ../zstd.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: fse.h ****/ +/**** skipping file: huf.h ****/ +#ifndef XXH_STATIC_LINKING_ONLY +# define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */ +#endif +/**** start inlining xxhash.h ****/ +/* + * xxHash - Fast Hash algorithm + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - xxHash homepage: https://cyan4973.github.io/xxHash/ + * - xxHash source repository : https://github.com/Cyan4973/xxHash + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +*/ + + +#ifndef XXH_NO_XXH3 +# define XXH_NO_XXH3 +#endif + +#ifndef XXH_NAMESPACE +# define XXH_NAMESPACE ZSTD_ +#endif + +/*! + * @mainpage xxHash + * + * @file xxhash.h + * xxHash prototypes and implementation + */ +/* TODO: update */ +/* Notice extracted from xxHash homepage: + +xxHash is an extremely fast hash algorithm, running at RAM speed limits. +It also successfully passes all tests from the SMHasher suite. + +Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz) + +Name Speed Q.Score Author +xxHash 5.4 GB/s 10 +CrapWow 3.2 GB/s 2 Andrew +MurmurHash 3a 2.7 GB/s 10 Austin Appleby +SpookyHash 2.0 GB/s 10 Bob Jenkins +SBox 1.4 GB/s 9 Bret Mulvey +Lookup3 1.2 GB/s 9 Bob Jenkins +SuperFastHash 1.2 GB/s 1 Paul Hsieh +CityHash64 1.05 GB/s 10 Pike & Alakuijala +FNV 0.55 GB/s 5 Fowler, Noll, Vo +CRC32 0.43 GB/s 9 +MD5-32 0.33 GB/s 10 Ronald L. Rivest +SHA1-32 0.28 GB/s 10 + +Q.Score is a measure of quality of the hash function. +It depends on successfully passing SMHasher test set. +10 is a perfect score. + +Note: SMHasher's CRC32 implementation is not the fastest one. +Other speed-oriented implementations can be faster, +especially in combination with PCLMUL instruction: +https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html?showComment=1552696407071#c3490092340461170735 + +A 64-bit version, named XXH64, is available since r35. +It offers much better speed, but for 64-bit applications only. +Name Speed on 64 bits Speed on 32 bits +XXH64 13.8 GB/s 1.9 GB/s +XXH32 6.8 GB/s 6.0 GB/s +*/ + +#if defined (__cplusplus) +extern "C" { +#endif + +/* **************************** + * INLINE mode + ******************************/ +/*! + * XXH_INLINE_ALL (and XXH_PRIVATE_API) + * Use these build macros to inline xxhash into the target unit. + * Inlining improves performance on small inputs, especially when the length is + * expressed as a compile-time constant: + * + * https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html + * + * It also keeps xxHash symbols private to the unit, so they are not exported. + * + * Usage: + * #define XXH_INLINE_ALL + * #include "xxhash.h" + * + * Do not compile and link xxhash.o as a separate object, as it is not useful. + */ +#if (defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)) \ + && !defined(XXH_INLINE_ALL_31684351384) + /* this section should be traversed only once */ +# define XXH_INLINE_ALL_31684351384 + /* give access to the advanced API, required to compile implementations */ +# undef XXH_STATIC_LINKING_ONLY /* avoid macro redef */ +# define XXH_STATIC_LINKING_ONLY + /* make all functions private */ +# undef XXH_PUBLIC_API +# if defined(__GNUC__) +# define XXH_PUBLIC_API static __inline __attribute__((unused)) +# elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# define XXH_PUBLIC_API static inline +# elif defined(_MSC_VER) +# define XXH_PUBLIC_API static __inline +# else + /* note: this version may generate warnings for unused static functions */ +# define XXH_PUBLIC_API static +# endif + + /* + * This part deals with the special case where a unit wants to inline xxHash, + * but "xxhash.h" has previously been included without XXH_INLINE_ALL, + * such as part of some previously included *.h header file. + * Without further action, the new include would just be ignored, + * and functions would effectively _not_ be inlined (silent failure). + * The following macros solve this situation by prefixing all inlined names, + * avoiding naming collision with previous inclusions. + */ + /* Before that, we unconditionally #undef all symbols, + * in case they were already defined with XXH_NAMESPACE. + * They will then be redefined for XXH_INLINE_ALL + */ +# undef XXH_versionNumber + /* XXH32 */ +# undef XXH32 +# undef XXH32_createState +# undef XXH32_freeState +# undef XXH32_reset +# undef XXH32_update +# undef XXH32_digest +# undef XXH32_copyState +# undef XXH32_canonicalFromHash +# undef XXH32_hashFromCanonical + /* XXH64 */ +# undef XXH64 +# undef XXH64_createState +# undef XXH64_freeState +# undef XXH64_reset +# undef XXH64_update +# undef XXH64_digest +# undef XXH64_copyState +# undef XXH64_canonicalFromHash +# undef XXH64_hashFromCanonical + /* XXH3_64bits */ +# undef XXH3_64bits +# undef XXH3_64bits_withSecret +# undef XXH3_64bits_withSeed +# undef XXH3_64bits_withSecretandSeed +# undef XXH3_createState +# undef XXH3_freeState +# undef XXH3_copyState +# undef XXH3_64bits_reset +# undef XXH3_64bits_reset_withSeed +# undef XXH3_64bits_reset_withSecret +# undef XXH3_64bits_update +# undef XXH3_64bits_digest +# undef XXH3_generateSecret + /* XXH3_128bits */ +# undef XXH128 +# undef XXH3_128bits +# undef XXH3_128bits_withSeed +# undef XXH3_128bits_withSecret +# undef XXH3_128bits_reset +# undef XXH3_128bits_reset_withSeed +# undef XXH3_128bits_reset_withSecret +# undef XXH3_128bits_reset_withSecretandSeed +# undef XXH3_128bits_update +# undef XXH3_128bits_digest +# undef XXH128_isEqual +# undef XXH128_cmp +# undef XXH128_canonicalFromHash +# undef XXH128_hashFromCanonical + /* Finally, free the namespace itself */ +# undef XXH_NAMESPACE + + /* employ the namespace for XXH_INLINE_ALL */ +# define XXH_NAMESPACE XXH_INLINE_ + /* + * Some identifiers (enums, type names) are not symbols, + * but they must nonetheless be renamed to avoid redeclaration. + * Alternative solution: do not redeclare them. + * However, this requires some #ifdefs, and has a more dispersed impact. + * Meanwhile, renaming can be achieved in a single place. + */ +# define XXH_IPREF(Id) XXH_NAMESPACE ## Id +# define XXH_OK XXH_IPREF(XXH_OK) +# define XXH_ERROR XXH_IPREF(XXH_ERROR) +# define XXH_errorcode XXH_IPREF(XXH_errorcode) +# define XXH32_canonical_t XXH_IPREF(XXH32_canonical_t) +# define XXH64_canonical_t XXH_IPREF(XXH64_canonical_t) +# define XXH128_canonical_t XXH_IPREF(XXH128_canonical_t) +# define XXH32_state_s XXH_IPREF(XXH32_state_s) +# define XXH32_state_t XXH_IPREF(XXH32_state_t) +# define XXH64_state_s XXH_IPREF(XXH64_state_s) +# define XXH64_state_t XXH_IPREF(XXH64_state_t) +# define XXH3_state_s XXH_IPREF(XXH3_state_s) +# define XXH3_state_t XXH_IPREF(XXH3_state_t) +# define XXH128_hash_t XXH_IPREF(XXH128_hash_t) + /* Ensure the header is parsed again, even if it was previously included */ +# undef XXHASH_H_5627135585666179 +# undef XXHASH_H_STATIC_13879238742 +#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */ + + + +/* **************************************************************** + * Stable API + *****************************************************************/ +#ifndef XXHASH_H_5627135585666179 +#define XXHASH_H_5627135585666179 1 + + +/*! + * @defgroup public Public API + * Contains details on the public xxHash functions. + * @{ + */ +/* specific declaration modes for Windows */ +#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API) +# if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT)) +# ifdef XXH_EXPORT +# define XXH_PUBLIC_API __declspec(dllexport) +# elif XXH_IMPORT +# define XXH_PUBLIC_API __declspec(dllimport) +# endif +# else +# define XXH_PUBLIC_API /* do nothing */ +# endif +#endif + +#ifdef XXH_DOXYGEN +/*! + * @brief Emulate a namespace by transparently prefixing all symbols. + * + * If you want to include _and expose_ xxHash functions from within your own + * library, but also want to avoid symbol collisions with other libraries which + * may also include xxHash, you can use XXH_NAMESPACE to automatically prefix + * any public symbol from xxhash library with the value of XXH_NAMESPACE + * (therefore, avoid empty or numeric values). + * + * Note that no change is required within the calling program as long as it + * includes `xxhash.h`: Regular symbol names will be automatically translated + * by this header. + */ +# define XXH_NAMESPACE /* YOUR NAME HERE */ +# undef XXH_NAMESPACE +#endif + +#ifdef XXH_NAMESPACE +# define XXH_CAT(A,B) A##B +# define XXH_NAME2(A,B) XXH_CAT(A,B) +# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber) +/* XXH32 */ +# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32) +# define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState) +# define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState) +# define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset) +# define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update) +# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest) +# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState) +# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash) +# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical) +/* XXH64 */ +# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64) +# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState) +# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState) +# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset) +# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update) +# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest) +# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState) +# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash) +# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical) +/* XXH3_64bits */ +# define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits) +# define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret) +# define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed) +# define XXH3_64bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecretandSeed) +# define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState) +# define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState) +# define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState) +# define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset) +# define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed) +# define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret) +# define XXH3_64bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecretandSeed) +# define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update) +# define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest) +# define XXH3_generateSecret XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret) +# define XXH3_generateSecret_fromSeed XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret_fromSeed) +/* XXH3_128bits */ +# define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128) +# define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits) +# define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed) +# define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret) +# define XXH3_128bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecretandSeed) +# define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset) +# define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed) +# define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret) +# define XXH3_128bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecretandSeed) +# define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update) +# define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest) +# define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual) +# define XXH128_cmp XXH_NAME2(XXH_NAMESPACE, XXH128_cmp) +# define XXH128_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH128_canonicalFromHash) +# define XXH128_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH128_hashFromCanonical) +#endif + + +/* ************************************* +* Version +***************************************/ +#define XXH_VERSION_MAJOR 0 +#define XXH_VERSION_MINOR 8 +#define XXH_VERSION_RELEASE 1 +#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE) + +/*! + * @brief Obtains the xxHash version. + * + * This is mostly useful when xxHash is compiled as a shared library, + * since the returned value comes from the library, as opposed to header file. + * + * @return `XXH_VERSION_NUMBER` of the invoked library. + */ +XXH_PUBLIC_API unsigned XXH_versionNumber (void); + + +/* **************************** +* Common basic types +******************************/ +#include /* size_t */ +typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; + + +/*-********************************************************************** +* 32-bit hash +************************************************************************/ +#if defined(XXH_DOXYGEN) /* Don't show include */ +/*! + * @brief An unsigned 32-bit integer. + * + * Not necessarily defined to `uint32_t` but functionally equivalent. + */ +typedef uint32_t XXH32_hash_t; + +#elif !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include + typedef uint32_t XXH32_hash_t; + +#else +# include +# if UINT_MAX == 0xFFFFFFFFUL + typedef unsigned int XXH32_hash_t; +# else +# if ULONG_MAX == 0xFFFFFFFFUL + typedef unsigned long XXH32_hash_t; +# else +# error "unsupported platform: need a 32-bit type" +# endif +# endif +#endif + +/*! + * @} + * + * @defgroup xxh32_family XXH32 family + * @ingroup public + * Contains functions used in the classic 32-bit xxHash algorithm. + * + * @note + * XXH32 is useful for older platforms, with no or poor 64-bit performance. + * Note that @ref xxh3_family provides competitive speed + * for both 32-bit and 64-bit systems, and offers true 64/128 bit hash results. + * + * @see @ref xxh64_family, @ref xxh3_family : Other xxHash families + * @see @ref xxh32_impl for implementation details + * @{ + */ + +/*! + * @brief Calculates the 32-bit hash of @p input using xxHash32. + * + * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark): 5.4 GB/s + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 32-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 32-bit hash value. + * + * @see + * XXH64(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH32_createState(), XXH32_update(), XXH32_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed); + +/*! + * Streaming functions generate the xxHash value from an incremental input. + * This method is slower than single-call functions, due to state management. + * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized. + * + * An XXH state must first be allocated using `XXH*_createState()`. + * + * Start a new hash by initializing the state with a seed using `XXH*_reset()`. + * + * Then, feed the hash state by calling `XXH*_update()` as many times as necessary. + * + * The function returns an error code, with 0 meaning OK, and any other value + * meaning there is an error. + * + * Finally, a hash value can be produced anytime, by using `XXH*_digest()`. + * This function returns the nn-bits hash as an int or long long. + * + * It's still possible to continue inserting input into the hash state after a + * digest, and generate new hash values later on by invoking `XXH*_digest()`. + * + * When done, release the state using `XXH*_freeState()`. + * + * Example code for incrementally hashing a file: + * @code{.c} + * #include + * #include + * #define BUFFER_SIZE 256 + * + * // Note: XXH64 and XXH3 use the same interface. + * XXH32_hash_t + * hashFile(FILE* stream) + * { + * XXH32_state_t* state; + * unsigned char buf[BUFFER_SIZE]; + * size_t amt; + * XXH32_hash_t hash; + * + * state = XXH32_createState(); // Create a state + * assert(state != NULL); // Error check here + * XXH32_reset(state, 0xbaad5eed); // Reset state with our seed + * while ((amt = fread(buf, 1, sizeof(buf), stream)) != 0) { + * XXH32_update(state, buf, amt); // Hash the file in chunks + * } + * hash = XXH32_digest(state); // Finalize the hash + * XXH32_freeState(state); // Clean up + * return hash; + * } + * @endcode + */ + +/*! + * @typedef struct XXH32_state_s XXH32_state_t + * @brief The opaque state struct for the XXH32 streaming API. + * + * @see XXH32_state_s for details. + */ +typedef struct XXH32_state_s XXH32_state_t; + +/*! + * @brief Allocates an @ref XXH32_state_t. + * + * Must be freed with XXH32_freeState(). + * @return An allocated XXH32_state_t on success, `NULL` on failure. + */ +XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void); +/*! + * @brief Frees an @ref XXH32_state_t. + * + * Must be allocated with XXH32_createState(). + * @param statePtr A pointer to an @ref XXH32_state_t allocated with @ref XXH32_createState(). + * @return XXH_OK. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr); +/*! + * @brief Copies one @ref XXH32_state_t to another. + * + * @param dst_state The state to copy to. + * @param src_state The state to copy from. + * @pre + * @p dst_state and @p src_state must not be `NULL` and must not overlap. + */ +XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state); + +/*! + * @brief Resets an @ref XXH32_state_t to begin a new hash. + * + * This function resets and seeds a state. Call it before @ref XXH32_update(). + * + * @param statePtr The state struct to reset. + * @param seed The 32-bit seed to alter the hash result predictably. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, XXH32_hash_t seed); + +/*! + * @brief Consumes a block of @p input to an @ref XXH32_state_t. + * + * Call this to incrementally consume blocks of data. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length); + +/*! + * @brief Returns the calculated hash value from an @ref XXH32_state_t. + * + * @note + * Calling XXH32_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated xxHash32 value from that state. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); + +/******* Canonical representation *******/ + +/* + * The default return values from XXH functions are unsigned 32 and 64 bit + * integers. + * This the simplest and fastest format for further post-processing. + * + * However, this leaves open the question of what is the order on the byte level, + * since little and big endian conventions will store the same number differently. + * + * The canonical representation settles this issue by mandating big-endian + * convention, the same convention as human-readable numbers (large digits first). + * + * When writing hash values to storage, sending them over a network, or printing + * them, it's highly recommended to use the canonical representation to ensure + * portability across a wider range of systems, present and future. + * + * The following functions allow transformation of hash values to and from + * canonical format. + */ + +/*! + * @brief Canonical (big endian) representation of @ref XXH32_hash_t. + */ +typedef struct { + unsigned char digest[4]; /*!< Hash bytes, big endian */ +} XXH32_canonical_t; + +/*! + * @brief Converts an @ref XXH32_hash_t to a big endian @ref XXH32_canonical_t. + * + * @param dst The @ref XXH32_canonical_t pointer to be stored to. + * @param hash The @ref XXH32_hash_t to be converted. + * + * @pre + * @p dst must not be `NULL`. + */ +XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash); + +/*! + * @brief Converts an @ref XXH32_canonical_t to a native @ref XXH32_hash_t. + * + * @param src The @ref XXH32_canonical_t to convert. + * + * @pre + * @p src must not be `NULL`. + * + * @return The converted hash. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src); + + +#ifdef __has_attribute +# define XXH_HAS_ATTRIBUTE(x) __has_attribute(x) +#else +# define XXH_HAS_ATTRIBUTE(x) 0 +#endif + +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute) +# define XXH_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define XXH_HAS_C_ATTRIBUTE(x) 0 +#endif + +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define XXH_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define XXH_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +/* +Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute +introduced in CPP17 and C23. +CPP17 : https://en.cppreference.com/w/cpp/language/attributes/fallthrough +C23 : https://en.cppreference.com/w/c/language/attributes/fallthrough +*/ +#if XXH_HAS_C_ATTRIBUTE(x) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_CPP_ATTRIBUTE(x) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_ATTRIBUTE(__fallthrough__) +# define XXH_FALLTHROUGH __attribute__ ((fallthrough)) +#else +# define XXH_FALLTHROUGH +#endif + +/*! + * @} + * @ingroup public + * @{ + */ + +#ifndef XXH_NO_LONG_LONG +/*-********************************************************************** +* 64-bit hash +************************************************************************/ +#if defined(XXH_DOXYGEN) /* don't include */ +/*! + * @brief An unsigned 64-bit integer. + * + * Not necessarily defined to `uint64_t` but functionally equivalent. + */ +typedef uint64_t XXH64_hash_t; +#elif !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include + typedef uint64_t XXH64_hash_t; +#else +# include +# if defined(__LP64__) && ULONG_MAX == 0xFFFFFFFFFFFFFFFFULL + /* LP64 ABI says uint64_t is unsigned long */ + typedef unsigned long XXH64_hash_t; +# else + /* the following type must have a width of 64-bit */ + typedef unsigned long long XXH64_hash_t; +# endif +#endif + +/*! + * @} + * + * @defgroup xxh64_family XXH64 family + * @ingroup public + * @{ + * Contains functions used in the classic 64-bit xxHash algorithm. + * + * @note + * XXH3 provides competitive speed for both 32-bit and 64-bit systems, + * and offers true 64/128 bit hash results. + * It provides better speed for systems with vector processing capabilities. + */ + + +/*! + * @brief Calculates the 64-bit hash of @p input using xxHash64. + * + * This function usually runs faster on 64-bit systems, but slower on 32-bit + * systems (see benchmark). + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 64-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 64-bit hash. + * + * @see + * XXH32(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH64_createState(), XXH64_update(), XXH64_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH64_hash_t XXH64(const void* input, size_t length, XXH64_hash_t seed); + +/******* Streaming *******/ +/*! + * @brief The opaque state struct for the XXH64 streaming API. + * + * @see XXH64_state_s for details. + */ +typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ +XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void); +XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr); +XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state); + +XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, XXH64_hash_t seed); +XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length); +XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr); + +/******* Canonical representation *******/ +typedef struct { unsigned char digest[sizeof(XXH64_hash_t)]; } XXH64_canonical_t; +XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash); +XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src); + +#ifndef XXH_NO_XXH3 +/*! + * @} + * ************************************************************************ + * @defgroup xxh3_family XXH3 family + * @ingroup public + * @{ + * + * XXH3 is a more recent hash algorithm featuring: + * - Improved speed for both small and large inputs + * - True 64-bit and 128-bit outputs + * - SIMD acceleration + * - Improved 32-bit viability + * + * Speed analysis methodology is explained here: + * + * https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html + * + * Compared to XXH64, expect XXH3 to run approximately + * ~2x faster on large inputs and >3x faster on small ones, + * exact differences vary depending on platform. + * + * XXH3's speed benefits greatly from SIMD and 64-bit arithmetic, + * but does not require it. + * Any 32-bit and 64-bit targets that can run XXH32 smoothly + * can run XXH3 at competitive speeds, even without vector support. + * Further details are explained in the implementation. + * + * Optimized implementations are provided for AVX512, AVX2, SSE2, NEON, POWER8, + * ZVector and scalar targets. This can be controlled via the XXH_VECTOR macro. + * + * XXH3 implementation is portable: + * it has a generic C90 formulation that can be compiled on any platform, + * all implementations generage exactly the same hash value on all platforms. + * Starting from v0.8.0, it's also labelled "stable", meaning that + * any future version will also generate the same hash value. + * + * XXH3 offers 2 variants, _64bits and _128bits. + * + * When only 64 bits are needed, prefer invoking the _64bits variant, as it + * reduces the amount of mixing, resulting in faster speed on small inputs. + * It's also generally simpler to manipulate a scalar return type than a struct. + * + * The API supports one-shot hashing, streaming mode, and custom secrets. + */ + +/*-********************************************************************** +* XXH3 64-bit variant +************************************************************************/ + +/* XXH3_64bits(): + * default 64-bit variant, using default secret and default seed of 0. + * It's the fastest variant. */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* data, size_t len); + +/* + * XXH3_64bits_withSeed(): + * This variant generates a custom secret on the fly + * based on default secret altered using the `seed` value. + * While this operation is decently fast, note that it's not completely free. + * Note: seed==0 produces the same results as XXH3_64bits(). + */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* data, size_t len, XXH64_hash_t seed); + +/*! + * The bare minimum size for a custom secret. + * + * @see + * XXH3_64bits_withSecret(), XXH3_64bits_reset_withSecret(), + * XXH3_128bits_withSecret(), XXH3_128bits_reset_withSecret(). + */ +#define XXH3_SECRET_SIZE_MIN 136 + +/* + * XXH3_64bits_withSecret(): + * It's possible to provide any blob of bytes as a "secret" to generate the hash. + * This makes it more difficult for an external actor to prepare an intentional collision. + * The main condition is that secretSize *must* be large enough (>= XXH3_SECRET_SIZE_MIN). + * However, the quality of the secret impacts the dispersion of the hash algorithm. + * Therefore, the secret _must_ look like a bunch of random bytes. + * Avoid "trivial" or structured data such as repeated sequences or a text document. + * Whenever in doubt about the "randomness" of the blob of bytes, + * consider employing "XXH3_generateSecret()" instead (see below). + * It will generate a proper high entropy secret derived from the blob of bytes. + * Another advantage of using XXH3_generateSecret() is that + * it guarantees that all bits within the initial blob of bytes + * will impact every bit of the output. + * This is not necessarily the case when using the blob of bytes directly + * because, when hashing _small_ inputs, only a portion of the secret is employed. + */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize); + + +/******* Streaming *******/ +/* + * Streaming requires state maintenance. + * This operation costs memory and CPU. + * As a consequence, streaming is slower than one-shot hashing. + * For better performance, prefer one-shot functions whenever applicable. + */ + +/*! + * @brief The state struct for the XXH3 streaming API. + * + * @see XXH3_state_s for details. + */ +typedef struct XXH3_state_s XXH3_state_t; +XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void); +XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr); +XXH_PUBLIC_API void XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state); + +/* + * XXH3_64bits_reset(): + * Initialize with default parameters. + * digest will be equivalent to `XXH3_64bits()`. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH3_state_t* statePtr); +/* + * XXH3_64bits_reset_withSeed(): + * Generate a custom secret from `seed`, and store it into `statePtr`. + * digest will be equivalent to `XXH3_64bits_withSeed()`. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed); +/* + * XXH3_64bits_reset_withSecret(): + * `secret` is referenced, it _must outlive_ the hash streaming session. + * Similar to one-shot API, `secretSize` must be >= `XXH3_SECRET_SIZE_MIN`, + * and the quality of produced hash values depends on secret's entropy + * (secret's content should look like a bunch of random bytes). + * When in doubt about the randomness of a candidate `secret`, + * consider employing `XXH3_generateSecret()` instead (see below). + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize); + +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH3_state_t* statePtr, const void* input, size_t length); +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* statePtr); + +/* note : canonical representation of XXH3 is the same as XXH64 + * since they both produce XXH64_hash_t values */ + + +/*-********************************************************************** +* XXH3 128-bit variant +************************************************************************/ + +/*! + * @brief The return value from 128-bit hashes. + * + * Stored in little endian order, although the fields themselves are in native + * endianness. + */ +typedef struct { + XXH64_hash_t low64; /*!< `value & 0xFFFFFFFFFFFFFFFF` */ + XXH64_hash_t high64; /*!< `value >> 64` */ +} XXH128_hash_t; + +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* data, size_t len); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed(const void* data, size_t len, XXH64_hash_t seed); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize); + +/******* Streaming *******/ +/* + * Streaming requires state maintenance. + * This operation costs memory and CPU. + * As a consequence, streaming is slower than one-shot hashing. + * For better performance, prefer one-shot functions whenever applicable. + * + * XXH3_128bits uses the same XXH3_state_t as XXH3_64bits(). + * Use already declared XXH3_createState() and XXH3_freeState(). + * + * All reset and streaming functions have same meaning as their 64-bit counterpart. + */ + +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH3_state_t* statePtr); +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed); +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize); + +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update (XXH3_state_t* statePtr, const void* input, size_t length); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* statePtr); + +/* Following helper functions make it possible to compare XXH128_hast_t values. + * Since XXH128_hash_t is a structure, this capability is not offered by the language. + * Note: For better performance, these functions can be inlined using XXH_INLINE_ALL */ + +/*! + * XXH128_isEqual(): + * Return: 1 if `h1` and `h2` are equal, 0 if they are not. + */ +XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2); + +/*! + * XXH128_cmp(): + * + * This comparator is compatible with stdlib's `qsort()`/`bsearch()`. + * + * return: >0 if *h128_1 > *h128_2 + * =0 if *h128_1 == *h128_2 + * <0 if *h128_1 < *h128_2 + */ +XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2); + + +/******* Canonical representation *******/ +typedef struct { unsigned char digest[sizeof(XXH128_hash_t)]; } XXH128_canonical_t; +XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash); +XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* src); + + +#endif /* !XXH_NO_XXH3 */ +#endif /* XXH_NO_LONG_LONG */ + +/*! + * @} + */ +#endif /* XXHASH_H_5627135585666179 */ + + + +#if defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) +#define XXHASH_H_STATIC_13879238742 +/* **************************************************************************** + * This section contains declarations which are not guaranteed to remain stable. + * They may change in future versions, becoming incompatible with a different + * version of the library. + * These declarations should only be used with static linking. + * Never use them in association with dynamic linking! + ***************************************************************************** */ + +/* + * These definitions are only present to allow static allocation + * of XXH states, on stack or in a struct, for example. + * Never **ever** access their members directly. + */ + +/*! + * @internal + * @brief Structure for XXH32 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH32_state_t. + * Do not access the members of this struct directly. + * @see XXH64_state_s, XXH3_state_s + */ +struct XXH32_state_s { + XXH32_hash_t total_len_32; /*!< Total length hashed, modulo 2^32 */ + XXH32_hash_t large_len; /*!< Whether the hash is >= 16 (handles @ref total_len_32 overflow) */ + XXH32_hash_t v[4]; /*!< Accumulator lanes */ + XXH32_hash_t mem32[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[16]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem32 */ + XXH32_hash_t reserved; /*!< Reserved field. Do not read nor write to it. */ +}; /* typedef'd to XXH32_state_t */ + + +#ifndef XXH_NO_LONG_LONG /* defined when there is no 64-bit support */ + +/*! + * @internal + * @brief Structure for XXH64 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH64_state_t. + * Do not access the members of this struct directly. + * @see XXH32_state_s, XXH3_state_s + */ +struct XXH64_state_s { + XXH64_hash_t total_len; /*!< Total length hashed. This is always 64-bit. */ + XXH64_hash_t v[4]; /*!< Accumulator lanes */ + XXH64_hash_t mem64[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[32]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem64 */ + XXH32_hash_t reserved32; /*!< Reserved field, needed for padding anyways*/ + XXH64_hash_t reserved64; /*!< Reserved field. Do not read or write to it. */ +}; /* typedef'd to XXH64_state_t */ + + +#ifndef XXH_NO_XXH3 + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* >= C11 */ +# include +# define XXH_ALIGN(n) alignas(n) +#elif defined(__cplusplus) && (__cplusplus >= 201103L) /* >= C++11 */ +/* In C++ alignas() is a keyword */ +# define XXH_ALIGN(n) alignas(n) +#elif defined(__GNUC__) +# define XXH_ALIGN(n) __attribute__ ((aligned(n))) +#elif defined(_MSC_VER) +# define XXH_ALIGN(n) __declspec(align(n)) +#else +# define XXH_ALIGN(n) /* disabled */ +#endif + +/* Old GCC versions only accept the attribute after the type in structures. */ +#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) /* C11+ */ \ + && ! (defined(__cplusplus) && (__cplusplus >= 201103L)) /* >= C++11 */ \ + && defined(__GNUC__) +# define XXH_ALIGN_MEMBER(align, type) type XXH_ALIGN(align) +#else +# define XXH_ALIGN_MEMBER(align, type) XXH_ALIGN(align) type +#endif + +/*! + * @brief The size of the internal XXH3 buffer. + * + * This is the optimal update size for incremental hashing. + * + * @see XXH3_64b_update(), XXH3_128b_update(). + */ +#define XXH3_INTERNALBUFFER_SIZE 256 + +/*! + * @brief Default size of the secret buffer (and @ref XXH3_kSecret). + * + * This is the size used in @ref XXH3_kSecret and the seeded functions. + * + * Not to be confused with @ref XXH3_SECRET_SIZE_MIN. + */ +#define XXH3_SECRET_DEFAULT_SIZE 192 + +/*! + * @internal + * @brief Structure for XXH3 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. + * Otherwise it is an opaque type. + * Never use this definition in combination with dynamic library. + * This allows fields to safely be changed in the future. + * + * @note ** This structure has a strict alignment requirement of 64 bytes!! ** + * Do not allocate this with `malloc()` or `new`, + * it will not be sufficiently aligned. + * Use @ref XXH3_createState() and @ref XXH3_freeState(), or stack allocation. + * + * Typedef'd to @ref XXH3_state_t. + * Do never access the members of this struct directly. + * + * @see XXH3_INITSTATE() for stack initialization. + * @see XXH3_createState(), XXH3_freeState(). + * @see XXH32_state_s, XXH64_state_s + */ +struct XXH3_state_s { + XXH_ALIGN_MEMBER(64, XXH64_hash_t acc[8]); + /*!< The 8 accumulators. Similar to `vN` in @ref XXH32_state_s::v1 and @ref XXH64_state_s */ + XXH_ALIGN_MEMBER(64, unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE]); + /*!< Used to store a custom secret generated from a seed. */ + XXH_ALIGN_MEMBER(64, unsigned char buffer[XXH3_INTERNALBUFFER_SIZE]); + /*!< The internal buffer. @see XXH32_state_s::mem32 */ + XXH32_hash_t bufferedSize; + /*!< The amount of memory in @ref buffer, @see XXH32_state_s::memsize */ + XXH32_hash_t useSeed; + /*!< Reserved field. Needed for padding on 64-bit. */ + size_t nbStripesSoFar; + /*!< Number or stripes processed. */ + XXH64_hash_t totalLen; + /*!< Total length hashed. 64-bit even on 32-bit targets. */ + size_t nbStripesPerBlock; + /*!< Number of stripes per block. */ + size_t secretLimit; + /*!< Size of @ref customSecret or @ref extSecret */ + XXH64_hash_t seed; + /*!< Seed for _withSeed variants. Must be zero otherwise, @see XXH3_INITSTATE() */ + XXH64_hash_t reserved64; + /*!< Reserved field. */ + const unsigned char* extSecret; + /*!< Reference to an external secret for the _withSecret variants, NULL + * for other variants. */ + /* note: there may be some padding at the end due to alignment on 64 bytes */ +}; /* typedef'd to XXH3_state_t */ + +#undef XXH_ALIGN_MEMBER + +/*! + * @brief Initializes a stack-allocated `XXH3_state_s`. + * + * When the @ref XXH3_state_t structure is merely emplaced on stack, + * it should be initialized with XXH3_INITSTATE() or a memset() + * in case its first reset uses XXH3_NNbits_reset_withSeed(). + * This init can be omitted if the first reset uses default or _withSecret mode. + * This operation isn't necessary when the state is created with XXH3_createState(). + * Note that this doesn't prepare the state for a streaming operation, + * it's still necessary to use XXH3_NNbits_reset*() afterwards. + */ +#define XXH3_INITSTATE(XXH3_state_ptr) { (XXH3_state_ptr)->seed = 0; } + + +/* XXH128() : + * simple alias to pre-selected XXH3_128bits variant + */ +XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t seed); + + +/* === Experimental API === */ +/* Symbols defined below must be considered tied to a specific library version. */ + +/* + * XXH3_generateSecret(): + * + * Derive a high-entropy secret from any user-defined content, named customSeed. + * The generated secret can be used in combination with `*_withSecret()` functions. + * The `_withSecret()` variants are useful to provide a higher level of protection than 64-bit seed, + * as it becomes much more difficult for an external actor to guess how to impact the calculation logic. + * + * The function accepts as input a custom seed of any length and any content, + * and derives from it a high-entropy secret of length @secretSize + * into an already allocated buffer @secretBuffer. + * @secretSize must be >= XXH3_SECRET_SIZE_MIN + * + * The generated secret can then be used with any `*_withSecret()` variant. + * Functions `XXH3_128bits_withSecret()`, `XXH3_64bits_withSecret()`, + * `XXH3_128bits_reset_withSecret()` and `XXH3_64bits_reset_withSecret()` + * are part of this list. They all accept a `secret` parameter + * which must be large enough for implementation reasons (>= XXH3_SECRET_SIZE_MIN) + * _and_ feature very high entropy (consist of random-looking bytes). + * These conditions can be a high bar to meet, so + * XXH3_generateSecret() can be employed to ensure proper quality. + * + * customSeed can be anything. It can have any size, even small ones, + * and its content can be anything, even "poor entropy" sources such as a bunch of zeroes. + * The resulting `secret` will nonetheless provide all required qualities. + * + * When customSeedSize > 0, supplying NULL as customSeed is undefined behavior. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize); + + +/* + * XXH3_generateSecret_fromSeed(): + * + * Generate the same secret as the _withSeed() variants. + * + * The resulting secret has a length of XXH3_SECRET_DEFAULT_SIZE (necessarily). + * @secretBuffer must be already allocated, of size at least XXH3_SECRET_DEFAULT_SIZE bytes. + * + * The generated secret can be used in combination with + *`*_withSecret()` and `_withSecretandSeed()` variants. + * This generator is notably useful in combination with `_withSecretandSeed()`, + * as a way to emulate a faster `_withSeed()` variant. + */ +XXH_PUBLIC_API void XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_t seed); + +/* + * *_withSecretandSeed() : + * These variants generate hash values using either + * @seed for "short" keys (< XXH3_MIDSIZE_MAX = 240 bytes) + * or @secret for "large" keys (>= XXH3_MIDSIZE_MAX). + * + * This generally benefits speed, compared to `_withSeed()` or `_withSecret()`. + * `_withSeed()` has to generate the secret on the fly for "large" keys. + * It's fast, but can be perceptible for "not so large" keys (< 1 KB). + * `_withSecret()` has to generate the masks on the fly for "small" keys, + * which requires more instructions than _withSeed() variants. + * Therefore, _withSecretandSeed variant combines the best of both worlds. + * + * When @secret has been generated by XXH3_generateSecret_fromSeed(), + * this variant produces *exactly* the same results as `_withSeed()` variant, + * hence offering only a pure speed benefit on "large" input, + * by skipping the need to regenerate the secret for every large input. + * + * Another usage scenario is to hash the secret to a 64-bit hash value, + * for example with XXH3_64bits(), which then becomes the seed, + * and then employ both the seed and the secret in _withSecretandSeed(). + * On top of speed, an added benefit is that each bit in the secret + * has a 50% chance to swap each bit in the output, + * via its impact to the seed. + * This is not guaranteed when using the secret directly in "small data" scenarios, + * because only portions of the secret are employed for small data. + */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(const void* data, size_t len, + const void* secret, size_t secretSize, + XXH64_hash_t seed); + +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(const void* data, size_t len, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + + +#endif /* XXH_NO_XXH3 */ +#endif /* XXH_NO_LONG_LONG */ +#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) +# define XXH_IMPLEMENTATION +#endif + +#endif /* defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) */ + + +/* ======================================================================== */ +/* ======================================================================== */ +/* ======================================================================== */ + + +/*-********************************************************************** + * xxHash implementation + *-********************************************************************** + * xxHash's implementation used to be hosted inside xxhash.c. + * + * However, inlining requires implementation to be visible to the compiler, + * hence be included alongside the header. + * Previously, implementation was hosted inside xxhash.c, + * which was then #included when inlining was activated. + * This construction created issues with a few build and install systems, + * as it required xxhash.c to be stored in /include directory. + * + * xxHash implementation is now directly integrated within xxhash.h. + * As a consequence, xxhash.c is no longer needed in /include. + * + * xxhash.c is still available and is still useful. + * In a "normal" setup, when xxhash is not inlined, + * xxhash.h only exposes the prototypes and public symbols, + * while xxhash.c can be built into an object file xxhash.o + * which can then be linked into the final binary. + ************************************************************************/ + +#if ( defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) \ + || defined(XXH_IMPLEMENTATION) ) && !defined(XXH_IMPLEM_13a8737387) +# define XXH_IMPLEM_13a8737387 + +/* ************************************* +* Tuning parameters +***************************************/ + +/*! + * @defgroup tuning Tuning parameters + * @{ + * + * Various macros to control xxHash's behavior. + */ +#ifdef XXH_DOXYGEN +/*! + * @brief Define this to disable 64-bit code. + * + * Useful if only using the @ref xxh32_family and you have a strict C90 compiler. + */ +# define XXH_NO_LONG_LONG +# undef XXH_NO_LONG_LONG /* don't actually */ +/*! + * @brief Controls how unaligned memory is accessed. + * + * By default, access to unaligned memory is controlled by `memcpy()`, which is + * safe and portable. + * + * Unfortunately, on some target/compiler combinations, the generated assembly + * is sub-optimal. + * + * The below switch allow selection of a different access method + * in the search for improved performance. + * + * @par Possible options: + * + * - `XXH_FORCE_MEMORY_ACCESS=0` (default): `memcpy` + * @par + * Use `memcpy()`. Safe and portable. Note that most modern compilers will + * eliminate the function call and treat it as an unaligned access. + * + * - `XXH_FORCE_MEMORY_ACCESS=1`: `__attribute__((packed))` + * @par + * Depends on compiler extensions and is therefore not portable. + * This method is safe _if_ your compiler supports it, + * and *generally* as fast or faster than `memcpy`. + * + * - `XXH_FORCE_MEMORY_ACCESS=2`: Direct cast + * @par + * Casts directly and dereferences. This method doesn't depend on the + * compiler, but it violates the C standard as it directly dereferences an + * unaligned pointer. It can generate buggy code on targets which do not + * support unaligned memory accesses, but in some circumstances, it's the + * only known way to get the most performance. + * + * - `XXH_FORCE_MEMORY_ACCESS=3`: Byteshift + * @par + * Also portable. This can generate the best code on old compilers which don't + * inline small `memcpy()` calls, and it might also be faster on big-endian + * systems which lack a native byteswap instruction. However, some compilers + * will emit literal byteshifts even if the target supports unaligned access. + * . + * + * @warning + * Methods 1 and 2 rely on implementation-defined behavior. Use these with + * care, as what works on one compiler/platform/optimization level may cause + * another to read garbage data or even crash. + * + * See https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html for details. + * + * Prefer these methods in priority order (0 > 3 > 1 > 2) + */ +# define XXH_FORCE_MEMORY_ACCESS 0 + +/*! + * @def XXH_FORCE_ALIGN_CHECK + * @brief If defined to non-zero, adds a special path for aligned inputs (XXH32() + * and XXH64() only). + * + * This is an important performance trick for architectures without decent + * unaligned memory access performance. + * + * It checks for input alignment, and when conditions are met, uses a "fast + * path" employing direct 32-bit/64-bit reads, resulting in _dramatically + * faster_ read speed. + * + * The check costs one initial branch per hash, which is generally negligible, + * but not zero. + * + * Moreover, it's not useful to generate an additional code path if memory + * access uses the same instruction for both aligned and unaligned + * addresses (e.g. x86 and aarch64). + * + * In these cases, the alignment check can be removed by setting this macro to 0. + * Then the code will always use unaligned memory access. + * Align check is automatically disabled on x86, x64 & arm64, + * which are platforms known to offer good unaligned memory accesses performance. + * + * This option does not affect XXH3 (only XXH32 and XXH64). + */ +# define XXH_FORCE_ALIGN_CHECK 0 + +/*! + * @def XXH_NO_INLINE_HINTS + * @brief When non-zero, sets all functions to `static`. + * + * By default, xxHash tries to force the compiler to inline almost all internal + * functions. + * + * This can usually improve performance due to reduced jumping and improved + * constant folding, but significantly increases the size of the binary which + * might not be favorable. + * + * Additionally, sometimes the forced inlining can be detrimental to performance, + * depending on the architecture. + * + * XXH_NO_INLINE_HINTS marks all internal functions as static, giving the + * compiler full control on whether to inline or not. + * + * When not optimizing (-O0), optimizing for size (-Os, -Oz), or using + * -fno-inline with GCC or Clang, this will automatically be defined. + */ +# define XXH_NO_INLINE_HINTS 0 + +/*! + * @def XXH32_ENDJMP + * @brief Whether to use a jump for `XXH32_finalize`. + * + * For performance, `XXH32_finalize` uses multiple branches in the finalizer. + * This is generally preferable for performance, + * but depending on exact architecture, a jmp may be preferable. + * + * This setting is only possibly making a difference for very small inputs. + */ +# define XXH32_ENDJMP 0 + +/*! + * @internal + * @brief Redefines old internal names. + * + * For compatibility with code that uses xxHash's internals before the names + * were changed to improve namespacing. There is no other reason to use this. + */ +# define XXH_OLD_NAMES +# undef XXH_OLD_NAMES /* don't actually use, it is ugly. */ +#endif /* XXH_DOXYGEN */ +/*! + * @} + */ + +#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ + /* prefer __packed__ structures (method 1) for gcc on armv7+ and mips */ +# if !defined(__clang__) && \ +( \ + (defined(__INTEL_COMPILER) && !defined(_WIN32)) || \ + ( \ + defined(__GNUC__) && ( \ + (defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \ + ( \ + defined(__mips__) && \ + (__mips <= 5 || __mips_isa_rev < 6) && \ + (!defined(__mips16) || defined(__mips_mips16e2)) \ + ) \ + ) \ + ) \ +) +# define XXH_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ +# if defined(__i386) || defined(__x86_64__) || defined(__aarch64__) \ + || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) /* visual */ +# define XXH_FORCE_ALIGN_CHECK 0 +# else +# define XXH_FORCE_ALIGN_CHECK 1 +# endif +#endif + +#ifndef XXH_NO_INLINE_HINTS +# if defined(__OPTIMIZE_SIZE__) /* -Os, -Oz */ \ + || defined(__NO_INLINE__) /* -O0, -fno-inline */ +# define XXH_NO_INLINE_HINTS 1 +# else +# define XXH_NO_INLINE_HINTS 0 +# endif +#endif + +#ifndef XXH32_ENDJMP +/* generally preferable for performance */ +# define XXH32_ENDJMP 0 +#endif + +/*! + * @defgroup impl Implementation + * @{ + */ + + +/* ************************************* +* Includes & Memory related functions +***************************************/ +/* Modify the local functions below should you wish to use some other memory routines */ +/* for ZSTD_malloc(), ZSTD_free() */ +#define ZSTD_DEPS_NEED_MALLOC +/**** skipping file: zstd_deps.h ****/ +static void* XXH_malloc(size_t s) { return ZSTD_malloc(s); } +static void XXH_free (void* p) { ZSTD_free(p); } +static void* XXH_memcpy(void* dest, const void* src, size_t size) { return ZSTD_memcpy(dest,src,size); } + + +/* ************************************* +* Compiler Specific Options +***************************************/ +#ifdef _MSC_VER /* Visual Studio warning fix */ +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +#endif + +#if XXH_NO_INLINE_HINTS /* disable inlining hints */ +# if defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __attribute__((unused)) +# else +# define XXH_FORCE_INLINE static +# endif +# define XXH_NO_INLINE static +/* enable inlining hints */ +#elif defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __inline__ __attribute__((always_inline, unused)) +# define XXH_NO_INLINE static __attribute__((noinline)) +#elif defined(_MSC_VER) /* Visual Studio */ +# define XXH_FORCE_INLINE static __forceinline +# define XXH_NO_INLINE static __declspec(noinline) +#elif defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /* C99 */ +# define XXH_FORCE_INLINE static inline +# define XXH_NO_INLINE static +#else +# define XXH_FORCE_INLINE static +# define XXH_NO_INLINE static +#endif + + + +/* ************************************* +* Debug +***************************************/ +/*! + * @ingroup tuning + * @def XXH_DEBUGLEVEL + * @brief Sets the debugging level. + * + * XXH_DEBUGLEVEL is expected to be defined externally, typically via the + * compiler's command line options. The value must be a number. + */ +#ifndef XXH_DEBUGLEVEL +# ifdef DEBUGLEVEL /* backwards compat */ +# define XXH_DEBUGLEVEL DEBUGLEVEL +# else +# define XXH_DEBUGLEVEL 0 +# endif +#endif + +#if (XXH_DEBUGLEVEL>=1) +# include /* note: can still be disabled with NDEBUG */ +# define XXH_ASSERT(c) assert(c) +#else +# define XXH_ASSERT(c) ((void)0) +#endif + +/* note: use after variable declarations */ +#ifndef XXH_STATIC_ASSERT +# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */ +# include +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# elif defined(__cplusplus) && (__cplusplus >= 201103L) /* C++11 */ +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# else +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { struct xxh_sa { char x[(c) ? 1 : -1]; }; } while(0) +# endif +# define XXH_STATIC_ASSERT(c) XXH_STATIC_ASSERT_WITH_MESSAGE((c),#c) +#endif + +/*! + * @internal + * @def XXH_COMPILER_GUARD(var) + * @brief Used to prevent unwanted optimizations for @p var. + * + * It uses an empty GCC inline assembly statement with a register constraint + * which forces @p var into a general purpose register (e.g. eax, ebx, ecx + * on x86) and marks it as modified. + * + * This is used in a few places to avoid unwanted autovectorization (e.g. + * XXH32_round()). All vectorization we want is explicit via intrinsics, + * and _usually_ isn't wanted elsewhere. + * + * We also use it to prevent unwanted constant folding for AArch64 in + * XXH3_initCustomSecret_scalar(). + */ +#if defined(__GNUC__) || defined(__clang__) +# define XXH_COMPILER_GUARD(var) __asm__ __volatile__("" : "+r" (var)) +#else +# define XXH_COMPILER_GUARD(var) ((void)0) +#endif + +/* ************************************* +* Basic Types +***************************************/ +#if !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include + typedef uint8_t xxh_u8; +#else + typedef unsigned char xxh_u8; +#endif +typedef XXH32_hash_t xxh_u32; + +#ifdef XXH_OLD_NAMES +# define BYTE xxh_u8 +# define U8 xxh_u8 +# define U32 xxh_u32 +#endif + +/* *** Memory access *** */ + +/*! + * @internal + * @fn xxh_u32 XXH_read32(const void* ptr) + * @brief Reads an unaligned 32-bit integer from @p ptr in native endianness. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit native endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32(const void* ptr) + * @brief Reads an unaligned 32-bit little endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readBE32(const void* ptr) + * @brief Reads an unaligned 32-bit big endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit big endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32_align(const void* ptr, XXH_alignment align) + * @brief Like @ref XXH_readLE32(), but has an option for aligned reads. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * Note that when @ref XXH_FORCE_ALIGN_CHECK == 0, the @p align parameter is + * always @ref XXH_alignment::XXH_unaligned. + * + * @param ptr The pointer to read from. + * @param align Whether @p ptr is aligned. + * @pre + * If @p align == @ref XXH_alignment::XXH_aligned, @p ptr must be 4 byte + * aligned. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) +/* + * Manual byteshift. Best for old compilers which don't inline memcpy. + * We actually directly use XXH_readLE32 and XXH_readBE32. + */ +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) + +/* + * Force direct memory access. Only works on CPU which support unaligned memory + * access in hardware. + */ +static xxh_u32 XXH_read32(const void* memPtr) { return *(const xxh_u32*) memPtr; } + +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) + +/* + * __pack instructions are safer but compiler specific, hence potentially + * problematic for some compilers. + * + * Currently only defined for GCC and ICC. + */ +#ifdef XXH_OLD_NAMES +typedef union { xxh_u32 u32; } __attribute__((packed)) unalign; +#endif +static xxh_u32 XXH_read32(const void* ptr) +{ + typedef union { xxh_u32 u32; } __attribute__((packed)) xxh_unalign; + return ((const xxh_unalign*)ptr)->u32; +} + +#else + +/* + * Portable and safe solution. Generally efficient. + * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html + */ +static xxh_u32 XXH_read32(const void* memPtr) +{ + xxh_u32 val; + XXH_memcpy(&val, memPtr, sizeof(val)); + return val; +} + +#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ + + +/* *** Endianness *** */ + +/*! + * @ingroup tuning + * @def XXH_CPU_LITTLE_ENDIAN + * @brief Whether the target is little endian. + * + * Defined to 1 if the target is little endian, or 0 if it is big endian. + * It can be defined externally, for example on the compiler command line. + * + * If it is not defined, + * a runtime check (which is usually constant folded) is used instead. + * + * @note + * This is not necessarily defined to an integer constant. + * + * @see XXH_isLittleEndian() for the runtime check. + */ +#ifndef XXH_CPU_LITTLE_ENDIAN +/* + * Try to detect endianness automatically, to avoid the nonstandard behavior + * in `XXH_isLittleEndian()` + */ +# if defined(_WIN32) /* Windows is always little endian */ \ + || defined(__LITTLE_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +# define XXH_CPU_LITTLE_ENDIAN 1 +# elif defined(__BIG_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +# define XXH_CPU_LITTLE_ENDIAN 0 +# else +/*! + * @internal + * @brief Runtime check for @ref XXH_CPU_LITTLE_ENDIAN. + * + * Most compilers will constant fold this. + */ +static int XXH_isLittleEndian(void) +{ + /* + * Portable and well-defined behavior. + * Don't use static: it is detrimental to performance. + */ + const union { xxh_u32 u; xxh_u8 c[4]; } one = { 1 }; + return one.c[0]; +} +# define XXH_CPU_LITTLE_ENDIAN XXH_isLittleEndian() +# endif +#endif + + + + +/* **************************************** +* Compiler-specific Functions and Macros +******************************************/ +#define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) + +#ifdef __has_builtin +# define XXH_HAS_BUILTIN(x) __has_builtin(x) +#else +# define XXH_HAS_BUILTIN(x) 0 +#endif + +/*! + * @internal + * @def XXH_rotl32(x,r) + * @brief 32-bit rotate left. + * + * @param x The 32-bit integer to be rotated. + * @param r The number of bits to rotate. + * @pre + * @p r > 0 && @p r < 32 + * @note + * @p x and @p r may be evaluated multiple times. + * @return The rotated result. + */ +#if !defined(NO_CLANG_BUILTIN) && XXH_HAS_BUILTIN(__builtin_rotateleft32) \ + && XXH_HAS_BUILTIN(__builtin_rotateleft64) +# define XXH_rotl32 __builtin_rotateleft32 +# define XXH_rotl64 __builtin_rotateleft64 +/* Note: although _rotl exists for minGW (GCC under windows), performance seems poor */ +#elif defined(_MSC_VER) +# define XXH_rotl32(x,r) _rotl(x,r) +# define XXH_rotl64(x,r) _rotl64(x,r) +#else +# define XXH_rotl32(x,r) (((x) << (r)) | ((x) >> (32 - (r)))) +# define XXH_rotl64(x,r) (((x) << (r)) | ((x) >> (64 - (r)))) +#endif + +/*! + * @internal + * @fn xxh_u32 XXH_swap32(xxh_u32 x) + * @brief A 32-bit byteswap. + * + * @param x The 32-bit integer to byteswap. + * @return @p x, byteswapped. + */ +#if defined(_MSC_VER) /* Visual Studio */ +# define XXH_swap32 _byteswap_ulong +#elif XXH_GCC_VERSION >= 403 +# define XXH_swap32 __builtin_bswap32 +#else +static xxh_u32 XXH_swap32 (xxh_u32 x) +{ + return ((x << 24) & 0xff000000 ) | + ((x << 8) & 0x00ff0000 ) | + ((x >> 8) & 0x0000ff00 ) | + ((x >> 24) & 0x000000ff ); +} +#endif + + +/* *************************** +* Memory reads +*****************************/ + +/*! + * @internal + * @brief Enum to indicate whether a pointer is aligned. + */ +typedef enum { + XXH_aligned, /*!< Aligned */ + XXH_unaligned /*!< Possibly unaligned */ +} XXH_alignment; + +/* + * XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. + * + * This is ideal for older compilers which don't inline memcpy. + */ +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) + +XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[0] + | ((xxh_u32)bytePtr[1] << 8) + | ((xxh_u32)bytePtr[2] << 16) + | ((xxh_u32)bytePtr[3] << 24); +} + +XXH_FORCE_INLINE xxh_u32 XXH_readBE32(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[3] + | ((xxh_u32)bytePtr[2] << 8) + | ((xxh_u32)bytePtr[1] << 16) + | ((xxh_u32)bytePtr[0] << 24); +} + +#else +XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); +} + +static xxh_u32 XXH_readBE32(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); +} +#endif + +XXH_FORCE_INLINE xxh_u32 +XXH_readLE32_align(const void* ptr, XXH_alignment align) +{ + if (align==XXH_unaligned) { + return XXH_readLE32(ptr); + } else { + return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u32*)ptr : XXH_swap32(*(const xxh_u32*)ptr); + } +} + + +/* ************************************* +* Misc +***************************************/ +/*! @ingroup public */ +XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } + + +/* ******************************************************************* +* 32-bit hash functions +*********************************************************************/ +/*! + * @} + * @defgroup xxh32_impl XXH32 implementation + * @ingroup impl + * @{ + */ + /* #define instead of static const, to be used as initializers */ +#define XXH_PRIME32_1 0x9E3779B1U /*!< 0b10011110001101110111100110110001 */ +#define XXH_PRIME32_2 0x85EBCA77U /*!< 0b10000101111010111100101001110111 */ +#define XXH_PRIME32_3 0xC2B2AE3DU /*!< 0b11000010101100101010111000111101 */ +#define XXH_PRIME32_4 0x27D4EB2FU /*!< 0b00100111110101001110101100101111 */ +#define XXH_PRIME32_5 0x165667B1U /*!< 0b00010110010101100110011110110001 */ + +#ifdef XXH_OLD_NAMES +# define PRIME32_1 XXH_PRIME32_1 +# define PRIME32_2 XXH_PRIME32_2 +# define PRIME32_3 XXH_PRIME32_3 +# define PRIME32_4 XXH_PRIME32_4 +# define PRIME32_5 XXH_PRIME32_5 +#endif + +/*! + * @internal + * @brief Normal stripe processing routine. + * + * This shuffles the bits so that any bit from @p input impacts several bits in + * @p acc. + * + * @param acc The accumulator lane. + * @param input The stripe of input to mix. + * @return The mixed accumulator lane. + */ +static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input) +{ + acc += input * XXH_PRIME32_2; + acc = XXH_rotl32(acc, 13); + acc *= XXH_PRIME32_1; +#if (defined(__SSE4_1__) || defined(__aarch64__)) && !defined(XXH_ENABLE_AUTOVECTORIZE) + /* + * UGLY HACK: + * A compiler fence is the only thing that prevents GCC and Clang from + * autovectorizing the XXH32 loop (pragmas and attributes don't work for some + * reason) without globally disabling SSE4.1. + * + * The reason we want to avoid vectorization is because despite working on + * 4 integers at a time, there are multiple factors slowing XXH32 down on + * SSE4: + * - There's a ridiculous amount of lag from pmulld (10 cycles of latency on + * newer chips!) making it slightly slower to multiply four integers at + * once compared to four integers independently. Even when pmulld was + * fastest, Sandy/Ivy Bridge, it is still not worth it to go into SSE + * just to multiply unless doing a long operation. + * + * - Four instructions are required to rotate, + * movqda tmp, v // not required with VEX encoding + * pslld tmp, 13 // tmp <<= 13 + * psrld v, 19 // x >>= 19 + * por v, tmp // x |= tmp + * compared to one for scalar: + * roll v, 13 // reliably fast across the board + * shldl v, v, 13 // Sandy Bridge and later prefer this for some reason + * + * - Instruction level parallelism is actually more beneficial here because + * the SIMD actually serializes this operation: While v1 is rotating, v2 + * can load data, while v3 can multiply. SSE forces them to operate + * together. + * + * This is also enabled on AArch64, as Clang autovectorizes it incorrectly + * and it is pointless writing a NEON implementation that is basically the + * same speed as scalar for XXH32. + */ + XXH_COMPILER_GUARD(acc); +#endif + return acc; +} + +/*! + * @internal + * @brief Mixes all bits to finalize the hash. + * + * The final mix ensures that all input bits have a chance to impact any bit in + * the output digest, resulting in an unbiased distribution. + * + * @param h32 The hash to avalanche. + * @return The avalanched hash. + */ +static xxh_u32 XXH32_avalanche(xxh_u32 h32) +{ + h32 ^= h32 >> 15; + h32 *= XXH_PRIME32_2; + h32 ^= h32 >> 13; + h32 *= XXH_PRIME32_3; + h32 ^= h32 >> 16; + return(h32); +} + +#define XXH_get32bits(p) XXH_readLE32_align(p, align) + +/*! + * @internal + * @brief Processes the last 0-15 bytes of @p ptr. + * + * There may be up to 15 bytes remaining to consume from the input. + * This final stage will digest them to ensure that all input bytes are present + * in the final mix. + * + * @param h32 The hash to finalize. + * @param ptr The pointer to the remaining input. + * @param len The remaining length, modulo 16. + * @param align Whether @p ptr is aligned. + * @return The finalized hash. + */ +static xxh_u32 +XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) +{ +#define XXH_PROCESS1 do { \ + h32 += (*ptr++) * XXH_PRIME32_5; \ + h32 = XXH_rotl32(h32, 11) * XXH_PRIME32_1; \ +} while (0) + +#define XXH_PROCESS4 do { \ + h32 += XXH_get32bits(ptr) * XXH_PRIME32_3; \ + ptr += 4; \ + h32 = XXH_rotl32(h32, 17) * XXH_PRIME32_4; \ +} while (0) + + if (ptr==NULL) XXH_ASSERT(len == 0); + + /* Compact rerolled version; generally faster */ + if (!XXH32_ENDJMP) { + len &= 15; + while (len >= 4) { + XXH_PROCESS4; + len -= 4; + } + while (len > 0) { + XXH_PROCESS1; + --len; + } + return XXH32_avalanche(h32); + } else { + switch(len&15) /* or switch(bEnd - p) */ { + case 12: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 8: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 4: XXH_PROCESS4; + return XXH32_avalanche(h32); + + case 13: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 9: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 5: XXH_PROCESS4; + XXH_PROCESS1; + return XXH32_avalanche(h32); + + case 14: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 10: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 6: XXH_PROCESS4; + XXH_PROCESS1; + XXH_PROCESS1; + return XXH32_avalanche(h32); + + case 15: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 11: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 7: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 3: XXH_PROCESS1; + XXH_FALLTHROUGH; + case 2: XXH_PROCESS1; + XXH_FALLTHROUGH; + case 1: XXH_PROCESS1; + XXH_FALLTHROUGH; + case 0: return XXH32_avalanche(h32); + } + XXH_ASSERT(0); + return h32; /* reaching this point is deemed impossible */ + } +} + +#ifdef XXH_OLD_NAMES +# define PROCESS1 XXH_PROCESS1 +# define PROCESS4 XXH_PROCESS4 +#else +# undef XXH_PROCESS1 +# undef XXH_PROCESS4 +#endif + +/*! + * @internal + * @brief The implementation for @ref XXH32(). + * + * @param input , len , seed Directly passed from @ref XXH32(). + * @param align Whether @p input is aligned. + * @return The calculated hash. + */ +XXH_FORCE_INLINE xxh_u32 +XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align) +{ + xxh_u32 h32; + + if (input==NULL) XXH_ASSERT(len == 0); + + if (len>=16) { + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 15; + xxh_u32 v1 = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + xxh_u32 v2 = seed + XXH_PRIME32_2; + xxh_u32 v3 = seed + 0; + xxh_u32 v4 = seed - XXH_PRIME32_1; + + do { + v1 = XXH32_round(v1, XXH_get32bits(input)); input += 4; + v2 = XXH32_round(v2, XXH_get32bits(input)); input += 4; + v3 = XXH32_round(v3, XXH_get32bits(input)); input += 4; + v4 = XXH32_round(v4, XXH_get32bits(input)); input += 4; + } while (input < limit); + + h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18); + } else { + h32 = seed + XXH_PRIME32_5; + } + + h32 += (xxh_u32)len; + + return XXH32_finalize(h32, input, len&15, align); +} + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t seed) +{ +#if 0 + /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ + XXH32_state_t state; + XXH32_reset(&state, seed); + XXH32_update(&state, (const xxh_u8*)input, len); + return XXH32_digest(&state); +#else + if (XXH_FORCE_ALIGN_CHECK) { + if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ + return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); + } } + + return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned); +#endif +} + + + +/******* Hash streaming *******/ +/*! + * @ingroup xxh32_family + */ +XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) +{ + return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); +} +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) +{ + XXH_free(statePtr); + return XXH_OK; +} + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState) +{ + XXH_memcpy(dstState, srcState, sizeof(*dstState)); +} + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, XXH32_hash_t seed) +{ + XXH_ASSERT(statePtr != NULL); + memset(statePtr, 0, sizeof(*statePtr)); + statePtr->v[0] = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + statePtr->v[1] = seed + XXH_PRIME32_2; + statePtr->v[2] = seed + 0; + statePtr->v[3] = seed - XXH_PRIME32_1; + return XXH_OK; +} + + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH_errorcode +XXH32_update(XXH32_state_t* state, const void* input, size_t len) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + { const xxh_u8* p = (const xxh_u8*)input; + const xxh_u8* const bEnd = p + len; + + state->total_len_32 += (XXH32_hash_t)len; + state->large_len |= (XXH32_hash_t)((len>=16) | (state->total_len_32>=16)); + + if (state->memsize + len < 16) { /* fill in tmp buffer */ + XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, len); + state->memsize += (XXH32_hash_t)len; + return XXH_OK; + } + + if (state->memsize) { /* some data left from previous update */ + XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, 16-state->memsize); + { const xxh_u32* p32 = state->mem32; + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p32)); p32++; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p32)); p32++; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p32)); p32++; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p32)); + } + p += 16-state->memsize; + state->memsize = 0; + } + + if (p <= bEnd-16) { + const xxh_u8* const limit = bEnd - 16; + + do { + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p)); p+=4; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p)); p+=4; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p)); p+=4; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p)); p+=4; + } while (p<=limit); + + } + + if (p < bEnd) { + XXH_memcpy(state->mem32, p, (size_t)(bEnd-p)); + state->memsize = (unsigned)(bEnd-p); + } + } + + return XXH_OK; +} + + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t* state) +{ + xxh_u32 h32; + + if (state->large_len) { + h32 = XXH_rotl32(state->v[0], 1) + + XXH_rotl32(state->v[1], 7) + + XXH_rotl32(state->v[2], 12) + + XXH_rotl32(state->v[3], 18); + } else { + h32 = state->v[2] /* == seed */ + XXH_PRIME32_5; + } + + h32 += state->total_len_32; + + return XXH32_finalize(h32, (const xxh_u8*)state->mem32, state->memsize, XXH_aligned); +} + + +/******* Canonical representation *******/ + +/*! + * @ingroup xxh32_family + * The default return values from XXH functions are unsigned 32 and 64 bit + * integers. + * + * The canonical representation uses big endian convention, the same convention + * as human-readable numbers (large digits first). + * + * This way, hash values can be written into a file or buffer, remaining + * comparable across different systems. + * + * The following functions allow transformation of hash values to and from their + * canonical format. + */ +XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash) +{ + /* XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); */ + if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); + XXH_memcpy(dst, &hash, sizeof(*dst)); +} +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) +{ + return XXH_readBE32(src); +} + + +#ifndef XXH_NO_LONG_LONG + +/* ******************************************************************* +* 64-bit hash functions +*********************************************************************/ +/*! + * @} + * @ingroup impl + * @{ + */ +/******* Memory access *******/ + +typedef XXH64_hash_t xxh_u64; + +#ifdef XXH_OLD_NAMES +# define U64 xxh_u64 +#endif + +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) +/* + * Manual byteshift. Best for old compilers which don't inline memcpy. + * We actually directly use XXH_readLE64 and XXH_readBE64. + */ +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) + +/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ +static xxh_u64 XXH_read64(const void* memPtr) +{ + return *(const xxh_u64*) memPtr; +} + +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) + +/* + * __pack instructions are safer, but compiler specific, hence potentially + * problematic for some compilers. + * + * Currently only defined for GCC and ICC. + */ +#ifdef XXH_OLD_NAMES +typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) unalign64; +#endif +static xxh_u64 XXH_read64(const void* ptr) +{ + typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) xxh_unalign64; + return ((const xxh_unalign64*)ptr)->u64; +} + +#else + +/* + * Portable and safe solution. Generally efficient. + * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html + */ +static xxh_u64 XXH_read64(const void* memPtr) +{ + xxh_u64 val; + XXH_memcpy(&val, memPtr, sizeof(val)); + return val; +} + +#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ + +#if defined(_MSC_VER) /* Visual Studio */ +# define XXH_swap64 _byteswap_uint64 +#elif XXH_GCC_VERSION >= 403 +# define XXH_swap64 __builtin_bswap64 +#else +static xxh_u64 XXH_swap64(xxh_u64 x) +{ + return ((x << 56) & 0xff00000000000000ULL) | + ((x << 40) & 0x00ff000000000000ULL) | + ((x << 24) & 0x0000ff0000000000ULL) | + ((x << 8) & 0x000000ff00000000ULL) | + ((x >> 8) & 0x00000000ff000000ULL) | + ((x >> 24) & 0x0000000000ff0000ULL) | + ((x >> 40) & 0x000000000000ff00ULL) | + ((x >> 56) & 0x00000000000000ffULL); +} +#endif + + +/* XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. */ +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) + +XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[0] + | ((xxh_u64)bytePtr[1] << 8) + | ((xxh_u64)bytePtr[2] << 16) + | ((xxh_u64)bytePtr[3] << 24) + | ((xxh_u64)bytePtr[4] << 32) + | ((xxh_u64)bytePtr[5] << 40) + | ((xxh_u64)bytePtr[6] << 48) + | ((xxh_u64)bytePtr[7] << 56); +} + +XXH_FORCE_INLINE xxh_u64 XXH_readBE64(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[7] + | ((xxh_u64)bytePtr[6] << 8) + | ((xxh_u64)bytePtr[5] << 16) + | ((xxh_u64)bytePtr[4] << 24) + | ((xxh_u64)bytePtr[3] << 32) + | ((xxh_u64)bytePtr[2] << 40) + | ((xxh_u64)bytePtr[1] << 48) + | ((xxh_u64)bytePtr[0] << 56); +} + +#else +XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); +} + +static xxh_u64 XXH_readBE64(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr); +} +#endif + +XXH_FORCE_INLINE xxh_u64 +XXH_readLE64_align(const void* ptr, XXH_alignment align) +{ + if (align==XXH_unaligned) + return XXH_readLE64(ptr); + else + return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u64*)ptr : XXH_swap64(*(const xxh_u64*)ptr); +} + + +/******* xxh64 *******/ +/*! + * @} + * @defgroup xxh64_impl XXH64 implementation + * @ingroup impl + * @{ + */ +/* #define rather that static const, to be used as initializers */ +#define XXH_PRIME64_1 0x9E3779B185EBCA87ULL /*!< 0b1001111000110111011110011011000110000101111010111100101010000111 */ +#define XXH_PRIME64_2 0xC2B2AE3D27D4EB4FULL /*!< 0b1100001010110010101011100011110100100111110101001110101101001111 */ +#define XXH_PRIME64_3 0x165667B19E3779F9ULL /*!< 0b0001011001010110011001111011000110011110001101110111100111111001 */ +#define XXH_PRIME64_4 0x85EBCA77C2B2AE63ULL /*!< 0b1000010111101011110010100111011111000010101100101010111001100011 */ +#define XXH_PRIME64_5 0x27D4EB2F165667C5ULL /*!< 0b0010011111010100111010110010111100010110010101100110011111000101 */ + +#ifdef XXH_OLD_NAMES +# define PRIME64_1 XXH_PRIME64_1 +# define PRIME64_2 XXH_PRIME64_2 +# define PRIME64_3 XXH_PRIME64_3 +# define PRIME64_4 XXH_PRIME64_4 +# define PRIME64_5 XXH_PRIME64_5 +#endif + +static xxh_u64 XXH64_round(xxh_u64 acc, xxh_u64 input) +{ + acc += input * XXH_PRIME64_2; + acc = XXH_rotl64(acc, 31); + acc *= XXH_PRIME64_1; + return acc; +} + +static xxh_u64 XXH64_mergeRound(xxh_u64 acc, xxh_u64 val) +{ + val = XXH64_round(0, val); + acc ^= val; + acc = acc * XXH_PRIME64_1 + XXH_PRIME64_4; + return acc; +} + +static xxh_u64 XXH64_avalanche(xxh_u64 h64) +{ + h64 ^= h64 >> 33; + h64 *= XXH_PRIME64_2; + h64 ^= h64 >> 29; + h64 *= XXH_PRIME64_3; + h64 ^= h64 >> 32; + return h64; +} + + +#define XXH_get64bits(p) XXH_readLE64_align(p, align) + +static xxh_u64 +XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align) +{ + if (ptr==NULL) XXH_ASSERT(len == 0); + len &= 31; + while (len >= 8) { + xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); + ptr += 8; + h64 ^= k1; + h64 = XXH_rotl64(h64,27) * XXH_PRIME64_1 + XXH_PRIME64_4; + len -= 8; + } + if (len >= 4) { + h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1; + ptr += 4; + h64 = XXH_rotl64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; + len -= 4; + } + while (len > 0) { + h64 ^= (*ptr++) * XXH_PRIME64_5; + h64 = XXH_rotl64(h64, 11) * XXH_PRIME64_1; + --len; + } + return XXH64_avalanche(h64); +} + +#ifdef XXH_OLD_NAMES +# define PROCESS1_64 XXH_PROCESS1_64 +# define PROCESS4_64 XXH_PROCESS4_64 +# define PROCESS8_64 XXH_PROCESS8_64 +#else +# undef XXH_PROCESS1_64 +# undef XXH_PROCESS4_64 +# undef XXH_PROCESS8_64 +#endif + +XXH_FORCE_INLINE xxh_u64 +XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align) +{ + xxh_u64 h64; + if (input==NULL) XXH_ASSERT(len == 0); + + if (len>=32) { + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 31; + xxh_u64 v1 = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + xxh_u64 v2 = seed + XXH_PRIME64_2; + xxh_u64 v3 = seed + 0; + xxh_u64 v4 = seed - XXH_PRIME64_1; + + do { + v1 = XXH64_round(v1, XXH_get64bits(input)); input+=8; + v2 = XXH64_round(v2, XXH_get64bits(input)); input+=8; + v3 = XXH64_round(v3, XXH_get64bits(input)); input+=8; + v4 = XXH64_round(v4, XXH_get64bits(input)); input+=8; + } while (inputv[0] = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + statePtr->v[1] = seed + XXH_PRIME64_2; + statePtr->v[2] = seed + 0; + statePtr->v[3] = seed - XXH_PRIME64_1; + return XXH_OK; +} + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH_errorcode +XXH64_update (XXH64_state_t* state, const void* input, size_t len) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + { const xxh_u8* p = (const xxh_u8*)input; + const xxh_u8* const bEnd = p + len; + + state->total_len += len; + + if (state->memsize + len < 32) { /* fill in tmp buffer */ + XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, len); + state->memsize += (xxh_u32)len; + return XXH_OK; + } + + if (state->memsize) { /* tmp buffer is full */ + XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, 32-state->memsize); + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(state->mem64+0)); + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(state->mem64+1)); + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(state->mem64+2)); + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(state->mem64+3)); + p += 32 - state->memsize; + state->memsize = 0; + } + + if (p+32 <= bEnd) { + const xxh_u8* const limit = bEnd - 32; + + do { + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(p)); p+=8; + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(p)); p+=8; + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(p)); p+=8; + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(p)); p+=8; + } while (p<=limit); + + } + + if (p < bEnd) { + XXH_memcpy(state->mem64, p, (size_t)(bEnd-p)); + state->memsize = (unsigned)(bEnd-p); + } + } + + return XXH_OK; +} + + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_digest(const XXH64_state_t* state) +{ + xxh_u64 h64; + + if (state->total_len >= 32) { + h64 = XXH_rotl64(state->v[0], 1) + XXH_rotl64(state->v[1], 7) + XXH_rotl64(state->v[2], 12) + XXH_rotl64(state->v[3], 18); + h64 = XXH64_mergeRound(h64, state->v[0]); + h64 = XXH64_mergeRound(h64, state->v[1]); + h64 = XXH64_mergeRound(h64, state->v[2]); + h64 = XXH64_mergeRound(h64, state->v[3]); + } else { + h64 = state->v[2] /*seed*/ + XXH_PRIME64_5; + } + + h64 += (xxh_u64) state->total_len; + + return XXH64_finalize(h64, (const xxh_u8*)state->mem64, (size_t)state->total_len, XXH_aligned); +} + + +/******* Canonical representation *******/ + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash) +{ + /* XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); */ + if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); + XXH_memcpy(dst, &hash, sizeof(*dst)); +} + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src) +{ + return XXH_readBE64(src); +} + +#ifndef XXH_NO_XXH3 + +/* ********************************************************************* +* XXH3 +* New generation hash designed for speed on small keys and vectorization +************************************************************************ */ +/*! + * @} + * @defgroup xxh3_impl XXH3 implementation + * @ingroup impl + * @{ + */ + +/* === Compiler specifics === */ + +#if ((defined(sun) || defined(__sun)) && __cplusplus) /* Solaris includes __STDC_VERSION__ with C++. Tested with GCC 5.5 */ +# define XXH_RESTRICT /* disable */ +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */ +# define XXH_RESTRICT restrict +#else +/* Note: it might be useful to define __restrict or __restrict__ for some C++ compilers */ +# define XXH_RESTRICT /* disable */ +#endif + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) \ + || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) \ + || defined(__clang__) +# define XXH_likely(x) __builtin_expect(x, 1) +# define XXH_unlikely(x) __builtin_expect(x, 0) +#else +# define XXH_likely(x) (x) +# define XXH_unlikely(x) (x) +#endif + +#if defined(__GNUC__) || defined(__clang__) +# if defined(__ARM_NEON__) || defined(__ARM_NEON) \ + || defined(__aarch64__) || defined(_M_ARM) \ + || defined(_M_ARM64) || defined(_M_ARM64EC) +# define inline __inline__ /* circumvent a clang bug */ +# include +# undef inline +# elif defined(__AVX2__) +# include +# elif defined(__SSE2__) +# include +# endif +#endif + +#if defined(_MSC_VER) +# include +#endif + +/* + * One goal of XXH3 is to make it fast on both 32-bit and 64-bit, while + * remaining a true 64-bit/128-bit hash function. + * + * This is done by prioritizing a subset of 64-bit operations that can be + * emulated without too many steps on the average 32-bit machine. + * + * For example, these two lines seem similar, and run equally fast on 64-bit: + * + * xxh_u64 x; + * x ^= (x >> 47); // good + * x ^= (x >> 13); // bad + * + * However, to a 32-bit machine, there is a major difference. + * + * x ^= (x >> 47) looks like this: + * + * x.lo ^= (x.hi >> (47 - 32)); + * + * while x ^= (x >> 13) looks like this: + * + * // note: funnel shifts are not usually cheap. + * x.lo ^= (x.lo >> 13) | (x.hi << (32 - 13)); + * x.hi ^= (x.hi >> 13); + * + * The first one is significantly faster than the second, simply because the + * shift is larger than 32. This means: + * - All the bits we need are in the upper 32 bits, so we can ignore the lower + * 32 bits in the shift. + * - The shift result will always fit in the lower 32 bits, and therefore, + * we can ignore the upper 32 bits in the xor. + * + * Thanks to this optimization, XXH3 only requires these features to be efficient: + * + * - Usable unaligned access + * - A 32-bit or 64-bit ALU + * - If 32-bit, a decent ADC instruction + * - A 32 or 64-bit multiply with a 64-bit result + * - For the 128-bit variant, a decent byteswap helps short inputs. + * + * The first two are already required by XXH32, and almost all 32-bit and 64-bit + * platforms which can run XXH32 can run XXH3 efficiently. + * + * Thumb-1, the classic 16-bit only subset of ARM's instruction set, is one + * notable exception. + * + * First of all, Thumb-1 lacks support for the UMULL instruction which + * performs the important long multiply. This means numerous __aeabi_lmul + * calls. + * + * Second of all, the 8 functional registers are just not enough. + * Setup for __aeabi_lmul, byteshift loads, pointers, and all arithmetic need + * Lo registers, and this shuffling results in thousands more MOVs than A32. + * + * A32 and T32 don't have this limitation. They can access all 14 registers, + * do a 32->64 multiply with UMULL, and the flexible operand allowing free + * shifts is helpful, too. + * + * Therefore, we do a quick sanity check. + * + * If compiling Thumb-1 for a target which supports ARM instructions, we will + * emit a warning, as it is not a "sane" platform to compile for. + * + * Usually, if this happens, it is because of an accident and you probably need + * to specify -march, as you likely meant to compile for a newer architecture. + * + * Credit: large sections of the vectorial and asm source code paths + * have been contributed by @easyaspi314 + */ +#if defined(__thumb__) && !defined(__thumb2__) && defined(__ARM_ARCH_ISA_ARM) +# warning "XXH3 is highly inefficient without ARM or Thumb-2." +#endif + +/* ========================================== + * Vectorization detection + * ========================================== */ + +#ifdef XXH_DOXYGEN +/*! + * @ingroup tuning + * @brief Overrides the vectorization implementation chosen for XXH3. + * + * Can be defined to 0 to disable SIMD or any of the values mentioned in + * @ref XXH_VECTOR_TYPE. + * + * If this is not defined, it uses predefined macros to determine the best + * implementation. + */ +# define XXH_VECTOR XXH_SCALAR +/*! + * @ingroup tuning + * @brief Possible values for @ref XXH_VECTOR. + * + * Note that these are actually implemented as macros. + * + * If this is not defined, it is detected automatically. + * @ref XXH_X86DISPATCH overrides this. + */ +enum XXH_VECTOR_TYPE /* fake enum */ { + XXH_SCALAR = 0, /*!< Portable scalar version */ + XXH_SSE2 = 1, /*!< + * SSE2 for Pentium 4, Opteron, all x86_64. + * + * @note SSE2 is also guaranteed on Windows 10, macOS, and + * Android x86. + */ + XXH_AVX2 = 2, /*!< AVX2 for Haswell and Bulldozer */ + XXH_AVX512 = 3, /*!< AVX512 for Skylake and Icelake */ + XXH_NEON = 4, /*!< NEON for most ARMv7-A and all AArch64 */ + XXH_VSX = 5, /*!< VSX and ZVector for POWER8/z13 (64-bit) */ +}; +/*! + * @ingroup tuning + * @brief Selects the minimum alignment for XXH3's accumulators. + * + * When using SIMD, this should match the alignment required for said vector + * type, so, for example, 32 for AVX2. + * + * Default: Auto detected. + */ +# define XXH_ACC_ALIGN 8 +#endif + +/* Actual definition */ +#ifndef XXH_DOXYGEN +# define XXH_SCALAR 0 +# define XXH_SSE2 1 +# define XXH_AVX2 2 +# define XXH_AVX512 3 +# define XXH_NEON 4 +# define XXH_VSX 5 +#endif + +#ifndef XXH_VECTOR /* can be defined on command line */ +# if ( \ + defined(__ARM_NEON__) || defined(__ARM_NEON) /* gcc */ \ + || defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC) /* msvc */ \ + ) && ( \ + defined(_WIN32) || defined(__LITTLE_ENDIAN__) /* little endian only */ \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ + ) +# define XXH_VECTOR XXH_NEON +# elif defined(__AVX512F__) +# define XXH_VECTOR XXH_AVX512 +# elif defined(__AVX2__) +# define XXH_VECTOR XXH_AVX2 +# elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2)) +# define XXH_VECTOR XXH_SSE2 +# elif (defined(__PPC64__) && defined(__POWER8_VECTOR__)) \ + || (defined(__s390x__) && defined(__VEC__)) \ + && defined(__GNUC__) /* TODO: IBM XL */ +# define XXH_VECTOR XXH_VSX +# else +# define XXH_VECTOR XXH_SCALAR +# endif +#endif + +/* + * Controls the alignment of the accumulator, + * for compatibility with aligned vector loads, which are usually faster. + */ +#ifndef XXH_ACC_ALIGN +# if defined(XXH_X86DISPATCH) +# define XXH_ACC_ALIGN 64 /* for compatibility with avx512 */ +# elif XXH_VECTOR == XXH_SCALAR /* scalar */ +# define XXH_ACC_ALIGN 8 +# elif XXH_VECTOR == XXH_SSE2 /* sse2 */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_AVX2 /* avx2 */ +# define XXH_ACC_ALIGN 32 +# elif XXH_VECTOR == XXH_NEON /* neon */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_VSX /* vsx */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_AVX512 /* avx512 */ +# define XXH_ACC_ALIGN 64 +# endif +#endif + +#if defined(XXH_X86DISPATCH) || XXH_VECTOR == XXH_SSE2 \ + || XXH_VECTOR == XXH_AVX2 || XXH_VECTOR == XXH_AVX512 +# define XXH_SEC_ALIGN XXH_ACC_ALIGN +#else +# define XXH_SEC_ALIGN 8 +#endif + +/* + * UGLY HACK: + * GCC usually generates the best code with -O3 for xxHash. + * + * However, when targeting AVX2, it is overzealous in its unrolling resulting + * in code roughly 3/4 the speed of Clang. + * + * There are other issues, such as GCC splitting _mm256_loadu_si256 into + * _mm_loadu_si128 + _mm256_inserti128_si256. This is an optimization which + * only applies to Sandy and Ivy Bridge... which don't even support AVX2. + * + * That is why when compiling the AVX2 version, it is recommended to use either + * -O2 -mavx2 -march=haswell + * or + * -O2 -mavx2 -mno-avx256-split-unaligned-load + * for decent performance, or to use Clang instead. + * + * Fortunately, we can control the first one with a pragma that forces GCC into + * -O2, but the other one we can't control without "failed to inline always + * inline function due to target mismatch" warnings. + */ +#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \ + && defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__OPTIMIZE__) && !defined(__OPTIMIZE_SIZE__) /* respect -O0 and -Os */ +# pragma GCC push_options +# pragma GCC optimize("-O2") +#endif + + +#if XXH_VECTOR == XXH_NEON +/* + * NEON's setup for vmlal_u32 is a little more complicated than it is on + * SSE2, AVX2, and VSX. + * + * While PMULUDQ and VMULEUW both perform a mask, VMLAL.U32 performs an upcast. + * + * To do the same operation, the 128-bit 'Q' register needs to be split into + * two 64-bit 'D' registers, performing this operation:: + * + * [ a | b ] + * | '---------. .--------' | + * | x | + * | .---------' '--------. | + * [ a & 0xFFFFFFFF | b & 0xFFFFFFFF ],[ a >> 32 | b >> 32 ] + * + * Due to significant changes in aarch64, the fastest method for aarch64 is + * completely different than the fastest method for ARMv7-A. + * + * ARMv7-A treats D registers as unions overlaying Q registers, so modifying + * D11 will modify the high half of Q5. This is similar to how modifying AH + * will only affect bits 8-15 of AX on x86. + * + * VZIP takes two registers, and puts even lanes in one register and odd lanes + * in the other. + * + * On ARMv7-A, this strangely modifies both parameters in place instead of + * taking the usual 3-operand form. + * + * Therefore, if we want to do this, we can simply use a D-form VZIP.32 on the + * lower and upper halves of the Q register to end up with the high and low + * halves where we want - all in one instruction. + * + * vzip.32 d10, d11 @ d10 = { d10[0], d11[0] }; d11 = { d10[1], d11[1] } + * + * Unfortunately we need inline assembly for this: Instructions modifying two + * registers at once is not possible in GCC or Clang's IR, and they have to + * create a copy. + * + * aarch64 requires a different approach. + * + * In order to make it easier to write a decent compiler for aarch64, many + * quirks were removed, such as conditional execution. + * + * NEON was also affected by this. + * + * aarch64 cannot access the high bits of a Q-form register, and writes to a + * D-form register zero the high bits, similar to how writes to W-form scalar + * registers (or DWORD registers on x86_64) work. + * + * The formerly free vget_high intrinsics now require a vext (with a few + * exceptions) + * + * Additionally, VZIP was replaced by ZIP1 and ZIP2, which are the equivalent + * of PUNPCKL* and PUNPCKH* in SSE, respectively, in order to only modify one + * operand. + * + * The equivalent of the VZIP.32 on the lower and upper halves would be this + * mess: + * + * ext v2.4s, v0.4s, v0.4s, #2 // v2 = { v0[2], v0[3], v0[0], v0[1] } + * zip1 v1.2s, v0.2s, v2.2s // v1 = { v0[0], v2[0] } + * zip2 v0.2s, v0.2s, v1.2s // v0 = { v0[1], v2[1] } + * + * Instead, we use a literal downcast, vmovn_u64 (XTN), and vshrn_n_u64 (SHRN): + * + * shrn v1.2s, v0.2d, #32 // v1 = (uint32x2_t)(v0 >> 32); + * xtn v0.2s, v0.2d // v0 = (uint32x2_t)(v0 & 0xFFFFFFFF); + * + * This is available on ARMv7-A, but is less efficient than a single VZIP.32. + */ + +/*! + * Function-like macro: + * void XXH_SPLIT_IN_PLACE(uint64x2_t &in, uint32x2_t &outLo, uint32x2_t &outHi) + * { + * outLo = (uint32x2_t)(in & 0xFFFFFFFF); + * outHi = (uint32x2_t)(in >> 32); + * in = UNDEFINED; + * } + */ +# if !defined(XXH_NO_VZIP_HACK) /* define to disable */ \ + && (defined(__GNUC__) || defined(__clang__)) \ + && (defined(__arm__) || defined(__thumb__) || defined(_M_ARM)) +# define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \ + do { \ + /* Undocumented GCC/Clang operand modifier: %e0 = lower D half, %f0 = upper D half */ \ + /* https://github.com/gcc-mirror/gcc/blob/38cf91e5/gcc/config/arm/arm.c#L22486 */ \ + /* https://github.com/llvm-mirror/llvm/blob/2c4ca683/lib/Target/ARM/ARMAsmPrinter.cpp#L399 */ \ + __asm__("vzip.32 %e0, %f0" : "+w" (in)); \ + (outLo) = vget_low_u32 (vreinterpretq_u32_u64(in)); \ + (outHi) = vget_high_u32(vreinterpretq_u32_u64(in)); \ + } while (0) +# else +# define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \ + do { \ + (outLo) = vmovn_u64 (in); \ + (outHi) = vshrn_n_u64 ((in), 32); \ + } while (0) +# endif + +/*! + * @ingroup tuning + * @brief Controls the NEON to scalar ratio for XXH3 + * + * On AArch64 when not optimizing for size, XXH3 will run 6 lanes using NEON and + * 2 lanes on scalar by default. + * + * This can be set to 2, 4, 6, or 8. ARMv7 will default to all 8 NEON lanes, as the + * emulated 64-bit arithmetic is too slow. + * + * Modern ARM CPUs are _very_ sensitive to how their pipelines are used. + * + * For example, the Cortex-A73 can dispatch 3 micro-ops per cycle, but it can't + * have more than 2 NEON (F0/F1) micro-ops. If you are only using NEON instructions, + * you are only using 2/3 of the CPU bandwidth. + * + * This is even more noticeable on the more advanced cores like the A76 which + * can dispatch 8 micro-ops per cycle, but still only 2 NEON micro-ops at once. + * + * Therefore, @ref XXH3_NEON_LANES lanes will be processed using NEON, and the + * remaining lanes will use scalar instructions. This improves the bandwidth + * and also gives the integer pipelines something to do besides twiddling loop + * counters and pointers. + * + * This change benefits CPUs with large micro-op buffers without negatively affecting + * other CPUs: + * + * | Chipset | Dispatch type | NEON only | 6:2 hybrid | Diff. | + * |:----------------------|:--------------------|----------:|-----------:|------:| + * | Snapdragon 730 (A76) | 2 NEON/8 micro-ops | 8.8 GB/s | 10.1 GB/s | ~16% | + * | Snapdragon 835 (A73) | 2 NEON/3 micro-ops | 5.1 GB/s | 5.3 GB/s | ~5% | + * | Marvell PXA1928 (A53) | In-order dual-issue | 1.9 GB/s | 1.9 GB/s | 0% | + * + * It also seems to fix some bad codegen on GCC, making it almost as fast as clang. + * + * @see XXH3_accumulate_512_neon() + */ +# ifndef XXH3_NEON_LANES +# if (defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) \ + && !defined(__OPTIMIZE_SIZE__) +# define XXH3_NEON_LANES 6 +# else +# define XXH3_NEON_LANES XXH_ACC_NB +# endif +# endif +#endif /* XXH_VECTOR == XXH_NEON */ + +/* + * VSX and Z Vector helpers. + * + * This is very messy, and any pull requests to clean this up are welcome. + * + * There are a lot of problems with supporting VSX and s390x, due to + * inconsistent intrinsics, spotty coverage, and multiple endiannesses. + */ +#if XXH_VECTOR == XXH_VSX +# if defined(__s390x__) +# include +# else +/* gcc's altivec.h can have the unwanted consequence to unconditionally + * #define bool, vector, and pixel keywords, + * with bad consequences for programs already using these keywords for other purposes. + * The paragraph defining these macros is skipped when __APPLE_ALTIVEC__ is defined. + * __APPLE_ALTIVEC__ is _generally_ defined automatically by the compiler, + * but it seems that, in some cases, it isn't. + * Force the build macro to be defined, so that keywords are not altered. + */ +# if defined(__GNUC__) && !defined(__APPLE_ALTIVEC__) +# define __APPLE_ALTIVEC__ +# endif +# include +# endif + +typedef __vector unsigned long long xxh_u64x2; +typedef __vector unsigned char xxh_u8x16; +typedef __vector unsigned xxh_u32x4; + +# ifndef XXH_VSX_BE +# if defined(__BIG_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +# define XXH_VSX_BE 1 +# elif defined(__VEC_ELEMENT_REG_ORDER__) && __VEC_ELEMENT_REG_ORDER__ == __ORDER_BIG_ENDIAN__ +# warning "-maltivec=be is not recommended. Please use native endianness." +# define XXH_VSX_BE 1 +# else +# define XXH_VSX_BE 0 +# endif +# endif /* !defined(XXH_VSX_BE) */ + +# if XXH_VSX_BE +# if defined(__POWER9_VECTOR__) || (defined(__clang__) && defined(__s390x__)) +# define XXH_vec_revb vec_revb +# else +/*! + * A polyfill for POWER9's vec_revb(). + */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_revb(xxh_u64x2 val) +{ + xxh_u8x16 const vByteSwap = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08 }; + return vec_perm(val, val, vByteSwap); +} +# endif +# endif /* XXH_VSX_BE */ + +/*! + * Performs an unaligned vector load and byte swaps it on big endian. + */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_loadu(const void *ptr) +{ + xxh_u64x2 ret; + XXH_memcpy(&ret, ptr, sizeof(xxh_u64x2)); +# if XXH_VSX_BE + ret = XXH_vec_revb(ret); +# endif + return ret; +} + +/* + * vec_mulo and vec_mule are very problematic intrinsics on PowerPC + * + * These intrinsics weren't added until GCC 8, despite existing for a while, + * and they are endian dependent. Also, their meaning swap depending on version. + * */ +# if defined(__s390x__) + /* s390x is always big endian, no issue on this platform */ +# define XXH_vec_mulo vec_mulo +# define XXH_vec_mule vec_mule +# elif defined(__clang__) && XXH_HAS_BUILTIN(__builtin_altivec_vmuleuw) +/* Clang has a better way to control this, we can just use the builtin which doesn't swap. */ +# define XXH_vec_mulo __builtin_altivec_vmulouw +# define XXH_vec_mule __builtin_altivec_vmuleuw +# else +/* gcc needs inline assembly */ +/* Adapted from https://github.com/google/highwayhash/blob/master/highwayhash/hh_vsx.h. */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mulo(xxh_u32x4 a, xxh_u32x4 b) +{ + xxh_u64x2 result; + __asm__("vmulouw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); + return result; +} +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b) +{ + xxh_u64x2 result; + __asm__("vmuleuw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); + return result; +} +# endif /* XXH_vec_mulo, XXH_vec_mule */ +#endif /* XXH_VECTOR == XXH_VSX */ + + +/* prefetch + * can be disabled, by declaring XXH_NO_PREFETCH build macro */ +#if defined(XXH_NO_PREFETCH) +# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ +#else +# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) /* _mm_prefetch() not defined outside of x86/x64 */ +# include /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ +# define XXH_PREFETCH(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) +# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) ) +# define XXH_PREFETCH(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */) +# else +# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ +# endif +#endif /* XXH_NO_PREFETCH */ + + +/* ========================================== + * XXH3 default settings + * ========================================== */ + +#define XXH_SECRET_DEFAULT_SIZE 192 /* minimum XXH3_SECRET_SIZE_MIN */ + +#if (XXH_SECRET_DEFAULT_SIZE < XXH3_SECRET_SIZE_MIN) +# error "default keyset is not large enough" +#endif + +/*! Pseudorandom secret taken directly from FARSH. */ +XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = { + 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, + 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, + 0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, + 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c, + 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, + 0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, + 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d, + 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, + 0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, + 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e, + 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, + 0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, +}; + + +#ifdef XXH_OLD_NAMES +# define kSecret XXH3_kSecret +#endif + +#ifdef XXH_DOXYGEN +/*! + * @brief Calculates a 32-bit to 64-bit long multiply. + * + * Implemented as a macro. + * + * Wraps `__emulu` on MSVC x86 because it tends to call `__allmul` when it doesn't + * need to (but it shouldn't need to anyways, it is about 7 instructions to do + * a 64x64 multiply...). Since we know that this will _always_ emit `MULL`, we + * use that instead of the normal method. + * + * If you are compiling for platforms like Thumb-1 and don't have a better option, + * you may also want to write your own long multiply routine here. + * + * @param x, y Numbers to be multiplied + * @return 64-bit product of the low 32 bits of @p x and @p y. + */ +XXH_FORCE_INLINE xxh_u64 +XXH_mult32to64(xxh_u64 x, xxh_u64 y) +{ + return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF); +} +#elif defined(_MSC_VER) && defined(_M_IX86) +# define XXH_mult32to64(x, y) __emulu((unsigned)(x), (unsigned)(y)) +#else +/* + * Downcast + upcast is usually better than masking on older compilers like + * GCC 4.2 (especially 32-bit ones), all without affecting newer compilers. + * + * The other method, (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF), will AND both operands + * and perform a full 64x64 multiply -- entirely redundant on 32-bit. + */ +# define XXH_mult32to64(x, y) ((xxh_u64)(xxh_u32)(x) * (xxh_u64)(xxh_u32)(y)) +#endif + +/*! + * @brief Calculates a 64->128-bit long multiply. + * + * Uses `__uint128_t` and `_umul128` if available, otherwise uses a scalar + * version. + * + * @param lhs , rhs The 64-bit integers to be multiplied + * @return The 128-bit result represented in an @ref XXH128_hash_t. + */ +static XXH128_hash_t +XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) +{ + /* + * GCC/Clang __uint128_t method. + * + * On most 64-bit targets, GCC and Clang define a __uint128_t type. + * This is usually the best way as it usually uses a native long 64-bit + * multiply, such as MULQ on x86_64 or MUL + UMULH on aarch64. + * + * Usually. + * + * Despite being a 32-bit platform, Clang (and emscripten) define this type + * despite not having the arithmetic for it. This results in a laggy + * compiler builtin call which calculates a full 128-bit multiply. + * In that case it is best to use the portable one. + * https://github.com/Cyan4973/xxHash/issues/211#issuecomment-515575677 + */ +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__wasm__) \ + && defined(__SIZEOF_INT128__) \ + || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 128) + + __uint128_t const product = (__uint128_t)lhs * (__uint128_t)rhs; + XXH128_hash_t r128; + r128.low64 = (xxh_u64)(product); + r128.high64 = (xxh_u64)(product >> 64); + return r128; + + /* + * MSVC for x64's _umul128 method. + * + * xxh_u64 _umul128(xxh_u64 Multiplier, xxh_u64 Multiplicand, xxh_u64 *HighProduct); + * + * This compiles to single operand MUL on x64. + */ +#elif (defined(_M_X64) || defined(_M_IA64)) && !defined(_M_ARM64EC) + +#ifndef _MSC_VER +# pragma intrinsic(_umul128) +#endif + xxh_u64 product_high; + xxh_u64 const product_low = _umul128(lhs, rhs, &product_high); + XXH128_hash_t r128; + r128.low64 = product_low; + r128.high64 = product_high; + return r128; + + /* + * MSVC for ARM64's __umulh method. + * + * This compiles to the same MUL + UMULH as GCC/Clang's __uint128_t method. + */ +#elif defined(_M_ARM64) || defined(_M_ARM64EC) + +#ifndef _MSC_VER +# pragma intrinsic(__umulh) +#endif + XXH128_hash_t r128; + r128.low64 = lhs * rhs; + r128.high64 = __umulh(lhs, rhs); + return r128; + +#else + /* + * Portable scalar method. Optimized for 32-bit and 64-bit ALUs. + * + * This is a fast and simple grade school multiply, which is shown below + * with base 10 arithmetic instead of base 0x100000000. + * + * 9 3 // D2 lhs = 93 + * x 7 5 // D2 rhs = 75 + * ---------- + * 1 5 // D2 lo_lo = (93 % 10) * (75 % 10) = 15 + * 4 5 | // D2 hi_lo = (93 / 10) * (75 % 10) = 45 + * 2 1 | // D2 lo_hi = (93 % 10) * (75 / 10) = 21 + * + 6 3 | | // D2 hi_hi = (93 / 10) * (75 / 10) = 63 + * --------- + * 2 7 | // D2 cross = (15 / 10) + (45 % 10) + 21 = 27 + * + 6 7 | | // D2 upper = (27 / 10) + (45 / 10) + 63 = 67 + * --------- + * 6 9 7 5 // D4 res = (27 * 10) + (15 % 10) + (67 * 100) = 6975 + * + * The reasons for adding the products like this are: + * 1. It avoids manual carry tracking. Just like how + * (9 * 9) + 9 + 9 = 99, the same applies with this for UINT64_MAX. + * This avoids a lot of complexity. + * + * 2. It hints for, and on Clang, compiles to, the powerful UMAAL + * instruction available in ARM's Digital Signal Processing extension + * in 32-bit ARMv6 and later, which is shown below: + * + * void UMAAL(xxh_u32 *RdLo, xxh_u32 *RdHi, xxh_u32 Rn, xxh_u32 Rm) + * { + * xxh_u64 product = (xxh_u64)*RdLo * (xxh_u64)*RdHi + Rn + Rm; + * *RdLo = (xxh_u32)(product & 0xFFFFFFFF); + * *RdHi = (xxh_u32)(product >> 32); + * } + * + * This instruction was designed for efficient long multiplication, and + * allows this to be calculated in only 4 instructions at speeds + * comparable to some 64-bit ALUs. + * + * 3. It isn't terrible on other platforms. Usually this will be a couple + * of 32-bit ADD/ADCs. + */ + + /* First calculate all of the cross products. */ + xxh_u64 const lo_lo = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs & 0xFFFFFFFF); + xxh_u64 const hi_lo = XXH_mult32to64(lhs >> 32, rhs & 0xFFFFFFFF); + xxh_u64 const lo_hi = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs >> 32); + xxh_u64 const hi_hi = XXH_mult32to64(lhs >> 32, rhs >> 32); + + /* Now add the products together. These will never overflow. */ + xxh_u64 const cross = (lo_lo >> 32) + (hi_lo & 0xFFFFFFFF) + lo_hi; + xxh_u64 const upper = (hi_lo >> 32) + (cross >> 32) + hi_hi; + xxh_u64 const lower = (cross << 32) | (lo_lo & 0xFFFFFFFF); + + XXH128_hash_t r128; + r128.low64 = lower; + r128.high64 = upper; + return r128; +#endif +} + +/*! + * @brief Calculates a 64-bit to 128-bit multiply, then XOR folds it. + * + * The reason for the separate function is to prevent passing too many structs + * around by value. This will hopefully inline the multiply, but we don't force it. + * + * @param lhs , rhs The 64-bit integers to multiply + * @return The low 64 bits of the product XOR'd by the high 64 bits. + * @see XXH_mult64to128() + */ +static xxh_u64 +XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs) +{ + XXH128_hash_t product = XXH_mult64to128(lhs, rhs); + return product.low64 ^ product.high64; +} + +/*! Seems to produce slightly better code on GCC for some reason. */ +XXH_FORCE_INLINE xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift) +{ + XXH_ASSERT(0 <= shift && shift < 64); + return v64 ^ (v64 >> shift); +} + +/* + * This is a fast avalanche stage, + * suitable when input bits are already partially mixed + */ +static XXH64_hash_t XXH3_avalanche(xxh_u64 h64) +{ + h64 = XXH_xorshift64(h64, 37); + h64 *= 0x165667919E3779F9ULL; + h64 = XXH_xorshift64(h64, 32); + return h64; +} + +/* + * This is a stronger avalanche, + * inspired by Pelle Evensen's rrmxmx + * preferable when input has not been previously mixed + */ +static XXH64_hash_t XXH3_rrmxmx(xxh_u64 h64, xxh_u64 len) +{ + /* this mix is inspired by Pelle Evensen's rrmxmx */ + h64 ^= XXH_rotl64(h64, 49) ^ XXH_rotl64(h64, 24); + h64 *= 0x9FB21C651E98DF25ULL; + h64 ^= (h64 >> 35) + len ; + h64 *= 0x9FB21C651E98DF25ULL; + return XXH_xorshift64(h64, 28); +} + + +/* ========================================== + * Short keys + * ========================================== + * One of the shortcomings of XXH32 and XXH64 was that their performance was + * sub-optimal on short lengths. It used an iterative algorithm which strongly + * favored lengths that were a multiple of 4 or 8. + * + * Instead of iterating over individual inputs, we use a set of single shot + * functions which piece together a range of lengths and operate in constant time. + * + * Additionally, the number of multiplies has been significantly reduced. This + * reduces latency, especially when emulating 64-bit multiplies on 32-bit. + * + * Depending on the platform, this may or may not be faster than XXH32, but it + * is almost guaranteed to be faster than XXH64. + */ + +/* + * At very short lengths, there isn't enough input to fully hide secrets, or use + * the entire secret. + * + * There is also only a limited amount of mixing we can do before significantly + * impacting performance. + * + * Therefore, we use different sections of the secret and always mix two secret + * samples with an XOR. This should have no effect on performance on the + * seedless or withSeed variants because everything _should_ be constant folded + * by modern compilers. + * + * The XOR mixing hides individual parts of the secret and increases entropy. + * + * This adds an extra layer of strength for custom secrets. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_1to3_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(1 <= len && len <= 3); + XXH_ASSERT(secret != NULL); + /* + * len = 1: combined = { input[0], 0x01, input[0], input[0] } + * len = 2: combined = { input[1], 0x02, input[0], input[1] } + * len = 3: combined = { input[2], 0x03, input[0], input[1] } + */ + { xxh_u8 const c1 = input[0]; + xxh_u8 const c2 = input[len >> 1]; + xxh_u8 const c3 = input[len - 1]; + xxh_u32 const combined = ((xxh_u32)c1 << 16) | ((xxh_u32)c2 << 24) + | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8); + xxh_u64 const bitflip = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed; + xxh_u64 const keyed = (xxh_u64)combined ^ bitflip; + return XXH64_avalanche(keyed); + } +} + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(4 <= len && len <= 8); + seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; + { xxh_u32 const input1 = XXH_readLE32(input); + xxh_u32 const input2 = XXH_readLE32(input + len - 4); + xxh_u64 const bitflip = (XXH_readLE64(secret+8) ^ XXH_readLE64(secret+16)) - seed; + xxh_u64 const input64 = input2 + (((xxh_u64)input1) << 32); + xxh_u64 const keyed = input64 ^ bitflip; + return XXH3_rrmxmx(keyed, len); + } +} + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(9 <= len && len <= 16); + { xxh_u64 const bitflip1 = (XXH_readLE64(secret+24) ^ XXH_readLE64(secret+32)) + seed; + xxh_u64 const bitflip2 = (XXH_readLE64(secret+40) ^ XXH_readLE64(secret+48)) - seed; + xxh_u64 const input_lo = XXH_readLE64(input) ^ bitflip1; + xxh_u64 const input_hi = XXH_readLE64(input + len - 8) ^ bitflip2; + xxh_u64 const acc = len + + XXH_swap64(input_lo) + input_hi + + XXH3_mul128_fold64(input_lo, input_hi); + return XXH3_avalanche(acc); + } +} + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_0to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(len <= 16); + { if (XXH_likely(len > 8)) return XXH3_len_9to16_64b(input, len, secret, seed); + if (XXH_likely(len >= 4)) return XXH3_len_4to8_64b(input, len, secret, seed); + if (len) return XXH3_len_1to3_64b(input, len, secret, seed); + return XXH64_avalanche(seed ^ (XXH_readLE64(secret+56) ^ XXH_readLE64(secret+64))); + } +} + +/* + * DISCLAIMER: There are known *seed-dependent* multicollisions here due to + * multiplication by zero, affecting hashes of lengths 17 to 240. + * + * However, they are very unlikely. + * + * Keep this in mind when using the unseeded XXH3_64bits() variant: As with all + * unseeded non-cryptographic hashes, it does not attempt to defend itself + * against specially crafted inputs, only random inputs. + * + * Compared to classic UMAC where a 1 in 2^31 chance of 4 consecutive bytes + * cancelling out the secret is taken an arbitrary number of times (addressed + * in XXH3_accumulate_512), this collision is very unlikely with random inputs + * and/or proper seeding: + * + * This only has a 1 in 2^63 chance of 8 consecutive bytes cancelling out, in a + * function that is only called up to 16 times per hash with up to 240 bytes of + * input. + * + * This is not too bad for a non-cryptographic hash function, especially with + * only 64 bit outputs. + * + * The 128-bit variant (which trades some speed for strength) is NOT affected + * by this, although it is always a good idea to use a proper seed if you care + * about strength. + */ +XXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input, + const xxh_u8* XXH_RESTRICT secret, xxh_u64 seed64) +{ +#if defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__i386__) && defined(__SSE2__) /* x86 + SSE2 */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable like XXH32 hack */ + /* + * UGLY HACK: + * GCC for x86 tends to autovectorize the 128-bit multiply, resulting in + * slower code. + * + * By forcing seed64 into a register, we disrupt the cost model and + * cause it to scalarize. See `XXH32_round()` + * + * FIXME: Clang's output is still _much_ faster -- On an AMD Ryzen 3600, + * XXH3_64bits @ len=240 runs at 4.6 GB/s with Clang 9, but 3.3 GB/s on + * GCC 9.2, despite both emitting scalar code. + * + * GCC generates much better scalar code than Clang for the rest of XXH3, + * which is why finding a more optimal codepath is an interest. + */ + XXH_COMPILER_GUARD(seed64); +#endif + { xxh_u64 const input_lo = XXH_readLE64(input); + xxh_u64 const input_hi = XXH_readLE64(input+8); + return XXH3_mul128_fold64( + input_lo ^ (XXH_readLE64(secret) + seed64), + input_hi ^ (XXH_readLE64(secret+8) - seed64) + ); + } +} + +/* For mid range keys, XXH3 uses a Mum-hash variant. */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(16 < len && len <= 128); + + { xxh_u64 acc = len * XXH_PRIME64_1; + if (len > 32) { + if (len > 64) { + if (len > 96) { + acc += XXH3_mix16B(input+48, secret+96, seed); + acc += XXH3_mix16B(input+len-64, secret+112, seed); + } + acc += XXH3_mix16B(input+32, secret+64, seed); + acc += XXH3_mix16B(input+len-48, secret+80, seed); + } + acc += XXH3_mix16B(input+16, secret+32, seed); + acc += XXH3_mix16B(input+len-32, secret+48, seed); + } + acc += XXH3_mix16B(input+0, secret+0, seed); + acc += XXH3_mix16B(input+len-16, secret+16, seed); + + return XXH3_avalanche(acc); + } +} + +#define XXH3_MIDSIZE_MAX 240 + +XXH_NO_INLINE XXH64_hash_t +XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + + #define XXH3_MIDSIZE_STARTOFFSET 3 + #define XXH3_MIDSIZE_LASTOFFSET 17 + + { xxh_u64 acc = len * XXH_PRIME64_1; + int const nbRounds = (int)len / 16; + int i; + for (i=0; i<8; i++) { + acc += XXH3_mix16B(input+(16*i), secret+(16*i), seed); + } + acc = XXH3_avalanche(acc); + XXH_ASSERT(nbRounds >= 8); +#if defined(__clang__) /* Clang */ \ + && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */ + /* + * UGLY HACK: + * Clang for ARMv7-A tries to vectorize this loop, similar to GCC x86. + * In everywhere else, it uses scalar code. + * + * For 64->128-bit multiplies, even if the NEON was 100% optimal, it + * would still be slower than UMAAL (see XXH_mult64to128). + * + * Unfortunately, Clang doesn't handle the long multiplies properly and + * converts them to the nonexistent "vmulq_u64" intrinsic, which is then + * scalarized into an ugly mess of VMOV.32 instructions. + * + * This mess is difficult to avoid without turning autovectorization + * off completely, but they are usually relatively minor and/or not + * worth it to fix. + * + * This loop is the easiest to fix, as unlike XXH32, this pragma + * _actually works_ because it is a loop vectorization instead of an + * SLP vectorization. + */ + #pragma clang loop vectorize(disable) +#endif + for (i=8 ; i < nbRounds; i++) { + acc += XXH3_mix16B(input+(16*i), secret+(16*(i-8)) + XXH3_MIDSIZE_STARTOFFSET, seed); + } + /* last bytes */ + acc += XXH3_mix16B(input + len - 16, secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET, seed); + return XXH3_avalanche(acc); + } +} + + +/* ======= Long Keys ======= */ + +#define XXH_STRIPE_LEN 64 +#define XXH_SECRET_CONSUME_RATE 8 /* nb of secret bytes consumed at each accumulation */ +#define XXH_ACC_NB (XXH_STRIPE_LEN / sizeof(xxh_u64)) + +#ifdef XXH_OLD_NAMES +# define STRIPE_LEN XXH_STRIPE_LEN +# define ACC_NB XXH_ACC_NB +#endif + +XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64) +{ + if (!XXH_CPU_LITTLE_ENDIAN) v64 = XXH_swap64(v64); + XXH_memcpy(dst, &v64, sizeof(v64)); +} + +/* Several intrinsic functions below are supposed to accept __int64 as argument, + * as documented in https://software.intel.com/sites/landingpage/IntrinsicsGuide/ . + * However, several environments do not define __int64 type, + * requiring a workaround. + */ +#if !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) + typedef int64_t xxh_i64; +#else + /* the following type must have a width of 64-bit */ + typedef long long xxh_i64; +#endif + + +/* + * XXH3_accumulate_512 is the tightest loop for long inputs, and it is the most optimized. + * + * It is a hardened version of UMAC, based off of FARSH's implementation. + * + * This was chosen because it adapts quite well to 32-bit, 64-bit, and SIMD + * implementations, and it is ridiculously fast. + * + * We harden it by mixing the original input to the accumulators as well as the product. + * + * This means that in the (relatively likely) case of a multiply by zero, the + * original input is preserved. + * + * On 128-bit inputs, we swap 64-bit pairs when we add the input to improve + * cross-pollination, as otherwise the upper and lower halves would be + * essentially independent. + * + * This doesn't matter on 64-bit hashes since they all get merged together in + * the end, so we skip the extra step. + * + * Both XXH3_64bits and XXH3_128bits use this subroutine. + */ + +#if (XXH_VECTOR == XXH_AVX512) \ + || (defined(XXH_DISPATCH_AVX512) && XXH_DISPATCH_AVX512 != 0) + +#ifndef XXH_TARGET_AVX512 +# define XXH_TARGET_AVX512 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_accumulate_512_avx512(void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + __m512i* const xacc = (__m512i *) acc; + XXH_ASSERT((((size_t)acc) & 63) == 0); + XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); + + { + /* data_vec = input[0]; */ + __m512i const data_vec = _mm512_loadu_si512 (input); + /* key_vec = secret[0]; */ + __m512i const key_vec = _mm512_loadu_si512 (secret); + /* data_key = data_vec ^ key_vec; */ + __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m512i const data_key_lo = _mm512_shuffle_epi32 (data_key, (_MM_PERM_ENUM)_MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m512i const product = _mm512_mul_epu32 (data_key, data_key_lo); + /* xacc[0] += swap(data_vec); */ + __m512i const data_swap = _mm512_shuffle_epi32(data_vec, (_MM_PERM_ENUM)_MM_SHUFFLE(1, 0, 3, 2)); + __m512i const sum = _mm512_add_epi64(*xacc, data_swap); + /* xacc[0] += product; */ + *xacc = _mm512_add_epi64(product, sum); + } +} + +/* + * XXH3_scrambleAcc: Scrambles the accumulators to improve mixing. + * + * Multiplication isn't perfect, as explained by Google in HighwayHash: + * + * // Multiplication mixes/scrambles bytes 0-7 of the 64-bit result to + * // varying degrees. In descending order of goodness, bytes + * // 3 4 2 5 1 6 0 7 have quality 228 224 164 160 100 96 36 32. + * // As expected, the upper and lower bytes are much worse. + * + * Source: https://github.com/google/highwayhash/blob/0aaf66b/highwayhash/hh_avx2.h#L291 + * + * Since our algorithm uses a pseudorandom secret to add some variance into the + * mix, we don't need to (or want to) mix as often or as much as HighwayHash does. + * + * This isn't as tight as XXH3_accumulate, but still written in SIMD to avoid + * extraction. + * + * Both XXH3_64bits and XXH3_128bits use this subroutine. + */ + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_scrambleAcc_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 63) == 0); + XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); + { __m512i* const xacc = (__m512i*) acc; + const __m512i prime32 = _mm512_set1_epi32((int)XXH_PRIME32_1); + + /* xacc[0] ^= (xacc[0] >> 47) */ + __m512i const acc_vec = *xacc; + __m512i const shifted = _mm512_srli_epi64 (acc_vec, 47); + __m512i const data_vec = _mm512_xor_si512 (acc_vec, shifted); + /* xacc[0] ^= secret; */ + __m512i const key_vec = _mm512_loadu_si512 (secret); + __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec); + + /* xacc[0] *= XXH_PRIME32_1; */ + __m512i const data_key_hi = _mm512_shuffle_epi32 (data_key, (_MM_PERM_ENUM)_MM_SHUFFLE(0, 3, 0, 1)); + __m512i const prod_lo = _mm512_mul_epu32 (data_key, prime32); + __m512i const prod_hi = _mm512_mul_epu32 (data_key_hi, prime32); + *xacc = _mm512_add_epi64(prod_lo, _mm512_slli_epi64(prod_hi, 32)); + } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 63) == 0); + XXH_STATIC_ASSERT(XXH_SEC_ALIGN == 64); + XXH_ASSERT(((size_t)customSecret & 63) == 0); + (void)(&XXH_writeLE64); + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m512i); + __m512i const seed = _mm512_mask_set1_epi64(_mm512_set1_epi64((xxh_i64)seed64), 0xAA, (xxh_i64)(0U - seed64)); + + const __m512i* const src = (const __m512i*) ((const void*) XXH3_kSecret); + __m512i* const dest = ( __m512i*) customSecret; + int i; + XXH_ASSERT(((size_t)src & 63) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 63) == 0); + for (i=0; i < nbRounds; ++i) { + /* GCC has a bug, _mm512_stream_load_si512 accepts 'void*', not 'void const*', + * this will warn "discards 'const' qualifier". */ + union { + const __m512i* cp; + void* p; + } remote_const_void; + remote_const_void.cp = src + i; + dest[i] = _mm512_add_epi64(_mm512_stream_load_si512(remote_const_void.p), seed); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_AVX2) \ + || (defined(XXH_DISPATCH_AVX2) && XXH_DISPATCH_AVX2 != 0) + +#ifndef XXH_TARGET_AVX2 +# define XXH_TARGET_AVX2 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void +XXH3_accumulate_512_avx2( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { __m256i* const xacc = (__m256i *) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xinput = (const __m256i *) input; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xsecret = (const __m256i *) secret; + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) { + /* data_vec = xinput[i]; */ + __m256i const data_vec = _mm256_loadu_si256 (xinput+i); + /* key_vec = xsecret[i]; */ + __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); + /* data_key = data_vec ^ key_vec; */ + __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m256i const data_key_lo = _mm256_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m256i const product = _mm256_mul_epu32 (data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m256i const data_swap = _mm256_shuffle_epi32(data_vec, _MM_SHUFFLE(1, 0, 3, 2)); + __m256i const sum = _mm256_add_epi64(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = _mm256_add_epi64(product, sum); + } } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void +XXH3_scrambleAcc_avx2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { __m256i* const xacc = (__m256i*) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xsecret = (const __m256i *) secret; + const __m256i prime32 = _mm256_set1_epi32((int)XXH_PRIME32_1); + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m256i const acc_vec = xacc[i]; + __m256i const shifted = _mm256_srli_epi64 (acc_vec, 47); + __m256i const data_vec = _mm256_xor_si256 (acc_vec, shifted); + /* xacc[i] ^= xsecret; */ + __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); + __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + __m256i const data_key_hi = _mm256_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + __m256i const prod_lo = _mm256_mul_epu32 (data_key, prime32); + __m256i const prod_hi = _mm256_mul_epu32 (data_key_hi, prime32); + xacc[i] = _mm256_add_epi64(prod_lo, _mm256_slli_epi64(prod_hi, 32)); + } + } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 31) == 0); + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE / sizeof(__m256i)) == 6); + XXH_STATIC_ASSERT(XXH_SEC_ALIGN <= 64); + (void)(&XXH_writeLE64); + XXH_PREFETCH(customSecret); + { __m256i const seed = _mm256_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64, (xxh_i64)(0U - seed64), (xxh_i64)seed64); + + const __m256i* const src = (const __m256i*) ((const void*) XXH3_kSecret); + __m256i* dest = ( __m256i*) customSecret; + +# if defined(__GNUC__) || defined(__clang__) + /* + * On GCC & Clang, marking 'dest' as modified will cause the compiler: + * - do not extract the secret from sse registers in the internal loop + * - use less common registers, and avoid pushing these reg into stack + */ + XXH_COMPILER_GUARD(dest); +# endif + XXH_ASSERT(((size_t)src & 31) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 31) == 0); + + /* GCC -O2 need unroll loop manually */ + dest[0] = _mm256_add_epi64(_mm256_stream_load_si256(src+0), seed); + dest[1] = _mm256_add_epi64(_mm256_stream_load_si256(src+1), seed); + dest[2] = _mm256_add_epi64(_mm256_stream_load_si256(src+2), seed); + dest[3] = _mm256_add_epi64(_mm256_stream_load_si256(src+3), seed); + dest[4] = _mm256_add_epi64(_mm256_stream_load_si256(src+4), seed); + dest[5] = _mm256_add_epi64(_mm256_stream_load_si256(src+5), seed); + } +} + +#endif + +/* x86dispatch always generates SSE2 */ +#if (XXH_VECTOR == XXH_SSE2) || defined(XXH_X86DISPATCH) + +#ifndef XXH_TARGET_SSE2 +# define XXH_TARGET_SSE2 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void +XXH3_accumulate_512_sse2( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + /* SSE2 is just a half-scale version of the AVX2 version. */ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { __m128i* const xacc = (__m128i *) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xinput = (const __m128i *) input; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xsecret = (const __m128i *) secret; + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) { + /* data_vec = xinput[i]; */ + __m128i const data_vec = _mm_loadu_si128 (xinput+i); + /* key_vec = xsecret[i]; */ + __m128i const key_vec = _mm_loadu_si128 (xsecret+i); + /* data_key = data_vec ^ key_vec; */ + __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m128i const data_key_lo = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m128i const product = _mm_mul_epu32 (data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m128i const data_swap = _mm_shuffle_epi32(data_vec, _MM_SHUFFLE(1,0,3,2)); + __m128i const sum = _mm_add_epi64(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = _mm_add_epi64(product, sum); + } } +} + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void +XXH3_scrambleAcc_sse2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { __m128i* const xacc = (__m128i*) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xsecret = (const __m128i *) secret; + const __m128i prime32 = _mm_set1_epi32((int)XXH_PRIME32_1); + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m128i const acc_vec = xacc[i]; + __m128i const shifted = _mm_srli_epi64 (acc_vec, 47); + __m128i const data_vec = _mm_xor_si128 (acc_vec, shifted); + /* xacc[i] ^= xsecret[i]; */ + __m128i const key_vec = _mm_loadu_si128 (xsecret+i); + __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + __m128i const data_key_hi = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + __m128i const prod_lo = _mm_mul_epu32 (data_key, prime32); + __m128i const prod_hi = _mm_mul_epu32 (data_key_hi, prime32); + xacc[i] = _mm_add_epi64(prod_lo, _mm_slli_epi64(prod_hi, 32)); + } + } +} + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); + (void)(&XXH_writeLE64); + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m128i); + +# if defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER < 1900 + /* MSVC 32bit mode does not support _mm_set_epi64x before 2015 */ + XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, (xxh_i64)(0U - seed64) }; + __m128i const seed = _mm_load_si128((__m128i const*)seed64x2); +# else + __m128i const seed = _mm_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64); +# endif + int i; + + const void* const src16 = XXH3_kSecret; + __m128i* dst16 = (__m128i*) customSecret; +# if defined(__GNUC__) || defined(__clang__) + /* + * On GCC & Clang, marking 'dest' as modified will cause the compiler: + * - do not extract the secret from sse registers in the internal loop + * - use less common registers, and avoid pushing these reg into stack + */ + XXH_COMPILER_GUARD(dst16); +# endif + XXH_ASSERT(((size_t)src16 & 15) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dst16 & 15) == 0); + + for (i=0; i < nbRounds; ++i) { + dst16[i] = _mm_add_epi64(_mm_load_si128((const __m128i *)src16+i), seed); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_NEON) + +/* forward declarations for the scalar routines */ +XXH_FORCE_INLINE void +XXH3_scalarRound(void* XXH_RESTRICT acc, void const* XXH_RESTRICT input, + void const* XXH_RESTRICT secret, size_t lane); + +XXH_FORCE_INLINE void +XXH3_scalarScrambleRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT secret, size_t lane); + +/*! + * @internal + * @brief The bulk processing loop for NEON. + * + * The NEON code path is actually partially scalar when running on AArch64. This + * is to optimize the pipelining and can have up to 15% speedup depending on the + * CPU, and it also mitigates some GCC codegen issues. + * + * @see XXH3_NEON_LANES for configuring this and details about this optimization. + */ +XXH_FORCE_INLINE void +XXH3_accumulate_512_neon( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + XXH_STATIC_ASSERT(XXH3_NEON_LANES > 0 && XXH3_NEON_LANES <= XXH_ACC_NB && XXH3_NEON_LANES % 2 == 0); + { + uint64x2_t* const xacc = (uint64x2_t *) acc; + /* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */ + uint8_t const* const xinput = (const uint8_t *) input; + uint8_t const* const xsecret = (const uint8_t *) secret; + + size_t i; + /* NEON for the first few lanes (these loops are normally interleaved) */ + for (i=0; i < XXH3_NEON_LANES / 2; i++) { + /* data_vec = xinput[i]; */ + uint8x16_t data_vec = vld1q_u8(xinput + (i * 16)); + /* key_vec = xsecret[i]; */ + uint8x16_t key_vec = vld1q_u8(xsecret + (i * 16)); + uint64x2_t data_key; + uint32x2_t data_key_lo, data_key_hi; + /* xacc[i] += swap(data_vec); */ + uint64x2_t const data64 = vreinterpretq_u64_u8(data_vec); + uint64x2_t const swapped = vextq_u64(data64, data64, 1); + xacc[i] = vaddq_u64 (xacc[i], swapped); + /* data_key = data_vec ^ key_vec; */ + data_key = vreinterpretq_u64_u8(veorq_u8(data_vec, key_vec)); + /* data_key_lo = (uint32x2_t) (data_key & 0xFFFFFFFF); + * data_key_hi = (uint32x2_t) (data_key >> 32); + * data_key = UNDEFINED; */ + XXH_SPLIT_IN_PLACE(data_key, data_key_lo, data_key_hi); + /* xacc[i] += (uint64x2_t) data_key_lo * (uint64x2_t) data_key_hi; */ + xacc[i] = vmlal_u32 (xacc[i], data_key_lo, data_key_hi); + + } + /* Scalar for the remainder. This may be a zero iteration loop. */ + for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) { + XXH3_scalarRound(acc, input, secret, i); + } + } +} + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + + { uint64x2_t* xacc = (uint64x2_t*) acc; + uint8_t const* xsecret = (uint8_t const*) secret; + uint32x2_t prime = vdup_n_u32 (XXH_PRIME32_1); + + size_t i; + /* NEON for the first few lanes (these loops are normally interleaved) */ + for (i=0; i < XXH3_NEON_LANES / 2; i++) { + /* xacc[i] ^= (xacc[i] >> 47); */ + uint64x2_t acc_vec = xacc[i]; + uint64x2_t shifted = vshrq_n_u64 (acc_vec, 47); + uint64x2_t data_vec = veorq_u64 (acc_vec, shifted); + + /* xacc[i] ^= xsecret[i]; */ + uint8x16_t key_vec = vld1q_u8 (xsecret + (i * 16)); + uint64x2_t data_key = veorq_u64 (data_vec, vreinterpretq_u64_u8(key_vec)); + + /* xacc[i] *= XXH_PRIME32_1 */ + uint32x2_t data_key_lo, data_key_hi; + /* data_key_lo = (uint32x2_t) (xacc[i] & 0xFFFFFFFF); + * data_key_hi = (uint32x2_t) (xacc[i] >> 32); + * xacc[i] = UNDEFINED; */ + XXH_SPLIT_IN_PLACE(data_key, data_key_lo, data_key_hi); + { /* + * prod_hi = (data_key >> 32) * XXH_PRIME32_1; + * + * Avoid vmul_u32 + vshll_n_u32 since Clang 6 and 7 will + * incorrectly "optimize" this: + * tmp = vmul_u32(vmovn_u64(a), vmovn_u64(b)); + * shifted = vshll_n_u32(tmp, 32); + * to this: + * tmp = "vmulq_u64"(a, b); // no such thing! + * shifted = vshlq_n_u64(tmp, 32); + * + * However, unlike SSE, Clang lacks a 64-bit multiply routine + * for NEON, and it scalarizes two 64-bit multiplies instead. + * + * vmull_u32 has the same timing as vmul_u32, and it avoids + * this bug completely. + * See https://bugs.llvm.org/show_bug.cgi?id=39967 + */ + uint64x2_t prod_hi = vmull_u32 (data_key_hi, prime); + /* xacc[i] = prod_hi << 32; */ + xacc[i] = vshlq_n_u64(prod_hi, 32); + /* xacc[i] += (prod_hi & 0xFFFFFFFF) * XXH_PRIME32_1; */ + xacc[i] = vmlal_u32(xacc[i], data_key_lo, prime); + } + } + /* Scalar for the remainder. This may be a zero iteration loop. */ + for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) { + XXH3_scalarScrambleRound(acc, secret, i); + } + } +} + +#endif + +#if (XXH_VECTOR == XXH_VSX) + +XXH_FORCE_INLINE void +XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + /* presumed aligned */ + unsigned int* const xacc = (unsigned int*) acc; + xxh_u64x2 const* const xinput = (xxh_u64x2 const*) input; /* no alignment restriction */ + xxh_u64x2 const* const xsecret = (xxh_u64x2 const*) secret; /* no alignment restriction */ + xxh_u64x2 const v32 = { 32, 32 }; + size_t i; + for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) { + /* data_vec = xinput[i]; */ + xxh_u64x2 const data_vec = XXH_vec_loadu(xinput + i); + /* key_vec = xsecret[i]; */ + xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + i); + xxh_u64x2 const data_key = data_vec ^ key_vec; + /* shuffled = (data_key << 32) | (data_key >> 32); */ + xxh_u32x4 const shuffled = (xxh_u32x4)vec_rl(data_key, v32); + /* product = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)shuffled & 0xFFFFFFFF); */ + xxh_u64x2 const product = XXH_vec_mulo((xxh_u32x4)data_key, shuffled); + /* acc_vec = xacc[i]; */ + xxh_u64x2 acc_vec = (xxh_u64x2)vec_xl(0, xacc + 4 * i); + acc_vec += product; + + /* swap high and low halves */ +#ifdef __s390x__ + acc_vec += vec_permi(data_vec, data_vec, 2); +#else + acc_vec += vec_xxpermdi(data_vec, data_vec, 2); +#endif + /* xacc[i] = acc_vec; */ + vec_xst((xxh_u32x4)acc_vec, 0, xacc + 4 * i); + } +} + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_vsx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + + { xxh_u64x2* const xacc = (xxh_u64x2*) acc; + const xxh_u64x2* const xsecret = (const xxh_u64x2*) secret; + /* constants */ + xxh_u64x2 const v32 = { 32, 32 }; + xxh_u64x2 const v47 = { 47, 47 }; + xxh_u32x4 const prime = { XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1 }; + size_t i; + for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) { + /* xacc[i] ^= (xacc[i] >> 47); */ + xxh_u64x2 const acc_vec = xacc[i]; + xxh_u64x2 const data_vec = acc_vec ^ (acc_vec >> v47); + + /* xacc[i] ^= xsecret[i]; */ + xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + i); + xxh_u64x2 const data_key = data_vec ^ key_vec; + + /* xacc[i] *= XXH_PRIME32_1 */ + /* prod_lo = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)prime & 0xFFFFFFFF); */ + xxh_u64x2 const prod_even = XXH_vec_mule((xxh_u32x4)data_key, prime); + /* prod_hi = ((xxh_u64x2)data_key >> 32) * ((xxh_u64x2)prime >> 32); */ + xxh_u64x2 const prod_odd = XXH_vec_mulo((xxh_u32x4)data_key, prime); + xacc[i] = prod_odd + (prod_even << v32); + } } +} + +#endif + +/* scalar variants - universal */ + +/*! + * @internal + * @brief Scalar round for @ref XXH3_accumulate_512_scalar(). + * + * This is extracted to its own function because the NEON path uses a combination + * of NEON and scalar. + */ +XXH_FORCE_INLINE void +XXH3_scalarRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT input, + void const* XXH_RESTRICT secret, + size_t lane) +{ + xxh_u64* xacc = (xxh_u64*) acc; + xxh_u8 const* xinput = (xxh_u8 const*) input; + xxh_u8 const* xsecret = (xxh_u8 const*) secret; + XXH_ASSERT(lane < XXH_ACC_NB); + XXH_ASSERT(((size_t)acc & (XXH_ACC_ALIGN-1)) == 0); + { + xxh_u64 const data_val = XXH_readLE64(xinput + lane * 8); + xxh_u64 const data_key = data_val ^ XXH_readLE64(xsecret + lane * 8); + xacc[lane ^ 1] += data_val; /* swap adjacent lanes */ + xacc[lane] += XXH_mult32to64(data_key & 0xFFFFFFFF, data_key >> 32); + } +} + +/*! + * @internal + * @brief Processes a 64 byte block of data using the scalar path. + */ +XXH_FORCE_INLINE void +XXH3_accumulate_512_scalar(void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + size_t i; + for (i=0; i < XXH_ACC_NB; i++) { + XXH3_scalarRound(acc, input, secret, i); + } +} + +/*! + * @internal + * @brief Scalar scramble step for @ref XXH3_scrambleAcc_scalar(). + * + * This is extracted to its own function because the NEON path uses a combination + * of NEON and scalar. + */ +XXH_FORCE_INLINE void +XXH3_scalarScrambleRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT secret, + size_t lane) +{ + xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ + const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */ + XXH_ASSERT((((size_t)acc) & (XXH_ACC_ALIGN-1)) == 0); + XXH_ASSERT(lane < XXH_ACC_NB); + { + xxh_u64 const key64 = XXH_readLE64(xsecret + lane * 8); + xxh_u64 acc64 = xacc[lane]; + acc64 = XXH_xorshift64(acc64, 47); + acc64 ^= key64; + acc64 *= XXH_PRIME32_1; + xacc[lane] = acc64; + } +} + +/*! + * @internal + * @brief Scrambles the accumulators after a large chunk has been read + */ +XXH_FORCE_INLINE void +XXH3_scrambleAcc_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + size_t i; + for (i=0; i < XXH_ACC_NB; i++) { + XXH3_scalarScrambleRound(acc, secret, i); + } +} + +XXH_FORCE_INLINE void +XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + /* + * We need a separate pointer for the hack below, + * which requires a non-const pointer. + * Any decent compiler will optimize this out otherwise. + */ + const xxh_u8* kSecretPtr = XXH3_kSecret; + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); + +#if defined(__clang__) && defined(__aarch64__) + /* + * UGLY HACK: + * Clang generates a bunch of MOV/MOVK pairs for aarch64, and they are + * placed sequentially, in order, at the top of the unrolled loop. + * + * While MOVK is great for generating constants (2 cycles for a 64-bit + * constant compared to 4 cycles for LDR), it fights for bandwidth with + * the arithmetic instructions. + * + * I L S + * MOVK + * MOVK + * MOVK + * MOVK + * ADD + * SUB STR + * STR + * By forcing loads from memory (as the asm line causes Clang to assume + * that XXH3_kSecretPtr has been changed), the pipelines are used more + * efficiently: + * I L S + * LDR + * ADD LDR + * SUB STR + * STR + * + * See XXH3_NEON_LANES for details on the pipsline. + * + * XXH3_64bits_withSeed, len == 256, Snapdragon 835 + * without hack: 2654.4 MB/s + * with hack: 3202.9 MB/s + */ + XXH_COMPILER_GUARD(kSecretPtr); +#endif + /* + * Note: in debug mode, this overrides the asm optimization + * and Clang will emit MOVK chains again. + */ + XXH_ASSERT(kSecretPtr == XXH3_kSecret); + + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / 16; + int i; + for (i=0; i < nbRounds; i++) { + /* + * The asm hack causes Clang to assume that kSecretPtr aliases with + * customSecret, and on aarch64, this prevented LDP from merging two + * loads together for free. Putting the loads together before the stores + * properly generates LDP. + */ + xxh_u64 lo = XXH_readLE64(kSecretPtr + 16*i) + seed64; + xxh_u64 hi = XXH_readLE64(kSecretPtr + 16*i + 8) - seed64; + XXH_writeLE64((xxh_u8*)customSecret + 16*i, lo); + XXH_writeLE64((xxh_u8*)customSecret + 16*i + 8, hi); + } } +} + + +typedef void (*XXH3_f_accumulate_512)(void* XXH_RESTRICT, const void*, const void*); +typedef void (*XXH3_f_scrambleAcc)(void* XXH_RESTRICT, const void*); +typedef void (*XXH3_f_initCustomSecret)(void* XXH_RESTRICT, xxh_u64); + + +#if (XXH_VECTOR == XXH_AVX512) + +#define XXH3_accumulate_512 XXH3_accumulate_512_avx512 +#define XXH3_scrambleAcc XXH3_scrambleAcc_avx512 +#define XXH3_initCustomSecret XXH3_initCustomSecret_avx512 + +#elif (XXH_VECTOR == XXH_AVX2) + +#define XXH3_accumulate_512 XXH3_accumulate_512_avx2 +#define XXH3_scrambleAcc XXH3_scrambleAcc_avx2 +#define XXH3_initCustomSecret XXH3_initCustomSecret_avx2 + +#elif (XXH_VECTOR == XXH_SSE2) + +#define XXH3_accumulate_512 XXH3_accumulate_512_sse2 +#define XXH3_scrambleAcc XXH3_scrambleAcc_sse2 +#define XXH3_initCustomSecret XXH3_initCustomSecret_sse2 + +#elif (XXH_VECTOR == XXH_NEON) + +#define XXH3_accumulate_512 XXH3_accumulate_512_neon +#define XXH3_scrambleAcc XXH3_scrambleAcc_neon +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#elif (XXH_VECTOR == XXH_VSX) + +#define XXH3_accumulate_512 XXH3_accumulate_512_vsx +#define XXH3_scrambleAcc XXH3_scrambleAcc_vsx +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#else /* scalar */ + +#define XXH3_accumulate_512 XXH3_accumulate_512_scalar +#define XXH3_scrambleAcc XXH3_scrambleAcc_scalar +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#endif + + + +#ifndef XXH_PREFETCH_DIST +# ifdef __clang__ +# define XXH_PREFETCH_DIST 320 +# else +# if (XXH_VECTOR == XXH_AVX512) +# define XXH_PREFETCH_DIST 512 +# else +# define XXH_PREFETCH_DIST 384 +# endif +# endif /* __clang__ */ +#endif /* XXH_PREFETCH_DIST */ + +/* + * XXH3_accumulate() + * Loops over XXH3_accumulate_512(). + * Assumption: nbStripes will not overflow the secret size + */ +XXH_FORCE_INLINE void +XXH3_accumulate( xxh_u64* XXH_RESTRICT acc, + const xxh_u8* XXH_RESTRICT input, + const xxh_u8* XXH_RESTRICT secret, + size_t nbStripes, + XXH3_f_accumulate_512 f_acc512) +{ + size_t n; + for (n = 0; n < nbStripes; n++ ) { + const xxh_u8* const in = input + n*XXH_STRIPE_LEN; + XXH_PREFETCH(in + XXH_PREFETCH_DIST); + f_acc512(acc, + in, + secret + n*XXH_SECRET_CONSUME_RATE); + } +} + +XXH_FORCE_INLINE void +XXH3_hashLong_internal_loop(xxh_u64* XXH_RESTRICT acc, + const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + size_t const nbStripesPerBlock = (secretSize - XXH_STRIPE_LEN) / XXH_SECRET_CONSUME_RATE; + size_t const block_len = XXH_STRIPE_LEN * nbStripesPerBlock; + size_t const nb_blocks = (len - 1) / block_len; + + size_t n; + + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + + for (n = 0; n < nb_blocks; n++) { + XXH3_accumulate(acc, input + n*block_len, secret, nbStripesPerBlock, f_acc512); + f_scramble(acc, secret + secretSize - XXH_STRIPE_LEN); + } + + /* last partial block */ + XXH_ASSERT(len > XXH_STRIPE_LEN); + { size_t const nbStripes = ((len - 1) - (block_len * nb_blocks)) / XXH_STRIPE_LEN; + XXH_ASSERT(nbStripes <= (secretSize / XXH_SECRET_CONSUME_RATE)); + XXH3_accumulate(acc, input + nb_blocks*block_len, secret, nbStripes, f_acc512); + + /* last stripe */ + { const xxh_u8* const p = input + len - XXH_STRIPE_LEN; +#define XXH_SECRET_LASTACC_START 7 /* not aligned on 8, last secret is different from acc & scrambler */ + f_acc512(acc, p, secret + secretSize - XXH_STRIPE_LEN - XXH_SECRET_LASTACC_START); + } } +} + +XXH_FORCE_INLINE xxh_u64 +XXH3_mix2Accs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret) +{ + return XXH3_mul128_fold64( + acc[0] ^ XXH_readLE64(secret), + acc[1] ^ XXH_readLE64(secret+8) ); +} + +static XXH64_hash_t +XXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret, xxh_u64 start) +{ + xxh_u64 result64 = start; + size_t i = 0; + + for (i = 0; i < 4; i++) { + result64 += XXH3_mix2Accs(acc+2*i, secret + 16*i); +#if defined(__clang__) /* Clang */ \ + && (defined(__arm__) || defined(__thumb__)) /* ARMv7 */ \ + && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */ + /* + * UGLY HACK: + * Prevent autovectorization on Clang ARMv7-a. Exact same problem as + * the one in XXH3_len_129to240_64b. Speeds up shorter keys > 240b. + * XXH3_64bits, len == 256, Snapdragon 835: + * without hack: 2063.7 MB/s + * with hack: 2560.7 MB/s + */ + XXH_COMPILER_GUARD(result64); +#endif + } + + return XXH3_avalanche(result64); +} + +#define XXH3_INIT_ACC { XXH_PRIME32_3, XXH_PRIME64_1, XXH_PRIME64_2, XXH_PRIME64_3, \ + XXH_PRIME64_4, XXH_PRIME32_2, XXH_PRIME64_5, XXH_PRIME32_1 } + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_internal(const void* XXH_RESTRICT input, size_t len, + const void* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC; + + XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, f_acc512, f_scramble); + + /* converge into final hash */ + XXH_STATIC_ASSERT(sizeof(acc) == 64); + /* do not align on 8, so that the secret is different from the accumulator */ +#define XXH_SECRET_MERGEACCS_START 11 + XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + return XXH3_mergeAccs(acc, (const xxh_u8*)secret + XXH_SECRET_MERGEACCS_START, (xxh_u64)len * XXH_PRIME64_1); +} + +/* + * It's important for performance to transmit secret's size (when it's static) + * so that the compiler can properly optimize the vectorized loop. + * This makes a big performance difference for "medium" keys (<1 KB) when using AVX instruction set. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + return XXH3_hashLong_64b_internal(input, len, secret, secretLen, XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/* + * It's preferable for performance that XXH3_hashLong is not inlined, + * as it results in a smaller function for small data, easier to the instruction cache. + * Note that inside this no_inline function, we do inline the internal loop, + * and provide a statically defined secret size to allow optimization of vector loop. + */ +XXH_NO_INLINE XXH64_hash_t +XXH3_hashLong_64b_default(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + return XXH3_hashLong_64b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/* + * XXH3_hashLong_64b_withSeed(): + * Generate a custom key based on alteration of default XXH3_kSecret with the seed, + * and then use this key for long mode hashing. + * + * This operation is decently fast but nonetheless costs a little bit of time. + * Try to avoid it whenever possible (typically when seed==0). + * + * It's important for performance that XXH3_hashLong is not inlined. Not sure + * why (uop cache maybe?), but the difference is large and easily measurable. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSeed_internal(const void* input, size_t len, + XXH64_hash_t seed, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble, + XXH3_f_initCustomSecret f_initSec) +{ + if (seed == 0) + return XXH3_hashLong_64b_internal(input, len, + XXH3_kSecret, sizeof(XXH3_kSecret), + f_acc512, f_scramble); + { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + f_initSec(secret, seed); + return XXH3_hashLong_64b_internal(input, len, secret, sizeof(secret), + f_acc512, f_scramble); + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSeed(const void* input, size_t len, + XXH64_hash_t seed, const xxh_u8* secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + return XXH3_hashLong_64b_withSeed_internal(input, len, seed, + XXH3_accumulate_512, XXH3_scrambleAcc, XXH3_initCustomSecret); +} + + +typedef XXH64_hash_t (*XXH3_hashLong64_f)(const void* XXH_RESTRICT, size_t, + XXH64_hash_t, const xxh_u8* XXH_RESTRICT, size_t); + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_64bits_internal(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen, + XXH3_hashLong64_f f_hashLong) +{ + XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN); + /* + * If an action is to be taken if `secretLen` condition is not respected, + * it should be done here. + * For now, it's a contract pre-condition. + * Adding a check and a branch here would cost performance at every hash. + * Also, note that function signature doesn't offer room to return an error. + */ + if (len <= 16) + return XXH3_len_0to16_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64); + if (len <= 128) + return XXH3_len_17to128_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_len_129to240_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + return f_hashLong(input, len, seed64, (const xxh_u8*)secret, secretLen); +} + + +/* === Public entry point === */ + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* input, size_t len) +{ + return XXH3_64bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_default); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) +{ + return XXH3_64bits_internal(input, len, 0, secret, secretSize, XXH3_hashLong_64b_withSecret); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed); +} + +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_64b_withSecret(input, len, seed, (const xxh_u8*)secret, secretSize); +} + + +/* === XXH3 streaming === */ + +/* + * Malloc's a pointer that is always aligned to align. + * + * This must be freed with `XXH_alignedFree()`. + * + * malloc typically guarantees 16 byte alignment on 64-bit systems and 8 byte + * alignment on 32-bit. This isn't enough for the 32 byte aligned loads in AVX2 + * or on 32-bit, the 16 byte aligned loads in SSE2 and NEON. + * + * This underalignment previously caused a rather obvious crash which went + * completely unnoticed due to XXH3_createState() not actually being tested. + * Credit to RedSpah for noticing this bug. + * + * The alignment is done manually: Functions like posix_memalign or _mm_malloc + * are avoided: To maintain portability, we would have to write a fallback + * like this anyways, and besides, testing for the existence of library + * functions without relying on external build tools is impossible. + * + * The method is simple: Overallocate, manually align, and store the offset + * to the original behind the returned pointer. + * + * Align must be a power of 2 and 8 <= align <= 128. + */ +static void* XXH_alignedMalloc(size_t s, size_t align) +{ + XXH_ASSERT(align <= 128 && align >= 8); /* range check */ + XXH_ASSERT((align & (align-1)) == 0); /* power of 2 */ + XXH_ASSERT(s != 0 && s < (s + align)); /* empty/overflow */ + { /* Overallocate to make room for manual realignment and an offset byte */ + xxh_u8* base = (xxh_u8*)XXH_malloc(s + align); + if (base != NULL) { + /* + * Get the offset needed to align this pointer. + * + * Even if the returned pointer is aligned, there will always be + * at least one byte to store the offset to the original pointer. + */ + size_t offset = align - ((size_t)base & (align - 1)); /* base % align */ + /* Add the offset for the now-aligned pointer */ + xxh_u8* ptr = base + offset; + + XXH_ASSERT((size_t)ptr % align == 0); + + /* Store the offset immediately before the returned pointer. */ + ptr[-1] = (xxh_u8)offset; + return ptr; + } + return NULL; + } +} +/* + * Frees an aligned pointer allocated by XXH_alignedMalloc(). Don't pass + * normal malloc'd pointers, XXH_alignedMalloc has a specific data layout. + */ +static void XXH_alignedFree(void* p) +{ + if (p != NULL) { + xxh_u8* ptr = (xxh_u8*)p; + /* Get the offset byte we added in XXH_malloc. */ + xxh_u8 offset = ptr[-1]; + /* Free the original malloc'd pointer */ + xxh_u8* base = ptr - offset; + XXH_free(base); + } +} +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void) +{ + XXH3_state_t* const state = (XXH3_state_t*)XXH_alignedMalloc(sizeof(XXH3_state_t), 64); + if (state==NULL) return NULL; + XXH3_INITSTATE(state); + return state; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr) +{ + XXH_alignedFree(statePtr); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API void +XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state) +{ + XXH_memcpy(dst_state, src_state, sizeof(*dst_state)); +} + +static void +XXH3_reset_internal(XXH3_state_t* statePtr, + XXH64_hash_t seed, + const void* secret, size_t secretSize) +{ + size_t const initStart = offsetof(XXH3_state_t, bufferedSize); + size_t const initLength = offsetof(XXH3_state_t, nbStripesPerBlock) - initStart; + XXH_ASSERT(offsetof(XXH3_state_t, nbStripesPerBlock) > initStart); + XXH_ASSERT(statePtr != NULL); + /* set members from bufferedSize to nbStripesPerBlock (excluded) to 0 */ + memset((char*)statePtr + initStart, 0, initLength); + statePtr->acc[0] = XXH_PRIME32_3; + statePtr->acc[1] = XXH_PRIME64_1; + statePtr->acc[2] = XXH_PRIME64_2; + statePtr->acc[3] = XXH_PRIME64_3; + statePtr->acc[4] = XXH_PRIME64_4; + statePtr->acc[5] = XXH_PRIME32_2; + statePtr->acc[6] = XXH_PRIME64_5; + statePtr->acc[7] = XXH_PRIME32_1; + statePtr->seed = seed; + statePtr->useSeed = (seed != 0); + statePtr->extSecret = (const unsigned char*)secret; + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + statePtr->secretLimit = secretSize - XXH_STRIPE_LEN; + statePtr->nbStripesPerBlock = statePtr->secretLimit / XXH_SECRET_CONSUME_RATE; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset(XXH3_state_t* statePtr) +{ + if (statePtr == NULL) return XXH_ERROR; + XXH3_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) +{ + if (statePtr == NULL) return XXH_ERROR; + XXH3_reset_internal(statePtr, 0, secret, secretSize); + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) +{ + if (statePtr == NULL) return XXH_ERROR; + if (seed==0) return XXH3_64bits_reset(statePtr); + if ((seed != statePtr->seed) || (statePtr->extSecret != NULL)) + XXH3_initCustomSecret(statePtr->customSecret, seed); + XXH3_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed64) +{ + if (statePtr == NULL) return XXH_ERROR; + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + XXH3_reset_internal(statePtr, seed64, secret, secretSize); + statePtr->useSeed = 1; /* always, even if seed64==0 */ + return XXH_OK; +} + +/* Note : when XXH3_consumeStripes() is invoked, + * there must be a guarantee that at least one more byte must be consumed from input + * so that the function can blindly consume all stripes using the "normal" secret segment */ +XXH_FORCE_INLINE void +XXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc, + size_t* XXH_RESTRICT nbStripesSoFarPtr, size_t nbStripesPerBlock, + const xxh_u8* XXH_RESTRICT input, size_t nbStripes, + const xxh_u8* XXH_RESTRICT secret, size_t secretLimit, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ASSERT(nbStripes <= nbStripesPerBlock); /* can handle max 1 scramble per invocation */ + XXH_ASSERT(*nbStripesSoFarPtr < nbStripesPerBlock); + if (nbStripesPerBlock - *nbStripesSoFarPtr <= nbStripes) { + /* need a scrambling operation */ + size_t const nbStripesToEndofBlock = nbStripesPerBlock - *nbStripesSoFarPtr; + size_t const nbStripesAfterBlock = nbStripes - nbStripesToEndofBlock; + XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripesToEndofBlock, f_acc512); + f_scramble(acc, secret + secretLimit); + XXH3_accumulate(acc, input + nbStripesToEndofBlock * XXH_STRIPE_LEN, secret, nbStripesAfterBlock, f_acc512); + *nbStripesSoFarPtr = nbStripesAfterBlock; + } else { + XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripes, f_acc512); + *nbStripesSoFarPtr += nbStripes; + } +} + +#ifndef XXH3_STREAM_USE_STACK +# ifndef __clang__ /* clang doesn't need additional stack space */ +# define XXH3_STREAM_USE_STACK 1 +# endif +#endif +/* + * Both XXH3_64bits_update and XXH3_128bits_update use this routine. + */ +XXH_FORCE_INLINE XXH_errorcode +XXH3_update(XXH3_state_t* XXH_RESTRICT const state, + const xxh_u8* XXH_RESTRICT input, size_t len, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + XXH_ASSERT(state != NULL); + { const xxh_u8* const bEnd = input + len; + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* For some reason, gcc and MSVC seem to suffer greatly + * when operating accumulators directly into state. + * Operating into stack space seems to enable proper optimization. + * clang, on the other hand, doesn't seem to need this trick */ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[8]; memcpy(acc, state->acc, sizeof(acc)); +#else + xxh_u64* XXH_RESTRICT const acc = state->acc; +#endif + state->totalLen += len; + XXH_ASSERT(state->bufferedSize <= XXH3_INTERNALBUFFER_SIZE); + + /* small input : just fill in tmp buffer */ + if (state->bufferedSize + len <= XXH3_INTERNALBUFFER_SIZE) { + XXH_memcpy(state->buffer + state->bufferedSize, input, len); + state->bufferedSize += (XXH32_hash_t)len; + return XXH_OK; + } + + /* total input is now > XXH3_INTERNALBUFFER_SIZE */ + #define XXH3_INTERNALBUFFER_STRIPES (XXH3_INTERNALBUFFER_SIZE / XXH_STRIPE_LEN) + XXH_STATIC_ASSERT(XXH3_INTERNALBUFFER_SIZE % XXH_STRIPE_LEN == 0); /* clean multiple */ + + /* + * Internal buffer is partially filled (always, except at beginning) + * Complete it, then consume it. + */ + if (state->bufferedSize) { + size_t const loadSize = XXH3_INTERNALBUFFER_SIZE - state->bufferedSize; + XXH_memcpy(state->buffer + state->bufferedSize, input, loadSize); + input += loadSize; + XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + state->buffer, XXH3_INTERNALBUFFER_STRIPES, + secret, state->secretLimit, + f_acc512, f_scramble); + state->bufferedSize = 0; + } + XXH_ASSERT(input < bEnd); + + /* large input to consume : ingest per full block */ + if ((size_t)(bEnd - input) > state->nbStripesPerBlock * XXH_STRIPE_LEN) { + size_t nbStripes = (size_t)(bEnd - 1 - input) / XXH_STRIPE_LEN; + XXH_ASSERT(state->nbStripesPerBlock >= state->nbStripesSoFar); + /* join to current block's end */ + { size_t const nbStripesToEnd = state->nbStripesPerBlock - state->nbStripesSoFar; + XXH_ASSERT(nbStripesToEnd <= nbStripes); + XXH3_accumulate(acc, input, secret + state->nbStripesSoFar * XXH_SECRET_CONSUME_RATE, nbStripesToEnd, f_acc512); + f_scramble(acc, secret + state->secretLimit); + state->nbStripesSoFar = 0; + input += nbStripesToEnd * XXH_STRIPE_LEN; + nbStripes -= nbStripesToEnd; + } + /* consume per entire blocks */ + while(nbStripes >= state->nbStripesPerBlock) { + XXH3_accumulate(acc, input, secret, state->nbStripesPerBlock, f_acc512); + f_scramble(acc, secret + state->secretLimit); + input += state->nbStripesPerBlock * XXH_STRIPE_LEN; + nbStripes -= state->nbStripesPerBlock; + } + /* consume last partial block */ + XXH3_accumulate(acc, input, secret, nbStripes, f_acc512); + input += nbStripes * XXH_STRIPE_LEN; + XXH_ASSERT(input < bEnd); /* at least some bytes left */ + state->nbStripesSoFar = nbStripes; + /* buffer predecessor of last partial stripe */ + XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + XXH_ASSERT(bEnd - input <= XXH_STRIPE_LEN); + } else { + /* content to consume <= block size */ + /* Consume input by a multiple of internal buffer size */ + if (bEnd - input > XXH3_INTERNALBUFFER_SIZE) { + const xxh_u8* const limit = bEnd - XXH3_INTERNALBUFFER_SIZE; + do { + XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + input, XXH3_INTERNALBUFFER_STRIPES, + secret, state->secretLimit, + f_acc512, f_scramble); + input += XXH3_INTERNALBUFFER_SIZE; + } while (inputbuffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + } + } + + /* Some remaining input (always) : buffer it */ + XXH_ASSERT(input < bEnd); + XXH_ASSERT(bEnd - input <= XXH3_INTERNALBUFFER_SIZE); + XXH_ASSERT(state->bufferedSize == 0); + XXH_memcpy(state->buffer, input, (size_t)(bEnd-input)); + state->bufferedSize = (XXH32_hash_t)(bEnd-input); +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* save stack accumulators into state */ + memcpy(state->acc, acc, sizeof(acc)); +#endif + } + + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_update(XXH3_state_t* state, const void* input, size_t len) +{ + return XXH3_update(state, (const xxh_u8*)input, len, + XXH3_accumulate_512, XXH3_scrambleAcc); +} + + +XXH_FORCE_INLINE void +XXH3_digest_long (XXH64_hash_t* acc, + const XXH3_state_t* state, + const unsigned char* secret) +{ + /* + * Digest on a local copy. This way, the state remains unaltered, and it can + * continue ingesting more input afterwards. + */ + XXH_memcpy(acc, state->acc, sizeof(state->acc)); + if (state->bufferedSize >= XXH_STRIPE_LEN) { + size_t const nbStripes = (state->bufferedSize - 1) / XXH_STRIPE_LEN; + size_t nbStripesSoFar = state->nbStripesSoFar; + XXH3_consumeStripes(acc, + &nbStripesSoFar, state->nbStripesPerBlock, + state->buffer, nbStripes, + secret, state->secretLimit, + XXH3_accumulate_512, XXH3_scrambleAcc); + /* last stripe */ + XXH3_accumulate_512(acc, + state->buffer + state->bufferedSize - XXH_STRIPE_LEN, + secret + state->secretLimit - XXH_SECRET_LASTACC_START); + } else { /* bufferedSize < XXH_STRIPE_LEN */ + xxh_u8 lastStripe[XXH_STRIPE_LEN]; + size_t const catchupSize = XXH_STRIPE_LEN - state->bufferedSize; + XXH_ASSERT(state->bufferedSize > 0); /* there is always some input buffered */ + XXH_memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize); + XXH_memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize); + XXH3_accumulate_512(acc, + lastStripe, + secret + state->secretLimit - XXH_SECRET_LASTACC_START); + } +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state) +{ + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; + if (state->totalLen > XXH3_MIDSIZE_MAX) { + XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB]; + XXH3_digest_long(acc, state, secret); + return XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)state->totalLen * XXH_PRIME64_1); + } + /* totalLen <= XXH3_MIDSIZE_MAX: digesting a short input */ + if (state->useSeed) + return XXH3_64bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); + return XXH3_64bits_withSecret(state->buffer, (size_t)(state->totalLen), + secret, state->secretLimit + XXH_STRIPE_LEN); +} + + + +/* ========================================== + * XXH3 128 bits (a.k.a XXH128) + * ========================================== + * XXH3's 128-bit variant has better mixing and strength than the 64-bit variant, + * even without counting the significantly larger output size. + * + * For example, extra steps are taken to avoid the seed-dependent collisions + * in 17-240 byte inputs (See XXH3_mix16B and XXH128_mix32B). + * + * This strength naturally comes at the cost of some speed, especially on short + * lengths. Note that longer hashes are about as fast as the 64-bit version + * due to it using only a slight modification of the 64-bit loop. + * + * XXH128 is also more oriented towards 64-bit machines. It is still extremely + * fast for a _128-bit_ hash on 32-bit (it usually clears XXH64). + */ + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_1to3_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + /* A doubled version of 1to3_64b with different constants. */ + XXH_ASSERT(input != NULL); + XXH_ASSERT(1 <= len && len <= 3); + XXH_ASSERT(secret != NULL); + /* + * len = 1: combinedl = { input[0], 0x01, input[0], input[0] } + * len = 2: combinedl = { input[1], 0x02, input[0], input[1] } + * len = 3: combinedl = { input[2], 0x03, input[0], input[1] } + */ + { xxh_u8 const c1 = input[0]; + xxh_u8 const c2 = input[len >> 1]; + xxh_u8 const c3 = input[len - 1]; + xxh_u32 const combinedl = ((xxh_u32)c1 <<16) | ((xxh_u32)c2 << 24) + | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8); + xxh_u32 const combinedh = XXH_rotl32(XXH_swap32(combinedl), 13); + xxh_u64 const bitflipl = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed; + xxh_u64 const bitfliph = (XXH_readLE32(secret+8) ^ XXH_readLE32(secret+12)) - seed; + xxh_u64 const keyed_lo = (xxh_u64)combinedl ^ bitflipl; + xxh_u64 const keyed_hi = (xxh_u64)combinedh ^ bitfliph; + XXH128_hash_t h128; + h128.low64 = XXH64_avalanche(keyed_lo); + h128.high64 = XXH64_avalanche(keyed_hi); + return h128; + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_4to8_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(4 <= len && len <= 8); + seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; + { xxh_u32 const input_lo = XXH_readLE32(input); + xxh_u32 const input_hi = XXH_readLE32(input + len - 4); + xxh_u64 const input_64 = input_lo + ((xxh_u64)input_hi << 32); + xxh_u64 const bitflip = (XXH_readLE64(secret+16) ^ XXH_readLE64(secret+24)) + seed; + xxh_u64 const keyed = input_64 ^ bitflip; + + /* Shift len to the left to ensure it is even, this avoids even multiplies. */ + XXH128_hash_t m128 = XXH_mult64to128(keyed, XXH_PRIME64_1 + (len << 2)); + + m128.high64 += (m128.low64 << 1); + m128.low64 ^= (m128.high64 >> 3); + + m128.low64 = XXH_xorshift64(m128.low64, 35); + m128.low64 *= 0x9FB21C651E98DF25ULL; + m128.low64 = XXH_xorshift64(m128.low64, 28); + m128.high64 = XXH3_avalanche(m128.high64); + return m128; + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_9to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(9 <= len && len <= 16); + { xxh_u64 const bitflipl = (XXH_readLE64(secret+32) ^ XXH_readLE64(secret+40)) - seed; + xxh_u64 const bitfliph = (XXH_readLE64(secret+48) ^ XXH_readLE64(secret+56)) + seed; + xxh_u64 const input_lo = XXH_readLE64(input); + xxh_u64 input_hi = XXH_readLE64(input + len - 8); + XXH128_hash_t m128 = XXH_mult64to128(input_lo ^ input_hi ^ bitflipl, XXH_PRIME64_1); + /* + * Put len in the middle of m128 to ensure that the length gets mixed to + * both the low and high bits in the 128x64 multiply below. + */ + m128.low64 += (xxh_u64)(len - 1) << 54; + input_hi ^= bitfliph; + /* + * Add the high 32 bits of input_hi to the high 32 bits of m128, then + * add the long product of the low 32 bits of input_hi and XXH_PRIME32_2 to + * the high 64 bits of m128. + * + * The best approach to this operation is different on 32-bit and 64-bit. + */ + if (sizeof(void *) < sizeof(xxh_u64)) { /* 32-bit */ + /* + * 32-bit optimized version, which is more readable. + * + * On 32-bit, it removes an ADC and delays a dependency between the two + * halves of m128.high64, but it generates an extra mask on 64-bit. + */ + m128.high64 += (input_hi & 0xFFFFFFFF00000000ULL) + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2); + } else { + /* + * 64-bit optimized (albeit more confusing) version. + * + * Uses some properties of addition and multiplication to remove the mask: + * + * Let: + * a = input_hi.lo = (input_hi & 0x00000000FFFFFFFF) + * b = input_hi.hi = (input_hi & 0xFFFFFFFF00000000) + * c = XXH_PRIME32_2 + * + * a + (b * c) + * Inverse Property: x + y - x == y + * a + (b * (1 + c - 1)) + * Distributive Property: x * (y + z) == (x * y) + (x * z) + * a + (b * 1) + (b * (c - 1)) + * Identity Property: x * 1 == x + * a + b + (b * (c - 1)) + * + * Substitute a, b, and c: + * input_hi.hi + input_hi.lo + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1)) + * + * Since input_hi.hi + input_hi.lo == input_hi, we get this: + * input_hi + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1)) + */ + m128.high64 += input_hi + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2 - 1); + } + /* m128 ^= XXH_swap64(m128 >> 64); */ + m128.low64 ^= XXH_swap64(m128.high64); + + { /* 128x64 multiply: h128 = m128 * XXH_PRIME64_2; */ + XXH128_hash_t h128 = XXH_mult64to128(m128.low64, XXH_PRIME64_2); + h128.high64 += m128.high64 * XXH_PRIME64_2; + + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = XXH3_avalanche(h128.high64); + return h128; + } } +} + +/* + * Assumption: `secret` size is >= XXH3_SECRET_SIZE_MIN + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_0to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(len <= 16); + { if (len > 8) return XXH3_len_9to16_128b(input, len, secret, seed); + if (len >= 4) return XXH3_len_4to8_128b(input, len, secret, seed); + if (len) return XXH3_len_1to3_128b(input, len, secret, seed); + { XXH128_hash_t h128; + xxh_u64 const bitflipl = XXH_readLE64(secret+64) ^ XXH_readLE64(secret+72); + xxh_u64 const bitfliph = XXH_readLE64(secret+80) ^ XXH_readLE64(secret+88); + h128.low64 = XXH64_avalanche(seed ^ bitflipl); + h128.high64 = XXH64_avalanche( seed ^ bitfliph); + return h128; + } } +} + +/* + * A bit slower than XXH3_mix16B, but handles multiply by zero better. + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH128_mix32B(XXH128_hash_t acc, const xxh_u8* input_1, const xxh_u8* input_2, + const xxh_u8* secret, XXH64_hash_t seed) +{ + acc.low64 += XXH3_mix16B (input_1, secret+0, seed); + acc.low64 ^= XXH_readLE64(input_2) + XXH_readLE64(input_2 + 8); + acc.high64 += XXH3_mix16B (input_2, secret+16, seed); + acc.high64 ^= XXH_readLE64(input_1) + XXH_readLE64(input_1 + 8); + return acc; +} + + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(16 < len && len <= 128); + + { XXH128_hash_t acc; + acc.low64 = len * XXH_PRIME64_1; + acc.high64 = 0; + if (len > 32) { + if (len > 64) { + if (len > 96) { + acc = XXH128_mix32B(acc, input+48, input+len-64, secret+96, seed); + } + acc = XXH128_mix32B(acc, input+32, input+len-48, secret+64, seed); + } + acc = XXH128_mix32B(acc, input+16, input+len-32, secret+32, seed); + } + acc = XXH128_mix32B(acc, input, input+len-16, secret, seed); + { XXH128_hash_t h128; + h128.low64 = acc.low64 + acc.high64; + h128.high64 = (acc.low64 * XXH_PRIME64_1) + + (acc.high64 * XXH_PRIME64_4) + + ((len - seed) * XXH_PRIME64_2); + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64); + return h128; + } + } +} + +XXH_NO_INLINE XXH128_hash_t +XXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + + { XXH128_hash_t acc; + int const nbRounds = (int)len / 32; + int i; + acc.low64 = len * XXH_PRIME64_1; + acc.high64 = 0; + for (i=0; i<4; i++) { + acc = XXH128_mix32B(acc, + input + (32 * i), + input + (32 * i) + 16, + secret + (32 * i), + seed); + } + acc.low64 = XXH3_avalanche(acc.low64); + acc.high64 = XXH3_avalanche(acc.high64); + XXH_ASSERT(nbRounds >= 4); + for (i=4 ; i < nbRounds; i++) { + acc = XXH128_mix32B(acc, + input + (32 * i), + input + (32 * i) + 16, + secret + XXH3_MIDSIZE_STARTOFFSET + (32 * (i - 4)), + seed); + } + /* last bytes */ + acc = XXH128_mix32B(acc, + input + len - 16, + input + len - 32, + secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET - 16, + 0ULL - seed); + + { XXH128_hash_t h128; + h128.low64 = acc.low64 + acc.high64; + h128.high64 = (acc.low64 * XXH_PRIME64_1) + + (acc.high64 * XXH_PRIME64_4) + + ((len - seed) * XXH_PRIME64_2); + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64); + return h128; + } + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_internal(const void* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC; + + XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, secret, secretSize, f_acc512, f_scramble); + + /* converge into final hash */ + XXH_STATIC_ASSERT(sizeof(acc) == 64); + XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + { XXH128_hash_t h128; + h128.low64 = XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)len * XXH_PRIME64_1); + h128.high64 = XXH3_mergeAccs(acc, + secret + secretSize + - sizeof(acc) - XXH_SECRET_MERGEACCS_START, + ~((xxh_u64)len * XXH_PRIME64_2)); + return h128; + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH128_hash_t +XXH3_hashLong_128b_default(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + return XXH3_hashLong_128b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/* + * It's important for performance to pass @secretLen (when it's static) + * to the compiler, so that it can properly optimize the vectorized loop. + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSecret(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, secretLen, + XXH3_accumulate_512, XXH3_scrambleAcc); +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSeed_internal(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble, + XXH3_f_initCustomSecret f_initSec) +{ + if (seed64 == 0) + return XXH3_hashLong_128b_internal(input, len, + XXH3_kSecret, sizeof(XXH3_kSecret), + f_acc512, f_scramble); + { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + f_initSec(secret, seed64); + return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, sizeof(secret), + f_acc512, f_scramble); + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSeed(const void* input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + return XXH3_hashLong_128b_withSeed_internal(input, len, seed64, + XXH3_accumulate_512, XXH3_scrambleAcc, XXH3_initCustomSecret); +} + +typedef XXH128_hash_t (*XXH3_hashLong128_f)(const void* XXH_RESTRICT, size_t, + XXH64_hash_t, const void* XXH_RESTRICT, size_t); + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_128bits_internal(const void* input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen, + XXH3_hashLong128_f f_hl128) +{ + XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN); + /* + * If an action is to be taken if `secret` conditions are not respected, + * it should be done here. + * For now, it's a contract pre-condition. + * Adding a check and a branch here would cost performance at every hash. + */ + if (len <= 16) + return XXH3_len_0to16_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64); + if (len <= 128) + return XXH3_len_17to128_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_len_129to240_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + return f_hl128(input, len, seed64, secret, secretLen); +} + + +/* === Public XXH128 API === */ + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* input, size_t len) +{ + return XXH3_128bits_internal(input, len, 0, + XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_hashLong_128b_default); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) +{ + return XXH3_128bits_internal(input, len, 0, + (const xxh_u8*)secret, secretSize, + XXH3_hashLong_128b_withSecret); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_internal(input, len, seed, + XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_hashLong_128b_withSeed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_128b_withSecret(input, len, seed, secret, secretSize); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH128(const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_withSeed(input, len, seed); +} + + +/* === XXH3 128-bit streaming === */ + +/* + * All initialization and update functions are identical to 64-bit streaming variant. + * The only difference is the finalization routine. + */ + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset(XXH3_state_t* statePtr) +{ + return XXH3_64bits_reset(statePtr); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) +{ + return XXH3_64bits_reset_withSecret(statePtr, secret, secretSize); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSeed(statePtr, seed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSecretandSeed(statePtr, secret, secretSize, seed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_update(XXH3_state_t* state, const void* input, size_t len) +{ + return XXH3_update(state, (const xxh_u8*)input, len, + XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* state) +{ + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; + if (state->totalLen > XXH3_MIDSIZE_MAX) { + XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB]; + XXH3_digest_long(acc, state, secret); + XXH_ASSERT(state->secretLimit + XXH_STRIPE_LEN >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + { XXH128_hash_t h128; + h128.low64 = XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)state->totalLen * XXH_PRIME64_1); + h128.high64 = XXH3_mergeAccs(acc, + secret + state->secretLimit + XXH_STRIPE_LEN + - sizeof(acc) - XXH_SECRET_MERGEACCS_START, + ~((xxh_u64)state->totalLen * XXH_PRIME64_2)); + return h128; + } + } + /* len <= XXH3_MIDSIZE_MAX : short code */ + if (state->seed) + return XXH3_128bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); + return XXH3_128bits_withSecret(state->buffer, (size_t)(state->totalLen), + secret, state->secretLimit + XXH_STRIPE_LEN); +} + +/* 128-bit utility functions */ + +#include /* memcmp, memcpy */ + +/* return : 1 is equal, 0 if different */ +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2) +{ + /* note : XXH128_hash_t is compact, it has no padding byte */ + return !(memcmp(&h1, &h2, sizeof(h1))); +} + +/* This prototype is compatible with stdlib's qsort(). + * return : >0 if *h128_1 > *h128_2 + * <0 if *h128_1 < *h128_2 + * =0 if *h128_1 == *h128_2 */ +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2) +{ + XXH128_hash_t const h1 = *(const XXH128_hash_t*)h128_1; + XXH128_hash_t const h2 = *(const XXH128_hash_t*)h128_2; + int const hcmp = (h1.high64 > h2.high64) - (h2.high64 > h1.high64); + /* note : bets that, in most cases, hash values are different */ + if (hcmp) return hcmp; + return (h1.low64 > h2.low64) - (h2.low64 > h1.low64); +} + + +/*====== Canonical representation ======*/ +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API void +XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash) +{ + XXH_STATIC_ASSERT(sizeof(XXH128_canonical_t) == sizeof(XXH128_hash_t)); + if (XXH_CPU_LITTLE_ENDIAN) { + hash.high64 = XXH_swap64(hash.high64); + hash.low64 = XXH_swap64(hash.low64); + } + XXH_memcpy(dst, &hash.high64, sizeof(hash.high64)); + XXH_memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64)); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH128_hashFromCanonical(const XXH128_canonical_t* src) +{ + XXH128_hash_t h; + h.high64 = XXH_readBE64(src); + h.low64 = XXH_readBE64(src->digest + 8); + return h; +} + + + +/* ========================================== + * Secret generators + * ========================================== + */ +#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x)) + +XXH_FORCE_INLINE void XXH3_combine16(void* dst, XXH128_hash_t h128) +{ + XXH_writeLE64( dst, XXH_readLE64(dst) ^ h128.low64 ); + XXH_writeLE64( (char*)dst+8, XXH_readLE64((char*)dst+8) ^ h128.high64 ); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize) +{ +#if (XXH_DEBUGLEVEL >= 1) + XXH_ASSERT(secretBuffer != NULL); + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); +#else + /* production mode, assert() are disabled */ + if (secretBuffer == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; +#endif + + if (customSeedSize == 0) { + customSeed = XXH3_kSecret; + customSeedSize = XXH_SECRET_DEFAULT_SIZE; + } +#if (XXH_DEBUGLEVEL >= 1) + XXH_ASSERT(customSeed != NULL); +#else + if (customSeed == NULL) return XXH_ERROR; +#endif + + /* Fill secretBuffer with a copy of customSeed - repeat as needed */ + { size_t pos = 0; + while (pos < secretSize) { + size_t const toCopy = XXH_MIN((secretSize - pos), customSeedSize); + memcpy((char*)secretBuffer + pos, customSeed, toCopy); + pos += toCopy; + } } + + { size_t const nbSeg16 = secretSize / 16; + size_t n; + XXH128_canonical_t scrambler; + XXH128_canonicalFromHash(&scrambler, XXH128(customSeed, customSeedSize, 0)); + for (n=0; n + +/* weak symbol support + * For now, enable conservatively: + * - Only GNUC + * - Only ELF + * - Only x86-64, i386 and aarch64 + * Also, explicitly disable on platforms known not to work so they aren't + * forgotten in the future. + */ +#if !defined(ZSTD_HAVE_WEAK_SYMBOLS) && \ + defined(__GNUC__) && defined(__ELF__) && \ + (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) || defined(__aarch64__)) && \ + !defined(__APPLE__) && !defined(_WIN32) && !defined(__MINGW32__) && \ + !defined(__CYGWIN__) && !defined(_AIX) +# define ZSTD_HAVE_WEAK_SYMBOLS 1 +#else +# define ZSTD_HAVE_WEAK_SYMBOLS 0 +#endif +#if ZSTD_HAVE_WEAK_SYMBOLS +# define ZSTD_WEAK_ATTR __attribute__((__weak__)) +#else +# define ZSTD_WEAK_ATTR +#endif + +/* Only enable tracing when weak symbols are available. */ +#ifndef ZSTD_TRACE +# define ZSTD_TRACE ZSTD_HAVE_WEAK_SYMBOLS +#endif + +#if ZSTD_TRACE + +struct ZSTD_CCtx_s; +struct ZSTD_DCtx_s; +struct ZSTD_CCtx_params_s; + +typedef struct { + /** + * ZSTD_VERSION_NUMBER + * + * This is guaranteed to be the first member of ZSTD_trace. + * Otherwise, this struct is not stable between versions. If + * the version number does not match your expectation, you + * should not interpret the rest of the struct. + */ + unsigned version; + /** + * Non-zero if streaming (de)compression is used. + */ + unsigned streaming; + /** + * The dictionary ID. + */ + unsigned dictionaryID; + /** + * Is the dictionary cold? + * Only set on decompression. + */ + unsigned dictionaryIsCold; + /** + * The dictionary size or zero if no dictionary. + */ + size_t dictionarySize; + /** + * The uncompressed size of the data. + */ + size_t uncompressedSize; + /** + * The compressed size of the data. + */ + size_t compressedSize; + /** + * The fully resolved CCtx parameters (NULL on decompression). + */ + struct ZSTD_CCtx_params_s const* params; + /** + * The ZSTD_CCtx pointer (NULL on decompression). + */ + struct ZSTD_CCtx_s const* cctx; + /** + * The ZSTD_DCtx pointer (NULL on compression). + */ + struct ZSTD_DCtx_s const* dctx; +} ZSTD_Trace; + +/** + * A tracing context. It must be 0 when tracing is disabled. + * Otherwise, any non-zero value returned by a tracing begin() + * function is presented to any subsequent calls to end(). + * + * Any non-zero value is treated as tracing is enabled and not + * interpreted by the library. + * + * Two possible uses are: + * * A timestamp for when the begin() function was called. + * * A unique key identifying the (de)compression, like the + * address of the [dc]ctx pointer if you need to track + * more information than just a timestamp. + */ +typedef unsigned long long ZSTD_TraceCtx; + +/** + * Trace the beginning of a compression call. + * @param cctx The dctx pointer for the compression. + * It can be used as a key to map begin() to end(). + * @returns Non-zero if tracing is enabled. The return value is + * passed to ZSTD_trace_compress_end(). + */ +ZSTD_WEAK_ATTR ZSTD_TraceCtx ZSTD_trace_compress_begin( + struct ZSTD_CCtx_s const* cctx); + +/** + * Trace the end of a compression call. + * @param ctx The return value of ZSTD_trace_compress_begin(). + * @param trace The zstd tracing info. + */ +ZSTD_WEAK_ATTR void ZSTD_trace_compress_end( + ZSTD_TraceCtx ctx, + ZSTD_Trace const* trace); + +/** + * Trace the beginning of a decompression call. + * @param dctx The dctx pointer for the decompression. + * It can be used as a key to map begin() to end(). + * @returns Non-zero if tracing is enabled. The return value is + * passed to ZSTD_trace_compress_end(). + */ +ZSTD_WEAK_ATTR ZSTD_TraceCtx ZSTD_trace_decompress_begin( + struct ZSTD_DCtx_s const* dctx); + +/** + * Trace the end of a decompression call. + * @param ctx The return value of ZSTD_trace_decompress_begin(). + * @param trace The zstd tracing info. + */ +ZSTD_WEAK_ATTR void ZSTD_trace_decompress_end( + ZSTD_TraceCtx ctx, + ZSTD_Trace const* trace); + +#endif /* ZSTD_TRACE */ + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_TRACE_H */ +/**** ended inlining zstd_trace.h ****/ +#else +# define ZSTD_TRACE 0 +#endif + +#if defined (__cplusplus) +extern "C" { +#endif + +/* ---- static assert (debug) --- */ +#define ZSTD_STATIC_ASSERT(c) DEBUG_STATIC_ASSERT(c) +#define ZSTD_isError ERR_isError /* for inlining */ +#define FSE_isError ERR_isError +#define HUF_isError ERR_isError + + +/*-************************************* +* shared macros +***************************************/ +#undef MIN +#undef MAX +#define MIN(a,b) ((a)<(b) ? (a) : (b)) +#define MAX(a,b) ((a)>(b) ? (a) : (b)) +#define BOUNDED(min,val,max) (MAX(min,MIN(val,max))) + + +/*-************************************* +* Common constants +***************************************/ +#define ZSTD_OPT_NUM (1<<12) + +#define ZSTD_REP_NUM 3 /* number of repcodes */ +static UNUSED_ATTR const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 }; + +#define KB *(1 <<10) +#define MB *(1 <<20) +#define GB *(1U<<30) + +#define BIT7 128 +#define BIT6 64 +#define BIT5 32 +#define BIT4 16 +#define BIT1 2 +#define BIT0 1 + +#define ZSTD_WINDOWLOG_ABSOLUTEMIN 10 +static UNUSED_ATTR const size_t ZSTD_fcs_fieldSize[4] = { 0, 2, 4, 8 }; +static UNUSED_ATTR const size_t ZSTD_did_fieldSize[4] = { 0, 1, 2, 4 }; + +#define ZSTD_FRAMEIDSIZE 4 /* magic number size */ + +#define ZSTD_BLOCKHEADERSIZE 3 /* C standard doesn't allow `static const` variable to be init using another `static const` variable */ +static UNUSED_ATTR const size_t ZSTD_blockHeaderSize = ZSTD_BLOCKHEADERSIZE; +typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e; + +#define ZSTD_FRAMECHECKSUMSIZE 4 + +#define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */ +#define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */) /* for a non-null block */ +#define MIN_LITERALS_FOR_4_STREAMS 6 + +typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingType_e; + +#define LONGNBSEQ 0x7F00 + +#define MINMATCH 3 + +#define Litbits 8 +#define LitHufLog 11 +#define MaxLit ((1<= WILDCOPY_VECLEN || diff <= -WILDCOPY_VECLEN); + /* Separate out the first COPY16() call because the copy length is + * almost certain to be short, so the branches have different + * probabilities. Since it is almost certain to be short, only do + * one COPY16() in the first call. Then, do two calls per loop since + * at that point it is more likely to have a high trip count. + */ + ZSTD_copy16(op, ip); + if (16 >= length) return; + op += 16; + ip += 16; + do { + COPY16(op, ip); + COPY16(op, ip); + } + while (op < oend); + } +} + +MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize) +{ + size_t const length = MIN(dstCapacity, srcSize); + if (length > 0) { + ZSTD_memcpy(dst, src, length); + } + return length; +} + +/* define "workspace is too large" as this number of times larger than needed */ +#define ZSTD_WORKSPACETOOLARGE_FACTOR 3 + +/* when workspace is continuously too large + * during at least this number of times, + * context's memory usage is considered wasteful, + * because it's sized to handle a worst case scenario which rarely happens. + * In which case, resize it down to free some memory */ +#define ZSTD_WORKSPACETOOLARGE_MAXDURATION 128 + +/* Controls whether the input/output buffer is buffered or stable. */ +typedef enum { + ZSTD_bm_buffered = 0, /* Buffer the input/output */ + ZSTD_bm_stable = 1 /* ZSTD_inBuffer/ZSTD_outBuffer is stable */ +} ZSTD_bufferMode_e; + + +/*-******************************************* +* Private declarations +*********************************************/ +typedef struct seqDef_s { + U32 offBase; /* offBase == Offset + ZSTD_REP_NUM, or repcode 1,2,3 */ + U16 litLength; + U16 mlBase; /* mlBase == matchLength - MINMATCH */ +} seqDef; + +/* Controls whether seqStore has a single "long" litLength or matchLength. See seqStore_t. */ +typedef enum { + ZSTD_llt_none = 0, /* no longLengthType */ + ZSTD_llt_literalLength = 1, /* represents a long literal */ + ZSTD_llt_matchLength = 2 /* represents a long match */ +} ZSTD_longLengthType_e; + +typedef struct { + seqDef* sequencesStart; + seqDef* sequences; /* ptr to end of sequences */ + BYTE* litStart; + BYTE* lit; /* ptr to end of literals */ + BYTE* llCode; + BYTE* mlCode; + BYTE* ofCode; + size_t maxNbSeq; + size_t maxNbLit; + + /* longLengthPos and longLengthType to allow us to represent either a single litLength or matchLength + * in the seqStore that has a value larger than U16 (if it exists). To do so, we increment + * the existing value of the litLength or matchLength by 0x10000. + */ + ZSTD_longLengthType_e longLengthType; + U32 longLengthPos; /* Index of the sequence to apply long length modification to */ +} seqStore_t; + +typedef struct { + U32 litLength; + U32 matchLength; +} ZSTD_sequenceLength; + +/** + * Returns the ZSTD_sequenceLength for the given sequences. It handles the decoding of long sequences + * indicated by longLengthPos and longLengthType, and adds MINMATCH back to matchLength. + */ +MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore, seqDef const* seq) +{ + ZSTD_sequenceLength seqLen; + seqLen.litLength = seq->litLength; + seqLen.matchLength = seq->mlBase + MINMATCH; + if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) { + if (seqStore->longLengthType == ZSTD_llt_literalLength) { + seqLen.litLength += 0x10000; + } + if (seqStore->longLengthType == ZSTD_llt_matchLength) { + seqLen.matchLength += 0x10000; + } + } + return seqLen; +} + +/** + * Contains the compressed frame size and an upper-bound for the decompressed frame size. + * Note: before using `compressedSize`, check for errors using ZSTD_isError(). + * similarly, before using `decompressedBound`, check for errors using: + * `decompressedBound != ZSTD_CONTENTSIZE_ERROR` + */ +typedef struct { + size_t nbBlocks; + size_t compressedSize; + unsigned long long decompressedBound; +} ZSTD_frameSizeInfo; /* decompress & legacy */ + +const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx); /* compress & dictBuilder */ +int ZSTD_seqToCodes(const seqStore_t* seqStorePtr); /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */ + + +/* ZSTD_invalidateRepCodes() : + * ensures next compression will not use repcodes from previous block. + * Note : only works with regular variant; + * do not use with extDict variant ! */ +void ZSTD_invalidateRepCodes(ZSTD_CCtx* cctx); /* zstdmt, adaptive_compression (shouldn't get this definition from here) */ + + +typedef struct { + blockType_e blockType; + U32 lastBlock; + U32 origSize; +} blockProperties_t; /* declared here for decompress and fullbench */ + +/*! ZSTD_getcBlockSize() : + * Provides the size of compressed block from block header `src` */ +/* Used by: decompress, fullbench (does not get its definition from here) */ +size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, + blockProperties_t* bpPtr); + +/*! ZSTD_decodeSeqHeaders() : + * decode sequence header from src */ +/* Used by: decompress, fullbench (does not get its definition from here) */ +size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, + const void* src, size_t srcSize); + +/** + * @returns true iff the CPU supports dynamic BMI2 dispatch. + */ +MEM_STATIC int ZSTD_cpuSupportsBmi2(void) +{ + ZSTD_cpuid_t cpuid = ZSTD_cpuid(); + return ZSTD_cpuid_bmi1(cpuid) && ZSTD_cpuid_bmi2(cpuid); +} + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_CCOMMON_H_MODULE */ +/**** ended inlining zstd_internal.h ****/ + + +/*-**************************************** +* Version +******************************************/ +unsigned ZSTD_versionNumber(void) { return ZSTD_VERSION_NUMBER; } + +const char* ZSTD_versionString(void) { return ZSTD_VERSION_STRING; } + + +/*-**************************************** +* ZSTD Error Management +******************************************/ +#undef ZSTD_isError /* defined within zstd_internal.h */ +/*! ZSTD_isError() : + * tells if a return value is an error code + * symbol is required for external callers */ +unsigned ZSTD_isError(size_t code) { return ERR_isError(code); } + +/*! ZSTD_getErrorName() : + * provides error code string from function result (useful for debugging) */ +const char* ZSTD_getErrorName(size_t code) { return ERR_getErrorName(code); } + +/*! ZSTD_getError() : + * convert a `size_t` function result into a proper ZSTD_errorCode enum */ +ZSTD_ErrorCode ZSTD_getErrorCode(size_t code) { return ERR_getErrorCode(code); } + +/*! ZSTD_getErrorString() : + * provides error code string from enum */ +const char* ZSTD_getErrorString(ZSTD_ErrorCode code) { return ERR_getErrorString(code); } +/**** ended inlining common/zstd_common.c ****/ + +/**** start inlining compress/fse_compress.c ****/ +/* ****************************************************************** + * FSE : Finite State Entropy encoder + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy + * - Public forum : https://groups.google.com/forum/#!forum/lz4c + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +/* ************************************************************** +* Includes +****************************************************************/ +/**** skipping file: ../common/compiler.h ****/ +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: ../common/debug.h ****/ +/**** start inlining hist.h ****/ +/* ****************************************************************** + * hist : Histogram functions + * part of Finite State Entropy project + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy + * - Public forum : https://groups.google.com/forum/#!forum/lz4c + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +/* --- dependencies --- */ +/**** skipping file: ../common/zstd_deps.h ****/ + + +/* --- simple histogram functions --- */ + +/*! HIST_count(): + * Provides the precise count of each byte within a table 'count'. + * 'count' is a table of unsigned int, of minimum size (*maxSymbolValuePtr+1). + * Updates *maxSymbolValuePtr with actual largest symbol value detected. + * @return : count of the most frequent symbol (which isn't identified). + * or an error code, which can be tested using HIST_isError(). + * note : if return == srcSize, there is only one symbol. + */ +size_t HIST_count(unsigned* count, unsigned* maxSymbolValuePtr, + const void* src, size_t srcSize); + +unsigned HIST_isError(size_t code); /**< tells if a return value is an error code */ + + +/* --- advanced histogram functions --- */ + +#define HIST_WKSP_SIZE_U32 1024 +#define HIST_WKSP_SIZE (HIST_WKSP_SIZE_U32 * sizeof(unsigned)) +/** HIST_count_wksp() : + * Same as HIST_count(), but using an externally provided scratch buffer. + * Benefit is this function will use very little stack space. + * `workSpace` is a writable buffer which must be 4-bytes aligned, + * `workSpaceSize` must be >= HIST_WKSP_SIZE + */ +size_t HIST_count_wksp(unsigned* count, unsigned* maxSymbolValuePtr, + const void* src, size_t srcSize, + void* workSpace, size_t workSpaceSize); + +/** HIST_countFast() : + * same as HIST_count(), but blindly trusts that all byte values within src are <= *maxSymbolValuePtr. + * This function is unsafe, and will segfault if any value within `src` is `> *maxSymbolValuePtr` + */ +size_t HIST_countFast(unsigned* count, unsigned* maxSymbolValuePtr, + const void* src, size_t srcSize); + +/** HIST_countFast_wksp() : + * Same as HIST_countFast(), but using an externally provided scratch buffer. + * `workSpace` is a writable buffer which must be 4-bytes aligned, + * `workSpaceSize` must be >= HIST_WKSP_SIZE + */ +size_t HIST_countFast_wksp(unsigned* count, unsigned* maxSymbolValuePtr, + const void* src, size_t srcSize, + void* workSpace, size_t workSpaceSize); + +/*! HIST_count_simple() : + * Same as HIST_countFast(), this function is unsafe, + * and will segfault if any value within `src` is `> *maxSymbolValuePtr`. + * It is also a bit slower for large inputs. + * However, it does not need any additional memory (not even on stack). + * @return : count of the most frequent symbol. + * Note this function doesn't produce any error (i.e. it must succeed). + */ +unsigned HIST_count_simple(unsigned* count, unsigned* maxSymbolValuePtr, + const void* src, size_t srcSize); +/**** ended inlining hist.h ****/ +/**** skipping file: ../common/bitstream.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/error_private.h ****/ +#define ZSTD_DEPS_NEED_MALLOC +#define ZSTD_DEPS_NEED_MATH64 +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../common/bits.h ****/ + + +/* ************************************************************** +* Error Management +****************************************************************/ +#define FSE_isError ERR_isError + + +/* ************************************************************** +* Templates +****************************************************************/ +/* + designed to be included + for type-specific functions (template emulation in C) + Objective is to write these functions only once, for improved maintenance +*/ + +/* safety checks */ +#ifndef FSE_FUNCTION_EXTENSION +# error "FSE_FUNCTION_EXTENSION must be defined" +#endif +#ifndef FSE_FUNCTION_TYPE +# error "FSE_FUNCTION_TYPE must be defined" +#endif + +/* Function names */ +#define FSE_CAT(X,Y) X##Y +#define FSE_FUNCTION_NAME(X,Y) FSE_CAT(X,Y) +#define FSE_TYPE_NAME(X,Y) FSE_CAT(X,Y) + + +/* Function templates */ + +/* FSE_buildCTable_wksp() : + * Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`). + * wkspSize should be sized to handle worst case situation, which is `1<>1 : 1) ; + FSE_symbolCompressionTransform* const symbolTT = (FSE_symbolCompressionTransform*) (FSCT); + U32 const step = FSE_TABLESTEP(tableSize); + U32 const maxSV1 = maxSymbolValue+1; + + U16* cumul = (U16*)workSpace; /* size = maxSV1 */ + FSE_FUNCTION_TYPE* const tableSymbol = (FSE_FUNCTION_TYPE*)(cumul + (maxSV1+1)); /* size = tableSize */ + + U32 highThreshold = tableSize-1; + + assert(((size_t)workSpace & 1) == 0); /* Must be 2 bytes-aligned */ + if (FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) > wkspSize) return ERROR(tableLog_tooLarge); + /* CTable header */ + tableU16[-2] = (U16) tableLog; + tableU16[-1] = (U16) maxSymbolValue; + assert(tableLog < 16); /* required for threshold strategy to work */ + + /* For explanations on how to distribute symbol values over the table : + * https://fastcompression.blogspot.fr/2014/02/fse-distributing-symbol-values.html */ + + #ifdef __clang_analyzer__ + ZSTD_memset(tableSymbol, 0, sizeof(*tableSymbol) * tableSize); /* useless initialization, just to keep scan-build happy */ + #endif + + /* symbol start positions */ + { U32 u; + cumul[0] = 0; + for (u=1; u <= maxSV1; u++) { + if (normalizedCounter[u-1]==-1) { /* Low proba symbol */ + cumul[u] = cumul[u-1] + 1; + tableSymbol[highThreshold--] = (FSE_FUNCTION_TYPE)(u-1); + } else { + assert(normalizedCounter[u-1] >= 0); + cumul[u] = cumul[u-1] + (U16)normalizedCounter[u-1]; + assert(cumul[u] >= cumul[u-1]); /* no overflow */ + } } + cumul[maxSV1] = (U16)(tableSize+1); + } + + /* Spread symbols */ + if (highThreshold == tableSize - 1) { + /* Case for no low prob count symbols. Lay down 8 bytes at a time + * to reduce branch misses since we are operating on a small block + */ + BYTE* const spread = tableSymbol + tableSize; /* size = tableSize + 8 (may write beyond tableSize) */ + { U64 const add = 0x0101010101010101ull; + size_t pos = 0; + U64 sv = 0; + U32 s; + for (s=0; s=0); + pos += (size_t)n; + } + } + /* Spread symbols across the table. Lack of lowprob symbols means that + * we don't need variable sized inner loop, so we can unroll the loop and + * reduce branch misses. + */ + { size_t position = 0; + size_t s; + size_t const unroll = 2; /* Experimentally determined optimal unroll */ + assert(tableSize % unroll == 0); /* FSE_MIN_TABLELOG is 5 */ + for (s = 0; s < (size_t)tableSize; s += unroll) { + size_t u; + for (u = 0; u < unroll; ++u) { + size_t const uPosition = (position + (u * step)) & tableMask; + tableSymbol[uPosition] = spread[s + u]; + } + position = (position + (unroll * step)) & tableMask; + } + assert(position == 0); /* Must have initialized all positions */ + } + } else { + U32 position = 0; + U32 symbol; + for (symbol=0; symbol highThreshold) + position = (position + step) & tableMask; /* Low proba area */ + } } + assert(position==0); /* Must have initialized all positions */ + } + + /* Build table */ + { U32 u; for (u=0; u 1); + { U32 const maxBitsOut = tableLog - ZSTD_highbit32 ((U32)normalizedCounter[s]-1); + U32 const minStatePlus = (U32)normalizedCounter[s] << maxBitsOut; + symbolTT[s].deltaNbBits = (maxBitsOut << 16) - minStatePlus; + symbolTT[s].deltaFindState = (int)(total - (unsigned)normalizedCounter[s]); + total += (unsigned)normalizedCounter[s]; + } } } } + +#if 0 /* debug : symbol costs */ + DEBUGLOG(5, "\n --- table statistics : "); + { U32 symbol; + for (symbol=0; symbol<=maxSymbolValue; symbol++) { + DEBUGLOG(5, "%3u: w=%3i, maxBits=%u, fracBits=%.2f", + symbol, normalizedCounter[symbol], + FSE_getMaxNbBits(symbolTT, symbol), + (double)FSE_bitCost(symbolTT, tableLog, symbol, 8) / 256); + } } +#endif + + return 0; +} + + + +#ifndef FSE_COMMONDEFS_ONLY + +/*-************************************************************** +* FSE NCount encoding +****************************************************************/ +size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog) +{ + size_t const maxHeaderSize = (((maxSymbolValue+1) * tableLog + + 4 /* bitCount initialized at 4 */ + + 2 /* first two symbols may use one additional bit each */) / 8) + + 1 /* round up to whole nb bytes */ + + 2 /* additional two bytes for bitstream flush */; + return maxSymbolValue ? maxHeaderSize : FSE_NCOUNTBOUND; /* maxSymbolValue==0 ? use default */ +} + +static size_t +FSE_writeNCount_generic (void* header, size_t headerBufferSize, + const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, + unsigned writeIsSafe) +{ + BYTE* const ostart = (BYTE*) header; + BYTE* out = ostart; + BYTE* const oend = ostart + headerBufferSize; + int nbBits; + const int tableSize = 1 << tableLog; + int remaining; + int threshold; + U32 bitStream = 0; + int bitCount = 0; + unsigned symbol = 0; + unsigned const alphabetSize = maxSymbolValue + 1; + int previousIs0 = 0; + + /* Table Size */ + bitStream += (tableLog-FSE_MIN_TABLELOG) << bitCount; + bitCount += 4; + + /* Init */ + remaining = tableSize+1; /* +1 for extra accuracy */ + threshold = tableSize; + nbBits = tableLog+1; + + while ((symbol < alphabetSize) && (remaining>1)) { /* stops at 1 */ + if (previousIs0) { + unsigned start = symbol; + while ((symbol < alphabetSize) && !normalizedCounter[symbol]) symbol++; + if (symbol == alphabetSize) break; /* incorrect distribution */ + while (symbol >= start+24) { + start+=24; + bitStream += 0xFFFFU << bitCount; + if ((!writeIsSafe) && (out > oend-2)) + return ERROR(dstSize_tooSmall); /* Buffer overflow */ + out[0] = (BYTE) bitStream; + out[1] = (BYTE)(bitStream>>8); + out+=2; + bitStream>>=16; + } + while (symbol >= start+3) { + start+=3; + bitStream += 3 << bitCount; + bitCount += 2; + } + bitStream += (symbol-start) << bitCount; + bitCount += 2; + if (bitCount>16) { + if ((!writeIsSafe) && (out > oend - 2)) + return ERROR(dstSize_tooSmall); /* Buffer overflow */ + out[0] = (BYTE)bitStream; + out[1] = (BYTE)(bitStream>>8); + out += 2; + bitStream >>= 16; + bitCount -= 16; + } } + { int count = normalizedCounter[symbol++]; + int const max = (2*threshold-1) - remaining; + remaining -= count < 0 ? -count : count; + count++; /* +1 for extra accuracy */ + if (count>=threshold) + count += max; /* [0..max[ [max..threshold[ (...) [threshold+max 2*threshold[ */ + bitStream += count << bitCount; + bitCount += nbBits; + bitCount -= (count>=1; } + } + if (bitCount>16) { + if ((!writeIsSafe) && (out > oend - 2)) + return ERROR(dstSize_tooSmall); /* Buffer overflow */ + out[0] = (BYTE)bitStream; + out[1] = (BYTE)(bitStream>>8); + out += 2; + bitStream >>= 16; + bitCount -= 16; + } } + + if (remaining != 1) + return ERROR(GENERIC); /* incorrect normalized distribution */ + assert(symbol <= alphabetSize); + + /* flush remaining bitStream */ + if ((!writeIsSafe) && (out > oend - 2)) + return ERROR(dstSize_tooSmall); /* Buffer overflow */ + out[0] = (BYTE)bitStream; + out[1] = (BYTE)(bitStream>>8); + out+= (bitCount+7) /8; + + return (out-ostart); +} + + +size_t FSE_writeNCount (void* buffer, size_t bufferSize, + const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog) +{ + if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge); /* Unsupported */ + if (tableLog < FSE_MIN_TABLELOG) return ERROR(GENERIC); /* Unsupported */ + + if (bufferSize < FSE_NCountWriteBound(maxSymbolValue, tableLog)) + return FSE_writeNCount_generic(buffer, bufferSize, normalizedCounter, maxSymbolValue, tableLog, 0); + + return FSE_writeNCount_generic(buffer, bufferSize, normalizedCounter, maxSymbolValue, tableLog, 1 /* write in buffer is safe */); +} + + +/*-************************************************************** +* FSE Compression Code +****************************************************************/ + +/* provides the minimum logSize to safely represent a distribution */ +static unsigned FSE_minTableLog(size_t srcSize, unsigned maxSymbolValue) +{ + U32 minBitsSrc = ZSTD_highbit32((U32)(srcSize)) + 1; + U32 minBitsSymbols = ZSTD_highbit32(maxSymbolValue) + 2; + U32 minBits = minBitsSrc < minBitsSymbols ? minBitsSrc : minBitsSymbols; + assert(srcSize > 1); /* Not supported, RLE should be used instead */ + return minBits; +} + +unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus) +{ + U32 maxBitsSrc = ZSTD_highbit32((U32)(srcSize - 1)) - minus; + U32 tableLog = maxTableLog; + U32 minBits = FSE_minTableLog(srcSize, maxSymbolValue); + assert(srcSize > 1); /* Not supported, RLE should be used instead */ + if (tableLog==0) tableLog = FSE_DEFAULT_TABLELOG; + if (maxBitsSrc < tableLog) tableLog = maxBitsSrc; /* Accuracy can be reduced */ + if (minBits > tableLog) tableLog = minBits; /* Need a minimum to safely represent all symbol values */ + if (tableLog < FSE_MIN_TABLELOG) tableLog = FSE_MIN_TABLELOG; + if (tableLog > FSE_MAX_TABLELOG) tableLog = FSE_MAX_TABLELOG; + return tableLog; +} + +unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue) +{ + return FSE_optimalTableLog_internal(maxTableLog, srcSize, maxSymbolValue, 2); +} + +/* Secondary normalization method. + To be used when primary method fails. */ + +static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count, size_t total, U32 maxSymbolValue, short lowProbCount) +{ + short const NOT_YET_ASSIGNED = -2; + U32 s; + U32 distributed = 0; + U32 ToDistribute; + + /* Init */ + U32 const lowThreshold = (U32)(total >> tableLog); + U32 lowOne = (U32)((total * 3) >> (tableLog + 1)); + + for (s=0; s<=maxSymbolValue; s++) { + if (count[s] == 0) { + norm[s]=0; + continue; + } + if (count[s] <= lowThreshold) { + norm[s] = lowProbCount; + distributed++; + total -= count[s]; + continue; + } + if (count[s] <= lowOne) { + norm[s] = 1; + distributed++; + total -= count[s]; + continue; + } + + norm[s]=NOT_YET_ASSIGNED; + } + ToDistribute = (1 << tableLog) - distributed; + + if (ToDistribute == 0) + return 0; + + if ((total / ToDistribute) > lowOne) { + /* risk of rounding to zero */ + lowOne = (U32)((total * 3) / (ToDistribute * 2)); + for (s=0; s<=maxSymbolValue; s++) { + if ((norm[s] == NOT_YET_ASSIGNED) && (count[s] <= lowOne)) { + norm[s] = 1; + distributed++; + total -= count[s]; + continue; + } } + ToDistribute = (1 << tableLog) - distributed; + } + + if (distributed == maxSymbolValue+1) { + /* all values are pretty poor; + probably incompressible data (should have already been detected); + find max, then give all remaining points to max */ + U32 maxV = 0, maxC = 0; + for (s=0; s<=maxSymbolValue; s++) + if (count[s] > maxC) { maxV=s; maxC=count[s]; } + norm[maxV] += (short)ToDistribute; + return 0; + } + + if (total == 0) { + /* all of the symbols were low enough for the lowOne or lowThreshold */ + for (s=0; ToDistribute > 0; s = (s+1)%(maxSymbolValue+1)) + if (norm[s] > 0) { ToDistribute--; norm[s]++; } + return 0; + } + + { U64 const vStepLog = 62 - tableLog; + U64 const mid = (1ULL << (vStepLog-1)) - 1; + U64 const rStep = ZSTD_div64((((U64)1<> vStepLog); + U32 const sEnd = (U32)(end >> vStepLog); + U32 const weight = sEnd - sStart; + if (weight < 1) + return ERROR(GENERIC); + norm[s] = (short)weight; + tmpTotal = end; + } } } + + return 0; +} + +size_t FSE_normalizeCount (short* normalizedCounter, unsigned tableLog, + const unsigned* count, size_t total, + unsigned maxSymbolValue, unsigned useLowProbCount) +{ + /* Sanity checks */ + if (tableLog==0) tableLog = FSE_DEFAULT_TABLELOG; + if (tableLog < FSE_MIN_TABLELOG) return ERROR(GENERIC); /* Unsupported size */ + if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge); /* Unsupported size */ + if (tableLog < FSE_minTableLog(total, maxSymbolValue)) return ERROR(GENERIC); /* Too small tableLog, compression potentially impossible */ + + { static U32 const rtbTable[] = { 0, 473195, 504333, 520860, 550000, 700000, 750000, 830000 }; + short const lowProbCount = useLowProbCount ? -1 : 1; + U64 const scale = 62 - tableLog; + U64 const step = ZSTD_div64((U64)1<<62, (U32)total); /* <== here, one division ! */ + U64 const vStep = 1ULL<<(scale-20); + int stillToDistribute = 1<> tableLog); + + for (s=0; s<=maxSymbolValue; s++) { + if (count[s] == total) return 0; /* rle special case */ + if (count[s] == 0) { normalizedCounter[s]=0; continue; } + if (count[s] <= lowThreshold) { + normalizedCounter[s] = lowProbCount; + stillToDistribute--; + } else { + short proba = (short)((count[s]*step) >> scale); + if (proba<8) { + U64 restToBeat = vStep * rtbTable[proba]; + proba += (count[s]*step) - ((U64)proba< restToBeat; + } + if (proba > largestP) { largestP=proba; largest=s; } + normalizedCounter[s] = proba; + stillToDistribute -= proba; + } } + if (-stillToDistribute >= (normalizedCounter[largest] >> 1)) { + /* corner case, need another normalization method */ + size_t const errorCode = FSE_normalizeM2(normalizedCounter, tableLog, count, total, maxSymbolValue, lowProbCount); + if (FSE_isError(errorCode)) return errorCode; + } + else normalizedCounter[largest] += (short)stillToDistribute; + } + +#if 0 + { /* Print Table (debug) */ + U32 s; + U32 nTotal = 0; + for (s=0; s<=maxSymbolValue; s++) + RAWLOG(2, "%3i: %4i \n", s, normalizedCounter[s]); + for (s=0; s<=maxSymbolValue; s++) + nTotal += abs(normalizedCounter[s]); + if (nTotal != (1U< FSE_MAX_TABLELOG*4+7 ) && (srcSize & 2)) { /* test bit 2 */ + FSE_encodeSymbol(&bitC, &CState2, *--ip); + FSE_encodeSymbol(&bitC, &CState1, *--ip); + FSE_FLUSHBITS(&bitC); + } + + /* 2 or 4 encoding per loop */ + while ( ip>istart ) { + + FSE_encodeSymbol(&bitC, &CState2, *--ip); + + if (sizeof(bitC.bitContainer)*8 < FSE_MAX_TABLELOG*2+7 ) /* this test must be static */ + FSE_FLUSHBITS(&bitC); + + FSE_encodeSymbol(&bitC, &CState1, *--ip); + + if (sizeof(bitC.bitContainer)*8 > FSE_MAX_TABLELOG*4+7 ) { /* this test must be static */ + FSE_encodeSymbol(&bitC, &CState2, *--ip); + FSE_encodeSymbol(&bitC, &CState1, *--ip); + } + + FSE_FLUSHBITS(&bitC); + } + + FSE_flushCState(&bitC, &CState2); + FSE_flushCState(&bitC, &CState1); + return BIT_closeCStream(&bitC); +} + +size_t FSE_compress_usingCTable (void* dst, size_t dstSize, + const void* src, size_t srcSize, + const FSE_CTable* ct) +{ + unsigned const fast = (dstSize >= FSE_BLOCKBOUND(srcSize)); + + if (fast) + return FSE_compress_usingCTable_generic(dst, dstSize, src, srcSize, ct, 1); + else + return FSE_compress_usingCTable_generic(dst, dstSize, src, srcSize, ct, 0); +} + + +size_t FSE_compressBound(size_t size) { return FSE_COMPRESSBOUND(size); } + +#endif /* FSE_COMMONDEFS_ONLY */ +/**** ended inlining compress/fse_compress.c ****/ +/**** start inlining compress/hist.c ****/ +/* ****************************************************************** + * hist : Histogram functions + * part of Finite State Entropy project + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy + * - Public forum : https://groups.google.com/forum/#!forum/lz4c + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +/* --- dependencies --- */ +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: ../common/debug.h ****/ +/**** skipping file: ../common/error_private.h ****/ +/**** skipping file: hist.h ****/ + + +/* --- Error management --- */ +unsigned HIST_isError(size_t code) { return ERR_isError(code); } + +/*-************************************************************** + * Histogram functions + ****************************************************************/ +unsigned HIST_count_simple(unsigned* count, unsigned* maxSymbolValuePtr, + const void* src, size_t srcSize) +{ + const BYTE* ip = (const BYTE*)src; + const BYTE* const end = ip + srcSize; + unsigned maxSymbolValue = *maxSymbolValuePtr; + unsigned largestCount=0; + + ZSTD_memset(count, 0, (maxSymbolValue+1) * sizeof(*count)); + if (srcSize==0) { *maxSymbolValuePtr = 0; return 0; } + + while (ip largestCount) largestCount = count[s]; + } + + return largestCount; +} + +typedef enum { trustInput, checkMaxSymbolValue } HIST_checkInput_e; + +/* HIST_count_parallel_wksp() : + * store histogram into 4 intermediate tables, recombined at the end. + * this design makes better use of OoO cpus, + * and is noticeably faster when some values are heavily repeated. + * But it needs some additional workspace for intermediate tables. + * `workSpace` must be a U32 table of size >= HIST_WKSP_SIZE_U32. + * @return : largest histogram frequency, + * or an error code (notably when histogram's alphabet is larger than *maxSymbolValuePtr) */ +static size_t HIST_count_parallel_wksp( + unsigned* count, unsigned* maxSymbolValuePtr, + const void* source, size_t sourceSize, + HIST_checkInput_e check, + U32* const workSpace) +{ + const BYTE* ip = (const BYTE*)source; + const BYTE* const iend = ip+sourceSize; + size_t const countSize = (*maxSymbolValuePtr + 1) * sizeof(*count); + unsigned max=0; + U32* const Counting1 = workSpace; + U32* const Counting2 = Counting1 + 256; + U32* const Counting3 = Counting2 + 256; + U32* const Counting4 = Counting3 + 256; + + /* safety checks */ + assert(*maxSymbolValuePtr <= 255); + if (!sourceSize) { + ZSTD_memset(count, 0, countSize); + *maxSymbolValuePtr = 0; + return 0; + } + ZSTD_memset(workSpace, 0, 4*256*sizeof(unsigned)); + + /* by stripes of 16 bytes */ + { U32 cached = MEM_read32(ip); ip += 4; + while (ip < iend-15) { + U32 c = cached; cached = MEM_read32(ip); ip += 4; + Counting1[(BYTE) c ]++; + Counting2[(BYTE)(c>>8) ]++; + Counting3[(BYTE)(c>>16)]++; + Counting4[ c>>24 ]++; + c = cached; cached = MEM_read32(ip); ip += 4; + Counting1[(BYTE) c ]++; + Counting2[(BYTE)(c>>8) ]++; + Counting3[(BYTE)(c>>16)]++; + Counting4[ c>>24 ]++; + c = cached; cached = MEM_read32(ip); ip += 4; + Counting1[(BYTE) c ]++; + Counting2[(BYTE)(c>>8) ]++; + Counting3[(BYTE)(c>>16)]++; + Counting4[ c>>24 ]++; + c = cached; cached = MEM_read32(ip); ip += 4; + Counting1[(BYTE) c ]++; + Counting2[(BYTE)(c>>8) ]++; + Counting3[(BYTE)(c>>16)]++; + Counting4[ c>>24 ]++; + } + ip-=4; + } + + /* finish last symbols */ + while (ip max) max = Counting1[s]; + } } + + { unsigned maxSymbolValue = 255; + while (!Counting1[maxSymbolValue]) maxSymbolValue--; + if (check && maxSymbolValue > *maxSymbolValuePtr) return ERROR(maxSymbolValue_tooSmall); + *maxSymbolValuePtr = maxSymbolValue; + ZSTD_memmove(count, Counting1, countSize); /* in case count & Counting1 are overlapping */ + } + return (size_t)max; +} + +/* HIST_countFast_wksp() : + * Same as HIST_countFast(), but using an externally provided scratch buffer. + * `workSpace` is a writable buffer which must be 4-bytes aligned, + * `workSpaceSize` must be >= HIST_WKSP_SIZE + */ +size_t HIST_countFast_wksp(unsigned* count, unsigned* maxSymbolValuePtr, + const void* source, size_t sourceSize, + void* workSpace, size_t workSpaceSize) +{ + if (sourceSize < 1500) /* heuristic threshold */ + return HIST_count_simple(count, maxSymbolValuePtr, source, sourceSize); + if ((size_t)workSpace & 3) return ERROR(GENERIC); /* must be aligned on 4-bytes boundaries */ + if (workSpaceSize < HIST_WKSP_SIZE) return ERROR(workSpace_tooSmall); + return HIST_count_parallel_wksp(count, maxSymbolValuePtr, source, sourceSize, trustInput, (U32*)workSpace); +} + +/* HIST_count_wksp() : + * Same as HIST_count(), but using an externally provided scratch buffer. + * `workSpace` size must be table of >= HIST_WKSP_SIZE_U32 unsigned */ +size_t HIST_count_wksp(unsigned* count, unsigned* maxSymbolValuePtr, + const void* source, size_t sourceSize, + void* workSpace, size_t workSpaceSize) +{ + if ((size_t)workSpace & 3) return ERROR(GENERIC); /* must be aligned on 4-bytes boundaries */ + if (workSpaceSize < HIST_WKSP_SIZE) return ERROR(workSpace_tooSmall); + if (*maxSymbolValuePtr < 255) + return HIST_count_parallel_wksp(count, maxSymbolValuePtr, source, sourceSize, checkMaxSymbolValue, (U32*)workSpace); + *maxSymbolValuePtr = 255; + return HIST_countFast_wksp(count, maxSymbolValuePtr, source, sourceSize, workSpace, workSpaceSize); +} + +#ifndef ZSTD_NO_UNUSED_FUNCTIONS +/* fast variant (unsafe : won't check if src contains values beyond count[] limit) */ +size_t HIST_countFast(unsigned* count, unsigned* maxSymbolValuePtr, + const void* source, size_t sourceSize) +{ + unsigned tmpCounters[HIST_WKSP_SIZE_U32]; + return HIST_countFast_wksp(count, maxSymbolValuePtr, source, sourceSize, tmpCounters, sizeof(tmpCounters)); +} + +size_t HIST_count(unsigned* count, unsigned* maxSymbolValuePtr, + const void* src, size_t srcSize) +{ + unsigned tmpCounters[HIST_WKSP_SIZE_U32]; + return HIST_count_wksp(count, maxSymbolValuePtr, src, srcSize, tmpCounters, sizeof(tmpCounters)); +} +#endif +/**** ended inlining compress/hist.c ****/ +/**** start inlining compress/huf_compress.c ****/ +/* ****************************************************************** + * Huffman encoder, part of New Generation Entropy library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy + * - Public forum : https://groups.google.com/forum/#!forum/lz4c + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +/* ************************************************************** +* Compiler specifics +****************************************************************/ +#ifdef _MSC_VER /* Visual Studio */ +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +#endif + + +/* ************************************************************** +* Includes +****************************************************************/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../common/compiler.h ****/ +/**** skipping file: ../common/bitstream.h ****/ +/**** skipping file: hist.h ****/ +#define FSE_STATIC_LINKING_ONLY /* FSE_optimalTableLog_internal */ +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/huf.h ****/ +/**** skipping file: ../common/error_private.h ****/ +/**** skipping file: ../common/bits.h ****/ + + +/* ************************************************************** +* Error Management +****************************************************************/ +#define HUF_isError ERR_isError +#define HUF_STATIC_ASSERT(c) DEBUG_STATIC_ASSERT(c) /* use only *after* variable declarations */ + + +/* ************************************************************** +* Required declarations +****************************************************************/ +typedef struct nodeElt_s { + U32 count; + U16 parent; + BYTE byte; + BYTE nbBits; +} nodeElt; + + +/* ************************************************************** +* Debug Traces +****************************************************************/ + +#if DEBUGLEVEL >= 2 + +static size_t showU32(const U32* arr, size_t size) +{ + size_t u; + for (u=0; u= add) { + assert(add < align); + assert(((size_t)aligned & mask) == 0); + *workspaceSizePtr -= add; + return aligned; + } else { + *workspaceSizePtr = 0; + return NULL; + } +} + + +/* HUF_compressWeights() : + * Same as FSE_compress(), but dedicated to huff0's weights compression. + * The use case needs much less stack memory. + * Note : all elements within weightTable are supposed to be <= HUF_TABLELOG_MAX. + */ +#define MAX_FSE_TABLELOG_FOR_HUFF_HEADER 6 + +typedef struct { + FSE_CTable CTable[FSE_CTABLE_SIZE_U32(MAX_FSE_TABLELOG_FOR_HUFF_HEADER, HUF_TABLELOG_MAX)]; + U32 scratchBuffer[FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(HUF_TABLELOG_MAX, MAX_FSE_TABLELOG_FOR_HUFF_HEADER)]; + unsigned count[HUF_TABLELOG_MAX+1]; + S16 norm[HUF_TABLELOG_MAX+1]; +} HUF_CompressWeightsWksp; + +static size_t +HUF_compressWeights(void* dst, size_t dstSize, + const void* weightTable, size_t wtSize, + void* workspace, size_t workspaceSize) +{ + BYTE* const ostart = (BYTE*) dst; + BYTE* op = ostart; + BYTE* const oend = ostart + dstSize; + + unsigned maxSymbolValue = HUF_TABLELOG_MAX; + U32 tableLog = MAX_FSE_TABLELOG_FOR_HUFF_HEADER; + HUF_CompressWeightsWksp* wksp = (HUF_CompressWeightsWksp*)HUF_alignUpWorkspace(workspace, &workspaceSize, ZSTD_ALIGNOF(U32)); + + if (workspaceSize < sizeof(HUF_CompressWeightsWksp)) return ERROR(GENERIC); + + /* init conditions */ + if (wtSize <= 1) return 0; /* Not compressible */ + + /* Scan input and build symbol stats */ + { unsigned const maxCount = HIST_count_simple(wksp->count, &maxSymbolValue, weightTable, wtSize); /* never fails */ + if (maxCount == wtSize) return 1; /* only a single symbol in src : rle */ + if (maxCount == 1) return 0; /* each symbol present maximum once => not compressible */ + } + + tableLog = FSE_optimalTableLog(tableLog, wtSize, maxSymbolValue); + CHECK_F( FSE_normalizeCount(wksp->norm, tableLog, wksp->count, wtSize, maxSymbolValue, /* useLowProbCount */ 0) ); + + /* Write table description header */ + { CHECK_V_F(hSize, FSE_writeNCount(op, (size_t)(oend-op), wksp->norm, maxSymbolValue, tableLog) ); + op += hSize; + } + + /* Compress */ + CHECK_F( FSE_buildCTable_wksp(wksp->CTable, wksp->norm, maxSymbolValue, tableLog, wksp->scratchBuffer, sizeof(wksp->scratchBuffer)) ); + { CHECK_V_F(cSize, FSE_compress_usingCTable(op, (size_t)(oend - op), weightTable, wtSize, wksp->CTable) ); + if (cSize == 0) return 0; /* not enough space for compressed data */ + op += cSize; + } + + return (size_t)(op-ostart); +} + +static size_t HUF_getNbBits(HUF_CElt elt) +{ + return elt & 0xFF; +} + +static size_t HUF_getNbBitsFast(HUF_CElt elt) +{ + return elt; +} + +static size_t HUF_getValue(HUF_CElt elt) +{ + return elt & ~(size_t)0xFF; +} + +static size_t HUF_getValueFast(HUF_CElt elt) +{ + return elt; +} + +static void HUF_setNbBits(HUF_CElt* elt, size_t nbBits) +{ + assert(nbBits <= HUF_TABLELOG_ABSOLUTEMAX); + *elt = nbBits; +} + +static void HUF_setValue(HUF_CElt* elt, size_t value) +{ + size_t const nbBits = HUF_getNbBits(*elt); + if (nbBits > 0) { + assert((value >> nbBits) == 0); + *elt |= value << (sizeof(HUF_CElt) * 8 - nbBits); + } +} + +typedef struct { + HUF_CompressWeightsWksp wksp; + BYTE bitsToWeight[HUF_TABLELOG_MAX + 1]; /* precomputed conversion table */ + BYTE huffWeight[HUF_SYMBOLVALUE_MAX]; +} HUF_WriteCTableWksp; + +size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, + const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog, + void* workspace, size_t workspaceSize) +{ + HUF_CElt const* const ct = CTable + 1; + BYTE* op = (BYTE*)dst; + U32 n; + HUF_WriteCTableWksp* wksp = (HUF_WriteCTableWksp*)HUF_alignUpWorkspace(workspace, &workspaceSize, ZSTD_ALIGNOF(U32)); + + HUF_STATIC_ASSERT(HUF_CTABLE_WORKSPACE_SIZE >= sizeof(HUF_WriteCTableWksp)); + + /* check conditions */ + if (workspaceSize < sizeof(HUF_WriteCTableWksp)) return ERROR(GENERIC); + if (maxSymbolValue > HUF_SYMBOLVALUE_MAX) return ERROR(maxSymbolValue_tooLarge); + + /* convert to weight */ + wksp->bitsToWeight[0] = 0; + for (n=1; nbitsToWeight[n] = (BYTE)(huffLog + 1 - n); + for (n=0; nhuffWeight[n] = wksp->bitsToWeight[HUF_getNbBits(ct[n])]; + + /* attempt weights compression by FSE */ + if (maxDstSize < 1) return ERROR(dstSize_tooSmall); + { CHECK_V_F(hSize, HUF_compressWeights(op+1, maxDstSize-1, wksp->huffWeight, maxSymbolValue, &wksp->wksp, sizeof(wksp->wksp)) ); + if ((hSize>1) & (hSize < maxSymbolValue/2)) { /* FSE compressed */ + op[0] = (BYTE)hSize; + return hSize+1; + } } + + /* write raw values as 4-bits (max : 15) */ + if (maxSymbolValue > (256-128)) return ERROR(GENERIC); /* should not happen : likely means source cannot be compressed */ + if (((maxSymbolValue+1)/2) + 1 > maxDstSize) return ERROR(dstSize_tooSmall); /* not enough space within dst buffer */ + op[0] = (BYTE)(128 /*special case*/ + (maxSymbolValue-1)); + wksp->huffWeight[maxSymbolValue] = 0; /* to be sure it doesn't cause msan issue in final combination */ + for (n=0; nhuffWeight[n] << 4) + wksp->huffWeight[n+1]); + return ((maxSymbolValue+1)/2) + 1; +} + + +size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize, unsigned* hasZeroWeights) +{ + BYTE huffWeight[HUF_SYMBOLVALUE_MAX + 1]; /* init not required, even though some static analyzer may complain */ + U32 rankVal[HUF_TABLELOG_ABSOLUTEMAX + 1]; /* large enough for values from 0 to 16 */ + U32 tableLog = 0; + U32 nbSymbols = 0; + HUF_CElt* const ct = CTable + 1; + + /* get symbol weights */ + CHECK_V_F(readSize, HUF_readStats(huffWeight, HUF_SYMBOLVALUE_MAX+1, rankVal, &nbSymbols, &tableLog, src, srcSize)); + *hasZeroWeights = (rankVal[0] > 0); + + /* check result */ + if (tableLog > HUF_TABLELOG_MAX) return ERROR(tableLog_tooLarge); + if (nbSymbols > *maxSymbolValuePtr+1) return ERROR(maxSymbolValue_tooSmall); + + CTable[0] = tableLog; + + /* Prepare base value per rank */ + { U32 n, nextRankStart = 0; + for (n=1; n<=tableLog; n++) { + U32 curr = nextRankStart; + nextRankStart += (rankVal[n] << (n-1)); + rankVal[n] = curr; + } } + + /* fill nbBits */ + { U32 n; for (n=0; nn=tableLog+1 */ + U16 valPerRank[HUF_TABLELOG_MAX+2] = {0}; + { U32 n; for (n=0; n0; n--) { /* start at n=tablelog <-> w=1 */ + valPerRank[n] = min; /* get starting value within each rank */ + min += nbPerRank[n]; + min >>= 1; + } } + /* assign value within rank, symbol order */ + { U32 n; for (n=0; n @targetNbBits + * to employ @targetNbBits instead. Then it adjusts the tree + * so that it remains a valid canonical Huffman tree. + * + * @pre The sum of the ranks of each symbol == 2^largestBits, + * where largestBits == huffNode[lastNonNull].nbBits. + * @post The sum of the ranks of each symbol == 2^largestBits, + * where largestBits is the return value (expected <= targetNbBits). + * + * @param huffNode The Huffman tree modified in place to enforce targetNbBits. + * It's presumed sorted, from most frequent to rarest symbol. + * @param lastNonNull The symbol with the lowest count in the Huffman tree. + * @param targetNbBits The allowed number of bits, which the Huffman tree + * may not respect. After this function the Huffman tree will + * respect targetNbBits. + * @return The maximum number of bits of the Huffman tree after adjustment. + */ +static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 targetNbBits) +{ + const U32 largestBits = huffNode[lastNonNull].nbBits; + /* early exit : no elt > targetNbBits, so the tree is already valid. */ + if (largestBits <= targetNbBits) return largestBits; + + DEBUGLOG(5, "HUF_setMaxHeight (targetNbBits = %u)", targetNbBits); + + /* there are several too large elements (at least >= 2) */ + { int totalCost = 0; + const U32 baseCost = 1 << (largestBits - targetNbBits); + int n = (int)lastNonNull; + + /* Adjust any ranks > targetNbBits to targetNbBits. + * Compute totalCost, which is how far the sum of the ranks is + * we are over 2^largestBits after adjust the offending ranks. + */ + while (huffNode[n].nbBits > targetNbBits) { + totalCost += baseCost - (1 << (largestBits - huffNode[n].nbBits)); + huffNode[n].nbBits = (BYTE)targetNbBits; + n--; + } + /* n stops at huffNode[n].nbBits <= targetNbBits */ + assert(huffNode[n].nbBits <= targetNbBits); + /* n end at index of smallest symbol using < targetNbBits */ + while (huffNode[n].nbBits == targetNbBits) --n; + + /* renorm totalCost from 2^largestBits to 2^targetNbBits + * note : totalCost is necessarily a multiple of baseCost */ + assert(((U32)totalCost & (baseCost - 1)) == 0); + totalCost >>= (largestBits - targetNbBits); + assert(totalCost > 0); + + /* repay normalized cost */ + { U32 const noSymbol = 0xF0F0F0F0; + U32 rankLast[HUF_TABLELOG_MAX+2]; + + /* Get pos of last (smallest = lowest cum. count) symbol per rank */ + ZSTD_memset(rankLast, 0xF0, sizeof(rankLast)); + { U32 currentNbBits = targetNbBits; + int pos; + for (pos=n ; pos >= 0; pos--) { + if (huffNode[pos].nbBits >= currentNbBits) continue; + currentNbBits = huffNode[pos].nbBits; /* < targetNbBits */ + rankLast[targetNbBits-currentNbBits] = (U32)pos; + } } + + while (totalCost > 0) { + /* Try to reduce the next power of 2 above totalCost because we + * gain back half the rank. + */ + U32 nBitsToDecrease = ZSTD_highbit32((U32)totalCost) + 1; + for ( ; nBitsToDecrease > 1; nBitsToDecrease--) { + U32 const highPos = rankLast[nBitsToDecrease]; + U32 const lowPos = rankLast[nBitsToDecrease-1]; + if (highPos == noSymbol) continue; + /* Decrease highPos if no symbols of lowPos or if it is + * not cheaper to remove 2 lowPos than highPos. + */ + if (lowPos == noSymbol) break; + { U32 const highTotal = huffNode[highPos].count; + U32 const lowTotal = 2 * huffNode[lowPos].count; + if (highTotal <= lowTotal) break; + } } + /* only triggered when no more rank 1 symbol left => find closest one (note : there is necessarily at least one !) */ + assert(rankLast[nBitsToDecrease] != noSymbol || nBitsToDecrease == 1); + /* HUF_MAX_TABLELOG test just to please gcc 5+; but it should not be necessary */ + while ((nBitsToDecrease<=HUF_TABLELOG_MAX) && (rankLast[nBitsToDecrease] == noSymbol)) + nBitsToDecrease++; + assert(rankLast[nBitsToDecrease] != noSymbol); + /* Increase the number of bits to gain back half the rank cost. */ + totalCost -= 1 << (nBitsToDecrease-1); + huffNode[rankLast[nBitsToDecrease]].nbBits++; + + /* Fix up the new rank. + * If the new rank was empty, this symbol is now its smallest. + * Otherwise, this symbol will be the largest in the new rank so no adjustment. + */ + if (rankLast[nBitsToDecrease-1] == noSymbol) + rankLast[nBitsToDecrease-1] = rankLast[nBitsToDecrease]; + /* Fix up the old rank. + * If the symbol was at position 0, meaning it was the highest weight symbol in the tree, + * it must be the only symbol in its rank, so the old rank now has no symbols. + * Otherwise, since the Huffman nodes are sorted by count, the previous position is now + * the smallest node in the rank. If the previous position belongs to a different rank, + * then the rank is now empty. + */ + if (rankLast[nBitsToDecrease] == 0) /* special case, reached largest symbol */ + rankLast[nBitsToDecrease] = noSymbol; + else { + rankLast[nBitsToDecrease]--; + if (huffNode[rankLast[nBitsToDecrease]].nbBits != targetNbBits-nBitsToDecrease) + rankLast[nBitsToDecrease] = noSymbol; /* this rank is now empty */ + } + } /* while (totalCost > 0) */ + + /* If we've removed too much weight, then we have to add it back. + * To avoid overshooting again, we only adjust the smallest rank. + * We take the largest nodes from the lowest rank 0 and move them + * to rank 1. There's guaranteed to be enough rank 0 symbols because + * TODO. + */ + while (totalCost < 0) { /* Sometimes, cost correction overshoot */ + /* special case : no rank 1 symbol (using targetNbBits-1); + * let's create one from largest rank 0 (using targetNbBits). + */ + if (rankLast[1] == noSymbol) { + while (huffNode[n].nbBits == targetNbBits) n--; + huffNode[n+1].nbBits--; + assert(n >= 0); + rankLast[1] = (U32)(n+1); + totalCost++; + continue; + } + huffNode[ rankLast[1] + 1 ].nbBits--; + rankLast[1]++; + totalCost ++; + } + } /* repay normalized cost */ + } /* there are several too large elements (at least >= 2) */ + + return targetNbBits; +} + +typedef struct { + U16 base; + U16 curr; +} rankPos; + +typedef nodeElt huffNodeTable[2 * (HUF_SYMBOLVALUE_MAX + 1)]; + +/* Number of buckets available for HUF_sort() */ +#define RANK_POSITION_TABLE_SIZE 192 + +typedef struct { + huffNodeTable huffNodeTbl; + rankPos rankPosition[RANK_POSITION_TABLE_SIZE]; +} HUF_buildCTable_wksp_tables; + +/* RANK_POSITION_DISTINCT_COUNT_CUTOFF == Cutoff point in HUF_sort() buckets for which we use log2 bucketing. + * Strategy is to use as many buckets as possible for representing distinct + * counts while using the remainder to represent all "large" counts. + * + * To satisfy this requirement for 192 buckets, we can do the following: + * Let buckets 0-166 represent distinct counts of [0, 166] + * Let buckets 166 to 192 represent all remaining counts up to RANK_POSITION_MAX_COUNT_LOG using log2 bucketing. + */ +#define RANK_POSITION_MAX_COUNT_LOG 32 +#define RANK_POSITION_LOG_BUCKETS_BEGIN ((RANK_POSITION_TABLE_SIZE - 1) - RANK_POSITION_MAX_COUNT_LOG - 1 /* == 158 */) +#define RANK_POSITION_DISTINCT_COUNT_CUTOFF (RANK_POSITION_LOG_BUCKETS_BEGIN + ZSTD_highbit32(RANK_POSITION_LOG_BUCKETS_BEGIN) /* == 166 */) + +/* Return the appropriate bucket index for a given count. See definition of + * RANK_POSITION_DISTINCT_COUNT_CUTOFF for explanation of bucketing strategy. + */ +static U32 HUF_getIndex(U32 const count) { + return (count < RANK_POSITION_DISTINCT_COUNT_CUTOFF) + ? count + : ZSTD_highbit32(count) + RANK_POSITION_LOG_BUCKETS_BEGIN; +} + +/* Helper swap function for HUF_quickSortPartition() */ +static void HUF_swapNodes(nodeElt* a, nodeElt* b) { + nodeElt tmp = *a; + *a = *b; + *b = tmp; +} + +/* Returns 0 if the huffNode array is not sorted by descending count */ +MEM_STATIC int HUF_isSorted(nodeElt huffNode[], U32 const maxSymbolValue1) { + U32 i; + for (i = 1; i < maxSymbolValue1; ++i) { + if (huffNode[i].count > huffNode[i-1].count) { + return 0; + } + } + return 1; +} + +/* Insertion sort by descending order */ +HINT_INLINE void HUF_insertionSort(nodeElt huffNode[], int const low, int const high) { + int i; + int const size = high-low+1; + huffNode += low; + for (i = 1; i < size; ++i) { + nodeElt const key = huffNode[i]; + int j = i - 1; + while (j >= 0 && huffNode[j].count < key.count) { + huffNode[j + 1] = huffNode[j]; + j--; + } + huffNode[j + 1] = key; + } +} + +/* Pivot helper function for quicksort. */ +static int HUF_quickSortPartition(nodeElt arr[], int const low, int const high) { + /* Simply select rightmost element as pivot. "Better" selectors like + * median-of-three don't experimentally appear to have any benefit. + */ + U32 const pivot = arr[high].count; + int i = low - 1; + int j = low; + for ( ; j < high; j++) { + if (arr[j].count > pivot) { + i++; + HUF_swapNodes(&arr[i], &arr[j]); + } + } + HUF_swapNodes(&arr[i + 1], &arr[high]); + return i + 1; +} + +/* Classic quicksort by descending with partially iterative calls + * to reduce worst case callstack size. + */ +static void HUF_simpleQuickSort(nodeElt arr[], int low, int high) { + int const kInsertionSortThreshold = 8; + if (high - low < kInsertionSortThreshold) { + HUF_insertionSort(arr, low, high); + return; + } + while (low < high) { + int const idx = HUF_quickSortPartition(arr, low, high); + if (idx - low < high - idx) { + HUF_simpleQuickSort(arr, low, idx - 1); + low = idx + 1; + } else { + HUF_simpleQuickSort(arr, idx + 1, high); + high = idx - 1; + } + } +} + +/** + * HUF_sort(): + * Sorts the symbols [0, maxSymbolValue] by count[symbol] in decreasing order. + * This is a typical bucket sorting strategy that uses either quicksort or insertion sort to sort each bucket. + * + * @param[out] huffNode Sorted symbols by decreasing count. Only members `.count` and `.byte` are filled. + * Must have (maxSymbolValue + 1) entries. + * @param[in] count Histogram of the symbols. + * @param[in] maxSymbolValue Maximum symbol value. + * @param rankPosition This is a scratch workspace. Must have RANK_POSITION_TABLE_SIZE entries. + */ +static void HUF_sort(nodeElt huffNode[], const unsigned count[], U32 const maxSymbolValue, rankPos rankPosition[]) { + U32 n; + U32 const maxSymbolValue1 = maxSymbolValue+1; + + /* Compute base and set curr to base. + * For symbol s let lowerRank = HUF_getIndex(count[n]) and rank = lowerRank + 1. + * See HUF_getIndex to see bucketing strategy. + * We attribute each symbol to lowerRank's base value, because we want to know where + * each rank begins in the output, so for rank R we want to count ranks R+1 and above. + */ + ZSTD_memset(rankPosition, 0, sizeof(*rankPosition) * RANK_POSITION_TABLE_SIZE); + for (n = 0; n < maxSymbolValue1; ++n) { + U32 lowerRank = HUF_getIndex(count[n]); + assert(lowerRank < RANK_POSITION_TABLE_SIZE - 1); + rankPosition[lowerRank].base++; + } + + assert(rankPosition[RANK_POSITION_TABLE_SIZE - 1].base == 0); + /* Set up the rankPosition table */ + for (n = RANK_POSITION_TABLE_SIZE - 1; n > 0; --n) { + rankPosition[n-1].base += rankPosition[n].base; + rankPosition[n-1].curr = rankPosition[n-1].base; + } + + /* Insert each symbol into their appropriate bucket, setting up rankPosition table. */ + for (n = 0; n < maxSymbolValue1; ++n) { + U32 const c = count[n]; + U32 const r = HUF_getIndex(c) + 1; + U32 const pos = rankPosition[r].curr++; + assert(pos < maxSymbolValue1); + huffNode[pos].count = c; + huffNode[pos].byte = (BYTE)n; + } + + /* Sort each bucket. */ + for (n = RANK_POSITION_DISTINCT_COUNT_CUTOFF; n < RANK_POSITION_TABLE_SIZE - 1; ++n) { + int const bucketSize = rankPosition[n].curr - rankPosition[n].base; + U32 const bucketStartIdx = rankPosition[n].base; + if (bucketSize > 1) { + assert(bucketStartIdx < maxSymbolValue1); + HUF_simpleQuickSort(huffNode + bucketStartIdx, 0, bucketSize-1); + } + } + + assert(HUF_isSorted(huffNode, maxSymbolValue1)); +} + + +/** HUF_buildCTable_wksp() : + * Same as HUF_buildCTable(), but using externally allocated scratch buffer. + * `workSpace` must be aligned on 4-bytes boundaries, and be at least as large as sizeof(HUF_buildCTable_wksp_tables). + */ +#define STARTNODE (HUF_SYMBOLVALUE_MAX+1) + +/* HUF_buildTree(): + * Takes the huffNode array sorted by HUF_sort() and builds an unlimited-depth Huffman tree. + * + * @param huffNode The array sorted by HUF_sort(). Builds the Huffman tree in this array. + * @param maxSymbolValue The maximum symbol value. + * @return The smallest node in the Huffman tree (by count). + */ +static int HUF_buildTree(nodeElt* huffNode, U32 maxSymbolValue) +{ + nodeElt* const huffNode0 = huffNode - 1; + int nonNullRank; + int lowS, lowN; + int nodeNb = STARTNODE; + int n, nodeRoot; + DEBUGLOG(5, "HUF_buildTree (alphabet size = %u)", maxSymbolValue + 1); + /* init for parents */ + nonNullRank = (int)maxSymbolValue; + while(huffNode[nonNullRank].count == 0) nonNullRank--; + lowS = nonNullRank; nodeRoot = nodeNb + lowS - 1; lowN = nodeNb; + huffNode[nodeNb].count = huffNode[lowS].count + huffNode[lowS-1].count; + huffNode[lowS].parent = huffNode[lowS-1].parent = (U16)nodeNb; + nodeNb++; lowS-=2; + for (n=nodeNb; n<=nodeRoot; n++) huffNode[n].count = (U32)(1U<<30); + huffNode0[0].count = (U32)(1U<<31); /* fake entry, strong barrier */ + + /* create parents */ + while (nodeNb <= nodeRoot) { + int const n1 = (huffNode[lowS].count < huffNode[lowN].count) ? lowS-- : lowN++; + int const n2 = (huffNode[lowS].count < huffNode[lowN].count) ? lowS-- : lowN++; + huffNode[nodeNb].count = huffNode[n1].count + huffNode[n2].count; + huffNode[n1].parent = huffNode[n2].parent = (U16)nodeNb; + nodeNb++; + } + + /* distribute weights (unlimited tree height) */ + huffNode[nodeRoot].nbBits = 0; + for (n=nodeRoot-1; n>=STARTNODE; n--) + huffNode[n].nbBits = huffNode[ huffNode[n].parent ].nbBits + 1; + for (n=0; n<=nonNullRank; n++) + huffNode[n].nbBits = huffNode[ huffNode[n].parent ].nbBits + 1; + + DEBUGLOG(6, "Initial distribution of bits completed (%zu sorted symbols)", showHNodeBits(huffNode, maxSymbolValue+1)); + + return nonNullRank; +} + +/** + * HUF_buildCTableFromTree(): + * Build the CTable given the Huffman tree in huffNode. + * + * @param[out] CTable The output Huffman CTable. + * @param huffNode The Huffman tree. + * @param nonNullRank The last and smallest node in the Huffman tree. + * @param maxSymbolValue The maximum symbol value. + * @param maxNbBits The exact maximum number of bits used in the Huffman tree. + */ +static void HUF_buildCTableFromTree(HUF_CElt* CTable, nodeElt const* huffNode, int nonNullRank, U32 maxSymbolValue, U32 maxNbBits) +{ + HUF_CElt* const ct = CTable + 1; + /* fill result into ctable (val, nbBits) */ + int n; + U16 nbPerRank[HUF_TABLELOG_MAX+1] = {0}; + U16 valPerRank[HUF_TABLELOG_MAX+1] = {0}; + int const alphabetSize = (int)(maxSymbolValue + 1); + for (n=0; n<=nonNullRank; n++) + nbPerRank[huffNode[n].nbBits]++; + /* determine starting value per rank */ + { U16 min = 0; + for (n=(int)maxNbBits; n>0; n--) { + valPerRank[n] = min; /* get starting value within each rank */ + min += nbPerRank[n]; + min >>= 1; + } } + for (n=0; nhuffNodeTbl; + nodeElt* const huffNode = huffNode0+1; + int nonNullRank; + + HUF_STATIC_ASSERT(HUF_CTABLE_WORKSPACE_SIZE == sizeof(HUF_buildCTable_wksp_tables)); + + DEBUGLOG(5, "HUF_buildCTable_wksp (alphabet size = %u)", maxSymbolValue+1); + + /* safety checks */ + if (wkspSize < sizeof(HUF_buildCTable_wksp_tables)) + return ERROR(workSpace_tooSmall); + if (maxNbBits == 0) maxNbBits = HUF_TABLELOG_DEFAULT; + if (maxSymbolValue > HUF_SYMBOLVALUE_MAX) + return ERROR(maxSymbolValue_tooLarge); + ZSTD_memset(huffNode0, 0, sizeof(huffNodeTable)); + + /* sort, decreasing order */ + HUF_sort(huffNode, count, maxSymbolValue, wksp_tables->rankPosition); + DEBUGLOG(6, "sorted symbols completed (%zu symbols)", showHNodeSymbols(huffNode, maxSymbolValue+1)); + + /* build tree */ + nonNullRank = HUF_buildTree(huffNode, maxSymbolValue); + + /* determine and enforce maxTableLog */ + maxNbBits = HUF_setMaxHeight(huffNode, (U32)nonNullRank, maxNbBits); + if (maxNbBits > HUF_TABLELOG_MAX) return ERROR(GENERIC); /* check fit into table */ + + HUF_buildCTableFromTree(CTable, huffNode, nonNullRank, maxSymbolValue, maxNbBits); + + return maxNbBits; +} + +size_t HUF_estimateCompressedSize(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue) +{ + HUF_CElt const* ct = CTable + 1; + size_t nbBits = 0; + int s; + for (s = 0; s <= (int)maxSymbolValue; ++s) { + nbBits += HUF_getNbBits(ct[s]) * count[s]; + } + return nbBits >> 3; +} + +int HUF_validateCTable(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue) { + HUF_CElt const* ct = CTable + 1; + int bad = 0; + int s; + for (s = 0; s <= (int)maxSymbolValue; ++s) { + bad |= (count[s] != 0) & (HUF_getNbBits(ct[s]) == 0); + } + return !bad; +} + +size_t HUF_compressBound(size_t size) { return HUF_COMPRESSBOUND(size); } + +/** HUF_CStream_t: + * Huffman uses its own BIT_CStream_t implementation. + * There are three major differences from BIT_CStream_t: + * 1. HUF_addBits() takes a HUF_CElt (size_t) which is + * the pair (nbBits, value) in the format: + * format: + * - Bits [0, 4) = nbBits + * - Bits [4, 64 - nbBits) = 0 + * - Bits [64 - nbBits, 64) = value + * 2. The bitContainer is built from the upper bits and + * right shifted. E.g. to add a new value of N bits + * you right shift the bitContainer by N, then or in + * the new value into the N upper bits. + * 3. The bitstream has two bit containers. You can add + * bits to the second container and merge them into + * the first container. + */ + +#define HUF_BITS_IN_CONTAINER (sizeof(size_t) * 8) + +typedef struct { + size_t bitContainer[2]; + size_t bitPos[2]; + + BYTE* startPtr; + BYTE* ptr; + BYTE* endPtr; +} HUF_CStream_t; + +/**! HUF_initCStream(): + * Initializes the bitstream. + * @returns 0 or an error code. + */ +static size_t HUF_initCStream(HUF_CStream_t* bitC, + void* startPtr, size_t dstCapacity) +{ + ZSTD_memset(bitC, 0, sizeof(*bitC)); + bitC->startPtr = (BYTE*)startPtr; + bitC->ptr = bitC->startPtr; + bitC->endPtr = bitC->startPtr + dstCapacity - sizeof(bitC->bitContainer[0]); + if (dstCapacity <= sizeof(bitC->bitContainer[0])) return ERROR(dstSize_tooSmall); + return 0; +} + +/*! HUF_addBits(): + * Adds the symbol stored in HUF_CElt elt to the bitstream. + * + * @param elt The element we're adding. This is a (nbBits, value) pair. + * See the HUF_CStream_t docs for the format. + * @param idx Insert into the bitstream at this idx. + * @param kFast This is a template parameter. If the bitstream is guaranteed + * to have at least 4 unused bits after this call it may be 1, + * otherwise it must be 0. HUF_addBits() is faster when fast is set. + */ +FORCE_INLINE_TEMPLATE void HUF_addBits(HUF_CStream_t* bitC, HUF_CElt elt, int idx, int kFast) +{ + assert(idx <= 1); + assert(HUF_getNbBits(elt) <= HUF_TABLELOG_ABSOLUTEMAX); + /* This is efficient on x86-64 with BMI2 because shrx + * only reads the low 6 bits of the register. The compiler + * knows this and elides the mask. When fast is set, + * every operation can use the same value loaded from elt. + */ + bitC->bitContainer[idx] >>= HUF_getNbBits(elt); + bitC->bitContainer[idx] |= kFast ? HUF_getValueFast(elt) : HUF_getValue(elt); + /* We only read the low 8 bits of bitC->bitPos[idx] so it + * doesn't matter that the high bits have noise from the value. + */ + bitC->bitPos[idx] += HUF_getNbBitsFast(elt); + assert((bitC->bitPos[idx] & 0xFF) <= HUF_BITS_IN_CONTAINER); + /* The last 4-bits of elt are dirty if fast is set, + * so we must not be overwriting bits that have already been + * inserted into the bit container. + */ +#if DEBUGLEVEL >= 1 + { + size_t const nbBits = HUF_getNbBits(elt); + size_t const dirtyBits = nbBits == 0 ? 0 : ZSTD_highbit32((U32)nbBits) + 1; + (void)dirtyBits; + /* Middle bits are 0. */ + assert(((elt >> dirtyBits) << (dirtyBits + nbBits)) == 0); + /* We didn't overwrite any bits in the bit container. */ + assert(!kFast || (bitC->bitPos[idx] & 0xFF) <= HUF_BITS_IN_CONTAINER); + (void)dirtyBits; + } +#endif +} + +FORCE_INLINE_TEMPLATE void HUF_zeroIndex1(HUF_CStream_t* bitC) +{ + bitC->bitContainer[1] = 0; + bitC->bitPos[1] = 0; +} + +/*! HUF_mergeIndex1() : + * Merges the bit container @ index 1 into the bit container @ index 0 + * and zeros the bit container @ index 1. + */ +FORCE_INLINE_TEMPLATE void HUF_mergeIndex1(HUF_CStream_t* bitC) +{ + assert((bitC->bitPos[1] & 0xFF) < HUF_BITS_IN_CONTAINER); + bitC->bitContainer[0] >>= (bitC->bitPos[1] & 0xFF); + bitC->bitContainer[0] |= bitC->bitContainer[1]; + bitC->bitPos[0] += bitC->bitPos[1]; + assert((bitC->bitPos[0] & 0xFF) <= HUF_BITS_IN_CONTAINER); +} + +/*! HUF_flushBits() : +* Flushes the bits in the bit container @ index 0. +* +* @post bitPos will be < 8. +* @param kFast If kFast is set then we must know a-priori that +* the bit container will not overflow. +*/ +FORCE_INLINE_TEMPLATE void HUF_flushBits(HUF_CStream_t* bitC, int kFast) +{ + /* The upper bits of bitPos are noisy, so we must mask by 0xFF. */ + size_t const nbBits = bitC->bitPos[0] & 0xFF; + size_t const nbBytes = nbBits >> 3; + /* The top nbBits bits of bitContainer are the ones we need. */ + size_t const bitContainer = bitC->bitContainer[0] >> (HUF_BITS_IN_CONTAINER - nbBits); + /* Mask bitPos to account for the bytes we consumed. */ + bitC->bitPos[0] &= 7; + assert(nbBits > 0); + assert(nbBits <= sizeof(bitC->bitContainer[0]) * 8); + assert(bitC->ptr <= bitC->endPtr); + MEM_writeLEST(bitC->ptr, bitContainer); + bitC->ptr += nbBytes; + assert(!kFast || bitC->ptr <= bitC->endPtr); + if (!kFast && bitC->ptr > bitC->endPtr) bitC->ptr = bitC->endPtr; + /* bitContainer doesn't need to be modified because the leftover + * bits are already the top bitPos bits. And we don't care about + * noise in the lower values. + */ +} + +/*! HUF_endMark() + * @returns The Huffman stream end mark: A 1-bit value = 1. + */ +static HUF_CElt HUF_endMark(void) +{ + HUF_CElt endMark; + HUF_setNbBits(&endMark, 1); + HUF_setValue(&endMark, 1); + return endMark; +} + +/*! HUF_closeCStream() : + * @return Size of CStream, in bytes, + * or 0 if it could not fit into dstBuffer */ +static size_t HUF_closeCStream(HUF_CStream_t* bitC) +{ + HUF_addBits(bitC, HUF_endMark(), /* idx */ 0, /* kFast */ 0); + HUF_flushBits(bitC, /* kFast */ 0); + { + size_t const nbBits = bitC->bitPos[0] & 0xFF; + if (bitC->ptr >= bitC->endPtr) return 0; /* overflow detected */ + return (size_t)(bitC->ptr - bitC->startPtr) + (nbBits > 0); + } +} + +FORCE_INLINE_TEMPLATE void +HUF_encodeSymbol(HUF_CStream_t* bitCPtr, U32 symbol, const HUF_CElt* CTable, int idx, int fast) +{ + HUF_addBits(bitCPtr, CTable[symbol], idx, fast); +} + +FORCE_INLINE_TEMPLATE void +HUF_compress1X_usingCTable_internal_body_loop(HUF_CStream_t* bitC, + const BYTE* ip, size_t srcSize, + const HUF_CElt* ct, + int kUnroll, int kFastFlush, int kLastFast) +{ + /* Join to kUnroll */ + int n = (int)srcSize; + int rem = n % kUnroll; + if (rem > 0) { + for (; rem > 0; --rem) { + HUF_encodeSymbol(bitC, ip[--n], ct, 0, /* fast */ 0); + } + HUF_flushBits(bitC, kFastFlush); + } + assert(n % kUnroll == 0); + + /* Join to 2 * kUnroll */ + if (n % (2 * kUnroll)) { + int u; + for (u = 1; u < kUnroll; ++u) { + HUF_encodeSymbol(bitC, ip[n - u], ct, 0, 1); + } + HUF_encodeSymbol(bitC, ip[n - kUnroll], ct, 0, kLastFast); + HUF_flushBits(bitC, kFastFlush); + n -= kUnroll; + } + assert(n % (2 * kUnroll) == 0); + + for (; n>0; n-= 2 * kUnroll) { + /* Encode kUnroll symbols into the bitstream @ index 0. */ + int u; + for (u = 1; u < kUnroll; ++u) { + HUF_encodeSymbol(bitC, ip[n - u], ct, /* idx */ 0, /* fast */ 1); + } + HUF_encodeSymbol(bitC, ip[n - kUnroll], ct, /* idx */ 0, /* fast */ kLastFast); + HUF_flushBits(bitC, kFastFlush); + /* Encode kUnroll symbols into the bitstream @ index 1. + * This allows us to start filling the bit container + * without any data dependencies. + */ + HUF_zeroIndex1(bitC); + for (u = 1; u < kUnroll; ++u) { + HUF_encodeSymbol(bitC, ip[n - kUnroll - u], ct, /* idx */ 1, /* fast */ 1); + } + HUF_encodeSymbol(bitC, ip[n - kUnroll - kUnroll], ct, /* idx */ 1, /* fast */ kLastFast); + /* Merge bitstream @ index 1 into the bitstream @ index 0 */ + HUF_mergeIndex1(bitC); + HUF_flushBits(bitC, kFastFlush); + } + assert(n == 0); + +} + +/** + * Returns a tight upper bound on the output space needed by Huffman + * with 8 bytes buffer to handle over-writes. If the output is at least + * this large we don't need to do bounds checks during Huffman encoding. + */ +static size_t HUF_tightCompressBound(size_t srcSize, size_t tableLog) +{ + return ((srcSize * tableLog) >> 3) + 8; +} + + +FORCE_INLINE_TEMPLATE size_t +HUF_compress1X_usingCTable_internal_body(void* dst, size_t dstSize, + const void* src, size_t srcSize, + const HUF_CElt* CTable) +{ + U32 const tableLog = (U32)CTable[0]; + HUF_CElt const* ct = CTable + 1; + const BYTE* ip = (const BYTE*) src; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = ostart + dstSize; + BYTE* op = ostart; + HUF_CStream_t bitC; + + /* init */ + if (dstSize < 8) return 0; /* not enough space to compress */ + { size_t const initErr = HUF_initCStream(&bitC, op, (size_t)(oend-op)); + if (HUF_isError(initErr)) return 0; } + + if (dstSize < HUF_tightCompressBound(srcSize, (size_t)tableLog) || tableLog > 11) + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ MEM_32bits() ? 2 : 4, /* kFast */ 0, /* kLastFast */ 0); + else { + if (MEM_32bits()) { + switch (tableLog) { + case 11: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 2, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 10: ZSTD_FALLTHROUGH; + case 9: ZSTD_FALLTHROUGH; + case 8: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 2, /* kFastFlush */ 1, /* kLastFast */ 1); + break; + case 7: ZSTD_FALLTHROUGH; + default: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 3, /* kFastFlush */ 1, /* kLastFast */ 1); + break; + } + } else { + switch (tableLog) { + case 11: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 5, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 10: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 5, /* kFastFlush */ 1, /* kLastFast */ 1); + break; + case 9: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 6, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 8: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 7, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 7: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 8, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 6: ZSTD_FALLTHROUGH; + default: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 9, /* kFastFlush */ 1, /* kLastFast */ 1); + break; + } + } + } + assert(bitC.ptr <= bitC.endPtr); + + return HUF_closeCStream(&bitC); +} + +#if DYNAMIC_BMI2 + +static BMI2_TARGET_ATTRIBUTE size_t +HUF_compress1X_usingCTable_internal_bmi2(void* dst, size_t dstSize, + const void* src, size_t srcSize, + const HUF_CElt* CTable) +{ + return HUF_compress1X_usingCTable_internal_body(dst, dstSize, src, srcSize, CTable); +} + +static size_t +HUF_compress1X_usingCTable_internal_default(void* dst, size_t dstSize, + const void* src, size_t srcSize, + const HUF_CElt* CTable) +{ + return HUF_compress1X_usingCTable_internal_body(dst, dstSize, src, srcSize, CTable); +} + +static size_t +HUF_compress1X_usingCTable_internal(void* dst, size_t dstSize, + const void* src, size_t srcSize, + const HUF_CElt* CTable, const int flags) +{ + if (flags & HUF_flags_bmi2) { + return HUF_compress1X_usingCTable_internal_bmi2(dst, dstSize, src, srcSize, CTable); + } + return HUF_compress1X_usingCTable_internal_default(dst, dstSize, src, srcSize, CTable); +} + +#else + +static size_t +HUF_compress1X_usingCTable_internal(void* dst, size_t dstSize, + const void* src, size_t srcSize, + const HUF_CElt* CTable, const int flags) +{ + (void)flags; + return HUF_compress1X_usingCTable_internal_body(dst, dstSize, src, srcSize, CTable); +} + +#endif + +size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int flags) +{ + return HUF_compress1X_usingCTable_internal(dst, dstSize, src, srcSize, CTable, flags); +} + +static size_t +HUF_compress4X_usingCTable_internal(void* dst, size_t dstSize, + const void* src, size_t srcSize, + const HUF_CElt* CTable, int flags) +{ + size_t const segmentSize = (srcSize+3)/4; /* first 3 segments */ + const BYTE* ip = (const BYTE*) src; + const BYTE* const iend = ip + srcSize; + BYTE* const ostart = (BYTE*) dst; + BYTE* const oend = ostart + dstSize; + BYTE* op = ostart; + + if (dstSize < 6 + 1 + 1 + 1 + 8) return 0; /* minimum space to compress successfully */ + if (srcSize < 12) return 0; /* no saving possible : too small input */ + op += 6; /* jumpTable */ + + assert(op <= oend); + { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, segmentSize, CTable, flags) ); + if (cSize == 0 || cSize > 65535) return 0; + MEM_writeLE16(ostart, (U16)cSize); + op += cSize; + } + + ip += segmentSize; + assert(op <= oend); + { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, segmentSize, CTable, flags) ); + if (cSize == 0 || cSize > 65535) return 0; + MEM_writeLE16(ostart+2, (U16)cSize); + op += cSize; + } + + ip += segmentSize; + assert(op <= oend); + { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, segmentSize, CTable, flags) ); + if (cSize == 0 || cSize > 65535) return 0; + MEM_writeLE16(ostart+4, (U16)cSize); + op += cSize; + } + + ip += segmentSize; + assert(op <= oend); + assert(ip <= iend); + { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, (size_t)(iend-ip), CTable, flags) ); + if (cSize == 0 || cSize > 65535) return 0; + op += cSize; + } + + return (size_t)(op-ostart); +} + +size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int flags) +{ + return HUF_compress4X_usingCTable_internal(dst, dstSize, src, srcSize, CTable, flags); +} + +typedef enum { HUF_singleStream, HUF_fourStreams } HUF_nbStreams_e; + +static size_t HUF_compressCTable_internal( + BYTE* const ostart, BYTE* op, BYTE* const oend, + const void* src, size_t srcSize, + HUF_nbStreams_e nbStreams, const HUF_CElt* CTable, const int flags) +{ + size_t const cSize = (nbStreams==HUF_singleStream) ? + HUF_compress1X_usingCTable_internal(op, (size_t)(oend - op), src, srcSize, CTable, flags) : + HUF_compress4X_usingCTable_internal(op, (size_t)(oend - op), src, srcSize, CTable, flags); + if (HUF_isError(cSize)) { return cSize; } + if (cSize==0) { return 0; } /* uncompressible */ + op += cSize; + /* check compressibility */ + assert(op >= ostart); + if ((size_t)(op-ostart) >= srcSize-1) { return 0; } + return (size_t)(op-ostart); +} + +typedef struct { + unsigned count[HUF_SYMBOLVALUE_MAX + 1]; + HUF_CElt CTable[HUF_CTABLE_SIZE_ST(HUF_SYMBOLVALUE_MAX)]; + union { + HUF_buildCTable_wksp_tables buildCTable_wksp; + HUF_WriteCTableWksp writeCTable_wksp; + U32 hist_wksp[HIST_WKSP_SIZE_U32]; + } wksps; +} HUF_compress_tables_t; + +#define SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE 4096 +#define SUSPECT_INCOMPRESSIBLE_SAMPLE_RATIO 10 /* Must be >= 2 */ + +unsigned HUF_cardinality(const unsigned* count, unsigned maxSymbolValue) +{ + unsigned cardinality = 0; + unsigned i; + + for (i = 0; i < maxSymbolValue + 1; i++) { + if (count[i] != 0) cardinality += 1; + } + + return cardinality; +} + +unsigned HUF_minTableLog(unsigned symbolCardinality) +{ + U32 minBitsSymbols = ZSTD_highbit32(symbolCardinality) + 1; + return minBitsSymbols; +} + +unsigned HUF_optimalTableLog( + unsigned maxTableLog, + size_t srcSize, + unsigned maxSymbolValue, + void* workSpace, size_t wkspSize, + HUF_CElt* table, + const unsigned* count, + int flags) +{ + assert(srcSize > 1); /* Not supported, RLE should be used instead */ + assert(wkspSize >= sizeof(HUF_buildCTable_wksp_tables)); + + if (!(flags & HUF_flags_optimalDepth)) { + /* cheap evaluation, based on FSE */ + return FSE_optimalTableLog_internal(maxTableLog, srcSize, maxSymbolValue, 1); + } + + { BYTE* dst = (BYTE*)workSpace + sizeof(HUF_WriteCTableWksp); + size_t dstSize = wkspSize - sizeof(HUF_WriteCTableWksp); + size_t maxBits, hSize, newSize; + const unsigned symbolCardinality = HUF_cardinality(count, maxSymbolValue); + const unsigned minTableLog = HUF_minTableLog(symbolCardinality); + size_t optSize = ((size_t) ~0) - 1; + unsigned optLog = maxTableLog, optLogGuess; + + DEBUGLOG(6, "HUF_optimalTableLog: probing huf depth (srcSize=%zu)", srcSize); + + /* Search until size increases */ + for (optLogGuess = minTableLog; optLogGuess <= maxTableLog; optLogGuess++) { + DEBUGLOG(7, "checking for huffLog=%u", optLogGuess); + maxBits = HUF_buildCTable_wksp(table, count, maxSymbolValue, optLogGuess, workSpace, wkspSize); + if (ERR_isError(maxBits)) continue; + + if (maxBits < optLogGuess && optLogGuess > minTableLog) break; + + hSize = HUF_writeCTable_wksp(dst, dstSize, table, maxSymbolValue, (U32)maxBits, workSpace, wkspSize); + + if (ERR_isError(hSize)) continue; + + newSize = HUF_estimateCompressedSize(table, count, maxSymbolValue) + hSize; + + if (newSize > optSize + 1) { + break; + } + + if (newSize < optSize) { + optSize = newSize; + optLog = optLogGuess; + } + } + assert(optLog <= HUF_TABLELOG_MAX); + return optLog; + } +} + +/* HUF_compress_internal() : + * `workSpace_align4` must be aligned on 4-bytes boundaries, + * and occupies the same space as a table of HUF_WORKSPACE_SIZE_U64 unsigned */ +static size_t +HUF_compress_internal (void* dst, size_t dstSize, + const void* src, size_t srcSize, + unsigned maxSymbolValue, unsigned huffLog, + HUF_nbStreams_e nbStreams, + void* workSpace, size_t wkspSize, + HUF_CElt* oldHufTable, HUF_repeat* repeat, int flags) +{ + HUF_compress_tables_t* const table = (HUF_compress_tables_t*)HUF_alignUpWorkspace(workSpace, &wkspSize, ZSTD_ALIGNOF(size_t)); + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = ostart + dstSize; + BYTE* op = ostart; + + DEBUGLOG(5, "HUF_compress_internal (srcSize=%zu)", srcSize); + HUF_STATIC_ASSERT(sizeof(*table) + HUF_WORKSPACE_MAX_ALIGNMENT <= HUF_WORKSPACE_SIZE); + + /* checks & inits */ + if (wkspSize < sizeof(*table)) return ERROR(workSpace_tooSmall); + if (!srcSize) return 0; /* Uncompressed */ + if (!dstSize) return 0; /* cannot fit anything within dst budget */ + if (srcSize > HUF_BLOCKSIZE_MAX) return ERROR(srcSize_wrong); /* current block size limit */ + if (huffLog > HUF_TABLELOG_MAX) return ERROR(tableLog_tooLarge); + if (maxSymbolValue > HUF_SYMBOLVALUE_MAX) return ERROR(maxSymbolValue_tooLarge); + if (!maxSymbolValue) maxSymbolValue = HUF_SYMBOLVALUE_MAX; + if (!huffLog) huffLog = HUF_TABLELOG_DEFAULT; + + /* Heuristic : If old table is valid, use it for small inputs */ + if ((flags & HUF_flags_preferRepeat) && repeat && *repeat == HUF_repeat_valid) { + return HUF_compressCTable_internal(ostart, op, oend, + src, srcSize, + nbStreams, oldHufTable, flags); + } + + /* If uncompressible data is suspected, do a smaller sampling first */ + DEBUG_STATIC_ASSERT(SUSPECT_INCOMPRESSIBLE_SAMPLE_RATIO >= 2); + if ((flags & HUF_flags_suspectUncompressible) && srcSize >= (SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE * SUSPECT_INCOMPRESSIBLE_SAMPLE_RATIO)) { + size_t largestTotal = 0; + DEBUGLOG(5, "input suspected incompressible : sampling to check"); + { unsigned maxSymbolValueBegin = maxSymbolValue; + CHECK_V_F(largestBegin, HIST_count_simple (table->count, &maxSymbolValueBegin, (const BYTE*)src, SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE) ); + largestTotal += largestBegin; + } + { unsigned maxSymbolValueEnd = maxSymbolValue; + CHECK_V_F(largestEnd, HIST_count_simple (table->count, &maxSymbolValueEnd, (const BYTE*)src + srcSize - SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE, SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE) ); + largestTotal += largestEnd; + } + if (largestTotal <= ((2 * SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE) >> 7)+4) return 0; /* heuristic : probably not compressible enough */ + } + + /* Scan input and build symbol stats */ + { CHECK_V_F(largest, HIST_count_wksp (table->count, &maxSymbolValue, (const BYTE*)src, srcSize, table->wksps.hist_wksp, sizeof(table->wksps.hist_wksp)) ); + if (largest == srcSize) { *ostart = ((const BYTE*)src)[0]; return 1; } /* single symbol, rle */ + if (largest <= (srcSize >> 7)+4) return 0; /* heuristic : probably not compressible enough */ + } + DEBUGLOG(6, "histogram detail completed (%zu symbols)", showU32(table->count, maxSymbolValue+1)); + + /* Check validity of previous table */ + if ( repeat + && *repeat == HUF_repeat_check + && !HUF_validateCTable(oldHufTable, table->count, maxSymbolValue)) { + *repeat = HUF_repeat_none; + } + /* Heuristic : use existing table for small inputs */ + if ((flags & HUF_flags_preferRepeat) && repeat && *repeat != HUF_repeat_none) { + return HUF_compressCTable_internal(ostart, op, oend, + src, srcSize, + nbStreams, oldHufTable, flags); + } + + /* Build Huffman Tree */ + huffLog = HUF_optimalTableLog(huffLog, srcSize, maxSymbolValue, &table->wksps, sizeof(table->wksps), table->CTable, table->count, flags); + { size_t const maxBits = HUF_buildCTable_wksp(table->CTable, table->count, + maxSymbolValue, huffLog, + &table->wksps.buildCTable_wksp, sizeof(table->wksps.buildCTable_wksp)); + CHECK_F(maxBits); + huffLog = (U32)maxBits; + DEBUGLOG(6, "bit distribution completed (%zu symbols)", showCTableBits(table->CTable + 1, maxSymbolValue+1)); + } + /* Zero unused symbols in CTable, so we can check it for validity */ + { + size_t const ctableSize = HUF_CTABLE_SIZE_ST(maxSymbolValue); + size_t const unusedSize = sizeof(table->CTable) - ctableSize * sizeof(HUF_CElt); + ZSTD_memset(table->CTable + ctableSize, 0, unusedSize); + } + + /* Write table description header */ + { CHECK_V_F(hSize, HUF_writeCTable_wksp(op, dstSize, table->CTable, maxSymbolValue, huffLog, + &table->wksps.writeCTable_wksp, sizeof(table->wksps.writeCTable_wksp)) ); + /* Check if using previous huffman table is beneficial */ + if (repeat && *repeat != HUF_repeat_none) { + size_t const oldSize = HUF_estimateCompressedSize(oldHufTable, table->count, maxSymbolValue); + size_t const newSize = HUF_estimateCompressedSize(table->CTable, table->count, maxSymbolValue); + if (oldSize <= hSize + newSize || hSize + 12 >= srcSize) { + return HUF_compressCTable_internal(ostart, op, oend, + src, srcSize, + nbStreams, oldHufTable, flags); + } } + + /* Use the new huffman table */ + if (hSize + 12ul >= srcSize) { return 0; } + op += hSize; + if (repeat) { *repeat = HUF_repeat_none; } + if (oldHufTable) + ZSTD_memcpy(oldHufTable, table->CTable, sizeof(table->CTable)); /* Save new table */ + } + return HUF_compressCTable_internal(ostart, op, oend, + src, srcSize, + nbStreams, table->CTable, flags); +} + +size_t HUF_compress1X_repeat (void* dst, size_t dstSize, + const void* src, size_t srcSize, + unsigned maxSymbolValue, unsigned huffLog, + void* workSpace, size_t wkspSize, + HUF_CElt* hufTable, HUF_repeat* repeat, int flags) +{ + DEBUGLOG(5, "HUF_compress1X_repeat (srcSize = %zu)", srcSize); + return HUF_compress_internal(dst, dstSize, src, srcSize, + maxSymbolValue, huffLog, HUF_singleStream, + workSpace, wkspSize, hufTable, + repeat, flags); +} + +/* HUF_compress4X_repeat(): + * compress input using 4 streams. + * consider skipping quickly + * re-use an existing huffman compression table */ +size_t HUF_compress4X_repeat (void* dst, size_t dstSize, + const void* src, size_t srcSize, + unsigned maxSymbolValue, unsigned huffLog, + void* workSpace, size_t wkspSize, + HUF_CElt* hufTable, HUF_repeat* repeat, int flags) +{ + DEBUGLOG(5, "HUF_compress4X_repeat (srcSize = %zu)", srcSize); + return HUF_compress_internal(dst, dstSize, src, srcSize, + maxSymbolValue, huffLog, HUF_fourStreams, + workSpace, wkspSize, + hufTable, repeat, flags); +} +/**** ended inlining compress/huf_compress.c ****/ +/**** start inlining compress/zstd_compress_literals.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + /*-************************************* + * Dependencies + ***************************************/ +/**** start inlining zstd_compress_literals.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_COMPRESS_LITERALS_H +#define ZSTD_COMPRESS_LITERALS_H + +/**** start inlining zstd_compress_internal.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* This header contains definitions + * that shall **only** be used by modules within lib/compress. + */ + +#ifndef ZSTD_COMPRESS_H +#define ZSTD_COMPRESS_H + +/*-************************************* +* Dependencies +***************************************/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** start inlining zstd_cwksp.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_CWKSP_H +#define ZSTD_CWKSP_H + +/*-************************************* +* Dependencies +***************************************/ +/**** skipping file: ../common/allocations.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: ../common/portability_macros.h ****/ + +#if defined (__cplusplus) +extern "C" { +#endif + +/*-************************************* +* Constants +***************************************/ + +/* Since the workspace is effectively its own little malloc implementation / + * arena, when we run under ASAN, we should similarly insert redzones between + * each internal element of the workspace, so ASAN will catch overruns that + * reach outside an object but that stay inside the workspace. + * + * This defines the size of that redzone. + */ +#ifndef ZSTD_CWKSP_ASAN_REDZONE_SIZE +#define ZSTD_CWKSP_ASAN_REDZONE_SIZE 128 +#endif + + +/* Set our tables and aligneds to align by 64 bytes */ +#define ZSTD_CWKSP_ALIGNMENT_BYTES 64 + +/*-************************************* +* Structures +***************************************/ +typedef enum { + ZSTD_cwksp_alloc_objects, + ZSTD_cwksp_alloc_aligned_init_once, + ZSTD_cwksp_alloc_aligned, + ZSTD_cwksp_alloc_buffers +} ZSTD_cwksp_alloc_phase_e; + +/** + * Used to describe whether the workspace is statically allocated (and will not + * necessarily ever be freed), or if it's dynamically allocated and we can + * expect a well-formed caller to free this. + */ +typedef enum { + ZSTD_cwksp_dynamic_alloc, + ZSTD_cwksp_static_alloc +} ZSTD_cwksp_static_alloc_e; + +/** + * Zstd fits all its internal datastructures into a single continuous buffer, + * so that it only needs to perform a single OS allocation (or so that a buffer + * can be provided to it and it can perform no allocations at all). This buffer + * is called the workspace. + * + * Several optimizations complicate that process of allocating memory ranges + * from this workspace for each internal datastructure: + * + * - These different internal datastructures have different setup requirements: + * + * - The static objects need to be cleared once and can then be trivially + * reused for each compression. + * + * - Various buffers don't need to be initialized at all--they are always + * written into before they're read. + * + * - The matchstate tables have a unique requirement that they don't need + * their memory to be totally cleared, but they do need the memory to have + * some bound, i.e., a guarantee that all values in the memory they've been + * allocated is less than some maximum value (which is the starting value + * for the indices that they will then use for compression). When this + * guarantee is provided to them, they can use the memory without any setup + * work. When it can't, they have to clear the area. + * + * - These buffers also have different alignment requirements. + * + * - We would like to reuse the objects in the workspace for multiple + * compressions without having to perform any expensive reallocation or + * reinitialization work. + * + * - We would like to be able to efficiently reuse the workspace across + * multiple compressions **even when the compression parameters change** and + * we need to resize some of the objects (where possible). + * + * To attempt to manage this buffer, given these constraints, the ZSTD_cwksp + * abstraction was created. It works as follows: + * + * Workspace Layout: + * + * [ ... workspace ... ] + * [objects][tables ->] free space [<- buffers][<- aligned][<- init once] + * + * The various objects that live in the workspace are divided into the + * following categories, and are allocated separately: + * + * - Static objects: this is optionally the enclosing ZSTD_CCtx or ZSTD_CDict, + * so that literally everything fits in a single buffer. Note: if present, + * this must be the first object in the workspace, since ZSTD_customFree{CCtx, + * CDict}() rely on a pointer comparison to see whether one or two frees are + * required. + * + * - Fixed size objects: these are fixed-size, fixed-count objects that are + * nonetheless "dynamically" allocated in the workspace so that we can + * control how they're initialized separately from the broader ZSTD_CCtx. + * Examples: + * - Entropy Workspace + * - 2 x ZSTD_compressedBlockState_t + * - CDict dictionary contents + * + * - Tables: these are any of several different datastructures (hash tables, + * chain tables, binary trees) that all respect a common format: they are + * uint32_t arrays, all of whose values are between 0 and (nextSrc - base). + * Their sizes depend on the cparams. These tables are 64-byte aligned. + * + * - Init once: these buffers require to be initialized at least once before + * use. They should be used when we want to skip memory initialization + * while not triggering memory checkers (like Valgrind) when reading from + * from this memory without writing to it first. + * These buffers should be used carefully as they might contain data + * from previous compressions. + * Buffers are aligned to 64 bytes. + * + * - Aligned: these buffers don't require any initialization before they're + * used. The user of the buffer should make sure they write into a buffer + * location before reading from it. + * Buffers are aligned to 64 bytes. + * + * - Buffers: these buffers are used for various purposes that don't require + * any alignment or initialization before they're used. This means they can + * be moved around at no cost for a new compression. + * + * Allocating Memory: + * + * The various types of objects must be allocated in order, so they can be + * correctly packed into the workspace buffer. That order is: + * + * 1. Objects + * 2. Init once / Tables + * 3. Aligned / Tables + * 4. Buffers / Tables + * + * Attempts to reserve objects of different types out of order will fail. + */ +typedef struct { + void* workspace; + void* workspaceEnd; + + void* objectEnd; + void* tableEnd; + void* tableValidEnd; + void* allocStart; + void* initOnceStart; + + BYTE allocFailed; + int workspaceOversizedDuration; + ZSTD_cwksp_alloc_phase_e phase; + ZSTD_cwksp_static_alloc_e isStatic; +} ZSTD_cwksp; + +/*-************************************* +* Functions +***************************************/ + +MEM_STATIC size_t ZSTD_cwksp_available_space(ZSTD_cwksp* ws); +MEM_STATIC void* ZSTD_cwksp_initialAllocStart(ZSTD_cwksp* ws); + +MEM_STATIC void ZSTD_cwksp_assert_internal_consistency(ZSTD_cwksp* ws) { + (void)ws; + assert(ws->workspace <= ws->objectEnd); + assert(ws->objectEnd <= ws->tableEnd); + assert(ws->objectEnd <= ws->tableValidEnd); + assert(ws->tableEnd <= ws->allocStart); + assert(ws->tableValidEnd <= ws->allocStart); + assert(ws->allocStart <= ws->workspaceEnd); + assert(ws->initOnceStart <= ZSTD_cwksp_initialAllocStart(ws)); + assert(ws->workspace <= ws->initOnceStart); +#if ZSTD_MEMORY_SANITIZER + { + intptr_t const offset = __msan_test_shadow(ws->initOnceStart, + (U8*)ZSTD_cwksp_initialAllocStart(ws) - (U8*)ws->initOnceStart); +#if defined(ZSTD_MSAN_PRINT) + if(offset!=-1) { + __msan_print_shadow((U8*)ws->initOnceStart + offset - 8, 32); + } +#endif + assert(offset==-1); + }; +#endif +} + +/** + * Align must be a power of 2. + */ +MEM_STATIC size_t ZSTD_cwksp_align(size_t size, size_t const align) { + size_t const mask = align - 1; + assert((align & mask) == 0); + return (size + mask) & ~mask; +} + +/** + * Use this to determine how much space in the workspace we will consume to + * allocate this object. (Normally it should be exactly the size of the object, + * but under special conditions, like ASAN, where we pad each object, it might + * be larger.) + * + * Since tables aren't currently redzoned, you don't need to call through this + * to figure out how much space you need for the matchState tables. Everything + * else is though. + * + * Do not use for sizing aligned buffers. Instead, use ZSTD_cwksp_aligned_alloc_size(). + */ +MEM_STATIC size_t ZSTD_cwksp_alloc_size(size_t size) { + if (size == 0) + return 0; +#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE) + return size + 2 * ZSTD_CWKSP_ASAN_REDZONE_SIZE; +#else + return size; +#endif +} + +/** + * Returns an adjusted alloc size that is the nearest larger multiple of 64 bytes. + * Used to determine the number of bytes required for a given "aligned". + */ +MEM_STATIC size_t ZSTD_cwksp_aligned_alloc_size(size_t size) { + return ZSTD_cwksp_alloc_size(ZSTD_cwksp_align(size, ZSTD_CWKSP_ALIGNMENT_BYTES)); +} + +/** + * Returns the amount of additional space the cwksp must allocate + * for internal purposes (currently only alignment). + */ +MEM_STATIC size_t ZSTD_cwksp_slack_space_required(void) { + /* For alignment, the wksp will always allocate an additional 2*ZSTD_CWKSP_ALIGNMENT_BYTES + * bytes to align the beginning of tables section and end of buffers; + */ + size_t const slackSpace = ZSTD_CWKSP_ALIGNMENT_BYTES * 2; + return slackSpace; +} + + +/** + * Return the number of additional bytes required to align a pointer to the given number of bytes. + * alignBytes must be a power of two. + */ +MEM_STATIC size_t ZSTD_cwksp_bytes_to_align_ptr(void* ptr, const size_t alignBytes) { + size_t const alignBytesMask = alignBytes - 1; + size_t const bytes = (alignBytes - ((size_t)ptr & (alignBytesMask))) & alignBytesMask; + assert((alignBytes & alignBytesMask) == 0); + assert(bytes < alignBytes); + return bytes; +} + +/** + * Returns the initial value for allocStart which is used to determine the position from + * which we can allocate from the end of the workspace. + */ +MEM_STATIC void* ZSTD_cwksp_initialAllocStart(ZSTD_cwksp* ws) { + return (void*)((size_t)ws->workspaceEnd & ~(ZSTD_CWKSP_ALIGNMENT_BYTES-1)); +} + +/** + * Internal function. Do not use directly. + * Reserves the given number of bytes within the aligned/buffer segment of the wksp, + * which counts from the end of the wksp (as opposed to the object/table segment). + * + * Returns a pointer to the beginning of that space. + */ +MEM_STATIC void* +ZSTD_cwksp_reserve_internal_buffer_space(ZSTD_cwksp* ws, size_t const bytes) +{ + void* const alloc = (BYTE*)ws->allocStart - bytes; + void* const bottom = ws->tableEnd; + DEBUGLOG(5, "cwksp: reserving %p %zd bytes, %zd bytes remaining", + alloc, bytes, ZSTD_cwksp_available_space(ws) - bytes); + ZSTD_cwksp_assert_internal_consistency(ws); + assert(alloc >= bottom); + if (alloc < bottom) { + DEBUGLOG(4, "cwksp: alloc failed!"); + ws->allocFailed = 1; + return NULL; + } + /* the area is reserved from the end of wksp. + * If it overlaps with tableValidEnd, it voids guarantees on values' range */ + if (alloc < ws->tableValidEnd) { + ws->tableValidEnd = alloc; + } + ws->allocStart = alloc; + return alloc; +} + +/** + * Moves the cwksp to the next phase, and does any necessary allocations. + * cwksp initialization must necessarily go through each phase in order. + * Returns a 0 on success, or zstd error + */ +MEM_STATIC size_t +ZSTD_cwksp_internal_advance_phase(ZSTD_cwksp* ws, ZSTD_cwksp_alloc_phase_e phase) +{ + assert(phase >= ws->phase); + if (phase > ws->phase) { + /* Going from allocating objects to allocating initOnce / tables */ + if (ws->phase < ZSTD_cwksp_alloc_aligned_init_once && + phase >= ZSTD_cwksp_alloc_aligned_init_once) { + ws->tableValidEnd = ws->objectEnd; + ws->initOnceStart = ZSTD_cwksp_initialAllocStart(ws); + + { /* Align the start of the tables to 64 bytes. Use [0, 63] bytes */ + void *const alloc = ws->objectEnd; + size_t const bytesToAlign = ZSTD_cwksp_bytes_to_align_ptr(alloc, ZSTD_CWKSP_ALIGNMENT_BYTES); + void *const objectEnd = (BYTE *) alloc + bytesToAlign; + DEBUGLOG(5, "reserving table alignment addtl space: %zu", bytesToAlign); + RETURN_ERROR_IF(objectEnd > ws->workspaceEnd, memory_allocation, + "table phase - alignment initial allocation failed!"); + ws->objectEnd = objectEnd; + ws->tableEnd = objectEnd; /* table area starts being empty */ + if (ws->tableValidEnd < ws->tableEnd) { + ws->tableValidEnd = ws->tableEnd; + } + } + } + ws->phase = phase; + ZSTD_cwksp_assert_internal_consistency(ws); + } + return 0; +} + +/** + * Returns whether this object/buffer/etc was allocated in this workspace. + */ +MEM_STATIC int ZSTD_cwksp_owns_buffer(const ZSTD_cwksp* ws, const void* ptr) +{ + return (ptr != NULL) && (ws->workspace <= ptr) && (ptr < ws->workspaceEnd); +} + +/** + * Internal function. Do not use directly. + */ +MEM_STATIC void* +ZSTD_cwksp_reserve_internal(ZSTD_cwksp* ws, size_t bytes, ZSTD_cwksp_alloc_phase_e phase) +{ + void* alloc; + if (ZSTD_isError(ZSTD_cwksp_internal_advance_phase(ws, phase)) || bytes == 0) { + return NULL; + } + +#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE) + /* over-reserve space */ + bytes += 2 * ZSTD_CWKSP_ASAN_REDZONE_SIZE; +#endif + + alloc = ZSTD_cwksp_reserve_internal_buffer_space(ws, bytes); + +#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE) + /* Move alloc so there's ZSTD_CWKSP_ASAN_REDZONE_SIZE unused space on + * either size. */ + if (alloc) { + alloc = (BYTE *)alloc + ZSTD_CWKSP_ASAN_REDZONE_SIZE; + if (ws->isStatic == ZSTD_cwksp_dynamic_alloc) { + /* We need to keep the redzone poisoned while unpoisoning the bytes that + * are actually allocated. */ + __asan_unpoison_memory_region(alloc, bytes - 2 * ZSTD_CWKSP_ASAN_REDZONE_SIZE); + } + } +#endif + + return alloc; +} + +/** + * Reserves and returns unaligned memory. + */ +MEM_STATIC BYTE* ZSTD_cwksp_reserve_buffer(ZSTD_cwksp* ws, size_t bytes) +{ + return (BYTE*)ZSTD_cwksp_reserve_internal(ws, bytes, ZSTD_cwksp_alloc_buffers); +} + +/** + * Reserves and returns memory sized on and aligned on ZSTD_CWKSP_ALIGNMENT_BYTES (64 bytes). + * This memory has been initialized at least once in the past. + * This doesn't mean it has been initialized this time, and it might contain data from previous + * operations. + * The main usage is for algorithms that might need read access into uninitialized memory. + * The algorithm must maintain safety under these conditions and must make sure it doesn't + * leak any of the past data (directly or in side channels). + */ +MEM_STATIC void* ZSTD_cwksp_reserve_aligned_init_once(ZSTD_cwksp* ws, size_t bytes) +{ + size_t const alignedBytes = ZSTD_cwksp_align(bytes, ZSTD_CWKSP_ALIGNMENT_BYTES); + void* ptr = ZSTD_cwksp_reserve_internal(ws, alignedBytes, ZSTD_cwksp_alloc_aligned_init_once); + assert(((size_t)ptr & (ZSTD_CWKSP_ALIGNMENT_BYTES-1))== 0); + if(ptr && ptr < ws->initOnceStart) { + /* We assume the memory following the current allocation is either: + * 1. Not usable as initOnce memory (end of workspace) + * 2. Another initOnce buffer that has been allocated before (and so was previously memset) + * 3. An ASAN redzone, in which case we don't want to write on it + * For these reasons it should be fine to not explicitly zero every byte up to ws->initOnceStart. + * Note that we assume here that MSAN and ASAN cannot run in the same time. */ + ZSTD_memset(ptr, 0, MIN((size_t)((U8*)ws->initOnceStart - (U8*)ptr), alignedBytes)); + ws->initOnceStart = ptr; + } +#if ZSTD_MEMORY_SANITIZER + assert(__msan_test_shadow(ptr, bytes) == -1); +#endif + return ptr; +} + +/** + * Reserves and returns memory sized on and aligned on ZSTD_CWKSP_ALIGNMENT_BYTES (64 bytes). + */ +MEM_STATIC void* ZSTD_cwksp_reserve_aligned(ZSTD_cwksp* ws, size_t bytes) +{ + void* ptr = ZSTD_cwksp_reserve_internal(ws, ZSTD_cwksp_align(bytes, ZSTD_CWKSP_ALIGNMENT_BYTES), + ZSTD_cwksp_alloc_aligned); + assert(((size_t)ptr & (ZSTD_CWKSP_ALIGNMENT_BYTES-1))== 0); + return ptr; +} + +/** + * Aligned on 64 bytes. These buffers have the special property that + * their values remain constrained, allowing us to re-use them without + * memset()-ing them. + */ +MEM_STATIC void* ZSTD_cwksp_reserve_table(ZSTD_cwksp* ws, size_t bytes) +{ + const ZSTD_cwksp_alloc_phase_e phase = ZSTD_cwksp_alloc_aligned_init_once; + void* alloc; + void* end; + void* top; + + /* We can only start allocating tables after we are done reserving space for objects at the + * start of the workspace */ + if(ws->phase < phase) { + if (ZSTD_isError(ZSTD_cwksp_internal_advance_phase(ws, phase))) { + return NULL; + } + } + alloc = ws->tableEnd; + end = (BYTE *)alloc + bytes; + top = ws->allocStart; + + DEBUGLOG(5, "cwksp: reserving %p table %zd bytes, %zd bytes remaining", + alloc, bytes, ZSTD_cwksp_available_space(ws) - bytes); + assert((bytes & (sizeof(U32)-1)) == 0); + ZSTD_cwksp_assert_internal_consistency(ws); + assert(end <= top); + if (end > top) { + DEBUGLOG(4, "cwksp: table alloc failed!"); + ws->allocFailed = 1; + return NULL; + } + ws->tableEnd = end; + +#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE) + if (ws->isStatic == ZSTD_cwksp_dynamic_alloc) { + __asan_unpoison_memory_region(alloc, bytes); + } +#endif + + assert((bytes & (ZSTD_CWKSP_ALIGNMENT_BYTES-1)) == 0); + assert(((size_t)alloc & (ZSTD_CWKSP_ALIGNMENT_BYTES-1))== 0); + return alloc; +} + +/** + * Aligned on sizeof(void*). + * Note : should happen only once, at workspace first initialization + */ +MEM_STATIC void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) +{ + size_t const roundedBytes = ZSTD_cwksp_align(bytes, sizeof(void*)); + void* alloc = ws->objectEnd; + void* end = (BYTE*)alloc + roundedBytes; + +#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE) + /* over-reserve space */ + end = (BYTE *)end + 2 * ZSTD_CWKSP_ASAN_REDZONE_SIZE; +#endif + + DEBUGLOG(4, + "cwksp: reserving %p object %zd bytes (rounded to %zd), %zd bytes remaining", + alloc, bytes, roundedBytes, ZSTD_cwksp_available_space(ws) - roundedBytes); + assert((size_t)alloc % ZSTD_ALIGNOF(void*) == 0); + assert(bytes % ZSTD_ALIGNOF(void*) == 0); + ZSTD_cwksp_assert_internal_consistency(ws); + /* we must be in the first phase, no advance is possible */ + if (ws->phase != ZSTD_cwksp_alloc_objects || end > ws->workspaceEnd) { + DEBUGLOG(3, "cwksp: object alloc failed!"); + ws->allocFailed = 1; + return NULL; + } + ws->objectEnd = end; + ws->tableEnd = end; + ws->tableValidEnd = end; + +#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE) + /* Move alloc so there's ZSTD_CWKSP_ASAN_REDZONE_SIZE unused space on + * either size. */ + alloc = (BYTE*)alloc + ZSTD_CWKSP_ASAN_REDZONE_SIZE; + if (ws->isStatic == ZSTD_cwksp_dynamic_alloc) { + __asan_unpoison_memory_region(alloc, bytes); + } +#endif + + return alloc; +} + +MEM_STATIC void ZSTD_cwksp_mark_tables_dirty(ZSTD_cwksp* ws) +{ + DEBUGLOG(4, "cwksp: ZSTD_cwksp_mark_tables_dirty"); + +#if ZSTD_MEMORY_SANITIZER && !defined (ZSTD_MSAN_DONT_POISON_WORKSPACE) + /* To validate that the table re-use logic is sound, and that we don't + * access table space that we haven't cleaned, we re-"poison" the table + * space every time we mark it dirty. + * Since tableValidEnd space and initOnce space may overlap we don't poison + * the initOnce portion as it break its promise. This means that this poisoning + * check isn't always applied fully. */ + { + size_t size = (BYTE*)ws->tableValidEnd - (BYTE*)ws->objectEnd; + assert(__msan_test_shadow(ws->objectEnd, size) == -1); + if((BYTE*)ws->tableValidEnd < (BYTE*)ws->initOnceStart) { + __msan_poison(ws->objectEnd, size); + } else { + assert(ws->initOnceStart >= ws->objectEnd); + __msan_poison(ws->objectEnd, (BYTE*)ws->initOnceStart - (BYTE*)ws->objectEnd); + } + } +#endif + + assert(ws->tableValidEnd >= ws->objectEnd); + assert(ws->tableValidEnd <= ws->allocStart); + ws->tableValidEnd = ws->objectEnd; + ZSTD_cwksp_assert_internal_consistency(ws); +} + +MEM_STATIC void ZSTD_cwksp_mark_tables_clean(ZSTD_cwksp* ws) { + DEBUGLOG(4, "cwksp: ZSTD_cwksp_mark_tables_clean"); + assert(ws->tableValidEnd >= ws->objectEnd); + assert(ws->tableValidEnd <= ws->allocStart); + if (ws->tableValidEnd < ws->tableEnd) { + ws->tableValidEnd = ws->tableEnd; + } + ZSTD_cwksp_assert_internal_consistency(ws); +} + +/** + * Zero the part of the allocated tables not already marked clean. + */ +MEM_STATIC void ZSTD_cwksp_clean_tables(ZSTD_cwksp* ws) { + DEBUGLOG(4, "cwksp: ZSTD_cwksp_clean_tables"); + assert(ws->tableValidEnd >= ws->objectEnd); + assert(ws->tableValidEnd <= ws->allocStart); + if (ws->tableValidEnd < ws->tableEnd) { + ZSTD_memset(ws->tableValidEnd, 0, (size_t)((BYTE*)ws->tableEnd - (BYTE*)ws->tableValidEnd)); + } + ZSTD_cwksp_mark_tables_clean(ws); +} + +/** + * Invalidates table allocations. + * All other allocations remain valid. + */ +MEM_STATIC void ZSTD_cwksp_clear_tables(ZSTD_cwksp* ws) { + DEBUGLOG(4, "cwksp: clearing tables!"); + +#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE) + /* We don't do this when the workspace is statically allocated, because + * when that is the case, we have no capability to hook into the end of the + * workspace's lifecycle to unpoison the memory. + */ + if (ws->isStatic == ZSTD_cwksp_dynamic_alloc) { + size_t size = (BYTE*)ws->tableValidEnd - (BYTE*)ws->objectEnd; + __asan_poison_memory_region(ws->objectEnd, size); + } +#endif + + ws->tableEnd = ws->objectEnd; + ZSTD_cwksp_assert_internal_consistency(ws); +} + +/** + * Invalidates all buffer, aligned, and table allocations. + * Object allocations remain valid. + */ +MEM_STATIC void ZSTD_cwksp_clear(ZSTD_cwksp* ws) { + DEBUGLOG(4, "cwksp: clearing!"); + +#if ZSTD_MEMORY_SANITIZER && !defined (ZSTD_MSAN_DONT_POISON_WORKSPACE) + /* To validate that the context re-use logic is sound, and that we don't + * access stuff that this compression hasn't initialized, we re-"poison" + * the workspace except for the areas in which we expect memory re-use + * without initialization (objects, valid tables area and init once + * memory). */ + { + if((BYTE*)ws->tableValidEnd < (BYTE*)ws->initOnceStart) { + size_t size = (BYTE*)ws->initOnceStart - (BYTE*)ws->tableValidEnd; + __msan_poison(ws->tableValidEnd, size); + } + } +#endif + +#if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE) + /* We don't do this when the workspace is statically allocated, because + * when that is the case, we have no capability to hook into the end of the + * workspace's lifecycle to unpoison the memory. + */ + if (ws->isStatic == ZSTD_cwksp_dynamic_alloc) { + size_t size = (BYTE*)ws->workspaceEnd - (BYTE*)ws->objectEnd; + __asan_poison_memory_region(ws->objectEnd, size); + } +#endif + + ws->tableEnd = ws->objectEnd; + ws->allocStart = ZSTD_cwksp_initialAllocStart(ws); + ws->allocFailed = 0; + if (ws->phase > ZSTD_cwksp_alloc_aligned_init_once) { + ws->phase = ZSTD_cwksp_alloc_aligned_init_once; + } + ZSTD_cwksp_assert_internal_consistency(ws); +} + +/** + * The provided workspace takes ownership of the buffer [start, start+size). + * Any existing values in the workspace are ignored (the previously managed + * buffer, if present, must be separately freed). + */ +MEM_STATIC void ZSTD_cwksp_init(ZSTD_cwksp* ws, void* start, size_t size, ZSTD_cwksp_static_alloc_e isStatic) { + DEBUGLOG(4, "cwksp: init'ing workspace with %zd bytes", size); + assert(((size_t)start & (sizeof(void*)-1)) == 0); /* ensure correct alignment */ + ws->workspace = start; + ws->workspaceEnd = (BYTE*)start + size; + ws->objectEnd = ws->workspace; + ws->tableValidEnd = ws->objectEnd; + ws->initOnceStart = ZSTD_cwksp_initialAllocStart(ws); + ws->phase = ZSTD_cwksp_alloc_objects; + ws->isStatic = isStatic; + ZSTD_cwksp_clear(ws); + ws->workspaceOversizedDuration = 0; + ZSTD_cwksp_assert_internal_consistency(ws); +} + +MEM_STATIC size_t ZSTD_cwksp_create(ZSTD_cwksp* ws, size_t size, ZSTD_customMem customMem) { + void* workspace = ZSTD_customMalloc(size, customMem); + DEBUGLOG(4, "cwksp: creating new workspace with %zd bytes", size); + RETURN_ERROR_IF(workspace == NULL, memory_allocation, "NULL pointer!"); + ZSTD_cwksp_init(ws, workspace, size, ZSTD_cwksp_dynamic_alloc); + return 0; +} + +MEM_STATIC void ZSTD_cwksp_free(ZSTD_cwksp* ws, ZSTD_customMem customMem) { + void *ptr = ws->workspace; + DEBUGLOG(4, "cwksp: freeing workspace"); + ZSTD_memset(ws, 0, sizeof(ZSTD_cwksp)); + ZSTD_customFree(ptr, customMem); +} + +/** + * Moves the management of a workspace from one cwksp to another. The src cwksp + * is left in an invalid state (src must be re-init()'ed before it's used again). + */ +MEM_STATIC void ZSTD_cwksp_move(ZSTD_cwksp* dst, ZSTD_cwksp* src) { + *dst = *src; + ZSTD_memset(src, 0, sizeof(ZSTD_cwksp)); +} + +MEM_STATIC size_t ZSTD_cwksp_sizeof(const ZSTD_cwksp* ws) { + return (size_t)((BYTE*)ws->workspaceEnd - (BYTE*)ws->workspace); +} + +MEM_STATIC size_t ZSTD_cwksp_used(const ZSTD_cwksp* ws) { + return (size_t)((BYTE*)ws->tableEnd - (BYTE*)ws->workspace) + + (size_t)((BYTE*)ws->workspaceEnd - (BYTE*)ws->allocStart); +} + +MEM_STATIC int ZSTD_cwksp_reserve_failed(const ZSTD_cwksp* ws) { + return ws->allocFailed; +} + +/*-************************************* +* Functions Checking Free Space +***************************************/ + +/* ZSTD_alignmentSpaceWithinBounds() : + * Returns if the estimated space needed for a wksp is within an acceptable limit of the + * actual amount of space used. + */ +MEM_STATIC int ZSTD_cwksp_estimated_space_within_bounds(const ZSTD_cwksp *const ws, size_t const estimatedSpace) { + /* We have an alignment space between objects and tables between tables and buffers, so we can have up to twice + * the alignment bytes difference between estimation and actual usage */ + return (estimatedSpace - ZSTD_cwksp_slack_space_required()) <= ZSTD_cwksp_used(ws) && + ZSTD_cwksp_used(ws) <= estimatedSpace; +} + + +MEM_STATIC size_t ZSTD_cwksp_available_space(ZSTD_cwksp* ws) { + return (size_t)((BYTE*)ws->allocStart - (BYTE*)ws->tableEnd); +} + +MEM_STATIC int ZSTD_cwksp_check_available(ZSTD_cwksp* ws, size_t additionalNeededSpace) { + return ZSTD_cwksp_available_space(ws) >= additionalNeededSpace; +} + +MEM_STATIC int ZSTD_cwksp_check_too_large(ZSTD_cwksp* ws, size_t additionalNeededSpace) { + return ZSTD_cwksp_check_available( + ws, additionalNeededSpace * ZSTD_WORKSPACETOOLARGE_FACTOR); +} + +MEM_STATIC int ZSTD_cwksp_check_wasteful(ZSTD_cwksp* ws, size_t additionalNeededSpace) { + return ZSTD_cwksp_check_too_large(ws, additionalNeededSpace) + && ws->workspaceOversizedDuration > ZSTD_WORKSPACETOOLARGE_MAXDURATION; +} + +MEM_STATIC void ZSTD_cwksp_bump_oversized_duration( + ZSTD_cwksp* ws, size_t additionalNeededSpace) { + if (ZSTD_cwksp_check_too_large(ws, additionalNeededSpace)) { + ws->workspaceOversizedDuration++; + } else { + ws->workspaceOversizedDuration = 0; + } +} + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_CWKSP_H */ +/**** ended inlining zstd_cwksp.h ****/ +#ifdef ZSTD_MULTITHREAD +/**** start inlining zstdmt_compress.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + #ifndef ZSTDMT_COMPRESS_H + #define ZSTDMT_COMPRESS_H + + #if defined (__cplusplus) + extern "C" { + #endif + + +/* Note : This is an internal API. + * These APIs used to be exposed with ZSTDLIB_API, + * because it used to be the only way to invoke MT compression. + * Now, you must use ZSTD_compress2 and ZSTD_compressStream2() instead. + * + * This API requires ZSTD_MULTITHREAD to be defined during compilation, + * otherwise ZSTDMT_createCCtx*() will fail. + */ + +/* === Dependencies === */ +/**** skipping file: ../common/zstd_deps.h ****/ +#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_parameters */ +/**** skipping file: ../zstd.h ****/ + + +/* === Constants === */ +#ifndef ZSTDMT_NBWORKERS_MAX /* a different value can be selected at compile time */ +# define ZSTDMT_NBWORKERS_MAX ((sizeof(void*)==4) /*32-bit*/ ? 64 : 256) +#endif +#ifndef ZSTDMT_JOBSIZE_MIN /* a different value can be selected at compile time */ +# define ZSTDMT_JOBSIZE_MIN (512 KB) +#endif +#define ZSTDMT_JOBLOG_MAX (MEM_32bits() ? 29 : 30) +#define ZSTDMT_JOBSIZE_MAX (MEM_32bits() ? (512 MB) : (1024 MB)) + + +/* ======================================================== + * === Private interface, for use by ZSTD_compress.c === + * === Not exposed in libzstd. Never invoke directly === + * ======================================================== */ + +/* === Memory management === */ +typedef struct ZSTDMT_CCtx_s ZSTDMT_CCtx; +/* Requires ZSTD_MULTITHREAD to be defined during compilation, otherwise it will return NULL. */ +ZSTDMT_CCtx* ZSTDMT_createCCtx_advanced(unsigned nbWorkers, + ZSTD_customMem cMem, + ZSTD_threadPool *pool); +size_t ZSTDMT_freeCCtx(ZSTDMT_CCtx* mtctx); + +size_t ZSTDMT_sizeof_CCtx(ZSTDMT_CCtx* mtctx); + +/* === Streaming functions === */ + +size_t ZSTDMT_nextInputSizeHint(const ZSTDMT_CCtx* mtctx); + +/*! ZSTDMT_initCStream_internal() : + * Private use only. Init streaming operation. + * expects params to be valid. + * must receive dict, or cdict, or none, but not both. + * mtctx can be freshly constructed or reused from a prior compression. + * If mtctx is reused, memory allocations from the prior compression may not be freed, + * even if they are not needed for the current compression. + * @return : 0, or an error code */ +size_t ZSTDMT_initCStream_internal(ZSTDMT_CCtx* mtctx, + const void* dict, size_t dictSize, ZSTD_dictContentType_e dictContentType, + const ZSTD_CDict* cdict, + ZSTD_CCtx_params params, unsigned long long pledgedSrcSize); + +/*! ZSTDMT_compressStream_generic() : + * Combines ZSTDMT_compressStream() with optional ZSTDMT_flushStream() or ZSTDMT_endStream() + * depending on flush directive. + * @return : minimum amount of data still to be flushed + * 0 if fully flushed + * or an error code + * note : needs to be init using any ZSTD_initCStream*() variant */ +size_t ZSTDMT_compressStream_generic(ZSTDMT_CCtx* mtctx, + ZSTD_outBuffer* output, + ZSTD_inBuffer* input, + ZSTD_EndDirective endOp); + + /*! ZSTDMT_toFlushNow() + * Tell how many bytes are ready to be flushed immediately. + * Probe the oldest active job (not yet entirely flushed) and check its output buffer. + * If return 0, it means there is no active job, + * or, it means oldest job is still active, but everything produced has been flushed so far, + * therefore flushing is limited by speed of oldest job. */ +size_t ZSTDMT_toFlushNow(ZSTDMT_CCtx* mtctx); + +/*! ZSTDMT_updateCParams_whileCompressing() : + * Updates only a selected set of compression parameters, to remain compatible with current frame. + * New parameters will be applied to next compression job. */ +void ZSTDMT_updateCParams_whileCompressing(ZSTDMT_CCtx* mtctx, const ZSTD_CCtx_params* cctxParams); + +/*! ZSTDMT_getFrameProgression(): + * tells how much data has been consumed (input) and produced (output) for current frame. + * able to count progression inside worker threads. + */ +ZSTD_frameProgression ZSTDMT_getFrameProgression(ZSTDMT_CCtx* mtctx); + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTDMT_COMPRESS_H */ +/**** ended inlining zstdmt_compress.h ****/ +#endif +/**** skipping file: ../common/bits.h ****/ + +#if defined (__cplusplus) +extern "C" { +#endif + +/*-************************************* +* Constants +***************************************/ +#define kSearchStrength 8 +#define HASH_READ_SIZE 8 +#define ZSTD_DUBT_UNSORTED_MARK 1 /* For btlazy2 strategy, index ZSTD_DUBT_UNSORTED_MARK==1 means "unsorted". + It could be confused for a real successor at index "1", if sorted as larger than its predecessor. + It's not a big deal though : candidate will just be sorted again. + Additionally, candidate position 1 will be lost. + But candidate 1 cannot hide a large tree of candidates, so it's a minimal loss. + The benefit is that ZSTD_DUBT_UNSORTED_MARK cannot be mishandled after table re-use with a different strategy. + This constant is required by ZSTD_compressBlock_btlazy2() and ZSTD_reduceTable_internal() */ + + +/*-************************************* +* Context memory management +***************************************/ +typedef enum { ZSTDcs_created=0, ZSTDcs_init, ZSTDcs_ongoing, ZSTDcs_ending } ZSTD_compressionStage_e; +typedef enum { zcss_init=0, zcss_load, zcss_flush } ZSTD_cStreamStage; + +typedef struct ZSTD_prefixDict_s { + const void* dict; + size_t dictSize; + ZSTD_dictContentType_e dictContentType; +} ZSTD_prefixDict; + +typedef struct { + void* dictBuffer; + void const* dict; + size_t dictSize; + ZSTD_dictContentType_e dictContentType; + ZSTD_CDict* cdict; +} ZSTD_localDict; + +typedef struct { + HUF_CElt CTable[HUF_CTABLE_SIZE_ST(255)]; + HUF_repeat repeatMode; +} ZSTD_hufCTables_t; + +typedef struct { + FSE_CTable offcodeCTable[FSE_CTABLE_SIZE_U32(OffFSELog, MaxOff)]; + FSE_CTable matchlengthCTable[FSE_CTABLE_SIZE_U32(MLFSELog, MaxML)]; + FSE_CTable litlengthCTable[FSE_CTABLE_SIZE_U32(LLFSELog, MaxLL)]; + FSE_repeat offcode_repeatMode; + FSE_repeat matchlength_repeatMode; + FSE_repeat litlength_repeatMode; +} ZSTD_fseCTables_t; + +typedef struct { + ZSTD_hufCTables_t huf; + ZSTD_fseCTables_t fse; +} ZSTD_entropyCTables_t; + +/*********************************************** +* Entropy buffer statistics structs and funcs * +***********************************************/ +/** ZSTD_hufCTablesMetadata_t : + * Stores Literals Block Type for a super-block in hType, and + * huffman tree description in hufDesBuffer. + * hufDesSize refers to the size of huffman tree description in bytes. + * This metadata is populated in ZSTD_buildBlockEntropyStats_literals() */ +typedef struct { + symbolEncodingType_e hType; + BYTE hufDesBuffer[ZSTD_MAX_HUF_HEADER_SIZE]; + size_t hufDesSize; +} ZSTD_hufCTablesMetadata_t; + +/** ZSTD_fseCTablesMetadata_t : + * Stores symbol compression modes for a super-block in {ll, ol, ml}Type, and + * fse tables in fseTablesBuffer. + * fseTablesSize refers to the size of fse tables in bytes. + * This metadata is populated in ZSTD_buildBlockEntropyStats_sequences() */ +typedef struct { + symbolEncodingType_e llType; + symbolEncodingType_e ofType; + symbolEncodingType_e mlType; + BYTE fseTablesBuffer[ZSTD_MAX_FSE_HEADERS_SIZE]; + size_t fseTablesSize; + size_t lastCountSize; /* This is to account for bug in 1.3.4. More detail in ZSTD_entropyCompressSeqStore_internal() */ +} ZSTD_fseCTablesMetadata_t; + +typedef struct { + ZSTD_hufCTablesMetadata_t hufMetadata; + ZSTD_fseCTablesMetadata_t fseMetadata; +} ZSTD_entropyCTablesMetadata_t; + +/** ZSTD_buildBlockEntropyStats() : + * Builds entropy for the block. + * @return : 0 on success or error code */ +size_t ZSTD_buildBlockEntropyStats( + const seqStore_t* seqStorePtr, + const ZSTD_entropyCTables_t* prevEntropy, + ZSTD_entropyCTables_t* nextEntropy, + const ZSTD_CCtx_params* cctxParams, + ZSTD_entropyCTablesMetadata_t* entropyMetadata, + void* workspace, size_t wkspSize); + +/********************************* +* Compression internals structs * +*********************************/ + +typedef struct { + U32 off; /* Offset sumtype code for the match, using ZSTD_storeSeq() format */ + U32 len; /* Raw length of match */ +} ZSTD_match_t; + +typedef struct { + U32 offset; /* Offset of sequence */ + U32 litLength; /* Length of literals prior to match */ + U32 matchLength; /* Raw length of match */ +} rawSeq; + +typedef struct { + rawSeq* seq; /* The start of the sequences */ + size_t pos; /* The index in seq where reading stopped. pos <= size. */ + size_t posInSequence; /* The position within the sequence at seq[pos] where reading + stopped. posInSequence <= seq[pos].litLength + seq[pos].matchLength */ + size_t size; /* The number of sequences. <= capacity. */ + size_t capacity; /* The capacity starting from `seq` pointer */ +} rawSeqStore_t; + +typedef struct { + U32 idx; /* Index in array of ZSTD_Sequence */ + U32 posInSequence; /* Position within sequence at idx */ + size_t posInSrc; /* Number of bytes given by sequences provided so far */ +} ZSTD_sequencePosition; + +UNUSED_ATTR static const rawSeqStore_t kNullRawSeqStore = {NULL, 0, 0, 0, 0}; + +typedef struct { + int price; + U32 off; + U32 mlen; + U32 litlen; + U32 rep[ZSTD_REP_NUM]; +} ZSTD_optimal_t; + +typedef enum { zop_dynamic=0, zop_predef } ZSTD_OptPrice_e; + +typedef struct { + /* All tables are allocated inside cctx->workspace by ZSTD_resetCCtx_internal() */ + unsigned* litFreq; /* table of literals statistics, of size 256 */ + unsigned* litLengthFreq; /* table of litLength statistics, of size (MaxLL+1) */ + unsigned* matchLengthFreq; /* table of matchLength statistics, of size (MaxML+1) */ + unsigned* offCodeFreq; /* table of offCode statistics, of size (MaxOff+1) */ + ZSTD_match_t* matchTable; /* list of found matches, of size ZSTD_OPT_NUM+1 */ + ZSTD_optimal_t* priceTable; /* All positions tracked by optimal parser, of size ZSTD_OPT_NUM+1 */ + + U32 litSum; /* nb of literals */ + U32 litLengthSum; /* nb of litLength codes */ + U32 matchLengthSum; /* nb of matchLength codes */ + U32 offCodeSum; /* nb of offset codes */ + U32 litSumBasePrice; /* to compare to log2(litfreq) */ + U32 litLengthSumBasePrice; /* to compare to log2(llfreq) */ + U32 matchLengthSumBasePrice;/* to compare to log2(mlfreq) */ + U32 offCodeSumBasePrice; /* to compare to log2(offreq) */ + ZSTD_OptPrice_e priceType; /* prices can be determined dynamically, or follow a pre-defined cost structure */ + const ZSTD_entropyCTables_t* symbolCosts; /* pre-calculated dictionary statistics */ + ZSTD_paramSwitch_e literalCompressionMode; +} optState_t; + +typedef struct { + ZSTD_entropyCTables_t entropy; + U32 rep[ZSTD_REP_NUM]; +} ZSTD_compressedBlockState_t; + +typedef struct { + BYTE const* nextSrc; /* next block here to continue on current prefix */ + BYTE const* base; /* All regular indexes relative to this position */ + BYTE const* dictBase; /* extDict indexes relative to this position */ + U32 dictLimit; /* below that point, need extDict */ + U32 lowLimit; /* below that point, no more valid data */ + U32 nbOverflowCorrections; /* Number of times overflow correction has run since + * ZSTD_window_init(). Useful for debugging coredumps + * and for ZSTD_WINDOW_OVERFLOW_CORRECT_FREQUENTLY. + */ +} ZSTD_window_t; + +#define ZSTD_WINDOW_START_INDEX 2 + +typedef struct ZSTD_matchState_t ZSTD_matchState_t; + +#define ZSTD_ROW_HASH_CACHE_SIZE 8 /* Size of prefetching hash cache for row-based matchfinder */ + +struct ZSTD_matchState_t { + ZSTD_window_t window; /* State for window round buffer management */ + U32 loadedDictEnd; /* index of end of dictionary, within context's referential. + * When loadedDictEnd != 0, a dictionary is in use, and still valid. + * This relies on a mechanism to set loadedDictEnd=0 when dictionary is no longer within distance. + * Such mechanism is provided within ZSTD_window_enforceMaxDist() and ZSTD_checkDictValidity(). + * When dict referential is copied into active context (i.e. not attached), + * loadedDictEnd == dictSize, since referential starts from zero. + */ + U32 nextToUpdate; /* index from which to continue table update */ + U32 hashLog3; /* dispatch table for matches of len==3 : larger == faster, more memory */ + + U32 rowHashLog; /* For row-based matchfinder: Hashlog based on nb of rows in the hashTable.*/ + BYTE* tagTable; /* For row-based matchFinder: A row-based table containing the hashes and head index. */ + U32 hashCache[ZSTD_ROW_HASH_CACHE_SIZE]; /* For row-based matchFinder: a cache of hashes to improve speed */ + U64 hashSalt; /* For row-based matchFinder: salts the hash for re-use of tag table */ + U32 hashSaltEntropy; /* For row-based matchFinder: collects entropy for salt generation */ + + U32* hashTable; + U32* hashTable3; + U32* chainTable; + + U32 forceNonContiguous; /* Non-zero if we should force non-contiguous load for the next window update. */ + + int dedicatedDictSearch; /* Indicates whether this matchState is using the + * dedicated dictionary search structure. + */ + optState_t opt; /* optimal parser state */ + const ZSTD_matchState_t* dictMatchState; + ZSTD_compressionParameters cParams; + const rawSeqStore_t* ldmSeqStore; + + /* Controls prefetching in some dictMatchState matchfinders. + * This behavior is controlled from the cctx ms. + * This parameter has no effect in the cdict ms. */ + int prefetchCDictTables; + + /* When == 0, lazy match finders insert every position. + * When != 0, lazy match finders only insert positions they search. + * This allows them to skip much faster over incompressible data, + * at a small cost to compression ratio. + */ + int lazySkipping; +}; + +typedef struct { + ZSTD_compressedBlockState_t* prevCBlock; + ZSTD_compressedBlockState_t* nextCBlock; + ZSTD_matchState_t matchState; +} ZSTD_blockState_t; + +typedef struct { + U32 offset; + U32 checksum; +} ldmEntry_t; + +typedef struct { + BYTE const* split; + U32 hash; + U32 checksum; + ldmEntry_t* bucket; +} ldmMatchCandidate_t; + +#define LDM_BATCH_SIZE 64 + +typedef struct { + ZSTD_window_t window; /* State for the window round buffer management */ + ldmEntry_t* hashTable; + U32 loadedDictEnd; + BYTE* bucketOffsets; /* Next position in bucket to insert entry */ + size_t splitIndices[LDM_BATCH_SIZE]; + ldmMatchCandidate_t matchCandidates[LDM_BATCH_SIZE]; +} ldmState_t; + +typedef struct { + ZSTD_paramSwitch_e enableLdm; /* ZSTD_ps_enable to enable LDM. ZSTD_ps_auto by default */ + U32 hashLog; /* Log size of hashTable */ + U32 bucketSizeLog; /* Log bucket size for collision resolution, at most 8 */ + U32 minMatchLength; /* Minimum match length */ + U32 hashRateLog; /* Log number of entries to skip */ + U32 windowLog; /* Window log for the LDM */ +} ldmParams_t; + +typedef struct { + int collectSequences; + ZSTD_Sequence* seqStart; + size_t seqIndex; + size_t maxSequences; +} SeqCollector; + +struct ZSTD_CCtx_params_s { + ZSTD_format_e format; + ZSTD_compressionParameters cParams; + ZSTD_frameParameters fParams; + + int compressionLevel; + int forceWindow; /* force back-references to respect limit of + * 1< 63) ? ZSTD_highbit32(litLength) + LL_deltaCode : LL_Code[litLength]; +} + +/* ZSTD_MLcode() : + * note : mlBase = matchLength - MINMATCH; + * because it's the format it's stored in seqStore->sequences */ +MEM_STATIC U32 ZSTD_MLcode(U32 mlBase) +{ + static const BYTE ML_Code[128] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, + 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; + static const U32 ML_deltaCode = 36; + return (mlBase > 127) ? ZSTD_highbit32(mlBase) + ML_deltaCode : ML_Code[mlBase]; +} + +/* ZSTD_cParam_withinBounds: + * @return 1 if value is within cParam bounds, + * 0 otherwise */ +MEM_STATIC int ZSTD_cParam_withinBounds(ZSTD_cParameter cParam, int value) +{ + ZSTD_bounds const bounds = ZSTD_cParam_getBounds(cParam); + if (ZSTD_isError(bounds.error)) return 0; + if (value < bounds.lowerBound) return 0; + if (value > bounds.upperBound) return 0; + return 1; +} + +/* ZSTD_noCompressBlock() : + * Writes uncompressed block to dst buffer from given src. + * Returns the size of the block */ +MEM_STATIC size_t +ZSTD_noCompressBlock(void* dst, size_t dstCapacity, const void* src, size_t srcSize, U32 lastBlock) +{ + U32 const cBlockHeader24 = lastBlock + (((U32)bt_raw)<<1) + (U32)(srcSize << 3); + DEBUGLOG(5, "ZSTD_noCompressBlock (srcSize=%zu, dstCapacity=%zu)", srcSize, dstCapacity); + RETURN_ERROR_IF(srcSize + ZSTD_blockHeaderSize > dstCapacity, + dstSize_tooSmall, "dst buf too small for uncompressed block"); + MEM_writeLE24(dst, cBlockHeader24); + ZSTD_memcpy((BYTE*)dst + ZSTD_blockHeaderSize, src, srcSize); + return ZSTD_blockHeaderSize + srcSize; +} + +MEM_STATIC size_t +ZSTD_rleCompressBlock(void* dst, size_t dstCapacity, BYTE src, size_t srcSize, U32 lastBlock) +{ + BYTE* const op = (BYTE*)dst; + U32 const cBlockHeader = lastBlock + (((U32)bt_rle)<<1) + (U32)(srcSize << 3); + RETURN_ERROR_IF(dstCapacity < 4, dstSize_tooSmall, ""); + MEM_writeLE24(op, cBlockHeader); + op[3] = src; + return 4; +} + + +/* ZSTD_minGain() : + * minimum compression required + * to generate a compress block or a compressed literals section. + * note : use same formula for both situations */ +MEM_STATIC size_t ZSTD_minGain(size_t srcSize, ZSTD_strategy strat) +{ + U32 const minlog = (strat>=ZSTD_btultra) ? (U32)(strat) - 1 : 6; + ZSTD_STATIC_ASSERT(ZSTD_btultra == 8); + assert(ZSTD_cParam_withinBounds(ZSTD_c_strategy, (int)strat)); + return (srcSize >> minlog) + 2; +} + +MEM_STATIC int ZSTD_literalsCompressionIsDisabled(const ZSTD_CCtx_params* cctxParams) +{ + switch (cctxParams->literalCompressionMode) { + case ZSTD_ps_enable: + return 0; + case ZSTD_ps_disable: + return 1; + default: + assert(0 /* impossible: pre-validated */); + ZSTD_FALLTHROUGH; + case ZSTD_ps_auto: + return (cctxParams->cParams.strategy == ZSTD_fast) && (cctxParams->cParams.targetLength > 0); + } +} + +/*! ZSTD_safecopyLiterals() : + * memcpy() function that won't read beyond more than WILDCOPY_OVERLENGTH bytes past ilimit_w. + * Only called when the sequence ends past ilimit_w, so it only needs to be optimized for single + * large copies. + */ +static void +ZSTD_safecopyLiterals(BYTE* op, BYTE const* ip, BYTE const* const iend, BYTE const* ilimit_w) +{ + assert(iend > ilimit_w); + if (ip <= ilimit_w) { + ZSTD_wildcopy(op, ip, ilimit_w - ip, ZSTD_no_overlap); + op += ilimit_w - ip; + ip = ilimit_w; + } + while (ip < iend) *op++ = *ip++; +} + + +#define REPCODE1_TO_OFFBASE REPCODE_TO_OFFBASE(1) +#define REPCODE2_TO_OFFBASE REPCODE_TO_OFFBASE(2) +#define REPCODE3_TO_OFFBASE REPCODE_TO_OFFBASE(3) +#define REPCODE_TO_OFFBASE(r) (assert((r)>=1), assert((r)<=ZSTD_REP_NUM), (r)) /* accepts IDs 1,2,3 */ +#define OFFSET_TO_OFFBASE(o) (assert((o)>0), o + ZSTD_REP_NUM) +#define OFFBASE_IS_OFFSET(o) ((o) > ZSTD_REP_NUM) +#define OFFBASE_IS_REPCODE(o) ( 1 <= (o) && (o) <= ZSTD_REP_NUM) +#define OFFBASE_TO_OFFSET(o) (assert(OFFBASE_IS_OFFSET(o)), (o) - ZSTD_REP_NUM) +#define OFFBASE_TO_REPCODE(o) (assert(OFFBASE_IS_REPCODE(o)), (o)) /* returns ID 1,2,3 */ + +/*! ZSTD_storeSeq() : + * Store a sequence (litlen, litPtr, offBase and matchLength) into seqStore_t. + * @offBase : Users should employ macros REPCODE_TO_OFFBASE() and OFFSET_TO_OFFBASE(). + * @matchLength : must be >= MINMATCH + * Allowed to over-read literals up to litLimit. +*/ +HINT_INLINE UNUSED_ATTR void +ZSTD_storeSeq(seqStore_t* seqStorePtr, + size_t litLength, const BYTE* literals, const BYTE* litLimit, + U32 offBase, + size_t matchLength) +{ + BYTE const* const litLimit_w = litLimit - WILDCOPY_OVERLENGTH; + BYTE const* const litEnd = literals + litLength; +#if defined(DEBUGLEVEL) && (DEBUGLEVEL >= 6) + static const BYTE* g_start = NULL; + if (g_start==NULL) g_start = (const BYTE*)literals; /* note : index only works for compression within a single segment */ + { U32 const pos = (U32)((const BYTE*)literals - g_start); + DEBUGLOG(6, "Cpos%7u :%3u literals, match%4u bytes at offBase%7u", + pos, (U32)litLength, (U32)matchLength, (U32)offBase); + } +#endif + assert((size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart) < seqStorePtr->maxNbSeq); + /* copy Literals */ + assert(seqStorePtr->maxNbLit <= 128 KB); + assert(seqStorePtr->lit + litLength <= seqStorePtr->litStart + seqStorePtr->maxNbLit); + assert(literals + litLength <= litLimit); + if (litEnd <= litLimit_w) { + /* Common case we can use wildcopy. + * First copy 16 bytes, because literals are likely short. + */ + ZSTD_STATIC_ASSERT(WILDCOPY_OVERLENGTH >= 16); + ZSTD_copy16(seqStorePtr->lit, literals); + if (litLength > 16) { + ZSTD_wildcopy(seqStorePtr->lit+16, literals+16, (ptrdiff_t)litLength-16, ZSTD_no_overlap); + } + } else { + ZSTD_safecopyLiterals(seqStorePtr->lit, literals, litEnd, litLimit_w); + } + seqStorePtr->lit += litLength; + + /* literal Length */ + if (litLength>0xFFFF) { + assert(seqStorePtr->longLengthType == ZSTD_llt_none); /* there can only be a single long length */ + seqStorePtr->longLengthType = ZSTD_llt_literalLength; + seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart); + } + seqStorePtr->sequences[0].litLength = (U16)litLength; + + /* match offset */ + seqStorePtr->sequences[0].offBase = offBase; + + /* match Length */ + assert(matchLength >= MINMATCH); + { size_t const mlBase = matchLength - MINMATCH; + if (mlBase>0xFFFF) { + assert(seqStorePtr->longLengthType == ZSTD_llt_none); /* there can only be a single long length */ + seqStorePtr->longLengthType = ZSTD_llt_matchLength; + seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart); + } + seqStorePtr->sequences[0].mlBase = (U16)mlBase; + } + + seqStorePtr->sequences++; +} + +/* ZSTD_updateRep() : + * updates in-place @rep (array of repeat offsets) + * @offBase : sum-type, using numeric representation of ZSTD_storeSeq() + */ +MEM_STATIC void +ZSTD_updateRep(U32 rep[ZSTD_REP_NUM], U32 const offBase, U32 const ll0) +{ + if (OFFBASE_IS_OFFSET(offBase)) { /* full offset */ + rep[2] = rep[1]; + rep[1] = rep[0]; + rep[0] = OFFBASE_TO_OFFSET(offBase); + } else { /* repcode */ + U32 const repCode = OFFBASE_TO_REPCODE(offBase) - 1 + ll0; + if (repCode > 0) { /* note : if repCode==0, no change */ + U32 const currentOffset = (repCode==ZSTD_REP_NUM) ? (rep[0] - 1) : rep[repCode]; + rep[2] = (repCode >= 2) ? rep[1] : rep[2]; + rep[1] = rep[0]; + rep[0] = currentOffset; + } else { /* repCode == 0 */ + /* nothing to do */ + } + } +} + +typedef struct repcodes_s { + U32 rep[3]; +} repcodes_t; + +MEM_STATIC repcodes_t +ZSTD_newRep(U32 const rep[ZSTD_REP_NUM], U32 const offBase, U32 const ll0) +{ + repcodes_t newReps; + ZSTD_memcpy(&newReps, rep, sizeof(newReps)); + ZSTD_updateRep(newReps.rep, offBase, ll0); + return newReps; +} + + +/*-************************************* +* Match length counter +***************************************/ +MEM_STATIC size_t ZSTD_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* const pInLimit) +{ + const BYTE* const pStart = pIn; + const BYTE* const pInLoopLimit = pInLimit - (sizeof(size_t)-1); + + if (pIn < pInLoopLimit) { + { size_t const diff = MEM_readST(pMatch) ^ MEM_readST(pIn); + if (diff) return ZSTD_NbCommonBytes(diff); } + pIn+=sizeof(size_t); pMatch+=sizeof(size_t); + while (pIn < pInLoopLimit) { + size_t const diff = MEM_readST(pMatch) ^ MEM_readST(pIn); + if (!diff) { pIn+=sizeof(size_t); pMatch+=sizeof(size_t); continue; } + pIn += ZSTD_NbCommonBytes(diff); + return (size_t)(pIn - pStart); + } } + if (MEM_64bits() && (pIn<(pInLimit-3)) && (MEM_read32(pMatch) == MEM_read32(pIn))) { pIn+=4; pMatch+=4; } + if ((pIn<(pInLimit-1)) && (MEM_read16(pMatch) == MEM_read16(pIn))) { pIn+=2; pMatch+=2; } + if ((pIn> (32-h) ; } +MEM_STATIC size_t ZSTD_hash3Ptr(const void* ptr, U32 h) { return ZSTD_hash3(MEM_readLE32(ptr), h, 0); } /* only in zstd_opt.h */ +MEM_STATIC size_t ZSTD_hash3PtrS(const void* ptr, U32 h, U32 s) { return ZSTD_hash3(MEM_readLE32(ptr), h, s); } + +static const U32 prime4bytes = 2654435761U; +static U32 ZSTD_hash4(U32 u, U32 h, U32 s) { assert(h <= 32); return ((u * prime4bytes) ^ s) >> (32-h) ; } +static size_t ZSTD_hash4Ptr(const void* ptr, U32 h) { return ZSTD_hash4(MEM_readLE32(ptr), h, 0); } +static size_t ZSTD_hash4PtrS(const void* ptr, U32 h, U32 s) { return ZSTD_hash4(MEM_readLE32(ptr), h, s); } + +static const U64 prime5bytes = 889523592379ULL; +static size_t ZSTD_hash5(U64 u, U32 h, U64 s) { assert(h <= 64); return (size_t)((((u << (64-40)) * prime5bytes) ^ s) >> (64-h)) ; } +static size_t ZSTD_hash5Ptr(const void* p, U32 h) { return ZSTD_hash5(MEM_readLE64(p), h, 0); } +static size_t ZSTD_hash5PtrS(const void* p, U32 h, U64 s) { return ZSTD_hash5(MEM_readLE64(p), h, s); } + +static const U64 prime6bytes = 227718039650203ULL; +static size_t ZSTD_hash6(U64 u, U32 h, U64 s) { assert(h <= 64); return (size_t)((((u << (64-48)) * prime6bytes) ^ s) >> (64-h)) ; } +static size_t ZSTD_hash6Ptr(const void* p, U32 h) { return ZSTD_hash6(MEM_readLE64(p), h, 0); } +static size_t ZSTD_hash6PtrS(const void* p, U32 h, U64 s) { return ZSTD_hash6(MEM_readLE64(p), h, s); } + +static const U64 prime7bytes = 58295818150454627ULL; +static size_t ZSTD_hash7(U64 u, U32 h, U64 s) { assert(h <= 64); return (size_t)((((u << (64-56)) * prime7bytes) ^ s) >> (64-h)) ; } +static size_t ZSTD_hash7Ptr(const void* p, U32 h) { return ZSTD_hash7(MEM_readLE64(p), h, 0); } +static size_t ZSTD_hash7PtrS(const void* p, U32 h, U64 s) { return ZSTD_hash7(MEM_readLE64(p), h, s); } + +static const U64 prime8bytes = 0xCF1BBCDCB7A56463ULL; +static size_t ZSTD_hash8(U64 u, U32 h, U64 s) { assert(h <= 64); return (size_t)((((u) * prime8bytes) ^ s) >> (64-h)) ; } +static size_t ZSTD_hash8Ptr(const void* p, U32 h) { return ZSTD_hash8(MEM_readLE64(p), h, 0); } +static size_t ZSTD_hash8PtrS(const void* p, U32 h, U64 s) { return ZSTD_hash8(MEM_readLE64(p), h, s); } + + +MEM_STATIC FORCE_INLINE_ATTR +size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls) +{ + /* Although some of these hashes do support hBits up to 64, some do not. + * To be on the safe side, always avoid hBits > 32. */ + assert(hBits <= 32); + + switch(mls) + { + default: + case 4: return ZSTD_hash4Ptr(p, hBits); + case 5: return ZSTD_hash5Ptr(p, hBits); + case 6: return ZSTD_hash6Ptr(p, hBits); + case 7: return ZSTD_hash7Ptr(p, hBits); + case 8: return ZSTD_hash8Ptr(p, hBits); + } +} + +MEM_STATIC FORCE_INLINE_ATTR +size_t ZSTD_hashPtrSalted(const void* p, U32 hBits, U32 mls, const U64 hashSalt) { + /* Although some of these hashes do support hBits up to 64, some do not. + * To be on the safe side, always avoid hBits > 32. */ + assert(hBits <= 32); + + switch(mls) + { + default: + case 4: return ZSTD_hash4PtrS(p, hBits, (U32)hashSalt); + case 5: return ZSTD_hash5PtrS(p, hBits, hashSalt); + case 6: return ZSTD_hash6PtrS(p, hBits, hashSalt); + case 7: return ZSTD_hash7PtrS(p, hBits, hashSalt); + case 8: return ZSTD_hash8PtrS(p, hBits, hashSalt); + } +} + + +/** ZSTD_ipow() : + * Return base^exponent. + */ +static U64 ZSTD_ipow(U64 base, U64 exponent) +{ + U64 power = 1; + while (exponent) { + if (exponent & 1) power *= base; + exponent >>= 1; + base *= base; + } + return power; +} + +#define ZSTD_ROLL_HASH_CHAR_OFFSET 10 + +/** ZSTD_rollingHash_append() : + * Add the buffer to the hash value. + */ +static U64 ZSTD_rollingHash_append(U64 hash, void const* buf, size_t size) +{ + BYTE const* istart = (BYTE const*)buf; + size_t pos; + for (pos = 0; pos < size; ++pos) { + hash *= prime8bytes; + hash += istart[pos] + ZSTD_ROLL_HASH_CHAR_OFFSET; + } + return hash; +} + +/** ZSTD_rollingHash_compute() : + * Compute the rolling hash value of the buffer. + */ +MEM_STATIC U64 ZSTD_rollingHash_compute(void const* buf, size_t size) +{ + return ZSTD_rollingHash_append(0, buf, size); +} + +/** ZSTD_rollingHash_primePower() : + * Compute the primePower to be passed to ZSTD_rollingHash_rotate() for a hash + * over a window of length bytes. + */ +MEM_STATIC U64 ZSTD_rollingHash_primePower(U32 length) +{ + return ZSTD_ipow(prime8bytes, length - 1); +} + +/** ZSTD_rollingHash_rotate() : + * Rotate the rolling hash by one byte. + */ +MEM_STATIC U64 ZSTD_rollingHash_rotate(U64 hash, BYTE toRemove, BYTE toAdd, U64 primePower) +{ + hash -= (toRemove + ZSTD_ROLL_HASH_CHAR_OFFSET) * primePower; + hash *= prime8bytes; + hash += toAdd + ZSTD_ROLL_HASH_CHAR_OFFSET; + return hash; +} + +/*-************************************* +* Round buffer management +***************************************/ +#if (ZSTD_WINDOWLOG_MAX_64 > 31) +# error "ZSTD_WINDOWLOG_MAX is too large : would overflow ZSTD_CURRENT_MAX" +#endif +/* Max current allowed */ +#define ZSTD_CURRENT_MAX ((3U << 29) + (1U << ZSTD_WINDOWLOG_MAX)) +/* Maximum chunk size before overflow correction needs to be called again */ +#define ZSTD_CHUNKSIZE_MAX \ + ( ((U32)-1) /* Maximum ending current index */ \ + - ZSTD_CURRENT_MAX) /* Maximum beginning lowLimit */ + +/** + * ZSTD_window_clear(): + * Clears the window containing the history by simply setting it to empty. + */ +MEM_STATIC void ZSTD_window_clear(ZSTD_window_t* window) +{ + size_t const endT = (size_t)(window->nextSrc - window->base); + U32 const end = (U32)endT; + + window->lowLimit = end; + window->dictLimit = end; +} + +MEM_STATIC U32 ZSTD_window_isEmpty(ZSTD_window_t const window) +{ + return window.dictLimit == ZSTD_WINDOW_START_INDEX && + window.lowLimit == ZSTD_WINDOW_START_INDEX && + (window.nextSrc - window.base) == ZSTD_WINDOW_START_INDEX; +} + +/** + * ZSTD_window_hasExtDict(): + * Returns non-zero if the window has a non-empty extDict. + */ +MEM_STATIC U32 ZSTD_window_hasExtDict(ZSTD_window_t const window) +{ + return window.lowLimit < window.dictLimit; +} + +/** + * ZSTD_matchState_dictMode(): + * Inspects the provided matchState and figures out what dictMode should be + * passed to the compressor. + */ +MEM_STATIC ZSTD_dictMode_e ZSTD_matchState_dictMode(const ZSTD_matchState_t *ms) +{ + return ZSTD_window_hasExtDict(ms->window) ? + ZSTD_extDict : + ms->dictMatchState != NULL ? + (ms->dictMatchState->dedicatedDictSearch ? ZSTD_dedicatedDictSearch : ZSTD_dictMatchState) : + ZSTD_noDict; +} + +/* Defining this macro to non-zero tells zstd to run the overflow correction + * code much more frequently. This is very inefficient, and should only be + * used for tests and fuzzers. + */ +#ifndef ZSTD_WINDOW_OVERFLOW_CORRECT_FREQUENTLY +# ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +# define ZSTD_WINDOW_OVERFLOW_CORRECT_FREQUENTLY 1 +# else +# define ZSTD_WINDOW_OVERFLOW_CORRECT_FREQUENTLY 0 +# endif +#endif + +/** + * ZSTD_window_canOverflowCorrect(): + * Returns non-zero if the indices are large enough for overflow correction + * to work correctly without impacting compression ratio. + */ +MEM_STATIC U32 ZSTD_window_canOverflowCorrect(ZSTD_window_t const window, + U32 cycleLog, + U32 maxDist, + U32 loadedDictEnd, + void const* src) +{ + U32 const cycleSize = 1u << cycleLog; + U32 const curr = (U32)((BYTE const*)src - window.base); + U32 const minIndexToOverflowCorrect = cycleSize + + MAX(maxDist, cycleSize) + + ZSTD_WINDOW_START_INDEX; + + /* Adjust the min index to backoff the overflow correction frequency, + * so we don't waste too much CPU in overflow correction. If this + * computation overflows we don't really care, we just need to make + * sure it is at least minIndexToOverflowCorrect. + */ + U32 const adjustment = window.nbOverflowCorrections + 1; + U32 const adjustedIndex = MAX(minIndexToOverflowCorrect * adjustment, + minIndexToOverflowCorrect); + U32 const indexLargeEnough = curr > adjustedIndex; + + /* Only overflow correct early if the dictionary is invalidated already, + * so we don't hurt compression ratio. + */ + U32 const dictionaryInvalidated = curr > maxDist + loadedDictEnd; + + return indexLargeEnough && dictionaryInvalidated; +} + +/** + * ZSTD_window_needOverflowCorrection(): + * Returns non-zero if the indices are getting too large and need overflow + * protection. + */ +MEM_STATIC U32 ZSTD_window_needOverflowCorrection(ZSTD_window_t const window, + U32 cycleLog, + U32 maxDist, + U32 loadedDictEnd, + void const* src, + void const* srcEnd) +{ + U32 const curr = (U32)((BYTE const*)srcEnd - window.base); + if (ZSTD_WINDOW_OVERFLOW_CORRECT_FREQUENTLY) { + if (ZSTD_window_canOverflowCorrect(window, cycleLog, maxDist, loadedDictEnd, src)) { + return 1; + } + } + return curr > ZSTD_CURRENT_MAX; +} + +/** + * ZSTD_window_correctOverflow(): + * Reduces the indices to protect from index overflow. + * Returns the correction made to the indices, which must be applied to every + * stored index. + * + * The least significant cycleLog bits of the indices must remain the same, + * which may be 0. Every index up to maxDist in the past must be valid. + */ +MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog, + U32 maxDist, void const* src) +{ + /* preemptive overflow correction: + * 1. correction is large enough: + * lowLimit > (3<<29) ==> current > 3<<29 + 1< (3<<29 + 1< (3<<29) - (1< (3<<29) - (1<<30) (NOTE: chainLog <= 30) + * > 1<<29 + * + * 2. (ip+ZSTD_CHUNKSIZE_MAX - cctx->base) doesn't overflow: + * After correction, current is less than (1<base < 1<<32. + * 3. (cctx->lowLimit + 1< 3<<29 + 1<base); + U32 const currentCycle = curr & cycleMask; + /* Ensure newCurrent - maxDist >= ZSTD_WINDOW_START_INDEX. */ + U32 const currentCycleCorrection = currentCycle < ZSTD_WINDOW_START_INDEX + ? MAX(cycleSize, ZSTD_WINDOW_START_INDEX) + : 0; + U32 const newCurrent = currentCycle + + currentCycleCorrection + + MAX(maxDist, cycleSize); + U32 const correction = curr - newCurrent; + /* maxDist must be a power of two so that: + * (newCurrent & cycleMask) == (curr & cycleMask) + * This is required to not corrupt the chains / binary tree. + */ + assert((maxDist & (maxDist - 1)) == 0); + assert((curr & cycleMask) == (newCurrent & cycleMask)); + assert(curr > newCurrent); + if (!ZSTD_WINDOW_OVERFLOW_CORRECT_FREQUENTLY) { + /* Loose bound, should be around 1<<29 (see above) */ + assert(correction > 1<<28); + } + + window->base += correction; + window->dictBase += correction; + if (window->lowLimit < correction + ZSTD_WINDOW_START_INDEX) { + window->lowLimit = ZSTD_WINDOW_START_INDEX; + } else { + window->lowLimit -= correction; + } + if (window->dictLimit < correction + ZSTD_WINDOW_START_INDEX) { + window->dictLimit = ZSTD_WINDOW_START_INDEX; + } else { + window->dictLimit -= correction; + } + + /* Ensure we can still reference the full window. */ + assert(newCurrent >= maxDist); + assert(newCurrent - maxDist >= ZSTD_WINDOW_START_INDEX); + /* Ensure that lowLimit and dictLimit didn't underflow. */ + assert(window->lowLimit <= newCurrent); + assert(window->dictLimit <= newCurrent); + + ++window->nbOverflowCorrections; + + DEBUGLOG(4, "Correction of 0x%x bytes to lowLimit=0x%x", correction, + window->lowLimit); + return correction; +} + +/** + * ZSTD_window_enforceMaxDist(): + * Updates lowLimit so that: + * (srcEnd - base) - lowLimit == maxDist + loadedDictEnd + * + * It ensures index is valid as long as index >= lowLimit. + * This must be called before a block compression call. + * + * loadedDictEnd is only defined if a dictionary is in use for current compression. + * As the name implies, loadedDictEnd represents the index at end of dictionary. + * The value lies within context's referential, it can be directly compared to blockEndIdx. + * + * If loadedDictEndPtr is NULL, no dictionary is in use, and we use loadedDictEnd == 0. + * If loadedDictEndPtr is not NULL, we set it to zero after updating lowLimit. + * This is because dictionaries are allowed to be referenced fully + * as long as the last byte of the dictionary is in the window. + * Once input has progressed beyond window size, dictionary cannot be referenced anymore. + * + * In normal dict mode, the dictionary lies between lowLimit and dictLimit. + * In dictMatchState mode, lowLimit and dictLimit are the same, + * and the dictionary is below them. + * forceWindow and dictMatchState are therefore incompatible. + */ +MEM_STATIC void +ZSTD_window_enforceMaxDist(ZSTD_window_t* window, + const void* blockEnd, + U32 maxDist, + U32* loadedDictEndPtr, + const ZSTD_matchState_t** dictMatchStatePtr) +{ + U32 const blockEndIdx = (U32)((BYTE const*)blockEnd - window->base); + U32 const loadedDictEnd = (loadedDictEndPtr != NULL) ? *loadedDictEndPtr : 0; + DEBUGLOG(5, "ZSTD_window_enforceMaxDist: blockEndIdx=%u, maxDist=%u, loadedDictEnd=%u", + (unsigned)blockEndIdx, (unsigned)maxDist, (unsigned)loadedDictEnd); + + /* - When there is no dictionary : loadedDictEnd == 0. + In which case, the test (blockEndIdx > maxDist) is merely to avoid + overflowing next operation `newLowLimit = blockEndIdx - maxDist`. + - When there is a standard dictionary : + Index referential is copied from the dictionary, + which means it starts from 0. + In which case, loadedDictEnd == dictSize, + and it makes sense to compare `blockEndIdx > maxDist + dictSize` + since `blockEndIdx` also starts from zero. + - When there is an attached dictionary : + loadedDictEnd is expressed within the referential of the context, + so it can be directly compared against blockEndIdx. + */ + if (blockEndIdx > maxDist + loadedDictEnd) { + U32 const newLowLimit = blockEndIdx - maxDist; + if (window->lowLimit < newLowLimit) window->lowLimit = newLowLimit; + if (window->dictLimit < window->lowLimit) { + DEBUGLOG(5, "Update dictLimit to match lowLimit, from %u to %u", + (unsigned)window->dictLimit, (unsigned)window->lowLimit); + window->dictLimit = window->lowLimit; + } + /* On reaching window size, dictionaries are invalidated */ + if (loadedDictEndPtr) *loadedDictEndPtr = 0; + if (dictMatchStatePtr) *dictMatchStatePtr = NULL; + } +} + +/* Similar to ZSTD_window_enforceMaxDist(), + * but only invalidates dictionary + * when input progresses beyond window size. + * assumption : loadedDictEndPtr and dictMatchStatePtr are valid (non NULL) + * loadedDictEnd uses same referential as window->base + * maxDist is the window size */ +MEM_STATIC void +ZSTD_checkDictValidity(const ZSTD_window_t* window, + const void* blockEnd, + U32 maxDist, + U32* loadedDictEndPtr, + const ZSTD_matchState_t** dictMatchStatePtr) +{ + assert(loadedDictEndPtr != NULL); + assert(dictMatchStatePtr != NULL); + { U32 const blockEndIdx = (U32)((BYTE const*)blockEnd - window->base); + U32 const loadedDictEnd = *loadedDictEndPtr; + DEBUGLOG(5, "ZSTD_checkDictValidity: blockEndIdx=%u, maxDist=%u, loadedDictEnd=%u", + (unsigned)blockEndIdx, (unsigned)maxDist, (unsigned)loadedDictEnd); + assert(blockEndIdx >= loadedDictEnd); + + if (blockEndIdx > loadedDictEnd + maxDist || loadedDictEnd != window->dictLimit) { + /* On reaching window size, dictionaries are invalidated. + * For simplification, if window size is reached anywhere within next block, + * the dictionary is invalidated for the full block. + * + * We also have to invalidate the dictionary if ZSTD_window_update() has detected + * non-contiguous segments, which means that loadedDictEnd != window->dictLimit. + * loadedDictEnd may be 0, if forceWindow is true, but in that case we never use + * dictMatchState, so setting it to NULL is not a problem. + */ + DEBUGLOG(6, "invalidating dictionary for current block (distance > windowSize)"); + *loadedDictEndPtr = 0; + *dictMatchStatePtr = NULL; + } else { + if (*loadedDictEndPtr != 0) { + DEBUGLOG(6, "dictionary considered valid for current block"); + } } } +} + +MEM_STATIC void ZSTD_window_init(ZSTD_window_t* window) { + ZSTD_memset(window, 0, sizeof(*window)); + window->base = (BYTE const*)" "; + window->dictBase = (BYTE const*)" "; + ZSTD_STATIC_ASSERT(ZSTD_DUBT_UNSORTED_MARK < ZSTD_WINDOW_START_INDEX); /* Start above ZSTD_DUBT_UNSORTED_MARK */ + window->dictLimit = ZSTD_WINDOW_START_INDEX; /* start from >0, so that 1st position is valid */ + window->lowLimit = ZSTD_WINDOW_START_INDEX; /* it ensures first and later CCtx usages compress the same */ + window->nextSrc = window->base + ZSTD_WINDOW_START_INDEX; /* see issue #1241 */ + window->nbOverflowCorrections = 0; +} + +/** + * ZSTD_window_update(): + * Updates the window by appending [src, src + srcSize) to the window. + * If it is not contiguous, the current prefix becomes the extDict, and we + * forget about the extDict. Handles overlap of the prefix and extDict. + * Returns non-zero if the segment is contiguous. + */ +MEM_STATIC U32 ZSTD_window_update(ZSTD_window_t* window, + void const* src, size_t srcSize, + int forceNonContiguous) +{ + BYTE const* const ip = (BYTE const*)src; + U32 contiguous = 1; + DEBUGLOG(5, "ZSTD_window_update"); + if (srcSize == 0) + return contiguous; + assert(window->base != NULL); + assert(window->dictBase != NULL); + /* Check if blocks follow each other */ + if (src != window->nextSrc || forceNonContiguous) { + /* not contiguous */ + size_t const distanceFromBase = (size_t)(window->nextSrc - window->base); + DEBUGLOG(5, "Non contiguous blocks, new segment starts at %u", window->dictLimit); + window->lowLimit = window->dictLimit; + assert(distanceFromBase == (size_t)(U32)distanceFromBase); /* should never overflow */ + window->dictLimit = (U32)distanceFromBase; + window->dictBase = window->base; + window->base = ip - distanceFromBase; + /* ms->nextToUpdate = window->dictLimit; */ + if (window->dictLimit - window->lowLimit < HASH_READ_SIZE) window->lowLimit = window->dictLimit; /* too small extDict */ + contiguous = 0; + } + window->nextSrc = ip + srcSize; + /* if input and dictionary overlap : reduce dictionary (area presumed modified by input) */ + if ( (ip+srcSize > window->dictBase + window->lowLimit) + & (ip < window->dictBase + window->dictLimit)) { + ptrdiff_t const highInputIdx = (ip + srcSize) - window->dictBase; + U32 const lowLimitMax = (highInputIdx > (ptrdiff_t)window->dictLimit) ? window->dictLimit : (U32)highInputIdx; + window->lowLimit = lowLimitMax; + DEBUGLOG(5, "Overlapping extDict and input : new lowLimit = %u", window->lowLimit); + } + return contiguous; +} + +/** + * Returns the lowest allowed match index. It may either be in the ext-dict or the prefix. + */ +MEM_STATIC U32 ZSTD_getLowestMatchIndex(const ZSTD_matchState_t* ms, U32 curr, unsigned windowLog) +{ + U32 const maxDistance = 1U << windowLog; + U32 const lowestValid = ms->window.lowLimit; + U32 const withinWindow = (curr - lowestValid > maxDistance) ? curr - maxDistance : lowestValid; + U32 const isDictionary = (ms->loadedDictEnd != 0); + /* When using a dictionary the entire dictionary is valid if a single byte of the dictionary + * is within the window. We invalidate the dictionary (and set loadedDictEnd to 0) when it isn't + * valid for the entire block. So this check is sufficient to find the lowest valid match index. + */ + U32 const matchLowest = isDictionary ? lowestValid : withinWindow; + return matchLowest; +} + +/** + * Returns the lowest allowed match index in the prefix. + */ +MEM_STATIC U32 ZSTD_getLowestPrefixIndex(const ZSTD_matchState_t* ms, U32 curr, unsigned windowLog) +{ + U32 const maxDistance = 1U << windowLog; + U32 const lowestValid = ms->window.dictLimit; + U32 const withinWindow = (curr - lowestValid > maxDistance) ? curr - maxDistance : lowestValid; + U32 const isDictionary = (ms->loadedDictEnd != 0); + /* When computing the lowest prefix index we need to take the dictionary into account to handle + * the edge case where the dictionary and the source are contiguous in memory. + */ + U32 const matchLowest = isDictionary ? lowestValid : withinWindow; + return matchLowest; +} + + + +/* debug functions */ +#if (DEBUGLEVEL>=2) + +MEM_STATIC double ZSTD_fWeight(U32 rawStat) +{ + U32 const fp_accuracy = 8; + U32 const fp_multiplier = (1 << fp_accuracy); + U32 const newStat = rawStat + 1; + U32 const hb = ZSTD_highbit32(newStat); + U32 const BWeight = hb * fp_multiplier; + U32 const FWeight = (newStat << fp_accuracy) >> hb; + U32 const weight = BWeight + FWeight; + assert(hb + fp_accuracy < 31); + return (double)weight / fp_multiplier; +} + +/* display a table content, + * listing each element, its frequency, and its predicted bit cost */ +MEM_STATIC void ZSTD_debugTable(const U32* table, U32 max) +{ + unsigned u, sum; + for (u=0, sum=0; u<=max; u++) sum += table[u]; + DEBUGLOG(2, "total nb elts: %u", sum); + for (u=0; u<=max; u++) { + DEBUGLOG(2, "%2u: %5u (%.2f)", + u, table[u], ZSTD_fWeight(sum) - ZSTD_fWeight(table[u]) ); + } +} + +#endif + +/* Short Cache */ + +/* Normally, zstd matchfinders follow this flow: + * 1. Compute hash at ip + * 2. Load index from hashTable[hash] + * 3. Check if *ip == *(base + index) + * In dictionary compression, loading *(base + index) is often an L2 or even L3 miss. + * + * Short cache is an optimization which allows us to avoid step 3 most of the time + * when the data doesn't actually match. With short cache, the flow becomes: + * 1. Compute (hash, currentTag) at ip. currentTag is an 8-bit independent hash at ip. + * 2. Load (index, matchTag) from hashTable[hash]. See ZSTD_writeTaggedIndex to understand how this works. + * 3. Only if currentTag == matchTag, check *ip == *(base + index). Otherwise, continue. + * + * Currently, short cache is only implemented in CDict hashtables. Thus, its use is limited to + * dictMatchState matchfinders. + */ +#define ZSTD_SHORT_CACHE_TAG_BITS 8 +#define ZSTD_SHORT_CACHE_TAG_MASK ((1u << ZSTD_SHORT_CACHE_TAG_BITS) - 1) + +/* Helper function for ZSTD_fillHashTable and ZSTD_fillDoubleHashTable. + * Unpacks hashAndTag into (hash, tag), then packs (index, tag) into hashTable[hash]. */ +MEM_STATIC void ZSTD_writeTaggedIndex(U32* const hashTable, size_t hashAndTag, U32 index) { + size_t const hash = hashAndTag >> ZSTD_SHORT_CACHE_TAG_BITS; + U32 const tag = (U32)(hashAndTag & ZSTD_SHORT_CACHE_TAG_MASK); + assert(index >> (32 - ZSTD_SHORT_CACHE_TAG_BITS) == 0); + hashTable[hash] = (index << ZSTD_SHORT_CACHE_TAG_BITS) | tag; +} + +/* Helper function for short cache matchfinders. + * Unpacks tag1 and tag2 from lower bits of packedTag1 and packedTag2, then checks if the tags match. */ +MEM_STATIC int ZSTD_comparePackedTags(size_t packedTag1, size_t packedTag2) { + U32 const tag1 = packedTag1 & ZSTD_SHORT_CACHE_TAG_MASK; + U32 const tag2 = packedTag2 & ZSTD_SHORT_CACHE_TAG_MASK; + return tag1 == tag2; +} + +#if defined (__cplusplus) +} +#endif + +/* =============================================================== + * Shared internal declarations + * These prototypes may be called from sources not in lib/compress + * =============================================================== */ + +/* ZSTD_loadCEntropy() : + * dict : must point at beginning of a valid zstd dictionary. + * return : size of dictionary header (size of magic number + dict ID + entropy tables) + * assumptions : magic number supposed already checked + * and dictSize >= 8 */ +size_t ZSTD_loadCEntropy(ZSTD_compressedBlockState_t* bs, void* workspace, + const void* const dict, size_t dictSize); + +void ZSTD_reset_compressedBlockState(ZSTD_compressedBlockState_t* bs); + +/* ============================================================== + * Private declarations + * These prototypes shall only be called from within lib/compress + * ============================================================== */ + +/* ZSTD_getCParamsFromCCtxParams() : + * cParams are built depending on compressionLevel, src size hints, + * LDM and manually set compression parameters. + * Note: srcSizeHint == 0 means 0! + */ +ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams( + const ZSTD_CCtx_params* CCtxParams, U64 srcSizeHint, size_t dictSize, ZSTD_cParamMode_e mode); + +/*! ZSTD_initCStream_internal() : + * Private use only. Init streaming operation. + * expects params to be valid. + * must receive dict, or cdict, or none, but not both. + * @return : 0, or an error code */ +size_t ZSTD_initCStream_internal(ZSTD_CStream* zcs, + const void* dict, size_t dictSize, + const ZSTD_CDict* cdict, + const ZSTD_CCtx_params* params, unsigned long long pledgedSrcSize); + +void ZSTD_resetSeqStore(seqStore_t* ssPtr); + +/*! ZSTD_getCParamsFromCDict() : + * as the name implies */ +ZSTD_compressionParameters ZSTD_getCParamsFromCDict(const ZSTD_CDict* cdict); + +/* ZSTD_compressBegin_advanced_internal() : + * Private use only. To be called from zstdmt_compress.c. */ +size_t ZSTD_compressBegin_advanced_internal(ZSTD_CCtx* cctx, + const void* dict, size_t dictSize, + ZSTD_dictContentType_e dictContentType, + ZSTD_dictTableLoadMethod_e dtlm, + const ZSTD_CDict* cdict, + const ZSTD_CCtx_params* params, + unsigned long long pledgedSrcSize); + +/* ZSTD_compress_advanced_internal() : + * Private use only. To be called from zstdmt_compress.c. */ +size_t ZSTD_compress_advanced_internal(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + const ZSTD_CCtx_params* params); + + +/* ZSTD_writeLastEmptyBlock() : + * output an empty Block with end-of-frame mark to complete a frame + * @return : size of data written into `dst` (== ZSTD_blockHeaderSize (defined in zstd_internal.h)) + * or an error code if `dstCapacity` is too small ( 1 */ +U32 ZSTD_cycleLog(U32 hashLog, ZSTD_strategy strat); + +/** ZSTD_CCtx_trace() : + * Trace the end of a compression call. + */ +void ZSTD_CCtx_trace(ZSTD_CCtx* cctx, size_t extraCSize); + +/* Returns 0 on success, and a ZSTD_error otherwise. This function scans through an array of + * ZSTD_Sequence, storing the sequences it finds, until it reaches a block delimiter. + * Note that the block delimiter must include the last literals of the block. + */ +size_t +ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, + ZSTD_sequencePosition* seqPos, + const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, + const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch); + +/* Returns the number of bytes to move the current read position back by. + * Only non-zero if we ended up splitting a sequence. + * Otherwise, it may return a ZSTD error if something went wrong. + * + * This function will attempt to scan through blockSize bytes + * represented by the sequences in @inSeqs, + * storing any (partial) sequences. + * + * Occasionally, we may want to change the actual number of bytes we consumed from inSeqs to + * avoid splitting a match, or to avoid splitting a match such that it would produce a match + * smaller than MINMATCH. In this case, we return the number of bytes that we didn't read from this block. + */ +size_t +ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, + const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, + const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch); + + +/* =============================================================== + * Deprecated definitions that are still used internally to avoid + * deprecation warnings. These functions are exactly equivalent to + * their public variants, but avoid the deprecation warnings. + * =============================================================== */ + +size_t ZSTD_compressBegin_usingCDict_deprecated(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); + +size_t ZSTD_compressContinue_public(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize); + +size_t ZSTD_compressEnd_public(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize); + +size_t ZSTD_compressBlock_deprecated(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + +#endif /* ZSTD_COMPRESS_H */ +/**** ended inlining zstd_compress_internal.h ****/ + + +size_t ZSTD_noCompressLiterals (void* dst, size_t dstCapacity, const void* src, size_t srcSize); + +/* ZSTD_compressRleLiteralsBlock() : + * Conditions : + * - All bytes in @src are identical + * - dstCapacity >= 4 */ +size_t ZSTD_compressRleLiteralsBlock (void* dst, size_t dstCapacity, const void* src, size_t srcSize); + +/* ZSTD_compressLiterals(): + * @entropyWorkspace: must be aligned on 4-bytes boundaries + * @entropyWorkspaceSize : must be >= HUF_WORKSPACE_SIZE + * @suspectUncompressible: sampling checks, to potentially skip huffman coding + */ +size_t ZSTD_compressLiterals (void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + void* entropyWorkspace, size_t entropyWorkspaceSize, + const ZSTD_hufCTables_t* prevHuf, + ZSTD_hufCTables_t* nextHuf, + ZSTD_strategy strategy, int disableLiteralCompression, + int suspectUncompressible, + int bmi2); + +#endif /* ZSTD_COMPRESS_LITERALS_H */ +/**** ended inlining zstd_compress_literals.h ****/ + + +/* ************************************************************** +* Debug Traces +****************************************************************/ +#if DEBUGLEVEL >= 2 + +static size_t showHexa(const void* src, size_t srcSize) +{ + const BYTE* const ip = (const BYTE*)src; + size_t u; + for (u=0; u31) + (srcSize>4095); + + DEBUGLOG(5, "ZSTD_noCompressLiterals: srcSize=%zu, dstCapacity=%zu", srcSize, dstCapacity); + + RETURN_ERROR_IF(srcSize + flSize > dstCapacity, dstSize_tooSmall, ""); + + switch(flSize) + { + case 1: /* 2 - 1 - 5 */ + ostart[0] = (BYTE)((U32)set_basic + (srcSize<<3)); + break; + case 2: /* 2 - 2 - 12 */ + MEM_writeLE16(ostart, (U16)((U32)set_basic + (1<<2) + (srcSize<<4))); + break; + case 3: /* 2 - 2 - 20 */ + MEM_writeLE32(ostart, (U32)((U32)set_basic + (3<<2) + (srcSize<<4))); + break; + default: /* not necessary : flSize is {1,2,3} */ + assert(0); + } + + ZSTD_memcpy(ostart + flSize, src, srcSize); + DEBUGLOG(5, "Raw (uncompressed) literals: %u -> %u", (U32)srcSize, (U32)(srcSize + flSize)); + return srcSize + flSize; +} + +static int allBytesIdentical(const void* src, size_t srcSize) +{ + assert(srcSize >= 1); + assert(src != NULL); + { const BYTE b = ((const BYTE*)src)[0]; + size_t p; + for (p=1; p31) + (srcSize>4095); + + assert(dstCapacity >= 4); (void)dstCapacity; + assert(allBytesIdentical(src, srcSize)); + + switch(flSize) + { + case 1: /* 2 - 1 - 5 */ + ostart[0] = (BYTE)((U32)set_rle + (srcSize<<3)); + break; + case 2: /* 2 - 2 - 12 */ + MEM_writeLE16(ostart, (U16)((U32)set_rle + (1<<2) + (srcSize<<4))); + break; + case 3: /* 2 - 2 - 20 */ + MEM_writeLE32(ostart, (U32)((U32)set_rle + (3<<2) + (srcSize<<4))); + break; + default: /* not necessary : flSize is {1,2,3} */ + assert(0); + } + + ostart[flSize] = *(const BYTE*)src; + DEBUGLOG(5, "RLE : Repeated Literal (%02X: %u times) -> %u bytes encoded", ((const BYTE*)src)[0], (U32)srcSize, (U32)flSize + 1); + return flSize+1; +} + +/* ZSTD_minLiteralsToCompress() : + * returns minimal amount of literals + * for literal compression to even be attempted. + * Minimum is made tighter as compression strategy increases. + */ +static size_t +ZSTD_minLiteralsToCompress(ZSTD_strategy strategy, HUF_repeat huf_repeat) +{ + assert((int)strategy >= 0); + assert((int)strategy <= 9); + /* btultra2 : min 8 bytes; + * then 2x larger for each successive compression strategy + * max threshold 64 bytes */ + { int const shift = MIN(9-(int)strategy, 3); + size_t const mintc = (huf_repeat == HUF_repeat_valid) ? 6 : (size_t)8 << shift; + DEBUGLOG(7, "minLiteralsToCompress = %zu", mintc); + return mintc; + } +} + +size_t ZSTD_compressLiterals ( + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + void* entropyWorkspace, size_t entropyWorkspaceSize, + const ZSTD_hufCTables_t* prevHuf, + ZSTD_hufCTables_t* nextHuf, + ZSTD_strategy strategy, + int disableLiteralCompression, + int suspectUncompressible, + int bmi2) +{ + size_t const lhSize = 3 + (srcSize >= 1 KB) + (srcSize >= 16 KB); + BYTE* const ostart = (BYTE*)dst; + U32 singleStream = srcSize < 256; + symbolEncodingType_e hType = set_compressed; + size_t cLitSize; + + DEBUGLOG(5,"ZSTD_compressLiterals (disableLiteralCompression=%i, srcSize=%u, dstCapacity=%zu)", + disableLiteralCompression, (U32)srcSize, dstCapacity); + + DEBUGLOG(6, "Completed literals listing (%zu bytes)", showHexa(src, srcSize)); + + /* Prepare nextEntropy assuming reusing the existing table */ + ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); + + if (disableLiteralCompression) + return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize); + + /* if too small, don't even attempt compression (speed opt) */ + if (srcSize < ZSTD_minLiteralsToCompress(strategy, prevHuf->repeatMode)) + return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize); + + RETURN_ERROR_IF(dstCapacity < lhSize+1, dstSize_tooSmall, "not enough space for compression"); + { HUF_repeat repeat = prevHuf->repeatMode; + int const flags = 0 + | (bmi2 ? HUF_flags_bmi2 : 0) + | (strategy < ZSTD_lazy && srcSize <= 1024 ? HUF_flags_preferRepeat : 0) + | (strategy >= HUF_OPTIMAL_DEPTH_THRESHOLD ? HUF_flags_optimalDepth : 0) + | (suspectUncompressible ? HUF_flags_suspectUncompressible : 0); + + typedef size_t (*huf_compress_f)(void*, size_t, const void*, size_t, unsigned, unsigned, void*, size_t, HUF_CElt*, HUF_repeat*, int); + huf_compress_f huf_compress; + if (repeat == HUF_repeat_valid && lhSize == 3) singleStream = 1; + huf_compress = singleStream ? HUF_compress1X_repeat : HUF_compress4X_repeat; + cLitSize = huf_compress(ostart+lhSize, dstCapacity-lhSize, + src, srcSize, + HUF_SYMBOLVALUE_MAX, LitHufLog, + entropyWorkspace, entropyWorkspaceSize, + (HUF_CElt*)nextHuf->CTable, + &repeat, flags); + DEBUGLOG(5, "%zu literals compressed into %zu bytes (before header)", srcSize, cLitSize); + if (repeat != HUF_repeat_none) { + /* reused the existing table */ + DEBUGLOG(5, "reusing statistics from previous huffman block"); + hType = set_repeat; + } + } + + { size_t const minGain = ZSTD_minGain(srcSize, strategy); + if ((cLitSize==0) || (cLitSize >= srcSize - minGain) || ERR_isError(cLitSize)) { + ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); + return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize); + } } + if (cLitSize==1) { + /* A return value of 1 signals that the alphabet consists of a single symbol. + * However, in some rare circumstances, it could be the compressed size (a single byte). + * For that outcome to have a chance to happen, it's necessary that `srcSize < 8`. + * (it's also necessary to not generate statistics). + * Therefore, in such a case, actively check that all bytes are identical. */ + if ((srcSize >= 8) || allBytesIdentical(src, srcSize)) { + ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); + return ZSTD_compressRleLiteralsBlock(dst, dstCapacity, src, srcSize); + } } + + if (hType == set_compressed) { + /* using a newly constructed table */ + nextHuf->repeatMode = HUF_repeat_check; + } + + /* Build header */ + switch(lhSize) + { + case 3: /* 2 - 2 - 10 - 10 */ + if (!singleStream) assert(srcSize >= MIN_LITERALS_FOR_4_STREAMS); + { U32 const lhc = hType + ((U32)(!singleStream) << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<14); + MEM_writeLE24(ostart, lhc); + break; + } + case 4: /* 2 - 2 - 14 - 14 */ + assert(srcSize >= MIN_LITERALS_FOR_4_STREAMS); + { U32 const lhc = hType + (2 << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<18); + MEM_writeLE32(ostart, lhc); + break; + } + case 5: /* 2 - 2 - 18 - 18 */ + assert(srcSize >= MIN_LITERALS_FOR_4_STREAMS); + { U32 const lhc = hType + (3 << 2) + ((U32)srcSize<<4) + ((U32)cLitSize<<22); + MEM_writeLE32(ostart, lhc); + ostart[4] = (BYTE)(cLitSize >> 10); + break; + } + default: /* not possible : lhSize is {3,4,5} */ + assert(0); + } + DEBUGLOG(5, "Compressed literals: %u -> %u", (U32)srcSize, (U32)(lhSize+cLitSize)); + return lhSize+cLitSize; +} +/**** ended inlining compress/zstd_compress_literals.c ****/ +/**** start inlining compress/zstd_compress_sequences.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + /*-************************************* + * Dependencies + ***************************************/ +/**** start inlining zstd_compress_sequences.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_COMPRESS_SEQUENCES_H +#define ZSTD_COMPRESS_SEQUENCES_H + +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ + +typedef enum { + ZSTD_defaultDisallowed = 0, + ZSTD_defaultAllowed = 1 +} ZSTD_defaultPolicy_e; + +symbolEncodingType_e +ZSTD_selectEncodingType( + FSE_repeat* repeatMode, unsigned const* count, unsigned const max, + size_t const mostFrequent, size_t nbSeq, unsigned const FSELog, + FSE_CTable const* prevCTable, + short const* defaultNorm, U32 defaultNormLog, + ZSTD_defaultPolicy_e const isDefaultAllowed, + ZSTD_strategy const strategy); + +size_t +ZSTD_buildCTable(void* dst, size_t dstCapacity, + FSE_CTable* nextCTable, U32 FSELog, symbolEncodingType_e type, + unsigned* count, U32 max, + const BYTE* codeTable, size_t nbSeq, + const S16* defaultNorm, U32 defaultNormLog, U32 defaultMax, + const FSE_CTable* prevCTable, size_t prevCTableSize, + void* entropyWorkspace, size_t entropyWorkspaceSize); + +size_t ZSTD_encodeSequences( + void* dst, size_t dstCapacity, + FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable, + FSE_CTable const* CTable_OffsetBits, BYTE const* ofCodeTable, + FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable, + seqDef const* sequences, size_t nbSeq, int longOffsets, int bmi2); + +size_t ZSTD_fseBitCost( + FSE_CTable const* ctable, + unsigned const* count, + unsigned const max); + +size_t ZSTD_crossEntropyCost(short const* norm, unsigned accuracyLog, + unsigned const* count, unsigned const max); +#endif /* ZSTD_COMPRESS_SEQUENCES_H */ +/**** ended inlining zstd_compress_sequences.h ****/ + +/** + * -log2(x / 256) lookup table for x in [0, 256). + * If x == 0: Return 0 + * Else: Return floor(-log2(x / 256) * 256) + */ +static unsigned const kInverseProbabilityLog256[256] = { + 0, 2048, 1792, 1642, 1536, 1453, 1386, 1329, 1280, 1236, 1197, 1162, + 1130, 1100, 1073, 1047, 1024, 1001, 980, 960, 941, 923, 906, 889, + 874, 859, 844, 830, 817, 804, 791, 779, 768, 756, 745, 734, + 724, 714, 704, 694, 685, 676, 667, 658, 650, 642, 633, 626, + 618, 610, 603, 595, 588, 581, 574, 567, 561, 554, 548, 542, + 535, 529, 523, 517, 512, 506, 500, 495, 489, 484, 478, 473, + 468, 463, 458, 453, 448, 443, 438, 434, 429, 424, 420, 415, + 411, 407, 402, 398, 394, 390, 386, 382, 377, 373, 370, 366, + 362, 358, 354, 350, 347, 343, 339, 336, 332, 329, 325, 322, + 318, 315, 311, 308, 305, 302, 298, 295, 292, 289, 286, 282, + 279, 276, 273, 270, 267, 264, 261, 258, 256, 253, 250, 247, + 244, 241, 239, 236, 233, 230, 228, 225, 222, 220, 217, 215, + 212, 209, 207, 204, 202, 199, 197, 194, 192, 190, 187, 185, + 182, 180, 178, 175, 173, 171, 168, 166, 164, 162, 159, 157, + 155, 153, 151, 149, 146, 144, 142, 140, 138, 136, 134, 132, + 130, 128, 126, 123, 121, 119, 117, 115, 114, 112, 110, 108, + 106, 104, 102, 100, 98, 96, 94, 93, 91, 89, 87, 85, + 83, 82, 80, 78, 76, 74, 73, 71, 69, 67, 66, 64, + 62, 61, 59, 57, 55, 54, 52, 50, 49, 47, 46, 44, + 42, 41, 39, 37, 36, 34, 33, 31, 30, 28, 26, 25, + 23, 22, 20, 19, 17, 16, 14, 13, 11, 10, 8, 7, + 5, 4, 2, 1, +}; + +static unsigned ZSTD_getFSEMaxSymbolValue(FSE_CTable const* ctable) { + void const* ptr = ctable; + U16 const* u16ptr = (U16 const*)ptr; + U32 const maxSymbolValue = MEM_read16(u16ptr + 1); + return maxSymbolValue; +} + +/** + * Returns true if we should use ncount=-1 else we should + * use ncount=1 for low probability symbols instead. + */ +static unsigned ZSTD_useLowProbCount(size_t const nbSeq) +{ + /* Heuristic: This should cover most blocks <= 16K and + * start to fade out after 16K to about 32K depending on + * compressibility. + */ + return nbSeq >= 2048; +} + +/** + * Returns the cost in bytes of encoding the normalized count header. + * Returns an error if any of the helper functions return an error. + */ +static size_t ZSTD_NCountCost(unsigned const* count, unsigned const max, + size_t const nbSeq, unsigned const FSELog) +{ + BYTE wksp[FSE_NCOUNTBOUND]; + S16 norm[MaxSeq + 1]; + const U32 tableLog = FSE_optimalTableLog(FSELog, nbSeq, max); + FORWARD_IF_ERROR(FSE_normalizeCount(norm, tableLog, count, nbSeq, max, ZSTD_useLowProbCount(nbSeq)), ""); + return FSE_writeNCount(wksp, sizeof(wksp), norm, max, tableLog); +} + +/** + * Returns the cost in bits of encoding the distribution described by count + * using the entropy bound. + */ +static size_t ZSTD_entropyCost(unsigned const* count, unsigned const max, size_t const total) +{ + unsigned cost = 0; + unsigned s; + + assert(total > 0); + for (s = 0; s <= max; ++s) { + unsigned norm = (unsigned)((256 * count[s]) / total); + if (count[s] != 0 && norm == 0) + norm = 1; + assert(count[s] < total); + cost += count[s] * kInverseProbabilityLog256[norm]; + } + return cost >> 8; +} + +/** + * Returns the cost in bits of encoding the distribution in count using ctable. + * Returns an error if ctable cannot represent all the symbols in count. + */ +size_t ZSTD_fseBitCost( + FSE_CTable const* ctable, + unsigned const* count, + unsigned const max) +{ + unsigned const kAccuracyLog = 8; + size_t cost = 0; + unsigned s; + FSE_CState_t cstate; + FSE_initCState(&cstate, ctable); + if (ZSTD_getFSEMaxSymbolValue(ctable) < max) { + DEBUGLOG(5, "Repeat FSE_CTable has maxSymbolValue %u < %u", + ZSTD_getFSEMaxSymbolValue(ctable), max); + return ERROR(GENERIC); + } + for (s = 0; s <= max; ++s) { + unsigned const tableLog = cstate.stateLog; + unsigned const badCost = (tableLog + 1) << kAccuracyLog; + unsigned const bitCost = FSE_bitCost(cstate.symbolTT, tableLog, s, kAccuracyLog); + if (count[s] == 0) + continue; + if (bitCost >= badCost) { + DEBUGLOG(5, "Repeat FSE_CTable has Prob[%u] == 0", s); + return ERROR(GENERIC); + } + cost += (size_t)count[s] * bitCost; + } + return cost >> kAccuracyLog; +} + +/** + * Returns the cost in bits of encoding the distribution in count using the + * table described by norm. The max symbol support by norm is assumed >= max. + * norm must be valid for every symbol with non-zero probability in count. + */ +size_t ZSTD_crossEntropyCost(short const* norm, unsigned accuracyLog, + unsigned const* count, unsigned const max) +{ + unsigned const shift = 8 - accuracyLog; + size_t cost = 0; + unsigned s; + assert(accuracyLog <= 8); + for (s = 0; s <= max; ++s) { + unsigned const normAcc = (norm[s] != -1) ? (unsigned)norm[s] : 1; + unsigned const norm256 = normAcc << shift; + assert(norm256 > 0); + assert(norm256 < 256); + cost += count[s] * kInverseProbabilityLog256[norm256]; + } + return cost >> 8; +} + +symbolEncodingType_e +ZSTD_selectEncodingType( + FSE_repeat* repeatMode, unsigned const* count, unsigned const max, + size_t const mostFrequent, size_t nbSeq, unsigned const FSELog, + FSE_CTable const* prevCTable, + short const* defaultNorm, U32 defaultNormLog, + ZSTD_defaultPolicy_e const isDefaultAllowed, + ZSTD_strategy const strategy) +{ + ZSTD_STATIC_ASSERT(ZSTD_defaultDisallowed == 0 && ZSTD_defaultAllowed != 0); + if (mostFrequent == nbSeq) { + *repeatMode = FSE_repeat_none; + if (isDefaultAllowed && nbSeq <= 2) { + /* Prefer set_basic over set_rle when there are 2 or fewer symbols, + * since RLE uses 1 byte, but set_basic uses 5-6 bits per symbol. + * If basic encoding isn't possible, always choose RLE. + */ + DEBUGLOG(5, "Selected set_basic"); + return set_basic; + } + DEBUGLOG(5, "Selected set_rle"); + return set_rle; + } + if (strategy < ZSTD_lazy) { + if (isDefaultAllowed) { + size_t const staticFse_nbSeq_max = 1000; + size_t const mult = 10 - strategy; + size_t const baseLog = 3; + size_t const dynamicFse_nbSeq_min = (((size_t)1 << defaultNormLog) * mult) >> baseLog; /* 28-36 for offset, 56-72 for lengths */ + assert(defaultNormLog >= 5 && defaultNormLog <= 6); /* xx_DEFAULTNORMLOG */ + assert(mult <= 9 && mult >= 7); + if ( (*repeatMode == FSE_repeat_valid) + && (nbSeq < staticFse_nbSeq_max) ) { + DEBUGLOG(5, "Selected set_repeat"); + return set_repeat; + } + if ( (nbSeq < dynamicFse_nbSeq_min) + || (mostFrequent < (nbSeq >> (defaultNormLog-1))) ) { + DEBUGLOG(5, "Selected set_basic"); + /* The format allows default tables to be repeated, but it isn't useful. + * When using simple heuristics to select encoding type, we don't want + * to confuse these tables with dictionaries. When running more careful + * analysis, we don't need to waste time checking both repeating tables + * and default tables. + */ + *repeatMode = FSE_repeat_none; + return set_basic; + } + } + } else { + size_t const basicCost = isDefaultAllowed ? ZSTD_crossEntropyCost(defaultNorm, defaultNormLog, count, max) : ERROR(GENERIC); + size_t const repeatCost = *repeatMode != FSE_repeat_none ? ZSTD_fseBitCost(prevCTable, count, max) : ERROR(GENERIC); + size_t const NCountCost = ZSTD_NCountCost(count, max, nbSeq, FSELog); + size_t const compressedCost = (NCountCost << 3) + ZSTD_entropyCost(count, max, nbSeq); + + if (isDefaultAllowed) { + assert(!ZSTD_isError(basicCost)); + assert(!(*repeatMode == FSE_repeat_valid && ZSTD_isError(repeatCost))); + } + assert(!ZSTD_isError(NCountCost)); + assert(compressedCost < ERROR(maxCode)); + DEBUGLOG(5, "Estimated bit costs: basic=%u\trepeat=%u\tcompressed=%u", + (unsigned)basicCost, (unsigned)repeatCost, (unsigned)compressedCost); + if (basicCost <= repeatCost && basicCost <= compressedCost) { + DEBUGLOG(5, "Selected set_basic"); + assert(isDefaultAllowed); + *repeatMode = FSE_repeat_none; + return set_basic; + } + if (repeatCost <= compressedCost) { + DEBUGLOG(5, "Selected set_repeat"); + assert(!ZSTD_isError(repeatCost)); + return set_repeat; + } + assert(compressedCost < basicCost && compressedCost < repeatCost); + } + DEBUGLOG(5, "Selected set_compressed"); + *repeatMode = FSE_repeat_check; + return set_compressed; +} + +typedef struct { + S16 norm[MaxSeq + 1]; + U32 wksp[FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(MaxSeq, MaxFSELog)]; +} ZSTD_BuildCTableWksp; + +size_t +ZSTD_buildCTable(void* dst, size_t dstCapacity, + FSE_CTable* nextCTable, U32 FSELog, symbolEncodingType_e type, + unsigned* count, U32 max, + const BYTE* codeTable, size_t nbSeq, + const S16* defaultNorm, U32 defaultNormLog, U32 defaultMax, + const FSE_CTable* prevCTable, size_t prevCTableSize, + void* entropyWorkspace, size_t entropyWorkspaceSize) +{ + BYTE* op = (BYTE*)dst; + const BYTE* const oend = op + dstCapacity; + DEBUGLOG(6, "ZSTD_buildCTable (dstCapacity=%u)", (unsigned)dstCapacity); + + switch (type) { + case set_rle: + FORWARD_IF_ERROR(FSE_buildCTable_rle(nextCTable, (BYTE)max), ""); + RETURN_ERROR_IF(dstCapacity==0, dstSize_tooSmall, "not enough space"); + *op = codeTable[0]; + return 1; + case set_repeat: + ZSTD_memcpy(nextCTable, prevCTable, prevCTableSize); + return 0; + case set_basic: + FORWARD_IF_ERROR(FSE_buildCTable_wksp(nextCTable, defaultNorm, defaultMax, defaultNormLog, entropyWorkspace, entropyWorkspaceSize), ""); /* note : could be pre-calculated */ + return 0; + case set_compressed: { + ZSTD_BuildCTableWksp* wksp = (ZSTD_BuildCTableWksp*)entropyWorkspace; + size_t nbSeq_1 = nbSeq; + const U32 tableLog = FSE_optimalTableLog(FSELog, nbSeq, max); + if (count[codeTable[nbSeq-1]] > 1) { + count[codeTable[nbSeq-1]]--; + nbSeq_1--; + } + assert(nbSeq_1 > 1); + assert(entropyWorkspaceSize >= sizeof(ZSTD_BuildCTableWksp)); + (void)entropyWorkspaceSize; + FORWARD_IF_ERROR(FSE_normalizeCount(wksp->norm, tableLog, count, nbSeq_1, max, ZSTD_useLowProbCount(nbSeq_1)), "FSE_normalizeCount failed"); + assert(oend >= op); + { size_t const NCountSize = FSE_writeNCount(op, (size_t)(oend - op), wksp->norm, max, tableLog); /* overflow protected */ + FORWARD_IF_ERROR(NCountSize, "FSE_writeNCount failed"); + FORWARD_IF_ERROR(FSE_buildCTable_wksp(nextCTable, wksp->norm, max, tableLog, wksp->wksp, sizeof(wksp->wksp)), "FSE_buildCTable_wksp failed"); + return NCountSize; + } + } + default: assert(0); RETURN_ERROR(GENERIC, "impossible to reach"); + } +} + +FORCE_INLINE_TEMPLATE size_t +ZSTD_encodeSequences_body( + void* dst, size_t dstCapacity, + FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable, + FSE_CTable const* CTable_OffsetBits, BYTE const* ofCodeTable, + FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable, + seqDef const* sequences, size_t nbSeq, int longOffsets) +{ + BIT_CStream_t blockStream; + FSE_CState_t stateMatchLength; + FSE_CState_t stateOffsetBits; + FSE_CState_t stateLitLength; + + RETURN_ERROR_IF( + ERR_isError(BIT_initCStream(&blockStream, dst, dstCapacity)), + dstSize_tooSmall, "not enough space remaining"); + DEBUGLOG(6, "available space for bitstream : %i (dstCapacity=%u)", + (int)(blockStream.endPtr - blockStream.startPtr), + (unsigned)dstCapacity); + + /* first symbols */ + FSE_initCState2(&stateMatchLength, CTable_MatchLength, mlCodeTable[nbSeq-1]); + FSE_initCState2(&stateOffsetBits, CTable_OffsetBits, ofCodeTable[nbSeq-1]); + FSE_initCState2(&stateLitLength, CTable_LitLength, llCodeTable[nbSeq-1]); + BIT_addBits(&blockStream, sequences[nbSeq-1].litLength, LL_bits[llCodeTable[nbSeq-1]]); + if (MEM_32bits()) BIT_flushBits(&blockStream); + BIT_addBits(&blockStream, sequences[nbSeq-1].mlBase, ML_bits[mlCodeTable[nbSeq-1]]); + if (MEM_32bits()) BIT_flushBits(&blockStream); + if (longOffsets) { + U32 const ofBits = ofCodeTable[nbSeq-1]; + unsigned const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN-1); + if (extraBits) { + BIT_addBits(&blockStream, sequences[nbSeq-1].offBase, extraBits); + BIT_flushBits(&blockStream); + } + BIT_addBits(&blockStream, sequences[nbSeq-1].offBase >> extraBits, + ofBits - extraBits); + } else { + BIT_addBits(&blockStream, sequences[nbSeq-1].offBase, ofCodeTable[nbSeq-1]); + } + BIT_flushBits(&blockStream); + + { size_t n; + for (n=nbSeq-2 ; n= 64-7-(LLFSELog+MLFSELog+OffFSELog))) + BIT_flushBits(&blockStream); /* (7)*/ + BIT_addBits(&blockStream, sequences[n].litLength, llBits); + if (MEM_32bits() && ((llBits+mlBits)>24)) BIT_flushBits(&blockStream); + BIT_addBits(&blockStream, sequences[n].mlBase, mlBits); + if (MEM_32bits() || (ofBits+mlBits+llBits > 56)) BIT_flushBits(&blockStream); + if (longOffsets) { + unsigned const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN-1); + if (extraBits) { + BIT_addBits(&blockStream, sequences[n].offBase, extraBits); + BIT_flushBits(&blockStream); /* (7)*/ + } + BIT_addBits(&blockStream, sequences[n].offBase >> extraBits, + ofBits - extraBits); /* 31 */ + } else { + BIT_addBits(&blockStream, sequences[n].offBase, ofBits); /* 31 */ + } + BIT_flushBits(&blockStream); /* (7)*/ + DEBUGLOG(7, "remaining space : %i", (int)(blockStream.endPtr - blockStream.ptr)); + } } + + DEBUGLOG(6, "ZSTD_encodeSequences: flushing ML state with %u bits", stateMatchLength.stateLog); + FSE_flushCState(&blockStream, &stateMatchLength); + DEBUGLOG(6, "ZSTD_encodeSequences: flushing Off state with %u bits", stateOffsetBits.stateLog); + FSE_flushCState(&blockStream, &stateOffsetBits); + DEBUGLOG(6, "ZSTD_encodeSequences: flushing LL state with %u bits", stateLitLength.stateLog); + FSE_flushCState(&blockStream, &stateLitLength); + + { size_t const streamSize = BIT_closeCStream(&blockStream); + RETURN_ERROR_IF(streamSize==0, dstSize_tooSmall, "not enough space"); + return streamSize; + } +} + +static size_t +ZSTD_encodeSequences_default( + void* dst, size_t dstCapacity, + FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable, + FSE_CTable const* CTable_OffsetBits, BYTE const* ofCodeTable, + FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable, + seqDef const* sequences, size_t nbSeq, int longOffsets) +{ + return ZSTD_encodeSequences_body(dst, dstCapacity, + CTable_MatchLength, mlCodeTable, + CTable_OffsetBits, ofCodeTable, + CTable_LitLength, llCodeTable, + sequences, nbSeq, longOffsets); +} + + +#if DYNAMIC_BMI2 + +static BMI2_TARGET_ATTRIBUTE size_t +ZSTD_encodeSequences_bmi2( + void* dst, size_t dstCapacity, + FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable, + FSE_CTable const* CTable_OffsetBits, BYTE const* ofCodeTable, + FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable, + seqDef const* sequences, size_t nbSeq, int longOffsets) +{ + return ZSTD_encodeSequences_body(dst, dstCapacity, + CTable_MatchLength, mlCodeTable, + CTable_OffsetBits, ofCodeTable, + CTable_LitLength, llCodeTable, + sequences, nbSeq, longOffsets); +} + +#endif + +size_t ZSTD_encodeSequences( + void* dst, size_t dstCapacity, + FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable, + FSE_CTable const* CTable_OffsetBits, BYTE const* ofCodeTable, + FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable, + seqDef const* sequences, size_t nbSeq, int longOffsets, int bmi2) +{ + DEBUGLOG(5, "ZSTD_encodeSequences: dstCapacity = %u", (unsigned)dstCapacity); +#if DYNAMIC_BMI2 + if (bmi2) { + return ZSTD_encodeSequences_bmi2(dst, dstCapacity, + CTable_MatchLength, mlCodeTable, + CTable_OffsetBits, ofCodeTable, + CTable_LitLength, llCodeTable, + sequences, nbSeq, longOffsets); + } +#endif + (void)bmi2; + return ZSTD_encodeSequences_default(dst, dstCapacity, + CTable_MatchLength, mlCodeTable, + CTable_OffsetBits, ofCodeTable, + CTable_LitLength, llCodeTable, + sequences, nbSeq, longOffsets); +} +/**** ended inlining compress/zstd_compress_sequences.c ****/ +/**** start inlining compress/zstd_compress_superblock.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + /*-************************************* + * Dependencies + ***************************************/ +/**** start inlining zstd_compress_superblock.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_COMPRESS_ADVANCED_H +#define ZSTD_COMPRESS_ADVANCED_H + +/*-************************************* +* Dependencies +***************************************/ + +/**** skipping file: ../zstd.h ****/ + +/*-************************************* +* Target Compressed Block Size +***************************************/ + +/* ZSTD_compressSuperBlock() : + * Used to compress a super block when targetCBlockSize is being used. + * The given block will be compressed into multiple sub blocks that are around targetCBlockSize. */ +size_t ZSTD_compressSuperBlock(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + void const* src, size_t srcSize, + unsigned lastBlock); + +#endif /* ZSTD_COMPRESS_ADVANCED_H */ +/**** ended inlining zstd_compress_superblock.h ****/ + +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: hist.h ****/ +/**** skipping file: zstd_compress_internal.h ****/ +/**** skipping file: zstd_compress_sequences.h ****/ +/**** skipping file: zstd_compress_literals.h ****/ + +/** ZSTD_compressSubBlock_literal() : + * Compresses literals section for a sub-block. + * When we have to write the Huffman table we will sometimes choose a header + * size larger than necessary. This is because we have to pick the header size + * before we know the table size + compressed size, so we have a bound on the + * table size. If we guessed incorrectly, we fall back to uncompressed literals. + * + * We write the header when writeEntropy=1 and set entropyWritten=1 when we succeeded + * in writing the header, otherwise it is set to 0. + * + * hufMetadata->hType has literals block type info. + * If it is set_basic, all sub-blocks literals section will be Raw_Literals_Block. + * If it is set_rle, all sub-blocks literals section will be RLE_Literals_Block. + * If it is set_compressed, first sub-block's literals section will be Compressed_Literals_Block + * If it is set_compressed, first sub-block's literals section will be Treeless_Literals_Block + * and the following sub-blocks' literals sections will be Treeless_Literals_Block. + * @return : compressed size of literals section of a sub-block + * Or 0 if unable to compress. + * Or error code */ +static size_t +ZSTD_compressSubBlock_literal(const HUF_CElt* hufTable, + const ZSTD_hufCTablesMetadata_t* hufMetadata, + const BYTE* literals, size_t litSize, + void* dst, size_t dstSize, + const int bmi2, int writeEntropy, int* entropyWritten) +{ + size_t const header = writeEntropy ? 200 : 0; + size_t const lhSize = 3 + (litSize >= (1 KB - header)) + (litSize >= (16 KB - header)); + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = ostart + dstSize; + BYTE* op = ostart + lhSize; + U32 const singleStream = lhSize == 3; + symbolEncodingType_e hType = writeEntropy ? hufMetadata->hType : set_repeat; + size_t cLitSize = 0; + + DEBUGLOG(5, "ZSTD_compressSubBlock_literal (litSize=%zu, lhSize=%zu, writeEntropy=%d)", litSize, lhSize, writeEntropy); + + *entropyWritten = 0; + if (litSize == 0 || hufMetadata->hType == set_basic) { + DEBUGLOG(5, "ZSTD_compressSubBlock_literal using raw literal"); + return ZSTD_noCompressLiterals(dst, dstSize, literals, litSize); + } else if (hufMetadata->hType == set_rle) { + DEBUGLOG(5, "ZSTD_compressSubBlock_literal using rle literal"); + return ZSTD_compressRleLiteralsBlock(dst, dstSize, literals, litSize); + } + + assert(litSize > 0); + assert(hufMetadata->hType == set_compressed || hufMetadata->hType == set_repeat); + + if (writeEntropy && hufMetadata->hType == set_compressed) { + ZSTD_memcpy(op, hufMetadata->hufDesBuffer, hufMetadata->hufDesSize); + op += hufMetadata->hufDesSize; + cLitSize += hufMetadata->hufDesSize; + DEBUGLOG(5, "ZSTD_compressSubBlock_literal (hSize=%zu)", hufMetadata->hufDesSize); + } + + { int const flags = bmi2 ? HUF_flags_bmi2 : 0; + const size_t cSize = singleStream ? HUF_compress1X_usingCTable(op, oend-op, literals, litSize, hufTable, flags) + : HUF_compress4X_usingCTable(op, oend-op, literals, litSize, hufTable, flags); + op += cSize; + cLitSize += cSize; + if (cSize == 0 || ERR_isError(cSize)) { + DEBUGLOG(5, "Failed to write entropy tables %s", ZSTD_getErrorName(cSize)); + return 0; + } + /* If we expand and we aren't writing a header then emit uncompressed */ + if (!writeEntropy && cLitSize >= litSize) { + DEBUGLOG(5, "ZSTD_compressSubBlock_literal using raw literal because uncompressible"); + return ZSTD_noCompressLiterals(dst, dstSize, literals, litSize); + } + /* If we are writing headers then allow expansion that doesn't change our header size. */ + if (lhSize < (size_t)(3 + (cLitSize >= 1 KB) + (cLitSize >= 16 KB))) { + assert(cLitSize > litSize); + DEBUGLOG(5, "Literals expanded beyond allowed header size"); + return ZSTD_noCompressLiterals(dst, dstSize, literals, litSize); + } + DEBUGLOG(5, "ZSTD_compressSubBlock_literal (cSize=%zu)", cSize); + } + + /* Build header */ + switch(lhSize) + { + case 3: /* 2 - 2 - 10 - 10 */ + { U32 const lhc = hType + ((!singleStream) << 2) + ((U32)litSize<<4) + ((U32)cLitSize<<14); + MEM_writeLE24(ostart, lhc); + break; + } + case 4: /* 2 - 2 - 14 - 14 */ + { U32 const lhc = hType + (2 << 2) + ((U32)litSize<<4) + ((U32)cLitSize<<18); + MEM_writeLE32(ostart, lhc); + break; + } + case 5: /* 2 - 2 - 18 - 18 */ + { U32 const lhc = hType + (3 << 2) + ((U32)litSize<<4) + ((U32)cLitSize<<22); + MEM_writeLE32(ostart, lhc); + ostart[4] = (BYTE)(cLitSize >> 10); + break; + } + default: /* not possible : lhSize is {3,4,5} */ + assert(0); + } + *entropyWritten = 1; + DEBUGLOG(5, "Compressed literals: %u -> %u", (U32)litSize, (U32)(op-ostart)); + return op-ostart; +} + +static size_t +ZSTD_seqDecompressedSize(seqStore_t const* seqStore, + const seqDef* sequences, size_t nbSeq, + size_t litSize, int lastSequence) +{ + const seqDef* const sstart = sequences; + const seqDef* const send = sequences + nbSeq; + const seqDef* sp = sstart; + size_t matchLengthSum = 0; + size_t litLengthSum = 0; + (void)(litLengthSum); /* suppress unused variable warning on some environments */ + while (send-sp > 0) { + ZSTD_sequenceLength const seqLen = ZSTD_getSequenceLength(seqStore, sp); + litLengthSum += seqLen.litLength; + matchLengthSum += seqLen.matchLength; + sp++; + } + assert(litLengthSum <= litSize); + if (!lastSequence) { + assert(litLengthSum == litSize); + } + return matchLengthSum + litSize; +} + +/** ZSTD_compressSubBlock_sequences() : + * Compresses sequences section for a sub-block. + * fseMetadata->llType, fseMetadata->ofType, and fseMetadata->mlType have + * symbol compression modes for the super-block. + * The first successfully compressed block will have these in its header. + * We set entropyWritten=1 when we succeed in compressing the sequences. + * The following sub-blocks will always have repeat mode. + * @return : compressed size of sequences section of a sub-block + * Or 0 if it is unable to compress + * Or error code. */ +static size_t +ZSTD_compressSubBlock_sequences(const ZSTD_fseCTables_t* fseTables, + const ZSTD_fseCTablesMetadata_t* fseMetadata, + const seqDef* sequences, size_t nbSeq, + const BYTE* llCode, const BYTE* mlCode, const BYTE* ofCode, + const ZSTD_CCtx_params* cctxParams, + void* dst, size_t dstCapacity, + const int bmi2, int writeEntropy, int* entropyWritten) +{ + const int longOffsets = cctxParams->cParams.windowLog > STREAM_ACCUMULATOR_MIN; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = ostart + dstCapacity; + BYTE* op = ostart; + BYTE* seqHead; + + DEBUGLOG(5, "ZSTD_compressSubBlock_sequences (nbSeq=%zu, writeEntropy=%d, longOffsets=%d)", nbSeq, writeEntropy, longOffsets); + + *entropyWritten = 0; + /* Sequences Header */ + RETURN_ERROR_IF((oend-op) < 3 /*max nbSeq Size*/ + 1 /*seqHead*/, + dstSize_tooSmall, ""); + if (nbSeq < 0x7F) + *op++ = (BYTE)nbSeq; + else if (nbSeq < LONGNBSEQ) + op[0] = (BYTE)((nbSeq>>8) + 0x80), op[1] = (BYTE)nbSeq, op+=2; + else + op[0]=0xFF, MEM_writeLE16(op+1, (U16)(nbSeq - LONGNBSEQ)), op+=3; + if (nbSeq==0) { + return op - ostart; + } + + /* seqHead : flags for FSE encoding type */ + seqHead = op++; + + DEBUGLOG(5, "ZSTD_compressSubBlock_sequences (seqHeadSize=%u)", (unsigned)(op-ostart)); + + if (writeEntropy) { + const U32 LLtype = fseMetadata->llType; + const U32 Offtype = fseMetadata->ofType; + const U32 MLtype = fseMetadata->mlType; + DEBUGLOG(5, "ZSTD_compressSubBlock_sequences (fseTablesSize=%zu)", fseMetadata->fseTablesSize); + *seqHead = (BYTE)((LLtype<<6) + (Offtype<<4) + (MLtype<<2)); + ZSTD_memcpy(op, fseMetadata->fseTablesBuffer, fseMetadata->fseTablesSize); + op += fseMetadata->fseTablesSize; + } else { + const U32 repeat = set_repeat; + *seqHead = (BYTE)((repeat<<6) + (repeat<<4) + (repeat<<2)); + } + + { size_t const bitstreamSize = ZSTD_encodeSequences( + op, oend - op, + fseTables->matchlengthCTable, mlCode, + fseTables->offcodeCTable, ofCode, + fseTables->litlengthCTable, llCode, + sequences, nbSeq, + longOffsets, bmi2); + FORWARD_IF_ERROR(bitstreamSize, "ZSTD_encodeSequences failed"); + op += bitstreamSize; + /* zstd versions <= 1.3.4 mistakenly report corruption when + * FSE_readNCount() receives a buffer < 4 bytes. + * Fixed by https://github.com/facebook/zstd/pull/1146. + * This can happen when the last set_compressed table present is 2 + * bytes and the bitstream is only one byte. + * In this exceedingly rare case, we will simply emit an uncompressed + * block, since it isn't worth optimizing. + */ +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + if (writeEntropy && fseMetadata->lastCountSize && fseMetadata->lastCountSize + bitstreamSize < 4) { + /* NCountSize >= 2 && bitstreamSize > 0 ==> lastCountSize == 3 */ + assert(fseMetadata->lastCountSize + bitstreamSize == 3); + DEBUGLOG(5, "Avoiding bug in zstd decoder in versions <= 1.3.4 by " + "emitting an uncompressed block."); + return 0; + } +#endif + DEBUGLOG(5, "ZSTD_compressSubBlock_sequences (bitstreamSize=%zu)", bitstreamSize); + } + + /* zstd versions <= 1.4.0 mistakenly report error when + * sequences section body size is less than 3 bytes. + * Fixed by https://github.com/facebook/zstd/pull/1664. + * This can happen when the previous sequences section block is compressed + * with rle mode and the current block's sequences section is compressed + * with repeat mode where sequences section body size can be 1 byte. + */ +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + if (op-seqHead < 4) { + DEBUGLOG(5, "Avoiding bug in zstd decoder in versions <= 1.4.0 by emitting " + "an uncompressed block when sequences are < 4 bytes"); + return 0; + } +#endif + + *entropyWritten = 1; + return op - ostart; +} + +/** ZSTD_compressSubBlock() : + * Compresses a single sub-block. + * @return : compressed size of the sub-block + * Or 0 if it failed to compress. */ +static size_t ZSTD_compressSubBlock(const ZSTD_entropyCTables_t* entropy, + const ZSTD_entropyCTablesMetadata_t* entropyMetadata, + const seqDef* sequences, size_t nbSeq, + const BYTE* literals, size_t litSize, + const BYTE* llCode, const BYTE* mlCode, const BYTE* ofCode, + const ZSTD_CCtx_params* cctxParams, + void* dst, size_t dstCapacity, + const int bmi2, + int writeLitEntropy, int writeSeqEntropy, + int* litEntropyWritten, int* seqEntropyWritten, + U32 lastBlock) +{ + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = ostart + dstCapacity; + BYTE* op = ostart + ZSTD_blockHeaderSize; + DEBUGLOG(5, "ZSTD_compressSubBlock (litSize=%zu, nbSeq=%zu, writeLitEntropy=%d, writeSeqEntropy=%d, lastBlock=%d)", + litSize, nbSeq, writeLitEntropy, writeSeqEntropy, lastBlock); + { size_t cLitSize = ZSTD_compressSubBlock_literal((const HUF_CElt*)entropy->huf.CTable, + &entropyMetadata->hufMetadata, literals, litSize, + op, oend-op, bmi2, writeLitEntropy, litEntropyWritten); + FORWARD_IF_ERROR(cLitSize, "ZSTD_compressSubBlock_literal failed"); + if (cLitSize == 0) return 0; + op += cLitSize; + } + { size_t cSeqSize = ZSTD_compressSubBlock_sequences(&entropy->fse, + &entropyMetadata->fseMetadata, + sequences, nbSeq, + llCode, mlCode, ofCode, + cctxParams, + op, oend-op, + bmi2, writeSeqEntropy, seqEntropyWritten); + FORWARD_IF_ERROR(cSeqSize, "ZSTD_compressSubBlock_sequences failed"); + if (cSeqSize == 0) return 0; + op += cSeqSize; + } + /* Write block header */ + { size_t cSize = (op-ostart)-ZSTD_blockHeaderSize; + U32 const cBlockHeader24 = lastBlock + (((U32)bt_compressed)<<1) + (U32)(cSize << 3); + MEM_writeLE24(ostart, cBlockHeader24); + } + return op-ostart; +} + +static size_t ZSTD_estimateSubBlockSize_literal(const BYTE* literals, size_t litSize, + const ZSTD_hufCTables_t* huf, + const ZSTD_hufCTablesMetadata_t* hufMetadata, + void* workspace, size_t wkspSize, + int writeEntropy) +{ + unsigned* const countWksp = (unsigned*)workspace; + unsigned maxSymbolValue = 255; + size_t literalSectionHeaderSize = 3; /* Use hard coded size of 3 bytes */ + + if (hufMetadata->hType == set_basic) return litSize; + else if (hufMetadata->hType == set_rle) return 1; + else if (hufMetadata->hType == set_compressed || hufMetadata->hType == set_repeat) { + size_t const largest = HIST_count_wksp (countWksp, &maxSymbolValue, (const BYTE*)literals, litSize, workspace, wkspSize); + if (ZSTD_isError(largest)) return litSize; + { size_t cLitSizeEstimate = HUF_estimateCompressedSize((const HUF_CElt*)huf->CTable, countWksp, maxSymbolValue); + if (writeEntropy) cLitSizeEstimate += hufMetadata->hufDesSize; + return cLitSizeEstimate + literalSectionHeaderSize; + } } + assert(0); /* impossible */ + return 0; +} + +static size_t ZSTD_estimateSubBlockSize_symbolType(symbolEncodingType_e type, + const BYTE* codeTable, unsigned maxCode, + size_t nbSeq, const FSE_CTable* fseCTable, + const U8* additionalBits, + short const* defaultNorm, U32 defaultNormLog, U32 defaultMax, + void* workspace, size_t wkspSize) +{ + unsigned* const countWksp = (unsigned*)workspace; + const BYTE* ctp = codeTable; + const BYTE* const ctStart = ctp; + const BYTE* const ctEnd = ctStart + nbSeq; + size_t cSymbolTypeSizeEstimateInBits = 0; + unsigned max = maxCode; + + HIST_countFast_wksp(countWksp, &max, codeTable, nbSeq, workspace, wkspSize); /* can't fail */ + if (type == set_basic) { + /* We selected this encoding type, so it must be valid. */ + assert(max <= defaultMax); + cSymbolTypeSizeEstimateInBits = max <= defaultMax + ? ZSTD_crossEntropyCost(defaultNorm, defaultNormLog, countWksp, max) + : ERROR(GENERIC); + } else if (type == set_rle) { + cSymbolTypeSizeEstimateInBits = 0; + } else if (type == set_compressed || type == set_repeat) { + cSymbolTypeSizeEstimateInBits = ZSTD_fseBitCost(fseCTable, countWksp, max); + } + if (ZSTD_isError(cSymbolTypeSizeEstimateInBits)) return nbSeq * 10; + while (ctp < ctEnd) { + if (additionalBits) cSymbolTypeSizeEstimateInBits += additionalBits[*ctp]; + else cSymbolTypeSizeEstimateInBits += *ctp; /* for offset, offset code is also the number of additional bits */ + ctp++; + } + return cSymbolTypeSizeEstimateInBits / 8; +} + +static size_t ZSTD_estimateSubBlockSize_sequences(const BYTE* ofCodeTable, + const BYTE* llCodeTable, + const BYTE* mlCodeTable, + size_t nbSeq, + const ZSTD_fseCTables_t* fseTables, + const ZSTD_fseCTablesMetadata_t* fseMetadata, + void* workspace, size_t wkspSize, + int writeEntropy) +{ + size_t const sequencesSectionHeaderSize = 3; /* Use hard coded size of 3 bytes */ + size_t cSeqSizeEstimate = 0; + if (nbSeq == 0) return sequencesSectionHeaderSize; + cSeqSizeEstimate += ZSTD_estimateSubBlockSize_symbolType(fseMetadata->ofType, ofCodeTable, MaxOff, + nbSeq, fseTables->offcodeCTable, NULL, + OF_defaultNorm, OF_defaultNormLog, DefaultMaxOff, + workspace, wkspSize); + cSeqSizeEstimate += ZSTD_estimateSubBlockSize_symbolType(fseMetadata->llType, llCodeTable, MaxLL, + nbSeq, fseTables->litlengthCTable, LL_bits, + LL_defaultNorm, LL_defaultNormLog, MaxLL, + workspace, wkspSize); + cSeqSizeEstimate += ZSTD_estimateSubBlockSize_symbolType(fseMetadata->mlType, mlCodeTable, MaxML, + nbSeq, fseTables->matchlengthCTable, ML_bits, + ML_defaultNorm, ML_defaultNormLog, MaxML, + workspace, wkspSize); + if (writeEntropy) cSeqSizeEstimate += fseMetadata->fseTablesSize; + return cSeqSizeEstimate + sequencesSectionHeaderSize; +} + +static size_t ZSTD_estimateSubBlockSize(const BYTE* literals, size_t litSize, + const BYTE* ofCodeTable, + const BYTE* llCodeTable, + const BYTE* mlCodeTable, + size_t nbSeq, + const ZSTD_entropyCTables_t* entropy, + const ZSTD_entropyCTablesMetadata_t* entropyMetadata, + void* workspace, size_t wkspSize, + int writeLitEntropy, int writeSeqEntropy) { + size_t cSizeEstimate = 0; + cSizeEstimate += ZSTD_estimateSubBlockSize_literal(literals, litSize, + &entropy->huf, &entropyMetadata->hufMetadata, + workspace, wkspSize, writeLitEntropy); + cSizeEstimate += ZSTD_estimateSubBlockSize_sequences(ofCodeTable, llCodeTable, mlCodeTable, + nbSeq, &entropy->fse, &entropyMetadata->fseMetadata, + workspace, wkspSize, writeSeqEntropy); + return cSizeEstimate + ZSTD_blockHeaderSize; +} + +static int ZSTD_needSequenceEntropyTables(ZSTD_fseCTablesMetadata_t const* fseMetadata) +{ + if (fseMetadata->llType == set_compressed || fseMetadata->llType == set_rle) + return 1; + if (fseMetadata->mlType == set_compressed || fseMetadata->mlType == set_rle) + return 1; + if (fseMetadata->ofType == set_compressed || fseMetadata->ofType == set_rle) + return 1; + return 0; +} + +/** ZSTD_compressSubBlock_multi() : + * Breaks super-block into multiple sub-blocks and compresses them. + * Entropy will be written to the first block. + * The following blocks will use repeat mode to compress. + * All sub-blocks are compressed blocks (no raw or rle blocks). + * @return : compressed size of the super block (which is multiple ZSTD blocks) + * Or 0 if it failed to compress. */ +static size_t ZSTD_compressSubBlock_multi(const seqStore_t* seqStorePtr, + const ZSTD_compressedBlockState_t* prevCBlock, + ZSTD_compressedBlockState_t* nextCBlock, + const ZSTD_entropyCTablesMetadata_t* entropyMetadata, + const ZSTD_CCtx_params* cctxParams, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const int bmi2, U32 lastBlock, + void* workspace, size_t wkspSize) +{ + const seqDef* const sstart = seqStorePtr->sequencesStart; + const seqDef* const send = seqStorePtr->sequences; + const seqDef* sp = sstart; + const BYTE* const lstart = seqStorePtr->litStart; + const BYTE* const lend = seqStorePtr->lit; + const BYTE* lp = lstart; + BYTE const* ip = (BYTE const*)src; + BYTE const* const iend = ip + srcSize; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = ostart + dstCapacity; + BYTE* op = ostart; + const BYTE* llCodePtr = seqStorePtr->llCode; + const BYTE* mlCodePtr = seqStorePtr->mlCode; + const BYTE* ofCodePtr = seqStorePtr->ofCode; + size_t targetCBlockSize = cctxParams->targetCBlockSize; + size_t litSize, seqCount; + int writeLitEntropy = entropyMetadata->hufMetadata.hType == set_compressed; + int writeSeqEntropy = 1; + int lastSequence = 0; + + DEBUGLOG(5, "ZSTD_compressSubBlock_multi (litSize=%u, nbSeq=%u)", + (unsigned)(lend-lp), (unsigned)(send-sstart)); + + litSize = 0; + seqCount = 0; + do { + size_t cBlockSizeEstimate = 0; + if (sstart == send) { + lastSequence = 1; + } else { + const seqDef* const sequence = sp + seqCount; + lastSequence = sequence == send - 1; + litSize += ZSTD_getSequenceLength(seqStorePtr, sequence).litLength; + seqCount++; + } + if (lastSequence) { + assert(lp <= lend); + assert(litSize <= (size_t)(lend - lp)); + litSize = (size_t)(lend - lp); + } + /* I think there is an optimization opportunity here. + * Calling ZSTD_estimateSubBlockSize for every sequence can be wasteful + * since it recalculates estimate from scratch. + * For example, it would recount literal distribution and symbol codes every time. + */ + cBlockSizeEstimate = ZSTD_estimateSubBlockSize(lp, litSize, ofCodePtr, llCodePtr, mlCodePtr, seqCount, + &nextCBlock->entropy, entropyMetadata, + workspace, wkspSize, writeLitEntropy, writeSeqEntropy); + if (cBlockSizeEstimate > targetCBlockSize || lastSequence) { + int litEntropyWritten = 0; + int seqEntropyWritten = 0; + const size_t decompressedSize = ZSTD_seqDecompressedSize(seqStorePtr, sp, seqCount, litSize, lastSequence); + const size_t cSize = ZSTD_compressSubBlock(&nextCBlock->entropy, entropyMetadata, + sp, seqCount, + lp, litSize, + llCodePtr, mlCodePtr, ofCodePtr, + cctxParams, + op, oend-op, + bmi2, writeLitEntropy, writeSeqEntropy, + &litEntropyWritten, &seqEntropyWritten, + lastBlock && lastSequence); + FORWARD_IF_ERROR(cSize, "ZSTD_compressSubBlock failed"); + if (cSize > 0 && cSize < decompressedSize) { + DEBUGLOG(5, "Committed the sub-block"); + assert(ip + decompressedSize <= iend); + ip += decompressedSize; + sp += seqCount; + lp += litSize; + op += cSize; + llCodePtr += seqCount; + mlCodePtr += seqCount; + ofCodePtr += seqCount; + litSize = 0; + seqCount = 0; + /* Entropy only needs to be written once */ + if (litEntropyWritten) { + writeLitEntropy = 0; + } + if (seqEntropyWritten) { + writeSeqEntropy = 0; + } + } + } + } while (!lastSequence); + if (writeLitEntropy) { + DEBUGLOG(5, "ZSTD_compressSubBlock_multi has literal entropy tables unwritten"); + ZSTD_memcpy(&nextCBlock->entropy.huf, &prevCBlock->entropy.huf, sizeof(prevCBlock->entropy.huf)); + } + if (writeSeqEntropy && ZSTD_needSequenceEntropyTables(&entropyMetadata->fseMetadata)) { + /* If we haven't written our entropy tables, then we've violated our contract and + * must emit an uncompressed block. + */ + DEBUGLOG(5, "ZSTD_compressSubBlock_multi has sequence entropy tables unwritten"); + return 0; + } + if (ip < iend) { + size_t const cSize = ZSTD_noCompressBlock(op, oend - op, ip, iend - ip, lastBlock); + DEBUGLOG(5, "ZSTD_compressSubBlock_multi last sub-block uncompressed, %zu bytes", (size_t)(iend - ip)); + FORWARD_IF_ERROR(cSize, "ZSTD_noCompressBlock failed"); + assert(cSize != 0); + op += cSize; + /* We have to regenerate the repcodes because we've skipped some sequences */ + if (sp < send) { + seqDef const* seq; + repcodes_t rep; + ZSTD_memcpy(&rep, prevCBlock->rep, sizeof(rep)); + for (seq = sstart; seq < sp; ++seq) { + ZSTD_updateRep(rep.rep, seq->offBase, ZSTD_getSequenceLength(seqStorePtr, seq).litLength == 0); + } + ZSTD_memcpy(nextCBlock->rep, &rep, sizeof(rep)); + } + } + DEBUGLOG(5, "ZSTD_compressSubBlock_multi compressed"); + return op-ostart; +} + +size_t ZSTD_compressSuperBlock(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + void const* src, size_t srcSize, + unsigned lastBlock) { + ZSTD_entropyCTablesMetadata_t entropyMetadata; + + FORWARD_IF_ERROR(ZSTD_buildBlockEntropyStats(&zc->seqStore, + &zc->blockState.prevCBlock->entropy, + &zc->blockState.nextCBlock->entropy, + &zc->appliedParams, + &entropyMetadata, + zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */), ""); + + return ZSTD_compressSubBlock_multi(&zc->seqStore, + zc->blockState.prevCBlock, + zc->blockState.nextCBlock, + &entropyMetadata, + &zc->appliedParams, + dst, dstCapacity, + src, srcSize, + zc->bmi2, lastBlock, + zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */); +} +/**** ended inlining compress/zstd_compress_superblock.c ****/ +/**** start inlining compress/zstd_compress.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/*-************************************* +* Dependencies +***************************************/ +/**** skipping file: ../common/allocations.h ****/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: hist.h ****/ +#define FSE_STATIC_LINKING_ONLY /* FSE_encodeSymbol */ +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/huf.h ****/ +/**** skipping file: zstd_compress_internal.h ****/ +/**** skipping file: zstd_compress_sequences.h ****/ +/**** skipping file: zstd_compress_literals.h ****/ +/**** start inlining zstd_fast.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_FAST_H +#define ZSTD_FAST_H + +#if defined (__cplusplus) +extern "C" { +#endif + +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: zstd_compress_internal.h ****/ + +void ZSTD_fillHashTable(ZSTD_matchState_t* ms, + void const* end, ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp); +size_t ZSTD_compressBlock_fast( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_fast_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_fast_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_FAST_H */ +/**** ended inlining zstd_fast.h ****/ +/**** start inlining zstd_double_fast.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_DOUBLE_FAST_H +#define ZSTD_DOUBLE_FAST_H + +#if defined (__cplusplus) +extern "C" { +#endif + +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: zstd_compress_internal.h ****/ + +void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, + void const* end, ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp); +size_t ZSTD_compressBlock_doubleFast( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_doubleFast_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_doubleFast_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_DOUBLE_FAST_H */ +/**** ended inlining zstd_double_fast.h ****/ +/**** start inlining zstd_lazy.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_LAZY_H +#define ZSTD_LAZY_H + +#if defined (__cplusplus) +extern "C" { +#endif + +/**** skipping file: zstd_compress_internal.h ****/ + +/** + * Dedicated Dictionary Search Structure bucket log. In the + * ZSTD_dedicatedDictSearch mode, the hashTable has + * 2 ** ZSTD_LAZY_DDSS_BUCKET_LOG entries in each bucket, rather than just + * one. + */ +#define ZSTD_LAZY_DDSS_BUCKET_LOG 2 + +#define ZSTD_ROW_HASH_TAG_BITS 8 /* nb bits to use for the tag */ + +U32 ZSTD_insertAndFindFirstIndex(ZSTD_matchState_t* ms, const BYTE* ip); +void ZSTD_row_update(ZSTD_matchState_t* const ms, const BYTE* ip); + +void ZSTD_dedicatedDictSearch_lazy_loadDictionary(ZSTD_matchState_t* ms, const BYTE* const ip); + +void ZSTD_preserveUnsortedMark (U32* const table, U32 const size, U32 const reducerValue); /*! used in ZSTD_reduceIndex(). preemptively increase value of ZSTD_DUBT_UNSORTED_MARK */ + +size_t ZSTD_compressBlock_btlazy2( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy2( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_greedy( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy2_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_greedy_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); + +size_t ZSTD_compressBlock_btlazy2_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy2_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_greedy_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy2_dictMatchState_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy_dictMatchState_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_greedy_dictMatchState_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); + +size_t ZSTD_compressBlock_lazy2_dedicatedDictSearch( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy_dedicatedDictSearch( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_greedy_dedicatedDictSearch( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy2_dedicatedDictSearch_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy_dedicatedDictSearch_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_greedy_dedicatedDictSearch_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); + +size_t ZSTD_compressBlock_greedy_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy2_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_greedy_extDict_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy_extDict_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_lazy2_extDict_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_btlazy2_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_LAZY_H */ +/**** ended inlining zstd_lazy.h ****/ +/**** start inlining zstd_opt.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_OPT_H +#define ZSTD_OPT_H + +#if defined (__cplusplus) +extern "C" { +#endif + +/**** skipping file: zstd_compress_internal.h ****/ + +/* used in ZSTD_loadDictionaryContent() */ +void ZSTD_updateTree(ZSTD_matchState_t* ms, const BYTE* ip, const BYTE* iend); + +size_t ZSTD_compressBlock_btopt( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_btultra( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_btultra2( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); + + +size_t ZSTD_compressBlock_btopt_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_btultra_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); + +size_t ZSTD_compressBlock_btopt_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); +size_t ZSTD_compressBlock_btultra_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize); + + /* note : no btultra2 variant for extDict nor dictMatchState, + * because btultra2 is not meant to work with dictionaries + * and is only specific for the first block (no prefix) */ + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_OPT_H */ +/**** ended inlining zstd_opt.h ****/ +/**** start inlining zstd_ldm.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_LDM_H +#define ZSTD_LDM_H + +#if defined (__cplusplus) +extern "C" { +#endif + +/**** skipping file: zstd_compress_internal.h ****/ +/**** skipping file: ../zstd.h ****/ + +/*-************************************* +* Long distance matching +***************************************/ + +#define ZSTD_LDM_DEFAULT_WINDOW_LOG ZSTD_WINDOWLOG_LIMIT_DEFAULT + +void ZSTD_ldm_fillHashTable( + ldmState_t* state, const BYTE* ip, + const BYTE* iend, ldmParams_t const* params); + +/** + * ZSTD_ldm_generateSequences(): + * + * Generates the sequences using the long distance match finder. + * Generates long range matching sequences in `sequences`, which parse a prefix + * of the source. `sequences` must be large enough to store every sequence, + * which can be checked with `ZSTD_ldm_getMaxNbSeq()`. + * @returns 0 or an error code. + * + * NOTE: The user must have called ZSTD_window_update() for all of the input + * they have, even if they pass it to ZSTD_ldm_generateSequences() in chunks. + * NOTE: This function returns an error if it runs out of space to store + * sequences. + */ +size_t ZSTD_ldm_generateSequences( + ldmState_t* ldms, rawSeqStore_t* sequences, + ldmParams_t const* params, void const* src, size_t srcSize); + +/** + * ZSTD_ldm_blockCompress(): + * + * Compresses a block using the predefined sequences, along with a secondary + * block compressor. The literals section of every sequence is passed to the + * secondary block compressor, and those sequences are interspersed with the + * predefined sequences. Returns the length of the last literals. + * Updates `rawSeqStore.pos` to indicate how many sequences have been consumed. + * `rawSeqStore.seq` may also be updated to split the last sequence between two + * blocks. + * @return The length of the last literals. + * + * NOTE: The source must be at most the maximum block size, but the predefined + * sequences can be any size, and may be longer than the block. In the case that + * they are longer than the block, the last sequences may need to be split into + * two. We handle that case correctly, and update `rawSeqStore` appropriately. + * NOTE: This function does not return any errors. + */ +size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore, + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + ZSTD_paramSwitch_e useRowMatchFinder, + void const* src, size_t srcSize); + +/** + * ZSTD_ldm_skipSequences(): + * + * Skip past `srcSize` bytes worth of sequences in `rawSeqStore`. + * Avoids emitting matches less than `minMatch` bytes. + * Must be called for data that is not passed to ZSTD_ldm_blockCompress(). + */ +void ZSTD_ldm_skipSequences(rawSeqStore_t* rawSeqStore, size_t srcSize, + U32 const minMatch); + +/* ZSTD_ldm_skipRawSeqStoreBytes(): + * Moves forward in rawSeqStore by nbBytes, updating fields 'pos' and 'posInSequence'. + * Not to be used in conjunction with ZSTD_ldm_skipSequences(). + * Must be called for data with is not passed to ZSTD_ldm_blockCompress(). + */ +void ZSTD_ldm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t nbBytes); + +/** ZSTD_ldm_getTableSize() : + * Estimate the space needed for long distance matching tables or 0 if LDM is + * disabled. + */ +size_t ZSTD_ldm_getTableSize(ldmParams_t params); + +/** ZSTD_ldm_getSeqSpace() : + * Return an upper bound on the number of sequences that can be produced by + * the long distance matcher, or 0 if LDM is disabled. + */ +size_t ZSTD_ldm_getMaxNbSeq(ldmParams_t params, size_t maxChunkSize); + +/** ZSTD_ldm_adjustParameters() : + * If the params->hashRateLog is not set, set it to its default value based on + * windowLog and params->hashLog. + * + * Ensures that params->bucketSizeLog is <= params->hashLog (setting it to + * params->hashLog if it is not). + * + * Ensures that the minMatchLength >= targetLength during optimal parsing. + */ +void ZSTD_ldm_adjustParameters(ldmParams_t* params, + ZSTD_compressionParameters const* cParams); + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_FAST_H */ +/**** ended inlining zstd_ldm.h ****/ +/**** skipping file: zstd_compress_superblock.h ****/ +/**** skipping file: ../common/bits.h ****/ + +/* *************************************************************** +* Tuning parameters +*****************************************************************/ +/*! + * COMPRESS_HEAPMODE : + * Select how default decompression function ZSTD_compress() allocates its context, + * on stack (0, default), or into heap (1). + * Note that functions with explicit context such as ZSTD_compressCCtx() are unaffected. + */ +#ifndef ZSTD_COMPRESS_HEAPMODE +# define ZSTD_COMPRESS_HEAPMODE 0 +#endif + +/*! + * ZSTD_HASHLOG3_MAX : + * Maximum size of the hash table dedicated to find 3-bytes matches, + * in log format, aka 17 => 1 << 17 == 128Ki positions. + * This structure is only used in zstd_opt. + * Since allocation is centralized for all strategies, it has to be known here. + * The actual (selected) size of the hash table is then stored in ZSTD_matchState_t.hashLog3, + * so that zstd_opt.c doesn't need to know about this constant. + */ +#ifndef ZSTD_HASHLOG3_MAX +# define ZSTD_HASHLOG3_MAX 17 +#endif + +/*-************************************* +* Helper functions +***************************************/ +/* ZSTD_compressBound() + * Note that the result from this function is only valid for + * the one-pass compression functions. + * When employing the streaming mode, + * if flushes are frequently altering the size of blocks, + * the overhead from block headers can make the compressed data larger + * than the return value of ZSTD_compressBound(). + */ +size_t ZSTD_compressBound(size_t srcSize) { + size_t const r = ZSTD_COMPRESSBOUND(srcSize); + if (r==0) return ERROR(srcSize_wrong); + return r; +} + + +/*-************************************* +* Context memory management +***************************************/ +struct ZSTD_CDict_s { + const void* dictContent; + size_t dictContentSize; + ZSTD_dictContentType_e dictContentType; /* The dictContentType the CDict was created with */ + U32* entropyWorkspace; /* entropy workspace of HUF_WORKSPACE_SIZE bytes */ + ZSTD_cwksp workspace; + ZSTD_matchState_t matchState; + ZSTD_compressedBlockState_t cBlockState; + ZSTD_customMem customMem; + U32 dictID; + int compressionLevel; /* 0 indicates that advanced API was used to select CDict params */ + ZSTD_paramSwitch_e useRowMatchFinder; /* Indicates whether the CDict was created with params that would use + * row-based matchfinder. Unless the cdict is reloaded, we will use + * the same greedy/lazy matchfinder at compression time. + */ +}; /* typedef'd to ZSTD_CDict within "zstd.h" */ + +ZSTD_CCtx* ZSTD_createCCtx(void) +{ + return ZSTD_createCCtx_advanced(ZSTD_defaultCMem); +} + +static void ZSTD_initCCtx(ZSTD_CCtx* cctx, ZSTD_customMem memManager) +{ + assert(cctx != NULL); + ZSTD_memset(cctx, 0, sizeof(*cctx)); + cctx->customMem = memManager; + cctx->bmi2 = ZSTD_cpuSupportsBmi2(); + { size_t const err = ZSTD_CCtx_reset(cctx, ZSTD_reset_parameters); + assert(!ZSTD_isError(err)); + (void)err; + } +} + +ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem) +{ + ZSTD_STATIC_ASSERT(zcss_init==0); + ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_UNKNOWN==(0ULL - 1)); + if ((!customMem.customAlloc) ^ (!customMem.customFree)) return NULL; + { ZSTD_CCtx* const cctx = (ZSTD_CCtx*)ZSTD_customMalloc(sizeof(ZSTD_CCtx), customMem); + if (!cctx) return NULL; + ZSTD_initCCtx(cctx, customMem); + return cctx; + } +} + +ZSTD_CCtx* ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize) +{ + ZSTD_cwksp ws; + ZSTD_CCtx* cctx; + if (workspaceSize <= sizeof(ZSTD_CCtx)) return NULL; /* minimum size */ + if ((size_t)workspace & 7) return NULL; /* must be 8-aligned */ + ZSTD_cwksp_init(&ws, workspace, workspaceSize, ZSTD_cwksp_static_alloc); + + cctx = (ZSTD_CCtx*)ZSTD_cwksp_reserve_object(&ws, sizeof(ZSTD_CCtx)); + if (cctx == NULL) return NULL; + + ZSTD_memset(cctx, 0, sizeof(ZSTD_CCtx)); + ZSTD_cwksp_move(&cctx->workspace, &ws); + cctx->staticSize = workspaceSize; + + /* statically sized space. entropyWorkspace never moves (but prev/next block swap places) */ + if (!ZSTD_cwksp_check_available(&cctx->workspace, ENTROPY_WORKSPACE_SIZE + 2 * sizeof(ZSTD_compressedBlockState_t))) return NULL; + cctx->blockState.prevCBlock = (ZSTD_compressedBlockState_t*)ZSTD_cwksp_reserve_object(&cctx->workspace, sizeof(ZSTD_compressedBlockState_t)); + cctx->blockState.nextCBlock = (ZSTD_compressedBlockState_t*)ZSTD_cwksp_reserve_object(&cctx->workspace, sizeof(ZSTD_compressedBlockState_t)); + cctx->entropyWorkspace = (U32*)ZSTD_cwksp_reserve_object(&cctx->workspace, ENTROPY_WORKSPACE_SIZE); + cctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid()); + return cctx; +} + +/** + * Clears and frees all of the dictionaries in the CCtx. + */ +static void ZSTD_clearAllDicts(ZSTD_CCtx* cctx) +{ + ZSTD_customFree(cctx->localDict.dictBuffer, cctx->customMem); + ZSTD_freeCDict(cctx->localDict.cdict); + ZSTD_memset(&cctx->localDict, 0, sizeof(cctx->localDict)); + ZSTD_memset(&cctx->prefixDict, 0, sizeof(cctx->prefixDict)); + cctx->cdict = NULL; +} + +static size_t ZSTD_sizeof_localDict(ZSTD_localDict dict) +{ + size_t const bufferSize = dict.dictBuffer != NULL ? dict.dictSize : 0; + size_t const cdictSize = ZSTD_sizeof_CDict(dict.cdict); + return bufferSize + cdictSize; +} + +static void ZSTD_freeCCtxContent(ZSTD_CCtx* cctx) +{ + assert(cctx != NULL); + assert(cctx->staticSize == 0); + ZSTD_clearAllDicts(cctx); +#ifdef ZSTD_MULTITHREAD + ZSTDMT_freeCCtx(cctx->mtctx); cctx->mtctx = NULL; +#endif + ZSTD_cwksp_free(&cctx->workspace, cctx->customMem); +} + +size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx) +{ + if (cctx==NULL) return 0; /* support free on NULL */ + RETURN_ERROR_IF(cctx->staticSize, memory_allocation, + "not compatible with static CCtx"); + { int cctxInWorkspace = ZSTD_cwksp_owns_buffer(&cctx->workspace, cctx); + ZSTD_freeCCtxContent(cctx); + if (!cctxInWorkspace) ZSTD_customFree(cctx, cctx->customMem); + } + return 0; +} + + +static size_t ZSTD_sizeof_mtctx(const ZSTD_CCtx* cctx) +{ +#ifdef ZSTD_MULTITHREAD + return ZSTDMT_sizeof_CCtx(cctx->mtctx); +#else + (void)cctx; + return 0; +#endif +} + + +size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx) +{ + if (cctx==NULL) return 0; /* support sizeof on NULL */ + /* cctx may be in the workspace */ + return (cctx->workspace.workspace == cctx ? 0 : sizeof(*cctx)) + + ZSTD_cwksp_sizeof(&cctx->workspace) + + ZSTD_sizeof_localDict(cctx->localDict) + + ZSTD_sizeof_mtctx(cctx); +} + +size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs) +{ + return ZSTD_sizeof_CCtx(zcs); /* same object */ +} + +/* private API call, for dictBuilder only */ +const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx) { return &(ctx->seqStore); } + +/* Returns true if the strategy supports using a row based matchfinder */ +static int ZSTD_rowMatchFinderSupported(const ZSTD_strategy strategy) { + return (strategy >= ZSTD_greedy && strategy <= ZSTD_lazy2); +} + +/* Returns true if the strategy and useRowMatchFinder mode indicate that we will use the row based matchfinder + * for this compression. + */ +static int ZSTD_rowMatchFinderUsed(const ZSTD_strategy strategy, const ZSTD_paramSwitch_e mode) { + assert(mode != ZSTD_ps_auto); + return ZSTD_rowMatchFinderSupported(strategy) && (mode == ZSTD_ps_enable); +} + +/* Returns row matchfinder usage given an initial mode and cParams */ +static ZSTD_paramSwitch_e ZSTD_resolveRowMatchFinderMode(ZSTD_paramSwitch_e mode, + const ZSTD_compressionParameters* const cParams) { +#if defined(ZSTD_ARCH_X86_SSE2) || defined(ZSTD_ARCH_ARM_NEON) + int const kHasSIMD128 = 1; +#else + int const kHasSIMD128 = 0; +#endif + if (mode != ZSTD_ps_auto) return mode; /* if requested enabled, but no SIMD, we still will use row matchfinder */ + mode = ZSTD_ps_disable; + if (!ZSTD_rowMatchFinderSupported(cParams->strategy)) return mode; + if (kHasSIMD128) { + if (cParams->windowLog > 14) mode = ZSTD_ps_enable; + } else { + if (cParams->windowLog > 17) mode = ZSTD_ps_enable; + } + return mode; +} + +/* Returns block splitter usage (generally speaking, when using slower/stronger compression modes) */ +static ZSTD_paramSwitch_e ZSTD_resolveBlockSplitterMode(ZSTD_paramSwitch_e mode, + const ZSTD_compressionParameters* const cParams) { + if (mode != ZSTD_ps_auto) return mode; + return (cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 17) ? ZSTD_ps_enable : ZSTD_ps_disable; +} + +/* Returns 1 if the arguments indicate that we should allocate a chainTable, 0 otherwise */ +static int ZSTD_allocateChainTable(const ZSTD_strategy strategy, + const ZSTD_paramSwitch_e useRowMatchFinder, + const U32 forDDSDict) { + assert(useRowMatchFinder != ZSTD_ps_auto); + /* We always should allocate a chaintable if we are allocating a matchstate for a DDS dictionary matchstate. + * We do not allocate a chaintable if we are using ZSTD_fast, or are using the row-based matchfinder. + */ + return forDDSDict || ((strategy != ZSTD_fast) && !ZSTD_rowMatchFinderUsed(strategy, useRowMatchFinder)); +} + +/* Returns ZSTD_ps_enable if compression parameters are such that we should + * enable long distance matching (wlog >= 27, strategy >= btopt). + * Returns ZSTD_ps_disable otherwise. + */ +static ZSTD_paramSwitch_e ZSTD_resolveEnableLdm(ZSTD_paramSwitch_e mode, + const ZSTD_compressionParameters* const cParams) { + if (mode != ZSTD_ps_auto) return mode; + return (cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 27) ? ZSTD_ps_enable : ZSTD_ps_disable; +} + +static int ZSTD_resolveExternalSequenceValidation(int mode) { + return mode; +} + +/* Resolves maxBlockSize to the default if no value is present. */ +static size_t ZSTD_resolveMaxBlockSize(size_t maxBlockSize) { + if (maxBlockSize == 0) { + return ZSTD_BLOCKSIZE_MAX; + } else { + return maxBlockSize; + } +} + +static ZSTD_paramSwitch_e ZSTD_resolveExternalRepcodeSearch(ZSTD_paramSwitch_e value, int cLevel) { + if (value != ZSTD_ps_auto) return value; + if (cLevel < 10) { + return ZSTD_ps_disable; + } else { + return ZSTD_ps_enable; + } +} + +/* Returns 1 if compression parameters are such that CDict hashtable and chaintable indices are tagged. + * If so, the tags need to be removed in ZSTD_resetCCtx_byCopyingCDict. */ +static int ZSTD_CDictIndicesAreTagged(const ZSTD_compressionParameters* const cParams) { + return cParams->strategy == ZSTD_fast || cParams->strategy == ZSTD_dfast; +} + +static ZSTD_CCtx_params ZSTD_makeCCtxParamsFromCParams( + ZSTD_compressionParameters cParams) +{ + ZSTD_CCtx_params cctxParams; + /* should not matter, as all cParams are presumed properly defined */ + ZSTD_CCtxParams_init(&cctxParams, ZSTD_CLEVEL_DEFAULT); + cctxParams.cParams = cParams; + + /* Adjust advanced params according to cParams */ + cctxParams.ldmParams.enableLdm = ZSTD_resolveEnableLdm(cctxParams.ldmParams.enableLdm, &cParams); + if (cctxParams.ldmParams.enableLdm == ZSTD_ps_enable) { + ZSTD_ldm_adjustParameters(&cctxParams.ldmParams, &cParams); + assert(cctxParams.ldmParams.hashLog >= cctxParams.ldmParams.bucketSizeLog); + assert(cctxParams.ldmParams.hashRateLog < 32); + } + cctxParams.useBlockSplitter = ZSTD_resolveBlockSplitterMode(cctxParams.useBlockSplitter, &cParams); + cctxParams.useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(cctxParams.useRowMatchFinder, &cParams); + cctxParams.validateSequences = ZSTD_resolveExternalSequenceValidation(cctxParams.validateSequences); + cctxParams.maxBlockSize = ZSTD_resolveMaxBlockSize(cctxParams.maxBlockSize); + cctxParams.searchForExternalRepcodes = ZSTD_resolveExternalRepcodeSearch(cctxParams.searchForExternalRepcodes, + cctxParams.compressionLevel); + assert(!ZSTD_checkCParams(cParams)); + return cctxParams; +} + +static ZSTD_CCtx_params* ZSTD_createCCtxParams_advanced( + ZSTD_customMem customMem) +{ + ZSTD_CCtx_params* params; + if ((!customMem.customAlloc) ^ (!customMem.customFree)) return NULL; + params = (ZSTD_CCtx_params*)ZSTD_customCalloc( + sizeof(ZSTD_CCtx_params), customMem); + if (!params) { return NULL; } + ZSTD_CCtxParams_init(params, ZSTD_CLEVEL_DEFAULT); + params->customMem = customMem; + return params; +} + +ZSTD_CCtx_params* ZSTD_createCCtxParams(void) +{ + return ZSTD_createCCtxParams_advanced(ZSTD_defaultCMem); +} + +size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params) +{ + if (params == NULL) { return 0; } + ZSTD_customFree(params, params->customMem); + return 0; +} + +size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params) +{ + return ZSTD_CCtxParams_init(params, ZSTD_CLEVEL_DEFAULT); +} + +size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel) { + RETURN_ERROR_IF(!cctxParams, GENERIC, "NULL pointer!"); + ZSTD_memset(cctxParams, 0, sizeof(*cctxParams)); + cctxParams->compressionLevel = compressionLevel; + cctxParams->fParams.contentSizeFlag = 1; + return 0; +} + +#define ZSTD_NO_CLEVEL 0 + +/** + * Initializes `cctxParams` from `params` and `compressionLevel`. + * @param compressionLevel If params are derived from a compression level then that compression level, otherwise ZSTD_NO_CLEVEL. + */ +static void +ZSTD_CCtxParams_init_internal(ZSTD_CCtx_params* cctxParams, + const ZSTD_parameters* params, + int compressionLevel) +{ + assert(!ZSTD_checkCParams(params->cParams)); + ZSTD_memset(cctxParams, 0, sizeof(*cctxParams)); + cctxParams->cParams = params->cParams; + cctxParams->fParams = params->fParams; + /* Should not matter, as all cParams are presumed properly defined. + * But, set it for tracing anyway. + */ + cctxParams->compressionLevel = compressionLevel; + cctxParams->useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(cctxParams->useRowMatchFinder, ¶ms->cParams); + cctxParams->useBlockSplitter = ZSTD_resolveBlockSplitterMode(cctxParams->useBlockSplitter, ¶ms->cParams); + cctxParams->ldmParams.enableLdm = ZSTD_resolveEnableLdm(cctxParams->ldmParams.enableLdm, ¶ms->cParams); + cctxParams->validateSequences = ZSTD_resolveExternalSequenceValidation(cctxParams->validateSequences); + cctxParams->maxBlockSize = ZSTD_resolveMaxBlockSize(cctxParams->maxBlockSize); + cctxParams->searchForExternalRepcodes = ZSTD_resolveExternalRepcodeSearch(cctxParams->searchForExternalRepcodes, compressionLevel); + DEBUGLOG(4, "ZSTD_CCtxParams_init_internal: useRowMatchFinder=%d, useBlockSplitter=%d ldm=%d", + cctxParams->useRowMatchFinder, cctxParams->useBlockSplitter, cctxParams->ldmParams.enableLdm); +} + +size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params) +{ + RETURN_ERROR_IF(!cctxParams, GENERIC, "NULL pointer!"); + FORWARD_IF_ERROR( ZSTD_checkCParams(params.cParams) , ""); + ZSTD_CCtxParams_init_internal(cctxParams, ¶ms, ZSTD_NO_CLEVEL); + return 0; +} + +/** + * Sets cctxParams' cParams and fParams from params, but otherwise leaves them alone. + * @param params Validated zstd parameters. + */ +static void ZSTD_CCtxParams_setZstdParams( + ZSTD_CCtx_params* cctxParams, const ZSTD_parameters* params) +{ + assert(!ZSTD_checkCParams(params->cParams)); + cctxParams->cParams = params->cParams; + cctxParams->fParams = params->fParams; + /* Should not matter, as all cParams are presumed properly defined. + * But, set it for tracing anyway. + */ + cctxParams->compressionLevel = ZSTD_NO_CLEVEL; +} + +ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) +{ + ZSTD_bounds bounds = { 0, 0, 0 }; + + switch(param) + { + case ZSTD_c_compressionLevel: + bounds.lowerBound = ZSTD_minCLevel(); + bounds.upperBound = ZSTD_maxCLevel(); + return bounds; + + case ZSTD_c_windowLog: + bounds.lowerBound = ZSTD_WINDOWLOG_MIN; + bounds.upperBound = ZSTD_WINDOWLOG_MAX; + return bounds; + + case ZSTD_c_hashLog: + bounds.lowerBound = ZSTD_HASHLOG_MIN; + bounds.upperBound = ZSTD_HASHLOG_MAX; + return bounds; + + case ZSTD_c_chainLog: + bounds.lowerBound = ZSTD_CHAINLOG_MIN; + bounds.upperBound = ZSTD_CHAINLOG_MAX; + return bounds; + + case ZSTD_c_searchLog: + bounds.lowerBound = ZSTD_SEARCHLOG_MIN; + bounds.upperBound = ZSTD_SEARCHLOG_MAX; + return bounds; + + case ZSTD_c_minMatch: + bounds.lowerBound = ZSTD_MINMATCH_MIN; + bounds.upperBound = ZSTD_MINMATCH_MAX; + return bounds; + + case ZSTD_c_targetLength: + bounds.lowerBound = ZSTD_TARGETLENGTH_MIN; + bounds.upperBound = ZSTD_TARGETLENGTH_MAX; + return bounds; + + case ZSTD_c_strategy: + bounds.lowerBound = ZSTD_STRATEGY_MIN; + bounds.upperBound = ZSTD_STRATEGY_MAX; + return bounds; + + case ZSTD_c_contentSizeFlag: + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + + case ZSTD_c_checksumFlag: + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + + case ZSTD_c_dictIDFlag: + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + + case ZSTD_c_nbWorkers: + bounds.lowerBound = 0; +#ifdef ZSTD_MULTITHREAD + bounds.upperBound = ZSTDMT_NBWORKERS_MAX; +#else + bounds.upperBound = 0; +#endif + return bounds; + + case ZSTD_c_jobSize: + bounds.lowerBound = 0; +#ifdef ZSTD_MULTITHREAD + bounds.upperBound = ZSTDMT_JOBSIZE_MAX; +#else + bounds.upperBound = 0; +#endif + return bounds; + + case ZSTD_c_overlapLog: +#ifdef ZSTD_MULTITHREAD + bounds.lowerBound = ZSTD_OVERLAPLOG_MIN; + bounds.upperBound = ZSTD_OVERLAPLOG_MAX; +#else + bounds.lowerBound = 0; + bounds.upperBound = 0; +#endif + return bounds; + + case ZSTD_c_enableDedicatedDictSearch: + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + + case ZSTD_c_enableLongDistanceMatching: + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; + return bounds; + + case ZSTD_c_ldmHashLog: + bounds.lowerBound = ZSTD_LDM_HASHLOG_MIN; + bounds.upperBound = ZSTD_LDM_HASHLOG_MAX; + return bounds; + + case ZSTD_c_ldmMinMatch: + bounds.lowerBound = ZSTD_LDM_MINMATCH_MIN; + bounds.upperBound = ZSTD_LDM_MINMATCH_MAX; + return bounds; + + case ZSTD_c_ldmBucketSizeLog: + bounds.lowerBound = ZSTD_LDM_BUCKETSIZELOG_MIN; + bounds.upperBound = ZSTD_LDM_BUCKETSIZELOG_MAX; + return bounds; + + case ZSTD_c_ldmHashRateLog: + bounds.lowerBound = ZSTD_LDM_HASHRATELOG_MIN; + bounds.upperBound = ZSTD_LDM_HASHRATELOG_MAX; + return bounds; + + /* experimental parameters */ + case ZSTD_c_rsyncable: + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + + case ZSTD_c_forceMaxWindow : + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + + case ZSTD_c_format: + ZSTD_STATIC_ASSERT(ZSTD_f_zstd1 < ZSTD_f_zstd1_magicless); + bounds.lowerBound = ZSTD_f_zstd1; + bounds.upperBound = ZSTD_f_zstd1_magicless; /* note : how to ensure at compile time that this is the highest value enum ? */ + return bounds; + + case ZSTD_c_forceAttachDict: + ZSTD_STATIC_ASSERT(ZSTD_dictDefaultAttach < ZSTD_dictForceLoad); + bounds.lowerBound = ZSTD_dictDefaultAttach; + bounds.upperBound = ZSTD_dictForceLoad; /* note : how to ensure at compile time that this is the highest value enum ? */ + return bounds; + + case ZSTD_c_literalCompressionMode: + ZSTD_STATIC_ASSERT(ZSTD_ps_auto < ZSTD_ps_enable && ZSTD_ps_enable < ZSTD_ps_disable); + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; + return bounds; + + case ZSTD_c_targetCBlockSize: + bounds.lowerBound = ZSTD_TARGETCBLOCKSIZE_MIN; + bounds.upperBound = ZSTD_TARGETCBLOCKSIZE_MAX; + return bounds; + + case ZSTD_c_srcSizeHint: + bounds.lowerBound = ZSTD_SRCSIZEHINT_MIN; + bounds.upperBound = ZSTD_SRCSIZEHINT_MAX; + return bounds; + + case ZSTD_c_stableInBuffer: + case ZSTD_c_stableOutBuffer: + bounds.lowerBound = (int)ZSTD_bm_buffered; + bounds.upperBound = (int)ZSTD_bm_stable; + return bounds; + + case ZSTD_c_blockDelimiters: + bounds.lowerBound = (int)ZSTD_sf_noBlockDelimiters; + bounds.upperBound = (int)ZSTD_sf_explicitBlockDelimiters; + return bounds; + + case ZSTD_c_validateSequences: + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + + case ZSTD_c_useBlockSplitter: + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; + return bounds; + + case ZSTD_c_useRowMatchFinder: + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; + return bounds; + + case ZSTD_c_deterministicRefPrefix: + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + + case ZSTD_c_prefetchCDictTables: + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; + return bounds; + + case ZSTD_c_enableSeqProducerFallback: + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + + case ZSTD_c_maxBlockSize: + bounds.lowerBound = ZSTD_BLOCKSIZE_MAX_MIN; + bounds.upperBound = ZSTD_BLOCKSIZE_MAX; + return bounds; + + case ZSTD_c_searchForExternalRepcodes: + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; + return bounds; + + default: + bounds.error = ERROR(parameter_unsupported); + return bounds; + } +} + +/* ZSTD_cParam_clampBounds: + * Clamps the value into the bounded range. + */ +static size_t ZSTD_cParam_clampBounds(ZSTD_cParameter cParam, int* value) +{ + ZSTD_bounds const bounds = ZSTD_cParam_getBounds(cParam); + if (ZSTD_isError(bounds.error)) return bounds.error; + if (*value < bounds.lowerBound) *value = bounds.lowerBound; + if (*value > bounds.upperBound) *value = bounds.upperBound; + return 0; +} + +#define BOUNDCHECK(cParam, val) { \ + RETURN_ERROR_IF(!ZSTD_cParam_withinBounds(cParam,val), \ + parameter_outOfBound, "Param out of bounds"); \ +} + + +static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param) +{ + switch(param) + { + case ZSTD_c_compressionLevel: + case ZSTD_c_hashLog: + case ZSTD_c_chainLog: + case ZSTD_c_searchLog: + case ZSTD_c_minMatch: + case ZSTD_c_targetLength: + case ZSTD_c_strategy: + return 1; + + case ZSTD_c_format: + case ZSTD_c_windowLog: + case ZSTD_c_contentSizeFlag: + case ZSTD_c_checksumFlag: + case ZSTD_c_dictIDFlag: + case ZSTD_c_forceMaxWindow : + case ZSTD_c_nbWorkers: + case ZSTD_c_jobSize: + case ZSTD_c_overlapLog: + case ZSTD_c_rsyncable: + case ZSTD_c_enableDedicatedDictSearch: + case ZSTD_c_enableLongDistanceMatching: + case ZSTD_c_ldmHashLog: + case ZSTD_c_ldmMinMatch: + case ZSTD_c_ldmBucketSizeLog: + case ZSTD_c_ldmHashRateLog: + case ZSTD_c_forceAttachDict: + case ZSTD_c_literalCompressionMode: + case ZSTD_c_targetCBlockSize: + case ZSTD_c_srcSizeHint: + case ZSTD_c_stableInBuffer: + case ZSTD_c_stableOutBuffer: + case ZSTD_c_blockDelimiters: + case ZSTD_c_validateSequences: + case ZSTD_c_useBlockSplitter: + case ZSTD_c_useRowMatchFinder: + case ZSTD_c_deterministicRefPrefix: + case ZSTD_c_prefetchCDictTables: + case ZSTD_c_enableSeqProducerFallback: + case ZSTD_c_maxBlockSize: + case ZSTD_c_searchForExternalRepcodes: + default: + return 0; + } +} + +size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value) +{ + DEBUGLOG(4, "ZSTD_CCtx_setParameter (%i, %i)", (int)param, value); + if (cctx->streamStage != zcss_init) { + if (ZSTD_isUpdateAuthorized(param)) { + cctx->cParamsChanged = 1; + } else { + RETURN_ERROR(stage_wrong, "can only set params in cctx init stage"); + } } + + switch(param) + { + case ZSTD_c_nbWorkers: + RETURN_ERROR_IF((value!=0) && cctx->staticSize, parameter_unsupported, + "MT not compatible with static alloc"); + break; + + case ZSTD_c_compressionLevel: + case ZSTD_c_windowLog: + case ZSTD_c_hashLog: + case ZSTD_c_chainLog: + case ZSTD_c_searchLog: + case ZSTD_c_minMatch: + case ZSTD_c_targetLength: + case ZSTD_c_strategy: + case ZSTD_c_ldmHashRateLog: + case ZSTD_c_format: + case ZSTD_c_contentSizeFlag: + case ZSTD_c_checksumFlag: + case ZSTD_c_dictIDFlag: + case ZSTD_c_forceMaxWindow: + case ZSTD_c_forceAttachDict: + case ZSTD_c_literalCompressionMode: + case ZSTD_c_jobSize: + case ZSTD_c_overlapLog: + case ZSTD_c_rsyncable: + case ZSTD_c_enableDedicatedDictSearch: + case ZSTD_c_enableLongDistanceMatching: + case ZSTD_c_ldmHashLog: + case ZSTD_c_ldmMinMatch: + case ZSTD_c_ldmBucketSizeLog: + case ZSTD_c_targetCBlockSize: + case ZSTD_c_srcSizeHint: + case ZSTD_c_stableInBuffer: + case ZSTD_c_stableOutBuffer: + case ZSTD_c_blockDelimiters: + case ZSTD_c_validateSequences: + case ZSTD_c_useBlockSplitter: + case ZSTD_c_useRowMatchFinder: + case ZSTD_c_deterministicRefPrefix: + case ZSTD_c_prefetchCDictTables: + case ZSTD_c_enableSeqProducerFallback: + case ZSTD_c_maxBlockSize: + case ZSTD_c_searchForExternalRepcodes: + break; + + default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); + } + return ZSTD_CCtxParams_setParameter(&cctx->requestedParams, param, value); +} + +size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, + ZSTD_cParameter param, int value) +{ + DEBUGLOG(4, "ZSTD_CCtxParams_setParameter (%i, %i)", (int)param, value); + switch(param) + { + case ZSTD_c_format : + BOUNDCHECK(ZSTD_c_format, value); + CCtxParams->format = (ZSTD_format_e)value; + return (size_t)CCtxParams->format; + + case ZSTD_c_compressionLevel : { + FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(param, &value), ""); + if (value == 0) + CCtxParams->compressionLevel = ZSTD_CLEVEL_DEFAULT; /* 0 == default */ + else + CCtxParams->compressionLevel = value; + if (CCtxParams->compressionLevel >= 0) return (size_t)CCtxParams->compressionLevel; + return 0; /* return type (size_t) cannot represent negative values */ + } + + case ZSTD_c_windowLog : + if (value!=0) /* 0 => use default */ + BOUNDCHECK(ZSTD_c_windowLog, value); + CCtxParams->cParams.windowLog = (U32)value; + return CCtxParams->cParams.windowLog; + + case ZSTD_c_hashLog : + if (value!=0) /* 0 => use default */ + BOUNDCHECK(ZSTD_c_hashLog, value); + CCtxParams->cParams.hashLog = (U32)value; + return CCtxParams->cParams.hashLog; + + case ZSTD_c_chainLog : + if (value!=0) /* 0 => use default */ + BOUNDCHECK(ZSTD_c_chainLog, value); + CCtxParams->cParams.chainLog = (U32)value; + return CCtxParams->cParams.chainLog; + + case ZSTD_c_searchLog : + if (value!=0) /* 0 => use default */ + BOUNDCHECK(ZSTD_c_searchLog, value); + CCtxParams->cParams.searchLog = (U32)value; + return (size_t)value; + + case ZSTD_c_minMatch : + if (value!=0) /* 0 => use default */ + BOUNDCHECK(ZSTD_c_minMatch, value); + CCtxParams->cParams.minMatch = (U32)value; + return CCtxParams->cParams.minMatch; + + case ZSTD_c_targetLength : + BOUNDCHECK(ZSTD_c_targetLength, value); + CCtxParams->cParams.targetLength = (U32)value; + return CCtxParams->cParams.targetLength; + + case ZSTD_c_strategy : + if (value!=0) /* 0 => use default */ + BOUNDCHECK(ZSTD_c_strategy, value); + CCtxParams->cParams.strategy = (ZSTD_strategy)value; + return (size_t)CCtxParams->cParams.strategy; + + case ZSTD_c_contentSizeFlag : + /* Content size written in frame header _when known_ (default:1) */ + DEBUGLOG(4, "set content size flag = %u", (value!=0)); + CCtxParams->fParams.contentSizeFlag = value != 0; + return (size_t)CCtxParams->fParams.contentSizeFlag; + + case ZSTD_c_checksumFlag : + /* A 32-bits content checksum will be calculated and written at end of frame (default:0) */ + CCtxParams->fParams.checksumFlag = value != 0; + return (size_t)CCtxParams->fParams.checksumFlag; + + case ZSTD_c_dictIDFlag : /* When applicable, dictionary's dictID is provided in frame header (default:1) */ + DEBUGLOG(4, "set dictIDFlag = %u", (value!=0)); + CCtxParams->fParams.noDictIDFlag = !value; + return !CCtxParams->fParams.noDictIDFlag; + + case ZSTD_c_forceMaxWindow : + CCtxParams->forceWindow = (value != 0); + return (size_t)CCtxParams->forceWindow; + + case ZSTD_c_forceAttachDict : { + const ZSTD_dictAttachPref_e pref = (ZSTD_dictAttachPref_e)value; + BOUNDCHECK(ZSTD_c_forceAttachDict, (int)pref); + CCtxParams->attachDictPref = pref; + return CCtxParams->attachDictPref; + } + + case ZSTD_c_literalCompressionMode : { + const ZSTD_paramSwitch_e lcm = (ZSTD_paramSwitch_e)value; + BOUNDCHECK(ZSTD_c_literalCompressionMode, (int)lcm); + CCtxParams->literalCompressionMode = lcm; + return CCtxParams->literalCompressionMode; + } + + case ZSTD_c_nbWorkers : +#ifndef ZSTD_MULTITHREAD + RETURN_ERROR_IF(value!=0, parameter_unsupported, "not compiled with multithreading"); + return 0; +#else + FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(param, &value), ""); + CCtxParams->nbWorkers = value; + return CCtxParams->nbWorkers; +#endif + + case ZSTD_c_jobSize : +#ifndef ZSTD_MULTITHREAD + RETURN_ERROR_IF(value!=0, parameter_unsupported, "not compiled with multithreading"); + return 0; +#else + /* Adjust to the minimum non-default value. */ + if (value != 0 && value < ZSTDMT_JOBSIZE_MIN) + value = ZSTDMT_JOBSIZE_MIN; + FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(param, &value), ""); + assert(value >= 0); + CCtxParams->jobSize = value; + return CCtxParams->jobSize; +#endif + + case ZSTD_c_overlapLog : +#ifndef ZSTD_MULTITHREAD + RETURN_ERROR_IF(value!=0, parameter_unsupported, "not compiled with multithreading"); + return 0; +#else + FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(ZSTD_c_overlapLog, &value), ""); + CCtxParams->overlapLog = value; + return CCtxParams->overlapLog; +#endif + + case ZSTD_c_rsyncable : +#ifndef ZSTD_MULTITHREAD + RETURN_ERROR_IF(value!=0, parameter_unsupported, "not compiled with multithreading"); + return 0; +#else + FORWARD_IF_ERROR(ZSTD_cParam_clampBounds(ZSTD_c_overlapLog, &value), ""); + CCtxParams->rsyncable = value; + return CCtxParams->rsyncable; +#endif + + case ZSTD_c_enableDedicatedDictSearch : + CCtxParams->enableDedicatedDictSearch = (value!=0); + return (size_t)CCtxParams->enableDedicatedDictSearch; + + case ZSTD_c_enableLongDistanceMatching : + BOUNDCHECK(ZSTD_c_enableLongDistanceMatching, value); + CCtxParams->ldmParams.enableLdm = (ZSTD_paramSwitch_e)value; + return CCtxParams->ldmParams.enableLdm; + + case ZSTD_c_ldmHashLog : + if (value!=0) /* 0 ==> auto */ + BOUNDCHECK(ZSTD_c_ldmHashLog, value); + CCtxParams->ldmParams.hashLog = (U32)value; + return CCtxParams->ldmParams.hashLog; + + case ZSTD_c_ldmMinMatch : + if (value!=0) /* 0 ==> default */ + BOUNDCHECK(ZSTD_c_ldmMinMatch, value); + CCtxParams->ldmParams.minMatchLength = (U32)value; + return CCtxParams->ldmParams.minMatchLength; + + case ZSTD_c_ldmBucketSizeLog : + if (value!=0) /* 0 ==> default */ + BOUNDCHECK(ZSTD_c_ldmBucketSizeLog, value); + CCtxParams->ldmParams.bucketSizeLog = (U32)value; + return CCtxParams->ldmParams.bucketSizeLog; + + case ZSTD_c_ldmHashRateLog : + if (value!=0) /* 0 ==> default */ + BOUNDCHECK(ZSTD_c_ldmHashRateLog, value); + CCtxParams->ldmParams.hashRateLog = (U32)value; + return CCtxParams->ldmParams.hashRateLog; + + case ZSTD_c_targetCBlockSize : + if (value!=0) /* 0 ==> default */ + BOUNDCHECK(ZSTD_c_targetCBlockSize, value); + CCtxParams->targetCBlockSize = (U32)value; + return CCtxParams->targetCBlockSize; + + case ZSTD_c_srcSizeHint : + if (value!=0) /* 0 ==> default */ + BOUNDCHECK(ZSTD_c_srcSizeHint, value); + CCtxParams->srcSizeHint = value; + return (size_t)CCtxParams->srcSizeHint; + + case ZSTD_c_stableInBuffer: + BOUNDCHECK(ZSTD_c_stableInBuffer, value); + CCtxParams->inBufferMode = (ZSTD_bufferMode_e)value; + return CCtxParams->inBufferMode; + + case ZSTD_c_stableOutBuffer: + BOUNDCHECK(ZSTD_c_stableOutBuffer, value); + CCtxParams->outBufferMode = (ZSTD_bufferMode_e)value; + return CCtxParams->outBufferMode; + + case ZSTD_c_blockDelimiters: + BOUNDCHECK(ZSTD_c_blockDelimiters, value); + CCtxParams->blockDelimiters = (ZSTD_sequenceFormat_e)value; + return CCtxParams->blockDelimiters; + + case ZSTD_c_validateSequences: + BOUNDCHECK(ZSTD_c_validateSequences, value); + CCtxParams->validateSequences = value; + return CCtxParams->validateSequences; + + case ZSTD_c_useBlockSplitter: + BOUNDCHECK(ZSTD_c_useBlockSplitter, value); + CCtxParams->useBlockSplitter = (ZSTD_paramSwitch_e)value; + return CCtxParams->useBlockSplitter; + + case ZSTD_c_useRowMatchFinder: + BOUNDCHECK(ZSTD_c_useRowMatchFinder, value); + CCtxParams->useRowMatchFinder = (ZSTD_paramSwitch_e)value; + return CCtxParams->useRowMatchFinder; + + case ZSTD_c_deterministicRefPrefix: + BOUNDCHECK(ZSTD_c_deterministicRefPrefix, value); + CCtxParams->deterministicRefPrefix = !!value; + return CCtxParams->deterministicRefPrefix; + + case ZSTD_c_prefetchCDictTables: + BOUNDCHECK(ZSTD_c_prefetchCDictTables, value); + CCtxParams->prefetchCDictTables = (ZSTD_paramSwitch_e)value; + return CCtxParams->prefetchCDictTables; + + case ZSTD_c_enableSeqProducerFallback: + BOUNDCHECK(ZSTD_c_enableSeqProducerFallback, value); + CCtxParams->enableMatchFinderFallback = value; + return CCtxParams->enableMatchFinderFallback; + + case ZSTD_c_maxBlockSize: + if (value!=0) /* 0 ==> default */ + BOUNDCHECK(ZSTD_c_maxBlockSize, value); + CCtxParams->maxBlockSize = value; + return CCtxParams->maxBlockSize; + + case ZSTD_c_searchForExternalRepcodes: + BOUNDCHECK(ZSTD_c_searchForExternalRepcodes, value); + CCtxParams->searchForExternalRepcodes = (ZSTD_paramSwitch_e)value; + return CCtxParams->searchForExternalRepcodes; + + default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); + } +} + +size_t ZSTD_CCtx_getParameter(ZSTD_CCtx const* cctx, ZSTD_cParameter param, int* value) +{ + return ZSTD_CCtxParams_getParameter(&cctx->requestedParams, param, value); +} + +size_t ZSTD_CCtxParams_getParameter( + ZSTD_CCtx_params const* CCtxParams, ZSTD_cParameter param, int* value) +{ + switch(param) + { + case ZSTD_c_format : + *value = CCtxParams->format; + break; + case ZSTD_c_compressionLevel : + *value = CCtxParams->compressionLevel; + break; + case ZSTD_c_windowLog : + *value = (int)CCtxParams->cParams.windowLog; + break; + case ZSTD_c_hashLog : + *value = (int)CCtxParams->cParams.hashLog; + break; + case ZSTD_c_chainLog : + *value = (int)CCtxParams->cParams.chainLog; + break; + case ZSTD_c_searchLog : + *value = CCtxParams->cParams.searchLog; + break; + case ZSTD_c_minMatch : + *value = CCtxParams->cParams.minMatch; + break; + case ZSTD_c_targetLength : + *value = CCtxParams->cParams.targetLength; + break; + case ZSTD_c_strategy : + *value = (unsigned)CCtxParams->cParams.strategy; + break; + case ZSTD_c_contentSizeFlag : + *value = CCtxParams->fParams.contentSizeFlag; + break; + case ZSTD_c_checksumFlag : + *value = CCtxParams->fParams.checksumFlag; + break; + case ZSTD_c_dictIDFlag : + *value = !CCtxParams->fParams.noDictIDFlag; + break; + case ZSTD_c_forceMaxWindow : + *value = CCtxParams->forceWindow; + break; + case ZSTD_c_forceAttachDict : + *value = CCtxParams->attachDictPref; + break; + case ZSTD_c_literalCompressionMode : + *value = CCtxParams->literalCompressionMode; + break; + case ZSTD_c_nbWorkers : +#ifndef ZSTD_MULTITHREAD + assert(CCtxParams->nbWorkers == 0); +#endif + *value = CCtxParams->nbWorkers; + break; + case ZSTD_c_jobSize : +#ifndef ZSTD_MULTITHREAD + RETURN_ERROR(parameter_unsupported, "not compiled with multithreading"); +#else + assert(CCtxParams->jobSize <= INT_MAX); + *value = (int)CCtxParams->jobSize; + break; +#endif + case ZSTD_c_overlapLog : +#ifndef ZSTD_MULTITHREAD + RETURN_ERROR(parameter_unsupported, "not compiled with multithreading"); +#else + *value = CCtxParams->overlapLog; + break; +#endif + case ZSTD_c_rsyncable : +#ifndef ZSTD_MULTITHREAD + RETURN_ERROR(parameter_unsupported, "not compiled with multithreading"); +#else + *value = CCtxParams->rsyncable; + break; +#endif + case ZSTD_c_enableDedicatedDictSearch : + *value = CCtxParams->enableDedicatedDictSearch; + break; + case ZSTD_c_enableLongDistanceMatching : + *value = CCtxParams->ldmParams.enableLdm; + break; + case ZSTD_c_ldmHashLog : + *value = CCtxParams->ldmParams.hashLog; + break; + case ZSTD_c_ldmMinMatch : + *value = CCtxParams->ldmParams.minMatchLength; + break; + case ZSTD_c_ldmBucketSizeLog : + *value = CCtxParams->ldmParams.bucketSizeLog; + break; + case ZSTD_c_ldmHashRateLog : + *value = CCtxParams->ldmParams.hashRateLog; + break; + case ZSTD_c_targetCBlockSize : + *value = (int)CCtxParams->targetCBlockSize; + break; + case ZSTD_c_srcSizeHint : + *value = (int)CCtxParams->srcSizeHint; + break; + case ZSTD_c_stableInBuffer : + *value = (int)CCtxParams->inBufferMode; + break; + case ZSTD_c_stableOutBuffer : + *value = (int)CCtxParams->outBufferMode; + break; + case ZSTD_c_blockDelimiters : + *value = (int)CCtxParams->blockDelimiters; + break; + case ZSTD_c_validateSequences : + *value = (int)CCtxParams->validateSequences; + break; + case ZSTD_c_useBlockSplitter : + *value = (int)CCtxParams->useBlockSplitter; + break; + case ZSTD_c_useRowMatchFinder : + *value = (int)CCtxParams->useRowMatchFinder; + break; + case ZSTD_c_deterministicRefPrefix: + *value = (int)CCtxParams->deterministicRefPrefix; + break; + case ZSTD_c_prefetchCDictTables: + *value = (int)CCtxParams->prefetchCDictTables; + break; + case ZSTD_c_enableSeqProducerFallback: + *value = CCtxParams->enableMatchFinderFallback; + break; + case ZSTD_c_maxBlockSize: + *value = (int)CCtxParams->maxBlockSize; + break; + case ZSTD_c_searchForExternalRepcodes: + *value = (int)CCtxParams->searchForExternalRepcodes; + break; + default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); + } + return 0; +} + +/** ZSTD_CCtx_setParametersUsingCCtxParams() : + * just applies `params` into `cctx` + * no action is performed, parameters are merely stored. + * If ZSTDMT is enabled, parameters are pushed to cctx->mtctx. + * This is possible even if a compression is ongoing. + * In which case, new parameters will be applied on the fly, starting with next compression job. + */ +size_t ZSTD_CCtx_setParametersUsingCCtxParams( + ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params) +{ + DEBUGLOG(4, "ZSTD_CCtx_setParametersUsingCCtxParams"); + RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong, + "The context is in the wrong stage!"); + RETURN_ERROR_IF(cctx->cdict, stage_wrong, + "Can't override parameters with cdict attached (some must " + "be inherited from the cdict)."); + + cctx->requestedParams = *params; + return 0; +} + +size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams) +{ + ZSTD_STATIC_ASSERT(sizeof(cparams) == 7 * 4 /* all params are listed below */); + DEBUGLOG(4, "ZSTD_CCtx_setCParams"); + /* only update if all parameters are valid */ + FORWARD_IF_ERROR(ZSTD_checkCParams(cparams), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, cparams.windowLog), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(cctx, ZSTD_c_chainLog, cparams.chainLog), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(cctx, ZSTD_c_hashLog, cparams.hashLog), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(cctx, ZSTD_c_searchLog, cparams.searchLog), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, cparams.minMatch), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(cctx, ZSTD_c_targetLength, cparams.targetLength), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(cctx, ZSTD_c_strategy, cparams.strategy), ""); + return 0; +} + +size_t ZSTD_CCtx_setFParams(ZSTD_CCtx* cctx, ZSTD_frameParameters fparams) +{ + ZSTD_STATIC_ASSERT(sizeof(fparams) == 3 * 4 /* all params are listed below */); + DEBUGLOG(4, "ZSTD_CCtx_setFParams"); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(cctx, ZSTD_c_contentSizeFlag, fparams.contentSizeFlag != 0), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, fparams.checksumFlag != 0), ""); + FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(cctx, ZSTD_c_dictIDFlag, fparams.noDictIDFlag == 0), ""); + return 0; +} + +size_t ZSTD_CCtx_setParams(ZSTD_CCtx* cctx, ZSTD_parameters params) +{ + DEBUGLOG(4, "ZSTD_CCtx_setParams"); + /* First check cParams, because we want to update all or none. */ + FORWARD_IF_ERROR(ZSTD_checkCParams(params.cParams), ""); + /* Next set fParams, because this could fail if the cctx isn't in init stage. */ + FORWARD_IF_ERROR(ZSTD_CCtx_setFParams(cctx, params.fParams), ""); + /* Finally set cParams, which should succeed. */ + FORWARD_IF_ERROR(ZSTD_CCtx_setCParams(cctx, params.cParams), ""); + return 0; +} + +size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize) +{ + DEBUGLOG(4, "ZSTD_CCtx_setPledgedSrcSize to %llu bytes", pledgedSrcSize); + RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong, + "Can't set pledgedSrcSize when not in init stage."); + cctx->pledgedSrcSizePlusOne = pledgedSrcSize+1; + return 0; +} + +static ZSTD_compressionParameters ZSTD_dedicatedDictSearch_getCParams( + int const compressionLevel, + size_t const dictSize); +static int ZSTD_dedicatedDictSearch_isSupported( + const ZSTD_compressionParameters* cParams); +static void ZSTD_dedicatedDictSearch_revertCParams( + ZSTD_compressionParameters* cParams); + +/** + * Initializes the local dictionary using requested parameters. + * NOTE: Initialization does not employ the pledged src size, + * because the dictionary may be used for multiple compressions. + */ +static size_t ZSTD_initLocalDict(ZSTD_CCtx* cctx) +{ + ZSTD_localDict* const dl = &cctx->localDict; + if (dl->dict == NULL) { + /* No local dictionary. */ + assert(dl->dictBuffer == NULL); + assert(dl->cdict == NULL); + assert(dl->dictSize == 0); + return 0; + } + if (dl->cdict != NULL) { + /* Local dictionary already initialized. */ + assert(cctx->cdict == dl->cdict); + return 0; + } + assert(dl->dictSize > 0); + assert(cctx->cdict == NULL); + assert(cctx->prefixDict.dict == NULL); + + dl->cdict = ZSTD_createCDict_advanced2( + dl->dict, + dl->dictSize, + ZSTD_dlm_byRef, + dl->dictContentType, + &cctx->requestedParams, + cctx->customMem); + RETURN_ERROR_IF(!dl->cdict, memory_allocation, "ZSTD_createCDict_advanced failed"); + cctx->cdict = dl->cdict; + return 0; +} + +size_t ZSTD_CCtx_loadDictionary_advanced( + ZSTD_CCtx* cctx, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType) +{ + DEBUGLOG(4, "ZSTD_CCtx_loadDictionary_advanced (size: %u)", (U32)dictSize); + RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong, + "Can't load a dictionary when cctx is not in init stage."); + ZSTD_clearAllDicts(cctx); /* erase any previously set dictionary */ + if (dict == NULL || dictSize == 0) /* no dictionary */ + return 0; + if (dictLoadMethod == ZSTD_dlm_byRef) { + cctx->localDict.dict = dict; + } else { + /* copy dictionary content inside CCtx to own its lifetime */ + void* dictBuffer; + RETURN_ERROR_IF(cctx->staticSize, memory_allocation, + "static CCtx can't allocate for an internal copy of dictionary"); + dictBuffer = ZSTD_customMalloc(dictSize, cctx->customMem); + RETURN_ERROR_IF(dictBuffer==NULL, memory_allocation, + "allocation failed for dictionary content"); + ZSTD_memcpy(dictBuffer, dict, dictSize); + cctx->localDict.dictBuffer = dictBuffer; /* owned ptr to free */ + cctx->localDict.dict = dictBuffer; /* read-only reference */ + } + cctx->localDict.dictSize = dictSize; + cctx->localDict.dictContentType = dictContentType; + return 0; +} + +size_t ZSTD_CCtx_loadDictionary_byReference( + ZSTD_CCtx* cctx, const void* dict, size_t dictSize) +{ + return ZSTD_CCtx_loadDictionary_advanced( + cctx, dict, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto); +} + +size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize) +{ + return ZSTD_CCtx_loadDictionary_advanced( + cctx, dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto); +} + + +size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict) +{ + RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong, + "Can't ref a dict when ctx not in init stage."); + /* Free the existing local cdict (if any) to save memory. */ + ZSTD_clearAllDicts(cctx); + cctx->cdict = cdict; + return 0; +} + +size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool) +{ + RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong, + "Can't ref a pool when ctx not in init stage."); + cctx->pool = pool; + return 0; +} + +size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize) +{ + return ZSTD_CCtx_refPrefix_advanced(cctx, prefix, prefixSize, ZSTD_dct_rawContent); +} + +size_t ZSTD_CCtx_refPrefix_advanced( + ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType) +{ + RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong, + "Can't ref a prefix when ctx not in init stage."); + ZSTD_clearAllDicts(cctx); + if (prefix != NULL && prefixSize > 0) { + cctx->prefixDict.dict = prefix; + cctx->prefixDict.dictSize = prefixSize; + cctx->prefixDict.dictContentType = dictContentType; + } + return 0; +} + +/*! ZSTD_CCtx_reset() : + * Also dumps dictionary */ +size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset) +{ + if ( (reset == ZSTD_reset_session_only) + || (reset == ZSTD_reset_session_and_parameters) ) { + cctx->streamStage = zcss_init; + cctx->pledgedSrcSizePlusOne = 0; + } + if ( (reset == ZSTD_reset_parameters) + || (reset == ZSTD_reset_session_and_parameters) ) { + RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong, + "Reset parameters is only possible during init stage."); + ZSTD_clearAllDicts(cctx); + ZSTD_memset(&cctx->externalMatchCtx, 0, sizeof(cctx->externalMatchCtx)); + return ZSTD_CCtxParams_reset(&cctx->requestedParams); + } + return 0; +} + + +/** ZSTD_checkCParams() : + control CParam values remain within authorized range. + @return : 0, or an error code if one value is beyond authorized range */ +size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams) +{ + BOUNDCHECK(ZSTD_c_windowLog, (int)cParams.windowLog); + BOUNDCHECK(ZSTD_c_chainLog, (int)cParams.chainLog); + BOUNDCHECK(ZSTD_c_hashLog, (int)cParams.hashLog); + BOUNDCHECK(ZSTD_c_searchLog, (int)cParams.searchLog); + BOUNDCHECK(ZSTD_c_minMatch, (int)cParams.minMatch); + BOUNDCHECK(ZSTD_c_targetLength,(int)cParams.targetLength); + BOUNDCHECK(ZSTD_c_strategy, cParams.strategy); + return 0; +} + +/** ZSTD_clampCParams() : + * make CParam values within valid range. + * @return : valid CParams */ +static ZSTD_compressionParameters +ZSTD_clampCParams(ZSTD_compressionParameters cParams) +{ +# define CLAMP_TYPE(cParam, val, type) { \ + ZSTD_bounds const bounds = ZSTD_cParam_getBounds(cParam); \ + if ((int)valbounds.upperBound) val=(type)bounds.upperBound; \ + } +# define CLAMP(cParam, val) CLAMP_TYPE(cParam, val, unsigned) + CLAMP(ZSTD_c_windowLog, cParams.windowLog); + CLAMP(ZSTD_c_chainLog, cParams.chainLog); + CLAMP(ZSTD_c_hashLog, cParams.hashLog); + CLAMP(ZSTD_c_searchLog, cParams.searchLog); + CLAMP(ZSTD_c_minMatch, cParams.minMatch); + CLAMP(ZSTD_c_targetLength,cParams.targetLength); + CLAMP_TYPE(ZSTD_c_strategy,cParams.strategy, ZSTD_strategy); + return cParams; +} + +/** ZSTD_cycleLog() : + * condition for correct operation : hashLog > 1 */ +U32 ZSTD_cycleLog(U32 hashLog, ZSTD_strategy strat) +{ + U32 const btScale = ((U32)strat >= (U32)ZSTD_btlazy2); + return hashLog - btScale; +} + +/** ZSTD_dictAndWindowLog() : + * Returns an adjusted window log that is large enough to fit the source and the dictionary. + * The zstd format says that the entire dictionary is valid if one byte of the dictionary + * is within the window. So the hashLog and chainLog should be large enough to reference both + * the dictionary and the window. So we must use this adjusted dictAndWindowLog when downsizing + * the hashLog and windowLog. + * NOTE: srcSize must not be ZSTD_CONTENTSIZE_UNKNOWN. + */ +static U32 ZSTD_dictAndWindowLog(U32 windowLog, U64 srcSize, U64 dictSize) +{ + const U64 maxWindowSize = 1ULL << ZSTD_WINDOWLOG_MAX; + /* No dictionary ==> No change */ + if (dictSize == 0) { + return windowLog; + } + assert(windowLog <= ZSTD_WINDOWLOG_MAX); + assert(srcSize != ZSTD_CONTENTSIZE_UNKNOWN); /* Handled in ZSTD_adjustCParams_internal() */ + { + U64 const windowSize = 1ULL << windowLog; + U64 const dictAndWindowSize = dictSize + windowSize; + /* If the window size is already large enough to fit both the source and the dictionary + * then just use the window size. Otherwise adjust so that it fits the dictionary and + * the window. + */ + if (windowSize >= dictSize + srcSize) { + return windowLog; /* Window size large enough already */ + } else if (dictAndWindowSize >= maxWindowSize) { + return ZSTD_WINDOWLOG_MAX; /* Larger than max window log */ + } else { + return ZSTD_highbit32((U32)dictAndWindowSize - 1) + 1; + } + } +} + +/** ZSTD_adjustCParams_internal() : + * optimize `cPar` for a specified input (`srcSize` and `dictSize`). + * mostly downsize to reduce memory consumption and initialization latency. + * `srcSize` can be ZSTD_CONTENTSIZE_UNKNOWN when not known. + * `mode` is the mode for parameter adjustment. See docs for `ZSTD_cParamMode_e`. + * note : `srcSize==0` means 0! + * condition : cPar is presumed validated (can be checked using ZSTD_checkCParams()). */ +static ZSTD_compressionParameters +ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar, + unsigned long long srcSize, + size_t dictSize, + ZSTD_cParamMode_e mode, + ZSTD_paramSwitch_e useRowMatchFinder) +{ + const U64 minSrcSize = 513; /* (1<<9) + 1 */ + const U64 maxWindowResize = 1ULL << (ZSTD_WINDOWLOG_MAX-1); + assert(ZSTD_checkCParams(cPar)==0); + + switch (mode) { + case ZSTD_cpm_unknown: + case ZSTD_cpm_noAttachDict: + /* If we don't know the source size, don't make any + * assumptions about it. We will already have selected + * smaller parameters if a dictionary is in use. + */ + break; + case ZSTD_cpm_createCDict: + /* Assume a small source size when creating a dictionary + * with an unknown source size. + */ + if (dictSize && srcSize == ZSTD_CONTENTSIZE_UNKNOWN) + srcSize = minSrcSize; + break; + case ZSTD_cpm_attachDict: + /* Dictionary has its own dedicated parameters which have + * already been selected. We are selecting parameters + * for only the source. + */ + dictSize = 0; + break; + default: + assert(0); + break; + } + + /* resize windowLog if input is small enough, to use less memory */ + if ( (srcSize <= maxWindowResize) + && (dictSize <= maxWindowResize) ) { + U32 const tSize = (U32)(srcSize + dictSize); + static U32 const hashSizeMin = 1 << ZSTD_HASHLOG_MIN; + U32 const srcLog = (tSize < hashSizeMin) ? ZSTD_HASHLOG_MIN : + ZSTD_highbit32(tSize-1) + 1; + if (cPar.windowLog > srcLog) cPar.windowLog = srcLog; + } + if (srcSize != ZSTD_CONTENTSIZE_UNKNOWN) { + U32 const dictAndWindowLog = ZSTD_dictAndWindowLog(cPar.windowLog, (U64)srcSize, (U64)dictSize); + U32 const cycleLog = ZSTD_cycleLog(cPar.chainLog, cPar.strategy); + if (cPar.hashLog > dictAndWindowLog+1) cPar.hashLog = dictAndWindowLog+1; + if (cycleLog > dictAndWindowLog) + cPar.chainLog -= (cycleLog - dictAndWindowLog); + } + + if (cPar.windowLog < ZSTD_WINDOWLOG_ABSOLUTEMIN) + cPar.windowLog = ZSTD_WINDOWLOG_ABSOLUTEMIN; /* minimum wlog required for valid frame header */ + + /* We can't use more than 32 bits of hash in total, so that means that we require: + * (hashLog + 8) <= 32 && (chainLog + 8) <= 32 + */ + if (mode == ZSTD_cpm_createCDict && ZSTD_CDictIndicesAreTagged(&cPar)) { + U32 const maxShortCacheHashLog = 32 - ZSTD_SHORT_CACHE_TAG_BITS; + if (cPar.hashLog > maxShortCacheHashLog) { + cPar.hashLog = maxShortCacheHashLog; + } + if (cPar.chainLog > maxShortCacheHashLog) { + cPar.chainLog = maxShortCacheHashLog; + } + } + + + /* At this point, we aren't 100% sure if we are using the row match finder. + * Unless it is explicitly disabled, conservatively assume that it is enabled. + * In this case it will only be disabled for small sources, so shrinking the + * hash log a little bit shouldn't result in any ratio loss. + */ + if (useRowMatchFinder == ZSTD_ps_auto) + useRowMatchFinder = ZSTD_ps_enable; + + /* We can't hash more than 32-bits in total. So that means that we require: + * (hashLog - rowLog + 8) <= 32 + */ + if (ZSTD_rowMatchFinderUsed(cPar.strategy, useRowMatchFinder)) { + /* Switch to 32-entry rows if searchLog is 5 (or more) */ + U32 const rowLog = BOUNDED(4, cPar.searchLog, 6); + U32 const maxRowHashLog = 32 - ZSTD_ROW_HASH_TAG_BITS; + U32 const maxHashLog = maxRowHashLog + rowLog; + assert(cPar.hashLog >= rowLog); + if (cPar.hashLog > maxHashLog) { + cPar.hashLog = maxHashLog; + } + } + + return cPar; +} + +ZSTD_compressionParameters +ZSTD_adjustCParams(ZSTD_compressionParameters cPar, + unsigned long long srcSize, + size_t dictSize) +{ + cPar = ZSTD_clampCParams(cPar); /* resulting cPar is necessarily valid (all parameters within range) */ + if (srcSize == 0) srcSize = ZSTD_CONTENTSIZE_UNKNOWN; + return ZSTD_adjustCParams_internal(cPar, srcSize, dictSize, ZSTD_cpm_unknown, ZSTD_ps_auto); +} + +static ZSTD_compressionParameters ZSTD_getCParams_internal(int compressionLevel, unsigned long long srcSizeHint, size_t dictSize, ZSTD_cParamMode_e mode); +static ZSTD_parameters ZSTD_getParams_internal(int compressionLevel, unsigned long long srcSizeHint, size_t dictSize, ZSTD_cParamMode_e mode); + +static void ZSTD_overrideCParams( + ZSTD_compressionParameters* cParams, + const ZSTD_compressionParameters* overrides) +{ + if (overrides->windowLog) cParams->windowLog = overrides->windowLog; + if (overrides->hashLog) cParams->hashLog = overrides->hashLog; + if (overrides->chainLog) cParams->chainLog = overrides->chainLog; + if (overrides->searchLog) cParams->searchLog = overrides->searchLog; + if (overrides->minMatch) cParams->minMatch = overrides->minMatch; + if (overrides->targetLength) cParams->targetLength = overrides->targetLength; + if (overrides->strategy) cParams->strategy = overrides->strategy; +} + +ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams( + const ZSTD_CCtx_params* CCtxParams, U64 srcSizeHint, size_t dictSize, ZSTD_cParamMode_e mode) +{ + ZSTD_compressionParameters cParams; + if (srcSizeHint == ZSTD_CONTENTSIZE_UNKNOWN && CCtxParams->srcSizeHint > 0) { + srcSizeHint = CCtxParams->srcSizeHint; + } + cParams = ZSTD_getCParams_internal(CCtxParams->compressionLevel, srcSizeHint, dictSize, mode); + if (CCtxParams->ldmParams.enableLdm == ZSTD_ps_enable) cParams.windowLog = ZSTD_LDM_DEFAULT_WINDOW_LOG; + ZSTD_overrideCParams(&cParams, &CCtxParams->cParams); + assert(!ZSTD_checkCParams(cParams)); + /* srcSizeHint == 0 means 0 */ + return ZSTD_adjustCParams_internal(cParams, srcSizeHint, dictSize, mode, CCtxParams->useRowMatchFinder); +} + +static size_t +ZSTD_sizeof_matchState(const ZSTD_compressionParameters* const cParams, + const ZSTD_paramSwitch_e useRowMatchFinder, + const U32 enableDedicatedDictSearch, + const U32 forCCtx) +{ + /* chain table size should be 0 for fast or row-hash strategies */ + size_t const chainSize = ZSTD_allocateChainTable(cParams->strategy, useRowMatchFinder, enableDedicatedDictSearch && !forCCtx) + ? ((size_t)1 << cParams->chainLog) + : 0; + size_t const hSize = ((size_t)1) << cParams->hashLog; + U32 const hashLog3 = (forCCtx && cParams->minMatch==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0; + size_t const h3Size = hashLog3 ? ((size_t)1) << hashLog3 : 0; + /* We don't use ZSTD_cwksp_alloc_size() here because the tables aren't + * surrounded by redzones in ASAN. */ + size_t const tableSpace = chainSize * sizeof(U32) + + hSize * sizeof(U32) + + h3Size * sizeof(U32); + size_t const optPotentialSpace = + ZSTD_cwksp_aligned_alloc_size((MaxML+1) * sizeof(U32)) + + ZSTD_cwksp_aligned_alloc_size((MaxLL+1) * sizeof(U32)) + + ZSTD_cwksp_aligned_alloc_size((MaxOff+1) * sizeof(U32)) + + ZSTD_cwksp_aligned_alloc_size((1<strategy, useRowMatchFinder) + ? ZSTD_cwksp_aligned_alloc_size(hSize) + : 0; + size_t const optSpace = (forCCtx && (cParams->strategy >= ZSTD_btopt)) + ? optPotentialSpace + : 0; + size_t const slackSpace = ZSTD_cwksp_slack_space_required(); + + /* tables are guaranteed to be sized in multiples of 64 bytes (or 16 uint32_t) */ + ZSTD_STATIC_ASSERT(ZSTD_HASHLOG_MIN >= 4 && ZSTD_WINDOWLOG_MIN >= 4 && ZSTD_CHAINLOG_MIN >= 4); + assert(useRowMatchFinder != ZSTD_ps_auto); + + DEBUGLOG(4, "chainSize: %u - hSize: %u - h3Size: %u", + (U32)chainSize, (U32)hSize, (U32)h3Size); + return tableSpace + optSpace + slackSpace + lazyAdditionalSpace; +} + +/* Helper function for calculating memory requirements. + * Gives a tighter bound than ZSTD_sequenceBound() by taking minMatch into account. */ +static size_t ZSTD_maxNbSeq(size_t blockSize, unsigned minMatch, int useSequenceProducer) { + U32 const divider = (minMatch==3 || useSequenceProducer) ? 3 : 4; + return blockSize / divider; +} + +static size_t ZSTD_estimateCCtxSize_usingCCtxParams_internal( + const ZSTD_compressionParameters* cParams, + const ldmParams_t* ldmParams, + const int isStatic, + const ZSTD_paramSwitch_e useRowMatchFinder, + const size_t buffInSize, + const size_t buffOutSize, + const U64 pledgedSrcSize, + int useSequenceProducer, + size_t maxBlockSize) +{ + size_t const windowSize = (size_t) BOUNDED(1ULL, 1ULL << cParams->windowLog, pledgedSrcSize); + size_t const blockSize = MIN(ZSTD_resolveMaxBlockSize(maxBlockSize), windowSize); + size_t const maxNbSeq = ZSTD_maxNbSeq(blockSize, cParams->minMatch, useSequenceProducer); + size_t const tokenSpace = ZSTD_cwksp_alloc_size(WILDCOPY_OVERLENGTH + blockSize) + + ZSTD_cwksp_aligned_alloc_size(maxNbSeq * sizeof(seqDef)) + + 3 * ZSTD_cwksp_alloc_size(maxNbSeq * sizeof(BYTE)); + size_t const entropySpace = ZSTD_cwksp_alloc_size(ENTROPY_WORKSPACE_SIZE); + size_t const blockStateSpace = 2 * ZSTD_cwksp_alloc_size(sizeof(ZSTD_compressedBlockState_t)); + size_t const matchStateSize = ZSTD_sizeof_matchState(cParams, useRowMatchFinder, /* enableDedicatedDictSearch */ 0, /* forCCtx */ 1); + + size_t const ldmSpace = ZSTD_ldm_getTableSize(*ldmParams); + size_t const maxNbLdmSeq = ZSTD_ldm_getMaxNbSeq(*ldmParams, blockSize); + size_t const ldmSeqSpace = ldmParams->enableLdm == ZSTD_ps_enable ? + ZSTD_cwksp_aligned_alloc_size(maxNbLdmSeq * sizeof(rawSeq)) : 0; + + + size_t const bufferSpace = ZSTD_cwksp_alloc_size(buffInSize) + + ZSTD_cwksp_alloc_size(buffOutSize); + + size_t const cctxSpace = isStatic ? ZSTD_cwksp_alloc_size(sizeof(ZSTD_CCtx)) : 0; + + size_t const maxNbExternalSeq = ZSTD_sequenceBound(blockSize); + size_t const externalSeqSpace = useSequenceProducer + ? ZSTD_cwksp_aligned_alloc_size(maxNbExternalSeq * sizeof(ZSTD_Sequence)) + : 0; + + size_t const neededSpace = + cctxSpace + + entropySpace + + blockStateSpace + + ldmSpace + + ldmSeqSpace + + matchStateSize + + tokenSpace + + bufferSpace + + externalSeqSpace; + + DEBUGLOG(5, "estimate workspace : %u", (U32)neededSpace); + return neededSpace; +} + +size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params) +{ + ZSTD_compressionParameters const cParams = + ZSTD_getCParamsFromCCtxParams(params, ZSTD_CONTENTSIZE_UNKNOWN, 0, ZSTD_cpm_noAttachDict); + ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, + &cParams); + + RETURN_ERROR_IF(params->nbWorkers > 0, GENERIC, "Estimate CCtx size is supported for single-threaded compression only."); + /* estimateCCtxSize is for one-shot compression. So no buffers should + * be needed. However, we still allocate two 0-sized buffers, which can + * take space under ASAN. */ + return ZSTD_estimateCCtxSize_usingCCtxParams_internal( + &cParams, ¶ms->ldmParams, 1, useRowMatchFinder, 0, 0, ZSTD_CONTENTSIZE_UNKNOWN, params->useSequenceProducer, params->maxBlockSize); +} + +size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams) +{ + ZSTD_CCtx_params initialParams = ZSTD_makeCCtxParamsFromCParams(cParams); + if (ZSTD_rowMatchFinderSupported(cParams.strategy)) { + /* Pick bigger of not using and using row-based matchfinder for greedy and lazy strategies */ + size_t noRowCCtxSize; + size_t rowCCtxSize; + initialParams.useRowMatchFinder = ZSTD_ps_disable; + noRowCCtxSize = ZSTD_estimateCCtxSize_usingCCtxParams(&initialParams); + initialParams.useRowMatchFinder = ZSTD_ps_enable; + rowCCtxSize = ZSTD_estimateCCtxSize_usingCCtxParams(&initialParams); + return MAX(noRowCCtxSize, rowCCtxSize); + } else { + return ZSTD_estimateCCtxSize_usingCCtxParams(&initialParams); + } +} + +static size_t ZSTD_estimateCCtxSize_internal(int compressionLevel) +{ + int tier = 0; + size_t largestSize = 0; + static const unsigned long long srcSizeTiers[4] = {16 KB, 128 KB, 256 KB, ZSTD_CONTENTSIZE_UNKNOWN}; + for (; tier < 4; ++tier) { + /* Choose the set of cParams for a given level across all srcSizes that give the largest cctxSize */ + ZSTD_compressionParameters const cParams = ZSTD_getCParams_internal(compressionLevel, srcSizeTiers[tier], 0, ZSTD_cpm_noAttachDict); + largestSize = MAX(ZSTD_estimateCCtxSize_usingCParams(cParams), largestSize); + } + return largestSize; +} + +size_t ZSTD_estimateCCtxSize(int compressionLevel) +{ + int level; + size_t memBudget = 0; + for (level=MIN(compressionLevel, 1); level<=compressionLevel; level++) { + /* Ensure monotonically increasing memory usage as compression level increases */ + size_t const newMB = ZSTD_estimateCCtxSize_internal(level); + if (newMB > memBudget) memBudget = newMB; + } + return memBudget; +} + +size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params) +{ + RETURN_ERROR_IF(params->nbWorkers > 0, GENERIC, "Estimate CCtx size is supported for single-threaded compression only."); + { ZSTD_compressionParameters const cParams = + ZSTD_getCParamsFromCCtxParams(params, ZSTD_CONTENTSIZE_UNKNOWN, 0, ZSTD_cpm_noAttachDict); + size_t const blockSize = MIN(ZSTD_resolveMaxBlockSize(params->maxBlockSize), (size_t)1 << cParams.windowLog); + size_t const inBuffSize = (params->inBufferMode == ZSTD_bm_buffered) + ? ((size_t)1 << cParams.windowLog) + blockSize + : 0; + size_t const outBuffSize = (params->outBufferMode == ZSTD_bm_buffered) + ? ZSTD_compressBound(blockSize) + 1 + : 0; + ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, ¶ms->cParams); + + return ZSTD_estimateCCtxSize_usingCCtxParams_internal( + &cParams, ¶ms->ldmParams, 1, useRowMatchFinder, inBuffSize, outBuffSize, + ZSTD_CONTENTSIZE_UNKNOWN, params->useSequenceProducer, params->maxBlockSize); + } +} + +size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams) +{ + ZSTD_CCtx_params initialParams = ZSTD_makeCCtxParamsFromCParams(cParams); + if (ZSTD_rowMatchFinderSupported(cParams.strategy)) { + /* Pick bigger of not using and using row-based matchfinder for greedy and lazy strategies */ + size_t noRowCCtxSize; + size_t rowCCtxSize; + initialParams.useRowMatchFinder = ZSTD_ps_disable; + noRowCCtxSize = ZSTD_estimateCStreamSize_usingCCtxParams(&initialParams); + initialParams.useRowMatchFinder = ZSTD_ps_enable; + rowCCtxSize = ZSTD_estimateCStreamSize_usingCCtxParams(&initialParams); + return MAX(noRowCCtxSize, rowCCtxSize); + } else { + return ZSTD_estimateCStreamSize_usingCCtxParams(&initialParams); + } +} + +static size_t ZSTD_estimateCStreamSize_internal(int compressionLevel) +{ + ZSTD_compressionParameters const cParams = ZSTD_getCParams_internal(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, 0, ZSTD_cpm_noAttachDict); + return ZSTD_estimateCStreamSize_usingCParams(cParams); +} + +size_t ZSTD_estimateCStreamSize(int compressionLevel) +{ + int level; + size_t memBudget = 0; + for (level=MIN(compressionLevel, 1); level<=compressionLevel; level++) { + size_t const newMB = ZSTD_estimateCStreamSize_internal(level); + if (newMB > memBudget) memBudget = newMB; + } + return memBudget; +} + +/* ZSTD_getFrameProgression(): + * tells how much data has been consumed (input) and produced (output) for current frame. + * able to count progression inside worker threads (non-blocking mode). + */ +ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx) +{ +#ifdef ZSTD_MULTITHREAD + if (cctx->appliedParams.nbWorkers > 0) { + return ZSTDMT_getFrameProgression(cctx->mtctx); + } +#endif + { ZSTD_frameProgression fp; + size_t const buffered = (cctx->inBuff == NULL) ? 0 : + cctx->inBuffPos - cctx->inToCompress; + if (buffered) assert(cctx->inBuffPos >= cctx->inToCompress); + assert(buffered <= ZSTD_BLOCKSIZE_MAX); + fp.ingested = cctx->consumedSrcSize + buffered; + fp.consumed = cctx->consumedSrcSize; + fp.produced = cctx->producedCSize; + fp.flushed = cctx->producedCSize; /* simplified; some data might still be left within streaming output buffer */ + fp.currentJobID = 0; + fp.nbActiveWorkers = 0; + return fp; +} } + +/*! ZSTD_toFlushNow() + * Only useful for multithreading scenarios currently (nbWorkers >= 1). + */ +size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx) +{ +#ifdef ZSTD_MULTITHREAD + if (cctx->appliedParams.nbWorkers > 0) { + return ZSTDMT_toFlushNow(cctx->mtctx); + } +#endif + (void)cctx; + return 0; /* over-simplification; could also check if context is currently running in streaming mode, and in which case, report how many bytes are left to be flushed within output buffer */ +} + +static void ZSTD_assertEqualCParams(ZSTD_compressionParameters cParams1, + ZSTD_compressionParameters cParams2) +{ + (void)cParams1; + (void)cParams2; + assert(cParams1.windowLog == cParams2.windowLog); + assert(cParams1.chainLog == cParams2.chainLog); + assert(cParams1.hashLog == cParams2.hashLog); + assert(cParams1.searchLog == cParams2.searchLog); + assert(cParams1.minMatch == cParams2.minMatch); + assert(cParams1.targetLength == cParams2.targetLength); + assert(cParams1.strategy == cParams2.strategy); +} + +void ZSTD_reset_compressedBlockState(ZSTD_compressedBlockState_t* bs) +{ + int i; + for (i = 0; i < ZSTD_REP_NUM; ++i) + bs->rep[i] = repStartValue[i]; + bs->entropy.huf.repeatMode = HUF_repeat_none; + bs->entropy.fse.offcode_repeatMode = FSE_repeat_none; + bs->entropy.fse.matchlength_repeatMode = FSE_repeat_none; + bs->entropy.fse.litlength_repeatMode = FSE_repeat_none; +} + +/*! ZSTD_invalidateMatchState() + * Invalidate all the matches in the match finder tables. + * Requires nextSrc and base to be set (can be NULL). + */ +static void ZSTD_invalidateMatchState(ZSTD_matchState_t* ms) +{ + ZSTD_window_clear(&ms->window); + + ms->nextToUpdate = ms->window.dictLimit; + ms->loadedDictEnd = 0; + ms->opt.litLengthSum = 0; /* force reset of btopt stats */ + ms->dictMatchState = NULL; +} + +/** + * Controls, for this matchState reset, whether the tables need to be cleared / + * prepared for the coming compression (ZSTDcrp_makeClean), or whether the + * tables can be left unclean (ZSTDcrp_leaveDirty), because we know that a + * subsequent operation will overwrite the table space anyways (e.g., copying + * the matchState contents in from a CDict). + */ +typedef enum { + ZSTDcrp_makeClean, + ZSTDcrp_leaveDirty +} ZSTD_compResetPolicy_e; + +/** + * Controls, for this matchState reset, whether indexing can continue where it + * left off (ZSTDirp_continue), or whether it needs to be restarted from zero + * (ZSTDirp_reset). + */ +typedef enum { + ZSTDirp_continue, + ZSTDirp_reset +} ZSTD_indexResetPolicy_e; + +typedef enum { + ZSTD_resetTarget_CDict, + ZSTD_resetTarget_CCtx +} ZSTD_resetTarget_e; + +/* Mixes bits in a 64 bits in a value, based on XXH3_rrmxmx */ +static U64 ZSTD_bitmix(U64 val, U64 len) { + val ^= ZSTD_rotateRight_U64(val, 49) ^ ZSTD_rotateRight_U64(val, 24); + val *= 0x9FB21C651E98DF25ULL; + val ^= (val >> 35) + len ; + val *= 0x9FB21C651E98DF25ULL; + return val ^ (val >> 28); +} + +/* Mixes in the hashSalt and hashSaltEntropy to create a new hashSalt */ +static void ZSTD_advanceHashSalt(ZSTD_matchState_t* ms) { + ms->hashSalt = ZSTD_bitmix(ms->hashSalt, 8) ^ ZSTD_bitmix((U64) ms->hashSaltEntropy, 4); +} + +static size_t +ZSTD_reset_matchState(ZSTD_matchState_t* ms, + ZSTD_cwksp* ws, + const ZSTD_compressionParameters* cParams, + const ZSTD_paramSwitch_e useRowMatchFinder, + const ZSTD_compResetPolicy_e crp, + const ZSTD_indexResetPolicy_e forceResetIndex, + const ZSTD_resetTarget_e forWho) +{ + /* disable chain table allocation for fast or row-based strategies */ + size_t const chainSize = ZSTD_allocateChainTable(cParams->strategy, useRowMatchFinder, + ms->dedicatedDictSearch && (forWho == ZSTD_resetTarget_CDict)) + ? ((size_t)1 << cParams->chainLog) + : 0; + size_t const hSize = ((size_t)1) << cParams->hashLog; + U32 const hashLog3 = ((forWho == ZSTD_resetTarget_CCtx) && cParams->minMatch==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0; + size_t const h3Size = hashLog3 ? ((size_t)1) << hashLog3 : 0; + + DEBUGLOG(4, "reset indices : %u", forceResetIndex == ZSTDirp_reset); + assert(useRowMatchFinder != ZSTD_ps_auto); + if (forceResetIndex == ZSTDirp_reset) { + ZSTD_window_init(&ms->window); + ZSTD_cwksp_mark_tables_dirty(ws); + } + + ms->hashLog3 = hashLog3; + ms->lazySkipping = 0; + + ZSTD_invalidateMatchState(ms); + + assert(!ZSTD_cwksp_reserve_failed(ws)); /* check that allocation hasn't already failed */ + + ZSTD_cwksp_clear_tables(ws); + + DEBUGLOG(5, "reserving table space"); + /* table Space */ + ms->hashTable = (U32*)ZSTD_cwksp_reserve_table(ws, hSize * sizeof(U32)); + ms->chainTable = (U32*)ZSTD_cwksp_reserve_table(ws, chainSize * sizeof(U32)); + ms->hashTable3 = (U32*)ZSTD_cwksp_reserve_table(ws, h3Size * sizeof(U32)); + RETURN_ERROR_IF(ZSTD_cwksp_reserve_failed(ws), memory_allocation, + "failed a workspace allocation in ZSTD_reset_matchState"); + + DEBUGLOG(4, "reset table : %u", crp!=ZSTDcrp_leaveDirty); + if (crp!=ZSTDcrp_leaveDirty) { + /* reset tables only */ + ZSTD_cwksp_clean_tables(ws); + } + + if (ZSTD_rowMatchFinderUsed(cParams->strategy, useRowMatchFinder)) { + /* Row match finder needs an additional table of hashes ("tags") */ + size_t const tagTableSize = hSize; + /* We want to generate a new salt in case we reset a Cctx, but we always want to use + * 0 when we reset a Cdict */ + if(forWho == ZSTD_resetTarget_CCtx) { + ms->tagTable = (BYTE*) ZSTD_cwksp_reserve_aligned_init_once(ws, tagTableSize); + ZSTD_advanceHashSalt(ms); + } else { + /* When we are not salting we want to always memset the memory */ + ms->tagTable = (BYTE*) ZSTD_cwksp_reserve_aligned(ws, tagTableSize); + ZSTD_memset(ms->tagTable, 0, tagTableSize); + ms->hashSalt = 0; + } + { /* Switch to 32-entry rows if searchLog is 5 (or more) */ + U32 const rowLog = BOUNDED(4, cParams->searchLog, 6); + assert(cParams->hashLog >= rowLog); + ms->rowHashLog = cParams->hashLog - rowLog; + } + } + + /* opt parser space */ + if ((forWho == ZSTD_resetTarget_CCtx) && (cParams->strategy >= ZSTD_btopt)) { + DEBUGLOG(4, "reserving optimal parser space"); + ms->opt.litFreq = (unsigned*)ZSTD_cwksp_reserve_aligned(ws, (1<opt.litLengthFreq = (unsigned*)ZSTD_cwksp_reserve_aligned(ws, (MaxLL+1) * sizeof(unsigned)); + ms->opt.matchLengthFreq = (unsigned*)ZSTD_cwksp_reserve_aligned(ws, (MaxML+1) * sizeof(unsigned)); + ms->opt.offCodeFreq = (unsigned*)ZSTD_cwksp_reserve_aligned(ws, (MaxOff+1) * sizeof(unsigned)); + ms->opt.matchTable = (ZSTD_match_t*)ZSTD_cwksp_reserve_aligned(ws, (ZSTD_OPT_NUM+1) * sizeof(ZSTD_match_t)); + ms->opt.priceTable = (ZSTD_optimal_t*)ZSTD_cwksp_reserve_aligned(ws, (ZSTD_OPT_NUM+1) * sizeof(ZSTD_optimal_t)); + } + + ms->cParams = *cParams; + + RETURN_ERROR_IF(ZSTD_cwksp_reserve_failed(ws), memory_allocation, + "failed a workspace allocation in ZSTD_reset_matchState"); + return 0; +} + +/* ZSTD_indexTooCloseToMax() : + * minor optimization : prefer memset() rather than reduceIndex() + * which is measurably slow in some circumstances (reported for Visual Studio). + * Works when re-using a context for a lot of smallish inputs : + * if all inputs are smaller than ZSTD_INDEXOVERFLOW_MARGIN, + * memset() will be triggered before reduceIndex(). + */ +#define ZSTD_INDEXOVERFLOW_MARGIN (16 MB) +static int ZSTD_indexTooCloseToMax(ZSTD_window_t w) +{ + return (size_t)(w.nextSrc - w.base) > (ZSTD_CURRENT_MAX - ZSTD_INDEXOVERFLOW_MARGIN); +} + +/** ZSTD_dictTooBig(): + * When dictionaries are larger than ZSTD_CHUNKSIZE_MAX they can't be loaded in + * one go generically. So we ensure that in that case we reset the tables to zero, + * so that we can load as much of the dictionary as possible. + */ +static int ZSTD_dictTooBig(size_t const loadedDictSize) +{ + return loadedDictSize > ZSTD_CHUNKSIZE_MAX; +} + +/*! ZSTD_resetCCtx_internal() : + * @param loadedDictSize The size of the dictionary to be loaded + * into the context, if any. If no dictionary is used, or the + * dictionary is being attached / copied, then pass 0. + * note : `params` are assumed fully validated at this stage. + */ +static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, + ZSTD_CCtx_params const* params, + U64 const pledgedSrcSize, + size_t const loadedDictSize, + ZSTD_compResetPolicy_e const crp, + ZSTD_buffered_policy_e const zbuff) +{ + ZSTD_cwksp* const ws = &zc->workspace; + DEBUGLOG(4, "ZSTD_resetCCtx_internal: pledgedSrcSize=%u, wlog=%u, useRowMatchFinder=%d useBlockSplitter=%d", + (U32)pledgedSrcSize, params->cParams.windowLog, (int)params->useRowMatchFinder, (int)params->useBlockSplitter); + assert(!ZSTD_isError(ZSTD_checkCParams(params->cParams))); + + zc->isFirstBlock = 1; + + /* Set applied params early so we can modify them for LDM, + * and point params at the applied params. + */ + zc->appliedParams = *params; + params = &zc->appliedParams; + + assert(params->useRowMatchFinder != ZSTD_ps_auto); + assert(params->useBlockSplitter != ZSTD_ps_auto); + assert(params->ldmParams.enableLdm != ZSTD_ps_auto); + assert(params->maxBlockSize != 0); + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { + /* Adjust long distance matching parameters */ + ZSTD_ldm_adjustParameters(&zc->appliedParams.ldmParams, ¶ms->cParams); + assert(params->ldmParams.hashLog >= params->ldmParams.bucketSizeLog); + assert(params->ldmParams.hashRateLog < 32); + } + + { size_t const windowSize = MAX(1, (size_t)MIN(((U64)1 << params->cParams.windowLog), pledgedSrcSize)); + size_t const blockSize = MIN(params->maxBlockSize, windowSize); + size_t const maxNbSeq = ZSTD_maxNbSeq(blockSize, params->cParams.minMatch, params->useSequenceProducer); + size_t const buffOutSize = (zbuff == ZSTDb_buffered && params->outBufferMode == ZSTD_bm_buffered) + ? ZSTD_compressBound(blockSize) + 1 + : 0; + size_t const buffInSize = (zbuff == ZSTDb_buffered && params->inBufferMode == ZSTD_bm_buffered) + ? windowSize + blockSize + : 0; + size_t const maxNbLdmSeq = ZSTD_ldm_getMaxNbSeq(params->ldmParams, blockSize); + + int const indexTooClose = ZSTD_indexTooCloseToMax(zc->blockState.matchState.window); + int const dictTooBig = ZSTD_dictTooBig(loadedDictSize); + ZSTD_indexResetPolicy_e needsIndexReset = + (indexTooClose || dictTooBig || !zc->initialized) ? ZSTDirp_reset : ZSTDirp_continue; + + size_t const neededSpace = + ZSTD_estimateCCtxSize_usingCCtxParams_internal( + ¶ms->cParams, ¶ms->ldmParams, zc->staticSize != 0, params->useRowMatchFinder, + buffInSize, buffOutSize, pledgedSrcSize, params->useSequenceProducer, params->maxBlockSize); + int resizeWorkspace; + + FORWARD_IF_ERROR(neededSpace, "cctx size estimate failed!"); + + if (!zc->staticSize) ZSTD_cwksp_bump_oversized_duration(ws, 0); + + { /* Check if workspace is large enough, alloc a new one if needed */ + int const workspaceTooSmall = ZSTD_cwksp_sizeof(ws) < neededSpace; + int const workspaceWasteful = ZSTD_cwksp_check_wasteful(ws, neededSpace); + resizeWorkspace = workspaceTooSmall || workspaceWasteful; + DEBUGLOG(4, "Need %zu B workspace", neededSpace); + DEBUGLOG(4, "windowSize: %zu - blockSize: %zu", windowSize, blockSize); + + if (resizeWorkspace) { + DEBUGLOG(4, "Resize workspaceSize from %zuKB to %zuKB", + ZSTD_cwksp_sizeof(ws) >> 10, + neededSpace >> 10); + + RETURN_ERROR_IF(zc->staticSize, memory_allocation, "static cctx : no resize"); + + needsIndexReset = ZSTDirp_reset; + + ZSTD_cwksp_free(ws, zc->customMem); + FORWARD_IF_ERROR(ZSTD_cwksp_create(ws, neededSpace, zc->customMem), ""); + + DEBUGLOG(5, "reserving object space"); + /* Statically sized space. + * entropyWorkspace never moves, + * though prev/next block swap places */ + assert(ZSTD_cwksp_check_available(ws, 2 * sizeof(ZSTD_compressedBlockState_t))); + zc->blockState.prevCBlock = (ZSTD_compressedBlockState_t*) ZSTD_cwksp_reserve_object(ws, sizeof(ZSTD_compressedBlockState_t)); + RETURN_ERROR_IF(zc->blockState.prevCBlock == NULL, memory_allocation, "couldn't allocate prevCBlock"); + zc->blockState.nextCBlock = (ZSTD_compressedBlockState_t*) ZSTD_cwksp_reserve_object(ws, sizeof(ZSTD_compressedBlockState_t)); + RETURN_ERROR_IF(zc->blockState.nextCBlock == NULL, memory_allocation, "couldn't allocate nextCBlock"); + zc->entropyWorkspace = (U32*) ZSTD_cwksp_reserve_object(ws, ENTROPY_WORKSPACE_SIZE); + RETURN_ERROR_IF(zc->entropyWorkspace == NULL, memory_allocation, "couldn't allocate entropyWorkspace"); + } } + + ZSTD_cwksp_clear(ws); + + /* init params */ + zc->blockState.matchState.cParams = params->cParams; + zc->blockState.matchState.prefetchCDictTables = params->prefetchCDictTables == ZSTD_ps_enable; + zc->pledgedSrcSizePlusOne = pledgedSrcSize+1; + zc->consumedSrcSize = 0; + zc->producedCSize = 0; + if (pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN) + zc->appliedParams.fParams.contentSizeFlag = 0; + DEBUGLOG(4, "pledged content size : %u ; flag : %u", + (unsigned)pledgedSrcSize, zc->appliedParams.fParams.contentSizeFlag); + zc->blockSize = blockSize; + + XXH64_reset(&zc->xxhState, 0); + zc->stage = ZSTDcs_init; + zc->dictID = 0; + zc->dictContentSize = 0; + + ZSTD_reset_compressedBlockState(zc->blockState.prevCBlock); + + FORWARD_IF_ERROR(ZSTD_reset_matchState( + &zc->blockState.matchState, + ws, + ¶ms->cParams, + params->useRowMatchFinder, + crp, + needsIndexReset, + ZSTD_resetTarget_CCtx), ""); + + zc->seqStore.sequencesStart = (seqDef*)ZSTD_cwksp_reserve_aligned(ws, maxNbSeq * sizeof(seqDef)); + + /* ldm hash table */ + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { + /* TODO: avoid memset? */ + size_t const ldmHSize = ((size_t)1) << params->ldmParams.hashLog; + zc->ldmState.hashTable = (ldmEntry_t*)ZSTD_cwksp_reserve_aligned(ws, ldmHSize * sizeof(ldmEntry_t)); + ZSTD_memset(zc->ldmState.hashTable, 0, ldmHSize * sizeof(ldmEntry_t)); + zc->ldmSequences = (rawSeq*)ZSTD_cwksp_reserve_aligned(ws, maxNbLdmSeq * sizeof(rawSeq)); + zc->maxNbLdmSequences = maxNbLdmSeq; + + ZSTD_window_init(&zc->ldmState.window); + zc->ldmState.loadedDictEnd = 0; + } + + /* reserve space for block-level external sequences */ + if (params->useSequenceProducer) { + size_t const maxNbExternalSeq = ZSTD_sequenceBound(blockSize); + zc->externalMatchCtx.seqBufferCapacity = maxNbExternalSeq; + zc->externalMatchCtx.seqBuffer = + (ZSTD_Sequence*)ZSTD_cwksp_reserve_aligned(ws, maxNbExternalSeq * sizeof(ZSTD_Sequence)); + } + + /* buffers */ + + /* ZSTD_wildcopy() is used to copy into the literals buffer, + * so we have to oversize the buffer by WILDCOPY_OVERLENGTH bytes. + */ + zc->seqStore.litStart = ZSTD_cwksp_reserve_buffer(ws, blockSize + WILDCOPY_OVERLENGTH); + zc->seqStore.maxNbLit = blockSize; + + zc->bufferedPolicy = zbuff; + zc->inBuffSize = buffInSize; + zc->inBuff = (char*)ZSTD_cwksp_reserve_buffer(ws, buffInSize); + zc->outBuffSize = buffOutSize; + zc->outBuff = (char*)ZSTD_cwksp_reserve_buffer(ws, buffOutSize); + + /* ldm bucketOffsets table */ + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { + /* TODO: avoid memset? */ + size_t const numBuckets = + ((size_t)1) << (params->ldmParams.hashLog - + params->ldmParams.bucketSizeLog); + zc->ldmState.bucketOffsets = ZSTD_cwksp_reserve_buffer(ws, numBuckets); + ZSTD_memset(zc->ldmState.bucketOffsets, 0, numBuckets); + } + + /* sequences storage */ + ZSTD_referenceExternalSequences(zc, NULL, 0); + zc->seqStore.maxNbSeq = maxNbSeq; + zc->seqStore.llCode = ZSTD_cwksp_reserve_buffer(ws, maxNbSeq * sizeof(BYTE)); + zc->seqStore.mlCode = ZSTD_cwksp_reserve_buffer(ws, maxNbSeq * sizeof(BYTE)); + zc->seqStore.ofCode = ZSTD_cwksp_reserve_buffer(ws, maxNbSeq * sizeof(BYTE)); + + DEBUGLOG(3, "wksp: finished allocating, %zd bytes remain available", ZSTD_cwksp_available_space(ws)); + assert(ZSTD_cwksp_estimated_space_within_bounds(ws, neededSpace)); + + zc->initialized = 1; + + return 0; + } +} + +/* ZSTD_invalidateRepCodes() : + * ensures next compression will not use repcodes from previous block. + * Note : only works with regular variant; + * do not use with extDict variant ! */ +void ZSTD_invalidateRepCodes(ZSTD_CCtx* cctx) { + int i; + for (i=0; iblockState.prevCBlock->rep[i] = 0; + assert(!ZSTD_window_hasExtDict(cctx->blockState.matchState.window)); +} + +/* These are the approximate sizes for each strategy past which copying the + * dictionary tables into the working context is faster than using them + * in-place. + */ +static const size_t attachDictSizeCutoffs[ZSTD_STRATEGY_MAX+1] = { + 8 KB, /* unused */ + 8 KB, /* ZSTD_fast */ + 16 KB, /* ZSTD_dfast */ + 32 KB, /* ZSTD_greedy */ + 32 KB, /* ZSTD_lazy */ + 32 KB, /* ZSTD_lazy2 */ + 32 KB, /* ZSTD_btlazy2 */ + 32 KB, /* ZSTD_btopt */ + 8 KB, /* ZSTD_btultra */ + 8 KB /* ZSTD_btultra2 */ +}; + +static int ZSTD_shouldAttachDict(const ZSTD_CDict* cdict, + const ZSTD_CCtx_params* params, + U64 pledgedSrcSize) +{ + size_t cutoff = attachDictSizeCutoffs[cdict->matchState.cParams.strategy]; + int const dedicatedDictSearch = cdict->matchState.dedicatedDictSearch; + return dedicatedDictSearch + || ( ( pledgedSrcSize <= cutoff + || pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN + || params->attachDictPref == ZSTD_dictForceAttach ) + && params->attachDictPref != ZSTD_dictForceCopy + && !params->forceWindow ); /* dictMatchState isn't correctly + * handled in _enforceMaxDist */ +} + +static size_t +ZSTD_resetCCtx_byAttachingCDict(ZSTD_CCtx* cctx, + const ZSTD_CDict* cdict, + ZSTD_CCtx_params params, + U64 pledgedSrcSize, + ZSTD_buffered_policy_e zbuff) +{ + DEBUGLOG(4, "ZSTD_resetCCtx_byAttachingCDict() pledgedSrcSize=%llu", + (unsigned long long)pledgedSrcSize); + { + ZSTD_compressionParameters adjusted_cdict_cParams = cdict->matchState.cParams; + unsigned const windowLog = params.cParams.windowLog; + assert(windowLog != 0); + /* Resize working context table params for input only, since the dict + * has its own tables. */ + /* pledgedSrcSize == 0 means 0! */ + + if (cdict->matchState.dedicatedDictSearch) { + ZSTD_dedicatedDictSearch_revertCParams(&adjusted_cdict_cParams); + } + + params.cParams = ZSTD_adjustCParams_internal(adjusted_cdict_cParams, pledgedSrcSize, + cdict->dictContentSize, ZSTD_cpm_attachDict, + params.useRowMatchFinder); + params.cParams.windowLog = windowLog; + params.useRowMatchFinder = cdict->useRowMatchFinder; /* cdict overrides */ + FORWARD_IF_ERROR(ZSTD_resetCCtx_internal(cctx, ¶ms, pledgedSrcSize, + /* loadedDictSize */ 0, + ZSTDcrp_makeClean, zbuff), ""); + assert(cctx->appliedParams.cParams.strategy == adjusted_cdict_cParams.strategy); + } + + { const U32 cdictEnd = (U32)( cdict->matchState.window.nextSrc + - cdict->matchState.window.base); + const U32 cdictLen = cdictEnd - cdict->matchState.window.dictLimit; + if (cdictLen == 0) { + /* don't even attach dictionaries with no contents */ + DEBUGLOG(4, "skipping attaching empty dictionary"); + } else { + DEBUGLOG(4, "attaching dictionary into context"); + cctx->blockState.matchState.dictMatchState = &cdict->matchState; + + /* prep working match state so dict matches never have negative indices + * when they are translated to the working context's index space. */ + if (cctx->blockState.matchState.window.dictLimit < cdictEnd) { + cctx->blockState.matchState.window.nextSrc = + cctx->blockState.matchState.window.base + cdictEnd; + ZSTD_window_clear(&cctx->blockState.matchState.window); + } + /* loadedDictEnd is expressed within the referential of the active context */ + cctx->blockState.matchState.loadedDictEnd = cctx->blockState.matchState.window.dictLimit; + } } + + cctx->dictID = cdict->dictID; + cctx->dictContentSize = cdict->dictContentSize; + + /* copy block state */ + ZSTD_memcpy(cctx->blockState.prevCBlock, &cdict->cBlockState, sizeof(cdict->cBlockState)); + + return 0; +} + +static void ZSTD_copyCDictTableIntoCCtx(U32* dst, U32 const* src, size_t tableSize, + ZSTD_compressionParameters const* cParams) { + if (ZSTD_CDictIndicesAreTagged(cParams)){ + /* Remove tags from the CDict table if they are present. + * See docs on "short cache" in zstd_compress_internal.h for context. */ + size_t i; + for (i = 0; i < tableSize; i++) { + U32 const taggedIndex = src[i]; + U32 const index = taggedIndex >> ZSTD_SHORT_CACHE_TAG_BITS; + dst[i] = index; + } + } else { + ZSTD_memcpy(dst, src, tableSize * sizeof(U32)); + } +} + +static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx, + const ZSTD_CDict* cdict, + ZSTD_CCtx_params params, + U64 pledgedSrcSize, + ZSTD_buffered_policy_e zbuff) +{ + const ZSTD_compressionParameters *cdict_cParams = &cdict->matchState.cParams; + + assert(!cdict->matchState.dedicatedDictSearch); + DEBUGLOG(4, "ZSTD_resetCCtx_byCopyingCDict() pledgedSrcSize=%llu", + (unsigned long long)pledgedSrcSize); + + { unsigned const windowLog = params.cParams.windowLog; + assert(windowLog != 0); + /* Copy only compression parameters related to tables. */ + params.cParams = *cdict_cParams; + params.cParams.windowLog = windowLog; + params.useRowMatchFinder = cdict->useRowMatchFinder; + FORWARD_IF_ERROR(ZSTD_resetCCtx_internal(cctx, ¶ms, pledgedSrcSize, + /* loadedDictSize */ 0, + ZSTDcrp_leaveDirty, zbuff), ""); + assert(cctx->appliedParams.cParams.strategy == cdict_cParams->strategy); + assert(cctx->appliedParams.cParams.hashLog == cdict_cParams->hashLog); + assert(cctx->appliedParams.cParams.chainLog == cdict_cParams->chainLog); + } + + ZSTD_cwksp_mark_tables_dirty(&cctx->workspace); + assert(params.useRowMatchFinder != ZSTD_ps_auto); + + /* copy tables */ + { size_t const chainSize = ZSTD_allocateChainTable(cdict_cParams->strategy, cdict->useRowMatchFinder, 0 /* DDS guaranteed disabled */) + ? ((size_t)1 << cdict_cParams->chainLog) + : 0; + size_t const hSize = (size_t)1 << cdict_cParams->hashLog; + + ZSTD_copyCDictTableIntoCCtx(cctx->blockState.matchState.hashTable, + cdict->matchState.hashTable, + hSize, cdict_cParams); + + /* Do not copy cdict's chainTable if cctx has parameters such that it would not use chainTable */ + if (ZSTD_allocateChainTable(cctx->appliedParams.cParams.strategy, cctx->appliedParams.useRowMatchFinder, 0 /* forDDSDict */)) { + ZSTD_copyCDictTableIntoCCtx(cctx->blockState.matchState.chainTable, + cdict->matchState.chainTable, + chainSize, cdict_cParams); + } + /* copy tag table */ + if (ZSTD_rowMatchFinderUsed(cdict_cParams->strategy, cdict->useRowMatchFinder)) { + size_t const tagTableSize = hSize; + ZSTD_memcpy(cctx->blockState.matchState.tagTable, + cdict->matchState.tagTable, + tagTableSize); + cctx->blockState.matchState.hashSalt = cdict->matchState.hashSalt; + } + } + + /* Zero the hashTable3, since the cdict never fills it */ + { int const h3log = cctx->blockState.matchState.hashLog3; + size_t const h3Size = h3log ? ((size_t)1 << h3log) : 0; + assert(cdict->matchState.hashLog3 == 0); + ZSTD_memset(cctx->blockState.matchState.hashTable3, 0, h3Size * sizeof(U32)); + } + + ZSTD_cwksp_mark_tables_clean(&cctx->workspace); + + /* copy dictionary offsets */ + { ZSTD_matchState_t const* srcMatchState = &cdict->matchState; + ZSTD_matchState_t* dstMatchState = &cctx->blockState.matchState; + dstMatchState->window = srcMatchState->window; + dstMatchState->nextToUpdate = srcMatchState->nextToUpdate; + dstMatchState->loadedDictEnd= srcMatchState->loadedDictEnd; + } + + cctx->dictID = cdict->dictID; + cctx->dictContentSize = cdict->dictContentSize; + + /* copy block state */ + ZSTD_memcpy(cctx->blockState.prevCBlock, &cdict->cBlockState, sizeof(cdict->cBlockState)); + + return 0; +} + +/* We have a choice between copying the dictionary context into the working + * context, or referencing the dictionary context from the working context + * in-place. We decide here which strategy to use. */ +static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx, + const ZSTD_CDict* cdict, + const ZSTD_CCtx_params* params, + U64 pledgedSrcSize, + ZSTD_buffered_policy_e zbuff) +{ + + DEBUGLOG(4, "ZSTD_resetCCtx_usingCDict (pledgedSrcSize=%u)", + (unsigned)pledgedSrcSize); + + if (ZSTD_shouldAttachDict(cdict, params, pledgedSrcSize)) { + return ZSTD_resetCCtx_byAttachingCDict( + cctx, cdict, *params, pledgedSrcSize, zbuff); + } else { + return ZSTD_resetCCtx_byCopyingCDict( + cctx, cdict, *params, pledgedSrcSize, zbuff); + } +} + +/*! ZSTD_copyCCtx_internal() : + * Duplicate an existing context `srcCCtx` into another one `dstCCtx`. + * Only works during stage ZSTDcs_init (i.e. after creation, but before first call to ZSTD_compressContinue()). + * The "context", in this case, refers to the hash and chain tables, + * entropy tables, and dictionary references. + * `windowLog` value is enforced if != 0, otherwise value is copied from srcCCtx. + * @return : 0, or an error code */ +static size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx, + const ZSTD_CCtx* srcCCtx, + ZSTD_frameParameters fParams, + U64 pledgedSrcSize, + ZSTD_buffered_policy_e zbuff) +{ + RETURN_ERROR_IF(srcCCtx->stage!=ZSTDcs_init, stage_wrong, + "Can't copy a ctx that's not in init stage."); + DEBUGLOG(5, "ZSTD_copyCCtx_internal"); + ZSTD_memcpy(&dstCCtx->customMem, &srcCCtx->customMem, sizeof(ZSTD_customMem)); + { ZSTD_CCtx_params params = dstCCtx->requestedParams; + /* Copy only compression parameters related to tables. */ + params.cParams = srcCCtx->appliedParams.cParams; + assert(srcCCtx->appliedParams.useRowMatchFinder != ZSTD_ps_auto); + assert(srcCCtx->appliedParams.useBlockSplitter != ZSTD_ps_auto); + assert(srcCCtx->appliedParams.ldmParams.enableLdm != ZSTD_ps_auto); + params.useRowMatchFinder = srcCCtx->appliedParams.useRowMatchFinder; + params.useBlockSplitter = srcCCtx->appliedParams.useBlockSplitter; + params.ldmParams = srcCCtx->appliedParams.ldmParams; + params.fParams = fParams; + params.maxBlockSize = srcCCtx->appliedParams.maxBlockSize; + ZSTD_resetCCtx_internal(dstCCtx, ¶ms, pledgedSrcSize, + /* loadedDictSize */ 0, + ZSTDcrp_leaveDirty, zbuff); + assert(dstCCtx->appliedParams.cParams.windowLog == srcCCtx->appliedParams.cParams.windowLog); + assert(dstCCtx->appliedParams.cParams.strategy == srcCCtx->appliedParams.cParams.strategy); + assert(dstCCtx->appliedParams.cParams.hashLog == srcCCtx->appliedParams.cParams.hashLog); + assert(dstCCtx->appliedParams.cParams.chainLog == srcCCtx->appliedParams.cParams.chainLog); + assert(dstCCtx->blockState.matchState.hashLog3 == srcCCtx->blockState.matchState.hashLog3); + } + + ZSTD_cwksp_mark_tables_dirty(&dstCCtx->workspace); + + /* copy tables */ + { size_t const chainSize = ZSTD_allocateChainTable(srcCCtx->appliedParams.cParams.strategy, + srcCCtx->appliedParams.useRowMatchFinder, + 0 /* forDDSDict */) + ? ((size_t)1 << srcCCtx->appliedParams.cParams.chainLog) + : 0; + size_t const hSize = (size_t)1 << srcCCtx->appliedParams.cParams.hashLog; + int const h3log = srcCCtx->blockState.matchState.hashLog3; + size_t const h3Size = h3log ? ((size_t)1 << h3log) : 0; + + ZSTD_memcpy(dstCCtx->blockState.matchState.hashTable, + srcCCtx->blockState.matchState.hashTable, + hSize * sizeof(U32)); + ZSTD_memcpy(dstCCtx->blockState.matchState.chainTable, + srcCCtx->blockState.matchState.chainTable, + chainSize * sizeof(U32)); + ZSTD_memcpy(dstCCtx->blockState.matchState.hashTable3, + srcCCtx->blockState.matchState.hashTable3, + h3Size * sizeof(U32)); + } + + ZSTD_cwksp_mark_tables_clean(&dstCCtx->workspace); + + /* copy dictionary offsets */ + { + const ZSTD_matchState_t* srcMatchState = &srcCCtx->blockState.matchState; + ZSTD_matchState_t* dstMatchState = &dstCCtx->blockState.matchState; + dstMatchState->window = srcMatchState->window; + dstMatchState->nextToUpdate = srcMatchState->nextToUpdate; + dstMatchState->loadedDictEnd= srcMatchState->loadedDictEnd; + } + dstCCtx->dictID = srcCCtx->dictID; + dstCCtx->dictContentSize = srcCCtx->dictContentSize; + + /* copy block state */ + ZSTD_memcpy(dstCCtx->blockState.prevCBlock, srcCCtx->blockState.prevCBlock, sizeof(*srcCCtx->blockState.prevCBlock)); + + return 0; +} + +/*! ZSTD_copyCCtx() : + * Duplicate an existing context `srcCCtx` into another one `dstCCtx`. + * Only works during stage ZSTDcs_init (i.e. after creation, but before first call to ZSTD_compressContinue()). + * pledgedSrcSize==0 means "unknown". +* @return : 0, or an error code */ +size_t ZSTD_copyCCtx(ZSTD_CCtx* dstCCtx, const ZSTD_CCtx* srcCCtx, unsigned long long pledgedSrcSize) +{ + ZSTD_frameParameters fParams = { 1 /*content*/, 0 /*checksum*/, 0 /*noDictID*/ }; + ZSTD_buffered_policy_e const zbuff = srcCCtx->bufferedPolicy; + ZSTD_STATIC_ASSERT((U32)ZSTDb_buffered==1); + if (pledgedSrcSize==0) pledgedSrcSize = ZSTD_CONTENTSIZE_UNKNOWN; + fParams.contentSizeFlag = (pledgedSrcSize != ZSTD_CONTENTSIZE_UNKNOWN); + + return ZSTD_copyCCtx_internal(dstCCtx, srcCCtx, + fParams, pledgedSrcSize, + zbuff); +} + + +#define ZSTD_ROWSIZE 16 +/*! ZSTD_reduceTable() : + * reduce table indexes by `reducerValue`, or squash to zero. + * PreserveMark preserves "unsorted mark" for btlazy2 strategy. + * It must be set to a clear 0/1 value, to remove branch during inlining. + * Presume table size is a multiple of ZSTD_ROWSIZE + * to help auto-vectorization */ +FORCE_INLINE_TEMPLATE void +ZSTD_reduceTable_internal (U32* const table, U32 const size, U32 const reducerValue, int const preserveMark) +{ + int const nbRows = (int)size / ZSTD_ROWSIZE; + int cellNb = 0; + int rowNb; + /* Protect special index values < ZSTD_WINDOW_START_INDEX. */ + U32 const reducerThreshold = reducerValue + ZSTD_WINDOW_START_INDEX; + assert((size & (ZSTD_ROWSIZE-1)) == 0); /* multiple of ZSTD_ROWSIZE */ + assert(size < (1U<<31)); /* can be casted to int */ + +#if ZSTD_MEMORY_SANITIZER && !defined (ZSTD_MSAN_DONT_POISON_WORKSPACE) + /* To validate that the table re-use logic is sound, and that we don't + * access table space that we haven't cleaned, we re-"poison" the table + * space every time we mark it dirty. + * + * This function however is intended to operate on those dirty tables and + * re-clean them. So when this function is used correctly, we can unpoison + * the memory it operated on. This introduces a blind spot though, since + * if we now try to operate on __actually__ poisoned memory, we will not + * detect that. */ + __msan_unpoison(table, size * sizeof(U32)); +#endif + + for (rowNb=0 ; rowNb < nbRows ; rowNb++) { + int column; + for (column=0; columncParams.hashLog; + ZSTD_reduceTable(ms->hashTable, hSize, reducerValue); + } + + if (ZSTD_allocateChainTable(params->cParams.strategy, params->useRowMatchFinder, (U32)ms->dedicatedDictSearch)) { + U32 const chainSize = (U32)1 << params->cParams.chainLog; + if (params->cParams.strategy == ZSTD_btlazy2) + ZSTD_reduceTable_btlazy2(ms->chainTable, chainSize, reducerValue); + else + ZSTD_reduceTable(ms->chainTable, chainSize, reducerValue); + } + + if (ms->hashLog3) { + U32 const h3Size = (U32)1 << ms->hashLog3; + ZSTD_reduceTable(ms->hashTable3, h3Size, reducerValue); + } +} + + +/*-******************************************************* +* Block entropic compression +*********************************************************/ + +/* See doc/zstd_compression_format.md for detailed format description */ + +int ZSTD_seqToCodes(const seqStore_t* seqStorePtr) +{ + const seqDef* const sequences = seqStorePtr->sequencesStart; + BYTE* const llCodeTable = seqStorePtr->llCode; + BYTE* const ofCodeTable = seqStorePtr->ofCode; + BYTE* const mlCodeTable = seqStorePtr->mlCode; + U32 const nbSeq = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart); + U32 u; + int longOffsets = 0; + assert(nbSeq <= seqStorePtr->maxNbSeq); + for (u=0; u= STREAM_ACCUMULATOR_MIN)); + if (MEM_32bits() && ofCode >= STREAM_ACCUMULATOR_MIN) + longOffsets = 1; + } + if (seqStorePtr->longLengthType==ZSTD_llt_literalLength) + llCodeTable[seqStorePtr->longLengthPos] = MaxLL; + if (seqStorePtr->longLengthType==ZSTD_llt_matchLength) + mlCodeTable[seqStorePtr->longLengthPos] = MaxML; + return longOffsets; +} + +/* ZSTD_useTargetCBlockSize(): + * Returns if target compressed block size param is being used. + * If used, compression will do best effort to make a compressed block size to be around targetCBlockSize. + * Returns 1 if true, 0 otherwise. */ +static int ZSTD_useTargetCBlockSize(const ZSTD_CCtx_params* cctxParams) +{ + DEBUGLOG(5, "ZSTD_useTargetCBlockSize (targetCBlockSize=%zu)", cctxParams->targetCBlockSize); + return (cctxParams->targetCBlockSize != 0); +} + +/* ZSTD_blockSplitterEnabled(): + * Returns if block splitting param is being used + * If used, compression will do best effort to split a block in order to improve compression ratio. + * At the time this function is called, the parameter must be finalized. + * Returns 1 if true, 0 otherwise. */ +static int ZSTD_blockSplitterEnabled(ZSTD_CCtx_params* cctxParams) +{ + DEBUGLOG(5, "ZSTD_blockSplitterEnabled (useBlockSplitter=%d)", cctxParams->useBlockSplitter); + assert(cctxParams->useBlockSplitter != ZSTD_ps_auto); + return (cctxParams->useBlockSplitter == ZSTD_ps_enable); +} + +/* Type returned by ZSTD_buildSequencesStatistics containing finalized symbol encoding types + * and size of the sequences statistics + */ +typedef struct { + U32 LLtype; + U32 Offtype; + U32 MLtype; + size_t size; + size_t lastCountSize; /* Accounts for bug in 1.3.4. More detail in ZSTD_entropyCompressSeqStore_internal() */ + int longOffsets; +} ZSTD_symbolEncodingTypeStats_t; + +/* ZSTD_buildSequencesStatistics(): + * Returns a ZSTD_symbolEncodingTypeStats_t, or a zstd error code in the `size` field. + * Modifies `nextEntropy` to have the appropriate values as a side effect. + * nbSeq must be greater than 0. + * + * entropyWkspSize must be of size at least ENTROPY_WORKSPACE_SIZE - (MaxSeq + 1)*sizeof(U32) + */ +static ZSTD_symbolEncodingTypeStats_t +ZSTD_buildSequencesStatistics( + const seqStore_t* seqStorePtr, size_t nbSeq, + const ZSTD_fseCTables_t* prevEntropy, ZSTD_fseCTables_t* nextEntropy, + BYTE* dst, const BYTE* const dstEnd, + ZSTD_strategy strategy, unsigned* countWorkspace, + void* entropyWorkspace, size_t entropyWkspSize) +{ + BYTE* const ostart = dst; + const BYTE* const oend = dstEnd; + BYTE* op = ostart; + FSE_CTable* CTable_LitLength = nextEntropy->litlengthCTable; + FSE_CTable* CTable_OffsetBits = nextEntropy->offcodeCTable; + FSE_CTable* CTable_MatchLength = nextEntropy->matchlengthCTable; + const BYTE* const ofCodeTable = seqStorePtr->ofCode; + const BYTE* const llCodeTable = seqStorePtr->llCode; + const BYTE* const mlCodeTable = seqStorePtr->mlCode; + ZSTD_symbolEncodingTypeStats_t stats; + + stats.lastCountSize = 0; + /* convert length/distances into codes */ + stats.longOffsets = ZSTD_seqToCodes(seqStorePtr); + assert(op <= oend); + assert(nbSeq != 0); /* ZSTD_selectEncodingType() divides by nbSeq */ + /* build CTable for Literal Lengths */ + { unsigned max = MaxLL; + size_t const mostFrequent = HIST_countFast_wksp(countWorkspace, &max, llCodeTable, nbSeq, entropyWorkspace, entropyWkspSize); /* can't fail */ + DEBUGLOG(5, "Building LL table"); + nextEntropy->litlength_repeatMode = prevEntropy->litlength_repeatMode; + stats.LLtype = ZSTD_selectEncodingType(&nextEntropy->litlength_repeatMode, + countWorkspace, max, mostFrequent, nbSeq, + LLFSELog, prevEntropy->litlengthCTable, + LL_defaultNorm, LL_defaultNormLog, + ZSTD_defaultAllowed, strategy); + assert(set_basic < set_compressed && set_rle < set_compressed); + assert(!(stats.LLtype < set_compressed && nextEntropy->litlength_repeatMode != FSE_repeat_none)); /* We don't copy tables */ + { size_t const countSize = ZSTD_buildCTable( + op, (size_t)(oend - op), + CTable_LitLength, LLFSELog, (symbolEncodingType_e)stats.LLtype, + countWorkspace, max, llCodeTable, nbSeq, + LL_defaultNorm, LL_defaultNormLog, MaxLL, + prevEntropy->litlengthCTable, + sizeof(prevEntropy->litlengthCTable), + entropyWorkspace, entropyWkspSize); + if (ZSTD_isError(countSize)) { + DEBUGLOG(3, "ZSTD_buildCTable for LitLens failed"); + stats.size = countSize; + return stats; + } + if (stats.LLtype == set_compressed) + stats.lastCountSize = countSize; + op += countSize; + assert(op <= oend); + } } + /* build CTable for Offsets */ + { unsigned max = MaxOff; + size_t const mostFrequent = HIST_countFast_wksp( + countWorkspace, &max, ofCodeTable, nbSeq, entropyWorkspace, entropyWkspSize); /* can't fail */ + /* We can only use the basic table if max <= DefaultMaxOff, otherwise the offsets are too large */ + ZSTD_defaultPolicy_e const defaultPolicy = (max <= DefaultMaxOff) ? ZSTD_defaultAllowed : ZSTD_defaultDisallowed; + DEBUGLOG(5, "Building OF table"); + nextEntropy->offcode_repeatMode = prevEntropy->offcode_repeatMode; + stats.Offtype = ZSTD_selectEncodingType(&nextEntropy->offcode_repeatMode, + countWorkspace, max, mostFrequent, nbSeq, + OffFSELog, prevEntropy->offcodeCTable, + OF_defaultNorm, OF_defaultNormLog, + defaultPolicy, strategy); + assert(!(stats.Offtype < set_compressed && nextEntropy->offcode_repeatMode != FSE_repeat_none)); /* We don't copy tables */ + { size_t const countSize = ZSTD_buildCTable( + op, (size_t)(oend - op), + CTable_OffsetBits, OffFSELog, (symbolEncodingType_e)stats.Offtype, + countWorkspace, max, ofCodeTable, nbSeq, + OF_defaultNorm, OF_defaultNormLog, DefaultMaxOff, + prevEntropy->offcodeCTable, + sizeof(prevEntropy->offcodeCTable), + entropyWorkspace, entropyWkspSize); + if (ZSTD_isError(countSize)) { + DEBUGLOG(3, "ZSTD_buildCTable for Offsets failed"); + stats.size = countSize; + return stats; + } + if (stats.Offtype == set_compressed) + stats.lastCountSize = countSize; + op += countSize; + assert(op <= oend); + } } + /* build CTable for MatchLengths */ + { unsigned max = MaxML; + size_t const mostFrequent = HIST_countFast_wksp( + countWorkspace, &max, mlCodeTable, nbSeq, entropyWorkspace, entropyWkspSize); /* can't fail */ + DEBUGLOG(5, "Building ML table (remaining space : %i)", (int)(oend-op)); + nextEntropy->matchlength_repeatMode = prevEntropy->matchlength_repeatMode; + stats.MLtype = ZSTD_selectEncodingType(&nextEntropy->matchlength_repeatMode, + countWorkspace, max, mostFrequent, nbSeq, + MLFSELog, prevEntropy->matchlengthCTable, + ML_defaultNorm, ML_defaultNormLog, + ZSTD_defaultAllowed, strategy); + assert(!(stats.MLtype < set_compressed && nextEntropy->matchlength_repeatMode != FSE_repeat_none)); /* We don't copy tables */ + { size_t const countSize = ZSTD_buildCTable( + op, (size_t)(oend - op), + CTable_MatchLength, MLFSELog, (symbolEncodingType_e)stats.MLtype, + countWorkspace, max, mlCodeTable, nbSeq, + ML_defaultNorm, ML_defaultNormLog, MaxML, + prevEntropy->matchlengthCTable, + sizeof(prevEntropy->matchlengthCTable), + entropyWorkspace, entropyWkspSize); + if (ZSTD_isError(countSize)) { + DEBUGLOG(3, "ZSTD_buildCTable for MatchLengths failed"); + stats.size = countSize; + return stats; + } + if (stats.MLtype == set_compressed) + stats.lastCountSize = countSize; + op += countSize; + assert(op <= oend); + } } + stats.size = (size_t)(op-ostart); + return stats; +} + +/* ZSTD_entropyCompressSeqStore_internal(): + * compresses both literals and sequences + * Returns compressed size of block, or a zstd error. + */ +#define SUSPECT_UNCOMPRESSIBLE_LITERAL_RATIO 20 +MEM_STATIC size_t +ZSTD_entropyCompressSeqStore_internal( + const seqStore_t* seqStorePtr, + const ZSTD_entropyCTables_t* prevEntropy, + ZSTD_entropyCTables_t* nextEntropy, + const ZSTD_CCtx_params* cctxParams, + void* dst, size_t dstCapacity, + void* entropyWorkspace, size_t entropyWkspSize, + const int bmi2) +{ + ZSTD_strategy const strategy = cctxParams->cParams.strategy; + unsigned* count = (unsigned*)entropyWorkspace; + FSE_CTable* CTable_LitLength = nextEntropy->fse.litlengthCTable; + FSE_CTable* CTable_OffsetBits = nextEntropy->fse.offcodeCTable; + FSE_CTable* CTable_MatchLength = nextEntropy->fse.matchlengthCTable; + const seqDef* const sequences = seqStorePtr->sequencesStart; + const size_t nbSeq = (size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart); + const BYTE* const ofCodeTable = seqStorePtr->ofCode; + const BYTE* const llCodeTable = seqStorePtr->llCode; + const BYTE* const mlCodeTable = seqStorePtr->mlCode; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = ostart + dstCapacity; + BYTE* op = ostart; + size_t lastCountSize; + int longOffsets = 0; + + entropyWorkspace = count + (MaxSeq + 1); + entropyWkspSize -= (MaxSeq + 1) * sizeof(*count); + + DEBUGLOG(5, "ZSTD_entropyCompressSeqStore_internal (nbSeq=%zu, dstCapacity=%zu)", nbSeq, dstCapacity); + ZSTD_STATIC_ASSERT(HUF_WORKSPACE_SIZE >= (1<= HUF_WORKSPACE_SIZE); + + /* Compress literals */ + { const BYTE* const literals = seqStorePtr->litStart; + size_t const numSequences = (size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart); + size_t const numLiterals = (size_t)(seqStorePtr->lit - seqStorePtr->litStart); + /* Base suspicion of uncompressibility on ratio of literals to sequences */ + unsigned const suspectUncompressible = (numSequences == 0) || (numLiterals / numSequences >= SUSPECT_UNCOMPRESSIBLE_LITERAL_RATIO); + size_t const litSize = (size_t)(seqStorePtr->lit - literals); + + size_t const cSize = ZSTD_compressLiterals( + op, dstCapacity, + literals, litSize, + entropyWorkspace, entropyWkspSize, + &prevEntropy->huf, &nextEntropy->huf, + cctxParams->cParams.strategy, + ZSTD_literalsCompressionIsDisabled(cctxParams), + suspectUncompressible, bmi2); + FORWARD_IF_ERROR(cSize, "ZSTD_compressLiterals failed"); + assert(cSize <= dstCapacity); + op += cSize; + } + + /* Sequences Header */ + RETURN_ERROR_IF((oend-op) < 3 /*max nbSeq Size*/ + 1 /*seqHead*/, + dstSize_tooSmall, "Can't fit seq hdr in output buf!"); + if (nbSeq < 128) { + *op++ = (BYTE)nbSeq; + } else if (nbSeq < LONGNBSEQ) { + op[0] = (BYTE)((nbSeq>>8) + 0x80); + op[1] = (BYTE)nbSeq; + op+=2; + } else { + op[0]=0xFF; + MEM_writeLE16(op+1, (U16)(nbSeq - LONGNBSEQ)); + op+=3; + } + assert(op <= oend); + if (nbSeq==0) { + /* Copy the old tables over as if we repeated them */ + ZSTD_memcpy(&nextEntropy->fse, &prevEntropy->fse, sizeof(prevEntropy->fse)); + return (size_t)(op - ostart); + } + { BYTE* const seqHead = op++; + /* build stats for sequences */ + const ZSTD_symbolEncodingTypeStats_t stats = + ZSTD_buildSequencesStatistics(seqStorePtr, nbSeq, + &prevEntropy->fse, &nextEntropy->fse, + op, oend, + strategy, count, + entropyWorkspace, entropyWkspSize); + FORWARD_IF_ERROR(stats.size, "ZSTD_buildSequencesStatistics failed!"); + *seqHead = (BYTE)((stats.LLtype<<6) + (stats.Offtype<<4) + (stats.MLtype<<2)); + lastCountSize = stats.lastCountSize; + op += stats.size; + longOffsets = stats.longOffsets; + } + + { size_t const bitstreamSize = ZSTD_encodeSequences( + op, (size_t)(oend - op), + CTable_MatchLength, mlCodeTable, + CTable_OffsetBits, ofCodeTable, + CTable_LitLength, llCodeTable, + sequences, nbSeq, + longOffsets, bmi2); + FORWARD_IF_ERROR(bitstreamSize, "ZSTD_encodeSequences failed"); + op += bitstreamSize; + assert(op <= oend); + /* zstd versions <= 1.3.4 mistakenly report corruption when + * FSE_readNCount() receives a buffer < 4 bytes. + * Fixed by https://github.com/facebook/zstd/pull/1146. + * This can happen when the last set_compressed table present is 2 + * bytes and the bitstream is only one byte. + * In this exceedingly rare case, we will simply emit an uncompressed + * block, since it isn't worth optimizing. + */ + if (lastCountSize && (lastCountSize + bitstreamSize) < 4) { + /* lastCountSize >= 2 && bitstreamSize > 0 ==> lastCountSize == 3 */ + assert(lastCountSize + bitstreamSize == 3); + DEBUGLOG(5, "Avoiding bug in zstd decoder in versions <= 1.3.4 by " + "emitting an uncompressed block."); + return 0; + } + } + + DEBUGLOG(5, "compressed block size : %u", (unsigned)(op - ostart)); + return (size_t)(op - ostart); +} + +MEM_STATIC size_t +ZSTD_entropyCompressSeqStore( + const seqStore_t* seqStorePtr, + const ZSTD_entropyCTables_t* prevEntropy, + ZSTD_entropyCTables_t* nextEntropy, + const ZSTD_CCtx_params* cctxParams, + void* dst, size_t dstCapacity, + size_t srcSize, + void* entropyWorkspace, size_t entropyWkspSize, + int bmi2) +{ + size_t const cSize = ZSTD_entropyCompressSeqStore_internal( + seqStorePtr, prevEntropy, nextEntropy, cctxParams, + dst, dstCapacity, + entropyWorkspace, entropyWkspSize, bmi2); + if (cSize == 0) return 0; + /* When srcSize <= dstCapacity, there is enough space to write a raw uncompressed block. + * Since we ran out of space, block must be not compressible, so fall back to raw uncompressed block. + */ + if ((cSize == ERROR(dstSize_tooSmall)) & (srcSize <= dstCapacity)) { + DEBUGLOG(4, "not enough dstCapacity (%zu) for ZSTD_entropyCompressSeqStore_internal()=> do not compress block", dstCapacity); + return 0; /* block not compressed */ + } + FORWARD_IF_ERROR(cSize, "ZSTD_entropyCompressSeqStore_internal failed"); + + /* Check compressibility */ + { size_t const maxCSize = srcSize - ZSTD_minGain(srcSize, cctxParams->cParams.strategy); + if (cSize >= maxCSize) return 0; /* block not compressed */ + } + DEBUGLOG(5, "ZSTD_entropyCompressSeqStore() cSize: %zu", cSize); + /* libzstd decoder before > v1.5.4 is not compatible with compressed blocks of size ZSTD_BLOCKSIZE_MAX exactly. + * This restriction is indirectly already fulfilled by respecting ZSTD_minGain() condition above. + */ + assert(cSize < ZSTD_BLOCKSIZE_MAX); + return cSize; +} + +/* ZSTD_selectBlockCompressor() : + * Not static, but internal use only (used by long distance matcher) + * assumption : strat is a valid strategy */ +ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_paramSwitch_e useRowMatchFinder, ZSTD_dictMode_e dictMode) +{ + static const ZSTD_blockCompressor blockCompressor[4][ZSTD_STRATEGY_MAX+1] = { + { ZSTD_compressBlock_fast /* default for 0 */, + ZSTD_compressBlock_fast, + ZSTD_compressBlock_doubleFast, + ZSTD_compressBlock_greedy, + ZSTD_compressBlock_lazy, + ZSTD_compressBlock_lazy2, + ZSTD_compressBlock_btlazy2, + ZSTD_compressBlock_btopt, + ZSTD_compressBlock_btultra, + ZSTD_compressBlock_btultra2 }, + { ZSTD_compressBlock_fast_extDict /* default for 0 */, + ZSTD_compressBlock_fast_extDict, + ZSTD_compressBlock_doubleFast_extDict, + ZSTD_compressBlock_greedy_extDict, + ZSTD_compressBlock_lazy_extDict, + ZSTD_compressBlock_lazy2_extDict, + ZSTD_compressBlock_btlazy2_extDict, + ZSTD_compressBlock_btopt_extDict, + ZSTD_compressBlock_btultra_extDict, + ZSTD_compressBlock_btultra_extDict }, + { ZSTD_compressBlock_fast_dictMatchState /* default for 0 */, + ZSTD_compressBlock_fast_dictMatchState, + ZSTD_compressBlock_doubleFast_dictMatchState, + ZSTD_compressBlock_greedy_dictMatchState, + ZSTD_compressBlock_lazy_dictMatchState, + ZSTD_compressBlock_lazy2_dictMatchState, + ZSTD_compressBlock_btlazy2_dictMatchState, + ZSTD_compressBlock_btopt_dictMatchState, + ZSTD_compressBlock_btultra_dictMatchState, + ZSTD_compressBlock_btultra_dictMatchState }, + { NULL /* default for 0 */, + NULL, + NULL, + ZSTD_compressBlock_greedy_dedicatedDictSearch, + ZSTD_compressBlock_lazy_dedicatedDictSearch, + ZSTD_compressBlock_lazy2_dedicatedDictSearch, + NULL, + NULL, + NULL, + NULL } + }; + ZSTD_blockCompressor selectedCompressor; + ZSTD_STATIC_ASSERT((unsigned)ZSTD_fast == 1); + + assert(ZSTD_cParam_withinBounds(ZSTD_c_strategy, strat)); + DEBUGLOG(4, "Selected block compressor: dictMode=%d strat=%d rowMatchfinder=%d", (int)dictMode, (int)strat, (int)useRowMatchFinder); + if (ZSTD_rowMatchFinderUsed(strat, useRowMatchFinder)) { + static const ZSTD_blockCompressor rowBasedBlockCompressors[4][3] = { + { ZSTD_compressBlock_greedy_row, + ZSTD_compressBlock_lazy_row, + ZSTD_compressBlock_lazy2_row }, + { ZSTD_compressBlock_greedy_extDict_row, + ZSTD_compressBlock_lazy_extDict_row, + ZSTD_compressBlock_lazy2_extDict_row }, + { ZSTD_compressBlock_greedy_dictMatchState_row, + ZSTD_compressBlock_lazy_dictMatchState_row, + ZSTD_compressBlock_lazy2_dictMatchState_row }, + { ZSTD_compressBlock_greedy_dedicatedDictSearch_row, + ZSTD_compressBlock_lazy_dedicatedDictSearch_row, + ZSTD_compressBlock_lazy2_dedicatedDictSearch_row } + }; + DEBUGLOG(4, "Selecting a row-based matchfinder"); + assert(useRowMatchFinder != ZSTD_ps_auto); + selectedCompressor = rowBasedBlockCompressors[(int)dictMode][(int)strat - (int)ZSTD_greedy]; + } else { + selectedCompressor = blockCompressor[(int)dictMode][(int)strat]; + } + assert(selectedCompressor != NULL); + return selectedCompressor; +} + +static void ZSTD_storeLastLiterals(seqStore_t* seqStorePtr, + const BYTE* anchor, size_t lastLLSize) +{ + ZSTD_memcpy(seqStorePtr->lit, anchor, lastLLSize); + seqStorePtr->lit += lastLLSize; +} + +void ZSTD_resetSeqStore(seqStore_t* ssPtr) +{ + ssPtr->lit = ssPtr->litStart; + ssPtr->sequences = ssPtr->sequencesStart; + ssPtr->longLengthType = ZSTD_llt_none; +} + +/* ZSTD_postProcessSequenceProducerResult() : + * Validates and post-processes sequences obtained through the external matchfinder API: + * - Checks whether nbExternalSeqs represents an error condition. + * - Appends a block delimiter to outSeqs if one is not already present. + * See zstd.h for context regarding block delimiters. + * Returns the number of sequences after post-processing, or an error code. */ +static size_t ZSTD_postProcessSequenceProducerResult( + ZSTD_Sequence* outSeqs, size_t nbExternalSeqs, size_t outSeqsCapacity, size_t srcSize +) { + RETURN_ERROR_IF( + nbExternalSeqs > outSeqsCapacity, + sequenceProducer_failed, + "External sequence producer returned error code %lu", + (unsigned long)nbExternalSeqs + ); + + RETURN_ERROR_IF( + nbExternalSeqs == 0 && srcSize > 0, + sequenceProducer_failed, + "Got zero sequences from external sequence producer for a non-empty src buffer!" + ); + + if (srcSize == 0) { + ZSTD_memset(&outSeqs[0], 0, sizeof(ZSTD_Sequence)); + return 1; + } + + { + ZSTD_Sequence const lastSeq = outSeqs[nbExternalSeqs - 1]; + + /* We can return early if lastSeq is already a block delimiter. */ + if (lastSeq.offset == 0 && lastSeq.matchLength == 0) { + return nbExternalSeqs; + } + + /* This error condition is only possible if the external matchfinder + * produced an invalid parse, by definition of ZSTD_sequenceBound(). */ + RETURN_ERROR_IF( + nbExternalSeqs == outSeqsCapacity, + sequenceProducer_failed, + "nbExternalSeqs == outSeqsCapacity but lastSeq is not a block delimiter!" + ); + + /* lastSeq is not a block delimiter, so we need to append one. */ + ZSTD_memset(&outSeqs[nbExternalSeqs], 0, sizeof(ZSTD_Sequence)); + return nbExternalSeqs + 1; + } +} + +/* ZSTD_fastSequenceLengthSum() : + * Returns sum(litLen) + sum(matchLen) + lastLits for *seqBuf*. + * Similar to another function in zstd_compress.c (determine_blockSize), + * except it doesn't check for a block delimiter to end summation. + * Removing the early exit allows the compiler to auto-vectorize (https://godbolt.org/z/cY1cajz9P). + * This function can be deleted and replaced by determine_blockSize after we resolve issue #3456. */ +static size_t ZSTD_fastSequenceLengthSum(ZSTD_Sequence const* seqBuf, size_t seqBufSize) { + size_t matchLenSum, litLenSum, i; + matchLenSum = 0; + litLenSum = 0; + for (i = 0; i < seqBufSize; i++) { + litLenSum += seqBuf[i].litLength; + matchLenSum += seqBuf[i].matchLength; + } + return litLenSum + matchLenSum; +} + +typedef enum { ZSTDbss_compress, ZSTDbss_noCompress } ZSTD_buildSeqStore_e; + +static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) +{ + ZSTD_matchState_t* const ms = &zc->blockState.matchState; + DEBUGLOG(5, "ZSTD_buildSeqStore (srcSize=%zu)", srcSize); + assert(srcSize <= ZSTD_BLOCKSIZE_MAX); + /* Assert that we have correctly flushed the ctx params into the ms's copy */ + ZSTD_assertEqualCParams(zc->appliedParams.cParams, ms->cParams); + /* TODO: See 3090. We reduced MIN_CBLOCK_SIZE from 3 to 2 so to compensate we are adding + * additional 1. We need to revisit and change this logic to be more consistent */ + if (srcSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1+1) { + if (zc->appliedParams.cParams.strategy >= ZSTD_btopt) { + ZSTD_ldm_skipRawSeqStoreBytes(&zc->externSeqStore, srcSize); + } else { + ZSTD_ldm_skipSequences(&zc->externSeqStore, srcSize, zc->appliedParams.cParams.minMatch); + } + return ZSTDbss_noCompress; /* don't even attempt compression below a certain srcSize */ + } + ZSTD_resetSeqStore(&(zc->seqStore)); + /* required for optimal parser to read stats from dictionary */ + ms->opt.symbolCosts = &zc->blockState.prevCBlock->entropy; + /* tell the optimal parser how we expect to compress literals */ + ms->opt.literalCompressionMode = zc->appliedParams.literalCompressionMode; + /* a gap between an attached dict and the current window is not safe, + * they must remain adjacent, + * and when that stops being the case, the dict must be unset */ + assert(ms->dictMatchState == NULL || ms->loadedDictEnd == ms->window.dictLimit); + + /* limited update after a very long match */ + { const BYTE* const base = ms->window.base; + const BYTE* const istart = (const BYTE*)src; + const U32 curr = (U32)(istart-base); + if (sizeof(ptrdiff_t)==8) assert(istart - base < (ptrdiff_t)(U32)(-1)); /* ensure no overflow */ + if (curr > ms->nextToUpdate + 384) + ms->nextToUpdate = curr - MIN(192, (U32)(curr - ms->nextToUpdate - 384)); + } + + /* select and store sequences */ + { ZSTD_dictMode_e const dictMode = ZSTD_matchState_dictMode(ms); + size_t lastLLSize; + { int i; + for (i = 0; i < ZSTD_REP_NUM; ++i) + zc->blockState.nextCBlock->rep[i] = zc->blockState.prevCBlock->rep[i]; + } + if (zc->externSeqStore.pos < zc->externSeqStore.size) { + assert(zc->appliedParams.ldmParams.enableLdm == ZSTD_ps_disable); + + /* External matchfinder + LDM is technically possible, just not implemented yet. + * We need to revisit soon and implement it. */ + RETURN_ERROR_IF( + zc->appliedParams.useSequenceProducer, + parameter_combination_unsupported, + "Long-distance matching with external sequence producer enabled is not currently supported." + ); + + /* Updates ldmSeqStore.pos */ + lastLLSize = + ZSTD_ldm_blockCompress(&zc->externSeqStore, + ms, &zc->seqStore, + zc->blockState.nextCBlock->rep, + zc->appliedParams.useRowMatchFinder, + src, srcSize); + assert(zc->externSeqStore.pos <= zc->externSeqStore.size); + } else if (zc->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable) { + rawSeqStore_t ldmSeqStore = kNullRawSeqStore; + + /* External matchfinder + LDM is technically possible, just not implemented yet. + * We need to revisit soon and implement it. */ + RETURN_ERROR_IF( + zc->appliedParams.useSequenceProducer, + parameter_combination_unsupported, + "Long-distance matching with external sequence producer enabled is not currently supported." + ); + + ldmSeqStore.seq = zc->ldmSequences; + ldmSeqStore.capacity = zc->maxNbLdmSequences; + /* Updates ldmSeqStore.size */ + FORWARD_IF_ERROR(ZSTD_ldm_generateSequences(&zc->ldmState, &ldmSeqStore, + &zc->appliedParams.ldmParams, + src, srcSize), ""); + /* Updates ldmSeqStore.pos */ + lastLLSize = + ZSTD_ldm_blockCompress(&ldmSeqStore, + ms, &zc->seqStore, + zc->blockState.nextCBlock->rep, + zc->appliedParams.useRowMatchFinder, + src, srcSize); + assert(ldmSeqStore.pos == ldmSeqStore.size); + } else if (zc->appliedParams.useSequenceProducer) { + assert( + zc->externalMatchCtx.seqBufferCapacity >= ZSTD_sequenceBound(srcSize) + ); + assert(zc->externalMatchCtx.mFinder != NULL); + + { U32 const windowSize = (U32)1 << zc->appliedParams.cParams.windowLog; + + size_t const nbExternalSeqs = (zc->externalMatchCtx.mFinder)( + zc->externalMatchCtx.mState, + zc->externalMatchCtx.seqBuffer, + zc->externalMatchCtx.seqBufferCapacity, + src, srcSize, + NULL, 0, /* dict and dictSize, currently not supported */ + zc->appliedParams.compressionLevel, + windowSize + ); + + size_t const nbPostProcessedSeqs = ZSTD_postProcessSequenceProducerResult( + zc->externalMatchCtx.seqBuffer, + nbExternalSeqs, + zc->externalMatchCtx.seqBufferCapacity, + srcSize + ); + + /* Return early if there is no error, since we don't need to worry about last literals */ + if (!ZSTD_isError(nbPostProcessedSeqs)) { + ZSTD_sequencePosition seqPos = {0,0,0}; + size_t const seqLenSum = ZSTD_fastSequenceLengthSum(zc->externalMatchCtx.seqBuffer, nbPostProcessedSeqs); + RETURN_ERROR_IF(seqLenSum > srcSize, externalSequences_invalid, "External sequences imply too large a block!"); + FORWARD_IF_ERROR( + ZSTD_copySequencesToSeqStoreExplicitBlockDelim( + zc, &seqPos, + zc->externalMatchCtx.seqBuffer, nbPostProcessedSeqs, + src, srcSize, + zc->appliedParams.searchForExternalRepcodes + ), + "Failed to copy external sequences to seqStore!" + ); + ms->ldmSeqStore = NULL; + DEBUGLOG(5, "Copied %lu sequences from external sequence producer to internal seqStore.", (unsigned long)nbExternalSeqs); + return ZSTDbss_compress; + } + + /* Propagate the error if fallback is disabled */ + if (!zc->appliedParams.enableMatchFinderFallback) { + return nbPostProcessedSeqs; + } + + /* Fallback to software matchfinder */ + { ZSTD_blockCompressor const blockCompressor = ZSTD_selectBlockCompressor(zc->appliedParams.cParams.strategy, + zc->appliedParams.useRowMatchFinder, + dictMode); + ms->ldmSeqStore = NULL; + DEBUGLOG( + 5, + "External sequence producer returned error code %lu. Falling back to internal parser.", + (unsigned long)nbExternalSeqs + ); + lastLLSize = blockCompressor(ms, &zc->seqStore, zc->blockState.nextCBlock->rep, src, srcSize); + } } + } else { /* not long range mode and no external matchfinder */ + ZSTD_blockCompressor const blockCompressor = ZSTD_selectBlockCompressor(zc->appliedParams.cParams.strategy, + zc->appliedParams.useRowMatchFinder, + dictMode); + ms->ldmSeqStore = NULL; + lastLLSize = blockCompressor(ms, &zc->seqStore, zc->blockState.nextCBlock->rep, src, srcSize); + } + { const BYTE* const lastLiterals = (const BYTE*)src + srcSize - lastLLSize; + ZSTD_storeLastLiterals(&zc->seqStore, lastLiterals, lastLLSize); + } } + return ZSTDbss_compress; +} + +static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc) +{ + const seqStore_t* seqStore = ZSTD_getSeqStore(zc); + const seqDef* seqStoreSeqs = seqStore->sequencesStart; + size_t seqStoreSeqSize = seqStore->sequences - seqStoreSeqs; + size_t seqStoreLiteralsSize = (size_t)(seqStore->lit - seqStore->litStart); + size_t literalsRead = 0; + size_t lastLLSize; + + ZSTD_Sequence* outSeqs = &zc->seqCollector.seqStart[zc->seqCollector.seqIndex]; + size_t i; + repcodes_t updatedRepcodes; + + assert(zc->seqCollector.seqIndex + 1 < zc->seqCollector.maxSequences); + /* Ensure we have enough space for last literals "sequence" */ + assert(zc->seqCollector.maxSequences >= seqStoreSeqSize + 1); + ZSTD_memcpy(updatedRepcodes.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t)); + for (i = 0; i < seqStoreSeqSize; ++i) { + U32 rawOffset = seqStoreSeqs[i].offBase - ZSTD_REP_NUM; + outSeqs[i].litLength = seqStoreSeqs[i].litLength; + outSeqs[i].matchLength = seqStoreSeqs[i].mlBase + MINMATCH; + outSeqs[i].rep = 0; + + if (i == seqStore->longLengthPos) { + if (seqStore->longLengthType == ZSTD_llt_literalLength) { + outSeqs[i].litLength += 0x10000; + } else if (seqStore->longLengthType == ZSTD_llt_matchLength) { + outSeqs[i].matchLength += 0x10000; + } + } + + if (seqStoreSeqs[i].offBase <= ZSTD_REP_NUM) { + /* Derive the correct offset corresponding to a repcode */ + outSeqs[i].rep = seqStoreSeqs[i].offBase; + if (outSeqs[i].litLength != 0) { + rawOffset = updatedRepcodes.rep[outSeqs[i].rep - 1]; + } else { + if (outSeqs[i].rep == 3) { + rawOffset = updatedRepcodes.rep[0] - 1; + } else { + rawOffset = updatedRepcodes.rep[outSeqs[i].rep]; + } + } + } + outSeqs[i].offset = rawOffset; + /* seqStoreSeqs[i].offset == offCode+1, and ZSTD_updateRep() expects offCode + so we provide seqStoreSeqs[i].offset - 1 */ + ZSTD_updateRep(updatedRepcodes.rep, + seqStoreSeqs[i].offBase, + seqStoreSeqs[i].litLength == 0); + literalsRead += outSeqs[i].litLength; + } + /* Insert last literals (if any exist) in the block as a sequence with ml == off == 0. + * If there are no last literals, then we'll emit (of: 0, ml: 0, ll: 0), which is a marker + * for the block boundary, according to the API. + */ + assert(seqStoreLiteralsSize >= literalsRead); + lastLLSize = seqStoreLiteralsSize - literalsRead; + outSeqs[i].litLength = (U32)lastLLSize; + outSeqs[i].matchLength = outSeqs[i].offset = outSeqs[i].rep = 0; + seqStoreSeqSize++; + zc->seqCollector.seqIndex += seqStoreSeqSize; +} + +size_t ZSTD_sequenceBound(size_t srcSize) { + return (srcSize / ZSTD_MINMATCH_MIN) + 1; +} + +size_t ZSTD_generateSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs, + size_t outSeqsSize, const void* src, size_t srcSize) +{ + const size_t dstCapacity = ZSTD_compressBound(srcSize); + void* dst = ZSTD_customMalloc(dstCapacity, ZSTD_defaultCMem); + SeqCollector seqCollector; + + RETURN_ERROR_IF(dst == NULL, memory_allocation, "NULL pointer!"); + + seqCollector.collectSequences = 1; + seqCollector.seqStart = outSeqs; + seqCollector.seqIndex = 0; + seqCollector.maxSequences = outSeqsSize; + zc->seqCollector = seqCollector; + + ZSTD_compress2(zc, dst, dstCapacity, src, srcSize); + ZSTD_customFree(dst, ZSTD_defaultCMem); + return zc->seqCollector.seqIndex; +} + +size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize) { + size_t in = 0; + size_t out = 0; + for (; in < seqsSize; ++in) { + if (sequences[in].offset == 0 && sequences[in].matchLength == 0) { + if (in != seqsSize - 1) { + sequences[in+1].litLength += sequences[in].litLength; + } + } else { + sequences[out] = sequences[in]; + ++out; + } + } + return out; +} + +/* Unrolled loop to read four size_ts of input at a time. Returns 1 if is RLE, 0 if not. */ +static int ZSTD_isRLE(const BYTE* src, size_t length) { + const BYTE* ip = src; + const BYTE value = ip[0]; + const size_t valueST = (size_t)((U64)value * 0x0101010101010101ULL); + const size_t unrollSize = sizeof(size_t) * 4; + const size_t unrollMask = unrollSize - 1; + const size_t prefixLength = length & unrollMask; + size_t i; + if (length == 1) return 1; + /* Check if prefix is RLE first before using unrolled loop */ + if (prefixLength && ZSTD_count(ip+1, ip, ip+prefixLength) != prefixLength-1) { + return 0; + } + for (i = prefixLength; i != length; i += unrollSize) { + size_t u; + for (u = 0; u < unrollSize; u += sizeof(size_t)) { + if (MEM_readST(ip + i + u) != valueST) { + return 0; + } } } + return 1; +} + +/* Returns true if the given block may be RLE. + * This is just a heuristic based on the compressibility. + * It may return both false positives and false negatives. + */ +static int ZSTD_maybeRLE(seqStore_t const* seqStore) +{ + size_t const nbSeqs = (size_t)(seqStore->sequences - seqStore->sequencesStart); + size_t const nbLits = (size_t)(seqStore->lit - seqStore->litStart); + + return nbSeqs < 4 && nbLits < 10; +} + +static void +ZSTD_blockState_confirmRepcodesAndEntropyTables(ZSTD_blockState_t* const bs) +{ + ZSTD_compressedBlockState_t* const tmp = bs->prevCBlock; + bs->prevCBlock = bs->nextCBlock; + bs->nextCBlock = tmp; +} + +/* Writes the block header */ +static void +writeBlockHeader(void* op, size_t cSize, size_t blockSize, U32 lastBlock) +{ + U32 const cBlockHeader = cSize == 1 ? + lastBlock + (((U32)bt_rle)<<1) + (U32)(blockSize << 3) : + lastBlock + (((U32)bt_compressed)<<1) + (U32)(cSize << 3); + MEM_writeLE24(op, cBlockHeader); + DEBUGLOG(3, "writeBlockHeader: cSize: %zu blockSize: %zu lastBlock: %u", cSize, blockSize, lastBlock); +} + +/** ZSTD_buildBlockEntropyStats_literals() : + * Builds entropy for the literals. + * Stores literals block type (raw, rle, compressed, repeat) and + * huffman description table to hufMetadata. + * Requires ENTROPY_WORKSPACE_SIZE workspace + * @return : size of huffman description table, or an error code + */ +static size_t +ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSize, + const ZSTD_hufCTables_t* prevHuf, + ZSTD_hufCTables_t* nextHuf, + ZSTD_hufCTablesMetadata_t* hufMetadata, + const int literalsCompressionIsDisabled, + void* workspace, size_t wkspSize, + int hufFlags) +{ + BYTE* const wkspStart = (BYTE*)workspace; + BYTE* const wkspEnd = wkspStart + wkspSize; + BYTE* const countWkspStart = wkspStart; + unsigned* const countWksp = (unsigned*)workspace; + const size_t countWkspSize = (HUF_SYMBOLVALUE_MAX + 1) * sizeof(unsigned); + BYTE* const nodeWksp = countWkspStart + countWkspSize; + const size_t nodeWkspSize = (size_t)(wkspEnd - nodeWksp); + unsigned maxSymbolValue = HUF_SYMBOLVALUE_MAX; + unsigned huffLog = LitHufLog; + HUF_repeat repeat = prevHuf->repeatMode; + DEBUGLOG(5, "ZSTD_buildBlockEntropyStats_literals (srcSize=%zu)", srcSize); + + /* Prepare nextEntropy assuming reusing the existing table */ + ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); + + if (literalsCompressionIsDisabled) { + DEBUGLOG(5, "set_basic - disabled"); + hufMetadata->hType = set_basic; + return 0; + } + + /* small ? don't even attempt compression (speed opt) */ +#ifndef COMPRESS_LITERALS_SIZE_MIN +# define COMPRESS_LITERALS_SIZE_MIN 63 /* heuristic */ +#endif + { size_t const minLitSize = (prevHuf->repeatMode == HUF_repeat_valid) ? 6 : COMPRESS_LITERALS_SIZE_MIN; + if (srcSize <= minLitSize) { + DEBUGLOG(5, "set_basic - too small"); + hufMetadata->hType = set_basic; + return 0; + } } + + /* Scan input and build symbol stats */ + { size_t const largest = + HIST_count_wksp (countWksp, &maxSymbolValue, + (const BYTE*)src, srcSize, + workspace, wkspSize); + FORWARD_IF_ERROR(largest, "HIST_count_wksp failed"); + if (largest == srcSize) { + /* only one literal symbol */ + DEBUGLOG(5, "set_rle"); + hufMetadata->hType = set_rle; + return 0; + } + if (largest <= (srcSize >> 7)+4) { + /* heuristic: likely not compressible */ + DEBUGLOG(5, "set_basic - no gain"); + hufMetadata->hType = set_basic; + return 0; + } } + + /* Validate the previous Huffman table */ + if (repeat == HUF_repeat_check + && !HUF_validateCTable((HUF_CElt const*)prevHuf->CTable, countWksp, maxSymbolValue)) { + repeat = HUF_repeat_none; + } + + /* Build Huffman Tree */ + ZSTD_memset(nextHuf->CTable, 0, sizeof(nextHuf->CTable)); + huffLog = HUF_optimalTableLog(huffLog, srcSize, maxSymbolValue, nodeWksp, nodeWkspSize, nextHuf->CTable, countWksp, hufFlags); + assert(huffLog <= LitHufLog); + { size_t const maxBits = HUF_buildCTable_wksp((HUF_CElt*)nextHuf->CTable, countWksp, + maxSymbolValue, huffLog, + nodeWksp, nodeWkspSize); + FORWARD_IF_ERROR(maxBits, "HUF_buildCTable_wksp"); + huffLog = (U32)maxBits; + } + { /* Build and write the CTable */ + size_t const newCSize = HUF_estimateCompressedSize( + (HUF_CElt*)nextHuf->CTable, countWksp, maxSymbolValue); + size_t const hSize = HUF_writeCTable_wksp( + hufMetadata->hufDesBuffer, sizeof(hufMetadata->hufDesBuffer), + (HUF_CElt*)nextHuf->CTable, maxSymbolValue, huffLog, + nodeWksp, nodeWkspSize); + /* Check against repeating the previous CTable */ + if (repeat != HUF_repeat_none) { + size_t const oldCSize = HUF_estimateCompressedSize( + (HUF_CElt const*)prevHuf->CTable, countWksp, maxSymbolValue); + if (oldCSize < srcSize && (oldCSize <= hSize + newCSize || hSize + 12 >= srcSize)) { + DEBUGLOG(5, "set_repeat - smaller"); + ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); + hufMetadata->hType = set_repeat; + return 0; + } } + if (newCSize + hSize >= srcSize) { + DEBUGLOG(5, "set_basic - no gains"); + ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); + hufMetadata->hType = set_basic; + return 0; + } + DEBUGLOG(5, "set_compressed (hSize=%u)", (U32)hSize); + hufMetadata->hType = set_compressed; + nextHuf->repeatMode = HUF_repeat_check; + return hSize; + } +} + + +/* ZSTD_buildDummySequencesStatistics(): + * Returns a ZSTD_symbolEncodingTypeStats_t with all encoding types as set_basic, + * and updates nextEntropy to the appropriate repeatMode. + */ +static ZSTD_symbolEncodingTypeStats_t +ZSTD_buildDummySequencesStatistics(ZSTD_fseCTables_t* nextEntropy) +{ + ZSTD_symbolEncodingTypeStats_t stats = {set_basic, set_basic, set_basic, 0, 0, 0}; + nextEntropy->litlength_repeatMode = FSE_repeat_none; + nextEntropy->offcode_repeatMode = FSE_repeat_none; + nextEntropy->matchlength_repeatMode = FSE_repeat_none; + return stats; +} + +/** ZSTD_buildBlockEntropyStats_sequences() : + * Builds entropy for the sequences. + * Stores symbol compression modes and fse table to fseMetadata. + * Requires ENTROPY_WORKSPACE_SIZE wksp. + * @return : size of fse tables or error code */ +static size_t +ZSTD_buildBlockEntropyStats_sequences( + const seqStore_t* seqStorePtr, + const ZSTD_fseCTables_t* prevEntropy, + ZSTD_fseCTables_t* nextEntropy, + const ZSTD_CCtx_params* cctxParams, + ZSTD_fseCTablesMetadata_t* fseMetadata, + void* workspace, size_t wkspSize) +{ + ZSTD_strategy const strategy = cctxParams->cParams.strategy; + size_t const nbSeq = (size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart); + BYTE* const ostart = fseMetadata->fseTablesBuffer; + BYTE* const oend = ostart + sizeof(fseMetadata->fseTablesBuffer); + BYTE* op = ostart; + unsigned* countWorkspace = (unsigned*)workspace; + unsigned* entropyWorkspace = countWorkspace + (MaxSeq + 1); + size_t entropyWorkspaceSize = wkspSize - (MaxSeq + 1) * sizeof(*countWorkspace); + ZSTD_symbolEncodingTypeStats_t stats; + + DEBUGLOG(5, "ZSTD_buildBlockEntropyStats_sequences (nbSeq=%zu)", nbSeq); + stats = nbSeq != 0 ? ZSTD_buildSequencesStatistics(seqStorePtr, nbSeq, + prevEntropy, nextEntropy, op, oend, + strategy, countWorkspace, + entropyWorkspace, entropyWorkspaceSize) + : ZSTD_buildDummySequencesStatistics(nextEntropy); + FORWARD_IF_ERROR(stats.size, "ZSTD_buildSequencesStatistics failed!"); + fseMetadata->llType = (symbolEncodingType_e) stats.LLtype; + fseMetadata->ofType = (symbolEncodingType_e) stats.Offtype; + fseMetadata->mlType = (symbolEncodingType_e) stats.MLtype; + fseMetadata->lastCountSize = stats.lastCountSize; + return stats.size; +} + + +/** ZSTD_buildBlockEntropyStats() : + * Builds entropy for the block. + * Requires workspace size ENTROPY_WORKSPACE_SIZE + * @return : 0 on success, or an error code + * Note : also employed in superblock + */ +size_t ZSTD_buildBlockEntropyStats( + const seqStore_t* seqStorePtr, + const ZSTD_entropyCTables_t* prevEntropy, + ZSTD_entropyCTables_t* nextEntropy, + const ZSTD_CCtx_params* cctxParams, + ZSTD_entropyCTablesMetadata_t* entropyMetadata, + void* workspace, size_t wkspSize) +{ + size_t const litSize = (size_t)(seqStorePtr->lit - seqStorePtr->litStart); + int const huf_useOptDepth = (cctxParams->cParams.strategy >= HUF_OPTIMAL_DEPTH_THRESHOLD); + int const hufFlags = huf_useOptDepth ? HUF_flags_optimalDepth : 0; + + entropyMetadata->hufMetadata.hufDesSize = + ZSTD_buildBlockEntropyStats_literals(seqStorePtr->litStart, litSize, + &prevEntropy->huf, &nextEntropy->huf, + &entropyMetadata->hufMetadata, + ZSTD_literalsCompressionIsDisabled(cctxParams), + workspace, wkspSize, hufFlags); + + FORWARD_IF_ERROR(entropyMetadata->hufMetadata.hufDesSize, "ZSTD_buildBlockEntropyStats_literals failed"); + entropyMetadata->fseMetadata.fseTablesSize = + ZSTD_buildBlockEntropyStats_sequences(seqStorePtr, + &prevEntropy->fse, &nextEntropy->fse, + cctxParams, + &entropyMetadata->fseMetadata, + workspace, wkspSize); + FORWARD_IF_ERROR(entropyMetadata->fseMetadata.fseTablesSize, "ZSTD_buildBlockEntropyStats_sequences failed"); + return 0; +} + +/* Returns the size estimate for the literals section (header + content) of a block */ +static size_t +ZSTD_estimateBlockSize_literal(const BYTE* literals, size_t litSize, + const ZSTD_hufCTables_t* huf, + const ZSTD_hufCTablesMetadata_t* hufMetadata, + void* workspace, size_t wkspSize, + int writeEntropy) +{ + unsigned* const countWksp = (unsigned*)workspace; + unsigned maxSymbolValue = HUF_SYMBOLVALUE_MAX; + size_t literalSectionHeaderSize = 3 + (litSize >= 1 KB) + (litSize >= 16 KB); + U32 singleStream = litSize < 256; + + if (hufMetadata->hType == set_basic) return litSize; + else if (hufMetadata->hType == set_rle) return 1; + else if (hufMetadata->hType == set_compressed || hufMetadata->hType == set_repeat) { + size_t const largest = HIST_count_wksp (countWksp, &maxSymbolValue, (const BYTE*)literals, litSize, workspace, wkspSize); + if (ZSTD_isError(largest)) return litSize; + { size_t cLitSizeEstimate = HUF_estimateCompressedSize((const HUF_CElt*)huf->CTable, countWksp, maxSymbolValue); + if (writeEntropy) cLitSizeEstimate += hufMetadata->hufDesSize; + if (!singleStream) cLitSizeEstimate += 6; /* multi-stream huffman uses 6-byte jump table */ + return cLitSizeEstimate + literalSectionHeaderSize; + } } + assert(0); /* impossible */ + return 0; +} + +/* Returns the size estimate for the FSE-compressed symbols (of, ml, ll) of a block */ +static size_t +ZSTD_estimateBlockSize_symbolType(symbolEncodingType_e type, + const BYTE* codeTable, size_t nbSeq, unsigned maxCode, + const FSE_CTable* fseCTable, + const U8* additionalBits, + short const* defaultNorm, U32 defaultNormLog, U32 defaultMax, + void* workspace, size_t wkspSize) +{ + unsigned* const countWksp = (unsigned*)workspace; + const BYTE* ctp = codeTable; + const BYTE* const ctStart = ctp; + const BYTE* const ctEnd = ctStart + nbSeq; + size_t cSymbolTypeSizeEstimateInBits = 0; + unsigned max = maxCode; + + HIST_countFast_wksp(countWksp, &max, codeTable, nbSeq, workspace, wkspSize); /* can't fail */ + if (type == set_basic) { + /* We selected this encoding type, so it must be valid. */ + assert(max <= defaultMax); + (void)defaultMax; + cSymbolTypeSizeEstimateInBits = ZSTD_crossEntropyCost(defaultNorm, defaultNormLog, countWksp, max); + } else if (type == set_rle) { + cSymbolTypeSizeEstimateInBits = 0; + } else if (type == set_compressed || type == set_repeat) { + cSymbolTypeSizeEstimateInBits = ZSTD_fseBitCost(fseCTable, countWksp, max); + } + if (ZSTD_isError(cSymbolTypeSizeEstimateInBits)) { + return nbSeq * 10; + } + while (ctp < ctEnd) { + if (additionalBits) cSymbolTypeSizeEstimateInBits += additionalBits[*ctp]; + else cSymbolTypeSizeEstimateInBits += *ctp; /* for offset, offset code is also the number of additional bits */ + ctp++; + } + return cSymbolTypeSizeEstimateInBits >> 3; +} + +/* Returns the size estimate for the sequences section (header + content) of a block */ +static size_t +ZSTD_estimateBlockSize_sequences(const BYTE* ofCodeTable, + const BYTE* llCodeTable, + const BYTE* mlCodeTable, + size_t nbSeq, + const ZSTD_fseCTables_t* fseTables, + const ZSTD_fseCTablesMetadata_t* fseMetadata, + void* workspace, size_t wkspSize, + int writeEntropy) +{ + size_t sequencesSectionHeaderSize = 1 /* seqHead */ + 1 /* min seqSize size */ + (nbSeq >= 128) + (nbSeq >= LONGNBSEQ); + size_t cSeqSizeEstimate = 0; + cSeqSizeEstimate += ZSTD_estimateBlockSize_symbolType(fseMetadata->ofType, ofCodeTable, nbSeq, MaxOff, + fseTables->offcodeCTable, NULL, + OF_defaultNorm, OF_defaultNormLog, DefaultMaxOff, + workspace, wkspSize); + cSeqSizeEstimate += ZSTD_estimateBlockSize_symbolType(fseMetadata->llType, llCodeTable, nbSeq, MaxLL, + fseTables->litlengthCTable, LL_bits, + LL_defaultNorm, LL_defaultNormLog, MaxLL, + workspace, wkspSize); + cSeqSizeEstimate += ZSTD_estimateBlockSize_symbolType(fseMetadata->mlType, mlCodeTable, nbSeq, MaxML, + fseTables->matchlengthCTable, ML_bits, + ML_defaultNorm, ML_defaultNormLog, MaxML, + workspace, wkspSize); + if (writeEntropy) cSeqSizeEstimate += fseMetadata->fseTablesSize; + return cSeqSizeEstimate + sequencesSectionHeaderSize; +} + +/* Returns the size estimate for a given stream of literals, of, ll, ml */ +static size_t +ZSTD_estimateBlockSize(const BYTE* literals, size_t litSize, + const BYTE* ofCodeTable, + const BYTE* llCodeTable, + const BYTE* mlCodeTable, + size_t nbSeq, + const ZSTD_entropyCTables_t* entropy, + const ZSTD_entropyCTablesMetadata_t* entropyMetadata, + void* workspace, size_t wkspSize, + int writeLitEntropy, int writeSeqEntropy) +{ + size_t const literalsSize = ZSTD_estimateBlockSize_literal(literals, litSize, + &entropy->huf, &entropyMetadata->hufMetadata, + workspace, wkspSize, writeLitEntropy); + size_t const seqSize = ZSTD_estimateBlockSize_sequences(ofCodeTable, llCodeTable, mlCodeTable, + nbSeq, &entropy->fse, &entropyMetadata->fseMetadata, + workspace, wkspSize, writeSeqEntropy); + return seqSize + literalsSize + ZSTD_blockHeaderSize; +} + +/* Builds entropy statistics and uses them for blocksize estimation. + * + * @return: estimated compressed size of the seqStore, or a zstd error. + */ +static size_t +ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(seqStore_t* seqStore, ZSTD_CCtx* zc) +{ + ZSTD_entropyCTablesMetadata_t* const entropyMetadata = &zc->blockSplitCtx.entropyMetadata; + DEBUGLOG(6, "ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize()"); + FORWARD_IF_ERROR(ZSTD_buildBlockEntropyStats(seqStore, + &zc->blockState.prevCBlock->entropy, + &zc->blockState.nextCBlock->entropy, + &zc->appliedParams, + entropyMetadata, + zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE), ""); + return ZSTD_estimateBlockSize( + seqStore->litStart, (size_t)(seqStore->lit - seqStore->litStart), + seqStore->ofCode, seqStore->llCode, seqStore->mlCode, + (size_t)(seqStore->sequences - seqStore->sequencesStart), + &zc->blockState.nextCBlock->entropy, + entropyMetadata, + zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE, + (int)(entropyMetadata->hufMetadata.hType == set_compressed), 1); +} + +/* Returns literals bytes represented in a seqStore */ +static size_t ZSTD_countSeqStoreLiteralsBytes(const seqStore_t* const seqStore) +{ + size_t literalsBytes = 0; + size_t const nbSeqs = (size_t)(seqStore->sequences - seqStore->sequencesStart); + size_t i; + for (i = 0; i < nbSeqs; ++i) { + seqDef const seq = seqStore->sequencesStart[i]; + literalsBytes += seq.litLength; + if (i == seqStore->longLengthPos && seqStore->longLengthType == ZSTD_llt_literalLength) { + literalsBytes += 0x10000; + } } + return literalsBytes; +} + +/* Returns match bytes represented in a seqStore */ +static size_t ZSTD_countSeqStoreMatchBytes(const seqStore_t* const seqStore) +{ + size_t matchBytes = 0; + size_t const nbSeqs = (size_t)(seqStore->sequences - seqStore->sequencesStart); + size_t i; + for (i = 0; i < nbSeqs; ++i) { + seqDef seq = seqStore->sequencesStart[i]; + matchBytes += seq.mlBase + MINMATCH; + if (i == seqStore->longLengthPos && seqStore->longLengthType == ZSTD_llt_matchLength) { + matchBytes += 0x10000; + } } + return matchBytes; +} + +/* Derives the seqStore that is a chunk of the originalSeqStore from [startIdx, endIdx). + * Stores the result in resultSeqStore. + */ +static void ZSTD_deriveSeqStoreChunk(seqStore_t* resultSeqStore, + const seqStore_t* originalSeqStore, + size_t startIdx, size_t endIdx) +{ + *resultSeqStore = *originalSeqStore; + if (startIdx > 0) { + resultSeqStore->sequences = originalSeqStore->sequencesStart + startIdx; + resultSeqStore->litStart += ZSTD_countSeqStoreLiteralsBytes(resultSeqStore); + } + + /* Move longLengthPos into the correct position if necessary */ + if (originalSeqStore->longLengthType != ZSTD_llt_none) { + if (originalSeqStore->longLengthPos < startIdx || originalSeqStore->longLengthPos > endIdx) { + resultSeqStore->longLengthType = ZSTD_llt_none; + } else { + resultSeqStore->longLengthPos -= (U32)startIdx; + } + } + resultSeqStore->sequencesStart = originalSeqStore->sequencesStart + startIdx; + resultSeqStore->sequences = originalSeqStore->sequencesStart + endIdx; + if (endIdx == (size_t)(originalSeqStore->sequences - originalSeqStore->sequencesStart)) { + /* This accounts for possible last literals if the derived chunk reaches the end of the block */ + assert(resultSeqStore->lit == originalSeqStore->lit); + } else { + size_t const literalsBytes = ZSTD_countSeqStoreLiteralsBytes(resultSeqStore); + resultSeqStore->lit = resultSeqStore->litStart + literalsBytes; + } + resultSeqStore->llCode += startIdx; + resultSeqStore->mlCode += startIdx; + resultSeqStore->ofCode += startIdx; +} + +/** + * Returns the raw offset represented by the combination of offBase, ll0, and repcode history. + * offBase must represent a repcode in the numeric representation of ZSTD_storeSeq(). + */ +static U32 +ZSTD_resolveRepcodeToRawOffset(const U32 rep[ZSTD_REP_NUM], const U32 offBase, const U32 ll0) +{ + U32 const adjustedRepCode = OFFBASE_TO_REPCODE(offBase) - 1 + ll0; /* [ 0 - 3 ] */ + assert(OFFBASE_IS_REPCODE(offBase)); + if (adjustedRepCode == ZSTD_REP_NUM) { + assert(ll0); + /* litlength == 0 and offCode == 2 implies selection of first repcode - 1 + * This is only valid if it results in a valid offset value, aka > 0. + * Note : it may happen that `rep[0]==1` in exceptional circumstances. + * In which case this function will return 0, which is an invalid offset. + * It's not an issue though, since this value will be + * compared and discarded within ZSTD_seqStore_resolveOffCodes(). + */ + return rep[0] - 1; + } + return rep[adjustedRepCode]; +} + +/** + * ZSTD_seqStore_resolveOffCodes() reconciles any possible divergences in offset history that may arise + * due to emission of RLE/raw blocks that disturb the offset history, + * and replaces any repcodes within the seqStore that may be invalid. + * + * dRepcodes are updated as would be on the decompression side. + * cRepcodes are updated exactly in accordance with the seqStore. + * + * Note : this function assumes seq->offBase respects the following numbering scheme : + * 0 : invalid + * 1-3 : repcode 1-3 + * 4+ : real_offset+3 + */ +static void +ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_t* const cRepcodes, + const seqStore_t* const seqStore, U32 const nbSeq) +{ + U32 idx = 0; + U32 const longLitLenIdx = seqStore->longLengthType == ZSTD_llt_literalLength ? seqStore->longLengthPos : nbSeq; + for (; idx < nbSeq; ++idx) { + seqDef* const seq = seqStore->sequencesStart + idx; + U32 const ll0 = (seq->litLength == 0) && (idx != longLitLenIdx); + U32 const offBase = seq->offBase; + assert(offBase > 0); + if (OFFBASE_IS_REPCODE(offBase)) { + U32 const dRawOffset = ZSTD_resolveRepcodeToRawOffset(dRepcodes->rep, offBase, ll0); + U32 const cRawOffset = ZSTD_resolveRepcodeToRawOffset(cRepcodes->rep, offBase, ll0); + /* Adjust simulated decompression repcode history if we come across a mismatch. Replace + * the repcode with the offset it actually references, determined by the compression + * repcode history. + */ + if (dRawOffset != cRawOffset) { + seq->offBase = OFFSET_TO_OFFBASE(cRawOffset); + } + } + /* Compression repcode history is always updated with values directly from the unmodified seqStore. + * Decompression repcode history may use modified seq->offset value taken from compression repcode history. + */ + ZSTD_updateRep(dRepcodes->rep, seq->offBase, ll0); + ZSTD_updateRep(cRepcodes->rep, offBase, ll0); + } +} + +/* ZSTD_compressSeqStore_singleBlock(): + * Compresses a seqStore into a block with a block header, into the buffer dst. + * + * Returns the total size of that block (including header) or a ZSTD error code. + */ +static size_t +ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, + const seqStore_t* const seqStore, + repcodes_t* const dRep, repcodes_t* const cRep, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + U32 lastBlock, U32 isPartition) +{ + const U32 rleMaxLength = 25; + BYTE* op = (BYTE*)dst; + const BYTE* ip = (const BYTE*)src; + size_t cSize; + size_t cSeqsSize; + + /* In case of an RLE or raw block, the simulated decompression repcode history must be reset */ + repcodes_t const dRepOriginal = *dRep; + DEBUGLOG(5, "ZSTD_compressSeqStore_singleBlock"); + if (isPartition) + ZSTD_seqStore_resolveOffCodes(dRep, cRep, seqStore, (U32)(seqStore->sequences - seqStore->sequencesStart)); + + RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize, dstSize_tooSmall, "Block header doesn't fit"); + cSeqsSize = ZSTD_entropyCompressSeqStore(seqStore, + &zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy, + &zc->appliedParams, + op + ZSTD_blockHeaderSize, dstCapacity - ZSTD_blockHeaderSize, + srcSize, + zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */, + zc->bmi2); + FORWARD_IF_ERROR(cSeqsSize, "ZSTD_entropyCompressSeqStore failed!"); + + if (!zc->isFirstBlock && + cSeqsSize < rleMaxLength && + ZSTD_isRLE((BYTE const*)src, srcSize)) { + /* We don't want to emit our first block as a RLE even if it qualifies because + * doing so will cause the decoder (cli only) to throw a "should consume all input error." + * This is only an issue for zstd <= v1.4.3 + */ + cSeqsSize = 1; + } + + if (zc->seqCollector.collectSequences) { + ZSTD_copyBlockSequences(zc); + ZSTD_blockState_confirmRepcodesAndEntropyTables(&zc->blockState); + return 0; + } + + if (cSeqsSize == 0) { + cSize = ZSTD_noCompressBlock(op, dstCapacity, ip, srcSize, lastBlock); + FORWARD_IF_ERROR(cSize, "Nocompress block failed"); + DEBUGLOG(4, "Writing out nocompress block, size: %zu", cSize); + *dRep = dRepOriginal; /* reset simulated decompression repcode history */ + } else if (cSeqsSize == 1) { + cSize = ZSTD_rleCompressBlock(op, dstCapacity, *ip, srcSize, lastBlock); + FORWARD_IF_ERROR(cSize, "RLE compress block failed"); + DEBUGLOG(4, "Writing out RLE block, size: %zu", cSize); + *dRep = dRepOriginal; /* reset simulated decompression repcode history */ + } else { + ZSTD_blockState_confirmRepcodesAndEntropyTables(&zc->blockState); + writeBlockHeader(op, cSeqsSize, srcSize, lastBlock); + cSize = ZSTD_blockHeaderSize + cSeqsSize; + DEBUGLOG(4, "Writing out compressed block, size: %zu", cSize); + } + + if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid) + zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check; + + return cSize; +} + +/* Struct to keep track of where we are in our recursive calls. */ +typedef struct { + U32* splitLocations; /* Array of split indices */ + size_t idx; /* The current index within splitLocations being worked on */ +} seqStoreSplits; + +#define MIN_SEQUENCES_BLOCK_SPLITTING 300 + +/* Helper function to perform the recursive search for block splits. + * Estimates the cost of seqStore prior to split, and estimates the cost of splitting the sequences in half. + * If advantageous to split, then we recurse down the two sub-blocks. + * If not, or if an error occurred in estimation, then we do not recurse. + * + * Note: The recursion depth is capped by a heuristic minimum number of sequences, + * defined by MIN_SEQUENCES_BLOCK_SPLITTING. + * In theory, this means the absolute largest recursion depth is 10 == log2(maxNbSeqInBlock/MIN_SEQUENCES_BLOCK_SPLITTING). + * In practice, recursion depth usually doesn't go beyond 4. + * + * Furthermore, the number of splits is capped by ZSTD_MAX_NB_BLOCK_SPLITS. + * At ZSTD_MAX_NB_BLOCK_SPLITS == 196 with the current existing blockSize + * maximum of 128 KB, this value is actually impossible to reach. + */ +static void +ZSTD_deriveBlockSplitsHelper(seqStoreSplits* splits, size_t startIdx, size_t endIdx, + ZSTD_CCtx* zc, const seqStore_t* origSeqStore) +{ + seqStore_t* const fullSeqStoreChunk = &zc->blockSplitCtx.fullSeqStoreChunk; + seqStore_t* const firstHalfSeqStore = &zc->blockSplitCtx.firstHalfSeqStore; + seqStore_t* const secondHalfSeqStore = &zc->blockSplitCtx.secondHalfSeqStore; + size_t estimatedOriginalSize; + size_t estimatedFirstHalfSize; + size_t estimatedSecondHalfSize; + size_t midIdx = (startIdx + endIdx)/2; + + DEBUGLOG(5, "ZSTD_deriveBlockSplitsHelper: startIdx=%zu endIdx=%zu", startIdx, endIdx); + assert(endIdx >= startIdx); + if (endIdx - startIdx < MIN_SEQUENCES_BLOCK_SPLITTING || splits->idx >= ZSTD_MAX_NB_BLOCK_SPLITS) { + DEBUGLOG(6, "ZSTD_deriveBlockSplitsHelper: Too few sequences (%zu)", endIdx - startIdx); + return; + } + ZSTD_deriveSeqStoreChunk(fullSeqStoreChunk, origSeqStore, startIdx, endIdx); + ZSTD_deriveSeqStoreChunk(firstHalfSeqStore, origSeqStore, startIdx, midIdx); + ZSTD_deriveSeqStoreChunk(secondHalfSeqStore, origSeqStore, midIdx, endIdx); + estimatedOriginalSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(fullSeqStoreChunk, zc); + estimatedFirstHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(firstHalfSeqStore, zc); + estimatedSecondHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(secondHalfSeqStore, zc); + DEBUGLOG(5, "Estimated original block size: %zu -- First half split: %zu -- Second half split: %zu", + estimatedOriginalSize, estimatedFirstHalfSize, estimatedSecondHalfSize); + if (ZSTD_isError(estimatedOriginalSize) || ZSTD_isError(estimatedFirstHalfSize) || ZSTD_isError(estimatedSecondHalfSize)) { + return; + } + if (estimatedFirstHalfSize + estimatedSecondHalfSize < estimatedOriginalSize) { + DEBUGLOG(5, "split decided at seqNb:%zu", midIdx); + ZSTD_deriveBlockSplitsHelper(splits, startIdx, midIdx, zc, origSeqStore); + splits->splitLocations[splits->idx] = (U32)midIdx; + splits->idx++; + ZSTD_deriveBlockSplitsHelper(splits, midIdx, endIdx, zc, origSeqStore); + } +} + +/* Base recursive function. + * Populates a table with intra-block partition indices that can improve compression ratio. + * + * @return: number of splits made (which equals the size of the partition table - 1). + */ +static size_t ZSTD_deriveBlockSplits(ZSTD_CCtx* zc, U32 partitions[], U32 nbSeq) +{ + seqStoreSplits splits; + splits.splitLocations = partitions; + splits.idx = 0; + if (nbSeq <= 4) { + DEBUGLOG(5, "ZSTD_deriveBlockSplits: Too few sequences to split (%u <= 4)", nbSeq); + /* Refuse to try and split anything with less than 4 sequences */ + return 0; + } + ZSTD_deriveBlockSplitsHelper(&splits, 0, nbSeq, zc, &zc->seqStore); + splits.splitLocations[splits.idx] = nbSeq; + DEBUGLOG(5, "ZSTD_deriveBlockSplits: final nb partitions: %zu", splits.idx+1); + return splits.idx; +} + +/* ZSTD_compressBlock_splitBlock(): + * Attempts to split a given block into multiple blocks to improve compression ratio. + * + * Returns combined size of all blocks (which includes headers), or a ZSTD error code. + */ +static size_t +ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + const void* src, size_t blockSize, + U32 lastBlock, U32 nbSeq) +{ + size_t cSize = 0; + const BYTE* ip = (const BYTE*)src; + BYTE* op = (BYTE*)dst; + size_t i = 0; + size_t srcBytesTotal = 0; + U32* const partitions = zc->blockSplitCtx.partitions; /* size == ZSTD_MAX_NB_BLOCK_SPLITS */ + seqStore_t* const nextSeqStore = &zc->blockSplitCtx.nextSeqStore; + seqStore_t* const currSeqStore = &zc->blockSplitCtx.currSeqStore; + size_t const numSplits = ZSTD_deriveBlockSplits(zc, partitions, nbSeq); + + /* If a block is split and some partitions are emitted as RLE/uncompressed, then repcode history + * may become invalid. In order to reconcile potentially invalid repcodes, we keep track of two + * separate repcode histories that simulate repcode history on compression and decompression side, + * and use the histories to determine whether we must replace a particular repcode with its raw offset. + * + * 1) cRep gets updated for each partition, regardless of whether the block was emitted as uncompressed + * or RLE. This allows us to retrieve the offset value that an invalid repcode references within + * a nocompress/RLE block. + * 2) dRep gets updated only for compressed partitions, and when a repcode gets replaced, will use + * the replacement offset value rather than the original repcode to update the repcode history. + * dRep also will be the final repcode history sent to the next block. + * + * See ZSTD_seqStore_resolveOffCodes() for more details. + */ + repcodes_t dRep; + repcodes_t cRep; + ZSTD_memcpy(dRep.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t)); + ZSTD_memcpy(cRep.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t)); + ZSTD_memset(nextSeqStore, 0, sizeof(seqStore_t)); + + DEBUGLOG(5, "ZSTD_compressBlock_splitBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)", + (unsigned)dstCapacity, (unsigned)zc->blockState.matchState.window.dictLimit, + (unsigned)zc->blockState.matchState.nextToUpdate); + + if (numSplits == 0) { + size_t cSizeSingleBlock = + ZSTD_compressSeqStore_singleBlock(zc, &zc->seqStore, + &dRep, &cRep, + op, dstCapacity, + ip, blockSize, + lastBlock, 0 /* isPartition */); + FORWARD_IF_ERROR(cSizeSingleBlock, "Compressing single block from splitBlock_internal() failed!"); + DEBUGLOG(5, "ZSTD_compressBlock_splitBlock_internal: No splits"); + assert(zc->blockSize <= ZSTD_BLOCKSIZE_MAX); + assert(cSizeSingleBlock <= zc->blockSize + ZSTD_blockHeaderSize); + return cSizeSingleBlock; + } + + ZSTD_deriveSeqStoreChunk(currSeqStore, &zc->seqStore, 0, partitions[0]); + for (i = 0; i <= numSplits; ++i) { + size_t cSizeChunk; + U32 const lastPartition = (i == numSplits); + U32 lastBlockEntireSrc = 0; + + size_t srcBytes = ZSTD_countSeqStoreLiteralsBytes(currSeqStore) + ZSTD_countSeqStoreMatchBytes(currSeqStore); + srcBytesTotal += srcBytes; + if (lastPartition) { + /* This is the final partition, need to account for possible last literals */ + srcBytes += blockSize - srcBytesTotal; + lastBlockEntireSrc = lastBlock; + } else { + ZSTD_deriveSeqStoreChunk(nextSeqStore, &zc->seqStore, partitions[i], partitions[i+1]); + } + + cSizeChunk = ZSTD_compressSeqStore_singleBlock(zc, currSeqStore, + &dRep, &cRep, + op, dstCapacity, + ip, srcBytes, + lastBlockEntireSrc, 1 /* isPartition */); + DEBUGLOG(5, "Estimated size: %zu vs %zu : actual size", + ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(currSeqStore, zc), cSizeChunk); + FORWARD_IF_ERROR(cSizeChunk, "Compressing chunk failed!"); + + ip += srcBytes; + op += cSizeChunk; + dstCapacity -= cSizeChunk; + cSize += cSizeChunk; + *currSeqStore = *nextSeqStore; + assert(cSizeChunk <= zc->blockSize + ZSTD_blockHeaderSize); + } + /* cRep and dRep may have diverged during the compression. + * If so, we use the dRep repcodes for the next block. + */ + ZSTD_memcpy(zc->blockState.prevCBlock->rep, dRep.rep, sizeof(repcodes_t)); + return cSize; +} + +static size_t +ZSTD_compressBlock_splitBlock(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, U32 lastBlock) +{ + U32 nbSeq; + size_t cSize; + DEBUGLOG(4, "ZSTD_compressBlock_splitBlock"); + assert(zc->appliedParams.useBlockSplitter == ZSTD_ps_enable); + + { const size_t bss = ZSTD_buildSeqStore(zc, src, srcSize); + FORWARD_IF_ERROR(bss, "ZSTD_buildSeqStore failed"); + if (bss == ZSTDbss_noCompress) { + if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid) + zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check; + cSize = ZSTD_noCompressBlock(dst, dstCapacity, src, srcSize, lastBlock); + FORWARD_IF_ERROR(cSize, "ZSTD_noCompressBlock failed"); + DEBUGLOG(4, "ZSTD_compressBlock_splitBlock: Nocompress block"); + return cSize; + } + nbSeq = (U32)(zc->seqStore.sequences - zc->seqStore.sequencesStart); + } + + cSize = ZSTD_compressBlock_splitBlock_internal(zc, dst, dstCapacity, src, srcSize, lastBlock, nbSeq); + FORWARD_IF_ERROR(cSize, "Splitting blocks failed!"); + return cSize; +} + +static size_t +ZSTD_compressBlock_internal(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, U32 frame) +{ + /* This is an estimated upper bound for the length of an rle block. + * This isn't the actual upper bound. + * Finding the real threshold needs further investigation. + */ + const U32 rleMaxLength = 25; + size_t cSize; + const BYTE* ip = (const BYTE*)src; + BYTE* op = (BYTE*)dst; + DEBUGLOG(5, "ZSTD_compressBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)", + (unsigned)dstCapacity, (unsigned)zc->blockState.matchState.window.dictLimit, + (unsigned)zc->blockState.matchState.nextToUpdate); + + { const size_t bss = ZSTD_buildSeqStore(zc, src, srcSize); + FORWARD_IF_ERROR(bss, "ZSTD_buildSeqStore failed"); + if (bss == ZSTDbss_noCompress) { cSize = 0; goto out; } + } + + if (zc->seqCollector.collectSequences) { + ZSTD_copyBlockSequences(zc); + ZSTD_blockState_confirmRepcodesAndEntropyTables(&zc->blockState); + return 0; + } + + /* encode sequences and literals */ + cSize = ZSTD_entropyCompressSeqStore(&zc->seqStore, + &zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy, + &zc->appliedParams, + dst, dstCapacity, + srcSize, + zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */, + zc->bmi2); + + if (frame && + /* We don't want to emit our first block as a RLE even if it qualifies because + * doing so will cause the decoder (cli only) to throw a "should consume all input error." + * This is only an issue for zstd <= v1.4.3 + */ + !zc->isFirstBlock && + cSize < rleMaxLength && + ZSTD_isRLE(ip, srcSize)) + { + cSize = 1; + op[0] = ip[0]; + } + +out: + if (!ZSTD_isError(cSize) && cSize > 1) { + ZSTD_blockState_confirmRepcodesAndEntropyTables(&zc->blockState); + } + /* We check that dictionaries have offset codes available for the first + * block. After the first block, the offcode table might not have large + * enough codes to represent the offsets in the data. + */ + if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid) + zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check; + + return cSize; +} + +static size_t ZSTD_compressBlock_targetCBlockSize_body(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const size_t bss, U32 lastBlock) +{ + DEBUGLOG(6, "Attempting ZSTD_compressSuperBlock()"); + if (bss == ZSTDbss_compress) { + if (/* We don't want to emit our first block as a RLE even if it qualifies because + * doing so will cause the decoder (cli only) to throw a "should consume all input error." + * This is only an issue for zstd <= v1.4.3 + */ + !zc->isFirstBlock && + ZSTD_maybeRLE(&zc->seqStore) && + ZSTD_isRLE((BYTE const*)src, srcSize)) + { + return ZSTD_rleCompressBlock(dst, dstCapacity, *(BYTE const*)src, srcSize, lastBlock); + } + /* Attempt superblock compression. + * + * Note that compressed size of ZSTD_compressSuperBlock() is not bound by the + * standard ZSTD_compressBound(). This is a problem, because even if we have + * space now, taking an extra byte now could cause us to run out of space later + * and violate ZSTD_compressBound(). + * + * Define blockBound(blockSize) = blockSize + ZSTD_blockHeaderSize. + * + * In order to respect ZSTD_compressBound() we must attempt to emit a raw + * uncompressed block in these cases: + * * cSize == 0: Return code for an uncompressed block. + * * cSize == dstSize_tooSmall: We may have expanded beyond blockBound(srcSize). + * ZSTD_noCompressBlock() will return dstSize_tooSmall if we are really out of + * output space. + * * cSize >= blockBound(srcSize): We have expanded the block too much so + * emit an uncompressed block. + */ + { size_t const cSize = + ZSTD_compressSuperBlock(zc, dst, dstCapacity, src, srcSize, lastBlock); + if (cSize != ERROR(dstSize_tooSmall)) { + size_t const maxCSize = + srcSize - ZSTD_minGain(srcSize, zc->appliedParams.cParams.strategy); + FORWARD_IF_ERROR(cSize, "ZSTD_compressSuperBlock failed"); + if (cSize != 0 && cSize < maxCSize + ZSTD_blockHeaderSize) { + ZSTD_blockState_confirmRepcodesAndEntropyTables(&zc->blockState); + return cSize; + } + } + } + } /* if (bss == ZSTDbss_compress)*/ + + DEBUGLOG(6, "Resorting to ZSTD_noCompressBlock()"); + /* Superblock compression failed, attempt to emit a single no compress block. + * The decoder will be able to stream this block since it is uncompressed. + */ + return ZSTD_noCompressBlock(dst, dstCapacity, src, srcSize, lastBlock); +} + +static size_t ZSTD_compressBlock_targetCBlockSize(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + U32 lastBlock) +{ + size_t cSize = 0; + const size_t bss = ZSTD_buildSeqStore(zc, src, srcSize); + DEBUGLOG(5, "ZSTD_compressBlock_targetCBlockSize (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u, srcSize=%zu)", + (unsigned)dstCapacity, (unsigned)zc->blockState.matchState.window.dictLimit, (unsigned)zc->blockState.matchState.nextToUpdate, srcSize); + FORWARD_IF_ERROR(bss, "ZSTD_buildSeqStore failed"); + + cSize = ZSTD_compressBlock_targetCBlockSize_body(zc, dst, dstCapacity, src, srcSize, bss, lastBlock); + FORWARD_IF_ERROR(cSize, "ZSTD_compressBlock_targetCBlockSize_body failed"); + + if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid) + zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check; + + return cSize; +} + +static void ZSTD_overflowCorrectIfNeeded(ZSTD_matchState_t* ms, + ZSTD_cwksp* ws, + ZSTD_CCtx_params const* params, + void const* ip, + void const* iend) +{ + U32 const cycleLog = ZSTD_cycleLog(params->cParams.chainLog, params->cParams.strategy); + U32 const maxDist = (U32)1 << params->cParams.windowLog; + if (ZSTD_window_needOverflowCorrection(ms->window, cycleLog, maxDist, ms->loadedDictEnd, ip, iend)) { + U32 const correction = ZSTD_window_correctOverflow(&ms->window, cycleLog, maxDist, ip); + ZSTD_STATIC_ASSERT(ZSTD_CHAINLOG_MAX <= 30); + ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX_32 <= 30); + ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31); + ZSTD_cwksp_mark_tables_dirty(ws); + ZSTD_reduceIndex(ms, params, correction); + ZSTD_cwksp_mark_tables_clean(ws); + if (ms->nextToUpdate < correction) ms->nextToUpdate = 0; + else ms->nextToUpdate -= correction; + /* invalidate dictionaries on overflow correction */ + ms->loadedDictEnd = 0; + ms->dictMatchState = NULL; + } +} + +/*! ZSTD_compress_frameChunk() : +* Compress a chunk of data into one or multiple blocks. +* All blocks will be terminated, all input will be consumed. +* Function will issue an error if there is not enough `dstCapacity` to hold the compressed content. +* Frame is supposed already started (header already produced) +* @return : compressed size, or an error code +*/ +static size_t ZSTD_compress_frameChunk(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + U32 lastFrameChunk) +{ + size_t blockSize = cctx->blockSize; + size_t remaining = srcSize; + const BYTE* ip = (const BYTE*)src; + BYTE* const ostart = (BYTE*)dst; + BYTE* op = ostart; + U32 const maxDist = (U32)1 << cctx->appliedParams.cParams.windowLog; + + assert(cctx->appliedParams.cParams.windowLog <= ZSTD_WINDOWLOG_MAX); + + DEBUGLOG(4, "ZSTD_compress_frameChunk (blockSize=%u)", (unsigned)blockSize); + if (cctx->appliedParams.fParams.checksumFlag && srcSize) + XXH64_update(&cctx->xxhState, src, srcSize); + + while (remaining) { + ZSTD_matchState_t* const ms = &cctx->blockState.matchState; + U32 const lastBlock = lastFrameChunk & (blockSize >= remaining); + + /* TODO: See 3090. We reduced MIN_CBLOCK_SIZE from 3 to 2 so to compensate we are adding + * additional 1. We need to revisit and change this logic to be more consistent */ + RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize + MIN_CBLOCK_SIZE + 1, + dstSize_tooSmall, + "not enough space to store compressed block"); + if (remaining < blockSize) blockSize = remaining; + + ZSTD_overflowCorrectIfNeeded( + ms, &cctx->workspace, &cctx->appliedParams, ip, ip + blockSize); + ZSTD_checkDictValidity(&ms->window, ip + blockSize, maxDist, &ms->loadedDictEnd, &ms->dictMatchState); + ZSTD_window_enforceMaxDist(&ms->window, ip, maxDist, &ms->loadedDictEnd, &ms->dictMatchState); + + /* Ensure hash/chain table insertion resumes no sooner than lowlimit */ + if (ms->nextToUpdate < ms->window.lowLimit) ms->nextToUpdate = ms->window.lowLimit; + + { size_t cSize; + if (ZSTD_useTargetCBlockSize(&cctx->appliedParams)) { + cSize = ZSTD_compressBlock_targetCBlockSize(cctx, op, dstCapacity, ip, blockSize, lastBlock); + FORWARD_IF_ERROR(cSize, "ZSTD_compressBlock_targetCBlockSize failed"); + assert(cSize > 0); + assert(cSize <= blockSize + ZSTD_blockHeaderSize); + } else if (ZSTD_blockSplitterEnabled(&cctx->appliedParams)) { + cSize = ZSTD_compressBlock_splitBlock(cctx, op, dstCapacity, ip, blockSize, lastBlock); + FORWARD_IF_ERROR(cSize, "ZSTD_compressBlock_splitBlock failed"); + assert(cSize > 0 || cctx->seqCollector.collectSequences == 1); + } else { + cSize = ZSTD_compressBlock_internal(cctx, + op+ZSTD_blockHeaderSize, dstCapacity-ZSTD_blockHeaderSize, + ip, blockSize, 1 /* frame */); + FORWARD_IF_ERROR(cSize, "ZSTD_compressBlock_internal failed"); + + if (cSize == 0) { /* block is not compressible */ + cSize = ZSTD_noCompressBlock(op, dstCapacity, ip, blockSize, lastBlock); + FORWARD_IF_ERROR(cSize, "ZSTD_noCompressBlock failed"); + } else { + U32 const cBlockHeader = cSize == 1 ? + lastBlock + (((U32)bt_rle)<<1) + (U32)(blockSize << 3) : + lastBlock + (((U32)bt_compressed)<<1) + (U32)(cSize << 3); + MEM_writeLE24(op, cBlockHeader); + cSize += ZSTD_blockHeaderSize; + } + } /* if (ZSTD_useTargetCBlockSize(&cctx->appliedParams))*/ + + + ip += blockSize; + assert(remaining >= blockSize); + remaining -= blockSize; + op += cSize; + assert(dstCapacity >= cSize); + dstCapacity -= cSize; + cctx->isFirstBlock = 0; + DEBUGLOG(5, "ZSTD_compress_frameChunk: adding a block of size %u", + (unsigned)cSize); + } } + + if (lastFrameChunk && (op>ostart)) cctx->stage = ZSTDcs_ending; + return (size_t)(op-ostart); +} + + +static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity, + const ZSTD_CCtx_params* params, U64 pledgedSrcSize, U32 dictID) +{ BYTE* const op = (BYTE*)dst; + U32 const dictIDSizeCodeLength = (dictID>0) + (dictID>=256) + (dictID>=65536); /* 0-3 */ + U32 const dictIDSizeCode = params->fParams.noDictIDFlag ? 0 : dictIDSizeCodeLength; /* 0-3 */ + U32 const checksumFlag = params->fParams.checksumFlag>0; + U32 const windowSize = (U32)1 << params->cParams.windowLog; + U32 const singleSegment = params->fParams.contentSizeFlag && (windowSize >= pledgedSrcSize); + BYTE const windowLogByte = (BYTE)((params->cParams.windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN) << 3); + U32 const fcsCode = params->fParams.contentSizeFlag ? + (pledgedSrcSize>=256) + (pledgedSrcSize>=65536+256) + (pledgedSrcSize>=0xFFFFFFFFU) : 0; /* 0-3 */ + BYTE const frameHeaderDescriptionByte = (BYTE)(dictIDSizeCode + (checksumFlag<<2) + (singleSegment<<5) + (fcsCode<<6) ); + size_t pos=0; + + assert(!(params->fParams.contentSizeFlag && pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN)); + RETURN_ERROR_IF(dstCapacity < ZSTD_FRAMEHEADERSIZE_MAX, dstSize_tooSmall, + "dst buf is too small to fit worst-case frame header size."); + DEBUGLOG(4, "ZSTD_writeFrameHeader : dictIDFlag : %u ; dictID : %u ; dictIDSizeCode : %u", + !params->fParams.noDictIDFlag, (unsigned)dictID, (unsigned)dictIDSizeCode); + if (params->format == ZSTD_f_zstd1) { + MEM_writeLE32(dst, ZSTD_MAGICNUMBER); + pos = 4; + } + op[pos++] = frameHeaderDescriptionByte; + if (!singleSegment) op[pos++] = windowLogByte; + switch(dictIDSizeCode) + { + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; + case 0 : break; + case 1 : op[pos] = (BYTE)(dictID); pos++; break; + case 2 : MEM_writeLE16(op+pos, (U16)dictID); pos+=2; break; + case 3 : MEM_writeLE32(op+pos, dictID); pos+=4; break; + } + switch(fcsCode) + { + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; + case 0 : if (singleSegment) op[pos++] = (BYTE)(pledgedSrcSize); break; + case 1 : MEM_writeLE16(op+pos, (U16)(pledgedSrcSize-256)); pos+=2; break; + case 2 : MEM_writeLE32(op+pos, (U32)(pledgedSrcSize)); pos+=4; break; + case 3 : MEM_writeLE64(op+pos, (U64)(pledgedSrcSize)); pos+=8; break; + } + return pos; +} + +/* ZSTD_writeSkippableFrame_advanced() : + * Writes out a skippable frame with the specified magic number variant (16 are supported), + * from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15, and the desired source data. + * + * Returns the total number of bytes written, or a ZSTD error code. + */ +size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity, + const void* src, size_t srcSize, unsigned magicVariant) { + BYTE* op = (BYTE*)dst; + RETURN_ERROR_IF(dstCapacity < srcSize + ZSTD_SKIPPABLEHEADERSIZE /* Skippable frame overhead */, + dstSize_tooSmall, "Not enough room for skippable frame"); + RETURN_ERROR_IF(srcSize > (unsigned)0xFFFFFFFF, srcSize_wrong, "Src size too large for skippable frame"); + RETURN_ERROR_IF(magicVariant > 15, parameter_outOfBound, "Skippable frame magic number variant not supported"); + + MEM_writeLE32(op, (U32)(ZSTD_MAGIC_SKIPPABLE_START + magicVariant)); + MEM_writeLE32(op+4, (U32)srcSize); + ZSTD_memcpy(op+8, src, srcSize); + return srcSize + ZSTD_SKIPPABLEHEADERSIZE; +} + +/* ZSTD_writeLastEmptyBlock() : + * output an empty Block with end-of-frame mark to complete a frame + * @return : size of data written into `dst` (== ZSTD_blockHeaderSize (defined in zstd_internal.h)) + * or an error code if `dstCapacity` is too small (stage != ZSTDcs_init, stage_wrong, + "wrong cctx stage"); + RETURN_ERROR_IF(cctx->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable, + parameter_unsupported, + "incompatible with ldm"); + cctx->externSeqStore.seq = seq; + cctx->externSeqStore.size = nbSeq; + cctx->externSeqStore.capacity = nbSeq; + cctx->externSeqStore.pos = 0; + cctx->externSeqStore.posInSequence = 0; + return 0; +} + + +static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + U32 frame, U32 lastFrameChunk) +{ + ZSTD_matchState_t* const ms = &cctx->blockState.matchState; + size_t fhSize = 0; + + DEBUGLOG(5, "ZSTD_compressContinue_internal, stage: %u, srcSize: %u", + cctx->stage, (unsigned)srcSize); + RETURN_ERROR_IF(cctx->stage==ZSTDcs_created, stage_wrong, + "missing init (ZSTD_compressBegin)"); + + if (frame && (cctx->stage==ZSTDcs_init)) { + fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, &cctx->appliedParams, + cctx->pledgedSrcSizePlusOne-1, cctx->dictID); + FORWARD_IF_ERROR(fhSize, "ZSTD_writeFrameHeader failed"); + assert(fhSize <= dstCapacity); + dstCapacity -= fhSize; + dst = (char*)dst + fhSize; + cctx->stage = ZSTDcs_ongoing; + } + + if (!srcSize) return fhSize; /* do not generate an empty block if no input */ + + if (!ZSTD_window_update(&ms->window, src, srcSize, ms->forceNonContiguous)) { + ms->forceNonContiguous = 0; + ms->nextToUpdate = ms->window.dictLimit; + } + if (cctx->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable) { + ZSTD_window_update(&cctx->ldmState.window, src, srcSize, /* forceNonContiguous */ 0); + } + + if (!frame) { + /* overflow check and correction for block mode */ + ZSTD_overflowCorrectIfNeeded( + ms, &cctx->workspace, &cctx->appliedParams, + src, (BYTE const*)src + srcSize); + } + + DEBUGLOG(5, "ZSTD_compressContinue_internal (blockSize=%u)", (unsigned)cctx->blockSize); + { size_t const cSize = frame ? + ZSTD_compress_frameChunk (cctx, dst, dstCapacity, src, srcSize, lastFrameChunk) : + ZSTD_compressBlock_internal (cctx, dst, dstCapacity, src, srcSize, 0 /* frame */); + FORWARD_IF_ERROR(cSize, "%s", frame ? "ZSTD_compress_frameChunk failed" : "ZSTD_compressBlock_internal failed"); + cctx->consumedSrcSize += srcSize; + cctx->producedCSize += (cSize + fhSize); + assert(!(cctx->appliedParams.fParams.contentSizeFlag && cctx->pledgedSrcSizePlusOne == 0)); + if (cctx->pledgedSrcSizePlusOne != 0) { /* control src size */ + ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_UNKNOWN == (unsigned long long)-1); + RETURN_ERROR_IF( + cctx->consumedSrcSize+1 > cctx->pledgedSrcSizePlusOne, + srcSize_wrong, + "error : pledgedSrcSize = %u, while realSrcSize >= %u", + (unsigned)cctx->pledgedSrcSizePlusOne-1, + (unsigned)cctx->consumedSrcSize); + } + return cSize + fhSize; + } +} + +size_t ZSTD_compressContinue_public(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize) +{ + DEBUGLOG(5, "ZSTD_compressContinue (srcSize=%u)", (unsigned)srcSize); + return ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 1 /* frame mode */, 0 /* last chunk */); +} + +/* NOTE: Must just wrap ZSTD_compressContinue_public() */ +size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize) +{ + return ZSTD_compressContinue_public(cctx, dst, dstCapacity, src, srcSize); +} + +static size_t ZSTD_getBlockSize_deprecated(const ZSTD_CCtx* cctx) +{ + ZSTD_compressionParameters const cParams = cctx->appliedParams.cParams; + assert(!ZSTD_checkCParams(cParams)); + return MIN(cctx->appliedParams.maxBlockSize, (size_t)1 << cParams.windowLog); +} + +/* NOTE: Must just wrap ZSTD_getBlockSize_deprecated() */ +size_t ZSTD_getBlockSize(const ZSTD_CCtx* cctx) +{ + return ZSTD_getBlockSize_deprecated(cctx); +} + +/* NOTE: Must just wrap ZSTD_compressBlock_deprecated() */ +size_t ZSTD_compressBlock_deprecated(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize) +{ + DEBUGLOG(5, "ZSTD_compressBlock: srcSize = %u", (unsigned)srcSize); + { size_t const blockSizeMax = ZSTD_getBlockSize_deprecated(cctx); + RETURN_ERROR_IF(srcSize > blockSizeMax, srcSize_wrong, "input is larger than a block"); } + + return ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 0 /* frame mode */, 0 /* last chunk */); +} + +/* NOTE: Must just wrap ZSTD_compressBlock_deprecated() */ +size_t ZSTD_compressBlock(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize) +{ + return ZSTD_compressBlock_deprecated(cctx, dst, dstCapacity, src, srcSize); +} + +/*! ZSTD_loadDictionaryContent() : + * @return : 0, or an error code + */ +static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, + ldmState_t* ls, + ZSTD_cwksp* ws, + ZSTD_CCtx_params const* params, + const void* src, size_t srcSize, + ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp) +{ + const BYTE* ip = (const BYTE*) src; + const BYTE* const iend = ip + srcSize; + int const loadLdmDict = params->ldmParams.enableLdm == ZSTD_ps_enable && ls != NULL; + + /* Assert that the ms params match the params we're being given */ + ZSTD_assertEqualCParams(params->cParams, ms->cParams); + + { /* Ensure large dictionaries can't cause index overflow */ + + /* Allow the dictionary to set indices up to exactly ZSTD_CURRENT_MAX. + * Dictionaries right at the edge will immediately trigger overflow + * correction, but I don't want to insert extra constraints here. + */ + U32 maxDictSize = ZSTD_CURRENT_MAX - ZSTD_WINDOW_START_INDEX; + + int const CDictTaggedIndices = ZSTD_CDictIndicesAreTagged(¶ms->cParams); + if (CDictTaggedIndices && tfp == ZSTD_tfp_forCDict) { + /* Some dictionary matchfinders in zstd use "short cache", + * which treats the lower ZSTD_SHORT_CACHE_TAG_BITS of each + * CDict hashtable entry as a tag rather than as part of an index. + * When short cache is used, we need to truncate the dictionary + * so that its indices don't overlap with the tag. */ + U32 const shortCacheMaxDictSize = (1u << (32 - ZSTD_SHORT_CACHE_TAG_BITS)) - ZSTD_WINDOW_START_INDEX; + maxDictSize = MIN(maxDictSize, shortCacheMaxDictSize); + assert(!loadLdmDict); + } + + /* If the dictionary is too large, only load the suffix of the dictionary. */ + if (srcSize > maxDictSize) { + ip = iend - maxDictSize; + src = ip; + srcSize = maxDictSize; + } + } + + if (srcSize > ZSTD_CHUNKSIZE_MAX) { + /* We must have cleared our windows when our source is this large. */ + assert(ZSTD_window_isEmpty(ms->window)); + if (loadLdmDict) assert(ZSTD_window_isEmpty(ls->window)); + } + ZSTD_window_update(&ms->window, src, srcSize, /* forceNonContiguous */ 0); + + DEBUGLOG(4, "ZSTD_loadDictionaryContent(): useRowMatchFinder=%d", (int)params->useRowMatchFinder); + + if (loadLdmDict) { /* Load the entire dict into LDM matchfinders. */ + ZSTD_window_update(&ls->window, src, srcSize, /* forceNonContiguous */ 0); + ls->loadedDictEnd = params->forceWindow ? 0 : (U32)(iend - ls->window.base); + ZSTD_ldm_fillHashTable(ls, ip, iend, ¶ms->ldmParams); + } + + /* If the dict is larger than we can reasonably index in our tables, only load the suffix. */ + if (params->cParams.strategy < ZSTD_btultra) { + U32 maxDictSize = 8U << MIN(MAX(params->cParams.hashLog, params->cParams.chainLog), 28); + if (srcSize > maxDictSize) { + ip = iend - maxDictSize; + src = ip; + srcSize = maxDictSize; + } + } + + ms->nextToUpdate = (U32)(ip - ms->window.base); + ms->loadedDictEnd = params->forceWindow ? 0 : (U32)(iend - ms->window.base); + ms->forceNonContiguous = params->deterministicRefPrefix; + + if (srcSize <= HASH_READ_SIZE) return 0; + + ZSTD_overflowCorrectIfNeeded(ms, ws, params, ip, iend); + + switch(params->cParams.strategy) + { + case ZSTD_fast: + ZSTD_fillHashTable(ms, iend, dtlm, tfp); + break; + case ZSTD_dfast: + ZSTD_fillDoubleHashTable(ms, iend, dtlm, tfp); + break; + + case ZSTD_greedy: + case ZSTD_lazy: + case ZSTD_lazy2: + assert(srcSize >= HASH_READ_SIZE); + if (ms->dedicatedDictSearch) { + assert(ms->chainTable != NULL); + ZSTD_dedicatedDictSearch_lazy_loadDictionary(ms, iend-HASH_READ_SIZE); + } else { + assert(params->useRowMatchFinder != ZSTD_ps_auto); + if (params->useRowMatchFinder == ZSTD_ps_enable) { + size_t const tagTableSize = ((size_t)1 << params->cParams.hashLog); + ZSTD_memset(ms->tagTable, 0, tagTableSize); + ZSTD_row_update(ms, iend-HASH_READ_SIZE); + DEBUGLOG(4, "Using row-based hash table for lazy dict"); + } else { + ZSTD_insertAndFindFirstIndex(ms, iend-HASH_READ_SIZE); + DEBUGLOG(4, "Using chain-based hash table for lazy dict"); + } + } + break; + + case ZSTD_btlazy2: /* we want the dictionary table fully sorted */ + case ZSTD_btopt: + case ZSTD_btultra: + case ZSTD_btultra2: + assert(srcSize >= HASH_READ_SIZE); + ZSTD_updateTree(ms, iend-HASH_READ_SIZE, iend); + break; + + default: + assert(0); /* not possible : not a valid strategy id */ + } + + ms->nextToUpdate = (U32)(iend - ms->window.base); + return 0; +} + + +/* Dictionaries that assign zero probability to symbols that show up causes problems + * when FSE encoding. Mark dictionaries with zero probability symbols as FSE_repeat_check + * and only dictionaries with 100% valid symbols can be assumed valid. + */ +static FSE_repeat ZSTD_dictNCountRepeat(short* normalizedCounter, unsigned dictMaxSymbolValue, unsigned maxSymbolValue) +{ + U32 s; + if (dictMaxSymbolValue < maxSymbolValue) { + return FSE_repeat_check; + } + for (s = 0; s <= maxSymbolValue; ++s) { + if (normalizedCounter[s] == 0) { + return FSE_repeat_check; + } + } + return FSE_repeat_valid; +} + +size_t ZSTD_loadCEntropy(ZSTD_compressedBlockState_t* bs, void* workspace, + const void* const dict, size_t dictSize) +{ + short offcodeNCount[MaxOff+1]; + unsigned offcodeMaxValue = MaxOff; + const BYTE* dictPtr = (const BYTE*)dict; /* skip magic num and dict ID */ + const BYTE* const dictEnd = dictPtr + dictSize; + dictPtr += 8; + bs->entropy.huf.repeatMode = HUF_repeat_check; + + { unsigned maxSymbolValue = 255; + unsigned hasZeroWeights = 1; + size_t const hufHeaderSize = HUF_readCTable((HUF_CElt*)bs->entropy.huf.CTable, &maxSymbolValue, dictPtr, + dictEnd-dictPtr, &hasZeroWeights); + + /* We only set the loaded table as valid if it contains all non-zero + * weights. Otherwise, we set it to check */ + if (!hasZeroWeights) + bs->entropy.huf.repeatMode = HUF_repeat_valid; + + RETURN_ERROR_IF(HUF_isError(hufHeaderSize), dictionary_corrupted, ""); + RETURN_ERROR_IF(maxSymbolValue < 255, dictionary_corrupted, ""); + dictPtr += hufHeaderSize; + } + + { unsigned offcodeLog; + size_t const offcodeHeaderSize = FSE_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dictPtr, dictEnd-dictPtr); + RETURN_ERROR_IF(FSE_isError(offcodeHeaderSize), dictionary_corrupted, ""); + RETURN_ERROR_IF(offcodeLog > OffFSELog, dictionary_corrupted, ""); + /* fill all offset symbols to avoid garbage at end of table */ + RETURN_ERROR_IF(FSE_isError(FSE_buildCTable_wksp( + bs->entropy.fse.offcodeCTable, + offcodeNCount, MaxOff, offcodeLog, + workspace, HUF_WORKSPACE_SIZE)), + dictionary_corrupted, ""); + /* Defer checking offcodeMaxValue because we need to know the size of the dictionary content */ + dictPtr += offcodeHeaderSize; + } + + { short matchlengthNCount[MaxML+1]; + unsigned matchlengthMaxValue = MaxML, matchlengthLog; + size_t const matchlengthHeaderSize = FSE_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dictPtr, dictEnd-dictPtr); + RETURN_ERROR_IF(FSE_isError(matchlengthHeaderSize), dictionary_corrupted, ""); + RETURN_ERROR_IF(matchlengthLog > MLFSELog, dictionary_corrupted, ""); + RETURN_ERROR_IF(FSE_isError(FSE_buildCTable_wksp( + bs->entropy.fse.matchlengthCTable, + matchlengthNCount, matchlengthMaxValue, matchlengthLog, + workspace, HUF_WORKSPACE_SIZE)), + dictionary_corrupted, ""); + bs->entropy.fse.matchlength_repeatMode = ZSTD_dictNCountRepeat(matchlengthNCount, matchlengthMaxValue, MaxML); + dictPtr += matchlengthHeaderSize; + } + + { short litlengthNCount[MaxLL+1]; + unsigned litlengthMaxValue = MaxLL, litlengthLog; + size_t const litlengthHeaderSize = FSE_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dictPtr, dictEnd-dictPtr); + RETURN_ERROR_IF(FSE_isError(litlengthHeaderSize), dictionary_corrupted, ""); + RETURN_ERROR_IF(litlengthLog > LLFSELog, dictionary_corrupted, ""); + RETURN_ERROR_IF(FSE_isError(FSE_buildCTable_wksp( + bs->entropy.fse.litlengthCTable, + litlengthNCount, litlengthMaxValue, litlengthLog, + workspace, HUF_WORKSPACE_SIZE)), + dictionary_corrupted, ""); + bs->entropy.fse.litlength_repeatMode = ZSTD_dictNCountRepeat(litlengthNCount, litlengthMaxValue, MaxLL); + dictPtr += litlengthHeaderSize; + } + + RETURN_ERROR_IF(dictPtr+12 > dictEnd, dictionary_corrupted, ""); + bs->rep[0] = MEM_readLE32(dictPtr+0); + bs->rep[1] = MEM_readLE32(dictPtr+4); + bs->rep[2] = MEM_readLE32(dictPtr+8); + dictPtr += 12; + + { size_t const dictContentSize = (size_t)(dictEnd - dictPtr); + U32 offcodeMax = MaxOff; + if (dictContentSize <= ((U32)-1) - 128 KB) { + U32 const maxOffset = (U32)dictContentSize + 128 KB; /* The maximum offset that must be supported */ + offcodeMax = ZSTD_highbit32(maxOffset); /* Calculate minimum offset code required to represent maxOffset */ + } + /* All offset values <= dictContentSize + 128 KB must be representable for a valid table */ + bs->entropy.fse.offcode_repeatMode = ZSTD_dictNCountRepeat(offcodeNCount, offcodeMaxValue, MIN(offcodeMax, MaxOff)); + + /* All repCodes must be <= dictContentSize and != 0 */ + { U32 u; + for (u=0; u<3; u++) { + RETURN_ERROR_IF(bs->rep[u] == 0, dictionary_corrupted, ""); + RETURN_ERROR_IF(bs->rep[u] > dictContentSize, dictionary_corrupted, ""); + } } } + + return dictPtr - (const BYTE*)dict; +} + +/* Dictionary format : + * See : + * https://github.com/facebook/zstd/blob/release/doc/zstd_compression_format.md#dictionary-format + */ +/*! ZSTD_loadZstdDictionary() : + * @return : dictID, or an error code + * assumptions : magic number supposed already checked + * dictSize supposed >= 8 + */ +static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs, + ZSTD_matchState_t* ms, + ZSTD_cwksp* ws, + ZSTD_CCtx_params const* params, + const void* dict, size_t dictSize, + ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp, + void* workspace) +{ + const BYTE* dictPtr = (const BYTE*)dict; + const BYTE* const dictEnd = dictPtr + dictSize; + size_t dictID; + size_t eSize; + ZSTD_STATIC_ASSERT(HUF_WORKSPACE_SIZE >= (1<= 8); + assert(MEM_readLE32(dictPtr) == ZSTD_MAGIC_DICTIONARY); + + dictID = params->fParams.noDictIDFlag ? 0 : MEM_readLE32(dictPtr + 4 /* skip magic number */ ); + eSize = ZSTD_loadCEntropy(bs, workspace, dict, dictSize); + FORWARD_IF_ERROR(eSize, "ZSTD_loadCEntropy failed"); + dictPtr += eSize; + + { + size_t const dictContentSize = (size_t)(dictEnd - dictPtr); + FORWARD_IF_ERROR(ZSTD_loadDictionaryContent( + ms, NULL, ws, params, dictPtr, dictContentSize, dtlm, tfp), ""); + } + return dictID; +} + +/** ZSTD_compress_insertDictionary() : +* @return : dictID, or an error code */ +static size_t +ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs, + ZSTD_matchState_t* ms, + ldmState_t* ls, + ZSTD_cwksp* ws, + const ZSTD_CCtx_params* params, + const void* dict, size_t dictSize, + ZSTD_dictContentType_e dictContentType, + ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp, + void* workspace) +{ + DEBUGLOG(4, "ZSTD_compress_insertDictionary (dictSize=%u)", (U32)dictSize); + if ((dict==NULL) || (dictSize<8)) { + RETURN_ERROR_IF(dictContentType == ZSTD_dct_fullDict, dictionary_wrong, ""); + return 0; + } + + ZSTD_reset_compressedBlockState(bs); + + /* dict restricted modes */ + if (dictContentType == ZSTD_dct_rawContent) + return ZSTD_loadDictionaryContent(ms, ls, ws, params, dict, dictSize, dtlm, tfp); + + if (MEM_readLE32(dict) != ZSTD_MAGIC_DICTIONARY) { + if (dictContentType == ZSTD_dct_auto) { + DEBUGLOG(4, "raw content dictionary detected"); + return ZSTD_loadDictionaryContent( + ms, ls, ws, params, dict, dictSize, dtlm, tfp); + } + RETURN_ERROR_IF(dictContentType == ZSTD_dct_fullDict, dictionary_wrong, ""); + assert(0); /* impossible */ + } + + /* dict as full zstd dictionary */ + return ZSTD_loadZstdDictionary( + bs, ms, ws, params, dict, dictSize, dtlm, tfp, workspace); +} + +#define ZSTD_USE_CDICT_PARAMS_SRCSIZE_CUTOFF (128 KB) +#define ZSTD_USE_CDICT_PARAMS_DICTSIZE_MULTIPLIER (6ULL) + +/*! ZSTD_compressBegin_internal() : + * Assumption : either @dict OR @cdict (or none) is non-NULL, never both + * @return : 0, or an error code */ +static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx, + const void* dict, size_t dictSize, + ZSTD_dictContentType_e dictContentType, + ZSTD_dictTableLoadMethod_e dtlm, + const ZSTD_CDict* cdict, + const ZSTD_CCtx_params* params, U64 pledgedSrcSize, + ZSTD_buffered_policy_e zbuff) +{ + size_t const dictContentSize = cdict ? cdict->dictContentSize : dictSize; +#if ZSTD_TRACE + cctx->traceCtx = (ZSTD_trace_compress_begin != NULL) ? ZSTD_trace_compress_begin(cctx) : 0; +#endif + DEBUGLOG(4, "ZSTD_compressBegin_internal: wlog=%u", params->cParams.windowLog); + /* params are supposed to be fully validated at this point */ + assert(!ZSTD_isError(ZSTD_checkCParams(params->cParams))); + assert(!((dict) && (cdict))); /* either dict or cdict, not both */ + if ( (cdict) + && (cdict->dictContentSize > 0) + && ( pledgedSrcSize < ZSTD_USE_CDICT_PARAMS_SRCSIZE_CUTOFF + || pledgedSrcSize < cdict->dictContentSize * ZSTD_USE_CDICT_PARAMS_DICTSIZE_MULTIPLIER + || pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN + || cdict->compressionLevel == 0) + && (params->attachDictPref != ZSTD_dictForceLoad) ) { + return ZSTD_resetCCtx_usingCDict(cctx, cdict, params, pledgedSrcSize, zbuff); + } + + FORWARD_IF_ERROR( ZSTD_resetCCtx_internal(cctx, params, pledgedSrcSize, + dictContentSize, + ZSTDcrp_makeClean, zbuff) , ""); + { size_t const dictID = cdict ? + ZSTD_compress_insertDictionary( + cctx->blockState.prevCBlock, &cctx->blockState.matchState, + &cctx->ldmState, &cctx->workspace, &cctx->appliedParams, cdict->dictContent, + cdict->dictContentSize, cdict->dictContentType, dtlm, + ZSTD_tfp_forCCtx, cctx->entropyWorkspace) + : ZSTD_compress_insertDictionary( + cctx->blockState.prevCBlock, &cctx->blockState.matchState, + &cctx->ldmState, &cctx->workspace, &cctx->appliedParams, dict, dictSize, + dictContentType, dtlm, ZSTD_tfp_forCCtx, cctx->entropyWorkspace); + FORWARD_IF_ERROR(dictID, "ZSTD_compress_insertDictionary failed"); + assert(dictID <= UINT_MAX); + cctx->dictID = (U32)dictID; + cctx->dictContentSize = dictContentSize; + } + return 0; +} + +size_t ZSTD_compressBegin_advanced_internal(ZSTD_CCtx* cctx, + const void* dict, size_t dictSize, + ZSTD_dictContentType_e dictContentType, + ZSTD_dictTableLoadMethod_e dtlm, + const ZSTD_CDict* cdict, + const ZSTD_CCtx_params* params, + unsigned long long pledgedSrcSize) +{ + DEBUGLOG(4, "ZSTD_compressBegin_advanced_internal: wlog=%u", params->cParams.windowLog); + /* compression parameters verification and optimization */ + FORWARD_IF_ERROR( ZSTD_checkCParams(params->cParams) , ""); + return ZSTD_compressBegin_internal(cctx, + dict, dictSize, dictContentType, dtlm, + cdict, + params, pledgedSrcSize, + ZSTDb_not_buffered); +} + +/*! ZSTD_compressBegin_advanced() : +* @return : 0, or an error code */ +size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, + const void* dict, size_t dictSize, + ZSTD_parameters params, unsigned long long pledgedSrcSize) +{ + ZSTD_CCtx_params cctxParams; + ZSTD_CCtxParams_init_internal(&cctxParams, ¶ms, ZSTD_NO_CLEVEL); + return ZSTD_compressBegin_advanced_internal(cctx, + dict, dictSize, ZSTD_dct_auto, ZSTD_dtlm_fast, + NULL /*cdict*/, + &cctxParams, pledgedSrcSize); +} + +static size_t +ZSTD_compressBegin_usingDict_deprecated(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel) +{ + ZSTD_CCtx_params cctxParams; + { ZSTD_parameters const params = ZSTD_getParams_internal(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_noAttachDict); + ZSTD_CCtxParams_init_internal(&cctxParams, ¶ms, (compressionLevel == 0) ? ZSTD_CLEVEL_DEFAULT : compressionLevel); + } + DEBUGLOG(4, "ZSTD_compressBegin_usingDict (dictSize=%u)", (unsigned)dictSize); + return ZSTD_compressBegin_internal(cctx, dict, dictSize, ZSTD_dct_auto, ZSTD_dtlm_fast, NULL, + &cctxParams, ZSTD_CONTENTSIZE_UNKNOWN, ZSTDb_not_buffered); +} + +size_t +ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel) +{ + return ZSTD_compressBegin_usingDict_deprecated(cctx, dict, dictSize, compressionLevel); +} + +size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel) +{ + return ZSTD_compressBegin_usingDict_deprecated(cctx, NULL, 0, compressionLevel); +} + + +/*! ZSTD_writeEpilogue() : +* Ends a frame. +* @return : nb of bytes written into dst (or an error code) */ +static size_t ZSTD_writeEpilogue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity) +{ + BYTE* const ostart = (BYTE*)dst; + BYTE* op = ostart; + size_t fhSize = 0; + + DEBUGLOG(4, "ZSTD_writeEpilogue"); + RETURN_ERROR_IF(cctx->stage == ZSTDcs_created, stage_wrong, "init missing"); + + /* special case : empty frame */ + if (cctx->stage == ZSTDcs_init) { + fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, &cctx->appliedParams, 0, 0); + FORWARD_IF_ERROR(fhSize, "ZSTD_writeFrameHeader failed"); + dstCapacity -= fhSize; + op += fhSize; + cctx->stage = ZSTDcs_ongoing; + } + + if (cctx->stage != ZSTDcs_ending) { + /* write one last empty block, make it the "last" block */ + U32 const cBlockHeader24 = 1 /* last block */ + (((U32)bt_raw)<<1) + 0; + RETURN_ERROR_IF(dstCapacity<4, dstSize_tooSmall, "no room for epilogue"); + MEM_writeLE32(op, cBlockHeader24); + op += ZSTD_blockHeaderSize; + dstCapacity -= ZSTD_blockHeaderSize; + } + + if (cctx->appliedParams.fParams.checksumFlag) { + U32 const checksum = (U32) XXH64_digest(&cctx->xxhState); + RETURN_ERROR_IF(dstCapacity<4, dstSize_tooSmall, "no room for checksum"); + DEBUGLOG(4, "ZSTD_writeEpilogue: write checksum : %08X", (unsigned)checksum); + MEM_writeLE32(op, checksum); + op += 4; + } + + cctx->stage = ZSTDcs_created; /* return to "created but no init" status */ + return op-ostart; +} + +void ZSTD_CCtx_trace(ZSTD_CCtx* cctx, size_t extraCSize) +{ +#if ZSTD_TRACE + if (cctx->traceCtx && ZSTD_trace_compress_end != NULL) { + int const streaming = cctx->inBuffSize > 0 || cctx->outBuffSize > 0 || cctx->appliedParams.nbWorkers > 0; + ZSTD_Trace trace; + ZSTD_memset(&trace, 0, sizeof(trace)); + trace.version = ZSTD_VERSION_NUMBER; + trace.streaming = streaming; + trace.dictionaryID = cctx->dictID; + trace.dictionarySize = cctx->dictContentSize; + trace.uncompressedSize = cctx->consumedSrcSize; + trace.compressedSize = cctx->producedCSize + extraCSize; + trace.params = &cctx->appliedParams; + trace.cctx = cctx; + ZSTD_trace_compress_end(cctx->traceCtx, &trace); + } + cctx->traceCtx = 0; +#else + (void)cctx; + (void)extraCSize; +#endif +} + +size_t ZSTD_compressEnd_public(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize) +{ + size_t endResult; + size_t const cSize = ZSTD_compressContinue_internal(cctx, + dst, dstCapacity, src, srcSize, + 1 /* frame mode */, 1 /* last chunk */); + FORWARD_IF_ERROR(cSize, "ZSTD_compressContinue_internal failed"); + endResult = ZSTD_writeEpilogue(cctx, (char*)dst + cSize, dstCapacity-cSize); + FORWARD_IF_ERROR(endResult, "ZSTD_writeEpilogue failed"); + assert(!(cctx->appliedParams.fParams.contentSizeFlag && cctx->pledgedSrcSizePlusOne == 0)); + if (cctx->pledgedSrcSizePlusOne != 0) { /* control src size */ + ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_UNKNOWN == (unsigned long long)-1); + DEBUGLOG(4, "end of frame : controlling src size"); + RETURN_ERROR_IF( + cctx->pledgedSrcSizePlusOne != cctx->consumedSrcSize+1, + srcSize_wrong, + "error : pledgedSrcSize = %u, while realSrcSize = %u", + (unsigned)cctx->pledgedSrcSizePlusOne-1, + (unsigned)cctx->consumedSrcSize); + } + ZSTD_CCtx_trace(cctx, endResult); + return cSize + endResult; +} + +/* NOTE: Must just wrap ZSTD_compressEnd_public() */ +size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize) +{ + return ZSTD_compressEnd_public(cctx, dst, dstCapacity, src, srcSize); +} + +size_t ZSTD_compress_advanced (ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + ZSTD_parameters params) +{ + DEBUGLOG(4, "ZSTD_compress_advanced"); + FORWARD_IF_ERROR(ZSTD_checkCParams(params.cParams), ""); + ZSTD_CCtxParams_init_internal(&cctx->simpleApiParams, ¶ms, ZSTD_NO_CLEVEL); + return ZSTD_compress_advanced_internal(cctx, + dst, dstCapacity, + src, srcSize, + dict, dictSize, + &cctx->simpleApiParams); +} + +/* Internal */ +size_t ZSTD_compress_advanced_internal( + ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + const ZSTD_CCtx_params* params) +{ + DEBUGLOG(4, "ZSTD_compress_advanced_internal (srcSize:%u)", (unsigned)srcSize); + FORWARD_IF_ERROR( ZSTD_compressBegin_internal(cctx, + dict, dictSize, ZSTD_dct_auto, ZSTD_dtlm_fast, NULL, + params, srcSize, ZSTDb_not_buffered) , ""); + return ZSTD_compressEnd_public(cctx, dst, dstCapacity, src, srcSize); +} + +size_t ZSTD_compress_usingDict(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + int compressionLevel) +{ + { + ZSTD_parameters const params = ZSTD_getParams_internal(compressionLevel, srcSize, dict ? dictSize : 0, ZSTD_cpm_noAttachDict); + assert(params.fParams.contentSizeFlag == 1); + ZSTD_CCtxParams_init_internal(&cctx->simpleApiParams, ¶ms, (compressionLevel == 0) ? ZSTD_CLEVEL_DEFAULT: compressionLevel); + } + DEBUGLOG(4, "ZSTD_compress_usingDict (srcSize=%u)", (unsigned)srcSize); + return ZSTD_compress_advanced_internal(cctx, dst, dstCapacity, src, srcSize, dict, dictSize, &cctx->simpleApiParams); +} + +size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + int compressionLevel) +{ + DEBUGLOG(4, "ZSTD_compressCCtx (srcSize=%u)", (unsigned)srcSize); + assert(cctx != NULL); + return ZSTD_compress_usingDict(cctx, dst, dstCapacity, src, srcSize, NULL, 0, compressionLevel); +} + +size_t ZSTD_compress(void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + int compressionLevel) +{ + size_t result; +#if ZSTD_COMPRESS_HEAPMODE + ZSTD_CCtx* cctx = ZSTD_createCCtx(); + RETURN_ERROR_IF(!cctx, memory_allocation, "ZSTD_createCCtx failed"); + result = ZSTD_compressCCtx(cctx, dst, dstCapacity, src, srcSize, compressionLevel); + ZSTD_freeCCtx(cctx); +#else + ZSTD_CCtx ctxBody; + ZSTD_initCCtx(&ctxBody, ZSTD_defaultCMem); + result = ZSTD_compressCCtx(&ctxBody, dst, dstCapacity, src, srcSize, compressionLevel); + ZSTD_freeCCtxContent(&ctxBody); /* can't free ctxBody itself, as it's on stack; free only heap content */ +#endif + return result; +} + + +/* ===== Dictionary API ===== */ + +/*! ZSTD_estimateCDictSize_advanced() : + * Estimate amount of memory that will be needed to create a dictionary with following arguments */ +size_t ZSTD_estimateCDictSize_advanced( + size_t dictSize, ZSTD_compressionParameters cParams, + ZSTD_dictLoadMethod_e dictLoadMethod) +{ + DEBUGLOG(5, "sizeof(ZSTD_CDict) : %u", (unsigned)sizeof(ZSTD_CDict)); + return ZSTD_cwksp_alloc_size(sizeof(ZSTD_CDict)) + + ZSTD_cwksp_alloc_size(HUF_WORKSPACE_SIZE) + /* enableDedicatedDictSearch == 1 ensures that CDict estimation will not be too small + * in case we are using DDS with row-hash. */ + + ZSTD_sizeof_matchState(&cParams, ZSTD_resolveRowMatchFinderMode(ZSTD_ps_auto, &cParams), + /* enableDedicatedDictSearch */ 1, /* forCCtx */ 0) + + (dictLoadMethod == ZSTD_dlm_byRef ? 0 + : ZSTD_cwksp_alloc_size(ZSTD_cwksp_align(dictSize, sizeof(void *)))); +} + +size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel) +{ + ZSTD_compressionParameters const cParams = ZSTD_getCParams_internal(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_createCDict); + return ZSTD_estimateCDictSize_advanced(dictSize, cParams, ZSTD_dlm_byCopy); +} + +size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict) +{ + if (cdict==NULL) return 0; /* support sizeof on NULL */ + DEBUGLOG(5, "sizeof(*cdict) : %u", (unsigned)sizeof(*cdict)); + /* cdict may be in the workspace */ + return (cdict->workspace.workspace == cdict ? 0 : sizeof(*cdict)) + + ZSTD_cwksp_sizeof(&cdict->workspace); +} + +static size_t ZSTD_initCDict_internal( + ZSTD_CDict* cdict, + const void* dictBuffer, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_CCtx_params params) +{ + DEBUGLOG(3, "ZSTD_initCDict_internal (dictContentType:%u)", (unsigned)dictContentType); + assert(!ZSTD_checkCParams(params.cParams)); + cdict->matchState.cParams = params.cParams; + cdict->matchState.dedicatedDictSearch = params.enableDedicatedDictSearch; + if ((dictLoadMethod == ZSTD_dlm_byRef) || (!dictBuffer) || (!dictSize)) { + cdict->dictContent = dictBuffer; + } else { + void *internalBuffer = ZSTD_cwksp_reserve_object(&cdict->workspace, ZSTD_cwksp_align(dictSize, sizeof(void*))); + RETURN_ERROR_IF(!internalBuffer, memory_allocation, "NULL pointer!"); + cdict->dictContent = internalBuffer; + ZSTD_memcpy(internalBuffer, dictBuffer, dictSize); + } + cdict->dictContentSize = dictSize; + cdict->dictContentType = dictContentType; + + cdict->entropyWorkspace = (U32*)ZSTD_cwksp_reserve_object(&cdict->workspace, HUF_WORKSPACE_SIZE); + + + /* Reset the state to no dictionary */ + ZSTD_reset_compressedBlockState(&cdict->cBlockState); + FORWARD_IF_ERROR(ZSTD_reset_matchState( + &cdict->matchState, + &cdict->workspace, + ¶ms.cParams, + params.useRowMatchFinder, + ZSTDcrp_makeClean, + ZSTDirp_reset, + ZSTD_resetTarget_CDict), ""); + /* (Maybe) load the dictionary + * Skips loading the dictionary if it is < 8 bytes. + */ + { params.compressionLevel = ZSTD_CLEVEL_DEFAULT; + params.fParams.contentSizeFlag = 1; + { size_t const dictID = ZSTD_compress_insertDictionary( + &cdict->cBlockState, &cdict->matchState, NULL, &cdict->workspace, + ¶ms, cdict->dictContent, cdict->dictContentSize, + dictContentType, ZSTD_dtlm_full, ZSTD_tfp_forCDict, cdict->entropyWorkspace); + FORWARD_IF_ERROR(dictID, "ZSTD_compress_insertDictionary failed"); + assert(dictID <= (size_t)(U32)-1); + cdict->dictID = (U32)dictID; + } + } + + return 0; +} + +static ZSTD_CDict* ZSTD_createCDict_advanced_internal(size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_compressionParameters cParams, + ZSTD_paramSwitch_e useRowMatchFinder, + U32 enableDedicatedDictSearch, + ZSTD_customMem customMem) +{ + if ((!customMem.customAlloc) ^ (!customMem.customFree)) return NULL; + + { size_t const workspaceSize = + ZSTD_cwksp_alloc_size(sizeof(ZSTD_CDict)) + + ZSTD_cwksp_alloc_size(HUF_WORKSPACE_SIZE) + + ZSTD_sizeof_matchState(&cParams, useRowMatchFinder, enableDedicatedDictSearch, /* forCCtx */ 0) + + (dictLoadMethod == ZSTD_dlm_byRef ? 0 + : ZSTD_cwksp_alloc_size(ZSTD_cwksp_align(dictSize, sizeof(void*)))); + void* const workspace = ZSTD_customMalloc(workspaceSize, customMem); + ZSTD_cwksp ws; + ZSTD_CDict* cdict; + + if (!workspace) { + ZSTD_customFree(workspace, customMem); + return NULL; + } + + ZSTD_cwksp_init(&ws, workspace, workspaceSize, ZSTD_cwksp_dynamic_alloc); + + cdict = (ZSTD_CDict*)ZSTD_cwksp_reserve_object(&ws, sizeof(ZSTD_CDict)); + assert(cdict != NULL); + ZSTD_cwksp_move(&cdict->workspace, &ws); + cdict->customMem = customMem; + cdict->compressionLevel = ZSTD_NO_CLEVEL; /* signals advanced API usage */ + cdict->useRowMatchFinder = useRowMatchFinder; + return cdict; + } +} + +ZSTD_CDict* ZSTD_createCDict_advanced(const void* dictBuffer, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_compressionParameters cParams, + ZSTD_customMem customMem) +{ + ZSTD_CCtx_params cctxParams; + ZSTD_memset(&cctxParams, 0, sizeof(cctxParams)); + ZSTD_CCtxParams_init(&cctxParams, 0); + cctxParams.cParams = cParams; + cctxParams.customMem = customMem; + return ZSTD_createCDict_advanced2( + dictBuffer, dictSize, + dictLoadMethod, dictContentType, + &cctxParams, customMem); +} + +ZSTD_CDict* ZSTD_createCDict_advanced2( + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + const ZSTD_CCtx_params* originalCctxParams, + ZSTD_customMem customMem) +{ + ZSTD_CCtx_params cctxParams = *originalCctxParams; + ZSTD_compressionParameters cParams; + ZSTD_CDict* cdict; + + DEBUGLOG(3, "ZSTD_createCDict_advanced2, mode %u", (unsigned)dictContentType); + if (!customMem.customAlloc ^ !customMem.customFree) return NULL; + + if (cctxParams.enableDedicatedDictSearch) { + cParams = ZSTD_dedicatedDictSearch_getCParams( + cctxParams.compressionLevel, dictSize); + ZSTD_overrideCParams(&cParams, &cctxParams.cParams); + } else { + cParams = ZSTD_getCParamsFromCCtxParams( + &cctxParams, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_createCDict); + } + + if (!ZSTD_dedicatedDictSearch_isSupported(&cParams)) { + /* Fall back to non-DDSS params */ + cctxParams.enableDedicatedDictSearch = 0; + cParams = ZSTD_getCParamsFromCCtxParams( + &cctxParams, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_createCDict); + } + + DEBUGLOG(3, "ZSTD_createCDict_advanced2: DDS: %u", cctxParams.enableDedicatedDictSearch); + cctxParams.cParams = cParams; + cctxParams.useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(cctxParams.useRowMatchFinder, &cParams); + + cdict = ZSTD_createCDict_advanced_internal(dictSize, + dictLoadMethod, cctxParams.cParams, + cctxParams.useRowMatchFinder, cctxParams.enableDedicatedDictSearch, + customMem); + + if (ZSTD_isError( ZSTD_initCDict_internal(cdict, + dict, dictSize, + dictLoadMethod, dictContentType, + cctxParams) )) { + ZSTD_freeCDict(cdict); + return NULL; + } + + return cdict; +} + +ZSTD_CDict* ZSTD_createCDict(const void* dict, size_t dictSize, int compressionLevel) +{ + ZSTD_compressionParameters cParams = ZSTD_getCParams_internal(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_createCDict); + ZSTD_CDict* const cdict = ZSTD_createCDict_advanced(dict, dictSize, + ZSTD_dlm_byCopy, ZSTD_dct_auto, + cParams, ZSTD_defaultCMem); + if (cdict) + cdict->compressionLevel = (compressionLevel == 0) ? ZSTD_CLEVEL_DEFAULT : compressionLevel; + return cdict; +} + +ZSTD_CDict* ZSTD_createCDict_byReference(const void* dict, size_t dictSize, int compressionLevel) +{ + ZSTD_compressionParameters cParams = ZSTD_getCParams_internal(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_createCDict); + ZSTD_CDict* const cdict = ZSTD_createCDict_advanced(dict, dictSize, + ZSTD_dlm_byRef, ZSTD_dct_auto, + cParams, ZSTD_defaultCMem); + if (cdict) + cdict->compressionLevel = (compressionLevel == 0) ? ZSTD_CLEVEL_DEFAULT : compressionLevel; + return cdict; +} + +size_t ZSTD_freeCDict(ZSTD_CDict* cdict) +{ + if (cdict==NULL) return 0; /* support free on NULL */ + { ZSTD_customMem const cMem = cdict->customMem; + int cdictInWorkspace = ZSTD_cwksp_owns_buffer(&cdict->workspace, cdict); + ZSTD_cwksp_free(&cdict->workspace, cMem); + if (!cdictInWorkspace) { + ZSTD_customFree(cdict, cMem); + } + return 0; + } +} + +/*! ZSTD_initStaticCDict_advanced() : + * Generate a digested dictionary in provided memory area. + * workspace: The memory area to emplace the dictionary into. + * Provided pointer must 8-bytes aligned. + * It must outlive dictionary usage. + * workspaceSize: Use ZSTD_estimateCDictSize() + * to determine how large workspace must be. + * cParams : use ZSTD_getCParams() to transform a compression level + * into its relevants cParams. + * @return : pointer to ZSTD_CDict*, or NULL if error (size too small) + * Note : there is no corresponding "free" function. + * Since workspace was allocated externally, it must be freed externally. + */ +const ZSTD_CDict* ZSTD_initStaticCDict( + void* workspace, size_t workspaceSize, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_compressionParameters cParams) +{ + ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(ZSTD_ps_auto, &cParams); + /* enableDedicatedDictSearch == 1 ensures matchstate is not too small in case this CDict will be used for DDS + row hash */ + size_t const matchStateSize = ZSTD_sizeof_matchState(&cParams, useRowMatchFinder, /* enableDedicatedDictSearch */ 1, /* forCCtx */ 0); + size_t const neededSize = ZSTD_cwksp_alloc_size(sizeof(ZSTD_CDict)) + + (dictLoadMethod == ZSTD_dlm_byRef ? 0 + : ZSTD_cwksp_alloc_size(ZSTD_cwksp_align(dictSize, sizeof(void*)))) + + ZSTD_cwksp_alloc_size(HUF_WORKSPACE_SIZE) + + matchStateSize; + ZSTD_CDict* cdict; + ZSTD_CCtx_params params; + + if ((size_t)workspace & 7) return NULL; /* 8-aligned */ + + { + ZSTD_cwksp ws; + ZSTD_cwksp_init(&ws, workspace, workspaceSize, ZSTD_cwksp_static_alloc); + cdict = (ZSTD_CDict*)ZSTD_cwksp_reserve_object(&ws, sizeof(ZSTD_CDict)); + if (cdict == NULL) return NULL; + ZSTD_cwksp_move(&cdict->workspace, &ws); + } + + DEBUGLOG(4, "(workspaceSize < neededSize) : (%u < %u) => %u", + (unsigned)workspaceSize, (unsigned)neededSize, (unsigned)(workspaceSize < neededSize)); + if (workspaceSize < neededSize) return NULL; + + ZSTD_CCtxParams_init(¶ms, 0); + params.cParams = cParams; + params.useRowMatchFinder = useRowMatchFinder; + cdict->useRowMatchFinder = useRowMatchFinder; + cdict->compressionLevel = ZSTD_NO_CLEVEL; + + if (ZSTD_isError( ZSTD_initCDict_internal(cdict, + dict, dictSize, + dictLoadMethod, dictContentType, + params) )) + return NULL; + + return cdict; +} + +ZSTD_compressionParameters ZSTD_getCParamsFromCDict(const ZSTD_CDict* cdict) +{ + assert(cdict != NULL); + return cdict->matchState.cParams; +} + +/*! ZSTD_getDictID_fromCDict() : + * Provides the dictID of the dictionary loaded into `cdict`. + * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ +unsigned ZSTD_getDictID_fromCDict(const ZSTD_CDict* cdict) +{ + if (cdict==NULL) return 0; + return cdict->dictID; +} + +/* ZSTD_compressBegin_usingCDict_internal() : + * Implementation of various ZSTD_compressBegin_usingCDict* functions. + */ +static size_t ZSTD_compressBegin_usingCDict_internal( + ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict, + ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize) +{ + ZSTD_CCtx_params cctxParams; + DEBUGLOG(4, "ZSTD_compressBegin_usingCDict_internal"); + RETURN_ERROR_IF(cdict==NULL, dictionary_wrong, "NULL pointer!"); + /* Initialize the cctxParams from the cdict */ + { + ZSTD_parameters params; + params.fParams = fParams; + params.cParams = ( pledgedSrcSize < ZSTD_USE_CDICT_PARAMS_SRCSIZE_CUTOFF + || pledgedSrcSize < cdict->dictContentSize * ZSTD_USE_CDICT_PARAMS_DICTSIZE_MULTIPLIER + || pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN + || cdict->compressionLevel == 0 ) ? + ZSTD_getCParamsFromCDict(cdict) + : ZSTD_getCParams(cdict->compressionLevel, + pledgedSrcSize, + cdict->dictContentSize); + ZSTD_CCtxParams_init_internal(&cctxParams, ¶ms, cdict->compressionLevel); + } + /* Increase window log to fit the entire dictionary and source if the + * source size is known. Limit the increase to 19, which is the + * window log for compression level 1 with the largest source size. + */ + if (pledgedSrcSize != ZSTD_CONTENTSIZE_UNKNOWN) { + U32 const limitedSrcSize = (U32)MIN(pledgedSrcSize, 1U << 19); + U32 const limitedSrcLog = limitedSrcSize > 1 ? ZSTD_highbit32(limitedSrcSize - 1) + 1 : 1; + cctxParams.cParams.windowLog = MAX(cctxParams.cParams.windowLog, limitedSrcLog); + } + return ZSTD_compressBegin_internal(cctx, + NULL, 0, ZSTD_dct_auto, ZSTD_dtlm_fast, + cdict, + &cctxParams, pledgedSrcSize, + ZSTDb_not_buffered); +} + + +/* ZSTD_compressBegin_usingCDict_advanced() : + * This function is DEPRECATED. + * cdict must be != NULL */ +size_t ZSTD_compressBegin_usingCDict_advanced( + ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict, + ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize) +{ + return ZSTD_compressBegin_usingCDict_internal(cctx, cdict, fParams, pledgedSrcSize); +} + +/* ZSTD_compressBegin_usingCDict() : + * cdict must be != NULL */ +size_t ZSTD_compressBegin_usingCDict_deprecated(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict) +{ + ZSTD_frameParameters const fParams = { 0 /*content*/, 0 /*checksum*/, 0 /*noDictID*/ }; + return ZSTD_compressBegin_usingCDict_internal(cctx, cdict, fParams, ZSTD_CONTENTSIZE_UNKNOWN); +} + +size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict) +{ + return ZSTD_compressBegin_usingCDict_deprecated(cctx, cdict); +} + +/*! ZSTD_compress_usingCDict_internal(): + * Implementation of various ZSTD_compress_usingCDict* functions. + */ +static size_t ZSTD_compress_usingCDict_internal(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_CDict* cdict, ZSTD_frameParameters fParams) +{ + FORWARD_IF_ERROR(ZSTD_compressBegin_usingCDict_internal(cctx, cdict, fParams, srcSize), ""); /* will check if cdict != NULL */ + return ZSTD_compressEnd_public(cctx, dst, dstCapacity, src, srcSize); +} + +/*! ZSTD_compress_usingCDict_advanced(): + * This function is DEPRECATED. + */ +size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_CDict* cdict, ZSTD_frameParameters fParams) +{ + return ZSTD_compress_usingCDict_internal(cctx, dst, dstCapacity, src, srcSize, cdict, fParams); +} + +/*! ZSTD_compress_usingCDict() : + * Compression using a digested Dictionary. + * Faster startup than ZSTD_compress_usingDict(), recommended when same dictionary is used multiple times. + * Note that compression parameters are decided at CDict creation time + * while frame parameters are hardcoded */ +size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_CDict* cdict) +{ + ZSTD_frameParameters const fParams = { 1 /*content*/, 0 /*checksum*/, 0 /*noDictID*/ }; + return ZSTD_compress_usingCDict_internal(cctx, dst, dstCapacity, src, srcSize, cdict, fParams); +} + + + +/* ****************************************************************** +* Streaming +********************************************************************/ + +ZSTD_CStream* ZSTD_createCStream(void) +{ + DEBUGLOG(3, "ZSTD_createCStream"); + return ZSTD_createCStream_advanced(ZSTD_defaultCMem); +} + +ZSTD_CStream* ZSTD_initStaticCStream(void *workspace, size_t workspaceSize) +{ + return ZSTD_initStaticCCtx(workspace, workspaceSize); +} + +ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem) +{ /* CStream and CCtx are now same object */ + return ZSTD_createCCtx_advanced(customMem); +} + +size_t ZSTD_freeCStream(ZSTD_CStream* zcs) +{ + return ZSTD_freeCCtx(zcs); /* same object */ +} + + + +/*====== Initialization ======*/ + +size_t ZSTD_CStreamInSize(void) { return ZSTD_BLOCKSIZE_MAX; } + +size_t ZSTD_CStreamOutSize(void) +{ + return ZSTD_compressBound(ZSTD_BLOCKSIZE_MAX) + ZSTD_blockHeaderSize + 4 /* 32-bits hash */ ; +} + +static ZSTD_cParamMode_e ZSTD_getCParamMode(ZSTD_CDict const* cdict, ZSTD_CCtx_params const* params, U64 pledgedSrcSize) +{ + if (cdict != NULL && ZSTD_shouldAttachDict(cdict, params, pledgedSrcSize)) + return ZSTD_cpm_attachDict; + else + return ZSTD_cpm_noAttachDict; +} + +/* ZSTD_resetCStream(): + * pledgedSrcSize == 0 means "unknown" */ +size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pss) +{ + /* temporary : 0 interpreted as "unknown" during transition period. + * Users willing to specify "unknown" **must** use ZSTD_CONTENTSIZE_UNKNOWN. + * 0 will be interpreted as "empty" in the future. + */ + U64 const pledgedSrcSize = (pss==0) ? ZSTD_CONTENTSIZE_UNKNOWN : pss; + DEBUGLOG(4, "ZSTD_resetCStream: pledgedSrcSize = %u", (unsigned)pledgedSrcSize); + FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , ""); + FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) , ""); + return 0; +} + +/*! ZSTD_initCStream_internal() : + * Note : for lib/compress only. Used by zstdmt_compress.c. + * Assumption 1 : params are valid + * Assumption 2 : either dict, or cdict, is defined, not both */ +size_t ZSTD_initCStream_internal(ZSTD_CStream* zcs, + const void* dict, size_t dictSize, const ZSTD_CDict* cdict, + const ZSTD_CCtx_params* params, + unsigned long long pledgedSrcSize) +{ + DEBUGLOG(4, "ZSTD_initCStream_internal"); + FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , ""); + FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) , ""); + assert(!ZSTD_isError(ZSTD_checkCParams(params->cParams))); + zcs->requestedParams = *params; + assert(!((dict) && (cdict))); /* either dict or cdict, not both */ + if (dict) { + FORWARD_IF_ERROR( ZSTD_CCtx_loadDictionary(zcs, dict, dictSize) , ""); + } else { + /* Dictionary is cleared if !cdict */ + FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, cdict) , ""); + } + return 0; +} + +/* ZSTD_initCStream_usingCDict_advanced() : + * same as ZSTD_initCStream_usingCDict(), with control over frame parameters */ +size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, + const ZSTD_CDict* cdict, + ZSTD_frameParameters fParams, + unsigned long long pledgedSrcSize) +{ + DEBUGLOG(4, "ZSTD_initCStream_usingCDict_advanced"); + FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , ""); + FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) , ""); + zcs->requestedParams.fParams = fParams; + FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, cdict) , ""); + return 0; +} + +/* note : cdict must outlive compression session */ +size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict) +{ + DEBUGLOG(4, "ZSTD_initCStream_usingCDict"); + FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , ""); + FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, cdict) , ""); + return 0; +} + + +/* ZSTD_initCStream_advanced() : + * pledgedSrcSize must be exact. + * if srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. + * dict is loaded with default parameters ZSTD_dct_auto and ZSTD_dlm_byCopy. */ +size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, + const void* dict, size_t dictSize, + ZSTD_parameters params, unsigned long long pss) +{ + /* for compatibility with older programs relying on this behavior. + * Users should now specify ZSTD_CONTENTSIZE_UNKNOWN. + * This line will be removed in the future. + */ + U64 const pledgedSrcSize = (pss==0 && params.fParams.contentSizeFlag==0) ? ZSTD_CONTENTSIZE_UNKNOWN : pss; + DEBUGLOG(4, "ZSTD_initCStream_advanced"); + FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , ""); + FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) , ""); + FORWARD_IF_ERROR( ZSTD_checkCParams(params.cParams) , ""); + ZSTD_CCtxParams_setZstdParams(&zcs->requestedParams, ¶ms); + FORWARD_IF_ERROR( ZSTD_CCtx_loadDictionary(zcs, dict, dictSize) , ""); + return 0; +} + +size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, const void* dict, size_t dictSize, int compressionLevel) +{ + DEBUGLOG(4, "ZSTD_initCStream_usingDict"); + FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , ""); + FORWARD_IF_ERROR( ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel) , ""); + FORWARD_IF_ERROR( ZSTD_CCtx_loadDictionary(zcs, dict, dictSize) , ""); + return 0; +} + +size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, int compressionLevel, unsigned long long pss) +{ + /* temporary : 0 interpreted as "unknown" during transition period. + * Users willing to specify "unknown" **must** use ZSTD_CONTENTSIZE_UNKNOWN. + * 0 will be interpreted as "empty" in the future. + */ + U64 const pledgedSrcSize = (pss==0) ? ZSTD_CONTENTSIZE_UNKNOWN : pss; + DEBUGLOG(4, "ZSTD_initCStream_srcSize"); + FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , ""); + FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, NULL) , ""); + FORWARD_IF_ERROR( ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel) , ""); + FORWARD_IF_ERROR( ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize) , ""); + return 0; +} + +size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel) +{ + DEBUGLOG(4, "ZSTD_initCStream"); + FORWARD_IF_ERROR( ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only) , ""); + FORWARD_IF_ERROR( ZSTD_CCtx_refCDict(zcs, NULL) , ""); + FORWARD_IF_ERROR( ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel) , ""); + return 0; +} + +/*====== Compression ======*/ + +static size_t ZSTD_nextInputSizeHint(const ZSTD_CCtx* cctx) +{ + if (cctx->appliedParams.inBufferMode == ZSTD_bm_stable) { + return cctx->blockSize - cctx->stableIn_notConsumed; + } + assert(cctx->appliedParams.inBufferMode == ZSTD_bm_buffered); + { size_t hintInSize = cctx->inBuffTarget - cctx->inBuffPos; + if (hintInSize==0) hintInSize = cctx->blockSize; + return hintInSize; + } +} + +/** ZSTD_compressStream_generic(): + * internal function for all *compressStream*() variants + * @return : hint size for next input to complete ongoing block */ +static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, + ZSTD_outBuffer* output, + ZSTD_inBuffer* input, + ZSTD_EndDirective const flushMode) +{ + const char* const istart = (assert(input != NULL), (const char*)input->src); + const char* const iend = (istart != NULL) ? istart + input->size : istart; + const char* ip = (istart != NULL) ? istart + input->pos : istart; + char* const ostart = (assert(output != NULL), (char*)output->dst); + char* const oend = (ostart != NULL) ? ostart + output->size : ostart; + char* op = (ostart != NULL) ? ostart + output->pos : ostart; + U32 someMoreWork = 1; + + /* check expectations */ + DEBUGLOG(5, "ZSTD_compressStream_generic, flush=%i, srcSize = %zu", (int)flushMode, input->size - input->pos); + assert(zcs != NULL); + if (zcs->appliedParams.inBufferMode == ZSTD_bm_stable) { + assert(input->pos >= zcs->stableIn_notConsumed); + input->pos -= zcs->stableIn_notConsumed; + ip -= zcs->stableIn_notConsumed; + zcs->stableIn_notConsumed = 0; + } + if (zcs->appliedParams.inBufferMode == ZSTD_bm_buffered) { + assert(zcs->inBuff != NULL); + assert(zcs->inBuffSize > 0); + } + if (zcs->appliedParams.outBufferMode == ZSTD_bm_buffered) { + assert(zcs->outBuff != NULL); + assert(zcs->outBuffSize > 0); + } + if (input->src == NULL) assert(input->size == 0); + assert(input->pos <= input->size); + if (output->dst == NULL) assert(output->size == 0); + assert(output->pos <= output->size); + assert((U32)flushMode <= (U32)ZSTD_e_end); + + while (someMoreWork) { + switch(zcs->streamStage) + { + case zcss_init: + RETURN_ERROR(init_missing, "call ZSTD_initCStream() first!"); + + case zcss_load: + if ( (flushMode == ZSTD_e_end) + && ( (size_t)(oend-op) >= ZSTD_compressBound(iend-ip) /* Enough output space */ + || zcs->appliedParams.outBufferMode == ZSTD_bm_stable) /* OR we are allowed to return dstSizeTooSmall */ + && (zcs->inBuffPos == 0) ) { + /* shortcut to compression pass directly into output buffer */ + size_t const cSize = ZSTD_compressEnd_public(zcs, + op, oend-op, ip, iend-ip); + DEBUGLOG(4, "ZSTD_compressEnd : cSize=%u", (unsigned)cSize); + FORWARD_IF_ERROR(cSize, "ZSTD_compressEnd failed"); + ip = iend; + op += cSize; + zcs->frameEnded = 1; + ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + someMoreWork = 0; break; + } + /* complete loading into inBuffer in buffered mode */ + if (zcs->appliedParams.inBufferMode == ZSTD_bm_buffered) { + size_t const toLoad = zcs->inBuffTarget - zcs->inBuffPos; + size_t const loaded = ZSTD_limitCopy( + zcs->inBuff + zcs->inBuffPos, toLoad, + ip, iend-ip); + zcs->inBuffPos += loaded; + if (ip) ip += loaded; + if ( (flushMode == ZSTD_e_continue) + && (zcs->inBuffPos < zcs->inBuffTarget) ) { + /* not enough input to fill full block : stop here */ + someMoreWork = 0; break; + } + if ( (flushMode == ZSTD_e_flush) + && (zcs->inBuffPos == zcs->inToCompress) ) { + /* empty */ + someMoreWork = 0; break; + } + } else { + assert(zcs->appliedParams.inBufferMode == ZSTD_bm_stable); + if ( (flushMode == ZSTD_e_continue) + && ( (size_t)(iend - ip) < zcs->blockSize) ) { + /* can't compress a full block : stop here */ + zcs->stableIn_notConsumed = (size_t)(iend - ip); + ip = iend; /* pretend to have consumed input */ + someMoreWork = 0; break; + } + if ( (flushMode == ZSTD_e_flush) + && (ip == iend) ) { + /* empty */ + someMoreWork = 0; break; + } + } + /* compress current block (note : this stage cannot be stopped in the middle) */ + DEBUGLOG(5, "stream compression stage (flushMode==%u)", flushMode); + { int const inputBuffered = (zcs->appliedParams.inBufferMode == ZSTD_bm_buffered); + void* cDst; + size_t cSize; + size_t oSize = oend-op; + size_t const iSize = inputBuffered ? zcs->inBuffPos - zcs->inToCompress + : MIN((size_t)(iend - ip), zcs->blockSize); + if (oSize >= ZSTD_compressBound(iSize) || zcs->appliedParams.outBufferMode == ZSTD_bm_stable) + cDst = op; /* compress into output buffer, to skip flush stage */ + else + cDst = zcs->outBuff, oSize = zcs->outBuffSize; + if (inputBuffered) { + unsigned const lastBlock = (flushMode == ZSTD_e_end) && (ip==iend); + cSize = lastBlock ? + ZSTD_compressEnd_public(zcs, cDst, oSize, + zcs->inBuff + zcs->inToCompress, iSize) : + ZSTD_compressContinue_public(zcs, cDst, oSize, + zcs->inBuff + zcs->inToCompress, iSize); + FORWARD_IF_ERROR(cSize, "%s", lastBlock ? "ZSTD_compressEnd failed" : "ZSTD_compressContinue failed"); + zcs->frameEnded = lastBlock; + /* prepare next block */ + zcs->inBuffTarget = zcs->inBuffPos + zcs->blockSize; + if (zcs->inBuffTarget > zcs->inBuffSize) + zcs->inBuffPos = 0, zcs->inBuffTarget = zcs->blockSize; + DEBUGLOG(5, "inBuffTarget:%u / inBuffSize:%u", + (unsigned)zcs->inBuffTarget, (unsigned)zcs->inBuffSize); + if (!lastBlock) + assert(zcs->inBuffTarget <= zcs->inBuffSize); + zcs->inToCompress = zcs->inBuffPos; + } else { /* !inputBuffered, hence ZSTD_bm_stable */ + unsigned const lastBlock = (flushMode == ZSTD_e_end) && (ip + iSize == iend); + cSize = lastBlock ? + ZSTD_compressEnd_public(zcs, cDst, oSize, ip, iSize) : + ZSTD_compressContinue_public(zcs, cDst, oSize, ip, iSize); + /* Consume the input prior to error checking to mirror buffered mode. */ + if (ip) ip += iSize; + FORWARD_IF_ERROR(cSize, "%s", lastBlock ? "ZSTD_compressEnd failed" : "ZSTD_compressContinue failed"); + zcs->frameEnded = lastBlock; + if (lastBlock) assert(ip == iend); + } + if (cDst == op) { /* no need to flush */ + op += cSize; + if (zcs->frameEnded) { + DEBUGLOG(5, "Frame completed directly in outBuffer"); + someMoreWork = 0; + ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + } + break; + } + zcs->outBuffContentSize = cSize; + zcs->outBuffFlushedSize = 0; + zcs->streamStage = zcss_flush; /* pass-through to flush stage */ + } + ZSTD_FALLTHROUGH; + case zcss_flush: + DEBUGLOG(5, "flush stage"); + assert(zcs->appliedParams.outBufferMode == ZSTD_bm_buffered); + { size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize; + size_t const flushed = ZSTD_limitCopy(op, (size_t)(oend-op), + zcs->outBuff + zcs->outBuffFlushedSize, toFlush); + DEBUGLOG(5, "toFlush: %u into %u ==> flushed: %u", + (unsigned)toFlush, (unsigned)(oend-op), (unsigned)flushed); + if (flushed) + op += flushed; + zcs->outBuffFlushedSize += flushed; + if (toFlush!=flushed) { + /* flush not fully completed, presumably because dst is too small */ + assert(op==oend); + someMoreWork = 0; + break; + } + zcs->outBuffContentSize = zcs->outBuffFlushedSize = 0; + if (zcs->frameEnded) { + DEBUGLOG(5, "Frame completed on flush"); + someMoreWork = 0; + ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + break; + } + zcs->streamStage = zcss_load; + break; + } + + default: /* impossible */ + assert(0); + } + } + + input->pos = ip - istart; + output->pos = op - ostart; + if (zcs->frameEnded) return 0; + return ZSTD_nextInputSizeHint(zcs); +} + +static size_t ZSTD_nextInputSizeHint_MTorST(const ZSTD_CCtx* cctx) +{ +#ifdef ZSTD_MULTITHREAD + if (cctx->appliedParams.nbWorkers >= 1) { + assert(cctx->mtctx != NULL); + return ZSTDMT_nextInputSizeHint(cctx->mtctx); + } +#endif + return ZSTD_nextInputSizeHint(cctx); + +} + +size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input) +{ + FORWARD_IF_ERROR( ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue) , ""); + return ZSTD_nextInputSizeHint_MTorST(zcs); +} + +/* After a compression call set the expected input/output buffer. + * This is validated at the start of the next compression call. + */ +static void +ZSTD_setBufferExpectations(ZSTD_CCtx* cctx, const ZSTD_outBuffer* output, const ZSTD_inBuffer* input) +{ + DEBUGLOG(5, "ZSTD_setBufferExpectations (for advanced stable in/out modes)"); + if (cctx->appliedParams.inBufferMode == ZSTD_bm_stable) { + cctx->expectedInBuffer = *input; + } + if (cctx->appliedParams.outBufferMode == ZSTD_bm_stable) { + cctx->expectedOutBufferSize = output->size - output->pos; + } +} + +/* Validate that the input/output buffers match the expectations set by + * ZSTD_setBufferExpectations. + */ +static size_t ZSTD_checkBufferStability(ZSTD_CCtx const* cctx, + ZSTD_outBuffer const* output, + ZSTD_inBuffer const* input, + ZSTD_EndDirective endOp) +{ + if (cctx->appliedParams.inBufferMode == ZSTD_bm_stable) { + ZSTD_inBuffer const expect = cctx->expectedInBuffer; + if (expect.src != input->src || expect.pos != input->pos) + RETURN_ERROR(stabilityCondition_notRespected, "ZSTD_c_stableInBuffer enabled but input differs!"); + } + (void)endOp; + if (cctx->appliedParams.outBufferMode == ZSTD_bm_stable) { + size_t const outBufferSize = output->size - output->pos; + if (cctx->expectedOutBufferSize != outBufferSize) + RETURN_ERROR(stabilityCondition_notRespected, "ZSTD_c_stableOutBuffer enabled but output size differs!"); + } + return 0; +} + +static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, + ZSTD_EndDirective endOp, + size_t inSize) +{ + ZSTD_CCtx_params params = cctx->requestedParams; + ZSTD_prefixDict const prefixDict = cctx->prefixDict; + FORWARD_IF_ERROR( ZSTD_initLocalDict(cctx) , ""); /* Init the local dict if present. */ + ZSTD_memset(&cctx->prefixDict, 0, sizeof(cctx->prefixDict)); /* single usage */ + assert(prefixDict.dict==NULL || cctx->cdict==NULL); /* only one can be set */ + if (cctx->cdict && !cctx->localDict.cdict) { + /* Let the cdict's compression level take priority over the requested params. + * But do not take the cdict's compression level if the "cdict" is actually a localDict + * generated from ZSTD_initLocalDict(). + */ + params.compressionLevel = cctx->cdict->compressionLevel; + } + DEBUGLOG(4, "ZSTD_compressStream2 : transparent init stage"); + if (endOp == ZSTD_e_end) cctx->pledgedSrcSizePlusOne = inSize + 1; /* auto-determine pledgedSrcSize */ + + { size_t const dictSize = prefixDict.dict + ? prefixDict.dictSize + : (cctx->cdict ? cctx->cdict->dictContentSize : 0); + ZSTD_cParamMode_e const mode = ZSTD_getCParamMode(cctx->cdict, ¶ms, cctx->pledgedSrcSizePlusOne - 1); + params.cParams = ZSTD_getCParamsFromCCtxParams( + ¶ms, cctx->pledgedSrcSizePlusOne-1, + dictSize, mode); + } + + params.useBlockSplitter = ZSTD_resolveBlockSplitterMode(params.useBlockSplitter, ¶ms.cParams); + params.ldmParams.enableLdm = ZSTD_resolveEnableLdm(params.ldmParams.enableLdm, ¶ms.cParams); + params.useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params.useRowMatchFinder, ¶ms.cParams); + params.validateSequences = ZSTD_resolveExternalSequenceValidation(params.validateSequences); + params.maxBlockSize = ZSTD_resolveMaxBlockSize(params.maxBlockSize); + params.searchForExternalRepcodes = ZSTD_resolveExternalRepcodeSearch(params.searchForExternalRepcodes, params.compressionLevel); + +#ifdef ZSTD_MULTITHREAD + /* If external matchfinder is enabled, make sure to fail before checking job size (for consistency) */ + RETURN_ERROR_IF( + params.useSequenceProducer == 1 && params.nbWorkers >= 1, + parameter_combination_unsupported, + "External sequence producer isn't supported with nbWorkers >= 1" + ); + + if ((cctx->pledgedSrcSizePlusOne-1) <= ZSTDMT_JOBSIZE_MIN) { + params.nbWorkers = 0; /* do not invoke multi-threading when src size is too small */ + } + if (params.nbWorkers > 0) { +#if ZSTD_TRACE + cctx->traceCtx = (ZSTD_trace_compress_begin != NULL) ? ZSTD_trace_compress_begin(cctx) : 0; +#endif + /* mt context creation */ + if (cctx->mtctx == NULL) { + DEBUGLOG(4, "ZSTD_compressStream2: creating new mtctx for nbWorkers=%u", + params.nbWorkers); + cctx->mtctx = ZSTDMT_createCCtx_advanced((U32)params.nbWorkers, cctx->customMem, cctx->pool); + RETURN_ERROR_IF(cctx->mtctx == NULL, memory_allocation, "NULL pointer!"); + } + /* mt compression */ + DEBUGLOG(4, "call ZSTDMT_initCStream_internal as nbWorkers=%u", params.nbWorkers); + FORWARD_IF_ERROR( ZSTDMT_initCStream_internal( + cctx->mtctx, + prefixDict.dict, prefixDict.dictSize, prefixDict.dictContentType, + cctx->cdict, params, cctx->pledgedSrcSizePlusOne-1) , ""); + cctx->dictID = cctx->cdict ? cctx->cdict->dictID : 0; + cctx->dictContentSize = cctx->cdict ? cctx->cdict->dictContentSize : prefixDict.dictSize; + cctx->consumedSrcSize = 0; + cctx->producedCSize = 0; + cctx->streamStage = zcss_load; + cctx->appliedParams = params; + } else +#endif /* ZSTD_MULTITHREAD */ + { U64 const pledgedSrcSize = cctx->pledgedSrcSizePlusOne - 1; + assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams))); + FORWARD_IF_ERROR( ZSTD_compressBegin_internal(cctx, + prefixDict.dict, prefixDict.dictSize, prefixDict.dictContentType, ZSTD_dtlm_fast, + cctx->cdict, + ¶ms, pledgedSrcSize, + ZSTDb_buffered) , ""); + assert(cctx->appliedParams.nbWorkers == 0); + cctx->inToCompress = 0; + cctx->inBuffPos = 0; + if (cctx->appliedParams.inBufferMode == ZSTD_bm_buffered) { + /* for small input: avoid automatic flush on reaching end of block, since + * it would require to add a 3-bytes null block to end frame + */ + cctx->inBuffTarget = cctx->blockSize + (cctx->blockSize == pledgedSrcSize); + } else { + cctx->inBuffTarget = 0; + } + cctx->outBuffContentSize = cctx->outBuffFlushedSize = 0; + cctx->streamStage = zcss_load; + cctx->frameEnded = 0; + } + return 0; +} + +/* @return provides a minimum amount of data remaining to be flushed from internal buffers + */ +size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, + ZSTD_outBuffer* output, + ZSTD_inBuffer* input, + ZSTD_EndDirective endOp) +{ + DEBUGLOG(5, "ZSTD_compressStream2, endOp=%u ", (unsigned)endOp); + /* check conditions */ + RETURN_ERROR_IF(output->pos > output->size, dstSize_tooSmall, "invalid output buffer"); + RETURN_ERROR_IF(input->pos > input->size, srcSize_wrong, "invalid input buffer"); + RETURN_ERROR_IF((U32)endOp > (U32)ZSTD_e_end, parameter_outOfBound, "invalid endDirective"); + assert(cctx != NULL); + + /* transparent initialization stage */ + if (cctx->streamStage == zcss_init) { + size_t const inputSize = input->size - input->pos; /* no obligation to start from pos==0 */ + size_t const totalInputSize = inputSize + cctx->stableIn_notConsumed; + if ( (cctx->requestedParams.inBufferMode == ZSTD_bm_stable) /* input is presumed stable, across invocations */ + && (endOp == ZSTD_e_continue) /* no flush requested, more input to come */ + && (totalInputSize < ZSTD_BLOCKSIZE_MAX) ) { /* not even reached one block yet */ + if (cctx->stableIn_notConsumed) { /* not the first time */ + /* check stable source guarantees */ + RETURN_ERROR_IF(input->src != cctx->expectedInBuffer.src, stabilityCondition_notRespected, "stableInBuffer condition not respected: wrong src pointer"); + RETURN_ERROR_IF(input->pos != cctx->expectedInBuffer.size, stabilityCondition_notRespected, "stableInBuffer condition not respected: externally modified pos"); + } + /* pretend input was consumed, to give a sense forward progress */ + input->pos = input->size; + /* save stable inBuffer, for later control, and flush/end */ + cctx->expectedInBuffer = *input; + /* but actually input wasn't consumed, so keep track of position from where compression shall resume */ + cctx->stableIn_notConsumed += inputSize; + /* don't initialize yet, wait for the first block of flush() order, for better parameters adaptation */ + return ZSTD_FRAMEHEADERSIZE_MIN(cctx->requestedParams.format); /* at least some header to produce */ + } + FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, endOp, totalInputSize), "compressStream2 initialization failed"); + ZSTD_setBufferExpectations(cctx, output, input); /* Set initial buffer expectations now that we've initialized */ + } + /* end of transparent initialization stage */ + + FORWARD_IF_ERROR(ZSTD_checkBufferStability(cctx, output, input, endOp), "invalid buffers"); + /* compression stage */ +#ifdef ZSTD_MULTITHREAD + if (cctx->appliedParams.nbWorkers > 0) { + size_t flushMin; + if (cctx->cParamsChanged) { + ZSTDMT_updateCParams_whileCompressing(cctx->mtctx, &cctx->requestedParams); + cctx->cParamsChanged = 0; + } + if (cctx->stableIn_notConsumed) { + assert(cctx->appliedParams.inBufferMode == ZSTD_bm_stable); + /* some early data was skipped - make it available for consumption */ + assert(input->pos >= cctx->stableIn_notConsumed); + input->pos -= cctx->stableIn_notConsumed; + cctx->stableIn_notConsumed = 0; + } + for (;;) { + size_t const ipos = input->pos; + size_t const opos = output->pos; + flushMin = ZSTDMT_compressStream_generic(cctx->mtctx, output, input, endOp); + cctx->consumedSrcSize += (U64)(input->pos - ipos); + cctx->producedCSize += (U64)(output->pos - opos); + if ( ZSTD_isError(flushMin) + || (endOp == ZSTD_e_end && flushMin == 0) ) { /* compression completed */ + if (flushMin == 0) + ZSTD_CCtx_trace(cctx, 0); + ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only); + } + FORWARD_IF_ERROR(flushMin, "ZSTDMT_compressStream_generic failed"); + + if (endOp == ZSTD_e_continue) { + /* We only require some progress with ZSTD_e_continue, not maximal progress. + * We're done if we've consumed or produced any bytes, or either buffer is + * full. + */ + if (input->pos != ipos || output->pos != opos || input->pos == input->size || output->pos == output->size) + break; + } else { + assert(endOp == ZSTD_e_flush || endOp == ZSTD_e_end); + /* We require maximal progress. We're done when the flush is complete or the + * output buffer is full. + */ + if (flushMin == 0 || output->pos == output->size) + break; + } + } + DEBUGLOG(5, "completed ZSTD_compressStream2 delegating to ZSTDMT_compressStream_generic"); + /* Either we don't require maximum forward progress, we've finished the + * flush, or we are out of output space. + */ + assert(endOp == ZSTD_e_continue || flushMin == 0 || output->pos == output->size); + ZSTD_setBufferExpectations(cctx, output, input); + return flushMin; + } +#endif /* ZSTD_MULTITHREAD */ + FORWARD_IF_ERROR( ZSTD_compressStream_generic(cctx, output, input, endOp) , ""); + DEBUGLOG(5, "completed ZSTD_compressStream2"); + ZSTD_setBufferExpectations(cctx, output, input); + return cctx->outBuffContentSize - cctx->outBuffFlushedSize; /* remaining to flush */ +} + +size_t ZSTD_compressStream2_simpleArgs ( + ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, size_t* dstPos, + const void* src, size_t srcSize, size_t* srcPos, + ZSTD_EndDirective endOp) +{ + ZSTD_outBuffer output; + ZSTD_inBuffer input; + output.dst = dst; + output.size = dstCapacity; + output.pos = *dstPos; + input.src = src; + input.size = srcSize; + input.pos = *srcPos; + /* ZSTD_compressStream2() will check validity of dstPos and srcPos */ + { size_t const cErr = ZSTD_compressStream2(cctx, &output, &input, endOp); + *dstPos = output.pos; + *srcPos = input.pos; + return cErr; + } +} + +size_t ZSTD_compress2(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize) +{ + ZSTD_bufferMode_e const originalInBufferMode = cctx->requestedParams.inBufferMode; + ZSTD_bufferMode_e const originalOutBufferMode = cctx->requestedParams.outBufferMode; + DEBUGLOG(4, "ZSTD_compress2 (srcSize=%u)", (unsigned)srcSize); + ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only); + /* Enable stable input/output buffers. */ + cctx->requestedParams.inBufferMode = ZSTD_bm_stable; + cctx->requestedParams.outBufferMode = ZSTD_bm_stable; + { size_t oPos = 0; + size_t iPos = 0; + size_t const result = ZSTD_compressStream2_simpleArgs(cctx, + dst, dstCapacity, &oPos, + src, srcSize, &iPos, + ZSTD_e_end); + /* Reset to the original values. */ + cctx->requestedParams.inBufferMode = originalInBufferMode; + cctx->requestedParams.outBufferMode = originalOutBufferMode; + + FORWARD_IF_ERROR(result, "ZSTD_compressStream2_simpleArgs failed"); + if (result != 0) { /* compression not completed, due to lack of output space */ + assert(oPos == dstCapacity); + RETURN_ERROR(dstSize_tooSmall, ""); + } + assert(iPos == srcSize); /* all input is expected consumed */ + return oPos; + } +} + +/* ZSTD_validateSequence() : + * @offCode : is presumed to follow format required by ZSTD_storeSeq() + * @returns a ZSTD error code if sequence is not valid + */ +static size_t +ZSTD_validateSequence(U32 offCode, U32 matchLength, U32 minMatch, + size_t posInSrc, U32 windowLog, size_t dictSize, int useSequenceProducer) +{ + U32 const windowSize = 1u << windowLog; + /* posInSrc represents the amount of data the decoder would decode up to this point. + * As long as the amount of data decoded is less than or equal to window size, offsets may be + * larger than the total length of output decoded in order to reference the dict, even larger than + * window size. After output surpasses windowSize, we're limited to windowSize offsets again. + */ + size_t const offsetBound = posInSrc > windowSize ? (size_t)windowSize : posInSrc + (size_t)dictSize; + size_t const matchLenLowerBound = (minMatch == 3 || useSequenceProducer) ? 3 : 4; + RETURN_ERROR_IF(offCode > OFFSET_TO_OFFBASE(offsetBound), externalSequences_invalid, "Offset too large!"); + /* Validate maxNbSeq is large enough for the given matchLength and minMatch */ + RETURN_ERROR_IF(matchLength < matchLenLowerBound, externalSequences_invalid, "Matchlength too small for the minMatch"); + return 0; +} + +/* Returns an offset code, given a sequence's raw offset, the ongoing repcode array, and whether litLength == 0 */ +static U32 ZSTD_finalizeOffBase(U32 rawOffset, const U32 rep[ZSTD_REP_NUM], U32 ll0) +{ + U32 offBase = OFFSET_TO_OFFBASE(rawOffset); + + if (!ll0 && rawOffset == rep[0]) { + offBase = REPCODE1_TO_OFFBASE; + } else if (rawOffset == rep[1]) { + offBase = REPCODE_TO_OFFBASE(2 - ll0); + } else if (rawOffset == rep[2]) { + offBase = REPCODE_TO_OFFBASE(3 - ll0); + } else if (ll0 && rawOffset == rep[0] - 1) { + offBase = REPCODE3_TO_OFFBASE; + } + return offBase; +} + +size_t +ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, + ZSTD_sequencePosition* seqPos, + const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, + const void* src, size_t blockSize, + ZSTD_paramSwitch_e externalRepSearch) +{ + U32 idx = seqPos->idx; + U32 const startIdx = idx; + BYTE const* ip = (BYTE const*)(src); + const BYTE* const iend = ip + blockSize; + repcodes_t updatedRepcodes; + U32 dictSize; + + DEBUGLOG(5, "ZSTD_copySequencesToSeqStoreExplicitBlockDelim (blockSize = %zu)", blockSize); + + if (cctx->cdict) { + dictSize = (U32)cctx->cdict->dictContentSize; + } else if (cctx->prefixDict.dict) { + dictSize = (U32)cctx->prefixDict.dictSize; + } else { + dictSize = 0; + } + ZSTD_memcpy(updatedRepcodes.rep, cctx->blockState.prevCBlock->rep, sizeof(repcodes_t)); + for (; idx < inSeqsSize && (inSeqs[idx].matchLength != 0 || inSeqs[idx].offset != 0); ++idx) { + U32 const litLength = inSeqs[idx].litLength; + U32 const matchLength = inSeqs[idx].matchLength; + U32 offBase; + + if (externalRepSearch == ZSTD_ps_disable) { + offBase = OFFSET_TO_OFFBASE(inSeqs[idx].offset); + } else { + U32 const ll0 = (litLength == 0); + offBase = ZSTD_finalizeOffBase(inSeqs[idx].offset, updatedRepcodes.rep, ll0); + ZSTD_updateRep(updatedRepcodes.rep, offBase, ll0); + } + + DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offBase, matchLength, litLength); + if (cctx->appliedParams.validateSequences) { + seqPos->posInSrc += litLength + matchLength; + FORWARD_IF_ERROR(ZSTD_validateSequence(offBase, matchLength, cctx->appliedParams.cParams.minMatch, seqPos->posInSrc, + cctx->appliedParams.cParams.windowLog, dictSize, cctx->appliedParams.useSequenceProducer), + "Sequence validation failed"); + } + RETURN_ERROR_IF(idx - seqPos->idx >= cctx->seqStore.maxNbSeq, externalSequences_invalid, + "Not enough memory allocated. Try adjusting ZSTD_c_minMatch."); + ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offBase, matchLength); + ip += matchLength + litLength; + } + + /* If we skipped repcode search while parsing, we need to update repcodes now */ + assert(externalRepSearch != ZSTD_ps_auto); + assert(idx >= startIdx); + if (externalRepSearch == ZSTD_ps_disable && idx != startIdx) { + U32* const rep = updatedRepcodes.rep; + U32 lastSeqIdx = idx - 1; /* index of last non-block-delimiter sequence */ + + if (lastSeqIdx >= startIdx + 2) { + rep[2] = inSeqs[lastSeqIdx - 2].offset; + rep[1] = inSeqs[lastSeqIdx - 1].offset; + rep[0] = inSeqs[lastSeqIdx].offset; + } else if (lastSeqIdx == startIdx + 1) { + rep[2] = rep[0]; + rep[1] = inSeqs[lastSeqIdx - 1].offset; + rep[0] = inSeqs[lastSeqIdx].offset; + } else { + assert(lastSeqIdx == startIdx); + rep[2] = rep[1]; + rep[1] = rep[0]; + rep[0] = inSeqs[lastSeqIdx].offset; + } + } + + ZSTD_memcpy(cctx->blockState.nextCBlock->rep, updatedRepcodes.rep, sizeof(repcodes_t)); + + if (inSeqs[idx].litLength) { + DEBUGLOG(6, "Storing last literals of size: %u", inSeqs[idx].litLength); + ZSTD_storeLastLiterals(&cctx->seqStore, ip, inSeqs[idx].litLength); + ip += inSeqs[idx].litLength; + seqPos->posInSrc += inSeqs[idx].litLength; + } + RETURN_ERROR_IF(ip != iend, externalSequences_invalid, "Blocksize doesn't agree with block delimiter!"); + seqPos->idx = idx+1; + return 0; +} + +size_t +ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, + const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, + const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch) +{ + U32 idx = seqPos->idx; + U32 startPosInSequence = seqPos->posInSequence; + U32 endPosInSequence = seqPos->posInSequence + (U32)blockSize; + size_t dictSize; + BYTE const* ip = (BYTE const*)(src); + BYTE const* iend = ip + blockSize; /* May be adjusted if we decide to process fewer than blockSize bytes */ + repcodes_t updatedRepcodes; + U32 bytesAdjustment = 0; + U32 finalMatchSplit = 0; + + /* TODO(embg) support fast parsing mode in noBlockDelim mode */ + (void)externalRepSearch; + + if (cctx->cdict) { + dictSize = cctx->cdict->dictContentSize; + } else if (cctx->prefixDict.dict) { + dictSize = cctx->prefixDict.dictSize; + } else { + dictSize = 0; + } + DEBUGLOG(5, "ZSTD_copySequencesToSeqStoreNoBlockDelim: idx: %u PIS: %u blockSize: %zu", idx, startPosInSequence, blockSize); + DEBUGLOG(5, "Start seq: idx: %u (of: %u ml: %u ll: %u)", idx, inSeqs[idx].offset, inSeqs[idx].matchLength, inSeqs[idx].litLength); + ZSTD_memcpy(updatedRepcodes.rep, cctx->blockState.prevCBlock->rep, sizeof(repcodes_t)); + while (endPosInSequence && idx < inSeqsSize && !finalMatchSplit) { + const ZSTD_Sequence currSeq = inSeqs[idx]; + U32 litLength = currSeq.litLength; + U32 matchLength = currSeq.matchLength; + U32 const rawOffset = currSeq.offset; + U32 offBase; + + /* Modify the sequence depending on where endPosInSequence lies */ + if (endPosInSequence >= currSeq.litLength + currSeq.matchLength) { + if (startPosInSequence >= litLength) { + startPosInSequence -= litLength; + litLength = 0; + matchLength -= startPosInSequence; + } else { + litLength -= startPosInSequence; + } + /* Move to the next sequence */ + endPosInSequence -= currSeq.litLength + currSeq.matchLength; + startPosInSequence = 0; + } else { + /* This is the final (partial) sequence we're adding from inSeqs, and endPosInSequence + does not reach the end of the match. So, we have to split the sequence */ + DEBUGLOG(6, "Require a split: diff: %u, idx: %u PIS: %u", + currSeq.litLength + currSeq.matchLength - endPosInSequence, idx, endPosInSequence); + if (endPosInSequence > litLength) { + U32 firstHalfMatchLength; + litLength = startPosInSequence >= litLength ? 0 : litLength - startPosInSequence; + firstHalfMatchLength = endPosInSequence - startPosInSequence - litLength; + if (matchLength > blockSize && firstHalfMatchLength >= cctx->appliedParams.cParams.minMatch) { + /* Only ever split the match if it is larger than the block size */ + U32 secondHalfMatchLength = currSeq.matchLength + currSeq.litLength - endPosInSequence; + if (secondHalfMatchLength < cctx->appliedParams.cParams.minMatch) { + /* Move the endPosInSequence backward so that it creates match of minMatch length */ + endPosInSequence -= cctx->appliedParams.cParams.minMatch - secondHalfMatchLength; + bytesAdjustment = cctx->appliedParams.cParams.minMatch - secondHalfMatchLength; + firstHalfMatchLength -= bytesAdjustment; + } + matchLength = firstHalfMatchLength; + /* Flag that we split the last match - after storing the sequence, exit the loop, + but keep the value of endPosInSequence */ + finalMatchSplit = 1; + } else { + /* Move the position in sequence backwards so that we don't split match, and break to store + * the last literals. We use the original currSeq.litLength as a marker for where endPosInSequence + * should go. We prefer to do this whenever it is not necessary to split the match, or if doing so + * would cause the first half of the match to be too small + */ + bytesAdjustment = endPosInSequence - currSeq.litLength; + endPosInSequence = currSeq.litLength; + break; + } + } else { + /* This sequence ends inside the literals, break to store the last literals */ + break; + } + } + /* Check if this offset can be represented with a repcode */ + { U32 const ll0 = (litLength == 0); + offBase = ZSTD_finalizeOffBase(rawOffset, updatedRepcodes.rep, ll0); + ZSTD_updateRep(updatedRepcodes.rep, offBase, ll0); + } + + if (cctx->appliedParams.validateSequences) { + seqPos->posInSrc += litLength + matchLength; + FORWARD_IF_ERROR(ZSTD_validateSequence(offBase, matchLength, cctx->appliedParams.cParams.minMatch, seqPos->posInSrc, + cctx->appliedParams.cParams.windowLog, dictSize, cctx->appliedParams.useSequenceProducer), + "Sequence validation failed"); + } + DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offBase, matchLength, litLength); + RETURN_ERROR_IF(idx - seqPos->idx >= cctx->seqStore.maxNbSeq, externalSequences_invalid, + "Not enough memory allocated. Try adjusting ZSTD_c_minMatch."); + ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offBase, matchLength); + ip += matchLength + litLength; + if (!finalMatchSplit) + idx++; /* Next Sequence */ + } + DEBUGLOG(5, "Ending seq: idx: %u (of: %u ml: %u ll: %u)", idx, inSeqs[idx].offset, inSeqs[idx].matchLength, inSeqs[idx].litLength); + assert(idx == inSeqsSize || endPosInSequence <= inSeqs[idx].litLength + inSeqs[idx].matchLength); + seqPos->idx = idx; + seqPos->posInSequence = endPosInSequence; + ZSTD_memcpy(cctx->blockState.nextCBlock->rep, updatedRepcodes.rep, sizeof(repcodes_t)); + + iend -= bytesAdjustment; + if (ip != iend) { + /* Store any last literals */ + U32 lastLLSize = (U32)(iend - ip); + assert(ip <= iend); + DEBUGLOG(6, "Storing last literals of size: %u", lastLLSize); + ZSTD_storeLastLiterals(&cctx->seqStore, ip, lastLLSize); + seqPos->posInSrc += lastLLSize; + } + + return bytesAdjustment; +} + +typedef size_t (*ZSTD_sequenceCopier) (ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, + const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, + const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch); +static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode) +{ + ZSTD_sequenceCopier sequenceCopier = NULL; + assert(ZSTD_cParam_withinBounds(ZSTD_c_blockDelimiters, mode)); + if (mode == ZSTD_sf_explicitBlockDelimiters) { + return ZSTD_copySequencesToSeqStoreExplicitBlockDelim; + } else if (mode == ZSTD_sf_noBlockDelimiters) { + return ZSTD_copySequencesToSeqStoreNoBlockDelim; + } + assert(sequenceCopier != NULL); + return sequenceCopier; +} + +/* Discover the size of next block by searching for the delimiter. + * Note that a block delimiter **must** exist in this mode, + * otherwise it's an input error. + * The block size retrieved will be later compared to ensure it remains within bounds */ +static size_t +blockSize_explicitDelimiter(const ZSTD_Sequence* inSeqs, size_t inSeqsSize, ZSTD_sequencePosition seqPos) +{ + int end = 0; + size_t blockSize = 0; + size_t spos = seqPos.idx; + DEBUGLOG(6, "blockSize_explicitDelimiter : seq %zu / %zu", spos, inSeqsSize); + assert(spos <= inSeqsSize); + while (spos < inSeqsSize) { + end = (inSeqs[spos].offset == 0); + blockSize += inSeqs[spos].litLength + inSeqs[spos].matchLength; + if (end) { + if (inSeqs[spos].matchLength != 0) + RETURN_ERROR(externalSequences_invalid, "delimiter format error : both matchlength and offset must be == 0"); + break; + } + spos++; + } + if (!end) + RETURN_ERROR(externalSequences_invalid, "Reached end of sequences without finding a block delimiter"); + return blockSize; +} + +/* More a "target" block size */ +static size_t blockSize_noDelimiter(size_t blockSize, size_t remaining) +{ + int const lastBlock = (remaining <= blockSize); + return lastBlock ? remaining : blockSize; +} + +static size_t determine_blockSize(ZSTD_sequenceFormat_e mode, + size_t blockSize, size_t remaining, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, ZSTD_sequencePosition seqPos) +{ + DEBUGLOG(6, "determine_blockSize : remainingSize = %zu", remaining); + if (mode == ZSTD_sf_noBlockDelimiters) + return blockSize_noDelimiter(blockSize, remaining); + { size_t const explicitBlockSize = blockSize_explicitDelimiter(inSeqs, inSeqsSize, seqPos); + FORWARD_IF_ERROR(explicitBlockSize, "Error while determining block size with explicit delimiters"); + if (explicitBlockSize > blockSize) + RETURN_ERROR(externalSequences_invalid, "sequences incorrectly define a too large block"); + if (explicitBlockSize > remaining) + RETURN_ERROR(externalSequences_invalid, "sequences define a frame longer than source"); + return explicitBlockSize; + } +} + +/* Compress, block-by-block, all of the sequences given. + * + * Returns the cumulative size of all compressed blocks (including their headers), + * otherwise a ZSTD error. + */ +static size_t +ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, + const void* src, size_t srcSize) +{ + size_t cSize = 0; + size_t remaining = srcSize; + ZSTD_sequencePosition seqPos = {0, 0, 0}; + + BYTE const* ip = (BYTE const*)src; + BYTE* op = (BYTE*)dst; + ZSTD_sequenceCopier const sequenceCopier = ZSTD_selectSequenceCopier(cctx->appliedParams.blockDelimiters); + + DEBUGLOG(4, "ZSTD_compressSequences_internal srcSize: %zu, inSeqsSize: %zu", srcSize, inSeqsSize); + /* Special case: empty frame */ + if (remaining == 0) { + U32 const cBlockHeader24 = 1 /* last block */ + (((U32)bt_raw)<<1); + RETURN_ERROR_IF(dstCapacity<4, dstSize_tooSmall, "No room for empty frame block header"); + MEM_writeLE32(op, cBlockHeader24); + op += ZSTD_blockHeaderSize; + dstCapacity -= ZSTD_blockHeaderSize; + cSize += ZSTD_blockHeaderSize; + } + + while (remaining) { + size_t compressedSeqsSize; + size_t cBlockSize; + size_t additionalByteAdjustment; + size_t blockSize = determine_blockSize(cctx->appliedParams.blockDelimiters, + cctx->blockSize, remaining, + inSeqs, inSeqsSize, seqPos); + U32 const lastBlock = (blockSize == remaining); + FORWARD_IF_ERROR(blockSize, "Error while trying to determine block size"); + assert(blockSize <= remaining); + ZSTD_resetSeqStore(&cctx->seqStore); + DEBUGLOG(5, "Working on new block. Blocksize: %zu (total:%zu)", blockSize, (ip - (const BYTE*)src) + blockSize); + + additionalByteAdjustment = sequenceCopier(cctx, &seqPos, inSeqs, inSeqsSize, ip, blockSize, cctx->appliedParams.searchForExternalRepcodes); + FORWARD_IF_ERROR(additionalByteAdjustment, "Bad sequence copy"); + blockSize -= additionalByteAdjustment; + + /* If blocks are too small, emit as a nocompress block */ + /* TODO: See 3090. We reduced MIN_CBLOCK_SIZE from 3 to 2 so to compensate we are adding + * additional 1. We need to revisit and change this logic to be more consistent */ + if (blockSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1+1) { + cBlockSize = ZSTD_noCompressBlock(op, dstCapacity, ip, blockSize, lastBlock); + FORWARD_IF_ERROR(cBlockSize, "Nocompress block failed"); + DEBUGLOG(5, "Block too small, writing out nocompress block: cSize: %zu", cBlockSize); + cSize += cBlockSize; + ip += blockSize; + op += cBlockSize; + remaining -= blockSize; + dstCapacity -= cBlockSize; + continue; + } + + RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize, dstSize_tooSmall, "not enough dstCapacity to write a new compressed block"); + compressedSeqsSize = ZSTD_entropyCompressSeqStore(&cctx->seqStore, + &cctx->blockState.prevCBlock->entropy, &cctx->blockState.nextCBlock->entropy, + &cctx->appliedParams, + op + ZSTD_blockHeaderSize /* Leave space for block header */, dstCapacity - ZSTD_blockHeaderSize, + blockSize, + cctx->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */, + cctx->bmi2); + FORWARD_IF_ERROR(compressedSeqsSize, "Compressing sequences of block failed"); + DEBUGLOG(5, "Compressed sequences size: %zu", compressedSeqsSize); + + if (!cctx->isFirstBlock && + ZSTD_maybeRLE(&cctx->seqStore) && + ZSTD_isRLE(ip, blockSize)) { + /* We don't want to emit our first block as a RLE even if it qualifies because + * doing so will cause the decoder (cli only) to throw a "should consume all input error." + * This is only an issue for zstd <= v1.4.3 + */ + compressedSeqsSize = 1; + } + + if (compressedSeqsSize == 0) { + /* ZSTD_noCompressBlock writes the block header as well */ + cBlockSize = ZSTD_noCompressBlock(op, dstCapacity, ip, blockSize, lastBlock); + FORWARD_IF_ERROR(cBlockSize, "ZSTD_noCompressBlock failed"); + DEBUGLOG(5, "Writing out nocompress block, size: %zu", cBlockSize); + } else if (compressedSeqsSize == 1) { + cBlockSize = ZSTD_rleCompressBlock(op, dstCapacity, *ip, blockSize, lastBlock); + FORWARD_IF_ERROR(cBlockSize, "ZSTD_rleCompressBlock failed"); + DEBUGLOG(5, "Writing out RLE block, size: %zu", cBlockSize); + } else { + U32 cBlockHeader; + /* Error checking and repcodes update */ + ZSTD_blockState_confirmRepcodesAndEntropyTables(&cctx->blockState); + if (cctx->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid) + cctx->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check; + + /* Write block header into beginning of block*/ + cBlockHeader = lastBlock + (((U32)bt_compressed)<<1) + (U32)(compressedSeqsSize << 3); + MEM_writeLE24(op, cBlockHeader); + cBlockSize = ZSTD_blockHeaderSize + compressedSeqsSize; + DEBUGLOG(5, "Writing out compressed block, size: %zu", cBlockSize); + } + + cSize += cBlockSize; + + if (lastBlock) { + break; + } else { + ip += blockSize; + op += cBlockSize; + remaining -= blockSize; + dstCapacity -= cBlockSize; + cctx->isFirstBlock = 0; + } + DEBUGLOG(5, "cSize running total: %zu (remaining dstCapacity=%zu)", cSize, dstCapacity); + } + + DEBUGLOG(4, "cSize final total: %zu", cSize); + return cSize; +} + +size_t ZSTD_compressSequences(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, + const void* src, size_t srcSize) +{ + BYTE* op = (BYTE*)dst; + size_t cSize = 0; + size_t compressedBlocksSize = 0; + size_t frameHeaderSize = 0; + + /* Transparent initialization stage, same as compressStream2() */ + DEBUGLOG(4, "ZSTD_compressSequences (dstCapacity=%zu)", dstCapacity); + assert(cctx != NULL); + FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, ZSTD_e_end, srcSize), "CCtx initialization failed"); + /* Begin writing output, starting with frame header */ + frameHeaderSize = ZSTD_writeFrameHeader(op, dstCapacity, &cctx->appliedParams, srcSize, cctx->dictID); + op += frameHeaderSize; + dstCapacity -= frameHeaderSize; + cSize += frameHeaderSize; + if (cctx->appliedParams.fParams.checksumFlag && srcSize) { + XXH64_update(&cctx->xxhState, src, srcSize); + } + /* cSize includes block header size and compressed sequences size */ + compressedBlocksSize = ZSTD_compressSequences_internal(cctx, + op, dstCapacity, + inSeqs, inSeqsSize, + src, srcSize); + FORWARD_IF_ERROR(compressedBlocksSize, "Compressing blocks failed!"); + cSize += compressedBlocksSize; + dstCapacity -= compressedBlocksSize; + + if (cctx->appliedParams.fParams.checksumFlag) { + U32 const checksum = (U32) XXH64_digest(&cctx->xxhState); + RETURN_ERROR_IF(dstCapacity<4, dstSize_tooSmall, "no room for checksum"); + DEBUGLOG(4, "Write checksum : %08X", (unsigned)checksum); + MEM_writeLE32((char*)dst + cSize, checksum); + cSize += 4; + } + + DEBUGLOG(4, "Final compressed size: %zu", cSize); + return cSize; +} + +/*====== Finalize ======*/ + +static ZSTD_inBuffer inBuffer_forEndFlush(const ZSTD_CStream* zcs) +{ + const ZSTD_inBuffer nullInput = { NULL, 0, 0 }; + const int stableInput = (zcs->appliedParams.inBufferMode == ZSTD_bm_stable); + return stableInput ? zcs->expectedInBuffer : nullInput; +} + +/*! ZSTD_flushStream() : + * @return : amount of data remaining to flush */ +size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) +{ + ZSTD_inBuffer input = inBuffer_forEndFlush(zcs); + input.size = input.pos; /* do not ingest more input during flush */ + return ZSTD_compressStream2(zcs, output, &input, ZSTD_e_flush); +} + + +size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) +{ + ZSTD_inBuffer input = inBuffer_forEndFlush(zcs); + size_t const remainingToFlush = ZSTD_compressStream2(zcs, output, &input, ZSTD_e_end); + FORWARD_IF_ERROR(remainingToFlush , "ZSTD_compressStream2(,,ZSTD_e_end) failed"); + if (zcs->appliedParams.nbWorkers > 0) return remainingToFlush; /* minimal estimation */ + /* single thread mode : attempt to calculate remaining to flush more precisely */ + { size_t const lastBlockSize = zcs->frameEnded ? 0 : ZSTD_BLOCKHEADERSIZE; + size_t const checksumSize = (size_t)(zcs->frameEnded ? 0 : zcs->appliedParams.fParams.checksumFlag * 4); + size_t const toFlush = remainingToFlush + lastBlockSize + checksumSize; + DEBUGLOG(4, "ZSTD_endStream : remaining to flush : %u", (unsigned)toFlush); + return toFlush; + } +} + + +/*-===== Pre-defined compression levels =====-*/ +/**** start inlining clevels.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_CLEVELS_H +#define ZSTD_CLEVELS_H + +#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressionParameters */ +/**** skipping file: ../zstd.h ****/ + +/*-===== Pre-defined compression levels =====-*/ + +#define ZSTD_MAX_CLEVEL 22 + +#ifdef __GNUC__ +__attribute__((__unused__)) +#endif + +static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL+1] = { +{ /* "default" - for any srcSize > 256 KB */ + /* W, C, H, S, L, TL, strat */ + { 19, 12, 13, 1, 6, 1, ZSTD_fast }, /* base for negative levels */ + { 19, 13, 14, 1, 7, 0, ZSTD_fast }, /* level 1 */ + { 20, 15, 16, 1, 6, 0, ZSTD_fast }, /* level 2 */ + { 21, 16, 17, 1, 5, 0, ZSTD_dfast }, /* level 3 */ + { 21, 18, 18, 1, 5, 0, ZSTD_dfast }, /* level 4 */ + { 21, 18, 19, 3, 5, 2, ZSTD_greedy }, /* level 5 */ + { 21, 18, 19, 3, 5, 4, ZSTD_lazy }, /* level 6 */ + { 21, 19, 20, 4, 5, 8, ZSTD_lazy }, /* level 7 */ + { 21, 19, 20, 4, 5, 16, ZSTD_lazy2 }, /* level 8 */ + { 22, 20, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 9 */ + { 22, 21, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 10 */ + { 22, 21, 22, 6, 5, 16, ZSTD_lazy2 }, /* level 11 */ + { 22, 22, 23, 6, 5, 32, ZSTD_lazy2 }, /* level 12 */ + { 22, 22, 22, 4, 5, 32, ZSTD_btlazy2 }, /* level 13 */ + { 22, 22, 23, 5, 5, 32, ZSTD_btlazy2 }, /* level 14 */ + { 22, 23, 23, 6, 5, 32, ZSTD_btlazy2 }, /* level 15 */ + { 22, 22, 22, 5, 5, 48, ZSTD_btopt }, /* level 16 */ + { 23, 23, 22, 5, 4, 64, ZSTD_btopt }, /* level 17 */ + { 23, 23, 22, 6, 3, 64, ZSTD_btultra }, /* level 18 */ + { 23, 24, 22, 7, 3,256, ZSTD_btultra2}, /* level 19 */ + { 25, 25, 23, 7, 3,256, ZSTD_btultra2}, /* level 20 */ + { 26, 26, 24, 7, 3,512, ZSTD_btultra2}, /* level 21 */ + { 27, 27, 25, 9, 3,999, ZSTD_btultra2}, /* level 22 */ +}, +{ /* for srcSize <= 256 KB */ + /* W, C, H, S, L, T, strat */ + { 18, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ + { 18, 13, 14, 1, 6, 0, ZSTD_fast }, /* level 1 */ + { 18, 14, 14, 1, 5, 0, ZSTD_dfast }, /* level 2 */ + { 18, 16, 16, 1, 4, 0, ZSTD_dfast }, /* level 3 */ + { 18, 16, 17, 3, 5, 2, ZSTD_greedy }, /* level 4.*/ + { 18, 17, 18, 5, 5, 2, ZSTD_greedy }, /* level 5.*/ + { 18, 18, 19, 3, 5, 4, ZSTD_lazy }, /* level 6.*/ + { 18, 18, 19, 4, 4, 4, ZSTD_lazy }, /* level 7 */ + { 18, 18, 19, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */ + { 18, 18, 19, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */ + { 18, 18, 19, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */ + { 18, 18, 19, 5, 4, 12, ZSTD_btlazy2 }, /* level 11.*/ + { 18, 19, 19, 7, 4, 12, ZSTD_btlazy2 }, /* level 12.*/ + { 18, 18, 19, 4, 4, 16, ZSTD_btopt }, /* level 13 */ + { 18, 18, 19, 4, 3, 32, ZSTD_btopt }, /* level 14.*/ + { 18, 18, 19, 6, 3,128, ZSTD_btopt }, /* level 15.*/ + { 18, 19, 19, 6, 3,128, ZSTD_btultra }, /* level 16.*/ + { 18, 19, 19, 8, 3,256, ZSTD_btultra }, /* level 17.*/ + { 18, 19, 19, 6, 3,128, ZSTD_btultra2}, /* level 18.*/ + { 18, 19, 19, 8, 3,256, ZSTD_btultra2}, /* level 19.*/ + { 18, 19, 19, 10, 3,512, ZSTD_btultra2}, /* level 20.*/ + { 18, 19, 19, 12, 3,512, ZSTD_btultra2}, /* level 21.*/ + { 18, 19, 19, 13, 3,999, ZSTD_btultra2}, /* level 22.*/ +}, +{ /* for srcSize <= 128 KB */ + /* W, C, H, S, L, T, strat */ + { 17, 12, 12, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ + { 17, 12, 13, 1, 6, 0, ZSTD_fast }, /* level 1 */ + { 17, 13, 15, 1, 5, 0, ZSTD_fast }, /* level 2 */ + { 17, 15, 16, 2, 5, 0, ZSTD_dfast }, /* level 3 */ + { 17, 17, 17, 2, 4, 0, ZSTD_dfast }, /* level 4 */ + { 17, 16, 17, 3, 4, 2, ZSTD_greedy }, /* level 5 */ + { 17, 16, 17, 3, 4, 4, ZSTD_lazy }, /* level 6 */ + { 17, 16, 17, 3, 4, 8, ZSTD_lazy2 }, /* level 7 */ + { 17, 16, 17, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */ + { 17, 16, 17, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */ + { 17, 16, 17, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */ + { 17, 17, 17, 5, 4, 8, ZSTD_btlazy2 }, /* level 11 */ + { 17, 18, 17, 7, 4, 12, ZSTD_btlazy2 }, /* level 12 */ + { 17, 18, 17, 3, 4, 12, ZSTD_btopt }, /* level 13.*/ + { 17, 18, 17, 4, 3, 32, ZSTD_btopt }, /* level 14.*/ + { 17, 18, 17, 6, 3,256, ZSTD_btopt }, /* level 15.*/ + { 17, 18, 17, 6, 3,128, ZSTD_btultra }, /* level 16.*/ + { 17, 18, 17, 8, 3,256, ZSTD_btultra }, /* level 17.*/ + { 17, 18, 17, 10, 3,512, ZSTD_btultra }, /* level 18.*/ + { 17, 18, 17, 5, 3,256, ZSTD_btultra2}, /* level 19.*/ + { 17, 18, 17, 7, 3,512, ZSTD_btultra2}, /* level 20.*/ + { 17, 18, 17, 9, 3,512, ZSTD_btultra2}, /* level 21.*/ + { 17, 18, 17, 11, 3,999, ZSTD_btultra2}, /* level 22.*/ +}, +{ /* for srcSize <= 16 KB */ + /* W, C, H, S, L, T, strat */ + { 14, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ + { 14, 14, 15, 1, 5, 0, ZSTD_fast }, /* level 1 */ + { 14, 14, 15, 1, 4, 0, ZSTD_fast }, /* level 2 */ + { 14, 14, 15, 2, 4, 0, ZSTD_dfast }, /* level 3 */ + { 14, 14, 14, 4, 4, 2, ZSTD_greedy }, /* level 4 */ + { 14, 14, 14, 3, 4, 4, ZSTD_lazy }, /* level 5.*/ + { 14, 14, 14, 4, 4, 8, ZSTD_lazy2 }, /* level 6 */ + { 14, 14, 14, 6, 4, 8, ZSTD_lazy2 }, /* level 7 */ + { 14, 14, 14, 8, 4, 8, ZSTD_lazy2 }, /* level 8.*/ + { 14, 15, 14, 5, 4, 8, ZSTD_btlazy2 }, /* level 9.*/ + { 14, 15, 14, 9, 4, 8, ZSTD_btlazy2 }, /* level 10.*/ + { 14, 15, 14, 3, 4, 12, ZSTD_btopt }, /* level 11.*/ + { 14, 15, 14, 4, 3, 24, ZSTD_btopt }, /* level 12.*/ + { 14, 15, 14, 5, 3, 32, ZSTD_btultra }, /* level 13.*/ + { 14, 15, 15, 6, 3, 64, ZSTD_btultra }, /* level 14.*/ + { 14, 15, 15, 7, 3,256, ZSTD_btultra }, /* level 15.*/ + { 14, 15, 15, 5, 3, 48, ZSTD_btultra2}, /* level 16.*/ + { 14, 15, 15, 6, 3,128, ZSTD_btultra2}, /* level 17.*/ + { 14, 15, 15, 7, 3,256, ZSTD_btultra2}, /* level 18.*/ + { 14, 15, 15, 8, 3,256, ZSTD_btultra2}, /* level 19.*/ + { 14, 15, 15, 8, 3,512, ZSTD_btultra2}, /* level 20.*/ + { 14, 15, 15, 9, 3,512, ZSTD_btultra2}, /* level 21.*/ + { 14, 15, 15, 10, 3,999, ZSTD_btultra2}, /* level 22.*/ +}, +}; + + + +#endif /* ZSTD_CLEVELS_H */ +/**** ended inlining clevels.h ****/ + +int ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; } +int ZSTD_minCLevel(void) { return (int)-ZSTD_TARGETLENGTH_MAX; } +int ZSTD_defaultCLevel(void) { return ZSTD_CLEVEL_DEFAULT; } + +static ZSTD_compressionParameters ZSTD_dedicatedDictSearch_getCParams(int const compressionLevel, size_t const dictSize) +{ + ZSTD_compressionParameters cParams = ZSTD_getCParams_internal(compressionLevel, 0, dictSize, ZSTD_cpm_createCDict); + switch (cParams.strategy) { + case ZSTD_fast: + case ZSTD_dfast: + break; + case ZSTD_greedy: + case ZSTD_lazy: + case ZSTD_lazy2: + cParams.hashLog += ZSTD_LAZY_DDSS_BUCKET_LOG; + break; + case ZSTD_btlazy2: + case ZSTD_btopt: + case ZSTD_btultra: + case ZSTD_btultra2: + break; + } + return cParams; +} + +static int ZSTD_dedicatedDictSearch_isSupported( + ZSTD_compressionParameters const* cParams) +{ + return (cParams->strategy >= ZSTD_greedy) + && (cParams->strategy <= ZSTD_lazy2) + && (cParams->hashLog > cParams->chainLog) + && (cParams->chainLog <= 24); +} + +/** + * Reverses the adjustment applied to cparams when enabling dedicated dict + * search. This is used to recover the params set to be used in the working + * context. (Otherwise, those tables would also grow.) + */ +static void ZSTD_dedicatedDictSearch_revertCParams( + ZSTD_compressionParameters* cParams) { + switch (cParams->strategy) { + case ZSTD_fast: + case ZSTD_dfast: + break; + case ZSTD_greedy: + case ZSTD_lazy: + case ZSTD_lazy2: + cParams->hashLog -= ZSTD_LAZY_DDSS_BUCKET_LOG; + if (cParams->hashLog < ZSTD_HASHLOG_MIN) { + cParams->hashLog = ZSTD_HASHLOG_MIN; + } + break; + case ZSTD_btlazy2: + case ZSTD_btopt: + case ZSTD_btultra: + case ZSTD_btultra2: + break; + } +} + +static U64 ZSTD_getCParamRowSize(U64 srcSizeHint, size_t dictSize, ZSTD_cParamMode_e mode) +{ + switch (mode) { + case ZSTD_cpm_unknown: + case ZSTD_cpm_noAttachDict: + case ZSTD_cpm_createCDict: + break; + case ZSTD_cpm_attachDict: + dictSize = 0; + break; + default: + assert(0); + break; + } + { int const unknown = srcSizeHint == ZSTD_CONTENTSIZE_UNKNOWN; + size_t const addedSize = unknown && dictSize > 0 ? 500 : 0; + return unknown && dictSize == 0 ? ZSTD_CONTENTSIZE_UNKNOWN : srcSizeHint+dictSize+addedSize; + } +} + +/*! ZSTD_getCParams_internal() : + * @return ZSTD_compressionParameters structure for a selected compression level, srcSize and dictSize. + * Note: srcSizeHint 0 means 0, use ZSTD_CONTENTSIZE_UNKNOWN for unknown. + * Use dictSize == 0 for unknown or unused. + * Note: `mode` controls how we treat the `dictSize`. See docs for `ZSTD_cParamMode_e`. */ +static ZSTD_compressionParameters ZSTD_getCParams_internal(int compressionLevel, unsigned long long srcSizeHint, size_t dictSize, ZSTD_cParamMode_e mode) +{ + U64 const rSize = ZSTD_getCParamRowSize(srcSizeHint, dictSize, mode); + U32 const tableID = (rSize <= 256 KB) + (rSize <= 128 KB) + (rSize <= 16 KB); + int row; + DEBUGLOG(5, "ZSTD_getCParams_internal (cLevel=%i)", compressionLevel); + + /* row */ + if (compressionLevel == 0) row = ZSTD_CLEVEL_DEFAULT; /* 0 == default */ + else if (compressionLevel < 0) row = 0; /* entry 0 is baseline for fast mode */ + else if (compressionLevel > ZSTD_MAX_CLEVEL) row = ZSTD_MAX_CLEVEL; + else row = compressionLevel; + + { ZSTD_compressionParameters cp = ZSTD_defaultCParameters[tableID][row]; + DEBUGLOG(5, "ZSTD_getCParams_internal selected tableID: %u row: %u strat: %u", tableID, row, (U32)cp.strategy); + /* acceleration factor */ + if (compressionLevel < 0) { + int const clampedCompressionLevel = MAX(ZSTD_minCLevel(), compressionLevel); + cp.targetLength = (unsigned)(-clampedCompressionLevel); + } + /* refine parameters based on srcSize & dictSize */ + return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize, mode, ZSTD_ps_auto); + } +} + +/*! ZSTD_getCParams() : + * @return ZSTD_compressionParameters structure for a selected compression level, srcSize and dictSize. + * Size values are optional, provide 0 if not known or unused */ +ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long srcSizeHint, size_t dictSize) +{ + if (srcSizeHint == 0) srcSizeHint = ZSTD_CONTENTSIZE_UNKNOWN; + return ZSTD_getCParams_internal(compressionLevel, srcSizeHint, dictSize, ZSTD_cpm_unknown); +} + +/*! ZSTD_getParams() : + * same idea as ZSTD_getCParams() + * @return a `ZSTD_parameters` structure (instead of `ZSTD_compressionParameters`). + * Fields of `ZSTD_frameParameters` are set to default values */ +static ZSTD_parameters ZSTD_getParams_internal(int compressionLevel, unsigned long long srcSizeHint, size_t dictSize, ZSTD_cParamMode_e mode) { + ZSTD_parameters params; + ZSTD_compressionParameters const cParams = ZSTD_getCParams_internal(compressionLevel, srcSizeHint, dictSize, mode); + DEBUGLOG(5, "ZSTD_getParams (cLevel=%i)", compressionLevel); + ZSTD_memset(¶ms, 0, sizeof(params)); + params.cParams = cParams; + params.fParams.contentSizeFlag = 1; + return params; +} + +/*! ZSTD_getParams() : + * same idea as ZSTD_getCParams() + * @return a `ZSTD_parameters` structure (instead of `ZSTD_compressionParameters`). + * Fields of `ZSTD_frameParameters` are set to default values */ +ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long srcSizeHint, size_t dictSize) { + if (srcSizeHint == 0) srcSizeHint = ZSTD_CONTENTSIZE_UNKNOWN; + return ZSTD_getParams_internal(compressionLevel, srcSizeHint, dictSize, ZSTD_cpm_unknown); +} + +void ZSTD_registerSequenceProducer( + ZSTD_CCtx* zc, void* mState, + ZSTD_sequenceProducer_F* mFinder +) { + if (mFinder != NULL) { + ZSTD_externalMatchCtx emctx; + emctx.mState = mState; + emctx.mFinder = mFinder; + emctx.seqBuffer = NULL; + emctx.seqBufferCapacity = 0; + zc->externalMatchCtx = emctx; + zc->requestedParams.useSequenceProducer = 1; + } else { + ZSTD_memset(&zc->externalMatchCtx, 0, sizeof(zc->externalMatchCtx)); + zc->requestedParams.useSequenceProducer = 0; + } +} +/**** ended inlining compress/zstd_compress.c ****/ +/**** start inlining compress/zstd_double_fast.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/**** skipping file: zstd_compress_internal.h ****/ +/**** skipping file: zstd_double_fast.h ****/ + +static void ZSTD_fillDoubleHashTableForCDict(ZSTD_matchState_t* ms, + void const* end, ZSTD_dictTableLoadMethod_e dtlm) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashLarge = ms->hashTable; + U32 const hBitsL = cParams->hashLog + ZSTD_SHORT_CACHE_TAG_BITS; + U32 const mls = cParams->minMatch; + U32* const hashSmall = ms->chainTable; + U32 const hBitsS = cParams->chainLog + ZSTD_SHORT_CACHE_TAG_BITS; + const BYTE* const base = ms->window.base; + const BYTE* ip = base + ms->nextToUpdate; + const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE; + const U32 fastHashFillStep = 3; + + /* Always insert every fastHashFillStep position into the hash tables. + * Insert the other positions into the large hash table if their entry + * is empty. + */ + for (; ip + fastHashFillStep - 1 <= iend; ip += fastHashFillStep) { + U32 const curr = (U32)(ip - base); + U32 i; + for (i = 0; i < fastHashFillStep; ++i) { + size_t const smHashAndTag = ZSTD_hashPtr(ip + i, hBitsS, mls); + size_t const lgHashAndTag = ZSTD_hashPtr(ip + i, hBitsL, 8); + if (i == 0) { + ZSTD_writeTaggedIndex(hashSmall, smHashAndTag, curr + i); + } + if (i == 0 || hashLarge[lgHashAndTag >> ZSTD_SHORT_CACHE_TAG_BITS] == 0) { + ZSTD_writeTaggedIndex(hashLarge, lgHashAndTag, curr + i); + } + /* Only load extra positions for ZSTD_dtlm_full */ + if (dtlm == ZSTD_dtlm_fast) + break; + } } +} + +static void ZSTD_fillDoubleHashTableForCCtx(ZSTD_matchState_t* ms, + void const* end, ZSTD_dictTableLoadMethod_e dtlm) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashLarge = ms->hashTable; + U32 const hBitsL = cParams->hashLog; + U32 const mls = cParams->minMatch; + U32* const hashSmall = ms->chainTable; + U32 const hBitsS = cParams->chainLog; + const BYTE* const base = ms->window.base; + const BYTE* ip = base + ms->nextToUpdate; + const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE; + const U32 fastHashFillStep = 3; + + /* Always insert every fastHashFillStep position into the hash tables. + * Insert the other positions into the large hash table if their entry + * is empty. + */ + for (; ip + fastHashFillStep - 1 <= iend; ip += fastHashFillStep) { + U32 const curr = (U32)(ip - base); + U32 i; + for (i = 0; i < fastHashFillStep; ++i) { + size_t const smHash = ZSTD_hashPtr(ip + i, hBitsS, mls); + size_t const lgHash = ZSTD_hashPtr(ip + i, hBitsL, 8); + if (i == 0) + hashSmall[smHash] = curr + i; + if (i == 0 || hashLarge[lgHash] == 0) + hashLarge[lgHash] = curr + i; + /* Only load extra positions for ZSTD_dtlm_full */ + if (dtlm == ZSTD_dtlm_fast) + break; + } } +} + +void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, + const void* const end, + ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp) +{ + if (tfp == ZSTD_tfp_forCDict) { + ZSTD_fillDoubleHashTableForCDict(ms, end, dtlm); + } else { + ZSTD_fillDoubleHashTableForCCtx(ms, end, dtlm); + } +} + + +FORCE_INLINE_TEMPLATE +size_t ZSTD_compressBlock_doubleFast_noDict_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize, U32 const mls /* template */) +{ + ZSTD_compressionParameters const* cParams = &ms->cParams; + U32* const hashLong = ms->hashTable; + const U32 hBitsL = cParams->hashLog; + U32* const hashSmall = ms->chainTable; + const U32 hBitsS = cParams->chainLog; + const BYTE* const base = ms->window.base; + const BYTE* const istart = (const BYTE*)src; + const BYTE* anchor = istart; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + /* presumes that, if there is a dictionary, it must be using Attach mode */ + const U32 prefixLowestIndex = ZSTD_getLowestPrefixIndex(ms, endIndex, cParams->windowLog); + const BYTE* const prefixLowest = base + prefixLowestIndex; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = iend - HASH_READ_SIZE; + U32 offset_1=rep[0], offset_2=rep[1]; + U32 offsetSaved1 = 0, offsetSaved2 = 0; + + size_t mLength; + U32 offset; + U32 curr; + + /* how many positions to search before increasing step size */ + const size_t kStepIncr = 1 << kSearchStrength; + /* the position at which to increment the step size if no match is found */ + const BYTE* nextStep; + size_t step; /* the current step size */ + + size_t hl0; /* the long hash at ip */ + size_t hl1; /* the long hash at ip1 */ + + U32 idxl0; /* the long match index for ip */ + U32 idxl1; /* the long match index for ip1 */ + + const BYTE* matchl0; /* the long match for ip */ + const BYTE* matchs0; /* the short match for ip */ + const BYTE* matchl1; /* the long match for ip1 */ + + const BYTE* ip = istart; /* the current position */ + const BYTE* ip1; /* the next position */ + + DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_noDict_generic"); + + /* init */ + ip += ((ip - prefixLowest) == 0); + { + U32 const current = (U32)(ip - base); + U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, current, cParams->windowLog); + U32 const maxRep = current - windowLow; + if (offset_2 > maxRep) offsetSaved2 = offset_2, offset_2 = 0; + if (offset_1 > maxRep) offsetSaved1 = offset_1, offset_1 = 0; + } + + /* Outer Loop: one iteration per match found and stored */ + while (1) { + step = 1; + nextStep = ip + kStepIncr; + ip1 = ip + step; + + if (ip1 > ilimit) { + goto _cleanup; + } + + hl0 = ZSTD_hashPtr(ip, hBitsL, 8); + idxl0 = hashLong[hl0]; + matchl0 = base + idxl0; + + /* Inner Loop: one iteration per search / position */ + do { + const size_t hs0 = ZSTD_hashPtr(ip, hBitsS, mls); + const U32 idxs0 = hashSmall[hs0]; + curr = (U32)(ip-base); + matchs0 = base + idxs0; + + hashLong[hl0] = hashSmall[hs0] = curr; /* update hash tables */ + + /* check noDict repcode */ + if ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1))) { + mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4; + ip++; + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); + goto _match_stored; + } + + hl1 = ZSTD_hashPtr(ip1, hBitsL, 8); + + if (idxl0 > prefixLowestIndex) { + /* check prefix long match */ + if (MEM_read64(matchl0) == MEM_read64(ip)) { + mLength = ZSTD_count(ip+8, matchl0+8, iend) + 8; + offset = (U32)(ip-matchl0); + while (((ip>anchor) & (matchl0>prefixLowest)) && (ip[-1] == matchl0[-1])) { ip--; matchl0--; mLength++; } /* catch up */ + goto _match_found; + } + } + + idxl1 = hashLong[hl1]; + matchl1 = base + idxl1; + + if (idxs0 > prefixLowestIndex) { + /* check prefix short match */ + if (MEM_read32(matchs0) == MEM_read32(ip)) { + goto _search_next_long; + } + } + + if (ip1 >= nextStep) { + PREFETCH_L1(ip1 + 64); + PREFETCH_L1(ip1 + 128); + step++; + nextStep += kStepIncr; + } + ip = ip1; + ip1 += step; + + hl0 = hl1; + idxl0 = idxl1; + matchl0 = matchl1; + #if defined(__aarch64__) + PREFETCH_L1(ip+256); + #endif + } while (ip1 <= ilimit); + +_cleanup: + /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0), + * rotate saved offsets. See comment in ZSTD_compressBlock_fast_noDict for more context. */ + offsetSaved2 = ((offsetSaved1 != 0) && (offset_1 != 0)) ? offsetSaved1 : offsetSaved2; + + /* save reps for next block */ + rep[0] = offset_1 ? offset_1 : offsetSaved1; + rep[1] = offset_2 ? offset_2 : offsetSaved2; + + /* Return the last literals size */ + return (size_t)(iend - anchor); + +_search_next_long: + + /* check prefix long +1 match */ + if (idxl1 > prefixLowestIndex) { + if (MEM_read64(matchl1) == MEM_read64(ip1)) { + ip = ip1; + mLength = ZSTD_count(ip+8, matchl1+8, iend) + 8; + offset = (U32)(ip-matchl1); + while (((ip>anchor) & (matchl1>prefixLowest)) && (ip[-1] == matchl1[-1])) { ip--; matchl1--; mLength++; } /* catch up */ + goto _match_found; + } + } + + /* if no long +1 match, explore the short match we found */ + mLength = ZSTD_count(ip+4, matchs0+4, iend) + 4; + offset = (U32)(ip - matchs0); + while (((ip>anchor) & (matchs0>prefixLowest)) && (ip[-1] == matchs0[-1])) { ip--; matchs0--; mLength++; } /* catch up */ + + /* fall-through */ + +_match_found: /* requires ip, offset, mLength */ + offset_2 = offset_1; + offset_1 = offset; + + if (step < 4) { + /* It is unsafe to write this value back to the hashtable when ip1 is + * greater than or equal to the new ip we will have after we're done + * processing this match. Rather than perform that test directly + * (ip1 >= ip + mLength), which costs speed in practice, we do a simpler + * more predictable test. The minmatch even if we take a short match is + * 4 bytes, so as long as step, the distance between ip and ip1 + * (initially) is less than 4, we know ip1 < new ip. */ + hashLong[hl1] = (U32)(ip1 - base); + } + + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + +_match_stored: + /* match found */ + ip += mLength; + anchor = ip; + + if (ip <= ilimit) { + /* Complementary insertion */ + /* done after iLimit test, as candidates could be > iend-8 */ + { U32 const indexToInsert = curr+2; + hashLong[ZSTD_hashPtr(base+indexToInsert, hBitsL, 8)] = indexToInsert; + hashLong[ZSTD_hashPtr(ip-2, hBitsL, 8)] = (U32)(ip-2-base); + hashSmall[ZSTD_hashPtr(base+indexToInsert, hBitsS, mls)] = indexToInsert; + hashSmall[ZSTD_hashPtr(ip-1, hBitsS, mls)] = (U32)(ip-1-base); + } + + /* check immediate repcode */ + while ( (ip <= ilimit) + && ( (offset_2>0) + & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) { + /* store sequence */ + size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4; + U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; /* swap offset_2 <=> offset_1 */ + hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip-base); + hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip-base); + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, rLength); + ip += rLength; + anchor = ip; + continue; /* faster when present ... (?) */ + } + } + } +} + + +FORCE_INLINE_TEMPLATE +size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize, + U32 const mls /* template */) +{ + ZSTD_compressionParameters const* cParams = &ms->cParams; + U32* const hashLong = ms->hashTable; + const U32 hBitsL = cParams->hashLog; + U32* const hashSmall = ms->chainTable; + const U32 hBitsS = cParams->chainLog; + const BYTE* const base = ms->window.base; + const BYTE* const istart = (const BYTE*)src; + const BYTE* ip = istart; + const BYTE* anchor = istart; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + /* presumes that, if there is a dictionary, it must be using Attach mode */ + const U32 prefixLowestIndex = ZSTD_getLowestPrefixIndex(ms, endIndex, cParams->windowLog); + const BYTE* const prefixLowest = base + prefixLowestIndex; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = iend - HASH_READ_SIZE; + U32 offset_1=rep[0], offset_2=rep[1]; + + const ZSTD_matchState_t* const dms = ms->dictMatchState; + const ZSTD_compressionParameters* const dictCParams = &dms->cParams; + const U32* const dictHashLong = dms->hashTable; + const U32* const dictHashSmall = dms->chainTable; + const U32 dictStartIndex = dms->window.dictLimit; + const BYTE* const dictBase = dms->window.base; + const BYTE* const dictStart = dictBase + dictStartIndex; + const BYTE* const dictEnd = dms->window.nextSrc; + const U32 dictIndexDelta = prefixLowestIndex - (U32)(dictEnd - dictBase); + const U32 dictHBitsL = dictCParams->hashLog + ZSTD_SHORT_CACHE_TAG_BITS; + const U32 dictHBitsS = dictCParams->chainLog + ZSTD_SHORT_CACHE_TAG_BITS; + const U32 dictAndPrefixLength = (U32)((ip - prefixLowest) + (dictEnd - dictStart)); + + DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_dictMatchState_generic"); + + /* if a dictionary is attached, it must be within window range */ + assert(ms->window.dictLimit + (1U << cParams->windowLog) >= endIndex); + + if (ms->prefetchCDictTables) { + size_t const hashTableBytes = (((size_t)1) << dictCParams->hashLog) * sizeof(U32); + size_t const chainTableBytes = (((size_t)1) << dictCParams->chainLog) * sizeof(U32); + PREFETCH_AREA(dictHashLong, hashTableBytes) + PREFETCH_AREA(dictHashSmall, chainTableBytes) + } + + /* init */ + ip += (dictAndPrefixLength == 0); + + /* dictMatchState repCode checks don't currently handle repCode == 0 + * disabling. */ + assert(offset_1 <= dictAndPrefixLength); + assert(offset_2 <= dictAndPrefixLength); + + /* Main Search Loop */ + while (ip < ilimit) { /* < instead of <=, because repcode check at (ip+1) */ + size_t mLength; + U32 offset; + size_t const h2 = ZSTD_hashPtr(ip, hBitsL, 8); + size_t const h = ZSTD_hashPtr(ip, hBitsS, mls); + size_t const dictHashAndTagL = ZSTD_hashPtr(ip, dictHBitsL, 8); + size_t const dictHashAndTagS = ZSTD_hashPtr(ip, dictHBitsS, mls); + U32 const dictMatchIndexAndTagL = dictHashLong[dictHashAndTagL >> ZSTD_SHORT_CACHE_TAG_BITS]; + U32 const dictMatchIndexAndTagS = dictHashSmall[dictHashAndTagS >> ZSTD_SHORT_CACHE_TAG_BITS]; + int const dictTagsMatchL = ZSTD_comparePackedTags(dictMatchIndexAndTagL, dictHashAndTagL); + int const dictTagsMatchS = ZSTD_comparePackedTags(dictMatchIndexAndTagS, dictHashAndTagS); + U32 const curr = (U32)(ip-base); + U32 const matchIndexL = hashLong[h2]; + U32 matchIndexS = hashSmall[h]; + const BYTE* matchLong = base + matchIndexL; + const BYTE* match = base + matchIndexS; + const U32 repIndex = curr + 1 - offset_1; + const BYTE* repMatch = (repIndex < prefixLowestIndex) ? + dictBase + (repIndex - dictIndexDelta) : + base + repIndex; + hashLong[h2] = hashSmall[h] = curr; /* update hash tables */ + + /* check repcode */ + if (((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */) + && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { + const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; + mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; + ip++; + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); + goto _match_stored; + } + + if (matchIndexL > prefixLowestIndex) { + /* check prefix long match */ + if (MEM_read64(matchLong) == MEM_read64(ip)) { + mLength = ZSTD_count(ip+8, matchLong+8, iend) + 8; + offset = (U32)(ip-matchLong); + while (((ip>anchor) & (matchLong>prefixLowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */ + goto _match_found; + } + } else if (dictTagsMatchL) { + /* check dictMatchState long match */ + U32 const dictMatchIndexL = dictMatchIndexAndTagL >> ZSTD_SHORT_CACHE_TAG_BITS; + const BYTE* dictMatchL = dictBase + dictMatchIndexL; + assert(dictMatchL < dictEnd); + + if (dictMatchL > dictStart && MEM_read64(dictMatchL) == MEM_read64(ip)) { + mLength = ZSTD_count_2segments(ip+8, dictMatchL+8, iend, dictEnd, prefixLowest) + 8; + offset = (U32)(curr - dictMatchIndexL - dictIndexDelta); + while (((ip>anchor) & (dictMatchL>dictStart)) && (ip[-1] == dictMatchL[-1])) { ip--; dictMatchL--; mLength++; } /* catch up */ + goto _match_found; + } } + + if (matchIndexS > prefixLowestIndex) { + /* check prefix short match */ + if (MEM_read32(match) == MEM_read32(ip)) { + goto _search_next_long; + } + } else if (dictTagsMatchS) { + /* check dictMatchState short match */ + U32 const dictMatchIndexS = dictMatchIndexAndTagS >> ZSTD_SHORT_CACHE_TAG_BITS; + match = dictBase + dictMatchIndexS; + matchIndexS = dictMatchIndexS + dictIndexDelta; + + if (match > dictStart && MEM_read32(match) == MEM_read32(ip)) { + goto _search_next_long; + } } + + ip += ((ip-anchor) >> kSearchStrength) + 1; +#if defined(__aarch64__) + PREFETCH_L1(ip+256); +#endif + continue; + +_search_next_long: + { size_t const hl3 = ZSTD_hashPtr(ip+1, hBitsL, 8); + size_t const dictHashAndTagL3 = ZSTD_hashPtr(ip+1, dictHBitsL, 8); + U32 const matchIndexL3 = hashLong[hl3]; + U32 const dictMatchIndexAndTagL3 = dictHashLong[dictHashAndTagL3 >> ZSTD_SHORT_CACHE_TAG_BITS]; + int const dictTagsMatchL3 = ZSTD_comparePackedTags(dictMatchIndexAndTagL3, dictHashAndTagL3); + const BYTE* matchL3 = base + matchIndexL3; + hashLong[hl3] = curr + 1; + + /* check prefix long +1 match */ + if (matchIndexL3 > prefixLowestIndex) { + if (MEM_read64(matchL3) == MEM_read64(ip+1)) { + mLength = ZSTD_count(ip+9, matchL3+8, iend) + 8; + ip++; + offset = (U32)(ip-matchL3); + while (((ip>anchor) & (matchL3>prefixLowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */ + goto _match_found; + } + } else if (dictTagsMatchL3) { + /* check dict long +1 match */ + U32 const dictMatchIndexL3 = dictMatchIndexAndTagL3 >> ZSTD_SHORT_CACHE_TAG_BITS; + const BYTE* dictMatchL3 = dictBase + dictMatchIndexL3; + assert(dictMatchL3 < dictEnd); + if (dictMatchL3 > dictStart && MEM_read64(dictMatchL3) == MEM_read64(ip+1)) { + mLength = ZSTD_count_2segments(ip+1+8, dictMatchL3+8, iend, dictEnd, prefixLowest) + 8; + ip++; + offset = (U32)(curr + 1 - dictMatchIndexL3 - dictIndexDelta); + while (((ip>anchor) & (dictMatchL3>dictStart)) && (ip[-1] == dictMatchL3[-1])) { ip--; dictMatchL3--; mLength++; } /* catch up */ + goto _match_found; + } } } + + /* if no long +1 match, explore the short match we found */ + if (matchIndexS < prefixLowestIndex) { + mLength = ZSTD_count_2segments(ip+4, match+4, iend, dictEnd, prefixLowest) + 4; + offset = (U32)(curr - matchIndexS); + while (((ip>anchor) & (match>dictStart)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ + } else { + mLength = ZSTD_count(ip+4, match+4, iend) + 4; + offset = (U32)(ip - match); + while (((ip>anchor) & (match>prefixLowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ + } + +_match_found: + offset_2 = offset_1; + offset_1 = offset; + + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + +_match_stored: + /* match found */ + ip += mLength; + anchor = ip; + + if (ip <= ilimit) { + /* Complementary insertion */ + /* done after iLimit test, as candidates could be > iend-8 */ + { U32 const indexToInsert = curr+2; + hashLong[ZSTD_hashPtr(base+indexToInsert, hBitsL, 8)] = indexToInsert; + hashLong[ZSTD_hashPtr(ip-2, hBitsL, 8)] = (U32)(ip-2-base); + hashSmall[ZSTD_hashPtr(base+indexToInsert, hBitsS, mls)] = indexToInsert; + hashSmall[ZSTD_hashPtr(ip-1, hBitsS, mls)] = (U32)(ip-1-base); + } + + /* check immediate repcode */ + while (ip <= ilimit) { + U32 const current2 = (U32)(ip-base); + U32 const repIndex2 = current2 - offset_2; + const BYTE* repMatch2 = repIndex2 < prefixLowestIndex ? + dictBase + repIndex2 - dictIndexDelta : + base + repIndex2; + if ( ((U32)((prefixLowestIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */) + && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { + const BYTE* const repEnd2 = repIndex2 < prefixLowestIndex ? dictEnd : iend; + size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixLowest) + 4; + U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); + hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2; + hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2; + ip += repLength2; + anchor = ip; + continue; + } + break; + } + } + } /* while (ip < ilimit) */ + + /* save reps for next block */ + rep[0] = offset_1; + rep[1] = offset_2; + + /* Return the last literals size */ + return (size_t)(iend - anchor); +} + +#define ZSTD_GEN_DFAST_FN(dictMode, mls) \ + static size_t ZSTD_compressBlock_doubleFast_##dictMode##_##mls( \ + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], \ + void const* src, size_t srcSize) \ + { \ + return ZSTD_compressBlock_doubleFast_##dictMode##_generic(ms, seqStore, rep, src, srcSize, mls); \ + } + +ZSTD_GEN_DFAST_FN(noDict, 4) +ZSTD_GEN_DFAST_FN(noDict, 5) +ZSTD_GEN_DFAST_FN(noDict, 6) +ZSTD_GEN_DFAST_FN(noDict, 7) + +ZSTD_GEN_DFAST_FN(dictMatchState, 4) +ZSTD_GEN_DFAST_FN(dictMatchState, 5) +ZSTD_GEN_DFAST_FN(dictMatchState, 6) +ZSTD_GEN_DFAST_FN(dictMatchState, 7) + + +size_t ZSTD_compressBlock_doubleFast( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + const U32 mls = ms->cParams.minMatch; + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_doubleFast_noDict_4(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_doubleFast_noDict_5(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_doubleFast_noDict_6(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_doubleFast_noDict_7(ms, seqStore, rep, src, srcSize); + } +} + + +size_t ZSTD_compressBlock_doubleFast_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + const U32 mls = ms->cParams.minMatch; + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_doubleFast_dictMatchState_4(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_doubleFast_dictMatchState_5(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_doubleFast_dictMatchState_6(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_doubleFast_dictMatchState_7(ms, seqStore, rep, src, srcSize); + } +} + + +static size_t ZSTD_compressBlock_doubleFast_extDict_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize, + U32 const mls /* template */) +{ + ZSTD_compressionParameters const* cParams = &ms->cParams; + U32* const hashLong = ms->hashTable; + U32 const hBitsL = cParams->hashLog; + U32* const hashSmall = ms->chainTable; + U32 const hBitsS = cParams->chainLog; + const BYTE* const istart = (const BYTE*)src; + const BYTE* ip = istart; + const BYTE* anchor = istart; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = iend - 8; + const BYTE* const base = ms->window.base; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + const U32 lowLimit = ZSTD_getLowestMatchIndex(ms, endIndex, cParams->windowLog); + const U32 dictStartIndex = lowLimit; + const U32 dictLimit = ms->window.dictLimit; + const U32 prefixStartIndex = (dictLimit > lowLimit) ? dictLimit : lowLimit; + const BYTE* const prefixStart = base + prefixStartIndex; + const BYTE* const dictBase = ms->window.dictBase; + const BYTE* const dictStart = dictBase + dictStartIndex; + const BYTE* const dictEnd = dictBase + prefixStartIndex; + U32 offset_1=rep[0], offset_2=rep[1]; + + DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_extDict_generic (srcSize=%zu)", srcSize); + + /* if extDict is invalidated due to maxDistance, switch to "regular" variant */ + if (prefixStartIndex == dictStartIndex) + return ZSTD_compressBlock_doubleFast(ms, seqStore, rep, src, srcSize); + + /* Search Loop */ + while (ip < ilimit) { /* < instead of <=, because (ip+1) */ + const size_t hSmall = ZSTD_hashPtr(ip, hBitsS, mls); + const U32 matchIndex = hashSmall[hSmall]; + const BYTE* const matchBase = matchIndex < prefixStartIndex ? dictBase : base; + const BYTE* match = matchBase + matchIndex; + + const size_t hLong = ZSTD_hashPtr(ip, hBitsL, 8); + const U32 matchLongIndex = hashLong[hLong]; + const BYTE* const matchLongBase = matchLongIndex < prefixStartIndex ? dictBase : base; + const BYTE* matchLong = matchLongBase + matchLongIndex; + + const U32 curr = (U32)(ip-base); + const U32 repIndex = curr + 1 - offset_1; /* offset_1 expected <= curr +1 */ + const BYTE* const repBase = repIndex < prefixStartIndex ? dictBase : base; + const BYTE* const repMatch = repBase + repIndex; + size_t mLength; + hashSmall[hSmall] = hashLong[hLong] = curr; /* update hash table */ + + if ((((U32)((prefixStartIndex-1) - repIndex) >= 3) /* intentional underflow : ensure repIndex doesn't overlap dict + prefix */ + & (offset_1 <= curr+1 - dictStartIndex)) /* note: we are searching at curr+1 */ + && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { + const BYTE* repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; + mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4; + ip++; + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); + } else { + if ((matchLongIndex > dictStartIndex) && (MEM_read64(matchLong) == MEM_read64(ip))) { + const BYTE* const matchEnd = matchLongIndex < prefixStartIndex ? dictEnd : iend; + const BYTE* const lowMatchPtr = matchLongIndex < prefixStartIndex ? dictStart : prefixStart; + U32 offset; + mLength = ZSTD_count_2segments(ip+8, matchLong+8, iend, matchEnd, prefixStart) + 8; + offset = curr - matchLongIndex; + while (((ip>anchor) & (matchLong>lowMatchPtr)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */ + offset_2 = offset_1; + offset_1 = offset; + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + + } else if ((matchIndex > dictStartIndex) && (MEM_read32(match) == MEM_read32(ip))) { + size_t const h3 = ZSTD_hashPtr(ip+1, hBitsL, 8); + U32 const matchIndex3 = hashLong[h3]; + const BYTE* const match3Base = matchIndex3 < prefixStartIndex ? dictBase : base; + const BYTE* match3 = match3Base + matchIndex3; + U32 offset; + hashLong[h3] = curr + 1; + if ( (matchIndex3 > dictStartIndex) && (MEM_read64(match3) == MEM_read64(ip+1)) ) { + const BYTE* const matchEnd = matchIndex3 < prefixStartIndex ? dictEnd : iend; + const BYTE* const lowMatchPtr = matchIndex3 < prefixStartIndex ? dictStart : prefixStart; + mLength = ZSTD_count_2segments(ip+9, match3+8, iend, matchEnd, prefixStart) + 8; + ip++; + offset = curr+1 - matchIndex3; + while (((ip>anchor) & (match3>lowMatchPtr)) && (ip[-1] == match3[-1])) { ip--; match3--; mLength++; } /* catch up */ + } else { + const BYTE* const matchEnd = matchIndex < prefixStartIndex ? dictEnd : iend; + const BYTE* const lowMatchPtr = matchIndex < prefixStartIndex ? dictStart : prefixStart; + mLength = ZSTD_count_2segments(ip+4, match+4, iend, matchEnd, prefixStart) + 4; + offset = curr - matchIndex; + while (((ip>anchor) & (match>lowMatchPtr)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ + } + offset_2 = offset_1; + offset_1 = offset; + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + + } else { + ip += ((ip-anchor) >> kSearchStrength) + 1; + continue; + } } + + /* move to next sequence start */ + ip += mLength; + anchor = ip; + + if (ip <= ilimit) { + /* Complementary insertion */ + /* done after iLimit test, as candidates could be > iend-8 */ + { U32 const indexToInsert = curr+2; + hashLong[ZSTD_hashPtr(base+indexToInsert, hBitsL, 8)] = indexToInsert; + hashLong[ZSTD_hashPtr(ip-2, hBitsL, 8)] = (U32)(ip-2-base); + hashSmall[ZSTD_hashPtr(base+indexToInsert, hBitsS, mls)] = indexToInsert; + hashSmall[ZSTD_hashPtr(ip-1, hBitsS, mls)] = (U32)(ip-1-base); + } + + /* check immediate repcode */ + while (ip <= ilimit) { + U32 const current2 = (U32)(ip-base); + U32 const repIndex2 = current2 - offset_2; + const BYTE* repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2; + if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) /* intentional overflow : ensure repIndex2 doesn't overlap dict + prefix */ + & (offset_2 <= current2 - dictStartIndex)) + && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { + const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; + size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; + U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); + hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2; + hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2; + ip += repLength2; + anchor = ip; + continue; + } + break; + } } } + + /* save reps for next block */ + rep[0] = offset_1; + rep[1] = offset_2; + + /* Return the last literals size */ + return (size_t)(iend - anchor); +} + +ZSTD_GEN_DFAST_FN(extDict, 4) +ZSTD_GEN_DFAST_FN(extDict, 5) +ZSTD_GEN_DFAST_FN(extDict, 6) +ZSTD_GEN_DFAST_FN(extDict, 7) + +size_t ZSTD_compressBlock_doubleFast_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + U32 const mls = ms->cParams.minMatch; + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_doubleFast_extDict_4(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_doubleFast_extDict_5(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_doubleFast_extDict_6(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_doubleFast_extDict_7(ms, seqStore, rep, src, srcSize); + } +} +/**** ended inlining compress/zstd_double_fast.c ****/ +/**** start inlining compress/zstd_fast.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/**** skipping file: zstd_compress_internal.h ****/ +/**** skipping file: zstd_fast.h ****/ + +static void ZSTD_fillHashTableForCDict(ZSTD_matchState_t* ms, + const void* const end, + ZSTD_dictTableLoadMethod_e dtlm) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hBits = cParams->hashLog + ZSTD_SHORT_CACHE_TAG_BITS; + U32 const mls = cParams->minMatch; + const BYTE* const base = ms->window.base; + const BYTE* ip = base + ms->nextToUpdate; + const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE; + const U32 fastHashFillStep = 3; + + /* Currently, we always use ZSTD_dtlm_full for filling CDict tables. + * Feel free to remove this assert if there's a good reason! */ + assert(dtlm == ZSTD_dtlm_full); + + /* Always insert every fastHashFillStep position into the hash table. + * Insert the other positions if their hash entry is empty. + */ + for ( ; ip + fastHashFillStep < iend + 2; ip += fastHashFillStep) { + U32 const curr = (U32)(ip - base); + { size_t const hashAndTag = ZSTD_hashPtr(ip, hBits, mls); + ZSTD_writeTaggedIndex(hashTable, hashAndTag, curr); } + + if (dtlm == ZSTD_dtlm_fast) continue; + /* Only load extra positions for ZSTD_dtlm_full */ + { U32 p; + for (p = 1; p < fastHashFillStep; ++p) { + size_t const hashAndTag = ZSTD_hashPtr(ip + p, hBits, mls); + if (hashTable[hashAndTag >> ZSTD_SHORT_CACHE_TAG_BITS] == 0) { /* not yet filled */ + ZSTD_writeTaggedIndex(hashTable, hashAndTag, curr + p); + } } } } +} + +static void ZSTD_fillHashTableForCCtx(ZSTD_matchState_t* ms, + const void* const end, + ZSTD_dictTableLoadMethod_e dtlm) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hBits = cParams->hashLog; + U32 const mls = cParams->minMatch; + const BYTE* const base = ms->window.base; + const BYTE* ip = base + ms->nextToUpdate; + const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE; + const U32 fastHashFillStep = 3; + + /* Currently, we always use ZSTD_dtlm_fast for filling CCtx tables. + * Feel free to remove this assert if there's a good reason! */ + assert(dtlm == ZSTD_dtlm_fast); + + /* Always insert every fastHashFillStep position into the hash table. + * Insert the other positions if their hash entry is empty. + */ + for ( ; ip + fastHashFillStep < iend + 2; ip += fastHashFillStep) { + U32 const curr = (U32)(ip - base); + size_t const hash0 = ZSTD_hashPtr(ip, hBits, mls); + hashTable[hash0] = curr; + if (dtlm == ZSTD_dtlm_fast) continue; + /* Only load extra positions for ZSTD_dtlm_full */ + { U32 p; + for (p = 1; p < fastHashFillStep; ++p) { + size_t const hash = ZSTD_hashPtr(ip + p, hBits, mls); + if (hashTable[hash] == 0) { /* not yet filled */ + hashTable[hash] = curr + p; + } } } } +} + +void ZSTD_fillHashTable(ZSTD_matchState_t* ms, + const void* const end, + ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp) +{ + if (tfp == ZSTD_tfp_forCDict) { + ZSTD_fillHashTableForCDict(ms, end, dtlm); + } else { + ZSTD_fillHashTableForCCtx(ms, end, dtlm); + } +} + + +/** + * If you squint hard enough (and ignore repcodes), the search operation at any + * given position is broken into 4 stages: + * + * 1. Hash (map position to hash value via input read) + * 2. Lookup (map hash val to index via hashtable read) + * 3. Load (map index to value at that position via input read) + * 4. Compare + * + * Each of these steps involves a memory read at an address which is computed + * from the previous step. This means these steps must be sequenced and their + * latencies are cumulative. + * + * Rather than do 1->2->3->4 sequentially for a single position before moving + * onto the next, this implementation interleaves these operations across the + * next few positions: + * + * R = Repcode Read & Compare + * H = Hash + * T = Table Lookup + * M = Match Read & Compare + * + * Pos | Time --> + * ----+------------------- + * N | ... M + * N+1 | ... TM + * N+2 | R H T M + * N+3 | H TM + * N+4 | R H T M + * N+5 | H ... + * N+6 | R ... + * + * This is very much analogous to the pipelining of execution in a CPU. And just + * like a CPU, we have to dump the pipeline when we find a match (i.e., take a + * branch). + * + * When this happens, we throw away our current state, and do the following prep + * to re-enter the loop: + * + * Pos | Time --> + * ----+------------------- + * N | H T + * N+1 | H + * + * This is also the work we do at the beginning to enter the loop initially. + */ +FORCE_INLINE_TEMPLATE size_t +ZSTD_compressBlock_fast_noDict_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize, + U32 const mls, U32 const hasStep) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hlog = cParams->hashLog; + /* support stepSize of 0 */ + size_t const stepSize = hasStep ? (cParams->targetLength + !(cParams->targetLength) + 1) : 2; + const BYTE* const base = ms->window.base; + const BYTE* const istart = (const BYTE*)src; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + const U32 prefixStartIndex = ZSTD_getLowestPrefixIndex(ms, endIndex, cParams->windowLog); + const BYTE* const prefixStart = base + prefixStartIndex; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = iend - HASH_READ_SIZE; + + const BYTE* anchor = istart; + const BYTE* ip0 = istart; + const BYTE* ip1; + const BYTE* ip2; + const BYTE* ip3; + U32 current0; + + U32 rep_offset1 = rep[0]; + U32 rep_offset2 = rep[1]; + U32 offsetSaved1 = 0, offsetSaved2 = 0; + + size_t hash0; /* hash for ip0 */ + size_t hash1; /* hash for ip1 */ + U32 idx; /* match idx for ip0 */ + U32 mval; /* src value at match idx */ + + U32 offcode; + const BYTE* match0; + size_t mLength; + + /* ip0 and ip1 are always adjacent. The targetLength skipping and + * uncompressibility acceleration is applied to every other position, + * matching the behavior of #1562. step therefore represents the gap + * between pairs of positions, from ip0 to ip2 or ip1 to ip3. */ + size_t step; + const BYTE* nextStep; + const size_t kStepIncr = (1 << (kSearchStrength - 1)); + + DEBUGLOG(5, "ZSTD_compressBlock_fast_generic"); + ip0 += (ip0 == prefixStart); + { U32 const curr = (U32)(ip0 - base); + U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, curr, cParams->windowLog); + U32 const maxRep = curr - windowLow; + if (rep_offset2 > maxRep) offsetSaved2 = rep_offset2, rep_offset2 = 0; + if (rep_offset1 > maxRep) offsetSaved1 = rep_offset1, rep_offset1 = 0; + } + + /* start each op */ +_start: /* Requires: ip0 */ + + step = stepSize; + nextStep = ip0 + kStepIncr; + + /* calculate positions, ip0 - anchor == 0, so we skip step calc */ + ip1 = ip0 + 1; + ip2 = ip0 + step; + ip3 = ip2 + 1; + + if (ip3 >= ilimit) { + goto _cleanup; + } + + hash0 = ZSTD_hashPtr(ip0, hlog, mls); + hash1 = ZSTD_hashPtr(ip1, hlog, mls); + + idx = hashTable[hash0]; + + do { + /* load repcode match for ip[2]*/ + const U32 rval = MEM_read32(ip2 - rep_offset1); + + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; + + /* check repcode at ip[2] */ + if ((MEM_read32(ip2) == rval) & (rep_offset1 > 0)) { + ip0 = ip2; + match0 = ip0 - rep_offset1; + mLength = ip0[-1] == match0[-1]; + ip0 -= mLength; + match0 -= mLength; + offcode = REPCODE1_TO_OFFBASE; + mLength += 4; + + /* First write next hash table entry; we've already calculated it. + * This write is known to be safe because the ip1 is before the + * repcode (ip2). */ + hashTable[hash1] = (U32)(ip1 - base); + + goto _match; + } + + /* load match for ip[0] */ + if (idx >= prefixStartIndex) { + mval = MEM_read32(base + idx); + } else { + mval = MEM_read32(ip0) ^ 1; /* guaranteed to not match. */ + } + + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + + /* First write next hash table entry; we've already calculated it. + * This write is known to be safe because the ip1 == ip0 + 1, so + * we know we will resume searching after ip1 */ + hashTable[hash1] = (U32)(ip1 - base); + + goto _offset; + } + + /* lookup ip[1] */ + idx = hashTable[hash1]; + + /* hash ip[2] */ + hash0 = hash1; + hash1 = ZSTD_hashPtr(ip2, hlog, mls); + + /* advance to next positions */ + ip0 = ip1; + ip1 = ip2; + ip2 = ip3; + + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; + + /* load match for ip[0] */ + if (idx >= prefixStartIndex) { + mval = MEM_read32(base + idx); + } else { + mval = MEM_read32(ip0) ^ 1; /* guaranteed to not match. */ + } + + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + + /* first write next hash table entry; we've already calculated it */ + if (step <= 4) { + /* We need to avoid writing an index into the hash table >= the + * position at which we will pick up our searching after we've + * taken this match. + * + * The minimum possible match has length 4, so the earliest ip0 + * can be after we take this match will be the current ip0 + 4. + * ip1 is ip0 + step - 1. If ip1 is >= ip0 + 4, we can't safely + * write this position. + */ + hashTable[hash1] = (U32)(ip1 - base); + } + + goto _offset; + } + + /* lookup ip[1] */ + idx = hashTable[hash1]; + + /* hash ip[2] */ + hash0 = hash1; + hash1 = ZSTD_hashPtr(ip2, hlog, mls); + + /* advance to next positions */ + ip0 = ip1; + ip1 = ip2; + ip2 = ip0 + step; + ip3 = ip1 + step; + + /* calculate step */ + if (ip2 >= nextStep) { + step++; + PREFETCH_L1(ip1 + 64); + PREFETCH_L1(ip1 + 128); + nextStep += kStepIncr; + } + } while (ip3 < ilimit); + +_cleanup: + /* Note that there are probably still a couple positions we could search. + * However, it seems to be a meaningful performance hit to try to search + * them. So let's not. */ + + /* When the repcodes are outside of the prefix, we set them to zero before the loop. + * When the offsets are still zero, we need to restore them after the block to have a correct + * repcode history. If only one offset was invalid, it is easy. The tricky case is when both + * offsets were invalid. We need to figure out which offset to refill with. + * - If both offsets are zero they are in the same order. + * - If both offsets are non-zero, we won't restore the offsets from `offsetSaved[12]`. + * - If only one is zero, we need to decide which offset to restore. + * - If rep_offset1 is non-zero, then rep_offset2 must be offsetSaved1. + * - It is impossible for rep_offset2 to be non-zero. + * + * So if rep_offset1 started invalid (offsetSaved1 != 0) and became valid (rep_offset1 != 0), then + * set rep[0] = rep_offset1 and rep[1] = offsetSaved1. + */ + offsetSaved2 = ((offsetSaved1 != 0) && (rep_offset1 != 0)) ? offsetSaved1 : offsetSaved2; + + /* save reps for next block */ + rep[0] = rep_offset1 ? rep_offset1 : offsetSaved1; + rep[1] = rep_offset2 ? rep_offset2 : offsetSaved2; + + /* Return the last literals size */ + return (size_t)(iend - anchor); + +_offset: /* Requires: ip0, idx */ + + /* Compute the offset code. */ + match0 = base + idx; + rep_offset2 = rep_offset1; + rep_offset1 = (U32)(ip0-match0); + offcode = OFFSET_TO_OFFBASE(rep_offset1); + mLength = 4; + + /* Count the backwards match length. */ + while (((ip0>anchor) & (match0>prefixStart)) && (ip0[-1] == match0[-1])) { + ip0--; + match0--; + mLength++; + } + +_match: /* Requires: ip0, match0, offcode */ + + /* Count the forward length. */ + mLength += ZSTD_count(ip0 + mLength, match0 + mLength, iend); + + ZSTD_storeSeq(seqStore, (size_t)(ip0 - anchor), anchor, iend, offcode, mLength); + + ip0 += mLength; + anchor = ip0; + + /* Fill table and check for immediate repcode. */ + if (ip0 <= ilimit) { + /* Fill Table */ + assert(base+current0+2 > istart); /* check base overflow */ + hashTable[ZSTD_hashPtr(base+current0+2, hlog, mls)] = current0+2; /* here because current+2 could be > iend-8 */ + hashTable[ZSTD_hashPtr(ip0-2, hlog, mls)] = (U32)(ip0-2-base); + + if (rep_offset2 > 0) { /* rep_offset2==0 means rep_offset2 is invalidated */ + while ( (ip0 <= ilimit) && (MEM_read32(ip0) == MEM_read32(ip0 - rep_offset2)) ) { + /* store sequence */ + size_t const rLength = ZSTD_count(ip0+4, ip0+4-rep_offset2, iend) + 4; + { U32 const tmpOff = rep_offset2; rep_offset2 = rep_offset1; rep_offset1 = tmpOff; } /* swap rep_offset2 <=> rep_offset1 */ + hashTable[ZSTD_hashPtr(ip0, hlog, mls)] = (U32)(ip0-base); + ip0 += rLength; + ZSTD_storeSeq(seqStore, 0 /*litLen*/, anchor, iend, REPCODE1_TO_OFFBASE, rLength); + anchor = ip0; + continue; /* faster when present (confirmed on gcc-8) ... (?) */ + } } } + + goto _start; +} + +#define ZSTD_GEN_FAST_FN(dictMode, mls, step) \ + static size_t ZSTD_compressBlock_fast_##dictMode##_##mls##_##step( \ + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], \ + void const* src, size_t srcSize) \ + { \ + return ZSTD_compressBlock_fast_##dictMode##_generic(ms, seqStore, rep, src, srcSize, mls, step); \ + } + +ZSTD_GEN_FAST_FN(noDict, 4, 1) +ZSTD_GEN_FAST_FN(noDict, 5, 1) +ZSTD_GEN_FAST_FN(noDict, 6, 1) +ZSTD_GEN_FAST_FN(noDict, 7, 1) + +ZSTD_GEN_FAST_FN(noDict, 4, 0) +ZSTD_GEN_FAST_FN(noDict, 5, 0) +ZSTD_GEN_FAST_FN(noDict, 6, 0) +ZSTD_GEN_FAST_FN(noDict, 7, 0) + +size_t ZSTD_compressBlock_fast( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + U32 const mls = ms->cParams.minMatch; + assert(ms->dictMatchState == NULL); + if (ms->cParams.targetLength > 1) { + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_noDict_4_1(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_noDict_5_1(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_noDict_6_1(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_noDict_7_1(ms, seqStore, rep, src, srcSize); + } + } else { + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_noDict_4_0(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_noDict_5_0(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_noDict_6_0(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_noDict_7_0(ms, seqStore, rep, src, srcSize); + } + + } +} + +FORCE_INLINE_TEMPLATE +size_t ZSTD_compressBlock_fast_dictMatchState_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize, U32 const mls, U32 const hasStep) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hlog = cParams->hashLog; + /* support stepSize of 0 */ + U32 const stepSize = cParams->targetLength + !(cParams->targetLength); + const BYTE* const base = ms->window.base; + const BYTE* const istart = (const BYTE*)src; + const BYTE* ip0 = istart; + const BYTE* ip1 = ip0 + stepSize; /* we assert below that stepSize >= 1 */ + const BYTE* anchor = istart; + const U32 prefixStartIndex = ms->window.dictLimit; + const BYTE* const prefixStart = base + prefixStartIndex; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = iend - HASH_READ_SIZE; + U32 offset_1=rep[0], offset_2=rep[1]; + + const ZSTD_matchState_t* const dms = ms->dictMatchState; + const ZSTD_compressionParameters* const dictCParams = &dms->cParams ; + const U32* const dictHashTable = dms->hashTable; + const U32 dictStartIndex = dms->window.dictLimit; + const BYTE* const dictBase = dms->window.base; + const BYTE* const dictStart = dictBase + dictStartIndex; + const BYTE* const dictEnd = dms->window.nextSrc; + const U32 dictIndexDelta = prefixStartIndex - (U32)(dictEnd - dictBase); + const U32 dictAndPrefixLength = (U32)(istart - prefixStart + dictEnd - dictStart); + const U32 dictHBits = dictCParams->hashLog + ZSTD_SHORT_CACHE_TAG_BITS; + + /* if a dictionary is still attached, it necessarily means that + * it is within window size. So we just check it. */ + const U32 maxDistance = 1U << cParams->windowLog; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + assert(endIndex - prefixStartIndex <= maxDistance); + (void)maxDistance; (void)endIndex; /* these variables are not used when assert() is disabled */ + + (void)hasStep; /* not currently specialized on whether it's accelerated */ + + /* ensure there will be no underflow + * when translating a dict index into a local index */ + assert(prefixStartIndex >= (U32)(dictEnd - dictBase)); + + if (ms->prefetchCDictTables) { + size_t const hashTableBytes = (((size_t)1) << dictCParams->hashLog) * sizeof(U32); + PREFETCH_AREA(dictHashTable, hashTableBytes) + } + + /* init */ + DEBUGLOG(5, "ZSTD_compressBlock_fast_dictMatchState_generic"); + ip0 += (dictAndPrefixLength == 0); + /* dictMatchState repCode checks don't currently handle repCode == 0 + * disabling. */ + assert(offset_1 <= dictAndPrefixLength); + assert(offset_2 <= dictAndPrefixLength); + + /* Outer search loop */ + assert(stepSize >= 1); + while (ip1 <= ilimit) { /* repcode check at (ip0 + 1) is safe because ip0 < ip1 */ + size_t mLength; + size_t hash0 = ZSTD_hashPtr(ip0, hlog, mls); + + size_t const dictHashAndTag0 = ZSTD_hashPtr(ip0, dictHBits, mls); + U32 dictMatchIndexAndTag = dictHashTable[dictHashAndTag0 >> ZSTD_SHORT_CACHE_TAG_BITS]; + int dictTagsMatch = ZSTD_comparePackedTags(dictMatchIndexAndTag, dictHashAndTag0); + + U32 matchIndex = hashTable[hash0]; + U32 curr = (U32)(ip0 - base); + size_t step = stepSize; + const size_t kStepIncr = 1 << kSearchStrength; + const BYTE* nextStep = ip0 + kStepIncr; + + /* Inner search loop */ + while (1) { + const BYTE* match = base + matchIndex; + const U32 repIndex = curr + 1 - offset_1; + const BYTE* repMatch = (repIndex < prefixStartIndex) ? + dictBase + (repIndex - dictIndexDelta) : + base + repIndex; + const size_t hash1 = ZSTD_hashPtr(ip1, hlog, mls); + size_t const dictHashAndTag1 = ZSTD_hashPtr(ip1, dictHBits, mls); + hashTable[hash0] = curr; /* update hash table */ + + if (((U32) ((prefixStartIndex - 1) - repIndex) >= + 3) /* intentional underflow : ensure repIndex isn't overlapping dict + prefix */ + && (MEM_read32(repMatch) == MEM_read32(ip0 + 1))) { + const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; + mLength = ZSTD_count_2segments(ip0 + 1 + 4, repMatch + 4, iend, repMatchEnd, prefixStart) + 4; + ip0++; + ZSTD_storeSeq(seqStore, (size_t) (ip0 - anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); + break; + } + + if (dictTagsMatch) { + /* Found a possible dict match */ + const U32 dictMatchIndex = dictMatchIndexAndTag >> ZSTD_SHORT_CACHE_TAG_BITS; + const BYTE* dictMatch = dictBase + dictMatchIndex; + if (dictMatchIndex > dictStartIndex && + MEM_read32(dictMatch) == MEM_read32(ip0)) { + /* To replicate extDict parse behavior, we only use dict matches when the normal matchIndex is invalid */ + if (matchIndex <= prefixStartIndex) { + U32 const offset = (U32) (curr - dictMatchIndex - dictIndexDelta); + mLength = ZSTD_count_2segments(ip0 + 4, dictMatch + 4, iend, dictEnd, prefixStart) + 4; + while (((ip0 > anchor) & (dictMatch > dictStart)) + && (ip0[-1] == dictMatch[-1])) { + ip0--; + dictMatch--; + mLength++; + } /* catch up */ + offset_2 = offset_1; + offset_1 = offset; + ZSTD_storeSeq(seqStore, (size_t) (ip0 - anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + break; + } + } + } + + if (matchIndex > prefixStartIndex && MEM_read32(match) == MEM_read32(ip0)) { + /* found a regular match */ + U32 const offset = (U32) (ip0 - match); + mLength = ZSTD_count(ip0 + 4, match + 4, iend) + 4; + while (((ip0 > anchor) & (match > prefixStart)) + && (ip0[-1] == match[-1])) { + ip0--; + match--; + mLength++; + } /* catch up */ + offset_2 = offset_1; + offset_1 = offset; + ZSTD_storeSeq(seqStore, (size_t) (ip0 - anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + break; + } + + /* Prepare for next iteration */ + dictMatchIndexAndTag = dictHashTable[dictHashAndTag1 >> ZSTD_SHORT_CACHE_TAG_BITS]; + dictTagsMatch = ZSTD_comparePackedTags(dictMatchIndexAndTag, dictHashAndTag1); + matchIndex = hashTable[hash1]; + + if (ip1 >= nextStep) { + step++; + nextStep += kStepIncr; + } + ip0 = ip1; + ip1 = ip1 + step; + if (ip1 > ilimit) goto _cleanup; + + curr = (U32)(ip0 - base); + hash0 = hash1; + } /* end inner search loop */ + + /* match found */ + assert(mLength); + ip0 += mLength; + anchor = ip0; + + if (ip0 <= ilimit) { + /* Fill Table */ + assert(base+curr+2 > istart); /* check base overflow */ + hashTable[ZSTD_hashPtr(base+curr+2, hlog, mls)] = curr+2; /* here because curr+2 could be > iend-8 */ + hashTable[ZSTD_hashPtr(ip0-2, hlog, mls)] = (U32)(ip0-2-base); + + /* check immediate repcode */ + while (ip0 <= ilimit) { + U32 const current2 = (U32)(ip0-base); + U32 const repIndex2 = current2 - offset_2; + const BYTE* repMatch2 = repIndex2 < prefixStartIndex ? + dictBase - dictIndexDelta + repIndex2 : + base + repIndex2; + if ( ((U32)((prefixStartIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */) + && (MEM_read32(repMatch2) == MEM_read32(ip0))) { + const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; + size_t const repLength2 = ZSTD_count_2segments(ip0+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; + U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); + hashTable[ZSTD_hashPtr(ip0, hlog, mls)] = current2; + ip0 += repLength2; + anchor = ip0; + continue; + } + break; + } + } + + /* Prepare for next iteration */ + assert(ip0 == anchor); + ip1 = ip0 + stepSize; + } + +_cleanup: + /* save reps for next block */ + rep[0] = offset_1; + rep[1] = offset_2; + + /* Return the last literals size */ + return (size_t)(iend - anchor); +} + + +ZSTD_GEN_FAST_FN(dictMatchState, 4, 0) +ZSTD_GEN_FAST_FN(dictMatchState, 5, 0) +ZSTD_GEN_FAST_FN(dictMatchState, 6, 0) +ZSTD_GEN_FAST_FN(dictMatchState, 7, 0) + +size_t ZSTD_compressBlock_fast_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + U32 const mls = ms->cParams.minMatch; + assert(ms->dictMatchState != NULL); + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_dictMatchState_4_0(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_dictMatchState_5_0(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_dictMatchState_6_0(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_dictMatchState_7_0(ms, seqStore, rep, src, srcSize); + } +} + + +static size_t ZSTD_compressBlock_fast_extDict_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize, U32 const mls, U32 const hasStep) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hlog = cParams->hashLog; + /* support stepSize of 0 */ + size_t const stepSize = cParams->targetLength + !(cParams->targetLength) + 1; + const BYTE* const base = ms->window.base; + const BYTE* const dictBase = ms->window.dictBase; + const BYTE* const istart = (const BYTE*)src; + const BYTE* anchor = istart; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + const U32 lowLimit = ZSTD_getLowestMatchIndex(ms, endIndex, cParams->windowLog); + const U32 dictStartIndex = lowLimit; + const BYTE* const dictStart = dictBase + dictStartIndex; + const U32 dictLimit = ms->window.dictLimit; + const U32 prefixStartIndex = dictLimit < lowLimit ? lowLimit : dictLimit; + const BYTE* const prefixStart = base + prefixStartIndex; + const BYTE* const dictEnd = dictBase + prefixStartIndex; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = iend - 8; + U32 offset_1=rep[0], offset_2=rep[1]; + U32 offsetSaved1 = 0, offsetSaved2 = 0; + + const BYTE* ip0 = istart; + const BYTE* ip1; + const BYTE* ip2; + const BYTE* ip3; + U32 current0; + + + size_t hash0; /* hash for ip0 */ + size_t hash1; /* hash for ip1 */ + U32 idx; /* match idx for ip0 */ + const BYTE* idxBase; /* base pointer for idx */ + + U32 offcode; + const BYTE* match0; + size_t mLength; + const BYTE* matchEnd = 0; /* initialize to avoid warning, assert != 0 later */ + + size_t step; + const BYTE* nextStep; + const size_t kStepIncr = (1 << (kSearchStrength - 1)); + + (void)hasStep; /* not currently specialized on whether it's accelerated */ + + DEBUGLOG(5, "ZSTD_compressBlock_fast_extDict_generic (offset_1=%u)", offset_1); + + /* switch to "regular" variant if extDict is invalidated due to maxDistance */ + if (prefixStartIndex == dictStartIndex) + return ZSTD_compressBlock_fast(ms, seqStore, rep, src, srcSize); + + { U32 const curr = (U32)(ip0 - base); + U32 const maxRep = curr - dictStartIndex; + if (offset_2 >= maxRep) offsetSaved2 = offset_2, offset_2 = 0; + if (offset_1 >= maxRep) offsetSaved1 = offset_1, offset_1 = 0; + } + + /* start each op */ +_start: /* Requires: ip0 */ + + step = stepSize; + nextStep = ip0 + kStepIncr; + + /* calculate positions, ip0 - anchor == 0, so we skip step calc */ + ip1 = ip0 + 1; + ip2 = ip0 + step; + ip3 = ip2 + 1; + + if (ip3 >= ilimit) { + goto _cleanup; + } + + hash0 = ZSTD_hashPtr(ip0, hlog, mls); + hash1 = ZSTD_hashPtr(ip1, hlog, mls); + + idx = hashTable[hash0]; + idxBase = idx < prefixStartIndex ? dictBase : base; + + do { + { /* load repcode match for ip[2] */ + U32 const current2 = (U32)(ip2 - base); + U32 const repIndex = current2 - offset_1; + const BYTE* const repBase = repIndex < prefixStartIndex ? dictBase : base; + U32 rval; + if ( ((U32)(prefixStartIndex - repIndex) >= 4) /* intentional underflow */ + & (offset_1 > 0) ) { + rval = MEM_read32(repBase + repIndex); + } else { + rval = MEM_read32(ip2) ^ 1; /* guaranteed to not match. */ + } + + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; + + /* check repcode at ip[2] */ + if (MEM_read32(ip2) == rval) { + ip0 = ip2; + match0 = repBase + repIndex; + matchEnd = repIndex < prefixStartIndex ? dictEnd : iend; + assert((match0 != prefixStart) & (match0 != dictStart)); + mLength = ip0[-1] == match0[-1]; + ip0 -= mLength; + match0 -= mLength; + offcode = REPCODE1_TO_OFFBASE; + mLength += 4; + goto _match; + } } + + { /* load match for ip[0] */ + U32 const mval = idx >= dictStartIndex ? + MEM_read32(idxBase + idx) : + MEM_read32(ip0) ^ 1; /* guaranteed not to match */ + + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + goto _offset; + } } + + /* lookup ip[1] */ + idx = hashTable[hash1]; + idxBase = idx < prefixStartIndex ? dictBase : base; + + /* hash ip[2] */ + hash0 = hash1; + hash1 = ZSTD_hashPtr(ip2, hlog, mls); + + /* advance to next positions */ + ip0 = ip1; + ip1 = ip2; + ip2 = ip3; + + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; + + { /* load match for ip[0] */ + U32 const mval = idx >= dictStartIndex ? + MEM_read32(idxBase + idx) : + MEM_read32(ip0) ^ 1; /* guaranteed not to match */ + + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + goto _offset; + } } + + /* lookup ip[1] */ + idx = hashTable[hash1]; + idxBase = idx < prefixStartIndex ? dictBase : base; + + /* hash ip[2] */ + hash0 = hash1; + hash1 = ZSTD_hashPtr(ip2, hlog, mls); + + /* advance to next positions */ + ip0 = ip1; + ip1 = ip2; + ip2 = ip0 + step; + ip3 = ip1 + step; + + /* calculate step */ + if (ip2 >= nextStep) { + step++; + PREFETCH_L1(ip1 + 64); + PREFETCH_L1(ip1 + 128); + nextStep += kStepIncr; + } + } while (ip3 < ilimit); + +_cleanup: + /* Note that there are probably still a couple positions we could search. + * However, it seems to be a meaningful performance hit to try to search + * them. So let's not. */ + + /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0), + * rotate saved offsets. See comment in ZSTD_compressBlock_fast_noDict for more context. */ + offsetSaved2 = ((offsetSaved1 != 0) && (offset_1 != 0)) ? offsetSaved1 : offsetSaved2; + + /* save reps for next block */ + rep[0] = offset_1 ? offset_1 : offsetSaved1; + rep[1] = offset_2 ? offset_2 : offsetSaved2; + + /* Return the last literals size */ + return (size_t)(iend - anchor); + +_offset: /* Requires: ip0, idx, idxBase */ + + /* Compute the offset code. */ + { U32 const offset = current0 - idx; + const BYTE* const lowMatchPtr = idx < prefixStartIndex ? dictStart : prefixStart; + matchEnd = idx < prefixStartIndex ? dictEnd : iend; + match0 = idxBase + idx; + offset_2 = offset_1; + offset_1 = offset; + offcode = OFFSET_TO_OFFBASE(offset); + mLength = 4; + + /* Count the backwards match length. */ + while (((ip0>anchor) & (match0>lowMatchPtr)) && (ip0[-1] == match0[-1])) { + ip0--; + match0--; + mLength++; + } } + +_match: /* Requires: ip0, match0, offcode, matchEnd */ + + /* Count the forward length. */ + assert(matchEnd != 0); + mLength += ZSTD_count_2segments(ip0 + mLength, match0 + mLength, iend, matchEnd, prefixStart); + + ZSTD_storeSeq(seqStore, (size_t)(ip0 - anchor), anchor, iend, offcode, mLength); + + ip0 += mLength; + anchor = ip0; + + /* write next hash table entry */ + if (ip1 < ip0) { + hashTable[hash1] = (U32)(ip1 - base); + } + + /* Fill table and check for immediate repcode. */ + if (ip0 <= ilimit) { + /* Fill Table */ + assert(base+current0+2 > istart); /* check base overflow */ + hashTable[ZSTD_hashPtr(base+current0+2, hlog, mls)] = current0+2; /* here because current+2 could be > iend-8 */ + hashTable[ZSTD_hashPtr(ip0-2, hlog, mls)] = (U32)(ip0-2-base); + + while (ip0 <= ilimit) { + U32 const repIndex2 = (U32)(ip0-base) - offset_2; + const BYTE* const repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2; + if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (offset_2 > 0)) /* intentional underflow */ + && (MEM_read32(repMatch2) == MEM_read32(ip0)) ) { + const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; + size_t const repLength2 = ZSTD_count_2segments(ip0+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; + { U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; } /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0 /*litlen*/, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); + hashTable[ZSTD_hashPtr(ip0, hlog, mls)] = (U32)(ip0-base); + ip0 += repLength2; + anchor = ip0; + continue; + } + break; + } } + + goto _start; +} + +ZSTD_GEN_FAST_FN(extDict, 4, 0) +ZSTD_GEN_FAST_FN(extDict, 5, 0) +ZSTD_GEN_FAST_FN(extDict, 6, 0) +ZSTD_GEN_FAST_FN(extDict, 7, 0) + +size_t ZSTD_compressBlock_fast_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + U32 const mls = ms->cParams.minMatch; + assert(ms->dictMatchState == NULL); + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_extDict_4_0(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_extDict_5_0(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_extDict_6_0(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_extDict_7_0(ms, seqStore, rep, src, srcSize); + } +} +/**** ended inlining compress/zstd_fast.c ****/ +/**** start inlining compress/zstd_lazy.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/**** skipping file: zstd_compress_internal.h ****/ +/**** skipping file: zstd_lazy.h ****/ +/**** skipping file: ../common/bits.h ****/ + +#define kLazySkippingStep 8 + + +/*-************************************* +* Binary Tree search +***************************************/ + +static void +ZSTD_updateDUBT(ZSTD_matchState_t* ms, + const BYTE* ip, const BYTE* iend, + U32 mls) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hashLog = cParams->hashLog; + + U32* const bt = ms->chainTable; + U32 const btLog = cParams->chainLog - 1; + U32 const btMask = (1 << btLog) - 1; + + const BYTE* const base = ms->window.base; + U32 const target = (U32)(ip - base); + U32 idx = ms->nextToUpdate; + + if (idx != target) + DEBUGLOG(7, "ZSTD_updateDUBT, from %u to %u (dictLimit:%u)", + idx, target, ms->window.dictLimit); + assert(ip + 8 <= iend); /* condition for ZSTD_hashPtr */ + (void)iend; + + assert(idx >= ms->window.dictLimit); /* condition for valid base+idx */ + for ( ; idx < target ; idx++) { + size_t const h = ZSTD_hashPtr(base + idx, hashLog, mls); /* assumption : ip + 8 <= iend */ + U32 const matchIndex = hashTable[h]; + + U32* const nextCandidatePtr = bt + 2*(idx&btMask); + U32* const sortMarkPtr = nextCandidatePtr + 1; + + DEBUGLOG(8, "ZSTD_updateDUBT: insert %u", idx); + hashTable[h] = idx; /* Update Hash Table */ + *nextCandidatePtr = matchIndex; /* update BT like a chain */ + *sortMarkPtr = ZSTD_DUBT_UNSORTED_MARK; + } + ms->nextToUpdate = target; +} + + +/** ZSTD_insertDUBT1() : + * sort one already inserted but unsorted position + * assumption : curr >= btlow == (curr - btmask) + * doesn't fail */ +static void +ZSTD_insertDUBT1(const ZSTD_matchState_t* ms, + U32 curr, const BYTE* inputEnd, + U32 nbCompares, U32 btLow, + const ZSTD_dictMode_e dictMode) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const bt = ms->chainTable; + U32 const btLog = cParams->chainLog - 1; + U32 const btMask = (1 << btLog) - 1; + size_t commonLengthSmaller=0, commonLengthLarger=0; + const BYTE* const base = ms->window.base; + const BYTE* const dictBase = ms->window.dictBase; + const U32 dictLimit = ms->window.dictLimit; + const BYTE* const ip = (curr>=dictLimit) ? base + curr : dictBase + curr; + const BYTE* const iend = (curr>=dictLimit) ? inputEnd : dictBase + dictLimit; + const BYTE* const dictEnd = dictBase + dictLimit; + const BYTE* const prefixStart = base + dictLimit; + const BYTE* match; + U32* smallerPtr = bt + 2*(curr&btMask); + U32* largerPtr = smallerPtr + 1; + U32 matchIndex = *smallerPtr; /* this candidate is unsorted : next sorted candidate is reached through *smallerPtr, while *largerPtr contains previous unsorted candidate (which is already saved and can be overwritten) */ + U32 dummy32; /* to be nullified at the end */ + U32 const windowValid = ms->window.lowLimit; + U32 const maxDistance = 1U << cParams->windowLog; + U32 const windowLow = (curr - windowValid > maxDistance) ? curr - maxDistance : windowValid; + + + DEBUGLOG(8, "ZSTD_insertDUBT1(%u) (dictLimit=%u, lowLimit=%u)", + curr, dictLimit, windowLow); + assert(curr >= btLow); + assert(ip < iend); /* condition for ZSTD_count */ + + for (; nbCompares && (matchIndex > windowLow); --nbCompares) { + U32* const nextPtr = bt + 2*(matchIndex & btMask); + size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ + assert(matchIndex < curr); + /* note : all candidates are now supposed sorted, + * but it's still possible to have nextPtr[1] == ZSTD_DUBT_UNSORTED_MARK + * when a real index has the same value as ZSTD_DUBT_UNSORTED_MARK */ + + if ( (dictMode != ZSTD_extDict) + || (matchIndex+matchLength >= dictLimit) /* both in current segment*/ + || (curr < dictLimit) /* both in extDict */) { + const BYTE* const mBase = ( (dictMode != ZSTD_extDict) + || (matchIndex+matchLength >= dictLimit)) ? + base : dictBase; + assert( (matchIndex+matchLength >= dictLimit) /* might be wrong if extDict is incorrectly set to 0 */ + || (curr < dictLimit) ); + match = mBase + matchIndex; + matchLength += ZSTD_count(ip+matchLength, match+matchLength, iend); + } else { + match = dictBase + matchIndex; + matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iend, dictEnd, prefixStart); + if (matchIndex+matchLength >= dictLimit) + match = base + matchIndex; /* preparation for next read of match[matchLength] */ + } + + DEBUGLOG(8, "ZSTD_insertDUBT1: comparing %u with %u : found %u common bytes ", + curr, matchIndex, (U32)matchLength); + + if (ip+matchLength == iend) { /* equal : no way to know if inf or sup */ + break; /* drop , to guarantee consistency ; miss a bit of compression, but other solutions can corrupt tree */ + } + + if (match[matchLength] < ip[matchLength]) { /* necessarily within buffer */ + /* match is smaller than current */ + *smallerPtr = matchIndex; /* update smaller idx */ + commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */ + if (matchIndex <= btLow) { smallerPtr=&dummy32; break; } /* beyond tree size, stop searching */ + DEBUGLOG(8, "ZSTD_insertDUBT1: %u (>btLow=%u) is smaller : next => %u", + matchIndex, btLow, nextPtr[1]); + smallerPtr = nextPtr+1; /* new "candidate" => larger than match, which was smaller than target */ + matchIndex = nextPtr[1]; /* new matchIndex, larger than previous and closer to current */ + } else { + /* match is larger than current */ + *largerPtr = matchIndex; + commonLengthLarger = matchLength; + if (matchIndex <= btLow) { largerPtr=&dummy32; break; } /* beyond tree size, stop searching */ + DEBUGLOG(8, "ZSTD_insertDUBT1: %u (>btLow=%u) is larger => %u", + matchIndex, btLow, nextPtr[0]); + largerPtr = nextPtr; + matchIndex = nextPtr[0]; + } } + + *smallerPtr = *largerPtr = 0; +} + + +static size_t +ZSTD_DUBT_findBetterDictMatch ( + const ZSTD_matchState_t* ms, + const BYTE* const ip, const BYTE* const iend, + size_t* offsetPtr, + size_t bestLength, + U32 nbCompares, + U32 const mls, + const ZSTD_dictMode_e dictMode) +{ + const ZSTD_matchState_t * const dms = ms->dictMatchState; + const ZSTD_compressionParameters* const dmsCParams = &dms->cParams; + const U32 * const dictHashTable = dms->hashTable; + U32 const hashLog = dmsCParams->hashLog; + size_t const h = ZSTD_hashPtr(ip, hashLog, mls); + U32 dictMatchIndex = dictHashTable[h]; + + const BYTE* const base = ms->window.base; + const BYTE* const prefixStart = base + ms->window.dictLimit; + U32 const curr = (U32)(ip-base); + const BYTE* const dictBase = dms->window.base; + const BYTE* const dictEnd = dms->window.nextSrc; + U32 const dictHighLimit = (U32)(dms->window.nextSrc - dms->window.base); + U32 const dictLowLimit = dms->window.lowLimit; + U32 const dictIndexDelta = ms->window.lowLimit - dictHighLimit; + + U32* const dictBt = dms->chainTable; + U32 const btLog = dmsCParams->chainLog - 1; + U32 const btMask = (1 << btLog) - 1; + U32 const btLow = (btMask >= dictHighLimit - dictLowLimit) ? dictLowLimit : dictHighLimit - btMask; + + size_t commonLengthSmaller=0, commonLengthLarger=0; + + (void)dictMode; + assert(dictMode == ZSTD_dictMatchState); + + for (; nbCompares && (dictMatchIndex > dictLowLimit); --nbCompares) { + U32* const nextPtr = dictBt + 2*(dictMatchIndex & btMask); + size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ + const BYTE* match = dictBase + dictMatchIndex; + matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iend, dictEnd, prefixStart); + if (dictMatchIndex+matchLength >= dictHighLimit) + match = base + dictMatchIndex + dictIndexDelta; /* to prepare for next usage of match[matchLength] */ + + if (matchLength > bestLength) { + U32 matchIndex = dictMatchIndex + dictIndexDelta; + if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(curr-matchIndex+1) - ZSTD_highbit32((U32)offsetPtr[0]+1)) ) { + DEBUGLOG(9, "ZSTD_DUBT_findBetterDictMatch(%u) : found better match length %u -> %u and offsetCode %u -> %u (dictMatchIndex %u, matchIndex %u)", + curr, (U32)bestLength, (U32)matchLength, (U32)*offsetPtr, OFFSET_TO_OFFBASE(curr - matchIndex), dictMatchIndex, matchIndex); + bestLength = matchLength, *offsetPtr = OFFSET_TO_OFFBASE(curr - matchIndex); + } + if (ip+matchLength == iend) { /* reached end of input : ip[matchLength] is not valid, no way to know if it's larger or smaller than match */ + break; /* drop, to guarantee consistency (miss a little bit of compression) */ + } + } + + if (match[matchLength] < ip[matchLength]) { + if (dictMatchIndex <= btLow) { break; } /* beyond tree size, stop the search */ + commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */ + dictMatchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to current) */ + } else { + /* match is larger than current */ + if (dictMatchIndex <= btLow) { break; } /* beyond tree size, stop the search */ + commonLengthLarger = matchLength; + dictMatchIndex = nextPtr[0]; + } + } + + if (bestLength >= MINMATCH) { + U32 const mIndex = curr - (U32)OFFBASE_TO_OFFSET(*offsetPtr); (void)mIndex; + DEBUGLOG(8, "ZSTD_DUBT_findBetterDictMatch(%u) : found match of length %u and offsetCode %u (pos %u)", + curr, (U32)bestLength, (U32)*offsetPtr, mIndex); + } + return bestLength; + +} + + +static size_t +ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, + const BYTE* const ip, const BYTE* const iend, + size_t* offBasePtr, + U32 const mls, + const ZSTD_dictMode_e dictMode) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hashLog = cParams->hashLog; + size_t const h = ZSTD_hashPtr(ip, hashLog, mls); + U32 matchIndex = hashTable[h]; + + const BYTE* const base = ms->window.base; + U32 const curr = (U32)(ip-base); + U32 const windowLow = ZSTD_getLowestMatchIndex(ms, curr, cParams->windowLog); + + U32* const bt = ms->chainTable; + U32 const btLog = cParams->chainLog - 1; + U32 const btMask = (1 << btLog) - 1; + U32 const btLow = (btMask >= curr) ? 0 : curr - btMask; + U32 const unsortLimit = MAX(btLow, windowLow); + + U32* nextCandidate = bt + 2*(matchIndex&btMask); + U32* unsortedMark = bt + 2*(matchIndex&btMask) + 1; + U32 nbCompares = 1U << cParams->searchLog; + U32 nbCandidates = nbCompares; + U32 previousCandidate = 0; + + DEBUGLOG(7, "ZSTD_DUBT_findBestMatch (%u) ", curr); + assert(ip <= iend-8); /* required for h calculation */ + assert(dictMode != ZSTD_dedicatedDictSearch); + + /* reach end of unsorted candidates list */ + while ( (matchIndex > unsortLimit) + && (*unsortedMark == ZSTD_DUBT_UNSORTED_MARK) + && (nbCandidates > 1) ) { + DEBUGLOG(8, "ZSTD_DUBT_findBestMatch: candidate %u is unsorted", + matchIndex); + *unsortedMark = previousCandidate; /* the unsortedMark becomes a reversed chain, to move up back to original position */ + previousCandidate = matchIndex; + matchIndex = *nextCandidate; + nextCandidate = bt + 2*(matchIndex&btMask); + unsortedMark = bt + 2*(matchIndex&btMask) + 1; + nbCandidates --; + } + + /* nullify last candidate if it's still unsorted + * simplification, detrimental to compression ratio, beneficial for speed */ + if ( (matchIndex > unsortLimit) + && (*unsortedMark==ZSTD_DUBT_UNSORTED_MARK) ) { + DEBUGLOG(7, "ZSTD_DUBT_findBestMatch: nullify last unsorted candidate %u", + matchIndex); + *nextCandidate = *unsortedMark = 0; + } + + /* batch sort stacked candidates */ + matchIndex = previousCandidate; + while (matchIndex) { /* will end on matchIndex == 0 */ + U32* const nextCandidateIdxPtr = bt + 2*(matchIndex&btMask) + 1; + U32 const nextCandidateIdx = *nextCandidateIdxPtr; + ZSTD_insertDUBT1(ms, matchIndex, iend, + nbCandidates, unsortLimit, dictMode); + matchIndex = nextCandidateIdx; + nbCandidates++; + } + + /* find longest match */ + { size_t commonLengthSmaller = 0, commonLengthLarger = 0; + const BYTE* const dictBase = ms->window.dictBase; + const U32 dictLimit = ms->window.dictLimit; + const BYTE* const dictEnd = dictBase + dictLimit; + const BYTE* const prefixStart = base + dictLimit; + U32* smallerPtr = bt + 2*(curr&btMask); + U32* largerPtr = bt + 2*(curr&btMask) + 1; + U32 matchEndIdx = curr + 8 + 1; + U32 dummy32; /* to be nullified at the end */ + size_t bestLength = 0; + + matchIndex = hashTable[h]; + hashTable[h] = curr; /* Update Hash Table */ + + for (; nbCompares && (matchIndex > windowLow); --nbCompares) { + U32* const nextPtr = bt + 2*(matchIndex & btMask); + size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ + const BYTE* match; + + if ((dictMode != ZSTD_extDict) || (matchIndex+matchLength >= dictLimit)) { + match = base + matchIndex; + matchLength += ZSTD_count(ip+matchLength, match+matchLength, iend); + } else { + match = dictBase + matchIndex; + matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iend, dictEnd, prefixStart); + if (matchIndex+matchLength >= dictLimit) + match = base + matchIndex; /* to prepare for next usage of match[matchLength] */ + } + + if (matchLength > bestLength) { + if (matchLength > matchEndIdx - matchIndex) + matchEndIdx = matchIndex + (U32)matchLength; + if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(curr - matchIndex + 1) - ZSTD_highbit32((U32)*offBasePtr)) ) + bestLength = matchLength, *offBasePtr = OFFSET_TO_OFFBASE(curr - matchIndex); + if (ip+matchLength == iend) { /* equal : no way to know if inf or sup */ + if (dictMode == ZSTD_dictMatchState) { + nbCompares = 0; /* in addition to avoiding checking any + * further in this loop, make sure we + * skip checking in the dictionary. */ + } + break; /* drop, to guarantee consistency (miss a little bit of compression) */ + } + } + + if (match[matchLength] < ip[matchLength]) { + /* match is smaller than current */ + *smallerPtr = matchIndex; /* update smaller idx */ + commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */ + if (matchIndex <= btLow) { smallerPtr=&dummy32; break; } /* beyond tree size, stop the search */ + smallerPtr = nextPtr+1; /* new "smaller" => larger of match */ + matchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to current) */ + } else { + /* match is larger than current */ + *largerPtr = matchIndex; + commonLengthLarger = matchLength; + if (matchIndex <= btLow) { largerPtr=&dummy32; break; } /* beyond tree size, stop the search */ + largerPtr = nextPtr; + matchIndex = nextPtr[0]; + } } + + *smallerPtr = *largerPtr = 0; + + assert(nbCompares <= (1U << ZSTD_SEARCHLOG_MAX)); /* Check we haven't underflowed. */ + if (dictMode == ZSTD_dictMatchState && nbCompares) { + bestLength = ZSTD_DUBT_findBetterDictMatch( + ms, ip, iend, + offBasePtr, bestLength, nbCompares, + mls, dictMode); + } + + assert(matchEndIdx > curr+8); /* ensure nextToUpdate is increased */ + ms->nextToUpdate = matchEndIdx - 8; /* skip repetitive patterns */ + if (bestLength >= MINMATCH) { + U32 const mIndex = curr - (U32)OFFBASE_TO_OFFSET(*offBasePtr); (void)mIndex; + DEBUGLOG(8, "ZSTD_DUBT_findBestMatch(%u) : found match of length %u and offsetCode %u (pos %u)", + curr, (U32)bestLength, (U32)*offBasePtr, mIndex); + } + return bestLength; + } +} + + +/** ZSTD_BtFindBestMatch() : Tree updater, providing best match */ +FORCE_INLINE_TEMPLATE size_t +ZSTD_BtFindBestMatch( ZSTD_matchState_t* ms, + const BYTE* const ip, const BYTE* const iLimit, + size_t* offBasePtr, + const U32 mls /* template */, + const ZSTD_dictMode_e dictMode) +{ + DEBUGLOG(7, "ZSTD_BtFindBestMatch"); + if (ip < ms->window.base + ms->nextToUpdate) return 0; /* skipped area */ + ZSTD_updateDUBT(ms, ip, iLimit, mls); + return ZSTD_DUBT_findBestMatch(ms, ip, iLimit, offBasePtr, mls, dictMode); +} + +/*********************************** +* Dedicated dict search +***********************************/ + +void ZSTD_dedicatedDictSearch_lazy_loadDictionary(ZSTD_matchState_t* ms, const BYTE* const ip) +{ + const BYTE* const base = ms->window.base; + U32 const target = (U32)(ip - base); + U32* const hashTable = ms->hashTable; + U32* const chainTable = ms->chainTable; + U32 const chainSize = 1 << ms->cParams.chainLog; + U32 idx = ms->nextToUpdate; + U32 const minChain = chainSize < target - idx ? target - chainSize : idx; + U32 const bucketSize = 1 << ZSTD_LAZY_DDSS_BUCKET_LOG; + U32 const cacheSize = bucketSize - 1; + U32 const chainAttempts = (1 << ms->cParams.searchLog) - cacheSize; + U32 const chainLimit = chainAttempts > 255 ? 255 : chainAttempts; + + /* We know the hashtable is oversized by a factor of `bucketSize`. + * We are going to temporarily pretend `bucketSize == 1`, keeping only a + * single entry. We will use the rest of the space to construct a temporary + * chaintable. + */ + U32 const hashLog = ms->cParams.hashLog - ZSTD_LAZY_DDSS_BUCKET_LOG; + U32* const tmpHashTable = hashTable; + U32* const tmpChainTable = hashTable + ((size_t)1 << hashLog); + U32 const tmpChainSize = (U32)((1 << ZSTD_LAZY_DDSS_BUCKET_LOG) - 1) << hashLog; + U32 const tmpMinChain = tmpChainSize < target ? target - tmpChainSize : idx; + U32 hashIdx; + + assert(ms->cParams.chainLog <= 24); + assert(ms->cParams.hashLog > ms->cParams.chainLog); + assert(idx != 0); + assert(tmpMinChain <= minChain); + + /* fill conventional hash table and conventional chain table */ + for ( ; idx < target; idx++) { + U32 const h = (U32)ZSTD_hashPtr(base + idx, hashLog, ms->cParams.minMatch); + if (idx >= tmpMinChain) { + tmpChainTable[idx - tmpMinChain] = hashTable[h]; + } + tmpHashTable[h] = idx; + } + + /* sort chains into ddss chain table */ + { + U32 chainPos = 0; + for (hashIdx = 0; hashIdx < (1U << hashLog); hashIdx++) { + U32 count; + U32 countBeyondMinChain = 0; + U32 i = tmpHashTable[hashIdx]; + for (count = 0; i >= tmpMinChain && count < cacheSize; count++) { + /* skip through the chain to the first position that won't be + * in the hash cache bucket */ + if (i < minChain) { + countBeyondMinChain++; + } + i = tmpChainTable[i - tmpMinChain]; + } + if (count == cacheSize) { + for (count = 0; count < chainLimit;) { + if (i < minChain) { + if (!i || ++countBeyondMinChain > cacheSize) { + /* only allow pulling `cacheSize` number of entries + * into the cache or chainTable beyond `minChain`, + * to replace the entries pulled out of the + * chainTable into the cache. This lets us reach + * back further without increasing the total number + * of entries in the chainTable, guaranteeing the + * DDSS chain table will fit into the space + * allocated for the regular one. */ + break; + } + } + chainTable[chainPos++] = i; + count++; + if (i < tmpMinChain) { + break; + } + i = tmpChainTable[i - tmpMinChain]; + } + } else { + count = 0; + } + if (count) { + tmpHashTable[hashIdx] = ((chainPos - count) << 8) + count; + } else { + tmpHashTable[hashIdx] = 0; + } + } + assert(chainPos <= chainSize); /* I believe this is guaranteed... */ + } + + /* move chain pointers into the last entry of each hash bucket */ + for (hashIdx = (1 << hashLog); hashIdx; ) { + U32 const bucketIdx = --hashIdx << ZSTD_LAZY_DDSS_BUCKET_LOG; + U32 const chainPackedPointer = tmpHashTable[hashIdx]; + U32 i; + for (i = 0; i < cacheSize; i++) { + hashTable[bucketIdx + i] = 0; + } + hashTable[bucketIdx + bucketSize - 1] = chainPackedPointer; + } + + /* fill the buckets of the hash table */ + for (idx = ms->nextToUpdate; idx < target; idx++) { + U32 const h = (U32)ZSTD_hashPtr(base + idx, hashLog, ms->cParams.minMatch) + << ZSTD_LAZY_DDSS_BUCKET_LOG; + U32 i; + /* Shift hash cache down 1. */ + for (i = cacheSize - 1; i; i--) + hashTable[h + i] = hashTable[h + i - 1]; + hashTable[h] = idx; + } + + ms->nextToUpdate = target; +} + +/* Returns the longest match length found in the dedicated dict search structure. + * If none are longer than the argument ml, then ml will be returned. + */ +FORCE_INLINE_TEMPLATE +size_t ZSTD_dedicatedDictSearch_lazy_search(size_t* offsetPtr, size_t ml, U32 nbAttempts, + const ZSTD_matchState_t* const dms, + const BYTE* const ip, const BYTE* const iLimit, + const BYTE* const prefixStart, const U32 curr, + const U32 dictLimit, const size_t ddsIdx) { + const U32 ddsLowestIndex = dms->window.dictLimit; + const BYTE* const ddsBase = dms->window.base; + const BYTE* const ddsEnd = dms->window.nextSrc; + const U32 ddsSize = (U32)(ddsEnd - ddsBase); + const U32 ddsIndexDelta = dictLimit - ddsSize; + const U32 bucketSize = (1 << ZSTD_LAZY_DDSS_BUCKET_LOG); + const U32 bucketLimit = nbAttempts < bucketSize - 1 ? nbAttempts : bucketSize - 1; + U32 ddsAttempt; + U32 matchIndex; + + for (ddsAttempt = 0; ddsAttempt < bucketSize - 1; ddsAttempt++) { + PREFETCH_L1(ddsBase + dms->hashTable[ddsIdx + ddsAttempt]); + } + + { + U32 const chainPackedPointer = dms->hashTable[ddsIdx + bucketSize - 1]; + U32 const chainIndex = chainPackedPointer >> 8; + + PREFETCH_L1(&dms->chainTable[chainIndex]); + } + + for (ddsAttempt = 0; ddsAttempt < bucketLimit; ddsAttempt++) { + size_t currentMl=0; + const BYTE* match; + matchIndex = dms->hashTable[ddsIdx + ddsAttempt]; + match = ddsBase + matchIndex; + + if (!matchIndex) { + return ml; + } + + /* guaranteed by table construction */ + (void)ddsLowestIndex; + assert(matchIndex >= ddsLowestIndex); + assert(match+4 <= ddsEnd); + if (MEM_read32(match) == MEM_read32(ip)) { + /* assumption : matchIndex <= dictLimit-4 (by table construction) */ + currentMl = ZSTD_count_2segments(ip+4, match+4, iLimit, ddsEnd, prefixStart) + 4; + } + + /* save best solution */ + if (currentMl > ml) { + ml = currentMl; + *offsetPtr = OFFSET_TO_OFFBASE(curr - (matchIndex + ddsIndexDelta)); + if (ip+currentMl == iLimit) { + /* best possible, avoids read overflow on next attempt */ + return ml; + } + } + } + + { + U32 const chainPackedPointer = dms->hashTable[ddsIdx + bucketSize - 1]; + U32 chainIndex = chainPackedPointer >> 8; + U32 const chainLength = chainPackedPointer & 0xFF; + U32 const chainAttempts = nbAttempts - ddsAttempt; + U32 const chainLimit = chainAttempts > chainLength ? chainLength : chainAttempts; + U32 chainAttempt; + + for (chainAttempt = 0 ; chainAttempt < chainLimit; chainAttempt++) { + PREFETCH_L1(ddsBase + dms->chainTable[chainIndex + chainAttempt]); + } + + for (chainAttempt = 0 ; chainAttempt < chainLimit; chainAttempt++, chainIndex++) { + size_t currentMl=0; + const BYTE* match; + matchIndex = dms->chainTable[chainIndex]; + match = ddsBase + matchIndex; + + /* guaranteed by table construction */ + assert(matchIndex >= ddsLowestIndex); + assert(match+4 <= ddsEnd); + if (MEM_read32(match) == MEM_read32(ip)) { + /* assumption : matchIndex <= dictLimit-4 (by table construction) */ + currentMl = ZSTD_count_2segments(ip+4, match+4, iLimit, ddsEnd, prefixStart) + 4; + } + + /* save best solution */ + if (currentMl > ml) { + ml = currentMl; + *offsetPtr = OFFSET_TO_OFFBASE(curr - (matchIndex + ddsIndexDelta)); + if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ + } + } + } + return ml; +} + + +/* ********************************* +* Hash Chain +***********************************/ +#define NEXT_IN_CHAIN(d, mask) chainTable[(d) & (mask)] + +/* Update chains up to ip (excluded) + Assumption : always within prefix (i.e. not within extDict) */ +FORCE_INLINE_TEMPLATE U32 ZSTD_insertAndFindFirstIndex_internal( + ZSTD_matchState_t* ms, + const ZSTD_compressionParameters* const cParams, + const BYTE* ip, U32 const mls, U32 const lazySkipping) +{ + U32* const hashTable = ms->hashTable; + const U32 hashLog = cParams->hashLog; + U32* const chainTable = ms->chainTable; + const U32 chainMask = (1 << cParams->chainLog) - 1; + const BYTE* const base = ms->window.base; + const U32 target = (U32)(ip - base); + U32 idx = ms->nextToUpdate; + + while(idx < target) { /* catch up */ + size_t const h = ZSTD_hashPtr(base+idx, hashLog, mls); + NEXT_IN_CHAIN(idx, chainMask) = hashTable[h]; + hashTable[h] = idx; + idx++; + /* Stop inserting every position when in the lazy skipping mode. */ + if (lazySkipping) + break; + } + + ms->nextToUpdate = target; + return hashTable[ZSTD_hashPtr(ip, hashLog, mls)]; +} + +U32 ZSTD_insertAndFindFirstIndex(ZSTD_matchState_t* ms, const BYTE* ip) { + const ZSTD_compressionParameters* const cParams = &ms->cParams; + return ZSTD_insertAndFindFirstIndex_internal(ms, cParams, ip, ms->cParams.minMatch, /* lazySkipping*/ 0); +} + +/* inlining is important to hardwire a hot branch (template emulation) */ +FORCE_INLINE_TEMPLATE +size_t ZSTD_HcFindBestMatch( + ZSTD_matchState_t* ms, + const BYTE* const ip, const BYTE* const iLimit, + size_t* offsetPtr, + const U32 mls, const ZSTD_dictMode_e dictMode) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const chainTable = ms->chainTable; + const U32 chainSize = (1 << cParams->chainLog); + const U32 chainMask = chainSize-1; + const BYTE* const base = ms->window.base; + const BYTE* const dictBase = ms->window.dictBase; + const U32 dictLimit = ms->window.dictLimit; + const BYTE* const prefixStart = base + dictLimit; + const BYTE* const dictEnd = dictBase + dictLimit; + const U32 curr = (U32)(ip-base); + const U32 maxDistance = 1U << cParams->windowLog; + const U32 lowestValid = ms->window.lowLimit; + const U32 withinMaxDistance = (curr - lowestValid > maxDistance) ? curr - maxDistance : lowestValid; + const U32 isDictionary = (ms->loadedDictEnd != 0); + const U32 lowLimit = isDictionary ? lowestValid : withinMaxDistance; + const U32 minChain = curr > chainSize ? curr - chainSize : 0; + U32 nbAttempts = 1U << cParams->searchLog; + size_t ml=4-1; + + const ZSTD_matchState_t* const dms = ms->dictMatchState; + const U32 ddsHashLog = dictMode == ZSTD_dedicatedDictSearch + ? dms->cParams.hashLog - ZSTD_LAZY_DDSS_BUCKET_LOG : 0; + const size_t ddsIdx = dictMode == ZSTD_dedicatedDictSearch + ? ZSTD_hashPtr(ip, ddsHashLog, mls) << ZSTD_LAZY_DDSS_BUCKET_LOG : 0; + + U32 matchIndex; + + if (dictMode == ZSTD_dedicatedDictSearch) { + const U32* entry = &dms->hashTable[ddsIdx]; + PREFETCH_L1(entry); + } + + /* HC4 match finder */ + matchIndex = ZSTD_insertAndFindFirstIndex_internal(ms, cParams, ip, mls, ms->lazySkipping); + + for ( ; (matchIndex>=lowLimit) & (nbAttempts>0) ; nbAttempts--) { + size_t currentMl=0; + if ((dictMode != ZSTD_extDict) || matchIndex >= dictLimit) { + const BYTE* const match = base + matchIndex; + assert(matchIndex >= dictLimit); /* ensures this is true if dictMode != ZSTD_extDict */ + /* read 4B starting from (match + ml + 1 - sizeof(U32)) */ + if (MEM_read32(match + ml - 3) == MEM_read32(ip + ml - 3)) /* potentially better */ + currentMl = ZSTD_count(ip, match, iLimit); + } else { + const BYTE* const match = dictBase + matchIndex; + assert(match+4 <= dictEnd); + if (MEM_read32(match) == MEM_read32(ip)) /* assumption : matchIndex <= dictLimit-4 (by table construction) */ + currentMl = ZSTD_count_2segments(ip+4, match+4, iLimit, dictEnd, prefixStart) + 4; + } + + /* save best solution */ + if (currentMl > ml) { + ml = currentMl; + *offsetPtr = OFFSET_TO_OFFBASE(curr - matchIndex); + if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ + } + + if (matchIndex <= minChain) break; + matchIndex = NEXT_IN_CHAIN(matchIndex, chainMask); + } + + assert(nbAttempts <= (1U << ZSTD_SEARCHLOG_MAX)); /* Check we haven't underflowed. */ + if (dictMode == ZSTD_dedicatedDictSearch) { + ml = ZSTD_dedicatedDictSearch_lazy_search(offsetPtr, ml, nbAttempts, dms, + ip, iLimit, prefixStart, curr, dictLimit, ddsIdx); + } else if (dictMode == ZSTD_dictMatchState) { + const U32* const dmsChainTable = dms->chainTable; + const U32 dmsChainSize = (1 << dms->cParams.chainLog); + const U32 dmsChainMask = dmsChainSize - 1; + const U32 dmsLowestIndex = dms->window.dictLimit; + const BYTE* const dmsBase = dms->window.base; + const BYTE* const dmsEnd = dms->window.nextSrc; + const U32 dmsSize = (U32)(dmsEnd - dmsBase); + const U32 dmsIndexDelta = dictLimit - dmsSize; + const U32 dmsMinChain = dmsSize > dmsChainSize ? dmsSize - dmsChainSize : 0; + + matchIndex = dms->hashTable[ZSTD_hashPtr(ip, dms->cParams.hashLog, mls)]; + + for ( ; (matchIndex>=dmsLowestIndex) & (nbAttempts>0) ; nbAttempts--) { + size_t currentMl=0; + const BYTE* const match = dmsBase + matchIndex; + assert(match+4 <= dmsEnd); + if (MEM_read32(match) == MEM_read32(ip)) /* assumption : matchIndex <= dictLimit-4 (by table construction) */ + currentMl = ZSTD_count_2segments(ip+4, match+4, iLimit, dmsEnd, prefixStart) + 4; + + /* save best solution */ + if (currentMl > ml) { + ml = currentMl; + assert(curr > matchIndex + dmsIndexDelta); + *offsetPtr = OFFSET_TO_OFFBASE(curr - (matchIndex + dmsIndexDelta)); + if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ + } + + if (matchIndex <= dmsMinChain) break; + + matchIndex = dmsChainTable[matchIndex & dmsChainMask]; + } + } + + return ml; +} + +/* ********************************* +* (SIMD) Row-based matchfinder +***********************************/ +/* Constants for row-based hash */ +#define ZSTD_ROW_HASH_TAG_MASK ((1u << ZSTD_ROW_HASH_TAG_BITS) - 1) +#define ZSTD_ROW_HASH_MAX_ENTRIES 64 /* absolute maximum number of entries per row, for all configurations */ + +#define ZSTD_ROW_HASH_CACHE_MASK (ZSTD_ROW_HASH_CACHE_SIZE - 1) + +typedef U64 ZSTD_VecMask; /* Clarifies when we are interacting with a U64 representing a mask of matches */ + +/* ZSTD_VecMask_next(): + * Starting from the LSB, returns the idx of the next non-zero bit. + * Basically counting the nb of trailing zeroes. + */ +MEM_STATIC U32 ZSTD_VecMask_next(ZSTD_VecMask val) { + return ZSTD_countTrailingZeros64(val); +} + +/* ZSTD_row_nextIndex(): + * Returns the next index to insert at within a tagTable row, and updates the "head" + * value to reflect the update. Essentially cycles backwards from [1, {entries per row}) + */ +FORCE_INLINE_TEMPLATE U32 ZSTD_row_nextIndex(BYTE* const tagRow, U32 const rowMask) { + U32 next = (*tagRow-1) & rowMask; + next += (next == 0) ? rowMask : 0; /* skip first position */ + *tagRow = (BYTE)next; + return next; +} + +/* ZSTD_isAligned(): + * Checks that a pointer is aligned to "align" bytes which must be a power of 2. + */ +MEM_STATIC int ZSTD_isAligned(void const* ptr, size_t align) { + assert((align & (align - 1)) == 0); + return (((size_t)ptr) & (align - 1)) == 0; +} + +/* ZSTD_row_prefetch(): + * Performs prefetching for the hashTable and tagTable at a given row. + */ +FORCE_INLINE_TEMPLATE void ZSTD_row_prefetch(U32 const* hashTable, BYTE const* tagTable, U32 const relRow, U32 const rowLog) { + PREFETCH_L1(hashTable + relRow); + if (rowLog >= 5) { + PREFETCH_L1(hashTable + relRow + 16); + /* Note: prefetching more of the hash table does not appear to be beneficial for 128-entry rows */ + } + PREFETCH_L1(tagTable + relRow); + if (rowLog == 6) { + PREFETCH_L1(tagTable + relRow + 32); + } + assert(rowLog == 4 || rowLog == 5 || rowLog == 6); + assert(ZSTD_isAligned(hashTable + relRow, 64)); /* prefetched hash row always 64-byte aligned */ + assert(ZSTD_isAligned(tagTable + relRow, (size_t)1 << rowLog)); /* prefetched tagRow sits on correct multiple of bytes (32,64,128) */ +} + +/* ZSTD_row_fillHashCache(): + * Fill up the hash cache starting at idx, prefetching up to ZSTD_ROW_HASH_CACHE_SIZE entries, + * but not beyond iLimit. + */ +FORCE_INLINE_TEMPLATE void ZSTD_row_fillHashCache(ZSTD_matchState_t* ms, const BYTE* base, + U32 const rowLog, U32 const mls, + U32 idx, const BYTE* const iLimit) +{ + U32 const* const hashTable = ms->hashTable; + BYTE const* const tagTable = ms->tagTable; + U32 const hashLog = ms->rowHashLog; + U32 const maxElemsToPrefetch = (base + idx) > iLimit ? 0 : (U32)(iLimit - (base + idx) + 1); + U32 const lim = idx + MIN(ZSTD_ROW_HASH_CACHE_SIZE, maxElemsToPrefetch); + + for (; idx < lim; ++idx) { + U32 const hash = (U32)ZSTD_hashPtrSalted(base + idx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls, ms->hashSalt); + U32 const row = (hash >> ZSTD_ROW_HASH_TAG_BITS) << rowLog; + ZSTD_row_prefetch(hashTable, tagTable, row, rowLog); + ms->hashCache[idx & ZSTD_ROW_HASH_CACHE_MASK] = hash; + } + + DEBUGLOG(6, "ZSTD_row_fillHashCache(): [%u %u %u %u %u %u %u %u]", ms->hashCache[0], ms->hashCache[1], + ms->hashCache[2], ms->hashCache[3], ms->hashCache[4], + ms->hashCache[5], ms->hashCache[6], ms->hashCache[7]); +} + +/* ZSTD_row_nextCachedHash(): + * Returns the hash of base + idx, and replaces the hash in the hash cache with the byte at + * base + idx + ZSTD_ROW_HASH_CACHE_SIZE. Also prefetches the appropriate rows from hashTable and tagTable. + */ +FORCE_INLINE_TEMPLATE U32 ZSTD_row_nextCachedHash(U32* cache, U32 const* hashTable, + BYTE const* tagTable, BYTE const* base, + U32 idx, U32 const hashLog, + U32 const rowLog, U32 const mls, + U64 const hashSalt) +{ + U32 const newHash = (U32)ZSTD_hashPtrSalted(base+idx+ZSTD_ROW_HASH_CACHE_SIZE, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls, hashSalt); + U32 const row = (newHash >> ZSTD_ROW_HASH_TAG_BITS) << rowLog; + ZSTD_row_prefetch(hashTable, tagTable, row, rowLog); + { U32 const hash = cache[idx & ZSTD_ROW_HASH_CACHE_MASK]; + cache[idx & ZSTD_ROW_HASH_CACHE_MASK] = newHash; + return hash; + } +} + +/* ZSTD_row_update_internalImpl(): + * Updates the hash table with positions starting from updateStartIdx until updateEndIdx. + */ +FORCE_INLINE_TEMPLATE void ZSTD_row_update_internalImpl(ZSTD_matchState_t* ms, + U32 updateStartIdx, U32 const updateEndIdx, + U32 const mls, U32 const rowLog, + U32 const rowMask, U32 const useCache) +{ + U32* const hashTable = ms->hashTable; + BYTE* const tagTable = ms->tagTable; + U32 const hashLog = ms->rowHashLog; + const BYTE* const base = ms->window.base; + + DEBUGLOG(6, "ZSTD_row_update_internalImpl(): updateStartIdx=%u, updateEndIdx=%u", updateStartIdx, updateEndIdx); + for (; updateStartIdx < updateEndIdx; ++updateStartIdx) { + U32 const hash = useCache ? ZSTD_row_nextCachedHash(ms->hashCache, hashTable, tagTable, base, updateStartIdx, hashLog, rowLog, mls, ms->hashSalt) + : (U32)ZSTD_hashPtrSalted(base + updateStartIdx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls, ms->hashSalt); + U32 const relRow = (hash >> ZSTD_ROW_HASH_TAG_BITS) << rowLog; + U32* const row = hashTable + relRow; + BYTE* tagRow = tagTable + relRow; + U32 const pos = ZSTD_row_nextIndex(tagRow, rowMask); + + assert(hash == ZSTD_hashPtrSalted(base + updateStartIdx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls, ms->hashSalt)); + tagRow[pos] = hash & ZSTD_ROW_HASH_TAG_MASK; + row[pos] = updateStartIdx; + } +} + +/* ZSTD_row_update_internal(): + * Inserts the byte at ip into the appropriate position in the hash table, and updates ms->nextToUpdate. + * Skips sections of long matches as is necessary. + */ +FORCE_INLINE_TEMPLATE void ZSTD_row_update_internal(ZSTD_matchState_t* ms, const BYTE* ip, + U32 const mls, U32 const rowLog, + U32 const rowMask, U32 const useCache) +{ + U32 idx = ms->nextToUpdate; + const BYTE* const base = ms->window.base; + const U32 target = (U32)(ip - base); + const U32 kSkipThreshold = 384; + const U32 kMaxMatchStartPositionsToUpdate = 96; + const U32 kMaxMatchEndPositionsToUpdate = 32; + + if (useCache) { + /* Only skip positions when using hash cache, i.e. + * if we are loading a dict, don't skip anything. + * If we decide to skip, then we only update a set number + * of positions at the beginning and end of the match. + */ + if (UNLIKELY(target - idx > kSkipThreshold)) { + U32 const bound = idx + kMaxMatchStartPositionsToUpdate; + ZSTD_row_update_internalImpl(ms, idx, bound, mls, rowLog, rowMask, useCache); + idx = target - kMaxMatchEndPositionsToUpdate; + ZSTD_row_fillHashCache(ms, base, rowLog, mls, idx, ip+1); + } + } + assert(target >= idx); + ZSTD_row_update_internalImpl(ms, idx, target, mls, rowLog, rowMask, useCache); + ms->nextToUpdate = target; +} + +/* ZSTD_row_update(): + * External wrapper for ZSTD_row_update_internal(). Used for filling the hashtable during dictionary + * processing. + */ +void ZSTD_row_update(ZSTD_matchState_t* const ms, const BYTE* ip) { + const U32 rowLog = BOUNDED(4, ms->cParams.searchLog, 6); + const U32 rowMask = (1u << rowLog) - 1; + const U32 mls = MIN(ms->cParams.minMatch, 6 /* mls caps out at 6 */); + + DEBUGLOG(5, "ZSTD_row_update(), rowLog=%u", rowLog); + ZSTD_row_update_internal(ms, ip, mls, rowLog, rowMask, 0 /* don't use cache */); +} + +/* Returns the mask width of bits group of which will be set to 1. Given not all + * architectures have easy movemask instruction, this helps to iterate over + * groups of bits easier and faster. + */ +FORCE_INLINE_TEMPLATE U32 +ZSTD_row_matchMaskGroupWidth(const U32 rowEntries) +{ + assert((rowEntries == 16) || (rowEntries == 32) || rowEntries == 64); + assert(rowEntries <= ZSTD_ROW_HASH_MAX_ENTRIES); + (void)rowEntries; +#if defined(ZSTD_ARCH_ARM_NEON) + /* NEON path only works for little endian */ + if (!MEM_isLittleEndian()) { + return 1; + } + if (rowEntries == 16) { + return 4; + } + if (rowEntries == 32) { + return 2; + } + if (rowEntries == 64) { + return 1; + } +#endif + return 1; +} + +#if defined(ZSTD_ARCH_X86_SSE2) +FORCE_INLINE_TEMPLATE ZSTD_VecMask +ZSTD_row_getSSEMask(int nbChunks, const BYTE* const src, const BYTE tag, const U32 head) +{ + const __m128i comparisonMask = _mm_set1_epi8((char)tag); + int matches[4] = {0}; + int i; + assert(nbChunks == 1 || nbChunks == 2 || nbChunks == 4); + for (i=0; i> chunkSize; + do { + size_t chunk = MEM_readST(&src[i]); + chunk ^= splatChar; + chunk = (((chunk | x80) - x01) | chunk) & x80; + matches <<= chunkSize; + matches |= (chunk * extractMagic) >> shiftAmount; + i -= chunkSize; + } while (i >= 0); + } else { /* big endian: reverse bits during extraction */ + const size_t msb = xFF ^ (xFF >> 1); + const size_t extractMagic = (msb / 0x1FF) | msb; + do { + size_t chunk = MEM_readST(&src[i]); + chunk ^= splatChar; + chunk = (((chunk | x80) - x01) | chunk) & x80; + matches <<= chunkSize; + matches |= ((chunk >> 7) * extractMagic) >> shiftAmount; + i -= chunkSize; + } while (i >= 0); + } + matches = ~matches; + if (rowEntries == 16) { + return ZSTD_rotateRight_U16((U16)matches, headGrouped); + } else if (rowEntries == 32) { + return ZSTD_rotateRight_U32((U32)matches, headGrouped); + } else { + return ZSTD_rotateRight_U64((U64)matches, headGrouped); + } + } +#endif +} + +/* The high-level approach of the SIMD row based match finder is as follows: + * - Figure out where to insert the new entry: + * - Generate a hash from a byte along with an additional 1-byte "short hash". The additional byte is our "tag" + * - The hashTable is effectively split into groups or "rows" of 16 or 32 entries of U32, and the hash determines + * which row to insert into. + * - Determine the correct position within the row to insert the entry into. Each row of 16 or 32 can + * be considered as a circular buffer with a "head" index that resides in the tagTable. + * - Also insert the "tag" into the equivalent row and position in the tagTable. + * - Note: The tagTable has 17 or 33 1-byte entries per row, due to 16 or 32 tags, and 1 "head" entry. + * The 17 or 33 entry rows are spaced out to occur every 32 or 64 bytes, respectively, + * for alignment/performance reasons, leaving some bytes unused. + * - Use SIMD to efficiently compare the tags in the tagTable to the 1-byte "short hash" and + * generate a bitfield that we can cycle through to check the collisions in the hash table. + * - Pick the longest match. + */ +FORCE_INLINE_TEMPLATE +size_t ZSTD_RowFindBestMatch( + ZSTD_matchState_t* ms, + const BYTE* const ip, const BYTE* const iLimit, + size_t* offsetPtr, + const U32 mls, const ZSTD_dictMode_e dictMode, + const U32 rowLog) +{ + U32* const hashTable = ms->hashTable; + BYTE* const tagTable = ms->tagTable; + U32* const hashCache = ms->hashCache; + const U32 hashLog = ms->rowHashLog; + const ZSTD_compressionParameters* const cParams = &ms->cParams; + const BYTE* const base = ms->window.base; + const BYTE* const dictBase = ms->window.dictBase; + const U32 dictLimit = ms->window.dictLimit; + const BYTE* const prefixStart = base + dictLimit; + const BYTE* const dictEnd = dictBase + dictLimit; + const U32 curr = (U32)(ip-base); + const U32 maxDistance = 1U << cParams->windowLog; + const U32 lowestValid = ms->window.lowLimit; + const U32 withinMaxDistance = (curr - lowestValid > maxDistance) ? curr - maxDistance : lowestValid; + const U32 isDictionary = (ms->loadedDictEnd != 0); + const U32 lowLimit = isDictionary ? lowestValid : withinMaxDistance; + const U32 rowEntries = (1U << rowLog); + const U32 rowMask = rowEntries - 1; + const U32 cappedSearchLog = MIN(cParams->searchLog, rowLog); /* nb of searches is capped at nb entries per row */ + const U32 groupWidth = ZSTD_row_matchMaskGroupWidth(rowEntries); + const U64 hashSalt = ms->hashSalt; + U32 nbAttempts = 1U << cappedSearchLog; + size_t ml=4-1; + U32 hash; + + /* DMS/DDS variables that may be referenced laster */ + const ZSTD_matchState_t* const dms = ms->dictMatchState; + + /* Initialize the following variables to satisfy static analyzer */ + size_t ddsIdx = 0; + U32 ddsExtraAttempts = 0; /* cctx hash tables are limited in searches, but allow extra searches into DDS */ + U32 dmsTag = 0; + U32* dmsRow = NULL; + BYTE* dmsTagRow = NULL; + + if (dictMode == ZSTD_dedicatedDictSearch) { + const U32 ddsHashLog = dms->cParams.hashLog - ZSTD_LAZY_DDSS_BUCKET_LOG; + { /* Prefetch DDS hashtable entry */ + ddsIdx = ZSTD_hashPtr(ip, ddsHashLog, mls) << ZSTD_LAZY_DDSS_BUCKET_LOG; + PREFETCH_L1(&dms->hashTable[ddsIdx]); + } + ddsExtraAttempts = cParams->searchLog > rowLog ? 1U << (cParams->searchLog - rowLog) : 0; + } + + if (dictMode == ZSTD_dictMatchState) { + /* Prefetch DMS rows */ + U32* const dmsHashTable = dms->hashTable; + BYTE* const dmsTagTable = dms->tagTable; + U32 const dmsHash = (U32)ZSTD_hashPtr(ip, dms->rowHashLog + ZSTD_ROW_HASH_TAG_BITS, mls); + U32 const dmsRelRow = (dmsHash >> ZSTD_ROW_HASH_TAG_BITS) << rowLog; + dmsTag = dmsHash & ZSTD_ROW_HASH_TAG_MASK; + dmsTagRow = (BYTE*)(dmsTagTable + dmsRelRow); + dmsRow = dmsHashTable + dmsRelRow; + ZSTD_row_prefetch(dmsHashTable, dmsTagTable, dmsRelRow, rowLog); + } + + /* Update the hashTable and tagTable up to (but not including) ip */ + if (!ms->lazySkipping) { + ZSTD_row_update_internal(ms, ip, mls, rowLog, rowMask, 1 /* useCache */); + hash = ZSTD_row_nextCachedHash(hashCache, hashTable, tagTable, base, curr, hashLog, rowLog, mls, hashSalt); + } else { + /* Stop inserting every position when in the lazy skipping mode. + * The hash cache is also not kept up to date in this mode. + */ + hash = (U32)ZSTD_hashPtrSalted(ip, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls, hashSalt); + ms->nextToUpdate = curr; + } + ms->hashSaltEntropy += hash; /* collect salt entropy */ + + { /* Get the hash for ip, compute the appropriate row */ + U32 const relRow = (hash >> ZSTD_ROW_HASH_TAG_BITS) << rowLog; + U32 const tag = hash & ZSTD_ROW_HASH_TAG_MASK; + U32* const row = hashTable + relRow; + BYTE* tagRow = (BYTE*)(tagTable + relRow); + U32 const headGrouped = (*tagRow & rowMask) * groupWidth; + U32 matchBuffer[ZSTD_ROW_HASH_MAX_ENTRIES]; + size_t numMatches = 0; + size_t currMatch = 0; + ZSTD_VecMask matches = ZSTD_row_getMatchMask(tagRow, (BYTE)tag, headGrouped, rowEntries); + + /* Cycle through the matches and prefetch */ + for (; (matches > 0) && (nbAttempts > 0); matches &= (matches - 1)) { + U32 const matchPos = ((headGrouped + ZSTD_VecMask_next(matches)) / groupWidth) & rowMask; + U32 const matchIndex = row[matchPos]; + if(matchPos == 0) continue; + assert(numMatches < rowEntries); + if (matchIndex < lowLimit) + break; + if ((dictMode != ZSTD_extDict) || matchIndex >= dictLimit) { + PREFETCH_L1(base + matchIndex); + } else { + PREFETCH_L1(dictBase + matchIndex); + } + matchBuffer[numMatches++] = matchIndex; + --nbAttempts; + } + + /* Speed opt: insert current byte into hashtable too. This allows us to avoid one iteration of the loop + in ZSTD_row_update_internal() at the next search. */ + { + U32 const pos = ZSTD_row_nextIndex(tagRow, rowMask); + tagRow[pos] = (BYTE)tag; + row[pos] = ms->nextToUpdate++; + } + + /* Return the longest match */ + for (; currMatch < numMatches; ++currMatch) { + U32 const matchIndex = matchBuffer[currMatch]; + size_t currentMl=0; + assert(matchIndex < curr); + assert(matchIndex >= lowLimit); + + if ((dictMode != ZSTD_extDict) || matchIndex >= dictLimit) { + const BYTE* const match = base + matchIndex; + assert(matchIndex >= dictLimit); /* ensures this is true if dictMode != ZSTD_extDict */ + /* read 4B starting from (match + ml + 1 - sizeof(U32)) */ + if (MEM_read32(match + ml - 3) == MEM_read32(ip + ml - 3)) /* potentially better */ + currentMl = ZSTD_count(ip, match, iLimit); + } else { + const BYTE* const match = dictBase + matchIndex; + assert(match+4 <= dictEnd); + if (MEM_read32(match) == MEM_read32(ip)) /* assumption : matchIndex <= dictLimit-4 (by table construction) */ + currentMl = ZSTD_count_2segments(ip+4, match+4, iLimit, dictEnd, prefixStart) + 4; + } + + /* Save best solution */ + if (currentMl > ml) { + ml = currentMl; + *offsetPtr = OFFSET_TO_OFFBASE(curr - matchIndex); + if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ + } + } + } + + assert(nbAttempts <= (1U << ZSTD_SEARCHLOG_MAX)); /* Check we haven't underflowed. */ + if (dictMode == ZSTD_dedicatedDictSearch) { + ml = ZSTD_dedicatedDictSearch_lazy_search(offsetPtr, ml, nbAttempts + ddsExtraAttempts, dms, + ip, iLimit, prefixStart, curr, dictLimit, ddsIdx); + } else if (dictMode == ZSTD_dictMatchState) { + /* TODO: Measure and potentially add prefetching to DMS */ + const U32 dmsLowestIndex = dms->window.dictLimit; + const BYTE* const dmsBase = dms->window.base; + const BYTE* const dmsEnd = dms->window.nextSrc; + const U32 dmsSize = (U32)(dmsEnd - dmsBase); + const U32 dmsIndexDelta = dictLimit - dmsSize; + + { U32 const headGrouped = (*dmsTagRow & rowMask) * groupWidth; + U32 matchBuffer[ZSTD_ROW_HASH_MAX_ENTRIES]; + size_t numMatches = 0; + size_t currMatch = 0; + ZSTD_VecMask matches = ZSTD_row_getMatchMask(dmsTagRow, (BYTE)dmsTag, headGrouped, rowEntries); + + for (; (matches > 0) && (nbAttempts > 0); matches &= (matches - 1)) { + U32 const matchPos = ((headGrouped + ZSTD_VecMask_next(matches)) / groupWidth) & rowMask; + U32 const matchIndex = dmsRow[matchPos]; + if(matchPos == 0) continue; + if (matchIndex < dmsLowestIndex) + break; + PREFETCH_L1(dmsBase + matchIndex); + matchBuffer[numMatches++] = matchIndex; + --nbAttempts; + } + + /* Return the longest match */ + for (; currMatch < numMatches; ++currMatch) { + U32 const matchIndex = matchBuffer[currMatch]; + size_t currentMl=0; + assert(matchIndex >= dmsLowestIndex); + assert(matchIndex < curr); + + { const BYTE* const match = dmsBase + matchIndex; + assert(match+4 <= dmsEnd); + if (MEM_read32(match) == MEM_read32(ip)) + currentMl = ZSTD_count_2segments(ip+4, match+4, iLimit, dmsEnd, prefixStart) + 4; + } + + if (currentMl > ml) { + ml = currentMl; + assert(curr > matchIndex + dmsIndexDelta); + *offsetPtr = OFFSET_TO_OFFBASE(curr - (matchIndex + dmsIndexDelta)); + if (ip+currentMl == iLimit) break; + } + } + } + } + return ml; +} + + +/** + * Generate search functions templated on (dictMode, mls, rowLog). + * These functions are outlined for code size & compilation time. + * ZSTD_searchMax() dispatches to the correct implementation function. + * + * TODO: The start of the search function involves loading and calculating a + * bunch of constants from the ZSTD_matchState_t. These computations could be + * done in an initialization function, and saved somewhere in the match state. + * Then we could pass a pointer to the saved state instead of the match state, + * and avoid duplicate computations. + * + * TODO: Move the match re-winding into searchMax. This improves compression + * ratio, and unlocks further simplifications with the next TODO. + * + * TODO: Try moving the repcode search into searchMax. After the re-winding + * and repcode search are in searchMax, there is no more logic in the match + * finder loop that requires knowledge about the dictMode. So we should be + * able to avoid force inlining it, and we can join the extDict loop with + * the single segment loop. It should go in searchMax instead of its own + * function to avoid having multiple virtual function calls per search. + */ + +#define ZSTD_BT_SEARCH_FN(dictMode, mls) ZSTD_BtFindBestMatch_##dictMode##_##mls +#define ZSTD_HC_SEARCH_FN(dictMode, mls) ZSTD_HcFindBestMatch_##dictMode##_##mls +#define ZSTD_ROW_SEARCH_FN(dictMode, mls, rowLog) ZSTD_RowFindBestMatch_##dictMode##_##mls##_##rowLog + +#define ZSTD_SEARCH_FN_ATTRS FORCE_NOINLINE + +#define GEN_ZSTD_BT_SEARCH_FN(dictMode, mls) \ + ZSTD_SEARCH_FN_ATTRS size_t ZSTD_BT_SEARCH_FN(dictMode, mls)( \ + ZSTD_matchState_t* ms, \ + const BYTE* ip, const BYTE* const iLimit, \ + size_t* offBasePtr) \ + { \ + assert(MAX(4, MIN(6, ms->cParams.minMatch)) == mls); \ + return ZSTD_BtFindBestMatch(ms, ip, iLimit, offBasePtr, mls, ZSTD_##dictMode); \ + } \ + +#define GEN_ZSTD_HC_SEARCH_FN(dictMode, mls) \ + ZSTD_SEARCH_FN_ATTRS size_t ZSTD_HC_SEARCH_FN(dictMode, mls)( \ + ZSTD_matchState_t* ms, \ + const BYTE* ip, const BYTE* const iLimit, \ + size_t* offsetPtr) \ + { \ + assert(MAX(4, MIN(6, ms->cParams.minMatch)) == mls); \ + return ZSTD_HcFindBestMatch(ms, ip, iLimit, offsetPtr, mls, ZSTD_##dictMode); \ + } \ + +#define GEN_ZSTD_ROW_SEARCH_FN(dictMode, mls, rowLog) \ + ZSTD_SEARCH_FN_ATTRS size_t ZSTD_ROW_SEARCH_FN(dictMode, mls, rowLog)( \ + ZSTD_matchState_t* ms, \ + const BYTE* ip, const BYTE* const iLimit, \ + size_t* offsetPtr) \ + { \ + assert(MAX(4, MIN(6, ms->cParams.minMatch)) == mls); \ + assert(MAX(4, MIN(6, ms->cParams.searchLog)) == rowLog); \ + return ZSTD_RowFindBestMatch(ms, ip, iLimit, offsetPtr, mls, ZSTD_##dictMode, rowLog); \ + } \ + +#define ZSTD_FOR_EACH_ROWLOG(X, dictMode, mls) \ + X(dictMode, mls, 4) \ + X(dictMode, mls, 5) \ + X(dictMode, mls, 6) + +#define ZSTD_FOR_EACH_MLS_ROWLOG(X, dictMode) \ + ZSTD_FOR_EACH_ROWLOG(X, dictMode, 4) \ + ZSTD_FOR_EACH_ROWLOG(X, dictMode, 5) \ + ZSTD_FOR_EACH_ROWLOG(X, dictMode, 6) + +#define ZSTD_FOR_EACH_MLS(X, dictMode) \ + X(dictMode, 4) \ + X(dictMode, 5) \ + X(dictMode, 6) + +#define ZSTD_FOR_EACH_DICT_MODE(X, ...) \ + X(__VA_ARGS__, noDict) \ + X(__VA_ARGS__, extDict) \ + X(__VA_ARGS__, dictMatchState) \ + X(__VA_ARGS__, dedicatedDictSearch) + +/* Generate row search fns for each combination of (dictMode, mls, rowLog) */ +ZSTD_FOR_EACH_DICT_MODE(ZSTD_FOR_EACH_MLS_ROWLOG, GEN_ZSTD_ROW_SEARCH_FN) +/* Generate binary Tree search fns for each combination of (dictMode, mls) */ +ZSTD_FOR_EACH_DICT_MODE(ZSTD_FOR_EACH_MLS, GEN_ZSTD_BT_SEARCH_FN) +/* Generate hash chain search fns for each combination of (dictMode, mls) */ +ZSTD_FOR_EACH_DICT_MODE(ZSTD_FOR_EACH_MLS, GEN_ZSTD_HC_SEARCH_FN) + +typedef enum { search_hashChain=0, search_binaryTree=1, search_rowHash=2 } searchMethod_e; + +#define GEN_ZSTD_CALL_BT_SEARCH_FN(dictMode, mls) \ + case mls: \ + return ZSTD_BT_SEARCH_FN(dictMode, mls)(ms, ip, iend, offsetPtr); +#define GEN_ZSTD_CALL_HC_SEARCH_FN(dictMode, mls) \ + case mls: \ + return ZSTD_HC_SEARCH_FN(dictMode, mls)(ms, ip, iend, offsetPtr); +#define GEN_ZSTD_CALL_ROW_SEARCH_FN(dictMode, mls, rowLog) \ + case rowLog: \ + return ZSTD_ROW_SEARCH_FN(dictMode, mls, rowLog)(ms, ip, iend, offsetPtr); + +#define ZSTD_SWITCH_MLS(X, dictMode) \ + switch (mls) { \ + ZSTD_FOR_EACH_MLS(X, dictMode) \ + } + +#define ZSTD_SWITCH_ROWLOG(dictMode, mls) \ + case mls: \ + switch (rowLog) { \ + ZSTD_FOR_EACH_ROWLOG(GEN_ZSTD_CALL_ROW_SEARCH_FN, dictMode, mls) \ + } \ + ZSTD_UNREACHABLE; \ + break; + +#define ZSTD_SWITCH_SEARCH_METHOD(dictMode) \ + switch (searchMethod) { \ + case search_hashChain: \ + ZSTD_SWITCH_MLS(GEN_ZSTD_CALL_HC_SEARCH_FN, dictMode) \ + break; \ + case search_binaryTree: \ + ZSTD_SWITCH_MLS(GEN_ZSTD_CALL_BT_SEARCH_FN, dictMode) \ + break; \ + case search_rowHash: \ + ZSTD_SWITCH_MLS(ZSTD_SWITCH_ROWLOG, dictMode) \ + break; \ + } \ + ZSTD_UNREACHABLE; + +/** + * Searches for the longest match at @p ip. + * Dispatches to the correct implementation function based on the + * (searchMethod, dictMode, mls, rowLog). We use switch statements + * here instead of using an indirect function call through a function + * pointer because after Spectre and Meltdown mitigations, indirect + * function calls can be very costly, especially in the kernel. + * + * NOTE: dictMode and searchMethod should be templated, so those switch + * statements should be optimized out. Only the mls & rowLog switches + * should be left. + * + * @param ms The match state. + * @param ip The position to search at. + * @param iend The end of the input data. + * @param[out] offsetPtr Stores the match offset into this pointer. + * @param mls The minimum search length, in the range [4, 6]. + * @param rowLog The row log (if applicable), in the range [4, 6]. + * @param searchMethod The search method to use (templated). + * @param dictMode The dictMode (templated). + * + * @returns The length of the longest match found, or < mls if no match is found. + * If a match is found its offset is stored in @p offsetPtr. + */ +FORCE_INLINE_TEMPLATE size_t ZSTD_searchMax( + ZSTD_matchState_t* ms, + const BYTE* ip, + const BYTE* iend, + size_t* offsetPtr, + U32 const mls, + U32 const rowLog, + searchMethod_e const searchMethod, + ZSTD_dictMode_e const dictMode) +{ + if (dictMode == ZSTD_noDict) { + ZSTD_SWITCH_SEARCH_METHOD(noDict) + } else if (dictMode == ZSTD_extDict) { + ZSTD_SWITCH_SEARCH_METHOD(extDict) + } else if (dictMode == ZSTD_dictMatchState) { + ZSTD_SWITCH_SEARCH_METHOD(dictMatchState) + } else if (dictMode == ZSTD_dedicatedDictSearch) { + ZSTD_SWITCH_SEARCH_METHOD(dedicatedDictSearch) + } + ZSTD_UNREACHABLE; + return 0; +} + +/* ******************************* +* Common parser - lazy strategy +*********************************/ + +FORCE_INLINE_TEMPLATE size_t +ZSTD_compressBlock_lazy_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, + U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize, + const searchMethod_e searchMethod, const U32 depth, + ZSTD_dictMode_e const dictMode) +{ + const BYTE* const istart = (const BYTE*)src; + const BYTE* ip = istart; + const BYTE* anchor = istart; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = (searchMethod == search_rowHash) ? iend - 8 - ZSTD_ROW_HASH_CACHE_SIZE : iend - 8; + const BYTE* const base = ms->window.base; + const U32 prefixLowestIndex = ms->window.dictLimit; + const BYTE* const prefixLowest = base + prefixLowestIndex; + const U32 mls = BOUNDED(4, ms->cParams.minMatch, 6); + const U32 rowLog = BOUNDED(4, ms->cParams.searchLog, 6); + + U32 offset_1 = rep[0], offset_2 = rep[1]; + U32 offsetSaved1 = 0, offsetSaved2 = 0; + + const int isDMS = dictMode == ZSTD_dictMatchState; + const int isDDS = dictMode == ZSTD_dedicatedDictSearch; + const int isDxS = isDMS || isDDS; + const ZSTD_matchState_t* const dms = ms->dictMatchState; + const U32 dictLowestIndex = isDxS ? dms->window.dictLimit : 0; + const BYTE* const dictBase = isDxS ? dms->window.base : NULL; + const BYTE* const dictLowest = isDxS ? dictBase + dictLowestIndex : NULL; + const BYTE* const dictEnd = isDxS ? dms->window.nextSrc : NULL; + const U32 dictIndexDelta = isDxS ? + prefixLowestIndex - (U32)(dictEnd - dictBase) : + 0; + const U32 dictAndPrefixLength = (U32)((ip - prefixLowest) + (dictEnd - dictLowest)); + + DEBUGLOG(5, "ZSTD_compressBlock_lazy_generic (dictMode=%u) (searchFunc=%u)", (U32)dictMode, (U32)searchMethod); + ip += (dictAndPrefixLength == 0); + if (dictMode == ZSTD_noDict) { + U32 const curr = (U32)(ip - base); + U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, curr, ms->cParams.windowLog); + U32 const maxRep = curr - windowLow; + if (offset_2 > maxRep) offsetSaved2 = offset_2, offset_2 = 0; + if (offset_1 > maxRep) offsetSaved1 = offset_1, offset_1 = 0; + } + if (isDxS) { + /* dictMatchState repCode checks don't currently handle repCode == 0 + * disabling. */ + assert(offset_1 <= dictAndPrefixLength); + assert(offset_2 <= dictAndPrefixLength); + } + + /* Reset the lazy skipping state */ + ms->lazySkipping = 0; + + if (searchMethod == search_rowHash) { + ZSTD_row_fillHashCache(ms, base, rowLog, mls, ms->nextToUpdate, ilimit); + } + + /* Match Loop */ +#if defined(__GNUC__) && defined(__x86_64__) + /* I've measured random a 5% speed loss on levels 5 & 6 (greedy) when the + * code alignment is perturbed. To fix the instability align the loop on 32-bytes. + */ + __asm__(".p2align 5"); +#endif + while (ip < ilimit) { + size_t matchLength=0; + size_t offBase = REPCODE1_TO_OFFBASE; + const BYTE* start=ip+1; + DEBUGLOG(7, "search baseline (depth 0)"); + + /* check repCode */ + if (isDxS) { + const U32 repIndex = (U32)(ip - base) + 1 - offset_1; + const BYTE* repMatch = ((dictMode == ZSTD_dictMatchState || dictMode == ZSTD_dedicatedDictSearch) + && repIndex < prefixLowestIndex) ? + dictBase + (repIndex - dictIndexDelta) : + base + repIndex; + if (((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */) + && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { + const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; + matchLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; + if (depth==0) goto _storeSequence; + } + } + if ( dictMode == ZSTD_noDict + && ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1)))) { + matchLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4; + if (depth==0) goto _storeSequence; + } + + /* first search (depth 0) */ + { size_t offbaseFound = 999999999; + size_t const ml2 = ZSTD_searchMax(ms, ip, iend, &offbaseFound, mls, rowLog, searchMethod, dictMode); + if (ml2 > matchLength) + matchLength = ml2, start = ip, offBase = offbaseFound; + } + + if (matchLength < 4) { + size_t const step = ((size_t)(ip-anchor) >> kSearchStrength) + 1; /* jump faster over incompressible sections */; + ip += step; + /* Enter the lazy skipping mode once we are skipping more than 8 bytes at a time. + * In this mode we stop inserting every position into our tables, and only insert + * positions that we search, which is one in step positions. + * The exact cutoff is flexible, I've just chosen a number that is reasonably high, + * so we minimize the compression ratio loss in "normal" scenarios. This mode gets + * triggered once we've gone 2KB without finding any matches. + */ + ms->lazySkipping = step > kLazySkippingStep; + continue; + } + + /* let's try to find a better solution */ + if (depth>=1) + while (ip0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { + size_t const mlRep = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4; + int const gain2 = (int)(mlRep * 3); + int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offBase) + 1); + if ((mlRep >= 4) && (gain2 > gain1)) + matchLength = mlRep, offBase = REPCODE1_TO_OFFBASE, start = ip; + } + if (isDxS) { + const U32 repIndex = (U32)(ip - base) - offset_1; + const BYTE* repMatch = repIndex < prefixLowestIndex ? + dictBase + (repIndex - dictIndexDelta) : + base + repIndex; + if (((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */) + && (MEM_read32(repMatch) == MEM_read32(ip)) ) { + const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; + size_t const mlRep = ZSTD_count_2segments(ip+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; + int const gain2 = (int)(mlRep * 3); + int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offBase) + 1); + if ((mlRep >= 4) && (gain2 > gain1)) + matchLength = mlRep, offBase = REPCODE1_TO_OFFBASE, start = ip; + } + } + { size_t ofbCandidate=999999999; + size_t const ml2 = ZSTD_searchMax(ms, ip, iend, &ofbCandidate, mls, rowLog, searchMethod, dictMode); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 4); + if ((ml2 >= 4) && (gain2 > gain1)) { + matchLength = ml2, offBase = ofbCandidate, start = ip; + continue; /* search a better one */ + } } + + /* let's find an even better one */ + if ((depth==2) && (ip0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { + size_t const mlRep = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4; + int const gain2 = (int)(mlRep * 4); + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 1); + if ((mlRep >= 4) && (gain2 > gain1)) + matchLength = mlRep, offBase = REPCODE1_TO_OFFBASE, start = ip; + } + if (isDxS) { + const U32 repIndex = (U32)(ip - base) - offset_1; + const BYTE* repMatch = repIndex < prefixLowestIndex ? + dictBase + (repIndex - dictIndexDelta) : + base + repIndex; + if (((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */) + && (MEM_read32(repMatch) == MEM_read32(ip)) ) { + const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; + size_t const mlRep = ZSTD_count_2segments(ip+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; + int const gain2 = (int)(mlRep * 4); + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 1); + if ((mlRep >= 4) && (gain2 > gain1)) + matchLength = mlRep, offBase = REPCODE1_TO_OFFBASE, start = ip; + } + } + { size_t ofbCandidate=999999999; + size_t const ml2 = ZSTD_searchMax(ms, ip, iend, &ofbCandidate, mls, rowLog, searchMethod, dictMode); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 7); + if ((ml2 >= 4) && (gain2 > gain1)) { + matchLength = ml2, offBase = ofbCandidate, start = ip; + continue; + } } } + break; /* nothing found : store previous solution */ + } + + /* NOTE: + * Pay attention that `start[-value]` can lead to strange undefined behavior + * notably if `value` is unsigned, resulting in a large positive `-value`. + */ + /* catch up */ + if (OFFBASE_IS_OFFSET(offBase)) { + if (dictMode == ZSTD_noDict) { + while ( ((start > anchor) & (start - OFFBASE_TO_OFFSET(offBase) > prefixLowest)) + && (start[-1] == (start-OFFBASE_TO_OFFSET(offBase))[-1]) ) /* only search for offset within prefix */ + { start--; matchLength++; } + } + if (isDxS) { + U32 const matchIndex = (U32)((size_t)(start-base) - OFFBASE_TO_OFFSET(offBase)); + const BYTE* match = (matchIndex < prefixLowestIndex) ? dictBase + matchIndex - dictIndexDelta : base + matchIndex; + const BYTE* const mStart = (matchIndex < prefixLowestIndex) ? dictLowest : prefixLowest; + while ((start>anchor) && (match>mStart) && (start[-1] == match[-1])) { start--; match--; matchLength++; } /* catch up */ + } + offset_2 = offset_1; offset_1 = (U32)OFFBASE_TO_OFFSET(offBase); + } + /* store sequence */ +_storeSequence: + { size_t const litLength = (size_t)(start - anchor); + ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offBase, matchLength); + anchor = ip = start + matchLength; + } + if (ms->lazySkipping) { + /* We've found a match, disable lazy skipping mode, and refill the hash cache. */ + if (searchMethod == search_rowHash) { + ZSTD_row_fillHashCache(ms, base, rowLog, mls, ms->nextToUpdate, ilimit); + } + ms->lazySkipping = 0; + } + + /* check immediate repcode */ + if (isDxS) { + while (ip <= ilimit) { + U32 const current2 = (U32)(ip-base); + U32 const repIndex = current2 - offset_2; + const BYTE* repMatch = repIndex < prefixLowestIndex ? + dictBase - dictIndexDelta + repIndex : + base + repIndex; + if ( ((U32)((prefixLowestIndex-1) - (U32)repIndex) >= 3 /* intentional overflow */) + && (MEM_read32(repMatch) == MEM_read32(ip)) ) { + const BYTE* const repEnd2 = repIndex < prefixLowestIndex ? dictEnd : iend; + matchLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd2, prefixLowest) + 4; + offBase = offset_2; offset_2 = offset_1; offset_1 = (U32)offBase; /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, matchLength); + ip += matchLength; + anchor = ip; + continue; + } + break; + } + } + + if (dictMode == ZSTD_noDict) { + while ( ((ip <= ilimit) & (offset_2>0)) + && (MEM_read32(ip) == MEM_read32(ip - offset_2)) ) { + /* store sequence */ + matchLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4; + offBase = offset_2; offset_2 = offset_1; offset_1 = (U32)offBase; /* swap repcodes */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, matchLength); + ip += matchLength; + anchor = ip; + continue; /* faster when present ... (?) */ + } } } + + /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0), + * rotate saved offsets. See comment in ZSTD_compressBlock_fast_noDict for more context. */ + offsetSaved2 = ((offsetSaved1 != 0) && (offset_1 != 0)) ? offsetSaved1 : offsetSaved2; + + /* save reps for next block */ + rep[0] = offset_1 ? offset_1 : offsetSaved1; + rep[1] = offset_2 ? offset_2 : offsetSaved2; + + /* Return the last literals size */ + return (size_t)(iend - anchor); +} + + +size_t ZSTD_compressBlock_btlazy2( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_binaryTree, 2, ZSTD_noDict); +} + +size_t ZSTD_compressBlock_lazy2( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 2, ZSTD_noDict); +} + +size_t ZSTD_compressBlock_lazy( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 1, ZSTD_noDict); +} + +size_t ZSTD_compressBlock_greedy( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 0, ZSTD_noDict); +} + +size_t ZSTD_compressBlock_btlazy2_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_binaryTree, 2, ZSTD_dictMatchState); +} + +size_t ZSTD_compressBlock_lazy2_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 2, ZSTD_dictMatchState); +} + +size_t ZSTD_compressBlock_lazy_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 1, ZSTD_dictMatchState); +} + +size_t ZSTD_compressBlock_greedy_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 0, ZSTD_dictMatchState); +} + + +size_t ZSTD_compressBlock_lazy2_dedicatedDictSearch( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 2, ZSTD_dedicatedDictSearch); +} + +size_t ZSTD_compressBlock_lazy_dedicatedDictSearch( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 1, ZSTD_dedicatedDictSearch); +} + +size_t ZSTD_compressBlock_greedy_dedicatedDictSearch( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 0, ZSTD_dedicatedDictSearch); +} + +/* Row-based matchfinder */ +size_t ZSTD_compressBlock_lazy2_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 2, ZSTD_noDict); +} + +size_t ZSTD_compressBlock_lazy_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 1, ZSTD_noDict); +} + +size_t ZSTD_compressBlock_greedy_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 0, ZSTD_noDict); +} + +size_t ZSTD_compressBlock_lazy2_dictMatchState_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 2, ZSTD_dictMatchState); +} + +size_t ZSTD_compressBlock_lazy_dictMatchState_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 1, ZSTD_dictMatchState); +} + +size_t ZSTD_compressBlock_greedy_dictMatchState_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 0, ZSTD_dictMatchState); +} + + +size_t ZSTD_compressBlock_lazy2_dedicatedDictSearch_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 2, ZSTD_dedicatedDictSearch); +} + +size_t ZSTD_compressBlock_lazy_dedicatedDictSearch_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 1, ZSTD_dedicatedDictSearch); +} + +size_t ZSTD_compressBlock_greedy_dedicatedDictSearch_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 0, ZSTD_dedicatedDictSearch); +} + +FORCE_INLINE_TEMPLATE +size_t ZSTD_compressBlock_lazy_extDict_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, + U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize, + const searchMethod_e searchMethod, const U32 depth) +{ + const BYTE* const istart = (const BYTE*)src; + const BYTE* ip = istart; + const BYTE* anchor = istart; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = searchMethod == search_rowHash ? iend - 8 - ZSTD_ROW_HASH_CACHE_SIZE : iend - 8; + const BYTE* const base = ms->window.base; + const U32 dictLimit = ms->window.dictLimit; + const BYTE* const prefixStart = base + dictLimit; + const BYTE* const dictBase = ms->window.dictBase; + const BYTE* const dictEnd = dictBase + dictLimit; + const BYTE* const dictStart = dictBase + ms->window.lowLimit; + const U32 windowLog = ms->cParams.windowLog; + const U32 mls = BOUNDED(4, ms->cParams.minMatch, 6); + const U32 rowLog = BOUNDED(4, ms->cParams.searchLog, 6); + + U32 offset_1 = rep[0], offset_2 = rep[1]; + + DEBUGLOG(5, "ZSTD_compressBlock_lazy_extDict_generic (searchFunc=%u)", (U32)searchMethod); + + /* Reset the lazy skipping state */ + ms->lazySkipping = 0; + + /* init */ + ip += (ip == prefixStart); + if (searchMethod == search_rowHash) { + ZSTD_row_fillHashCache(ms, base, rowLog, mls, ms->nextToUpdate, ilimit); + } + + /* Match Loop */ +#if defined(__GNUC__) && defined(__x86_64__) + /* I've measured random a 5% speed loss on levels 5 & 6 (greedy) when the + * code alignment is perturbed. To fix the instability align the loop on 32-bytes. + */ + __asm__(".p2align 5"); +#endif + while (ip < ilimit) { + size_t matchLength=0; + size_t offBase = REPCODE1_TO_OFFBASE; + const BYTE* start=ip+1; + U32 curr = (U32)(ip-base); + + /* check repCode */ + { const U32 windowLow = ZSTD_getLowestMatchIndex(ms, curr+1, windowLog); + const U32 repIndex = (U32)(curr+1 - offset_1); + const BYTE* const repBase = repIndex < dictLimit ? dictBase : base; + const BYTE* const repMatch = repBase + repIndex; + if ( ((U32)((dictLimit-1) - repIndex) >= 3) /* intentional overflow */ + & (offset_1 <= curr+1 - windowLow) ) /* note: we are searching at curr+1 */ + if (MEM_read32(ip+1) == MEM_read32(repMatch)) { + /* repcode detected we should take it */ + const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; + matchLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repEnd, prefixStart) + 4; + if (depth==0) goto _storeSequence; + } } + + /* first search (depth 0) */ + { size_t ofbCandidate = 999999999; + size_t const ml2 = ZSTD_searchMax(ms, ip, iend, &ofbCandidate, mls, rowLog, searchMethod, ZSTD_extDict); + if (ml2 > matchLength) + matchLength = ml2, start = ip, offBase = ofbCandidate; + } + + if (matchLength < 4) { + size_t const step = ((size_t)(ip-anchor) >> kSearchStrength); + ip += step + 1; /* jump faster over incompressible sections */ + /* Enter the lazy skipping mode once we are skipping more than 8 bytes at a time. + * In this mode we stop inserting every position into our tables, and only insert + * positions that we search, which is one in step positions. + * The exact cutoff is flexible, I've just chosen a number that is reasonably high, + * so we minimize the compression ratio loss in "normal" scenarios. This mode gets + * triggered once we've gone 2KB without finding any matches. + */ + ms->lazySkipping = step > kLazySkippingStep; + continue; + } + + /* let's try to find a better solution */ + if (depth>=1) + while (ip= 3) /* intentional overflow : do not test positions overlapping 2 memory segments */ + & (offset_1 <= curr - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ + if (MEM_read32(ip) == MEM_read32(repMatch)) { + /* repcode detected */ + const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; + size_t const repLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd, prefixStart) + 4; + int const gain2 = (int)(repLength * 3); + int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offBase) + 1); + if ((repLength >= 4) && (gain2 > gain1)) + matchLength = repLength, offBase = REPCODE1_TO_OFFBASE, start = ip; + } } + + /* search match, depth 1 */ + { size_t ofbCandidate = 999999999; + size_t const ml2 = ZSTD_searchMax(ms, ip, iend, &ofbCandidate, mls, rowLog, searchMethod, ZSTD_extDict); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 4); + if ((ml2 >= 4) && (gain2 > gain1)) { + matchLength = ml2, offBase = ofbCandidate, start = ip; + continue; /* search a better one */ + } } + + /* let's find an even better one */ + if ((depth==2) && (ip= 3) /* intentional overflow : do not test positions overlapping 2 memory segments */ + & (offset_1 <= curr - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ + if (MEM_read32(ip) == MEM_read32(repMatch)) { + /* repcode detected */ + const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; + size_t const repLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd, prefixStart) + 4; + int const gain2 = (int)(repLength * 4); + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 1); + if ((repLength >= 4) && (gain2 > gain1)) + matchLength = repLength, offBase = REPCODE1_TO_OFFBASE, start = ip; + } } + + /* search match, depth 2 */ + { size_t ofbCandidate = 999999999; + size_t const ml2 = ZSTD_searchMax(ms, ip, iend, &ofbCandidate, mls, rowLog, searchMethod, ZSTD_extDict); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 7); + if ((ml2 >= 4) && (gain2 > gain1)) { + matchLength = ml2, offBase = ofbCandidate, start = ip; + continue; + } } } + break; /* nothing found : store previous solution */ + } + + /* catch up */ + if (OFFBASE_IS_OFFSET(offBase)) { + U32 const matchIndex = (U32)((size_t)(start-base) - OFFBASE_TO_OFFSET(offBase)); + const BYTE* match = (matchIndex < dictLimit) ? dictBase + matchIndex : base + matchIndex; + const BYTE* const mStart = (matchIndex < dictLimit) ? dictStart : prefixStart; + while ((start>anchor) && (match>mStart) && (start[-1] == match[-1])) { start--; match--; matchLength++; } /* catch up */ + offset_2 = offset_1; offset_1 = (U32)OFFBASE_TO_OFFSET(offBase); + } + + /* store sequence */ +_storeSequence: + { size_t const litLength = (size_t)(start - anchor); + ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offBase, matchLength); + anchor = ip = start + matchLength; + } + if (ms->lazySkipping) { + /* We've found a match, disable lazy skipping mode, and refill the hash cache. */ + if (searchMethod == search_rowHash) { + ZSTD_row_fillHashCache(ms, base, rowLog, mls, ms->nextToUpdate, ilimit); + } + ms->lazySkipping = 0; + } + + /* check immediate repcode */ + while (ip <= ilimit) { + const U32 repCurrent = (U32)(ip-base); + const U32 windowLow = ZSTD_getLowestMatchIndex(ms, repCurrent, windowLog); + const U32 repIndex = repCurrent - offset_2; + const BYTE* const repBase = repIndex < dictLimit ? dictBase : base; + const BYTE* const repMatch = repBase + repIndex; + if ( ((U32)((dictLimit-1) - repIndex) >= 3) /* intentional overflow : do not test positions overlapping 2 memory segments */ + & (offset_2 <= repCurrent - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ + if (MEM_read32(ip) == MEM_read32(repMatch)) { + /* repcode detected we should take it */ + const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; + matchLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd, prefixStart) + 4; + offBase = offset_2; offset_2 = offset_1; offset_1 = (U32)offBase; /* swap offset history */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, matchLength); + ip += matchLength; + anchor = ip; + continue; /* faster when present ... (?) */ + } + break; + } } + + /* Save reps for next block */ + rep[0] = offset_1; + rep[1] = offset_2; + + /* Return the last literals size */ + return (size_t)(iend - anchor); +} + + +size_t ZSTD_compressBlock_greedy_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 0); +} + +size_t ZSTD_compressBlock_lazy_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) + +{ + return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 1); +} + +size_t ZSTD_compressBlock_lazy2_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) + +{ + return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 2); +} + +size_t ZSTD_compressBlock_btlazy2_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) + +{ + return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, search_binaryTree, 2); +} + +size_t ZSTD_compressBlock_greedy_extDict_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 0); +} + +size_t ZSTD_compressBlock_lazy_extDict_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) + +{ + return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 1); +} + +size_t ZSTD_compressBlock_lazy2_extDict_row( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize) +{ + return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, search_rowHash, 2); +} +/**** ended inlining compress/zstd_lazy.c ****/ +/**** start inlining compress/zstd_ldm.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/**** skipping file: zstd_ldm.h ****/ + +/**** skipping file: ../common/debug.h ****/ +/**** skipping file: ../common/xxhash.h ****/ +/**** skipping file: zstd_fast.h ****/ +/**** skipping file: zstd_double_fast.h ****/ +/**** start inlining zstd_ldm_geartab.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_LDM_GEARTAB_H +#define ZSTD_LDM_GEARTAB_H + +/**** skipping file: ../common/compiler.h ****/ +/**** skipping file: ../common/mem.h ****/ + +static UNUSED_ATTR const U64 ZSTD_ldm_gearTab[256] = { + 0xf5b8f72c5f77775c, 0x84935f266b7ac412, 0xb647ada9ca730ccc, + 0xb065bb4b114fb1de, 0x34584e7e8c3a9fd0, 0x4e97e17c6ae26b05, + 0x3a03d743bc99a604, 0xcecd042422c4044f, 0x76de76c58524259e, + 0x9c8528f65badeaca, 0x86563706e2097529, 0x2902475fa375d889, + 0xafb32a9739a5ebe6, 0xce2714da3883e639, 0x21eaf821722e69e, + 0x37b628620b628, 0x49a8d455d88caf5, 0x8556d711e6958140, + 0x4f7ae74fc605c1f, 0x829f0c3468bd3a20, 0x4ffdc885c625179e, + 0x8473de048a3daf1b, 0x51008822b05646b2, 0x69d75d12b2d1cc5f, + 0x8c9d4a19159154bc, 0xc3cc10f4abbd4003, 0xd06ddc1cecb97391, + 0xbe48e6e7ed80302e, 0x3481db31cee03547, 0xacc3f67cdaa1d210, + 0x65cb771d8c7f96cc, 0x8eb27177055723dd, 0xc789950d44cd94be, + 0x934feadc3700b12b, 0x5e485f11edbdf182, 0x1e2e2a46fd64767a, + 0x2969ca71d82efa7c, 0x9d46e9935ebbba2e, 0xe056b67e05e6822b, + 0x94d73f55739d03a0, 0xcd7010bdb69b5a03, 0x455ef9fcd79b82f4, + 0x869cb54a8749c161, 0x38d1a4fa6185d225, 0xb475166f94bbe9bb, + 0xa4143548720959f1, 0x7aed4780ba6b26ba, 0xd0ce264439e02312, + 0x84366d746078d508, 0xa8ce973c72ed17be, 0x21c323a29a430b01, + 0x9962d617e3af80ee, 0xab0ce91d9c8cf75b, 0x530e8ee6d19a4dbc, + 0x2ef68c0cf53f5d72, 0xc03a681640a85506, 0x496e4e9f9c310967, + 0x78580472b59b14a0, 0x273824c23b388577, 0x66bf923ad45cb553, + 0x47ae1a5a2492ba86, 0x35e304569e229659, 0x4765182a46870b6f, + 0x6cbab625e9099412, 0xddac9a2e598522c1, 0x7172086e666624f2, + 0xdf5003ca503b7837, 0x88c0c1db78563d09, 0x58d51865acfc289d, + 0x177671aec65224f1, 0xfb79d8a241e967d7, 0x2be1e101cad9a49a, + 0x6625682f6e29186b, 0x399553457ac06e50, 0x35dffb4c23abb74, + 0x429db2591f54aade, 0xc52802a8037d1009, 0x6acb27381f0b25f3, + 0xf45e2551ee4f823b, 0x8b0ea2d99580c2f7, 0x3bed519cbcb4e1e1, + 0xff452823dbb010a, 0x9d42ed614f3dd267, 0x5b9313c06257c57b, + 0xa114b8008b5e1442, 0xc1fe311c11c13d4b, 0x66e8763ea34c5568, + 0x8b982af1c262f05d, 0xee8876faaa75fbb7, 0x8a62a4d0d172bb2a, + 0xc13d94a3b7449a97, 0x6dbbba9dc15d037c, 0xc786101f1d92e0f1, + 0xd78681a907a0b79b, 0xf61aaf2962c9abb9, 0x2cfd16fcd3cb7ad9, + 0x868c5b6744624d21, 0x25e650899c74ddd7, 0xba042af4a7c37463, + 0x4eb1a539465a3eca, 0xbe09dbf03b05d5ca, 0x774e5a362b5472ba, + 0x47a1221229d183cd, 0x504b0ca18ef5a2df, 0xdffbdfbde2456eb9, + 0x46cd2b2fbee34634, 0xf2aef8fe819d98c3, 0x357f5276d4599d61, + 0x24a5483879c453e3, 0x88026889192b4b9, 0x28da96671782dbec, + 0x4ef37c40588e9aaa, 0x8837b90651bc9fb3, 0xc164f741d3f0e5d6, + 0xbc135a0a704b70ba, 0x69cd868f7622ada, 0xbc37ba89e0b9c0ab, + 0x47c14a01323552f6, 0x4f00794bacee98bb, 0x7107de7d637a69d5, + 0x88af793bb6f2255e, 0xf3c6466b8799b598, 0xc288c616aa7f3b59, + 0x81ca63cf42fca3fd, 0x88d85ace36a2674b, 0xd056bd3792389e7, + 0xe55c396c4e9dd32d, 0xbefb504571e6c0a6, 0x96ab32115e91e8cc, + 0xbf8acb18de8f38d1, 0x66dae58801672606, 0x833b6017872317fb, + 0xb87c16f2d1c92864, 0xdb766a74e58b669c, 0x89659f85c61417be, + 0xc8daad856011ea0c, 0x76a4b565b6fe7eae, 0xa469d085f6237312, + 0xaaf0365683a3e96c, 0x4dbb746f8424f7b8, 0x638755af4e4acc1, + 0x3d7807f5bde64486, 0x17be6d8f5bbb7639, 0x903f0cd44dc35dc, + 0x67b672eafdf1196c, 0xa676ff93ed4c82f1, 0x521d1004c5053d9d, + 0x37ba9ad09ccc9202, 0x84e54d297aacfb51, 0xa0b4b776a143445, + 0x820d471e20b348e, 0x1874383cb83d46dc, 0x97edeec7a1efe11c, + 0xb330e50b1bdc42aa, 0x1dd91955ce70e032, 0xa514cdb88f2939d5, + 0x2791233fd90db9d3, 0x7b670a4cc50f7a9b, 0x77c07d2a05c6dfa5, + 0xe3778b6646d0a6fa, 0xb39c8eda47b56749, 0x933ed448addbef28, + 0xaf846af6ab7d0bf4, 0xe5af208eb666e49, 0x5e6622f73534cd6a, + 0x297daeca42ef5b6e, 0x862daef3d35539a6, 0xe68722498f8e1ea9, + 0x981c53093dc0d572, 0xfa09b0bfbf86fbf5, 0x30b1e96166219f15, + 0x70e7d466bdc4fb83, 0x5a66736e35f2a8e9, 0xcddb59d2b7c1baef, + 0xd6c7d247d26d8996, 0xea4e39eac8de1ba3, 0x539c8bb19fa3aff2, + 0x9f90e4c5fd508d8, 0xa34e5956fbaf3385, 0x2e2f8e151d3ef375, + 0x173691e9b83faec1, 0xb85a8d56bf016379, 0x8382381267408ae3, + 0xb90f901bbdc0096d, 0x7c6ad32933bcec65, 0x76bb5e2f2c8ad595, + 0x390f851a6cf46d28, 0xc3e6064da1c2da72, 0xc52a0c101cfa5389, + 0xd78eaf84a3fbc530, 0x3781b9e2288b997e, 0x73c2f6dea83d05c4, + 0x4228e364c5b5ed7, 0x9d7a3edf0da43911, 0x8edcfeda24686756, + 0x5e7667a7b7a9b3a1, 0x4c4f389fa143791d, 0xb08bc1023da7cddc, + 0x7ab4be3ae529b1cc, 0x754e6132dbe74ff9, 0x71635442a839df45, + 0x2f6fb1643fbe52de, 0x961e0a42cf7a8177, 0xf3b45d83d89ef2ea, + 0xee3de4cf4a6e3e9b, 0xcd6848542c3295e7, 0xe4cee1664c78662f, + 0x9947548b474c68c4, 0x25d73777a5ed8b0b, 0xc915b1d636b7fc, + 0x21c2ba75d9b0d2da, 0x5f6b5dcf608a64a1, 0xdcf333255ff9570c, + 0x633b922418ced4ee, 0xc136dde0b004b34a, 0x58cc83b05d4b2f5a, + 0x5eb424dda28e42d2, 0x62df47369739cd98, 0xb4e0b42485e4ce17, + 0x16e1f0c1f9a8d1e7, 0x8ec3916707560ebf, 0x62ba6e2df2cc9db3, + 0xcbf9f4ff77d83a16, 0x78d9d7d07d2bbcc4, 0xef554ce1e02c41f4, + 0x8d7581127eccf94d, 0xa9b53336cb3c8a05, 0x38c42c0bf45c4f91, + 0x640893cdf4488863, 0x80ec34bc575ea568, 0x39f324f5b48eaa40, + 0xe9d9ed1f8eff527f, 0x9224fc058cc5a214, 0xbaba00b04cfe7741, + 0x309a9f120fcf52af, 0xa558f3ec65626212, 0x424bec8b7adabe2f, + 0x41622513a6aea433, 0xb88da2d5324ca798, 0xd287733b245528a4, + 0x9a44697e6d68aec3, 0x7b1093be2f49bb28, 0x50bbec632e3d8aad, + 0x6cd90723e1ea8283, 0x897b9e7431b02bf3, 0x219efdcb338a7047, + 0x3b0311f0a27c0656, 0xdb17bf91c0db96e7, 0x8cd4fd6b4e85a5b2, + 0xfab071054ba6409d, 0x40d6fe831fa9dfd9, 0xaf358debad7d791e, + 0xeb8d0e25a65e3e58, 0xbbcbd3df14e08580, 0xcf751f27ecdab2b, + 0x2b4da14f2613d8f4 +}; + +#endif /* ZSTD_LDM_GEARTAB_H */ +/**** ended inlining zstd_ldm_geartab.h ****/ + +#define LDM_BUCKET_SIZE_LOG 3 +#define LDM_MIN_MATCH_LENGTH 64 +#define LDM_HASH_RLOG 7 + +typedef struct { + U64 rolling; + U64 stopMask; +} ldmRollingHashState_t; + +/** ZSTD_ldm_gear_init(): + * + * Initializes the rolling hash state such that it will honor the + * settings in params. */ +static void ZSTD_ldm_gear_init(ldmRollingHashState_t* state, ldmParams_t const* params) +{ + unsigned maxBitsInMask = MIN(params->minMatchLength, 64); + unsigned hashRateLog = params->hashRateLog; + + state->rolling = ~(U32)0; + + /* The choice of the splitting criterion is subject to two conditions: + * 1. it has to trigger on average every 2^(hashRateLog) bytes; + * 2. ideally, it has to depend on a window of minMatchLength bytes. + * + * In the gear hash algorithm, bit n depends on the last n bytes; + * so in order to obtain a good quality splitting criterion it is + * preferable to use bits with high weight. + * + * To match condition 1 we use a mask with hashRateLog bits set + * and, because of the previous remark, we make sure these bits + * have the highest possible weight while still respecting + * condition 2. + */ + if (hashRateLog > 0 && hashRateLog <= maxBitsInMask) { + state->stopMask = (((U64)1 << hashRateLog) - 1) << (maxBitsInMask - hashRateLog); + } else { + /* In this degenerate case we simply honor the hash rate. */ + state->stopMask = ((U64)1 << hashRateLog) - 1; + } +} + +/** ZSTD_ldm_gear_reset() + * Feeds [data, data + minMatchLength) into the hash without registering any + * splits. This effectively resets the hash state. This is used when skipping + * over data, either at the beginning of a block, or skipping sections. + */ +static void ZSTD_ldm_gear_reset(ldmRollingHashState_t* state, + BYTE const* data, size_t minMatchLength) +{ + U64 hash = state->rolling; + size_t n = 0; + +#define GEAR_ITER_ONCE() do { \ + hash = (hash << 1) + ZSTD_ldm_gearTab[data[n] & 0xff]; \ + n += 1; \ + } while (0) + while (n + 3 < minMatchLength) { + GEAR_ITER_ONCE(); + GEAR_ITER_ONCE(); + GEAR_ITER_ONCE(); + GEAR_ITER_ONCE(); + } + while (n < minMatchLength) { + GEAR_ITER_ONCE(); + } +#undef GEAR_ITER_ONCE +} + +/** ZSTD_ldm_gear_feed(): + * + * Registers in the splits array all the split points found in the first + * size bytes following the data pointer. This function terminates when + * either all the data has been processed or LDM_BATCH_SIZE splits are + * present in the splits array. + * + * Precondition: The splits array must not be full. + * Returns: The number of bytes processed. */ +static size_t ZSTD_ldm_gear_feed(ldmRollingHashState_t* state, + BYTE const* data, size_t size, + size_t* splits, unsigned* numSplits) +{ + size_t n; + U64 hash, mask; + + hash = state->rolling; + mask = state->stopMask; + n = 0; + +#define GEAR_ITER_ONCE() do { \ + hash = (hash << 1) + ZSTD_ldm_gearTab[data[n] & 0xff]; \ + n += 1; \ + if (UNLIKELY((hash & mask) == 0)) { \ + splits[*numSplits] = n; \ + *numSplits += 1; \ + if (*numSplits == LDM_BATCH_SIZE) \ + goto done; \ + } \ + } while (0) + + while (n + 3 < size) { + GEAR_ITER_ONCE(); + GEAR_ITER_ONCE(); + GEAR_ITER_ONCE(); + GEAR_ITER_ONCE(); + } + while (n < size) { + GEAR_ITER_ONCE(); + } + +#undef GEAR_ITER_ONCE + +done: + state->rolling = hash; + return n; +} + +void ZSTD_ldm_adjustParameters(ldmParams_t* params, + ZSTD_compressionParameters const* cParams) +{ + params->windowLog = cParams->windowLog; + ZSTD_STATIC_ASSERT(LDM_BUCKET_SIZE_LOG <= ZSTD_LDM_BUCKETSIZELOG_MAX); + DEBUGLOG(4, "ZSTD_ldm_adjustParameters"); + if (!params->bucketSizeLog) params->bucketSizeLog = LDM_BUCKET_SIZE_LOG; + if (!params->minMatchLength) params->minMatchLength = LDM_MIN_MATCH_LENGTH; + if (params->hashLog == 0) { + params->hashLog = MAX(ZSTD_HASHLOG_MIN, params->windowLog - LDM_HASH_RLOG); + assert(params->hashLog <= ZSTD_HASHLOG_MAX); + } + if (params->hashRateLog == 0) { + params->hashRateLog = params->windowLog < params->hashLog + ? 0 + : params->windowLog - params->hashLog; + } + params->bucketSizeLog = MIN(params->bucketSizeLog, params->hashLog); +} + +size_t ZSTD_ldm_getTableSize(ldmParams_t params) +{ + size_t const ldmHSize = ((size_t)1) << params.hashLog; + size_t const ldmBucketSizeLog = MIN(params.bucketSizeLog, params.hashLog); + size_t const ldmBucketSize = ((size_t)1) << (params.hashLog - ldmBucketSizeLog); + size_t const totalSize = ZSTD_cwksp_alloc_size(ldmBucketSize) + + ZSTD_cwksp_alloc_size(ldmHSize * sizeof(ldmEntry_t)); + return params.enableLdm == ZSTD_ps_enable ? totalSize : 0; +} + +size_t ZSTD_ldm_getMaxNbSeq(ldmParams_t params, size_t maxChunkSize) +{ + return params.enableLdm == ZSTD_ps_enable ? (maxChunkSize / params.minMatchLength) : 0; +} + +/** ZSTD_ldm_getBucket() : + * Returns a pointer to the start of the bucket associated with hash. */ +static ldmEntry_t* ZSTD_ldm_getBucket( + ldmState_t* ldmState, size_t hash, ldmParams_t const ldmParams) +{ + return ldmState->hashTable + (hash << ldmParams.bucketSizeLog); +} + +/** ZSTD_ldm_insertEntry() : + * Insert the entry with corresponding hash into the hash table */ +static void ZSTD_ldm_insertEntry(ldmState_t* ldmState, + size_t const hash, const ldmEntry_t entry, + ldmParams_t const ldmParams) +{ + BYTE* const pOffset = ldmState->bucketOffsets + hash; + unsigned const offset = *pOffset; + + *(ZSTD_ldm_getBucket(ldmState, hash, ldmParams) + offset) = entry; + *pOffset = (BYTE)((offset + 1) & ((1u << ldmParams.bucketSizeLog) - 1)); + +} + +/** ZSTD_ldm_countBackwardsMatch() : + * Returns the number of bytes that match backwards before pIn and pMatch. + * + * We count only bytes where pMatch >= pBase and pIn >= pAnchor. */ +static size_t ZSTD_ldm_countBackwardsMatch( + const BYTE* pIn, const BYTE* pAnchor, + const BYTE* pMatch, const BYTE* pMatchBase) +{ + size_t matchLength = 0; + while (pIn > pAnchor && pMatch > pMatchBase && pIn[-1] == pMatch[-1]) { + pIn--; + pMatch--; + matchLength++; + } + return matchLength; +} + +/** ZSTD_ldm_countBackwardsMatch_2segments() : + * Returns the number of bytes that match backwards from pMatch, + * even with the backwards match spanning 2 different segments. + * + * On reaching `pMatchBase`, start counting from mEnd */ +static size_t ZSTD_ldm_countBackwardsMatch_2segments( + const BYTE* pIn, const BYTE* pAnchor, + const BYTE* pMatch, const BYTE* pMatchBase, + const BYTE* pExtDictStart, const BYTE* pExtDictEnd) +{ + size_t matchLength = ZSTD_ldm_countBackwardsMatch(pIn, pAnchor, pMatch, pMatchBase); + if (pMatch - matchLength != pMatchBase || pMatchBase == pExtDictStart) { + /* If backwards match is entirely in the extDict or prefix, immediately return */ + return matchLength; + } + DEBUGLOG(7, "ZSTD_ldm_countBackwardsMatch_2segments: found 2-parts backwards match (length in prefix==%zu)", matchLength); + matchLength += ZSTD_ldm_countBackwardsMatch(pIn - matchLength, pAnchor, pExtDictEnd, pExtDictStart); + DEBUGLOG(7, "final backwards match length = %zu", matchLength); + return matchLength; +} + +/** ZSTD_ldm_fillFastTables() : + * + * Fills the relevant tables for the ZSTD_fast and ZSTD_dfast strategies. + * This is similar to ZSTD_loadDictionaryContent. + * + * The tables for the other strategies are filled within their + * block compressors. */ +static size_t ZSTD_ldm_fillFastTables(ZSTD_matchState_t* ms, + void const* end) +{ + const BYTE* const iend = (const BYTE*)end; + + switch(ms->cParams.strategy) + { + case ZSTD_fast: + ZSTD_fillHashTable(ms, iend, ZSTD_dtlm_fast, ZSTD_tfp_forCCtx); + break; + + case ZSTD_dfast: + ZSTD_fillDoubleHashTable(ms, iend, ZSTD_dtlm_fast, ZSTD_tfp_forCCtx); + break; + + case ZSTD_greedy: + case ZSTD_lazy: + case ZSTD_lazy2: + case ZSTD_btlazy2: + case ZSTD_btopt: + case ZSTD_btultra: + case ZSTD_btultra2: + break; + default: + assert(0); /* not possible : not a valid strategy id */ + } + + return 0; +} + +void ZSTD_ldm_fillHashTable( + ldmState_t* ldmState, const BYTE* ip, + const BYTE* iend, ldmParams_t const* params) +{ + U32 const minMatchLength = params->minMatchLength; + U32 const hBits = params->hashLog - params->bucketSizeLog; + BYTE const* const base = ldmState->window.base; + BYTE const* const istart = ip; + ldmRollingHashState_t hashState; + size_t* const splits = ldmState->splitIndices; + unsigned numSplits; + + DEBUGLOG(5, "ZSTD_ldm_fillHashTable"); + + ZSTD_ldm_gear_init(&hashState, params); + while (ip < iend) { + size_t hashed; + unsigned n; + + numSplits = 0; + hashed = ZSTD_ldm_gear_feed(&hashState, ip, iend - ip, splits, &numSplits); + + for (n = 0; n < numSplits; n++) { + if (ip + splits[n] >= istart + minMatchLength) { + BYTE const* const split = ip + splits[n] - minMatchLength; + U64 const xxhash = XXH64(split, minMatchLength, 0); + U32 const hash = (U32)(xxhash & (((U32)1 << hBits) - 1)); + ldmEntry_t entry; + + entry.offset = (U32)(split - base); + entry.checksum = (U32)(xxhash >> 32); + ZSTD_ldm_insertEntry(ldmState, hash, entry, *params); + } + } + + ip += hashed; + } +} + + +/** ZSTD_ldm_limitTableUpdate() : + * + * Sets cctx->nextToUpdate to a position corresponding closer to anchor + * if it is far way + * (after a long match, only update tables a limited amount). */ +static void ZSTD_ldm_limitTableUpdate(ZSTD_matchState_t* ms, const BYTE* anchor) +{ + U32 const curr = (U32)(anchor - ms->window.base); + if (curr > ms->nextToUpdate + 1024) { + ms->nextToUpdate = + curr - MIN(512, curr - ms->nextToUpdate - 1024); + } +} + +static size_t ZSTD_ldm_generateSequences_internal( + ldmState_t* ldmState, rawSeqStore_t* rawSeqStore, + ldmParams_t const* params, void const* src, size_t srcSize) +{ + /* LDM parameters */ + int const extDict = ZSTD_window_hasExtDict(ldmState->window); + U32 const minMatchLength = params->minMatchLength; + U32 const entsPerBucket = 1U << params->bucketSizeLog; + U32 const hBits = params->hashLog - params->bucketSizeLog; + /* Prefix and extDict parameters */ + U32 const dictLimit = ldmState->window.dictLimit; + U32 const lowestIndex = extDict ? ldmState->window.lowLimit : dictLimit; + BYTE const* const base = ldmState->window.base; + BYTE const* const dictBase = extDict ? ldmState->window.dictBase : NULL; + BYTE const* const dictStart = extDict ? dictBase + lowestIndex : NULL; + BYTE const* const dictEnd = extDict ? dictBase + dictLimit : NULL; + BYTE const* const lowPrefixPtr = base + dictLimit; + /* Input bounds */ + BYTE const* const istart = (BYTE const*)src; + BYTE const* const iend = istart + srcSize; + BYTE const* const ilimit = iend - HASH_READ_SIZE; + /* Input positions */ + BYTE const* anchor = istart; + BYTE const* ip = istart; + /* Rolling hash state */ + ldmRollingHashState_t hashState; + /* Arrays for staged-processing */ + size_t* const splits = ldmState->splitIndices; + ldmMatchCandidate_t* const candidates = ldmState->matchCandidates; + unsigned numSplits; + + if (srcSize < minMatchLength) + return iend - anchor; + + /* Initialize the rolling hash state with the first minMatchLength bytes */ + ZSTD_ldm_gear_init(&hashState, params); + ZSTD_ldm_gear_reset(&hashState, ip, minMatchLength); + ip += minMatchLength; + + while (ip < ilimit) { + size_t hashed; + unsigned n; + + numSplits = 0; + hashed = ZSTD_ldm_gear_feed(&hashState, ip, ilimit - ip, + splits, &numSplits); + + for (n = 0; n < numSplits; n++) { + BYTE const* const split = ip + splits[n] - minMatchLength; + U64 const xxhash = XXH64(split, minMatchLength, 0); + U32 const hash = (U32)(xxhash & (((U32)1 << hBits) - 1)); + + candidates[n].split = split; + candidates[n].hash = hash; + candidates[n].checksum = (U32)(xxhash >> 32); + candidates[n].bucket = ZSTD_ldm_getBucket(ldmState, hash, *params); + PREFETCH_L1(candidates[n].bucket); + } + + for (n = 0; n < numSplits; n++) { + size_t forwardMatchLength = 0, backwardMatchLength = 0, + bestMatchLength = 0, mLength; + U32 offset; + BYTE const* const split = candidates[n].split; + U32 const checksum = candidates[n].checksum; + U32 const hash = candidates[n].hash; + ldmEntry_t* const bucket = candidates[n].bucket; + ldmEntry_t const* cur; + ldmEntry_t const* bestEntry = NULL; + ldmEntry_t newEntry; + + newEntry.offset = (U32)(split - base); + newEntry.checksum = checksum; + + /* If a split point would generate a sequence overlapping with + * the previous one, we merely register it in the hash table and + * move on */ + if (split < anchor) { + ZSTD_ldm_insertEntry(ldmState, hash, newEntry, *params); + continue; + } + + for (cur = bucket; cur < bucket + entsPerBucket; cur++) { + size_t curForwardMatchLength, curBackwardMatchLength, + curTotalMatchLength; + if (cur->checksum != checksum || cur->offset <= lowestIndex) { + continue; + } + if (extDict) { + BYTE const* const curMatchBase = + cur->offset < dictLimit ? dictBase : base; + BYTE const* const pMatch = curMatchBase + cur->offset; + BYTE const* const matchEnd = + cur->offset < dictLimit ? dictEnd : iend; + BYTE const* const lowMatchPtr = + cur->offset < dictLimit ? dictStart : lowPrefixPtr; + curForwardMatchLength = + ZSTD_count_2segments(split, pMatch, iend, matchEnd, lowPrefixPtr); + if (curForwardMatchLength < minMatchLength) { + continue; + } + curBackwardMatchLength = ZSTD_ldm_countBackwardsMatch_2segments( + split, anchor, pMatch, lowMatchPtr, dictStart, dictEnd); + } else { /* !extDict */ + BYTE const* const pMatch = base + cur->offset; + curForwardMatchLength = ZSTD_count(split, pMatch, iend); + if (curForwardMatchLength < minMatchLength) { + continue; + } + curBackwardMatchLength = + ZSTD_ldm_countBackwardsMatch(split, anchor, pMatch, lowPrefixPtr); + } + curTotalMatchLength = curForwardMatchLength + curBackwardMatchLength; + + if (curTotalMatchLength > bestMatchLength) { + bestMatchLength = curTotalMatchLength; + forwardMatchLength = curForwardMatchLength; + backwardMatchLength = curBackwardMatchLength; + bestEntry = cur; + } + } + + /* No match found -- insert an entry into the hash table + * and process the next candidate match */ + if (bestEntry == NULL) { + ZSTD_ldm_insertEntry(ldmState, hash, newEntry, *params); + continue; + } + + /* Match found */ + offset = (U32)(split - base) - bestEntry->offset; + mLength = forwardMatchLength + backwardMatchLength; + { + rawSeq* const seq = rawSeqStore->seq + rawSeqStore->size; + + /* Out of sequence storage */ + if (rawSeqStore->size == rawSeqStore->capacity) + return ERROR(dstSize_tooSmall); + seq->litLength = (U32)(split - backwardMatchLength - anchor); + seq->matchLength = (U32)mLength; + seq->offset = offset; + rawSeqStore->size++; + } + + /* Insert the current entry into the hash table --- it must be + * done after the previous block to avoid clobbering bestEntry */ + ZSTD_ldm_insertEntry(ldmState, hash, newEntry, *params); + + anchor = split + forwardMatchLength; + + /* If we find a match that ends after the data that we've hashed + * then we have a repeating, overlapping, pattern. E.g. all zeros. + * If one repetition of the pattern matches our `stopMask` then all + * repetitions will. We don't need to insert them all into out table, + * only the first one. So skip over overlapping matches. + * This is a major speed boost (20x) for compressing a single byte + * repeated, when that byte ends up in the table. + */ + if (anchor > ip + hashed) { + ZSTD_ldm_gear_reset(&hashState, anchor - minMatchLength, minMatchLength); + /* Continue the outer loop at anchor (ip + hashed == anchor). */ + ip = anchor - hashed; + break; + } + } + + ip += hashed; + } + + return iend - anchor; +} + +/*! ZSTD_ldm_reduceTable() : + * reduce table indexes by `reducerValue` */ +static void ZSTD_ldm_reduceTable(ldmEntry_t* const table, U32 const size, + U32 const reducerValue) +{ + U32 u; + for (u = 0; u < size; u++) { + if (table[u].offset < reducerValue) table[u].offset = 0; + else table[u].offset -= reducerValue; + } +} + +size_t ZSTD_ldm_generateSequences( + ldmState_t* ldmState, rawSeqStore_t* sequences, + ldmParams_t const* params, void const* src, size_t srcSize) +{ + U32 const maxDist = 1U << params->windowLog; + BYTE const* const istart = (BYTE const*)src; + BYTE const* const iend = istart + srcSize; + size_t const kMaxChunkSize = 1 << 20; + size_t const nbChunks = (srcSize / kMaxChunkSize) + ((srcSize % kMaxChunkSize) != 0); + size_t chunk; + size_t leftoverSize = 0; + + assert(ZSTD_CHUNKSIZE_MAX >= kMaxChunkSize); + /* Check that ZSTD_window_update() has been called for this chunk prior + * to passing it to this function. + */ + assert(ldmState->window.nextSrc >= (BYTE const*)src + srcSize); + /* The input could be very large (in zstdmt), so it must be broken up into + * chunks to enforce the maximum distance and handle overflow correction. + */ + assert(sequences->pos <= sequences->size); + assert(sequences->size <= sequences->capacity); + for (chunk = 0; chunk < nbChunks && sequences->size < sequences->capacity; ++chunk) { + BYTE const* const chunkStart = istart + chunk * kMaxChunkSize; + size_t const remaining = (size_t)(iend - chunkStart); + BYTE const *const chunkEnd = + (remaining < kMaxChunkSize) ? iend : chunkStart + kMaxChunkSize; + size_t const chunkSize = chunkEnd - chunkStart; + size_t newLeftoverSize; + size_t const prevSize = sequences->size; + + assert(chunkStart < iend); + /* 1. Perform overflow correction if necessary. */ + if (ZSTD_window_needOverflowCorrection(ldmState->window, 0, maxDist, ldmState->loadedDictEnd, chunkStart, chunkEnd)) { + U32 const ldmHSize = 1U << params->hashLog; + U32 const correction = ZSTD_window_correctOverflow( + &ldmState->window, /* cycleLog */ 0, maxDist, chunkStart); + ZSTD_ldm_reduceTable(ldmState->hashTable, ldmHSize, correction); + /* invalidate dictionaries on overflow correction */ + ldmState->loadedDictEnd = 0; + } + /* 2. We enforce the maximum offset allowed. + * + * kMaxChunkSize should be small enough that we don't lose too much of + * the window through early invalidation. + * TODO: * Test the chunk size. + * * Try invalidation after the sequence generation and test the + * offset against maxDist directly. + * + * NOTE: Because of dictionaries + sequence splitting we MUST make sure + * that any offset used is valid at the END of the sequence, since it may + * be split into two sequences. This condition holds when using + * ZSTD_window_enforceMaxDist(), but if we move to checking offsets + * against maxDist directly, we'll have to carefully handle that case. + */ + ZSTD_window_enforceMaxDist(&ldmState->window, chunkEnd, maxDist, &ldmState->loadedDictEnd, NULL); + /* 3. Generate the sequences for the chunk, and get newLeftoverSize. */ + newLeftoverSize = ZSTD_ldm_generateSequences_internal( + ldmState, sequences, params, chunkStart, chunkSize); + if (ZSTD_isError(newLeftoverSize)) + return newLeftoverSize; + /* 4. We add the leftover literals from previous iterations to the first + * newly generated sequence, or add the `newLeftoverSize` if none are + * generated. + */ + /* Prepend the leftover literals from the last call */ + if (prevSize < sequences->size) { + sequences->seq[prevSize].litLength += (U32)leftoverSize; + leftoverSize = newLeftoverSize; + } else { + assert(newLeftoverSize == chunkSize); + leftoverSize += chunkSize; + } + } + return 0; +} + +void +ZSTD_ldm_skipSequences(rawSeqStore_t* rawSeqStore, size_t srcSize, U32 const minMatch) +{ + while (srcSize > 0 && rawSeqStore->pos < rawSeqStore->size) { + rawSeq* seq = rawSeqStore->seq + rawSeqStore->pos; + if (srcSize <= seq->litLength) { + /* Skip past srcSize literals */ + seq->litLength -= (U32)srcSize; + return; + } + srcSize -= seq->litLength; + seq->litLength = 0; + if (srcSize < seq->matchLength) { + /* Skip past the first srcSize of the match */ + seq->matchLength -= (U32)srcSize; + if (seq->matchLength < minMatch) { + /* The match is too short, omit it */ + if (rawSeqStore->pos + 1 < rawSeqStore->size) { + seq[1].litLength += seq[0].matchLength; + } + rawSeqStore->pos++; + } + return; + } + srcSize -= seq->matchLength; + seq->matchLength = 0; + rawSeqStore->pos++; + } +} + +/** + * If the sequence length is longer than remaining then the sequence is split + * between this block and the next. + * + * Returns the current sequence to handle, or if the rest of the block should + * be literals, it returns a sequence with offset == 0. + */ +static rawSeq maybeSplitSequence(rawSeqStore_t* rawSeqStore, + U32 const remaining, U32 const minMatch) +{ + rawSeq sequence = rawSeqStore->seq[rawSeqStore->pos]; + assert(sequence.offset > 0); + /* Likely: No partial sequence */ + if (remaining >= sequence.litLength + sequence.matchLength) { + rawSeqStore->pos++; + return sequence; + } + /* Cut the sequence short (offset == 0 ==> rest is literals). */ + if (remaining <= sequence.litLength) { + sequence.offset = 0; + } else if (remaining < sequence.litLength + sequence.matchLength) { + sequence.matchLength = remaining - sequence.litLength; + if (sequence.matchLength < minMatch) { + sequence.offset = 0; + } + } + /* Skip past `remaining` bytes for the future sequences. */ + ZSTD_ldm_skipSequences(rawSeqStore, remaining, minMatch); + return sequence; +} + +void ZSTD_ldm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t nbBytes) { + U32 currPos = (U32)(rawSeqStore->posInSequence + nbBytes); + while (currPos && rawSeqStore->pos < rawSeqStore->size) { + rawSeq currSeq = rawSeqStore->seq[rawSeqStore->pos]; + if (currPos >= currSeq.litLength + currSeq.matchLength) { + currPos -= currSeq.litLength + currSeq.matchLength; + rawSeqStore->pos++; + } else { + rawSeqStore->posInSequence = currPos; + break; + } + } + if (currPos == 0 || rawSeqStore->pos == rawSeqStore->size) { + rawSeqStore->posInSequence = 0; + } +} + +size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore, + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + ZSTD_paramSwitch_e useRowMatchFinder, + void const* src, size_t srcSize) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + unsigned const minMatch = cParams->minMatch; + ZSTD_blockCompressor const blockCompressor = + ZSTD_selectBlockCompressor(cParams->strategy, useRowMatchFinder, ZSTD_matchState_dictMode(ms)); + /* Input bounds */ + BYTE const* const istart = (BYTE const*)src; + BYTE const* const iend = istart + srcSize; + /* Input positions */ + BYTE const* ip = istart; + + DEBUGLOG(5, "ZSTD_ldm_blockCompress: srcSize=%zu", srcSize); + /* If using opt parser, use LDMs only as candidates rather than always accepting them */ + if (cParams->strategy >= ZSTD_btopt) { + size_t lastLLSize; + ms->ldmSeqStore = rawSeqStore; + lastLLSize = blockCompressor(ms, seqStore, rep, src, srcSize); + ZSTD_ldm_skipRawSeqStoreBytes(rawSeqStore, srcSize); + return lastLLSize; + } + + assert(rawSeqStore->pos <= rawSeqStore->size); + assert(rawSeqStore->size <= rawSeqStore->capacity); + /* Loop through each sequence and apply the block compressor to the literals */ + while (rawSeqStore->pos < rawSeqStore->size && ip < iend) { + /* maybeSplitSequence updates rawSeqStore->pos */ + rawSeq const sequence = maybeSplitSequence(rawSeqStore, + (U32)(iend - ip), minMatch); + int i; + /* End signal */ + if (sequence.offset == 0) + break; + + assert(ip + sequence.litLength + sequence.matchLength <= iend); + + /* Fill tables for block compressor */ + ZSTD_ldm_limitTableUpdate(ms, ip); + ZSTD_ldm_fillFastTables(ms, ip); + /* Run the block compressor */ + DEBUGLOG(5, "pos %u : calling block compressor on segment of size %u", (unsigned)(ip-istart), sequence.litLength); + { + size_t const newLitLength = + blockCompressor(ms, seqStore, rep, ip, sequence.litLength); + ip += sequence.litLength; + /* Update the repcodes */ + for (i = ZSTD_REP_NUM - 1; i > 0; i--) + rep[i] = rep[i-1]; + rep[0] = sequence.offset; + /* Store the sequence */ + ZSTD_storeSeq(seqStore, newLitLength, ip - newLitLength, iend, + OFFSET_TO_OFFBASE(sequence.offset), + sequence.matchLength); + ip += sequence.matchLength; + } + } + /* Fill the tables for the block compressor */ + ZSTD_ldm_limitTableUpdate(ms, ip); + ZSTD_ldm_fillFastTables(ms, ip); + /* Compress the last literals */ + return blockCompressor(ms, seqStore, rep, ip, iend - ip); +} +/**** ended inlining compress/zstd_ldm.c ****/ +/**** start inlining compress/zstd_opt.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/**** skipping file: zstd_compress_internal.h ****/ +/**** skipping file: hist.h ****/ +/**** skipping file: zstd_opt.h ****/ + + +#define ZSTD_LITFREQ_ADD 2 /* scaling factor for litFreq, so that frequencies adapt faster to new stats */ +#define ZSTD_MAX_PRICE (1<<30) + +#define ZSTD_PREDEF_THRESHOLD 8 /* if srcSize < ZSTD_PREDEF_THRESHOLD, symbols' cost is assumed static, directly determined by pre-defined distributions */ + + +/*-************************************* +* Price functions for optimal parser +***************************************/ + +#if 0 /* approximation at bit level (for tests) */ +# define BITCOST_ACCURACY 0 +# define BITCOST_MULTIPLIER (1 << BITCOST_ACCURACY) +# define WEIGHT(stat, opt) ((void)(opt), ZSTD_bitWeight(stat)) +#elif 0 /* fractional bit accuracy (for tests) */ +# define BITCOST_ACCURACY 8 +# define BITCOST_MULTIPLIER (1 << BITCOST_ACCURACY) +# define WEIGHT(stat,opt) ((void)(opt), ZSTD_fracWeight(stat)) +#else /* opt==approx, ultra==accurate */ +# define BITCOST_ACCURACY 8 +# define BITCOST_MULTIPLIER (1 << BITCOST_ACCURACY) +# define WEIGHT(stat,opt) ((opt) ? ZSTD_fracWeight(stat) : ZSTD_bitWeight(stat)) +#endif + +/* ZSTD_bitWeight() : + * provide estimated "cost" of a stat in full bits only */ +MEM_STATIC U32 ZSTD_bitWeight(U32 stat) +{ + return (ZSTD_highbit32(stat+1) * BITCOST_MULTIPLIER); +} + +/* ZSTD_fracWeight() : + * provide fractional-bit "cost" of a stat, + * using linear interpolation approximation */ +MEM_STATIC U32 ZSTD_fracWeight(U32 rawStat) +{ + U32 const stat = rawStat + 1; + U32 const hb = ZSTD_highbit32(stat); + U32 const BWeight = hb * BITCOST_MULTIPLIER; + /* Fweight was meant for "Fractional weight" + * but it's effectively a value between 1 and 2 + * using fixed point arithmetic */ + U32 const FWeight = (stat << BITCOST_ACCURACY) >> hb; + U32 const weight = BWeight + FWeight; + assert(hb + BITCOST_ACCURACY < 31); + return weight; +} + +#if (DEBUGLEVEL>=2) +/* debugging function, + * @return price in bytes as fractional value + * for debug messages only */ +MEM_STATIC double ZSTD_fCost(int price) +{ + return (double)price / (BITCOST_MULTIPLIER*8); +} +#endif + +static int ZSTD_compressedLiterals(optState_t const* const optPtr) +{ + return optPtr->literalCompressionMode != ZSTD_ps_disable; +} + +static void ZSTD_setBasePrices(optState_t* optPtr, int optLevel) +{ + if (ZSTD_compressedLiterals(optPtr)) + optPtr->litSumBasePrice = WEIGHT(optPtr->litSum, optLevel); + optPtr->litLengthSumBasePrice = WEIGHT(optPtr->litLengthSum, optLevel); + optPtr->matchLengthSumBasePrice = WEIGHT(optPtr->matchLengthSum, optLevel); + optPtr->offCodeSumBasePrice = WEIGHT(optPtr->offCodeSum, optLevel); +} + + +static U32 sum_u32(const unsigned table[], size_t nbElts) +{ + size_t n; + U32 total = 0; + for (n=0; n0); + unsigned const newStat = base + (table[s] >> shift); + sum += newStat; + table[s] = newStat; + } + return sum; +} + +/* ZSTD_scaleStats() : + * reduce all elt frequencies in table if sum too large + * return the resulting sum of elements */ +static U32 ZSTD_scaleStats(unsigned* table, U32 lastEltIndex, U32 logTarget) +{ + U32 const prevsum = sum_u32(table, lastEltIndex+1); + U32 const factor = prevsum >> logTarget; + DEBUGLOG(5, "ZSTD_scaleStats (nbElts=%u, target=%u)", (unsigned)lastEltIndex+1, (unsigned)logTarget); + assert(logTarget < 30); + if (factor <= 1) return prevsum; + return ZSTD_downscaleStats(table, lastEltIndex, ZSTD_highbit32(factor), base_1guaranteed); +} + +/* ZSTD_rescaleFreqs() : + * if first block (detected by optPtr->litLengthSum == 0) : init statistics + * take hints from dictionary if there is one + * and init from zero if there is none, + * using src for literals stats, and baseline stats for sequence symbols + * otherwise downscale existing stats, to be used as seed for next block. + */ +static void +ZSTD_rescaleFreqs(optState_t* const optPtr, + const BYTE* const src, size_t const srcSize, + int const optLevel) +{ + int const compressedLiterals = ZSTD_compressedLiterals(optPtr); + DEBUGLOG(5, "ZSTD_rescaleFreqs (srcSize=%u)", (unsigned)srcSize); + optPtr->priceType = zop_dynamic; + + if (optPtr->litLengthSum == 0) { /* no literals stats collected -> first block assumed -> init */ + + /* heuristic: use pre-defined stats for too small inputs */ + if (srcSize <= ZSTD_PREDEF_THRESHOLD) { + DEBUGLOG(5, "srcSize <= %i : use predefined stats", ZSTD_PREDEF_THRESHOLD); + optPtr->priceType = zop_predef; + } + + assert(optPtr->symbolCosts != NULL); + if (optPtr->symbolCosts->huf.repeatMode == HUF_repeat_valid) { + + /* huffman stats covering the full value set : table presumed generated by dictionary */ + optPtr->priceType = zop_dynamic; + + if (compressedLiterals) { + /* generate literals statistics from huffman table */ + unsigned lit; + assert(optPtr->litFreq != NULL); + optPtr->litSum = 0; + for (lit=0; lit<=MaxLit; lit++) { + U32 const scaleLog = 11; /* scale to 2K */ + U32 const bitCost = HUF_getNbBitsFromCTable(optPtr->symbolCosts->huf.CTable, lit); + assert(bitCost <= scaleLog); + optPtr->litFreq[lit] = bitCost ? 1 << (scaleLog-bitCost) : 1 /*minimum to calculate cost*/; + optPtr->litSum += optPtr->litFreq[lit]; + } } + + { unsigned ll; + FSE_CState_t llstate; + FSE_initCState(&llstate, optPtr->symbolCosts->fse.litlengthCTable); + optPtr->litLengthSum = 0; + for (ll=0; ll<=MaxLL; ll++) { + U32 const scaleLog = 10; /* scale to 1K */ + U32 const bitCost = FSE_getMaxNbBits(llstate.symbolTT, ll); + assert(bitCost < scaleLog); + optPtr->litLengthFreq[ll] = bitCost ? 1 << (scaleLog-bitCost) : 1 /*minimum to calculate cost*/; + optPtr->litLengthSum += optPtr->litLengthFreq[ll]; + } } + + { unsigned ml; + FSE_CState_t mlstate; + FSE_initCState(&mlstate, optPtr->symbolCosts->fse.matchlengthCTable); + optPtr->matchLengthSum = 0; + for (ml=0; ml<=MaxML; ml++) { + U32 const scaleLog = 10; + U32 const bitCost = FSE_getMaxNbBits(mlstate.symbolTT, ml); + assert(bitCost < scaleLog); + optPtr->matchLengthFreq[ml] = bitCost ? 1 << (scaleLog-bitCost) : 1 /*minimum to calculate cost*/; + optPtr->matchLengthSum += optPtr->matchLengthFreq[ml]; + } } + + { unsigned of; + FSE_CState_t ofstate; + FSE_initCState(&ofstate, optPtr->symbolCosts->fse.offcodeCTable); + optPtr->offCodeSum = 0; + for (of=0; of<=MaxOff; of++) { + U32 const scaleLog = 10; + U32 const bitCost = FSE_getMaxNbBits(ofstate.symbolTT, of); + assert(bitCost < scaleLog); + optPtr->offCodeFreq[of] = bitCost ? 1 << (scaleLog-bitCost) : 1 /*minimum to calculate cost*/; + optPtr->offCodeSum += optPtr->offCodeFreq[of]; + } } + + } else { /* first block, no dictionary */ + + assert(optPtr->litFreq != NULL); + if (compressedLiterals) { + /* base initial cost of literals on direct frequency within src */ + unsigned lit = MaxLit; + HIST_count_simple(optPtr->litFreq, &lit, src, srcSize); /* use raw first block to init statistics */ + optPtr->litSum = ZSTD_downscaleStats(optPtr->litFreq, MaxLit, 8, base_0possible); + } + + { unsigned const baseLLfreqs[MaxLL+1] = { + 4, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1 + }; + ZSTD_memcpy(optPtr->litLengthFreq, baseLLfreqs, sizeof(baseLLfreqs)); + optPtr->litLengthSum = sum_u32(baseLLfreqs, MaxLL+1); + } + + { unsigned ml; + for (ml=0; ml<=MaxML; ml++) + optPtr->matchLengthFreq[ml] = 1; + } + optPtr->matchLengthSum = MaxML+1; + + { unsigned const baseOFCfreqs[MaxOff+1] = { + 6, 2, 1, 1, 2, 3, 4, 4, + 4, 3, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1 + }; + ZSTD_memcpy(optPtr->offCodeFreq, baseOFCfreqs, sizeof(baseOFCfreqs)); + optPtr->offCodeSum = sum_u32(baseOFCfreqs, MaxOff+1); + } + + } + + } else { /* new block : scale down accumulated statistics */ + + if (compressedLiterals) + optPtr->litSum = ZSTD_scaleStats(optPtr->litFreq, MaxLit, 12); + optPtr->litLengthSum = ZSTD_scaleStats(optPtr->litLengthFreq, MaxLL, 11); + optPtr->matchLengthSum = ZSTD_scaleStats(optPtr->matchLengthFreq, MaxML, 11); + optPtr->offCodeSum = ZSTD_scaleStats(optPtr->offCodeFreq, MaxOff, 11); + } + + ZSTD_setBasePrices(optPtr, optLevel); +} + +/* ZSTD_rawLiteralsCost() : + * price of literals (only) in specified segment (which length can be 0). + * does not include price of literalLength symbol */ +static U32 ZSTD_rawLiteralsCost(const BYTE* const literals, U32 const litLength, + const optState_t* const optPtr, + int optLevel) +{ + if (litLength == 0) return 0; + + if (!ZSTD_compressedLiterals(optPtr)) + return (litLength << 3) * BITCOST_MULTIPLIER; /* Uncompressed - 8 bytes per literal. */ + + if (optPtr->priceType == zop_predef) + return (litLength*6) * BITCOST_MULTIPLIER; /* 6 bit per literal - no statistic used */ + + /* dynamic statistics */ + { U32 price = optPtr->litSumBasePrice * litLength; + U32 const litPriceMax = optPtr->litSumBasePrice - BITCOST_MULTIPLIER; + U32 u; + assert(optPtr->litSumBasePrice >= BITCOST_MULTIPLIER); + for (u=0; u < litLength; u++) { + U32 litPrice = WEIGHT(optPtr->litFreq[literals[u]], optLevel); + if (UNLIKELY(litPrice > litPriceMax)) litPrice = litPriceMax; + price -= litPrice; + } + return price; + } +} + +/* ZSTD_litLengthPrice() : + * cost of literalLength symbol */ +static U32 ZSTD_litLengthPrice(U32 const litLength, const optState_t* const optPtr, int optLevel) +{ + assert(litLength <= ZSTD_BLOCKSIZE_MAX); + if (optPtr->priceType == zop_predef) + return WEIGHT(litLength, optLevel); + + /* ZSTD_LLcode() can't compute litLength price for sizes >= ZSTD_BLOCKSIZE_MAX + * because it isn't representable in the zstd format. + * So instead just pretend it would cost 1 bit more than ZSTD_BLOCKSIZE_MAX - 1. + * In such a case, the block would be all literals. + */ + if (litLength == ZSTD_BLOCKSIZE_MAX) + return BITCOST_MULTIPLIER + ZSTD_litLengthPrice(ZSTD_BLOCKSIZE_MAX - 1, optPtr, optLevel); + + /* dynamic statistics */ + { U32 const llCode = ZSTD_LLcode(litLength); + return (LL_bits[llCode] * BITCOST_MULTIPLIER) + + optPtr->litLengthSumBasePrice + - WEIGHT(optPtr->litLengthFreq[llCode], optLevel); + } +} + +/* ZSTD_getMatchPrice() : + * Provides the cost of the match part (offset + matchLength) of a sequence. + * Must be combined with ZSTD_fullLiteralsCost() to get the full cost of a sequence. + * @offBase : sumtype, representing an offset or a repcode, and using numeric representation of ZSTD_storeSeq() + * @optLevel: when <2, favors small offset for decompression speed (improved cache efficiency) + */ +FORCE_INLINE_TEMPLATE U32 +ZSTD_getMatchPrice(U32 const offBase, + U32 const matchLength, + const optState_t* const optPtr, + int const optLevel) +{ + U32 price; + U32 const offCode = ZSTD_highbit32(offBase); + U32 const mlBase = matchLength - MINMATCH; + assert(matchLength >= MINMATCH); + + if (optPtr->priceType == zop_predef) /* fixed scheme, does not use statistics */ + return WEIGHT(mlBase, optLevel) + + ((16 + offCode) * BITCOST_MULTIPLIER); /* emulated offset cost */ + + /* dynamic statistics */ + price = (offCode * BITCOST_MULTIPLIER) + (optPtr->offCodeSumBasePrice - WEIGHT(optPtr->offCodeFreq[offCode], optLevel)); + if ((optLevel<2) /*static*/ && offCode >= 20) + price += (offCode-19)*2 * BITCOST_MULTIPLIER; /* handicap for long distance offsets, favor decompression speed */ + + /* match Length */ + { U32 const mlCode = ZSTD_MLcode(mlBase); + price += (ML_bits[mlCode] * BITCOST_MULTIPLIER) + (optPtr->matchLengthSumBasePrice - WEIGHT(optPtr->matchLengthFreq[mlCode], optLevel)); + } + + price += BITCOST_MULTIPLIER / 5; /* heuristic : make matches a bit more costly to favor less sequences -> faster decompression speed */ + + DEBUGLOG(8, "ZSTD_getMatchPrice(ml:%u) = %u", matchLength, price); + return price; +} + +/* ZSTD_updateStats() : + * assumption : literals + litLength <= iend */ +static void ZSTD_updateStats(optState_t* const optPtr, + U32 litLength, const BYTE* literals, + U32 offBase, U32 matchLength) +{ + /* literals */ + if (ZSTD_compressedLiterals(optPtr)) { + U32 u; + for (u=0; u < litLength; u++) + optPtr->litFreq[literals[u]] += ZSTD_LITFREQ_ADD; + optPtr->litSum += litLength*ZSTD_LITFREQ_ADD; + } + + /* literal Length */ + { U32 const llCode = ZSTD_LLcode(litLength); + optPtr->litLengthFreq[llCode]++; + optPtr->litLengthSum++; + } + + /* offset code : follows storeSeq() numeric representation */ + { U32 const offCode = ZSTD_highbit32(offBase); + assert(offCode <= MaxOff); + optPtr->offCodeFreq[offCode]++; + optPtr->offCodeSum++; + } + + /* match Length */ + { U32 const mlBase = matchLength - MINMATCH; + U32 const mlCode = ZSTD_MLcode(mlBase); + optPtr->matchLengthFreq[mlCode]++; + optPtr->matchLengthSum++; + } +} + + +/* ZSTD_readMINMATCH() : + * function safe only for comparisons + * assumption : memPtr must be at least 4 bytes before end of buffer */ +MEM_STATIC U32 ZSTD_readMINMATCH(const void* memPtr, U32 length) +{ + switch (length) + { + default : + case 4 : return MEM_read32(memPtr); + case 3 : if (MEM_isLittleEndian()) + return MEM_read32(memPtr)<<8; + else + return MEM_read32(memPtr)>>8; + } +} + + +/* Update hashTable3 up to ip (excluded) + Assumption : always within prefix (i.e. not within extDict) */ +static U32 ZSTD_insertAndFindFirstIndexHash3 (const ZSTD_matchState_t* ms, + U32* nextToUpdate3, + const BYTE* const ip) +{ + U32* const hashTable3 = ms->hashTable3; + U32 const hashLog3 = ms->hashLog3; + const BYTE* const base = ms->window.base; + U32 idx = *nextToUpdate3; + U32 const target = (U32)(ip - base); + size_t const hash3 = ZSTD_hash3Ptr(ip, hashLog3); + assert(hashLog3 > 0); + + while(idx < target) { + hashTable3[ZSTD_hash3Ptr(base+idx, hashLog3)] = idx; + idx++; + } + + *nextToUpdate3 = target; + return hashTable3[hash3]; +} + + +/*-************************************* +* Binary Tree search +***************************************/ +/** ZSTD_insertBt1() : add one or multiple positions to tree. + * @param ip assumed <= iend-8 . + * @param target The target of ZSTD_updateTree_internal() - we are filling to this position + * @return : nb of positions added */ +static U32 ZSTD_insertBt1( + const ZSTD_matchState_t* ms, + const BYTE* const ip, const BYTE* const iend, + U32 const target, + U32 const mls, const int extDict) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hashLog = cParams->hashLog; + size_t const h = ZSTD_hashPtr(ip, hashLog, mls); + U32* const bt = ms->chainTable; + U32 const btLog = cParams->chainLog - 1; + U32 const btMask = (1 << btLog) - 1; + U32 matchIndex = hashTable[h]; + size_t commonLengthSmaller=0, commonLengthLarger=0; + const BYTE* const base = ms->window.base; + const BYTE* const dictBase = ms->window.dictBase; + const U32 dictLimit = ms->window.dictLimit; + const BYTE* const dictEnd = dictBase + dictLimit; + const BYTE* const prefixStart = base + dictLimit; + const BYTE* match; + const U32 curr = (U32)(ip-base); + const U32 btLow = btMask >= curr ? 0 : curr - btMask; + U32* smallerPtr = bt + 2*(curr&btMask); + U32* largerPtr = smallerPtr + 1; + U32 dummy32; /* to be nullified at the end */ + /* windowLow is based on target because + * we only need positions that will be in the window at the end of the tree update. + */ + U32 const windowLow = ZSTD_getLowestMatchIndex(ms, target, cParams->windowLog); + U32 matchEndIdx = curr+8+1; + size_t bestLength = 8; + U32 nbCompares = 1U << cParams->searchLog; +#ifdef ZSTD_C_PREDICT + U32 predictedSmall = *(bt + 2*((curr-1)&btMask) + 0); + U32 predictedLarge = *(bt + 2*((curr-1)&btMask) + 1); + predictedSmall += (predictedSmall>0); + predictedLarge += (predictedLarge>0); +#endif /* ZSTD_C_PREDICT */ + + DEBUGLOG(8, "ZSTD_insertBt1 (%u)", curr); + + assert(curr <= target); + assert(ip <= iend-8); /* required for h calculation */ + hashTable[h] = curr; /* Update Hash Table */ + + assert(windowLow > 0); + for (; nbCompares && (matchIndex >= windowLow); --nbCompares) { + U32* const nextPtr = bt + 2*(matchIndex & btMask); + size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ + assert(matchIndex < curr); + +#ifdef ZSTD_C_PREDICT /* note : can create issues when hlog small <= 11 */ + const U32* predictPtr = bt + 2*((matchIndex-1) & btMask); /* written this way, as bt is a roll buffer */ + if (matchIndex == predictedSmall) { + /* no need to check length, result known */ + *smallerPtr = matchIndex; + if (matchIndex <= btLow) { smallerPtr=&dummy32; break; } /* beyond tree size, stop the search */ + smallerPtr = nextPtr+1; /* new "smaller" => larger of match */ + matchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to current) */ + predictedSmall = predictPtr[1] + (predictPtr[1]>0); + continue; + } + if (matchIndex == predictedLarge) { + *largerPtr = matchIndex; + if (matchIndex <= btLow) { largerPtr=&dummy32; break; } /* beyond tree size, stop the search */ + largerPtr = nextPtr; + matchIndex = nextPtr[0]; + predictedLarge = predictPtr[0] + (predictPtr[0]>0); + continue; + } +#endif + + if (!extDict || (matchIndex+matchLength >= dictLimit)) { + assert(matchIndex+matchLength >= dictLimit); /* might be wrong if actually extDict */ + match = base + matchIndex; + matchLength += ZSTD_count(ip+matchLength, match+matchLength, iend); + } else { + match = dictBase + matchIndex; + matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iend, dictEnd, prefixStart); + if (matchIndex+matchLength >= dictLimit) + match = base + matchIndex; /* to prepare for next usage of match[matchLength] */ + } + + if (matchLength > bestLength) { + bestLength = matchLength; + if (matchLength > matchEndIdx - matchIndex) + matchEndIdx = matchIndex + (U32)matchLength; + } + + if (ip+matchLength == iend) { /* equal : no way to know if inf or sup */ + break; /* drop , to guarantee consistency ; miss a bit of compression, but other solutions can corrupt tree */ + } + + if (match[matchLength] < ip[matchLength]) { /* necessarily within buffer */ + /* match is smaller than current */ + *smallerPtr = matchIndex; /* update smaller idx */ + commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */ + if (matchIndex <= btLow) { smallerPtr=&dummy32; break; } /* beyond tree size, stop searching */ + smallerPtr = nextPtr+1; /* new "candidate" => larger than match, which was smaller than target */ + matchIndex = nextPtr[1]; /* new matchIndex, larger than previous and closer to current */ + } else { + /* match is larger than current */ + *largerPtr = matchIndex; + commonLengthLarger = matchLength; + if (matchIndex <= btLow) { largerPtr=&dummy32; break; } /* beyond tree size, stop searching */ + largerPtr = nextPtr; + matchIndex = nextPtr[0]; + } } + + *smallerPtr = *largerPtr = 0; + { U32 positions = 0; + if (bestLength > 384) positions = MIN(192, (U32)(bestLength - 384)); /* speed optimization */ + assert(matchEndIdx > curr + 8); + return MAX(positions, matchEndIdx - (curr + 8)); + } +} + +FORCE_INLINE_TEMPLATE +void ZSTD_updateTree_internal( + ZSTD_matchState_t* ms, + const BYTE* const ip, const BYTE* const iend, + const U32 mls, const ZSTD_dictMode_e dictMode) +{ + const BYTE* const base = ms->window.base; + U32 const target = (U32)(ip - base); + U32 idx = ms->nextToUpdate; + DEBUGLOG(6, "ZSTD_updateTree_internal, from %u to %u (dictMode:%u)", + idx, target, dictMode); + + while(idx < target) { + U32 const forward = ZSTD_insertBt1(ms, base+idx, iend, target, mls, dictMode == ZSTD_extDict); + assert(idx < (U32)(idx + forward)); + idx += forward; + } + assert((size_t)(ip - base) <= (size_t)(U32)(-1)); + assert((size_t)(iend - base) <= (size_t)(U32)(-1)); + ms->nextToUpdate = target; +} + +void ZSTD_updateTree(ZSTD_matchState_t* ms, const BYTE* ip, const BYTE* iend) { + ZSTD_updateTree_internal(ms, ip, iend, ms->cParams.minMatch, ZSTD_noDict); +} + +FORCE_INLINE_TEMPLATE U32 +ZSTD_insertBtAndGetAllMatches ( + ZSTD_match_t* matches, /* store result (found matches) in this table (presumed large enough) */ + ZSTD_matchState_t* ms, + U32* nextToUpdate3, + const BYTE* const ip, const BYTE* const iLimit, + const ZSTD_dictMode_e dictMode, + const U32 rep[ZSTD_REP_NUM], + const U32 ll0, /* tells if associated literal length is 0 or not. This value must be 0 or 1 */ + const U32 lengthToBeat, + const U32 mls /* template */) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32 const sufficient_len = MIN(cParams->targetLength, ZSTD_OPT_NUM -1); + const BYTE* const base = ms->window.base; + U32 const curr = (U32)(ip-base); + U32 const hashLog = cParams->hashLog; + U32 const minMatch = (mls==3) ? 3 : 4; + U32* const hashTable = ms->hashTable; + size_t const h = ZSTD_hashPtr(ip, hashLog, mls); + U32 matchIndex = hashTable[h]; + U32* const bt = ms->chainTable; + U32 const btLog = cParams->chainLog - 1; + U32 const btMask= (1U << btLog) - 1; + size_t commonLengthSmaller=0, commonLengthLarger=0; + const BYTE* const dictBase = ms->window.dictBase; + U32 const dictLimit = ms->window.dictLimit; + const BYTE* const dictEnd = dictBase + dictLimit; + const BYTE* const prefixStart = base + dictLimit; + U32 const btLow = (btMask >= curr) ? 0 : curr - btMask; + U32 const windowLow = ZSTD_getLowestMatchIndex(ms, curr, cParams->windowLog); + U32 const matchLow = windowLow ? windowLow : 1; + U32* smallerPtr = bt + 2*(curr&btMask); + U32* largerPtr = bt + 2*(curr&btMask) + 1; + U32 matchEndIdx = curr+8+1; /* farthest referenced position of any match => detects repetitive patterns */ + U32 dummy32; /* to be nullified at the end */ + U32 mnum = 0; + U32 nbCompares = 1U << cParams->searchLog; + + const ZSTD_matchState_t* dms = dictMode == ZSTD_dictMatchState ? ms->dictMatchState : NULL; + const ZSTD_compressionParameters* const dmsCParams = + dictMode == ZSTD_dictMatchState ? &dms->cParams : NULL; + const BYTE* const dmsBase = dictMode == ZSTD_dictMatchState ? dms->window.base : NULL; + const BYTE* const dmsEnd = dictMode == ZSTD_dictMatchState ? dms->window.nextSrc : NULL; + U32 const dmsHighLimit = dictMode == ZSTD_dictMatchState ? (U32)(dmsEnd - dmsBase) : 0; + U32 const dmsLowLimit = dictMode == ZSTD_dictMatchState ? dms->window.lowLimit : 0; + U32 const dmsIndexDelta = dictMode == ZSTD_dictMatchState ? windowLow - dmsHighLimit : 0; + U32 const dmsHashLog = dictMode == ZSTD_dictMatchState ? dmsCParams->hashLog : hashLog; + U32 const dmsBtLog = dictMode == ZSTD_dictMatchState ? dmsCParams->chainLog - 1 : btLog; + U32 const dmsBtMask = dictMode == ZSTD_dictMatchState ? (1U << dmsBtLog) - 1 : 0; + U32 const dmsBtLow = dictMode == ZSTD_dictMatchState && dmsBtMask < dmsHighLimit - dmsLowLimit ? dmsHighLimit - dmsBtMask : dmsLowLimit; + + size_t bestLength = lengthToBeat-1; + DEBUGLOG(8, "ZSTD_insertBtAndGetAllMatches: current=%u", curr); + + /* check repCode */ + assert(ll0 <= 1); /* necessarily 1 or 0 */ + { U32 const lastR = ZSTD_REP_NUM + ll0; + U32 repCode; + for (repCode = ll0; repCode < lastR; repCode++) { + U32 const repOffset = (repCode==ZSTD_REP_NUM) ? (rep[0] - 1) : rep[repCode]; + U32 const repIndex = curr - repOffset; + U32 repLen = 0; + assert(curr >= dictLimit); + if (repOffset-1 /* intentional overflow, discards 0 and -1 */ < curr-dictLimit) { /* equivalent to `curr > repIndex >= dictLimit` */ + /* We must validate the repcode offset because when we're using a dictionary the + * valid offset range shrinks when the dictionary goes out of bounds. + */ + if ((repIndex >= windowLow) & (ZSTD_readMINMATCH(ip, minMatch) == ZSTD_readMINMATCH(ip - repOffset, minMatch))) { + repLen = (U32)ZSTD_count(ip+minMatch, ip+minMatch-repOffset, iLimit) + minMatch; + } + } else { /* repIndex < dictLimit || repIndex >= curr */ + const BYTE* const repMatch = dictMode == ZSTD_dictMatchState ? + dmsBase + repIndex - dmsIndexDelta : + dictBase + repIndex; + assert(curr >= windowLow); + if ( dictMode == ZSTD_extDict + && ( ((repOffset-1) /*intentional overflow*/ < curr - windowLow) /* equivalent to `curr > repIndex >= windowLow` */ + & (((U32)((dictLimit-1) - repIndex) >= 3) ) /* intentional overflow : do not test positions overlapping 2 memory segments */) + && (ZSTD_readMINMATCH(ip, minMatch) == ZSTD_readMINMATCH(repMatch, minMatch)) ) { + repLen = (U32)ZSTD_count_2segments(ip+minMatch, repMatch+minMatch, iLimit, dictEnd, prefixStart) + minMatch; + } + if (dictMode == ZSTD_dictMatchState + && ( ((repOffset-1) /*intentional overflow*/ < curr - (dmsLowLimit + dmsIndexDelta)) /* equivalent to `curr > repIndex >= dmsLowLimit` */ + & ((U32)((dictLimit-1) - repIndex) >= 3) ) /* intentional overflow : do not test positions overlapping 2 memory segments */ + && (ZSTD_readMINMATCH(ip, minMatch) == ZSTD_readMINMATCH(repMatch, minMatch)) ) { + repLen = (U32)ZSTD_count_2segments(ip+minMatch, repMatch+minMatch, iLimit, dmsEnd, prefixStart) + minMatch; + } } + /* save longer solution */ + if (repLen > bestLength) { + DEBUGLOG(8, "found repCode %u (ll0:%u, offset:%u) of length %u", + repCode, ll0, repOffset, repLen); + bestLength = repLen; + matches[mnum].off = REPCODE_TO_OFFBASE(repCode - ll0 + 1); /* expect value between 1 and 3 */ + matches[mnum].len = (U32)repLen; + mnum++; + if ( (repLen > sufficient_len) + | (ip+repLen == iLimit) ) { /* best possible */ + return mnum; + } } } } + + /* HC3 match finder */ + if ((mls == 3) /*static*/ && (bestLength < mls)) { + U32 const matchIndex3 = ZSTD_insertAndFindFirstIndexHash3(ms, nextToUpdate3, ip); + if ((matchIndex3 >= matchLow) + & (curr - matchIndex3 < (1<<18)) /*heuristic : longer distance likely too expensive*/ ) { + size_t mlen; + if ((dictMode == ZSTD_noDict) /*static*/ || (dictMode == ZSTD_dictMatchState) /*static*/ || (matchIndex3 >= dictLimit)) { + const BYTE* const match = base + matchIndex3; + mlen = ZSTD_count(ip, match, iLimit); + } else { + const BYTE* const match = dictBase + matchIndex3; + mlen = ZSTD_count_2segments(ip, match, iLimit, dictEnd, prefixStart); + } + + /* save best solution */ + if (mlen >= mls /* == 3 > bestLength */) { + DEBUGLOG(8, "found small match with hlog3, of length %u", + (U32)mlen); + bestLength = mlen; + assert(curr > matchIndex3); + assert(mnum==0); /* no prior solution */ + matches[0].off = OFFSET_TO_OFFBASE(curr - matchIndex3); + matches[0].len = (U32)mlen; + mnum = 1; + if ( (mlen > sufficient_len) | + (ip+mlen == iLimit) ) { /* best possible length */ + ms->nextToUpdate = curr+1; /* skip insertion */ + return 1; + } } } + /* no dictMatchState lookup: dicts don't have a populated HC3 table */ + } /* if (mls == 3) */ + + hashTable[h] = curr; /* Update Hash Table */ + + for (; nbCompares && (matchIndex >= matchLow); --nbCompares) { + U32* const nextPtr = bt + 2*(matchIndex & btMask); + const BYTE* match; + size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ + assert(curr > matchIndex); + + if ((dictMode == ZSTD_noDict) || (dictMode == ZSTD_dictMatchState) || (matchIndex+matchLength >= dictLimit)) { + assert(matchIndex+matchLength >= dictLimit); /* ensure the condition is correct when !extDict */ + match = base + matchIndex; + if (matchIndex >= dictLimit) assert(memcmp(match, ip, matchLength) == 0); /* ensure early section of match is equal as expected */ + matchLength += ZSTD_count(ip+matchLength, match+matchLength, iLimit); + } else { + match = dictBase + matchIndex; + assert(memcmp(match, ip, matchLength) == 0); /* ensure early section of match is equal as expected */ + matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iLimit, dictEnd, prefixStart); + if (matchIndex+matchLength >= dictLimit) + match = base + matchIndex; /* prepare for match[matchLength] read */ + } + + if (matchLength > bestLength) { + DEBUGLOG(8, "found match of length %u at distance %u (offBase=%u)", + (U32)matchLength, curr - matchIndex, OFFSET_TO_OFFBASE(curr - matchIndex)); + assert(matchEndIdx > matchIndex); + if (matchLength > matchEndIdx - matchIndex) + matchEndIdx = matchIndex + (U32)matchLength; + bestLength = matchLength; + matches[mnum].off = OFFSET_TO_OFFBASE(curr - matchIndex); + matches[mnum].len = (U32)matchLength; + mnum++; + if ( (matchLength > ZSTD_OPT_NUM) + | (ip+matchLength == iLimit) /* equal : no way to know if inf or sup */) { + if (dictMode == ZSTD_dictMatchState) nbCompares = 0; /* break should also skip searching dms */ + break; /* drop, to preserve bt consistency (miss a little bit of compression) */ + } } + + if (match[matchLength] < ip[matchLength]) { + /* match smaller than current */ + *smallerPtr = matchIndex; /* update smaller idx */ + commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */ + if (matchIndex <= btLow) { smallerPtr=&dummy32; break; } /* beyond tree size, stop the search */ + smallerPtr = nextPtr+1; /* new candidate => larger than match, which was smaller than current */ + matchIndex = nextPtr[1]; /* new matchIndex, larger than previous, closer to current */ + } else { + *largerPtr = matchIndex; + commonLengthLarger = matchLength; + if (matchIndex <= btLow) { largerPtr=&dummy32; break; } /* beyond tree size, stop the search */ + largerPtr = nextPtr; + matchIndex = nextPtr[0]; + } } + + *smallerPtr = *largerPtr = 0; + + assert(nbCompares <= (1U << ZSTD_SEARCHLOG_MAX)); /* Check we haven't underflowed. */ + if (dictMode == ZSTD_dictMatchState && nbCompares) { + size_t const dmsH = ZSTD_hashPtr(ip, dmsHashLog, mls); + U32 dictMatchIndex = dms->hashTable[dmsH]; + const U32* const dmsBt = dms->chainTable; + commonLengthSmaller = commonLengthLarger = 0; + for (; nbCompares && (dictMatchIndex > dmsLowLimit); --nbCompares) { + const U32* const nextPtr = dmsBt + 2*(dictMatchIndex & dmsBtMask); + size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ + const BYTE* match = dmsBase + dictMatchIndex; + matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iLimit, dmsEnd, prefixStart); + if (dictMatchIndex+matchLength >= dmsHighLimit) + match = base + dictMatchIndex + dmsIndexDelta; /* to prepare for next usage of match[matchLength] */ + + if (matchLength > bestLength) { + matchIndex = dictMatchIndex + dmsIndexDelta; + DEBUGLOG(8, "found dms match of length %u at distance %u (offBase=%u)", + (U32)matchLength, curr - matchIndex, OFFSET_TO_OFFBASE(curr - matchIndex)); + if (matchLength > matchEndIdx - matchIndex) + matchEndIdx = matchIndex + (U32)matchLength; + bestLength = matchLength; + matches[mnum].off = OFFSET_TO_OFFBASE(curr - matchIndex); + matches[mnum].len = (U32)matchLength; + mnum++; + if ( (matchLength > ZSTD_OPT_NUM) + | (ip+matchLength == iLimit) /* equal : no way to know if inf or sup */) { + break; /* drop, to guarantee consistency (miss a little bit of compression) */ + } } + + if (dictMatchIndex <= dmsBtLow) { break; } /* beyond tree size, stop the search */ + if (match[matchLength] < ip[matchLength]) { + commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */ + dictMatchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to current) */ + } else { + /* match is larger than current */ + commonLengthLarger = matchLength; + dictMatchIndex = nextPtr[0]; + } } } /* if (dictMode == ZSTD_dictMatchState) */ + + assert(matchEndIdx > curr+8); + ms->nextToUpdate = matchEndIdx - 8; /* skip repetitive patterns */ + return mnum; +} + +typedef U32 (*ZSTD_getAllMatchesFn)( + ZSTD_match_t*, + ZSTD_matchState_t*, + U32*, + const BYTE*, + const BYTE*, + const U32 rep[ZSTD_REP_NUM], + U32 const ll0, + U32 const lengthToBeat); + +FORCE_INLINE_TEMPLATE U32 ZSTD_btGetAllMatches_internal( + ZSTD_match_t* matches, + ZSTD_matchState_t* ms, + U32* nextToUpdate3, + const BYTE* ip, + const BYTE* const iHighLimit, + const U32 rep[ZSTD_REP_NUM], + U32 const ll0, + U32 const lengthToBeat, + const ZSTD_dictMode_e dictMode, + const U32 mls) +{ + assert(BOUNDED(3, ms->cParams.minMatch, 6) == mls); + DEBUGLOG(8, "ZSTD_BtGetAllMatches(dictMode=%d, mls=%u)", (int)dictMode, mls); + if (ip < ms->window.base + ms->nextToUpdate) + return 0; /* skipped area */ + ZSTD_updateTree_internal(ms, ip, iHighLimit, mls, dictMode); + return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, mls); +} + +#define ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, mls) ZSTD_btGetAllMatches_##dictMode##_##mls + +#define GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, mls) \ + static U32 ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, mls)( \ + ZSTD_match_t* matches, \ + ZSTD_matchState_t* ms, \ + U32* nextToUpdate3, \ + const BYTE* ip, \ + const BYTE* const iHighLimit, \ + const U32 rep[ZSTD_REP_NUM], \ + U32 const ll0, \ + U32 const lengthToBeat) \ + { \ + return ZSTD_btGetAllMatches_internal( \ + matches, ms, nextToUpdate3, ip, iHighLimit, \ + rep, ll0, lengthToBeat, ZSTD_##dictMode, mls); \ + } + +#define GEN_ZSTD_BT_GET_ALL_MATCHES(dictMode) \ + GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, 3) \ + GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, 4) \ + GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, 5) \ + GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, 6) + +GEN_ZSTD_BT_GET_ALL_MATCHES(noDict) +GEN_ZSTD_BT_GET_ALL_MATCHES(extDict) +GEN_ZSTD_BT_GET_ALL_MATCHES(dictMatchState) + +#define ZSTD_BT_GET_ALL_MATCHES_ARRAY(dictMode) \ + { \ + ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, 3), \ + ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, 4), \ + ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, 5), \ + ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, 6) \ + } + +static ZSTD_getAllMatchesFn +ZSTD_selectBtGetAllMatches(ZSTD_matchState_t const* ms, ZSTD_dictMode_e const dictMode) +{ + ZSTD_getAllMatchesFn const getAllMatchesFns[3][4] = { + ZSTD_BT_GET_ALL_MATCHES_ARRAY(noDict), + ZSTD_BT_GET_ALL_MATCHES_ARRAY(extDict), + ZSTD_BT_GET_ALL_MATCHES_ARRAY(dictMatchState) + }; + U32 const mls = BOUNDED(3, ms->cParams.minMatch, 6); + assert((U32)dictMode < 3); + assert(mls - 3 < 4); + return getAllMatchesFns[(int)dictMode][mls - 3]; +} + +/************************* +* LDM helper functions * +*************************/ + +/* Struct containing info needed to make decision about ldm inclusion */ +typedef struct { + rawSeqStore_t seqStore; /* External match candidates store for this block */ + U32 startPosInBlock; /* Start position of the current match candidate */ + U32 endPosInBlock; /* End position of the current match candidate */ + U32 offset; /* Offset of the match candidate */ +} ZSTD_optLdm_t; + +/* ZSTD_optLdm_skipRawSeqStoreBytes(): + * Moves forward in @rawSeqStore by @nbBytes, + * which will update the fields 'pos' and 'posInSequence'. + */ +static void ZSTD_optLdm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t nbBytes) +{ + U32 currPos = (U32)(rawSeqStore->posInSequence + nbBytes); + while (currPos && rawSeqStore->pos < rawSeqStore->size) { + rawSeq currSeq = rawSeqStore->seq[rawSeqStore->pos]; + if (currPos >= currSeq.litLength + currSeq.matchLength) { + currPos -= currSeq.litLength + currSeq.matchLength; + rawSeqStore->pos++; + } else { + rawSeqStore->posInSequence = currPos; + break; + } + } + if (currPos == 0 || rawSeqStore->pos == rawSeqStore->size) { + rawSeqStore->posInSequence = 0; + } +} + +/* ZSTD_opt_getNextMatchAndUpdateSeqStore(): + * Calculates the beginning and end of the next match in the current block. + * Updates 'pos' and 'posInSequence' of the ldmSeqStore. + */ +static void +ZSTD_opt_getNextMatchAndUpdateSeqStore(ZSTD_optLdm_t* optLdm, U32 currPosInBlock, + U32 blockBytesRemaining) +{ + rawSeq currSeq; + U32 currBlockEndPos; + U32 literalsBytesRemaining; + U32 matchBytesRemaining; + + /* Setting match end position to MAX to ensure we never use an LDM during this block */ + if (optLdm->seqStore.size == 0 || optLdm->seqStore.pos >= optLdm->seqStore.size) { + optLdm->startPosInBlock = UINT_MAX; + optLdm->endPosInBlock = UINT_MAX; + return; + } + /* Calculate appropriate bytes left in matchLength and litLength + * after adjusting based on ldmSeqStore->posInSequence */ + currSeq = optLdm->seqStore.seq[optLdm->seqStore.pos]; + assert(optLdm->seqStore.posInSequence <= currSeq.litLength + currSeq.matchLength); + currBlockEndPos = currPosInBlock + blockBytesRemaining; + literalsBytesRemaining = (optLdm->seqStore.posInSequence < currSeq.litLength) ? + currSeq.litLength - (U32)optLdm->seqStore.posInSequence : + 0; + matchBytesRemaining = (literalsBytesRemaining == 0) ? + currSeq.matchLength - ((U32)optLdm->seqStore.posInSequence - currSeq.litLength) : + currSeq.matchLength; + + /* If there are more literal bytes than bytes remaining in block, no ldm is possible */ + if (literalsBytesRemaining >= blockBytesRemaining) { + optLdm->startPosInBlock = UINT_MAX; + optLdm->endPosInBlock = UINT_MAX; + ZSTD_optLdm_skipRawSeqStoreBytes(&optLdm->seqStore, blockBytesRemaining); + return; + } + + /* Matches may be < MINMATCH by this process. In that case, we will reject them + when we are deciding whether or not to add the ldm */ + optLdm->startPosInBlock = currPosInBlock + literalsBytesRemaining; + optLdm->endPosInBlock = optLdm->startPosInBlock + matchBytesRemaining; + optLdm->offset = currSeq.offset; + + if (optLdm->endPosInBlock > currBlockEndPos) { + /* Match ends after the block ends, we can't use the whole match */ + optLdm->endPosInBlock = currBlockEndPos; + ZSTD_optLdm_skipRawSeqStoreBytes(&optLdm->seqStore, currBlockEndPos - currPosInBlock); + } else { + /* Consume nb of bytes equal to size of sequence left */ + ZSTD_optLdm_skipRawSeqStoreBytes(&optLdm->seqStore, literalsBytesRemaining + matchBytesRemaining); + } +} + +/* ZSTD_optLdm_maybeAddMatch(): + * Adds a match if it's long enough, + * based on it's 'matchStartPosInBlock' and 'matchEndPosInBlock', + * into 'matches'. Maintains the correct ordering of 'matches'. + */ +static void ZSTD_optLdm_maybeAddMatch(ZSTD_match_t* matches, U32* nbMatches, + const ZSTD_optLdm_t* optLdm, U32 currPosInBlock) +{ + U32 const posDiff = currPosInBlock - optLdm->startPosInBlock; + /* Note: ZSTD_match_t actually contains offBase and matchLength (before subtracting MINMATCH) */ + U32 const candidateMatchLength = optLdm->endPosInBlock - optLdm->startPosInBlock - posDiff; + + /* Ensure that current block position is not outside of the match */ + if (currPosInBlock < optLdm->startPosInBlock + || currPosInBlock >= optLdm->endPosInBlock + || candidateMatchLength < MINMATCH) { + return; + } + + if (*nbMatches == 0 || ((candidateMatchLength > matches[*nbMatches-1].len) && *nbMatches < ZSTD_OPT_NUM)) { + U32 const candidateOffBase = OFFSET_TO_OFFBASE(optLdm->offset); + DEBUGLOG(6, "ZSTD_optLdm_maybeAddMatch(): Adding ldm candidate match (offBase: %u matchLength %u) at block position=%u", + candidateOffBase, candidateMatchLength, currPosInBlock); + matches[*nbMatches].len = candidateMatchLength; + matches[*nbMatches].off = candidateOffBase; + (*nbMatches)++; + } +} + +/* ZSTD_optLdm_processMatchCandidate(): + * Wrapper function to update ldm seq store and call ldm functions as necessary. + */ +static void +ZSTD_optLdm_processMatchCandidate(ZSTD_optLdm_t* optLdm, + ZSTD_match_t* matches, U32* nbMatches, + U32 currPosInBlock, U32 remainingBytes) +{ + if (optLdm->seqStore.size == 0 || optLdm->seqStore.pos >= optLdm->seqStore.size) { + return; + } + + if (currPosInBlock >= optLdm->endPosInBlock) { + if (currPosInBlock > optLdm->endPosInBlock) { + /* The position at which ZSTD_optLdm_processMatchCandidate() is called is not necessarily + * at the end of a match from the ldm seq store, and will often be some bytes + * over beyond matchEndPosInBlock. As such, we need to correct for these "overshoots" + */ + U32 const posOvershoot = currPosInBlock - optLdm->endPosInBlock; + ZSTD_optLdm_skipRawSeqStoreBytes(&optLdm->seqStore, posOvershoot); + } + ZSTD_opt_getNextMatchAndUpdateSeqStore(optLdm, currPosInBlock, remainingBytes); + } + ZSTD_optLdm_maybeAddMatch(matches, nbMatches, optLdm, currPosInBlock); +} + + +/*-******************************* +* Optimal parser +*********************************/ + +static U32 ZSTD_totalLen(ZSTD_optimal_t sol) +{ + return sol.litlen + sol.mlen; +} + +#if 0 /* debug */ + +static void +listStats(const U32* table, int lastEltID) +{ + int const nbElts = lastEltID + 1; + int enb; + for (enb=0; enb < nbElts; enb++) { + (void)table; + /* RAWLOG(2, "%3i:%3i, ", enb, table[enb]); */ + RAWLOG(2, "%4i,", table[enb]); + } + RAWLOG(2, " \n"); +} + +#endif + +FORCE_INLINE_TEMPLATE size_t +ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, + seqStore_t* seqStore, + U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize, + const int optLevel, + const ZSTD_dictMode_e dictMode) +{ + optState_t* const optStatePtr = &ms->opt; + const BYTE* const istart = (const BYTE*)src; + const BYTE* ip = istart; + const BYTE* anchor = istart; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = iend - 8; + const BYTE* const base = ms->window.base; + const BYTE* const prefixStart = base + ms->window.dictLimit; + const ZSTD_compressionParameters* const cParams = &ms->cParams; + + ZSTD_getAllMatchesFn getAllMatches = ZSTD_selectBtGetAllMatches(ms, dictMode); + + U32 const sufficient_len = MIN(cParams->targetLength, ZSTD_OPT_NUM -1); + U32 const minMatch = (cParams->minMatch == 3) ? 3 : 4; + U32 nextToUpdate3 = ms->nextToUpdate; + + ZSTD_optimal_t* const opt = optStatePtr->priceTable; + ZSTD_match_t* const matches = optStatePtr->matchTable; + ZSTD_optimal_t lastSequence; + ZSTD_optLdm_t optLdm; + + ZSTD_memset(&lastSequence, 0, sizeof(ZSTD_optimal_t)); + + optLdm.seqStore = ms->ldmSeqStore ? *ms->ldmSeqStore : kNullRawSeqStore; + optLdm.endPosInBlock = optLdm.startPosInBlock = optLdm.offset = 0; + ZSTD_opt_getNextMatchAndUpdateSeqStore(&optLdm, (U32)(ip-istart), (U32)(iend-ip)); + + /* init */ + DEBUGLOG(5, "ZSTD_compressBlock_opt_generic: current=%u, prefix=%u, nextToUpdate=%u", + (U32)(ip - base), ms->window.dictLimit, ms->nextToUpdate); + assert(optLevel <= 2); + ZSTD_rescaleFreqs(optStatePtr, (const BYTE*)src, srcSize, optLevel); + ip += (ip==prefixStart); + + /* Match Loop */ + while (ip < ilimit) { + U32 cur, last_pos = 0; + + /* find first match */ + { U32 const litlen = (U32)(ip - anchor); + U32 const ll0 = !litlen; + U32 nbMatches = getAllMatches(matches, ms, &nextToUpdate3, ip, iend, rep, ll0, minMatch); + ZSTD_optLdm_processMatchCandidate(&optLdm, matches, &nbMatches, + (U32)(ip-istart), (U32)(iend - ip)); + if (!nbMatches) { ip++; continue; } + + /* initialize opt[0] */ + { U32 i ; for (i=0; i immediate encoding */ + { U32 const maxML = matches[nbMatches-1].len; + U32 const maxOffBase = matches[nbMatches-1].off; + DEBUGLOG(6, "found %u matches of maxLength=%u and maxOffBase=%u at cPos=%u => start new series", + nbMatches, maxML, maxOffBase, (U32)(ip-prefixStart)); + + if (maxML > sufficient_len) { + lastSequence.litlen = litlen; + lastSequence.mlen = maxML; + lastSequence.off = maxOffBase; + DEBUGLOG(6, "large match (%u>%u), immediate encoding", + maxML, sufficient_len); + cur = 0; + last_pos = ZSTD_totalLen(lastSequence); + goto _shortestPath; + } } + + /* set prices for first matches starting position == 0 */ + assert(opt[0].price >= 0); + { U32 const literalsPrice = (U32)opt[0].price + ZSTD_litLengthPrice(0, optStatePtr, optLevel); + U32 pos; + U32 matchNb; + for (pos = 1; pos < minMatch; pos++) { + opt[pos].price = ZSTD_MAX_PRICE; /* mlen, litlen and price will be fixed during forward scanning */ + } + for (matchNb = 0; matchNb < nbMatches; matchNb++) { + U32 const offBase = matches[matchNb].off; + U32 const end = matches[matchNb].len; + for ( ; pos <= end ; pos++ ) { + U32 const matchPrice = ZSTD_getMatchPrice(offBase, pos, optStatePtr, optLevel); + U32 const sequencePrice = literalsPrice + matchPrice; + DEBUGLOG(7, "rPos:%u => set initial price : %.2f", + pos, ZSTD_fCost((int)sequencePrice)); + opt[pos].mlen = pos; + opt[pos].off = offBase; + opt[pos].litlen = litlen; + opt[pos].price = (int)sequencePrice; + } } + last_pos = pos-1; + } + } + + /* check further positions */ + for (cur = 1; cur <= last_pos; cur++) { + const BYTE* const inr = ip + cur; + assert(cur < ZSTD_OPT_NUM); + DEBUGLOG(7, "cPos:%zi==rPos:%u", inr-istart, cur) + + /* Fix current position with one literal if cheaper */ + { U32 const litlen = (opt[cur-1].mlen == 0) ? opt[cur-1].litlen + 1 : 1; + int const price = opt[cur-1].price + + (int)ZSTD_rawLiteralsCost(ip+cur-1, 1, optStatePtr, optLevel) + + (int)ZSTD_litLengthPrice(litlen, optStatePtr, optLevel) + - (int)ZSTD_litLengthPrice(litlen-1, optStatePtr, optLevel); + assert(price < 1000000000); /* overflow check */ + if (price <= opt[cur].price) { + DEBUGLOG(7, "cPos:%zi==rPos:%u : better price (%.2f<=%.2f) using literal (ll==%u) (hist:%u,%u,%u)", + inr-istart, cur, ZSTD_fCost(price), ZSTD_fCost(opt[cur].price), litlen, + opt[cur-1].rep[0], opt[cur-1].rep[1], opt[cur-1].rep[2]); + opt[cur].mlen = 0; + opt[cur].off = 0; + opt[cur].litlen = litlen; + opt[cur].price = price; + } else { + DEBUGLOG(7, "cPos:%zi==rPos:%u : literal would cost more (%.2f>%.2f) (hist:%u,%u,%u)", + inr-istart, cur, ZSTD_fCost(price), ZSTD_fCost(opt[cur].price), + opt[cur].rep[0], opt[cur].rep[1], opt[cur].rep[2]); + } + } + + /* Set the repcodes of the current position. We must do it here + * because we rely on the repcodes of the 2nd to last sequence being + * correct to set the next chunks repcodes during the backward + * traversal. + */ + ZSTD_STATIC_ASSERT(sizeof(opt[cur].rep) == sizeof(repcodes_t)); + assert(cur >= opt[cur].mlen); + if (opt[cur].mlen != 0) { + U32 const prev = cur - opt[cur].mlen; + repcodes_t const newReps = ZSTD_newRep(opt[prev].rep, opt[cur].off, opt[cur].litlen==0); + ZSTD_memcpy(opt[cur].rep, &newReps, sizeof(repcodes_t)); + } else { + ZSTD_memcpy(opt[cur].rep, opt[cur - 1].rep, sizeof(repcodes_t)); + } + + /* last match must start at a minimum distance of 8 from oend */ + if (inr > ilimit) continue; + + if (cur == last_pos) break; + + if ( (optLevel==0) /*static_test*/ + && (opt[cur+1].price <= opt[cur].price + (BITCOST_MULTIPLIER/2)) ) { + DEBUGLOG(7, "move to next rPos:%u : price is <=", cur+1); + continue; /* skip unpromising positions; about ~+6% speed, -0.01 ratio */ + } + + assert(opt[cur].price >= 0); + { U32 const ll0 = (opt[cur].mlen != 0); + U32 const litlen = (opt[cur].mlen == 0) ? opt[cur].litlen : 0; + U32 const previousPrice = (U32)opt[cur].price; + U32 const basePrice = previousPrice + ZSTD_litLengthPrice(0, optStatePtr, optLevel); + U32 nbMatches = getAllMatches(matches, ms, &nextToUpdate3, inr, iend, opt[cur].rep, ll0, minMatch); + U32 matchNb; + + ZSTD_optLdm_processMatchCandidate(&optLdm, matches, &nbMatches, + (U32)(inr-istart), (U32)(iend-inr)); + + if (!nbMatches) { + DEBUGLOG(7, "rPos:%u : no match found", cur); + continue; + } + + { U32 const maxML = matches[nbMatches-1].len; + DEBUGLOG(7, "cPos:%zi==rPos:%u, found %u matches, of maxLength=%u", + inr-istart, cur, nbMatches, maxML); + + if ( (maxML > sufficient_len) + || (cur + maxML >= ZSTD_OPT_NUM) ) { + lastSequence.mlen = maxML; + lastSequence.off = matches[nbMatches-1].off; + lastSequence.litlen = litlen; + cur -= (opt[cur].mlen==0) ? opt[cur].litlen : 0; /* last sequence is actually only literals, fix cur to last match - note : may underflow, in which case, it's first sequence, and it's okay */ + last_pos = cur + ZSTD_totalLen(lastSequence); + if (cur > ZSTD_OPT_NUM) cur = 0; /* underflow => first match */ + goto _shortestPath; + } } + + /* set prices using matches found at position == cur */ + for (matchNb = 0; matchNb < nbMatches; matchNb++) { + U32 const offset = matches[matchNb].off; + U32 const lastML = matches[matchNb].len; + U32 const startML = (matchNb>0) ? matches[matchNb-1].len+1 : minMatch; + U32 mlen; + + DEBUGLOG(7, "testing match %u => offBase=%4u, mlen=%2u, llen=%2u", + matchNb, matches[matchNb].off, lastML, litlen); + + for (mlen = lastML; mlen >= startML; mlen--) { /* scan downward */ + U32 const pos = cur + mlen; + int const price = (int)basePrice + (int)ZSTD_getMatchPrice(offset, mlen, optStatePtr, optLevel); + + if ((pos > last_pos) || (price < opt[pos].price)) { + DEBUGLOG(7, "rPos:%u (ml=%2u) => new better price (%.2f<%.2f)", + pos, mlen, ZSTD_fCost(price), ZSTD_fCost(opt[pos].price)); + while (last_pos < pos) { opt[last_pos+1].price = ZSTD_MAX_PRICE; last_pos++; } /* fill empty positions */ + opt[pos].mlen = mlen; + opt[pos].off = offset; + opt[pos].litlen = litlen; + opt[pos].price = price; + } else { + DEBUGLOG(7, "rPos:%u (ml=%2u) => new price is worse (%.2f>=%.2f)", + pos, mlen, ZSTD_fCost(price), ZSTD_fCost(opt[pos].price)); + if (optLevel==0) break; /* early update abort; gets ~+10% speed for about -0.01 ratio loss */ + } + } } } + } /* for (cur = 1; cur <= last_pos; cur++) */ + + lastSequence = opt[last_pos]; + cur = last_pos > ZSTD_totalLen(lastSequence) ? last_pos - ZSTD_totalLen(lastSequence) : 0; /* single sequence, and it starts before `ip` */ + assert(cur < ZSTD_OPT_NUM); /* control overflow*/ + +_shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */ + assert(opt[0].mlen == 0); + + /* Set the next chunk's repcodes based on the repcodes of the beginning + * of the last match, and the last sequence. This avoids us having to + * update them while traversing the sequences. + */ + if (lastSequence.mlen != 0) { + repcodes_t const reps = ZSTD_newRep(opt[cur].rep, lastSequence.off, lastSequence.litlen==0); + ZSTD_memcpy(rep, &reps, sizeof(reps)); + } else { + ZSTD_memcpy(rep, opt[cur].rep, sizeof(repcodes_t)); + } + + { U32 const storeEnd = cur + 1; + U32 storeStart = storeEnd; + U32 seqPos = cur; + + DEBUGLOG(6, "start reverse traversal (last_pos:%u, cur:%u)", + last_pos, cur); (void)last_pos; + assert(storeEnd < ZSTD_OPT_NUM); + DEBUGLOG(6, "last sequence copied into pos=%u (llen=%u,mlen=%u,ofc=%u)", + storeEnd, lastSequence.litlen, lastSequence.mlen, lastSequence.off); + opt[storeEnd] = lastSequence; + while (seqPos > 0) { + U32 const backDist = ZSTD_totalLen(opt[seqPos]); + storeStart--; + DEBUGLOG(6, "sequence from rPos=%u copied into pos=%u (llen=%u,mlen=%u,ofc=%u)", + seqPos, storeStart, opt[seqPos].litlen, opt[seqPos].mlen, opt[seqPos].off); + opt[storeStart] = opt[seqPos]; + seqPos = (seqPos > backDist) ? seqPos - backDist : 0; + } + + /* save sequences */ + DEBUGLOG(6, "sending selected sequences into seqStore") + { U32 storePos; + for (storePos=storeStart; storePos <= storeEnd; storePos++) { + U32 const llen = opt[storePos].litlen; + U32 const mlen = opt[storePos].mlen; + U32 const offBase = opt[storePos].off; + U32 const advance = llen + mlen; + DEBUGLOG(6, "considering seq starting at %zi, llen=%u, mlen=%u", + anchor - istart, (unsigned)llen, (unsigned)mlen); + + if (mlen==0) { /* only literals => must be last "sequence", actually starting a new stream of sequences */ + assert(storePos == storeEnd); /* must be last sequence */ + ip = anchor + llen; /* last "sequence" is a bunch of literals => don't progress anchor */ + continue; /* will finish */ + } + + assert(anchor + llen <= iend); + ZSTD_updateStats(optStatePtr, llen, anchor, offBase, mlen); + ZSTD_storeSeq(seqStore, llen, anchor, iend, offBase, mlen); + anchor += advance; + ip = anchor; + } } + ZSTD_setBasePrices(optStatePtr, optLevel); + } + } /* while (ip < ilimit) */ + + /* Return the last literals size */ + return (size_t)(iend - anchor); +} + +static size_t ZSTD_compressBlock_opt0( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize, const ZSTD_dictMode_e dictMode) +{ + return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 0 /* optLevel */, dictMode); +} + +static size_t ZSTD_compressBlock_opt2( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize, const ZSTD_dictMode_e dictMode) +{ + return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /* optLevel */, dictMode); +} + +size_t ZSTD_compressBlock_btopt( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize) +{ + DEBUGLOG(5, "ZSTD_compressBlock_btopt"); + return ZSTD_compressBlock_opt0(ms, seqStore, rep, src, srcSize, ZSTD_noDict); +} + + + + +/* ZSTD_initStats_ultra(): + * make a first compression pass, just to seed stats with more accurate starting values. + * only works on first block, with no dictionary and no ldm. + * this function cannot error out, its narrow contract must be respected. + */ +static void +ZSTD_initStats_ultra(ZSTD_matchState_t* ms, + seqStore_t* seqStore, + U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize) +{ + U32 tmpRep[ZSTD_REP_NUM]; /* updated rep codes will sink here */ + ZSTD_memcpy(tmpRep, rep, sizeof(tmpRep)); + + DEBUGLOG(4, "ZSTD_initStats_ultra (srcSize=%zu)", srcSize); + assert(ms->opt.litLengthSum == 0); /* first block */ + assert(seqStore->sequences == seqStore->sequencesStart); /* no ldm */ + assert(ms->window.dictLimit == ms->window.lowLimit); /* no dictionary */ + assert(ms->window.dictLimit - ms->nextToUpdate <= 1); /* no prefix (note: intentional overflow, defined as 2-complement) */ + + ZSTD_compressBlock_opt2(ms, seqStore, tmpRep, src, srcSize, ZSTD_noDict); /* generate stats into ms->opt*/ + + /* invalidate first scan from history, only keep entropy stats */ + ZSTD_resetSeqStore(seqStore); + ms->window.base -= srcSize; + ms->window.dictLimit += (U32)srcSize; + ms->window.lowLimit = ms->window.dictLimit; + ms->nextToUpdate = ms->window.dictLimit; + +} + +size_t ZSTD_compressBlock_btultra( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize) +{ + DEBUGLOG(5, "ZSTD_compressBlock_btultra (srcSize=%zu)", srcSize); + return ZSTD_compressBlock_opt2(ms, seqStore, rep, src, srcSize, ZSTD_noDict); +} + +size_t ZSTD_compressBlock_btultra2( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize) +{ + U32 const curr = (U32)((const BYTE*)src - ms->window.base); + DEBUGLOG(5, "ZSTD_compressBlock_btultra2 (srcSize=%zu)", srcSize); + + /* 2-passes strategy: + * this strategy makes a first pass over first block to collect statistics + * in order to seed next round's statistics with it. + * After 1st pass, function forgets history, and starts a new block. + * Consequently, this can only work if no data has been previously loaded in tables, + * aka, no dictionary, no prefix, no ldm preprocessing. + * The compression ratio gain is generally small (~0.5% on first block), + ** the cost is 2x cpu time on first block. */ + assert(srcSize <= ZSTD_BLOCKSIZE_MAX); + if ( (ms->opt.litLengthSum==0) /* first block */ + && (seqStore->sequences == seqStore->sequencesStart) /* no ldm */ + && (ms->window.dictLimit == ms->window.lowLimit) /* no dictionary */ + && (curr == ms->window.dictLimit) /* start of frame, nothing already loaded nor skipped */ + && (srcSize > ZSTD_PREDEF_THRESHOLD) /* input large enough to not employ default stats */ + ) { + ZSTD_initStats_ultra(ms, seqStore, rep, src, srcSize); + } + + return ZSTD_compressBlock_opt2(ms, seqStore, rep, src, srcSize, ZSTD_noDict); +} + +size_t ZSTD_compressBlock_btopt_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize) +{ + return ZSTD_compressBlock_opt0(ms, seqStore, rep, src, srcSize, ZSTD_dictMatchState); +} + +size_t ZSTD_compressBlock_btultra_dictMatchState( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize) +{ + return ZSTD_compressBlock_opt2(ms, seqStore, rep, src, srcSize, ZSTD_dictMatchState); +} + +size_t ZSTD_compressBlock_btopt_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize) +{ + return ZSTD_compressBlock_opt0(ms, seqStore, rep, src, srcSize, ZSTD_extDict); +} + +size_t ZSTD_compressBlock_btultra_extDict( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize) +{ + return ZSTD_compressBlock_opt2(ms, seqStore, rep, src, srcSize, ZSTD_extDict); +} + +/* note : no btultra2 variant for extDict nor dictMatchState, + * because btultra2 is not meant to work with dictionaries + * and is only specific for the first block (no prefix) */ +/**** ended inlining compress/zstd_opt.c ****/ +#ifdef ZSTD_MULTITHREAD +/**** start inlining compress/zstdmt_compress.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + +/* ====== Compiler specifics ====== */ +#if defined(_MSC_VER) +# pragma warning(disable : 4204) /* disable: C4204: non-constant aggregate initializer */ +#endif + + +/* ====== Constants ====== */ +#define ZSTDMT_OVERLAPLOG_DEFAULT 0 + + +/* ====== Dependencies ====== */ +/**** skipping file: ../common/allocations.h ****/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: ../common/pool.h ****/ +/**** skipping file: ../common/threading.h ****/ +/**** skipping file: zstd_compress_internal.h ****/ +/**** skipping file: zstd_ldm.h ****/ +/**** skipping file: zstdmt_compress.h ****/ + +/* Guards code to support resizing the SeqPool. + * We will want to resize the SeqPool to save memory in the future. + * Until then, comment the code out since it is unused. + */ +#define ZSTD_RESIZE_SEQPOOL 0 + +/* ====== Debug ====== */ +#if defined(DEBUGLEVEL) && (DEBUGLEVEL>=2) \ + && !defined(_MSC_VER) \ + && !defined(__MINGW32__) + +# include +# include +# include + +# define DEBUG_PRINTHEX(l,p,n) { \ + unsigned debug_u; \ + for (debug_u=0; debug_u<(n); debug_u++) \ + RAWLOG(l, "%02X ", ((const unsigned char*)(p))[debug_u]); \ + RAWLOG(l, " \n"); \ +} + +static unsigned long long GetCurrentClockTimeMicroseconds(void) +{ + static clock_t _ticksPerSecond = 0; + if (_ticksPerSecond <= 0) _ticksPerSecond = sysconf(_SC_CLK_TCK); + + { struct tms junk; clock_t newTicks = (clock_t) times(&junk); + return ((((unsigned long long)newTicks)*(1000000))/_ticksPerSecond); +} } + +#define MUTEX_WAIT_TIME_DLEVEL 6 +#define ZSTD_PTHREAD_MUTEX_LOCK(mutex) { \ + if (DEBUGLEVEL >= MUTEX_WAIT_TIME_DLEVEL) { \ + unsigned long long const beforeTime = GetCurrentClockTimeMicroseconds(); \ + ZSTD_pthread_mutex_lock(mutex); \ + { unsigned long long const afterTime = GetCurrentClockTimeMicroseconds(); \ + unsigned long long const elapsedTime = (afterTime-beforeTime); \ + if (elapsedTime > 1000) { /* or whatever threshold you like; I'm using 1 millisecond here */ \ + DEBUGLOG(MUTEX_WAIT_TIME_DLEVEL, "Thread took %llu microseconds to acquire mutex %s \n", \ + elapsedTime, #mutex); \ + } } \ + } else { \ + ZSTD_pthread_mutex_lock(mutex); \ + } \ +} + +#else + +# define ZSTD_PTHREAD_MUTEX_LOCK(m) ZSTD_pthread_mutex_lock(m) +# define DEBUG_PRINTHEX(l,p,n) {} + +#endif + + +/* ===== Buffer Pool ===== */ +/* a single Buffer Pool can be invoked from multiple threads in parallel */ + +typedef struct buffer_s { + void* start; + size_t capacity; +} buffer_t; + +static const buffer_t g_nullBuffer = { NULL, 0 }; + +typedef struct ZSTDMT_bufferPool_s { + ZSTD_pthread_mutex_t poolMutex; + size_t bufferSize; + unsigned totalBuffers; + unsigned nbBuffers; + ZSTD_customMem cMem; + buffer_t bTable[1]; /* variable size */ +} ZSTDMT_bufferPool; + +static ZSTDMT_bufferPool* ZSTDMT_createBufferPool(unsigned maxNbBuffers, ZSTD_customMem cMem) +{ + ZSTDMT_bufferPool* const bufPool = (ZSTDMT_bufferPool*)ZSTD_customCalloc( + sizeof(ZSTDMT_bufferPool) + (maxNbBuffers-1) * sizeof(buffer_t), cMem); + if (bufPool==NULL) return NULL; + if (ZSTD_pthread_mutex_init(&bufPool->poolMutex, NULL)) { + ZSTD_customFree(bufPool, cMem); + return NULL; + } + bufPool->bufferSize = 64 KB; + bufPool->totalBuffers = maxNbBuffers; + bufPool->nbBuffers = 0; + bufPool->cMem = cMem; + return bufPool; +} + +static void ZSTDMT_freeBufferPool(ZSTDMT_bufferPool* bufPool) +{ + unsigned u; + DEBUGLOG(3, "ZSTDMT_freeBufferPool (address:%08X)", (U32)(size_t)bufPool); + if (!bufPool) return; /* compatibility with free on NULL */ + for (u=0; utotalBuffers; u++) { + DEBUGLOG(4, "free buffer %2u (address:%08X)", u, (U32)(size_t)bufPool->bTable[u].start); + ZSTD_customFree(bufPool->bTable[u].start, bufPool->cMem); + } + ZSTD_pthread_mutex_destroy(&bufPool->poolMutex); + ZSTD_customFree(bufPool, bufPool->cMem); +} + +/* only works at initialization, not during compression */ +static size_t ZSTDMT_sizeof_bufferPool(ZSTDMT_bufferPool* bufPool) +{ + size_t const poolSize = sizeof(*bufPool) + + (bufPool->totalBuffers - 1) * sizeof(buffer_t); + unsigned u; + size_t totalBufferSize = 0; + ZSTD_pthread_mutex_lock(&bufPool->poolMutex); + for (u=0; utotalBuffers; u++) + totalBufferSize += bufPool->bTable[u].capacity; + ZSTD_pthread_mutex_unlock(&bufPool->poolMutex); + + return poolSize + totalBufferSize; +} + +/* ZSTDMT_setBufferSize() : + * all future buffers provided by this buffer pool will have _at least_ this size + * note : it's better for all buffers to have same size, + * as they become freely interchangeable, reducing malloc/free usages and memory fragmentation */ +static void ZSTDMT_setBufferSize(ZSTDMT_bufferPool* const bufPool, size_t const bSize) +{ + ZSTD_pthread_mutex_lock(&bufPool->poolMutex); + DEBUGLOG(4, "ZSTDMT_setBufferSize: bSize = %u", (U32)bSize); + bufPool->bufferSize = bSize; + ZSTD_pthread_mutex_unlock(&bufPool->poolMutex); +} + + +static ZSTDMT_bufferPool* ZSTDMT_expandBufferPool(ZSTDMT_bufferPool* srcBufPool, unsigned maxNbBuffers) +{ + if (srcBufPool==NULL) return NULL; + if (srcBufPool->totalBuffers >= maxNbBuffers) /* good enough */ + return srcBufPool; + /* need a larger buffer pool */ + { ZSTD_customMem const cMem = srcBufPool->cMem; + size_t const bSize = srcBufPool->bufferSize; /* forward parameters */ + ZSTDMT_bufferPool* newBufPool; + ZSTDMT_freeBufferPool(srcBufPool); + newBufPool = ZSTDMT_createBufferPool(maxNbBuffers, cMem); + if (newBufPool==NULL) return newBufPool; + ZSTDMT_setBufferSize(newBufPool, bSize); + return newBufPool; + } +} + +/** ZSTDMT_getBuffer() : + * assumption : bufPool must be valid + * @return : a buffer, with start pointer and size + * note: allocation may fail, in this case, start==NULL and size==0 */ +static buffer_t ZSTDMT_getBuffer(ZSTDMT_bufferPool* bufPool) +{ + size_t const bSize = bufPool->bufferSize; + DEBUGLOG(5, "ZSTDMT_getBuffer: bSize = %u", (U32)bufPool->bufferSize); + ZSTD_pthread_mutex_lock(&bufPool->poolMutex); + if (bufPool->nbBuffers) { /* try to use an existing buffer */ + buffer_t const buf = bufPool->bTable[--(bufPool->nbBuffers)]; + size_t const availBufferSize = buf.capacity; + bufPool->bTable[bufPool->nbBuffers] = g_nullBuffer; + if ((availBufferSize >= bSize) & ((availBufferSize>>3) <= bSize)) { + /* large enough, but not too much */ + DEBUGLOG(5, "ZSTDMT_getBuffer: provide buffer %u of size %u", + bufPool->nbBuffers, (U32)buf.capacity); + ZSTD_pthread_mutex_unlock(&bufPool->poolMutex); + return buf; + } + /* size conditions not respected : scratch this buffer, create new one */ + DEBUGLOG(5, "ZSTDMT_getBuffer: existing buffer does not meet size conditions => freeing"); + ZSTD_customFree(buf.start, bufPool->cMem); + } + ZSTD_pthread_mutex_unlock(&bufPool->poolMutex); + /* create new buffer */ + DEBUGLOG(5, "ZSTDMT_getBuffer: create a new buffer"); + { buffer_t buffer; + void* const start = ZSTD_customMalloc(bSize, bufPool->cMem); + buffer.start = start; /* note : start can be NULL if malloc fails ! */ + buffer.capacity = (start==NULL) ? 0 : bSize; + if (start==NULL) { + DEBUGLOG(5, "ZSTDMT_getBuffer: buffer allocation failure !!"); + } else { + DEBUGLOG(5, "ZSTDMT_getBuffer: created buffer of size %u", (U32)bSize); + } + return buffer; + } +} + +#if ZSTD_RESIZE_SEQPOOL +/** ZSTDMT_resizeBuffer() : + * assumption : bufPool must be valid + * @return : a buffer that is at least the buffer pool buffer size. + * If a reallocation happens, the data in the input buffer is copied. + */ +static buffer_t ZSTDMT_resizeBuffer(ZSTDMT_bufferPool* bufPool, buffer_t buffer) +{ + size_t const bSize = bufPool->bufferSize; + if (buffer.capacity < bSize) { + void* const start = ZSTD_customMalloc(bSize, bufPool->cMem); + buffer_t newBuffer; + newBuffer.start = start; + newBuffer.capacity = start == NULL ? 0 : bSize; + if (start != NULL) { + assert(newBuffer.capacity >= buffer.capacity); + ZSTD_memcpy(newBuffer.start, buffer.start, buffer.capacity); + DEBUGLOG(5, "ZSTDMT_resizeBuffer: created buffer of size %u", (U32)bSize); + return newBuffer; + } + DEBUGLOG(5, "ZSTDMT_resizeBuffer: buffer allocation failure !!"); + } + return buffer; +} +#endif + +/* store buffer for later re-use, up to pool capacity */ +static void ZSTDMT_releaseBuffer(ZSTDMT_bufferPool* bufPool, buffer_t buf) +{ + DEBUGLOG(5, "ZSTDMT_releaseBuffer"); + if (buf.start == NULL) return; /* compatible with release on NULL */ + ZSTD_pthread_mutex_lock(&bufPool->poolMutex); + if (bufPool->nbBuffers < bufPool->totalBuffers) { + bufPool->bTable[bufPool->nbBuffers++] = buf; /* stored for later use */ + DEBUGLOG(5, "ZSTDMT_releaseBuffer: stored buffer of size %u in slot %u", + (U32)buf.capacity, (U32)(bufPool->nbBuffers-1)); + ZSTD_pthread_mutex_unlock(&bufPool->poolMutex); + return; + } + ZSTD_pthread_mutex_unlock(&bufPool->poolMutex); + /* Reached bufferPool capacity (should not happen) */ + DEBUGLOG(5, "ZSTDMT_releaseBuffer: pool capacity reached => freeing "); + ZSTD_customFree(buf.start, bufPool->cMem); +} + +/* We need 2 output buffers per worker since each dstBuff must be flushed after it is released. + * The 3 additional buffers are as follows: + * 1 buffer for input loading + * 1 buffer for "next input" when submitting current one + * 1 buffer stuck in queue */ +#define BUF_POOL_MAX_NB_BUFFERS(nbWorkers) (2*(nbWorkers) + 3) + +/* After a worker releases its rawSeqStore, it is immediately ready for reuse. + * So we only need one seq buffer per worker. */ +#define SEQ_POOL_MAX_NB_BUFFERS(nbWorkers) (nbWorkers) + +/* ===== Seq Pool Wrapper ====== */ + +typedef ZSTDMT_bufferPool ZSTDMT_seqPool; + +static size_t ZSTDMT_sizeof_seqPool(ZSTDMT_seqPool* seqPool) +{ + return ZSTDMT_sizeof_bufferPool(seqPool); +} + +static rawSeqStore_t bufferToSeq(buffer_t buffer) +{ + rawSeqStore_t seq = kNullRawSeqStore; + seq.seq = (rawSeq*)buffer.start; + seq.capacity = buffer.capacity / sizeof(rawSeq); + return seq; +} + +static buffer_t seqToBuffer(rawSeqStore_t seq) +{ + buffer_t buffer; + buffer.start = seq.seq; + buffer.capacity = seq.capacity * sizeof(rawSeq); + return buffer; +} + +static rawSeqStore_t ZSTDMT_getSeq(ZSTDMT_seqPool* seqPool) +{ + if (seqPool->bufferSize == 0) { + return kNullRawSeqStore; + } + return bufferToSeq(ZSTDMT_getBuffer(seqPool)); +} + +#if ZSTD_RESIZE_SEQPOOL +static rawSeqStore_t ZSTDMT_resizeSeq(ZSTDMT_seqPool* seqPool, rawSeqStore_t seq) +{ + return bufferToSeq(ZSTDMT_resizeBuffer(seqPool, seqToBuffer(seq))); +} +#endif + +static void ZSTDMT_releaseSeq(ZSTDMT_seqPool* seqPool, rawSeqStore_t seq) +{ + ZSTDMT_releaseBuffer(seqPool, seqToBuffer(seq)); +} + +static void ZSTDMT_setNbSeq(ZSTDMT_seqPool* const seqPool, size_t const nbSeq) +{ + ZSTDMT_setBufferSize(seqPool, nbSeq * sizeof(rawSeq)); +} + +static ZSTDMT_seqPool* ZSTDMT_createSeqPool(unsigned nbWorkers, ZSTD_customMem cMem) +{ + ZSTDMT_seqPool* const seqPool = ZSTDMT_createBufferPool(SEQ_POOL_MAX_NB_BUFFERS(nbWorkers), cMem); + if (seqPool == NULL) return NULL; + ZSTDMT_setNbSeq(seqPool, 0); + return seqPool; +} + +static void ZSTDMT_freeSeqPool(ZSTDMT_seqPool* seqPool) +{ + ZSTDMT_freeBufferPool(seqPool); +} + +static ZSTDMT_seqPool* ZSTDMT_expandSeqPool(ZSTDMT_seqPool* pool, U32 nbWorkers) +{ + return ZSTDMT_expandBufferPool(pool, SEQ_POOL_MAX_NB_BUFFERS(nbWorkers)); +} + + +/* ===== CCtx Pool ===== */ +/* a single CCtx Pool can be invoked from multiple threads in parallel */ + +typedef struct { + ZSTD_pthread_mutex_t poolMutex; + int totalCCtx; + int availCCtx; + ZSTD_customMem cMem; + ZSTD_CCtx* cctx[1]; /* variable size */ +} ZSTDMT_CCtxPool; + +/* note : all CCtx borrowed from the pool should be released back to the pool _before_ freeing the pool */ +static void ZSTDMT_freeCCtxPool(ZSTDMT_CCtxPool* pool) +{ + int cid; + for (cid=0; cidtotalCCtx; cid++) + ZSTD_freeCCtx(pool->cctx[cid]); /* note : compatible with free on NULL */ + ZSTD_pthread_mutex_destroy(&pool->poolMutex); + ZSTD_customFree(pool, pool->cMem); +} + +/* ZSTDMT_createCCtxPool() : + * implies nbWorkers >= 1 , checked by caller ZSTDMT_createCCtx() */ +static ZSTDMT_CCtxPool* ZSTDMT_createCCtxPool(int nbWorkers, + ZSTD_customMem cMem) +{ + ZSTDMT_CCtxPool* const cctxPool = (ZSTDMT_CCtxPool*) ZSTD_customCalloc( + sizeof(ZSTDMT_CCtxPool) + (nbWorkers-1)*sizeof(ZSTD_CCtx*), cMem); + assert(nbWorkers > 0); + if (!cctxPool) return NULL; + if (ZSTD_pthread_mutex_init(&cctxPool->poolMutex, NULL)) { + ZSTD_customFree(cctxPool, cMem); + return NULL; + } + cctxPool->cMem = cMem; + cctxPool->totalCCtx = nbWorkers; + cctxPool->availCCtx = 1; /* at least one cctx for single-thread mode */ + cctxPool->cctx[0] = ZSTD_createCCtx_advanced(cMem); + if (!cctxPool->cctx[0]) { ZSTDMT_freeCCtxPool(cctxPool); return NULL; } + DEBUGLOG(3, "cctxPool created, with %u workers", nbWorkers); + return cctxPool; +} + +static ZSTDMT_CCtxPool* ZSTDMT_expandCCtxPool(ZSTDMT_CCtxPool* srcPool, + int nbWorkers) +{ + if (srcPool==NULL) return NULL; + if (nbWorkers <= srcPool->totalCCtx) return srcPool; /* good enough */ + /* need a larger cctx pool */ + { ZSTD_customMem const cMem = srcPool->cMem; + ZSTDMT_freeCCtxPool(srcPool); + return ZSTDMT_createCCtxPool(nbWorkers, cMem); + } +} + +/* only works during initialization phase, not during compression */ +static size_t ZSTDMT_sizeof_CCtxPool(ZSTDMT_CCtxPool* cctxPool) +{ + ZSTD_pthread_mutex_lock(&cctxPool->poolMutex); + { unsigned const nbWorkers = cctxPool->totalCCtx; + size_t const poolSize = sizeof(*cctxPool) + + (nbWorkers-1) * sizeof(ZSTD_CCtx*); + unsigned u; + size_t totalCCtxSize = 0; + for (u=0; ucctx[u]); + } + ZSTD_pthread_mutex_unlock(&cctxPool->poolMutex); + assert(nbWorkers > 0); + return poolSize + totalCCtxSize; + } +} + +static ZSTD_CCtx* ZSTDMT_getCCtx(ZSTDMT_CCtxPool* cctxPool) +{ + DEBUGLOG(5, "ZSTDMT_getCCtx"); + ZSTD_pthread_mutex_lock(&cctxPool->poolMutex); + if (cctxPool->availCCtx) { + cctxPool->availCCtx--; + { ZSTD_CCtx* const cctx = cctxPool->cctx[cctxPool->availCCtx]; + ZSTD_pthread_mutex_unlock(&cctxPool->poolMutex); + return cctx; + } } + ZSTD_pthread_mutex_unlock(&cctxPool->poolMutex); + DEBUGLOG(5, "create one more CCtx"); + return ZSTD_createCCtx_advanced(cctxPool->cMem); /* note : can be NULL, when creation fails ! */ +} + +static void ZSTDMT_releaseCCtx(ZSTDMT_CCtxPool* pool, ZSTD_CCtx* cctx) +{ + if (cctx==NULL) return; /* compatibility with release on NULL */ + ZSTD_pthread_mutex_lock(&pool->poolMutex); + if (pool->availCCtx < pool->totalCCtx) + pool->cctx[pool->availCCtx++] = cctx; + else { + /* pool overflow : should not happen, since totalCCtx==nbWorkers */ + DEBUGLOG(4, "CCtx pool overflow : free cctx"); + ZSTD_freeCCtx(cctx); + } + ZSTD_pthread_mutex_unlock(&pool->poolMutex); +} + +/* ==== Serial State ==== */ + +typedef struct { + void const* start; + size_t size; +} range_t; + +typedef struct { + /* All variables in the struct are protected by mutex. */ + ZSTD_pthread_mutex_t mutex; + ZSTD_pthread_cond_t cond; + ZSTD_CCtx_params params; + ldmState_t ldmState; + XXH64_state_t xxhState; + unsigned nextJobID; + /* Protects ldmWindow. + * Must be acquired after the main mutex when acquiring both. + */ + ZSTD_pthread_mutex_t ldmWindowMutex; + ZSTD_pthread_cond_t ldmWindowCond; /* Signaled when ldmWindow is updated */ + ZSTD_window_t ldmWindow; /* A thread-safe copy of ldmState.window */ +} serialState_t; + +static int +ZSTDMT_serialState_reset(serialState_t* serialState, + ZSTDMT_seqPool* seqPool, + ZSTD_CCtx_params params, + size_t jobSize, + const void* dict, size_t const dictSize, + ZSTD_dictContentType_e dictContentType) +{ + /* Adjust parameters */ + if (params.ldmParams.enableLdm == ZSTD_ps_enable) { + DEBUGLOG(4, "LDM window size = %u KB", (1U << params.cParams.windowLog) >> 10); + ZSTD_ldm_adjustParameters(¶ms.ldmParams, ¶ms.cParams); + assert(params.ldmParams.hashLog >= params.ldmParams.bucketSizeLog); + assert(params.ldmParams.hashRateLog < 32); + } else { + ZSTD_memset(¶ms.ldmParams, 0, sizeof(params.ldmParams)); + } + serialState->nextJobID = 0; + if (params.fParams.checksumFlag) + XXH64_reset(&serialState->xxhState, 0); + if (params.ldmParams.enableLdm == ZSTD_ps_enable) { + ZSTD_customMem cMem = params.customMem; + unsigned const hashLog = params.ldmParams.hashLog; + size_t const hashSize = ((size_t)1 << hashLog) * sizeof(ldmEntry_t); + unsigned const bucketLog = + params.ldmParams.hashLog - params.ldmParams.bucketSizeLog; + unsigned const prevBucketLog = + serialState->params.ldmParams.hashLog - + serialState->params.ldmParams.bucketSizeLog; + size_t const numBuckets = (size_t)1 << bucketLog; + /* Size the seq pool tables */ + ZSTDMT_setNbSeq(seqPool, ZSTD_ldm_getMaxNbSeq(params.ldmParams, jobSize)); + /* Reset the window */ + ZSTD_window_init(&serialState->ldmState.window); + /* Resize tables and output space if necessary. */ + if (serialState->ldmState.hashTable == NULL || serialState->params.ldmParams.hashLog < hashLog) { + ZSTD_customFree(serialState->ldmState.hashTable, cMem); + serialState->ldmState.hashTable = (ldmEntry_t*)ZSTD_customMalloc(hashSize, cMem); + } + if (serialState->ldmState.bucketOffsets == NULL || prevBucketLog < bucketLog) { + ZSTD_customFree(serialState->ldmState.bucketOffsets, cMem); + serialState->ldmState.bucketOffsets = (BYTE*)ZSTD_customMalloc(numBuckets, cMem); + } + if (!serialState->ldmState.hashTable || !serialState->ldmState.bucketOffsets) + return 1; + /* Zero the tables */ + ZSTD_memset(serialState->ldmState.hashTable, 0, hashSize); + ZSTD_memset(serialState->ldmState.bucketOffsets, 0, numBuckets); + + /* Update window state and fill hash table with dict */ + serialState->ldmState.loadedDictEnd = 0; + if (dictSize > 0) { + if (dictContentType == ZSTD_dct_rawContent) { + BYTE const* const dictEnd = (const BYTE*)dict + dictSize; + ZSTD_window_update(&serialState->ldmState.window, dict, dictSize, /* forceNonContiguous */ 0); + ZSTD_ldm_fillHashTable(&serialState->ldmState, (const BYTE*)dict, dictEnd, ¶ms.ldmParams); + serialState->ldmState.loadedDictEnd = params.forceWindow ? 0 : (U32)(dictEnd - serialState->ldmState.window.base); + } else { + /* don't even load anything */ + } + } + + /* Initialize serialState's copy of ldmWindow. */ + serialState->ldmWindow = serialState->ldmState.window; + } + + serialState->params = params; + serialState->params.jobSize = (U32)jobSize; + return 0; +} + +static int ZSTDMT_serialState_init(serialState_t* serialState) +{ + int initError = 0; + ZSTD_memset(serialState, 0, sizeof(*serialState)); + initError |= ZSTD_pthread_mutex_init(&serialState->mutex, NULL); + initError |= ZSTD_pthread_cond_init(&serialState->cond, NULL); + initError |= ZSTD_pthread_mutex_init(&serialState->ldmWindowMutex, NULL); + initError |= ZSTD_pthread_cond_init(&serialState->ldmWindowCond, NULL); + return initError; +} + +static void ZSTDMT_serialState_free(serialState_t* serialState) +{ + ZSTD_customMem cMem = serialState->params.customMem; + ZSTD_pthread_mutex_destroy(&serialState->mutex); + ZSTD_pthread_cond_destroy(&serialState->cond); + ZSTD_pthread_mutex_destroy(&serialState->ldmWindowMutex); + ZSTD_pthread_cond_destroy(&serialState->ldmWindowCond); + ZSTD_customFree(serialState->ldmState.hashTable, cMem); + ZSTD_customFree(serialState->ldmState.bucketOffsets, cMem); +} + +static void ZSTDMT_serialState_update(serialState_t* serialState, + ZSTD_CCtx* jobCCtx, rawSeqStore_t seqStore, + range_t src, unsigned jobID) +{ + /* Wait for our turn */ + ZSTD_PTHREAD_MUTEX_LOCK(&serialState->mutex); + while (serialState->nextJobID < jobID) { + DEBUGLOG(5, "wait for serialState->cond"); + ZSTD_pthread_cond_wait(&serialState->cond, &serialState->mutex); + } + /* A future job may error and skip our job */ + if (serialState->nextJobID == jobID) { + /* It is now our turn, do any processing necessary */ + if (serialState->params.ldmParams.enableLdm == ZSTD_ps_enable) { + size_t error; + assert(seqStore.seq != NULL && seqStore.pos == 0 && + seqStore.size == 0 && seqStore.capacity > 0); + assert(src.size <= serialState->params.jobSize); + ZSTD_window_update(&serialState->ldmState.window, src.start, src.size, /* forceNonContiguous */ 0); + error = ZSTD_ldm_generateSequences( + &serialState->ldmState, &seqStore, + &serialState->params.ldmParams, src.start, src.size); + /* We provide a large enough buffer to never fail. */ + assert(!ZSTD_isError(error)); (void)error; + /* Update ldmWindow to match the ldmState.window and signal the main + * thread if it is waiting for a buffer. + */ + ZSTD_PTHREAD_MUTEX_LOCK(&serialState->ldmWindowMutex); + serialState->ldmWindow = serialState->ldmState.window; + ZSTD_pthread_cond_signal(&serialState->ldmWindowCond); + ZSTD_pthread_mutex_unlock(&serialState->ldmWindowMutex); + } + if (serialState->params.fParams.checksumFlag && src.size > 0) + XXH64_update(&serialState->xxhState, src.start, src.size); + } + /* Now it is the next jobs turn */ + serialState->nextJobID++; + ZSTD_pthread_cond_broadcast(&serialState->cond); + ZSTD_pthread_mutex_unlock(&serialState->mutex); + + if (seqStore.size > 0) { + size_t const err = ZSTD_referenceExternalSequences( + jobCCtx, seqStore.seq, seqStore.size); + assert(serialState->params.ldmParams.enableLdm == ZSTD_ps_enable); + assert(!ZSTD_isError(err)); + (void)err; + } +} + +static void ZSTDMT_serialState_ensureFinished(serialState_t* serialState, + unsigned jobID, size_t cSize) +{ + ZSTD_PTHREAD_MUTEX_LOCK(&serialState->mutex); + if (serialState->nextJobID <= jobID) { + assert(ZSTD_isError(cSize)); (void)cSize; + DEBUGLOG(5, "Skipping past job %u because of error", jobID); + serialState->nextJobID = jobID + 1; + ZSTD_pthread_cond_broadcast(&serialState->cond); + + ZSTD_PTHREAD_MUTEX_LOCK(&serialState->ldmWindowMutex); + ZSTD_window_clear(&serialState->ldmWindow); + ZSTD_pthread_cond_signal(&serialState->ldmWindowCond); + ZSTD_pthread_mutex_unlock(&serialState->ldmWindowMutex); + } + ZSTD_pthread_mutex_unlock(&serialState->mutex); + +} + + +/* ------------------------------------------ */ +/* ===== Worker thread ===== */ +/* ------------------------------------------ */ + +static const range_t kNullRange = { NULL, 0 }; + +typedef struct { + size_t consumed; /* SHARED - set0 by mtctx, then modified by worker AND read by mtctx */ + size_t cSize; /* SHARED - set0 by mtctx, then modified by worker AND read by mtctx, then set0 by mtctx */ + ZSTD_pthread_mutex_t job_mutex; /* Thread-safe - used by mtctx and worker */ + ZSTD_pthread_cond_t job_cond; /* Thread-safe - used by mtctx and worker */ + ZSTDMT_CCtxPool* cctxPool; /* Thread-safe - used by mtctx and (all) workers */ + ZSTDMT_bufferPool* bufPool; /* Thread-safe - used by mtctx and (all) workers */ + ZSTDMT_seqPool* seqPool; /* Thread-safe - used by mtctx and (all) workers */ + serialState_t* serial; /* Thread-safe - used by mtctx and (all) workers */ + buffer_t dstBuff; /* set by worker (or mtctx), then read by worker & mtctx, then modified by mtctx => no barrier */ + range_t prefix; /* set by mtctx, then read by worker & mtctx => no barrier */ + range_t src; /* set by mtctx, then read by worker & mtctx => no barrier */ + unsigned jobID; /* set by mtctx, then read by worker => no barrier */ + unsigned firstJob; /* set by mtctx, then read by worker => no barrier */ + unsigned lastJob; /* set by mtctx, then read by worker => no barrier */ + ZSTD_CCtx_params params; /* set by mtctx, then read by worker => no barrier */ + const ZSTD_CDict* cdict; /* set by mtctx, then read by worker => no barrier */ + unsigned long long fullFrameSize; /* set by mtctx, then read by worker => no barrier */ + size_t dstFlushed; /* used only by mtctx */ + unsigned frameChecksumNeeded; /* used only by mtctx */ +} ZSTDMT_jobDescription; + +#define JOB_ERROR(e) { \ + ZSTD_PTHREAD_MUTEX_LOCK(&job->job_mutex); \ + job->cSize = e; \ + ZSTD_pthread_mutex_unlock(&job->job_mutex); \ + goto _endJob; \ +} + +/* ZSTDMT_compressionJob() is a POOL_function type */ +static void ZSTDMT_compressionJob(void* jobDescription) +{ + ZSTDMT_jobDescription* const job = (ZSTDMT_jobDescription*)jobDescription; + ZSTD_CCtx_params jobParams = job->params; /* do not modify job->params ! copy it, modify the copy */ + ZSTD_CCtx* const cctx = ZSTDMT_getCCtx(job->cctxPool); + rawSeqStore_t rawSeqStore = ZSTDMT_getSeq(job->seqPool); + buffer_t dstBuff = job->dstBuff; + size_t lastCBlockSize = 0; + + /* resources */ + if (cctx==NULL) JOB_ERROR(ERROR(memory_allocation)); + if (dstBuff.start == NULL) { /* streaming job : doesn't provide a dstBuffer */ + dstBuff = ZSTDMT_getBuffer(job->bufPool); + if (dstBuff.start==NULL) JOB_ERROR(ERROR(memory_allocation)); + job->dstBuff = dstBuff; /* this value can be read in ZSTDMT_flush, when it copies the whole job */ + } + if (jobParams.ldmParams.enableLdm == ZSTD_ps_enable && rawSeqStore.seq == NULL) + JOB_ERROR(ERROR(memory_allocation)); + + /* Don't compute the checksum for chunks, since we compute it externally, + * but write it in the header. + */ + if (job->jobID != 0) jobParams.fParams.checksumFlag = 0; + /* Don't run LDM for the chunks, since we handle it externally */ + jobParams.ldmParams.enableLdm = ZSTD_ps_disable; + /* Correct nbWorkers to 0. */ + jobParams.nbWorkers = 0; + + + /* init */ + if (job->cdict) { + size_t const initError = ZSTD_compressBegin_advanced_internal(cctx, NULL, 0, ZSTD_dct_auto, ZSTD_dtlm_fast, job->cdict, &jobParams, job->fullFrameSize); + assert(job->firstJob); /* only allowed for first job */ + if (ZSTD_isError(initError)) JOB_ERROR(initError); + } else { /* srcStart points at reloaded section */ + U64 const pledgedSrcSize = job->firstJob ? job->fullFrameSize : job->src.size; + { size_t const forceWindowError = ZSTD_CCtxParams_setParameter(&jobParams, ZSTD_c_forceMaxWindow, !job->firstJob); + if (ZSTD_isError(forceWindowError)) JOB_ERROR(forceWindowError); + } + if (!job->firstJob) { + size_t const err = ZSTD_CCtxParams_setParameter(&jobParams, ZSTD_c_deterministicRefPrefix, 0); + if (ZSTD_isError(err)) JOB_ERROR(err); + } + { size_t const initError = ZSTD_compressBegin_advanced_internal(cctx, + job->prefix.start, job->prefix.size, ZSTD_dct_rawContent, /* load dictionary in "content-only" mode (no header analysis) */ + ZSTD_dtlm_fast, + NULL, /*cdict*/ + &jobParams, pledgedSrcSize); + if (ZSTD_isError(initError)) JOB_ERROR(initError); + } } + + /* Perform serial step as early as possible, but after CCtx initialization */ + ZSTDMT_serialState_update(job->serial, cctx, rawSeqStore, job->src, job->jobID); + + if (!job->firstJob) { /* flush and overwrite frame header when it's not first job */ + size_t const hSize = ZSTD_compressContinue_public(cctx, dstBuff.start, dstBuff.capacity, job->src.start, 0); + if (ZSTD_isError(hSize)) JOB_ERROR(hSize); + DEBUGLOG(5, "ZSTDMT_compressionJob: flush and overwrite %u bytes of frame header (not first job)", (U32)hSize); + ZSTD_invalidateRepCodes(cctx); + } + + /* compress */ + { size_t const chunkSize = 4*ZSTD_BLOCKSIZE_MAX; + int const nbChunks = (int)((job->src.size + (chunkSize-1)) / chunkSize); + const BYTE* ip = (const BYTE*) job->src.start; + BYTE* const ostart = (BYTE*)dstBuff.start; + BYTE* op = ostart; + BYTE* oend = op + dstBuff.capacity; + int chunkNb; + if (sizeof(size_t) > sizeof(int)) assert(job->src.size < ((size_t)INT_MAX) * chunkSize); /* check overflow */ + DEBUGLOG(5, "ZSTDMT_compressionJob: compress %u bytes in %i blocks", (U32)job->src.size, nbChunks); + assert(job->cSize == 0); + for (chunkNb = 1; chunkNb < nbChunks; chunkNb++) { + size_t const cSize = ZSTD_compressContinue_public(cctx, op, oend-op, ip, chunkSize); + if (ZSTD_isError(cSize)) JOB_ERROR(cSize); + ip += chunkSize; + op += cSize; assert(op < oend); + /* stats */ + ZSTD_PTHREAD_MUTEX_LOCK(&job->job_mutex); + job->cSize += cSize; + job->consumed = chunkSize * chunkNb; + DEBUGLOG(5, "ZSTDMT_compressionJob: compress new block : cSize==%u bytes (total: %u)", + (U32)cSize, (U32)job->cSize); + ZSTD_pthread_cond_signal(&job->job_cond); /* warns some more data is ready to be flushed */ + ZSTD_pthread_mutex_unlock(&job->job_mutex); + } + /* last block */ + assert(chunkSize > 0); + assert((chunkSize & (chunkSize - 1)) == 0); /* chunkSize must be power of 2 for mask==(chunkSize-1) to work */ + if ((nbChunks > 0) | job->lastJob /*must output a "last block" flag*/ ) { + size_t const lastBlockSize1 = job->src.size & (chunkSize-1); + size_t const lastBlockSize = ((lastBlockSize1==0) & (job->src.size>=chunkSize)) ? chunkSize : lastBlockSize1; + size_t const cSize = (job->lastJob) ? + ZSTD_compressEnd_public(cctx, op, oend-op, ip, lastBlockSize) : + ZSTD_compressContinue_public(cctx, op, oend-op, ip, lastBlockSize); + if (ZSTD_isError(cSize)) JOB_ERROR(cSize); + lastCBlockSize = cSize; + } } + if (!job->firstJob) { + /* Double check that we don't have an ext-dict, because then our + * repcode invalidation doesn't work. + */ + assert(!ZSTD_window_hasExtDict(cctx->blockState.matchState.window)); + } + ZSTD_CCtx_trace(cctx, 0); + +_endJob: + ZSTDMT_serialState_ensureFinished(job->serial, job->jobID, job->cSize); + if (job->prefix.size > 0) + DEBUGLOG(5, "Finished with prefix: %zx", (size_t)job->prefix.start); + DEBUGLOG(5, "Finished with source: %zx", (size_t)job->src.start); + /* release resources */ + ZSTDMT_releaseSeq(job->seqPool, rawSeqStore); + ZSTDMT_releaseCCtx(job->cctxPool, cctx); + /* report */ + ZSTD_PTHREAD_MUTEX_LOCK(&job->job_mutex); + if (ZSTD_isError(job->cSize)) assert(lastCBlockSize == 0); + job->cSize += lastCBlockSize; + job->consumed = job->src.size; /* when job->consumed == job->src.size , compression job is presumed completed */ + ZSTD_pthread_cond_signal(&job->job_cond); + ZSTD_pthread_mutex_unlock(&job->job_mutex); +} + + +/* ------------------------------------------ */ +/* ===== Multi-threaded compression ===== */ +/* ------------------------------------------ */ + +typedef struct { + range_t prefix; /* read-only non-owned prefix buffer */ + buffer_t buffer; + size_t filled; +} inBuff_t; + +typedef struct { + BYTE* buffer; /* The round input buffer. All jobs get references + * to pieces of the buffer. ZSTDMT_tryGetInputRange() + * handles handing out job input buffers, and makes + * sure it doesn't overlap with any pieces still in use. + */ + size_t capacity; /* The capacity of buffer. */ + size_t pos; /* The position of the current inBuff in the round + * buffer. Updated past the end if the inBuff once + * the inBuff is sent to the worker thread. + * pos <= capacity. + */ +} roundBuff_t; + +static const roundBuff_t kNullRoundBuff = {NULL, 0, 0}; + +#define RSYNC_LENGTH 32 +/* Don't create chunks smaller than the zstd block size. + * This stops us from regressing compression ratio too much, + * and ensures our output fits in ZSTD_compressBound(). + * + * If this is shrunk < ZSTD_BLOCKSIZELOG_MIN then + * ZSTD_COMPRESSBOUND() will need to be updated. + */ +#define RSYNC_MIN_BLOCK_LOG ZSTD_BLOCKSIZELOG_MAX +#define RSYNC_MIN_BLOCK_SIZE (1< one job is already prepared, but pool has shortage of workers. Don't create a new job. */ + inBuff_t inBuff; + roundBuff_t roundBuff; + serialState_t serial; + rsyncState_t rsync; + unsigned jobIDMask; + unsigned doneJobID; + unsigned nextJobID; + unsigned frameEnded; + unsigned allJobsCompleted; + unsigned long long frameContentSize; + unsigned long long consumed; + unsigned long long produced; + ZSTD_customMem cMem; + ZSTD_CDict* cdictLocal; + const ZSTD_CDict* cdict; + unsigned providedFactory: 1; +}; + +static void ZSTDMT_freeJobsTable(ZSTDMT_jobDescription* jobTable, U32 nbJobs, ZSTD_customMem cMem) +{ + U32 jobNb; + if (jobTable == NULL) return; + for (jobNb=0; jobNb mtctx->jobIDMask+1) { /* need more job capacity */ + ZSTDMT_freeJobsTable(mtctx->jobs, mtctx->jobIDMask+1, mtctx->cMem); + mtctx->jobIDMask = 0; + mtctx->jobs = ZSTDMT_createJobsTable(&nbJobs, mtctx->cMem); + if (mtctx->jobs==NULL) return ERROR(memory_allocation); + assert((nbJobs != 0) && ((nbJobs & (nbJobs - 1)) == 0)); /* ensure nbJobs is a power of 2 */ + mtctx->jobIDMask = nbJobs - 1; + } + return 0; +} + + +/* ZSTDMT_CCtxParam_setNbWorkers(): + * Internal use only */ +static size_t ZSTDMT_CCtxParam_setNbWorkers(ZSTD_CCtx_params* params, unsigned nbWorkers) +{ + return ZSTD_CCtxParams_setParameter(params, ZSTD_c_nbWorkers, (int)nbWorkers); +} + +MEM_STATIC ZSTDMT_CCtx* ZSTDMT_createCCtx_advanced_internal(unsigned nbWorkers, ZSTD_customMem cMem, ZSTD_threadPool* pool) +{ + ZSTDMT_CCtx* mtctx; + U32 nbJobs = nbWorkers + 2; + int initError; + DEBUGLOG(3, "ZSTDMT_createCCtx_advanced (nbWorkers = %u)", nbWorkers); + + if (nbWorkers < 1) return NULL; + nbWorkers = MIN(nbWorkers , ZSTDMT_NBWORKERS_MAX); + if ((cMem.customAlloc!=NULL) ^ (cMem.customFree!=NULL)) + /* invalid custom allocator */ + return NULL; + + mtctx = (ZSTDMT_CCtx*) ZSTD_customCalloc(sizeof(ZSTDMT_CCtx), cMem); + if (!mtctx) return NULL; + ZSTDMT_CCtxParam_setNbWorkers(&mtctx->params, nbWorkers); + mtctx->cMem = cMem; + mtctx->allJobsCompleted = 1; + if (pool != NULL) { + mtctx->factory = pool; + mtctx->providedFactory = 1; + } + else { + mtctx->factory = POOL_create_advanced(nbWorkers, 0, cMem); + mtctx->providedFactory = 0; + } + mtctx->jobs = ZSTDMT_createJobsTable(&nbJobs, cMem); + assert(nbJobs > 0); assert((nbJobs & (nbJobs - 1)) == 0); /* ensure nbJobs is a power of 2 */ + mtctx->jobIDMask = nbJobs - 1; + mtctx->bufPool = ZSTDMT_createBufferPool(BUF_POOL_MAX_NB_BUFFERS(nbWorkers), cMem); + mtctx->cctxPool = ZSTDMT_createCCtxPool(nbWorkers, cMem); + mtctx->seqPool = ZSTDMT_createSeqPool(nbWorkers, cMem); + initError = ZSTDMT_serialState_init(&mtctx->serial); + mtctx->roundBuff = kNullRoundBuff; + if (!mtctx->factory | !mtctx->jobs | !mtctx->bufPool | !mtctx->cctxPool | !mtctx->seqPool | initError) { + ZSTDMT_freeCCtx(mtctx); + return NULL; + } + DEBUGLOG(3, "mt_cctx created, for %u threads", nbWorkers); + return mtctx; +} + +ZSTDMT_CCtx* ZSTDMT_createCCtx_advanced(unsigned nbWorkers, ZSTD_customMem cMem, ZSTD_threadPool* pool) +{ +#ifdef ZSTD_MULTITHREAD + return ZSTDMT_createCCtx_advanced_internal(nbWorkers, cMem, pool); +#else + (void)nbWorkers; + (void)cMem; + (void)pool; + return NULL; +#endif +} + + +/* ZSTDMT_releaseAllJobResources() : + * note : ensure all workers are killed first ! */ +static void ZSTDMT_releaseAllJobResources(ZSTDMT_CCtx* mtctx) +{ + unsigned jobID; + DEBUGLOG(3, "ZSTDMT_releaseAllJobResources"); + for (jobID=0; jobID <= mtctx->jobIDMask; jobID++) { + /* Copy the mutex/cond out */ + ZSTD_pthread_mutex_t const mutex = mtctx->jobs[jobID].job_mutex; + ZSTD_pthread_cond_t const cond = mtctx->jobs[jobID].job_cond; + + DEBUGLOG(4, "job%02u: release dst address %08X", jobID, (U32)(size_t)mtctx->jobs[jobID].dstBuff.start); + ZSTDMT_releaseBuffer(mtctx->bufPool, mtctx->jobs[jobID].dstBuff); + + /* Clear the job description, but keep the mutex/cond */ + ZSTD_memset(&mtctx->jobs[jobID], 0, sizeof(mtctx->jobs[jobID])); + mtctx->jobs[jobID].job_mutex = mutex; + mtctx->jobs[jobID].job_cond = cond; + } + mtctx->inBuff.buffer = g_nullBuffer; + mtctx->inBuff.filled = 0; + mtctx->allJobsCompleted = 1; +} + +static void ZSTDMT_waitForAllJobsCompleted(ZSTDMT_CCtx* mtctx) +{ + DEBUGLOG(4, "ZSTDMT_waitForAllJobsCompleted"); + while (mtctx->doneJobID < mtctx->nextJobID) { + unsigned const jobID = mtctx->doneJobID & mtctx->jobIDMask; + ZSTD_PTHREAD_MUTEX_LOCK(&mtctx->jobs[jobID].job_mutex); + while (mtctx->jobs[jobID].consumed < mtctx->jobs[jobID].src.size) { + DEBUGLOG(4, "waiting for jobCompleted signal from job %u", mtctx->doneJobID); /* we want to block when waiting for data to flush */ + ZSTD_pthread_cond_wait(&mtctx->jobs[jobID].job_cond, &mtctx->jobs[jobID].job_mutex); + } + ZSTD_pthread_mutex_unlock(&mtctx->jobs[jobID].job_mutex); + mtctx->doneJobID++; + } +} + +size_t ZSTDMT_freeCCtx(ZSTDMT_CCtx* mtctx) +{ + if (mtctx==NULL) return 0; /* compatible with free on NULL */ + if (!mtctx->providedFactory) + POOL_free(mtctx->factory); /* stop and free worker threads */ + ZSTDMT_releaseAllJobResources(mtctx); /* release job resources into pools first */ + ZSTDMT_freeJobsTable(mtctx->jobs, mtctx->jobIDMask+1, mtctx->cMem); + ZSTDMT_freeBufferPool(mtctx->bufPool); + ZSTDMT_freeCCtxPool(mtctx->cctxPool); + ZSTDMT_freeSeqPool(mtctx->seqPool); + ZSTDMT_serialState_free(&mtctx->serial); + ZSTD_freeCDict(mtctx->cdictLocal); + if (mtctx->roundBuff.buffer) + ZSTD_customFree(mtctx->roundBuff.buffer, mtctx->cMem); + ZSTD_customFree(mtctx, mtctx->cMem); + return 0; +} + +size_t ZSTDMT_sizeof_CCtx(ZSTDMT_CCtx* mtctx) +{ + if (mtctx == NULL) return 0; /* supports sizeof NULL */ + return sizeof(*mtctx) + + POOL_sizeof(mtctx->factory) + + ZSTDMT_sizeof_bufferPool(mtctx->bufPool) + + (mtctx->jobIDMask+1) * sizeof(ZSTDMT_jobDescription) + + ZSTDMT_sizeof_CCtxPool(mtctx->cctxPool) + + ZSTDMT_sizeof_seqPool(mtctx->seqPool) + + ZSTD_sizeof_CDict(mtctx->cdictLocal) + + mtctx->roundBuff.capacity; +} + + +/* ZSTDMT_resize() : + * @return : error code if fails, 0 on success */ +static size_t ZSTDMT_resize(ZSTDMT_CCtx* mtctx, unsigned nbWorkers) +{ + if (POOL_resize(mtctx->factory, nbWorkers)) return ERROR(memory_allocation); + FORWARD_IF_ERROR( ZSTDMT_expandJobsTable(mtctx, nbWorkers) , ""); + mtctx->bufPool = ZSTDMT_expandBufferPool(mtctx->bufPool, BUF_POOL_MAX_NB_BUFFERS(nbWorkers)); + if (mtctx->bufPool == NULL) return ERROR(memory_allocation); + mtctx->cctxPool = ZSTDMT_expandCCtxPool(mtctx->cctxPool, nbWorkers); + if (mtctx->cctxPool == NULL) return ERROR(memory_allocation); + mtctx->seqPool = ZSTDMT_expandSeqPool(mtctx->seqPool, nbWorkers); + if (mtctx->seqPool == NULL) return ERROR(memory_allocation); + ZSTDMT_CCtxParam_setNbWorkers(&mtctx->params, nbWorkers); + return 0; +} + + +/*! ZSTDMT_updateCParams_whileCompressing() : + * Updates a selected set of compression parameters, remaining compatible with currently active frame. + * New parameters will be applied to next compression job. */ +void ZSTDMT_updateCParams_whileCompressing(ZSTDMT_CCtx* mtctx, const ZSTD_CCtx_params* cctxParams) +{ + U32 const saved_wlog = mtctx->params.cParams.windowLog; /* Do not modify windowLog while compressing */ + int const compressionLevel = cctxParams->compressionLevel; + DEBUGLOG(5, "ZSTDMT_updateCParams_whileCompressing (level:%i)", + compressionLevel); + mtctx->params.compressionLevel = compressionLevel; + { ZSTD_compressionParameters cParams = ZSTD_getCParamsFromCCtxParams(cctxParams, ZSTD_CONTENTSIZE_UNKNOWN, 0, ZSTD_cpm_noAttachDict); + cParams.windowLog = saved_wlog; + mtctx->params.cParams = cParams; + } +} + +/* ZSTDMT_getFrameProgression(): + * tells how much data has been consumed (input) and produced (output) for current frame. + * able to count progression inside worker threads. + * Note : mutex will be acquired during statistics collection inside workers. */ +ZSTD_frameProgression ZSTDMT_getFrameProgression(ZSTDMT_CCtx* mtctx) +{ + ZSTD_frameProgression fps; + DEBUGLOG(5, "ZSTDMT_getFrameProgression"); + fps.ingested = mtctx->consumed + mtctx->inBuff.filled; + fps.consumed = mtctx->consumed; + fps.produced = fps.flushed = mtctx->produced; + fps.currentJobID = mtctx->nextJobID; + fps.nbActiveWorkers = 0; + { unsigned jobNb; + unsigned lastJobNb = mtctx->nextJobID + mtctx->jobReady; assert(mtctx->jobReady <= 1); + DEBUGLOG(6, "ZSTDMT_getFrameProgression: jobs: from %u to <%u (jobReady:%u)", + mtctx->doneJobID, lastJobNb, mtctx->jobReady) + for (jobNb = mtctx->doneJobID ; jobNb < lastJobNb ; jobNb++) { + unsigned const wJobID = jobNb & mtctx->jobIDMask; + ZSTDMT_jobDescription* jobPtr = &mtctx->jobs[wJobID]; + ZSTD_pthread_mutex_lock(&jobPtr->job_mutex); + { size_t const cResult = jobPtr->cSize; + size_t const produced = ZSTD_isError(cResult) ? 0 : cResult; + size_t const flushed = ZSTD_isError(cResult) ? 0 : jobPtr->dstFlushed; + assert(flushed <= produced); + fps.ingested += jobPtr->src.size; + fps.consumed += jobPtr->consumed; + fps.produced += produced; + fps.flushed += flushed; + fps.nbActiveWorkers += (jobPtr->consumed < jobPtr->src.size); + } + ZSTD_pthread_mutex_unlock(&mtctx->jobs[wJobID].job_mutex); + } + } + return fps; +} + + +size_t ZSTDMT_toFlushNow(ZSTDMT_CCtx* mtctx) +{ + size_t toFlush; + unsigned const jobID = mtctx->doneJobID; + assert(jobID <= mtctx->nextJobID); + if (jobID == mtctx->nextJobID) return 0; /* no active job => nothing to flush */ + + /* look into oldest non-fully-flushed job */ + { unsigned const wJobID = jobID & mtctx->jobIDMask; + ZSTDMT_jobDescription* const jobPtr = &mtctx->jobs[wJobID]; + ZSTD_pthread_mutex_lock(&jobPtr->job_mutex); + { size_t const cResult = jobPtr->cSize; + size_t const produced = ZSTD_isError(cResult) ? 0 : cResult; + size_t const flushed = ZSTD_isError(cResult) ? 0 : jobPtr->dstFlushed; + assert(flushed <= produced); + assert(jobPtr->consumed <= jobPtr->src.size); + toFlush = produced - flushed; + /* if toFlush==0, nothing is available to flush. + * However, jobID is expected to still be active: + * if jobID was already completed and fully flushed, + * ZSTDMT_flushProduced() should have already moved onto next job. + * Therefore, some input has not yet been consumed. */ + if (toFlush==0) { + assert(jobPtr->consumed < jobPtr->src.size); + } + } + ZSTD_pthread_mutex_unlock(&mtctx->jobs[wJobID].job_mutex); + } + + return toFlush; +} + + +/* ------------------------------------------ */ +/* ===== Multi-threaded compression ===== */ +/* ------------------------------------------ */ + +static unsigned ZSTDMT_computeTargetJobLog(const ZSTD_CCtx_params* params) +{ + unsigned jobLog; + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { + /* In Long Range Mode, the windowLog is typically oversized. + * In which case, it's preferable to determine the jobSize + * based on cycleLog instead. */ + jobLog = MAX(21, ZSTD_cycleLog(params->cParams.chainLog, params->cParams.strategy) + 3); + } else { + jobLog = MAX(20, params->cParams.windowLog + 2); + } + return MIN(jobLog, (unsigned)ZSTDMT_JOBLOG_MAX); +} + +static int ZSTDMT_overlapLog_default(ZSTD_strategy strat) +{ + switch(strat) + { + case ZSTD_btultra2: + return 9; + case ZSTD_btultra: + case ZSTD_btopt: + return 8; + case ZSTD_btlazy2: + case ZSTD_lazy2: + return 7; + case ZSTD_lazy: + case ZSTD_greedy: + case ZSTD_dfast: + case ZSTD_fast: + default:; + } + return 6; +} + +static int ZSTDMT_overlapLog(int ovlog, ZSTD_strategy strat) +{ + assert(0 <= ovlog && ovlog <= 9); + if (ovlog == 0) return ZSTDMT_overlapLog_default(strat); + return ovlog; +} + +static size_t ZSTDMT_computeOverlapSize(const ZSTD_CCtx_params* params) +{ + int const overlapRLog = 9 - ZSTDMT_overlapLog(params->overlapLog, params->cParams.strategy); + int ovLog = (overlapRLog >= 8) ? 0 : (params->cParams.windowLog - overlapRLog); + assert(0 <= overlapRLog && overlapRLog <= 8); + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { + /* In Long Range Mode, the windowLog is typically oversized. + * In which case, it's preferable to determine the jobSize + * based on chainLog instead. + * Then, ovLog becomes a fraction of the jobSize, rather than windowSize */ + ovLog = MIN(params->cParams.windowLog, ZSTDMT_computeTargetJobLog(params) - 2) + - overlapRLog; + } + assert(0 <= ovLog && ovLog <= ZSTD_WINDOWLOG_MAX); + DEBUGLOG(4, "overlapLog : %i", params->overlapLog); + DEBUGLOG(4, "overlap size : %i", 1 << ovLog); + return (ovLog==0) ? 0 : (size_t)1 << ovLog; +} + +/* ====================================== */ +/* ======= Streaming API ======= */ +/* ====================================== */ + +size_t ZSTDMT_initCStream_internal( + ZSTDMT_CCtx* mtctx, + const void* dict, size_t dictSize, ZSTD_dictContentType_e dictContentType, + const ZSTD_CDict* cdict, ZSTD_CCtx_params params, + unsigned long long pledgedSrcSize) +{ + DEBUGLOG(4, "ZSTDMT_initCStream_internal (pledgedSrcSize=%u, nbWorkers=%u, cctxPool=%u)", + (U32)pledgedSrcSize, params.nbWorkers, mtctx->cctxPool->totalCCtx); + + /* params supposed partially fully validated at this point */ + assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams))); + assert(!((dict) && (cdict))); /* either dict or cdict, not both */ + + /* init */ + if (params.nbWorkers != mtctx->params.nbWorkers) + FORWARD_IF_ERROR( ZSTDMT_resize(mtctx, params.nbWorkers) , ""); + + if (params.jobSize != 0 && params.jobSize < ZSTDMT_JOBSIZE_MIN) params.jobSize = ZSTDMT_JOBSIZE_MIN; + if (params.jobSize > (size_t)ZSTDMT_JOBSIZE_MAX) params.jobSize = (size_t)ZSTDMT_JOBSIZE_MAX; + + DEBUGLOG(4, "ZSTDMT_initCStream_internal: %u workers", params.nbWorkers); + + if (mtctx->allJobsCompleted == 0) { /* previous compression not correctly finished */ + ZSTDMT_waitForAllJobsCompleted(mtctx); + ZSTDMT_releaseAllJobResources(mtctx); + mtctx->allJobsCompleted = 1; + } + + mtctx->params = params; + mtctx->frameContentSize = pledgedSrcSize; + if (dict) { + ZSTD_freeCDict(mtctx->cdictLocal); + mtctx->cdictLocal = ZSTD_createCDict_advanced(dict, dictSize, + ZSTD_dlm_byCopy, dictContentType, /* note : a loadPrefix becomes an internal CDict */ + params.cParams, mtctx->cMem); + mtctx->cdict = mtctx->cdictLocal; + if (mtctx->cdictLocal == NULL) return ERROR(memory_allocation); + } else { + ZSTD_freeCDict(mtctx->cdictLocal); + mtctx->cdictLocal = NULL; + mtctx->cdict = cdict; + } + + mtctx->targetPrefixSize = ZSTDMT_computeOverlapSize(¶ms); + DEBUGLOG(4, "overlapLog=%i => %u KB", params.overlapLog, (U32)(mtctx->targetPrefixSize>>10)); + mtctx->targetSectionSize = params.jobSize; + if (mtctx->targetSectionSize == 0) { + mtctx->targetSectionSize = 1ULL << ZSTDMT_computeTargetJobLog(¶ms); + } + assert(mtctx->targetSectionSize <= (size_t)ZSTDMT_JOBSIZE_MAX); + + if (params.rsyncable) { + /* Aim for the targetsectionSize as the average job size. */ + U32 const jobSizeKB = (U32)(mtctx->targetSectionSize >> 10); + U32 const rsyncBits = (assert(jobSizeKB >= 1), ZSTD_highbit32(jobSizeKB) + 10); + /* We refuse to create jobs < RSYNC_MIN_BLOCK_SIZE bytes, so make sure our + * expected job size is at least 4x larger. */ + assert(rsyncBits >= RSYNC_MIN_BLOCK_LOG + 2); + DEBUGLOG(4, "rsyncLog = %u", rsyncBits); + mtctx->rsync.hash = 0; + mtctx->rsync.hitMask = (1ULL << rsyncBits) - 1; + mtctx->rsync.primePower = ZSTD_rollingHash_primePower(RSYNC_LENGTH); + } + if (mtctx->targetSectionSize < mtctx->targetPrefixSize) mtctx->targetSectionSize = mtctx->targetPrefixSize; /* job size must be >= overlap size */ + DEBUGLOG(4, "Job Size : %u KB (note : set to %u)", (U32)(mtctx->targetSectionSize>>10), (U32)params.jobSize); + DEBUGLOG(4, "inBuff Size : %u KB", (U32)(mtctx->targetSectionSize>>10)); + ZSTDMT_setBufferSize(mtctx->bufPool, ZSTD_compressBound(mtctx->targetSectionSize)); + { + /* If ldm is enabled we need windowSize space. */ + size_t const windowSize = mtctx->params.ldmParams.enableLdm == ZSTD_ps_enable ? (1U << mtctx->params.cParams.windowLog) : 0; + /* Two buffers of slack, plus extra space for the overlap + * This is the minimum slack that LDM works with. One extra because + * flush might waste up to targetSectionSize-1 bytes. Another extra + * for the overlap (if > 0), then one to fill which doesn't overlap + * with the LDM window. + */ + size_t const nbSlackBuffers = 2 + (mtctx->targetPrefixSize > 0); + size_t const slackSize = mtctx->targetSectionSize * nbSlackBuffers; + /* Compute the total size, and always have enough slack */ + size_t const nbWorkers = MAX(mtctx->params.nbWorkers, 1); + size_t const sectionsSize = mtctx->targetSectionSize * nbWorkers; + size_t const capacity = MAX(windowSize, sectionsSize) + slackSize; + if (mtctx->roundBuff.capacity < capacity) { + if (mtctx->roundBuff.buffer) + ZSTD_customFree(mtctx->roundBuff.buffer, mtctx->cMem); + mtctx->roundBuff.buffer = (BYTE*)ZSTD_customMalloc(capacity, mtctx->cMem); + if (mtctx->roundBuff.buffer == NULL) { + mtctx->roundBuff.capacity = 0; + return ERROR(memory_allocation); + } + mtctx->roundBuff.capacity = capacity; + } + } + DEBUGLOG(4, "roundBuff capacity : %u KB", (U32)(mtctx->roundBuff.capacity>>10)); + mtctx->roundBuff.pos = 0; + mtctx->inBuff.buffer = g_nullBuffer; + mtctx->inBuff.filled = 0; + mtctx->inBuff.prefix = kNullRange; + mtctx->doneJobID = 0; + mtctx->nextJobID = 0; + mtctx->frameEnded = 0; + mtctx->allJobsCompleted = 0; + mtctx->consumed = 0; + mtctx->produced = 0; + if (ZSTDMT_serialState_reset(&mtctx->serial, mtctx->seqPool, params, mtctx->targetSectionSize, + dict, dictSize, dictContentType)) + return ERROR(memory_allocation); + return 0; +} + + +/* ZSTDMT_writeLastEmptyBlock() + * Write a single empty block with an end-of-frame to finish a frame. + * Job must be created from streaming variant. + * This function is always successful if expected conditions are fulfilled. + */ +static void ZSTDMT_writeLastEmptyBlock(ZSTDMT_jobDescription* job) +{ + assert(job->lastJob == 1); + assert(job->src.size == 0); /* last job is empty -> will be simplified into a last empty block */ + assert(job->firstJob == 0); /* cannot be first job, as it also needs to create frame header */ + assert(job->dstBuff.start == NULL); /* invoked from streaming variant only (otherwise, dstBuff might be user's output) */ + job->dstBuff = ZSTDMT_getBuffer(job->bufPool); + if (job->dstBuff.start == NULL) { + job->cSize = ERROR(memory_allocation); + return; + } + assert(job->dstBuff.capacity >= ZSTD_blockHeaderSize); /* no buffer should ever be that small */ + job->src = kNullRange; + job->cSize = ZSTD_writeLastEmptyBlock(job->dstBuff.start, job->dstBuff.capacity); + assert(!ZSTD_isError(job->cSize)); + assert(job->consumed == 0); +} + +static size_t ZSTDMT_createCompressionJob(ZSTDMT_CCtx* mtctx, size_t srcSize, ZSTD_EndDirective endOp) +{ + unsigned const jobID = mtctx->nextJobID & mtctx->jobIDMask; + int const endFrame = (endOp == ZSTD_e_end); + + if (mtctx->nextJobID > mtctx->doneJobID + mtctx->jobIDMask) { + DEBUGLOG(5, "ZSTDMT_createCompressionJob: will not create new job : table is full"); + assert((mtctx->nextJobID & mtctx->jobIDMask) == (mtctx->doneJobID & mtctx->jobIDMask)); + return 0; + } + + if (!mtctx->jobReady) { + BYTE const* src = (BYTE const*)mtctx->inBuff.buffer.start; + DEBUGLOG(5, "ZSTDMT_createCompressionJob: preparing job %u to compress %u bytes with %u preload ", + mtctx->nextJobID, (U32)srcSize, (U32)mtctx->inBuff.prefix.size); + mtctx->jobs[jobID].src.start = src; + mtctx->jobs[jobID].src.size = srcSize; + assert(mtctx->inBuff.filled >= srcSize); + mtctx->jobs[jobID].prefix = mtctx->inBuff.prefix; + mtctx->jobs[jobID].consumed = 0; + mtctx->jobs[jobID].cSize = 0; + mtctx->jobs[jobID].params = mtctx->params; + mtctx->jobs[jobID].cdict = mtctx->nextJobID==0 ? mtctx->cdict : NULL; + mtctx->jobs[jobID].fullFrameSize = mtctx->frameContentSize; + mtctx->jobs[jobID].dstBuff = g_nullBuffer; + mtctx->jobs[jobID].cctxPool = mtctx->cctxPool; + mtctx->jobs[jobID].bufPool = mtctx->bufPool; + mtctx->jobs[jobID].seqPool = mtctx->seqPool; + mtctx->jobs[jobID].serial = &mtctx->serial; + mtctx->jobs[jobID].jobID = mtctx->nextJobID; + mtctx->jobs[jobID].firstJob = (mtctx->nextJobID==0); + mtctx->jobs[jobID].lastJob = endFrame; + mtctx->jobs[jobID].frameChecksumNeeded = mtctx->params.fParams.checksumFlag && endFrame && (mtctx->nextJobID>0); + mtctx->jobs[jobID].dstFlushed = 0; + + /* Update the round buffer pos and clear the input buffer to be reset */ + mtctx->roundBuff.pos += srcSize; + mtctx->inBuff.buffer = g_nullBuffer; + mtctx->inBuff.filled = 0; + /* Set the prefix */ + if (!endFrame) { + size_t const newPrefixSize = MIN(srcSize, mtctx->targetPrefixSize); + mtctx->inBuff.prefix.start = src + srcSize - newPrefixSize; + mtctx->inBuff.prefix.size = newPrefixSize; + } else { /* endFrame==1 => no need for another input buffer */ + mtctx->inBuff.prefix = kNullRange; + mtctx->frameEnded = endFrame; + if (mtctx->nextJobID == 0) { + /* single job exception : checksum is already calculated directly within worker thread */ + mtctx->params.fParams.checksumFlag = 0; + } } + + if ( (srcSize == 0) + && (mtctx->nextJobID>0)/*single job must also write frame header*/ ) { + DEBUGLOG(5, "ZSTDMT_createCompressionJob: creating a last empty block to end frame"); + assert(endOp == ZSTD_e_end); /* only possible case : need to end the frame with an empty last block */ + ZSTDMT_writeLastEmptyBlock(mtctx->jobs + jobID); + mtctx->nextJobID++; + return 0; + } + } + + DEBUGLOG(5, "ZSTDMT_createCompressionJob: posting job %u : %u bytes (end:%u, jobNb == %u (mod:%u))", + mtctx->nextJobID, + (U32)mtctx->jobs[jobID].src.size, + mtctx->jobs[jobID].lastJob, + mtctx->nextJobID, + jobID); + if (POOL_tryAdd(mtctx->factory, ZSTDMT_compressionJob, &mtctx->jobs[jobID])) { + mtctx->nextJobID++; + mtctx->jobReady = 0; + } else { + DEBUGLOG(5, "ZSTDMT_createCompressionJob: no worker available for job %u", mtctx->nextJobID); + mtctx->jobReady = 1; + } + return 0; +} + + +/*! ZSTDMT_flushProduced() : + * flush whatever data has been produced but not yet flushed in current job. + * move to next job if current one is fully flushed. + * `output` : `pos` will be updated with amount of data flushed . + * `blockToFlush` : if >0, the function will block and wait if there is no data available to flush . + * @return : amount of data remaining within internal buffer, 0 if no more, 1 if unknown but > 0, or an error code */ +static size_t ZSTDMT_flushProduced(ZSTDMT_CCtx* mtctx, ZSTD_outBuffer* output, unsigned blockToFlush, ZSTD_EndDirective end) +{ + unsigned const wJobID = mtctx->doneJobID & mtctx->jobIDMask; + DEBUGLOG(5, "ZSTDMT_flushProduced (blocking:%u , job %u <= %u)", + blockToFlush, mtctx->doneJobID, mtctx->nextJobID); + assert(output->size >= output->pos); + + ZSTD_PTHREAD_MUTEX_LOCK(&mtctx->jobs[wJobID].job_mutex); + if ( blockToFlush + && (mtctx->doneJobID < mtctx->nextJobID) ) { + assert(mtctx->jobs[wJobID].dstFlushed <= mtctx->jobs[wJobID].cSize); + while (mtctx->jobs[wJobID].dstFlushed == mtctx->jobs[wJobID].cSize) { /* nothing to flush */ + if (mtctx->jobs[wJobID].consumed == mtctx->jobs[wJobID].src.size) { + DEBUGLOG(5, "job %u is completely consumed (%u == %u) => don't wait for cond, there will be none", + mtctx->doneJobID, (U32)mtctx->jobs[wJobID].consumed, (U32)mtctx->jobs[wJobID].src.size); + break; + } + DEBUGLOG(5, "waiting for something to flush from job %u (currently flushed: %u bytes)", + mtctx->doneJobID, (U32)mtctx->jobs[wJobID].dstFlushed); + ZSTD_pthread_cond_wait(&mtctx->jobs[wJobID].job_cond, &mtctx->jobs[wJobID].job_mutex); /* block when nothing to flush but some to come */ + } } + + /* try to flush something */ + { size_t cSize = mtctx->jobs[wJobID].cSize; /* shared */ + size_t const srcConsumed = mtctx->jobs[wJobID].consumed; /* shared */ + size_t const srcSize = mtctx->jobs[wJobID].src.size; /* read-only, could be done after mutex lock, but no-declaration-after-statement */ + ZSTD_pthread_mutex_unlock(&mtctx->jobs[wJobID].job_mutex); + if (ZSTD_isError(cSize)) { + DEBUGLOG(5, "ZSTDMT_flushProduced: job %u : compression error detected : %s", + mtctx->doneJobID, ZSTD_getErrorName(cSize)); + ZSTDMT_waitForAllJobsCompleted(mtctx); + ZSTDMT_releaseAllJobResources(mtctx); + return cSize; + } + /* add frame checksum if necessary (can only happen once) */ + assert(srcConsumed <= srcSize); + if ( (srcConsumed == srcSize) /* job completed -> worker no longer active */ + && mtctx->jobs[wJobID].frameChecksumNeeded ) { + U32 const checksum = (U32)XXH64_digest(&mtctx->serial.xxhState); + DEBUGLOG(4, "ZSTDMT_flushProduced: writing checksum : %08X \n", checksum); + MEM_writeLE32((char*)mtctx->jobs[wJobID].dstBuff.start + mtctx->jobs[wJobID].cSize, checksum); + cSize += 4; + mtctx->jobs[wJobID].cSize += 4; /* can write this shared value, as worker is no longer active */ + mtctx->jobs[wJobID].frameChecksumNeeded = 0; + } + + if (cSize > 0) { /* compression is ongoing or completed */ + size_t const toFlush = MIN(cSize - mtctx->jobs[wJobID].dstFlushed, output->size - output->pos); + DEBUGLOG(5, "ZSTDMT_flushProduced: Flushing %u bytes from job %u (completion:%u/%u, generated:%u)", + (U32)toFlush, mtctx->doneJobID, (U32)srcConsumed, (U32)srcSize, (U32)cSize); + assert(mtctx->doneJobID < mtctx->nextJobID); + assert(cSize >= mtctx->jobs[wJobID].dstFlushed); + assert(mtctx->jobs[wJobID].dstBuff.start != NULL); + if (toFlush > 0) { + ZSTD_memcpy((char*)output->dst + output->pos, + (const char*)mtctx->jobs[wJobID].dstBuff.start + mtctx->jobs[wJobID].dstFlushed, + toFlush); + } + output->pos += toFlush; + mtctx->jobs[wJobID].dstFlushed += toFlush; /* can write : this value is only used by mtctx */ + + if ( (srcConsumed == srcSize) /* job is completed */ + && (mtctx->jobs[wJobID].dstFlushed == cSize) ) { /* output buffer fully flushed => free this job position */ + DEBUGLOG(5, "Job %u completed (%u bytes), moving to next one", + mtctx->doneJobID, (U32)mtctx->jobs[wJobID].dstFlushed); + ZSTDMT_releaseBuffer(mtctx->bufPool, mtctx->jobs[wJobID].dstBuff); + DEBUGLOG(5, "dstBuffer released"); + mtctx->jobs[wJobID].dstBuff = g_nullBuffer; + mtctx->jobs[wJobID].cSize = 0; /* ensure this job slot is considered "not started" in future check */ + mtctx->consumed += srcSize; + mtctx->produced += cSize; + mtctx->doneJobID++; + } } + + /* return value : how many bytes left in buffer ; fake it to 1 when unknown but >0 */ + if (cSize > mtctx->jobs[wJobID].dstFlushed) return (cSize - mtctx->jobs[wJobID].dstFlushed); + if (srcSize > srcConsumed) return 1; /* current job not completely compressed */ + } + if (mtctx->doneJobID < mtctx->nextJobID) return 1; /* some more jobs ongoing */ + if (mtctx->jobReady) return 1; /* one job is ready to push, just not yet in the list */ + if (mtctx->inBuff.filled > 0) return 1; /* input is not empty, and still needs to be converted into a job */ + mtctx->allJobsCompleted = mtctx->frameEnded; /* all jobs are entirely flushed => if this one is last one, frame is completed */ + if (end == ZSTD_e_end) return !mtctx->frameEnded; /* for ZSTD_e_end, question becomes : is frame completed ? instead of : are internal buffers fully flushed ? */ + return 0; /* internal buffers fully flushed */ +} + +/** + * Returns the range of data used by the earliest job that is not yet complete. + * If the data of the first job is broken up into two segments, we cover both + * sections. + */ +static range_t ZSTDMT_getInputDataInUse(ZSTDMT_CCtx* mtctx) +{ + unsigned const firstJobID = mtctx->doneJobID; + unsigned const lastJobID = mtctx->nextJobID; + unsigned jobID; + + for (jobID = firstJobID; jobID < lastJobID; ++jobID) { + unsigned const wJobID = jobID & mtctx->jobIDMask; + size_t consumed; + + ZSTD_PTHREAD_MUTEX_LOCK(&mtctx->jobs[wJobID].job_mutex); + consumed = mtctx->jobs[wJobID].consumed; + ZSTD_pthread_mutex_unlock(&mtctx->jobs[wJobID].job_mutex); + + if (consumed < mtctx->jobs[wJobID].src.size) { + range_t range = mtctx->jobs[wJobID].prefix; + if (range.size == 0) { + /* Empty prefix */ + range = mtctx->jobs[wJobID].src; + } + /* Job source in multiple segments not supported yet */ + assert(range.start <= mtctx->jobs[wJobID].src.start); + return range; + } + } + return kNullRange; +} + +/** + * Returns non-zero iff buffer and range overlap. + */ +static int ZSTDMT_isOverlapped(buffer_t buffer, range_t range) +{ + BYTE const* const bufferStart = (BYTE const*)buffer.start; + BYTE const* const rangeStart = (BYTE const*)range.start; + + if (rangeStart == NULL || bufferStart == NULL) + return 0; + + { + BYTE const* const bufferEnd = bufferStart + buffer.capacity; + BYTE const* const rangeEnd = rangeStart + range.size; + + /* Empty ranges cannot overlap */ + if (bufferStart == bufferEnd || rangeStart == rangeEnd) + return 0; + + return bufferStart < rangeEnd && rangeStart < bufferEnd; + } +} + +static int ZSTDMT_doesOverlapWindow(buffer_t buffer, ZSTD_window_t window) +{ + range_t extDict; + range_t prefix; + + DEBUGLOG(5, "ZSTDMT_doesOverlapWindow"); + extDict.start = window.dictBase + window.lowLimit; + extDict.size = window.dictLimit - window.lowLimit; + + prefix.start = window.base + window.dictLimit; + prefix.size = window.nextSrc - (window.base + window.dictLimit); + DEBUGLOG(5, "extDict [0x%zx, 0x%zx)", + (size_t)extDict.start, + (size_t)extDict.start + extDict.size); + DEBUGLOG(5, "prefix [0x%zx, 0x%zx)", + (size_t)prefix.start, + (size_t)prefix.start + prefix.size); + + return ZSTDMT_isOverlapped(buffer, extDict) + || ZSTDMT_isOverlapped(buffer, prefix); +} + +static void ZSTDMT_waitForLdmComplete(ZSTDMT_CCtx* mtctx, buffer_t buffer) +{ + if (mtctx->params.ldmParams.enableLdm == ZSTD_ps_enable) { + ZSTD_pthread_mutex_t* mutex = &mtctx->serial.ldmWindowMutex; + DEBUGLOG(5, "ZSTDMT_waitForLdmComplete"); + DEBUGLOG(5, "source [0x%zx, 0x%zx)", + (size_t)buffer.start, + (size_t)buffer.start + buffer.capacity); + ZSTD_PTHREAD_MUTEX_LOCK(mutex); + while (ZSTDMT_doesOverlapWindow(buffer, mtctx->serial.ldmWindow)) { + DEBUGLOG(5, "Waiting for LDM to finish..."); + ZSTD_pthread_cond_wait(&mtctx->serial.ldmWindowCond, mutex); + } + DEBUGLOG(6, "Done waiting for LDM to finish"); + ZSTD_pthread_mutex_unlock(mutex); + } +} + +/** + * Attempts to set the inBuff to the next section to fill. + * If any part of the new section is still in use we give up. + * Returns non-zero if the buffer is filled. + */ +static int ZSTDMT_tryGetInputRange(ZSTDMT_CCtx* mtctx) +{ + range_t const inUse = ZSTDMT_getInputDataInUse(mtctx); + size_t const spaceLeft = mtctx->roundBuff.capacity - mtctx->roundBuff.pos; + size_t const target = mtctx->targetSectionSize; + buffer_t buffer; + + DEBUGLOG(5, "ZSTDMT_tryGetInputRange"); + assert(mtctx->inBuff.buffer.start == NULL); + assert(mtctx->roundBuff.capacity >= target); + + if (spaceLeft < target) { + /* ZSTD_invalidateRepCodes() doesn't work for extDict variants. + * Simply copy the prefix to the beginning in that case. + */ + BYTE* const start = (BYTE*)mtctx->roundBuff.buffer; + size_t const prefixSize = mtctx->inBuff.prefix.size; + + buffer.start = start; + buffer.capacity = prefixSize; + if (ZSTDMT_isOverlapped(buffer, inUse)) { + DEBUGLOG(5, "Waiting for buffer..."); + return 0; + } + ZSTDMT_waitForLdmComplete(mtctx, buffer); + ZSTD_memmove(start, mtctx->inBuff.prefix.start, prefixSize); + mtctx->inBuff.prefix.start = start; + mtctx->roundBuff.pos = prefixSize; + } + buffer.start = mtctx->roundBuff.buffer + mtctx->roundBuff.pos; + buffer.capacity = target; + + if (ZSTDMT_isOverlapped(buffer, inUse)) { + DEBUGLOG(5, "Waiting for buffer..."); + return 0; + } + assert(!ZSTDMT_isOverlapped(buffer, mtctx->inBuff.prefix)); + + ZSTDMT_waitForLdmComplete(mtctx, buffer); + + DEBUGLOG(5, "Using prefix range [%zx, %zx)", + (size_t)mtctx->inBuff.prefix.start, + (size_t)mtctx->inBuff.prefix.start + mtctx->inBuff.prefix.size); + DEBUGLOG(5, "Using source range [%zx, %zx)", + (size_t)buffer.start, + (size_t)buffer.start + buffer.capacity); + + + mtctx->inBuff.buffer = buffer; + mtctx->inBuff.filled = 0; + assert(mtctx->roundBuff.pos + buffer.capacity <= mtctx->roundBuff.capacity); + return 1; +} + +typedef struct { + size_t toLoad; /* The number of bytes to load from the input. */ + int flush; /* Boolean declaring if we must flush because we found a synchronization point. */ +} syncPoint_t; + +/** + * Searches through the input for a synchronization point. If one is found, we + * will instruct the caller to flush, and return the number of bytes to load. + * Otherwise, we will load as many bytes as possible and instruct the caller + * to continue as normal. + */ +static syncPoint_t +findSynchronizationPoint(ZSTDMT_CCtx const* mtctx, ZSTD_inBuffer const input) +{ + BYTE const* const istart = (BYTE const*)input.src + input.pos; + U64 const primePower = mtctx->rsync.primePower; + U64 const hitMask = mtctx->rsync.hitMask; + + syncPoint_t syncPoint; + U64 hash; + BYTE const* prev; + size_t pos; + + syncPoint.toLoad = MIN(input.size - input.pos, mtctx->targetSectionSize - mtctx->inBuff.filled); + syncPoint.flush = 0; + if (!mtctx->params.rsyncable) + /* Rsync is disabled. */ + return syncPoint; + if (mtctx->inBuff.filled + input.size - input.pos < RSYNC_MIN_BLOCK_SIZE) + /* We don't emit synchronization points if it would produce too small blocks. + * We don't have enough input to find a synchronization point, so don't look. + */ + return syncPoint; + if (mtctx->inBuff.filled + syncPoint.toLoad < RSYNC_LENGTH) + /* Not enough to compute the hash. + * We will miss any synchronization points in this RSYNC_LENGTH byte + * window. However, since it depends only in the internal buffers, if the + * state is already synchronized, we will remain synchronized. + * Additionally, the probability that we miss a synchronization point is + * low: RSYNC_LENGTH / targetSectionSize. + */ + return syncPoint; + /* Initialize the loop variables. */ + if (mtctx->inBuff.filled < RSYNC_MIN_BLOCK_SIZE) { + /* We don't need to scan the first RSYNC_MIN_BLOCK_SIZE positions + * because they can't possibly be a sync point. So we can start + * part way through the input buffer. + */ + pos = RSYNC_MIN_BLOCK_SIZE - mtctx->inBuff.filled; + if (pos >= RSYNC_LENGTH) { + prev = istart + pos - RSYNC_LENGTH; + hash = ZSTD_rollingHash_compute(prev, RSYNC_LENGTH); + } else { + assert(mtctx->inBuff.filled >= RSYNC_LENGTH); + prev = (BYTE const*)mtctx->inBuff.buffer.start + mtctx->inBuff.filled - RSYNC_LENGTH; + hash = ZSTD_rollingHash_compute(prev + pos, (RSYNC_LENGTH - pos)); + hash = ZSTD_rollingHash_append(hash, istart, pos); + } + } else { + /* We have enough bytes buffered to initialize the hash, + * and have processed enough bytes to find a sync point. + * Start scanning at the beginning of the input. + */ + assert(mtctx->inBuff.filled >= RSYNC_MIN_BLOCK_SIZE); + assert(RSYNC_MIN_BLOCK_SIZE >= RSYNC_LENGTH); + pos = 0; + prev = (BYTE const*)mtctx->inBuff.buffer.start + mtctx->inBuff.filled - RSYNC_LENGTH; + hash = ZSTD_rollingHash_compute(prev, RSYNC_LENGTH); + if ((hash & hitMask) == hitMask) { + /* We're already at a sync point so don't load any more until + * we're able to flush this sync point. + * This likely happened because the job table was full so we + * couldn't add our job. + */ + syncPoint.toLoad = 0; + syncPoint.flush = 1; + return syncPoint; + } + } + /* Starting with the hash of the previous RSYNC_LENGTH bytes, roll + * through the input. If we hit a synchronization point, then cut the + * job off, and tell the compressor to flush the job. Otherwise, load + * all the bytes and continue as normal. + * If we go too long without a synchronization point (targetSectionSize) + * then a block will be emitted anyways, but this is okay, since if we + * are already synchronized we will remain synchronized. + */ + assert(pos < RSYNC_LENGTH || ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); + for (; pos < syncPoint.toLoad; ++pos) { + BYTE const toRemove = pos < RSYNC_LENGTH ? prev[pos] : istart[pos - RSYNC_LENGTH]; + /* This assert is very expensive, and Debian compiles with asserts enabled. + * So disable it for now. We can get similar coverage by checking it at the + * beginning & end of the loop. + * assert(pos < RSYNC_LENGTH || ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); + */ + hash = ZSTD_rollingHash_rotate(hash, toRemove, istart[pos], primePower); + assert(mtctx->inBuff.filled + pos >= RSYNC_MIN_BLOCK_SIZE); + if ((hash & hitMask) == hitMask) { + syncPoint.toLoad = pos + 1; + syncPoint.flush = 1; + ++pos; /* for assert */ + break; + } + } + assert(pos < RSYNC_LENGTH || ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); + return syncPoint; +} + +size_t ZSTDMT_nextInputSizeHint(const ZSTDMT_CCtx* mtctx) +{ + size_t hintInSize = mtctx->targetSectionSize - mtctx->inBuff.filled; + if (hintInSize==0) hintInSize = mtctx->targetSectionSize; + return hintInSize; +} + +/** ZSTDMT_compressStream_generic() : + * internal use only - exposed to be invoked from zstd_compress.c + * assumption : output and input are valid (pos <= size) + * @return : minimum amount of data remaining to flush, 0 if none */ +size_t ZSTDMT_compressStream_generic(ZSTDMT_CCtx* mtctx, + ZSTD_outBuffer* output, + ZSTD_inBuffer* input, + ZSTD_EndDirective endOp) +{ + unsigned forwardInputProgress = 0; + DEBUGLOG(5, "ZSTDMT_compressStream_generic (endOp=%u, srcSize=%u)", + (U32)endOp, (U32)(input->size - input->pos)); + assert(output->pos <= output->size); + assert(input->pos <= input->size); + + if ((mtctx->frameEnded) && (endOp==ZSTD_e_continue)) { + /* current frame being ended. Only flush/end are allowed */ + return ERROR(stage_wrong); + } + + /* fill input buffer */ + if ( (!mtctx->jobReady) + && (input->size > input->pos) ) { /* support NULL input */ + if (mtctx->inBuff.buffer.start == NULL) { + assert(mtctx->inBuff.filled == 0); /* Can't fill an empty buffer */ + if (!ZSTDMT_tryGetInputRange(mtctx)) { + /* It is only possible for this operation to fail if there are + * still compression jobs ongoing. + */ + DEBUGLOG(5, "ZSTDMT_tryGetInputRange failed"); + assert(mtctx->doneJobID != mtctx->nextJobID); + } else + DEBUGLOG(5, "ZSTDMT_tryGetInputRange completed successfully : mtctx->inBuff.buffer.start = %p", mtctx->inBuff.buffer.start); + } + if (mtctx->inBuff.buffer.start != NULL) { + syncPoint_t const syncPoint = findSynchronizationPoint(mtctx, *input); + if (syncPoint.flush && endOp == ZSTD_e_continue) { + endOp = ZSTD_e_flush; + } + assert(mtctx->inBuff.buffer.capacity >= mtctx->targetSectionSize); + DEBUGLOG(5, "ZSTDMT_compressStream_generic: adding %u bytes on top of %u to buffer of size %u", + (U32)syncPoint.toLoad, (U32)mtctx->inBuff.filled, (U32)mtctx->targetSectionSize); + ZSTD_memcpy((char*)mtctx->inBuff.buffer.start + mtctx->inBuff.filled, (const char*)input->src + input->pos, syncPoint.toLoad); + input->pos += syncPoint.toLoad; + mtctx->inBuff.filled += syncPoint.toLoad; + forwardInputProgress = syncPoint.toLoad>0; + } + } + if ((input->pos < input->size) && (endOp == ZSTD_e_end)) { + /* Can't end yet because the input is not fully consumed. + * We are in one of these cases: + * - mtctx->inBuff is NULL & empty: we couldn't get an input buffer so don't create a new job. + * - We filled the input buffer: flush this job but don't end the frame. + * - We hit a synchronization point: flush this job but don't end the frame. + */ + assert(mtctx->inBuff.filled == 0 || mtctx->inBuff.filled == mtctx->targetSectionSize || mtctx->params.rsyncable); + endOp = ZSTD_e_flush; + } + + if ( (mtctx->jobReady) + || (mtctx->inBuff.filled >= mtctx->targetSectionSize) /* filled enough : let's compress */ + || ((endOp != ZSTD_e_continue) && (mtctx->inBuff.filled > 0)) /* something to flush : let's go */ + || ((endOp == ZSTD_e_end) && (!mtctx->frameEnded)) ) { /* must finish the frame with a zero-size block */ + size_t const jobSize = mtctx->inBuff.filled; + assert(mtctx->inBuff.filled <= mtctx->targetSectionSize); + FORWARD_IF_ERROR( ZSTDMT_createCompressionJob(mtctx, jobSize, endOp) , ""); + } + + /* check for potential compressed data ready to be flushed */ + { size_t const remainingToFlush = ZSTDMT_flushProduced(mtctx, output, !forwardInputProgress, endOp); /* block if there was no forward input progress */ + if (input->pos < input->size) return MAX(remainingToFlush, 1); /* input not consumed : do not end flush yet */ + DEBUGLOG(5, "end of ZSTDMT_compressStream_generic: remainingToFlush = %u", (U32)remainingToFlush); + return remainingToFlush; + } +} +/**** ended inlining compress/zstdmt_compress.c ****/ +#endif + +/**** start inlining decompress/huf_decompress.c ****/ +/* ****************************************************************** + * huff0 huffman decoder, + * part of Finite State Entropy library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +/* ************************************************************** +* Dependencies +****************************************************************/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../common/compiler.h ****/ +/**** skipping file: ../common/bitstream.h ****/ +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/huf.h ****/ +/**** skipping file: ../common/error_private.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: ../common/bits.h ****/ + +/* ************************************************************** +* Constants +****************************************************************/ + +#define HUF_DECODER_FAST_TABLELOG 11 + +/* ************************************************************** +* Macros +****************************************************************/ + +/* These two optional macros force the use one way or another of the two + * Huffman decompression implementations. You can't force in both directions + * at the same time. + */ +#if defined(HUF_FORCE_DECOMPRESS_X1) && \ + defined(HUF_FORCE_DECOMPRESS_X2) +#error "Cannot force the use of the X1 and X2 decoders at the same time!" +#endif + +/* When DYNAMIC_BMI2 is enabled, fast decoders are only called when bmi2 is + * supported at runtime, so we can add the BMI2 target attribute. + * When it is disabled, we will still get BMI2 if it is enabled statically. + */ +#if DYNAMIC_BMI2 +# define HUF_FAST_BMI2_ATTRS BMI2_TARGET_ATTRIBUTE +#else +# define HUF_FAST_BMI2_ATTRS +#endif + +#ifdef __cplusplus +# define HUF_EXTERN_C extern "C" +#else +# define HUF_EXTERN_C +#endif +#define HUF_ASM_DECL HUF_EXTERN_C + +#if DYNAMIC_BMI2 +# define HUF_NEED_BMI2_FUNCTION 1 +#else +# define HUF_NEED_BMI2_FUNCTION 0 +#endif + +/* ************************************************************** +* Error Management +****************************************************************/ +#define HUF_isError ERR_isError + + +/* ************************************************************** +* Byte alignment for workSpace management +****************************************************************/ +#define HUF_ALIGN(x, a) HUF_ALIGN_MASK((x), (a) - 1) +#define HUF_ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) + + +/* ************************************************************** +* BMI2 Variant Wrappers +****************************************************************/ +typedef size_t (*HUF_DecompressUsingDTableFn)(void *dst, size_t dstSize, + const void *cSrc, + size_t cSrcSize, + const HUF_DTable *DTable); + +#if DYNAMIC_BMI2 + +#define HUF_DGEN(fn) \ + \ + static size_t fn##_default( \ + void* dst, size_t dstSize, \ + const void* cSrc, size_t cSrcSize, \ + const HUF_DTable* DTable) \ + { \ + return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ + } \ + \ + static BMI2_TARGET_ATTRIBUTE size_t fn##_bmi2( \ + void* dst, size_t dstSize, \ + const void* cSrc, size_t cSrcSize, \ + const HUF_DTable* DTable) \ + { \ + return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ + } \ + \ + static size_t fn(void* dst, size_t dstSize, void const* cSrc, \ + size_t cSrcSize, HUF_DTable const* DTable, int flags) \ + { \ + if (flags & HUF_flags_bmi2) { \ + return fn##_bmi2(dst, dstSize, cSrc, cSrcSize, DTable); \ + } \ + return fn##_default(dst, dstSize, cSrc, cSrcSize, DTable); \ + } + +#else + +#define HUF_DGEN(fn) \ + static size_t fn(void* dst, size_t dstSize, void const* cSrc, \ + size_t cSrcSize, HUF_DTable const* DTable, int flags) \ + { \ + (void)flags; \ + return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ + } + +#endif + + +/*-***************************/ +/* generic DTableDesc */ +/*-***************************/ +typedef struct { BYTE maxTableLog; BYTE tableType; BYTE tableLog; BYTE reserved; } DTableDesc; + +static DTableDesc HUF_getDTableDesc(const HUF_DTable* table) +{ + DTableDesc dtd; + ZSTD_memcpy(&dtd, table, sizeof(dtd)); + return dtd; +} + +static size_t HUF_initFastDStream(BYTE const* ip) { + BYTE const lastByte = ip[7]; + size_t const bitsConsumed = lastByte ? 8 - ZSTD_highbit32(lastByte) : 0; + size_t const value = MEM_readLEST(ip) | 1; + assert(bitsConsumed <= 8); + assert(sizeof(size_t) == 8); + return value << bitsConsumed; +} + + +/** + * The input/output arguments to the Huffman fast decoding loop: + * + * ip [in/out] - The input pointers, must be updated to reflect what is consumed. + * op [in/out] - The output pointers, must be updated to reflect what is written. + * bits [in/out] - The bitstream containers, must be updated to reflect the current state. + * dt [in] - The decoding table. + * ilimit [in] - The input limit, stop when any input pointer is below ilimit. + * oend [in] - The end of the output stream. op[3] must not cross oend. + * iend [in] - The end of each input stream. ip[i] may cross iend[i], + * as long as it is above ilimit, but that indicates corruption. + */ +typedef struct { + BYTE const* ip[4]; + BYTE* op[4]; + U64 bits[4]; + void const* dt; + BYTE const* ilimit; + BYTE* oend; + BYTE const* iend[4]; +} HUF_DecompressFastArgs; + +typedef void (*HUF_DecompressFastLoopFn)(HUF_DecompressFastArgs*); + +/** + * Initializes args for the fast decoding loop. + * @returns 1 on success + * 0 if the fallback implementation should be used. + * Or an error code on failure. + */ +static size_t HUF_DecompressFastArgs_init(HUF_DecompressFastArgs* args, void* dst, size_t dstSize, void const* src, size_t srcSize, const HUF_DTable* DTable) +{ + void const* dt = DTable + 1; + U32 const dtLog = HUF_getDTableDesc(DTable).tableLog; + + const BYTE* const ilimit = (const BYTE*)src + 6 + 8; + + BYTE* const oend = (BYTE*)dst + dstSize; + + /* The fast decoding loop assumes 64-bit little-endian. + * This condition is false on x32. + */ + if (!MEM_isLittleEndian() || MEM_32bits()) + return 0; + + /* strict minimum : jump table + 1 byte per stream */ + if (srcSize < 10) + return ERROR(corruption_detected); + + /* Must have at least 8 bytes per stream because we don't handle initializing smaller bit containers. + * If table log is not correct at this point, fallback to the old decoder. + * On small inputs we don't have enough data to trigger the fast loop, so use the old decoder. + */ + if (dtLog != HUF_DECODER_FAST_TABLELOG) + return 0; + + /* Read the jump table. */ + { + const BYTE* const istart = (const BYTE*)src; + size_t const length1 = MEM_readLE16(istart); + size_t const length2 = MEM_readLE16(istart+2); + size_t const length3 = MEM_readLE16(istart+4); + size_t const length4 = srcSize - (length1 + length2 + length3 + 6); + args->iend[0] = istart + 6; /* jumpTable */ + args->iend[1] = args->iend[0] + length1; + args->iend[2] = args->iend[1] + length2; + args->iend[3] = args->iend[2] + length3; + + /* HUF_initFastDStream() requires this, and this small of an input + * won't benefit from the ASM loop anyways. + * length1 must be >= 16 so that ip[0] >= ilimit before the loop + * starts. + */ + if (length1 < 16 || length2 < 8 || length3 < 8 || length4 < 8) + return 0; + if (length4 > srcSize) return ERROR(corruption_detected); /* overflow */ + } + /* ip[] contains the position that is currently loaded into bits[]. */ + args->ip[0] = args->iend[1] - sizeof(U64); + args->ip[1] = args->iend[2] - sizeof(U64); + args->ip[2] = args->iend[3] - sizeof(U64); + args->ip[3] = (BYTE const*)src + srcSize - sizeof(U64); + + /* op[] contains the output pointers. */ + args->op[0] = (BYTE*)dst; + args->op[1] = args->op[0] + (dstSize+3)/4; + args->op[2] = args->op[1] + (dstSize+3)/4; + args->op[3] = args->op[2] + (dstSize+3)/4; + + /* No point to call the ASM loop for tiny outputs. */ + if (args->op[3] >= oend) + return 0; + + /* bits[] is the bit container. + * It is read from the MSB down to the LSB. + * It is shifted left as it is read, and zeros are + * shifted in. After the lowest valid bit a 1 is + * set, so that CountTrailingZeros(bits[]) can be used + * to count how many bits we've consumed. + */ + args->bits[0] = HUF_initFastDStream(args->ip[0]); + args->bits[1] = HUF_initFastDStream(args->ip[1]); + args->bits[2] = HUF_initFastDStream(args->ip[2]); + args->bits[3] = HUF_initFastDStream(args->ip[3]); + + /* If ip[] >= ilimit, it is guaranteed to be safe to + * reload bits[]. It may be beyond its section, but is + * guaranteed to be valid (>= istart). + */ + args->ilimit = ilimit; + + args->oend = oend; + args->dt = dt; + + return 1; +} + +static size_t HUF_initRemainingDStream(BIT_DStream_t* bit, HUF_DecompressFastArgs const* args, int stream, BYTE* segmentEnd) +{ + /* Validate that we haven't overwritten. */ + if (args->op[stream] > segmentEnd) + return ERROR(corruption_detected); + /* Validate that we haven't read beyond iend[]. + * Note that ip[] may be < iend[] because the MSB is + * the next bit to read, and we may have consumed 100% + * of the stream, so down to iend[i] - 8 is valid. + */ + if (args->ip[stream] < args->iend[stream] - 8) + return ERROR(corruption_detected); + + /* Construct the BIT_DStream_t. */ + assert(sizeof(size_t) == 8); + bit->bitContainer = MEM_readLEST(args->ip[stream]); + bit->bitsConsumed = ZSTD_countTrailingZeros64(args->bits[stream]); + bit->start = (const char*)args->iend[0]; + bit->limitPtr = bit->start + sizeof(size_t); + bit->ptr = (const char*)args->ip[stream]; + + return 0; +} + + +#ifndef HUF_FORCE_DECOMPRESS_X2 + +/*-***************************/ +/* single-symbol decoding */ +/*-***************************/ +typedef struct { BYTE nbBits; BYTE byte; } HUF_DEltX1; /* single-symbol decoding */ + +/** + * Packs 4 HUF_DEltX1 structs into a U64. This is used to lay down 4 entries at + * a time. + */ +static U64 HUF_DEltX1_set4(BYTE symbol, BYTE nbBits) { + U64 D4; + if (MEM_isLittleEndian()) { + D4 = (U64)((symbol << 8) + nbBits); + } else { + D4 = (U64)(symbol + (nbBits << 8)); + } + assert(D4 < (1U << 16)); + D4 *= 0x0001000100010001ULL; + return D4; +} + +/** + * Increase the tableLog to targetTableLog and rescales the stats. + * If tableLog > targetTableLog this is a no-op. + * @returns New tableLog + */ +static U32 HUF_rescaleStats(BYTE* huffWeight, U32* rankVal, U32 nbSymbols, U32 tableLog, U32 targetTableLog) +{ + if (tableLog > targetTableLog) + return tableLog; + if (tableLog < targetTableLog) { + U32 const scale = targetTableLog - tableLog; + U32 s; + /* Increase the weight for all non-zero probability symbols by scale. */ + for (s = 0; s < nbSymbols; ++s) { + huffWeight[s] += (BYTE)((huffWeight[s] == 0) ? 0 : scale); + } + /* Update rankVal to reflect the new weights. + * All weights except 0 get moved to weight + scale. + * Weights [1, scale] are empty. + */ + for (s = targetTableLog; s > scale; --s) { + rankVal[s] = rankVal[s - scale]; + } + for (s = scale; s > 0; --s) { + rankVal[s] = 0; + } + } + return targetTableLog; +} + +typedef struct { + U32 rankVal[HUF_TABLELOG_ABSOLUTEMAX + 1]; + U32 rankStart[HUF_TABLELOG_ABSOLUTEMAX + 1]; + U32 statsWksp[HUF_READ_STATS_WORKSPACE_SIZE_U32]; + BYTE symbols[HUF_SYMBOLVALUE_MAX + 1]; + BYTE huffWeight[HUF_SYMBOLVALUE_MAX + 1]; +} HUF_ReadDTableX1_Workspace; + +size_t HUF_readDTableX1_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int flags) +{ + U32 tableLog = 0; + U32 nbSymbols = 0; + size_t iSize; + void* const dtPtr = DTable + 1; + HUF_DEltX1* const dt = (HUF_DEltX1*)dtPtr; + HUF_ReadDTableX1_Workspace* wksp = (HUF_ReadDTableX1_Workspace*)workSpace; + + DEBUG_STATIC_ASSERT(HUF_DECOMPRESS_WORKSPACE_SIZE >= sizeof(*wksp)); + if (sizeof(*wksp) > wkspSize) return ERROR(tableLog_tooLarge); + + DEBUG_STATIC_ASSERT(sizeof(DTableDesc) == sizeof(HUF_DTable)); + /* ZSTD_memset(huffWeight, 0, sizeof(huffWeight)); */ /* is not necessary, even though some analyzer complain ... */ + + iSize = HUF_readStats_wksp(wksp->huffWeight, HUF_SYMBOLVALUE_MAX + 1, wksp->rankVal, &nbSymbols, &tableLog, src, srcSize, wksp->statsWksp, sizeof(wksp->statsWksp), flags); + if (HUF_isError(iSize)) return iSize; + + + /* Table header */ + { DTableDesc dtd = HUF_getDTableDesc(DTable); + U32 const maxTableLog = dtd.maxTableLog + 1; + U32 const targetTableLog = MIN(maxTableLog, HUF_DECODER_FAST_TABLELOG); + tableLog = HUF_rescaleStats(wksp->huffWeight, wksp->rankVal, nbSymbols, tableLog, targetTableLog); + if (tableLog > (U32)(dtd.maxTableLog+1)) return ERROR(tableLog_tooLarge); /* DTable too small, Huffman tree cannot fit in */ + dtd.tableType = 0; + dtd.tableLog = (BYTE)tableLog; + ZSTD_memcpy(DTable, &dtd, sizeof(dtd)); + } + + /* Compute symbols and rankStart given rankVal: + * + * rankVal already contains the number of values of each weight. + * + * symbols contains the symbols ordered by weight. First are the rankVal[0] + * weight 0 symbols, followed by the rankVal[1] weight 1 symbols, and so on. + * symbols[0] is filled (but unused) to avoid a branch. + * + * rankStart contains the offset where each rank belongs in the DTable. + * rankStart[0] is not filled because there are no entries in the table for + * weight 0. + */ + { int n; + U32 nextRankStart = 0; + int const unroll = 4; + int const nLimit = (int)nbSymbols - unroll + 1; + for (n=0; n<(int)tableLog+1; n++) { + U32 const curr = nextRankStart; + nextRankStart += wksp->rankVal[n]; + wksp->rankStart[n] = curr; + } + for (n=0; n < nLimit; n += unroll) { + int u; + for (u=0; u < unroll; ++u) { + size_t const w = wksp->huffWeight[n+u]; + wksp->symbols[wksp->rankStart[w]++] = (BYTE)(n+u); + } + } + for (; n < (int)nbSymbols; ++n) { + size_t const w = wksp->huffWeight[n]; + wksp->symbols[wksp->rankStart[w]++] = (BYTE)n; + } + } + + /* fill DTable + * We fill all entries of each weight in order. + * That way length is a constant for each iteration of the outer loop. + * We can switch based on the length to a different inner loop which is + * optimized for that particular case. + */ + { U32 w; + int symbol = wksp->rankVal[0]; + int rankStart = 0; + for (w=1; wrankVal[w]; + int const length = (1 << w) >> 1; + int uStart = rankStart; + BYTE const nbBits = (BYTE)(tableLog + 1 - w); + int s; + int u; + switch (length) { + case 1: + for (s=0; ssymbols[symbol + s]; + D.nbBits = nbBits; + dt[uStart] = D; + uStart += 1; + } + break; + case 2: + for (s=0; ssymbols[symbol + s]; + D.nbBits = nbBits; + dt[uStart+0] = D; + dt[uStart+1] = D; + uStart += 2; + } + break; + case 4: + for (s=0; ssymbols[symbol + s], nbBits); + MEM_write64(dt + uStart, D4); + uStart += 4; + } + break; + case 8: + for (s=0; ssymbols[symbol + s], nbBits); + MEM_write64(dt + uStart, D4); + MEM_write64(dt + uStart + 4, D4); + uStart += 8; + } + break; + default: + for (s=0; ssymbols[symbol + s], nbBits); + for (u=0; u < length; u += 16) { + MEM_write64(dt + uStart + u + 0, D4); + MEM_write64(dt + uStart + u + 4, D4); + MEM_write64(dt + uStart + u + 8, D4); + MEM_write64(dt + uStart + u + 12, D4); + } + assert(u == length); + uStart += length; + } + break; + } + symbol += symbolCount; + rankStart += symbolCount * length; + } + } + return iSize; +} + +FORCE_INLINE_TEMPLATE BYTE +HUF_decodeSymbolX1(BIT_DStream_t* Dstream, const HUF_DEltX1* dt, const U32 dtLog) +{ + size_t const val = BIT_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */ + BYTE const c = dt[val].byte; + BIT_skipBits(Dstream, dt[val].nbBits); + return c; +} + +#define HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) \ + *ptr++ = HUF_decodeSymbolX1(DStreamPtr, dt, dtLog) + +#define HUF_DECODE_SYMBOLX1_1(ptr, DStreamPtr) \ + if (MEM_64bits() || (HUF_TABLELOG_MAX<=12)) \ + HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) + +#define HUF_DECODE_SYMBOLX1_2(ptr, DStreamPtr) \ + if (MEM_64bits()) \ + HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) + +HINT_INLINE size_t +HUF_decodeStreamX1(BYTE* p, BIT_DStream_t* const bitDPtr, BYTE* const pEnd, const HUF_DEltX1* const dt, const U32 dtLog) +{ + BYTE* const pStart = p; + + /* up to 4 symbols at a time */ + if ((pEnd - p) > 3) { + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-3)) { + HUF_DECODE_SYMBOLX1_2(p, bitDPtr); + HUF_DECODE_SYMBOLX1_1(p, bitDPtr); + HUF_DECODE_SYMBOLX1_2(p, bitDPtr); + HUF_DECODE_SYMBOLX1_0(p, bitDPtr); + } + } else { + BIT_reloadDStream(bitDPtr); + } + + /* [0-3] symbols remaining */ + if (MEM_32bits()) + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd)) + HUF_DECODE_SYMBOLX1_0(p, bitDPtr); + + /* no more data to retrieve from bitstream, no need to reload */ + while (p < pEnd) + HUF_DECODE_SYMBOLX1_0(p, bitDPtr); + + return (size_t)(pEnd-pStart); +} + +FORCE_INLINE_TEMPLATE size_t +HUF_decompress1X1_usingDTable_internal_body( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + BYTE* op = (BYTE*)dst; + BYTE* const oend = op + dstSize; + const void* dtPtr = DTable + 1; + const HUF_DEltX1* const dt = (const HUF_DEltX1*)dtPtr; + BIT_DStream_t bitD; + DTableDesc const dtd = HUF_getDTableDesc(DTable); + U32 const dtLog = dtd.tableLog; + + CHECK_F( BIT_initDStream(&bitD, cSrc, cSrcSize) ); + + HUF_decodeStreamX1(op, &bitD, oend, dt, dtLog); + + if (!BIT_endOfDStream(&bitD)) return ERROR(corruption_detected); + + return dstSize; +} + +/* HUF_decompress4X1_usingDTable_internal_body(): + * Conditions : + * @dstSize >= 6 + */ +FORCE_INLINE_TEMPLATE size_t +HUF_decompress4X1_usingDTable_internal_body( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + /* Check */ + if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */ + + { const BYTE* const istart = (const BYTE*) cSrc; + BYTE* const ostart = (BYTE*) dst; + BYTE* const oend = ostart + dstSize; + BYTE* const olimit = oend - 3; + const void* const dtPtr = DTable + 1; + const HUF_DEltX1* const dt = (const HUF_DEltX1*)dtPtr; + + /* Init */ + BIT_DStream_t bitD1; + BIT_DStream_t bitD2; + BIT_DStream_t bitD3; + BIT_DStream_t bitD4; + size_t const length1 = MEM_readLE16(istart); + size_t const length2 = MEM_readLE16(istart+2); + size_t const length3 = MEM_readLE16(istart+4); + size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6); + const BYTE* const istart1 = istart + 6; /* jumpTable */ + const BYTE* const istart2 = istart1 + length1; + const BYTE* const istart3 = istart2 + length2; + const BYTE* const istart4 = istart3 + length3; + const size_t segmentSize = (dstSize+3) / 4; + BYTE* const opStart2 = ostart + segmentSize; + BYTE* const opStart3 = opStart2 + segmentSize; + BYTE* const opStart4 = opStart3 + segmentSize; + BYTE* op1 = ostart; + BYTE* op2 = opStart2; + BYTE* op3 = opStart3; + BYTE* op4 = opStart4; + DTableDesc const dtd = HUF_getDTableDesc(DTable); + U32 const dtLog = dtd.tableLog; + U32 endSignal = 1; + + if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */ + if (opStart4 > oend) return ERROR(corruption_detected); /* overflow */ + if (dstSize < 6) return ERROR(corruption_detected); /* stream 4-split doesn't work */ + CHECK_F( BIT_initDStream(&bitD1, istart1, length1) ); + CHECK_F( BIT_initDStream(&bitD2, istart2, length2) ); + CHECK_F( BIT_initDStream(&bitD3, istart3, length3) ); + CHECK_F( BIT_initDStream(&bitD4, istart4, length4) ); + + /* up to 16 symbols per loop (4 symbols per stream) in 64-bit mode */ + if ((size_t)(oend - op4) >= sizeof(size_t)) { + for ( ; (endSignal) & (op4 < olimit) ; ) { + HUF_DECODE_SYMBOLX1_2(op1, &bitD1); + HUF_DECODE_SYMBOLX1_2(op2, &bitD2); + HUF_DECODE_SYMBOLX1_2(op3, &bitD3); + HUF_DECODE_SYMBOLX1_2(op4, &bitD4); + HUF_DECODE_SYMBOLX1_1(op1, &bitD1); + HUF_DECODE_SYMBOLX1_1(op2, &bitD2); + HUF_DECODE_SYMBOLX1_1(op3, &bitD3); + HUF_DECODE_SYMBOLX1_1(op4, &bitD4); + HUF_DECODE_SYMBOLX1_2(op1, &bitD1); + HUF_DECODE_SYMBOLX1_2(op2, &bitD2); + HUF_DECODE_SYMBOLX1_2(op3, &bitD3); + HUF_DECODE_SYMBOLX1_2(op4, &bitD4); + HUF_DECODE_SYMBOLX1_0(op1, &bitD1); + HUF_DECODE_SYMBOLX1_0(op2, &bitD2); + HUF_DECODE_SYMBOLX1_0(op3, &bitD3); + HUF_DECODE_SYMBOLX1_0(op4, &bitD4); + endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; + } + } + + /* check corruption */ + /* note : should not be necessary : op# advance in lock step, and we control op4. + * but curiously, binary generated by gcc 7.2 & 7.3 with -mbmi2 runs faster when >=1 test is present */ + if (op1 > opStart2) return ERROR(corruption_detected); + if (op2 > opStart3) return ERROR(corruption_detected); + if (op3 > opStart4) return ERROR(corruption_detected); + /* note : op4 supposed already verified within main loop */ + + /* finish bitStreams one by one */ + HUF_decodeStreamX1(op1, &bitD1, opStart2, dt, dtLog); + HUF_decodeStreamX1(op2, &bitD2, opStart3, dt, dtLog); + HUF_decodeStreamX1(op3, &bitD3, opStart4, dt, dtLog); + HUF_decodeStreamX1(op4, &bitD4, oend, dt, dtLog); + + /* check */ + { U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4); + if (!endCheck) return ERROR(corruption_detected); } + + /* decoded size */ + return dstSize; + } +} + +#if HUF_NEED_BMI2_FUNCTION +static BMI2_TARGET_ATTRIBUTE +size_t HUF_decompress4X1_usingDTable_internal_bmi2(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X1_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} +#endif + +static +size_t HUF_decompress4X1_usingDTable_internal_default(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X1_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 + +HUF_ASM_DECL void HUF_decompress4X1_usingDTable_internal_fast_asm_loop(HUF_DecompressFastArgs* args) ZSTDLIB_HIDDEN; + +#endif + +static HUF_FAST_BMI2_ATTRS +void HUF_decompress4X1_usingDTable_internal_fast_c_loop(HUF_DecompressFastArgs* args) +{ + U64 bits[4]; + BYTE const* ip[4]; + BYTE* op[4]; + U16 const* const dtable = (U16 const*)args->dt; + BYTE* const oend = args->oend; + BYTE const* const ilimit = args->ilimit; + + /* Copy the arguments to local variables */ + ZSTD_memcpy(&bits, &args->bits, sizeof(bits)); + ZSTD_memcpy((void*)(&ip), &args->ip, sizeof(ip)); + ZSTD_memcpy(&op, &args->op, sizeof(op)); + + assert(MEM_isLittleEndian()); + assert(!MEM_32bits()); + + for (;;) { + BYTE* olimit; + int stream; + int symbol; + + /* Assert loop preconditions */ +#ifndef NDEBUG + for (stream = 0; stream < 4; ++stream) { + assert(op[stream] <= (stream == 3 ? oend : op[stream + 1])); + assert(ip[stream] >= ilimit); + } +#endif + /* Compute olimit */ + { + /* Each iteration produces 5 output symbols per stream */ + size_t const oiters = (size_t)(oend - op[3]) / 5; + /* Each iteration consumes up to 11 bits * 5 = 55 bits < 7 bytes + * per stream. + */ + size_t const iiters = (size_t)(ip[0] - ilimit) / 7; + /* We can safely run iters iterations before running bounds checks */ + size_t const iters = MIN(oiters, iiters); + size_t const symbols = iters * 5; + + /* We can simply check that op[3] < olimit, instead of checking all + * of our bounds, since we can't hit the other bounds until we've run + * iters iterations, which only happens when op[3] == olimit. + */ + olimit = op[3] + symbols; + + /* Exit fast decoding loop once we get close to the end. */ + if (op[3] + 20 > olimit) + break; + + /* Exit the decoding loop if any input pointer has crossed the + * previous one. This indicates corruption, and a precondition + * to our loop is that ip[i] >= ip[0]. + */ + for (stream = 1; stream < 4; ++stream) { + if (ip[stream] < ip[stream - 1]) + goto _out; + } + } + +#ifndef NDEBUG + for (stream = 1; stream < 4; ++stream) { + assert(ip[stream] >= ip[stream - 1]); + } +#endif + + do { + /* Decode 5 symbols in each of the 4 streams */ + for (symbol = 0; symbol < 5; ++symbol) { + for (stream = 0; stream < 4; ++stream) { + int const index = (int)(bits[stream] >> 53); + int const entry = (int)dtable[index]; + bits[stream] <<= (entry & 63); + op[stream][symbol] = (BYTE)((entry >> 8) & 0xFF); + } + } + /* Reload the bitstreams */ + for (stream = 0; stream < 4; ++stream) { + int const ctz = ZSTD_countTrailingZeros64(bits[stream]); + int const nbBits = ctz & 7; + int const nbBytes = ctz >> 3; + op[stream] += 5; + ip[stream] -= nbBytes; + bits[stream] = MEM_read64(ip[stream]) | 1; + bits[stream] <<= nbBits; + } + } while (op[3] < olimit); + } + +_out: + + /* Save the final values of each of the state variables back to args. */ + ZSTD_memcpy(&args->bits, &bits, sizeof(bits)); + ZSTD_memcpy((void*)(&args->ip), &ip, sizeof(ip)); + ZSTD_memcpy(&args->op, &op, sizeof(op)); +} + +/** + * @returns @p dstSize on success (>= 6) + * 0 if the fallback implementation should be used + * An error if an error occurred + */ +static HUF_FAST_BMI2_ATTRS +size_t +HUF_decompress4X1_usingDTable_internal_fast( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable, + HUF_DecompressFastLoopFn loopFn) +{ + void const* dt = DTable + 1; + const BYTE* const iend = (const BYTE*)cSrc + 6; + BYTE* const oend = (BYTE*)dst + dstSize; + HUF_DecompressFastArgs args; + { size_t const ret = HUF_DecompressFastArgs_init(&args, dst, dstSize, cSrc, cSrcSize, DTable); + FORWARD_IF_ERROR(ret, "Failed to init fast loop args"); + if (ret == 0) + return 0; + } + + assert(args.ip[0] >= args.ilimit); + loopFn(&args); + + /* Our loop guarantees that ip[] >= ilimit and that we haven't + * overwritten any op[]. + */ + assert(args.ip[0] >= iend); + assert(args.ip[1] >= iend); + assert(args.ip[2] >= iend); + assert(args.ip[3] >= iend); + assert(args.op[3] <= oend); + (void)iend; + + /* finish bit streams one by one. */ + { size_t const segmentSize = (dstSize+3) / 4; + BYTE* segmentEnd = (BYTE*)dst; + int i; + for (i = 0; i < 4; ++i) { + BIT_DStream_t bit; + if (segmentSize <= (size_t)(oend - segmentEnd)) + segmentEnd += segmentSize; + else + segmentEnd = oend; + FORWARD_IF_ERROR(HUF_initRemainingDStream(&bit, &args, i, segmentEnd), "corruption"); + /* Decompress and validate that we've produced exactly the expected length. */ + args.op[i] += HUF_decodeStreamX1(args.op[i], &bit, segmentEnd, (HUF_DEltX1 const*)dt, HUF_DECODER_FAST_TABLELOG); + if (args.op[i] != segmentEnd) return ERROR(corruption_detected); + } + } + + /* decoded size */ + assert(dstSize != 0); + return dstSize; +} + +HUF_DGEN(HUF_decompress1X1_usingDTable_internal) + +static size_t HUF_decompress4X1_usingDTable_internal(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable, int flags) +{ + HUF_DecompressUsingDTableFn fallbackFn = HUF_decompress4X1_usingDTable_internal_default; + HUF_DecompressFastLoopFn loopFn = HUF_decompress4X1_usingDTable_internal_fast_c_loop; + +#if DYNAMIC_BMI2 + if (flags & HUF_flags_bmi2) { + fallbackFn = HUF_decompress4X1_usingDTable_internal_bmi2; +# if ZSTD_ENABLE_ASM_X86_64_BMI2 + if (!(flags & HUF_flags_disableAsm)) { + loopFn = HUF_decompress4X1_usingDTable_internal_fast_asm_loop; + } +# endif + } else { + return fallbackFn(dst, dstSize, cSrc, cSrcSize, DTable); + } +#endif + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__) + if (!(flags & HUF_flags_disableAsm)) { + loopFn = HUF_decompress4X1_usingDTable_internal_fast_asm_loop; + } +#endif + + if (!(flags & HUF_flags_disableFast)) { + size_t const ret = HUF_decompress4X1_usingDTable_internal_fast(dst, dstSize, cSrc, cSrcSize, DTable, loopFn); + if (ret != 0) + return ret; + } + return fallbackFn(dst, dstSize, cSrc, cSrcSize, DTable); +} + +static size_t HUF_decompress4X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + void* workSpace, size_t wkspSize, int flags) +{ + const BYTE* ip = (const BYTE*) cSrc; + + size_t const hSize = HUF_readDTableX1_wksp(dctx, cSrc, cSrcSize, workSpace, wkspSize, flags); + if (HUF_isError(hSize)) return hSize; + if (hSize >= cSrcSize) return ERROR(srcSize_wrong); + ip += hSize; cSrcSize -= hSize; + + return HUF_decompress4X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, flags); +} + +#endif /* HUF_FORCE_DECOMPRESS_X2 */ + + +#ifndef HUF_FORCE_DECOMPRESS_X1 + +/* *************************/ +/* double-symbols decoding */ +/* *************************/ + +typedef struct { U16 sequence; BYTE nbBits; BYTE length; } HUF_DEltX2; /* double-symbols decoding */ +typedef struct { BYTE symbol; } sortedSymbol_t; +typedef U32 rankValCol_t[HUF_TABLELOG_MAX + 1]; +typedef rankValCol_t rankVal_t[HUF_TABLELOG_MAX]; + +/** + * Constructs a HUF_DEltX2 in a U32. + */ +static U32 HUF_buildDEltX2U32(U32 symbol, U32 nbBits, U32 baseSeq, int level) +{ + U32 seq; + DEBUG_STATIC_ASSERT(offsetof(HUF_DEltX2, sequence) == 0); + DEBUG_STATIC_ASSERT(offsetof(HUF_DEltX2, nbBits) == 2); + DEBUG_STATIC_ASSERT(offsetof(HUF_DEltX2, length) == 3); + DEBUG_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(U32)); + if (MEM_isLittleEndian()) { + seq = level == 1 ? symbol : (baseSeq + (symbol << 8)); + return seq + (nbBits << 16) + ((U32)level << 24); + } else { + seq = level == 1 ? (symbol << 8) : ((baseSeq << 8) + symbol); + return (seq << 16) + (nbBits << 8) + (U32)level; + } +} + +/** + * Constructs a HUF_DEltX2. + */ +static HUF_DEltX2 HUF_buildDEltX2(U32 symbol, U32 nbBits, U32 baseSeq, int level) +{ + HUF_DEltX2 DElt; + U32 const val = HUF_buildDEltX2U32(symbol, nbBits, baseSeq, level); + DEBUG_STATIC_ASSERT(sizeof(DElt) == sizeof(val)); + ZSTD_memcpy(&DElt, &val, sizeof(val)); + return DElt; +} + +/** + * Constructs 2 HUF_DEltX2s and packs them into a U64. + */ +static U64 HUF_buildDEltX2U64(U32 symbol, U32 nbBits, U16 baseSeq, int level) +{ + U32 DElt = HUF_buildDEltX2U32(symbol, nbBits, baseSeq, level); + return (U64)DElt + ((U64)DElt << 32); +} + +/** + * Fills the DTable rank with all the symbols from [begin, end) that are each + * nbBits long. + * + * @param DTableRank The start of the rank in the DTable. + * @param begin The first symbol to fill (inclusive). + * @param end The last symbol to fill (exclusive). + * @param nbBits Each symbol is nbBits long. + * @param tableLog The table log. + * @param baseSeq If level == 1 { 0 } else { the first level symbol } + * @param level The level in the table. Must be 1 or 2. + */ +static void HUF_fillDTableX2ForWeight( + HUF_DEltX2* DTableRank, + sortedSymbol_t const* begin, sortedSymbol_t const* end, + U32 nbBits, U32 tableLog, + U16 baseSeq, int const level) +{ + U32 const length = 1U << ((tableLog - nbBits) & 0x1F /* quiet static-analyzer */); + const sortedSymbol_t* ptr; + assert(level >= 1 && level <= 2); + switch (length) { + case 1: + for (ptr = begin; ptr != end; ++ptr) { + HUF_DEltX2 const DElt = HUF_buildDEltX2(ptr->symbol, nbBits, baseSeq, level); + *DTableRank++ = DElt; + } + break; + case 2: + for (ptr = begin; ptr != end; ++ptr) { + HUF_DEltX2 const DElt = HUF_buildDEltX2(ptr->symbol, nbBits, baseSeq, level); + DTableRank[0] = DElt; + DTableRank[1] = DElt; + DTableRank += 2; + } + break; + case 4: + for (ptr = begin; ptr != end; ++ptr) { + U64 const DEltX2 = HUF_buildDEltX2U64(ptr->symbol, nbBits, baseSeq, level); + ZSTD_memcpy(DTableRank + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 2, &DEltX2, sizeof(DEltX2)); + DTableRank += 4; + } + break; + case 8: + for (ptr = begin; ptr != end; ++ptr) { + U64 const DEltX2 = HUF_buildDEltX2U64(ptr->symbol, nbBits, baseSeq, level); + ZSTD_memcpy(DTableRank + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 2, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 4, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 6, &DEltX2, sizeof(DEltX2)); + DTableRank += 8; + } + break; + default: + for (ptr = begin; ptr != end; ++ptr) { + U64 const DEltX2 = HUF_buildDEltX2U64(ptr->symbol, nbBits, baseSeq, level); + HUF_DEltX2* const DTableRankEnd = DTableRank + length; + for (; DTableRank != DTableRankEnd; DTableRank += 8) { + ZSTD_memcpy(DTableRank + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 2, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 4, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 6, &DEltX2, sizeof(DEltX2)); + } + } + break; + } +} + +/* HUF_fillDTableX2Level2() : + * `rankValOrigin` must be a table of at least (HUF_TABLELOG_MAX + 1) U32 */ +static void HUF_fillDTableX2Level2(HUF_DEltX2* DTable, U32 targetLog, const U32 consumedBits, + const U32* rankVal, const int minWeight, const int maxWeight1, + const sortedSymbol_t* sortedSymbols, U32 const* rankStart, + U32 nbBitsBaseline, U16 baseSeq) +{ + /* Fill skipped values (all positions up to rankVal[minWeight]). + * These are positions only get a single symbol because the combined weight + * is too large. + */ + if (minWeight>1) { + U32 const length = 1U << ((targetLog - consumedBits) & 0x1F /* quiet static-analyzer */); + U64 const DEltX2 = HUF_buildDEltX2U64(baseSeq, consumedBits, /* baseSeq */ 0, /* level */ 1); + int const skipSize = rankVal[minWeight]; + assert(length > 1); + assert((U32)skipSize < length); + switch (length) { + case 2: + assert(skipSize == 1); + ZSTD_memcpy(DTable, &DEltX2, sizeof(DEltX2)); + break; + case 4: + assert(skipSize <= 4); + ZSTD_memcpy(DTable + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + 2, &DEltX2, sizeof(DEltX2)); + break; + default: + { + int i; + for (i = 0; i < skipSize; i += 8) { + ZSTD_memcpy(DTable + i + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + i + 2, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + i + 4, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + i + 6, &DEltX2, sizeof(DEltX2)); + } + } + } + } + + /* Fill each of the second level symbols by weight. */ + { + int w; + for (w = minWeight; w < maxWeight1; ++w) { + int const begin = rankStart[w]; + int const end = rankStart[w+1]; + U32 const nbBits = nbBitsBaseline - w; + U32 const totalBits = nbBits + consumedBits; + HUF_fillDTableX2ForWeight( + DTable + rankVal[w], + sortedSymbols + begin, sortedSymbols + end, + totalBits, targetLog, + baseSeq, /* level */ 2); + } + } +} + +static void HUF_fillDTableX2(HUF_DEltX2* DTable, const U32 targetLog, + const sortedSymbol_t* sortedList, + const U32* rankStart, rankValCol_t* rankValOrigin, const U32 maxWeight, + const U32 nbBitsBaseline) +{ + U32* const rankVal = rankValOrigin[0]; + const int scaleLog = nbBitsBaseline - targetLog; /* note : targetLog >= srcLog, hence scaleLog <= 1 */ + const U32 minBits = nbBitsBaseline - maxWeight; + int w; + int const wEnd = (int)maxWeight + 1; + + /* Fill DTable in order of weight. */ + for (w = 1; w < wEnd; ++w) { + int const begin = (int)rankStart[w]; + int const end = (int)rankStart[w+1]; + U32 const nbBits = nbBitsBaseline - w; + + if (targetLog-nbBits >= minBits) { + /* Enough room for a second symbol. */ + int start = rankVal[w]; + U32 const length = 1U << ((targetLog - nbBits) & 0x1F /* quiet static-analyzer */); + int minWeight = nbBits + scaleLog; + int s; + if (minWeight < 1) minWeight = 1; + /* Fill the DTable for every symbol of weight w. + * These symbols get at least 1 second symbol. + */ + for (s = begin; s != end; ++s) { + HUF_fillDTableX2Level2( + DTable + start, targetLog, nbBits, + rankValOrigin[nbBits], minWeight, wEnd, + sortedList, rankStart, + nbBitsBaseline, sortedList[s].symbol); + start += length; + } + } else { + /* Only a single symbol. */ + HUF_fillDTableX2ForWeight( + DTable + rankVal[w], + sortedList + begin, sortedList + end, + nbBits, targetLog, + /* baseSeq */ 0, /* level */ 1); + } + } +} + +typedef struct { + rankValCol_t rankVal[HUF_TABLELOG_MAX]; + U32 rankStats[HUF_TABLELOG_MAX + 1]; + U32 rankStart0[HUF_TABLELOG_MAX + 3]; + sortedSymbol_t sortedSymbol[HUF_SYMBOLVALUE_MAX + 1]; + BYTE weightList[HUF_SYMBOLVALUE_MAX + 1]; + U32 calleeWksp[HUF_READ_STATS_WORKSPACE_SIZE_U32]; +} HUF_ReadDTableX2_Workspace; + +size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, + const void* src, size_t srcSize, + void* workSpace, size_t wkspSize, int flags) +{ + U32 tableLog, maxW, nbSymbols; + DTableDesc dtd = HUF_getDTableDesc(DTable); + U32 maxTableLog = dtd.maxTableLog; + size_t iSize; + void* dtPtr = DTable+1; /* force compiler to avoid strict-aliasing */ + HUF_DEltX2* const dt = (HUF_DEltX2*)dtPtr; + U32 *rankStart; + + HUF_ReadDTableX2_Workspace* const wksp = (HUF_ReadDTableX2_Workspace*)workSpace; + + if (sizeof(*wksp) > wkspSize) return ERROR(GENERIC); + + rankStart = wksp->rankStart0 + 1; + ZSTD_memset(wksp->rankStats, 0, sizeof(wksp->rankStats)); + ZSTD_memset(wksp->rankStart0, 0, sizeof(wksp->rankStart0)); + + DEBUG_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(HUF_DTable)); /* if compiler fails here, assertion is wrong */ + if (maxTableLog > HUF_TABLELOG_MAX) return ERROR(tableLog_tooLarge); + /* ZSTD_memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */ + + iSize = HUF_readStats_wksp(wksp->weightList, HUF_SYMBOLVALUE_MAX + 1, wksp->rankStats, &nbSymbols, &tableLog, src, srcSize, wksp->calleeWksp, sizeof(wksp->calleeWksp), flags); + if (HUF_isError(iSize)) return iSize; + + /* check result */ + if (tableLog > maxTableLog) return ERROR(tableLog_tooLarge); /* DTable can't fit code depth */ + if (tableLog <= HUF_DECODER_FAST_TABLELOG && maxTableLog > HUF_DECODER_FAST_TABLELOG) maxTableLog = HUF_DECODER_FAST_TABLELOG; + + /* find maxWeight */ + for (maxW = tableLog; wksp->rankStats[maxW]==0; maxW--) {} /* necessarily finds a solution before 0 */ + + /* Get start index of each weight */ + { U32 w, nextRankStart = 0; + for (w=1; wrankStats[w]; + rankStart[w] = curr; + } + rankStart[0] = nextRankStart; /* put all 0w symbols at the end of sorted list*/ + rankStart[maxW+1] = nextRankStart; + } + + /* sort symbols by weight */ + { U32 s; + for (s=0; sweightList[s]; + U32 const r = rankStart[w]++; + wksp->sortedSymbol[r].symbol = (BYTE)s; + } + rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */ + } + + /* Build rankVal */ + { U32* const rankVal0 = wksp->rankVal[0]; + { int const rescale = (maxTableLog-tableLog) - 1; /* tableLog <= maxTableLog */ + U32 nextRankVal = 0; + U32 w; + for (w=1; wrankStats[w] << (w+rescale); + rankVal0[w] = curr; + } } + { U32 const minBits = tableLog+1 - maxW; + U32 consumed; + for (consumed = minBits; consumed < maxTableLog - minBits + 1; consumed++) { + U32* const rankValPtr = wksp->rankVal[consumed]; + U32 w; + for (w = 1; w < maxW+1; w++) { + rankValPtr[w] = rankVal0[w] >> consumed; + } } } } + + HUF_fillDTableX2(dt, maxTableLog, + wksp->sortedSymbol, + wksp->rankStart0, wksp->rankVal, maxW, + tableLog+1); + + dtd.tableLog = (BYTE)maxTableLog; + dtd.tableType = 1; + ZSTD_memcpy(DTable, &dtd, sizeof(dtd)); + return iSize; +} + + +FORCE_INLINE_TEMPLATE U32 +HUF_decodeSymbolX2(void* op, BIT_DStream_t* DStream, const HUF_DEltX2* dt, const U32 dtLog) +{ + size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */ + ZSTD_memcpy(op, &dt[val].sequence, 2); + BIT_skipBits(DStream, dt[val].nbBits); + return dt[val].length; +} + +FORCE_INLINE_TEMPLATE U32 +HUF_decodeLastSymbolX2(void* op, BIT_DStream_t* DStream, const HUF_DEltX2* dt, const U32 dtLog) +{ + size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */ + ZSTD_memcpy(op, &dt[val].sequence, 1); + if (dt[val].length==1) { + BIT_skipBits(DStream, dt[val].nbBits); + } else { + if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8)) { + BIT_skipBits(DStream, dt[val].nbBits); + if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8)) + /* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */ + DStream->bitsConsumed = (sizeof(DStream->bitContainer)*8); + } + } + return 1; +} + +#define HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr) \ + ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog) + +#define HUF_DECODE_SYMBOLX2_1(ptr, DStreamPtr) \ + if (MEM_64bits() || (HUF_TABLELOG_MAX<=12)) \ + ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog) + +#define HUF_DECODE_SYMBOLX2_2(ptr, DStreamPtr) \ + if (MEM_64bits()) \ + ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog) + +HINT_INLINE size_t +HUF_decodeStreamX2(BYTE* p, BIT_DStream_t* bitDPtr, BYTE* const pEnd, + const HUF_DEltX2* const dt, const U32 dtLog) +{ + BYTE* const pStart = p; + + /* up to 8 symbols at a time */ + if ((size_t)(pEnd - p) >= sizeof(bitDPtr->bitContainer)) { + if (dtLog <= 11 && MEM_64bits()) { + /* up to 10 symbols at a time */ + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-9)) { + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + } + } else { + /* up to 8 symbols at a time */ + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-(sizeof(bitDPtr->bitContainer)-1))) { + HUF_DECODE_SYMBOLX2_2(p, bitDPtr); + HUF_DECODE_SYMBOLX2_1(p, bitDPtr); + HUF_DECODE_SYMBOLX2_2(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + } + } + } else { + BIT_reloadDStream(bitDPtr); + } + + /* closer to end : up to 2 symbols at a time */ + if ((size_t)(pEnd - p) >= 2) { + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p <= pEnd-2)) + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + + while (p <= pEnd-2) + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); /* no need to reload : reached the end of DStream */ + } + + if (p < pEnd) + p += HUF_decodeLastSymbolX2(p, bitDPtr, dt, dtLog); + + return p-pStart; +} + +FORCE_INLINE_TEMPLATE size_t +HUF_decompress1X2_usingDTable_internal_body( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + BIT_DStream_t bitD; + + /* Init */ + CHECK_F( BIT_initDStream(&bitD, cSrc, cSrcSize) ); + + /* decode */ + { BYTE* const ostart = (BYTE*) dst; + BYTE* const oend = ostart + dstSize; + const void* const dtPtr = DTable+1; /* force compiler to not use strict-aliasing */ + const HUF_DEltX2* const dt = (const HUF_DEltX2*)dtPtr; + DTableDesc const dtd = HUF_getDTableDesc(DTable); + HUF_decodeStreamX2(ostart, &bitD, oend, dt, dtd.tableLog); + } + + /* check */ + if (!BIT_endOfDStream(&bitD)) return ERROR(corruption_detected); + + /* decoded size */ + return dstSize; +} + +/* HUF_decompress4X2_usingDTable_internal_body(): + * Conditions: + * @dstSize >= 6 + */ +FORCE_INLINE_TEMPLATE size_t +HUF_decompress4X2_usingDTable_internal_body( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */ + + { const BYTE* const istart = (const BYTE*) cSrc; + BYTE* const ostart = (BYTE*) dst; + BYTE* const oend = ostart + dstSize; + BYTE* const olimit = oend - (sizeof(size_t)-1); + const void* const dtPtr = DTable+1; + const HUF_DEltX2* const dt = (const HUF_DEltX2*)dtPtr; + + /* Init */ + BIT_DStream_t bitD1; + BIT_DStream_t bitD2; + BIT_DStream_t bitD3; + BIT_DStream_t bitD4; + size_t const length1 = MEM_readLE16(istart); + size_t const length2 = MEM_readLE16(istart+2); + size_t const length3 = MEM_readLE16(istart+4); + size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6); + const BYTE* const istart1 = istart + 6; /* jumpTable */ + const BYTE* const istart2 = istart1 + length1; + const BYTE* const istart3 = istart2 + length2; + const BYTE* const istart4 = istart3 + length3; + size_t const segmentSize = (dstSize+3) / 4; + BYTE* const opStart2 = ostart + segmentSize; + BYTE* const opStart3 = opStart2 + segmentSize; + BYTE* const opStart4 = opStart3 + segmentSize; + BYTE* op1 = ostart; + BYTE* op2 = opStart2; + BYTE* op3 = opStart3; + BYTE* op4 = opStart4; + U32 endSignal = 1; + DTableDesc const dtd = HUF_getDTableDesc(DTable); + U32 const dtLog = dtd.tableLog; + + if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */ + if (opStart4 > oend) return ERROR(corruption_detected); /* overflow */ + if (dstSize < 6) return ERROR(corruption_detected); /* stream 4-split doesn't work */ + CHECK_F( BIT_initDStream(&bitD1, istart1, length1) ); + CHECK_F( BIT_initDStream(&bitD2, istart2, length2) ); + CHECK_F( BIT_initDStream(&bitD3, istart3, length3) ); + CHECK_F( BIT_initDStream(&bitD4, istart4, length4) ); + + /* 16-32 symbols per loop (4-8 symbols per stream) */ + if ((size_t)(oend - op4) >= sizeof(size_t)) { + for ( ; (endSignal) & (op4 < olimit); ) { +#if defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_1(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_0(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_1(op2, &bitD2); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_0(op2, &bitD2); + endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_1(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_0(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_1(op4, &bitD4); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_0(op4, &bitD4); + endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; +#else + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_1(op1, &bitD1); + HUF_DECODE_SYMBOLX2_1(op2, &bitD2); + HUF_DECODE_SYMBOLX2_1(op3, &bitD3); + HUF_DECODE_SYMBOLX2_1(op4, &bitD4); + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_0(op1, &bitD1); + HUF_DECODE_SYMBOLX2_0(op2, &bitD2); + HUF_DECODE_SYMBOLX2_0(op3, &bitD3); + HUF_DECODE_SYMBOLX2_0(op4, &bitD4); + endSignal = (U32)LIKELY((U32) + (BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished)); +#endif + } + } + + /* check corruption */ + if (op1 > opStart2) return ERROR(corruption_detected); + if (op2 > opStart3) return ERROR(corruption_detected); + if (op3 > opStart4) return ERROR(corruption_detected); + /* note : op4 already verified within main loop */ + + /* finish bitStreams one by one */ + HUF_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog); + HUF_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog); + HUF_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog); + HUF_decodeStreamX2(op4, &bitD4, oend, dt, dtLog); + + /* check */ + { U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4); + if (!endCheck) return ERROR(corruption_detected); } + + /* decoded size */ + return dstSize; + } +} + +#if HUF_NEED_BMI2_FUNCTION +static BMI2_TARGET_ATTRIBUTE +size_t HUF_decompress4X2_usingDTable_internal_bmi2(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X2_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} +#endif + +static +size_t HUF_decompress4X2_usingDTable_internal_default(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X2_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 + +HUF_ASM_DECL void HUF_decompress4X2_usingDTable_internal_fast_asm_loop(HUF_DecompressFastArgs* args) ZSTDLIB_HIDDEN; + +#endif + +static HUF_FAST_BMI2_ATTRS +void HUF_decompress4X2_usingDTable_internal_fast_c_loop(HUF_DecompressFastArgs* args) +{ + U64 bits[4]; + BYTE const* ip[4]; + BYTE* op[4]; + BYTE* oend[4]; + HUF_DEltX2 const* const dtable = (HUF_DEltX2 const*)args->dt; + BYTE const* const ilimit = args->ilimit; + + /* Copy the arguments to local registers. */ + ZSTD_memcpy(&bits, &args->bits, sizeof(bits)); + ZSTD_memcpy((void*)(&ip), &args->ip, sizeof(ip)); + ZSTD_memcpy(&op, &args->op, sizeof(op)); + + oend[0] = op[1]; + oend[1] = op[2]; + oend[2] = op[3]; + oend[3] = args->oend; + + assert(MEM_isLittleEndian()); + assert(!MEM_32bits()); + + for (;;) { + BYTE* olimit; + int stream; + int symbol; + + /* Assert loop preconditions */ +#ifndef NDEBUG + for (stream = 0; stream < 4; ++stream) { + assert(op[stream] <= oend[stream]); + assert(ip[stream] >= ilimit); + } +#endif + /* Compute olimit */ + { + /* Each loop does 5 table lookups for each of the 4 streams. + * Each table lookup consumes up to 11 bits of input, and produces + * up to 2 bytes of output. + */ + /* We can consume up to 7 bytes of input per iteration per stream. + * We also know that each input pointer is >= ip[0]. So we can run + * iters loops before running out of input. + */ + size_t iters = (size_t)(ip[0] - ilimit) / 7; + /* Each iteration can produce up to 10 bytes of output per stream. + * Each output stream my advance at different rates. So take the + * minimum number of safe iterations among all the output streams. + */ + for (stream = 0; stream < 4; ++stream) { + size_t const oiters = (size_t)(oend[stream] - op[stream]) / 10; + iters = MIN(iters, oiters); + } + + /* Each iteration produces at least 5 output symbols. So until + * op[3] crosses olimit, we know we haven't executed iters + * iterations yet. This saves us maintaining an iters counter, + * at the expense of computing the remaining # of iterations + * more frequently. + */ + olimit = op[3] + (iters * 5); + + /* Exit the fast decoding loop if we are too close to the end. */ + if (op[3] + 10 > olimit) + break; + + /* Exit the decoding loop if any input pointer has crossed the + * previous one. This indicates corruption, and a precondition + * to our loop is that ip[i] >= ip[0]. + */ + for (stream = 1; stream < 4; ++stream) { + if (ip[stream] < ip[stream - 1]) + goto _out; + } + } + +#ifndef NDEBUG + for (stream = 1; stream < 4; ++stream) { + assert(ip[stream] >= ip[stream - 1]); + } +#endif + + do { + /* Do 5 table lookups for each of the first 3 streams */ + for (symbol = 0; symbol < 5; ++symbol) { + for (stream = 0; stream < 3; ++stream) { + int const index = (int)(bits[stream] >> 53); + HUF_DEltX2 const entry = dtable[index]; + MEM_write16(op[stream], entry.sequence); + bits[stream] <<= (entry.nbBits); + op[stream] += (entry.length); + } + } + /* Do 1 table lookup from the final stream */ + { + int const index = (int)(bits[3] >> 53); + HUF_DEltX2 const entry = dtable[index]; + MEM_write16(op[3], entry.sequence); + bits[3] <<= (entry.nbBits); + op[3] += (entry.length); + } + /* Do 4 table lookups from the final stream & reload bitstreams */ + for (stream = 0; stream < 4; ++stream) { + /* Do a table lookup from the final stream. + * This is interleaved with the reloading to reduce register + * pressure. This shouldn't be necessary, but compilers can + * struggle with codegen with high register pressure. + */ + { + int const index = (int)(bits[3] >> 53); + HUF_DEltX2 const entry = dtable[index]; + MEM_write16(op[3], entry.sequence); + bits[3] <<= (entry.nbBits); + op[3] += (entry.length); + } + /* Reload the bistreams. The final bitstream must be reloaded + * after the 5th symbol was decoded. + */ + { + int const ctz = ZSTD_countTrailingZeros64(bits[stream]); + int const nbBits = ctz & 7; + int const nbBytes = ctz >> 3; + ip[stream] -= nbBytes; + bits[stream] = MEM_read64(ip[stream]) | 1; + bits[stream] <<= nbBits; + } + } + } while (op[3] < olimit); + } + +_out: + + /* Save the final values of each of the state variables back to args. */ + ZSTD_memcpy(&args->bits, &bits, sizeof(bits)); + ZSTD_memcpy((void*)(&args->ip), &ip, sizeof(ip)); + ZSTD_memcpy(&args->op, &op, sizeof(op)); +} + + +static HUF_FAST_BMI2_ATTRS size_t +HUF_decompress4X2_usingDTable_internal_fast( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable, + HUF_DecompressFastLoopFn loopFn) { + void const* dt = DTable + 1; + const BYTE* const iend = (const BYTE*)cSrc + 6; + BYTE* const oend = (BYTE*)dst + dstSize; + HUF_DecompressFastArgs args; + { + size_t const ret = HUF_DecompressFastArgs_init(&args, dst, dstSize, cSrc, cSrcSize, DTable); + FORWARD_IF_ERROR(ret, "Failed to init asm args"); + if (ret == 0) + return 0; + } + + assert(args.ip[0] >= args.ilimit); + loopFn(&args); + + /* note : op4 already verified within main loop */ + assert(args.ip[0] >= iend); + assert(args.ip[1] >= iend); + assert(args.ip[2] >= iend); + assert(args.ip[3] >= iend); + assert(args.op[3] <= oend); + (void)iend; + + /* finish bitStreams one by one */ + { + size_t const segmentSize = (dstSize+3) / 4; + BYTE* segmentEnd = (BYTE*)dst; + int i; + for (i = 0; i < 4; ++i) { + BIT_DStream_t bit; + if (segmentSize <= (size_t)(oend - segmentEnd)) + segmentEnd += segmentSize; + else + segmentEnd = oend; + FORWARD_IF_ERROR(HUF_initRemainingDStream(&bit, &args, i, segmentEnd), "corruption"); + args.op[i] += HUF_decodeStreamX2(args.op[i], &bit, segmentEnd, (HUF_DEltX2 const*)dt, HUF_DECODER_FAST_TABLELOG); + if (args.op[i] != segmentEnd) + return ERROR(corruption_detected); + } + } + + /* decoded size */ + return dstSize; +} + +static size_t HUF_decompress4X2_usingDTable_internal(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable, int flags) +{ + HUF_DecompressUsingDTableFn fallbackFn = HUF_decompress4X2_usingDTable_internal_default; + HUF_DecompressFastLoopFn loopFn = HUF_decompress4X2_usingDTable_internal_fast_c_loop; + +#if DYNAMIC_BMI2 + if (flags & HUF_flags_bmi2) { + fallbackFn = HUF_decompress4X2_usingDTable_internal_bmi2; +# if ZSTD_ENABLE_ASM_X86_64_BMI2 + if (!(flags & HUF_flags_disableAsm)) { + loopFn = HUF_decompress4X2_usingDTable_internal_fast_asm_loop; + } +# endif + } else { + return fallbackFn(dst, dstSize, cSrc, cSrcSize, DTable); + } +#endif + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__) + if (!(flags & HUF_flags_disableAsm)) { + loopFn = HUF_decompress4X2_usingDTable_internal_fast_asm_loop; + } +#endif + + if (!(flags & HUF_flags_disableFast)) { + size_t const ret = HUF_decompress4X2_usingDTable_internal_fast(dst, dstSize, cSrc, cSrcSize, DTable, loopFn); + if (ret != 0) + return ret; + } + return fallbackFn(dst, dstSize, cSrc, cSrcSize, DTable); +} + +HUF_DGEN(HUF_decompress1X2_usingDTable_internal) + +size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* DCtx, void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + void* workSpace, size_t wkspSize, int flags) +{ + const BYTE* ip = (const BYTE*) cSrc; + + size_t const hSize = HUF_readDTableX2_wksp(DCtx, cSrc, cSrcSize, + workSpace, wkspSize, flags); + if (HUF_isError(hSize)) return hSize; + if (hSize >= cSrcSize) return ERROR(srcSize_wrong); + ip += hSize; cSrcSize -= hSize; + + return HUF_decompress1X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, DCtx, flags); +} + +static size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + void* workSpace, size_t wkspSize, int flags) +{ + const BYTE* ip = (const BYTE*) cSrc; + + size_t hSize = HUF_readDTableX2_wksp(dctx, cSrc, cSrcSize, + workSpace, wkspSize, flags); + if (HUF_isError(hSize)) return hSize; + if (hSize >= cSrcSize) return ERROR(srcSize_wrong); + ip += hSize; cSrcSize -= hSize; + + return HUF_decompress4X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, flags); +} + +#endif /* HUF_FORCE_DECOMPRESS_X1 */ + + +/* ***********************************/ +/* Universal decompression selectors */ +/* ***********************************/ + + +#if !defined(HUF_FORCE_DECOMPRESS_X1) && !defined(HUF_FORCE_DECOMPRESS_X2) +typedef struct { U32 tableTime; U32 decode256Time; } algo_time_t; +static const algo_time_t algoTime[16 /* Quantization */][2 /* single, double */] = +{ + /* single, double, quad */ + {{0,0}, {1,1}}, /* Q==0 : impossible */ + {{0,0}, {1,1}}, /* Q==1 : impossible */ + {{ 150,216}, { 381,119}}, /* Q == 2 : 12-18% */ + {{ 170,205}, { 514,112}}, /* Q == 3 : 18-25% */ + {{ 177,199}, { 539,110}}, /* Q == 4 : 25-32% */ + {{ 197,194}, { 644,107}}, /* Q == 5 : 32-38% */ + {{ 221,192}, { 735,107}}, /* Q == 6 : 38-44% */ + {{ 256,189}, { 881,106}}, /* Q == 7 : 44-50% */ + {{ 359,188}, {1167,109}}, /* Q == 8 : 50-56% */ + {{ 582,187}, {1570,114}}, /* Q == 9 : 56-62% */ + {{ 688,187}, {1712,122}}, /* Q ==10 : 62-69% */ + {{ 825,186}, {1965,136}}, /* Q ==11 : 69-75% */ + {{ 976,185}, {2131,150}}, /* Q ==12 : 75-81% */ + {{1180,186}, {2070,175}}, /* Q ==13 : 81-87% */ + {{1377,185}, {1731,202}}, /* Q ==14 : 87-93% */ + {{1412,185}, {1695,202}}, /* Q ==15 : 93-99% */ +}; +#endif + +/** HUF_selectDecoder() : + * Tells which decoder is likely to decode faster, + * based on a set of pre-computed metrics. + * @return : 0==HUF_decompress4X1, 1==HUF_decompress4X2 . + * Assumption : 0 < dstSize <= 128 KB */ +U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize) +{ + assert(dstSize > 0); + assert(dstSize <= 128*1024); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)dstSize; + (void)cSrcSize; + return 0; +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)dstSize; + (void)cSrcSize; + return 1; +#else + /* decoder timing evaluation */ + { U32 const Q = (cSrcSize >= dstSize) ? 15 : (U32)(cSrcSize * 16 / dstSize); /* Q < 16 */ + U32 const D256 = (U32)(dstSize >> 8); + U32 const DTime0 = algoTime[Q][0].tableTime + (algoTime[Q][0].decode256Time * D256); + U32 DTime1 = algoTime[Q][1].tableTime + (algoTime[Q][1].decode256Time * D256); + DTime1 += DTime1 >> 5; /* small advantage to algorithm using less memory, to reduce cache eviction */ + return DTime1 < DTime0; + } +#endif +} + +size_t HUF_decompress1X_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + void* workSpace, size_t wkspSize, int flags) +{ + /* validation checks */ + if (dstSize == 0) return ERROR(dstSize_tooSmall); + if (cSrcSize > dstSize) return ERROR(corruption_detected); /* invalid */ + if (cSrcSize == dstSize) { ZSTD_memcpy(dst, cSrc, dstSize); return dstSize; } /* not compressed */ + if (cSrcSize == 1) { ZSTD_memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */ + + { U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)algoNb; + assert(algoNb == 0); + return HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc, + cSrcSize, workSpace, wkspSize, flags); +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)algoNb; + assert(algoNb == 1); + return HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc, + cSrcSize, workSpace, wkspSize, flags); +#else + return algoNb ? HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc, + cSrcSize, workSpace, wkspSize, flags): + HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc, + cSrcSize, workSpace, wkspSize, flags); +#endif + } +} + + +size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int flags) +{ + DTableDesc const dtd = HUF_getDTableDesc(DTable); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)dtd; + assert(dtd.tableType == 0); + return HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)dtd; + assert(dtd.tableType == 1); + return HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#else + return dtd.tableType ? HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags) : + HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#endif +} + +#ifndef HUF_FORCE_DECOMPRESS_X2 +size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags) +{ + const BYTE* ip = (const BYTE*) cSrc; + + size_t const hSize = HUF_readDTableX1_wksp(dctx, cSrc, cSrcSize, workSpace, wkspSize, flags); + if (HUF_isError(hSize)) return hSize; + if (hSize >= cSrcSize) return ERROR(srcSize_wrong); + ip += hSize; cSrcSize -= hSize; + + return HUF_decompress1X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, flags); +} +#endif + +size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int flags) +{ + DTableDesc const dtd = HUF_getDTableDesc(DTable); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)dtd; + assert(dtd.tableType == 0); + return HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)dtd; + assert(dtd.tableType == 1); + return HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#else + return dtd.tableType ? HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags) : + HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#endif +} + +size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags) +{ + /* validation checks */ + if (dstSize == 0) return ERROR(dstSize_tooSmall); + if (cSrcSize == 0) return ERROR(corruption_detected); + + { U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)algoNb; + assert(algoNb == 0); + return HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, flags); +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)algoNb; + assert(algoNb == 1); + return HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, flags); +#else + return algoNb ? HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, flags) : + HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, flags); +#endif + } +} +/**** ended inlining decompress/huf_decompress.c ****/ +/**** start inlining decompress/zstd_ddict.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* zstd_ddict.c : + * concentrates all logic that needs to know the internals of ZSTD_DDict object */ + +/*-******************************************************* +* Dependencies +*********************************************************/ +/**** skipping file: ../common/allocations.h ****/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../common/cpu.h ****/ +/**** skipping file: ../common/mem.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/huf.h ****/ +/**** start inlining zstd_decompress_internal.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + +/* zstd_decompress_internal: + * objects and definitions shared within lib/decompress modules */ + + #ifndef ZSTD_DECOMPRESS_INTERNAL_H + #define ZSTD_DECOMPRESS_INTERNAL_H + + +/*-******************************************************* + * Dependencies + *********************************************************/ +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ + + + +/*-******************************************************* + * Constants + *********************************************************/ +static UNUSED_ATTR const U32 LL_base[MaxLL+1] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 18, 20, 22, 24, 28, 32, 40, + 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, + 0x2000, 0x4000, 0x8000, 0x10000 }; + +static UNUSED_ATTR const U32 OF_base[MaxOff+1] = { + 0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D, + 0xFD, 0x1FD, 0x3FD, 0x7FD, 0xFFD, 0x1FFD, 0x3FFD, 0x7FFD, + 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD, + 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD }; + +static UNUSED_ATTR const U8 OF_bits[MaxOff+1] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31 }; + +static UNUSED_ATTR const U32 ML_base[MaxML+1] = { + 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, + 35, 37, 39, 41, 43, 47, 51, 59, + 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803, + 0x1003, 0x2003, 0x4003, 0x8003, 0x10003 }; + + +/*-******************************************************* + * Decompression types + *********************************************************/ + typedef struct { + U32 fastMode; + U32 tableLog; + } ZSTD_seqSymbol_header; + + typedef struct { + U16 nextState; + BYTE nbAdditionalBits; + BYTE nbBits; + U32 baseValue; + } ZSTD_seqSymbol; + + #define SEQSYMBOL_TABLE_SIZE(log) (1 + (1 << (log))) + +#define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE (sizeof(S16) * (MaxSeq + 1) + (1u << MaxFSELog) + sizeof(U64)) +#define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32 ((ZSTD_BUILD_FSE_TABLE_WKSP_SIZE + sizeof(U32) - 1) / sizeof(U32)) +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12 + +typedef struct { + ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)]; /* Note : Space reserved for FSE Tables */ + ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)]; /* is also used as temporary workspace while building hufTable during DDict creation */ + ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)]; /* and therefore must be at least HUF_DECOMPRESS_WORKSPACE_SIZE large */ + HUF_DTable hufTable[HUF_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)]; /* can accommodate HUF_decompress4X */ + U32 rep[ZSTD_REP_NUM]; + U32 workspace[ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32]; +} ZSTD_entropyDTables_t; + +typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader, + ZSTDds_decodeBlockHeader, ZSTDds_decompressBlock, + ZSTDds_decompressLastBlock, ZSTDds_checkChecksum, + ZSTDds_decodeSkippableHeader, ZSTDds_skipFrame } ZSTD_dStage; + +typedef enum { zdss_init=0, zdss_loadHeader, + zdss_read, zdss_load, zdss_flush } ZSTD_dStreamStage; + +typedef enum { + ZSTD_use_indefinitely = -1, /* Use the dictionary indefinitely */ + ZSTD_dont_use = 0, /* Do not use the dictionary (if one exists free it) */ + ZSTD_use_once = 1 /* Use the dictionary once and set to ZSTD_dont_use */ +} ZSTD_dictUses_e; + +/* Hashset for storing references to multiple ZSTD_DDict within ZSTD_DCtx */ +typedef struct { + const ZSTD_DDict** ddictPtrTable; + size_t ddictPtrTableSize; + size_t ddictPtrCount; +} ZSTD_DDictHashSet; + +#ifndef ZSTD_DECODER_INTERNAL_BUFFER +# define ZSTD_DECODER_INTERNAL_BUFFER (1 << 16) +#endif + +#define ZSTD_LBMIN 64 +#define ZSTD_LBMAX (128 << 10) + +/* extra buffer, compensates when dst is not large enough to store litBuffer */ +#define ZSTD_LITBUFFEREXTRASIZE BOUNDED(ZSTD_LBMIN, ZSTD_DECODER_INTERNAL_BUFFER, ZSTD_LBMAX) + +typedef enum { + ZSTD_not_in_dst = 0, /* Stored entirely within litExtraBuffer */ + ZSTD_in_dst = 1, /* Stored entirely within dst (in memory after current output write) */ + ZSTD_split = 2 /* Split between litExtraBuffer and dst */ +} ZSTD_litLocation_e; + +struct ZSTD_DCtx_s +{ + const ZSTD_seqSymbol* LLTptr; + const ZSTD_seqSymbol* MLTptr; + const ZSTD_seqSymbol* OFTptr; + const HUF_DTable* HUFptr; + ZSTD_entropyDTables_t entropy; + U32 workspace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32]; /* space needed when building huffman tables */ + const void* previousDstEnd; /* detect continuity */ + const void* prefixStart; /* start of current segment */ + const void* virtualStart; /* virtual start of previous segment if it was just before current one */ + const void* dictEnd; /* end of previous segment */ + size_t expected; + ZSTD_frameHeader fParams; + U64 processedCSize; + U64 decodedSize; + blockType_e bType; /* used in ZSTD_decompressContinue(), store blockType between block header decoding and block decompression stages */ + ZSTD_dStage stage; + U32 litEntropy; + U32 fseEntropy; + XXH64_state_t xxhState; + size_t headerSize; + ZSTD_format_e format; + ZSTD_forceIgnoreChecksum_e forceIgnoreChecksum; /* User specified: if == 1, will ignore checksums in compressed frame. Default == 0 */ + U32 validateChecksum; /* if == 1, will validate checksum. Is == 1 if (fParams.checksumFlag == 1) and (forceIgnoreChecksum == 0). */ + const BYTE* litPtr; + ZSTD_customMem customMem; + size_t litSize; + size_t rleSize; + size_t staticSize; +#if DYNAMIC_BMI2 != 0 + int bmi2; /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */ +#endif + + /* dictionary */ + ZSTD_DDict* ddictLocal; + const ZSTD_DDict* ddict; /* set by ZSTD_initDStream_usingDDict(), or ZSTD_DCtx_refDDict() */ + U32 dictID; + int ddictIsCold; /* if == 1 : dictionary is "new" for working context, and presumed "cold" (not in cpu cache) */ + ZSTD_dictUses_e dictUses; + ZSTD_DDictHashSet* ddictSet; /* Hash set for multiple ddicts */ + ZSTD_refMultipleDDicts_e refMultipleDDicts; /* User specified: if == 1, will allow references to multiple DDicts. Default == 0 (disabled) */ + int disableHufAsm; + + /* streaming */ + ZSTD_dStreamStage streamStage; + char* inBuff; + size_t inBuffSize; + size_t inPos; + size_t maxWindowSize; + char* outBuff; + size_t outBuffSize; + size_t outStart; + size_t outEnd; + size_t lhSize; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) + void* legacyContext; + U32 previousLegacyVersion; + U32 legacyVersion; +#endif + U32 hostageByte; + int noForwardProgress; + ZSTD_bufferMode_e outBufferMode; + ZSTD_outBuffer expectedOutBuffer; + + /* workspace */ + BYTE* litBuffer; + const BYTE* litBufferEnd; + ZSTD_litLocation_e litBufferLocation; + BYTE litExtraBuffer[ZSTD_LITBUFFEREXTRASIZE + WILDCOPY_OVERLENGTH]; /* literal buffer can be split between storage within dst and within this scratch buffer */ + BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX]; + + size_t oversizedDuration; + +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + void const* dictContentBeginForFuzzing; + void const* dictContentEndForFuzzing; +#endif + + /* Tracing */ +#if ZSTD_TRACE + ZSTD_TraceCtx traceCtx; +#endif +}; /* typedef'd to ZSTD_DCtx within "zstd.h" */ + +MEM_STATIC int ZSTD_DCtx_get_bmi2(const struct ZSTD_DCtx_s *dctx) { +#if DYNAMIC_BMI2 != 0 + return dctx->bmi2; +#else + (void)dctx; + return 0; +#endif +} + +/*-******************************************************* + * Shared internal functions + *********************************************************/ + +/*! ZSTD_loadDEntropy() : + * dict : must point at beginning of a valid zstd dictionary. + * @return : size of dictionary header (size of magic number + dict ID + entropy tables) */ +size_t ZSTD_loadDEntropy(ZSTD_entropyDTables_t* entropy, + const void* const dict, size_t const dictSize); + +/*! ZSTD_checkContinuity() : + * check if next `dst` follows previous position, where decompression ended. + * If yes, do nothing (continue on current segment). + * If not, classify previous segment as "external dictionary", and start a new segment. + * This function cannot fail. */ +void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst, size_t dstSize); + + +#endif /* ZSTD_DECOMPRESS_INTERNAL_H */ +/**** ended inlining zstd_decompress_internal.h ****/ +/**** start inlining zstd_ddict.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + +#ifndef ZSTD_DDICT_H +#define ZSTD_DDICT_H + +/*-******************************************************* + * Dependencies + *********************************************************/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../zstd.h ****/ + + +/*-******************************************************* + * Interface + *********************************************************/ + +/* note: several prototypes are already published in `zstd.h` : + * ZSTD_createDDict() + * ZSTD_createDDict_byReference() + * ZSTD_createDDict_advanced() + * ZSTD_freeDDict() + * ZSTD_initStaticDDict() + * ZSTD_sizeof_DDict() + * ZSTD_estimateDDictSize() + * ZSTD_getDictID_fromDict() + */ + +const void* ZSTD_DDict_dictContent(const ZSTD_DDict* ddict); +size_t ZSTD_DDict_dictSize(const ZSTD_DDict* ddict); + +void ZSTD_copyDDictParameters(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); + + + +#endif /* ZSTD_DDICT_H */ +/**** ended inlining zstd_ddict.h ****/ + +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) +/**** start inlining ../legacy/zstd_legacy.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_LEGACY_H +#define ZSTD_LEGACY_H + +#if defined (__cplusplus) +extern "C" { +#endif + +/* ************************************* +* Includes +***************************************/ +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: ../common/error_private.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ + +#if !defined (ZSTD_LEGACY_SUPPORT) || (ZSTD_LEGACY_SUPPORT == 0) +# undef ZSTD_LEGACY_SUPPORT +# define ZSTD_LEGACY_SUPPORT 8 +#endif + +#if (ZSTD_LEGACY_SUPPORT <= 1) +/**** start inlining zstd_v01.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_V01_H_28739879432 +#define ZSTD_V01_H_28739879432 + +#if defined (__cplusplus) +extern "C" { +#endif + +/* ************************************* +* Includes +***************************************/ +#include /* size_t */ + + +/* ************************************* +* Simple one-step function +***************************************/ +/** +ZSTDv01_decompress() : decompress ZSTD frames compliant with v0.1.x format + compressedSize : is the exact source size + maxOriginalSize : is the size of the 'dst' buffer, which must be already allocated. + It must be equal or larger than originalSize, otherwise decompression will fail. + return : the number of bytes decompressed into destination buffer (originalSize) + or an errorCode if it fails (which can be tested using ZSTDv01_isError()) +*/ +size_t ZSTDv01_decompress( void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + + /** + ZSTDv01_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.1.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. + */ +void ZSTDv01_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + +/** +ZSTDv01_isError() : tells if the result of ZSTDv01_decompress() is an error +*/ +unsigned ZSTDv01_isError(size_t code); + + +/* ************************************* +* Advanced functions +***************************************/ +typedef struct ZSTDv01_Dctx_s ZSTDv01_Dctx; +ZSTDv01_Dctx* ZSTDv01_createDCtx(void); +size_t ZSTDv01_freeDCtx(ZSTDv01_Dctx* dctx); + +size_t ZSTDv01_decompressDCtx(void* ctx, + void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + +/* ************************************* +* Streaming functions +***************************************/ +size_t ZSTDv01_resetDCtx(ZSTDv01_Dctx* dctx); + +size_t ZSTDv01_nextSrcSizeToDecompress(ZSTDv01_Dctx* dctx); +size_t ZSTDv01_decompressContinue(ZSTDv01_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize); +/** + Use above functions alternatively. + ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue(). + ZSTD_decompressContinue() will use previous data blocks to improve compression if they are located prior to current block. + Result is the number of bytes regenerated within 'dst'. + It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header. +*/ + +/* ************************************* +* Prefix - version detection +***************************************/ +#define ZSTDv01_magicNumber 0xFD2FB51E /* Big Endian version */ +#define ZSTDv01_magicNumberLE 0x1EB52FFD /* Little Endian version */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_V01_H_28739879432 */ +/**** ended inlining zstd_v01.h ****/ +#endif +#if (ZSTD_LEGACY_SUPPORT <= 2) +/**** start inlining zstd_v02.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_V02_H_4174539423 +#define ZSTD_V02_H_4174539423 + +#if defined (__cplusplus) +extern "C" { +#endif + +/* ************************************* +* Includes +***************************************/ +#include /* size_t */ + + +/* ************************************* +* Simple one-step function +***************************************/ +/** +ZSTDv02_decompress() : decompress ZSTD frames compliant with v0.2.x format + compressedSize : is the exact source size + maxOriginalSize : is the size of the 'dst' buffer, which must be already allocated. + It must be equal or larger than originalSize, otherwise decompression will fail. + return : the number of bytes decompressed into destination buffer (originalSize) + or an errorCode if it fails (which can be tested using ZSTDv01_isError()) +*/ +size_t ZSTDv02_decompress( void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + + /** + ZSTDv02_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.2.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. + */ +void ZSTDv02_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + +/** +ZSTDv02_isError() : tells if the result of ZSTDv02_decompress() is an error +*/ +unsigned ZSTDv02_isError(size_t code); + + +/* ************************************* +* Advanced functions +***************************************/ +typedef struct ZSTDv02_Dctx_s ZSTDv02_Dctx; +ZSTDv02_Dctx* ZSTDv02_createDCtx(void); +size_t ZSTDv02_freeDCtx(ZSTDv02_Dctx* dctx); + +size_t ZSTDv02_decompressDCtx(void* ctx, + void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + +/* ************************************* +* Streaming functions +***************************************/ +size_t ZSTDv02_resetDCtx(ZSTDv02_Dctx* dctx); + +size_t ZSTDv02_nextSrcSizeToDecompress(ZSTDv02_Dctx* dctx); +size_t ZSTDv02_decompressContinue(ZSTDv02_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize); +/** + Use above functions alternatively. + ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue(). + ZSTD_decompressContinue() will use previous data blocks to improve compression if they are located prior to current block. + Result is the number of bytes regenerated within 'dst'. + It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header. +*/ + +/* ************************************* +* Prefix - version detection +***************************************/ +#define ZSTDv02_magicNumber 0xFD2FB522 /* v0.2 */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_V02_H_4174539423 */ +/**** ended inlining zstd_v02.h ****/ +#endif +#if (ZSTD_LEGACY_SUPPORT <= 3) +/**** start inlining zstd_v03.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_V03_H_298734209782 +#define ZSTD_V03_H_298734209782 + +#if defined (__cplusplus) +extern "C" { +#endif + +/* ************************************* +* Includes +***************************************/ +#include /* size_t */ + + +/* ************************************* +* Simple one-step function +***************************************/ +/** +ZSTDv03_decompress() : decompress ZSTD frames compliant with v0.3.x format + compressedSize : is the exact source size + maxOriginalSize : is the size of the 'dst' buffer, which must be already allocated. + It must be equal or larger than originalSize, otherwise decompression will fail. + return : the number of bytes decompressed into destination buffer (originalSize) + or an errorCode if it fails (which can be tested using ZSTDv01_isError()) +*/ +size_t ZSTDv03_decompress( void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + + /** + ZSTDv03_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.3.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. + */ + void ZSTDv03_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + + /** +ZSTDv03_isError() : tells if the result of ZSTDv03_decompress() is an error +*/ +unsigned ZSTDv03_isError(size_t code); + + +/* ************************************* +* Advanced functions +***************************************/ +typedef struct ZSTDv03_Dctx_s ZSTDv03_Dctx; +ZSTDv03_Dctx* ZSTDv03_createDCtx(void); +size_t ZSTDv03_freeDCtx(ZSTDv03_Dctx* dctx); + +size_t ZSTDv03_decompressDCtx(void* ctx, + void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + +/* ************************************* +* Streaming functions +***************************************/ +size_t ZSTDv03_resetDCtx(ZSTDv03_Dctx* dctx); + +size_t ZSTDv03_nextSrcSizeToDecompress(ZSTDv03_Dctx* dctx); +size_t ZSTDv03_decompressContinue(ZSTDv03_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize); +/** + Use above functions alternatively. + ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue(). + ZSTD_decompressContinue() will use previous data blocks to improve compression if they are located prior to current block. + Result is the number of bytes regenerated within 'dst'. + It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header. +*/ + +/* ************************************* +* Prefix - version detection +***************************************/ +#define ZSTDv03_magicNumber 0xFD2FB523 /* v0.3 */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_V03_H_298734209782 */ +/**** ended inlining zstd_v03.h ****/ +#endif +#if (ZSTD_LEGACY_SUPPORT <= 4) +/**** start inlining zstd_v04.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_V04_H_91868324769238 +#define ZSTD_V04_H_91868324769238 + +#if defined (__cplusplus) +extern "C" { +#endif + +/* ************************************* +* Includes +***************************************/ +#include /* size_t */ + + +/* ************************************* +* Simple one-step function +***************************************/ +/** +ZSTDv04_decompress() : decompress ZSTD frames compliant with v0.4.x format + compressedSize : is the exact source size + maxOriginalSize : is the size of the 'dst' buffer, which must be already allocated. + It must be equal or larger than originalSize, otherwise decompression will fail. + return : the number of bytes decompressed into destination buffer (originalSize) + or an errorCode if it fails (which can be tested using ZSTDv01_isError()) +*/ +size_t ZSTDv04_decompress( void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + + /** + ZSTDv04_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.4.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. + */ + void ZSTDv04_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + +/** +ZSTDv04_isError() : tells if the result of ZSTDv04_decompress() is an error +*/ +unsigned ZSTDv04_isError(size_t code); + + +/* ************************************* +* Advanced functions +***************************************/ +typedef struct ZSTDv04_Dctx_s ZSTDv04_Dctx; +ZSTDv04_Dctx* ZSTDv04_createDCtx(void); +size_t ZSTDv04_freeDCtx(ZSTDv04_Dctx* dctx); + +size_t ZSTDv04_decompressDCtx(ZSTDv04_Dctx* dctx, + void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + + +/* ************************************* +* Direct Streaming +***************************************/ +size_t ZSTDv04_resetDCtx(ZSTDv04_Dctx* dctx); + +size_t ZSTDv04_nextSrcSizeToDecompress(ZSTDv04_Dctx* dctx); +size_t ZSTDv04_decompressContinue(ZSTDv04_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize); +/** + Use above functions alternatively. + ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue(). + ZSTD_decompressContinue() will use previous data blocks to improve compression if they are located prior to current block. + Result is the number of bytes regenerated within 'dst'. + It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header. +*/ + + +/* ************************************* +* Buffered Streaming +***************************************/ +typedef struct ZBUFFv04_DCtx_s ZBUFFv04_DCtx; +ZBUFFv04_DCtx* ZBUFFv04_createDCtx(void); +size_t ZBUFFv04_freeDCtx(ZBUFFv04_DCtx* dctx); + +size_t ZBUFFv04_decompressInit(ZBUFFv04_DCtx* dctx); +size_t ZBUFFv04_decompressWithDictionary(ZBUFFv04_DCtx* dctx, const void* dict, size_t dictSize); + +size_t ZBUFFv04_decompressContinue(ZBUFFv04_DCtx* dctx, void* dst, size_t* maxDstSizePtr, const void* src, size_t* srcSizePtr); + +/** ************************************************ +* Streaming decompression +* +* A ZBUFF_DCtx object is required to track streaming operation. +* Use ZBUFF_createDCtx() and ZBUFF_freeDCtx() to create/release resources. +* Use ZBUFF_decompressInit() to start a new decompression operation. +* ZBUFF_DCtx objects can be reused multiple times. +* +* Optionally, a reference to a static dictionary can be set, using ZBUFF_decompressWithDictionary() +* It must be the same content as the one set during compression phase. +* Dictionary content must remain accessible during the decompression process. +* +* Use ZBUFF_decompressContinue() repetitively to consume your input. +* *srcSizePtr and *maxDstSizePtr can be any size. +* The function will report how many bytes were read or written by modifying *srcSizePtr and *maxDstSizePtr. +* Note that it may not consume the entire input, in which case it's up to the caller to present remaining input again. +* The content of dst will be overwritten (up to *maxDstSizePtr) at each function call, so save its content if it matters or change dst. +* @return : a hint to preferred nb of bytes to use as input for next function call (it's only a hint, to improve latency) +* or 0 when a frame is completely decoded +* or an error code, which can be tested using ZBUFF_isError(). +* +* Hint : recommended buffer sizes (not compulsory) : ZBUFF_recommendedDInSize / ZBUFF_recommendedDOutSize +* output : ZBUFF_recommendedDOutSize==128 KB block size is the internal unit, it ensures it's always possible to write a full block when it's decoded. +* input : ZBUFF_recommendedDInSize==128Kb+3; just follow indications from ZBUFF_decompressContinue() to minimize latency. It should always be <= 128 KB + 3 . +* **************************************************/ +unsigned ZBUFFv04_isError(size_t errorCode); +const char* ZBUFFv04_getErrorName(size_t errorCode); + + +/** The below functions provide recommended buffer sizes for Compression or Decompression operations. +* These sizes are not compulsory, they just tend to offer better latency */ +size_t ZBUFFv04_recommendedDInSize(void); +size_t ZBUFFv04_recommendedDOutSize(void); + + +/* ************************************* +* Prefix - version detection +***************************************/ +#define ZSTDv04_magicNumber 0xFD2FB524 /* v0.4 */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_V04_H_91868324769238 */ +/**** ended inlining zstd_v04.h ****/ +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) +/**** start inlining zstd_v05.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTDv05_H +#define ZSTDv05_H + +#if defined (__cplusplus) +extern "C" { +#endif + +/*-************************************* +* Dependencies +***************************************/ +#include /* size_t */ +/**** skipping file: ../common/mem.h ****/ + + +/* ************************************* +* Simple functions +***************************************/ +/*! ZSTDv05_decompress() : + `compressedSize` : is the _exact_ size of the compressed blob, otherwise decompression will fail. + `dstCapacity` must be large enough, equal or larger than originalSize. + @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), + or an errorCode if it fails (which can be tested using ZSTDv05_isError()) */ +size_t ZSTDv05_decompress( void* dst, size_t dstCapacity, + const void* src, size_t compressedSize); + + /** + ZSTDv05_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.5.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. + */ +void ZSTDv05_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + +/* ************************************* +* Helper functions +***************************************/ +/* Error Management */ +unsigned ZSTDv05_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ +const char* ZSTDv05_getErrorName(size_t code); /*!< provides readable string for an error code */ + + +/* ************************************* +* Explicit memory management +***************************************/ +/** Decompression context */ +typedef struct ZSTDv05_DCtx_s ZSTDv05_DCtx; +ZSTDv05_DCtx* ZSTDv05_createDCtx(void); +size_t ZSTDv05_freeDCtx(ZSTDv05_DCtx* dctx); /*!< @return : errorCode */ + +/** ZSTDv05_decompressDCtx() : +* Same as ZSTDv05_decompress(), but requires an already allocated ZSTDv05_DCtx (see ZSTDv05_createDCtx()) */ +size_t ZSTDv05_decompressDCtx(ZSTDv05_DCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + +/*-*********************** +* Simple Dictionary API +*************************/ +/*! ZSTDv05_decompress_usingDict() : +* Decompression using a pre-defined Dictionary content (see dictBuilder). +* Dictionary must be identical to the one used during compression, otherwise regenerated data will be corrupted. +* Note : dict can be NULL, in which case, it's equivalent to ZSTDv05_decompressDCtx() */ +size_t ZSTDv05_decompress_usingDict(ZSTDv05_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize); + +/*-************************ +* Advanced Streaming API +***************************/ +typedef enum { ZSTDv05_fast, ZSTDv05_greedy, ZSTDv05_lazy, ZSTDv05_lazy2, ZSTDv05_btlazy2, ZSTDv05_opt, ZSTDv05_btopt } ZSTDv05_strategy; +typedef struct { + U64 srcSize; + U32 windowLog; /* the only useful information to retrieve */ + U32 contentLog; U32 hashLog; U32 searchLog; U32 searchLength; U32 targetLength; ZSTDv05_strategy strategy; +} ZSTDv05_parameters; +size_t ZSTDv05_getFrameParams(ZSTDv05_parameters* params, const void* src, size_t srcSize); + +size_t ZSTDv05_decompressBegin_usingDict(ZSTDv05_DCtx* dctx, const void* dict, size_t dictSize); +void ZSTDv05_copyDCtx(ZSTDv05_DCtx* dstDCtx, const ZSTDv05_DCtx* srcDCtx); +size_t ZSTDv05_nextSrcSizeToDecompress(ZSTDv05_DCtx* dctx); +size_t ZSTDv05_decompressContinue(ZSTDv05_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + +/*-*********************** +* ZBUFF API +*************************/ +typedef struct ZBUFFv05_DCtx_s ZBUFFv05_DCtx; +ZBUFFv05_DCtx* ZBUFFv05_createDCtx(void); +size_t ZBUFFv05_freeDCtx(ZBUFFv05_DCtx* dctx); + +size_t ZBUFFv05_decompressInit(ZBUFFv05_DCtx* dctx); +size_t ZBUFFv05_decompressInitDictionary(ZBUFFv05_DCtx* dctx, const void* dict, size_t dictSize); + +size_t ZBUFFv05_decompressContinue(ZBUFFv05_DCtx* dctx, + void* dst, size_t* dstCapacityPtr, + const void* src, size_t* srcSizePtr); + +/*-*************************************************************************** +* Streaming decompression +* +* A ZBUFFv05_DCtx object is required to track streaming operations. +* Use ZBUFFv05_createDCtx() and ZBUFFv05_freeDCtx() to create/release resources. +* Use ZBUFFv05_decompressInit() to start a new decompression operation, +* or ZBUFFv05_decompressInitDictionary() if decompression requires a dictionary. +* Note that ZBUFFv05_DCtx objects can be reused multiple times. +* +* Use ZBUFFv05_decompressContinue() repetitively to consume your input. +* *srcSizePtr and *dstCapacityPtr can be any size. +* The function will report how many bytes were read or written by modifying *srcSizePtr and *dstCapacityPtr. +* Note that it may not consume the entire input, in which case it's up to the caller to present remaining input again. +* The content of @dst will be overwritten (up to *dstCapacityPtr) at each function call, so save its content if it matters or change @dst. +* @return : a hint to preferred nb of bytes to use as input for next function call (it's only a hint, to help latency) +* or 0 when a frame is completely decoded +* or an error code, which can be tested using ZBUFFv05_isError(). +* +* Hint : recommended buffer sizes (not compulsory) : ZBUFFv05_recommendedDInSize() / ZBUFFv05_recommendedDOutSize() +* output : ZBUFFv05_recommendedDOutSize==128 KB block size is the internal unit, it ensures it's always possible to write a full block when decoded. +* input : ZBUFFv05_recommendedDInSize==128Kb+3; just follow indications from ZBUFFv05_decompressContinue() to minimize latency. It should always be <= 128 KB + 3 . +* *******************************************************************************/ + + +/* ************************************* +* Tool functions +***************************************/ +unsigned ZBUFFv05_isError(size_t errorCode); +const char* ZBUFFv05_getErrorName(size_t errorCode); + +/** Functions below provide recommended buffer sizes for Compression or Decompression operations. +* These sizes are just hints, and tend to offer better latency */ +size_t ZBUFFv05_recommendedDInSize(void); +size_t ZBUFFv05_recommendedDOutSize(void); + + + +/*-************************************* +* Constants +***************************************/ +#define ZSTDv05_MAGICNUMBER 0xFD2FB525 /* v0.5 */ + + + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTDv0505_H */ +/**** ended inlining zstd_v05.h ****/ +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) +/**** start inlining zstd_v06.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTDv06_H +#define ZSTDv06_H + +#if defined (__cplusplus) +extern "C" { +#endif + +/*====== Dependency ======*/ +#include /* size_t */ + + +/*====== Export for Windows ======*/ +/*! +* ZSTDv06_DLL_EXPORT : +* Enable exporting of functions when building a Windows DLL +*/ +#if defined(_WIN32) && defined(ZSTDv06_DLL_EXPORT) && (ZSTDv06_DLL_EXPORT==1) +# define ZSTDLIBv06_API __declspec(dllexport) +#else +# define ZSTDLIBv06_API +#endif + + +/* ************************************* +* Simple functions +***************************************/ +/*! ZSTDv06_decompress() : + `compressedSize` : is the _exact_ size of the compressed blob, otherwise decompression will fail. + `dstCapacity` must be large enough, equal or larger than originalSize. + @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), + or an errorCode if it fails (which can be tested using ZSTDv06_isError()) */ +ZSTDLIBv06_API size_t ZSTDv06_decompress( void* dst, size_t dstCapacity, + const void* src, size_t compressedSize); + +/** +ZSTDv06_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.6.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. +*/ +void ZSTDv06_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + +/* ************************************* +* Helper functions +***************************************/ +ZSTDLIBv06_API size_t ZSTDv06_compressBound(size_t srcSize); /*!< maximum compressed size (worst case scenario) */ + +/* Error Management */ +ZSTDLIBv06_API unsigned ZSTDv06_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ +ZSTDLIBv06_API const char* ZSTDv06_getErrorName(size_t code); /*!< provides readable string for an error code */ + + +/* ************************************* +* Explicit memory management +***************************************/ +/** Decompression context */ +typedef struct ZSTDv06_DCtx_s ZSTDv06_DCtx; +ZSTDLIBv06_API ZSTDv06_DCtx* ZSTDv06_createDCtx(void); +ZSTDLIBv06_API size_t ZSTDv06_freeDCtx(ZSTDv06_DCtx* dctx); /*!< @return : errorCode */ + +/** ZSTDv06_decompressDCtx() : +* Same as ZSTDv06_decompress(), but requires an already allocated ZSTDv06_DCtx (see ZSTDv06_createDCtx()) */ +ZSTDLIBv06_API size_t ZSTDv06_decompressDCtx(ZSTDv06_DCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + +/*-*********************** +* Dictionary API +*************************/ +/*! ZSTDv06_decompress_usingDict() : +* Decompression using a pre-defined Dictionary content (see dictBuilder). +* Dictionary must be identical to the one used during compression, otherwise regenerated data will be corrupted. +* Note : dict can be NULL, in which case, it's equivalent to ZSTDv06_decompressDCtx() */ +ZSTDLIBv06_API size_t ZSTDv06_decompress_usingDict(ZSTDv06_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize); + + +/*-************************ +* Advanced Streaming API +***************************/ +struct ZSTDv06_frameParams_s { unsigned long long frameContentSize; unsigned windowLog; }; +typedef struct ZSTDv06_frameParams_s ZSTDv06_frameParams; + +ZSTDLIBv06_API size_t ZSTDv06_getFrameParams(ZSTDv06_frameParams* fparamsPtr, const void* src, size_t srcSize); /**< doesn't consume input */ +ZSTDLIBv06_API size_t ZSTDv06_decompressBegin_usingDict(ZSTDv06_DCtx* dctx, const void* dict, size_t dictSize); +ZSTDLIBv06_API void ZSTDv06_copyDCtx(ZSTDv06_DCtx* dctx, const ZSTDv06_DCtx* preparedDCtx); + +ZSTDLIBv06_API size_t ZSTDv06_nextSrcSizeToDecompress(ZSTDv06_DCtx* dctx); +ZSTDLIBv06_API size_t ZSTDv06_decompressContinue(ZSTDv06_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + + +/* ************************************* +* ZBUFF API +***************************************/ + +typedef struct ZBUFFv06_DCtx_s ZBUFFv06_DCtx; +ZSTDLIBv06_API ZBUFFv06_DCtx* ZBUFFv06_createDCtx(void); +ZSTDLIBv06_API size_t ZBUFFv06_freeDCtx(ZBUFFv06_DCtx* dctx); + +ZSTDLIBv06_API size_t ZBUFFv06_decompressInit(ZBUFFv06_DCtx* dctx); +ZSTDLIBv06_API size_t ZBUFFv06_decompressInitDictionary(ZBUFFv06_DCtx* dctx, const void* dict, size_t dictSize); + +ZSTDLIBv06_API size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* dctx, + void* dst, size_t* dstCapacityPtr, + const void* src, size_t* srcSizePtr); + +/*-*************************************************************************** +* Streaming decompression howto +* +* A ZBUFFv06_DCtx object is required to track streaming operations. +* Use ZBUFFv06_createDCtx() and ZBUFFv06_freeDCtx() to create/release resources. +* Use ZBUFFv06_decompressInit() to start a new decompression operation, +* or ZBUFFv06_decompressInitDictionary() if decompression requires a dictionary. +* Note that ZBUFFv06_DCtx objects can be re-init multiple times. +* +* Use ZBUFFv06_decompressContinue() repetitively to consume your input. +* *srcSizePtr and *dstCapacityPtr can be any size. +* The function will report how many bytes were read or written by modifying *srcSizePtr and *dstCapacityPtr. +* Note that it may not consume the entire input, in which case it's up to the caller to present remaining input again. +* The content of `dst` will be overwritten (up to *dstCapacityPtr) at each function call, so save its content if it matters, or change `dst`. +* @return : a hint to preferred nb of bytes to use as input for next function call (it's only a hint, to help latency), +* or 0 when a frame is completely decoded, +* or an error code, which can be tested using ZBUFFv06_isError(). +* +* Hint : recommended buffer sizes (not compulsory) : ZBUFFv06_recommendedDInSize() and ZBUFFv06_recommendedDOutSize() +* output : ZBUFFv06_recommendedDOutSize== 128 KB block size is the internal unit, it ensures it's always possible to write a full block when decoded. +* input : ZBUFFv06_recommendedDInSize == 128KB + 3; +* just follow indications from ZBUFFv06_decompressContinue() to minimize latency. It should always be <= 128 KB + 3 . +* *******************************************************************************/ + + +/* ************************************* +* Tool functions +***************************************/ +ZSTDLIBv06_API unsigned ZBUFFv06_isError(size_t errorCode); +ZSTDLIBv06_API const char* ZBUFFv06_getErrorName(size_t errorCode); + +/** Functions below provide recommended buffer sizes for Compression or Decompression operations. +* These sizes are just hints, they tend to offer better latency */ +ZSTDLIBv06_API size_t ZBUFFv06_recommendedDInSize(void); +ZSTDLIBv06_API size_t ZBUFFv06_recommendedDOutSize(void); + + +/*-************************************* +* Constants +***************************************/ +#define ZSTDv06_MAGICNUMBER 0xFD2FB526 /* v0.6 */ + + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTDv06_BUFFERED_H */ +/**** ended inlining zstd_v06.h ****/ +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) +/**** start inlining zstd_v07.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTDv07_H_235446 +#define ZSTDv07_H_235446 + +#if defined (__cplusplus) +extern "C" { +#endif + +/*====== Dependency ======*/ +#include /* size_t */ + + +/*====== Export for Windows ======*/ +/*! +* ZSTDv07_DLL_EXPORT : +* Enable exporting of functions when building a Windows DLL +*/ +#if defined(_WIN32) && defined(ZSTDv07_DLL_EXPORT) && (ZSTDv07_DLL_EXPORT==1) +# define ZSTDLIBv07_API __declspec(dllexport) +#else +# define ZSTDLIBv07_API +#endif + + +/* ************************************* +* Simple API +***************************************/ +/*! ZSTDv07_getDecompressedSize() : +* @return : decompressed size if known, 0 otherwise. + note 1 : if `0`, follow up with ZSTDv07_getFrameParams() to know precise failure cause. + note 2 : decompressed size could be wrong or intentionally modified ! + always ensure results fit within application's authorized limits */ +unsigned long long ZSTDv07_getDecompressedSize(const void* src, size_t srcSize); + +/*! ZSTDv07_decompress() : + `compressedSize` : must be _exact_ size of compressed input, otherwise decompression will fail. + `dstCapacity` must be equal or larger than originalSize. + @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), + or an errorCode if it fails (which can be tested using ZSTDv07_isError()) */ +ZSTDLIBv07_API size_t ZSTDv07_decompress( void* dst, size_t dstCapacity, + const void* src, size_t compressedSize); + +/** +ZSTDv07_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.7.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. +*/ +void ZSTDv07_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + +/*====== Helper functions ======*/ +ZSTDLIBv07_API unsigned ZSTDv07_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ +ZSTDLIBv07_API const char* ZSTDv07_getErrorName(size_t code); /*!< provides readable string from an error code */ + + +/*-************************************* +* Explicit memory management +***************************************/ +/** Decompression context */ +typedef struct ZSTDv07_DCtx_s ZSTDv07_DCtx; +ZSTDLIBv07_API ZSTDv07_DCtx* ZSTDv07_createDCtx(void); +ZSTDLIBv07_API size_t ZSTDv07_freeDCtx(ZSTDv07_DCtx* dctx); /*!< @return : errorCode */ + +/** ZSTDv07_decompressDCtx() : +* Same as ZSTDv07_decompress(), requires an allocated ZSTDv07_DCtx (see ZSTDv07_createDCtx()) */ +ZSTDLIBv07_API size_t ZSTDv07_decompressDCtx(ZSTDv07_DCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + +/*-************************ +* Simple dictionary API +***************************/ +/*! ZSTDv07_decompress_usingDict() : +* Decompression using a pre-defined Dictionary content (see dictBuilder). +* Dictionary must be identical to the one used during compression. +* Note : This function load the dictionary, resulting in a significant startup time */ +ZSTDLIBv07_API size_t ZSTDv07_decompress_usingDict(ZSTDv07_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize); + + +/*-************************** +* Advanced Dictionary API +****************************/ +/*! ZSTDv07_createDDict() : +* Create a digested dictionary, ready to start decompression operation without startup delay. +* `dict` can be released after creation */ +typedef struct ZSTDv07_DDict_s ZSTDv07_DDict; +ZSTDLIBv07_API ZSTDv07_DDict* ZSTDv07_createDDict(const void* dict, size_t dictSize); +ZSTDLIBv07_API size_t ZSTDv07_freeDDict(ZSTDv07_DDict* ddict); + +/*! ZSTDv07_decompress_usingDDict() : +* Decompression using a pre-digested Dictionary +* Faster startup than ZSTDv07_decompress_usingDict(), recommended when same dictionary is used multiple times. */ +ZSTDLIBv07_API size_t ZSTDv07_decompress_usingDDict(ZSTDv07_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTDv07_DDict* ddict); + +typedef struct { + unsigned long long frameContentSize; + unsigned windowSize; + unsigned dictID; + unsigned checksumFlag; +} ZSTDv07_frameParams; + +ZSTDLIBv07_API size_t ZSTDv07_getFrameParams(ZSTDv07_frameParams* fparamsPtr, const void* src, size_t srcSize); /**< doesn't consume input */ + + + + +/* ************************************* +* Streaming functions +***************************************/ +typedef struct ZBUFFv07_DCtx_s ZBUFFv07_DCtx; +ZSTDLIBv07_API ZBUFFv07_DCtx* ZBUFFv07_createDCtx(void); +ZSTDLIBv07_API size_t ZBUFFv07_freeDCtx(ZBUFFv07_DCtx* dctx); + +ZSTDLIBv07_API size_t ZBUFFv07_decompressInit(ZBUFFv07_DCtx* dctx); +ZSTDLIBv07_API size_t ZBUFFv07_decompressInitDictionary(ZBUFFv07_DCtx* dctx, const void* dict, size_t dictSize); + +ZSTDLIBv07_API size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* dctx, + void* dst, size_t* dstCapacityPtr, + const void* src, size_t* srcSizePtr); + +/*-*************************************************************************** +* Streaming decompression howto +* +* A ZBUFFv07_DCtx object is required to track streaming operations. +* Use ZBUFFv07_createDCtx() and ZBUFFv07_freeDCtx() to create/release resources. +* Use ZBUFFv07_decompressInit() to start a new decompression operation, +* or ZBUFFv07_decompressInitDictionary() if decompression requires a dictionary. +* Note that ZBUFFv07_DCtx objects can be re-init multiple times. +* +* Use ZBUFFv07_decompressContinue() repetitively to consume your input. +* *srcSizePtr and *dstCapacityPtr can be any size. +* The function will report how many bytes were read or written by modifying *srcSizePtr and *dstCapacityPtr. +* Note that it may not consume the entire input, in which case it's up to the caller to present remaining input again. +* The content of `dst` will be overwritten (up to *dstCapacityPtr) at each function call, so save its content if it matters, or change `dst`. +* @return : a hint to preferred nb of bytes to use as input for next function call (it's only a hint, to help latency), +* or 0 when a frame is completely decoded, +* or an error code, which can be tested using ZBUFFv07_isError(). +* +* Hint : recommended buffer sizes (not compulsory) : ZBUFFv07_recommendedDInSize() and ZBUFFv07_recommendedDOutSize() +* output : ZBUFFv07_recommendedDOutSize== 128 KB block size is the internal unit, it ensures it's always possible to write a full block when decoded. +* input : ZBUFFv07_recommendedDInSize == 128KB + 3; +* just follow indications from ZBUFFv07_decompressContinue() to minimize latency. It should always be <= 128 KB + 3 . +* *******************************************************************************/ + + +/* ************************************* +* Tool functions +***************************************/ +ZSTDLIBv07_API unsigned ZBUFFv07_isError(size_t errorCode); +ZSTDLIBv07_API const char* ZBUFFv07_getErrorName(size_t errorCode); + +/** Functions below provide recommended buffer sizes for Compression or Decompression operations. +* These sizes are just hints, they tend to offer better latency */ +ZSTDLIBv07_API size_t ZBUFFv07_recommendedDInSize(void); +ZSTDLIBv07_API size_t ZBUFFv07_recommendedDOutSize(void); + + +/*-************************************* +* Constants +***************************************/ +#define ZSTDv07_MAGICNUMBER 0xFD2FB527 /* v0.7 */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTDv07_H_235446 */ +/**** ended inlining zstd_v07.h ****/ +#endif + +/** ZSTD_isLegacy() : + @return : > 0 if supported by legacy decoder. 0 otherwise. + return value is the version. +*/ +MEM_STATIC unsigned ZSTD_isLegacy(const void* src, size_t srcSize) +{ + U32 magicNumberLE; + if (srcSize<4) return 0; + magicNumberLE = MEM_readLE32(src); + switch(magicNumberLE) + { +#if (ZSTD_LEGACY_SUPPORT <= 1) + case ZSTDv01_magicNumberLE:return 1; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 2) + case ZSTDv02_magicNumber : return 2; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 3) + case ZSTDv03_magicNumber : return 3; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 4) + case ZSTDv04_magicNumber : return 4; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) + case ZSTDv05_MAGICNUMBER : return 5; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + case ZSTDv06_MAGICNUMBER : return 6; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + case ZSTDv07_MAGICNUMBER : return 7; +#endif + default : return 0; + } +} + + +MEM_STATIC unsigned long long ZSTD_getDecompressedSize_legacy(const void* src, size_t srcSize) +{ + U32 const version = ZSTD_isLegacy(src, srcSize); + if (version < 5) return 0; /* no decompressed size in frame header, or not a legacy format */ +#if (ZSTD_LEGACY_SUPPORT <= 5) + if (version==5) { + ZSTDv05_parameters fParams; + size_t const frResult = ZSTDv05_getFrameParams(&fParams, src, srcSize); + if (frResult != 0) return 0; + return fParams.srcSize; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + if (version==6) { + ZSTDv06_frameParams fParams; + size_t const frResult = ZSTDv06_getFrameParams(&fParams, src, srcSize); + if (frResult != 0) return 0; + return fParams.frameContentSize; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + if (version==7) { + ZSTDv07_frameParams fParams; + size_t const frResult = ZSTDv07_getFrameParams(&fParams, src, srcSize); + if (frResult != 0) return 0; + return fParams.frameContentSize; + } +#endif + return 0; /* should not be possible */ +} + + +MEM_STATIC size_t ZSTD_decompressLegacy( + void* dst, size_t dstCapacity, + const void* src, size_t compressedSize, + const void* dict,size_t dictSize) +{ + U32 const version = ZSTD_isLegacy(src, compressedSize); + (void)dst; (void)dstCapacity; (void)dict; (void)dictSize; /* unused when ZSTD_LEGACY_SUPPORT >= 8 */ + switch(version) + { +#if (ZSTD_LEGACY_SUPPORT <= 1) + case 1 : + return ZSTDv01_decompress(dst, dstCapacity, src, compressedSize); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 2) + case 2 : + return ZSTDv02_decompress(dst, dstCapacity, src, compressedSize); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 3) + case 3 : + return ZSTDv03_decompress(dst, dstCapacity, src, compressedSize); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 4) + case 4 : + return ZSTDv04_decompress(dst, dstCapacity, src, compressedSize); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) + case 5 : + { size_t result; + ZSTDv05_DCtx* const zd = ZSTDv05_createDCtx(); + if (zd==NULL) return ERROR(memory_allocation); + result = ZSTDv05_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize); + ZSTDv05_freeDCtx(zd); + return result; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + case 6 : + { size_t result; + ZSTDv06_DCtx* const zd = ZSTDv06_createDCtx(); + if (zd==NULL) return ERROR(memory_allocation); + result = ZSTDv06_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize); + ZSTDv06_freeDCtx(zd); + return result; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + case 7 : + { size_t result; + ZSTDv07_DCtx* const zd = ZSTDv07_createDCtx(); + if (zd==NULL) return ERROR(memory_allocation); + result = ZSTDv07_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize); + ZSTDv07_freeDCtx(zd); + return result; + } +#endif + default : + return ERROR(prefix_unknown); + } +} + +MEM_STATIC ZSTD_frameSizeInfo ZSTD_findFrameSizeInfoLegacy(const void *src, size_t srcSize) +{ + ZSTD_frameSizeInfo frameSizeInfo; + U32 const version = ZSTD_isLegacy(src, srcSize); + switch(version) + { +#if (ZSTD_LEGACY_SUPPORT <= 1) + case 1 : + ZSTDv01_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 2) + case 2 : + ZSTDv02_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 3) + case 3 : + ZSTDv03_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 4) + case 4 : + ZSTDv04_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) + case 5 : + ZSTDv05_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + case 6 : + ZSTDv06_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + case 7 : + ZSTDv07_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif + default : + frameSizeInfo.compressedSize = ERROR(prefix_unknown); + frameSizeInfo.decompressedBound = ZSTD_CONTENTSIZE_ERROR; + break; + } + if (!ZSTD_isError(frameSizeInfo.compressedSize) && frameSizeInfo.compressedSize > srcSize) { + frameSizeInfo.compressedSize = ERROR(srcSize_wrong); + frameSizeInfo.decompressedBound = ZSTD_CONTENTSIZE_ERROR; + } + /* In all cases, decompressedBound == nbBlocks * ZSTD_BLOCKSIZE_MAX. + * So we can compute nbBlocks without having to change every function. + */ + if (frameSizeInfo.decompressedBound != ZSTD_CONTENTSIZE_ERROR) { + assert((frameSizeInfo.decompressedBound & (ZSTD_BLOCKSIZE_MAX - 1)) == 0); + frameSizeInfo.nbBlocks = (size_t)(frameSizeInfo.decompressedBound / ZSTD_BLOCKSIZE_MAX); + } + return frameSizeInfo; +} + +MEM_STATIC size_t ZSTD_findFrameCompressedSizeLegacy(const void *src, size_t srcSize) +{ + ZSTD_frameSizeInfo frameSizeInfo = ZSTD_findFrameSizeInfoLegacy(src, srcSize); + return frameSizeInfo.compressedSize; +} + +MEM_STATIC size_t ZSTD_freeLegacyStreamContext(void* legacyContext, U32 version) +{ + switch(version) + { + default : + case 1 : + case 2 : + case 3 : + (void)legacyContext; + return ERROR(version_unsupported); +#if (ZSTD_LEGACY_SUPPORT <= 4) + case 4 : return ZBUFFv04_freeDCtx((ZBUFFv04_DCtx*)legacyContext); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) + case 5 : return ZBUFFv05_freeDCtx((ZBUFFv05_DCtx*)legacyContext); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + case 6 : return ZBUFFv06_freeDCtx((ZBUFFv06_DCtx*)legacyContext); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + case 7 : return ZBUFFv07_freeDCtx((ZBUFFv07_DCtx*)legacyContext); +#endif + } +} + + +MEM_STATIC size_t ZSTD_initLegacyStream(void** legacyContext, U32 prevVersion, U32 newVersion, + const void* dict, size_t dictSize) +{ + DEBUGLOG(5, "ZSTD_initLegacyStream for v0.%u", newVersion); + if (prevVersion != newVersion) ZSTD_freeLegacyStreamContext(*legacyContext, prevVersion); + switch(newVersion) + { + default : + case 1 : + case 2 : + case 3 : + (void)dict; (void)dictSize; + return 0; +#if (ZSTD_LEGACY_SUPPORT <= 4) + case 4 : + { + ZBUFFv04_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv04_createDCtx() : (ZBUFFv04_DCtx*)*legacyContext; + if (dctx==NULL) return ERROR(memory_allocation); + ZBUFFv04_decompressInit(dctx); + ZBUFFv04_decompressWithDictionary(dctx, dict, dictSize); + *legacyContext = dctx; + return 0; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) + case 5 : + { + ZBUFFv05_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv05_createDCtx() : (ZBUFFv05_DCtx*)*legacyContext; + if (dctx==NULL) return ERROR(memory_allocation); + ZBUFFv05_decompressInitDictionary(dctx, dict, dictSize); + *legacyContext = dctx; + return 0; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + case 6 : + { + ZBUFFv06_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv06_createDCtx() : (ZBUFFv06_DCtx*)*legacyContext; + if (dctx==NULL) return ERROR(memory_allocation); + ZBUFFv06_decompressInitDictionary(dctx, dict, dictSize); + *legacyContext = dctx; + return 0; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + case 7 : + { + ZBUFFv07_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv07_createDCtx() : (ZBUFFv07_DCtx*)*legacyContext; + if (dctx==NULL) return ERROR(memory_allocation); + ZBUFFv07_decompressInitDictionary(dctx, dict, dictSize); + *legacyContext = dctx; + return 0; + } +#endif + } +} + + + +MEM_STATIC size_t ZSTD_decompressLegacyStream(void* legacyContext, U32 version, + ZSTD_outBuffer* output, ZSTD_inBuffer* input) +{ + DEBUGLOG(5, "ZSTD_decompressLegacyStream for v0.%u", version); + switch(version) + { + default : + case 1 : + case 2 : + case 3 : + (void)legacyContext; (void)output; (void)input; + return ERROR(version_unsupported); +#if (ZSTD_LEGACY_SUPPORT <= 4) + case 4 : + { + ZBUFFv04_DCtx* dctx = (ZBUFFv04_DCtx*) legacyContext; + const void* src = (const char*)input->src + input->pos; + size_t readSize = input->size - input->pos; + void* dst = (char*)output->dst + output->pos; + size_t decodedSize = output->size - output->pos; + size_t const hintSize = ZBUFFv04_decompressContinue(dctx, dst, &decodedSize, src, &readSize); + output->pos += decodedSize; + input->pos += readSize; + return hintSize; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) + case 5 : + { + ZBUFFv05_DCtx* dctx = (ZBUFFv05_DCtx*) legacyContext; + const void* src = (const char*)input->src + input->pos; + size_t readSize = input->size - input->pos; + void* dst = (char*)output->dst + output->pos; + size_t decodedSize = output->size - output->pos; + size_t const hintSize = ZBUFFv05_decompressContinue(dctx, dst, &decodedSize, src, &readSize); + output->pos += decodedSize; + input->pos += readSize; + return hintSize; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + case 6 : + { + ZBUFFv06_DCtx* dctx = (ZBUFFv06_DCtx*) legacyContext; + const void* src = (const char*)input->src + input->pos; + size_t readSize = input->size - input->pos; + void* dst = (char*)output->dst + output->pos; + size_t decodedSize = output->size - output->pos; + size_t const hintSize = ZBUFFv06_decompressContinue(dctx, dst, &decodedSize, src, &readSize); + output->pos += decodedSize; + input->pos += readSize; + return hintSize; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + case 7 : + { + ZBUFFv07_DCtx* dctx = (ZBUFFv07_DCtx*) legacyContext; + const void* src = (const char*)input->src + input->pos; + size_t readSize = input->size - input->pos; + void* dst = (char*)output->dst + output->pos; + size_t decodedSize = output->size - output->pos; + size_t const hintSize = ZBUFFv07_decompressContinue(dctx, dst, &decodedSize, src, &readSize); + output->pos += decodedSize; + input->pos += readSize; + return hintSize; + } +#endif + } +} + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_LEGACY_H */ +/**** ended inlining ../legacy/zstd_legacy.h ****/ +#endif + + + +/*-******************************************************* +* Types +*********************************************************/ +struct ZSTD_DDict_s { + void* dictBuffer; + const void* dictContent; + size_t dictSize; + ZSTD_entropyDTables_t entropy; + U32 dictID; + U32 entropyPresent; + ZSTD_customMem cMem; +}; /* typedef'd to ZSTD_DDict within "zstd.h" */ + +const void* ZSTD_DDict_dictContent(const ZSTD_DDict* ddict) +{ + assert(ddict != NULL); + return ddict->dictContent; +} + +size_t ZSTD_DDict_dictSize(const ZSTD_DDict* ddict) +{ + assert(ddict != NULL); + return ddict->dictSize; +} + +void ZSTD_copyDDictParameters(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict) +{ + DEBUGLOG(4, "ZSTD_copyDDictParameters"); + assert(dctx != NULL); + assert(ddict != NULL); + dctx->dictID = ddict->dictID; + dctx->prefixStart = ddict->dictContent; + dctx->virtualStart = ddict->dictContent; + dctx->dictEnd = (const BYTE*)ddict->dictContent + ddict->dictSize; + dctx->previousDstEnd = dctx->dictEnd; +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + dctx->dictContentBeginForFuzzing = dctx->prefixStart; + dctx->dictContentEndForFuzzing = dctx->previousDstEnd; +#endif + if (ddict->entropyPresent) { + dctx->litEntropy = 1; + dctx->fseEntropy = 1; + dctx->LLTptr = ddict->entropy.LLTable; + dctx->MLTptr = ddict->entropy.MLTable; + dctx->OFTptr = ddict->entropy.OFTable; + dctx->HUFptr = ddict->entropy.hufTable; + dctx->entropy.rep[0] = ddict->entropy.rep[0]; + dctx->entropy.rep[1] = ddict->entropy.rep[1]; + dctx->entropy.rep[2] = ddict->entropy.rep[2]; + } else { + dctx->litEntropy = 0; + dctx->fseEntropy = 0; + } +} + + +static size_t +ZSTD_loadEntropy_intoDDict(ZSTD_DDict* ddict, + ZSTD_dictContentType_e dictContentType) +{ + ddict->dictID = 0; + ddict->entropyPresent = 0; + if (dictContentType == ZSTD_dct_rawContent) return 0; + + if (ddict->dictSize < 8) { + if (dictContentType == ZSTD_dct_fullDict) + return ERROR(dictionary_corrupted); /* only accept specified dictionaries */ + return 0; /* pure content mode */ + } + { U32 const magic = MEM_readLE32(ddict->dictContent); + if (magic != ZSTD_MAGIC_DICTIONARY) { + if (dictContentType == ZSTD_dct_fullDict) + return ERROR(dictionary_corrupted); /* only accept specified dictionaries */ + return 0; /* pure content mode */ + } + } + ddict->dictID = MEM_readLE32((const char*)ddict->dictContent + ZSTD_FRAMEIDSIZE); + + /* load entropy tables */ + RETURN_ERROR_IF(ZSTD_isError(ZSTD_loadDEntropy( + &ddict->entropy, ddict->dictContent, ddict->dictSize)), + dictionary_corrupted, ""); + ddict->entropyPresent = 1; + return 0; +} + + +static size_t ZSTD_initDDict_internal(ZSTD_DDict* ddict, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType) +{ + if ((dictLoadMethod == ZSTD_dlm_byRef) || (!dict) || (!dictSize)) { + ddict->dictBuffer = NULL; + ddict->dictContent = dict; + if (!dict) dictSize = 0; + } else { + void* const internalBuffer = ZSTD_customMalloc(dictSize, ddict->cMem); + ddict->dictBuffer = internalBuffer; + ddict->dictContent = internalBuffer; + if (!internalBuffer) return ERROR(memory_allocation); + ZSTD_memcpy(internalBuffer, dict, dictSize); + } + ddict->dictSize = dictSize; + ddict->entropy.hufTable[0] = (HUF_DTable)((ZSTD_HUFFDTABLE_CAPACITY_LOG)*0x1000001); /* cover both little and big endian */ + + /* parse dictionary content */ + FORWARD_IF_ERROR( ZSTD_loadEntropy_intoDDict(ddict, dictContentType) , ""); + + return 0; +} + +ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_customMem customMem) +{ + if ((!customMem.customAlloc) ^ (!customMem.customFree)) return NULL; + + { ZSTD_DDict* const ddict = (ZSTD_DDict*) ZSTD_customMalloc(sizeof(ZSTD_DDict), customMem); + if (ddict == NULL) return NULL; + ddict->cMem = customMem; + { size_t const initResult = ZSTD_initDDict_internal(ddict, + dict, dictSize, + dictLoadMethod, dictContentType); + if (ZSTD_isError(initResult)) { + ZSTD_freeDDict(ddict); + return NULL; + } } + return ddict; + } +} + +/*! ZSTD_createDDict() : +* Create a digested dictionary, to start decompression without startup delay. +* `dict` content is copied inside DDict. +* Consequently, `dict` can be released after `ZSTD_DDict` creation */ +ZSTD_DDict* ZSTD_createDDict(const void* dict, size_t dictSize) +{ + ZSTD_customMem const allocator = { NULL, NULL, NULL }; + return ZSTD_createDDict_advanced(dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto, allocator); +} + +/*! ZSTD_createDDict_byReference() : + * Create a digested dictionary, to start decompression without startup delay. + * Dictionary content is simply referenced, it will be accessed during decompression. + * Warning : dictBuffer must outlive DDict (DDict must be freed before dictBuffer) */ +ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize) +{ + ZSTD_customMem const allocator = { NULL, NULL, NULL }; + return ZSTD_createDDict_advanced(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, allocator); +} + + +const ZSTD_DDict* ZSTD_initStaticDDict( + void* sBuffer, size_t sBufferSize, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType) +{ + size_t const neededSpace = sizeof(ZSTD_DDict) + + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize); + ZSTD_DDict* const ddict = (ZSTD_DDict*)sBuffer; + assert(sBuffer != NULL); + assert(dict != NULL); + if ((size_t)sBuffer & 7) return NULL; /* 8-aligned */ + if (sBufferSize < neededSpace) return NULL; + if (dictLoadMethod == ZSTD_dlm_byCopy) { + ZSTD_memcpy(ddict+1, dict, dictSize); /* local copy */ + dict = ddict+1; + } + if (ZSTD_isError( ZSTD_initDDict_internal(ddict, + dict, dictSize, + ZSTD_dlm_byRef, dictContentType) )) + return NULL; + return ddict; +} + + +size_t ZSTD_freeDDict(ZSTD_DDict* ddict) +{ + if (ddict==NULL) return 0; /* support free on NULL */ + { ZSTD_customMem const cMem = ddict->cMem; + ZSTD_customFree(ddict->dictBuffer, cMem); + ZSTD_customFree(ddict, cMem); + return 0; + } +} + +/*! ZSTD_estimateDDictSize() : + * Estimate amount of memory that will be needed to create a dictionary for decompression. + * Note : dictionary created by reference using ZSTD_dlm_byRef are smaller */ +size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod) +{ + return sizeof(ZSTD_DDict) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize); +} + +size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict) +{ + if (ddict==NULL) return 0; /* support sizeof on NULL */ + return sizeof(*ddict) + (ddict->dictBuffer ? ddict->dictSize : 0) ; +} + +/*! ZSTD_getDictID_fromDDict() : + * Provides the dictID of the dictionary loaded into `ddict`. + * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ +unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict) +{ + if (ddict==NULL) return 0; + return ddict->dictID; +} +/**** ended inlining decompress/zstd_ddict.c ****/ +/**** start inlining decompress/zstd_decompress.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + +/* *************************************************************** +* Tuning parameters +*****************************************************************/ +/*! + * HEAPMODE : + * Select how default decompression function ZSTD_decompress() allocates its context, + * on stack (0), or into heap (1, default; requires malloc()). + * Note that functions with explicit context such as ZSTD_decompressDCtx() are unaffected. + */ +#ifndef ZSTD_HEAPMODE +# define ZSTD_HEAPMODE 1 +#endif + +/*! +* LEGACY_SUPPORT : +* if set to 1+, ZSTD_decompress() can decode older formats (v0.1+) +*/ +#ifndef ZSTD_LEGACY_SUPPORT +# define ZSTD_LEGACY_SUPPORT 0 +#endif + +/*! + * MAXWINDOWSIZE_DEFAULT : + * maximum window size accepted by DStream __by default__. + * Frames requiring more memory will be rejected. + * It's possible to set a different limit using ZSTD_DCtx_setMaxWindowSize(). + */ +#ifndef ZSTD_MAXWINDOWSIZE_DEFAULT +# define ZSTD_MAXWINDOWSIZE_DEFAULT (((U32)1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) + 1) +#endif + +/*! + * NO_FORWARD_PROGRESS_MAX : + * maximum allowed nb of calls to ZSTD_decompressStream() + * without any forward progress + * (defined as: no byte read from input, and no byte flushed to output) + * before triggering an error. + */ +#ifndef ZSTD_NO_FORWARD_PROGRESS_MAX +# define ZSTD_NO_FORWARD_PROGRESS_MAX 16 +#endif + + +/*-******************************************************* +* Dependencies +*********************************************************/ +/**** skipping file: ../common/allocations.h ****/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../common/mem.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/huf.h ****/ +/**** skipping file: ../common/xxhash.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: zstd_decompress_internal.h ****/ +/**** skipping file: zstd_ddict.h ****/ +/**** start inlining zstd_decompress_block.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + +#ifndef ZSTD_DEC_BLOCK_H +#define ZSTD_DEC_BLOCK_H + +/*-******************************************************* + * Dependencies + *********************************************************/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../zstd.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: zstd_decompress_internal.h ****/ + + +/* === Prototypes === */ + +/* note: prototypes already published within `zstd.h` : + * ZSTD_decompressBlock() + */ + +/* note: prototypes already published within `zstd_internal.h` : + * ZSTD_getcBlockSize() + * ZSTD_decodeSeqHeaders() + */ + + + /* Streaming state is used to inform allocation of the literal buffer */ +typedef enum { + not_streaming = 0, + is_streaming = 1 +} streaming_operation; + +/* ZSTD_decompressBlock_internal() : + * decompress block, starting at `src`, + * into destination buffer `dst`. + * @return : decompressed block size, + * or an error code (which can be tested using ZSTD_isError()) + */ +size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, const int frame, const streaming_operation streaming); + +/* ZSTD_buildFSETable() : + * generate FSE decoding table for one symbol (ll, ml or off) + * this function must be called with valid parameters only + * (dt is large enough, normalizedCounter distribution total is a power of 2, max is within range, etc.) + * in which case it cannot fail. + * The workspace must be 4-byte aligned and at least ZSTD_BUILD_FSE_TABLE_WKSP_SIZE bytes, which is + * defined in zstd_decompress_internal.h. + * Internal use only. + */ +void ZSTD_buildFSETable(ZSTD_seqSymbol* dt, + const short* normalizedCounter, unsigned maxSymbolValue, + const U32* baseValue, const U8* nbAdditionalBits, + unsigned tableLog, void* wksp, size_t wkspSize, + int bmi2); + +/* Internal definition of ZSTD_decompressBlock() to avoid deprecation warnings. */ +size_t ZSTD_decompressBlock_deprecated(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize); + + +#endif /* ZSTD_DEC_BLOCK_H */ +/**** ended inlining zstd_decompress_block.h ****/ +/**** skipping file: ../common/bits.h ****/ + +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) +/**** skipping file: ../legacy/zstd_legacy.h ****/ +#endif + + + +/************************************* + * Multiple DDicts Hashset internals * + *************************************/ + +#define DDICT_HASHSET_MAX_LOAD_FACTOR_COUNT_MULT 4 +#define DDICT_HASHSET_MAX_LOAD_FACTOR_SIZE_MULT 3 /* These two constants represent SIZE_MULT/COUNT_MULT load factor without using a float. + * Currently, that means a 0.75 load factor. + * So, if count * COUNT_MULT / size * SIZE_MULT != 0, then we've exceeded + * the load factor of the ddict hash set. + */ + +#define DDICT_HASHSET_TABLE_BASE_SIZE 64 +#define DDICT_HASHSET_RESIZE_FACTOR 2 + +/* Hash function to determine starting position of dict insertion within the table + * Returns an index between [0, hashSet->ddictPtrTableSize] + */ +static size_t ZSTD_DDictHashSet_getIndex(const ZSTD_DDictHashSet* hashSet, U32 dictID) { + const U64 hash = XXH64(&dictID, sizeof(U32), 0); + /* DDict ptr table size is a multiple of 2, use size - 1 as mask to get index within [0, hashSet->ddictPtrTableSize) */ + return hash & (hashSet->ddictPtrTableSize - 1); +} + +/* Adds DDict to a hashset without resizing it. + * If inserting a DDict with a dictID that already exists in the set, replaces the one in the set. + * Returns 0 if successful, or a zstd error code if something went wrong. + */ +static size_t ZSTD_DDictHashSet_emplaceDDict(ZSTD_DDictHashSet* hashSet, const ZSTD_DDict* ddict) { + const U32 dictID = ZSTD_getDictID_fromDDict(ddict); + size_t idx = ZSTD_DDictHashSet_getIndex(hashSet, dictID); + const size_t idxRangeMask = hashSet->ddictPtrTableSize - 1; + RETURN_ERROR_IF(hashSet->ddictPtrCount == hashSet->ddictPtrTableSize, GENERIC, "Hash set is full!"); + DEBUGLOG(4, "Hashed index: for dictID: %u is %zu", dictID, idx); + while (hashSet->ddictPtrTable[idx] != NULL) { + /* Replace existing ddict if inserting ddict with same dictID */ + if (ZSTD_getDictID_fromDDict(hashSet->ddictPtrTable[idx]) == dictID) { + DEBUGLOG(4, "DictID already exists, replacing rather than adding"); + hashSet->ddictPtrTable[idx] = ddict; + return 0; + } + idx &= idxRangeMask; + idx++; + } + DEBUGLOG(4, "Final idx after probing for dictID %u is: %zu", dictID, idx); + hashSet->ddictPtrTable[idx] = ddict; + hashSet->ddictPtrCount++; + return 0; +} + +/* Expands hash table by factor of DDICT_HASHSET_RESIZE_FACTOR and + * rehashes all values, allocates new table, frees old table. + * Returns 0 on success, otherwise a zstd error code. + */ +static size_t ZSTD_DDictHashSet_expand(ZSTD_DDictHashSet* hashSet, ZSTD_customMem customMem) { + size_t newTableSize = hashSet->ddictPtrTableSize * DDICT_HASHSET_RESIZE_FACTOR; + const ZSTD_DDict** newTable = (const ZSTD_DDict**)ZSTD_customCalloc(sizeof(ZSTD_DDict*) * newTableSize, customMem); + const ZSTD_DDict** oldTable = hashSet->ddictPtrTable; + size_t oldTableSize = hashSet->ddictPtrTableSize; + size_t i; + + DEBUGLOG(4, "Expanding DDict hash table! Old size: %zu new size: %zu", oldTableSize, newTableSize); + RETURN_ERROR_IF(!newTable, memory_allocation, "Expanded hashset allocation failed!"); + hashSet->ddictPtrTable = newTable; + hashSet->ddictPtrTableSize = newTableSize; + hashSet->ddictPtrCount = 0; + for (i = 0; i < oldTableSize; ++i) { + if (oldTable[i] != NULL) { + FORWARD_IF_ERROR(ZSTD_DDictHashSet_emplaceDDict(hashSet, oldTable[i]), ""); + } + } + ZSTD_customFree((void*)oldTable, customMem); + DEBUGLOG(4, "Finished re-hash"); + return 0; +} + +/* Fetches a DDict with the given dictID + * Returns the ZSTD_DDict* with the requested dictID. If it doesn't exist, then returns NULL. + */ +static const ZSTD_DDict* ZSTD_DDictHashSet_getDDict(ZSTD_DDictHashSet* hashSet, U32 dictID) { + size_t idx = ZSTD_DDictHashSet_getIndex(hashSet, dictID); + const size_t idxRangeMask = hashSet->ddictPtrTableSize - 1; + DEBUGLOG(4, "Hashed index: for dictID: %u is %zu", dictID, idx); + for (;;) { + size_t currDictID = ZSTD_getDictID_fromDDict(hashSet->ddictPtrTable[idx]); + if (currDictID == dictID || currDictID == 0) { + /* currDictID == 0 implies a NULL ddict entry */ + break; + } else { + idx &= idxRangeMask; /* Goes to start of table when we reach the end */ + idx++; + } + } + DEBUGLOG(4, "Final idx after probing for dictID %u is: %zu", dictID, idx); + return hashSet->ddictPtrTable[idx]; +} + +/* Allocates space for and returns a ddict hash set + * The hash set's ZSTD_DDict* table has all values automatically set to NULL to begin with. + * Returns NULL if allocation failed. + */ +static ZSTD_DDictHashSet* ZSTD_createDDictHashSet(ZSTD_customMem customMem) { + ZSTD_DDictHashSet* ret = (ZSTD_DDictHashSet*)ZSTD_customMalloc(sizeof(ZSTD_DDictHashSet), customMem); + DEBUGLOG(4, "Allocating new hash set"); + if (!ret) + return NULL; + ret->ddictPtrTable = (const ZSTD_DDict**)ZSTD_customCalloc(DDICT_HASHSET_TABLE_BASE_SIZE * sizeof(ZSTD_DDict*), customMem); + if (!ret->ddictPtrTable) { + ZSTD_customFree(ret, customMem); + return NULL; + } + ret->ddictPtrTableSize = DDICT_HASHSET_TABLE_BASE_SIZE; + ret->ddictPtrCount = 0; + return ret; +} + +/* Frees the table of ZSTD_DDict* within a hashset, then frees the hashset itself. + * Note: The ZSTD_DDict* within the table are NOT freed. + */ +static void ZSTD_freeDDictHashSet(ZSTD_DDictHashSet* hashSet, ZSTD_customMem customMem) { + DEBUGLOG(4, "Freeing ddict hash set"); + if (hashSet && hashSet->ddictPtrTable) { + ZSTD_customFree((void*)hashSet->ddictPtrTable, customMem); + } + if (hashSet) { + ZSTD_customFree(hashSet, customMem); + } +} + +/* Public function: Adds a DDict into the ZSTD_DDictHashSet, possibly triggering a resize of the hash set. + * Returns 0 on success, or a ZSTD error. + */ +static size_t ZSTD_DDictHashSet_addDDict(ZSTD_DDictHashSet* hashSet, const ZSTD_DDict* ddict, ZSTD_customMem customMem) { + DEBUGLOG(4, "Adding dict ID: %u to hashset with - Count: %zu Tablesize: %zu", ZSTD_getDictID_fromDDict(ddict), hashSet->ddictPtrCount, hashSet->ddictPtrTableSize); + if (hashSet->ddictPtrCount * DDICT_HASHSET_MAX_LOAD_FACTOR_COUNT_MULT / hashSet->ddictPtrTableSize * DDICT_HASHSET_MAX_LOAD_FACTOR_SIZE_MULT != 0) { + FORWARD_IF_ERROR(ZSTD_DDictHashSet_expand(hashSet, customMem), ""); + } + FORWARD_IF_ERROR(ZSTD_DDictHashSet_emplaceDDict(hashSet, ddict), ""); + return 0; +} + +/*-************************************************************* +* Context management +***************************************************************/ +size_t ZSTD_sizeof_DCtx (const ZSTD_DCtx* dctx) +{ + if (dctx==NULL) return 0; /* support sizeof NULL */ + return sizeof(*dctx) + + ZSTD_sizeof_DDict(dctx->ddictLocal) + + dctx->inBuffSize + dctx->outBuffSize; +} + +size_t ZSTD_estimateDCtxSize(void) { return sizeof(ZSTD_DCtx); } + + +static size_t ZSTD_startingInputLength(ZSTD_format_e format) +{ + size_t const startingInputLength = ZSTD_FRAMEHEADERSIZE_PREFIX(format); + /* only supports formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless */ + assert( (format == ZSTD_f_zstd1) || (format == ZSTD_f_zstd1_magicless) ); + return startingInputLength; +} + +static void ZSTD_DCtx_resetParameters(ZSTD_DCtx* dctx) +{ + assert(dctx->streamStage == zdss_init); + dctx->format = ZSTD_f_zstd1; + dctx->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT; + dctx->outBufferMode = ZSTD_bm_buffered; + dctx->forceIgnoreChecksum = ZSTD_d_validateChecksum; + dctx->refMultipleDDicts = ZSTD_rmd_refSingleDDict; + dctx->disableHufAsm = 0; +} + +static void ZSTD_initDCtx_internal(ZSTD_DCtx* dctx) +{ + dctx->staticSize = 0; + dctx->ddict = NULL; + dctx->ddictLocal = NULL; + dctx->dictEnd = NULL; + dctx->ddictIsCold = 0; + dctx->dictUses = ZSTD_dont_use; + dctx->inBuff = NULL; + dctx->inBuffSize = 0; + dctx->outBuffSize = 0; + dctx->streamStage = zdss_init; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) + dctx->legacyContext = NULL; + dctx->previousLegacyVersion = 0; +#endif + dctx->noForwardProgress = 0; + dctx->oversizedDuration = 0; +#if DYNAMIC_BMI2 + dctx->bmi2 = ZSTD_cpuSupportsBmi2(); +#endif + dctx->ddictSet = NULL; + ZSTD_DCtx_resetParameters(dctx); +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + dctx->dictContentEndForFuzzing = NULL; +#endif +} + +ZSTD_DCtx* ZSTD_initStaticDCtx(void *workspace, size_t workspaceSize) +{ + ZSTD_DCtx* const dctx = (ZSTD_DCtx*) workspace; + + if ((size_t)workspace & 7) return NULL; /* 8-aligned */ + if (workspaceSize < sizeof(ZSTD_DCtx)) return NULL; /* minimum size */ + + ZSTD_initDCtx_internal(dctx); + dctx->staticSize = workspaceSize; + dctx->inBuff = (char*)(dctx+1); + return dctx; +} + +static ZSTD_DCtx* ZSTD_createDCtx_internal(ZSTD_customMem customMem) { + if ((!customMem.customAlloc) ^ (!customMem.customFree)) return NULL; + + { ZSTD_DCtx* const dctx = (ZSTD_DCtx*)ZSTD_customMalloc(sizeof(*dctx), customMem); + if (!dctx) return NULL; + dctx->customMem = customMem; + ZSTD_initDCtx_internal(dctx); + return dctx; + } +} + +ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem) +{ + return ZSTD_createDCtx_internal(customMem); +} + +ZSTD_DCtx* ZSTD_createDCtx(void) +{ + DEBUGLOG(3, "ZSTD_createDCtx"); + return ZSTD_createDCtx_internal(ZSTD_defaultCMem); +} + +static void ZSTD_clearDict(ZSTD_DCtx* dctx) +{ + ZSTD_freeDDict(dctx->ddictLocal); + dctx->ddictLocal = NULL; + dctx->ddict = NULL; + dctx->dictUses = ZSTD_dont_use; +} + +size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx) +{ + if (dctx==NULL) return 0; /* support free on NULL */ + RETURN_ERROR_IF(dctx->staticSize, memory_allocation, "not compatible with static DCtx"); + { ZSTD_customMem const cMem = dctx->customMem; + ZSTD_clearDict(dctx); + ZSTD_customFree(dctx->inBuff, cMem); + dctx->inBuff = NULL; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1) + if (dctx->legacyContext) + ZSTD_freeLegacyStreamContext(dctx->legacyContext, dctx->previousLegacyVersion); +#endif + if (dctx->ddictSet) { + ZSTD_freeDDictHashSet(dctx->ddictSet, cMem); + dctx->ddictSet = NULL; + } + ZSTD_customFree(dctx, cMem); + return 0; + } +} + +/* no longer useful */ +void ZSTD_copyDCtx(ZSTD_DCtx* dstDCtx, const ZSTD_DCtx* srcDCtx) +{ + size_t const toCopy = (size_t)((char*)(&dstDCtx->inBuff) - (char*)dstDCtx); + ZSTD_memcpy(dstDCtx, srcDCtx, toCopy); /* no need to copy workspace */ +} + +/* Given a dctx with a digested frame params, re-selects the correct ZSTD_DDict based on + * the requested dict ID from the frame. If there exists a reference to the correct ZSTD_DDict, then + * accordingly sets the ddict to be used to decompress the frame. + * + * If no DDict is found, then no action is taken, and the ZSTD_DCtx::ddict remains as-is. + * + * ZSTD_d_refMultipleDDicts must be enabled for this function to be called. + */ +static void ZSTD_DCtx_selectFrameDDict(ZSTD_DCtx* dctx) { + assert(dctx->refMultipleDDicts && dctx->ddictSet); + DEBUGLOG(4, "Adjusting DDict based on requested dict ID from frame"); + if (dctx->ddict) { + const ZSTD_DDict* frameDDict = ZSTD_DDictHashSet_getDDict(dctx->ddictSet, dctx->fParams.dictID); + if (frameDDict) { + DEBUGLOG(4, "DDict found!"); + ZSTD_clearDict(dctx); + dctx->dictID = dctx->fParams.dictID; + dctx->ddict = frameDDict; + dctx->dictUses = ZSTD_use_indefinitely; + } + } +} + + +/*-************************************************************* + * Frame header decoding + ***************************************************************/ + +/*! ZSTD_isFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier. + * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. + * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. + * Note 3 : Skippable Frame Identifiers are considered valid. */ +unsigned ZSTD_isFrame(const void* buffer, size_t size) +{ + if (size < ZSTD_FRAMEIDSIZE) return 0; + { U32 const magic = MEM_readLE32(buffer); + if (magic == ZSTD_MAGICNUMBER) return 1; + if ((magic & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) return 1; + } +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1) + if (ZSTD_isLegacy(buffer, size)) return 1; +#endif + return 0; +} + +/*! ZSTD_isSkippableFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame. + * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. + */ +unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size) +{ + if (size < ZSTD_FRAMEIDSIZE) return 0; + { U32 const magic = MEM_readLE32(buffer); + if ((magic & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) return 1; + } + return 0; +} + +/** ZSTD_frameHeaderSize_internal() : + * srcSize must be large enough to reach header size fields. + * note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless. + * @return : size of the Frame Header + * or an error code, which can be tested with ZSTD_isError() */ +static size_t ZSTD_frameHeaderSize_internal(const void* src, size_t srcSize, ZSTD_format_e format) +{ + size_t const minInputSize = ZSTD_startingInputLength(format); + RETURN_ERROR_IF(srcSize < minInputSize, srcSize_wrong, ""); + + { BYTE const fhd = ((const BYTE*)src)[minInputSize-1]; + U32 const dictID= fhd & 3; + U32 const singleSegment = (fhd >> 5) & 1; + U32 const fcsId = fhd >> 6; + return minInputSize + !singleSegment + + ZSTD_did_fieldSize[dictID] + ZSTD_fcs_fieldSize[fcsId] + + (singleSegment && !fcsId); + } +} + +/** ZSTD_frameHeaderSize() : + * srcSize must be >= ZSTD_frameHeaderSize_prefix. + * @return : size of the Frame Header, + * or an error code (if srcSize is too small) */ +size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize) +{ + return ZSTD_frameHeaderSize_internal(src, srcSize, ZSTD_f_zstd1); +} + + +/** ZSTD_getFrameHeader_advanced() : + * decode Frame Header, or require larger `srcSize`. + * note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless + * @return : 0, `zfhPtr` is correctly filled, + * >0, `srcSize` is too small, value is wanted `srcSize` amount, +** or an error code, which can be tested using ZSTD_isError() */ +size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format) +{ + const BYTE* ip = (const BYTE*)src; + size_t const minInputSize = ZSTD_startingInputLength(format); + + DEBUGLOG(5, "ZSTD_getFrameHeader_advanced: minInputSize = %zu, srcSize = %zu", minInputSize, srcSize); + + if (srcSize > 0) { + /* note : technically could be considered an assert(), since it's an invalid entry */ + RETURN_ERROR_IF(src==NULL, GENERIC, "invalid parameter : src==NULL, but srcSize>0"); + } + if (srcSize < minInputSize) { + if (srcSize > 0 && format != ZSTD_f_zstd1_magicless) { + /* when receiving less than @minInputSize bytes, + * control these bytes at least correspond to a supported magic number + * in order to error out early if they don't. + **/ + size_t const toCopy = MIN(4, srcSize); + unsigned char hbuf[4]; MEM_writeLE32(hbuf, ZSTD_MAGICNUMBER); + assert(src != NULL); + ZSTD_memcpy(hbuf, src, toCopy); + if ( MEM_readLE32(hbuf) != ZSTD_MAGICNUMBER ) { + /* not a zstd frame : let's check if it's a skippable frame */ + MEM_writeLE32(hbuf, ZSTD_MAGIC_SKIPPABLE_START); + ZSTD_memcpy(hbuf, src, toCopy); + if ((MEM_readLE32(hbuf) & ZSTD_MAGIC_SKIPPABLE_MASK) != ZSTD_MAGIC_SKIPPABLE_START) { + RETURN_ERROR(prefix_unknown, + "first bytes don't correspond to any supported magic number"); + } } } + return minInputSize; + } + + ZSTD_memset(zfhPtr, 0, sizeof(*zfhPtr)); /* not strictly necessary, but static analyzers may not understand that zfhPtr will be read only if return value is zero, since they are 2 different signals */ + if ( (format != ZSTD_f_zstd1_magicless) + && (MEM_readLE32(src) != ZSTD_MAGICNUMBER) ) { + if ((MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { + /* skippable frame */ + if (srcSize < ZSTD_SKIPPABLEHEADERSIZE) + return ZSTD_SKIPPABLEHEADERSIZE; /* magic number + frame length */ + ZSTD_memset(zfhPtr, 0, sizeof(*zfhPtr)); + zfhPtr->frameContentSize = MEM_readLE32((const char *)src + ZSTD_FRAMEIDSIZE); + zfhPtr->frameType = ZSTD_skippableFrame; + return 0; + } + RETURN_ERROR(prefix_unknown, ""); + } + + /* ensure there is enough `srcSize` to fully read/decode frame header */ + { size_t const fhsize = ZSTD_frameHeaderSize_internal(src, srcSize, format); + if (srcSize < fhsize) return fhsize; + zfhPtr->headerSize = (U32)fhsize; + } + + { BYTE const fhdByte = ip[minInputSize-1]; + size_t pos = minInputSize; + U32 const dictIDSizeCode = fhdByte&3; + U32 const checksumFlag = (fhdByte>>2)&1; + U32 const singleSegment = (fhdByte>>5)&1; + U32 const fcsID = fhdByte>>6; + U64 windowSize = 0; + U32 dictID = 0; + U64 frameContentSize = ZSTD_CONTENTSIZE_UNKNOWN; + RETURN_ERROR_IF((fhdByte & 0x08) != 0, frameParameter_unsupported, + "reserved bits, must be zero"); + + if (!singleSegment) { + BYTE const wlByte = ip[pos++]; + U32 const windowLog = (wlByte >> 3) + ZSTD_WINDOWLOG_ABSOLUTEMIN; + RETURN_ERROR_IF(windowLog > ZSTD_WINDOWLOG_MAX, frameParameter_windowTooLarge, ""); + windowSize = (1ULL << windowLog); + windowSize += (windowSize >> 3) * (wlByte&7); + } + switch(dictIDSizeCode) + { + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; + case 0 : break; + case 1 : dictID = ip[pos]; pos++; break; + case 2 : dictID = MEM_readLE16(ip+pos); pos+=2; break; + case 3 : dictID = MEM_readLE32(ip+pos); pos+=4; break; + } + switch(fcsID) + { + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; + case 0 : if (singleSegment) frameContentSize = ip[pos]; break; + case 1 : frameContentSize = MEM_readLE16(ip+pos)+256; break; + case 2 : frameContentSize = MEM_readLE32(ip+pos); break; + case 3 : frameContentSize = MEM_readLE64(ip+pos); break; + } + if (singleSegment) windowSize = frameContentSize; + + zfhPtr->frameType = ZSTD_frame; + zfhPtr->frameContentSize = frameContentSize; + zfhPtr->windowSize = windowSize; + zfhPtr->blockSizeMax = (unsigned) MIN(windowSize, ZSTD_BLOCKSIZE_MAX); + zfhPtr->dictID = dictID; + zfhPtr->checksumFlag = checksumFlag; + } + return 0; +} + +/** ZSTD_getFrameHeader() : + * decode Frame Header, or require larger `srcSize`. + * note : this function does not consume input, it only reads it. + * @return : 0, `zfhPtr` is correctly filled, + * >0, `srcSize` is too small, value is wanted `srcSize` amount, + * or an error code, which can be tested using ZSTD_isError() */ +size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize) +{ + return ZSTD_getFrameHeader_advanced(zfhPtr, src, srcSize, ZSTD_f_zstd1); +} + +/** ZSTD_getFrameContentSize() : + * compatible with legacy mode + * @return : decompressed size of the single frame pointed to be `src` if known, otherwise + * - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined + * - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) */ +unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize) +{ +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1) + if (ZSTD_isLegacy(src, srcSize)) { + unsigned long long const ret = ZSTD_getDecompressedSize_legacy(src, srcSize); + return ret == 0 ? ZSTD_CONTENTSIZE_UNKNOWN : ret; + } +#endif + { ZSTD_frameHeader zfh; + if (ZSTD_getFrameHeader(&zfh, src, srcSize) != 0) + return ZSTD_CONTENTSIZE_ERROR; + if (zfh.frameType == ZSTD_skippableFrame) { + return 0; + } else { + return zfh.frameContentSize; + } } +} + +static size_t readSkippableFrameSize(void const* src, size_t srcSize) +{ + size_t const skippableHeaderSize = ZSTD_SKIPPABLEHEADERSIZE; + U32 sizeU32; + + RETURN_ERROR_IF(srcSize < ZSTD_SKIPPABLEHEADERSIZE, srcSize_wrong, ""); + + sizeU32 = MEM_readLE32((BYTE const*)src + ZSTD_FRAMEIDSIZE); + RETURN_ERROR_IF((U32)(sizeU32 + ZSTD_SKIPPABLEHEADERSIZE) < sizeU32, + frameParameter_unsupported, ""); + { size_t const skippableSize = skippableHeaderSize + sizeU32; + RETURN_ERROR_IF(skippableSize > srcSize, srcSize_wrong, ""); + return skippableSize; + } +} + +/*! ZSTD_readSkippableFrame() : + * Retrieves content of a skippable frame, and writes it to dst buffer. + * + * The parameter magicVariant will receive the magicVariant that was supplied when the frame was written, + * i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested + * in the magicVariant. + * + * Returns an error if destination buffer is not large enough, or if this is not a valid skippable frame. + * + * @return : number of bytes written or a ZSTD error. + */ +size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity, + unsigned* magicVariant, /* optional, can be NULL */ + const void* src, size_t srcSize) +{ + RETURN_ERROR_IF(srcSize < ZSTD_SKIPPABLEHEADERSIZE, srcSize_wrong, ""); + + { U32 const magicNumber = MEM_readLE32(src); + size_t skippableFrameSize = readSkippableFrameSize(src, srcSize); + size_t skippableContentSize = skippableFrameSize - ZSTD_SKIPPABLEHEADERSIZE; + + /* check input validity */ + RETURN_ERROR_IF(!ZSTD_isSkippableFrame(src, srcSize), frameParameter_unsupported, ""); + RETURN_ERROR_IF(skippableFrameSize < ZSTD_SKIPPABLEHEADERSIZE || skippableFrameSize > srcSize, srcSize_wrong, ""); + RETURN_ERROR_IF(skippableContentSize > dstCapacity, dstSize_tooSmall, ""); + + /* deliver payload */ + if (skippableContentSize > 0 && dst != NULL) + ZSTD_memcpy(dst, (const BYTE *)src + ZSTD_SKIPPABLEHEADERSIZE, skippableContentSize); + if (magicVariant != NULL) + *magicVariant = magicNumber - ZSTD_MAGIC_SKIPPABLE_START; + return skippableContentSize; + } +} + +/** ZSTD_findDecompressedSize() : + * `srcSize` must be the exact length of some number of ZSTD compressed and/or + * skippable frames + * note: compatible with legacy mode + * @return : decompressed size of the frames contained */ +unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize) +{ + unsigned long long totalDstSize = 0; + + while (srcSize >= ZSTD_startingInputLength(ZSTD_f_zstd1)) { + U32 const magicNumber = MEM_readLE32(src); + + if ((magicNumber & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { + size_t const skippableSize = readSkippableFrameSize(src, srcSize); + if (ZSTD_isError(skippableSize)) return ZSTD_CONTENTSIZE_ERROR; + assert(skippableSize <= srcSize); + + src = (const BYTE *)src + skippableSize; + srcSize -= skippableSize; + continue; + } + + { unsigned long long const fcs = ZSTD_getFrameContentSize(src, srcSize); + if (fcs >= ZSTD_CONTENTSIZE_ERROR) return fcs; + + if (totalDstSize + fcs < totalDstSize) + return ZSTD_CONTENTSIZE_ERROR; /* check for overflow */ + totalDstSize += fcs; + } + /* skip to next frame */ + { size_t const frameSrcSize = ZSTD_findFrameCompressedSize(src, srcSize); + if (ZSTD_isError(frameSrcSize)) return ZSTD_CONTENTSIZE_ERROR; + assert(frameSrcSize <= srcSize); + + src = (const BYTE *)src + frameSrcSize; + srcSize -= frameSrcSize; + } + } /* while (srcSize >= ZSTD_frameHeaderSize_prefix) */ + + if (srcSize) return ZSTD_CONTENTSIZE_ERROR; + + return totalDstSize; +} + +/** ZSTD_getDecompressedSize() : + * compatible with legacy mode + * @return : decompressed size if known, 0 otherwise + note : 0 can mean any of the following : + - frame content is empty + - decompressed size field is not present in frame header + - frame header unknown / not supported + - frame header not complete (`srcSize` too small) */ +unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize) +{ + unsigned long long const ret = ZSTD_getFrameContentSize(src, srcSize); + ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_ERROR < ZSTD_CONTENTSIZE_UNKNOWN); + return (ret >= ZSTD_CONTENTSIZE_ERROR) ? 0 : ret; +} + + +/** ZSTD_decodeFrameHeader() : + * `headerSize` must be the size provided by ZSTD_frameHeaderSize(). + * If multiple DDict references are enabled, also will choose the correct DDict to use. + * @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */ +static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* dctx, const void* src, size_t headerSize) +{ + size_t const result = ZSTD_getFrameHeader_advanced(&(dctx->fParams), src, headerSize, dctx->format); + if (ZSTD_isError(result)) return result; /* invalid header */ + RETURN_ERROR_IF(result>0, srcSize_wrong, "headerSize too small"); + + /* Reference DDict requested by frame if dctx references multiple ddicts */ + if (dctx->refMultipleDDicts == ZSTD_rmd_refMultipleDDicts && dctx->ddictSet) { + ZSTD_DCtx_selectFrameDDict(dctx); + } + +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + /* Skip the dictID check in fuzzing mode, because it makes the search + * harder. + */ + RETURN_ERROR_IF(dctx->fParams.dictID && (dctx->dictID != dctx->fParams.dictID), + dictionary_wrong, ""); +#endif + dctx->validateChecksum = (dctx->fParams.checksumFlag && !dctx->forceIgnoreChecksum) ? 1 : 0; + if (dctx->validateChecksum) XXH64_reset(&dctx->xxhState, 0); + dctx->processedCSize += headerSize; + return 0; +} + +static ZSTD_frameSizeInfo ZSTD_errorFrameSizeInfo(size_t ret) +{ + ZSTD_frameSizeInfo frameSizeInfo; + frameSizeInfo.compressedSize = ret; + frameSizeInfo.decompressedBound = ZSTD_CONTENTSIZE_ERROR; + return frameSizeInfo; +} + +static ZSTD_frameSizeInfo ZSTD_findFrameSizeInfo(const void* src, size_t srcSize) +{ + ZSTD_frameSizeInfo frameSizeInfo; + ZSTD_memset(&frameSizeInfo, 0, sizeof(ZSTD_frameSizeInfo)); + +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1) + if (ZSTD_isLegacy(src, srcSize)) + return ZSTD_findFrameSizeInfoLegacy(src, srcSize); +#endif + + if ((srcSize >= ZSTD_SKIPPABLEHEADERSIZE) + && (MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { + frameSizeInfo.compressedSize = readSkippableFrameSize(src, srcSize); + assert(ZSTD_isError(frameSizeInfo.compressedSize) || + frameSizeInfo.compressedSize <= srcSize); + return frameSizeInfo; + } else { + const BYTE* ip = (const BYTE*)src; + const BYTE* const ipstart = ip; + size_t remainingSize = srcSize; + size_t nbBlocks = 0; + ZSTD_frameHeader zfh; + + /* Extract Frame Header */ + { size_t const ret = ZSTD_getFrameHeader(&zfh, src, srcSize); + if (ZSTD_isError(ret)) + return ZSTD_errorFrameSizeInfo(ret); + if (ret > 0) + return ZSTD_errorFrameSizeInfo(ERROR(srcSize_wrong)); + } + + ip += zfh.headerSize; + remainingSize -= zfh.headerSize; + + /* Iterate over each block */ + while (1) { + blockProperties_t blockProperties; + size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties); + if (ZSTD_isError(cBlockSize)) + return ZSTD_errorFrameSizeInfo(cBlockSize); + + if (ZSTD_blockHeaderSize + cBlockSize > remainingSize) + return ZSTD_errorFrameSizeInfo(ERROR(srcSize_wrong)); + + ip += ZSTD_blockHeaderSize + cBlockSize; + remainingSize -= ZSTD_blockHeaderSize + cBlockSize; + nbBlocks++; + + if (blockProperties.lastBlock) break; + } + + /* Final frame content checksum */ + if (zfh.checksumFlag) { + if (remainingSize < 4) + return ZSTD_errorFrameSizeInfo(ERROR(srcSize_wrong)); + ip += 4; + } + + frameSizeInfo.nbBlocks = nbBlocks; + frameSizeInfo.compressedSize = (size_t)(ip - ipstart); + frameSizeInfo.decompressedBound = (zfh.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN) + ? zfh.frameContentSize + : (unsigned long long)nbBlocks * zfh.blockSizeMax; + return frameSizeInfo; + } +} + +/** ZSTD_findFrameCompressedSize() : + * compatible with legacy mode + * `src` must point to the start of a ZSTD frame, ZSTD legacy frame, or skippable frame + * `srcSize` must be at least as large as the frame contained + * @return : the compressed size of the frame starting at `src` */ +size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize) +{ + ZSTD_frameSizeInfo const frameSizeInfo = ZSTD_findFrameSizeInfo(src, srcSize); + return frameSizeInfo.compressedSize; +} + +/** ZSTD_decompressBound() : + * compatible with legacy mode + * `src` must point to the start of a ZSTD frame or a skippeable frame + * `srcSize` must be at least as large as the frame contained + * @return : the maximum decompressed size of the compressed source + */ +unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize) +{ + unsigned long long bound = 0; + /* Iterate over each frame */ + while (srcSize > 0) { + ZSTD_frameSizeInfo const frameSizeInfo = ZSTD_findFrameSizeInfo(src, srcSize); + size_t const compressedSize = frameSizeInfo.compressedSize; + unsigned long long const decompressedBound = frameSizeInfo.decompressedBound; + if (ZSTD_isError(compressedSize) || decompressedBound == ZSTD_CONTENTSIZE_ERROR) + return ZSTD_CONTENTSIZE_ERROR; + assert(srcSize >= compressedSize); + src = (const BYTE*)src + compressedSize; + srcSize -= compressedSize; + bound += decompressedBound; + } + return bound; +} + +size_t ZSTD_decompressionMargin(void const* src, size_t srcSize) +{ + size_t margin = 0; + unsigned maxBlockSize = 0; + + /* Iterate over each frame */ + while (srcSize > 0) { + ZSTD_frameSizeInfo const frameSizeInfo = ZSTD_findFrameSizeInfo(src, srcSize); + size_t const compressedSize = frameSizeInfo.compressedSize; + unsigned long long const decompressedBound = frameSizeInfo.decompressedBound; + ZSTD_frameHeader zfh; + + FORWARD_IF_ERROR(ZSTD_getFrameHeader(&zfh, src, srcSize), ""); + if (ZSTD_isError(compressedSize) || decompressedBound == ZSTD_CONTENTSIZE_ERROR) + return ERROR(corruption_detected); + + if (zfh.frameType == ZSTD_frame) { + /* Add the frame header to our margin */ + margin += zfh.headerSize; + /* Add the checksum to our margin */ + margin += zfh.checksumFlag ? 4 : 0; + /* Add 3 bytes per block */ + margin += 3 * frameSizeInfo.nbBlocks; + + /* Compute the max block size */ + maxBlockSize = MAX(maxBlockSize, zfh.blockSizeMax); + } else { + assert(zfh.frameType == ZSTD_skippableFrame); + /* Add the entire skippable frame size to our margin. */ + margin += compressedSize; + } + + assert(srcSize >= compressedSize); + src = (const BYTE*)src + compressedSize; + srcSize -= compressedSize; + } + + /* Add the max block size back to the margin. */ + margin += maxBlockSize; + + return margin; +} + +/*-************************************************************* + * Frame decoding + ***************************************************************/ + +/** ZSTD_insertBlock() : + * insert `src` block into `dctx` history. Useful to track uncompressed blocks. */ +size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize) +{ + DEBUGLOG(5, "ZSTD_insertBlock: %u bytes", (unsigned)blockSize); + ZSTD_checkContinuity(dctx, blockStart, blockSize); + dctx->previousDstEnd = (const char*)blockStart + blockSize; + return blockSize; +} + + +static size_t ZSTD_copyRawBlock(void* dst, size_t dstCapacity, + const void* src, size_t srcSize) +{ + DEBUGLOG(5, "ZSTD_copyRawBlock"); + RETURN_ERROR_IF(srcSize > dstCapacity, dstSize_tooSmall, ""); + if (dst == NULL) { + if (srcSize == 0) return 0; + RETURN_ERROR(dstBuffer_null, ""); + } + ZSTD_memmove(dst, src, srcSize); + return srcSize; +} + +static size_t ZSTD_setRleBlock(void* dst, size_t dstCapacity, + BYTE b, + size_t regenSize) +{ + RETURN_ERROR_IF(regenSize > dstCapacity, dstSize_tooSmall, ""); + if (dst == NULL) { + if (regenSize == 0) return 0; + RETURN_ERROR(dstBuffer_null, ""); + } + ZSTD_memset(dst, b, regenSize); + return regenSize; +} + +static void ZSTD_DCtx_trace_end(ZSTD_DCtx const* dctx, U64 uncompressedSize, U64 compressedSize, unsigned streaming) +{ +#if ZSTD_TRACE + if (dctx->traceCtx && ZSTD_trace_decompress_end != NULL) { + ZSTD_Trace trace; + ZSTD_memset(&trace, 0, sizeof(trace)); + trace.version = ZSTD_VERSION_NUMBER; + trace.streaming = streaming; + if (dctx->ddict) { + trace.dictionaryID = ZSTD_getDictID_fromDDict(dctx->ddict); + trace.dictionarySize = ZSTD_DDict_dictSize(dctx->ddict); + trace.dictionaryIsCold = dctx->ddictIsCold; + } + trace.uncompressedSize = (size_t)uncompressedSize; + trace.compressedSize = (size_t)compressedSize; + trace.dctx = dctx; + ZSTD_trace_decompress_end(dctx->traceCtx, &trace); + } +#else + (void)dctx; + (void)uncompressedSize; + (void)compressedSize; + (void)streaming; +#endif +} + + +/*! ZSTD_decompressFrame() : + * @dctx must be properly initialized + * will update *srcPtr and *srcSizePtr, + * to make *srcPtr progress by one frame. */ +static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void** srcPtr, size_t *srcSizePtr) +{ + const BYTE* const istart = (const BYTE*)(*srcPtr); + const BYTE* ip = istart; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = dstCapacity != 0 ? ostart + dstCapacity : ostart; + BYTE* op = ostart; + size_t remainingSrcSize = *srcSizePtr; + + DEBUGLOG(4, "ZSTD_decompressFrame (srcSize:%i)", (int)*srcSizePtr); + + /* check */ + RETURN_ERROR_IF( + remainingSrcSize < ZSTD_FRAMEHEADERSIZE_MIN(dctx->format)+ZSTD_blockHeaderSize, + srcSize_wrong, ""); + + /* Frame Header */ + { size_t const frameHeaderSize = ZSTD_frameHeaderSize_internal( + ip, ZSTD_FRAMEHEADERSIZE_PREFIX(dctx->format), dctx->format); + if (ZSTD_isError(frameHeaderSize)) return frameHeaderSize; + RETURN_ERROR_IF(remainingSrcSize < frameHeaderSize+ZSTD_blockHeaderSize, + srcSize_wrong, ""); + FORWARD_IF_ERROR( ZSTD_decodeFrameHeader(dctx, ip, frameHeaderSize) , ""); + ip += frameHeaderSize; remainingSrcSize -= frameHeaderSize; + } + + /* Loop on each block */ + while (1) { + BYTE* oBlockEnd = oend; + size_t decodedSize; + blockProperties_t blockProperties; + size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSrcSize, &blockProperties); + if (ZSTD_isError(cBlockSize)) return cBlockSize; + + ip += ZSTD_blockHeaderSize; + remainingSrcSize -= ZSTD_blockHeaderSize; + RETURN_ERROR_IF(cBlockSize > remainingSrcSize, srcSize_wrong, ""); + + if (ip >= op && ip < oBlockEnd) { + /* We are decompressing in-place. Limit the output pointer so that we + * don't overwrite the block that we are currently reading. This will + * fail decompression if the input & output pointers aren't spaced + * far enough apart. + * + * This is important to set, even when the pointers are far enough + * apart, because ZSTD_decompressBlock_internal() can decide to store + * literals in the output buffer, after the block it is decompressing. + * Since we don't want anything to overwrite our input, we have to tell + * ZSTD_decompressBlock_internal to never write past ip. + * + * See ZSTD_allocateLiteralsBuffer() for reference. + */ + oBlockEnd = op + (ip - op); + } + + switch(blockProperties.blockType) + { + case bt_compressed: + decodedSize = ZSTD_decompressBlock_internal(dctx, op, (size_t)(oBlockEnd-op), ip, cBlockSize, /* frame */ 1, not_streaming); + break; + case bt_raw : + /* Use oend instead of oBlockEnd because this function is safe to overlap. It uses memmove. */ + decodedSize = ZSTD_copyRawBlock(op, (size_t)(oend-op), ip, cBlockSize); + break; + case bt_rle : + decodedSize = ZSTD_setRleBlock(op, (size_t)(oBlockEnd-op), *ip, blockProperties.origSize); + break; + case bt_reserved : + default: + RETURN_ERROR(corruption_detected, "invalid block type"); + } + + if (ZSTD_isError(decodedSize)) return decodedSize; + if (dctx->validateChecksum) + XXH64_update(&dctx->xxhState, op, decodedSize); + if (decodedSize != 0) + op += decodedSize; + assert(ip != NULL); + ip += cBlockSize; + remainingSrcSize -= cBlockSize; + if (blockProperties.lastBlock) break; + } + + if (dctx->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN) { + RETURN_ERROR_IF((U64)(op-ostart) != dctx->fParams.frameContentSize, + corruption_detected, ""); + } + if (dctx->fParams.checksumFlag) { /* Frame content checksum verification */ + RETURN_ERROR_IF(remainingSrcSize<4, checksum_wrong, ""); + if (!dctx->forceIgnoreChecksum) { + U32 const checkCalc = (U32)XXH64_digest(&dctx->xxhState); + U32 checkRead; + checkRead = MEM_readLE32(ip); + RETURN_ERROR_IF(checkRead != checkCalc, checksum_wrong, ""); + } + ip += 4; + remainingSrcSize -= 4; + } + ZSTD_DCtx_trace_end(dctx, (U64)(op-ostart), (U64)(ip-istart), /* streaming */ 0); + /* Allow caller to get size read */ + DEBUGLOG(4, "ZSTD_decompressFrame: decompressed frame of size %zi, consuming %zi bytes of input", op-ostart, ip - (const BYTE*)*srcPtr); + *srcPtr = ip; + *srcSizePtr = remainingSrcSize; + return (size_t)(op-ostart); +} + +static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + const ZSTD_DDict* ddict) +{ + void* const dststart = dst; + int moreThan1Frame = 0; + + DEBUGLOG(5, "ZSTD_decompressMultiFrame"); + assert(dict==NULL || ddict==NULL); /* either dict or ddict set, not both */ + + if (ddict) { + dict = ZSTD_DDict_dictContent(ddict); + dictSize = ZSTD_DDict_dictSize(ddict); + } + + while (srcSize >= ZSTD_startingInputLength(dctx->format)) { + +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1) + if (ZSTD_isLegacy(src, srcSize)) { + size_t decodedSize; + size_t const frameSize = ZSTD_findFrameCompressedSizeLegacy(src, srcSize); + if (ZSTD_isError(frameSize)) return frameSize; + RETURN_ERROR_IF(dctx->staticSize, memory_allocation, + "legacy support is not compatible with static dctx"); + + decodedSize = ZSTD_decompressLegacy(dst, dstCapacity, src, frameSize, dict, dictSize); + if (ZSTD_isError(decodedSize)) return decodedSize; + + assert(decodedSize <= dstCapacity); + dst = (BYTE*)dst + decodedSize; + dstCapacity -= decodedSize; + + src = (const BYTE*)src + frameSize; + srcSize -= frameSize; + + continue; + } +#endif + + if (srcSize >= 4) { + U32 const magicNumber = MEM_readLE32(src); + DEBUGLOG(5, "reading magic number %08X", (unsigned)magicNumber); + if ((magicNumber & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { + /* skippable frame detected : skip it */ + size_t const skippableSize = readSkippableFrameSize(src, srcSize); + FORWARD_IF_ERROR(skippableSize, "invalid skippable frame"); + assert(skippableSize <= srcSize); + + src = (const BYTE *)src + skippableSize; + srcSize -= skippableSize; + continue; /* check next frame */ + } } + + if (ddict) { + /* we were called from ZSTD_decompress_usingDDict */ + FORWARD_IF_ERROR(ZSTD_decompressBegin_usingDDict(dctx, ddict), ""); + } else { + /* this will initialize correctly with no dict if dict == NULL, so + * use this in all cases but ddict */ + FORWARD_IF_ERROR(ZSTD_decompressBegin_usingDict(dctx, dict, dictSize), ""); + } + ZSTD_checkContinuity(dctx, dst, dstCapacity); + + { const size_t res = ZSTD_decompressFrame(dctx, dst, dstCapacity, + &src, &srcSize); + RETURN_ERROR_IF( + (ZSTD_getErrorCode(res) == ZSTD_error_prefix_unknown) + && (moreThan1Frame==1), + srcSize_wrong, + "At least one frame successfully completed, " + "but following bytes are garbage: " + "it's more likely to be a srcSize error, " + "specifying more input bytes than size of frame(s). " + "Note: one could be unlucky, it might be a corruption error instead, " + "happening right at the place where we expect zstd magic bytes. " + "But this is _much_ less likely than a srcSize field error."); + if (ZSTD_isError(res)) return res; + assert(res <= dstCapacity); + if (res != 0) + dst = (BYTE*)dst + res; + dstCapacity -= res; + } + moreThan1Frame = 1; + } /* while (srcSize >= ZSTD_frameHeaderSize_prefix) */ + + RETURN_ERROR_IF(srcSize, srcSize_wrong, "input not entirely consumed"); + + return (size_t)((BYTE*)dst - (BYTE*)dststart); +} + +size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize) +{ + return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize, dict, dictSize, NULL); +} + + +static ZSTD_DDict const* ZSTD_getDDict(ZSTD_DCtx* dctx) +{ + switch (dctx->dictUses) { + default: + assert(0 /* Impossible */); + ZSTD_FALLTHROUGH; + case ZSTD_dont_use: + ZSTD_clearDict(dctx); + return NULL; + case ZSTD_use_indefinitely: + return dctx->ddict; + case ZSTD_use_once: + dctx->dictUses = ZSTD_dont_use; + return dctx->ddict; + } +} + +size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize) +{ + return ZSTD_decompress_usingDDict(dctx, dst, dstCapacity, src, srcSize, ZSTD_getDDict(dctx)); +} + + +size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t srcSize) +{ +#if defined(ZSTD_HEAPMODE) && (ZSTD_HEAPMODE>=1) + size_t regenSize; + ZSTD_DCtx* const dctx = ZSTD_createDCtx_internal(ZSTD_defaultCMem); + RETURN_ERROR_IF(dctx==NULL, memory_allocation, "NULL pointer!"); + regenSize = ZSTD_decompressDCtx(dctx, dst, dstCapacity, src, srcSize); + ZSTD_freeDCtx(dctx); + return regenSize; +#else /* stack mode */ + ZSTD_DCtx dctx; + ZSTD_initDCtx_internal(&dctx); + return ZSTD_decompressDCtx(&dctx, dst, dstCapacity, src, srcSize); +#endif +} + + +/*-************************************** +* Advanced Streaming Decompression API +* Bufferless and synchronous +****************************************/ +size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx) { return dctx->expected; } + +/** + * Similar to ZSTD_nextSrcSizeToDecompress(), but when a block input can be streamed, we + * allow taking a partial block as the input. Currently only raw uncompressed blocks can + * be streamed. + * + * For blocks that can be streamed, this allows us to reduce the latency until we produce + * output, and avoid copying the input. + * + * @param inputSize - The total amount of input that the caller currently has. + */ +static size_t ZSTD_nextSrcSizeToDecompressWithInputSize(ZSTD_DCtx* dctx, size_t inputSize) { + if (!(dctx->stage == ZSTDds_decompressBlock || dctx->stage == ZSTDds_decompressLastBlock)) + return dctx->expected; + if (dctx->bType != bt_raw) + return dctx->expected; + return BOUNDED(1, inputSize, dctx->expected); +} + +ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) { + switch(dctx->stage) + { + default: /* should not happen */ + assert(0); + ZSTD_FALLTHROUGH; + case ZSTDds_getFrameHeaderSize: + ZSTD_FALLTHROUGH; + case ZSTDds_decodeFrameHeader: + return ZSTDnit_frameHeader; + case ZSTDds_decodeBlockHeader: + return ZSTDnit_blockHeader; + case ZSTDds_decompressBlock: + return ZSTDnit_block; + case ZSTDds_decompressLastBlock: + return ZSTDnit_lastBlock; + case ZSTDds_checkChecksum: + return ZSTDnit_checksum; + case ZSTDds_decodeSkippableHeader: + ZSTD_FALLTHROUGH; + case ZSTDds_skipFrame: + return ZSTDnit_skippableFrame; + } +} + +static int ZSTD_isSkipFrame(ZSTD_DCtx* dctx) { return dctx->stage == ZSTDds_skipFrame; } + +/** ZSTD_decompressContinue() : + * srcSize : must be the exact nb of bytes expected (see ZSTD_nextSrcSizeToDecompress()) + * @return : nb of bytes generated into `dst` (necessarily <= `dstCapacity) + * or an error code, which can be tested using ZSTD_isError() */ +size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize) +{ + DEBUGLOG(5, "ZSTD_decompressContinue (srcSize:%u)", (unsigned)srcSize); + /* Sanity check */ + RETURN_ERROR_IF(srcSize != ZSTD_nextSrcSizeToDecompressWithInputSize(dctx, srcSize), srcSize_wrong, "not allowed"); + ZSTD_checkContinuity(dctx, dst, dstCapacity); + + dctx->processedCSize += srcSize; + + switch (dctx->stage) + { + case ZSTDds_getFrameHeaderSize : + assert(src != NULL); + if (dctx->format == ZSTD_f_zstd1) { /* allows header */ + assert(srcSize >= ZSTD_FRAMEIDSIZE); /* to read skippable magic number */ + if ((MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */ + ZSTD_memcpy(dctx->headerBuffer, src, srcSize); + dctx->expected = ZSTD_SKIPPABLEHEADERSIZE - srcSize; /* remaining to load to get full skippable frame header */ + dctx->stage = ZSTDds_decodeSkippableHeader; + return 0; + } } + dctx->headerSize = ZSTD_frameHeaderSize_internal(src, srcSize, dctx->format); + if (ZSTD_isError(dctx->headerSize)) return dctx->headerSize; + ZSTD_memcpy(dctx->headerBuffer, src, srcSize); + dctx->expected = dctx->headerSize - srcSize; + dctx->stage = ZSTDds_decodeFrameHeader; + return 0; + + case ZSTDds_decodeFrameHeader: + assert(src != NULL); + ZSTD_memcpy(dctx->headerBuffer + (dctx->headerSize - srcSize), src, srcSize); + FORWARD_IF_ERROR(ZSTD_decodeFrameHeader(dctx, dctx->headerBuffer, dctx->headerSize), ""); + dctx->expected = ZSTD_blockHeaderSize; + dctx->stage = ZSTDds_decodeBlockHeader; + return 0; + + case ZSTDds_decodeBlockHeader: + { blockProperties_t bp; + size_t const cBlockSize = ZSTD_getcBlockSize(src, ZSTD_blockHeaderSize, &bp); + if (ZSTD_isError(cBlockSize)) return cBlockSize; + RETURN_ERROR_IF(cBlockSize > dctx->fParams.blockSizeMax, corruption_detected, "Block Size Exceeds Maximum"); + dctx->expected = cBlockSize; + dctx->bType = bp.blockType; + dctx->rleSize = bp.origSize; + if (cBlockSize) { + dctx->stage = bp.lastBlock ? ZSTDds_decompressLastBlock : ZSTDds_decompressBlock; + return 0; + } + /* empty block */ + if (bp.lastBlock) { + if (dctx->fParams.checksumFlag) { + dctx->expected = 4; + dctx->stage = ZSTDds_checkChecksum; + } else { + dctx->expected = 0; /* end of frame */ + dctx->stage = ZSTDds_getFrameHeaderSize; + } + } else { + dctx->expected = ZSTD_blockHeaderSize; /* jump to next header */ + dctx->stage = ZSTDds_decodeBlockHeader; + } + return 0; + } + + case ZSTDds_decompressLastBlock: + case ZSTDds_decompressBlock: + DEBUGLOG(5, "ZSTD_decompressContinue: case ZSTDds_decompressBlock"); + { size_t rSize; + switch(dctx->bType) + { + case bt_compressed: + DEBUGLOG(5, "ZSTD_decompressContinue: case bt_compressed"); + rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 1, is_streaming); + dctx->expected = 0; /* Streaming not supported */ + break; + case bt_raw : + assert(srcSize <= dctx->expected); + rSize = ZSTD_copyRawBlock(dst, dstCapacity, src, srcSize); + FORWARD_IF_ERROR(rSize, "ZSTD_copyRawBlock failed"); + assert(rSize == srcSize); + dctx->expected -= rSize; + break; + case bt_rle : + rSize = ZSTD_setRleBlock(dst, dstCapacity, *(const BYTE*)src, dctx->rleSize); + dctx->expected = 0; /* Streaming not supported */ + break; + case bt_reserved : /* should never happen */ + default: + RETURN_ERROR(corruption_detected, "invalid block type"); + } + FORWARD_IF_ERROR(rSize, ""); + RETURN_ERROR_IF(rSize > dctx->fParams.blockSizeMax, corruption_detected, "Decompressed Block Size Exceeds Maximum"); + DEBUGLOG(5, "ZSTD_decompressContinue: decoded size from block : %u", (unsigned)rSize); + dctx->decodedSize += rSize; + if (dctx->validateChecksum) XXH64_update(&dctx->xxhState, dst, rSize); + dctx->previousDstEnd = (char*)dst + rSize; + + /* Stay on the same stage until we are finished streaming the block. */ + if (dctx->expected > 0) { + return rSize; + } + + if (dctx->stage == ZSTDds_decompressLastBlock) { /* end of frame */ + DEBUGLOG(4, "ZSTD_decompressContinue: decoded size from frame : %u", (unsigned)dctx->decodedSize); + RETURN_ERROR_IF( + dctx->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN + && dctx->decodedSize != dctx->fParams.frameContentSize, + corruption_detected, ""); + if (dctx->fParams.checksumFlag) { /* another round for frame checksum */ + dctx->expected = 4; + dctx->stage = ZSTDds_checkChecksum; + } else { + ZSTD_DCtx_trace_end(dctx, dctx->decodedSize, dctx->processedCSize, /* streaming */ 1); + dctx->expected = 0; /* ends here */ + dctx->stage = ZSTDds_getFrameHeaderSize; + } + } else { + dctx->stage = ZSTDds_decodeBlockHeader; + dctx->expected = ZSTD_blockHeaderSize; + } + return rSize; + } + + case ZSTDds_checkChecksum: + assert(srcSize == 4); /* guaranteed by dctx->expected */ + { + if (dctx->validateChecksum) { + U32 const h32 = (U32)XXH64_digest(&dctx->xxhState); + U32 const check32 = MEM_readLE32(src); + DEBUGLOG(4, "ZSTD_decompressContinue: checksum : calculated %08X :: %08X read", (unsigned)h32, (unsigned)check32); + RETURN_ERROR_IF(check32 != h32, checksum_wrong, ""); + } + ZSTD_DCtx_trace_end(dctx, dctx->decodedSize, dctx->processedCSize, /* streaming */ 1); + dctx->expected = 0; + dctx->stage = ZSTDds_getFrameHeaderSize; + return 0; + } + + case ZSTDds_decodeSkippableHeader: + assert(src != NULL); + assert(srcSize <= ZSTD_SKIPPABLEHEADERSIZE); + ZSTD_memcpy(dctx->headerBuffer + (ZSTD_SKIPPABLEHEADERSIZE - srcSize), src, srcSize); /* complete skippable header */ + dctx->expected = MEM_readLE32(dctx->headerBuffer + ZSTD_FRAMEIDSIZE); /* note : dctx->expected can grow seriously large, beyond local buffer size */ + dctx->stage = ZSTDds_skipFrame; + return 0; + + case ZSTDds_skipFrame: + dctx->expected = 0; + dctx->stage = ZSTDds_getFrameHeaderSize; + return 0; + + default: + assert(0); /* impossible */ + RETURN_ERROR(GENERIC, "impossible to reach"); /* some compilers require default to do something */ + } +} + + +static size_t ZSTD_refDictContent(ZSTD_DCtx* dctx, const void* dict, size_t dictSize) +{ + dctx->dictEnd = dctx->previousDstEnd; + dctx->virtualStart = (const char*)dict - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->prefixStart)); + dctx->prefixStart = dict; + dctx->previousDstEnd = (const char*)dict + dictSize; +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + dctx->dictContentBeginForFuzzing = dctx->prefixStart; + dctx->dictContentEndForFuzzing = dctx->previousDstEnd; +#endif + return 0; +} + +/*! ZSTD_loadDEntropy() : + * dict : must point at beginning of a valid zstd dictionary. + * @return : size of entropy tables read */ +size_t +ZSTD_loadDEntropy(ZSTD_entropyDTables_t* entropy, + const void* const dict, size_t const dictSize) +{ + const BYTE* dictPtr = (const BYTE*)dict; + const BYTE* const dictEnd = dictPtr + dictSize; + + RETURN_ERROR_IF(dictSize <= 8, dictionary_corrupted, "dict is too small"); + assert(MEM_readLE32(dict) == ZSTD_MAGIC_DICTIONARY); /* dict must be valid */ + dictPtr += 8; /* skip header = magic + dictID */ + + ZSTD_STATIC_ASSERT(offsetof(ZSTD_entropyDTables_t, OFTable) == offsetof(ZSTD_entropyDTables_t, LLTable) + sizeof(entropy->LLTable)); + ZSTD_STATIC_ASSERT(offsetof(ZSTD_entropyDTables_t, MLTable) == offsetof(ZSTD_entropyDTables_t, OFTable) + sizeof(entropy->OFTable)); + ZSTD_STATIC_ASSERT(sizeof(entropy->LLTable) + sizeof(entropy->OFTable) + sizeof(entropy->MLTable) >= HUF_DECOMPRESS_WORKSPACE_SIZE); + { void* const workspace = &entropy->LLTable; /* use fse tables as temporary workspace; implies fse tables are grouped together */ + size_t const workspaceSize = sizeof(entropy->LLTable) + sizeof(entropy->OFTable) + sizeof(entropy->MLTable); +#ifdef HUF_FORCE_DECOMPRESS_X1 + /* in minimal huffman, we always use X1 variants */ + size_t const hSize = HUF_readDTableX1_wksp(entropy->hufTable, + dictPtr, dictEnd - dictPtr, + workspace, workspaceSize, /* flags */ 0); +#else + size_t const hSize = HUF_readDTableX2_wksp(entropy->hufTable, + dictPtr, (size_t)(dictEnd - dictPtr), + workspace, workspaceSize, /* flags */ 0); +#endif + RETURN_ERROR_IF(HUF_isError(hSize), dictionary_corrupted, ""); + dictPtr += hSize; + } + + { short offcodeNCount[MaxOff+1]; + unsigned offcodeMaxValue = MaxOff, offcodeLog; + size_t const offcodeHeaderSize = FSE_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dictPtr, (size_t)(dictEnd-dictPtr)); + RETURN_ERROR_IF(FSE_isError(offcodeHeaderSize), dictionary_corrupted, ""); + RETURN_ERROR_IF(offcodeMaxValue > MaxOff, dictionary_corrupted, ""); + RETURN_ERROR_IF(offcodeLog > OffFSELog, dictionary_corrupted, ""); + ZSTD_buildFSETable( entropy->OFTable, + offcodeNCount, offcodeMaxValue, + OF_base, OF_bits, + offcodeLog, + entropy->workspace, sizeof(entropy->workspace), + /* bmi2 */0); + dictPtr += offcodeHeaderSize; + } + + { short matchlengthNCount[MaxML+1]; + unsigned matchlengthMaxValue = MaxML, matchlengthLog; + size_t const matchlengthHeaderSize = FSE_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dictPtr, (size_t)(dictEnd-dictPtr)); + RETURN_ERROR_IF(FSE_isError(matchlengthHeaderSize), dictionary_corrupted, ""); + RETURN_ERROR_IF(matchlengthMaxValue > MaxML, dictionary_corrupted, ""); + RETURN_ERROR_IF(matchlengthLog > MLFSELog, dictionary_corrupted, ""); + ZSTD_buildFSETable( entropy->MLTable, + matchlengthNCount, matchlengthMaxValue, + ML_base, ML_bits, + matchlengthLog, + entropy->workspace, sizeof(entropy->workspace), + /* bmi2 */ 0); + dictPtr += matchlengthHeaderSize; + } + + { short litlengthNCount[MaxLL+1]; + unsigned litlengthMaxValue = MaxLL, litlengthLog; + size_t const litlengthHeaderSize = FSE_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dictPtr, (size_t)(dictEnd-dictPtr)); + RETURN_ERROR_IF(FSE_isError(litlengthHeaderSize), dictionary_corrupted, ""); + RETURN_ERROR_IF(litlengthMaxValue > MaxLL, dictionary_corrupted, ""); + RETURN_ERROR_IF(litlengthLog > LLFSELog, dictionary_corrupted, ""); + ZSTD_buildFSETable( entropy->LLTable, + litlengthNCount, litlengthMaxValue, + LL_base, LL_bits, + litlengthLog, + entropy->workspace, sizeof(entropy->workspace), + /* bmi2 */ 0); + dictPtr += litlengthHeaderSize; + } + + RETURN_ERROR_IF(dictPtr+12 > dictEnd, dictionary_corrupted, ""); + { int i; + size_t const dictContentSize = (size_t)(dictEnd - (dictPtr+12)); + for (i=0; i<3; i++) { + U32 const rep = MEM_readLE32(dictPtr); dictPtr += 4; + RETURN_ERROR_IF(rep==0 || rep > dictContentSize, + dictionary_corrupted, ""); + entropy->rep[i] = rep; + } } + + return (size_t)(dictPtr - (const BYTE*)dict); +} + +static size_t ZSTD_decompress_insertDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize) +{ + if (dictSize < 8) return ZSTD_refDictContent(dctx, dict, dictSize); + { U32 const magic = MEM_readLE32(dict); + if (magic != ZSTD_MAGIC_DICTIONARY) { + return ZSTD_refDictContent(dctx, dict, dictSize); /* pure content mode */ + } } + dctx->dictID = MEM_readLE32((const char*)dict + ZSTD_FRAMEIDSIZE); + + /* load entropy tables */ + { size_t const eSize = ZSTD_loadDEntropy(&dctx->entropy, dict, dictSize); + RETURN_ERROR_IF(ZSTD_isError(eSize), dictionary_corrupted, ""); + dict = (const char*)dict + eSize; + dictSize -= eSize; + } + dctx->litEntropy = dctx->fseEntropy = 1; + + /* reference dictionary content */ + return ZSTD_refDictContent(dctx, dict, dictSize); +} + +size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx) +{ + assert(dctx != NULL); +#if ZSTD_TRACE + dctx->traceCtx = (ZSTD_trace_decompress_begin != NULL) ? ZSTD_trace_decompress_begin(dctx) : 0; +#endif + dctx->expected = ZSTD_startingInputLength(dctx->format); /* dctx->format must be properly set */ + dctx->stage = ZSTDds_getFrameHeaderSize; + dctx->processedCSize = 0; + dctx->decodedSize = 0; + dctx->previousDstEnd = NULL; + dctx->prefixStart = NULL; + dctx->virtualStart = NULL; + dctx->dictEnd = NULL; + dctx->entropy.hufTable[0] = (HUF_DTable)((ZSTD_HUFFDTABLE_CAPACITY_LOG)*0x1000001); /* cover both little and big endian */ + dctx->litEntropy = dctx->fseEntropy = 0; + dctx->dictID = 0; + dctx->bType = bt_reserved; + ZSTD_STATIC_ASSERT(sizeof(dctx->entropy.rep) == sizeof(repStartValue)); + ZSTD_memcpy(dctx->entropy.rep, repStartValue, sizeof(repStartValue)); /* initial repcodes */ + dctx->LLTptr = dctx->entropy.LLTable; + dctx->MLTptr = dctx->entropy.MLTable; + dctx->OFTptr = dctx->entropy.OFTable; + dctx->HUFptr = dctx->entropy.hufTable; + return 0; +} + +size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize) +{ + FORWARD_IF_ERROR( ZSTD_decompressBegin(dctx) , ""); + if (dict && dictSize) + RETURN_ERROR_IF( + ZSTD_isError(ZSTD_decompress_insertDictionary(dctx, dict, dictSize)), + dictionary_corrupted, ""); + return 0; +} + + +/* ====== ZSTD_DDict ====== */ + +size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict) +{ + DEBUGLOG(4, "ZSTD_decompressBegin_usingDDict"); + assert(dctx != NULL); + if (ddict) { + const char* const dictStart = (const char*)ZSTD_DDict_dictContent(ddict); + size_t const dictSize = ZSTD_DDict_dictSize(ddict); + const void* const dictEnd = dictStart + dictSize; + dctx->ddictIsCold = (dctx->dictEnd != dictEnd); + DEBUGLOG(4, "DDict is %s", + dctx->ddictIsCold ? "~cold~" : "hot!"); + } + FORWARD_IF_ERROR( ZSTD_decompressBegin(dctx) , ""); + if (ddict) { /* NULL ddict is equivalent to no dictionary */ + ZSTD_copyDDictParameters(dctx, ddict); + } + return 0; +} + +/*! ZSTD_getDictID_fromDict() : + * Provides the dictID stored within dictionary. + * if @return == 0, the dictionary is not conformant with Zstandard specification. + * It can still be loaded, but as a content-only dictionary. */ +unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize) +{ + if (dictSize < 8) return 0; + if (MEM_readLE32(dict) != ZSTD_MAGIC_DICTIONARY) return 0; + return MEM_readLE32((const char*)dict + ZSTD_FRAMEIDSIZE); +} + +/*! ZSTD_getDictID_fromFrame() : + * Provides the dictID required to decompress frame stored within `src`. + * If @return == 0, the dictID could not be decoded. + * This could for one of the following reasons : + * - The frame does not require a dictionary (most common case). + * - The frame was built with dictID intentionally removed. + * Needed dictionary is a hidden piece of information. + * Note : this use case also happens when using a non-conformant dictionary. + * - `srcSize` is too small, and as a result, frame header could not be decoded. + * Note : possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`. + * - This is not a Zstandard frame. + * When identifying the exact failure cause, it's possible to use + * ZSTD_getFrameHeader(), which will provide a more precise error code. */ +unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize) +{ + ZSTD_frameHeader zfp = { 0, 0, 0, ZSTD_frame, 0, 0, 0, 0, 0 }; + size_t const hError = ZSTD_getFrameHeader(&zfp, src, srcSize); + if (ZSTD_isError(hError)) return 0; + return zfp.dictID; +} + + +/*! ZSTD_decompress_usingDDict() : +* Decompression using a pre-digested Dictionary +* Use dictionary without significant overhead. */ +size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_DDict* ddict) +{ + /* pass content and size in case legacy frames are encountered */ + return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize, + NULL, 0, + ddict); +} + + +/*===================================== +* Streaming decompression +*====================================*/ + +ZSTD_DStream* ZSTD_createDStream(void) +{ + DEBUGLOG(3, "ZSTD_createDStream"); + return ZSTD_createDCtx_internal(ZSTD_defaultCMem); +} + +ZSTD_DStream* ZSTD_initStaticDStream(void *workspace, size_t workspaceSize) +{ + return ZSTD_initStaticDCtx(workspace, workspaceSize); +} + +ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem) +{ + return ZSTD_createDCtx_internal(customMem); +} + +size_t ZSTD_freeDStream(ZSTD_DStream* zds) +{ + return ZSTD_freeDCtx(zds); +} + + +/* *** Initialization *** */ + +size_t ZSTD_DStreamInSize(void) { return ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize; } +size_t ZSTD_DStreamOutSize(void) { return ZSTD_BLOCKSIZE_MAX; } + +size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType) +{ + RETURN_ERROR_IF(dctx->streamStage != zdss_init, stage_wrong, ""); + ZSTD_clearDict(dctx); + if (dict && dictSize != 0) { + dctx->ddictLocal = ZSTD_createDDict_advanced(dict, dictSize, dictLoadMethod, dictContentType, dctx->customMem); + RETURN_ERROR_IF(dctx->ddictLocal == NULL, memory_allocation, "NULL pointer!"); + dctx->ddict = dctx->ddictLocal; + dctx->dictUses = ZSTD_use_indefinitely; + } + return 0; +} + +size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize) +{ + return ZSTD_DCtx_loadDictionary_advanced(dctx, dict, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto); +} + +size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize) +{ + return ZSTD_DCtx_loadDictionary_advanced(dctx, dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto); +} + +size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType) +{ + FORWARD_IF_ERROR(ZSTD_DCtx_loadDictionary_advanced(dctx, prefix, prefixSize, ZSTD_dlm_byRef, dictContentType), ""); + dctx->dictUses = ZSTD_use_once; + return 0; +} + +size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize) +{ + return ZSTD_DCtx_refPrefix_advanced(dctx, prefix, prefixSize, ZSTD_dct_rawContent); +} + + +/* ZSTD_initDStream_usingDict() : + * return : expected size, aka ZSTD_startingInputLength(). + * this function cannot fail */ +size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize) +{ + DEBUGLOG(4, "ZSTD_initDStream_usingDict"); + FORWARD_IF_ERROR( ZSTD_DCtx_reset(zds, ZSTD_reset_session_only) , ""); + FORWARD_IF_ERROR( ZSTD_DCtx_loadDictionary(zds, dict, dictSize) , ""); + return ZSTD_startingInputLength(zds->format); +} + +/* note : this variant can't fail */ +size_t ZSTD_initDStream(ZSTD_DStream* zds) +{ + DEBUGLOG(4, "ZSTD_initDStream"); + FORWARD_IF_ERROR(ZSTD_DCtx_reset(zds, ZSTD_reset_session_only), ""); + FORWARD_IF_ERROR(ZSTD_DCtx_refDDict(zds, NULL), ""); + return ZSTD_startingInputLength(zds->format); +} + +/* ZSTD_initDStream_usingDDict() : + * ddict will just be referenced, and must outlive decompression session + * this function cannot fail */ +size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* dctx, const ZSTD_DDict* ddict) +{ + DEBUGLOG(4, "ZSTD_initDStream_usingDDict"); + FORWARD_IF_ERROR( ZSTD_DCtx_reset(dctx, ZSTD_reset_session_only) , ""); + FORWARD_IF_ERROR( ZSTD_DCtx_refDDict(dctx, ddict) , ""); + return ZSTD_startingInputLength(dctx->format); +} + +/* ZSTD_resetDStream() : + * return : expected size, aka ZSTD_startingInputLength(). + * this function cannot fail */ +size_t ZSTD_resetDStream(ZSTD_DStream* dctx) +{ + DEBUGLOG(4, "ZSTD_resetDStream"); + FORWARD_IF_ERROR(ZSTD_DCtx_reset(dctx, ZSTD_reset_session_only), ""); + return ZSTD_startingInputLength(dctx->format); +} + + +size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict) +{ + RETURN_ERROR_IF(dctx->streamStage != zdss_init, stage_wrong, ""); + ZSTD_clearDict(dctx); + if (ddict) { + dctx->ddict = ddict; + dctx->dictUses = ZSTD_use_indefinitely; + if (dctx->refMultipleDDicts == ZSTD_rmd_refMultipleDDicts) { + if (dctx->ddictSet == NULL) { + dctx->ddictSet = ZSTD_createDDictHashSet(dctx->customMem); + if (!dctx->ddictSet) { + RETURN_ERROR(memory_allocation, "Failed to allocate memory for hash set!"); + } + } + assert(!dctx->staticSize); /* Impossible: ddictSet cannot have been allocated if static dctx */ + FORWARD_IF_ERROR(ZSTD_DDictHashSet_addDDict(dctx->ddictSet, ddict, dctx->customMem), ""); + } + } + return 0; +} + +/* ZSTD_DCtx_setMaxWindowSize() : + * note : no direct equivalence in ZSTD_DCtx_setParameter, + * since this version sets windowSize, and the other sets windowLog */ +size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize) +{ + ZSTD_bounds const bounds = ZSTD_dParam_getBounds(ZSTD_d_windowLogMax); + size_t const min = (size_t)1 << bounds.lowerBound; + size_t const max = (size_t)1 << bounds.upperBound; + RETURN_ERROR_IF(dctx->streamStage != zdss_init, stage_wrong, ""); + RETURN_ERROR_IF(maxWindowSize < min, parameter_outOfBound, ""); + RETURN_ERROR_IF(maxWindowSize > max, parameter_outOfBound, ""); + dctx->maxWindowSize = maxWindowSize; + return 0; +} + +size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format) +{ + return ZSTD_DCtx_setParameter(dctx, ZSTD_d_format, (int)format); +} + +ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam) +{ + ZSTD_bounds bounds = { 0, 0, 0 }; + switch(dParam) { + case ZSTD_d_windowLogMax: + bounds.lowerBound = ZSTD_WINDOWLOG_ABSOLUTEMIN; + bounds.upperBound = ZSTD_WINDOWLOG_MAX; + return bounds; + case ZSTD_d_format: + bounds.lowerBound = (int)ZSTD_f_zstd1; + bounds.upperBound = (int)ZSTD_f_zstd1_magicless; + ZSTD_STATIC_ASSERT(ZSTD_f_zstd1 < ZSTD_f_zstd1_magicless); + return bounds; + case ZSTD_d_stableOutBuffer: + bounds.lowerBound = (int)ZSTD_bm_buffered; + bounds.upperBound = (int)ZSTD_bm_stable; + return bounds; + case ZSTD_d_forceIgnoreChecksum: + bounds.lowerBound = (int)ZSTD_d_validateChecksum; + bounds.upperBound = (int)ZSTD_d_ignoreChecksum; + return bounds; + case ZSTD_d_refMultipleDDicts: + bounds.lowerBound = (int)ZSTD_rmd_refSingleDDict; + bounds.upperBound = (int)ZSTD_rmd_refMultipleDDicts; + return bounds; + case ZSTD_d_disableHuffmanAssembly: + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + + default:; + } + bounds.error = ERROR(parameter_unsupported); + return bounds; +} + +/* ZSTD_dParam_withinBounds: + * @return 1 if value is within dParam bounds, + * 0 otherwise */ +static int ZSTD_dParam_withinBounds(ZSTD_dParameter dParam, int value) +{ + ZSTD_bounds const bounds = ZSTD_dParam_getBounds(dParam); + if (ZSTD_isError(bounds.error)) return 0; + if (value < bounds.lowerBound) return 0; + if (value > bounds.upperBound) return 0; + return 1; +} + +#define CHECK_DBOUNDS(p,v) { \ + RETURN_ERROR_IF(!ZSTD_dParam_withinBounds(p, v), parameter_outOfBound, ""); \ +} + +size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value) +{ + switch (param) { + case ZSTD_d_windowLogMax: + *value = (int)ZSTD_highbit32((U32)dctx->maxWindowSize); + return 0; + case ZSTD_d_format: + *value = (int)dctx->format; + return 0; + case ZSTD_d_stableOutBuffer: + *value = (int)dctx->outBufferMode; + return 0; + case ZSTD_d_forceIgnoreChecksum: + *value = (int)dctx->forceIgnoreChecksum; + return 0; + case ZSTD_d_refMultipleDDicts: + *value = (int)dctx->refMultipleDDicts; + return 0; + case ZSTD_d_disableHuffmanAssembly: + *value = (int)dctx->disableHufAsm; + return 0; + default:; + } + RETURN_ERROR(parameter_unsupported, ""); +} + +size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter dParam, int value) +{ + RETURN_ERROR_IF(dctx->streamStage != zdss_init, stage_wrong, ""); + switch(dParam) { + case ZSTD_d_windowLogMax: + if (value == 0) value = ZSTD_WINDOWLOG_LIMIT_DEFAULT; + CHECK_DBOUNDS(ZSTD_d_windowLogMax, value); + dctx->maxWindowSize = ((size_t)1) << value; + return 0; + case ZSTD_d_format: + CHECK_DBOUNDS(ZSTD_d_format, value); + dctx->format = (ZSTD_format_e)value; + return 0; + case ZSTD_d_stableOutBuffer: + CHECK_DBOUNDS(ZSTD_d_stableOutBuffer, value); + dctx->outBufferMode = (ZSTD_bufferMode_e)value; + return 0; + case ZSTD_d_forceIgnoreChecksum: + CHECK_DBOUNDS(ZSTD_d_forceIgnoreChecksum, value); + dctx->forceIgnoreChecksum = (ZSTD_forceIgnoreChecksum_e)value; + return 0; + case ZSTD_d_refMultipleDDicts: + CHECK_DBOUNDS(ZSTD_d_refMultipleDDicts, value); + if (dctx->staticSize != 0) { + RETURN_ERROR(parameter_unsupported, "Static dctx does not support multiple DDicts!"); + } + dctx->refMultipleDDicts = (ZSTD_refMultipleDDicts_e)value; + return 0; + case ZSTD_d_disableHuffmanAssembly: + CHECK_DBOUNDS(ZSTD_d_disableHuffmanAssembly, value); + dctx->disableHufAsm = value != 0; + return 0; + default:; + } + RETURN_ERROR(parameter_unsupported, ""); +} + +size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset) +{ + if ( (reset == ZSTD_reset_session_only) + || (reset == ZSTD_reset_session_and_parameters) ) { + dctx->streamStage = zdss_init; + dctx->noForwardProgress = 0; + } + if ( (reset == ZSTD_reset_parameters) + || (reset == ZSTD_reset_session_and_parameters) ) { + RETURN_ERROR_IF(dctx->streamStage != zdss_init, stage_wrong, ""); + ZSTD_clearDict(dctx); + ZSTD_DCtx_resetParameters(dctx); + } + return 0; +} + + +size_t ZSTD_sizeof_DStream(const ZSTD_DStream* dctx) +{ + return ZSTD_sizeof_DCtx(dctx); +} + +size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize) +{ + size_t const blockSize = (size_t) MIN(windowSize, ZSTD_BLOCKSIZE_MAX); + /* space is needed to store the litbuffer after the output of a given block without stomping the extDict of a previous run, as well as to cover both windows against wildcopy*/ + unsigned long long const neededRBSize = windowSize + blockSize + ZSTD_BLOCKSIZE_MAX + (WILDCOPY_OVERLENGTH * 2); + unsigned long long const neededSize = MIN(frameContentSize, neededRBSize); + size_t const minRBSize = (size_t) neededSize; + RETURN_ERROR_IF((unsigned long long)minRBSize != neededSize, + frameParameter_windowTooLarge, ""); + return minRBSize; +} + +size_t ZSTD_estimateDStreamSize(size_t windowSize) +{ + size_t const blockSize = MIN(windowSize, ZSTD_BLOCKSIZE_MAX); + size_t const inBuffSize = blockSize; /* no block can be larger */ + size_t const outBuffSize = ZSTD_decodingBufferSize_min(windowSize, ZSTD_CONTENTSIZE_UNKNOWN); + return ZSTD_estimateDCtxSize() + inBuffSize + outBuffSize; +} + +size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize) +{ + U32 const windowSizeMax = 1U << ZSTD_WINDOWLOG_MAX; /* note : should be user-selectable, but requires an additional parameter (or a dctx) */ + ZSTD_frameHeader zfh; + size_t const err = ZSTD_getFrameHeader(&zfh, src, srcSize); + if (ZSTD_isError(err)) return err; + RETURN_ERROR_IF(err>0, srcSize_wrong, ""); + RETURN_ERROR_IF(zfh.windowSize > windowSizeMax, + frameParameter_windowTooLarge, ""); + return ZSTD_estimateDStreamSize((size_t)zfh.windowSize); +} + + +/* ***** Decompression ***** */ + +static int ZSTD_DCtx_isOverflow(ZSTD_DStream* zds, size_t const neededInBuffSize, size_t const neededOutBuffSize) +{ + return (zds->inBuffSize + zds->outBuffSize) >= (neededInBuffSize + neededOutBuffSize) * ZSTD_WORKSPACETOOLARGE_FACTOR; +} + +static void ZSTD_DCtx_updateOversizedDuration(ZSTD_DStream* zds, size_t const neededInBuffSize, size_t const neededOutBuffSize) +{ + if (ZSTD_DCtx_isOverflow(zds, neededInBuffSize, neededOutBuffSize)) + zds->oversizedDuration++; + else + zds->oversizedDuration = 0; +} + +static int ZSTD_DCtx_isOversizedTooLong(ZSTD_DStream* zds) +{ + return zds->oversizedDuration >= ZSTD_WORKSPACETOOLARGE_MAXDURATION; +} + +/* Checks that the output buffer hasn't changed if ZSTD_obm_stable is used. */ +static size_t ZSTD_checkOutBuffer(ZSTD_DStream const* zds, ZSTD_outBuffer const* output) +{ + ZSTD_outBuffer const expect = zds->expectedOutBuffer; + /* No requirement when ZSTD_obm_stable is not enabled. */ + if (zds->outBufferMode != ZSTD_bm_stable) + return 0; + /* Any buffer is allowed in zdss_init, this must be the same for every other call until + * the context is reset. + */ + if (zds->streamStage == zdss_init) + return 0; + /* The buffer must match our expectation exactly. */ + if (expect.dst == output->dst && expect.pos == output->pos && expect.size == output->size) + return 0; + RETURN_ERROR(dstBuffer_wrong, "ZSTD_d_stableOutBuffer enabled but output differs!"); +} + +/* Calls ZSTD_decompressContinue() with the right parameters for ZSTD_decompressStream() + * and updates the stage and the output buffer state. This call is extracted so it can be + * used both when reading directly from the ZSTD_inBuffer, and in buffered input mode. + * NOTE: You must break after calling this function since the streamStage is modified. + */ +static size_t ZSTD_decompressContinueStream( + ZSTD_DStream* zds, char** op, char* oend, + void const* src, size_t srcSize) { + int const isSkipFrame = ZSTD_isSkipFrame(zds); + if (zds->outBufferMode == ZSTD_bm_buffered) { + size_t const dstSize = isSkipFrame ? 0 : zds->outBuffSize - zds->outStart; + size_t const decodedSize = ZSTD_decompressContinue(zds, + zds->outBuff + zds->outStart, dstSize, src, srcSize); + FORWARD_IF_ERROR(decodedSize, ""); + if (!decodedSize && !isSkipFrame) { + zds->streamStage = zdss_read; + } else { + zds->outEnd = zds->outStart + decodedSize; + zds->streamStage = zdss_flush; + } + } else { + /* Write directly into the output buffer */ + size_t const dstSize = isSkipFrame ? 0 : (size_t)(oend - *op); + size_t const decodedSize = ZSTD_decompressContinue(zds, *op, dstSize, src, srcSize); + FORWARD_IF_ERROR(decodedSize, ""); + *op += decodedSize; + /* Flushing is not needed. */ + zds->streamStage = zdss_read; + assert(*op <= oend); + assert(zds->outBufferMode == ZSTD_bm_stable); + } + return 0; +} + +size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input) +{ + const char* const src = (const char*)input->src; + const char* const istart = input->pos != 0 ? src + input->pos : src; + const char* const iend = input->size != 0 ? src + input->size : src; + const char* ip = istart; + char* const dst = (char*)output->dst; + char* const ostart = output->pos != 0 ? dst + output->pos : dst; + char* const oend = output->size != 0 ? dst + output->size : dst; + char* op = ostart; + U32 someMoreWork = 1; + + DEBUGLOG(5, "ZSTD_decompressStream"); + RETURN_ERROR_IF( + input->pos > input->size, + srcSize_wrong, + "forbidden. in: pos: %u vs size: %u", + (U32)input->pos, (U32)input->size); + RETURN_ERROR_IF( + output->pos > output->size, + dstSize_tooSmall, + "forbidden. out: pos: %u vs size: %u", + (U32)output->pos, (U32)output->size); + DEBUGLOG(5, "input size : %u", (U32)(input->size - input->pos)); + FORWARD_IF_ERROR(ZSTD_checkOutBuffer(zds, output), ""); + + while (someMoreWork) { + switch(zds->streamStage) + { + case zdss_init : + DEBUGLOG(5, "stage zdss_init => transparent reset "); + zds->streamStage = zdss_loadHeader; + zds->lhSize = zds->inPos = zds->outStart = zds->outEnd = 0; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) + zds->legacyVersion = 0; +#endif + zds->hostageByte = 0; + zds->expectedOutBuffer = *output; + ZSTD_FALLTHROUGH; + + case zdss_loadHeader : + DEBUGLOG(5, "stage zdss_loadHeader (srcSize : %u)", (U32)(iend - ip)); +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) + if (zds->legacyVersion) { + RETURN_ERROR_IF(zds->staticSize, memory_allocation, + "legacy support is incompatible with static dctx"); + { size_t const hint = ZSTD_decompressLegacyStream(zds->legacyContext, zds->legacyVersion, output, input); + if (hint==0) zds->streamStage = zdss_init; + return hint; + } } +#endif + { size_t const hSize = ZSTD_getFrameHeader_advanced(&zds->fParams, zds->headerBuffer, zds->lhSize, zds->format); + if (zds->refMultipleDDicts && zds->ddictSet) { + ZSTD_DCtx_selectFrameDDict(zds); + } + if (ZSTD_isError(hSize)) { +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) + U32 const legacyVersion = ZSTD_isLegacy(istart, iend-istart); + if (legacyVersion) { + ZSTD_DDict const* const ddict = ZSTD_getDDict(zds); + const void* const dict = ddict ? ZSTD_DDict_dictContent(ddict) : NULL; + size_t const dictSize = ddict ? ZSTD_DDict_dictSize(ddict) : 0; + DEBUGLOG(5, "ZSTD_decompressStream: detected legacy version v0.%u", legacyVersion); + RETURN_ERROR_IF(zds->staticSize, memory_allocation, + "legacy support is incompatible with static dctx"); + FORWARD_IF_ERROR(ZSTD_initLegacyStream(&zds->legacyContext, + zds->previousLegacyVersion, legacyVersion, + dict, dictSize), ""); + zds->legacyVersion = zds->previousLegacyVersion = legacyVersion; + { size_t const hint = ZSTD_decompressLegacyStream(zds->legacyContext, legacyVersion, output, input); + if (hint==0) zds->streamStage = zdss_init; /* or stay in stage zdss_loadHeader */ + return hint; + } } +#endif + return hSize; /* error */ + } + if (hSize != 0) { /* need more input */ + size_t const toLoad = hSize - zds->lhSize; /* if hSize!=0, hSize > zds->lhSize */ + size_t const remainingInput = (size_t)(iend-ip); + assert(iend >= ip); + if (toLoad > remainingInput) { /* not enough input to load full header */ + if (remainingInput > 0) { + ZSTD_memcpy(zds->headerBuffer + zds->lhSize, ip, remainingInput); + zds->lhSize += remainingInput; + } + input->pos = input->size; + /* check first few bytes */ + FORWARD_IF_ERROR( + ZSTD_getFrameHeader_advanced(&zds->fParams, zds->headerBuffer, zds->lhSize, zds->format), + "First few bytes detected incorrect" ); + /* return hint input size */ + return (MAX((size_t)ZSTD_FRAMEHEADERSIZE_MIN(zds->format), hSize) - zds->lhSize) + ZSTD_blockHeaderSize; /* remaining header bytes + next block header */ + } + assert(ip != NULL); + ZSTD_memcpy(zds->headerBuffer + zds->lhSize, ip, toLoad); zds->lhSize = hSize; ip += toLoad; + break; + } } + + /* check for single-pass mode opportunity */ + if (zds->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN + && zds->fParams.frameType != ZSTD_skippableFrame + && (U64)(size_t)(oend-op) >= zds->fParams.frameContentSize) { + size_t const cSize = ZSTD_findFrameCompressedSize(istart, (size_t)(iend-istart)); + if (cSize <= (size_t)(iend-istart)) { + /* shortcut : using single-pass mode */ + size_t const decompressedSize = ZSTD_decompress_usingDDict(zds, op, (size_t)(oend-op), istart, cSize, ZSTD_getDDict(zds)); + if (ZSTD_isError(decompressedSize)) return decompressedSize; + DEBUGLOG(4, "shortcut to single-pass ZSTD_decompress_usingDDict()") + assert(istart != NULL); + ip = istart + cSize; + op = op ? op + decompressedSize : op; /* can occur if frameContentSize = 0 (empty frame) */ + zds->expected = 0; + zds->streamStage = zdss_init; + someMoreWork = 0; + break; + } } + + /* Check output buffer is large enough for ZSTD_odm_stable. */ + if (zds->outBufferMode == ZSTD_bm_stable + && zds->fParams.frameType != ZSTD_skippableFrame + && zds->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN + && (U64)(size_t)(oend-op) < zds->fParams.frameContentSize) { + RETURN_ERROR(dstSize_tooSmall, "ZSTD_obm_stable passed but ZSTD_outBuffer is too small"); + } + + /* Consume header (see ZSTDds_decodeFrameHeader) */ + DEBUGLOG(4, "Consume header"); + FORWARD_IF_ERROR(ZSTD_decompressBegin_usingDDict(zds, ZSTD_getDDict(zds)), ""); + + if ((MEM_readLE32(zds->headerBuffer) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */ + zds->expected = MEM_readLE32(zds->headerBuffer + ZSTD_FRAMEIDSIZE); + zds->stage = ZSTDds_skipFrame; + } else { + FORWARD_IF_ERROR(ZSTD_decodeFrameHeader(zds, zds->headerBuffer, zds->lhSize), ""); + zds->expected = ZSTD_blockHeaderSize; + zds->stage = ZSTDds_decodeBlockHeader; + } + + /* control buffer memory usage */ + DEBUGLOG(4, "Control max memory usage (%u KB <= max %u KB)", + (U32)(zds->fParams.windowSize >>10), + (U32)(zds->maxWindowSize >> 10) ); + zds->fParams.windowSize = MAX(zds->fParams.windowSize, 1U << ZSTD_WINDOWLOG_ABSOLUTEMIN); + RETURN_ERROR_IF(zds->fParams.windowSize > zds->maxWindowSize, + frameParameter_windowTooLarge, ""); + + /* Adapt buffer sizes to frame header instructions */ + { size_t const neededInBuffSize = MAX(zds->fParams.blockSizeMax, 4 /* frame checksum */); + size_t const neededOutBuffSize = zds->outBufferMode == ZSTD_bm_buffered + ? ZSTD_decodingBufferSize_min(zds->fParams.windowSize, zds->fParams.frameContentSize) + : 0; + + ZSTD_DCtx_updateOversizedDuration(zds, neededInBuffSize, neededOutBuffSize); + + { int const tooSmall = (zds->inBuffSize < neededInBuffSize) || (zds->outBuffSize < neededOutBuffSize); + int const tooLarge = ZSTD_DCtx_isOversizedTooLong(zds); + + if (tooSmall || tooLarge) { + size_t const bufferSize = neededInBuffSize + neededOutBuffSize; + DEBUGLOG(4, "inBuff : from %u to %u", + (U32)zds->inBuffSize, (U32)neededInBuffSize); + DEBUGLOG(4, "outBuff : from %u to %u", + (U32)zds->outBuffSize, (U32)neededOutBuffSize); + if (zds->staticSize) { /* static DCtx */ + DEBUGLOG(4, "staticSize : %u", (U32)zds->staticSize); + assert(zds->staticSize >= sizeof(ZSTD_DCtx)); /* controlled at init */ + RETURN_ERROR_IF( + bufferSize > zds->staticSize - sizeof(ZSTD_DCtx), + memory_allocation, ""); + } else { + ZSTD_customFree(zds->inBuff, zds->customMem); + zds->inBuffSize = 0; + zds->outBuffSize = 0; + zds->inBuff = (char*)ZSTD_customMalloc(bufferSize, zds->customMem); + RETURN_ERROR_IF(zds->inBuff == NULL, memory_allocation, ""); + } + zds->inBuffSize = neededInBuffSize; + zds->outBuff = zds->inBuff + zds->inBuffSize; + zds->outBuffSize = neededOutBuffSize; + } } } + zds->streamStage = zdss_read; + ZSTD_FALLTHROUGH; + + case zdss_read: + DEBUGLOG(5, "stage zdss_read"); + { size_t const neededInSize = ZSTD_nextSrcSizeToDecompressWithInputSize(zds, (size_t)(iend - ip)); + DEBUGLOG(5, "neededInSize = %u", (U32)neededInSize); + if (neededInSize==0) { /* end of frame */ + zds->streamStage = zdss_init; + someMoreWork = 0; + break; + } + if ((size_t)(iend-ip) >= neededInSize) { /* decode directly from src */ + FORWARD_IF_ERROR(ZSTD_decompressContinueStream(zds, &op, oend, ip, neededInSize), ""); + assert(ip != NULL); + ip += neededInSize; + /* Function modifies the stage so we must break */ + break; + } } + if (ip==iend) { someMoreWork = 0; break; } /* no more input */ + zds->streamStage = zdss_load; + ZSTD_FALLTHROUGH; + + case zdss_load: + { size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds); + size_t const toLoad = neededInSize - zds->inPos; + int const isSkipFrame = ZSTD_isSkipFrame(zds); + size_t loadedSize; + /* At this point we shouldn't be decompressing a block that we can stream. */ + assert(neededInSize == ZSTD_nextSrcSizeToDecompressWithInputSize(zds, (size_t)(iend - ip))); + if (isSkipFrame) { + loadedSize = MIN(toLoad, (size_t)(iend-ip)); + } else { + RETURN_ERROR_IF(toLoad > zds->inBuffSize - zds->inPos, + corruption_detected, + "should never happen"); + loadedSize = ZSTD_limitCopy(zds->inBuff + zds->inPos, toLoad, ip, (size_t)(iend-ip)); + } + if (loadedSize != 0) { + /* ip may be NULL */ + ip += loadedSize; + zds->inPos += loadedSize; + } + if (loadedSize < toLoad) { someMoreWork = 0; break; } /* not enough input, wait for more */ + + /* decode loaded input */ + zds->inPos = 0; /* input is consumed */ + FORWARD_IF_ERROR(ZSTD_decompressContinueStream(zds, &op, oend, zds->inBuff, neededInSize), ""); + /* Function modifies the stage so we must break */ + break; + } + case zdss_flush: + { + size_t const toFlushSize = zds->outEnd - zds->outStart; + size_t const flushedSize = ZSTD_limitCopy(op, (size_t)(oend-op), zds->outBuff + zds->outStart, toFlushSize); + + op = op ? op + flushedSize : op; + + zds->outStart += flushedSize; + if (flushedSize == toFlushSize) { /* flush completed */ + zds->streamStage = zdss_read; + if ( (zds->outBuffSize < zds->fParams.frameContentSize) + && (zds->outStart + zds->fParams.blockSizeMax > zds->outBuffSize) ) { + DEBUGLOG(5, "restart filling outBuff from beginning (left:%i, needed:%u)", + (int)(zds->outBuffSize - zds->outStart), + (U32)zds->fParams.blockSizeMax); + zds->outStart = zds->outEnd = 0; + } + break; + } } + /* cannot complete flush */ + someMoreWork = 0; + break; + + default: + assert(0); /* impossible */ + RETURN_ERROR(GENERIC, "impossible to reach"); /* some compilers require default to do something */ + } } + + /* result */ + input->pos = (size_t)(ip - (const char*)(input->src)); + output->pos = (size_t)(op - (char*)(output->dst)); + + /* Update the expected output buffer for ZSTD_obm_stable. */ + zds->expectedOutBuffer = *output; + + if ((ip==istart) && (op==ostart)) { /* no forward progress */ + zds->noForwardProgress ++; + if (zds->noForwardProgress >= ZSTD_NO_FORWARD_PROGRESS_MAX) { + RETURN_ERROR_IF(op==oend, noForwardProgress_destFull, ""); + RETURN_ERROR_IF(ip==iend, noForwardProgress_inputEmpty, ""); + assert(0); + } + } else { + zds->noForwardProgress = 0; + } + { size_t nextSrcSizeHint = ZSTD_nextSrcSizeToDecompress(zds); + if (!nextSrcSizeHint) { /* frame fully decoded */ + if (zds->outEnd == zds->outStart) { /* output fully flushed */ + if (zds->hostageByte) { + if (input->pos >= input->size) { + /* can't release hostage (not present) */ + zds->streamStage = zdss_read; + return 1; + } + input->pos++; /* release hostage */ + } /* zds->hostageByte */ + return 0; + } /* zds->outEnd == zds->outStart */ + if (!zds->hostageByte) { /* output not fully flushed; keep last byte as hostage; will be released when all output is flushed */ + input->pos--; /* note : pos > 0, otherwise, impossible to finish reading last block */ + zds->hostageByte=1; + } + return 1; + } /* nextSrcSizeHint==0 */ + nextSrcSizeHint += ZSTD_blockHeaderSize * (ZSTD_nextInputType(zds) == ZSTDnit_block); /* preload header of next block */ + assert(zds->inPos <= nextSrcSizeHint); + nextSrcSizeHint -= zds->inPos; /* part already loaded*/ + return nextSrcSizeHint; + } +} + +size_t ZSTD_decompressStream_simpleArgs ( + ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, size_t* dstPos, + const void* src, size_t srcSize, size_t* srcPos) +{ + ZSTD_outBuffer output; + ZSTD_inBuffer input; + output.dst = dst; + output.size = dstCapacity; + output.pos = *dstPos; + input.src = src; + input.size = srcSize; + input.pos = *srcPos; + { size_t const cErr = ZSTD_decompressStream(dctx, &output, &input); + *dstPos = output.pos; + *srcPos = input.pos; + return cErr; + } +} +/**** ended inlining decompress/zstd_decompress.c ****/ +/**** start inlining decompress/zstd_decompress_block.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* zstd_decompress_block : + * this module takes care of decompressing _compressed_ block */ + +/*-******************************************************* +* Dependencies +*********************************************************/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../common/compiler.h ****/ +/**** skipping file: ../common/cpu.h ****/ +/**** skipping file: ../common/mem.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/huf.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: zstd_decompress_internal.h ****/ +/**** skipping file: zstd_ddict.h ****/ +/**** skipping file: zstd_decompress_block.h ****/ +/**** skipping file: ../common/bits.h ****/ + +/*_******************************************************* +* Macros +**********************************************************/ + +/* These two optional macros force the use one way or another of the two + * ZSTD_decompressSequences implementations. You can't force in both directions + * at the same time. + */ +#if defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ + defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) +#error "Cannot force the use of the short and the long ZSTD_decompressSequences variants!" +#endif + + +/*_******************************************************* +* Memory operations +**********************************************************/ +static void ZSTD_copy4(void* dst, const void* src) { ZSTD_memcpy(dst, src, 4); } + + +/*-************************************************************* + * Block decoding + ***************************************************************/ + +/*! ZSTD_getcBlockSize() : + * Provides the size of compressed block from block header `src` */ +size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, + blockProperties_t* bpPtr) +{ + RETURN_ERROR_IF(srcSize < ZSTD_blockHeaderSize, srcSize_wrong, ""); + + { U32 const cBlockHeader = MEM_readLE24(src); + U32 const cSize = cBlockHeader >> 3; + bpPtr->lastBlock = cBlockHeader & 1; + bpPtr->blockType = (blockType_e)((cBlockHeader >> 1) & 3); + bpPtr->origSize = cSize; /* only useful for RLE */ + if (bpPtr->blockType == bt_rle) return 1; + RETURN_ERROR_IF(bpPtr->blockType == bt_reserved, corruption_detected, ""); + return cSize; + } +} + +/* Allocate buffer for literals, either overlapping current dst, or split between dst and litExtraBuffer, or stored entirely within litExtraBuffer */ +static void ZSTD_allocateLiteralsBuffer(ZSTD_DCtx* dctx, void* const dst, const size_t dstCapacity, const size_t litSize, + const streaming_operation streaming, const size_t expectedWriteSize, const unsigned splitImmediately) +{ + if (streaming == not_streaming && dstCapacity > ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH + litSize + WILDCOPY_OVERLENGTH) + { + /* room for litbuffer to fit without read faulting */ + dctx->litBuffer = (BYTE*)dst + ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH; + dctx->litBufferEnd = dctx->litBuffer + litSize; + dctx->litBufferLocation = ZSTD_in_dst; + } + else if (litSize > ZSTD_LITBUFFEREXTRASIZE) + { + /* won't fit in litExtraBuffer, so it will be split between end of dst and extra buffer */ + if (splitImmediately) { + /* won't fit in litExtraBuffer, so it will be split between end of dst and extra buffer */ + dctx->litBuffer = (BYTE*)dst + expectedWriteSize - litSize + ZSTD_LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH; + dctx->litBufferEnd = dctx->litBuffer + litSize - ZSTD_LITBUFFEREXTRASIZE; + } + else { + /* initially this will be stored entirely in dst during huffman decoding, it will partially be shifted to litExtraBuffer after */ + dctx->litBuffer = (BYTE*)dst + expectedWriteSize - litSize; + dctx->litBufferEnd = (BYTE*)dst + expectedWriteSize; + } + dctx->litBufferLocation = ZSTD_split; + } + else + { + /* fits entirely within litExtraBuffer, so no split is necessary */ + dctx->litBuffer = dctx->litExtraBuffer; + dctx->litBufferEnd = dctx->litBuffer + litSize; + dctx->litBufferLocation = ZSTD_not_in_dst; + } +} + +/* Hidden declaration for fullbench */ +size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, + const void* src, size_t srcSize, + void* dst, size_t dstCapacity, const streaming_operation streaming); +/*! ZSTD_decodeLiteralsBlock() : + * Where it is possible to do so without being stomped by the output during decompression, the literals block will be stored + * in the dstBuffer. If there is room to do so, it will be stored in full in the excess dst space after where the current + * block will be output. Otherwise it will be stored at the end of the current dst blockspace, with a small portion being + * stored in dctx->litExtraBuffer to help keep it "ahead" of the current output write. + * + * @return : nb of bytes read from src (< srcSize ) + * note : symbol not declared but exposed for fullbench */ +size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, + const void* src, size_t srcSize, /* note : srcSize < BLOCKSIZE */ + void* dst, size_t dstCapacity, const streaming_operation streaming) +{ + DEBUGLOG(5, "ZSTD_decodeLiteralsBlock"); + RETURN_ERROR_IF(srcSize < MIN_CBLOCK_SIZE, corruption_detected, ""); + + { const BYTE* const istart = (const BYTE*) src; + symbolEncodingType_e const litEncType = (symbolEncodingType_e)(istart[0] & 3); + + switch(litEncType) + { + case set_repeat: + DEBUGLOG(5, "set_repeat flag : re-using stats from previous compressed literals block"); + RETURN_ERROR_IF(dctx->litEntropy==0, dictionary_corrupted, ""); + ZSTD_FALLTHROUGH; + + case set_compressed: + RETURN_ERROR_IF(srcSize < 5, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need up to 5 for case 3"); + { size_t lhSize, litSize, litCSize; + U32 singleStream=0; + U32 const lhlCode = (istart[0] >> 2) & 3; + U32 const lhc = MEM_readLE32(istart); + size_t hufSuccess; + size_t expectedWriteSize = MIN(ZSTD_BLOCKSIZE_MAX, dstCapacity); + int const flags = 0 + | (ZSTD_DCtx_get_bmi2(dctx) ? HUF_flags_bmi2 : 0) + | (dctx->disableHufAsm ? HUF_flags_disableAsm : 0); + switch(lhlCode) + { + case 0: case 1: default: /* note : default is impossible, since lhlCode into [0..3] */ + /* 2 - 2 - 10 - 10 */ + singleStream = !lhlCode; + lhSize = 3; + litSize = (lhc >> 4) & 0x3FF; + litCSize = (lhc >> 14) & 0x3FF; + break; + case 2: + /* 2 - 2 - 14 - 14 */ + lhSize = 4; + litSize = (lhc >> 4) & 0x3FFF; + litCSize = lhc >> 18; + break; + case 3: + /* 2 - 2 - 18 - 18 */ + lhSize = 5; + litSize = (lhc >> 4) & 0x3FFFF; + litCSize = (lhc >> 22) + ((size_t)istart[4] << 10); + break; + } + RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); + RETURN_ERROR_IF(litSize > ZSTD_BLOCKSIZE_MAX, corruption_detected, ""); + if (!singleStream) + RETURN_ERROR_IF(litSize < MIN_LITERALS_FOR_4_STREAMS, literals_headerWrong, + "Not enough literals (%zu) for the 4-streams mode (min %u)", + litSize, MIN_LITERALS_FOR_4_STREAMS); + RETURN_ERROR_IF(litCSize + lhSize > srcSize, corruption_detected, ""); + RETURN_ERROR_IF(expectedWriteSize < litSize , dstSize_tooSmall, ""); + ZSTD_allocateLiteralsBuffer(dctx, dst, dstCapacity, litSize, streaming, expectedWriteSize, 0); + + /* prefetch huffman table if cold */ + if (dctx->ddictIsCold && (litSize > 768 /* heuristic */)) { + PREFETCH_AREA(dctx->HUFptr, sizeof(dctx->entropy.hufTable)); + } + + if (litEncType==set_repeat) { + if (singleStream) { + hufSuccess = HUF_decompress1X_usingDTable( + dctx->litBuffer, litSize, istart+lhSize, litCSize, + dctx->HUFptr, flags); + } else { + assert(litSize >= MIN_LITERALS_FOR_4_STREAMS); + hufSuccess = HUF_decompress4X_usingDTable( + dctx->litBuffer, litSize, istart+lhSize, litCSize, + dctx->HUFptr, flags); + } + } else { + if (singleStream) { +#if defined(HUF_FORCE_DECOMPRESS_X2) + hufSuccess = HUF_decompress1X_DCtx_wksp( + dctx->entropy.hufTable, dctx->litBuffer, litSize, + istart+lhSize, litCSize, dctx->workspace, + sizeof(dctx->workspace), flags); +#else + hufSuccess = HUF_decompress1X1_DCtx_wksp( + dctx->entropy.hufTable, dctx->litBuffer, litSize, + istart+lhSize, litCSize, dctx->workspace, + sizeof(dctx->workspace), flags); +#endif + } else { + hufSuccess = HUF_decompress4X_hufOnly_wksp( + dctx->entropy.hufTable, dctx->litBuffer, litSize, + istart+lhSize, litCSize, dctx->workspace, + sizeof(dctx->workspace), flags); + } + } + if (dctx->litBufferLocation == ZSTD_split) + { + ZSTD_memcpy(dctx->litExtraBuffer, dctx->litBufferEnd - ZSTD_LITBUFFEREXTRASIZE, ZSTD_LITBUFFEREXTRASIZE); + ZSTD_memmove(dctx->litBuffer + ZSTD_LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH, dctx->litBuffer, litSize - ZSTD_LITBUFFEREXTRASIZE); + dctx->litBuffer += ZSTD_LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH; + dctx->litBufferEnd -= WILDCOPY_OVERLENGTH; + } + + RETURN_ERROR_IF(HUF_isError(hufSuccess), corruption_detected, ""); + + dctx->litPtr = dctx->litBuffer; + dctx->litSize = litSize; + dctx->litEntropy = 1; + if (litEncType==set_compressed) dctx->HUFptr = dctx->entropy.hufTable; + return litCSize + lhSize; + } + + case set_basic: + { size_t litSize, lhSize; + U32 const lhlCode = ((istart[0]) >> 2) & 3; + size_t expectedWriteSize = MIN(ZSTD_BLOCKSIZE_MAX, dstCapacity); + switch(lhlCode) + { + case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */ + lhSize = 1; + litSize = istart[0] >> 3; + break; + case 1: + lhSize = 2; + litSize = MEM_readLE16(istart) >> 4; + break; + case 3: + lhSize = 3; + RETURN_ERROR_IF(srcSize<3, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need lhSize = 3"); + litSize = MEM_readLE24(istart) >> 4; + break; + } + + RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); + RETURN_ERROR_IF(expectedWriteSize < litSize, dstSize_tooSmall, ""); + ZSTD_allocateLiteralsBuffer(dctx, dst, dstCapacity, litSize, streaming, expectedWriteSize, 1); + if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) { /* risk reading beyond src buffer with wildcopy */ + RETURN_ERROR_IF(litSize+lhSize > srcSize, corruption_detected, ""); + if (dctx->litBufferLocation == ZSTD_split) + { + ZSTD_memcpy(dctx->litBuffer, istart + lhSize, litSize - ZSTD_LITBUFFEREXTRASIZE); + ZSTD_memcpy(dctx->litExtraBuffer, istart + lhSize + litSize - ZSTD_LITBUFFEREXTRASIZE, ZSTD_LITBUFFEREXTRASIZE); + } + else + { + ZSTD_memcpy(dctx->litBuffer, istart + lhSize, litSize); + } + dctx->litPtr = dctx->litBuffer; + dctx->litSize = litSize; + return lhSize+litSize; + } + /* direct reference into compressed stream */ + dctx->litPtr = istart+lhSize; + dctx->litSize = litSize; + dctx->litBufferEnd = dctx->litPtr + litSize; + dctx->litBufferLocation = ZSTD_not_in_dst; + return lhSize+litSize; + } + + case set_rle: + { U32 const lhlCode = ((istart[0]) >> 2) & 3; + size_t litSize, lhSize; + size_t expectedWriteSize = MIN(ZSTD_BLOCKSIZE_MAX, dstCapacity); + switch(lhlCode) + { + case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */ + lhSize = 1; + litSize = istart[0] >> 3; + break; + case 1: + lhSize = 2; + RETURN_ERROR_IF(srcSize<3, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need lhSize+1 = 3"); + litSize = MEM_readLE16(istart) >> 4; + break; + case 3: + lhSize = 3; + RETURN_ERROR_IF(srcSize<4, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need lhSize+1 = 4"); + litSize = MEM_readLE24(istart) >> 4; + break; + } + RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); + RETURN_ERROR_IF(litSize > ZSTD_BLOCKSIZE_MAX, corruption_detected, ""); + RETURN_ERROR_IF(expectedWriteSize < litSize, dstSize_tooSmall, ""); + ZSTD_allocateLiteralsBuffer(dctx, dst, dstCapacity, litSize, streaming, expectedWriteSize, 1); + if (dctx->litBufferLocation == ZSTD_split) + { + ZSTD_memset(dctx->litBuffer, istart[lhSize], litSize - ZSTD_LITBUFFEREXTRASIZE); + ZSTD_memset(dctx->litExtraBuffer, istart[lhSize], ZSTD_LITBUFFEREXTRASIZE); + } + else + { + ZSTD_memset(dctx->litBuffer, istart[lhSize], litSize); + } + dctx->litPtr = dctx->litBuffer; + dctx->litSize = litSize; + return lhSize+1; + } + default: + RETURN_ERROR(corruption_detected, "impossible"); + } + } +} + +/* Default FSE distribution tables. + * These are pre-calculated FSE decoding tables using default distributions as defined in specification : + * https://github.com/facebook/zstd/blob/release/doc/zstd_compression_format.md#default-distributions + * They were generated programmatically with following method : + * - start from default distributions, present in /lib/common/zstd_internal.h + * - generate tables normally, using ZSTD_buildFSETable() + * - printout the content of tables + * - pretify output, report below, test with fuzzer to ensure it's correct */ + +/* Default FSE distribution table for Literal Lengths */ +static const ZSTD_seqSymbol LL_defaultDTable[(1<tableLog = 0; + DTableH->fastMode = 0; + + cell->nbBits = 0; + cell->nextState = 0; + assert(nbAddBits < 255); + cell->nbAdditionalBits = nbAddBits; + cell->baseValue = baseValue; +} + + +/* ZSTD_buildFSETable() : + * generate FSE decoding table for one symbol (ll, ml or off) + * cannot fail if input is valid => + * all inputs are presumed validated at this stage */ +FORCE_INLINE_TEMPLATE +void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt, + const short* normalizedCounter, unsigned maxSymbolValue, + const U32* baseValue, const U8* nbAdditionalBits, + unsigned tableLog, void* wksp, size_t wkspSize) +{ + ZSTD_seqSymbol* const tableDecode = dt+1; + U32 const maxSV1 = maxSymbolValue + 1; + U32 const tableSize = 1 << tableLog; + + U16* symbolNext = (U16*)wksp; + BYTE* spread = (BYTE*)(symbolNext + MaxSeq + 1); + U32 highThreshold = tableSize - 1; + + + /* Sanity Checks */ + assert(maxSymbolValue <= MaxSeq); + assert(tableLog <= MaxFSELog); + assert(wkspSize >= ZSTD_BUILD_FSE_TABLE_WKSP_SIZE); + (void)wkspSize; + /* Init, lay down lowprob symbols */ + { ZSTD_seqSymbol_header DTableH; + DTableH.tableLog = tableLog; + DTableH.fastMode = 1; + { S16 const largeLimit= (S16)(1 << (tableLog-1)); + U32 s; + for (s=0; s= largeLimit) DTableH.fastMode=0; + assert(normalizedCounter[s]>=0); + symbolNext[s] = (U16)normalizedCounter[s]; + } } } + ZSTD_memcpy(dt, &DTableH, sizeof(DTableH)); + } + + /* Spread symbols */ + assert(tableSize <= 512); + /* Specialized symbol spreading for the case when there are + * no low probability (-1 count) symbols. When compressing + * small blocks we avoid low probability symbols to hit this + * case, since header decoding speed matters more. + */ + if (highThreshold == tableSize - 1) { + size_t const tableMask = tableSize-1; + size_t const step = FSE_TABLESTEP(tableSize); + /* First lay down the symbols in order. + * We use a uint64_t to lay down 8 bytes at a time. This reduces branch + * misses since small blocks generally have small table logs, so nearly + * all symbols have counts <= 8. We ensure we have 8 bytes at the end of + * our buffer to handle the over-write. + */ + { + U64 const add = 0x0101010101010101ull; + size_t pos = 0; + U64 sv = 0; + U32 s; + for (s=0; s=0); + pos += (size_t)n; + } + } + /* Now we spread those positions across the table. + * The benefit of doing it in two stages is that we avoid the + * variable size inner loop, which caused lots of branch misses. + * Now we can run through all the positions without any branch misses. + * We unroll the loop twice, since that is what empirically worked best. + */ + { + size_t position = 0; + size_t s; + size_t const unroll = 2; + assert(tableSize % unroll == 0); /* FSE_MIN_TABLELOG is 5 */ + for (s = 0; s < (size_t)tableSize; s += unroll) { + size_t u; + for (u = 0; u < unroll; ++u) { + size_t const uPosition = (position + (u * step)) & tableMask; + tableDecode[uPosition].baseValue = spread[s + u]; + } + position = (position + (unroll * step)) & tableMask; + } + assert(position == 0); + } + } else { + U32 const tableMask = tableSize-1; + U32 const step = FSE_TABLESTEP(tableSize); + U32 s, position = 0; + for (s=0; s highThreshold)) position = (position + step) & tableMask; /* lowprob area */ + } } + assert(position == 0); /* position must reach all cells once, otherwise normalizedCounter is incorrect */ + } + + /* Build Decoding table */ + { + U32 u; + for (u=0; u max, corruption_detected, ""); + { U32 const symbol = *(const BYTE*)src; + U32 const baseline = baseValue[symbol]; + U8 const nbBits = nbAdditionalBits[symbol]; + ZSTD_buildSeqTable_rle(DTableSpace, baseline, nbBits); + } + *DTablePtr = DTableSpace; + return 1; + case set_basic : + *DTablePtr = defaultTable; + return 0; + case set_repeat: + RETURN_ERROR_IF(!flagRepeatTable, corruption_detected, ""); + /* prefetch FSE table if used */ + if (ddictIsCold && (nbSeq > 24 /* heuristic */)) { + const void* const pStart = *DTablePtr; + size_t const pSize = sizeof(ZSTD_seqSymbol) * (SEQSYMBOL_TABLE_SIZE(maxLog)); + PREFETCH_AREA(pStart, pSize); + } + return 0; + case set_compressed : + { unsigned tableLog; + S16 norm[MaxSeq+1]; + size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize); + RETURN_ERROR_IF(FSE_isError(headerSize), corruption_detected, ""); + RETURN_ERROR_IF(tableLog > maxLog, corruption_detected, ""); + ZSTD_buildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog, wksp, wkspSize, bmi2); + *DTablePtr = DTableSpace; + return headerSize; + } + default : + assert(0); + RETURN_ERROR(GENERIC, "impossible"); + } +} + +size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, + const void* src, size_t srcSize) +{ + const BYTE* const istart = (const BYTE*)src; + const BYTE* const iend = istart + srcSize; + const BYTE* ip = istart; + int nbSeq; + DEBUGLOG(5, "ZSTD_decodeSeqHeaders"); + + /* check */ + RETURN_ERROR_IF(srcSize < MIN_SEQUENCES_SIZE, srcSize_wrong, ""); + + /* SeqHead */ + nbSeq = *ip++; + if (!nbSeq) { + *nbSeqPtr=0; + RETURN_ERROR_IF(srcSize != 1, srcSize_wrong, ""); + return 1; + } + if (nbSeq > 0x7F) { + if (nbSeq == 0xFF) { + RETURN_ERROR_IF(ip+2 > iend, srcSize_wrong, ""); + nbSeq = MEM_readLE16(ip) + LONGNBSEQ; + ip+=2; + } else { + RETURN_ERROR_IF(ip >= iend, srcSize_wrong, ""); + nbSeq = ((nbSeq-0x80)<<8) + *ip++; + } + } + *nbSeqPtr = nbSeq; + + /* FSE table descriptors */ + RETURN_ERROR_IF(ip+1 > iend, srcSize_wrong, ""); /* minimum possible size: 1 byte for symbol encoding types */ + { symbolEncodingType_e const LLtype = (symbolEncodingType_e)(*ip >> 6); + symbolEncodingType_e const OFtype = (symbolEncodingType_e)((*ip >> 4) & 3); + symbolEncodingType_e const MLtype = (symbolEncodingType_e)((*ip >> 2) & 3); + ip++; + + /* Build DTables */ + { size_t const llhSize = ZSTD_buildSeqTable(dctx->entropy.LLTable, &dctx->LLTptr, + LLtype, MaxLL, LLFSELog, + ip, iend-ip, + LL_base, LL_bits, + LL_defaultDTable, dctx->fseEntropy, + dctx->ddictIsCold, nbSeq, + dctx->workspace, sizeof(dctx->workspace), + ZSTD_DCtx_get_bmi2(dctx)); + RETURN_ERROR_IF(ZSTD_isError(llhSize), corruption_detected, "ZSTD_buildSeqTable failed"); + ip += llhSize; + } + + { size_t const ofhSize = ZSTD_buildSeqTable(dctx->entropy.OFTable, &dctx->OFTptr, + OFtype, MaxOff, OffFSELog, + ip, iend-ip, + OF_base, OF_bits, + OF_defaultDTable, dctx->fseEntropy, + dctx->ddictIsCold, nbSeq, + dctx->workspace, sizeof(dctx->workspace), + ZSTD_DCtx_get_bmi2(dctx)); + RETURN_ERROR_IF(ZSTD_isError(ofhSize), corruption_detected, "ZSTD_buildSeqTable failed"); + ip += ofhSize; + } + + { size_t const mlhSize = ZSTD_buildSeqTable(dctx->entropy.MLTable, &dctx->MLTptr, + MLtype, MaxML, MLFSELog, + ip, iend-ip, + ML_base, ML_bits, + ML_defaultDTable, dctx->fseEntropy, + dctx->ddictIsCold, nbSeq, + dctx->workspace, sizeof(dctx->workspace), + ZSTD_DCtx_get_bmi2(dctx)); + RETURN_ERROR_IF(ZSTD_isError(mlhSize), corruption_detected, "ZSTD_buildSeqTable failed"); + ip += mlhSize; + } + } + + return ip-istart; +} + + +typedef struct { + size_t litLength; + size_t matchLength; + size_t offset; +} seq_t; + +typedef struct { + size_t state; + const ZSTD_seqSymbol* table; +} ZSTD_fseState; + +typedef struct { + BIT_DStream_t DStream; + ZSTD_fseState stateLL; + ZSTD_fseState stateOffb; + ZSTD_fseState stateML; + size_t prevOffset[ZSTD_REP_NUM]; +} seqState_t; + +/*! ZSTD_overlapCopy8() : + * Copies 8 bytes from ip to op and updates op and ip where ip <= op. + * If the offset is < 8 then the offset is spread to at least 8 bytes. + * + * Precondition: *ip <= *op + * Postcondition: *op - *op >= 8 + */ +HINT_INLINE void ZSTD_overlapCopy8(BYTE** op, BYTE const** ip, size_t offset) { + assert(*ip <= *op); + if (offset < 8) { + /* close range match, overlap */ + static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */ + static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */ + int const sub2 = dec64table[offset]; + (*op)[0] = (*ip)[0]; + (*op)[1] = (*ip)[1]; + (*op)[2] = (*ip)[2]; + (*op)[3] = (*ip)[3]; + *ip += dec32table[offset]; + ZSTD_copy4(*op+4, *ip); + *ip -= sub2; + } else { + ZSTD_copy8(*op, *ip); + } + *ip += 8; + *op += 8; + assert(*op - *ip >= 8); +} + +/*! ZSTD_safecopy() : + * Specialized version of memcpy() that is allowed to READ up to WILDCOPY_OVERLENGTH past the input buffer + * and write up to 16 bytes past oend_w (op >= oend_w is allowed). + * This function is only called in the uncommon case where the sequence is near the end of the block. It + * should be fast for a single long sequence, but can be slow for several short sequences. + * + * @param ovtype controls the overlap detection + * - ZSTD_no_overlap: The source and destination are guaranteed to be at least WILDCOPY_VECLEN bytes apart. + * - ZSTD_overlap_src_before_dst: The src and dst may overlap and may be any distance apart. + * The src buffer must be before the dst buffer. + */ +static void ZSTD_safecopy(BYTE* op, const BYTE* const oend_w, BYTE const* ip, ptrdiff_t length, ZSTD_overlap_e ovtype) { + ptrdiff_t const diff = op - ip; + BYTE* const oend = op + length; + + assert((ovtype == ZSTD_no_overlap && (diff <= -8 || diff >= 8 || op >= oend_w)) || + (ovtype == ZSTD_overlap_src_before_dst && diff >= 0)); + + if (length < 8) { + /* Handle short lengths. */ + while (op < oend) *op++ = *ip++; + return; + } + if (ovtype == ZSTD_overlap_src_before_dst) { + /* Copy 8 bytes and ensure the offset >= 8 when there can be overlap. */ + assert(length >= 8); + ZSTD_overlapCopy8(&op, &ip, diff); + length -= 8; + assert(op - ip >= 8); + assert(op <= oend); + } + + if (oend <= oend_w) { + /* No risk of overwrite. */ + ZSTD_wildcopy(op, ip, length, ovtype); + return; + } + if (op <= oend_w) { + /* Wildcopy until we get close to the end. */ + assert(oend > oend_w); + ZSTD_wildcopy(op, ip, oend_w - op, ovtype); + ip += oend_w - op; + op += oend_w - op; + } + /* Handle the leftovers. */ + while (op < oend) *op++ = *ip++; +} + +/* ZSTD_safecopyDstBeforeSrc(): + * This version allows overlap with dst before src, or handles the non-overlap case with dst after src + * Kept separate from more common ZSTD_safecopy case to avoid performance impact to the safecopy common case */ +static void ZSTD_safecopyDstBeforeSrc(BYTE* op, BYTE const* ip, ptrdiff_t length) { + ptrdiff_t const diff = op - ip; + BYTE* const oend = op + length; + + if (length < 8 || diff > -8) { + /* Handle short lengths, close overlaps, and dst not before src. */ + while (op < oend) *op++ = *ip++; + return; + } + + if (op <= oend - WILDCOPY_OVERLENGTH && diff < -WILDCOPY_VECLEN) { + ZSTD_wildcopy(op, ip, oend - WILDCOPY_OVERLENGTH - op, ZSTD_no_overlap); + ip += oend - WILDCOPY_OVERLENGTH - op; + op += oend - WILDCOPY_OVERLENGTH - op; + } + + /* Handle the leftovers. */ + while (op < oend) *op++ = *ip++; +} + +/* ZSTD_execSequenceEnd(): + * This version handles cases that are near the end of the output buffer. It requires + * more careful checks to make sure there is no overflow. By separating out these hard + * and unlikely cases, we can speed up the common cases. + * + * NOTE: This function needs to be fast for a single long sequence, but doesn't need + * to be optimized for many small sequences, since those fall into ZSTD_execSequence(). + */ +FORCE_NOINLINE +size_t ZSTD_execSequenceEnd(BYTE* op, + BYTE* const oend, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) +{ + BYTE* const oLitEnd = op + sequence.litLength; + size_t const sequenceLength = sequence.litLength + sequence.matchLength; + const BYTE* const iLitEnd = *litPtr + sequence.litLength; + const BYTE* match = oLitEnd - sequence.offset; + BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH; + + /* bounds checks : careful of address space overflow in 32-bit mode */ + RETURN_ERROR_IF(sequenceLength > (size_t)(oend - op), dstSize_tooSmall, "last match must fit within dstBuffer"); + RETURN_ERROR_IF(sequence.litLength > (size_t)(litLimit - *litPtr), corruption_detected, "try to read beyond literal buffer"); + assert(op < op + sequenceLength); + assert(oLitEnd < op + sequenceLength); + + /* copy literals */ + ZSTD_safecopy(op, oend_w, *litPtr, sequence.litLength, ZSTD_no_overlap); + op = oLitEnd; + *litPtr = iLitEnd; + + /* copy Match */ + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { + /* offset beyond prefix */ + RETURN_ERROR_IF(sequence.offset > (size_t)(oLitEnd - virtualStart), corruption_detected, ""); + match = dictEnd - (prefixStart - match); + if (match + sequence.matchLength <= dictEnd) { + ZSTD_memmove(oLitEnd, match, sequence.matchLength); + return sequenceLength; + } + /* span extDict & currentPrefixSegment */ + { size_t const length1 = dictEnd - match; + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } + } + ZSTD_safecopy(op, oend_w, match, sequence.matchLength, ZSTD_overlap_src_before_dst); + return sequenceLength; +} + +/* ZSTD_execSequenceEndSplitLitBuffer(): + * This version is intended to be used during instances where the litBuffer is still split. It is kept separate to avoid performance impact for the good case. + */ +FORCE_NOINLINE +size_t ZSTD_execSequenceEndSplitLitBuffer(BYTE* op, + BYTE* const oend, const BYTE* const oend_w, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) +{ + BYTE* const oLitEnd = op + sequence.litLength; + size_t const sequenceLength = sequence.litLength + sequence.matchLength; + const BYTE* const iLitEnd = *litPtr + sequence.litLength; + const BYTE* match = oLitEnd - sequence.offset; + + + /* bounds checks : careful of address space overflow in 32-bit mode */ + RETURN_ERROR_IF(sequenceLength > (size_t)(oend - op), dstSize_tooSmall, "last match must fit within dstBuffer"); + RETURN_ERROR_IF(sequence.litLength > (size_t)(litLimit - *litPtr), corruption_detected, "try to read beyond literal buffer"); + assert(op < op + sequenceLength); + assert(oLitEnd < op + sequenceLength); + + /* copy literals */ + RETURN_ERROR_IF(op > *litPtr && op < *litPtr + sequence.litLength, dstSize_tooSmall, "output should not catch up to and overwrite literal buffer"); + ZSTD_safecopyDstBeforeSrc(op, *litPtr, sequence.litLength); + op = oLitEnd; + *litPtr = iLitEnd; + + /* copy Match */ + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { + /* offset beyond prefix */ + RETURN_ERROR_IF(sequence.offset > (size_t)(oLitEnd - virtualStart), corruption_detected, ""); + match = dictEnd - (prefixStart - match); + if (match + sequence.matchLength <= dictEnd) { + ZSTD_memmove(oLitEnd, match, sequence.matchLength); + return sequenceLength; + } + /* span extDict & currentPrefixSegment */ + { size_t const length1 = dictEnd - match; + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } + } + ZSTD_safecopy(op, oend_w, match, sequence.matchLength, ZSTD_overlap_src_before_dst); + return sequenceLength; +} + +HINT_INLINE +size_t ZSTD_execSequence(BYTE* op, + BYTE* const oend, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) +{ + BYTE* const oLitEnd = op + sequence.litLength; + size_t const sequenceLength = sequence.litLength + sequence.matchLength; + BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */ + BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH; /* risk : address space underflow on oend=NULL */ + const BYTE* const iLitEnd = *litPtr + sequence.litLength; + const BYTE* match = oLitEnd - sequence.offset; + + assert(op != NULL /* Precondition */); + assert(oend_w < oend /* No underflow */); + +#if defined(__aarch64__) + /* prefetch sequence starting from match that will be used for copy later */ + PREFETCH_L1(match); +#endif + /* Handle edge cases in a slow path: + * - Read beyond end of literals + * - Match end is within WILDCOPY_OVERLIMIT of oend + * - 32-bit mode and the match length overflows + */ + if (UNLIKELY( + iLitEnd > litLimit || + oMatchEnd > oend_w || + (MEM_32bits() && (size_t)(oend - op) < sequenceLength + WILDCOPY_OVERLENGTH))) + return ZSTD_execSequenceEnd(op, oend, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd); + + /* Assumptions (everything else goes into ZSTD_execSequenceEnd()) */ + assert(op <= oLitEnd /* No overflow */); + assert(oLitEnd < oMatchEnd /* Non-zero match & no overflow */); + assert(oMatchEnd <= oend /* No underflow */); + assert(iLitEnd <= litLimit /* Literal length is in bounds */); + assert(oLitEnd <= oend_w /* Can wildcopy literals */); + assert(oMatchEnd <= oend_w /* Can wildcopy matches */); + + /* Copy Literals: + * Split out litLength <= 16 since it is nearly always true. +1.6% on gcc-9. + * We likely don't need the full 32-byte wildcopy. + */ + assert(WILDCOPY_OVERLENGTH >= 16); + ZSTD_copy16(op, (*litPtr)); + if (UNLIKELY(sequence.litLength > 16)) { + ZSTD_wildcopy(op + 16, (*litPtr) + 16, sequence.litLength - 16, ZSTD_no_overlap); + } + op = oLitEnd; + *litPtr = iLitEnd; /* update for next sequence */ + + /* Copy Match */ + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { + /* offset beyond prefix -> go into extDict */ + RETURN_ERROR_IF(UNLIKELY(sequence.offset > (size_t)(oLitEnd - virtualStart)), corruption_detected, ""); + match = dictEnd + (match - prefixStart); + if (match + sequence.matchLength <= dictEnd) { + ZSTD_memmove(oLitEnd, match, sequence.matchLength); + return sequenceLength; + } + /* span extDict & currentPrefixSegment */ + { size_t const length1 = dictEnd - match; + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } + } + /* Match within prefix of 1 or more bytes */ + assert(op <= oMatchEnd); + assert(oMatchEnd <= oend_w); + assert(match >= prefixStart); + assert(sequence.matchLength >= 1); + + /* Nearly all offsets are >= WILDCOPY_VECLEN bytes, which means we can use wildcopy + * without overlap checking. + */ + if (LIKELY(sequence.offset >= WILDCOPY_VECLEN)) { + /* We bet on a full wildcopy for matches, since we expect matches to be + * longer than literals (in general). In silesia, ~10% of matches are longer + * than 16 bytes. + */ + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength, ZSTD_no_overlap); + return sequenceLength; + } + assert(sequence.offset < WILDCOPY_VECLEN); + + /* Copy 8 bytes and spread the offset to be >= 8. */ + ZSTD_overlapCopy8(&op, &match, sequence.offset); + + /* If the match length is > 8 bytes, then continue with the wildcopy. */ + if (sequence.matchLength > 8) { + assert(op < oMatchEnd); + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8, ZSTD_overlap_src_before_dst); + } + return sequenceLength; +} + +HINT_INLINE +size_t ZSTD_execSequenceSplitLitBuffer(BYTE* op, + BYTE* const oend, const BYTE* const oend_w, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) +{ + BYTE* const oLitEnd = op + sequence.litLength; + size_t const sequenceLength = sequence.litLength + sequence.matchLength; + BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */ + const BYTE* const iLitEnd = *litPtr + sequence.litLength; + const BYTE* match = oLitEnd - sequence.offset; + + assert(op != NULL /* Precondition */); + assert(oend_w < oend /* No underflow */); + /* Handle edge cases in a slow path: + * - Read beyond end of literals + * - Match end is within WILDCOPY_OVERLIMIT of oend + * - 32-bit mode and the match length overflows + */ + if (UNLIKELY( + iLitEnd > litLimit || + oMatchEnd > oend_w || + (MEM_32bits() && (size_t)(oend - op) < sequenceLength + WILDCOPY_OVERLENGTH))) + return ZSTD_execSequenceEndSplitLitBuffer(op, oend, oend_w, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd); + + /* Assumptions (everything else goes into ZSTD_execSequenceEnd()) */ + assert(op <= oLitEnd /* No overflow */); + assert(oLitEnd < oMatchEnd /* Non-zero match & no overflow */); + assert(oMatchEnd <= oend /* No underflow */); + assert(iLitEnd <= litLimit /* Literal length is in bounds */); + assert(oLitEnd <= oend_w /* Can wildcopy literals */); + assert(oMatchEnd <= oend_w /* Can wildcopy matches */); + + /* Copy Literals: + * Split out litLength <= 16 since it is nearly always true. +1.6% on gcc-9. + * We likely don't need the full 32-byte wildcopy. + */ + assert(WILDCOPY_OVERLENGTH >= 16); + ZSTD_copy16(op, (*litPtr)); + if (UNLIKELY(sequence.litLength > 16)) { + ZSTD_wildcopy(op+16, (*litPtr)+16, sequence.litLength-16, ZSTD_no_overlap); + } + op = oLitEnd; + *litPtr = iLitEnd; /* update for next sequence */ + + /* Copy Match */ + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { + /* offset beyond prefix -> go into extDict */ + RETURN_ERROR_IF(UNLIKELY(sequence.offset > (size_t)(oLitEnd - virtualStart)), corruption_detected, ""); + match = dictEnd + (match - prefixStart); + if (match + sequence.matchLength <= dictEnd) { + ZSTD_memmove(oLitEnd, match, sequence.matchLength); + return sequenceLength; + } + /* span extDict & currentPrefixSegment */ + { size_t const length1 = dictEnd - match; + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } } + /* Match within prefix of 1 or more bytes */ + assert(op <= oMatchEnd); + assert(oMatchEnd <= oend_w); + assert(match >= prefixStart); + assert(sequence.matchLength >= 1); + + /* Nearly all offsets are >= WILDCOPY_VECLEN bytes, which means we can use wildcopy + * without overlap checking. + */ + if (LIKELY(sequence.offset >= WILDCOPY_VECLEN)) { + /* We bet on a full wildcopy for matches, since we expect matches to be + * longer than literals (in general). In silesia, ~10% of matches are longer + * than 16 bytes. + */ + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength, ZSTD_no_overlap); + return sequenceLength; + } + assert(sequence.offset < WILDCOPY_VECLEN); + + /* Copy 8 bytes and spread the offset to be >= 8. */ + ZSTD_overlapCopy8(&op, &match, sequence.offset); + + /* If the match length is > 8 bytes, then continue with the wildcopy. */ + if (sequence.matchLength > 8) { + assert(op < oMatchEnd); + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8, ZSTD_overlap_src_before_dst); + } + return sequenceLength; +} + + +static void +ZSTD_initFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, const ZSTD_seqSymbol* dt) +{ + const void* ptr = dt; + const ZSTD_seqSymbol_header* const DTableH = (const ZSTD_seqSymbol_header*)ptr; + DStatePtr->state = BIT_readBits(bitD, DTableH->tableLog); + DEBUGLOG(6, "ZSTD_initFseState : val=%u using %u bits", + (U32)DStatePtr->state, DTableH->tableLog); + BIT_reloadDStream(bitD); + DStatePtr->table = dt + 1; +} + +FORCE_INLINE_TEMPLATE void +ZSTD_updateFseStateWithDInfo(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, U16 nextState, U32 nbBits) +{ + size_t const lowBits = BIT_readBits(bitD, nbBits); + DStatePtr->state = nextState + lowBits; +} + +/* We need to add at most (ZSTD_WINDOWLOG_MAX_32 - 1) bits to read the maximum + * offset bits. But we can only read at most STREAM_ACCUMULATOR_MIN_32 + * bits before reloading. This value is the maximum number of bytes we read + * after reloading when we are decoding long offsets. + */ +#define LONG_OFFSETS_MAX_EXTRA_BITS_32 \ + (ZSTD_WINDOWLOG_MAX_32 > STREAM_ACCUMULATOR_MIN_32 \ + ? ZSTD_WINDOWLOG_MAX_32 - STREAM_ACCUMULATOR_MIN_32 \ + : 0) + +typedef enum { ZSTD_lo_isRegularOffset, ZSTD_lo_isLongOffset=1 } ZSTD_longOffset_e; + +FORCE_INLINE_TEMPLATE seq_t +ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets) +{ + seq_t seq; + /* + * ZSTD_seqSymbol is a structure with a total of 64 bits wide. So it can be + * loaded in one operation and extracted its fields by simply shifting or + * bit-extracting on aarch64. + * GCC doesn't recognize this and generates more unnecessary ldr/ldrb/ldrh + * operations that cause performance drop. This can be avoided by using this + * ZSTD_memcpy hack. + */ +#if defined(__aarch64__) && (defined(__GNUC__) && !defined(__clang__)) + ZSTD_seqSymbol llDInfoS, mlDInfoS, ofDInfoS; + ZSTD_seqSymbol* const llDInfo = &llDInfoS; + ZSTD_seqSymbol* const mlDInfo = &mlDInfoS; + ZSTD_seqSymbol* const ofDInfo = &ofDInfoS; + ZSTD_memcpy(llDInfo, seqState->stateLL.table + seqState->stateLL.state, sizeof(ZSTD_seqSymbol)); + ZSTD_memcpy(mlDInfo, seqState->stateML.table + seqState->stateML.state, sizeof(ZSTD_seqSymbol)); + ZSTD_memcpy(ofDInfo, seqState->stateOffb.table + seqState->stateOffb.state, sizeof(ZSTD_seqSymbol)); +#else + const ZSTD_seqSymbol* const llDInfo = seqState->stateLL.table + seqState->stateLL.state; + const ZSTD_seqSymbol* const mlDInfo = seqState->stateML.table + seqState->stateML.state; + const ZSTD_seqSymbol* const ofDInfo = seqState->stateOffb.table + seqState->stateOffb.state; +#endif + seq.matchLength = mlDInfo->baseValue; + seq.litLength = llDInfo->baseValue; + { U32 const ofBase = ofDInfo->baseValue; + BYTE const llBits = llDInfo->nbAdditionalBits; + BYTE const mlBits = mlDInfo->nbAdditionalBits; + BYTE const ofBits = ofDInfo->nbAdditionalBits; + BYTE const totalBits = llBits+mlBits+ofBits; + + U16 const llNext = llDInfo->nextState; + U16 const mlNext = mlDInfo->nextState; + U16 const ofNext = ofDInfo->nextState; + U32 const llnbBits = llDInfo->nbBits; + U32 const mlnbBits = mlDInfo->nbBits; + U32 const ofnbBits = ofDInfo->nbBits; + + assert(llBits <= MaxLLBits); + assert(mlBits <= MaxMLBits); + assert(ofBits <= MaxOff); + /* + * As gcc has better branch and block analyzers, sometimes it is only + * valuable to mark likeliness for clang, it gives around 3-4% of + * performance. + */ + + /* sequence */ + { size_t offset; + if (ofBits > 1) { + ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1); + ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5); + ZSTD_STATIC_ASSERT(STREAM_ACCUMULATOR_MIN_32 > LONG_OFFSETS_MAX_EXTRA_BITS_32); + ZSTD_STATIC_ASSERT(STREAM_ACCUMULATOR_MIN_32 - LONG_OFFSETS_MAX_EXTRA_BITS_32 >= MaxMLBits); + if (MEM_32bits() && longOffsets && (ofBits >= STREAM_ACCUMULATOR_MIN_32)) { + /* Always read extra bits, this keeps the logic simple, + * avoids branches, and avoids accidentally reading 0 bits. + */ + U32 const extraBits = LONG_OFFSETS_MAX_EXTRA_BITS_32; + offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits); + BIT_reloadDStream(&seqState->DStream); + offset += BIT_readBitsFast(&seqState->DStream, extraBits); + } else { + offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */ + if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); + } + seqState->prevOffset[2] = seqState->prevOffset[1]; + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset; + } else { + U32 const ll0 = (llDInfo->baseValue == 0); + if (LIKELY((ofBits == 0))) { + offset = seqState->prevOffset[ll0]; + seqState->prevOffset[1] = seqState->prevOffset[!ll0]; + seqState->prevOffset[0] = offset; + } else { + offset = ofBase + ll0 + BIT_readBitsFast(&seqState->DStream, 1); + { size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset]; + temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */ + if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1]; + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset = temp; + } } } + seq.offset = offset; + } + + if (mlBits > 0) + seq.matchLength += BIT_readBitsFast(&seqState->DStream, mlBits/*>0*/); + + if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32)) + BIT_reloadDStream(&seqState->DStream); + if (MEM_64bits() && UNLIKELY(totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog))) + BIT_reloadDStream(&seqState->DStream); + /* Ensure there are enough bits to read the rest of data in 64-bit mode. */ + ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64); + + if (llBits > 0) + seq.litLength += BIT_readBitsFast(&seqState->DStream, llBits/*>0*/); + + if (MEM_32bits()) + BIT_reloadDStream(&seqState->DStream); + + DEBUGLOG(6, "seq: litL=%u, matchL=%u, offset=%u", + (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset); + + ZSTD_updateFseStateWithDInfo(&seqState->stateLL, &seqState->DStream, llNext, llnbBits); /* <= 9 bits */ + ZSTD_updateFseStateWithDInfo(&seqState->stateML, &seqState->DStream, mlNext, mlnbBits); /* <= 9 bits */ + if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */ + ZSTD_updateFseStateWithDInfo(&seqState->stateOffb, &seqState->DStream, ofNext, ofnbBits); /* <= 8 bits */ + } + + return seq; +} + +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +MEM_STATIC int ZSTD_dictionaryIsActive(ZSTD_DCtx const* dctx, BYTE const* prefixStart, BYTE const* oLitEnd) +{ + size_t const windowSize = dctx->fParams.windowSize; + /* No dictionary used. */ + if (dctx->dictContentEndForFuzzing == NULL) return 0; + /* Dictionary is our prefix. */ + if (prefixStart == dctx->dictContentBeginForFuzzing) return 1; + /* Dictionary is not our ext-dict. */ + if (dctx->dictEnd != dctx->dictContentEndForFuzzing) return 0; + /* Dictionary is not within our window size. */ + if ((size_t)(oLitEnd - prefixStart) >= windowSize) return 0; + /* Dictionary is active. */ + return 1; +} + +MEM_STATIC void ZSTD_assertValidSequence( + ZSTD_DCtx const* dctx, + BYTE const* op, BYTE const* oend, + seq_t const seq, + BYTE const* prefixStart, BYTE const* virtualStart) +{ +#if DEBUGLEVEL >= 1 + size_t const windowSize = dctx->fParams.windowSize; + size_t const sequenceSize = seq.litLength + seq.matchLength; + BYTE const* const oLitEnd = op + seq.litLength; + DEBUGLOG(6, "Checking sequence: litL=%u matchL=%u offset=%u", + (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset); + assert(op <= oend); + assert((size_t)(oend - op) >= sequenceSize); + assert(sequenceSize <= ZSTD_BLOCKSIZE_MAX); + if (ZSTD_dictionaryIsActive(dctx, prefixStart, oLitEnd)) { + size_t const dictSize = (size_t)((char const*)dctx->dictContentEndForFuzzing - (char const*)dctx->dictContentBeginForFuzzing); + /* Offset must be within the dictionary. */ + assert(seq.offset <= (size_t)(oLitEnd - virtualStart)); + assert(seq.offset <= windowSize + dictSize); + } else { + /* Offset must be within our window. */ + assert(seq.offset <= windowSize); + } +#else + (void)dctx, (void)op, (void)oend, (void)seq, (void)prefixStart, (void)virtualStart; +#endif +} +#endif + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG + + +FORCE_INLINE_TEMPLATE size_t +DONT_VECTORIZE +ZSTD_decompressSequences_bodySplitLitBuffer( ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + const BYTE* ip = (const BYTE*)seqStart; + const BYTE* const iend = ip + seqSize; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = ostart + maxDstSize; + BYTE* op = ostart; + const BYTE* litPtr = dctx->litPtr; + const BYTE* litBufferEnd = dctx->litBufferEnd; + const BYTE* const prefixStart = (const BYTE*) (dctx->prefixStart); + const BYTE* const vBase = (const BYTE*) (dctx->virtualStart); + const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd); + DEBUGLOG(5, "ZSTD_decompressSequences_bodySplitLitBuffer"); + (void)frame; + + /* Regen sequences */ + if (nbSeq) { + seqState_t seqState; + dctx->fseEntropy = 1; + { U32 i; for (i=0; ientropy.rep[i]; } + RETURN_ERROR_IF( + ERR_isError(BIT_initDStream(&seqState.DStream, ip, iend-ip)), + corruption_detected, ""); + ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr); + ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr); + ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr); + assert(dst != NULL); + + ZSTD_STATIC_ASSERT( + BIT_DStream_unfinished < BIT_DStream_completed && + BIT_DStream_endOfBuffer < BIT_DStream_completed && + BIT_DStream_completed < BIT_DStream_overflow); + + /* decompress without overrunning litPtr begins */ + { + seq_t sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + /* Align the decompression loop to 32 + 16 bytes. + * + * zstd compiled with gcc-9 on an Intel i9-9900k shows 10% decompression + * speed swings based on the alignment of the decompression loop. This + * performance swing is caused by parts of the decompression loop falling + * out of the DSB. The entire decompression loop should fit in the DSB, + * when it can't we get much worse performance. You can measure if you've + * hit the good case or the bad case with this perf command for some + * compressed file test.zst: + * + * perf stat -e cycles -e instructions -e idq.all_dsb_cycles_any_uops \ + * -e idq.all_mite_cycles_any_uops -- ./zstd -tq test.zst + * + * If you see most cycles served out of the MITE you've hit the bad case. + * If you see most cycles served out of the DSB you've hit the good case. + * If it is pretty even then you may be in an okay case. + * + * This issue has been reproduced on the following CPUs: + * - Kabylake: Macbook Pro (15-inch, 2019) 2.4 GHz Intel Core i9 + * Use Instruments->Counters to get DSB/MITE cycles. + * I never got performance swings, but I was able to + * go from the good case of mostly DSB to half of the + * cycles served from MITE. + * - Coffeelake: Intel i9-9900k + * - Coffeelake: Intel i7-9700k + * + * I haven't been able to reproduce the instability or DSB misses on any + * of the following CPUS: + * - Haswell + * - Broadwell: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GH + * - Skylake + * + * Alignment is done for each of the three major decompression loops: + * - ZSTD_decompressSequences_bodySplitLitBuffer - presplit section of the literal buffer + * - ZSTD_decompressSequences_bodySplitLitBuffer - postsplit section of the literal buffer + * - ZSTD_decompressSequences_body + * Alignment choices are made to minimize large swings on bad cases and influence on performance + * from changes external to this code, rather than to overoptimize on the current commit. + * + * If you are seeing performance stability this script can help test. + * It tests on 4 commits in zstd where I saw performance change. + * + * https://gist.github.com/terrelln/9889fc06a423fd5ca6e99351564473f4 + */ +#if defined(__GNUC__) && defined(__x86_64__) + __asm__(".p2align 6"); +# if __GNUC__ >= 7 + /* good for gcc-7, gcc-9, and gcc-11 */ + __asm__("nop"); + __asm__(".p2align 5"); + __asm__("nop"); + __asm__(".p2align 4"); +# if __GNUC__ == 8 || __GNUC__ == 10 + /* good for gcc-8 and gcc-10 */ + __asm__("nop"); + __asm__(".p2align 3"); +# endif +# endif +#endif + + /* Handle the initial state where litBuffer is currently split between dst and litExtraBuffer */ + for (; litPtr + sequence.litLength <= dctx->litBufferEnd; ) { + size_t const oneSeqSize = ZSTD_execSequenceSplitLitBuffer(op, oend, litPtr + sequence.litLength - WILDCOPY_OVERLENGTH, sequence, &litPtr, litBufferEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (UNLIKELY(!--nbSeq)) + break; + BIT_reloadDStream(&(seqState.DStream)); + sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + } + + /* If there are more sequences, they will need to read literals from litExtraBuffer; copy over the remainder from dst and update litPtr and litEnd */ + if (nbSeq > 0) { + const size_t leftoverLit = dctx->litBufferEnd - litPtr; + if (leftoverLit) + { + RETURN_ERROR_IF(leftoverLit > (size_t)(oend - op), dstSize_tooSmall, "remaining lit must fit within dstBuffer"); + ZSTD_safecopyDstBeforeSrc(op, litPtr, leftoverLit); + sequence.litLength -= leftoverLit; + op += leftoverLit; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + { + size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litBufferEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (--nbSeq) + BIT_reloadDStream(&(seqState.DStream)); + } + } + } + + if (nbSeq > 0) /* there is remaining lit from extra buffer */ + { + +#if defined(__GNUC__) && defined(__x86_64__) + __asm__(".p2align 6"); + __asm__("nop"); +# if __GNUC__ != 7 + /* worse for gcc-7 better for gcc-8, gcc-9, and gcc-10 and clang */ + __asm__(".p2align 4"); + __asm__("nop"); + __asm__(".p2align 3"); +# elif __GNUC__ >= 11 + __asm__(".p2align 3"); +# else + __asm__(".p2align 5"); + __asm__("nop"); + __asm__(".p2align 3"); +# endif +#endif + + for (; ; ) { + seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litBufferEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (UNLIKELY(!--nbSeq)) + break; + BIT_reloadDStream(&(seqState.DStream)); + } + } + + /* check if reached exact end */ + DEBUGLOG(5, "ZSTD_decompressSequences_bodySplitLitBuffer: after decode loop, remaining nbSeq : %i", nbSeq); + RETURN_ERROR_IF(nbSeq, corruption_detected, ""); + RETURN_ERROR_IF(BIT_reloadDStream(&seqState.DStream) < BIT_DStream_completed, corruption_detected, ""); + /* save reps for next block */ + { U32 i; for (i=0; ientropy.rep[i] = (U32)(seqState.prevOffset[i]); } + } + + /* last literal segment */ + if (dctx->litBufferLocation == ZSTD_split) /* split hasn't been reached yet, first get dst then copy litExtraBuffer */ + { + size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend - op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memmove(op, litPtr, lastLLSize); + op += lastLLSize; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + } + { size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memcpy(op, litPtr, lastLLSize); + op += lastLLSize; + } + } + + return op-ostart; +} + +FORCE_INLINE_TEMPLATE size_t +DONT_VECTORIZE +ZSTD_decompressSequences_body(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + const BYTE* ip = (const BYTE*)seqStart; + const BYTE* const iend = ip + seqSize; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = dctx->litBufferLocation == ZSTD_not_in_dst ? ostart + maxDstSize : dctx->litBuffer; + BYTE* op = ostart; + const BYTE* litPtr = dctx->litPtr; + const BYTE* const litEnd = litPtr + dctx->litSize; + const BYTE* const prefixStart = (const BYTE*)(dctx->prefixStart); + const BYTE* const vBase = (const BYTE*)(dctx->virtualStart); + const BYTE* const dictEnd = (const BYTE*)(dctx->dictEnd); + DEBUGLOG(5, "ZSTD_decompressSequences_body: nbSeq = %d", nbSeq); + (void)frame; + + /* Regen sequences */ + if (nbSeq) { + seqState_t seqState; + dctx->fseEntropy = 1; + { U32 i; for (i = 0; i < ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; } + RETURN_ERROR_IF( + ERR_isError(BIT_initDStream(&seqState.DStream, ip, iend - ip)), + corruption_detected, ""); + ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr); + ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr); + ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr); + assert(dst != NULL); + + ZSTD_STATIC_ASSERT( + BIT_DStream_unfinished < BIT_DStream_completed && + BIT_DStream_endOfBuffer < BIT_DStream_completed && + BIT_DStream_completed < BIT_DStream_overflow); + +#if defined(__GNUC__) && defined(__x86_64__) + __asm__(".p2align 6"); + __asm__("nop"); +# if __GNUC__ >= 7 + __asm__(".p2align 5"); + __asm__("nop"); + __asm__(".p2align 3"); +# else + __asm__(".p2align 4"); + __asm__("nop"); + __asm__(".p2align 3"); +# endif +#endif + + for ( ; ; ) { + seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (UNLIKELY(!--nbSeq)) + break; + BIT_reloadDStream(&(seqState.DStream)); + } + + /* check if reached exact end */ + DEBUGLOG(5, "ZSTD_decompressSequences_body: after decode loop, remaining nbSeq : %i", nbSeq); + RETURN_ERROR_IF(nbSeq, corruption_detected, ""); + RETURN_ERROR_IF(BIT_reloadDStream(&seqState.DStream) < BIT_DStream_completed, corruption_detected, ""); + /* save reps for next block */ + { U32 i; for (i=0; ientropy.rep[i] = (U32)(seqState.prevOffset[i]); } + } + + /* last literal segment */ + { size_t const lastLLSize = litEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memcpy(op, litPtr, lastLLSize); + op += lastLLSize; + } + } + + return op-ostart; +} + +static size_t +ZSTD_decompressSequences_default(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} + +static size_t +ZSTD_decompressSequencesSplitLitBuffer_default(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequences_bodySplitLitBuffer(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */ + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT + +FORCE_INLINE_TEMPLATE size_t +ZSTD_prefetchMatch(size_t prefetchPos, seq_t const sequence, + const BYTE* const prefixStart, const BYTE* const dictEnd) +{ + prefetchPos += sequence.litLength; + { const BYTE* const matchBase = (sequence.offset > prefetchPos) ? dictEnd : prefixStart; + const BYTE* const match = matchBase + prefetchPos - sequence.offset; /* note : this operation can overflow when seq.offset is really too large, which can only happen when input is corrupted. + * No consequence though : memory address is only used for prefetching, not for dereferencing */ + PREFETCH_L1(match); PREFETCH_L1(match+CACHELINE_SIZE); /* note : it's safe to invoke PREFETCH() on any memory address, including invalid ones */ + } + return prefetchPos + sequence.matchLength; +} + +/* This decoding function employs prefetching + * to reduce latency impact of cache misses. + * It's generally employed when block contains a significant portion of long-distance matches + * or when coupled with a "cold" dictionary */ +FORCE_INLINE_TEMPLATE size_t +ZSTD_decompressSequencesLong_body( + ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + const BYTE* ip = (const BYTE*)seqStart; + const BYTE* const iend = ip + seqSize; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = dctx->litBufferLocation == ZSTD_in_dst ? dctx->litBuffer : ostart + maxDstSize; + BYTE* op = ostart; + const BYTE* litPtr = dctx->litPtr; + const BYTE* litBufferEnd = dctx->litBufferEnd; + const BYTE* const prefixStart = (const BYTE*) (dctx->prefixStart); + const BYTE* const dictStart = (const BYTE*) (dctx->virtualStart); + const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd); + (void)frame; + + /* Regen sequences */ + if (nbSeq) { +#define STORED_SEQS 8 +#define STORED_SEQS_MASK (STORED_SEQS-1) +#define ADVANCED_SEQS STORED_SEQS + seq_t sequences[STORED_SEQS]; + int const seqAdvance = MIN(nbSeq, ADVANCED_SEQS); + seqState_t seqState; + int seqNb; + size_t prefetchPos = (size_t)(op-prefixStart); /* track position relative to prefixStart */ + + dctx->fseEntropy = 1; + { int i; for (i=0; ientropy.rep[i]; } + assert(dst != NULL); + assert(iend >= ip); + RETURN_ERROR_IF( + ERR_isError(BIT_initDStream(&seqState.DStream, ip, iend-ip)), + corruption_detected, ""); + ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr); + ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr); + ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr); + + /* prepare in advance */ + for (seqNb=0; (BIT_reloadDStream(&seqState.DStream) <= BIT_DStream_completed) && (seqNblitBufferLocation == ZSTD_split && litPtr + sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK].litLength > dctx->litBufferEnd) + { + /* lit buffer is reaching split point, empty out the first buffer and transition to litExtraBuffer */ + const size_t leftoverLit = dctx->litBufferEnd - litPtr; + if (leftoverLit) + { + RETURN_ERROR_IF(leftoverLit > (size_t)(oend - op), dstSize_tooSmall, "remaining lit must fit within dstBuffer"); + ZSTD_safecopyDstBeforeSrc(op, litPtr, leftoverLit); + sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK].litLength -= leftoverLit; + op += leftoverLit; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + oneSeqSize = ZSTD_execSequence(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + + prefetchPos = ZSTD_prefetchMatch(prefetchPos, sequence, prefixStart, dictEnd); + sequences[seqNb & STORED_SEQS_MASK] = sequence; + op += oneSeqSize; + } + else + { + /* lit buffer is either wholly contained in first or second split, or not split at all*/ + oneSeqSize = dctx->litBufferLocation == ZSTD_split ? + ZSTD_execSequenceSplitLitBuffer(op, oend, litPtr + sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK].litLength - WILDCOPY_OVERLENGTH, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd) : + ZSTD_execSequence(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + + prefetchPos = ZSTD_prefetchMatch(prefetchPos, sequence, prefixStart, dictEnd); + sequences[seqNb & STORED_SEQS_MASK] = sequence; + op += oneSeqSize; + } + } + RETURN_ERROR_IF(seqNblitBufferLocation == ZSTD_split && litPtr + sequence->litLength > dctx->litBufferEnd) + { + const size_t leftoverLit = dctx->litBufferEnd - litPtr; + if (leftoverLit) + { + RETURN_ERROR_IF(leftoverLit > (size_t)(oend - op), dstSize_tooSmall, "remaining lit must fit within dstBuffer"); + ZSTD_safecopyDstBeforeSrc(op, litPtr, leftoverLit); + sequence->litLength -= leftoverLit; + op += leftoverLit; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + { + size_t const oneSeqSize = ZSTD_execSequence(op, oend, *sequence, &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[seqNb&STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + op += oneSeqSize; + } + } + else + { + size_t const oneSeqSize = dctx->litBufferLocation == ZSTD_split ? + ZSTD_execSequenceSplitLitBuffer(op, oend, litPtr + sequence->litLength - WILDCOPY_OVERLENGTH, *sequence, &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd) : + ZSTD_execSequence(op, oend, *sequence, &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[seqNb&STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + op += oneSeqSize; + } + } + + /* save reps for next block */ + { U32 i; for (i=0; ientropy.rep[i] = (U32)(seqState.prevOffset[i]); } + } + + /* last literal segment */ + if (dctx->litBufferLocation == ZSTD_split) /* first deplete literal buffer in dst, then copy litExtraBuffer */ + { + size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend - op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memmove(op, litPtr, lastLLSize); + op += lastLLSize; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + } + { size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memmove(op, litPtr, lastLLSize); + op += lastLLSize; + } + } + + return op-ostart; +} + +static size_t +ZSTD_decompressSequencesLong_default(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */ + + + +#if DYNAMIC_BMI2 + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG +static BMI2_TARGET_ATTRIBUTE size_t +DONT_VECTORIZE +ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +static BMI2_TARGET_ATTRIBUTE size_t +DONT_VECTORIZE +ZSTD_decompressSequencesSplitLitBuffer_bmi2(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequences_bodySplitLitBuffer(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */ + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT +static BMI2_TARGET_ATTRIBUTE size_t +ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */ + +#endif /* DYNAMIC_BMI2 */ + +typedef size_t (*ZSTD_decompressSequences_t)( + ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame); + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG +static size_t +ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + DEBUGLOG(5, "ZSTD_decompressSequences"); +#if DYNAMIC_BMI2 + if (ZSTD_DCtx_get_bmi2(dctx)) { + return ZSTD_decompressSequences_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); + } +#endif + return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +static size_t +ZSTD_decompressSequencesSplitLitBuffer(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + DEBUGLOG(5, "ZSTD_decompressSequencesSplitLitBuffer"); +#if DYNAMIC_BMI2 + if (ZSTD_DCtx_get_bmi2(dctx)) { + return ZSTD_decompressSequencesSplitLitBuffer_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); + } +#endif + return ZSTD_decompressSequencesSplitLitBuffer_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */ + + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT +/* ZSTD_decompressSequencesLong() : + * decompression function triggered when a minimum share of offsets is considered "long", + * aka out of cache. + * note : "long" definition seems overloaded here, sometimes meaning "wider than bitstream register", and sometimes meaning "farther than memory cache distance". + * This function will try to mitigate main memory latency through the use of prefetching */ +static size_t +ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + DEBUGLOG(5, "ZSTD_decompressSequencesLong"); +#if DYNAMIC_BMI2 + if (ZSTD_DCtx_get_bmi2(dctx)) { + return ZSTD_decompressSequencesLong_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); + } +#endif + return ZSTD_decompressSequencesLong_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */ + + +/** + * @returns The total size of the history referenceable by zstd, including + * both the prefix and the extDict. At @p op any offset larger than this + * is invalid. + */ +static size_t ZSTD_totalHistorySize(BYTE* op, BYTE const* virtualStart) +{ + return (size_t)(op - virtualStart); +} + +typedef struct { + unsigned longOffsetShare; + unsigned maxNbAdditionalBits; +} ZSTD_OffsetInfo; + +/* ZSTD_getOffsetInfo() : + * condition : offTable must be valid + * @return : "share" of long offsets (arbitrarily defined as > (1<<23)) + * compared to maximum possible of (1< 22) info.longOffsetShare += 1; + } + + assert(tableLog <= OffFSELog); + info.longOffsetShare <<= (OffFSELog - tableLog); /* scale to OffFSELog */ + } + + return info; +} + +/** + * @returns The maximum offset we can decode in one read of our bitstream, without + * reloading more bits in the middle of the offset bits read. Any offsets larger + * than this must use the long offset decoder. + */ +static size_t ZSTD_maxShortOffset(void) +{ + if (MEM_64bits()) { + /* We can decode any offset without reloading bits. + * This might change if the max window size grows. + */ + ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31); + return (size_t)-1; + } else { + /* The maximum offBase is (1 << (STREAM_ACCUMULATOR_MIN + 1)) - 1. + * This offBase would require STREAM_ACCUMULATOR_MIN extra bits. + * Then we have to subtract ZSTD_REP_NUM to get the maximum possible offset. + */ + size_t const maxOffbase = ((size_t)1 << (STREAM_ACCUMULATOR_MIN + 1)) - 1; + size_t const maxOffset = maxOffbase - ZSTD_REP_NUM; + assert(ZSTD_highbit32((U32)maxOffbase) == STREAM_ACCUMULATOR_MIN); + return maxOffset; + } +} + +size_t +ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, const int frame, const streaming_operation streaming) +{ /* blockType == blockCompressed */ + const BYTE* ip = (const BYTE*)src; + DEBUGLOG(5, "ZSTD_decompressBlock_internal (size : %u)", (U32)srcSize); + + /* Note : the wording of the specification + * allows compressed block to be sized exactly ZSTD_BLOCKSIZE_MAX. + * This generally does not happen, as it makes little sense, + * since an uncompressed block would feature same size and have no decompression cost. + * Also, note that decoder from reference libzstd before < v1.5.4 + * would consider this edge case as an error. + * As a consequence, avoid generating compressed blocks of size ZSTD_BLOCKSIZE_MAX + * for broader compatibility with the deployed ecosystem of zstd decoders */ + RETURN_ERROR_IF(srcSize > ZSTD_BLOCKSIZE_MAX, srcSize_wrong, ""); + + /* Decode literals section */ + { size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize, dst, dstCapacity, streaming); + DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : cSize=%u, nbLiterals=%zu", (U32)litCSize, dctx->litSize); + if (ZSTD_isError(litCSize)) return litCSize; + ip += litCSize; + srcSize -= litCSize; + } + + /* Build Decoding Tables */ + { + /* Compute the maximum block size, which must also work when !frame and fParams are unset. + * Additionally, take the min with dstCapacity to ensure that the totalHistorySize fits in a size_t. + */ + size_t const blockSizeMax = MIN(dstCapacity, (frame ? dctx->fParams.blockSizeMax : ZSTD_BLOCKSIZE_MAX)); + size_t const totalHistorySize = ZSTD_totalHistorySize((BYTE*)dst + blockSizeMax, (BYTE const*)dctx->virtualStart); + /* isLongOffset must be true if there are long offsets. + * Offsets are long if they are larger than ZSTD_maxShortOffset(). + * We don't expect that to be the case in 64-bit mode. + * + * We check here to see if our history is large enough to allow long offsets. + * If it isn't, then we can't possible have (valid) long offsets. If the offset + * is invalid, then it is okay to read it incorrectly. + * + * If isLongOffsets is true, then we will later check our decoding table to see + * if it is even possible to generate long offsets. + */ + ZSTD_longOffset_e isLongOffset = (ZSTD_longOffset_e)(MEM_32bits() && (totalHistorySize > ZSTD_maxShortOffset())); + /* These macros control at build-time which decompressor implementation + * we use. If neither is defined, we do some inspection and dispatch at + * runtime. + */ +#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ + !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) + int usePrefetchDecoder = dctx->ddictIsCold; +#else + /* Set to 1 to avoid computing offset info if we don't need to. + * Otherwise this value is ignored. + */ + int usePrefetchDecoder = 1; +#endif + int nbSeq; + size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, srcSize); + if (ZSTD_isError(seqHSize)) return seqHSize; + ip += seqHSize; + srcSize -= seqHSize; + + RETURN_ERROR_IF((dst == NULL || dstCapacity == 0) && nbSeq > 0, dstSize_tooSmall, "NULL not handled"); + RETURN_ERROR_IF(MEM_64bits() && sizeof(size_t) == sizeof(void*) && (size_t)(-1) - (size_t)dst < (size_t)(1 << 20), dstSize_tooSmall, + "invalid dst"); + + /* If we could potentially have long offsets, or we might want to use the prefetch decoder, + * compute information about the share of long offsets, and the maximum nbAdditionalBits. + * NOTE: could probably use a larger nbSeq limit + */ + if (isLongOffset || (!usePrefetchDecoder && (totalHistorySize > (1u << 24)) && (nbSeq > 8))) { + ZSTD_OffsetInfo const info = ZSTD_getOffsetInfo(dctx->OFTptr, nbSeq); + if (isLongOffset && info.maxNbAdditionalBits <= STREAM_ACCUMULATOR_MIN) { + /* If isLongOffset, but the maximum number of additional bits that we see in our table is small + * enough, then we know it is impossible to have too long an offset in this block, so we can + * use the regular offset decoder. + */ + isLongOffset = ZSTD_lo_isRegularOffset; + } + if (!usePrefetchDecoder) { + U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */ + usePrefetchDecoder = (info.longOffsetShare >= minShare); + } + } + + dctx->ddictIsCold = 0; + +#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ + !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) + if (usePrefetchDecoder) { +#else + (void)usePrefetchDecoder; + { +#endif +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT + return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); +#endif + } + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG + /* else */ + if (dctx->litBufferLocation == ZSTD_split) + return ZSTD_decompressSequencesSplitLitBuffer(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); + else + return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); +#endif + } +} + + +void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst, size_t dstSize) +{ + if (dst != dctx->previousDstEnd && dstSize > 0) { /* not contiguous */ + dctx->dictEnd = dctx->previousDstEnd; + dctx->virtualStart = (const char*)dst - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->prefixStart)); + dctx->prefixStart = dst; + dctx->previousDstEnd = dst; + } +} + + +size_t ZSTD_decompressBlock_deprecated(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize) +{ + size_t dSize; + ZSTD_checkContinuity(dctx, dst, dstCapacity); + dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0, not_streaming); + dctx->previousDstEnd = (char*)dst + dSize; + return dSize; +} + + +/* NOTE: Must just wrap ZSTD_decompressBlock_deprecated() */ +size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize) +{ + return ZSTD_decompressBlock_deprecated(dctx, dst, dstCapacity, src, srcSize); +} +/**** ended inlining decompress/zstd_decompress_block.c ****/ + +/**** start inlining dictBuilder/cover.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* ***************************************************************************** + * Constructs a dictionary using a heuristic based on the following paper: + * + * Liao, Petri, Moffat, Wirth + * Effective Construction of Relative Lempel-Ziv Dictionaries + * Published in WWW 2016. + * + * Adapted from code originally written by @ot (Giuseppe Ottaviano). + ******************************************************************************/ + +/*-************************************* +* Dependencies +***************************************/ +#include /* fprintf */ +#include /* malloc, free, qsort */ +#include /* memset */ +#include /* clock */ + +#ifndef ZDICT_STATIC_LINKING_ONLY +# define ZDICT_STATIC_LINKING_ONLY +#endif + +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: ../common/pool.h ****/ +/**** skipping file: ../common/threading.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: ../common/bits.h ****/ +/**** start inlining ../zdict.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef ZSTD_ZDICT_H +#define ZSTD_ZDICT_H + +/*====== Dependencies ======*/ +#include /* size_t */ + + +/* ===== ZDICTLIB_API : control library symbols visibility ===== */ +#ifndef ZDICTLIB_VISIBLE + /* Backwards compatibility with old macro name */ +# ifdef ZDICTLIB_VISIBILITY +# define ZDICTLIB_VISIBLE ZDICTLIB_VISIBILITY +# elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZDICTLIB_VISIBLE __attribute__ ((visibility ("default"))) +# else +# define ZDICTLIB_VISIBLE +# endif +#endif + +#ifndef ZDICTLIB_HIDDEN +# if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZDICTLIB_HIDDEN __attribute__ ((visibility ("hidden"))) +# else +# define ZDICTLIB_HIDDEN +# endif +#endif + +#if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZDICTLIB_API __declspec(dllexport) ZDICTLIB_VISIBLE +#elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZDICTLIB_API __declspec(dllimport) ZDICTLIB_VISIBLE /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define ZDICTLIB_API ZDICTLIB_VISIBLE +#endif + +/******************************************************************************* + * Zstd dictionary builder + * + * FAQ + * === + * Why should I use a dictionary? + * ------------------------------ + * + * Zstd can use dictionaries to improve compression ratio of small data. + * Traditionally small files don't compress well because there is very little + * repetition in a single sample, since it is small. But, if you are compressing + * many similar files, like a bunch of JSON records that share the same + * structure, you can train a dictionary on ahead of time on some samples of + * these files. Then, zstd can use the dictionary to find repetitions that are + * present across samples. This can vastly improve compression ratio. + * + * When is a dictionary useful? + * ---------------------------- + * + * Dictionaries are useful when compressing many small files that are similar. + * The larger a file is, the less benefit a dictionary will have. Generally, + * we don't expect dictionary compression to be effective past 100KB. And the + * smaller a file is, the more we would expect the dictionary to help. + * + * How do I use a dictionary? + * -------------------------- + * + * Simply pass the dictionary to the zstd compressor with + * `ZSTD_CCtx_loadDictionary()`. The same dictionary must then be passed to + * the decompressor, using `ZSTD_DCtx_loadDictionary()`. There are other + * more advanced functions that allow selecting some options, see zstd.h for + * complete documentation. + * + * What is a zstd dictionary? + * -------------------------- + * + * A zstd dictionary has two pieces: Its header, and its content. The header + * contains a magic number, the dictionary ID, and entropy tables. These + * entropy tables allow zstd to save on header costs in the compressed file, + * which really matters for small data. The content is just bytes, which are + * repeated content that is common across many samples. + * + * What is a raw content dictionary? + * --------------------------------- + * + * A raw content dictionary is just bytes. It doesn't have a zstd dictionary + * header, a dictionary ID, or entropy tables. Any buffer is a valid raw + * content dictionary. + * + * How do I train a dictionary? + * ---------------------------- + * + * Gather samples from your use case. These samples should be similar to each + * other. If you have several use cases, you could try to train one dictionary + * per use case. + * + * Pass those samples to `ZDICT_trainFromBuffer()` and that will train your + * dictionary. There are a few advanced versions of this function, but this + * is a great starting point. If you want to further tune your dictionary + * you could try `ZDICT_optimizeTrainFromBuffer_cover()`. If that is too slow + * you can try `ZDICT_optimizeTrainFromBuffer_fastCover()`. + * + * If the dictionary training function fails, that is likely because you + * either passed too few samples, or a dictionary would not be effective + * for your data. Look at the messages that the dictionary trainer printed, + * if it doesn't say too few samples, then a dictionary would not be effective. + * + * How large should my dictionary be? + * ---------------------------------- + * + * A reasonable dictionary size, the `dictBufferCapacity`, is about 100KB. + * The zstd CLI defaults to a 110KB dictionary. You likely don't need a + * dictionary larger than that. But, most use cases can get away with a + * smaller dictionary. The advanced dictionary builders can automatically + * shrink the dictionary for you, and select the smallest size that doesn't + * hurt compression ratio too much. See the `shrinkDict` parameter. + * A smaller dictionary can save memory, and potentially speed up + * compression. + * + * How many samples should I provide to the dictionary builder? + * ------------------------------------------------------------ + * + * We generally recommend passing ~100x the size of the dictionary + * in samples. A few thousand should suffice. Having too few samples + * can hurt the dictionaries effectiveness. Having more samples will + * only improve the dictionaries effectiveness. But having too many + * samples can slow down the dictionary builder. + * + * How do I determine if a dictionary will be effective? + * ----------------------------------------------------- + * + * Simply train a dictionary and try it out. You can use zstd's built in + * benchmarking tool to test the dictionary effectiveness. + * + * # Benchmark levels 1-3 without a dictionary + * zstd -b1e3 -r /path/to/my/files + * # Benchmark levels 1-3 with a dictionary + * zstd -b1e3 -r /path/to/my/files -D /path/to/my/dictionary + * + * When should I retrain a dictionary? + * ----------------------------------- + * + * You should retrain a dictionary when its effectiveness drops. Dictionary + * effectiveness drops as the data you are compressing changes. Generally, we do + * expect dictionaries to "decay" over time, as your data changes, but the rate + * at which they decay depends on your use case. Internally, we regularly + * retrain dictionaries, and if the new dictionary performs significantly + * better than the old dictionary, we will ship the new dictionary. + * + * I have a raw content dictionary, how do I turn it into a zstd dictionary? + * ------------------------------------------------------------------------- + * + * If you have a raw content dictionary, e.g. by manually constructing it, or + * using a third-party dictionary builder, you can turn it into a zstd + * dictionary by using `ZDICT_finalizeDictionary()`. You'll also have to + * provide some samples of the data. It will add the zstd header to the + * raw content, which contains a dictionary ID and entropy tables, which + * will improve compression ratio, and allow zstd to write the dictionary ID + * into the frame, if you so choose. + * + * Do I have to use zstd's dictionary builder? + * ------------------------------------------- + * + * No! You can construct dictionary content however you please, it is just + * bytes. It will always be valid as a raw content dictionary. If you want + * a zstd dictionary, which can improve compression ratio, use + * `ZDICT_finalizeDictionary()`. + * + * What is the attack surface of a zstd dictionary? + * ------------------------------------------------ + * + * Zstd is heavily fuzz tested, including loading fuzzed dictionaries, so + * zstd should never crash, or access out-of-bounds memory no matter what + * the dictionary is. However, if an attacker can control the dictionary + * during decompression, they can cause zstd to generate arbitrary bytes, + * just like if they controlled the compressed data. + * + ******************************************************************************/ + + +/*! ZDICT_trainFromBuffer(): + * Train a dictionary from an array of samples. + * Redirect towards ZDICT_optimizeTrainFromBuffer_fastCover() single-threaded, with d=8, steps=4, + * f=20, and accel=1. + * Samples must be stored concatenated in a single flat buffer `samplesBuffer`, + * supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order. + * The resulting dictionary will be saved into `dictBuffer`. + * @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`) + * or an error code, which can be tested with ZDICT_isError(). + * Note: Dictionary training will fail if there are not enough samples to construct a + * dictionary, or if most of the samples are too small (< 8 bytes being the lower limit). + * If dictionary training fails, you should use zstd without a dictionary, as the dictionary + * would've been ineffective anyways. If you believe your samples would benefit from a dictionary + * please open an issue with details, and we can look into it. + * Note: ZDICT_trainFromBuffer()'s memory usage is about 6 MB. + * Tips: In general, a reasonable dictionary has a size of ~ 100 KB. + * It's possible to select smaller or larger size, just by specifying `dictBufferCapacity`. + * In general, it's recommended to provide a few thousands samples, though this can vary a lot. + * It's recommended that total size of all samples be about ~x100 times the target size of dictionary. + */ +ZDICTLIB_API size_t ZDICT_trainFromBuffer(void* dictBuffer, size_t dictBufferCapacity, + const void* samplesBuffer, + const size_t* samplesSizes, unsigned nbSamples); + +typedef struct { + int compressionLevel; /**< optimize for a specific zstd compression level; 0 means default */ + unsigned notificationLevel; /**< Write log to stderr; 0 = none (default); 1 = errors; 2 = progression; 3 = details; 4 = debug; */ + unsigned dictID; /**< force dictID value; 0 means auto mode (32-bits random value) + * NOTE: The zstd format reserves some dictionary IDs for future use. + * You may use them in private settings, but be warned that they + * may be used by zstd in a public dictionary registry in the future. + * These dictionary IDs are: + * - low range : <= 32767 + * - high range : >= (2^31) + */ +} ZDICT_params_t; + +/*! ZDICT_finalizeDictionary(): + * Given a custom content as a basis for dictionary, and a set of samples, + * finalize dictionary by adding headers and statistics according to the zstd + * dictionary format. + * + * Samples must be stored concatenated in a flat buffer `samplesBuffer`, + * supplied with an array of sizes `samplesSizes`, providing the size of each + * sample in order. The samples are used to construct the statistics, so they + * should be representative of what you will compress with this dictionary. + * + * The compression level can be set in `parameters`. You should pass the + * compression level you expect to use in production. The statistics for each + * compression level differ, so tuning the dictionary for the compression level + * can help quite a bit. + * + * You can set an explicit dictionary ID in `parameters`, or allow us to pick + * a random dictionary ID for you, but we can't guarantee no collisions. + * + * The dstDictBuffer and the dictContent may overlap, and the content will be + * appended to the end of the header. If the header + the content doesn't fit in + * maxDictSize the beginning of the content is truncated to make room, since it + * is presumed that the most profitable content is at the end of the dictionary, + * since that is the cheapest to reference. + * + * `maxDictSize` must be >= max(dictContentSize, ZSTD_DICTSIZE_MIN). + * + * @return: size of dictionary stored into `dstDictBuffer` (<= `maxDictSize`), + * or an error code, which can be tested by ZDICT_isError(). + * Note: ZDICT_finalizeDictionary() will push notifications into stderr if + * instructed to, using notificationLevel>0. + * NOTE: This function currently may fail in several edge cases including: + * * Not enough samples + * * Samples are uncompressible + * * Samples are all exactly the same + */ +ZDICTLIB_API size_t ZDICT_finalizeDictionary(void* dstDictBuffer, size_t maxDictSize, + const void* dictContent, size_t dictContentSize, + const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples, + ZDICT_params_t parameters); + + +/*====== Helper functions ======*/ +ZDICTLIB_API unsigned ZDICT_getDictID(const void* dictBuffer, size_t dictSize); /**< extracts dictID; @return zero if error (not a valid dictionary) */ +ZDICTLIB_API size_t ZDICT_getDictHeaderSize(const void* dictBuffer, size_t dictSize); /* returns dict header size; returns a ZSTD error code on failure */ +ZDICTLIB_API unsigned ZDICT_isError(size_t errorCode); +ZDICTLIB_API const char* ZDICT_getErrorName(size_t errorCode); + +#endif /* ZSTD_ZDICT_H */ + +#if defined(ZDICT_STATIC_LINKING_ONLY) && !defined(ZSTD_ZDICT_H_STATIC) +#define ZSTD_ZDICT_H_STATIC + +/* This can be overridden externally to hide static symbols. */ +#ifndef ZDICTLIB_STATIC_API +# if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZDICTLIB_STATIC_API __declspec(dllexport) ZDICTLIB_VISIBLE +# elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZDICTLIB_STATIC_API __declspec(dllimport) ZDICTLIB_VISIBLE +# else +# define ZDICTLIB_STATIC_API ZDICTLIB_VISIBLE +# endif +#endif + +/* ==================================================================================== + * The definitions in this section are considered experimental. + * They should never be used with a dynamic library, as they may change in the future. + * They are provided for advanced usages. + * Use them only in association with static linking. + * ==================================================================================== */ + +#define ZDICT_DICTSIZE_MIN 256 +/* Deprecated: Remove in v1.6.0 */ +#define ZDICT_CONTENTSIZE_MIN 128 + +/*! ZDICT_cover_params_t: + * k and d are the only required parameters. + * For others, value 0 means default. + */ +typedef struct { + unsigned k; /* Segment size : constraint: 0 < k : Reasonable range [16, 2048+] */ + unsigned d; /* dmer size : constraint: 0 < d <= k : Reasonable range [6, 16] */ + unsigned steps; /* Number of steps : Only used for optimization : 0 means default (40) : Higher means more parameters checked */ + unsigned nbThreads; /* Number of threads : constraint: 0 < nbThreads : 1 means single-threaded : Only used for optimization : Ignored if ZSTD_MULTITHREAD is not defined */ + double splitPoint; /* Percentage of samples used for training: Only used for optimization : the first nbSamples * splitPoint samples will be used to training, the last nbSamples * (1 - splitPoint) samples will be used for testing, 0 means default (1.0), 1.0 when all samples are used for both training and testing */ + unsigned shrinkDict; /* Train dictionaries to shrink in size starting from the minimum size and selects the smallest dictionary that is shrinkDictMaxRegression% worse than the largest dictionary. 0 means no shrinking and 1 means shrinking */ + unsigned shrinkDictMaxRegression; /* Sets shrinkDictMaxRegression so that a smaller dictionary can be at worse shrinkDictMaxRegression% worse than the max dict size dictionary. */ + ZDICT_params_t zParams; +} ZDICT_cover_params_t; + +typedef struct { + unsigned k; /* Segment size : constraint: 0 < k : Reasonable range [16, 2048+] */ + unsigned d; /* dmer size : constraint: 0 < d <= k : Reasonable range [6, 16] */ + unsigned f; /* log of size of frequency array : constraint: 0 < f <= 31 : 1 means default(20)*/ + unsigned steps; /* Number of steps : Only used for optimization : 0 means default (40) : Higher means more parameters checked */ + unsigned nbThreads; /* Number of threads : constraint: 0 < nbThreads : 1 means single-threaded : Only used for optimization : Ignored if ZSTD_MULTITHREAD is not defined */ + double splitPoint; /* Percentage of samples used for training: Only used for optimization : the first nbSamples * splitPoint samples will be used to training, the last nbSamples * (1 - splitPoint) samples will be used for testing, 0 means default (0.75), 1.0 when all samples are used for both training and testing */ + unsigned accel; /* Acceleration level: constraint: 0 < accel <= 10, higher means faster and less accurate, 0 means default(1) */ + unsigned shrinkDict; /* Train dictionaries to shrink in size starting from the minimum size and selects the smallest dictionary that is shrinkDictMaxRegression% worse than the largest dictionary. 0 means no shrinking and 1 means shrinking */ + unsigned shrinkDictMaxRegression; /* Sets shrinkDictMaxRegression so that a smaller dictionary can be at worse shrinkDictMaxRegression% worse than the max dict size dictionary. */ + + ZDICT_params_t zParams; +} ZDICT_fastCover_params_t; + +/*! ZDICT_trainFromBuffer_cover(): + * Train a dictionary from an array of samples using the COVER algorithm. + * Samples must be stored concatenated in a single flat buffer `samplesBuffer`, + * supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order. + * The resulting dictionary will be saved into `dictBuffer`. + * @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`) + * or an error code, which can be tested with ZDICT_isError(). + * See ZDICT_trainFromBuffer() for details on failure modes. + * Note: ZDICT_trainFromBuffer_cover() requires about 9 bytes of memory for each input byte. + * Tips: In general, a reasonable dictionary has a size of ~ 100 KB. + * It's possible to select smaller or larger size, just by specifying `dictBufferCapacity`. + * In general, it's recommended to provide a few thousands samples, though this can vary a lot. + * It's recommended that total size of all samples be about ~x100 times the target size of dictionary. + */ +ZDICTLIB_STATIC_API size_t ZDICT_trainFromBuffer_cover( + void *dictBuffer, size_t dictBufferCapacity, + const void *samplesBuffer, const size_t *samplesSizes, unsigned nbSamples, + ZDICT_cover_params_t parameters); + +/*! ZDICT_optimizeTrainFromBuffer_cover(): + * The same requirements as above hold for all the parameters except `parameters`. + * This function tries many parameter combinations and picks the best parameters. + * `*parameters` is filled with the best parameters found, + * dictionary constructed with those parameters is stored in `dictBuffer`. + * + * All of the parameters d, k, steps are optional. + * If d is non-zero then we don't check multiple values of d, otherwise we check d = {6, 8}. + * if steps is zero it defaults to its default value. + * If k is non-zero then we don't check multiple values of k, otherwise we check steps values in [50, 2000]. + * + * @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`) + * or an error code, which can be tested with ZDICT_isError(). + * On success `*parameters` contains the parameters selected. + * See ZDICT_trainFromBuffer() for details on failure modes. + * Note: ZDICT_optimizeTrainFromBuffer_cover() requires about 8 bytes of memory for each input byte and additionally another 5 bytes of memory for each byte of memory for each thread. + */ +ZDICTLIB_STATIC_API size_t ZDICT_optimizeTrainFromBuffer_cover( + void* dictBuffer, size_t dictBufferCapacity, + const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples, + ZDICT_cover_params_t* parameters); + +/*! ZDICT_trainFromBuffer_fastCover(): + * Train a dictionary from an array of samples using a modified version of COVER algorithm. + * Samples must be stored concatenated in a single flat buffer `samplesBuffer`, + * supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order. + * d and k are required. + * All other parameters are optional, will use default values if not provided + * The resulting dictionary will be saved into `dictBuffer`. + * @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`) + * or an error code, which can be tested with ZDICT_isError(). + * See ZDICT_trainFromBuffer() for details on failure modes. + * Note: ZDICT_trainFromBuffer_fastCover() requires 6 * 2^f bytes of memory. + * Tips: In general, a reasonable dictionary has a size of ~ 100 KB. + * It's possible to select smaller or larger size, just by specifying `dictBufferCapacity`. + * In general, it's recommended to provide a few thousands samples, though this can vary a lot. + * It's recommended that total size of all samples be about ~x100 times the target size of dictionary. + */ +ZDICTLIB_STATIC_API size_t ZDICT_trainFromBuffer_fastCover(void *dictBuffer, + size_t dictBufferCapacity, const void *samplesBuffer, + const size_t *samplesSizes, unsigned nbSamples, + ZDICT_fastCover_params_t parameters); + +/*! ZDICT_optimizeTrainFromBuffer_fastCover(): + * The same requirements as above hold for all the parameters except `parameters`. + * This function tries many parameter combinations (specifically, k and d combinations) + * and picks the best parameters. `*parameters` is filled with the best parameters found, + * dictionary constructed with those parameters is stored in `dictBuffer`. + * All of the parameters d, k, steps, f, and accel are optional. + * If d is non-zero then we don't check multiple values of d, otherwise we check d = {6, 8}. + * if steps is zero it defaults to its default value. + * If k is non-zero then we don't check multiple values of k, otherwise we check steps values in [50, 2000]. + * If f is zero, default value of 20 is used. + * If accel is zero, default value of 1 is used. + * + * @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`) + * or an error code, which can be tested with ZDICT_isError(). + * On success `*parameters` contains the parameters selected. + * See ZDICT_trainFromBuffer() for details on failure modes. + * Note: ZDICT_optimizeTrainFromBuffer_fastCover() requires about 6 * 2^f bytes of memory for each thread. + */ +ZDICTLIB_STATIC_API size_t ZDICT_optimizeTrainFromBuffer_fastCover(void* dictBuffer, + size_t dictBufferCapacity, const void* samplesBuffer, + const size_t* samplesSizes, unsigned nbSamples, + ZDICT_fastCover_params_t* parameters); + +typedef struct { + unsigned selectivityLevel; /* 0 means default; larger => select more => larger dictionary */ + ZDICT_params_t zParams; +} ZDICT_legacy_params_t; + +/*! ZDICT_trainFromBuffer_legacy(): + * Train a dictionary from an array of samples. + * Samples must be stored concatenated in a single flat buffer `samplesBuffer`, + * supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order. + * The resulting dictionary will be saved into `dictBuffer`. + * `parameters` is optional and can be provided with values set to 0 to mean "default". + * @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`) + * or an error code, which can be tested with ZDICT_isError(). + * See ZDICT_trainFromBuffer() for details on failure modes. + * Tips: In general, a reasonable dictionary has a size of ~ 100 KB. + * It's possible to select smaller or larger size, just by specifying `dictBufferCapacity`. + * In general, it's recommended to provide a few thousands samples, though this can vary a lot. + * It's recommended that total size of all samples be about ~x100 times the target size of dictionary. + * Note: ZDICT_trainFromBuffer_legacy() will send notifications into stderr if instructed to, using notificationLevel>0. + */ +ZDICTLIB_STATIC_API size_t ZDICT_trainFromBuffer_legacy( + void* dictBuffer, size_t dictBufferCapacity, + const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples, + ZDICT_legacy_params_t parameters); + + +/* Deprecation warnings */ +/* It is generally possible to disable deprecation warnings from compiler, + for example with -Wno-deprecated-declarations for gcc + or _CRT_SECURE_NO_WARNINGS in Visual. + Otherwise, it's also possible to manually define ZDICT_DISABLE_DEPRECATE_WARNINGS */ +#ifdef ZDICT_DISABLE_DEPRECATE_WARNINGS +# define ZDICT_DEPRECATED(message) /* disable deprecation warnings */ +#else +# define ZDICT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define ZDICT_DEPRECATED(message) [[deprecated(message)]] +# elif defined(__clang__) || (ZDICT_GCC_VERSION >= 405) +# define ZDICT_DEPRECATED(message) __attribute__((deprecated(message))) +# elif (ZDICT_GCC_VERSION >= 301) +# define ZDICT_DEPRECATED(message) __attribute__((deprecated)) +# elif defined(_MSC_VER) +# define ZDICT_DEPRECATED(message) __declspec(deprecated(message)) +# else +# pragma message("WARNING: You need to implement ZDICT_DEPRECATED for this compiler") +# define ZDICT_DEPRECATED(message) +# endif +#endif /* ZDICT_DISABLE_DEPRECATE_WARNINGS */ + +ZDICT_DEPRECATED("use ZDICT_finalizeDictionary() instead") +ZDICTLIB_STATIC_API +size_t ZDICT_addEntropyTablesFromBuffer(void* dictBuffer, size_t dictContentSize, size_t dictBufferCapacity, + const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples); + + +#endif /* ZSTD_ZDICT_H_STATIC */ + +#if defined (__cplusplus) +} +#endif +/**** ended inlining ../zdict.h ****/ +/**** start inlining cover.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZDICT_STATIC_LINKING_ONLY +# define ZDICT_STATIC_LINKING_ONLY +#endif + +#include /* fprintf */ +#include /* malloc, free, qsort */ +#include /* memset */ +#include /* clock */ +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: ../common/pool.h ****/ +/**** skipping file: ../common/threading.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: ../zdict.h ****/ + +/** + * COVER_best_t is used for two purposes: + * 1. Synchronizing threads. + * 2. Saving the best parameters and dictionary. + * + * All of the methods except COVER_best_init() are thread safe if zstd is + * compiled with multithreaded support. + */ +typedef struct COVER_best_s { + ZSTD_pthread_mutex_t mutex; + ZSTD_pthread_cond_t cond; + size_t liveJobs; + void *dict; + size_t dictSize; + ZDICT_cover_params_t parameters; + size_t compressedSize; +} COVER_best_t; + +/** + * A segment is a range in the source as well as the score of the segment. + */ +typedef struct { + U32 begin; + U32 end; + U32 score; +} COVER_segment_t; + +/** + *Number of epochs and size of each epoch. + */ +typedef struct { + U32 num; + U32 size; +} COVER_epoch_info_t; + +/** + * Struct used for the dictionary selection function. + */ +typedef struct COVER_dictSelection { + BYTE* dictContent; + size_t dictSize; + size_t totalCompressedSize; +} COVER_dictSelection_t; + +/** + * Computes the number of epochs and the size of each epoch. + * We will make sure that each epoch gets at least 10 * k bytes. + * + * The COVER algorithms divide the data up into epochs of equal size and + * select one segment from each epoch. + * + * @param maxDictSize The maximum allowed dictionary size. + * @param nbDmers The number of dmers we are training on. + * @param k The parameter k (segment size). + * @param passes The target number of passes over the dmer corpus. + * More passes means a better dictionary. + */ +COVER_epoch_info_t COVER_computeEpochs(U32 maxDictSize, U32 nbDmers, + U32 k, U32 passes); + +/** + * Warns the user when their corpus is too small. + */ +void COVER_warnOnSmallCorpus(size_t maxDictSize, size_t nbDmers, int displayLevel); + +/** + * Checks total compressed size of a dictionary + */ +size_t COVER_checkTotalCompressedSize(const ZDICT_cover_params_t parameters, + const size_t *samplesSizes, const BYTE *samples, + size_t *offsets, + size_t nbTrainSamples, size_t nbSamples, + BYTE *const dict, size_t dictBufferCapacity); + +/** + * Returns the sum of the sample sizes. + */ +size_t COVER_sum(const size_t *samplesSizes, unsigned nbSamples) ; + +/** + * Initialize the `COVER_best_t`. + */ +void COVER_best_init(COVER_best_t *best); + +/** + * Wait until liveJobs == 0. + */ +void COVER_best_wait(COVER_best_t *best); + +/** + * Call COVER_best_wait() and then destroy the COVER_best_t. + */ +void COVER_best_destroy(COVER_best_t *best); + +/** + * Called when a thread is about to be launched. + * Increments liveJobs. + */ +void COVER_best_start(COVER_best_t *best); + +/** + * Called when a thread finishes executing, both on error or success. + * Decrements liveJobs and signals any waiting threads if liveJobs == 0. + * If this dictionary is the best so far save it and its parameters. + */ +void COVER_best_finish(COVER_best_t *best, ZDICT_cover_params_t parameters, + COVER_dictSelection_t selection); +/** + * Error function for COVER_selectDict function. Checks if the return + * value is an error. + */ +unsigned COVER_dictSelectionIsError(COVER_dictSelection_t selection); + + /** + * Error function for COVER_selectDict function. Returns a struct where + * return.totalCompressedSize is a ZSTD error. + */ +COVER_dictSelection_t COVER_dictSelectionError(size_t error); + +/** + * Always call after selectDict is called to free up used memory from + * newly created dictionary. + */ +void COVER_dictSelectionFree(COVER_dictSelection_t selection); + +/** + * Called to finalize the dictionary and select one based on whether or not + * the shrink-dict flag was enabled. If enabled the dictionary used is the + * smallest dictionary within a specified regression of the compressed size + * from the largest dictionary. + */ + COVER_dictSelection_t COVER_selectDict(BYTE* customDictContent, size_t dictBufferCapacity, + size_t dictContentSize, const BYTE* samplesBuffer, const size_t* samplesSizes, unsigned nbFinalizeSamples, + size_t nbCheckSamples, size_t nbSamples, ZDICT_cover_params_t params, size_t* offsets, size_t totalCompressedSize); +/**** ended inlining cover.h ****/ + +/*-************************************* +* Constants +***************************************/ +/** +* There are 32bit indexes used to ref samples, so limit samples size to 4GB +* on 64bit builds. +* For 32bit builds we choose 1 GB. +* Most 32bit platforms have 2GB user-mode addressable space and we allocate a large +* contiguous buffer, so 1GB is already a high limit. +*/ +#define COVER_MAX_SAMPLES_SIZE (sizeof(size_t) == 8 ? ((unsigned)-1) : ((unsigned)1 GB)) +#define COVER_DEFAULT_SPLITPOINT 1.0 + +/*-************************************* +* Console display +***************************************/ +#ifndef LOCALDISPLAYLEVEL +static int g_displayLevel = 0; +#endif +#undef DISPLAY +#define DISPLAY(...) \ + { \ + fprintf(stderr, __VA_ARGS__); \ + fflush(stderr); \ + } +#undef LOCALDISPLAYLEVEL +#define LOCALDISPLAYLEVEL(displayLevel, l, ...) \ + if (displayLevel >= l) { \ + DISPLAY(__VA_ARGS__); \ + } /* 0 : no display; 1: errors; 2: default; 3: details; 4: debug */ +#undef DISPLAYLEVEL +#define DISPLAYLEVEL(l, ...) LOCALDISPLAYLEVEL(g_displayLevel, l, __VA_ARGS__) + +#ifndef LOCALDISPLAYUPDATE +static const clock_t g_refreshRate = CLOCKS_PER_SEC * 15 / 100; +static clock_t g_time = 0; +#endif +#undef LOCALDISPLAYUPDATE +#define LOCALDISPLAYUPDATE(displayLevel, l, ...) \ + if (displayLevel >= l) { \ + if ((clock() - g_time > g_refreshRate) || (displayLevel >= 4)) { \ + g_time = clock(); \ + DISPLAY(__VA_ARGS__); \ + } \ + } +#undef DISPLAYUPDATE +#define DISPLAYUPDATE(l, ...) LOCALDISPLAYUPDATE(g_displayLevel, l, __VA_ARGS__) + +/*-************************************* +* Hash table +*************************************** +* A small specialized hash map for storing activeDmers. +* The map does not resize, so if it becomes full it will loop forever. +* Thus, the map must be large enough to store every value. +* The map implements linear probing and keeps its load less than 0.5. +*/ + +#define MAP_EMPTY_VALUE ((U32)-1) +typedef struct COVER_map_pair_t_s { + U32 key; + U32 value; +} COVER_map_pair_t; + +typedef struct COVER_map_s { + COVER_map_pair_t *data; + U32 sizeLog; + U32 size; + U32 sizeMask; +} COVER_map_t; + +/** + * Clear the map. + */ +static void COVER_map_clear(COVER_map_t *map) { + memset(map->data, MAP_EMPTY_VALUE, map->size * sizeof(COVER_map_pair_t)); +} + +/** + * Initializes a map of the given size. + * Returns 1 on success and 0 on failure. + * The map must be destroyed with COVER_map_destroy(). + * The map is only guaranteed to be large enough to hold size elements. + */ +static int COVER_map_init(COVER_map_t *map, U32 size) { + map->sizeLog = ZSTD_highbit32(size) + 2; + map->size = (U32)1 << map->sizeLog; + map->sizeMask = map->size - 1; + map->data = (COVER_map_pair_t *)malloc(map->size * sizeof(COVER_map_pair_t)); + if (!map->data) { + map->sizeLog = 0; + map->size = 0; + return 0; + } + COVER_map_clear(map); + return 1; +} + +/** + * Internal hash function + */ +static const U32 COVER_prime4bytes = 2654435761U; +static U32 COVER_map_hash(COVER_map_t *map, U32 key) { + return (key * COVER_prime4bytes) >> (32 - map->sizeLog); +} + +/** + * Helper function that returns the index that a key should be placed into. + */ +static U32 COVER_map_index(COVER_map_t *map, U32 key) { + const U32 hash = COVER_map_hash(map, key); + U32 i; + for (i = hash;; i = (i + 1) & map->sizeMask) { + COVER_map_pair_t *pos = &map->data[i]; + if (pos->value == MAP_EMPTY_VALUE) { + return i; + } + if (pos->key == key) { + return i; + } + } +} + +/** + * Returns the pointer to the value for key. + * If key is not in the map, it is inserted and the value is set to 0. + * The map must not be full. + */ +static U32 *COVER_map_at(COVER_map_t *map, U32 key) { + COVER_map_pair_t *pos = &map->data[COVER_map_index(map, key)]; + if (pos->value == MAP_EMPTY_VALUE) { + pos->key = key; + pos->value = 0; + } + return &pos->value; +} + +/** + * Deletes key from the map if present. + */ +static void COVER_map_remove(COVER_map_t *map, U32 key) { + U32 i = COVER_map_index(map, key); + COVER_map_pair_t *del = &map->data[i]; + U32 shift = 1; + if (del->value == MAP_EMPTY_VALUE) { + return; + } + for (i = (i + 1) & map->sizeMask;; i = (i + 1) & map->sizeMask) { + COVER_map_pair_t *const pos = &map->data[i]; + /* If the position is empty we are done */ + if (pos->value == MAP_EMPTY_VALUE) { + del->value = MAP_EMPTY_VALUE; + return; + } + /* If pos can be moved to del do so */ + if (((i - COVER_map_hash(map, pos->key)) & map->sizeMask) >= shift) { + del->key = pos->key; + del->value = pos->value; + del = pos; + shift = 1; + } else { + ++shift; + } + } +} + +/** + * Destroys a map that is inited with COVER_map_init(). + */ +static void COVER_map_destroy(COVER_map_t *map) { + if (map->data) { + free(map->data); + } + map->data = NULL; + map->size = 0; +} + +/*-************************************* +* Context +***************************************/ + +typedef struct { + const BYTE *samples; + size_t *offsets; + const size_t *samplesSizes; + size_t nbSamples; + size_t nbTrainSamples; + size_t nbTestSamples; + U32 *suffix; + size_t suffixSize; + U32 *freqs; + U32 *dmerAt; + unsigned d; +} COVER_ctx_t; + +/* We need a global context for qsort... */ +static COVER_ctx_t *g_coverCtx = NULL; + +/*-************************************* +* Helper functions +***************************************/ + +/** + * Returns the sum of the sample sizes. + */ +size_t COVER_sum(const size_t *samplesSizes, unsigned nbSamples) { + size_t sum = 0; + unsigned i; + for (i = 0; i < nbSamples; ++i) { + sum += samplesSizes[i]; + } + return sum; +} + +/** + * Returns -1 if the dmer at lp is less than the dmer at rp. + * Return 0 if the dmers at lp and rp are equal. + * Returns 1 if the dmer at lp is greater than the dmer at rp. + */ +static int COVER_cmp(COVER_ctx_t *ctx, const void *lp, const void *rp) { + U32 const lhs = *(U32 const *)lp; + U32 const rhs = *(U32 const *)rp; + return memcmp(ctx->samples + lhs, ctx->samples + rhs, ctx->d); +} +/** + * Faster version for d <= 8. + */ +static int COVER_cmp8(COVER_ctx_t *ctx, const void *lp, const void *rp) { + U64 const mask = (ctx->d == 8) ? (U64)-1 : (((U64)1 << (8 * ctx->d)) - 1); + U64 const lhs = MEM_readLE64(ctx->samples + *(U32 const *)lp) & mask; + U64 const rhs = MEM_readLE64(ctx->samples + *(U32 const *)rp) & mask; + if (lhs < rhs) { + return -1; + } + return (lhs > rhs); +} + +/** + * Same as COVER_cmp() except ties are broken by pointer value + * NOTE: g_coverCtx must be set to call this function. A global is required because + * qsort doesn't take an opaque pointer. + */ +static int WIN_CDECL COVER_strict_cmp(const void *lp, const void *rp) { + int result = COVER_cmp(g_coverCtx, lp, rp); + if (result == 0) { + result = lp < rp ? -1 : 1; + } + return result; +} +/** + * Faster version for d <= 8. + */ +static int WIN_CDECL COVER_strict_cmp8(const void *lp, const void *rp) { + int result = COVER_cmp8(g_coverCtx, lp, rp); + if (result == 0) { + result = lp < rp ? -1 : 1; + } + return result; +} + +/** + * Returns the first pointer in [first, last) whose element does not compare + * less than value. If no such element exists it returns last. + */ +static const size_t *COVER_lower_bound(const size_t *first, const size_t *last, + size_t value) { + size_t count = last - first; + while (count != 0) { + size_t step = count / 2; + const size_t *ptr = first; + ptr += step; + if (*ptr < value) { + first = ++ptr; + count -= step + 1; + } else { + count = step; + } + } + return first; +} + +/** + * Generic groupBy function. + * Groups an array sorted by cmp into groups with equivalent values. + * Calls grp for each group. + */ +static void +COVER_groupBy(const void *data, size_t count, size_t size, COVER_ctx_t *ctx, + int (*cmp)(COVER_ctx_t *, const void *, const void *), + void (*grp)(COVER_ctx_t *, const void *, const void *)) { + const BYTE *ptr = (const BYTE *)data; + size_t num = 0; + while (num < count) { + const BYTE *grpEnd = ptr + size; + ++num; + while (num < count && cmp(ctx, ptr, grpEnd) == 0) { + grpEnd += size; + ++num; + } + grp(ctx, ptr, grpEnd); + ptr = grpEnd; + } +} + +/*-************************************* +* Cover functions +***************************************/ + +/** + * Called on each group of positions with the same dmer. + * Counts the frequency of each dmer and saves it in the suffix array. + * Fills `ctx->dmerAt`. + */ +static void COVER_group(COVER_ctx_t *ctx, const void *group, + const void *groupEnd) { + /* The group consists of all the positions with the same first d bytes. */ + const U32 *grpPtr = (const U32 *)group; + const U32 *grpEnd = (const U32 *)groupEnd; + /* The dmerId is how we will reference this dmer. + * This allows us to map the whole dmer space to a much smaller space, the + * size of the suffix array. + */ + const U32 dmerId = (U32)(grpPtr - ctx->suffix); + /* Count the number of samples this dmer shows up in */ + U32 freq = 0; + /* Details */ + const size_t *curOffsetPtr = ctx->offsets; + const size_t *offsetsEnd = ctx->offsets + ctx->nbSamples; + /* Once *grpPtr >= curSampleEnd this occurrence of the dmer is in a + * different sample than the last. + */ + size_t curSampleEnd = ctx->offsets[0]; + for (; grpPtr != grpEnd; ++grpPtr) { + /* Save the dmerId for this position so we can get back to it. */ + ctx->dmerAt[*grpPtr] = dmerId; + /* Dictionaries only help for the first reference to the dmer. + * After that zstd can reference the match from the previous reference. + * So only count each dmer once for each sample it is in. + */ + if (*grpPtr < curSampleEnd) { + continue; + } + freq += 1; + /* Binary search to find the end of the sample *grpPtr is in. + * In the common case that grpPtr + 1 == grpEnd we can skip the binary + * search because the loop is over. + */ + if (grpPtr + 1 != grpEnd) { + const size_t *sampleEndPtr = + COVER_lower_bound(curOffsetPtr, offsetsEnd, *grpPtr); + curSampleEnd = *sampleEndPtr; + curOffsetPtr = sampleEndPtr + 1; + } + } + /* At this point we are never going to look at this segment of the suffix + * array again. We take advantage of this fact to save memory. + * We store the frequency of the dmer in the first position of the group, + * which is dmerId. + */ + ctx->suffix[dmerId] = freq; +} + + +/** + * Selects the best segment in an epoch. + * Segments of are scored according to the function: + * + * Let F(d) be the frequency of dmer d. + * Let S_i be the dmer at position i of segment S which has length k. + * + * Score(S) = F(S_1) + F(S_2) + ... + F(S_{k-d+1}) + * + * Once the dmer d is in the dictionary we set F(d) = 0. + */ +static COVER_segment_t COVER_selectSegment(const COVER_ctx_t *ctx, U32 *freqs, + COVER_map_t *activeDmers, U32 begin, + U32 end, + ZDICT_cover_params_t parameters) { + /* Constants */ + const U32 k = parameters.k; + const U32 d = parameters.d; + const U32 dmersInK = k - d + 1; + /* Try each segment (activeSegment) and save the best (bestSegment) */ + COVER_segment_t bestSegment = {0, 0, 0}; + COVER_segment_t activeSegment; + /* Reset the activeDmers in the segment */ + COVER_map_clear(activeDmers); + /* The activeSegment starts at the beginning of the epoch. */ + activeSegment.begin = begin; + activeSegment.end = begin; + activeSegment.score = 0; + /* Slide the activeSegment through the whole epoch. + * Save the best segment in bestSegment. + */ + while (activeSegment.end < end) { + /* The dmerId for the dmer at the next position */ + U32 newDmer = ctx->dmerAt[activeSegment.end]; + /* The entry in activeDmers for this dmerId */ + U32 *newDmerOcc = COVER_map_at(activeDmers, newDmer); + /* If the dmer isn't already present in the segment add its score. */ + if (*newDmerOcc == 0) { + /* The paper suggest using the L-0.5 norm, but experiments show that it + * doesn't help. + */ + activeSegment.score += freqs[newDmer]; + } + /* Add the dmer to the segment */ + activeSegment.end += 1; + *newDmerOcc += 1; + + /* If the window is now too large, drop the first position */ + if (activeSegment.end - activeSegment.begin == dmersInK + 1) { + U32 delDmer = ctx->dmerAt[activeSegment.begin]; + U32 *delDmerOcc = COVER_map_at(activeDmers, delDmer); + activeSegment.begin += 1; + *delDmerOcc -= 1; + /* If this is the last occurrence of the dmer, subtract its score */ + if (*delDmerOcc == 0) { + COVER_map_remove(activeDmers, delDmer); + activeSegment.score -= freqs[delDmer]; + } + } + + /* If this segment is the best so far save it */ + if (activeSegment.score > bestSegment.score) { + bestSegment = activeSegment; + } + } + { + /* Trim off the zero frequency head and tail from the segment. */ + U32 newBegin = bestSegment.end; + U32 newEnd = bestSegment.begin; + U32 pos; + for (pos = bestSegment.begin; pos != bestSegment.end; ++pos) { + U32 freq = freqs[ctx->dmerAt[pos]]; + if (freq != 0) { + newBegin = MIN(newBegin, pos); + newEnd = pos + 1; + } + } + bestSegment.begin = newBegin; + bestSegment.end = newEnd; + } + { + /* Zero out the frequency of each dmer covered by the chosen segment. */ + U32 pos; + for (pos = bestSegment.begin; pos != bestSegment.end; ++pos) { + freqs[ctx->dmerAt[pos]] = 0; + } + } + return bestSegment; +} + +/** + * Check the validity of the parameters. + * Returns non-zero if the parameters are valid and 0 otherwise. + */ +static int COVER_checkParameters(ZDICT_cover_params_t parameters, + size_t maxDictSize) { + /* k and d are required parameters */ + if (parameters.d == 0 || parameters.k == 0) { + return 0; + } + /* k <= maxDictSize */ + if (parameters.k > maxDictSize) { + return 0; + } + /* d <= k */ + if (parameters.d > parameters.k) { + return 0; + } + /* 0 < splitPoint <= 1 */ + if (parameters.splitPoint <= 0 || parameters.splitPoint > 1){ + return 0; + } + return 1; +} + +/** + * Clean up a context initialized with `COVER_ctx_init()`. + */ +static void COVER_ctx_destroy(COVER_ctx_t *ctx) { + if (!ctx) { + return; + } + if (ctx->suffix) { + free(ctx->suffix); + ctx->suffix = NULL; + } + if (ctx->freqs) { + free(ctx->freqs); + ctx->freqs = NULL; + } + if (ctx->dmerAt) { + free(ctx->dmerAt); + ctx->dmerAt = NULL; + } + if (ctx->offsets) { + free(ctx->offsets); + ctx->offsets = NULL; + } +} + +/** + * Prepare a context for dictionary building. + * The context is only dependent on the parameter `d` and can be used multiple + * times. + * Returns 0 on success or error code on error. + * The context must be destroyed with `COVER_ctx_destroy()`. + */ +static size_t COVER_ctx_init(COVER_ctx_t *ctx, const void *samplesBuffer, + const size_t *samplesSizes, unsigned nbSamples, + unsigned d, double splitPoint) { + const BYTE *const samples = (const BYTE *)samplesBuffer; + const size_t totalSamplesSize = COVER_sum(samplesSizes, nbSamples); + /* Split samples into testing and training sets */ + const unsigned nbTrainSamples = splitPoint < 1.0 ? (unsigned)((double)nbSamples * splitPoint) : nbSamples; + const unsigned nbTestSamples = splitPoint < 1.0 ? nbSamples - nbTrainSamples : nbSamples; + const size_t trainingSamplesSize = splitPoint < 1.0 ? COVER_sum(samplesSizes, nbTrainSamples) : totalSamplesSize; + const size_t testSamplesSize = splitPoint < 1.0 ? COVER_sum(samplesSizes + nbTrainSamples, nbTestSamples) : totalSamplesSize; + /* Checks */ + if (totalSamplesSize < MAX(d, sizeof(U64)) || + totalSamplesSize >= (size_t)COVER_MAX_SAMPLES_SIZE) { + DISPLAYLEVEL(1, "Total samples size is too large (%u MB), maximum size is %u MB\n", + (unsigned)(totalSamplesSize>>20), (COVER_MAX_SAMPLES_SIZE >> 20)); + return ERROR(srcSize_wrong); + } + /* Check if there are at least 5 training samples */ + if (nbTrainSamples < 5) { + DISPLAYLEVEL(1, "Total number of training samples is %u and is invalid.", nbTrainSamples); + return ERROR(srcSize_wrong); + } + /* Check if there's testing sample */ + if (nbTestSamples < 1) { + DISPLAYLEVEL(1, "Total number of testing samples is %u and is invalid.", nbTestSamples); + return ERROR(srcSize_wrong); + } + /* Zero the context */ + memset(ctx, 0, sizeof(*ctx)); + DISPLAYLEVEL(2, "Training on %u samples of total size %u\n", nbTrainSamples, + (unsigned)trainingSamplesSize); + DISPLAYLEVEL(2, "Testing on %u samples of total size %u\n", nbTestSamples, + (unsigned)testSamplesSize); + ctx->samples = samples; + ctx->samplesSizes = samplesSizes; + ctx->nbSamples = nbSamples; + ctx->nbTrainSamples = nbTrainSamples; + ctx->nbTestSamples = nbTestSamples; + /* Partial suffix array */ + ctx->suffixSize = trainingSamplesSize - MAX(d, sizeof(U64)) + 1; + ctx->suffix = (U32 *)malloc(ctx->suffixSize * sizeof(U32)); + /* Maps index to the dmerID */ + ctx->dmerAt = (U32 *)malloc(ctx->suffixSize * sizeof(U32)); + /* The offsets of each file */ + ctx->offsets = (size_t *)malloc((nbSamples + 1) * sizeof(size_t)); + if (!ctx->suffix || !ctx->dmerAt || !ctx->offsets) { + DISPLAYLEVEL(1, "Failed to allocate scratch buffers\n"); + COVER_ctx_destroy(ctx); + return ERROR(memory_allocation); + } + ctx->freqs = NULL; + ctx->d = d; + + /* Fill offsets from the samplesSizes */ + { + U32 i; + ctx->offsets[0] = 0; + for (i = 1; i <= nbSamples; ++i) { + ctx->offsets[i] = ctx->offsets[i - 1] + samplesSizes[i - 1]; + } + } + DISPLAYLEVEL(2, "Constructing partial suffix array\n"); + { + /* suffix is a partial suffix array. + * It only sorts suffixes by their first parameters.d bytes. + * The sort is stable, so each dmer group is sorted by position in input. + */ + U32 i; + for (i = 0; i < ctx->suffixSize; ++i) { + ctx->suffix[i] = i; + } + /* qsort doesn't take an opaque pointer, so pass as a global. + * On OpenBSD qsort() is not guaranteed to be stable, their mergesort() is. + */ + g_coverCtx = ctx; +#if defined(__OpenBSD__) + mergesort(ctx->suffix, ctx->suffixSize, sizeof(U32), + (ctx->d <= 8 ? &COVER_strict_cmp8 : &COVER_strict_cmp)); +#else + qsort(ctx->suffix, ctx->suffixSize, sizeof(U32), + (ctx->d <= 8 ? &COVER_strict_cmp8 : &COVER_strict_cmp)); +#endif + } + DISPLAYLEVEL(2, "Computing frequencies\n"); + /* For each dmer group (group of positions with the same first d bytes): + * 1. For each position we set dmerAt[position] = dmerID. The dmerID is + * (groupBeginPtr - suffix). This allows us to go from position to + * dmerID so we can look up values in freq. + * 2. We calculate how many samples the dmer occurs in and save it in + * freqs[dmerId]. + */ + COVER_groupBy(ctx->suffix, ctx->suffixSize, sizeof(U32), ctx, + (ctx->d <= 8 ? &COVER_cmp8 : &COVER_cmp), &COVER_group); + ctx->freqs = ctx->suffix; + ctx->suffix = NULL; + return 0; +} + +void COVER_warnOnSmallCorpus(size_t maxDictSize, size_t nbDmers, int displayLevel) +{ + const double ratio = (double)nbDmers / (double)maxDictSize; + if (ratio >= 10) { + return; + } + LOCALDISPLAYLEVEL(displayLevel, 1, + "WARNING: The maximum dictionary size %u is too large " + "compared to the source size %u! " + "size(source)/size(dictionary) = %f, but it should be >= " + "10! This may lead to a subpar dictionary! We recommend " + "training on sources at least 10x, and preferably 100x " + "the size of the dictionary! \n", (U32)maxDictSize, + (U32)nbDmers, ratio); +} + +COVER_epoch_info_t COVER_computeEpochs(U32 maxDictSize, + U32 nbDmers, U32 k, U32 passes) +{ + const U32 minEpochSize = k * 10; + COVER_epoch_info_t epochs; + epochs.num = MAX(1, maxDictSize / k / passes); + epochs.size = nbDmers / epochs.num; + if (epochs.size >= minEpochSize) { + assert(epochs.size * epochs.num <= nbDmers); + return epochs; + } + epochs.size = MIN(minEpochSize, nbDmers); + epochs.num = nbDmers / epochs.size; + assert(epochs.size * epochs.num <= nbDmers); + return epochs; +} + +/** + * Given the prepared context build the dictionary. + */ +static size_t COVER_buildDictionary(const COVER_ctx_t *ctx, U32 *freqs, + COVER_map_t *activeDmers, void *dictBuffer, + size_t dictBufferCapacity, + ZDICT_cover_params_t parameters) { + BYTE *const dict = (BYTE *)dictBuffer; + size_t tail = dictBufferCapacity; + /* Divide the data into epochs. We will select one segment from each epoch. */ + const COVER_epoch_info_t epochs = COVER_computeEpochs( + (U32)dictBufferCapacity, (U32)ctx->suffixSize, parameters.k, 4); + const size_t maxZeroScoreRun = MAX(10, MIN(100, epochs.num >> 3)); + size_t zeroScoreRun = 0; + size_t epoch; + DISPLAYLEVEL(2, "Breaking content into %u epochs of size %u\n", + (U32)epochs.num, (U32)epochs.size); + /* Loop through the epochs until there are no more segments or the dictionary + * is full. + */ + for (epoch = 0; tail > 0; epoch = (epoch + 1) % epochs.num) { + const U32 epochBegin = (U32)(epoch * epochs.size); + const U32 epochEnd = epochBegin + epochs.size; + size_t segmentSize; + /* Select a segment */ + COVER_segment_t segment = COVER_selectSegment( + ctx, freqs, activeDmers, epochBegin, epochEnd, parameters); + /* If the segment covers no dmers, then we are out of content. + * There may be new content in other epochs, for continue for some time. + */ + if (segment.score == 0) { + if (++zeroScoreRun >= maxZeroScoreRun) { + break; + } + continue; + } + zeroScoreRun = 0; + /* Trim the segment if necessary and if it is too small then we are done */ + segmentSize = MIN(segment.end - segment.begin + parameters.d - 1, tail); + if (segmentSize < parameters.d) { + break; + } + /* We fill the dictionary from the back to allow the best segments to be + * referenced with the smallest offsets. + */ + tail -= segmentSize; + memcpy(dict + tail, ctx->samples + segment.begin, segmentSize); + DISPLAYUPDATE( + 2, "\r%u%% ", + (unsigned)(((dictBufferCapacity - tail) * 100) / dictBufferCapacity)); + } + DISPLAYLEVEL(2, "\r%79s\r", ""); + return tail; +} + +ZDICTLIB_API size_t ZDICT_trainFromBuffer_cover( + void *dictBuffer, size_t dictBufferCapacity, + const void *samplesBuffer, const size_t *samplesSizes, unsigned nbSamples, + ZDICT_cover_params_t parameters) +{ + BYTE* const dict = (BYTE*)dictBuffer; + COVER_ctx_t ctx; + COVER_map_t activeDmers; + parameters.splitPoint = 1.0; + /* Initialize global data */ + g_displayLevel = (int)parameters.zParams.notificationLevel; + /* Checks */ + if (!COVER_checkParameters(parameters, dictBufferCapacity)) { + DISPLAYLEVEL(1, "Cover parameters incorrect\n"); + return ERROR(parameter_outOfBound); + } + if (nbSamples == 0) { + DISPLAYLEVEL(1, "Cover must have at least one input file\n"); + return ERROR(srcSize_wrong); + } + if (dictBufferCapacity < ZDICT_DICTSIZE_MIN) { + DISPLAYLEVEL(1, "dictBufferCapacity must be at least %u\n", + ZDICT_DICTSIZE_MIN); + return ERROR(dstSize_tooSmall); + } + /* Initialize context and activeDmers */ + { + size_t const initVal = COVER_ctx_init(&ctx, samplesBuffer, samplesSizes, nbSamples, + parameters.d, parameters.splitPoint); + if (ZSTD_isError(initVal)) { + return initVal; + } + } + COVER_warnOnSmallCorpus(dictBufferCapacity, ctx.suffixSize, g_displayLevel); + if (!COVER_map_init(&activeDmers, parameters.k - parameters.d + 1)) { + DISPLAYLEVEL(1, "Failed to allocate dmer map: out of memory\n"); + COVER_ctx_destroy(&ctx); + return ERROR(memory_allocation); + } + + DISPLAYLEVEL(2, "Building dictionary\n"); + { + const size_t tail = + COVER_buildDictionary(&ctx, ctx.freqs, &activeDmers, dictBuffer, + dictBufferCapacity, parameters); + const size_t dictionarySize = ZDICT_finalizeDictionary( + dict, dictBufferCapacity, dict + tail, dictBufferCapacity - tail, + samplesBuffer, samplesSizes, nbSamples, parameters.zParams); + if (!ZSTD_isError(dictionarySize)) { + DISPLAYLEVEL(2, "Constructed dictionary of size %u\n", + (unsigned)dictionarySize); + } + COVER_ctx_destroy(&ctx); + COVER_map_destroy(&activeDmers); + return dictionarySize; + } +} + + + +size_t COVER_checkTotalCompressedSize(const ZDICT_cover_params_t parameters, + const size_t *samplesSizes, const BYTE *samples, + size_t *offsets, + size_t nbTrainSamples, size_t nbSamples, + BYTE *const dict, size_t dictBufferCapacity) { + size_t totalCompressedSize = ERROR(GENERIC); + /* Pointers */ + ZSTD_CCtx *cctx; + ZSTD_CDict *cdict; + void *dst; + /* Local variables */ + size_t dstCapacity; + size_t i; + /* Allocate dst with enough space to compress the maximum sized sample */ + { + size_t maxSampleSize = 0; + i = parameters.splitPoint < 1.0 ? nbTrainSamples : 0; + for (; i < nbSamples; ++i) { + maxSampleSize = MAX(samplesSizes[i], maxSampleSize); + } + dstCapacity = ZSTD_compressBound(maxSampleSize); + dst = malloc(dstCapacity); + } + /* Create the cctx and cdict */ + cctx = ZSTD_createCCtx(); + cdict = ZSTD_createCDict(dict, dictBufferCapacity, + parameters.zParams.compressionLevel); + if (!dst || !cctx || !cdict) { + goto _compressCleanup; + } + /* Compress each sample and sum their sizes (or error) */ + totalCompressedSize = dictBufferCapacity; + i = parameters.splitPoint < 1.0 ? nbTrainSamples : 0; + for (; i < nbSamples; ++i) { + const size_t size = ZSTD_compress_usingCDict( + cctx, dst, dstCapacity, samples + offsets[i], + samplesSizes[i], cdict); + if (ZSTD_isError(size)) { + totalCompressedSize = size; + goto _compressCleanup; + } + totalCompressedSize += size; + } +_compressCleanup: + ZSTD_freeCCtx(cctx); + ZSTD_freeCDict(cdict); + if (dst) { + free(dst); + } + return totalCompressedSize; +} + + +/** + * Initialize the `COVER_best_t`. + */ +void COVER_best_init(COVER_best_t *best) { + if (best==NULL) return; /* compatible with init on NULL */ + (void)ZSTD_pthread_mutex_init(&best->mutex, NULL); + (void)ZSTD_pthread_cond_init(&best->cond, NULL); + best->liveJobs = 0; + best->dict = NULL; + best->dictSize = 0; + best->compressedSize = (size_t)-1; + memset(&best->parameters, 0, sizeof(best->parameters)); +} + +/** + * Wait until liveJobs == 0. + */ +void COVER_best_wait(COVER_best_t *best) { + if (!best) { + return; + } + ZSTD_pthread_mutex_lock(&best->mutex); + while (best->liveJobs != 0) { + ZSTD_pthread_cond_wait(&best->cond, &best->mutex); + } + ZSTD_pthread_mutex_unlock(&best->mutex); +} + +/** + * Call COVER_best_wait() and then destroy the COVER_best_t. + */ +void COVER_best_destroy(COVER_best_t *best) { + if (!best) { + return; + } + COVER_best_wait(best); + if (best->dict) { + free(best->dict); + } + ZSTD_pthread_mutex_destroy(&best->mutex); + ZSTD_pthread_cond_destroy(&best->cond); +} + +/** + * Called when a thread is about to be launched. + * Increments liveJobs. + */ +void COVER_best_start(COVER_best_t *best) { + if (!best) { + return; + } + ZSTD_pthread_mutex_lock(&best->mutex); + ++best->liveJobs; + ZSTD_pthread_mutex_unlock(&best->mutex); +} + +/** + * Called when a thread finishes executing, both on error or success. + * Decrements liveJobs and signals any waiting threads if liveJobs == 0. + * If this dictionary is the best so far save it and its parameters. + */ +void COVER_best_finish(COVER_best_t *best, ZDICT_cover_params_t parameters, + COVER_dictSelection_t selection) { + void* dict = selection.dictContent; + size_t compressedSize = selection.totalCompressedSize; + size_t dictSize = selection.dictSize; + if (!best) { + return; + } + { + size_t liveJobs; + ZSTD_pthread_mutex_lock(&best->mutex); + --best->liveJobs; + liveJobs = best->liveJobs; + /* If the new dictionary is better */ + if (compressedSize < best->compressedSize) { + /* Allocate space if necessary */ + if (!best->dict || best->dictSize < dictSize) { + if (best->dict) { + free(best->dict); + } + best->dict = malloc(dictSize); + if (!best->dict) { + best->compressedSize = ERROR(GENERIC); + best->dictSize = 0; + ZSTD_pthread_cond_signal(&best->cond); + ZSTD_pthread_mutex_unlock(&best->mutex); + return; + } + } + /* Save the dictionary, parameters, and size */ + if (dict) { + memcpy(best->dict, dict, dictSize); + best->dictSize = dictSize; + best->parameters = parameters; + best->compressedSize = compressedSize; + } + } + if (liveJobs == 0) { + ZSTD_pthread_cond_broadcast(&best->cond); + } + ZSTD_pthread_mutex_unlock(&best->mutex); + } +} + +static COVER_dictSelection_t setDictSelection(BYTE* buf, size_t s, size_t csz) +{ + COVER_dictSelection_t ds; + ds.dictContent = buf; + ds.dictSize = s; + ds.totalCompressedSize = csz; + return ds; +} + +COVER_dictSelection_t COVER_dictSelectionError(size_t error) { + return setDictSelection(NULL, 0, error); +} + +unsigned COVER_dictSelectionIsError(COVER_dictSelection_t selection) { + return (ZSTD_isError(selection.totalCompressedSize) || !selection.dictContent); +} + +void COVER_dictSelectionFree(COVER_dictSelection_t selection){ + free(selection.dictContent); +} + +COVER_dictSelection_t COVER_selectDict(BYTE* customDictContent, size_t dictBufferCapacity, + size_t dictContentSize, const BYTE* samplesBuffer, const size_t* samplesSizes, unsigned nbFinalizeSamples, + size_t nbCheckSamples, size_t nbSamples, ZDICT_cover_params_t params, size_t* offsets, size_t totalCompressedSize) { + + size_t largestDict = 0; + size_t largestCompressed = 0; + BYTE* customDictContentEnd = customDictContent + dictContentSize; + + BYTE * largestDictbuffer = (BYTE *)malloc(dictBufferCapacity); + BYTE * candidateDictBuffer = (BYTE *)malloc(dictBufferCapacity); + double regressionTolerance = ((double)params.shrinkDictMaxRegression / 100.0) + 1.00; + + if (!largestDictbuffer || !candidateDictBuffer) { + free(largestDictbuffer); + free(candidateDictBuffer); + return COVER_dictSelectionError(dictContentSize); + } + + /* Initial dictionary size and compressed size */ + memcpy(largestDictbuffer, customDictContent, dictContentSize); + dictContentSize = ZDICT_finalizeDictionary( + largestDictbuffer, dictBufferCapacity, customDictContent, dictContentSize, + samplesBuffer, samplesSizes, nbFinalizeSamples, params.zParams); + + if (ZDICT_isError(dictContentSize)) { + free(largestDictbuffer); + free(candidateDictBuffer); + return COVER_dictSelectionError(dictContentSize); + } + + totalCompressedSize = COVER_checkTotalCompressedSize(params, samplesSizes, + samplesBuffer, offsets, + nbCheckSamples, nbSamples, + largestDictbuffer, dictContentSize); + + if (ZSTD_isError(totalCompressedSize)) { + free(largestDictbuffer); + free(candidateDictBuffer); + return COVER_dictSelectionError(totalCompressedSize); + } + + if (params.shrinkDict == 0) { + free(candidateDictBuffer); + return setDictSelection(largestDictbuffer, dictContentSize, totalCompressedSize); + } + + largestDict = dictContentSize; + largestCompressed = totalCompressedSize; + dictContentSize = ZDICT_DICTSIZE_MIN; + + /* Largest dict is initially at least ZDICT_DICTSIZE_MIN */ + while (dictContentSize < largestDict) { + memcpy(candidateDictBuffer, largestDictbuffer, largestDict); + dictContentSize = ZDICT_finalizeDictionary( + candidateDictBuffer, dictBufferCapacity, customDictContentEnd - dictContentSize, dictContentSize, + samplesBuffer, samplesSizes, nbFinalizeSamples, params.zParams); + + if (ZDICT_isError(dictContentSize)) { + free(largestDictbuffer); + free(candidateDictBuffer); + return COVER_dictSelectionError(dictContentSize); + + } + + totalCompressedSize = COVER_checkTotalCompressedSize(params, samplesSizes, + samplesBuffer, offsets, + nbCheckSamples, nbSamples, + candidateDictBuffer, dictContentSize); + + if (ZSTD_isError(totalCompressedSize)) { + free(largestDictbuffer); + free(candidateDictBuffer); + return COVER_dictSelectionError(totalCompressedSize); + } + + if ((double)totalCompressedSize <= (double)largestCompressed * regressionTolerance) { + free(largestDictbuffer); + return setDictSelection( candidateDictBuffer, dictContentSize, totalCompressedSize ); + } + dictContentSize *= 2; + } + dictContentSize = largestDict; + totalCompressedSize = largestCompressed; + free(candidateDictBuffer); + return setDictSelection( largestDictbuffer, dictContentSize, totalCompressedSize ); +} + +/** + * Parameters for COVER_tryParameters(). + */ +typedef struct COVER_tryParameters_data_s { + const COVER_ctx_t *ctx; + COVER_best_t *best; + size_t dictBufferCapacity; + ZDICT_cover_params_t parameters; +} COVER_tryParameters_data_t; + +/** + * Tries a set of parameters and updates the COVER_best_t with the results. + * This function is thread safe if zstd is compiled with multithreaded support. + * It takes its parameters as an *OWNING* opaque pointer to support threading. + */ +static void COVER_tryParameters(void *opaque) +{ + /* Save parameters as local variables */ + COVER_tryParameters_data_t *const data = (COVER_tryParameters_data_t*)opaque; + const COVER_ctx_t *const ctx = data->ctx; + const ZDICT_cover_params_t parameters = data->parameters; + size_t dictBufferCapacity = data->dictBufferCapacity; + size_t totalCompressedSize = ERROR(GENERIC); + /* Allocate space for hash table, dict, and freqs */ + COVER_map_t activeDmers; + BYTE* const dict = (BYTE*)malloc(dictBufferCapacity); + COVER_dictSelection_t selection = COVER_dictSelectionError(ERROR(GENERIC)); + U32* const freqs = (U32*)malloc(ctx->suffixSize * sizeof(U32)); + if (!COVER_map_init(&activeDmers, parameters.k - parameters.d + 1)) { + DISPLAYLEVEL(1, "Failed to allocate dmer map: out of memory\n"); + goto _cleanup; + } + if (!dict || !freqs) { + DISPLAYLEVEL(1, "Failed to allocate buffers: out of memory\n"); + goto _cleanup; + } + /* Copy the frequencies because we need to modify them */ + memcpy(freqs, ctx->freqs, ctx->suffixSize * sizeof(U32)); + /* Build the dictionary */ + { + const size_t tail = COVER_buildDictionary(ctx, freqs, &activeDmers, dict, + dictBufferCapacity, parameters); + selection = COVER_selectDict(dict + tail, dictBufferCapacity, dictBufferCapacity - tail, + ctx->samples, ctx->samplesSizes, (unsigned)ctx->nbTrainSamples, ctx->nbTrainSamples, ctx->nbSamples, parameters, ctx->offsets, + totalCompressedSize); + + if (COVER_dictSelectionIsError(selection)) { + DISPLAYLEVEL(1, "Failed to select dictionary\n"); + goto _cleanup; + } + } +_cleanup: + free(dict); + COVER_best_finish(data->best, parameters, selection); + free(data); + COVER_map_destroy(&activeDmers); + COVER_dictSelectionFree(selection); + free(freqs); +} + +ZDICTLIB_API size_t ZDICT_optimizeTrainFromBuffer_cover( + void* dictBuffer, size_t dictBufferCapacity, const void* samplesBuffer, + const size_t* samplesSizes, unsigned nbSamples, + ZDICT_cover_params_t* parameters) +{ + /* constants */ + const unsigned nbThreads = parameters->nbThreads; + const double splitPoint = + parameters->splitPoint <= 0.0 ? COVER_DEFAULT_SPLITPOINT : parameters->splitPoint; + const unsigned kMinD = parameters->d == 0 ? 6 : parameters->d; + const unsigned kMaxD = parameters->d == 0 ? 8 : parameters->d; + const unsigned kMinK = parameters->k == 0 ? 50 : parameters->k; + const unsigned kMaxK = parameters->k == 0 ? 2000 : parameters->k; + const unsigned kSteps = parameters->steps == 0 ? 40 : parameters->steps; + const unsigned kStepSize = MAX((kMaxK - kMinK) / kSteps, 1); + const unsigned kIterations = + (1 + (kMaxD - kMinD) / 2) * (1 + (kMaxK - kMinK) / kStepSize); + const unsigned shrinkDict = 0; + /* Local variables */ + const int displayLevel = parameters->zParams.notificationLevel; + unsigned iteration = 1; + unsigned d; + unsigned k; + COVER_best_t best; + POOL_ctx *pool = NULL; + int warned = 0; + + /* Checks */ + if (splitPoint <= 0 || splitPoint > 1) { + LOCALDISPLAYLEVEL(displayLevel, 1, "Incorrect parameters\n"); + return ERROR(parameter_outOfBound); + } + if (kMinK < kMaxD || kMaxK < kMinK) { + LOCALDISPLAYLEVEL(displayLevel, 1, "Incorrect parameters\n"); + return ERROR(parameter_outOfBound); + } + if (nbSamples == 0) { + DISPLAYLEVEL(1, "Cover must have at least one input file\n"); + return ERROR(srcSize_wrong); + } + if (dictBufferCapacity < ZDICT_DICTSIZE_MIN) { + DISPLAYLEVEL(1, "dictBufferCapacity must be at least %u\n", + ZDICT_DICTSIZE_MIN); + return ERROR(dstSize_tooSmall); + } + if (nbThreads > 1) { + pool = POOL_create(nbThreads, 1); + if (!pool) { + return ERROR(memory_allocation); + } + } + /* Initialization */ + COVER_best_init(&best); + /* Turn down global display level to clean up display at level 2 and below */ + g_displayLevel = displayLevel == 0 ? 0 : displayLevel - 1; + /* Loop through d first because each new value needs a new context */ + LOCALDISPLAYLEVEL(displayLevel, 2, "Trying %u different sets of parameters\n", + kIterations); + for (d = kMinD; d <= kMaxD; d += 2) { + /* Initialize the context for this value of d */ + COVER_ctx_t ctx; + LOCALDISPLAYLEVEL(displayLevel, 3, "d=%u\n", d); + { + const size_t initVal = COVER_ctx_init(&ctx, samplesBuffer, samplesSizes, nbSamples, d, splitPoint); + if (ZSTD_isError(initVal)) { + LOCALDISPLAYLEVEL(displayLevel, 1, "Failed to initialize context\n"); + COVER_best_destroy(&best); + POOL_free(pool); + return initVal; + } + } + if (!warned) { + COVER_warnOnSmallCorpus(dictBufferCapacity, ctx.suffixSize, displayLevel); + warned = 1; + } + /* Loop through k reusing the same context */ + for (k = kMinK; k <= kMaxK; k += kStepSize) { + /* Prepare the arguments */ + COVER_tryParameters_data_t *data = (COVER_tryParameters_data_t *)malloc( + sizeof(COVER_tryParameters_data_t)); + LOCALDISPLAYLEVEL(displayLevel, 3, "k=%u\n", k); + if (!data) { + LOCALDISPLAYLEVEL(displayLevel, 1, "Failed to allocate parameters\n"); + COVER_best_destroy(&best); + COVER_ctx_destroy(&ctx); + POOL_free(pool); + return ERROR(memory_allocation); + } + data->ctx = &ctx; + data->best = &best; + data->dictBufferCapacity = dictBufferCapacity; + data->parameters = *parameters; + data->parameters.k = k; + data->parameters.d = d; + data->parameters.splitPoint = splitPoint; + data->parameters.steps = kSteps; + data->parameters.shrinkDict = shrinkDict; + data->parameters.zParams.notificationLevel = g_displayLevel; + /* Check the parameters */ + if (!COVER_checkParameters(data->parameters, dictBufferCapacity)) { + DISPLAYLEVEL(1, "Cover parameters incorrect\n"); + free(data); + continue; + } + /* Call the function and pass ownership of data to it */ + COVER_best_start(&best); + if (pool) { + POOL_add(pool, &COVER_tryParameters, data); + } else { + COVER_tryParameters(data); + } + /* Print status */ + LOCALDISPLAYUPDATE(displayLevel, 2, "\r%u%% ", + (unsigned)((iteration * 100) / kIterations)); + ++iteration; + } + COVER_best_wait(&best); + COVER_ctx_destroy(&ctx); + } + LOCALDISPLAYLEVEL(displayLevel, 2, "\r%79s\r", ""); + /* Fill the output buffer and parameters with output of the best parameters */ + { + const size_t dictSize = best.dictSize; + if (ZSTD_isError(best.compressedSize)) { + const size_t compressedSize = best.compressedSize; + COVER_best_destroy(&best); + POOL_free(pool); + return compressedSize; + } + *parameters = best.parameters; + memcpy(dictBuffer, best.dict, dictSize); + COVER_best_destroy(&best); + POOL_free(pool); + return dictSize; + } +} +/**** ended inlining dictBuilder/cover.c ****/ +/**** start inlining dictBuilder/divsufsort.c ****/ +/* + * divsufsort.c for libdivsufsort-lite + * Copyright (c) 2003-2008 Yuta Mori All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +/*- Compiler specifics -*/ +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wshorten-64-to-32" +#endif + +#if defined(_MSC_VER) +# pragma warning(disable : 4244) +# pragma warning(disable : 4127) /* C4127 : Condition expression is constant */ +#endif + + +/*- Dependencies -*/ +#include +#include +#include + +/**** start inlining divsufsort.h ****/ +/* + * divsufsort.h for libdivsufsort-lite + * Copyright (c) 2003-2008 Yuta Mori All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _DIVSUFSORT_H +#define _DIVSUFSORT_H 1 + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/*- Prototypes -*/ + +/** + * Constructs the suffix array of a given string. + * @param T [0..n-1] The input string. + * @param SA [0..n-1] The output array of suffixes. + * @param n The length of the given string. + * @param openMP enables OpenMP optimization. + * @return 0 if no error occurred, -1 or -2 otherwise. + */ +int +divsufsort(const unsigned char *T, int *SA, int n, int openMP); + +/** + * Constructs the burrows-wheeler transformed string of a given string. + * @param T [0..n-1] The input string. + * @param U [0..n-1] The output string. (can be T) + * @param A [0..n-1] The temporary array. (can be NULL) + * @param n The length of the given string. + * @param num_indexes The length of secondary indexes array. (can be NULL) + * @param indexes The secondary indexes array. (can be NULL) + * @param openMP enables OpenMP optimization. + * @return The primary index if no error occurred, -1 or -2 otherwise. + */ +int +divbwt(const unsigned char *T, unsigned char *U, int *A, int n, unsigned char * num_indexes, int * indexes, int openMP); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* _DIVSUFSORT_H */ +/**** ended inlining divsufsort.h ****/ + +/*- Constants -*/ +#if defined(INLINE) +# undef INLINE +#endif +#if !defined(INLINE) +# define INLINE __inline +#endif +#if defined(ALPHABET_SIZE) && (ALPHABET_SIZE < 1) +# undef ALPHABET_SIZE +#endif +#if !defined(ALPHABET_SIZE) +# define ALPHABET_SIZE (256) +#endif +#define BUCKET_A_SIZE (ALPHABET_SIZE) +#define BUCKET_B_SIZE (ALPHABET_SIZE * ALPHABET_SIZE) +#if defined(SS_INSERTIONSORT_THRESHOLD) +# if SS_INSERTIONSORT_THRESHOLD < 1 +# undef SS_INSERTIONSORT_THRESHOLD +# define SS_INSERTIONSORT_THRESHOLD (1) +# endif +#else +# define SS_INSERTIONSORT_THRESHOLD (8) +#endif +#if defined(SS_BLOCKSIZE) +# if SS_BLOCKSIZE < 0 +# undef SS_BLOCKSIZE +# define SS_BLOCKSIZE (0) +# elif 32768 <= SS_BLOCKSIZE +# undef SS_BLOCKSIZE +# define SS_BLOCKSIZE (32767) +# endif +#else +# define SS_BLOCKSIZE (1024) +#endif +/* minstacksize = log(SS_BLOCKSIZE) / log(3) * 2 */ +#if SS_BLOCKSIZE == 0 +# define SS_MISORT_STACKSIZE (96) +#elif SS_BLOCKSIZE <= 4096 +# define SS_MISORT_STACKSIZE (16) +#else +# define SS_MISORT_STACKSIZE (24) +#endif +#define SS_SMERGE_STACKSIZE (32) +#define TR_INSERTIONSORT_THRESHOLD (8) +#define TR_STACKSIZE (64) + + +/*- Macros -*/ +#ifndef SWAP +# define SWAP(_a, _b) do { t = (_a); (_a) = (_b); (_b) = t; } while(0) +#endif /* SWAP */ +#ifndef MIN +# define MIN(_a, _b) (((_a) < (_b)) ? (_a) : (_b)) +#endif /* MIN */ +#ifndef MAX +# define MAX(_a, _b) (((_a) > (_b)) ? (_a) : (_b)) +#endif /* MAX */ +#define STACK_PUSH(_a, _b, _c, _d)\ + do {\ + assert(ssize < STACK_SIZE);\ + stack[ssize].a = (_a), stack[ssize].b = (_b),\ + stack[ssize].c = (_c), stack[ssize++].d = (_d);\ + } while(0) +#define STACK_PUSH5(_a, _b, _c, _d, _e)\ + do {\ + assert(ssize < STACK_SIZE);\ + stack[ssize].a = (_a), stack[ssize].b = (_b),\ + stack[ssize].c = (_c), stack[ssize].d = (_d), stack[ssize++].e = (_e);\ + } while(0) +#define STACK_POP(_a, _b, _c, _d)\ + do {\ + assert(0 <= ssize);\ + if(ssize == 0) { return; }\ + (_a) = stack[--ssize].a, (_b) = stack[ssize].b,\ + (_c) = stack[ssize].c, (_d) = stack[ssize].d;\ + } while(0) +#define STACK_POP5(_a, _b, _c, _d, _e)\ + do {\ + assert(0 <= ssize);\ + if(ssize == 0) { return; }\ + (_a) = stack[--ssize].a, (_b) = stack[ssize].b,\ + (_c) = stack[ssize].c, (_d) = stack[ssize].d, (_e) = stack[ssize].e;\ + } while(0) +#define BUCKET_A(_c0) bucket_A[(_c0)] +#if ALPHABET_SIZE == 256 +#define BUCKET_B(_c0, _c1) (bucket_B[((_c1) << 8) | (_c0)]) +#define BUCKET_BSTAR(_c0, _c1) (bucket_B[((_c0) << 8) | (_c1)]) +#else +#define BUCKET_B(_c0, _c1) (bucket_B[(_c1) * ALPHABET_SIZE + (_c0)]) +#define BUCKET_BSTAR(_c0, _c1) (bucket_B[(_c0) * ALPHABET_SIZE + (_c1)]) +#endif + + +/*- Private Functions -*/ + +static const int lg_table[256]= { + -1,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 +}; + +#if (SS_BLOCKSIZE == 0) || (SS_INSERTIONSORT_THRESHOLD < SS_BLOCKSIZE) + +static INLINE +int +ss_ilg(int n) { +#if SS_BLOCKSIZE == 0 + return (n & 0xffff0000) ? + ((n & 0xff000000) ? + 24 + lg_table[(n >> 24) & 0xff] : + 16 + lg_table[(n >> 16) & 0xff]) : + ((n & 0x0000ff00) ? + 8 + lg_table[(n >> 8) & 0xff] : + 0 + lg_table[(n >> 0) & 0xff]); +#elif SS_BLOCKSIZE < 256 + return lg_table[n]; +#else + return (n & 0xff00) ? + 8 + lg_table[(n >> 8) & 0xff] : + 0 + lg_table[(n >> 0) & 0xff]; +#endif +} + +#endif /* (SS_BLOCKSIZE == 0) || (SS_INSERTIONSORT_THRESHOLD < SS_BLOCKSIZE) */ + +#if SS_BLOCKSIZE != 0 + +static const int sqq_table[256] = { + 0, 16, 22, 27, 32, 35, 39, 42, 45, 48, 50, 53, 55, 57, 59, 61, + 64, 65, 67, 69, 71, 73, 75, 76, 78, 80, 81, 83, 84, 86, 87, 89, + 90, 91, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 106, 107, 108, 109, +110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, +128, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, +143, 144, 144, 145, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 155, +156, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, +169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178, 179, 180, +181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 189, 189, 190, 191, +192, 192, 193, 193, 194, 195, 195, 196, 197, 197, 198, 199, 199, 200, 201, 201, +202, 203, 203, 204, 204, 205, 206, 206, 207, 208, 208, 209, 209, 210, 211, 211, +212, 212, 213, 214, 214, 215, 215, 216, 217, 217, 218, 218, 219, 219, 220, 221, +221, 222, 222, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 229, 229, 230, +230, 231, 231, 232, 232, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, +239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, +247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, 255 +}; + +static INLINE +int +ss_isqrt(int x) { + int y, e; + + if(x >= (SS_BLOCKSIZE * SS_BLOCKSIZE)) { return SS_BLOCKSIZE; } + e = (x & 0xffff0000) ? + ((x & 0xff000000) ? + 24 + lg_table[(x >> 24) & 0xff] : + 16 + lg_table[(x >> 16) & 0xff]) : + ((x & 0x0000ff00) ? + 8 + lg_table[(x >> 8) & 0xff] : + 0 + lg_table[(x >> 0) & 0xff]); + + if(e >= 16) { + y = sqq_table[x >> ((e - 6) - (e & 1))] << ((e >> 1) - 7); + if(e >= 24) { y = (y + 1 + x / y) >> 1; } + y = (y + 1 + x / y) >> 1; + } else if(e >= 8) { + y = (sqq_table[x >> ((e - 6) - (e & 1))] >> (7 - (e >> 1))) + 1; + } else { + return sqq_table[x] >> 4; + } + + return (x < (y * y)) ? y - 1 : y; +} + +#endif /* SS_BLOCKSIZE != 0 */ + + +/*---------------------------------------------------------------------------*/ + +/* Compares two suffixes. */ +static INLINE +int +ss_compare(const unsigned char *T, + const int *p1, const int *p2, + int depth) { + const unsigned char *U1, *U2, *U1n, *U2n; + + for(U1 = T + depth + *p1, + U2 = T + depth + *p2, + U1n = T + *(p1 + 1) + 2, + U2n = T + *(p2 + 1) + 2; + (U1 < U1n) && (U2 < U2n) && (*U1 == *U2); + ++U1, ++U2) { + } + + return U1 < U1n ? + (U2 < U2n ? *U1 - *U2 : 1) : + (U2 < U2n ? -1 : 0); +} + + +/*---------------------------------------------------------------------------*/ + +#if (SS_BLOCKSIZE != 1) && (SS_INSERTIONSORT_THRESHOLD != 1) + +/* Insertionsort for small size groups */ +static +void +ss_insertionsort(const unsigned char *T, const int *PA, + int *first, int *last, int depth) { + int *i, *j; + int t; + int r; + + for(i = last - 2; first <= i; --i) { + for(t = *i, j = i + 1; 0 < (r = ss_compare(T, PA + t, PA + *j, depth));) { + do { *(j - 1) = *j; } while((++j < last) && (*j < 0)); + if(last <= j) { break; } + } + if(r == 0) { *j = ~*j; } + *(j - 1) = t; + } +} + +#endif /* (SS_BLOCKSIZE != 1) && (SS_INSERTIONSORT_THRESHOLD != 1) */ + + +/*---------------------------------------------------------------------------*/ + +#if (SS_BLOCKSIZE == 0) || (SS_INSERTIONSORT_THRESHOLD < SS_BLOCKSIZE) + +static INLINE +void +ss_fixdown(const unsigned char *Td, const int *PA, + int *SA, int i, int size) { + int j, k; + int v; + int c, d, e; + + for(v = SA[i], c = Td[PA[v]]; (j = 2 * i + 1) < size; SA[i] = SA[k], i = k) { + d = Td[PA[SA[k = j++]]]; + if(d < (e = Td[PA[SA[j]]])) { k = j; d = e; } + if(d <= c) { break; } + } + SA[i] = v; +} + +/* Simple top-down heapsort. */ +static +void +ss_heapsort(const unsigned char *Td, const int *PA, int *SA, int size) { + int i, m; + int t; + + m = size; + if((size % 2) == 0) { + m--; + if(Td[PA[SA[m / 2]]] < Td[PA[SA[m]]]) { SWAP(SA[m], SA[m / 2]); } + } + + for(i = m / 2 - 1; 0 <= i; --i) { ss_fixdown(Td, PA, SA, i, m); } + if((size % 2) == 0) { SWAP(SA[0], SA[m]); ss_fixdown(Td, PA, SA, 0, m); } + for(i = m - 1; 0 < i; --i) { + t = SA[0], SA[0] = SA[i]; + ss_fixdown(Td, PA, SA, 0, i); + SA[i] = t; + } +} + + +/*---------------------------------------------------------------------------*/ + +/* Returns the median of three elements. */ +static INLINE +int * +ss_median3(const unsigned char *Td, const int *PA, + int *v1, int *v2, int *v3) { + int *t; + if(Td[PA[*v1]] > Td[PA[*v2]]) { SWAP(v1, v2); } + if(Td[PA[*v2]] > Td[PA[*v3]]) { + if(Td[PA[*v1]] > Td[PA[*v3]]) { return v1; } + else { return v3; } + } + return v2; +} + +/* Returns the median of five elements. */ +static INLINE +int * +ss_median5(const unsigned char *Td, const int *PA, + int *v1, int *v2, int *v3, int *v4, int *v5) { + int *t; + if(Td[PA[*v2]] > Td[PA[*v3]]) { SWAP(v2, v3); } + if(Td[PA[*v4]] > Td[PA[*v5]]) { SWAP(v4, v5); } + if(Td[PA[*v2]] > Td[PA[*v4]]) { SWAP(v2, v4); SWAP(v3, v5); } + if(Td[PA[*v1]] > Td[PA[*v3]]) { SWAP(v1, v3); } + if(Td[PA[*v1]] > Td[PA[*v4]]) { SWAP(v1, v4); SWAP(v3, v5); } + if(Td[PA[*v3]] > Td[PA[*v4]]) { return v4; } + return v3; +} + +/* Returns the pivot element. */ +static INLINE +int * +ss_pivot(const unsigned char *Td, const int *PA, int *first, int *last) { + int *middle; + int t; + + t = last - first; + middle = first + t / 2; + + if(t <= 512) { + if(t <= 32) { + return ss_median3(Td, PA, first, middle, last - 1); + } else { + t >>= 2; + return ss_median5(Td, PA, first, first + t, middle, last - 1 - t, last - 1); + } + } + t >>= 3; + first = ss_median3(Td, PA, first, first + t, first + (t << 1)); + middle = ss_median3(Td, PA, middle - t, middle, middle + t); + last = ss_median3(Td, PA, last - 1 - (t << 1), last - 1 - t, last - 1); + return ss_median3(Td, PA, first, middle, last); +} + + +/*---------------------------------------------------------------------------*/ + +/* Binary partition for substrings. */ +static INLINE +int * +ss_partition(const int *PA, + int *first, int *last, int depth) { + int *a, *b; + int t; + for(a = first - 1, b = last;;) { + for(; (++a < b) && ((PA[*a] + depth) >= (PA[*a + 1] + 1));) { *a = ~*a; } + for(; (a < --b) && ((PA[*b] + depth) < (PA[*b + 1] + 1));) { } + if(b <= a) { break; } + t = ~*b; + *b = *a; + *a = t; + } + if(first < a) { *first = ~*first; } + return a; +} + +/* Multikey introsort for medium size groups. */ +static +void +ss_mintrosort(const unsigned char *T, const int *PA, + int *first, int *last, + int depth) { +#define STACK_SIZE SS_MISORT_STACKSIZE + struct { int *a, *b, c; int d; } stack[STACK_SIZE]; + const unsigned char *Td; + int *a, *b, *c, *d, *e, *f; + int s, t; + int ssize; + int limit; + int v, x = 0; + + for(ssize = 0, limit = ss_ilg(last - first);;) { + + if((last - first) <= SS_INSERTIONSORT_THRESHOLD) { +#if 1 < SS_INSERTIONSORT_THRESHOLD + if(1 < (last - first)) { ss_insertionsort(T, PA, first, last, depth); } +#endif + STACK_POP(first, last, depth, limit); + continue; + } + + Td = T + depth; + if(limit-- == 0) { ss_heapsort(Td, PA, first, last - first); } + if(limit < 0) { + for(a = first + 1, v = Td[PA[*first]]; a < last; ++a) { + if((x = Td[PA[*a]]) != v) { + if(1 < (a - first)) { break; } + v = x; + first = a; + } + } + if(Td[PA[*first] - 1] < v) { + first = ss_partition(PA, first, a, depth); + } + if((a - first) <= (last - a)) { + if(1 < (a - first)) { + STACK_PUSH(a, last, depth, -1); + last = a, depth += 1, limit = ss_ilg(a - first); + } else { + first = a, limit = -1; + } + } else { + if(1 < (last - a)) { + STACK_PUSH(first, a, depth + 1, ss_ilg(a - first)); + first = a, limit = -1; + } else { + last = a, depth += 1, limit = ss_ilg(a - first); + } + } + continue; + } + + /* choose pivot */ + a = ss_pivot(Td, PA, first, last); + v = Td[PA[*a]]; + SWAP(*first, *a); + + /* partition */ + for(b = first; (++b < last) && ((x = Td[PA[*b]]) == v);) { } + if(((a = b) < last) && (x < v)) { + for(; (++b < last) && ((x = Td[PA[*b]]) <= v);) { + if(x == v) { SWAP(*b, *a); ++a; } + } + } + for(c = last; (b < --c) && ((x = Td[PA[*c]]) == v);) { } + if((b < (d = c)) && (x > v)) { + for(; (b < --c) && ((x = Td[PA[*c]]) >= v);) { + if(x == v) { SWAP(*c, *d); --d; } + } + } + for(; b < c;) { + SWAP(*b, *c); + for(; (++b < c) && ((x = Td[PA[*b]]) <= v);) { + if(x == v) { SWAP(*b, *a); ++a; } + } + for(; (b < --c) && ((x = Td[PA[*c]]) >= v);) { + if(x == v) { SWAP(*c, *d); --d; } + } + } + + if(a <= d) { + c = b - 1; + + if((s = a - first) > (t = b - a)) { s = t; } + for(e = first, f = b - s; 0 < s; --s, ++e, ++f) { SWAP(*e, *f); } + if((s = d - c) > (t = last - d - 1)) { s = t; } + for(e = b, f = last - s; 0 < s; --s, ++e, ++f) { SWAP(*e, *f); } + + a = first + (b - a), c = last - (d - c); + b = (v <= Td[PA[*a] - 1]) ? a : ss_partition(PA, a, c, depth); + + if((a - first) <= (last - c)) { + if((last - c) <= (c - b)) { + STACK_PUSH(b, c, depth + 1, ss_ilg(c - b)); + STACK_PUSH(c, last, depth, limit); + last = a; + } else if((a - first) <= (c - b)) { + STACK_PUSH(c, last, depth, limit); + STACK_PUSH(b, c, depth + 1, ss_ilg(c - b)); + last = a; + } else { + STACK_PUSH(c, last, depth, limit); + STACK_PUSH(first, a, depth, limit); + first = b, last = c, depth += 1, limit = ss_ilg(c - b); + } + } else { + if((a - first) <= (c - b)) { + STACK_PUSH(b, c, depth + 1, ss_ilg(c - b)); + STACK_PUSH(first, a, depth, limit); + first = c; + } else if((last - c) <= (c - b)) { + STACK_PUSH(first, a, depth, limit); + STACK_PUSH(b, c, depth + 1, ss_ilg(c - b)); + first = c; + } else { + STACK_PUSH(first, a, depth, limit); + STACK_PUSH(c, last, depth, limit); + first = b, last = c, depth += 1, limit = ss_ilg(c - b); + } + } + } else { + limit += 1; + if(Td[PA[*first] - 1] < v) { + first = ss_partition(PA, first, last, depth); + limit = ss_ilg(last - first); + } + depth += 1; + } + } +#undef STACK_SIZE +} + +#endif /* (SS_BLOCKSIZE == 0) || (SS_INSERTIONSORT_THRESHOLD < SS_BLOCKSIZE) */ + + +/*---------------------------------------------------------------------------*/ + +#if SS_BLOCKSIZE != 0 + +static INLINE +void +ss_blockswap(int *a, int *b, int n) { + int t; + for(; 0 < n; --n, ++a, ++b) { + t = *a, *a = *b, *b = t; + } +} + +static INLINE +void +ss_rotate(int *first, int *middle, int *last) { + int *a, *b, t; + int l, r; + l = middle - first, r = last - middle; + for(; (0 < l) && (0 < r);) { + if(l == r) { ss_blockswap(first, middle, l); break; } + if(l < r) { + a = last - 1, b = middle - 1; + t = *a; + do { + *a-- = *b, *b-- = *a; + if(b < first) { + *a = t; + last = a; + if((r -= l + 1) <= l) { break; } + a -= 1, b = middle - 1; + t = *a; + } + } while(1); + } else { + a = first, b = middle; + t = *a; + do { + *a++ = *b, *b++ = *a; + if(last <= b) { + *a = t; + first = a + 1; + if((l -= r + 1) <= r) { break; } + a += 1, b = middle; + t = *a; + } + } while(1); + } + } +} + + +/*---------------------------------------------------------------------------*/ + +static +void +ss_inplacemerge(const unsigned char *T, const int *PA, + int *first, int *middle, int *last, + int depth) { + const int *p; + int *a, *b; + int len, half; + int q, r; + int x; + + for(;;) { + if(*(last - 1) < 0) { x = 1; p = PA + ~*(last - 1); } + else { x = 0; p = PA + *(last - 1); } + for(a = first, len = middle - first, half = len >> 1, r = -1; + 0 < len; + len = half, half >>= 1) { + b = a + half; + q = ss_compare(T, PA + ((0 <= *b) ? *b : ~*b), p, depth); + if(q < 0) { + a = b + 1; + half -= (len & 1) ^ 1; + } else { + r = q; + } + } + if(a < middle) { + if(r == 0) { *a = ~*a; } + ss_rotate(a, middle, last); + last -= middle - a; + middle = a; + if(first == middle) { break; } + } + --last; + if(x != 0) { while(*--last < 0) { } } + if(middle == last) { break; } + } +} + + +/*---------------------------------------------------------------------------*/ + +/* Merge-forward with internal buffer. */ +static +void +ss_mergeforward(const unsigned char *T, const int *PA, + int *first, int *middle, int *last, + int *buf, int depth) { + int *a, *b, *c, *bufend; + int t; + int r; + + bufend = buf + (middle - first) - 1; + ss_blockswap(buf, first, middle - first); + + for(t = *(a = first), b = buf, c = middle;;) { + r = ss_compare(T, PA + *b, PA + *c, depth); + if(r < 0) { + do { + *a++ = *b; + if(bufend <= b) { *bufend = t; return; } + *b++ = *a; + } while(*b < 0); + } else if(r > 0) { + do { + *a++ = *c, *c++ = *a; + if(last <= c) { + while(b < bufend) { *a++ = *b, *b++ = *a; } + *a = *b, *b = t; + return; + } + } while(*c < 0); + } else { + *c = ~*c; + do { + *a++ = *b; + if(bufend <= b) { *bufend = t; return; } + *b++ = *a; + } while(*b < 0); + + do { + *a++ = *c, *c++ = *a; + if(last <= c) { + while(b < bufend) { *a++ = *b, *b++ = *a; } + *a = *b, *b = t; + return; + } + } while(*c < 0); + } + } +} + +/* Merge-backward with internal buffer. */ +static +void +ss_mergebackward(const unsigned char *T, const int *PA, + int *first, int *middle, int *last, + int *buf, int depth) { + const int *p1, *p2; + int *a, *b, *c, *bufend; + int t; + int r; + int x; + + bufend = buf + (last - middle) - 1; + ss_blockswap(buf, middle, last - middle); + + x = 0; + if(*bufend < 0) { p1 = PA + ~*bufend; x |= 1; } + else { p1 = PA + *bufend; } + if(*(middle - 1) < 0) { p2 = PA + ~*(middle - 1); x |= 2; } + else { p2 = PA + *(middle - 1); } + for(t = *(a = last - 1), b = bufend, c = middle - 1;;) { + r = ss_compare(T, p1, p2, depth); + if(0 < r) { + if(x & 1) { do { *a-- = *b, *b-- = *a; } while(*b < 0); x ^= 1; } + *a-- = *b; + if(b <= buf) { *buf = t; break; } + *b-- = *a; + if(*b < 0) { p1 = PA + ~*b; x |= 1; } + else { p1 = PA + *b; } + } else if(r < 0) { + if(x & 2) { do { *a-- = *c, *c-- = *a; } while(*c < 0); x ^= 2; } + *a-- = *c, *c-- = *a; + if(c < first) { + while(buf < b) { *a-- = *b, *b-- = *a; } + *a = *b, *b = t; + break; + } + if(*c < 0) { p2 = PA + ~*c; x |= 2; } + else { p2 = PA + *c; } + } else { + if(x & 1) { do { *a-- = *b, *b-- = *a; } while(*b < 0); x ^= 1; } + *a-- = ~*b; + if(b <= buf) { *buf = t; break; } + *b-- = *a; + if(x & 2) { do { *a-- = *c, *c-- = *a; } while(*c < 0); x ^= 2; } + *a-- = *c, *c-- = *a; + if(c < first) { + while(buf < b) { *a-- = *b, *b-- = *a; } + *a = *b, *b = t; + break; + } + if(*b < 0) { p1 = PA + ~*b; x |= 1; } + else { p1 = PA + *b; } + if(*c < 0) { p2 = PA + ~*c; x |= 2; } + else { p2 = PA + *c; } + } + } +} + +/* D&C based merge. */ +static +void +ss_swapmerge(const unsigned char *T, const int *PA, + int *first, int *middle, int *last, + int *buf, int bufsize, int depth) { +#define STACK_SIZE SS_SMERGE_STACKSIZE +#define GETIDX(a) ((0 <= (a)) ? (a) : (~(a))) +#define MERGE_CHECK(a, b, c)\ + do {\ + if(((c) & 1) ||\ + (((c) & 2) && (ss_compare(T, PA + GETIDX(*((a) - 1)), PA + *(a), depth) == 0))) {\ + *(a) = ~*(a);\ + }\ + if(((c) & 4) && ((ss_compare(T, PA + GETIDX(*((b) - 1)), PA + *(b), depth) == 0))) {\ + *(b) = ~*(b);\ + }\ + } while(0) + struct { int *a, *b, *c; int d; } stack[STACK_SIZE]; + int *l, *r, *lm, *rm; + int m, len, half; + int ssize; + int check, next; + + for(check = 0, ssize = 0;;) { + if((last - middle) <= bufsize) { + if((first < middle) && (middle < last)) { + ss_mergebackward(T, PA, first, middle, last, buf, depth); + } + MERGE_CHECK(first, last, check); + STACK_POP(first, middle, last, check); + continue; + } + + if((middle - first) <= bufsize) { + if(first < middle) { + ss_mergeforward(T, PA, first, middle, last, buf, depth); + } + MERGE_CHECK(first, last, check); + STACK_POP(first, middle, last, check); + continue; + } + + for(m = 0, len = MIN(middle - first, last - middle), half = len >> 1; + 0 < len; + len = half, half >>= 1) { + if(ss_compare(T, PA + GETIDX(*(middle + m + half)), + PA + GETIDX(*(middle - m - half - 1)), depth) < 0) { + m += half + 1; + half -= (len & 1) ^ 1; + } + } + + if(0 < m) { + lm = middle - m, rm = middle + m; + ss_blockswap(lm, middle, m); + l = r = middle, next = 0; + if(rm < last) { + if(*rm < 0) { + *rm = ~*rm; + if(first < lm) { for(; *--l < 0;) { } next |= 4; } + next |= 1; + } else if(first < lm) { + for(; *r < 0; ++r) { } + next |= 2; + } + } + + if((l - first) <= (last - r)) { + STACK_PUSH(r, rm, last, (next & 3) | (check & 4)); + middle = lm, last = l, check = (check & 3) | (next & 4); + } else { + if((next & 2) && (r == middle)) { next ^= 6; } + STACK_PUSH(first, lm, l, (check & 3) | (next & 4)); + first = r, middle = rm, check = (next & 3) | (check & 4); + } + } else { + if(ss_compare(T, PA + GETIDX(*(middle - 1)), PA + *middle, depth) == 0) { + *middle = ~*middle; + } + MERGE_CHECK(first, last, check); + STACK_POP(first, middle, last, check); + } + } +#undef STACK_SIZE +} + +#endif /* SS_BLOCKSIZE != 0 */ + + +/*---------------------------------------------------------------------------*/ + +/* Substring sort */ +static +void +sssort(const unsigned char *T, const int *PA, + int *first, int *last, + int *buf, int bufsize, + int depth, int n, int lastsuffix) { + int *a; +#if SS_BLOCKSIZE != 0 + int *b, *middle, *curbuf; + int j, k, curbufsize, limit; +#endif + int i; + + if(lastsuffix != 0) { ++first; } + +#if SS_BLOCKSIZE == 0 + ss_mintrosort(T, PA, first, last, depth); +#else + if((bufsize < SS_BLOCKSIZE) && + (bufsize < (last - first)) && + (bufsize < (limit = ss_isqrt(last - first)))) { + if(SS_BLOCKSIZE < limit) { limit = SS_BLOCKSIZE; } + buf = middle = last - limit, bufsize = limit; + } else { + middle = last, limit = 0; + } + for(a = first, i = 0; SS_BLOCKSIZE < (middle - a); a += SS_BLOCKSIZE, ++i) { +#if SS_INSERTIONSORT_THRESHOLD < SS_BLOCKSIZE + ss_mintrosort(T, PA, a, a + SS_BLOCKSIZE, depth); +#elif 1 < SS_BLOCKSIZE + ss_insertionsort(T, PA, a, a + SS_BLOCKSIZE, depth); +#endif + curbufsize = last - (a + SS_BLOCKSIZE); + curbuf = a + SS_BLOCKSIZE; + if(curbufsize <= bufsize) { curbufsize = bufsize, curbuf = buf; } + for(b = a, k = SS_BLOCKSIZE, j = i; j & 1; b -= k, k <<= 1, j >>= 1) { + ss_swapmerge(T, PA, b - k, b, b + k, curbuf, curbufsize, depth); + } + } +#if SS_INSERTIONSORT_THRESHOLD < SS_BLOCKSIZE + ss_mintrosort(T, PA, a, middle, depth); +#elif 1 < SS_BLOCKSIZE + ss_insertionsort(T, PA, a, middle, depth); +#endif + for(k = SS_BLOCKSIZE; i != 0; k <<= 1, i >>= 1) { + if(i & 1) { + ss_swapmerge(T, PA, a - k, a, middle, buf, bufsize, depth); + a -= k; + } + } + if(limit != 0) { +#if SS_INSERTIONSORT_THRESHOLD < SS_BLOCKSIZE + ss_mintrosort(T, PA, middle, last, depth); +#elif 1 < SS_BLOCKSIZE + ss_insertionsort(T, PA, middle, last, depth); +#endif + ss_inplacemerge(T, PA, first, middle, last, depth); + } +#endif + + if(lastsuffix != 0) { + /* Insert last type B* suffix. */ + int PAi[2]; PAi[0] = PA[*(first - 1)], PAi[1] = n - 2; + for(a = first, i = *(first - 1); + (a < last) && ((*a < 0) || (0 < ss_compare(T, &(PAi[0]), PA + *a, depth))); + ++a) { + *(a - 1) = *a; + } + *(a - 1) = i; + } +} + + +/*---------------------------------------------------------------------------*/ + +static INLINE +int +tr_ilg(int n) { + return (n & 0xffff0000) ? + ((n & 0xff000000) ? + 24 + lg_table[(n >> 24) & 0xff] : + 16 + lg_table[(n >> 16) & 0xff]) : + ((n & 0x0000ff00) ? + 8 + lg_table[(n >> 8) & 0xff] : + 0 + lg_table[(n >> 0) & 0xff]); +} + + +/*---------------------------------------------------------------------------*/ + +/* Simple insertionsort for small size groups. */ +static +void +tr_insertionsort(const int *ISAd, int *first, int *last) { + int *a, *b; + int t, r; + + for(a = first + 1; a < last; ++a) { + for(t = *a, b = a - 1; 0 > (r = ISAd[t] - ISAd[*b]);) { + do { *(b + 1) = *b; } while((first <= --b) && (*b < 0)); + if(b < first) { break; } + } + if(r == 0) { *b = ~*b; } + *(b + 1) = t; + } +} + + +/*---------------------------------------------------------------------------*/ + +static INLINE +void +tr_fixdown(const int *ISAd, int *SA, int i, int size) { + int j, k; + int v; + int c, d, e; + + for(v = SA[i], c = ISAd[v]; (j = 2 * i + 1) < size; SA[i] = SA[k], i = k) { + d = ISAd[SA[k = j++]]; + if(d < (e = ISAd[SA[j]])) { k = j; d = e; } + if(d <= c) { break; } + } + SA[i] = v; +} + +/* Simple top-down heapsort. */ +static +void +tr_heapsort(const int *ISAd, int *SA, int size) { + int i, m; + int t; + + m = size; + if((size % 2) == 0) { + m--; + if(ISAd[SA[m / 2]] < ISAd[SA[m]]) { SWAP(SA[m], SA[m / 2]); } + } + + for(i = m / 2 - 1; 0 <= i; --i) { tr_fixdown(ISAd, SA, i, m); } + if((size % 2) == 0) { SWAP(SA[0], SA[m]); tr_fixdown(ISAd, SA, 0, m); } + for(i = m - 1; 0 < i; --i) { + t = SA[0], SA[0] = SA[i]; + tr_fixdown(ISAd, SA, 0, i); + SA[i] = t; + } +} + + +/*---------------------------------------------------------------------------*/ + +/* Returns the median of three elements. */ +static INLINE +int * +tr_median3(const int *ISAd, int *v1, int *v2, int *v3) { + int *t; + if(ISAd[*v1] > ISAd[*v2]) { SWAP(v1, v2); } + if(ISAd[*v2] > ISAd[*v3]) { + if(ISAd[*v1] > ISAd[*v3]) { return v1; } + else { return v3; } + } + return v2; +} + +/* Returns the median of five elements. */ +static INLINE +int * +tr_median5(const int *ISAd, + int *v1, int *v2, int *v3, int *v4, int *v5) { + int *t; + if(ISAd[*v2] > ISAd[*v3]) { SWAP(v2, v3); } + if(ISAd[*v4] > ISAd[*v5]) { SWAP(v4, v5); } + if(ISAd[*v2] > ISAd[*v4]) { SWAP(v2, v4); SWAP(v3, v5); } + if(ISAd[*v1] > ISAd[*v3]) { SWAP(v1, v3); } + if(ISAd[*v1] > ISAd[*v4]) { SWAP(v1, v4); SWAP(v3, v5); } + if(ISAd[*v3] > ISAd[*v4]) { return v4; } + return v3; +} + +/* Returns the pivot element. */ +static INLINE +int * +tr_pivot(const int *ISAd, int *first, int *last) { + int *middle; + int t; + + t = last - first; + middle = first + t / 2; + + if(t <= 512) { + if(t <= 32) { + return tr_median3(ISAd, first, middle, last - 1); + } else { + t >>= 2; + return tr_median5(ISAd, first, first + t, middle, last - 1 - t, last - 1); + } + } + t >>= 3; + first = tr_median3(ISAd, first, first + t, first + (t << 1)); + middle = tr_median3(ISAd, middle - t, middle, middle + t); + last = tr_median3(ISAd, last - 1 - (t << 1), last - 1 - t, last - 1); + return tr_median3(ISAd, first, middle, last); +} + + +/*---------------------------------------------------------------------------*/ + +typedef struct _trbudget_t trbudget_t; +struct _trbudget_t { + int chance; + int remain; + int incval; + int count; +}; + +static INLINE +void +trbudget_init(trbudget_t *budget, int chance, int incval) { + budget->chance = chance; + budget->remain = budget->incval = incval; +} + +static INLINE +int +trbudget_check(trbudget_t *budget, int size) { + if(size <= budget->remain) { budget->remain -= size; return 1; } + if(budget->chance == 0) { budget->count += size; return 0; } + budget->remain += budget->incval - size; + budget->chance -= 1; + return 1; +} + + +/*---------------------------------------------------------------------------*/ + +static INLINE +void +tr_partition(const int *ISAd, + int *first, int *middle, int *last, + int **pa, int **pb, int v) { + int *a, *b, *c, *d, *e, *f; + int t, s; + int x = 0; + + for(b = middle - 1; (++b < last) && ((x = ISAd[*b]) == v);) { } + if(((a = b) < last) && (x < v)) { + for(; (++b < last) && ((x = ISAd[*b]) <= v);) { + if(x == v) { SWAP(*b, *a); ++a; } + } + } + for(c = last; (b < --c) && ((x = ISAd[*c]) == v);) { } + if((b < (d = c)) && (x > v)) { + for(; (b < --c) && ((x = ISAd[*c]) >= v);) { + if(x == v) { SWAP(*c, *d); --d; } + } + } + for(; b < c;) { + SWAP(*b, *c); + for(; (++b < c) && ((x = ISAd[*b]) <= v);) { + if(x == v) { SWAP(*b, *a); ++a; } + } + for(; (b < --c) && ((x = ISAd[*c]) >= v);) { + if(x == v) { SWAP(*c, *d); --d; } + } + } + + if(a <= d) { + c = b - 1; + if((s = a - first) > (t = b - a)) { s = t; } + for(e = first, f = b - s; 0 < s; --s, ++e, ++f) { SWAP(*e, *f); } + if((s = d - c) > (t = last - d - 1)) { s = t; } + for(e = b, f = last - s; 0 < s; --s, ++e, ++f) { SWAP(*e, *f); } + first += (b - a), last -= (d - c); + } + *pa = first, *pb = last; +} + +static +void +tr_copy(int *ISA, const int *SA, + int *first, int *a, int *b, int *last, + int depth) { + /* sort suffixes of middle partition + by using sorted order of suffixes of left and right partition. */ + int *c, *d, *e; + int s, v; + + v = b - SA - 1; + for(c = first, d = a - 1; c <= d; ++c) { + if((0 <= (s = *c - depth)) && (ISA[s] == v)) { + *++d = s; + ISA[s] = d - SA; + } + } + for(c = last - 1, e = d + 1, d = b; e < d; --c) { + if((0 <= (s = *c - depth)) && (ISA[s] == v)) { + *--d = s; + ISA[s] = d - SA; + } + } +} + +static +void +tr_partialcopy(int *ISA, const int *SA, + int *first, int *a, int *b, int *last, + int depth) { + int *c, *d, *e; + int s, v; + int rank, lastrank, newrank = -1; + + v = b - SA - 1; + lastrank = -1; + for(c = first, d = a - 1; c <= d; ++c) { + if((0 <= (s = *c - depth)) && (ISA[s] == v)) { + *++d = s; + rank = ISA[s + depth]; + if(lastrank != rank) { lastrank = rank; newrank = d - SA; } + ISA[s] = newrank; + } + } + + lastrank = -1; + for(e = d; first <= e; --e) { + rank = ISA[*e]; + if(lastrank != rank) { lastrank = rank; newrank = e - SA; } + if(newrank != rank) { ISA[*e] = newrank; } + } + + lastrank = -1; + for(c = last - 1, e = d + 1, d = b; e < d; --c) { + if((0 <= (s = *c - depth)) && (ISA[s] == v)) { + *--d = s; + rank = ISA[s + depth]; + if(lastrank != rank) { lastrank = rank; newrank = d - SA; } + ISA[s] = newrank; + } + } +} + +static +void +tr_introsort(int *ISA, const int *ISAd, + int *SA, int *first, int *last, + trbudget_t *budget) { +#define STACK_SIZE TR_STACKSIZE + struct { const int *a; int *b, *c; int d, e; }stack[STACK_SIZE]; + int *a, *b, *c; + int t; + int v, x = 0; + int incr = ISAd - ISA; + int limit, next; + int ssize, trlink = -1; + + for(ssize = 0, limit = tr_ilg(last - first);;) { + + if(limit < 0) { + if(limit == -1) { + /* tandem repeat partition */ + tr_partition(ISAd - incr, first, first, last, &a, &b, last - SA - 1); + + /* update ranks */ + if(a < last) { + for(c = first, v = a - SA - 1; c < a; ++c) { ISA[*c] = v; } + } + if(b < last) { + for(c = a, v = b - SA - 1; c < b; ++c) { ISA[*c] = v; } + } + + /* push */ + if(1 < (b - a)) { + STACK_PUSH5(NULL, a, b, 0, 0); + STACK_PUSH5(ISAd - incr, first, last, -2, trlink); + trlink = ssize - 2; + } + if((a - first) <= (last - b)) { + if(1 < (a - first)) { + STACK_PUSH5(ISAd, b, last, tr_ilg(last - b), trlink); + last = a, limit = tr_ilg(a - first); + } else if(1 < (last - b)) { + first = b, limit = tr_ilg(last - b); + } else { + STACK_POP5(ISAd, first, last, limit, trlink); + } + } else { + if(1 < (last - b)) { + STACK_PUSH5(ISAd, first, a, tr_ilg(a - first), trlink); + first = b, limit = tr_ilg(last - b); + } else if(1 < (a - first)) { + last = a, limit = tr_ilg(a - first); + } else { + STACK_POP5(ISAd, first, last, limit, trlink); + } + } + } else if(limit == -2) { + /* tandem repeat copy */ + a = stack[--ssize].b, b = stack[ssize].c; + if(stack[ssize].d == 0) { + tr_copy(ISA, SA, first, a, b, last, ISAd - ISA); + } else { + if(0 <= trlink) { stack[trlink].d = -1; } + tr_partialcopy(ISA, SA, first, a, b, last, ISAd - ISA); + } + STACK_POP5(ISAd, first, last, limit, trlink); + } else { + /* sorted partition */ + if(0 <= *first) { + a = first; + do { ISA[*a] = a - SA; } while((++a < last) && (0 <= *a)); + first = a; + } + if(first < last) { + a = first; do { *a = ~*a; } while(*++a < 0); + next = (ISA[*a] != ISAd[*a]) ? tr_ilg(a - first + 1) : -1; + if(++a < last) { for(b = first, v = a - SA - 1; b < a; ++b) { ISA[*b] = v; } } + + /* push */ + if(trbudget_check(budget, a - first)) { + if((a - first) <= (last - a)) { + STACK_PUSH5(ISAd, a, last, -3, trlink); + ISAd += incr, last = a, limit = next; + } else { + if(1 < (last - a)) { + STACK_PUSH5(ISAd + incr, first, a, next, trlink); + first = a, limit = -3; + } else { + ISAd += incr, last = a, limit = next; + } + } + } else { + if(0 <= trlink) { stack[trlink].d = -1; } + if(1 < (last - a)) { + first = a, limit = -3; + } else { + STACK_POP5(ISAd, first, last, limit, trlink); + } + } + } else { + STACK_POP5(ISAd, first, last, limit, trlink); + } + } + continue; + } + + if((last - first) <= TR_INSERTIONSORT_THRESHOLD) { + tr_insertionsort(ISAd, first, last); + limit = -3; + continue; + } + + if(limit-- == 0) { + tr_heapsort(ISAd, first, last - first); + for(a = last - 1; first < a; a = b) { + for(x = ISAd[*a], b = a - 1; (first <= b) && (ISAd[*b] == x); --b) { *b = ~*b; } + } + limit = -3; + continue; + } + + /* choose pivot */ + a = tr_pivot(ISAd, first, last); + SWAP(*first, *a); + v = ISAd[*first]; + + /* partition */ + tr_partition(ISAd, first, first + 1, last, &a, &b, v); + if((last - first) != (b - a)) { + next = (ISA[*a] != v) ? tr_ilg(b - a) : -1; + + /* update ranks */ + for(c = first, v = a - SA - 1; c < a; ++c) { ISA[*c] = v; } + if(b < last) { for(c = a, v = b - SA - 1; c < b; ++c) { ISA[*c] = v; } } + + /* push */ + if((1 < (b - a)) && (trbudget_check(budget, b - a))) { + if((a - first) <= (last - b)) { + if((last - b) <= (b - a)) { + if(1 < (a - first)) { + STACK_PUSH5(ISAd + incr, a, b, next, trlink); + STACK_PUSH5(ISAd, b, last, limit, trlink); + last = a; + } else if(1 < (last - b)) { + STACK_PUSH5(ISAd + incr, a, b, next, trlink); + first = b; + } else { + ISAd += incr, first = a, last = b, limit = next; + } + } else if((a - first) <= (b - a)) { + if(1 < (a - first)) { + STACK_PUSH5(ISAd, b, last, limit, trlink); + STACK_PUSH5(ISAd + incr, a, b, next, trlink); + last = a; + } else { + STACK_PUSH5(ISAd, b, last, limit, trlink); + ISAd += incr, first = a, last = b, limit = next; + } + } else { + STACK_PUSH5(ISAd, b, last, limit, trlink); + STACK_PUSH5(ISAd, first, a, limit, trlink); + ISAd += incr, first = a, last = b, limit = next; + } + } else { + if((a - first) <= (b - a)) { + if(1 < (last - b)) { + STACK_PUSH5(ISAd + incr, a, b, next, trlink); + STACK_PUSH5(ISAd, first, a, limit, trlink); + first = b; + } else if(1 < (a - first)) { + STACK_PUSH5(ISAd + incr, a, b, next, trlink); + last = a; + } else { + ISAd += incr, first = a, last = b, limit = next; + } + } else if((last - b) <= (b - a)) { + if(1 < (last - b)) { + STACK_PUSH5(ISAd, first, a, limit, trlink); + STACK_PUSH5(ISAd + incr, a, b, next, trlink); + first = b; + } else { + STACK_PUSH5(ISAd, first, a, limit, trlink); + ISAd += incr, first = a, last = b, limit = next; + } + } else { + STACK_PUSH5(ISAd, first, a, limit, trlink); + STACK_PUSH5(ISAd, b, last, limit, trlink); + ISAd += incr, first = a, last = b, limit = next; + } + } + } else { + if((1 < (b - a)) && (0 <= trlink)) { stack[trlink].d = -1; } + if((a - first) <= (last - b)) { + if(1 < (a - first)) { + STACK_PUSH5(ISAd, b, last, limit, trlink); + last = a; + } else if(1 < (last - b)) { + first = b; + } else { + STACK_POP5(ISAd, first, last, limit, trlink); + } + } else { + if(1 < (last - b)) { + STACK_PUSH5(ISAd, first, a, limit, trlink); + first = b; + } else if(1 < (a - first)) { + last = a; + } else { + STACK_POP5(ISAd, first, last, limit, trlink); + } + } + } + } else { + if(trbudget_check(budget, last - first)) { + limit = tr_ilg(last - first), ISAd += incr; + } else { + if(0 <= trlink) { stack[trlink].d = -1; } + STACK_POP5(ISAd, first, last, limit, trlink); + } + } + } +#undef STACK_SIZE +} + + + +/*---------------------------------------------------------------------------*/ + +/* Tandem repeat sort */ +static +void +trsort(int *ISA, int *SA, int n, int depth) { + int *ISAd; + int *first, *last; + trbudget_t budget; + int t, skip, unsorted; + + trbudget_init(&budget, tr_ilg(n) * 2 / 3, n); +/* trbudget_init(&budget, tr_ilg(n) * 3 / 4, n); */ + for(ISAd = ISA + depth; -n < *SA; ISAd += ISAd - ISA) { + first = SA; + skip = 0; + unsorted = 0; + do { + if((t = *first) < 0) { first -= t; skip += t; } + else { + if(skip != 0) { *(first + skip) = skip; skip = 0; } + last = SA + ISA[t] + 1; + if(1 < (last - first)) { + budget.count = 0; + tr_introsort(ISA, ISAd, SA, first, last, &budget); + if(budget.count != 0) { unsorted += budget.count; } + else { skip = first - last; } + } else if((last - first) == 1) { + skip = -1; + } + first = last; + } + } while(first < (SA + n)); + if(skip != 0) { *(first + skip) = skip; } + if(unsorted == 0) { break; } + } +} + + +/*---------------------------------------------------------------------------*/ + +/* Sorts suffixes of type B*. */ +static +int +sort_typeBstar(const unsigned char *T, int *SA, + int *bucket_A, int *bucket_B, + int n, int openMP) { + int *PAb, *ISAb, *buf; +#ifdef LIBBSC_OPENMP + int *curbuf; + int l; +#endif + int i, j, k, t, m, bufsize; + int c0, c1; +#ifdef LIBBSC_OPENMP + int d0, d1; +#endif + (void)openMP; + + /* Initialize bucket arrays. */ + for(i = 0; i < BUCKET_A_SIZE; ++i) { bucket_A[i] = 0; } + for(i = 0; i < BUCKET_B_SIZE; ++i) { bucket_B[i] = 0; } + + /* Count the number of occurrences of the first one or two characters of each + type A, B and B* suffix. Moreover, store the beginning position of all + type B* suffixes into the array SA. */ + for(i = n - 1, m = n, c0 = T[n - 1]; 0 <= i;) { + /* type A suffix. */ + do { ++BUCKET_A(c1 = c0); } while((0 <= --i) && ((c0 = T[i]) >= c1)); + if(0 <= i) { + /* type B* suffix. */ + ++BUCKET_BSTAR(c0, c1); + SA[--m] = i; + /* type B suffix. */ + for(--i, c1 = c0; (0 <= i) && ((c0 = T[i]) <= c1); --i, c1 = c0) { + ++BUCKET_B(c0, c1); + } + } + } + m = n - m; +/* +note: + A type B* suffix is lexicographically smaller than a type B suffix that + begins with the same first two characters. +*/ + + /* Calculate the index of start/end point of each bucket. */ + for(c0 = 0, i = 0, j = 0; c0 < ALPHABET_SIZE; ++c0) { + t = i + BUCKET_A(c0); + BUCKET_A(c0) = i + j; /* start point */ + i = t + BUCKET_B(c0, c0); + for(c1 = c0 + 1; c1 < ALPHABET_SIZE; ++c1) { + j += BUCKET_BSTAR(c0, c1); + BUCKET_BSTAR(c0, c1) = j; /* end point */ + i += BUCKET_B(c0, c1); + } + } + + if(0 < m) { + /* Sort the type B* suffixes by their first two characters. */ + PAb = SA + n - m; ISAb = SA + m; + for(i = m - 2; 0 <= i; --i) { + t = PAb[i], c0 = T[t], c1 = T[t + 1]; + SA[--BUCKET_BSTAR(c0, c1)] = i; + } + t = PAb[m - 1], c0 = T[t], c1 = T[t + 1]; + SA[--BUCKET_BSTAR(c0, c1)] = m - 1; + + /* Sort the type B* substrings using sssort. */ +#ifdef LIBBSC_OPENMP + if (openMP) + { + buf = SA + m; + c0 = ALPHABET_SIZE - 2, c1 = ALPHABET_SIZE - 1, j = m; +#pragma omp parallel default(shared) private(bufsize, curbuf, k, l, d0, d1) + { + bufsize = (n - (2 * m)) / omp_get_num_threads(); + curbuf = buf + omp_get_thread_num() * bufsize; + k = 0; + for(;;) { + #pragma omp critical(sssort_lock) + { + if(0 < (l = j)) { + d0 = c0, d1 = c1; + do { + k = BUCKET_BSTAR(d0, d1); + if(--d1 <= d0) { + d1 = ALPHABET_SIZE - 1; + if(--d0 < 0) { break; } + } + } while(((l - k) <= 1) && (0 < (l = k))); + c0 = d0, c1 = d1, j = k; + } + } + if(l == 0) { break; } + sssort(T, PAb, SA + k, SA + l, + curbuf, bufsize, 2, n, *(SA + k) == (m - 1)); + } + } + } + else + { + buf = SA + m, bufsize = n - (2 * m); + for(c0 = ALPHABET_SIZE - 2, j = m; 0 < j; --c0) { + for(c1 = ALPHABET_SIZE - 1; c0 < c1; j = i, --c1) { + i = BUCKET_BSTAR(c0, c1); + if(1 < (j - i)) { + sssort(T, PAb, SA + i, SA + j, + buf, bufsize, 2, n, *(SA + i) == (m - 1)); + } + } + } + } +#else + buf = SA + m, bufsize = n - (2 * m); + for(c0 = ALPHABET_SIZE - 2, j = m; 0 < j; --c0) { + for(c1 = ALPHABET_SIZE - 1; c0 < c1; j = i, --c1) { + i = BUCKET_BSTAR(c0, c1); + if(1 < (j - i)) { + sssort(T, PAb, SA + i, SA + j, + buf, bufsize, 2, n, *(SA + i) == (m - 1)); + } + } + } +#endif + + /* Compute ranks of type B* substrings. */ + for(i = m - 1; 0 <= i; --i) { + if(0 <= SA[i]) { + j = i; + do { ISAb[SA[i]] = i; } while((0 <= --i) && (0 <= SA[i])); + SA[i + 1] = i - j; + if(i <= 0) { break; } + } + j = i; + do { ISAb[SA[i] = ~SA[i]] = j; } while(SA[--i] < 0); + ISAb[SA[i]] = j; + } + + /* Construct the inverse suffix array of type B* suffixes using trsort. */ + trsort(ISAb, SA, m, 1); + + /* Set the sorted order of type B* suffixes. */ + for(i = n - 1, j = m, c0 = T[n - 1]; 0 <= i;) { + for(--i, c1 = c0; (0 <= i) && ((c0 = T[i]) >= c1); --i, c1 = c0) { } + if(0 <= i) { + t = i; + for(--i, c1 = c0; (0 <= i) && ((c0 = T[i]) <= c1); --i, c1 = c0) { } + SA[ISAb[--j]] = ((t == 0) || (1 < (t - i))) ? t : ~t; + } + } + + /* Calculate the index of start/end point of each bucket. */ + BUCKET_B(ALPHABET_SIZE - 1, ALPHABET_SIZE - 1) = n; /* end point */ + for(c0 = ALPHABET_SIZE - 2, k = m - 1; 0 <= c0; --c0) { + i = BUCKET_A(c0 + 1) - 1; + for(c1 = ALPHABET_SIZE - 1; c0 < c1; --c1) { + t = i - BUCKET_B(c0, c1); + BUCKET_B(c0, c1) = i; /* end point */ + + /* Move all type B* suffixes to the correct position. */ + for(i = t, j = BUCKET_BSTAR(c0, c1); + j <= k; + --i, --k) { SA[i] = SA[k]; } + } + BUCKET_BSTAR(c0, c0 + 1) = i - BUCKET_B(c0, c0) + 1; /* start point */ + BUCKET_B(c0, c0) = i; /* end point */ + } + } + + return m; +} + +/* Constructs the suffix array by using the sorted order of type B* suffixes. */ +static +void +construct_SA(const unsigned char *T, int *SA, + int *bucket_A, int *bucket_B, + int n, int m) { + int *i, *j, *k; + int s; + int c0, c1, c2; + + if(0 < m) { + /* Construct the sorted order of type B suffixes by using + the sorted order of type B* suffixes. */ + for(c1 = ALPHABET_SIZE - 2; 0 <= c1; --c1) { + /* Scan the suffix array from right to left. */ + for(i = SA + BUCKET_BSTAR(c1, c1 + 1), + j = SA + BUCKET_A(c1 + 1) - 1, k = NULL, c2 = -1; + i <= j; + --j) { + if(0 < (s = *j)) { + assert(T[s] == c1); + assert(((s + 1) < n) && (T[s] <= T[s + 1])); + assert(T[s - 1] <= T[s]); + *j = ~s; + c0 = T[--s]; + if((0 < s) && (T[s - 1] > c0)) { s = ~s; } + if(c0 != c2) { + if(0 <= c2) { BUCKET_B(c2, c1) = k - SA; } + k = SA + BUCKET_B(c2 = c0, c1); + } + assert(k < j); assert(k != NULL); + *k-- = s; + } else { + assert(((s == 0) && (T[s] == c1)) || (s < 0)); + *j = ~s; + } + } + } + } + + /* Construct the suffix array by using + the sorted order of type B suffixes. */ + k = SA + BUCKET_A(c2 = T[n - 1]); + *k++ = (T[n - 2] < c2) ? ~(n - 1) : (n - 1); + /* Scan the suffix array from left to right. */ + for(i = SA, j = SA + n; i < j; ++i) { + if(0 < (s = *i)) { + assert(T[s - 1] >= T[s]); + c0 = T[--s]; + if((s == 0) || (T[s - 1] < c0)) { s = ~s; } + if(c0 != c2) { + BUCKET_A(c2) = k - SA; + k = SA + BUCKET_A(c2 = c0); + } + assert(i < k); + *k++ = s; + } else { + assert(s < 0); + *i = ~s; + } + } +} + +/* Constructs the burrows-wheeler transformed string directly + by using the sorted order of type B* suffixes. */ +static +int +construct_BWT(const unsigned char *T, int *SA, + int *bucket_A, int *bucket_B, + int n, int m) { + int *i, *j, *k, *orig; + int s; + int c0, c1, c2; + + if(0 < m) { + /* Construct the sorted order of type B suffixes by using + the sorted order of type B* suffixes. */ + for(c1 = ALPHABET_SIZE - 2; 0 <= c1; --c1) { + /* Scan the suffix array from right to left. */ + for(i = SA + BUCKET_BSTAR(c1, c1 + 1), + j = SA + BUCKET_A(c1 + 1) - 1, k = NULL, c2 = -1; + i <= j; + --j) { + if(0 < (s = *j)) { + assert(T[s] == c1); + assert(((s + 1) < n) && (T[s] <= T[s + 1])); + assert(T[s - 1] <= T[s]); + c0 = T[--s]; + *j = ~((int)c0); + if((0 < s) && (T[s - 1] > c0)) { s = ~s; } + if(c0 != c2) { + if(0 <= c2) { BUCKET_B(c2, c1) = k - SA; } + k = SA + BUCKET_B(c2 = c0, c1); + } + assert(k < j); assert(k != NULL); + *k-- = s; + } else if(s != 0) { + *j = ~s; +#ifndef NDEBUG + } else { + assert(T[s] == c1); +#endif + } + } + } + } + + /* Construct the BWTed string by using + the sorted order of type B suffixes. */ + k = SA + BUCKET_A(c2 = T[n - 1]); + *k++ = (T[n - 2] < c2) ? ~((int)T[n - 2]) : (n - 1); + /* Scan the suffix array from left to right. */ + for(i = SA, j = SA + n, orig = SA; i < j; ++i) { + if(0 < (s = *i)) { + assert(T[s - 1] >= T[s]); + c0 = T[--s]; + *i = c0; + if((0 < s) && (T[s - 1] < c0)) { s = ~((int)T[s - 1]); } + if(c0 != c2) { + BUCKET_A(c2) = k - SA; + k = SA + BUCKET_A(c2 = c0); + } + assert(i < k); + *k++ = s; + } else if(s != 0) { + *i = ~s; + } else { + orig = i; + } + } + + return orig - SA; +} + +/* Constructs the burrows-wheeler transformed string directly + by using the sorted order of type B* suffixes. */ +static +int +construct_BWT_indexes(const unsigned char *T, int *SA, + int *bucket_A, int *bucket_B, + int n, int m, + unsigned char * num_indexes, int * indexes) { + int *i, *j, *k, *orig; + int s; + int c0, c1, c2; + + int mod = n / 8; + { + mod |= mod >> 1; mod |= mod >> 2; + mod |= mod >> 4; mod |= mod >> 8; + mod |= mod >> 16; mod >>= 1; + + *num_indexes = (unsigned char)((n - 1) / (mod + 1)); + } + + if(0 < m) { + /* Construct the sorted order of type B suffixes by using + the sorted order of type B* suffixes. */ + for(c1 = ALPHABET_SIZE - 2; 0 <= c1; --c1) { + /* Scan the suffix array from right to left. */ + for(i = SA + BUCKET_BSTAR(c1, c1 + 1), + j = SA + BUCKET_A(c1 + 1) - 1, k = NULL, c2 = -1; + i <= j; + --j) { + if(0 < (s = *j)) { + assert(T[s] == c1); + assert(((s + 1) < n) && (T[s] <= T[s + 1])); + assert(T[s - 1] <= T[s]); + + if ((s & mod) == 0) indexes[s / (mod + 1) - 1] = j - SA; + + c0 = T[--s]; + *j = ~((int)c0); + if((0 < s) && (T[s - 1] > c0)) { s = ~s; } + if(c0 != c2) { + if(0 <= c2) { BUCKET_B(c2, c1) = k - SA; } + k = SA + BUCKET_B(c2 = c0, c1); + } + assert(k < j); assert(k != NULL); + *k-- = s; + } else if(s != 0) { + *j = ~s; +#ifndef NDEBUG + } else { + assert(T[s] == c1); +#endif + } + } + } + } + + /* Construct the BWTed string by using + the sorted order of type B suffixes. */ + k = SA + BUCKET_A(c2 = T[n - 1]); + if (T[n - 2] < c2) { + if (((n - 1) & mod) == 0) indexes[(n - 1) / (mod + 1) - 1] = k - SA; + *k++ = ~((int)T[n - 2]); + } + else { + *k++ = n - 1; + } + + /* Scan the suffix array from left to right. */ + for(i = SA, j = SA + n, orig = SA; i < j; ++i) { + if(0 < (s = *i)) { + assert(T[s - 1] >= T[s]); + + if ((s & mod) == 0) indexes[s / (mod + 1) - 1] = i - SA; + + c0 = T[--s]; + *i = c0; + if(c0 != c2) { + BUCKET_A(c2) = k - SA; + k = SA + BUCKET_A(c2 = c0); + } + assert(i < k); + if((0 < s) && (T[s - 1] < c0)) { + if ((s & mod) == 0) indexes[s / (mod + 1) - 1] = k - SA; + *k++ = ~((int)T[s - 1]); + } else + *k++ = s; + } else if(s != 0) { + *i = ~s; + } else { + orig = i; + } + } + + return orig - SA; +} + + +/*---------------------------------------------------------------------------*/ + +/*- Function -*/ + +int +divsufsort(const unsigned char *T, int *SA, int n, int openMP) { + int *bucket_A, *bucket_B; + int m; + int err = 0; + + /* Check arguments. */ + if((T == NULL) || (SA == NULL) || (n < 0)) { return -1; } + else if(n == 0) { return 0; } + else if(n == 1) { SA[0] = 0; return 0; } + else if(n == 2) { m = (T[0] < T[1]); SA[m ^ 1] = 0, SA[m] = 1; return 0; } + + bucket_A = (int *)malloc(BUCKET_A_SIZE * sizeof(int)); + bucket_B = (int *)malloc(BUCKET_B_SIZE * sizeof(int)); + + /* Suffixsort. */ + if((bucket_A != NULL) && (bucket_B != NULL)) { + m = sort_typeBstar(T, SA, bucket_A, bucket_B, n, openMP); + construct_SA(T, SA, bucket_A, bucket_B, n, m); + } else { + err = -2; + } + + free(bucket_B); + free(bucket_A); + + return err; +} + +int +divbwt(const unsigned char *T, unsigned char *U, int *A, int n, unsigned char * num_indexes, int * indexes, int openMP) { + int *B; + int *bucket_A, *bucket_B; + int m, pidx, i; + + /* Check arguments. */ + if((T == NULL) || (U == NULL) || (n < 0)) { return -1; } + else if(n <= 1) { if(n == 1) { U[0] = T[0]; } return n; } + + if((B = A) == NULL) { B = (int *)malloc((size_t)(n + 1) * sizeof(int)); } + bucket_A = (int *)malloc(BUCKET_A_SIZE * sizeof(int)); + bucket_B = (int *)malloc(BUCKET_B_SIZE * sizeof(int)); + + /* Burrows-Wheeler Transform. */ + if((B != NULL) && (bucket_A != NULL) && (bucket_B != NULL)) { + m = sort_typeBstar(T, B, bucket_A, bucket_B, n, openMP); + + if (num_indexes == NULL || indexes == NULL) { + pidx = construct_BWT(T, B, bucket_A, bucket_B, n, m); + } else { + pidx = construct_BWT_indexes(T, B, bucket_A, bucket_B, n, m, num_indexes, indexes); + } + + /* Copy to output string. */ + U[0] = T[n - 1]; + for(i = 0; i < pidx; ++i) { U[i + 1] = (unsigned char)B[i]; } + for(i += 1; i < n; ++i) { U[i] = (unsigned char)B[i]; } + pidx += 1; + } else { + pidx = -2; + } + + free(bucket_B); + free(bucket_A); + if(A == NULL) { free(B); } + + return pidx; +} +/**** ended inlining dictBuilder/divsufsort.c ****/ +/**** start inlining dictBuilder/fastcover.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/*-************************************* +* Dependencies +***************************************/ +#include /* fprintf */ +#include /* malloc, free, qsort */ +#include /* memset */ +#include /* clock */ + +#ifndef ZDICT_STATIC_LINKING_ONLY +# define ZDICT_STATIC_LINKING_ONLY +#endif + +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: ../common/pool.h ****/ +/**** skipping file: ../common/threading.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: ../compress/zstd_compress_internal.h ****/ +/**** skipping file: ../zdict.h ****/ +/**** skipping file: cover.h ****/ + + +/*-************************************* +* Constants +***************************************/ +/** +* There are 32bit indexes used to ref samples, so limit samples size to 4GB +* on 64bit builds. +* For 32bit builds we choose 1 GB. +* Most 32bit platforms have 2GB user-mode addressable space and we allocate a large +* contiguous buffer, so 1GB is already a high limit. +*/ +#define FASTCOVER_MAX_SAMPLES_SIZE (sizeof(size_t) == 8 ? ((unsigned)-1) : ((unsigned)1 GB)) +#define FASTCOVER_MAX_F 31 +#define FASTCOVER_MAX_ACCEL 10 +#define FASTCOVER_DEFAULT_SPLITPOINT 0.75 +#define DEFAULT_F 20 +#define DEFAULT_ACCEL 1 + + +/*-************************************* +* Console display +***************************************/ +#ifndef LOCALDISPLAYLEVEL +static int g_displayLevel = 0; +#endif +#undef DISPLAY +#define DISPLAY(...) \ + { \ + fprintf(stderr, __VA_ARGS__); \ + fflush(stderr); \ + } +#undef LOCALDISPLAYLEVEL +#define LOCALDISPLAYLEVEL(displayLevel, l, ...) \ + if (displayLevel >= l) { \ + DISPLAY(__VA_ARGS__); \ + } /* 0 : no display; 1: errors; 2: default; 3: details; 4: debug */ +#undef DISPLAYLEVEL +#define DISPLAYLEVEL(l, ...) LOCALDISPLAYLEVEL(g_displayLevel, l, __VA_ARGS__) + +#ifndef LOCALDISPLAYUPDATE +static const clock_t g_refreshRate = CLOCKS_PER_SEC * 15 / 100; +static clock_t g_time = 0; +#endif +#undef LOCALDISPLAYUPDATE +#define LOCALDISPLAYUPDATE(displayLevel, l, ...) \ + if (displayLevel >= l) { \ + if ((clock() - g_time > g_refreshRate) || (displayLevel >= 4)) { \ + g_time = clock(); \ + DISPLAY(__VA_ARGS__); \ + } \ + } +#undef DISPLAYUPDATE +#define DISPLAYUPDATE(l, ...) LOCALDISPLAYUPDATE(g_displayLevel, l, __VA_ARGS__) + + +/*-************************************* +* Hash Functions +***************************************/ +/** + * Hash the d-byte value pointed to by p and mod 2^f into the frequency vector + */ +static size_t FASTCOVER_hashPtrToIndex(const void* p, U32 f, unsigned d) { + if (d == 6) { + return ZSTD_hash6Ptr(p, f); + } + return ZSTD_hash8Ptr(p, f); +} + + +/*-************************************* +* Acceleration +***************************************/ +typedef struct { + unsigned finalize; /* Percentage of training samples used for ZDICT_finalizeDictionary */ + unsigned skip; /* Number of dmer skipped between each dmer counted in computeFrequency */ +} FASTCOVER_accel_t; + + +static const FASTCOVER_accel_t FASTCOVER_defaultAccelParameters[FASTCOVER_MAX_ACCEL+1] = { + { 100, 0 }, /* accel = 0, should not happen because accel = 0 defaults to accel = 1 */ + { 100, 0 }, /* accel = 1 */ + { 50, 1 }, /* accel = 2 */ + { 34, 2 }, /* accel = 3 */ + { 25, 3 }, /* accel = 4 */ + { 20, 4 }, /* accel = 5 */ + { 17, 5 }, /* accel = 6 */ + { 14, 6 }, /* accel = 7 */ + { 13, 7 }, /* accel = 8 */ + { 11, 8 }, /* accel = 9 */ + { 10, 9 }, /* accel = 10 */ +}; + + +/*-************************************* +* Context +***************************************/ +typedef struct { + const BYTE *samples; + size_t *offsets; + const size_t *samplesSizes; + size_t nbSamples; + size_t nbTrainSamples; + size_t nbTestSamples; + size_t nbDmers; + U32 *freqs; + unsigned d; + unsigned f; + FASTCOVER_accel_t accelParams; +} FASTCOVER_ctx_t; + + +/*-************************************* +* Helper functions +***************************************/ +/** + * Selects the best segment in an epoch. + * Segments of are scored according to the function: + * + * Let F(d) be the frequency of all dmers with hash value d. + * Let S_i be hash value of the dmer at position i of segment S which has length k. + * + * Score(S) = F(S_1) + F(S_2) + ... + F(S_{k-d+1}) + * + * Once the dmer with hash value d is in the dictionary we set F(d) = 0. + */ +static COVER_segment_t FASTCOVER_selectSegment(const FASTCOVER_ctx_t *ctx, + U32 *freqs, U32 begin, U32 end, + ZDICT_cover_params_t parameters, + U16* segmentFreqs) { + /* Constants */ + const U32 k = parameters.k; + const U32 d = parameters.d; + const U32 f = ctx->f; + const U32 dmersInK = k - d + 1; + + /* Try each segment (activeSegment) and save the best (bestSegment) */ + COVER_segment_t bestSegment = {0, 0, 0}; + COVER_segment_t activeSegment; + + /* Reset the activeDmers in the segment */ + /* The activeSegment starts at the beginning of the epoch. */ + activeSegment.begin = begin; + activeSegment.end = begin; + activeSegment.score = 0; + + /* Slide the activeSegment through the whole epoch. + * Save the best segment in bestSegment. + */ + while (activeSegment.end < end) { + /* Get hash value of current dmer */ + const size_t idx = FASTCOVER_hashPtrToIndex(ctx->samples + activeSegment.end, f, d); + + /* Add frequency of this index to score if this is the first occurrence of index in active segment */ + if (segmentFreqs[idx] == 0) { + activeSegment.score += freqs[idx]; + } + /* Increment end of segment and segmentFreqs*/ + activeSegment.end += 1; + segmentFreqs[idx] += 1; + /* If the window is now too large, drop the first position */ + if (activeSegment.end - activeSegment.begin == dmersInK + 1) { + /* Get hash value of the dmer to be eliminated from active segment */ + const size_t delIndex = FASTCOVER_hashPtrToIndex(ctx->samples + activeSegment.begin, f, d); + segmentFreqs[delIndex] -= 1; + /* Subtract frequency of this index from score if this is the last occurrence of this index in active segment */ + if (segmentFreqs[delIndex] == 0) { + activeSegment.score -= freqs[delIndex]; + } + /* Increment start of segment */ + activeSegment.begin += 1; + } + + /* If this segment is the best so far save it */ + if (activeSegment.score > bestSegment.score) { + bestSegment = activeSegment; + } + } + + /* Zero out rest of segmentFreqs array */ + while (activeSegment.begin < end) { + const size_t delIndex = FASTCOVER_hashPtrToIndex(ctx->samples + activeSegment.begin, f, d); + segmentFreqs[delIndex] -= 1; + activeSegment.begin += 1; + } + + { + /* Zero the frequency of hash value of each dmer covered by the chosen segment. */ + U32 pos; + for (pos = bestSegment.begin; pos != bestSegment.end; ++pos) { + const size_t i = FASTCOVER_hashPtrToIndex(ctx->samples + pos, f, d); + freqs[i] = 0; + } + } + + return bestSegment; +} + + +static int FASTCOVER_checkParameters(ZDICT_cover_params_t parameters, + size_t maxDictSize, unsigned f, + unsigned accel) { + /* k, d, and f are required parameters */ + if (parameters.d == 0 || parameters.k == 0) { + return 0; + } + /* d has to be 6 or 8 */ + if (parameters.d != 6 && parameters.d != 8) { + return 0; + } + /* k <= maxDictSize */ + if (parameters.k > maxDictSize) { + return 0; + } + /* d <= k */ + if (parameters.d > parameters.k) { + return 0; + } + /* 0 < f <= FASTCOVER_MAX_F*/ + if (f > FASTCOVER_MAX_F || f == 0) { + return 0; + } + /* 0 < splitPoint <= 1 */ + if (parameters.splitPoint <= 0 || parameters.splitPoint > 1) { + return 0; + } + /* 0 < accel <= 10 */ + if (accel > 10 || accel == 0) { + return 0; + } + return 1; +} + + +/** + * Clean up a context initialized with `FASTCOVER_ctx_init()`. + */ +static void +FASTCOVER_ctx_destroy(FASTCOVER_ctx_t* ctx) +{ + if (!ctx) return; + + free(ctx->freqs); + ctx->freqs = NULL; + + free(ctx->offsets); + ctx->offsets = NULL; +} + + +/** + * Calculate for frequency of hash value of each dmer in ctx->samples + */ +static void +FASTCOVER_computeFrequency(U32* freqs, const FASTCOVER_ctx_t* ctx) +{ + const unsigned f = ctx->f; + const unsigned d = ctx->d; + const unsigned skip = ctx->accelParams.skip; + const unsigned readLength = MAX(d, 8); + size_t i; + assert(ctx->nbTrainSamples >= 5); + assert(ctx->nbTrainSamples <= ctx->nbSamples); + for (i = 0; i < ctx->nbTrainSamples; i++) { + size_t start = ctx->offsets[i]; /* start of current dmer */ + size_t const currSampleEnd = ctx->offsets[i+1]; + while (start + readLength <= currSampleEnd) { + const size_t dmerIndex = FASTCOVER_hashPtrToIndex(ctx->samples + start, f, d); + freqs[dmerIndex]++; + start = start + skip + 1; + } + } +} + + +/** + * Prepare a context for dictionary building. + * The context is only dependent on the parameter `d` and can be used multiple + * times. + * Returns 0 on success or error code on error. + * The context must be destroyed with `FASTCOVER_ctx_destroy()`. + */ +static size_t +FASTCOVER_ctx_init(FASTCOVER_ctx_t* ctx, + const void* samplesBuffer, + const size_t* samplesSizes, unsigned nbSamples, + unsigned d, double splitPoint, unsigned f, + FASTCOVER_accel_t accelParams) +{ + const BYTE* const samples = (const BYTE*)samplesBuffer; + const size_t totalSamplesSize = COVER_sum(samplesSizes, nbSamples); + /* Split samples into testing and training sets */ + const unsigned nbTrainSamples = splitPoint < 1.0 ? (unsigned)((double)nbSamples * splitPoint) : nbSamples; + const unsigned nbTestSamples = splitPoint < 1.0 ? nbSamples - nbTrainSamples : nbSamples; + const size_t trainingSamplesSize = splitPoint < 1.0 ? COVER_sum(samplesSizes, nbTrainSamples) : totalSamplesSize; + const size_t testSamplesSize = splitPoint < 1.0 ? COVER_sum(samplesSizes + nbTrainSamples, nbTestSamples) : totalSamplesSize; + + /* Checks */ + if (totalSamplesSize < MAX(d, sizeof(U64)) || + totalSamplesSize >= (size_t)FASTCOVER_MAX_SAMPLES_SIZE) { + DISPLAYLEVEL(1, "Total samples size is too large (%u MB), maximum size is %u MB\n", + (unsigned)(totalSamplesSize >> 20), (FASTCOVER_MAX_SAMPLES_SIZE >> 20)); + return ERROR(srcSize_wrong); + } + + /* Check if there are at least 5 training samples */ + if (nbTrainSamples < 5) { + DISPLAYLEVEL(1, "Total number of training samples is %u and is invalid\n", nbTrainSamples); + return ERROR(srcSize_wrong); + } + + /* Check if there's testing sample */ + if (nbTestSamples < 1) { + DISPLAYLEVEL(1, "Total number of testing samples is %u and is invalid.\n", nbTestSamples); + return ERROR(srcSize_wrong); + } + + /* Zero the context */ + memset(ctx, 0, sizeof(*ctx)); + DISPLAYLEVEL(2, "Training on %u samples of total size %u\n", nbTrainSamples, + (unsigned)trainingSamplesSize); + DISPLAYLEVEL(2, "Testing on %u samples of total size %u\n", nbTestSamples, + (unsigned)testSamplesSize); + + ctx->samples = samples; + ctx->samplesSizes = samplesSizes; + ctx->nbSamples = nbSamples; + ctx->nbTrainSamples = nbTrainSamples; + ctx->nbTestSamples = nbTestSamples; + ctx->nbDmers = trainingSamplesSize - MAX(d, sizeof(U64)) + 1; + ctx->d = d; + ctx->f = f; + ctx->accelParams = accelParams; + + /* The offsets of each file */ + ctx->offsets = (size_t*)calloc((nbSamples + 1), sizeof(size_t)); + if (ctx->offsets == NULL) { + DISPLAYLEVEL(1, "Failed to allocate scratch buffers \n"); + FASTCOVER_ctx_destroy(ctx); + return ERROR(memory_allocation); + } + + /* Fill offsets from the samplesSizes */ + { U32 i; + ctx->offsets[0] = 0; + assert(nbSamples >= 5); + for (i = 1; i <= nbSamples; ++i) { + ctx->offsets[i] = ctx->offsets[i - 1] + samplesSizes[i - 1]; + } + } + + /* Initialize frequency array of size 2^f */ + ctx->freqs = (U32*)calloc(((U64)1 << f), sizeof(U32)); + if (ctx->freqs == NULL) { + DISPLAYLEVEL(1, "Failed to allocate frequency table \n"); + FASTCOVER_ctx_destroy(ctx); + return ERROR(memory_allocation); + } + + DISPLAYLEVEL(2, "Computing frequencies\n"); + FASTCOVER_computeFrequency(ctx->freqs, ctx); + + return 0; +} + + +/** + * Given the prepared context build the dictionary. + */ +static size_t +FASTCOVER_buildDictionary(const FASTCOVER_ctx_t* ctx, + U32* freqs, + void* dictBuffer, size_t dictBufferCapacity, + ZDICT_cover_params_t parameters, + U16* segmentFreqs) +{ + BYTE *const dict = (BYTE *)dictBuffer; + size_t tail = dictBufferCapacity; + /* Divide the data into epochs. We will select one segment from each epoch. */ + const COVER_epoch_info_t epochs = COVER_computeEpochs( + (U32)dictBufferCapacity, (U32)ctx->nbDmers, parameters.k, 1); + const size_t maxZeroScoreRun = 10; + size_t zeroScoreRun = 0; + size_t epoch; + DISPLAYLEVEL(2, "Breaking content into %u epochs of size %u\n", + (U32)epochs.num, (U32)epochs.size); + /* Loop through the epochs until there are no more segments or the dictionary + * is full. + */ + for (epoch = 0; tail > 0; epoch = (epoch + 1) % epochs.num) { + const U32 epochBegin = (U32)(epoch * epochs.size); + const U32 epochEnd = epochBegin + epochs.size; + size_t segmentSize; + /* Select a segment */ + COVER_segment_t segment = FASTCOVER_selectSegment( + ctx, freqs, epochBegin, epochEnd, parameters, segmentFreqs); + + /* If the segment covers no dmers, then we are out of content. + * There may be new content in other epochs, for continue for some time. + */ + if (segment.score == 0) { + if (++zeroScoreRun >= maxZeroScoreRun) { + break; + } + continue; + } + zeroScoreRun = 0; + + /* Trim the segment if necessary and if it is too small then we are done */ + segmentSize = MIN(segment.end - segment.begin + parameters.d - 1, tail); + if (segmentSize < parameters.d) { + break; + } + + /* We fill the dictionary from the back to allow the best segments to be + * referenced with the smallest offsets. + */ + tail -= segmentSize; + memcpy(dict + tail, ctx->samples + segment.begin, segmentSize); + DISPLAYUPDATE( + 2, "\r%u%% ", + (unsigned)(((dictBufferCapacity - tail) * 100) / dictBufferCapacity)); + } + DISPLAYLEVEL(2, "\r%79s\r", ""); + return tail; +} + +/** + * Parameters for FASTCOVER_tryParameters(). + */ +typedef struct FASTCOVER_tryParameters_data_s { + const FASTCOVER_ctx_t* ctx; + COVER_best_t* best; + size_t dictBufferCapacity; + ZDICT_cover_params_t parameters; +} FASTCOVER_tryParameters_data_t; + + +/** + * Tries a set of parameters and updates the COVER_best_t with the results. + * This function is thread safe if zstd is compiled with multithreaded support. + * It takes its parameters as an *OWNING* opaque pointer to support threading. + */ +static void FASTCOVER_tryParameters(void* opaque) +{ + /* Save parameters as local variables */ + FASTCOVER_tryParameters_data_t *const data = (FASTCOVER_tryParameters_data_t*)opaque; + const FASTCOVER_ctx_t *const ctx = data->ctx; + const ZDICT_cover_params_t parameters = data->parameters; + size_t dictBufferCapacity = data->dictBufferCapacity; + size_t totalCompressedSize = ERROR(GENERIC); + /* Initialize array to keep track of frequency of dmer within activeSegment */ + U16* segmentFreqs = (U16*)calloc(((U64)1 << ctx->f), sizeof(U16)); + /* Allocate space for hash table, dict, and freqs */ + BYTE *const dict = (BYTE*)malloc(dictBufferCapacity); + COVER_dictSelection_t selection = COVER_dictSelectionError(ERROR(GENERIC)); + U32* freqs = (U32*) malloc(((U64)1 << ctx->f) * sizeof(U32)); + if (!segmentFreqs || !dict || !freqs) { + DISPLAYLEVEL(1, "Failed to allocate buffers: out of memory\n"); + goto _cleanup; + } + /* Copy the frequencies because we need to modify them */ + memcpy(freqs, ctx->freqs, ((U64)1 << ctx->f) * sizeof(U32)); + /* Build the dictionary */ + { const size_t tail = FASTCOVER_buildDictionary(ctx, freqs, dict, dictBufferCapacity, + parameters, segmentFreqs); + + const unsigned nbFinalizeSamples = (unsigned)(ctx->nbTrainSamples * ctx->accelParams.finalize / 100); + selection = COVER_selectDict(dict + tail, dictBufferCapacity, dictBufferCapacity - tail, + ctx->samples, ctx->samplesSizes, nbFinalizeSamples, ctx->nbTrainSamples, ctx->nbSamples, parameters, ctx->offsets, + totalCompressedSize); + + if (COVER_dictSelectionIsError(selection)) { + DISPLAYLEVEL(1, "Failed to select dictionary\n"); + goto _cleanup; + } + } +_cleanup: + free(dict); + COVER_best_finish(data->best, parameters, selection); + free(data); + free(segmentFreqs); + COVER_dictSelectionFree(selection); + free(freqs); +} + + +static void +FASTCOVER_convertToCoverParams(ZDICT_fastCover_params_t fastCoverParams, + ZDICT_cover_params_t* coverParams) +{ + coverParams->k = fastCoverParams.k; + coverParams->d = fastCoverParams.d; + coverParams->steps = fastCoverParams.steps; + coverParams->nbThreads = fastCoverParams.nbThreads; + coverParams->splitPoint = fastCoverParams.splitPoint; + coverParams->zParams = fastCoverParams.zParams; + coverParams->shrinkDict = fastCoverParams.shrinkDict; +} + + +static void +FASTCOVER_convertToFastCoverParams(ZDICT_cover_params_t coverParams, + ZDICT_fastCover_params_t* fastCoverParams, + unsigned f, unsigned accel) +{ + fastCoverParams->k = coverParams.k; + fastCoverParams->d = coverParams.d; + fastCoverParams->steps = coverParams.steps; + fastCoverParams->nbThreads = coverParams.nbThreads; + fastCoverParams->splitPoint = coverParams.splitPoint; + fastCoverParams->f = f; + fastCoverParams->accel = accel; + fastCoverParams->zParams = coverParams.zParams; + fastCoverParams->shrinkDict = coverParams.shrinkDict; +} + + +ZDICTLIB_API size_t +ZDICT_trainFromBuffer_fastCover(void* dictBuffer, size_t dictBufferCapacity, + const void* samplesBuffer, + const size_t* samplesSizes, unsigned nbSamples, + ZDICT_fastCover_params_t parameters) +{ + BYTE* const dict = (BYTE*)dictBuffer; + FASTCOVER_ctx_t ctx; + ZDICT_cover_params_t coverParams; + FASTCOVER_accel_t accelParams; + /* Initialize global data */ + g_displayLevel = (int)parameters.zParams.notificationLevel; + /* Assign splitPoint and f if not provided */ + parameters.splitPoint = 1.0; + parameters.f = parameters.f == 0 ? DEFAULT_F : parameters.f; + parameters.accel = parameters.accel == 0 ? DEFAULT_ACCEL : parameters.accel; + /* Convert to cover parameter */ + memset(&coverParams, 0 , sizeof(coverParams)); + FASTCOVER_convertToCoverParams(parameters, &coverParams); + /* Checks */ + if (!FASTCOVER_checkParameters(coverParams, dictBufferCapacity, parameters.f, + parameters.accel)) { + DISPLAYLEVEL(1, "FASTCOVER parameters incorrect\n"); + return ERROR(parameter_outOfBound); + } + if (nbSamples == 0) { + DISPLAYLEVEL(1, "FASTCOVER must have at least one input file\n"); + return ERROR(srcSize_wrong); + } + if (dictBufferCapacity < ZDICT_DICTSIZE_MIN) { + DISPLAYLEVEL(1, "dictBufferCapacity must be at least %u\n", + ZDICT_DICTSIZE_MIN); + return ERROR(dstSize_tooSmall); + } + /* Assign corresponding FASTCOVER_accel_t to accelParams*/ + accelParams = FASTCOVER_defaultAccelParameters[parameters.accel]; + /* Initialize context */ + { + size_t const initVal = FASTCOVER_ctx_init(&ctx, samplesBuffer, samplesSizes, nbSamples, + coverParams.d, parameters.splitPoint, parameters.f, + accelParams); + if (ZSTD_isError(initVal)) { + DISPLAYLEVEL(1, "Failed to initialize context\n"); + return initVal; + } + } + COVER_warnOnSmallCorpus(dictBufferCapacity, ctx.nbDmers, g_displayLevel); + /* Build the dictionary */ + DISPLAYLEVEL(2, "Building dictionary\n"); + { + /* Initialize array to keep track of frequency of dmer within activeSegment */ + U16* segmentFreqs = (U16 *)calloc(((U64)1 << parameters.f), sizeof(U16)); + const size_t tail = FASTCOVER_buildDictionary(&ctx, ctx.freqs, dictBuffer, + dictBufferCapacity, coverParams, segmentFreqs); + const unsigned nbFinalizeSamples = (unsigned)(ctx.nbTrainSamples * ctx.accelParams.finalize / 100); + const size_t dictionarySize = ZDICT_finalizeDictionary( + dict, dictBufferCapacity, dict + tail, dictBufferCapacity - tail, + samplesBuffer, samplesSizes, nbFinalizeSamples, coverParams.zParams); + if (!ZSTD_isError(dictionarySize)) { + DISPLAYLEVEL(2, "Constructed dictionary of size %u\n", + (unsigned)dictionarySize); + } + FASTCOVER_ctx_destroy(&ctx); + free(segmentFreqs); + return dictionarySize; + } +} + + +ZDICTLIB_API size_t +ZDICT_optimizeTrainFromBuffer_fastCover( + void* dictBuffer, size_t dictBufferCapacity, + const void* samplesBuffer, + const size_t* samplesSizes, unsigned nbSamples, + ZDICT_fastCover_params_t* parameters) +{ + ZDICT_cover_params_t coverParams; + FASTCOVER_accel_t accelParams; + /* constants */ + const unsigned nbThreads = parameters->nbThreads; + const double splitPoint = + parameters->splitPoint <= 0.0 ? FASTCOVER_DEFAULT_SPLITPOINT : parameters->splitPoint; + const unsigned kMinD = parameters->d == 0 ? 6 : parameters->d; + const unsigned kMaxD = parameters->d == 0 ? 8 : parameters->d; + const unsigned kMinK = parameters->k == 0 ? 50 : parameters->k; + const unsigned kMaxK = parameters->k == 0 ? 2000 : parameters->k; + const unsigned kSteps = parameters->steps == 0 ? 40 : parameters->steps; + const unsigned kStepSize = MAX((kMaxK - kMinK) / kSteps, 1); + const unsigned kIterations = + (1 + (kMaxD - kMinD) / 2) * (1 + (kMaxK - kMinK) / kStepSize); + const unsigned f = parameters->f == 0 ? DEFAULT_F : parameters->f; + const unsigned accel = parameters->accel == 0 ? DEFAULT_ACCEL : parameters->accel; + const unsigned shrinkDict = 0; + /* Local variables */ + const int displayLevel = (int)parameters->zParams.notificationLevel; + unsigned iteration = 1; + unsigned d; + unsigned k; + COVER_best_t best; + POOL_ctx *pool = NULL; + int warned = 0; + /* Checks */ + if (splitPoint <= 0 || splitPoint > 1) { + LOCALDISPLAYLEVEL(displayLevel, 1, "Incorrect splitPoint\n"); + return ERROR(parameter_outOfBound); + } + if (accel == 0 || accel > FASTCOVER_MAX_ACCEL) { + LOCALDISPLAYLEVEL(displayLevel, 1, "Incorrect accel\n"); + return ERROR(parameter_outOfBound); + } + if (kMinK < kMaxD || kMaxK < kMinK) { + LOCALDISPLAYLEVEL(displayLevel, 1, "Incorrect k\n"); + return ERROR(parameter_outOfBound); + } + if (nbSamples == 0) { + LOCALDISPLAYLEVEL(displayLevel, 1, "FASTCOVER must have at least one input file\n"); + return ERROR(srcSize_wrong); + } + if (dictBufferCapacity < ZDICT_DICTSIZE_MIN) { + LOCALDISPLAYLEVEL(displayLevel, 1, "dictBufferCapacity must be at least %u\n", + ZDICT_DICTSIZE_MIN); + return ERROR(dstSize_tooSmall); + } + if (nbThreads > 1) { + pool = POOL_create(nbThreads, 1); + if (!pool) { + return ERROR(memory_allocation); + } + } + /* Initialization */ + COVER_best_init(&best); + memset(&coverParams, 0 , sizeof(coverParams)); + FASTCOVER_convertToCoverParams(*parameters, &coverParams); + accelParams = FASTCOVER_defaultAccelParameters[accel]; + /* Turn down global display level to clean up display at level 2 and below */ + g_displayLevel = displayLevel == 0 ? 0 : displayLevel - 1; + /* Loop through d first because each new value needs a new context */ + LOCALDISPLAYLEVEL(displayLevel, 2, "Trying %u different sets of parameters\n", + kIterations); + for (d = kMinD; d <= kMaxD; d += 2) { + /* Initialize the context for this value of d */ + FASTCOVER_ctx_t ctx; + LOCALDISPLAYLEVEL(displayLevel, 3, "d=%u\n", d); + { + size_t const initVal = FASTCOVER_ctx_init(&ctx, samplesBuffer, samplesSizes, nbSamples, d, splitPoint, f, accelParams); + if (ZSTD_isError(initVal)) { + LOCALDISPLAYLEVEL(displayLevel, 1, "Failed to initialize context\n"); + COVER_best_destroy(&best); + POOL_free(pool); + return initVal; + } + } + if (!warned) { + COVER_warnOnSmallCorpus(dictBufferCapacity, ctx.nbDmers, displayLevel); + warned = 1; + } + /* Loop through k reusing the same context */ + for (k = kMinK; k <= kMaxK; k += kStepSize) { + /* Prepare the arguments */ + FASTCOVER_tryParameters_data_t *data = (FASTCOVER_tryParameters_data_t *)malloc( + sizeof(FASTCOVER_tryParameters_data_t)); + LOCALDISPLAYLEVEL(displayLevel, 3, "k=%u\n", k); + if (!data) { + LOCALDISPLAYLEVEL(displayLevel, 1, "Failed to allocate parameters\n"); + COVER_best_destroy(&best); + FASTCOVER_ctx_destroy(&ctx); + POOL_free(pool); + return ERROR(memory_allocation); + } + data->ctx = &ctx; + data->best = &best; + data->dictBufferCapacity = dictBufferCapacity; + data->parameters = coverParams; + data->parameters.k = k; + data->parameters.d = d; + data->parameters.splitPoint = splitPoint; + data->parameters.steps = kSteps; + data->parameters.shrinkDict = shrinkDict; + data->parameters.zParams.notificationLevel = (unsigned)g_displayLevel; + /* Check the parameters */ + if (!FASTCOVER_checkParameters(data->parameters, dictBufferCapacity, + data->ctx->f, accel)) { + DISPLAYLEVEL(1, "FASTCOVER parameters incorrect\n"); + free(data); + continue; + } + /* Call the function and pass ownership of data to it */ + COVER_best_start(&best); + if (pool) { + POOL_add(pool, &FASTCOVER_tryParameters, data); + } else { + FASTCOVER_tryParameters(data); + } + /* Print status */ + LOCALDISPLAYUPDATE(displayLevel, 2, "\r%u%% ", + (unsigned)((iteration * 100) / kIterations)); + ++iteration; + } + COVER_best_wait(&best); + FASTCOVER_ctx_destroy(&ctx); + } + LOCALDISPLAYLEVEL(displayLevel, 2, "\r%79s\r", ""); + /* Fill the output buffer and parameters with output of the best parameters */ + { + const size_t dictSize = best.dictSize; + if (ZSTD_isError(best.compressedSize)) { + const size_t compressedSize = best.compressedSize; + COVER_best_destroy(&best); + POOL_free(pool); + return compressedSize; + } + FASTCOVER_convertToFastCoverParams(best.parameters, parameters, f, accel); + memcpy(dictBuffer, best.dict, dictSize); + COVER_best_destroy(&best); + POOL_free(pool); + return dictSize; + } + +} +/**** ended inlining dictBuilder/fastcover.c ****/ +/**** start inlining dictBuilder/zdict.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + +/*-************************************** +* Tuning parameters +****************************************/ +#define MINRATIO 4 /* minimum nb of apparition to be selected in dictionary */ +#define ZDICT_MAX_SAMPLES_SIZE (2000U << 20) +#define ZDICT_MIN_SAMPLES_SIZE (ZDICT_CONTENTSIZE_MIN * MINRATIO) + + +/*-************************************** +* Compiler Options +****************************************/ +/* Unix Large Files support (>4GB) */ +#define _FILE_OFFSET_BITS 64 +#if (defined(__sun__) && (!defined(__LP64__))) /* Sun Solaris 32-bits requires specific definitions */ +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE +# endif +#elif ! defined(__LP64__) /* No point defining Large file for 64 bit */ +# ifndef _LARGEFILE64_SOURCE +# define _LARGEFILE64_SOURCE +# endif +#endif + + +/*-************************************* +* Dependencies +***************************************/ +#include /* malloc, free */ +#include /* memset */ +#include /* fprintf, fopen, ftello64 */ +#include /* clock */ + +#ifndef ZDICT_STATIC_LINKING_ONLY +# define ZDICT_STATIC_LINKING_ONLY +#endif + +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/huf.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: ../common/xxhash.h ****/ +/**** skipping file: ../compress/zstd_compress_internal.h ****/ +/**** skipping file: ../zdict.h ****/ +/**** skipping file: divsufsort.h ****/ +/**** skipping file: ../common/bits.h ****/ + + +/*-************************************* +* Constants +***************************************/ +#define KB *(1 <<10) +#define MB *(1 <<20) +#define GB *(1U<<30) + +#define DICTLISTSIZE_DEFAULT 10000 + +#define NOISELENGTH 32 + +static const U32 g_selectivity_default = 9; + + +/*-************************************* +* Console display +***************************************/ +#undef DISPLAY +#define DISPLAY(...) { fprintf(stderr, __VA_ARGS__); fflush( stderr ); } +#undef DISPLAYLEVEL +#define DISPLAYLEVEL(l, ...) if (notificationLevel>=l) { DISPLAY(__VA_ARGS__); } /* 0 : no display; 1: errors; 2: default; 3: details; 4: debug */ + +static clock_t ZDICT_clockSpan(clock_t nPrevious) { return clock() - nPrevious; } + +static void ZDICT_printHex(const void* ptr, size_t length) +{ + const BYTE* const b = (const BYTE*)ptr; + size_t u; + for (u=0; u126) c = '.'; /* non-printable char */ + DISPLAY("%c", c); + } +} + + +/*-******************************************************** +* Helper functions +**********************************************************/ +unsigned ZDICT_isError(size_t errorCode) { return ERR_isError(errorCode); } + +const char* ZDICT_getErrorName(size_t errorCode) { return ERR_getErrorName(errorCode); } + +unsigned ZDICT_getDictID(const void* dictBuffer, size_t dictSize) +{ + if (dictSize < 8) return 0; + if (MEM_readLE32(dictBuffer) != ZSTD_MAGIC_DICTIONARY) return 0; + return MEM_readLE32((const char*)dictBuffer + 4); +} + +size_t ZDICT_getDictHeaderSize(const void* dictBuffer, size_t dictSize) +{ + size_t headerSize; + if (dictSize <= 8 || MEM_readLE32(dictBuffer) != ZSTD_MAGIC_DICTIONARY) return ERROR(dictionary_corrupted); + + { ZSTD_compressedBlockState_t* bs = (ZSTD_compressedBlockState_t*)malloc(sizeof(ZSTD_compressedBlockState_t)); + U32* wksp = (U32*)malloc(HUF_WORKSPACE_SIZE); + if (!bs || !wksp) { + headerSize = ERROR(memory_allocation); + } else { + ZSTD_reset_compressedBlockState(bs); + headerSize = ZSTD_loadCEntropy(bs, wksp, dictBuffer, dictSize); + } + + free(bs); + free(wksp); + } + + return headerSize; +} + +/*-******************************************************** +* Dictionary training functions +**********************************************************/ +/*! ZDICT_count() : + Count the nb of common bytes between 2 pointers. + Note : this function presumes end of buffer followed by noisy guard band. +*/ +static size_t ZDICT_count(const void* pIn, const void* pMatch) +{ + const char* const pStart = (const char*)pIn; + for (;;) { + size_t const diff = MEM_readST(pMatch) ^ MEM_readST(pIn); + if (!diff) { + pIn = (const char*)pIn+sizeof(size_t); + pMatch = (const char*)pMatch+sizeof(size_t); + continue; + } + pIn = (const char*)pIn+ZSTD_NbCommonBytes(diff); + return (size_t)((const char*)pIn - pStart); + } +} + + +typedef struct { + U32 pos; + U32 length; + U32 savings; +} dictItem; + +static void ZDICT_initDictItem(dictItem* d) +{ + d->pos = 1; + d->length = 0; + d->savings = (U32)(-1); +} + + +#define LLIMIT 64 /* heuristic determined experimentally */ +#define MINMATCHLENGTH 7 /* heuristic determined experimentally */ +static dictItem ZDICT_analyzePos( + BYTE* doneMarks, + const int* suffix, U32 start, + const void* buffer, U32 minRatio, U32 notificationLevel) +{ + U32 lengthList[LLIMIT] = {0}; + U32 cumulLength[LLIMIT] = {0}; + U32 savings[LLIMIT] = {0}; + const BYTE* b = (const BYTE*)buffer; + size_t maxLength = LLIMIT; + size_t pos = (size_t)suffix[start]; + U32 end = start; + dictItem solution; + + /* init */ + memset(&solution, 0, sizeof(solution)); + doneMarks[pos] = 1; + + /* trivial repetition cases */ + if ( (MEM_read16(b+pos+0) == MEM_read16(b+pos+2)) + ||(MEM_read16(b+pos+1) == MEM_read16(b+pos+3)) + ||(MEM_read16(b+pos+2) == MEM_read16(b+pos+4)) ) { + /* skip and mark segment */ + U16 const pattern16 = MEM_read16(b+pos+4); + U32 u, patternEnd = 6; + while (MEM_read16(b+pos+patternEnd) == pattern16) patternEnd+=2 ; + if (b[pos+patternEnd] == b[pos+patternEnd-1]) patternEnd++; + for (u=1; u= MINMATCHLENGTH); + } + + /* look backward */ + { size_t length; + do { + length = ZDICT_count(b + pos, b + *(suffix+start-1)); + if (length >=MINMATCHLENGTH) start--; + } while(length >= MINMATCHLENGTH); + } + + /* exit if not found a minimum nb of repetitions */ + if (end-start < minRatio) { + U32 idx; + for(idx=start; idx= %i at pos %7u ", (unsigned)(end-start), MINMATCHLENGTH, (unsigned)pos); + DISPLAYLEVEL(4, "\n"); + + for (mml = MINMATCHLENGTH ; ; mml++) { + BYTE currentChar = 0; + U32 currentCount = 0; + U32 currentID = refinedStart; + U32 id; + U32 selectedCount = 0; + U32 selectedID = currentID; + for (id =refinedStart; id < refinedEnd; id++) { + if (b[suffix[id] + mml] != currentChar) { + if (currentCount > selectedCount) { + selectedCount = currentCount; + selectedID = currentID; + } + currentID = id; + currentChar = b[ suffix[id] + mml]; + currentCount = 0; + } + currentCount ++; + } + if (currentCount > selectedCount) { /* for last */ + selectedCount = currentCount; + selectedID = currentID; + } + + if (selectedCount < minRatio) + break; + refinedStart = selectedID; + refinedEnd = refinedStart + selectedCount; + } + + /* evaluate gain based on new dict */ + start = refinedStart; + pos = suffix[refinedStart]; + end = start; + memset(lengthList, 0, sizeof(lengthList)); + + /* look forward */ + { size_t length; + do { + end++; + length = ZDICT_count(b + pos, b + suffix[end]); + if (length >= LLIMIT) length = LLIMIT-1; + lengthList[length]++; + } while (length >=MINMATCHLENGTH); + } + + /* look backward */ + { size_t length = MINMATCHLENGTH; + while ((length >= MINMATCHLENGTH) & (start > 0)) { + length = ZDICT_count(b + pos, b + suffix[start - 1]); + if (length >= LLIMIT) length = LLIMIT - 1; + lengthList[length]++; + if (length >= MINMATCHLENGTH) start--; + } + } + + /* largest useful length */ + memset(cumulLength, 0, sizeof(cumulLength)); + cumulLength[maxLength-1] = lengthList[maxLength-1]; + for (i=(int)(maxLength-2); i>=0; i--) + cumulLength[i] = cumulLength[i+1] + lengthList[i]; + + for (i=LLIMIT-1; i>=MINMATCHLENGTH; i--) if (cumulLength[i]>=minRatio) break; + maxLength = i; + + /* reduce maxLength in case of final into repetitive data */ + { U32 l = (U32)maxLength; + BYTE const c = b[pos + maxLength-1]; + while (b[pos+l-2]==c) l--; + maxLength = l; + } + if (maxLength < MINMATCHLENGTH) return solution; /* skip : no long-enough solution */ + + /* calculate savings */ + savings[5] = 0; + for (i=MINMATCHLENGTH; i<=(int)maxLength; i++) + savings[i] = savings[i-1] + (lengthList[i] * (i-3)); + + DISPLAYLEVEL(4, "Selected dict at position %u, of length %u : saves %u (ratio: %.2f) \n", + (unsigned)pos, (unsigned)maxLength, (unsigned)savings[maxLength], (double)savings[maxLength] / (double)maxLength); + + solution.pos = (U32)pos; + solution.length = (U32)maxLength; + solution.savings = savings[maxLength]; + + /* mark positions done */ + { U32 id; + for (id=start; id solution.length) length = solution.length; + } + pEnd = (U32)(testedPos + length); + for (p=testedPos; ppos; + const U32 eltEnd = elt.pos + elt.length; + const char* const buf = (const char*) buffer; + + /* tail overlap */ + U32 u; for (u=1; u elt.pos) && (table[u].pos <= eltEnd)) { /* overlap, existing > new */ + /* append */ + U32 const addedLength = table[u].pos - elt.pos; + table[u].length += addedLength; + table[u].pos = elt.pos; + table[u].savings += elt.savings * addedLength / elt.length; /* rough approx */ + table[u].savings += elt.length / 8; /* rough approx bonus */ + elt = table[u]; + /* sort : improve rank */ + while ((u>1) && (table[u-1].savings < elt.savings)) + table[u] = table[u-1], u--; + table[u] = elt; + return u; + } } + + /* front overlap */ + for (u=1; u= elt.pos) && (table[u].pos < elt.pos)) { /* overlap, existing < new */ + /* append */ + int const addedLength = (int)eltEnd - (int)(table[u].pos + table[u].length); + table[u].savings += elt.length / 8; /* rough approx bonus */ + if (addedLength > 0) { /* otherwise, elt fully included into existing */ + table[u].length += addedLength; + table[u].savings += elt.savings * addedLength / elt.length; /* rough approx */ + } + /* sort : improve rank */ + elt = table[u]; + while ((u>1) && (table[u-1].savings < elt.savings)) + table[u] = table[u-1], u--; + table[u] = elt; + return u; + } + + if (MEM_read64(buf + table[u].pos) == MEM_read64(buf + elt.pos + 1)) { + if (isIncluded(buf + table[u].pos, buf + elt.pos + 1, table[u].length)) { + size_t const addedLength = MAX( (int)elt.length - (int)table[u].length , 1 ); + table[u].pos = elt.pos; + table[u].savings += (U32)(elt.savings * addedLength / elt.length); + table[u].length = MIN(elt.length, table[u].length + 1); + return u; + } + } + } + + return 0; +} + + +static void ZDICT_removeDictItem(dictItem* table, U32 id) +{ + /* convention : table[0].pos stores nb of elts */ + U32 const max = table[0].pos; + U32 u; + if (!id) return; /* protection, should never happen */ + for (u=id; upos--; +} + + +static void ZDICT_insertDictItem(dictItem* table, U32 maxSize, dictItem elt, const void* buffer) +{ + /* merge if possible */ + U32 mergeId = ZDICT_tryMerge(table, elt, 0, buffer); + if (mergeId) { + U32 newMerge = 1; + while (newMerge) { + newMerge = ZDICT_tryMerge(table, table[mergeId], mergeId, buffer); + if (newMerge) ZDICT_removeDictItem(table, mergeId); + mergeId = newMerge; + } + return; + } + + /* insert */ + { U32 current; + U32 nextElt = table->pos; + if (nextElt >= maxSize) nextElt = maxSize-1; + current = nextElt-1; + while (table[current].savings < elt.savings) { + table[current+1] = table[current]; + current--; + } + table[current+1] = elt; + table->pos = nextElt+1; + } +} + + +static U32 ZDICT_dictSize(const dictItem* dictList) +{ + U32 u, dictSize = 0; + for (u=1; u=l) { \ + if (ZDICT_clockSpan(displayClock) > refreshRate) \ + { displayClock = clock(); DISPLAY(__VA_ARGS__); \ + if (notificationLevel>=4) fflush(stderr); } } + + /* init */ + DISPLAYLEVEL(2, "\r%70s\r", ""); /* clean display line */ + if (!suffix0 || !reverseSuffix || !doneMarks || !filePos) { + result = ERROR(memory_allocation); + goto _cleanup; + } + if (minRatio < MINRATIO) minRatio = MINRATIO; + memset(doneMarks, 0, bufferSize+16); + + /* limit sample set size (divsufsort limitation)*/ + if (bufferSize > ZDICT_MAX_SAMPLES_SIZE) DISPLAYLEVEL(3, "sample set too large : reduced to %u MB ...\n", (unsigned)(ZDICT_MAX_SAMPLES_SIZE>>20)); + while (bufferSize > ZDICT_MAX_SAMPLES_SIZE) bufferSize -= fileSizes[--nbFiles]; + + /* sort */ + DISPLAYLEVEL(2, "sorting %u files of total size %u MB ...\n", nbFiles, (unsigned)(bufferSize>>20)); + { int const divSuftSortResult = divsufsort((const unsigned char*)buffer, suffix, (int)bufferSize, 0); + if (divSuftSortResult != 0) { result = ERROR(GENERIC); goto _cleanup; } + } + suffix[bufferSize] = (int)bufferSize; /* leads into noise */ + suffix0[0] = (int)bufferSize; /* leads into noise */ + /* build reverse suffix sort */ + { size_t pos; + for (pos=0; pos < bufferSize; pos++) + reverseSuffix[suffix[pos]] = (U32)pos; + /* note filePos tracks borders between samples. + It's not used at this stage, but planned to become useful in a later update */ + filePos[0] = 0; + for (pos=1; pos> 21); + } +} + + +typedef struct +{ + ZSTD_CDict* dict; /* dictionary */ + ZSTD_CCtx* zc; /* working context */ + void* workPlace; /* must be ZSTD_BLOCKSIZE_MAX allocated */ +} EStats_ress_t; + +#define MAXREPOFFSET 1024 + +static void ZDICT_countEStats(EStats_ress_t esr, const ZSTD_parameters* params, + unsigned* countLit, unsigned* offsetcodeCount, unsigned* matchlengthCount, unsigned* litlengthCount, U32* repOffsets, + const void* src, size_t srcSize, + U32 notificationLevel) +{ + size_t const blockSizeMax = MIN (ZSTD_BLOCKSIZE_MAX, 1 << params->cParams.windowLog); + size_t cSize; + + if (srcSize > blockSizeMax) srcSize = blockSizeMax; /* protection vs large samples */ + { size_t const errorCode = ZSTD_compressBegin_usingCDict_deprecated(esr.zc, esr.dict); + if (ZSTD_isError(errorCode)) { DISPLAYLEVEL(1, "warning : ZSTD_compressBegin_usingCDict failed \n"); return; } + + } + cSize = ZSTD_compressBlock_deprecated(esr.zc, esr.workPlace, ZSTD_BLOCKSIZE_MAX, src, srcSize); + if (ZSTD_isError(cSize)) { DISPLAYLEVEL(3, "warning : could not compress sample size %u \n", (unsigned)srcSize); return; } + + if (cSize) { /* if == 0; block is not compressible */ + const seqStore_t* const seqStorePtr = ZSTD_getSeqStore(esr.zc); + + /* literals stats */ + { const BYTE* bytePtr; + for(bytePtr = seqStorePtr->litStart; bytePtr < seqStorePtr->lit; bytePtr++) + countLit[*bytePtr]++; + } + + /* seqStats */ + { U32 const nbSeq = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart); + ZSTD_seqToCodes(seqStorePtr); + + { const BYTE* codePtr = seqStorePtr->ofCode; + U32 u; + for (u=0; umlCode; + U32 u; + for (u=0; ullCode; + U32 u; + for (u=0; u= 2) { /* rep offsets */ + const seqDef* const seq = seqStorePtr->sequencesStart; + U32 offset1 = seq[0].offBase - ZSTD_REP_NUM; + U32 offset2 = seq[1].offBase - ZSTD_REP_NUM; + if (offset1 >= MAXREPOFFSET) offset1 = 0; + if (offset2 >= MAXREPOFFSET) offset2 = 0; + repOffsets[offset1] += 3; + repOffsets[offset2] += 1; + } } } +} + +static size_t ZDICT_totalSampleSize(const size_t* fileSizes, unsigned nbFiles) +{ + size_t total=0; + unsigned u; + for (u=0; u0; u--) { + offsetCount_t tmp; + if (table[u-1].count >= table[u].count) break; + tmp = table[u-1]; + table[u-1] = table[u]; + table[u] = tmp; + } +} + +/* ZDICT_flatLit() : + * rewrite `countLit` to contain a mostly flat but still compressible distribution of literals. + * necessary to avoid generating a non-compressible distribution that HUF_writeCTable() cannot encode. + */ +static void ZDICT_flatLit(unsigned* countLit) +{ + int u; + for (u=1; u<256; u++) countLit[u] = 2; + countLit[0] = 4; + countLit[253] = 1; + countLit[254] = 1; +} + +#define OFFCODE_MAX 30 /* only applicable to first block */ +static size_t ZDICT_analyzeEntropy(void* dstBuffer, size_t maxDstSize, + int compressionLevel, + const void* srcBuffer, const size_t* fileSizes, unsigned nbFiles, + const void* dictBuffer, size_t dictBufferSize, + unsigned notificationLevel) +{ + unsigned countLit[256]; + HUF_CREATE_STATIC_CTABLE(hufTable, 255); + unsigned offcodeCount[OFFCODE_MAX+1]; + short offcodeNCount[OFFCODE_MAX+1]; + U32 offcodeMax = ZSTD_highbit32((U32)(dictBufferSize + 128 KB)); + unsigned matchLengthCount[MaxML+1]; + short matchLengthNCount[MaxML+1]; + unsigned litLengthCount[MaxLL+1]; + short litLengthNCount[MaxLL+1]; + U32 repOffset[MAXREPOFFSET]; + offsetCount_t bestRepOffset[ZSTD_REP_NUM+1]; + EStats_ress_t esr = { NULL, NULL, NULL }; + ZSTD_parameters params; + U32 u, huffLog = 11, Offlog = OffFSELog, mlLog = MLFSELog, llLog = LLFSELog, total; + size_t pos = 0, errorCode; + size_t eSize = 0; + size_t const totalSrcSize = ZDICT_totalSampleSize(fileSizes, nbFiles); + size_t const averageSampleSize = totalSrcSize / (nbFiles + !nbFiles); + BYTE* dstPtr = (BYTE*)dstBuffer; + U32 wksp[HUF_CTABLE_WORKSPACE_SIZE_U32]; + + /* init */ + DEBUGLOG(4, "ZDICT_analyzeEntropy"); + if (offcodeMax>OFFCODE_MAX) { eSize = ERROR(dictionaryCreation_failed); goto _cleanup; } /* too large dictionary */ + for (u=0; u<256; u++) countLit[u] = 1; /* any character must be described */ + for (u=0; u<=offcodeMax; u++) offcodeCount[u] = 1; + for (u=0; u<=MaxML; u++) matchLengthCount[u] = 1; + for (u=0; u<=MaxLL; u++) litLengthCount[u] = 1; + memset(repOffset, 0, sizeof(repOffset)); + repOffset[1] = repOffset[4] = repOffset[8] = 1; + memset(bestRepOffset, 0, sizeof(bestRepOffset)); + if (compressionLevel==0) compressionLevel = ZSTD_CLEVEL_DEFAULT; + params = ZSTD_getParams(compressionLevel, averageSampleSize, dictBufferSize); + + esr.dict = ZSTD_createCDict_advanced(dictBuffer, dictBufferSize, ZSTD_dlm_byRef, ZSTD_dct_rawContent, params.cParams, ZSTD_defaultCMem); + esr.zc = ZSTD_createCCtx(); + esr.workPlace = malloc(ZSTD_BLOCKSIZE_MAX); + if (!esr.dict || !esr.zc || !esr.workPlace) { + eSize = ERROR(memory_allocation); + DISPLAYLEVEL(1, "Not enough memory \n"); + goto _cleanup; + } + + /* collect stats on all samples */ + for (u=0; u= 4) { + /* writeStats */ + DISPLAYLEVEL(4, "Offset Code Frequencies : \n"); + for (u=0; u<=offcodeMax; u++) { + DISPLAYLEVEL(4, "%2u :%7u \n", u, offcodeCount[u]); + } } + + /* analyze, build stats, starting with literals */ + { size_t maxNbBits = HUF_buildCTable_wksp(hufTable, countLit, 255, huffLog, wksp, sizeof(wksp)); + if (HUF_isError(maxNbBits)) { + eSize = maxNbBits; + DISPLAYLEVEL(1, " HUF_buildCTable error \n"); + goto _cleanup; + } + if (maxNbBits==8) { /* not compressible : will fail on HUF_writeCTable() */ + DISPLAYLEVEL(2, "warning : pathological dataset : literals are not compressible : samples are noisy or too regular \n"); + ZDICT_flatLit(countLit); /* replace distribution by a fake "mostly flat but still compressible" distribution, that HUF_writeCTable() can encode */ + maxNbBits = HUF_buildCTable_wksp(hufTable, countLit, 255, huffLog, wksp, sizeof(wksp)); + assert(maxNbBits==9); + } + huffLog = (U32)maxNbBits; + } + + /* looking for most common first offsets */ + { U32 offset; + for (offset=1; offset dictBufferCapacity) { + dictContentSize = dictBufferCapacity - hSize; + } + + /* Pad the dictionary content with zeros if it is too small */ + if (dictContentSize < minContentSize) { + RETURN_ERROR_IF(hSize + minContentSize > dictBufferCapacity, dstSize_tooSmall, + "dictBufferCapacity too small to fit max repcode"); + paddingSize = minContentSize - dictContentSize; + } else { + paddingSize = 0; + } + + { + size_t const dictSize = hSize + paddingSize + dictContentSize; + + /* The dictionary consists of the header, optional padding, and the content. + * The padding comes before the content because the "best" position in the + * dictionary is the last byte. + */ + BYTE* const outDictHeader = (BYTE*)dictBuffer; + BYTE* const outDictPadding = outDictHeader + hSize; + BYTE* const outDictContent = outDictPadding + paddingSize; + + assert(dictSize <= dictBufferCapacity); + assert(outDictContent + dictContentSize == (BYTE*)dictBuffer + dictSize); + + /* First copy the customDictContent into its final location. + * `customDictContent` and `dictBuffer` may overlap, so we must + * do this before any other writes into the output buffer. + * Then copy the header & padding into the output buffer. + */ + memmove(outDictContent, customDictContent, dictContentSize); + memcpy(outDictHeader, header, hSize); + memset(outDictPadding, 0, paddingSize); + + return dictSize; + } +} + + +static size_t ZDICT_addEntropyTablesFromBuffer_advanced( + void* dictBuffer, size_t dictContentSize, size_t dictBufferCapacity, + const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples, + ZDICT_params_t params) +{ + int const compressionLevel = (params.compressionLevel == 0) ? ZSTD_CLEVEL_DEFAULT : params.compressionLevel; + U32 const notificationLevel = params.notificationLevel; + size_t hSize = 8; + + /* calculate entropy tables */ + DISPLAYLEVEL(2, "\r%70s\r", ""); /* clean display line */ + DISPLAYLEVEL(2, "statistics ... \n"); + { size_t const eSize = ZDICT_analyzeEntropy((char*)dictBuffer+hSize, dictBufferCapacity-hSize, + compressionLevel, + samplesBuffer, samplesSizes, nbSamples, + (char*)dictBuffer + dictBufferCapacity - dictContentSize, dictContentSize, + notificationLevel); + if (ZDICT_isError(eSize)) return eSize; + hSize += eSize; + } + + /* add dictionary header (after entropy tables) */ + MEM_writeLE32(dictBuffer, ZSTD_MAGIC_DICTIONARY); + { U64 const randomID = XXH64((char*)dictBuffer + dictBufferCapacity - dictContentSize, dictContentSize, 0); + U32 const compliantID = (randomID % ((1U<<31)-32768)) + 32768; + U32 const dictID = params.dictID ? params.dictID : compliantID; + MEM_writeLE32((char*)dictBuffer+4, dictID); + } + + if (hSize + dictContentSize < dictBufferCapacity) + memmove((char*)dictBuffer + hSize, (char*)dictBuffer + dictBufferCapacity - dictContentSize, dictContentSize); + return MIN(dictBufferCapacity, hSize+dictContentSize); +} + +/*! ZDICT_trainFromBuffer_unsafe_legacy() : +* Warning : `samplesBuffer` must be followed by noisy guard band !!! +* @return : size of dictionary, or an error code which can be tested with ZDICT_isError() +*/ +static size_t ZDICT_trainFromBuffer_unsafe_legacy( + void* dictBuffer, size_t maxDictSize, + const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples, + ZDICT_legacy_params_t params) +{ + U32 const dictListSize = MAX(MAX(DICTLISTSIZE_DEFAULT, nbSamples), (U32)(maxDictSize/16)); + dictItem* const dictList = (dictItem*)malloc(dictListSize * sizeof(*dictList)); + unsigned const selectivity = params.selectivityLevel == 0 ? g_selectivity_default : params.selectivityLevel; + unsigned const minRep = (selectivity > 30) ? MINRATIO : nbSamples >> selectivity; + size_t const targetDictSize = maxDictSize; + size_t const samplesBuffSize = ZDICT_totalSampleSize(samplesSizes, nbSamples); + size_t dictSize = 0; + U32 const notificationLevel = params.zParams.notificationLevel; + + /* checks */ + if (!dictList) return ERROR(memory_allocation); + if (maxDictSize < ZDICT_DICTSIZE_MIN) { free(dictList); return ERROR(dstSize_tooSmall); } /* requested dictionary size is too small */ + if (samplesBuffSize < ZDICT_MIN_SAMPLES_SIZE) { free(dictList); return ERROR(dictionaryCreation_failed); } /* not enough source to create dictionary */ + + /* init */ + ZDICT_initDictItem(dictList); + + /* build dictionary */ + ZDICT_trainBuffer_legacy(dictList, dictListSize, + samplesBuffer, samplesBuffSize, + samplesSizes, nbSamples, + minRep, notificationLevel); + + /* display best matches */ + if (params.zParams.notificationLevel>= 3) { + unsigned const nb = MIN(25, dictList[0].pos); + unsigned const dictContentSize = ZDICT_dictSize(dictList); + unsigned u; + DISPLAYLEVEL(3, "\n %u segments found, of total size %u \n", (unsigned)dictList[0].pos-1, dictContentSize); + DISPLAYLEVEL(3, "list %u best segments \n", nb-1); + for (u=1; u samplesBuffSize) || ((pos + length) > samplesBuffSize)) { + free(dictList); + return ERROR(GENERIC); /* should never happen */ + } + DISPLAYLEVEL(3, "%3u:%3u bytes at pos %8u, savings %7u bytes |", + u, length, pos, (unsigned)dictList[u].savings); + ZDICT_printHex((const char*)samplesBuffer+pos, printedLength); + DISPLAYLEVEL(3, "| \n"); + } } + + + /* create dictionary */ + { unsigned dictContentSize = ZDICT_dictSize(dictList); + if (dictContentSize < ZDICT_CONTENTSIZE_MIN) { free(dictList); return ERROR(dictionaryCreation_failed); } /* dictionary content too small */ + if (dictContentSize < targetDictSize/4) { + DISPLAYLEVEL(2, "! warning : selected content significantly smaller than requested (%u < %u) \n", dictContentSize, (unsigned)maxDictSize); + if (samplesBuffSize < 10 * targetDictSize) + DISPLAYLEVEL(2, "! consider increasing the number of samples (total size : %u MB)\n", (unsigned)(samplesBuffSize>>20)); + if (minRep > MINRATIO) { + DISPLAYLEVEL(2, "! consider increasing selectivity to produce larger dictionary (-s%u) \n", selectivity+1); + DISPLAYLEVEL(2, "! note : larger dictionaries are not necessarily better, test its efficiency on samples \n"); + } + } + + if ((dictContentSize > targetDictSize*3) && (nbSamples > 2*MINRATIO) && (selectivity>1)) { + unsigned proposedSelectivity = selectivity-1; + while ((nbSamples >> proposedSelectivity) <= MINRATIO) { proposedSelectivity--; } + DISPLAYLEVEL(2, "! note : calculated dictionary significantly larger than requested (%u > %u) \n", dictContentSize, (unsigned)maxDictSize); + DISPLAYLEVEL(2, "! consider increasing dictionary size, or produce denser dictionary (-s%u) \n", proposedSelectivity); + DISPLAYLEVEL(2, "! always test dictionary efficiency on real samples \n"); + } + + /* limit dictionary size */ + { U32 const max = dictList->pos; /* convention : nb of useful elts within dictList */ + U32 currentSize = 0; + U32 n; for (n=1; n targetDictSize) { currentSize -= dictList[n].length; break; } + } + dictList->pos = n; + dictContentSize = currentSize; + } + + /* build dict content */ + { U32 u; + BYTE* ptr = (BYTE*)dictBuffer + maxDictSize; + for (u=1; upos; u++) { + U32 l = dictList[u].length; + ptr -= l; + if (ptr<(BYTE*)dictBuffer) { free(dictList); return ERROR(GENERIC); } /* should not happen */ + memcpy(ptr, (const char*)samplesBuffer+dictList[u].pos, l); + } } + + dictSize = ZDICT_addEntropyTablesFromBuffer_advanced(dictBuffer, dictContentSize, maxDictSize, + samplesBuffer, samplesSizes, nbSamples, + params.zParams); + } + + /* clean up */ + free(dictList); + return dictSize; +} + + +/* ZDICT_trainFromBuffer_legacy() : + * issue : samplesBuffer need to be followed by a noisy guard band. + * work around : duplicate the buffer, and add the noise */ +size_t ZDICT_trainFromBuffer_legacy(void* dictBuffer, size_t dictBufferCapacity, + const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples, + ZDICT_legacy_params_t params) +{ + size_t result; + void* newBuff; + size_t const sBuffSize = ZDICT_totalSampleSize(samplesSizes, nbSamples); + if (sBuffSize < ZDICT_MIN_SAMPLES_SIZE) return 0; /* not enough content => no dictionary */ + + newBuff = malloc(sBuffSize + NOISELENGTH); + if (!newBuff) return ERROR(memory_allocation); + + memcpy(newBuff, samplesBuffer, sBuffSize); + ZDICT_fillNoise((char*)newBuff + sBuffSize, NOISELENGTH); /* guard band, for end of buffer condition */ + + result = + ZDICT_trainFromBuffer_unsafe_legacy(dictBuffer, dictBufferCapacity, newBuff, + samplesSizes, nbSamples, params); + free(newBuff); + return result; +} + + +size_t ZDICT_trainFromBuffer(void* dictBuffer, size_t dictBufferCapacity, + const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples) +{ + ZDICT_fastCover_params_t params; + DEBUGLOG(3, "ZDICT_trainFromBuffer"); + memset(¶ms, 0, sizeof(params)); + params.d = 8; + params.steps = 4; + /* Use default level since no compression level information is available */ + params.zParams.compressionLevel = ZSTD_CLEVEL_DEFAULT; +#if defined(DEBUGLEVEL) && (DEBUGLEVEL>=1) + params.zParams.notificationLevel = DEBUGLEVEL; +#endif + return ZDICT_optimizeTrainFromBuffer_fastCover(dictBuffer, dictBufferCapacity, + samplesBuffer, samplesSizes, nbSamples, + ¶ms); +} + +size_t ZDICT_addEntropyTablesFromBuffer(void* dictBuffer, size_t dictContentSize, size_t dictBufferCapacity, + const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples) +{ + ZDICT_params_t params; + memset(¶ms, 0, sizeof(params)); + return ZDICT_addEntropyTablesFromBuffer_advanced(dictBuffer, dictContentSize, dictBufferCapacity, + samplesBuffer, samplesSizes, nbSamples, + params); +} +/**** ended inlining dictBuilder/zdict.c ****/ diff --git a/ktx/external/basisu/zstd/zstd.h b/ktx/external/basisu/zstd/zstd.h new file mode 100644 index 0000000..e5c3f8b --- /dev/null +++ b/ktx/external/basisu/zstd/zstd.h @@ -0,0 +1,3020 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef ZSTD_H_235446 +#define ZSTD_H_235446 + +/* ====== Dependencies ======*/ +#include /* INT_MAX */ +#include /* size_t */ + + +/* ===== ZSTDLIB_API : control library symbols visibility ===== */ +#ifndef ZSTDLIB_VISIBLE + /* Backwards compatibility with old macro name */ +# ifdef ZSTDLIB_VISIBILITY +# define ZSTDLIB_VISIBLE ZSTDLIB_VISIBILITY +# elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDLIB_VISIBLE __attribute__ ((visibility ("default"))) +# else +# define ZSTDLIB_VISIBLE +# endif +#endif + +#ifndef ZSTDLIB_HIDDEN +# if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDLIB_HIDDEN __attribute__ ((visibility ("hidden"))) +# else +# define ZSTDLIB_HIDDEN +# endif +#endif + +#if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDLIB_API __declspec(dllexport) ZSTDLIB_VISIBLE +#elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDLIB_API __declspec(dllimport) ZSTDLIB_VISIBLE /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define ZSTDLIB_API ZSTDLIB_VISIBLE +#endif + +/* Deprecation warnings : + * Should these warnings be a problem, it is generally possible to disable them, + * typically with -Wno-deprecated-declarations for gcc or _CRT_SECURE_NO_WARNINGS in Visual. + * Otherwise, it's also possible to define ZSTD_DISABLE_DEPRECATE_WARNINGS. + */ +#ifdef ZSTD_DISABLE_DEPRECATE_WARNINGS +# define ZSTD_DEPRECATED(message) /* disable deprecation warnings */ +#else +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define ZSTD_DEPRECATED(message) [[deprecated(message)]] +# elif (defined(GNUC) && (GNUC > 4 || (GNUC == 4 && GNUC_MINOR >= 5))) || defined(__clang__) +# define ZSTD_DEPRECATED(message) __attribute__((deprecated(message))) +# elif defined(__GNUC__) && (__GNUC__ >= 3) +# define ZSTD_DEPRECATED(message) __attribute__((deprecated)) +# elif defined(_MSC_VER) +# define ZSTD_DEPRECATED(message) __declspec(deprecated(message)) +# else +# pragma message("WARNING: You need to implement ZSTD_DEPRECATED for this compiler") +# define ZSTD_DEPRECATED(message) +# endif +#endif /* ZSTD_DISABLE_DEPRECATE_WARNINGS */ + + +/******************************************************************************* + Introduction + + zstd, short for Zstandard, is a fast lossless compression algorithm, targeting + real-time compression scenarios at zlib-level and better compression ratios. + The zstd compression library provides in-memory compression and decompression + functions. + + The library supports regular compression levels from 1 up to ZSTD_maxCLevel(), + which is currently 22. Levels >= 20, labeled `--ultra`, should be used with + caution, as they require more memory. The library also offers negative + compression levels, which extend the range of speed vs. ratio preferences. + The lower the level, the faster the speed (at the cost of compression). + + Compression can be done in: + - a single step (described as Simple API) + - a single step, reusing a context (described as Explicit context) + - unbounded multiple steps (described as Streaming compression) + + The compression ratio achievable on small data can be highly improved using + a dictionary. Dictionary compression can be performed in: + - a single step (described as Simple dictionary API) + - a single step, reusing a dictionary (described as Bulk-processing + dictionary API) + + Advanced experimental functions can be accessed using + `#define ZSTD_STATIC_LINKING_ONLY` before including zstd.h. + + Advanced experimental APIs should never be used with a dynamically-linked + library. They are not "stable"; their definitions or signatures may change in + the future. Only static linking is allowed. +*******************************************************************************/ + +/*------ Version ------*/ +#define ZSTD_VERSION_MAJOR 1 +#define ZSTD_VERSION_MINOR 5 +#define ZSTD_VERSION_RELEASE 5 +#define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE) + +/*! ZSTD_versionNumber() : + * Return runtime library version, the value is (MAJOR*100*100 + MINOR*100 + RELEASE). */ +ZSTDLIB_API unsigned ZSTD_versionNumber(void); + +#define ZSTD_LIB_VERSION ZSTD_VERSION_MAJOR.ZSTD_VERSION_MINOR.ZSTD_VERSION_RELEASE +#define ZSTD_QUOTE(str) #str +#define ZSTD_EXPAND_AND_QUOTE(str) ZSTD_QUOTE(str) +#define ZSTD_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LIB_VERSION) + +/*! ZSTD_versionString() : + * Return runtime library version, like "1.4.5". Requires v1.3.0+. */ +ZSTDLIB_API const char* ZSTD_versionString(void); + +/* ************************************* + * Default constant + ***************************************/ +#ifndef ZSTD_CLEVEL_DEFAULT +# define ZSTD_CLEVEL_DEFAULT 3 +#endif + +/* ************************************* + * Constants + ***************************************/ + +/* All magic numbers are supposed read/written to/from files/memory using little-endian convention */ +#define ZSTD_MAGICNUMBER 0xFD2FB528 /* valid since v0.8.0 */ +#define ZSTD_MAGIC_DICTIONARY 0xEC30A437 /* valid since v0.7.0 */ +#define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50 /* all 16 values, from 0x184D2A50 to 0x184D2A5F, signal the beginning of a skippable frame */ +#define ZSTD_MAGIC_SKIPPABLE_MASK 0xFFFFFFF0 + +#define ZSTD_BLOCKSIZELOG_MAX 17 +#define ZSTD_BLOCKSIZE_MAX (1<= ZSTD_compressBound(srcSize)` guarantees that zstd will have + * enough space to successfully compress the data. + * @return : compressed size written into `dst` (<= `dstCapacity), + * or an error code if it fails (which can be tested using ZSTD_isError()). */ +ZSTDLIB_API size_t ZSTD_compress( void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + int compressionLevel); + +/*! ZSTD_decompress() : + * `compressedSize` : must be the _exact_ size of some number of compressed and/or skippable frames. + * `dstCapacity` is an upper bound of originalSize to regenerate. + * If user cannot imply a maximum upper bound, it's better to use streaming mode to decompress data. + * @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), + * or an errorCode if it fails (which can be tested using ZSTD_isError()). */ +ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity, + const void* src, size_t compressedSize); + +/*! ZSTD_getFrameContentSize() : requires v1.3.0+ + * `src` should point to the start of a ZSTD encoded frame. + * `srcSize` must be at least as large as the frame header. + * hint : any size >= `ZSTD_frameHeaderSize_max` is large enough. + * @return : - decompressed size of `src` frame content, if known + * - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined + * - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) + * note 1 : a 0 return value means the frame is valid but "empty". + * note 2 : decompressed size is an optional field, it may not be present, typically in streaming mode. + * When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. + * In which case, it's necessary to use streaming mode to decompress data. + * Optionally, application can rely on some implicit limit, + * as ZSTD_decompress() only needs an upper bound of decompressed size. + * (For example, data could be necessarily cut into blocks <= 16 KB). + * note 3 : decompressed size is always present when compression is completed using single-pass functions, + * such as ZSTD_compress(), ZSTD_compressCCtx() ZSTD_compress_usingDict() or ZSTD_compress_usingCDict(). + * note 4 : decompressed size can be very large (64-bits value), + * potentially larger than what local system can handle as a single memory segment. + * In which case, it's necessary to use streaming mode to decompress data. + * note 5 : If source is untrusted, decompressed size could be wrong or intentionally modified. + * Always ensure return value fits within application's authorized limits. + * Each application can set its own limits. + * note 6 : This function replaces ZSTD_getDecompressedSize() */ +#define ZSTD_CONTENTSIZE_UNKNOWN (0ULL - 1) +#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2) +ZSTDLIB_API unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize); + +/*! ZSTD_getDecompressedSize() : + * NOTE: This function is now obsolete, in favor of ZSTD_getFrameContentSize(). + * Both functions work the same way, but ZSTD_getDecompressedSize() blends + * "empty", "unknown" and "error" results to the same return value (0), + * while ZSTD_getFrameContentSize() gives them separate return values. + * @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise. */ +ZSTD_DEPRECATED("Replaced by ZSTD_getFrameContentSize") +ZSTDLIB_API +unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize); + +/*! ZSTD_findFrameCompressedSize() : Requires v1.4.0+ + * `src` should point to the start of a ZSTD frame or skippable frame. + * `srcSize` must be >= first frame size + * @return : the compressed size of the first frame starting at `src`, + * suitable to pass as `srcSize` to `ZSTD_decompress` or similar, + * or an error code if input is invalid */ +ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize); + + +/*====== Helper functions ======*/ +/* ZSTD_compressBound() : + * maximum compressed size in worst case single-pass scenario. + * When invoking `ZSTD_compress()` or any other one-pass compression function, + * it's recommended to provide @dstCapacity >= ZSTD_compressBound(srcSize) + * as it eliminates one potential failure scenario, + * aka not enough room in dst buffer to write the compressed frame. + * Note : ZSTD_compressBound() itself can fail, if @srcSize > ZSTD_MAX_INPUT_SIZE . + * In which case, ZSTD_compressBound() will return an error code + * which can be tested using ZSTD_isError(). + * + * ZSTD_COMPRESSBOUND() : + * same as ZSTD_compressBound(), but as a macro. + * It can be used to produce constants, which can be useful for static allocation, + * for example to size a static array on stack. + * Will produce constant value 0 if srcSize too large. + */ +#define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00LLU : 0xFF00FF00U) +#define ZSTD_COMPRESSBOUND(srcSize) (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0)) /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */ +ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */ +/* ZSTD_isError() : + * Most ZSTD_* functions returning a size_t value can be tested for error, + * using ZSTD_isError(). + * @return 1 if error, 0 otherwise + */ +ZSTDLIB_API unsigned ZSTD_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ +ZSTDLIB_API const char* ZSTD_getErrorName(size_t code); /*!< provides readable string from an error code */ +ZSTDLIB_API int ZSTD_minCLevel(void); /*!< minimum negative compression level allowed, requires v1.4.0+ */ +ZSTDLIB_API int ZSTD_maxCLevel(void); /*!< maximum compression level available */ +ZSTDLIB_API int ZSTD_defaultCLevel(void); /*!< default compression level, specified by ZSTD_CLEVEL_DEFAULT, requires v1.5.0+ */ + + +/*************************************** +* Explicit context +***************************************/ +/*= Compression context + * When compressing many times, + * it is recommended to allocate a context just once, + * and re-use it for each successive compression operation. + * This will make workload friendlier for system's memory. + * Note : re-using context is just a speed / resource optimization. + * It doesn't change the compression ratio, which remains identical. + * Note 2 : In multi-threaded environments, + * use one different context per thread for parallel execution. + */ +typedef struct ZSTD_CCtx_s ZSTD_CCtx; +ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void); +ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx); /* accept NULL pointer */ + +/*! ZSTD_compressCCtx() : + * Same as ZSTD_compress(), using an explicit ZSTD_CCtx. + * Important : in order to behave similarly to `ZSTD_compress()`, + * this function compresses at requested compression level, + * __ignoring any other parameter__ . + * If any advanced parameter was set using the advanced API, + * they will all be reset. Only `compressionLevel` remains. + */ +ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + int compressionLevel); + +/*= Decompression context + * When decompressing many times, + * it is recommended to allocate a context only once, + * and re-use it for each successive compression operation. + * This will make workload friendlier for system's memory. + * Use one context per thread for parallel execution. */ +typedef struct ZSTD_DCtx_s ZSTD_DCtx; +ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void); +ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); /* accept NULL pointer */ + +/*! ZSTD_decompressDCtx() : + * Same as ZSTD_decompress(), + * requires an allocated ZSTD_DCtx. + * Compatible with sticky parameters. + */ +ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize); + + +/********************************************* +* Advanced compression API (Requires v1.4.0+) +**********************************************/ + +/* API design : + * Parameters are pushed one by one into an existing context, + * using ZSTD_CCtx_set*() functions. + * Pushed parameters are sticky : they are valid for next compressed frame, and any subsequent frame. + * "sticky" parameters are applicable to `ZSTD_compress2()` and `ZSTD_compressStream*()` ! + * __They do not apply to "simple" one-shot variants such as ZSTD_compressCCtx()__ . + * + * It's possible to reset all parameters to "default" using ZSTD_CCtx_reset(). + * + * This API supersedes all other "advanced" API entry points in the experimental section. + * In the future, we expect to remove from experimental API entry points which are redundant with this API. + */ + + +/* Compression strategies, listed from fastest to strongest */ +typedef enum { ZSTD_fast=1, + ZSTD_dfast=2, + ZSTD_greedy=3, + ZSTD_lazy=4, + ZSTD_lazy2=5, + ZSTD_btlazy2=6, + ZSTD_btopt=7, + ZSTD_btultra=8, + ZSTD_btultra2=9 + /* note : new strategies _might_ be added in the future. + Only the order (from fast to strong) is guaranteed */ +} ZSTD_strategy; + +typedef enum { + + /* compression parameters + * Note: When compressing with a ZSTD_CDict these parameters are superseded + * by the parameters used to construct the ZSTD_CDict. + * See ZSTD_CCtx_refCDict() for more info (superseded-by-cdict). */ + ZSTD_c_compressionLevel=100, /* Set compression parameters according to pre-defined cLevel table. + * Note that exact compression parameters are dynamically determined, + * depending on both compression level and srcSize (when known). + * Default level is ZSTD_CLEVEL_DEFAULT==3. + * Special: value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT. + * Note 1 : it's possible to pass a negative compression level. + * Note 2 : setting a level does not automatically set all other compression parameters + * to default. Setting this will however eventually dynamically impact the compression + * parameters which have not been manually set. The manually set + * ones will 'stick'. */ + /* Advanced compression parameters : + * It's possible to pin down compression parameters to some specific values. + * In which case, these values are no longer dynamically selected by the compressor */ + ZSTD_c_windowLog=101, /* Maximum allowed back-reference distance, expressed as power of 2. + * This will set a memory budget for streaming decompression, + * with larger values requiring more memory + * and typically compressing more. + * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX. + * Special: value 0 means "use default windowLog". + * Note: Using a windowLog greater than ZSTD_WINDOWLOG_LIMIT_DEFAULT + * requires explicitly allowing such size at streaming decompression stage. */ + ZSTD_c_hashLog=102, /* Size of the initial probe table, as a power of 2. + * Resulting memory usage is (1 << (hashLog+2)). + * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX. + * Larger tables improve compression ratio of strategies <= dFast, + * and improve speed of strategies > dFast. + * Special: value 0 means "use default hashLog". */ + ZSTD_c_chainLog=103, /* Size of the multi-probe search table, as a power of 2. + * Resulting memory usage is (1 << (chainLog+2)). + * Must be clamped between ZSTD_CHAINLOG_MIN and ZSTD_CHAINLOG_MAX. + * Larger tables result in better and slower compression. + * This parameter is useless for "fast" strategy. + * It's still useful when using "dfast" strategy, + * in which case it defines a secondary probe table. + * Special: value 0 means "use default chainLog". */ + ZSTD_c_searchLog=104, /* Number of search attempts, as a power of 2. + * More attempts result in better and slower compression. + * This parameter is useless for "fast" and "dFast" strategies. + * Special: value 0 means "use default searchLog". */ + ZSTD_c_minMatch=105, /* Minimum size of searched matches. + * Note that Zstandard can still find matches of smaller size, + * it just tweaks its search algorithm to look for this size and larger. + * Larger values increase compression and decompression speed, but decrease ratio. + * Must be clamped between ZSTD_MINMATCH_MIN and ZSTD_MINMATCH_MAX. + * Note that currently, for all strategies < btopt, effective minimum is 4. + * , for all strategies > fast, effective maximum is 6. + * Special: value 0 means "use default minMatchLength". */ + ZSTD_c_targetLength=106, /* Impact of this field depends on strategy. + * For strategies btopt, btultra & btultra2: + * Length of Match considered "good enough" to stop search. + * Larger values make compression stronger, and slower. + * For strategy fast: + * Distance between match sampling. + * Larger values make compression faster, and weaker. + * Special: value 0 means "use default targetLength". */ + ZSTD_c_strategy=107, /* See ZSTD_strategy enum definition. + * The higher the value of selected strategy, the more complex it is, + * resulting in stronger and slower compression. + * Special: value 0 means "use default strategy". */ + /* LDM mode parameters */ + ZSTD_c_enableLongDistanceMatching=160, /* Enable long distance matching. + * This parameter is designed to improve compression ratio + * for large inputs, by finding large matches at long distance. + * It increases memory usage and window size. + * Note: enabling this parameter increases default ZSTD_c_windowLog to 128 MB + * except when expressly set to a different value. + * Note: will be enabled by default if ZSTD_c_windowLog >= 128 MB and + * compression strategy >= ZSTD_btopt (== compression level 16+) */ + ZSTD_c_ldmHashLog=161, /* Size of the table for long distance matching, as a power of 2. + * Larger values increase memory usage and compression ratio, + * but decrease compression speed. + * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX + * default: windowlog - 7. + * Special: value 0 means "automatically determine hashlog". */ + ZSTD_c_ldmMinMatch=162, /* Minimum match size for long distance matcher. + * Larger/too small values usually decrease compression ratio. + * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX. + * Special: value 0 means "use default value" (default: 64). */ + ZSTD_c_ldmBucketSizeLog=163, /* Log size of each bucket in the LDM hash table for collision resolution. + * Larger values improve collision resolution but decrease compression speed. + * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX. + * Special: value 0 means "use default value" (default: 3). */ + ZSTD_c_ldmHashRateLog=164, /* Frequency of inserting/looking up entries into the LDM hash table. + * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN). + * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage. + * Larger values improve compression speed. + * Deviating far from default value will likely result in a compression ratio decrease. + * Special: value 0 means "automatically determine hashRateLog". */ + + /* frame parameters */ + ZSTD_c_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1) + * Content size must be known at the beginning of compression. + * This is automatically the case when using ZSTD_compress2(), + * For streaming scenarios, content size must be provided with ZSTD_CCtx_setPledgedSrcSize() */ + ZSTD_c_checksumFlag=201, /* A 32-bits checksum of content is written at end of frame (default:0) */ + ZSTD_c_dictIDFlag=202, /* When applicable, dictionary's ID is written into frame header (default:1) */ + + /* multi-threading parameters */ + /* These parameters are only active if multi-threading is enabled (compiled with build macro ZSTD_MULTITHREAD). + * Otherwise, trying to set any other value than default (0) will be a no-op and return an error. + * In a situation where it's unknown if the linked library supports multi-threading or not, + * setting ZSTD_c_nbWorkers to any value >= 1 and consulting the return value provides a quick way to check this property. + */ + ZSTD_c_nbWorkers=400, /* Select how many threads will be spawned to compress in parallel. + * When nbWorkers >= 1, triggers asynchronous mode when invoking ZSTD_compressStream*() : + * ZSTD_compressStream*() consumes input and flush output if possible, but immediately gives back control to caller, + * while compression is performed in parallel, within worker thread(s). + * (note : a strong exception to this rule is when first invocation of ZSTD_compressStream2() sets ZSTD_e_end : + * in which case, ZSTD_compressStream2() delegates to ZSTD_compress2(), which is always a blocking call). + * More workers improve speed, but also increase memory usage. + * Default value is `0`, aka "single-threaded mode" : no worker is spawned, + * compression is performed inside Caller's thread, and all invocations are blocking */ + ZSTD_c_jobSize=401, /* Size of a compression job. This value is enforced only when nbWorkers >= 1. + * Each compression job is completed in parallel, so this value can indirectly impact the nb of active threads. + * 0 means default, which is dynamically determined based on compression parameters. + * Job size must be a minimum of overlap size, or ZSTDMT_JOBSIZE_MIN (= 512 KB), whichever is largest. + * The minimum size is automatically and transparently enforced. */ + ZSTD_c_overlapLog=402, /* Control the overlap size, as a fraction of window size. + * The overlap size is an amount of data reloaded from previous job at the beginning of a new job. + * It helps preserve compression ratio, while each job is compressed in parallel. + * This value is enforced only when nbWorkers >= 1. + * Larger values increase compression ratio, but decrease speed. + * Possible values range from 0 to 9 : + * - 0 means "default" : value will be determined by the library, depending on strategy + * - 1 means "no overlap" + * - 9 means "full overlap", using a full window size. + * Each intermediate rank increases/decreases load size by a factor 2 : + * 9: full window; 8: w/2; 7: w/4; 6: w/8; 5:w/16; 4: w/32; 3:w/64; 2:w/128; 1:no overlap; 0:default + * default value varies between 6 and 9, depending on strategy */ + + /* note : additional experimental parameters are also available + * within the experimental section of the API. + * At the time of this writing, they include : + * ZSTD_c_rsyncable + * ZSTD_c_format + * ZSTD_c_forceMaxWindow + * ZSTD_c_forceAttachDict + * ZSTD_c_literalCompressionMode + * ZSTD_c_targetCBlockSize + * ZSTD_c_srcSizeHint + * ZSTD_c_enableDedicatedDictSearch + * ZSTD_c_stableInBuffer + * ZSTD_c_stableOutBuffer + * ZSTD_c_blockDelimiters + * ZSTD_c_validateSequences + * ZSTD_c_useBlockSplitter + * ZSTD_c_useRowMatchFinder + * ZSTD_c_prefetchCDictTables + * ZSTD_c_enableSeqProducerFallback + * ZSTD_c_maxBlockSize + * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. + * note : never ever use experimentalParam? names directly; + * also, the enums values themselves are unstable and can still change. + */ + ZSTD_c_experimentalParam1=500, + ZSTD_c_experimentalParam2=10, + ZSTD_c_experimentalParam3=1000, + ZSTD_c_experimentalParam4=1001, + ZSTD_c_experimentalParam5=1002, + ZSTD_c_experimentalParam6=1003, + ZSTD_c_experimentalParam7=1004, + ZSTD_c_experimentalParam8=1005, + ZSTD_c_experimentalParam9=1006, + ZSTD_c_experimentalParam10=1007, + ZSTD_c_experimentalParam11=1008, + ZSTD_c_experimentalParam12=1009, + ZSTD_c_experimentalParam13=1010, + ZSTD_c_experimentalParam14=1011, + ZSTD_c_experimentalParam15=1012, + ZSTD_c_experimentalParam16=1013, + ZSTD_c_experimentalParam17=1014, + ZSTD_c_experimentalParam18=1015, + ZSTD_c_experimentalParam19=1016 +} ZSTD_cParameter; + +typedef struct { + size_t error; + int lowerBound; + int upperBound; +} ZSTD_bounds; + +/*! ZSTD_cParam_getBounds() : + * All parameters must belong to an interval with lower and upper bounds, + * otherwise they will either trigger an error or be automatically clamped. + * @return : a structure, ZSTD_bounds, which contains + * - an error status field, which must be tested using ZSTD_isError() + * - lower and upper bounds, both inclusive + */ +ZSTDLIB_API ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter cParam); + +/*! ZSTD_CCtx_setParameter() : + * Set one compression parameter, selected by enum ZSTD_cParameter. + * All parameters have valid bounds. Bounds can be queried using ZSTD_cParam_getBounds(). + * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). + * Setting a parameter is generally only possible during frame initialization (before starting compression). + * Exception : when using multi-threading mode (nbWorkers >= 1), + * the following parameters can be updated _during_ compression (within same frame): + * => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy. + * new parameters will be active for next job only (after a flush()). + * @return : an error code (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value); + +/*! ZSTD_CCtx_setPledgedSrcSize() : + * Total input data size to be compressed as a single frame. + * Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag. + * This value will also be controlled at end of frame, and trigger an error if not respected. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame. + * In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN. + * ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame. + * Note 2 : pledgedSrcSize is only valid once, for the next frame. + * It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN. + * Note 3 : Whenever all input data is provided and consumed in a single round, + * for example with ZSTD_compress2(), + * or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end), + * this value is automatically overridden by srcSize instead. + */ +ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize); + +typedef enum { + ZSTD_reset_session_only = 1, + ZSTD_reset_parameters = 2, + ZSTD_reset_session_and_parameters = 3 +} ZSTD_ResetDirective; + +/*! ZSTD_CCtx_reset() : + * There are 2 different things that can be reset, independently or jointly : + * - The session : will stop compressing current frame, and make CCtx ready to start a new one. + * Useful after an error, or to interrupt any ongoing compression. + * Any internal data not yet flushed is cancelled. + * Compression parameters and dictionary remain unchanged. + * They will be used to compress next frame. + * Resetting session never fails. + * - The parameters : changes all parameters back to "default". + * This also removes any reference to any dictionary or external sequence producer. + * Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing) + * otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError()) + * - Both : similar to resetting the session, followed by resetting parameters. + */ +ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset); + +/*! ZSTD_compress2() : + * Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API. + * ZSTD_compress2() always starts a new frame. + * Should cctx hold data from a previously unfinished frame, everything about it is forgotten. + * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() + * - The function is always blocking, returns when compression is completed. + * NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have + * enough space to successfully compress the data, though it is possible it fails for other reasons. + * @return : compressed size written into `dst` (<= `dstCapacity), + * or an error code if it fails (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_API size_t ZSTD_compress2( ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize); + + +/*********************************************** +* Advanced decompression API (Requires v1.4.0+) +************************************************/ + +/* The advanced API pushes parameters one by one into an existing DCtx context. + * Parameters are sticky, and remain valid for all following frames + * using the same DCtx context. + * It's possible to reset parameters to default values using ZSTD_DCtx_reset(). + * Note : This API is compatible with existing ZSTD_decompressDCtx() and ZSTD_decompressStream(). + * Therefore, no new decompression function is necessary. + */ + +typedef enum { + + ZSTD_d_windowLogMax=100, /* Select a size limit (in power of 2) beyond which + * the streaming API will refuse to allocate memory buffer + * in order to protect the host from unreasonable memory requirements. + * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode. + * By default, a decompression context accepts window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT). + * Special: value 0 means "use default maximum windowLog". */ + + /* note : additional experimental parameters are also available + * within the experimental section of the API. + * At the time of this writing, they include : + * ZSTD_d_format + * ZSTD_d_stableOutBuffer + * ZSTD_d_forceIgnoreChecksum + * ZSTD_d_refMultipleDDicts + * ZSTD_d_disableHuffmanAssembly + * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. + * note : never ever use experimentalParam? names directly + */ + ZSTD_d_experimentalParam1=1000, + ZSTD_d_experimentalParam2=1001, + ZSTD_d_experimentalParam3=1002, + ZSTD_d_experimentalParam4=1003, + ZSTD_d_experimentalParam5=1004 + +} ZSTD_dParameter; + +/*! ZSTD_dParam_getBounds() : + * All parameters must belong to an interval with lower and upper bounds, + * otherwise they will either trigger an error or be automatically clamped. + * @return : a structure, ZSTD_bounds, which contains + * - an error status field, which must be tested using ZSTD_isError() + * - both lower and upper bounds, inclusive + */ +ZSTDLIB_API ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam); + +/*! ZSTD_DCtx_setParameter() : + * Set one compression parameter, selected by enum ZSTD_dParameter. + * All parameters have valid bounds. Bounds can be queried using ZSTD_dParam_getBounds(). + * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). + * Setting a parameter is only possible during frame initialization (before starting decompression). + * @return : 0, or an error code (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_API size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int value); + +/*! ZSTD_DCtx_reset() : + * Return a DCtx to clean state. + * Session and parameters can be reset jointly or separately. + * Parameters can only be reset when no active frame is being decompressed. + * @return : 0, or an error code, which can be tested with ZSTD_isError() + */ +ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset); + + +/**************************** +* Streaming +****************************/ + +typedef struct ZSTD_inBuffer_s { + const void* src; /**< start of input buffer */ + size_t size; /**< size of input buffer */ + size_t pos; /**< position where reading stopped. Will be updated. Necessarily 0 <= pos <= size */ +} ZSTD_inBuffer; + +typedef struct ZSTD_outBuffer_s { + void* dst; /**< start of output buffer */ + size_t size; /**< size of output buffer */ + size_t pos; /**< position where writing stopped. Will be updated. Necessarily 0 <= pos <= size */ +} ZSTD_outBuffer; + + + +/*-*********************************************************************** +* Streaming compression - HowTo +* +* A ZSTD_CStream object is required to track streaming operation. +* Use ZSTD_createCStream() and ZSTD_freeCStream() to create/release resources. +* ZSTD_CStream objects can be reused multiple times on consecutive compression operations. +* It is recommended to re-use ZSTD_CStream since it will play nicer with system's memory, by re-using already allocated memory. +* +* For parallel execution, use one separate ZSTD_CStream per thread. +* +* note : since v1.3.0, ZSTD_CStream and ZSTD_CCtx are the same thing. +* +* Parameters are sticky : when starting a new compression on the same context, +* it will re-use the same sticky parameters as previous compression session. +* When in doubt, it's recommended to fully initialize the context before usage. +* Use ZSTD_CCtx_reset() to reset the context and ZSTD_CCtx_setParameter(), +* ZSTD_CCtx_setPledgedSrcSize(), or ZSTD_CCtx_loadDictionary() and friends to +* set more specific parameters, the pledged source size, or load a dictionary. +* +* Use ZSTD_compressStream2() with ZSTD_e_continue as many times as necessary to +* consume input stream. The function will automatically update both `pos` +* fields within `input` and `output`. +* Note that the function may not consume the entire input, for example, because +* the output buffer is already full, in which case `input.pos < input.size`. +* The caller must check if input has been entirely consumed. +* If not, the caller must make some room to receive more compressed data, +* and then present again remaining input data. +* note: ZSTD_e_continue is guaranteed to make some forward progress when called, +* but doesn't guarantee maximal forward progress. This is especially relevant +* when compressing with multiple threads. The call won't block if it can +* consume some input, but if it can't it will wait for some, but not all, +* output to be flushed. +* @return : provides a minimum amount of data remaining to be flushed from internal buffers +* or an error code, which can be tested using ZSTD_isError(). +* +* At any moment, it's possible to flush whatever data might remain stuck within internal buffer, +* using ZSTD_compressStream2() with ZSTD_e_flush. `output->pos` will be updated. +* Note that, if `output->size` is too small, a single invocation with ZSTD_e_flush might not be enough (return code > 0). +* In which case, make some room to receive more compressed data, and call again ZSTD_compressStream2() with ZSTD_e_flush. +* You must continue calling ZSTD_compressStream2() with ZSTD_e_flush until it returns 0, at which point you can change the +* operation. +* note: ZSTD_e_flush will flush as much output as possible, meaning when compressing with multiple threads, it will +* block until the flush is complete or the output buffer is full. +* @return : 0 if internal buffers are entirely flushed, +* >0 if some data still present within internal buffer (the value is minimal estimation of remaining size), +* or an error code, which can be tested using ZSTD_isError(). +* +* Calling ZSTD_compressStream2() with ZSTD_e_end instructs to finish a frame. +* It will perform a flush and write frame epilogue. +* The epilogue is required for decoders to consider a frame completed. +* flush operation is the same, and follows same rules as calling ZSTD_compressStream2() with ZSTD_e_flush. +* You must continue calling ZSTD_compressStream2() with ZSTD_e_end until it returns 0, at which point you are free to +* start a new frame. +* note: ZSTD_e_end will flush as much output as possible, meaning when compressing with multiple threads, it will +* block until the flush is complete or the output buffer is full. +* @return : 0 if frame fully completed and fully flushed, +* >0 if some data still present within internal buffer (the value is minimal estimation of remaining size), +* or an error code, which can be tested using ZSTD_isError(). +* +* *******************************************************************/ + +typedef ZSTD_CCtx ZSTD_CStream; /**< CCtx and CStream are now effectively same object (>= v1.3.0) */ + /* Continue to distinguish them for compatibility with older versions <= v1.2.0 */ +/*===== ZSTD_CStream management functions =====*/ +ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream(void); +ZSTDLIB_API size_t ZSTD_freeCStream(ZSTD_CStream* zcs); /* accept NULL pointer */ + +/*===== Streaming compression functions =====*/ +typedef enum { + ZSTD_e_continue=0, /* collect more data, encoder decides when to output compressed result, for optimal compression ratio */ + ZSTD_e_flush=1, /* flush any data provided so far, + * it creates (at least) one new block, that can be decoded immediately on reception; + * frame will continue: any future data can still reference previously compressed data, improving compression. + * note : multithreaded compression will block to flush as much output as possible. */ + ZSTD_e_end=2 /* flush any remaining data _and_ close current frame. + * note that frame is only closed after compressed data is fully flushed (return value == 0). + * After that point, any additional data starts a new frame. + * note : each frame is independent (does not reference any content from previous frame). + : note : multithreaded compression will block to flush as much output as possible. */ +} ZSTD_EndDirective; + +/*! ZSTD_compressStream2() : Requires v1.4.0+ + * Behaves about the same as ZSTD_compressStream, with additional control on end directive. + * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() + * - Compression parameters cannot be changed once compression is started (save a list of exceptions in multi-threading mode) + * - output->pos must be <= dstCapacity, input->pos must be <= srcSize + * - output->pos and input->pos will be updated. They are guaranteed to remain below their respective limit. + * - endOp must be a valid directive + * - When nbWorkers==0 (default), function is blocking : it completes its job before returning to caller. + * - When nbWorkers>=1, function is non-blocking : it copies a portion of input, distributes jobs to internal worker threads, flush to output whatever is available, + * and then immediately returns, just indicating that there is some data remaining to be flushed. + * The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte. + * - Exception : if the first call requests a ZSTD_e_end directive and provides enough dstCapacity, the function delegates to ZSTD_compress2() which is always blocking. + * - @return provides a minimum amount of data remaining to be flushed from internal buffers + * or an error code, which can be tested using ZSTD_isError(). + * if @return != 0, flush is not fully completed, there is still some data left within internal buffers. + * This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers. + * For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed. + * - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0), + * only ZSTD_e_end or ZSTD_e_flush operations are allowed. + * Before starting a new compression job, or changing compression parameters, + * it is required to fully flush internal buffers. + */ +ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, + ZSTD_outBuffer* output, + ZSTD_inBuffer* input, + ZSTD_EndDirective endOp); + + +/* These buffer sizes are softly recommended. + * They are not required : ZSTD_compressStream*() happily accepts any buffer size, for both input and output. + * Respecting the recommended size just makes it a bit easier for ZSTD_compressStream*(), + * reducing the amount of memory shuffling and buffering, resulting in minor performance savings. + * + * However, note that these recommendations are from the perspective of a C caller program. + * If the streaming interface is invoked from some other language, + * especially managed ones such as Java or Go, through a foreign function interface such as jni or cgo, + * a major performance rule is to reduce crossing such interface to an absolute minimum. + * It's not rare that performance ends being spent more into the interface, rather than compression itself. + * In which cases, prefer using large buffers, as large as practical, + * for both input and output, to reduce the nb of roundtrips. + */ +ZSTDLIB_API size_t ZSTD_CStreamInSize(void); /**< recommended size for input buffer */ +ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block. */ + + +/* ***************************************************************************** + * This following is a legacy streaming API, available since v1.0+ . + * It can be replaced by ZSTD_CCtx_reset() and ZSTD_compressStream2(). + * It is redundant, but remains fully supported. + ******************************************************************************/ + +/*! + * Equivalent to: + * + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) + * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * + * Note that ZSTD_initCStream() clears any previously set dictionary. Use the new API + * to compress with a dictionary. + */ +ZSTDLIB_API size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel); +/*! + * Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue). + * NOTE: The return value is different. ZSTD_compressStream() returns a hint for + * the next read size (if non-zero and not an error). ZSTD_compressStream2() + * returns the minimum nb of bytes left to flush (if non-zero and not an error). + */ +ZSTDLIB_API size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input); +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush). */ +ZSTDLIB_API size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end). */ +ZSTDLIB_API size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); + + +/*-*************************************************************************** +* Streaming decompression - HowTo +* +* A ZSTD_DStream object is required to track streaming operations. +* Use ZSTD_createDStream() and ZSTD_freeDStream() to create/release resources. +* ZSTD_DStream objects can be re-used multiple times. +* +* Use ZSTD_initDStream() to start a new decompression operation. +* @return : recommended first input size +* Alternatively, use advanced API to set specific properties. +* +* Use ZSTD_decompressStream() repetitively to consume your input. +* The function will update both `pos` fields. +* If `input.pos < input.size`, some input has not been consumed. +* It's up to the caller to present again remaining data. +* The function tries to flush all data decoded immediately, respecting output buffer size. +* If `output.pos < output.size`, decoder has flushed everything it could. +* But if `output.pos == output.size`, there might be some data left within internal buffers., +* In which case, call ZSTD_decompressStream() again to flush whatever remains in the buffer. +* Note : with no additional input provided, amount of data flushed is necessarily <= ZSTD_BLOCKSIZE_MAX. +* @return : 0 when a frame is completely decoded and fully flushed, +* or an error code, which can be tested using ZSTD_isError(), +* or any other value > 0, which means there is still some decoding or flushing to do to complete current frame : +* the return value is a suggested next input size (just a hint for better latency) +* that will never request more than the remaining frame size. +* *******************************************************************************/ + +typedef ZSTD_DCtx ZSTD_DStream; /**< DCtx and DStream are now effectively same object (>= v1.3.0) */ + /* For compatibility with versions <= v1.2.0, prefer differentiating them. */ +/*===== ZSTD_DStream management functions =====*/ +ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream(void); +ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer */ + +/*===== Streaming decompression functions =====*/ + +/*! ZSTD_initDStream() : + * Initialize/reset DStream state for new decompression operation. + * Call before new decompression operation using same DStream. + * + * Note : This function is redundant with the advanced API and equivalent to: + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * ZSTD_DCtx_refDDict(zds, NULL); + */ +ZSTDLIB_API size_t ZSTD_initDStream(ZSTD_DStream* zds); + +/*! ZSTD_decompressStream() : + * Streaming decompression function. + * Call repetitively to consume full input updating it as necessary. + * Function will update both input and output `pos` fields exposing current state via these fields: + * - `input.pos < input.size`, some input remaining and caller should provide remaining input + * on the next call. + * - `output.pos < output.size`, decoder finished and flushed all remaining buffers. + * - `output.pos == output.size`, potentially uncflushed data present in the internal buffers, + * call ZSTD_decompressStream() again to flush remaining data to output. + * Note : with no additional input, amount of data flushed <= ZSTD_BLOCKSIZE_MAX. + * + * @return : 0 when a frame is completely decoded and fully flushed, + * or an error code, which can be tested using ZSTD_isError(), + * or any other value > 0, which means there is some decoding or flushing to do to complete current frame. + */ +ZSTDLIB_API size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input); + +ZSTDLIB_API size_t ZSTD_DStreamInSize(void); /*!< recommended size for input buffer */ +ZSTDLIB_API size_t ZSTD_DStreamOutSize(void); /*!< recommended size for output buffer. Guarantee to successfully flush at least one complete block in all circumstances. */ + + +/************************** +* Simple dictionary API +***************************/ +/*! ZSTD_compress_usingDict() : + * Compression at an explicit compression level using a Dictionary. + * A dictionary can be any arbitrary data segment (also called a prefix), + * or a buffer with specified information (see zdict.h). + * Note : This function loads the dictionary, resulting in significant startup delay. + * It's intended for a dictionary used only once. + * Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used. */ +ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + int compressionLevel); + +/*! ZSTD_decompress_usingDict() : + * Decompression using a known Dictionary. + * Dictionary must be identical to the one used during compression. + * Note : This function loads the dictionary, resulting in significant startup delay. + * It's intended for a dictionary used only once. + * Note : When `dict == NULL || dictSize < 8` no dictionary is used. */ +ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize); + + +/*********************************** + * Bulk processing dictionary API + **********************************/ +typedef struct ZSTD_CDict_s ZSTD_CDict; + +/*! ZSTD_createCDict() : + * When compressing multiple messages or blocks using the same dictionary, + * it's recommended to digest the dictionary only once, since it's a costly operation. + * ZSTD_createCDict() will create a state from digesting a dictionary. + * The resulting state can be used for future compression operations with very limited startup cost. + * ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. + * @dictBuffer can be released after ZSTD_CDict creation, because its content is copied within CDict. + * Note 1 : Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate @dictBuffer content. + * Note 2 : A ZSTD_CDict can be created from an empty @dictBuffer, + * in which case the only thing that it transports is the @compressionLevel. + * This can be useful in a pipeline featuring ZSTD_compress_usingCDict() exclusively, + * expecting a ZSTD_CDict parameter with any data, including those without a known dictionary. */ +ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize, + int compressionLevel); + +/*! ZSTD_freeCDict() : + * Function frees memory allocated by ZSTD_createCDict(). + * If a NULL pointer is passed, no operation is performed. */ +ZSTDLIB_API size_t ZSTD_freeCDict(ZSTD_CDict* CDict); + +/*! ZSTD_compress_usingCDict() : + * Compression using a digested Dictionary. + * Recommended when same dictionary is used multiple times. + * Note : compression level is _decided at dictionary creation time_, + * and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) */ +ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_CDict* cdict); + + +typedef struct ZSTD_DDict_s ZSTD_DDict; + +/*! ZSTD_createDDict() : + * Create a digested dictionary, ready to start decompression operation without startup delay. + * dictBuffer can be released after DDict creation, as its content is copied inside DDict. */ +ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize); + +/*! ZSTD_freeDDict() : + * Function frees memory allocated with ZSTD_createDDict() + * If a NULL pointer is passed, no operation is performed. */ +ZSTDLIB_API size_t ZSTD_freeDDict(ZSTD_DDict* ddict); + +/*! ZSTD_decompress_usingDDict() : + * Decompression using a digested Dictionary. + * Recommended when same dictionary is used multiple times. */ +ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_DDict* ddict); + + +/******************************** + * Dictionary helper functions + *******************************/ + +/*! ZSTD_getDictID_fromDict() : Requires v1.4.0+ + * Provides the dictID stored within dictionary. + * if @return == 0, the dictionary is not conformant with Zstandard specification. + * It can still be loaded, but as a content-only dictionary. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize); + +/*! ZSTD_getDictID_fromCDict() : Requires v1.5.0+ + * Provides the dictID of the dictionary loaded into `cdict`. + * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromCDict(const ZSTD_CDict* cdict); + +/*! ZSTD_getDictID_fromDDict() : Requires v1.4.0+ + * Provides the dictID of the dictionary loaded into `ddict`. + * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict); + +/*! ZSTD_getDictID_fromFrame() : Requires v1.4.0+ + * Provides the dictID required to decompressed the frame stored within `src`. + * If @return == 0, the dictID could not be decoded. + * This could for one of the following reasons : + * - The frame does not require a dictionary to be decoded (most common case). + * - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information. + * Note : this use case also happens when using a non-conformant dictionary. + * - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`). + * - This is not a Zstandard frame. + * When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize); + + +/******************************************************************************* + * Advanced dictionary and prefix API (Requires v1.4.0+) + * + * This API allows dictionaries to be used with ZSTD_compress2(), + * ZSTD_compressStream2(), and ZSTD_decompressDCtx(). + * Dictionaries are sticky, they remain valid when same context is re-used, + * they only reset when the context is reset + * with ZSTD_reset_parameters or ZSTD_reset_session_and_parameters. + * In contrast, Prefixes are single-use. + ******************************************************************************/ + + +/*! ZSTD_CCtx_loadDictionary() : Requires v1.4.0+ + * Create an internal CDict from `dict` buffer. + * Decompression will have to use same dictionary. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary, + * meaning "return to no-dictionary mode". + * Note 1 : Dictionary is sticky, it will be used for all future compressed frames, + * until parameters are reset, a new dictionary is loaded, or the dictionary + * is explicitly invalidated by loading a NULL dictionary. + * Note 2 : Loading a dictionary involves building tables. + * It's also a CPU consuming operation, with non-negligible impact on latency. + * Tables are dependent on compression parameters, and for this reason, + * compression parameters can no longer be changed after loading a dictionary. + * Note 3 :`dict` content will be copied internally. + * Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead. + * In such a case, dictionary buffer must outlive its users. + * Note 4 : Use ZSTD_CCtx_loadDictionary_advanced() + * to precisely select how dictionary content must be interpreted. + * Note 5 : This method does not benefit from LDM (long distance mode). + * If you want to employ LDM on some large dictionary content, + * prefer employing ZSTD_CCtx_refPrefix() described below. + */ +ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); + +/*! ZSTD_CCtx_refCDict() : Requires v1.4.0+ + * Reference a prepared dictionary, to be used for all future compressed frames. + * Note that compression parameters are enforced from within CDict, + * and supersede any compression parameter previously set within CCtx. + * The parameters ignored are labelled as "superseded-by-cdict" in the ZSTD_cParameter enum docs. + * The ignored parameters will be used again if the CCtx is returned to no-dictionary mode. + * The dictionary will remain valid for future compressed frames using same CCtx. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special : Referencing a NULL CDict means "return to no-dictionary mode". + * Note 1 : Currently, only one dictionary can be managed. + * Referencing a new dictionary effectively "discards" any previous one. + * Note 2 : CDict is just referenced, its lifetime must outlive its usage within CCtx. */ +ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); + +/*! ZSTD_CCtx_refPrefix() : Requires v1.4.0+ + * Reference a prefix (single-usage dictionary) for next compressed frame. + * A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end). + * Decompression will need same prefix to properly regenerate data. + * Compressing with a prefix is similar in outcome as performing a diff and compressing it, + * but performs much faster, especially during decompression (compression speed is tunable with compression level). + * This method is compatible with LDM (long distance mode). + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary + * Note 1 : Prefix buffer is referenced. It **must** outlive compression. + * Its content must remain unmodified during compression. + * Note 2 : If the intention is to diff some large src data blob with some prior version of itself, + * ensure that the window size is large enough to contain the entire source. + * See ZSTD_c_windowLog. + * Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters. + * It's a CPU consuming operation, with non-negligible impact on latency. + * If there is a need to use the same prefix multiple times, consider loadDictionary instead. + * Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dct_rawContent). + * Use experimental ZSTD_CCtx_refPrefix_advanced() to alter dictionary interpretation. */ +ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, + const void* prefix, size_t prefixSize); + +/*! ZSTD_DCtx_loadDictionary() : Requires v1.4.0+ + * Create an internal DDict from dict buffer, to be used to decompress all future frames. + * The dictionary remains valid for all future frames, until explicitly invalidated, or + * a new dictionary is loaded. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary, + * meaning "return to no-dictionary mode". + * Note 1 : Loading a dictionary involves building tables, + * which has a non-negligible impact on CPU usage and latency. + * It's recommended to "load once, use many times", to amortize the cost + * Note 2 :`dict` content will be copied internally, so `dict` can be released after loading. + * Use ZSTD_DCtx_loadDictionary_byReference() to reference dictionary content instead. + * Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to take control of + * how dictionary content is loaded and interpreted. + */ +ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); + +/*! ZSTD_DCtx_refDDict() : Requires v1.4.0+ + * Reference a prepared dictionary, to be used to decompress next frames. + * The dictionary remains active for decompression of future frames using same DCtx. + * + * If called with ZSTD_d_refMultipleDDicts enabled, repeated calls of this function + * will store the DDict references in a table, and the DDict used for decompression + * will be determined at decompression time, as per the dict ID in the frame. + * The memory for the table is allocated on the first call to refDDict, and can be + * freed with ZSTD_freeDCtx(). + * + * If called with ZSTD_d_refMultipleDDicts disabled (the default), only one dictionary + * will be managed, and referencing a dictionary effectively "discards" any previous one. + * + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special: referencing a NULL DDict means "return to no-dictionary mode". + * Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx. + */ +ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); + +/*! ZSTD_DCtx_refPrefix() : Requires v1.4.0+ + * Reference a prefix (single-usage dictionary) to decompress next frame. + * This is the reverse operation of ZSTD_CCtx_refPrefix(), + * and must use the same prefix as the one used during compression. + * Prefix is **only used once**. Reference is discarded at end of frame. + * End of frame is reached when ZSTD_decompressStream() returns 0. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary + * Note 2 : Prefix buffer is referenced. It **must** outlive decompression. + * Prefix buffer must remain unmodified up to the end of frame, + * reached when ZSTD_decompressStream() returns 0. + * Note 3 : By default, the prefix is treated as raw content (ZSTD_dct_rawContent). + * Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode (Experimental section) + * Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost. + * A full dictionary is more costly, as it requires building tables. + */ +ZSTDLIB_API size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, + const void* prefix, size_t prefixSize); + +/* === Memory management === */ + +/*! ZSTD_sizeof_*() : Requires v1.4.0+ + * These functions give the _current_ memory usage of selected object. + * Note that object memory usage can evolve (increase or decrease) over time. */ +ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx); +ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx); +ZSTDLIB_API size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs); +ZSTDLIB_API size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds); +ZSTDLIB_API size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict); +ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); + +#endif /* ZSTD_H_235446 */ + + +/* ************************************************************************************** + * ADVANCED AND EXPERIMENTAL FUNCTIONS + **************************************************************************************** + * The definitions in the following section are considered experimental. + * They are provided for advanced scenarios. + * They should never be used with a dynamic library, as prototypes may change in the future. + * Use them only in association with static linking. + * ***************************************************************************************/ + +#if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY) +#define ZSTD_H_ZSTD_STATIC_LINKING_ONLY + +/* This can be overridden externally to hide static symbols. */ +#ifndef ZSTDLIB_STATIC_API +# if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDLIB_STATIC_API __declspec(dllexport) ZSTDLIB_VISIBLE +# elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDLIB_STATIC_API __declspec(dllimport) ZSTDLIB_VISIBLE +# else +# define ZSTDLIB_STATIC_API ZSTDLIB_VISIBLE +# endif +#endif + +/**************************************************************************************** + * experimental API (static linking only) + **************************************************************************************** + * The following symbols and constants + * are not planned to join "stable API" status in the near future. + * They can still change in future versions. + * Some of them are planned to remain in the static_only section indefinitely. + * Some of them might be removed in the future (especially when redundant with existing stable functions) + * ***************************************************************************************/ + +#define ZSTD_FRAMEHEADERSIZE_PREFIX(format) ((format) == ZSTD_f_zstd1 ? 5 : 1) /* minimum input size required to query frame header size */ +#define ZSTD_FRAMEHEADERSIZE_MIN(format) ((format) == ZSTD_f_zstd1 ? 6 : 2) +#define ZSTD_FRAMEHEADERSIZE_MAX 18 /* can be useful for static allocation */ +#define ZSTD_SKIPPABLEHEADERSIZE 8 + +/* compression parameter bounds */ +#define ZSTD_WINDOWLOG_MAX_32 30 +#define ZSTD_WINDOWLOG_MAX_64 31 +#define ZSTD_WINDOWLOG_MAX ((int)(sizeof(size_t) == 4 ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64)) +#define ZSTD_WINDOWLOG_MIN 10 +#define ZSTD_HASHLOG_MAX ((ZSTD_WINDOWLOG_MAX < 30) ? ZSTD_WINDOWLOG_MAX : 30) +#define ZSTD_HASHLOG_MIN 6 +#define ZSTD_CHAINLOG_MAX_32 29 +#define ZSTD_CHAINLOG_MAX_64 30 +#define ZSTD_CHAINLOG_MAX ((int)(sizeof(size_t) == 4 ? ZSTD_CHAINLOG_MAX_32 : ZSTD_CHAINLOG_MAX_64)) +#define ZSTD_CHAINLOG_MIN ZSTD_HASHLOG_MIN +#define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1) +#define ZSTD_SEARCHLOG_MIN 1 +#define ZSTD_MINMATCH_MAX 7 /* only for ZSTD_fast, other strategies are limited to 6 */ +#define ZSTD_MINMATCH_MIN 3 /* only for ZSTD_btopt+, faster strategies are limited to 4 */ +#define ZSTD_TARGETLENGTH_MAX ZSTD_BLOCKSIZE_MAX +#define ZSTD_TARGETLENGTH_MIN 0 /* note : comparing this constant to an unsigned results in a tautological test */ +#define ZSTD_STRATEGY_MIN ZSTD_fast +#define ZSTD_STRATEGY_MAX ZSTD_btultra2 +#define ZSTD_BLOCKSIZE_MAX_MIN (1 << 10) /* The minimum valid max blocksize. Maximum blocksizes smaller than this make compressBound() inaccurate. */ + + +#define ZSTD_OVERLAPLOG_MIN 0 +#define ZSTD_OVERLAPLOG_MAX 9 + +#define ZSTD_WINDOWLOG_LIMIT_DEFAULT 27 /* by default, the streaming decoder will refuse any frame + * requiring larger than (1< 0: + * If litLength != 0: + * rep == 1 --> offset == repeat_offset_1 + * rep == 2 --> offset == repeat_offset_2 + * rep == 3 --> offset == repeat_offset_3 + * If litLength == 0: + * rep == 1 --> offset == repeat_offset_2 + * rep == 2 --> offset == repeat_offset_3 + * rep == 3 --> offset == repeat_offset_1 - 1 + * + * Note: This field is optional. ZSTD_generateSequences() will calculate the value of + * 'rep', but repeat offsets do not necessarily need to be calculated from an external + * sequence provider's perspective. For example, ZSTD_compressSequences() does not + * use this 'rep' field at all (as of now). + */ +} ZSTD_Sequence; + +typedef struct { + unsigned windowLog; /**< largest match distance : larger == more compression, more memory needed during decompression */ + unsigned chainLog; /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */ + unsigned hashLog; /**< dispatch table : larger == faster, more memory */ + unsigned searchLog; /**< nb of searches : larger == more compression, slower */ + unsigned minMatch; /**< match length searched : larger == faster decompression, sometimes less compression */ + unsigned targetLength; /**< acceptable match size for optimal parser (only) : larger == more compression, slower */ + ZSTD_strategy strategy; /**< see ZSTD_strategy definition above */ +} ZSTD_compressionParameters; + +typedef struct { + int contentSizeFlag; /**< 1: content size will be in frame header (when known) */ + int checksumFlag; /**< 1: generate a 32-bits checksum using XXH64 algorithm at end of frame, for error detection */ + int noDictIDFlag; /**< 1: no dictID will be saved into frame header (dictID is only useful for dictionary compression) */ +} ZSTD_frameParameters; + +typedef struct { + ZSTD_compressionParameters cParams; + ZSTD_frameParameters fParams; +} ZSTD_parameters; + +typedef enum { + ZSTD_dct_auto = 0, /* dictionary is "full" when starting with ZSTD_MAGIC_DICTIONARY, otherwise it is "rawContent" */ + ZSTD_dct_rawContent = 1, /* ensures dictionary is always loaded as rawContent, even if it starts with ZSTD_MAGIC_DICTIONARY */ + ZSTD_dct_fullDict = 2 /* refuses to load a dictionary if it does not respect Zstandard's specification, starting with ZSTD_MAGIC_DICTIONARY */ +} ZSTD_dictContentType_e; + +typedef enum { + ZSTD_dlm_byCopy = 0, /**< Copy dictionary content internally */ + ZSTD_dlm_byRef = 1 /**< Reference dictionary content -- the dictionary buffer must outlive its users. */ +} ZSTD_dictLoadMethod_e; + +typedef enum { + ZSTD_f_zstd1 = 0, /* zstd frame format, specified in zstd_compression_format.md (default) */ + ZSTD_f_zstd1_magicless = 1 /* Variant of zstd frame format, without initial 4-bytes magic number. + * Useful to save 4 bytes per generated frame. + * Decoder cannot recognise automatically this format, requiring this instruction. */ +} ZSTD_format_e; + +typedef enum { + /* Note: this enum controls ZSTD_d_forceIgnoreChecksum */ + ZSTD_d_validateChecksum = 0, + ZSTD_d_ignoreChecksum = 1 +} ZSTD_forceIgnoreChecksum_e; + +typedef enum { + /* Note: this enum controls ZSTD_d_refMultipleDDicts */ + ZSTD_rmd_refSingleDDict = 0, + ZSTD_rmd_refMultipleDDicts = 1 +} ZSTD_refMultipleDDicts_e; + +typedef enum { + /* Note: this enum and the behavior it controls are effectively internal + * implementation details of the compressor. They are expected to continue + * to evolve and should be considered only in the context of extremely + * advanced performance tuning. + * + * Zstd currently supports the use of a CDict in three ways: + * + * - The contents of the CDict can be copied into the working context. This + * means that the compression can search both the dictionary and input + * while operating on a single set of internal tables. This makes + * the compression faster per-byte of input. However, the initial copy of + * the CDict's tables incurs a fixed cost at the beginning of the + * compression. For small compressions (< 8 KB), that copy can dominate + * the cost of the compression. + * + * - The CDict's tables can be used in-place. In this model, compression is + * slower per input byte, because the compressor has to search two sets of + * tables. However, this model incurs no start-up cost (as long as the + * working context's tables can be reused). For small inputs, this can be + * faster than copying the CDict's tables. + * + * - The CDict's tables are not used at all, and instead we use the working + * context alone to reload the dictionary and use params based on the source + * size. See ZSTD_compress_insertDictionary() and ZSTD_compress_usingDict(). + * This method is effective when the dictionary sizes are very small relative + * to the input size, and the input size is fairly large to begin with. + * + * Zstd has a simple internal heuristic that selects which strategy to use + * at the beginning of a compression. However, if experimentation shows that + * Zstd is making poor choices, it is possible to override that choice with + * this enum. + */ + ZSTD_dictDefaultAttach = 0, /* Use the default heuristic. */ + ZSTD_dictForceAttach = 1, /* Never copy the dictionary. */ + ZSTD_dictForceCopy = 2, /* Always copy the dictionary. */ + ZSTD_dictForceLoad = 3 /* Always reload the dictionary */ +} ZSTD_dictAttachPref_e; + +typedef enum { + ZSTD_lcm_auto = 0, /**< Automatically determine the compression mode based on the compression level. + * Negative compression levels will be uncompressed, and positive compression + * levels will be compressed. */ + ZSTD_lcm_huffman = 1, /**< Always attempt Huffman compression. Uncompressed literals will still be + * emitted if Huffman compression is not profitable. */ + ZSTD_lcm_uncompressed = 2 /**< Always emit uncompressed literals. */ +} ZSTD_literalCompressionMode_e; + +typedef enum { + /* Note: This enum controls features which are conditionally beneficial. Zstd typically will make a final + * decision on whether or not to enable the feature (ZSTD_ps_auto), but setting the switch to ZSTD_ps_enable + * or ZSTD_ps_disable allow for a force enable/disable the feature. + */ + ZSTD_ps_auto = 0, /* Let the library automatically determine whether the feature shall be enabled */ + ZSTD_ps_enable = 1, /* Force-enable the feature */ + ZSTD_ps_disable = 2 /* Do not use the feature */ +} ZSTD_paramSwitch_e; + +/*************************************** +* Frame header and size functions +***************************************/ + +/*! ZSTD_findDecompressedSize() : + * `src` should point to the start of a series of ZSTD encoded and/or skippable frames + * `srcSize` must be the _exact_ size of this series + * (i.e. there should be a frame boundary at `src + srcSize`) + * @return : - decompressed size of all data in all successive frames + * - if the decompressed size cannot be determined: ZSTD_CONTENTSIZE_UNKNOWN + * - if an error occurred: ZSTD_CONTENTSIZE_ERROR + * + * note 1 : decompressed size is an optional field, that may not be present, especially in streaming mode. + * When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. + * In which case, it's necessary to use streaming mode to decompress data. + * note 2 : decompressed size is always present when compression is done with ZSTD_compress() + * note 3 : decompressed size can be very large (64-bits value), + * potentially larger than what local system can handle as a single memory segment. + * In which case, it's necessary to use streaming mode to decompress data. + * note 4 : If source is untrusted, decompressed size could be wrong or intentionally modified. + * Always ensure result fits within application's authorized limits. + * Each application can set its own limits. + * note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to + * read each contained frame header. This is fast as most of the data is skipped, + * however it does mean that all frame data must be present and valid. */ +ZSTDLIB_STATIC_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize); + +/*! ZSTD_decompressBound() : + * `src` should point to the start of a series of ZSTD encoded and/or skippable frames + * `srcSize` must be the _exact_ size of this series + * (i.e. there should be a frame boundary at `src + srcSize`) + * @return : - upper-bound for the decompressed size of all data in all successive frames + * - if an error occurred: ZSTD_CONTENTSIZE_ERROR + * + * note 1 : an error can occur if `src` contains an invalid or incorrectly formatted frame. + * note 2 : the upper-bound is exact when the decompressed size field is available in every ZSTD encoded frame of `src`. + * in this case, `ZSTD_findDecompressedSize` and `ZSTD_decompressBound` return the same value. + * note 3 : when the decompressed size field isn't available, the upper-bound for that frame is calculated by: + * upper-bound = # blocks * min(128 KB, Window_Size) + */ +ZSTDLIB_STATIC_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize); + +/*! ZSTD_frameHeaderSize() : + * srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX. + * @return : size of the Frame Header, + * or an error code (if srcSize is too small) */ +ZSTDLIB_STATIC_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize); + +typedef enum { ZSTD_frame, ZSTD_skippableFrame } ZSTD_frameType_e; +typedef struct { + unsigned long long frameContentSize; /* if == ZSTD_CONTENTSIZE_UNKNOWN, it means this field is not available. 0 means "empty" */ + unsigned long long windowSize; /* can be very large, up to <= frameContentSize */ + unsigned blockSizeMax; + ZSTD_frameType_e frameType; /* if == ZSTD_skippableFrame, frameContentSize is the size of skippable content */ + unsigned headerSize; + unsigned dictID; + unsigned checksumFlag; + unsigned _reserved1; + unsigned _reserved2; +} ZSTD_frameHeader; + +/*! ZSTD_getFrameHeader() : + * decode Frame Header, or requires larger `srcSize`. + * @return : 0, `zfhPtr` is correctly filled, + * >0, `srcSize` is too small, value is wanted `srcSize` amount, + * or an error code, which can be tested using ZSTD_isError() */ +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */ +/*! ZSTD_getFrameHeader_advanced() : + * same as ZSTD_getFrameHeader(), + * with added capability to select a format (like ZSTD_f_zstd1_magicless) */ +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format); + +/*! ZSTD_decompressionMargin() : + * Zstd supports in-place decompression, where the input and output buffers overlap. + * In this case, the output buffer must be at least (Margin + Output_Size) bytes large, + * and the input buffer must be at the end of the output buffer. + * + * _______________________ Output Buffer ________________________ + * | | + * | ____ Input Buffer ____| + * | | | + * v v v + * |---------------------------------------|-----------|----------| + * ^ ^ ^ + * |___________________ Output_Size ___________________|_ Margin _| + * + * NOTE: See also ZSTD_DECOMPRESSION_MARGIN(). + * NOTE: This applies only to single-pass decompression through ZSTD_decompress() or + * ZSTD_decompressDCtx(). + * NOTE: This function supports multi-frame input. + * + * @param src The compressed frame(s) + * @param srcSize The size of the compressed frame(s) + * @returns The decompression margin or an error that can be checked with ZSTD_isError(). + */ +ZSTDLIB_STATIC_API size_t ZSTD_decompressionMargin(const void* src, size_t srcSize); + +/*! ZSTD_DECOMPRESS_MARGIN() : + * Similar to ZSTD_decompressionMargin(), but instead of computing the margin from + * the compressed frame, compute it from the original size and the blockSizeLog. + * See ZSTD_decompressionMargin() for details. + * + * WARNING: This macro does not support multi-frame input, the input must be a single + * zstd frame. If you need that support use the function, or implement it yourself. + * + * @param originalSize The original uncompressed size of the data. + * @param blockSize The block size == MIN(windowSize, ZSTD_BLOCKSIZE_MAX). + * Unless you explicitly set the windowLog smaller than + * ZSTD_BLOCKSIZELOG_MAX you can just use ZSTD_BLOCKSIZE_MAX. + */ +#define ZSTD_DECOMPRESSION_MARGIN(originalSize, blockSize) ((size_t)( \ + ZSTD_FRAMEHEADERSIZE_MAX /* Frame header */ + \ + 4 /* checksum */ + \ + ((originalSize) == 0 ? 0 : 3 * (((originalSize) + (blockSize) - 1) / blockSize)) /* 3 bytes per block */ + \ + (blockSize) /* One block of margin */ \ + )) + +typedef enum { + ZSTD_sf_noBlockDelimiters = 0, /* Representation of ZSTD_Sequence has no block delimiters, sequences only */ + ZSTD_sf_explicitBlockDelimiters = 1 /* Representation of ZSTD_Sequence contains explicit block delimiters */ +} ZSTD_sequenceFormat_e; + +/*! ZSTD_sequenceBound() : + * `srcSize` : size of the input buffer + * @return : upper-bound for the number of sequences that can be generated + * from a buffer of srcSize bytes + * + * note : returns number of sequences - to get bytes, multiply by sizeof(ZSTD_Sequence). + */ +ZSTDLIB_STATIC_API size_t ZSTD_sequenceBound(size_t srcSize); + +/*! ZSTD_generateSequences() : + * Generate sequences using ZSTD_compress2(), given a source buffer. + * + * Each block will end with a dummy sequence + * with offset == 0, matchLength == 0, and litLength == length of last literals. + * litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0) + * simply acts as a block delimiter. + * + * @zc can be used to insert custom compression params. + * This function invokes ZSTD_compress2(). + * + * The output of this function can be fed into ZSTD_compressSequences() with CCtx + * setting of ZSTD_c_blockDelimiters as ZSTD_sf_explicitBlockDelimiters + * @return : number of sequences generated + */ + +ZSTDLIB_STATIC_API size_t +ZSTD_generateSequences( ZSTD_CCtx* zc, + ZSTD_Sequence* outSeqs, size_t outSeqsSize, + const void* src, size_t srcSize); + +/*! ZSTD_mergeBlockDelimiters() : + * Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals + * by merging them into the literals of the next sequence. + * + * As such, the final generated result has no explicit representation of block boundaries, + * and the final last literals segment is not represented in the sequences. + * + * The output of this function can be fed into ZSTD_compressSequences() with CCtx + * setting of ZSTD_c_blockDelimiters as ZSTD_sf_noBlockDelimiters + * @return : number of sequences left after merging + */ +ZSTDLIB_STATIC_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize); + +/*! ZSTD_compressSequences() : + * Compress an array of ZSTD_Sequence, associated with @src buffer, into dst. + * @src contains the entire input (not just the literals). + * If @srcSize > sum(sequence.length), the remaining bytes are considered all literals + * If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.) + * The entire source is compressed into a single frame. + * + * The compression behavior changes based on cctx params. In particular: + * If ZSTD_c_blockDelimiters == ZSTD_sf_noBlockDelimiters, the array of ZSTD_Sequence is expected to contain + * no block delimiters (defined in ZSTD_Sequence). Block boundaries are roughly determined based on + * the block size derived from the cctx, and sequences may be split. This is the default setting. + * + * If ZSTD_c_blockDelimiters == ZSTD_sf_explicitBlockDelimiters, the array of ZSTD_Sequence is expected to contain + * block delimiters (defined in ZSTD_Sequence). Behavior is undefined if no block delimiters are provided. + * + * If ZSTD_c_validateSequences == 0, this function will blindly accept the sequences provided. Invalid sequences cause undefined + * behavior. If ZSTD_c_validateSequences == 1, then if sequence is invalid (see doc/zstd_compression_format.md for + * specifics regarding offset/matchlength requirements) then the function will bail out and return an error. + * + * In addition to the two adjustable experimental params, there are other important cctx params. + * - ZSTD_c_minMatch MUST be set as less than or equal to the smallest match generated by the match finder. It has a minimum value of ZSTD_MINMATCH_MIN. + * - ZSTD_c_compressionLevel accordingly adjusts the strength of the entropy coder, as it would in typical compression. + * - ZSTD_c_windowLog affects offset validation: this function will return an error at higher debug levels if a provided offset + * is larger than what the spec allows for a given window log and dictionary (if present). See: doc/zstd_compression_format.md + * + * Note: Repcodes are, as of now, always re-calculated within this function, so ZSTD_Sequence::rep is unused. + * Note 2: Once we integrate ability to ingest repcodes, the explicit block delims mode must respect those repcodes exactly, + * and cannot emit an RLE block that disagrees with the repcode history + * @return : final compressed size, or a ZSTD error code. + */ +ZSTDLIB_STATIC_API size_t +ZSTD_compressSequences( ZSTD_CCtx* cctx, void* dst, size_t dstSize, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, + const void* src, size_t srcSize); + + +/*! ZSTD_writeSkippableFrame() : + * Generates a zstd skippable frame containing data given by src, and writes it to dst buffer. + * + * Skippable frames begin with a 4-byte magic number. There are 16 possible choices of magic number, + * ranging from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15. + * As such, the parameter magicVariant controls the exact skippable frame magic number variant used, so + * the magic number used will be ZSTD_MAGIC_SKIPPABLE_START + magicVariant. + * + * Returns an error if destination buffer is not large enough, if the source size is not representable + * with a 4-byte unsigned int, or if the parameter magicVariant is greater than 15 (and therefore invalid). + * + * @return : number of bytes written or a ZSTD error. + */ +ZSTDLIB_STATIC_API size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity, + const void* src, size_t srcSize, unsigned magicVariant); + +/*! ZSTD_readSkippableFrame() : + * Retrieves a zstd skippable frame containing data given by src, and writes it to dst buffer. + * + * The parameter magicVariant will receive the magicVariant that was supplied when the frame was written, + * i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested + * in the magicVariant. + * + * Returns an error if destination buffer is not large enough, or if the frame is not skippable. + * + * @return : number of bytes written or a ZSTD error. + */ +ZSTDLIB_API size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity, unsigned* magicVariant, + const void* src, size_t srcSize); + +/*! ZSTD_isSkippableFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame. + */ +ZSTDLIB_API unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size); + + + +/*************************************** +* Memory management +***************************************/ + +/*! ZSTD_estimate*() : + * These functions make it possible to estimate memory usage + * of a future {D,C}Ctx, before its creation. + * + * ZSTD_estimateCCtxSize() will provide a memory budget large enough + * for any compression level up to selected one. + * Note : Unlike ZSTD_estimateCStreamSize*(), this estimate + * does not include space for a window buffer. + * Therefore, the estimation is only guaranteed for single-shot compressions, not streaming. + * The estimate will assume the input may be arbitrarily large, + * which is the worst case. + * + * When srcSize can be bound by a known and rather "small" value, + * this fact can be used to provide a tighter estimation + * because the CCtx compression context will need less memory. + * This tighter estimation can be provided by more advanced functions + * ZSTD_estimateCCtxSize_usingCParams(), which can be used in tandem with ZSTD_getCParams(), + * and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter(). + * Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits. + * + * Note : only single-threaded compression is supported. + * ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + * + * Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + * Size estimates assume that no external sequence producer is registered. + */ +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize(int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void); + +/*! ZSTD_estimateCStreamSize() : + * ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one. + * It will also consider src size to be arbitrarily "large", which is worst case. + * If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation. + * ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel. + * ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParams_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_c_nbWorkers is >= 1. + * Note : CStream size estimation is only correct for single-threaded compression. + * ZSTD_DStream memory budget depends on window Size. + * This information can be passed manually, using ZSTD_estimateDStreamSize, + * or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame(); + * Note : if streaming is init with function ZSTD_init?Stream_usingDict(), + * an internal ?Dict will be created, which additional size is not estimated here. + * In this case, get total size by adding ZSTD_estimate?DictSize + * Note 2 : only single-threaded compression is supported. + * ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + * Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + * Size estimates assume that no external sequence producer is registered. + */ +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize(int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize(size_t windowSize); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize); + +/*! ZSTD_estimate?DictSize() : + * ZSTD_estimateCDictSize() will bet that src size is relatively "small", and content is copied, like ZSTD_createCDict(). + * ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced(). + * Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller. + */ +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod); + +/*! ZSTD_initStatic*() : + * Initialize an object using a pre-allocated fixed-size buffer. + * workspace: The memory area to emplace the object into. + * Provided pointer *must be 8-bytes aligned*. + * Buffer must outlive object. + * workspaceSize: Use ZSTD_estimate*Size() to determine + * how large workspace must be to support target scenario. + * @return : pointer to object (same address as workspace, just different type), + * or NULL if error (size too small, incorrect alignment, etc.) + * Note : zstd will never resize nor malloc() when using a static buffer. + * If the object requires more memory than available, + * zstd will just error out (typically ZSTD_error_memory_allocation). + * Note 2 : there is no corresponding "free" function. + * Since workspace is allocated externally, it must be freed externally too. + * Note 3 : cParams : use ZSTD_getCParams() to convert a compression level + * into its associated cParams. + * Limitation 1 : currently not compatible with internal dictionary creation, triggered by + * ZSTD_CCtx_loadDictionary(), ZSTD_initCStream_usingDict() or ZSTD_initDStream_usingDict(). + * Limitation 2 : static cctx currently not compatible with multi-threading. + * Limitation 3 : static dctx is incompatible with legacy support. + */ +ZSTDLIB_STATIC_API ZSTD_CCtx* ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize); +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticCCtx() */ + +ZSTDLIB_STATIC_API ZSTD_DCtx* ZSTD_initStaticDCtx(void* workspace, size_t workspaceSize); +ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticDCtx() */ + +ZSTDLIB_STATIC_API const ZSTD_CDict* ZSTD_initStaticCDict( + void* workspace, size_t workspaceSize, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_compressionParameters cParams); + +ZSTDLIB_STATIC_API const ZSTD_DDict* ZSTD_initStaticDDict( + void* workspace, size_t workspaceSize, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType); + + +/*! Custom memory allocation : + * These prototypes make it possible to pass your own allocation/free functions. + * ZSTD_customMem is provided at creation time, using ZSTD_create*_advanced() variants listed below. + * All allocation/free operations will be completed using these custom variants instead of regular ones. + */ +typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size); +typedef void (*ZSTD_freeFunction) (void* opaque, void* address); +typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; void* opaque; } ZSTD_customMem; +static +#ifdef __GNUC__ +__attribute__((__unused__)) +#endif +ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */ + +ZSTDLIB_STATIC_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem); + +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_compressionParameters cParams, + ZSTD_customMem customMem); + +/*! Thread pool : + * These prototypes make it possible to share a thread pool among multiple compression contexts. + * This can limit resources for applications with multiple threads where each one uses + * a threaded compression mode (via ZSTD_c_nbWorkers parameter). + * ZSTD_createThreadPool creates a new thread pool with a given number of threads. + * Note that the lifetime of such pool must exist while being used. + * ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value + * to use an internal thread pool). + * ZSTD_freeThreadPool frees a thread pool, accepts NULL pointer. + */ +typedef struct POOL_ctx_s ZSTD_threadPool; +ZSTDLIB_STATIC_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads); +ZSTDLIB_STATIC_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool); /* accept NULL pointer */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool); + + +/* + * This API is temporary and is expected to change or disappear in the future! + */ +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced2( + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + const ZSTD_CCtx_params* cctxParams, + ZSTD_customMem customMem); + +ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_advanced( + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_customMem customMem); + + +/*************************************** +* Advanced compression functions +***************************************/ + +/*! ZSTD_createCDict_byReference() : + * Create a digested dictionary for compression + * Dictionary content is just referenced, not duplicated. + * As a consequence, `dictBuffer` **must** outlive CDict, + * and its content must remain unmodified throughout the lifetime of CDict. + * note: equivalent to ZSTD_createCDict_advanced(), with dictLoadMethod==ZSTD_dlm_byRef */ +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel); + +/*! ZSTD_getCParams() : + * @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize. + * `estimatedSrcSize` value is optional, select 0 if not known */ +ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); + +/*! ZSTD_getParams() : + * same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`. + * All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0 */ +ZSTDLIB_STATIC_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); + +/*! ZSTD_checkCParams() : + * Ensure param values remain within authorized range. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()) */ +ZSTDLIB_STATIC_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); + +/*! ZSTD_adjustCParams() : + * optimize params for a given `srcSize` and `dictSize`. + * `srcSize` can be unknown, in which case use ZSTD_CONTENTSIZE_UNKNOWN. + * `dictSize` must be `0` when there is no dictionary. + * cPar can be invalid : all parameters will be clamped within valid range in the @return struct. + * This function never fails (wide contract) */ +ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); + +/*! ZSTD_CCtx_setCParams() : + * Set all parameters provided within @p cparams into the working @p cctx. + * Note : if modifying parameters during compression (MT mode only), + * note that changes to the .windowLog parameter will be ignored. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()). + * On failure, no parameters are updated. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams); + +/*! ZSTD_CCtx_setFParams() : + * Set all parameters provided within @p fparams into the working @p cctx. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setFParams(ZSTD_CCtx* cctx, ZSTD_frameParameters fparams); + +/*! ZSTD_CCtx_setParams() : + * Set all parameters provided within @p params into the working @p cctx. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParams(ZSTD_CCtx* cctx, ZSTD_parameters params); + +/*! ZSTD_compress_advanced() : + * Note : this function is now DEPRECATED. + * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters. + * This prototype will generate compilation warnings. */ +ZSTD_DEPRECATED("use ZSTD_compress2") +ZSTDLIB_STATIC_API +size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + ZSTD_parameters params); + +/*! ZSTD_compress_usingCDict_advanced() : + * Note : this function is now DEPRECATED. + * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_loadDictionary() and other parameter setters. + * This prototype will generate compilation warnings. */ +ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary") +ZSTDLIB_STATIC_API +size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_CDict* cdict, + ZSTD_frameParameters fParams); + + +/*! ZSTD_CCtx_loadDictionary_byReference() : + * Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx. + * It saves some memory, but also requires that `dict` outlives its usage within `cctx` */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); + +/*! ZSTD_CCtx_loadDictionary_advanced() : + * Same as ZSTD_CCtx_loadDictionary(), but gives finer control over + * how to load the dictionary (by copy ? by reference ?) + * and how to interpret it (automatic ? force raw mode ? full mode only ?) */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); + +/*! ZSTD_CCtx_refPrefix_advanced() : + * Same as ZSTD_CCtx_refPrefix(), but gives finer control over + * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); + +/* === experimental parameters === */ +/* these parameters can be used with ZSTD_setParameter() + * they are not guaranteed to remain supported in the future */ + + /* Enables rsyncable mode, + * which makes compressed files more rsync friendly + * by adding periodic synchronization points to the compressed data. + * The target average block size is ZSTD_c_jobSize / 2. + * It's possible to modify the job size to increase or decrease + * the granularity of the synchronization point. + * Once the jobSize is smaller than the window size, + * it will result in compression ratio degradation. + * NOTE 1: rsyncable mode only works when multithreading is enabled. + * NOTE 2: rsyncable performs poorly in combination with long range mode, + * since it will decrease the effectiveness of synchronization points, + * though mileage may vary. + * NOTE 3: Rsyncable mode limits maximum compression speed to ~400 MB/s. + * If the selected compression level is already running significantly slower, + * the overall speed won't be significantly impacted. + */ + #define ZSTD_c_rsyncable ZSTD_c_experimentalParam1 + +/* Select a compression format. + * The value must be of type ZSTD_format_e. + * See ZSTD_format_e enum definition for details */ +#define ZSTD_c_format ZSTD_c_experimentalParam2 + +/* Force back-reference distances to remain < windowSize, + * even when referencing into Dictionary content (default:0) */ +#define ZSTD_c_forceMaxWindow ZSTD_c_experimentalParam3 + +/* Controls whether the contents of a CDict + * are used in place, or copied into the working context. + * Accepts values from the ZSTD_dictAttachPref_e enum. + * See the comments on that enum for an explanation of the feature. */ +#define ZSTD_c_forceAttachDict ZSTD_c_experimentalParam4 + +/* Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never compress literals. + * Set to ZSTD_ps_enable to always compress literals. (Note: uncompressed literals + * may still be emitted if huffman is not beneficial to use.) + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * literals compression based on the compression parameters - specifically, + * negative compression levels do not use literal compression. + */ +#define ZSTD_c_literalCompressionMode ZSTD_c_experimentalParam5 + +/* Tries to fit compressed block size to be around targetCBlockSize. + * No target when targetCBlockSize == 0. + * There is no guarantee on compressed block size (default:0) */ +#define ZSTD_c_targetCBlockSize ZSTD_c_experimentalParam6 + +/* User's best guess of source size. + * Hint is not valid when srcSizeHint == 0. + * There is no guarantee that hint is close to actual source size, + * but compression ratio may regress significantly if guess considerably underestimates */ +#define ZSTD_c_srcSizeHint ZSTD_c_experimentalParam7 + +/* Controls whether the new and experimental "dedicated dictionary search + * structure" can be used. This feature is still rough around the edges, be + * prepared for surprising behavior! + * + * How to use it: + * + * When using a CDict, whether to use this feature or not is controlled at + * CDict creation, and it must be set in a CCtxParams set passed into that + * construction (via ZSTD_createCDict_advanced2()). A compression will then + * use the feature or not based on how the CDict was constructed; the value of + * this param, set in the CCtx, will have no effect. + * + * However, when a dictionary buffer is passed into a CCtx, such as via + * ZSTD_CCtx_loadDictionary(), this param can be set on the CCtx to control + * whether the CDict that is created internally can use the feature or not. + * + * What it does: + * + * Normally, the internal data structures of the CDict are analogous to what + * would be stored in a CCtx after compressing the contents of a dictionary. + * To an approximation, a compression using a dictionary can then use those + * data structures to simply continue what is effectively a streaming + * compression where the simulated compression of the dictionary left off. + * Which is to say, the search structures in the CDict are normally the same + * format as in the CCtx. + * + * It is possible to do better, since the CDict is not like a CCtx: the search + * structures are written once during CDict creation, and then are only read + * after that, while the search structures in the CCtx are both read and + * written as the compression goes along. This means we can choose a search + * structure for the dictionary that is read-optimized. + * + * This feature enables the use of that different structure. + * + * Note that some of the members of the ZSTD_compressionParameters struct have + * different semantics and constraints in the dedicated search structure. It is + * highly recommended that you simply set a compression level in the CCtxParams + * you pass into the CDict creation call, and avoid messing with the cParams + * directly. + * + * Effects: + * + * This will only have any effect when the selected ZSTD_strategy + * implementation supports this feature. Currently, that's limited to + * ZSTD_greedy, ZSTD_lazy, and ZSTD_lazy2. + * + * Note that this means that the CDict tables can no longer be copied into the + * CCtx, so the dict attachment mode ZSTD_dictForceCopy will no longer be + * usable. The dictionary can only be attached or reloaded. + * + * In general, you should expect compression to be faster--sometimes very much + * so--and CDict creation to be slightly slower. Eventually, we will probably + * make this mode the default. + */ +#define ZSTD_c_enableDedicatedDictSearch ZSTD_c_experimentalParam8 + +/* ZSTD_c_stableInBuffer + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable. + * + * Tells the compressor that input data presented with ZSTD_inBuffer + * will ALWAYS be the same between calls. + * Technically, the @src pointer must never be changed, + * and the @pos field can only be updated by zstd. + * However, it's possible to increase the @size field, + * allowing scenarios where more data can be appended after compressions starts. + * These conditions are checked by the compressor, + * and compression will fail if they are not respected. + * Also, data in the ZSTD_inBuffer within the range [src, src + pos) + * MUST not be modified during compression or it will result in data corruption. + * + * When this flag is enabled zstd won't allocate an input window buffer, + * because the user guarantees it can reference the ZSTD_inBuffer until + * the frame is complete. But, it will still allocate an output buffer + * large enough to fit a block (see ZSTD_c_stableOutBuffer). This will also + * avoid the memcpy() from the input buffer to the input window buffer. + * + * NOTE: So long as the ZSTD_inBuffer always points to valid memory, using + * this flag is ALWAYS memory safe, and will never access out-of-bounds + * memory. However, compression WILL fail if conditions are not respected. + * + * WARNING: The data in the ZSTD_inBuffer in the range [src, src + pos) MUST + * not be modified during compression or it will result in data corruption. + * This is because zstd needs to reference data in the ZSTD_inBuffer to find + * matches. Normally zstd maintains its own window buffer for this purpose, + * but passing this flag tells zstd to rely on user provided buffer instead. + */ +#define ZSTD_c_stableInBuffer ZSTD_c_experimentalParam9 + +/* ZSTD_c_stableOutBuffer + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable. + * + * Tells he compressor that the ZSTD_outBuffer will not be resized between + * calls. Specifically: (out.size - out.pos) will never grow. This gives the + * compressor the freedom to say: If the compressed data doesn't fit in the + * output buffer then return ZSTD_error_dstSizeTooSmall. This allows us to + * always decompress directly into the output buffer, instead of decompressing + * into an internal buffer and copying to the output buffer. + * + * When this flag is enabled zstd won't allocate an output buffer, because + * it can write directly to the ZSTD_outBuffer. It will still allocate the + * input window buffer (see ZSTD_c_stableInBuffer). + * + * Zstd will check that (out.size - out.pos) never grows and return an error + * if it does. While not strictly necessary, this should prevent surprises. + */ +#define ZSTD_c_stableOutBuffer ZSTD_c_experimentalParam10 + +/* ZSTD_c_blockDelimiters + * Default is 0 == ZSTD_sf_noBlockDelimiters. + * + * For use with sequence compression API: ZSTD_compressSequences(). + * + * Designates whether or not the given array of ZSTD_Sequence contains block delimiters + * and last literals, which are defined as sequences with offset == 0 and matchLength == 0. + * See the definition of ZSTD_Sequence for more specifics. + */ +#define ZSTD_c_blockDelimiters ZSTD_c_experimentalParam11 + +/* ZSTD_c_validateSequences + * Default is 0 == disabled. Set to 1 to enable sequence validation. + * + * For use with sequence compression API: ZSTD_compressSequences(). + * Designates whether or not we validate sequences provided to ZSTD_compressSequences() + * during function execution. + * + * Without validation, providing a sequence that does not conform to the zstd spec will cause + * undefined behavior, and may produce a corrupted block. + * + * With validation enabled, if sequence is invalid (see doc/zstd_compression_format.md for + * specifics regarding offset/matchlength requirements) then the function will bail out and + * return an error. + * + */ +#define ZSTD_c_validateSequences ZSTD_c_experimentalParam12 + +/* ZSTD_c_useBlockSplitter + * Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never use block splitter. + * Set to ZSTD_ps_enable to always use block splitter. + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * block splitting based on the compression parameters. + */ +#define ZSTD_c_useBlockSplitter ZSTD_c_experimentalParam13 + +/* ZSTD_c_useRowMatchFinder + * Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never use row-based matchfinder. + * Set to ZSTD_ps_enable to force usage of row-based matchfinder. + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * the row-based matchfinder based on support for SIMD instructions and the window log. + * Note that this only pertains to compression strategies: greedy, lazy, and lazy2 + */ +#define ZSTD_c_useRowMatchFinder ZSTD_c_experimentalParam14 + +/* ZSTD_c_deterministicRefPrefix + * Default is 0 == disabled. Set to 1 to enable. + * + * Zstd produces different results for prefix compression when the prefix is + * directly adjacent to the data about to be compressed vs. when it isn't. + * This is because zstd detects that the two buffers are contiguous and it can + * use a more efficient match finding algorithm. However, this produces different + * results than when the two buffers are non-contiguous. This flag forces zstd + * to always load the prefix in non-contiguous mode, even if it happens to be + * adjacent to the data, to guarantee determinism. + * + * If you really care about determinism when using a dictionary or prefix, + * like when doing delta compression, you should select this option. It comes + * at a speed penalty of about ~2.5% if the dictionary and data happened to be + * contiguous, and is free if they weren't contiguous. We don't expect that + * intentionally making the dictionary and data contiguous will be worth the + * cost to memcpy() the data. + */ +#define ZSTD_c_deterministicRefPrefix ZSTD_c_experimentalParam15 + +/* ZSTD_c_prefetchCDictTables + * Controlled with ZSTD_paramSwitch_e enum. Default is ZSTD_ps_auto. + * + * In some situations, zstd uses CDict tables in-place rather than copying them + * into the working context. (See docs on ZSTD_dictAttachPref_e above for details). + * In such situations, compression speed is seriously impacted when CDict tables are + * "cold" (outside CPU cache). This parameter instructs zstd to prefetch CDict tables + * when they are used in-place. + * + * For sufficiently small inputs, the cost of the prefetch will outweigh the benefit. + * For sufficiently large inputs, zstd will by default memcpy() CDict tables + * into the working context, so there is no need to prefetch. This parameter is + * targeted at a middle range of input sizes, where a prefetch is cheap enough to be + * useful but memcpy() is too expensive. The exact range of input sizes where this + * makes sense is best determined by careful experimentation. + * + * Note: for this parameter, ZSTD_ps_auto is currently equivalent to ZSTD_ps_disable, + * but in the future zstd may conditionally enable this feature via an auto-detection + * heuristic for cold CDicts. + * Use ZSTD_ps_disable to opt out of prefetching under any circumstances. + */ +#define ZSTD_c_prefetchCDictTables ZSTD_c_experimentalParam16 + +/* ZSTD_c_enableSeqProducerFallback + * Allowed values are 0 (disable) and 1 (enable). The default setting is 0. + * + * Controls whether zstd will fall back to an internal sequence producer if an + * external sequence producer is registered and returns an error code. This fallback + * is block-by-block: the internal sequence producer will only be called for blocks + * where the external sequence producer returns an error code. Fallback parsing will + * follow any other cParam settings, such as compression level, the same as in a + * normal (fully-internal) compression operation. + * + * The user is strongly encouraged to read the full Block-Level Sequence Producer API + * documentation (below) before setting this parameter. */ +#define ZSTD_c_enableSeqProducerFallback ZSTD_c_experimentalParam17 + +/* ZSTD_c_maxBlockSize + * Allowed values are between 1KB and ZSTD_BLOCKSIZE_MAX (128KB). + * The default is ZSTD_BLOCKSIZE_MAX, and setting to 0 will set to the default. + * + * This parameter can be used to set an upper bound on the blocksize + * that overrides the default ZSTD_BLOCKSIZE_MAX. It cannot be used to set upper + * bounds greater than ZSTD_BLOCKSIZE_MAX or bounds lower than 1KB (will make + * compressBound() inaccurate). Only currently meant to be used for testing. + * + */ +#define ZSTD_c_maxBlockSize ZSTD_c_experimentalParam18 + +/* ZSTD_c_searchForExternalRepcodes + * This parameter affects how zstd parses external sequences, such as sequences + * provided through the compressSequences() API or from an external block-level + * sequence producer. + * + * If set to ZSTD_ps_enable, the library will check for repeated offsets in + * external sequences, even if those repcodes are not explicitly indicated in + * the "rep" field. Note that this is the only way to exploit repcode matches + * while using compressSequences() or an external sequence producer, since zstd + * currently ignores the "rep" field of external sequences. + * + * If set to ZSTD_ps_disable, the library will not exploit repeated offsets in + * external sequences, regardless of whether the "rep" field has been set. This + * reduces sequence compression overhead by about 25% while sacrificing some + * compression ratio. + * + * The default value is ZSTD_ps_auto, for which the library will enable/disable + * based on compression level. + * + * Note: for now, this param only has an effect if ZSTD_c_blockDelimiters is + * set to ZSTD_sf_explicitBlockDelimiters. That may change in the future. + */ +#define ZSTD_c_searchForExternalRepcodes ZSTD_c_experimentalParam19 + +/*! ZSTD_CCtx_getParameter() : + * Get the requested compression parameter value, selected by enum ZSTD_cParameter, + * and store it into int* value. + * @return : 0, or an error code (which can be tested with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value); + + +/*! ZSTD_CCtx_params : + * Quick howto : + * - ZSTD_createCCtxParams() : Create a ZSTD_CCtx_params structure + * - ZSTD_CCtxParams_setParameter() : Push parameters one by one into + * an existing ZSTD_CCtx_params structure. + * This is similar to + * ZSTD_CCtx_setParameter(). + * - ZSTD_CCtx_setParametersUsingCCtxParams() : Apply parameters to + * an existing CCtx. + * These parameters will be applied to + * all subsequent frames. + * - ZSTD_compressStream2() : Do compression using the CCtx. + * - ZSTD_freeCCtxParams() : Free the memory, accept NULL pointer. + * + * This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams() + * for static allocation of CCtx for single-threaded compression. + */ +ZSTDLIB_STATIC_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void); +ZSTDLIB_STATIC_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointer */ + +/*! ZSTD_CCtxParams_reset() : + * Reset params to default values. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params); + +/*! ZSTD_CCtxParams_init() : + * Initializes the compression parameters of cctxParams according to + * compression level. All other parameters are reset to their default values. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel); + +/*! ZSTD_CCtxParams_init_advanced() : + * Initializes the compression and frame parameters of cctxParams according to + * params. All other parameters are reset to their default values. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params); + +/*! ZSTD_CCtxParams_setParameter() : Requires v1.4.0+ + * Similar to ZSTD_CCtx_setParameter. + * Set one compression parameter, selected by enum ZSTD_cParameter. + * Parameters must be applied to a ZSTD_CCtx using + * ZSTD_CCtx_setParametersUsingCCtxParams(). + * @result : a code representing success or failure (which can be tested with + * ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value); + +/*! ZSTD_CCtxParams_getParameter() : + * Similar to ZSTD_CCtx_getParameter. + * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value); + +/*! ZSTD_CCtx_setParametersUsingCCtxParams() : + * Apply a set of ZSTD_CCtx_params to the compression context. + * This can be done even after compression is started, + * if nbWorkers==0, this will have no impact until a new compression is started. + * if nbWorkers>=1, new parameters will be picked up at next job, + * with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( + ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params); + +/*! ZSTD_compressStream2_simpleArgs() : + * Same as ZSTD_compressStream2(), + * but using only integral types as arguments. + * This variant might be helpful for binders from dynamic languages + * which have troubles handling structures containing memory pointers. + */ +ZSTDLIB_STATIC_API size_t ZSTD_compressStream2_simpleArgs ( + ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, size_t* dstPos, + const void* src, size_t srcSize, size_t* srcPos, + ZSTD_EndDirective endOp); + + +/*************************************** +* Advanced decompression functions +***************************************/ + +/*! ZSTD_isFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier. + * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. + * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. + * Note 3 : Skippable Frame Identifiers are considered valid. */ +ZSTDLIB_STATIC_API unsigned ZSTD_isFrame(const void* buffer, size_t size); + +/*! ZSTD_createDDict_byReference() : + * Create a digested dictionary, ready to start decompression operation without startup delay. + * Dictionary content is referenced, and therefore stays in dictBuffer. + * It is important that dictBuffer outlives DDict, + * it must remain read accessible throughout the lifetime of DDict */ +ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize); + +/*! ZSTD_DCtx_loadDictionary_byReference() : + * Same as ZSTD_DCtx_loadDictionary(), + * but references `dict` content instead of copying it into `dctx`. + * This saves memory if `dict` remains around., + * However, it's imperative that `dict` remains accessible (and unmodified) while being used, so it must outlive decompression. */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); + +/*! ZSTD_DCtx_loadDictionary_advanced() : + * Same as ZSTD_DCtx_loadDictionary(), + * but gives direct control over + * how to load the dictionary (by copy ? by reference ?) + * and how to interpret it (automatic ? force raw mode ? full mode only ?). */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); + +/*! ZSTD_DCtx_refPrefix_advanced() : + * Same as ZSTD_DCtx_refPrefix(), but gives finer control over + * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); + +/*! ZSTD_DCtx_setMaxWindowSize() : + * Refuses allocating internal buffers for frames requiring a window size larger than provided limit. + * This protects a decoder context from reserving too much memory for itself (potential attack scenario). + * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode. + * By default, a decompression context accepts all window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) + * @return : 0, or an error code (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize); + +/*! ZSTD_DCtx_getParameter() : + * Get the requested decompression parameter value, selected by enum ZSTD_dParameter, + * and store it into int* value. + * @return : 0, or an error code (which can be tested with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value); + +/* ZSTD_d_format + * experimental parameter, + * allowing selection between ZSTD_format_e input compression formats + */ +#define ZSTD_d_format ZSTD_d_experimentalParam1 +/* ZSTD_d_stableOutBuffer + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable. + * + * Tells the decompressor that the ZSTD_outBuffer will ALWAYS be the same + * between calls, except for the modifications that zstd makes to pos (the + * caller must not modify pos). This is checked by the decompressor, and + * decompression will fail if it ever changes. Therefore the ZSTD_outBuffer + * MUST be large enough to fit the entire decompressed frame. This will be + * checked when the frame content size is known. The data in the ZSTD_outBuffer + * in the range [dst, dst + pos) MUST not be modified during decompression + * or you will get data corruption. + * + * When this flag is enabled zstd won't allocate an output buffer, because + * it can write directly to the ZSTD_outBuffer, but it will still allocate + * an input buffer large enough to fit any compressed block. This will also + * avoid the memcpy() from the internal output buffer to the ZSTD_outBuffer. + * If you need to avoid the input buffer allocation use the buffer-less + * streaming API. + * + * NOTE: So long as the ZSTD_outBuffer always points to valid memory, using + * this flag is ALWAYS memory safe, and will never access out-of-bounds + * memory. However, decompression WILL fail if you violate the preconditions. + * + * WARNING: The data in the ZSTD_outBuffer in the range [dst, dst + pos) MUST + * not be modified during decompression or you will get data corruption. This + * is because zstd needs to reference data in the ZSTD_outBuffer to regenerate + * matches. Normally zstd maintains its own buffer for this purpose, but passing + * this flag tells zstd to use the user provided buffer. + */ +#define ZSTD_d_stableOutBuffer ZSTD_d_experimentalParam2 + +/* ZSTD_d_forceIgnoreChecksum + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable + * + * Tells the decompressor to skip checksum validation during decompression, regardless + * of whether checksumming was specified during compression. This offers some + * slight performance benefits, and may be useful for debugging. + * Param has values of type ZSTD_forceIgnoreChecksum_e + */ +#define ZSTD_d_forceIgnoreChecksum ZSTD_d_experimentalParam3 + +/* ZSTD_d_refMultipleDDicts + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable + * + * If enabled and dctx is allocated on the heap, then additional memory will be allocated + * to store references to multiple ZSTD_DDict. That is, multiple calls of ZSTD_refDDict() + * using a given ZSTD_DCtx, rather than overwriting the previous DDict reference, will instead + * store all references. At decompression time, the appropriate dictID is selected + * from the set of DDicts based on the dictID in the frame. + * + * Usage is simply calling ZSTD_refDDict() on multiple dict buffers. + * + * Param has values of byte ZSTD_refMultipleDDicts_e + * + * WARNING: Enabling this parameter and calling ZSTD_DCtx_refDDict(), will trigger memory + * allocation for the hash table. ZSTD_freeDCtx() also frees this memory. + * Memory is allocated as per ZSTD_DCtx::customMem. + * + * Although this function allocates memory for the table, the user is still responsible for + * memory management of the underlying ZSTD_DDict* themselves. + */ +#define ZSTD_d_refMultipleDDicts ZSTD_d_experimentalParam4 + +/* ZSTD_d_disableHuffmanAssembly + * Set to 1 to disable the Huffman assembly implementation. + * The default value is 0, which allows zstd to use the Huffman assembly + * implementation if available. + * + * This parameter can be used to disable Huffman assembly at runtime. + * If you want to disable it at compile time you can define the macro + * ZSTD_DISABLE_ASM. + */ +#define ZSTD_d_disableHuffmanAssembly ZSTD_d_experimentalParam5 + + +/*! ZSTD_DCtx_setFormat() : + * This function is REDUNDANT. Prefer ZSTD_DCtx_setParameter(). + * Instruct the decoder context about what kind of data to decode next. + * This instruction is mandatory to decode data without a fully-formed header, + * such ZSTD_f_zstd1_magicless for example. + * @return : 0, or an error code (which can be tested using ZSTD_isError()). */ +ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead") +ZSTDLIB_STATIC_API +size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); + +/*! ZSTD_decompressStream_simpleArgs() : + * Same as ZSTD_decompressStream(), + * but using only integral types as arguments. + * This can be helpful for binders from dynamic languages + * which have troubles handling structures containing memory pointers. + */ +ZSTDLIB_STATIC_API size_t ZSTD_decompressStream_simpleArgs ( + ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, size_t* dstPos, + const void* src, size_t srcSize, size_t* srcPos); + + +/******************************************************************** +* Advanced streaming functions +* Warning : most of these functions are now redundant with the Advanced API. +* Once Advanced API reaches "stable" status, +* redundant functions will be deprecated, and then at some point removed. +********************************************************************/ + +/*===== Advanced Streaming compression functions =====*/ + +/*! ZSTD_initCStream_srcSize() : + * This function is DEPRECATED, and equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) + * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * + * pledgedSrcSize must be correct. If it is not known at init time, use + * ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs, + * "0" also disables frame content size field. It may be enabled in the future. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, + int compressionLevel, + unsigned long long pledgedSrcSize); + +/*! ZSTD_initCStream_usingDict() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * ZSTD_CCtx_loadDictionary(zcs, dict, dictSize); + * + * Creates of an internal CDict (incompatible with static CCtx), except if + * dict == NULL or dictSize < 8, in which case no dict is used. + * Note: dict is loaded with ZSTD_dct_auto (treated as a full zstd dictionary if + * it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, + const void* dict, size_t dictSize, + int compressionLevel); + +/*! ZSTD_initCStream_advanced() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setParams(zcs, params); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * ZSTD_CCtx_loadDictionary(zcs, dict, dictSize); + * + * dict is loaded with ZSTD_dct_auto and ZSTD_dlm_byCopy. + * pledgedSrcSize must be correct. + * If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, + const void* dict, size_t dictSize, + ZSTD_parameters params, + unsigned long long pledgedSrcSize); + +/*! ZSTD_initCStream_usingCDict() : + * This function is DEPRECATED, and equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_refCDict(zcs, cdict); + * + * note : cdict will just be referenced, and must outlive compression session + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict); + +/*! ZSTD_initCStream_usingCDict_advanced() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setFParams(zcs, fParams); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * ZSTD_CCtx_refCDict(zcs, cdict); + * + * same as ZSTD_initCStream_usingCDict(), with control over frame parameters. + * pledgedSrcSize must be correct. If srcSize is not known at init time, use + * value ZSTD_CONTENTSIZE_UNKNOWN. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, + const ZSTD_CDict* cdict, + ZSTD_frameParameters fParams, + unsigned long long pledgedSrcSize); + +/*! ZSTD_resetCStream() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * Note: ZSTD_resetCStream() interprets pledgedSrcSize == 0 as ZSTD_CONTENTSIZE_UNKNOWN, but + * ZSTD_CCtx_setPledgedSrcSize() does not do the same, so ZSTD_CONTENTSIZE_UNKNOWN must be + * explicitly specified. + * + * start a new frame, using same parameters from previous frame. + * This is typically useful to skip dictionary loading stage, since it will re-use it in-place. + * Note that zcs must be init at least once before using ZSTD_resetCStream(). + * If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN. + * If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end. + * For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs, + * but it will change to mean "empty" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead. + * @return : 0, or an error code (which can be tested using ZSTD_isError()) + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); + + +typedef struct { + unsigned long long ingested; /* nb input bytes read and buffered */ + unsigned long long consumed; /* nb input bytes actually compressed */ + unsigned long long produced; /* nb of compressed bytes generated and buffered */ + unsigned long long flushed; /* nb of compressed bytes flushed : not provided; can be tracked from caller side */ + unsigned currentJobID; /* MT only : latest started job nb */ + unsigned nbActiveWorkers; /* MT only : nb of workers actively compressing at probe time */ +} ZSTD_frameProgression; + +/* ZSTD_getFrameProgression() : + * tells how much data has been ingested (read from input) + * consumed (input actually compressed) and produced (output) for current frame. + * Note : (ingested - consumed) is amount of input data buffered internally, not yet compressed. + * Aggregates progression inside active worker threads. + */ +ZSTDLIB_STATIC_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx); + +/*! ZSTD_toFlushNow() : + * Tell how many bytes are ready to be flushed immediately. + * Useful for multithreading scenarios (nbWorkers >= 1). + * Probe the oldest active job, defined as oldest job not yet entirely flushed, + * and check its output buffer. + * @return : amount of data stored in oldest job and ready to be flushed immediately. + * if @return == 0, it means either : + * + there is no active job (could be checked with ZSTD_frameProgression()), or + * + oldest job is still actively compressing data, + * but everything it has produced has also been flushed so far, + * therefore flush speed is limited by production speed of oldest job + * irrespective of the speed of concurrent (and newer) jobs. + */ +ZSTDLIB_STATIC_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx); + + +/*===== Advanced Streaming decompression functions =====*/ + +/*! + * This function is deprecated, and is equivalent to: + * + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * ZSTD_DCtx_loadDictionary(zds, dict, dictSize); + * + * note: no dictionary will be used if dict == NULL or dictSize < 8 + */ +ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_loadDictionary, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); + +/*! + * This function is deprecated, and is equivalent to: + * + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * ZSTD_DCtx_refDDict(zds, ddict); + * + * note : ddict is referenced, it must outlive decompression session + */ +ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_refDDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); + +/*! + * This function is deprecated, and is equivalent to: + * + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * + * re-use decompression parameters from previous init; saves dictionary loading + */ +ZSTD_DEPRECATED("use ZSTD_DCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); + + +/* ********************* BLOCK-LEVEL SEQUENCE PRODUCER API ********************* + * + * *** OVERVIEW *** + * The Block-Level Sequence Producer API allows users to provide their own custom + * sequence producer which libzstd invokes to process each block. The produced list + * of sequences (literals and matches) is then post-processed by libzstd to produce + * valid compressed blocks. + * + * This block-level offload API is a more granular complement of the existing + * frame-level offload API compressSequences() (introduced in v1.5.1). It offers + * an easier migration story for applications already integrated with libzstd: the + * user application continues to invoke the same compression functions + * ZSTD_compress2() or ZSTD_compressStream2() as usual, and transparently benefits + * from the specific advantages of the external sequence producer. For example, + * the sequence producer could be tuned to take advantage of known characteristics + * of the input, to offer better speed / ratio, or could leverage hardware + * acceleration not available within libzstd itself. + * + * See contrib/externalSequenceProducer for an example program employing the + * Block-Level Sequence Producer API. + * + * *** USAGE *** + * The user is responsible for implementing a function of type + * ZSTD_sequenceProducer_F. For each block, zstd will pass the following + * arguments to the user-provided function: + * + * - sequenceProducerState: a pointer to a user-managed state for the sequence + * producer. + * + * - outSeqs, outSeqsCapacity: an output buffer for the sequence producer. + * outSeqsCapacity is guaranteed >= ZSTD_sequenceBound(srcSize). The memory + * backing outSeqs is managed by the CCtx. + * + * - src, srcSize: an input buffer for the sequence producer to parse. + * srcSize is guaranteed to be <= ZSTD_BLOCKSIZE_MAX. + * + * - dict, dictSize: a history buffer, which may be empty, which the sequence + * producer may reference as it parses the src buffer. Currently, zstd will + * always pass dictSize == 0 into external sequence producers, but this will + * change in the future. + * + * - compressionLevel: a signed integer representing the zstd compression level + * set by the user for the current operation. The sequence producer may choose + * to use this information to change its compression strategy and speed/ratio + * tradeoff. Note: the compression level does not reflect zstd parameters set + * through the advanced API. + * + * - windowSize: a size_t representing the maximum allowed offset for external + * sequences. Note that sequence offsets are sometimes allowed to exceed the + * windowSize if a dictionary is present, see doc/zstd_compression_format.md + * for details. + * + * The user-provided function shall return a size_t representing the number of + * sequences written to outSeqs. This return value will be treated as an error + * code if it is greater than outSeqsCapacity. The return value must be non-zero + * if srcSize is non-zero. The ZSTD_SEQUENCE_PRODUCER_ERROR macro is provided + * for convenience, but any value greater than outSeqsCapacity will be treated as + * an error code. + * + * If the user-provided function does not return an error code, the sequences + * written to outSeqs must be a valid parse of the src buffer. Data corruption may + * occur if the parse is not valid. A parse is defined to be valid if the + * following conditions hold: + * - The sum of matchLengths and literalLengths must equal srcSize. + * - All sequences in the parse, except for the final sequence, must have + * matchLength >= ZSTD_MINMATCH_MIN. The final sequence must have + * matchLength >= ZSTD_MINMATCH_MIN or matchLength == 0. + * - All offsets must respect the windowSize parameter as specified in + * doc/zstd_compression_format.md. + * - If the final sequence has matchLength == 0, it must also have offset == 0. + * + * zstd will only validate these conditions (and fail compression if they do not + * hold) if the ZSTD_c_validateSequences cParam is enabled. Note that sequence + * validation has a performance cost. + * + * If the user-provided function returns an error, zstd will either fall back + * to an internal sequence producer or fail the compression operation. The user can + * choose between the two behaviors by setting the ZSTD_c_enableSeqProducerFallback + * cParam. Fallback compression will follow any other cParam settings, such as + * compression level, the same as in a normal compression operation. + * + * The user shall instruct zstd to use a particular ZSTD_sequenceProducer_F + * function by calling + * ZSTD_registerSequenceProducer(cctx, + * sequenceProducerState, + * sequenceProducer) + * This setting will persist until the next parameter reset of the CCtx. + * + * The sequenceProducerState must be initialized by the user before calling + * ZSTD_registerSequenceProducer(). The user is responsible for destroying the + * sequenceProducerState. + * + * *** LIMITATIONS *** + * This API is compatible with all zstd compression APIs which respect advanced parameters. + * However, there are three limitations: + * + * First, the ZSTD_c_enableLongDistanceMatching cParam is not currently supported. + * COMPRESSION WILL FAIL if it is enabled and the user tries to compress with a block-level + * external sequence producer. + * - Note that ZSTD_c_enableLongDistanceMatching is auto-enabled by default in some + * cases (see its documentation for details). Users must explicitly set + * ZSTD_c_enableLongDistanceMatching to ZSTD_ps_disable in such cases if an external + * sequence producer is registered. + * - As of this writing, ZSTD_c_enableLongDistanceMatching is disabled by default + * whenever ZSTD_c_windowLog < 128MB, but that's subject to change. Users should + * check the docs on ZSTD_c_enableLongDistanceMatching whenever the Block-Level Sequence + * Producer API is used in conjunction with advanced settings (like ZSTD_c_windowLog). + * + * Second, history buffers are not currently supported. Concretely, zstd will always pass + * dictSize == 0 to the external sequence producer (for now). This has two implications: + * - Dictionaries are not currently supported. Compression will *not* fail if the user + * references a dictionary, but the dictionary won't have any effect. + * - Stream history is not currently supported. All advanced compression APIs, including + * streaming APIs, work with external sequence producers, but each block is treated as + * an independent chunk without history from previous blocks. + * + * Third, multi-threading within a single compression is not currently supported. In other words, + * COMPRESSION WILL FAIL if ZSTD_c_nbWorkers > 0 and an external sequence producer is registered. + * Multi-threading across compressions is fine: simply create one CCtx per thread. + * + * Long-term, we plan to overcome all three limitations. There is no technical blocker to + * overcoming them. It is purely a question of engineering effort. + */ + +#define ZSTD_SEQUENCE_PRODUCER_ERROR ((size_t)(-1)) + +typedef size_t ZSTD_sequenceProducer_F ( + void* sequenceProducerState, + ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + int compressionLevel, + size_t windowSize +); + +/*! ZSTD_registerSequenceProducer() : + * Instruct zstd to use a block-level external sequence producer function. + * + * The sequenceProducerState must be initialized by the caller, and the caller is + * responsible for managing its lifetime. This parameter is sticky across + * compressions. It will remain set until the user explicitly resets compression + * parameters. + * + * Sequence producer registration is considered to be an "advanced parameter", + * part of the "advanced API". This means it will only have an effect on compression + * APIs which respect advanced parameters, such as compress2() and compressStream2(). + * Older compression APIs such as compressCCtx(), which predate the introduction of + * "advanced parameters", will ignore any external sequence producer setting. + * + * The sequence producer can be "cleared" by registering a NULL function pointer. This + * removes all limitations described above in the "LIMITATIONS" section of the API docs. + * + * The user is strongly encouraged to read the full API documentation (above) before + * calling this function. */ +ZSTDLIB_STATIC_API void +ZSTD_registerSequenceProducer( + ZSTD_CCtx* cctx, + void* sequenceProducerState, + ZSTD_sequenceProducer_F* sequenceProducer +); + + +/********************************************************************* +* Buffer-less and synchronous inner streaming functions (DEPRECATED) +* +* This API is deprecated, and will be removed in a future version. +* It allows streaming (de)compression with user allocated buffers. +* However, it is hard to use, and not as well tested as the rest of +* our API. +* +* Please use the normal streaming API instead: ZSTD_compressStream2, +* and ZSTD_decompressStream. +* If there is functionality that you need, but it doesn't provide, +* please open an issue on our GitHub. +********************************************************************* */ + +/** + Buffer-less streaming compression (synchronous mode) + + A ZSTD_CCtx object is required to track streaming operations. + Use ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource. + ZSTD_CCtx object can be re-used multiple times within successive compression operations. + + Start by initializing a context. + Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression. + + Then, consume your input using ZSTD_compressContinue(). + There are some important considerations to keep in mind when using this advanced function : + - ZSTD_compressContinue() has no internal buffer. It uses externally provided buffers only. + - Interface is synchronous : input is consumed entirely and produces 1+ compressed blocks. + - Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario. + Worst case evaluation is provided by ZSTD_compressBound(). + ZSTD_compressContinue() doesn't guarantee recover after a failed compression. + - ZSTD_compressContinue() presumes prior input ***is still accessible and unmodified*** (up to maximum distance size, see WindowLog). + It remembers all previous contiguous blocks, plus one separated memory segment (which can itself consists of multiple contiguous blocks) + - ZSTD_compressContinue() detects that prior input has been overwritten when `src` buffer overlaps. + In which case, it will "discard" the relevant memory section from its history. + + Finish a frame with ZSTD_compressEnd(), which will write the last block(s) and optional checksum. + It's possible to use srcSize==0, in which case, it will write a final empty block to end the frame. + Without last block mark, frames are considered unfinished (hence corrupted) by compliant decoders. + + `ZSTD_CCtx` object can be re-used (ZSTD_compressBegin()) to compress again. +*/ + +/*===== Buffer-less streaming compression functions =====*/ +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */ + +ZSTD_DEPRECATED("This function will likely be removed in a future release. It is misleading and has very limited utility.") +ZSTDLIB_STATIC_API +size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */ + +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + +/* The ZSTD_compressBegin_advanced() and ZSTD_compressBegin_usingCDict_advanced() are now DEPRECATED and will generate a compiler warning */ +ZSTD_DEPRECATED("use advanced API to access custom parameters") +ZSTDLIB_STATIC_API +size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize : If srcSize is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN */ +ZSTD_DEPRECATED("use advanced API to access custom parameters") +ZSTDLIB_STATIC_API +size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict, ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize); /* compression parameters are already set within cdict. pledgedSrcSize must be correct. If srcSize is not known, use macro ZSTD_CONTENTSIZE_UNKNOWN */ +/** + Buffer-less streaming decompression (synchronous mode) + + A ZSTD_DCtx object is required to track streaming operations. + Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it. + A ZSTD_DCtx object can be re-used multiple times. + + First typical operation is to retrieve frame parameters, using ZSTD_getFrameHeader(). + Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough. + Data fragment must be large enough to ensure successful decoding. + `ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough. + result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled. + >0 : `srcSize` is too small, please provide at least result bytes on next attempt. + errorCode, which can be tested using ZSTD_isError(). + + It fills a ZSTD_frameHeader structure with important information to correctly decode the frame, + such as the dictionary ID, content size, or maximum back-reference distance (`windowSize`). + Note that these values could be wrong, either because of data corruption, or because a 3rd party deliberately spoofs false information. + As a consequence, check that values remain within valid application range. + For example, do not allocate memory blindly, check that `windowSize` is within expectation. + Each application can set its own limits, depending on local restrictions. + For extended interoperability, it is recommended to support `windowSize` of at least 8 MB. + + ZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize` bytes. + ZSTD_decompressContinue() is very sensitive to contiguity, + if 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place, + or that previous contiguous segment is large enough to properly handle maximum back-reference distance. + There are multiple ways to guarantee this condition. + + The most memory efficient way is to use a round buffer of sufficient size. + Sufficient size is determined by invoking ZSTD_decodingBufferSize_min(), + which can return an error code if required value is too large for current system (in 32-bits mode). + In a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one, + up to the moment there is not enough room left in the buffer to guarantee decoding another full block, + which maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`. + At which point, decoding can resume from the beginning of the buffer. + Note that already decoded data stored in the buffer should be flushed before being overwritten. + + There are alternatives possible, for example using two or more buffers of size `windowSize` each, though they consume more memory. + + Finally, if you control the compression process, you can also ignore all buffer size rules, + as long as the encoder and decoder progress in "lock-step", + aka use exactly the same buffer sizes, break contiguity at the same place, etc. + + Once buffers are setup, start decompression, with ZSTD_decompressBegin(). + If decompression requires a dictionary, use ZSTD_decompressBegin_usingDict() or ZSTD_decompressBegin_usingDDict(). + + Then use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively. + ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue(). + ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail. + + result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity). + It can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item. + It can also be an error code, which can be tested with ZSTD_isError(). + + A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero. + Context can then be reset to start a new decompression. + + Note : it's possible to know if next input to present is a header or a block, using ZSTD_nextInputType(). + This information is not required to properly decode a frame. + + == Special case : skippable frames == + + Skippable frames allow integration of user-defined data into a flow of concatenated frames. + Skippable frames will be ignored (skipped) by decompressor. + The format of skippable frames is as follows : + a) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F + b) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits + c) Frame Content - any content (User Data) of length equal to Frame Size + For skippable frames ZSTD_getFrameHeader() returns zfhPtr->frameType==ZSTD_skippableFrame. + For skippable frames ZSTD_decompressContinue() always returns 0 : it only skips the content. +*/ + +/*===== Buffer-less streaming decompression functions =====*/ + +ZSTDLIB_STATIC_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */ + +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); + +ZSTDLIB_STATIC_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + +/* misc */ +ZSTD_DEPRECATED("This function will likely be removed in the next minor release. It is misleading and has very limited utility.") +ZSTDLIB_STATIC_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); +typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; +ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); + + + + +/* ========================================= */ +/** Block level API (DEPRECATED) */ +/* ========================================= */ + +/*! + + This API is deprecated in favor of the regular compression API. + You can get the frame header down to 2 bytes by setting: + - ZSTD_c_format = ZSTD_f_zstd1_magicless + - ZSTD_c_contentSizeFlag = 0 + - ZSTD_c_checksumFlag = 0 + - ZSTD_c_dictIDFlag = 0 + + This API is not as well tested as our normal API, so we recommend not using it. + We will be removing it in a future version. If the normal API doesn't provide + the functionality you need, please open a GitHub issue. + + Block functions produce and decode raw zstd blocks, without frame metadata. + Frame metadata cost is typically ~12 bytes, which can be non-negligible for very small blocks (< 100 bytes). + But users will have to take in charge needed metadata to regenerate data, such as compressed and content sizes. + + A few rules to respect : + - Compressing and decompressing require a context structure + + Use ZSTD_createCCtx() and ZSTD_createDCtx() + - It is necessary to init context before starting + + compression : any ZSTD_compressBegin*() variant, including with dictionary + + decompression : any ZSTD_decompressBegin*() variant, including with dictionary + - Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB + + If input is larger than a block size, it's necessary to split input data into multiple blocks + + For inputs larger than a single block, consider using regular ZSTD_compress() instead. + Frame metadata is not that costly, and quickly becomes negligible as source size grows larger than a block. + - When a block is considered not compressible enough, ZSTD_compressBlock() result will be 0 (zero) ! + ===> In which case, nothing is produced into `dst` ! + + User __must__ test for such outcome and deal directly with uncompressed data + + A block cannot be declared incompressible if ZSTD_compressBlock() return value was != 0. + Doing so would mess up with statistics history, leading to potential data corruption. + + ZSTD_decompressBlock() _doesn't accept uncompressed data as input_ !! + + In case of multiple successive blocks, should some of them be uncompressed, + decoder must be informed of their existence in order to follow proper history. + Use ZSTD_insertBlock() for such a case. +*/ + +/*===== Raw zstd block functions =====*/ +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_getBlockSize (const ZSTD_CCtx* cctx); +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */ + +#endif /* ZSTD_H_ZSTD_STATIC_LINKING_ONLY */ + +#if defined (__cplusplus) +} +#endif diff --git a/ktx/external/basisu/zstd/zstddeclib.c b/ktx/external/basisu/zstd/zstddeclib.c new file mode 100644 index 0000000..49d9ed6 --- /dev/null +++ b/ktx/external/basisu/zstd/zstddeclib.c @@ -0,0 +1,21796 @@ +/** + * \file zstddeclib.c + * Single-file Zstandard decompressor. + * + * Generate using: + * \code + * python combine.py -r ../../lib -x legacy/zstd_legacy.h -o zstddeclib.c zstddeclib-in.c + * \endcode + */ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ +/* + * Settings to bake for the standalone decompressor. + * + * Note: It's important that none of these affects 'zstd.h' (only the + * implementation files we're amalgamating). + * + * Note: MEM_MODULE stops xxhash redefining BYTE, U16, etc., which are also + * defined in mem.h (breaking C99 compatibility). + * + * Note: the undefs for xxHash allow Zstd's implementation to coincide with + * standalone xxHash usage (with global defines). + * + * Note: if you enable ZSTD_LEGACY_SUPPORT the combine.py script will need + * re-running without the "-x legacy/zstd_legacy.h" option (it excludes the + * legacy support at the source level). + */ +#define DEBUGLEVEL 0 +#define MEM_MODULE +#undef XXH_NAMESPACE +#define XXH_NAMESPACE ZSTD_ +#undef XXH_PRIVATE_API +#define XXH_PRIVATE_API +#undef XXH_INLINE_ALL +#define XXH_INLINE_ALL +#define ZSTD_LEGACY_SUPPORT 0 +#define ZSTD_STRIP_ERROR_STRINGS +#define ZSTD_TRACE 0 +/* TODO: Can't amalgamate ASM function */ +#define ZSTD_DISABLE_ASM 1 + +/* Include zstd_deps.h first with all the options we need enabled. */ +#define ZSTD_DEPS_NEED_MALLOC +/**** start inlining common/zstd_deps.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* This file provides common libc dependencies that zstd requires. + * The purpose is to allow replacing this file with a custom implementation + * to compile zstd without libc support. + */ + +/* Need: + * NULL + * INT_MAX + * UINT_MAX + * ZSTD_memcpy() + * ZSTD_memset() + * ZSTD_memmove() + */ +#ifndef ZSTD_DEPS_COMMON +#define ZSTD_DEPS_COMMON + +#include +#include +#include + +#if defined(__GNUC__) && __GNUC__ >= 4 +# define ZSTD_memcpy(d,s,l) __builtin_memcpy((d),(s),(l)) +# define ZSTD_memmove(d,s,l) __builtin_memmove((d),(s),(l)) +# define ZSTD_memset(p,v,l) __builtin_memset((p),(v),(l)) +#else +# define ZSTD_memcpy(d,s,l) memcpy((d),(s),(l)) +# define ZSTD_memmove(d,s,l) memmove((d),(s),(l)) +# define ZSTD_memset(p,v,l) memset((p),(v),(l)) +#endif + +#endif /* ZSTD_DEPS_COMMON */ + +/* Need: + * ZSTD_malloc() + * ZSTD_free() + * ZSTD_calloc() + */ +#ifdef ZSTD_DEPS_NEED_MALLOC +#ifndef ZSTD_DEPS_MALLOC +#define ZSTD_DEPS_MALLOC + +#include + +#define ZSTD_malloc(s) malloc(s) +#define ZSTD_calloc(n,s) calloc((n), (s)) +#define ZSTD_free(p) free((p)) + +#endif /* ZSTD_DEPS_MALLOC */ +#endif /* ZSTD_DEPS_NEED_MALLOC */ + +/* + * Provides 64-bit math support. + * Need: + * U64 ZSTD_div64(U64 dividend, U32 divisor) + */ +#ifdef ZSTD_DEPS_NEED_MATH64 +#ifndef ZSTD_DEPS_MATH64 +#define ZSTD_DEPS_MATH64 + +#define ZSTD_div64(dividend, divisor) ((dividend) / (divisor)) + +#endif /* ZSTD_DEPS_MATH64 */ +#endif /* ZSTD_DEPS_NEED_MATH64 */ + +/* Need: + * assert() + */ +#ifdef ZSTD_DEPS_NEED_ASSERT +#ifndef ZSTD_DEPS_ASSERT +#define ZSTD_DEPS_ASSERT + +#include + +#endif /* ZSTD_DEPS_ASSERT */ +#endif /* ZSTD_DEPS_NEED_ASSERT */ + +/* Need: + * ZSTD_DEBUG_PRINT() + */ +#ifdef ZSTD_DEPS_NEED_IO +#ifndef ZSTD_DEPS_IO +#define ZSTD_DEPS_IO + +#include +#define ZSTD_DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__) + +#endif /* ZSTD_DEPS_IO */ +#endif /* ZSTD_DEPS_NEED_IO */ + +/* Only requested when is known to be present. + * Need: + * intptr_t + */ +#ifdef ZSTD_DEPS_NEED_STDINT +#ifndef ZSTD_DEPS_STDINT +#define ZSTD_DEPS_STDINT + +#include + +#endif /* ZSTD_DEPS_STDINT */ +#endif /* ZSTD_DEPS_NEED_STDINT */ +/**** ended inlining common/zstd_deps.h ****/ + +/**** start inlining common/debug.c ****/ +/* ****************************************************************** + * debug + * Part of FSE library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + + +/* + * This module only hosts one global variable + * which can be used to dynamically influence the verbosity of traces, + * such as DEBUGLOG and RAWLOG + */ + +/**** start inlining debug.h ****/ +/* ****************************************************************** + * debug + * Part of FSE library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + + +/* + * The purpose of this header is to enable debug functions. + * They regroup assert(), DEBUGLOG() and RAWLOG() for run-time, + * and DEBUG_STATIC_ASSERT() for compile-time. + * + * By default, DEBUGLEVEL==0, which means run-time debug is disabled. + * + * Level 1 enables assert() only. + * Starting level 2, traces can be generated and pushed to stderr. + * The higher the level, the more verbose the traces. + * + * It's possible to dynamically adjust level using variable g_debug_level, + * which is only declared if DEBUGLEVEL>=2, + * and is a global variable, not multi-thread protected (use with care) + */ + +#ifndef DEBUG_H_12987983217 +#define DEBUG_H_12987983217 + +#if defined (__cplusplus) +extern "C" { +#endif + + +/* static assert is triggered at compile time, leaving no runtime artefact. + * static assert only works with compile-time constants. + * Also, this variant can only be used inside a function. */ +#define DEBUG_STATIC_ASSERT(c) (void)sizeof(char[(c) ? 1 : -1]) + + +/* DEBUGLEVEL is expected to be defined externally, + * typically through compiler command line. + * Value must be a number. */ +#ifndef DEBUGLEVEL +# define DEBUGLEVEL 0 +#endif + + +/* recommended values for DEBUGLEVEL : + * 0 : release mode, no debug, all run-time checks disabled + * 1 : enables assert() only, no display + * 2 : reserved, for currently active debug path + * 3 : events once per object lifetime (CCtx, CDict, etc.) + * 4 : events once per frame + * 5 : events once per block + * 6 : events once per sequence (verbose) + * 7+: events at every position (*very* verbose) + * + * It's generally inconvenient to output traces > 5. + * In which case, it's possible to selectively trigger high verbosity levels + * by modifying g_debug_level. + */ + +#if (DEBUGLEVEL>=1) +# define ZSTD_DEPS_NEED_ASSERT +/**** skipping file: zstd_deps.h ****/ +#else +# ifndef assert /* assert may be already defined, due to prior #include */ +# define assert(condition) ((void)0) /* disable assert (default) */ +# endif +#endif + +#if (DEBUGLEVEL>=2) +# define ZSTD_DEPS_NEED_IO +/**** skipping file: zstd_deps.h ****/ +extern int g_debuglevel; /* the variable is only declared, + it actually lives in debug.c, + and is shared by the whole process. + It's not thread-safe. + It's useful when enabling very verbose levels + on selective conditions (such as position in src) */ + +# define RAWLOG(l, ...) { \ + if (l<=g_debuglevel) { \ + ZSTD_DEBUG_PRINT(__VA_ARGS__); \ + } } +# define DEBUGLOG(l, ...) { \ + if (l<=g_debuglevel) { \ + ZSTD_DEBUG_PRINT(__FILE__ ": " __VA_ARGS__); \ + ZSTD_DEBUG_PRINT(" \n"); \ + } } +#else +# define RAWLOG(l, ...) {} /* disabled */ +# define DEBUGLOG(l, ...) {} /* disabled */ +#endif + + +#if defined (__cplusplus) +} +#endif + +#endif /* DEBUG_H_12987983217 */ +/**** ended inlining debug.h ****/ + +int g_debuglevel = DEBUGLEVEL; +/**** ended inlining common/debug.c ****/ +/**** start inlining common/entropy_common.c ****/ +/* ****************************************************************** + * Common functions of New Generation Entropy library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy + * - Public forum : https://groups.google.com/forum/#!forum/lz4c + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +/* ************************************* +* Dependencies +***************************************/ +/**** start inlining mem.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef MEM_H_MODULE +#define MEM_H_MODULE + +#if defined (__cplusplus) +extern "C" { +#endif + +/*-**************************************** +* Dependencies +******************************************/ +#include /* size_t, ptrdiff_t */ +/**** start inlining compiler.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_COMPILER_H +#define ZSTD_COMPILER_H + +/**** start inlining portability_macros.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_PORTABILITY_MACROS_H +#define ZSTD_PORTABILITY_MACROS_H + +/** + * This header file contains macro definitions to support portability. + * This header is shared between C and ASM code, so it MUST only + * contain macro definitions. It MUST not contain any C code. + * + * This header ONLY defines macros to detect platforms/feature support. + * + */ + + +/* compat. with non-clang compilers */ +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif + +/* compat. with non-clang compilers */ +#ifndef __has_builtin +# define __has_builtin(x) 0 +#endif + +/* compat. with non-clang compilers */ +#ifndef __has_feature +# define __has_feature(x) 0 +#endif + +/* detects whether we are being compiled under msan */ +#ifndef ZSTD_MEMORY_SANITIZER +# if __has_feature(memory_sanitizer) +# define ZSTD_MEMORY_SANITIZER 1 +# else +# define ZSTD_MEMORY_SANITIZER 0 +# endif +#endif + +/* detects whether we are being compiled under asan */ +#ifndef ZSTD_ADDRESS_SANITIZER +# if __has_feature(address_sanitizer) +# define ZSTD_ADDRESS_SANITIZER 1 +# elif defined(__SANITIZE_ADDRESS__) +# define ZSTD_ADDRESS_SANITIZER 1 +# else +# define ZSTD_ADDRESS_SANITIZER 0 +# endif +#endif + +/* detects whether we are being compiled under dfsan */ +#ifndef ZSTD_DATAFLOW_SANITIZER +# if __has_feature(dataflow_sanitizer) +# define ZSTD_DATAFLOW_SANITIZER 1 +# else +# define ZSTD_DATAFLOW_SANITIZER 0 +# endif +#endif + +/* Mark the internal assembly functions as hidden */ +#ifdef __ELF__ +# define ZSTD_HIDE_ASM_FUNCTION(func) .hidden func +#else +# define ZSTD_HIDE_ASM_FUNCTION(func) +#endif + +/* Enable runtime BMI2 dispatch based on the CPU. + * Enabled for clang & gcc >=4.8 on x86 when BMI2 isn't enabled by default. + */ +#ifndef DYNAMIC_BMI2 + #if ((defined(__clang__) && __has_attribute(__target__)) \ + || (defined(__GNUC__) \ + && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \ + && (defined(__x86_64__) || defined(_M_X64)) \ + && !defined(__BMI2__) + # define DYNAMIC_BMI2 1 + #else + # define DYNAMIC_BMI2 0 + #endif +#endif + +/** + * Only enable assembly for GNUC compatible compilers, + * because other platforms may not support GAS assembly syntax. + * + * Only enable assembly for Linux / MacOS, other platforms may + * work, but they haven't been tested. This could likely be + * extended to BSD systems. + * + * Disable assembly when MSAN is enabled, because MSAN requires + * 100% of code to be instrumented to work. + */ +#if defined(__GNUC__) +# if defined(__linux__) || defined(__linux) || defined(__APPLE__) +# if ZSTD_MEMORY_SANITIZER +# define ZSTD_ASM_SUPPORTED 0 +# elif ZSTD_DATAFLOW_SANITIZER +# define ZSTD_ASM_SUPPORTED 0 +# else +# define ZSTD_ASM_SUPPORTED 1 +# endif +# else +# define ZSTD_ASM_SUPPORTED 0 +# endif +#else +# define ZSTD_ASM_SUPPORTED 0 +#endif + +/** + * Determines whether we should enable assembly for x86-64 + * with BMI2. + * + * Enable if all of the following conditions hold: + * - ASM hasn't been explicitly disabled by defining ZSTD_DISABLE_ASM + * - Assembly is supported + * - We are compiling for x86-64 and either: + * - DYNAMIC_BMI2 is enabled + * - BMI2 is supported at compile time + */ +#if !defined(ZSTD_DISABLE_ASM) && \ + ZSTD_ASM_SUPPORTED && \ + defined(__x86_64__) && \ + (DYNAMIC_BMI2 || defined(__BMI2__)) +# define ZSTD_ENABLE_ASM_X86_64_BMI2 1 +#else +# define ZSTD_ENABLE_ASM_X86_64_BMI2 0 +#endif + +/* + * For x86 ELF targets, add .note.gnu.property section for Intel CET in + * assembly sources when CET is enabled. + * + * Additionally, any function that may be called indirectly must begin + * with ZSTD_CET_ENDBRANCH. + */ +#if defined(__ELF__) && (defined(__x86_64__) || defined(__i386__)) \ + && defined(__has_include) +# if __has_include() +# include +# define ZSTD_CET_ENDBRANCH _CET_ENDBR +# endif +#endif + +#ifndef ZSTD_CET_ENDBRANCH +# define ZSTD_CET_ENDBRANCH +#endif + +#endif /* ZSTD_PORTABILITY_MACROS_H */ +/**** ended inlining portability_macros.h ****/ + +/*-******************************************************* +* Compiler specifics +*********************************************************/ +/* force inlining */ + +#if !defined(ZSTD_NO_INLINE) +#if (defined(__GNUC__) && !defined(__STRICT_ANSI__)) || defined(__cplusplus) || defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ +# define INLINE_KEYWORD inline +#else +# define INLINE_KEYWORD +#endif + +#if defined(__GNUC__) || defined(__ICCARM__) +# define FORCE_INLINE_ATTR __attribute__((always_inline)) +#elif defined(_MSC_VER) +# define FORCE_INLINE_ATTR __forceinline +#else +# define FORCE_INLINE_ATTR +#endif + +#else + +#define INLINE_KEYWORD +#define FORCE_INLINE_ATTR + +#endif + +/** + On MSVC qsort requires that functions passed into it use the __cdecl calling conversion(CC). + This explicitly marks such functions as __cdecl so that the code will still compile + if a CC other than __cdecl has been made the default. +*/ +#if defined(_MSC_VER) +# define WIN_CDECL __cdecl +#else +# define WIN_CDECL +#endif + +/** + * FORCE_INLINE_TEMPLATE is used to define C "templates", which take constant + * parameters. They must be inlined for the compiler to eliminate the constant + * branches. + */ +#define FORCE_INLINE_TEMPLATE static INLINE_KEYWORD FORCE_INLINE_ATTR +/** + * HINT_INLINE is used to help the compiler generate better code. It is *not* + * used for "templates", so it can be tweaked based on the compilers + * performance. + * + * gcc-4.8 and gcc-4.9 have been shown to benefit from leaving off the + * always_inline attribute. + * + * clang up to 5.0.0 (trunk) benefit tremendously from the always_inline + * attribute. + */ +#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 8 && __GNUC__ < 5 +# define HINT_INLINE static INLINE_KEYWORD +#else +# define HINT_INLINE static INLINE_KEYWORD FORCE_INLINE_ATTR +#endif + +/* UNUSED_ATTR tells the compiler it is okay if the function is unused. */ +#if defined(__GNUC__) +# define UNUSED_ATTR __attribute__((unused)) +#else +# define UNUSED_ATTR +#endif + +/* force no inlining */ +#ifdef _MSC_VER +# define FORCE_NOINLINE static __declspec(noinline) +#else +# if defined(__GNUC__) || defined(__ICCARM__) +# define FORCE_NOINLINE static __attribute__((__noinline__)) +# else +# define FORCE_NOINLINE static +# endif +#endif + + +/* target attribute */ +#if defined(__GNUC__) || defined(__ICCARM__) +# define TARGET_ATTRIBUTE(target) __attribute__((__target__(target))) +#else +# define TARGET_ATTRIBUTE(target) +#endif + +/* Target attribute for BMI2 dynamic dispatch. + * Enable lzcnt, bmi, and bmi2. + * We test for bmi1 & bmi2. lzcnt is included in bmi1. + */ +#define BMI2_TARGET_ATTRIBUTE TARGET_ATTRIBUTE("lzcnt,bmi,bmi2") + +/* prefetch + * can be disabled, by declaring NO_PREFETCH build macro */ +#if defined(NO_PREFETCH) +# define PREFETCH_L1(ptr) (void)(ptr) /* disabled */ +# define PREFETCH_L2(ptr) (void)(ptr) /* disabled */ +#else +# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) /* _mm_prefetch() is not defined outside of x86/x64 */ +# include /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ +# define PREFETCH_L1(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) +# define PREFETCH_L2(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T1) +# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) ) +# define PREFETCH_L1(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */) +# define PREFETCH_L2(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 2 /* locality */) +# elif defined(__aarch64__) +# define PREFETCH_L1(ptr) __asm__ __volatile__("prfm pldl1keep, %0" ::"Q"(*(ptr))) +# define PREFETCH_L2(ptr) __asm__ __volatile__("prfm pldl2keep, %0" ::"Q"(*(ptr))) +# else +# define PREFETCH_L1(ptr) (void)(ptr) /* disabled */ +# define PREFETCH_L2(ptr) (void)(ptr) /* disabled */ +# endif +#endif /* NO_PREFETCH */ + +#define CACHELINE_SIZE 64 + +#define PREFETCH_AREA(p, s) { \ + const char* const _ptr = (const char*)(p); \ + size_t const _size = (size_t)(s); \ + size_t _pos; \ + for (_pos=0; _pos<_size; _pos+=CACHELINE_SIZE) { \ + PREFETCH_L2(_ptr + _pos); \ + } \ +} + +/* vectorization + * older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax, + * and some compilers, like Intel ICC and MCST LCC, do not support it at all. */ +#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) && !defined(__LCC__) +# if (__GNUC__ == 4 && __GNUC_MINOR__ > 3) || (__GNUC__ >= 5) +# define DONT_VECTORIZE __attribute__((optimize("no-tree-vectorize"))) +# else +# define DONT_VECTORIZE _Pragma("GCC optimize(\"no-tree-vectorize\")") +# endif +#else +# define DONT_VECTORIZE +#endif + +/* Tell the compiler that a branch is likely or unlikely. + * Only use these macros if it causes the compiler to generate better code. + * If you can remove a LIKELY/UNLIKELY annotation without speed changes in gcc + * and clang, please do. + */ +#if defined(__GNUC__) +#define LIKELY(x) (__builtin_expect((x), 1)) +#define UNLIKELY(x) (__builtin_expect((x), 0)) +#else +#define LIKELY(x) (x) +#define UNLIKELY(x) (x) +#endif + +#if __has_builtin(__builtin_unreachable) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))) +# define ZSTD_UNREACHABLE { assert(0), __builtin_unreachable(); } +#else +# define ZSTD_UNREACHABLE { assert(0); } +#endif + +/* disable warnings */ +#ifdef _MSC_VER /* Visual Studio */ +# include /* For Visual 2005 */ +# pragma warning(disable : 4100) /* disable: C4100: unreferenced formal parameter */ +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +# pragma warning(disable : 4204) /* disable: C4204: non-constant aggregate initializer */ +# pragma warning(disable : 4214) /* disable: C4214: non-int bitfields */ +# pragma warning(disable : 4324) /* disable: C4324: padded structure */ +#endif + +/*Like DYNAMIC_BMI2 but for compile time determination of BMI2 support*/ +#ifndef STATIC_BMI2 +# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) +# ifdef __AVX2__ //MSVC does not have a BMI2 specific flag, but every CPU that supports AVX2 also supports BMI2 +# define STATIC_BMI2 1 +# endif +# elif defined(__BMI2__) && defined(__x86_64__) && defined(__GNUC__) +# define STATIC_BMI2 1 +# endif +#endif + +#ifndef STATIC_BMI2 + #define STATIC_BMI2 0 +#endif + +/* compile time determination of SIMD support */ +#if !defined(ZSTD_NO_INTRINSICS) +# if defined(__SSE2__) || defined(_M_AMD64) || (defined (_M_IX86) && defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) +# define ZSTD_ARCH_X86_SSE2 +# endif +# if defined(__ARM_NEON) || defined(_M_ARM64) +# define ZSTD_ARCH_ARM_NEON +# endif +# +# if defined(ZSTD_ARCH_X86_SSE2) +# include +# elif defined(ZSTD_ARCH_ARM_NEON) +# include +# endif +#endif + +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute) +# define ZSTD_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define ZSTD_HAS_C_ATTRIBUTE(x) 0 +#endif + +/* Only use C++ attributes in C++. Some compilers report support for C++ + * attributes when compiling with C. + */ +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define ZSTD_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define ZSTD_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +/* Define ZSTD_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute. + * - C23: https://en.cppreference.com/w/c/language/attributes/fallthrough + * - CPP17: https://en.cppreference.com/w/cpp/language/attributes/fallthrough + * - Else: __attribute__((__fallthrough__)) + */ +#ifndef ZSTD_FALLTHROUGH +# if ZSTD_HAS_C_ATTRIBUTE(fallthrough) +# define ZSTD_FALLTHROUGH [[fallthrough]] +# elif ZSTD_HAS_CPP_ATTRIBUTE(fallthrough) +# define ZSTD_FALLTHROUGH [[fallthrough]] +# elif __has_attribute(__fallthrough__) +/* Leading semicolon is to satisfy gcc-11 with -pedantic. Without the semicolon + * gcc complains about: a label can only be part of a statement and a declaration is not a statement. + */ +# define ZSTD_FALLTHROUGH ; __attribute__((__fallthrough__)) +# else +# define ZSTD_FALLTHROUGH +# endif +#endif + +/*-************************************************************** +* Alignment check +*****************************************************************/ + +/* this test was initially positioned in mem.h, + * but this file is removed (or replaced) for linux kernel + * so it's now hosted in compiler.h, + * which remains valid for both user & kernel spaces. + */ + +#ifndef ZSTD_ALIGNOF +# if defined(__GNUC__) || defined(_MSC_VER) +/* covers gcc, clang & MSVC */ +/* note : this section must come first, before C11, + * due to a limitation in the kernel source generator */ +# define ZSTD_ALIGNOF(T) __alignof(T) + +# elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +/* C11 support */ +# include +# define ZSTD_ALIGNOF(T) alignof(T) + +# else +/* No known support for alignof() - imperfect backup */ +# define ZSTD_ALIGNOF(T) (sizeof(void*) < sizeof(T) ? sizeof(void*) : sizeof(T)) + +# endif +#endif /* ZSTD_ALIGNOF */ + +/*-************************************************************** +* Sanitizer +*****************************************************************/ + +/* Issue #3240 reports an ASAN failure on an llvm-mingw build. Out of an + * abundance of caution, disable our custom poisoning on mingw. */ +#ifdef __MINGW32__ +#ifndef ZSTD_ASAN_DONT_POISON_WORKSPACE +#define ZSTD_ASAN_DONT_POISON_WORKSPACE 1 +#endif +#ifndef ZSTD_MSAN_DONT_POISON_WORKSPACE +#define ZSTD_MSAN_DONT_POISON_WORKSPACE 1 +#endif +#endif + +#if ZSTD_MEMORY_SANITIZER && !defined(ZSTD_MSAN_DONT_POISON_WORKSPACE) +/* Not all platforms that support msan provide sanitizers/msan_interface.h. + * We therefore declare the functions we need ourselves, rather than trying to + * include the header file... */ +#include /* size_t */ +#define ZSTD_DEPS_NEED_STDINT +/**** skipping file: zstd_deps.h ****/ + +/* Make memory region fully initialized (without changing its contents). */ +void __msan_unpoison(const volatile void *a, size_t size); + +/* Make memory region fully uninitialized (without changing its contents). + This is a legacy interface that does not update origin information. Use + __msan_allocated_memory() instead. */ +void __msan_poison(const volatile void *a, size_t size); + +/* Returns the offset of the first (at least partially) poisoned byte in the + memory range, or -1 if the whole range is good. */ +intptr_t __msan_test_shadow(const volatile void *x, size_t size); + +/* Print shadow and origin for the memory range to stderr in a human-readable + format. */ +void __msan_print_shadow(const volatile void *x, size_t size); +#endif + +#if ZSTD_ADDRESS_SANITIZER && !defined(ZSTD_ASAN_DONT_POISON_WORKSPACE) +/* Not all platforms that support asan provide sanitizers/asan_interface.h. + * We therefore declare the functions we need ourselves, rather than trying to + * include the header file... */ +#include /* size_t */ + +/** + * Marks a memory region ([addr, addr+size)) as unaddressable. + * + * This memory must be previously allocated by your program. Instrumented + * code is forbidden from accessing addresses in this region until it is + * unpoisoned. This function is not guaranteed to poison the entire region - + * it could poison only a subregion of [addr, addr+size) due to ASan + * alignment restrictions. + * + * \note This function is not thread-safe because no two threads can poison or + * unpoison memory in the same memory region simultaneously. + * + * \param addr Start of memory region. + * \param size Size of memory region. */ +void __asan_poison_memory_region(void const volatile *addr, size_t size); + +/** + * Marks a memory region ([addr, addr+size)) as addressable. + * + * This memory must be previously allocated by your program. Accessing + * addresses in this region is allowed until this region is poisoned again. + * This function could unpoison a super-region of [addr, addr+size) due + * to ASan alignment restrictions. + * + * \note This function is not thread-safe because no two threads can + * poison or unpoison memory in the same memory region simultaneously. + * + * \param addr Start of memory region. + * \param size Size of memory region. */ +void __asan_unpoison_memory_region(void const volatile *addr, size_t size); +#endif + +#endif /* ZSTD_COMPILER_H */ +/**** ended inlining compiler.h ****/ +/**** skipping file: debug.h ****/ +/**** skipping file: zstd_deps.h ****/ + + +/*-**************************************** +* Compiler specifics +******************************************/ +#if defined(_MSC_VER) /* Visual Studio */ +# include /* _byteswap_ulong */ +# include /* _byteswap_* */ +#endif +#if defined(__GNUC__) +# define MEM_STATIC static __inline __attribute__((unused)) +#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# define MEM_STATIC static inline +#elif defined(_MSC_VER) +# define MEM_STATIC static __inline +#else +# define MEM_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */ +#endif + +/*-************************************************************** +* Basic Types +*****************************************************************/ +#if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# if defined(_AIX) +# include +# else +# include /* intptr_t */ +# endif + typedef uint8_t BYTE; + typedef uint8_t U8; + typedef int8_t S8; + typedef uint16_t U16; + typedef int16_t S16; + typedef uint32_t U32; + typedef int32_t S32; + typedef uint64_t U64; + typedef int64_t S64; +#else +# include +#if CHAR_BIT != 8 +# error "this implementation requires char to be exactly 8-bit type" +#endif + typedef unsigned char BYTE; + typedef unsigned char U8; + typedef signed char S8; +#if USHRT_MAX != 65535 +# error "this implementation requires short to be exactly 16-bit type" +#endif + typedef unsigned short U16; + typedef signed short S16; +#if UINT_MAX != 4294967295 +# error "this implementation requires int to be exactly 32-bit type" +#endif + typedef unsigned int U32; + typedef signed int S32; +/* note : there are no limits defined for long long type in C90. + * limits exist in C99, however, in such case, is preferred */ + typedef unsigned long long U64; + typedef signed long long S64; +#endif + + +/*-************************************************************** +* Memory I/O API +*****************************************************************/ +/*=== Static platform detection ===*/ +MEM_STATIC unsigned MEM_32bits(void); +MEM_STATIC unsigned MEM_64bits(void); +MEM_STATIC unsigned MEM_isLittleEndian(void); + +/*=== Native unaligned read/write ===*/ +MEM_STATIC U16 MEM_read16(const void* memPtr); +MEM_STATIC U32 MEM_read32(const void* memPtr); +MEM_STATIC U64 MEM_read64(const void* memPtr); +MEM_STATIC size_t MEM_readST(const void* memPtr); + +MEM_STATIC void MEM_write16(void* memPtr, U16 value); +MEM_STATIC void MEM_write32(void* memPtr, U32 value); +MEM_STATIC void MEM_write64(void* memPtr, U64 value); + +/*=== Little endian unaligned read/write ===*/ +MEM_STATIC U16 MEM_readLE16(const void* memPtr); +MEM_STATIC U32 MEM_readLE24(const void* memPtr); +MEM_STATIC U32 MEM_readLE32(const void* memPtr); +MEM_STATIC U64 MEM_readLE64(const void* memPtr); +MEM_STATIC size_t MEM_readLEST(const void* memPtr); + +MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val); +MEM_STATIC void MEM_writeLE24(void* memPtr, U32 val); +MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32); +MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64); +MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val); + +/*=== Big endian unaligned read/write ===*/ +MEM_STATIC U32 MEM_readBE32(const void* memPtr); +MEM_STATIC U64 MEM_readBE64(const void* memPtr); +MEM_STATIC size_t MEM_readBEST(const void* memPtr); + +MEM_STATIC void MEM_writeBE32(void* memPtr, U32 val32); +MEM_STATIC void MEM_writeBE64(void* memPtr, U64 val64); +MEM_STATIC void MEM_writeBEST(void* memPtr, size_t val); + +/*=== Byteswap ===*/ +MEM_STATIC U32 MEM_swap32(U32 in); +MEM_STATIC U64 MEM_swap64(U64 in); +MEM_STATIC size_t MEM_swapST(size_t in); + + +/*-************************************************************** +* Memory I/O Implementation +*****************************************************************/ +/* MEM_FORCE_MEMORY_ACCESS : For accessing unaligned memory: + * Method 0 : always use `memcpy()`. Safe and portable. + * Method 1 : Use compiler extension to set unaligned access. + * Method 2 : direct access. This method is portable but violate C standard. + * It can generate buggy code on targets depending on alignment. + * Default : method 1 if supported, else method 0 + */ +#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ +# ifdef __GNUC__ +# define MEM_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +MEM_STATIC unsigned MEM_32bits(void) { return sizeof(size_t)==4; } +MEM_STATIC unsigned MEM_64bits(void) { return sizeof(size_t)==8; } + +MEM_STATIC unsigned MEM_isLittleEndian(void) +{ +#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) + return 1; +#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) + return 0; +#elif defined(__clang__) && __LITTLE_ENDIAN__ + return 1; +#elif defined(__clang__) && __BIG_ENDIAN__ + return 0; +#elif defined(_MSC_VER) && (_M_AMD64 || _M_IX86) + return 1; +#elif defined(__DMC__) && defined(_M_IX86) + return 1; +#else + const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ + return one.c[0]; +#endif +} + +#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) + +/* violates C standard, by lying on structure alignment. +Only use if no other choice to achieve best performance on target platform */ +MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; } +MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; } +MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; } +MEM_STATIC size_t MEM_readST(const void* memPtr) { return *(const size_t*) memPtr; } + +MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } +MEM_STATIC void MEM_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } +MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(U64*)memPtr = value; } + +#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1) + +typedef __attribute__((aligned(1))) U16 unalign16; +typedef __attribute__((aligned(1))) U32 unalign32; +typedef __attribute__((aligned(1))) U64 unalign64; +typedef __attribute__((aligned(1))) size_t unalignArch; + +MEM_STATIC U16 MEM_read16(const void* ptr) { return *(const unalign16*)ptr; } +MEM_STATIC U32 MEM_read32(const void* ptr) { return *(const unalign32*)ptr; } +MEM_STATIC U64 MEM_read64(const void* ptr) { return *(const unalign64*)ptr; } +MEM_STATIC size_t MEM_readST(const void* ptr) { return *(const unalignArch*)ptr; } + +MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(unalign16*)memPtr = value; } +MEM_STATIC void MEM_write32(void* memPtr, U32 value) { *(unalign32*)memPtr = value; } +MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(unalign64*)memPtr = value; } + +#else + +/* default method, safe and standard. + can sometimes prove slower */ + +MEM_STATIC U16 MEM_read16(const void* memPtr) +{ + U16 val; ZSTD_memcpy(&val, memPtr, sizeof(val)); return val; +} + +MEM_STATIC U32 MEM_read32(const void* memPtr) +{ + U32 val; ZSTD_memcpy(&val, memPtr, sizeof(val)); return val; +} + +MEM_STATIC U64 MEM_read64(const void* memPtr) +{ + U64 val; ZSTD_memcpy(&val, memPtr, sizeof(val)); return val; +} + +MEM_STATIC size_t MEM_readST(const void* memPtr) +{ + size_t val; ZSTD_memcpy(&val, memPtr, sizeof(val)); return val; +} + +MEM_STATIC void MEM_write16(void* memPtr, U16 value) +{ + ZSTD_memcpy(memPtr, &value, sizeof(value)); +} + +MEM_STATIC void MEM_write32(void* memPtr, U32 value) +{ + ZSTD_memcpy(memPtr, &value, sizeof(value)); +} + +MEM_STATIC void MEM_write64(void* memPtr, U64 value) +{ + ZSTD_memcpy(memPtr, &value, sizeof(value)); +} + +#endif /* MEM_FORCE_MEMORY_ACCESS */ + +MEM_STATIC U32 MEM_swap32_fallback(U32 in) +{ + return ((in << 24) & 0xff000000 ) | + ((in << 8) & 0x00ff0000 ) | + ((in >> 8) & 0x0000ff00 ) | + ((in >> 24) & 0x000000ff ); +} + +MEM_STATIC U32 MEM_swap32(U32 in) +{ +#if defined(_MSC_VER) /* Visual Studio */ + return _byteswap_ulong(in); +#elif (defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)) \ + || (defined(__clang__) && __has_builtin(__builtin_bswap32)) + return __builtin_bswap32(in); +#else + return MEM_swap32_fallback(in); +#endif +} + +MEM_STATIC U64 MEM_swap64_fallback(U64 in) +{ + return ((in << 56) & 0xff00000000000000ULL) | + ((in << 40) & 0x00ff000000000000ULL) | + ((in << 24) & 0x0000ff0000000000ULL) | + ((in << 8) & 0x000000ff00000000ULL) | + ((in >> 8) & 0x00000000ff000000ULL) | + ((in >> 24) & 0x0000000000ff0000ULL) | + ((in >> 40) & 0x000000000000ff00ULL) | + ((in >> 56) & 0x00000000000000ffULL); +} + +MEM_STATIC U64 MEM_swap64(U64 in) +{ +#if defined(_MSC_VER) /* Visual Studio */ + return _byteswap_uint64(in); +#elif (defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)) \ + || (defined(__clang__) && __has_builtin(__builtin_bswap64)) + return __builtin_bswap64(in); +#else + return MEM_swap64_fallback(in); +#endif +} + +MEM_STATIC size_t MEM_swapST(size_t in) +{ + if (MEM_32bits()) + return (size_t)MEM_swap32((U32)in); + else + return (size_t)MEM_swap64((U64)in); +} + +/*=== Little endian r/w ===*/ + +MEM_STATIC U16 MEM_readLE16(const void* memPtr) +{ + if (MEM_isLittleEndian()) + return MEM_read16(memPtr); + else { + const BYTE* p = (const BYTE*)memPtr; + return (U16)(p[0] + (p[1]<<8)); + } +} + +MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val) +{ + if (MEM_isLittleEndian()) { + MEM_write16(memPtr, val); + } else { + BYTE* p = (BYTE*)memPtr; + p[0] = (BYTE)val; + p[1] = (BYTE)(val>>8); + } +} + +MEM_STATIC U32 MEM_readLE24(const void* memPtr) +{ + return (U32)MEM_readLE16(memPtr) + ((U32)(((const BYTE*)memPtr)[2]) << 16); +} + +MEM_STATIC void MEM_writeLE24(void* memPtr, U32 val) +{ + MEM_writeLE16(memPtr, (U16)val); + ((BYTE*)memPtr)[2] = (BYTE)(val>>16); +} + +MEM_STATIC U32 MEM_readLE32(const void* memPtr) +{ + if (MEM_isLittleEndian()) + return MEM_read32(memPtr); + else + return MEM_swap32(MEM_read32(memPtr)); +} + +MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32) +{ + if (MEM_isLittleEndian()) + MEM_write32(memPtr, val32); + else + MEM_write32(memPtr, MEM_swap32(val32)); +} + +MEM_STATIC U64 MEM_readLE64(const void* memPtr) +{ + if (MEM_isLittleEndian()) + return MEM_read64(memPtr); + else + return MEM_swap64(MEM_read64(memPtr)); +} + +MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64) +{ + if (MEM_isLittleEndian()) + MEM_write64(memPtr, val64); + else + MEM_write64(memPtr, MEM_swap64(val64)); +} + +MEM_STATIC size_t MEM_readLEST(const void* memPtr) +{ + if (MEM_32bits()) + return (size_t)MEM_readLE32(memPtr); + else + return (size_t)MEM_readLE64(memPtr); +} + +MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val) +{ + if (MEM_32bits()) + MEM_writeLE32(memPtr, (U32)val); + else + MEM_writeLE64(memPtr, (U64)val); +} + +/*=== Big endian r/w ===*/ + +MEM_STATIC U32 MEM_readBE32(const void* memPtr) +{ + if (MEM_isLittleEndian()) + return MEM_swap32(MEM_read32(memPtr)); + else + return MEM_read32(memPtr); +} + +MEM_STATIC void MEM_writeBE32(void* memPtr, U32 val32) +{ + if (MEM_isLittleEndian()) + MEM_write32(memPtr, MEM_swap32(val32)); + else + MEM_write32(memPtr, val32); +} + +MEM_STATIC U64 MEM_readBE64(const void* memPtr) +{ + if (MEM_isLittleEndian()) + return MEM_swap64(MEM_read64(memPtr)); + else + return MEM_read64(memPtr); +} + +MEM_STATIC void MEM_writeBE64(void* memPtr, U64 val64) +{ + if (MEM_isLittleEndian()) + MEM_write64(memPtr, MEM_swap64(val64)); + else + MEM_write64(memPtr, val64); +} + +MEM_STATIC size_t MEM_readBEST(const void* memPtr) +{ + if (MEM_32bits()) + return (size_t)MEM_readBE32(memPtr); + else + return (size_t)MEM_readBE64(memPtr); +} + +MEM_STATIC void MEM_writeBEST(void* memPtr, size_t val) +{ + if (MEM_32bits()) + MEM_writeBE32(memPtr, (U32)val); + else + MEM_writeBE64(memPtr, (U64)val); +} + +/* code only tested on 32 and 64 bits systems */ +MEM_STATIC void MEM_check(void) { DEBUG_STATIC_ASSERT((sizeof(size_t)==4) || (sizeof(size_t)==8)); } + + +#if defined (__cplusplus) +} +#endif + +#endif /* MEM_H_MODULE */ +/**** ended inlining mem.h ****/ +/**** start inlining error_private.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* Note : this module is expected to remain private, do not expose it */ + +#ifndef ERROR_H_MODULE +#define ERROR_H_MODULE + +#if defined (__cplusplus) +extern "C" { +#endif + + +/* **************************************** +* Dependencies +******************************************/ +/**** start inlining ../zstd_errors.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_ERRORS_H_398273423 +#define ZSTD_ERRORS_H_398273423 + +#if defined (__cplusplus) +extern "C" { +#endif + +/*===== dependency =====*/ +#include /* size_t */ + + +/* ===== ZSTDERRORLIB_API : control library symbols visibility ===== */ +#ifndef ZSTDERRORLIB_VISIBLE + /* Backwards compatibility with old macro name */ +# ifdef ZSTDERRORLIB_VISIBILITY +# define ZSTDERRORLIB_VISIBLE ZSTDERRORLIB_VISIBILITY +# elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDERRORLIB_VISIBLE __attribute__ ((visibility ("default"))) +# else +# define ZSTDERRORLIB_VISIBLE +# endif +#endif + +#ifndef ZSTDERRORLIB_HIDDEN +# if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDERRORLIB_HIDDEN __attribute__ ((visibility ("hidden"))) +# else +# define ZSTDERRORLIB_HIDDEN +# endif +#endif + +#if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDERRORLIB_API __declspec(dllexport) ZSTDERRORLIB_VISIBLE +#elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDERRORLIB_API __declspec(dllimport) ZSTDERRORLIB_VISIBLE /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define ZSTDERRORLIB_API ZSTDERRORLIB_VISIBLE +#endif + +/*-********************************************* + * Error codes list + *-********************************************* + * Error codes _values_ are pinned down since v1.3.1 only. + * Therefore, don't rely on values if you may link to any version < v1.3.1. + * + * Only values < 100 are considered stable. + * + * note 1 : this API shall be used with static linking only. + * dynamic linking is not yet officially supported. + * note 2 : Prefer relying on the enum than on its value whenever possible + * This is the only supported way to use the error list < v1.3.1 + * note 3 : ZSTD_isError() is always correct, whatever the library version. + **********************************************/ +typedef enum { + ZSTD_error_no_error = 0, + ZSTD_error_GENERIC = 1, + ZSTD_error_prefix_unknown = 10, + ZSTD_error_version_unsupported = 12, + ZSTD_error_frameParameter_unsupported = 14, + ZSTD_error_frameParameter_windowTooLarge = 16, + ZSTD_error_corruption_detected = 20, + ZSTD_error_checksum_wrong = 22, + ZSTD_error_literals_headerWrong = 24, + ZSTD_error_dictionary_corrupted = 30, + ZSTD_error_dictionary_wrong = 32, + ZSTD_error_dictionaryCreation_failed = 34, + ZSTD_error_parameter_unsupported = 40, + ZSTD_error_parameter_combination_unsupported = 41, + ZSTD_error_parameter_outOfBound = 42, + ZSTD_error_tableLog_tooLarge = 44, + ZSTD_error_maxSymbolValue_tooLarge = 46, + ZSTD_error_maxSymbolValue_tooSmall = 48, + ZSTD_error_stabilityCondition_notRespected = 50, + ZSTD_error_stage_wrong = 60, + ZSTD_error_init_missing = 62, + ZSTD_error_memory_allocation = 64, + ZSTD_error_workSpace_tooSmall= 66, + ZSTD_error_dstSize_tooSmall = 70, + ZSTD_error_srcSize_wrong = 72, + ZSTD_error_dstBuffer_null = 74, + ZSTD_error_noForwardProgress_destFull = 80, + ZSTD_error_noForwardProgress_inputEmpty = 82, + /* following error codes are __NOT STABLE__, they can be removed or changed in future versions */ + ZSTD_error_frameIndex_tooLarge = 100, + ZSTD_error_seekableIO = 102, + ZSTD_error_dstBuffer_wrong = 104, + ZSTD_error_srcBuffer_wrong = 105, + ZSTD_error_sequenceProducer_failed = 106, + ZSTD_error_externalSequences_invalid = 107, + ZSTD_error_maxCode = 120 /* never EVER use this value directly, it can change in future versions! Use ZSTD_isError() instead */ +} ZSTD_ErrorCode; + +/*! ZSTD_getErrorCode() : + convert a `size_t` function result into a `ZSTD_ErrorCode` enum type, + which can be used to compare with enum list published above */ +ZSTDERRORLIB_API ZSTD_ErrorCode ZSTD_getErrorCode(size_t functionResult); +ZSTDERRORLIB_API const char* ZSTD_getErrorString(ZSTD_ErrorCode code); /**< Same as ZSTD_getErrorName, but using a `ZSTD_ErrorCode` enum argument */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_ERRORS_H_398273423 */ +/**** ended inlining ../zstd_errors.h ****/ +/**** skipping file: compiler.h ****/ +/**** skipping file: debug.h ****/ +/**** skipping file: zstd_deps.h ****/ + + +/* **************************************** +* Compiler-specific +******************************************/ +#if defined(__GNUC__) +# define ERR_STATIC static __attribute__((unused)) +#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# define ERR_STATIC static inline +#elif defined(_MSC_VER) +# define ERR_STATIC static __inline +#else +# define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */ +#endif + + +/*-**************************************** +* Customization (error_public.h) +******************************************/ +typedef ZSTD_ErrorCode ERR_enum; +#define PREFIX(name) ZSTD_error_##name + + +/*-**************************************** +* Error codes handling +******************************************/ +#undef ERROR /* already defined on Visual Studio */ +#define ERROR(name) ZSTD_ERROR(name) +#define ZSTD_ERROR(name) ((size_t)-PREFIX(name)) + +ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); } + +ERR_STATIC ERR_enum ERR_getErrorCode(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); } + +/* check and forward error code */ +#define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return e +#define CHECK_F(f) { CHECK_V_F(_var_err__, f); } + + +/*-**************************************** +* Error Strings +******************************************/ + +const char* ERR_getErrorString(ERR_enum code); /* error_private.c */ + +ERR_STATIC const char* ERR_getErrorName(size_t code) +{ + return ERR_getErrorString(ERR_getErrorCode(code)); +} + +/** + * Ignore: this is an internal helper. + * + * This is a helper function to help force C99-correctness during compilation. + * Under strict compilation modes, variadic macro arguments can't be empty. + * However, variadic function arguments can be. Using a function therefore lets + * us statically check that at least one (string) argument was passed, + * independent of the compilation flags. + */ +static INLINE_KEYWORD UNUSED_ATTR +void _force_has_format_string(const char *format, ...) { + (void)format; +} + +/** + * Ignore: this is an internal helper. + * + * We want to force this function invocation to be syntactically correct, but + * we don't want to force runtime evaluation of its arguments. + */ +#define _FORCE_HAS_FORMAT_STRING(...) \ + if (0) { \ + _force_has_format_string(__VA_ARGS__); \ + } + +#define ERR_QUOTE(str) #str + +/** + * Return the specified error if the condition evaluates to true. + * + * In debug modes, prints additional information. + * In order to do that (particularly, printing the conditional that failed), + * this can't just wrap RETURN_ERROR(). + */ +#define RETURN_ERROR_IF(cond, err, ...) \ + if (cond) { \ + RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \ + __FILE__, __LINE__, ERR_QUOTE(cond), ERR_QUOTE(ERROR(err))); \ + _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ + RAWLOG(3, ": " __VA_ARGS__); \ + RAWLOG(3, "\n"); \ + return ERROR(err); \ + } + +/** + * Unconditionally return the specified error. + * + * In debug modes, prints additional information. + */ +#define RETURN_ERROR(err, ...) \ + do { \ + RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \ + __FILE__, __LINE__, ERR_QUOTE(ERROR(err))); \ + _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ + RAWLOG(3, ": " __VA_ARGS__); \ + RAWLOG(3, "\n"); \ + return ERROR(err); \ + } while(0); + +/** + * If the provided expression evaluates to an error code, returns that error code. + * + * In debug modes, prints additional information. + */ +#define FORWARD_IF_ERROR(err, ...) \ + do { \ + size_t const err_code = (err); \ + if (ERR_isError(err_code)) { \ + RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \ + __FILE__, __LINE__, ERR_QUOTE(err), ERR_getErrorName(err_code)); \ + _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ + RAWLOG(3, ": " __VA_ARGS__); \ + RAWLOG(3, "\n"); \ + return err_code; \ + } \ + } while(0); + +#if defined (__cplusplus) +} +#endif + +#endif /* ERROR_H_MODULE */ +/**** ended inlining error_private.h ****/ +#define FSE_STATIC_LINKING_ONLY /* FSE_MIN_TABLELOG */ +/**** start inlining fse.h ****/ +/* ****************************************************************** + * FSE : Finite State Entropy codec + * Public Prototypes declaration + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef FSE_H +#define FSE_H + + +/*-***************************************** +* Dependencies +******************************************/ +/**** skipping file: zstd_deps.h ****/ + + +/*-***************************************** +* FSE_PUBLIC_API : control library symbols visibility +******************************************/ +#if defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) && defined(__GNUC__) && (__GNUC__ >= 4) +# define FSE_PUBLIC_API __attribute__ ((visibility ("default"))) +#elif defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) /* Visual expected */ +# define FSE_PUBLIC_API __declspec(dllexport) +#elif defined(FSE_DLL_IMPORT) && (FSE_DLL_IMPORT==1) +# define FSE_PUBLIC_API __declspec(dllimport) /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define FSE_PUBLIC_API +#endif + +/*------ Version ------*/ +#define FSE_VERSION_MAJOR 0 +#define FSE_VERSION_MINOR 9 +#define FSE_VERSION_RELEASE 0 + +#define FSE_LIB_VERSION FSE_VERSION_MAJOR.FSE_VERSION_MINOR.FSE_VERSION_RELEASE +#define FSE_QUOTE(str) #str +#define FSE_EXPAND_AND_QUOTE(str) FSE_QUOTE(str) +#define FSE_VERSION_STRING FSE_EXPAND_AND_QUOTE(FSE_LIB_VERSION) + +#define FSE_VERSION_NUMBER (FSE_VERSION_MAJOR *100*100 + FSE_VERSION_MINOR *100 + FSE_VERSION_RELEASE) +FSE_PUBLIC_API unsigned FSE_versionNumber(void); /**< library version number; to be used when checking dll version */ + + +/*-***************************************** +* Tool functions +******************************************/ +FSE_PUBLIC_API size_t FSE_compressBound(size_t size); /* maximum compressed size */ + +/* Error Management */ +FSE_PUBLIC_API unsigned FSE_isError(size_t code); /* tells if a return value is an error code */ +FSE_PUBLIC_API const char* FSE_getErrorName(size_t code); /* provides error code string (useful for debugging) */ + + +/*-***************************************** +* FSE detailed API +******************************************/ +/*! +FSE_compress() does the following: +1. count symbol occurrence from source[] into table count[] (see hist.h) +2. normalize counters so that sum(count[]) == Power_of_2 (2^tableLog) +3. save normalized counters to memory buffer using writeNCount() +4. build encoding table 'CTable' from normalized counters +5. encode the data stream using encoding table 'CTable' + +FSE_decompress() does the following: +1. read normalized counters with readNCount() +2. build decoding table 'DTable' from normalized counters +3. decode the data stream using decoding table 'DTable' + +The following API allows targeting specific sub-functions for advanced tasks. +For example, it's possible to compress several blocks using the same 'CTable', +or to save and provide normalized distribution using external method. +*/ + +/* *** COMPRESSION *** */ + +/*! FSE_optimalTableLog(): + dynamically downsize 'tableLog' when conditions are met. + It saves CPU time, by using smaller tables, while preserving or even improving compression ratio. + @return : recommended tableLog (necessarily <= 'maxTableLog') */ +FSE_PUBLIC_API unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue); + +/*! FSE_normalizeCount(): + normalize counts so that sum(count[]) == Power_of_2 (2^tableLog) + 'normalizedCounter' is a table of short, of minimum size (maxSymbolValue+1). + useLowProbCount is a boolean parameter which trades off compressed size for + faster header decoding. When it is set to 1, the compressed data will be slightly + smaller. And when it is set to 0, FSE_readNCount() and FSE_buildDTable() will be + faster. If you are compressing a small amount of data (< 2 KB) then useLowProbCount=0 + is a good default, since header deserialization makes a big speed difference. + Otherwise, useLowProbCount=1 is a good default, since the speed difference is small. + @return : tableLog, + or an errorCode, which can be tested using FSE_isError() */ +FSE_PUBLIC_API size_t FSE_normalizeCount(short* normalizedCounter, unsigned tableLog, + const unsigned* count, size_t srcSize, unsigned maxSymbolValue, unsigned useLowProbCount); + +/*! FSE_NCountWriteBound(): + Provides the maximum possible size of an FSE normalized table, given 'maxSymbolValue' and 'tableLog'. + Typically useful for allocation purpose. */ +FSE_PUBLIC_API size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog); + +/*! FSE_writeNCount(): + Compactly save 'normalizedCounter' into 'buffer'. + @return : size of the compressed table, + or an errorCode, which can be tested using FSE_isError(). */ +FSE_PUBLIC_API size_t FSE_writeNCount (void* buffer, size_t bufferSize, + const short* normalizedCounter, + unsigned maxSymbolValue, unsigned tableLog); + +/*! Constructor and Destructor of FSE_CTable. + Note that FSE_CTable size depends on 'tableLog' and 'maxSymbolValue' */ +typedef unsigned FSE_CTable; /* don't allocate that. It's only meant to be more restrictive than void* */ + +/*! FSE_buildCTable(): + Builds `ct`, which must be already allocated, using FSE_createCTable(). + @return : 0, or an errorCode, which can be tested using FSE_isError() */ +FSE_PUBLIC_API size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog); + +/*! FSE_compress_usingCTable(): + Compress `src` using `ct` into `dst` which must be already allocated. + @return : size of compressed data (<= `dstCapacity`), + or 0 if compressed data could not fit into `dst`, + or an errorCode, which can be tested using FSE_isError() */ +FSE_PUBLIC_API size_t FSE_compress_usingCTable (void* dst, size_t dstCapacity, const void* src, size_t srcSize, const FSE_CTable* ct); + +/*! +Tutorial : +---------- +The first step is to count all symbols. FSE_count() does this job very fast. +Result will be saved into 'count', a table of unsigned int, which must be already allocated, and have 'maxSymbolValuePtr[0]+1' cells. +'src' is a table of bytes of size 'srcSize'. All values within 'src' MUST be <= maxSymbolValuePtr[0] +maxSymbolValuePtr[0] will be updated, with its real value (necessarily <= original value) +FSE_count() will return the number of occurrence of the most frequent symbol. +This can be used to know if there is a single symbol within 'src', and to quickly evaluate its compressibility. +If there is an error, the function will return an ErrorCode (which can be tested using FSE_isError()). + +The next step is to normalize the frequencies. +FSE_normalizeCount() will ensure that sum of frequencies is == 2 ^'tableLog'. +It also guarantees a minimum of 1 to any Symbol with frequency >= 1. +You can use 'tableLog'==0 to mean "use default tableLog value". +If you are unsure of which tableLog value to use, you can ask FSE_optimalTableLog(), +which will provide the optimal valid tableLog given sourceSize, maxSymbolValue, and a user-defined maximum (0 means "default"). + +The result of FSE_normalizeCount() will be saved into a table, +called 'normalizedCounter', which is a table of signed short. +'normalizedCounter' must be already allocated, and have at least 'maxSymbolValue+1' cells. +The return value is tableLog if everything proceeded as expected. +It is 0 if there is a single symbol within distribution. +If there is an error (ex: invalid tableLog value), the function will return an ErrorCode (which can be tested using FSE_isError()). + +'normalizedCounter' can be saved in a compact manner to a memory area using FSE_writeNCount(). +'buffer' must be already allocated. +For guaranteed success, buffer size must be at least FSE_headerBound(). +The result of the function is the number of bytes written into 'buffer'. +If there is an error, the function will return an ErrorCode (which can be tested using FSE_isError(); ex : buffer size too small). + +'normalizedCounter' can then be used to create the compression table 'CTable'. +The space required by 'CTable' must be already allocated, using FSE_createCTable(). +You can then use FSE_buildCTable() to fill 'CTable'. +If there is an error, both functions will return an ErrorCode (which can be tested using FSE_isError()). + +'CTable' can then be used to compress 'src', with FSE_compress_usingCTable(). +Similar to FSE_count(), the convention is that 'src' is assumed to be a table of char of size 'srcSize' +The function returns the size of compressed data (without header), necessarily <= `dstCapacity`. +If it returns '0', compressed data could not fit into 'dst'. +If there is an error, the function will return an ErrorCode (which can be tested using FSE_isError()). +*/ + + +/* *** DECOMPRESSION *** */ + +/*! FSE_readNCount(): + Read compactly saved 'normalizedCounter' from 'rBuffer'. + @return : size read from 'rBuffer', + or an errorCode, which can be tested using FSE_isError(). + maxSymbolValuePtr[0] and tableLogPtr[0] will also be updated with their respective values */ +FSE_PUBLIC_API size_t FSE_readNCount (short* normalizedCounter, + unsigned* maxSymbolValuePtr, unsigned* tableLogPtr, + const void* rBuffer, size_t rBuffSize); + +/*! FSE_readNCount_bmi2(): + * Same as FSE_readNCount() but pass bmi2=1 when your CPU supports BMI2 and 0 otherwise. + */ +FSE_PUBLIC_API size_t FSE_readNCount_bmi2(short* normalizedCounter, + unsigned* maxSymbolValuePtr, unsigned* tableLogPtr, + const void* rBuffer, size_t rBuffSize, int bmi2); + +typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be more restrictive than void* */ + +/*! +Tutorial : +---------- +(Note : these functions only decompress FSE-compressed blocks. + If block is uncompressed, use memcpy() instead + If block is a single repeated byte, use memset() instead ) + +The first step is to obtain the normalized frequencies of symbols. +This can be performed by FSE_readNCount() if it was saved using FSE_writeNCount(). +'normalizedCounter' must be already allocated, and have at least 'maxSymbolValuePtr[0]+1' cells of signed short. +In practice, that means it's necessary to know 'maxSymbolValue' beforehand, +or size the table to handle worst case situations (typically 256). +FSE_readNCount() will provide 'tableLog' and 'maxSymbolValue'. +The result of FSE_readNCount() is the number of bytes read from 'rBuffer'. +Note that 'rBufferSize' must be at least 4 bytes, even if useful information is less than that. +If there is an error, the function will return an error code, which can be tested using FSE_isError(). + +The next step is to build the decompression tables 'FSE_DTable' from 'normalizedCounter'. +This is performed by the function FSE_buildDTable(). +The space required by 'FSE_DTable' must be already allocated using FSE_createDTable(). +If there is an error, the function will return an error code, which can be tested using FSE_isError(). + +`FSE_DTable` can then be used to decompress `cSrc`, with FSE_decompress_usingDTable(). +`cSrcSize` must be strictly correct, otherwise decompression will fail. +FSE_decompress_usingDTable() result will tell how many bytes were regenerated (<=`dstCapacity`). +If there is an error, the function will return an error code, which can be tested using FSE_isError(). (ex: dst buffer too small) +*/ + +#endif /* FSE_H */ + +#if defined(FSE_STATIC_LINKING_ONLY) && !defined(FSE_H_FSE_STATIC_LINKING_ONLY) +#define FSE_H_FSE_STATIC_LINKING_ONLY + +/* *** Dependency *** */ +/**** start inlining bitstream.h ****/ +/* ****************************************************************** + * bitstream + * Part of FSE library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ +#ifndef BITSTREAM_H_MODULE +#define BITSTREAM_H_MODULE + +#if defined (__cplusplus) +extern "C" { +#endif +/* +* This API consists of small unitary functions, which must be inlined for best performance. +* Since link-time-optimization is not available for all compilers, +* these functions are defined into a .h to be included. +*/ + +/*-**************************************** +* Dependencies +******************************************/ +/**** skipping file: mem.h ****/ +/**** skipping file: compiler.h ****/ +/**** skipping file: debug.h ****/ +/**** skipping file: error_private.h ****/ +/**** start inlining bits.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_BITS_H +#define ZSTD_BITS_H + +/**** skipping file: mem.h ****/ + +MEM_STATIC unsigned ZSTD_countTrailingZeros32_fallback(U32 val) +{ + assert(val != 0); + { + static const U32 DeBruijnBytePos[32] = {0, 1, 28, 2, 29, 14, 24, 3, + 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, + 26, 12, 18, 6, 11, 5, 10, 9}; + return DeBruijnBytePos[((U32) ((val & -(S32) val) * 0x077CB531U)) >> 27]; + } +} + +MEM_STATIC unsigned ZSTD_countTrailingZeros32(U32 val) +{ + assert(val != 0); +# if defined(_MSC_VER) +# if STATIC_BMI2 == 1 + return (unsigned)_tzcnt_u32(val); +# else + if (val != 0) { + unsigned long r; + _BitScanForward(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)__builtin_ctz(val); +# else + return ZSTD_countTrailingZeros32_fallback(val); +# endif +} + +MEM_STATIC unsigned ZSTD_countLeadingZeros32_fallback(U32 val) { + assert(val != 0); + { + static const U32 DeBruijnClz[32] = {0, 9, 1, 10, 13, 21, 2, 29, + 11, 14, 16, 18, 22, 25, 3, 30, + 8, 12, 20, 28, 15, 17, 24, 7, + 19, 27, 23, 6, 26, 5, 4, 31}; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + return 31 - DeBruijnClz[(val * 0x07C4ACDDU) >> 27]; + } +} + +MEM_STATIC unsigned ZSTD_countLeadingZeros32(U32 val) +{ + assert(val != 0); +# if defined(_MSC_VER) +# if STATIC_BMI2 == 1 + return (unsigned)_lzcnt_u32(val); +# else + if (val != 0) { + unsigned long r; + _BitScanReverse(&r, val); + return (unsigned)(31 - r); + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)__builtin_clz(val); +# else + return ZSTD_countLeadingZeros32_fallback(val); +# endif +} + +MEM_STATIC unsigned ZSTD_countTrailingZeros64(U64 val) +{ + assert(val != 0); +# if defined(_MSC_VER) && defined(_WIN64) +# if STATIC_BMI2 == 1 + return (unsigned)_tzcnt_u64(val); +# else + if (val != 0) { + unsigned long r; + _BitScanForward64(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) && defined(__LP64__) + return (unsigned)__builtin_ctzll(val); +# else + { + U32 mostSignificantWord = (U32)(val >> 32); + U32 leastSignificantWord = (U32)val; + if (leastSignificantWord == 0) { + return 32 + ZSTD_countTrailingZeros32(mostSignificantWord); + } else { + return ZSTD_countTrailingZeros32(leastSignificantWord); + } + } +# endif +} + +MEM_STATIC unsigned ZSTD_countLeadingZeros64(U64 val) +{ + assert(val != 0); +# if defined(_MSC_VER) && defined(_WIN64) +# if STATIC_BMI2 == 1 + return (unsigned)_lzcnt_u64(val); +# else + if (val != 0) { + unsigned long r; + _BitScanReverse64(&r, val); + return (unsigned)(63 - r); + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)(__builtin_clzll(val)); +# else + { + U32 mostSignificantWord = (U32)(val >> 32); + U32 leastSignificantWord = (U32)val; + if (mostSignificantWord == 0) { + return 32 + ZSTD_countLeadingZeros32(leastSignificantWord); + } else { + return ZSTD_countLeadingZeros32(mostSignificantWord); + } + } +# endif +} + +MEM_STATIC unsigned ZSTD_NbCommonBytes(size_t val) +{ + if (MEM_isLittleEndian()) { + if (MEM_64bits()) { + return ZSTD_countTrailingZeros64((U64)val) >> 3; + } else { + return ZSTD_countTrailingZeros32((U32)val) >> 3; + } + } else { /* Big Endian CPU */ + if (MEM_64bits()) { + return ZSTD_countLeadingZeros64((U64)val) >> 3; + } else { + return ZSTD_countLeadingZeros32((U32)val) >> 3; + } + } +} + +MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */ +{ + assert(val != 0); + return 31 - ZSTD_countLeadingZeros32(val); +} + +/* ZSTD_rotateRight_*(): + * Rotates a bitfield to the right by "count" bits. + * https://en.wikipedia.org/w/index.php?title=Circular_shift&oldid=991635599#Implementing_circular_shifts + */ +MEM_STATIC +U64 ZSTD_rotateRight_U64(U64 const value, U32 count) { + assert(count < 64); + count &= 0x3F; /* for fickle pattern recognition */ + return (value >> count) | (U64)(value << ((0U - count) & 0x3F)); +} + +MEM_STATIC +U32 ZSTD_rotateRight_U32(U32 const value, U32 count) { + assert(count < 32); + count &= 0x1F; /* for fickle pattern recognition */ + return (value >> count) | (U32)(value << ((0U - count) & 0x1F)); +} + +MEM_STATIC +U16 ZSTD_rotateRight_U16(U16 const value, U32 count) { + assert(count < 16); + count &= 0x0F; /* for fickle pattern recognition */ + return (value >> count) | (U16)(value << ((0U - count) & 0x0F)); +} + +#endif /* ZSTD_BITS_H */ +/**** ended inlining bits.h ****/ + + +/*========================================= +* Target specific +=========================================*/ +#ifndef ZSTD_NO_INTRINSICS +# if (defined(__BMI__) || defined(__BMI2__)) && defined(__GNUC__) +# include /* support for bextr (experimental)/bzhi */ +# elif defined(__ICCARM__) +# include +# endif +#endif + +#define STREAM_ACCUMULATOR_MIN_32 25 +#define STREAM_ACCUMULATOR_MIN_64 57 +#define STREAM_ACCUMULATOR_MIN ((U32)(MEM_32bits() ? STREAM_ACCUMULATOR_MIN_32 : STREAM_ACCUMULATOR_MIN_64)) + + +/*-****************************************** +* bitStream encoding API (write forward) +********************************************/ +/* bitStream can mix input from multiple sources. + * A critical property of these streams is that they encode and decode in **reverse** direction. + * So the first bit sequence you add will be the last to be read, like a LIFO stack. + */ +typedef struct { + size_t bitContainer; + unsigned bitPos; + char* startPtr; + char* ptr; + char* endPtr; +} BIT_CStream_t; + +MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC, void* dstBuffer, size_t dstCapacity); +MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, size_t value, unsigned nbBits); +MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC); +MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC); + +/* Start with initCStream, providing the size of buffer to write into. +* bitStream will never write outside of this buffer. +* `dstCapacity` must be >= sizeof(bitD->bitContainer), otherwise @return will be an error code. +* +* bits are first added to a local register. +* Local register is size_t, hence 64-bits on 64-bits systems, or 32-bits on 32-bits systems. +* Writing data into memory is an explicit operation, performed by the flushBits function. +* Hence keep track how many bits are potentially stored into local register to avoid register overflow. +* After a flushBits, a maximum of 7 bits might still be stored into local register. +* +* Avoid storing elements of more than 24 bits if you want compatibility with 32-bits bitstream readers. +* +* Last operation is to close the bitStream. +* The function returns the final size of CStream in bytes. +* If data couldn't fit into `dstBuffer`, it will return a 0 ( == not storable) +*/ + + +/*-******************************************** +* bitStream decoding API (read backward) +**********************************************/ +typedef struct { + size_t bitContainer; + unsigned bitsConsumed; + const char* ptr; + const char* start; + const char* limitPtr; +} BIT_DStream_t; + +typedef enum { BIT_DStream_unfinished = 0, + BIT_DStream_endOfBuffer = 1, + BIT_DStream_completed = 2, + BIT_DStream_overflow = 3 } BIT_DStream_status; /* result of BIT_reloadDStream() */ + /* 1,2,4,8 would be better for bitmap combinations, but slows down performance a bit ... :( */ + +MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize); +MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits); +MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD); +MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD); + + +/* Start by invoking BIT_initDStream(). +* A chunk of the bitStream is then stored into a local register. +* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t). +* You can then retrieve bitFields stored into the local register, **in reverse order**. +* Local register is explicitly reloaded from memory by the BIT_reloadDStream() method. +* A reload guarantee a minimum of ((8*sizeof(bitD->bitContainer))-7) bits when its result is BIT_DStream_unfinished. +* Otherwise, it can be less than that, so proceed accordingly. +* Checking if DStream has reached its end can be performed with BIT_endOfDStream(). +*/ + + +/*-**************************************** +* unsafe API +******************************************/ +MEM_STATIC void BIT_addBitsFast(BIT_CStream_t* bitC, size_t value, unsigned nbBits); +/* faster, but works only if value is "clean", meaning all high bits above nbBits are 0 */ + +MEM_STATIC void BIT_flushBitsFast(BIT_CStream_t* bitC); +/* unsafe version; does not check buffer overflow */ + +MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits); +/* faster, but works only if nbBits >= 1 */ + +/*===== Local Constants =====*/ +static const unsigned BIT_mask[] = { + 0, 1, 3, 7, 0xF, 0x1F, + 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, + 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF, + 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, + 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF, 0x1FFFFFFF, + 0x3FFFFFFF, 0x7FFFFFFF}; /* up to 31 bits */ +#define BIT_MASK_SIZE (sizeof(BIT_mask) / sizeof(BIT_mask[0])) + +/*-************************************************************** +* bitStream encoding +****************************************************************/ +/*! BIT_initCStream() : + * `dstCapacity` must be > sizeof(size_t) + * @return : 0 if success, + * otherwise an error code (can be tested using ERR_isError()) */ +MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC, + void* startPtr, size_t dstCapacity) +{ + bitC->bitContainer = 0; + bitC->bitPos = 0; + bitC->startPtr = (char*)startPtr; + bitC->ptr = bitC->startPtr; + bitC->endPtr = bitC->startPtr + dstCapacity - sizeof(bitC->bitContainer); + if (dstCapacity <= sizeof(bitC->bitContainer)) return ERROR(dstSize_tooSmall); + return 0; +} + +MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits) +{ +#if defined(STATIC_BMI2) && STATIC_BMI2 == 1 && !defined(ZSTD_NO_INTRINSICS) + return _bzhi_u64(bitContainer, nbBits); +#else + assert(nbBits < BIT_MASK_SIZE); + return bitContainer & BIT_mask[nbBits]; +#endif +} + +/*! BIT_addBits() : + * can add up to 31 bits into `bitC`. + * Note : does not check for register overflow ! */ +MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, + size_t value, unsigned nbBits) +{ + DEBUG_STATIC_ASSERT(BIT_MASK_SIZE == 32); + assert(nbBits < BIT_MASK_SIZE); + assert(nbBits + bitC->bitPos < sizeof(bitC->bitContainer) * 8); + bitC->bitContainer |= BIT_getLowerBits(value, nbBits) << bitC->bitPos; + bitC->bitPos += nbBits; +} + +/*! BIT_addBitsFast() : + * works only if `value` is _clean_, + * meaning all high bits above nbBits are 0 */ +MEM_STATIC void BIT_addBitsFast(BIT_CStream_t* bitC, + size_t value, unsigned nbBits) +{ + assert((value>>nbBits) == 0); + assert(nbBits + bitC->bitPos < sizeof(bitC->bitContainer) * 8); + bitC->bitContainer |= value << bitC->bitPos; + bitC->bitPos += nbBits; +} + +/*! BIT_flushBitsFast() : + * assumption : bitContainer has not overflowed + * unsafe version; does not check buffer overflow */ +MEM_STATIC void BIT_flushBitsFast(BIT_CStream_t* bitC) +{ + size_t const nbBytes = bitC->bitPos >> 3; + assert(bitC->bitPos < sizeof(bitC->bitContainer) * 8); + assert(bitC->ptr <= bitC->endPtr); + MEM_writeLEST(bitC->ptr, bitC->bitContainer); + bitC->ptr += nbBytes; + bitC->bitPos &= 7; + bitC->bitContainer >>= nbBytes*8; +} + +/*! BIT_flushBits() : + * assumption : bitContainer has not overflowed + * safe version; check for buffer overflow, and prevents it. + * note : does not signal buffer overflow. + * overflow will be revealed later on using BIT_closeCStream() */ +MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC) +{ + size_t const nbBytes = bitC->bitPos >> 3; + assert(bitC->bitPos < sizeof(bitC->bitContainer) * 8); + assert(bitC->ptr <= bitC->endPtr); + MEM_writeLEST(bitC->ptr, bitC->bitContainer); + bitC->ptr += nbBytes; + if (bitC->ptr > bitC->endPtr) bitC->ptr = bitC->endPtr; + bitC->bitPos &= 7; + bitC->bitContainer >>= nbBytes*8; +} + +/*! BIT_closeCStream() : + * @return : size of CStream, in bytes, + * or 0 if it could not fit into dstBuffer */ +MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC) +{ + BIT_addBitsFast(bitC, 1, 1); /* endMark */ + BIT_flushBits(bitC); + if (bitC->ptr >= bitC->endPtr) return 0; /* overflow detected */ + return (bitC->ptr - bitC->startPtr) + (bitC->bitPos > 0); +} + + +/*-******************************************************** +* bitStream decoding +**********************************************************/ +/*! BIT_initDStream() : + * Initialize a BIT_DStream_t. + * `bitD` : a pointer to an already allocated BIT_DStream_t structure. + * `srcSize` must be the *exact* size of the bitStream, in bytes. + * @return : size of stream (== srcSize), or an errorCode if a problem is detected + */ +MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize) +{ + if (srcSize < 1) { ZSTD_memset(bitD, 0, sizeof(*bitD)); return ERROR(srcSize_wrong); } + + bitD->start = (const char*)srcBuffer; + bitD->limitPtr = bitD->start + sizeof(bitD->bitContainer); + + if (srcSize >= sizeof(bitD->bitContainer)) { /* normal case */ + bitD->ptr = (const char*)srcBuffer + srcSize - sizeof(bitD->bitContainer); + bitD->bitContainer = MEM_readLEST(bitD->ptr); + { BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1]; + bitD->bitsConsumed = lastByte ? 8 - ZSTD_highbit32(lastByte) : 0; /* ensures bitsConsumed is always set */ + if (lastByte == 0) return ERROR(GENERIC); /* endMark not present */ } + } else { + bitD->ptr = bitD->start; + bitD->bitContainer = *(const BYTE*)(bitD->start); + switch(srcSize) + { + case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16); + ZSTD_FALLTHROUGH; + + case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24); + ZSTD_FALLTHROUGH; + + case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32); + ZSTD_FALLTHROUGH; + + case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24; + ZSTD_FALLTHROUGH; + + case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16; + ZSTD_FALLTHROUGH; + + case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8; + ZSTD_FALLTHROUGH; + + default: break; + } + { BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1]; + bitD->bitsConsumed = lastByte ? 8 - ZSTD_highbit32(lastByte) : 0; + if (lastByte == 0) return ERROR(corruption_detected); /* endMark not present */ + } + bitD->bitsConsumed += (U32)(sizeof(bitD->bitContainer) - srcSize)*8; + } + + return srcSize; +} + +MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getUpperBits(size_t bitContainer, U32 const start) +{ + return bitContainer >> start; +} + +MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getMiddleBits(size_t bitContainer, U32 const start, U32 const nbBits) +{ + U32 const regMask = sizeof(bitContainer)*8 - 1; + /* if start > regMask, bitstream is corrupted, and result is undefined */ + assert(nbBits < BIT_MASK_SIZE); + /* x86 transform & ((1 << nbBits) - 1) to bzhi instruction, it is better + * than accessing memory. When bmi2 instruction is not present, we consider + * such cpus old (pre-Haswell, 2013) and their performance is not of that + * importance. + */ +#if defined(__x86_64__) || defined(_M_X86) + return (bitContainer >> (start & regMask)) & ((((U64)1) << nbBits) - 1); +#else + return (bitContainer >> (start & regMask)) & BIT_mask[nbBits]; +#endif +} + +/*! BIT_lookBits() : + * Provides next n bits from local register. + * local register is not modified. + * On 32-bits, maxNbBits==24. + * On 64-bits, maxNbBits==56. + * @return : value extracted */ +MEM_STATIC FORCE_INLINE_ATTR size_t BIT_lookBits(const BIT_DStream_t* bitD, U32 nbBits) +{ + /* arbitrate between double-shift and shift+mask */ +#if 1 + /* if bitD->bitsConsumed + nbBits > sizeof(bitD->bitContainer)*8, + * bitstream is likely corrupted, and result is undefined */ + return BIT_getMiddleBits(bitD->bitContainer, (sizeof(bitD->bitContainer)*8) - bitD->bitsConsumed - nbBits, nbBits); +#else + /* this code path is slower on my os-x laptop */ + U32 const regMask = sizeof(bitD->bitContainer)*8 - 1; + return ((bitD->bitContainer << (bitD->bitsConsumed & regMask)) >> 1) >> ((regMask-nbBits) & regMask); +#endif +} + +/*! BIT_lookBitsFast() : + * unsafe version; only works if nbBits >= 1 */ +MEM_STATIC size_t BIT_lookBitsFast(const BIT_DStream_t* bitD, U32 nbBits) +{ + U32 const regMask = sizeof(bitD->bitContainer)*8 - 1; + assert(nbBits >= 1); + return (bitD->bitContainer << (bitD->bitsConsumed & regMask)) >> (((regMask+1)-nbBits) & regMask); +} + +MEM_STATIC FORCE_INLINE_ATTR void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits) +{ + bitD->bitsConsumed += nbBits; +} + +/*! BIT_readBits() : + * Read (consume) next n bits from local register and update. + * Pay attention to not read more than nbBits contained into local register. + * @return : extracted value. */ +MEM_STATIC FORCE_INLINE_ATTR size_t BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits) +{ + size_t const value = BIT_lookBits(bitD, nbBits); + BIT_skipBits(bitD, nbBits); + return value; +} + +/*! BIT_readBitsFast() : + * unsafe version; only works if nbBits >= 1 */ +MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits) +{ + size_t const value = BIT_lookBitsFast(bitD, nbBits); + assert(nbBits >= 1); + BIT_skipBits(bitD, nbBits); + return value; +} + +/*! BIT_reloadDStreamFast() : + * Similar to BIT_reloadDStream(), but with two differences: + * 1. bitsConsumed <= sizeof(bitD->bitContainer)*8 must hold! + * 2. Returns BIT_DStream_overflow when bitD->ptr < bitD->limitPtr, at this + * point you must use BIT_reloadDStream() to reload. + */ +MEM_STATIC BIT_DStream_status BIT_reloadDStreamFast(BIT_DStream_t* bitD) +{ + if (UNLIKELY(bitD->ptr < bitD->limitPtr)) + return BIT_DStream_overflow; + assert(bitD->bitsConsumed <= sizeof(bitD->bitContainer)*8); + bitD->ptr -= bitD->bitsConsumed >> 3; + bitD->bitsConsumed &= 7; + bitD->bitContainer = MEM_readLEST(bitD->ptr); + return BIT_DStream_unfinished; +} + +/*! BIT_reloadDStream() : + * Refill `bitD` from buffer previously set in BIT_initDStream() . + * This function is safe, it guarantees it will not read beyond src buffer. + * @return : status of `BIT_DStream_t` internal register. + * when status == BIT_DStream_unfinished, internal register is filled with at least 25 or 57 bits */ +MEM_STATIC FORCE_INLINE_ATTR BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD) +{ + if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* overflow detected, like end of stream */ + return BIT_DStream_overflow; + + if (bitD->ptr >= bitD->limitPtr) { + return BIT_reloadDStreamFast(bitD); + } + if (bitD->ptr == bitD->start) { + if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return BIT_DStream_endOfBuffer; + return BIT_DStream_completed; + } + /* start < ptr < limitPtr */ + { U32 nbBytes = bitD->bitsConsumed >> 3; + BIT_DStream_status result = BIT_DStream_unfinished; + if (bitD->ptr - nbBytes < bitD->start) { + nbBytes = (U32)(bitD->ptr - bitD->start); /* ptr > start */ + result = BIT_DStream_endOfBuffer; + } + bitD->ptr -= nbBytes; + bitD->bitsConsumed -= nbBytes*8; + bitD->bitContainer = MEM_readLEST(bitD->ptr); /* reminder : srcSize > sizeof(bitD->bitContainer), otherwise bitD->ptr == bitD->start */ + return result; + } +} + +/*! BIT_endOfDStream() : + * @return : 1 if DStream has _exactly_ reached its end (all bits consumed). + */ +MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream) +{ + return ((DStream->ptr == DStream->start) && (DStream->bitsConsumed == sizeof(DStream->bitContainer)*8)); +} + +#if defined (__cplusplus) +} +#endif + +#endif /* BITSTREAM_H_MODULE */ +/**** ended inlining bitstream.h ****/ + + +/* ***************************************** +* Static allocation +*******************************************/ +/* FSE buffer bounds */ +#define FSE_NCOUNTBOUND 512 +#define FSE_BLOCKBOUND(size) ((size) + ((size)>>7) + 4 /* fse states */ + sizeof(size_t) /* bitContainer */) +#define FSE_COMPRESSBOUND(size) (FSE_NCOUNTBOUND + FSE_BLOCKBOUND(size)) /* Macro version, useful for static allocation */ + +/* It is possible to statically allocate FSE CTable/DTable as a table of FSE_CTable/FSE_DTable using below macros */ +#define FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) (1 + (1<<((maxTableLog)-1)) + (((maxSymbolValue)+1)*2)) +#define FSE_DTABLE_SIZE_U32(maxTableLog) (1 + (1<<(maxTableLog))) + +/* or use the size to malloc() space directly. Pay attention to alignment restrictions though */ +#define FSE_CTABLE_SIZE(maxTableLog, maxSymbolValue) (FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(FSE_CTable)) +#define FSE_DTABLE_SIZE(maxTableLog) (FSE_DTABLE_SIZE_U32(maxTableLog) * sizeof(FSE_DTable)) + + +/* ***************************************** + * FSE advanced API + ***************************************** */ + +unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus); +/**< same as FSE_optimalTableLog(), which used `minus==2` */ + +size_t FSE_buildCTable_rle (FSE_CTable* ct, unsigned char symbolValue); +/**< build a fake FSE_CTable, designed to compress always the same symbolValue */ + +/* FSE_buildCTable_wksp() : + * Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`). + * `wkspSize` must be >= `FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog)` of `unsigned`. + * See FSE_buildCTable_wksp() for breakdown of workspace usage. + */ +#define FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog) (((maxSymbolValue + 2) + (1ull << (tableLog)))/2 + sizeof(U64)/sizeof(U32) /* additional 8 bytes for potential table overwrite */) +#define FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) (sizeof(unsigned) * FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog)) +size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); + +#define FSE_BUILD_DTABLE_WKSP_SIZE(maxTableLog, maxSymbolValue) (sizeof(short) * (maxSymbolValue + 1) + (1ULL << maxTableLog) + 8) +#define FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) ((FSE_BUILD_DTABLE_WKSP_SIZE(maxTableLog, maxSymbolValue) + sizeof(unsigned) - 1) / sizeof(unsigned)) +FSE_PUBLIC_API size_t FSE_buildDTable_wksp(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); +/**< Same as FSE_buildDTable(), using an externally allocated `workspace` produced with `FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxSymbolValue)` */ + +#define FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) (FSE_DTABLE_SIZE_U32(maxTableLog) + 1 + FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) + (FSE_MAX_SYMBOL_VALUE + 1) / 2 + 1) +#define FSE_DECOMPRESS_WKSP_SIZE(maxTableLog, maxSymbolValue) (FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(unsigned)) +size_t FSE_decompress_wksp_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize, int bmi2); +/**< same as FSE_decompress(), using an externally allocated `workSpace` produced with `FSE_DECOMPRESS_WKSP_SIZE_U32(maxLog, maxSymbolValue)`. + * Set bmi2 to 1 if your CPU supports BMI2 or 0 if it doesn't */ + +typedef enum { + FSE_repeat_none, /**< Cannot use the previous table */ + FSE_repeat_check, /**< Can use the previous table but it must be checked */ + FSE_repeat_valid /**< Can use the previous table and it is assumed to be valid */ + } FSE_repeat; + +/* ***************************************** +* FSE symbol compression API +*******************************************/ +/*! + This API consists of small unitary functions, which highly benefit from being inlined. + Hence their body are included in next section. +*/ +typedef struct { + ptrdiff_t value; + const void* stateTable; + const void* symbolTT; + unsigned stateLog; +} FSE_CState_t; + +static void FSE_initCState(FSE_CState_t* CStatePtr, const FSE_CTable* ct); + +static void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* CStatePtr, unsigned symbol); + +static void FSE_flushCState(BIT_CStream_t* bitC, const FSE_CState_t* CStatePtr); + +/**< +These functions are inner components of FSE_compress_usingCTable(). +They allow the creation of custom streams, mixing multiple tables and bit sources. + +A key property to keep in mind is that encoding and decoding are done **in reverse direction**. +So the first symbol you will encode is the last you will decode, like a LIFO stack. + +You will need a few variables to track your CStream. They are : + +FSE_CTable ct; // Provided by FSE_buildCTable() +BIT_CStream_t bitStream; // bitStream tracking structure +FSE_CState_t state; // State tracking structure (can have several) + + +The first thing to do is to init bitStream and state. + size_t errorCode = BIT_initCStream(&bitStream, dstBuffer, maxDstSize); + FSE_initCState(&state, ct); + +Note that BIT_initCStream() can produce an error code, so its result should be tested, using FSE_isError(); +You can then encode your input data, byte after byte. +FSE_encodeSymbol() outputs a maximum of 'tableLog' bits at a time. +Remember decoding will be done in reverse direction. + FSE_encodeByte(&bitStream, &state, symbol); + +At any time, you can also add any bit sequence. +Note : maximum allowed nbBits is 25, for compatibility with 32-bits decoders + BIT_addBits(&bitStream, bitField, nbBits); + +The above methods don't commit data to memory, they just store it into local register, for speed. +Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t). +Writing data to memory is a manual operation, performed by the flushBits function. + BIT_flushBits(&bitStream); + +Your last FSE encoding operation shall be to flush your last state value(s). + FSE_flushState(&bitStream, &state); + +Finally, you must close the bitStream. +The function returns the size of CStream in bytes. +If data couldn't fit into dstBuffer, it will return a 0 ( == not compressible) +If there is an error, it returns an errorCode (which can be tested using FSE_isError()). + size_t size = BIT_closeCStream(&bitStream); +*/ + + +/* ***************************************** +* FSE symbol decompression API +*******************************************/ +typedef struct { + size_t state; + const void* table; /* precise table may vary, depending on U16 */ +} FSE_DState_t; + + +static void FSE_initDState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD, const FSE_DTable* dt); + +static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD); + +static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr); + +/**< +Let's now decompose FSE_decompress_usingDTable() into its unitary components. +You will decode FSE-encoded symbols from the bitStream, +and also any other bitFields you put in, **in reverse order**. + +You will need a few variables to track your bitStream. They are : + +BIT_DStream_t DStream; // Stream context +FSE_DState_t DState; // State context. Multiple ones are possible +FSE_DTable* DTablePtr; // Decoding table, provided by FSE_buildDTable() + +The first thing to do is to init the bitStream. + errorCode = BIT_initDStream(&DStream, srcBuffer, srcSize); + +You should then retrieve your initial state(s) +(in reverse flushing order if you have several ones) : + errorCode = FSE_initDState(&DState, &DStream, DTablePtr); + +You can then decode your data, symbol after symbol. +For information the maximum number of bits read by FSE_decodeSymbol() is 'tableLog'. +Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out). + unsigned char symbol = FSE_decodeSymbol(&DState, &DStream); + +You can retrieve any bitfield you eventually stored into the bitStream (in reverse order) +Note : maximum allowed nbBits is 25, for 32-bits compatibility + size_t bitField = BIT_readBits(&DStream, nbBits); + +All above operations only read from local register (which size depends on size_t). +Refueling the register from memory is manually performed by the reload method. + endSignal = FSE_reloadDStream(&DStream); + +BIT_reloadDStream() result tells if there is still some more data to read from DStream. +BIT_DStream_unfinished : there is still some data left into the DStream. +BIT_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled. +BIT_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed. +BIT_DStream_tooFar : Dstream went too far. Decompression result is corrupted. + +When reaching end of buffer (BIT_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop, +to properly detect the exact end of stream. +After each decoded symbol, check if DStream is fully consumed using this simple test : + BIT_reloadDStream(&DStream) >= BIT_DStream_completed + +When it's done, verify decompression is fully completed, by checking both DStream and the relevant states. +Checking if DStream has reached its end is performed by : + BIT_endOfDStream(&DStream); +Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible. + FSE_endOfDState(&DState); +*/ + + +/* ***************************************** +* FSE unsafe API +*******************************************/ +static unsigned char FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD); +/* faster, but works only if nbBits is always >= 1 (otherwise, result will be corrupted) */ + + +/* ***************************************** +* Implementation of inlined functions +*******************************************/ +typedef struct { + int deltaFindState; + U32 deltaNbBits; +} FSE_symbolCompressionTransform; /* total 8 bytes */ + +MEM_STATIC void FSE_initCState(FSE_CState_t* statePtr, const FSE_CTable* ct) +{ + const void* ptr = ct; + const U16* u16ptr = (const U16*) ptr; + const U32 tableLog = MEM_read16(ptr); + statePtr->value = (ptrdiff_t)1<stateTable = u16ptr+2; + statePtr->symbolTT = ct + 1 + (tableLog ? (1<<(tableLog-1)) : 1); + statePtr->stateLog = tableLog; +} + + +/*! FSE_initCState2() : +* Same as FSE_initCState(), but the first symbol to include (which will be the last to be read) +* uses the smallest state value possible, saving the cost of this symbol */ +MEM_STATIC void FSE_initCState2(FSE_CState_t* statePtr, const FSE_CTable* ct, U32 symbol) +{ + FSE_initCState(statePtr, ct); + { const FSE_symbolCompressionTransform symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol]; + const U16* stateTable = (const U16*)(statePtr->stateTable); + U32 nbBitsOut = (U32)((symbolTT.deltaNbBits + (1<<15)) >> 16); + statePtr->value = (nbBitsOut << 16) - symbolTT.deltaNbBits; + statePtr->value = stateTable[(statePtr->value >> nbBitsOut) + symbolTT.deltaFindState]; + } +} + +MEM_STATIC void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* statePtr, unsigned symbol) +{ + FSE_symbolCompressionTransform const symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol]; + const U16* const stateTable = (const U16*)(statePtr->stateTable); + U32 const nbBitsOut = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16); + BIT_addBits(bitC, statePtr->value, nbBitsOut); + statePtr->value = stateTable[ (statePtr->value >> nbBitsOut) + symbolTT.deltaFindState]; +} + +MEM_STATIC void FSE_flushCState(BIT_CStream_t* bitC, const FSE_CState_t* statePtr) +{ + BIT_addBits(bitC, statePtr->value, statePtr->stateLog); + BIT_flushBits(bitC); +} + + +/* FSE_getMaxNbBits() : + * Approximate maximum cost of a symbol, in bits. + * Fractional get rounded up (i.e. a symbol with a normalized frequency of 3 gives the same result as a frequency of 2) + * note 1 : assume symbolValue is valid (<= maxSymbolValue) + * note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */ +MEM_STATIC U32 FSE_getMaxNbBits(const void* symbolTTPtr, U32 symbolValue) +{ + const FSE_symbolCompressionTransform* symbolTT = (const FSE_symbolCompressionTransform*) symbolTTPtr; + return (symbolTT[symbolValue].deltaNbBits + ((1<<16)-1)) >> 16; +} + +/* FSE_bitCost() : + * Approximate symbol cost, as fractional value, using fixed-point format (accuracyLog fractional bits) + * note 1 : assume symbolValue is valid (<= maxSymbolValue) + * note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */ +MEM_STATIC U32 FSE_bitCost(const void* symbolTTPtr, U32 tableLog, U32 symbolValue, U32 accuracyLog) +{ + const FSE_symbolCompressionTransform* symbolTT = (const FSE_symbolCompressionTransform*) symbolTTPtr; + U32 const minNbBits = symbolTT[symbolValue].deltaNbBits >> 16; + U32 const threshold = (minNbBits+1) << 16; + assert(tableLog < 16); + assert(accuracyLog < 31-tableLog); /* ensure enough room for renormalization double shift */ + { U32 const tableSize = 1 << tableLog; + U32 const deltaFromThreshold = threshold - (symbolTT[symbolValue].deltaNbBits + tableSize); + U32 const normalizedDeltaFromThreshold = (deltaFromThreshold << accuracyLog) >> tableLog; /* linear interpolation (very approximate) */ + U32 const bitMultiplier = 1 << accuracyLog; + assert(symbolTT[symbolValue].deltaNbBits + tableSize <= threshold); + assert(normalizedDeltaFromThreshold <= bitMultiplier); + return (minNbBits+1)*bitMultiplier - normalizedDeltaFromThreshold; + } +} + + +/* ====== Decompression ====== */ + +typedef struct { + U16 tableLog; + U16 fastMode; +} FSE_DTableHeader; /* sizeof U32 */ + +typedef struct +{ + unsigned short newState; + unsigned char symbol; + unsigned char nbBits; +} FSE_decode_t; /* size == U32 */ + +MEM_STATIC void FSE_initDState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD, const FSE_DTable* dt) +{ + const void* ptr = dt; + const FSE_DTableHeader* const DTableH = (const FSE_DTableHeader*)ptr; + DStatePtr->state = BIT_readBits(bitD, DTableH->tableLog); + BIT_reloadDStream(bitD); + DStatePtr->table = dt + 1; +} + +MEM_STATIC BYTE FSE_peekSymbol(const FSE_DState_t* DStatePtr) +{ + FSE_decode_t const DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state]; + return DInfo.symbol; +} + +MEM_STATIC void FSE_updateState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD) +{ + FSE_decode_t const DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state]; + U32 const nbBits = DInfo.nbBits; + size_t const lowBits = BIT_readBits(bitD, nbBits); + DStatePtr->state = DInfo.newState + lowBits; +} + +MEM_STATIC BYTE FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD) +{ + FSE_decode_t const DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state]; + U32 const nbBits = DInfo.nbBits; + BYTE const symbol = DInfo.symbol; + size_t const lowBits = BIT_readBits(bitD, nbBits); + + DStatePtr->state = DInfo.newState + lowBits; + return symbol; +} + +/*! FSE_decodeSymbolFast() : + unsafe, only works if no symbol has a probability > 50% */ +MEM_STATIC BYTE FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD) +{ + FSE_decode_t const DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state]; + U32 const nbBits = DInfo.nbBits; + BYTE const symbol = DInfo.symbol; + size_t const lowBits = BIT_readBitsFast(bitD, nbBits); + + DStatePtr->state = DInfo.newState + lowBits; + return symbol; +} + +MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr) +{ + return DStatePtr->state == 0; +} + + + +#ifndef FSE_COMMONDEFS_ONLY + +/* ************************************************************** +* Tuning parameters +****************************************************************/ +/*!MEMORY_USAGE : +* Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.) +* Increasing memory usage improves compression ratio +* Reduced memory usage can improve speed, due to cache effect +* Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */ +#ifndef FSE_MAX_MEMORY_USAGE +# define FSE_MAX_MEMORY_USAGE 14 +#endif +#ifndef FSE_DEFAULT_MEMORY_USAGE +# define FSE_DEFAULT_MEMORY_USAGE 13 +#endif +#if (FSE_DEFAULT_MEMORY_USAGE > FSE_MAX_MEMORY_USAGE) +# error "FSE_DEFAULT_MEMORY_USAGE must be <= FSE_MAX_MEMORY_USAGE" +#endif + +/*!FSE_MAX_SYMBOL_VALUE : +* Maximum symbol value authorized. +* Required for proper stack allocation */ +#ifndef FSE_MAX_SYMBOL_VALUE +# define FSE_MAX_SYMBOL_VALUE 255 +#endif + +/* ************************************************************** +* template functions type & suffix +****************************************************************/ +#define FSE_FUNCTION_TYPE BYTE +#define FSE_FUNCTION_EXTENSION +#define FSE_DECODE_TYPE FSE_decode_t + + +#endif /* !FSE_COMMONDEFS_ONLY */ + + +/* *************************************************************** +* Constants +*****************************************************************/ +#define FSE_MAX_TABLELOG (FSE_MAX_MEMORY_USAGE-2) +#define FSE_MAX_TABLESIZE (1U< FSE_TABLELOG_ABSOLUTE_MAX +# error "FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX is not supported" +#endif + +#define FSE_TABLESTEP(tableSize) (((tableSize)>>1) + ((tableSize)>>3) + 3) + + +#endif /* FSE_STATIC_LINKING_ONLY */ + + +#if defined (__cplusplus) +} +#endif +/**** ended inlining fse.h ****/ +/**** start inlining huf.h ****/ +/* ****************************************************************** + * huff0 huffman codec, + * part of Finite State Entropy library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef HUF_H_298734234 +#define HUF_H_298734234 + +/* *** Dependencies *** */ +/**** skipping file: zstd_deps.h ****/ +/**** skipping file: mem.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: fse.h ****/ + + +/* *** Tool functions *** */ +#define HUF_BLOCKSIZE_MAX (128 * 1024) /**< maximum input size for a single block compressed with HUF_compress */ +size_t HUF_compressBound(size_t size); /**< maximum compressed size (worst case) */ + +/* Error Management */ +unsigned HUF_isError(size_t code); /**< tells if a return value is an error code */ +const char* HUF_getErrorName(size_t code); /**< provides error code string (useful for debugging) */ + + +#define HUF_WORKSPACE_SIZE ((8 << 10) + 512 /* sorting scratch space */) +#define HUF_WORKSPACE_SIZE_U64 (HUF_WORKSPACE_SIZE / sizeof(U64)) + +/* *** Constants *** */ +#define HUF_TABLELOG_MAX 12 /* max runtime value of tableLog (due to static allocation); can be modified up to HUF_TABLELOG_ABSOLUTEMAX */ +#define HUF_TABLELOG_DEFAULT 11 /* default tableLog value when none specified */ +#define HUF_SYMBOLVALUE_MAX 255 + +#define HUF_TABLELOG_ABSOLUTEMAX 12 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */ +#if (HUF_TABLELOG_MAX > HUF_TABLELOG_ABSOLUTEMAX) +# error "HUF_TABLELOG_MAX is too large !" +#endif + + +/* **************************************** +* Static allocation +******************************************/ +/* HUF buffer bounds */ +#define HUF_CTABLEBOUND 129 +#define HUF_BLOCKBOUND(size) (size + (size>>8) + 8) /* only true when incompressible is pre-filtered with fast heuristic */ +#define HUF_COMPRESSBOUND(size) (HUF_CTABLEBOUND + HUF_BLOCKBOUND(size)) /* Macro version, useful for static allocation */ + +/* static allocation of HUF's Compression Table */ +/* this is a private definition, just exposed for allocation and strict aliasing purpose. never EVER access its members directly */ +typedef size_t HUF_CElt; /* consider it an incomplete type */ +#define HUF_CTABLE_SIZE_ST(maxSymbolValue) ((maxSymbolValue)+2) /* Use tables of size_t, for proper alignment */ +#define HUF_CTABLE_SIZE(maxSymbolValue) (HUF_CTABLE_SIZE_ST(maxSymbolValue) * sizeof(size_t)) +#define HUF_CREATE_STATIC_CTABLE(name, maxSymbolValue) \ + HUF_CElt name[HUF_CTABLE_SIZE_ST(maxSymbolValue)] /* no final ; */ + +/* static allocation of HUF's DTable */ +typedef U32 HUF_DTable; +#define HUF_DTABLE_SIZE(maxTableLog) (1 + (1<<(maxTableLog))) +#define HUF_CREATE_STATIC_DTABLEX1(DTable, maxTableLog) \ + HUF_DTable DTable[HUF_DTABLE_SIZE((maxTableLog)-1)] = { ((U32)((maxTableLog)-1) * 0x01000001) } +#define HUF_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) \ + HUF_DTable DTable[HUF_DTABLE_SIZE(maxTableLog)] = { ((U32)(maxTableLog) * 0x01000001) } + + +/* **************************************** +* Advanced decompression functions +******************************************/ + +/** + * Huffman flags bitset. + * For all flags, 0 is the default value. + */ +typedef enum { + /** + * If compiled with DYNAMIC_BMI2: Set flag only if the CPU supports BMI2 at runtime. + * Otherwise: Ignored. + */ + HUF_flags_bmi2 = (1 << 0), + /** + * If set: Test possible table depths to find the one that produces the smallest header + encoded size. + * If unset: Use heuristic to find the table depth. + */ + HUF_flags_optimalDepth = (1 << 1), + /** + * If set: If the previous table can encode the input, always reuse the previous table. + * If unset: If the previous table can encode the input, reuse the previous table if it results in a smaller output. + */ + HUF_flags_preferRepeat = (1 << 2), + /** + * If set: Sample the input and check if the sample is uncompressible, if it is then don't attempt to compress. + * If unset: Always histogram the entire input. + */ + HUF_flags_suspectUncompressible = (1 << 3), + /** + * If set: Don't use assembly implementations + * If unset: Allow using assembly implementations + */ + HUF_flags_disableAsm = (1 << 4), + /** + * If set: Don't use the fast decoding loop, always use the fallback decoding loop. + * If unset: Use the fast decoding loop when possible. + */ + HUF_flags_disableFast = (1 << 5) +} HUF_flags_e; + + +/* **************************************** + * HUF detailed API + * ****************************************/ +#define HUF_OPTIMAL_DEPTH_THRESHOLD ZSTD_btultra + +/*! HUF_compress() does the following: + * 1. count symbol occurrence from source[] into table count[] using FSE_count() (exposed within "fse.h") + * 2. (optional) refine tableLog using HUF_optimalTableLog() + * 3. build Huffman table from count using HUF_buildCTable() + * 4. save Huffman table to memory buffer using HUF_writeCTable() + * 5. encode the data stream using HUF_compress4X_usingCTable() + * + * The following API allows targeting specific sub-functions for advanced tasks. + * For example, it's possible to compress several blocks using the same 'CTable', + * or to save and regenerate 'CTable' using external methods. + */ +unsigned HUF_minTableLog(unsigned symbolCardinality); +unsigned HUF_cardinality(const unsigned* count, unsigned maxSymbolValue); +unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, void* workSpace, + size_t wkspSize, HUF_CElt* table, const unsigned* count, int flags); /* table is used as scratch space for building and testing tables, not a return value */ +size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog, void* workspace, size_t workspaceSize); +size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int flags); +size_t HUF_estimateCompressedSize(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue); +int HUF_validateCTable(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue); + +typedef enum { + HUF_repeat_none, /**< Cannot use the previous table */ + HUF_repeat_check, /**< Can use the previous table but it must be checked. Note : The previous table must have been constructed by HUF_compress{1, 4}X_repeat */ + HUF_repeat_valid /**< Can use the previous table and it is assumed to be valid */ + } HUF_repeat; + +/** HUF_compress4X_repeat() : + * Same as HUF_compress4X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none. + * If it uses hufTable it does not modify hufTable or repeat. + * If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used. + * If preferRepeat then the old table will always be used if valid. + * If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */ +size_t HUF_compress4X_repeat(void* dst, size_t dstSize, + const void* src, size_t srcSize, + unsigned maxSymbolValue, unsigned tableLog, + void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */ + HUF_CElt* hufTable, HUF_repeat* repeat, int flags); + +/** HUF_buildCTable_wksp() : + * Same as HUF_buildCTable(), but using externally allocated scratch buffer. + * `workSpace` must be aligned on 4-bytes boundaries, and its size must be >= HUF_CTABLE_WORKSPACE_SIZE. + */ +#define HUF_CTABLE_WORKSPACE_SIZE_U32 ((4 * (HUF_SYMBOLVALUE_MAX + 1)) + 192) +#define HUF_CTABLE_WORKSPACE_SIZE (HUF_CTABLE_WORKSPACE_SIZE_U32 * sizeof(unsigned)) +size_t HUF_buildCTable_wksp (HUF_CElt* tree, + const unsigned* count, U32 maxSymbolValue, U32 maxNbBits, + void* workSpace, size_t wkspSize); + +/*! HUF_readStats() : + * Read compact Huffman tree, saved by HUF_writeCTable(). + * `huffWeight` is destination buffer. + * @return : size read from `src` , or an error Code . + * Note : Needed by HUF_readCTable() and HUF_readDTableXn() . */ +size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, + U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize); + +/*! HUF_readStats_wksp() : + * Same as HUF_readStats() but takes an external workspace which must be + * 4-byte aligned and its size must be >= HUF_READ_STATS_WORKSPACE_SIZE. + * If the CPU has BMI2 support, pass bmi2=1, otherwise pass bmi2=0. + */ +#define HUF_READ_STATS_WORKSPACE_SIZE_U32 FSE_DECOMPRESS_WKSP_SIZE_U32(6, HUF_TABLELOG_MAX-1) +#define HUF_READ_STATS_WORKSPACE_SIZE (HUF_READ_STATS_WORKSPACE_SIZE_U32 * sizeof(unsigned)) +size_t HUF_readStats_wksp(BYTE* huffWeight, size_t hwSize, + U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize, + void* workspace, size_t wkspSize, + int flags); + +/** HUF_readCTable() : + * Loading a CTable saved with HUF_writeCTable() */ +size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize, unsigned *hasZeroWeights); + +/** HUF_getNbBitsFromCTable() : + * Read nbBits from CTable symbolTable, for symbol `symbolValue` presumed <= HUF_SYMBOLVALUE_MAX + * Note 1 : is not inlined, as HUF_CElt definition is private */ +U32 HUF_getNbBitsFromCTable(const HUF_CElt* symbolTable, U32 symbolValue); + +/* + * HUF_decompress() does the following: + * 1. select the decompression algorithm (X1, X2) based on pre-computed heuristics + * 2. build Huffman table from save, using HUF_readDTableX?() + * 3. decode 1 or 4 segments in parallel using HUF_decompress?X?_usingDTable() + */ + +/** HUF_selectDecoder() : + * Tells which decoder is likely to decode faster, + * based on a set of pre-computed metrics. + * @return : 0==HUF_decompress4X1, 1==HUF_decompress4X2 . + * Assumption : 0 < dstSize <= 128 KB */ +U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize); + +/** + * The minimum workspace size for the `workSpace` used in + * HUF_readDTableX1_wksp() and HUF_readDTableX2_wksp(). + * + * The space used depends on HUF_TABLELOG_MAX, ranging from ~1500 bytes when + * HUF_TABLE_LOG_MAX=12 to ~1850 bytes when HUF_TABLE_LOG_MAX=15. + * Buffer overflow errors may potentially occur if code modifications result in + * a required workspace size greater than that specified in the following + * macro. + */ +#define HUF_DECOMPRESS_WORKSPACE_SIZE ((2 << 10) + (1 << 9)) +#define HUF_DECOMPRESS_WORKSPACE_SIZE_U32 (HUF_DECOMPRESS_WORKSPACE_SIZE / sizeof(U32)) + + +/* ====================== */ +/* single stream variants */ +/* ====================== */ + +size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int flags); +/** HUF_compress1X_repeat() : + * Same as HUF_compress1X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none. + * If it uses hufTable it does not modify hufTable or repeat. + * If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used. + * If preferRepeat then the old table will always be used if valid. + * If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */ +size_t HUF_compress1X_repeat(void* dst, size_t dstSize, + const void* src, size_t srcSize, + unsigned maxSymbolValue, unsigned tableLog, + void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */ + HUF_CElt* hufTable, HUF_repeat* repeat, int flags); + +size_t HUF_decompress1X_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags); +#ifndef HUF_FORCE_DECOMPRESS_X1 +size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags); /**< double-symbols decoder */ +#endif + +/* BMI2 variants. + * If the CPU has BMI2 support, pass bmi2=1, otherwise pass bmi2=0. + */ +size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int flags); +#ifndef HUF_FORCE_DECOMPRESS_X2 +size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags); +#endif +size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int flags); +size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags); +#ifndef HUF_FORCE_DECOMPRESS_X2 +size_t HUF_readDTableX1_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int flags); +#endif +#ifndef HUF_FORCE_DECOMPRESS_X1 +size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int flags); +#endif + +#endif /* HUF_H_298734234 */ + +#if defined (__cplusplus) +} +#endif +/**** ended inlining huf.h ****/ +/**** skipping file: bits.h ****/ + + +/*=== Version ===*/ +unsigned FSE_versionNumber(void) { return FSE_VERSION_NUMBER; } + + +/*=== Error Management ===*/ +unsigned FSE_isError(size_t code) { return ERR_isError(code); } +const char* FSE_getErrorName(size_t code) { return ERR_getErrorName(code); } + +unsigned HUF_isError(size_t code) { return ERR_isError(code); } +const char* HUF_getErrorName(size_t code) { return ERR_getErrorName(code); } + + +/*-************************************************************** +* FSE NCount encoding-decoding +****************************************************************/ +FORCE_INLINE_TEMPLATE +size_t FSE_readNCount_body(short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, + const void* headerBuffer, size_t hbSize) +{ + const BYTE* const istart = (const BYTE*) headerBuffer; + const BYTE* const iend = istart + hbSize; + const BYTE* ip = istart; + int nbBits; + int remaining; + int threshold; + U32 bitStream; + int bitCount; + unsigned charnum = 0; + unsigned const maxSV1 = *maxSVPtr + 1; + int previous0 = 0; + + if (hbSize < 8) { + /* This function only works when hbSize >= 8 */ + char buffer[8] = {0}; + ZSTD_memcpy(buffer, headerBuffer, hbSize); + { size_t const countSize = FSE_readNCount(normalizedCounter, maxSVPtr, tableLogPtr, + buffer, sizeof(buffer)); + if (FSE_isError(countSize)) return countSize; + if (countSize > hbSize) return ERROR(corruption_detected); + return countSize; + } } + assert(hbSize >= 8); + + /* init */ + ZSTD_memset(normalizedCounter, 0, (*maxSVPtr+1) * sizeof(normalizedCounter[0])); /* all symbols not present in NCount have a frequency of 0 */ + bitStream = MEM_readLE32(ip); + nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG; /* extract tableLog */ + if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return ERROR(tableLog_tooLarge); + bitStream >>= 4; + bitCount = 4; + *tableLogPtr = nbBits; + remaining = (1<> 1; + while (repeats >= 12) { + charnum += 3 * 12; + if (LIKELY(ip <= iend-7)) { + ip += 3; + } else { + bitCount -= (int)(8 * (iend - 7 - ip)); + bitCount &= 31; + ip = iend - 4; + } + bitStream = MEM_readLE32(ip) >> bitCount; + repeats = ZSTD_countTrailingZeros32(~bitStream | 0x80000000) >> 1; + } + charnum += 3 * repeats; + bitStream >>= 2 * repeats; + bitCount += 2 * repeats; + + /* Add the final repeat which isn't 0b11. */ + assert((bitStream & 3) < 3); + charnum += bitStream & 3; + bitCount += 2; + + /* This is an error, but break and return an error + * at the end, because returning out of a loop makes + * it harder for the compiler to optimize. + */ + if (charnum >= maxSV1) break; + + /* We don't need to set the normalized count to 0 + * because we already memset the whole buffer to 0. + */ + + if (LIKELY(ip <= iend-7) || (ip + (bitCount>>3) <= iend-4)) { + assert((bitCount >> 3) <= 3); /* For first condition to work */ + ip += bitCount>>3; + bitCount &= 7; + } else { + bitCount -= (int)(8 * (iend - 4 - ip)); + bitCount &= 31; + ip = iend - 4; + } + bitStream = MEM_readLE32(ip) >> bitCount; + } + { + int const max = (2*threshold-1) - remaining; + int count; + + if ((bitStream & (threshold-1)) < (U32)max) { + count = bitStream & (threshold-1); + bitCount += nbBits-1; + } else { + count = bitStream & (2*threshold-1); + if (count >= threshold) count -= max; + bitCount += nbBits; + } + + count--; /* extra accuracy */ + /* When it matters (small blocks), this is a + * predictable branch, because we don't use -1. + */ + if (count >= 0) { + remaining -= count; + } else { + assert(count == -1); + remaining += count; + } + normalizedCounter[charnum++] = (short)count; + previous0 = !count; + + assert(threshold > 1); + if (remaining < threshold) { + /* This branch can be folded into the + * threshold update condition because we + * know that threshold > 1. + */ + if (remaining <= 1) break; + nbBits = ZSTD_highbit32(remaining) + 1; + threshold = 1 << (nbBits - 1); + } + if (charnum >= maxSV1) break; + + if (LIKELY(ip <= iend-7) || (ip + (bitCount>>3) <= iend-4)) { + ip += bitCount>>3; + bitCount &= 7; + } else { + bitCount -= (int)(8 * (iend - 4 - ip)); + bitCount &= 31; + ip = iend - 4; + } + bitStream = MEM_readLE32(ip) >> bitCount; + } } + if (remaining != 1) return ERROR(corruption_detected); + /* Only possible when there are too many zeros. */ + if (charnum > maxSV1) return ERROR(maxSymbolValue_tooSmall); + if (bitCount > 32) return ERROR(corruption_detected); + *maxSVPtr = charnum-1; + + ip += (bitCount+7)>>3; + return ip-istart; +} + +/* Avoids the FORCE_INLINE of the _body() function. */ +static size_t FSE_readNCount_body_default( + short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, + const void* headerBuffer, size_t hbSize) +{ + return FSE_readNCount_body(normalizedCounter, maxSVPtr, tableLogPtr, headerBuffer, hbSize); +} + +#if DYNAMIC_BMI2 +BMI2_TARGET_ATTRIBUTE static size_t FSE_readNCount_body_bmi2( + short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, + const void* headerBuffer, size_t hbSize) +{ + return FSE_readNCount_body(normalizedCounter, maxSVPtr, tableLogPtr, headerBuffer, hbSize); +} +#endif + +size_t FSE_readNCount_bmi2( + short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, + const void* headerBuffer, size_t hbSize, int bmi2) +{ +#if DYNAMIC_BMI2 + if (bmi2) { + return FSE_readNCount_body_bmi2(normalizedCounter, maxSVPtr, tableLogPtr, headerBuffer, hbSize); + } +#endif + (void)bmi2; + return FSE_readNCount_body_default(normalizedCounter, maxSVPtr, tableLogPtr, headerBuffer, hbSize); +} + +size_t FSE_readNCount( + short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, + const void* headerBuffer, size_t hbSize) +{ + return FSE_readNCount_bmi2(normalizedCounter, maxSVPtr, tableLogPtr, headerBuffer, hbSize, /* bmi2 */ 0); +} + + +/*! HUF_readStats() : + Read compact Huffman tree, saved by HUF_writeCTable(). + `huffWeight` is destination buffer. + `rankStats` is assumed to be a table of at least HUF_TABLELOG_MAX U32. + @return : size read from `src` , or an error Code . + Note : Needed by HUF_readCTable() and HUF_readDTableX?() . +*/ +size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats, + U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize) +{ + U32 wksp[HUF_READ_STATS_WORKSPACE_SIZE_U32]; + return HUF_readStats_wksp(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, wksp, sizeof(wksp), /* flags */ 0); +} + +FORCE_INLINE_TEMPLATE size_t +HUF_readStats_body(BYTE* huffWeight, size_t hwSize, U32* rankStats, + U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize, + void* workSpace, size_t wkspSize, + int bmi2) +{ + U32 weightTotal; + const BYTE* ip = (const BYTE*) src; + size_t iSize; + size_t oSize; + + if (!srcSize) return ERROR(srcSize_wrong); + iSize = ip[0]; + /* ZSTD_memset(huffWeight, 0, hwSize); *//* is not necessary, even though some analyzer complain ... */ + + if (iSize >= 128) { /* special header */ + oSize = iSize - 127; + iSize = ((oSize+1)/2); + if (iSize+1 > srcSize) return ERROR(srcSize_wrong); + if (oSize >= hwSize) return ERROR(corruption_detected); + ip += 1; + { U32 n; + for (n=0; n> 4; + huffWeight[n+1] = ip[n/2] & 15; + } } } + else { /* header compressed with FSE (normal case) */ + if (iSize+1 > srcSize) return ERROR(srcSize_wrong); + /* max (hwSize-1) values decoded, as last one is implied */ + oSize = FSE_decompress_wksp_bmi2(huffWeight, hwSize-1, ip+1, iSize, 6, workSpace, wkspSize, bmi2); + if (FSE_isError(oSize)) return oSize; + } + + /* collect weight stats */ + ZSTD_memset(rankStats, 0, (HUF_TABLELOG_MAX + 1) * sizeof(U32)); + weightTotal = 0; + { U32 n; for (n=0; n HUF_TABLELOG_MAX) return ERROR(corruption_detected); + rankStats[huffWeight[n]]++; + weightTotal += (1 << huffWeight[n]) >> 1; + } } + if (weightTotal == 0) return ERROR(corruption_detected); + + /* get last non-null symbol weight (implied, total must be 2^n) */ + { U32 const tableLog = ZSTD_highbit32(weightTotal) + 1; + if (tableLog > HUF_TABLELOG_MAX) return ERROR(corruption_detected); + *tableLogPtr = tableLog; + /* determine last weight */ + { U32 const total = 1 << tableLog; + U32 const rest = total - weightTotal; + U32 const verif = 1 << ZSTD_highbit32(rest); + U32 const lastWeight = ZSTD_highbit32(rest) + 1; + if (verif != rest) return ERROR(corruption_detected); /* last value must be a clean power of 2 */ + huffWeight[oSize] = (BYTE)lastWeight; + rankStats[lastWeight]++; + } } + + /* check tree construction validity */ + if ((rankStats[1] < 2) || (rankStats[1] & 1)) return ERROR(corruption_detected); /* by construction : at least 2 elts of rank 1, must be even */ + + /* results */ + *nbSymbolsPtr = (U32)(oSize+1); + return iSize+1; +} + +/* Avoids the FORCE_INLINE of the _body() function. */ +static size_t HUF_readStats_body_default(BYTE* huffWeight, size_t hwSize, U32* rankStats, + U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize, + void* workSpace, size_t wkspSize) +{ + return HUF_readStats_body(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, workSpace, wkspSize, 0); +} + +#if DYNAMIC_BMI2 +static BMI2_TARGET_ATTRIBUTE size_t HUF_readStats_body_bmi2(BYTE* huffWeight, size_t hwSize, U32* rankStats, + U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize, + void* workSpace, size_t wkspSize) +{ + return HUF_readStats_body(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, workSpace, wkspSize, 1); +} +#endif + +size_t HUF_readStats_wksp(BYTE* huffWeight, size_t hwSize, U32* rankStats, + U32* nbSymbolsPtr, U32* tableLogPtr, + const void* src, size_t srcSize, + void* workSpace, size_t wkspSize, + int flags) +{ +#if DYNAMIC_BMI2 + if (flags & HUF_flags_bmi2) { + return HUF_readStats_body_bmi2(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, workSpace, wkspSize); + } +#endif + (void)flags; + return HUF_readStats_body_default(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, workSpace, wkspSize); +} +/**** ended inlining common/entropy_common.c ****/ +/**** start inlining common/error_private.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* The purpose of this file is to have a single list of error strings embedded in binary */ + +/**** skipping file: error_private.h ****/ + +const char* ERR_getErrorString(ERR_enum code) +{ +#ifdef ZSTD_STRIP_ERROR_STRINGS + (void)code; + return "Error strings stripped"; +#else + static const char* const notErrorCode = "Unspecified error code"; + switch( code ) + { + case PREFIX(no_error): return "No error detected"; + case PREFIX(GENERIC): return "Error (generic)"; + case PREFIX(prefix_unknown): return "Unknown frame descriptor"; + case PREFIX(version_unsupported): return "Version not supported"; + case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter"; + case PREFIX(frameParameter_windowTooLarge): return "Frame requires too much memory for decoding"; + case PREFIX(corruption_detected): return "Data corruption detected"; + case PREFIX(checksum_wrong): return "Restored data doesn't match checksum"; + case PREFIX(literals_headerWrong): return "Header of Literals' block doesn't respect format specification"; + case PREFIX(parameter_unsupported): return "Unsupported parameter"; + case PREFIX(parameter_combination_unsupported): return "Unsupported combination of parameters"; + case PREFIX(parameter_outOfBound): return "Parameter is out of bound"; + case PREFIX(init_missing): return "Context should be init first"; + case PREFIX(memory_allocation): return "Allocation error : not enough memory"; + case PREFIX(workSpace_tooSmall): return "workSpace buffer is not large enough"; + case PREFIX(stage_wrong): return "Operation not authorized at current processing stage"; + case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory : unsupported"; + case PREFIX(maxSymbolValue_tooLarge): return "Unsupported max Symbol Value : too large"; + case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small"; + case PREFIX(stabilityCondition_notRespected): return "pledged buffer stability condition is not respected"; + case PREFIX(dictionary_corrupted): return "Dictionary is corrupted"; + case PREFIX(dictionary_wrong): return "Dictionary mismatch"; + case PREFIX(dictionaryCreation_failed): return "Cannot create Dictionary from provided samples"; + case PREFIX(dstSize_tooSmall): return "Destination buffer is too small"; + case PREFIX(srcSize_wrong): return "Src size is incorrect"; + case PREFIX(dstBuffer_null): return "Operation on NULL destination buffer"; + case PREFIX(noForwardProgress_destFull): return "Operation made no progress over multiple calls, due to output buffer being full"; + case PREFIX(noForwardProgress_inputEmpty): return "Operation made no progress over multiple calls, due to input being empty"; + /* following error codes are not stable and may be removed or changed in a future version */ + case PREFIX(frameIndex_tooLarge): return "Frame index is too large"; + case PREFIX(seekableIO): return "An I/O error occurred when reading/seeking"; + case PREFIX(dstBuffer_wrong): return "Destination buffer is wrong"; + case PREFIX(srcBuffer_wrong): return "Source buffer is wrong"; + case PREFIX(sequenceProducer_failed): return "Block-level external sequence producer returned an error code"; + case PREFIX(externalSequences_invalid): return "External sequences are not valid"; + case PREFIX(maxCode): + default: return notErrorCode; + } +#endif +} +/**** ended inlining common/error_private.c ****/ +/**** start inlining common/fse_decompress.c ****/ +/* ****************************************************************** + * FSE : Finite State Entropy decoder + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy + * - Public forum : https://groups.google.com/forum/#!forum/lz4c + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + + +/* ************************************************************** +* Includes +****************************************************************/ +/**** skipping file: debug.h ****/ +/**** skipping file: bitstream.h ****/ +/**** skipping file: compiler.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: fse.h ****/ +/**** skipping file: error_private.h ****/ +#define ZSTD_DEPS_NEED_MALLOC +/**** skipping file: zstd_deps.h ****/ +/**** skipping file: bits.h ****/ + + +/* ************************************************************** +* Error Management +****************************************************************/ +#define FSE_isError ERR_isError +#define FSE_STATIC_ASSERT(c) DEBUG_STATIC_ASSERT(c) /* use only *after* variable declarations */ + + +/* ************************************************************** +* Templates +****************************************************************/ +/* + designed to be included + for type-specific functions (template emulation in C) + Objective is to write these functions only once, for improved maintenance +*/ + +/* safety checks */ +#ifndef FSE_FUNCTION_EXTENSION +# error "FSE_FUNCTION_EXTENSION must be defined" +#endif +#ifndef FSE_FUNCTION_TYPE +# error "FSE_FUNCTION_TYPE must be defined" +#endif + +/* Function names */ +#define FSE_CAT(X,Y) X##Y +#define FSE_FUNCTION_NAME(X,Y) FSE_CAT(X,Y) +#define FSE_TYPE_NAME(X,Y) FSE_CAT(X,Y) + +static size_t FSE_buildDTable_internal(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize) +{ + void* const tdPtr = dt+1; /* because *dt is unsigned, 32-bits aligned on 32-bits */ + FSE_DECODE_TYPE* const tableDecode = (FSE_DECODE_TYPE*) (tdPtr); + U16* symbolNext = (U16*)workSpace; + BYTE* spread = (BYTE*)(symbolNext + maxSymbolValue + 1); + + U32 const maxSV1 = maxSymbolValue + 1; + U32 const tableSize = 1 << tableLog; + U32 highThreshold = tableSize-1; + + /* Sanity Checks */ + if (FSE_BUILD_DTABLE_WKSP_SIZE(tableLog, maxSymbolValue) > wkspSize) return ERROR(maxSymbolValue_tooLarge); + if (maxSymbolValue > FSE_MAX_SYMBOL_VALUE) return ERROR(maxSymbolValue_tooLarge); + if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge); + + /* Init, lay down lowprob symbols */ + { FSE_DTableHeader DTableH; + DTableH.tableLog = (U16)tableLog; + DTableH.fastMode = 1; + { S16 const largeLimit= (S16)(1 << (tableLog-1)); + U32 s; + for (s=0; s= largeLimit) DTableH.fastMode=0; + symbolNext[s] = normalizedCounter[s]; + } } } + ZSTD_memcpy(dt, &DTableH, sizeof(DTableH)); + } + + /* Spread symbols */ + if (highThreshold == tableSize - 1) { + size_t const tableMask = tableSize-1; + size_t const step = FSE_TABLESTEP(tableSize); + /* First lay down the symbols in order. + * We use a uint64_t to lay down 8 bytes at a time. This reduces branch + * misses since small blocks generally have small table logs, so nearly + * all symbols have counts <= 8. We ensure we have 8 bytes at the end of + * our buffer to handle the over-write. + */ + { + U64 const add = 0x0101010101010101ull; + size_t pos = 0; + U64 sv = 0; + U32 s; + for (s=0; s highThreshold) position = (position + step) & tableMask; /* lowprob area */ + } } + if (position!=0) return ERROR(GENERIC); /* position must reach all cells once, otherwise normalizedCounter is incorrect */ + } + + /* Build Decoding table */ + { U32 u; + for (u=0; u sizeof(bitD.bitContainer)*8) /* This test must be static */ + BIT_reloadDStream(&bitD); + + op[1] = FSE_GETSYMBOL(&state2); + + if (FSE_MAX_TABLELOG*4+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */ + { if (BIT_reloadDStream(&bitD) > BIT_DStream_unfinished) { op+=2; break; } } + + op[2] = FSE_GETSYMBOL(&state1); + + if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */ + BIT_reloadDStream(&bitD); + + op[3] = FSE_GETSYMBOL(&state2); + } + + /* tail */ + /* note : BIT_reloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly BIT_DStream_completed */ + while (1) { + if (op>(omax-2)) return ERROR(dstSize_tooSmall); + *op++ = FSE_GETSYMBOL(&state1); + if (BIT_reloadDStream(&bitD)==BIT_DStream_overflow) { + *op++ = FSE_GETSYMBOL(&state2); + break; + } + + if (op>(omax-2)) return ERROR(dstSize_tooSmall); + *op++ = FSE_GETSYMBOL(&state2); + if (BIT_reloadDStream(&bitD)==BIT_DStream_overflow) { + *op++ = FSE_GETSYMBOL(&state1); + break; + } } + + return op-ostart; +} + +typedef struct { + short ncount[FSE_MAX_SYMBOL_VALUE + 1]; + FSE_DTable dtable[1]; /* Dynamically sized */ +} FSE_DecompressWksp; + + +FORCE_INLINE_TEMPLATE size_t FSE_decompress_wksp_body( + void* dst, size_t dstCapacity, + const void* cSrc, size_t cSrcSize, + unsigned maxLog, void* workSpace, size_t wkspSize, + int bmi2) +{ + const BYTE* const istart = (const BYTE*)cSrc; + const BYTE* ip = istart; + unsigned tableLog; + unsigned maxSymbolValue = FSE_MAX_SYMBOL_VALUE; + FSE_DecompressWksp* const wksp = (FSE_DecompressWksp*)workSpace; + + DEBUG_STATIC_ASSERT((FSE_MAX_SYMBOL_VALUE + 1) % 2 == 0); + if (wkspSize < sizeof(*wksp)) return ERROR(GENERIC); + + /* normal FSE decoding mode */ + { + size_t const NCountLength = FSE_readNCount_bmi2(wksp->ncount, &maxSymbolValue, &tableLog, istart, cSrcSize, bmi2); + if (FSE_isError(NCountLength)) return NCountLength; + if (tableLog > maxLog) return ERROR(tableLog_tooLarge); + assert(NCountLength <= cSrcSize); + ip += NCountLength; + cSrcSize -= NCountLength; + } + + if (FSE_DECOMPRESS_WKSP_SIZE(tableLog, maxSymbolValue) > wkspSize) return ERROR(tableLog_tooLarge); + assert(sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog) <= wkspSize); + workSpace = (BYTE*)workSpace + sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog); + wkspSize -= sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog); + + CHECK_F( FSE_buildDTable_internal(wksp->dtable, wksp->ncount, maxSymbolValue, tableLog, workSpace, wkspSize) ); + + { + const void* ptr = wksp->dtable; + const FSE_DTableHeader* DTableH = (const FSE_DTableHeader*)ptr; + const U32 fastMode = DTableH->fastMode; + + /* select fast mode (static) */ + if (fastMode) return FSE_decompress_usingDTable_generic(dst, dstCapacity, ip, cSrcSize, wksp->dtable, 1); + return FSE_decompress_usingDTable_generic(dst, dstCapacity, ip, cSrcSize, wksp->dtable, 0); + } +} + +/* Avoids the FORCE_INLINE of the _body() function. */ +static size_t FSE_decompress_wksp_body_default(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize) +{ + return FSE_decompress_wksp_body(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize, 0); +} + +#if DYNAMIC_BMI2 +BMI2_TARGET_ATTRIBUTE static size_t FSE_decompress_wksp_body_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize) +{ + return FSE_decompress_wksp_body(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize, 1); +} +#endif + +size_t FSE_decompress_wksp_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize, int bmi2) +{ +#if DYNAMIC_BMI2 + if (bmi2) { + return FSE_decompress_wksp_body_bmi2(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize); + } +#endif + (void)bmi2; + return FSE_decompress_wksp_body_default(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize); +} + +#endif /* FSE_COMMONDEFS_ONLY */ +/**** ended inlining common/fse_decompress.c ****/ +/**** start inlining common/zstd_common.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + + +/*-************************************* +* Dependencies +***************************************/ +#define ZSTD_DEPS_NEED_MALLOC +/**** skipping file: error_private.h ****/ +/**** start inlining zstd_internal.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_CCOMMON_H_MODULE +#define ZSTD_CCOMMON_H_MODULE + +/* this module contains definitions which must be identical + * across compression, decompression and dictBuilder. + * It also contains a few functions useful to at least 2 of them + * and which benefit from being inlined */ + +/*-************************************* +* Dependencies +***************************************/ +/**** skipping file: compiler.h ****/ +/**** start inlining cpu.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_COMMON_CPU_H +#define ZSTD_COMMON_CPU_H + +/** + * Implementation taken from folly/CpuId.h + * https://github.com/facebook/folly/blob/master/folly/CpuId.h + */ + +/**** skipping file: mem.h ****/ + +#ifdef _MSC_VER +#include +#endif + +typedef struct { + U32 f1c; + U32 f1d; + U32 f7b; + U32 f7c; +} ZSTD_cpuid_t; + +MEM_STATIC ZSTD_cpuid_t ZSTD_cpuid(void) { + U32 f1c = 0; + U32 f1d = 0; + U32 f7b = 0; + U32 f7c = 0; +#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) + int reg[4]; + __cpuid((int*)reg, 0); + { + int const n = reg[0]; + if (n >= 1) { + __cpuid((int*)reg, 1); + f1c = (U32)reg[2]; + f1d = (U32)reg[3]; + } + if (n >= 7) { + __cpuidex((int*)reg, 7, 0); + f7b = (U32)reg[1]; + f7c = (U32)reg[2]; + } + } +#elif defined(__i386__) && defined(__PIC__) && !defined(__clang__) && defined(__GNUC__) + /* The following block like the normal cpuid branch below, but gcc + * reserves ebx for use of its pic register so we must specially + * handle the save and restore to avoid clobbering the register + */ + U32 n; + __asm__( + "pushl %%ebx\n\t" + "cpuid\n\t" + "popl %%ebx\n\t" + : "=a"(n) + : "a"(0) + : "ecx", "edx"); + if (n >= 1) { + U32 f1a; + __asm__( + "pushl %%ebx\n\t" + "cpuid\n\t" + "popl %%ebx\n\t" + : "=a"(f1a), "=c"(f1c), "=d"(f1d) + : "a"(1)); + } + if (n >= 7) { + __asm__( + "pushl %%ebx\n\t" + "cpuid\n\t" + "movl %%ebx, %%eax\n\t" + "popl %%ebx" + : "=a"(f7b), "=c"(f7c) + : "a"(7), "c"(0) + : "edx"); + } +#elif defined(__x86_64__) || defined(_M_X64) || defined(__i386__) + U32 n; + __asm__("cpuid" : "=a"(n) : "a"(0) : "ebx", "ecx", "edx"); + if (n >= 1) { + U32 f1a; + __asm__("cpuid" : "=a"(f1a), "=c"(f1c), "=d"(f1d) : "a"(1) : "ebx"); + } + if (n >= 7) { + U32 f7a; + __asm__("cpuid" + : "=a"(f7a), "=b"(f7b), "=c"(f7c) + : "a"(7), "c"(0) + : "edx"); + } +#endif + { + ZSTD_cpuid_t cpuid; + cpuid.f1c = f1c; + cpuid.f1d = f1d; + cpuid.f7b = f7b; + cpuid.f7c = f7c; + return cpuid; + } +} + +#define X(name, r, bit) \ + MEM_STATIC int ZSTD_cpuid_##name(ZSTD_cpuid_t const cpuid) { \ + return ((cpuid.r) & (1U << bit)) != 0; \ + } + +/* cpuid(1): Processor Info and Feature Bits. */ +#define C(name, bit) X(name, f1c, bit) + C(sse3, 0) + C(pclmuldq, 1) + C(dtes64, 2) + C(monitor, 3) + C(dscpl, 4) + C(vmx, 5) + C(smx, 6) + C(eist, 7) + C(tm2, 8) + C(ssse3, 9) + C(cnxtid, 10) + C(fma, 12) + C(cx16, 13) + C(xtpr, 14) + C(pdcm, 15) + C(pcid, 17) + C(dca, 18) + C(sse41, 19) + C(sse42, 20) + C(x2apic, 21) + C(movbe, 22) + C(popcnt, 23) + C(tscdeadline, 24) + C(aes, 25) + C(xsave, 26) + C(osxsave, 27) + C(avx, 28) + C(f16c, 29) + C(rdrand, 30) +#undef C +#define D(name, bit) X(name, f1d, bit) + D(fpu, 0) + D(vme, 1) + D(de, 2) + D(pse, 3) + D(tsc, 4) + D(msr, 5) + D(pae, 6) + D(mce, 7) + D(cx8, 8) + D(apic, 9) + D(sep, 11) + D(mtrr, 12) + D(pge, 13) + D(mca, 14) + D(cmov, 15) + D(pat, 16) + D(pse36, 17) + D(psn, 18) + D(clfsh, 19) + D(ds, 21) + D(acpi, 22) + D(mmx, 23) + D(fxsr, 24) + D(sse, 25) + D(sse2, 26) + D(ss, 27) + D(htt, 28) + D(tm, 29) + D(pbe, 31) +#undef D + +/* cpuid(7): Extended Features. */ +#define B(name, bit) X(name, f7b, bit) + B(bmi1, 3) + B(hle, 4) + B(avx2, 5) + B(smep, 7) + B(bmi2, 8) + B(erms, 9) + B(invpcid, 10) + B(rtm, 11) + B(mpx, 14) + B(avx512f, 16) + B(avx512dq, 17) + B(rdseed, 18) + B(adx, 19) + B(smap, 20) + B(avx512ifma, 21) + B(pcommit, 22) + B(clflushopt, 23) + B(clwb, 24) + B(avx512pf, 26) + B(avx512er, 27) + B(avx512cd, 28) + B(sha, 29) + B(avx512bw, 30) + B(avx512vl, 31) +#undef B +#define C(name, bit) X(name, f7c, bit) + C(prefetchwt1, 0) + C(avx512vbmi, 1) +#undef C + +#undef X + +#endif /* ZSTD_COMMON_CPU_H */ +/**** ended inlining cpu.h ****/ +/**** skipping file: mem.h ****/ +/**** skipping file: debug.h ****/ +/**** skipping file: error_private.h ****/ +#define ZSTD_STATIC_LINKING_ONLY +/**** start inlining ../zstd.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef ZSTD_H_235446 +#define ZSTD_H_235446 + +/* ====== Dependencies ======*/ +#include /* INT_MAX */ +#include /* size_t */ + + +/* ===== ZSTDLIB_API : control library symbols visibility ===== */ +#ifndef ZSTDLIB_VISIBLE + /* Backwards compatibility with old macro name */ +# ifdef ZSTDLIB_VISIBILITY +# define ZSTDLIB_VISIBLE ZSTDLIB_VISIBILITY +# elif defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDLIB_VISIBLE __attribute__ ((visibility ("default"))) +# else +# define ZSTDLIB_VISIBLE +# endif +#endif + +#ifndef ZSTDLIB_HIDDEN +# if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDLIB_HIDDEN __attribute__ ((visibility ("hidden"))) +# else +# define ZSTDLIB_HIDDEN +# endif +#endif + +#if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDLIB_API __declspec(dllexport) ZSTDLIB_VISIBLE +#elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDLIB_API __declspec(dllimport) ZSTDLIB_VISIBLE /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define ZSTDLIB_API ZSTDLIB_VISIBLE +#endif + +/* Deprecation warnings : + * Should these warnings be a problem, it is generally possible to disable them, + * typically with -Wno-deprecated-declarations for gcc or _CRT_SECURE_NO_WARNINGS in Visual. + * Otherwise, it's also possible to define ZSTD_DISABLE_DEPRECATE_WARNINGS. + */ +#ifdef ZSTD_DISABLE_DEPRECATE_WARNINGS +# define ZSTD_DEPRECATED(message) /* disable deprecation warnings */ +#else +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define ZSTD_DEPRECATED(message) [[deprecated(message)]] +# elif (defined(GNUC) && (GNUC > 4 || (GNUC == 4 && GNUC_MINOR >= 5))) || defined(__clang__) +# define ZSTD_DEPRECATED(message) __attribute__((deprecated(message))) +# elif defined(__GNUC__) && (__GNUC__ >= 3) +# define ZSTD_DEPRECATED(message) __attribute__((deprecated)) +# elif defined(_MSC_VER) +# define ZSTD_DEPRECATED(message) __declspec(deprecated(message)) +# else +# pragma message("WARNING: You need to implement ZSTD_DEPRECATED for this compiler") +# define ZSTD_DEPRECATED(message) +# endif +#endif /* ZSTD_DISABLE_DEPRECATE_WARNINGS */ + + +/******************************************************************************* + Introduction + + zstd, short for Zstandard, is a fast lossless compression algorithm, targeting + real-time compression scenarios at zlib-level and better compression ratios. + The zstd compression library provides in-memory compression and decompression + functions. + + The library supports regular compression levels from 1 up to ZSTD_maxCLevel(), + which is currently 22. Levels >= 20, labeled `--ultra`, should be used with + caution, as they require more memory. The library also offers negative + compression levels, which extend the range of speed vs. ratio preferences. + The lower the level, the faster the speed (at the cost of compression). + + Compression can be done in: + - a single step (described as Simple API) + - a single step, reusing a context (described as Explicit context) + - unbounded multiple steps (described as Streaming compression) + + The compression ratio achievable on small data can be highly improved using + a dictionary. Dictionary compression can be performed in: + - a single step (described as Simple dictionary API) + - a single step, reusing a dictionary (described as Bulk-processing + dictionary API) + + Advanced experimental functions can be accessed using + `#define ZSTD_STATIC_LINKING_ONLY` before including zstd.h. + + Advanced experimental APIs should never be used with a dynamically-linked + library. They are not "stable"; their definitions or signatures may change in + the future. Only static linking is allowed. +*******************************************************************************/ + +/*------ Version ------*/ +#define ZSTD_VERSION_MAJOR 1 +#define ZSTD_VERSION_MINOR 5 +#define ZSTD_VERSION_RELEASE 5 +#define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE) + +/*! ZSTD_versionNumber() : + * Return runtime library version, the value is (MAJOR*100*100 + MINOR*100 + RELEASE). */ +ZSTDLIB_API unsigned ZSTD_versionNumber(void); + +#define ZSTD_LIB_VERSION ZSTD_VERSION_MAJOR.ZSTD_VERSION_MINOR.ZSTD_VERSION_RELEASE +#define ZSTD_QUOTE(str) #str +#define ZSTD_EXPAND_AND_QUOTE(str) ZSTD_QUOTE(str) +#define ZSTD_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LIB_VERSION) + +/*! ZSTD_versionString() : + * Return runtime library version, like "1.4.5". Requires v1.3.0+. */ +ZSTDLIB_API const char* ZSTD_versionString(void); + +/* ************************************* + * Default constant + ***************************************/ +#ifndef ZSTD_CLEVEL_DEFAULT +# define ZSTD_CLEVEL_DEFAULT 3 +#endif + +/* ************************************* + * Constants + ***************************************/ + +/* All magic numbers are supposed read/written to/from files/memory using little-endian convention */ +#define ZSTD_MAGICNUMBER 0xFD2FB528 /* valid since v0.8.0 */ +#define ZSTD_MAGIC_DICTIONARY 0xEC30A437 /* valid since v0.7.0 */ +#define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50 /* all 16 values, from 0x184D2A50 to 0x184D2A5F, signal the beginning of a skippable frame */ +#define ZSTD_MAGIC_SKIPPABLE_MASK 0xFFFFFFF0 + +#define ZSTD_BLOCKSIZELOG_MAX 17 +#define ZSTD_BLOCKSIZE_MAX (1<= ZSTD_compressBound(srcSize)` guarantees that zstd will have + * enough space to successfully compress the data. + * @return : compressed size written into `dst` (<= `dstCapacity), + * or an error code if it fails (which can be tested using ZSTD_isError()). */ +ZSTDLIB_API size_t ZSTD_compress( void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + int compressionLevel); + +/*! ZSTD_decompress() : + * `compressedSize` : must be the _exact_ size of some number of compressed and/or skippable frames. + * `dstCapacity` is an upper bound of originalSize to regenerate. + * If user cannot imply a maximum upper bound, it's better to use streaming mode to decompress data. + * @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), + * or an errorCode if it fails (which can be tested using ZSTD_isError()). */ +ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity, + const void* src, size_t compressedSize); + +/*! ZSTD_getFrameContentSize() : requires v1.3.0+ + * `src` should point to the start of a ZSTD encoded frame. + * `srcSize` must be at least as large as the frame header. + * hint : any size >= `ZSTD_frameHeaderSize_max` is large enough. + * @return : - decompressed size of `src` frame content, if known + * - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined + * - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) + * note 1 : a 0 return value means the frame is valid but "empty". + * note 2 : decompressed size is an optional field, it may not be present, typically in streaming mode. + * When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. + * In which case, it's necessary to use streaming mode to decompress data. + * Optionally, application can rely on some implicit limit, + * as ZSTD_decompress() only needs an upper bound of decompressed size. + * (For example, data could be necessarily cut into blocks <= 16 KB). + * note 3 : decompressed size is always present when compression is completed using single-pass functions, + * such as ZSTD_compress(), ZSTD_compressCCtx() ZSTD_compress_usingDict() or ZSTD_compress_usingCDict(). + * note 4 : decompressed size can be very large (64-bits value), + * potentially larger than what local system can handle as a single memory segment. + * In which case, it's necessary to use streaming mode to decompress data. + * note 5 : If source is untrusted, decompressed size could be wrong or intentionally modified. + * Always ensure return value fits within application's authorized limits. + * Each application can set its own limits. + * note 6 : This function replaces ZSTD_getDecompressedSize() */ +#define ZSTD_CONTENTSIZE_UNKNOWN (0ULL - 1) +#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2) +ZSTDLIB_API unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize); + +/*! ZSTD_getDecompressedSize() : + * NOTE: This function is now obsolete, in favor of ZSTD_getFrameContentSize(). + * Both functions work the same way, but ZSTD_getDecompressedSize() blends + * "empty", "unknown" and "error" results to the same return value (0), + * while ZSTD_getFrameContentSize() gives them separate return values. + * @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise. */ +ZSTD_DEPRECATED("Replaced by ZSTD_getFrameContentSize") +ZSTDLIB_API +unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize); + +/*! ZSTD_findFrameCompressedSize() : Requires v1.4.0+ + * `src` should point to the start of a ZSTD frame or skippable frame. + * `srcSize` must be >= first frame size + * @return : the compressed size of the first frame starting at `src`, + * suitable to pass as `srcSize` to `ZSTD_decompress` or similar, + * or an error code if input is invalid */ +ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize); + + +/*====== Helper functions ======*/ +/* ZSTD_compressBound() : + * maximum compressed size in worst case single-pass scenario. + * When invoking `ZSTD_compress()` or any other one-pass compression function, + * it's recommended to provide @dstCapacity >= ZSTD_compressBound(srcSize) + * as it eliminates one potential failure scenario, + * aka not enough room in dst buffer to write the compressed frame. + * Note : ZSTD_compressBound() itself can fail, if @srcSize > ZSTD_MAX_INPUT_SIZE . + * In which case, ZSTD_compressBound() will return an error code + * which can be tested using ZSTD_isError(). + * + * ZSTD_COMPRESSBOUND() : + * same as ZSTD_compressBound(), but as a macro. + * It can be used to produce constants, which can be useful for static allocation, + * for example to size a static array on stack. + * Will produce constant value 0 if srcSize too large. + */ +#define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00LLU : 0xFF00FF00U) +#define ZSTD_COMPRESSBOUND(srcSize) (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0)) /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */ +ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */ +/* ZSTD_isError() : + * Most ZSTD_* functions returning a size_t value can be tested for error, + * using ZSTD_isError(). + * @return 1 if error, 0 otherwise + */ +ZSTDLIB_API unsigned ZSTD_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ +ZSTDLIB_API const char* ZSTD_getErrorName(size_t code); /*!< provides readable string from an error code */ +ZSTDLIB_API int ZSTD_minCLevel(void); /*!< minimum negative compression level allowed, requires v1.4.0+ */ +ZSTDLIB_API int ZSTD_maxCLevel(void); /*!< maximum compression level available */ +ZSTDLIB_API int ZSTD_defaultCLevel(void); /*!< default compression level, specified by ZSTD_CLEVEL_DEFAULT, requires v1.5.0+ */ + + +/*************************************** +* Explicit context +***************************************/ +/*= Compression context + * When compressing many times, + * it is recommended to allocate a context just once, + * and re-use it for each successive compression operation. + * This will make workload friendlier for system's memory. + * Note : re-using context is just a speed / resource optimization. + * It doesn't change the compression ratio, which remains identical. + * Note 2 : In multi-threaded environments, + * use one different context per thread for parallel execution. + */ +typedef struct ZSTD_CCtx_s ZSTD_CCtx; +ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void); +ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx); /* accept NULL pointer */ + +/*! ZSTD_compressCCtx() : + * Same as ZSTD_compress(), using an explicit ZSTD_CCtx. + * Important : in order to behave similarly to `ZSTD_compress()`, + * this function compresses at requested compression level, + * __ignoring any other parameter__ . + * If any advanced parameter was set using the advanced API, + * they will all be reset. Only `compressionLevel` remains. + */ +ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + int compressionLevel); + +/*= Decompression context + * When decompressing many times, + * it is recommended to allocate a context only once, + * and re-use it for each successive compression operation. + * This will make workload friendlier for system's memory. + * Use one context per thread for parallel execution. */ +typedef struct ZSTD_DCtx_s ZSTD_DCtx; +ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void); +ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); /* accept NULL pointer */ + +/*! ZSTD_decompressDCtx() : + * Same as ZSTD_decompress(), + * requires an allocated ZSTD_DCtx. + * Compatible with sticky parameters. + */ +ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize); + + +/********************************************* +* Advanced compression API (Requires v1.4.0+) +**********************************************/ + +/* API design : + * Parameters are pushed one by one into an existing context, + * using ZSTD_CCtx_set*() functions. + * Pushed parameters are sticky : they are valid for next compressed frame, and any subsequent frame. + * "sticky" parameters are applicable to `ZSTD_compress2()` and `ZSTD_compressStream*()` ! + * __They do not apply to "simple" one-shot variants such as ZSTD_compressCCtx()__ . + * + * It's possible to reset all parameters to "default" using ZSTD_CCtx_reset(). + * + * This API supersedes all other "advanced" API entry points in the experimental section. + * In the future, we expect to remove from experimental API entry points which are redundant with this API. + */ + + +/* Compression strategies, listed from fastest to strongest */ +typedef enum { ZSTD_fast=1, + ZSTD_dfast=2, + ZSTD_greedy=3, + ZSTD_lazy=4, + ZSTD_lazy2=5, + ZSTD_btlazy2=6, + ZSTD_btopt=7, + ZSTD_btultra=8, + ZSTD_btultra2=9 + /* note : new strategies _might_ be added in the future. + Only the order (from fast to strong) is guaranteed */ +} ZSTD_strategy; + +typedef enum { + + /* compression parameters + * Note: When compressing with a ZSTD_CDict these parameters are superseded + * by the parameters used to construct the ZSTD_CDict. + * See ZSTD_CCtx_refCDict() for more info (superseded-by-cdict). */ + ZSTD_c_compressionLevel=100, /* Set compression parameters according to pre-defined cLevel table. + * Note that exact compression parameters are dynamically determined, + * depending on both compression level and srcSize (when known). + * Default level is ZSTD_CLEVEL_DEFAULT==3. + * Special: value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT. + * Note 1 : it's possible to pass a negative compression level. + * Note 2 : setting a level does not automatically set all other compression parameters + * to default. Setting this will however eventually dynamically impact the compression + * parameters which have not been manually set. The manually set + * ones will 'stick'. */ + /* Advanced compression parameters : + * It's possible to pin down compression parameters to some specific values. + * In which case, these values are no longer dynamically selected by the compressor */ + ZSTD_c_windowLog=101, /* Maximum allowed back-reference distance, expressed as power of 2. + * This will set a memory budget for streaming decompression, + * with larger values requiring more memory + * and typically compressing more. + * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX. + * Special: value 0 means "use default windowLog". + * Note: Using a windowLog greater than ZSTD_WINDOWLOG_LIMIT_DEFAULT + * requires explicitly allowing such size at streaming decompression stage. */ + ZSTD_c_hashLog=102, /* Size of the initial probe table, as a power of 2. + * Resulting memory usage is (1 << (hashLog+2)). + * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX. + * Larger tables improve compression ratio of strategies <= dFast, + * and improve speed of strategies > dFast. + * Special: value 0 means "use default hashLog". */ + ZSTD_c_chainLog=103, /* Size of the multi-probe search table, as a power of 2. + * Resulting memory usage is (1 << (chainLog+2)). + * Must be clamped between ZSTD_CHAINLOG_MIN and ZSTD_CHAINLOG_MAX. + * Larger tables result in better and slower compression. + * This parameter is useless for "fast" strategy. + * It's still useful when using "dfast" strategy, + * in which case it defines a secondary probe table. + * Special: value 0 means "use default chainLog". */ + ZSTD_c_searchLog=104, /* Number of search attempts, as a power of 2. + * More attempts result in better and slower compression. + * This parameter is useless for "fast" and "dFast" strategies. + * Special: value 0 means "use default searchLog". */ + ZSTD_c_minMatch=105, /* Minimum size of searched matches. + * Note that Zstandard can still find matches of smaller size, + * it just tweaks its search algorithm to look for this size and larger. + * Larger values increase compression and decompression speed, but decrease ratio. + * Must be clamped between ZSTD_MINMATCH_MIN and ZSTD_MINMATCH_MAX. + * Note that currently, for all strategies < btopt, effective minimum is 4. + * , for all strategies > fast, effective maximum is 6. + * Special: value 0 means "use default minMatchLength". */ + ZSTD_c_targetLength=106, /* Impact of this field depends on strategy. + * For strategies btopt, btultra & btultra2: + * Length of Match considered "good enough" to stop search. + * Larger values make compression stronger, and slower. + * For strategy fast: + * Distance between match sampling. + * Larger values make compression faster, and weaker. + * Special: value 0 means "use default targetLength". */ + ZSTD_c_strategy=107, /* See ZSTD_strategy enum definition. + * The higher the value of selected strategy, the more complex it is, + * resulting in stronger and slower compression. + * Special: value 0 means "use default strategy". */ + /* LDM mode parameters */ + ZSTD_c_enableLongDistanceMatching=160, /* Enable long distance matching. + * This parameter is designed to improve compression ratio + * for large inputs, by finding large matches at long distance. + * It increases memory usage and window size. + * Note: enabling this parameter increases default ZSTD_c_windowLog to 128 MB + * except when expressly set to a different value. + * Note: will be enabled by default if ZSTD_c_windowLog >= 128 MB and + * compression strategy >= ZSTD_btopt (== compression level 16+) */ + ZSTD_c_ldmHashLog=161, /* Size of the table for long distance matching, as a power of 2. + * Larger values increase memory usage and compression ratio, + * but decrease compression speed. + * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX + * default: windowlog - 7. + * Special: value 0 means "automatically determine hashlog". */ + ZSTD_c_ldmMinMatch=162, /* Minimum match size for long distance matcher. + * Larger/too small values usually decrease compression ratio. + * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX. + * Special: value 0 means "use default value" (default: 64). */ + ZSTD_c_ldmBucketSizeLog=163, /* Log size of each bucket in the LDM hash table for collision resolution. + * Larger values improve collision resolution but decrease compression speed. + * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX. + * Special: value 0 means "use default value" (default: 3). */ + ZSTD_c_ldmHashRateLog=164, /* Frequency of inserting/looking up entries into the LDM hash table. + * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN). + * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage. + * Larger values improve compression speed. + * Deviating far from default value will likely result in a compression ratio decrease. + * Special: value 0 means "automatically determine hashRateLog". */ + + /* frame parameters */ + ZSTD_c_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1) + * Content size must be known at the beginning of compression. + * This is automatically the case when using ZSTD_compress2(), + * For streaming scenarios, content size must be provided with ZSTD_CCtx_setPledgedSrcSize() */ + ZSTD_c_checksumFlag=201, /* A 32-bits checksum of content is written at end of frame (default:0) */ + ZSTD_c_dictIDFlag=202, /* When applicable, dictionary's ID is written into frame header (default:1) */ + + /* multi-threading parameters */ + /* These parameters are only active if multi-threading is enabled (compiled with build macro ZSTD_MULTITHREAD). + * Otherwise, trying to set any other value than default (0) will be a no-op and return an error. + * In a situation where it's unknown if the linked library supports multi-threading or not, + * setting ZSTD_c_nbWorkers to any value >= 1 and consulting the return value provides a quick way to check this property. + */ + ZSTD_c_nbWorkers=400, /* Select how many threads will be spawned to compress in parallel. + * When nbWorkers >= 1, triggers asynchronous mode when invoking ZSTD_compressStream*() : + * ZSTD_compressStream*() consumes input and flush output if possible, but immediately gives back control to caller, + * while compression is performed in parallel, within worker thread(s). + * (note : a strong exception to this rule is when first invocation of ZSTD_compressStream2() sets ZSTD_e_end : + * in which case, ZSTD_compressStream2() delegates to ZSTD_compress2(), which is always a blocking call). + * More workers improve speed, but also increase memory usage. + * Default value is `0`, aka "single-threaded mode" : no worker is spawned, + * compression is performed inside Caller's thread, and all invocations are blocking */ + ZSTD_c_jobSize=401, /* Size of a compression job. This value is enforced only when nbWorkers >= 1. + * Each compression job is completed in parallel, so this value can indirectly impact the nb of active threads. + * 0 means default, which is dynamically determined based on compression parameters. + * Job size must be a minimum of overlap size, or ZSTDMT_JOBSIZE_MIN (= 512 KB), whichever is largest. + * The minimum size is automatically and transparently enforced. */ + ZSTD_c_overlapLog=402, /* Control the overlap size, as a fraction of window size. + * The overlap size is an amount of data reloaded from previous job at the beginning of a new job. + * It helps preserve compression ratio, while each job is compressed in parallel. + * This value is enforced only when nbWorkers >= 1. + * Larger values increase compression ratio, but decrease speed. + * Possible values range from 0 to 9 : + * - 0 means "default" : value will be determined by the library, depending on strategy + * - 1 means "no overlap" + * - 9 means "full overlap", using a full window size. + * Each intermediate rank increases/decreases load size by a factor 2 : + * 9: full window; 8: w/2; 7: w/4; 6: w/8; 5:w/16; 4: w/32; 3:w/64; 2:w/128; 1:no overlap; 0:default + * default value varies between 6 and 9, depending on strategy */ + + /* note : additional experimental parameters are also available + * within the experimental section of the API. + * At the time of this writing, they include : + * ZSTD_c_rsyncable + * ZSTD_c_format + * ZSTD_c_forceMaxWindow + * ZSTD_c_forceAttachDict + * ZSTD_c_literalCompressionMode + * ZSTD_c_targetCBlockSize + * ZSTD_c_srcSizeHint + * ZSTD_c_enableDedicatedDictSearch + * ZSTD_c_stableInBuffer + * ZSTD_c_stableOutBuffer + * ZSTD_c_blockDelimiters + * ZSTD_c_validateSequences + * ZSTD_c_useBlockSplitter + * ZSTD_c_useRowMatchFinder + * ZSTD_c_prefetchCDictTables + * ZSTD_c_enableSeqProducerFallback + * ZSTD_c_maxBlockSize + * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. + * note : never ever use experimentalParam? names directly; + * also, the enums values themselves are unstable and can still change. + */ + ZSTD_c_experimentalParam1=500, + ZSTD_c_experimentalParam2=10, + ZSTD_c_experimentalParam3=1000, + ZSTD_c_experimentalParam4=1001, + ZSTD_c_experimentalParam5=1002, + ZSTD_c_experimentalParam6=1003, + ZSTD_c_experimentalParam7=1004, + ZSTD_c_experimentalParam8=1005, + ZSTD_c_experimentalParam9=1006, + ZSTD_c_experimentalParam10=1007, + ZSTD_c_experimentalParam11=1008, + ZSTD_c_experimentalParam12=1009, + ZSTD_c_experimentalParam13=1010, + ZSTD_c_experimentalParam14=1011, + ZSTD_c_experimentalParam15=1012, + ZSTD_c_experimentalParam16=1013, + ZSTD_c_experimentalParam17=1014, + ZSTD_c_experimentalParam18=1015, + ZSTD_c_experimentalParam19=1016 +} ZSTD_cParameter; + +typedef struct { + size_t error; + int lowerBound; + int upperBound; +} ZSTD_bounds; + +/*! ZSTD_cParam_getBounds() : + * All parameters must belong to an interval with lower and upper bounds, + * otherwise they will either trigger an error or be automatically clamped. + * @return : a structure, ZSTD_bounds, which contains + * - an error status field, which must be tested using ZSTD_isError() + * - lower and upper bounds, both inclusive + */ +ZSTDLIB_API ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter cParam); + +/*! ZSTD_CCtx_setParameter() : + * Set one compression parameter, selected by enum ZSTD_cParameter. + * All parameters have valid bounds. Bounds can be queried using ZSTD_cParam_getBounds(). + * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). + * Setting a parameter is generally only possible during frame initialization (before starting compression). + * Exception : when using multi-threading mode (nbWorkers >= 1), + * the following parameters can be updated _during_ compression (within same frame): + * => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy. + * new parameters will be active for next job only (after a flush()). + * @return : an error code (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value); + +/*! ZSTD_CCtx_setPledgedSrcSize() : + * Total input data size to be compressed as a single frame. + * Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag. + * This value will also be controlled at end of frame, and trigger an error if not respected. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame. + * In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN. + * ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame. + * Note 2 : pledgedSrcSize is only valid once, for the next frame. + * It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN. + * Note 3 : Whenever all input data is provided and consumed in a single round, + * for example with ZSTD_compress2(), + * or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end), + * this value is automatically overridden by srcSize instead. + */ +ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize); + +typedef enum { + ZSTD_reset_session_only = 1, + ZSTD_reset_parameters = 2, + ZSTD_reset_session_and_parameters = 3 +} ZSTD_ResetDirective; + +/*! ZSTD_CCtx_reset() : + * There are 2 different things that can be reset, independently or jointly : + * - The session : will stop compressing current frame, and make CCtx ready to start a new one. + * Useful after an error, or to interrupt any ongoing compression. + * Any internal data not yet flushed is cancelled. + * Compression parameters and dictionary remain unchanged. + * They will be used to compress next frame. + * Resetting session never fails. + * - The parameters : changes all parameters back to "default". + * This also removes any reference to any dictionary or external sequence producer. + * Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing) + * otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError()) + * - Both : similar to resetting the session, followed by resetting parameters. + */ +ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset); + +/*! ZSTD_compress2() : + * Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API. + * ZSTD_compress2() always starts a new frame. + * Should cctx hold data from a previously unfinished frame, everything about it is forgotten. + * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() + * - The function is always blocking, returns when compression is completed. + * NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have + * enough space to successfully compress the data, though it is possible it fails for other reasons. + * @return : compressed size written into `dst` (<= `dstCapacity), + * or an error code if it fails (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_API size_t ZSTD_compress2( ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize); + + +/*********************************************** +* Advanced decompression API (Requires v1.4.0+) +************************************************/ + +/* The advanced API pushes parameters one by one into an existing DCtx context. + * Parameters are sticky, and remain valid for all following frames + * using the same DCtx context. + * It's possible to reset parameters to default values using ZSTD_DCtx_reset(). + * Note : This API is compatible with existing ZSTD_decompressDCtx() and ZSTD_decompressStream(). + * Therefore, no new decompression function is necessary. + */ + +typedef enum { + + ZSTD_d_windowLogMax=100, /* Select a size limit (in power of 2) beyond which + * the streaming API will refuse to allocate memory buffer + * in order to protect the host from unreasonable memory requirements. + * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode. + * By default, a decompression context accepts window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT). + * Special: value 0 means "use default maximum windowLog". */ + + /* note : additional experimental parameters are also available + * within the experimental section of the API. + * At the time of this writing, they include : + * ZSTD_d_format + * ZSTD_d_stableOutBuffer + * ZSTD_d_forceIgnoreChecksum + * ZSTD_d_refMultipleDDicts + * ZSTD_d_disableHuffmanAssembly + * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. + * note : never ever use experimentalParam? names directly + */ + ZSTD_d_experimentalParam1=1000, + ZSTD_d_experimentalParam2=1001, + ZSTD_d_experimentalParam3=1002, + ZSTD_d_experimentalParam4=1003, + ZSTD_d_experimentalParam5=1004 + +} ZSTD_dParameter; + +/*! ZSTD_dParam_getBounds() : + * All parameters must belong to an interval with lower and upper bounds, + * otherwise they will either trigger an error or be automatically clamped. + * @return : a structure, ZSTD_bounds, which contains + * - an error status field, which must be tested using ZSTD_isError() + * - both lower and upper bounds, inclusive + */ +ZSTDLIB_API ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam); + +/*! ZSTD_DCtx_setParameter() : + * Set one compression parameter, selected by enum ZSTD_dParameter. + * All parameters have valid bounds. Bounds can be queried using ZSTD_dParam_getBounds(). + * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). + * Setting a parameter is only possible during frame initialization (before starting decompression). + * @return : 0, or an error code (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_API size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int value); + +/*! ZSTD_DCtx_reset() : + * Return a DCtx to clean state. + * Session and parameters can be reset jointly or separately. + * Parameters can only be reset when no active frame is being decompressed. + * @return : 0, or an error code, which can be tested with ZSTD_isError() + */ +ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset); + + +/**************************** +* Streaming +****************************/ + +typedef struct ZSTD_inBuffer_s { + const void* src; /**< start of input buffer */ + size_t size; /**< size of input buffer */ + size_t pos; /**< position where reading stopped. Will be updated. Necessarily 0 <= pos <= size */ +} ZSTD_inBuffer; + +typedef struct ZSTD_outBuffer_s { + void* dst; /**< start of output buffer */ + size_t size; /**< size of output buffer */ + size_t pos; /**< position where writing stopped. Will be updated. Necessarily 0 <= pos <= size */ +} ZSTD_outBuffer; + + + +/*-*********************************************************************** +* Streaming compression - HowTo +* +* A ZSTD_CStream object is required to track streaming operation. +* Use ZSTD_createCStream() and ZSTD_freeCStream() to create/release resources. +* ZSTD_CStream objects can be reused multiple times on consecutive compression operations. +* It is recommended to re-use ZSTD_CStream since it will play nicer with system's memory, by re-using already allocated memory. +* +* For parallel execution, use one separate ZSTD_CStream per thread. +* +* note : since v1.3.0, ZSTD_CStream and ZSTD_CCtx are the same thing. +* +* Parameters are sticky : when starting a new compression on the same context, +* it will re-use the same sticky parameters as previous compression session. +* When in doubt, it's recommended to fully initialize the context before usage. +* Use ZSTD_CCtx_reset() to reset the context and ZSTD_CCtx_setParameter(), +* ZSTD_CCtx_setPledgedSrcSize(), or ZSTD_CCtx_loadDictionary() and friends to +* set more specific parameters, the pledged source size, or load a dictionary. +* +* Use ZSTD_compressStream2() with ZSTD_e_continue as many times as necessary to +* consume input stream. The function will automatically update both `pos` +* fields within `input` and `output`. +* Note that the function may not consume the entire input, for example, because +* the output buffer is already full, in which case `input.pos < input.size`. +* The caller must check if input has been entirely consumed. +* If not, the caller must make some room to receive more compressed data, +* and then present again remaining input data. +* note: ZSTD_e_continue is guaranteed to make some forward progress when called, +* but doesn't guarantee maximal forward progress. This is especially relevant +* when compressing with multiple threads. The call won't block if it can +* consume some input, but if it can't it will wait for some, but not all, +* output to be flushed. +* @return : provides a minimum amount of data remaining to be flushed from internal buffers +* or an error code, which can be tested using ZSTD_isError(). +* +* At any moment, it's possible to flush whatever data might remain stuck within internal buffer, +* using ZSTD_compressStream2() with ZSTD_e_flush. `output->pos` will be updated. +* Note that, if `output->size` is too small, a single invocation with ZSTD_e_flush might not be enough (return code > 0). +* In which case, make some room to receive more compressed data, and call again ZSTD_compressStream2() with ZSTD_e_flush. +* You must continue calling ZSTD_compressStream2() with ZSTD_e_flush until it returns 0, at which point you can change the +* operation. +* note: ZSTD_e_flush will flush as much output as possible, meaning when compressing with multiple threads, it will +* block until the flush is complete or the output buffer is full. +* @return : 0 if internal buffers are entirely flushed, +* >0 if some data still present within internal buffer (the value is minimal estimation of remaining size), +* or an error code, which can be tested using ZSTD_isError(). +* +* Calling ZSTD_compressStream2() with ZSTD_e_end instructs to finish a frame. +* It will perform a flush and write frame epilogue. +* The epilogue is required for decoders to consider a frame completed. +* flush operation is the same, and follows same rules as calling ZSTD_compressStream2() with ZSTD_e_flush. +* You must continue calling ZSTD_compressStream2() with ZSTD_e_end until it returns 0, at which point you are free to +* start a new frame. +* note: ZSTD_e_end will flush as much output as possible, meaning when compressing with multiple threads, it will +* block until the flush is complete or the output buffer is full. +* @return : 0 if frame fully completed and fully flushed, +* >0 if some data still present within internal buffer (the value is minimal estimation of remaining size), +* or an error code, which can be tested using ZSTD_isError(). +* +* *******************************************************************/ + +typedef ZSTD_CCtx ZSTD_CStream; /**< CCtx and CStream are now effectively same object (>= v1.3.0) */ + /* Continue to distinguish them for compatibility with older versions <= v1.2.0 */ +/*===== ZSTD_CStream management functions =====*/ +ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream(void); +ZSTDLIB_API size_t ZSTD_freeCStream(ZSTD_CStream* zcs); /* accept NULL pointer */ + +/*===== Streaming compression functions =====*/ +typedef enum { + ZSTD_e_continue=0, /* collect more data, encoder decides when to output compressed result, for optimal compression ratio */ + ZSTD_e_flush=1, /* flush any data provided so far, + * it creates (at least) one new block, that can be decoded immediately on reception; + * frame will continue: any future data can still reference previously compressed data, improving compression. + * note : multithreaded compression will block to flush as much output as possible. */ + ZSTD_e_end=2 /* flush any remaining data _and_ close current frame. + * note that frame is only closed after compressed data is fully flushed (return value == 0). + * After that point, any additional data starts a new frame. + * note : each frame is independent (does not reference any content from previous frame). + : note : multithreaded compression will block to flush as much output as possible. */ +} ZSTD_EndDirective; + +/*! ZSTD_compressStream2() : Requires v1.4.0+ + * Behaves about the same as ZSTD_compressStream, with additional control on end directive. + * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() + * - Compression parameters cannot be changed once compression is started (save a list of exceptions in multi-threading mode) + * - output->pos must be <= dstCapacity, input->pos must be <= srcSize + * - output->pos and input->pos will be updated. They are guaranteed to remain below their respective limit. + * - endOp must be a valid directive + * - When nbWorkers==0 (default), function is blocking : it completes its job before returning to caller. + * - When nbWorkers>=1, function is non-blocking : it copies a portion of input, distributes jobs to internal worker threads, flush to output whatever is available, + * and then immediately returns, just indicating that there is some data remaining to be flushed. + * The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte. + * - Exception : if the first call requests a ZSTD_e_end directive and provides enough dstCapacity, the function delegates to ZSTD_compress2() which is always blocking. + * - @return provides a minimum amount of data remaining to be flushed from internal buffers + * or an error code, which can be tested using ZSTD_isError(). + * if @return != 0, flush is not fully completed, there is still some data left within internal buffers. + * This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers. + * For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed. + * - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0), + * only ZSTD_e_end or ZSTD_e_flush operations are allowed. + * Before starting a new compression job, or changing compression parameters, + * it is required to fully flush internal buffers. + */ +ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, + ZSTD_outBuffer* output, + ZSTD_inBuffer* input, + ZSTD_EndDirective endOp); + + +/* These buffer sizes are softly recommended. + * They are not required : ZSTD_compressStream*() happily accepts any buffer size, for both input and output. + * Respecting the recommended size just makes it a bit easier for ZSTD_compressStream*(), + * reducing the amount of memory shuffling and buffering, resulting in minor performance savings. + * + * However, note that these recommendations are from the perspective of a C caller program. + * If the streaming interface is invoked from some other language, + * especially managed ones such as Java or Go, through a foreign function interface such as jni or cgo, + * a major performance rule is to reduce crossing such interface to an absolute minimum. + * It's not rare that performance ends being spent more into the interface, rather than compression itself. + * In which cases, prefer using large buffers, as large as practical, + * for both input and output, to reduce the nb of roundtrips. + */ +ZSTDLIB_API size_t ZSTD_CStreamInSize(void); /**< recommended size for input buffer */ +ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block. */ + + +/* ***************************************************************************** + * This following is a legacy streaming API, available since v1.0+ . + * It can be replaced by ZSTD_CCtx_reset() and ZSTD_compressStream2(). + * It is redundant, but remains fully supported. + ******************************************************************************/ + +/*! + * Equivalent to: + * + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) + * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * + * Note that ZSTD_initCStream() clears any previously set dictionary. Use the new API + * to compress with a dictionary. + */ +ZSTDLIB_API size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel); +/*! + * Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue). + * NOTE: The return value is different. ZSTD_compressStream() returns a hint for + * the next read size (if non-zero and not an error). ZSTD_compressStream2() + * returns the minimum nb of bytes left to flush (if non-zero and not an error). + */ +ZSTDLIB_API size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input); +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush). */ +ZSTDLIB_API size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end). */ +ZSTDLIB_API size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); + + +/*-*************************************************************************** +* Streaming decompression - HowTo +* +* A ZSTD_DStream object is required to track streaming operations. +* Use ZSTD_createDStream() and ZSTD_freeDStream() to create/release resources. +* ZSTD_DStream objects can be re-used multiple times. +* +* Use ZSTD_initDStream() to start a new decompression operation. +* @return : recommended first input size +* Alternatively, use advanced API to set specific properties. +* +* Use ZSTD_decompressStream() repetitively to consume your input. +* The function will update both `pos` fields. +* If `input.pos < input.size`, some input has not been consumed. +* It's up to the caller to present again remaining data. +* The function tries to flush all data decoded immediately, respecting output buffer size. +* If `output.pos < output.size`, decoder has flushed everything it could. +* But if `output.pos == output.size`, there might be some data left within internal buffers., +* In which case, call ZSTD_decompressStream() again to flush whatever remains in the buffer. +* Note : with no additional input provided, amount of data flushed is necessarily <= ZSTD_BLOCKSIZE_MAX. +* @return : 0 when a frame is completely decoded and fully flushed, +* or an error code, which can be tested using ZSTD_isError(), +* or any other value > 0, which means there is still some decoding or flushing to do to complete current frame : +* the return value is a suggested next input size (just a hint for better latency) +* that will never request more than the remaining frame size. +* *******************************************************************************/ + +typedef ZSTD_DCtx ZSTD_DStream; /**< DCtx and DStream are now effectively same object (>= v1.3.0) */ + /* For compatibility with versions <= v1.2.0, prefer differentiating them. */ +/*===== ZSTD_DStream management functions =====*/ +ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream(void); +ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer */ + +/*===== Streaming decompression functions =====*/ + +/*! ZSTD_initDStream() : + * Initialize/reset DStream state for new decompression operation. + * Call before new decompression operation using same DStream. + * + * Note : This function is redundant with the advanced API and equivalent to: + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * ZSTD_DCtx_refDDict(zds, NULL); + */ +ZSTDLIB_API size_t ZSTD_initDStream(ZSTD_DStream* zds); + +/*! ZSTD_decompressStream() : + * Streaming decompression function. + * Call repetitively to consume full input updating it as necessary. + * Function will update both input and output `pos` fields exposing current state via these fields: + * - `input.pos < input.size`, some input remaining and caller should provide remaining input + * on the next call. + * - `output.pos < output.size`, decoder finished and flushed all remaining buffers. + * - `output.pos == output.size`, potentially uncflushed data present in the internal buffers, + * call ZSTD_decompressStream() again to flush remaining data to output. + * Note : with no additional input, amount of data flushed <= ZSTD_BLOCKSIZE_MAX. + * + * @return : 0 when a frame is completely decoded and fully flushed, + * or an error code, which can be tested using ZSTD_isError(), + * or any other value > 0, which means there is some decoding or flushing to do to complete current frame. + */ +ZSTDLIB_API size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input); + +ZSTDLIB_API size_t ZSTD_DStreamInSize(void); /*!< recommended size for input buffer */ +ZSTDLIB_API size_t ZSTD_DStreamOutSize(void); /*!< recommended size for output buffer. Guarantee to successfully flush at least one complete block in all circumstances. */ + + +/************************** +* Simple dictionary API +***************************/ +/*! ZSTD_compress_usingDict() : + * Compression at an explicit compression level using a Dictionary. + * A dictionary can be any arbitrary data segment (also called a prefix), + * or a buffer with specified information (see zdict.h). + * Note : This function loads the dictionary, resulting in significant startup delay. + * It's intended for a dictionary used only once. + * Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used. */ +ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + int compressionLevel); + +/*! ZSTD_decompress_usingDict() : + * Decompression using a known Dictionary. + * Dictionary must be identical to the one used during compression. + * Note : This function loads the dictionary, resulting in significant startup delay. + * It's intended for a dictionary used only once. + * Note : When `dict == NULL || dictSize < 8` no dictionary is used. */ +ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize); + + +/*********************************** + * Bulk processing dictionary API + **********************************/ +typedef struct ZSTD_CDict_s ZSTD_CDict; + +/*! ZSTD_createCDict() : + * When compressing multiple messages or blocks using the same dictionary, + * it's recommended to digest the dictionary only once, since it's a costly operation. + * ZSTD_createCDict() will create a state from digesting a dictionary. + * The resulting state can be used for future compression operations with very limited startup cost. + * ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. + * @dictBuffer can be released after ZSTD_CDict creation, because its content is copied within CDict. + * Note 1 : Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate @dictBuffer content. + * Note 2 : A ZSTD_CDict can be created from an empty @dictBuffer, + * in which case the only thing that it transports is the @compressionLevel. + * This can be useful in a pipeline featuring ZSTD_compress_usingCDict() exclusively, + * expecting a ZSTD_CDict parameter with any data, including those without a known dictionary. */ +ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize, + int compressionLevel); + +/*! ZSTD_freeCDict() : + * Function frees memory allocated by ZSTD_createCDict(). + * If a NULL pointer is passed, no operation is performed. */ +ZSTDLIB_API size_t ZSTD_freeCDict(ZSTD_CDict* CDict); + +/*! ZSTD_compress_usingCDict() : + * Compression using a digested Dictionary. + * Recommended when same dictionary is used multiple times. + * Note : compression level is _decided at dictionary creation time_, + * and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) */ +ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_CDict* cdict); + + +typedef struct ZSTD_DDict_s ZSTD_DDict; + +/*! ZSTD_createDDict() : + * Create a digested dictionary, ready to start decompression operation without startup delay. + * dictBuffer can be released after DDict creation, as its content is copied inside DDict. */ +ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize); + +/*! ZSTD_freeDDict() : + * Function frees memory allocated with ZSTD_createDDict() + * If a NULL pointer is passed, no operation is performed. */ +ZSTDLIB_API size_t ZSTD_freeDDict(ZSTD_DDict* ddict); + +/*! ZSTD_decompress_usingDDict() : + * Decompression using a digested Dictionary. + * Recommended when same dictionary is used multiple times. */ +ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_DDict* ddict); + + +/******************************** + * Dictionary helper functions + *******************************/ + +/*! ZSTD_getDictID_fromDict() : Requires v1.4.0+ + * Provides the dictID stored within dictionary. + * if @return == 0, the dictionary is not conformant with Zstandard specification. + * It can still be loaded, but as a content-only dictionary. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize); + +/*! ZSTD_getDictID_fromCDict() : Requires v1.5.0+ + * Provides the dictID of the dictionary loaded into `cdict`. + * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromCDict(const ZSTD_CDict* cdict); + +/*! ZSTD_getDictID_fromDDict() : Requires v1.4.0+ + * Provides the dictID of the dictionary loaded into `ddict`. + * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict); + +/*! ZSTD_getDictID_fromFrame() : Requires v1.4.0+ + * Provides the dictID required to decompressed the frame stored within `src`. + * If @return == 0, the dictID could not be decoded. + * This could for one of the following reasons : + * - The frame does not require a dictionary to be decoded (most common case). + * - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information. + * Note : this use case also happens when using a non-conformant dictionary. + * - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`). + * - This is not a Zstandard frame. + * When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code. */ +ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize); + + +/******************************************************************************* + * Advanced dictionary and prefix API (Requires v1.4.0+) + * + * This API allows dictionaries to be used with ZSTD_compress2(), + * ZSTD_compressStream2(), and ZSTD_decompressDCtx(). + * Dictionaries are sticky, they remain valid when same context is re-used, + * they only reset when the context is reset + * with ZSTD_reset_parameters or ZSTD_reset_session_and_parameters. + * In contrast, Prefixes are single-use. + ******************************************************************************/ + + +/*! ZSTD_CCtx_loadDictionary() : Requires v1.4.0+ + * Create an internal CDict from `dict` buffer. + * Decompression will have to use same dictionary. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary, + * meaning "return to no-dictionary mode". + * Note 1 : Dictionary is sticky, it will be used for all future compressed frames, + * until parameters are reset, a new dictionary is loaded, or the dictionary + * is explicitly invalidated by loading a NULL dictionary. + * Note 2 : Loading a dictionary involves building tables. + * It's also a CPU consuming operation, with non-negligible impact on latency. + * Tables are dependent on compression parameters, and for this reason, + * compression parameters can no longer be changed after loading a dictionary. + * Note 3 :`dict` content will be copied internally. + * Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead. + * In such a case, dictionary buffer must outlive its users. + * Note 4 : Use ZSTD_CCtx_loadDictionary_advanced() + * to precisely select how dictionary content must be interpreted. + * Note 5 : This method does not benefit from LDM (long distance mode). + * If you want to employ LDM on some large dictionary content, + * prefer employing ZSTD_CCtx_refPrefix() described below. + */ +ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); + +/*! ZSTD_CCtx_refCDict() : Requires v1.4.0+ + * Reference a prepared dictionary, to be used for all future compressed frames. + * Note that compression parameters are enforced from within CDict, + * and supersede any compression parameter previously set within CCtx. + * The parameters ignored are labelled as "superseded-by-cdict" in the ZSTD_cParameter enum docs. + * The ignored parameters will be used again if the CCtx is returned to no-dictionary mode. + * The dictionary will remain valid for future compressed frames using same CCtx. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special : Referencing a NULL CDict means "return to no-dictionary mode". + * Note 1 : Currently, only one dictionary can be managed. + * Referencing a new dictionary effectively "discards" any previous one. + * Note 2 : CDict is just referenced, its lifetime must outlive its usage within CCtx. */ +ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); + +/*! ZSTD_CCtx_refPrefix() : Requires v1.4.0+ + * Reference a prefix (single-usage dictionary) for next compressed frame. + * A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end). + * Decompression will need same prefix to properly regenerate data. + * Compressing with a prefix is similar in outcome as performing a diff and compressing it, + * but performs much faster, especially during decompression (compression speed is tunable with compression level). + * This method is compatible with LDM (long distance mode). + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary + * Note 1 : Prefix buffer is referenced. It **must** outlive compression. + * Its content must remain unmodified during compression. + * Note 2 : If the intention is to diff some large src data blob with some prior version of itself, + * ensure that the window size is large enough to contain the entire source. + * See ZSTD_c_windowLog. + * Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters. + * It's a CPU consuming operation, with non-negligible impact on latency. + * If there is a need to use the same prefix multiple times, consider loadDictionary instead. + * Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dct_rawContent). + * Use experimental ZSTD_CCtx_refPrefix_advanced() to alter dictionary interpretation. */ +ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, + const void* prefix, size_t prefixSize); + +/*! ZSTD_DCtx_loadDictionary() : Requires v1.4.0+ + * Create an internal DDict from dict buffer, to be used to decompress all future frames. + * The dictionary remains valid for all future frames, until explicitly invalidated, or + * a new dictionary is loaded. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary, + * meaning "return to no-dictionary mode". + * Note 1 : Loading a dictionary involves building tables, + * which has a non-negligible impact on CPU usage and latency. + * It's recommended to "load once, use many times", to amortize the cost + * Note 2 :`dict` content will be copied internally, so `dict` can be released after loading. + * Use ZSTD_DCtx_loadDictionary_byReference() to reference dictionary content instead. + * Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to take control of + * how dictionary content is loaded and interpreted. + */ +ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); + +/*! ZSTD_DCtx_refDDict() : Requires v1.4.0+ + * Reference a prepared dictionary, to be used to decompress next frames. + * The dictionary remains active for decompression of future frames using same DCtx. + * + * If called with ZSTD_d_refMultipleDDicts enabled, repeated calls of this function + * will store the DDict references in a table, and the DDict used for decompression + * will be determined at decompression time, as per the dict ID in the frame. + * The memory for the table is allocated on the first call to refDDict, and can be + * freed with ZSTD_freeDCtx(). + * + * If called with ZSTD_d_refMultipleDDicts disabled (the default), only one dictionary + * will be managed, and referencing a dictionary effectively "discards" any previous one. + * + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Special: referencing a NULL DDict means "return to no-dictionary mode". + * Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx. + */ +ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); + +/*! ZSTD_DCtx_refPrefix() : Requires v1.4.0+ + * Reference a prefix (single-usage dictionary) to decompress next frame. + * This is the reverse operation of ZSTD_CCtx_refPrefix(), + * and must use the same prefix as the one used during compression. + * Prefix is **only used once**. Reference is discarded at end of frame. + * End of frame is reached when ZSTD_decompressStream() returns 0. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + * Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary + * Note 2 : Prefix buffer is referenced. It **must** outlive decompression. + * Prefix buffer must remain unmodified up to the end of frame, + * reached when ZSTD_decompressStream() returns 0. + * Note 3 : By default, the prefix is treated as raw content (ZSTD_dct_rawContent). + * Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode (Experimental section) + * Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost. + * A full dictionary is more costly, as it requires building tables. + */ +ZSTDLIB_API size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, + const void* prefix, size_t prefixSize); + +/* === Memory management === */ + +/*! ZSTD_sizeof_*() : Requires v1.4.0+ + * These functions give the _current_ memory usage of selected object. + * Note that object memory usage can evolve (increase or decrease) over time. */ +ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx); +ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx); +ZSTDLIB_API size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs); +ZSTDLIB_API size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds); +ZSTDLIB_API size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict); +ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); + +#endif /* ZSTD_H_235446 */ + + +/* ************************************************************************************** + * ADVANCED AND EXPERIMENTAL FUNCTIONS + **************************************************************************************** + * The definitions in the following section are considered experimental. + * They are provided for advanced scenarios. + * They should never be used with a dynamic library, as prototypes may change in the future. + * Use them only in association with static linking. + * ***************************************************************************************/ + +#if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY) +#define ZSTD_H_ZSTD_STATIC_LINKING_ONLY + +/* This can be overridden externally to hide static symbols. */ +#ifndef ZSTDLIB_STATIC_API +# if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDLIB_STATIC_API __declspec(dllexport) ZSTDLIB_VISIBLE +# elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDLIB_STATIC_API __declspec(dllimport) ZSTDLIB_VISIBLE +# else +# define ZSTDLIB_STATIC_API ZSTDLIB_VISIBLE +# endif +#endif + +/**************************************************************************************** + * experimental API (static linking only) + **************************************************************************************** + * The following symbols and constants + * are not planned to join "stable API" status in the near future. + * They can still change in future versions. + * Some of them are planned to remain in the static_only section indefinitely. + * Some of them might be removed in the future (especially when redundant with existing stable functions) + * ***************************************************************************************/ + +#define ZSTD_FRAMEHEADERSIZE_PREFIX(format) ((format) == ZSTD_f_zstd1 ? 5 : 1) /* minimum input size required to query frame header size */ +#define ZSTD_FRAMEHEADERSIZE_MIN(format) ((format) == ZSTD_f_zstd1 ? 6 : 2) +#define ZSTD_FRAMEHEADERSIZE_MAX 18 /* can be useful for static allocation */ +#define ZSTD_SKIPPABLEHEADERSIZE 8 + +/* compression parameter bounds */ +#define ZSTD_WINDOWLOG_MAX_32 30 +#define ZSTD_WINDOWLOG_MAX_64 31 +#define ZSTD_WINDOWLOG_MAX ((int)(sizeof(size_t) == 4 ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64)) +#define ZSTD_WINDOWLOG_MIN 10 +#define ZSTD_HASHLOG_MAX ((ZSTD_WINDOWLOG_MAX < 30) ? ZSTD_WINDOWLOG_MAX : 30) +#define ZSTD_HASHLOG_MIN 6 +#define ZSTD_CHAINLOG_MAX_32 29 +#define ZSTD_CHAINLOG_MAX_64 30 +#define ZSTD_CHAINLOG_MAX ((int)(sizeof(size_t) == 4 ? ZSTD_CHAINLOG_MAX_32 : ZSTD_CHAINLOG_MAX_64)) +#define ZSTD_CHAINLOG_MIN ZSTD_HASHLOG_MIN +#define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1) +#define ZSTD_SEARCHLOG_MIN 1 +#define ZSTD_MINMATCH_MAX 7 /* only for ZSTD_fast, other strategies are limited to 6 */ +#define ZSTD_MINMATCH_MIN 3 /* only for ZSTD_btopt+, faster strategies are limited to 4 */ +#define ZSTD_TARGETLENGTH_MAX ZSTD_BLOCKSIZE_MAX +#define ZSTD_TARGETLENGTH_MIN 0 /* note : comparing this constant to an unsigned results in a tautological test */ +#define ZSTD_STRATEGY_MIN ZSTD_fast +#define ZSTD_STRATEGY_MAX ZSTD_btultra2 +#define ZSTD_BLOCKSIZE_MAX_MIN (1 << 10) /* The minimum valid max blocksize. Maximum blocksizes smaller than this make compressBound() inaccurate. */ + + +#define ZSTD_OVERLAPLOG_MIN 0 +#define ZSTD_OVERLAPLOG_MAX 9 + +#define ZSTD_WINDOWLOG_LIMIT_DEFAULT 27 /* by default, the streaming decoder will refuse any frame + * requiring larger than (1< 0: + * If litLength != 0: + * rep == 1 --> offset == repeat_offset_1 + * rep == 2 --> offset == repeat_offset_2 + * rep == 3 --> offset == repeat_offset_3 + * If litLength == 0: + * rep == 1 --> offset == repeat_offset_2 + * rep == 2 --> offset == repeat_offset_3 + * rep == 3 --> offset == repeat_offset_1 - 1 + * + * Note: This field is optional. ZSTD_generateSequences() will calculate the value of + * 'rep', but repeat offsets do not necessarily need to be calculated from an external + * sequence provider's perspective. For example, ZSTD_compressSequences() does not + * use this 'rep' field at all (as of now). + */ +} ZSTD_Sequence; + +typedef struct { + unsigned windowLog; /**< largest match distance : larger == more compression, more memory needed during decompression */ + unsigned chainLog; /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */ + unsigned hashLog; /**< dispatch table : larger == faster, more memory */ + unsigned searchLog; /**< nb of searches : larger == more compression, slower */ + unsigned minMatch; /**< match length searched : larger == faster decompression, sometimes less compression */ + unsigned targetLength; /**< acceptable match size for optimal parser (only) : larger == more compression, slower */ + ZSTD_strategy strategy; /**< see ZSTD_strategy definition above */ +} ZSTD_compressionParameters; + +typedef struct { + int contentSizeFlag; /**< 1: content size will be in frame header (when known) */ + int checksumFlag; /**< 1: generate a 32-bits checksum using XXH64 algorithm at end of frame, for error detection */ + int noDictIDFlag; /**< 1: no dictID will be saved into frame header (dictID is only useful for dictionary compression) */ +} ZSTD_frameParameters; + +typedef struct { + ZSTD_compressionParameters cParams; + ZSTD_frameParameters fParams; +} ZSTD_parameters; + +typedef enum { + ZSTD_dct_auto = 0, /* dictionary is "full" when starting with ZSTD_MAGIC_DICTIONARY, otherwise it is "rawContent" */ + ZSTD_dct_rawContent = 1, /* ensures dictionary is always loaded as rawContent, even if it starts with ZSTD_MAGIC_DICTIONARY */ + ZSTD_dct_fullDict = 2 /* refuses to load a dictionary if it does not respect Zstandard's specification, starting with ZSTD_MAGIC_DICTIONARY */ +} ZSTD_dictContentType_e; + +typedef enum { + ZSTD_dlm_byCopy = 0, /**< Copy dictionary content internally */ + ZSTD_dlm_byRef = 1 /**< Reference dictionary content -- the dictionary buffer must outlive its users. */ +} ZSTD_dictLoadMethod_e; + +typedef enum { + ZSTD_f_zstd1 = 0, /* zstd frame format, specified in zstd_compression_format.md (default) */ + ZSTD_f_zstd1_magicless = 1 /* Variant of zstd frame format, without initial 4-bytes magic number. + * Useful to save 4 bytes per generated frame. + * Decoder cannot recognise automatically this format, requiring this instruction. */ +} ZSTD_format_e; + +typedef enum { + /* Note: this enum controls ZSTD_d_forceIgnoreChecksum */ + ZSTD_d_validateChecksum = 0, + ZSTD_d_ignoreChecksum = 1 +} ZSTD_forceIgnoreChecksum_e; + +typedef enum { + /* Note: this enum controls ZSTD_d_refMultipleDDicts */ + ZSTD_rmd_refSingleDDict = 0, + ZSTD_rmd_refMultipleDDicts = 1 +} ZSTD_refMultipleDDicts_e; + +typedef enum { + /* Note: this enum and the behavior it controls are effectively internal + * implementation details of the compressor. They are expected to continue + * to evolve and should be considered only in the context of extremely + * advanced performance tuning. + * + * Zstd currently supports the use of a CDict in three ways: + * + * - The contents of the CDict can be copied into the working context. This + * means that the compression can search both the dictionary and input + * while operating on a single set of internal tables. This makes + * the compression faster per-byte of input. However, the initial copy of + * the CDict's tables incurs a fixed cost at the beginning of the + * compression. For small compressions (< 8 KB), that copy can dominate + * the cost of the compression. + * + * - The CDict's tables can be used in-place. In this model, compression is + * slower per input byte, because the compressor has to search two sets of + * tables. However, this model incurs no start-up cost (as long as the + * working context's tables can be reused). For small inputs, this can be + * faster than copying the CDict's tables. + * + * - The CDict's tables are not used at all, and instead we use the working + * context alone to reload the dictionary and use params based on the source + * size. See ZSTD_compress_insertDictionary() and ZSTD_compress_usingDict(). + * This method is effective when the dictionary sizes are very small relative + * to the input size, and the input size is fairly large to begin with. + * + * Zstd has a simple internal heuristic that selects which strategy to use + * at the beginning of a compression. However, if experimentation shows that + * Zstd is making poor choices, it is possible to override that choice with + * this enum. + */ + ZSTD_dictDefaultAttach = 0, /* Use the default heuristic. */ + ZSTD_dictForceAttach = 1, /* Never copy the dictionary. */ + ZSTD_dictForceCopy = 2, /* Always copy the dictionary. */ + ZSTD_dictForceLoad = 3 /* Always reload the dictionary */ +} ZSTD_dictAttachPref_e; + +typedef enum { + ZSTD_lcm_auto = 0, /**< Automatically determine the compression mode based on the compression level. + * Negative compression levels will be uncompressed, and positive compression + * levels will be compressed. */ + ZSTD_lcm_huffman = 1, /**< Always attempt Huffman compression. Uncompressed literals will still be + * emitted if Huffman compression is not profitable. */ + ZSTD_lcm_uncompressed = 2 /**< Always emit uncompressed literals. */ +} ZSTD_literalCompressionMode_e; + +typedef enum { + /* Note: This enum controls features which are conditionally beneficial. Zstd typically will make a final + * decision on whether or not to enable the feature (ZSTD_ps_auto), but setting the switch to ZSTD_ps_enable + * or ZSTD_ps_disable allow for a force enable/disable the feature. + */ + ZSTD_ps_auto = 0, /* Let the library automatically determine whether the feature shall be enabled */ + ZSTD_ps_enable = 1, /* Force-enable the feature */ + ZSTD_ps_disable = 2 /* Do not use the feature */ +} ZSTD_paramSwitch_e; + +/*************************************** +* Frame header and size functions +***************************************/ + +/*! ZSTD_findDecompressedSize() : + * `src` should point to the start of a series of ZSTD encoded and/or skippable frames + * `srcSize` must be the _exact_ size of this series + * (i.e. there should be a frame boundary at `src + srcSize`) + * @return : - decompressed size of all data in all successive frames + * - if the decompressed size cannot be determined: ZSTD_CONTENTSIZE_UNKNOWN + * - if an error occurred: ZSTD_CONTENTSIZE_ERROR + * + * note 1 : decompressed size is an optional field, that may not be present, especially in streaming mode. + * When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. + * In which case, it's necessary to use streaming mode to decompress data. + * note 2 : decompressed size is always present when compression is done with ZSTD_compress() + * note 3 : decompressed size can be very large (64-bits value), + * potentially larger than what local system can handle as a single memory segment. + * In which case, it's necessary to use streaming mode to decompress data. + * note 4 : If source is untrusted, decompressed size could be wrong or intentionally modified. + * Always ensure result fits within application's authorized limits. + * Each application can set its own limits. + * note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to + * read each contained frame header. This is fast as most of the data is skipped, + * however it does mean that all frame data must be present and valid. */ +ZSTDLIB_STATIC_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize); + +/*! ZSTD_decompressBound() : + * `src` should point to the start of a series of ZSTD encoded and/or skippable frames + * `srcSize` must be the _exact_ size of this series + * (i.e. there should be a frame boundary at `src + srcSize`) + * @return : - upper-bound for the decompressed size of all data in all successive frames + * - if an error occurred: ZSTD_CONTENTSIZE_ERROR + * + * note 1 : an error can occur if `src` contains an invalid or incorrectly formatted frame. + * note 2 : the upper-bound is exact when the decompressed size field is available in every ZSTD encoded frame of `src`. + * in this case, `ZSTD_findDecompressedSize` and `ZSTD_decompressBound` return the same value. + * note 3 : when the decompressed size field isn't available, the upper-bound for that frame is calculated by: + * upper-bound = # blocks * min(128 KB, Window_Size) + */ +ZSTDLIB_STATIC_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize); + +/*! ZSTD_frameHeaderSize() : + * srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX. + * @return : size of the Frame Header, + * or an error code (if srcSize is too small) */ +ZSTDLIB_STATIC_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize); + +typedef enum { ZSTD_frame, ZSTD_skippableFrame } ZSTD_frameType_e; +typedef struct { + unsigned long long frameContentSize; /* if == ZSTD_CONTENTSIZE_UNKNOWN, it means this field is not available. 0 means "empty" */ + unsigned long long windowSize; /* can be very large, up to <= frameContentSize */ + unsigned blockSizeMax; + ZSTD_frameType_e frameType; /* if == ZSTD_skippableFrame, frameContentSize is the size of skippable content */ + unsigned headerSize; + unsigned dictID; + unsigned checksumFlag; + unsigned _reserved1; + unsigned _reserved2; +} ZSTD_frameHeader; + +/*! ZSTD_getFrameHeader() : + * decode Frame Header, or requires larger `srcSize`. + * @return : 0, `zfhPtr` is correctly filled, + * >0, `srcSize` is too small, value is wanted `srcSize` amount, + * or an error code, which can be tested using ZSTD_isError() */ +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */ +/*! ZSTD_getFrameHeader_advanced() : + * same as ZSTD_getFrameHeader(), + * with added capability to select a format (like ZSTD_f_zstd1_magicless) */ +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format); + +/*! ZSTD_decompressionMargin() : + * Zstd supports in-place decompression, where the input and output buffers overlap. + * In this case, the output buffer must be at least (Margin + Output_Size) bytes large, + * and the input buffer must be at the end of the output buffer. + * + * _______________________ Output Buffer ________________________ + * | | + * | ____ Input Buffer ____| + * | | | + * v v v + * |---------------------------------------|-----------|----------| + * ^ ^ ^ + * |___________________ Output_Size ___________________|_ Margin _| + * + * NOTE: See also ZSTD_DECOMPRESSION_MARGIN(). + * NOTE: This applies only to single-pass decompression through ZSTD_decompress() or + * ZSTD_decompressDCtx(). + * NOTE: This function supports multi-frame input. + * + * @param src The compressed frame(s) + * @param srcSize The size of the compressed frame(s) + * @returns The decompression margin or an error that can be checked with ZSTD_isError(). + */ +ZSTDLIB_STATIC_API size_t ZSTD_decompressionMargin(const void* src, size_t srcSize); + +/*! ZSTD_DECOMPRESS_MARGIN() : + * Similar to ZSTD_decompressionMargin(), but instead of computing the margin from + * the compressed frame, compute it from the original size and the blockSizeLog. + * See ZSTD_decompressionMargin() for details. + * + * WARNING: This macro does not support multi-frame input, the input must be a single + * zstd frame. If you need that support use the function, or implement it yourself. + * + * @param originalSize The original uncompressed size of the data. + * @param blockSize The block size == MIN(windowSize, ZSTD_BLOCKSIZE_MAX). + * Unless you explicitly set the windowLog smaller than + * ZSTD_BLOCKSIZELOG_MAX you can just use ZSTD_BLOCKSIZE_MAX. + */ +#define ZSTD_DECOMPRESSION_MARGIN(originalSize, blockSize) ((size_t)( \ + ZSTD_FRAMEHEADERSIZE_MAX /* Frame header */ + \ + 4 /* checksum */ + \ + ((originalSize) == 0 ? 0 : 3 * (((originalSize) + (blockSize) - 1) / blockSize)) /* 3 bytes per block */ + \ + (blockSize) /* One block of margin */ \ + )) + +typedef enum { + ZSTD_sf_noBlockDelimiters = 0, /* Representation of ZSTD_Sequence has no block delimiters, sequences only */ + ZSTD_sf_explicitBlockDelimiters = 1 /* Representation of ZSTD_Sequence contains explicit block delimiters */ +} ZSTD_sequenceFormat_e; + +/*! ZSTD_sequenceBound() : + * `srcSize` : size of the input buffer + * @return : upper-bound for the number of sequences that can be generated + * from a buffer of srcSize bytes + * + * note : returns number of sequences - to get bytes, multiply by sizeof(ZSTD_Sequence). + */ +ZSTDLIB_STATIC_API size_t ZSTD_sequenceBound(size_t srcSize); + +/*! ZSTD_generateSequences() : + * Generate sequences using ZSTD_compress2(), given a source buffer. + * + * Each block will end with a dummy sequence + * with offset == 0, matchLength == 0, and litLength == length of last literals. + * litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0) + * simply acts as a block delimiter. + * + * @zc can be used to insert custom compression params. + * This function invokes ZSTD_compress2(). + * + * The output of this function can be fed into ZSTD_compressSequences() with CCtx + * setting of ZSTD_c_blockDelimiters as ZSTD_sf_explicitBlockDelimiters + * @return : number of sequences generated + */ + +ZSTDLIB_STATIC_API size_t +ZSTD_generateSequences( ZSTD_CCtx* zc, + ZSTD_Sequence* outSeqs, size_t outSeqsSize, + const void* src, size_t srcSize); + +/*! ZSTD_mergeBlockDelimiters() : + * Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals + * by merging them into the literals of the next sequence. + * + * As such, the final generated result has no explicit representation of block boundaries, + * and the final last literals segment is not represented in the sequences. + * + * The output of this function can be fed into ZSTD_compressSequences() with CCtx + * setting of ZSTD_c_blockDelimiters as ZSTD_sf_noBlockDelimiters + * @return : number of sequences left after merging + */ +ZSTDLIB_STATIC_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize); + +/*! ZSTD_compressSequences() : + * Compress an array of ZSTD_Sequence, associated with @src buffer, into dst. + * @src contains the entire input (not just the literals). + * If @srcSize > sum(sequence.length), the remaining bytes are considered all literals + * If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.) + * The entire source is compressed into a single frame. + * + * The compression behavior changes based on cctx params. In particular: + * If ZSTD_c_blockDelimiters == ZSTD_sf_noBlockDelimiters, the array of ZSTD_Sequence is expected to contain + * no block delimiters (defined in ZSTD_Sequence). Block boundaries are roughly determined based on + * the block size derived from the cctx, and sequences may be split. This is the default setting. + * + * If ZSTD_c_blockDelimiters == ZSTD_sf_explicitBlockDelimiters, the array of ZSTD_Sequence is expected to contain + * block delimiters (defined in ZSTD_Sequence). Behavior is undefined if no block delimiters are provided. + * + * If ZSTD_c_validateSequences == 0, this function will blindly accept the sequences provided. Invalid sequences cause undefined + * behavior. If ZSTD_c_validateSequences == 1, then if sequence is invalid (see doc/zstd_compression_format.md for + * specifics regarding offset/matchlength requirements) then the function will bail out and return an error. + * + * In addition to the two adjustable experimental params, there are other important cctx params. + * - ZSTD_c_minMatch MUST be set as less than or equal to the smallest match generated by the match finder. It has a minimum value of ZSTD_MINMATCH_MIN. + * - ZSTD_c_compressionLevel accordingly adjusts the strength of the entropy coder, as it would in typical compression. + * - ZSTD_c_windowLog affects offset validation: this function will return an error at higher debug levels if a provided offset + * is larger than what the spec allows for a given window log and dictionary (if present). See: doc/zstd_compression_format.md + * + * Note: Repcodes are, as of now, always re-calculated within this function, so ZSTD_Sequence::rep is unused. + * Note 2: Once we integrate ability to ingest repcodes, the explicit block delims mode must respect those repcodes exactly, + * and cannot emit an RLE block that disagrees with the repcode history + * @return : final compressed size, or a ZSTD error code. + */ +ZSTDLIB_STATIC_API size_t +ZSTD_compressSequences( ZSTD_CCtx* cctx, void* dst, size_t dstSize, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, + const void* src, size_t srcSize); + + +/*! ZSTD_writeSkippableFrame() : + * Generates a zstd skippable frame containing data given by src, and writes it to dst buffer. + * + * Skippable frames begin with a 4-byte magic number. There are 16 possible choices of magic number, + * ranging from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15. + * As such, the parameter magicVariant controls the exact skippable frame magic number variant used, so + * the magic number used will be ZSTD_MAGIC_SKIPPABLE_START + magicVariant. + * + * Returns an error if destination buffer is not large enough, if the source size is not representable + * with a 4-byte unsigned int, or if the parameter magicVariant is greater than 15 (and therefore invalid). + * + * @return : number of bytes written or a ZSTD error. + */ +ZSTDLIB_STATIC_API size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity, + const void* src, size_t srcSize, unsigned magicVariant); + +/*! ZSTD_readSkippableFrame() : + * Retrieves a zstd skippable frame containing data given by src, and writes it to dst buffer. + * + * The parameter magicVariant will receive the magicVariant that was supplied when the frame was written, + * i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested + * in the magicVariant. + * + * Returns an error if destination buffer is not large enough, or if the frame is not skippable. + * + * @return : number of bytes written or a ZSTD error. + */ +ZSTDLIB_API size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity, unsigned* magicVariant, + const void* src, size_t srcSize); + +/*! ZSTD_isSkippableFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame. + */ +ZSTDLIB_API unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size); + + + +/*************************************** +* Memory management +***************************************/ + +/*! ZSTD_estimate*() : + * These functions make it possible to estimate memory usage + * of a future {D,C}Ctx, before its creation. + * + * ZSTD_estimateCCtxSize() will provide a memory budget large enough + * for any compression level up to selected one. + * Note : Unlike ZSTD_estimateCStreamSize*(), this estimate + * does not include space for a window buffer. + * Therefore, the estimation is only guaranteed for single-shot compressions, not streaming. + * The estimate will assume the input may be arbitrarily large, + * which is the worst case. + * + * When srcSize can be bound by a known and rather "small" value, + * this fact can be used to provide a tighter estimation + * because the CCtx compression context will need less memory. + * This tighter estimation can be provided by more advanced functions + * ZSTD_estimateCCtxSize_usingCParams(), which can be used in tandem with ZSTD_getCParams(), + * and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter(). + * Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits. + * + * Note : only single-threaded compression is supported. + * ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + * + * Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + * Size estimates assume that no external sequence producer is registered. + */ +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize(int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void); + +/*! ZSTD_estimateCStreamSize() : + * ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one. + * It will also consider src size to be arbitrarily "large", which is worst case. + * If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation. + * ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel. + * ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParams_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_c_nbWorkers is >= 1. + * Note : CStream size estimation is only correct for single-threaded compression. + * ZSTD_DStream memory budget depends on window Size. + * This information can be passed manually, using ZSTD_estimateDStreamSize, + * or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame(); + * Note : if streaming is init with function ZSTD_init?Stream_usingDict(), + * an internal ?Dict will be created, which additional size is not estimated here. + * In this case, get total size by adding ZSTD_estimate?DictSize + * Note 2 : only single-threaded compression is supported. + * ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + * Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + * Size estimates assume that no external sequence producer is registered. + */ +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize(int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize(size_t windowSize); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize); + +/*! ZSTD_estimate?DictSize() : + * ZSTD_estimateCDictSize() will bet that src size is relatively "small", and content is copied, like ZSTD_createCDict(). + * ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced(). + * Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller. + */ +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod); + +/*! ZSTD_initStatic*() : + * Initialize an object using a pre-allocated fixed-size buffer. + * workspace: The memory area to emplace the object into. + * Provided pointer *must be 8-bytes aligned*. + * Buffer must outlive object. + * workspaceSize: Use ZSTD_estimate*Size() to determine + * how large workspace must be to support target scenario. + * @return : pointer to object (same address as workspace, just different type), + * or NULL if error (size too small, incorrect alignment, etc.) + * Note : zstd will never resize nor malloc() when using a static buffer. + * If the object requires more memory than available, + * zstd will just error out (typically ZSTD_error_memory_allocation). + * Note 2 : there is no corresponding "free" function. + * Since workspace is allocated externally, it must be freed externally too. + * Note 3 : cParams : use ZSTD_getCParams() to convert a compression level + * into its associated cParams. + * Limitation 1 : currently not compatible with internal dictionary creation, triggered by + * ZSTD_CCtx_loadDictionary(), ZSTD_initCStream_usingDict() or ZSTD_initDStream_usingDict(). + * Limitation 2 : static cctx currently not compatible with multi-threading. + * Limitation 3 : static dctx is incompatible with legacy support. + */ +ZSTDLIB_STATIC_API ZSTD_CCtx* ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize); +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticCCtx() */ + +ZSTDLIB_STATIC_API ZSTD_DCtx* ZSTD_initStaticDCtx(void* workspace, size_t workspaceSize); +ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticDCtx() */ + +ZSTDLIB_STATIC_API const ZSTD_CDict* ZSTD_initStaticCDict( + void* workspace, size_t workspaceSize, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_compressionParameters cParams); + +ZSTDLIB_STATIC_API const ZSTD_DDict* ZSTD_initStaticDDict( + void* workspace, size_t workspaceSize, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType); + + +/*! Custom memory allocation : + * These prototypes make it possible to pass your own allocation/free functions. + * ZSTD_customMem is provided at creation time, using ZSTD_create*_advanced() variants listed below. + * All allocation/free operations will be completed using these custom variants instead of regular ones. + */ +typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size); +typedef void (*ZSTD_freeFunction) (void* opaque, void* address); +typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; void* opaque; } ZSTD_customMem; +static +#ifdef __GNUC__ +__attribute__((__unused__)) +#endif +ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */ + +ZSTDLIB_STATIC_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem); + +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_compressionParameters cParams, + ZSTD_customMem customMem); + +/*! Thread pool : + * These prototypes make it possible to share a thread pool among multiple compression contexts. + * This can limit resources for applications with multiple threads where each one uses + * a threaded compression mode (via ZSTD_c_nbWorkers parameter). + * ZSTD_createThreadPool creates a new thread pool with a given number of threads. + * Note that the lifetime of such pool must exist while being used. + * ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value + * to use an internal thread pool). + * ZSTD_freeThreadPool frees a thread pool, accepts NULL pointer. + */ +typedef struct POOL_ctx_s ZSTD_threadPool; +ZSTDLIB_STATIC_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads); +ZSTDLIB_STATIC_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool); /* accept NULL pointer */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool); + + +/* + * This API is temporary and is expected to change or disappear in the future! + */ +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced2( + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + const ZSTD_CCtx_params* cctxParams, + ZSTD_customMem customMem); + +ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_advanced( + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_customMem customMem); + + +/*************************************** +* Advanced compression functions +***************************************/ + +/*! ZSTD_createCDict_byReference() : + * Create a digested dictionary for compression + * Dictionary content is just referenced, not duplicated. + * As a consequence, `dictBuffer` **must** outlive CDict, + * and its content must remain unmodified throughout the lifetime of CDict. + * note: equivalent to ZSTD_createCDict_advanced(), with dictLoadMethod==ZSTD_dlm_byRef */ +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel); + +/*! ZSTD_getCParams() : + * @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize. + * `estimatedSrcSize` value is optional, select 0 if not known */ +ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); + +/*! ZSTD_getParams() : + * same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`. + * All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0 */ +ZSTDLIB_STATIC_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); + +/*! ZSTD_checkCParams() : + * Ensure param values remain within authorized range. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()) */ +ZSTDLIB_STATIC_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); + +/*! ZSTD_adjustCParams() : + * optimize params for a given `srcSize` and `dictSize`. + * `srcSize` can be unknown, in which case use ZSTD_CONTENTSIZE_UNKNOWN. + * `dictSize` must be `0` when there is no dictionary. + * cPar can be invalid : all parameters will be clamped within valid range in the @return struct. + * This function never fails (wide contract) */ +ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); + +/*! ZSTD_CCtx_setCParams() : + * Set all parameters provided within @p cparams into the working @p cctx. + * Note : if modifying parameters during compression (MT mode only), + * note that changes to the .windowLog parameter will be ignored. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()). + * On failure, no parameters are updated. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams); + +/*! ZSTD_CCtx_setFParams() : + * Set all parameters provided within @p fparams into the working @p cctx. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setFParams(ZSTD_CCtx* cctx, ZSTD_frameParameters fparams); + +/*! ZSTD_CCtx_setParams() : + * Set all parameters provided within @p params into the working @p cctx. + * @return 0 on success, or an error code (can be checked with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParams(ZSTD_CCtx* cctx, ZSTD_parameters params); + +/*! ZSTD_compress_advanced() : + * Note : this function is now DEPRECATED. + * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters. + * This prototype will generate compilation warnings. */ +ZSTD_DEPRECATED("use ZSTD_compress2") +ZSTDLIB_STATIC_API +size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize, + ZSTD_parameters params); + +/*! ZSTD_compress_usingCDict_advanced() : + * Note : this function is now DEPRECATED. + * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_loadDictionary() and other parameter setters. + * This prototype will generate compilation warnings. */ +ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary") +ZSTDLIB_STATIC_API +size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_CDict* cdict, + ZSTD_frameParameters fParams); + + +/*! ZSTD_CCtx_loadDictionary_byReference() : + * Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx. + * It saves some memory, but also requires that `dict` outlives its usage within `cctx` */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); + +/*! ZSTD_CCtx_loadDictionary_advanced() : + * Same as ZSTD_CCtx_loadDictionary(), but gives finer control over + * how to load the dictionary (by copy ? by reference ?) + * and how to interpret it (automatic ? force raw mode ? full mode only ?) */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); + +/*! ZSTD_CCtx_refPrefix_advanced() : + * Same as ZSTD_CCtx_refPrefix(), but gives finer control over + * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); + +/* === experimental parameters === */ +/* these parameters can be used with ZSTD_setParameter() + * they are not guaranteed to remain supported in the future */ + + /* Enables rsyncable mode, + * which makes compressed files more rsync friendly + * by adding periodic synchronization points to the compressed data. + * The target average block size is ZSTD_c_jobSize / 2. + * It's possible to modify the job size to increase or decrease + * the granularity of the synchronization point. + * Once the jobSize is smaller than the window size, + * it will result in compression ratio degradation. + * NOTE 1: rsyncable mode only works when multithreading is enabled. + * NOTE 2: rsyncable performs poorly in combination with long range mode, + * since it will decrease the effectiveness of synchronization points, + * though mileage may vary. + * NOTE 3: Rsyncable mode limits maximum compression speed to ~400 MB/s. + * If the selected compression level is already running significantly slower, + * the overall speed won't be significantly impacted. + */ + #define ZSTD_c_rsyncable ZSTD_c_experimentalParam1 + +/* Select a compression format. + * The value must be of type ZSTD_format_e. + * See ZSTD_format_e enum definition for details */ +#define ZSTD_c_format ZSTD_c_experimentalParam2 + +/* Force back-reference distances to remain < windowSize, + * even when referencing into Dictionary content (default:0) */ +#define ZSTD_c_forceMaxWindow ZSTD_c_experimentalParam3 + +/* Controls whether the contents of a CDict + * are used in place, or copied into the working context. + * Accepts values from the ZSTD_dictAttachPref_e enum. + * See the comments on that enum for an explanation of the feature. */ +#define ZSTD_c_forceAttachDict ZSTD_c_experimentalParam4 + +/* Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never compress literals. + * Set to ZSTD_ps_enable to always compress literals. (Note: uncompressed literals + * may still be emitted if huffman is not beneficial to use.) + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * literals compression based on the compression parameters - specifically, + * negative compression levels do not use literal compression. + */ +#define ZSTD_c_literalCompressionMode ZSTD_c_experimentalParam5 + +/* Tries to fit compressed block size to be around targetCBlockSize. + * No target when targetCBlockSize == 0. + * There is no guarantee on compressed block size (default:0) */ +#define ZSTD_c_targetCBlockSize ZSTD_c_experimentalParam6 + +/* User's best guess of source size. + * Hint is not valid when srcSizeHint == 0. + * There is no guarantee that hint is close to actual source size, + * but compression ratio may regress significantly if guess considerably underestimates */ +#define ZSTD_c_srcSizeHint ZSTD_c_experimentalParam7 + +/* Controls whether the new and experimental "dedicated dictionary search + * structure" can be used. This feature is still rough around the edges, be + * prepared for surprising behavior! + * + * How to use it: + * + * When using a CDict, whether to use this feature or not is controlled at + * CDict creation, and it must be set in a CCtxParams set passed into that + * construction (via ZSTD_createCDict_advanced2()). A compression will then + * use the feature or not based on how the CDict was constructed; the value of + * this param, set in the CCtx, will have no effect. + * + * However, when a dictionary buffer is passed into a CCtx, such as via + * ZSTD_CCtx_loadDictionary(), this param can be set on the CCtx to control + * whether the CDict that is created internally can use the feature or not. + * + * What it does: + * + * Normally, the internal data structures of the CDict are analogous to what + * would be stored in a CCtx after compressing the contents of a dictionary. + * To an approximation, a compression using a dictionary can then use those + * data structures to simply continue what is effectively a streaming + * compression where the simulated compression of the dictionary left off. + * Which is to say, the search structures in the CDict are normally the same + * format as in the CCtx. + * + * It is possible to do better, since the CDict is not like a CCtx: the search + * structures are written once during CDict creation, and then are only read + * after that, while the search structures in the CCtx are both read and + * written as the compression goes along. This means we can choose a search + * structure for the dictionary that is read-optimized. + * + * This feature enables the use of that different structure. + * + * Note that some of the members of the ZSTD_compressionParameters struct have + * different semantics and constraints in the dedicated search structure. It is + * highly recommended that you simply set a compression level in the CCtxParams + * you pass into the CDict creation call, and avoid messing with the cParams + * directly. + * + * Effects: + * + * This will only have any effect when the selected ZSTD_strategy + * implementation supports this feature. Currently, that's limited to + * ZSTD_greedy, ZSTD_lazy, and ZSTD_lazy2. + * + * Note that this means that the CDict tables can no longer be copied into the + * CCtx, so the dict attachment mode ZSTD_dictForceCopy will no longer be + * usable. The dictionary can only be attached or reloaded. + * + * In general, you should expect compression to be faster--sometimes very much + * so--and CDict creation to be slightly slower. Eventually, we will probably + * make this mode the default. + */ +#define ZSTD_c_enableDedicatedDictSearch ZSTD_c_experimentalParam8 + +/* ZSTD_c_stableInBuffer + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable. + * + * Tells the compressor that input data presented with ZSTD_inBuffer + * will ALWAYS be the same between calls. + * Technically, the @src pointer must never be changed, + * and the @pos field can only be updated by zstd. + * However, it's possible to increase the @size field, + * allowing scenarios where more data can be appended after compressions starts. + * These conditions are checked by the compressor, + * and compression will fail if they are not respected. + * Also, data in the ZSTD_inBuffer within the range [src, src + pos) + * MUST not be modified during compression or it will result in data corruption. + * + * When this flag is enabled zstd won't allocate an input window buffer, + * because the user guarantees it can reference the ZSTD_inBuffer until + * the frame is complete. But, it will still allocate an output buffer + * large enough to fit a block (see ZSTD_c_stableOutBuffer). This will also + * avoid the memcpy() from the input buffer to the input window buffer. + * + * NOTE: So long as the ZSTD_inBuffer always points to valid memory, using + * this flag is ALWAYS memory safe, and will never access out-of-bounds + * memory. However, compression WILL fail if conditions are not respected. + * + * WARNING: The data in the ZSTD_inBuffer in the range [src, src + pos) MUST + * not be modified during compression or it will result in data corruption. + * This is because zstd needs to reference data in the ZSTD_inBuffer to find + * matches. Normally zstd maintains its own window buffer for this purpose, + * but passing this flag tells zstd to rely on user provided buffer instead. + */ +#define ZSTD_c_stableInBuffer ZSTD_c_experimentalParam9 + +/* ZSTD_c_stableOutBuffer + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable. + * + * Tells he compressor that the ZSTD_outBuffer will not be resized between + * calls. Specifically: (out.size - out.pos) will never grow. This gives the + * compressor the freedom to say: If the compressed data doesn't fit in the + * output buffer then return ZSTD_error_dstSizeTooSmall. This allows us to + * always decompress directly into the output buffer, instead of decompressing + * into an internal buffer and copying to the output buffer. + * + * When this flag is enabled zstd won't allocate an output buffer, because + * it can write directly to the ZSTD_outBuffer. It will still allocate the + * input window buffer (see ZSTD_c_stableInBuffer). + * + * Zstd will check that (out.size - out.pos) never grows and return an error + * if it does. While not strictly necessary, this should prevent surprises. + */ +#define ZSTD_c_stableOutBuffer ZSTD_c_experimentalParam10 + +/* ZSTD_c_blockDelimiters + * Default is 0 == ZSTD_sf_noBlockDelimiters. + * + * For use with sequence compression API: ZSTD_compressSequences(). + * + * Designates whether or not the given array of ZSTD_Sequence contains block delimiters + * and last literals, which are defined as sequences with offset == 0 and matchLength == 0. + * See the definition of ZSTD_Sequence for more specifics. + */ +#define ZSTD_c_blockDelimiters ZSTD_c_experimentalParam11 + +/* ZSTD_c_validateSequences + * Default is 0 == disabled. Set to 1 to enable sequence validation. + * + * For use with sequence compression API: ZSTD_compressSequences(). + * Designates whether or not we validate sequences provided to ZSTD_compressSequences() + * during function execution. + * + * Without validation, providing a sequence that does not conform to the zstd spec will cause + * undefined behavior, and may produce a corrupted block. + * + * With validation enabled, if sequence is invalid (see doc/zstd_compression_format.md for + * specifics regarding offset/matchlength requirements) then the function will bail out and + * return an error. + * + */ +#define ZSTD_c_validateSequences ZSTD_c_experimentalParam12 + +/* ZSTD_c_useBlockSplitter + * Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never use block splitter. + * Set to ZSTD_ps_enable to always use block splitter. + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * block splitting based on the compression parameters. + */ +#define ZSTD_c_useBlockSplitter ZSTD_c_experimentalParam13 + +/* ZSTD_c_useRowMatchFinder + * Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never use row-based matchfinder. + * Set to ZSTD_ps_enable to force usage of row-based matchfinder. + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * the row-based matchfinder based on support for SIMD instructions and the window log. + * Note that this only pertains to compression strategies: greedy, lazy, and lazy2 + */ +#define ZSTD_c_useRowMatchFinder ZSTD_c_experimentalParam14 + +/* ZSTD_c_deterministicRefPrefix + * Default is 0 == disabled. Set to 1 to enable. + * + * Zstd produces different results for prefix compression when the prefix is + * directly adjacent to the data about to be compressed vs. when it isn't. + * This is because zstd detects that the two buffers are contiguous and it can + * use a more efficient match finding algorithm. However, this produces different + * results than when the two buffers are non-contiguous. This flag forces zstd + * to always load the prefix in non-contiguous mode, even if it happens to be + * adjacent to the data, to guarantee determinism. + * + * If you really care about determinism when using a dictionary or prefix, + * like when doing delta compression, you should select this option. It comes + * at a speed penalty of about ~2.5% if the dictionary and data happened to be + * contiguous, and is free if they weren't contiguous. We don't expect that + * intentionally making the dictionary and data contiguous will be worth the + * cost to memcpy() the data. + */ +#define ZSTD_c_deterministicRefPrefix ZSTD_c_experimentalParam15 + +/* ZSTD_c_prefetchCDictTables + * Controlled with ZSTD_paramSwitch_e enum. Default is ZSTD_ps_auto. + * + * In some situations, zstd uses CDict tables in-place rather than copying them + * into the working context. (See docs on ZSTD_dictAttachPref_e above for details). + * In such situations, compression speed is seriously impacted when CDict tables are + * "cold" (outside CPU cache). This parameter instructs zstd to prefetch CDict tables + * when they are used in-place. + * + * For sufficiently small inputs, the cost of the prefetch will outweigh the benefit. + * For sufficiently large inputs, zstd will by default memcpy() CDict tables + * into the working context, so there is no need to prefetch. This parameter is + * targeted at a middle range of input sizes, where a prefetch is cheap enough to be + * useful but memcpy() is too expensive. The exact range of input sizes where this + * makes sense is best determined by careful experimentation. + * + * Note: for this parameter, ZSTD_ps_auto is currently equivalent to ZSTD_ps_disable, + * but in the future zstd may conditionally enable this feature via an auto-detection + * heuristic for cold CDicts. + * Use ZSTD_ps_disable to opt out of prefetching under any circumstances. + */ +#define ZSTD_c_prefetchCDictTables ZSTD_c_experimentalParam16 + +/* ZSTD_c_enableSeqProducerFallback + * Allowed values are 0 (disable) and 1 (enable). The default setting is 0. + * + * Controls whether zstd will fall back to an internal sequence producer if an + * external sequence producer is registered and returns an error code. This fallback + * is block-by-block: the internal sequence producer will only be called for blocks + * where the external sequence producer returns an error code. Fallback parsing will + * follow any other cParam settings, such as compression level, the same as in a + * normal (fully-internal) compression operation. + * + * The user is strongly encouraged to read the full Block-Level Sequence Producer API + * documentation (below) before setting this parameter. */ +#define ZSTD_c_enableSeqProducerFallback ZSTD_c_experimentalParam17 + +/* ZSTD_c_maxBlockSize + * Allowed values are between 1KB and ZSTD_BLOCKSIZE_MAX (128KB). + * The default is ZSTD_BLOCKSIZE_MAX, and setting to 0 will set to the default. + * + * This parameter can be used to set an upper bound on the blocksize + * that overrides the default ZSTD_BLOCKSIZE_MAX. It cannot be used to set upper + * bounds greater than ZSTD_BLOCKSIZE_MAX or bounds lower than 1KB (will make + * compressBound() inaccurate). Only currently meant to be used for testing. + * + */ +#define ZSTD_c_maxBlockSize ZSTD_c_experimentalParam18 + +/* ZSTD_c_searchForExternalRepcodes + * This parameter affects how zstd parses external sequences, such as sequences + * provided through the compressSequences() API or from an external block-level + * sequence producer. + * + * If set to ZSTD_ps_enable, the library will check for repeated offsets in + * external sequences, even if those repcodes are not explicitly indicated in + * the "rep" field. Note that this is the only way to exploit repcode matches + * while using compressSequences() or an external sequence producer, since zstd + * currently ignores the "rep" field of external sequences. + * + * If set to ZSTD_ps_disable, the library will not exploit repeated offsets in + * external sequences, regardless of whether the "rep" field has been set. This + * reduces sequence compression overhead by about 25% while sacrificing some + * compression ratio. + * + * The default value is ZSTD_ps_auto, for which the library will enable/disable + * based on compression level. + * + * Note: for now, this param only has an effect if ZSTD_c_blockDelimiters is + * set to ZSTD_sf_explicitBlockDelimiters. That may change in the future. + */ +#define ZSTD_c_searchForExternalRepcodes ZSTD_c_experimentalParam19 + +/*! ZSTD_CCtx_getParameter() : + * Get the requested compression parameter value, selected by enum ZSTD_cParameter, + * and store it into int* value. + * @return : 0, or an error code (which can be tested with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value); + + +/*! ZSTD_CCtx_params : + * Quick howto : + * - ZSTD_createCCtxParams() : Create a ZSTD_CCtx_params structure + * - ZSTD_CCtxParams_setParameter() : Push parameters one by one into + * an existing ZSTD_CCtx_params structure. + * This is similar to + * ZSTD_CCtx_setParameter(). + * - ZSTD_CCtx_setParametersUsingCCtxParams() : Apply parameters to + * an existing CCtx. + * These parameters will be applied to + * all subsequent frames. + * - ZSTD_compressStream2() : Do compression using the CCtx. + * - ZSTD_freeCCtxParams() : Free the memory, accept NULL pointer. + * + * This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams() + * for static allocation of CCtx for single-threaded compression. + */ +ZSTDLIB_STATIC_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void); +ZSTDLIB_STATIC_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointer */ + +/*! ZSTD_CCtxParams_reset() : + * Reset params to default values. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params); + +/*! ZSTD_CCtxParams_init() : + * Initializes the compression parameters of cctxParams according to + * compression level. All other parameters are reset to their default values. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel); + +/*! ZSTD_CCtxParams_init_advanced() : + * Initializes the compression and frame parameters of cctxParams according to + * params. All other parameters are reset to their default values. + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params); + +/*! ZSTD_CCtxParams_setParameter() : Requires v1.4.0+ + * Similar to ZSTD_CCtx_setParameter. + * Set one compression parameter, selected by enum ZSTD_cParameter. + * Parameters must be applied to a ZSTD_CCtx using + * ZSTD_CCtx_setParametersUsingCCtxParams(). + * @result : a code representing success or failure (which can be tested with + * ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value); + +/*! ZSTD_CCtxParams_getParameter() : + * Similar to ZSTD_CCtx_getParameter. + * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter. + * @result : 0, or an error code (which can be tested with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value); + +/*! ZSTD_CCtx_setParametersUsingCCtxParams() : + * Apply a set of ZSTD_CCtx_params to the compression context. + * This can be done even after compression is started, + * if nbWorkers==0, this will have no impact until a new compression is started. + * if nbWorkers>=1, new parameters will be picked up at next job, + * with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated). + */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( + ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params); + +/*! ZSTD_compressStream2_simpleArgs() : + * Same as ZSTD_compressStream2(), + * but using only integral types as arguments. + * This variant might be helpful for binders from dynamic languages + * which have troubles handling structures containing memory pointers. + */ +ZSTDLIB_STATIC_API size_t ZSTD_compressStream2_simpleArgs ( + ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, size_t* dstPos, + const void* src, size_t srcSize, size_t* srcPos, + ZSTD_EndDirective endOp); + + +/*************************************** +* Advanced decompression functions +***************************************/ + +/*! ZSTD_isFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier. + * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. + * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. + * Note 3 : Skippable Frame Identifiers are considered valid. */ +ZSTDLIB_STATIC_API unsigned ZSTD_isFrame(const void* buffer, size_t size); + +/*! ZSTD_createDDict_byReference() : + * Create a digested dictionary, ready to start decompression operation without startup delay. + * Dictionary content is referenced, and therefore stays in dictBuffer. + * It is important that dictBuffer outlives DDict, + * it must remain read accessible throughout the lifetime of DDict */ +ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize); + +/*! ZSTD_DCtx_loadDictionary_byReference() : + * Same as ZSTD_DCtx_loadDictionary(), + * but references `dict` content instead of copying it into `dctx`. + * This saves memory if `dict` remains around., + * However, it's imperative that `dict` remains accessible (and unmodified) while being used, so it must outlive decompression. */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); + +/*! ZSTD_DCtx_loadDictionary_advanced() : + * Same as ZSTD_DCtx_loadDictionary(), + * but gives direct control over + * how to load the dictionary (by copy ? by reference ?) + * and how to interpret it (automatic ? force raw mode ? full mode only ?). */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); + +/*! ZSTD_DCtx_refPrefix_advanced() : + * Same as ZSTD_DCtx_refPrefix(), but gives finer control over + * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); + +/*! ZSTD_DCtx_setMaxWindowSize() : + * Refuses allocating internal buffers for frames requiring a window size larger than provided limit. + * This protects a decoder context from reserving too much memory for itself (potential attack scenario). + * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode. + * By default, a decompression context accepts all window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) + * @return : 0, or an error code (which can be tested using ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize); + +/*! ZSTD_DCtx_getParameter() : + * Get the requested decompression parameter value, selected by enum ZSTD_dParameter, + * and store it into int* value. + * @return : 0, or an error code (which can be tested with ZSTD_isError()). + */ +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value); + +/* ZSTD_d_format + * experimental parameter, + * allowing selection between ZSTD_format_e input compression formats + */ +#define ZSTD_d_format ZSTD_d_experimentalParam1 +/* ZSTD_d_stableOutBuffer + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable. + * + * Tells the decompressor that the ZSTD_outBuffer will ALWAYS be the same + * between calls, except for the modifications that zstd makes to pos (the + * caller must not modify pos). This is checked by the decompressor, and + * decompression will fail if it ever changes. Therefore the ZSTD_outBuffer + * MUST be large enough to fit the entire decompressed frame. This will be + * checked when the frame content size is known. The data in the ZSTD_outBuffer + * in the range [dst, dst + pos) MUST not be modified during decompression + * or you will get data corruption. + * + * When this flag is enabled zstd won't allocate an output buffer, because + * it can write directly to the ZSTD_outBuffer, but it will still allocate + * an input buffer large enough to fit any compressed block. This will also + * avoid the memcpy() from the internal output buffer to the ZSTD_outBuffer. + * If you need to avoid the input buffer allocation use the buffer-less + * streaming API. + * + * NOTE: So long as the ZSTD_outBuffer always points to valid memory, using + * this flag is ALWAYS memory safe, and will never access out-of-bounds + * memory. However, decompression WILL fail if you violate the preconditions. + * + * WARNING: The data in the ZSTD_outBuffer in the range [dst, dst + pos) MUST + * not be modified during decompression or you will get data corruption. This + * is because zstd needs to reference data in the ZSTD_outBuffer to regenerate + * matches. Normally zstd maintains its own buffer for this purpose, but passing + * this flag tells zstd to use the user provided buffer. + */ +#define ZSTD_d_stableOutBuffer ZSTD_d_experimentalParam2 + +/* ZSTD_d_forceIgnoreChecksum + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable + * + * Tells the decompressor to skip checksum validation during decompression, regardless + * of whether checksumming was specified during compression. This offers some + * slight performance benefits, and may be useful for debugging. + * Param has values of type ZSTD_forceIgnoreChecksum_e + */ +#define ZSTD_d_forceIgnoreChecksum ZSTD_d_experimentalParam3 + +/* ZSTD_d_refMultipleDDicts + * Experimental parameter. + * Default is 0 == disabled. Set to 1 to enable + * + * If enabled and dctx is allocated on the heap, then additional memory will be allocated + * to store references to multiple ZSTD_DDict. That is, multiple calls of ZSTD_refDDict() + * using a given ZSTD_DCtx, rather than overwriting the previous DDict reference, will instead + * store all references. At decompression time, the appropriate dictID is selected + * from the set of DDicts based on the dictID in the frame. + * + * Usage is simply calling ZSTD_refDDict() on multiple dict buffers. + * + * Param has values of byte ZSTD_refMultipleDDicts_e + * + * WARNING: Enabling this parameter and calling ZSTD_DCtx_refDDict(), will trigger memory + * allocation for the hash table. ZSTD_freeDCtx() also frees this memory. + * Memory is allocated as per ZSTD_DCtx::customMem. + * + * Although this function allocates memory for the table, the user is still responsible for + * memory management of the underlying ZSTD_DDict* themselves. + */ +#define ZSTD_d_refMultipleDDicts ZSTD_d_experimentalParam4 + +/* ZSTD_d_disableHuffmanAssembly + * Set to 1 to disable the Huffman assembly implementation. + * The default value is 0, which allows zstd to use the Huffman assembly + * implementation if available. + * + * This parameter can be used to disable Huffman assembly at runtime. + * If you want to disable it at compile time you can define the macro + * ZSTD_DISABLE_ASM. + */ +#define ZSTD_d_disableHuffmanAssembly ZSTD_d_experimentalParam5 + + +/*! ZSTD_DCtx_setFormat() : + * This function is REDUNDANT. Prefer ZSTD_DCtx_setParameter(). + * Instruct the decoder context about what kind of data to decode next. + * This instruction is mandatory to decode data without a fully-formed header, + * such ZSTD_f_zstd1_magicless for example. + * @return : 0, or an error code (which can be tested using ZSTD_isError()). */ +ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead") +ZSTDLIB_STATIC_API +size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); + +/*! ZSTD_decompressStream_simpleArgs() : + * Same as ZSTD_decompressStream(), + * but using only integral types as arguments. + * This can be helpful for binders from dynamic languages + * which have troubles handling structures containing memory pointers. + */ +ZSTDLIB_STATIC_API size_t ZSTD_decompressStream_simpleArgs ( + ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, size_t* dstPos, + const void* src, size_t srcSize, size_t* srcPos); + + +/******************************************************************** +* Advanced streaming functions +* Warning : most of these functions are now redundant with the Advanced API. +* Once Advanced API reaches "stable" status, +* redundant functions will be deprecated, and then at some point removed. +********************************************************************/ + +/*===== Advanced Streaming compression functions =====*/ + +/*! ZSTD_initCStream_srcSize() : + * This function is DEPRECATED, and equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) + * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * + * pledgedSrcSize must be correct. If it is not known at init time, use + * ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs, + * "0" also disables frame content size field. It may be enabled in the future. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, + int compressionLevel, + unsigned long long pledgedSrcSize); + +/*! ZSTD_initCStream_usingDict() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + * ZSTD_CCtx_loadDictionary(zcs, dict, dictSize); + * + * Creates of an internal CDict (incompatible with static CCtx), except if + * dict == NULL or dictSize < 8, in which case no dict is used. + * Note: dict is loaded with ZSTD_dct_auto (treated as a full zstd dictionary if + * it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, + const void* dict, size_t dictSize, + int compressionLevel); + +/*! ZSTD_initCStream_advanced() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setParams(zcs, params); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * ZSTD_CCtx_loadDictionary(zcs, dict, dictSize); + * + * dict is loaded with ZSTD_dct_auto and ZSTD_dlm_byCopy. + * pledgedSrcSize must be correct. + * If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, + const void* dict, size_t dictSize, + ZSTD_parameters params, + unsigned long long pledgedSrcSize); + +/*! ZSTD_initCStream_usingCDict() : + * This function is DEPRECATED, and equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_refCDict(zcs, cdict); + * + * note : cdict will just be referenced, and must outlive compression session + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict); + +/*! ZSTD_initCStream_usingCDict_advanced() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setFParams(zcs, fParams); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * ZSTD_CCtx_refCDict(zcs, cdict); + * + * same as ZSTD_initCStream_usingCDict(), with control over frame parameters. + * pledgedSrcSize must be correct. If srcSize is not known at init time, use + * value ZSTD_CONTENTSIZE_UNKNOWN. + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, + const ZSTD_CDict* cdict, + ZSTD_frameParameters fParams, + unsigned long long pledgedSrcSize); + +/*! ZSTD_resetCStream() : + * This function is DEPRECATED, and is equivalent to: + * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); + * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); + * Note: ZSTD_resetCStream() interprets pledgedSrcSize == 0 as ZSTD_CONTENTSIZE_UNKNOWN, but + * ZSTD_CCtx_setPledgedSrcSize() does not do the same, so ZSTD_CONTENTSIZE_UNKNOWN must be + * explicitly specified. + * + * start a new frame, using same parameters from previous frame. + * This is typically useful to skip dictionary loading stage, since it will re-use it in-place. + * Note that zcs must be init at least once before using ZSTD_resetCStream(). + * If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN. + * If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end. + * For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs, + * but it will change to mean "empty" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead. + * @return : 0, or an error code (which can be tested using ZSTD_isError()) + * This prototype will generate compilation warnings. + */ +ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API +size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); + + +typedef struct { + unsigned long long ingested; /* nb input bytes read and buffered */ + unsigned long long consumed; /* nb input bytes actually compressed */ + unsigned long long produced; /* nb of compressed bytes generated and buffered */ + unsigned long long flushed; /* nb of compressed bytes flushed : not provided; can be tracked from caller side */ + unsigned currentJobID; /* MT only : latest started job nb */ + unsigned nbActiveWorkers; /* MT only : nb of workers actively compressing at probe time */ +} ZSTD_frameProgression; + +/* ZSTD_getFrameProgression() : + * tells how much data has been ingested (read from input) + * consumed (input actually compressed) and produced (output) for current frame. + * Note : (ingested - consumed) is amount of input data buffered internally, not yet compressed. + * Aggregates progression inside active worker threads. + */ +ZSTDLIB_STATIC_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx); + +/*! ZSTD_toFlushNow() : + * Tell how many bytes are ready to be flushed immediately. + * Useful for multithreading scenarios (nbWorkers >= 1). + * Probe the oldest active job, defined as oldest job not yet entirely flushed, + * and check its output buffer. + * @return : amount of data stored in oldest job and ready to be flushed immediately. + * if @return == 0, it means either : + * + there is no active job (could be checked with ZSTD_frameProgression()), or + * + oldest job is still actively compressing data, + * but everything it has produced has also been flushed so far, + * therefore flush speed is limited by production speed of oldest job + * irrespective of the speed of concurrent (and newer) jobs. + */ +ZSTDLIB_STATIC_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx); + + +/*===== Advanced Streaming decompression functions =====*/ + +/*! + * This function is deprecated, and is equivalent to: + * + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * ZSTD_DCtx_loadDictionary(zds, dict, dictSize); + * + * note: no dictionary will be used if dict == NULL or dictSize < 8 + */ +ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_loadDictionary, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); + +/*! + * This function is deprecated, and is equivalent to: + * + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * ZSTD_DCtx_refDDict(zds, ddict); + * + * note : ddict is referenced, it must outlive decompression session + */ +ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_refDDict, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); + +/*! + * This function is deprecated, and is equivalent to: + * + * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + * + * re-use decompression parameters from previous init; saves dictionary loading + */ +ZSTD_DEPRECATED("use ZSTD_DCtx_reset, see zstd.h for detailed instructions") +ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); + + +/* ********************* BLOCK-LEVEL SEQUENCE PRODUCER API ********************* + * + * *** OVERVIEW *** + * The Block-Level Sequence Producer API allows users to provide their own custom + * sequence producer which libzstd invokes to process each block. The produced list + * of sequences (literals and matches) is then post-processed by libzstd to produce + * valid compressed blocks. + * + * This block-level offload API is a more granular complement of the existing + * frame-level offload API compressSequences() (introduced in v1.5.1). It offers + * an easier migration story for applications already integrated with libzstd: the + * user application continues to invoke the same compression functions + * ZSTD_compress2() or ZSTD_compressStream2() as usual, and transparently benefits + * from the specific advantages of the external sequence producer. For example, + * the sequence producer could be tuned to take advantage of known characteristics + * of the input, to offer better speed / ratio, or could leverage hardware + * acceleration not available within libzstd itself. + * + * See contrib/externalSequenceProducer for an example program employing the + * Block-Level Sequence Producer API. + * + * *** USAGE *** + * The user is responsible for implementing a function of type + * ZSTD_sequenceProducer_F. For each block, zstd will pass the following + * arguments to the user-provided function: + * + * - sequenceProducerState: a pointer to a user-managed state for the sequence + * producer. + * + * - outSeqs, outSeqsCapacity: an output buffer for the sequence producer. + * outSeqsCapacity is guaranteed >= ZSTD_sequenceBound(srcSize). The memory + * backing outSeqs is managed by the CCtx. + * + * - src, srcSize: an input buffer for the sequence producer to parse. + * srcSize is guaranteed to be <= ZSTD_BLOCKSIZE_MAX. + * + * - dict, dictSize: a history buffer, which may be empty, which the sequence + * producer may reference as it parses the src buffer. Currently, zstd will + * always pass dictSize == 0 into external sequence producers, but this will + * change in the future. + * + * - compressionLevel: a signed integer representing the zstd compression level + * set by the user for the current operation. The sequence producer may choose + * to use this information to change its compression strategy and speed/ratio + * tradeoff. Note: the compression level does not reflect zstd parameters set + * through the advanced API. + * + * - windowSize: a size_t representing the maximum allowed offset for external + * sequences. Note that sequence offsets are sometimes allowed to exceed the + * windowSize if a dictionary is present, see doc/zstd_compression_format.md + * for details. + * + * The user-provided function shall return a size_t representing the number of + * sequences written to outSeqs. This return value will be treated as an error + * code if it is greater than outSeqsCapacity. The return value must be non-zero + * if srcSize is non-zero. The ZSTD_SEQUENCE_PRODUCER_ERROR macro is provided + * for convenience, but any value greater than outSeqsCapacity will be treated as + * an error code. + * + * If the user-provided function does not return an error code, the sequences + * written to outSeqs must be a valid parse of the src buffer. Data corruption may + * occur if the parse is not valid. A parse is defined to be valid if the + * following conditions hold: + * - The sum of matchLengths and literalLengths must equal srcSize. + * - All sequences in the parse, except for the final sequence, must have + * matchLength >= ZSTD_MINMATCH_MIN. The final sequence must have + * matchLength >= ZSTD_MINMATCH_MIN or matchLength == 0. + * - All offsets must respect the windowSize parameter as specified in + * doc/zstd_compression_format.md. + * - If the final sequence has matchLength == 0, it must also have offset == 0. + * + * zstd will only validate these conditions (and fail compression if they do not + * hold) if the ZSTD_c_validateSequences cParam is enabled. Note that sequence + * validation has a performance cost. + * + * If the user-provided function returns an error, zstd will either fall back + * to an internal sequence producer or fail the compression operation. The user can + * choose between the two behaviors by setting the ZSTD_c_enableSeqProducerFallback + * cParam. Fallback compression will follow any other cParam settings, such as + * compression level, the same as in a normal compression operation. + * + * The user shall instruct zstd to use a particular ZSTD_sequenceProducer_F + * function by calling + * ZSTD_registerSequenceProducer(cctx, + * sequenceProducerState, + * sequenceProducer) + * This setting will persist until the next parameter reset of the CCtx. + * + * The sequenceProducerState must be initialized by the user before calling + * ZSTD_registerSequenceProducer(). The user is responsible for destroying the + * sequenceProducerState. + * + * *** LIMITATIONS *** + * This API is compatible with all zstd compression APIs which respect advanced parameters. + * However, there are three limitations: + * + * First, the ZSTD_c_enableLongDistanceMatching cParam is not currently supported. + * COMPRESSION WILL FAIL if it is enabled and the user tries to compress with a block-level + * external sequence producer. + * - Note that ZSTD_c_enableLongDistanceMatching is auto-enabled by default in some + * cases (see its documentation for details). Users must explicitly set + * ZSTD_c_enableLongDistanceMatching to ZSTD_ps_disable in such cases if an external + * sequence producer is registered. + * - As of this writing, ZSTD_c_enableLongDistanceMatching is disabled by default + * whenever ZSTD_c_windowLog < 128MB, but that's subject to change. Users should + * check the docs on ZSTD_c_enableLongDistanceMatching whenever the Block-Level Sequence + * Producer API is used in conjunction with advanced settings (like ZSTD_c_windowLog). + * + * Second, history buffers are not currently supported. Concretely, zstd will always pass + * dictSize == 0 to the external sequence producer (for now). This has two implications: + * - Dictionaries are not currently supported. Compression will *not* fail if the user + * references a dictionary, but the dictionary won't have any effect. + * - Stream history is not currently supported. All advanced compression APIs, including + * streaming APIs, work with external sequence producers, but each block is treated as + * an independent chunk without history from previous blocks. + * + * Third, multi-threading within a single compression is not currently supported. In other words, + * COMPRESSION WILL FAIL if ZSTD_c_nbWorkers > 0 and an external sequence producer is registered. + * Multi-threading across compressions is fine: simply create one CCtx per thread. + * + * Long-term, we plan to overcome all three limitations. There is no technical blocker to + * overcoming them. It is purely a question of engineering effort. + */ + +#define ZSTD_SEQUENCE_PRODUCER_ERROR ((size_t)(-1)) + +typedef size_t ZSTD_sequenceProducer_F ( + void* sequenceProducerState, + ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + int compressionLevel, + size_t windowSize +); + +/*! ZSTD_registerSequenceProducer() : + * Instruct zstd to use a block-level external sequence producer function. + * + * The sequenceProducerState must be initialized by the caller, and the caller is + * responsible for managing its lifetime. This parameter is sticky across + * compressions. It will remain set until the user explicitly resets compression + * parameters. + * + * Sequence producer registration is considered to be an "advanced parameter", + * part of the "advanced API". This means it will only have an effect on compression + * APIs which respect advanced parameters, such as compress2() and compressStream2(). + * Older compression APIs such as compressCCtx(), which predate the introduction of + * "advanced parameters", will ignore any external sequence producer setting. + * + * The sequence producer can be "cleared" by registering a NULL function pointer. This + * removes all limitations described above in the "LIMITATIONS" section of the API docs. + * + * The user is strongly encouraged to read the full API documentation (above) before + * calling this function. */ +ZSTDLIB_STATIC_API void +ZSTD_registerSequenceProducer( + ZSTD_CCtx* cctx, + void* sequenceProducerState, + ZSTD_sequenceProducer_F* sequenceProducer +); + + +/********************************************************************* +* Buffer-less and synchronous inner streaming functions (DEPRECATED) +* +* This API is deprecated, and will be removed in a future version. +* It allows streaming (de)compression with user allocated buffers. +* However, it is hard to use, and not as well tested as the rest of +* our API. +* +* Please use the normal streaming API instead: ZSTD_compressStream2, +* and ZSTD_decompressStream. +* If there is functionality that you need, but it doesn't provide, +* please open an issue on our GitHub. +********************************************************************* */ + +/** + Buffer-less streaming compression (synchronous mode) + + A ZSTD_CCtx object is required to track streaming operations. + Use ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource. + ZSTD_CCtx object can be re-used multiple times within successive compression operations. + + Start by initializing a context. + Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression. + + Then, consume your input using ZSTD_compressContinue(). + There are some important considerations to keep in mind when using this advanced function : + - ZSTD_compressContinue() has no internal buffer. It uses externally provided buffers only. + - Interface is synchronous : input is consumed entirely and produces 1+ compressed blocks. + - Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario. + Worst case evaluation is provided by ZSTD_compressBound(). + ZSTD_compressContinue() doesn't guarantee recover after a failed compression. + - ZSTD_compressContinue() presumes prior input ***is still accessible and unmodified*** (up to maximum distance size, see WindowLog). + It remembers all previous contiguous blocks, plus one separated memory segment (which can itself consists of multiple contiguous blocks) + - ZSTD_compressContinue() detects that prior input has been overwritten when `src` buffer overlaps. + In which case, it will "discard" the relevant memory section from its history. + + Finish a frame with ZSTD_compressEnd(), which will write the last block(s) and optional checksum. + It's possible to use srcSize==0, in which case, it will write a final empty block to end the frame. + Without last block mark, frames are considered unfinished (hence corrupted) by compliant decoders. + + `ZSTD_CCtx` object can be re-used (ZSTD_compressBegin()) to compress again. +*/ + +/*===== Buffer-less streaming compression functions =====*/ +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */ + +ZSTD_DEPRECATED("This function will likely be removed in a future release. It is misleading and has very limited utility.") +ZSTDLIB_STATIC_API +size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */ + +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + +/* The ZSTD_compressBegin_advanced() and ZSTD_compressBegin_usingCDict_advanced() are now DEPRECATED and will generate a compiler warning */ +ZSTD_DEPRECATED("use advanced API to access custom parameters") +ZSTDLIB_STATIC_API +size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize : If srcSize is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN */ +ZSTD_DEPRECATED("use advanced API to access custom parameters") +ZSTDLIB_STATIC_API +size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict, ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize); /* compression parameters are already set within cdict. pledgedSrcSize must be correct. If srcSize is not known, use macro ZSTD_CONTENTSIZE_UNKNOWN */ +/** + Buffer-less streaming decompression (synchronous mode) + + A ZSTD_DCtx object is required to track streaming operations. + Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it. + A ZSTD_DCtx object can be re-used multiple times. + + First typical operation is to retrieve frame parameters, using ZSTD_getFrameHeader(). + Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough. + Data fragment must be large enough to ensure successful decoding. + `ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough. + result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled. + >0 : `srcSize` is too small, please provide at least result bytes on next attempt. + errorCode, which can be tested using ZSTD_isError(). + + It fills a ZSTD_frameHeader structure with important information to correctly decode the frame, + such as the dictionary ID, content size, or maximum back-reference distance (`windowSize`). + Note that these values could be wrong, either because of data corruption, or because a 3rd party deliberately spoofs false information. + As a consequence, check that values remain within valid application range. + For example, do not allocate memory blindly, check that `windowSize` is within expectation. + Each application can set its own limits, depending on local restrictions. + For extended interoperability, it is recommended to support `windowSize` of at least 8 MB. + + ZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize` bytes. + ZSTD_decompressContinue() is very sensitive to contiguity, + if 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place, + or that previous contiguous segment is large enough to properly handle maximum back-reference distance. + There are multiple ways to guarantee this condition. + + The most memory efficient way is to use a round buffer of sufficient size. + Sufficient size is determined by invoking ZSTD_decodingBufferSize_min(), + which can return an error code if required value is too large for current system (in 32-bits mode). + In a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one, + up to the moment there is not enough room left in the buffer to guarantee decoding another full block, + which maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`. + At which point, decoding can resume from the beginning of the buffer. + Note that already decoded data stored in the buffer should be flushed before being overwritten. + + There are alternatives possible, for example using two or more buffers of size `windowSize` each, though they consume more memory. + + Finally, if you control the compression process, you can also ignore all buffer size rules, + as long as the encoder and decoder progress in "lock-step", + aka use exactly the same buffer sizes, break contiguity at the same place, etc. + + Once buffers are setup, start decompression, with ZSTD_decompressBegin(). + If decompression requires a dictionary, use ZSTD_decompressBegin_usingDict() or ZSTD_decompressBegin_usingDDict(). + + Then use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively. + ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue(). + ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail. + + result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity). + It can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item. + It can also be an error code, which can be tested with ZSTD_isError(). + + A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero. + Context can then be reset to start a new decompression. + + Note : it's possible to know if next input to present is a header or a block, using ZSTD_nextInputType(). + This information is not required to properly decode a frame. + + == Special case : skippable frames == + + Skippable frames allow integration of user-defined data into a flow of concatenated frames. + Skippable frames will be ignored (skipped) by decompressor. + The format of skippable frames is as follows : + a) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F + b) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits + c) Frame Content - any content (User Data) of length equal to Frame Size + For skippable frames ZSTD_getFrameHeader() returns zfhPtr->frameType==ZSTD_skippableFrame. + For skippable frames ZSTD_decompressContinue() always returns 0 : it only skips the content. +*/ + +/*===== Buffer-less streaming decompression functions =====*/ + +ZSTDLIB_STATIC_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */ + +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); + +ZSTDLIB_STATIC_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + +/* misc */ +ZSTD_DEPRECATED("This function will likely be removed in the next minor release. It is misleading and has very limited utility.") +ZSTDLIB_STATIC_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); +typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; +ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); + + + + +/* ========================================= */ +/** Block level API (DEPRECATED) */ +/* ========================================= */ + +/*! + + This API is deprecated in favor of the regular compression API. + You can get the frame header down to 2 bytes by setting: + - ZSTD_c_format = ZSTD_f_zstd1_magicless + - ZSTD_c_contentSizeFlag = 0 + - ZSTD_c_checksumFlag = 0 + - ZSTD_c_dictIDFlag = 0 + + This API is not as well tested as our normal API, so we recommend not using it. + We will be removing it in a future version. If the normal API doesn't provide + the functionality you need, please open a GitHub issue. + + Block functions produce and decode raw zstd blocks, without frame metadata. + Frame metadata cost is typically ~12 bytes, which can be non-negligible for very small blocks (< 100 bytes). + But users will have to take in charge needed metadata to regenerate data, such as compressed and content sizes. + + A few rules to respect : + - Compressing and decompressing require a context structure + + Use ZSTD_createCCtx() and ZSTD_createDCtx() + - It is necessary to init context before starting + + compression : any ZSTD_compressBegin*() variant, including with dictionary + + decompression : any ZSTD_decompressBegin*() variant, including with dictionary + - Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB + + If input is larger than a block size, it's necessary to split input data into multiple blocks + + For inputs larger than a single block, consider using regular ZSTD_compress() instead. + Frame metadata is not that costly, and quickly becomes negligible as source size grows larger than a block. + - When a block is considered not compressible enough, ZSTD_compressBlock() result will be 0 (zero) ! + ===> In which case, nothing is produced into `dst` ! + + User __must__ test for such outcome and deal directly with uncompressed data + + A block cannot be declared incompressible if ZSTD_compressBlock() return value was != 0. + Doing so would mess up with statistics history, leading to potential data corruption. + + ZSTD_decompressBlock() _doesn't accept uncompressed data as input_ !! + + In case of multiple successive blocks, should some of them be uncompressed, + decoder must be informed of their existence in order to follow proper history. + Use ZSTD_insertBlock() for such a case. +*/ + +/*===== Raw zstd block functions =====*/ +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_getBlockSize (const ZSTD_CCtx* cctx); +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.") +ZSTDLIB_STATIC_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */ + +#endif /* ZSTD_H_ZSTD_STATIC_LINKING_ONLY */ + +#if defined (__cplusplus) +} +#endif +/**** ended inlining ../zstd.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: fse.h ****/ +/**** skipping file: huf.h ****/ +#ifndef XXH_STATIC_LINKING_ONLY +# define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */ +#endif +/**** start inlining xxhash.h ****/ +/* + * xxHash - Fast Hash algorithm + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - xxHash homepage: https://cyan4973.github.io/xxHash/ + * - xxHash source repository : https://github.com/Cyan4973/xxHash + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +*/ + + +#ifndef XXH_NO_XXH3 +# define XXH_NO_XXH3 +#endif + +#ifndef XXH_NAMESPACE +# define XXH_NAMESPACE ZSTD_ +#endif + +/*! + * @mainpage xxHash + * + * @file xxhash.h + * xxHash prototypes and implementation + */ +/* TODO: update */ +/* Notice extracted from xxHash homepage: + +xxHash is an extremely fast hash algorithm, running at RAM speed limits. +It also successfully passes all tests from the SMHasher suite. + +Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz) + +Name Speed Q.Score Author +xxHash 5.4 GB/s 10 +CrapWow 3.2 GB/s 2 Andrew +MurmurHash 3a 2.7 GB/s 10 Austin Appleby +SpookyHash 2.0 GB/s 10 Bob Jenkins +SBox 1.4 GB/s 9 Bret Mulvey +Lookup3 1.2 GB/s 9 Bob Jenkins +SuperFastHash 1.2 GB/s 1 Paul Hsieh +CityHash64 1.05 GB/s 10 Pike & Alakuijala +FNV 0.55 GB/s 5 Fowler, Noll, Vo +CRC32 0.43 GB/s 9 +MD5-32 0.33 GB/s 10 Ronald L. Rivest +SHA1-32 0.28 GB/s 10 + +Q.Score is a measure of quality of the hash function. +It depends on successfully passing SMHasher test set. +10 is a perfect score. + +Note: SMHasher's CRC32 implementation is not the fastest one. +Other speed-oriented implementations can be faster, +especially in combination with PCLMUL instruction: +https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html?showComment=1552696407071#c3490092340461170735 + +A 64-bit version, named XXH64, is available since r35. +It offers much better speed, but for 64-bit applications only. +Name Speed on 64 bits Speed on 32 bits +XXH64 13.8 GB/s 1.9 GB/s +XXH32 6.8 GB/s 6.0 GB/s +*/ + +#if defined (__cplusplus) +extern "C" { +#endif + +/* **************************** + * INLINE mode + ******************************/ +/*! + * XXH_INLINE_ALL (and XXH_PRIVATE_API) + * Use these build macros to inline xxhash into the target unit. + * Inlining improves performance on small inputs, especially when the length is + * expressed as a compile-time constant: + * + * https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html + * + * It also keeps xxHash symbols private to the unit, so they are not exported. + * + * Usage: + * #define XXH_INLINE_ALL + * #include "xxhash.h" + * + * Do not compile and link xxhash.o as a separate object, as it is not useful. + */ +#if (defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)) \ + && !defined(XXH_INLINE_ALL_31684351384) + /* this section should be traversed only once */ +# define XXH_INLINE_ALL_31684351384 + /* give access to the advanced API, required to compile implementations */ +# undef XXH_STATIC_LINKING_ONLY /* avoid macro redef */ +# define XXH_STATIC_LINKING_ONLY + /* make all functions private */ +# undef XXH_PUBLIC_API +# if defined(__GNUC__) +# define XXH_PUBLIC_API static __inline __attribute__((unused)) +# elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# define XXH_PUBLIC_API static inline +# elif defined(_MSC_VER) +# define XXH_PUBLIC_API static __inline +# else + /* note: this version may generate warnings for unused static functions */ +# define XXH_PUBLIC_API static +# endif + + /* + * This part deals with the special case where a unit wants to inline xxHash, + * but "xxhash.h" has previously been included without XXH_INLINE_ALL, + * such as part of some previously included *.h header file. + * Without further action, the new include would just be ignored, + * and functions would effectively _not_ be inlined (silent failure). + * The following macros solve this situation by prefixing all inlined names, + * avoiding naming collision with previous inclusions. + */ + /* Before that, we unconditionally #undef all symbols, + * in case they were already defined with XXH_NAMESPACE. + * They will then be redefined for XXH_INLINE_ALL + */ +# undef XXH_versionNumber + /* XXH32 */ +# undef XXH32 +# undef XXH32_createState +# undef XXH32_freeState +# undef XXH32_reset +# undef XXH32_update +# undef XXH32_digest +# undef XXH32_copyState +# undef XXH32_canonicalFromHash +# undef XXH32_hashFromCanonical + /* XXH64 */ +# undef XXH64 +# undef XXH64_createState +# undef XXH64_freeState +# undef XXH64_reset +# undef XXH64_update +# undef XXH64_digest +# undef XXH64_copyState +# undef XXH64_canonicalFromHash +# undef XXH64_hashFromCanonical + /* XXH3_64bits */ +# undef XXH3_64bits +# undef XXH3_64bits_withSecret +# undef XXH3_64bits_withSeed +# undef XXH3_64bits_withSecretandSeed +# undef XXH3_createState +# undef XXH3_freeState +# undef XXH3_copyState +# undef XXH3_64bits_reset +# undef XXH3_64bits_reset_withSeed +# undef XXH3_64bits_reset_withSecret +# undef XXH3_64bits_update +# undef XXH3_64bits_digest +# undef XXH3_generateSecret + /* XXH3_128bits */ +# undef XXH128 +# undef XXH3_128bits +# undef XXH3_128bits_withSeed +# undef XXH3_128bits_withSecret +# undef XXH3_128bits_reset +# undef XXH3_128bits_reset_withSeed +# undef XXH3_128bits_reset_withSecret +# undef XXH3_128bits_reset_withSecretandSeed +# undef XXH3_128bits_update +# undef XXH3_128bits_digest +# undef XXH128_isEqual +# undef XXH128_cmp +# undef XXH128_canonicalFromHash +# undef XXH128_hashFromCanonical + /* Finally, free the namespace itself */ +# undef XXH_NAMESPACE + + /* employ the namespace for XXH_INLINE_ALL */ +# define XXH_NAMESPACE XXH_INLINE_ + /* + * Some identifiers (enums, type names) are not symbols, + * but they must nonetheless be renamed to avoid redeclaration. + * Alternative solution: do not redeclare them. + * However, this requires some #ifdefs, and has a more dispersed impact. + * Meanwhile, renaming can be achieved in a single place. + */ +# define XXH_IPREF(Id) XXH_NAMESPACE ## Id +# define XXH_OK XXH_IPREF(XXH_OK) +# define XXH_ERROR XXH_IPREF(XXH_ERROR) +# define XXH_errorcode XXH_IPREF(XXH_errorcode) +# define XXH32_canonical_t XXH_IPREF(XXH32_canonical_t) +# define XXH64_canonical_t XXH_IPREF(XXH64_canonical_t) +# define XXH128_canonical_t XXH_IPREF(XXH128_canonical_t) +# define XXH32_state_s XXH_IPREF(XXH32_state_s) +# define XXH32_state_t XXH_IPREF(XXH32_state_t) +# define XXH64_state_s XXH_IPREF(XXH64_state_s) +# define XXH64_state_t XXH_IPREF(XXH64_state_t) +# define XXH3_state_s XXH_IPREF(XXH3_state_s) +# define XXH3_state_t XXH_IPREF(XXH3_state_t) +# define XXH128_hash_t XXH_IPREF(XXH128_hash_t) + /* Ensure the header is parsed again, even if it was previously included */ +# undef XXHASH_H_5627135585666179 +# undef XXHASH_H_STATIC_13879238742 +#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */ + + + +/* **************************************************************** + * Stable API + *****************************************************************/ +#ifndef XXHASH_H_5627135585666179 +#define XXHASH_H_5627135585666179 1 + + +/*! + * @defgroup public Public API + * Contains details on the public xxHash functions. + * @{ + */ +/* specific declaration modes for Windows */ +#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API) +# if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT)) +# ifdef XXH_EXPORT +# define XXH_PUBLIC_API __declspec(dllexport) +# elif XXH_IMPORT +# define XXH_PUBLIC_API __declspec(dllimport) +# endif +# else +# define XXH_PUBLIC_API /* do nothing */ +# endif +#endif + +#ifdef XXH_DOXYGEN +/*! + * @brief Emulate a namespace by transparently prefixing all symbols. + * + * If you want to include _and expose_ xxHash functions from within your own + * library, but also want to avoid symbol collisions with other libraries which + * may also include xxHash, you can use XXH_NAMESPACE to automatically prefix + * any public symbol from xxhash library with the value of XXH_NAMESPACE + * (therefore, avoid empty or numeric values). + * + * Note that no change is required within the calling program as long as it + * includes `xxhash.h`: Regular symbol names will be automatically translated + * by this header. + */ +# define XXH_NAMESPACE /* YOUR NAME HERE */ +# undef XXH_NAMESPACE +#endif + +#ifdef XXH_NAMESPACE +# define XXH_CAT(A,B) A##B +# define XXH_NAME2(A,B) XXH_CAT(A,B) +# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber) +/* XXH32 */ +# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32) +# define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState) +# define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState) +# define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset) +# define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update) +# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest) +# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState) +# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash) +# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical) +/* XXH64 */ +# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64) +# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState) +# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState) +# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset) +# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update) +# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest) +# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState) +# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash) +# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical) +/* XXH3_64bits */ +# define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits) +# define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret) +# define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed) +# define XXH3_64bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecretandSeed) +# define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState) +# define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState) +# define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState) +# define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset) +# define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed) +# define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret) +# define XXH3_64bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecretandSeed) +# define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update) +# define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest) +# define XXH3_generateSecret XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret) +# define XXH3_generateSecret_fromSeed XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret_fromSeed) +/* XXH3_128bits */ +# define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128) +# define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits) +# define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed) +# define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret) +# define XXH3_128bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecretandSeed) +# define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset) +# define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed) +# define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret) +# define XXH3_128bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecretandSeed) +# define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update) +# define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest) +# define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual) +# define XXH128_cmp XXH_NAME2(XXH_NAMESPACE, XXH128_cmp) +# define XXH128_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH128_canonicalFromHash) +# define XXH128_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH128_hashFromCanonical) +#endif + + +/* ************************************* +* Version +***************************************/ +#define XXH_VERSION_MAJOR 0 +#define XXH_VERSION_MINOR 8 +#define XXH_VERSION_RELEASE 1 +#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE) + +/*! + * @brief Obtains the xxHash version. + * + * This is mostly useful when xxHash is compiled as a shared library, + * since the returned value comes from the library, as opposed to header file. + * + * @return `XXH_VERSION_NUMBER` of the invoked library. + */ +XXH_PUBLIC_API unsigned XXH_versionNumber (void); + + +/* **************************** +* Common basic types +******************************/ +#include /* size_t */ +typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; + + +/*-********************************************************************** +* 32-bit hash +************************************************************************/ +#if defined(XXH_DOXYGEN) /* Don't show include */ +/*! + * @brief An unsigned 32-bit integer. + * + * Not necessarily defined to `uint32_t` but functionally equivalent. + */ +typedef uint32_t XXH32_hash_t; + +#elif !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include + typedef uint32_t XXH32_hash_t; + +#else +# include +# if UINT_MAX == 0xFFFFFFFFUL + typedef unsigned int XXH32_hash_t; +# else +# if ULONG_MAX == 0xFFFFFFFFUL + typedef unsigned long XXH32_hash_t; +# else +# error "unsupported platform: need a 32-bit type" +# endif +# endif +#endif + +/*! + * @} + * + * @defgroup xxh32_family XXH32 family + * @ingroup public + * Contains functions used in the classic 32-bit xxHash algorithm. + * + * @note + * XXH32 is useful for older platforms, with no or poor 64-bit performance. + * Note that @ref xxh3_family provides competitive speed + * for both 32-bit and 64-bit systems, and offers true 64/128 bit hash results. + * + * @see @ref xxh64_family, @ref xxh3_family : Other xxHash families + * @see @ref xxh32_impl for implementation details + * @{ + */ + +/*! + * @brief Calculates the 32-bit hash of @p input using xxHash32. + * + * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark): 5.4 GB/s + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 32-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 32-bit hash value. + * + * @see + * XXH64(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH32_createState(), XXH32_update(), XXH32_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed); + +/*! + * Streaming functions generate the xxHash value from an incremental input. + * This method is slower than single-call functions, due to state management. + * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized. + * + * An XXH state must first be allocated using `XXH*_createState()`. + * + * Start a new hash by initializing the state with a seed using `XXH*_reset()`. + * + * Then, feed the hash state by calling `XXH*_update()` as many times as necessary. + * + * The function returns an error code, with 0 meaning OK, and any other value + * meaning there is an error. + * + * Finally, a hash value can be produced anytime, by using `XXH*_digest()`. + * This function returns the nn-bits hash as an int or long long. + * + * It's still possible to continue inserting input into the hash state after a + * digest, and generate new hash values later on by invoking `XXH*_digest()`. + * + * When done, release the state using `XXH*_freeState()`. + * + * Example code for incrementally hashing a file: + * @code{.c} + * #include + * #include + * #define BUFFER_SIZE 256 + * + * // Note: XXH64 and XXH3 use the same interface. + * XXH32_hash_t + * hashFile(FILE* stream) + * { + * XXH32_state_t* state; + * unsigned char buf[BUFFER_SIZE]; + * size_t amt; + * XXH32_hash_t hash; + * + * state = XXH32_createState(); // Create a state + * assert(state != NULL); // Error check here + * XXH32_reset(state, 0xbaad5eed); // Reset state with our seed + * while ((amt = fread(buf, 1, sizeof(buf), stream)) != 0) { + * XXH32_update(state, buf, amt); // Hash the file in chunks + * } + * hash = XXH32_digest(state); // Finalize the hash + * XXH32_freeState(state); // Clean up + * return hash; + * } + * @endcode + */ + +/*! + * @typedef struct XXH32_state_s XXH32_state_t + * @brief The opaque state struct for the XXH32 streaming API. + * + * @see XXH32_state_s for details. + */ +typedef struct XXH32_state_s XXH32_state_t; + +/*! + * @brief Allocates an @ref XXH32_state_t. + * + * Must be freed with XXH32_freeState(). + * @return An allocated XXH32_state_t on success, `NULL` on failure. + */ +XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void); +/*! + * @brief Frees an @ref XXH32_state_t. + * + * Must be allocated with XXH32_createState(). + * @param statePtr A pointer to an @ref XXH32_state_t allocated with @ref XXH32_createState(). + * @return XXH_OK. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr); +/*! + * @brief Copies one @ref XXH32_state_t to another. + * + * @param dst_state The state to copy to. + * @param src_state The state to copy from. + * @pre + * @p dst_state and @p src_state must not be `NULL` and must not overlap. + */ +XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state); + +/*! + * @brief Resets an @ref XXH32_state_t to begin a new hash. + * + * This function resets and seeds a state. Call it before @ref XXH32_update(). + * + * @param statePtr The state struct to reset. + * @param seed The 32-bit seed to alter the hash result predictably. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, XXH32_hash_t seed); + +/*! + * @brief Consumes a block of @p input to an @ref XXH32_state_t. + * + * Call this to incrementally consume blocks of data. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length); + +/*! + * @brief Returns the calculated hash value from an @ref XXH32_state_t. + * + * @note + * Calling XXH32_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated xxHash32 value from that state. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); + +/******* Canonical representation *******/ + +/* + * The default return values from XXH functions are unsigned 32 and 64 bit + * integers. + * This the simplest and fastest format for further post-processing. + * + * However, this leaves open the question of what is the order on the byte level, + * since little and big endian conventions will store the same number differently. + * + * The canonical representation settles this issue by mandating big-endian + * convention, the same convention as human-readable numbers (large digits first). + * + * When writing hash values to storage, sending them over a network, or printing + * them, it's highly recommended to use the canonical representation to ensure + * portability across a wider range of systems, present and future. + * + * The following functions allow transformation of hash values to and from + * canonical format. + */ + +/*! + * @brief Canonical (big endian) representation of @ref XXH32_hash_t. + */ +typedef struct { + unsigned char digest[4]; /*!< Hash bytes, big endian */ +} XXH32_canonical_t; + +/*! + * @brief Converts an @ref XXH32_hash_t to a big endian @ref XXH32_canonical_t. + * + * @param dst The @ref XXH32_canonical_t pointer to be stored to. + * @param hash The @ref XXH32_hash_t to be converted. + * + * @pre + * @p dst must not be `NULL`. + */ +XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash); + +/*! + * @brief Converts an @ref XXH32_canonical_t to a native @ref XXH32_hash_t. + * + * @param src The @ref XXH32_canonical_t to convert. + * + * @pre + * @p src must not be `NULL`. + * + * @return The converted hash. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src); + + +#ifdef __has_attribute +# define XXH_HAS_ATTRIBUTE(x) __has_attribute(x) +#else +# define XXH_HAS_ATTRIBUTE(x) 0 +#endif + +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute) +# define XXH_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define XXH_HAS_C_ATTRIBUTE(x) 0 +#endif + +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define XXH_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define XXH_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +/* +Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute +introduced in CPP17 and C23. +CPP17 : https://en.cppreference.com/w/cpp/language/attributes/fallthrough +C23 : https://en.cppreference.com/w/c/language/attributes/fallthrough +*/ +#if XXH_HAS_C_ATTRIBUTE(x) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_CPP_ATTRIBUTE(x) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_ATTRIBUTE(__fallthrough__) +# define XXH_FALLTHROUGH __attribute__ ((fallthrough)) +#else +# define XXH_FALLTHROUGH +#endif + +/*! + * @} + * @ingroup public + * @{ + */ + +#ifndef XXH_NO_LONG_LONG +/*-********************************************************************** +* 64-bit hash +************************************************************************/ +#if defined(XXH_DOXYGEN) /* don't include */ +/*! + * @brief An unsigned 64-bit integer. + * + * Not necessarily defined to `uint64_t` but functionally equivalent. + */ +typedef uint64_t XXH64_hash_t; +#elif !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include + typedef uint64_t XXH64_hash_t; +#else +# include +# if defined(__LP64__) && ULONG_MAX == 0xFFFFFFFFFFFFFFFFULL + /* LP64 ABI says uint64_t is unsigned long */ + typedef unsigned long XXH64_hash_t; +# else + /* the following type must have a width of 64-bit */ + typedef unsigned long long XXH64_hash_t; +# endif +#endif + +/*! + * @} + * + * @defgroup xxh64_family XXH64 family + * @ingroup public + * @{ + * Contains functions used in the classic 64-bit xxHash algorithm. + * + * @note + * XXH3 provides competitive speed for both 32-bit and 64-bit systems, + * and offers true 64/128 bit hash results. + * It provides better speed for systems with vector processing capabilities. + */ + + +/*! + * @brief Calculates the 64-bit hash of @p input using xxHash64. + * + * This function usually runs faster on 64-bit systems, but slower on 32-bit + * systems (see benchmark). + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 64-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 64-bit hash. + * + * @see + * XXH32(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH64_createState(), XXH64_update(), XXH64_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH64_hash_t XXH64(const void* input, size_t length, XXH64_hash_t seed); + +/******* Streaming *******/ +/*! + * @brief The opaque state struct for the XXH64 streaming API. + * + * @see XXH64_state_s for details. + */ +typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ +XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void); +XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr); +XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state); + +XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, XXH64_hash_t seed); +XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length); +XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr); + +/******* Canonical representation *******/ +typedef struct { unsigned char digest[sizeof(XXH64_hash_t)]; } XXH64_canonical_t; +XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash); +XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src); + +#ifndef XXH_NO_XXH3 +/*! + * @} + * ************************************************************************ + * @defgroup xxh3_family XXH3 family + * @ingroup public + * @{ + * + * XXH3 is a more recent hash algorithm featuring: + * - Improved speed for both small and large inputs + * - True 64-bit and 128-bit outputs + * - SIMD acceleration + * - Improved 32-bit viability + * + * Speed analysis methodology is explained here: + * + * https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html + * + * Compared to XXH64, expect XXH3 to run approximately + * ~2x faster on large inputs and >3x faster on small ones, + * exact differences vary depending on platform. + * + * XXH3's speed benefits greatly from SIMD and 64-bit arithmetic, + * but does not require it. + * Any 32-bit and 64-bit targets that can run XXH32 smoothly + * can run XXH3 at competitive speeds, even without vector support. + * Further details are explained in the implementation. + * + * Optimized implementations are provided for AVX512, AVX2, SSE2, NEON, POWER8, + * ZVector and scalar targets. This can be controlled via the XXH_VECTOR macro. + * + * XXH3 implementation is portable: + * it has a generic C90 formulation that can be compiled on any platform, + * all implementations generage exactly the same hash value on all platforms. + * Starting from v0.8.0, it's also labelled "stable", meaning that + * any future version will also generate the same hash value. + * + * XXH3 offers 2 variants, _64bits and _128bits. + * + * When only 64 bits are needed, prefer invoking the _64bits variant, as it + * reduces the amount of mixing, resulting in faster speed on small inputs. + * It's also generally simpler to manipulate a scalar return type than a struct. + * + * The API supports one-shot hashing, streaming mode, and custom secrets. + */ + +/*-********************************************************************** +* XXH3 64-bit variant +************************************************************************/ + +/* XXH3_64bits(): + * default 64-bit variant, using default secret and default seed of 0. + * It's the fastest variant. */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* data, size_t len); + +/* + * XXH3_64bits_withSeed(): + * This variant generates a custom secret on the fly + * based on default secret altered using the `seed` value. + * While this operation is decently fast, note that it's not completely free. + * Note: seed==0 produces the same results as XXH3_64bits(). + */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* data, size_t len, XXH64_hash_t seed); + +/*! + * The bare minimum size for a custom secret. + * + * @see + * XXH3_64bits_withSecret(), XXH3_64bits_reset_withSecret(), + * XXH3_128bits_withSecret(), XXH3_128bits_reset_withSecret(). + */ +#define XXH3_SECRET_SIZE_MIN 136 + +/* + * XXH3_64bits_withSecret(): + * It's possible to provide any blob of bytes as a "secret" to generate the hash. + * This makes it more difficult for an external actor to prepare an intentional collision. + * The main condition is that secretSize *must* be large enough (>= XXH3_SECRET_SIZE_MIN). + * However, the quality of the secret impacts the dispersion of the hash algorithm. + * Therefore, the secret _must_ look like a bunch of random bytes. + * Avoid "trivial" or structured data such as repeated sequences or a text document. + * Whenever in doubt about the "randomness" of the blob of bytes, + * consider employing "XXH3_generateSecret()" instead (see below). + * It will generate a proper high entropy secret derived from the blob of bytes. + * Another advantage of using XXH3_generateSecret() is that + * it guarantees that all bits within the initial blob of bytes + * will impact every bit of the output. + * This is not necessarily the case when using the blob of bytes directly + * because, when hashing _small_ inputs, only a portion of the secret is employed. + */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize); + + +/******* Streaming *******/ +/* + * Streaming requires state maintenance. + * This operation costs memory and CPU. + * As a consequence, streaming is slower than one-shot hashing. + * For better performance, prefer one-shot functions whenever applicable. + */ + +/*! + * @brief The state struct for the XXH3 streaming API. + * + * @see XXH3_state_s for details. + */ +typedef struct XXH3_state_s XXH3_state_t; +XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void); +XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr); +XXH_PUBLIC_API void XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state); + +/* + * XXH3_64bits_reset(): + * Initialize with default parameters. + * digest will be equivalent to `XXH3_64bits()`. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH3_state_t* statePtr); +/* + * XXH3_64bits_reset_withSeed(): + * Generate a custom secret from `seed`, and store it into `statePtr`. + * digest will be equivalent to `XXH3_64bits_withSeed()`. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed); +/* + * XXH3_64bits_reset_withSecret(): + * `secret` is referenced, it _must outlive_ the hash streaming session. + * Similar to one-shot API, `secretSize` must be >= `XXH3_SECRET_SIZE_MIN`, + * and the quality of produced hash values depends on secret's entropy + * (secret's content should look like a bunch of random bytes). + * When in doubt about the randomness of a candidate `secret`, + * consider employing `XXH3_generateSecret()` instead (see below). + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize); + +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH3_state_t* statePtr, const void* input, size_t length); +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* statePtr); + +/* note : canonical representation of XXH3 is the same as XXH64 + * since they both produce XXH64_hash_t values */ + + +/*-********************************************************************** +* XXH3 128-bit variant +************************************************************************/ + +/*! + * @brief The return value from 128-bit hashes. + * + * Stored in little endian order, although the fields themselves are in native + * endianness. + */ +typedef struct { + XXH64_hash_t low64; /*!< `value & 0xFFFFFFFFFFFFFFFF` */ + XXH64_hash_t high64; /*!< `value >> 64` */ +} XXH128_hash_t; + +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* data, size_t len); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed(const void* data, size_t len, XXH64_hash_t seed); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize); + +/******* Streaming *******/ +/* + * Streaming requires state maintenance. + * This operation costs memory and CPU. + * As a consequence, streaming is slower than one-shot hashing. + * For better performance, prefer one-shot functions whenever applicable. + * + * XXH3_128bits uses the same XXH3_state_t as XXH3_64bits(). + * Use already declared XXH3_createState() and XXH3_freeState(). + * + * All reset and streaming functions have same meaning as their 64-bit counterpart. + */ + +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH3_state_t* statePtr); +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed); +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize); + +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update (XXH3_state_t* statePtr, const void* input, size_t length); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* statePtr); + +/* Following helper functions make it possible to compare XXH128_hast_t values. + * Since XXH128_hash_t is a structure, this capability is not offered by the language. + * Note: For better performance, these functions can be inlined using XXH_INLINE_ALL */ + +/*! + * XXH128_isEqual(): + * Return: 1 if `h1` and `h2` are equal, 0 if they are not. + */ +XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2); + +/*! + * XXH128_cmp(): + * + * This comparator is compatible with stdlib's `qsort()`/`bsearch()`. + * + * return: >0 if *h128_1 > *h128_2 + * =0 if *h128_1 == *h128_2 + * <0 if *h128_1 < *h128_2 + */ +XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2); + + +/******* Canonical representation *******/ +typedef struct { unsigned char digest[sizeof(XXH128_hash_t)]; } XXH128_canonical_t; +XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash); +XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* src); + + +#endif /* !XXH_NO_XXH3 */ +#endif /* XXH_NO_LONG_LONG */ + +/*! + * @} + */ +#endif /* XXHASH_H_5627135585666179 */ + + + +#if defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) +#define XXHASH_H_STATIC_13879238742 +/* **************************************************************************** + * This section contains declarations which are not guaranteed to remain stable. + * They may change in future versions, becoming incompatible with a different + * version of the library. + * These declarations should only be used with static linking. + * Never use them in association with dynamic linking! + ***************************************************************************** */ + +/* + * These definitions are only present to allow static allocation + * of XXH states, on stack or in a struct, for example. + * Never **ever** access their members directly. + */ + +/*! + * @internal + * @brief Structure for XXH32 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH32_state_t. + * Do not access the members of this struct directly. + * @see XXH64_state_s, XXH3_state_s + */ +struct XXH32_state_s { + XXH32_hash_t total_len_32; /*!< Total length hashed, modulo 2^32 */ + XXH32_hash_t large_len; /*!< Whether the hash is >= 16 (handles @ref total_len_32 overflow) */ + XXH32_hash_t v[4]; /*!< Accumulator lanes */ + XXH32_hash_t mem32[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[16]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem32 */ + XXH32_hash_t reserved; /*!< Reserved field. Do not read nor write to it. */ +}; /* typedef'd to XXH32_state_t */ + + +#ifndef XXH_NO_LONG_LONG /* defined when there is no 64-bit support */ + +/*! + * @internal + * @brief Structure for XXH64 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH64_state_t. + * Do not access the members of this struct directly. + * @see XXH32_state_s, XXH3_state_s + */ +struct XXH64_state_s { + XXH64_hash_t total_len; /*!< Total length hashed. This is always 64-bit. */ + XXH64_hash_t v[4]; /*!< Accumulator lanes */ + XXH64_hash_t mem64[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[32]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem64 */ + XXH32_hash_t reserved32; /*!< Reserved field, needed for padding anyways*/ + XXH64_hash_t reserved64; /*!< Reserved field. Do not read or write to it. */ +}; /* typedef'd to XXH64_state_t */ + + +#ifndef XXH_NO_XXH3 + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* >= C11 */ +# include +# define XXH_ALIGN(n) alignas(n) +#elif defined(__cplusplus) && (__cplusplus >= 201103L) /* >= C++11 */ +/* In C++ alignas() is a keyword */ +# define XXH_ALIGN(n) alignas(n) +#elif defined(__GNUC__) +# define XXH_ALIGN(n) __attribute__ ((aligned(n))) +#elif defined(_MSC_VER) +# define XXH_ALIGN(n) __declspec(align(n)) +#else +# define XXH_ALIGN(n) /* disabled */ +#endif + +/* Old GCC versions only accept the attribute after the type in structures. */ +#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) /* C11+ */ \ + && ! (defined(__cplusplus) && (__cplusplus >= 201103L)) /* >= C++11 */ \ + && defined(__GNUC__) +# define XXH_ALIGN_MEMBER(align, type) type XXH_ALIGN(align) +#else +# define XXH_ALIGN_MEMBER(align, type) XXH_ALIGN(align) type +#endif + +/*! + * @brief The size of the internal XXH3 buffer. + * + * This is the optimal update size for incremental hashing. + * + * @see XXH3_64b_update(), XXH3_128b_update(). + */ +#define XXH3_INTERNALBUFFER_SIZE 256 + +/*! + * @brief Default size of the secret buffer (and @ref XXH3_kSecret). + * + * This is the size used in @ref XXH3_kSecret and the seeded functions. + * + * Not to be confused with @ref XXH3_SECRET_SIZE_MIN. + */ +#define XXH3_SECRET_DEFAULT_SIZE 192 + +/*! + * @internal + * @brief Structure for XXH3 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. + * Otherwise it is an opaque type. + * Never use this definition in combination with dynamic library. + * This allows fields to safely be changed in the future. + * + * @note ** This structure has a strict alignment requirement of 64 bytes!! ** + * Do not allocate this with `malloc()` or `new`, + * it will not be sufficiently aligned. + * Use @ref XXH3_createState() and @ref XXH3_freeState(), or stack allocation. + * + * Typedef'd to @ref XXH3_state_t. + * Do never access the members of this struct directly. + * + * @see XXH3_INITSTATE() for stack initialization. + * @see XXH3_createState(), XXH3_freeState(). + * @see XXH32_state_s, XXH64_state_s + */ +struct XXH3_state_s { + XXH_ALIGN_MEMBER(64, XXH64_hash_t acc[8]); + /*!< The 8 accumulators. Similar to `vN` in @ref XXH32_state_s::v1 and @ref XXH64_state_s */ + XXH_ALIGN_MEMBER(64, unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE]); + /*!< Used to store a custom secret generated from a seed. */ + XXH_ALIGN_MEMBER(64, unsigned char buffer[XXH3_INTERNALBUFFER_SIZE]); + /*!< The internal buffer. @see XXH32_state_s::mem32 */ + XXH32_hash_t bufferedSize; + /*!< The amount of memory in @ref buffer, @see XXH32_state_s::memsize */ + XXH32_hash_t useSeed; + /*!< Reserved field. Needed for padding on 64-bit. */ + size_t nbStripesSoFar; + /*!< Number or stripes processed. */ + XXH64_hash_t totalLen; + /*!< Total length hashed. 64-bit even on 32-bit targets. */ + size_t nbStripesPerBlock; + /*!< Number of stripes per block. */ + size_t secretLimit; + /*!< Size of @ref customSecret or @ref extSecret */ + XXH64_hash_t seed; + /*!< Seed for _withSeed variants. Must be zero otherwise, @see XXH3_INITSTATE() */ + XXH64_hash_t reserved64; + /*!< Reserved field. */ + const unsigned char* extSecret; + /*!< Reference to an external secret for the _withSecret variants, NULL + * for other variants. */ + /* note: there may be some padding at the end due to alignment on 64 bytes */ +}; /* typedef'd to XXH3_state_t */ + +#undef XXH_ALIGN_MEMBER + +/*! + * @brief Initializes a stack-allocated `XXH3_state_s`. + * + * When the @ref XXH3_state_t structure is merely emplaced on stack, + * it should be initialized with XXH3_INITSTATE() or a memset() + * in case its first reset uses XXH3_NNbits_reset_withSeed(). + * This init can be omitted if the first reset uses default or _withSecret mode. + * This operation isn't necessary when the state is created with XXH3_createState(). + * Note that this doesn't prepare the state for a streaming operation, + * it's still necessary to use XXH3_NNbits_reset*() afterwards. + */ +#define XXH3_INITSTATE(XXH3_state_ptr) { (XXH3_state_ptr)->seed = 0; } + + +/* XXH128() : + * simple alias to pre-selected XXH3_128bits variant + */ +XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t seed); + + +/* === Experimental API === */ +/* Symbols defined below must be considered tied to a specific library version. */ + +/* + * XXH3_generateSecret(): + * + * Derive a high-entropy secret from any user-defined content, named customSeed. + * The generated secret can be used in combination with `*_withSecret()` functions. + * The `_withSecret()` variants are useful to provide a higher level of protection than 64-bit seed, + * as it becomes much more difficult for an external actor to guess how to impact the calculation logic. + * + * The function accepts as input a custom seed of any length and any content, + * and derives from it a high-entropy secret of length @secretSize + * into an already allocated buffer @secretBuffer. + * @secretSize must be >= XXH3_SECRET_SIZE_MIN + * + * The generated secret can then be used with any `*_withSecret()` variant. + * Functions `XXH3_128bits_withSecret()`, `XXH3_64bits_withSecret()`, + * `XXH3_128bits_reset_withSecret()` and `XXH3_64bits_reset_withSecret()` + * are part of this list. They all accept a `secret` parameter + * which must be large enough for implementation reasons (>= XXH3_SECRET_SIZE_MIN) + * _and_ feature very high entropy (consist of random-looking bytes). + * These conditions can be a high bar to meet, so + * XXH3_generateSecret() can be employed to ensure proper quality. + * + * customSeed can be anything. It can have any size, even small ones, + * and its content can be anything, even "poor entropy" sources such as a bunch of zeroes. + * The resulting `secret` will nonetheless provide all required qualities. + * + * When customSeedSize > 0, supplying NULL as customSeed is undefined behavior. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize); + + +/* + * XXH3_generateSecret_fromSeed(): + * + * Generate the same secret as the _withSeed() variants. + * + * The resulting secret has a length of XXH3_SECRET_DEFAULT_SIZE (necessarily). + * @secretBuffer must be already allocated, of size at least XXH3_SECRET_DEFAULT_SIZE bytes. + * + * The generated secret can be used in combination with + *`*_withSecret()` and `_withSecretandSeed()` variants. + * This generator is notably useful in combination with `_withSecretandSeed()`, + * as a way to emulate a faster `_withSeed()` variant. + */ +XXH_PUBLIC_API void XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_t seed); + +/* + * *_withSecretandSeed() : + * These variants generate hash values using either + * @seed for "short" keys (< XXH3_MIDSIZE_MAX = 240 bytes) + * or @secret for "large" keys (>= XXH3_MIDSIZE_MAX). + * + * This generally benefits speed, compared to `_withSeed()` or `_withSecret()`. + * `_withSeed()` has to generate the secret on the fly for "large" keys. + * It's fast, but can be perceptible for "not so large" keys (< 1 KB). + * `_withSecret()` has to generate the masks on the fly for "small" keys, + * which requires more instructions than _withSeed() variants. + * Therefore, _withSecretandSeed variant combines the best of both worlds. + * + * When @secret has been generated by XXH3_generateSecret_fromSeed(), + * this variant produces *exactly* the same results as `_withSeed()` variant, + * hence offering only a pure speed benefit on "large" input, + * by skipping the need to regenerate the secret for every large input. + * + * Another usage scenario is to hash the secret to a 64-bit hash value, + * for example with XXH3_64bits(), which then becomes the seed, + * and then employ both the seed and the secret in _withSecretandSeed(). + * On top of speed, an added benefit is that each bit in the secret + * has a 50% chance to swap each bit in the output, + * via its impact to the seed. + * This is not guaranteed when using the secret directly in "small data" scenarios, + * because only portions of the secret are employed for small data. + */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(const void* data, size_t len, + const void* secret, size_t secretSize, + XXH64_hash_t seed); + +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(const void* data, size_t len, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + + +#endif /* XXH_NO_XXH3 */ +#endif /* XXH_NO_LONG_LONG */ +#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) +# define XXH_IMPLEMENTATION +#endif + +#endif /* defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) */ + + +/* ======================================================================== */ +/* ======================================================================== */ +/* ======================================================================== */ + + +/*-********************************************************************** + * xxHash implementation + *-********************************************************************** + * xxHash's implementation used to be hosted inside xxhash.c. + * + * However, inlining requires implementation to be visible to the compiler, + * hence be included alongside the header. + * Previously, implementation was hosted inside xxhash.c, + * which was then #included when inlining was activated. + * This construction created issues with a few build and install systems, + * as it required xxhash.c to be stored in /include directory. + * + * xxHash implementation is now directly integrated within xxhash.h. + * As a consequence, xxhash.c is no longer needed in /include. + * + * xxhash.c is still available and is still useful. + * In a "normal" setup, when xxhash is not inlined, + * xxhash.h only exposes the prototypes and public symbols, + * while xxhash.c can be built into an object file xxhash.o + * which can then be linked into the final binary. + ************************************************************************/ + +#if ( defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) \ + || defined(XXH_IMPLEMENTATION) ) && !defined(XXH_IMPLEM_13a8737387) +# define XXH_IMPLEM_13a8737387 + +/* ************************************* +* Tuning parameters +***************************************/ + +/*! + * @defgroup tuning Tuning parameters + * @{ + * + * Various macros to control xxHash's behavior. + */ +#ifdef XXH_DOXYGEN +/*! + * @brief Define this to disable 64-bit code. + * + * Useful if only using the @ref xxh32_family and you have a strict C90 compiler. + */ +# define XXH_NO_LONG_LONG +# undef XXH_NO_LONG_LONG /* don't actually */ +/*! + * @brief Controls how unaligned memory is accessed. + * + * By default, access to unaligned memory is controlled by `memcpy()`, which is + * safe and portable. + * + * Unfortunately, on some target/compiler combinations, the generated assembly + * is sub-optimal. + * + * The below switch allow selection of a different access method + * in the search for improved performance. + * + * @par Possible options: + * + * - `XXH_FORCE_MEMORY_ACCESS=0` (default): `memcpy` + * @par + * Use `memcpy()`. Safe and portable. Note that most modern compilers will + * eliminate the function call and treat it as an unaligned access. + * + * - `XXH_FORCE_MEMORY_ACCESS=1`: `__attribute__((packed))` + * @par + * Depends on compiler extensions and is therefore not portable. + * This method is safe _if_ your compiler supports it, + * and *generally* as fast or faster than `memcpy`. + * + * - `XXH_FORCE_MEMORY_ACCESS=2`: Direct cast + * @par + * Casts directly and dereferences. This method doesn't depend on the + * compiler, but it violates the C standard as it directly dereferences an + * unaligned pointer. It can generate buggy code on targets which do not + * support unaligned memory accesses, but in some circumstances, it's the + * only known way to get the most performance. + * + * - `XXH_FORCE_MEMORY_ACCESS=3`: Byteshift + * @par + * Also portable. This can generate the best code on old compilers which don't + * inline small `memcpy()` calls, and it might also be faster on big-endian + * systems which lack a native byteswap instruction. However, some compilers + * will emit literal byteshifts even if the target supports unaligned access. + * . + * + * @warning + * Methods 1 and 2 rely on implementation-defined behavior. Use these with + * care, as what works on one compiler/platform/optimization level may cause + * another to read garbage data or even crash. + * + * See https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html for details. + * + * Prefer these methods in priority order (0 > 3 > 1 > 2) + */ +# define XXH_FORCE_MEMORY_ACCESS 0 + +/*! + * @def XXH_FORCE_ALIGN_CHECK + * @brief If defined to non-zero, adds a special path for aligned inputs (XXH32() + * and XXH64() only). + * + * This is an important performance trick for architectures without decent + * unaligned memory access performance. + * + * It checks for input alignment, and when conditions are met, uses a "fast + * path" employing direct 32-bit/64-bit reads, resulting in _dramatically + * faster_ read speed. + * + * The check costs one initial branch per hash, which is generally negligible, + * but not zero. + * + * Moreover, it's not useful to generate an additional code path if memory + * access uses the same instruction for both aligned and unaligned + * addresses (e.g. x86 and aarch64). + * + * In these cases, the alignment check can be removed by setting this macro to 0. + * Then the code will always use unaligned memory access. + * Align check is automatically disabled on x86, x64 & arm64, + * which are platforms known to offer good unaligned memory accesses performance. + * + * This option does not affect XXH3 (only XXH32 and XXH64). + */ +# define XXH_FORCE_ALIGN_CHECK 0 + +/*! + * @def XXH_NO_INLINE_HINTS + * @brief When non-zero, sets all functions to `static`. + * + * By default, xxHash tries to force the compiler to inline almost all internal + * functions. + * + * This can usually improve performance due to reduced jumping and improved + * constant folding, but significantly increases the size of the binary which + * might not be favorable. + * + * Additionally, sometimes the forced inlining can be detrimental to performance, + * depending on the architecture. + * + * XXH_NO_INLINE_HINTS marks all internal functions as static, giving the + * compiler full control on whether to inline or not. + * + * When not optimizing (-O0), optimizing for size (-Os, -Oz), or using + * -fno-inline with GCC or Clang, this will automatically be defined. + */ +# define XXH_NO_INLINE_HINTS 0 + +/*! + * @def XXH32_ENDJMP + * @brief Whether to use a jump for `XXH32_finalize`. + * + * For performance, `XXH32_finalize` uses multiple branches in the finalizer. + * This is generally preferable for performance, + * but depending on exact architecture, a jmp may be preferable. + * + * This setting is only possibly making a difference for very small inputs. + */ +# define XXH32_ENDJMP 0 + +/*! + * @internal + * @brief Redefines old internal names. + * + * For compatibility with code that uses xxHash's internals before the names + * were changed to improve namespacing. There is no other reason to use this. + */ +# define XXH_OLD_NAMES +# undef XXH_OLD_NAMES /* don't actually use, it is ugly. */ +#endif /* XXH_DOXYGEN */ +/*! + * @} + */ + +#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ + /* prefer __packed__ structures (method 1) for gcc on armv7+ and mips */ +# if !defined(__clang__) && \ +( \ + (defined(__INTEL_COMPILER) && !defined(_WIN32)) || \ + ( \ + defined(__GNUC__) && ( \ + (defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \ + ( \ + defined(__mips__) && \ + (__mips <= 5 || __mips_isa_rev < 6) && \ + (!defined(__mips16) || defined(__mips_mips16e2)) \ + ) \ + ) \ + ) \ +) +# define XXH_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ +# if defined(__i386) || defined(__x86_64__) || defined(__aarch64__) \ + || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) /* visual */ +# define XXH_FORCE_ALIGN_CHECK 0 +# else +# define XXH_FORCE_ALIGN_CHECK 1 +# endif +#endif + +#ifndef XXH_NO_INLINE_HINTS +# if defined(__OPTIMIZE_SIZE__) /* -Os, -Oz */ \ + || defined(__NO_INLINE__) /* -O0, -fno-inline */ +# define XXH_NO_INLINE_HINTS 1 +# else +# define XXH_NO_INLINE_HINTS 0 +# endif +#endif + +#ifndef XXH32_ENDJMP +/* generally preferable for performance */ +# define XXH32_ENDJMP 0 +#endif + +/*! + * @defgroup impl Implementation + * @{ + */ + + +/* ************************************* +* Includes & Memory related functions +***************************************/ +/* Modify the local functions below should you wish to use some other memory routines */ +/* for ZSTD_malloc(), ZSTD_free() */ +#define ZSTD_DEPS_NEED_MALLOC +/**** skipping file: zstd_deps.h ****/ +static void* XXH_malloc(size_t s) { return ZSTD_malloc(s); } +static void XXH_free (void* p) { ZSTD_free(p); } +static void* XXH_memcpy(void* dest, const void* src, size_t size) { return ZSTD_memcpy(dest,src,size); } + + +/* ************************************* +* Compiler Specific Options +***************************************/ +#ifdef _MSC_VER /* Visual Studio warning fix */ +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +#endif + +#if XXH_NO_INLINE_HINTS /* disable inlining hints */ +# if defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __attribute__((unused)) +# else +# define XXH_FORCE_INLINE static +# endif +# define XXH_NO_INLINE static +/* enable inlining hints */ +#elif defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __inline__ __attribute__((always_inline, unused)) +# define XXH_NO_INLINE static __attribute__((noinline)) +#elif defined(_MSC_VER) /* Visual Studio */ +# define XXH_FORCE_INLINE static __forceinline +# define XXH_NO_INLINE static __declspec(noinline) +#elif defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /* C99 */ +# define XXH_FORCE_INLINE static inline +# define XXH_NO_INLINE static +#else +# define XXH_FORCE_INLINE static +# define XXH_NO_INLINE static +#endif + + + +/* ************************************* +* Debug +***************************************/ +/*! + * @ingroup tuning + * @def XXH_DEBUGLEVEL + * @brief Sets the debugging level. + * + * XXH_DEBUGLEVEL is expected to be defined externally, typically via the + * compiler's command line options. The value must be a number. + */ +#ifndef XXH_DEBUGLEVEL +# ifdef DEBUGLEVEL /* backwards compat */ +# define XXH_DEBUGLEVEL DEBUGLEVEL +# else +# define XXH_DEBUGLEVEL 0 +# endif +#endif + +#if (XXH_DEBUGLEVEL>=1) +# include /* note: can still be disabled with NDEBUG */ +# define XXH_ASSERT(c) assert(c) +#else +# define XXH_ASSERT(c) ((void)0) +#endif + +/* note: use after variable declarations */ +#ifndef XXH_STATIC_ASSERT +# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */ +# include +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# elif defined(__cplusplus) && (__cplusplus >= 201103L) /* C++11 */ +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# else +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { struct xxh_sa { char x[(c) ? 1 : -1]; }; } while(0) +# endif +# define XXH_STATIC_ASSERT(c) XXH_STATIC_ASSERT_WITH_MESSAGE((c),#c) +#endif + +/*! + * @internal + * @def XXH_COMPILER_GUARD(var) + * @brief Used to prevent unwanted optimizations for @p var. + * + * It uses an empty GCC inline assembly statement with a register constraint + * which forces @p var into a general purpose register (e.g. eax, ebx, ecx + * on x86) and marks it as modified. + * + * This is used in a few places to avoid unwanted autovectorization (e.g. + * XXH32_round()). All vectorization we want is explicit via intrinsics, + * and _usually_ isn't wanted elsewhere. + * + * We also use it to prevent unwanted constant folding for AArch64 in + * XXH3_initCustomSecret_scalar(). + */ +#if defined(__GNUC__) || defined(__clang__) +# define XXH_COMPILER_GUARD(var) __asm__ __volatile__("" : "+r" (var)) +#else +# define XXH_COMPILER_GUARD(var) ((void)0) +#endif + +/* ************************************* +* Basic Types +***************************************/ +#if !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include + typedef uint8_t xxh_u8; +#else + typedef unsigned char xxh_u8; +#endif +typedef XXH32_hash_t xxh_u32; + +#ifdef XXH_OLD_NAMES +# define BYTE xxh_u8 +# define U8 xxh_u8 +# define U32 xxh_u32 +#endif + +/* *** Memory access *** */ + +/*! + * @internal + * @fn xxh_u32 XXH_read32(const void* ptr) + * @brief Reads an unaligned 32-bit integer from @p ptr in native endianness. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit native endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32(const void* ptr) + * @brief Reads an unaligned 32-bit little endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readBE32(const void* ptr) + * @brief Reads an unaligned 32-bit big endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit big endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32_align(const void* ptr, XXH_alignment align) + * @brief Like @ref XXH_readLE32(), but has an option for aligned reads. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * Note that when @ref XXH_FORCE_ALIGN_CHECK == 0, the @p align parameter is + * always @ref XXH_alignment::XXH_unaligned. + * + * @param ptr The pointer to read from. + * @param align Whether @p ptr is aligned. + * @pre + * If @p align == @ref XXH_alignment::XXH_aligned, @p ptr must be 4 byte + * aligned. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) +/* + * Manual byteshift. Best for old compilers which don't inline memcpy. + * We actually directly use XXH_readLE32 and XXH_readBE32. + */ +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) + +/* + * Force direct memory access. Only works on CPU which support unaligned memory + * access in hardware. + */ +static xxh_u32 XXH_read32(const void* memPtr) { return *(const xxh_u32*) memPtr; } + +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) + +/* + * __pack instructions are safer but compiler specific, hence potentially + * problematic for some compilers. + * + * Currently only defined for GCC and ICC. + */ +#ifdef XXH_OLD_NAMES +typedef union { xxh_u32 u32; } __attribute__((packed)) unalign; +#endif +static xxh_u32 XXH_read32(const void* ptr) +{ + typedef union { xxh_u32 u32; } __attribute__((packed)) xxh_unalign; + return ((const xxh_unalign*)ptr)->u32; +} + +#else + +/* + * Portable and safe solution. Generally efficient. + * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html + */ +static xxh_u32 XXH_read32(const void* memPtr) +{ + xxh_u32 val; + XXH_memcpy(&val, memPtr, sizeof(val)); + return val; +} + +#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ + + +/* *** Endianness *** */ + +/*! + * @ingroup tuning + * @def XXH_CPU_LITTLE_ENDIAN + * @brief Whether the target is little endian. + * + * Defined to 1 if the target is little endian, or 0 if it is big endian. + * It can be defined externally, for example on the compiler command line. + * + * If it is not defined, + * a runtime check (which is usually constant folded) is used instead. + * + * @note + * This is not necessarily defined to an integer constant. + * + * @see XXH_isLittleEndian() for the runtime check. + */ +#ifndef XXH_CPU_LITTLE_ENDIAN +/* + * Try to detect endianness automatically, to avoid the nonstandard behavior + * in `XXH_isLittleEndian()` + */ +# if defined(_WIN32) /* Windows is always little endian */ \ + || defined(__LITTLE_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +# define XXH_CPU_LITTLE_ENDIAN 1 +# elif defined(__BIG_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +# define XXH_CPU_LITTLE_ENDIAN 0 +# else +/*! + * @internal + * @brief Runtime check for @ref XXH_CPU_LITTLE_ENDIAN. + * + * Most compilers will constant fold this. + */ +static int XXH_isLittleEndian(void) +{ + /* + * Portable and well-defined behavior. + * Don't use static: it is detrimental to performance. + */ + const union { xxh_u32 u; xxh_u8 c[4]; } one = { 1 }; + return one.c[0]; +} +# define XXH_CPU_LITTLE_ENDIAN XXH_isLittleEndian() +# endif +#endif + + + + +/* **************************************** +* Compiler-specific Functions and Macros +******************************************/ +#define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) + +#ifdef __has_builtin +# define XXH_HAS_BUILTIN(x) __has_builtin(x) +#else +# define XXH_HAS_BUILTIN(x) 0 +#endif + +/*! + * @internal + * @def XXH_rotl32(x,r) + * @brief 32-bit rotate left. + * + * @param x The 32-bit integer to be rotated. + * @param r The number of bits to rotate. + * @pre + * @p r > 0 && @p r < 32 + * @note + * @p x and @p r may be evaluated multiple times. + * @return The rotated result. + */ +#if !defined(NO_CLANG_BUILTIN) && XXH_HAS_BUILTIN(__builtin_rotateleft32) \ + && XXH_HAS_BUILTIN(__builtin_rotateleft64) +# define XXH_rotl32 __builtin_rotateleft32 +# define XXH_rotl64 __builtin_rotateleft64 +/* Note: although _rotl exists for minGW (GCC under windows), performance seems poor */ +#elif defined(_MSC_VER) +# define XXH_rotl32(x,r) _rotl(x,r) +# define XXH_rotl64(x,r) _rotl64(x,r) +#else +# define XXH_rotl32(x,r) (((x) << (r)) | ((x) >> (32 - (r)))) +# define XXH_rotl64(x,r) (((x) << (r)) | ((x) >> (64 - (r)))) +#endif + +/*! + * @internal + * @fn xxh_u32 XXH_swap32(xxh_u32 x) + * @brief A 32-bit byteswap. + * + * @param x The 32-bit integer to byteswap. + * @return @p x, byteswapped. + */ +#if defined(_MSC_VER) /* Visual Studio */ +# define XXH_swap32 _byteswap_ulong +#elif XXH_GCC_VERSION >= 403 +# define XXH_swap32 __builtin_bswap32 +#else +static xxh_u32 XXH_swap32 (xxh_u32 x) +{ + return ((x << 24) & 0xff000000 ) | + ((x << 8) & 0x00ff0000 ) | + ((x >> 8) & 0x0000ff00 ) | + ((x >> 24) & 0x000000ff ); +} +#endif + + +/* *************************** +* Memory reads +*****************************/ + +/*! + * @internal + * @brief Enum to indicate whether a pointer is aligned. + */ +typedef enum { + XXH_aligned, /*!< Aligned */ + XXH_unaligned /*!< Possibly unaligned */ +} XXH_alignment; + +/* + * XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. + * + * This is ideal for older compilers which don't inline memcpy. + */ +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) + +XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[0] + | ((xxh_u32)bytePtr[1] << 8) + | ((xxh_u32)bytePtr[2] << 16) + | ((xxh_u32)bytePtr[3] << 24); +} + +XXH_FORCE_INLINE xxh_u32 XXH_readBE32(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[3] + | ((xxh_u32)bytePtr[2] << 8) + | ((xxh_u32)bytePtr[1] << 16) + | ((xxh_u32)bytePtr[0] << 24); +} + +#else +XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); +} + +static xxh_u32 XXH_readBE32(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); +} +#endif + +XXH_FORCE_INLINE xxh_u32 +XXH_readLE32_align(const void* ptr, XXH_alignment align) +{ + if (align==XXH_unaligned) { + return XXH_readLE32(ptr); + } else { + return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u32*)ptr : XXH_swap32(*(const xxh_u32*)ptr); + } +} + + +/* ************************************* +* Misc +***************************************/ +/*! @ingroup public */ +XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } + + +/* ******************************************************************* +* 32-bit hash functions +*********************************************************************/ +/*! + * @} + * @defgroup xxh32_impl XXH32 implementation + * @ingroup impl + * @{ + */ + /* #define instead of static const, to be used as initializers */ +#define XXH_PRIME32_1 0x9E3779B1U /*!< 0b10011110001101110111100110110001 */ +#define XXH_PRIME32_2 0x85EBCA77U /*!< 0b10000101111010111100101001110111 */ +#define XXH_PRIME32_3 0xC2B2AE3DU /*!< 0b11000010101100101010111000111101 */ +#define XXH_PRIME32_4 0x27D4EB2FU /*!< 0b00100111110101001110101100101111 */ +#define XXH_PRIME32_5 0x165667B1U /*!< 0b00010110010101100110011110110001 */ + +#ifdef XXH_OLD_NAMES +# define PRIME32_1 XXH_PRIME32_1 +# define PRIME32_2 XXH_PRIME32_2 +# define PRIME32_3 XXH_PRIME32_3 +# define PRIME32_4 XXH_PRIME32_4 +# define PRIME32_5 XXH_PRIME32_5 +#endif + +/*! + * @internal + * @brief Normal stripe processing routine. + * + * This shuffles the bits so that any bit from @p input impacts several bits in + * @p acc. + * + * @param acc The accumulator lane. + * @param input The stripe of input to mix. + * @return The mixed accumulator lane. + */ +static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input) +{ + acc += input * XXH_PRIME32_2; + acc = XXH_rotl32(acc, 13); + acc *= XXH_PRIME32_1; +#if (defined(__SSE4_1__) || defined(__aarch64__)) && !defined(XXH_ENABLE_AUTOVECTORIZE) + /* + * UGLY HACK: + * A compiler fence is the only thing that prevents GCC and Clang from + * autovectorizing the XXH32 loop (pragmas and attributes don't work for some + * reason) without globally disabling SSE4.1. + * + * The reason we want to avoid vectorization is because despite working on + * 4 integers at a time, there are multiple factors slowing XXH32 down on + * SSE4: + * - There's a ridiculous amount of lag from pmulld (10 cycles of latency on + * newer chips!) making it slightly slower to multiply four integers at + * once compared to four integers independently. Even when pmulld was + * fastest, Sandy/Ivy Bridge, it is still not worth it to go into SSE + * just to multiply unless doing a long operation. + * + * - Four instructions are required to rotate, + * movqda tmp, v // not required with VEX encoding + * pslld tmp, 13 // tmp <<= 13 + * psrld v, 19 // x >>= 19 + * por v, tmp // x |= tmp + * compared to one for scalar: + * roll v, 13 // reliably fast across the board + * shldl v, v, 13 // Sandy Bridge and later prefer this for some reason + * + * - Instruction level parallelism is actually more beneficial here because + * the SIMD actually serializes this operation: While v1 is rotating, v2 + * can load data, while v3 can multiply. SSE forces them to operate + * together. + * + * This is also enabled on AArch64, as Clang autovectorizes it incorrectly + * and it is pointless writing a NEON implementation that is basically the + * same speed as scalar for XXH32. + */ + XXH_COMPILER_GUARD(acc); +#endif + return acc; +} + +/*! + * @internal + * @brief Mixes all bits to finalize the hash. + * + * The final mix ensures that all input bits have a chance to impact any bit in + * the output digest, resulting in an unbiased distribution. + * + * @param h32 The hash to avalanche. + * @return The avalanched hash. + */ +static xxh_u32 XXH32_avalanche(xxh_u32 h32) +{ + h32 ^= h32 >> 15; + h32 *= XXH_PRIME32_2; + h32 ^= h32 >> 13; + h32 *= XXH_PRIME32_3; + h32 ^= h32 >> 16; + return(h32); +} + +#define XXH_get32bits(p) XXH_readLE32_align(p, align) + +/*! + * @internal + * @brief Processes the last 0-15 bytes of @p ptr. + * + * There may be up to 15 bytes remaining to consume from the input. + * This final stage will digest them to ensure that all input bytes are present + * in the final mix. + * + * @param h32 The hash to finalize. + * @param ptr The pointer to the remaining input. + * @param len The remaining length, modulo 16. + * @param align Whether @p ptr is aligned. + * @return The finalized hash. + */ +static xxh_u32 +XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) +{ +#define XXH_PROCESS1 do { \ + h32 += (*ptr++) * XXH_PRIME32_5; \ + h32 = XXH_rotl32(h32, 11) * XXH_PRIME32_1; \ +} while (0) + +#define XXH_PROCESS4 do { \ + h32 += XXH_get32bits(ptr) * XXH_PRIME32_3; \ + ptr += 4; \ + h32 = XXH_rotl32(h32, 17) * XXH_PRIME32_4; \ +} while (0) + + if (ptr==NULL) XXH_ASSERT(len == 0); + + /* Compact rerolled version; generally faster */ + if (!XXH32_ENDJMP) { + len &= 15; + while (len >= 4) { + XXH_PROCESS4; + len -= 4; + } + while (len > 0) { + XXH_PROCESS1; + --len; + } + return XXH32_avalanche(h32); + } else { + switch(len&15) /* or switch(bEnd - p) */ { + case 12: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 8: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 4: XXH_PROCESS4; + return XXH32_avalanche(h32); + + case 13: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 9: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 5: XXH_PROCESS4; + XXH_PROCESS1; + return XXH32_avalanche(h32); + + case 14: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 10: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 6: XXH_PROCESS4; + XXH_PROCESS1; + XXH_PROCESS1; + return XXH32_avalanche(h32); + + case 15: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 11: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 7: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 3: XXH_PROCESS1; + XXH_FALLTHROUGH; + case 2: XXH_PROCESS1; + XXH_FALLTHROUGH; + case 1: XXH_PROCESS1; + XXH_FALLTHROUGH; + case 0: return XXH32_avalanche(h32); + } + XXH_ASSERT(0); + return h32; /* reaching this point is deemed impossible */ + } +} + +#ifdef XXH_OLD_NAMES +# define PROCESS1 XXH_PROCESS1 +# define PROCESS4 XXH_PROCESS4 +#else +# undef XXH_PROCESS1 +# undef XXH_PROCESS4 +#endif + +/*! + * @internal + * @brief The implementation for @ref XXH32(). + * + * @param input , len , seed Directly passed from @ref XXH32(). + * @param align Whether @p input is aligned. + * @return The calculated hash. + */ +XXH_FORCE_INLINE xxh_u32 +XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align) +{ + xxh_u32 h32; + + if (input==NULL) XXH_ASSERT(len == 0); + + if (len>=16) { + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 15; + xxh_u32 v1 = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + xxh_u32 v2 = seed + XXH_PRIME32_2; + xxh_u32 v3 = seed + 0; + xxh_u32 v4 = seed - XXH_PRIME32_1; + + do { + v1 = XXH32_round(v1, XXH_get32bits(input)); input += 4; + v2 = XXH32_round(v2, XXH_get32bits(input)); input += 4; + v3 = XXH32_round(v3, XXH_get32bits(input)); input += 4; + v4 = XXH32_round(v4, XXH_get32bits(input)); input += 4; + } while (input < limit); + + h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18); + } else { + h32 = seed + XXH_PRIME32_5; + } + + h32 += (xxh_u32)len; + + return XXH32_finalize(h32, input, len&15, align); +} + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t seed) +{ +#if 0 + /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ + XXH32_state_t state; + XXH32_reset(&state, seed); + XXH32_update(&state, (const xxh_u8*)input, len); + return XXH32_digest(&state); +#else + if (XXH_FORCE_ALIGN_CHECK) { + if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ + return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); + } } + + return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned); +#endif +} + + + +/******* Hash streaming *******/ +/*! + * @ingroup xxh32_family + */ +XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) +{ + return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); +} +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) +{ + XXH_free(statePtr); + return XXH_OK; +} + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState) +{ + XXH_memcpy(dstState, srcState, sizeof(*dstState)); +} + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, XXH32_hash_t seed) +{ + XXH_ASSERT(statePtr != NULL); + memset(statePtr, 0, sizeof(*statePtr)); + statePtr->v[0] = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + statePtr->v[1] = seed + XXH_PRIME32_2; + statePtr->v[2] = seed + 0; + statePtr->v[3] = seed - XXH_PRIME32_1; + return XXH_OK; +} + + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH_errorcode +XXH32_update(XXH32_state_t* state, const void* input, size_t len) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + { const xxh_u8* p = (const xxh_u8*)input; + const xxh_u8* const bEnd = p + len; + + state->total_len_32 += (XXH32_hash_t)len; + state->large_len |= (XXH32_hash_t)((len>=16) | (state->total_len_32>=16)); + + if (state->memsize + len < 16) { /* fill in tmp buffer */ + XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, len); + state->memsize += (XXH32_hash_t)len; + return XXH_OK; + } + + if (state->memsize) { /* some data left from previous update */ + XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, 16-state->memsize); + { const xxh_u32* p32 = state->mem32; + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p32)); p32++; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p32)); p32++; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p32)); p32++; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p32)); + } + p += 16-state->memsize; + state->memsize = 0; + } + + if (p <= bEnd-16) { + const xxh_u8* const limit = bEnd - 16; + + do { + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p)); p+=4; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p)); p+=4; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p)); p+=4; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p)); p+=4; + } while (p<=limit); + + } + + if (p < bEnd) { + XXH_memcpy(state->mem32, p, (size_t)(bEnd-p)); + state->memsize = (unsigned)(bEnd-p); + } + } + + return XXH_OK; +} + + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t* state) +{ + xxh_u32 h32; + + if (state->large_len) { + h32 = XXH_rotl32(state->v[0], 1) + + XXH_rotl32(state->v[1], 7) + + XXH_rotl32(state->v[2], 12) + + XXH_rotl32(state->v[3], 18); + } else { + h32 = state->v[2] /* == seed */ + XXH_PRIME32_5; + } + + h32 += state->total_len_32; + + return XXH32_finalize(h32, (const xxh_u8*)state->mem32, state->memsize, XXH_aligned); +} + + +/******* Canonical representation *******/ + +/*! + * @ingroup xxh32_family + * The default return values from XXH functions are unsigned 32 and 64 bit + * integers. + * + * The canonical representation uses big endian convention, the same convention + * as human-readable numbers (large digits first). + * + * This way, hash values can be written into a file or buffer, remaining + * comparable across different systems. + * + * The following functions allow transformation of hash values to and from their + * canonical format. + */ +XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash) +{ + /* XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); */ + if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); + XXH_memcpy(dst, &hash, sizeof(*dst)); +} +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) +{ + return XXH_readBE32(src); +} + + +#ifndef XXH_NO_LONG_LONG + +/* ******************************************************************* +* 64-bit hash functions +*********************************************************************/ +/*! + * @} + * @ingroup impl + * @{ + */ +/******* Memory access *******/ + +typedef XXH64_hash_t xxh_u64; + +#ifdef XXH_OLD_NAMES +# define U64 xxh_u64 +#endif + +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) +/* + * Manual byteshift. Best for old compilers which don't inline memcpy. + * We actually directly use XXH_readLE64 and XXH_readBE64. + */ +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) + +/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ +static xxh_u64 XXH_read64(const void* memPtr) +{ + return *(const xxh_u64*) memPtr; +} + +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) + +/* + * __pack instructions are safer, but compiler specific, hence potentially + * problematic for some compilers. + * + * Currently only defined for GCC and ICC. + */ +#ifdef XXH_OLD_NAMES +typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) unalign64; +#endif +static xxh_u64 XXH_read64(const void* ptr) +{ + typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) xxh_unalign64; + return ((const xxh_unalign64*)ptr)->u64; +} + +#else + +/* + * Portable and safe solution. Generally efficient. + * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html + */ +static xxh_u64 XXH_read64(const void* memPtr) +{ + xxh_u64 val; + XXH_memcpy(&val, memPtr, sizeof(val)); + return val; +} + +#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ + +#if defined(_MSC_VER) /* Visual Studio */ +# define XXH_swap64 _byteswap_uint64 +#elif XXH_GCC_VERSION >= 403 +# define XXH_swap64 __builtin_bswap64 +#else +static xxh_u64 XXH_swap64(xxh_u64 x) +{ + return ((x << 56) & 0xff00000000000000ULL) | + ((x << 40) & 0x00ff000000000000ULL) | + ((x << 24) & 0x0000ff0000000000ULL) | + ((x << 8) & 0x000000ff00000000ULL) | + ((x >> 8) & 0x00000000ff000000ULL) | + ((x >> 24) & 0x0000000000ff0000ULL) | + ((x >> 40) & 0x000000000000ff00ULL) | + ((x >> 56) & 0x00000000000000ffULL); +} +#endif + + +/* XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. */ +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) + +XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[0] + | ((xxh_u64)bytePtr[1] << 8) + | ((xxh_u64)bytePtr[2] << 16) + | ((xxh_u64)bytePtr[3] << 24) + | ((xxh_u64)bytePtr[4] << 32) + | ((xxh_u64)bytePtr[5] << 40) + | ((xxh_u64)bytePtr[6] << 48) + | ((xxh_u64)bytePtr[7] << 56); +} + +XXH_FORCE_INLINE xxh_u64 XXH_readBE64(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[7] + | ((xxh_u64)bytePtr[6] << 8) + | ((xxh_u64)bytePtr[5] << 16) + | ((xxh_u64)bytePtr[4] << 24) + | ((xxh_u64)bytePtr[3] << 32) + | ((xxh_u64)bytePtr[2] << 40) + | ((xxh_u64)bytePtr[1] << 48) + | ((xxh_u64)bytePtr[0] << 56); +} + +#else +XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); +} + +static xxh_u64 XXH_readBE64(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr); +} +#endif + +XXH_FORCE_INLINE xxh_u64 +XXH_readLE64_align(const void* ptr, XXH_alignment align) +{ + if (align==XXH_unaligned) + return XXH_readLE64(ptr); + else + return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u64*)ptr : XXH_swap64(*(const xxh_u64*)ptr); +} + + +/******* xxh64 *******/ +/*! + * @} + * @defgroup xxh64_impl XXH64 implementation + * @ingroup impl + * @{ + */ +/* #define rather that static const, to be used as initializers */ +#define XXH_PRIME64_1 0x9E3779B185EBCA87ULL /*!< 0b1001111000110111011110011011000110000101111010111100101010000111 */ +#define XXH_PRIME64_2 0xC2B2AE3D27D4EB4FULL /*!< 0b1100001010110010101011100011110100100111110101001110101101001111 */ +#define XXH_PRIME64_3 0x165667B19E3779F9ULL /*!< 0b0001011001010110011001111011000110011110001101110111100111111001 */ +#define XXH_PRIME64_4 0x85EBCA77C2B2AE63ULL /*!< 0b1000010111101011110010100111011111000010101100101010111001100011 */ +#define XXH_PRIME64_5 0x27D4EB2F165667C5ULL /*!< 0b0010011111010100111010110010111100010110010101100110011111000101 */ + +#ifdef XXH_OLD_NAMES +# define PRIME64_1 XXH_PRIME64_1 +# define PRIME64_2 XXH_PRIME64_2 +# define PRIME64_3 XXH_PRIME64_3 +# define PRIME64_4 XXH_PRIME64_4 +# define PRIME64_5 XXH_PRIME64_5 +#endif + +static xxh_u64 XXH64_round(xxh_u64 acc, xxh_u64 input) +{ + acc += input * XXH_PRIME64_2; + acc = XXH_rotl64(acc, 31); + acc *= XXH_PRIME64_1; + return acc; +} + +static xxh_u64 XXH64_mergeRound(xxh_u64 acc, xxh_u64 val) +{ + val = XXH64_round(0, val); + acc ^= val; + acc = acc * XXH_PRIME64_1 + XXH_PRIME64_4; + return acc; +} + +static xxh_u64 XXH64_avalanche(xxh_u64 h64) +{ + h64 ^= h64 >> 33; + h64 *= XXH_PRIME64_2; + h64 ^= h64 >> 29; + h64 *= XXH_PRIME64_3; + h64 ^= h64 >> 32; + return h64; +} + + +#define XXH_get64bits(p) XXH_readLE64_align(p, align) + +static xxh_u64 +XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align) +{ + if (ptr==NULL) XXH_ASSERT(len == 0); + len &= 31; + while (len >= 8) { + xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); + ptr += 8; + h64 ^= k1; + h64 = XXH_rotl64(h64,27) * XXH_PRIME64_1 + XXH_PRIME64_4; + len -= 8; + } + if (len >= 4) { + h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1; + ptr += 4; + h64 = XXH_rotl64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; + len -= 4; + } + while (len > 0) { + h64 ^= (*ptr++) * XXH_PRIME64_5; + h64 = XXH_rotl64(h64, 11) * XXH_PRIME64_1; + --len; + } + return XXH64_avalanche(h64); +} + +#ifdef XXH_OLD_NAMES +# define PROCESS1_64 XXH_PROCESS1_64 +# define PROCESS4_64 XXH_PROCESS4_64 +# define PROCESS8_64 XXH_PROCESS8_64 +#else +# undef XXH_PROCESS1_64 +# undef XXH_PROCESS4_64 +# undef XXH_PROCESS8_64 +#endif + +XXH_FORCE_INLINE xxh_u64 +XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align) +{ + xxh_u64 h64; + if (input==NULL) XXH_ASSERT(len == 0); + + if (len>=32) { + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 31; + xxh_u64 v1 = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + xxh_u64 v2 = seed + XXH_PRIME64_2; + xxh_u64 v3 = seed + 0; + xxh_u64 v4 = seed - XXH_PRIME64_1; + + do { + v1 = XXH64_round(v1, XXH_get64bits(input)); input+=8; + v2 = XXH64_round(v2, XXH_get64bits(input)); input+=8; + v3 = XXH64_round(v3, XXH_get64bits(input)); input+=8; + v4 = XXH64_round(v4, XXH_get64bits(input)); input+=8; + } while (inputv[0] = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + statePtr->v[1] = seed + XXH_PRIME64_2; + statePtr->v[2] = seed + 0; + statePtr->v[3] = seed - XXH_PRIME64_1; + return XXH_OK; +} + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH_errorcode +XXH64_update (XXH64_state_t* state, const void* input, size_t len) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + { const xxh_u8* p = (const xxh_u8*)input; + const xxh_u8* const bEnd = p + len; + + state->total_len += len; + + if (state->memsize + len < 32) { /* fill in tmp buffer */ + XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, len); + state->memsize += (xxh_u32)len; + return XXH_OK; + } + + if (state->memsize) { /* tmp buffer is full */ + XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, 32-state->memsize); + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(state->mem64+0)); + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(state->mem64+1)); + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(state->mem64+2)); + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(state->mem64+3)); + p += 32 - state->memsize; + state->memsize = 0; + } + + if (p+32 <= bEnd) { + const xxh_u8* const limit = bEnd - 32; + + do { + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(p)); p+=8; + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(p)); p+=8; + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(p)); p+=8; + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(p)); p+=8; + } while (p<=limit); + + } + + if (p < bEnd) { + XXH_memcpy(state->mem64, p, (size_t)(bEnd-p)); + state->memsize = (unsigned)(bEnd-p); + } + } + + return XXH_OK; +} + + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_digest(const XXH64_state_t* state) +{ + xxh_u64 h64; + + if (state->total_len >= 32) { + h64 = XXH_rotl64(state->v[0], 1) + XXH_rotl64(state->v[1], 7) + XXH_rotl64(state->v[2], 12) + XXH_rotl64(state->v[3], 18); + h64 = XXH64_mergeRound(h64, state->v[0]); + h64 = XXH64_mergeRound(h64, state->v[1]); + h64 = XXH64_mergeRound(h64, state->v[2]); + h64 = XXH64_mergeRound(h64, state->v[3]); + } else { + h64 = state->v[2] /*seed*/ + XXH_PRIME64_5; + } + + h64 += (xxh_u64) state->total_len; + + return XXH64_finalize(h64, (const xxh_u8*)state->mem64, (size_t)state->total_len, XXH_aligned); +} + + +/******* Canonical representation *******/ + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash) +{ + /* XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); */ + if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); + XXH_memcpy(dst, &hash, sizeof(*dst)); +} + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src) +{ + return XXH_readBE64(src); +} + +#ifndef XXH_NO_XXH3 + +/* ********************************************************************* +* XXH3 +* New generation hash designed for speed on small keys and vectorization +************************************************************************ */ +/*! + * @} + * @defgroup xxh3_impl XXH3 implementation + * @ingroup impl + * @{ + */ + +/* === Compiler specifics === */ + +#if ((defined(sun) || defined(__sun)) && __cplusplus) /* Solaris includes __STDC_VERSION__ with C++. Tested with GCC 5.5 */ +# define XXH_RESTRICT /* disable */ +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */ +# define XXH_RESTRICT restrict +#else +/* Note: it might be useful to define __restrict or __restrict__ for some C++ compilers */ +# define XXH_RESTRICT /* disable */ +#endif + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) \ + || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) \ + || defined(__clang__) +# define XXH_likely(x) __builtin_expect(x, 1) +# define XXH_unlikely(x) __builtin_expect(x, 0) +#else +# define XXH_likely(x) (x) +# define XXH_unlikely(x) (x) +#endif + +#if defined(__GNUC__) || defined(__clang__) +# if defined(__ARM_NEON__) || defined(__ARM_NEON) \ + || defined(__aarch64__) || defined(_M_ARM) \ + || defined(_M_ARM64) || defined(_M_ARM64EC) +# define inline __inline__ /* circumvent a clang bug */ +# include +# undef inline +# elif defined(__AVX2__) +# include +# elif defined(__SSE2__) +# include +# endif +#endif + +#if defined(_MSC_VER) +# include +#endif + +/* + * One goal of XXH3 is to make it fast on both 32-bit and 64-bit, while + * remaining a true 64-bit/128-bit hash function. + * + * This is done by prioritizing a subset of 64-bit operations that can be + * emulated without too many steps on the average 32-bit machine. + * + * For example, these two lines seem similar, and run equally fast on 64-bit: + * + * xxh_u64 x; + * x ^= (x >> 47); // good + * x ^= (x >> 13); // bad + * + * However, to a 32-bit machine, there is a major difference. + * + * x ^= (x >> 47) looks like this: + * + * x.lo ^= (x.hi >> (47 - 32)); + * + * while x ^= (x >> 13) looks like this: + * + * // note: funnel shifts are not usually cheap. + * x.lo ^= (x.lo >> 13) | (x.hi << (32 - 13)); + * x.hi ^= (x.hi >> 13); + * + * The first one is significantly faster than the second, simply because the + * shift is larger than 32. This means: + * - All the bits we need are in the upper 32 bits, so we can ignore the lower + * 32 bits in the shift. + * - The shift result will always fit in the lower 32 bits, and therefore, + * we can ignore the upper 32 bits in the xor. + * + * Thanks to this optimization, XXH3 only requires these features to be efficient: + * + * - Usable unaligned access + * - A 32-bit or 64-bit ALU + * - If 32-bit, a decent ADC instruction + * - A 32 or 64-bit multiply with a 64-bit result + * - For the 128-bit variant, a decent byteswap helps short inputs. + * + * The first two are already required by XXH32, and almost all 32-bit and 64-bit + * platforms which can run XXH32 can run XXH3 efficiently. + * + * Thumb-1, the classic 16-bit only subset of ARM's instruction set, is one + * notable exception. + * + * First of all, Thumb-1 lacks support for the UMULL instruction which + * performs the important long multiply. This means numerous __aeabi_lmul + * calls. + * + * Second of all, the 8 functional registers are just not enough. + * Setup for __aeabi_lmul, byteshift loads, pointers, and all arithmetic need + * Lo registers, and this shuffling results in thousands more MOVs than A32. + * + * A32 and T32 don't have this limitation. They can access all 14 registers, + * do a 32->64 multiply with UMULL, and the flexible operand allowing free + * shifts is helpful, too. + * + * Therefore, we do a quick sanity check. + * + * If compiling Thumb-1 for a target which supports ARM instructions, we will + * emit a warning, as it is not a "sane" platform to compile for. + * + * Usually, if this happens, it is because of an accident and you probably need + * to specify -march, as you likely meant to compile for a newer architecture. + * + * Credit: large sections of the vectorial and asm source code paths + * have been contributed by @easyaspi314 + */ +#if defined(__thumb__) && !defined(__thumb2__) && defined(__ARM_ARCH_ISA_ARM) +# warning "XXH3 is highly inefficient without ARM or Thumb-2." +#endif + +/* ========================================== + * Vectorization detection + * ========================================== */ + +#ifdef XXH_DOXYGEN +/*! + * @ingroup tuning + * @brief Overrides the vectorization implementation chosen for XXH3. + * + * Can be defined to 0 to disable SIMD or any of the values mentioned in + * @ref XXH_VECTOR_TYPE. + * + * If this is not defined, it uses predefined macros to determine the best + * implementation. + */ +# define XXH_VECTOR XXH_SCALAR +/*! + * @ingroup tuning + * @brief Possible values for @ref XXH_VECTOR. + * + * Note that these are actually implemented as macros. + * + * If this is not defined, it is detected automatically. + * @ref XXH_X86DISPATCH overrides this. + */ +enum XXH_VECTOR_TYPE /* fake enum */ { + XXH_SCALAR = 0, /*!< Portable scalar version */ + XXH_SSE2 = 1, /*!< + * SSE2 for Pentium 4, Opteron, all x86_64. + * + * @note SSE2 is also guaranteed on Windows 10, macOS, and + * Android x86. + */ + XXH_AVX2 = 2, /*!< AVX2 for Haswell and Bulldozer */ + XXH_AVX512 = 3, /*!< AVX512 for Skylake and Icelake */ + XXH_NEON = 4, /*!< NEON for most ARMv7-A and all AArch64 */ + XXH_VSX = 5, /*!< VSX and ZVector for POWER8/z13 (64-bit) */ +}; +/*! + * @ingroup tuning + * @brief Selects the minimum alignment for XXH3's accumulators. + * + * When using SIMD, this should match the alignment required for said vector + * type, so, for example, 32 for AVX2. + * + * Default: Auto detected. + */ +# define XXH_ACC_ALIGN 8 +#endif + +/* Actual definition */ +#ifndef XXH_DOXYGEN +# define XXH_SCALAR 0 +# define XXH_SSE2 1 +# define XXH_AVX2 2 +# define XXH_AVX512 3 +# define XXH_NEON 4 +# define XXH_VSX 5 +#endif + +#ifndef XXH_VECTOR /* can be defined on command line */ +# if ( \ + defined(__ARM_NEON__) || defined(__ARM_NEON) /* gcc */ \ + || defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC) /* msvc */ \ + ) && ( \ + defined(_WIN32) || defined(__LITTLE_ENDIAN__) /* little endian only */ \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ + ) +# define XXH_VECTOR XXH_NEON +# elif defined(__AVX512F__) +# define XXH_VECTOR XXH_AVX512 +# elif defined(__AVX2__) +# define XXH_VECTOR XXH_AVX2 +# elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2)) +# define XXH_VECTOR XXH_SSE2 +# elif (defined(__PPC64__) && defined(__POWER8_VECTOR__)) \ + || (defined(__s390x__) && defined(__VEC__)) \ + && defined(__GNUC__) /* TODO: IBM XL */ +# define XXH_VECTOR XXH_VSX +# else +# define XXH_VECTOR XXH_SCALAR +# endif +#endif + +/* + * Controls the alignment of the accumulator, + * for compatibility with aligned vector loads, which are usually faster. + */ +#ifndef XXH_ACC_ALIGN +# if defined(XXH_X86DISPATCH) +# define XXH_ACC_ALIGN 64 /* for compatibility with avx512 */ +# elif XXH_VECTOR == XXH_SCALAR /* scalar */ +# define XXH_ACC_ALIGN 8 +# elif XXH_VECTOR == XXH_SSE2 /* sse2 */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_AVX2 /* avx2 */ +# define XXH_ACC_ALIGN 32 +# elif XXH_VECTOR == XXH_NEON /* neon */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_VSX /* vsx */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_AVX512 /* avx512 */ +# define XXH_ACC_ALIGN 64 +# endif +#endif + +#if defined(XXH_X86DISPATCH) || XXH_VECTOR == XXH_SSE2 \ + || XXH_VECTOR == XXH_AVX2 || XXH_VECTOR == XXH_AVX512 +# define XXH_SEC_ALIGN XXH_ACC_ALIGN +#else +# define XXH_SEC_ALIGN 8 +#endif + +/* + * UGLY HACK: + * GCC usually generates the best code with -O3 for xxHash. + * + * However, when targeting AVX2, it is overzealous in its unrolling resulting + * in code roughly 3/4 the speed of Clang. + * + * There are other issues, such as GCC splitting _mm256_loadu_si256 into + * _mm_loadu_si128 + _mm256_inserti128_si256. This is an optimization which + * only applies to Sandy and Ivy Bridge... which don't even support AVX2. + * + * That is why when compiling the AVX2 version, it is recommended to use either + * -O2 -mavx2 -march=haswell + * or + * -O2 -mavx2 -mno-avx256-split-unaligned-load + * for decent performance, or to use Clang instead. + * + * Fortunately, we can control the first one with a pragma that forces GCC into + * -O2, but the other one we can't control without "failed to inline always + * inline function due to target mismatch" warnings. + */ +#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \ + && defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__OPTIMIZE__) && !defined(__OPTIMIZE_SIZE__) /* respect -O0 and -Os */ +# pragma GCC push_options +# pragma GCC optimize("-O2") +#endif + + +#if XXH_VECTOR == XXH_NEON +/* + * NEON's setup for vmlal_u32 is a little more complicated than it is on + * SSE2, AVX2, and VSX. + * + * While PMULUDQ and VMULEUW both perform a mask, VMLAL.U32 performs an upcast. + * + * To do the same operation, the 128-bit 'Q' register needs to be split into + * two 64-bit 'D' registers, performing this operation:: + * + * [ a | b ] + * | '---------. .--------' | + * | x | + * | .---------' '--------. | + * [ a & 0xFFFFFFFF | b & 0xFFFFFFFF ],[ a >> 32 | b >> 32 ] + * + * Due to significant changes in aarch64, the fastest method for aarch64 is + * completely different than the fastest method for ARMv7-A. + * + * ARMv7-A treats D registers as unions overlaying Q registers, so modifying + * D11 will modify the high half of Q5. This is similar to how modifying AH + * will only affect bits 8-15 of AX on x86. + * + * VZIP takes two registers, and puts even lanes in one register and odd lanes + * in the other. + * + * On ARMv7-A, this strangely modifies both parameters in place instead of + * taking the usual 3-operand form. + * + * Therefore, if we want to do this, we can simply use a D-form VZIP.32 on the + * lower and upper halves of the Q register to end up with the high and low + * halves where we want - all in one instruction. + * + * vzip.32 d10, d11 @ d10 = { d10[0], d11[0] }; d11 = { d10[1], d11[1] } + * + * Unfortunately we need inline assembly for this: Instructions modifying two + * registers at once is not possible in GCC or Clang's IR, and they have to + * create a copy. + * + * aarch64 requires a different approach. + * + * In order to make it easier to write a decent compiler for aarch64, many + * quirks were removed, such as conditional execution. + * + * NEON was also affected by this. + * + * aarch64 cannot access the high bits of a Q-form register, and writes to a + * D-form register zero the high bits, similar to how writes to W-form scalar + * registers (or DWORD registers on x86_64) work. + * + * The formerly free vget_high intrinsics now require a vext (with a few + * exceptions) + * + * Additionally, VZIP was replaced by ZIP1 and ZIP2, which are the equivalent + * of PUNPCKL* and PUNPCKH* in SSE, respectively, in order to only modify one + * operand. + * + * The equivalent of the VZIP.32 on the lower and upper halves would be this + * mess: + * + * ext v2.4s, v0.4s, v0.4s, #2 // v2 = { v0[2], v0[3], v0[0], v0[1] } + * zip1 v1.2s, v0.2s, v2.2s // v1 = { v0[0], v2[0] } + * zip2 v0.2s, v0.2s, v1.2s // v0 = { v0[1], v2[1] } + * + * Instead, we use a literal downcast, vmovn_u64 (XTN), and vshrn_n_u64 (SHRN): + * + * shrn v1.2s, v0.2d, #32 // v1 = (uint32x2_t)(v0 >> 32); + * xtn v0.2s, v0.2d // v0 = (uint32x2_t)(v0 & 0xFFFFFFFF); + * + * This is available on ARMv7-A, but is less efficient than a single VZIP.32. + */ + +/*! + * Function-like macro: + * void XXH_SPLIT_IN_PLACE(uint64x2_t &in, uint32x2_t &outLo, uint32x2_t &outHi) + * { + * outLo = (uint32x2_t)(in & 0xFFFFFFFF); + * outHi = (uint32x2_t)(in >> 32); + * in = UNDEFINED; + * } + */ +# if !defined(XXH_NO_VZIP_HACK) /* define to disable */ \ + && (defined(__GNUC__) || defined(__clang__)) \ + && (defined(__arm__) || defined(__thumb__) || defined(_M_ARM)) +# define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \ + do { \ + /* Undocumented GCC/Clang operand modifier: %e0 = lower D half, %f0 = upper D half */ \ + /* https://github.com/gcc-mirror/gcc/blob/38cf91e5/gcc/config/arm/arm.c#L22486 */ \ + /* https://github.com/llvm-mirror/llvm/blob/2c4ca683/lib/Target/ARM/ARMAsmPrinter.cpp#L399 */ \ + __asm__("vzip.32 %e0, %f0" : "+w" (in)); \ + (outLo) = vget_low_u32 (vreinterpretq_u32_u64(in)); \ + (outHi) = vget_high_u32(vreinterpretq_u32_u64(in)); \ + } while (0) +# else +# define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \ + do { \ + (outLo) = vmovn_u64 (in); \ + (outHi) = vshrn_n_u64 ((in), 32); \ + } while (0) +# endif + +/*! + * @ingroup tuning + * @brief Controls the NEON to scalar ratio for XXH3 + * + * On AArch64 when not optimizing for size, XXH3 will run 6 lanes using NEON and + * 2 lanes on scalar by default. + * + * This can be set to 2, 4, 6, or 8. ARMv7 will default to all 8 NEON lanes, as the + * emulated 64-bit arithmetic is too slow. + * + * Modern ARM CPUs are _very_ sensitive to how their pipelines are used. + * + * For example, the Cortex-A73 can dispatch 3 micro-ops per cycle, but it can't + * have more than 2 NEON (F0/F1) micro-ops. If you are only using NEON instructions, + * you are only using 2/3 of the CPU bandwidth. + * + * This is even more noticeable on the more advanced cores like the A76 which + * can dispatch 8 micro-ops per cycle, but still only 2 NEON micro-ops at once. + * + * Therefore, @ref XXH3_NEON_LANES lanes will be processed using NEON, and the + * remaining lanes will use scalar instructions. This improves the bandwidth + * and also gives the integer pipelines something to do besides twiddling loop + * counters and pointers. + * + * This change benefits CPUs with large micro-op buffers without negatively affecting + * other CPUs: + * + * | Chipset | Dispatch type | NEON only | 6:2 hybrid | Diff. | + * |:----------------------|:--------------------|----------:|-----------:|------:| + * | Snapdragon 730 (A76) | 2 NEON/8 micro-ops | 8.8 GB/s | 10.1 GB/s | ~16% | + * | Snapdragon 835 (A73) | 2 NEON/3 micro-ops | 5.1 GB/s | 5.3 GB/s | ~5% | + * | Marvell PXA1928 (A53) | In-order dual-issue | 1.9 GB/s | 1.9 GB/s | 0% | + * + * It also seems to fix some bad codegen on GCC, making it almost as fast as clang. + * + * @see XXH3_accumulate_512_neon() + */ +# ifndef XXH3_NEON_LANES +# if (defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) \ + && !defined(__OPTIMIZE_SIZE__) +# define XXH3_NEON_LANES 6 +# else +# define XXH3_NEON_LANES XXH_ACC_NB +# endif +# endif +#endif /* XXH_VECTOR == XXH_NEON */ + +/* + * VSX and Z Vector helpers. + * + * This is very messy, and any pull requests to clean this up are welcome. + * + * There are a lot of problems with supporting VSX and s390x, due to + * inconsistent intrinsics, spotty coverage, and multiple endiannesses. + */ +#if XXH_VECTOR == XXH_VSX +# if defined(__s390x__) +# include +# else +/* gcc's altivec.h can have the unwanted consequence to unconditionally + * #define bool, vector, and pixel keywords, + * with bad consequences for programs already using these keywords for other purposes. + * The paragraph defining these macros is skipped when __APPLE_ALTIVEC__ is defined. + * __APPLE_ALTIVEC__ is _generally_ defined automatically by the compiler, + * but it seems that, in some cases, it isn't. + * Force the build macro to be defined, so that keywords are not altered. + */ +# if defined(__GNUC__) && !defined(__APPLE_ALTIVEC__) +# define __APPLE_ALTIVEC__ +# endif +# include +# endif + +typedef __vector unsigned long long xxh_u64x2; +typedef __vector unsigned char xxh_u8x16; +typedef __vector unsigned xxh_u32x4; + +# ifndef XXH_VSX_BE +# if defined(__BIG_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +# define XXH_VSX_BE 1 +# elif defined(__VEC_ELEMENT_REG_ORDER__) && __VEC_ELEMENT_REG_ORDER__ == __ORDER_BIG_ENDIAN__ +# warning "-maltivec=be is not recommended. Please use native endianness." +# define XXH_VSX_BE 1 +# else +# define XXH_VSX_BE 0 +# endif +# endif /* !defined(XXH_VSX_BE) */ + +# if XXH_VSX_BE +# if defined(__POWER9_VECTOR__) || (defined(__clang__) && defined(__s390x__)) +# define XXH_vec_revb vec_revb +# else +/*! + * A polyfill for POWER9's vec_revb(). + */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_revb(xxh_u64x2 val) +{ + xxh_u8x16 const vByteSwap = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08 }; + return vec_perm(val, val, vByteSwap); +} +# endif +# endif /* XXH_VSX_BE */ + +/*! + * Performs an unaligned vector load and byte swaps it on big endian. + */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_loadu(const void *ptr) +{ + xxh_u64x2 ret; + XXH_memcpy(&ret, ptr, sizeof(xxh_u64x2)); +# if XXH_VSX_BE + ret = XXH_vec_revb(ret); +# endif + return ret; +} + +/* + * vec_mulo and vec_mule are very problematic intrinsics on PowerPC + * + * These intrinsics weren't added until GCC 8, despite existing for a while, + * and they are endian dependent. Also, their meaning swap depending on version. + * */ +# if defined(__s390x__) + /* s390x is always big endian, no issue on this platform */ +# define XXH_vec_mulo vec_mulo +# define XXH_vec_mule vec_mule +# elif defined(__clang__) && XXH_HAS_BUILTIN(__builtin_altivec_vmuleuw) +/* Clang has a better way to control this, we can just use the builtin which doesn't swap. */ +# define XXH_vec_mulo __builtin_altivec_vmulouw +# define XXH_vec_mule __builtin_altivec_vmuleuw +# else +/* gcc needs inline assembly */ +/* Adapted from https://github.com/google/highwayhash/blob/master/highwayhash/hh_vsx.h. */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mulo(xxh_u32x4 a, xxh_u32x4 b) +{ + xxh_u64x2 result; + __asm__("vmulouw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); + return result; +} +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b) +{ + xxh_u64x2 result; + __asm__("vmuleuw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); + return result; +} +# endif /* XXH_vec_mulo, XXH_vec_mule */ +#endif /* XXH_VECTOR == XXH_VSX */ + + +/* prefetch + * can be disabled, by declaring XXH_NO_PREFETCH build macro */ +#if defined(XXH_NO_PREFETCH) +# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ +#else +# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) /* _mm_prefetch() not defined outside of x86/x64 */ +# include /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ +# define XXH_PREFETCH(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) +# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) ) +# define XXH_PREFETCH(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */) +# else +# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ +# endif +#endif /* XXH_NO_PREFETCH */ + + +/* ========================================== + * XXH3 default settings + * ========================================== */ + +#define XXH_SECRET_DEFAULT_SIZE 192 /* minimum XXH3_SECRET_SIZE_MIN */ + +#if (XXH_SECRET_DEFAULT_SIZE < XXH3_SECRET_SIZE_MIN) +# error "default keyset is not large enough" +#endif + +/*! Pseudorandom secret taken directly from FARSH. */ +XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = { + 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, + 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, + 0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, + 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c, + 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, + 0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, + 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d, + 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, + 0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, + 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e, + 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, + 0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, +}; + + +#ifdef XXH_OLD_NAMES +# define kSecret XXH3_kSecret +#endif + +#ifdef XXH_DOXYGEN +/*! + * @brief Calculates a 32-bit to 64-bit long multiply. + * + * Implemented as a macro. + * + * Wraps `__emulu` on MSVC x86 because it tends to call `__allmul` when it doesn't + * need to (but it shouldn't need to anyways, it is about 7 instructions to do + * a 64x64 multiply...). Since we know that this will _always_ emit `MULL`, we + * use that instead of the normal method. + * + * If you are compiling for platforms like Thumb-1 and don't have a better option, + * you may also want to write your own long multiply routine here. + * + * @param x, y Numbers to be multiplied + * @return 64-bit product of the low 32 bits of @p x and @p y. + */ +XXH_FORCE_INLINE xxh_u64 +XXH_mult32to64(xxh_u64 x, xxh_u64 y) +{ + return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF); +} +#elif defined(_MSC_VER) && defined(_M_IX86) +# define XXH_mult32to64(x, y) __emulu((unsigned)(x), (unsigned)(y)) +#else +/* + * Downcast + upcast is usually better than masking on older compilers like + * GCC 4.2 (especially 32-bit ones), all without affecting newer compilers. + * + * The other method, (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF), will AND both operands + * and perform a full 64x64 multiply -- entirely redundant on 32-bit. + */ +# define XXH_mult32to64(x, y) ((xxh_u64)(xxh_u32)(x) * (xxh_u64)(xxh_u32)(y)) +#endif + +/*! + * @brief Calculates a 64->128-bit long multiply. + * + * Uses `__uint128_t` and `_umul128` if available, otherwise uses a scalar + * version. + * + * @param lhs , rhs The 64-bit integers to be multiplied + * @return The 128-bit result represented in an @ref XXH128_hash_t. + */ +static XXH128_hash_t +XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) +{ + /* + * GCC/Clang __uint128_t method. + * + * On most 64-bit targets, GCC and Clang define a __uint128_t type. + * This is usually the best way as it usually uses a native long 64-bit + * multiply, such as MULQ on x86_64 or MUL + UMULH on aarch64. + * + * Usually. + * + * Despite being a 32-bit platform, Clang (and emscripten) define this type + * despite not having the arithmetic for it. This results in a laggy + * compiler builtin call which calculates a full 128-bit multiply. + * In that case it is best to use the portable one. + * https://github.com/Cyan4973/xxHash/issues/211#issuecomment-515575677 + */ +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__wasm__) \ + && defined(__SIZEOF_INT128__) \ + || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 128) + + __uint128_t const product = (__uint128_t)lhs * (__uint128_t)rhs; + XXH128_hash_t r128; + r128.low64 = (xxh_u64)(product); + r128.high64 = (xxh_u64)(product >> 64); + return r128; + + /* + * MSVC for x64's _umul128 method. + * + * xxh_u64 _umul128(xxh_u64 Multiplier, xxh_u64 Multiplicand, xxh_u64 *HighProduct); + * + * This compiles to single operand MUL on x64. + */ +#elif (defined(_M_X64) || defined(_M_IA64)) && !defined(_M_ARM64EC) + +#ifndef _MSC_VER +# pragma intrinsic(_umul128) +#endif + xxh_u64 product_high; + xxh_u64 const product_low = _umul128(lhs, rhs, &product_high); + XXH128_hash_t r128; + r128.low64 = product_low; + r128.high64 = product_high; + return r128; + + /* + * MSVC for ARM64's __umulh method. + * + * This compiles to the same MUL + UMULH as GCC/Clang's __uint128_t method. + */ +#elif defined(_M_ARM64) || defined(_M_ARM64EC) + +#ifndef _MSC_VER +# pragma intrinsic(__umulh) +#endif + XXH128_hash_t r128; + r128.low64 = lhs * rhs; + r128.high64 = __umulh(lhs, rhs); + return r128; + +#else + /* + * Portable scalar method. Optimized for 32-bit and 64-bit ALUs. + * + * This is a fast and simple grade school multiply, which is shown below + * with base 10 arithmetic instead of base 0x100000000. + * + * 9 3 // D2 lhs = 93 + * x 7 5 // D2 rhs = 75 + * ---------- + * 1 5 // D2 lo_lo = (93 % 10) * (75 % 10) = 15 + * 4 5 | // D2 hi_lo = (93 / 10) * (75 % 10) = 45 + * 2 1 | // D2 lo_hi = (93 % 10) * (75 / 10) = 21 + * + 6 3 | | // D2 hi_hi = (93 / 10) * (75 / 10) = 63 + * --------- + * 2 7 | // D2 cross = (15 / 10) + (45 % 10) + 21 = 27 + * + 6 7 | | // D2 upper = (27 / 10) + (45 / 10) + 63 = 67 + * --------- + * 6 9 7 5 // D4 res = (27 * 10) + (15 % 10) + (67 * 100) = 6975 + * + * The reasons for adding the products like this are: + * 1. It avoids manual carry tracking. Just like how + * (9 * 9) + 9 + 9 = 99, the same applies with this for UINT64_MAX. + * This avoids a lot of complexity. + * + * 2. It hints for, and on Clang, compiles to, the powerful UMAAL + * instruction available in ARM's Digital Signal Processing extension + * in 32-bit ARMv6 and later, which is shown below: + * + * void UMAAL(xxh_u32 *RdLo, xxh_u32 *RdHi, xxh_u32 Rn, xxh_u32 Rm) + * { + * xxh_u64 product = (xxh_u64)*RdLo * (xxh_u64)*RdHi + Rn + Rm; + * *RdLo = (xxh_u32)(product & 0xFFFFFFFF); + * *RdHi = (xxh_u32)(product >> 32); + * } + * + * This instruction was designed for efficient long multiplication, and + * allows this to be calculated in only 4 instructions at speeds + * comparable to some 64-bit ALUs. + * + * 3. It isn't terrible on other platforms. Usually this will be a couple + * of 32-bit ADD/ADCs. + */ + + /* First calculate all of the cross products. */ + xxh_u64 const lo_lo = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs & 0xFFFFFFFF); + xxh_u64 const hi_lo = XXH_mult32to64(lhs >> 32, rhs & 0xFFFFFFFF); + xxh_u64 const lo_hi = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs >> 32); + xxh_u64 const hi_hi = XXH_mult32to64(lhs >> 32, rhs >> 32); + + /* Now add the products together. These will never overflow. */ + xxh_u64 const cross = (lo_lo >> 32) + (hi_lo & 0xFFFFFFFF) + lo_hi; + xxh_u64 const upper = (hi_lo >> 32) + (cross >> 32) + hi_hi; + xxh_u64 const lower = (cross << 32) | (lo_lo & 0xFFFFFFFF); + + XXH128_hash_t r128; + r128.low64 = lower; + r128.high64 = upper; + return r128; +#endif +} + +/*! + * @brief Calculates a 64-bit to 128-bit multiply, then XOR folds it. + * + * The reason for the separate function is to prevent passing too many structs + * around by value. This will hopefully inline the multiply, but we don't force it. + * + * @param lhs , rhs The 64-bit integers to multiply + * @return The low 64 bits of the product XOR'd by the high 64 bits. + * @see XXH_mult64to128() + */ +static xxh_u64 +XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs) +{ + XXH128_hash_t product = XXH_mult64to128(lhs, rhs); + return product.low64 ^ product.high64; +} + +/*! Seems to produce slightly better code on GCC for some reason. */ +XXH_FORCE_INLINE xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift) +{ + XXH_ASSERT(0 <= shift && shift < 64); + return v64 ^ (v64 >> shift); +} + +/* + * This is a fast avalanche stage, + * suitable when input bits are already partially mixed + */ +static XXH64_hash_t XXH3_avalanche(xxh_u64 h64) +{ + h64 = XXH_xorshift64(h64, 37); + h64 *= 0x165667919E3779F9ULL; + h64 = XXH_xorshift64(h64, 32); + return h64; +} + +/* + * This is a stronger avalanche, + * inspired by Pelle Evensen's rrmxmx + * preferable when input has not been previously mixed + */ +static XXH64_hash_t XXH3_rrmxmx(xxh_u64 h64, xxh_u64 len) +{ + /* this mix is inspired by Pelle Evensen's rrmxmx */ + h64 ^= XXH_rotl64(h64, 49) ^ XXH_rotl64(h64, 24); + h64 *= 0x9FB21C651E98DF25ULL; + h64 ^= (h64 >> 35) + len ; + h64 *= 0x9FB21C651E98DF25ULL; + return XXH_xorshift64(h64, 28); +} + + +/* ========================================== + * Short keys + * ========================================== + * One of the shortcomings of XXH32 and XXH64 was that their performance was + * sub-optimal on short lengths. It used an iterative algorithm which strongly + * favored lengths that were a multiple of 4 or 8. + * + * Instead of iterating over individual inputs, we use a set of single shot + * functions which piece together a range of lengths and operate in constant time. + * + * Additionally, the number of multiplies has been significantly reduced. This + * reduces latency, especially when emulating 64-bit multiplies on 32-bit. + * + * Depending on the platform, this may or may not be faster than XXH32, but it + * is almost guaranteed to be faster than XXH64. + */ + +/* + * At very short lengths, there isn't enough input to fully hide secrets, or use + * the entire secret. + * + * There is also only a limited amount of mixing we can do before significantly + * impacting performance. + * + * Therefore, we use different sections of the secret and always mix two secret + * samples with an XOR. This should have no effect on performance on the + * seedless or withSeed variants because everything _should_ be constant folded + * by modern compilers. + * + * The XOR mixing hides individual parts of the secret and increases entropy. + * + * This adds an extra layer of strength for custom secrets. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_1to3_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(1 <= len && len <= 3); + XXH_ASSERT(secret != NULL); + /* + * len = 1: combined = { input[0], 0x01, input[0], input[0] } + * len = 2: combined = { input[1], 0x02, input[0], input[1] } + * len = 3: combined = { input[2], 0x03, input[0], input[1] } + */ + { xxh_u8 const c1 = input[0]; + xxh_u8 const c2 = input[len >> 1]; + xxh_u8 const c3 = input[len - 1]; + xxh_u32 const combined = ((xxh_u32)c1 << 16) | ((xxh_u32)c2 << 24) + | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8); + xxh_u64 const bitflip = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed; + xxh_u64 const keyed = (xxh_u64)combined ^ bitflip; + return XXH64_avalanche(keyed); + } +} + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(4 <= len && len <= 8); + seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; + { xxh_u32 const input1 = XXH_readLE32(input); + xxh_u32 const input2 = XXH_readLE32(input + len - 4); + xxh_u64 const bitflip = (XXH_readLE64(secret+8) ^ XXH_readLE64(secret+16)) - seed; + xxh_u64 const input64 = input2 + (((xxh_u64)input1) << 32); + xxh_u64 const keyed = input64 ^ bitflip; + return XXH3_rrmxmx(keyed, len); + } +} + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(9 <= len && len <= 16); + { xxh_u64 const bitflip1 = (XXH_readLE64(secret+24) ^ XXH_readLE64(secret+32)) + seed; + xxh_u64 const bitflip2 = (XXH_readLE64(secret+40) ^ XXH_readLE64(secret+48)) - seed; + xxh_u64 const input_lo = XXH_readLE64(input) ^ bitflip1; + xxh_u64 const input_hi = XXH_readLE64(input + len - 8) ^ bitflip2; + xxh_u64 const acc = len + + XXH_swap64(input_lo) + input_hi + + XXH3_mul128_fold64(input_lo, input_hi); + return XXH3_avalanche(acc); + } +} + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_0to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(len <= 16); + { if (XXH_likely(len > 8)) return XXH3_len_9to16_64b(input, len, secret, seed); + if (XXH_likely(len >= 4)) return XXH3_len_4to8_64b(input, len, secret, seed); + if (len) return XXH3_len_1to3_64b(input, len, secret, seed); + return XXH64_avalanche(seed ^ (XXH_readLE64(secret+56) ^ XXH_readLE64(secret+64))); + } +} + +/* + * DISCLAIMER: There are known *seed-dependent* multicollisions here due to + * multiplication by zero, affecting hashes of lengths 17 to 240. + * + * However, they are very unlikely. + * + * Keep this in mind when using the unseeded XXH3_64bits() variant: As with all + * unseeded non-cryptographic hashes, it does not attempt to defend itself + * against specially crafted inputs, only random inputs. + * + * Compared to classic UMAC where a 1 in 2^31 chance of 4 consecutive bytes + * cancelling out the secret is taken an arbitrary number of times (addressed + * in XXH3_accumulate_512), this collision is very unlikely with random inputs + * and/or proper seeding: + * + * This only has a 1 in 2^63 chance of 8 consecutive bytes cancelling out, in a + * function that is only called up to 16 times per hash with up to 240 bytes of + * input. + * + * This is not too bad for a non-cryptographic hash function, especially with + * only 64 bit outputs. + * + * The 128-bit variant (which trades some speed for strength) is NOT affected + * by this, although it is always a good idea to use a proper seed if you care + * about strength. + */ +XXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input, + const xxh_u8* XXH_RESTRICT secret, xxh_u64 seed64) +{ +#if defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__i386__) && defined(__SSE2__) /* x86 + SSE2 */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable like XXH32 hack */ + /* + * UGLY HACK: + * GCC for x86 tends to autovectorize the 128-bit multiply, resulting in + * slower code. + * + * By forcing seed64 into a register, we disrupt the cost model and + * cause it to scalarize. See `XXH32_round()` + * + * FIXME: Clang's output is still _much_ faster -- On an AMD Ryzen 3600, + * XXH3_64bits @ len=240 runs at 4.6 GB/s with Clang 9, but 3.3 GB/s on + * GCC 9.2, despite both emitting scalar code. + * + * GCC generates much better scalar code than Clang for the rest of XXH3, + * which is why finding a more optimal codepath is an interest. + */ + XXH_COMPILER_GUARD(seed64); +#endif + { xxh_u64 const input_lo = XXH_readLE64(input); + xxh_u64 const input_hi = XXH_readLE64(input+8); + return XXH3_mul128_fold64( + input_lo ^ (XXH_readLE64(secret) + seed64), + input_hi ^ (XXH_readLE64(secret+8) - seed64) + ); + } +} + +/* For mid range keys, XXH3 uses a Mum-hash variant. */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(16 < len && len <= 128); + + { xxh_u64 acc = len * XXH_PRIME64_1; + if (len > 32) { + if (len > 64) { + if (len > 96) { + acc += XXH3_mix16B(input+48, secret+96, seed); + acc += XXH3_mix16B(input+len-64, secret+112, seed); + } + acc += XXH3_mix16B(input+32, secret+64, seed); + acc += XXH3_mix16B(input+len-48, secret+80, seed); + } + acc += XXH3_mix16B(input+16, secret+32, seed); + acc += XXH3_mix16B(input+len-32, secret+48, seed); + } + acc += XXH3_mix16B(input+0, secret+0, seed); + acc += XXH3_mix16B(input+len-16, secret+16, seed); + + return XXH3_avalanche(acc); + } +} + +#define XXH3_MIDSIZE_MAX 240 + +XXH_NO_INLINE XXH64_hash_t +XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + + #define XXH3_MIDSIZE_STARTOFFSET 3 + #define XXH3_MIDSIZE_LASTOFFSET 17 + + { xxh_u64 acc = len * XXH_PRIME64_1; + int const nbRounds = (int)len / 16; + int i; + for (i=0; i<8; i++) { + acc += XXH3_mix16B(input+(16*i), secret+(16*i), seed); + } + acc = XXH3_avalanche(acc); + XXH_ASSERT(nbRounds >= 8); +#if defined(__clang__) /* Clang */ \ + && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */ + /* + * UGLY HACK: + * Clang for ARMv7-A tries to vectorize this loop, similar to GCC x86. + * In everywhere else, it uses scalar code. + * + * For 64->128-bit multiplies, even if the NEON was 100% optimal, it + * would still be slower than UMAAL (see XXH_mult64to128). + * + * Unfortunately, Clang doesn't handle the long multiplies properly and + * converts them to the nonexistent "vmulq_u64" intrinsic, which is then + * scalarized into an ugly mess of VMOV.32 instructions. + * + * This mess is difficult to avoid without turning autovectorization + * off completely, but they are usually relatively minor and/or not + * worth it to fix. + * + * This loop is the easiest to fix, as unlike XXH32, this pragma + * _actually works_ because it is a loop vectorization instead of an + * SLP vectorization. + */ + #pragma clang loop vectorize(disable) +#endif + for (i=8 ; i < nbRounds; i++) { + acc += XXH3_mix16B(input+(16*i), secret+(16*(i-8)) + XXH3_MIDSIZE_STARTOFFSET, seed); + } + /* last bytes */ + acc += XXH3_mix16B(input + len - 16, secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET, seed); + return XXH3_avalanche(acc); + } +} + + +/* ======= Long Keys ======= */ + +#define XXH_STRIPE_LEN 64 +#define XXH_SECRET_CONSUME_RATE 8 /* nb of secret bytes consumed at each accumulation */ +#define XXH_ACC_NB (XXH_STRIPE_LEN / sizeof(xxh_u64)) + +#ifdef XXH_OLD_NAMES +# define STRIPE_LEN XXH_STRIPE_LEN +# define ACC_NB XXH_ACC_NB +#endif + +XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64) +{ + if (!XXH_CPU_LITTLE_ENDIAN) v64 = XXH_swap64(v64); + XXH_memcpy(dst, &v64, sizeof(v64)); +} + +/* Several intrinsic functions below are supposed to accept __int64 as argument, + * as documented in https://software.intel.com/sites/landingpage/IntrinsicsGuide/ . + * However, several environments do not define __int64 type, + * requiring a workaround. + */ +#if !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) + typedef int64_t xxh_i64; +#else + /* the following type must have a width of 64-bit */ + typedef long long xxh_i64; +#endif + + +/* + * XXH3_accumulate_512 is the tightest loop for long inputs, and it is the most optimized. + * + * It is a hardened version of UMAC, based off of FARSH's implementation. + * + * This was chosen because it adapts quite well to 32-bit, 64-bit, and SIMD + * implementations, and it is ridiculously fast. + * + * We harden it by mixing the original input to the accumulators as well as the product. + * + * This means that in the (relatively likely) case of a multiply by zero, the + * original input is preserved. + * + * On 128-bit inputs, we swap 64-bit pairs when we add the input to improve + * cross-pollination, as otherwise the upper and lower halves would be + * essentially independent. + * + * This doesn't matter on 64-bit hashes since they all get merged together in + * the end, so we skip the extra step. + * + * Both XXH3_64bits and XXH3_128bits use this subroutine. + */ + +#if (XXH_VECTOR == XXH_AVX512) \ + || (defined(XXH_DISPATCH_AVX512) && XXH_DISPATCH_AVX512 != 0) + +#ifndef XXH_TARGET_AVX512 +# define XXH_TARGET_AVX512 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_accumulate_512_avx512(void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + __m512i* const xacc = (__m512i *) acc; + XXH_ASSERT((((size_t)acc) & 63) == 0); + XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); + + { + /* data_vec = input[0]; */ + __m512i const data_vec = _mm512_loadu_si512 (input); + /* key_vec = secret[0]; */ + __m512i const key_vec = _mm512_loadu_si512 (secret); + /* data_key = data_vec ^ key_vec; */ + __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m512i const data_key_lo = _mm512_shuffle_epi32 (data_key, (_MM_PERM_ENUM)_MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m512i const product = _mm512_mul_epu32 (data_key, data_key_lo); + /* xacc[0] += swap(data_vec); */ + __m512i const data_swap = _mm512_shuffle_epi32(data_vec, (_MM_PERM_ENUM)_MM_SHUFFLE(1, 0, 3, 2)); + __m512i const sum = _mm512_add_epi64(*xacc, data_swap); + /* xacc[0] += product; */ + *xacc = _mm512_add_epi64(product, sum); + } +} + +/* + * XXH3_scrambleAcc: Scrambles the accumulators to improve mixing. + * + * Multiplication isn't perfect, as explained by Google in HighwayHash: + * + * // Multiplication mixes/scrambles bytes 0-7 of the 64-bit result to + * // varying degrees. In descending order of goodness, bytes + * // 3 4 2 5 1 6 0 7 have quality 228 224 164 160 100 96 36 32. + * // As expected, the upper and lower bytes are much worse. + * + * Source: https://github.com/google/highwayhash/blob/0aaf66b/highwayhash/hh_avx2.h#L291 + * + * Since our algorithm uses a pseudorandom secret to add some variance into the + * mix, we don't need to (or want to) mix as often or as much as HighwayHash does. + * + * This isn't as tight as XXH3_accumulate, but still written in SIMD to avoid + * extraction. + * + * Both XXH3_64bits and XXH3_128bits use this subroutine. + */ + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_scrambleAcc_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 63) == 0); + XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); + { __m512i* const xacc = (__m512i*) acc; + const __m512i prime32 = _mm512_set1_epi32((int)XXH_PRIME32_1); + + /* xacc[0] ^= (xacc[0] >> 47) */ + __m512i const acc_vec = *xacc; + __m512i const shifted = _mm512_srli_epi64 (acc_vec, 47); + __m512i const data_vec = _mm512_xor_si512 (acc_vec, shifted); + /* xacc[0] ^= secret; */ + __m512i const key_vec = _mm512_loadu_si512 (secret); + __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec); + + /* xacc[0] *= XXH_PRIME32_1; */ + __m512i const data_key_hi = _mm512_shuffle_epi32 (data_key, (_MM_PERM_ENUM)_MM_SHUFFLE(0, 3, 0, 1)); + __m512i const prod_lo = _mm512_mul_epu32 (data_key, prime32); + __m512i const prod_hi = _mm512_mul_epu32 (data_key_hi, prime32); + *xacc = _mm512_add_epi64(prod_lo, _mm512_slli_epi64(prod_hi, 32)); + } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 63) == 0); + XXH_STATIC_ASSERT(XXH_SEC_ALIGN == 64); + XXH_ASSERT(((size_t)customSecret & 63) == 0); + (void)(&XXH_writeLE64); + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m512i); + __m512i const seed = _mm512_mask_set1_epi64(_mm512_set1_epi64((xxh_i64)seed64), 0xAA, (xxh_i64)(0U - seed64)); + + const __m512i* const src = (const __m512i*) ((const void*) XXH3_kSecret); + __m512i* const dest = ( __m512i*) customSecret; + int i; + XXH_ASSERT(((size_t)src & 63) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 63) == 0); + for (i=0; i < nbRounds; ++i) { + /* GCC has a bug, _mm512_stream_load_si512 accepts 'void*', not 'void const*', + * this will warn "discards 'const' qualifier". */ + union { + const __m512i* cp; + void* p; + } remote_const_void; + remote_const_void.cp = src + i; + dest[i] = _mm512_add_epi64(_mm512_stream_load_si512(remote_const_void.p), seed); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_AVX2) \ + || (defined(XXH_DISPATCH_AVX2) && XXH_DISPATCH_AVX2 != 0) + +#ifndef XXH_TARGET_AVX2 +# define XXH_TARGET_AVX2 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void +XXH3_accumulate_512_avx2( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { __m256i* const xacc = (__m256i *) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xinput = (const __m256i *) input; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xsecret = (const __m256i *) secret; + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) { + /* data_vec = xinput[i]; */ + __m256i const data_vec = _mm256_loadu_si256 (xinput+i); + /* key_vec = xsecret[i]; */ + __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); + /* data_key = data_vec ^ key_vec; */ + __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m256i const data_key_lo = _mm256_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m256i const product = _mm256_mul_epu32 (data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m256i const data_swap = _mm256_shuffle_epi32(data_vec, _MM_SHUFFLE(1, 0, 3, 2)); + __m256i const sum = _mm256_add_epi64(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = _mm256_add_epi64(product, sum); + } } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void +XXH3_scrambleAcc_avx2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { __m256i* const xacc = (__m256i*) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xsecret = (const __m256i *) secret; + const __m256i prime32 = _mm256_set1_epi32((int)XXH_PRIME32_1); + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m256i const acc_vec = xacc[i]; + __m256i const shifted = _mm256_srli_epi64 (acc_vec, 47); + __m256i const data_vec = _mm256_xor_si256 (acc_vec, shifted); + /* xacc[i] ^= xsecret; */ + __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); + __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + __m256i const data_key_hi = _mm256_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + __m256i const prod_lo = _mm256_mul_epu32 (data_key, prime32); + __m256i const prod_hi = _mm256_mul_epu32 (data_key_hi, prime32); + xacc[i] = _mm256_add_epi64(prod_lo, _mm256_slli_epi64(prod_hi, 32)); + } + } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 31) == 0); + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE / sizeof(__m256i)) == 6); + XXH_STATIC_ASSERT(XXH_SEC_ALIGN <= 64); + (void)(&XXH_writeLE64); + XXH_PREFETCH(customSecret); + { __m256i const seed = _mm256_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64, (xxh_i64)(0U - seed64), (xxh_i64)seed64); + + const __m256i* const src = (const __m256i*) ((const void*) XXH3_kSecret); + __m256i* dest = ( __m256i*) customSecret; + +# if defined(__GNUC__) || defined(__clang__) + /* + * On GCC & Clang, marking 'dest' as modified will cause the compiler: + * - do not extract the secret from sse registers in the internal loop + * - use less common registers, and avoid pushing these reg into stack + */ + XXH_COMPILER_GUARD(dest); +# endif + XXH_ASSERT(((size_t)src & 31) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 31) == 0); + + /* GCC -O2 need unroll loop manually */ + dest[0] = _mm256_add_epi64(_mm256_stream_load_si256(src+0), seed); + dest[1] = _mm256_add_epi64(_mm256_stream_load_si256(src+1), seed); + dest[2] = _mm256_add_epi64(_mm256_stream_load_si256(src+2), seed); + dest[3] = _mm256_add_epi64(_mm256_stream_load_si256(src+3), seed); + dest[4] = _mm256_add_epi64(_mm256_stream_load_si256(src+4), seed); + dest[5] = _mm256_add_epi64(_mm256_stream_load_si256(src+5), seed); + } +} + +#endif + +/* x86dispatch always generates SSE2 */ +#if (XXH_VECTOR == XXH_SSE2) || defined(XXH_X86DISPATCH) + +#ifndef XXH_TARGET_SSE2 +# define XXH_TARGET_SSE2 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void +XXH3_accumulate_512_sse2( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + /* SSE2 is just a half-scale version of the AVX2 version. */ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { __m128i* const xacc = (__m128i *) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xinput = (const __m128i *) input; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xsecret = (const __m128i *) secret; + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) { + /* data_vec = xinput[i]; */ + __m128i const data_vec = _mm_loadu_si128 (xinput+i); + /* key_vec = xsecret[i]; */ + __m128i const key_vec = _mm_loadu_si128 (xsecret+i); + /* data_key = data_vec ^ key_vec; */ + __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m128i const data_key_lo = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m128i const product = _mm_mul_epu32 (data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m128i const data_swap = _mm_shuffle_epi32(data_vec, _MM_SHUFFLE(1,0,3,2)); + __m128i const sum = _mm_add_epi64(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = _mm_add_epi64(product, sum); + } } +} + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void +XXH3_scrambleAcc_sse2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { __m128i* const xacc = (__m128i*) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xsecret = (const __m128i *) secret; + const __m128i prime32 = _mm_set1_epi32((int)XXH_PRIME32_1); + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m128i const acc_vec = xacc[i]; + __m128i const shifted = _mm_srli_epi64 (acc_vec, 47); + __m128i const data_vec = _mm_xor_si128 (acc_vec, shifted); + /* xacc[i] ^= xsecret[i]; */ + __m128i const key_vec = _mm_loadu_si128 (xsecret+i); + __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + __m128i const data_key_hi = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + __m128i const prod_lo = _mm_mul_epu32 (data_key, prime32); + __m128i const prod_hi = _mm_mul_epu32 (data_key_hi, prime32); + xacc[i] = _mm_add_epi64(prod_lo, _mm_slli_epi64(prod_hi, 32)); + } + } +} + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); + (void)(&XXH_writeLE64); + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m128i); + +# if defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER < 1900 + /* MSVC 32bit mode does not support _mm_set_epi64x before 2015 */ + XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, (xxh_i64)(0U - seed64) }; + __m128i const seed = _mm_load_si128((__m128i const*)seed64x2); +# else + __m128i const seed = _mm_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64); +# endif + int i; + + const void* const src16 = XXH3_kSecret; + __m128i* dst16 = (__m128i*) customSecret; +# if defined(__GNUC__) || defined(__clang__) + /* + * On GCC & Clang, marking 'dest' as modified will cause the compiler: + * - do not extract the secret from sse registers in the internal loop + * - use less common registers, and avoid pushing these reg into stack + */ + XXH_COMPILER_GUARD(dst16); +# endif + XXH_ASSERT(((size_t)src16 & 15) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dst16 & 15) == 0); + + for (i=0; i < nbRounds; ++i) { + dst16[i] = _mm_add_epi64(_mm_load_si128((const __m128i *)src16+i), seed); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_NEON) + +/* forward declarations for the scalar routines */ +XXH_FORCE_INLINE void +XXH3_scalarRound(void* XXH_RESTRICT acc, void const* XXH_RESTRICT input, + void const* XXH_RESTRICT secret, size_t lane); + +XXH_FORCE_INLINE void +XXH3_scalarScrambleRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT secret, size_t lane); + +/*! + * @internal + * @brief The bulk processing loop for NEON. + * + * The NEON code path is actually partially scalar when running on AArch64. This + * is to optimize the pipelining and can have up to 15% speedup depending on the + * CPU, and it also mitigates some GCC codegen issues. + * + * @see XXH3_NEON_LANES for configuring this and details about this optimization. + */ +XXH_FORCE_INLINE void +XXH3_accumulate_512_neon( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + XXH_STATIC_ASSERT(XXH3_NEON_LANES > 0 && XXH3_NEON_LANES <= XXH_ACC_NB && XXH3_NEON_LANES % 2 == 0); + { + uint64x2_t* const xacc = (uint64x2_t *) acc; + /* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */ + uint8_t const* const xinput = (const uint8_t *) input; + uint8_t const* const xsecret = (const uint8_t *) secret; + + size_t i; + /* NEON for the first few lanes (these loops are normally interleaved) */ + for (i=0; i < XXH3_NEON_LANES / 2; i++) { + /* data_vec = xinput[i]; */ + uint8x16_t data_vec = vld1q_u8(xinput + (i * 16)); + /* key_vec = xsecret[i]; */ + uint8x16_t key_vec = vld1q_u8(xsecret + (i * 16)); + uint64x2_t data_key; + uint32x2_t data_key_lo, data_key_hi; + /* xacc[i] += swap(data_vec); */ + uint64x2_t const data64 = vreinterpretq_u64_u8(data_vec); + uint64x2_t const swapped = vextq_u64(data64, data64, 1); + xacc[i] = vaddq_u64 (xacc[i], swapped); + /* data_key = data_vec ^ key_vec; */ + data_key = vreinterpretq_u64_u8(veorq_u8(data_vec, key_vec)); + /* data_key_lo = (uint32x2_t) (data_key & 0xFFFFFFFF); + * data_key_hi = (uint32x2_t) (data_key >> 32); + * data_key = UNDEFINED; */ + XXH_SPLIT_IN_PLACE(data_key, data_key_lo, data_key_hi); + /* xacc[i] += (uint64x2_t) data_key_lo * (uint64x2_t) data_key_hi; */ + xacc[i] = vmlal_u32 (xacc[i], data_key_lo, data_key_hi); + + } + /* Scalar for the remainder. This may be a zero iteration loop. */ + for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) { + XXH3_scalarRound(acc, input, secret, i); + } + } +} + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + + { uint64x2_t* xacc = (uint64x2_t*) acc; + uint8_t const* xsecret = (uint8_t const*) secret; + uint32x2_t prime = vdup_n_u32 (XXH_PRIME32_1); + + size_t i; + /* NEON for the first few lanes (these loops are normally interleaved) */ + for (i=0; i < XXH3_NEON_LANES / 2; i++) { + /* xacc[i] ^= (xacc[i] >> 47); */ + uint64x2_t acc_vec = xacc[i]; + uint64x2_t shifted = vshrq_n_u64 (acc_vec, 47); + uint64x2_t data_vec = veorq_u64 (acc_vec, shifted); + + /* xacc[i] ^= xsecret[i]; */ + uint8x16_t key_vec = vld1q_u8 (xsecret + (i * 16)); + uint64x2_t data_key = veorq_u64 (data_vec, vreinterpretq_u64_u8(key_vec)); + + /* xacc[i] *= XXH_PRIME32_1 */ + uint32x2_t data_key_lo, data_key_hi; + /* data_key_lo = (uint32x2_t) (xacc[i] & 0xFFFFFFFF); + * data_key_hi = (uint32x2_t) (xacc[i] >> 32); + * xacc[i] = UNDEFINED; */ + XXH_SPLIT_IN_PLACE(data_key, data_key_lo, data_key_hi); + { /* + * prod_hi = (data_key >> 32) * XXH_PRIME32_1; + * + * Avoid vmul_u32 + vshll_n_u32 since Clang 6 and 7 will + * incorrectly "optimize" this: + * tmp = vmul_u32(vmovn_u64(a), vmovn_u64(b)); + * shifted = vshll_n_u32(tmp, 32); + * to this: + * tmp = "vmulq_u64"(a, b); // no such thing! + * shifted = vshlq_n_u64(tmp, 32); + * + * However, unlike SSE, Clang lacks a 64-bit multiply routine + * for NEON, and it scalarizes two 64-bit multiplies instead. + * + * vmull_u32 has the same timing as vmul_u32, and it avoids + * this bug completely. + * See https://bugs.llvm.org/show_bug.cgi?id=39967 + */ + uint64x2_t prod_hi = vmull_u32 (data_key_hi, prime); + /* xacc[i] = prod_hi << 32; */ + xacc[i] = vshlq_n_u64(prod_hi, 32); + /* xacc[i] += (prod_hi & 0xFFFFFFFF) * XXH_PRIME32_1; */ + xacc[i] = vmlal_u32(xacc[i], data_key_lo, prime); + } + } + /* Scalar for the remainder. This may be a zero iteration loop. */ + for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) { + XXH3_scalarScrambleRound(acc, secret, i); + } + } +} + +#endif + +#if (XXH_VECTOR == XXH_VSX) + +XXH_FORCE_INLINE void +XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + /* presumed aligned */ + unsigned int* const xacc = (unsigned int*) acc; + xxh_u64x2 const* const xinput = (xxh_u64x2 const*) input; /* no alignment restriction */ + xxh_u64x2 const* const xsecret = (xxh_u64x2 const*) secret; /* no alignment restriction */ + xxh_u64x2 const v32 = { 32, 32 }; + size_t i; + for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) { + /* data_vec = xinput[i]; */ + xxh_u64x2 const data_vec = XXH_vec_loadu(xinput + i); + /* key_vec = xsecret[i]; */ + xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + i); + xxh_u64x2 const data_key = data_vec ^ key_vec; + /* shuffled = (data_key << 32) | (data_key >> 32); */ + xxh_u32x4 const shuffled = (xxh_u32x4)vec_rl(data_key, v32); + /* product = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)shuffled & 0xFFFFFFFF); */ + xxh_u64x2 const product = XXH_vec_mulo((xxh_u32x4)data_key, shuffled); + /* acc_vec = xacc[i]; */ + xxh_u64x2 acc_vec = (xxh_u64x2)vec_xl(0, xacc + 4 * i); + acc_vec += product; + + /* swap high and low halves */ +#ifdef __s390x__ + acc_vec += vec_permi(data_vec, data_vec, 2); +#else + acc_vec += vec_xxpermdi(data_vec, data_vec, 2); +#endif + /* xacc[i] = acc_vec; */ + vec_xst((xxh_u32x4)acc_vec, 0, xacc + 4 * i); + } +} + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_vsx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + + { xxh_u64x2* const xacc = (xxh_u64x2*) acc; + const xxh_u64x2* const xsecret = (const xxh_u64x2*) secret; + /* constants */ + xxh_u64x2 const v32 = { 32, 32 }; + xxh_u64x2 const v47 = { 47, 47 }; + xxh_u32x4 const prime = { XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1 }; + size_t i; + for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) { + /* xacc[i] ^= (xacc[i] >> 47); */ + xxh_u64x2 const acc_vec = xacc[i]; + xxh_u64x2 const data_vec = acc_vec ^ (acc_vec >> v47); + + /* xacc[i] ^= xsecret[i]; */ + xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + i); + xxh_u64x2 const data_key = data_vec ^ key_vec; + + /* xacc[i] *= XXH_PRIME32_1 */ + /* prod_lo = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)prime & 0xFFFFFFFF); */ + xxh_u64x2 const prod_even = XXH_vec_mule((xxh_u32x4)data_key, prime); + /* prod_hi = ((xxh_u64x2)data_key >> 32) * ((xxh_u64x2)prime >> 32); */ + xxh_u64x2 const prod_odd = XXH_vec_mulo((xxh_u32x4)data_key, prime); + xacc[i] = prod_odd + (prod_even << v32); + } } +} + +#endif + +/* scalar variants - universal */ + +/*! + * @internal + * @brief Scalar round for @ref XXH3_accumulate_512_scalar(). + * + * This is extracted to its own function because the NEON path uses a combination + * of NEON and scalar. + */ +XXH_FORCE_INLINE void +XXH3_scalarRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT input, + void const* XXH_RESTRICT secret, + size_t lane) +{ + xxh_u64* xacc = (xxh_u64*) acc; + xxh_u8 const* xinput = (xxh_u8 const*) input; + xxh_u8 const* xsecret = (xxh_u8 const*) secret; + XXH_ASSERT(lane < XXH_ACC_NB); + XXH_ASSERT(((size_t)acc & (XXH_ACC_ALIGN-1)) == 0); + { + xxh_u64 const data_val = XXH_readLE64(xinput + lane * 8); + xxh_u64 const data_key = data_val ^ XXH_readLE64(xsecret + lane * 8); + xacc[lane ^ 1] += data_val; /* swap adjacent lanes */ + xacc[lane] += XXH_mult32to64(data_key & 0xFFFFFFFF, data_key >> 32); + } +} + +/*! + * @internal + * @brief Processes a 64 byte block of data using the scalar path. + */ +XXH_FORCE_INLINE void +XXH3_accumulate_512_scalar(void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + size_t i; + for (i=0; i < XXH_ACC_NB; i++) { + XXH3_scalarRound(acc, input, secret, i); + } +} + +/*! + * @internal + * @brief Scalar scramble step for @ref XXH3_scrambleAcc_scalar(). + * + * This is extracted to its own function because the NEON path uses a combination + * of NEON and scalar. + */ +XXH_FORCE_INLINE void +XXH3_scalarScrambleRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT secret, + size_t lane) +{ + xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ + const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */ + XXH_ASSERT((((size_t)acc) & (XXH_ACC_ALIGN-1)) == 0); + XXH_ASSERT(lane < XXH_ACC_NB); + { + xxh_u64 const key64 = XXH_readLE64(xsecret + lane * 8); + xxh_u64 acc64 = xacc[lane]; + acc64 = XXH_xorshift64(acc64, 47); + acc64 ^= key64; + acc64 *= XXH_PRIME32_1; + xacc[lane] = acc64; + } +} + +/*! + * @internal + * @brief Scrambles the accumulators after a large chunk has been read + */ +XXH_FORCE_INLINE void +XXH3_scrambleAcc_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + size_t i; + for (i=0; i < XXH_ACC_NB; i++) { + XXH3_scalarScrambleRound(acc, secret, i); + } +} + +XXH_FORCE_INLINE void +XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + /* + * We need a separate pointer for the hack below, + * which requires a non-const pointer. + * Any decent compiler will optimize this out otherwise. + */ + const xxh_u8* kSecretPtr = XXH3_kSecret; + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); + +#if defined(__clang__) && defined(__aarch64__) + /* + * UGLY HACK: + * Clang generates a bunch of MOV/MOVK pairs for aarch64, and they are + * placed sequentially, in order, at the top of the unrolled loop. + * + * While MOVK is great for generating constants (2 cycles for a 64-bit + * constant compared to 4 cycles for LDR), it fights for bandwidth with + * the arithmetic instructions. + * + * I L S + * MOVK + * MOVK + * MOVK + * MOVK + * ADD + * SUB STR + * STR + * By forcing loads from memory (as the asm line causes Clang to assume + * that XXH3_kSecretPtr has been changed), the pipelines are used more + * efficiently: + * I L S + * LDR + * ADD LDR + * SUB STR + * STR + * + * See XXH3_NEON_LANES for details on the pipsline. + * + * XXH3_64bits_withSeed, len == 256, Snapdragon 835 + * without hack: 2654.4 MB/s + * with hack: 3202.9 MB/s + */ + XXH_COMPILER_GUARD(kSecretPtr); +#endif + /* + * Note: in debug mode, this overrides the asm optimization + * and Clang will emit MOVK chains again. + */ + XXH_ASSERT(kSecretPtr == XXH3_kSecret); + + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / 16; + int i; + for (i=0; i < nbRounds; i++) { + /* + * The asm hack causes Clang to assume that kSecretPtr aliases with + * customSecret, and on aarch64, this prevented LDP from merging two + * loads together for free. Putting the loads together before the stores + * properly generates LDP. + */ + xxh_u64 lo = XXH_readLE64(kSecretPtr + 16*i) + seed64; + xxh_u64 hi = XXH_readLE64(kSecretPtr + 16*i + 8) - seed64; + XXH_writeLE64((xxh_u8*)customSecret + 16*i, lo); + XXH_writeLE64((xxh_u8*)customSecret + 16*i + 8, hi); + } } +} + + +typedef void (*XXH3_f_accumulate_512)(void* XXH_RESTRICT, const void*, const void*); +typedef void (*XXH3_f_scrambleAcc)(void* XXH_RESTRICT, const void*); +typedef void (*XXH3_f_initCustomSecret)(void* XXH_RESTRICT, xxh_u64); + + +#if (XXH_VECTOR == XXH_AVX512) + +#define XXH3_accumulate_512 XXH3_accumulate_512_avx512 +#define XXH3_scrambleAcc XXH3_scrambleAcc_avx512 +#define XXH3_initCustomSecret XXH3_initCustomSecret_avx512 + +#elif (XXH_VECTOR == XXH_AVX2) + +#define XXH3_accumulate_512 XXH3_accumulate_512_avx2 +#define XXH3_scrambleAcc XXH3_scrambleAcc_avx2 +#define XXH3_initCustomSecret XXH3_initCustomSecret_avx2 + +#elif (XXH_VECTOR == XXH_SSE2) + +#define XXH3_accumulate_512 XXH3_accumulate_512_sse2 +#define XXH3_scrambleAcc XXH3_scrambleAcc_sse2 +#define XXH3_initCustomSecret XXH3_initCustomSecret_sse2 + +#elif (XXH_VECTOR == XXH_NEON) + +#define XXH3_accumulate_512 XXH3_accumulate_512_neon +#define XXH3_scrambleAcc XXH3_scrambleAcc_neon +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#elif (XXH_VECTOR == XXH_VSX) + +#define XXH3_accumulate_512 XXH3_accumulate_512_vsx +#define XXH3_scrambleAcc XXH3_scrambleAcc_vsx +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#else /* scalar */ + +#define XXH3_accumulate_512 XXH3_accumulate_512_scalar +#define XXH3_scrambleAcc XXH3_scrambleAcc_scalar +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#endif + + + +#ifndef XXH_PREFETCH_DIST +# ifdef __clang__ +# define XXH_PREFETCH_DIST 320 +# else +# if (XXH_VECTOR == XXH_AVX512) +# define XXH_PREFETCH_DIST 512 +# else +# define XXH_PREFETCH_DIST 384 +# endif +# endif /* __clang__ */ +#endif /* XXH_PREFETCH_DIST */ + +/* + * XXH3_accumulate() + * Loops over XXH3_accumulate_512(). + * Assumption: nbStripes will not overflow the secret size + */ +XXH_FORCE_INLINE void +XXH3_accumulate( xxh_u64* XXH_RESTRICT acc, + const xxh_u8* XXH_RESTRICT input, + const xxh_u8* XXH_RESTRICT secret, + size_t nbStripes, + XXH3_f_accumulate_512 f_acc512) +{ + size_t n; + for (n = 0; n < nbStripes; n++ ) { + const xxh_u8* const in = input + n*XXH_STRIPE_LEN; + XXH_PREFETCH(in + XXH_PREFETCH_DIST); + f_acc512(acc, + in, + secret + n*XXH_SECRET_CONSUME_RATE); + } +} + +XXH_FORCE_INLINE void +XXH3_hashLong_internal_loop(xxh_u64* XXH_RESTRICT acc, + const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + size_t const nbStripesPerBlock = (secretSize - XXH_STRIPE_LEN) / XXH_SECRET_CONSUME_RATE; + size_t const block_len = XXH_STRIPE_LEN * nbStripesPerBlock; + size_t const nb_blocks = (len - 1) / block_len; + + size_t n; + + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + + for (n = 0; n < nb_blocks; n++) { + XXH3_accumulate(acc, input + n*block_len, secret, nbStripesPerBlock, f_acc512); + f_scramble(acc, secret + secretSize - XXH_STRIPE_LEN); + } + + /* last partial block */ + XXH_ASSERT(len > XXH_STRIPE_LEN); + { size_t const nbStripes = ((len - 1) - (block_len * nb_blocks)) / XXH_STRIPE_LEN; + XXH_ASSERT(nbStripes <= (secretSize / XXH_SECRET_CONSUME_RATE)); + XXH3_accumulate(acc, input + nb_blocks*block_len, secret, nbStripes, f_acc512); + + /* last stripe */ + { const xxh_u8* const p = input + len - XXH_STRIPE_LEN; +#define XXH_SECRET_LASTACC_START 7 /* not aligned on 8, last secret is different from acc & scrambler */ + f_acc512(acc, p, secret + secretSize - XXH_STRIPE_LEN - XXH_SECRET_LASTACC_START); + } } +} + +XXH_FORCE_INLINE xxh_u64 +XXH3_mix2Accs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret) +{ + return XXH3_mul128_fold64( + acc[0] ^ XXH_readLE64(secret), + acc[1] ^ XXH_readLE64(secret+8) ); +} + +static XXH64_hash_t +XXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret, xxh_u64 start) +{ + xxh_u64 result64 = start; + size_t i = 0; + + for (i = 0; i < 4; i++) { + result64 += XXH3_mix2Accs(acc+2*i, secret + 16*i); +#if defined(__clang__) /* Clang */ \ + && (defined(__arm__) || defined(__thumb__)) /* ARMv7 */ \ + && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */ + /* + * UGLY HACK: + * Prevent autovectorization on Clang ARMv7-a. Exact same problem as + * the one in XXH3_len_129to240_64b. Speeds up shorter keys > 240b. + * XXH3_64bits, len == 256, Snapdragon 835: + * without hack: 2063.7 MB/s + * with hack: 2560.7 MB/s + */ + XXH_COMPILER_GUARD(result64); +#endif + } + + return XXH3_avalanche(result64); +} + +#define XXH3_INIT_ACC { XXH_PRIME32_3, XXH_PRIME64_1, XXH_PRIME64_2, XXH_PRIME64_3, \ + XXH_PRIME64_4, XXH_PRIME32_2, XXH_PRIME64_5, XXH_PRIME32_1 } + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_internal(const void* XXH_RESTRICT input, size_t len, + const void* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC; + + XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, f_acc512, f_scramble); + + /* converge into final hash */ + XXH_STATIC_ASSERT(sizeof(acc) == 64); + /* do not align on 8, so that the secret is different from the accumulator */ +#define XXH_SECRET_MERGEACCS_START 11 + XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + return XXH3_mergeAccs(acc, (const xxh_u8*)secret + XXH_SECRET_MERGEACCS_START, (xxh_u64)len * XXH_PRIME64_1); +} + +/* + * It's important for performance to transmit secret's size (when it's static) + * so that the compiler can properly optimize the vectorized loop. + * This makes a big performance difference for "medium" keys (<1 KB) when using AVX instruction set. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + return XXH3_hashLong_64b_internal(input, len, secret, secretLen, XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/* + * It's preferable for performance that XXH3_hashLong is not inlined, + * as it results in a smaller function for small data, easier to the instruction cache. + * Note that inside this no_inline function, we do inline the internal loop, + * and provide a statically defined secret size to allow optimization of vector loop. + */ +XXH_NO_INLINE XXH64_hash_t +XXH3_hashLong_64b_default(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + return XXH3_hashLong_64b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/* + * XXH3_hashLong_64b_withSeed(): + * Generate a custom key based on alteration of default XXH3_kSecret with the seed, + * and then use this key for long mode hashing. + * + * This operation is decently fast but nonetheless costs a little bit of time. + * Try to avoid it whenever possible (typically when seed==0). + * + * It's important for performance that XXH3_hashLong is not inlined. Not sure + * why (uop cache maybe?), but the difference is large and easily measurable. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSeed_internal(const void* input, size_t len, + XXH64_hash_t seed, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble, + XXH3_f_initCustomSecret f_initSec) +{ + if (seed == 0) + return XXH3_hashLong_64b_internal(input, len, + XXH3_kSecret, sizeof(XXH3_kSecret), + f_acc512, f_scramble); + { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + f_initSec(secret, seed); + return XXH3_hashLong_64b_internal(input, len, secret, sizeof(secret), + f_acc512, f_scramble); + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSeed(const void* input, size_t len, + XXH64_hash_t seed, const xxh_u8* secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + return XXH3_hashLong_64b_withSeed_internal(input, len, seed, + XXH3_accumulate_512, XXH3_scrambleAcc, XXH3_initCustomSecret); +} + + +typedef XXH64_hash_t (*XXH3_hashLong64_f)(const void* XXH_RESTRICT, size_t, + XXH64_hash_t, const xxh_u8* XXH_RESTRICT, size_t); + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_64bits_internal(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen, + XXH3_hashLong64_f f_hashLong) +{ + XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN); + /* + * If an action is to be taken if `secretLen` condition is not respected, + * it should be done here. + * For now, it's a contract pre-condition. + * Adding a check and a branch here would cost performance at every hash. + * Also, note that function signature doesn't offer room to return an error. + */ + if (len <= 16) + return XXH3_len_0to16_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64); + if (len <= 128) + return XXH3_len_17to128_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_len_129to240_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + return f_hashLong(input, len, seed64, (const xxh_u8*)secret, secretLen); +} + + +/* === Public entry point === */ + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* input, size_t len) +{ + return XXH3_64bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_default); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) +{ + return XXH3_64bits_internal(input, len, 0, secret, secretSize, XXH3_hashLong_64b_withSecret); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed); +} + +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_64b_withSecret(input, len, seed, (const xxh_u8*)secret, secretSize); +} + + +/* === XXH3 streaming === */ + +/* + * Malloc's a pointer that is always aligned to align. + * + * This must be freed with `XXH_alignedFree()`. + * + * malloc typically guarantees 16 byte alignment on 64-bit systems and 8 byte + * alignment on 32-bit. This isn't enough for the 32 byte aligned loads in AVX2 + * or on 32-bit, the 16 byte aligned loads in SSE2 and NEON. + * + * This underalignment previously caused a rather obvious crash which went + * completely unnoticed due to XXH3_createState() not actually being tested. + * Credit to RedSpah for noticing this bug. + * + * The alignment is done manually: Functions like posix_memalign or _mm_malloc + * are avoided: To maintain portability, we would have to write a fallback + * like this anyways, and besides, testing for the existence of library + * functions without relying on external build tools is impossible. + * + * The method is simple: Overallocate, manually align, and store the offset + * to the original behind the returned pointer. + * + * Align must be a power of 2 and 8 <= align <= 128. + */ +static void* XXH_alignedMalloc(size_t s, size_t align) +{ + XXH_ASSERT(align <= 128 && align >= 8); /* range check */ + XXH_ASSERT((align & (align-1)) == 0); /* power of 2 */ + XXH_ASSERT(s != 0 && s < (s + align)); /* empty/overflow */ + { /* Overallocate to make room for manual realignment and an offset byte */ + xxh_u8* base = (xxh_u8*)XXH_malloc(s + align); + if (base != NULL) { + /* + * Get the offset needed to align this pointer. + * + * Even if the returned pointer is aligned, there will always be + * at least one byte to store the offset to the original pointer. + */ + size_t offset = align - ((size_t)base & (align - 1)); /* base % align */ + /* Add the offset for the now-aligned pointer */ + xxh_u8* ptr = base + offset; + + XXH_ASSERT((size_t)ptr % align == 0); + + /* Store the offset immediately before the returned pointer. */ + ptr[-1] = (xxh_u8)offset; + return ptr; + } + return NULL; + } +} +/* + * Frees an aligned pointer allocated by XXH_alignedMalloc(). Don't pass + * normal malloc'd pointers, XXH_alignedMalloc has a specific data layout. + */ +static void XXH_alignedFree(void* p) +{ + if (p != NULL) { + xxh_u8* ptr = (xxh_u8*)p; + /* Get the offset byte we added in XXH_malloc. */ + xxh_u8 offset = ptr[-1]; + /* Free the original malloc'd pointer */ + xxh_u8* base = ptr - offset; + XXH_free(base); + } +} +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void) +{ + XXH3_state_t* const state = (XXH3_state_t*)XXH_alignedMalloc(sizeof(XXH3_state_t), 64); + if (state==NULL) return NULL; + XXH3_INITSTATE(state); + return state; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr) +{ + XXH_alignedFree(statePtr); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API void +XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state) +{ + XXH_memcpy(dst_state, src_state, sizeof(*dst_state)); +} + +static void +XXH3_reset_internal(XXH3_state_t* statePtr, + XXH64_hash_t seed, + const void* secret, size_t secretSize) +{ + size_t const initStart = offsetof(XXH3_state_t, bufferedSize); + size_t const initLength = offsetof(XXH3_state_t, nbStripesPerBlock) - initStart; + XXH_ASSERT(offsetof(XXH3_state_t, nbStripesPerBlock) > initStart); + XXH_ASSERT(statePtr != NULL); + /* set members from bufferedSize to nbStripesPerBlock (excluded) to 0 */ + memset((char*)statePtr + initStart, 0, initLength); + statePtr->acc[0] = XXH_PRIME32_3; + statePtr->acc[1] = XXH_PRIME64_1; + statePtr->acc[2] = XXH_PRIME64_2; + statePtr->acc[3] = XXH_PRIME64_3; + statePtr->acc[4] = XXH_PRIME64_4; + statePtr->acc[5] = XXH_PRIME32_2; + statePtr->acc[6] = XXH_PRIME64_5; + statePtr->acc[7] = XXH_PRIME32_1; + statePtr->seed = seed; + statePtr->useSeed = (seed != 0); + statePtr->extSecret = (const unsigned char*)secret; + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + statePtr->secretLimit = secretSize - XXH_STRIPE_LEN; + statePtr->nbStripesPerBlock = statePtr->secretLimit / XXH_SECRET_CONSUME_RATE; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset(XXH3_state_t* statePtr) +{ + if (statePtr == NULL) return XXH_ERROR; + XXH3_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) +{ + if (statePtr == NULL) return XXH_ERROR; + XXH3_reset_internal(statePtr, 0, secret, secretSize); + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) +{ + if (statePtr == NULL) return XXH_ERROR; + if (seed==0) return XXH3_64bits_reset(statePtr); + if ((seed != statePtr->seed) || (statePtr->extSecret != NULL)) + XXH3_initCustomSecret(statePtr->customSecret, seed); + XXH3_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed64) +{ + if (statePtr == NULL) return XXH_ERROR; + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + XXH3_reset_internal(statePtr, seed64, secret, secretSize); + statePtr->useSeed = 1; /* always, even if seed64==0 */ + return XXH_OK; +} + +/* Note : when XXH3_consumeStripes() is invoked, + * there must be a guarantee that at least one more byte must be consumed from input + * so that the function can blindly consume all stripes using the "normal" secret segment */ +XXH_FORCE_INLINE void +XXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc, + size_t* XXH_RESTRICT nbStripesSoFarPtr, size_t nbStripesPerBlock, + const xxh_u8* XXH_RESTRICT input, size_t nbStripes, + const xxh_u8* XXH_RESTRICT secret, size_t secretLimit, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ASSERT(nbStripes <= nbStripesPerBlock); /* can handle max 1 scramble per invocation */ + XXH_ASSERT(*nbStripesSoFarPtr < nbStripesPerBlock); + if (nbStripesPerBlock - *nbStripesSoFarPtr <= nbStripes) { + /* need a scrambling operation */ + size_t const nbStripesToEndofBlock = nbStripesPerBlock - *nbStripesSoFarPtr; + size_t const nbStripesAfterBlock = nbStripes - nbStripesToEndofBlock; + XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripesToEndofBlock, f_acc512); + f_scramble(acc, secret + secretLimit); + XXH3_accumulate(acc, input + nbStripesToEndofBlock * XXH_STRIPE_LEN, secret, nbStripesAfterBlock, f_acc512); + *nbStripesSoFarPtr = nbStripesAfterBlock; + } else { + XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripes, f_acc512); + *nbStripesSoFarPtr += nbStripes; + } +} + +#ifndef XXH3_STREAM_USE_STACK +# ifndef __clang__ /* clang doesn't need additional stack space */ +# define XXH3_STREAM_USE_STACK 1 +# endif +#endif +/* + * Both XXH3_64bits_update and XXH3_128bits_update use this routine. + */ +XXH_FORCE_INLINE XXH_errorcode +XXH3_update(XXH3_state_t* XXH_RESTRICT const state, + const xxh_u8* XXH_RESTRICT input, size_t len, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + XXH_ASSERT(state != NULL); + { const xxh_u8* const bEnd = input + len; + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* For some reason, gcc and MSVC seem to suffer greatly + * when operating accumulators directly into state. + * Operating into stack space seems to enable proper optimization. + * clang, on the other hand, doesn't seem to need this trick */ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[8]; memcpy(acc, state->acc, sizeof(acc)); +#else + xxh_u64* XXH_RESTRICT const acc = state->acc; +#endif + state->totalLen += len; + XXH_ASSERT(state->bufferedSize <= XXH3_INTERNALBUFFER_SIZE); + + /* small input : just fill in tmp buffer */ + if (state->bufferedSize + len <= XXH3_INTERNALBUFFER_SIZE) { + XXH_memcpy(state->buffer + state->bufferedSize, input, len); + state->bufferedSize += (XXH32_hash_t)len; + return XXH_OK; + } + + /* total input is now > XXH3_INTERNALBUFFER_SIZE */ + #define XXH3_INTERNALBUFFER_STRIPES (XXH3_INTERNALBUFFER_SIZE / XXH_STRIPE_LEN) + XXH_STATIC_ASSERT(XXH3_INTERNALBUFFER_SIZE % XXH_STRIPE_LEN == 0); /* clean multiple */ + + /* + * Internal buffer is partially filled (always, except at beginning) + * Complete it, then consume it. + */ + if (state->bufferedSize) { + size_t const loadSize = XXH3_INTERNALBUFFER_SIZE - state->bufferedSize; + XXH_memcpy(state->buffer + state->bufferedSize, input, loadSize); + input += loadSize; + XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + state->buffer, XXH3_INTERNALBUFFER_STRIPES, + secret, state->secretLimit, + f_acc512, f_scramble); + state->bufferedSize = 0; + } + XXH_ASSERT(input < bEnd); + + /* large input to consume : ingest per full block */ + if ((size_t)(bEnd - input) > state->nbStripesPerBlock * XXH_STRIPE_LEN) { + size_t nbStripes = (size_t)(bEnd - 1 - input) / XXH_STRIPE_LEN; + XXH_ASSERT(state->nbStripesPerBlock >= state->nbStripesSoFar); + /* join to current block's end */ + { size_t const nbStripesToEnd = state->nbStripesPerBlock - state->nbStripesSoFar; + XXH_ASSERT(nbStripesToEnd <= nbStripes); + XXH3_accumulate(acc, input, secret + state->nbStripesSoFar * XXH_SECRET_CONSUME_RATE, nbStripesToEnd, f_acc512); + f_scramble(acc, secret + state->secretLimit); + state->nbStripesSoFar = 0; + input += nbStripesToEnd * XXH_STRIPE_LEN; + nbStripes -= nbStripesToEnd; + } + /* consume per entire blocks */ + while(nbStripes >= state->nbStripesPerBlock) { + XXH3_accumulate(acc, input, secret, state->nbStripesPerBlock, f_acc512); + f_scramble(acc, secret + state->secretLimit); + input += state->nbStripesPerBlock * XXH_STRIPE_LEN; + nbStripes -= state->nbStripesPerBlock; + } + /* consume last partial block */ + XXH3_accumulate(acc, input, secret, nbStripes, f_acc512); + input += nbStripes * XXH_STRIPE_LEN; + XXH_ASSERT(input < bEnd); /* at least some bytes left */ + state->nbStripesSoFar = nbStripes; + /* buffer predecessor of last partial stripe */ + XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + XXH_ASSERT(bEnd - input <= XXH_STRIPE_LEN); + } else { + /* content to consume <= block size */ + /* Consume input by a multiple of internal buffer size */ + if (bEnd - input > XXH3_INTERNALBUFFER_SIZE) { + const xxh_u8* const limit = bEnd - XXH3_INTERNALBUFFER_SIZE; + do { + XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + input, XXH3_INTERNALBUFFER_STRIPES, + secret, state->secretLimit, + f_acc512, f_scramble); + input += XXH3_INTERNALBUFFER_SIZE; + } while (inputbuffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + } + } + + /* Some remaining input (always) : buffer it */ + XXH_ASSERT(input < bEnd); + XXH_ASSERT(bEnd - input <= XXH3_INTERNALBUFFER_SIZE); + XXH_ASSERT(state->bufferedSize == 0); + XXH_memcpy(state->buffer, input, (size_t)(bEnd-input)); + state->bufferedSize = (XXH32_hash_t)(bEnd-input); +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* save stack accumulators into state */ + memcpy(state->acc, acc, sizeof(acc)); +#endif + } + + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_update(XXH3_state_t* state, const void* input, size_t len) +{ + return XXH3_update(state, (const xxh_u8*)input, len, + XXH3_accumulate_512, XXH3_scrambleAcc); +} + + +XXH_FORCE_INLINE void +XXH3_digest_long (XXH64_hash_t* acc, + const XXH3_state_t* state, + const unsigned char* secret) +{ + /* + * Digest on a local copy. This way, the state remains unaltered, and it can + * continue ingesting more input afterwards. + */ + XXH_memcpy(acc, state->acc, sizeof(state->acc)); + if (state->bufferedSize >= XXH_STRIPE_LEN) { + size_t const nbStripes = (state->bufferedSize - 1) / XXH_STRIPE_LEN; + size_t nbStripesSoFar = state->nbStripesSoFar; + XXH3_consumeStripes(acc, + &nbStripesSoFar, state->nbStripesPerBlock, + state->buffer, nbStripes, + secret, state->secretLimit, + XXH3_accumulate_512, XXH3_scrambleAcc); + /* last stripe */ + XXH3_accumulate_512(acc, + state->buffer + state->bufferedSize - XXH_STRIPE_LEN, + secret + state->secretLimit - XXH_SECRET_LASTACC_START); + } else { /* bufferedSize < XXH_STRIPE_LEN */ + xxh_u8 lastStripe[XXH_STRIPE_LEN]; + size_t const catchupSize = XXH_STRIPE_LEN - state->bufferedSize; + XXH_ASSERT(state->bufferedSize > 0); /* there is always some input buffered */ + XXH_memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize); + XXH_memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize); + XXH3_accumulate_512(acc, + lastStripe, + secret + state->secretLimit - XXH_SECRET_LASTACC_START); + } +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state) +{ + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; + if (state->totalLen > XXH3_MIDSIZE_MAX) { + XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB]; + XXH3_digest_long(acc, state, secret); + return XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)state->totalLen * XXH_PRIME64_1); + } + /* totalLen <= XXH3_MIDSIZE_MAX: digesting a short input */ + if (state->useSeed) + return XXH3_64bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); + return XXH3_64bits_withSecret(state->buffer, (size_t)(state->totalLen), + secret, state->secretLimit + XXH_STRIPE_LEN); +} + + + +/* ========================================== + * XXH3 128 bits (a.k.a XXH128) + * ========================================== + * XXH3's 128-bit variant has better mixing and strength than the 64-bit variant, + * even without counting the significantly larger output size. + * + * For example, extra steps are taken to avoid the seed-dependent collisions + * in 17-240 byte inputs (See XXH3_mix16B and XXH128_mix32B). + * + * This strength naturally comes at the cost of some speed, especially on short + * lengths. Note that longer hashes are about as fast as the 64-bit version + * due to it using only a slight modification of the 64-bit loop. + * + * XXH128 is also more oriented towards 64-bit machines. It is still extremely + * fast for a _128-bit_ hash on 32-bit (it usually clears XXH64). + */ + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_1to3_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + /* A doubled version of 1to3_64b with different constants. */ + XXH_ASSERT(input != NULL); + XXH_ASSERT(1 <= len && len <= 3); + XXH_ASSERT(secret != NULL); + /* + * len = 1: combinedl = { input[0], 0x01, input[0], input[0] } + * len = 2: combinedl = { input[1], 0x02, input[0], input[1] } + * len = 3: combinedl = { input[2], 0x03, input[0], input[1] } + */ + { xxh_u8 const c1 = input[0]; + xxh_u8 const c2 = input[len >> 1]; + xxh_u8 const c3 = input[len - 1]; + xxh_u32 const combinedl = ((xxh_u32)c1 <<16) | ((xxh_u32)c2 << 24) + | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8); + xxh_u32 const combinedh = XXH_rotl32(XXH_swap32(combinedl), 13); + xxh_u64 const bitflipl = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed; + xxh_u64 const bitfliph = (XXH_readLE32(secret+8) ^ XXH_readLE32(secret+12)) - seed; + xxh_u64 const keyed_lo = (xxh_u64)combinedl ^ bitflipl; + xxh_u64 const keyed_hi = (xxh_u64)combinedh ^ bitfliph; + XXH128_hash_t h128; + h128.low64 = XXH64_avalanche(keyed_lo); + h128.high64 = XXH64_avalanche(keyed_hi); + return h128; + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_4to8_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(4 <= len && len <= 8); + seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; + { xxh_u32 const input_lo = XXH_readLE32(input); + xxh_u32 const input_hi = XXH_readLE32(input + len - 4); + xxh_u64 const input_64 = input_lo + ((xxh_u64)input_hi << 32); + xxh_u64 const bitflip = (XXH_readLE64(secret+16) ^ XXH_readLE64(secret+24)) + seed; + xxh_u64 const keyed = input_64 ^ bitflip; + + /* Shift len to the left to ensure it is even, this avoids even multiplies. */ + XXH128_hash_t m128 = XXH_mult64to128(keyed, XXH_PRIME64_1 + (len << 2)); + + m128.high64 += (m128.low64 << 1); + m128.low64 ^= (m128.high64 >> 3); + + m128.low64 = XXH_xorshift64(m128.low64, 35); + m128.low64 *= 0x9FB21C651E98DF25ULL; + m128.low64 = XXH_xorshift64(m128.low64, 28); + m128.high64 = XXH3_avalanche(m128.high64); + return m128; + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_9to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(9 <= len && len <= 16); + { xxh_u64 const bitflipl = (XXH_readLE64(secret+32) ^ XXH_readLE64(secret+40)) - seed; + xxh_u64 const bitfliph = (XXH_readLE64(secret+48) ^ XXH_readLE64(secret+56)) + seed; + xxh_u64 const input_lo = XXH_readLE64(input); + xxh_u64 input_hi = XXH_readLE64(input + len - 8); + XXH128_hash_t m128 = XXH_mult64to128(input_lo ^ input_hi ^ bitflipl, XXH_PRIME64_1); + /* + * Put len in the middle of m128 to ensure that the length gets mixed to + * both the low and high bits in the 128x64 multiply below. + */ + m128.low64 += (xxh_u64)(len - 1) << 54; + input_hi ^= bitfliph; + /* + * Add the high 32 bits of input_hi to the high 32 bits of m128, then + * add the long product of the low 32 bits of input_hi and XXH_PRIME32_2 to + * the high 64 bits of m128. + * + * The best approach to this operation is different on 32-bit and 64-bit. + */ + if (sizeof(void *) < sizeof(xxh_u64)) { /* 32-bit */ + /* + * 32-bit optimized version, which is more readable. + * + * On 32-bit, it removes an ADC and delays a dependency between the two + * halves of m128.high64, but it generates an extra mask on 64-bit. + */ + m128.high64 += (input_hi & 0xFFFFFFFF00000000ULL) + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2); + } else { + /* + * 64-bit optimized (albeit more confusing) version. + * + * Uses some properties of addition and multiplication to remove the mask: + * + * Let: + * a = input_hi.lo = (input_hi & 0x00000000FFFFFFFF) + * b = input_hi.hi = (input_hi & 0xFFFFFFFF00000000) + * c = XXH_PRIME32_2 + * + * a + (b * c) + * Inverse Property: x + y - x == y + * a + (b * (1 + c - 1)) + * Distributive Property: x * (y + z) == (x * y) + (x * z) + * a + (b * 1) + (b * (c - 1)) + * Identity Property: x * 1 == x + * a + b + (b * (c - 1)) + * + * Substitute a, b, and c: + * input_hi.hi + input_hi.lo + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1)) + * + * Since input_hi.hi + input_hi.lo == input_hi, we get this: + * input_hi + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1)) + */ + m128.high64 += input_hi + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2 - 1); + } + /* m128 ^= XXH_swap64(m128 >> 64); */ + m128.low64 ^= XXH_swap64(m128.high64); + + { /* 128x64 multiply: h128 = m128 * XXH_PRIME64_2; */ + XXH128_hash_t h128 = XXH_mult64to128(m128.low64, XXH_PRIME64_2); + h128.high64 += m128.high64 * XXH_PRIME64_2; + + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = XXH3_avalanche(h128.high64); + return h128; + } } +} + +/* + * Assumption: `secret` size is >= XXH3_SECRET_SIZE_MIN + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_0to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(len <= 16); + { if (len > 8) return XXH3_len_9to16_128b(input, len, secret, seed); + if (len >= 4) return XXH3_len_4to8_128b(input, len, secret, seed); + if (len) return XXH3_len_1to3_128b(input, len, secret, seed); + { XXH128_hash_t h128; + xxh_u64 const bitflipl = XXH_readLE64(secret+64) ^ XXH_readLE64(secret+72); + xxh_u64 const bitfliph = XXH_readLE64(secret+80) ^ XXH_readLE64(secret+88); + h128.low64 = XXH64_avalanche(seed ^ bitflipl); + h128.high64 = XXH64_avalanche( seed ^ bitfliph); + return h128; + } } +} + +/* + * A bit slower than XXH3_mix16B, but handles multiply by zero better. + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH128_mix32B(XXH128_hash_t acc, const xxh_u8* input_1, const xxh_u8* input_2, + const xxh_u8* secret, XXH64_hash_t seed) +{ + acc.low64 += XXH3_mix16B (input_1, secret+0, seed); + acc.low64 ^= XXH_readLE64(input_2) + XXH_readLE64(input_2 + 8); + acc.high64 += XXH3_mix16B (input_2, secret+16, seed); + acc.high64 ^= XXH_readLE64(input_1) + XXH_readLE64(input_1 + 8); + return acc; +} + + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(16 < len && len <= 128); + + { XXH128_hash_t acc; + acc.low64 = len * XXH_PRIME64_1; + acc.high64 = 0; + if (len > 32) { + if (len > 64) { + if (len > 96) { + acc = XXH128_mix32B(acc, input+48, input+len-64, secret+96, seed); + } + acc = XXH128_mix32B(acc, input+32, input+len-48, secret+64, seed); + } + acc = XXH128_mix32B(acc, input+16, input+len-32, secret+32, seed); + } + acc = XXH128_mix32B(acc, input, input+len-16, secret, seed); + { XXH128_hash_t h128; + h128.low64 = acc.low64 + acc.high64; + h128.high64 = (acc.low64 * XXH_PRIME64_1) + + (acc.high64 * XXH_PRIME64_4) + + ((len - seed) * XXH_PRIME64_2); + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64); + return h128; + } + } +} + +XXH_NO_INLINE XXH128_hash_t +XXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + + { XXH128_hash_t acc; + int const nbRounds = (int)len / 32; + int i; + acc.low64 = len * XXH_PRIME64_1; + acc.high64 = 0; + for (i=0; i<4; i++) { + acc = XXH128_mix32B(acc, + input + (32 * i), + input + (32 * i) + 16, + secret + (32 * i), + seed); + } + acc.low64 = XXH3_avalanche(acc.low64); + acc.high64 = XXH3_avalanche(acc.high64); + XXH_ASSERT(nbRounds >= 4); + for (i=4 ; i < nbRounds; i++) { + acc = XXH128_mix32B(acc, + input + (32 * i), + input + (32 * i) + 16, + secret + XXH3_MIDSIZE_STARTOFFSET + (32 * (i - 4)), + seed); + } + /* last bytes */ + acc = XXH128_mix32B(acc, + input + len - 16, + input + len - 32, + secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET - 16, + 0ULL - seed); + + { XXH128_hash_t h128; + h128.low64 = acc.low64 + acc.high64; + h128.high64 = (acc.low64 * XXH_PRIME64_1) + + (acc.high64 * XXH_PRIME64_4) + + ((len - seed) * XXH_PRIME64_2); + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64); + return h128; + } + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_internal(const void* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC; + + XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, secret, secretSize, f_acc512, f_scramble); + + /* converge into final hash */ + XXH_STATIC_ASSERT(sizeof(acc) == 64); + XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + { XXH128_hash_t h128; + h128.low64 = XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)len * XXH_PRIME64_1); + h128.high64 = XXH3_mergeAccs(acc, + secret + secretSize + - sizeof(acc) - XXH_SECRET_MERGEACCS_START, + ~((xxh_u64)len * XXH_PRIME64_2)); + return h128; + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH128_hash_t +XXH3_hashLong_128b_default(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + return XXH3_hashLong_128b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/* + * It's important for performance to pass @secretLen (when it's static) + * to the compiler, so that it can properly optimize the vectorized loop. + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSecret(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, secretLen, + XXH3_accumulate_512, XXH3_scrambleAcc); +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSeed_internal(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble, + XXH3_f_initCustomSecret f_initSec) +{ + if (seed64 == 0) + return XXH3_hashLong_128b_internal(input, len, + XXH3_kSecret, sizeof(XXH3_kSecret), + f_acc512, f_scramble); + { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + f_initSec(secret, seed64); + return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, sizeof(secret), + f_acc512, f_scramble); + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSeed(const void* input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + return XXH3_hashLong_128b_withSeed_internal(input, len, seed64, + XXH3_accumulate_512, XXH3_scrambleAcc, XXH3_initCustomSecret); +} + +typedef XXH128_hash_t (*XXH3_hashLong128_f)(const void* XXH_RESTRICT, size_t, + XXH64_hash_t, const void* XXH_RESTRICT, size_t); + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_128bits_internal(const void* input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen, + XXH3_hashLong128_f f_hl128) +{ + XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN); + /* + * If an action is to be taken if `secret` conditions are not respected, + * it should be done here. + * For now, it's a contract pre-condition. + * Adding a check and a branch here would cost performance at every hash. + */ + if (len <= 16) + return XXH3_len_0to16_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64); + if (len <= 128) + return XXH3_len_17to128_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_len_129to240_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + return f_hl128(input, len, seed64, secret, secretLen); +} + + +/* === Public XXH128 API === */ + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* input, size_t len) +{ + return XXH3_128bits_internal(input, len, 0, + XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_hashLong_128b_default); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) +{ + return XXH3_128bits_internal(input, len, 0, + (const xxh_u8*)secret, secretSize, + XXH3_hashLong_128b_withSecret); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_internal(input, len, seed, + XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_hashLong_128b_withSeed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_128b_withSecret(input, len, seed, secret, secretSize); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH128(const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_withSeed(input, len, seed); +} + + +/* === XXH3 128-bit streaming === */ + +/* + * All initialization and update functions are identical to 64-bit streaming variant. + * The only difference is the finalization routine. + */ + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset(XXH3_state_t* statePtr) +{ + return XXH3_64bits_reset(statePtr); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) +{ + return XXH3_64bits_reset_withSecret(statePtr, secret, secretSize); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSeed(statePtr, seed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSecretandSeed(statePtr, secret, secretSize, seed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_update(XXH3_state_t* state, const void* input, size_t len) +{ + return XXH3_update(state, (const xxh_u8*)input, len, + XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* state) +{ + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; + if (state->totalLen > XXH3_MIDSIZE_MAX) { + XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB]; + XXH3_digest_long(acc, state, secret); + XXH_ASSERT(state->secretLimit + XXH_STRIPE_LEN >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + { XXH128_hash_t h128; + h128.low64 = XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)state->totalLen * XXH_PRIME64_1); + h128.high64 = XXH3_mergeAccs(acc, + secret + state->secretLimit + XXH_STRIPE_LEN + - sizeof(acc) - XXH_SECRET_MERGEACCS_START, + ~((xxh_u64)state->totalLen * XXH_PRIME64_2)); + return h128; + } + } + /* len <= XXH3_MIDSIZE_MAX : short code */ + if (state->seed) + return XXH3_128bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); + return XXH3_128bits_withSecret(state->buffer, (size_t)(state->totalLen), + secret, state->secretLimit + XXH_STRIPE_LEN); +} + +/* 128-bit utility functions */ + +#include /* memcmp, memcpy */ + +/* return : 1 is equal, 0 if different */ +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2) +{ + /* note : XXH128_hash_t is compact, it has no padding byte */ + return !(memcmp(&h1, &h2, sizeof(h1))); +} + +/* This prototype is compatible with stdlib's qsort(). + * return : >0 if *h128_1 > *h128_2 + * <0 if *h128_1 < *h128_2 + * =0 if *h128_1 == *h128_2 */ +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2) +{ + XXH128_hash_t const h1 = *(const XXH128_hash_t*)h128_1; + XXH128_hash_t const h2 = *(const XXH128_hash_t*)h128_2; + int const hcmp = (h1.high64 > h2.high64) - (h2.high64 > h1.high64); + /* note : bets that, in most cases, hash values are different */ + if (hcmp) return hcmp; + return (h1.low64 > h2.low64) - (h2.low64 > h1.low64); +} + + +/*====== Canonical representation ======*/ +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API void +XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash) +{ + XXH_STATIC_ASSERT(sizeof(XXH128_canonical_t) == sizeof(XXH128_hash_t)); + if (XXH_CPU_LITTLE_ENDIAN) { + hash.high64 = XXH_swap64(hash.high64); + hash.low64 = XXH_swap64(hash.low64); + } + XXH_memcpy(dst, &hash.high64, sizeof(hash.high64)); + XXH_memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64)); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH128_hashFromCanonical(const XXH128_canonical_t* src) +{ + XXH128_hash_t h; + h.high64 = XXH_readBE64(src); + h.low64 = XXH_readBE64(src->digest + 8); + return h; +} + + + +/* ========================================== + * Secret generators + * ========================================== + */ +#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x)) + +XXH_FORCE_INLINE void XXH3_combine16(void* dst, XXH128_hash_t h128) +{ + XXH_writeLE64( dst, XXH_readLE64(dst) ^ h128.low64 ); + XXH_writeLE64( (char*)dst+8, XXH_readLE64((char*)dst+8) ^ h128.high64 ); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize) +{ +#if (XXH_DEBUGLEVEL >= 1) + XXH_ASSERT(secretBuffer != NULL); + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); +#else + /* production mode, assert() are disabled */ + if (secretBuffer == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; +#endif + + if (customSeedSize == 0) { + customSeed = XXH3_kSecret; + customSeedSize = XXH_SECRET_DEFAULT_SIZE; + } +#if (XXH_DEBUGLEVEL >= 1) + XXH_ASSERT(customSeed != NULL); +#else + if (customSeed == NULL) return XXH_ERROR; +#endif + + /* Fill secretBuffer with a copy of customSeed - repeat as needed */ + { size_t pos = 0; + while (pos < secretSize) { + size_t const toCopy = XXH_MIN((secretSize - pos), customSeedSize); + memcpy((char*)secretBuffer + pos, customSeed, toCopy); + pos += toCopy; + } } + + { size_t const nbSeg16 = secretSize / 16; + size_t n; + XXH128_canonical_t scrambler; + XXH128_canonicalFromHash(&scrambler, XXH128(customSeed, customSeedSize, 0)); + for (n=0; n + +/* weak symbol support + * For now, enable conservatively: + * - Only GNUC + * - Only ELF + * - Only x86-64, i386 and aarch64 + * Also, explicitly disable on platforms known not to work so they aren't + * forgotten in the future. + */ +#if !defined(ZSTD_HAVE_WEAK_SYMBOLS) && \ + defined(__GNUC__) && defined(__ELF__) && \ + (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) || defined(__aarch64__)) && \ + !defined(__APPLE__) && !defined(_WIN32) && !defined(__MINGW32__) && \ + !defined(__CYGWIN__) && !defined(_AIX) +# define ZSTD_HAVE_WEAK_SYMBOLS 1 +#else +# define ZSTD_HAVE_WEAK_SYMBOLS 0 +#endif +#if ZSTD_HAVE_WEAK_SYMBOLS +# define ZSTD_WEAK_ATTR __attribute__((__weak__)) +#else +# define ZSTD_WEAK_ATTR +#endif + +/* Only enable tracing when weak symbols are available. */ +#ifndef ZSTD_TRACE +# define ZSTD_TRACE ZSTD_HAVE_WEAK_SYMBOLS +#endif + +#if ZSTD_TRACE + +struct ZSTD_CCtx_s; +struct ZSTD_DCtx_s; +struct ZSTD_CCtx_params_s; + +typedef struct { + /** + * ZSTD_VERSION_NUMBER + * + * This is guaranteed to be the first member of ZSTD_trace. + * Otherwise, this struct is not stable between versions. If + * the version number does not match your expectation, you + * should not interpret the rest of the struct. + */ + unsigned version; + /** + * Non-zero if streaming (de)compression is used. + */ + unsigned streaming; + /** + * The dictionary ID. + */ + unsigned dictionaryID; + /** + * Is the dictionary cold? + * Only set on decompression. + */ + unsigned dictionaryIsCold; + /** + * The dictionary size or zero if no dictionary. + */ + size_t dictionarySize; + /** + * The uncompressed size of the data. + */ + size_t uncompressedSize; + /** + * The compressed size of the data. + */ + size_t compressedSize; + /** + * The fully resolved CCtx parameters (NULL on decompression). + */ + struct ZSTD_CCtx_params_s const* params; + /** + * The ZSTD_CCtx pointer (NULL on decompression). + */ + struct ZSTD_CCtx_s const* cctx; + /** + * The ZSTD_DCtx pointer (NULL on compression). + */ + struct ZSTD_DCtx_s const* dctx; +} ZSTD_Trace; + +/** + * A tracing context. It must be 0 when tracing is disabled. + * Otherwise, any non-zero value returned by a tracing begin() + * function is presented to any subsequent calls to end(). + * + * Any non-zero value is treated as tracing is enabled and not + * interpreted by the library. + * + * Two possible uses are: + * * A timestamp for when the begin() function was called. + * * A unique key identifying the (de)compression, like the + * address of the [dc]ctx pointer if you need to track + * more information than just a timestamp. + */ +typedef unsigned long long ZSTD_TraceCtx; + +/** + * Trace the beginning of a compression call. + * @param cctx The dctx pointer for the compression. + * It can be used as a key to map begin() to end(). + * @returns Non-zero if tracing is enabled. The return value is + * passed to ZSTD_trace_compress_end(). + */ +ZSTD_WEAK_ATTR ZSTD_TraceCtx ZSTD_trace_compress_begin( + struct ZSTD_CCtx_s const* cctx); + +/** + * Trace the end of a compression call. + * @param ctx The return value of ZSTD_trace_compress_begin(). + * @param trace The zstd tracing info. + */ +ZSTD_WEAK_ATTR void ZSTD_trace_compress_end( + ZSTD_TraceCtx ctx, + ZSTD_Trace const* trace); + +/** + * Trace the beginning of a decompression call. + * @param dctx The dctx pointer for the decompression. + * It can be used as a key to map begin() to end(). + * @returns Non-zero if tracing is enabled. The return value is + * passed to ZSTD_trace_compress_end(). + */ +ZSTD_WEAK_ATTR ZSTD_TraceCtx ZSTD_trace_decompress_begin( + struct ZSTD_DCtx_s const* dctx); + +/** + * Trace the end of a decompression call. + * @param ctx The return value of ZSTD_trace_decompress_begin(). + * @param trace The zstd tracing info. + */ +ZSTD_WEAK_ATTR void ZSTD_trace_decompress_end( + ZSTD_TraceCtx ctx, + ZSTD_Trace const* trace); + +#endif /* ZSTD_TRACE */ + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_TRACE_H */ +/**** ended inlining zstd_trace.h ****/ +#else +# define ZSTD_TRACE 0 +#endif + +#if defined (__cplusplus) +extern "C" { +#endif + +/* ---- static assert (debug) --- */ +#define ZSTD_STATIC_ASSERT(c) DEBUG_STATIC_ASSERT(c) +#define ZSTD_isError ERR_isError /* for inlining */ +#define FSE_isError ERR_isError +#define HUF_isError ERR_isError + + +/*-************************************* +* shared macros +***************************************/ +#undef MIN +#undef MAX +#define MIN(a,b) ((a)<(b) ? (a) : (b)) +#define MAX(a,b) ((a)>(b) ? (a) : (b)) +#define BOUNDED(min,val,max) (MAX(min,MIN(val,max))) + + +/*-************************************* +* Common constants +***************************************/ +#define ZSTD_OPT_NUM (1<<12) + +#define ZSTD_REP_NUM 3 /* number of repcodes */ +static UNUSED_ATTR const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 }; + +#define KB *(1 <<10) +#define MB *(1 <<20) +#define GB *(1U<<30) + +#define BIT7 128 +#define BIT6 64 +#define BIT5 32 +#define BIT4 16 +#define BIT1 2 +#define BIT0 1 + +#define ZSTD_WINDOWLOG_ABSOLUTEMIN 10 +static UNUSED_ATTR const size_t ZSTD_fcs_fieldSize[4] = { 0, 2, 4, 8 }; +static UNUSED_ATTR const size_t ZSTD_did_fieldSize[4] = { 0, 1, 2, 4 }; + +#define ZSTD_FRAMEIDSIZE 4 /* magic number size */ + +#define ZSTD_BLOCKHEADERSIZE 3 /* C standard doesn't allow `static const` variable to be init using another `static const` variable */ +static UNUSED_ATTR const size_t ZSTD_blockHeaderSize = ZSTD_BLOCKHEADERSIZE; +typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e; + +#define ZSTD_FRAMECHECKSUMSIZE 4 + +#define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */ +#define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */) /* for a non-null block */ +#define MIN_LITERALS_FOR_4_STREAMS 6 + +typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingType_e; + +#define LONGNBSEQ 0x7F00 + +#define MINMATCH 3 + +#define Litbits 8 +#define LitHufLog 11 +#define MaxLit ((1<= WILDCOPY_VECLEN || diff <= -WILDCOPY_VECLEN); + /* Separate out the first COPY16() call because the copy length is + * almost certain to be short, so the branches have different + * probabilities. Since it is almost certain to be short, only do + * one COPY16() in the first call. Then, do two calls per loop since + * at that point it is more likely to have a high trip count. + */ + ZSTD_copy16(op, ip); + if (16 >= length) return; + op += 16; + ip += 16; + do { + COPY16(op, ip); + COPY16(op, ip); + } + while (op < oend); + } +} + +MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize) +{ + size_t const length = MIN(dstCapacity, srcSize); + if (length > 0) { + ZSTD_memcpy(dst, src, length); + } + return length; +} + +/* define "workspace is too large" as this number of times larger than needed */ +#define ZSTD_WORKSPACETOOLARGE_FACTOR 3 + +/* when workspace is continuously too large + * during at least this number of times, + * context's memory usage is considered wasteful, + * because it's sized to handle a worst case scenario which rarely happens. + * In which case, resize it down to free some memory */ +#define ZSTD_WORKSPACETOOLARGE_MAXDURATION 128 + +/* Controls whether the input/output buffer is buffered or stable. */ +typedef enum { + ZSTD_bm_buffered = 0, /* Buffer the input/output */ + ZSTD_bm_stable = 1 /* ZSTD_inBuffer/ZSTD_outBuffer is stable */ +} ZSTD_bufferMode_e; + + +/*-******************************************* +* Private declarations +*********************************************/ +typedef struct seqDef_s { + U32 offBase; /* offBase == Offset + ZSTD_REP_NUM, or repcode 1,2,3 */ + U16 litLength; + U16 mlBase; /* mlBase == matchLength - MINMATCH */ +} seqDef; + +/* Controls whether seqStore has a single "long" litLength or matchLength. See seqStore_t. */ +typedef enum { + ZSTD_llt_none = 0, /* no longLengthType */ + ZSTD_llt_literalLength = 1, /* represents a long literal */ + ZSTD_llt_matchLength = 2 /* represents a long match */ +} ZSTD_longLengthType_e; + +typedef struct { + seqDef* sequencesStart; + seqDef* sequences; /* ptr to end of sequences */ + BYTE* litStart; + BYTE* lit; /* ptr to end of literals */ + BYTE* llCode; + BYTE* mlCode; + BYTE* ofCode; + size_t maxNbSeq; + size_t maxNbLit; + + /* longLengthPos and longLengthType to allow us to represent either a single litLength or matchLength + * in the seqStore that has a value larger than U16 (if it exists). To do so, we increment + * the existing value of the litLength or matchLength by 0x10000. + */ + ZSTD_longLengthType_e longLengthType; + U32 longLengthPos; /* Index of the sequence to apply long length modification to */ +} seqStore_t; + +typedef struct { + U32 litLength; + U32 matchLength; +} ZSTD_sequenceLength; + +/** + * Returns the ZSTD_sequenceLength for the given sequences. It handles the decoding of long sequences + * indicated by longLengthPos and longLengthType, and adds MINMATCH back to matchLength. + */ +MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore, seqDef const* seq) +{ + ZSTD_sequenceLength seqLen; + seqLen.litLength = seq->litLength; + seqLen.matchLength = seq->mlBase + MINMATCH; + if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) { + if (seqStore->longLengthType == ZSTD_llt_literalLength) { + seqLen.litLength += 0x10000; + } + if (seqStore->longLengthType == ZSTD_llt_matchLength) { + seqLen.matchLength += 0x10000; + } + } + return seqLen; +} + +/** + * Contains the compressed frame size and an upper-bound for the decompressed frame size. + * Note: before using `compressedSize`, check for errors using ZSTD_isError(). + * similarly, before using `decompressedBound`, check for errors using: + * `decompressedBound != ZSTD_CONTENTSIZE_ERROR` + */ +typedef struct { + size_t nbBlocks; + size_t compressedSize; + unsigned long long decompressedBound; +} ZSTD_frameSizeInfo; /* decompress & legacy */ + +const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx); /* compress & dictBuilder */ +int ZSTD_seqToCodes(const seqStore_t* seqStorePtr); /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */ + + +/* ZSTD_invalidateRepCodes() : + * ensures next compression will not use repcodes from previous block. + * Note : only works with regular variant; + * do not use with extDict variant ! */ +void ZSTD_invalidateRepCodes(ZSTD_CCtx* cctx); /* zstdmt, adaptive_compression (shouldn't get this definition from here) */ + + +typedef struct { + blockType_e blockType; + U32 lastBlock; + U32 origSize; +} blockProperties_t; /* declared here for decompress and fullbench */ + +/*! ZSTD_getcBlockSize() : + * Provides the size of compressed block from block header `src` */ +/* Used by: decompress, fullbench (does not get its definition from here) */ +size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, + blockProperties_t* bpPtr); + +/*! ZSTD_decodeSeqHeaders() : + * decode sequence header from src */ +/* Used by: decompress, fullbench (does not get its definition from here) */ +size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, + const void* src, size_t srcSize); + +/** + * @returns true iff the CPU supports dynamic BMI2 dispatch. + */ +MEM_STATIC int ZSTD_cpuSupportsBmi2(void) +{ + ZSTD_cpuid_t cpuid = ZSTD_cpuid(); + return ZSTD_cpuid_bmi1(cpuid) && ZSTD_cpuid_bmi2(cpuid); +} + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_CCOMMON_H_MODULE */ +/**** ended inlining zstd_internal.h ****/ + + +/*-**************************************** +* Version +******************************************/ +unsigned ZSTD_versionNumber(void) { return ZSTD_VERSION_NUMBER; } + +const char* ZSTD_versionString(void) { return ZSTD_VERSION_STRING; } + + +/*-**************************************** +* ZSTD Error Management +******************************************/ +#undef ZSTD_isError /* defined within zstd_internal.h */ +/*! ZSTD_isError() : + * tells if a return value is an error code + * symbol is required for external callers */ +unsigned ZSTD_isError(size_t code) { return ERR_isError(code); } + +/*! ZSTD_getErrorName() : + * provides error code string from function result (useful for debugging) */ +const char* ZSTD_getErrorName(size_t code) { return ERR_getErrorName(code); } + +/*! ZSTD_getError() : + * convert a `size_t` function result into a proper ZSTD_errorCode enum */ +ZSTD_ErrorCode ZSTD_getErrorCode(size_t code) { return ERR_getErrorCode(code); } + +/*! ZSTD_getErrorString() : + * provides error code string from enum */ +const char* ZSTD_getErrorString(ZSTD_ErrorCode code) { return ERR_getErrorString(code); } +/**** ended inlining common/zstd_common.c ****/ + +/**** start inlining decompress/huf_decompress.c ****/ +/* ****************************************************************** + * huff0 huffman decoder, + * part of Finite State Entropy library + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * You can contact the author at : + * - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. +****************************************************************** */ + +/* ************************************************************** +* Dependencies +****************************************************************/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../common/compiler.h ****/ +/**** skipping file: ../common/bitstream.h ****/ +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/huf.h ****/ +/**** skipping file: ../common/error_private.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: ../common/bits.h ****/ + +/* ************************************************************** +* Constants +****************************************************************/ + +#define HUF_DECODER_FAST_TABLELOG 11 + +/* ************************************************************** +* Macros +****************************************************************/ + +/* These two optional macros force the use one way or another of the two + * Huffman decompression implementations. You can't force in both directions + * at the same time. + */ +#if defined(HUF_FORCE_DECOMPRESS_X1) && \ + defined(HUF_FORCE_DECOMPRESS_X2) +#error "Cannot force the use of the X1 and X2 decoders at the same time!" +#endif + +/* When DYNAMIC_BMI2 is enabled, fast decoders are only called when bmi2 is + * supported at runtime, so we can add the BMI2 target attribute. + * When it is disabled, we will still get BMI2 if it is enabled statically. + */ +#if DYNAMIC_BMI2 +# define HUF_FAST_BMI2_ATTRS BMI2_TARGET_ATTRIBUTE +#else +# define HUF_FAST_BMI2_ATTRS +#endif + +#ifdef __cplusplus +# define HUF_EXTERN_C extern "C" +#else +# define HUF_EXTERN_C +#endif +#define HUF_ASM_DECL HUF_EXTERN_C + +#if DYNAMIC_BMI2 +# define HUF_NEED_BMI2_FUNCTION 1 +#else +# define HUF_NEED_BMI2_FUNCTION 0 +#endif + +/* ************************************************************** +* Error Management +****************************************************************/ +#define HUF_isError ERR_isError + + +/* ************************************************************** +* Byte alignment for workSpace management +****************************************************************/ +#define HUF_ALIGN(x, a) HUF_ALIGN_MASK((x), (a) - 1) +#define HUF_ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) + + +/* ************************************************************** +* BMI2 Variant Wrappers +****************************************************************/ +typedef size_t (*HUF_DecompressUsingDTableFn)(void *dst, size_t dstSize, + const void *cSrc, + size_t cSrcSize, + const HUF_DTable *DTable); + +#if DYNAMIC_BMI2 + +#define HUF_DGEN(fn) \ + \ + static size_t fn##_default( \ + void* dst, size_t dstSize, \ + const void* cSrc, size_t cSrcSize, \ + const HUF_DTable* DTable) \ + { \ + return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ + } \ + \ + static BMI2_TARGET_ATTRIBUTE size_t fn##_bmi2( \ + void* dst, size_t dstSize, \ + const void* cSrc, size_t cSrcSize, \ + const HUF_DTable* DTable) \ + { \ + return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ + } \ + \ + static size_t fn(void* dst, size_t dstSize, void const* cSrc, \ + size_t cSrcSize, HUF_DTable const* DTable, int flags) \ + { \ + if (flags & HUF_flags_bmi2) { \ + return fn##_bmi2(dst, dstSize, cSrc, cSrcSize, DTable); \ + } \ + return fn##_default(dst, dstSize, cSrc, cSrcSize, DTable); \ + } + +#else + +#define HUF_DGEN(fn) \ + static size_t fn(void* dst, size_t dstSize, void const* cSrc, \ + size_t cSrcSize, HUF_DTable const* DTable, int flags) \ + { \ + (void)flags; \ + return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ + } + +#endif + + +/*-***************************/ +/* generic DTableDesc */ +/*-***************************/ +typedef struct { BYTE maxTableLog; BYTE tableType; BYTE tableLog; BYTE reserved; } DTableDesc; + +static DTableDesc HUF_getDTableDesc(const HUF_DTable* table) +{ + DTableDesc dtd; + ZSTD_memcpy(&dtd, table, sizeof(dtd)); + return dtd; +} + +static size_t HUF_initFastDStream(BYTE const* ip) { + BYTE const lastByte = ip[7]; + size_t const bitsConsumed = lastByte ? 8 - ZSTD_highbit32(lastByte) : 0; + size_t const value = MEM_readLEST(ip) | 1; + assert(bitsConsumed <= 8); + assert(sizeof(size_t) == 8); + return value << bitsConsumed; +} + + +/** + * The input/output arguments to the Huffman fast decoding loop: + * + * ip [in/out] - The input pointers, must be updated to reflect what is consumed. + * op [in/out] - The output pointers, must be updated to reflect what is written. + * bits [in/out] - The bitstream containers, must be updated to reflect the current state. + * dt [in] - The decoding table. + * ilimit [in] - The input limit, stop when any input pointer is below ilimit. + * oend [in] - The end of the output stream. op[3] must not cross oend. + * iend [in] - The end of each input stream. ip[i] may cross iend[i], + * as long as it is above ilimit, but that indicates corruption. + */ +typedef struct { + BYTE const* ip[4]; + BYTE* op[4]; + U64 bits[4]; + void const* dt; + BYTE const* ilimit; + BYTE* oend; + BYTE const* iend[4]; +} HUF_DecompressFastArgs; + +typedef void (*HUF_DecompressFastLoopFn)(HUF_DecompressFastArgs*); + +/** + * Initializes args for the fast decoding loop. + * @returns 1 on success + * 0 if the fallback implementation should be used. + * Or an error code on failure. + */ +static size_t HUF_DecompressFastArgs_init(HUF_DecompressFastArgs* args, void* dst, size_t dstSize, void const* src, size_t srcSize, const HUF_DTable* DTable) +{ + void const* dt = DTable + 1; + U32 const dtLog = HUF_getDTableDesc(DTable).tableLog; + + const BYTE* const ilimit = (const BYTE*)src + 6 + 8; + + BYTE* const oend = (BYTE*)dst + dstSize; + + /* The fast decoding loop assumes 64-bit little-endian. + * This condition is false on x32. + */ + if (!MEM_isLittleEndian() || MEM_32bits()) + return 0; + + /* strict minimum : jump table + 1 byte per stream */ + if (srcSize < 10) + return ERROR(corruption_detected); + + /* Must have at least 8 bytes per stream because we don't handle initializing smaller bit containers. + * If table log is not correct at this point, fallback to the old decoder. + * On small inputs we don't have enough data to trigger the fast loop, so use the old decoder. + */ + if (dtLog != HUF_DECODER_FAST_TABLELOG) + return 0; + + /* Read the jump table. */ + { + const BYTE* const istart = (const BYTE*)src; + size_t const length1 = MEM_readLE16(istart); + size_t const length2 = MEM_readLE16(istart+2); + size_t const length3 = MEM_readLE16(istart+4); + size_t const length4 = srcSize - (length1 + length2 + length3 + 6); + args->iend[0] = istart + 6; /* jumpTable */ + args->iend[1] = args->iend[0] + length1; + args->iend[2] = args->iend[1] + length2; + args->iend[3] = args->iend[2] + length3; + + /* HUF_initFastDStream() requires this, and this small of an input + * won't benefit from the ASM loop anyways. + * length1 must be >= 16 so that ip[0] >= ilimit before the loop + * starts. + */ + if (length1 < 16 || length2 < 8 || length3 < 8 || length4 < 8) + return 0; + if (length4 > srcSize) return ERROR(corruption_detected); /* overflow */ + } + /* ip[] contains the position that is currently loaded into bits[]. */ + args->ip[0] = args->iend[1] - sizeof(U64); + args->ip[1] = args->iend[2] - sizeof(U64); + args->ip[2] = args->iend[3] - sizeof(U64); + args->ip[3] = (BYTE const*)src + srcSize - sizeof(U64); + + /* op[] contains the output pointers. */ + args->op[0] = (BYTE*)dst; + args->op[1] = args->op[0] + (dstSize+3)/4; + args->op[2] = args->op[1] + (dstSize+3)/4; + args->op[3] = args->op[2] + (dstSize+3)/4; + + /* No point to call the ASM loop for tiny outputs. */ + if (args->op[3] >= oend) + return 0; + + /* bits[] is the bit container. + * It is read from the MSB down to the LSB. + * It is shifted left as it is read, and zeros are + * shifted in. After the lowest valid bit a 1 is + * set, so that CountTrailingZeros(bits[]) can be used + * to count how many bits we've consumed. + */ + args->bits[0] = HUF_initFastDStream(args->ip[0]); + args->bits[1] = HUF_initFastDStream(args->ip[1]); + args->bits[2] = HUF_initFastDStream(args->ip[2]); + args->bits[3] = HUF_initFastDStream(args->ip[3]); + + /* If ip[] >= ilimit, it is guaranteed to be safe to + * reload bits[]. It may be beyond its section, but is + * guaranteed to be valid (>= istart). + */ + args->ilimit = ilimit; + + args->oend = oend; + args->dt = dt; + + return 1; +} + +static size_t HUF_initRemainingDStream(BIT_DStream_t* bit, HUF_DecompressFastArgs const* args, int stream, BYTE* segmentEnd) +{ + /* Validate that we haven't overwritten. */ + if (args->op[stream] > segmentEnd) + return ERROR(corruption_detected); + /* Validate that we haven't read beyond iend[]. + * Note that ip[] may be < iend[] because the MSB is + * the next bit to read, and we may have consumed 100% + * of the stream, so down to iend[i] - 8 is valid. + */ + if (args->ip[stream] < args->iend[stream] - 8) + return ERROR(corruption_detected); + + /* Construct the BIT_DStream_t. */ + assert(sizeof(size_t) == 8); + bit->bitContainer = MEM_readLEST(args->ip[stream]); + bit->bitsConsumed = ZSTD_countTrailingZeros64(args->bits[stream]); + bit->start = (const char*)args->iend[0]; + bit->limitPtr = bit->start + sizeof(size_t); + bit->ptr = (const char*)args->ip[stream]; + + return 0; +} + + +#ifndef HUF_FORCE_DECOMPRESS_X2 + +/*-***************************/ +/* single-symbol decoding */ +/*-***************************/ +typedef struct { BYTE nbBits; BYTE byte; } HUF_DEltX1; /* single-symbol decoding */ + +/** + * Packs 4 HUF_DEltX1 structs into a U64. This is used to lay down 4 entries at + * a time. + */ +static U64 HUF_DEltX1_set4(BYTE symbol, BYTE nbBits) { + U64 D4; + if (MEM_isLittleEndian()) { + D4 = (U64)((symbol << 8) + nbBits); + } else { + D4 = (U64)(symbol + (nbBits << 8)); + } + assert(D4 < (1U << 16)); + D4 *= 0x0001000100010001ULL; + return D4; +} + +/** + * Increase the tableLog to targetTableLog and rescales the stats. + * If tableLog > targetTableLog this is a no-op. + * @returns New tableLog + */ +static U32 HUF_rescaleStats(BYTE* huffWeight, U32* rankVal, U32 nbSymbols, U32 tableLog, U32 targetTableLog) +{ + if (tableLog > targetTableLog) + return tableLog; + if (tableLog < targetTableLog) { + U32 const scale = targetTableLog - tableLog; + U32 s; + /* Increase the weight for all non-zero probability symbols by scale. */ + for (s = 0; s < nbSymbols; ++s) { + huffWeight[s] += (BYTE)((huffWeight[s] == 0) ? 0 : scale); + } + /* Update rankVal to reflect the new weights. + * All weights except 0 get moved to weight + scale. + * Weights [1, scale] are empty. + */ + for (s = targetTableLog; s > scale; --s) { + rankVal[s] = rankVal[s - scale]; + } + for (s = scale; s > 0; --s) { + rankVal[s] = 0; + } + } + return targetTableLog; +} + +typedef struct { + U32 rankVal[HUF_TABLELOG_ABSOLUTEMAX + 1]; + U32 rankStart[HUF_TABLELOG_ABSOLUTEMAX + 1]; + U32 statsWksp[HUF_READ_STATS_WORKSPACE_SIZE_U32]; + BYTE symbols[HUF_SYMBOLVALUE_MAX + 1]; + BYTE huffWeight[HUF_SYMBOLVALUE_MAX + 1]; +} HUF_ReadDTableX1_Workspace; + +size_t HUF_readDTableX1_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int flags) +{ + U32 tableLog = 0; + U32 nbSymbols = 0; + size_t iSize; + void* const dtPtr = DTable + 1; + HUF_DEltX1* const dt = (HUF_DEltX1*)dtPtr; + HUF_ReadDTableX1_Workspace* wksp = (HUF_ReadDTableX1_Workspace*)workSpace; + + DEBUG_STATIC_ASSERT(HUF_DECOMPRESS_WORKSPACE_SIZE >= sizeof(*wksp)); + if (sizeof(*wksp) > wkspSize) return ERROR(tableLog_tooLarge); + + DEBUG_STATIC_ASSERT(sizeof(DTableDesc) == sizeof(HUF_DTable)); + /* ZSTD_memset(huffWeight, 0, sizeof(huffWeight)); */ /* is not necessary, even though some analyzer complain ... */ + + iSize = HUF_readStats_wksp(wksp->huffWeight, HUF_SYMBOLVALUE_MAX + 1, wksp->rankVal, &nbSymbols, &tableLog, src, srcSize, wksp->statsWksp, sizeof(wksp->statsWksp), flags); + if (HUF_isError(iSize)) return iSize; + + + /* Table header */ + { DTableDesc dtd = HUF_getDTableDesc(DTable); + U32 const maxTableLog = dtd.maxTableLog + 1; + U32 const targetTableLog = MIN(maxTableLog, HUF_DECODER_FAST_TABLELOG); + tableLog = HUF_rescaleStats(wksp->huffWeight, wksp->rankVal, nbSymbols, tableLog, targetTableLog); + if (tableLog > (U32)(dtd.maxTableLog+1)) return ERROR(tableLog_tooLarge); /* DTable too small, Huffman tree cannot fit in */ + dtd.tableType = 0; + dtd.tableLog = (BYTE)tableLog; + ZSTD_memcpy(DTable, &dtd, sizeof(dtd)); + } + + /* Compute symbols and rankStart given rankVal: + * + * rankVal already contains the number of values of each weight. + * + * symbols contains the symbols ordered by weight. First are the rankVal[0] + * weight 0 symbols, followed by the rankVal[1] weight 1 symbols, and so on. + * symbols[0] is filled (but unused) to avoid a branch. + * + * rankStart contains the offset where each rank belongs in the DTable. + * rankStart[0] is not filled because there are no entries in the table for + * weight 0. + */ + { int n; + U32 nextRankStart = 0; + int const unroll = 4; + int const nLimit = (int)nbSymbols - unroll + 1; + for (n=0; n<(int)tableLog+1; n++) { + U32 const curr = nextRankStart; + nextRankStart += wksp->rankVal[n]; + wksp->rankStart[n] = curr; + } + for (n=0; n < nLimit; n += unroll) { + int u; + for (u=0; u < unroll; ++u) { + size_t const w = wksp->huffWeight[n+u]; + wksp->symbols[wksp->rankStart[w]++] = (BYTE)(n+u); + } + } + for (; n < (int)nbSymbols; ++n) { + size_t const w = wksp->huffWeight[n]; + wksp->symbols[wksp->rankStart[w]++] = (BYTE)n; + } + } + + /* fill DTable + * We fill all entries of each weight in order. + * That way length is a constant for each iteration of the outer loop. + * We can switch based on the length to a different inner loop which is + * optimized for that particular case. + */ + { U32 w; + int symbol = wksp->rankVal[0]; + int rankStart = 0; + for (w=1; wrankVal[w]; + int const length = (1 << w) >> 1; + int uStart = rankStart; + BYTE const nbBits = (BYTE)(tableLog + 1 - w); + int s; + int u; + switch (length) { + case 1: + for (s=0; ssymbols[symbol + s]; + D.nbBits = nbBits; + dt[uStart] = D; + uStart += 1; + } + break; + case 2: + for (s=0; ssymbols[symbol + s]; + D.nbBits = nbBits; + dt[uStart+0] = D; + dt[uStart+1] = D; + uStart += 2; + } + break; + case 4: + for (s=0; ssymbols[symbol + s], nbBits); + MEM_write64(dt + uStart, D4); + uStart += 4; + } + break; + case 8: + for (s=0; ssymbols[symbol + s], nbBits); + MEM_write64(dt + uStart, D4); + MEM_write64(dt + uStart + 4, D4); + uStart += 8; + } + break; + default: + for (s=0; ssymbols[symbol + s], nbBits); + for (u=0; u < length; u += 16) { + MEM_write64(dt + uStart + u + 0, D4); + MEM_write64(dt + uStart + u + 4, D4); + MEM_write64(dt + uStart + u + 8, D4); + MEM_write64(dt + uStart + u + 12, D4); + } + assert(u == length); + uStart += length; + } + break; + } + symbol += symbolCount; + rankStart += symbolCount * length; + } + } + return iSize; +} + +FORCE_INLINE_TEMPLATE BYTE +HUF_decodeSymbolX1(BIT_DStream_t* Dstream, const HUF_DEltX1* dt, const U32 dtLog) +{ + size_t const val = BIT_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */ + BYTE const c = dt[val].byte; + BIT_skipBits(Dstream, dt[val].nbBits); + return c; +} + +#define HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) \ + *ptr++ = HUF_decodeSymbolX1(DStreamPtr, dt, dtLog) + +#define HUF_DECODE_SYMBOLX1_1(ptr, DStreamPtr) \ + if (MEM_64bits() || (HUF_TABLELOG_MAX<=12)) \ + HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) + +#define HUF_DECODE_SYMBOLX1_2(ptr, DStreamPtr) \ + if (MEM_64bits()) \ + HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) + +HINT_INLINE size_t +HUF_decodeStreamX1(BYTE* p, BIT_DStream_t* const bitDPtr, BYTE* const pEnd, const HUF_DEltX1* const dt, const U32 dtLog) +{ + BYTE* const pStart = p; + + /* up to 4 symbols at a time */ + if ((pEnd - p) > 3) { + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-3)) { + HUF_DECODE_SYMBOLX1_2(p, bitDPtr); + HUF_DECODE_SYMBOLX1_1(p, bitDPtr); + HUF_DECODE_SYMBOLX1_2(p, bitDPtr); + HUF_DECODE_SYMBOLX1_0(p, bitDPtr); + } + } else { + BIT_reloadDStream(bitDPtr); + } + + /* [0-3] symbols remaining */ + if (MEM_32bits()) + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd)) + HUF_DECODE_SYMBOLX1_0(p, bitDPtr); + + /* no more data to retrieve from bitstream, no need to reload */ + while (p < pEnd) + HUF_DECODE_SYMBOLX1_0(p, bitDPtr); + + return (size_t)(pEnd-pStart); +} + +FORCE_INLINE_TEMPLATE size_t +HUF_decompress1X1_usingDTable_internal_body( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + BYTE* op = (BYTE*)dst; + BYTE* const oend = op + dstSize; + const void* dtPtr = DTable + 1; + const HUF_DEltX1* const dt = (const HUF_DEltX1*)dtPtr; + BIT_DStream_t bitD; + DTableDesc const dtd = HUF_getDTableDesc(DTable); + U32 const dtLog = dtd.tableLog; + + CHECK_F( BIT_initDStream(&bitD, cSrc, cSrcSize) ); + + HUF_decodeStreamX1(op, &bitD, oend, dt, dtLog); + + if (!BIT_endOfDStream(&bitD)) return ERROR(corruption_detected); + + return dstSize; +} + +/* HUF_decompress4X1_usingDTable_internal_body(): + * Conditions : + * @dstSize >= 6 + */ +FORCE_INLINE_TEMPLATE size_t +HUF_decompress4X1_usingDTable_internal_body( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + /* Check */ + if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */ + + { const BYTE* const istart = (const BYTE*) cSrc; + BYTE* const ostart = (BYTE*) dst; + BYTE* const oend = ostart + dstSize; + BYTE* const olimit = oend - 3; + const void* const dtPtr = DTable + 1; + const HUF_DEltX1* const dt = (const HUF_DEltX1*)dtPtr; + + /* Init */ + BIT_DStream_t bitD1; + BIT_DStream_t bitD2; + BIT_DStream_t bitD3; + BIT_DStream_t bitD4; + size_t const length1 = MEM_readLE16(istart); + size_t const length2 = MEM_readLE16(istart+2); + size_t const length3 = MEM_readLE16(istart+4); + size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6); + const BYTE* const istart1 = istart + 6; /* jumpTable */ + const BYTE* const istart2 = istart1 + length1; + const BYTE* const istart3 = istart2 + length2; + const BYTE* const istart4 = istart3 + length3; + const size_t segmentSize = (dstSize+3) / 4; + BYTE* const opStart2 = ostart + segmentSize; + BYTE* const opStart3 = opStart2 + segmentSize; + BYTE* const opStart4 = opStart3 + segmentSize; + BYTE* op1 = ostart; + BYTE* op2 = opStart2; + BYTE* op3 = opStart3; + BYTE* op4 = opStart4; + DTableDesc const dtd = HUF_getDTableDesc(DTable); + U32 const dtLog = dtd.tableLog; + U32 endSignal = 1; + + if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */ + if (opStart4 > oend) return ERROR(corruption_detected); /* overflow */ + if (dstSize < 6) return ERROR(corruption_detected); /* stream 4-split doesn't work */ + CHECK_F( BIT_initDStream(&bitD1, istart1, length1) ); + CHECK_F( BIT_initDStream(&bitD2, istart2, length2) ); + CHECK_F( BIT_initDStream(&bitD3, istart3, length3) ); + CHECK_F( BIT_initDStream(&bitD4, istart4, length4) ); + + /* up to 16 symbols per loop (4 symbols per stream) in 64-bit mode */ + if ((size_t)(oend - op4) >= sizeof(size_t)) { + for ( ; (endSignal) & (op4 < olimit) ; ) { + HUF_DECODE_SYMBOLX1_2(op1, &bitD1); + HUF_DECODE_SYMBOLX1_2(op2, &bitD2); + HUF_DECODE_SYMBOLX1_2(op3, &bitD3); + HUF_DECODE_SYMBOLX1_2(op4, &bitD4); + HUF_DECODE_SYMBOLX1_1(op1, &bitD1); + HUF_DECODE_SYMBOLX1_1(op2, &bitD2); + HUF_DECODE_SYMBOLX1_1(op3, &bitD3); + HUF_DECODE_SYMBOLX1_1(op4, &bitD4); + HUF_DECODE_SYMBOLX1_2(op1, &bitD1); + HUF_DECODE_SYMBOLX1_2(op2, &bitD2); + HUF_DECODE_SYMBOLX1_2(op3, &bitD3); + HUF_DECODE_SYMBOLX1_2(op4, &bitD4); + HUF_DECODE_SYMBOLX1_0(op1, &bitD1); + HUF_DECODE_SYMBOLX1_0(op2, &bitD2); + HUF_DECODE_SYMBOLX1_0(op3, &bitD3); + HUF_DECODE_SYMBOLX1_0(op4, &bitD4); + endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; + } + } + + /* check corruption */ + /* note : should not be necessary : op# advance in lock step, and we control op4. + * but curiously, binary generated by gcc 7.2 & 7.3 with -mbmi2 runs faster when >=1 test is present */ + if (op1 > opStart2) return ERROR(corruption_detected); + if (op2 > opStart3) return ERROR(corruption_detected); + if (op3 > opStart4) return ERROR(corruption_detected); + /* note : op4 supposed already verified within main loop */ + + /* finish bitStreams one by one */ + HUF_decodeStreamX1(op1, &bitD1, opStart2, dt, dtLog); + HUF_decodeStreamX1(op2, &bitD2, opStart3, dt, dtLog); + HUF_decodeStreamX1(op3, &bitD3, opStart4, dt, dtLog); + HUF_decodeStreamX1(op4, &bitD4, oend, dt, dtLog); + + /* check */ + { U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4); + if (!endCheck) return ERROR(corruption_detected); } + + /* decoded size */ + return dstSize; + } +} + +#if HUF_NEED_BMI2_FUNCTION +static BMI2_TARGET_ATTRIBUTE +size_t HUF_decompress4X1_usingDTable_internal_bmi2(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X1_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} +#endif + +static +size_t HUF_decompress4X1_usingDTable_internal_default(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X1_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 + +HUF_ASM_DECL void HUF_decompress4X1_usingDTable_internal_fast_asm_loop(HUF_DecompressFastArgs* args) ZSTDLIB_HIDDEN; + +#endif + +static HUF_FAST_BMI2_ATTRS +void HUF_decompress4X1_usingDTable_internal_fast_c_loop(HUF_DecompressFastArgs* args) +{ + U64 bits[4]; + BYTE const* ip[4]; + BYTE* op[4]; + U16 const* const dtable = (U16 const*)args->dt; + BYTE* const oend = args->oend; + BYTE const* const ilimit = args->ilimit; + + /* Copy the arguments to local variables */ + ZSTD_memcpy(&bits, &args->bits, sizeof(bits)); + ZSTD_memcpy((void*)(&ip), &args->ip, sizeof(ip)); + ZSTD_memcpy(&op, &args->op, sizeof(op)); + + assert(MEM_isLittleEndian()); + assert(!MEM_32bits()); + + for (;;) { + BYTE* olimit; + int stream; + int symbol; + + /* Assert loop preconditions */ +#ifndef NDEBUG + for (stream = 0; stream < 4; ++stream) { + assert(op[stream] <= (stream == 3 ? oend : op[stream + 1])); + assert(ip[stream] >= ilimit); + } +#endif + /* Compute olimit */ + { + /* Each iteration produces 5 output symbols per stream */ + size_t const oiters = (size_t)(oend - op[3]) / 5; + /* Each iteration consumes up to 11 bits * 5 = 55 bits < 7 bytes + * per stream. + */ + size_t const iiters = (size_t)(ip[0] - ilimit) / 7; + /* We can safely run iters iterations before running bounds checks */ + size_t const iters = MIN(oiters, iiters); + size_t const symbols = iters * 5; + + /* We can simply check that op[3] < olimit, instead of checking all + * of our bounds, since we can't hit the other bounds until we've run + * iters iterations, which only happens when op[3] == olimit. + */ + olimit = op[3] + symbols; + + /* Exit fast decoding loop once we get close to the end. */ + if (op[3] + 20 > olimit) + break; + + /* Exit the decoding loop if any input pointer has crossed the + * previous one. This indicates corruption, and a precondition + * to our loop is that ip[i] >= ip[0]. + */ + for (stream = 1; stream < 4; ++stream) { + if (ip[stream] < ip[stream - 1]) + goto _out; + } + } + +#ifndef NDEBUG + for (stream = 1; stream < 4; ++stream) { + assert(ip[stream] >= ip[stream - 1]); + } +#endif + + do { + /* Decode 5 symbols in each of the 4 streams */ + for (symbol = 0; symbol < 5; ++symbol) { + for (stream = 0; stream < 4; ++stream) { + int const index = (int)(bits[stream] >> 53); + int const entry = (int)dtable[index]; + bits[stream] <<= (entry & 63); + op[stream][symbol] = (BYTE)((entry >> 8) & 0xFF); + } + } + /* Reload the bitstreams */ + for (stream = 0; stream < 4; ++stream) { + int const ctz = ZSTD_countTrailingZeros64(bits[stream]); + int const nbBits = ctz & 7; + int const nbBytes = ctz >> 3; + op[stream] += 5; + ip[stream] -= nbBytes; + bits[stream] = MEM_read64(ip[stream]) | 1; + bits[stream] <<= nbBits; + } + } while (op[3] < olimit); + } + +_out: + + /* Save the final values of each of the state variables back to args. */ + ZSTD_memcpy(&args->bits, &bits, sizeof(bits)); + ZSTD_memcpy((void*)(&args->ip), &ip, sizeof(ip)); + ZSTD_memcpy(&args->op, &op, sizeof(op)); +} + +/** + * @returns @p dstSize on success (>= 6) + * 0 if the fallback implementation should be used + * An error if an error occurred + */ +static HUF_FAST_BMI2_ATTRS +size_t +HUF_decompress4X1_usingDTable_internal_fast( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable, + HUF_DecompressFastLoopFn loopFn) +{ + void const* dt = DTable + 1; + const BYTE* const iend = (const BYTE*)cSrc + 6; + BYTE* const oend = (BYTE*)dst + dstSize; + HUF_DecompressFastArgs args; + { size_t const ret = HUF_DecompressFastArgs_init(&args, dst, dstSize, cSrc, cSrcSize, DTable); + FORWARD_IF_ERROR(ret, "Failed to init fast loop args"); + if (ret == 0) + return 0; + } + + assert(args.ip[0] >= args.ilimit); + loopFn(&args); + + /* Our loop guarantees that ip[] >= ilimit and that we haven't + * overwritten any op[]. + */ + assert(args.ip[0] >= iend); + assert(args.ip[1] >= iend); + assert(args.ip[2] >= iend); + assert(args.ip[3] >= iend); + assert(args.op[3] <= oend); + (void)iend; + + /* finish bit streams one by one. */ + { size_t const segmentSize = (dstSize+3) / 4; + BYTE* segmentEnd = (BYTE*)dst; + int i; + for (i = 0; i < 4; ++i) { + BIT_DStream_t bit; + if (segmentSize <= (size_t)(oend - segmentEnd)) + segmentEnd += segmentSize; + else + segmentEnd = oend; + FORWARD_IF_ERROR(HUF_initRemainingDStream(&bit, &args, i, segmentEnd), "corruption"); + /* Decompress and validate that we've produced exactly the expected length. */ + args.op[i] += HUF_decodeStreamX1(args.op[i], &bit, segmentEnd, (HUF_DEltX1 const*)dt, HUF_DECODER_FAST_TABLELOG); + if (args.op[i] != segmentEnd) return ERROR(corruption_detected); + } + } + + /* decoded size */ + assert(dstSize != 0); + return dstSize; +} + +HUF_DGEN(HUF_decompress1X1_usingDTable_internal) + +static size_t HUF_decompress4X1_usingDTable_internal(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable, int flags) +{ + HUF_DecompressUsingDTableFn fallbackFn = HUF_decompress4X1_usingDTable_internal_default; + HUF_DecompressFastLoopFn loopFn = HUF_decompress4X1_usingDTable_internal_fast_c_loop; + +#if DYNAMIC_BMI2 + if (flags & HUF_flags_bmi2) { + fallbackFn = HUF_decompress4X1_usingDTable_internal_bmi2; +# if ZSTD_ENABLE_ASM_X86_64_BMI2 + if (!(flags & HUF_flags_disableAsm)) { + loopFn = HUF_decompress4X1_usingDTable_internal_fast_asm_loop; + } +# endif + } else { + return fallbackFn(dst, dstSize, cSrc, cSrcSize, DTable); + } +#endif + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__) + if (!(flags & HUF_flags_disableAsm)) { + loopFn = HUF_decompress4X1_usingDTable_internal_fast_asm_loop; + } +#endif + + if (!(flags & HUF_flags_disableFast)) { + size_t const ret = HUF_decompress4X1_usingDTable_internal_fast(dst, dstSize, cSrc, cSrcSize, DTable, loopFn); + if (ret != 0) + return ret; + } + return fallbackFn(dst, dstSize, cSrc, cSrcSize, DTable); +} + +static size_t HUF_decompress4X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + void* workSpace, size_t wkspSize, int flags) +{ + const BYTE* ip = (const BYTE*) cSrc; + + size_t const hSize = HUF_readDTableX1_wksp(dctx, cSrc, cSrcSize, workSpace, wkspSize, flags); + if (HUF_isError(hSize)) return hSize; + if (hSize >= cSrcSize) return ERROR(srcSize_wrong); + ip += hSize; cSrcSize -= hSize; + + return HUF_decompress4X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, flags); +} + +#endif /* HUF_FORCE_DECOMPRESS_X2 */ + + +#ifndef HUF_FORCE_DECOMPRESS_X1 + +/* *************************/ +/* double-symbols decoding */ +/* *************************/ + +typedef struct { U16 sequence; BYTE nbBits; BYTE length; } HUF_DEltX2; /* double-symbols decoding */ +typedef struct { BYTE symbol; } sortedSymbol_t; +typedef U32 rankValCol_t[HUF_TABLELOG_MAX + 1]; +typedef rankValCol_t rankVal_t[HUF_TABLELOG_MAX]; + +/** + * Constructs a HUF_DEltX2 in a U32. + */ +static U32 HUF_buildDEltX2U32(U32 symbol, U32 nbBits, U32 baseSeq, int level) +{ + U32 seq; + DEBUG_STATIC_ASSERT(offsetof(HUF_DEltX2, sequence) == 0); + DEBUG_STATIC_ASSERT(offsetof(HUF_DEltX2, nbBits) == 2); + DEBUG_STATIC_ASSERT(offsetof(HUF_DEltX2, length) == 3); + DEBUG_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(U32)); + if (MEM_isLittleEndian()) { + seq = level == 1 ? symbol : (baseSeq + (symbol << 8)); + return seq + (nbBits << 16) + ((U32)level << 24); + } else { + seq = level == 1 ? (symbol << 8) : ((baseSeq << 8) + symbol); + return (seq << 16) + (nbBits << 8) + (U32)level; + } +} + +/** + * Constructs a HUF_DEltX2. + */ +static HUF_DEltX2 HUF_buildDEltX2(U32 symbol, U32 nbBits, U32 baseSeq, int level) +{ + HUF_DEltX2 DElt; + U32 const val = HUF_buildDEltX2U32(symbol, nbBits, baseSeq, level); + DEBUG_STATIC_ASSERT(sizeof(DElt) == sizeof(val)); + ZSTD_memcpy(&DElt, &val, sizeof(val)); + return DElt; +} + +/** + * Constructs 2 HUF_DEltX2s and packs them into a U64. + */ +static U64 HUF_buildDEltX2U64(U32 symbol, U32 nbBits, U16 baseSeq, int level) +{ + U32 DElt = HUF_buildDEltX2U32(symbol, nbBits, baseSeq, level); + return (U64)DElt + ((U64)DElt << 32); +} + +/** + * Fills the DTable rank with all the symbols from [begin, end) that are each + * nbBits long. + * + * @param DTableRank The start of the rank in the DTable. + * @param begin The first symbol to fill (inclusive). + * @param end The last symbol to fill (exclusive). + * @param nbBits Each symbol is nbBits long. + * @param tableLog The table log. + * @param baseSeq If level == 1 { 0 } else { the first level symbol } + * @param level The level in the table. Must be 1 or 2. + */ +static void HUF_fillDTableX2ForWeight( + HUF_DEltX2* DTableRank, + sortedSymbol_t const* begin, sortedSymbol_t const* end, + U32 nbBits, U32 tableLog, + U16 baseSeq, int const level) +{ + U32 const length = 1U << ((tableLog - nbBits) & 0x1F /* quiet static-analyzer */); + const sortedSymbol_t* ptr; + assert(level >= 1 && level <= 2); + switch (length) { + case 1: + for (ptr = begin; ptr != end; ++ptr) { + HUF_DEltX2 const DElt = HUF_buildDEltX2(ptr->symbol, nbBits, baseSeq, level); + *DTableRank++ = DElt; + } + break; + case 2: + for (ptr = begin; ptr != end; ++ptr) { + HUF_DEltX2 const DElt = HUF_buildDEltX2(ptr->symbol, nbBits, baseSeq, level); + DTableRank[0] = DElt; + DTableRank[1] = DElt; + DTableRank += 2; + } + break; + case 4: + for (ptr = begin; ptr != end; ++ptr) { + U64 const DEltX2 = HUF_buildDEltX2U64(ptr->symbol, nbBits, baseSeq, level); + ZSTD_memcpy(DTableRank + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 2, &DEltX2, sizeof(DEltX2)); + DTableRank += 4; + } + break; + case 8: + for (ptr = begin; ptr != end; ++ptr) { + U64 const DEltX2 = HUF_buildDEltX2U64(ptr->symbol, nbBits, baseSeq, level); + ZSTD_memcpy(DTableRank + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 2, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 4, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 6, &DEltX2, sizeof(DEltX2)); + DTableRank += 8; + } + break; + default: + for (ptr = begin; ptr != end; ++ptr) { + U64 const DEltX2 = HUF_buildDEltX2U64(ptr->symbol, nbBits, baseSeq, level); + HUF_DEltX2* const DTableRankEnd = DTableRank + length; + for (; DTableRank != DTableRankEnd; DTableRank += 8) { + ZSTD_memcpy(DTableRank + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 2, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 4, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 6, &DEltX2, sizeof(DEltX2)); + } + } + break; + } +} + +/* HUF_fillDTableX2Level2() : + * `rankValOrigin` must be a table of at least (HUF_TABLELOG_MAX + 1) U32 */ +static void HUF_fillDTableX2Level2(HUF_DEltX2* DTable, U32 targetLog, const U32 consumedBits, + const U32* rankVal, const int minWeight, const int maxWeight1, + const sortedSymbol_t* sortedSymbols, U32 const* rankStart, + U32 nbBitsBaseline, U16 baseSeq) +{ + /* Fill skipped values (all positions up to rankVal[minWeight]). + * These are positions only get a single symbol because the combined weight + * is too large. + */ + if (minWeight>1) { + U32 const length = 1U << ((targetLog - consumedBits) & 0x1F /* quiet static-analyzer */); + U64 const DEltX2 = HUF_buildDEltX2U64(baseSeq, consumedBits, /* baseSeq */ 0, /* level */ 1); + int const skipSize = rankVal[minWeight]; + assert(length > 1); + assert((U32)skipSize < length); + switch (length) { + case 2: + assert(skipSize == 1); + ZSTD_memcpy(DTable, &DEltX2, sizeof(DEltX2)); + break; + case 4: + assert(skipSize <= 4); + ZSTD_memcpy(DTable + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + 2, &DEltX2, sizeof(DEltX2)); + break; + default: + { + int i; + for (i = 0; i < skipSize; i += 8) { + ZSTD_memcpy(DTable + i + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + i + 2, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + i + 4, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + i + 6, &DEltX2, sizeof(DEltX2)); + } + } + } + } + + /* Fill each of the second level symbols by weight. */ + { + int w; + for (w = minWeight; w < maxWeight1; ++w) { + int const begin = rankStart[w]; + int const end = rankStart[w+1]; + U32 const nbBits = nbBitsBaseline - w; + U32 const totalBits = nbBits + consumedBits; + HUF_fillDTableX2ForWeight( + DTable + rankVal[w], + sortedSymbols + begin, sortedSymbols + end, + totalBits, targetLog, + baseSeq, /* level */ 2); + } + } +} + +static void HUF_fillDTableX2(HUF_DEltX2* DTable, const U32 targetLog, + const sortedSymbol_t* sortedList, + const U32* rankStart, rankValCol_t* rankValOrigin, const U32 maxWeight, + const U32 nbBitsBaseline) +{ + U32* const rankVal = rankValOrigin[0]; + const int scaleLog = nbBitsBaseline - targetLog; /* note : targetLog >= srcLog, hence scaleLog <= 1 */ + const U32 minBits = nbBitsBaseline - maxWeight; + int w; + int const wEnd = (int)maxWeight + 1; + + /* Fill DTable in order of weight. */ + for (w = 1; w < wEnd; ++w) { + int const begin = (int)rankStart[w]; + int const end = (int)rankStart[w+1]; + U32 const nbBits = nbBitsBaseline - w; + + if (targetLog-nbBits >= minBits) { + /* Enough room for a second symbol. */ + int start = rankVal[w]; + U32 const length = 1U << ((targetLog - nbBits) & 0x1F /* quiet static-analyzer */); + int minWeight = nbBits + scaleLog; + int s; + if (minWeight < 1) minWeight = 1; + /* Fill the DTable for every symbol of weight w. + * These symbols get at least 1 second symbol. + */ + for (s = begin; s != end; ++s) { + HUF_fillDTableX2Level2( + DTable + start, targetLog, nbBits, + rankValOrigin[nbBits], minWeight, wEnd, + sortedList, rankStart, + nbBitsBaseline, sortedList[s].symbol); + start += length; + } + } else { + /* Only a single symbol. */ + HUF_fillDTableX2ForWeight( + DTable + rankVal[w], + sortedList + begin, sortedList + end, + nbBits, targetLog, + /* baseSeq */ 0, /* level */ 1); + } + } +} + +typedef struct { + rankValCol_t rankVal[HUF_TABLELOG_MAX]; + U32 rankStats[HUF_TABLELOG_MAX + 1]; + U32 rankStart0[HUF_TABLELOG_MAX + 3]; + sortedSymbol_t sortedSymbol[HUF_SYMBOLVALUE_MAX + 1]; + BYTE weightList[HUF_SYMBOLVALUE_MAX + 1]; + U32 calleeWksp[HUF_READ_STATS_WORKSPACE_SIZE_U32]; +} HUF_ReadDTableX2_Workspace; + +size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, + const void* src, size_t srcSize, + void* workSpace, size_t wkspSize, int flags) +{ + U32 tableLog, maxW, nbSymbols; + DTableDesc dtd = HUF_getDTableDesc(DTable); + U32 maxTableLog = dtd.maxTableLog; + size_t iSize; + void* dtPtr = DTable+1; /* force compiler to avoid strict-aliasing */ + HUF_DEltX2* const dt = (HUF_DEltX2*)dtPtr; + U32 *rankStart; + + HUF_ReadDTableX2_Workspace* const wksp = (HUF_ReadDTableX2_Workspace*)workSpace; + + if (sizeof(*wksp) > wkspSize) return ERROR(GENERIC); + + rankStart = wksp->rankStart0 + 1; + ZSTD_memset(wksp->rankStats, 0, sizeof(wksp->rankStats)); + ZSTD_memset(wksp->rankStart0, 0, sizeof(wksp->rankStart0)); + + DEBUG_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(HUF_DTable)); /* if compiler fails here, assertion is wrong */ + if (maxTableLog > HUF_TABLELOG_MAX) return ERROR(tableLog_tooLarge); + /* ZSTD_memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */ + + iSize = HUF_readStats_wksp(wksp->weightList, HUF_SYMBOLVALUE_MAX + 1, wksp->rankStats, &nbSymbols, &tableLog, src, srcSize, wksp->calleeWksp, sizeof(wksp->calleeWksp), flags); + if (HUF_isError(iSize)) return iSize; + + /* check result */ + if (tableLog > maxTableLog) return ERROR(tableLog_tooLarge); /* DTable can't fit code depth */ + if (tableLog <= HUF_DECODER_FAST_TABLELOG && maxTableLog > HUF_DECODER_FAST_TABLELOG) maxTableLog = HUF_DECODER_FAST_TABLELOG; + + /* find maxWeight */ + for (maxW = tableLog; wksp->rankStats[maxW]==0; maxW--) {} /* necessarily finds a solution before 0 */ + + /* Get start index of each weight */ + { U32 w, nextRankStart = 0; + for (w=1; wrankStats[w]; + rankStart[w] = curr; + } + rankStart[0] = nextRankStart; /* put all 0w symbols at the end of sorted list*/ + rankStart[maxW+1] = nextRankStart; + } + + /* sort symbols by weight */ + { U32 s; + for (s=0; sweightList[s]; + U32 const r = rankStart[w]++; + wksp->sortedSymbol[r].symbol = (BYTE)s; + } + rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */ + } + + /* Build rankVal */ + { U32* const rankVal0 = wksp->rankVal[0]; + { int const rescale = (maxTableLog-tableLog) - 1; /* tableLog <= maxTableLog */ + U32 nextRankVal = 0; + U32 w; + for (w=1; wrankStats[w] << (w+rescale); + rankVal0[w] = curr; + } } + { U32 const minBits = tableLog+1 - maxW; + U32 consumed; + for (consumed = minBits; consumed < maxTableLog - minBits + 1; consumed++) { + U32* const rankValPtr = wksp->rankVal[consumed]; + U32 w; + for (w = 1; w < maxW+1; w++) { + rankValPtr[w] = rankVal0[w] >> consumed; + } } } } + + HUF_fillDTableX2(dt, maxTableLog, + wksp->sortedSymbol, + wksp->rankStart0, wksp->rankVal, maxW, + tableLog+1); + + dtd.tableLog = (BYTE)maxTableLog; + dtd.tableType = 1; + ZSTD_memcpy(DTable, &dtd, sizeof(dtd)); + return iSize; +} + + +FORCE_INLINE_TEMPLATE U32 +HUF_decodeSymbolX2(void* op, BIT_DStream_t* DStream, const HUF_DEltX2* dt, const U32 dtLog) +{ + size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */ + ZSTD_memcpy(op, &dt[val].sequence, 2); + BIT_skipBits(DStream, dt[val].nbBits); + return dt[val].length; +} + +FORCE_INLINE_TEMPLATE U32 +HUF_decodeLastSymbolX2(void* op, BIT_DStream_t* DStream, const HUF_DEltX2* dt, const U32 dtLog) +{ + size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */ + ZSTD_memcpy(op, &dt[val].sequence, 1); + if (dt[val].length==1) { + BIT_skipBits(DStream, dt[val].nbBits); + } else { + if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8)) { + BIT_skipBits(DStream, dt[val].nbBits); + if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8)) + /* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */ + DStream->bitsConsumed = (sizeof(DStream->bitContainer)*8); + } + } + return 1; +} + +#define HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr) \ + ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog) + +#define HUF_DECODE_SYMBOLX2_1(ptr, DStreamPtr) \ + if (MEM_64bits() || (HUF_TABLELOG_MAX<=12)) \ + ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog) + +#define HUF_DECODE_SYMBOLX2_2(ptr, DStreamPtr) \ + if (MEM_64bits()) \ + ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog) + +HINT_INLINE size_t +HUF_decodeStreamX2(BYTE* p, BIT_DStream_t* bitDPtr, BYTE* const pEnd, + const HUF_DEltX2* const dt, const U32 dtLog) +{ + BYTE* const pStart = p; + + /* up to 8 symbols at a time */ + if ((size_t)(pEnd - p) >= sizeof(bitDPtr->bitContainer)) { + if (dtLog <= 11 && MEM_64bits()) { + /* up to 10 symbols at a time */ + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-9)) { + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + } + } else { + /* up to 8 symbols at a time */ + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-(sizeof(bitDPtr->bitContainer)-1))) { + HUF_DECODE_SYMBOLX2_2(p, bitDPtr); + HUF_DECODE_SYMBOLX2_1(p, bitDPtr); + HUF_DECODE_SYMBOLX2_2(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + } + } + } else { + BIT_reloadDStream(bitDPtr); + } + + /* closer to end : up to 2 symbols at a time */ + if ((size_t)(pEnd - p) >= 2) { + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p <= pEnd-2)) + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + + while (p <= pEnd-2) + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); /* no need to reload : reached the end of DStream */ + } + + if (p < pEnd) + p += HUF_decodeLastSymbolX2(p, bitDPtr, dt, dtLog); + + return p-pStart; +} + +FORCE_INLINE_TEMPLATE size_t +HUF_decompress1X2_usingDTable_internal_body( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + BIT_DStream_t bitD; + + /* Init */ + CHECK_F( BIT_initDStream(&bitD, cSrc, cSrcSize) ); + + /* decode */ + { BYTE* const ostart = (BYTE*) dst; + BYTE* const oend = ostart + dstSize; + const void* const dtPtr = DTable+1; /* force compiler to not use strict-aliasing */ + const HUF_DEltX2* const dt = (const HUF_DEltX2*)dtPtr; + DTableDesc const dtd = HUF_getDTableDesc(DTable); + HUF_decodeStreamX2(ostart, &bitD, oend, dt, dtd.tableLog); + } + + /* check */ + if (!BIT_endOfDStream(&bitD)) return ERROR(corruption_detected); + + /* decoded size */ + return dstSize; +} + +/* HUF_decompress4X2_usingDTable_internal_body(): + * Conditions: + * @dstSize >= 6 + */ +FORCE_INLINE_TEMPLATE size_t +HUF_decompress4X2_usingDTable_internal_body( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */ + + { const BYTE* const istart = (const BYTE*) cSrc; + BYTE* const ostart = (BYTE*) dst; + BYTE* const oend = ostart + dstSize; + BYTE* const olimit = oend - (sizeof(size_t)-1); + const void* const dtPtr = DTable+1; + const HUF_DEltX2* const dt = (const HUF_DEltX2*)dtPtr; + + /* Init */ + BIT_DStream_t bitD1; + BIT_DStream_t bitD2; + BIT_DStream_t bitD3; + BIT_DStream_t bitD4; + size_t const length1 = MEM_readLE16(istart); + size_t const length2 = MEM_readLE16(istart+2); + size_t const length3 = MEM_readLE16(istart+4); + size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6); + const BYTE* const istart1 = istart + 6; /* jumpTable */ + const BYTE* const istart2 = istart1 + length1; + const BYTE* const istart3 = istart2 + length2; + const BYTE* const istart4 = istart3 + length3; + size_t const segmentSize = (dstSize+3) / 4; + BYTE* const opStart2 = ostart + segmentSize; + BYTE* const opStart3 = opStart2 + segmentSize; + BYTE* const opStart4 = opStart3 + segmentSize; + BYTE* op1 = ostart; + BYTE* op2 = opStart2; + BYTE* op3 = opStart3; + BYTE* op4 = opStart4; + U32 endSignal = 1; + DTableDesc const dtd = HUF_getDTableDesc(DTable); + U32 const dtLog = dtd.tableLog; + + if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */ + if (opStart4 > oend) return ERROR(corruption_detected); /* overflow */ + if (dstSize < 6) return ERROR(corruption_detected); /* stream 4-split doesn't work */ + CHECK_F( BIT_initDStream(&bitD1, istart1, length1) ); + CHECK_F( BIT_initDStream(&bitD2, istart2, length2) ); + CHECK_F( BIT_initDStream(&bitD3, istart3, length3) ); + CHECK_F( BIT_initDStream(&bitD4, istart4, length4) ); + + /* 16-32 symbols per loop (4-8 symbols per stream) */ + if ((size_t)(oend - op4) >= sizeof(size_t)) { + for ( ; (endSignal) & (op4 < olimit); ) { +#if defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_1(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_0(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_1(op2, &bitD2); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_0(op2, &bitD2); + endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_1(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_0(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_1(op4, &bitD4); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_0(op4, &bitD4); + endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; +#else + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_1(op1, &bitD1); + HUF_DECODE_SYMBOLX2_1(op2, &bitD2); + HUF_DECODE_SYMBOLX2_1(op3, &bitD3); + HUF_DECODE_SYMBOLX2_1(op4, &bitD4); + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_0(op1, &bitD1); + HUF_DECODE_SYMBOLX2_0(op2, &bitD2); + HUF_DECODE_SYMBOLX2_0(op3, &bitD3); + HUF_DECODE_SYMBOLX2_0(op4, &bitD4); + endSignal = (U32)LIKELY((U32) + (BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished)); +#endif + } + } + + /* check corruption */ + if (op1 > opStart2) return ERROR(corruption_detected); + if (op2 > opStart3) return ERROR(corruption_detected); + if (op3 > opStart4) return ERROR(corruption_detected); + /* note : op4 already verified within main loop */ + + /* finish bitStreams one by one */ + HUF_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog); + HUF_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog); + HUF_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog); + HUF_decodeStreamX2(op4, &bitD4, oend, dt, dtLog); + + /* check */ + { U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4); + if (!endCheck) return ERROR(corruption_detected); } + + /* decoded size */ + return dstSize; + } +} + +#if HUF_NEED_BMI2_FUNCTION +static BMI2_TARGET_ATTRIBUTE +size_t HUF_decompress4X2_usingDTable_internal_bmi2(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X2_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} +#endif + +static +size_t HUF_decompress4X2_usingDTable_internal_default(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X2_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 + +HUF_ASM_DECL void HUF_decompress4X2_usingDTable_internal_fast_asm_loop(HUF_DecompressFastArgs* args) ZSTDLIB_HIDDEN; + +#endif + +static HUF_FAST_BMI2_ATTRS +void HUF_decompress4X2_usingDTable_internal_fast_c_loop(HUF_DecompressFastArgs* args) +{ + U64 bits[4]; + BYTE const* ip[4]; + BYTE* op[4]; + BYTE* oend[4]; + HUF_DEltX2 const* const dtable = (HUF_DEltX2 const*)args->dt; + BYTE const* const ilimit = args->ilimit; + + /* Copy the arguments to local registers. */ + ZSTD_memcpy(&bits, &args->bits, sizeof(bits)); + ZSTD_memcpy((void*)(&ip), &args->ip, sizeof(ip)); + ZSTD_memcpy(&op, &args->op, sizeof(op)); + + oend[0] = op[1]; + oend[1] = op[2]; + oend[2] = op[3]; + oend[3] = args->oend; + + assert(MEM_isLittleEndian()); + assert(!MEM_32bits()); + + for (;;) { + BYTE* olimit; + int stream; + int symbol; + + /* Assert loop preconditions */ +#ifndef NDEBUG + for (stream = 0; stream < 4; ++stream) { + assert(op[stream] <= oend[stream]); + assert(ip[stream] >= ilimit); + } +#endif + /* Compute olimit */ + { + /* Each loop does 5 table lookups for each of the 4 streams. + * Each table lookup consumes up to 11 bits of input, and produces + * up to 2 bytes of output. + */ + /* We can consume up to 7 bytes of input per iteration per stream. + * We also know that each input pointer is >= ip[0]. So we can run + * iters loops before running out of input. + */ + size_t iters = (size_t)(ip[0] - ilimit) / 7; + /* Each iteration can produce up to 10 bytes of output per stream. + * Each output stream my advance at different rates. So take the + * minimum number of safe iterations among all the output streams. + */ + for (stream = 0; stream < 4; ++stream) { + size_t const oiters = (size_t)(oend[stream] - op[stream]) / 10; + iters = MIN(iters, oiters); + } + + /* Each iteration produces at least 5 output symbols. So until + * op[3] crosses olimit, we know we haven't executed iters + * iterations yet. This saves us maintaining an iters counter, + * at the expense of computing the remaining # of iterations + * more frequently. + */ + olimit = op[3] + (iters * 5); + + /* Exit the fast decoding loop if we are too close to the end. */ + if (op[3] + 10 > olimit) + break; + + /* Exit the decoding loop if any input pointer has crossed the + * previous one. This indicates corruption, and a precondition + * to our loop is that ip[i] >= ip[0]. + */ + for (stream = 1; stream < 4; ++stream) { + if (ip[stream] < ip[stream - 1]) + goto _out; + } + } + +#ifndef NDEBUG + for (stream = 1; stream < 4; ++stream) { + assert(ip[stream] >= ip[stream - 1]); + } +#endif + + do { + /* Do 5 table lookups for each of the first 3 streams */ + for (symbol = 0; symbol < 5; ++symbol) { + for (stream = 0; stream < 3; ++stream) { + int const index = (int)(bits[stream] >> 53); + HUF_DEltX2 const entry = dtable[index]; + MEM_write16(op[stream], entry.sequence); + bits[stream] <<= (entry.nbBits); + op[stream] += (entry.length); + } + } + /* Do 1 table lookup from the final stream */ + { + int const index = (int)(bits[3] >> 53); + HUF_DEltX2 const entry = dtable[index]; + MEM_write16(op[3], entry.sequence); + bits[3] <<= (entry.nbBits); + op[3] += (entry.length); + } + /* Do 4 table lookups from the final stream & reload bitstreams */ + for (stream = 0; stream < 4; ++stream) { + /* Do a table lookup from the final stream. + * This is interleaved with the reloading to reduce register + * pressure. This shouldn't be necessary, but compilers can + * struggle with codegen with high register pressure. + */ + { + int const index = (int)(bits[3] >> 53); + HUF_DEltX2 const entry = dtable[index]; + MEM_write16(op[3], entry.sequence); + bits[3] <<= (entry.nbBits); + op[3] += (entry.length); + } + /* Reload the bistreams. The final bitstream must be reloaded + * after the 5th symbol was decoded. + */ + { + int const ctz = ZSTD_countTrailingZeros64(bits[stream]); + int const nbBits = ctz & 7; + int const nbBytes = ctz >> 3; + ip[stream] -= nbBytes; + bits[stream] = MEM_read64(ip[stream]) | 1; + bits[stream] <<= nbBits; + } + } + } while (op[3] < olimit); + } + +_out: + + /* Save the final values of each of the state variables back to args. */ + ZSTD_memcpy(&args->bits, &bits, sizeof(bits)); + ZSTD_memcpy((void*)(&args->ip), &ip, sizeof(ip)); + ZSTD_memcpy(&args->op, &op, sizeof(op)); +} + + +static HUF_FAST_BMI2_ATTRS size_t +HUF_decompress4X2_usingDTable_internal_fast( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable, + HUF_DecompressFastLoopFn loopFn) { + void const* dt = DTable + 1; + const BYTE* const iend = (const BYTE*)cSrc + 6; + BYTE* const oend = (BYTE*)dst + dstSize; + HUF_DecompressFastArgs args; + { + size_t const ret = HUF_DecompressFastArgs_init(&args, dst, dstSize, cSrc, cSrcSize, DTable); + FORWARD_IF_ERROR(ret, "Failed to init asm args"); + if (ret == 0) + return 0; + } + + assert(args.ip[0] >= args.ilimit); + loopFn(&args); + + /* note : op4 already verified within main loop */ + assert(args.ip[0] >= iend); + assert(args.ip[1] >= iend); + assert(args.ip[2] >= iend); + assert(args.ip[3] >= iend); + assert(args.op[3] <= oend); + (void)iend; + + /* finish bitStreams one by one */ + { + size_t const segmentSize = (dstSize+3) / 4; + BYTE* segmentEnd = (BYTE*)dst; + int i; + for (i = 0; i < 4; ++i) { + BIT_DStream_t bit; + if (segmentSize <= (size_t)(oend - segmentEnd)) + segmentEnd += segmentSize; + else + segmentEnd = oend; + FORWARD_IF_ERROR(HUF_initRemainingDStream(&bit, &args, i, segmentEnd), "corruption"); + args.op[i] += HUF_decodeStreamX2(args.op[i], &bit, segmentEnd, (HUF_DEltX2 const*)dt, HUF_DECODER_FAST_TABLELOG); + if (args.op[i] != segmentEnd) + return ERROR(corruption_detected); + } + } + + /* decoded size */ + return dstSize; +} + +static size_t HUF_decompress4X2_usingDTable_internal(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable, int flags) +{ + HUF_DecompressUsingDTableFn fallbackFn = HUF_decompress4X2_usingDTable_internal_default; + HUF_DecompressFastLoopFn loopFn = HUF_decompress4X2_usingDTable_internal_fast_c_loop; + +#if DYNAMIC_BMI2 + if (flags & HUF_flags_bmi2) { + fallbackFn = HUF_decompress4X2_usingDTable_internal_bmi2; +# if ZSTD_ENABLE_ASM_X86_64_BMI2 + if (!(flags & HUF_flags_disableAsm)) { + loopFn = HUF_decompress4X2_usingDTable_internal_fast_asm_loop; + } +# endif + } else { + return fallbackFn(dst, dstSize, cSrc, cSrcSize, DTable); + } +#endif + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__) + if (!(flags & HUF_flags_disableAsm)) { + loopFn = HUF_decompress4X2_usingDTable_internal_fast_asm_loop; + } +#endif + + if (!(flags & HUF_flags_disableFast)) { + size_t const ret = HUF_decompress4X2_usingDTable_internal_fast(dst, dstSize, cSrc, cSrcSize, DTable, loopFn); + if (ret != 0) + return ret; + } + return fallbackFn(dst, dstSize, cSrc, cSrcSize, DTable); +} + +HUF_DGEN(HUF_decompress1X2_usingDTable_internal) + +size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* DCtx, void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + void* workSpace, size_t wkspSize, int flags) +{ + const BYTE* ip = (const BYTE*) cSrc; + + size_t const hSize = HUF_readDTableX2_wksp(DCtx, cSrc, cSrcSize, + workSpace, wkspSize, flags); + if (HUF_isError(hSize)) return hSize; + if (hSize >= cSrcSize) return ERROR(srcSize_wrong); + ip += hSize; cSrcSize -= hSize; + + return HUF_decompress1X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, DCtx, flags); +} + +static size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + void* workSpace, size_t wkspSize, int flags) +{ + const BYTE* ip = (const BYTE*) cSrc; + + size_t hSize = HUF_readDTableX2_wksp(dctx, cSrc, cSrcSize, + workSpace, wkspSize, flags); + if (HUF_isError(hSize)) return hSize; + if (hSize >= cSrcSize) return ERROR(srcSize_wrong); + ip += hSize; cSrcSize -= hSize; + + return HUF_decompress4X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, flags); +} + +#endif /* HUF_FORCE_DECOMPRESS_X1 */ + + +/* ***********************************/ +/* Universal decompression selectors */ +/* ***********************************/ + + +#if !defined(HUF_FORCE_DECOMPRESS_X1) && !defined(HUF_FORCE_DECOMPRESS_X2) +typedef struct { U32 tableTime; U32 decode256Time; } algo_time_t; +static const algo_time_t algoTime[16 /* Quantization */][2 /* single, double */] = +{ + /* single, double, quad */ + {{0,0}, {1,1}}, /* Q==0 : impossible */ + {{0,0}, {1,1}}, /* Q==1 : impossible */ + {{ 150,216}, { 381,119}}, /* Q == 2 : 12-18% */ + {{ 170,205}, { 514,112}}, /* Q == 3 : 18-25% */ + {{ 177,199}, { 539,110}}, /* Q == 4 : 25-32% */ + {{ 197,194}, { 644,107}}, /* Q == 5 : 32-38% */ + {{ 221,192}, { 735,107}}, /* Q == 6 : 38-44% */ + {{ 256,189}, { 881,106}}, /* Q == 7 : 44-50% */ + {{ 359,188}, {1167,109}}, /* Q == 8 : 50-56% */ + {{ 582,187}, {1570,114}}, /* Q == 9 : 56-62% */ + {{ 688,187}, {1712,122}}, /* Q ==10 : 62-69% */ + {{ 825,186}, {1965,136}}, /* Q ==11 : 69-75% */ + {{ 976,185}, {2131,150}}, /* Q ==12 : 75-81% */ + {{1180,186}, {2070,175}}, /* Q ==13 : 81-87% */ + {{1377,185}, {1731,202}}, /* Q ==14 : 87-93% */ + {{1412,185}, {1695,202}}, /* Q ==15 : 93-99% */ +}; +#endif + +/** HUF_selectDecoder() : + * Tells which decoder is likely to decode faster, + * based on a set of pre-computed metrics. + * @return : 0==HUF_decompress4X1, 1==HUF_decompress4X2 . + * Assumption : 0 < dstSize <= 128 KB */ +U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize) +{ + assert(dstSize > 0); + assert(dstSize <= 128*1024); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)dstSize; + (void)cSrcSize; + return 0; +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)dstSize; + (void)cSrcSize; + return 1; +#else + /* decoder timing evaluation */ + { U32 const Q = (cSrcSize >= dstSize) ? 15 : (U32)(cSrcSize * 16 / dstSize); /* Q < 16 */ + U32 const D256 = (U32)(dstSize >> 8); + U32 const DTime0 = algoTime[Q][0].tableTime + (algoTime[Q][0].decode256Time * D256); + U32 DTime1 = algoTime[Q][1].tableTime + (algoTime[Q][1].decode256Time * D256); + DTime1 += DTime1 >> 5; /* small advantage to algorithm using less memory, to reduce cache eviction */ + return DTime1 < DTime0; + } +#endif +} + +size_t HUF_decompress1X_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + void* workSpace, size_t wkspSize, int flags) +{ + /* validation checks */ + if (dstSize == 0) return ERROR(dstSize_tooSmall); + if (cSrcSize > dstSize) return ERROR(corruption_detected); /* invalid */ + if (cSrcSize == dstSize) { ZSTD_memcpy(dst, cSrc, dstSize); return dstSize; } /* not compressed */ + if (cSrcSize == 1) { ZSTD_memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */ + + { U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)algoNb; + assert(algoNb == 0); + return HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc, + cSrcSize, workSpace, wkspSize, flags); +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)algoNb; + assert(algoNb == 1); + return HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc, + cSrcSize, workSpace, wkspSize, flags); +#else + return algoNb ? HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc, + cSrcSize, workSpace, wkspSize, flags): + HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc, + cSrcSize, workSpace, wkspSize, flags); +#endif + } +} + + +size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int flags) +{ + DTableDesc const dtd = HUF_getDTableDesc(DTable); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)dtd; + assert(dtd.tableType == 0); + return HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)dtd; + assert(dtd.tableType == 1); + return HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#else + return dtd.tableType ? HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags) : + HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#endif +} + +#ifndef HUF_FORCE_DECOMPRESS_X2 +size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags) +{ + const BYTE* ip = (const BYTE*) cSrc; + + size_t const hSize = HUF_readDTableX1_wksp(dctx, cSrc, cSrcSize, workSpace, wkspSize, flags); + if (HUF_isError(hSize)) return hSize; + if (hSize >= cSrcSize) return ERROR(srcSize_wrong); + ip += hSize; cSrcSize -= hSize; + + return HUF_decompress1X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, flags); +} +#endif + +size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int flags) +{ + DTableDesc const dtd = HUF_getDTableDesc(DTable); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)dtd; + assert(dtd.tableType == 0); + return HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)dtd; + assert(dtd.tableType == 1); + return HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#else + return dtd.tableType ? HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags) : + HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, flags); +#endif +} + +size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int flags) +{ + /* validation checks */ + if (dstSize == 0) return ERROR(dstSize_tooSmall); + if (cSrcSize == 0) return ERROR(corruption_detected); + + { U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize); +#if defined(HUF_FORCE_DECOMPRESS_X1) + (void)algoNb; + assert(algoNb == 0); + return HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, flags); +#elif defined(HUF_FORCE_DECOMPRESS_X2) + (void)algoNb; + assert(algoNb == 1); + return HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, flags); +#else + return algoNb ? HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, flags) : + HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, flags); +#endif + } +} +/**** ended inlining decompress/huf_decompress.c ****/ +/**** start inlining decompress/zstd_ddict.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* zstd_ddict.c : + * concentrates all logic that needs to know the internals of ZSTD_DDict object */ + +/*-******************************************************* +* Dependencies +*********************************************************/ +/**** start inlining ../common/allocations.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* This file provides custom allocation primitives + */ + +#define ZSTD_DEPS_NEED_MALLOC +/**** skipping file: zstd_deps.h ****/ + +/**** skipping file: mem.h ****/ +#define ZSTD_STATIC_LINKING_ONLY +/**** skipping file: ../zstd.h ****/ + +#ifndef ZSTD_ALLOCATIONS_H +#define ZSTD_ALLOCATIONS_H + +/* custom memory allocation functions */ + +MEM_STATIC void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem) +{ + if (customMem.customAlloc) + return customMem.customAlloc(customMem.opaque, size); + return ZSTD_malloc(size); +} + +MEM_STATIC void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem) +{ + if (customMem.customAlloc) { + /* calloc implemented as malloc+memset; + * not as efficient as calloc, but next best guess for custom malloc */ + void* const ptr = customMem.customAlloc(customMem.opaque, size); + ZSTD_memset(ptr, 0, size); + return ptr; + } + return ZSTD_calloc(1, size); +} + +MEM_STATIC void ZSTD_customFree(void* ptr, ZSTD_customMem customMem) +{ + if (ptr!=NULL) { + if (customMem.customFree) + customMem.customFree(customMem.opaque, ptr); + else + ZSTD_free(ptr); + } +} + +#endif /* ZSTD_ALLOCATIONS_H */ +/**** ended inlining ../common/allocations.h ****/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../common/cpu.h ****/ +/**** skipping file: ../common/mem.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/huf.h ****/ +/**** start inlining zstd_decompress_internal.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + +/* zstd_decompress_internal: + * objects and definitions shared within lib/decompress modules */ + + #ifndef ZSTD_DECOMPRESS_INTERNAL_H + #define ZSTD_DECOMPRESS_INTERNAL_H + + +/*-******************************************************* + * Dependencies + *********************************************************/ +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ + + + +/*-******************************************************* + * Constants + *********************************************************/ +static UNUSED_ATTR const U32 LL_base[MaxLL+1] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 18, 20, 22, 24, 28, 32, 40, + 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, + 0x2000, 0x4000, 0x8000, 0x10000 }; + +static UNUSED_ATTR const U32 OF_base[MaxOff+1] = { + 0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D, + 0xFD, 0x1FD, 0x3FD, 0x7FD, 0xFFD, 0x1FFD, 0x3FFD, 0x7FFD, + 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD, + 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD }; + +static UNUSED_ATTR const U8 OF_bits[MaxOff+1] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31 }; + +static UNUSED_ATTR const U32 ML_base[MaxML+1] = { + 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, + 35, 37, 39, 41, 43, 47, 51, 59, + 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803, + 0x1003, 0x2003, 0x4003, 0x8003, 0x10003 }; + + +/*-******************************************************* + * Decompression types + *********************************************************/ + typedef struct { + U32 fastMode; + U32 tableLog; + } ZSTD_seqSymbol_header; + + typedef struct { + U16 nextState; + BYTE nbAdditionalBits; + BYTE nbBits; + U32 baseValue; + } ZSTD_seqSymbol; + + #define SEQSYMBOL_TABLE_SIZE(log) (1 + (1 << (log))) + +#define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE (sizeof(S16) * (MaxSeq + 1) + (1u << MaxFSELog) + sizeof(U64)) +#define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32 ((ZSTD_BUILD_FSE_TABLE_WKSP_SIZE + sizeof(U32) - 1) / sizeof(U32)) +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12 + +typedef struct { + ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)]; /* Note : Space reserved for FSE Tables */ + ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)]; /* is also used as temporary workspace while building hufTable during DDict creation */ + ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)]; /* and therefore must be at least HUF_DECOMPRESS_WORKSPACE_SIZE large */ + HUF_DTable hufTable[HUF_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)]; /* can accommodate HUF_decompress4X */ + U32 rep[ZSTD_REP_NUM]; + U32 workspace[ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32]; +} ZSTD_entropyDTables_t; + +typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader, + ZSTDds_decodeBlockHeader, ZSTDds_decompressBlock, + ZSTDds_decompressLastBlock, ZSTDds_checkChecksum, + ZSTDds_decodeSkippableHeader, ZSTDds_skipFrame } ZSTD_dStage; + +typedef enum { zdss_init=0, zdss_loadHeader, + zdss_read, zdss_load, zdss_flush } ZSTD_dStreamStage; + +typedef enum { + ZSTD_use_indefinitely = -1, /* Use the dictionary indefinitely */ + ZSTD_dont_use = 0, /* Do not use the dictionary (if one exists free it) */ + ZSTD_use_once = 1 /* Use the dictionary once and set to ZSTD_dont_use */ +} ZSTD_dictUses_e; + +/* Hashset for storing references to multiple ZSTD_DDict within ZSTD_DCtx */ +typedef struct { + const ZSTD_DDict** ddictPtrTable; + size_t ddictPtrTableSize; + size_t ddictPtrCount; +} ZSTD_DDictHashSet; + +#ifndef ZSTD_DECODER_INTERNAL_BUFFER +# define ZSTD_DECODER_INTERNAL_BUFFER (1 << 16) +#endif + +#define ZSTD_LBMIN 64 +#define ZSTD_LBMAX (128 << 10) + +/* extra buffer, compensates when dst is not large enough to store litBuffer */ +#define ZSTD_LITBUFFEREXTRASIZE BOUNDED(ZSTD_LBMIN, ZSTD_DECODER_INTERNAL_BUFFER, ZSTD_LBMAX) + +typedef enum { + ZSTD_not_in_dst = 0, /* Stored entirely within litExtraBuffer */ + ZSTD_in_dst = 1, /* Stored entirely within dst (in memory after current output write) */ + ZSTD_split = 2 /* Split between litExtraBuffer and dst */ +} ZSTD_litLocation_e; + +struct ZSTD_DCtx_s +{ + const ZSTD_seqSymbol* LLTptr; + const ZSTD_seqSymbol* MLTptr; + const ZSTD_seqSymbol* OFTptr; + const HUF_DTable* HUFptr; + ZSTD_entropyDTables_t entropy; + U32 workspace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32]; /* space needed when building huffman tables */ + const void* previousDstEnd; /* detect continuity */ + const void* prefixStart; /* start of current segment */ + const void* virtualStart; /* virtual start of previous segment if it was just before current one */ + const void* dictEnd; /* end of previous segment */ + size_t expected; + ZSTD_frameHeader fParams; + U64 processedCSize; + U64 decodedSize; + blockType_e bType; /* used in ZSTD_decompressContinue(), store blockType between block header decoding and block decompression stages */ + ZSTD_dStage stage; + U32 litEntropy; + U32 fseEntropy; + XXH64_state_t xxhState; + size_t headerSize; + ZSTD_format_e format; + ZSTD_forceIgnoreChecksum_e forceIgnoreChecksum; /* User specified: if == 1, will ignore checksums in compressed frame. Default == 0 */ + U32 validateChecksum; /* if == 1, will validate checksum. Is == 1 if (fParams.checksumFlag == 1) and (forceIgnoreChecksum == 0). */ + const BYTE* litPtr; + ZSTD_customMem customMem; + size_t litSize; + size_t rleSize; + size_t staticSize; +#if DYNAMIC_BMI2 != 0 + int bmi2; /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */ +#endif + + /* dictionary */ + ZSTD_DDict* ddictLocal; + const ZSTD_DDict* ddict; /* set by ZSTD_initDStream_usingDDict(), or ZSTD_DCtx_refDDict() */ + U32 dictID; + int ddictIsCold; /* if == 1 : dictionary is "new" for working context, and presumed "cold" (not in cpu cache) */ + ZSTD_dictUses_e dictUses; + ZSTD_DDictHashSet* ddictSet; /* Hash set for multiple ddicts */ + ZSTD_refMultipleDDicts_e refMultipleDDicts; /* User specified: if == 1, will allow references to multiple DDicts. Default == 0 (disabled) */ + int disableHufAsm; + + /* streaming */ + ZSTD_dStreamStage streamStage; + char* inBuff; + size_t inBuffSize; + size_t inPos; + size_t maxWindowSize; + char* outBuff; + size_t outBuffSize; + size_t outStart; + size_t outEnd; + size_t lhSize; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) + void* legacyContext; + U32 previousLegacyVersion; + U32 legacyVersion; +#endif + U32 hostageByte; + int noForwardProgress; + ZSTD_bufferMode_e outBufferMode; + ZSTD_outBuffer expectedOutBuffer; + + /* workspace */ + BYTE* litBuffer; + const BYTE* litBufferEnd; + ZSTD_litLocation_e litBufferLocation; + BYTE litExtraBuffer[ZSTD_LITBUFFEREXTRASIZE + WILDCOPY_OVERLENGTH]; /* literal buffer can be split between storage within dst and within this scratch buffer */ + BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX]; + + size_t oversizedDuration; + +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + void const* dictContentBeginForFuzzing; + void const* dictContentEndForFuzzing; +#endif + + /* Tracing */ +#if ZSTD_TRACE + ZSTD_TraceCtx traceCtx; +#endif +}; /* typedef'd to ZSTD_DCtx within "zstd.h" */ + +MEM_STATIC int ZSTD_DCtx_get_bmi2(const struct ZSTD_DCtx_s *dctx) { +#if DYNAMIC_BMI2 != 0 + return dctx->bmi2; +#else + (void)dctx; + return 0; +#endif +} + +/*-******************************************************* + * Shared internal functions + *********************************************************/ + +/*! ZSTD_loadDEntropy() : + * dict : must point at beginning of a valid zstd dictionary. + * @return : size of dictionary header (size of magic number + dict ID + entropy tables) */ +size_t ZSTD_loadDEntropy(ZSTD_entropyDTables_t* entropy, + const void* const dict, size_t const dictSize); + +/*! ZSTD_checkContinuity() : + * check if next `dst` follows previous position, where decompression ended. + * If yes, do nothing (continue on current segment). + * If not, classify previous segment as "external dictionary", and start a new segment. + * This function cannot fail. */ +void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst, size_t dstSize); + + +#endif /* ZSTD_DECOMPRESS_INTERNAL_H */ +/**** ended inlining zstd_decompress_internal.h ****/ +/**** start inlining zstd_ddict.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + +#ifndef ZSTD_DDICT_H +#define ZSTD_DDICT_H + +/*-******************************************************* + * Dependencies + *********************************************************/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../zstd.h ****/ + + +/*-******************************************************* + * Interface + *********************************************************/ + +/* note: several prototypes are already published in `zstd.h` : + * ZSTD_createDDict() + * ZSTD_createDDict_byReference() + * ZSTD_createDDict_advanced() + * ZSTD_freeDDict() + * ZSTD_initStaticDDict() + * ZSTD_sizeof_DDict() + * ZSTD_estimateDDictSize() + * ZSTD_getDictID_fromDict() + */ + +const void* ZSTD_DDict_dictContent(const ZSTD_DDict* ddict); +size_t ZSTD_DDict_dictSize(const ZSTD_DDict* ddict); + +void ZSTD_copyDDictParameters(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); + + + +#endif /* ZSTD_DDICT_H */ +/**** ended inlining zstd_ddict.h ****/ + +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) +/**** start inlining ../legacy/zstd_legacy.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_LEGACY_H +#define ZSTD_LEGACY_H + +#if defined (__cplusplus) +extern "C" { +#endif + +/* ************************************* +* Includes +***************************************/ +/**** skipping file: ../common/mem.h ****/ +/**** skipping file: ../common/error_private.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ + +#if !defined (ZSTD_LEGACY_SUPPORT) || (ZSTD_LEGACY_SUPPORT == 0) +# undef ZSTD_LEGACY_SUPPORT +# define ZSTD_LEGACY_SUPPORT 8 +#endif + +#if (ZSTD_LEGACY_SUPPORT <= 1) +/**** start inlining zstd_v01.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_V01_H_28739879432 +#define ZSTD_V01_H_28739879432 + +#if defined (__cplusplus) +extern "C" { +#endif + +/* ************************************* +* Includes +***************************************/ +#include /* size_t */ + + +/* ************************************* +* Simple one-step function +***************************************/ +/** +ZSTDv01_decompress() : decompress ZSTD frames compliant with v0.1.x format + compressedSize : is the exact source size + maxOriginalSize : is the size of the 'dst' buffer, which must be already allocated. + It must be equal or larger than originalSize, otherwise decompression will fail. + return : the number of bytes decompressed into destination buffer (originalSize) + or an errorCode if it fails (which can be tested using ZSTDv01_isError()) +*/ +size_t ZSTDv01_decompress( void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + + /** + ZSTDv01_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.1.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. + */ +void ZSTDv01_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + +/** +ZSTDv01_isError() : tells if the result of ZSTDv01_decompress() is an error +*/ +unsigned ZSTDv01_isError(size_t code); + + +/* ************************************* +* Advanced functions +***************************************/ +typedef struct ZSTDv01_Dctx_s ZSTDv01_Dctx; +ZSTDv01_Dctx* ZSTDv01_createDCtx(void); +size_t ZSTDv01_freeDCtx(ZSTDv01_Dctx* dctx); + +size_t ZSTDv01_decompressDCtx(void* ctx, + void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + +/* ************************************* +* Streaming functions +***************************************/ +size_t ZSTDv01_resetDCtx(ZSTDv01_Dctx* dctx); + +size_t ZSTDv01_nextSrcSizeToDecompress(ZSTDv01_Dctx* dctx); +size_t ZSTDv01_decompressContinue(ZSTDv01_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize); +/** + Use above functions alternatively. + ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue(). + ZSTD_decompressContinue() will use previous data blocks to improve compression if they are located prior to current block. + Result is the number of bytes regenerated within 'dst'. + It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header. +*/ + +/* ************************************* +* Prefix - version detection +***************************************/ +#define ZSTDv01_magicNumber 0xFD2FB51E /* Big Endian version */ +#define ZSTDv01_magicNumberLE 0x1EB52FFD /* Little Endian version */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_V01_H_28739879432 */ +/**** ended inlining zstd_v01.h ****/ +#endif +#if (ZSTD_LEGACY_SUPPORT <= 2) +/**** start inlining zstd_v02.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_V02_H_4174539423 +#define ZSTD_V02_H_4174539423 + +#if defined (__cplusplus) +extern "C" { +#endif + +/* ************************************* +* Includes +***************************************/ +#include /* size_t */ + + +/* ************************************* +* Simple one-step function +***************************************/ +/** +ZSTDv02_decompress() : decompress ZSTD frames compliant with v0.2.x format + compressedSize : is the exact source size + maxOriginalSize : is the size of the 'dst' buffer, which must be already allocated. + It must be equal or larger than originalSize, otherwise decompression will fail. + return : the number of bytes decompressed into destination buffer (originalSize) + or an errorCode if it fails (which can be tested using ZSTDv01_isError()) +*/ +size_t ZSTDv02_decompress( void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + + /** + ZSTDv02_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.2.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. + */ +void ZSTDv02_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + +/** +ZSTDv02_isError() : tells if the result of ZSTDv02_decompress() is an error +*/ +unsigned ZSTDv02_isError(size_t code); + + +/* ************************************* +* Advanced functions +***************************************/ +typedef struct ZSTDv02_Dctx_s ZSTDv02_Dctx; +ZSTDv02_Dctx* ZSTDv02_createDCtx(void); +size_t ZSTDv02_freeDCtx(ZSTDv02_Dctx* dctx); + +size_t ZSTDv02_decompressDCtx(void* ctx, + void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + +/* ************************************* +* Streaming functions +***************************************/ +size_t ZSTDv02_resetDCtx(ZSTDv02_Dctx* dctx); + +size_t ZSTDv02_nextSrcSizeToDecompress(ZSTDv02_Dctx* dctx); +size_t ZSTDv02_decompressContinue(ZSTDv02_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize); +/** + Use above functions alternatively. + ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue(). + ZSTD_decompressContinue() will use previous data blocks to improve compression if they are located prior to current block. + Result is the number of bytes regenerated within 'dst'. + It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header. +*/ + +/* ************************************* +* Prefix - version detection +***************************************/ +#define ZSTDv02_magicNumber 0xFD2FB522 /* v0.2 */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_V02_H_4174539423 */ +/**** ended inlining zstd_v02.h ****/ +#endif +#if (ZSTD_LEGACY_SUPPORT <= 3) +/**** start inlining zstd_v03.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_V03_H_298734209782 +#define ZSTD_V03_H_298734209782 + +#if defined (__cplusplus) +extern "C" { +#endif + +/* ************************************* +* Includes +***************************************/ +#include /* size_t */ + + +/* ************************************* +* Simple one-step function +***************************************/ +/** +ZSTDv03_decompress() : decompress ZSTD frames compliant with v0.3.x format + compressedSize : is the exact source size + maxOriginalSize : is the size of the 'dst' buffer, which must be already allocated. + It must be equal or larger than originalSize, otherwise decompression will fail. + return : the number of bytes decompressed into destination buffer (originalSize) + or an errorCode if it fails (which can be tested using ZSTDv01_isError()) +*/ +size_t ZSTDv03_decompress( void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + + /** + ZSTDv03_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.3.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. + */ + void ZSTDv03_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + + /** +ZSTDv03_isError() : tells if the result of ZSTDv03_decompress() is an error +*/ +unsigned ZSTDv03_isError(size_t code); + + +/* ************************************* +* Advanced functions +***************************************/ +typedef struct ZSTDv03_Dctx_s ZSTDv03_Dctx; +ZSTDv03_Dctx* ZSTDv03_createDCtx(void); +size_t ZSTDv03_freeDCtx(ZSTDv03_Dctx* dctx); + +size_t ZSTDv03_decompressDCtx(void* ctx, + void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + +/* ************************************* +* Streaming functions +***************************************/ +size_t ZSTDv03_resetDCtx(ZSTDv03_Dctx* dctx); + +size_t ZSTDv03_nextSrcSizeToDecompress(ZSTDv03_Dctx* dctx); +size_t ZSTDv03_decompressContinue(ZSTDv03_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize); +/** + Use above functions alternatively. + ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue(). + ZSTD_decompressContinue() will use previous data blocks to improve compression if they are located prior to current block. + Result is the number of bytes regenerated within 'dst'. + It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header. +*/ + +/* ************************************* +* Prefix - version detection +***************************************/ +#define ZSTDv03_magicNumber 0xFD2FB523 /* v0.3 */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_V03_H_298734209782 */ +/**** ended inlining zstd_v03.h ****/ +#endif +#if (ZSTD_LEGACY_SUPPORT <= 4) +/**** start inlining zstd_v04.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_V04_H_91868324769238 +#define ZSTD_V04_H_91868324769238 + +#if defined (__cplusplus) +extern "C" { +#endif + +/* ************************************* +* Includes +***************************************/ +#include /* size_t */ + + +/* ************************************* +* Simple one-step function +***************************************/ +/** +ZSTDv04_decompress() : decompress ZSTD frames compliant with v0.4.x format + compressedSize : is the exact source size + maxOriginalSize : is the size of the 'dst' buffer, which must be already allocated. + It must be equal or larger than originalSize, otherwise decompression will fail. + return : the number of bytes decompressed into destination buffer (originalSize) + or an errorCode if it fails (which can be tested using ZSTDv01_isError()) +*/ +size_t ZSTDv04_decompress( void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + + /** + ZSTDv04_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.4.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. + */ + void ZSTDv04_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + +/** +ZSTDv04_isError() : tells if the result of ZSTDv04_decompress() is an error +*/ +unsigned ZSTDv04_isError(size_t code); + + +/* ************************************* +* Advanced functions +***************************************/ +typedef struct ZSTDv04_Dctx_s ZSTDv04_Dctx; +ZSTDv04_Dctx* ZSTDv04_createDCtx(void); +size_t ZSTDv04_freeDCtx(ZSTDv04_Dctx* dctx); + +size_t ZSTDv04_decompressDCtx(ZSTDv04_Dctx* dctx, + void* dst, size_t maxOriginalSize, + const void* src, size_t compressedSize); + + +/* ************************************* +* Direct Streaming +***************************************/ +size_t ZSTDv04_resetDCtx(ZSTDv04_Dctx* dctx); + +size_t ZSTDv04_nextSrcSizeToDecompress(ZSTDv04_Dctx* dctx); +size_t ZSTDv04_decompressContinue(ZSTDv04_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize); +/** + Use above functions alternatively. + ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue(). + ZSTD_decompressContinue() will use previous data blocks to improve compression if they are located prior to current block. + Result is the number of bytes regenerated within 'dst'. + It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header. +*/ + + +/* ************************************* +* Buffered Streaming +***************************************/ +typedef struct ZBUFFv04_DCtx_s ZBUFFv04_DCtx; +ZBUFFv04_DCtx* ZBUFFv04_createDCtx(void); +size_t ZBUFFv04_freeDCtx(ZBUFFv04_DCtx* dctx); + +size_t ZBUFFv04_decompressInit(ZBUFFv04_DCtx* dctx); +size_t ZBUFFv04_decompressWithDictionary(ZBUFFv04_DCtx* dctx, const void* dict, size_t dictSize); + +size_t ZBUFFv04_decompressContinue(ZBUFFv04_DCtx* dctx, void* dst, size_t* maxDstSizePtr, const void* src, size_t* srcSizePtr); + +/** ************************************************ +* Streaming decompression +* +* A ZBUFF_DCtx object is required to track streaming operation. +* Use ZBUFF_createDCtx() and ZBUFF_freeDCtx() to create/release resources. +* Use ZBUFF_decompressInit() to start a new decompression operation. +* ZBUFF_DCtx objects can be reused multiple times. +* +* Optionally, a reference to a static dictionary can be set, using ZBUFF_decompressWithDictionary() +* It must be the same content as the one set during compression phase. +* Dictionary content must remain accessible during the decompression process. +* +* Use ZBUFF_decompressContinue() repetitively to consume your input. +* *srcSizePtr and *maxDstSizePtr can be any size. +* The function will report how many bytes were read or written by modifying *srcSizePtr and *maxDstSizePtr. +* Note that it may not consume the entire input, in which case it's up to the caller to present remaining input again. +* The content of dst will be overwritten (up to *maxDstSizePtr) at each function call, so save its content if it matters or change dst. +* @return : a hint to preferred nb of bytes to use as input for next function call (it's only a hint, to improve latency) +* or 0 when a frame is completely decoded +* or an error code, which can be tested using ZBUFF_isError(). +* +* Hint : recommended buffer sizes (not compulsory) : ZBUFF_recommendedDInSize / ZBUFF_recommendedDOutSize +* output : ZBUFF_recommendedDOutSize==128 KB block size is the internal unit, it ensures it's always possible to write a full block when it's decoded. +* input : ZBUFF_recommendedDInSize==128Kb+3; just follow indications from ZBUFF_decompressContinue() to minimize latency. It should always be <= 128 KB + 3 . +* **************************************************/ +unsigned ZBUFFv04_isError(size_t errorCode); +const char* ZBUFFv04_getErrorName(size_t errorCode); + + +/** The below functions provide recommended buffer sizes for Compression or Decompression operations. +* These sizes are not compulsory, they just tend to offer better latency */ +size_t ZBUFFv04_recommendedDInSize(void); +size_t ZBUFFv04_recommendedDOutSize(void); + + +/* ************************************* +* Prefix - version detection +***************************************/ +#define ZSTDv04_magicNumber 0xFD2FB524 /* v0.4 */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_V04_H_91868324769238 */ +/**** ended inlining zstd_v04.h ****/ +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) +/**** start inlining zstd_v05.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTDv05_H +#define ZSTDv05_H + +#if defined (__cplusplus) +extern "C" { +#endif + +/*-************************************* +* Dependencies +***************************************/ +#include /* size_t */ +/**** skipping file: ../common/mem.h ****/ + + +/* ************************************* +* Simple functions +***************************************/ +/*! ZSTDv05_decompress() : + `compressedSize` : is the _exact_ size of the compressed blob, otherwise decompression will fail. + `dstCapacity` must be large enough, equal or larger than originalSize. + @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), + or an errorCode if it fails (which can be tested using ZSTDv05_isError()) */ +size_t ZSTDv05_decompress( void* dst, size_t dstCapacity, + const void* src, size_t compressedSize); + + /** + ZSTDv05_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.5.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. + */ +void ZSTDv05_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + +/* ************************************* +* Helper functions +***************************************/ +/* Error Management */ +unsigned ZSTDv05_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ +const char* ZSTDv05_getErrorName(size_t code); /*!< provides readable string for an error code */ + + +/* ************************************* +* Explicit memory management +***************************************/ +/** Decompression context */ +typedef struct ZSTDv05_DCtx_s ZSTDv05_DCtx; +ZSTDv05_DCtx* ZSTDv05_createDCtx(void); +size_t ZSTDv05_freeDCtx(ZSTDv05_DCtx* dctx); /*!< @return : errorCode */ + +/** ZSTDv05_decompressDCtx() : +* Same as ZSTDv05_decompress(), but requires an already allocated ZSTDv05_DCtx (see ZSTDv05_createDCtx()) */ +size_t ZSTDv05_decompressDCtx(ZSTDv05_DCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + +/*-*********************** +* Simple Dictionary API +*************************/ +/*! ZSTDv05_decompress_usingDict() : +* Decompression using a pre-defined Dictionary content (see dictBuilder). +* Dictionary must be identical to the one used during compression, otherwise regenerated data will be corrupted. +* Note : dict can be NULL, in which case, it's equivalent to ZSTDv05_decompressDCtx() */ +size_t ZSTDv05_decompress_usingDict(ZSTDv05_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize); + +/*-************************ +* Advanced Streaming API +***************************/ +typedef enum { ZSTDv05_fast, ZSTDv05_greedy, ZSTDv05_lazy, ZSTDv05_lazy2, ZSTDv05_btlazy2, ZSTDv05_opt, ZSTDv05_btopt } ZSTDv05_strategy; +typedef struct { + U64 srcSize; + U32 windowLog; /* the only useful information to retrieve */ + U32 contentLog; U32 hashLog; U32 searchLog; U32 searchLength; U32 targetLength; ZSTDv05_strategy strategy; +} ZSTDv05_parameters; +size_t ZSTDv05_getFrameParams(ZSTDv05_parameters* params, const void* src, size_t srcSize); + +size_t ZSTDv05_decompressBegin_usingDict(ZSTDv05_DCtx* dctx, const void* dict, size_t dictSize); +void ZSTDv05_copyDCtx(ZSTDv05_DCtx* dstDCtx, const ZSTDv05_DCtx* srcDCtx); +size_t ZSTDv05_nextSrcSizeToDecompress(ZSTDv05_DCtx* dctx); +size_t ZSTDv05_decompressContinue(ZSTDv05_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + +/*-*********************** +* ZBUFF API +*************************/ +typedef struct ZBUFFv05_DCtx_s ZBUFFv05_DCtx; +ZBUFFv05_DCtx* ZBUFFv05_createDCtx(void); +size_t ZBUFFv05_freeDCtx(ZBUFFv05_DCtx* dctx); + +size_t ZBUFFv05_decompressInit(ZBUFFv05_DCtx* dctx); +size_t ZBUFFv05_decompressInitDictionary(ZBUFFv05_DCtx* dctx, const void* dict, size_t dictSize); + +size_t ZBUFFv05_decompressContinue(ZBUFFv05_DCtx* dctx, + void* dst, size_t* dstCapacityPtr, + const void* src, size_t* srcSizePtr); + +/*-*************************************************************************** +* Streaming decompression +* +* A ZBUFFv05_DCtx object is required to track streaming operations. +* Use ZBUFFv05_createDCtx() and ZBUFFv05_freeDCtx() to create/release resources. +* Use ZBUFFv05_decompressInit() to start a new decompression operation, +* or ZBUFFv05_decompressInitDictionary() if decompression requires a dictionary. +* Note that ZBUFFv05_DCtx objects can be reused multiple times. +* +* Use ZBUFFv05_decompressContinue() repetitively to consume your input. +* *srcSizePtr and *dstCapacityPtr can be any size. +* The function will report how many bytes were read or written by modifying *srcSizePtr and *dstCapacityPtr. +* Note that it may not consume the entire input, in which case it's up to the caller to present remaining input again. +* The content of @dst will be overwritten (up to *dstCapacityPtr) at each function call, so save its content if it matters or change @dst. +* @return : a hint to preferred nb of bytes to use as input for next function call (it's only a hint, to help latency) +* or 0 when a frame is completely decoded +* or an error code, which can be tested using ZBUFFv05_isError(). +* +* Hint : recommended buffer sizes (not compulsory) : ZBUFFv05_recommendedDInSize() / ZBUFFv05_recommendedDOutSize() +* output : ZBUFFv05_recommendedDOutSize==128 KB block size is the internal unit, it ensures it's always possible to write a full block when decoded. +* input : ZBUFFv05_recommendedDInSize==128Kb+3; just follow indications from ZBUFFv05_decompressContinue() to minimize latency. It should always be <= 128 KB + 3 . +* *******************************************************************************/ + + +/* ************************************* +* Tool functions +***************************************/ +unsigned ZBUFFv05_isError(size_t errorCode); +const char* ZBUFFv05_getErrorName(size_t errorCode); + +/** Functions below provide recommended buffer sizes for Compression or Decompression operations. +* These sizes are just hints, and tend to offer better latency */ +size_t ZBUFFv05_recommendedDInSize(void); +size_t ZBUFFv05_recommendedDOutSize(void); + + + +/*-************************************* +* Constants +***************************************/ +#define ZSTDv05_MAGICNUMBER 0xFD2FB525 /* v0.5 */ + + + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTDv0505_H */ +/**** ended inlining zstd_v05.h ****/ +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) +/**** start inlining zstd_v06.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTDv06_H +#define ZSTDv06_H + +#if defined (__cplusplus) +extern "C" { +#endif + +/*====== Dependency ======*/ +#include /* size_t */ + + +/*====== Export for Windows ======*/ +/*! +* ZSTDv06_DLL_EXPORT : +* Enable exporting of functions when building a Windows DLL +*/ +#if defined(_WIN32) && defined(ZSTDv06_DLL_EXPORT) && (ZSTDv06_DLL_EXPORT==1) +# define ZSTDLIBv06_API __declspec(dllexport) +#else +# define ZSTDLIBv06_API +#endif + + +/* ************************************* +* Simple functions +***************************************/ +/*! ZSTDv06_decompress() : + `compressedSize` : is the _exact_ size of the compressed blob, otherwise decompression will fail. + `dstCapacity` must be large enough, equal or larger than originalSize. + @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), + or an errorCode if it fails (which can be tested using ZSTDv06_isError()) */ +ZSTDLIBv06_API size_t ZSTDv06_decompress( void* dst, size_t dstCapacity, + const void* src, size_t compressedSize); + +/** +ZSTDv06_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.6.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. +*/ +void ZSTDv06_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + +/* ************************************* +* Helper functions +***************************************/ +ZSTDLIBv06_API size_t ZSTDv06_compressBound(size_t srcSize); /*!< maximum compressed size (worst case scenario) */ + +/* Error Management */ +ZSTDLIBv06_API unsigned ZSTDv06_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ +ZSTDLIBv06_API const char* ZSTDv06_getErrorName(size_t code); /*!< provides readable string for an error code */ + + +/* ************************************* +* Explicit memory management +***************************************/ +/** Decompression context */ +typedef struct ZSTDv06_DCtx_s ZSTDv06_DCtx; +ZSTDLIBv06_API ZSTDv06_DCtx* ZSTDv06_createDCtx(void); +ZSTDLIBv06_API size_t ZSTDv06_freeDCtx(ZSTDv06_DCtx* dctx); /*!< @return : errorCode */ + +/** ZSTDv06_decompressDCtx() : +* Same as ZSTDv06_decompress(), but requires an already allocated ZSTDv06_DCtx (see ZSTDv06_createDCtx()) */ +ZSTDLIBv06_API size_t ZSTDv06_decompressDCtx(ZSTDv06_DCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + +/*-*********************** +* Dictionary API +*************************/ +/*! ZSTDv06_decompress_usingDict() : +* Decompression using a pre-defined Dictionary content (see dictBuilder). +* Dictionary must be identical to the one used during compression, otherwise regenerated data will be corrupted. +* Note : dict can be NULL, in which case, it's equivalent to ZSTDv06_decompressDCtx() */ +ZSTDLIBv06_API size_t ZSTDv06_decompress_usingDict(ZSTDv06_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize); + + +/*-************************ +* Advanced Streaming API +***************************/ +struct ZSTDv06_frameParams_s { unsigned long long frameContentSize; unsigned windowLog; }; +typedef struct ZSTDv06_frameParams_s ZSTDv06_frameParams; + +ZSTDLIBv06_API size_t ZSTDv06_getFrameParams(ZSTDv06_frameParams* fparamsPtr, const void* src, size_t srcSize); /**< doesn't consume input */ +ZSTDLIBv06_API size_t ZSTDv06_decompressBegin_usingDict(ZSTDv06_DCtx* dctx, const void* dict, size_t dictSize); +ZSTDLIBv06_API void ZSTDv06_copyDCtx(ZSTDv06_DCtx* dctx, const ZSTDv06_DCtx* preparedDCtx); + +ZSTDLIBv06_API size_t ZSTDv06_nextSrcSizeToDecompress(ZSTDv06_DCtx* dctx); +ZSTDLIBv06_API size_t ZSTDv06_decompressContinue(ZSTDv06_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + + +/* ************************************* +* ZBUFF API +***************************************/ + +typedef struct ZBUFFv06_DCtx_s ZBUFFv06_DCtx; +ZSTDLIBv06_API ZBUFFv06_DCtx* ZBUFFv06_createDCtx(void); +ZSTDLIBv06_API size_t ZBUFFv06_freeDCtx(ZBUFFv06_DCtx* dctx); + +ZSTDLIBv06_API size_t ZBUFFv06_decompressInit(ZBUFFv06_DCtx* dctx); +ZSTDLIBv06_API size_t ZBUFFv06_decompressInitDictionary(ZBUFFv06_DCtx* dctx, const void* dict, size_t dictSize); + +ZSTDLIBv06_API size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* dctx, + void* dst, size_t* dstCapacityPtr, + const void* src, size_t* srcSizePtr); + +/*-*************************************************************************** +* Streaming decompression howto +* +* A ZBUFFv06_DCtx object is required to track streaming operations. +* Use ZBUFFv06_createDCtx() and ZBUFFv06_freeDCtx() to create/release resources. +* Use ZBUFFv06_decompressInit() to start a new decompression operation, +* or ZBUFFv06_decompressInitDictionary() if decompression requires a dictionary. +* Note that ZBUFFv06_DCtx objects can be re-init multiple times. +* +* Use ZBUFFv06_decompressContinue() repetitively to consume your input. +* *srcSizePtr and *dstCapacityPtr can be any size. +* The function will report how many bytes were read or written by modifying *srcSizePtr and *dstCapacityPtr. +* Note that it may not consume the entire input, in which case it's up to the caller to present remaining input again. +* The content of `dst` will be overwritten (up to *dstCapacityPtr) at each function call, so save its content if it matters, or change `dst`. +* @return : a hint to preferred nb of bytes to use as input for next function call (it's only a hint, to help latency), +* or 0 when a frame is completely decoded, +* or an error code, which can be tested using ZBUFFv06_isError(). +* +* Hint : recommended buffer sizes (not compulsory) : ZBUFFv06_recommendedDInSize() and ZBUFFv06_recommendedDOutSize() +* output : ZBUFFv06_recommendedDOutSize== 128 KB block size is the internal unit, it ensures it's always possible to write a full block when decoded. +* input : ZBUFFv06_recommendedDInSize == 128KB + 3; +* just follow indications from ZBUFFv06_decompressContinue() to minimize latency. It should always be <= 128 KB + 3 . +* *******************************************************************************/ + + +/* ************************************* +* Tool functions +***************************************/ +ZSTDLIBv06_API unsigned ZBUFFv06_isError(size_t errorCode); +ZSTDLIBv06_API const char* ZBUFFv06_getErrorName(size_t errorCode); + +/** Functions below provide recommended buffer sizes for Compression or Decompression operations. +* These sizes are just hints, they tend to offer better latency */ +ZSTDLIBv06_API size_t ZBUFFv06_recommendedDInSize(void); +ZSTDLIBv06_API size_t ZBUFFv06_recommendedDOutSize(void); + + +/*-************************************* +* Constants +***************************************/ +#define ZSTDv06_MAGICNUMBER 0xFD2FB526 /* v0.6 */ + + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTDv06_BUFFERED_H */ +/**** ended inlining zstd_v06.h ****/ +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) +/**** start inlining zstd_v07.h ****/ +/* + * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTDv07_H_235446 +#define ZSTDv07_H_235446 + +#if defined (__cplusplus) +extern "C" { +#endif + +/*====== Dependency ======*/ +#include /* size_t */ + + +/*====== Export for Windows ======*/ +/*! +* ZSTDv07_DLL_EXPORT : +* Enable exporting of functions when building a Windows DLL +*/ +#if defined(_WIN32) && defined(ZSTDv07_DLL_EXPORT) && (ZSTDv07_DLL_EXPORT==1) +# define ZSTDLIBv07_API __declspec(dllexport) +#else +# define ZSTDLIBv07_API +#endif + + +/* ************************************* +* Simple API +***************************************/ +/*! ZSTDv07_getDecompressedSize() : +* @return : decompressed size if known, 0 otherwise. + note 1 : if `0`, follow up with ZSTDv07_getFrameParams() to know precise failure cause. + note 2 : decompressed size could be wrong or intentionally modified ! + always ensure results fit within application's authorized limits */ +unsigned long long ZSTDv07_getDecompressedSize(const void* src, size_t srcSize); + +/*! ZSTDv07_decompress() : + `compressedSize` : must be _exact_ size of compressed input, otherwise decompression will fail. + `dstCapacity` must be equal or larger than originalSize. + @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), + or an errorCode if it fails (which can be tested using ZSTDv07_isError()) */ +ZSTDLIBv07_API size_t ZSTDv07_decompress( void* dst, size_t dstCapacity, + const void* src, size_t compressedSize); + +/** +ZSTDv07_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.7.x format + srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src' + cSize (output parameter) : the number of bytes that would be read to decompress this frame + or an error code if it fails (which can be tested using ZSTDv01_isError()) + dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame + or ZSTD_CONTENTSIZE_ERROR if an error occurs + + note : assumes `cSize` and `dBound` are _not_ NULL. +*/ +void ZSTDv07_findFrameSizeInfoLegacy(const void *src, size_t srcSize, + size_t* cSize, unsigned long long* dBound); + +/*====== Helper functions ======*/ +ZSTDLIBv07_API unsigned ZSTDv07_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ +ZSTDLIBv07_API const char* ZSTDv07_getErrorName(size_t code); /*!< provides readable string from an error code */ + + +/*-************************************* +* Explicit memory management +***************************************/ +/** Decompression context */ +typedef struct ZSTDv07_DCtx_s ZSTDv07_DCtx; +ZSTDLIBv07_API ZSTDv07_DCtx* ZSTDv07_createDCtx(void); +ZSTDLIBv07_API size_t ZSTDv07_freeDCtx(ZSTDv07_DCtx* dctx); /*!< @return : errorCode */ + +/** ZSTDv07_decompressDCtx() : +* Same as ZSTDv07_decompress(), requires an allocated ZSTDv07_DCtx (see ZSTDv07_createDCtx()) */ +ZSTDLIBv07_API size_t ZSTDv07_decompressDCtx(ZSTDv07_DCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); + + +/*-************************ +* Simple dictionary API +***************************/ +/*! ZSTDv07_decompress_usingDict() : +* Decompression using a pre-defined Dictionary content (see dictBuilder). +* Dictionary must be identical to the one used during compression. +* Note : This function load the dictionary, resulting in a significant startup time */ +ZSTDLIBv07_API size_t ZSTDv07_decompress_usingDict(ZSTDv07_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict,size_t dictSize); + + +/*-************************** +* Advanced Dictionary API +****************************/ +/*! ZSTDv07_createDDict() : +* Create a digested dictionary, ready to start decompression operation without startup delay. +* `dict` can be released after creation */ +typedef struct ZSTDv07_DDict_s ZSTDv07_DDict; +ZSTDLIBv07_API ZSTDv07_DDict* ZSTDv07_createDDict(const void* dict, size_t dictSize); +ZSTDLIBv07_API size_t ZSTDv07_freeDDict(ZSTDv07_DDict* ddict); + +/*! ZSTDv07_decompress_usingDDict() : +* Decompression using a pre-digested Dictionary +* Faster startup than ZSTDv07_decompress_usingDict(), recommended when same dictionary is used multiple times. */ +ZSTDLIBv07_API size_t ZSTDv07_decompress_usingDDict(ZSTDv07_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTDv07_DDict* ddict); + +typedef struct { + unsigned long long frameContentSize; + unsigned windowSize; + unsigned dictID; + unsigned checksumFlag; +} ZSTDv07_frameParams; + +ZSTDLIBv07_API size_t ZSTDv07_getFrameParams(ZSTDv07_frameParams* fparamsPtr, const void* src, size_t srcSize); /**< doesn't consume input */ + + + + +/* ************************************* +* Streaming functions +***************************************/ +typedef struct ZBUFFv07_DCtx_s ZBUFFv07_DCtx; +ZSTDLIBv07_API ZBUFFv07_DCtx* ZBUFFv07_createDCtx(void); +ZSTDLIBv07_API size_t ZBUFFv07_freeDCtx(ZBUFFv07_DCtx* dctx); + +ZSTDLIBv07_API size_t ZBUFFv07_decompressInit(ZBUFFv07_DCtx* dctx); +ZSTDLIBv07_API size_t ZBUFFv07_decompressInitDictionary(ZBUFFv07_DCtx* dctx, const void* dict, size_t dictSize); + +ZSTDLIBv07_API size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* dctx, + void* dst, size_t* dstCapacityPtr, + const void* src, size_t* srcSizePtr); + +/*-*************************************************************************** +* Streaming decompression howto +* +* A ZBUFFv07_DCtx object is required to track streaming operations. +* Use ZBUFFv07_createDCtx() and ZBUFFv07_freeDCtx() to create/release resources. +* Use ZBUFFv07_decompressInit() to start a new decompression operation, +* or ZBUFFv07_decompressInitDictionary() if decompression requires a dictionary. +* Note that ZBUFFv07_DCtx objects can be re-init multiple times. +* +* Use ZBUFFv07_decompressContinue() repetitively to consume your input. +* *srcSizePtr and *dstCapacityPtr can be any size. +* The function will report how many bytes were read or written by modifying *srcSizePtr and *dstCapacityPtr. +* Note that it may not consume the entire input, in which case it's up to the caller to present remaining input again. +* The content of `dst` will be overwritten (up to *dstCapacityPtr) at each function call, so save its content if it matters, or change `dst`. +* @return : a hint to preferred nb of bytes to use as input for next function call (it's only a hint, to help latency), +* or 0 when a frame is completely decoded, +* or an error code, which can be tested using ZBUFFv07_isError(). +* +* Hint : recommended buffer sizes (not compulsory) : ZBUFFv07_recommendedDInSize() and ZBUFFv07_recommendedDOutSize() +* output : ZBUFFv07_recommendedDOutSize== 128 KB block size is the internal unit, it ensures it's always possible to write a full block when decoded. +* input : ZBUFFv07_recommendedDInSize == 128KB + 3; +* just follow indications from ZBUFFv07_decompressContinue() to minimize latency. It should always be <= 128 KB + 3 . +* *******************************************************************************/ + + +/* ************************************* +* Tool functions +***************************************/ +ZSTDLIBv07_API unsigned ZBUFFv07_isError(size_t errorCode); +ZSTDLIBv07_API const char* ZBUFFv07_getErrorName(size_t errorCode); + +/** Functions below provide recommended buffer sizes for Compression or Decompression operations. +* These sizes are just hints, they tend to offer better latency */ +ZSTDLIBv07_API size_t ZBUFFv07_recommendedDInSize(void); +ZSTDLIBv07_API size_t ZBUFFv07_recommendedDOutSize(void); + + +/*-************************************* +* Constants +***************************************/ +#define ZSTDv07_MAGICNUMBER 0xFD2FB527 /* v0.7 */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTDv07_H_235446 */ +/**** ended inlining zstd_v07.h ****/ +#endif + +/** ZSTD_isLegacy() : + @return : > 0 if supported by legacy decoder. 0 otherwise. + return value is the version. +*/ +MEM_STATIC unsigned ZSTD_isLegacy(const void* src, size_t srcSize) +{ + U32 magicNumberLE; + if (srcSize<4) return 0; + magicNumberLE = MEM_readLE32(src); + switch(magicNumberLE) + { +#if (ZSTD_LEGACY_SUPPORT <= 1) + case ZSTDv01_magicNumberLE:return 1; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 2) + case ZSTDv02_magicNumber : return 2; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 3) + case ZSTDv03_magicNumber : return 3; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 4) + case ZSTDv04_magicNumber : return 4; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) + case ZSTDv05_MAGICNUMBER : return 5; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + case ZSTDv06_MAGICNUMBER : return 6; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + case ZSTDv07_MAGICNUMBER : return 7; +#endif + default : return 0; + } +} + + +MEM_STATIC unsigned long long ZSTD_getDecompressedSize_legacy(const void* src, size_t srcSize) +{ + U32 const version = ZSTD_isLegacy(src, srcSize); + if (version < 5) return 0; /* no decompressed size in frame header, or not a legacy format */ +#if (ZSTD_LEGACY_SUPPORT <= 5) + if (version==5) { + ZSTDv05_parameters fParams; + size_t const frResult = ZSTDv05_getFrameParams(&fParams, src, srcSize); + if (frResult != 0) return 0; + return fParams.srcSize; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + if (version==6) { + ZSTDv06_frameParams fParams; + size_t const frResult = ZSTDv06_getFrameParams(&fParams, src, srcSize); + if (frResult != 0) return 0; + return fParams.frameContentSize; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + if (version==7) { + ZSTDv07_frameParams fParams; + size_t const frResult = ZSTDv07_getFrameParams(&fParams, src, srcSize); + if (frResult != 0) return 0; + return fParams.frameContentSize; + } +#endif + return 0; /* should not be possible */ +} + + +MEM_STATIC size_t ZSTD_decompressLegacy( + void* dst, size_t dstCapacity, + const void* src, size_t compressedSize, + const void* dict,size_t dictSize) +{ + U32 const version = ZSTD_isLegacy(src, compressedSize); + (void)dst; (void)dstCapacity; (void)dict; (void)dictSize; /* unused when ZSTD_LEGACY_SUPPORT >= 8 */ + switch(version) + { +#if (ZSTD_LEGACY_SUPPORT <= 1) + case 1 : + return ZSTDv01_decompress(dst, dstCapacity, src, compressedSize); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 2) + case 2 : + return ZSTDv02_decompress(dst, dstCapacity, src, compressedSize); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 3) + case 3 : + return ZSTDv03_decompress(dst, dstCapacity, src, compressedSize); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 4) + case 4 : + return ZSTDv04_decompress(dst, dstCapacity, src, compressedSize); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) + case 5 : + { size_t result; + ZSTDv05_DCtx* const zd = ZSTDv05_createDCtx(); + if (zd==NULL) return ERROR(memory_allocation); + result = ZSTDv05_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize); + ZSTDv05_freeDCtx(zd); + return result; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + case 6 : + { size_t result; + ZSTDv06_DCtx* const zd = ZSTDv06_createDCtx(); + if (zd==NULL) return ERROR(memory_allocation); + result = ZSTDv06_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize); + ZSTDv06_freeDCtx(zd); + return result; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + case 7 : + { size_t result; + ZSTDv07_DCtx* const zd = ZSTDv07_createDCtx(); + if (zd==NULL) return ERROR(memory_allocation); + result = ZSTDv07_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize); + ZSTDv07_freeDCtx(zd); + return result; + } +#endif + default : + return ERROR(prefix_unknown); + } +} + +MEM_STATIC ZSTD_frameSizeInfo ZSTD_findFrameSizeInfoLegacy(const void *src, size_t srcSize) +{ + ZSTD_frameSizeInfo frameSizeInfo; + U32 const version = ZSTD_isLegacy(src, srcSize); + switch(version) + { +#if (ZSTD_LEGACY_SUPPORT <= 1) + case 1 : + ZSTDv01_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 2) + case 2 : + ZSTDv02_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 3) + case 3 : + ZSTDv03_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 4) + case 4 : + ZSTDv04_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) + case 5 : + ZSTDv05_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + case 6 : + ZSTDv06_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + case 7 : + ZSTDv07_findFrameSizeInfoLegacy(src, srcSize, + &frameSizeInfo.compressedSize, + &frameSizeInfo.decompressedBound); + break; +#endif + default : + frameSizeInfo.compressedSize = ERROR(prefix_unknown); + frameSizeInfo.decompressedBound = ZSTD_CONTENTSIZE_ERROR; + break; + } + if (!ZSTD_isError(frameSizeInfo.compressedSize) && frameSizeInfo.compressedSize > srcSize) { + frameSizeInfo.compressedSize = ERROR(srcSize_wrong); + frameSizeInfo.decompressedBound = ZSTD_CONTENTSIZE_ERROR; + } + /* In all cases, decompressedBound == nbBlocks * ZSTD_BLOCKSIZE_MAX. + * So we can compute nbBlocks without having to change every function. + */ + if (frameSizeInfo.decompressedBound != ZSTD_CONTENTSIZE_ERROR) { + assert((frameSizeInfo.decompressedBound & (ZSTD_BLOCKSIZE_MAX - 1)) == 0); + frameSizeInfo.nbBlocks = (size_t)(frameSizeInfo.decompressedBound / ZSTD_BLOCKSIZE_MAX); + } + return frameSizeInfo; +} + +MEM_STATIC size_t ZSTD_findFrameCompressedSizeLegacy(const void *src, size_t srcSize) +{ + ZSTD_frameSizeInfo frameSizeInfo = ZSTD_findFrameSizeInfoLegacy(src, srcSize); + return frameSizeInfo.compressedSize; +} + +MEM_STATIC size_t ZSTD_freeLegacyStreamContext(void* legacyContext, U32 version) +{ + switch(version) + { + default : + case 1 : + case 2 : + case 3 : + (void)legacyContext; + return ERROR(version_unsupported); +#if (ZSTD_LEGACY_SUPPORT <= 4) + case 4 : return ZBUFFv04_freeDCtx((ZBUFFv04_DCtx*)legacyContext); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) + case 5 : return ZBUFFv05_freeDCtx((ZBUFFv05_DCtx*)legacyContext); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + case 6 : return ZBUFFv06_freeDCtx((ZBUFFv06_DCtx*)legacyContext); +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + case 7 : return ZBUFFv07_freeDCtx((ZBUFFv07_DCtx*)legacyContext); +#endif + } +} + + +MEM_STATIC size_t ZSTD_initLegacyStream(void** legacyContext, U32 prevVersion, U32 newVersion, + const void* dict, size_t dictSize) +{ + DEBUGLOG(5, "ZSTD_initLegacyStream for v0.%u", newVersion); + if (prevVersion != newVersion) ZSTD_freeLegacyStreamContext(*legacyContext, prevVersion); + switch(newVersion) + { + default : + case 1 : + case 2 : + case 3 : + (void)dict; (void)dictSize; + return 0; +#if (ZSTD_LEGACY_SUPPORT <= 4) + case 4 : + { + ZBUFFv04_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv04_createDCtx() : (ZBUFFv04_DCtx*)*legacyContext; + if (dctx==NULL) return ERROR(memory_allocation); + ZBUFFv04_decompressInit(dctx); + ZBUFFv04_decompressWithDictionary(dctx, dict, dictSize); + *legacyContext = dctx; + return 0; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) + case 5 : + { + ZBUFFv05_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv05_createDCtx() : (ZBUFFv05_DCtx*)*legacyContext; + if (dctx==NULL) return ERROR(memory_allocation); + ZBUFFv05_decompressInitDictionary(dctx, dict, dictSize); + *legacyContext = dctx; + return 0; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + case 6 : + { + ZBUFFv06_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv06_createDCtx() : (ZBUFFv06_DCtx*)*legacyContext; + if (dctx==NULL) return ERROR(memory_allocation); + ZBUFFv06_decompressInitDictionary(dctx, dict, dictSize); + *legacyContext = dctx; + return 0; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + case 7 : + { + ZBUFFv07_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv07_createDCtx() : (ZBUFFv07_DCtx*)*legacyContext; + if (dctx==NULL) return ERROR(memory_allocation); + ZBUFFv07_decompressInitDictionary(dctx, dict, dictSize); + *legacyContext = dctx; + return 0; + } +#endif + } +} + + + +MEM_STATIC size_t ZSTD_decompressLegacyStream(void* legacyContext, U32 version, + ZSTD_outBuffer* output, ZSTD_inBuffer* input) +{ + DEBUGLOG(5, "ZSTD_decompressLegacyStream for v0.%u", version); + switch(version) + { + default : + case 1 : + case 2 : + case 3 : + (void)legacyContext; (void)output; (void)input; + return ERROR(version_unsupported); +#if (ZSTD_LEGACY_SUPPORT <= 4) + case 4 : + { + ZBUFFv04_DCtx* dctx = (ZBUFFv04_DCtx*) legacyContext; + const void* src = (const char*)input->src + input->pos; + size_t readSize = input->size - input->pos; + void* dst = (char*)output->dst + output->pos; + size_t decodedSize = output->size - output->pos; + size_t const hintSize = ZBUFFv04_decompressContinue(dctx, dst, &decodedSize, src, &readSize); + output->pos += decodedSize; + input->pos += readSize; + return hintSize; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 5) + case 5 : + { + ZBUFFv05_DCtx* dctx = (ZBUFFv05_DCtx*) legacyContext; + const void* src = (const char*)input->src + input->pos; + size_t readSize = input->size - input->pos; + void* dst = (char*)output->dst + output->pos; + size_t decodedSize = output->size - output->pos; + size_t const hintSize = ZBUFFv05_decompressContinue(dctx, dst, &decodedSize, src, &readSize); + output->pos += decodedSize; + input->pos += readSize; + return hintSize; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 6) + case 6 : + { + ZBUFFv06_DCtx* dctx = (ZBUFFv06_DCtx*) legacyContext; + const void* src = (const char*)input->src + input->pos; + size_t readSize = input->size - input->pos; + void* dst = (char*)output->dst + output->pos; + size_t decodedSize = output->size - output->pos; + size_t const hintSize = ZBUFFv06_decompressContinue(dctx, dst, &decodedSize, src, &readSize); + output->pos += decodedSize; + input->pos += readSize; + return hintSize; + } +#endif +#if (ZSTD_LEGACY_SUPPORT <= 7) + case 7 : + { + ZBUFFv07_DCtx* dctx = (ZBUFFv07_DCtx*) legacyContext; + const void* src = (const char*)input->src + input->pos; + size_t readSize = input->size - input->pos; + void* dst = (char*)output->dst + output->pos; + size_t decodedSize = output->size - output->pos; + size_t const hintSize = ZBUFFv07_decompressContinue(dctx, dst, &decodedSize, src, &readSize); + output->pos += decodedSize; + input->pos += readSize; + return hintSize; + } +#endif + } +} + + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_LEGACY_H */ +/**** ended inlining ../legacy/zstd_legacy.h ****/ +#endif + + + +/*-******************************************************* +* Types +*********************************************************/ +struct ZSTD_DDict_s { + void* dictBuffer; + const void* dictContent; + size_t dictSize; + ZSTD_entropyDTables_t entropy; + U32 dictID; + U32 entropyPresent; + ZSTD_customMem cMem; +}; /* typedef'd to ZSTD_DDict within "zstd.h" */ + +const void* ZSTD_DDict_dictContent(const ZSTD_DDict* ddict) +{ + assert(ddict != NULL); + return ddict->dictContent; +} + +size_t ZSTD_DDict_dictSize(const ZSTD_DDict* ddict) +{ + assert(ddict != NULL); + return ddict->dictSize; +} + +void ZSTD_copyDDictParameters(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict) +{ + DEBUGLOG(4, "ZSTD_copyDDictParameters"); + assert(dctx != NULL); + assert(ddict != NULL); + dctx->dictID = ddict->dictID; + dctx->prefixStart = ddict->dictContent; + dctx->virtualStart = ddict->dictContent; + dctx->dictEnd = (const BYTE*)ddict->dictContent + ddict->dictSize; + dctx->previousDstEnd = dctx->dictEnd; +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + dctx->dictContentBeginForFuzzing = dctx->prefixStart; + dctx->dictContentEndForFuzzing = dctx->previousDstEnd; +#endif + if (ddict->entropyPresent) { + dctx->litEntropy = 1; + dctx->fseEntropy = 1; + dctx->LLTptr = ddict->entropy.LLTable; + dctx->MLTptr = ddict->entropy.MLTable; + dctx->OFTptr = ddict->entropy.OFTable; + dctx->HUFptr = ddict->entropy.hufTable; + dctx->entropy.rep[0] = ddict->entropy.rep[0]; + dctx->entropy.rep[1] = ddict->entropy.rep[1]; + dctx->entropy.rep[2] = ddict->entropy.rep[2]; + } else { + dctx->litEntropy = 0; + dctx->fseEntropy = 0; + } +} + + +static size_t +ZSTD_loadEntropy_intoDDict(ZSTD_DDict* ddict, + ZSTD_dictContentType_e dictContentType) +{ + ddict->dictID = 0; + ddict->entropyPresent = 0; + if (dictContentType == ZSTD_dct_rawContent) return 0; + + if (ddict->dictSize < 8) { + if (dictContentType == ZSTD_dct_fullDict) + return ERROR(dictionary_corrupted); /* only accept specified dictionaries */ + return 0; /* pure content mode */ + } + { U32 const magic = MEM_readLE32(ddict->dictContent); + if (magic != ZSTD_MAGIC_DICTIONARY) { + if (dictContentType == ZSTD_dct_fullDict) + return ERROR(dictionary_corrupted); /* only accept specified dictionaries */ + return 0; /* pure content mode */ + } + } + ddict->dictID = MEM_readLE32((const char*)ddict->dictContent + ZSTD_FRAMEIDSIZE); + + /* load entropy tables */ + RETURN_ERROR_IF(ZSTD_isError(ZSTD_loadDEntropy( + &ddict->entropy, ddict->dictContent, ddict->dictSize)), + dictionary_corrupted, ""); + ddict->entropyPresent = 1; + return 0; +} + + +static size_t ZSTD_initDDict_internal(ZSTD_DDict* ddict, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType) +{ + if ((dictLoadMethod == ZSTD_dlm_byRef) || (!dict) || (!dictSize)) { + ddict->dictBuffer = NULL; + ddict->dictContent = dict; + if (!dict) dictSize = 0; + } else { + void* const internalBuffer = ZSTD_customMalloc(dictSize, ddict->cMem); + ddict->dictBuffer = internalBuffer; + ddict->dictContent = internalBuffer; + if (!internalBuffer) return ERROR(memory_allocation); + ZSTD_memcpy(internalBuffer, dict, dictSize); + } + ddict->dictSize = dictSize; + ddict->entropy.hufTable[0] = (HUF_DTable)((ZSTD_HUFFDTABLE_CAPACITY_LOG)*0x1000001); /* cover both little and big endian */ + + /* parse dictionary content */ + FORWARD_IF_ERROR( ZSTD_loadEntropy_intoDDict(ddict, dictContentType) , ""); + + return 0; +} + +ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType, + ZSTD_customMem customMem) +{ + if ((!customMem.customAlloc) ^ (!customMem.customFree)) return NULL; + + { ZSTD_DDict* const ddict = (ZSTD_DDict*) ZSTD_customMalloc(sizeof(ZSTD_DDict), customMem); + if (ddict == NULL) return NULL; + ddict->cMem = customMem; + { size_t const initResult = ZSTD_initDDict_internal(ddict, + dict, dictSize, + dictLoadMethod, dictContentType); + if (ZSTD_isError(initResult)) { + ZSTD_freeDDict(ddict); + return NULL; + } } + return ddict; + } +} + +/*! ZSTD_createDDict() : +* Create a digested dictionary, to start decompression without startup delay. +* `dict` content is copied inside DDict. +* Consequently, `dict` can be released after `ZSTD_DDict` creation */ +ZSTD_DDict* ZSTD_createDDict(const void* dict, size_t dictSize) +{ + ZSTD_customMem const allocator = { NULL, NULL, NULL }; + return ZSTD_createDDict_advanced(dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto, allocator); +} + +/*! ZSTD_createDDict_byReference() : + * Create a digested dictionary, to start decompression without startup delay. + * Dictionary content is simply referenced, it will be accessed during decompression. + * Warning : dictBuffer must outlive DDict (DDict must be freed before dictBuffer) */ +ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize) +{ + ZSTD_customMem const allocator = { NULL, NULL, NULL }; + return ZSTD_createDDict_advanced(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, allocator); +} + + +const ZSTD_DDict* ZSTD_initStaticDDict( + void* sBuffer, size_t sBufferSize, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType) +{ + size_t const neededSpace = sizeof(ZSTD_DDict) + + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize); + ZSTD_DDict* const ddict = (ZSTD_DDict*)sBuffer; + assert(sBuffer != NULL); + assert(dict != NULL); + if ((size_t)sBuffer & 7) return NULL; /* 8-aligned */ + if (sBufferSize < neededSpace) return NULL; + if (dictLoadMethod == ZSTD_dlm_byCopy) { + ZSTD_memcpy(ddict+1, dict, dictSize); /* local copy */ + dict = ddict+1; + } + if (ZSTD_isError( ZSTD_initDDict_internal(ddict, + dict, dictSize, + ZSTD_dlm_byRef, dictContentType) )) + return NULL; + return ddict; +} + + +size_t ZSTD_freeDDict(ZSTD_DDict* ddict) +{ + if (ddict==NULL) return 0; /* support free on NULL */ + { ZSTD_customMem const cMem = ddict->cMem; + ZSTD_customFree(ddict->dictBuffer, cMem); + ZSTD_customFree(ddict, cMem); + return 0; + } +} + +/*! ZSTD_estimateDDictSize() : + * Estimate amount of memory that will be needed to create a dictionary for decompression. + * Note : dictionary created by reference using ZSTD_dlm_byRef are smaller */ +size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod) +{ + return sizeof(ZSTD_DDict) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize); +} + +size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict) +{ + if (ddict==NULL) return 0; /* support sizeof on NULL */ + return sizeof(*ddict) + (ddict->dictBuffer ? ddict->dictSize : 0) ; +} + +/*! ZSTD_getDictID_fromDDict() : + * Provides the dictID of the dictionary loaded into `ddict`. + * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ +unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict) +{ + if (ddict==NULL) return 0; + return ddict->dictID; +} +/**** ended inlining decompress/zstd_ddict.c ****/ +/**** start inlining decompress/zstd_decompress.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + +/* *************************************************************** +* Tuning parameters +*****************************************************************/ +/*! + * HEAPMODE : + * Select how default decompression function ZSTD_decompress() allocates its context, + * on stack (0), or into heap (1, default; requires malloc()). + * Note that functions with explicit context such as ZSTD_decompressDCtx() are unaffected. + */ +#ifndef ZSTD_HEAPMODE +# define ZSTD_HEAPMODE 1 +#endif + +/*! +* LEGACY_SUPPORT : +* if set to 1+, ZSTD_decompress() can decode older formats (v0.1+) +*/ +#ifndef ZSTD_LEGACY_SUPPORT +# define ZSTD_LEGACY_SUPPORT 0 +#endif + +/*! + * MAXWINDOWSIZE_DEFAULT : + * maximum window size accepted by DStream __by default__. + * Frames requiring more memory will be rejected. + * It's possible to set a different limit using ZSTD_DCtx_setMaxWindowSize(). + */ +#ifndef ZSTD_MAXWINDOWSIZE_DEFAULT +# define ZSTD_MAXWINDOWSIZE_DEFAULT (((U32)1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) + 1) +#endif + +/*! + * NO_FORWARD_PROGRESS_MAX : + * maximum allowed nb of calls to ZSTD_decompressStream() + * without any forward progress + * (defined as: no byte read from input, and no byte flushed to output) + * before triggering an error. + */ +#ifndef ZSTD_NO_FORWARD_PROGRESS_MAX +# define ZSTD_NO_FORWARD_PROGRESS_MAX 16 +#endif + + +/*-******************************************************* +* Dependencies +*********************************************************/ +/**** skipping file: ../common/allocations.h ****/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../common/mem.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/huf.h ****/ +/**** skipping file: ../common/xxhash.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: zstd_decompress_internal.h ****/ +/**** skipping file: zstd_ddict.h ****/ +/**** start inlining zstd_decompress_block.h ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + + +#ifndef ZSTD_DEC_BLOCK_H +#define ZSTD_DEC_BLOCK_H + +/*-******************************************************* + * Dependencies + *********************************************************/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../zstd.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: zstd_decompress_internal.h ****/ + + +/* === Prototypes === */ + +/* note: prototypes already published within `zstd.h` : + * ZSTD_decompressBlock() + */ + +/* note: prototypes already published within `zstd_internal.h` : + * ZSTD_getcBlockSize() + * ZSTD_decodeSeqHeaders() + */ + + + /* Streaming state is used to inform allocation of the literal buffer */ +typedef enum { + not_streaming = 0, + is_streaming = 1 +} streaming_operation; + +/* ZSTD_decompressBlock_internal() : + * decompress block, starting at `src`, + * into destination buffer `dst`. + * @return : decompressed block size, + * or an error code (which can be tested using ZSTD_isError()) + */ +size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, const int frame, const streaming_operation streaming); + +/* ZSTD_buildFSETable() : + * generate FSE decoding table for one symbol (ll, ml or off) + * this function must be called with valid parameters only + * (dt is large enough, normalizedCounter distribution total is a power of 2, max is within range, etc.) + * in which case it cannot fail. + * The workspace must be 4-byte aligned and at least ZSTD_BUILD_FSE_TABLE_WKSP_SIZE bytes, which is + * defined in zstd_decompress_internal.h. + * Internal use only. + */ +void ZSTD_buildFSETable(ZSTD_seqSymbol* dt, + const short* normalizedCounter, unsigned maxSymbolValue, + const U32* baseValue, const U8* nbAdditionalBits, + unsigned tableLog, void* wksp, size_t wkspSize, + int bmi2); + +/* Internal definition of ZSTD_decompressBlock() to avoid deprecation warnings. */ +size_t ZSTD_decompressBlock_deprecated(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize); + + +#endif /* ZSTD_DEC_BLOCK_H */ +/**** ended inlining zstd_decompress_block.h ****/ +/**** skipping file: ../common/bits.h ****/ + +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) +/**** skipping file: ../legacy/zstd_legacy.h ****/ +#endif + + + +/************************************* + * Multiple DDicts Hashset internals * + *************************************/ + +#define DDICT_HASHSET_MAX_LOAD_FACTOR_COUNT_MULT 4 +#define DDICT_HASHSET_MAX_LOAD_FACTOR_SIZE_MULT 3 /* These two constants represent SIZE_MULT/COUNT_MULT load factor without using a float. + * Currently, that means a 0.75 load factor. + * So, if count * COUNT_MULT / size * SIZE_MULT != 0, then we've exceeded + * the load factor of the ddict hash set. + */ + +#define DDICT_HASHSET_TABLE_BASE_SIZE 64 +#define DDICT_HASHSET_RESIZE_FACTOR 2 + +/* Hash function to determine starting position of dict insertion within the table + * Returns an index between [0, hashSet->ddictPtrTableSize] + */ +static size_t ZSTD_DDictHashSet_getIndex(const ZSTD_DDictHashSet* hashSet, U32 dictID) { + const U64 hash = XXH64(&dictID, sizeof(U32), 0); + /* DDict ptr table size is a multiple of 2, use size - 1 as mask to get index within [0, hashSet->ddictPtrTableSize) */ + return hash & (hashSet->ddictPtrTableSize - 1); +} + +/* Adds DDict to a hashset without resizing it. + * If inserting a DDict with a dictID that already exists in the set, replaces the one in the set. + * Returns 0 if successful, or a zstd error code if something went wrong. + */ +static size_t ZSTD_DDictHashSet_emplaceDDict(ZSTD_DDictHashSet* hashSet, const ZSTD_DDict* ddict) { + const U32 dictID = ZSTD_getDictID_fromDDict(ddict); + size_t idx = ZSTD_DDictHashSet_getIndex(hashSet, dictID); + const size_t idxRangeMask = hashSet->ddictPtrTableSize - 1; + RETURN_ERROR_IF(hashSet->ddictPtrCount == hashSet->ddictPtrTableSize, GENERIC, "Hash set is full!"); + DEBUGLOG(4, "Hashed index: for dictID: %u is %zu", dictID, idx); + while (hashSet->ddictPtrTable[idx] != NULL) { + /* Replace existing ddict if inserting ddict with same dictID */ + if (ZSTD_getDictID_fromDDict(hashSet->ddictPtrTable[idx]) == dictID) { + DEBUGLOG(4, "DictID already exists, replacing rather than adding"); + hashSet->ddictPtrTable[idx] = ddict; + return 0; + } + idx &= idxRangeMask; + idx++; + } + DEBUGLOG(4, "Final idx after probing for dictID %u is: %zu", dictID, idx); + hashSet->ddictPtrTable[idx] = ddict; + hashSet->ddictPtrCount++; + return 0; +} + +/* Expands hash table by factor of DDICT_HASHSET_RESIZE_FACTOR and + * rehashes all values, allocates new table, frees old table. + * Returns 0 on success, otherwise a zstd error code. + */ +static size_t ZSTD_DDictHashSet_expand(ZSTD_DDictHashSet* hashSet, ZSTD_customMem customMem) { + size_t newTableSize = hashSet->ddictPtrTableSize * DDICT_HASHSET_RESIZE_FACTOR; + const ZSTD_DDict** newTable = (const ZSTD_DDict**)ZSTD_customCalloc(sizeof(ZSTD_DDict*) * newTableSize, customMem); + const ZSTD_DDict** oldTable = hashSet->ddictPtrTable; + size_t oldTableSize = hashSet->ddictPtrTableSize; + size_t i; + + DEBUGLOG(4, "Expanding DDict hash table! Old size: %zu new size: %zu", oldTableSize, newTableSize); + RETURN_ERROR_IF(!newTable, memory_allocation, "Expanded hashset allocation failed!"); + hashSet->ddictPtrTable = newTable; + hashSet->ddictPtrTableSize = newTableSize; + hashSet->ddictPtrCount = 0; + for (i = 0; i < oldTableSize; ++i) { + if (oldTable[i] != NULL) { + FORWARD_IF_ERROR(ZSTD_DDictHashSet_emplaceDDict(hashSet, oldTable[i]), ""); + } + } + ZSTD_customFree((void*)oldTable, customMem); + DEBUGLOG(4, "Finished re-hash"); + return 0; +} + +/* Fetches a DDict with the given dictID + * Returns the ZSTD_DDict* with the requested dictID. If it doesn't exist, then returns NULL. + */ +static const ZSTD_DDict* ZSTD_DDictHashSet_getDDict(ZSTD_DDictHashSet* hashSet, U32 dictID) { + size_t idx = ZSTD_DDictHashSet_getIndex(hashSet, dictID); + const size_t idxRangeMask = hashSet->ddictPtrTableSize - 1; + DEBUGLOG(4, "Hashed index: for dictID: %u is %zu", dictID, idx); + for (;;) { + size_t currDictID = ZSTD_getDictID_fromDDict(hashSet->ddictPtrTable[idx]); + if (currDictID == dictID || currDictID == 0) { + /* currDictID == 0 implies a NULL ddict entry */ + break; + } else { + idx &= idxRangeMask; /* Goes to start of table when we reach the end */ + idx++; + } + } + DEBUGLOG(4, "Final idx after probing for dictID %u is: %zu", dictID, idx); + return hashSet->ddictPtrTable[idx]; +} + +/* Allocates space for and returns a ddict hash set + * The hash set's ZSTD_DDict* table has all values automatically set to NULL to begin with. + * Returns NULL if allocation failed. + */ +static ZSTD_DDictHashSet* ZSTD_createDDictHashSet(ZSTD_customMem customMem) { + ZSTD_DDictHashSet* ret = (ZSTD_DDictHashSet*)ZSTD_customMalloc(sizeof(ZSTD_DDictHashSet), customMem); + DEBUGLOG(4, "Allocating new hash set"); + if (!ret) + return NULL; + ret->ddictPtrTable = (const ZSTD_DDict**)ZSTD_customCalloc(DDICT_HASHSET_TABLE_BASE_SIZE * sizeof(ZSTD_DDict*), customMem); + if (!ret->ddictPtrTable) { + ZSTD_customFree(ret, customMem); + return NULL; + } + ret->ddictPtrTableSize = DDICT_HASHSET_TABLE_BASE_SIZE; + ret->ddictPtrCount = 0; + return ret; +} + +/* Frees the table of ZSTD_DDict* within a hashset, then frees the hashset itself. + * Note: The ZSTD_DDict* within the table are NOT freed. + */ +static void ZSTD_freeDDictHashSet(ZSTD_DDictHashSet* hashSet, ZSTD_customMem customMem) { + DEBUGLOG(4, "Freeing ddict hash set"); + if (hashSet && hashSet->ddictPtrTable) { + ZSTD_customFree((void*)hashSet->ddictPtrTable, customMem); + } + if (hashSet) { + ZSTD_customFree(hashSet, customMem); + } +} + +/* Public function: Adds a DDict into the ZSTD_DDictHashSet, possibly triggering a resize of the hash set. + * Returns 0 on success, or a ZSTD error. + */ +static size_t ZSTD_DDictHashSet_addDDict(ZSTD_DDictHashSet* hashSet, const ZSTD_DDict* ddict, ZSTD_customMem customMem) { + DEBUGLOG(4, "Adding dict ID: %u to hashset with - Count: %zu Tablesize: %zu", ZSTD_getDictID_fromDDict(ddict), hashSet->ddictPtrCount, hashSet->ddictPtrTableSize); + if (hashSet->ddictPtrCount * DDICT_HASHSET_MAX_LOAD_FACTOR_COUNT_MULT / hashSet->ddictPtrTableSize * DDICT_HASHSET_MAX_LOAD_FACTOR_SIZE_MULT != 0) { + FORWARD_IF_ERROR(ZSTD_DDictHashSet_expand(hashSet, customMem), ""); + } + FORWARD_IF_ERROR(ZSTD_DDictHashSet_emplaceDDict(hashSet, ddict), ""); + return 0; +} + +/*-************************************************************* +* Context management +***************************************************************/ +size_t ZSTD_sizeof_DCtx (const ZSTD_DCtx* dctx) +{ + if (dctx==NULL) return 0; /* support sizeof NULL */ + return sizeof(*dctx) + + ZSTD_sizeof_DDict(dctx->ddictLocal) + + dctx->inBuffSize + dctx->outBuffSize; +} + +size_t ZSTD_estimateDCtxSize(void) { return sizeof(ZSTD_DCtx); } + + +static size_t ZSTD_startingInputLength(ZSTD_format_e format) +{ + size_t const startingInputLength = ZSTD_FRAMEHEADERSIZE_PREFIX(format); + /* only supports formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless */ + assert( (format == ZSTD_f_zstd1) || (format == ZSTD_f_zstd1_magicless) ); + return startingInputLength; +} + +static void ZSTD_DCtx_resetParameters(ZSTD_DCtx* dctx) +{ + assert(dctx->streamStage == zdss_init); + dctx->format = ZSTD_f_zstd1; + dctx->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT; + dctx->outBufferMode = ZSTD_bm_buffered; + dctx->forceIgnoreChecksum = ZSTD_d_validateChecksum; + dctx->refMultipleDDicts = ZSTD_rmd_refSingleDDict; + dctx->disableHufAsm = 0; +} + +static void ZSTD_initDCtx_internal(ZSTD_DCtx* dctx) +{ + dctx->staticSize = 0; + dctx->ddict = NULL; + dctx->ddictLocal = NULL; + dctx->dictEnd = NULL; + dctx->ddictIsCold = 0; + dctx->dictUses = ZSTD_dont_use; + dctx->inBuff = NULL; + dctx->inBuffSize = 0; + dctx->outBuffSize = 0; + dctx->streamStage = zdss_init; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) + dctx->legacyContext = NULL; + dctx->previousLegacyVersion = 0; +#endif + dctx->noForwardProgress = 0; + dctx->oversizedDuration = 0; +#if DYNAMIC_BMI2 + dctx->bmi2 = ZSTD_cpuSupportsBmi2(); +#endif + dctx->ddictSet = NULL; + ZSTD_DCtx_resetParameters(dctx); +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + dctx->dictContentEndForFuzzing = NULL; +#endif +} + +ZSTD_DCtx* ZSTD_initStaticDCtx(void *workspace, size_t workspaceSize) +{ + ZSTD_DCtx* const dctx = (ZSTD_DCtx*) workspace; + + if ((size_t)workspace & 7) return NULL; /* 8-aligned */ + if (workspaceSize < sizeof(ZSTD_DCtx)) return NULL; /* minimum size */ + + ZSTD_initDCtx_internal(dctx); + dctx->staticSize = workspaceSize; + dctx->inBuff = (char*)(dctx+1); + return dctx; +} + +static ZSTD_DCtx* ZSTD_createDCtx_internal(ZSTD_customMem customMem) { + if ((!customMem.customAlloc) ^ (!customMem.customFree)) return NULL; + + { ZSTD_DCtx* const dctx = (ZSTD_DCtx*)ZSTD_customMalloc(sizeof(*dctx), customMem); + if (!dctx) return NULL; + dctx->customMem = customMem; + ZSTD_initDCtx_internal(dctx); + return dctx; + } +} + +ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem) +{ + return ZSTD_createDCtx_internal(customMem); +} + +ZSTD_DCtx* ZSTD_createDCtx(void) +{ + DEBUGLOG(3, "ZSTD_createDCtx"); + return ZSTD_createDCtx_internal(ZSTD_defaultCMem); +} + +static void ZSTD_clearDict(ZSTD_DCtx* dctx) +{ + ZSTD_freeDDict(dctx->ddictLocal); + dctx->ddictLocal = NULL; + dctx->ddict = NULL; + dctx->dictUses = ZSTD_dont_use; +} + +size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx) +{ + if (dctx==NULL) return 0; /* support free on NULL */ + RETURN_ERROR_IF(dctx->staticSize, memory_allocation, "not compatible with static DCtx"); + { ZSTD_customMem const cMem = dctx->customMem; + ZSTD_clearDict(dctx); + ZSTD_customFree(dctx->inBuff, cMem); + dctx->inBuff = NULL; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1) + if (dctx->legacyContext) + ZSTD_freeLegacyStreamContext(dctx->legacyContext, dctx->previousLegacyVersion); +#endif + if (dctx->ddictSet) { + ZSTD_freeDDictHashSet(dctx->ddictSet, cMem); + dctx->ddictSet = NULL; + } + ZSTD_customFree(dctx, cMem); + return 0; + } +} + +/* no longer useful */ +void ZSTD_copyDCtx(ZSTD_DCtx* dstDCtx, const ZSTD_DCtx* srcDCtx) +{ + size_t const toCopy = (size_t)((char*)(&dstDCtx->inBuff) - (char*)dstDCtx); + ZSTD_memcpy(dstDCtx, srcDCtx, toCopy); /* no need to copy workspace */ +} + +/* Given a dctx with a digested frame params, re-selects the correct ZSTD_DDict based on + * the requested dict ID from the frame. If there exists a reference to the correct ZSTD_DDict, then + * accordingly sets the ddict to be used to decompress the frame. + * + * If no DDict is found, then no action is taken, and the ZSTD_DCtx::ddict remains as-is. + * + * ZSTD_d_refMultipleDDicts must be enabled for this function to be called. + */ +static void ZSTD_DCtx_selectFrameDDict(ZSTD_DCtx* dctx) { + assert(dctx->refMultipleDDicts && dctx->ddictSet); + DEBUGLOG(4, "Adjusting DDict based on requested dict ID from frame"); + if (dctx->ddict) { + const ZSTD_DDict* frameDDict = ZSTD_DDictHashSet_getDDict(dctx->ddictSet, dctx->fParams.dictID); + if (frameDDict) { + DEBUGLOG(4, "DDict found!"); + ZSTD_clearDict(dctx); + dctx->dictID = dctx->fParams.dictID; + dctx->ddict = frameDDict; + dctx->dictUses = ZSTD_use_indefinitely; + } + } +} + + +/*-************************************************************* + * Frame header decoding + ***************************************************************/ + +/*! ZSTD_isFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier. + * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. + * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. + * Note 3 : Skippable Frame Identifiers are considered valid. */ +unsigned ZSTD_isFrame(const void* buffer, size_t size) +{ + if (size < ZSTD_FRAMEIDSIZE) return 0; + { U32 const magic = MEM_readLE32(buffer); + if (magic == ZSTD_MAGICNUMBER) return 1; + if ((magic & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) return 1; + } +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1) + if (ZSTD_isLegacy(buffer, size)) return 1; +#endif + return 0; +} + +/*! ZSTD_isSkippableFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame. + * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. + */ +unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size) +{ + if (size < ZSTD_FRAMEIDSIZE) return 0; + { U32 const magic = MEM_readLE32(buffer); + if ((magic & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) return 1; + } + return 0; +} + +/** ZSTD_frameHeaderSize_internal() : + * srcSize must be large enough to reach header size fields. + * note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless. + * @return : size of the Frame Header + * or an error code, which can be tested with ZSTD_isError() */ +static size_t ZSTD_frameHeaderSize_internal(const void* src, size_t srcSize, ZSTD_format_e format) +{ + size_t const minInputSize = ZSTD_startingInputLength(format); + RETURN_ERROR_IF(srcSize < minInputSize, srcSize_wrong, ""); + + { BYTE const fhd = ((const BYTE*)src)[minInputSize-1]; + U32 const dictID= fhd & 3; + U32 const singleSegment = (fhd >> 5) & 1; + U32 const fcsId = fhd >> 6; + return minInputSize + !singleSegment + + ZSTD_did_fieldSize[dictID] + ZSTD_fcs_fieldSize[fcsId] + + (singleSegment && !fcsId); + } +} + +/** ZSTD_frameHeaderSize() : + * srcSize must be >= ZSTD_frameHeaderSize_prefix. + * @return : size of the Frame Header, + * or an error code (if srcSize is too small) */ +size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize) +{ + return ZSTD_frameHeaderSize_internal(src, srcSize, ZSTD_f_zstd1); +} + + +/** ZSTD_getFrameHeader_advanced() : + * decode Frame Header, or require larger `srcSize`. + * note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless + * @return : 0, `zfhPtr` is correctly filled, + * >0, `srcSize` is too small, value is wanted `srcSize` amount, +** or an error code, which can be tested using ZSTD_isError() */ +size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format) +{ + const BYTE* ip = (const BYTE*)src; + size_t const minInputSize = ZSTD_startingInputLength(format); + + DEBUGLOG(5, "ZSTD_getFrameHeader_advanced: minInputSize = %zu, srcSize = %zu", minInputSize, srcSize); + + if (srcSize > 0) { + /* note : technically could be considered an assert(), since it's an invalid entry */ + RETURN_ERROR_IF(src==NULL, GENERIC, "invalid parameter : src==NULL, but srcSize>0"); + } + if (srcSize < minInputSize) { + if (srcSize > 0 && format != ZSTD_f_zstd1_magicless) { + /* when receiving less than @minInputSize bytes, + * control these bytes at least correspond to a supported magic number + * in order to error out early if they don't. + **/ + size_t const toCopy = MIN(4, srcSize); + unsigned char hbuf[4]; MEM_writeLE32(hbuf, ZSTD_MAGICNUMBER); + assert(src != NULL); + ZSTD_memcpy(hbuf, src, toCopy); + if ( MEM_readLE32(hbuf) != ZSTD_MAGICNUMBER ) { + /* not a zstd frame : let's check if it's a skippable frame */ + MEM_writeLE32(hbuf, ZSTD_MAGIC_SKIPPABLE_START); + ZSTD_memcpy(hbuf, src, toCopy); + if ((MEM_readLE32(hbuf) & ZSTD_MAGIC_SKIPPABLE_MASK) != ZSTD_MAGIC_SKIPPABLE_START) { + RETURN_ERROR(prefix_unknown, + "first bytes don't correspond to any supported magic number"); + } } } + return minInputSize; + } + + ZSTD_memset(zfhPtr, 0, sizeof(*zfhPtr)); /* not strictly necessary, but static analyzers may not understand that zfhPtr will be read only if return value is zero, since they are 2 different signals */ + if ( (format != ZSTD_f_zstd1_magicless) + && (MEM_readLE32(src) != ZSTD_MAGICNUMBER) ) { + if ((MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { + /* skippable frame */ + if (srcSize < ZSTD_SKIPPABLEHEADERSIZE) + return ZSTD_SKIPPABLEHEADERSIZE; /* magic number + frame length */ + ZSTD_memset(zfhPtr, 0, sizeof(*zfhPtr)); + zfhPtr->frameContentSize = MEM_readLE32((const char *)src + ZSTD_FRAMEIDSIZE); + zfhPtr->frameType = ZSTD_skippableFrame; + return 0; + } + RETURN_ERROR(prefix_unknown, ""); + } + + /* ensure there is enough `srcSize` to fully read/decode frame header */ + { size_t const fhsize = ZSTD_frameHeaderSize_internal(src, srcSize, format); + if (srcSize < fhsize) return fhsize; + zfhPtr->headerSize = (U32)fhsize; + } + + { BYTE const fhdByte = ip[minInputSize-1]; + size_t pos = minInputSize; + U32 const dictIDSizeCode = fhdByte&3; + U32 const checksumFlag = (fhdByte>>2)&1; + U32 const singleSegment = (fhdByte>>5)&1; + U32 const fcsID = fhdByte>>6; + U64 windowSize = 0; + U32 dictID = 0; + U64 frameContentSize = ZSTD_CONTENTSIZE_UNKNOWN; + RETURN_ERROR_IF((fhdByte & 0x08) != 0, frameParameter_unsupported, + "reserved bits, must be zero"); + + if (!singleSegment) { + BYTE const wlByte = ip[pos++]; + U32 const windowLog = (wlByte >> 3) + ZSTD_WINDOWLOG_ABSOLUTEMIN; + RETURN_ERROR_IF(windowLog > ZSTD_WINDOWLOG_MAX, frameParameter_windowTooLarge, ""); + windowSize = (1ULL << windowLog); + windowSize += (windowSize >> 3) * (wlByte&7); + } + switch(dictIDSizeCode) + { + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; + case 0 : break; + case 1 : dictID = ip[pos]; pos++; break; + case 2 : dictID = MEM_readLE16(ip+pos); pos+=2; break; + case 3 : dictID = MEM_readLE32(ip+pos); pos+=4; break; + } + switch(fcsID) + { + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; + case 0 : if (singleSegment) frameContentSize = ip[pos]; break; + case 1 : frameContentSize = MEM_readLE16(ip+pos)+256; break; + case 2 : frameContentSize = MEM_readLE32(ip+pos); break; + case 3 : frameContentSize = MEM_readLE64(ip+pos); break; + } + if (singleSegment) windowSize = frameContentSize; + + zfhPtr->frameType = ZSTD_frame; + zfhPtr->frameContentSize = frameContentSize; + zfhPtr->windowSize = windowSize; + zfhPtr->blockSizeMax = (unsigned) MIN(windowSize, ZSTD_BLOCKSIZE_MAX); + zfhPtr->dictID = dictID; + zfhPtr->checksumFlag = checksumFlag; + } + return 0; +} + +/** ZSTD_getFrameHeader() : + * decode Frame Header, or require larger `srcSize`. + * note : this function does not consume input, it only reads it. + * @return : 0, `zfhPtr` is correctly filled, + * >0, `srcSize` is too small, value is wanted `srcSize` amount, + * or an error code, which can be tested using ZSTD_isError() */ +size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize) +{ + return ZSTD_getFrameHeader_advanced(zfhPtr, src, srcSize, ZSTD_f_zstd1); +} + +/** ZSTD_getFrameContentSize() : + * compatible with legacy mode + * @return : decompressed size of the single frame pointed to be `src` if known, otherwise + * - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined + * - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) */ +unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize) +{ +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1) + if (ZSTD_isLegacy(src, srcSize)) { + unsigned long long const ret = ZSTD_getDecompressedSize_legacy(src, srcSize); + return ret == 0 ? ZSTD_CONTENTSIZE_UNKNOWN : ret; + } +#endif + { ZSTD_frameHeader zfh; + if (ZSTD_getFrameHeader(&zfh, src, srcSize) != 0) + return ZSTD_CONTENTSIZE_ERROR; + if (zfh.frameType == ZSTD_skippableFrame) { + return 0; + } else { + return zfh.frameContentSize; + } } +} + +static size_t readSkippableFrameSize(void const* src, size_t srcSize) +{ + size_t const skippableHeaderSize = ZSTD_SKIPPABLEHEADERSIZE; + U32 sizeU32; + + RETURN_ERROR_IF(srcSize < ZSTD_SKIPPABLEHEADERSIZE, srcSize_wrong, ""); + + sizeU32 = MEM_readLE32((BYTE const*)src + ZSTD_FRAMEIDSIZE); + RETURN_ERROR_IF((U32)(sizeU32 + ZSTD_SKIPPABLEHEADERSIZE) < sizeU32, + frameParameter_unsupported, ""); + { size_t const skippableSize = skippableHeaderSize + sizeU32; + RETURN_ERROR_IF(skippableSize > srcSize, srcSize_wrong, ""); + return skippableSize; + } +} + +/*! ZSTD_readSkippableFrame() : + * Retrieves content of a skippable frame, and writes it to dst buffer. + * + * The parameter magicVariant will receive the magicVariant that was supplied when the frame was written, + * i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested + * in the magicVariant. + * + * Returns an error if destination buffer is not large enough, or if this is not a valid skippable frame. + * + * @return : number of bytes written or a ZSTD error. + */ +size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity, + unsigned* magicVariant, /* optional, can be NULL */ + const void* src, size_t srcSize) +{ + RETURN_ERROR_IF(srcSize < ZSTD_SKIPPABLEHEADERSIZE, srcSize_wrong, ""); + + { U32 const magicNumber = MEM_readLE32(src); + size_t skippableFrameSize = readSkippableFrameSize(src, srcSize); + size_t skippableContentSize = skippableFrameSize - ZSTD_SKIPPABLEHEADERSIZE; + + /* check input validity */ + RETURN_ERROR_IF(!ZSTD_isSkippableFrame(src, srcSize), frameParameter_unsupported, ""); + RETURN_ERROR_IF(skippableFrameSize < ZSTD_SKIPPABLEHEADERSIZE || skippableFrameSize > srcSize, srcSize_wrong, ""); + RETURN_ERROR_IF(skippableContentSize > dstCapacity, dstSize_tooSmall, ""); + + /* deliver payload */ + if (skippableContentSize > 0 && dst != NULL) + ZSTD_memcpy(dst, (const BYTE *)src + ZSTD_SKIPPABLEHEADERSIZE, skippableContentSize); + if (magicVariant != NULL) + *magicVariant = magicNumber - ZSTD_MAGIC_SKIPPABLE_START; + return skippableContentSize; + } +} + +/** ZSTD_findDecompressedSize() : + * `srcSize` must be the exact length of some number of ZSTD compressed and/or + * skippable frames + * note: compatible with legacy mode + * @return : decompressed size of the frames contained */ +unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize) +{ + unsigned long long totalDstSize = 0; + + while (srcSize >= ZSTD_startingInputLength(ZSTD_f_zstd1)) { + U32 const magicNumber = MEM_readLE32(src); + + if ((magicNumber & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { + size_t const skippableSize = readSkippableFrameSize(src, srcSize); + if (ZSTD_isError(skippableSize)) return ZSTD_CONTENTSIZE_ERROR; + assert(skippableSize <= srcSize); + + src = (const BYTE *)src + skippableSize; + srcSize -= skippableSize; + continue; + } + + { unsigned long long const fcs = ZSTD_getFrameContentSize(src, srcSize); + if (fcs >= ZSTD_CONTENTSIZE_ERROR) return fcs; + + if (totalDstSize + fcs < totalDstSize) + return ZSTD_CONTENTSIZE_ERROR; /* check for overflow */ + totalDstSize += fcs; + } + /* skip to next frame */ + { size_t const frameSrcSize = ZSTD_findFrameCompressedSize(src, srcSize); + if (ZSTD_isError(frameSrcSize)) return ZSTD_CONTENTSIZE_ERROR; + assert(frameSrcSize <= srcSize); + + src = (const BYTE *)src + frameSrcSize; + srcSize -= frameSrcSize; + } + } /* while (srcSize >= ZSTD_frameHeaderSize_prefix) */ + + if (srcSize) return ZSTD_CONTENTSIZE_ERROR; + + return totalDstSize; +} + +/** ZSTD_getDecompressedSize() : + * compatible with legacy mode + * @return : decompressed size if known, 0 otherwise + note : 0 can mean any of the following : + - frame content is empty + - decompressed size field is not present in frame header + - frame header unknown / not supported + - frame header not complete (`srcSize` too small) */ +unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize) +{ + unsigned long long const ret = ZSTD_getFrameContentSize(src, srcSize); + ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_ERROR < ZSTD_CONTENTSIZE_UNKNOWN); + return (ret >= ZSTD_CONTENTSIZE_ERROR) ? 0 : ret; +} + + +/** ZSTD_decodeFrameHeader() : + * `headerSize` must be the size provided by ZSTD_frameHeaderSize(). + * If multiple DDict references are enabled, also will choose the correct DDict to use. + * @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */ +static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* dctx, const void* src, size_t headerSize) +{ + size_t const result = ZSTD_getFrameHeader_advanced(&(dctx->fParams), src, headerSize, dctx->format); + if (ZSTD_isError(result)) return result; /* invalid header */ + RETURN_ERROR_IF(result>0, srcSize_wrong, "headerSize too small"); + + /* Reference DDict requested by frame if dctx references multiple ddicts */ + if (dctx->refMultipleDDicts == ZSTD_rmd_refMultipleDDicts && dctx->ddictSet) { + ZSTD_DCtx_selectFrameDDict(dctx); + } + +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + /* Skip the dictID check in fuzzing mode, because it makes the search + * harder. + */ + RETURN_ERROR_IF(dctx->fParams.dictID && (dctx->dictID != dctx->fParams.dictID), + dictionary_wrong, ""); +#endif + dctx->validateChecksum = (dctx->fParams.checksumFlag && !dctx->forceIgnoreChecksum) ? 1 : 0; + if (dctx->validateChecksum) XXH64_reset(&dctx->xxhState, 0); + dctx->processedCSize += headerSize; + return 0; +} + +static ZSTD_frameSizeInfo ZSTD_errorFrameSizeInfo(size_t ret) +{ + ZSTD_frameSizeInfo frameSizeInfo; + frameSizeInfo.compressedSize = ret; + frameSizeInfo.decompressedBound = ZSTD_CONTENTSIZE_ERROR; + return frameSizeInfo; +} + +static ZSTD_frameSizeInfo ZSTD_findFrameSizeInfo(const void* src, size_t srcSize) +{ + ZSTD_frameSizeInfo frameSizeInfo; + ZSTD_memset(&frameSizeInfo, 0, sizeof(ZSTD_frameSizeInfo)); + +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1) + if (ZSTD_isLegacy(src, srcSize)) + return ZSTD_findFrameSizeInfoLegacy(src, srcSize); +#endif + + if ((srcSize >= ZSTD_SKIPPABLEHEADERSIZE) + && (MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { + frameSizeInfo.compressedSize = readSkippableFrameSize(src, srcSize); + assert(ZSTD_isError(frameSizeInfo.compressedSize) || + frameSizeInfo.compressedSize <= srcSize); + return frameSizeInfo; + } else { + const BYTE* ip = (const BYTE*)src; + const BYTE* const ipstart = ip; + size_t remainingSize = srcSize; + size_t nbBlocks = 0; + ZSTD_frameHeader zfh; + + /* Extract Frame Header */ + { size_t const ret = ZSTD_getFrameHeader(&zfh, src, srcSize); + if (ZSTD_isError(ret)) + return ZSTD_errorFrameSizeInfo(ret); + if (ret > 0) + return ZSTD_errorFrameSizeInfo(ERROR(srcSize_wrong)); + } + + ip += zfh.headerSize; + remainingSize -= zfh.headerSize; + + /* Iterate over each block */ + while (1) { + blockProperties_t blockProperties; + size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties); + if (ZSTD_isError(cBlockSize)) + return ZSTD_errorFrameSizeInfo(cBlockSize); + + if (ZSTD_blockHeaderSize + cBlockSize > remainingSize) + return ZSTD_errorFrameSizeInfo(ERROR(srcSize_wrong)); + + ip += ZSTD_blockHeaderSize + cBlockSize; + remainingSize -= ZSTD_blockHeaderSize + cBlockSize; + nbBlocks++; + + if (blockProperties.lastBlock) break; + } + + /* Final frame content checksum */ + if (zfh.checksumFlag) { + if (remainingSize < 4) + return ZSTD_errorFrameSizeInfo(ERROR(srcSize_wrong)); + ip += 4; + } + + frameSizeInfo.nbBlocks = nbBlocks; + frameSizeInfo.compressedSize = (size_t)(ip - ipstart); + frameSizeInfo.decompressedBound = (zfh.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN) + ? zfh.frameContentSize + : (unsigned long long)nbBlocks * zfh.blockSizeMax; + return frameSizeInfo; + } +} + +/** ZSTD_findFrameCompressedSize() : + * compatible with legacy mode + * `src` must point to the start of a ZSTD frame, ZSTD legacy frame, or skippable frame + * `srcSize` must be at least as large as the frame contained + * @return : the compressed size of the frame starting at `src` */ +size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize) +{ + ZSTD_frameSizeInfo const frameSizeInfo = ZSTD_findFrameSizeInfo(src, srcSize); + return frameSizeInfo.compressedSize; +} + +/** ZSTD_decompressBound() : + * compatible with legacy mode + * `src` must point to the start of a ZSTD frame or a skippeable frame + * `srcSize` must be at least as large as the frame contained + * @return : the maximum decompressed size of the compressed source + */ +unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize) +{ + unsigned long long bound = 0; + /* Iterate over each frame */ + while (srcSize > 0) { + ZSTD_frameSizeInfo const frameSizeInfo = ZSTD_findFrameSizeInfo(src, srcSize); + size_t const compressedSize = frameSizeInfo.compressedSize; + unsigned long long const decompressedBound = frameSizeInfo.decompressedBound; + if (ZSTD_isError(compressedSize) || decompressedBound == ZSTD_CONTENTSIZE_ERROR) + return ZSTD_CONTENTSIZE_ERROR; + assert(srcSize >= compressedSize); + src = (const BYTE*)src + compressedSize; + srcSize -= compressedSize; + bound += decompressedBound; + } + return bound; +} + +size_t ZSTD_decompressionMargin(void const* src, size_t srcSize) +{ + size_t margin = 0; + unsigned maxBlockSize = 0; + + /* Iterate over each frame */ + while (srcSize > 0) { + ZSTD_frameSizeInfo const frameSizeInfo = ZSTD_findFrameSizeInfo(src, srcSize); + size_t const compressedSize = frameSizeInfo.compressedSize; + unsigned long long const decompressedBound = frameSizeInfo.decompressedBound; + ZSTD_frameHeader zfh; + + FORWARD_IF_ERROR(ZSTD_getFrameHeader(&zfh, src, srcSize), ""); + if (ZSTD_isError(compressedSize) || decompressedBound == ZSTD_CONTENTSIZE_ERROR) + return ERROR(corruption_detected); + + if (zfh.frameType == ZSTD_frame) { + /* Add the frame header to our margin */ + margin += zfh.headerSize; + /* Add the checksum to our margin */ + margin += zfh.checksumFlag ? 4 : 0; + /* Add 3 bytes per block */ + margin += 3 * frameSizeInfo.nbBlocks; + + /* Compute the max block size */ + maxBlockSize = MAX(maxBlockSize, zfh.blockSizeMax); + } else { + assert(zfh.frameType == ZSTD_skippableFrame); + /* Add the entire skippable frame size to our margin. */ + margin += compressedSize; + } + + assert(srcSize >= compressedSize); + src = (const BYTE*)src + compressedSize; + srcSize -= compressedSize; + } + + /* Add the max block size back to the margin. */ + margin += maxBlockSize; + + return margin; +} + +/*-************************************************************* + * Frame decoding + ***************************************************************/ + +/** ZSTD_insertBlock() : + * insert `src` block into `dctx` history. Useful to track uncompressed blocks. */ +size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize) +{ + DEBUGLOG(5, "ZSTD_insertBlock: %u bytes", (unsigned)blockSize); + ZSTD_checkContinuity(dctx, blockStart, blockSize); + dctx->previousDstEnd = (const char*)blockStart + blockSize; + return blockSize; +} + + +static size_t ZSTD_copyRawBlock(void* dst, size_t dstCapacity, + const void* src, size_t srcSize) +{ + DEBUGLOG(5, "ZSTD_copyRawBlock"); + RETURN_ERROR_IF(srcSize > dstCapacity, dstSize_tooSmall, ""); + if (dst == NULL) { + if (srcSize == 0) return 0; + RETURN_ERROR(dstBuffer_null, ""); + } + ZSTD_memmove(dst, src, srcSize); + return srcSize; +} + +static size_t ZSTD_setRleBlock(void* dst, size_t dstCapacity, + BYTE b, + size_t regenSize) +{ + RETURN_ERROR_IF(regenSize > dstCapacity, dstSize_tooSmall, ""); + if (dst == NULL) { + if (regenSize == 0) return 0; + RETURN_ERROR(dstBuffer_null, ""); + } + ZSTD_memset(dst, b, regenSize); + return regenSize; +} + +static void ZSTD_DCtx_trace_end(ZSTD_DCtx const* dctx, U64 uncompressedSize, U64 compressedSize, unsigned streaming) +{ +#if ZSTD_TRACE + if (dctx->traceCtx && ZSTD_trace_decompress_end != NULL) { + ZSTD_Trace trace; + ZSTD_memset(&trace, 0, sizeof(trace)); + trace.version = ZSTD_VERSION_NUMBER; + trace.streaming = streaming; + if (dctx->ddict) { + trace.dictionaryID = ZSTD_getDictID_fromDDict(dctx->ddict); + trace.dictionarySize = ZSTD_DDict_dictSize(dctx->ddict); + trace.dictionaryIsCold = dctx->ddictIsCold; + } + trace.uncompressedSize = (size_t)uncompressedSize; + trace.compressedSize = (size_t)compressedSize; + trace.dctx = dctx; + ZSTD_trace_decompress_end(dctx->traceCtx, &trace); + } +#else + (void)dctx; + (void)uncompressedSize; + (void)compressedSize; + (void)streaming; +#endif +} + + +/*! ZSTD_decompressFrame() : + * @dctx must be properly initialized + * will update *srcPtr and *srcSizePtr, + * to make *srcPtr progress by one frame. */ +static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void** srcPtr, size_t *srcSizePtr) +{ + const BYTE* const istart = (const BYTE*)(*srcPtr); + const BYTE* ip = istart; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = dstCapacity != 0 ? ostart + dstCapacity : ostart; + BYTE* op = ostart; + size_t remainingSrcSize = *srcSizePtr; + + DEBUGLOG(4, "ZSTD_decompressFrame (srcSize:%i)", (int)*srcSizePtr); + + /* check */ + RETURN_ERROR_IF( + remainingSrcSize < ZSTD_FRAMEHEADERSIZE_MIN(dctx->format)+ZSTD_blockHeaderSize, + srcSize_wrong, ""); + + /* Frame Header */ + { size_t const frameHeaderSize = ZSTD_frameHeaderSize_internal( + ip, ZSTD_FRAMEHEADERSIZE_PREFIX(dctx->format), dctx->format); + if (ZSTD_isError(frameHeaderSize)) return frameHeaderSize; + RETURN_ERROR_IF(remainingSrcSize < frameHeaderSize+ZSTD_blockHeaderSize, + srcSize_wrong, ""); + FORWARD_IF_ERROR( ZSTD_decodeFrameHeader(dctx, ip, frameHeaderSize) , ""); + ip += frameHeaderSize; remainingSrcSize -= frameHeaderSize; + } + + /* Loop on each block */ + while (1) { + BYTE* oBlockEnd = oend; + size_t decodedSize; + blockProperties_t blockProperties; + size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSrcSize, &blockProperties); + if (ZSTD_isError(cBlockSize)) return cBlockSize; + + ip += ZSTD_blockHeaderSize; + remainingSrcSize -= ZSTD_blockHeaderSize; + RETURN_ERROR_IF(cBlockSize > remainingSrcSize, srcSize_wrong, ""); + + if (ip >= op && ip < oBlockEnd) { + /* We are decompressing in-place. Limit the output pointer so that we + * don't overwrite the block that we are currently reading. This will + * fail decompression if the input & output pointers aren't spaced + * far enough apart. + * + * This is important to set, even when the pointers are far enough + * apart, because ZSTD_decompressBlock_internal() can decide to store + * literals in the output buffer, after the block it is decompressing. + * Since we don't want anything to overwrite our input, we have to tell + * ZSTD_decompressBlock_internal to never write past ip. + * + * See ZSTD_allocateLiteralsBuffer() for reference. + */ + oBlockEnd = op + (ip - op); + } + + switch(blockProperties.blockType) + { + case bt_compressed: + decodedSize = ZSTD_decompressBlock_internal(dctx, op, (size_t)(oBlockEnd-op), ip, cBlockSize, /* frame */ 1, not_streaming); + break; + case bt_raw : + /* Use oend instead of oBlockEnd because this function is safe to overlap. It uses memmove. */ + decodedSize = ZSTD_copyRawBlock(op, (size_t)(oend-op), ip, cBlockSize); + break; + case bt_rle : + decodedSize = ZSTD_setRleBlock(op, (size_t)(oBlockEnd-op), *ip, blockProperties.origSize); + break; + case bt_reserved : + default: + RETURN_ERROR(corruption_detected, "invalid block type"); + } + + if (ZSTD_isError(decodedSize)) return decodedSize; + if (dctx->validateChecksum) + XXH64_update(&dctx->xxhState, op, decodedSize); + if (decodedSize != 0) + op += decodedSize; + assert(ip != NULL); + ip += cBlockSize; + remainingSrcSize -= cBlockSize; + if (blockProperties.lastBlock) break; + } + + if (dctx->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN) { + RETURN_ERROR_IF((U64)(op-ostart) != dctx->fParams.frameContentSize, + corruption_detected, ""); + } + if (dctx->fParams.checksumFlag) { /* Frame content checksum verification */ + RETURN_ERROR_IF(remainingSrcSize<4, checksum_wrong, ""); + if (!dctx->forceIgnoreChecksum) { + U32 const checkCalc = (U32)XXH64_digest(&dctx->xxhState); + U32 checkRead; + checkRead = MEM_readLE32(ip); + RETURN_ERROR_IF(checkRead != checkCalc, checksum_wrong, ""); + } + ip += 4; + remainingSrcSize -= 4; + } + ZSTD_DCtx_trace_end(dctx, (U64)(op-ostart), (U64)(ip-istart), /* streaming */ 0); + /* Allow caller to get size read */ + DEBUGLOG(4, "ZSTD_decompressFrame: decompressed frame of size %zi, consuming %zi bytes of input", op-ostart, ip - (const BYTE*)*srcPtr); + *srcPtr = ip; + *srcSizePtr = remainingSrcSize; + return (size_t)(op-ostart); +} + +static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + const ZSTD_DDict* ddict) +{ + void* const dststart = dst; + int moreThan1Frame = 0; + + DEBUGLOG(5, "ZSTD_decompressMultiFrame"); + assert(dict==NULL || ddict==NULL); /* either dict or ddict set, not both */ + + if (ddict) { + dict = ZSTD_DDict_dictContent(ddict); + dictSize = ZSTD_DDict_dictSize(ddict); + } + + while (srcSize >= ZSTD_startingInputLength(dctx->format)) { + +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1) + if (ZSTD_isLegacy(src, srcSize)) { + size_t decodedSize; + size_t const frameSize = ZSTD_findFrameCompressedSizeLegacy(src, srcSize); + if (ZSTD_isError(frameSize)) return frameSize; + RETURN_ERROR_IF(dctx->staticSize, memory_allocation, + "legacy support is not compatible with static dctx"); + + decodedSize = ZSTD_decompressLegacy(dst, dstCapacity, src, frameSize, dict, dictSize); + if (ZSTD_isError(decodedSize)) return decodedSize; + + assert(decodedSize <= dstCapacity); + dst = (BYTE*)dst + decodedSize; + dstCapacity -= decodedSize; + + src = (const BYTE*)src + frameSize; + srcSize -= frameSize; + + continue; + } +#endif + + if (srcSize >= 4) { + U32 const magicNumber = MEM_readLE32(src); + DEBUGLOG(5, "reading magic number %08X", (unsigned)magicNumber); + if ((magicNumber & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { + /* skippable frame detected : skip it */ + size_t const skippableSize = readSkippableFrameSize(src, srcSize); + FORWARD_IF_ERROR(skippableSize, "invalid skippable frame"); + assert(skippableSize <= srcSize); + + src = (const BYTE *)src + skippableSize; + srcSize -= skippableSize; + continue; /* check next frame */ + } } + + if (ddict) { + /* we were called from ZSTD_decompress_usingDDict */ + FORWARD_IF_ERROR(ZSTD_decompressBegin_usingDDict(dctx, ddict), ""); + } else { + /* this will initialize correctly with no dict if dict == NULL, so + * use this in all cases but ddict */ + FORWARD_IF_ERROR(ZSTD_decompressBegin_usingDict(dctx, dict, dictSize), ""); + } + ZSTD_checkContinuity(dctx, dst, dstCapacity); + + { const size_t res = ZSTD_decompressFrame(dctx, dst, dstCapacity, + &src, &srcSize); + RETURN_ERROR_IF( + (ZSTD_getErrorCode(res) == ZSTD_error_prefix_unknown) + && (moreThan1Frame==1), + srcSize_wrong, + "At least one frame successfully completed, " + "but following bytes are garbage: " + "it's more likely to be a srcSize error, " + "specifying more input bytes than size of frame(s). " + "Note: one could be unlucky, it might be a corruption error instead, " + "happening right at the place where we expect zstd magic bytes. " + "But this is _much_ less likely than a srcSize field error."); + if (ZSTD_isError(res)) return res; + assert(res <= dstCapacity); + if (res != 0) + dst = (BYTE*)dst + res; + dstCapacity -= res; + } + moreThan1Frame = 1; + } /* while (srcSize >= ZSTD_frameHeaderSize_prefix) */ + + RETURN_ERROR_IF(srcSize, srcSize_wrong, "input not entirely consumed"); + + return (size_t)((BYTE*)dst - (BYTE*)dststart); +} + +size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize) +{ + return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize, dict, dictSize, NULL); +} + + +static ZSTD_DDict const* ZSTD_getDDict(ZSTD_DCtx* dctx) +{ + switch (dctx->dictUses) { + default: + assert(0 /* Impossible */); + ZSTD_FALLTHROUGH; + case ZSTD_dont_use: + ZSTD_clearDict(dctx); + return NULL; + case ZSTD_use_indefinitely: + return dctx->ddict; + case ZSTD_use_once: + dctx->dictUses = ZSTD_dont_use; + return dctx->ddict; + } +} + +size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize) +{ + return ZSTD_decompress_usingDDict(dctx, dst, dstCapacity, src, srcSize, ZSTD_getDDict(dctx)); +} + + +size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t srcSize) +{ +#if defined(ZSTD_HEAPMODE) && (ZSTD_HEAPMODE>=1) + size_t regenSize; + ZSTD_DCtx* const dctx = ZSTD_createDCtx_internal(ZSTD_defaultCMem); + RETURN_ERROR_IF(dctx==NULL, memory_allocation, "NULL pointer!"); + regenSize = ZSTD_decompressDCtx(dctx, dst, dstCapacity, src, srcSize); + ZSTD_freeDCtx(dctx); + return regenSize; +#else /* stack mode */ + ZSTD_DCtx dctx; + ZSTD_initDCtx_internal(&dctx); + return ZSTD_decompressDCtx(&dctx, dst, dstCapacity, src, srcSize); +#endif +} + + +/*-************************************** +* Advanced Streaming Decompression API +* Bufferless and synchronous +****************************************/ +size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx) { return dctx->expected; } + +/** + * Similar to ZSTD_nextSrcSizeToDecompress(), but when a block input can be streamed, we + * allow taking a partial block as the input. Currently only raw uncompressed blocks can + * be streamed. + * + * For blocks that can be streamed, this allows us to reduce the latency until we produce + * output, and avoid copying the input. + * + * @param inputSize - The total amount of input that the caller currently has. + */ +static size_t ZSTD_nextSrcSizeToDecompressWithInputSize(ZSTD_DCtx* dctx, size_t inputSize) { + if (!(dctx->stage == ZSTDds_decompressBlock || dctx->stage == ZSTDds_decompressLastBlock)) + return dctx->expected; + if (dctx->bType != bt_raw) + return dctx->expected; + return BOUNDED(1, inputSize, dctx->expected); +} + +ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) { + switch(dctx->stage) + { + default: /* should not happen */ + assert(0); + ZSTD_FALLTHROUGH; + case ZSTDds_getFrameHeaderSize: + ZSTD_FALLTHROUGH; + case ZSTDds_decodeFrameHeader: + return ZSTDnit_frameHeader; + case ZSTDds_decodeBlockHeader: + return ZSTDnit_blockHeader; + case ZSTDds_decompressBlock: + return ZSTDnit_block; + case ZSTDds_decompressLastBlock: + return ZSTDnit_lastBlock; + case ZSTDds_checkChecksum: + return ZSTDnit_checksum; + case ZSTDds_decodeSkippableHeader: + ZSTD_FALLTHROUGH; + case ZSTDds_skipFrame: + return ZSTDnit_skippableFrame; + } +} + +static int ZSTD_isSkipFrame(ZSTD_DCtx* dctx) { return dctx->stage == ZSTDds_skipFrame; } + +/** ZSTD_decompressContinue() : + * srcSize : must be the exact nb of bytes expected (see ZSTD_nextSrcSizeToDecompress()) + * @return : nb of bytes generated into `dst` (necessarily <= `dstCapacity) + * or an error code, which can be tested using ZSTD_isError() */ +size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize) +{ + DEBUGLOG(5, "ZSTD_decompressContinue (srcSize:%u)", (unsigned)srcSize); + /* Sanity check */ + RETURN_ERROR_IF(srcSize != ZSTD_nextSrcSizeToDecompressWithInputSize(dctx, srcSize), srcSize_wrong, "not allowed"); + ZSTD_checkContinuity(dctx, dst, dstCapacity); + + dctx->processedCSize += srcSize; + + switch (dctx->stage) + { + case ZSTDds_getFrameHeaderSize : + assert(src != NULL); + if (dctx->format == ZSTD_f_zstd1) { /* allows header */ + assert(srcSize >= ZSTD_FRAMEIDSIZE); /* to read skippable magic number */ + if ((MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */ + ZSTD_memcpy(dctx->headerBuffer, src, srcSize); + dctx->expected = ZSTD_SKIPPABLEHEADERSIZE - srcSize; /* remaining to load to get full skippable frame header */ + dctx->stage = ZSTDds_decodeSkippableHeader; + return 0; + } } + dctx->headerSize = ZSTD_frameHeaderSize_internal(src, srcSize, dctx->format); + if (ZSTD_isError(dctx->headerSize)) return dctx->headerSize; + ZSTD_memcpy(dctx->headerBuffer, src, srcSize); + dctx->expected = dctx->headerSize - srcSize; + dctx->stage = ZSTDds_decodeFrameHeader; + return 0; + + case ZSTDds_decodeFrameHeader: + assert(src != NULL); + ZSTD_memcpy(dctx->headerBuffer + (dctx->headerSize - srcSize), src, srcSize); + FORWARD_IF_ERROR(ZSTD_decodeFrameHeader(dctx, dctx->headerBuffer, dctx->headerSize), ""); + dctx->expected = ZSTD_blockHeaderSize; + dctx->stage = ZSTDds_decodeBlockHeader; + return 0; + + case ZSTDds_decodeBlockHeader: + { blockProperties_t bp; + size_t const cBlockSize = ZSTD_getcBlockSize(src, ZSTD_blockHeaderSize, &bp); + if (ZSTD_isError(cBlockSize)) return cBlockSize; + RETURN_ERROR_IF(cBlockSize > dctx->fParams.blockSizeMax, corruption_detected, "Block Size Exceeds Maximum"); + dctx->expected = cBlockSize; + dctx->bType = bp.blockType; + dctx->rleSize = bp.origSize; + if (cBlockSize) { + dctx->stage = bp.lastBlock ? ZSTDds_decompressLastBlock : ZSTDds_decompressBlock; + return 0; + } + /* empty block */ + if (bp.lastBlock) { + if (dctx->fParams.checksumFlag) { + dctx->expected = 4; + dctx->stage = ZSTDds_checkChecksum; + } else { + dctx->expected = 0; /* end of frame */ + dctx->stage = ZSTDds_getFrameHeaderSize; + } + } else { + dctx->expected = ZSTD_blockHeaderSize; /* jump to next header */ + dctx->stage = ZSTDds_decodeBlockHeader; + } + return 0; + } + + case ZSTDds_decompressLastBlock: + case ZSTDds_decompressBlock: + DEBUGLOG(5, "ZSTD_decompressContinue: case ZSTDds_decompressBlock"); + { size_t rSize; + switch(dctx->bType) + { + case bt_compressed: + DEBUGLOG(5, "ZSTD_decompressContinue: case bt_compressed"); + rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 1, is_streaming); + dctx->expected = 0; /* Streaming not supported */ + break; + case bt_raw : + assert(srcSize <= dctx->expected); + rSize = ZSTD_copyRawBlock(dst, dstCapacity, src, srcSize); + FORWARD_IF_ERROR(rSize, "ZSTD_copyRawBlock failed"); + assert(rSize == srcSize); + dctx->expected -= rSize; + break; + case bt_rle : + rSize = ZSTD_setRleBlock(dst, dstCapacity, *(const BYTE*)src, dctx->rleSize); + dctx->expected = 0; /* Streaming not supported */ + break; + case bt_reserved : /* should never happen */ + default: + RETURN_ERROR(corruption_detected, "invalid block type"); + } + FORWARD_IF_ERROR(rSize, ""); + RETURN_ERROR_IF(rSize > dctx->fParams.blockSizeMax, corruption_detected, "Decompressed Block Size Exceeds Maximum"); + DEBUGLOG(5, "ZSTD_decompressContinue: decoded size from block : %u", (unsigned)rSize); + dctx->decodedSize += rSize; + if (dctx->validateChecksum) XXH64_update(&dctx->xxhState, dst, rSize); + dctx->previousDstEnd = (char*)dst + rSize; + + /* Stay on the same stage until we are finished streaming the block. */ + if (dctx->expected > 0) { + return rSize; + } + + if (dctx->stage == ZSTDds_decompressLastBlock) { /* end of frame */ + DEBUGLOG(4, "ZSTD_decompressContinue: decoded size from frame : %u", (unsigned)dctx->decodedSize); + RETURN_ERROR_IF( + dctx->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN + && dctx->decodedSize != dctx->fParams.frameContentSize, + corruption_detected, ""); + if (dctx->fParams.checksumFlag) { /* another round for frame checksum */ + dctx->expected = 4; + dctx->stage = ZSTDds_checkChecksum; + } else { + ZSTD_DCtx_trace_end(dctx, dctx->decodedSize, dctx->processedCSize, /* streaming */ 1); + dctx->expected = 0; /* ends here */ + dctx->stage = ZSTDds_getFrameHeaderSize; + } + } else { + dctx->stage = ZSTDds_decodeBlockHeader; + dctx->expected = ZSTD_blockHeaderSize; + } + return rSize; + } + + case ZSTDds_checkChecksum: + assert(srcSize == 4); /* guaranteed by dctx->expected */ + { + if (dctx->validateChecksum) { + U32 const h32 = (U32)XXH64_digest(&dctx->xxhState); + U32 const check32 = MEM_readLE32(src); + DEBUGLOG(4, "ZSTD_decompressContinue: checksum : calculated %08X :: %08X read", (unsigned)h32, (unsigned)check32); + RETURN_ERROR_IF(check32 != h32, checksum_wrong, ""); + } + ZSTD_DCtx_trace_end(dctx, dctx->decodedSize, dctx->processedCSize, /* streaming */ 1); + dctx->expected = 0; + dctx->stage = ZSTDds_getFrameHeaderSize; + return 0; + } + + case ZSTDds_decodeSkippableHeader: + assert(src != NULL); + assert(srcSize <= ZSTD_SKIPPABLEHEADERSIZE); + ZSTD_memcpy(dctx->headerBuffer + (ZSTD_SKIPPABLEHEADERSIZE - srcSize), src, srcSize); /* complete skippable header */ + dctx->expected = MEM_readLE32(dctx->headerBuffer + ZSTD_FRAMEIDSIZE); /* note : dctx->expected can grow seriously large, beyond local buffer size */ + dctx->stage = ZSTDds_skipFrame; + return 0; + + case ZSTDds_skipFrame: + dctx->expected = 0; + dctx->stage = ZSTDds_getFrameHeaderSize; + return 0; + + default: + assert(0); /* impossible */ + RETURN_ERROR(GENERIC, "impossible to reach"); /* some compilers require default to do something */ + } +} + + +static size_t ZSTD_refDictContent(ZSTD_DCtx* dctx, const void* dict, size_t dictSize) +{ + dctx->dictEnd = dctx->previousDstEnd; + dctx->virtualStart = (const char*)dict - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->prefixStart)); + dctx->prefixStart = dict; + dctx->previousDstEnd = (const char*)dict + dictSize; +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + dctx->dictContentBeginForFuzzing = dctx->prefixStart; + dctx->dictContentEndForFuzzing = dctx->previousDstEnd; +#endif + return 0; +} + +/*! ZSTD_loadDEntropy() : + * dict : must point at beginning of a valid zstd dictionary. + * @return : size of entropy tables read */ +size_t +ZSTD_loadDEntropy(ZSTD_entropyDTables_t* entropy, + const void* const dict, size_t const dictSize) +{ + const BYTE* dictPtr = (const BYTE*)dict; + const BYTE* const dictEnd = dictPtr + dictSize; + + RETURN_ERROR_IF(dictSize <= 8, dictionary_corrupted, "dict is too small"); + assert(MEM_readLE32(dict) == ZSTD_MAGIC_DICTIONARY); /* dict must be valid */ + dictPtr += 8; /* skip header = magic + dictID */ + + ZSTD_STATIC_ASSERT(offsetof(ZSTD_entropyDTables_t, OFTable) == offsetof(ZSTD_entropyDTables_t, LLTable) + sizeof(entropy->LLTable)); + ZSTD_STATIC_ASSERT(offsetof(ZSTD_entropyDTables_t, MLTable) == offsetof(ZSTD_entropyDTables_t, OFTable) + sizeof(entropy->OFTable)); + ZSTD_STATIC_ASSERT(sizeof(entropy->LLTable) + sizeof(entropy->OFTable) + sizeof(entropy->MLTable) >= HUF_DECOMPRESS_WORKSPACE_SIZE); + { void* const workspace = &entropy->LLTable; /* use fse tables as temporary workspace; implies fse tables are grouped together */ + size_t const workspaceSize = sizeof(entropy->LLTable) + sizeof(entropy->OFTable) + sizeof(entropy->MLTable); +#ifdef HUF_FORCE_DECOMPRESS_X1 + /* in minimal huffman, we always use X1 variants */ + size_t const hSize = HUF_readDTableX1_wksp(entropy->hufTable, + dictPtr, dictEnd - dictPtr, + workspace, workspaceSize, /* flags */ 0); +#else + size_t const hSize = HUF_readDTableX2_wksp(entropy->hufTable, + dictPtr, (size_t)(dictEnd - dictPtr), + workspace, workspaceSize, /* flags */ 0); +#endif + RETURN_ERROR_IF(HUF_isError(hSize), dictionary_corrupted, ""); + dictPtr += hSize; + } + + { short offcodeNCount[MaxOff+1]; + unsigned offcodeMaxValue = MaxOff, offcodeLog; + size_t const offcodeHeaderSize = FSE_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dictPtr, (size_t)(dictEnd-dictPtr)); + RETURN_ERROR_IF(FSE_isError(offcodeHeaderSize), dictionary_corrupted, ""); + RETURN_ERROR_IF(offcodeMaxValue > MaxOff, dictionary_corrupted, ""); + RETURN_ERROR_IF(offcodeLog > OffFSELog, dictionary_corrupted, ""); + ZSTD_buildFSETable( entropy->OFTable, + offcodeNCount, offcodeMaxValue, + OF_base, OF_bits, + offcodeLog, + entropy->workspace, sizeof(entropy->workspace), + /* bmi2 */0); + dictPtr += offcodeHeaderSize; + } + + { short matchlengthNCount[MaxML+1]; + unsigned matchlengthMaxValue = MaxML, matchlengthLog; + size_t const matchlengthHeaderSize = FSE_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dictPtr, (size_t)(dictEnd-dictPtr)); + RETURN_ERROR_IF(FSE_isError(matchlengthHeaderSize), dictionary_corrupted, ""); + RETURN_ERROR_IF(matchlengthMaxValue > MaxML, dictionary_corrupted, ""); + RETURN_ERROR_IF(matchlengthLog > MLFSELog, dictionary_corrupted, ""); + ZSTD_buildFSETable( entropy->MLTable, + matchlengthNCount, matchlengthMaxValue, + ML_base, ML_bits, + matchlengthLog, + entropy->workspace, sizeof(entropy->workspace), + /* bmi2 */ 0); + dictPtr += matchlengthHeaderSize; + } + + { short litlengthNCount[MaxLL+1]; + unsigned litlengthMaxValue = MaxLL, litlengthLog; + size_t const litlengthHeaderSize = FSE_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dictPtr, (size_t)(dictEnd-dictPtr)); + RETURN_ERROR_IF(FSE_isError(litlengthHeaderSize), dictionary_corrupted, ""); + RETURN_ERROR_IF(litlengthMaxValue > MaxLL, dictionary_corrupted, ""); + RETURN_ERROR_IF(litlengthLog > LLFSELog, dictionary_corrupted, ""); + ZSTD_buildFSETable( entropy->LLTable, + litlengthNCount, litlengthMaxValue, + LL_base, LL_bits, + litlengthLog, + entropy->workspace, sizeof(entropy->workspace), + /* bmi2 */ 0); + dictPtr += litlengthHeaderSize; + } + + RETURN_ERROR_IF(dictPtr+12 > dictEnd, dictionary_corrupted, ""); + { int i; + size_t const dictContentSize = (size_t)(dictEnd - (dictPtr+12)); + for (i=0; i<3; i++) { + U32 const rep = MEM_readLE32(dictPtr); dictPtr += 4; + RETURN_ERROR_IF(rep==0 || rep > dictContentSize, + dictionary_corrupted, ""); + entropy->rep[i] = rep; + } } + + return (size_t)(dictPtr - (const BYTE*)dict); +} + +static size_t ZSTD_decompress_insertDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize) +{ + if (dictSize < 8) return ZSTD_refDictContent(dctx, dict, dictSize); + { U32 const magic = MEM_readLE32(dict); + if (magic != ZSTD_MAGIC_DICTIONARY) { + return ZSTD_refDictContent(dctx, dict, dictSize); /* pure content mode */ + } } + dctx->dictID = MEM_readLE32((const char*)dict + ZSTD_FRAMEIDSIZE); + + /* load entropy tables */ + { size_t const eSize = ZSTD_loadDEntropy(&dctx->entropy, dict, dictSize); + RETURN_ERROR_IF(ZSTD_isError(eSize), dictionary_corrupted, ""); + dict = (const char*)dict + eSize; + dictSize -= eSize; + } + dctx->litEntropy = dctx->fseEntropy = 1; + + /* reference dictionary content */ + return ZSTD_refDictContent(dctx, dict, dictSize); +} + +size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx) +{ + assert(dctx != NULL); +#if ZSTD_TRACE + dctx->traceCtx = (ZSTD_trace_decompress_begin != NULL) ? ZSTD_trace_decompress_begin(dctx) : 0; +#endif + dctx->expected = ZSTD_startingInputLength(dctx->format); /* dctx->format must be properly set */ + dctx->stage = ZSTDds_getFrameHeaderSize; + dctx->processedCSize = 0; + dctx->decodedSize = 0; + dctx->previousDstEnd = NULL; + dctx->prefixStart = NULL; + dctx->virtualStart = NULL; + dctx->dictEnd = NULL; + dctx->entropy.hufTable[0] = (HUF_DTable)((ZSTD_HUFFDTABLE_CAPACITY_LOG)*0x1000001); /* cover both little and big endian */ + dctx->litEntropy = dctx->fseEntropy = 0; + dctx->dictID = 0; + dctx->bType = bt_reserved; + ZSTD_STATIC_ASSERT(sizeof(dctx->entropy.rep) == sizeof(repStartValue)); + ZSTD_memcpy(dctx->entropy.rep, repStartValue, sizeof(repStartValue)); /* initial repcodes */ + dctx->LLTptr = dctx->entropy.LLTable; + dctx->MLTptr = dctx->entropy.MLTable; + dctx->OFTptr = dctx->entropy.OFTable; + dctx->HUFptr = dctx->entropy.hufTable; + return 0; +} + +size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize) +{ + FORWARD_IF_ERROR( ZSTD_decompressBegin(dctx) , ""); + if (dict && dictSize) + RETURN_ERROR_IF( + ZSTD_isError(ZSTD_decompress_insertDictionary(dctx, dict, dictSize)), + dictionary_corrupted, ""); + return 0; +} + + +/* ====== ZSTD_DDict ====== */ + +size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict) +{ + DEBUGLOG(4, "ZSTD_decompressBegin_usingDDict"); + assert(dctx != NULL); + if (ddict) { + const char* const dictStart = (const char*)ZSTD_DDict_dictContent(ddict); + size_t const dictSize = ZSTD_DDict_dictSize(ddict); + const void* const dictEnd = dictStart + dictSize; + dctx->ddictIsCold = (dctx->dictEnd != dictEnd); + DEBUGLOG(4, "DDict is %s", + dctx->ddictIsCold ? "~cold~" : "hot!"); + } + FORWARD_IF_ERROR( ZSTD_decompressBegin(dctx) , ""); + if (ddict) { /* NULL ddict is equivalent to no dictionary */ + ZSTD_copyDDictParameters(dctx, ddict); + } + return 0; +} + +/*! ZSTD_getDictID_fromDict() : + * Provides the dictID stored within dictionary. + * if @return == 0, the dictionary is not conformant with Zstandard specification. + * It can still be loaded, but as a content-only dictionary. */ +unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize) +{ + if (dictSize < 8) return 0; + if (MEM_readLE32(dict) != ZSTD_MAGIC_DICTIONARY) return 0; + return MEM_readLE32((const char*)dict + ZSTD_FRAMEIDSIZE); +} + +/*! ZSTD_getDictID_fromFrame() : + * Provides the dictID required to decompress frame stored within `src`. + * If @return == 0, the dictID could not be decoded. + * This could for one of the following reasons : + * - The frame does not require a dictionary (most common case). + * - The frame was built with dictID intentionally removed. + * Needed dictionary is a hidden piece of information. + * Note : this use case also happens when using a non-conformant dictionary. + * - `srcSize` is too small, and as a result, frame header could not be decoded. + * Note : possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`. + * - This is not a Zstandard frame. + * When identifying the exact failure cause, it's possible to use + * ZSTD_getFrameHeader(), which will provide a more precise error code. */ +unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize) +{ + ZSTD_frameHeader zfp = { 0, 0, 0, ZSTD_frame, 0, 0, 0, 0, 0 }; + size_t const hError = ZSTD_getFrameHeader(&zfp, src, srcSize); + if (ZSTD_isError(hError)) return 0; + return zfp.dictID; +} + + +/*! ZSTD_decompress_usingDDict() : +* Decompression using a pre-digested Dictionary +* Use dictionary without significant overhead. */ +size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const ZSTD_DDict* ddict) +{ + /* pass content and size in case legacy frames are encountered */ + return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize, + NULL, 0, + ddict); +} + + +/*===================================== +* Streaming decompression +*====================================*/ + +ZSTD_DStream* ZSTD_createDStream(void) +{ + DEBUGLOG(3, "ZSTD_createDStream"); + return ZSTD_createDCtx_internal(ZSTD_defaultCMem); +} + +ZSTD_DStream* ZSTD_initStaticDStream(void *workspace, size_t workspaceSize) +{ + return ZSTD_initStaticDCtx(workspace, workspaceSize); +} + +ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem) +{ + return ZSTD_createDCtx_internal(customMem); +} + +size_t ZSTD_freeDStream(ZSTD_DStream* zds) +{ + return ZSTD_freeDCtx(zds); +} + + +/* *** Initialization *** */ + +size_t ZSTD_DStreamInSize(void) { return ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize; } +size_t ZSTD_DStreamOutSize(void) { return ZSTD_BLOCKSIZE_MAX; } + +size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, + const void* dict, size_t dictSize, + ZSTD_dictLoadMethod_e dictLoadMethod, + ZSTD_dictContentType_e dictContentType) +{ + RETURN_ERROR_IF(dctx->streamStage != zdss_init, stage_wrong, ""); + ZSTD_clearDict(dctx); + if (dict && dictSize != 0) { + dctx->ddictLocal = ZSTD_createDDict_advanced(dict, dictSize, dictLoadMethod, dictContentType, dctx->customMem); + RETURN_ERROR_IF(dctx->ddictLocal == NULL, memory_allocation, "NULL pointer!"); + dctx->ddict = dctx->ddictLocal; + dctx->dictUses = ZSTD_use_indefinitely; + } + return 0; +} + +size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize) +{ + return ZSTD_DCtx_loadDictionary_advanced(dctx, dict, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto); +} + +size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize) +{ + return ZSTD_DCtx_loadDictionary_advanced(dctx, dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto); +} + +size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType) +{ + FORWARD_IF_ERROR(ZSTD_DCtx_loadDictionary_advanced(dctx, prefix, prefixSize, ZSTD_dlm_byRef, dictContentType), ""); + dctx->dictUses = ZSTD_use_once; + return 0; +} + +size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize) +{ + return ZSTD_DCtx_refPrefix_advanced(dctx, prefix, prefixSize, ZSTD_dct_rawContent); +} + + +/* ZSTD_initDStream_usingDict() : + * return : expected size, aka ZSTD_startingInputLength(). + * this function cannot fail */ +size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize) +{ + DEBUGLOG(4, "ZSTD_initDStream_usingDict"); + FORWARD_IF_ERROR( ZSTD_DCtx_reset(zds, ZSTD_reset_session_only) , ""); + FORWARD_IF_ERROR( ZSTD_DCtx_loadDictionary(zds, dict, dictSize) , ""); + return ZSTD_startingInputLength(zds->format); +} + +/* note : this variant can't fail */ +size_t ZSTD_initDStream(ZSTD_DStream* zds) +{ + DEBUGLOG(4, "ZSTD_initDStream"); + FORWARD_IF_ERROR(ZSTD_DCtx_reset(zds, ZSTD_reset_session_only), ""); + FORWARD_IF_ERROR(ZSTD_DCtx_refDDict(zds, NULL), ""); + return ZSTD_startingInputLength(zds->format); +} + +/* ZSTD_initDStream_usingDDict() : + * ddict will just be referenced, and must outlive decompression session + * this function cannot fail */ +size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* dctx, const ZSTD_DDict* ddict) +{ + DEBUGLOG(4, "ZSTD_initDStream_usingDDict"); + FORWARD_IF_ERROR( ZSTD_DCtx_reset(dctx, ZSTD_reset_session_only) , ""); + FORWARD_IF_ERROR( ZSTD_DCtx_refDDict(dctx, ddict) , ""); + return ZSTD_startingInputLength(dctx->format); +} + +/* ZSTD_resetDStream() : + * return : expected size, aka ZSTD_startingInputLength(). + * this function cannot fail */ +size_t ZSTD_resetDStream(ZSTD_DStream* dctx) +{ + DEBUGLOG(4, "ZSTD_resetDStream"); + FORWARD_IF_ERROR(ZSTD_DCtx_reset(dctx, ZSTD_reset_session_only), ""); + return ZSTD_startingInputLength(dctx->format); +} + + +size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict) +{ + RETURN_ERROR_IF(dctx->streamStage != zdss_init, stage_wrong, ""); + ZSTD_clearDict(dctx); + if (ddict) { + dctx->ddict = ddict; + dctx->dictUses = ZSTD_use_indefinitely; + if (dctx->refMultipleDDicts == ZSTD_rmd_refMultipleDDicts) { + if (dctx->ddictSet == NULL) { + dctx->ddictSet = ZSTD_createDDictHashSet(dctx->customMem); + if (!dctx->ddictSet) { + RETURN_ERROR(memory_allocation, "Failed to allocate memory for hash set!"); + } + } + assert(!dctx->staticSize); /* Impossible: ddictSet cannot have been allocated if static dctx */ + FORWARD_IF_ERROR(ZSTD_DDictHashSet_addDDict(dctx->ddictSet, ddict, dctx->customMem), ""); + } + } + return 0; +} + +/* ZSTD_DCtx_setMaxWindowSize() : + * note : no direct equivalence in ZSTD_DCtx_setParameter, + * since this version sets windowSize, and the other sets windowLog */ +size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize) +{ + ZSTD_bounds const bounds = ZSTD_dParam_getBounds(ZSTD_d_windowLogMax); + size_t const min = (size_t)1 << bounds.lowerBound; + size_t const max = (size_t)1 << bounds.upperBound; + RETURN_ERROR_IF(dctx->streamStage != zdss_init, stage_wrong, ""); + RETURN_ERROR_IF(maxWindowSize < min, parameter_outOfBound, ""); + RETURN_ERROR_IF(maxWindowSize > max, parameter_outOfBound, ""); + dctx->maxWindowSize = maxWindowSize; + return 0; +} + +size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format) +{ + return ZSTD_DCtx_setParameter(dctx, ZSTD_d_format, (int)format); +} + +ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam) +{ + ZSTD_bounds bounds = { 0, 0, 0 }; + switch(dParam) { + case ZSTD_d_windowLogMax: + bounds.lowerBound = ZSTD_WINDOWLOG_ABSOLUTEMIN; + bounds.upperBound = ZSTD_WINDOWLOG_MAX; + return bounds; + case ZSTD_d_format: + bounds.lowerBound = (int)ZSTD_f_zstd1; + bounds.upperBound = (int)ZSTD_f_zstd1_magicless; + ZSTD_STATIC_ASSERT(ZSTD_f_zstd1 < ZSTD_f_zstd1_magicless); + return bounds; + case ZSTD_d_stableOutBuffer: + bounds.lowerBound = (int)ZSTD_bm_buffered; + bounds.upperBound = (int)ZSTD_bm_stable; + return bounds; + case ZSTD_d_forceIgnoreChecksum: + bounds.lowerBound = (int)ZSTD_d_validateChecksum; + bounds.upperBound = (int)ZSTD_d_ignoreChecksum; + return bounds; + case ZSTD_d_refMultipleDDicts: + bounds.lowerBound = (int)ZSTD_rmd_refSingleDDict; + bounds.upperBound = (int)ZSTD_rmd_refMultipleDDicts; + return bounds; + case ZSTD_d_disableHuffmanAssembly: + bounds.lowerBound = 0; + bounds.upperBound = 1; + return bounds; + + default:; + } + bounds.error = ERROR(parameter_unsupported); + return bounds; +} + +/* ZSTD_dParam_withinBounds: + * @return 1 if value is within dParam bounds, + * 0 otherwise */ +static int ZSTD_dParam_withinBounds(ZSTD_dParameter dParam, int value) +{ + ZSTD_bounds const bounds = ZSTD_dParam_getBounds(dParam); + if (ZSTD_isError(bounds.error)) return 0; + if (value < bounds.lowerBound) return 0; + if (value > bounds.upperBound) return 0; + return 1; +} + +#define CHECK_DBOUNDS(p,v) { \ + RETURN_ERROR_IF(!ZSTD_dParam_withinBounds(p, v), parameter_outOfBound, ""); \ +} + +size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value) +{ + switch (param) { + case ZSTD_d_windowLogMax: + *value = (int)ZSTD_highbit32((U32)dctx->maxWindowSize); + return 0; + case ZSTD_d_format: + *value = (int)dctx->format; + return 0; + case ZSTD_d_stableOutBuffer: + *value = (int)dctx->outBufferMode; + return 0; + case ZSTD_d_forceIgnoreChecksum: + *value = (int)dctx->forceIgnoreChecksum; + return 0; + case ZSTD_d_refMultipleDDicts: + *value = (int)dctx->refMultipleDDicts; + return 0; + case ZSTD_d_disableHuffmanAssembly: + *value = (int)dctx->disableHufAsm; + return 0; + default:; + } + RETURN_ERROR(parameter_unsupported, ""); +} + +size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter dParam, int value) +{ + RETURN_ERROR_IF(dctx->streamStage != zdss_init, stage_wrong, ""); + switch(dParam) { + case ZSTD_d_windowLogMax: + if (value == 0) value = ZSTD_WINDOWLOG_LIMIT_DEFAULT; + CHECK_DBOUNDS(ZSTD_d_windowLogMax, value); + dctx->maxWindowSize = ((size_t)1) << value; + return 0; + case ZSTD_d_format: + CHECK_DBOUNDS(ZSTD_d_format, value); + dctx->format = (ZSTD_format_e)value; + return 0; + case ZSTD_d_stableOutBuffer: + CHECK_DBOUNDS(ZSTD_d_stableOutBuffer, value); + dctx->outBufferMode = (ZSTD_bufferMode_e)value; + return 0; + case ZSTD_d_forceIgnoreChecksum: + CHECK_DBOUNDS(ZSTD_d_forceIgnoreChecksum, value); + dctx->forceIgnoreChecksum = (ZSTD_forceIgnoreChecksum_e)value; + return 0; + case ZSTD_d_refMultipleDDicts: + CHECK_DBOUNDS(ZSTD_d_refMultipleDDicts, value); + if (dctx->staticSize != 0) { + RETURN_ERROR(parameter_unsupported, "Static dctx does not support multiple DDicts!"); + } + dctx->refMultipleDDicts = (ZSTD_refMultipleDDicts_e)value; + return 0; + case ZSTD_d_disableHuffmanAssembly: + CHECK_DBOUNDS(ZSTD_d_disableHuffmanAssembly, value); + dctx->disableHufAsm = value != 0; + return 0; + default:; + } + RETURN_ERROR(parameter_unsupported, ""); +} + +size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset) +{ + if ( (reset == ZSTD_reset_session_only) + || (reset == ZSTD_reset_session_and_parameters) ) { + dctx->streamStage = zdss_init; + dctx->noForwardProgress = 0; + } + if ( (reset == ZSTD_reset_parameters) + || (reset == ZSTD_reset_session_and_parameters) ) { + RETURN_ERROR_IF(dctx->streamStage != zdss_init, stage_wrong, ""); + ZSTD_clearDict(dctx); + ZSTD_DCtx_resetParameters(dctx); + } + return 0; +} + + +size_t ZSTD_sizeof_DStream(const ZSTD_DStream* dctx) +{ + return ZSTD_sizeof_DCtx(dctx); +} + +size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize) +{ + size_t const blockSize = (size_t) MIN(windowSize, ZSTD_BLOCKSIZE_MAX); + /* space is needed to store the litbuffer after the output of a given block without stomping the extDict of a previous run, as well as to cover both windows against wildcopy*/ + unsigned long long const neededRBSize = windowSize + blockSize + ZSTD_BLOCKSIZE_MAX + (WILDCOPY_OVERLENGTH * 2); + unsigned long long const neededSize = MIN(frameContentSize, neededRBSize); + size_t const minRBSize = (size_t) neededSize; + RETURN_ERROR_IF((unsigned long long)minRBSize != neededSize, + frameParameter_windowTooLarge, ""); + return minRBSize; +} + +size_t ZSTD_estimateDStreamSize(size_t windowSize) +{ + size_t const blockSize = MIN(windowSize, ZSTD_BLOCKSIZE_MAX); + size_t const inBuffSize = blockSize; /* no block can be larger */ + size_t const outBuffSize = ZSTD_decodingBufferSize_min(windowSize, ZSTD_CONTENTSIZE_UNKNOWN); + return ZSTD_estimateDCtxSize() + inBuffSize + outBuffSize; +} + +size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize) +{ + U32 const windowSizeMax = 1U << ZSTD_WINDOWLOG_MAX; /* note : should be user-selectable, but requires an additional parameter (or a dctx) */ + ZSTD_frameHeader zfh; + size_t const err = ZSTD_getFrameHeader(&zfh, src, srcSize); + if (ZSTD_isError(err)) return err; + RETURN_ERROR_IF(err>0, srcSize_wrong, ""); + RETURN_ERROR_IF(zfh.windowSize > windowSizeMax, + frameParameter_windowTooLarge, ""); + return ZSTD_estimateDStreamSize((size_t)zfh.windowSize); +} + + +/* ***** Decompression ***** */ + +static int ZSTD_DCtx_isOverflow(ZSTD_DStream* zds, size_t const neededInBuffSize, size_t const neededOutBuffSize) +{ + return (zds->inBuffSize + zds->outBuffSize) >= (neededInBuffSize + neededOutBuffSize) * ZSTD_WORKSPACETOOLARGE_FACTOR; +} + +static void ZSTD_DCtx_updateOversizedDuration(ZSTD_DStream* zds, size_t const neededInBuffSize, size_t const neededOutBuffSize) +{ + if (ZSTD_DCtx_isOverflow(zds, neededInBuffSize, neededOutBuffSize)) + zds->oversizedDuration++; + else + zds->oversizedDuration = 0; +} + +static int ZSTD_DCtx_isOversizedTooLong(ZSTD_DStream* zds) +{ + return zds->oversizedDuration >= ZSTD_WORKSPACETOOLARGE_MAXDURATION; +} + +/* Checks that the output buffer hasn't changed if ZSTD_obm_stable is used. */ +static size_t ZSTD_checkOutBuffer(ZSTD_DStream const* zds, ZSTD_outBuffer const* output) +{ + ZSTD_outBuffer const expect = zds->expectedOutBuffer; + /* No requirement when ZSTD_obm_stable is not enabled. */ + if (zds->outBufferMode != ZSTD_bm_stable) + return 0; + /* Any buffer is allowed in zdss_init, this must be the same for every other call until + * the context is reset. + */ + if (zds->streamStage == zdss_init) + return 0; + /* The buffer must match our expectation exactly. */ + if (expect.dst == output->dst && expect.pos == output->pos && expect.size == output->size) + return 0; + RETURN_ERROR(dstBuffer_wrong, "ZSTD_d_stableOutBuffer enabled but output differs!"); +} + +/* Calls ZSTD_decompressContinue() with the right parameters for ZSTD_decompressStream() + * and updates the stage and the output buffer state. This call is extracted so it can be + * used both when reading directly from the ZSTD_inBuffer, and in buffered input mode. + * NOTE: You must break after calling this function since the streamStage is modified. + */ +static size_t ZSTD_decompressContinueStream( + ZSTD_DStream* zds, char** op, char* oend, + void const* src, size_t srcSize) { + int const isSkipFrame = ZSTD_isSkipFrame(zds); + if (zds->outBufferMode == ZSTD_bm_buffered) { + size_t const dstSize = isSkipFrame ? 0 : zds->outBuffSize - zds->outStart; + size_t const decodedSize = ZSTD_decompressContinue(zds, + zds->outBuff + zds->outStart, dstSize, src, srcSize); + FORWARD_IF_ERROR(decodedSize, ""); + if (!decodedSize && !isSkipFrame) { + zds->streamStage = zdss_read; + } else { + zds->outEnd = zds->outStart + decodedSize; + zds->streamStage = zdss_flush; + } + } else { + /* Write directly into the output buffer */ + size_t const dstSize = isSkipFrame ? 0 : (size_t)(oend - *op); + size_t const decodedSize = ZSTD_decompressContinue(zds, *op, dstSize, src, srcSize); + FORWARD_IF_ERROR(decodedSize, ""); + *op += decodedSize; + /* Flushing is not needed. */ + zds->streamStage = zdss_read; + assert(*op <= oend); + assert(zds->outBufferMode == ZSTD_bm_stable); + } + return 0; +} + +size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input) +{ + const char* const src = (const char*)input->src; + const char* const istart = input->pos != 0 ? src + input->pos : src; + const char* const iend = input->size != 0 ? src + input->size : src; + const char* ip = istart; + char* const dst = (char*)output->dst; + char* const ostart = output->pos != 0 ? dst + output->pos : dst; + char* const oend = output->size != 0 ? dst + output->size : dst; + char* op = ostart; + U32 someMoreWork = 1; + + DEBUGLOG(5, "ZSTD_decompressStream"); + RETURN_ERROR_IF( + input->pos > input->size, + srcSize_wrong, + "forbidden. in: pos: %u vs size: %u", + (U32)input->pos, (U32)input->size); + RETURN_ERROR_IF( + output->pos > output->size, + dstSize_tooSmall, + "forbidden. out: pos: %u vs size: %u", + (U32)output->pos, (U32)output->size); + DEBUGLOG(5, "input size : %u", (U32)(input->size - input->pos)); + FORWARD_IF_ERROR(ZSTD_checkOutBuffer(zds, output), ""); + + while (someMoreWork) { + switch(zds->streamStage) + { + case zdss_init : + DEBUGLOG(5, "stage zdss_init => transparent reset "); + zds->streamStage = zdss_loadHeader; + zds->lhSize = zds->inPos = zds->outStart = zds->outEnd = 0; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) + zds->legacyVersion = 0; +#endif + zds->hostageByte = 0; + zds->expectedOutBuffer = *output; + ZSTD_FALLTHROUGH; + + case zdss_loadHeader : + DEBUGLOG(5, "stage zdss_loadHeader (srcSize : %u)", (U32)(iend - ip)); +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) + if (zds->legacyVersion) { + RETURN_ERROR_IF(zds->staticSize, memory_allocation, + "legacy support is incompatible with static dctx"); + { size_t const hint = ZSTD_decompressLegacyStream(zds->legacyContext, zds->legacyVersion, output, input); + if (hint==0) zds->streamStage = zdss_init; + return hint; + } } +#endif + { size_t const hSize = ZSTD_getFrameHeader_advanced(&zds->fParams, zds->headerBuffer, zds->lhSize, zds->format); + if (zds->refMultipleDDicts && zds->ddictSet) { + ZSTD_DCtx_selectFrameDDict(zds); + } + if (ZSTD_isError(hSize)) { +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) + U32 const legacyVersion = ZSTD_isLegacy(istart, iend-istart); + if (legacyVersion) { + ZSTD_DDict const* const ddict = ZSTD_getDDict(zds); + const void* const dict = ddict ? ZSTD_DDict_dictContent(ddict) : NULL; + size_t const dictSize = ddict ? ZSTD_DDict_dictSize(ddict) : 0; + DEBUGLOG(5, "ZSTD_decompressStream: detected legacy version v0.%u", legacyVersion); + RETURN_ERROR_IF(zds->staticSize, memory_allocation, + "legacy support is incompatible with static dctx"); + FORWARD_IF_ERROR(ZSTD_initLegacyStream(&zds->legacyContext, + zds->previousLegacyVersion, legacyVersion, + dict, dictSize), ""); + zds->legacyVersion = zds->previousLegacyVersion = legacyVersion; + { size_t const hint = ZSTD_decompressLegacyStream(zds->legacyContext, legacyVersion, output, input); + if (hint==0) zds->streamStage = zdss_init; /* or stay in stage zdss_loadHeader */ + return hint; + } } +#endif + return hSize; /* error */ + } + if (hSize != 0) { /* need more input */ + size_t const toLoad = hSize - zds->lhSize; /* if hSize!=0, hSize > zds->lhSize */ + size_t const remainingInput = (size_t)(iend-ip); + assert(iend >= ip); + if (toLoad > remainingInput) { /* not enough input to load full header */ + if (remainingInput > 0) { + ZSTD_memcpy(zds->headerBuffer + zds->lhSize, ip, remainingInput); + zds->lhSize += remainingInput; + } + input->pos = input->size; + /* check first few bytes */ + FORWARD_IF_ERROR( + ZSTD_getFrameHeader_advanced(&zds->fParams, zds->headerBuffer, zds->lhSize, zds->format), + "First few bytes detected incorrect" ); + /* return hint input size */ + return (MAX((size_t)ZSTD_FRAMEHEADERSIZE_MIN(zds->format), hSize) - zds->lhSize) + ZSTD_blockHeaderSize; /* remaining header bytes + next block header */ + } + assert(ip != NULL); + ZSTD_memcpy(zds->headerBuffer + zds->lhSize, ip, toLoad); zds->lhSize = hSize; ip += toLoad; + break; + } } + + /* check for single-pass mode opportunity */ + if (zds->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN + && zds->fParams.frameType != ZSTD_skippableFrame + && (U64)(size_t)(oend-op) >= zds->fParams.frameContentSize) { + size_t const cSize = ZSTD_findFrameCompressedSize(istart, (size_t)(iend-istart)); + if (cSize <= (size_t)(iend-istart)) { + /* shortcut : using single-pass mode */ + size_t const decompressedSize = ZSTD_decompress_usingDDict(zds, op, (size_t)(oend-op), istart, cSize, ZSTD_getDDict(zds)); + if (ZSTD_isError(decompressedSize)) return decompressedSize; + DEBUGLOG(4, "shortcut to single-pass ZSTD_decompress_usingDDict()") + assert(istart != NULL); + ip = istart + cSize; + op = op ? op + decompressedSize : op; /* can occur if frameContentSize = 0 (empty frame) */ + zds->expected = 0; + zds->streamStage = zdss_init; + someMoreWork = 0; + break; + } } + + /* Check output buffer is large enough for ZSTD_odm_stable. */ + if (zds->outBufferMode == ZSTD_bm_stable + && zds->fParams.frameType != ZSTD_skippableFrame + && zds->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN + && (U64)(size_t)(oend-op) < zds->fParams.frameContentSize) { + RETURN_ERROR(dstSize_tooSmall, "ZSTD_obm_stable passed but ZSTD_outBuffer is too small"); + } + + /* Consume header (see ZSTDds_decodeFrameHeader) */ + DEBUGLOG(4, "Consume header"); + FORWARD_IF_ERROR(ZSTD_decompressBegin_usingDDict(zds, ZSTD_getDDict(zds)), ""); + + if ((MEM_readLE32(zds->headerBuffer) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */ + zds->expected = MEM_readLE32(zds->headerBuffer + ZSTD_FRAMEIDSIZE); + zds->stage = ZSTDds_skipFrame; + } else { + FORWARD_IF_ERROR(ZSTD_decodeFrameHeader(zds, zds->headerBuffer, zds->lhSize), ""); + zds->expected = ZSTD_blockHeaderSize; + zds->stage = ZSTDds_decodeBlockHeader; + } + + /* control buffer memory usage */ + DEBUGLOG(4, "Control max memory usage (%u KB <= max %u KB)", + (U32)(zds->fParams.windowSize >>10), + (U32)(zds->maxWindowSize >> 10) ); + zds->fParams.windowSize = MAX(zds->fParams.windowSize, 1U << ZSTD_WINDOWLOG_ABSOLUTEMIN); + RETURN_ERROR_IF(zds->fParams.windowSize > zds->maxWindowSize, + frameParameter_windowTooLarge, ""); + + /* Adapt buffer sizes to frame header instructions */ + { size_t const neededInBuffSize = MAX(zds->fParams.blockSizeMax, 4 /* frame checksum */); + size_t const neededOutBuffSize = zds->outBufferMode == ZSTD_bm_buffered + ? ZSTD_decodingBufferSize_min(zds->fParams.windowSize, zds->fParams.frameContentSize) + : 0; + + ZSTD_DCtx_updateOversizedDuration(zds, neededInBuffSize, neededOutBuffSize); + + { int const tooSmall = (zds->inBuffSize < neededInBuffSize) || (zds->outBuffSize < neededOutBuffSize); + int const tooLarge = ZSTD_DCtx_isOversizedTooLong(zds); + + if (tooSmall || tooLarge) { + size_t const bufferSize = neededInBuffSize + neededOutBuffSize; + DEBUGLOG(4, "inBuff : from %u to %u", + (U32)zds->inBuffSize, (U32)neededInBuffSize); + DEBUGLOG(4, "outBuff : from %u to %u", + (U32)zds->outBuffSize, (U32)neededOutBuffSize); + if (zds->staticSize) { /* static DCtx */ + DEBUGLOG(4, "staticSize : %u", (U32)zds->staticSize); + assert(zds->staticSize >= sizeof(ZSTD_DCtx)); /* controlled at init */ + RETURN_ERROR_IF( + bufferSize > zds->staticSize - sizeof(ZSTD_DCtx), + memory_allocation, ""); + } else { + ZSTD_customFree(zds->inBuff, zds->customMem); + zds->inBuffSize = 0; + zds->outBuffSize = 0; + zds->inBuff = (char*)ZSTD_customMalloc(bufferSize, zds->customMem); + RETURN_ERROR_IF(zds->inBuff == NULL, memory_allocation, ""); + } + zds->inBuffSize = neededInBuffSize; + zds->outBuff = zds->inBuff + zds->inBuffSize; + zds->outBuffSize = neededOutBuffSize; + } } } + zds->streamStage = zdss_read; + ZSTD_FALLTHROUGH; + + case zdss_read: + DEBUGLOG(5, "stage zdss_read"); + { size_t const neededInSize = ZSTD_nextSrcSizeToDecompressWithInputSize(zds, (size_t)(iend - ip)); + DEBUGLOG(5, "neededInSize = %u", (U32)neededInSize); + if (neededInSize==0) { /* end of frame */ + zds->streamStage = zdss_init; + someMoreWork = 0; + break; + } + if ((size_t)(iend-ip) >= neededInSize) { /* decode directly from src */ + FORWARD_IF_ERROR(ZSTD_decompressContinueStream(zds, &op, oend, ip, neededInSize), ""); + assert(ip != NULL); + ip += neededInSize; + /* Function modifies the stage so we must break */ + break; + } } + if (ip==iend) { someMoreWork = 0; break; } /* no more input */ + zds->streamStage = zdss_load; + ZSTD_FALLTHROUGH; + + case zdss_load: + { size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds); + size_t const toLoad = neededInSize - zds->inPos; + int const isSkipFrame = ZSTD_isSkipFrame(zds); + size_t loadedSize; + /* At this point we shouldn't be decompressing a block that we can stream. */ + assert(neededInSize == ZSTD_nextSrcSizeToDecompressWithInputSize(zds, (size_t)(iend - ip))); + if (isSkipFrame) { + loadedSize = MIN(toLoad, (size_t)(iend-ip)); + } else { + RETURN_ERROR_IF(toLoad > zds->inBuffSize - zds->inPos, + corruption_detected, + "should never happen"); + loadedSize = ZSTD_limitCopy(zds->inBuff + zds->inPos, toLoad, ip, (size_t)(iend-ip)); + } + if (loadedSize != 0) { + /* ip may be NULL */ + ip += loadedSize; + zds->inPos += loadedSize; + } + if (loadedSize < toLoad) { someMoreWork = 0; break; } /* not enough input, wait for more */ + + /* decode loaded input */ + zds->inPos = 0; /* input is consumed */ + FORWARD_IF_ERROR(ZSTD_decompressContinueStream(zds, &op, oend, zds->inBuff, neededInSize), ""); + /* Function modifies the stage so we must break */ + break; + } + case zdss_flush: + { + size_t const toFlushSize = zds->outEnd - zds->outStart; + size_t const flushedSize = ZSTD_limitCopy(op, (size_t)(oend-op), zds->outBuff + zds->outStart, toFlushSize); + + op = op ? op + flushedSize : op; + + zds->outStart += flushedSize; + if (flushedSize == toFlushSize) { /* flush completed */ + zds->streamStage = zdss_read; + if ( (zds->outBuffSize < zds->fParams.frameContentSize) + && (zds->outStart + zds->fParams.blockSizeMax > zds->outBuffSize) ) { + DEBUGLOG(5, "restart filling outBuff from beginning (left:%i, needed:%u)", + (int)(zds->outBuffSize - zds->outStart), + (U32)zds->fParams.blockSizeMax); + zds->outStart = zds->outEnd = 0; + } + break; + } } + /* cannot complete flush */ + someMoreWork = 0; + break; + + default: + assert(0); /* impossible */ + RETURN_ERROR(GENERIC, "impossible to reach"); /* some compilers require default to do something */ + } } + + /* result */ + input->pos = (size_t)(ip - (const char*)(input->src)); + output->pos = (size_t)(op - (char*)(output->dst)); + + /* Update the expected output buffer for ZSTD_obm_stable. */ + zds->expectedOutBuffer = *output; + + if ((ip==istart) && (op==ostart)) { /* no forward progress */ + zds->noForwardProgress ++; + if (zds->noForwardProgress >= ZSTD_NO_FORWARD_PROGRESS_MAX) { + RETURN_ERROR_IF(op==oend, noForwardProgress_destFull, ""); + RETURN_ERROR_IF(ip==iend, noForwardProgress_inputEmpty, ""); + assert(0); + } + } else { + zds->noForwardProgress = 0; + } + { size_t nextSrcSizeHint = ZSTD_nextSrcSizeToDecompress(zds); + if (!nextSrcSizeHint) { /* frame fully decoded */ + if (zds->outEnd == zds->outStart) { /* output fully flushed */ + if (zds->hostageByte) { + if (input->pos >= input->size) { + /* can't release hostage (not present) */ + zds->streamStage = zdss_read; + return 1; + } + input->pos++; /* release hostage */ + } /* zds->hostageByte */ + return 0; + } /* zds->outEnd == zds->outStart */ + if (!zds->hostageByte) { /* output not fully flushed; keep last byte as hostage; will be released when all output is flushed */ + input->pos--; /* note : pos > 0, otherwise, impossible to finish reading last block */ + zds->hostageByte=1; + } + return 1; + } /* nextSrcSizeHint==0 */ + nextSrcSizeHint += ZSTD_blockHeaderSize * (ZSTD_nextInputType(zds) == ZSTDnit_block); /* preload header of next block */ + assert(zds->inPos <= nextSrcSizeHint); + nextSrcSizeHint -= zds->inPos; /* part already loaded*/ + return nextSrcSizeHint; + } +} + +size_t ZSTD_decompressStream_simpleArgs ( + ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, size_t* dstPos, + const void* src, size_t srcSize, size_t* srcPos) +{ + ZSTD_outBuffer output; + ZSTD_inBuffer input; + output.dst = dst; + output.size = dstCapacity; + output.pos = *dstPos; + input.src = src; + input.size = srcSize; + input.pos = *srcPos; + { size_t const cErr = ZSTD_decompressStream(dctx, &output, &input); + *dstPos = output.pos; + *srcPos = input.pos; + return cErr; + } +} +/**** ended inlining decompress/zstd_decompress.c ****/ +/**** start inlining decompress/zstd_decompress_block.c ****/ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +/* zstd_decompress_block : + * this module takes care of decompressing _compressed_ block */ + +/*-******************************************************* +* Dependencies +*********************************************************/ +/**** skipping file: ../common/zstd_deps.h ****/ +/**** skipping file: ../common/compiler.h ****/ +/**** skipping file: ../common/cpu.h ****/ +/**** skipping file: ../common/mem.h ****/ +#define FSE_STATIC_LINKING_ONLY +/**** skipping file: ../common/fse.h ****/ +/**** skipping file: ../common/huf.h ****/ +/**** skipping file: ../common/zstd_internal.h ****/ +/**** skipping file: zstd_decompress_internal.h ****/ +/**** skipping file: zstd_ddict.h ****/ +/**** skipping file: zstd_decompress_block.h ****/ +/**** skipping file: ../common/bits.h ****/ + +/*_******************************************************* +* Macros +**********************************************************/ + +/* These two optional macros force the use one way or another of the two + * ZSTD_decompressSequences implementations. You can't force in both directions + * at the same time. + */ +#if defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ + defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) +#error "Cannot force the use of the short and the long ZSTD_decompressSequences variants!" +#endif + + +/*_******************************************************* +* Memory operations +**********************************************************/ +static void ZSTD_copy4(void* dst, const void* src) { ZSTD_memcpy(dst, src, 4); } + + +/*-************************************************************* + * Block decoding + ***************************************************************/ + +/*! ZSTD_getcBlockSize() : + * Provides the size of compressed block from block header `src` */ +size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, + blockProperties_t* bpPtr) +{ + RETURN_ERROR_IF(srcSize < ZSTD_blockHeaderSize, srcSize_wrong, ""); + + { U32 const cBlockHeader = MEM_readLE24(src); + U32 const cSize = cBlockHeader >> 3; + bpPtr->lastBlock = cBlockHeader & 1; + bpPtr->blockType = (blockType_e)((cBlockHeader >> 1) & 3); + bpPtr->origSize = cSize; /* only useful for RLE */ + if (bpPtr->blockType == bt_rle) return 1; + RETURN_ERROR_IF(bpPtr->blockType == bt_reserved, corruption_detected, ""); + return cSize; + } +} + +/* Allocate buffer for literals, either overlapping current dst, or split between dst and litExtraBuffer, or stored entirely within litExtraBuffer */ +static void ZSTD_allocateLiteralsBuffer(ZSTD_DCtx* dctx, void* const dst, const size_t dstCapacity, const size_t litSize, + const streaming_operation streaming, const size_t expectedWriteSize, const unsigned splitImmediately) +{ + if (streaming == not_streaming && dstCapacity > ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH + litSize + WILDCOPY_OVERLENGTH) + { + /* room for litbuffer to fit without read faulting */ + dctx->litBuffer = (BYTE*)dst + ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH; + dctx->litBufferEnd = dctx->litBuffer + litSize; + dctx->litBufferLocation = ZSTD_in_dst; + } + else if (litSize > ZSTD_LITBUFFEREXTRASIZE) + { + /* won't fit in litExtraBuffer, so it will be split between end of dst and extra buffer */ + if (splitImmediately) { + /* won't fit in litExtraBuffer, so it will be split between end of dst and extra buffer */ + dctx->litBuffer = (BYTE*)dst + expectedWriteSize - litSize + ZSTD_LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH; + dctx->litBufferEnd = dctx->litBuffer + litSize - ZSTD_LITBUFFEREXTRASIZE; + } + else { + /* initially this will be stored entirely in dst during huffman decoding, it will partially be shifted to litExtraBuffer after */ + dctx->litBuffer = (BYTE*)dst + expectedWriteSize - litSize; + dctx->litBufferEnd = (BYTE*)dst + expectedWriteSize; + } + dctx->litBufferLocation = ZSTD_split; + } + else + { + /* fits entirely within litExtraBuffer, so no split is necessary */ + dctx->litBuffer = dctx->litExtraBuffer; + dctx->litBufferEnd = dctx->litBuffer + litSize; + dctx->litBufferLocation = ZSTD_not_in_dst; + } +} + +/* Hidden declaration for fullbench */ +size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, + const void* src, size_t srcSize, + void* dst, size_t dstCapacity, const streaming_operation streaming); +/*! ZSTD_decodeLiteralsBlock() : + * Where it is possible to do so without being stomped by the output during decompression, the literals block will be stored + * in the dstBuffer. If there is room to do so, it will be stored in full in the excess dst space after where the current + * block will be output. Otherwise it will be stored at the end of the current dst blockspace, with a small portion being + * stored in dctx->litExtraBuffer to help keep it "ahead" of the current output write. + * + * @return : nb of bytes read from src (< srcSize ) + * note : symbol not declared but exposed for fullbench */ +size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, + const void* src, size_t srcSize, /* note : srcSize < BLOCKSIZE */ + void* dst, size_t dstCapacity, const streaming_operation streaming) +{ + DEBUGLOG(5, "ZSTD_decodeLiteralsBlock"); + RETURN_ERROR_IF(srcSize < MIN_CBLOCK_SIZE, corruption_detected, ""); + + { const BYTE* const istart = (const BYTE*) src; + symbolEncodingType_e const litEncType = (symbolEncodingType_e)(istart[0] & 3); + + switch(litEncType) + { + case set_repeat: + DEBUGLOG(5, "set_repeat flag : re-using stats from previous compressed literals block"); + RETURN_ERROR_IF(dctx->litEntropy==0, dictionary_corrupted, ""); + ZSTD_FALLTHROUGH; + + case set_compressed: + RETURN_ERROR_IF(srcSize < 5, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need up to 5 for case 3"); + { size_t lhSize, litSize, litCSize; + U32 singleStream=0; + U32 const lhlCode = (istart[0] >> 2) & 3; + U32 const lhc = MEM_readLE32(istart); + size_t hufSuccess; + size_t expectedWriteSize = MIN(ZSTD_BLOCKSIZE_MAX, dstCapacity); + int const flags = 0 + | (ZSTD_DCtx_get_bmi2(dctx) ? HUF_flags_bmi2 : 0) + | (dctx->disableHufAsm ? HUF_flags_disableAsm : 0); + switch(lhlCode) + { + case 0: case 1: default: /* note : default is impossible, since lhlCode into [0..3] */ + /* 2 - 2 - 10 - 10 */ + singleStream = !lhlCode; + lhSize = 3; + litSize = (lhc >> 4) & 0x3FF; + litCSize = (lhc >> 14) & 0x3FF; + break; + case 2: + /* 2 - 2 - 14 - 14 */ + lhSize = 4; + litSize = (lhc >> 4) & 0x3FFF; + litCSize = lhc >> 18; + break; + case 3: + /* 2 - 2 - 18 - 18 */ + lhSize = 5; + litSize = (lhc >> 4) & 0x3FFFF; + litCSize = (lhc >> 22) + ((size_t)istart[4] << 10); + break; + } + RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); + RETURN_ERROR_IF(litSize > ZSTD_BLOCKSIZE_MAX, corruption_detected, ""); + if (!singleStream) + RETURN_ERROR_IF(litSize < MIN_LITERALS_FOR_4_STREAMS, literals_headerWrong, + "Not enough literals (%zu) for the 4-streams mode (min %u)", + litSize, MIN_LITERALS_FOR_4_STREAMS); + RETURN_ERROR_IF(litCSize + lhSize > srcSize, corruption_detected, ""); + RETURN_ERROR_IF(expectedWriteSize < litSize , dstSize_tooSmall, ""); + ZSTD_allocateLiteralsBuffer(dctx, dst, dstCapacity, litSize, streaming, expectedWriteSize, 0); + + /* prefetch huffman table if cold */ + if (dctx->ddictIsCold && (litSize > 768 /* heuristic */)) { + PREFETCH_AREA(dctx->HUFptr, sizeof(dctx->entropy.hufTable)); + } + + if (litEncType==set_repeat) { + if (singleStream) { + hufSuccess = HUF_decompress1X_usingDTable( + dctx->litBuffer, litSize, istart+lhSize, litCSize, + dctx->HUFptr, flags); + } else { + assert(litSize >= MIN_LITERALS_FOR_4_STREAMS); + hufSuccess = HUF_decompress4X_usingDTable( + dctx->litBuffer, litSize, istart+lhSize, litCSize, + dctx->HUFptr, flags); + } + } else { + if (singleStream) { +#if defined(HUF_FORCE_DECOMPRESS_X2) + hufSuccess = HUF_decompress1X_DCtx_wksp( + dctx->entropy.hufTable, dctx->litBuffer, litSize, + istart+lhSize, litCSize, dctx->workspace, + sizeof(dctx->workspace), flags); +#else + hufSuccess = HUF_decompress1X1_DCtx_wksp( + dctx->entropy.hufTable, dctx->litBuffer, litSize, + istart+lhSize, litCSize, dctx->workspace, + sizeof(dctx->workspace), flags); +#endif + } else { + hufSuccess = HUF_decompress4X_hufOnly_wksp( + dctx->entropy.hufTable, dctx->litBuffer, litSize, + istart+lhSize, litCSize, dctx->workspace, + sizeof(dctx->workspace), flags); + } + } + if (dctx->litBufferLocation == ZSTD_split) + { + ZSTD_memcpy(dctx->litExtraBuffer, dctx->litBufferEnd - ZSTD_LITBUFFEREXTRASIZE, ZSTD_LITBUFFEREXTRASIZE); + ZSTD_memmove(dctx->litBuffer + ZSTD_LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH, dctx->litBuffer, litSize - ZSTD_LITBUFFEREXTRASIZE); + dctx->litBuffer += ZSTD_LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH; + dctx->litBufferEnd -= WILDCOPY_OVERLENGTH; + } + + RETURN_ERROR_IF(HUF_isError(hufSuccess), corruption_detected, ""); + + dctx->litPtr = dctx->litBuffer; + dctx->litSize = litSize; + dctx->litEntropy = 1; + if (litEncType==set_compressed) dctx->HUFptr = dctx->entropy.hufTable; + return litCSize + lhSize; + } + + case set_basic: + { size_t litSize, lhSize; + U32 const lhlCode = ((istart[0]) >> 2) & 3; + size_t expectedWriteSize = MIN(ZSTD_BLOCKSIZE_MAX, dstCapacity); + switch(lhlCode) + { + case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */ + lhSize = 1; + litSize = istart[0] >> 3; + break; + case 1: + lhSize = 2; + litSize = MEM_readLE16(istart) >> 4; + break; + case 3: + lhSize = 3; + RETURN_ERROR_IF(srcSize<3, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need lhSize = 3"); + litSize = MEM_readLE24(istart) >> 4; + break; + } + + RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); + RETURN_ERROR_IF(expectedWriteSize < litSize, dstSize_tooSmall, ""); + ZSTD_allocateLiteralsBuffer(dctx, dst, dstCapacity, litSize, streaming, expectedWriteSize, 1); + if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) { /* risk reading beyond src buffer with wildcopy */ + RETURN_ERROR_IF(litSize+lhSize > srcSize, corruption_detected, ""); + if (dctx->litBufferLocation == ZSTD_split) + { + ZSTD_memcpy(dctx->litBuffer, istart + lhSize, litSize - ZSTD_LITBUFFEREXTRASIZE); + ZSTD_memcpy(dctx->litExtraBuffer, istart + lhSize + litSize - ZSTD_LITBUFFEREXTRASIZE, ZSTD_LITBUFFEREXTRASIZE); + } + else + { + ZSTD_memcpy(dctx->litBuffer, istart + lhSize, litSize); + } + dctx->litPtr = dctx->litBuffer; + dctx->litSize = litSize; + return lhSize+litSize; + } + /* direct reference into compressed stream */ + dctx->litPtr = istart+lhSize; + dctx->litSize = litSize; + dctx->litBufferEnd = dctx->litPtr + litSize; + dctx->litBufferLocation = ZSTD_not_in_dst; + return lhSize+litSize; + } + + case set_rle: + { U32 const lhlCode = ((istart[0]) >> 2) & 3; + size_t litSize, lhSize; + size_t expectedWriteSize = MIN(ZSTD_BLOCKSIZE_MAX, dstCapacity); + switch(lhlCode) + { + case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */ + lhSize = 1; + litSize = istart[0] >> 3; + break; + case 1: + lhSize = 2; + RETURN_ERROR_IF(srcSize<3, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need lhSize+1 = 3"); + litSize = MEM_readLE16(istart) >> 4; + break; + case 3: + lhSize = 3; + RETURN_ERROR_IF(srcSize<4, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need lhSize+1 = 4"); + litSize = MEM_readLE24(istart) >> 4; + break; + } + RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); + RETURN_ERROR_IF(litSize > ZSTD_BLOCKSIZE_MAX, corruption_detected, ""); + RETURN_ERROR_IF(expectedWriteSize < litSize, dstSize_tooSmall, ""); + ZSTD_allocateLiteralsBuffer(dctx, dst, dstCapacity, litSize, streaming, expectedWriteSize, 1); + if (dctx->litBufferLocation == ZSTD_split) + { + ZSTD_memset(dctx->litBuffer, istart[lhSize], litSize - ZSTD_LITBUFFEREXTRASIZE); + ZSTD_memset(dctx->litExtraBuffer, istart[lhSize], ZSTD_LITBUFFEREXTRASIZE); + } + else + { + ZSTD_memset(dctx->litBuffer, istart[lhSize], litSize); + } + dctx->litPtr = dctx->litBuffer; + dctx->litSize = litSize; + return lhSize+1; + } + default: + RETURN_ERROR(corruption_detected, "impossible"); + } + } +} + +/* Default FSE distribution tables. + * These are pre-calculated FSE decoding tables using default distributions as defined in specification : + * https://github.com/facebook/zstd/blob/release/doc/zstd_compression_format.md#default-distributions + * They were generated programmatically with following method : + * - start from default distributions, present in /lib/common/zstd_internal.h + * - generate tables normally, using ZSTD_buildFSETable() + * - printout the content of tables + * - pretify output, report below, test with fuzzer to ensure it's correct */ + +/* Default FSE distribution table for Literal Lengths */ +static const ZSTD_seqSymbol LL_defaultDTable[(1<tableLog = 0; + DTableH->fastMode = 0; + + cell->nbBits = 0; + cell->nextState = 0; + assert(nbAddBits < 255); + cell->nbAdditionalBits = nbAddBits; + cell->baseValue = baseValue; +} + + +/* ZSTD_buildFSETable() : + * generate FSE decoding table for one symbol (ll, ml or off) + * cannot fail if input is valid => + * all inputs are presumed validated at this stage */ +FORCE_INLINE_TEMPLATE +void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt, + const short* normalizedCounter, unsigned maxSymbolValue, + const U32* baseValue, const U8* nbAdditionalBits, + unsigned tableLog, void* wksp, size_t wkspSize) +{ + ZSTD_seqSymbol* const tableDecode = dt+1; + U32 const maxSV1 = maxSymbolValue + 1; + U32 const tableSize = 1 << tableLog; + + U16* symbolNext = (U16*)wksp; + BYTE* spread = (BYTE*)(symbolNext + MaxSeq + 1); + U32 highThreshold = tableSize - 1; + + + /* Sanity Checks */ + assert(maxSymbolValue <= MaxSeq); + assert(tableLog <= MaxFSELog); + assert(wkspSize >= ZSTD_BUILD_FSE_TABLE_WKSP_SIZE); + (void)wkspSize; + /* Init, lay down lowprob symbols */ + { ZSTD_seqSymbol_header DTableH; + DTableH.tableLog = tableLog; + DTableH.fastMode = 1; + { S16 const largeLimit= (S16)(1 << (tableLog-1)); + U32 s; + for (s=0; s= largeLimit) DTableH.fastMode=0; + assert(normalizedCounter[s]>=0); + symbolNext[s] = (U16)normalizedCounter[s]; + } } } + ZSTD_memcpy(dt, &DTableH, sizeof(DTableH)); + } + + /* Spread symbols */ + assert(tableSize <= 512); + /* Specialized symbol spreading for the case when there are + * no low probability (-1 count) symbols. When compressing + * small blocks we avoid low probability symbols to hit this + * case, since header decoding speed matters more. + */ + if (highThreshold == tableSize - 1) { + size_t const tableMask = tableSize-1; + size_t const step = FSE_TABLESTEP(tableSize); + /* First lay down the symbols in order. + * We use a uint64_t to lay down 8 bytes at a time. This reduces branch + * misses since small blocks generally have small table logs, so nearly + * all symbols have counts <= 8. We ensure we have 8 bytes at the end of + * our buffer to handle the over-write. + */ + { + U64 const add = 0x0101010101010101ull; + size_t pos = 0; + U64 sv = 0; + U32 s; + for (s=0; s=0); + pos += (size_t)n; + } + } + /* Now we spread those positions across the table. + * The benefit of doing it in two stages is that we avoid the + * variable size inner loop, which caused lots of branch misses. + * Now we can run through all the positions without any branch misses. + * We unroll the loop twice, since that is what empirically worked best. + */ + { + size_t position = 0; + size_t s; + size_t const unroll = 2; + assert(tableSize % unroll == 0); /* FSE_MIN_TABLELOG is 5 */ + for (s = 0; s < (size_t)tableSize; s += unroll) { + size_t u; + for (u = 0; u < unroll; ++u) { + size_t const uPosition = (position + (u * step)) & tableMask; + tableDecode[uPosition].baseValue = spread[s + u]; + } + position = (position + (unroll * step)) & tableMask; + } + assert(position == 0); + } + } else { + U32 const tableMask = tableSize-1; + U32 const step = FSE_TABLESTEP(tableSize); + U32 s, position = 0; + for (s=0; s highThreshold)) position = (position + step) & tableMask; /* lowprob area */ + } } + assert(position == 0); /* position must reach all cells once, otherwise normalizedCounter is incorrect */ + } + + /* Build Decoding table */ + { + U32 u; + for (u=0; u max, corruption_detected, ""); + { U32 const symbol = *(const BYTE*)src; + U32 const baseline = baseValue[symbol]; + U8 const nbBits = nbAdditionalBits[symbol]; + ZSTD_buildSeqTable_rle(DTableSpace, baseline, nbBits); + } + *DTablePtr = DTableSpace; + return 1; + case set_basic : + *DTablePtr = defaultTable; + return 0; + case set_repeat: + RETURN_ERROR_IF(!flagRepeatTable, corruption_detected, ""); + /* prefetch FSE table if used */ + if (ddictIsCold && (nbSeq > 24 /* heuristic */)) { + const void* const pStart = *DTablePtr; + size_t const pSize = sizeof(ZSTD_seqSymbol) * (SEQSYMBOL_TABLE_SIZE(maxLog)); + PREFETCH_AREA(pStart, pSize); + } + return 0; + case set_compressed : + { unsigned tableLog; + S16 norm[MaxSeq+1]; + size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize); + RETURN_ERROR_IF(FSE_isError(headerSize), corruption_detected, ""); + RETURN_ERROR_IF(tableLog > maxLog, corruption_detected, ""); + ZSTD_buildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog, wksp, wkspSize, bmi2); + *DTablePtr = DTableSpace; + return headerSize; + } + default : + assert(0); + RETURN_ERROR(GENERIC, "impossible"); + } +} + +size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, + const void* src, size_t srcSize) +{ + const BYTE* const istart = (const BYTE*)src; + const BYTE* const iend = istart + srcSize; + const BYTE* ip = istart; + int nbSeq; + DEBUGLOG(5, "ZSTD_decodeSeqHeaders"); + + /* check */ + RETURN_ERROR_IF(srcSize < MIN_SEQUENCES_SIZE, srcSize_wrong, ""); + + /* SeqHead */ + nbSeq = *ip++; + if (!nbSeq) { + *nbSeqPtr=0; + RETURN_ERROR_IF(srcSize != 1, srcSize_wrong, ""); + return 1; + } + if (nbSeq > 0x7F) { + if (nbSeq == 0xFF) { + RETURN_ERROR_IF(ip+2 > iend, srcSize_wrong, ""); + nbSeq = MEM_readLE16(ip) + LONGNBSEQ; + ip+=2; + } else { + RETURN_ERROR_IF(ip >= iend, srcSize_wrong, ""); + nbSeq = ((nbSeq-0x80)<<8) + *ip++; + } + } + *nbSeqPtr = nbSeq; + + /* FSE table descriptors */ + RETURN_ERROR_IF(ip+1 > iend, srcSize_wrong, ""); /* minimum possible size: 1 byte for symbol encoding types */ + { symbolEncodingType_e const LLtype = (symbolEncodingType_e)(*ip >> 6); + symbolEncodingType_e const OFtype = (symbolEncodingType_e)((*ip >> 4) & 3); + symbolEncodingType_e const MLtype = (symbolEncodingType_e)((*ip >> 2) & 3); + ip++; + + /* Build DTables */ + { size_t const llhSize = ZSTD_buildSeqTable(dctx->entropy.LLTable, &dctx->LLTptr, + LLtype, MaxLL, LLFSELog, + ip, iend-ip, + LL_base, LL_bits, + LL_defaultDTable, dctx->fseEntropy, + dctx->ddictIsCold, nbSeq, + dctx->workspace, sizeof(dctx->workspace), + ZSTD_DCtx_get_bmi2(dctx)); + RETURN_ERROR_IF(ZSTD_isError(llhSize), corruption_detected, "ZSTD_buildSeqTable failed"); + ip += llhSize; + } + + { size_t const ofhSize = ZSTD_buildSeqTable(dctx->entropy.OFTable, &dctx->OFTptr, + OFtype, MaxOff, OffFSELog, + ip, iend-ip, + OF_base, OF_bits, + OF_defaultDTable, dctx->fseEntropy, + dctx->ddictIsCold, nbSeq, + dctx->workspace, sizeof(dctx->workspace), + ZSTD_DCtx_get_bmi2(dctx)); + RETURN_ERROR_IF(ZSTD_isError(ofhSize), corruption_detected, "ZSTD_buildSeqTable failed"); + ip += ofhSize; + } + + { size_t const mlhSize = ZSTD_buildSeqTable(dctx->entropy.MLTable, &dctx->MLTptr, + MLtype, MaxML, MLFSELog, + ip, iend-ip, + ML_base, ML_bits, + ML_defaultDTable, dctx->fseEntropy, + dctx->ddictIsCold, nbSeq, + dctx->workspace, sizeof(dctx->workspace), + ZSTD_DCtx_get_bmi2(dctx)); + RETURN_ERROR_IF(ZSTD_isError(mlhSize), corruption_detected, "ZSTD_buildSeqTable failed"); + ip += mlhSize; + } + } + + return ip-istart; +} + + +typedef struct { + size_t litLength; + size_t matchLength; + size_t offset; +} seq_t; + +typedef struct { + size_t state; + const ZSTD_seqSymbol* table; +} ZSTD_fseState; + +typedef struct { + BIT_DStream_t DStream; + ZSTD_fseState stateLL; + ZSTD_fseState stateOffb; + ZSTD_fseState stateML; + size_t prevOffset[ZSTD_REP_NUM]; +} seqState_t; + +/*! ZSTD_overlapCopy8() : + * Copies 8 bytes from ip to op and updates op and ip where ip <= op. + * If the offset is < 8 then the offset is spread to at least 8 bytes. + * + * Precondition: *ip <= *op + * Postcondition: *op - *op >= 8 + */ +HINT_INLINE void ZSTD_overlapCopy8(BYTE** op, BYTE const** ip, size_t offset) { + assert(*ip <= *op); + if (offset < 8) { + /* close range match, overlap */ + static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */ + static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */ + int const sub2 = dec64table[offset]; + (*op)[0] = (*ip)[0]; + (*op)[1] = (*ip)[1]; + (*op)[2] = (*ip)[2]; + (*op)[3] = (*ip)[3]; + *ip += dec32table[offset]; + ZSTD_copy4(*op+4, *ip); + *ip -= sub2; + } else { + ZSTD_copy8(*op, *ip); + } + *ip += 8; + *op += 8; + assert(*op - *ip >= 8); +} + +/*! ZSTD_safecopy() : + * Specialized version of memcpy() that is allowed to READ up to WILDCOPY_OVERLENGTH past the input buffer + * and write up to 16 bytes past oend_w (op >= oend_w is allowed). + * This function is only called in the uncommon case where the sequence is near the end of the block. It + * should be fast for a single long sequence, but can be slow for several short sequences. + * + * @param ovtype controls the overlap detection + * - ZSTD_no_overlap: The source and destination are guaranteed to be at least WILDCOPY_VECLEN bytes apart. + * - ZSTD_overlap_src_before_dst: The src and dst may overlap and may be any distance apart. + * The src buffer must be before the dst buffer. + */ +static void ZSTD_safecopy(BYTE* op, const BYTE* const oend_w, BYTE const* ip, ptrdiff_t length, ZSTD_overlap_e ovtype) { + ptrdiff_t const diff = op - ip; + BYTE* const oend = op + length; + + assert((ovtype == ZSTD_no_overlap && (diff <= -8 || diff >= 8 || op >= oend_w)) || + (ovtype == ZSTD_overlap_src_before_dst && diff >= 0)); + + if (length < 8) { + /* Handle short lengths. */ + while (op < oend) *op++ = *ip++; + return; + } + if (ovtype == ZSTD_overlap_src_before_dst) { + /* Copy 8 bytes and ensure the offset >= 8 when there can be overlap. */ + assert(length >= 8); + ZSTD_overlapCopy8(&op, &ip, diff); + length -= 8; + assert(op - ip >= 8); + assert(op <= oend); + } + + if (oend <= oend_w) { + /* No risk of overwrite. */ + ZSTD_wildcopy(op, ip, length, ovtype); + return; + } + if (op <= oend_w) { + /* Wildcopy until we get close to the end. */ + assert(oend > oend_w); + ZSTD_wildcopy(op, ip, oend_w - op, ovtype); + ip += oend_w - op; + op += oend_w - op; + } + /* Handle the leftovers. */ + while (op < oend) *op++ = *ip++; +} + +/* ZSTD_safecopyDstBeforeSrc(): + * This version allows overlap with dst before src, or handles the non-overlap case with dst after src + * Kept separate from more common ZSTD_safecopy case to avoid performance impact to the safecopy common case */ +static void ZSTD_safecopyDstBeforeSrc(BYTE* op, BYTE const* ip, ptrdiff_t length) { + ptrdiff_t const diff = op - ip; + BYTE* const oend = op + length; + + if (length < 8 || diff > -8) { + /* Handle short lengths, close overlaps, and dst not before src. */ + while (op < oend) *op++ = *ip++; + return; + } + + if (op <= oend - WILDCOPY_OVERLENGTH && diff < -WILDCOPY_VECLEN) { + ZSTD_wildcopy(op, ip, oend - WILDCOPY_OVERLENGTH - op, ZSTD_no_overlap); + ip += oend - WILDCOPY_OVERLENGTH - op; + op += oend - WILDCOPY_OVERLENGTH - op; + } + + /* Handle the leftovers. */ + while (op < oend) *op++ = *ip++; +} + +/* ZSTD_execSequenceEnd(): + * This version handles cases that are near the end of the output buffer. It requires + * more careful checks to make sure there is no overflow. By separating out these hard + * and unlikely cases, we can speed up the common cases. + * + * NOTE: This function needs to be fast for a single long sequence, but doesn't need + * to be optimized for many small sequences, since those fall into ZSTD_execSequence(). + */ +FORCE_NOINLINE +size_t ZSTD_execSequenceEnd(BYTE* op, + BYTE* const oend, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) +{ + BYTE* const oLitEnd = op + sequence.litLength; + size_t const sequenceLength = sequence.litLength + sequence.matchLength; + const BYTE* const iLitEnd = *litPtr + sequence.litLength; + const BYTE* match = oLitEnd - sequence.offset; + BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH; + + /* bounds checks : careful of address space overflow in 32-bit mode */ + RETURN_ERROR_IF(sequenceLength > (size_t)(oend - op), dstSize_tooSmall, "last match must fit within dstBuffer"); + RETURN_ERROR_IF(sequence.litLength > (size_t)(litLimit - *litPtr), corruption_detected, "try to read beyond literal buffer"); + assert(op < op + sequenceLength); + assert(oLitEnd < op + sequenceLength); + + /* copy literals */ + ZSTD_safecopy(op, oend_w, *litPtr, sequence.litLength, ZSTD_no_overlap); + op = oLitEnd; + *litPtr = iLitEnd; + + /* copy Match */ + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { + /* offset beyond prefix */ + RETURN_ERROR_IF(sequence.offset > (size_t)(oLitEnd - virtualStart), corruption_detected, ""); + match = dictEnd - (prefixStart - match); + if (match + sequence.matchLength <= dictEnd) { + ZSTD_memmove(oLitEnd, match, sequence.matchLength); + return sequenceLength; + } + /* span extDict & currentPrefixSegment */ + { size_t const length1 = dictEnd - match; + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } + } + ZSTD_safecopy(op, oend_w, match, sequence.matchLength, ZSTD_overlap_src_before_dst); + return sequenceLength; +} + +/* ZSTD_execSequenceEndSplitLitBuffer(): + * This version is intended to be used during instances where the litBuffer is still split. It is kept separate to avoid performance impact for the good case. + */ +FORCE_NOINLINE +size_t ZSTD_execSequenceEndSplitLitBuffer(BYTE* op, + BYTE* const oend, const BYTE* const oend_w, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) +{ + BYTE* const oLitEnd = op + sequence.litLength; + size_t const sequenceLength = sequence.litLength + sequence.matchLength; + const BYTE* const iLitEnd = *litPtr + sequence.litLength; + const BYTE* match = oLitEnd - sequence.offset; + + + /* bounds checks : careful of address space overflow in 32-bit mode */ + RETURN_ERROR_IF(sequenceLength > (size_t)(oend - op), dstSize_tooSmall, "last match must fit within dstBuffer"); + RETURN_ERROR_IF(sequence.litLength > (size_t)(litLimit - *litPtr), corruption_detected, "try to read beyond literal buffer"); + assert(op < op + sequenceLength); + assert(oLitEnd < op + sequenceLength); + + /* copy literals */ + RETURN_ERROR_IF(op > *litPtr && op < *litPtr + sequence.litLength, dstSize_tooSmall, "output should not catch up to and overwrite literal buffer"); + ZSTD_safecopyDstBeforeSrc(op, *litPtr, sequence.litLength); + op = oLitEnd; + *litPtr = iLitEnd; + + /* copy Match */ + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { + /* offset beyond prefix */ + RETURN_ERROR_IF(sequence.offset > (size_t)(oLitEnd - virtualStart), corruption_detected, ""); + match = dictEnd - (prefixStart - match); + if (match + sequence.matchLength <= dictEnd) { + ZSTD_memmove(oLitEnd, match, sequence.matchLength); + return sequenceLength; + } + /* span extDict & currentPrefixSegment */ + { size_t const length1 = dictEnd - match; + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } + } + ZSTD_safecopy(op, oend_w, match, sequence.matchLength, ZSTD_overlap_src_before_dst); + return sequenceLength; +} + +HINT_INLINE +size_t ZSTD_execSequence(BYTE* op, + BYTE* const oend, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) +{ + BYTE* const oLitEnd = op + sequence.litLength; + size_t const sequenceLength = sequence.litLength + sequence.matchLength; + BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */ + BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH; /* risk : address space underflow on oend=NULL */ + const BYTE* const iLitEnd = *litPtr + sequence.litLength; + const BYTE* match = oLitEnd - sequence.offset; + + assert(op != NULL /* Precondition */); + assert(oend_w < oend /* No underflow */); + +#if defined(__aarch64__) + /* prefetch sequence starting from match that will be used for copy later */ + PREFETCH_L1(match); +#endif + /* Handle edge cases in a slow path: + * - Read beyond end of literals + * - Match end is within WILDCOPY_OVERLIMIT of oend + * - 32-bit mode and the match length overflows + */ + if (UNLIKELY( + iLitEnd > litLimit || + oMatchEnd > oend_w || + (MEM_32bits() && (size_t)(oend - op) < sequenceLength + WILDCOPY_OVERLENGTH))) + return ZSTD_execSequenceEnd(op, oend, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd); + + /* Assumptions (everything else goes into ZSTD_execSequenceEnd()) */ + assert(op <= oLitEnd /* No overflow */); + assert(oLitEnd < oMatchEnd /* Non-zero match & no overflow */); + assert(oMatchEnd <= oend /* No underflow */); + assert(iLitEnd <= litLimit /* Literal length is in bounds */); + assert(oLitEnd <= oend_w /* Can wildcopy literals */); + assert(oMatchEnd <= oend_w /* Can wildcopy matches */); + + /* Copy Literals: + * Split out litLength <= 16 since it is nearly always true. +1.6% on gcc-9. + * We likely don't need the full 32-byte wildcopy. + */ + assert(WILDCOPY_OVERLENGTH >= 16); + ZSTD_copy16(op, (*litPtr)); + if (UNLIKELY(sequence.litLength > 16)) { + ZSTD_wildcopy(op + 16, (*litPtr) + 16, sequence.litLength - 16, ZSTD_no_overlap); + } + op = oLitEnd; + *litPtr = iLitEnd; /* update for next sequence */ + + /* Copy Match */ + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { + /* offset beyond prefix -> go into extDict */ + RETURN_ERROR_IF(UNLIKELY(sequence.offset > (size_t)(oLitEnd - virtualStart)), corruption_detected, ""); + match = dictEnd + (match - prefixStart); + if (match + sequence.matchLength <= dictEnd) { + ZSTD_memmove(oLitEnd, match, sequence.matchLength); + return sequenceLength; + } + /* span extDict & currentPrefixSegment */ + { size_t const length1 = dictEnd - match; + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } + } + /* Match within prefix of 1 or more bytes */ + assert(op <= oMatchEnd); + assert(oMatchEnd <= oend_w); + assert(match >= prefixStart); + assert(sequence.matchLength >= 1); + + /* Nearly all offsets are >= WILDCOPY_VECLEN bytes, which means we can use wildcopy + * without overlap checking. + */ + if (LIKELY(sequence.offset >= WILDCOPY_VECLEN)) { + /* We bet on a full wildcopy for matches, since we expect matches to be + * longer than literals (in general). In silesia, ~10% of matches are longer + * than 16 bytes. + */ + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength, ZSTD_no_overlap); + return sequenceLength; + } + assert(sequence.offset < WILDCOPY_VECLEN); + + /* Copy 8 bytes and spread the offset to be >= 8. */ + ZSTD_overlapCopy8(&op, &match, sequence.offset); + + /* If the match length is > 8 bytes, then continue with the wildcopy. */ + if (sequence.matchLength > 8) { + assert(op < oMatchEnd); + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8, ZSTD_overlap_src_before_dst); + } + return sequenceLength; +} + +HINT_INLINE +size_t ZSTD_execSequenceSplitLitBuffer(BYTE* op, + BYTE* const oend, const BYTE* const oend_w, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) +{ + BYTE* const oLitEnd = op + sequence.litLength; + size_t const sequenceLength = sequence.litLength + sequence.matchLength; + BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */ + const BYTE* const iLitEnd = *litPtr + sequence.litLength; + const BYTE* match = oLitEnd - sequence.offset; + + assert(op != NULL /* Precondition */); + assert(oend_w < oend /* No underflow */); + /* Handle edge cases in a slow path: + * - Read beyond end of literals + * - Match end is within WILDCOPY_OVERLIMIT of oend + * - 32-bit mode and the match length overflows + */ + if (UNLIKELY( + iLitEnd > litLimit || + oMatchEnd > oend_w || + (MEM_32bits() && (size_t)(oend - op) < sequenceLength + WILDCOPY_OVERLENGTH))) + return ZSTD_execSequenceEndSplitLitBuffer(op, oend, oend_w, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd); + + /* Assumptions (everything else goes into ZSTD_execSequenceEnd()) */ + assert(op <= oLitEnd /* No overflow */); + assert(oLitEnd < oMatchEnd /* Non-zero match & no overflow */); + assert(oMatchEnd <= oend /* No underflow */); + assert(iLitEnd <= litLimit /* Literal length is in bounds */); + assert(oLitEnd <= oend_w /* Can wildcopy literals */); + assert(oMatchEnd <= oend_w /* Can wildcopy matches */); + + /* Copy Literals: + * Split out litLength <= 16 since it is nearly always true. +1.6% on gcc-9. + * We likely don't need the full 32-byte wildcopy. + */ + assert(WILDCOPY_OVERLENGTH >= 16); + ZSTD_copy16(op, (*litPtr)); + if (UNLIKELY(sequence.litLength > 16)) { + ZSTD_wildcopy(op+16, (*litPtr)+16, sequence.litLength-16, ZSTD_no_overlap); + } + op = oLitEnd; + *litPtr = iLitEnd; /* update for next sequence */ + + /* Copy Match */ + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { + /* offset beyond prefix -> go into extDict */ + RETURN_ERROR_IF(UNLIKELY(sequence.offset > (size_t)(oLitEnd - virtualStart)), corruption_detected, ""); + match = dictEnd + (match - prefixStart); + if (match + sequence.matchLength <= dictEnd) { + ZSTD_memmove(oLitEnd, match, sequence.matchLength); + return sequenceLength; + } + /* span extDict & currentPrefixSegment */ + { size_t const length1 = dictEnd - match; + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } } + /* Match within prefix of 1 or more bytes */ + assert(op <= oMatchEnd); + assert(oMatchEnd <= oend_w); + assert(match >= prefixStart); + assert(sequence.matchLength >= 1); + + /* Nearly all offsets are >= WILDCOPY_VECLEN bytes, which means we can use wildcopy + * without overlap checking. + */ + if (LIKELY(sequence.offset >= WILDCOPY_VECLEN)) { + /* We bet on a full wildcopy for matches, since we expect matches to be + * longer than literals (in general). In silesia, ~10% of matches are longer + * than 16 bytes. + */ + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength, ZSTD_no_overlap); + return sequenceLength; + } + assert(sequence.offset < WILDCOPY_VECLEN); + + /* Copy 8 bytes and spread the offset to be >= 8. */ + ZSTD_overlapCopy8(&op, &match, sequence.offset); + + /* If the match length is > 8 bytes, then continue with the wildcopy. */ + if (sequence.matchLength > 8) { + assert(op < oMatchEnd); + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8, ZSTD_overlap_src_before_dst); + } + return sequenceLength; +} + + +static void +ZSTD_initFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, const ZSTD_seqSymbol* dt) +{ + const void* ptr = dt; + const ZSTD_seqSymbol_header* const DTableH = (const ZSTD_seqSymbol_header*)ptr; + DStatePtr->state = BIT_readBits(bitD, DTableH->tableLog); + DEBUGLOG(6, "ZSTD_initFseState : val=%u using %u bits", + (U32)DStatePtr->state, DTableH->tableLog); + BIT_reloadDStream(bitD); + DStatePtr->table = dt + 1; +} + +FORCE_INLINE_TEMPLATE void +ZSTD_updateFseStateWithDInfo(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, U16 nextState, U32 nbBits) +{ + size_t const lowBits = BIT_readBits(bitD, nbBits); + DStatePtr->state = nextState + lowBits; +} + +/* We need to add at most (ZSTD_WINDOWLOG_MAX_32 - 1) bits to read the maximum + * offset bits. But we can only read at most STREAM_ACCUMULATOR_MIN_32 + * bits before reloading. This value is the maximum number of bytes we read + * after reloading when we are decoding long offsets. + */ +#define LONG_OFFSETS_MAX_EXTRA_BITS_32 \ + (ZSTD_WINDOWLOG_MAX_32 > STREAM_ACCUMULATOR_MIN_32 \ + ? ZSTD_WINDOWLOG_MAX_32 - STREAM_ACCUMULATOR_MIN_32 \ + : 0) + +typedef enum { ZSTD_lo_isRegularOffset, ZSTD_lo_isLongOffset=1 } ZSTD_longOffset_e; + +FORCE_INLINE_TEMPLATE seq_t +ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets) +{ + seq_t seq; + /* + * ZSTD_seqSymbol is a structure with a total of 64 bits wide. So it can be + * loaded in one operation and extracted its fields by simply shifting or + * bit-extracting on aarch64. + * GCC doesn't recognize this and generates more unnecessary ldr/ldrb/ldrh + * operations that cause performance drop. This can be avoided by using this + * ZSTD_memcpy hack. + */ +#if defined(__aarch64__) && (defined(__GNUC__) && !defined(__clang__)) + ZSTD_seqSymbol llDInfoS, mlDInfoS, ofDInfoS; + ZSTD_seqSymbol* const llDInfo = &llDInfoS; + ZSTD_seqSymbol* const mlDInfo = &mlDInfoS; + ZSTD_seqSymbol* const ofDInfo = &ofDInfoS; + ZSTD_memcpy(llDInfo, seqState->stateLL.table + seqState->stateLL.state, sizeof(ZSTD_seqSymbol)); + ZSTD_memcpy(mlDInfo, seqState->stateML.table + seqState->stateML.state, sizeof(ZSTD_seqSymbol)); + ZSTD_memcpy(ofDInfo, seqState->stateOffb.table + seqState->stateOffb.state, sizeof(ZSTD_seqSymbol)); +#else + const ZSTD_seqSymbol* const llDInfo = seqState->stateLL.table + seqState->stateLL.state; + const ZSTD_seqSymbol* const mlDInfo = seqState->stateML.table + seqState->stateML.state; + const ZSTD_seqSymbol* const ofDInfo = seqState->stateOffb.table + seqState->stateOffb.state; +#endif + seq.matchLength = mlDInfo->baseValue; + seq.litLength = llDInfo->baseValue; + { U32 const ofBase = ofDInfo->baseValue; + BYTE const llBits = llDInfo->nbAdditionalBits; + BYTE const mlBits = mlDInfo->nbAdditionalBits; + BYTE const ofBits = ofDInfo->nbAdditionalBits; + BYTE const totalBits = llBits+mlBits+ofBits; + + U16 const llNext = llDInfo->nextState; + U16 const mlNext = mlDInfo->nextState; + U16 const ofNext = ofDInfo->nextState; + U32 const llnbBits = llDInfo->nbBits; + U32 const mlnbBits = mlDInfo->nbBits; + U32 const ofnbBits = ofDInfo->nbBits; + + assert(llBits <= MaxLLBits); + assert(mlBits <= MaxMLBits); + assert(ofBits <= MaxOff); + /* + * As gcc has better branch and block analyzers, sometimes it is only + * valuable to mark likeliness for clang, it gives around 3-4% of + * performance. + */ + + /* sequence */ + { size_t offset; + if (ofBits > 1) { + ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1); + ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5); + ZSTD_STATIC_ASSERT(STREAM_ACCUMULATOR_MIN_32 > LONG_OFFSETS_MAX_EXTRA_BITS_32); + ZSTD_STATIC_ASSERT(STREAM_ACCUMULATOR_MIN_32 - LONG_OFFSETS_MAX_EXTRA_BITS_32 >= MaxMLBits); + if (MEM_32bits() && longOffsets && (ofBits >= STREAM_ACCUMULATOR_MIN_32)) { + /* Always read extra bits, this keeps the logic simple, + * avoids branches, and avoids accidentally reading 0 bits. + */ + U32 const extraBits = LONG_OFFSETS_MAX_EXTRA_BITS_32; + offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits); + BIT_reloadDStream(&seqState->DStream); + offset += BIT_readBitsFast(&seqState->DStream, extraBits); + } else { + offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */ + if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); + } + seqState->prevOffset[2] = seqState->prevOffset[1]; + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset; + } else { + U32 const ll0 = (llDInfo->baseValue == 0); + if (LIKELY((ofBits == 0))) { + offset = seqState->prevOffset[ll0]; + seqState->prevOffset[1] = seqState->prevOffset[!ll0]; + seqState->prevOffset[0] = offset; + } else { + offset = ofBase + ll0 + BIT_readBitsFast(&seqState->DStream, 1); + { size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset]; + temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */ + if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1]; + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset = temp; + } } } + seq.offset = offset; + } + + if (mlBits > 0) + seq.matchLength += BIT_readBitsFast(&seqState->DStream, mlBits/*>0*/); + + if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32)) + BIT_reloadDStream(&seqState->DStream); + if (MEM_64bits() && UNLIKELY(totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog))) + BIT_reloadDStream(&seqState->DStream); + /* Ensure there are enough bits to read the rest of data in 64-bit mode. */ + ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64); + + if (llBits > 0) + seq.litLength += BIT_readBitsFast(&seqState->DStream, llBits/*>0*/); + + if (MEM_32bits()) + BIT_reloadDStream(&seqState->DStream); + + DEBUGLOG(6, "seq: litL=%u, matchL=%u, offset=%u", + (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset); + + ZSTD_updateFseStateWithDInfo(&seqState->stateLL, &seqState->DStream, llNext, llnbBits); /* <= 9 bits */ + ZSTD_updateFseStateWithDInfo(&seqState->stateML, &seqState->DStream, mlNext, mlnbBits); /* <= 9 bits */ + if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */ + ZSTD_updateFseStateWithDInfo(&seqState->stateOffb, &seqState->DStream, ofNext, ofnbBits); /* <= 8 bits */ + } + + return seq; +} + +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +MEM_STATIC int ZSTD_dictionaryIsActive(ZSTD_DCtx const* dctx, BYTE const* prefixStart, BYTE const* oLitEnd) +{ + size_t const windowSize = dctx->fParams.windowSize; + /* No dictionary used. */ + if (dctx->dictContentEndForFuzzing == NULL) return 0; + /* Dictionary is our prefix. */ + if (prefixStart == dctx->dictContentBeginForFuzzing) return 1; + /* Dictionary is not our ext-dict. */ + if (dctx->dictEnd != dctx->dictContentEndForFuzzing) return 0; + /* Dictionary is not within our window size. */ + if ((size_t)(oLitEnd - prefixStart) >= windowSize) return 0; + /* Dictionary is active. */ + return 1; +} + +MEM_STATIC void ZSTD_assertValidSequence( + ZSTD_DCtx const* dctx, + BYTE const* op, BYTE const* oend, + seq_t const seq, + BYTE const* prefixStart, BYTE const* virtualStart) +{ +#if DEBUGLEVEL >= 1 + size_t const windowSize = dctx->fParams.windowSize; + size_t const sequenceSize = seq.litLength + seq.matchLength; + BYTE const* const oLitEnd = op + seq.litLength; + DEBUGLOG(6, "Checking sequence: litL=%u matchL=%u offset=%u", + (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset); + assert(op <= oend); + assert((size_t)(oend - op) >= sequenceSize); + assert(sequenceSize <= ZSTD_BLOCKSIZE_MAX); + if (ZSTD_dictionaryIsActive(dctx, prefixStart, oLitEnd)) { + size_t const dictSize = (size_t)((char const*)dctx->dictContentEndForFuzzing - (char const*)dctx->dictContentBeginForFuzzing); + /* Offset must be within the dictionary. */ + assert(seq.offset <= (size_t)(oLitEnd - virtualStart)); + assert(seq.offset <= windowSize + dictSize); + } else { + /* Offset must be within our window. */ + assert(seq.offset <= windowSize); + } +#else + (void)dctx, (void)op, (void)oend, (void)seq, (void)prefixStart, (void)virtualStart; +#endif +} +#endif + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG + + +FORCE_INLINE_TEMPLATE size_t +DONT_VECTORIZE +ZSTD_decompressSequences_bodySplitLitBuffer( ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + const BYTE* ip = (const BYTE*)seqStart; + const BYTE* const iend = ip + seqSize; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = ostart + maxDstSize; + BYTE* op = ostart; + const BYTE* litPtr = dctx->litPtr; + const BYTE* litBufferEnd = dctx->litBufferEnd; + const BYTE* const prefixStart = (const BYTE*) (dctx->prefixStart); + const BYTE* const vBase = (const BYTE*) (dctx->virtualStart); + const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd); + DEBUGLOG(5, "ZSTD_decompressSequences_bodySplitLitBuffer"); + (void)frame; + + /* Regen sequences */ + if (nbSeq) { + seqState_t seqState; + dctx->fseEntropy = 1; + { U32 i; for (i=0; ientropy.rep[i]; } + RETURN_ERROR_IF( + ERR_isError(BIT_initDStream(&seqState.DStream, ip, iend-ip)), + corruption_detected, ""); + ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr); + ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr); + ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr); + assert(dst != NULL); + + ZSTD_STATIC_ASSERT( + BIT_DStream_unfinished < BIT_DStream_completed && + BIT_DStream_endOfBuffer < BIT_DStream_completed && + BIT_DStream_completed < BIT_DStream_overflow); + + /* decompress without overrunning litPtr begins */ + { + seq_t sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + /* Align the decompression loop to 32 + 16 bytes. + * + * zstd compiled with gcc-9 on an Intel i9-9900k shows 10% decompression + * speed swings based on the alignment of the decompression loop. This + * performance swing is caused by parts of the decompression loop falling + * out of the DSB. The entire decompression loop should fit in the DSB, + * when it can't we get much worse performance. You can measure if you've + * hit the good case or the bad case with this perf command for some + * compressed file test.zst: + * + * perf stat -e cycles -e instructions -e idq.all_dsb_cycles_any_uops \ + * -e idq.all_mite_cycles_any_uops -- ./zstd -tq test.zst + * + * If you see most cycles served out of the MITE you've hit the bad case. + * If you see most cycles served out of the DSB you've hit the good case. + * If it is pretty even then you may be in an okay case. + * + * This issue has been reproduced on the following CPUs: + * - Kabylake: Macbook Pro (15-inch, 2019) 2.4 GHz Intel Core i9 + * Use Instruments->Counters to get DSB/MITE cycles. + * I never got performance swings, but I was able to + * go from the good case of mostly DSB to half of the + * cycles served from MITE. + * - Coffeelake: Intel i9-9900k + * - Coffeelake: Intel i7-9700k + * + * I haven't been able to reproduce the instability or DSB misses on any + * of the following CPUS: + * - Haswell + * - Broadwell: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GH + * - Skylake + * + * Alignment is done for each of the three major decompression loops: + * - ZSTD_decompressSequences_bodySplitLitBuffer - presplit section of the literal buffer + * - ZSTD_decompressSequences_bodySplitLitBuffer - postsplit section of the literal buffer + * - ZSTD_decompressSequences_body + * Alignment choices are made to minimize large swings on bad cases and influence on performance + * from changes external to this code, rather than to overoptimize on the current commit. + * + * If you are seeing performance stability this script can help test. + * It tests on 4 commits in zstd where I saw performance change. + * + * https://gist.github.com/terrelln/9889fc06a423fd5ca6e99351564473f4 + */ +#if defined(__GNUC__) && defined(__x86_64__) + __asm__(".p2align 6"); +# if __GNUC__ >= 7 + /* good for gcc-7, gcc-9, and gcc-11 */ + __asm__("nop"); + __asm__(".p2align 5"); + __asm__("nop"); + __asm__(".p2align 4"); +# if __GNUC__ == 8 || __GNUC__ == 10 + /* good for gcc-8 and gcc-10 */ + __asm__("nop"); + __asm__(".p2align 3"); +# endif +# endif +#endif + + /* Handle the initial state where litBuffer is currently split between dst and litExtraBuffer */ + for (; litPtr + sequence.litLength <= dctx->litBufferEnd; ) { + size_t const oneSeqSize = ZSTD_execSequenceSplitLitBuffer(op, oend, litPtr + sequence.litLength - WILDCOPY_OVERLENGTH, sequence, &litPtr, litBufferEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (UNLIKELY(!--nbSeq)) + break; + BIT_reloadDStream(&(seqState.DStream)); + sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + } + + /* If there are more sequences, they will need to read literals from litExtraBuffer; copy over the remainder from dst and update litPtr and litEnd */ + if (nbSeq > 0) { + const size_t leftoverLit = dctx->litBufferEnd - litPtr; + if (leftoverLit) + { + RETURN_ERROR_IF(leftoverLit > (size_t)(oend - op), dstSize_tooSmall, "remaining lit must fit within dstBuffer"); + ZSTD_safecopyDstBeforeSrc(op, litPtr, leftoverLit); + sequence.litLength -= leftoverLit; + op += leftoverLit; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + { + size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litBufferEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (--nbSeq) + BIT_reloadDStream(&(seqState.DStream)); + } + } + } + + if (nbSeq > 0) /* there is remaining lit from extra buffer */ + { + +#if defined(__GNUC__) && defined(__x86_64__) + __asm__(".p2align 6"); + __asm__("nop"); +# if __GNUC__ != 7 + /* worse for gcc-7 better for gcc-8, gcc-9, and gcc-10 and clang */ + __asm__(".p2align 4"); + __asm__("nop"); + __asm__(".p2align 3"); +# elif __GNUC__ >= 11 + __asm__(".p2align 3"); +# else + __asm__(".p2align 5"); + __asm__("nop"); + __asm__(".p2align 3"); +# endif +#endif + + for (; ; ) { + seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litBufferEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (UNLIKELY(!--nbSeq)) + break; + BIT_reloadDStream(&(seqState.DStream)); + } + } + + /* check if reached exact end */ + DEBUGLOG(5, "ZSTD_decompressSequences_bodySplitLitBuffer: after decode loop, remaining nbSeq : %i", nbSeq); + RETURN_ERROR_IF(nbSeq, corruption_detected, ""); + RETURN_ERROR_IF(BIT_reloadDStream(&seqState.DStream) < BIT_DStream_completed, corruption_detected, ""); + /* save reps for next block */ + { U32 i; for (i=0; ientropy.rep[i] = (U32)(seqState.prevOffset[i]); } + } + + /* last literal segment */ + if (dctx->litBufferLocation == ZSTD_split) /* split hasn't been reached yet, first get dst then copy litExtraBuffer */ + { + size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend - op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memmove(op, litPtr, lastLLSize); + op += lastLLSize; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + } + { size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memcpy(op, litPtr, lastLLSize); + op += lastLLSize; + } + } + + return op-ostart; +} + +FORCE_INLINE_TEMPLATE size_t +DONT_VECTORIZE +ZSTD_decompressSequences_body(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + const BYTE* ip = (const BYTE*)seqStart; + const BYTE* const iend = ip + seqSize; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = dctx->litBufferLocation == ZSTD_not_in_dst ? ostart + maxDstSize : dctx->litBuffer; + BYTE* op = ostart; + const BYTE* litPtr = dctx->litPtr; + const BYTE* const litEnd = litPtr + dctx->litSize; + const BYTE* const prefixStart = (const BYTE*)(dctx->prefixStart); + const BYTE* const vBase = (const BYTE*)(dctx->virtualStart); + const BYTE* const dictEnd = (const BYTE*)(dctx->dictEnd); + DEBUGLOG(5, "ZSTD_decompressSequences_body: nbSeq = %d", nbSeq); + (void)frame; + + /* Regen sequences */ + if (nbSeq) { + seqState_t seqState; + dctx->fseEntropy = 1; + { U32 i; for (i = 0; i < ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; } + RETURN_ERROR_IF( + ERR_isError(BIT_initDStream(&seqState.DStream, ip, iend - ip)), + corruption_detected, ""); + ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr); + ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr); + ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr); + assert(dst != NULL); + + ZSTD_STATIC_ASSERT( + BIT_DStream_unfinished < BIT_DStream_completed && + BIT_DStream_endOfBuffer < BIT_DStream_completed && + BIT_DStream_completed < BIT_DStream_overflow); + +#if defined(__GNUC__) && defined(__x86_64__) + __asm__(".p2align 6"); + __asm__("nop"); +# if __GNUC__ >= 7 + __asm__(".p2align 5"); + __asm__("nop"); + __asm__(".p2align 3"); +# else + __asm__(".p2align 4"); + __asm__("nop"); + __asm__(".p2align 3"); +# endif +#endif + + for ( ; ; ) { + seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (UNLIKELY(!--nbSeq)) + break; + BIT_reloadDStream(&(seqState.DStream)); + } + + /* check if reached exact end */ + DEBUGLOG(5, "ZSTD_decompressSequences_body: after decode loop, remaining nbSeq : %i", nbSeq); + RETURN_ERROR_IF(nbSeq, corruption_detected, ""); + RETURN_ERROR_IF(BIT_reloadDStream(&seqState.DStream) < BIT_DStream_completed, corruption_detected, ""); + /* save reps for next block */ + { U32 i; for (i=0; ientropy.rep[i] = (U32)(seqState.prevOffset[i]); } + } + + /* last literal segment */ + { size_t const lastLLSize = litEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memcpy(op, litPtr, lastLLSize); + op += lastLLSize; + } + } + + return op-ostart; +} + +static size_t +ZSTD_decompressSequences_default(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} + +static size_t +ZSTD_decompressSequencesSplitLitBuffer_default(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequences_bodySplitLitBuffer(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */ + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT + +FORCE_INLINE_TEMPLATE size_t +ZSTD_prefetchMatch(size_t prefetchPos, seq_t const sequence, + const BYTE* const prefixStart, const BYTE* const dictEnd) +{ + prefetchPos += sequence.litLength; + { const BYTE* const matchBase = (sequence.offset > prefetchPos) ? dictEnd : prefixStart; + const BYTE* const match = matchBase + prefetchPos - sequence.offset; /* note : this operation can overflow when seq.offset is really too large, which can only happen when input is corrupted. + * No consequence though : memory address is only used for prefetching, not for dereferencing */ + PREFETCH_L1(match); PREFETCH_L1(match+CACHELINE_SIZE); /* note : it's safe to invoke PREFETCH() on any memory address, including invalid ones */ + } + return prefetchPos + sequence.matchLength; +} + +/* This decoding function employs prefetching + * to reduce latency impact of cache misses. + * It's generally employed when block contains a significant portion of long-distance matches + * or when coupled with a "cold" dictionary */ +FORCE_INLINE_TEMPLATE size_t +ZSTD_decompressSequencesLong_body( + ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + const BYTE* ip = (const BYTE*)seqStart; + const BYTE* const iend = ip + seqSize; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = dctx->litBufferLocation == ZSTD_in_dst ? dctx->litBuffer : ostart + maxDstSize; + BYTE* op = ostart; + const BYTE* litPtr = dctx->litPtr; + const BYTE* litBufferEnd = dctx->litBufferEnd; + const BYTE* const prefixStart = (const BYTE*) (dctx->prefixStart); + const BYTE* const dictStart = (const BYTE*) (dctx->virtualStart); + const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd); + (void)frame; + + /* Regen sequences */ + if (nbSeq) { +#define STORED_SEQS 8 +#define STORED_SEQS_MASK (STORED_SEQS-1) +#define ADVANCED_SEQS STORED_SEQS + seq_t sequences[STORED_SEQS]; + int const seqAdvance = MIN(nbSeq, ADVANCED_SEQS); + seqState_t seqState; + int seqNb; + size_t prefetchPos = (size_t)(op-prefixStart); /* track position relative to prefixStart */ + + dctx->fseEntropy = 1; + { int i; for (i=0; ientropy.rep[i]; } + assert(dst != NULL); + assert(iend >= ip); + RETURN_ERROR_IF( + ERR_isError(BIT_initDStream(&seqState.DStream, ip, iend-ip)), + corruption_detected, ""); + ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr); + ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr); + ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr); + + /* prepare in advance */ + for (seqNb=0; (BIT_reloadDStream(&seqState.DStream) <= BIT_DStream_completed) && (seqNblitBufferLocation == ZSTD_split && litPtr + sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK].litLength > dctx->litBufferEnd) + { + /* lit buffer is reaching split point, empty out the first buffer and transition to litExtraBuffer */ + const size_t leftoverLit = dctx->litBufferEnd - litPtr; + if (leftoverLit) + { + RETURN_ERROR_IF(leftoverLit > (size_t)(oend - op), dstSize_tooSmall, "remaining lit must fit within dstBuffer"); + ZSTD_safecopyDstBeforeSrc(op, litPtr, leftoverLit); + sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK].litLength -= leftoverLit; + op += leftoverLit; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + oneSeqSize = ZSTD_execSequence(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + + prefetchPos = ZSTD_prefetchMatch(prefetchPos, sequence, prefixStart, dictEnd); + sequences[seqNb & STORED_SEQS_MASK] = sequence; + op += oneSeqSize; + } + else + { + /* lit buffer is either wholly contained in first or second split, or not split at all*/ + oneSeqSize = dctx->litBufferLocation == ZSTD_split ? + ZSTD_execSequenceSplitLitBuffer(op, oend, litPtr + sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK].litLength - WILDCOPY_OVERLENGTH, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd) : + ZSTD_execSequence(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + + prefetchPos = ZSTD_prefetchMatch(prefetchPos, sequence, prefixStart, dictEnd); + sequences[seqNb & STORED_SEQS_MASK] = sequence; + op += oneSeqSize; + } + } + RETURN_ERROR_IF(seqNblitBufferLocation == ZSTD_split && litPtr + sequence->litLength > dctx->litBufferEnd) + { + const size_t leftoverLit = dctx->litBufferEnd - litPtr; + if (leftoverLit) + { + RETURN_ERROR_IF(leftoverLit > (size_t)(oend - op), dstSize_tooSmall, "remaining lit must fit within dstBuffer"); + ZSTD_safecopyDstBeforeSrc(op, litPtr, leftoverLit); + sequence->litLength -= leftoverLit; + op += leftoverLit; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + { + size_t const oneSeqSize = ZSTD_execSequence(op, oend, *sequence, &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[seqNb&STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + op += oneSeqSize; + } + } + else + { + size_t const oneSeqSize = dctx->litBufferLocation == ZSTD_split ? + ZSTD_execSequenceSplitLitBuffer(op, oend, litPtr + sequence->litLength - WILDCOPY_OVERLENGTH, *sequence, &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd) : + ZSTD_execSequence(op, oend, *sequence, &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[seqNb&STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + op += oneSeqSize; + } + } + + /* save reps for next block */ + { U32 i; for (i=0; ientropy.rep[i] = (U32)(seqState.prevOffset[i]); } + } + + /* last literal segment */ + if (dctx->litBufferLocation == ZSTD_split) /* first deplete literal buffer in dst, then copy litExtraBuffer */ + { + size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend - op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memmove(op, litPtr, lastLLSize); + op += lastLLSize; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + } + { size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memmove(op, litPtr, lastLLSize); + op += lastLLSize; + } + } + + return op-ostart; +} + +static size_t +ZSTD_decompressSequencesLong_default(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */ + + + +#if DYNAMIC_BMI2 + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG +static BMI2_TARGET_ATTRIBUTE size_t +DONT_VECTORIZE +ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +static BMI2_TARGET_ATTRIBUTE size_t +DONT_VECTORIZE +ZSTD_decompressSequencesSplitLitBuffer_bmi2(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequences_bodySplitLitBuffer(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */ + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT +static BMI2_TARGET_ATTRIBUTE size_t +ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */ + +#endif /* DYNAMIC_BMI2 */ + +typedef size_t (*ZSTD_decompressSequences_t)( + ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame); + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG +static size_t +ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + DEBUGLOG(5, "ZSTD_decompressSequences"); +#if DYNAMIC_BMI2 + if (ZSTD_DCtx_get_bmi2(dctx)) { + return ZSTD_decompressSequences_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); + } +#endif + return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +static size_t +ZSTD_decompressSequencesSplitLitBuffer(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + DEBUGLOG(5, "ZSTD_decompressSequencesSplitLitBuffer"); +#if DYNAMIC_BMI2 + if (ZSTD_DCtx_get_bmi2(dctx)) { + return ZSTD_decompressSequencesSplitLitBuffer_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); + } +#endif + return ZSTD_decompressSequencesSplitLitBuffer_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */ + + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT +/* ZSTD_decompressSequencesLong() : + * decompression function triggered when a minimum share of offsets is considered "long", + * aka out of cache. + * note : "long" definition seems overloaded here, sometimes meaning "wider than bitstream register", and sometimes meaning "farther than memory cache distance". + * This function will try to mitigate main memory latency through the use of prefetching */ +static size_t +ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + DEBUGLOG(5, "ZSTD_decompressSequencesLong"); +#if DYNAMIC_BMI2 + if (ZSTD_DCtx_get_bmi2(dctx)) { + return ZSTD_decompressSequencesLong_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); + } +#endif + return ZSTD_decompressSequencesLong_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */ + + +/** + * @returns The total size of the history referenceable by zstd, including + * both the prefix and the extDict. At @p op any offset larger than this + * is invalid. + */ +static size_t ZSTD_totalHistorySize(BYTE* op, BYTE const* virtualStart) +{ + return (size_t)(op - virtualStart); +} + +typedef struct { + unsigned longOffsetShare; + unsigned maxNbAdditionalBits; +} ZSTD_OffsetInfo; + +/* ZSTD_getOffsetInfo() : + * condition : offTable must be valid + * @return : "share" of long offsets (arbitrarily defined as > (1<<23)) + * compared to maximum possible of (1< 22) info.longOffsetShare += 1; + } + + assert(tableLog <= OffFSELog); + info.longOffsetShare <<= (OffFSELog - tableLog); /* scale to OffFSELog */ + } + + return info; +} + +/** + * @returns The maximum offset we can decode in one read of our bitstream, without + * reloading more bits in the middle of the offset bits read. Any offsets larger + * than this must use the long offset decoder. + */ +static size_t ZSTD_maxShortOffset(void) +{ + if (MEM_64bits()) { + /* We can decode any offset without reloading bits. + * This might change if the max window size grows. + */ + ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31); + return (size_t)-1; + } else { + /* The maximum offBase is (1 << (STREAM_ACCUMULATOR_MIN + 1)) - 1. + * This offBase would require STREAM_ACCUMULATOR_MIN extra bits. + * Then we have to subtract ZSTD_REP_NUM to get the maximum possible offset. + */ + size_t const maxOffbase = ((size_t)1 << (STREAM_ACCUMULATOR_MIN + 1)) - 1; + size_t const maxOffset = maxOffbase - ZSTD_REP_NUM; + assert(ZSTD_highbit32((U32)maxOffbase) == STREAM_ACCUMULATOR_MIN); + return maxOffset; + } +} + +size_t +ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, const int frame, const streaming_operation streaming) +{ /* blockType == blockCompressed */ + const BYTE* ip = (const BYTE*)src; + DEBUGLOG(5, "ZSTD_decompressBlock_internal (size : %u)", (U32)srcSize); + + /* Note : the wording of the specification + * allows compressed block to be sized exactly ZSTD_BLOCKSIZE_MAX. + * This generally does not happen, as it makes little sense, + * since an uncompressed block would feature same size and have no decompression cost. + * Also, note that decoder from reference libzstd before < v1.5.4 + * would consider this edge case as an error. + * As a consequence, avoid generating compressed blocks of size ZSTD_BLOCKSIZE_MAX + * for broader compatibility with the deployed ecosystem of zstd decoders */ + RETURN_ERROR_IF(srcSize > ZSTD_BLOCKSIZE_MAX, srcSize_wrong, ""); + + /* Decode literals section */ + { size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize, dst, dstCapacity, streaming); + DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : cSize=%u, nbLiterals=%zu", (U32)litCSize, dctx->litSize); + if (ZSTD_isError(litCSize)) return litCSize; + ip += litCSize; + srcSize -= litCSize; + } + + /* Build Decoding Tables */ + { + /* Compute the maximum block size, which must also work when !frame and fParams are unset. + * Additionally, take the min with dstCapacity to ensure that the totalHistorySize fits in a size_t. + */ + size_t const blockSizeMax = MIN(dstCapacity, (frame ? dctx->fParams.blockSizeMax : ZSTD_BLOCKSIZE_MAX)); + size_t const totalHistorySize = ZSTD_totalHistorySize((BYTE*)dst + blockSizeMax, (BYTE const*)dctx->virtualStart); + /* isLongOffset must be true if there are long offsets. + * Offsets are long if they are larger than ZSTD_maxShortOffset(). + * We don't expect that to be the case in 64-bit mode. + * + * We check here to see if our history is large enough to allow long offsets. + * If it isn't, then we can't possible have (valid) long offsets. If the offset + * is invalid, then it is okay to read it incorrectly. + * + * If isLongOffsets is true, then we will later check our decoding table to see + * if it is even possible to generate long offsets. + */ + ZSTD_longOffset_e isLongOffset = (ZSTD_longOffset_e)(MEM_32bits() && (totalHistorySize > ZSTD_maxShortOffset())); + /* These macros control at build-time which decompressor implementation + * we use. If neither is defined, we do some inspection and dispatch at + * runtime. + */ +#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ + !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) + int usePrefetchDecoder = dctx->ddictIsCold; +#else + /* Set to 1 to avoid computing offset info if we don't need to. + * Otherwise this value is ignored. + */ + int usePrefetchDecoder = 1; +#endif + int nbSeq; + size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, srcSize); + if (ZSTD_isError(seqHSize)) return seqHSize; + ip += seqHSize; + srcSize -= seqHSize; + + RETURN_ERROR_IF((dst == NULL || dstCapacity == 0) && nbSeq > 0, dstSize_tooSmall, "NULL not handled"); + RETURN_ERROR_IF(MEM_64bits() && sizeof(size_t) == sizeof(void*) && (size_t)(-1) - (size_t)dst < (size_t)(1 << 20), dstSize_tooSmall, + "invalid dst"); + + /* If we could potentially have long offsets, or we might want to use the prefetch decoder, + * compute information about the share of long offsets, and the maximum nbAdditionalBits. + * NOTE: could probably use a larger nbSeq limit + */ + if (isLongOffset || (!usePrefetchDecoder && (totalHistorySize > (1u << 24)) && (nbSeq > 8))) { + ZSTD_OffsetInfo const info = ZSTD_getOffsetInfo(dctx->OFTptr, nbSeq); + if (isLongOffset && info.maxNbAdditionalBits <= STREAM_ACCUMULATOR_MIN) { + /* If isLongOffset, but the maximum number of additional bits that we see in our table is small + * enough, then we know it is impossible to have too long an offset in this block, so we can + * use the regular offset decoder. + */ + isLongOffset = ZSTD_lo_isRegularOffset; + } + if (!usePrefetchDecoder) { + U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */ + usePrefetchDecoder = (info.longOffsetShare >= minShare); + } + } + + dctx->ddictIsCold = 0; + +#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ + !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) + if (usePrefetchDecoder) { +#else + (void)usePrefetchDecoder; + { +#endif +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT + return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); +#endif + } + +#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG + /* else */ + if (dctx->litBufferLocation == ZSTD_split) + return ZSTD_decompressSequencesSplitLitBuffer(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); + else + return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); +#endif + } +} + + +void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst, size_t dstSize) +{ + if (dst != dctx->previousDstEnd && dstSize > 0) { /* not contiguous */ + dctx->dictEnd = dctx->previousDstEnd; + dctx->virtualStart = (const char*)dst - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->prefixStart)); + dctx->prefixStart = dst; + dctx->previousDstEnd = dst; + } +} + + +size_t ZSTD_decompressBlock_deprecated(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize) +{ + size_t dSize; + ZSTD_checkContinuity(dctx, dst, dstCapacity); + dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0, not_streaming); + dctx->previousDstEnd = (char*)dst + dSize; + return dSize; +} + + +/* NOTE: Must just wrap ZSTD_decompressBlock_deprecated() */ +size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize) +{ + return ZSTD_decompressBlock_deprecated(dctx, dst, dstCapacity, src, srcSize); +} +/**** ended inlining decompress/zstd_decompress_block.c ****/ diff --git a/ktx/external/cxxopts/CMakeLists.txt b/ktx/external/cxxopts/CMakeLists.txt new file mode 100644 index 0000000..4c1a686 --- /dev/null +++ b/ktx/external/cxxopts/CMakeLists.txt @@ -0,0 +1,82 @@ +# Copyright (c) 2014 Jarryd Beck +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +cmake_minimum_required(VERSION 3.1...3.19) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") +include(cxxopts) +set("PROJECT_DESCRIPTION" "A header-only lightweight C++ command line option parser") +set("PROJECT_HOMEPAGE_URL" "https://github.com/jarro2783/cxxopts") + +# Get the version of the library +cxxopts_getversion(VERSION) + +project(cxxopts + VERSION "${VERSION}" + LANGUAGES CXX +) + +# Must include after the project call due to GNUInstallDirs requiring a language be enabled (IE. CXX) +include(GNUInstallDirs) + +# Determine whether this is a standalone project or included by other projects +set(CXXOPTS_STANDALONE_PROJECT OFF) +if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) + set(CXXOPTS_STANDALONE_PROJECT ON) +endif() + +# Establish the project options +option(CXXOPTS_BUILD_EXAMPLES "Set to ON to build examples" ${CXXOPTS_STANDALONE_PROJECT}) +option(CXXOPTS_BUILD_TESTS "Set to ON to build tests" ${CXXOPTS_STANDALONE_PROJECT}) +option(CXXOPTS_ENABLE_INSTALL "Generate the install target" ${CXXOPTS_STANDALONE_PROJECT}) +option(CXXOPTS_ENABLE_WARNINGS "Add warnings to CMAKE_CXX_FLAGS" ${CXXOPTS_STANDALONE_PROJECT}) +option(CXXOPTS_USE_UNICODE_HELP "Use ICU Unicode library" OFF) + +if (CXXOPTS_STANDALONE_PROJECT) + cxxopts_set_cxx_standard() +endif() + +if (CXXOPTS_ENABLE_WARNINGS) + cxxopts_enable_warnings() +endif() + +add_library(cxxopts INTERFACE) +add_library(cxxopts::cxxopts ALIAS cxxopts) +add_subdirectory(include) + +# Link against the ICU library when requested +if(CXXOPTS_USE_UNICODE_HELP) + cxxopts_use_unicode() +endif() + +# Install cxxopts when requested by the user +if (CXXOPTS_ENABLE_INSTALL) + cxxopts_install_logic() +endif() + +# Build examples when requested by the user +if (CXXOPTS_BUILD_EXAMPLES) + add_subdirectory(src) +endif() + +# Enable testing when requested by the user +if (CXXOPTS_BUILD_TESTS) + enable_testing() + add_subdirectory(test) +endif() diff --git a/ktx/external/cxxopts/cmake/cxxopts.cmake b/ktx/external/cxxopts/cmake/cxxopts.cmake new file mode 100644 index 0000000..0ead543 --- /dev/null +++ b/ktx/external/cxxopts/cmake/cxxopts.cmake @@ -0,0 +1,163 @@ +# Copyright (c) 2014 Jarryd Beck +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +if (CMAKE_VERSION VERSION_GREATER 3.10 OR CMAKE_VERSION VERSION_EQUAL 3.10) + # Use include_guard() added in cmake 3.10 + include_guard() +endif() + +include(CMakePackageConfigHelpers) + +function(cxxopts_getversion version_arg) + # Parse the current version from the cxxopts header + file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/include/cxxopts.hpp" cxxopts_version_defines + REGEX "#define CXXOPTS__VERSION_(MAJOR|MINOR|PATCH)") + foreach(ver ${cxxopts_version_defines}) + if(ver MATCHES "#define CXXOPTS__VERSION_(MAJOR|MINOR|PATCH) +([^ ]+)$") + set(CXXOPTS__VERSION_${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" CACHE INTERNAL "") + endif() + endforeach() + set(VERSION ${CXXOPTS__VERSION_MAJOR}.${CXXOPTS__VERSION_MINOR}.${CXXOPTS__VERSION_PATCH}) + + # Give feedback to the user. Prefer DEBUG when available since large projects tend to have a lot + # going on already + if (CMAKE_VERSION VERSION_GREATER 3.15 OR CMAKE_VERSION VERSION_EQUAL 3.15) + message(DEBUG "cxxopts version ${VERSION}") + else() + message(STATUS "cxxopts version ${VERSION}") + endif() + + # Return the information to the caller + set(${version_arg} ${VERSION} PARENT_SCOPE) +endfunction() + +# Optionally, enable unicode support using the ICU library +function(cxxopts_use_unicode) + find_package(PkgConfig) + pkg_check_modules(ICU REQUIRED icu-uc) + + target_link_libraries(cxxopts INTERFACE ${ICU_LDFLAGS}) + target_compile_options(cxxopts INTERFACE ${ICU_CFLAGS}) + target_compile_definitions(cxxopts INTERFACE CXXOPTS_USE_UNICODE) +endfunction() + +# Request C++11 without gnu extension for the whole project and enable more warnings +macro(cxxopts_set_cxx_standard) + if (CXXOPTS_CXX_STANDARD) + set(CMAKE_CXX_STANDARD ${CXXOPTS_CXX_STANDARD}) + else() + set(CMAKE_CXX_STANDARD 11) + endif() + + set(CMAKE_CXX_EXTENSIONS OFF) +endmacro() + +# Helper function to enable warnings +function(cxxopts_enable_warnings) + if(MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W2") + elseif(CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") + if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") + if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER_EQUAL 5.0) + set(COMPILER_SPECIFIC_FLAGS "-Wsuggest-override") + endif() + endif() + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wextra -Wshadow -Weffc++ -Wsign-compare -Wshadow -Wwrite-strings -Wpointer-arith -Winit-self -Wconversion -Wno-sign-conversion ${COMPILER_SPECIFIC_FLAGS}") + endif() + + set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} PARENT_SCOPE) +endfunction() + +# Helper function to ecapsulate install logic +function(cxxopts_install_logic) + if(CMAKE_LIBRARY_ARCHITECTURE) + string(REPLACE "/${CMAKE_LIBRARY_ARCHITECTURE}" "" CMAKE_INSTALL_LIBDIR_ARCHIND "${CMAKE_INSTALL_LIBDIR}") + else() + # On some systems (e.g. NixOS), `CMAKE_LIBRARY_ARCHITECTURE` can be empty + set(CMAKE_INSTALL_LIBDIR_ARCHIND "${CMAKE_INSTALL_LIBDIR}") + endif() + set(CXXOPTS_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR_ARCHIND}/cmake/cxxopts" CACHE STRING "Installation directory for cmake files, relative to ${CMAKE_INSTALL_PREFIX}.") + set(version_config "${PROJECT_BINARY_DIR}/cxxopts-config-version.cmake") + set(project_config "${PROJECT_BINARY_DIR}/cxxopts-config.cmake") + set(targets_export_name cxxopts-targets) + set(PackagingTemplatesDir "${PROJECT_SOURCE_DIR}/packaging") + + + if(${CMAKE_VERSION} VERSION_GREATER "3.14") + set(OPTIONAL_ARCH_INDEPENDENT "ARCH_INDEPENDENT") + endif() + + # Generate the version, config and target files into the build directory. + write_basic_package_version_file( + ${version_config} + VERSION ${VERSION} + COMPATIBILITY AnyNewerVersion + ${OPTIONAL_ARCH_INDEPENDENT} + ) + configure_package_config_file( + ${PackagingTemplatesDir}/cxxopts-config.cmake.in + ${project_config} + INSTALL_DESTINATION ${CXXOPTS_CMAKE_DIR}) + export(TARGETS cxxopts NAMESPACE cxxopts:: + FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake) + + # Install version, config and target files. + install( + FILES ${project_config} ${version_config} + DESTINATION ${CXXOPTS_CMAKE_DIR}) + install(EXPORT ${targets_export_name} DESTINATION ${CXXOPTS_CMAKE_DIR} + NAMESPACE cxxopts::) + + # Install the header file and export the target + install(TARGETS cxxopts EXPORT ${targets_export_name} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(FILES ${PROJECT_SOURCE_DIR}/include/cxxopts.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + + + set(CPACK_PACKAGE_NAME "${PROJECT_NAME}") + set(CPACK_PACKAGE_VENDOR "cxxopt developers") + set(CPACK_PACKAGE_DESCRIPTION "${PROJECT_DESCRIPTION}") + set(CPACK_DEBIAN_PACKAGE_NAME "${CPACK_PACKAGE_NAME}") + set(CPACK_RPM_PACKAGE_NAME "${CPACK_PACKAGE_NAME}") + set(CPACK_PACKAGE_HOMEPAGE_URL "${PROJECT_HOMEPAGE_URL}") + set(CPACK_PACKAGE_MAINTAINER "${CPACK_PACKAGE_VENDOR}") + set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${CPACK_PACKAGE_MAINTAINER}") + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") + set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md") + + set(CPACK_DEBIAN_PACKAGE_NAME "lib${PROJECT_NAME}-dev") + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6-dev") + set(CPACK_DEBIAN_PACKAGE_SUGGESTS "cmake, pkg-config, pkg-conf") + + set(CPACK_RPM_PACKAGE_NAME "lib${PROJECT_NAME}-devel") + set(CPACK_RPM_PACKAGE_SUGGESTS "${CPACK_DEBIAN_PACKAGE_SUGGESTS}") + + set(CPACK_DEB_COMPONENT_INSTALL ON) + set(CPACK_RPM_COMPONENT_INSTALL ON) + set(CPACK_NSIS_COMPONENT_INSTALL ON) + set(CPACK_DEBIAN_COMPRESSION_TYPE "xz") + + set(PKG_CONFIG_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc") + configure_file("${PackagingTemplatesDir}/pkgconfig.pc.in" "${PKG_CONFIG_FILE_NAME}" @ONLY) + install(FILES "${PKG_CONFIG_FILE_NAME}" + DESTINATION "${CMAKE_INSTALL_LIBDIR_ARCHIND}/pkgconfig" + ) + + include(CPack) +endfunction() diff --git a/ktx/external/cxxopts/include/CMakeLists.txt b/ktx/external/cxxopts/include/CMakeLists.txt new file mode 100644 index 0000000..1123c5a --- /dev/null +++ b/ktx/external/cxxopts/include/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (c) 2014 Jarryd Beck +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +target_include_directories(cxxopts INTERFACE + $ + $ +) diff --git a/ktx/external/cxxopts/include/cxxopts.hpp b/ktx/external/cxxopts/include/cxxopts.hpp new file mode 100644 index 0000000..a397600 --- /dev/null +++ b/ktx/external/cxxopts/include/cxxopts.hpp @@ -0,0 +1,2837 @@ +/* + +Copyright (c) 2014-2022 Jarryd Beck + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// vim: ts=2:sw=2:expandtab + +#ifndef CXXOPTS_HPP_INCLUDED +#define CXXOPTS_HPP_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CXXOPTS_NO_EXCEPTIONS +#include +#endif + +#if defined(__GNUC__) && !defined(__clang__) +# if (__GNUC__ * 10 + __GNUC_MINOR__) < 49 +# define CXXOPTS_NO_REGEX true +# endif +#endif +#if defined(_MSC_VER) && !defined(__clang__) +#define CXXOPTS_LINKONCE_CONST __declspec(selectany) extern +#define CXXOPTS_LINKONCE __declspec(selectany) extern +#else +#define CXXOPTS_LINKONCE_CONST +#define CXXOPTS_LINKONCE +#endif + +#ifndef CXXOPTS_NO_REGEX +# include +#endif // CXXOPTS_NO_REGEX + +// Nonstandard before C++17, which is coincidentally what we also need for +#ifdef __has_include +# if __has_include() +# include +# ifdef __cpp_lib_optional +# define CXXOPTS_HAS_OPTIONAL +# endif +# endif +#endif + +#if __cplusplus >= 201603L +#define CXXOPTS_NODISCARD [[nodiscard]] +#else +#define CXXOPTS_NODISCARD +#endif + +#ifndef CXXOPTS_VECTOR_DELIMITER +#define CXXOPTS_VECTOR_DELIMITER ',' +#endif + +#define CXXOPTS__VERSION_MAJOR 3 +#define CXXOPTS__VERSION_MINOR 1 +#define CXXOPTS__VERSION_PATCH 1 + +#if (__GNUC__ < 10 || (__GNUC__ == 10 && __GNUC_MINOR__ < 1)) && __GNUC__ >= 6 + #define CXXOPTS_NULL_DEREF_IGNORE +#endif + +#if defined(__GNUC__) +#define DO_PRAGMA(x) _Pragma(#x) +#define CXXOPTS_DIAGNOSTIC_PUSH DO_PRAGMA(GCC diagnostic push) +#define CXXOPTS_DIAGNOSTIC_POP DO_PRAGMA(GCC diagnostic pop) +#define CXXOPTS_IGNORE_WARNING(x) DO_PRAGMA(GCC diagnostic ignored x) +#else +// define other compilers here if needed +#define CXXOPTS_DIAGNOSTIC_PUSH +#define CXXOPTS_DIAGNOSTIC_POP +#define CXXOPTS_IGNORE_WARNING(x) +#endif + +#ifdef CXXOPTS_NO_RTTI +#define CXXOPTS_RTTI_CAST static_cast +#else +#define CXXOPTS_RTTI_CAST dynamic_cast +#endif + +namespace cxxopts { +static constexpr struct { + uint8_t major, minor, patch; +} version = { + CXXOPTS__VERSION_MAJOR, + CXXOPTS__VERSION_MINOR, + CXXOPTS__VERSION_PATCH +}; +} // namespace cxxopts + +//when we ask cxxopts to use Unicode, help strings are processed using ICU, +//which results in the correct lengths being computed for strings when they +//are formatted for the help output +//it is necessary to make sure that can be found by the +//compiler, and that icu-uc is linked in to the binary. + +#ifdef CXXOPTS_USE_UNICODE +#include + +namespace cxxopts { + +using String = icu::UnicodeString; + +inline +String +toLocalString(std::string s) +{ + return icu::UnicodeString::fromUTF8(std::move(s)); +} + +// GNU GCC with -Weffc++ will issue a warning regarding the upcoming class, we want to silence it: +// warning: base class 'class std::enable_shared_from_this' has accessible non-virtual destructor +CXXOPTS_DIAGNOSTIC_PUSH +CXXOPTS_IGNORE_WARNING("-Wnon-virtual-dtor") +// This will be ignored under other compilers like LLVM clang. +class UnicodeStringIterator +{ + public: + + using iterator_category = std::forward_iterator_tag; + using value_type = int32_t; + using difference_type = std::ptrdiff_t; + using pointer = value_type*; + using reference = value_type&; + + UnicodeStringIterator(const icu::UnicodeString* string, int32_t pos) + : s(string) + , i(pos) + { + } + + value_type + operator*() const + { + return s->char32At(i); + } + + bool + operator==(const UnicodeStringIterator& rhs) const + { + return s == rhs.s && i == rhs.i; + } + + bool + operator!=(const UnicodeStringIterator& rhs) const + { + return !(*this == rhs); + } + + UnicodeStringIterator& + operator++() + { + ++i; + return *this; + } + + UnicodeStringIterator + operator+(int32_t v) + { + return UnicodeStringIterator(s, i + v); + } + + private: + const icu::UnicodeString* s; + int32_t i; +}; +CXXOPTS_DIAGNOSTIC_POP + +inline +String& +stringAppend(String&s, String a) +{ + return s.append(std::move(a)); +} + +inline +String& +stringAppend(String& s, std::size_t n, UChar32 c) +{ + for (std::size_t i = 0; i != n; ++i) + { + s.append(c); + } + + return s; +} + +template +String& +stringAppend(String& s, Iterator begin, Iterator end) +{ + while (begin != end) + { + s.append(*begin); + ++begin; + } + + return s; +} + +inline +std::size_t +stringLength(const String& s) +{ + return s.length(); +} + +inline +std::string +toUTF8String(const String& s) +{ + std::string result; + s.toUTF8String(result); + + return result; +} + +inline +bool +empty(const String& s) +{ + return s.isEmpty(); +} + +} // namespace cxxopts + +namespace std { + +inline +cxxopts::UnicodeStringIterator +begin(const icu::UnicodeString& s) +{ + return cxxopts::UnicodeStringIterator(&s, 0); +} + +inline +cxxopts::UnicodeStringIterator +end(const icu::UnicodeString& s) +{ + return cxxopts::UnicodeStringIterator(&s, s.length()); +} + +} // namespace std + +//ifdef CXXOPTS_USE_UNICODE +#else + +namespace cxxopts { + +using String = std::string; + +template +T +toLocalString(T&& t) +{ + return std::forward(t); +} + +inline +std::size_t +stringLength(const String& s) +{ + return s.length(); +} + +inline +String& +stringAppend(String&s, const String& a) +{ + return s.append(a); +} + +inline +String& +stringAppend(String& s, std::size_t n, char c) +{ + return s.append(n, c); +} + +template +String& +stringAppend(String& s, Iterator begin, Iterator end) +{ + return s.append(begin, end); +} + +template +std::string +toUTF8String(T&& t) +{ + return std::forward(t); +} + +inline +bool +empty(const std::string& s) +{ + return s.empty(); +} + +} // namespace cxxopts + +//ifdef CXXOPTS_USE_UNICODE +#endif + +namespace cxxopts { + +namespace { +// Altered source code for KTX Tools: +// For deterministic and portable behaviour the code is changed to always use ' as quote marks +// +// --- Start of original source code: +// #ifdef _WIN32 +// CXXOPTS_LINKONCE_CONST std::string LQUOTE("\'"); +// CXXOPTS_LINKONCE_CONST std::string RQUOTE("\'"); +// #else +// CXXOPTS_LINKONCE_CONST std::string LQUOTE("‘"); +// CXXOPTS_LINKONCE_CONST std::string RQUOTE("’"); +// #endif +// --- End of original source code +// --- Start of altered source code +CXXOPTS_LINKONCE_CONST std::string LQUOTE("\'"); +CXXOPTS_LINKONCE_CONST std::string RQUOTE("\'"); +// --- End of altered source code +} // namespace + +// GNU GCC with -Weffc++ will issue a warning regarding the upcoming class, we +// want to silence it: warning: base class 'class +// std::enable_shared_from_this' has accessible non-virtual +// destructor This will be ignored under other compilers like LLVM clang. +CXXOPTS_DIAGNOSTIC_PUSH +CXXOPTS_IGNORE_WARNING("-Wnon-virtual-dtor") + +// some older versions of GCC warn under this warning +CXXOPTS_IGNORE_WARNING("-Weffc++") +class Value : public std::enable_shared_from_this +{ + public: + + virtual ~Value() = default; + + virtual + std::shared_ptr + clone() const = 0; + + virtual void + parse(const std::string& text) const = 0; + + virtual void + parse() const = 0; + + virtual bool + has_default() const = 0; + + virtual bool + is_container() const = 0; + + virtual bool + has_implicit() const = 0; + + virtual std::string + get_default_value() const = 0; + + virtual std::string + get_implicit_value() const = 0; + + virtual std::shared_ptr + default_value(const std::string& value) = 0; + + virtual std::shared_ptr + implicit_value(const std::string& value) = 0; + + virtual std::shared_ptr + no_implicit_value() = 0; + + virtual bool + is_boolean() const = 0; +}; + +CXXOPTS_DIAGNOSTIC_POP + +namespace exceptions { + +class exception : public std::exception +{ + public: + explicit exception(std::string message) + : m_message(std::move(message)) + { + } + + CXXOPTS_NODISCARD + const char* + what() const noexcept override + { + return m_message.c_str(); + } + + private: + std::string m_message; +}; + +class specification : public exception +{ + public: + + explicit specification(const std::string& message) + : exception(message) + { + } +}; + +class parsing : public exception +{ + public: + explicit parsing(const std::string& message) + : exception(message) + { + } +}; + +class option_already_exists : public specification +{ + public: + explicit option_already_exists(const std::string& option) + : specification("Option " + LQUOTE + option + RQUOTE + " already exists") + { + } +}; + +class invalid_option_format : public specification +{ + public: + explicit invalid_option_format(const std::string& format) + : specification("Invalid option format " + LQUOTE + format + RQUOTE) + { + } +}; + +class invalid_option_syntax : public parsing { + public: + explicit invalid_option_syntax(const std::string& text) + : parsing("Argument " + LQUOTE + text + RQUOTE + + " starts with a - but has incorrect syntax") + { + } +}; + +class no_such_option : public parsing +{ + public: + explicit no_such_option(const std::string& option) + : parsing("Option " + LQUOTE + option + RQUOTE + " does not exist") + { + } +}; + +class missing_argument : public parsing +{ + public: + explicit missing_argument(const std::string& option) + : parsing( + "Option " + LQUOTE + option + RQUOTE + " is missing an argument" + ) + { + } +}; + +class option_requires_argument : public parsing +{ + public: + explicit option_requires_argument(const std::string& option) + : parsing( + "Option " + LQUOTE + option + RQUOTE + " requires an argument" + ) + { + } +}; + +class gratuitous_argument_for_option : public parsing +{ + public: + gratuitous_argument_for_option + ( + const std::string& option, + const std::string& arg + ) + : parsing( + "Option " + LQUOTE + option + RQUOTE + + " does not take an argument, but argument " + + LQUOTE + arg + RQUOTE + " given" + ) + { + } +}; + +class requested_option_not_present : public parsing +{ + public: + explicit requested_option_not_present(const std::string& option) + : parsing("Option " + LQUOTE + option + RQUOTE + " not present") + { + } +}; + +class option_has_no_value : public exception +{ + public: + explicit option_has_no_value(const std::string& option) + : exception( + !option.empty() ? + ("Option " + LQUOTE + option + RQUOTE + " has no value") : + "Option has no value") + { + } +}; + +class incorrect_argument_type : public parsing +{ + public: + explicit incorrect_argument_type + ( + const std::string& arg + ) + : parsing( + "Argument " + LQUOTE + arg + RQUOTE + " failed to parse" + ) + { + } +}; + +} // namespace exceptions + + +template +void throw_or_mimic(const std::string& text) +{ + static_assert(std::is_base_of::value, + "throw_or_mimic only works on std::exception and " + "deriving classes"); + +#ifndef CXXOPTS_NO_EXCEPTIONS + // If CXXOPTS_NO_EXCEPTIONS is not defined, just throw + throw T{text}; +#else + // Otherwise manually instantiate the exception, print what() to stderr, + // and exit + T exception{text}; + std::cerr << exception.what() << std::endl; + std::exit(EXIT_FAILURE); +#endif +} + +using OptionNames = std::vector; + +namespace values { + +namespace parser_tool { + +struct IntegerDesc +{ + std::string negative = ""; + std::string base = ""; + std::string value = ""; +}; +struct ArguDesc { + std::string arg_name = ""; + bool grouping = false; + bool set_value = false; + std::string value = ""; +}; + +#ifdef CXXOPTS_NO_REGEX +inline IntegerDesc SplitInteger(const std::string &text) +{ + if (text.empty()) + { + throw_or_mimic(text); + } + IntegerDesc desc; + const char *pdata = text.c_str(); + if (*pdata == '-') + { + pdata += 1; + desc.negative = "-"; + } + if (strncmp(pdata, "0x", 2) == 0) + { + pdata += 2; + desc.base = "0x"; + } + if (*pdata != '\0') + { + desc.value = std::string(pdata); + } + else + { + throw_or_mimic(text); + } + return desc; +} + +inline bool IsTrueText(const std::string &text) +{ + const char *pdata = text.c_str(); + if (*pdata == 't' || *pdata == 'T') + { + pdata += 1; + if (strncmp(pdata, "rue\0", 4) == 0) + { + return true; + } + } + else if (strncmp(pdata, "1\0", 2) == 0) + { + return true; + } + return false; +} + +inline bool IsFalseText(const std::string &text) +{ + const char *pdata = text.c_str(); + if (*pdata == 'f' || *pdata == 'F') + { + pdata += 1; + if (strncmp(pdata, "alse\0", 5) == 0) + { + return true; + } + } + else if (strncmp(pdata, "0\0", 2) == 0) + { + return true; + } + return false; +} + +inline OptionNames split_option_names(const std::string &text) +{ + OptionNames split_names; + + std::string::size_type token_start_pos = 0; + auto length = text.length(); + + if (length == 0) + { + throw_or_mimic(text); + } + + while (token_start_pos < length) { + const auto &npos = std::string::npos; + auto next_non_space_pos = text.find_first_not_of(' ', token_start_pos); + if (next_non_space_pos == npos) { + throw_or_mimic(text); + } + token_start_pos = next_non_space_pos; + auto next_delimiter_pos = text.find(',', token_start_pos); + if (next_delimiter_pos == token_start_pos) { + throw_or_mimic(text); + } + if (next_delimiter_pos == npos) { + next_delimiter_pos = length; + } + auto token_length = next_delimiter_pos - token_start_pos; + // validate the token itself matches the regex /([:alnum:][-_[:alnum:]]*/ + { + const char* option_name_valid_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "_-.?"; + + if (!std::isalnum(text[token_start_pos], std::locale::classic()) || + text.find_first_not_of(option_name_valid_chars, token_start_pos) < next_delimiter_pos) { + throw_or_mimic(text); + } + } + split_names.emplace_back(text.substr(token_start_pos, token_length)); + token_start_pos = next_delimiter_pos + 1; + } + return split_names; +} + +inline ArguDesc ParseArgument(const char *arg, bool &matched) +{ + ArguDesc argu_desc; + const char *pdata = arg; + matched = false; + if (strncmp(pdata, "--", 2) == 0) + { + pdata += 2; + if (isalnum(*pdata, std::locale::classic())) + { + argu_desc.arg_name.push_back(*pdata); + pdata += 1; + while (isalnum(*pdata, std::locale::classic()) || *pdata == '-' || *pdata == '_') + { + argu_desc.arg_name.push_back(*pdata); + pdata += 1; + } + if (argu_desc.arg_name.length() > 1) + { + if (*pdata == '=') + { + argu_desc.set_value = true; + pdata += 1; + if (*pdata != '\0') + { + argu_desc.value = std::string(pdata); + } + matched = true; + } + else if (*pdata == '\0') + { + matched = true; + } + } + } + } + else if (strncmp(pdata, "-", 1) == 0) + { + pdata += 1; + argu_desc.grouping = true; + while (isalnum(*pdata, std::locale::classic())) + { + argu_desc.arg_name.push_back(*pdata); + pdata += 1; + } + matched = !argu_desc.arg_name.empty() && *pdata == '\0'; + } + return argu_desc; +} + +#else // CXXOPTS_NO_REGEX + +namespace { +CXXOPTS_LINKONCE +std::basic_regex integer_pattern + ("(-)?(0x)?([0-9a-zA-Z]+)|((0x)?0)"); +CXXOPTS_LINKONCE +std::basic_regex truthy_pattern + ("(t|T)(rue)?|1"); +CXXOPTS_LINKONCE +std::basic_regex falsy_pattern + ("(f|F)(alse)?|0"); +CXXOPTS_LINKONCE +std::basic_regex option_matcher + ("--([[:alnum:]][-_[:alnum:]\\.]+)(=(.*))?|-([[:alnum:]].*)"); +CXXOPTS_LINKONCE +std::basic_regex option_specifier + ("([[:alnum:]][-_[:alnum:]\\.]*)(,[ ]*[[:alnum:]][-_[:alnum:]]*)*"); +CXXOPTS_LINKONCE +std::basic_regex option_specifier_separator(", *"); + +} // namespace + +inline IntegerDesc SplitInteger(const std::string &text) +{ + std::smatch match; + std::regex_match(text, match, integer_pattern); + + if (match.length() == 0) + { + throw_or_mimic(text); + } + + IntegerDesc desc; + desc.negative = match[1]; + desc.base = match[2]; + desc.value = match[3]; + + if (match.length(4) > 0) + { + desc.base = match[5]; + desc.value = "0"; + return desc; + } + + return desc; +} + +inline bool IsTrueText(const std::string &text) +{ + std::smatch result; + std::regex_match(text, result, truthy_pattern); + return !result.empty(); +} + +inline bool IsFalseText(const std::string &text) +{ + std::smatch result; + std::regex_match(text, result, falsy_pattern); + return !result.empty(); +} + +// Gets the option names specified via a single, comma-separated string, +// and returns the separate, space-discarded, non-empty names +// (without considering which or how many are single-character) +inline OptionNames split_option_names(const std::string &text) +{ + if (!std::regex_match(text.c_str(), option_specifier)) + { + throw_or_mimic(text); + } + + OptionNames split_names; + + constexpr int use_non_matches { -1 }; + auto token_iterator = std::sregex_token_iterator( + text.begin(), text.end(), option_specifier_separator, use_non_matches); + std::copy(token_iterator, std::sregex_token_iterator(), std::back_inserter(split_names)); + return split_names; +} + +inline ArguDesc ParseArgument(const char *arg, bool &matched) +{ + std::match_results result; + std::regex_match(arg, result, option_matcher); + matched = !result.empty(); + + ArguDesc argu_desc; + if (matched) { + argu_desc.arg_name = result[1].str(); + argu_desc.set_value = result[2].length() > 0; + argu_desc.value = result[3].str(); + if (result[4].length() > 0) + { + argu_desc.grouping = true; + argu_desc.arg_name = result[4].str(); + } + } + + return argu_desc; +} + +#endif // CXXOPTS_NO_REGEX +#undef CXXOPTS_NO_REGEX +} // namespace parser_tool + +namespace detail { + +template +struct SignedCheck; + +template +struct SignedCheck +{ + template + void + operator()(bool negative, U u, const std::string& text) + { + if (negative) + { + if (u > static_cast((std::numeric_limits::min)())) + { + throw_or_mimic(text); + } + } + else + { + if (u > static_cast((std::numeric_limits::max)())) + { + throw_or_mimic(text); + } + } + } +}; + +template +struct SignedCheck +{ + template + void + operator()(bool, U, const std::string&) const {} +}; + +template +void +check_signed_range(bool negative, U value, const std::string& text) +{ + SignedCheck::is_signed>()(negative, value, text); +} + +} // namespace detail + +template +void +checked_negate(R& r, T&& t, const std::string&, std::true_type) +{ + // if we got to here, then `t` is a positive number that fits into + // `R`. So to avoid MSVC C4146, we first cast it to `R`. + // See https://github.com/jarro2783/cxxopts/issues/62 for more details. + r = static_cast(-static_cast(t-1)-1); +} + +template +void +checked_negate(R&, T&&, const std::string& text, std::false_type) +{ + throw_or_mimic(text); +} + +template +void +integer_parser(const std::string& text, T& value) +{ + parser_tool::IntegerDesc int_desc = parser_tool::SplitInteger(text); + + using US = typename std::make_unsigned::type; + constexpr bool is_signed = std::numeric_limits::is_signed; + + const bool negative = int_desc.negative.length() > 0; + const uint8_t base = int_desc.base.length() > 0 ? 16 : 10; + const std::string & value_match = int_desc.value; + + US result = 0; + + for (char ch : value_match) + { + US digit = 0; + + if (ch >= '0' && ch <= '9') + { + digit = static_cast(ch - '0'); + } + else if (base == 16 && ch >= 'a' && ch <= 'f') + { + digit = static_cast(ch - 'a' + 10); + } + else if (base == 16 && ch >= 'A' && ch <= 'F') + { + digit = static_cast(ch - 'A' + 10); + } + else + { + throw_or_mimic(text); + } + + const US next = static_cast(result * base + digit); + if (result > next) + { + throw_or_mimic(text); + } + + result = next; + } + + detail::check_signed_range(negative, result, text); + + if (negative) + { + checked_negate(value, result, text, std::integral_constant()); + } + else + { + value = static_cast(result); + } +} + +template +void stringstream_parser(const std::string& text, T& value) +{ + std::stringstream in(text); + in >> value; + if (!in) { + throw_or_mimic(text); + } +} + +template ::value>::type* = nullptr + > +void parse_value(const std::string& text, T& value) +{ + integer_parser(text, value); +} + +inline +void +parse_value(const std::string& text, bool& value) +{ + if (parser_tool::IsTrueText(text)) + { + value = true; + return; + } + + if (parser_tool::IsFalseText(text)) + { + value = false; + return; + } + + throw_or_mimic(text); +} + +inline +void +parse_value(const std::string& text, std::string& value) +{ + value = text; +} + +// The fallback parser. It uses the stringstream parser to parse all types +// that have not been overloaded explicitly. It has to be placed in the +// source code before all other more specialized templates. +template ::value>::type* = nullptr + > +void +parse_value(const std::string& text, T& value) { + stringstream_parser(text, value); +} + +template +void +parse_value(const std::string& text, std::vector& value) +{ + if (text.empty()) { + T v; + parse_value(text, v); + value.emplace_back(std::move(v)); + return; + } + std::stringstream in(text); + std::string token; + while(!in.eof() && std::getline(in, token, CXXOPTS_VECTOR_DELIMITER)) { + T v; + parse_value(token, v); + value.emplace_back(std::move(v)); + } +} + +#ifdef CXXOPTS_HAS_OPTIONAL +template +void +parse_value(const std::string& text, std::optional& value) +{ + T result; + parse_value(text, result); + value = std::move(result); +} +#endif + +inline +void parse_value(const std::string& text, char& c) +{ + if (text.length() != 1) + { + throw_or_mimic(text); + } + + c = text[0]; +} + +template +struct type_is_container +{ + static constexpr bool value = false; +}; + +template +struct type_is_container> +{ + static constexpr bool value = true; +}; + +template +class abstract_value : public Value +{ + using Self = abstract_value; + + public: + abstract_value() + : m_result(std::make_shared()) + , m_store(m_result.get()) + { + } + + explicit abstract_value(T* t) + : m_store(t) + { + } + + ~abstract_value() override = default; + + abstract_value& operator=(const abstract_value&) = default; + + abstract_value(const abstract_value& rhs) + { + if (rhs.m_result) + { + m_result = std::make_shared(); + m_store = m_result.get(); + } + else + { + m_store = rhs.m_store; + } + + m_default = rhs.m_default; + m_implicit = rhs.m_implicit; + m_default_value = rhs.m_default_value; + m_implicit_value = rhs.m_implicit_value; + } + + void + parse(const std::string& text) const override + { + parse_value(text, *m_store); + } + + bool + is_container() const override + { + return type_is_container::value; + } + + void + parse() const override + { + parse_value(m_default_value, *m_store); + } + + bool + has_default() const override + { + return m_default; + } + + bool + has_implicit() const override + { + return m_implicit; + } + + std::shared_ptr + default_value(const std::string& value) override + { + m_default = true; + m_default_value = value; + return shared_from_this(); + } + + std::shared_ptr + implicit_value(const std::string& value) override + { + m_implicit = true; + m_implicit_value = value; + return shared_from_this(); + } + + std::shared_ptr + no_implicit_value() override + { + m_implicit = false; + return shared_from_this(); + } + + std::string + get_default_value() const override + { + return m_default_value; + } + + std::string + get_implicit_value() const override + { + return m_implicit_value; + } + + bool + is_boolean() const override + { + return std::is_same::value; + } + + const T& + get() const + { + if (m_store == nullptr) + { + return *m_result; + } + return *m_store; + } + + protected: + std::shared_ptr m_result{}; + T* m_store{}; + + bool m_default = false; + bool m_implicit = false; + + std::string m_default_value{}; + std::string m_implicit_value{}; +}; + +template +class standard_value : public abstract_value +{ + public: + using abstract_value::abstract_value; + + CXXOPTS_NODISCARD + std::shared_ptr + clone() const override + { + return std::make_shared>(*this); + } +}; + +template <> +class standard_value : public abstract_value +{ + public: + ~standard_value() override = default; + + standard_value() + { + set_default_and_implicit(); + } + + explicit standard_value(bool* b) + : abstract_value(b) + { + m_implicit = true; + m_implicit_value = "true"; + } + + std::shared_ptr + clone() const override + { + return std::make_shared>(*this); + } + + private: + + void + set_default_and_implicit() + { + m_default = true; + m_default_value = "false"; + m_implicit = true; + m_implicit_value = "true"; + } +}; + +} // namespace values + +template +std::shared_ptr +value() +{ + return std::make_shared>(); +} + +template +std::shared_ptr +value(T& t) +{ + return std::make_shared>(&t); +} + +class OptionAdder; + +CXXOPTS_NODISCARD +inline +const std::string& +first_or_empty(const OptionNames& long_names) +{ + static const std::string empty{""}; + return long_names.empty() ? empty : long_names.front(); +} + +class OptionDetails +{ + public: + OptionDetails + ( + std::string short_, + OptionNames long_, + String desc, + std::shared_ptr val + ) + : m_short(std::move(short_)) + , m_long(std::move(long_)) + , m_desc(std::move(desc)) + , m_value(std::move(val)) + , m_count(0) + { + m_hash = std::hash{}(first_long_name() + m_short); + } + + OptionDetails(const OptionDetails& rhs) + : m_desc(rhs.m_desc) + , m_value(rhs.m_value->clone()) + , m_count(rhs.m_count) + { + } + + OptionDetails(OptionDetails&& rhs) = default; + + CXXOPTS_NODISCARD + const String& + description() const + { + return m_desc; + } + + CXXOPTS_NODISCARD + const Value& + value() const { + return *m_value; + } + + CXXOPTS_NODISCARD + std::shared_ptr + make_storage() const + { + return m_value->clone(); + } + + CXXOPTS_NODISCARD + const std::string& + short_name() const + { + return m_short; + } + + CXXOPTS_NODISCARD + const std::string& + first_long_name() const + { + return first_or_empty(m_long); + } + + CXXOPTS_NODISCARD + const std::string& + essential_name() const + { + return m_long.empty() ? m_short : m_long.front(); + } + + CXXOPTS_NODISCARD + const OptionNames & + long_names() const + { + return m_long; + } + + std::size_t + hash() const + { + return m_hash; + } + + private: + std::string m_short{}; + OptionNames m_long{}; + String m_desc{}; + std::shared_ptr m_value{}; + int m_count; + + std::size_t m_hash{}; +}; + +struct HelpOptionDetails +{ + std::string s; + OptionNames l; + String desc; + bool has_default; + std::string default_value; + bool has_implicit; + std::string implicit_value; + std::string arg_help; + bool is_container; + bool is_boolean; +}; + +struct HelpGroupDetails +{ + std::string name{}; + std::string description{}; + std::vector options{}; +}; + +class OptionValue +{ + public: + void + parse + ( + const std::shared_ptr& details, + const std::string& text + ) + { + ensure_value(details); + ++m_count; + m_value->parse(text); + m_long_names = &details->long_names(); + } + + void + parse_default(const std::shared_ptr& details) + { + ensure_value(details); + m_default = true; + m_long_names = &details->long_names(); + m_value->parse(); + } + + void + parse_no_value(const std::shared_ptr& details) + { + m_long_names = &details->long_names(); + } + +#if defined(CXXOPTS_NULL_DEREF_IGNORE) +CXXOPTS_DIAGNOSTIC_PUSH +CXXOPTS_IGNORE_WARNING("-Wnull-dereference") +#endif + + CXXOPTS_NODISCARD + std::size_t + count() const noexcept + { + return m_count; + } + +#if defined(CXXOPTS_NULL_DEREF_IGNORE) +CXXOPTS_DIAGNOSTIC_POP +#endif + + // TODO: maybe default options should count towards the number of arguments + CXXOPTS_NODISCARD + bool + has_default() const noexcept + { + return m_default; + } + + template + const T& + as() const + { + if (m_value == nullptr) { + throw_or_mimic( + m_long_names == nullptr ? "" : first_or_empty(*m_long_names)); + } + + return CXXOPTS_RTTI_CAST&>(*m_value).get(); + } + + private: + void + ensure_value(const std::shared_ptr& details) + { + if (m_value == nullptr) + { + m_value = details->make_storage(); + } + } + + + const OptionNames * m_long_names = nullptr; + // Holding this pointer is safe, since OptionValue's only exist in key-value pairs, + // where the key has the string we point to. + std::shared_ptr m_value{}; + std::size_t m_count = 0; + bool m_default = false; +}; + +class KeyValue +{ + public: + KeyValue(std::string key_, std::string value_) noexcept + : m_key(std::move(key_)) + , m_value(std::move(value_)) + { + } + + CXXOPTS_NODISCARD + const std::string& + key() const + { + return m_key; + } + + CXXOPTS_NODISCARD + const std::string& + value() const + { + return m_value; + } + + template + T + as() const + { + T result; + values::parse_value(m_value, result); + return result; + } + + private: + std::string m_key; + std::string m_value; +}; + +using ParsedHashMap = std::unordered_map; +using NameHashMap = std::unordered_map; + +class ParseResult +{ + public: + class Iterator + { + public: + using iterator_category = std::forward_iterator_tag; + using value_type = KeyValue; + using difference_type = void; + using pointer = const KeyValue*; + using reference = const KeyValue&; + + Iterator() = default; + Iterator(const Iterator&) = default; + +// GCC complains about m_iter not being initialised in the member +// initializer list +CXXOPTS_DIAGNOSTIC_PUSH +CXXOPTS_IGNORE_WARNING("-Weffc++") + Iterator(const ParseResult *pr, bool end=false) + : m_pr(pr) + { + if (end) + { + m_sequential = false; + m_iter = m_pr->m_defaults.end(); + } + else + { + m_sequential = true; + m_iter = m_pr->m_sequential.begin(); + + if (m_iter == m_pr->m_sequential.end()) + { + m_sequential = false; + m_iter = m_pr->m_defaults.begin(); + } + } + } +CXXOPTS_DIAGNOSTIC_POP + + Iterator& operator++() + { + ++m_iter; + if(m_sequential && m_iter == m_pr->m_sequential.end()) + { + m_sequential = false; + m_iter = m_pr->m_defaults.begin(); + return *this; + } + return *this; + } + + Iterator operator++(int) + { + Iterator retval = *this; + ++(*this); + return retval; + } + + bool operator==(const Iterator& other) const + { + return (m_sequential == other.m_sequential) && (m_iter == other.m_iter); + } + + bool operator!=(const Iterator& other) const + { + return !(*this == other); + } + + const KeyValue& operator*() + { + return *m_iter; + } + + const KeyValue* operator->() + { + return m_iter.operator->(); + } + + private: + const ParseResult* m_pr; + std::vector::const_iterator m_iter; + bool m_sequential = true; + }; + + ParseResult() = default; + ParseResult(const ParseResult&) = default; + + ParseResult(NameHashMap&& keys, ParsedHashMap&& values, std::vector sequential, + std::vector default_opts, std::vector&& unmatched_args) + : m_keys(std::move(keys)) + , m_values(std::move(values)) + , m_sequential(std::move(sequential)) + , m_defaults(std::move(default_opts)) + , m_unmatched(std::move(unmatched_args)) + { + } + + ParseResult& operator=(ParseResult&&) = default; + ParseResult& operator=(const ParseResult&) = default; + + Iterator + begin() const + { + return Iterator(this); + } + + Iterator + end() const + { + return Iterator(this, true); + } + + std::size_t + count(const std::string& o) const + { + auto iter = m_keys.find(o); + if (iter == m_keys.end()) + { + return 0; + } + + auto viter = m_values.find(iter->second); + + if (viter == m_values.end()) + { + return 0; + } + + return viter->second.count(); + } + + const OptionValue& + operator[](const std::string& option) const + { + auto iter = m_keys.find(option); + + if (iter == m_keys.end()) + { + throw_or_mimic(option); + } + + auto viter = m_values.find(iter->second); + + if (viter == m_values.end()) + { + throw_or_mimic(option); + } + + return viter->second; + } + + const std::vector& + arguments() const + { + return m_sequential; + } + + const std::vector& + unmatched() const + { + return m_unmatched; + } + + const std::vector& + defaults() const + { + return m_defaults; + } + + const std::string + arguments_string() const + { + std::string result; + for(const auto& kv: m_sequential) + { + result += kv.key() + " = " + kv.value() + "\n"; + } + for(const auto& kv: m_defaults) + { + result += kv.key() + " = " + kv.value() + " " + "(default)" + "\n"; + } + return result; + } + + private: + NameHashMap m_keys{}; + ParsedHashMap m_values{}; + std::vector m_sequential{}; + std::vector m_defaults{}; + std::vector m_unmatched{}; +}; + +struct Option +{ + Option + ( + std::string opts, + std::string desc, + std::shared_ptr value = ::cxxopts::value(), + std::string arg_help = "" + ) + : opts_(std::move(opts)) + , desc_(std::move(desc)) + , value_(std::move(value)) + , arg_help_(std::move(arg_help)) + { + } + + std::string opts_; + std::string desc_; + std::shared_ptr value_; + std::string arg_help_; +}; + +using OptionMap = std::unordered_map>; +using PositionalList = std::vector; +using PositionalListIterator = PositionalList::const_iterator; + +class OptionParser +{ + public: + OptionParser(const OptionMap& options, const PositionalList& positional, bool allow_unrecognised) + : m_options(options) + , m_positional(positional) + , m_allow_unrecognised(allow_unrecognised) + { + } + + ParseResult + parse(int argc, const char* const* argv); + + bool + consume_positional(const std::string& a, PositionalListIterator& next); + + void + checked_parse_arg + ( + int argc, + const char* const* argv, + int& current, + const std::shared_ptr& value, + const std::string& name + ); + + void + add_to_option(OptionMap::const_iterator iter, const std::string& option, const std::string& arg); + + void + parse_option + ( + const std::shared_ptr& value, + const std::string& name, + const std::string& arg = "" + ); + + void + parse_default(const std::shared_ptr& details); + + void + parse_no_value(const std::shared_ptr& details); + + private: + + void finalise_aliases(); + + const OptionMap& m_options; + const PositionalList& m_positional; + + std::vector m_sequential{}; + std::vector m_defaults{}; + bool m_allow_unrecognised; + + ParsedHashMap m_parsed{}; + NameHashMap m_keys{}; +}; + +class Options +{ + public: + + explicit Options(std::string program_name, std::string help_string = "") + : m_program(std::move(program_name)) + , m_help_string(toLocalString(std::move(help_string))) + , m_custom_help("[OPTION...]") + , m_positional_help("positional parameters") + , m_show_positional(false) + , m_allow_unrecognised(false) + , m_width(76) + , m_tab_expansion(false) + , m_options(std::make_shared()) + { + } + + Options& + positional_help(std::string help_text) + { + m_positional_help = std::move(help_text); + return *this; + } + + Options& + custom_help(std::string help_text) + { + m_custom_help = std::move(help_text); + return *this; + } + + Options& + show_positional_help() + { + m_show_positional = true; + return *this; + } + + Options& + allow_unrecognised_options() + { + m_allow_unrecognised = true; + return *this; + } + + Options& + set_width(std::size_t width) + { + m_width = width; + return *this; + } + + Options& + set_tab_expansion(bool expansion=true) + { + m_tab_expansion = expansion; + return *this; + } + + ParseResult + parse(int argc, const char* const* argv); + + OptionAdder + add_options(std::string group = ""); + + void + add_options + ( + const std::string& group, + std::initializer_list